ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDg4ZWMyNDkuLjU5MGZmYWIgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMSwxMTcgKzEsMiBAQAotL2NvbmZpZy1kZXZpY2VzLioKLS9jb25maWctYWxsLWRldmljZXMuKgotL2NvbmZpZy1hbGwtZGlzYXMuKgotL2NvbmZpZy1ob3N0LioKLS9jb25maWctdGFyZ2V0LioKLS9jb25maWcuc3RhdHVzCi0vY29uZmlnLXRlbXAKLS90cmFjZS1ldmVudHMtYWxsCi0vdHJhY2UvZ2VuZXJhdGVkLXRyYWNlcnMuaAotL3RyYWNlL2dlbmVyYXRlZC10cmFjZXJzLmMKLS90cmFjZS9nZW5lcmF0ZWQtdHJhY2Vycy1kdHJhY2UuaAotL3RyYWNlL2dlbmVyYXRlZC10cmFjZXJzLmR0cmFjZQotL3RyYWNlL2dlbmVyYXRlZC1ldmVudHMuaAotL3RyYWNlL2dlbmVyYXRlZC1ldmVudHMuYwotL3RyYWNlL2dlbmVyYXRlZC1oZWxwZXJzLXdyYXBwZXJzLmgKLS90cmFjZS9nZW5lcmF0ZWQtaGVscGVycy5oCi0vdHJhY2UvZ2VuZXJhdGVkLWhlbHBlcnMuYwotL3RyYWNlL2dlbmVyYXRlZC10Y2ctdHJhY2Vycy5oCi0vdHJhY2UvZ2VuZXJhdGVkLXVzdC1wcm92aWRlci5oCi0vdHJhY2UvZ2VuZXJhdGVkLXVzdC5jCi0vdWkvc2hhZGVyL3RleHR1cmUtYmxpdC1mcmFnLmgKLS91aS9zaGFkZXIvdGV4dHVyZS1ibGl0LXZlcnQuaAotKi10aW1lc3RhbXAKLS8qLXNvZnRtbXUKLS8qLWRhcndpbi11c2VyCi0vKi1saW51eC11c2VyCi0vKi1ic2QtdXNlcgotL2l2c2htZW0tY2xpZW50Ci0vaXZzaG1lbS1zZXJ2ZXIKLS9saWJkaXMqCi0vbGlidXNlcgotL2xpbnV4LWhlYWRlcnMvYXNtCi0vcWdhL3FhcGktZ2VuZXJhdGVkCi0vcWFwaS1nZW5lcmF0ZWQKLS9xYXBpLXR5cGVzLltjaF0KLS9xYXBpLXZpc2l0LltjaF0KLS9xYXBpLWV2ZW50LltjaF0KLS9xbXAtY29tbWFuZHMuaAotL3FtcC1pbnRyb3NwZWN0LltjaF0KLS9xbXAtbWFyc2hhbC5jCi0vcWVtdS1kb2MuaHRtbAotL3FlbXUtdGVjaC5odG1sCi0vcWVtdS1kb2MuaW5mbwotL3FlbXUtdGVjaC5pbmZvCi0vcWVtdS1pbWcKLS9xZW11LW5iZAotL3FlbXUtb3B0aW9ucy5kZWYKLS9xZW11LW9wdGlvbnMudGV4aQotL3FlbXUtaW1nLWNtZHMudGV4aQotL3FlbXUtaW1nLWNtZHMuaAotL3FlbXUtaW8KLS9xZW11LWdhCi0vcWVtdS1icmlkZ2UtaGVscGVyCi0vcWVtdS1tb25pdG9yLnRleGkKLS9xZW11LW1vbml0b3ItaW5mby50ZXhpCi0vcW1wLWNvbW1hbmRzLnR4dAotL3ZzY2NsaWVudAotL2ZzZGV2L3ZpcnRmcy1wcm94eS1oZWxwZXIKLSouWzEtOV0KLSouYQotKi5hdXgKLSouY3AKLSouZHZpCi0qLmV4ZQotKi5tc2kKLSouZGxsCi0qLnNvCi0qLm1vCi0qLmZuCi0qLmt5Ci0qLmxvZwotKi5wZGYKLSoucG9kCi0qLmNwcwotKi5mbnMKLSoua3lzCi0qLnBnCi0qLnB5YwotKi50b2MKLSoudHAKLSoudnIKLSouZAotIS9zY3JpcHRzL3FlbXUtZ3Vlc3QtYWdlbnQvZnNmcmVlemUtaG9vay5kCi0qLm8KLSoubG8KLSoubGEKLSoucGMKLS5saWJzCi0uc2RrCi0qLmdjZGEKLSouZ2NubwotL3BjLWJpb3MvYmlvcy1wcS9zdGF0dXMKLS9wYy1iaW9zL3ZnYWJpb3MtcHEvc3RhdHVzCi0vcGMtYmlvcy9vcHRpb25yb20vbGludXhib290LmFzbQotL3BjLWJpb3Mvb3B0aW9ucm9tL2xpbnV4Ym9vdC5iaW4KLS9wYy1iaW9zL29wdGlvbnJvbS9saW51eGJvb3QucmF3Ci0vcGMtYmlvcy9vcHRpb25yb20vbGludXhib290LmltZwotL3BjLWJpb3Mvb3B0aW9ucm9tL2xpbnV4Ym9vdF9kbWEuYXNtCi0vcGMtYmlvcy9vcHRpb25yb20vbGludXhib290X2RtYS5iaW4KLS9wYy1iaW9zL29wdGlvbnJvbS9saW51eGJvb3RfZG1hLnJhdwotL3BjLWJpb3Mvb3B0aW9ucm9tL2xpbnV4Ym9vdF9kbWEuaW1nCi0vcGMtYmlvcy9vcHRpb25yb20vbXVsdGlib290LmFzbQotL3BjLWJpb3Mvb3B0aW9ucm9tL211bHRpYm9vdC5iaW4KLS9wYy1iaW9zL29wdGlvbnJvbS9tdWx0aWJvb3QucmF3Ci0vcGMtYmlvcy9vcHRpb25yb20vbXVsdGlib290LmltZwotL3BjLWJpb3Mvb3B0aW9ucm9tL2t2bXZhcGljLmFzbQotL3BjLWJpb3Mvb3B0aW9ucm9tL2t2bXZhcGljLmJpbgotL3BjLWJpb3Mvb3B0aW9ucm9tL2t2bXZhcGljLnJhdwotL3BjLWJpb3Mvb3B0aW9ucm9tL2t2bXZhcGljLmltZwotL3BjLWJpb3MvczM5MC1jY3cvczM5MC1jY3cuZWxmCi0vcGMtYmlvcy9zMzkwLWNjdy9zMzkwLWNjdy5pbWcKLS5zdGdpdC0qCi1jc2NvcGUuKgotdGFncwotVEFHUwotZG9ja2VyLXNyYy4qCi0qfgorb2Jqcy8qCisqLip+CmRpZmYgLS1naXQgYS9HTlVtYWtlZmlsZSBiL0dOVW1ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Y2Q4YzgKLS0tIC9kZXYvbnVsbAorKysgYi9HTlVtYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgRE8gTk9UIE1PRElGWSBUSElTIEZJTEUKKworIyBDaGVjayB0aGF0IHdlIGhhdmUgYXQgbGVhc3QgR05VIE1ha2UgMy44MQorIyBXZSBkbyB0aGlzIGJ5IGRldGVjdGluZyB3aGV0aGVyICdsYXN0d29yZCcgaXMgc3VwcG9ydGVkCisjCitNQUtFX1RFU1QgOj0gJChsYXN0d29yZCBhIGIgYyBkIGUgZikKK2lmbmVxICgkKE1BS0VfVEVTVCksZikKKyAgICAkKGVycm9yLFRoaXMgYnVpbGQgc3lzdGVtIHJlcXVpcmVzIEdOVSBNYWtlIDMuODEgb3IgaGlnaGVyIHRvIHJ1biAhKQorZW5kaWYKKworIyBGaW5kIHRoZSBzb3VyY2UgaW5zdGFsbGF0aW9uIHBhdGgsIHNob3VsZCBiZSB0aGlzIGZpbGUncyBsb2NhdGlvbi4KK19CVUlMRF9ST09UIDo9ICQoZGlyICQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkpCitfQlVJTERfUk9PVCA6PSAkKF9CVUlMRF9ST09UOiUvPSUpCisKKyMgQ29tcGxhaW4gaWYgdGhlIHBhdGggY29udGFpbnMgc3BhY2VzCitpZm5lcSAoJCh3b3JkcyAkKF9CVUlMRF9ST09UKSksMSkKKyAgICAkKGluZm8sVGhlIHNvdXJjZSBpbnN0YWxsYXRpb24gcGF0aCBjb250YWlucyBzcGFjZXM6ICckKF9CVUlMRF9ST09UKScpCisgICAgJChlcnJvcixQbGVhc2UgZml4IHRoZSBwcm9ibGVtIGJ5IHJlaW5zdGFsbGluZyB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4pCitlbmRpZgorCitpbmNsdWRlICQoX0JVSUxEX1JPT1QpL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvbWFpbi5tYWtlCisKKyMgRU5EIE9GIEZJTEUKKwpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKaW5kZXggMGUwYjRiOS4uY2JkOTJjMCAxMDA2NDQKLS0tIGEvTElDRU5TRQorKysgYi9MSUNFTlNFCkBAIC0xLDIxICsxLDE4IEBACiBUaGUgZm9sbG93aW5nIHBvaW50cyBjbGFyaWZ5IHRoZSBRRU1VIGxpY2Vuc2U6CiAKLTEpIFFFTVUgYXMgYSB3aG9sZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi12ZXJzaW9uIDIuCisxKSBRRU1VIGFzIGEgd2hvbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAKIDIpIFBhcnRzIG9mIFFFTVUgaGF2ZSBzcGVjaWZpYyBsaWNlbnNlcyB3aGljaCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4gSGVuY2UgZWFjaCBzb3VyY2UgZmlsZSBjb250YWlucwotaXRzIG93biBsaWNlbnNpbmcgaW5mb3JtYXRpb24uICBTb3VyY2UgZmlsZXMgd2l0aCBubyBsaWNlbnNpbmcgaW5mb3JtYXRpb24KLWFyZSByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiBvciAoYXQgeW91cgotb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiBIZW5jZSBlYWNoIHNvdXJjZSBmaWxlIGNvbnRhaW5zIGl0cyBvd24KK2xpY2Vuc2luZyBpbmZvcm1hdGlvbi4KIAotQXMgb2YgSnVseSAyMDEzLCBjb250cmlidXRpb25zIHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIChhbmQgbm8gbGF0ZXIgdmVyc2lvbikgYXJlIG9ubHkgYWNjZXB0ZWQgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMKLW9yIGRpcmVjdG9yaWVzOiBic2QtdXNlci8sIGxpbnV4LXVzZXIvLCBody92ZmlvLywgaHcveGVuL3hlbl9wdCouCitJbiBwYXJ0aWN1bGFyLCB0aGUgUUVNVSB2aXJ0dWFsIENQVSBjb3JlIGxpYnJhcnkgKGxpYnFlbXUuYSkgaXMKK3JlbGVhc2VkIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIE1hbnkgaGFyZHdhcmUKK2RldmljZSBlbXVsYXRpb24gc291cmNlcyBhcmUgcmVsZWFzZWQgdW5kZXIgdGhlIEJTRCBsaWNlbnNlLgogCiAzKSBUaGUgVGlueSBDb2RlIEdlbmVyYXRvciAoVENHKSBpcyByZWxlYXNlZCB1bmRlciB0aGUgQlNEIGxpY2Vuc2UKICAgIChzZWUgbGljZW5zZSBoZWFkZXJzIGluIGZpbGVzKS4KIAogNCkgUUVNVSBpcyBhIHRyYWRlbWFyayBvZiBGYWJyaWNlIEJlbGxhcmQuCiAKLUZhYnJpY2UgQmVsbGFyZCBhbmQgdGhlIFFFTVUgdGVhbQorRmFicmljZSBCZWxsYXJkLgpkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfR1BMIGIvTU9EVUxFX0xJQ0VOU0VfR1BMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9HUEwKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzc2OTZhCi0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZC4pICBZb3UgY2FuIGFwcGx5IGl0IHRvCit5b3VyIHByb2dyYW1zLCB0b28uCisKKyAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAorcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQoraGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgordGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0CitpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAoraW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2FueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KK1RoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CitkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsIG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0Cit5b3UgaGF2ZS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZQorc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkga25vdyB0aGVpcgorcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6ICgxKSBjb3B5cmlnaHQgdGhlIHNvZnR3YXJlLCBhbmQKKygyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCitkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIHNvZnR3YXJlLgorCisgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCit0aGF0IGV2ZXJ5b25lIHVuZGVyc3RhbmRzIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZQorc29mdHdhcmUuICBJZiB0aGUgc29mdHdhcmUgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCit3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsLCBzbwordGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKK2F1dGhvcnMnIHJlcHV0YXRpb25zLgorCisgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCitwYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlCitwcm9ncmFtIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIGluIGVmZmVjdCBtYWtpbmcgdGhlCitwcm9ncmFtIHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkKK3BhdGVudCBtdXN0IGJlIGxpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisMCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucworYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGUgIlByb2dyYW0iLCBiZWxvdywKK3JlZmVycyB0byBhbnkgc3VjaCBwcm9ncmFtIG9yIHdvcmssIGFuZCBhICJ3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtIgorbWVhbnMgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzoKK3RoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgUHJvZ3JhbSBvciBhIHBvcnRpb24gb2YgaXQsCitlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkIGludG8gYW5vdGhlcgorbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzIGluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbgordGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKSAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKK0FjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Citjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCitydW5uaW5nIHRoZSBQcm9ncmFtIGlzIG5vdCByZXN0cmljdGVkLCBhbmQgdGhlIG91dHB1dCBmcm9tIHRoZSBQcm9ncmFtCitpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4KK1doZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgUHJvZ3JhbSBkb2VzLgorCisgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncworc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91Citjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlCitjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlCitub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7CithbmQgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlCithbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCitZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LCBhbmQKK3lvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueQorICAgIHBhcnQgdGhlcmVvZiwgdG8gYmUgbGljZW5zZWQgYXMgYSB3aG9sZSBhdCBubyBjaGFyZ2UgdG8gYWxsIHRoaXJkCisgICAgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgIHdoZW4gcnVuLCB5b3UgbXVzdCBjYXVzZSBpdCwgd2hlbiBzdGFydGVkIHJ1bm5pbmcgZm9yIHN1Y2gKKyAgICBpbnRlcmFjdGl2ZSB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuCisgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhCisgICAgbm90aWNlIHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgKG9yIGVsc2UsIHNheWluZyB0aGF0IHlvdSBwcm92aWRlCisgICAgYSB3YXJyYW50eSkgYW5kIHRoYXQgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlcgorICAgIHRoZXNlIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzCisgICAgTGljZW5zZS4gIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQKKyAgICBkb2VzIG5vdCBub3JtYWxseSBwcmludCBzdWNoIGFuIGFubm91bmNlbWVudCwgeW91ciB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvIHByaW50IGFuIGFubm91bmNlbWVudC4pCisMCitUaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCitpZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtLAorYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCit0aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCitzZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKK2Rpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAorb24gdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCit0aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQorZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCit3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAordW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlIHRlcm1zIG9mCitTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zCisgICAgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgIHllYXJzLCB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyCisgICAgY29zdCBvZiBwaHlzaWNhbGx5IHBlcmZvcm1pbmcgc291cmNlIGRpc3RyaWJ1dGlvbiwgYSBjb21wbGV0ZQorICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhIG1lZGl1bQorICAgIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyCisgICAgdG8gZGlzdHJpYnV0ZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLiAgKFRoaXMgYWx0ZXJuYXRpdmUgaXMKKyAgICBhbGxvd2VkIG9ubHkgZm9yIG5vbmNvbW1lcmNpYWwgZGlzdHJpYnV0aW9uIGFuZCBvbmx5IGlmIHlvdQorICAgIHJlY2VpdmVkIHRoZSBwcm9ncmFtIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB3aXRoIHN1Y2gKKyAgICBhbiBvZmZlciwgaW4gYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYW4gZXhlY3V0YWJsZSB3b3JrLCBjb21wbGV0ZSBzb3VyY2UKK2NvZGUgbWVhbnMgYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55Cithc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8KK2NvbnRyb2wgY29tcGlsYXRpb24gYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIEhvd2V2ZXIsIGFzIGEKK3NwZWNpYWwgZXhjZXB0aW9uLCB0aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZQorYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkKK2Zvcm0pIHdpdGggdGhlIG1ham9yIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudAoraXRzZWxmIGFjY29tcGFuaWVzIHRoZSBleGVjdXRhYmxlLgorCitJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nCithY2Nlc3MgdG8gY29weSBmcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50CithY2Nlc3MgdG8gY29weSB0aGUgc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBjb3VudHMgYXMKK2Rpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKwwKKyAgNC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCitleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMKK3ZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4KK0hvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaAorcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgorCisgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKK2Rpc3RyaWJ1dGUgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQorcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQorbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAorYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwordGhlIFByb2dyYW0gb3Igd29ya3MgYmFzZWQgb24gaXQuCisKKyAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUgb3IgbW9kaWZ5IHRoZSBQcm9ncmFtIHN1YmplY3QgdG8KK3RoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCityZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCitZb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwordGhpcyBMaWNlbnNlLgorCisgIDcuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtLgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FueSBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8KK2FwcGx5IGFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyCitjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0sIHdoaWNoIGlzCitpbXBsZW1lbnRlZCBieSBwdWJsaWMgbGljZW5zZSBwcmFjdGljZXMuICBNYW55IHBlb3BsZSBoYXZlIG1hZGUKK2dlbmVyb3VzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQKK3Rocm91Z2ggdGhhdCBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0CitzeXN0ZW07IGl0IGlzIHVwIHRvIHRoZSBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nCit0byBkaXN0cmlidXRlIHNvZnR3YXJlIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QKK2ltcG9zZSB0aGF0IGNob2ljZS4KKworVGhpcyBzZWN0aW9uIGlzIGludGVuZGVkIHRvIG1ha2UgdGhvcm91Z2hseSBjbGVhciB3aGF0IGlzIGJlbGlldmVkIHRvCitiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKwwKKyAgOC4gSWYgdGhlIGRpc3RyaWJ1dGlvbiBhbmQvb3IgdXNlIG9mIHRoZSBQcm9ncmFtIGlzIHJlc3RyaWN0ZWQgaW4KK2NlcnRhaW4gY291bnRyaWVzIGVpdGhlciBieSBwYXRlbnRzIG9yIGJ5IGNvcHlyaWdodGVkIGludGVyZmFjZXMsIHRoZQorb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZQorbWF5IGFkZCBhbiBleHBsaWNpdCBnZW9ncmFwaGljYWwgZGlzdHJpYnV0aW9uIGxpbWl0YXRpb24gZXhjbHVkaW5nCit0aG9zZSBjb3VudHJpZXMsIHNvIHRoYXQgZGlzdHJpYnV0aW9uIGlzIHBlcm1pdHRlZCBvbmx5IGluIG9yIGFtb25nCitjb3VudHJpZXMgbm90IHRodXMgZXhjbHVkZWQuICBJbiBzdWNoIGNhc2UsIHRoaXMgTGljZW5zZSBpbmNvcnBvcmF0ZXMKK3RoZSBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgIDkuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zCitvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIFByb2dyYW0KK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CitsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCitlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZgordGhpcyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4KKworICAxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlCitwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUgYXV0aG9yCit0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcworbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyIGRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMKK29mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKK29mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisJCQkgICAgTk8gV0FSUkFOVFkKKworICAxMS4gQkVDQVVTRSBUSEUgUFJPR1JBTSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8gV0FSUkFOVFkKK0ZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTgorT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQKK09SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTCitUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFCitQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywKK1JFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQvT1IKK1JFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsCitJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcKK09VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQKK1RPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWQorWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIKK1BST0dSQU1TKSwgRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisMCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgMTl5eSAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSAxOXl5IG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggZjM4MTkzZi4uNzI2ZWZhNSAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSwxMDcgKzEsMTAgQEAKLSAgICAgICAgIFFFTVUgUkVBRE1FCi0gICAgICAgICA9PT09PT09PT09PQorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZXMgb2YgdGhlIEFuZHJvaWQgZW11bGF0b3IsCithIFFFTVUtYmFzZWQgcHJvZ3JhbSB0byBlbXVsYXRlIHZpcnR1YWwgZGV2aWNlcyBydW5uaW5nIHZhcmlvdXMKK3JlbGVhc2VzIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGltYWdlLgogCi1RRU1VIGlzIGEgZ2VuZXJpYyBhbmQgb3BlbiBzb3VyY2UgbWFjaGluZSAmIHVzZXJzcGFjZSBlbXVsYXRvciBhbmQKLXZpcnR1YWxpemVyLgorVG8gYnVpbGQgdGhlIGVtdWxhdG9yLCBydW4gYW5kcm9pZC9yZWJ1aWxkLnNoLgogCi1RRU1VIGlzIGNhcGFibGUgb2YgZW11bGF0aW5nIGEgY29tcGxldGUgbWFjaGluZSBpbiBzb2Z0d2FyZSB3aXRob3V0IGFueQotbmVlZCBmb3IgaGFyZHdhcmUgdmlydHVhbGl6YXRpb24gc3VwcG9ydC4gQnkgdXNpbmcgZHluYW1pYyB0cmFuc2xhdGlvbiwKLWl0IGFjaGlldmVzIHZlcnkgZ29vZCBwZXJmb3JtYW5jZS4gUUVNVSBjYW4gYWxzbyBpbnRlZ3JhdGUgd2l0aCB0aGUgWGVuCi1hbmQgS1ZNIGh5cGVydmlzb3JzIHRvIHByb3ZpZGUgZW11bGF0ZWQgaGFyZHdhcmUgd2hpbGUgYWxsb3dpbmcgdGhlCi1oeXBlcnZpc29yIHRvIG1hbmFnZSB0aGUgQ1BVLiBXaXRoIGh5cGVydmlzb3Igc3VwcG9ydCwgUUVNVSBjYW4gYWNoaWV2ZQotbmVhciBuYXRpdmUgcGVyZm9ybWFuY2UgZm9yIENQVXMuIFdoZW4gUUVNVSBlbXVsYXRlcyBDUFVzIGRpcmVjdGx5IGl0IGlzCi1jYXBhYmxlIG9mIHJ1bm5pbmcgb3BlcmF0aW5nIHN5c3RlbXMgbWFkZSBmb3Igb25lIG1hY2hpbmUgKGUuZy4gYW4gQVJNdjcKLWJvYXJkKSBvbiBhIGRpZmZlcmVudCBtYWNoaW5lIChlLmcuIGFuIHg4Nl82NCBQQyBib2FyZCkuCitTZWUgdGhlIGFuZHJvaWQvZG9jcy8gZGlyZWN0b3J5IGZvciBtb3JlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhpcworY29kZSBiYXNlIGFuZCB0aGUgcGxhdGZvcm1zIGl0IGVtdWxhdGVzLgogCi1RRU1VIGlzIGFsc28gY2FwYWJsZSBvZiBwcm92aWRpbmcgdXNlcnNwYWNlIEFQSSB2aXJ0dWFsaXphdGlvbiBmb3IgTGludXgKLWFuZCBCU0Qga2VybmVsIGludGVyZmFjZXMuIFRoaXMgYWxsb3dzIGJpbmFyaWVzIGNvbXBpbGVkIGFnYWluc3Qgb25lCi1hcmNoaXRlY3R1cmUgQUJJIChlLmcuIHRoZSBMaW51eCBQUEM2NCBBQkkpIHRvIGJlIHJ1biBvbiBhIGhvc3QgdXNpbmcgYQotZGlmZmVyZW50IGFyY2hpdGVjdHVyZSBBQkkgKGUuZy4gdGhlIExpbnV4IHg4Nl82NCBBQkkpLiBUaGlzIGRvZXMgbm90Ci1pbnZvbHZlIGFueSBoYXJkd2FyZSBlbXVsYXRpb24sIHNpbXBseSBDUFUgYW5kIHN5c2NhbGwgZW11bGF0aW9uLgotCi1RRU1VIGFpbXMgdG8gZml0IGludG8gYSB2YXJpZXR5IG9mIHVzZSBjYXNlcy4gSXQgY2FuIGJlIGludm9rZWQgZGlyZWN0bHkKLWJ5IHVzZXJzIHdpc2hpbmcgdG8gaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciBpdHMgYmVoYXZpb3VyIGFuZCBzZXR0aW5ncy4KLUl0IGFsc28gYWltcyB0byBmYWNpbGl0YXRlIGludGVncmF0aW9uIGludG8gaGlnaGVyIGxldmVsIG1hbmFnZW1lbnQKLWxheWVycywgYnkgcHJvdmlkaW5nIGEgc3RhYmxlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgYW5kIG1vbml0b3IgQVBJLgotSXQgaXMgY29tbW9ubHkgaW52b2tlZCBpbmRpcmVjdGx5IHZpYSB0aGUgbGlidmlydCBsaWJyYXJ5IHdoZW4gdXNpbmcKLW9wZW4gc291cmNlIGFwcGxpY2F0aW9ucyBzdWNoIGFzIG9WaXJ0LCBPcGVuU3RhY2sgYW5kIHZpcnQtbWFuYWdlci4KLQotUUVNVSBhcyBhIHdob2xlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLXZlcnNpb24gMi4gRm9yIGZ1bGwgbGljZW5zaW5nIGRldGFpbHMsIGNvbnN1bHQgdGhlIExJQ0VOU0UgZmlsZS4KLQotCi1CdWlsZGluZwotPT09PT09PT0KLQotUUVNVSBpcyBtdWx0aS1wbGF0Zm9ybSBzb2Z0d2FyZSBpbnRlbmRlZCB0byBiZSBidWlsZGFibGUgb24gYWxsIG1vZGVybgotTGludXggcGxhdGZvcm1zLCBPUy1YLCBXaW4zMiAodmlhIHRoZSBNaW5ndzY0IHRvb2xjaGFpbikgYW5kIGEgdmFyaWV0eQotb2Ygb3RoZXIgVU5JWCB0YXJnZXRzLiBUaGUgc2ltcGxlIHN0ZXBzIHRvIGJ1aWxkIFFFTVUgYXJlOgotCi0gIG1rZGlyIGJ1aWxkCi0gIGNkIGJ1aWxkCi0gIC4uL2NvbmZpZ3VyZQotICBtYWtlCi0KLUNvbXBsZXRlIGRldGFpbHMgb2YgdGhlIHByb2Nlc3MgZm9yIGJ1aWxkaW5nIGFuZCBjb25maWd1cmluZyBRRU1VIGZvcgotYWxsIHN1cHBvcnRlZCBob3N0IHBsYXRmb3JtcyBjYW4gYmUgZm91bmQgaW4gdGhlIHFlbXUtdGVjaC5odG1sIGZpbGUuCi1BZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBhbHNvIGJlIGZvdW5kIG9ubGluZSB2aWEgdGhlIFFFTVUgd2Vic2l0ZToKLQotICBodHRwOi8vcWVtdS1wcm9qZWN0Lm9yZy9Ib3N0cy9MaW51eAotICBodHRwOi8vcWVtdS1wcm9qZWN0Lm9yZy9Ib3N0cy9XMzIKLQotCi1TdWJtaXR0aW5nIHBhdGNoZXMKLT09PT09PT09PT09PT09PT09PQotCi1UaGUgUUVNVSBzb3VyY2UgY29kZSBpcyBtYWludGFpbmVkIHVuZGVyIHRoZSBHSVQgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KLQotICAgZ2l0IGNsb25lIGdpdDovL2dpdC5xZW11LXByb2plY3Qub3JnL3FlbXUuZ2l0Ci0KLVdoZW4gc3VibWl0dGluZyBwYXRjaGVzLCB0aGUgcHJlZmVycmVkIGFwcHJvYWNoIGlzIHRvIHVzZSAnZ2l0Ci1mb3JtYXQtcGF0Y2gnIGFuZC9vciAnZ2l0IHNlbmQtZW1haWwnIHRvIGZvcm1hdCAmIHNlbmQgdGhlIG1haWwgdG8gdGhlCi1xZW11LWRldmVsQG5vbmdudS5vcmcgbWFpbGluZyBsaXN0LiBBbGwgcGF0Y2hlcyBzdWJtaXR0ZWQgbXVzdCBjb250YWluCi1hICdTaWduZWQtb2ZmLWJ5JyBsaW5lIGZyb20gdGhlIGF1dGhvci4gUGF0Y2hlcyBzaG91bGQgZm9sbG93IHRoZQotZ3VpZGVsaW5lcyBzZXQgb3V0IGluIHRoZSBIQUNLSU5HIGFuZCBDT0RJTkdfU1RZTEUgZmlsZXMuCi0KLUFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gc3VibWl0dGluZyBwYXRjaGVzIGNhbiBiZSBmb3VuZCBvbmxpbmUgdmlhCi10aGUgUUVNVSB3ZWJzaXRlCi0KLSAgaHR0cDovL3FlbXUtcHJvamVjdC5vcmcvQ29udHJpYnV0ZS9TdWJtaXRBUGF0Y2gKLSAgaHR0cDovL3FlbXUtcHJvamVjdC5vcmcvQ29udHJpYnV0ZS9Ucml2aWFsUGF0Y2hlcwotCi0KLUJ1ZyByZXBvcnRpbmcKLT09PT09PT09PT09PT0KLQotVGhlIFFFTVUgcHJvamVjdCB1c2VzIExhdW5jaHBhZCBhcyBpdHMgcHJpbWFyeSB1cHN0cmVhbSBidWcgdHJhY2tlci4gQnVncwotZm91bmQgd2hlbiBydW5uaW5nIGNvZGUgYnVpbHQgZnJvbSBRRU1VIGdpdCBvciB1cHN0cmVhbSByZWxlYXNlZCBzb3VyY2VzCi1zaG91bGQgYmUgcmVwb3J0ZWQgdmlhOgotCi0gIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3FlbXUvCi0KLUlmIHVzaW5nIFFFTVUgdmlhIGFuIG9wZXJhdGluZyBzeXN0ZW0gdmVuZG9yIHByZS1idWlsdCBiaW5hcnkgcGFja2FnZSwgaXQKLWlzIHByZWZlcmFibGUgdG8gcmVwb3J0IGJ1Z3MgdG8gdGhlIHZlbmRvcidzIG93biBidWcgdHJhY2tlciBmaXJzdC4gSWYKLXRoZSBidWcgaXMgYWxzbyBrbm93biB0byBhZmZlY3QgbGF0ZXN0IHVwc3RyZWFtIGNvZGUsIGl0IGNhbiBhbHNvIGJlCi1yZXBvcnRlZCB2aWEgbGF1bmNocGFkLgotCi1Gb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBidWcgcmVwb3J0aW5nIGNvbnN1bHQ6Ci0KLSAgaHR0cDovL3FlbXUtcHJvamVjdC5vcmcvQ29udHJpYnV0ZS9SZXBvcnRBQnVnCi0KLQotQ29udGFjdAotPT09PT09PQotCi1UaGUgUUVNVSBjb21tdW5pdHkgY2FuIGJlIGNvbnRhY3RlZCBpbiBhIG51bWJlciBvZiB3YXlzLCB3aXRoIHRoZSB0d28KLW1haW4gbWV0aG9kcyBiZWluZyBlbWFpbCBhbmQgSVJDCi0KLSAtIHFlbXUtZGV2ZWxAbm9uZ251Lm9yZwotICAgaHR0cDovL2xpc3RzLm5vbmdudS5vcmcvbWFpbG1hbi9saXN0aW5mby9xZW11LWRldmVsCi0gLSAjcWVtdSBvbiBpcmMub2Z0Yy5uZXQKLQotSW5mb3JtYXRpb24gb24gYWRkaXRpb25hbCBtZXRob2RzIG9mIGNvbnRhY3RpbmcgdGhlIGNvbW11bml0eSBjYW4gYmUKLWZvdW5kIG9ubGluZSB2aWEgdGhlIFFFTVUgd2Vic2l0ZToKLQotICBodHRwOi8vcWVtdS1wcm9qZWN0Lm9yZy9Db250cmlidXRlL1N0YXJ0SGVyZQotCi0tLSBFbmQKK0lmIHlvdSBwbGFuIHRvIGNvbnRyaWJ1dGUgcGF0Y2hlcywgcGxlYXNlIHJlYWQgZG9jcy9ERVZFTE9QTUVOVC5UWFQKZGlmZiAtLWdpdCBhL2FuZHJvaWQtcWVtdTItZ2x1ZS9zY3JpcHRzL2dlbi1xZW11Mi1zb3VyY2VzLW1rLnB5IGIvYW5kcm9pZC1xZW11Mi1nbHVlL3NjcmlwdHMvZ2VuLXFlbXUyLXNvdXJjZXMtbWsucHkKaW5kZXggYTk1MWEwYS4uYmYzZjdiMCAxMDA3NTUKLS0tIGEvYW5kcm9pZC1xZW11Mi1nbHVlL3NjcmlwdHMvZ2VuLXFlbXUyLXNvdXJjZXMtbWsucHkKKysrIGIvYW5kcm9pZC1xZW11Mi1nbHVlL3NjcmlwdHMvZ2VuLXFlbXUyLXNvdXJjZXMtbWsucHkKQEAgLTgsOSArOCw5IEBACiAjICAgICAgLS1kYXJ3aW4tc3NoPTxob3N0bmFtZT4gXAogIyAgICAgIC0taW5zdGFsbC1kaXI9L3RtcC9xZW11Mi1idWlsZAogIwotIyAgZXh0ZXJuYWwvcWVtdS1hbmRyb2lkL2FuZHJvaWQtcWVtdTItZ2x1ZS9zY3JpcHRzL2dlbi1xZW11Mi1zb3VyY2VzLW1rLnB5IFwKKyMgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC1xZW11Mi1nbHVlL3NjcmlwdHMvZ2VuLXFlbXUyLXNvdXJjZXMtbWsucHkgXAogIyAgICAgIC90bXAvcWVtdTItYnVpbGQgXAotIyAgICAgID4gZXh0ZXJuYWwvcWVtdS1hbmRyb2lkL2FuZHJvaWQtcWVtdTItZ2x1ZS9idWlsZC9NYWtlZmlsZS5xZW11Mi1zb3VyY2VzLm1rCisjICAgICAgPiBleHRlcm5hbC9xZW11L2FuZHJvaWQtcWVtdTItZ2x1ZS9idWlsZC9NYWtlZmlsZS5xZW11Mi1zb3VyY2VzLm1rCiAjCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvLmNsYW5nLWZvcm1hdCBiL2FuZHJvaWQvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc1YzY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNCBAQAorQmFzZWRPblN0eWxlOiBDaHJvbWl1bQorSW5kZW50V2lkdGg6IDQKK0NvbnRpbnVhdGlvbkluZGVudFdpZHRoOiA4CitBY2Nlc3NNb2RpZmllck9mZnNldDogLTQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvTWFrZWZpbGUuYW5kcm9pZC1lbXUubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11L01ha2VmaWxlLmFuZHJvaWQtZW11Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGM0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L01ha2VmaWxlLmFuZHJvaWQtZW11Lm1rCkBAIC0wLDAgKzEsNzM5IEBACisjIERlY2xhcmF0aW9ucyByZWxhdGVkIHRvIHRoZSBBbmRyb2lkRW11IGxpYnJhcnksIHdoaWNoIGdyb3VwIEFuZHJvaWQtc3BlY2lmaWMKKyMgZW11bGF0aW9uIGZlYXR1cmVzIHRoYXQgYXJlIHVzZWQgYnkgYm90aCBRRU1VMSBhbmQgUUVNVTIgZW5naW5lcy4KKyMKKyMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBpbXBvcnRhbnQgbW9kdWxlczoKKyMKKyMgIC0gYW5kcm9pZC1lbXUtYmFzZQorIyAgLSBhbmRyb2lkLWVtdQorIyAgLSBlbXVsYXRvci1saWJ1aQorIworIyBBbmQgY29ycmVzcG9uZGluZyB1bml0LXRlc3RzLgorIworIyBTZWUgYmVsb3cgZm9yIHRoZWlyIGRvY3VtZW50YXRpb24uIE1vcmVvZXZlciwgaXQgZGVmaW5lcyB0aGUgZm9sbG93aW5nCisjIHZhcmlhYmxlcyB0aGF0IGNhbiBiZSB1c2VkIG91dHNpZGUgb2YgdGhpcyBzY3JpcHQ6CisjCisjICAgQU5EUk9JRF9FTVVfQkFTRV9JTkNMVURFUworIyAgICAgICBMaXN0IG9mIGluY2x1ZGUgcGF0aHMgdG8gYmUgdXNlZCBieSBhbnkgbW9kdWxlIHRoYXQgZGVwZW5kcyBvbgorIyAgICAgICBBbmRyb2lkRW11QmFzZQorIworIyAgIEFORFJPSURfRU1VX0JBU0VfU1RBVElDX0xJQlJBUklFUworIyAgICAgICBMaXN0IG9mIHN0YXRpYyBsaWJyYXJpZXMgdG8gYmUgdXNlZCBieSBhbnkgZXhlY3V0YWJsZSB0aGF0IGRlcGVuZHMgb24KKyMgICAgICAgQW5kcm9pZEVtdUJhc2UuCisjCisjICAgQU5EUk9JRF9FTVVfQkFTRV9MRExJQlMKKyMgICAgICAgTGlzdCBvZiBzeXN0ZW0gbGlicmFyaWVzIHRvIGJlIHVzZWQgYnkgYW55IGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkKKyMgICAgICAgdGhhdCBkZXBlbmRzIG9uIEFuZHJvaWRFbXVCYXNlLgorIworIyAgIEFORFJPSURfRU1VX0lOQ0xVREVTCisjICAgICAgIExpc3Qgb2YgaW5jbHVkZSBwYXRocyB0byBiZSB1c2VkIGJ5IGFueSBtb2R1bGUgdGhhdCBkZXBlbmRzIG9uCisjICAgICAgIEFuZHJvaWRFbXUKKyMKKyMgICBBTkRST0lEX0VNVV9TVEFUSUNfTElCUkFSSUVTCisjICAgICAgIExpc3Qgb2Ygc3RhdGljIGxpYnJhcmllcyB0byBiZSB1c2VkIGJ5IGFueSBleGVjdXRhYmxlIHRoYXQgZGVwZW5kcyBvbgorIyAgICAgICBBbmRyb2lkRW11LgorIworIyAgIEFORFJPSURfRU1VX0xETElCUworIyAgICAgICBMaXN0IG9mIHN5c3RlbSBsaWJyYXJpZXMgdG8gYmUgdXNlZCBieSBhbnkgZXhlY3V0YWJsZSBvciBzaGFyZWQgbGlicmFyeQorIyAgICAgICB0aGF0IGRlcGVuZHMgb24gQW5kcm9pZEVtdS4KKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBwdWJsaWMgdmFyaWFibGVzCisKK19BTkRST0lEX0VNVV9PTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworX0FORFJPSURfRU1VX1JPT1QgOj0gJChMT0NBTF9QQVRIKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1ldHJpY3MgbGlicmFyeSBpcyBhIHBhcnQgb2YgYW5kcm9pZC1lbXUsIHNvIGxldCdzIGluY2x1ZGUgaXQgaGVyZQoraW5jbHVkZSAkKF9BTkRST0lEX0VNVV9ST09UKS9hbmRyb2lkL21ldHJpY3MvcHJvdG8vTWV0cmljc1Byb3RvLm1rCisKKyMgYWxsIGluY2x1ZGVzIGFyZSBsaWtlICdhbmRyb2lkLy4uLicsIHNvIHdlIG5lZWQgdG8gY291bnQgb24gdGhhdAorQU5EUk9JRF9FTVVfQkFTRV9JTkNMVURFUyA6PSAkKF9BTkRST0lEX0VNVV9ST09UKQorQU5EUk9JRF9FTVVfSU5DTFVERVMgOj0gJChBTkRST0lEX0VNVV9CQVNFX0lOQ0xVREVTKSAkKE1FVFJJQ1NfUFJPVE9fSU5DTFVERVMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIGFuZHJvaWQtZW11LWJhc2UKKyMKKyMgIFRoaXMgaXMgYSBzdGF0aWMgbGlicmFyeSBjb250YWluaW5nIHRoZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZXMKKyMgIHByb3ZpZGVkIGJ5IGFuZHJvaWQvYmFzZS8gYW5kIGFuZHJvaWQvdXRpbHMvLiBJdCBzaG91bGQgb25seSBkZXBlbmQgb24KKyMgIHN5c3RlbSBhbmQgbGFuZ3VhZ2UgcnVudGltZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMsIGFuZCBub3RoaW5nIGVsc2UuCisjICBFdmVyeXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGUgaG9zdCBpbXBsZW1lbnRhdGlvbiwgZS5nLiBMb29wZXIsIHNob3VsZG4ndAorIyAgYmUgcGFydCBvZiB0aGlzIGxpYnJhcnksIGJ1dCBnb2VzIGludG8gYW5kcm9pZC1lbXUKKyMKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLWxpYnJhcnksYW5kcm9pZC1lbXUtYmFzZSkKKworTE9DQUxfQ0ZMQUdTIDo9ICQoRU1VTEFUT1JfQ09NTU9OX0NGTEFHUykKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChFTVVMQVRPUl9DT01NT05fSU5DTFVERVMpIFwKKyAgICAkKEFORFJPSURfRU1VX0lOQ0xVREVTKSBcCisgICAgJChMSUJVVUlEX0lOQ0xVREVTKSBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldC5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9jb250YWluZXJzL0hhc2hVdGlscy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9EZWJ1Zy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvZmlsZXMvU3RkaW9TdHJlYW0uY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2ZpbGVzL0luaUZpbGUuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHMuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvbWlzYy9IdHRwVXRpbHMuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9taXNjL1V0ZjhVdGlscy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9uZXR3b3JrL0Rucy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlscy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvU3RyaW5nUGFyc2UuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9NZXNzYWdlQ2hhbm5lbC5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9Mb2cuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3RocmVhZHMvQXN5bmMuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvdGhyZWFkcy9GdW5jdG9yVGhyZWFkLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvVXJpLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL1V1aWQuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvVmVyc2lvbi5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvYWNvbmZpZy1maWxlLmMgXAorICAgIGFuZHJvaWQvdXRpbHMvYXNzZXJ0LmMgXAorICAgIGFuZHJvaWQvdXRpbHMvYXN5bmMuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmMgXAorICAgIGFuZHJvaWQvdXRpbHMvYnVmcHJpbnRfc3lzdGVtLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9jYnVmZmVyLmMgXAorICAgIGFuZHJvaWQvdXRpbHMvZGVidWcuYyBcCisgICAgYW5kcm9pZC91dGlscy9kZWJ1Z193cmFwcGVyLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9kbnMuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2RsbC5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuYyBcCisgICAgYW5kcm9pZC91dGlscy9leGVjLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9maWxlbG9jay5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmMgXAorICAgIGFuZHJvaWQvdXRpbHMvZmlsZV9pby5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvZm9ybWF0LmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9ob3N0X2JpdG5lc3MuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2h0dHBfdXRpbHMuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9pbmkuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL2ludG1hcC5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL2lwYWRkci5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvbGluZWlucHV0LmMgXAorICAgIGFuZHJvaWQvdXRpbHMvbG9jay5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvbWFwZmlsZS5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL21pc2MuYyBcCisgICAgYW5kcm9pZC91dGlscy9wYW5pYy5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3BhdGguY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3BhdGhfc3lzdGVtLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmMgXAorICAgIGFuZHJvaWQvdXRpbHMvcmVmbGlzdC5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3JlZnNldC5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmMgXAorICAgIGFuZHJvaWQvdXRpbHMvc3RyZWFtLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy9zdHJpbmcuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3N5c3RlbS5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3N5c3RlbV93cmFwcGVyLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy90ZW1wZmlsZS5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3RpbWV6b25lLmNwcCBcCisgICAgYW5kcm9pZC91dGlscy91cmkuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3V0ZjhfdXRpbHMuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3ZlY3Rvci5jIFwKKyAgICBhbmRyb2lkL3V0aWxzL3g4Nl9jcHVpZC5jcHAgXAorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkX3dpbjMyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3dpbjMyX3VuaWNvZGUuY3BwIFwKKworZWxzZQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRfcHRocmVhZC5jcHAgXAorCitlbmRpZgorCiskKGNhbGwgZW5kLWVtdWxhdG9yLWxpYnJhcnkpCisKKyMjIyMKKyMgU21hbGwgbG93LWxldmVsIGJlbmNobWFyayBmb3IgYW5kcm9pZC1lbXUtYmFzZS4KKyMKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1iZW5jaG1hcmssYW5kcm9pZF9lbXUkKEJVSUxEX1RBUkdFVF9TVUZGSVgpX2JlbmNobWFyaykKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChBTkRST0lEX0VNVV9CQVNFX0lOQ0xVREVTKSBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrX2JlbmNobWFyay5jcHAgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGFuZHJvaWQtZW11LWJhc2UKKworJChjYWxsIGVuZC1lbXVsYXRvci1iZW5jaG1hcmspCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIGFuZHJvaWQtZW11CisjCisjICBUaGlzIGlzIGEgc3RhdGljIGxpYnJhcnkgY29udGFpbmluZyBhbGwgdGhlIEFuZHJvaWQgZW11bGF0aW9uIGZlYXR1cmVzCisjICBzaGFyZWQgd2l0aCBib3RoIHRoZSBRRU1VMSBhbmQgUUVNVTIgZW5naW5lcy4gSXQgc2hvdWxkIG9ubHkgZGVwZW5kIG9uCisjICBhbmRyb2lkLWVtdS1iYXNlLCBhIGZldyB0aGlyZC1wYXJ0eSBwcmVidWlsdCBsaWJyYXJpZXMgKGUuZy4gbGlieG1sMikgYW5kCisjICBzeXN0ZW0gaGVhZGVycyBhbmQgbGlicmFyaWVzLgorIworIyAgTk9URTogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIFVJIGNvZGUsIGFuZCBjb21lcyB3aXRoIGl0cyBvd24gc2V0IG9mIHVuaXQKKyMgICAgICAgIHRlc3RzLgorIworCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxhbmRyb2lkLWVtdSkKKworTE9DQUxfQ0ZMQUdTIDo9IFwKKyAgICAkKEVNVUxBVE9SX0NPTU1PTl9DRkxBR1MpIFwKKyAgICAkKExJQkNVUkxfQ0ZMQUdTKSBcCisgICAgJChMSUJYTUwyX0NGTEFHUykgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKEVNVUxBVE9SX0NPTU1PTl9JTkNMVURFUykgXAorICAgICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpIFwKKyAgICAkKEVNVUdMX0lOQ0xVREVTKSBcCisgICAgJChCUkVBS1BBRF9DTElFTlRfSU5DTFVERVMpIFwKKyAgICAkKExJQkNVUkxfSU5DTFVERVMpIFwKKyAgICAkKExJQkpQRUdfSU5DTFVERVMpIFwKKyAgICAkKExJQlhNTDJfSU5DTFVERVMpIFwKKyAgICAkKExJQkVYVDRfVVRJTFNfSU5DTFVERVMpIFwKKyAgICAkKExJQlBOR19JTkNMVURFUykgXAorICAgICQoWkxJQl9JTkNMVURFUykgXAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGFuZHJvaWQvYWRiLXNlcnZlci5jcHAgXAorICAgIGFuZHJvaWQvYXZkL2h3LWNvbmZpZy5jIFwKKyAgICBhbmRyb2lkL2F2ZC9pbmZvLmMgXAorICAgIGFuZHJvaWQvYXZkL3NjYW5uZXIuYyBcCisgICAgYW5kcm9pZC9hdmQvdXRpbC5jIFwKKyAgICBhbmRyb2lkL2F2ZC91dGlsX3dyYXBwZXIuY3BwIFwKKyAgICBhbmRyb2lkL2FzeW5jLWNvbnNvbGUuYyBcCisgICAgYW5kcm9pZC9hc3luYy1zb2NrZXQuYyBcCisgICAgYW5kcm9pZC9hc3luYy1zb2NrZXQtY29ubmVjdG9yLmMgXAorICAgIGFuZHJvaWQvYXN5bmMtdXRpbHMuYyBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jUmVhZGVyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU29ja2V0U2VydmVyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jV3JpdGVyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL0RlZmF1bHRMb29wZXIuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmNwcCBcCisgICAgYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5jcHAgXAorICAgIGFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXIuY3BwIFwKKyAgICBhbmRyb2lkL2Jhc2UvdGhyZWFkcy9pbnRlcm5hbC9QYXJhbGxlbFRhc2tCYXNlLmNwcCBcCisgICAgYW5kcm9pZC9ib290LXByb3BlcnRpZXMuYyBcCisgICAgYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNvbW1vbi5jcHAgXAorICAgIGFuZHJvaWQvY2FtZXJhL2NhbWVyYS1saXN0LmNwcCBcCisgICAgYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXNlcnZpY2UuYyBcCisgICAgYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWZvcm1hdC1jb252ZXJ0ZXJzLmMgXAorICAgIGFuZHJvaWQvY21kbGluZS1vcHRpb24uYyBcCisgICAgYW5kcm9pZC9jb25zb2xlLmMgXAorICAgIGFuZHJvaWQvY29uc29sZV9hdXRoLmNwcCBcCisgICAgYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuY3BwIFwKKyAgICBhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU3lzdGVtLmNwcCBcCisgICAgYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyX2NvbW1vbi5jcHAgXAorICAgIGFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl8kKEJVSUxEX1RBUkdFVF9PUykuY3BwIFwKKyAgICBhbmRyb2lkL2N1cmwtc3VwcG9ydC5jIFwKKyAgICBhbmRyb2lkL2VtdWN0bC1jbGllbnQuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9BZGJEZWJ1Z1BpcGUuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9BZGJHdWVzdFBpcGUuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vQW5kcm9pZFBpcGUuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9waW5ncG9uZy5jIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfdGhyb3R0bGUuYyBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3VuaXguY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5jIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9DbGlwYm9hcmRQaXBlLmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlLmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BcGtJbnN0YWxsZXIuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lci5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvU2NyZWVuQ2FwdHVyZXIuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9DcHVBY2NlbGVyYXRvci5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZS5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL2dvbGRmaXNoX3N5bmMuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0cy5jIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jbGllbnQuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX211bHRpcGxleGVyLmNwcCBcCisgICAgYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJpYWwuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NlcnZpY2UuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NpbmsuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5jcHAgXAorICAgIGFuZHJvaWQvZW11bGF0aW9uL1NlcmlhbExpbmUuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9TZXR1cFBhcmFtZXRlcnMuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suY3BwIFwKKyAgICBhbmRyb2lkL2Vycm9yLW1lc3NhZ2VzLmNwcCBcCisgICAgYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5jcHAgXAorICAgIGFuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xJbXBsLmNwcCBcCisgICAgYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3Jlc2l6ZS5jcHAgXAorICAgIGFuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF91dGlscy5jcHAgXAorICAgIGFuZHJvaWQvZmlsZXN5c3RlbXMvZnN0YWJfcGFyc2VyLmNwcCBcCisgICAgYW5kcm9pZC9maWxlc3lzdGVtcy9pbnRlcm5hbC9QYXJ0aXRpb25Db25maWdCYWNrZW5kLmNwcCBcCisgICAgYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnLmNwcCBcCisgICAgYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fdHlwZXMuY3BwIFwKKyAgICBhbmRyb2lkL2ZpbGVzeXN0ZW1zL3JhbWRpc2tfZXh0cmFjdG9yLmNwcCBcCisgICAgYW5kcm9pZC9mcmFtZWJ1ZmZlci5jIFwKKyAgICBhbmRyb2lkL2dwcy9HcHhQYXJzZXIuY3BwIFwKKyAgICBhbmRyb2lkL2dwcy9LbWxQYXJzZXIuY3BwIFwKKyAgICBhbmRyb2lkL2dwcy5jIFwKKyAgICBhbmRyb2lkL2dwdV9mcmFtZS5jcHAgXAorICAgIGFuZHJvaWQvaGVscC5jIFwKKyAgICBhbmRyb2lkL2h3LWNvbnRyb2wuYyBcCisgICAgYW5kcm9pZC9ody1ldmVudHMuYyBcCisgICAgYW5kcm9pZC9ody1maW5nZXJwcmludC5jIFwKKyAgICBhbmRyb2lkL2h3LWttc2cuYyBcCisgICAgYW5kcm9pZC9ody1sY2QuYyBcCisgICAgYW5kcm9pZC9ody1xZW11ZC5jcHAgXAorICAgIGFuZHJvaWQvaHctc2Vuc29ycy5jIFwKKyAgICBhbmRyb2lkL2pwZWctY29tcHJlc3MuYyBcCisgICAgYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzLmNwcCBcCisgICAgYW5kcm9pZC9sb2FkcG5nLmMgXAorICAgIGFuZHJvaWQvbWFpbi1jb21tb24uYyBcCisgICAgYW5kcm9pZC9tYWluLWhlbHAuY3BwIFwKKyAgICBhbmRyb2lkL21haW4tZW11Z2wuY3BwIFwKKyAgICBhbmRyb2lkL21haW4ta2VybmVsLXBhcmFtZXRlcnMuY3BwIFwKKyAgICBhbmRyb2lkL21haW4tcWVtdS1wYXJhbWV0ZXJzLmNwcCBcCisgICAgYW5kcm9pZC9tZXRyaWNzL0FkYkxpdmVuZXNzQ2hlY2tlci5jcHAgXAorICAgIGFuZHJvaWQvbWV0cmljcy9Bc3luY01ldHJpY3NSZXBvcnRlci5jcHAgXAorICAgIGFuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuY3BwIFwKKyAgICBhbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuY3BwIFwKKyAgICBhbmRyb2lkL21ldHJpY3MvbWV0cmljcy5jcHAgXAorICAgIGFuZHJvaWQvbWV0cmljcy9NZXRyaWNzUGF0aHMuY3BwIFwKKyAgICBhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmNwcCBcCisgICAgYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NXcml0ZXIuY3BwIFwKKyAgICBhbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NSZXBvcnRlci5jcHAgXAorICAgIGFuZHJvaWQvbWV0cmljcy9OdWxsTWV0cmljc1dyaXRlci5jcHAgXAorICAgIGFuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmNwcCBcCisgICAgYW5kcm9pZC9tZXRyaWNzL1N5bmNNZXRyaWNzUmVwb3J0ZXIuY3BwIFwKKyAgICBhbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmNwcCBcCisgICAgYW5kcm9pZC9taXNjL1JhbmRvbS5jcHAgXAorICAgIGFuZHJvaWQvbXVsdGl0b3VjaC1wb3J0LmMgXAorICAgIGFuZHJvaWQvbXVsdGl0b3VjaC1zY3JlZW4uYyBcCisgICAgYW5kcm9pZC9uZXR3b3JrL2NvbnRyb2wuY3BwIFwKKyAgICBhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmMgXAorICAgIGFuZHJvaWQvbmV0d29yay9nbG9iYWxzLmMgXAorICAgIGFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuY3BwIFwKKyAgICBhbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyLmNwcCBcCisgICAgYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmNwcCBcCisgICAgYW5kcm9pZC9vcGVuZ2wvR3B1RnJhbWVCcmlkZ2UuY3BwIFwKKyAgICBhbmRyb2lkL29wZW5nbC9HTFByb2Nlc3NQaXBlLmNwcCBcCisgICAgYW5kcm9pZC9vcGVuZ2wvZ3B1aW5mby5jcHAgXAorICAgIGFuZHJvaWQvb3BlbmdsL2xvZ2dlci5jcHAgXAorICAgIGFuZHJvaWQvb3BlbmdsL09wZW5nbEVzUGlwZS5jcHAgXAorICAgIGFuZHJvaWQvb3BlbmdsZXMuY3BwIFwKKyAgICBhbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5jcHAgXAorICAgIGFuZHJvaWQvcHJvY2Vzc19zZXR1cC5jcHAgXAorICAgIGFuZHJvaWQvcHJvdG9idWYvRGVsaW1pdGVkU2VyaWFsaXphdGlvbi5jcHAgXAorICAgIGFuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uLmMgXAorICAgIGFuZHJvaWQvcHJveHkvcHJveHlfaHR0cC5jIFwKKyAgICBhbmRyb2lkL3Byb3h5L3Byb3h5X2h0dHBfY29ubmVjdG9yLmMgXAorICAgIGFuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9yZXdyaXRlci5jIFwKKyAgICBhbmRyb2lkL3Byb3h5L3Byb3h5X3NldHVwLmNwcCBcCisgICAgYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmNwcCBcCisgICAgYW5kcm9pZC9xZW11LXNldHVwLmMgXAorICAgIGFuZHJvaWQvcWVtdS10Y3BkdW1wLmMgXAorICAgIGFuZHJvaWQvcXQvcXRfcGF0aC5jcHAgXAorICAgIGFuZHJvaWQvcXQvcXRfc2V0dXAuY3BwIFwKKyAgICBhbmRyb2lkL3Jlc291cmNlLmMgXAorICAgIGFuZHJvaWQvc2RrLWNvbnRyb2xsZXItc29ja2V0LmMgXAorICAgIGFuZHJvaWQvc2Vuc29ycy1wb3J0LmMgXAorICAgIGFuZHJvaWQvc2hhcGVyLmMgXAorICAgIGFuZHJvaWQvc25hcGhvc3QtYW5kcm9pZC5jIFwKKyAgICBhbmRyb2lkL3NuYXBzaG90LmMgXAorICAgIGFuZHJvaWQvdGVsZXBob255L2RlYnVnLmMgXAorICAgIGFuZHJvaWQvdGVsZXBob255L2dzbS5jIFwKKyAgICBhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5jIFwKKyAgICBhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuYyBcCisgICAgYW5kcm9pZC90ZWxlcGhvbnkvcmVtb3RlX2NhbGwuYyBcCisgICAgYW5kcm9pZC90ZWxlcGhvbnkvU2ltQWNjZXNzUnVsZXMuY3BwIFwKKyAgICBhbmRyb2lkL3RlbGVwaG9ueS9zaW1fY2FyZC5jIFwKKyAgICBhbmRyb2lkL3RlbGVwaG9ueS9zbXMuYyBcCisgICAgYW5kcm9pZC90ZWxlcGhvbnkvc3lzZGVwcy5jIFwKKyAgICBhbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZS5jcHAgXAorICAgIGFuZHJvaWQvdW5jb21wcmVzcy5jcHAgXAorICAgIGFuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXIuY3BwIFwKKyAgICBhbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmNwcCBcCisgICAgYW5kcm9pZC91c2VyLWNvbmZpZy5jcHAgXAorICAgIGFuZHJvaWQvdXRpbHMvc29ja2V0X2RyYWluZXIuY3BwIFwKKyAgICBhbmRyb2lkL3V0aWxzL3NvY2tldHMuYyBcCisgICAgYW5kcm9pZC91dGlscy9sb29wZXIuY3BwIFwKKyAgICBhbmRyb2lkL3dlYXItYWdlbnQvYW5kcm9pZF93ZWFyX2FnZW50LmNwcCBcCisgICAgYW5kcm9pZC93ZWFyLWFnZW50L1dlYXJBZ2VudC5jcHAgXAorICAgIGFuZHJvaWQvd2Vhci1hZ2VudC9QYWlyVXBXZWFyUGhvbmUuY3BwIFwKKworIyBQbGF0Zm9ybS1zcGVjaWZpYyBjYW1lcmEgY2FwdHVyZQoraWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGxpbnV4KQorICAgIExPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgICAgIGFuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLWxpbnV4LmMKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICAgICAgYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUtbWFjLm0KK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgIExPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgICAgIGFuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLXdpbmRvd3MuY3BwIFwKKyAgICAgICAgYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlci5jcHAgXAorCitlbmRpZgorCiskKGNhbGwgZ2VuLWh3LWNvbmZpZy1kZWZzKQorJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCisjIExpc3Qgb2Ygc3RhdGljIGxpYnJhcmllcyB0aGF0IGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiB0aGUgYmFzZSBsaWJyYXJpZXMKKyMgc2hvdWxkIHVzZS4KK0FORFJPSURfRU1VX0JBU0VfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZC1lbXUtYmFzZSBcCisgICAgJChMSUJVVUlEX1NUQVRJQ19MSUJSQVJJRVMpIFwKKworQU5EUk9JRF9FTVVfQkFTRV9MRExJQlMgOj0gXAorICAgICQoTElCVVVJRF9MRExJQlMpIFwKKworQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgYW5kcm9pZC1lbXUgXAorICAgICQoQU5EUk9JRF9FTVVfQkFTRV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChMSUJDVVJMX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAkKExJQlhNTDJfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoQlJFQUtQQURfQ0xJRU5UX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICBlbXVsYXRvci1saWJleHQ0X3V0aWxzIFwKKyAgICBlbXVsYXRvci1saWJzcGFyc2UgXAorICAgIGVtdWxhdG9yLWxpYnNlbGludXggXAorICAgIGVtdWxhdG9yLWxpYmpwZWcgXAorICAgIGVtdWxhdG9yLWxpYnBuZyBcCisgICAgZW11bGF0b3ItbGlid2VicCBcCisgICAgZW11bGF0b3ItemxpYiBcCisgICAgJChNRVRSSUNTX1BST1RPX1NUQVRJQ19MSUJSQVJJRVMpIFwKKworQU5EUk9JRF9FTVVfTERMSUJTIDo9IFwKKyAgICAkKEFORFJPSURfRU1VX0JBU0VfTERMSUJTKSBcCisgICAgJChMSUJDVVJMX0xETElCUykgXAorICAgICQoQlJFQUtQQURfQ0xJRU5UX0xETElCUykgXAorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyMgRm9yIGNhcENyZWF0ZUNhcHR1cmVXaW5kb3cgdXNlZCBpbiBjYW1lcmEtY2FwdHVyZS13aW5kb3dzLmNwcAorQU5EUk9JRF9FTVVfTERMSUJTICs9IC1sdmZ3MzIKKyMgRm9yIEdldFBlcmZvcm1hbmNlSW5mbyBpbiBDcmFzaFNlcnZpY2Vfd2luZG93cy5jcHAKK0FORFJPSURfRU1VX0xETElCUyArPSAtbHBzYXBpCisjIFdpbnNvY2sgZnVuY3Rpb25zCitBTkRST0lEX0VNVV9MRExJQlMgKz0gLWx3czJfMzIKKyMgR2V0TmV0d29ya1BhcmFtcygpIGZvciBhbmRyb2lkL3V0aWxzL2Rucy5jCitBTkRST0lEX0VNVV9MRExJQlMgKz0gLWxpcGhscGFwaQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgYW5kcm9pZC1lbXUgdW5pdCB0ZXN0cworIworIworCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItcHJvZ3JhbSwgYW5kcm9pZF9lbXUkKEJVSUxEX1RBUkdFVF9TVUZGSVgpX3VuaXR0ZXN0cykKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChBTkRST0lEX0VNVV9JTkNMVURFUykgXAorICAgICQoRU1VTEFUT1JfQ09NTU9OX0lOQ0xVREVTKSBcCisgICAgJChFTVVMQVRPUl9HVEVTVF9JTkNMVURFUykgXAorICAgICQoTElCWE1MMl9JTkNMVURFUykgXAorCitMT0NBTF9MRExJQlMgKz0gXAorICAgICQoQU5EUk9JRF9FTVVfTERMSUJTKSBcCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIGFuZHJvaWQvYXZkL3V0aWxfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL0FycmF5U2l6ZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvYXN5bmMvUmVjdXJyZW50VGFza191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvYXN5bmMvU2NvcGVkU29ja2V0V2F0Y2hfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL2FzeW5jL1N1YnNjcmliZXJMaXN0X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9jb250YWluZXJzL0NpcmN1bGFyQnVmZmVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9jb250YWluZXJzL0hhc2hVdGlsc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9Mb29rdXBfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TY29wZWRQb2ludGVyU2V0X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9jb250YWluZXJzL1NtYWxsVmVjdG9yX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9jb250YWluZXJzL1RhaWxRdWV1ZUxpc3RfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL0VpbnRyV3JhcHBlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvZmlsZXMvSW5pRmlsZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGZF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkU3RkaW9GaWxlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW1fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL0xvZ191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL21lbW9yeS9RU29ydF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0cl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL21pc2MvSHR0cFV0aWxzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9taXNjL1V0ZjhVdGlsc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvbmV0d29yay9EbnNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlsc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvT3B0aW9uYWxfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXRfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL1N0cmluZ1BhcnNlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vQ29uZGl0aW9uVmFyaWFibGVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vUmVhZFdyaXRlTG9ja191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWRfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRTdG9yZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvVHlwZVRyYWl0c191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvVXJpX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9VdWlkX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9WZXJzaW9uX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvY21kbGluZS1vcHRpb25fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9jb25zb2xlX2F1dGhfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL0FkYkd1ZXN0UGlwZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdFNlcnZlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfcGluZ3BvbmdfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3plcm9fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlyc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2VtdWxhdGlvbi9EZXZpY2VDb250ZXh0UnVubmVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvRmlsZVB1c2hlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1NjcmVlbkNhcHR1cmVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvTGluZUNvbnN1bWVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL1BhcmFtZXRlckxpc3RfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL3Rlc3RpbmcvVGVzdEFuZHJvaWRQaXBlRGV2aWNlLmNwcCBcCisgIGFuZHJvaWQvZW11bGF0aW9uL1ZtTG9ja191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Vycm9yLW1lc3NhZ2VzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3Jlc2l6ZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX3R5cGVzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3JfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmNwcCBcCisgIGFuZHJvaWQvZ3BzL0dweFBhcnNlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2dwcy9LbWxQYXJzZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvaHctbGNkX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvbWlzYy9SYW5kb21fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9uZXR3b3JrL2NvbnRyb2xfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9uZXR3b3JrL2NvbnN0YW50c191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRMaXN0X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZFNjYW5uZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvb3BlbmdsL0dwdUZyYW1lQnJpZGdlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvb3BlbmdsL2dwdWluZm9fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9wcm94eS9wcm94eV9jb21tb25fdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvcXQvcXRfcGF0aF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3F0L3F0X3NldHVwX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdGVsZXBob255L2dzbV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3RlbGVwaG9ueS9zbXNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC90ZWxlcGhvbnkvVGFnTGVuZ3RoVmFsdWVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC91cGRhdGUtY2hlY2svVXBkYXRlQ2hlY2tlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvYWNvbmZpZy1maWxlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvYnVmcHJpbnRfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC91dGlscy9kaXJzY2FubmVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvZG5zX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlcl91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL2Zvcm1hdF91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL3BhdGhfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvc3RyaW5nX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMvc29ja2V0c191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL3RpbWV6b25lX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvdXRpbHMveDg2X2NwdWlkX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvd2Vhci1hZ2VudC9QYWlyVXBXZWFyUGhvbmVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC93ZWFyLWFnZW50L3Rlc3RpbmcvV2VhckFnZW50VGVzdFV0aWxzLmNwcCBcCisgIGFuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnRfdW5pdHRlc3QuY3BwIFwKKworaWZlcSAod2luZG93cywkKEJVSUxEX1RBUkdFVF9PUykpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICBhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmlsZUhhbmRsZV91bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkUmVnS2V5X3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlsc191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGVfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlcl91bml0dGVzdC5jcHAgXAorCitlbHNlCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICBhbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0c191bml0dGVzdC5jcHAgXAorCitlbmRpZgorCitMT0NBTF9DRkxBR1MgKz0gLU8wCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAorICAgICQoQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUykgXAorICAgIGVtdWxhdG9yLWxpYmd0ZXN0IFwKKworIyBMaW5rIGFnYWluc3Qgc3RhdGljIGxpYnN0ZGMrKyBvbiBMaW51eCBhbmQgV2luZG93cyBzaW5jZSB0aGUgdW5pdC10ZXN0cworIyBjYW5ub3QgcGljayB1cCBvdXIgY3VzdG9tIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGZyb20KKyMgJChCVUlMRF9PQkpTX0RJUikvbGliWzY0XS8KKyQoY2FsbCBsb2NhbC1saW5rLXN0YXRpYy1jKytsaWIpCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItcHJvZ3JhbSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgYW5kcm9pZC1lbXUtbWV0cmljcyB1bml0IHRlc3RzCisjCisjCisKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1wcm9ncmFtLCBcCisgICAgYW5kcm9pZF9lbXVfbWV0cmljcyQoQlVJTERfVEFSR0VUX1NVRkZJWClfdW5pdHRlc3RzKQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKEFORFJPSURfRU1VX0lOQ0xVREVTKSBcCisgICAgJChFTVVMQVRPUl9DT01NT05fSU5DTFVERVMpIFwKKyAgICAkKEVNVUxBVE9SX0dURVNUX0lOQ0xVREVTKSBcCisgICAgJChMSUJYTUwyX0lOQ0xVREVTKSBcCisKK0xPQ0FMX0xETElCUyArPSBcCisgICAgJChBTkRST0lEX0VNVV9MRExJQlMpIFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgYW5kcm9pZC9tZXRyaWNzL1N0dWRpb0NvbmZpZ191bml0dGVzdC5jcHAgXAorICBhbmRyb2lkL21ldHJpY3MvdGVzdHMvQXN5bmNNZXRyaWNzUmVwb3J0ZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL0ZpbGVNZXRyaWNzV3JpdGVyX3VuaXR0ZXN0LmNwcCBcCisgIGFuZHJvaWQvbWV0cmljcy90ZXN0cy9NZXRyaWNzUmVwb3J0ZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzUmVwb3J0ZXIuY3BwIFwKKyAgYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzV3JpdGVyLmNwcCBcCisgIGFuZHJvaWQvbWV0cmljcy90ZXN0cy9OdWxsTWV0cmljc0NsYXNzZXNfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL1BlcmlvZGljUmVwb3J0ZXJfdW5pdHRlc3QuY3BwIFwKKyAgYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL1N5bmNNZXRyaWNzUmVwb3J0ZXJfdW5pdHRlc3QuY3BwIFwKKworTE9DQUxfQ0ZMQUdTICs9IC1PMAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKKyAgICAkKEFORFJPSURfRU1VX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICBlbXVsYXRvci1saWJndGVzdCBcCisKKyMgTGluayBhZ2FpbnN0IHN0YXRpYyBsaWJzdGRjKysgb24gTGludXggYW5kIFdpbmRvd3Mgc2luY2UgdGhlIHVuaXQtdGVzdHMKKyMgY2Fubm90IHBpY2sgdXAgb3VyIGN1c3RvbSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSBmcm9tCisjICQoQlVJTERfT0JKU19ESVIpL2xpYls2NF0vCiskKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKQorCiskKGNhbGwgZW5kLWVtdWxhdG9yLXByb2dyYW0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyAgZW11bGF0b3ItbGlidWkKKyMKKyMgIFRoaXMgaXMgdGhlIGxpYnJhcnkgdGhhdCBpbXBsZW1lbnRzIHRoZSBlbXVsYXRvcidzIFVJIG9uIHRvcCBvZgorIyAgYW5kcm9pZC1lbXUuIE5vdGUgdGhhdCBpdCBkZXBlbmRzIG9uIGludGVyZmFjZXMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCisjICBieSB0aGUgZW5naW5lLXNwZWNpZmljIGdsdWUgY29kZS4gQXMgc3VjaCwgdGhlIGNvZGUgY2Fubm90IGJlIHVuaXQtdGVzdGVkCisjICBmb3Igbm93LgorIworRU1VTEFUT1JfTElCVUlfSU5DTFVERVMgOj0KK0VNVUxBVE9SX0xJQlVJX0xETElCUyA6PQorRU1VTEFUT1JfTElCVUlfTERGTEFHUyA6PQorRU1VTEFUT1JfTElCVUlfU1RBVElDX0xJQlJBUklFUyA6PQorCitFTVVMQVRPUl9MSUJVSV9JTkNMVURFUyArPSAkKFFUX0lOQ0xVREVTKQorRU1VTEFUT1JfTElCVUlfTERGTEFHUyArPSAkKFFUX0xERkxBR1MpCitFTVVMQVRPUl9MSUJVSV9MRExJQlMgKz0gJChRVF9MRExJQlMpCisKKyMgVGhlIHNraW4gc3VwcG9ydCBzb3VyY2VzCitpbmNsdWRlICQoX0FORFJPSURfRU1VX1JPT1QpL2FuZHJvaWQvc2tpbi9zb3VyY2VzLm1rCisKK0VNVUxBVE9SX0xJQlVJX1NUQVRJQ19MSUJSQVJJRVMgKz0gJChBTkRST0lEX1NLSU5fU1RBVElDX0xJQlJBUklFUykKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLWxpYnJhcnksIGVtdWxhdG9yLWxpYnVpKQorCitFTVVMQVRPUl9MSUJVSV9JTkNMVURFUyArPSAkKEFORFJPSURfU0tJTl9JTkNMVURFUykKK0VNVUxBVE9SX0xJQlVJX0xETElCUyArPSAkKEFORFJPSURfU0tJTl9MRExJQlMpCisKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgJChFTVVMQVRPUl9DT01NT05fQ0ZMQUdTKSBcCisgICAgJChBTkRST0lEX1NLSU5fQ0ZMQUdTKSBcCisgICAgJChMSUJYTUwyX0NGTEFHUykgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKEVNVUxBVE9SX0NPTU1PTl9JTkNMVURFUykgXAorICAgICQoRU1VTEFUT1JfTElCVUlfSU5DTFVERVMpIFwKKworTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICAkKEFORFJPSURfU0tJTl9TT1VSQ0VTKSBcCisgICAgYW5kcm9pZC9ncHVfZnJhbWUuY3BwIFwKKyAgICBhbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5jIFwKKyAgICBhbmRyb2lkL21haW4tY29tbW9uLXVpLmMgXAorICAgIGFuZHJvaWQvcmVzb3VyY2UuYyBcCisKK0xPQ0FMX1FUX01PQ19TUkNfRklMRVMgOj0gJChBTkRST0lEX1NLSU5fUVRfTU9DX1NSQ19GSUxFUykKK0xPQ0FMX1FUX1JFU09VUkNFUyA6PSAkKEFORFJPSURfU0tJTl9RVF9SRVNPVVJDRVMpCitMT0NBTF9RVF9VSV9TUkNfRklMRVMgOj0gJChBTkRST0lEX1NLSU5fUVRfVUlfU1JDX0ZJTEVTKQorCiskKGNhbGwgZ2VuLWh3LWNvbmZpZy1kZWZzKQorJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCisjIGVtdWxhdG9yLWxpYnVpIHVuaXQgdGVzdHMKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sIGVtdWxhdG9yJChCVUlMRF9UQVJHRVRfU1VGRklYKV9saWJ1aV91bml0dGVzdHMpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoRU1VTEFUT1JfQ09NTU9OX0lOQ0xVREVTKSBcCisgICAgJChBTkRST0lEX0VNVV9JTkNMVURFUykgXAorICAgICQoRU1VTEFUT1JfR1RFU1RfSU5DTFVERVMpIFwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBhbmRyb2lkL3NraW4va2V5Y29kZV91bml0dGVzdC5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9rZXljb2RlLWJ1ZmZlcl91bml0dGVzdC5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9yZWN0X3VuaXR0ZXN0LmNwcCBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoTElCWE1MMl9JTkNMVURFUykgXAorCitMT0NBTF9DRkxBR1MgKz0gLU8wCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKKyAgICBlbXVsYXRvci1saWJ1aSBcCisgICAgZW11bGF0b3ItbGliZ3Rlc3QgXAorICAgICQoQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUykgXAorCisjIExpbmsgYWdhaW5zdCBzdGF0aWMgbGlic3RkYysrIG9uIExpbnV4IGFuZCBXaW5kb3dzIHNpbmNlIHRoZSB1bml0LXRlc3RzCisjIGNhbm5vdCBwaWNrIHVwIG91ciBjdXN0b20gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgZnJvbQorIyAkKEJVSUxEX09CSlNfRElSKS9saWJbNjRdLworJChjYWxsIGxvY2FsLWxpbmstc3RhdGljLWMrK2xpYikKKyQoY2FsbCBnZW4taHctY29uZmlnLWRlZnMpCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItcHJvZ3JhbSkKKworIyBEb25lCisKK0xPQ0FMX1BBVEggOj0gJChfQU5EUk9JRF9FTVVfT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L01ha2VmaWxlLmNyYXNoLXNlcnZpY2UubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11L01ha2VmaWxlLmNyYXNoLXNlcnZpY2UubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmODdhMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvTWFrZWZpbGUuY3Jhc2gtc2VydmljZS5tawpAQCAtMCwwICsxLDE1NyBAQAorIyMgQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMjCisjIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorIyMgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyMjCisjIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMKKyMjIyAgZW11bGF0b3ItY3Jhc2gtc2VydmljZTogU2VydmljZSBmb3IgZW11bGF0b3IgY3Jhc2ggZHVtcHMKKyMjIworCisjIE5PVEU6IEJ1aWxkIGFzIDMyLWJpdCBvciA2NC1iaXQgZXhlY3V0YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZgorIyAgICAgICBFTVVMQVRPUl9QUk9HUkFNX0JJVE5FU1MuCisjCisKK09MRF9MT0NBTF9QQVRIIDo9ICQoTE9DQUxfUEFUSCkKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sIGVtdWxhdG9yJChCVUlMRF9UQVJHRVRfU1VGRklYKS1jcmFzaC1zZXJ2aWNlKQorJChjYWxsIGdlbi1ody1jb25maWctZGVmcykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBhbmRyb2lkL2NyYXNocmVwb3J0L21haW4tY3Jhc2gtc2VydmljZS5jcHAgXAorICAgIGFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2NvbW1vbi5jcHAgXAorICAgIGFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlXyQoQlVJTERfVEFSR0VUX09TKS5jcHAgXAorICAgIGFuZHJvaWQvY3Jhc2hyZXBvcnQvdWkvQ29uZmlybURpYWxvZy5jcHAgXAorICAgIGFuZHJvaWQvcmVzb3VyY2UuYyBcCisgICAgYW5kcm9pZC9za2luL3Jlc291cmNlLmMgXAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICAkKEFORFJPSURfRU1VX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICBlbXVsYXRvci1saWJ1aSBcCisgICAgJChFTVVMQVRPUl9MSUJVSV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChCUkVBS1BBRF9TVEFUSUNfTElCUkFSSUVTKSBcCisKK0xPQ0FMX1FUX01PQ19TUkNfRklMRVMgOj0gXAorICAgIGFuZHJvaWQvY3Jhc2hyZXBvcnQvdWkvQ29uZmlybURpYWxvZy5oIFwKKworTE9DQUxfTERGTEFHUyA6PQoraWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCitMT0NBTF9MREZMQUdTICs9IC1MJChRVF9UT1BfRElSKS9iaW4KK2Vsc2UKK0xPQ0FMX0xERkxBR1MgKz0gJChFTVVMQVRPUl9MSUJVSV9MREZMQUdTKQorZW5kaWYKKworTE9DQUxfTERMSUJTIDo9IFwKKyAgICAkKEVNVUxBVE9SX0xJQlVJX0xETElCUykgXAorICAgICQoQU5EUk9JRF9FTVVfTERMSUJTKSBcCisgICAgJChCUkVBS1BBRF9MRExJQlMpIFwKKyAgICAkKENYWF9TVERfTElCKSBcCisKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgLURDT05GSUdfUVQgXAorICAgICQoRU1VTEFUT1JfVkVSU0lPTl9DRkxBR1MpIFwKKyAgICAkKEVNVUxBVE9SX0xJQlVJX0NGTEFHUykgXAorICAgICQoTElCQ1VSTF9DRkxBR1MpIFwKKworaWZkZWYgRU1VTEFUT1JfQ1JBU0hVUExPQUQKK0xPQ0FMX0NGTEFHUyArPSBcCisgICAgLURDUkFTSFVQTE9BRD0kKEVNVUxBVE9SX0NSQVNIVVBMT0FEKQorZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChBTkRST0lEX0VNVV9JTkNMVURFUykgXAorICAgICQoRU1VTEFUT1JfTElCVUlfSU5DTFVERVMpIFwKKyAgICAkKExJQkNVUkxfSU5DTFVERVMpIFwKKyAgICAkKEJSRUFLUEFEX0lOQ0xVREVTKSBcCisgICAgJChCUkVBS1BBRF9DTElFTlRfSU5DTFVERVMpIFwKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCiskKGV2YWwgJChjYWxsIGluc2VydC13aW5kb3dzLWljb24pKQorZW5kaWYKKworJChjYWxsIGVuZC1lbXVsYXRvci1wcm9ncmFtKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjCisjIyMgIGVtdWxhdG9yX3Rlc3RfY3Jhc2hlcjogVGVzdCBleGVjdHVhYmxlIHRoYXQgYXR0YWNoZXMgdG8gY3Jhc2ggc2VydmljZQorIyMjCisKKyMgTk9URTogQnVpbGQgYXMgMzItYml0IG9yIDY0LWJpdCBleGVjdXRhYmxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCisjICAgICAgIEVNVUxBVE9SX1BST0dSQU1fQklUTkVTUy4KKyMKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sIGVtdWxhdG9yJChCVUlMRF9UQVJHRVRfU1VGRklYKV90ZXN0X2NyYXNoZXIpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpIFwKKyAgICAkKEJSRUFLUEFEX0lOQ0xVREVTKSBcCisKK0xPQ0FMX0NGTEFHUyArPSAtTzAKKworTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBhbmRyb2lkL2NyYXNocmVwb3J0L3Rlc3RpbmcvbWFpbi10ZXN0LWNyYXNoZXIuY3BwIFwKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCisgICAgJChBTkRST0lEX0VNVV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChCUkVBS1BBRF9TVEFUSUNfTElCUkFSSUVTKSBcCisKK0xPQ0FMX0xETElCUyArPSBcCisgICAgJChBTkRST0lEX0VNVV9MRExJQlMpIFwKKworIyBMaW5rIGFnYWluc3Qgc3RhdGljIGxpYnN0ZGMrKyBvbiBMaW51eCBhbmQgV2luZG93cyBzaW5jZSB0aGUgdW5pdC10ZXN0cworIyBjYW5ub3QgcGljayB1cCBvdXIgY3VzdG9tIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IGZyb20KKyMgJChCVUlMRF9PQkpTX0RJUikvbGliWzY0XS8KKyQoY2FsbCBsb2NhbC1saW5rLXN0YXRpYy1jKytsaWIpCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItcHJvZ3JhbSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIworIyMjICBjcmFzaCByZXBvcnRlciB1bml0IHRlc3RzCisKKyMgTk9URTogQnVpbGQgYXMgMzItYml0IG9yIDY0LWJpdCBleGVjdXRhYmxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCisjICAgICAgIEVNVUxBVE9SX1BST0dSQU1fQklUTkVTUy4KKyMKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sIGVtdWxhdG9yJChCVUlMRF9UQVJHRVRfU1VGRklYKV9jcmFzaHJlcG9ydF91bml0dGVzdHMpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpIFwKKyAgICAkKEVNVUxBVE9SX0dURVNUX0lOQ0xVREVTKSBcCisgICAgJChMSUJDVVJMX0lOQ0xVREVTKSBcCisgICAgJChCUkVBS1BBRF9JTkNMVURFUykgXAorCitMT0NBTF9DRkxBR1MgKz0gLU8wICQoTElCQ1VSTF9DRkxBR1MpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfY29tbW9uLmNwcCBcCisgICAgYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfJChCVUlMRF9UQVJHRVRfT1MpLmNwcCBcCisgICAgYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfdW5pdHRlc3QuY3BwIFwKKyAgICBhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU3lzdGVtX3VuaXR0ZXN0LmNwcCBcCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAorICAgICQoQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoQlJFQUtQQURfU1RBVElDX0xJQlJBUklFUykgXAorICAgIGVtdWxhdG9yLWxpYmd0ZXN0IFwKKworTE9DQUxfTERMSUJTICs9IFwKKyAgICAkKEFORFJPSURfRU1VX0xETElCUykgXAorCisjIExpbmsgYWdhaW5zdCBzdGF0aWMgbGlic3RkYysrIG9uIExpbnV4IGFuZCBXaW5kb3dzIHNpbmNlIHRoZSB1bml0LXRlc3RzCisjIGNhbm5vdCBwaWNrIHVwIG91ciBjdXN0b20gdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgZnJvbQorIyAkKEJVSUxEX09CSlNfRElSKS9saWJbNjRdLworJChjYWxsIGxvY2FsLWxpbmstc3RhdGljLWMrK2xpYikKKworJChjYWxsIGVuZC1lbXVsYXRvci1wcm9ncmFtKQorCitMT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYWRiLXNlcnZlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYWRiLXNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhMTQyZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hZGItc2VydmVyLmNwcApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYWRiLXNlcnZlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0ZGlvU3RyZWFtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJEZWJ1Z1BpcGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJHdWVzdFBpcGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQW5kcm9pZFBpcGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIHsKKwordXNpbmcgYW5kcm9pZDo6ZW11bGF0aW9uOjpBZGJHdWVzdFBpcGU7Cit1c2luZyBhbmRyb2lkOjplbXVsYXRpb246OkFkYkhvc3RMaXN0ZW5lcjsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSG9zdFNlcnZlcjsKK3VzaW5nIGFuZHJvaWQ6OkFuZHJvaWRQaXBlOworCisvLyBHbG9iYWwgdmFyaWFibGVzIHVzZWQgaGVyZS4KK3N0cnVjdCBHbG9iYWxzIHsKKyAgICBHbG9iYWxzKCkgOiBob3N0TGlzdGVuZXIoQWRiSG9zdFNlcnZlcjo6Z2V0Q2xpZW50UG9ydCgpKSB7fQorCisgICAgdm9pZCByZWdpc3RlclNlcnZpY2VzKCkgeworICAgICAgICAvLyBSZWdpc3RlciBhZGIgcGlwZSBzZXJ2aWNlLgorICAgICAgICBhdXRvIHNlcnZpY2UgPSBuZXcgQWRiR3Vlc3RQaXBlOjpTZXJ2aWNlKCZob3N0TGlzdGVuZXIpOworICAgICAgICBob3N0TGlzdGVuZXIuc2V0R3Vlc3RBZ2VudChzZXJ2aWNlKTsKKyAgICAgICAgQW5kcm9pZFBpcGU6OlNlcnZpY2U6OmFkZChzZXJ2aWNlKTsKKworICAgICAgICAvLyBSZWdpc3RlciBhZGItZGVidWcgcGlwZSBzZXJ2aWNlLgorICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIGRlYnVnU3RyZWFtID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0soYWRiKSkgeworICAgICAgICAgICAgZGVidWdTdHJlYW0gPSBuZXcgYW5kcm9pZDo6YmFzZTo6U3RkaW9TdHJlYW0oc3RkZXJyKTsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkOjpBbmRyb2lkUGlwZTo6U2VydmljZTo6YWRkKAorICAgICAgICAgICAgICAgIG5ldyBhbmRyb2lkOjplbXVsYXRpb246OkFkYkRlYnVnUGlwZTo6U2VydmljZShkZWJ1Z1N0cmVhbSkpOworICAgIH0KKworICAgIEFkYkhvc3RMaXN0ZW5lciBob3N0TGlzdGVuZXI7Cit9OworCithbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U8R2xvYmFscz4gc0dsb2JhbHMgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIGFuZHJvaWRfYWRiX3NlcnZlcl9ub3RpZnkoaW50IHBvcnQpIHsKKyAgICBhdXRvIGdsb2JhbHMgPSBzR2xvYmFscy5wdHIoKTsKKyAgICBnbG9iYWxzLT5ob3N0TGlzdGVuZXIucmVzZXQocG9ydCk7CisgICAgZ2xvYmFscy0+aG9zdExpc3RlbmVyLm5vdGlmeVNlcnZlcigpOworfQorCitpbnQgYW5kcm9pZF9hZGJfc2VydmVyX2luaXQoaW50IHBvcnQpIHsKKyAgICBhdXRvIGdsb2JhbHMgPSBzR2xvYmFscy5wdHIoKTsKKyAgICBpZiAoIWdsb2JhbHMtPmhvc3RMaXN0ZW5lci5yZXNldChwb3J0KSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGFuZHJvaWRfYWRiX3NlcnZlcl91bmRvX2luaXQodm9pZCkgeworICAgIHNHbG9iYWxzLT5ob3N0TGlzdGVuZXIucmVzZXQoLTEpOworfQorCit2b2lkIGFuZHJvaWRfYWRiX3NlcnZpY2VfaW5pdCh2b2lkKSB7CisgICAgLy8gUmVnaXN0ZXIgYWRiIHBpcGUgc2VydmljZS4KKyAgICBzR2xvYmFscy0+cmVnaXN0ZXJTZXJ2aWNlcygpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FkYi1zZXJ2ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hZGItc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxMDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hZGItc2VydmVyLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBOb3RpZnkgdGhlIEFEQiBzZXJ2ZXIsIGlmIGFueSBpcyBydW5uaW5nIG9uIHRoZSBob3N0LCB0aGF0IGEgbmV3CisvLyBlbXVsYXRvciBpbnN0YW5jZSBpcworZXh0ZXJuIHZvaWQgYW5kcm9pZF9hZGJfc2VydmVyX25vdGlmeShpbnQgcG9ydCk7CisKKy8vIFNldHVwIEFEQiBTZXJ2ZXIgbGlzdGVuZXIsIGV4cGVjdGluZyBjb25uZWN0aW9ucyBvbiBUQ1AgfHBvcnR8LgorLy8gUmV0dXJuIDAgb24gc3VjY2VzcywgLTEvZXJybm8gb3RoZXJ3aXNlLgorZXh0ZXJuIGludCBhbmRyb2lkX2FkYl9zZXJ2ZXJfaW5pdChpbnQgcG9ydCk7CisKKy8vIFRlYXJkb3duIEFEQiBTZXJ2ZXIgbGlzdGVuZXIuCitleHRlcm4gdm9pZCBhbmRyb2lkX2FkYl9zZXJ2ZXJfdW5kb19pbml0KHZvaWQpOworCisvLyBSZWdpc3RlciBBREIgcGlwZSBzZXJ2aWNlcy4gVGhpcyBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciBhIHN1Y2Nlc2Z1bGwKKy8vIGNhbGwgdG8gYWRiX3NlcnZlcl9pbml0KCkgYW5kIGJlZm9yZSBhZGJfc2VydmVyX3VuZG9faW5pdCgpLCBpZiBhbnkuCitleHRlcm4gdm9pZCBhbmRyb2lkX2FkYl9zZXJ2aWNlX2luaXQodm9pZCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FuZHJvaWQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hbmRyb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlNTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hbmRyb2lkLmgKQEAgLTAsMCArMSw5NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIFNvbWUgY29tbW9ubHktdXNlZCBmaWxlIG5hbWVzICovCisKKy8qIFRoZSBuYW1lIG9mIHRoZSAuaW5pIGZpbGUgdGhhdCBjb250YWlucyB0aGUgaW5pdGlhbCBoYXJkd2FyZQorICogcHJvcGVydGllcyBmb3IgdGhlIEFWRC4gVGhpcyBmaWxlIGlzIHNwZWNpZmljIHRvIHRoZSBBVkQgYW5kCisgKiBpcyBpbiB0aGUgQVZEJ3MgZGlyZWN0b3J5LgorICovCisjZGVmaW5lIENPUkVfQ09ORklHX0lOSSAiY29uZmlnLmluaSIKKworLyogVGhlIG5hbWUgb2YgdGhlIC5pbmkgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBoYXJkd2FyZQorICogcHJvcGVydGllcyBmb3IgdGhlIEFWRC4gVGhpcyBmaWxlIGlzIHNwZWNpZmljIHRvIHRoZSBBVkQgYW5kCisgKiBpcyBpbiB0aGUgQVZEJ3MgZGlyZWN0b3J5LiBUaGlzIHdpbGwgYmUgdXNlZCB0byBsYXVuY2ggdGhlCisgKiBjb3JyZXNwb25kaW5nIGNvcmUgZnJvbSB0aGUgVUkuCisgKi8KKyNkZWZpbmUgQ09SRV9IQVJEV0FSRV9JTkkgImhhcmR3YXJlLXFlbXUuaW5pIgorCisvKiBUaGUgZmlsZSB3aGVyZSB0aGUgY3Jhc2ggcmVwb3J0ZXIgaG9sZHMgYSBjb3B5IG9mCisgKiB0aGUgaGFyZHdhcmUgcHJvcGVydGllcy4gVGhpcyBmaWxlIGlzIGluIGEgdGVtcG9yYXJ5CisgKiBkaXJlY3Rvcnkgc2V0IHVwIGJ5IHRoZSBjcmFzaCByZXBvcnRlci4KKyAqLworI2RlZmluZSBDUkFTSF9BVkRfSEFSRFdBUkVfSU5GTyAiYXZkX2luZm8udHh0IgorCisvKiogaW4gdmwuYyAqLworCisvKiBlbmFibGUvZGlzYWJsZSBpbnRlcnJ1cHQgcG9sbGluZyBtb2RlLiB0aGUgZW11bGF0b3Igd2lsbCBhbHdheXMgdXNlIDEwMCUKKyAqIG9mIGhvc3QgQ1BVIHRpbWUsIGJ1dCB3aWxsIGdldCBoaWdoLXF1YWxpdHkgdGltZSBtZWFzdXJtZW50cy4gdGhpcyBpcworICogcmVxdWlyZWQgZm9yIHRoZSB0cmFjaW5nIG1vZGUgdW5sZXNzIHlvdSBjYW4gYmVhciAxMG1zIGdyYW51bGFyaXRpZXMKKyAqLworZXh0ZXJuIHZvaWQgIHFlbXVfcG9sbGluZ19lbmFibGUodm9pZCk7CitleHRlcm4gdm9pZCAgcWVtdV9wb2xsaW5nX2Rpc2FibGUodm9pZCk7CisKKy8qKmluIGh3L2FuZHJvaWQvZ29sZGZpc2gvZmIuYyAqLworCisvKiBmcmFtZWJ1ZmZlciBkaW1lbnNpb25zIGluIHBpeGVscywgbm90ZSB0aGVzZSBjYW4gY2hhbmdlIGR5bmFtaWNhbGx5ICovCitleHRlcm4gaW50ICBhbmRyb2lkX2ZyYW1lYnVmZmVyX3c7CitleHRlcm4gaW50ICBhbmRyb2lkX2ZyYW1lYnVmZmVyX2g7CisvKiBmcmFtZWJ1ZmZlciBkaW1lbnNpb25zIGluIG1tICovCitleHRlcm4gaW50ICBhbmRyb2lkX2ZyYW1lYnVmZmVyX3BoeXNfdzsKK2V4dGVybiBpbnQgIGFuZHJvaWRfZnJhbWVidWZmZXJfcGh5c19oOworCisvKiogIGluIGFuZHJvaWRfbWFpbi5jICovCisKKy8qIHRoaXMgaXMgdGhlIHBvcnQgdXNlZCBmb3IgdGhlIGNvbnRyb2wgY29uc29sZSBpbiB0aGlzIGVtdWxhdG9yIGluc3RhbmNlLgorICogc3RhcnRzIGF0IDU1NTQsIHdpdGggaW5jcmVtZW50cyBvZiAyICovCitleHRlcm4gaW50ICAgYW5kcm9pZF9iYXNlX3BvcnQ7CisKKy8qIHRoaXMgaXMgdGhlIHBvcnQgdXNlZCB0byBjb25uZWN0IEFEQiAoQW5kcm9pZCBEZWJ1ZyBCcmlkZ2UpCisgKiBkZWZhdWx0IGlzIDUwMzcgKi8KK2V4dGVybiBpbnQgICBhbmRyb2lkX2FkYl9wb3J0OworCisvKiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGZvcm0gdGhlICJzZXJpYWwgbnVtYmVyIiBvZgorICogdGhlIEFWRC4gVGhlIGRlZmF1bHQgaXMgNTU1NCwgc28gdGhlIGRlZmF1bHQgc2VyaWFsCisgKiBudW1iZXIgaXMgImVtdWxhdG9yLTU1NTQiLiAqLworZXh0ZXJuIGludCAgIGFuZHJvaWRfc2VyaWFsX251bWJlcl9wb3J0OworCisvKiBwYXJzZXMgYSBuZXR3b3JrIHNwZWVkIHBhcmFtZXRlciBhbmQgc2V0cyBhbmRyb2lkX25ldF91cGxvYWRfc3BlZWQgYW5kCisgKiBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZCBhY2NvcmRpbmdseS4gcmV0dXJucyAtMSBvbiBmYWlsdXJlLCAwIG9uIHN1Y2Nlc3MgKi8KK2V4dGVybiBpbnQgICBhbmRyb2lkX3BhcnNlX25ldHdvcmtfc3BlZWQoY29uc3QgY2hhciogIHNwZWVkKTsKKworLyogcGFyc2UgYSBuZXR3b3JrIGRlbGF5IHBhcmFtZXRlciBhbmQgc2V0cyBxZW11X25ldF9taW4vbWF4X2xhdGVuY3kKKyAqIGFjY29yZGluZ2x5LiByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MgKi8KK2V4dGVybiBpbnQgICBhbmRyb2lkX3BhcnNlX25ldHdvcmtfbGF0ZW5jeShjb25zdCBjaGFyKiAgZGVsYXkpOworCisvKiogIGluIHFlbXVfc2V0dXAuYyAqLworCisvLyBTZWUgYW5kcm9pZC9jb25zb2xlLmgKK3N0cnVjdCBBbmRyb2lkQ29uc29sZUFnZW50czsKKworLy8gU2V0dXAgQW5kcm9pZCBlbXVsYXRpb24uIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCitleHRlcm4gYm9vbCBhbmRyb2lkX2VtdWxhdGlvbl9zZXR1cChjb25zdCBzdHJ1Y3QgQW5kcm9pZENvbnNvbGVBZ2VudHMqIGFnZW50cyk7CisKK2V4dGVybiB2b2lkICBhbmRyb2lkX2VtdWxhdGlvbl90ZWFyZG93biggdm9pZCApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1jb25zb2xlLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtY29uc29sZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmFiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtY29uc29sZS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2FzeW5jLWNvbnNvbGUuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKgorICogU3RhdGUgZGlhZ3JhbSwgb21taXR0aW5nIHRoZSBFUlJPUiBzdGF0ZQorICoKKyAqICBJTklUSUFMIC0tPi0tKworICogICAgIHwgICAgICAgIHwKKyAqICAgICB8ICAgICBDT05ORUNUSU5HCisgKiAgICAgfCAgICAgICB8CisgKiAgICAgfDwtLS0tLSsKKyAqICAgICB2CisgKiAgUkVBRF9CQU5ORVJfMQorICogICAgIHwKKyAqICAgICB2CisgKiAgUkVBRF9CQU5ORVJfMgorICogICAgIHwKKyAqICAgICB2CisgKiAgQ09NUExFVEUKKyAqLworCitlbnVtIHsKKyAgICBTVEFURV9JTklUSUFMLAorICAgIFNUQVRFX0NPTk5FQ1RJTkcsCisgICAgU1RBVEVfRVJST1IsCisgICAgU1RBVEVfUkVBRF9CQU5ORVJfMSwKKyAgICBTVEFURV9SRUFEX0JBTk5FUl8yLAorICAgIFNUQVRFX0NPTVBMRVRFCit9OworCisvKiBBIGhlbHBlciBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSBsaW5lIHJlYWRlciBhbmQgc3dpdGNoIHRvIGEgbmV3IHN0YXRlICovCitzdGF0aWMgQXN5bmNTdGF0dXMKK19hY2NfcHJlcGFyZUxpbmVSZWFkZXIoQXN5bmNDb25zb2xlQ29ubmVjdG9yKiBhY2MsIGludCBuZXdTdGF0ZSkKK3sKKyAgICBhY2MtPnN0YXRlID0gbmV3U3RhdGU7CisgICAgYXN5bmNMaW5lUmVhZGVyX2luaXQoYWNjLT5scmVhZGVyLCBhY2MtPmxidWZmLCBzaXplb2YoYWNjLT5sYnVmZiksIGFjYy0+aW8pOworICAgIHJldHVybiBBU1lOQ19ORUVEX01PUkU7Cit9CisKK0FzeW5jU3RhdHVzCithc3luY0NvbnNvbGVDb25uZWN0b3JfY29ubmVjdChBc3luY0NvbnNvbGVDb25uZWN0b3IqIGFjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzKiAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICAgICAgICAgICAgaW8pCit7CisgICAgYWNjLT5zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CisgICAgYWNjLT5hZGRyZXNzID0gYWRkcmVzc1swXTsKKyAgICBhY2MtPmlvID0gaW87CisgICAgcmV0dXJuIGFzeW5jQ29uc29sZUNvbm5lY3Rvcl9ydW4oYWNjKTsKK30KKworCitBc3luY1N0YXR1cworYXN5bmNDb25zb2xlQ29ubmVjdG9yX3J1bihBc3luY0NvbnNvbGVDb25uZWN0b3IqIGFjYykKK3sKKyAgICBBc3luY1N0YXR1cyAgc3RhdHVzID0gQVNZTkNfTkVFRF9NT1JFOworCisgICAgZm9yICg7OykgeworICAgICAgICBzd2l0Y2ggKGFjYy0+c3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBTVEFURV9FUlJPUjogLyogcmVwb3J0aW5nIHByZXZpb3VzIGVycm9yICovCisgICAgICAgICAgICBlcnJubyA9IGFjYy0+ZXJyb3I7CisgICAgICAgICAgICByZXR1cm4gQVNZTkNfRVJST1I7CisKKyAgICAgICAgY2FzZSBTVEFURV9JTklUSUFMOiAvKiBpbml0aWFsIGNvbm5lY3Rpb24gYXR0ZW1wdCAqLworICAgICAgICAgICAgYWNjLT5zdGF0ZSA9IFNUQVRFX0NPTk5FQ1RJTkc7CisgICAgICAgICAgICBzdGF0dXMgPSBhc3luY0Nvbm5lY3Rvcl9pbml0KGFjYy0+Y29ubmVjdG9yLCAmYWNjLT5hZGRyZXNzLCBhY2MtPmlvKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVNZTkNfRVJST1IpCisgICAgICAgICAgICAgICAgZ290byBTRVRfRVJST1I7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVNZTkNfQ09NUExFVEUpIHsgLyogaW1tZWRpYXRlIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgICAgICAgICBfYWNjX3ByZXBhcmVMaW5lUmVhZGVyKGFjYywgU1RBVEVfUkVBRF9CQU5ORVJfMSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX0NPTk5FQ1RJTkc6IC8qIHN0aWxsIHRyeWluZyB0byBjb25uZWN0ICovCisgICAgICAgICAgICBzdGF0dXMgPSBhc3luY0Nvbm5lY3Rvcl9ydW4oYWNjLT5jb25uZWN0b3IpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19FUlJPUikKKyAgICAgICAgICAgICAgICBnb3RvIFNFVF9FUlJPUjsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19DT01QTEVURSkgeworICAgICAgICAgICAgICAgIF9hY2NfcHJlcGFyZUxpbmVSZWFkZXIoYWNjLCBTVEFURV9SRUFEX0JBTk5FUl8xKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVBRF9CQU5ORVJfMTogLyogcmVhZGluZyB0aGUgZmlyc3QgYmFubmVyIGxpbmUgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IGFzeW5jTGluZVJlYWRlcl9yZWFkKGFjYy0+bHJlYWRlcik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFTWU5DX0VSUk9SKQorICAgICAgICAgICAgICAgIGdvdG8gU0VUX0VSUk9SOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFTWU5DX0NPTVBMRVRFKSB7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCBmaXJzdCBsaW5lIHN0YXJ0cyB3aXRoICJBbmRyb2lkIENvbnNvbGU6IiwKKyAgICAgICAgICAgICAgICAgKiBvdGhlcndpc2Ugd2UncmUgbm90IHRhbGtpbmcgdG8gdGhlIHJpZ2h0IHByb2dyYW0uICovCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGluZSA9IGFzeW5jTGluZVJlYWRlcl9nZXRMaW5lKGFjYy0+bHJlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCB8fCBtZW1jbXAobGluZSwgIkFuZHJvaWQgQ29uc29sZToiLCAxNikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBCQURfQkFOTkVSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBvaywgZmluZSwgcHJlcGFyZSBmb3IgdGhlIG5leHQgYmFubmVyIGxpbmUgdGhlbiAqLworICAgICAgICAgICAgICAgIF9hY2NfcHJlcGFyZUxpbmVSZWFkZXIoYWNjLCBTVEFURV9SRUFEX0JBTk5FUl8yKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVBRF9CQU5ORVJfMjogLyogcmVhZGluZyB0aGUgc2Vjb25kIGJhbm5lciBsaW5lICovCisgICAgICAgICAgICBzdGF0dXMgPSBhc3luY0xpbmVSZWFkZXJfcmVhZChhY2MtPmxyZWFkZXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19FUlJPUikKKyAgICAgICAgICAgICAgICBnb3RvIFNFVF9FUlJPUjsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19DT01QTEVURSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpbmUgPSBhc3luY0xpbmVSZWFkZXJfZ2V0TGluZShhY2MtPmxyZWFkZXIpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBCQURfQkFOTkVSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBvaywgd2UncmUgZG9uZSAhKi8KKyAgICAgICAgICAgICAgICBhY2MtPnN0YXRlID0gU1RBVEVfQ09NUExFVEU7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFTWU5DX0NPTVBMRVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9DT01QTEVURToKKyAgICAgICAgICAgIHN0YXR1cyA9IEFTWU5DX0NPTVBMRVRFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorQkFEX0JBTk5FUjoKKyAgICBlcnJubyA9IEVOT1BST1RPT1BUOworU0VUX0VSUk9SOgorICAgIGFjYy0+c3RhdGUgPSBTVEFURV9FUlJPUjsKKyAgICBhY2MtPmVycm9yID0gZXJybm87CisgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FzeW5jLWNvbnNvbGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1jb25zb2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1jb25zb2xlLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9hc3luYy11dGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogQW4gQXN5bmNDb25zb2xlQ29ubmVjdG9yIGFsbG93cyB5b3UgdG8gYXN5bmNocm9ub3VzbHkgY29ubmVjdCB0byBhbgorICogQW5kcm9pZCBjb25zb2xlIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgICAgIHN0YXRlOworICAgIGludCAgICAgICAgICAgICAgZXJyb3I7CisgICAgTG9vcElvKiAgICAgICAgICBpbzsKKyAgICBTb2NrQWRkcmVzcyAgICAgIGFkZHJlc3M7CisgICAgQXN5bmNDb25uZWN0b3IgICBjb25uZWN0b3JbMV07CisgICAgQXN5bmNMaW5lUmVhZGVyICBscmVhZGVyWzFdOworICAgIHVpbnQ4X3QgICAgICAgICAgbGJ1ZmZbMTI4XTsKK30gQXN5bmNDb25zb2xlQ29ubmVjdG9yOworCisvKiBJbml0aWFsaXplIHRoZSBjb25zb2xlIGNvbm5lY3Rvci4gVGhpcyBhdHRlbXB0cyB0byBjb25uZWN0IHRvIHRoZSBhZGRyZXNzCisgKiBwcm92aWRlZCB0aHJvdWdoICdpbycuIFVzZSBhc3luY0NvbnNvbGVDb25uZWN0X3J1bigpIGFmdGVyIHRoYXQuCisgKi8KK0FzeW5jU3RhdHVzCithc3luY0NvbnNvbGVDb25uZWN0b3JfY29ubmVjdChBc3luY0NvbnNvbGVDb25uZWN0b3IqIGFjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzKiAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICAgICAgICAgICAgaW8pOworCisvKiBBc3luY2hyb25vdXMgY29uc29sZSBjb25uZWN0aW9uIG1hbmFnZW1lbnQuIFJldHVybnM6CisgKgorICogQVNZTkNfQ09NUExFVEU6CisgKiAgICBDb25uZWN0aW9uIHdhcyBjb21wbGV0ZSwgYW5kIHRoZSBjb25zb2xlIGJhbm5lciB3YXMgcHJvcGVybHkgcmVhZC9lYXRlbi4KKyAqICAgIHlvdSBjYW4gbm93IHNlbmQvd3JpdGUgY29tbWFuZHMgdGhyb3VnaCB0aGUgY29uc29sZSB3aXRoICdpbycuCisgKgorICogQVNZTkNfRVJST1I6CisgKiAgICBBbiBlcnJvciBvY2N1cmVkLCBlaXRoZXIgZHVyaW5nIHRoZSBjb25uZWN0aW9uIGl0c2VsZiwgb3Igd2hlbgorICogICAgcmVhZGluZyB0aGUgY29udGVudC4gVGhpcyBzZXRzIGVycm5vIHRvIEVOT1BST1RPT1BUIGlmIHRoZSBjb25uZWN0b3IKKyAqICAgIGRldGVjdHMgdGhhdCB5b3UncmUgbm90IGNvbm5lY3RlZCB0byBhIHByb3BlciBBbmRyb2lkIGVtdWxhdG9yIGNvbnNvbGUKKyAqICAgIHBvcnQgKGkuZS4gaWYgdGhlIGJhbm5lciB3YXMgaW5jb3JyZWN0KS4gT3RoZXIgZXJyb3JzIGFyZSBwb3NzaWJsZQorICogICAgKGUuZy4gaW4gY2FzZSBvZiBlYXJseSBjb25uZWN0aW9uIHRlcm1pbmF0aW9uKS4KKyAqCisgKiBBU1lOQ19ORUVEX01PUkU6CisgKiAgICAgTm90IGVub3VnaCBkYXRhIHdhcyBleGNoYW5nZWQsIGNhbGwgdGhpcyBmdW5jdGlvbiBsYXRlci4KKyAqLworQXN5bmNTdGF0dXMKK2FzeW5jQ29uc29sZUNvbm5lY3Rvcl9ydW4oQXN5bmNDb25zb2xlQ29ubmVjdG9yKiBhY2MpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1pby1jb21tb24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1pby1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQ1MzhkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FzeW5jLWlvLWNvbW1vbi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyoKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBjb21tb24gZm9yIGFzeW5jaHJvbm91cyBzb2NrZXQgSS9PCisgKi8KKworLyogRW51bWVyYXRlcyBhc3luY2hyb25vdXMgSS9PIHN0YXRlcy4KKyAqIFZhbHVlcyBmcm9tIHRoaXMgZW51bSBhcmUgcGFzc2VkIHRvIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggYW4gSS9PLAorICogaW5kaWNhdGluZyBhdCB3aGF0IHN0YXRlIHRoZSBJL08gaXMuICovCit0eXBlZGVmIGVudW0gQXN5bmNJT1N0YXRlIHsKKyAgICAvKiBBc3luY2hyb25vdXMgSS9PIGhhcyBiZWVuIHF1ZXVlZC4gICAgICAgICAgICAgICAgKDApICovCisgICAgQVNJT19TVEFURV9RVUVVRUQsCisgICAgLyogQXN5bmNocm9ub3VzIEkvTyBoYXMgc3RhcnRlZC4gVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCBJL08gaGFzIGJlZW4KKyAgICAgKiBwZXJmb3JtZWQgZm9yIHRoZSBmaXJzdCB0aW1lLiAgICAgICAgICAgICAgICAgICAgKDEpICovCisgICAgQVNJT19TVEFURV9TVEFSVEVELAorICAgIC8qIEFzeW5jaHJvbm91cyBJL08gaXMgY29udGludWluZy4gVGhpcyBzdGF0ZSBpbmRpY2F0ZXMgdGhhdCBJL08gaGFzIGJlZW4KKyAgICAgKiBpbnZva2VkIGZvciB0aGUgc2Vjb25kIChvciBtb3JlKSB0aW1lLiAgICAgICAgICAgKDIpICovCisgICAgQVNJT19TVEFURV9DT05USU5VRVMsCisgICAgLyogQXN5bmNocm9ub3VzIEkvTyBpcyBhYm91dCB0byBiZSByZXRyaWVkLiAgICAgICAgICgzKSAqLworICAgIEFTSU9fU1RBVEVfUkVUUllJTkcsCisgICAgLyogQXN5bmNocm9ub3VzIEkvTyBoYXMgYmVlbiBzdWNjZXNzZnVseSBjb21wbGV0ZWQuICg0KSAqLworICAgIEFTSU9fU1RBVEVfU1VDQ0VFREVELAorICAgIC8qIEFzeW5jaHJvbm91cyBJL08gaGFzIGZhaWxlZC4gICAgICAgICAgICAgICAgICAgICAoNSkgKi8KKyAgICBBU0lPX1NUQVRFX0ZBSUxFRCwKKyAgICAvKiBBc3luY2hyb25vdXMgSS9PIGhhcyB0aW1lZCBvdXQuICAgICAgICAgICAgICAgICAgKDYpICovCisgICAgQVNJT19TVEFURV9USU1FRF9PVVQsCisgICAgLyogQXN5bmNocm9ub3VzIEkvTyBoYXMgYmVlbiBjYW5jZWxsZWQgKGR1ZSB0byBkaXNjb25uZWN0LCBmb3IKKyAgICAgKiBpbnN0YW5jZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpICovCisgICAgQVNJT19TVEFURV9DQU5DRUxMRUQsCisgICAgLyogQXN5bmNocm9ub3VzIEkvTyBpcyBmaW5pc2hlZCBhbmQgaXMgYWJvdXQgdG8gYmUgZGlzY2FyZGVyLiBUaGlzIHN0YXRlIGlzCisgICAgICogdXNlZnVsIGluIGNhc2UgdGhlcmUgaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhbiBJL08gYW5kIHNvbWUgY2xpZW50J3MKKyAgICAgKiBjb21wb25lbnQsIHRoYXQgaG9sZHMgYSByZWZlcmVuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSS9PLiBXaGVuIGNhbGxiYWNrCisgICAgICogaXMgaW52b2tlZCB3aXRoIHRoaXMgc3RhdGUsIGl0IG1lYW5zIHRoYXQgaXQncyBzYWZlIHRvIGRyb3AgdGhhdCBleHRyYQorICAgICAqIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIEkvTyAgICAgICAgICAgICAgICAoOCkgKi8KKyAgICBBU0lPX1NUQVRFX0ZJTklTSEVELAorfSBBc3luY0lPU3RhdGU7CisKKy8qIEVudW1lcmF0ZXMgYWN0aW9ucyB0byBwZXJmb3JtIHdpdGggYW4gSS9PIG9uIHN0YXRlIHRyYW5zaXRpb24uCisgKiBWYWx1ZXMgZnJvbSB0aGlzIGVudW0gYXJlIHJldHVybmVkIGZyb20gYXN5bmMgSS9PIGNhbGxiYWNrcywgaW5kaWNhdGluZyB3aGF0CisgKiBhY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBJL08gYnkgSS9PIGhhbmRsZXIuICovCit0eXBlZGVmIGVudW0gQXN5bmNJT0FjdGlvbiB7CisgICAgLyogSS9PIGlzIGRvbmUuIFBlcmZvcm0gZGVmYXVsdCBhY3Rpb24gZGVwZW5kaW5nIG9uIEkvTyB0eXBlLiAqLworICAgIEFTSU9fQUNUSU9OX0RPTkUsCisgICAgLyogQWJvcnQgdGhlIEkvTy4gKi8KKyAgICBBU0lPX0FDVElPTl9BQk9SVCwKKyAgICAvKiBSZXRyeSB0aGUgSS9PLiAqLworICAgIEFTSU9fQUNUSU9OX1JFVFJZLAorfSBBc3luY0lPQWN0aW9uOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1zb2NrZXQtY29ubmVjdG9yLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtc29ja2V0LWNvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTk5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtc29ja2V0LWNvbm5lY3Rvci5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEVuY2Fwc3VsYXRlcyBleGNoYW5nZSBwcm90b2NvbCBiZXR3ZWVuIHRoZSBlbXVsYXRvciwgYW5kIGFuIEFuZHJvaWQgZGV2aWNlCisgKiB0aGF0IGlzIGNvbm5lY3RlZCB0byB0aGUgaG9zdCB2aWEgVVNCLiBUaGUgY29tbXVuaWNhdGlvbiBpcyBlc3RhYmxpc2hlZCBvdmVyCisgKiBhIFRDUCBwb3J0IGZvcndhcmRpbmcsIGVuYWJsZWQgYnkgQURCLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2FzeW5jLXNvY2tldC1jb25uZWN0b3IuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYW5pYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgIEUoLi4uKSAgICBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lICBXKC4uLikgICAgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lICBEKC4uLikgICAgVkVSQk9TRV9QUklOVChhc2Nvbm5lY3RvcixfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKGFzY29ubmVjdG9yKQorCisjZGVmaW5lIFRSQUNFX09OICAgIDAKKworI2lmIFRSQUNFX09OCisjZGVmaW5lICBUKC4uLikgICAgVkVSQk9TRV9QUklOVChhc2Nvbm5lY3RvcixfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBUKC4uLikKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQXN5bmNTb2NrZXRDb25uZWN0b3IgeworICAgIC8qIFRDUCBhZGRyZXNzIGZvciB0aGUgY29ubmVjdGlvbi4gKi8KKyAgICBTb2NrQWRkcmVzcyAgICAgYWRkcmVzczsKKyAgICAvKiBJL08gbG9vcGVyIGZvciBhc3luY2hyb25vdXMgSS9PLiAqLworICAgIExvb3BlciogICAgICAgICBsb29wZXI7CisgICAgLyogSS9PIHBvcnQgZm9yIGFzeW5jaHJvbm91cyBjb25uZWN0aW9uLiAqLworICAgIExvb3BJbyogICAgICAgICBjb25uZWN0b3JfaW87CisgICAgLyogVGltZXIgdGhhdCBpcyB1c2VkIHRvIHJldHJ5IGFzeW5jaHJvbm91cyBjb25uZWN0aW9ucy4gKi8KKyAgICBMb29wVGltZXIqICAgICAgY29ubmVjdG9yX3RpbWVyOworICAgIC8qIEFzeW5jaHJvbm91cyBjb25uZWN0b3IgdG8gdGhlIHNvY2tldC4gKi8KKyAgICBBc3luY0Nvbm5lY3RvciAgY29ubmVjdG9yWzFdOworICAgIC8qIENhbGxiYWNrIHRvIGludm9rZSBvbiBjb25uZWN0aW9uIGV2ZW50cy4gKi8KKyAgICBhc2NfZXZlbnRfY2IgICAgb25fY29ubmVjdGVkX2NiOworICAgIC8qIEFuIG9wYXF1ZSBwYXJhbWV0ZXIgdG8gcGFzcyB0byB0aGUgY29ubmVjdGlvbiBjYWxsYmFjay4gKi8KKyAgICB2b2lkKiAgICAgICAgICAgb25fY29ubmVjdGVkX2NiX29wYXF1ZTsKKyAgICAvKiBSZXRyeSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gKi8KKyAgICBpbnQgICAgICAgICAgICAgcmV0cnlfdG87CisgICAgLyogU29ja2V0IGRlc2NyaXB0b3IgZm9yIHRoZSBjb25uZWN0aW9uLiAqLworICAgIGludCAgICAgICAgICAgICBmZDsKKyAgICAvKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgY29ubmVjdG9yLiAqLworICAgIGludCAgICAgICAgICAgICByZWZfY291bnQ7CisgICAgLyogRmxhZ3Mgd2hldGhlciAoMSkgb3Igbm90ICgwKSBjb25uZWN0b3Igb3ducyB0aGUgbG9vcGVyLiAqLworICAgIGludCAgICAgICAgICAgICBvd25zX2xvb3BlcjsKK307CisKKy8qIEFzeW5jaHJvbm91cyBJL08gbG9vcGVyIGNhbGxiYWNrIGludm9rZWQgYnkgdGhlIGNvbm5lY3Rvci4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIEFzeW5jU29ja2V0Q29ubmVjdG9yIGluc3RhbmNlLgorICogIGZkLCBldmVudHMgLSBTdGFuZGFyZCBJL08gY2FsbGJhY2sgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQgX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfaW8odm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cyk7CisKKy8qIEdldHMgc29ja2V0J3MgYWRkcmVzcyBzdHJpbmcuICovCitBSU5MSU5FRCBjb25zdCBjaGFyKgorX2FzY19zb2NrZXRfc3RyaW5nKEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpCit7CisgICAgcmV0dXJuIHNvY2tfYWRkcmVzc190b19zdHJpbmcoJmNvbm5lY3Rvci0+YWRkcmVzcyk7Cit9CisKKy8qIERlc3Ryb3lzIEFzeW5jU29ja2V0Q29ubmVjdG9yIGluc3RhbmNlLgorICogUGFyYW06CisgKiAgY29ubmVjdG9yIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXRDb25uZWN0b3IgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyB2b2lkCitfYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9mcmVlKEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpCit7CisgICAgaWYgKGNvbm5lY3RvciAhPSBOVUxMKSB7CisgICAgICAgIFQoIkFTQyAlczogQ29ubmVjdG9yIGlzIGRlc3Ryb3lpbmcuLi4iLCBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSk7CisKKyAgICAgICAgLyogU3RvcCBhbGwgYWN0aXZpdGllcy4gKi8KKyAgICAgICAgaWYgKGFzeW5jQ29ubmVjdG9yX3N0b3AoY29ubmVjdG9yLT5jb25uZWN0b3IpID09IDApIHsKKyAgICAgICAgICAgIC8qIENvbm5lY3Rpb24gd2FzIGluIHByb2dyZXNzLiBXZSBuZWVkIHRvIGRlc3Ryb3kgSS9PIGRlc2NyaXB0b3IgZm9yCisgICAgICAgICAgICAgKiB0aGF0IGNvbm5lY3Rpb24uICovCisgICAgICAgICAgICBEKCJBU0MgJXM6IFN0b3BwZWQgYXN5bmMgY29ubmVjdGlvbiBpbiBwcm9ncmVzcy4iLAorICAgICAgICAgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSk7CisgICAgICAgICAgICBsb29wSW9fZnJlZShjb25uZWN0b3ItPmNvbm5lY3Rvcl9pbyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMuICovCisgICAgICAgIGlmIChjb25uZWN0b3ItPmxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBsb29wVGltZXJfZnJlZShjb25uZWN0b3ItPmNvbm5lY3Rvcl90aW1lcik7CisgICAgICAgICAgICBpZiAoY29ubmVjdG9yLT5vd25zX2xvb3BlcikgeworICAgICAgICAgICAgICAgIGxvb3Blcl9mcmVlKGNvbm5lY3Rvci0+bG9vcGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25uZWN0b3ItPmZkID49IDApIHsKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShjb25uZWN0b3ItPmZkKTsKKyAgICAgICAgfQorCisgICAgICAgIFQoIkFTQyAlczogQ29ubmVjdG9yIGlzIGRlc3Ryb3llZCIsIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpKTsKKworICAgICAgICBzb2NrX2FkZHJlc3NfZG9uZSgmY29ubmVjdG9yLT5hZGRyZXNzKTsKKworICAgICAgICBBRlJFRShjb25uZWN0b3IpOworICAgIH0KK30KKworLyogT3BlbnMgY29ubmVjdGlvbiBzb2NrZXQuCisgKiBQYXJhbToKKyAqICBjb25uZWN0b3IgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK19hc3luY19zb2NrZXRfY29ubmVjdG9yX29wZW5fc29ja2V0KEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpCit7CisgICAgLyogT3BlbiBzb2NrZXQuICovCisgICAgY29ubmVjdG9yLT5mZCA9IHNvY2tldF9jcmVhdGVfaW5ldChTT0NLRVRfU1RSRUFNKTsKKyAgICBpZiAoY29ubmVjdG9yLT5mZCA8IDApIHsKKyAgICAgICAgRCgiQVNDICVzOiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldDogJWQgLT4gJXMiLAorICAgICAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFByZXBhcmUgZm9yIGFzeW5jIEkvTyBvbiB0aGUgY29ubmVjdG9yLiAqLworICAgIHNvY2tldF9zZXRfbm9uYmxvY2soY29ubmVjdG9yLT5mZCk7CisKKyAgICBUKCJBU0MgJXM6IENvbm5lY3RvciBzb2NrZXQgaXMgb3BlbmVkIHdpdGggRkQgPSAlZCIsCisgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSwgY29ubmVjdG9yLT5mZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogQ2xvc2VzIGNvbm5lY3Rpb24gc29ja2V0LgorICogUGFyYW06CisgKiAgY29ubmVjdG9yIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXRDb25uZWN0b3IgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgdm9pZAorX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfY2xvc2Vfc29ja2V0KEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpCit7CisgICAgaWYgKGNvbm5lY3Rvci0+ZmQgPj0gMCkgeworICAgICAgICBzb2NrZXRfY2xvc2UoY29ubmVjdG9yLT5mZCk7CisgICAgICAgIFQoIkFTQyAlczogQ29ubmVjdG9yIHNvY2tldCBGRCA9ICVkIGlzIGNsb3NlZC4iLAorICAgICAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBjb25uZWN0b3ItPmZkKTsKKyAgICAgICAgY29ubmVjdG9yLT5mZCA9IC0xOworICAgIH0KK30KKworLyogQXN5bmNocm9ub3VzIGNvbm5lY3RvciAoQXN5bmNDb25uZWN0b3IgaW5zdGFuY2UpIGhhcyBjb21wbGV0ZWQgY29ubmVjdGlvbgorICogIGF0dGVtcHQuCisgKiBQYXJhbToKKyAqICBjb25uZWN0b3IgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4gTm90ZTogV2hlbiB0aGlzCisgKiAgICAgIGNhbGxiYWNrIGlzIGNhbGxlZCwgdGhlIGNhbGxlciBoYXMgcmVmZXJlbmNlZCBwYXNzZWQgY29ubmVjdG9yIG9iamVjdCwKKyAqICAgICAgU28sIGl0J3MgZ3VhcmFudGVlZCB0aGF0IHRoaXMgY29ubmVjdG9yIGlzIG5vdCBnb2luZyB0byBiZSBkZXN0cm95ZWQKKyAqICAgICAgd2hpbGUgdGhpcyByb3V0aW5lIGV4ZWN1dGVzLgorICogIHN0YXR1cyAtIFN0YXR1cyBvZiB0aGUgY29ubmVjdGlvbiBhdHRlbXB0LgorICovCitzdGF0aWMgdm9pZAorX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfY29ubmVjdGluZyhBc3luY1NvY2tldENvbm5lY3RvciogY29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1N0YXR1cyBzdGF0dXMpCit7CisgICAgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPSBBU0lPX0FDVElPTl9ET05FOworCisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU1lOQ19DT01QTEVURToKKyAgICAgICAgICAgIGxvb3BJb19mcmVlKGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lvKTsKKyAgICAgICAgICAgIEQoIlNvY2tldCAnJXMnIGlzIGNvbm5lY3RlZCIsIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpKTsKKyAgICAgICAgICAgIC8qIEludm9rZSAib24gY29ubmVjdGVkIiBjYWxsYmFjayAqLworICAgICAgICAgICAgYWN0aW9uID0gY29ubmVjdG9yLT5vbl9jb25uZWN0ZWRfY2IoY29ubmVjdG9yLT5vbl9jb25uZWN0ZWRfY2Jfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLCBBU0lPX1NUQVRFX1NVQ0NFRURFRCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTWU5DX0VSUk9SOgorICAgICAgICAgICAgbG9vcElvX2ZyZWUoY29ubmVjdG9yLT5jb25uZWN0b3JfaW8pOworICAgICAgICAgICAgRCgiRXJyb3Igd2hpbGUgY29ubmVjdGluZyB0byBzb2NrZXQgJyVzJzogJWQgLT4gJXMiLAorICAgICAgICAgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAvKiBJbnZva2UgIm9uIGNvbm5lY3RlZCIgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIGFjdGlvbiA9IGNvbm5lY3Rvci0+b25fY29ubmVjdGVkX2NiKGNvbm5lY3Rvci0+b25fY29ubmVjdGVkX2NiX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciwgQVNJT19TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBU1lOQ19ORUVEX01PUkU6CisgICAgICAgICAgICBUKCJBU0MgJXM6IFdhaXRpbmcgb24gY29ubmVjdGlvbiB0byBjb21wbGV0ZS4gQ29ubmVjdG9yIEZEID0gJWQiLAorICAgICAgICAgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSwgY29ubmVjdG9yLT5mZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9SRVRSWSkgeworICAgICAgICBEKCJBU0MgJXM6IFJldHJ5aW5nIGNvbm5lY3Rpb24uIENvbm5lY3RvciBGRCA9ICVkIiwKKyAgICAgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSwgY29ubmVjdG9yLT5mZCk7CisgICAgICAgIGxvb3BUaW1lcl9zdGFydFJlbGF0aXZlKGNvbm5lY3Rvci0+Y29ubmVjdG9yX3RpbWVyLCBjb25uZWN0b3ItPnJldHJ5X3RvKTsKKyAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9BQk9SVCkgeworICAgICAgICBEKCJBU0MgJXM6IENsaWVudCBoYXMgYWJvcnRlZCBjb25uZWN0aW9uLiBDb25uZWN0b3IgRkQgPSAlZCIsCisgICAgICAgICAgX2FzY19zb2NrZXRfc3RyaW5nKGNvbm5lY3RvciksIGNvbm5lY3Rvci0+ZmQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19vbl9hc3luY19zb2NrZXRfY29ubmVjdG9yX2lvKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpCit7CisgICAgQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbnN0IGNvbm5lY3RvciA9IChBc3luY1NvY2tldENvbm5lY3Rvciopb3BhcXVlOworCisgICAgLyogUmVmZXJlbmNlIHRoZSBjb25uZWN0b3Igd2hpbGUgd2UncmUgaGFuZGluZyBJL08uICovCisgICAgYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9yZWZlcmVuY2UoY29ubmVjdG9yKTsKKworICAgIC8qIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQgYW5vdGhlciBjb25uZWN0aW9uIGF0dGVtcHQgaXMgYWJvdXQgdG8gc3RhcnQuICovCisgICAgY29uc3QgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPQorICAgICAgICBjb25uZWN0b3ItPm9uX2Nvbm5lY3RlZF9jYihjb25uZWN0b3ItPm9uX2Nvbm5lY3RlZF9jYl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciwgQVNJT19TVEFURV9DT05USU5VRVMpOworICAgIGlmIChhY3Rpb24gIT0gQVNJT19BQ1RJT05fQUJPUlQpIHsKKyAgICAgICAgLyogQ29tcGxldGUgc29ja2V0IGNvbm5lY3Rpb24uICovCisgICAgICAgIGNvbnN0IEFzeW5jU3RhdHVzIHN0YXR1cyA9IGFzeW5jQ29ubmVjdG9yX3J1bihjb25uZWN0b3ItPmNvbm5lY3Rvcik7CisgICAgICAgIF9vbl9hc3luY19zb2NrZXRfY29ubmVjdG9yX2Nvbm5lY3RpbmcoY29ubmVjdG9yLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoIkFTQyAlczogQ2xpZW50IGhhcyBhYm9ydGVkIGNvbm5lY3Rpb24uIENvbm5lY3RvciBGRCA9ICVkIiwKKyAgICAgICAgICBfYXNjX3NvY2tldF9zdHJpbmcoY29ubmVjdG9yKSwgY29ubmVjdG9yLT5mZCk7CisgICAgfQorCisgICAgLyogUmVsZWFzZSB0aGUgY29ubmVjdG9yIGFmdGVyIHdlJ3JlIGRvbmUgd2l0aCBoYW5kaW5nIEkvTy4gKi8KKyAgICBhc3luY19zb2NrZXRfY29ubmVjdG9yX3JlbGVhc2UoY29ubmVjdG9yKTsKK30KKworLyogUmV0cnkgY29ubmVjdGlvbiB0aW1lciBjYWxsYmFjay4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIEFzeW5jU29ja2V0Q29ubmVjdG9yIGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZAorX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfcmV0cnkodm9pZCogb3BhcXVlLCBMb29wVGltZXIqIHRpbWVyKQoreworICAgIEFzeW5jU3RhdHVzIHN0YXR1czsKKyAgICBBc3luY1NvY2tldENvbm5lY3RvciogY29uc3QgY29ubmVjdG9yID0gKEFzeW5jU29ja2V0Q29ubmVjdG9yKilvcGFxdWU7CisKKyAgICBUKCJBU0MgJXM6IFJlY29ubmVjdCB0aW1lciBleHBpcmVkLiBDb25uZWN0b3IgRkQgPSAlZCIsCisgICAgICAgICAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBjb25uZWN0b3ItPmZkKTsKKworICAgIC8qIFJlZmVyZW5jZSB0aGUgY29ubmVjdG9yIHdoaWxlIHdlJ3JlIGluIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfcmVmZXJlbmNlKGNvbm5lY3Rvcik7CisKKyAgICAvKiBJbnZva2UgdGhlIGNhbGxiYWNrIHRvIG5vdGlmeSBhYm91dCBhIGNvbm5lY3Rpb24gcmV0cnkgYXR0ZW1wdC4gKi8KKyAgICBBc3luY0lPQWN0aW9uIGFjdGlvbiA9CisgICAgICAgIGNvbm5lY3Rvci0+b25fY29ubmVjdGVkX2NiKGNvbm5lY3Rvci0+b25fY29ubmVjdGVkX2NiX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLCBBU0lPX1NUQVRFX1JFVFJZSU5HKTsKKworICAgIGlmIChhY3Rpb24gIT0gQVNJT19BQ1RJT05fQUJPUlQpIHsKKyAgICAgICAgLyogQ2xvc2UgaGFuZGxlIG9wZW5lZCBmb3IgdGhlIHByZXZpb3VzIChmYWlsZWQpIGF0dGVtcHQuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfY29ubmVjdG9yX2Nsb3NlX3NvY2tldChjb25uZWN0b3IpOworCisgICAgICAgIC8qIFJldHJ5IGNvbm5lY3Rpb24gYXR0ZW1wdC4gKi8KKyAgICAgICAgaWYgKF9hc3luY19zb2NrZXRfY29ubmVjdG9yX29wZW5fc29ja2V0KGNvbm5lY3RvcikgPT0gMCkgeworICAgICAgICAgICAgY29ubmVjdG9yLT5jb25uZWN0b3JfaW8gPSBsb29wSW9fbmV3KGNvbm5lY3Rvci0+bG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGFzeW5jQ29ubmVjdG9yX2luaXQoY29ubmVjdG9yLT5jb25uZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25uZWN0b3ItPmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEFTWU5DX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfY29ubmVjdGluZyhjb25uZWN0b3IsIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRCgiQVNDICVzOiBDbGllbnQgaGFzIGFib3J0ZWQgY29ubmVjdGlvbi4gQ29ubmVjdG9yIEZEID0gJWQiLAorICAgICAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBjb25uZWN0b3ItPmZkKTsKKyAgICB9CisKKyAgICAvKiBSZWxlYXNlIHRoZSBjb25uZWN0b3IgYWZ0ZXIgd2UncmUgZG9uZSB3aXRoIHRoZSBjYWxsYmFjay4gKi8KKyAgICBhc3luY19zb2NrZXRfY29ubmVjdG9yX3JlbGVhc2UoY29ubmVjdG9yKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgQXN5bmMgY29ubmVjdG9yIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQXN5bmNTb2NrZXRDb25uZWN0b3IqCithc3luY19zb2NrZXRfY29ubmVjdG9yX25ldyhjb25zdCBTb2NrQWRkcmVzcyogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXRyeV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY19ldmVudF9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BlciogbG9vcGVyKQoreworICAgIEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3I7CisKKyAgICBpZiAoY2IgPT0gTlVMTCkgeworICAgICAgICBXKCJObyBjYWxsYmFjayBmb3IgQXN5bmNTb2NrZXRDb25uZWN0b3IgZm9yIHNvY2tldCAnJXMnIiwKKyAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKGFkZHJlc3MpKTsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFORVcwKGNvbm5lY3Rvcik7CisKKyAgICBjb25uZWN0b3ItPmZkID0gLTE7CisgICAgY29ubmVjdG9yLT5yZXRyeV90byA9IHJldHJ5X3RvOworICAgIGNvbm5lY3Rvci0+b25fY29ubmVjdGVkX2NiID0gY2I7CisgICAgY29ubmVjdG9yLT5vbl9jb25uZWN0ZWRfY2Jfb3BhcXVlID0gY2Jfb3BhcXVlOworICAgIGNvbm5lY3Rvci0+cmVmX2NvdW50ID0gMTsKKworICAgIC8qIENvcHkgc29ja2V0IGFkZHJlc3MuICovCisjaWZkZWYgX1dJTjMyCisgICAgY29ubmVjdG9yLT5hZGRyZXNzID0gKmFkZHJlc3M7CisjZWxzZQorICAgIGlmIChzb2NrX2FkZHJlc3NfZ2V0X2ZhbWlseShhZGRyZXNzKSA9PSBTT0NLRVRfVU5JWCkgeworICAgICAgICBzb2NrX2FkZHJlc3NfaW5pdF91bml4KCZjb25uZWN0b3ItPmFkZHJlc3MsIHNvY2tfYWRkcmVzc19nZXRfcGF0aChhZGRyZXNzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdG9yLT5hZGRyZXNzID0gKmFkZHJlc3M7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBDcmVhdGUgYSBsb29wZXIgZm9yIGFzeW5jaHJvbm91cyBJL08uICovCisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIGNvbm5lY3Rvci0+bG9vcGVyID0gbG9vcGVyX25ld0dlbmVyaWMoKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rvci0+bG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEUoIlVuYWJsZSB0byBjcmVhdGUgSS9PIGxvb3BlciBmb3IgQXN5bmNTb2NrZXRDb25uZWN0b3IgZm9yIHNvY2tldCAnJXMnIiwKKyAgICAgICAgICAgICAgX2FzY19zb2NrZXRfc3RyaW5nKGNvbm5lY3RvcikpOworICAgICAgICAgICAgY2IoY2Jfb3BhcXVlLCBjb25uZWN0b3IsIEFTSU9fU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgIF9hc3luY19zb2NrZXRfY29ubmVjdG9yX2ZyZWUoY29ubmVjdG9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNvbm5lY3Rvci0+b3duc19sb29wZXIgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rvci0+bG9vcGVyID0gbG9vcGVyOworICAgICAgICBjb25uZWN0b3ItPm93bnNfbG9vcGVyID0gMDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSB0aW1lciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY29ubmVjdGlvbiByZXRyaWVzLiAqLworICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX3RpbWVyID0gbG9vcFRpbWVyX25ldygKKyAgICAgICAgICAgIGNvbm5lY3Rvci0+bG9vcGVyLAorICAgICAgICAgICAgX29uX2FzeW5jX3NvY2tldF9jb25uZWN0b3JfcmV0cnksCisgICAgICAgICAgICBjb25uZWN0b3IpOworCisgICAgVCgiQVNDICVzOiBOZXcgY29ubmVjdG9yIG9iamVjdCIsIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpKTsKKworICAgIHJldHVybiBjb25uZWN0b3I7Cit9CisKK2ludAorYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9yZWZlcmVuY2UoQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbm5lY3RvcikKK3sKKyAgICBhc3NlcnQoY29ubmVjdG9yLT5yZWZfY291bnQgPiAwKTsKKyAgICBjb25uZWN0b3ItPnJlZl9jb3VudCsrOworICAgIHJldHVybiBjb25uZWN0b3ItPnJlZl9jb3VudDsKK30KKworaW50Cithc3luY19zb2NrZXRfY29ubmVjdG9yX3JlbGVhc2UoQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbm5lY3RvcikKK3sKKyAgICBhc3NlcnQoY29ubmVjdG9yLT5yZWZfY291bnQgPiAwKTsKKyAgICBjb25uZWN0b3ItPnJlZl9jb3VudC0tOworICAgIGlmIChjb25uZWN0b3ItPnJlZl9jb3VudCA9PSAwKSB7CisgICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGhhcyBiZWVuIGRyb3BwZWQuIERlc3Ryb3kgdGhpcyBvYmplY3QuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfY29ubmVjdG9yX2ZyZWUoY29ubmVjdG9yKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBjb25uZWN0b3ItPnJlZl9jb3VudDsKK30KKwordm9pZAorYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9jb25uZWN0KEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpCit7CisgICAgQXN5bmNTdGF0dXMgc3RhdHVzOworCisgICAgVCgiQVNDICVzOiBIYW5kbGluZyBjb25uZWN0IHJlcXVlc3QuIENvbm5lY3RvciBGRCA9ICVkIiwKKyAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBjb25uZWN0b3ItPmZkKTsKKworICAgIGlmIChfYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9vcGVuX3NvY2tldChjb25uZWN0b3IpID09IDApIHsKKyAgICAgICAgY29uc3QgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPQorICAgICAgICAgICAgY29ubmVjdG9yLT5vbl9jb25uZWN0ZWRfY2IoY29ubmVjdG9yLT5vbl9jb25uZWN0ZWRfY2Jfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLCBBU0lPX1NUQVRFX1NUQVJURUQpOworICAgICAgICBpZiAoYWN0aW9uID09IEFTSU9fQUNUSU9OX0FCT1JUKSB7CisgICAgICAgICAgICBEKCJBU0MgJXM6IENsaWVudCBoYXMgYWJvcnRlZCBjb25uZWN0aW9uLiBDb25uZWN0b3IgRkQgPSAlZCIsCisgICAgICAgICAgICAgIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBjb25uZWN0b3ItPmZkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbm5lY3Rvci0+Y29ubmVjdG9yX2lvID0gbG9vcElvX25ldyhjb25uZWN0b3ItPmxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3ItPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9hc3luY19zb2NrZXRfY29ubmVjdG9yX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rvcik7CisgICAgICAgICAgICBzdGF0dXMgPSBhc3luY0Nvbm5lY3Rvcl9pbml0KGNvbm5lY3Rvci0+Y29ubmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29ubmVjdG9yLT5hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3ItPmNvbm5lY3Rvcl9pbyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBBU1lOQ19FUlJPUjsKKyAgICB9CisKKyAgICBfb25fYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9jb25uZWN0aW5nKGNvbm5lY3Rvciwgc3RhdHVzKTsKK30KKworaW50Cithc3luY19zb2NrZXRfY29ubmVjdG9yX3B1bGxfZmQoQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbm5lY3RvcikKK3sKKyAgICBjb25zdCBpbnQgZmQgPSBjb25uZWN0b3ItPmZkOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIGNvbm5lY3Rvci0+ZmQgPSAtMTsKKyAgICB9CisKKyAgICBUKCJBU0MgJXM6IENsaWVudCBoYXMgcHVsbGVkIGNvbm5lY3RvciBGRCAlZCIsIF9hc2Nfc29ja2V0X3N0cmluZyhjb25uZWN0b3IpLCBmZCk7CisKKyAgICByZXR1cm4gZmQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtc29ja2V0LWNvbm5lY3Rvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FzeW5jLXNvY2tldC1jb25uZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTUxY2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FzeW5jLXNvY2tldC1jb25uZWN0b3IuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9hc3luYy1pby1jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2FzeW5jLXV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKgorICogQ29udGFpbnMgZGVjbGFyYXRpb24gb2YgYW4gQVBJIHRoYXQgYWxsb3dzIGFzeW5jaHJvbm91cyBjb25uZWN0aW9uIHRvIGEKKyAqIHNvY2tldCB3aXRoIHJldHJpZXMuCisgKgorICogVGhlIHR5cGljYWwgdXNhZ2Ugb2YgdGhpcyBBUEkgaXMgYXMgc3VjaDoKKyAqCisgKiAxLiBUaGUgY2xpZW50IGNyZWF0ZXMgYW4gYXN5bmNocm9ub3VzIGNvbm5lY3RvciBpbnN0YW5jZSBieSBjYWxsaW5nCisgKiAgICBhc3luY19zb2NrZXRfY29ubmVjdG9yX25ldyByb3V0aW5lLCBzdXBwbHlpbmcgdGhlcmUgYWRkcmVzcyBvZiB0aGUgc29ja2V0CisgKiAgICB0byBjb25uZWN0LCBhbmQgYSBjYWxsYmFjayB0byBpbnZva2Ugb24gY29ubmVjdGlvbiBldmVudHMuCisgKiAyLiBUaGUgY2xpZW50IHRoZW4gcHJvY2VlZHMgd2l0aCBjYWxsaW5nIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfY29ubmVjdCB0aGF0CisgKiAgICB3b3VsZCBpbml0aWF0ZSBjb25uZWN0aW9uIGF0dGVtcHRzLgorICoKKyAqIFRoZSBtYWluIGpvYiBvbiB0aGUgY2xpZW50IHNpZGUgZmFsbHMgb24gdGhlIGNsaWVudCdzIGNhbGxiYWNrIHJvdXRpbmUgdGhhdAorICogc2VydmVzIHRoZSBjb25uZWN0aW9uIGV2ZW50cy4gT25jZSBjb25uZWN0aW9uIGhhcyBiZWVuIGluaXRpYXRlZCwgdGhlIGNvbm5lY3RvcgorICogd2lsbCBpbnZva2UgdGhhdCBjYWxsYmFjayB0byByZXBvcnQgY3VycmVudCBjb25uZWN0aW9uIHN0YXR1cy4KKyAqCisgKiBJbiBnZW5lcmFsLCB0aGVyZSBhcmUgdGhyZWUgY29ubmVjdGlvbiBldmVudHMgcGFzc2VkIHRvIHRoZSBjYWxsYmFjazoKKyAqIDEuIFN1Y2Nlc3MuCisgKiAyLiBGYWlsdXJlLgorICogMy4gUmV0cnkuCisgKgorICogVHlwaWNhbGx5LCB3aGVuIGNsaWVudCdzIGNhbGxiYWNrIGlzIGNhbGxlZCBmb3IgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24sIHRoZQorICogY2xpZW50IHdpbGwgcHVsbCBjb25uZWN0ZWQgc29ja2V0J3MgRkQgZnJvbSB0aGUgY29ubmVjdG9yLCBhbmQgdGhlbiB0aGlzIEZECisgKiB3aWxsIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBmb3IgSS9PIG9uIHRoZSBjb25uZWN0ZWQgc29ja2V0LgorICoKKyAqIFdoZW4gY2xpZW50J3MgY2FsbGJhY2sgaXMgaW52b2tlZCB3aXRoIGFuIGVycm9yIChBU0lPX1NUQVRFX0ZBSUxFRCBldmVudCksIHRoZQorICogY2xpZW50IGhhcyBhbiBvcHBvcnR1bml0eSB0byByZXZpZXcgdGhlIGVycm9yIChhdmFpbGFibGUgaW4gJ2Vycm5vJyksIGFuZAorICogZWl0aGVyIGFib3J0IHRoZSBjb25uZWN0aW9uIGJ5IHJldHVybmluZyBBU0lPX0FDVElPTl9BQk9SVCwgb3Igc2NoZWR1bGUgYSByZXRyeQorICogYnkgcmV0dXJuaW5nIEFTSU9fQUNUSU9OX1JFVFJZIGZyb20gdGhlIGNhbGxiYWNrLiBJZiBjbGllbnQgcmV0dXJucyBBU0lPX0FDVElPTl9BQk9SVAorICogZnJvbSB0aGUgY2FsbGJhY2ssIHRoZSBjb25uZWN0b3Igd2lsbCBzdG9wIGNvbm5lY3Rpb24gYXR0ZW1wdHMsIGFuZCB3aWxsCisgKiBzZWxmLWRlc3RydWN0LiBJZiBBU0lPX0FDVElPTl9SRVRSWSBpcyByZXR1cm5lZCBmcm9tIHRoZSBjYWxsYmFjaywgdGhlIGNvbm5lY3RvcgorICogd2lsbCByZXRyeSBjb25uZWN0aW9uIGF0dGVtcHQgYWZ0ZXIgdGltZW91dCB0aGF0IHdhcyBzZXQgYnkgdGhlIGNhbGxlciBpbiB0aGUKKyAqIGNhbGwgdG8gYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9uZXcgcm91dGluZS4KKyAqCisgKiBXaGVuIGNsaWVudCdzIGNhbGxiYWNrIGlzIGludm9rZWQgd2l0aCBBU0lPX1NUQVRFX1JFVFJZSU5HIChpbmRpY2F0aW5nIHRoYXQKKyAqIGNvbm5lY3RvciBpcyBhYm91dCB0byByZXRyeSBhIGNvbm5lY3Rpb24gYXR0ZW1wdCksIHRoZSBjbGllbnQgaGFzIGFuIG9wcG9ydHVuaXR5CisgKiB0byBjYW5jZWwgZnVydGhlciBjb25uZWN0aW9uIGF0dGVtcHRzIGJ5IHJldHVybmluZyBBU0lPX0FDVElPTl9BQk9SVCwgb3IgaXQKKyAqIGNhbiBhbGxvdyBhbm90aGVyIGNvbm5lY3Rpb24gYXR0ZW1wdCBieSByZXR1cm5pbmcgQVNJT19BQ1RJT05fUkVUUlkuCisgKgorICogU2luY2UgaXQncyBoYXJkIHRvIGNvbnRyb2wgbGlmZXNwYW4gb2YgYW4gb2JqZWN0IGluIGFzeW5jaHJvbm91cyBlbnZpcm9ubWVudCwKKyAqIHdlIG1ha2UgQXN5bmNTb2NrZXRDb25uZWN0b3IgYSByZWZlcmVuY2VkIG9iamVjdCwgdGhhdCB3aWxsIHNlbGYtZGVzdHJ1Y3Qgd2hlbgorICogaXRzIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGxhc3QgY2xpZW50IGhhcworICogYWJhbmRvbmVkIHRoYXQgb2JqZWN0LgorICovCisKKy8qIERlY2xhcmVzIGFzeW5jIHNvY2tldCBjb25uZWN0b3IgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IEFzeW5jU29ja2V0Q29ubmVjdG9yIEFzeW5jU29ja2V0Q29ubmVjdG9yOworCisvKiBEZWNsYXJlcyBjYWxsYmFjayB0aGF0IGNvbm5lY3RvcidzIGNsaWVudCB1c2VzIHRvIG1vbml0b3IgY29ubmVjdGlvbgorICogc3RhdHVzIC8gcHJvZ3Jlc3MuCisgKiBQYXJhbToKKyAqICBvcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudC4KKyAqICBjb25uZWN0b3IgLSBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4KKyAqICBldmVudCAtIEV2ZW50IHRoYXQgaGFzIG9jY3VycmVkLiBJZiBldmVudCBpcyBzZXQgdG8gQVNJT19TVEFURV9GQUlMRUQsCisgKiAgICAgIGVycm5vIGNvbnRhaW5zIGNvbm5lY3Rpb24gZXJyb3IuCisgKiBSZXR1cm46CisgKiAgT25lIG9mIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCit0eXBlZGVmIEFzeW5jSU9BY3Rpb24gKCphc2NfZXZlbnRfY2IpKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbm5lY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIGV2ZW50KTsKKworLyogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgQXN5bmNTb2NrZXRDb25uZWN0b3IgaW5zdGFuY2UuCisgKiBOb3RlIHRoYXQgdXBvbiBleGl0IGZyb20gdGhpcyByb3V0aW5lIHRoZSByZWZlcmVuY2UgY291bnQgdG8gdGhlIHJldHVybmVkCisgKiBvYmplY3QgaXMgc2V0IHRvIDEuCisgKiBQYXJhbToKKyAqICBhZGRyZXNzIC0gSW5pdGlhbGl6ZWQgc29ja2V0IGFkZHJlc3MgdG8gY29ubmVjdCB0by4KKyAqICByZXRyeV90byAtIFRpbWVvdXQgdG8gcmV0cnkgYSBmYWlsZWQgY29ubmVjdGlvbiBhdHRlbXB0IGluIG1pbGxpc2Vjb25kcy4KKyAqICBjYiwgY2Jfb3BhcXVlIC0gQ2FsbGJhY2sgdG8gaW52b2tlIG9uIGNvbm5lY3Rpb24gZXZlbnRzLiBUaGlzIGNhbGxiYWNrIGlzCisgKiAgICAgIHJlcXVpcmVkLCBhbmQgbXVzdCBub3QgYmUgTlVMTC4KKyAqICBsb29wZXIgLSBBbiBvcHRpb25hbCAoY2FuIGJlIE5VTEwpIEkvTyBsb29wZXIgdG8gdXNlIGZvciBjb25uZWN0aW9uIEkvTy4gSWYKKyAqICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlIGNvbm5lY3RvciB3aWxsIGNyZWF0ZSBpdHMgb3duIGxvb3Blci4KKyAqIFJldHVybjoKKyAqICBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4gTm90ZSB0aGF0IEFzeW5jU29ja2V0Q29ubmVjdG9yCisgKiAgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIHJvdXRpbmUgd2lsbCBiZSBkZXN0cm95ZWQgYnkgdGhlIGNvbm5lY3RvciBpdHNlbGYsCisgKiAgd2hlbiBpdHMgd29yayBvbiBjb25uZWN0aW5nIHRvIHRoZSBzb2NrZXQgaXMgY29tcGxldGVkLiBUeXBpY2FsbHksIGNvbm5lY3RvcgorICogIHdpbGwgZGVzdHJveSBpdHMgZGVzY3JpcHRvciBhZnRlciBjbGllbnQncyBjYWxsYmFjayByb3V0aW5lIHJldHVybnMgd2l0aCBhCisgKiAgc3RhdHVzIG90aGVyIHRoYW4gQVNJT19BQ1RJT05fUkVUUlkuCisgKi8KK2V4dGVybiBBc3luY1NvY2tldENvbm5lY3RvciogYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9uZXcoY29uc3QgU29ja0FkZHJlc3MqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXRyeV90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjX2V2ZW50X2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BlciogbG9vcGVyKTsKKworLyogUmVmZXJlbmNlcyBBc3luY1NvY2tldENvbm5lY3RvciBvYmplY3QuCisgKiBQYXJhbToKKyAqICBjb25uZWN0b3IgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9jb25uZWN0b3JfcmVmZXJlbmNlKEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpOworCisvKiBSZWxlYXNlcyBBc3luY1NvY2tldENvbm5lY3RvciBvYmplY3QuCisgKiBOb3RlIHRoYXQgdXBvbiBleGl0IGZyb20gdGhpcyByb3V0aW5lIHRoZSBvYmplY3QgbWlnaHQgYmUgZGVzdHJveWVkLCBldmVuIGlmCisgKiB0aGUgcm91dGluZSByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gemVyby4KKyAqIFBhcmFtOgorICogIGNvbm5lY3RvciAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0Q29ubmVjdG9yIGluc3RhbmNlLgorICogUmV0dXJuOgorICogIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QuCisgKi8KK2V4dGVybiBpbnQgYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9yZWxlYXNlKEFzeW5jU29ja2V0Q29ubmVjdG9yKiBjb25uZWN0b3IpOworCisvKiBJbml0aWF0ZXMgYXN5bmNocm9ub3VzIGNvbm5lY3Rpb24uCisgKiBOb3RlIHRoYXQgY29ubmVjdGlvbiByZXN1bHQgd2lsbCBiZSByZXBvcnRlZCB2aWEgY2FsbGJhY2sgc2V0IHdpdGggdGhlIGNhbGwgdG8KKyAqIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfbmV3IHJvdXRpbmUuCisgKiBQYXJhbToKKyAqICBjb25uZWN0b3IgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMKKyAqICAgICAgY29ubmVjdG9yIGRlc2NyaXB0b3IgbWlnaHQgYmUgZGVzdHJveWVkIGFzeW5jaHJvbm91c2x5LCBiZWZvcmUgdGhpcworICogICAgICByb3V0aW5lIHJldHVybnMuCisgKi8KK2V4dGVybiB2b2lkIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfY29ubmVjdChBc3luY1NvY2tldENvbm5lY3RvciogY29ubmVjdG9yKTsKKworLyogUHVsbHMgc29ja2V0J3MgZmlsZSBkZXNjcmlwdG9yIGZyb20gdGhlIGNvbm5lY3Rvci4KKyAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGNvbm5lY3Rpb24gY2FsbGJhY2sgb24gc3VjY2Vzc2Z1bAorICogY29ubmVjdGlvbiBzdGF0dXMuIFRoaXMgd2lsbCBwcm92aWRlIHRoZSBjb25uZWN0b3IncyBjbGllbnQgd2l0aCBhbiBvcGVyYXRpb25hbAorICogc29ja2V0IEZELCBhbmQgYXQgdGhlIHNhbWUgdGltZSB0aGlzIHdpbGwgdGVsbCB0aGUgY29ubmVjdG9yIG5vdCB0byBjbG9zZSB0aGUKKyAqIEZEIHdoZW4gY29ubmVjdG9yIGRlc2NyaXB0b3IgZ2V0cyBkZXN0cm95ZWQuCisgKiBQYXJhbToKKyAqICBjb25uZWN0b3IgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldENvbm5lY3RvciBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBGaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBjb25uZWN0ZWQgc29ja2V0LgorICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9jb25uZWN0b3JfcHVsbF9mZChBc3luY1NvY2tldENvbm5lY3RvciogY29ubmVjdG9yKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtc29ja2V0LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzNDUyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1zb2NrZXQuYwpAQCAtMCwwICsxLDEzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogRW5jYXBzdWxhdGVzIGV4Y2hhbmdlIHByb3RvY29sIGJldHdlZW4gdGhlIGVtdWxhdG9yLCBhbmQgYW4gQW5kcm9pZCBkZXZpY2UKKyAqIHRoYXQgaXMgY29ubmVjdGVkIHRvIHRoZSBob3N0IHZpYSBVU0IuIFRoZSBjb21tdW5pY2F0aW9uIGlzIGVzdGFibGlzaGVkIG92ZXIKKyAqIGEgVENQIHBvcnQgZm9yd2FyZGluZywgZW5hYmxlZCBieSBBREIuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvYXN5bmMtc29ja2V0LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FzeW5jLXNvY2tldC1jb25uZWN0b3IuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9pb2xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lICBFKC4uLikgICAgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSAgVyguLi4pICAgIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSAgRCguLi4pICAgIFZFUkJPU0VfUFJJTlQoYXN5bmNzb2NrZXQsX19WQV9BUkdTX18pCisjZGVmaW5lICBEX0FDVElWRSAgVkVSQk9TRV9DSEVDSyhhc3luY3NvY2tldCkKKworI2RlZmluZSBUUkFDRV9PTiAgICAwCisKKyNpZiBUUkFDRV9PTgorI2RlZmluZSAgVCguLi4pICAgIFZFUkJPU0VfUFJJTlQoYXN5bmNzb2NrZXQsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgVCguLi4pCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyBTb2NrZXQgaW50ZXJuYWwgQVBJIGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdldHMgc29ja2V0J3MgYWRkcmVzcyBzdHJpbmcuICovCitzdGF0aWMgY29uc3QgY2hhciogX2FzeW5jX3NvY2tldF9zdHJpbmcoQXN5bmNTb2NrZXQqIGFzKTsKKworLyogR2V0cyBzb2NrZXQncyBsb29wZXIuICovCitzdGF0aWMgTG9vcGVyKiBfYXN5bmNfc29ja2V0X2dldF9sb29wZXIoQXN5bmNTb2NrZXQqIGFzKTsKKworLyogSGFuZGxlciBmb3IgdGhlIEkvTyB0aW1lIG91dC4KKyAqIFBhcmFtOgorICogIGFzIC0gQXN5bmNocm9ub3VzIHNvY2tldCBmb3IgdGhlIEkvTy4KKyAqICBhc2lvIC0gRGVzY2lwdG9yIGZvciB0aGUgdGltZWQgb3V0IEkvTy4KKyAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24gX2FzeW5jX3NvY2tldF9pb190aW1lZF9vdXQoQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogYXNpbyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgU29ja2V0IFJlYWRlciAvIFdyaXRlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBBc3luY1NvY2tldElPIHsKKyAgICAvKiBOZXh0IEkvTyBpbiB0aGUgcmVhZGVyLCBvciB3cml0ZXIgbGlzdC4gKi8KKyAgICBBc3luY1NvY2tldElPKiAgICAgIG5leHQ7CisgICAgLyogQXN5bmNocm9ub3VzIHNvY2tldCBmb3IgdGhpcyBJL08uICovCisgICAgQXN5bmNTb2NrZXQqICAgICAgICBhczsKKyAgICAvKiBUaW1lciB1c2VkIGZvciB0aW1lIG91dHMgb24gdGhpcyBJL08uICovCisgICAgTG9vcFRpbWVyKiAgICAgICAgICB0aW1lcjsKKyAgICAvKiBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJL08uICovCisgICAgdm9pZCogICAgICAgICAgICAgICBpb19vcGFxdWU7CisgICAgLyogQnVmZmVyIHdoZXJlIHRvIHJlYWQgLyB3cml0ZSBkYXRhLiAqLworICAgIHVpbnQ4X3QqICAgICAgICAgICAgYnVmZmVyOworICAgIC8qIEJ5dGVzIHRvIHRyYW5zZmVyIHRocm91Z2ggdGhlIHNvY2tldCBmb3IgdGhpcyBJL08uICovCisgICAgdWludDMyX3QgICAgICAgICAgICB0b190cmFuc2ZlcjsKKyAgICAvKiBCeXRlcyB0aHJhbnNmZXJyZWQgdGhyb3VnaCB0aGUgc29ja2V0IGluIHRoaXMgSS9PLiAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgdHJhbnNmZXJyZWQ7CisgICAgLyogSS9PIGNhbGxiYWNrIGZvciB0aGlzIEkvTy4gKi8KKyAgICBvbl9hc19pb19jYiAgICAgICAgIG9uX2lvOworICAgIC8qIEkvTyB0eXBlIHNlbGVjdG9yOiAxIC0gcmVhZCwgMCAtIHdyaXRlLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaXNfaW9fcmVhZDsKKyAgICAvKiBTdGF0ZSBvZiB0aGUgSS9PLiAqLworICAgIEFzeW5jSU9TdGF0ZSAgICAgICAgc3RhdGU7CisgICAgLyogTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIEkvTy4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlZl9jb3VudDsKKyAgICAvKiBEZWFkbGluZSBmb3IgdGhpcyBJL08gKi8KKyAgICBEdXJhdGlvbiAgICAgICAgICAgIGRlYWRsaW5lOworfTsKKworLyoKKyAqIFJlY3ljbGluZyBJL08gaW5zdGFuY2VzLgorICogU2luY2UgQXN5bmNTb2NrZXRJTyBpbnN0YW5jZXMgYXJlIG5vdCB0aGF0IGxhcmdlLCBpdCBtYWtlcyBzZW5jZSB0byByZWN5Y2xlCisgKiB0aGVtIGZvciBmYXN0ZXIgYWxsb2NhdGlvbiwgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyBhbmQgZnJlZWluZyB0aGVtIGZvciBlYWNoCisgKiBJL08gb24gdGhlIHNvY2tldC4KKyAqLworCisvKiBMaXN0IG9mIHJlY3ljbGVkIEkvTyBkZXNjcmlwdG9ycy4gKi8KK3N0YXRpYyBBc3luY1NvY2tldElPKiBfYXNpb19yZWN5Y2xlZCAgICA9IE5VTEw7CisvKiBOdW1iZXIgb2YgSS9PIGRlc2NyaXB0b3JzIHRoYXQgYXJlIHJlY3ljbGVkIGluIHRoZSBfYXNpb19yZWN5Y2xlZCBsaXN0LiAqLworc3RhdGljIGludCBfcmVjeWNsZWRfYXNpb19jb3VudCAgICAgICAgID0gMDsKKy8qIE1heGltdW0gbnVtYmVyIG9mIEkvTyBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSByZWN5Y2xlZC4gKi8KK3N0YXRpYyBjb25zdCBpbnQgX21heF9yZWN5Y2xlZF9hc2lvX251bSA9IDMyOworCisvKiBIYW5kbGVyIGZvciBhbiBJL08gdGltZS1vdXQgdGltZXIgZXZlbnQuCisgKiBXaGVuIHRoaXMgcm91dGluZSBpcyBpbnZva2VkLCBpdCBpbmRpY2F0ZXMgdGhhdCBhIHRpbWUgb3V0IGhhcyBvY2N1cnJlZCBvbiBhbgorICogSS9PLgorICogUGFyYW06CisgKiAgb3BhcXVlIC0gQXN5bmNTb2NrZXRJTyBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHRpbWVkIG91dCBJL08uCisgKi8KK3N0YXRpYyB2b2lkIF9vbl9hc3luY19zb2NrZXRfaW9fdGltZWRfb3V0KHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB0aW1lcik7CisKKy8qIENyZWF0ZXMgbmV3IEkvTyBkZXNjcmlwdG9yLgorICogUGFyYW06CisgKiAgYXMgLSBBc3luY2hyb25vdXMgc29ja2V0IGZvciB0aGUgSS9PLgorICogIGlzX2lvX3JlYWQgLSBJL08gdHlwZSBzZWxlY3RvcjogMSAtIHJlYWQsIDAgLSB3cml0ZS4KKyAqICBidWZmZXIsIGxlbiAtIFJlYWRlciAvIHdyaXRlciBidWZmZXIgYWRkcmVzcy4KKyAqICBpb19jYiAtIENhbGxiYWNrIGZvciB0aGlzIHJlYWRlciAvIHdyaXRlci4KKyAqICBpb19vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIEkvTy4KKyAqICBkZWFkbGluZSAtIERlYWRsaW5lIHRvIGNvbXBsZXRlIHRoZSBJL08uCisgKiBSZXR1cm46CisgKiAgSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXRJTyBpbnN0YW5jZS4KKyAqLworc3RhdGljIEFzeW5jU29ja2V0SU8qCitfYXN5bmNfc29ja2V0X3J3X25ldyhBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfaW9fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIG9uX2FzX2lvX2NiIGlvX2NiLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogaW9fb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgRHVyYXRpb24gZGVhZGxpbmUpCit7CisgICAgLyogTG9va3VwIGluIHRoZSByZWN5Y2xlciBmaXJzdC4gKi8KKyAgICBBc3luY1NvY2tldElPKiBhc2lvID0gX2FzaW9fcmVjeWNsZWQ7CisgICAgaWYgKGFzaW8gIT0gTlVMTCkgeworICAgICAgICAvKiBQdWxsIHRoZSBkZXNjcmlwdG9yIGZyb20gcmVjeWNsZXIuICovCisgICAgICAgIF9hc2lvX3JlY3ljbGVkID0gYXNpby0+bmV4dDsKKyAgICAgICAgX3JlY3ljbGVkX2FzaW9fY291bnQtLTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBObyByZWN5Y2xlZCBkZXNjcmlwdG9ycy4gQWxsb2NhdGUgbmV3IG9uZS4gKi8KKyAgICAgICAgQU5FVzAoYXNpbyk7CisgICAgfQorCisgICAgYXNpby0+bmV4dCAgICAgICAgICA9IE5VTEw7CisgICAgYXNpby0+YXMgICAgICAgICAgICA9IGFzOworICAgIGFzaW8tPmlzX2lvX3JlYWQgICAgPSBpc19pb19yZWFkOworICAgIGFzaW8tPmJ1ZmZlciAgICAgICAgPSAodWludDhfdCopYnVmZmVyOworICAgIGFzaW8tPnRvX3RyYW5zZmVyICAgPSBsZW47CisgICAgYXNpby0+dHJhbnNmZXJyZWQgICA9IDA7CisgICAgYXNpby0+b25faW8gICAgICAgICA9IGlvX2NiOworICAgIGFzaW8tPmlvX29wYXF1ZSAgICAgPSBpb19vcGFxdWU7CisgICAgYXNpby0+c3RhdGUgICAgICAgICA9IEFTSU9fU1RBVEVfUVVFVUVEOworICAgIGFzaW8tPnJlZl9jb3VudCAgICAgPSAxOworICAgIGFzaW8tPmRlYWRsaW5lICAgICAgPSBkZWFkbGluZTsKKyAgICBhc2lvLT50aW1lciA9IGxvb3BUaW1lcl9uZXcoCisgICAgICAgICAgICBfYXN5bmNfc29ja2V0X2dldF9sb29wZXIoYXMpLAorICAgICAgICAgICAgX29uX2FzeW5jX3NvY2tldF9pb190aW1lZF9vdXQsCisgICAgICAgICAgICBhc2lvKTsKKyAgICBsb29wVGltZXJfc3RhcnRBYnNvbHV0ZShhc2lvLT50aW1lciwgZGVhZGxpbmUpOworCisgICAgLyogUmVmZXJlbmNlIHNvY2tldCB0aGF0IGlzIGhvbGRpbmcgdGhpcyBJL08uICovCisgICAgYXN5bmNfc29ja2V0X3JlZmVyZW5jZShhcyk7CisKKyAgICBUKCJBU29ja2V0ICVzOiAlcyBJL08gZGVzY3JpcHRvciAlcCBpcyBjcmVhdGVkIGZvciAlZCBieXRlcyBvZiBkYXRhIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgaXNfaW9fcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsIGFzaW8sIGxlbik7CisKKyAgICByZXR1cm4gYXNpbzsKK30KKworLyogRGVzdHJveXMgYW5kIGZyZWVzIEkvTyBkZXNjcmlwdG9yLiAqLworc3RhdGljIHZvaWQKK19hc3luY19zb2NrZXRfaW9fZnJlZShBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIEFzeW5jU29ja2V0KiBjb25zdCBhcyA9IGFzaW8tPmFzOworCisgICAgVCgiQVNvY2tldCAlczogJXMgSS9PIGRlc2NyaXB0b3IgJXAgaXMgZGVzdHJveWVkLiIsCisgICAgICBfYXN5bmNfc29ja2V0X3N0cmluZyhhcyksIGFzaW8tPmlzX2lvX3JlYWQgPyAiUkVBRCIgOiAiV1JJVEUiLCBhc2lvKTsKKworICAgIGxvb3BUaW1lcl9mcmVlKGFzaW8tPnRpbWVyKTsKKworICAgIC8qIFRyeSB0byByZWN5Y2xlIGl0IGZpcnN0LCBhbmQgZnJlZSB0aGUgbWVtb3J5IGlmIHJlY3ljbGVyIGlzIGZ1bGwuICovCisgICAgaWYgKF9yZWN5Y2xlZF9hc2lvX2NvdW50IDwgX21heF9yZWN5Y2xlZF9hc2lvX251bSkgeworICAgICAgICBhc2lvLT5uZXh0ID0gX2FzaW9fcmVjeWNsZWQ7CisgICAgICAgIF9hc2lvX3JlY3ljbGVkID0gYXNpbzsKKyAgICAgICAgX3JlY3ljbGVkX2FzaW9fY291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBBRlJFRShhc2lvKTsKKyAgICB9CisKKyAgICAvKiBSZWxlYXNlIHNvY2tldCB0aGF0IGlzIGhvbGRpbmcgdGhpcyBJL08uICovCisgICAgYXN5bmNfc29ja2V0X3JlbGVhc2UoYXMpOworfQorCisvKiBBbiBJL08gaGFzIGJlZW4gZmluaXNoZWQgYW5kIGl0cyBkZXNjcmlwdG9yIGlzIGFib3V0IHRvIGJlIGRpc2NhcmRlZC4gKi8KK3N0YXRpYyB2b2lkCitfYXN5bmNfc29ja2V0X2lvX2ZpbmlzaGVkKEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgLyogTm90aWZ5IHRoZSBjbGllbnQgb2YgdGhlIEkvTyB0aGF0IEkvTyBpcyBmaW5pc2hlZC4gKi8KKyAgICBhc2lvLT5vbl9pbyhhc2lvLT5pb19vcGFxdWUsIGFzaW8sIEFTSU9fU1RBVEVfRklOSVNIRUQpOworfQorCitpbnQKK2FzeW5jX3NvY2tldF9pb19yZWZlcmVuY2UoQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICBhc3NlcnQoYXNpby0+cmVmX2NvdW50ID4gMCk7CisgICAgYXNpby0+cmVmX2NvdW50Kys7CisgICAgcmV0dXJuIGFzaW8tPnJlZl9jb3VudDsKK30KKworaW50Cithc3luY19zb2NrZXRfaW9fcmVsZWFzZShBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIGFzc2VydChhc2lvLT5yZWZfY291bnQgPiAwKTsKKyAgICBhc2lvLT5yZWZfY291bnQtLTsKKyAgICBpZiAoYXNpby0+cmVmX2NvdW50ID09IDApIHsKKyAgICAgICAgX2FzeW5jX3NvY2tldF9pb19maW5pc2hlZChhc2lvKTsKKyAgICAgICAgLyogTGFzdCByZWZlcmVuY2UgaGFzIGJlZW4gZHJvcHBlZC4gRGVzdHJveSB0aGlzIG9iamVjdC4gKi8KKyAgICAgICAgX2FzeW5jX3NvY2tldF9pb19mcmVlKGFzaW8pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGFzaW8tPnJlZl9jb3VudDsKK30KKworLyogQ3JlYXRlcyBuZXcgYXN5bmNocm9ub3VzIHNvY2tldCByZWFkZXIuCisgKiBQYXJhbToKKyAqICBhcyAtIEFzeW5jaHJvbm91cyBzb2NrZXQgZm9yIHRoZSByZWFkZXIuCisgKiAgYnVmZmVyLCBsZW4gLSBSZWFkZXIncyBidWZmZXIuCisgKiAgaW9fY2IgLSBSZWFkZXIncyBjYWxsYmFjay4KKyAqICByZWFkZXJfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkZXIuCisgKiAgZGVhZGxpbmUgLSBEZWFkbGluZSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLgorICogUmV0dXJuOgorICogIEFuIGluaXRpYWxpemVkIEFzeW5jU29ja2V0SU8gaW50YW5jZS4KKyAqLworc3RhdGljIEFzeW5jU29ja2V0SU8qCitfYXN5bmNfc29ja2V0X3JlYWRlcl9uZXcoQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgb25fYXNfaW9fY2IgaW9fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVhZGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBkZWFkbGluZSkKK3sKKyAgICBBc3luY1NvY2tldElPKiBjb25zdCBhc2lvID0gX2FzeW5jX3NvY2tldF9yd19uZXcoYXMsIDEsIGJ1ZmZlciwgbGVuLCBpb19jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyX29wYXF1ZSwgZGVhZGxpbmUpOworICAgIHJldHVybiBhc2lvOworfQorCisvKiBDcmVhdGVzIG5ldyBhc3luY2hyb25vdXMgc29ja2V0IHdyaXRlci4KKyAqIFBhcmFtOgorICogIGFzIC0gQXN5bmNocm9ub3VzIHNvY2tldCBmb3IgdGhlIHdyaXRlci4KKyAqICBidWZmZXIsIGxlbiAtIFdyaXRlcidzIGJ1ZmZlci4KKyAqICBpb19jYiAtIFdyaXRlcidzIGNhbGxiYWNrLgorICogIHdyaXRlcl9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHdyaXRlci4KKyAqICBkZWFkbGluZSAtIERlYWRsaW5lIHRvIGNvbXBsZXRlIHRoZSBvcGVyYXRpb24uCisgKiBSZXR1cm46CisgKiAgQW4gaW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXRJTyBpbnRhbmNlLgorICovCitzdGF0aWMgQXN5bmNTb2NrZXRJTyoKK19hc3luY19zb2NrZXRfd3JpdGVyX25ldyhBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hc19pb19jYiBpb19jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB3cml0ZXJfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGRlYWRsaW5lKQoreworICAgIEFzeW5jU29ja2V0SU8qIGNvbnN0IGFzaW8gPSBfYXN5bmNfc29ja2V0X3J3X25ldyhhcywgMCwgKHZvaWQqKWJ1ZmZlciwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19jYiwgd3JpdGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhZGxpbmUpOworICAgIHJldHVybiBhc2lvOworfQorCisvKiBJL08gdGltZWQgb3V0LiAqLworc3RhdGljIHZvaWQKK19vbl9hc3luY19zb2NrZXRfaW9fdGltZWRfb3V0KHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB0aW1lcikKK3sKKyAgICBBc3luY1NvY2tldElPKiBjb25zdCBhc2lvID0gKEFzeW5jU29ja2V0SU8qKW9wYXF1ZTsKKyAgICBBc3luY1NvY2tldCogY29uc3QgYXMgPSBhc2lvLT5hczsKKworICAgIEQoIkFTb2NrZXQgJXM6ICVzIEkvTyB3aXRoIGRlYWRsaW5lICVsbGQgaGFzIHRpbWVkIG91dCBhdCAlbGxkIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgYXNpby0+aXNfaW9fcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsCisgICAgICBhc2lvLT5kZWFkbGluZSwgYXN5bmNfc29ja2V0X2RlYWRsaW5lKGFzLCAwKSk7CisKKyAgICAvKiBSZWZlcmVuY2Ugd2hpbGUgaW4gY2FsbGJhY2suICovCisgICAgYXN5bmNfc29ja2V0X2lvX3JlZmVyZW5jZShhc2lvKTsKKyAgICBfYXN5bmNfc29ja2V0X2lvX3RpbWVkX291dChhc2lvLT5hcywgYXNpbyk7CisgICAgYXN5bmNfc29ja2V0X2lvX3JlbGVhc2UoYXNpbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIFB1YmxpYyBBc3luY2hyb25vdXMgU29ja2V0IEkvTyBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBc3luY1NvY2tldCoKK2FzeW5jX3NvY2tldF9pb19nZXRfc29ja2V0KGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgYXN5bmNfc29ja2V0X3JlZmVyZW5jZShhc2lvLT5hcyk7CisgICAgcmV0dXJuIGFzaW8tPmFzOworfQorCit2b2lkCithc3luY19zb2NrZXRfaW9fY2FuY2VsX3RpbWVfb3V0KEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgbG9vcFRpbWVyX3N0b3AoYXNpby0+dGltZXIpOworfQorCit2b2lkKgorYXN5bmNfc29ja2V0X2lvX2dldF9pb19vcGFxdWUoY29uc3QgQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICByZXR1cm4gYXNpby0+aW9fb3BhcXVlOworfQorCit2b2lkKgorYXN5bmNfc29ja2V0X2lvX2dldF9jbGllbnRfb3BhcXVlKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgcmV0dXJuIGFzeW5jX3NvY2tldF9nZXRfY2xpZW50X29wYXF1ZShhc2lvLT5hcyk7Cit9CisKK3ZvaWQqCithc3luY19zb2NrZXRfaW9fZ2V0X2J1ZmZlcl9pbmZvKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB0cmFuc2ZlcnJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHRvX3RyYW5zZmVyKQoreworICAgIGlmICh0cmFuc2ZlcnJlZCAhPSBOVUxMKSB7CisgICAgICAgICp0cmFuc2ZlcnJlZCA9IGFzaW8tPnRyYW5zZmVycmVkOworICAgIH0KKyAgICBpZiAodG9fdHJhbnNmZXIgIT0gTlVMTCkgeworICAgICAgICAqdG9fdHJhbnNmZXIgPSBhc2lvLT50b190cmFuc2ZlcjsKKyAgICB9CisgICAgcmV0dXJuIGFzaW8tPmJ1ZmZlcjsKK30KKwordm9pZCoKK2FzeW5jX3NvY2tldF9pb19nZXRfYnVmZmVyKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgcmV0dXJuIGFzaW8tPmJ1ZmZlcjsKK30KKwordWludDMyX3QKK2FzeW5jX3NvY2tldF9pb19nZXRfdHJhbnNmZXJyZWQoY29uc3QgQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICByZXR1cm4gYXNpby0+dHJhbnNmZXJyZWQ7Cit9CisKK3VpbnQzMl90Cithc3luY19zb2NrZXRfaW9fZ2V0X3RvX3RyYW5zZmVyKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgcmV0dXJuIGFzaW8tPnRvX3RyYW5zZmVyOworfQorCitpbnQKK2FzeW5jX3NvY2tldF9pb19pc19yZWFkKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgcmV0dXJuIGFzaW8tPmlzX2lvX3JlYWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgQXN5bmNocm9ub3VzIFNvY2tldCBpbnRlcm5hbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQXN5bmNTb2NrZXQgeworICAgIC8qIFRDUCBhZGRyZXNzIGZvciB0aGUgc29ja2V0LiAqLworICAgIFNvY2tBZGRyZXNzICAgICAgICAgYWRkcmVzczsKKyAgICAvKiBDb25uZWN0aW9uIGNhbGxiYWNrIGZvciB0aGlzIHNvY2tldC4gKi8KKyAgICBvbl9hc19jb25uZWN0aW9uX2NiIG9uX2Nvbm5lY3Rpb247CisgICAgLyogQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29ja2V0IGJ5IHRoZSBjbGllbnQuICovCisgICAgdm9pZCogICAgICAgICAgICAgICBjbGllbnRfb3BhcXVlOworICAgIC8qIEkvTyBsb29wZXIgZm9yIGFzeW5jaHJvbm91cyBJL08gb24gdGhlIHNvY2tldC4gKi8KKyAgICBMb29wZXIqICAgICAgICAgICAgIGxvb3BlcjsKKyAgICAvKiBJL08gZGVzY3JpcHRvciBmb3IgYXN5bmNocm9ub3VzIEkvTyBvbiB0aGUgc29ja2V0LiAqLworICAgIExvb3BJbyogICAgICAgICAgICAgaW87CisgICAgLyogVGltZXIgdG8gdXNlIGZvciByZWNvbm5lY3Rpb24gYXR0ZW1wdHMuICovCisgICAgTG9vcFRpbWVyKiAgICAgICAgICByZWNvbm5lY3RfdGltZXI7CisgICAgLyogSGVhZCBvZiB0aGUgbGlzdCBvZiB0aGUgYWN0aXZlIHJlYWRlcnMuICovCisgICAgQXN5bmNTb2NrZXRJTyogICAgICByZWFkZXJzX2hlYWQ7CisgICAgLyogVGFpbCBvZiB0aGUgbGlzdCBvZiB0aGUgYWN0aXZlIHJlYWRlcnMuICovCisgICAgQXN5bmNTb2NrZXRJTyogICAgICByZWFkZXJzX3RhaWw7CisgICAgLyogSGVhZCBvZiB0aGUgbGlzdCBvZiB0aGUgYWN0aXZlIHdyaXRlcnMuICovCisgICAgQXN5bmNTb2NrZXRJTyogICAgICB3cml0ZXJzX2hlYWQ7CisgICAgLyogVGFpbCBvZiB0aGUgbGlzdCBvZiB0aGUgYWN0aXZlIHdyaXRlcnMuICovCisgICAgQXN5bmNTb2NrZXRJTyogICAgICB3cml0ZXJzX3RhaWw7CisgICAgLyogU29ja2V0J3MgZmlsZSBkZXNjcmlwdG9yLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgZmQ7CisgICAgLyogVGltZW91dCB0byB1c2UgZm9yIHJlY29ubmVjdGlvbiBhdHRlbXB0cy4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJlY29ubmVjdF90bzsKKyAgICAvKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgc29ja2V0LiAqLworICAgIGludCAgICAgICAgICAgICAgICAgcmVmX2NvdW50OworICAgIC8qIEZsYWdzIHdoZXRoZXIgKDEpIG9yIG5vdCAoMCkgc29ja2V0IG93bnMgdGhlIGxvb3Blci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIG93bnNfbG9vcGVyOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIqCitfYXN5bmNfc29ja2V0X3N0cmluZyhBc3luY1NvY2tldCogYXMpCit7CisgICAgcmV0dXJuIHNvY2tfYWRkcmVzc190b19zdHJpbmcoJmFzLT5hZGRyZXNzKTsKK30KKworc3RhdGljIExvb3BlcioKK19hc3luY19zb2NrZXRfZ2V0X2xvb3BlcihBc3luY1NvY2tldCogYXMpCit7CisgICAgcmV0dXJuIGFzLT5sb29wZXI7Cit9CisKKy8qIFB1bGxzIGZpcnN0IHJlYWRlciBvdXQgb2YgdGhlIGxpc3QuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIEZpcnN0IEkvTyBwdWxsZWQgb3V0IG9mIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBJL08gaW4gdGhlIGxpc3QuCisgKiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgSS9PIG9iamVjdCByZXR1cm5lZAorICogIGZyb20gdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgQXN5bmNTb2NrZXRJTyoKK19hc3luY19zb2NrZXRfcHVsbF9maXJzdF9pbyhBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyoqIGxpc3RfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiogbGlzdF90YWlsKQoreworICAgIEFzeW5jU29ja2V0SU8qIGNvbnN0IHJldCA9ICpsaXN0X2hlYWQ7CisgICAgaWYgKHJldCAhPSBOVUxMKSB7CisgICAgICAgICpsaXN0X2hlYWQgPSByZXQtPm5leHQ7CisgICAgICAgIHJldC0+bmV4dCA9IE5VTEw7CisgICAgICAgIGlmICgqbGlzdF9oZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICpsaXN0X3RhaWwgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFB1bGxzIGZpcnN0IHJlYWRlciBvdXQgb2YgdGhlIGxpc3QuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIEZpcnN0IHJlYWRlciBwdWxsZWQgb3V0IG9mIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyByZWFkZXJzIGluIHRoZQorICogIGxpc3QuCisgKiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgSS9PIG9iamVjdCByZXR1cm5lZAorICogIGZyb20gdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgQXN5bmNTb2NrZXRJTyoKK19hc3luY19zb2NrZXRfcHVsbF9maXJzdF9yZWFkZXIoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIHJldHVybiBfYXN5bmNfc29ja2V0X3B1bGxfZmlyc3RfaW8oYXMsICZhcy0+cmVhZGVyc19oZWFkLCAmYXMtPnJlYWRlcnNfdGFpbCk7Cit9CisKKy8qIFB1bGxzIGZpcnN0IHdyaXRlciBvdXQgb2YgdGhlIGxpc3QuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIEZpcnN0IHdyaXRlciBwdWxsZWQgb3V0IG9mIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyB3cml0ZXJzIGluIHRoZQorICogIGxpc3QuCisgKiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgSS9PIG9iamVjdCByZXR1cm5lZAorICogIGZyb20gdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgQXN5bmNTb2NrZXRJTyoKK19hc3luY19zb2NrZXRfcHVsbF9maXJzdF93cml0ZXIoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIHJldHVybiBfYXN5bmNfc29ja2V0X3B1bGxfZmlyc3RfaW8oYXMsICZhcy0+d3JpdGVyc19oZWFkLCAmYXMtPndyaXRlcnNfdGFpbCk7Cit9CisKKy8qIFJlbW92ZXMgYW4gSS9PIGRlc2NyaXB0b3IgZnJvbSBhIGxpc3Qgb2YgYWN0aXZlIEkvTy4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiAgbGlzdF9oZWFkLCBsaXN0X3RhaWwgLSBQb2ludGVycyB0byB0aGUgbGlzdCBoZWFkIGFuZCB0YWlsLgorICogIGlvIC0gSS9PIHRvIHJlbW92ZS4KKyAqIFJldHVybjoKKyAqICBCb29sZWFuOiAxIGlmIEkvTyBoYXMgYmVlbiByZW1vdmVkLCBvciAwIGlmIEkvTyBoYXMgbm90IGJlZW4gZm91bmQgaW4gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQKK19hc3luY19zb2NrZXRfcmVtb3ZlX2lvKEFzeW5jU29ja2V0KiBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8qKiBsaXN0X2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiogbGlzdF90YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogaW8pCit7CisgICAgQXN5bmNTb2NrZXRJTyogcHJldiA9IE5VTEw7CisKKyAgICB3aGlsZSAoKmxpc3RfaGVhZCAhPSBOVUxMICYmIGlvICE9ICpsaXN0X2hlYWQpIHsKKyAgICAgICAgcHJldiA9ICpsaXN0X2hlYWQ7CisgICAgICAgIGxpc3RfaGVhZCA9ICYoKCpsaXN0X2hlYWQpLT5uZXh0KTsKKyAgICB9CisgICAgaWYgKCpsaXN0X2hlYWQgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogSS9PICVwIGlzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdCBmb3Igc29ja2V0ICclcyciLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW8sIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpsaXN0X2hlYWQgPSBpby0+bmV4dDsKKyAgICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgICAgIHByZXYtPm5leHQgPSBpby0+bmV4dDsKKyAgICB9CisgICAgaWYgKCpsaXN0X3RhaWwgPT0gaW8pIHsKKyAgICAgICAgKmxpc3RfdGFpbCA9IHByZXY7CisgICAgfQorCisgICAgLyogUmVsZWFzZSBJL08gYWRqdXN0aW5nIHJlZmVyZW5jZSBhZGRlZCB3aGVuIEkvTyBoYXMgYmVlbiBzYXZlZCBpbiB0aGUgbGlzdC4gKi8KKyAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShpbyk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyogQWR2YW5jZXMgdG8gdGhlIG5leHQgSS9PIGluIHRoZSBsaXN0LgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICBsaXN0X2hlYWQsIGxpc3RfdGFpbCAtIFBvaW50ZXJzIHRvIHRoZSBsaXN0IGhlYWQgYW5kIHRhaWwuCisgKi8KK3N0YXRpYyB2b2lkCitfYXN5bmNfc29ja2V0X2FkdmFuY2VfaW8oQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8qKiBsaXN0X2hlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyoqIGxpc3RfdGFpbCkKK3sKKyAgICBBc3luY1NvY2tldElPKiBmaXJzdF9pbyA9ICpsaXN0X2hlYWQ7CisgICAgaWYgKGZpcnN0X2lvICE9IE5VTEwpIHsKKyAgICAgICAgKmxpc3RfaGVhZCA9IGZpcnN0X2lvLT5uZXh0OworICAgICAgICBmaXJzdF9pby0+bmV4dCA9IE5VTEw7CisgICAgfQorICAgIGlmICgqbGlzdF9oZWFkID09IE5VTEwpIHsKKyAgICAgICAgKmxpc3RfdGFpbCA9IE5VTEw7CisgICAgfQorICAgIGlmIChmaXJzdF9pbyAhPSBOVUxMKSB7CisgICAgICAgIC8qIFJlbGVhc2UgSS9PIHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKyAgICAgICAgYXN5bmNfc29ja2V0X2lvX3JlbGVhc2UoZmlyc3RfaW8pOworICAgIH0KK30KKworLyogQWR2YW5jZXMgdG8gdGhlIG5leHQgcmVhZGVyIGluIHRoZSBsaXN0LgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqLworc3RhdGljIHZvaWQKK19hc3luY19zb2NrZXRfYWR2YW5jZV9yZWFkZXIoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIF9hc3luY19zb2NrZXRfYWR2YW5jZV9pbyhhcywgJmFzLT5yZWFkZXJzX2hlYWQsICZhcy0+cmVhZGVyc190YWlsKTsKK30KKworLyogQWR2YW5jZXMgdG8gdGhlIG5leHQgd3JpdGVyIGluIHRoZSBsaXN0LgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqLworc3RhdGljIHZvaWQKK19hc3luY19zb2NrZXRfYWR2YW5jZV93cml0ZXIoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIF9hc3luY19zb2NrZXRfYWR2YW5jZV9pbyhhcywgJmFzLT53cml0ZXJzX2hlYWQsICZhcy0+d3JpdGVyc190YWlsKTsKK30KKworLyogQ29tcGxldGVzIGFuIEkvTy4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiAgYXNpbyAtIEkvTyB0byBjb21wbGV0ZS4KKyAqIFJldHVybjoKKyAqICBPbmUgb2YgQXN5bmNJT0FjdGlvbiB2YWx1ZXMuCisgKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfYXN5bmNfc29ja2V0X2NvbXBsZXRlX2lvKEFzeW5jU29ja2V0KiBhcywgQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICBUKCJBU29ja2V0ICVzOiAlcyBJL08gJXAgaXMgY29tcGxldGVkLiIsCisgICAgICBfYXN5bmNfc29ja2V0X3N0cmluZyhhcyksIGFzaW8tPmlzX2lvX3JlYWQgPyAiUkVBRCIgOiAiV1JJVEUiLCBhc2lvKTsKKworICAgIC8qIFN0b3AgdGhlIHRpbWVyLiAqLworICAgIGFzeW5jX3NvY2tldF9pb19jYW5jZWxfdGltZV9vdXQoYXNpbyk7CisKKyAgICByZXR1cm4gYXNpby0+b25faW8oYXNpby0+aW9fb3BhcXVlLCBhc2lvLCBBU0lPX1NUQVRFX1NVQ0NFRURFRCk7Cit9CisKKy8qIFRpbWVvdXRzIGFuIEkvTy4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiAgYXNpbyAtIEFuIEkvTyB0aGF0IGhhcyB0aW1lZCBvdXQuCisgKiBSZXR1cm46CisgKiAgT25lIG9mIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX2FzeW5jX3NvY2tldF9pb190aW1lZF9vdXQoQXN5bmNTb2NrZXQqIGFzLCBBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIFQoIkFTb2NrZXQgJXM6ICVzIEkvTyAlcCB3aXRoIGRlYWRsaW5lICVsbGQgaGFzIHRpbWVkIG91dCBhdCAlbGxkIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgYXNpby0+aXNfaW9fcmVhZCA/ICJSRUFEIiA6ICJXUklURSIsIGFzaW8sCisgICAgICBhc2lvLT5kZWFkbGluZSwgYXN5bmNfc29ja2V0X2RlYWRsaW5lKGFzLCAwKSk7CisKKyAgICAvKiBSZXBvcnQgdG8gdGhlIGNsaWVudC4gKi8KKyAgICBjb25zdCBBc3luY0lPQWN0aW9uIGFjdGlvbiA9IGFzaW8tPm9uX2lvKGFzaW8tPmlvX29wYXF1ZSwgYXNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTSU9fU1RBVEVfVElNRURfT1VUKTsKKworICAgIC8qIFJlbW92ZSB0aGUgSS9PIGZyb20gYSBsaXN0IG9mIGFjdGl2ZSBJL08gZm9yIGFjdGlvbnMgb3RoZXIgdGhhbiByZXRyeS4gKi8KKyAgICBpZiAoYWN0aW9uICE9IEFTSU9fQUNUSU9OX1JFVFJZKSB7CisgICAgICAgIGlmIChhc2lvLT5pc19pb19yZWFkKSB7CisgICAgICAgICAgICBfYXN5bmNfc29ja2V0X3JlbW92ZV9pbyhhcywgJmFzLT5yZWFkZXJzX2hlYWQsICZhcy0+cmVhZGVyc190YWlsLCBhc2lvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9hc3luY19zb2NrZXRfcmVtb3ZlX2lvKGFzLCAmYXMtPndyaXRlcnNfaGVhZCwgJmFzLT53cml0ZXJzX3RhaWwsIGFzaW8pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGFjdGlvbjsKK30KKworLyogQ2FuY2VscyBhbiBJL08uCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogIGFzaW8gLSBBbiBJL08gdG8gY2FuY2VsLgorICogUmV0dXJuOgorICogIE9uZSBvZiBBc3luY0lPQWN0aW9uIHZhbHVlcy4KKyAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24KK19hc3luY19zb2NrZXRfY2FuY2VsX2lvKEFzeW5jU29ja2V0KiBhcywgQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICBUKCJBU29ja2V0ICVzOiAlcyBJL08gJXAgaXMgY2FuY2VsbGVkLiIsCisgICAgICBfYXN5bmNfc29ja2V0X3N0cmluZyhhcyksIGFzaW8tPmlzX2lvX3JlYWQgPyAiUkVBRCIgOiAiV1JJVEUiLCBhc2lvKTsKKworICAgIC8qIFN0b3AgdGhlIHRpbWVyLiAqLworICAgIGFzeW5jX3NvY2tldF9pb19jYW5jZWxfdGltZV9vdXQoYXNpbyk7CisKKyAgICByZXR1cm4gYXNpby0+b25faW8oYXNpby0+aW9fb3BhcXVlLCBhc2lvLCBBU0lPX1NUQVRFX0NBTkNFTExFRCk7Cit9CisKKy8qIFJlcG9ydHMgYW4gSS9PIGZhaWx1cmUuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogIGFzaW8gLSBBbiBJL08gdGhhdCBoYXMgZmFpbGVkLiBDYW4gYmUgTlVMTCBmb3IgZ2VuZXJhbCBmYWlsdXJlcy4KKyAqICBmYWlsdXJlIC0gRmFpbHVyZSAoZXJybm8pIHRoYXQgaGFzIG9jY3VycmVkLgorICogUmV0dXJuOgorICogIE9uZSBvZiBBc3luY0lPQWN0aW9uIHZhbHVlcy4KKyAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24KK19hc3luY19zb2NrZXRfaW9fZmFpbHVyZShBc3luY1NvY2tldCogYXMsIEFzeW5jU29ja2V0SU8qIGFzaW8sIGludCBmYWlsdXJlKQoreworICAgIFQoIkFTb2NrZXQgJXM6ICVzIEkvTyAlcCBoYXMgZmFpbGVkOiAlZCAtPiAlcyIsCisgICAgICBfYXN5bmNfc29ja2V0X3N0cmluZyhhcyksIGFzaW8tPmlzX2lvX3JlYWQgPyAiUkVBRCIgOiAiV1JJVEUiLCBhc2lvLAorICAgICAgZmFpbHVyZSwgc3RyZXJyb3IoZmFpbHVyZSkpOworCisgICAgLyogU3RvcCB0aGUgdGltZXIuICovCisgICAgYXN5bmNfc29ja2V0X2lvX2NhbmNlbF90aW1lX291dChhc2lvKTsKKworICAgIGVycm5vID0gZmFpbHVyZTsKKyAgICByZXR1cm4gYXNpby0+b25faW8oYXNpby0+aW9fb3BhcXVlLCBhc2lvLCBBU0lPX1NUQVRFX0ZBSUxFRCk7Cit9CisKKy8qIENhbmNlbHMgYWxsIHRoZSBhY3RpdmUgc29ja2V0IHJlYWRlcnMuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZAorX2FzeW5jX3NvY2tldF9jYW5jZWxfcmVhZGVycyhBc3luY1NvY2tldCogYXMpCit7CisgICAgd2hpbGUgKGFzLT5yZWFkZXJzX2hlYWQgIT0gTlVMTCkgeworICAgICAgICBBc3luY1NvY2tldElPKiBjb25zdCB0b19jYW5jZWwgPSBfYXN5bmNfc29ja2V0X3B1bGxfZmlyc3RfcmVhZGVyKGFzKTsKKyAgICAgICAgLyogV2UgaWdub3JlIGFjdGlvbiByZXR1cm5lZCBmcm9tIHRoZSBjYW5jZWxsYXRpb24gY2FsbGJhY2ssIHNpbmNlIHdlJ3JlCisgICAgICAgICAqIGluIGEgZGlzY29ubmVjdGVkIHN0YXRlIGhlcmUuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfY2FuY2VsX2lvKGFzLCB0b19jYW5jZWwpOworICAgICAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZSh0b19jYW5jZWwpOworICAgIH0KK30KKworLyogQ2FuY2VscyBhbGwgdGhlIGFjdGl2ZSBzb2NrZXQgd3JpdGVycy4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3N0YXRpYyB2b2lkCitfYXN5bmNfc29ja2V0X2NhbmNlbF93cml0ZXJzKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICB3aGlsZSAoYXMtPndyaXRlcnNfaGVhZCAhPSBOVUxMKSB7CisgICAgICAgIEFzeW5jU29ja2V0SU8qIGNvbnN0IHRvX2NhbmNlbCA9IF9hc3luY19zb2NrZXRfcHVsbF9maXJzdF93cml0ZXIoYXMpOworICAgICAgICAvKiBXZSBpZ25vcmUgYWN0aW9uIHJldHVybmVkIGZyb20gdGhlIGNhbmNlbGxhdGlvbiBjYWxsYmFjaywgc2luY2Ugd2UncmUKKyAgICAgICAgICogaW4gYSBkaXNjb25uZWN0ZWQgc3RhdGUgaGVyZS4gKi8KKyAgICAgICAgX2FzeW5jX3NvY2tldF9jYW5jZWxfaW8oYXMsIHRvX2NhbmNlbCk7CisgICAgICAgIGFzeW5jX3NvY2tldF9pb19yZWxlYXNlKHRvX2NhbmNlbCk7CisgICAgfQorfQorCisvKiBDYW5jZWxzIGFsbCB0aGUgSS9PIG9uIHRoZSBzb2NrZXQuICovCitzdGF0aWMgdm9pZAorX2FzeW5jX3NvY2tldF9jYW5jZWxfYWxsX2lvKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICAvKiBTdG9wIHRoZSByZWNvbm5lY3Rpb24gdGltZXIuICovCisgICAgbG9vcFRpbWVyX3N0b3AoYXMtPnJlY29ubmVjdF90aW1lcik7CisKKyAgICAvKiBTdG9wIHJlYWQgLyB3cml0ZSBvbiB0aGUgc29ja2V0LiAqLworICAgIGxvb3BJb19kb250V2FudFdyaXRlKGFzLT5pbyk7CisgICAgbG9vcElvX2RvbnRXYW50UmVhZChhcy0+aW8pOworCisgICAgLyogQ2FuY2VsIGFjdGl2ZSByZWFkZXJzIGFuZCB3cml0ZXJzLiAqLworICAgIF9hc3luY19zb2NrZXRfY2FuY2VsX3JlYWRlcnMoYXMpOworICAgIF9hc3luY19zb2NrZXRfY2FuY2VsX3dyaXRlcnMoYXMpOworfQorCisvKiBDbG9zZXMgc29ja2V0IGhhbmRsZSB1c2VkIGJ5IHRoZSBhc3luYyBzb2NrZXQuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZAorX2FzeW5jX3NvY2tldF9jbG9zZV9zb2NrZXQoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIGlmIChhcy0+ZmQgPj0gMCkgeworICAgICAgICBUKCJBU29ja2V0ICVzOiBTb2NrZXQgaGFuZGxlICVkIGlzIGNsb3NlZC4iLAorICAgICAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgYXMtPmZkKTsKKyAgICAgICAgbG9vcElvX2ZyZWUoYXMtPmlvKTsKKyAgICAgICAgc29ja2V0X2Nsb3NlKGFzLT5mZCk7CisgICAgICAgIGFzLT5mZCA9IC0xOworICAgIH0KK30KKworLyogRGVzdHJveXMgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZAorX2FzeW5jX3NvY2tldF9mcmVlKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICBpZiAoYXMgIT0gTlVMTCkgeworICAgICAgICBUKCJBU29ja2V0ICVzOiBTb2NrZXQgZGVzY3JpcHRvciBpcyBkZXN0cm95ZWQuIiwgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpKTsKKworICAgICAgICAvKiBDbG9zZSBzb2NrZXQuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfY2xvc2Vfc29ja2V0KGFzKTsKKworICAgICAgICAvKiBGcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMuICovCisgICAgICAgIGlmIChhcy0+bG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxvb3BUaW1lcl9mcmVlKGFzLT5yZWNvbm5lY3RfdGltZXIpOworICAgICAgICAgICAgaWYgKGFzLT5vd25zX2xvb3BlcikgeworICAgICAgICAgICAgICAgIGxvb3Blcl9mcmVlKGFzLT5sb29wZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNvY2tfYWRkcmVzc19kb25lKCZhcy0+YWRkcmVzcyk7CisgICAgICAgIEFGUkVFKGFzKTsKKyAgICB9Cit9CisKKy8qIFN0YXJ0cyByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgYWZ0ZXIgY29ubmVjdGlvbiBoYXMgYmVlbiBsb3N0LgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICB0byAtIE1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZWNvbm5lY3Rpb24gYXR0ZW1wdC4KKyAqLworc3RhdGljIHZvaWQKK19hc3luY19zb2NrZXRfcmVjb25uZWN0KEFzeW5jU29ja2V0KiBhcywgaW50IHRvKQoreworICAgIFQoIkFTb2NrZXQgJXM6IHJlY29ubmVjdGluZyBpbiAlZG1zLi4uIiwgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpLCB0byk7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBubyBJL08gaXMgYWN0aXZlLCBhbmQgc29ja2V0IGlzIGNsb3NlZCBiZWZvcmUgd2UKKyAgICAgKiByZWNvbm5lY3QuICovCisgICAgX2FzeW5jX3NvY2tldF9jYW5jZWxfYWxsX2lvKGFzKTsKKworICAgIC8qIFNldCB0aGUgdGltZXIgZm9yIHJlY29ubmVjdGlvbiBhdHRlbXB0LiAqLworICAgIGxvb3BUaW1lcl9zdGFydFJlbGF0aXZlKGFzLT5yZWNvbm5lY3RfdGltZXIsIHRvKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgU29ja2V0IGNhbGxiYWNrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gc29ja2V0IGdldHMgZGlzY29ubmVjdGVkLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqLworc3RhdGljIHZvaWQKK19vbl9hc3luY19zb2NrZXRfZGlzY29ubmVjdGVkKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICAvKiBTYXZlIGVycm9yIHRvIHJlc3RvcmUgaXQgZm9yIHRoZSBjbGllbnQncyBjYWxsYmFjay4gKi8KKyAgICBjb25zdCBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworICAgIEFzeW5jSU9BY3Rpb24gYWN0aW9uID0gQVNJT19BQ1RJT05fQUJPUlQ7CisKKyAgICBEKCJBU29ja2V0ICVzOiBEaXNjb25uZWN0ZWQuIiwgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpKTsKKworICAgIC8qIENhbmNlbCBhbGwgdGhlIEkvTyBvbiB0aGlzIHNvY2tldC4gKi8KKyAgICBfYXN5bmNfc29ja2V0X2NhbmNlbF9hbGxfaW8oYXMpOworCisgICAgLyogQ2xvc2UgdGhlIHNvY2tldC4gKi8KKyAgICBfYXN5bmNfc29ja2V0X2Nsb3NlX3NvY2tldChhcyk7CisKKyAgICAvKiBSZXN0b3JlIGVycm5vLCBhbmQgaW52b2tlIGNsaWVudCdzIGNhbGxiYWNrLiAqLworICAgIGVycm5vID0gc2F2ZV9lcnJubzsKKyAgICBhY3Rpb24gPSBhcy0+b25fY29ubmVjdGlvbihhcy0+Y2xpZW50X29wYXF1ZSwgYXMsIEFTSU9fU1RBVEVfRkFJTEVEKTsKKworICAgIGlmIChhY3Rpb24gPT0gQVNJT19BQ1RJT05fUkVUUlkpIHsKKyAgICAgICAgLyogQ2xpZW50IHJlcXVlc3RlZCByZWNvbm5lY3Rpb24uICovCisgICAgICAgIF9hc3luY19zb2NrZXRfcmVjb25uZWN0KGFzLCBhcy0+cmVjb25uZWN0X3RvKTsKKyAgICB9Cit9CisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIG9uIHNvY2tldCdzIEkvTyBmYWlsdXJlLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICBhc2lvIC0gRGVzY3JpcHRvciBmb3IgdGhlIGZhaWxlZCBJL08uIENhbiBiZSBOVUxMIGZvciBnZW5lcmFsIGZhaWx1cmVzLgorICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX2FzeW5jX3NvY2tldF9mYWlsdXJlKEFzeW5jU29ja2V0KiBhcywgQXN5bmNTb2NrZXRJTyogYXNpbykKK3sKKyAgICBEKCJBU29ja2V0ICVzOiAlcyBJL08gZmFpbHVyZTogJWQgLT4gJXMiLAorICAgICAgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpLCBhc2lvLT5pc19pb19yZWFkID8gIlJFQUQiIDogIldSSVRFIiwKKyAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCisgICAgLyogUmVwb3J0IHRoZSBmYWlsdXJlLiAqLworICAgIHJldHVybiBfYXN5bmNfc29ja2V0X2lvX2ZhaWx1cmUoYXMsIGFzaW8sIGVycm5vKTsKK30KKworLyogQSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGVyZSBpcyBkYXRhIGF2YWlsYWJsZSB0byByZWFkLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuIEZhaWx1cmUgcmV0dXJuZWQgZnJvbSB0aGlzIHJvdXRpbmUgd2lsbAorICogIHNraXAgd3JpdGVzIChpZiBhd2FpbGFibGUpIGJlaGluZCB0aGlzIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQKK19vbl9hc3luY19zb2NrZXRfcmVjdihBc3luY1NvY2tldCogYXMpCit7CisgICAgQXN5bmNJT0FjdGlvbiBhY3Rpb247CisKKyAgICAvKiBHZXQgY3VycmVudCByZWFkZXIuICovCisgICAgQXN5bmNTb2NrZXRJTyogY29uc3QgYXNyID0gYXMtPnJlYWRlcnNfaGVhZDsKKyAgICBpZiAoYXNyID09IE5VTEwpIHsKKyAgICAgICAgRCgiQVNvY2tldCAlczogTm8gcmVhZGVyIGlzIGF2YWlsYWJsZS4iLCBfYXN5bmNfc29ja2V0X3N0cmluZyhhcykpOworICAgICAgICBsb29wSW9fZG9udFdhbnRSZWFkKGFzLT5pbyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFJlZmVyZW5jZSB0aGUgcmVhZGVyIHdoaWxlIHdlJ3JlIHdvcmtpbmcgd2l0aCBpdCBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9pb19yZWZlcmVuY2UoYXNyKTsKKworICAgIC8qIEJ1bXAgSS9PIHN0YXRlLCBhbmQgaW5mb3JtIHRoZSBjbGllbnQgdGhhdCBJL08gaXMgaW4gcHJvZ3Jlc3MuICovCisgICAgaWYgKGFzci0+c3RhdGUgPT0gQVNJT19TVEFURV9RVUVVRUQpIHsKKyAgICAgICAgYXNyLT5zdGF0ZSA9IEFTSU9fU1RBVEVfU1RBUlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3ItPnN0YXRlID0gQVNJT19TVEFURV9DT05USU5VRVM7CisgICAgfQorICAgIGFjdGlvbiA9IGFzci0+b25faW8oYXNyLT5pb19vcGFxdWUsIGFzciwgYXNyLT5zdGF0ZSk7CisgICAgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9BQk9SVCkgeworICAgICAgICBEKCJBU29ja2V0ICVzOiBSZWFkIGlzIGFib3J0ZWQgYnkgdGhlIGNsaWVudC4iLCBfYXN5bmNfc29ja2V0X3N0cmluZyhhcykpOworICAgICAgICAvKiBNb3ZlIG9uIHRvIHRoZSBuZXh0IHJlYWRlci4gKi8KKyAgICAgICAgX2FzeW5jX3NvY2tldF9hZHZhbmNlX3JlYWRlcihhcyk7CisgICAgICAgIC8qIExldHMgc2VlIGlmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgcmVhZGVycywgYW5kIGVuYWJsZSwgb3IgZGlzYWJsZQorICAgICAgICAgKiByZWFkIEkvTyBjYWxsYmFjayBhY2NvcmRpbmdseS4gKi8KKyAgICAgICAgaWYgKGFzLT5yZWFkZXJzX2hlYWQgIT0gTlVMTCkgeworICAgICAgICAgICAgbG9vcElvX3dhbnRSZWFkKGFzLT5pbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb29wSW9fZG9udFdhbnRSZWFkKGFzLT5pbyk7CisgICAgICAgIH0KKyAgICAgICAgYXN5bmNfc29ja2V0X2lvX3JlbGVhc2UoYXNyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogUmVhZCBuZXh0IGNodW5rIG9mIGRhdGEuICovCisgICAgaW50IHJlcyA9IEhBTkRMRV9FSU5UUigKKyAgICAgICAgICAgIHNvY2tldF9yZWN2KGFzLT5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzci0+YnVmZmVyICsgYXNyLT50cmFuc2ZlcnJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzci0+dG9fdHJhbnNmZXIgLSBhc3ItPnRyYW5zZmVycmVkKSk7CisgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgIC8qIFNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuICovCisgICAgICAgIGVycm5vID0gRUNPTk5SRVNFVDsKKyAgICAgICAgX29uX2FzeW5jX3NvY2tldF9kaXNjb25uZWN0ZWQoYXMpOworICAgICAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgICAgLyogWWllbGQgdG8gd3JpdGVzIGJlaGluZCB0aGlzIHJlYWQuICovCisgICAgICAgICAgICBsb29wSW9fd2FudFJlYWQoYXMtPmlvKTsKKyAgICAgICAgICAgIGFzeW5jX3NvY2tldF9pb19yZWxlYXNlKGFzcik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFuIEkvTyBlcnJvci4gKi8KKyAgICAgICAgYWN0aW9uID0gX29uX2FzeW5jX3NvY2tldF9mYWlsdXJlKGFzLCBhc3IpOworICAgICAgICBpZiAoYWN0aW9uICE9IEFTSU9fQUNUSU9OX1JFVFJZKSB7CisgICAgICAgICAgICBEKCJBU29ja2V0ICVzOiBSZWFkIGlzIGFib3J0ZWQgb24gZmFpbHVyZS4iLCBfYXN5bmNfc29ja2V0X3N0cmluZyhhcykpOworICAgICAgICAgICAgLyogTW92ZSBvbiB0byB0aGUgbmV4dCByZWFkZXIuICovCisgICAgICAgICAgICBfYXN5bmNfc29ja2V0X2FkdmFuY2VfcmVhZGVyKGFzKTsKKyAgICAgICAgICAgIC8qIExldHMgc2VlIGlmIHRoZXJlIGFyZSBzdGlsbCBhY3RpdmUgcmVhZGVycywgYW5kIGVuYWJsZSwgb3IgZGlzYWJsZQorICAgICAgICAgICAgICogcmVhZCBJL08gY2FsbGJhY2sgYWNjb3JkaW5nbHkuICovCisgICAgICAgICAgICBpZiAoYXMtPnJlYWRlcnNfaGVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbG9vcElvX3dhbnRSZWFkKGFzLT5pbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvb3BJb19kb250V2FudFJlYWQoYXMtPmlvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSByZWFkZXIncyBkZXNjcmlwdG9yLiAqLworICAgIGFzci0+dHJhbnNmZXJyZWQgKz0gcmVzOworICAgIGlmIChhc3ItPnRyYW5zZmVycmVkID09IGFzci0+dG9fdHJhbnNmZXIpIHsKKyAgICAgICAgLyogVGhpcyByZWFkIGlzIGNvbXBsZXRlZC4gTW92ZSBvbiB0byB0aGUgbmV4dCByZWFkZXIuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfYWR2YW5jZV9yZWFkZXIoYXMpOworCisgICAgICAgIC8qIE5vdGlmeSByZWFkZXIgY29tcGxldGlvbi4gKi8KKyAgICAgICAgX2FzeW5jX3NvY2tldF9jb21wbGV0ZV9pbyhhcywgYXNyKTsKKyAgICB9CisKKyAgICAvKiBMZXRzIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIHJlYWRlcnMsIGFuZCBlbmFibGUsIG9yIGRpc2FibGUgcmVhZAorICAgICAqIEkvTyBjYWxsYmFjayBhY2NvcmRpbmdseS4gKi8KKyAgICBpZiAoYXMtPnJlYWRlcnNfaGVhZCAhPSBOVUxMKSB7CisgICAgICAgIGxvb3BJb193YW50UmVhZChhcy0+aW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3BJb19kb250V2FudFJlYWQoYXMtPmlvKTsKKyAgICB9CisKKyAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3IpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUgdG8gd3JpdGUuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gRmFpbHVyZSByZXR1cm5lZCBmcm9tIHRoaXMgcm91dGluZSB3aWxsCisgKiAgc2tpcCByZWFkcyAoaWYgYXdhaWxhYmxlKSBiZWhpbmQgdGhpcyB3cml0ZS4KKyAqLworc3RhdGljIGludAorX29uX2FzeW5jX3NvY2tldF9zZW5kKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICBBc3luY0lPQWN0aW9uIGFjdGlvbjsKKworICAgIC8qIEdldCBjdXJyZW50IHdyaXRlci4gKi8KKyAgICBBc3luY1NvY2tldElPKiBjb25zdCBhc3cgPSBhcy0+d3JpdGVyc19oZWFkOworICAgIGlmIChhc3cgPT0gTlVMTCkgeworICAgICAgICBEKCJBU29ja2V0ICVzOiBObyB3cml0ZXIgaXMgYXZhaWxhYmxlLiIsIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSk7CisgICAgICAgIGxvb3BJb19kb250V2FudFdyaXRlKGFzLT5pbyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFJlZmVyZW5jZSB0aGUgd3JpdGVyIHdoaWxlIHdlJ3JlIHdvcmtpbmcgd2l0aCBpdCBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9pb19yZWZlcmVuY2UoYXN3KTsKKworICAgIC8qIEJ1bXAgSS9PIHN0YXRlLCBhbmQgaW5mb3JtIHRoZSBjbGllbnQgdGhhdCBJL08gaXMgaW4gcHJvZ3Jlc3MuICovCisgICAgaWYgKGFzdy0+c3RhdGUgPT0gQVNJT19TVEFURV9RVUVVRUQpIHsKKyAgICAgICAgYXN3LT5zdGF0ZSA9IEFTSU9fU1RBVEVfU1RBUlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3ctPnN0YXRlID0gQVNJT19TVEFURV9DT05USU5VRVM7CisgICAgfQorICAgIGFjdGlvbiA9IGFzdy0+b25faW8oYXN3LT5pb19vcGFxdWUsIGFzdywgYXN3LT5zdGF0ZSk7CisgICAgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9BQk9SVCkgeworICAgICAgICBEKCJBU29ja2V0ICVzOiBXcml0ZSBpcyBhYm9ydGVkIGJ5IHRoZSBjbGllbnQuIiwgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpKTsKKyAgICAgICAgLyogTW92ZSBvbiB0byB0aGUgbmV4dCB3cml0ZXIuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfYWR2YW5jZV93cml0ZXIoYXMpOworICAgICAgICAvKiBMZXRzIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIHdyaXRlcnMsIGFuZCBlbmFibGUsIG9yIGRpc2FibGUKKyAgICAgICAgICogd3JpdGUgSS9PIGNhbGxiYWNrIGFjY29yZGluZ2x5LiAqLworICAgICAgICBpZiAoYXMtPndyaXRlcnNfaGVhZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBsb29wSW9fd2FudFdyaXRlKGFzLT5pbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb29wSW9fZG9udFdhbnRXcml0ZShhcy0+aW8pOworICAgICAgICB9CisgICAgICAgIGFzeW5jX3NvY2tldF9pb19yZWxlYXNlKGFzdyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFdyaXRlIG5leHQgY2h1bmsgb2YgZGF0YS4gKi8KKyAgICBpbnQgcmVzID0gSEFORExFX0VJTlRSKAorICAgICAgICAgICAgc29ja2V0X3NlbmQoYXMtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXN3LT5idWZmZXIgKyBhc3ctPnRyYW5zZmVycmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXN3LT50b190cmFuc2ZlciAtIGFzdy0+dHJhbnNmZXJyZWQpKTsKKyAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgLyogU29ja2V0IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZC4gKi8KKyAgICAgICAgZXJybm8gPSBFQ09OTlJFU0VUOworICAgICAgICBfb25fYXN5bmNfc29ja2V0X2Rpc2Nvbm5lY3RlZChhcyk7CisgICAgICAgIGFzeW5jX3NvY2tldF9pb19yZWxlYXNlKGFzdyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAvKiBZaWVsZCB0byByZWFkcyBiZWhpbmQgdGhpcyB3cml0ZS4gKi8KKyAgICAgICAgICAgIGxvb3BJb193YW50V3JpdGUoYXMtPmlvKTsKKyAgICAgICAgICAgIGFzeW5jX3NvY2tldF9pb19yZWxlYXNlKGFzdyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFuIEkvTyBlcnJvci4gKi8KKyAgICAgICAgYWN0aW9uID0gX29uX2FzeW5jX3NvY2tldF9mYWlsdXJlKGFzLCBhc3cpOworICAgICAgICBpZiAoYWN0aW9uICE9IEFTSU9fQUNUSU9OX1JFVFJZKSB7CisgICAgICAgICAgICBEKCJBU29ja2V0ICVzOiBXcml0ZSBpcyBhYm9ydGVkIG9uIGZhaWx1cmUuIiwgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpKTsKKyAgICAgICAgICAgIC8qIE1vdmUgb24gdG8gdGhlIG5leHQgd3JpdGVyLiAqLworICAgICAgICAgICAgX2FzeW5jX3NvY2tldF9hZHZhbmNlX3dyaXRlcihhcyk7CisgICAgICAgICAgICAvKiBMZXRzIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIHdyaXRlcnMsIGFuZCBlbmFibGUsIG9yIGRpc2FibGUKKyAgICAgICAgICAgICAqIHdyaXRlIEkvTyBjYWxsYmFjayBhY2NvcmRpbmdseS4gKi8KKyAgICAgICAgICAgIGlmIChhcy0+d3JpdGVyc19oZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb29wSW9fd2FudFdyaXRlKGFzLT5pbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvb3BJb19kb250V2FudFdyaXRlKGFzLT5pbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXN5bmNfc29ja2V0X2lvX3JlbGVhc2UoYXN3KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgd3JpdGVyIGRlc2NyaXB0b3IuICovCisgICAgYXN3LT50cmFuc2ZlcnJlZCArPSByZXM7CisgICAgaWYgKGFzdy0+dHJhbnNmZXJyZWQgPT0gYXN3LT50b190cmFuc2ZlcikgeworICAgICAgICAvKiBUaGlzIHdyaXRlIGlzIGNvbXBsZXRlZC4gTW92ZSBvbiB0byB0aGUgbmV4dCB3cml0ZXIuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfYWR2YW5jZV93cml0ZXIoYXMpOworCisgICAgICAgIC8qIE5vdGlmeSB3cml0ZXIgY29tcGxldGlvbi4gKi8KKyAgICAgICAgX2FzeW5jX3NvY2tldF9jb21wbGV0ZV9pbyhhcywgYXN3KTsKKyAgICB9CisKKyAgICAvKiBMZXRzIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgYWN0aXZlIHdyaXRlcnMsIGFuZCBlbmFibGUsIG9yIGRpc2FibGUgd3JpdGUKKyAgICAgKiBJL08gY2FsbGJhY2sgYWNjb3JkaW5nbHkuICovCisgICAgaWYgKGFzLT53cml0ZXJzX2hlYWQgIT0gTlVMTCkgeworICAgICAgICBsb29wSW9fd2FudFdyaXRlKGFzLT5pbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9vcElvX2RvbnRXYW50V3JpdGUoYXMtPmlvKTsKKyAgICB9CisKKyAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3cpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gYW4gSS9PIGlzIGF2YWlsYWJsZSBvbiBzb2NrZXQuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogIGZkIC0gU29ja2V0J3MgZmlsZSBkZXNjcmlwdG9yLgorICogIGV2ZW50cyAtIExPT1BfSU9fUkVBRCB8IExPT1BfSU9fV1JJVEUgYml0bWFzay4KKyAqLworc3RhdGljIHZvaWQKK19vbl9hc3luY19zb2NrZXRfaW8odm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cykKK3sKKyAgICBBc3luY1NvY2tldCogY29uc3QgYXMgPSAoQXN5bmNTb2NrZXQqKW9wYXF1ZTsKKworICAgIC8qIFJlZmVyZW5jZSB0aGUgc29ja2V0IHdoaWxlIHdlJ3JlIHdvcmtpbmcgd2l0aCBpdCBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9yZWZlcmVuY2UoYXMpOworCisgICAgaWYgKChldmVudHMgJiBMT09QX0lPX1JFQUQpICE9IDApIHsKKyAgICAgICAgaWYgKF9vbl9hc3luY19zb2NrZXRfcmVjdihhcykgIT0gMCkgeworICAgICAgICAgICAgYXN5bmNfc29ja2V0X3JlbGVhc2UoYXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChldmVudHMgJiBMT09QX0lPX1dSSVRFKSAhPSAwKSB7CisgICAgICAgIGlmIChfb25fYXN5bmNfc29ja2V0X3NlbmQoYXMpICE9IDApIHsKKyAgICAgICAgICAgIGFzeW5jX3NvY2tldF9yZWxlYXNlKGFzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzeW5jX3NvY2tldF9yZWxlYXNlKGFzKTsKK30KKworLyogQSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgYnkgYXN5bmNocm9ub3VzIHNvY2tldCBjb25uZWN0b3Igb24gY29ubmVjdGlvbgorICogIGV2ZW50cy4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogIGNvbm5lY3RvciAtIENvbm5lY3RvciB0aGF0IGlzIHVzZWQgdG8gY29ubmVjdCB0aGlzIHNvY2tldC4KKyAqICBldmVudCAtIENvbm5lY3Rpb24gZXZlbnQuCisgKiBSZXR1cm46CisgKiAgT25lIG9mIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX2Nvbm5lY3Rvcl9ldmVudHModm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbm5lY3RvciwKKyAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBldmVudCkKK3sKKyAgICBBc3luY0lPQWN0aW9uIGFjdGlvbjsKKyAgICBBc3luY1NvY2tldCogY29uc3QgYXMgPSAoQXN5bmNTb2NrZXQqKW9wYXF1ZTsKKworICAgIC8qIFJlZmVyZW5jZSB0aGUgc29ja2V0IHdoaWxlIHdlJ3JlIHdvcmtpbmcgd2l0aCBpdCBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9yZWZlcmVuY2UoYXMpOworCisgICAgaWYgKGV2ZW50ID09IEFTSU9fU1RBVEVfU1VDQ0VFREVEKSB7CisgICAgICAgIC8qIEFjY2VwdCB0aGUgY29ubmVjdGlvbi4gKi8KKyAgICAgICAgYXMtPmZkID0gYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9wdWxsX2ZkKGNvbm5lY3Rvcik7CisgICAgICAgIGFzLT5pbyA9IGxvb3BJb19uZXcoYXMtPmxvb3BlciwgYXMtPmZkLCBfb25fYXN5bmNfc29ja2V0X2lvLCBhcyk7CisgICAgfQorCisgICAgLyogSW52b2tlIGNsaWVudCdzIGNhbGxiYWNrLiAqLworICAgIGFjdGlvbiA9IGFzLT5vbl9jb25uZWN0aW9uKGFzLT5jbGllbnRfb3BhcXVlLCBhcywgZXZlbnQpOworICAgIGlmIChldmVudCA9PSBBU0lPX1NUQVRFX1NVQ0NFRURFRCAmJiBhY3Rpb24gIT0gQVNJT19BQ1RJT05fRE9ORSkgeworICAgICAgICAvKiBGb3Igd2hhdGV2ZXIgcmVhc29uIHRoZSBjbGllbnQgZGlkbid0IHdhbnQgdG8ga2VlcCB0aGlzIGNvbm5lY3Rpb24uCisgICAgICAgICAqIENsb3NlIGl0LiAqLworICAgICAgICBEKCJBU29ja2V0ICVzOiBDb25uZWN0aW9uIGlzIGRpc2NhcmRlZCBieSB0aGUgY2xpZW50LiIsCisgICAgICAgICAgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpKTsKKyAgICAgICAgX2FzeW5jX3NvY2tldF9jbG9zZV9zb2NrZXQoYXMpOworICAgIH0KKworICAgIGlmIChhY3Rpb24gIT0gQVNJT19BQ1RJT05fUkVUUlkpIHsKKyAgICAgICAgYXN5bmNfc29ja2V0X2Nvbm5lY3Rvcl9yZWxlYXNlKGNvbm5lY3Rvcik7CisgICAgfQorCisgICAgYXN5bmNfc29ja2V0X3JlbGVhc2UoYXMpOworCisgICAgcmV0dXJuIGFjdGlvbjsKK30KKworLyogVGltZXIgY2FsbGJhY2sgaW52b2tlZCB0byByZWNvbm5lY3QgdGhlIGxvc3QgY29ubmVjdGlvbi4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKi8KK3ZvaWQKK19vbl9hc3luY19zb2NrZXRfcmVjb25uZWN0KHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB0aW1lcikKK3sKKyAgICBBc3luY1NvY2tldCogYXMgPSAoQXN5bmNTb2NrZXQqKW9wYXF1ZTsKKworICAgIC8qIFJlZmVyZW5jZSB0aGUgc29ja2V0IHdoaWxlIHdlJ3JlIHdvcmtpbmcgd2l0aCBpdCBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIGFzeW5jX3NvY2tldF9yZWZlcmVuY2UoYXMpOworICAgIGFzeW5jX3NvY2tldF9jb25uZWN0KGFzLCBhcy0+cmVjb25uZWN0X3RvKTsKKyAgICBhc3luY19zb2NrZXRfcmVsZWFzZShhcyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgRGV2aWNlIFNvY2tldCBwdWJsaWMgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQXN5bmNTb2NrZXQqCithc3luY19zb2NrZXRfbmV3KGludCBwb3J0LAorICAgICAgICAgICAgICAgICBpbnQgcmVjb25uZWN0X3RvLAorICAgICAgICAgICAgICAgICBvbl9hc19jb25uZWN0aW9uX2NiIGNsaWVudF9jYiwKKyAgICAgICAgICAgICAgICAgdm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgTG9vcGVyKiBsb29wZXIpCit7CisgICAgQXN5bmNTb2NrZXQqIGFzOworCisgICAgaWYgKGNsaWVudF9jYiA9PSBOVUxMKSB7CisgICAgICAgIEUoIkludmFsaWQgY2xpZW50X2NiIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTkVXMChhcyk7CisKKyAgICBhcy0+ZmQgPSAtMTsKKyAgICBhcy0+Y2xpZW50X29wYXF1ZSA9IGNsaWVudF9vcGFxdWU7CisgICAgYXMtPm9uX2Nvbm5lY3Rpb24gPSBjbGllbnRfY2I7CisgICAgYXMtPnJlYWRlcnNfaGVhZCA9IGFzLT5yZWFkZXJzX3RhaWwgPSBOVUxMOworICAgIGFzLT5yZWNvbm5lY3RfdG8gPSByZWNvbm5lY3RfdG87CisgICAgYXMtPnJlZl9jb3VudCA9IDE7CisgICAgc29ja19hZGRyZXNzX2luaXRfaW5ldCgmYXMtPmFkZHJlc3MsIFNPQ0tfQUREUkVTU19JTkVUX0xPT1BCQUNLLCBwb3J0KTsKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgYXMtPmxvb3BlciA9IGxvb3Blcl9uZXdHZW5lcmljKCk7CisgICAgICAgIGlmIChhcy0+bG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEUoIlVuYWJsZSB0byBjcmVhdGUgSS9PIGxvb3BlciBmb3IgYXN5bmMgc29ja2V0ICclcyciLAorICAgICAgICAgICAgICBfYXN5bmNfc29ja2V0X3N0cmluZyhhcykpOworICAgICAgICAgICAgY2xpZW50X2NiKGNsaWVudF9vcGFxdWUsIGFzLCBBU0lPX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgICAgICBfYXN5bmNfc29ja2V0X2ZyZWUoYXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYXMtPm93bnNfbG9vcGVyID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBhcy0+bG9vcGVyID0gbG9vcGVyOworICAgICAgICBhcy0+b3duc19sb29wZXIgPSAwOworICAgIH0KKworICAgIGFzLT5yZWNvbm5lY3RfdGltZXIgPSBsb29wVGltZXJfbmV3KAorICAgICAgICAgICAgYXMtPmxvb3BlciwgX29uX2FzeW5jX3NvY2tldF9yZWNvbm5lY3QsIGFzKTsKKworICAgIFQoIkFTb2NrZXQgJXM6IERlc2NyaXB0b3IgaXMgY3JlYXRlZC4iLCBfYXN5bmNfc29ja2V0X3N0cmluZyhhcykpOworCisgICAgcmV0dXJuIGFzOworfQorCitpbnQKK2FzeW5jX3NvY2tldF9yZWZlcmVuY2UoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIGFzc2VydChhcy0+cmVmX2NvdW50ID4gMCk7CisgICAgYXMtPnJlZl9jb3VudCsrOworICAgIHJldHVybiBhcy0+cmVmX2NvdW50OworfQorCitpbnQKK2FzeW5jX3NvY2tldF9yZWxlYXNlKEFzeW5jU29ja2V0KiBhcykKK3sKKyAgICBhc3NlcnQoYXMtPnJlZl9jb3VudCA+IDApOworICAgIGFzLT5yZWZfY291bnQtLTsKKyAgICBpZiAoYXMtPnJlZl9jb3VudCA9PSAwKSB7CisgICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGhhcyBiZWVuIGRyb3BwZWQuIERlc3Ryb3kgdGhpcyBvYmplY3QuICovCisgICAgICAgIF9hc3luY19zb2NrZXRfY2FuY2VsX2FsbF9pbyhhcyk7CisgICAgICAgIF9hc3luY19zb2NrZXRfZnJlZShhcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYXMtPnJlZl9jb3VudDsKK30KKwordm9pZAorYXN5bmNfc29ja2V0X2Nvbm5lY3QoQXN5bmNTb2NrZXQqIGFzLCBpbnQgcmV0cnlfdG8pCit7CisgICAgVCgiQVNvY2tldCAlczogSGFuZGxpbmcgY29ubmVjdGlvbiByZXF1ZXN0IGZvciAlZG1zLi4uIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgcmV0cnlfdG8pOworCisgICAgQXN5bmNTb2NrZXRDb25uZWN0b3IqIGNvbnN0IGNvbm5lY3RvciA9CisgICAgICAgIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfbmV3KCZhcy0+YWRkcmVzcywgcmV0cnlfdG8sIF9vbl9jb25uZWN0b3JfZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcywgYXMtPmxvb3Blcik7CisgICAgaWYgKGNvbm5lY3RvciAhPSBOVUxMKSB7CisgICAgICAgIGFzeW5jX3NvY2tldF9jb25uZWN0b3JfY29ubmVjdChjb25uZWN0b3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzLT5vbl9jb25uZWN0aW9uKGFzLT5jbGllbnRfb3BhcXVlLCBhcywgQVNJT19TVEFURV9GQUlMRUQpOworICAgIH0KK30KKwordm9pZAorYXN5bmNfc29ja2V0X2Rpc2Nvbm5lY3QoQXN5bmNTb2NrZXQqIGFzKQoreworICAgIFQoIkFTb2NrZXQgJXM6IEhhbmRsaW5nIGRpc2Nvbm5lY3Rpb24gcmVxdWVzdC4uLiIsIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSk7CisKKyAgICBpZiAoYXMgIT0gTlVMTCkgeworICAgICAgICBfYXN5bmNfc29ja2V0X2NhbmNlbF9hbGxfaW8oYXMpOworICAgICAgICBfYXN5bmNfc29ja2V0X2Nsb3NlX3NvY2tldChhcyk7CisgICAgfQorfQorCit2b2lkCithc3luY19zb2NrZXRfcmVjb25uZWN0KEFzeW5jU29ja2V0KiBhcywgaW50IHJldHJ5X3RvKQoreworICAgIFQoIkFTb2NrZXQgJXM6IEhhbmRsaW5nIHJlY29ubmVjdGlvbiByZXF1ZXN0IGZvciAlZG1zLi4uIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgcmV0cnlfdG8pOworCisgICAgX2FzeW5jX3NvY2tldF9jYW5jZWxfYWxsX2lvKGFzKTsKKyAgICBfYXN5bmNfc29ja2V0X2Nsb3NlX3NvY2tldChhcyk7CisgICAgX2FzeW5jX3NvY2tldF9yZWNvbm5lY3QoYXMsIHJldHJ5X3RvKTsKK30KKwordm9pZAorYXN5bmNfc29ja2V0X3JlYWRfYWJzKEFzeW5jU29ja2V0KiBhcywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBvbl9hc19pb19jYiByZWFkZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVhZGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBkZWFkbGluZSkKK3sKKyAgICBUKCJBU29ja2V0ICVzOiBIYW5kbGluZyByZWFkIGZvciAlZCBieXRlcyB3aXRoIGRlYWRsaW5lICVsbGQuLi4iLAorICAgICAgX2FzeW5jX3NvY2tldF9zdHJpbmcoYXMpLCBsZW4sIGRlYWRsaW5lKTsKKworICAgIEFzeW5jU29ja2V0SU8qIGNvbnN0IGFzciA9CisgICAgICAgIF9hc3luY19zb2NrZXRfcmVhZGVyX25ldyhhcywgYnVmZmVyLCBsZW4sIHJlYWRlcl9jYiwgcmVhZGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRsaW5lKTsKKyAgICBpZiAoYXN5bmNfc29ja2V0X2lzX2Nvbm5lY3RlZChhcykpIHsKKyAgICAgICAgLyogQWRkIG5ldyByZWFkZXIgdG8gdGhlIGxpc3QuIE5vdGUgdGhhdCB3ZSB1c2UgaW5pdGlhbCByZWZlcmVuY2UgZnJvbSBJL08KKyAgICAgICAgICogJ25ldycgcm91dGluZSBhcyAiaW4gdGhlIGxpc3QiIHJlZmVyZW5jZSBjb3VudGVyLiAqLworICAgICAgICBpZiAoYXMtPnJlYWRlcnNfaGVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBhcy0+cmVhZGVyc19oZWFkID0gYXMtPnJlYWRlcnNfdGFpbCA9IGFzcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzLT5yZWFkZXJzX3RhaWwtPm5leHQgPSBhc3I7CisgICAgICAgICAgICBhcy0+cmVhZGVyc190YWlsID0gYXNyOworICAgICAgICB9CisgICAgICAgIGxvb3BJb193YW50UmVhZChhcy0+aW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoIkFTb2NrZXQgJXM6IFJlYWQgb24gYSBkaXNjb25uZWN0ZWQgc29ja2V0LiIsIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSk7CisgICAgICAgIGVycm5vID0gRUNPTk5SRVNFVDsKKyAgICAgICAgcmVhZGVyX2NiKHJlYWRlcl9vcGFxdWUsIGFzciwgQVNJT19TVEFURV9GQUlMRUQpOworICAgICAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3IpOworICAgIH0KK30KKwordm9pZAorYXN5bmNfc29ja2V0X3JlYWRfcmVsKEFzeW5jU29ja2V0KiBhcywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBvbl9hc19pb19jYiByZWFkZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVhZGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdG8pCit7CisgICAgY29uc3QgRHVyYXRpb24gZGwgPSAodG8gPj0gMCkgPyBsb29wZXJfbm93KF9hc3luY19zb2NrZXRfZ2V0X2xvb3BlcihhcykpICsgdG8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFVSQVRJT05fSU5GSU5JVEU7CisgICAgYXN5bmNfc29ja2V0X3JlYWRfYWJzKGFzLCBidWZmZXIsIGxlbiwgcmVhZGVyX2NiLCByZWFkZXJfb3BhcXVlLCBkbCk7Cit9CisKK3ZvaWQKK2FzeW5jX3NvY2tldF93cml0ZV9hYnMoQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgb25fYXNfaW9fY2Igd3JpdGVyX2NiLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB3cml0ZXJfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBkZWFkbGluZSkKK3sKKyAgICBUKCJBU29ja2V0ICVzOiBIYW5kbGluZyB3cml0ZSBmb3IgJWQgYnl0ZXMgd2l0aCBkZWFkbGluZSAlbGxkLi4uIiwKKyAgICAgIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSwgbGVuLCBkZWFkbGluZSk7CisKKyAgICBBc3luY1NvY2tldElPKiBjb25zdCBhc3cgPQorICAgICAgICBfYXN5bmNfc29ja2V0X3dyaXRlcl9uZXcoYXMsIGJ1ZmZlciwgbGVuLCB3cml0ZXJfY2IsIHdyaXRlcl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFkbGluZSk7CisgICAgaWYgKGFzeW5jX3NvY2tldF9pc19jb25uZWN0ZWQoYXMpKSB7CisgICAgICAgIC8qIEFkZCBuZXcgd3JpdGVyIHRvIHRoZSBsaXN0LiBOb3RlIHRoYXQgd2UgdXNlIGluaXRpYWwgcmVmZXJlbmNlIGZyb20gSS9PCisgICAgICAgICAqICduZXcnIHJvdXRpbmUgYXMgImluIHRoZSBsaXN0IiByZWZlcmVuY2UgY291bnRlci4gKi8KKyAgICAgICAgaWYgKGFzLT53cml0ZXJzX2hlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgYXMtPndyaXRlcnNfaGVhZCA9IGFzLT53cml0ZXJzX3RhaWwgPSBhc3c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcy0+d3JpdGVyc190YWlsLT5uZXh0ID0gYXN3OworICAgICAgICAgICAgYXMtPndyaXRlcnNfdGFpbCA9IGFzdzsKKyAgICAgICAgfQorICAgICAgICBsb29wSW9fd2FudFdyaXRlKGFzLT5pbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRCgiQVNvY2tldCAlczogV3JpdGUgb24gYSBkaXNjb25uZWN0ZWQgc29ja2V0LiIsIF9hc3luY19zb2NrZXRfc3RyaW5nKGFzKSk7CisgICAgICAgIGVycm5vID0gRUNPTk5SRVNFVDsKKyAgICAgICAgd3JpdGVyX2NiKHdyaXRlcl9vcGFxdWUsIGFzdywgQVNJT19TVEFURV9GQUlMRUQpOworICAgICAgICBhc3luY19zb2NrZXRfaW9fcmVsZWFzZShhc3cpOworICAgIH0KK30KKwordm9pZAorYXN5bmNfc29ja2V0X3dyaXRlX3JlbChBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBvbl9hc19pb19jYiB3cml0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHdyaXRlcl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0bykKK3sKKyAgICBjb25zdCBEdXJhdGlvbiBkbCA9ICh0byA+PSAwKSA/IGxvb3Blcl9ub3coX2FzeW5jX3NvY2tldF9nZXRfbG9vcGVyKGFzKSkgKyB0byA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVVJBVElPTl9JTkZJTklURTsKKyAgICBhc3luY19zb2NrZXRfd3JpdGVfYWJzKGFzLCBidWZmZXIsIGxlbiwgd3JpdGVyX2NiLCB3cml0ZXJfb3BhcXVlLCBkbCk7Cit9CisKK3ZvaWQqCithc3luY19zb2NrZXRfZ2V0X2NsaWVudF9vcGFxdWUoY29uc3QgQXN5bmNTb2NrZXQqIGFzKQoreworICAgIHJldHVybiBhcy0+Y2xpZW50X29wYXF1ZTsKK30KKworRHVyYXRpb24KK2FzeW5jX3NvY2tldF9kZWFkbGluZShBc3luY1NvY2tldCogYXMsIGludCByZWwpCit7CisgICAgcmV0dXJuIChyZWwgPj0gMCkgPyBsb29wZXJfbm93KF9hc3luY19zb2NrZXRfZ2V0X2xvb3BlcihhcykpICsgcmVsIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERVUkFUSU9OX0lORklOSVRFOworfQorCitpbnQKK2FzeW5jX3NvY2tldF9nZXRfcG9ydChjb25zdCBBc3luY1NvY2tldCogYXMpCit7CisgICAgcmV0dXJuIHNvY2tfYWRkcmVzc19nZXRfcG9ydCgmYXMtPmFkZHJlc3MpOworfQorCitpbnQKK2FzeW5jX3NvY2tldF9pc19jb25uZWN0ZWQoY29uc3QgQXN5bmNTb2NrZXQqIGFzKQoreworICAgIHJldHVybiBhcy0+ZmQgPj0gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1zb2NrZXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy1zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE2YmUzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2FzeW5jLXNvY2tldC5oCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2FzeW5jLWlvLWNvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvYXN5bmMtdXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qCisgKiBDb250YWlucyBkZWNsYXJhdGlvbiBvZiBhbiBBUEkgdGhhdCBlbmNhcHN1bGF0ZXMgY29tbXVuaWNhdGlvbiB2aWEgYW4KKyAqIGFzeW5jaHJvbm91cyBzb2NrZXQuCisgKgorICogVGhpcyBpcyBwcmV0dHkgYmFzaWMgQVBJIHRoYXQgYWxsb3dzIGFzeW5jaHJvbm91cyBjb25uZWN0aW9uIHRvIGEgc29ja2V0LAorICogYW5kIGFzeW5jaHJvbm91cyByZWFkIGZyb20gLyB3cml0ZSB0byB0aGUgY29ubmVjdGVkIHNvY2tldC4KKyAqCisgKiBTaW5jZSBhbGwgdGhlIG9wZXJhdGlvbnMgKGluY2x1ZGluZyBjb25uZWN0aW9uKSBhcmUgYXN5bmNocm9ub3VzLCBhbGwgdGhlCisgKiBvcGVyYXRpb24gcmVzdWx0cyBhcmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgY2xpZW50IG9mIHRoaXMgQVBJIHZpYSBzZXQgb2YKKyAqIGNhbGxiYWNrcyB0aGF0IGNsaWVudCBzdXBwbGllZCB0byB0aGlzIEFQSS4KKyAqCisgKiBTaW5jZSBpdCdzIGhhcmQgdG8gY29udHJvbCBsaWZlc3BhbiBvZiBhbiBvYmplY3QgaW4gYXN5bmNocm9ub3VzIGVudmlyb25tZW50LAorICogd2UgbWFrZSBBc3luY1NvY2tldENvbm5lY3RvciBhIHJlZmVyZW5jZWQgb2JqZWN0LCB0aGF0IHdpbGwgc2VsZi1kZXN0cnVjdCB3aGVuCisgKiBpdHMgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8sIGluZGljYXRpbmcgdGhhdCB0aGUgbGFzdCBjbGllbnQgaGFzCisgKiBhYmFuZG9uZWQgdGhhdCBvYmplY3QuCisgKi8KKworLyogRGVjbGFyZXMgYXN5bmNocm9ub3VzIHNvY2tldCBkZXNjcmlwdG9yLiAqLwordHlwZWRlZiBzdHJ1Y3QgQXN5bmNTb2NrZXQgQXN5bmNTb2NrZXQ7CisKKy8qIEFzeW5jaHJvbm91cyBzb2NrZXQgSS9PIChyZWFkZXIsIG9yIHdyaXRlcikgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IEFzeW5jU29ja2V0SU8gQXN5bmNTb2NrZXRJTzsKKworLyogRGVmaW5lcyBjbGllbnQncyBjYWxsYmFjayBzZXQgdG8gbW9uaXRvciBzb2NrZXQgY29ubmVjdGlvbi4KKyAqIFBhcmFtOgorICogIGNsaWVudF9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudC4KKyAqICBhcyAtIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICogIHN0YXR1cyAtIFNvY2tldCBjb25uZWN0aW9uIHN0YXR1cy4KKyAqIFJldHVybjoKKyAqICBPbmUgb2YgdGhlIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCit0eXBlZGVmIEFzeW5jSU9BY3Rpb24gKCpvbl9hc19jb25uZWN0aW9uX2NiKSh2b2lkKiBjbGllbnRfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cyk7CisKKy8qIERlZmluZXMgY2xpZW50J3MgY2FsbGJhY2sgc2V0IHRvIG1vbml0b3IgSS9PIHByb2dyZXNzLgorICogUGFyYW06CisgKiAgaW9fb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBJL08uCisgKiAgYXNpbyAtIEFzeW5jIEkvTyBpbiBwcm9ncmVzcy4KKyAqICBzdGF0dXMgLSBTdGF0dXMgb2YgdGhlIEkvTy4KKyAqIFJldHVybjoKKyAqICBPbmUgb2YgdGhlIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCit0eXBlZGVmIEFzeW5jSU9BY3Rpb24gKCpvbl9hc19pb19jYikodm9pZCogaW9fb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8qIGFzaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8gQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVmZXJlbmNlcyBBc3luY1NvY2tldElPIG9iamVjdC4KKyAqIFBhcmFtOgorICogIGFzaW8gLSBJbml0aWFsaXplZCBBc3luY1NvY2tldElPIGluc3RhbmNlLgorICogUmV0dXJuOgorICogIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QuCisgKi8KK2V4dGVybiBpbnQgYXN5bmNfc29ja2V0X2lvX3JlZmVyZW5jZShBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogUmVsZWFzZXMgQXN5bmNTb2NrZXRJTyBvYmplY3QuCisgKiBOb3RlIHRoYXQgdXBvbiBleGl0IGZyb20gdGhpcyByb3V0aW5lIHRoZSBvYmplY3QgbWlnaHQgYmUgZGVzdHJveWVkLCBldmVuIGlmCisgKiB0aGUgcm91dGluZSByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gemVyby4KKyAqIFBhcmFtOgorICogIGFzaW8gLSBJbml0aWFsaXplZCBBc3luY1NvY2tldElPIGluc3RhbmNlLgorICogUmV0dXJuOgorICogIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QuCisgKi8KK2V4dGVybiBpbnQgYXN5bmNfc29ja2V0X2lvX3JlbGVhc2UoQXN5bmNTb2NrZXRJTyogYXNpbyk7CisKKy8qIEdldHMgQXN5bmNTb2NrZXQgaW5zdGFuY2UgZm9yIGFuIEkvTy4gTm90ZSB0aGF0IHRoaXMgcm91dGluZSB3aWxsIHJlZmVyZW5jZQorICogQXN5bmNTb2NrZXQgaW5zdGFuY2UgYmVmb3JlIHJldHVybmluZyBpdCB0byB0aGUgY2FsbGVyLiAqLworZXh0ZXJuIEFzeW5jU29ja2V0KiBhc3luY19zb2NrZXRfaW9fZ2V0X3NvY2tldChjb25zdCBBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogQ2FuY2VscyB0aW1lIG91dCBzZXQgZm9yIGFuIEkvTyAqLworZXh0ZXJuIHZvaWQgYXN5bmNfc29ja2V0X2lvX2NhbmNlbF90aW1lX291dChBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogR2V0cyBhbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggYW4gSS9PICovCitleHRlcm4gdm9pZCogYXN5bmNfc29ja2V0X2lvX2dldF9pb19vcGFxdWUoY29uc3QgQXN5bmNTb2NrZXRJTyogYXNpbyk7CisKKy8qIEdldHMgYW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQgdGhhdCBoYXMgcmVxdWVzdGVkIEkvTyAqLworZXh0ZXJuIHZvaWQqIGFzeW5jX3NvY2tldF9pb19nZXRfY2xpZW50X29wYXF1ZShjb25zdCBBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogR2V0cyBJL08gYnVmZmVyIGluZm9ybWF0aW9uLgorICogUGFyYW06CisgKiAgYXNpbyAtIEkvTyBkZXNjcmlwdG9yLgorICogIHRyYW5zZmVycmVkIC0gT3B0aW9uYWwgcG9pbnRlciB0byByZWNlaXZlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCB3aXRoCisgKiAgICAgIHRoaXMgSS9PLiBDYW4gYmUgTlVMTC4KKyAqICB0b190cmFuc2ZlciAtIE9wdGlvbmFsIHBvaW50ZXIgdG8gcmVjZWl2ZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIHRvCisgKiAgICAgIHRyYW5zZmVyIHdpdGggdGhpcyBJL08uIENhbiBiZSBOVUxMLgorICogUmV0dXJuOgorICogIEkvTyBidWZmZXIuCisgKi8KK2V4dGVybiB2b2lkKiBhc3luY19zb2NrZXRfaW9fZ2V0X2J1ZmZlcl9pbmZvKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdHJhbnNmZXJyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdG9fdHJhbnNmZXIpOworCisvKiBHZXRzIEkvTyBidWZmZXIuICovCitleHRlcm4gdm9pZCogYXN5bmNfc29ja2V0X2lvX2dldF9idWZmZXIoY29uc3QgQXN5bmNTb2NrZXRJTyogYXNpbyk7CisKKy8qIEdldHMgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHdpdGggdGhpcyBJL08uICovCitleHRlcm4gdWludDMyX3QgYXN5bmNfc29ja2V0X2lvX2dldF90cmFuc2ZlcnJlZChjb25zdCBBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogR2V0cyBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIHRvIHRyYW5zZmVyIHdpdGggdGhpcyBJL08uICovCitleHRlcm4gdWludDMyX3QgYXN5bmNfc29ja2V0X2lvX2dldF90b190cmFuc2Zlcihjb25zdCBBc3luY1NvY2tldElPKiBhc2lvKTsKKworLyogR2V0cyBJL08gdHlwZTogcmVhZCAocmV0dXJucyAxKSwgb3Igd3JpdGUgKHJldHVybnMgMCkuICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9pb19pc19yZWFkKGNvbnN0IEFzeW5jU29ja2V0SU8qIGFzaW8pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENyZWF0ZXMgYW4gYXN5bmNocm9ub3VzIHNvY2tldCBkZXNjcmlwdG9yLgorICogUGFyYW06CisgKiAgcG9ydCAtIFRDUCBwb3J0IHRvIGNvbm5lY3QgdGhlIHNvY2tldCB0by4KKyAqICByZWNvbm5lY3RfdG8gLSBUaW1lb3V0IGJlZm9yZSB0cnlpbmcgdG8gcmVjb25uZWN0IGFmdGVyIGRpc2Nvbm5lY3Rpb24uCisgKiAgY29ubmVjdF9jYiAtIENsaWVudCBjYWxsYmFjayB0byBtb25pdG9yIGNvbm5lY3Rpb24gc3RhdGUgKG11c3Qgbm90IGJlIE5VTEwpLgorICogIGNsaWVudF9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciB0byBhc3NvY2lhdGUgd2l0aCB0aGUgc29ja2V0IGNsaWVudC4KKyAqICBsb29wZXIgLSBBbiBvcHRpb25hbCAoY2FuIGJlIE5VTEwpIEkvTyBsb29wZXIgdG8gdXNlIGZvciBzb2NrZXQgSS9PLiBJZgorICogICAgICB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCB0aGUgc29ja2V0IHdpbGwgY3JlYXRlIGl0cyBvd24gbG9vcGVyLgorICogUmV0dXJuOgorICogIEluaXRpYWxpemVkIEFzeW5jU29ja2V0IGluc3RhbmNlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworZXh0ZXJuIEFzeW5jU29ja2V0KiBhc3luY19zb2NrZXRfbmV3KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvbm5lY3RfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fYXNfY29ubmVjdGlvbl9jYiBjb25uZWN0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVudF9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyKiBsb29wZXIpOworCisvKiBSZWZlcmVuY2VzIEFzeW5jU29ja2V0IG9iamVjdC4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCBhc3luY19zb2NrZXRfcmVmZXJlbmNlKEFzeW5jU29ja2V0KiBhcyk7CisKKy8qIFJlbGVhc2VzIEFzeW5jU29ja2V0IG9iamVjdC4KKyAqIE5vdGUgdGhhdCB1cG9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUgdGhlIG9iamVjdCBtaWdodCBiZSBkZXN0cm95ZWQsIGV2ZW4gaWYKKyAqIHRoZSByb3V0aW5lIHJldHVybnMgdmFsdWUgb3RoZXIgdGhhbiB6ZXJvLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9yZWxlYXNlKEFzeW5jU29ja2V0KiBhcyk7CisKKy8qIEFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIHRvIGFuIGFzeW5jaHJvbm91cyBzb2NrZXQuCisgKiBOb3RlIHRoYXQgY29ubmVjdGlvbiByZXN1bHQgd2lsbCBiZSByZXBvcnRlZCB2aWEgY2FsbGJhY2sgcGFzc2VkIHRvIHRoZQorICogYXN5bmNfc29ja2V0X25ldyByb3V0aW5lLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICByZXRyeV90byAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcgYSBmYWlsZWQKKyAqICAgICAgY29ubmVjdGlvbiBhdHRlbXB0LgorICovCitleHRlcm4gdm9pZCBhc3luY19zb2NrZXRfY29ubmVjdChBc3luY1NvY2tldCogYXMsIGludCByZXRyeV90byk7CisKKy8qIERpc2Nvbm5lY3RzIGZyb20gYW4gYXN5bmNocm9ub3VzIHNvY2tldC4KKyAqIE5PVEU6IEFzeW5jU29ja2V0IGluc3RhbmNlIHJlZmVyZW5jZWQgaW4gdGhpcyBjYWxsIHdpbGwgYmUgZGVzdHJveWVkIGluIHRoaXMKKyAqICByb3V0aW5lLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBhbmQgY29ubmVjdGVkIEFzeW5jU29ja2V0IGluc3RhbmNlLgorICovCitleHRlcm4gdm9pZCBhc3luY19zb2NrZXRfZGlzY29ubmVjdChBc3luY1NvY2tldCogYXMpOworCisvKiBBc3luY2hyb25vdXNseSByZWNvbm5lY3RzIHRvIGFuIGFzeW5jaHJvbm91cyBzb2NrZXQuCisgKiBOb3RlIHRoYXQgY29ubmVjdGlvbiByZXN1bHQgd2lsbCBiZSByZXBvcnRlZCB2aWEgY2FsbGJhY2sgcGFzc2VkIHRvIHRoZQorICogYXN5bmNfc29ja2V0X25ldyByb3V0aW5lLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICByZXRyeV90byAtIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgdHJ5aW5nIHRvIHJlY29ubmVjdC4KKyAqLworZXh0ZXJuIHZvaWQgYXN5bmNfc29ja2V0X3JlY29ubmVjdChBc3luY1NvY2tldCogYXMsIGludCByZXRyeV90byk7CisKKy8qIEFzeW5jaHJvbm91c2x5IHJlYWRzIGRhdGEgZnJvbSBhbiBhc3luY2hyb25vdXMgc29ja2V0IHdpdGggYSBkZWFkbGluZS4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICBidWZmZXIsIGxlbiAtIEJ1ZmZlciB3aGVyZSB0byByZWFkIGRhdGEuCisgKiAgcmVhZGVyX2NiIC0gQ2FsbGJhY2sgdG8gbW9uaXRvciBJL08gcHJvZ3Jlc3MgKG11c3Qgbm90IGJlIE5VTEwpLgorICogIHJlYWRlcl9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlYWRlci4KKyAqICBkZWFkbGluZSAtIERlYWRsaW5lIHRvIGNvbXBsZXRlIHRoZSByZWFkLgorICovCitleHRlcm4gdm9pZCBhc3luY19zb2NrZXRfcmVhZF9hYnMoQXN5bmNTb2NrZXQqIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FzX2lvX2NiIHJlYWRlcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZWFkZXJfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGRlYWRsaW5lKTsKKworLyogQXN5bmNocm9ub3VzbHkgcmVhZHMgZGF0YSBmcm9tIGFuIGFzeW5jaHJvbm91cyBzb2NrZXQgd2l0aCBhIHJlbGF0aXZlIHRpbWVvdXQuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIGFuZCBjb25uZWN0ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiAgYnVmZmVyLCBsZW4gLSBCdWZmZXIgd2hlcmUgdG8gcmVhZCBkYXRhLgorICogIHJlYWRlcl9jYiAtIENhbGxiYWNrIHRvIG1vbml0b3IgSS9PIHByb2dyZXNzIChtdXN0IG5vdCBiZSBOVUxMKS4KKyAqICByZWFkZXJfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkZXIuCisgKiAgdG8gLSBNaWxsaXNlY29uZHMgdG8gY29tcGxldGUgdGhlIHJlYWQuIHRvIDwgMCBpbmRpY2F0ZXMgIm5vIHRpbWVvdXQiCisgKi8KK2V4dGVybiB2b2lkIGFzeW5jX3NvY2tldF9yZWFkX3JlbChBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fYXNfaW9fY2IgcmVhZGVyX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlYWRlcl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvKTsKKworLyogQXN5bmNocm9ub3VzbHkgd3JpdGVzIGRhdGEgdG8gYW4gYXN5bmNocm9ub3VzIHNvY2tldCB3aXRoIGEgZGVhZGxpbmUuCisgKiBQYXJhbToKKyAqICBhcyAtIEluaXRpYWxpemVkIGFuZCBjb25uZWN0ZWQgQXN5bmNTb2NrZXQgaW5zdGFuY2UuCisgKiAgYnVmZmVyLCBsZW4gLSBCdWZmZXIgd2l0aCB3cml0aW5nIGRhdGEuCisgKiAgd3JpdGVyX2NiIC0gQ2FsbGJhY2sgdG8gbW9uaXRvciBJL08gcHJvZ3Jlc3MgKG11c3Qgbm90IGJlIE5VTEwpLgorICogIHdyaXRlcl9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHdyaXRlci4KKyAqICBkZWFkbGluZSAtIERlYWRsaW5lIHRvIGNvbXBsZXRlIHRoZSB3cml0ZS4KKyAqLworZXh0ZXJuIHZvaWQgYXN5bmNfc29ja2V0X3dyaXRlX2FicyhBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgdWludDMyX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9hc19pb19jYiB3cml0ZXJfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHdyaXRlcl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cmF0aW9uIGRlYWRsaW5lKTsKKworLyogQXN5bmNocm9ub3VzbHkgd3JpdGVzIGRhdGEgdG8gYW4gYXN5bmNocm9ub3VzIHNvY2tldCB3aXRoIGEgcmVsYXRpdmUgdGltZW91dC4KKyAqIFBhcmFtOgorICogIGFzIC0gSW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICBidWZmZXIsIGxlbiAtIEJ1ZmZlciB3aXRoIHdyaXRpbmcgZGF0YS4KKyAqICB3cml0ZXJfY2IgLSBDYWxsYmFjayB0byBtb25pdG9yIEkvTyBwcm9ncmVzcyAobXVzdCBub3QgYmUgTlVMTCkKKyAqICB3cml0ZXJfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB3cml0ZXIuCisgKiAgdG8gLSBNaWxsaXNlY29uZHMgdG8gY29tcGxldGUgdGhlIHdyaXRlLiB0byA8IDAgaW5kaWNhdGVzICJubyB0aW1lb3V0IgorICovCitleHRlcm4gdm9pZCBhc3luY19zb2NrZXRfd3JpdGVfcmVsKEFzeW5jU29ja2V0KiBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLCB1aW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX2FzX2lvX2NiIHdyaXRlcl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogd3JpdGVyX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvKTsKKworLyogR2V0IGEgZGVhZGxpbmUgZm9yIHRoZSBnaXZlbiB0aW1lIGludGVydmFsIHJlbGF0aXZlIHRvICJub3ciLgorICogUGFyYW06CisgKiAgYXMgLSBJbml0aWFsaXplZCBBc3luY1NvY2tldCBpbnN0YW5jZS4KKyAqICByZWwgLSBUaW1lIGludGVydmFsLiBJZiA8IDAgYW4gaW5maW5pdGUgZHVyYXRpb24gd2lsbCBiZSByZXR1cm5lZC4KKyAqIFJldHVybjoKKyAqICBBIGRlYWRsaW5lIGZvciB0aGUgZ2l2ZW4gdGltZSBpbnRlcnZhbCByZWxhdGl2ZSB0byAibm93Ii4KKyAqLworZXh0ZXJuIER1cmF0aW9uIGFzeW5jX3NvY2tldF9kZWFkbGluZShBc3luY1NvY2tldCogYXMsIGludCByZWwpOworCisvKiBHZXRzIGFuIG9wYXF1ZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc29ja2V0J3MgY2xpZW50ICovCitleHRlcm4gdm9pZCogYXN5bmNfc29ja2V0X2dldF9jbGllbnRfb3BhcXVlKGNvbnN0IEFzeW5jU29ja2V0KiBhcyk7CisKKy8qIEdldHMgVENQIHBvcnQgZm9yIHRoZSBzb2NrZXQuICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9nZXRfcG9ydChjb25zdCBBc3luY1NvY2tldCogYXMpOworCisvKiBDaGVja3MgaWYgc29ja2V0IGlzIGNvbm5lY3RlZC4KKyAqIFJldHVybjoKKyAqICBCb29sZWFuOiAxIC0gc29ja2V0IGlzIGNvbm5lY3RlZCwgMCAtIHNvY2tldCBpcyBub3QgY29ubmVjdGVkLgorICovCitleHRlcm4gaW50IGFzeW5jX3NvY2tldF9pc19jb25uZWN0ZWQoY29uc3QgQXN5bmNTb2NrZXQqIGFzKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtdXRpbHMuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YWVjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtdXRpbHMuYwpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiYW5kcm9pZC9hc3luYy11dGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3ZvaWQKK2FzeW5jUmVhZGVyX2luaXQoQXN5bmNSZWFkZXIqIGFyLAorICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgYnVmZnNpemUsCisgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICBpbykKK3sKKyAgICBhci0+YnVmZmVyICAgPSBidWZmZXI7CisgICAgYXItPmJ1ZmZzaXplID0gYnVmZnNpemU7CisgICAgYXItPnBvcyAgICAgID0gMDsKKyAgICBhci0+aW8gICAgICAgPSBpbzsKKyAgICBpZiAoYnVmZnNpemUgPiAwKQorICAgICAgICBsb29wSW9fd2FudFJlYWQoaW8pOworfQorCitBc3luY1N0YXR1cworYXN5bmNSZWFkZXJfcmVhZChBc3luY1JlYWRlciogIGFyKQoreworICAgIGludCAgcmV0OworCisgICAgaWYgKGFyLT5wb3MgPj0gYXItPmJ1ZmZzaXplKSB7CisgICAgICAgIHJldHVybiBBU1lOQ19DT01QTEVURTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IEhBTkRMRV9FSU5UUigKKyAgICAgICAgICAgICAgICBzb2NrZXRfcmVjdihsb29wSW9fZmQoYXItPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci0+YnVmZmVyICsgYXItPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhci0+YnVmZnNpemUgLSBhci0+cG9zKSk7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLyogZGlzY29ubmVjdGlvbiAhICovCisgICAgICAgICAgICBlcnJubyA9IEVDT05OUkVTRVQ7CisgICAgICAgICAgICByZXR1cm4gQVNZTkNfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICBsb29wSW9fd2FudFJlYWQoYXItPmlvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNZTkNfTkVFRF9NT1JFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGFyLT5wb3MgKz0gcmV0OworCisgICAgfSB3aGlsZSAoYXItPnBvcyA8IGFyLT5idWZmc2l6ZSk7CisKKyAgICBsb29wSW9fZG9udFdhbnRSZWFkKGFyLT5pbyk7CisgICAgcmV0dXJuIEFTWU5DX0NPTVBMRVRFOworfQorCit2b2lkCithc3luY1dyaXRlcl9pbml0KEFzeW5jV3JpdGVyKiAgYXcsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIGJ1ZmZzaXplLAorICAgICAgICAgICAgICAgICBMb29wSW8qICAgICAgIGlvKQoreworICAgIGF3LT5idWZmZXIgICA9IGJ1ZmZlcjsKKyAgICBhdy0+YnVmZnNpemUgPSBidWZmc2l6ZTsKKyAgICBhdy0+cG9zICAgICAgPSAwOworICAgIGF3LT5pbyAgICAgICA9IGlvOworICAgIGlmIChidWZmc2l6ZSA+IDApCisgICAgICAgIGxvb3BJb193YW50V3JpdGUoaW8pOworfQorCitBc3luY1N0YXR1cworYXN5bmNXcml0ZXJfd3JpdGUoQXN5bmNXcml0ZXIqIGF3KQoreworICAgIGludCAgcmV0OworCisgICAgaWYgKGF3LT5wb3MgPj0gYXctPmJ1ZmZzaXplKSB7CisgICAgICAgIHJldHVybiBBU1lOQ19DT01QTEVURTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IEhBTkRMRV9FSU5UUigKKyAgICAgICAgICAgICAgICBzb2NrZXRfc2VuZChsb29wSW9fZmQoYXctPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdy0+YnVmZmVyICsgYXctPnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdy0+YnVmZnNpemUgLSBhdy0+cG9zKSk7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLyogZGlzY29ubmVjdGlvbiAhICovCisgICAgICAgICAgICBlcnJubyA9IEVDT05OUkVTRVQ7CisgICAgICAgICAgICByZXR1cm4gQVNZTkNfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNZTkNfTkVFRF9NT1JFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGF3LT5wb3MgKz0gcmV0OworCisgICAgfSB3aGlsZSAoYXctPnBvcyA8IGF3LT5idWZmc2l6ZSk7CisKKyAgICBsb29wSW9fZG9udFdhbnRXcml0ZShhdy0+aW8pOworICAgIHJldHVybiBBU1lOQ19DT01QTEVURTsKK30KKworCit2b2lkCithc3luY0xpbmVSZWFkZXJfaW5pdChBc3luY0xpbmVSZWFkZXIqIGFsciwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBidWZmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICAgICAgaW8pCit7CisgICAgYWxyLT5idWZmZXIgICA9IGJ1ZmZlcjsKKyAgICBhbHItPmJ1ZmZzaXplID0gYnVmZnNpemU7CisgICAgYWxyLT5wb3MgICAgICA9IDA7CisgICAgYWxyLT5pbyAgICAgICA9IGlvOworICAgIGFsci0+ZW9sICAgICAgPSAnXG4nOworICAgIGlmIChidWZmc2l6ZSA+IDApCisgICAgICAgIGxvb3BJb193YW50UmVhZChpbyk7Cit9CisKK0FzeW5jU3RhdHVzCithc3luY0xpbmVSZWFkZXJfcmVhZChBc3luY0xpbmVSZWFkZXIqIGFscikKK3sKKyAgICBpbnQgIHJldDsKKworICAgIGlmIChhbHItPnBvcyA+PSBhbHItPmJ1ZmZzaXplKSB7CisgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICByZXR1cm4gQVNZTkNfRVJST1I7CisgICAgfQorCisgICAgZG8geworICAgICAgICBjaGFyIGNoOworICAgICAgICByZXQgPSBIQU5ETEVfRUlOVFIoc29ja2V0X3JlY3YobG9vcElvX2ZkKGFsci0+aW8pLCAmY2gsIDEpKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvKiBkaXNjb25uZWN0aW9uICEgKi8KKyAgICAgICAgICAgIGVycm5vID0gRUNPTk5SRVNFVDsKKyAgICAgICAgICAgIHJldHVybiBBU1lOQ19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgICAgICAgIGxvb3BJb193YW50UmVhZChhbHItPmlvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVNZTkNfTkVFRF9NT1JFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGFsci0+YnVmZmVyW2Fsci0+cG9zKytdID0gKHVpbnQ4X3QpY2g7CisgICAgICAgIGlmIChjaCA9PSBhbHItPmVvbCkgeworICAgICAgICAgICAgbG9vcElvX2RvbnRXYW50UmVhZChhbHItPmlvKTsKKyAgICAgICAgICAgIHJldHVybiBBU1lOQ19DT01QTEVURTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGFsci0+cG9zIDwgYWxyLT5idWZmc2l6ZSk7CisKKyAgICAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGlucHV0IGJ1ZmZlciEqLworICAgIGxvb3BJb19kb250V2FudFJlYWQoYWxyLT5pbyk7CisgICAgZXJybm8gPSBFTk9NRU07CisgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworfQorCitjb25zdCBjaGFyKgorYXN5bmNMaW5lUmVhZGVyX2dldExpbmVSYXcoQXN5bmNMaW5lUmVhZGVyKiBhbHIsIGludCAqcExlbmd0aCkKK3sKKyAgICBpZiAoYWxyLT5wb3MgPT0gMCB8fCBhbHItPnBvcyA+IGFsci0+YnVmZnNpemUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHBMZW5ndGggIT0gMCkKKyAgICAgICAgKnBMZW5ndGggPSBhbHItPnBvczsKKworICAgIHJldHVybiAoY29uc3QgY2hhciopIGFsci0+YnVmZmVyOworfQorCitjb25zdCBjaGFyKgorYXN5bmNMaW5lUmVhZGVyX2dldExpbmUoQXN5bmNMaW5lUmVhZGVyKiBhbHIpCit7CisgICAgLyogU3RyaXAgdHJhaWxpbmcgXG4gaWYgYW55ICovCisgICAgc2l6ZV90ICBwb3MgPSBhbHItPnBvczsKKyAgICBjaGFyKiAgIGJ1ZmZlciA9IChjaGFyKikgYWxyLT5idWZmZXI7CisKKyAgICBpZiAocG9zID09IDAgfHwgcG9zID4gYWxyLT5idWZmc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwb3MtLTsKKworICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHByb3BlciB0ZXJtaW5hdG9yLCBhbmQgcmVwbGFjZSBpdCB3aXRoIDAgKi8KKyAgICBpZiAoYWxyLT5lb2wgPT0gJ1xuJykgeworICAgICAgICBpZiAoYnVmZmVyW3Bvc10gIT0gJ1xuJykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIGJ1ZmZlcltwb3NdID0gJ1wwJzsKKworICAgICAgICAvKiBBbHNvIHN0cmlwIFxyXG4gKi8KKyAgICAgICAgaWYgKHBvcyA+IDAgJiYgYnVmZmVyWy0tcG9zXSA9PSAnXHInKSB7CisgICAgICAgICAgICBidWZmZXJbcG9zXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBidWZmZXI7Cit9CisKKworZW51bSB7CisgICAgQ09OTkVDVF9FUlJPUiA9IDAsCisgICAgQ09OTkVDVF9DT05ORUNUSU5HLAorICAgIENPTk5FQ1RfQ09NUExFVEVECit9OworCitBc3luY1N0YXR1cworYXN5bmNDb25uZWN0b3JfaW5pdChBc3luY0Nvbm5lY3RvciogICAgYWMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBMb29wSW8qICAgICAgICAgICAgaW8pCit7CisgICAgaW50IHJldDsKKyAgICBhYy0+ZXJyb3IgPSAwOworICAgIGFjLT5pbyAgICA9IGlvOworICAgIHJldCA9IHNvY2tldF9jb25uZWN0KGxvb3BJb19mZChpbyksIGFkZHJlc3MpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBhYy0+c3RhdGUgPSBDT05ORUNUX0NPTVBMRVRFRDsKKyAgICAgICAgcmV0dXJuIEFTWU5DX0NPTVBMRVRFOworICAgIH0KKyAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgIGFjLT5zdGF0ZSA9IENPTk5FQ1RfQ09OTkVDVElORzsKKyAgICAgICAgLyogVGhlIHNvY2tldCB3aWxsIGJlIG1hcmtlZCB3cml0YWJsZSBmb3Igc2VsZWN0KCkgd2hlbiB0aGUKKyAgICAgICAgICogY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCwgb3Igd2hlbiBpdCBpcyBkZWZpbml0ZWx5CisgICAgICAgICAqIHJlZnVzZWQgLyB0aW1lZC1vdXQsIGZvciBhbnkgcmVhc29uLiAqLworICAgICAgICBsb29wSW9fd2FudFdyaXRlKGlvKTsKKyAgICAgICAgcmV0dXJuIEFTWU5DX05FRURfTU9SRTsKKyAgICB9CisgICAgYWMtPmVycm9yID0gZXJybm87CisgICAgYWMtPnN0YXRlID0gQ09OTkVDVF9FUlJPUjsKKyAgICByZXR1cm4gQVNZTkNfRVJST1I7Cit9CisKK0FzeW5jU3RhdHVzCithc3luY0Nvbm5lY3Rvcl9ydW4oQXN5bmNDb25uZWN0b3IqIGFjKQoreworICAgIHN3aXRjaCAoYWMtPnN0YXRlKSB7CisgICAgY2FzZSBDT05ORUNUX0VSUk9SOgorICAgICAgICBlcnJubyA9IGFjLT5lcnJvcjsKKyAgICAgICAgcmV0dXJuIEFTWU5DX0VSUk9SOworCisgICAgY2FzZSBDT05ORUNUX0NPTk5FQ1RJTkc6CisgICAgICAgIGxvb3BJb19kb250V2FudFdyaXRlKGFjLT5pbyk7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gcmVhZCB0aGUgc29ja2V0IGVycm9yIHRvIGRldGVybWluZSBpZgorICAgICAgICAgICAgKiB0aGUgY29ubmVjdGlvbiB3YXMgcmVhbGx5IHN1Y2Nlc2Z1bCBvciBub3QuIFRoaXMKKyAgICAgICAgICAgICogaXMgb3B0aW9uYWwsIGJlY2F1c2UgaW4gY2FzZSBvZiBlcnJvciBhIGZ1dHVyZQorICAgICAgICAgICAgKiBzb2NrZXRfcmVjdigpIG9yIHNvY2tldF9zZW5kKCkgd2lsbCBmYWlsIGFueXdheSwgYnV0IHRoaXMKKyAgICAgICAgICAgICogYWxsb3dzIHVzIHRvIGdldCBhIGJldHRlciBlcnJvciB2YWx1ZSBhcyBzb29uIGFzCisgICAgICAgICAgICAqIHBvc3NpYmxlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgYWMtPmVycm9yID0gc29ja2V0X2dldF9lcnJvcihsb29wSW9fZmQoYWMtPmlvKSk7CisgICAgICAgIGlmIChhYy0+ZXJyb3IgPT0gMCkgeworICAgICAgICAgICAgYWMtPnN0YXRlID0gQ09OTkVDVF9DT01QTEVURUQ7CisgICAgICAgICAgICByZXR1cm4gQVNZTkNfQ09NUExFVEU7CisgICAgICAgIH0KKyAgICAgICAgYWMtPnN0YXRlID0gQ09OTkVDVF9FUlJPUjsKKyAgICAgICAgZXJybm8gPSBhYy0+ZXJyb3I7CisgICAgICAgIHJldHVybiBBU1lOQ19FUlJPUjsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBU1lOQ19DT01QTEVURTsKKyAgICB9Cit9CisKK2ludAorYXN5bmNDb25uZWN0b3Jfc3RvcChBc3luY0Nvbm5lY3RvciogYWMpCit7CisgICAgaWYgKGFjLT5zdGF0ZSA9PSBDT05ORUNUX0NPTk5FQ1RJTkcpIHsKKyAgICAgICAgbG9vcElvX2RvbnRXYW50V3JpdGUoYWMtPmlvKTsKKyAgICAgICAgYWMtPnN0YXRlID0gQ09OTkVDVF9DT01QTEVURUQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtdXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hc3luYy11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Yzc2ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXN5bmMtdXRpbHMuaApAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBBIHNldCBvZiB1c2VmdWwgZGF0YSB0eXBlcyB0byBwZXJmb3JtIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgorICoKKyAqIElNUE9SVEFOVCBOT1RFOgorICogICAgSW4gY2FzZSBvZiBuZXR3b3JrIGRpc2Nvbm5lY3Rpb24sIHJlYWQoKSBhbmQgd3JpdGUoKSBqdXN0IHJldHVybiAwCisgKiAgICB0aGUgZmlyc3QgdGltZSB0aGV5IGFyZSBjYWxsZWQuIEFzIGEgY29udmVuaWVuY2UsIHRoZXNlIGZ1bmN0aW9ucworICogICAgd2lsbCByZXR1cm4gQVNZTkNfRVJST1IgYW5kIHNldCAnZXJybm8nIHRvIEVDT05OUkVTRVQgaW5zdGVhZC4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBU1lOQ19DT01QTEVURSA9IDAsICAgLyogYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBjb21wbGV0ZWQgKi8KKyAgICBBU1lOQ19FUlJPUiwgICAgICAgICAgLyogYW4gZXJyb3Igb2NjdXJyZWQsIGxvb2sgYXQgZXJybm8gKi8KKyAgICBBU1lOQ19ORUVEX01PUkUgICAgICAgLyogbW9yZSBkYXRhIGlzIG5lZWRlZCwgdHJ5IGFnYWluIGxhdGVyICovCit9IEFzeW5jU3RhdHVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogIEEgUyBZIE4gQyAgIFIgRSBBIEQgRSBSCisgKioqKioKKyAqKioqKi8KKworLyogQW4gQXN5bmNSZWFkZXIgbWFrZXMgaXQgZWFzaWVyIHRvIHJlYWQgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW50bworICogYSB0YXJnZXQgYnVmZmVyIGFzeW5jaHJvbm91c2x5LiBVc2FnZSBpcyB0aGUgZm9sbG93aW5nOgorICoKKyAqIDEvIHNldHVwIHRoZSByZWFkZXIgd2l0aCBhc3luY1JlYWRlcl9pbml0KGFyLCBidWZmZXIsIGJ1ZmZzaXplLGlvKTsKKyAqIDIvIGNhbGwgYXN5bmNSZWFkZXJfcmVhZChhciwgaW8pLCB3aGVyZSAnaW8nIGlzIGEgTG9vcElvIHdoZW5ldmVyCisgKiAgICB5b3UgY2FuIHJlY2VpdmUgZGF0YSwgaS5lLiBqdXN0IGFmdGVyIHRoZSBpbml0KCkgb3IgaW4geW91cgorICogICAgb3duIGNhbGxiYWNrLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCogIGJ1ZmZlcjsKKyAgICBzaXplX3QgICAgYnVmZnNpemU7CisgICAgc2l6ZV90ICAgIHBvczsKKyAgICBMb29wSW8qICAgaW87Cit9IEFzeW5jUmVhZGVyOworCisvKiBTZXR1cCBhbiBBU3luY1JlYWRlciwgYnkgZ2l2aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSByZWFkIGJ1ZmZlciwKKyAqIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIHdhbnQgdG8gcmVhZC4KKyAqCisgKiBUaGlzIGFsc28gY2FsbHMgbG9vcElvX3dhbnRSZWFkKGlvKSBmb3IgeW91LgorICovCit2b2lkIGFzeW5jUmVhZGVyX2luaXQoQXN5bmNSZWFkZXIqIGFyLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgIGJ1ZmZzaXplLAorICAgICAgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICBpbyk7CisKKy8qIFRyeSB0byByZWFkIGRhdGEgZnJvbSAnaW8nIGFuZCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSByZWFkIG9wZXJhdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogICAgQVNZTkNfQ09NUExFVEU6IElmIHRoZSByZWFkIG9wZXJhdGlvbiB3YXMgY29tcGxldGUuIFRoaXMgd2lsbCBhbHNvCisgKiAgICAgICAgICAgICAgICAgICAgY2FsbCBsb29wSW9fZG9udFdhbnRSZWFkKGlvKSBmb3IgeW91LgorICoKKyAqICAgIEFTWU5DX0VSUk9SOiBJZiBhbiBlcnJvciBvY2N1cmVkIChzZWUgZXJybm8pLiBUaGUgZXJyb3Igd2lsbCBiZQorICogICAgICAgICAgICAgICAgIEVDT05OUkVTRVQgaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9uLgorICoKKyAqICAgIEFTWU5DX05FRURfTU9SRTogSWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5jb21pbmcgZGF0YSB0byBjb21wbGV0ZQorICogICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZCAob3IgaWYgJ2V2ZW50cycgZG9lc24ndCBjb250YWluIExPT1BfSU9fUkVBRCkuCisgKi8KK0FzeW5jU3RhdHVzICBhc3luY1JlYWRlcl9yZWFkKEFzeW5jUmVhZGVyKiAgYXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogIEEgUyBZIE4gQyAgIFcgUiBJIFQgRSBSCisgKioqKioKKyAqKioqKi8KKworLyogQW4gQXN5bmNXcml0ZXIgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIGFuIEFzeW5jUmVhZGVyLCBidXQgZm9yIHdyaXRpbmcKKyAqIGRhdGEgdG8gYSBmaWxlIGRlc2NyaXB0b3IgYXN5bmNocm9ub3VzbHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90KiBidWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgYnVmZnNpemU7CisgICAgc2l6ZV90ICAgICAgICAgcG9zOworICAgIExvb3BJbyogICAgICAgIGlvOworfSBBc3luY1dyaXRlcjsKKworLyogU2V0dXAgYW4gQVN5bmNXcml0ZXIsIGJ5IGdpdmluZyB0aGUgYWRkcmVzcyBvZiB0aGUgd3JpdGUgYnVmZmVyLAorICogYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2Ugd2FudCB0byB3cml0ZS4KKyAqCisgKiBUaGlzIGFsc28gY2FsbHMgbG9vcElvX3dhbnRXcml0ZShpbykgZm9yIHlvdS4KKyAqLwordm9pZCBhc3luY1dyaXRlcl9pbml0KEFzeW5jV3JpdGVyKiAgYXcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBidWZmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBMb29wSW8qICAgICAgIGlvKTsKKworLyogVHJ5IHRvIHdyaXRlIGRhdGEgdG8gJ2lvJyBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgd3JpdGUgb3BlcmF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiAgICBBU1lOQ19DT01QTEVURTogSWYgdGhlIHdyaXRlIG9wZXJhdGlvbiB3YXMgY29tcGxldGUuIFRoaXMgd2lsbCBhbHNvCisgKiAgICAgICAgICAgICAgICAgICAgY2FsbCBsb29wSW9fZG9udFdhbnRXcml0ZShpbykgZm9yIHlvdS4KKyAqCisgKiAgICBBU1lOQ19FUlJPUjogSWYgYW4gZXJyb3Igb2NjdXJlZCAoc2VlIGVycm5vKS4gVGhlIGVycm9yIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICBFQ09OTlJFU0VUIGluIGNhc2Ugb2YgZGlzY29ubmVjdGlvbi4KKyAqCisgKiAgICBBU1lOQ19ORUVEX01PUkU6IElmIG5vdCBhbGwgYnl0ZXMgY291bGQgYmUgc2VudCB5ZXQgKG9yIGlmICdldmVudHMnCisgKiAgICAgICAgICAgICAgICAgICAgIGRvZXNuJ3QgY29udGFpbiBMT09QX0lPX1dSSVRFKS4KKyAqLworQXN5bmNTdGF0dXMgYXN5bmNXcml0ZXJfd3JpdGUoQXN5bmNXcml0ZXIqIGF3KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogIEEgUyBZIE4gQyAgIEwgSSBOIEUgICBSIEUgQSBEIEUgUgorICoqKioqCisgKioqKiovCisKKy8qIEFuIEFzeW5jTGluZVJlYWRlciBhbGxvd3MgeW91IHRvIHJlYWQgb25lIGxpbmUgb2YgdGV4dCBhc3luY2hyb25vdXNseS4KKyAqIFRoZSBiaWdnZXN0IGRpZmZlcmVuY2Ugd2l0aCBBc3luY1JlYWRlciBpcyB0aGF0IHlvdSBkb24ndCBrbm93IHRoZSBsaW5lCisgKiBzaXplIGluIGFkdmFuY2UsIHNvIHRoZSBvYmplY3Qgd2lsbCByZWFkIGRhdGEgYnl0ZS1ieS1ieXRlIHVudGlsIGl0CisgKiBlbmNvdW50ZXJzIGEgJ1xuJy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QqICBidWZmZXI7CisgICAgc2l6ZV90ICAgIGJ1ZmZzaXplOworICAgIHNpemVfdCAgICBwb3M7CisgICAgTG9vcElvKiAgIGlvOworICAgIGNoYXIgICAgICBlb2w7Cit9IEFzeW5jTGluZVJlYWRlcjsKKworLyogU2V0dXAgYW4gQXN5bmNMaW5lUmVhZGVyIHRvIHJlYWQgYXQgbW9zdCAnYnVmZnNpemUnIGNoYXJhY3RlcnMgKGJ5dGVzKQorICogaW50byAnYnVmZmVyJy4gVGhlIHJlYWRlciB3aWxsIHN0b3Agd2hlbiBpdCBmaW5kcyBhICdcbicgd2hpY2ggd2lsbCBiZQorICogcGFydCBvZiB0aGUgYnVmZmVyIGJ5IGRlZmF1bHQuCisgKgorICogTk9URTogYnVmZnNpemUgbXVzdCBiZSA+IDAuIElmIG5vdCwgYXN5bmNMaW5lUmVhZGVyX2dldExpbmUgd2lsbCByZXR1cm4KKyAqICAgICAgIEFTWU5DX0VSUk9SIHdpdGggZXJybm8gPT0gRU5PTUVNLgorICoKKyAqICAgICAgICBidWZmc2l6ZSBtdXN0IGFsc28gc3VmZmljaWVudGx5IGJpZyB0byBob2xkIHRoZSBmaW5hbCAnXG4nLgorICoKKyAqIEFsc28gY2FsbHMgbG9vcElvX3dhbnRSZWFkKGlvKSBmb3IgeW91LgorICovCit2b2lkIGFzeW5jTGluZVJlYWRlcl9pbml0KEFzeW5jTGluZVJlYWRlciogYWxyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICBidWZmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcElvKiAgICAgICAgICBpbyk7CisKKy8qIFNldHMgbGluZSB0ZXJtaW5hdG9yIGNoYXJhY3RlciBmb3IgdGhlIHJlYWRlci4KKyAqIEJ5IGRlZmF1bHQsIGFzeW5jTGluZVJlYWRlcl9pbml0IHdpbGwgc2V0IEVPTCB0byBiZSAnXG4nLiBTb21ldGltZXMgaXQncyBtb3JlCisgKiBjb252ZW5pZW50IHRvIGhhdmUgJ1wwJyBhcyBsaW5lIHRlcm1pbmF0b3IsIHNvICJsaW5lIiByZWFkZXIgZWFzaWx5IGJlY29tZXMKKyAqIGEgInN0cmluZyIgcmVhZGVyLgorICovCitBSU5MSU5FRCB2b2lkCithc3luY0xpbmVSZWFkZXJfc2V0RU9MKEFzeW5jTGluZVJlYWRlciogYWxyLCBjaGFyIGVvbCkKK3sKKyAgICBhbHItPmVvbCA9IGVvbDsKK30KKworLyogVHJ5IHRvIHJlYWQgbGluZSBjaGFyYWN0ZXJzIGZyb20gJ2lvJy4KKyAqIFJldHVybnM6CisgKiAgICBBU1lOQ19DT01QTEVURTogQW4gZW5kLW9mLWxpbmUgd2FzIGRldGVjdGVkLCBjYWxsIGFzeW5jTGluZVJlYWRlcl9nZXRMaW5lCisgKiAgICAgICAgICAgICAgICAgICAgdG8gZXh0cmFjdCB0aGUgbGluZSBjb250ZW50LgorICoKKyAqICAgIEFTWU5DX0VSUk9SOiBBbiBlcnJvciBvY2N1cmVkLiBOb3RlIHRoYXQgaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9uLAorICogICAgICAgICAgICAgICAgIGVycm5vIHdpbGwgYmUgc2V0IHRvIEVDT05OUkVTRVQsIGJ1dCB5b3Ugc2hvdWxkIGJlIGFibGUKKyAqICAgICAgICAgICAgICAgICB0byBjYWxsIGFzeW5jTGluZVJlYWRlcl9nZXRMaW5lIHRvIHJlYWQgdGhlIHBhcnRpYWwgbGluZQorICogICAgICAgICAgICAgICAgIHRoYXQgd2FzIHJlYWQuCisgKgorICogICAgICAgICAgICAgICAgIEluIGNhc2Ugb2Ygb3ZlcmZsb3csIGVycm5vIHdpbGwgYmUgc2V0IHRvIEVOT01FTS4KKyAqCisgKiAgICBBU1lOQ19ORUVEX01PUkU6IElmIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluY29taW5nIGRhdGEgKG9yIGV2ZW50cworICogICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBjb250YWluIExPT1BfSU9fUkVBRCkuCisgKi8KK0FzeW5jU3RhdHVzIGFzeW5jTGluZVJlYWRlcl9yZWFkKEFzeW5jTGluZVJlYWRlciogYWxyKTsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgTk9OLVpFUk8tVEVSTUlOQVRFRCBsaW5lIGNoYXJhY3RlcnMsIGlmIGFueS4KKyAqIElmICdwTGVuZ3RoIiBpcyBub3QgTlVMTCwgdGhlIGZ1bmN0aW9uIHNldHMgJypwTGVuZ3RoJyB0byB0aGUgbGVuZ3RoCisgKiBpbiBieXRlcyBvZiB0aGUgbGluZS4KKyAqCisgKiBSZXR1cm5zOgorICogICAgTlVMTCBpZiAnYnVmZnNpemUnIHdhcyBpbml0aWFsbHkgMCwgb3RoZXJ3aXNlLCBhIHBvaW50ZXIgdG8gJ2J1ZmZlcicKKyAqICAgIGFzIHBhc3NlZCBpbiBhc3luY0xpbmVSZWFkZXJfc2V0dXAoKS4KKyAqCisgKiAgICBOT1RFOiBUaGUgZGF0YSBpcyAqbm90KiB6ZXJvIHRlcm1pbmF0ZWQsIGJ1dCBpdHMgbGFzdCBjaGFyYWN0ZXIKKyAqICAgICAgICAgICBzaG91bGQgYmUgJ1xuJyB1bmxlc3MgYW4gZXJyb3Igb2NjdXJlZC4KKyAqLworY29uc3QgY2hhciogYXN5bmNMaW5lUmVhZGVyX2dldExpbmVSYXcoQXN5bmNMaW5lUmVhZGVyKiBhbHIsIGludCAqcExlbmd0aCk7CisKKy8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIFpFUk8tVEVSTUlOQVRFRCBsaW5lLCB3aXRoIGZpbmFsICdcbicgb3IgJ1xyXG4nCisgKiBzdHJpcHBlZC4gVGhpcyB3aWxsIGJlIE5VTEwgaW4gY2FzZSBvZiBlcnJvciB0aG91Z2guCisgKi8KK2NvbnN0IGNoYXIqIGFzeW5jTGluZVJlYWRlcl9nZXRMaW5lKEFzeW5jTGluZVJlYWRlciogYWxyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBBIFMgWSBOIEMgICBDIE8gTiBOIEUgQyBUIE8gUgorICoqKioqCisgKioqKiovCisKKy8qIEFzeW5jaHJvbm91cyBjb25uZWN0aW9uIHRvIGEgc29ja2V0CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgIGVycm9yOworICAgIGludCAgICAgc3RhdGU7CisgICAgTG9vcElvKiBpbzsKK30gQXN5bmNDb25uZWN0b3I7CisKK0FzeW5jU3RhdHVzCithc3luY0Nvbm5lY3Rvcl9pbml0KEFzeW5jQ29ubmVjdG9yKiAgICBhYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIExvb3BJbyogICAgICAgICAgICBpbyk7CisKK0FzeW5jU3RhdHVzCithc3luY0Nvbm5lY3Rvcl9ydW4oQXN5bmNDb25uZWN0b3IqIGFjKTsKKworLyogU3RvcHMgY29ubmVjdGlvbiBpbiBwcm9ncmVzcy4KKyAqIFJldHVybjoKKyAqICAwIGlmIGNvbm5lY3Rpb24gaW4gcHJvZ3Jlc3MgaGFzIGJlZW4gc3RvcHBlZCwgb3IgLTEgaWYgbm8gY29ubmVjdGlvbiBoYXMgYmVlbgorICogIGluIHByb2dyZXNzLgorICovCitpbnQKK2FzeW5jQ29ubmVjdG9yX3N0b3AoQXN5bmNDb25uZWN0b3IqIGFjKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2hhcmR3YXJlLXByb3BlcnRpZXMuaW5pIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9oYXJkd2FyZS1wcm9wZXJ0aWVzLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGYxNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9oYXJkd2FyZS1wcm9wZXJ0aWVzLmluaQpAQCAtMCwwICsxLDQ0NSBAQAorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGEgZ2l2ZW4gdmlydHVhbCBkZXZpY2UgY29uZmlndXJhdGlvbiBmaWxlLgorIworIyBOb3RlOiBNb3N0IHRvcC1sZXZlbCBwcm9wZXJ0aWVzIGFyZSBib29sZWFuIHRoYXQgY29udHJvbCB3aGV0aGVyIGEgZmVhdHVyZSBpcworIyAgICAgICBwcmVzZW50IG9yIG5vdC4gU3ViLWZlYXR1cmVzIHRoYXQgZGVwZW5kIG9uIGl0IGFyZSBpZ25vcmVkIGlmIHRoZWlyCisjICAgICAgIHBhcmVudCBpcyBzZXQgdG8gJ2ZhbHNlJyBvciAnbm8nCisjCisjIFRoaXMgZmlsZSBpcyBwYXJzZWQgYnkgJ2FuZHJvaWQvc2NyaXB0cy9nZW4taHctY29uZmlnLnB5JyB0byBnZW5lcmF0ZQorIyAnYW5kcm9pZC9hdmQvaHctY29uZmlnLWRlZnMuaCcuIFRoZSBsYXR0ZXIgaXMgYSBzcGVjaWFsIGhlYWRlciBjb250YWluaW5nCisjIG1hY3JvIHN0YXRlbWVudHMgdGhhdCBpcyB1c2VkIHNldmVyYWwgdGltZXM6CisjCisjICAtIG9uY2UgdG8gZGVmaW5lIHRoZSBmaWVsZHMgb2YgdGhlIEFuZHJvaWRId0NvbmZpZyBzdHJ1Y3R1cmUKKyMgICAgKHNlZSBhbmRyb2lkL2F2ZC9ody1jb25maWcuaCkKKyMKKyMgIC0gb25jZSB0byBpbXBsZW1lbnQgdGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gbG9hZGVyCisjICAgIChzZWUgYW5kcm9pZC9hdmQvaHctY29uZmlnLmgpCisjCisjIEl0IGlzIGFsc28gcGFja2FnZWQgYnkgdGhlIFNESyBhbmQgcGFyc2VkIGJ5IHRvb2xzIHRvIGxldCB0aGUgZGV2ZWxvcGVycworIyBjcmVhdGUgQVZEcy4KKyMKKyMgTk9URTogaWYgeW91IHJlbW92ZSBpdGVtcyBmcm9tIHRoaXMgZmlsZSwgYmUgc3VyZSB0aGF0IHlvdSBkbyBub3QgYnJlYWsKKyMgICAgICAgdGhlIGVtdWxhdG9yIGJ1aWxkLgorIworCisjIENQVSBBcmNoaXRlY3R1cmUKK25hbWUgICAgICAgID0gaHcuY3B1LmFyY2gKK3R5cGUgICAgICAgID0gc3RyaW5nCitkZWZhdWx0ICAgICA9IGFybQorYWJzdHJhY3QgICAgPSBDUFUgQXJjaGl0ZWN0dXJlCitkZXNjcmlwdGlvbiA9IFRoZSBDUFUgQXJjaGl0ZWN0dXJlIHRvIGVtdWxhdG9yCisKKyMgQ1BVIE1vZGVsCisjIExlYXZlIGl0IGVtcHR5LCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBjb21wdXRlZCBmcm9tCisjIGh3LmNwdS5hcmNoLiBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBleHBlcmltZW50YXRpb24gZm9yIG5vdy4KK25hbWUgICAgICAgID0gaHcuY3B1Lm1vZGVsCit0eXBlICAgICAgICA9IHN0cmluZworZGVmYXVsdCAgICAgPQorYWJzdHJhY3QgICAgPSBDUFUgbW9kZWwKK2Rlc2NyaXB0aW9uID0gVGhlIENQVSBtb2RlbCAoUUVNVS1zcGVjaWZpYyBzdHJpbmcpCisKKyMgU01QIGNvdW50OiBOdW1iZXIgb2YgcHJvY2Vzc29ycyB0byBlbXVsYXRlIHdoZW4gU01QIGlzIHN1cHBvcnRlZC4KKyMgTXVzdCBiZSA+IDAuCituYW1lICAgICAgICA9IGh3LmNwdS5uY29yZQordHlwZSAgICAgICAgPSBpbnRlZ2VyCitkZWZhdWx0ICAgICA9IDIKK2Fic3RyYWN0ICAgID0gU01QIENQVSBjb3JlIGNvdW50CitkZXNjcmlwdGlvbiA9IE51bWJlciBvZiBjb3JlcyBpbiBhIHNpbXVsYXRlZCBTTVAgQ1BVLgorCisjIFJhbSBzaXplCisjIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBjb21wdXRlZCBiYXNlZCBvbiBzY3JlZW4gcGl4ZWxzCisjIG9yIHNraW4gdmVyc2lvbgorbmFtZSAgICAgICAgPSBody5yYW1TaXplCit0eXBlICAgICAgICA9IGludGVnZXIKK2RlZmF1bHQgICAgID0gMAorYWJzdHJhY3QgICAgPSBEZXZpY2UgcmFtIHNpemUKK2Rlc2NyaXB0aW9uID0gVGhlIGFtb3VudCBvZiBwaHlzaWNhbCBSQU0gb24gdGhlIGRldmljZSwgaW4gbWVnYWJ5dGVzLgorCisjIFRvdWNoIHNjcmVlbiB0eXBlCituYW1lICAgICAgICA9IGh3LnNjcmVlbgordHlwZSAgICAgICAgPSBzdHJpbmcKK2VudW0gICAgICAgID0gdG91Y2gsIG11bHRpLXRvdWNoLCBuby10b3VjaAorZGVmYXVsdCAgICAgPSBtdWx0aS10b3VjaAorYWJzdHJhY3QgICAgPSBUb3VjaCBzY3JlZW4gdHlwZQorZGVzY3JpcHRpb24gPSBEZWZpbmVzIHR5cGUgb2YgdGhlIHNjcmVlbi4KKworIyBIYXJkd2FyZSBtYWluIGtleXMgKGJhY2svaG9tZSkKK25hbWUgICAgICAgID0gaHcubWFpbktleXMKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gSGFyZHdhcmUgQmFjay9Ib21lIGtleXMKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGVyZSBhcmUgaGFyZHdhcmUgYmFjay9ob21lIGtleXMgb24gdGhlIGRldmljZS4KKworIyBUcmFja2JhbGwgc3VwcG9ydAorbmFtZSAgICAgICAgPSBody50cmFja0JhbGwKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gVHJhY2stYmFsbCBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFdoZXRoZXIgdGhlcmUgaXMgYSB0cmFja2JhbGwgb24gdGhlIGRldmljZS4KKworIyBLZXlib2FyZCBzdXBwb3J0IChxd2VydHkvYXplcnR5KQorbmFtZSAgICAgICAgPSBody5rZXlib2FyZAordHlwZSAgICAgICAgPSBib29sZWFuCitkZWZhdWx0ICAgICA9IG5vCithYnN0cmFjdCAgICA9IEtleWJvYXJkIHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGUgZGV2aWNlIGhhcyBhIFFXRVJUWSBrZXlib2FyZC4KKworIyBLZXlib2FyZCBsaWQgc3VwcG9ydAorIyAoSS5lLiBjYW4gdGhlIHF3ZXJ0eSBrZXlib2FyZCBiZSBjbG9zZWQvaGlkZGVuIG9yIG9wZW5lZC92aXNpYmxlKQorIyB0aGlzIHdpbGwgYmUgaWdub3JlZCBpZiBody5rZXlib2FyZCBpcyBmYWxzZQorIworIyBOT1RFOiBBcyBhIHNwZWNpYWwgY2FzZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSAnZmFsc2UnIGlmIHRoZQorIyAgICAgICBBVkQgdGFyZ2V0cyBBUEkgbGV2ZWwgMTIgb3IgaGlnaGVyLiBTZWUgaHdDb25maWdfaW5pdCgpCisjICAgICAgIGluIGV4dGVybmFsL3FlbXUvYW5kcm9pZC9hdmQvaHctY29uZmlnLmMgZm9yIG1vcmUgZGV0YWlscy4KKyMKK25hbWUgICAgICAgID0gaHcua2V5Ym9hcmQubGlkCit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IEtleWJvYXJkIGxpZCBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFdoZXRoZXIgdGhlIFFXRVJUWSBrZXlib2FyZCBjYW4gYmUgb3BlbmVkL2Nsb3NlZC4KKworIyBUaGUgbmFtZSBvZiB0aGUgaGFyZHdhcmUgY2hhcm1hcCBmb3IgdGhpcyBkZXZpY2UuCisjCisjIE5PVEU6IFRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgZGVmYXVsdCAncXdlcnR5MicgdW5sZXNzIHlvdSBoYXZlCisjICAgICAgICBtb2RpZmllZCB0aGUgc3lzdGVtIGltYWdlIGFjY29yZGluZ2x5LiBUaGlzIG5hbWUgaXMgc2VudCB0bworIyAgICAgICAgdGhlIGtlcm5lbCBhdCBib290IHRpbWUuIFVzaW5nIGFuIGluY29ycmVjdCBuYW1lIHdpbGwgcmVzdWx0CisjICAgICAgICBpbiBhbiB1bnVzYWJsZSBtYWNoaW5lLgorbmFtZSAgICAgICAgPSBody5rZXlib2FyZC5jaGFybWFwCit0eXBlICAgICAgICA9IHN0cmluZworZGVmYXVsdCAgICAgPSBxd2VydHkyCithYnN0cmFjdCAgICA9IEtleWJvYXJkIGNoYXJtYXAgbmFtZQorZGVzY3JpcHRpb24gPSBOYW1lIG9mIHRoZSBzeXN0ZW0ga2V5Ym9hcmQgY2hhcm1hcCBmaWxlLgorCisjIERQYWQga2V5cworbmFtZSAgICAgICAgPSBody5kUGFkCit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IERQYWQgc3VwcG9ydAorZGVzY3JpcHRpb24gPSBXaGV0aGVyIHRoZSBkZXZpY2UgaGFzIERQYWQga2V5cworCisjIEdTTSBNb2RlbSBzdXBwb3J0CituYW1lICAgICAgICA9IGh3LmdzbU1vZGVtCit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IEdTTSBtb2RlbSBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFdoZXRoZXIgdGhlcmUgaXMgYSBHU00gbW9kZW0gaW4gdGhlIGRldmljZS4KKworIyBHUFMgc3VwcG9ydAorbmFtZSAgICAgICAgPSBody5ncHMKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gR1BTIHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGVyZSBpcyBhIEdQUyBpbiB0aGUgZGV2aWNlLgorCisjIEJhdHRlcnkKK25hbWUgICAgICAgID0gaHcuYmF0dGVyeQordHlwZSAgICAgICAgPSBib29sZWFuCitkZWZhdWx0ICAgICA9IHllcworYWJzdHJhY3QgICAgPSBCYXR0ZXJ5IHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGUgZGV2aWNlIGNhbiBydW4gb24gYSBiYXR0ZXJ5LgorCisjIEFjY2VsZXJvbWV0ZXIgKHVzZWQgZm9yIGF1dG8tcm90YXRpb24pCituYW1lICAgICAgICA9IGh3LmFjY2VsZXJvbWV0ZXIKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gQWNjZWxlcm9tZXRlcgorZGVzY3JpcHRpb24gPSBXaGV0aGVyIHRoZXJlIGlzIGFuIGFjY2VsZXJvbWV0ZXIgaW4gdGhlIGRldmljZS4KKworIyBBdWRpbyBpbnB1dAorbmFtZSAgICAgICAgPSBody5hdWRpb0lucHV0Cit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IEF1ZGlvIHJlY29yZGluZyBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFdoZXRoZXIgdGhlIGRldmljZSBjYW4gcmVjb3JkIGF1ZGlvCisKKyMgQXVkaW8gb3V0cHV0CituYW1lICAgICAgICA9IGh3LmF1ZGlvT3V0cHV0Cit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IEF1ZGlvIHBsYXliYWNrIHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGUgZGV2aWNlIGNhbiBwbGF5IGF1ZGlvCisKKyMgU0RDYXJkIHN1cHBvcnQKK25hbWUgICAgICAgID0gaHcuc2RDYXJkCit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IFNEIENhcmQgc3VwcG9ydAorZGVzY3JpcHRpb24gPSBXaGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgaW5zZXJ0aW9uL3JlbW92YWwgb2YgdmlydHVhbCBTRCBDYXJkcy4KKworbmFtZSAgICAgICAgPSBody5zZENhcmQucGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0gU0QgQ2FyZCBpbWFnZSBwYXRoCisKKyMgQ2FjaGUgcGFydGl0aW9uCituYW1lICAgICAgICA9IGRpc2suY2FjaGVQYXJ0aXRpb24KK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gQ2FjaGUgcGFydGl0aW9uIHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB3ZSB1c2UgYSAvY2FjaGUgcGFydGl0aW9uIG9uIHRoZSBkZXZpY2UuCisKK25hbWUgICAgICAgID0gZGlzay5jYWNoZVBhcnRpdGlvbi5wYXRoCit0eXBlICAgICAgICA9IHN0cmluZworZGVmYXVsdCAgICAgPQorYWJzdHJhY3QgICAgPSBDYWNoZSBwYXJ0aXRpb24KK2Rlc2NyaXB0aW9uID0gQ2FjaGUgcGFydGl0aW9uIHRvIHVzZSBvbiB0aGUgZGV2aWNlLiBJZ25vcmVkIGlmIGRpc2suY2FjaGVQYXJ0aXRpb24gaXMgbm90ICd5ZXMnLgorCituYW1lICAgICAgICA9IGRpc2suY2FjaGVQYXJ0aXRpb24uc2l6ZQordHlwZSAgICAgICAgPSBkaXNrU2l6ZQorYWJzdHJhY3QgICAgPSBDYWNoZSBwYXJ0aXRpb24gc2l6ZQorZGVmYXVsdCAgICAgPSA2Nk1CCisKKyMgTENEIHdpZHRoCituYW1lICAgICAgICA9IGh3LmxjZC53aWR0aAordHlwZSAgICAgICAgPSBpbnRlZ2VyCitkZWZhdWx0ICAgICA9IDMyMAorYWJzdHJhY3QgICAgPSBMQ0QgcGl4ZWwgd2lkdGgKKworbmFtZSAgICAgICAgPSBody5sY2QuaGVpZ2h0Cit0eXBlICAgICAgICA9IGludGVnZXIKK2RlZmF1bHQgICAgID0gNjQwCithYnN0cmFjdCAgICA9IExDRCBwaXhlbCBoZWlnaHQKKworbmFtZSAgICAgICAgPSBody5sY2QuZGVwdGgKK3R5cGUgICAgICAgID0gaW50ZWdlcgorZW51bSAgICAgICAgPSAxNiwgMzIKK2RlZmF1bHQgICAgID0gMTYKK2Fic3RyYWN0ICAgID0gTENEIGNvbG9yIGRlcHRoCitkZXNjcmlwdGlvbiA9IENvbG9yIGJpdCBkZXB0aCBvZiBlbXVsYXRlZCBmcmFtZWJ1ZmZlci4KKworIyBMQ0QgZGVuc2l0eQorbmFtZSAgICAgICAgPSBody5sY2QuZGVuc2l0eQordHlwZSAgICAgICAgPSBpbnRlZ2VyCitlbnVtICAgICAgICA9IDEyMCwgMTYwLCAyNDAsIDIxMywgMzIwCitkZWZhdWx0ICAgICA9IDE2MAorYWJzdHJhY3QgICAgPSBBYnN0cmFjdGVkIExDRCBkZW5zaXR5CitkZXNjcmlwdGlvbiA9IEEgdmFsdWUgdXNlZCB0byByb3VnaGx5IGRlc2NyaWJlIHRoZSBkZW5zaXR5IG9mIHRoZSBMQ0Qgc2NyZWVuIGZvciBhdXRvbWF0aWMgcmVzb3VyY2UvYXNzZXQgc2VsZWN0aW9uLgorCisjIExDRCBiYWNrbGlnaHQgLSBFbmFibGUvRGlzYWJsZSBMQ0QgYmFja2xpZ2h0IHNpbXVsYXRpb24KKyMgZGVmYXVsdCA9IG5vICA6IERpc2FibGVkCisjIGRlZmF1bHQgPSB5ZXMgOiBFbmFibGVkCituYW1lICAgICAgICA9IGh3LmxjZC5iYWNrbGlnaHQKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gTENEIGJhY2tsaWdodAorZGVzY3JpcHRpb24gPSBFbmFibGUvRGlzYWJsZSBMQ0QgYmFja2xpZ2h0IHNpbXVsYXRpb24seWVzLWVuYWJsZWQsbm8tZGlzYWJsZWQuCisKKyMgSGFyZHdhcmUgT3BlbkdMRVMgZW11bGF0aW9uIHN1cHBvcnQKKyMKK25hbWUgICAgICAgID0gaHcuZ3B1LmVuYWJsZWQKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSBubworYWJzdHJhY3QgICAgPSBHUFUgZW11bGF0aW9uCitkZXNjcmlwdGlvbiA9IEVuYWJsZS9EaXNhYmxlIGVtdWxhdGVkIE9wZW5HTEVTIEdQVQorCituYW1lICAgICAgICA9IGh3LmdwdS5tb2RlCit0eXBlICAgICAgICA9IHN0cmluZworZGVmYXVsdCAgICAgPSBhdXRvCitlbnVtICAgICAgICA9IGF1dG8sIGhvc3QsIG1lc2EKK2Fic3RyYWN0ICAgID0gR1BVIGVtdWxhdGlvbiBtb2RlCitkZXNjcmlwdGlvbiA9IFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyBob3cgR1BVIGVtdWxhdGlvbiBpcyBpbXBsZW1lbnRlZC4KKworbmFtZSAgICAgICAgPSBody5ncHUuYmxhY2tsaXN0ZWQKK3R5cGUgICAgICAgID0gc3RyaW5nCitkZWZhdWx0ICAgICA9IG5vCitlbnVtICAgICAgICA9IG5vLCB5ZXMKK2Fic3RyYWN0ICAgID0gR1BVIG9uLWJsYWNrbGlzdCBtb2RlCitkZXNjcmlwdGlvbiA9IFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyBpZiB0aGUgR1BVIGlzIGNvbnNpZGVyZWQgYmxhY2tsaXN0ZWQuIFRlc3RpbmcgcHVycG9zZXMgb25seS4KKworIyBDb25maWd1cmVzIHRoZSBpbml0aWFsIG9yaWVudGF0aW9uOiBwb3J0cmFpdCBvciBsYW5kc2NhcGUKKyMKK25hbWUgICAgICAgID0gaHcuaW5pdGlhbE9yaWVudGF0aW9uCit0eXBlICAgICAgICA9IHN0cmluZworZW51bSAgICAgICAgPSBwb3J0cmFpdCwgbGFuZHNjYXBlCitkZWZhdWx0ICAgICA9IHBvcnRyYWl0CithYnN0cmFjdCAgICA9IEluaXRpYWwgc2NyZWVuIG9yaWVudGF0aW9uCitkZXNjcmlwdGlvbiA9IFNldHVwIGluaXRpYWwgc2NyZWVuIG9yaWVudGF0aW9uLCBjYW4gYmUgcm90YXRlZCBsYXRlciBvbi4KKworIyBDb25maWd1cmVzIGNhbWVyYSBmYWNpbmcgYmFjaworIworbmFtZSAgICAgICAgPSBody5jYW1lcmEuYmFjawordHlwZSAgICAgICAgPSBzdHJpbmcKK2VudW0gICAgICAgID0gZW11bGF0ZWQsIG5vbmUsIHdlYmNhbTAsIC4uLgorZGVmYXVsdCAgICAgPSBlbXVsYXRlZAorYWJzdHJhY3QgICAgPSBDb25maWd1cmVzIGNhbWVyYSBmYWNpbmcgYmFjaworZGVzY3JpcHRpb24gPSBNdXN0IGJlICdlbXVsYXRlZCcgZm9yIGEgZmFrZSBjYW1lcmEsICd3ZWJjYW08Tj4nIGZvciBhIHdlYiBjYW1lcmEsIG9yICdub25lJyBpZiBiYWNrIGNhbWVyYSBpcyBkaXNhYmxlZC4KKworIyBDb25maWd1cmVzIGNhbWVyYSBmYWNpbmcgZnJvbnQKKyMKK25hbWUgICAgICAgID0gaHcuY2FtZXJhLmZyb250Cit0eXBlICAgICAgICA9IHN0cmluZworZW51bSAgICAgICAgPSBlbXVsYXRlZCwgbm9uZSwgd2ViY2FtMCwgLi4uCitkZWZhdWx0ICAgICA9IG5vbmUKK2Fic3RyYWN0ICAgID0gQ29uZmlndXJlcyBjYW1lcmEgZmFjaW5nIGZyb250CitkZXNjcmlwdGlvbiA9IE11c3QgYmUgJ2VtdWxhdGVkJyBmb3IgYSBmYWtlIGNhbWVyYSwgJ3dlYmNhbTxOPicgZm9yIGEgd2ViIGNhbWVyYSwgb3IgJ25vbmUnIGlmIGZyb250IGNhbWVyYSBpcyBkaXNhYmxlZC4KKworIyBNYXhpbXVtIFZNIGhlYXAgc2l6ZQorIyBIaWdoZXIgdmFsdWVzIGFyZSByZXF1aXJlZCBmb3IgaGlnaC1kcGkgZGV2aWNlcworIyBEZWZhdWx0IHdpbGwgZGVwZW5kIG9uIFJBTSBzaXplLgorbmFtZSAgICAgICAgPSB2bS5oZWFwU2l6ZQordHlwZSAgICAgICAgPSBpbnRlZ2VyCitkZWZhdWx0ICAgICA9IDAKK2Fic3RyYWN0ICAgID0gTWF4IFZNIGFwcGxpY2F0aW9uIGhlYXAgc2l6ZQorZGVzY3JpcHRpb24gPSBUaGUgbWF4aW11bSBoZWFwIHNpemUgYSBEYWx2aWsgYXBwbGljYXRpb24gbWlnaHQgYWxsb2NhdGUgYmVmb3JlIGJlaW5nIGtpbGxlZCBieSB0aGUgc3lzdGVtLiBWYWx1ZSBpcyBpbiBtZWdhYnl0ZXMuCisKKyMgTGlnaHQgc2Vuc29yCituYW1lICAgICAgICA9IGh3LnNlbnNvcnMubGlnaHQKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gTGlnaHQgc3VwcG9ydAorZGVzY3JpcHRpb24gPSBXaGV0aGVyIHRoZXJlIGlzIGEgbGlnaHQgc2Vuc29yIGluIHRoZSBkZXZpY2UKKworIyBQcmVzc3VyZSBzZW5zb3IKK25hbWUgICAgICAgID0gaHcuc2Vuc29ycy5wcmVzc3VyZQordHlwZSAgICAgICAgPSBib29sZWFuCitkZWZhdWx0ICAgICA9IHllcworYWJzdHJhY3QgICAgPSBQcmVzc3VyZSBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFdoZXRoZXIgdGhlcmUgaXMgYSBwcmVzc3VyZSBzZW5zb3IgaW4gdGhlIGRldmljZQorCisjIEh1bWlkaXR5IHNlbnNvcgorbmFtZSAgICAgICAgPSBody5zZW5zb3JzLmh1bWlkaXR5Cit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IEh1bWlkaXR5IHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gV2hldGhlciB0aGVyZSBpcyBhIHJlbGF0aXZlIGh1bWlkaXR5IHNlbnNvciBpbiB0aGUgZGV2aWNlCisKKyMgUHJveGltaXR5IHNlbnNvcgorbmFtZSAgICAgICAgPSBody5zZW5zb3JzLnByb3hpbWl0eQordHlwZSAgICAgICAgPSBib29sZWFuCitkZWZhdWx0ICAgICA9IHllcworYWJzdHJhY3QgICAgPSBQcm94aW1pdHkgc3VwcG9ydAorZGVzY3JpcHRpb24gPSBXaGV0aGVyIHRoZXJlIGlzIGFuIHByb3hpbWl0eSBpbiB0aGUgZGV2aWNlLgorCisjIE1hZ25ldGljIGZpZWxkIHNlbnNvcgorbmFtZSAgICAgICAgPSBody5zZW5zb3JzLm1hZ25ldGljX2ZpZWxkCit0eXBlICAgICAgICA9IGJvb2xlYW4KK2RlZmF1bHQgICAgID0geWVzCithYnN0cmFjdCAgICA9IE1hZ25ldGljIGZpZWxkIHN1cHBvcnQKK2Rlc2NyaXB0aW9uID0gUHJvdmlkZXMgbWFnbmV0aWMgZmllbGQgc2Vuc29yIHZhbHVlcy4KKworIyBPcmllbnRhdGlvbiBzZW5zb3IKK25hbWUgICAgICAgID0gaHcuc2Vuc29ycy5vcmllbnRhdGlvbgordHlwZSAgICAgICAgPSBib29sZWFuCitkZWZhdWx0ICAgICA9IHllcworYWJzdHJhY3QgICAgPSBPcmllbnRhdGlvbiBzdXBwb3J0CitkZXNjcmlwdGlvbiA9IFByb3ZpZGVzIG9yaWVudGF0aW9uIHNlbnNvciB2YWx1ZXMuCisKKyMgVGVtcGVyYXR1cmUgc2Vuc29yCituYW1lICAgICAgICA9IGh3LnNlbnNvcnMudGVtcGVyYXR1cmUKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gVGVtcGVyYXR1cmUgc3VwcG9ydAorZGVzY3JpcHRpb24gPSBQcm92aWRlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgdmFsdWVzLgorCisjIEZpbGUgc3lzdGVtCituYW1lICAgICAgICA9IGh3LnVzZWV4dDQKK3R5cGUgICAgICAgID0gYm9vbGVhbgorZGVmYXVsdCAgICAgPSB5ZXMKK2Fic3RyYWN0ICAgID0gRGVwcmVjYXRlZCBvcHRpb24uIElnbm9yZWQuCitkZXNjcmlwdGlvbiA9IFVzZWQgdG8gc3BlY2lmeSB0aGUgRXh0NCBwYXJ0aXRpb24gaW1hZ2UgdHlwZS4gVGhpcyBpcyBub3cgYXV0b2RldGVjdGVkLgorCisjIEtlcm5lbCBpbWFnZS4KKyMKKyMga2VybmVsLnBhdGggICAgICAgIHNwZWNpZmllZCB0aGUgcGF0aCB0byB0aGUga2VybmVsIGltYWdlCisjIGtlcm5lbC5wYXJhbWV0ZXJzICBzcGVjaWZpZXMgdGhlIHN0cmluZyBvZiBrZXJuZWwgYm9vdCBwYXJhbWV0ZXJzLgorIworbmFtZSAgICAgICAgPSBrZXJuZWwucGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0gUGF0aCB0byB0aGUga2VybmVsIGltYWdlCitkZXNjcmlwdGlvbiA9IFBhdGggdG8gdGhlIGtlcm5lbCBpbWFnZS4KKworbmFtZSAgICAgICAgPSBrZXJuZWwucGFyYW1ldGVycwordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0ga2VybmVsIGJvb3QgcGFyYW1ldGVycyBzdHJpbmcuCisKK25hbWUgICAgICAgID0ga2VybmVsLm5ld0RldmljZU5hbWluZwordHlwZSAgICAgICAgPSBzdHJpbmcKK2VudW0gICAgICAgID0gYXV0b2RldGVjdCwgeWVzLCBubworZGVmYXVsdCAgICAgPSBhdXRvZGV0ZWN0CithYnN0cmFjdCAgICA9IERvZXMgdGhlIGtlcm5lbCByZXF1aXJlIGEgbmV3IGRldmljZSBuYW1pbmcgc2NoZW1lPworZGVzY3JpcHRpb24gPSBVc2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUga2VybmVsIHJlcXVpcmVzIGEgbmV3IGRldmljZSBuYW1pbmcgc2NoZW1lLiBUeXBpY2FsbHkgZm9yIExpbnV4IDMuMTAgYW5kIGFib3ZlLgorCituYW1lICAgICAgICA9IGtlcm5lbC5zdXBwb3J0c1lhZmZzMgordHlwZSAgICAgICAgPSBzdHJpbmcKK2VudW0gICAgICAgID0gYXV0b2RldGVjdCwgeWVzLCBubworZGVmYXVsdCAgICAgPSBhdXRvZGV0ZWN0CithYnN0cmFjdCAgICA9IERvZXMgdGhlIGtlcm5lbCBzdXBwb3J0cyBZQUZGUzIgcGFydGl0aW9ucz8KK2Rlc2NyaXB0aW9uID0gVXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGtlcm5lbCBzdXBwb3J0cyBZQUZGUzIgcGFydGl0aW9uIGltYWdlcy4gVHlwaWNhbGx5IGJlZm9yZSAzLjEwIG9ubHkuCisKKyMgUGF0aCB0byB0aGUgcmFtZGlzayBpbWFnZS4KK25hbWUgICAgICAgID0gZGlzay5yYW1kaXNrLnBhdGgKK3R5cGUgICAgICAgID0gc3RyaW5nCitkZWZhdWx0ICAgICA9CithYnN0cmFjdCAgICA9IFBhdGggdG8gdGhlIHJhbWRpc2sgaW1hZ2UKK2Rlc2NyaXB0aW9uID0gUGF0aCB0byB0aGUgcmFtZGlzayBpbWFnZS4KKworIyBTeXN0ZW0gcGFydGl0aW9uIGltYWdlKHMpLgorIworIyBkaXNrLnN5c3RlbVBhcnRpdGlvbi5wYXRoIHBvaW50cyB0byB0aGUgcmVhZC93cml0ZSBzeXN0ZW0gcGFydGl0aW9uIGltYWdlLgorIyAgIGlmIGVtcHR5LCBhIHRlbXBvcmFyeSBmaWxlIHdpbGwgYmUgY3JlYXRlZCwgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY29udGVudAorIyAgIG9mIC5pbml0UGF0aAorIworIyBkaXNrLnN5c3RlbVBhcnRpdGlvbi5pbml0UGF0aCBpcyBvbmx5IHVzZWQgd2hlbiAucGF0aCBpcyBlbXB0eS4gSXQgbXVzdAorIyB0aGVuIHBvaW50IHRvIGEgcmVhZC1vbmx5IGluaXRpYWxpemF0aW9uIHN5c3RlbSBpbWFnZSBmaWxlLgorIworIyBkaXNrLnN5c3RlbVBhcnRpdGlvbi5zaXplIGlzIHRoZSBpZGVhbCBzaXplIG9mIHRoZSBzeXN0ZW0gcGFydGl0aW9uLiBUaGUKKyMgc2l6ZSBpcyBpZ25vcmVkIGlmIHRoZSBhY3R1YWwgc3lzdGVtIHBhcnRpdGlvbiBpbWFnZSBpcyBsYXJnZXIuIE90aGVyd2lzZSwKKyMgaXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHNpemUgdGhlIGRpc2sgaW1hZ2UgZmlsZSBjYW4gZ3JvdyB0by4KKyMKK25hbWUgICAgICAgID0gZGlzay5zeXN0ZW1QYXJ0aXRpb24ucGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0gUGF0aCB0byBydW50aW1lIHN5c3RlbSBwYXJ0aXRpb24gaW1hZ2UKKworbmFtZSAgICAgICAgPSBkaXNrLnN5c3RlbVBhcnRpdGlvbi5pbml0UGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0gSW5pdGlhbCBzeXN0ZW0gcGFydGl0aW9uIGltYWdlCisKK25hbWUgICAgICAgID0gZGlzay5zeXN0ZW1QYXJ0aXRpb24uc2l6ZQordHlwZSAgICAgICAgPSBkaXNrU2l6ZQorZGVmYXVsdCAgICAgPSAwCithYnN0cmFjdCAgICA9IElkZWFsIHNpemUgb2Ygc3lzdGVtIHBhcnRpdGlvbgorCisjIFBhdGggdG8gdGhlIGRhdGEgcGFydGl0aW9uLgorbmFtZSAgICAgICAgPSBkaXNrLmRhdGFQYXJ0aXRpb24ucGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0gPHRlbXA+CithYnN0cmFjdCAgICA9IFBhdGggdG8gZGF0YSBwYXJ0aXRpb24gZmlsZQorZGVzY3JpcHRpb24gPSBQYXRoIHRvIGRhdGEgcGFydGl0aW9uIGZpbGUuIENhbm5vdCBiZSBlbXB0eS4gU3BlY2lhbCB2YWx1ZSA8dGVtcD4gbWVhbnMgdXNpbmcgYSB0ZW1wb3JhcnkgZmlsZS4gSWYgZGlzay5kYXRhUGFydGl0aW9uLmluaXRQYXRoIGlzIG5vdCBlbXB0eSwgaXRzIGNvbnRlbnQgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGRpc2suZGF0YVBhcnRpdGlvbi5wYXRoIGZpbGUgYXQgYm9vdC10aW1lLgorCisjIEluaXRpYWwgcGF0aCB0byB0aGUgZGF0YSBwYXJ0aXRpb24uCituYW1lICAgICAgICA9IGRpc2suZGF0YVBhcnRpdGlvbi5pbml0UGF0aAordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0KK2Fic3RyYWN0ICAgID0gSW5pdGlhbCBkYXRhIHBhcnRpdGlvbgorZGVzY3JpcHRpb24gPSBJZiBub3QgZW1wdHksIGl0cyBjb250ZW50IHdpbGwgYmUgY29waWVkIHRvIHRoZSBkaXNrLmRhdGFQYXJ0aXRpb24ucGF0aCBmaWxlIGF0IGJvb3QtdGltZS4KKworIyBEYXRhIHBhcnRpdGlvbiBzaXplLgorbmFtZSAgICAgICAgPSBkaXNrLmRhdGFQYXJ0aXRpb24uc2l6ZQordHlwZSAgICAgICAgPSBkaXNrU2l6ZQorZGVmYXVsdCAgICAgPSAwCithYnN0cmFjdCAgICA9IElkZWFsIHNpemUgb2YgZGF0YSBwYXJ0aXRpb24KKworIyBQYXRoIHRvIHRoZSBkYXRhIHBhcnRpdGlvbi4KK25hbWUgICAgICAgID0gZGlzay5lbmNyeXB0aW9uS2V5UGFydGl0aW9uLnBhdGgKK3R5cGUgICAgICAgID0gc3RyaW5nCitkZWZhdWx0ICAgICA9CithYnN0cmFjdCAgICA9IFBhdGggdG8gZW5jcnlwdGlvbiBrZXkgcGFydGl0aW9uIGZpbGUKK2Rlc2NyaXB0aW9uID0gUGF0aCB0byBlbmNyeXB0aW9uIGtleSBwYXJ0aXRpb24gZmlsZS4gU2hvdWxkIGJlIGF0IGxlYXN0IDE2SyBieXRlcyBlbXB0eSBkaXNrIHdpdGhvdXQgYW55IGZpbGVzeXN0ZW0gb24gaXQuCisKKyMgUGF0aCB0byB0aGUgc25hcHNob3RzIHN0b3JhZ2UgZmlsZS4KK25hbWUgICAgICAgID0gZGlzay5zbmFwU3RvcmFnZS5wYXRoCit0eXBlICAgICAgICA9IHN0cmluZworZGVmYXVsdCAgICAgPQorYWJzdHJhY3QgICAgPSBQYXRoIHRvIHNuYXBzaG90IHN0b3JhZ2UKK2Rlc2NyaXB0aW9uID0gUGF0aCB0byBhICdzbmFwc2hvdCBzdG9yYWdlJyBmaWxlLCB3aGVyZSBhbGwgc25hcHNob3RzIGFyZSBzdG9yZWQuCisKKyMgQW5kcm9pZCBBVkQgbmFtZQorIyBUaGlzIGlzIHNldCBhdXRvbWF0aWNhbGx5IGJlZm9yZSBsYXVuY2hpbmcgYSBjb3JlLgorIworbmFtZSAgICAgICAgPSBhdmQubmFtZQordHlwZSAgICAgICAgPSBzdHJpbmcKK2RlZmF1bHQgICAgID0gPGJ1aWxkPgorYWJzdHJhY3QgICAgPSBOYW1lIG9mIHRoZSBBVkQgYmVpbmcgcnVuCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2h3LWNvbmZpZy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9ody1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQ3MGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9ody1jb25maWcuYwpAQCAtMCwwICsxLDQ3NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9ody1jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9pbmkuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisKKy8qIHRoZSBnbG9iYWwgdmFyaWFibGUgY29udGFpbmluZyB0aGUgaGFyZHdhcmUgY29uZmlnIGZvciB0aGlzIGRldmljZSAqLworQW5kcm9pZEh3Q29uZmlnICAgYW5kcm9pZF9od1sxXTsKKworc3RhdGljIGludAorc3RyaW5nVG9Cb29sZWFuKCBjb25zdCBjaGFyKiB2YWx1ZSApCit7CisgICAgaWYgKCFzdHJjbXAodmFsdWUsIjEiKSAgICB8fAorICAgICAgICAhc3RyY21wKHZhbHVlLCJ5ZXMiKSAgfHwKKyAgICAgICAgIXN0cmNtcCh2YWx1ZSwiWUVTIikgIHx8CisgICAgICAgICFzdHJjbXAodmFsdWUsInRydWUiKSB8fAorICAgICAgICAhc3RyY21wKHZhbHVlLCJUUlVFIikpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludDY0X3QKK2Rpc2tTaXplVG9JbnQ2NCggY29uc3QgY2hhciogZGlza1NpemUgKQoreworICAgIGNoYXIqICAgZW5kOworICAgIGludDY0X3QgdmFsdWU7CisKKyAgICB2YWx1ZSA9IHN0cnRvbGwoZGlza1NpemUsICZlbmQsIDEwKTsKKyAgICBpZiAoKmVuZCA9PSAnaycgfHwgKmVuZCA9PSAnSycpCisgICAgICAgIHZhbHVlICo9IDEwMjRVTEw7CisgICAgZWxzZSBpZiAoKmVuZCA9PSAnbScgfHwgKmVuZCA9PSAnTScpCisgICAgICAgIHZhbHVlICo9IDEwMjQqMTAyNFVMTDsKKyAgICBlbHNlIGlmICgqZW5kID09ICdnJyB8fCAqZW5kID09ICdHJykKKyAgICAgICAgdmFsdWUgKj0gMTAyNCoxMDI0KjEwMjRVTEw7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKwordm9pZAorYW5kcm9pZEh3Q29uZmlnX2luaXQoIEFuZHJvaWRId0NvbmZpZyogIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBhcGlMZXZlbCApCit7CisjZGVmaW5lICAgSFdDRkdfQk9PTChuLHMsZCxhLHQpICAgICAgIGNvbmZpZy0+biA9IHN0cmluZ1RvQm9vbGVhbihkKTsKKyNkZWZpbmUgICBIV0NGR19JTlQobixzLGQsYSx0KSAgICAgICAgY29uZmlnLT5uID0gZDsKKyNkZWZpbmUgICBIV0NGR19TVFJJTkcobixzLGQsYSx0KSAgICAgY29uZmlnLT5uID0gQVNUUkRVUChkKTsKKyNkZWZpbmUgICBIV0NGR19ET1VCTEUobixzLGQsYSx0KSAgICAgY29uZmlnLT5uID0gZDsKKyNkZWZpbmUgICBIV0NGR19ESVNLU0laRShuLHMsZCxhLHQpICAgY29uZmlnLT5uID0gZGlza1NpemVUb0ludDY0KGQpOworCisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvaHctY29uZmlnLWRlZnMuaCIKKworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgaHcua2V5Ym9hcmQubGlkLCB3ZSBuZWVkIHRvIHNldCB0aGUKKyAgICAgKiBkZWZhdWx0IHRvIEZBTFNFIGZvciBhcGlMZXZlbCA+PSAxMi4gVGhpcyBhbGxvd3MgcGxhdGZvcm0gYnVpbGRzCisgICAgICogdG8gZ2V0IGNvcnJlY3Qgb3JpZW50YXRpb24gZW11bGF0aW9uIGV2ZW4gaWYgdGhleSBkb24ndCBicmluZworICAgICAqIGEgY3VzdG9tIGhhcmR3YXJlLmluaQorICAgICAqLworICAgIGlmIChhcGlMZXZlbCA+PSAxMikgeworICAgICAgICBjb25maWctPmh3X2tleWJvYXJkX2xpZCA9IDA7CisgICAgfQorfQorCitpbnQgYW5kcm9pZEh3Q29uZmlnX3JlYWQoQW5kcm9pZEh3Q29uZmlnKiBjb25maWcsIENJbmlGaWxlKiBpbmkpIHsKKyAgICBpZiAoaW5pID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHVzZSB0aGUgbWFnaWMgb2YgbWFjcm9zIHRvIGltcGxlbWVudCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBsb2FkZWQgKi8KKworI2RlZmluZSAgIEhXQ0ZHX0JPT0wobixzLGQsYSx0KSAgICAgICBpZiAoaW5pRmlsZV9oYXNLZXkoaW5pLCBzKSkgeyBjb25maWctPm4gPSBpbmlGaWxlX2dldEJvb2xlYW4oaW5pLCBzLCBkKTsgfQorI2RlZmluZSAgIEhXQ0ZHX0lOVChuLHMsZCxhLHQpICAgICAgICBpZiAoaW5pRmlsZV9oYXNLZXkoaW5pLCBzKSkgeyBjb25maWctPm4gPSBpbmlGaWxlX2dldEludGVnZXIoaW5pLCBzLCBkKTsgfQorI2RlZmluZSAgIEhXQ0ZHX1NUUklORyhuLHMsZCxhLHQpICAgICBpZiAoaW5pRmlsZV9oYXNLZXkoaW5pLCBzKSkgeyBBRlJFRShjb25maWctPm4pOyBjb25maWctPm4gPSBpbmlGaWxlX2dldFN0cmluZyhpbmksIHMsIGQpOyB9CisjZGVmaW5lICAgSFdDRkdfRE9VQkxFKG4scyxkLGEsdCkgICAgIGlmIChpbmlGaWxlX2hhc0tleShpbmksIHMpKSB7IGNvbmZpZy0+biA9IGluaUZpbGVfZ2V0RG91YmxlKGluaSwgcywgZCk7IH0KKyNkZWZpbmUgICBIV0NGR19ESVNLU0laRShuLHMsZCxhLHQpICAgaWYgKGluaUZpbGVfaGFzS2V5KGluaSwgcykpIHsgY29uZmlnLT5uID0gaW5pRmlsZV9nZXREaXNrU2l6ZShpbmksIHMsIGQpOyB9CisKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9ody1jb25maWctZGVmcy5oIgorCisgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB0aGUgU0QtQ2FyZCwgdGhlIEFWRCBNYW5hZ2VyIGNhbiBpbmNvcnJlY3RseSBjcmVhdGUKKyAgICAvLyBhIG5ldyBBVkQgd2l0aCAnc2RjYXJkLnNpemU9PHNpemU+JyBhbmQgJ2h3LnNkQ2FyZD1ubycuIEl0J3Mgbm90IHN1cmUKKyAgICAvLyB3aGV0aGVyIHRoaXMgb2NjdXJzIHdoZW4gdXBkYXRpbmcgYW4gQVZEIHNldHRpbmdzIG9yIG5vdCwgYnV0IGl0IGhhcworICAgIC8vIGJlZW4gZGVzY3JpYmVkIGluOgorICAgIC8vICAgICAgIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTY4NDI5CisgICAgLy8KKyAgICAvLyAnc2RjYXJkLnNpemUnIGlzIG5vdCBhIGhhcmR3YXJlIHByb3BlcnR5LCBzbyBsb29rIGl0IHVwIGRpcmVjdGx5IGluCisgICAgLy8gdGhlIGluaXRGaWxlKCkgaGVyZSBhbmQgb3ZlcnJpZGUgYSBuZWdhdGl2ZSBody5zZENhcmQgdmFsdWUgaWYgaXQKKyAgICAvLyBpcyBzdHJpY3RseSBwb3NpdGl2ZS4KKyAgICBpZiAoIWNvbmZpZy0+aHdfc2RDYXJkKSB7CisgICAgICAgIGlmIChpbmlGaWxlX2dldERpc2tTaXplKGluaSwgInNkY2FyZC5zaXplIiwgIjAiKSA+IDApIHsKKyAgICAgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIk92ZXJyaWRpbmcgaHcuc2RDYXJkIHRvICd0cnVlJyBkdWUgdG8gcG9zaXRpdmUgc2RjYXJkLnNpemUgdmFsdWUhIik7CisgICAgICAgICAgICBjb25maWctPmh3X3NkQ2FyZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhbmRyb2lkSHdDb25maWdfd3JpdGUoQW5kcm9pZEh3Q29uZmlnKiBjb25maWcsIENJbmlGaWxlKiBpbmkpIHsKKyAgICBpZiAoaW5pID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHVzZSB0aGUgbWFnaWMgb2YgbWFjcm9zIHRvIGltcGxlbWVudCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBsb2FkZWQgKi8KKworI2RlZmluZSAgIEhXQ0ZHX0JPT0wobixzLGQsYSx0KSAgICAgICBpbmlGaWxlX3NldEJvb2xlYW4oaW5pLCBzLCBjb25maWctPm4pOworI2RlZmluZSAgIEhXQ0ZHX0lOVChuLHMsZCxhLHQpICAgICAgICBpbmlGaWxlX3NldEludGVnZXIoaW5pLCBzLCBjb25maWctPm4pOworI2RlZmluZSAgIEhXQ0ZHX1NUUklORyhuLHMsZCxhLHQpICAgICBpbmlGaWxlX3NldFZhbHVlKGluaSwgcywgY29uZmlnLT5uKTsKKyNkZWZpbmUgICBIV0NGR19ET1VCTEUobixzLGQsYSx0KSAgICAgaW5pRmlsZV9zZXREb3VibGUoaW5pLCBzLCBjb25maWctPm4pOworI2RlZmluZSAgIEhXQ0ZHX0RJU0tTSVpFKG4scyxkLGEsdCkgICBpbmlGaWxlX3NldERpc2tTaXplKGluaSwgcywgY29uZmlnLT5uKTsKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2h3LWNvbmZpZy1kZWZzLmgiCisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorYW5kcm9pZEh3Q29uZmlnX2RvbmUoIEFuZHJvaWRId0NvbmZpZyogY29uZmlnICkKK3sKKyNkZWZpbmUgICBIV0NGR19CT09MKG4scyxkLGEsdCkgICAgICAgY29uZmlnLT5uID0gMDsKKyNkZWZpbmUgICBIV0NGR19JTlQobixzLGQsYSx0KSAgICAgICAgY29uZmlnLT5uID0gMDsKKyNkZWZpbmUgICBIV0NGR19TVFJJTkcobixzLGQsYSx0KSAgICAgQUZSRUUoY29uZmlnLT5uKTsKKyNkZWZpbmUgICBIV0NGR19ET1VCTEUobixzLGQsYSx0KSAgICAgY29uZmlnLT5uID0gMC4wOworI2RlZmluZSAgIEhXQ0ZHX0RJU0tTSVpFKG4scyxkLGEsdCkgICBjb25maWctPm4gPSAwOworCisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvaHctY29uZmlnLWRlZnMuaCIKK30KKworaW50CithbmRyb2lkSHdDb25maWdfaXNTY3JlZW5Ob1RvdWNoKCBBbmRyb2lkSHdDb25maWcqIGNvbmZpZyApCit7CisgICAgcmV0dXJuIHN0cmNtcChjb25maWctPmh3X3NjcmVlbiwgIm5vLXRvdWNoIikgPT0gMDsKK30KKworaW50CithbmRyb2lkSHdDb25maWdfaXNTY3JlZW5Ub3VjaCggQW5kcm9pZEh3Q29uZmlnKiBjb25maWcgKQoreworICAgIHJldHVybiBzdHJjbXAoY29uZmlnLT5od19zY3JlZW4sICJ0b3VjaCIpID09IDA7Cit9CisKK2ludAorYW5kcm9pZEh3Q29uZmlnX2lzU2NyZWVuTXVsdGlUb3VjaCggQW5kcm9pZEh3Q29uZmlnKiBjb25maWcgKQoreworICAgIHJldHVybiBzdHJjbXAoY29uZmlnLT5od19zY3JlZW4sICJtdWx0aS10b3VjaCIpID09IDA7Cit9CisKK2h3TGNkX3NjcmVlblNpemVfdAorYW5kcm9pZEh3Q29uZmlnX2dldFNjcmVlblNpemUoIEFuZHJvaWRId0NvbmZpZyogY29uZmlnICkKK3sKKyAgICByZXR1cm4gaHdMY2RfZ2V0U2NyZWVuU2l6ZShjb25maWctPmh3X2xjZF9oZWlnaHQsIGNvbmZpZy0+aHdfbGNkX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmh3X2xjZF9kZW5zaXR5KTsKK30KKworaW50IGFuZHJvaWRId0NvbmZpZ19nZXRNaW5WbUhlYXBTaXplKEFuZHJvaWRId0NvbmZpZyogY29uZmlnLCBpbnQgYXBpTGV2ZWwpIHsKKyAgICBpbnQgbWluVk1IZWFwU2l6ZSA9IDE2OworICAgIGh3TGNkX3NjcmVlblNpemVfdCBzY3JlZW5TaXplID0gYW5kcm9pZEh3Q29uZmlnX2dldFNjcmVlblNpemUoY29uZmlnKTsKKyAgICAvLyBUYWtlbiBmcm9tIHJlcXVpcmVtZW50cyBpbiBDREQgRG9jdW1lbnRzIG9uIFZNL1J1bnRpbWUgQ29tcGF0aWJpbGl0eQorICAgIC8vIFRPRE86IGFuZHJvaWQgd2VhciBtaW5pbXVtcworICAgIGlmIChhcGlMZXZlbCA+PSAyMykgeworICAgICAgICBpZiAoc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9YTEFSR0UpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oenl5KTogZW11bGF0b3IgY3VycmVudGx5IGlzIHVuYWJsZSB0byBhbGxvY2F0ZSBhIGhlYXAgdGhpcworICAgICAgICAgICAgLy8gYmlnLCBzbyBpdCBnZXRzIHJlZHVjZWQgdG8gNTc2IGluIG1haW4tY29tbW9uLmMKKyAgICAgICAgICAgIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hYWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNzY4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzU2MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA1NzY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDM4NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV80MjBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzM2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyODg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfMzYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDI0MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxOTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfMjgwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE0NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX01EUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gODA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA0ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzY3JlZW5TaXplID49IExDRF9TSVpFX0xBUkdFKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWFhIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDUxMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV81NjBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzg0OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyNTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNDIwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDIyODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV80MDBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTkyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzM2MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzI4MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDgwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDgwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX01EUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9TTUFMTAorICAgICAgICAgICAgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyNTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNTYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE5MjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQyMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxMTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNDAwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzM2MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA4MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA4MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV8yODBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9UVkRQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9NRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFwaUxldmVsID49IDIyKSB7CisgICAgICAgIGlmIChzY3JlZW5TaXplID49IExDRF9TSVpFX1hMQVJHRSkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA3Njg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNTYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDU3NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzg0OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyODg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTkyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzI4MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNDQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9UVkRQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9NRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDgwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9MQVJHRSkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA1MTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNTYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDM4NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMjU2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxOTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzI4MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDgwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDgwOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX01EUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9TTUFMTAorICAgICAgICAgICAgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyNTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNTYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE5MjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA4MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV8yODBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9UVkRQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA0ODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9NRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbHNlIGlmIChhcGlMZXZlbCA+PSAyMSkgeworICAgICAgICBpZiAoc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9YTEFSR0UpIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hYWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNzY4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzU2MERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA1NzY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDM4NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV80MDBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMjg4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE5MjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNjQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9MQVJHRSkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWFhYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA1MTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNTYwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDM4NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMjU2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxOTI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX0hEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfVFZEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfTURQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE2OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBzY3JlZW5TaXplID49IExDRF9TSVpFX1NNQUxMCisgICAgICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWFhIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDI1NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV81NjBEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTkyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxMjg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNDAwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDk2OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hIRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDY0OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX0hEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfVFZEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfTURQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhcGlMZXZlbCA+PSAxOSkgeworICAgICAgICBpZiAoc2NyZWVuU2l6ZSA+PSBMQ0RfU0laRV9YTEFSR0UpIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1hYSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyNTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfNDAwRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDE5MjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxMjg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9UVkRQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBzY3JlZW5TaXplID49IExDRF9TSVpFX1NNQUxMCisgICAgICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YWEhEUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTI4OworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZXzQwMERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX01EUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPj0gMTQpIHsKKyAgICAgICAgaWYgKHNjcmVlblNpemUgPj0gTENEX1NJWkVfWExBUkdFKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxMjg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+aHdfbGNkX2RlbnNpdHkgPj0gTENEX0RFTlNJVFlfSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9UVkRQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBzY3JlZW5TaXplID49IExDRF9TSVpFX1NNQUxMCisgICAgICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9YSERQSSkgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSA2NDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSBMQ0RfREVOU0lUWV9IRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX1RWRFBJKSB7CisgICAgICAgICAgICAgICAgbWluVk1IZWFwU2l6ZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWctPmh3X2xjZF9kZW5zaXR5ID49IExDRF9ERU5TSVRZX01EUEkpIHsKKyAgICAgICAgICAgICAgICBtaW5WTUhlYXBTaXplID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPj0gNykgeworICAgICAgICBpZiAoY29uZmlnLT5od19sY2RfZGVuc2l0eSA+PSAyNDApIHsKKyAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAyNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1pblZNSGVhcFNpemUgPSAxNjsKKyAgICB9CisgICAgcmV0dXJuIG1pblZNSGVhcFNpemU7Cit9CisKK2ludCBhbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsRGV2aWNlTmFtaW5nKEFuZHJvaWRId0NvbmZpZyogY29uZmlnKSB7CisgICAgaWYgKCFzdHJjbXAoY29uZmlnLT5rZXJuZWxfbmV3RGV2aWNlTmFtaW5nLCAibm8iKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFzdHJjbXAoY29uZmlnLT5rZXJuZWxfbmV3RGV2aWNlTmFtaW5nLCAieWVzIikpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAtMTsKK30KKworaW50CithbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsWWFmZnMyU3VwcG9ydCggQW5kcm9pZEh3Q29uZmlnKiBjb25maWcgKQoreworICAgIGlmICghc3RyY21wKGNvbmZpZy0+a2VybmVsX3N1cHBvcnRzWWFmZnMyLCAibm8iKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFzdHJjbXAoY29uZmlnLT5rZXJuZWxfc3VwcG9ydHNZYWZmczIsICJ5ZXMiKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIC0xOworfQorCitjb25zdCBjaGFyKiBhbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsU2VyaWFsUHJlZml4KEFuZHJvaWRId0NvbmZpZyogY29uZmlnICkKK3sKKyAgICBpZiAoYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbERldmljZU5hbWluZyhjb25maWcpID49IDEpIHsKKyAgICAgICAgcmV0dXJuICJ0dHlHRiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJ0dHlTIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2h3LWNvbmZpZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9ody1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2RkYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9ody1jb25maWcuaApAQCAtMCwwICsxLDk4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2luaS5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctbGNkLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKwordHlwZWRlZiBjaGFyICAgICAgaHdfYm9vbF90OwordHlwZWRlZiBpbnQgICAgICAgaHdfaW50X3Q7Cit0eXBlZGVmIGludDY0X3QgICBod19kaXNrc2l6ZV90OwordHlwZWRlZiBjaGFyKiAgICAgaHdfc3RyaW5nX3Q7Cit0eXBlZGVmIGRvdWJsZSAgICBod19kb3VibGVfdDsKKworLyogdGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgZmllbGRzIG9mIEFuZHJvaWRId0NvbmZpZworICogZGVjbGFyZWQgYmVsb3cKKyAqLworI2RlZmluZSAgIEhXQ0ZHX0JPT0wobixzLGQsYSx0KSAgICAgICBod19ib29sX3QgICAgICBuOworI2RlZmluZSAgIEhXQ0ZHX0lOVChuLHMsZCxhLHQpICAgICAgICBod19pbnRfdCAgICAgICBuOworI2RlZmluZSAgIEhXQ0ZHX1NUUklORyhuLHMsZCxhLHQpICAgICBod19zdHJpbmdfdCAgICBuOworI2RlZmluZSAgIEhXQ0ZHX0RPVUJMRShuLHMsZCxhLHQpICAgICBod19kb3VibGVfdCAgICBuOworI2RlZmluZSAgIEhXQ0ZHX0RJU0tTSVpFKG4scyxkLGEsdCkgICBod19kaXNrc2l6ZV90ICBuOworCit0eXBlZGVmIHN0cnVjdCB7CisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvaHctY29uZmlnLWRlZnMuaCIKK30gQW5kcm9pZEh3Q29uZmlnOworCisvKiBTZXQgYWxsIGRlZmF1bHQgdmFsdWVzLCBiYXNlZCBvbiB0aGUgdGFyZ2V0IEFQSSBsZXZlbCAqLwordm9pZCBhbmRyb2lkSHdDb25maWdfaW5pdCggQW5kcm9pZEh3Q29uZmlnKiAgaHdDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICBhcGlMZXZlbCApOworCisvKiByZWFkcyBhIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tIGRpc2suCisgKiByZXR1cm5zIC0xIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLCBvciAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqCisgKiBub3RlIHRoYXQgZGVmYXVsdCB2YWx1ZXMgYXJlIHdyaXR0ZW4gdG8gaHdDb25maWcgaWYgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIGZpbGUgZG9lc24ndCBoYXZlIHRoZSBjb3JyZXNwb25kaW5nIGhhcmR3YXJlIHByb3BlcnRpZXMuCisgKi8KK2ludCBhbmRyb2lkSHdDb25maWdfcmVhZChBbmRyb2lkSHdDb25maWcqIGh3Q29uZmlnLCBDSW5pRmlsZSogY29uZmlnRmlsZSk7CisKKy8qIFdyaXRlIGEgaGFyZHdhcmUgY29uZmlndXJhdGlvbiB0byBhIGNvbmZpZyBmaWxlIG9iamVjdC4KKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuIE5vdGUgdGhhdCBhbnkgdmFsdWUgdGhhdCBpcyBzZXQgdG8gdGhlCisgKiBkZWZhdWx0IHdpbGwgbm90IGJldCB3cml0dGVuLgorICovCitpbnQgYW5kcm9pZEh3Q29uZmlnX3dyaXRlKEFuZHJvaWRId0NvbmZpZyogaHdDb25maWcsIENJbmlGaWxlKiBjb25maWdGaWxlKTsKKworLyogRmluYWxpemUgYSBnaXZlbiBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCit2b2lkIGFuZHJvaWRId0NvbmZpZ19kb25lKCBBbmRyb2lkSHdDb25maWcqIGNvbmZpZyApOworCisvKiBDaGVja3MgaWYgc2NyZWVuIGRvZXNuJ3Qgc3VwcG9ydCB0b3VjaCwgb3IgbXVsdGktdG91Y2ggKi8KK2ludCAgYW5kcm9pZEh3Q29uZmlnX2lzU2NyZWVuTm9Ub3VjaCggQW5kcm9pZEh3Q29uZmlnKiBjb25maWcgKTsKKy8qIENoZWNrcyBpZiBzY3JlZW4gc3VwcG9ydHMgdG91Y2ggKGJ1dCBub3QgbXVsdGktdG91Y2gpLiAqLworaW50ICBhbmRyb2lkSHdDb25maWdfaXNTY3JlZW5Ub3VjaCggQW5kcm9pZEh3Q29uZmlnKiBjb25maWcgKTsKKy8qIENoZWNrcyBpZiBzY3JlZW4gc3VwcG9ydHMgbXVsdGktdG91Y2guICovCitpbnQgIGFuZHJvaWRId0NvbmZpZ19pc1NjcmVlbk11bHRpVG91Y2goIEFuZHJvaWRId0NvbmZpZyogY29uZmlnICk7CisKKy8qIFJldHVybnMgdGhlIFNjcmVlbiBTaXplICovCitod0xjZF9zY3JlZW5TaXplX3QgYW5kcm9pZEh3Q29uZmlnX2dldFNjcmVlblNpemUoQW5kcm9pZEh3Q29uZmlnKiBjb25maWcpOworCisvKiBSZXR1cm5zIENERCBkZWZpbmVkIG1pbmltdW0gaGVhcCBzaXplIGluIE1CICovCitpbnQgYW5kcm9pZEh3Q29uZmlnX2dldE1pblZtSGVhcFNpemUoQW5kcm9pZEh3Q29uZmlnKiBjb25maWcsIGludCBhcGlMZXZlbCk7CisKKy8vIFJldHVybiBhbiBpbnRlZ2VyIGluZGljYXRpbmcgaWYgdGhlIGtlcm5lbCByZXF1aXJlcyBhIG5ldyBkZXZpY2UKKy8vIG5hbWluZyBzY2hlbWUuIE1vcmUgc3BlY2lmaWNhbGx5OgorLy8gIC0xIC0+IGRvbid0IGtub3csIGNhbGxlciB3aWxsIG5lZWQgdG8gYXV0by1kZXRlY3QuCisvLyAgIDAgLT4gbGVnYWN5IGRldmljZSBuYW1pbmcKKy8vICAgMSAtPiBuZXcgZGV2aWNlIG5hbWluZy4KKy8vCisvLyBUaGUgbmV3IGRldmljZSBuYW1pbmcgd2FzIGFsbGVnZWRseSBpbnRyb2R1Y2VkIGluIExpbnV4IDMuMTAgYW5kCisvLyByZXBsYWNlcyAvZGV2L3R0eVM8bnVtIHdpdGggL2Rldi90dHlHRjxudW0+LiBBbHNvIHNlZSByZWxhdGVkCisvLyBkZWNsYXJhdGlvbnMgaW4gYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzLmgKK2ludCBhbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsRGV2aWNlTmFtaW5nKCBBbmRyb2lkSHdDb25maWcqIGNvbmZpZyApOworCisvLyBSZXR1cm4gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGlzIHRoZSBrZXJuZWwgc3VwcG9ydHMgWUFGRlMyIHBhcnRpdGlvbgorLy8gaW1hZ2VzLiBNb3JlIHNwZWNpZmljYWxseToKKy8vICAtMSAtPiBkb24ndCBrbm93LCBjYWxsZXIgd2lsbCBuZWVkIHRvIGF1dG8tZGV0ZWN0LgorLy8gICAwIC0+IGRvZXMgbm90IHN1cHBvcnQgWUFGRlMyIHBhcnRpdGlvbnMuCisvLyAgIDEgLT4gZG9lcyBzdXBwb3J0IFlBRkZTMiBwYXJ0aXRpb25zLgoraW50IGFuZHJvaWRId0NvbmZpZ19nZXRLZXJuZWxZYWZmczJTdXBwb3J0KCBBbmRyb2lkSHdDb25maWcqIGNvbmZpZyApOworCisvLyBSZXR1cm4gdGhlIGtlcm5lbCBkZXZpY2UgcHJlZml4IGZvciBzZXJpYWwgcG9ydHMsIGRlcGVuZGluZyBvbgorLy8ga2VybmVsLm5ld0RldmljZU5hbWluZy4KK2NvbnN0IGNoYXIqIGFuZHJvaWRId0NvbmZpZ19nZXRLZXJuZWxTZXJpYWxQcmVmaXgoIEFuZHJvaWRId0NvbmZpZyogY29uZmlnICk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9pbmZvLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTY5MzUxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9pbmZvLmMKQEAgLTAsMCArMSwxNDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2luZm8uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYXZkL3V0aWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9rZXlzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlbG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW5pLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RlbXBmaWxlLmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIGdsb2JhbCB2YXJpYWJsZXMgLSBzZWUgYW5kcm9pZC9nbG9iYWxzLmggKi8KK0F2ZEluZm9QYXJhbXMgICBhbmRyb2lkX2F2ZFBhcmFtc1sxXTsKK0F2ZEluZm8qICAgICAgICBhbmRyb2lkX2F2ZEluZm87CisKKy8qIGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgIEQoLi4uKSAgIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEREKC4uLikgIFZFUkJPU0VfUFJJTlQoYXZkX2NvbmZpZyxfX1ZBX0FSR1NfXykKKworLyogdGVjaG5pY2FsIG5vdGUgb24gaG93IGFsbCBvZiB0aGlzIGlzIHN1cHBvc2VkIHRvIHdvcms6CisgKgorICogRWFjaCBBVkQgY29ycmVzcG9uZHMgdG8gYSAiY29udGVudCBkaXJlY3RvcnkiIHRoYXQgaXMgdXNlZCB0bworICogc3RvcmUgcGVyc2lzdGVudCBkaXNrIGltYWdlcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4gTW9zdCByZW1hcmthYmxlCisgKiBhcmU6CisgKgorICogLSBhICJjb25maWcuaW5pIiBmaWxlIHVzZWQgdG8gaG9sZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUKKyAqICAgQVZECisgKgorICogLSBtYW5kYXRvcnkgdXNlciBkYXRhIGltYWdlICgidXNlcmRhdGEtcWVtdS5pbWciKSBhbmQgY2FjaGUgaW1hZ2UKKyAqICAgKCJjYWNoZS5pbWciKQorICoKKyAqIC0gb3B0aW9uYWwgbXV0YWJsZSBzeXN0ZW0gaW1hZ2UgKCJzeXN0ZW0tcWVtdS5pbWciKSwga2VybmVsIGltYWdlCisgKiAgICgia2VybmVsLXFlbXUiKSBhbmQgcmVhZC1vbmx5IHJhbWRpc2sgKCJyYW1kaXNrLmltZyIpCisgKgorICogV2hlbiBzdGFydGluZyB1cCBhbiBBVkQsIHRoZSBlbXVsYXRvciBsb29rcyBmb3IgcmVsZXZhbnQgZGlzayBpbWFnZXMKKyAqIGluIHRoZSBjb250ZW50IGRpcmVjdG9yeS4gSWYgaXQgZG9lc24ndCBmaW5kIGEgZ2l2ZW4gaW1hZ2UgdGhlcmUsIGl0CisgKiB3aWxsIHRyeSB0byBzZWFyY2ggaW4gdGhlIGxpc3Qgb2Ygc3lzdGVtIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiB0aGUKKyAqICdjb25maWcuaW5pJyBmaWxlIHRocm91Z2ggb25lIG9mIHRoZSBmb2xsb3dpbmcgKGtleSx2YWx1ZSkgcGFpcnM6CisgKgorICogICAgaW1hZ2VzLnN5c2Rpci4xID0gPGZpcnN0IHNlYXJjaCBwYXRoPgorICogICAgaW1hZ2VzLnN5c2Rpci4yID0gPHNlY29uZCBzZWFyY2ggcGF0aD4KKyAqCisgKiBUaGUgc2VhcmNoIHBhdGhzIGNhbiBiZSBhYnNvbHV0ZSwgb3IgcmVsYXRpdmUgdG8gdGhlIHJvb3QgU0RLIGluc3RhbGxhdGlvbgorICogcGF0aCAod2hpY2ggaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbXVsYXRvciBwcm9ncmFtJ3MgbG9jYXRpb24sIG9yIGZyb20gdGhlCisgKiBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlKS4KKyAqCisgKiBJbmRpdmlkdWFsIGltYWdlIGRpc2sgc2VhcmNoIHBhdGNoIGNhbiBiZSBvdmVyLXJpZGVuIG9uIHRoZSBjb21tYW5kLWxpbmUKKyAqIHdpdGggb25lIG9mIHRoZSB1c3VhbCBvcHRpb25zLgorICovCisKKy8qIGNlcnRhaW4gZGlzayBpbWFnZSBmaWxlcyBhcmUgbW91bnRlZCByZWFkL3dyaXRlIGJ5IHRoZSBlbXVsYXRvcgorICogdG8gZW5zdXJlIHRoYXQgc2V2ZXJhbCBlbXVsYXRvcnMgcmVmZXJlbmNpbmcgdGhlIHNhbWUgZmlsZXMKKyAqIGRvIG5vdCBjb3JydXB0IHRoZXNlIGZpbGVzLCB3ZSBuZWVkIHRvIGxvY2sgdGhlbSBhbmQgcmVzcG9uZAorICogdG8gY29sbGlzaW9uIGRlcGVuZGluZyBvbiB0aGUgaW1hZ2UgdHlwZS4KKyAqCisgKiB0aGUgZW51bWVyYXRpb24gYmVsb3cgaXMgdXNlZCB0byByZWNvcmQgaW5mb3JtYXRpb24gYWJvdXQKKyAqIGVhY2ggaW1hZ2UgZmlsZSBwYXRoLgorICoKKyAqIFJFQURPTkxZIG1lYW5zIHRoYXQgdGhlIGZpbGUgd2lsbCBiZSBtb3VudGVkIHJlYWQtb25seQorICogYW5kIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIGxvY2tlZC4gbXVzdCBiZSBmaXJzdCBpbiBsaXN0CisgKgorICogTVVTVExPQ0sgbWVhbnMgdGhhdCB0aGUgZmlsZSBzaG91bGQgYmUgbG9ja2VkIGJlZm9yZQorICogYmVpbmcgbW91bnRlZCBieSB0aGUgZW11bGF0b3IKKyAqCisgKiBURU1QT1JBUlkgbWVhbnMgdGhhdCB0aGUgZmlsZSBoYXMgYmVlbiBjb3BpZWQgdG8gYQorICogdGVtcG9yYXJ5IGltYWdlLCB3aGljaCBjYW4gYmUgbW91bnRlZCByZWFkL3dyaXRlCisgKiBidXQgZG9lc24ndCByZXF1aXJlIGxvY2tpbmcuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSU1BR0VfU1RBVEVfUkVBRE9OTFksICAgICAvKiB1bmxvY2tlZCAqLworICAgIElNQUdFX1NUQVRFX01VU1RMT0NLLCAgICAgLyogbXVzdCBiZSBsb2NrZWQgKi8KKyAgICBJTUFHRV9TVEFURV9MT0NLRUQsICAgICAgIC8qIGxvY2tlZCAqLworICAgIElNQUdFX1NUQVRFX0xPQ0tFRF9FTVBUWSwgLyogbG9ja2VkIGFuZCBlbXB0eSAqLworICAgIElNQUdFX1NUQVRFX1RFTVBPUkFSWSwgICAgLyogY29waWVkIHRvIHRlbXAgZmlsZSAobm8gbG9jayBuZWVkZWQpICovCit9IEF2ZEltYWdlU3RhdGU7CisKK3N0cnVjdCBBdmRJbmZvIHsKKyAgICAvKiBmb3IgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtIGNhc2UgKi8KKyAgICBjaGFyICAgICAgaW5BbmRyb2lkQnVpbGQ7CisgICAgY2hhciogICAgIGFuZHJvaWRPdXQ7CisgICAgY2hhciogICAgIGFuZHJvaWRCdWlsZFJvb3Q7CisgICAgY2hhciogICAgIHRhcmdldEFyY2g7CisgICAgY2hhciogICAgIHRhcmdldEFiaTsKKworICAgIC8qIGZvciB0aGUgbm9ybWFsIHZpcnR1YWwgZGV2aWNlIGNhc2UgKi8KKyAgICBjaGFyKiAgICAgZGV2aWNlTmFtZTsKKyAgICBjaGFyKiAgICAgc2RrUm9vdFBhdGg7CisgICAgY2hhciogICAgIHNlYXJjaFBhdGhzWyBNQVhfU0VBUkNIX1BBVEhTIF07CisgICAgaW50ICAgICAgIG51bVNlYXJjaFBhdGhzOworICAgIGNoYXIqICAgICBjb250ZW50UGF0aDsKKyAgICBDSW5pRmlsZSogcm9vdEluaTsgICAvKiByb290IDxmb28+LmluaSBmaWxlLCBlbXB0eSBpZiBtaXNzaW5nICovCisgICAgQ0luaUZpbGUqIGNvbmZpZ0luaTsgLyogdmlydHVhbCBkZXZpY2UncyBjb25maWcuaW5pLCBOVUxMIGlmIG1pc3NpbmcgKi8KKyAgICBDSW5pRmlsZSogc2tpbkhhcmR3YXJlSW5pOyAvKiBza2luLXNwZWNpZmljIGhhcmR3YXJlLmluaSAqLworCisgICAgLyogZm9yIGJvdGggKi8KKyAgICBpbnQgICAgICAgYXBpTGV2ZWw7CisgICAgaW50ICAgICAgIGluY3JlbWVudGFsVmVyc2lvbjsKKyAgICBib29sICAgICAgaXNHb29nbGVBcGlzOworICAgIGNoYXIqICAgICBza2luTmFtZTsgICAgIC8qIHNraW4gbmFtZSAqLworICAgIGNoYXIqICAgICBza2luRGlyUGF0aDsgIC8qIHNraW4gZGlyZWN0b3J5ICovCisgICAgY2hhciogICAgIGNvcmVIYXJkd2FyZUluaVBhdGg7ICAvKiBjb3JlIGhhcmR3YXJlLmluaSBwYXRoICovCisKKyAgICBGaWxlRGF0YSAgYnVpbGRQcm9wZXJ0aWVzWzFdOyAgLyogYnVpbGQucHJvcCBmaWxlICovCisgICAgRmlsZURhdGEgIGJvb3RQcm9wZXJ0aWVzWzFdOyAgIC8qIGJvb3QucHJvcCBmaWxlICovCisKKyAgICAvKiBpbWFnZSBmaWxlcyAqLworICAgIGNoYXIqICAgICBpbWFnZVBhdGggWyBBVkRfSU1BR0VfTUFYIF07CisgICAgY2hhciAgICAgIGltYWdlU3RhdGVbIEFWRF9JTUFHRV9NQVggXTsKK307CisKKwordm9pZAorYXZkSW5mb19mcmVlKCBBdmRJbmZvKiAgaSApCit7CisgICAgaWYgKGkpIHsKKyAgICAgICAgaW50ICBubjsKKworICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBBVkRfSU1BR0VfTUFYOyBubisrKQorICAgICAgICAgICAgQUZSRUUoaS0+aW1hZ2VQYXRoW25uXSk7CisKKyAgICAgICAgQUZSRUUoaS0+c2tpbk5hbWUpOworICAgICAgICBBRlJFRShpLT5za2luRGlyUGF0aCk7CisgICAgICAgIEFGUkVFKGktPmNvcmVIYXJkd2FyZUluaVBhdGgpOworCisgICAgICAgIGZpbGVEYXRhX2RvbmUoaS0+YnVpbGRQcm9wZXJ0aWVzKTsKKyAgICAgICAgZmlsZURhdGFfZG9uZShpLT5ib290UHJvcGVydGllcyk7CisKKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgaS0+bnVtU2VhcmNoUGF0aHM7IG5uKyspCisgICAgICAgICAgICBBRlJFRShpLT5zZWFyY2hQYXRoc1tubl0pOworCisgICAgICAgIGktPm51bVNlYXJjaFBhdGhzID0gMDsKKworICAgICAgICBpZiAoaS0+Y29uZmlnSW5pKSB7CisgICAgICAgICAgICBpbmlGaWxlX2ZyZWUoaS0+Y29uZmlnSW5pKTsKKyAgICAgICAgICAgIGktPmNvbmZpZ0luaSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaS0+c2tpbkhhcmR3YXJlSW5pKSB7CisgICAgICAgICAgICBpbmlGaWxlX2ZyZWUoaS0+c2tpbkhhcmR3YXJlSW5pKTsKKyAgICAgICAgICAgIGktPnNraW5IYXJkd2FyZUluaSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaS0+cm9vdEluaSkgeworICAgICAgICAgICAgaW5pRmlsZV9mcmVlKGktPnJvb3RJbmkpOworICAgICAgICAgICAgaS0+cm9vdEluaSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBBRlJFRShpLT5jb250ZW50UGF0aCk7CisgICAgICAgIEFGUkVFKGktPnNka1Jvb3RQYXRoKTsKKyAgICAgICAgQUZSRUUoaS0+dGFyZ2V0QXJjaCk7CisgICAgICAgIEFGUkVFKGktPnRhcmdldEFiaSk7CisKKyAgICAgICAgaWYgKGktPmluQW5kcm9pZEJ1aWxkKSB7CisgICAgICAgICAgICBBRlJFRShpLT5hbmRyb2lkT3V0KTsKKyAgICAgICAgICAgIEFGUkVFKGktPmFuZHJvaWRCdWlsZFJvb3QpOworICAgICAgICB9CisKKyAgICAgICAgQUZSRUUoaS0+ZGV2aWNlTmFtZSk7CisgICAgICAgIEFGUkVFKGkpOworICAgIH0KK30KKworLyogbGlzdCBvZiBkZWZhdWx0IGZpbGUgbmFtZXMgZm9yIGVhY2ggc3VwcG9ydGVkIGltYWdlIGZpbGUgdHlwZSAqLworc3RhdGljIGNvbnN0IGNoYXIqICBjb25zdCAgX2ltYWdlRmlsZU5hbWVzWyBBVkRfSU1BR0VfTUFYIF0gPSB7CisjZGVmaW5lICBfQVZEX0lNRyh4LHkseikgIHksCisgICAgQVZEX0lNQUdFX0xJU1QKKyN1bmRlZiBfQVZEX0lNRworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogICAgVVRJTElUWSBGVU5DVElPTlMKKyAqKioqKgorICoqKioqICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBkbyBub3QgZGVwZW5kIG9uIHRoZSBBdmRJbmZvCisgKioqKiogIHN0cnVjdHVyZSBhbmQgY291bGQgZWFzaWx5IGJlIG1vdmVkIGVsc2V3aGVyZS4KKyAqKioqKgorICoqKioqLworCisvKiBQYXJzZSBhIGdpdmVuIGNvbmZpZy5pbmkgZmlsZSBhbmQgZXh0cmFjdCB0aGUgbGlzdCBvZiBTREsgc2VhcmNoIHBhdGhzCisgKiBmcm9tIGl0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsaWQgcGF0aHMgc3RvcmVkIGluICdzZWFyY2hQYXRocycsIG9yIC0xCisgKiBpbiBjYXNlIG9mIHByb2JsZW0uCisgKgorICogUmVsYXRpdmUgc2VhcmNoIHBhdGhzIGluIHRoZSBjb25maWcuaW5pIHdpbGwgYmUgc3RvcmVkIGFzIGZ1bGwgcGF0aG5hbWVzCisgKiByZWxhdGl2ZSB0byAnc2RrUm9vdFBhdGgnLgorICoKKyAqICdzZWFyY2hQYXRocycgbXVzdCBiZSBhbiBhcnJheSBvZiBjaGFyKiBwb2ludGVycyBvZiBhdCBtb3N0ICdtYXhTZWFyY2hQYXRocycKKyAqIGVudHJpZXMuCisgKi8KK3N0YXRpYyBpbnQgX2dldFNlYXJjaFBhdGhzKENJbmlGaWxlKiBjb25maWdJbmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZGtSb290UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhTZWFyY2hQYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBzZWFyY2hQYXRocykgeworICAgIGNoYXIgIHRlbXBbUEFUSF9NQVhdLCAqcCA9IHRlbXAsICplbmQ9IHArc2l6ZW9mIHRlbXA7CisgICAgaW50ICAgbm4sIGNvdW50ID0gMDsKKworICAgIGZvciAobm4gPSAwOyBubiA8IG1heFNlYXJjaFBhdGhzOyBubisrKSB7CisgICAgICAgIGNoYXIqICBwYXRoOworCisgICAgICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcyVkIiwgU0VBUkNIX1BSRUZJWCwgbm4rMSApOworICAgICAgICBpZiAocCA+PSBlbmQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBwYXRoID0gaW5pRmlsZV9nZXRTdHJpbmcoY29uZmlnSW5pLCB0ZW1wLCBOVUxMKTsKKyAgICAgICAgaWYgKHBhdGggIT0gTlVMTCkgeworICAgICAgICAgICAgREQoIiAgICBmb3VuZCBpbWFnZSBzZWFyY2ggcGF0aDogJXMiLCBwYXRoKTsKKyAgICAgICAgICAgIGlmICghcGF0aF9pc19hYnNvbHV0ZShwYXRoKSkgeworICAgICAgICAgICAgICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy8lcyIsIHNka1Jvb3RQYXRoLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBBRlJFRShwYXRoKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gQVNUUkRVUCh0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlYXJjaFBhdGhzW2NvdW50KytdID0gcGF0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qIENoZWNrIHRoYXQgYW4gQVZEIG5hbWUgaXMgdmFsaWQuIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorX2NoZWNrQXZkTmFtZSggY29uc3QgY2hhciogIG5hbWUgKQoreworICAgIGludCAgbGVuICA9IHN0cmxlbihuYW1lKTsKKyAgICBpbnQgIGxlbjIgPSBzdHJzcG4obmFtZSwgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5Xy4tIik7CisgICAgcmV0dXJuIChsZW4gPT0gbGVuMik7Cit9CisKKy8qIFJldHVybnMgdGhlIGZ1bGwgcGF0aCBvZiBhIGdpdmVuIGZpbGUuCisgKgorICogSWYgJ2ZpbGVOYW1lJyBpcyBhbiBhYnNvbHV0ZSBwYXRoLCB0aGlzIHJldHVybnMgYSBzaW1wbGUgY29weS4KKyAqIE90aGVyd2lzZSwgdGhpcyByZXR1cm5zIGEgbmV3IHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIDxyb290UGF0aD4vPGZpbGVOYW1lPgorICoKKyAqIFRoaXMgcmV0dXJucyBOVUxMIGlmIHRoZSBwYXRocyBhcmUgdG9vIGxvbmcuCisgKi8KK3N0YXRpYyBjaGFyKgorX2dldEZ1bGxGaWxlUGF0aCggY29uc3QgY2hhciogcm9vdFBhdGgsIGNvbnN0IGNoYXIqIGZpbGVOYW1lICkKK3sKKyAgICBpZiAocGF0aF9pc19hYnNvbHV0ZShmaWxlTmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIEFTVFJEVVAoZmlsZU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgdGVtcFtQQVRIX01BWF0sICpwPXRlbXAsICplbmQ9cCtzaXplb2YodGVtcCk7CisKKyAgICAgICAgcCA9IGJ1ZnByaW50KHRlbXAsIGVuZCwgIiVzLyVzIiwgcm9vdFBhdGgsIGZpbGVOYW1lKTsKKyAgICAgICAgaWYgKHAgPj0gZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVNUUkRVUCh0ZW1wKTsKKyAgICB9Cit9CisKKy8qIGNoZWNrIHRoYXQgYSBnaXZlbiBkaXJlY3RvcnkgY29udGFpbnMgYSB2YWxpZCBza2luLgorICogcmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorX2NoZWNrU2tpblBhdGgoIGNvbnN0IGNoYXIqICBza2luUGF0aCApCit7CisgICAgY2hhciAgdGVtcFtNQVhfUEFUSF0sICpwPXRlbXAsICplbmQ9cCtzaXplb2YodGVtcCk7CisKKyAgICAvKiBmb3Igbm93LCBpZiBpdCBoYXMgYSAnbGF5b3V0JyBmaWxlLCBpdCBpcyBhIHZhbGlkIHNraW4gcGF0aCAqLworICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy9sYXlvdXQiLCBza2luUGF0aCk7CisgICAgaWYgKHAgPj0gZW5kIHx8ICFwYXRoX2V4aXN0cyh0ZW1wKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworLyogQ2hlY2sgdGhhdCB0aGVyZSBpcyBhIHNraW4gbmFtZWQgJ3NraW5OYW1lJyBsaXN0ZWQgZnJvbSAnc2tpbkRpclJvb3QnCisgKiB0aGlzIHJldHVybnMgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgc2tpbiBkaXJlY3RvcnkgKGFmdGVyIGFsaWFzIGV4cGFuc2lvbnMpLAorICogaW5jbHVkaW5nIHRoZSBza2luIG5hbWUsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGNoYXIqCitfY2hlY2tTa2luU2tpbnNEaXIoIGNvbnN0IGNoYXIqICBza2luRGlyUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNraW5OYW1lICkKK3sKKyAgICBEaXJTY2FubmVyKiAgc2Nhbm5lcjsKKyAgICBjaGFyKiAgICAgICAgcmVzdWx0OworICAgIGNoYXIgICAgICAgICB0ZW1wW01BWF9QQVRIXSwgKnAgPSB0ZW1wLCAqZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKworICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy9za2lucy8lcyIsIHNraW5EaXJSb290LCBza2luTmFtZSk7CisgICAgREQoIlByb2Jpbmcgc2tpbiBkaXJlY3Rvcnk6ICVzIiwgdGVtcCk7CisgICAgaWYgKHAgPj0gZW5kIHx8ICFwYXRoX2V4aXN0cyh0ZW1wKSkgeworICAgICAgICBERCgiICAgIGlnbm9yZSBiYWQgc2tpbiBkaXJlY3RvcnkgJXMiLCB0ZW1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogZmlyc3QsIGlzIHRoaXMgYSBub3JtYWwgc2tpbiBkaXJlY3RvcnkgPyAqLworICAgIGlmIChfY2hlY2tTa2luUGF0aCh0ZW1wKSkgeworICAgICAgICAvKiB5ZXMgKi8KKyAgICAgICAgREQoIiAgICBmb3VuZCBza2luIGRpcmVjdG9yeTogJXMiLCB0ZW1wKTsKKyAgICAgICAgcmV0dXJuIEFTVFJEVVAodGVtcCk7CisgICAgfQorCisgICAgLyogc2Vjb25kLCBpcyBpdCBhbiBhbGlhcyB0byBhbm90aGVyIHNraW4gPyAqLworICAgICpwICAgICAgPSAwOworICAgIHJlc3VsdCAgPSBOVUxMOworICAgIHNjYW5uZXIgPSBkaXJTY2FubmVyX25ldyh0ZW1wKTsKKyAgICBpZiAoc2Nhbm5lciAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlID0gZGlyU2Nhbm5lcl9uZXh0KHNjYW5uZXIpOworCisgICAgICAgICAgICBpZiAoZmlsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoc3RybmNtcChmaWxlLCAiYWxpYXMtIiwgNikgfHwgZmlsZVs2XSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvc2tpbnMvJXMiLCBza2luRGlyUm9vdCwgZmlsZSs2KTsKKyAgICAgICAgICAgIGlmIChwIDwgZW5kICYmIF9jaGVja1NraW5QYXRoKHRlbXApKSB7CisgICAgICAgICAgICAgICAgLyogeWVzLCBpdCdzIGFuIGFsaWFzICovCisgICAgICAgICAgICAgICAgREQoIiAgICBza2luIGFsaWFzICclcycgcG9pbnRzIHRvIHNraW4gZGlyZWN0b3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgZmlsZSs2LCB0ZW1wKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBBU1RSRFVQKHRlbXApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRpclNjYW5uZXJfZnJlZShzY2FubmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogdHJ5IHRvIHNlZSBpZiB0aGUgc2tpbiBuYW1lIGxlYWRzIHRvIGEgbWFnaWMgc2tpbiBvciBza2luIHBhdGggZGlyZWN0bHkKKyAqIHJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yLgorICoKKyAqIG9uIHN1Y2Nlc3MsIHRoaXMgc2V0cyB1cCAnKnBTa2luTmFtZScgYW5kICcqcFNraW5EaXInCisgKi8KK3N0YXRpYyBpbnQKK19nZXRTa2luUGF0aEZyb21OYW1lKCBjb25zdCBjaGFyKiAgc2tpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNka1Jvb3RQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgICBwU2tpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcioqICAgICAgIHBTa2luRGlyICkKK3sKKyAgICBjaGFyICB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKworICAgIC8qIGlmIHRoZSBza2luIG5hbWUgaGFzIHRoZSBmb3JtYXQgJ05OTk54Tk5OJyB3aGVyZQorICAgICogTk5OIGlzIGEgZGVjaW1hbCB2YWx1ZSwgdGhlbiB0aGlzIGlzIGEgJ21hZ2ljJyBza2luCisgICAgKiBuYW1lIHRoYXQgZG9lc24ndCByZXF1aXJlIGEgc2tpbiBkaXJlY3RvcnkKKyAgICAqLworICAgIGlmIChpc2RpZ2l0KHNraW5OYW1lWzBdKSkgeworICAgICAgICBpbnQgIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChzc2NhbmYoc2tpbk5hbWUsICIlZHglZCIsICZ3aWR0aCwgJmhlaWdodCkgPT0gMikgeworICAgICAgICAgICAgRCgiJ21hZ2ljJyBza2luIGZvcm1hdCBkZXRlY3RlZDogJXMiLCBza2luTmFtZSk7CisgICAgICAgICAgICAqcFNraW5OYW1lID0gQVNUUkRVUChza2luTmFtZSk7CisgICAgICAgICAgICAqcFNraW5EaXIgID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaXMgdGhlIHNraW4gbmFtZSBhIGRpcmVjdCBwYXRoIHRvIHRoZSBza2luIGRpcmVjdG9yeSA/ICovCisgICAgaWYgKHBhdGhfaXNfYWJzb2x1dGUoc2tpbk5hbWUpICYmIF9jaGVja1NraW5QYXRoKHNraW5OYW1lKSkgeworICAgICAgICBnb3RvIEZPVU5EX0lUOworICAgIH0KKworICAgIC8qIGlzIHRoZSBza2luIG5hbWUgYSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIFNESyByb290ID8gKi8KKyAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvJXMiLCBzZGtSb290UGF0aCwgc2tpbk5hbWUpOworICAgIGlmIChwIDwgZW5kICYmIF9jaGVja1NraW5QYXRoKHRlbXApKSB7CisgICAgICAgIHNraW5OYW1lID0gdGVtcDsKKyAgICAgICAgZ290byBGT1VORF9JVDsKKyAgICB9CisKKyAgICAvKiBub3BlICovCisgICAgcmV0dXJuIDA7CisKK0ZPVU5EX0lUOgorICAgIGlmIChwYXRoX3NwbGl0KHNraW5OYW1lLCBwU2tpbkRpciwgcFNraW5OYW1lKSA8IDApIHsKKyAgICAgICAgZGVycm9yKCJtYWxmb3JtZWQgc2tpbiBuYW1lOiAlcyIsIHNraW5OYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEQoImZvdW5kIHNraW4gJyVzJyBpbiBkaXJlY3Rvcnk6ICVzIiwgKnBTa2luTmFtZSwgKnBTa2luRGlyKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogICAgTk9STUFMIFZJUlRVQUwgREVWSUNFIFNVUFBPUlQKKyAqKioqKgorICoqKioqLworCisvKiBjb21wdXRlIHBhdGggdG8gdGhlIHJvb3QgU0RLIGRpcmVjdG9yeQorICogYXNzdW1lIHdlIGFyZSBpbiAkU0RLUk9PVC90b29scy9lbXVsYXRvclsuZXhlXQorICovCitzdGF0aWMgaW50CitfYXZkSW5mb19nZXRTZGtSb290KCBBdmRJbmZvKiAgaSApCit7CisKKyAgICBpLT5zZGtSb290UGF0aCA9IHBhdGhfZ2V0U2RrUm9vdCgpOworICAgIGlmIChpLT5zZGtSb290UGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvcigiY2FuJ3QgZmluZCBTREsgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBwYXJzZSB0aGUgcm9vdCBjb25maWcgLmluaSBmaWxlLiBpdCBpcyBsb2NhdGVkIGluCisgKiB+Ly5hbmRyb2lkL2F2ZC88bmFtZT4uaW5pIG9yIFdpbmRvd3MgZXF1aXZhbGVudAorICovCitzdGF0aWMgaW50CitfYXZkSW5mb19nZXRSb290SW5pKCBBdmRJbmZvKiAgaSApCit7CisgICAgY2hhciogIGluaVBhdGggPSBwYXRoX2dldFJvb3RJbmlQYXRoKCBpLT5kZXZpY2VOYW1lICk7CisKKyAgICBpZiAoaW5pUGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvcigidW5rbm93biB2aXJ0dWFsIGRldmljZSBuYW1lOiAnJXMnIiwgaS0+ZGV2aWNlTmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBEKCJBbmRyb2lkIHZpcnR1YWwgZGV2aWNlIGZpbGUgYXQ6ICVzIiwgaW5pUGF0aCk7CisKKyAgICBpLT5yb290SW5pID0gaW5pRmlsZV9uZXdGcm9tRmlsZShpbmlQYXRoKTsKKyAgICBBRlJFRShpbmlQYXRoKTsKKworICAgIGlmIChpLT5yb290SW5pID09IE5VTEwpIHsKKyAgICAgICAgZGVycm9yKCJDb3JydXB0IHZpcnR1YWwgZGV2aWNlIGNvbmZpZyBmaWxlISIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIHRoZSBBVkQncyBjb250ZW50IHBhdGgsIGkuZS4gdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zCisgKiB0aGUgQVZEJ3MgY29udGVudCBmaWxlcyAoZS5nLiBkYXRhIHBhcnRpdGlvbiwgY2FjaGUsIHNkIGNhcmQsIGV0Yy4uLikuCisgKgorICogV2UgZXh0cmFjdCB0aGlzIGJ5IHBhcnNpbmcgdGhlIHJvb3QgY29uZmlnIC5pbmkgZmlsZSwgbG9va2luZyBmb3IKKyAqIGEgInBhdGgiIGVsZW1lbnRzLgorICovCitzdGF0aWMgaW50CitfYXZkSW5mb19nZXRDb250ZW50UGF0aCggQXZkSW5mbyogIGkgKQoreworICAgIGNoYXIgdGVtcFtQQVRIX01BWF0sICpwPXRlbXAsICplbmQ9cCtzaXplb2YodGVtcCk7CisKKyAgICBpLT5jb250ZW50UGF0aCA9IGluaUZpbGVfZ2V0U3RyaW5nKGktPnJvb3RJbmksIFJPT1RfQUJTX1BBVEhfS0VZLCBOVUxMKTsKKworICAgIGlmIChpLT5jb250ZW50UGF0aCA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvcigiYmFkIGNvbmZpZzogJXMiLAorICAgICAgICAgICAgICAgInZpcnR1YWwgZGV2aWNlIGZpbGUgbGFja3MgYSAiUk9PVF9BQlNfUEFUSF9LRVkiIGVudHJ5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIXBhdGhfaXNfZGlyKGktPmNvbnRlbnRQYXRoKSkgeworICAgICAgICAvLyBJZiB0aGUgYWJzb2x1dGUgcGF0aCBkb2Vzbid0IG1hdGNoIGFuIGFjdHVhbCBkaXJlY3RvcnksIHRyeQorICAgICAgICAvLyB0aGUgcmVsYXRpdmUgcGF0aCBpZiBwcmVzZW50LgorICAgICAgICBjb25zdCBjaGFyKiByZWxQYXRoID0gaW5pRmlsZV9nZXRTdHJpbmcoaS0+cm9vdEluaSwgUk9PVF9SRUxfUEFUSF9LRVksIE5VTEwpOworICAgICAgICBpZiAocmVsUGF0aCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwID0gYnVmcHJpbnRfY29uZmlnX3BhdGgodGVtcCwgZW5kKTsKKyAgICAgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsIFBBVEhfU0VQICIlcyIsIHJlbFBhdGgpOworICAgICAgICAgICAgaWYgKHAgPCBlbmQgJiYgcGF0aF9pc19kaXIodGVtcCkpIHsKKyAgICAgICAgICAgICAgICBzdHJfcmVzZXQoJmktPmNvbnRlbnRQYXRoLCB0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEQoInZpcnR1YWwgZGV2aWNlIGNvbnRlbnQgYXQgJXMiLCBpLT5jb250ZW50UGF0aCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19hdmRJbmZvX2dldEFwaUxldmVsKCBBdmRJbmZvKiAgaSApCit7CisgICAgY2hhciogICAgICAgdGFyZ2V0OworICAgIGNvbnN0IGNoYXIqIHA7CisgICAgY29uc3QgaW50ICAgZGVmYXVsdExldmVsID0gMTAwMDsKKyAgICBpbnQgICAgICAgICBsZXZlbCAgICAgICAgPSBkZWZhdWx0TGV2ZWw7CisKKyMgICAgZGVmaW5lIFJPT1RfVEFSR0VUX0tFWSAgICJ0YXJnZXQiCisKKyAgICB0YXJnZXQgPSBpbmlGaWxlX2dldFN0cmluZyhpLT5yb290SW5pLCBST09UX1RBUkdFVF9LRVksIE5VTEwpOworICAgIGlmICh0YXJnZXQgPT0gTlVMTCkgeworICAgICAgICBEKCJObyB0YXJnZXQgZmllbGQgaW4gcm9vdCBBVkQgLmluaSBmaWxlPyIpOworICAgICAgICBEKCJEZWZhdWx0aW5nIHRvIEFQSSBsZXZlbCAlZCIsIGxldmVsKTsKKyAgICAgICAgcmV0dXJuIGxldmVsOworICAgIH0KKworICAgIEREKCJGb3VuZCB0YXJnZXQgZmllbGQgaW4gcm9vdCBBVkQgLmluaSBmaWxlOiAnJXMnIiwgdGFyZ2V0KTsKKworICAgIC8qIFRoZXJlIGFyZSB0d28gYWNjZXB0YWJsZSBmb3JtYXRzIGZvciB0aGUgdGFyZ2V0IGtleS4KKyAgICAgKgorICAgICAqIDEvICBhbmRyb2lkLTxsZXZlbD4KKyAgICAgKiAyLyAgPHZlbmRvci1uYW1lPjo8YWRkLW9uLW5hbWU+OjxsZXZlbD4KKyAgICAgKgorICAgICAqIFdoZXJlIDxsZXZlbD4gY2FuIGJlIGVpdGhlciBhIF9uYW1lXyAoZm9yIGV4cGVyaW1lbnRhbC9wcmV2aWV3IFNESyBidWlsZHMpCisgICAgICogb3IgYSBkZWNpbWFsIG51bWJlci4gTm90ZSB0aGF0IGlmIGEgX25hbWVfLCBpdCBjYW4gc3RhcnQgd2l0aCBhIGRpZ2l0LgorICAgICAqLworCisgICAgLyogRmlyc3QsIGV4dHJhY3QgdGhlIGxldmVsICovCisgICAgaWYgKCFtZW1jbXAodGFyZ2V0LCAiYW5kcm9pZC0iLCA4KSkKKyAgICAgICAgcCA9IHRhcmdldCArIDg7CisgICAgZWxzZSB7CisgICAgICAgIC8qIHNraXAgdHdvIGNvbHVtbnMgKi8KKyAgICAgICAgcCA9IHN0cmNocih0YXJnZXQsICc6Jyk7CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHAgPSBzdHJjaHIocCsxLCAnOicpOworICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBwICs9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHAgPT0gTlVMTCB8fCAhaXNkaWdpdCgqcCkpIHsKKyAgICAgICAgLy8gY3VycmVudCBwcmV2aWV3IHZlcnNpb25zIG9mIE4gaGF2ZSAnTicgYXMgdGhlaXIgdGFyZ2V0CisgICAgICAgIGlmIChwWzBdID09ICdOJyAmJiBwWzFdID09IDApIHsKKyAgICAgICAgICAgIGxldmVsID0gMjQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIE5PVF9BX05VTUJFUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIqIGVuZDsKKyAgICAgICAgbG9uZyAgdmFsID0gc3RydG9sKHAsICZlbmQsIDEwKTsKKyAgICAgICAgaWYgKGVuZCA9PSBOVUxMIHx8ICplbmQgIT0gJ1wwJyB8fCB2YWwgIT0gKGludCl2YWwpIHsKKyAgICAgICAgICAgIGdvdG8gTk9UX0FfTlVNQkVSOworICAgICAgICB9CisgICAgICAgIGxldmVsID0gKGludCl2YWw7CisKKyAgICAgICAgLyogU2FuaXR5IGNoZWNrLCB3ZSBkb24ndCBzdXBwb3J0IGFueXRoaW5nIHByaW9yIHRvIEFuZHJvaWQgMS41ICovCisgICAgICAgIGlmIChsZXZlbCA8IDMpCisgICAgICAgICAgICBsZXZlbCA9IDM7CisKKyAgICAgICAgRCgiRm91bmQgQVZEIHRhcmdldCBBUEkgbGV2ZWw6ICVkIiwgbGV2ZWwpOworICAgIH0KK0VYSVQ6CisgICAgQUZSRUUodGFyZ2V0KTsKKyAgICByZXR1cm4gbGV2ZWw7CisKK05PVF9BX05VTUJFUjoKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIEQoIkludmFsaWQgdGFyZ2V0IGZpZWxkIGluIHJvb3QgQVZEIC5pbmkgZmlsZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoIlRhcmdldCBBVkQgYXBpIGxldmVsIGlzIG5vdCBhIG51bWJlciIpOworICAgIH0KKyAgICBEKCJEZWZhdWx0aW5nIHRvIEFQSSBsZXZlbCAlZCIsIGxldmVsKTsKKyAgICBnb3RvIEVYSVQ7Cit9CisKK2Jvb2wKK2F2ZEluZm9faXNHb29nbGVBcGlzKGNvbnN0IEF2ZEluZm8qIGkpIHsKKyAgICByZXR1cm4gaS0+aXNHb29nbGVBcGlzOworfQorCitpbnQKK2F2ZEluZm9fZ2V0QXBpTGV2ZWwoY29uc3QgQXZkSW5mbyogaSkgeworICAgIHJldHVybiBpLT5hcGlMZXZlbDsKK30KKworY29uc3QgY2hhcioKK2F2ZEluZm9fZ2V0QXBpRGVzc2VydE5hbWUoaW50IGFwaUxldmVsKSB7CisgICAgLy8gVGhpcyBpbmZvcm1hdGlvbiB3YXMgdGFrZW4gZnJvbSB0aGUgU0RLIE1hbmFnZXI6CisgICAgLy8gQXBwZWFyYW5jZXMgJiBCZWhhdmlvciA+IFN5c3RlbSBTZXR0aW5ncyA+IEFuZHJvaWQgU0RLID4gU0RLIFBsYXRmb3JtcworICAgIGlmIChhcGlMZXZlbCA9PSAxMCkgcmV0dXJuICJHaW5nZXJicmVhZCI7ICAgICAgICAvLyAxMAorICAgIGlmIChhcGlMZXZlbCA8PSAxMykgcmV0dXJuICIiOyAgICAgICAgICAgICAgICAgICAvLyBObyBuYW1lcyBmb3IgMC4uOSwgMTEuLjEzCisgICAgaWYgKGFwaUxldmVsIDw9IDE1KSByZXR1cm4gIkljZSBDcmVhbSBTYW5kd2ljaCI7IC8vIDE0Li4xNQorICAgIGlmIChhcGlMZXZlbCA8PSAxOCkgcmV0dXJuICJKZWxseSBCZWFuIjsgICAgICAgICAvLyAxNi4uMTgKKyAgICBpZiAoYXBpTGV2ZWwgPD0gMjApIHJldHVybiAiS2l0S2F0IjsgICAgICAgICAgICAgLy8gMTkuLjIwCisgICAgaWYgKGFwaUxldmVsIDw9IDIyKSByZXR1cm4gIkxvbGxpcG9wIjsgICAgICAgICAgIC8vIDIxLi4yMgorICAgIGlmIChhcGlMZXZlbCA8PSAyMykgcmV0dXJuICJNYXJzaG1hbGxvdyI7ICAgICAgICAvLyAyMworICAgIGlmIChhcGlMZXZlbCA8PSAyNCkgcmV0dXJuICJOb3VnYXQiOyAgICAgICAgICAgICAvLyAyNAorCisgICAgcmV0dXJuICIiOworfQorCit2b2lkCithdmRJbmZvX2dldEZ1bGxBcGlOYW1lKGludCBhcGlMZXZlbCwgY2hhciogbmFtZVN0ciwgaW50IHN0ckxlbikgeworICAgIC8vIFRoaXMgaW5mb3JtYXRpb24gd2FzIHRha2VuIGZyb20gdGhlIFNESyBNYW5hZ2VyOgorICAgIC8vIEFwcGVhcmFuY2VzICYgQmVoYXZpb3IgPiBTeXN0ZW0gU2V0dGluZ3MgPiBBbmRyb2lkIFNESyA+IFNESyBQbGF0Zm9ybXMKKyAgICBzd2l0Y2ggKGFwaUxldmVsKSB7CisgICAgICAgIGNhc2UgMTA6IHN0cm5jcHkobmFtZVN0ciwgIjIuMy4zIChHaW5nZXJicmVhZCkgLSBBUEkgMTAgKFJldiAyKSIsICAgICAgICBzdHJMZW4pOyBicmVhazsKKyAgICAgICAgY2FzZSAxNDogc3RybmNweShuYW1lU3RyLCAiNC4wIChJY2UgQ3JlYW0gU2FuZHdpY2gpIC0gQVBJIDE0IChSZXYgNCkiLCAgIHN0ckxlbik7IGJyZWFrOworICAgICAgICBjYXNlIDE1OiBzdHJuY3B5KG5hbWVTdHIsICI0LjAuMyAoSWNlIENyZWFtIFNhbmR3aWNoKSAtIEFQSSAxNSAoUmV2IDUpIiwgc3RyTGVuKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6IHN0cm5jcHkobmFtZVN0ciwgIjQuMSAoSmVsbHkgQmVhbikgLSBBUEkgMTYgKFJldiA1KSIsICAgICAgICAgICBzdHJMZW4pOyBicmVhazsKKyAgICAgICAgY2FzZSAxNzogc3RybmNweShuYW1lU3RyLCAiNC4yIChKZWxseSBCZWFuKSAtIEFQSSAxNyAoUmV2IDMpIiwgICAgICAgICAgIHN0ckxlbik7IGJyZWFrOworICAgICAgICBjYXNlIDE4OiBzdHJuY3B5KG5hbWVTdHIsICI0LjMgKEplbGx5IEJlYW4pIC0gQVBJIDE4IChSZXYgMykiLCAgICAgICAgICAgc3RyTGVuKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTk6IHN0cm5jcHkobmFtZVN0ciwgIjQuNCAoS2l0S2F0KSAtIEFQSSAxOSAoUmV2IDQpIiwgICAgICAgICAgICAgICBzdHJMZW4pOyBicmVhazsKKyAgICAgICAgY2FzZSAyMDogc3RybmNweShuYW1lU3RyLCAiNC40IChLaXRLYXQgV2VhcikgLSBBUEkgMjAgKFJldiAyKSIsICAgICAgICAgIHN0ckxlbik7IGJyZWFrOworICAgICAgICBjYXNlIDIxOiBzdHJuY3B5KG5hbWVTdHIsICI1LjAgKExvbGxpcG9wKSAtIEFQSSAyMSAoUmV2IDIpIiwgICAgICAgICAgICAgc3RyTGVuKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjI6IHN0cm5jcHkobmFtZVN0ciwgIjUuMSAoTG9sbGlwb3ApIC0gQVBJIDIyIChSZXYgMikiLCAgICAgICAgICAgICBzdHJMZW4pOyBicmVhazsKKyAgICAgICAgY2FzZSAyMzogc3RybmNweShuYW1lU3RyLCAiNi4wIChNYXJzaG1hbGxvdykgLSBBUEkgMjMgKFJldiAxKSIsICAgICAgICAgIHN0ckxlbik7IGJyZWFrOworICAgICAgICBjYXNlIDI0OiBzdHJuY3B5KG5hbWVTdHIsICI3LjAgKE5vdWdhdCkgLSBBUEkgMjQiLCAgICAgICAgICAgICAgICAgICAgICAgc3RyTGVuKTsgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChhcGlMZXZlbCA8IDAgfHwgYXBpTGV2ZWwgPiA5OSkgeworICAgICAgICAgICAgICAgIHN0cm5jcHkobmFtZVN0ciwgIlVua25vd24gQVBJIHZlcnNpb24iLCBzdHJMZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihuYW1lU3RyLCBzdHJMZW4sICJBUEkgJWQiLCBhcGlMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgfQorfQorCisvKiBMb29rIGZvciBhIG5hbWVkIGZpbGUgaW5zaWRlIHRoZSBBVkQncyBjb250ZW50IGRpcmVjdG9yeS4KKyAqIFJldHVybnMgTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0LCBvciBhIHN0cmR1cCgpIGNvcHkgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgY2hhcioKK19hdmRJbmZvX2dldENvbnRlbnRGaWxlUGF0aChjb25zdCBBdmRJbmZvKiAgaSwgY29uc3QgY2hhciogZmlsZU5hbWUpCit7CisgICAgY2hhciB0ZW1wW01BWF9QQVRIXSwgKnAgPSB0ZW1wLCAqZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKworICAgIHAgPSBidWZwcmludChwLCBlbmQsICIlcy8lcyIsIGktPmNvbnRlbnRQYXRoLCBmaWxlTmFtZSk7CisgICAgaWYgKHAgPj0gZW5kKSB7CisgICAgICAgIGRlcnJvcigiY2FuJ3QgYWNjZXNzIHZpcnR1YWwgZGV2aWNlIGNvbnRlbnQgZGlyZWN0b3J5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIXBhdGhfZXhpc3RzKHRlbXApKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQVNUUkRVUCh0ZW1wKTsKK30KKworLyogZmluZCBhbmQgcGFyc2UgdGhlIGNvbmZpZy5pbmkgZmlsZSBmcm9tIHRoZSBjb250ZW50IGRpcmVjdG9yeSAqLworc3RhdGljIGludAorX2F2ZEluZm9fZ2V0Q29uZmlnSW5pKEF2ZEluZm8qICBpKQoreworICAgIGNoYXIqICBpbmlQYXRoID0gX2F2ZEluZm9fZ2V0Q29udGVudEZpbGVQYXRoKGksIENPUkVfQ09ORklHX0lOSSk7CisKKyAgICAvKiBBbGxvdyBub24tZXhpc3RpbmcgY29uZmlnLmluaSAqLworICAgIGlmIChpbmlQYXRoID09IE5VTEwpIHsKKyAgICAgICAgRCgidmlydHVhbCBkZXZpY2UgaGFzIG5vIGNvbmZpZyBmaWxlIC0gbm8gcHJvYmxlbSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBEKCJ2aXJ0dWFsIGRldmljZSBjb25maWcgZmlsZTogJXMiLCBpbmlQYXRoKTsKKyAgICBpLT5jb25maWdJbmkgPSBpbmlGaWxlX25ld0Zyb21GaWxlKGluaVBhdGgpOworICAgIEFGUkVFKGluaVBhdGgpOworCisgICAgaWYgKGktPmNvbmZpZ0luaSA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvcigiYmFkIGNvbmZpZzogJXMiLAorICAgICAgICAgICAgICAgInZpcnR1YWwgZGV2aWNlIGhhcyBjb3JydXB0ZWQgIiBDT1JFX0NPTkZJR19JTkkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBUaGUgQVZEJ3MgY29uZmlnLmluaSBjb250YWlucyBhIGxpc3Qgb2Ygc2VhcmNoIHBhdGhzIChhbGwgYmVnaW5uaW5nCisgKiB3aXRoIFNFQVJDSF9QUkVGSVgpIHdoaWNoIGFyZSBkaXJlY3RvcnkgbG9jYXRpb25zIHNlYXJjaGVkIGZvcgorICogQVZEIHBsYXRmb3JtIGZpbGVzLgorICovCitzdGF0aWMgYm9vbAorX2F2ZEluZm9fZ2V0U2VhcmNoUGF0aHMoIEF2ZEluZm8qICBpICkKK3sKKyAgICBpZiAoaS0+Y29uZmlnSW5pID09IE5VTEwpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaS0+bnVtU2VhcmNoUGF0aHMgPSBfZ2V0U2VhcmNoUGF0aHMoIGktPmNvbmZpZ0luaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+c2RrUm9vdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TRUFSQ0hfUEFUSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktPnNlYXJjaFBhdGhzICk7CisgICAgaWYgKGktPm51bVNlYXJjaFBhdGhzID09IDApIHsKKyAgICAgICAgZGVycm9yKCJubyBzZWFyY2ggcGF0aHMgZm91bmQgaW4gdGhpcyBBVkQncyBjb25maWd1cmF0aW9uLlxuIgorICAgICAgICAgICAgICAgIldlaXJkLCB0aGUgQVZEJ3MgIiBDT1JFX0NPTkZJR19JTkkgIiBmaWxlIGlzIG1hbGZvcm1lZC4gIgorICAgICAgICAgICAgICAgIlRyeSByZS1jcmVhdGluZyBpdC5cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgREQoImZvdW5kIGEgdG90YWwgb2YgJWQgc2VhcmNoIHBhdGhzIGZvciB0aGlzIEFWRCIsIGktPm51bVNlYXJjaFBhdGhzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogU2VhcmNoIGEgZmlsZSBpbiB0aGUgU0RLIHNlYXJjaCBkaXJlY3Rvcmllcy4gUmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLAorICogb3IgYSBzdHJkdXAoKSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBjaGFyKgorX2F2ZEluZm9fZ2V0U2RrRmlsZVBhdGgoY29uc3QgQXZkSW5mbyogIGksIGNvbnN0IGNoYXIqICBmaWxlTmFtZSkKK3sKKyAgICBjaGFyIHRlbXBbTUFYX1BBVEhdLCAqcCA9IHRlbXAsICplbmQgPSBwICsgc2l6ZW9mKHRlbXApOworCisgICAgZG8geworICAgICAgICAvKiB0cnkgdGhlIHNlYXJjaCBwYXRocyAqLworICAgICAgICBpbnQgIG5uOworCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IGktPm51bVNlYXJjaFBhdGhzOyBubisrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBzZWFyY2hEaXIgPSBpLT5zZWFyY2hQYXRoc1tubl07CisKKyAgICAgICAgICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy8lcyIsIHNlYXJjaERpciwgZmlsZU5hbWUpOworICAgICAgICAgICAgaWYgKHAgPCBlbmQgJiYgcGF0aF9leGlzdHModGVtcCkpIHsKKyAgICAgICAgICAgICAgICBERCgiZm91bmQgJXMgaW4gc2VhcmNoIGRpcjogJXMiLCBmaWxlTmFtZSwgc2VhcmNoRGlyKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREQoIiAgICBubyAlcyBpbiBzZWFyY2ggZGlyOiAlcyIsIGZpbGVOYW1lLCBzZWFyY2hEaXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB9IHdoaWxlICgwKTsKKworRk9VTkQ6CisgICAgcmV0dXJuIEFTVFJEVVAodGVtcCk7Cit9CisKKy8qIFNlYXJjaCBmb3IgYSBmaWxlIGluIHRoZSBjb250ZW50IGRpcmVjdG9yeSwgYW5kIGlmIG5vdCBmb3VuZCwgaW4gdGhlCisgKiBTREsgc2VhcmNoIGRpcmVjdG9yeS4gUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIGNoYXIqCitfYXZkSW5mb19nZXRDb250ZW50T3JTZGtGaWxlUGF0aChjb25zdCBBdmRJbmZvKiAgaSwgY29uc3QgY2hhciogIGZpbGVOYW1lKQoreworICAgIGNoYXIqICBwYXRoOworCisgICAgcGF0aCA9IF9hdmRJbmZvX2dldENvbnRlbnRGaWxlUGF0aChpLCBmaWxlTmFtZSk7CisgICAgaWYgKHBhdGgpCisgICAgICAgIHJldHVybiBwYXRoOworCisgICAgcGF0aCA9IF9hdmRJbmZvX2dldFNka0ZpbGVQYXRoKGksIGZpbGVOYW1lKTsKKyAgICBpZiAocGF0aCkKKyAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQKK19hdmRJbmZvX2ZpbmRDb250ZW50T3JTZGtJbWFnZShjb25zdCBBdmRJbmZvKiBpLCBBdmRJbWFnZVR5cGUgaWQpCit7CisgICAgY29uc3QgY2hhciogZmlsZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbaWRdOworICAgIGNoYXIqICAgICAgIHBhdGggICAgID0gX2F2ZEluZm9fZ2V0Q29udGVudE9yU2RrRmlsZVBhdGgoaSwgZmlsZU5hbWUpOworCisgICAgaS0+aW1hZ2VQYXRoW2lkXSAgPSBwYXRoOworICAgIGktPmltYWdlU3RhdGVbaWRdID0gSU1BR0VfU1RBVEVfUkVBRE9OTFk7CisKKyAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBSZXR1cm5zIHBhdGggdG8gdGhlIGNvcmUgaGFyZHdhcmUgLmluaSBmaWxlLiBUaGlzIGNvbnRhaW5zIHRoZQorICogaGFyZHdhcmUgY29uZmlndXJhdGlvbiB0aGF0IGlzIHJlYWQgYnkgdGhlIGNvcmUuIFRoZSBjb250ZW50IG9mIHRoaXMKKyAqIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgYmVmb3JlIGxhdW5jaGluZyBhIGNvcmUsIGJ1dCB3ZSBuZWVkIHRvIGtub3cKKyAqIGl0cyBwYXRoIGJlZm9yZSB0aGF0LgorICovCitzdGF0aWMgaW50CitfYXZkSW5mb19nZXRDb3JlSHdJbmlQYXRoKCBBdmRJbmZvKiBpLCBjb25zdCBjaGFyKiBiYXNlUGF0aCApCit7CisgICAgaS0+Y29yZUhhcmR3YXJlSW5pUGF0aCA9IF9nZXRGdWxsRmlsZVBhdGgoYmFzZVBhdGgsIENPUkVfSEFSRFdBUkVfSU5JKTsKKyAgICBpZiAoaS0+Y29yZUhhcmR3YXJlSW5pUGF0aCA9PSBOVUxMKSB7CisgICAgICAgIEREKCJQYXRoIHRvbyBsb25nIGZvciAlczogJXMiLCBDT1JFX0hBUkRXQVJFX0lOSSwgYmFzZVBhdGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEQoInVzaW5nIGNvcmUgaHcgY29uZmlnIHBhdGg6ICVzIiwgaS0+Y29yZUhhcmR3YXJlSW5pUGF0aCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK19hdmRJbmZvX3JlYWRQcm9wZXJ0eUZpbGUoY29uc3QgQXZkSW5mbyogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhKiBkYXRhKSB7CisgICAgaW50IHJldCA9IGZpbGVEYXRhX2luaXRGcm9tRmlsZShkYXRhLCBmaWxlUGF0aCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgRCgiRXJyb3IgcmVhZGluZyBwcm9wZXJ0eSBmaWxlICVzOiAlcyIsIGZpbGVQYXRoLCBzdHJlcnJvcigtcmV0KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRCgiUmVhZCBwcm9wZXJ0eSBmaWxlIGF0ICVzIiwgZmlsZVBhdGgpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorX2F2ZEluZm9fZXh0cmFjdEJ1aWxkUHJvcGVydGllcyhBdmRJbmZvKiBpKSB7CisgICAgaS0+dGFyZ2V0QXJjaCA9IHByb3BlcnR5RmlsZV9nZXRUYXJnZXRBcmNoKGktPmJ1aWxkUHJvcGVydGllcyk7CisgICAgaWYgKCFpLT50YXJnZXRBcmNoKSB7CisgICAgICAgIHN0cl9yZXNldCgmaS0+dGFyZ2V0QXJjaCwgImFybSIpOworICAgICAgICBEKCJDYW5ub3QgZmluZCB0YXJnZXQgQ1BVIGFyY2hpdGVjdHVyZSwgZGVmYXVsdGluZyB0byAnJXMnIiwKKyAgICAgICAgICBpLT50YXJnZXRBcmNoKTsKKyAgICB9CisgICAgaS0+dGFyZ2V0QWJpID0gcHJvcGVydHlGaWxlX2dldFRhcmdldEFiaShpLT5idWlsZFByb3BlcnRpZXMpOworICAgIGlmICghaS0+dGFyZ2V0QWJpKSB7CisgICAgICAgIHN0cl9yZXNldCgmaS0+dGFyZ2V0QWJpLCAiYXJtZWFiaSIpOworICAgICAgICBEKCJDYW5ub3QgZmluZCB0YXJnZXQgQ1BVIEFCSSwgZGVmYXVsdGluZyB0byAnJXMnIiwKKyAgICAgICAgICBpLT50YXJnZXRBYmkpOworICAgIH0KKyAgICBpZiAoIWktPmFwaUxldmVsKSB7CisgICAgICAgIC8vIE5vdGU6IGZvciByZWd1bGFyIEFWRHMsIHRoZSBBUEkgbGV2ZWwgaXMgYWxyZWFkeSBleHRyYWN0ZWQKKyAgICAgICAgLy8gZnJvbSBjb25maWcuaW5pLCBiZXNpZGVzLCBmb3Igb2xkZXIgU0RLIHBsYXRmb3JtIGltYWdlcywKKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gYnVpbGQucHJvcCBmaWxlIGFuZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uCisgICAgICAgIC8vIHdvdWxkIGFsd2F5cyByZXR1cm4gMTAwMCwgbWFraW5nIHRoZSBBVkQgdW5ib290YWJsZSEuCisgICAgICAgIGktPmFwaUxldmVsID0gcHJvcGVydHlGaWxlX2dldEFwaUxldmVsKGktPmJ1aWxkUHJvcGVydGllcyk7CisgICAgICAgIGlmIChpLT5hcGlMZXZlbCA8IDMpIHsKKyAgICAgICAgICAgIGktPmFwaUxldmVsID0gMzsKKyAgICAgICAgICAgIEQoIkNhbm5vdCBmaW5kIHRhcmdldCBBUEkgbGV2ZWwsIGRlZmF1bHRpbmcgdG8gJWQiLAorICAgICAgICAgICAgaS0+YXBpTGV2ZWwpOworICAgICAgICB9CisgICAgfQorICAgIGktPmlzR29vZ2xlQXBpcyA9IHByb3BlcnR5RmlsZV9pc0dvb2dsZUFwaXMoaS0+YnVpbGRQcm9wZXJ0aWVzKTsKKyAgICBpLT5pbmNyZW1lbnRhbFZlcnNpb24gPSBwcm9wZXJ0eUZpbGVfZ2V0SW50KAorICAgICAgICBpLT5idWlsZFByb3BlcnRpZXMsCisgICAgICAgICJyby5idWlsZC52ZXJzaW9uLmluY3JlbWVudGFsIiwKKyAgICAgICAgLTEsCisgICAgICAgIE5VTEwpOworfQorCisKK3N0YXRpYyB2b2lkCitfYXZkSW5mb19nZXRQcm9wZXJ0eUZpbGUoQXZkSW5mbyogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9wRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGEqIGRhdGEgKSB7CisgICAgY2hhciogZmlsZVBhdGggPSBfYXZkSW5mb19nZXRDb250ZW50T3JTZGtGaWxlUGF0aChpLCBwcm9wRmlsZU5hbWUpOworICAgIGlmICghZmlsZVBhdGgpIHsKKyAgICAgICAgRCgiTm8gJXMgcHJvcGVydHkgZmlsZSBmb3VuZC4iLCBwcm9wRmlsZU5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX2F2ZEluZm9fcmVhZFByb3BlcnR5RmlsZShpLCBmaWxlUGF0aCwgZGF0YSk7CisgICAgZnJlZShmaWxlUGF0aCk7Cit9CisKK0F2ZEluZm8qCithdmRJbmZvX25ldyggY29uc3QgY2hhciogIG5hbWUsIEF2ZEluZm9QYXJhbXMqICBwYXJhbXMgKQoreworICAgIEF2ZEluZm8qICBpOworCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIV9jaGVja0F2ZE5hbWUobmFtZSkpIHsKKyAgICAgICAgZGVycm9yKCJ2aXJ0dWFsIGRldmljZSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBBTkVXMChpKTsKKyAgICBzdHJfcmVzZXQoJmktPmRldmljZU5hbWUsIG5hbWUpOworCisgICAgaWYgKCBfYXZkSW5mb19nZXRTZGtSb290KGkpIDwgMCAgICAgfHwKKyAgICAgICAgIF9hdmRJbmZvX2dldFJvb3RJbmkoaSkgPCAwICAgICB8fAorICAgICAgICAgX2F2ZEluZm9fZ2V0Q29udGVudFBhdGgoaSkgPCAwIHx8CisgICAgICAgICBfYXZkSW5mb19nZXRDb25maWdJbmkoaSkgICA8IDAgfHwKKyAgICAgICAgIF9hdmRJbmZvX2dldENvcmVId0luaVBhdGgoaSwgaS0+Y29udGVudFBhdGgpIDwgMCApCisgICAgICAgIGdvdG8gRkFJTDsKKworICAgIGktPmFwaUxldmVsID0gX2F2ZEluZm9fZ2V0QXBpTGV2ZWwoaSk7CisKKyAgICAvKiBsb29rIGZvciBpbWFnZSBzZWFyY2ggcGF0aHMuIGhhbmRsZSBwb3N0IDEuMS9wcmUgY3VwY2FrZQorICAgICAqIG9ic29sZXRlIFNES3MuCisgICAgICovCisgICAgaWYgKCFfYXZkSW5mb19nZXRTZWFyY2hQYXRocyhpKSkgeworICAgICAgICBnb3RvIEZBSUw7CisgICAgfQorCisgICAgLy8gRmluZCB0aGUgYnVpbGQucHJvcCBhbmQgYm9vdC5wcm9wIGZpbGVzIGFuZCByZWFkIHRoZW0uCisgICAgX2F2ZEluZm9fZ2V0UHJvcGVydHlGaWxlKGksICJidWlsZC5wcm9wIiwgaS0+YnVpbGRQcm9wZXJ0aWVzKTsKKyAgICBfYXZkSW5mb19nZXRQcm9wZXJ0eUZpbGUoaSwgImJvb3QucHJvcCIsIGktPmJvb3RQcm9wZXJ0aWVzKTsKKworICAgIF9hdmRJbmZvX2V4dHJhY3RCdWlsZFByb3BlcnRpZXMoaSk7CisKKyAgICAvKiBkb24ndCBuZWVkIHRoaXMgYW55bW9yZSAqLworICAgIGluaUZpbGVfZnJlZShpLT5yb290SW5pKTsKKyAgICBpLT5yb290SW5pID0gTlVMTDsKKworICAgIHJldHVybiBpOworCitGQUlMOgorICAgIGF2ZEluZm9fZnJlZShpKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogICAgQU5EUk9JRCBCVUlMRCBTVVBQT1JUCisgKioqKioKKyAqKioqKiAgICBUaGUgY29kZSBiZWxvdyBjb3JyZXNwb25kcyB0byB0aGUgY2FzZSB3aGVyZSB3ZSdyZQorICoqKioqICAgIHN0YXJ0aW5nIHRoZSBlbXVsYXRvciBpbnNpZGUgdGhlIEFuZHJvaWQgYnVpbGQKKyAqKioqKiAgICBzeXN0ZW0uIFRoZSBtYWluIGRpZmZlcmVuY2VzIGFyZSB0aGF0OgorICoqKioqCisgKioqKiogICAgLSB0aGUgJEFORFJPSURfUFJPRFVDVF9PVVQgZGlyZWN0b3J5IGlzIHVzZWQgYXMgdGhlCisgKioqKiogICAgICBjb250ZW50IGZpbGUuCisgKioqKioKKyAqKioqKiAgICAtIGJ1aWx0IGltYWdlcyBtdXN0IG5vdCBiZSBtb2RpZmllZCBieSB0aGUgZW11bGF0b3IsCisgKioqKiogICAgICBzbyBzeXN0ZW0uaW1nIG11c3QgYmUgY29waWVkIHRvIGEgdGVtcG9yYXJ5IGZpbGUKKyAqKioqKiAgICAgIGFuZCB1c2VyZGF0YS5pbWcgbXVzdCBiZSBjb3BpZWQgdG8gdXNlcmRhdGEtcWVtdS5pbWcKKyAqKioqKiAgICAgIGlmIHRoZSBsYXR0ZXIgZG9lc24ndCBleGlzdC4KKyAqKioqKgorICoqKioqICAgIC0gdGhlIGtlcm5lbCBhbmQgZGVmYXVsdCBza2luIGRpcmVjdG9yeSBhcmUgdGFrZW4gZnJvbQorICoqKioqICAgICAgcHJlYnVpbHQKKyAqKioqKgorICoqKioqICAgIC0gdGhlcmUgaXMgbm8gcm9vdCAuaW5pIGZpbGUsIG9yIGFueSBjb25maWcuaW5pIGluCisgKioqKiogICAgICB0aGUgY29udGVudCBkaXJlY3RvcnksIG5vIFNESyBpbWFnZXMgc2VhcmNoIHBhdGguCisgKioqKiovCisKKy8qIFJlYWQgYSBoYXJkd2FyZS5pbmkgaWYgaXQgaXMgbG9jYXRlZCBpbiB0aGUgc2tpbiBkaXJlY3RvcnkgKi8KK3N0YXRpYyBpbnQKK19hdmRJbmZvX2dldEJ1aWxkU2tpbkhhcmR3YXJlSW5pKCBBdmRJbmZvKiAgaSApCit7CisgICAgY2hhciogc2tpbk5hbWU7CisgICAgY2hhciogc2tpbkRpclBhdGg7CisKKyAgICBhdmRJbmZvX2dldFNraW5JbmZvKGksICZza2luTmFtZSwgJnNraW5EaXJQYXRoKTsKKyAgICBpZiAoc2tpbkRpclBhdGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgcmVzdWx0ID0gYXZkSW5mb19nZXRTa2luSGFyZHdhcmVJbmkoaSwgc2tpbk5hbWUsIHNraW5EaXJQYXRoKTsKKworICAgIEFGUkVFKHNraW5OYW1lKTsKKyAgICBBRlJFRShza2luRGlyUGF0aCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgYXZkSW5mb19nZXRTa2luSGFyZHdhcmVJbmkoIEF2ZEluZm8qIGksIGNoYXIqIHNraW5OYW1lLCBjaGFyKiBza2luRGlyUGF0aCkKK3sKKyAgICBjaGFyICB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKworICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy8lcy9oYXJkd2FyZS5pbmkiLCBza2luRGlyUGF0aCwgc2tpbk5hbWUpOworICAgIGlmIChwID49IGVuZCB8fCAhcGF0aF9leGlzdHModGVtcCkpIHsKKyAgICAgICAgREQoIm5vIHNraW4tc3BlY2lmaWMgaGFyZHdhcmUuaW5pIGluICVzIiwgc2tpbkRpclBhdGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBEKCJmb3VuZCBza2luLXNwZWNpZmljIGhhcmR3YXJlLmluaTogJXMiLCB0ZW1wKTsKKyAgICBpZiAoaS0+c2tpbkhhcmR3YXJlSW5pICE9IE5VTEwpCisgICAgICAgIGluaUZpbGVfZnJlZShpLT5za2luSGFyZHdhcmVJbmkpOworICAgIGktPnNraW5IYXJkd2FyZUluaSA9IGluaUZpbGVfbmV3RnJvbUZpbGUodGVtcCk7CisgICAgaWYgKGktPnNraW5IYXJkd2FyZUluaSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworQXZkSW5mbyoKK2F2ZEluZm9fbmV3Rm9yQW5kcm9pZEJ1aWxkKCBjb25zdCBjaGFyKiAgICAgYW5kcm9pZEJ1aWxkUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgYW5kcm9pZE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdmRJbmZvUGFyYW1zKiAgcGFyYW1zICkKK3sKKyAgICBBdmRJbmZvKiAgaTsKKworICAgIEFORVcwKGkpOworCisgICAgaS0+aW5BbmRyb2lkQnVpbGQgICA9IDE7CisgICAgc3RyX3Jlc2V0KCZpLT5hbmRyb2lkQnVpbGRSb290LCBhbmRyb2lkQnVpbGRSb290KTsKKyAgICBzdHJfcmVzZXQoJmktPmFuZHJvaWRPdXQsIGFuZHJvaWRPdXQpOworICAgIHN0cl9yZXNldCgmaS0+Y29udGVudFBhdGgsIGFuZHJvaWRPdXQpOworCisgICAgLy8gRmluZCB0aGUgYnVpbGQucHJvcCBmaWxlIGFuZCByZWFkIGl0LgorICAgIGNoYXIqIGJ1aWxkUHJvcFBhdGggPSBwYXRoX2dldEJ1aWxkQnVpbGRQcm9wKGktPmFuZHJvaWRPdXQpOworICAgIGlmIChidWlsZFByb3BQYXRoKSB7CisgICAgICAgIF9hdmRJbmZvX3JlYWRQcm9wZXJ0eUZpbGUoaSwgYnVpbGRQcm9wUGF0aCwgaS0+YnVpbGRQcm9wZXJ0aWVzKTsKKyAgICAgICAgZnJlZShidWlsZFByb3BQYXRoKTsKKyAgICB9CisKKyAgICAvLyBGSW5kIHRoZSBib290LnByb3AgZmlsZSBhbmQgcmVhZCBpdC4KKyAgICBjaGFyKiBib290UHJvcFBhdGggPSBwYXRoX2dldEJ1aWxkQm9vdFByb3AoaS0+YW5kcm9pZE91dCk7CisgICAgaWYgKGJvb3RQcm9wUGF0aCkgeworICAgICAgICBfYXZkSW5mb19yZWFkUHJvcGVydHlGaWxlKGksIGJvb3RQcm9wUGF0aCwgaS0+Ym9vdFByb3BlcnRpZXMpOworICAgICAgICBmcmVlKGJvb3RQcm9wUGF0aCk7CisgICAgfQorCisgICAgX2F2ZEluZm9fZXh0cmFjdEJ1aWxkUHJvcGVydGllcyhpKTsKKworICAgIHN0cl9yZXNldCgmaS0+ZGV2aWNlTmFtZSwgIjxidWlsZD4iKTsKKworICAgIC8qIG91dC90YXJnZXQvcHJvZHVjdC88bmFtZT4vY29uZmlnLmluaSwgaWYgZXhpc3RzLCBwcm92aWRlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBmcm9tIGJ1aWxkIGZpbGVzLiAqLworICAgIGlmIChfYXZkSW5mb19nZXRDb25maWdJbmkoaSkgPCAwIHx8CisgICAgICAgIF9hdmRJbmZvX2dldENvcmVId0luaVBhdGgoaSwgaS0+YW5kcm9pZE91dCkgPCAwKQorICAgICAgICBnb3RvIEZBSUw7CisKKyAgICAvKiBSZWFkIHRoZSBidWlsZCBza2luJ3MgaGFyZHdhcmUuaW5pLCBpZiBhbnkgKi8KKyAgICBfYXZkSW5mb19nZXRCdWlsZFNraW5IYXJkd2FyZUluaShpKTsKKworICAgIHJldHVybiBpOworCitGQUlMOgorICAgIGF2ZEluZm9fZnJlZShpKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhcioKK2F2ZEluZm9fZ2V0TmFtZSggY29uc3QgQXZkSW5mbyogIGkgKQoreworICAgIHJldHVybiBpID8gaS0+ZGV2aWNlTmFtZSA6IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIqCithdmRJbmZvX2dldEltYWdlRmlsZSggY29uc3QgQXZkSW5mbyogIGksIEF2ZEltYWdlVHlwZSAgaW1hZ2VUeXBlICkKK3sKKyAgICBpZiAoaSA9PSBOVUxMIHx8ICh1bnNpZ25lZClpbWFnZVR5cGUgPj0gQVZEX0lNQUdFX01BWCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gaS0+aW1hZ2VQYXRoW2ltYWdlVHlwZV07Cit9CisKK3VpbnQ2NF90CithdmRJbmZvX2dldEltYWdlRmlsZVNpemUoIGNvbnN0IEF2ZEluZm8qICBpLCBBdmRJbWFnZVR5cGUgIGltYWdlVHlwZSApCit7CisgICAgY29uc3QgY2hhciogZmlsZSA9IGF2ZEluZm9fZ2V0SW1hZ2VGaWxlKGksIGltYWdlVHlwZSk7CisgICAgdWludDY0X3QgICAgc2l6ZTsKKworICAgIGlmIChmaWxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwVUxMOworCisgICAgaWYgKHBhdGhfZ2V0X3NpemUoZmlsZSwgJnNpemUpIDwgMCkKKyAgICAgICAgcmV0dXJuIDBVTEw7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworaW50CithdmRJbmZvX2lzSW1hZ2VSZWFkT25seSggY29uc3QgQXZkSW5mbyogIGksIEF2ZEltYWdlVHlwZSAgaW1hZ2VUeXBlICkKK3sKKyAgICBpZiAoaSA9PSBOVUxMIHx8ICh1bnNpZ25lZClpbWFnZVR5cGUgPj0gQVZEX0lNQUdFX01BWCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gKGktPmltYWdlU3RhdGVbaW1hZ2VUeXBlXSA9PSBJTUFHRV9TVEFURV9SRUFET05MWSk7Cit9CisKK2NoYXIqCithdmRJbmZvX2dldEtlcm5lbFBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9LRVJORUwgXTsKKworICAgIGNoYXIqICBrZXJuZWxQYXRoID0gX2F2ZEluZm9fZ2V0Q29udGVudE9yU2RrRmlsZVBhdGgoaSwgaW1hZ2VOYW1lKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKGtlcm5lbFBhdGggfHwgIWktPmluQW5kcm9pZEJ1aWxkKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogV2hlbiBpbiB0aGUgQW5kcm9pZCBidWlsZCwgbG9vayBpbnRvIHRoZSBwcmVidWlsdCBkaXJlY3RvcnkKKyAgICAgICAgICogZm9yIG91ciB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnAgPSB0ZW1wLCAqZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKyAgICAgICAgY29uc3QgY2hhciogc3VmZml4ID0gIiI7CisKKyAgICAgICAgLy8gSWYgdGhlIHRhcmdldCBBQkkgaXMgYXJtZWFiaS12N2EsIHRoZW4gbG9vayBmb3IKKyAgICAgICAgLy8ga2VybmVsLXFlbXUtYXJtdjcgaW5zdGVhZCBvZiBrZXJuZWwtcWVtdSBpbiB0aGUgcHJlYnVpbHQKKyAgICAgICAgLy8gZGlyZWN0b3J5LgorICAgICAgICBpZiAoIXN0cmNtcChpLT50YXJnZXRBYmksICJhcm1lYWJpLXY3YSIpKSB7CisgICAgICAgICAgICBzdWZmaXggPSAiLWFybXY3IjsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy9rZXJuZWwiLCBpLT5hbmRyb2lkT3V0KTsKKyAgICAgICAgaWYgKHAgPCBlbmQgJiYgcGF0aF9leGlzdHModGVtcCkpIHsKKyAgICAgICAgICAgIHN0cl9yZXNldCgma2VybmVsUGF0aCwgdGVtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy9wcmVidWlsdHMvcWVtdS1rZXJuZWwvJXMva2VybmVsLXFlbXUlcyIsCisgICAgICAgICAgICAgICAgICAgICBpLT5hbmRyb2lkQnVpbGRSb290LCBpLT50YXJnZXRBcmNoLCBzdWZmaXgpOworICAgICAgICBpZiAocCA+PSBlbmQgfHwgIXBhdGhfZXhpc3RzKHRlbXApKSB7CisgICAgICAgICAgICBkZXJyb3IoImJhZCB3b3Jrc3BhY2U6IGNhbm5vdCBmaW5kIHByZWJ1aWx0IGtlcm5lbCBpbjogJXMiLCB0ZW1wKTsKKyAgICAgICAgICAgIGtlcm5lbFBhdGggPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZrZXJuZWxQYXRoLCB0ZW1wKTsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgcmV0dXJuIGtlcm5lbFBhdGg7Cit9CisKK2NoYXIqCithdmRJbmZvX2dldFJhbmNodUtlcm5lbFBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9LRVJORUxSQU5DSFUgXTsKKworICAgIGNoYXIqICBrZXJuZWxQYXRoID0gX2F2ZEluZm9fZ2V0Q29udGVudE9yU2RrRmlsZVBhdGgoaSwgaW1hZ2VOYW1lKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKGtlcm5lbFBhdGggfHwgIWktPmluQW5kcm9pZEJ1aWxkKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogV2hlbiBpbiB0aGUgQW5kcm9pZCBidWlsZCwgbG9vayBpbnRvIHRoZSBwcmVidWlsdCBkaXJlY3RvcnkKKyAgICAgICAgICogZm9yIG91ciB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnAgPSB0ZW1wLCAqZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKworICAgICAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvcHJlYnVpbHRzL3FlbXUta2VybmVsLyVzL3JhbmNodS9rZXJuZWwtcWVtdSIsCisgICAgICAgICAgICAgICAgICAgICBpLT5hbmRyb2lkQnVpbGRSb290LCBpLT50YXJnZXRBcmNoKTsKKyAgICAgICAgaWYgKHAgPj0gZW5kIHx8ICFwYXRoX2V4aXN0cyh0ZW1wKSkgeworICAgICAgICAgICAgLyogYXJtNjQgYW5kIG1pcHM2NCBhcmUgc3BlY2lhbDogdGhlaXIga2VybmVsLXFlbXUgaXMgYWN0dWFsbHkga2VybmVsLXJhbmNodSAqLworICAgICAgICAgICAgaWYgKCFzdHJjbXAoaS0+dGFyZ2V0QXJjaCwgImFybTY0IikgfHwgIXN0cmNtcChpLT50YXJnZXRBcmNoLCAibWlwczY0IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXZkSW5mb19nZXRLZXJuZWxQYXRoKGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImJhZCB3b3Jrc3BhY2U6IGNhbm5vdCBmaW5kIHByZWJ1aWx0IHJhbmNodSBrZXJuZWwgaW46ICVzIiwgdGVtcCk7CisgICAgICAgICAgICAgICAga2VybmVsUGF0aCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZrZXJuZWxQYXRoLCB0ZW1wKTsKKyAgICB9IHdoaWxlICgwKTsKKworICAgIHJldHVybiBrZXJuZWxQYXRoOworfQorCisKK2NoYXIqCithdmRJbmZvX2dldFJhbWRpc2tQYXRoKCBjb25zdCBBdmRJbmZvKiBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9SQU1ESVNLIF07CisgICAgcmV0dXJuIF9hdmRJbmZvX2dldENvbnRlbnRPclNka0ZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2NoYXIqICBhdmRJbmZvX2dldENhY2hlUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKQoreworICAgIGNvbnN0IGNoYXIqIGltYWdlTmFtZSA9IF9pbWFnZUZpbGVOYW1lc1sgQVZEX0lNQUdFX0NBQ0hFIF07CisgICAgcmV0dXJuIF9hdmRJbmZvX2dldENvbnRlbnRGaWxlUGF0aChpLCBpbWFnZU5hbWUpOworfQorCitjaGFyKiAgYXZkSW5mb19nZXREZWZhdWx0Q2FjaGVQYXRoKCBjb25zdCBBdmRJbmZvKiAgaSApCit7CisgICAgY29uc3QgY2hhciogaW1hZ2VOYW1lID0gX2ltYWdlRmlsZU5hbWVzWyBBVkRfSU1BR0VfQ0FDSEUgXTsKKyAgICByZXR1cm4gX2dldEZ1bGxGaWxlUGF0aChpLT5jb250ZW50UGF0aCwgaW1hZ2VOYW1lKTsKK30KKworY2hhciogIGF2ZEluZm9fZ2V0U2RDYXJkUGF0aCggY29uc3QgQXZkSW5mbyogaSApCit7CisgICAgY29uc3QgY2hhciogaW1hZ2VOYW1lID0gX2ltYWdlRmlsZU5hbWVzWyBBVkRfSU1BR0VfU0RDQVJEIF07CisgICAgY2hhciogICAgICAgcGF0aDsKKworICAgIC8qIFNwZWNpYWwgY2FzZSwgdGhlIGNvbmZpZy5pbmkgY2FuIGhhdmUgYSBTRENBUkRfUEFUSCBlbnRyeQorICAgICAqIHRoYXQgZ2l2ZXMgdGhlIGZ1bGwgcGF0aCB0byB0aGUgU0QgQ2FyZC4KKyAgICAgKi8KKyAgICBpZiAoaS0+Y29uZmlnSW5pICE9IE5VTEwpIHsKKyAgICAgICAgcGF0aCA9IGluaUZpbGVfZ2V0U3RyaW5nKGktPmNvbmZpZ0luaSwgU0RDQVJEX1BBVEgsIE5VTEwpOworICAgICAgICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocGF0aF9leGlzdHMocGF0aCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICAgICAgICAgIGR3YXJuaW5nKCJJZ25vcmluZyBpbnZhbGlkIFNEQ2FyZCBwYXRoOiAlcyIsIHBhdGgpOworICAgICAgICAgICAgQUZSRUUocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPdGhlcndpc2UsIHNpbXBseSBsb29rIGludG8gdGhlIGNvbnRlbnQgZGlyZWN0b3J5ICovCisgICAgcmV0dXJuIF9hdmRJbmZvX2dldENvbnRlbnRGaWxlUGF0aChpLCBpbWFnZU5hbWUpOworfQorCitjaGFyKiBhdmRJbmZvX2dldEVuY3J5cHRpb25LZXlJbWFnZVBhdGgoY29uc3QgQXZkSW5mbyogaSApCit7CisgICAgY29uc3QgY2hhciogaW1hZ2VOYW1lID0gX2ltYWdlRmlsZU5hbWVzWyBBVkRfSU1BR0VfRU5DUllQVElPTktFWSBdOworICAgIHJldHVybiBfYXZkSW5mb19nZXRDb250ZW50RmlsZVBhdGgoaSwgaW1hZ2VOYW1lKTsKK30KKworY2hhcioKK2F2ZEluZm9fZ2V0U25hcFN0b3JhZ2VQYXRoKCBjb25zdCBBdmRJbmZvKiBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9TTkFQU0hPVFMgXTsKKyAgICByZXR1cm4gX2F2ZEluZm9fZ2V0Q29udGVudEZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2NoYXIqCithdmRJbmZvX2dldFN5c3RlbUltYWdlUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKQoreworICAgIGNvbnN0IGNoYXIqIGltYWdlTmFtZSA9IF9pbWFnZUZpbGVOYW1lc1sgQVZEX0lNQUdFX1VTRVJTWVNURU0gXTsKKyAgICByZXR1cm4gX2F2ZEluZm9fZ2V0Q29udGVudEZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2NoYXIqCithdmRJbmZvX2dldFN5c3RlbUluaXRJbWFnZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9JTklUU1lTVEVNIF07CisgICAgcmV0dXJuIF9hdmRJbmZvX2dldENvbnRlbnRPclNka0ZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2NoYXIqCithdmRJbmZvX2dldERhdGFJbWFnZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9VU0VSREFUQSBdOworICAgIHJldHVybiBfYXZkSW5mb19nZXRDb250ZW50RmlsZVBhdGgoaSwgaW1hZ2VOYW1lKTsKK30KKworY2hhcioKK2F2ZEluZm9fZ2V0RGVmYXVsdERhdGFJbWFnZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICkKK3sKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9VU0VSREFUQSBdOworICAgIHJldHVybiBfZ2V0RnVsbEZpbGVQYXRoKGktPmNvbnRlbnRQYXRoLCBpbWFnZU5hbWUpOworfQorCitjaGFyKiBhdmRJbmZvX2dldERlZmF1bHRTeXN0ZW1GZWF0dXJlQ29udHJvbFBhdGgoY29uc3QgQXZkSW5mbyogaSkgeworICAgIGNoYXIqIHJldFZhbCA9IF9hdmRJbmZvX2dldFNka0ZpbGVQYXRoKGksICJhZHZhbmNlZEZlYXR1cmVzLmluaSIpOworICAgIHJldHVybiByZXRWYWw7Cit9CisKK2NoYXIqIGF2ZEluZm9fZ2V0RGF0YUluaXRJbWFnZVBhdGgoY29uc3QgQXZkSW5mbyogaSkgeworICAgIGNvbnN0IGNoYXIqIGltYWdlTmFtZSA9IF9pbWFnZUZpbGVOYW1lc1sgQVZEX0lNQUdFX0lOSVREQVRBIF07CisgICAgcmV0dXJuIF9hdmRJbmZvX2dldENvbnRlbnRPclNka0ZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2NoYXIqIGF2ZEluZm9fZ2V0RGF0YUluaXREaXJQYXRoKGNvbnN0IEF2ZEluZm8qIGkpIHsKKyAgICBjb25zdCBjaGFyKiBpbWFnZU5hbWUgPSBfaW1hZ2VGaWxlTmFtZXNbIEFWRF9JTUFHRV9JTklUWklQIF07CisgICAgcmV0dXJuIF9hdmRJbmZvX2dldFNka0ZpbGVQYXRoKGksIGltYWdlTmFtZSk7Cit9CisKK2ludAorYXZkSW5mb19pbml0SHdDb25maWcoY29uc3QgQXZkSW5mbyogaSwgQW5kcm9pZEh3Q29uZmlnKiAgaHcsIGJvb2wgaXNRZW11MikKK3sKKyAgICBpbnQgIHJldCA9IDA7CisKKyAgICBhbmRyb2lkSHdDb25maWdfaW5pdChodywgaS0+YXBpTGV2ZWwpOworCisgICAgLyogRmlyc3QgcmVhZCB0aGUgc2tpbidzIGhhcmR3YXJlLmluaSwgaWYgYW55ICovCisgICAgaWYgKGktPnNraW5IYXJkd2FyZUluaSAhPSBOVUxMKSB7CisgICAgICAgIHJldCA9IGFuZHJvaWRId0NvbmZpZ19yZWFkKGh3LCBpLT5za2luSGFyZHdhcmVJbmkpOworICAgIH0KKworICAgIC8qIFRoZSBkZXZpY2UncyBjb25maWcuaW5pIGNhbiBvdmVycmlkZSB0aGUgc2tpbidzIHZhbHVlcworICAgICAqICh3aGljaCBpcyBwcmVmZXJhYmxlIHRvIHRoZSBvcHBvc2l0ZSBvcmRlcikKKyAgICAgKi8KKyAgICBpZiAocmV0ID09IDAgJiYgaS0+Y29uZmlnSW5pICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gYW5kcm9pZEh3Q29uZmlnX3JlYWQoaHcsIGktPmNvbmZpZ0luaSk7CisgICAgfQorCisgICAgLyogQXV0by1kaXNhYmxlIGtleWJvYXJkIGVtdWxhdGlvbiBvbiBzYXBwaGlyZSBwbGF0Zm9ybSBidWlsZHMgKi8KKyAgICBpZiAoaS0+YW5kcm9pZE91dCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIqICBwID0gc3RycmNocihpLT5hbmRyb2lkT3V0LCAnLycpOworICAgICAgICBpZiAocCAhPSBOVUxMICYmICFzdHJjbXAocCwic2FwcGhpcmUiKSkgeworICAgICAgICAgICAgaHctPmh3X2tleWJvYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGZvciBhcGkgPD0gMTAgdGhlcmUgaXMgbm8gbXVsdGktdG91Y2ggc3VwcG9ydCBpbiBhbnkgb2YgdGhlIHJhbmNodQorICAgIC8vIG9yIGdvbGRmaXNoIGtlcm5lbHMgYW5kIEdVSSB3b24ndCByZXNwb25kIGFzIGEgcmVzdWx0OworICAgIC8vIGZvcmNlIGl0IHRvIGJlICJ0b3VjaCIKKyAgICAvLworICAgIC8vIGZvciBhcGkgPD0gMjEgdGhlIGdvbGRmaXNoIGtlcm5lbCBpcyBub3QgdXBkYXRlZCB0bworICAgIC8vIHN1cHBvcnQgbXVsdGktdG91Y2ggeWV0OyBzbyBqdXN0IGZvcmNlIHRvdWNoCisgICAgLy8gYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0xOTkyODkKKyAgICAvLworICAgIC8vIFN5c3RlbSBpbWFnZXMgYWJvdmUgMTAgc3VwcG9ydCBtdWx0aS10b3VjaCBpZiB0aGV5IGhhdmUgYSByYW5jaHUga2VybmVsCisgICAgLy8gYW5kIHdlJ3JlIHVzaW5nIFFFTVUyIGFzIGluZGljYXRlZCBieSB0aGUgaXNRZW11MiBmbGFnLgorICAgIC8vCisgICAgLy8gVE9ETzogVGhlcmUgaXMgY3VycmVudGx5IGFuIGlzc3VlIHJlbGF0ZWQgdG8gdGhpcyB0byB0cmFjayB0aGUgcmVsZWFzZSBvZgorICAgIC8vIHN5c3RlbSBpbWFnZXMgd2l0aCByYW5jaHUga2VybmVscyBmb3IgQVBJIDIxIGFuZCBiZWxvdyBhdDoKKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0yMDAzMzIKKyAgICBpZiAoaS0+YXBpTGV2ZWwgPD0gMTAgfHwgKCFpc1FlbXUyICYmIGktPmFwaUxldmVsIDw9IDIxKSkgeworICAgICAgICAgICAgc3RyX3Jlc2V0KCZody0+aHdfc2NyZWVuLCAidG91Y2giKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyKgorYXZkSW5mb19nZXRDb250ZW50UGF0aCggY29uc3QgQXZkSW5mbyogIGkgKQoreworICAgIHJldHVybiBpLT5jb250ZW50UGF0aDsKK30KKworaW50CithdmRJbmZvX2luQW5kcm9pZEJ1aWxkKCBjb25zdCBBdmRJbmZvKiAgaSApCit7CisgICAgcmV0dXJuIGktPmluQW5kcm9pZEJ1aWxkOworfQorCitjaGFyKgorYXZkSW5mb19nZXRUYXJnZXRDcHVBcmNoKGNvbnN0IEF2ZEluZm8qIGkpIHsKKyAgICByZXR1cm4gQVNUUkRVUChpLT50YXJnZXRBcmNoKTsKK30KKworY2hhcioKK2F2ZEluZm9fZ2V0VGFyZ2V0QWJpKCBjb25zdCBBdmRJbmZvKiBpICkKK3sKKyAgICAvKiBGb3Igbm93LCB3ZSBjYW4ndCBnZXQgdGhlIEFCSSBmcm9tIFNESyBBVkRzICovCisgICAgcmV0dXJuIEFTVFJEVVAoaS0+dGFyZ2V0QWJpKTsKK30KKworY2hhcioKK2F2ZEluZm9fZ2V0Q29kZVByb2ZpbGVQYXRoKCBjb25zdCBBdmRJbmZvKiAgaSwgY29uc3QgY2hhciogIHByb2ZpbGVOYW1lICkKK3sKKyAgICBjaGFyICAgdG1wW01BWF9QQVRIXSwgKnA9dG1wLCAqZW5kPXAgKyBzaXplb2YodG1wKTsKKworICAgIGlmIChpID09IE5VTEwgfHwgcHJvZmlsZU5hbWUgPT0gTlVMTCB8fCBwcm9maWxlTmFtZVswXSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChpLT5pbkFuZHJvaWRCdWlsZCkgeworICAgICAgICBwID0gYnVmcHJpbnQoIHAsIGVuZCwgIiVzIiBQQVRIX1NFUCAicHJvZmlsZXMiIFBBVEhfU0VQICIlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaS0+YW5kcm9pZE91dCwgcHJvZmlsZU5hbWUgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwID0gYnVmcHJpbnQoIHAsIGVuZCwgIiVzIiBQQVRIX1NFUCAicHJvZmlsZXMiIFBBVEhfU0VQICIlcyIsCisgICAgICAgICAgICAgICAgICAgICAgaS0+Y29udGVudFBhdGgsIHByb2ZpbGVOYW1lICk7CisgICAgfQorICAgIHJldHVybiBBU1RSRFVQKHRtcCk7Cit9CisKK2NvbnN0IGNoYXIqCithdmRJbmZvX2dldENvcmVId0luaVBhdGgoIGNvbnN0IEF2ZEluZm8qIGkgKQoreworICAgIHJldHVybiBpLT5jb3JlSGFyZHdhcmVJbmlQYXRoOworfQorCisKK3ZvaWQKK2F2ZEluZm9fZ2V0U2tpbkluZm8oIGNvbnN0IEF2ZEluZm8qICBpLCBjaGFyKiogcFNraW5OYW1lLCBjaGFyKiogcFNraW5EaXIgKQoreworICAgIGNoYXIqICBza2luTmFtZSA9IE5VTEw7CisgICAgY2hhciogIHNraW5QYXRoOworICAgIGNoYXIgICB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKworICAgICpwU2tpbk5hbWUgPSBOVUxMOworICAgICpwU2tpbkRpciAgPSBOVUxMOworCisgICAgLyogRmlyc3QsIHNlZSBpZiB0aGUgY29uZmlnLmluaSBjb250YWlucyBhIFNLSU5fUEFUSCBlbnRyeSB0aGF0CisgICAgICogbmFtZXMgdGhlIGZ1bGwgZGlyZWN0b3J5IHBhdGggZm9yIHRoZSBza2luLgorICAgICAqLworICAgIGlmIChpLT5jb25maWdJbmkgIT0gTlVMTCApIHsKKyAgICAgICAgc2tpblBhdGggPSBpbmlGaWxlX2dldFN0cmluZyggaS0+Y29uZmlnSW5pLCBTS0lOX1BBVEgsIE5VTEwgKTsKKyAgICAgICAgaWYgKHNraW5QYXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgc2tpbiBuYW1lIGlzIG1hZ2ljIG9yIGEgZGlyZWN0IGRpcmVjdG9yeSBwYXRoCisgICAgICAgICAgICAqIHdlIGhhdmUgb3VyIHJlc3VsdCByaWdodCBoZXJlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChfZ2V0U2tpblBhdGhGcm9tTmFtZShza2luUGF0aCwgaS0+c2RrUm9vdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNraW5OYW1lLCBwU2tpbkRpciApKSB7CisgICAgICAgICAgICAgICAgQUZSRUUoc2tpblBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBTS0lOX1BBVEggZW50cnkgd2FzIG5vdCB2YWxpZCwgc28gbG9vayBhdCBTS0lOX05BTUUgKi8KKyAgICAgICAgRCgiV2FybmluZzogIiBDT1JFX0NPTkZJR19JTkkgIiBjb250YWlucyBpbnZhbGlkICVzIGVudHJ5OiAlcyIsCisgICAgICAgICAgU0tJTl9QQVRILCBza2luUGF0aCk7CisgICAgICAgIEFGUkVFKHNraW5QYXRoKTsKKworICAgICAgICBza2luTmFtZSA9IGluaUZpbGVfZ2V0U3RyaW5nKCBpLT5jb25maWdJbmksIFNLSU5fTkFNRSwgTlVMTCApOworICAgIH0KKworICAgIGlmIChza2luTmFtZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNraW4gbGlzdGVkIGluIHRoZSBjb25maWcuaW5pLCB0cnkgdG8gc2VlIGlmCisgICAgICAgICAqIHRoZXJlIGlzIG9uZSBzaW5nbGUgJ3NraW4nIGRpcmVjdG9yeSBpbiB0aGUgY29udGVudCBkaXJlY3RvcnkuCisgICAgICAgICAqLworICAgICAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvc2tpbiIsIGktPmNvbnRlbnRQYXRoKTsKKyAgICAgICAgaWYgKHAgPCBlbmQgJiYgX2NoZWNrU2tpblBhdGgodGVtcCkpIHsKKyAgICAgICAgICAgIEQoInVzaW5nIHNraW4gY29udGVudCBmcm9tICVzIiwgdGVtcCk7CisgICAgICAgICAgICBBRlJFRShpLT5za2luTmFtZSk7CisgICAgICAgICAgICAqcFNraW5OYW1lID0gQVNUUkRVUCgic2tpbiIpOworICAgICAgICAgICAgKnBTa2luRGlyICA9IEFTVFJEVVAoaS0+Y29udGVudFBhdGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogb3RoZXJ3aXNlLCB1c2UgdGhlIGRlZmF1bHQgbmFtZSAqLworICAgICAgICBza2luTmFtZSA9IEFTVFJEVVAoU0tJTl9ERUZBVUxUKTsKKyAgICB9CisKKyAgICAvKiBub3cgdHJ5IHRvIGZpbmQgdGhlIHNraW4gZGlyZWN0b3J5IGZvciB0aGF0IG5hbWUgLQorICAgICAqLworICAgIGRvIHsKKyAgICAgICAgLyogZmlyc3QgdHJ5IHRoZSBjb250ZW50IGRpcmVjdG9yeSwgaS5lLiAkQ09OVEVOVC9za2lucy88bmFtZT4gKi8KKyAgICAgICAgc2tpblBhdGggPSBfY2hlY2tTa2luU2tpbnNEaXIoaS0+Y29udGVudFBhdGgsIHNraW5OYW1lKTsKKyAgICAgICAgaWYgKHNraW5QYXRoICE9IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKworI2RlZmluZSAgUFJFQlVJTFRfU0tJTlNfUk9PVCAiZGV2ZWxvcG1lbnQvdG9vbHMvZW11bGF0b3IiCisKKyAgICAgICAgLyogaWYgd2UgYXJlIGluIHRoZSBBbmRyb2lkIGJ1aWxkLCB0cnkgdGhlIHByZWJ1aWx0IGRpcmVjdG9yeSAqLworICAgICAgICBpZiAoaS0+aW5BbmRyb2lkQnVpbGQpIHsKKyAgICAgICAgICAgIHAgPSBidWZwcmludCggdGVtcCwgZW5kLCAiJXMvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaS0+YW5kcm9pZEJ1aWxkUm9vdCwgUFJFQlVJTFRfU0tJTlNfUk9PVCApOworICAgICAgICAgICAgaWYgKHAgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBza2luUGF0aCA9IF9jaGVja1NraW5Ta2luc0Rpcih0ZW1wLCBza2luTmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHNraW5QYXRoICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBvciBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgc3lzdGVtIGRpciAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIqIHBhcmVudERpciA9IHBhdGhfcGFyZW50KGktPmFuZHJvaWRPdXQsIDEpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnREaXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBza2luUGF0aCA9IF9jaGVja1NraW5Ta2luc0RpcihwYXJlbnREaXIsIHNraW5OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQUZSRUUocGFyZW50RGlyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNraW5QYXRoICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBsb29rIGluIHRoZSBzZWFyY2ggcGF0aHMuIEZvciBlYWNoIDxkaXI+IGluIHRoZSBsaXN0LAorICAgICAgICAgKiBsb29rIGludG8gPGRpcj4vLi4vc2tpbnMvPG5hbWU+LyAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgIG5uOworICAgICAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgaS0+bnVtU2VhcmNoUGF0aHM7IG5uKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyKiAgcGFyZW50RGlyID0gcGF0aF9wYXJlbnQoaS0+c2VhcmNoUGF0aHNbbm5dLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50RGlyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHNraW5QYXRoID0gX2NoZWNrU2tpblNraW5zRGlyKHBhcmVudERpciwgc2tpbk5hbWUpOworICAgICAgICAgICAgICAgIEFGUkVFKHBhcmVudERpcik7CisgICAgICAgICAgICAgICAgaWYgKHNraW5QYXRoICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChubiA8IGktPm51bVNlYXJjaFBhdGhzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZGlkbid0IGZpbmQgYW55dGhpbmcgISAqLworICAgICAgICAqcFNraW5OYW1lID0gc2tpbk5hbWU7CisgICAgICAgIHJldHVybjsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgaWYgKHBhdGhfc3BsaXQoc2tpblBhdGgsIHBTa2luRGlyLCBwU2tpbk5hbWUpIDwgMCkgeworICAgICAgICBkZXJyb3IoIndlaXJkIHNraW4gcGF0aDogJXMiLCBza2luUGF0aCk7CisgICAgICAgIEFGUkVFKHNraW5QYXRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBERCgiZm91bmQgc2tpbiAnJXMnIGluIGRpcmVjdG9yeTogJXMiLCAqcFNraW5OYW1lLCAqcFNraW5EaXIpOworICAgIEFGUkVFKHNraW5QYXRoKTsKKyAgICByZXR1cm47Cit9CisKK2NoYXIqCithdmRJbmZvX2dldENoYXJtYXBGaWxlKCBjb25zdCBBdmRJbmZvKiBpLCBjb25zdCBjaGFyKiBjaGFybWFwTmFtZSApCit7CisgICAgY2hhciAgICAgICAgZmlsZU5hbWVCdWZmW1BBVEhfTUFYXTsKKyAgICBjb25zdCBjaGFyKiBmaWxlTmFtZTsKKworICAgIGlmIChjaGFybWFwTmFtZSA9PSBOVUxMIHx8IGNoYXJtYXBOYW1lWzBdID09ICdcMCcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHN0cnN0cihjaGFybWFwTmFtZSwgIi5rY20iKSA9PSBOVUxMKSB7CisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lQnVmZiwgc2l6ZW9mIGZpbGVOYW1lQnVmZiwgIiVzLmtjbSIsIGNoYXJtYXBOYW1lKTsKKyAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZUJ1ZmY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsZU5hbWUgPSBjaGFybWFwTmFtZTsKKyAgICB9CisKKyAgICByZXR1cm4gX2F2ZEluZm9fZ2V0Q29udGVudE9yU2RrRmlsZVBhdGgoaSwgZmlsZU5hbWUpOworfQorCitpbnQgYXZkSW5mb19nZXRBZGJkQ29tbXVuaWNhdGlvbk1vZGUoIGNvbnN0IEF2ZEluZm8qIGkgKQoreworICAgIGlmIChpLT5hcGlMZXZlbCA8IDE2IHx8IGktPmFwaUxldmVsID4gOTkpIHsKKyAgICAgICAgLy8gUUVNVSBwaXBlIGZvciBBREIgY29tbXVuaWNhdGlvbiB3YXMgYWRkZWQgaW4gYW5kcm9pZC00LjEuMV9yMSBBUEkgMTYKKyAgICAgICAgRCgiQVBJIDwgMTYgb3IgdW5rbm93biwgZm9yY2luZyByby5hZGIucWVtdWQ9PTAiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gSWdub3JlIHByb3BlcnR5IGZpbGUgc2luY2UgYWxsIHN5c3RlbSBpbWFnZXMgaGF2ZSBiZWVuIHVwZGF0ZWQgYSBsb25nIHRpbWUKKyAgICAvLyBhZ28gdG8gc3VwcG9ydCB0aGUgcGlwZSBzZXJ2aWNlIGZvciBBUEkgbGV2ZWwgPj0gMTYuCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBhdmRJbmZvX2dldFNuYXBzaG90UHJlc2VudChjb25zdCBBdmRJbmZvKiBpKQoreworICAgIGlmIChpLT5jb25maWdJbmkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaW5pRmlsZV9nZXRCb29sZWFuKGktPmNvbmZpZ0luaSwgInNuYXBzaG90LnByZXNlbnQiLCAibm8iKTsKKyAgICB9Cit9CisKK2NvbnN0IEZpbGVEYXRhKiBhdmRJbmZvX2dldEJvb3RQcm9wZXJ0aWVzKGNvbnN0IEF2ZEluZm8qIGkpIHsKKyAgICByZXR1cm4gaS0+Ym9vdFByb3BlcnRpZXM7Cit9CisKK2ludCBhdmRJbmZvX2dldFN5c0ltZ0luY3JlbWVudGFsVmVyc2lvbihjb25zdCBBdmRJbmZvKiBpKSB7CisgICAgcmV0dXJuIGktPmluY3JlbWVudGFsVmVyc2lvbjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvaW5mby5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhZDI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvaW5mby5oCkBAIC0wLDAgKzEsMzIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2h3LWNvbmZpZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YS5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBBbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIChBVkQgZm9yIHNob3J0KSBjb3JyZXNwb25kcyB0byBhCisgKiBkaXJlY3RvcnkgY29udGFpbmluZyBhbGwga2VybmVsL2Rpc2sgaW1hZ2VzIGZvciBhIGdpdmVuIHZpcnR1YWwKKyAqIGRldmljZSwgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLAorICogU0RLIHZlcnNpb24gbnVtYmVyLCBza2luLCBldGMuLi4KKyAqCisgKiBFYWNoIEFWRCBoYXMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGFuZCBpcyBiYWNrZWQgYnkgYSByb290CisgKiBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGEgY29udGVudCBkaXJlY3RvcnkuIEZvciBleGFtcGxlLCBhbgorICogIEFWRCBuYW1lZCAnZm9vJyB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgLSBhIHJvb3QgY29uZmlndXJhdGlvbiBmaWxlIG5hbWVkIH4vLmFuZHJvaWQvYXZkL2Zvby5pbmkKKyAqICAgIGRlc2NyaWJpbmcgd2hlcmUgdGhlIEFWRCdzIGNvbnRlbnQgY2FuIGJlIGZvdW5kCisgKgorICogIC0gYSBjb250ZW50IGRpcmVjdG9yeSBsaWtlIH4vLmFuZHJvaWQvYXZkL2Zvby8gY29udGFpbmluZyBhbGwKKyAqICAgIGRpc2sgaW1hZ2UgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIHRoZSB2aXJ0dWFsIGRldmljZS4KKyAqCisgKiB0aGUgJ2Zvby5pbmknIGZpbGUgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIGxpbmUgb2YgdGhlIGZvcm06CisgKgorICogICAgcm9vdFBhdGg9PGNvbnRlbnQtcGF0aD4KKyAqCisgKiBpdCBtYXkgYWxzbyBjb250YWluIG90aGVyIGxpbmVzIHRoYXQgY2FjaGUgc3R1ZmYgZm91bmQgaW4gdGhlCisgKiBjb250ZW50IGRpcmVjdG9yeSwgbGlrZSBoYXJkd2FyZSBwcm9wZXJ0aWVzIG9yIFNESyB2ZXJzaW9uIG51bWJlci4KKyAqCisgKiBpdCBpcyBwb3NzaWJsZSB0byBtb3ZlIHRoZSBjb250ZW50IGRpcmVjdG9yeSBieSB1cGRhdGluZyB0aGUgZm9vLmluaQorICogZmlsZSB0byBwb2ludCB0byB0aGUgbmV3IGxvY2F0aW9uLiBUaGlzIGNhbiBiZSBpbnRlcmVzdGluZyB3aGVuIHlvdXIKKyAqICRIT01FIGRpcmVjdG9yeSBpcyBsb2NhdGVkIG9uIGEgbmV0d29yayBzaGFyZSBvciBpbiBhIHJvYW1pbmcgcHJvZmlsZQorICogKFdpbmRvd3MpLCBnaXZlbiB0aGF0IHRoZSBjb250ZW50IGRpcmVjdG9yeSBvZiBhIHNpbmdsZSB2aXJ0dWFsIGRldmljZQorICogY2FuIGVhc2lseSB1c2UgbW9yZSB0aGFuIDEwME1CIG9mIGRhdGEuCisgKgorICovCisKKworLyogYSBtYWNybyB1c2VkIHRvIGRlZmluZSB0aGUgbGlzdCBvZiBkaXNrIGltYWdlcyBtYW5hZ2VkIGJ5IHRoZQorICogaW1wbGVtZW50YXRpb24uIFRoaXMgbWFjcm8gd2lsbCBiZSBleHBhbmRlZCBzZXZlcmFsIHRpbWVzIHdpdGgKKyAqIHZhcnlpbmcgZGVmaW5pdGlvbnMgb2YgX0FWRF9JTUcKKyAqLworI2RlZmluZSAgQVZEX0lNQUdFX0xJU1QgXAorICAgIF9BVkRfSU1HKEtFUk5FTCwia2VybmVsLXFlbXUiLCJrZXJuZWwiKSBcCisgICAgX0FWRF9JTUcoS0VSTkVMUkFOQ0hVLCJrZXJuZWwtcmFuY2h1Iiwia2VybmVsIikgXAorICAgIF9BVkRfSU1HKFJBTURJU0ssInJhbWRpc2suaW1nIiwicmFtZGlzayIpIFwKKyAgICBfQVZEX0lNRyhJTklUU1lTVEVNLCJzeXN0ZW0uaW1nIiwiaW5pdCBzeXN0ZW0iKSBcCisgICAgX0FWRF9JTUcoSU5JVERBVEEsInVzZXJkYXRhLmltZyIsImluaXQgZGF0YSIpIFwKKyAgICBfQVZEX0lNRyhJTklUWklQLCJkYXRhIiwiaW5pdCBkYXRhIHppcCIpIFwKKyAgICBfQVZEX0lNRyhVU0VSU1lTVEVNLCJzeXN0ZW0tcWVtdS5pbWciLCJ1c2VyIHN5c3RlbSIpIFwKKyAgICBfQVZEX0lNRyhVU0VSREFUQSwidXNlcmRhdGEtcWVtdS5pbWciLCAidXNlciBkYXRhIikgXAorICAgIF9BVkRfSU1HKENBQ0hFLCJjYWNoZS5pbWciLCJjYWNoZSIpIFwKKyAgICBfQVZEX0lNRyhTRENBUkQsInNkY2FyZC5pbWciLCJTRCBDYXJkIikgXAorICAgIF9BVkRfSU1HKEVOQ1JZUFRJT05LRVksImVuY3J5cHRpb25rZXkuaW1nIiwiRW5jcnlwdGlvbiBLZXkiKSBcCisgICAgX0FWRF9JTUcoU05BUFNIT1RTLCJzbmFwc2hvdHMuaW1nIiwic25hcHNob3RzIikgXAorCisvKiBkZWZpbmUgdGhlIGVudW1hcmVkIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggQVZEIGltYWdlIHR5cGUKKyAqIGV4YW1wbGVzIGFyZTogQVZEX0lNQUdFX0tFUk5FTCwgQVZEX0lNQUdFX1NZU1RFTSwgZXRjLi4KKyAqLworI2RlZmluZSBfQVZEX0lNRyh4LHkseikgICBBVkRfSU1BR0VfIyN4ICwKK3R5cGVkZWYgZW51bSB7CisgICAgQVZEX0lNQUdFX0xJU1QKKyAgICBBVkRfSU1BR0VfTUFYIC8qIGRvIG5vdCByZW1vdmUgKi8KK30gQXZkSW1hZ2VUeXBlOworI3VuZGVmICBfQVZEX0lNRworCisvKiBBdmRJbmZvIGlzIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgaW5mb3JtYXRpb24KKyAqIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBBVkQgaW5zdGFuY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQXZkSW5mbyAgQXZkSW5mbzsKKworLyogdmFyaW91cyBmbGFncyB1c2VkIHdoZW4gY3JlYXRpbmcgYW4gQXZkSW5mbyBvYmplY3QgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogdXNlIHRvIGZvcmNlIGEgZGF0YSB3aXBlICovCisgICAgQVZESU5GT19XSVBFX0RBVEEgPSAoMSA8PCAwKSwKKyAgICAvKiB1c2UgdG8gaWdub3JlIHRoZSBjYWNoZSBwYXJ0aXRpb24gKi8KKyAgICBBVkRJTkZPX05PX0NBQ0hFICA9ICgxIDw8IDEpLAorICAgIC8qIHVzZSB0byB3aXBlIGNhY2hlIHBhcnRpdGlvbiwgaWdub3JlZCBpZiBOT19DQUNIRSBpcyBzZXQgKi8KKyAgICBBVkRJTkZPX1dJUEVfQ0FDSEUgPSAoMSA8PCAyKSwKKyAgICAvKiB1c2UgdG8gaWdub3JlIGlnbm9yZSBTRENhcmQgaW1hZ2UgKGRlZmF1bHQgb3IgcHJvdmlkZWQpICovCisgICAgQVZESU5GT19OT19TRENBUkQgPSAoMSA8PCAzKSwKKyAgICAvKiB1c2UgdG8gd2lwZSB0aGUgc3lzdGVtIGltYWdlIHdpdGggbmV3IGluaXRpYWwgdmFsdWVzICovCisgICAgQVZESU5GT19XSVBFX1NZU1RFTSA9ICgxIDw8IDQpLAorICAgIC8qIHVzZSB0byBpZ25vcmUgaWdub3JlIHN0YXRlIHNuYXBzaG90IGltYWdlIChkZWZhdWx0IG9yIHByb3ZpZGVkKSAqLworICAgIEFWRElORk9fTk9fU05BUFNIT1RTID0gKDEgPDwgNSksCit9IEF2ZEZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgICAgIGZsYWdzOworICAgIGNvbnN0IGNoYXIqICBza2luTmFtZTsKKyAgICBjb25zdCBjaGFyKiAgc2tpblJvb3RQYXRoOworICAgIGNvbnN0IGNoYXIqICBmb3JjZVBhdGhzW0FWRF9JTUFHRV9NQVhdOworfSBBdmRJbmZvUGFyYW1zOworCisvKiBDcmVhdGVzIGEgbmV3IEF2ZEluZm8gb2JqZWN0IGZyb20gYSBuYW1lLiBSZXR1cm5zIE5VTEwgaWYgbmFtZSBpcyBOVUxMCisgKiBvciBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyAqIGxldHRlcnMsIGRpZ2l0cywgdW5kZXJzY29yZXMsIGRhc2hlcyBhbmQgcGVyaW9kcworICovCitBdmRJbmZvKiAgYXZkSW5mb19uZXcoIGNvbnN0IGNoYXIqICBuYW1lLCBBdmRJbmZvUGFyYW1zKiAgcGFyYW1zICk7CisKKy8qIFVwZGF0ZSB0aGUgQXZkSW5mbyBoYXJkd2FyZSBjb25maWcgZnJvbSBhIGdpdmVuIHNraW4gbmFtZSBhbmQgcGF0aCAqLworaW50IGF2ZEluZm9fZ2V0U2tpbkhhcmR3YXJlSW5pKCBBdmRJbmZvKiBpLCBjaGFyKiBza2luTmFtZSwgY2hhciogc2tpbkRpclBhdGgpOworCisvKiBBIHNwZWNpYWwgZnVuY3Rpb24gdXNlZCB0byBzZXR1cCBhbiBBdmRJbmZvIGZvciB1c2Ugd2hlbiBzdGFydGluZworICogdGhlIGVtdWxhdG9yIGZyb20gdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtLiBJbiB0aGlzIHNwZWNpZmljIGluc3RhbmNlCisgKiB3ZSdyZSBnb2luZyB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIHRvIGhvbGQgYWxsIHdyaXRhYmxlIGltYWdlCisgKiBmaWxlcywgYW5kIGFjdGl2YXRlIGFsbCBoYXJkd2FyZSBmZWF0dXJlcyBieSBkZWZhdWx0CisgKgorICogJ2FuZHJvaWRCdWlsZFJvb3QnIG11c3QgYmUgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlCisgKiBBbmRyb2lkIGJ1aWxkIHN5c3RlbSAoaS5lLiB0aGUgJ2FuZHJvaWQnIGRpcmVjdG9yeSkKKyAqCisgKiAnYW5kcm9pZE91dCcgbXVzdCBiZSB0aGUgdGFyZ2V0LXNwZWNpZmljIG91dCBkaXJlY3Rvcnkgd2hlcmUKKyAqIGRpc2sgaW1hZ2VzIHdpbGwgYmUgbG9va2VkIGZvci4KKyAqLworQXZkSW5mbyogIGF2ZEluZm9fbmV3Rm9yQW5kcm9pZEJ1aWxkKCBjb25zdCBjaGFyKiAgICAgYW5kcm9pZEJ1aWxkUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIGFuZHJvaWRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm9QYXJhbXMqICBwYXJhbXMgKTsKKworLyogRnJlZXMgYW4gQXZkSW5mbyBvYmplY3QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZ3MgdGhhdCBtYXkgYmUKKyAqIHJldHVybmVkIGJ5IGl0cyBnZXRYWFgoKSBtZXRob2RzCisgKi8KK3ZvaWQgICAgICAgIGF2ZEluZm9fZnJlZSggQXZkSW5mbyogIGkgKTsKKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlCisgKi8KK2NvbnN0IGNoYXIqICBhdmRJbmZvX2dldE5hbWUoIGNvbnN0IEF2ZEluZm8qICBpICk7CisKKy8qIFJldHVybiB0aGUgdGFyZ2V0IEFQSSBsZXZlbCBmb3IgdGhpcyBBVkQuCisgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIGJlIHNvbWUgcmlkaWN1bG91c2x5IGxhcmdlCisgKiB2YWx1ZSAoZS5nLiAxMDAwKSBpZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSBwcm9wZXJseQorICogZGV0ZXJtaW5lZCAoZS5nLiB5b3UncmUgdXNpbmcgYW4gQVZEIGZyb20gYSBwcmV2aWV3IFNESykKKyAqLworaW50ICAgIGF2ZEluZm9fZ2V0QXBpTGV2ZWwoIGNvbnN0IEF2ZEluZm8qICBpICk7CisKKy8qIFJldHVybiB0aGUgImRlc3NlcnQgbmFtZSIgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogQVBJIGxldmVsCisgKi8KK2NvbnN0IGNoYXIqIGF2ZEluZm9fZ2V0QXBpRGVzc2VydE5hbWUoaW50IGFwaUxldmVsKTsKKworLyogUmV0dXJuIHRoZSBmdWxsIHZlcnNpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiBBUEkgbGV2ZWwKKyAqLwordm9pZCBhdmRJbmZvX2dldEZ1bGxBcGlOYW1lKGludCBhcGlMZXZlbCwgY2hhciogbmFtZVN0ciwgaW50IHN0ckxlbik7CisKKy8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVZEIGlzIG9uIEdvb2dsZSBBUElzLiAqLworYm9vbCAgIGF2ZEluZm9faXNHb29nbGVBcGlzKCBjb25zdCBBdmRJbmZvKiAgaSApOworCisvKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHZhcmlvdXMgaW1hZ2VzIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBBVkQuCisgKiBOVUxMIGlmIHRoZSBpbWFnZSBjYW5ub3QgYmUgZm91bmQuIFJldHVybmVkIHN0cmluZ3MgbXVzdCBiZSBmcmVlZAorICogYnkgdGhlIGNhbGxlci4KKyAqLworY2hhciogIGF2ZEluZm9fZ2V0S2VybmVsUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKTsKK2NoYXIqICBhdmRJbmZvX2dldFJhbmNodUtlcm5lbFBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICk7CitjaGFyKiAgYXZkSW5mb19nZXRSYW1kaXNrUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKTsKK2NoYXIqICBhdmRJbmZvX2dldFNkQ2FyZFBhdGgoIGNvbnN0IEF2ZEluZm8qIGkgKTsKK2NoYXIqICBhdmRJbmZvX2dldEVuY3J5cHRpb25LZXlJbWFnZVBhdGgoIGNvbnN0IEF2ZEluZm8qIGkgKTsKK2NoYXIqICBhdmRJbmZvX2dldFNuYXBTdG9yYWdlUGF0aCggY29uc3QgQXZkSW5mbyogaSApOworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBpZiB0aGUgY2FjaGUgaW1hZ2UgZmlsZSBjYW5ub3QgYmUgZm91bmQuCisgKiBVc2UgYXZkSW5mb19nZXREZWZhdWx0Q2FjaGVQYXRoKCkgdG8gcmV0cmlldmUgdGhlIGRlZmF1bHQgcGF0aAorICogaWYgeW91IGludGVuZCB0byBjcmVhdGUgdGhlIHBhcnRpdGlvbiBmaWxlIHRoZXJlLgorICovCitjaGFyKiAgYXZkSW5mb19nZXRDYWNoZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpICk7CitjaGFyKiAgYXZkSW5mb19nZXREZWZhdWx0Q2FjaGVQYXRoKCBjb25zdCBBdmRJbmZvKiAgaSApOworCisvKiBhdmRJbmZvX2dldFN5c3RlbUltYWdlUGF0aCgpIHdpbGwgcmV0dXJuIE5VTEwsIGV4Y2VwdCBpZiB0aGUgQVZEIGNvbnRlbnQKKyAqIGRpcmVjdG9yeSBjb250YWlucyBhIGZpbGUgbmFtZWQgInN5c3RlbS1xZW11LmltZyIuCisgKi8KK2NoYXIqICBhdmRJbmZvX2dldFN5c3RlbUltYWdlUGF0aCggY29uc3QgQXZkSW5mbyogaSApOworCisvKiBhdmRJbmZvX2dldFN5c3RlbUluaXRJbWFnZVBhdGgoKSByZXRyaWV2ZXMgdGhlIHBhdGggdG8gdGhlIHJlYWQtb25seQorICogaW5pdGlhbGl6YXRpb24gaW1hZ2UgZm9yIHRoaXMgZGlzayBpbWFnZS4KKyAqLworY2hhciogIGF2ZEluZm9fZ2V0U3lzdGVtSW5pdEltYWdlUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKTsKKworY2hhciogIGF2ZEluZm9fZ2V0RGF0YUltYWdlUGF0aCggY29uc3QgQXZkSW5mbyogIGkgKTsKK2NoYXIqICBhdmRJbmZvX2dldERlZmF1bHREYXRhSW1hZ2VQYXRoKCBjb25zdCBBdmRJbmZvKiAgaSApOworCisvKiBhdmRJbmZvX2dldERlZmF1bHRTeXN0ZW1GZWF0dXJlQ29udHJvbFBhdGgoKSByZXR1cm5zIHRoZSBwYXRoIHRvIHRoZQorICogcGVyLXN5c3RlbSBpbWFnZSBmZWF0dXJlIGNvbnRyb2wgZmlsZQorICovCitjaGFyKiBhdmRJbmZvX2dldERlZmF1bHRTeXN0ZW1GZWF0dXJlQ29udHJvbFBhdGgoY29uc3QgQXZkSW5mbyogaSk7CisKKy8qIGF2ZEluZm9fZ2V0RGF0YUluaXRJbWFnZVBhdGggcmV0dXJucyB0aGUgcGF0aCBvZiB1c2VyZGF0YS5pbWcgdXNlZAorICogZm9yIGluaXRpYWxpemF0aW9uIHdoZW4gLXdpcGUtZGF0YS4KKyAqIE5ld2VyIHZlcnNpb25zIG9mIHN5c3RlbSBpbWFnZXMgc2hhbGwgdXNlIGF2ZEluZm9fZ2V0RGF0YUluaXREaXJQYXRoCisgKiB0byBnZW5lcmF0ZSB1c2VyZGF0YS5pbWcgd2hlbiAtd2lwZS1kYXRhCisgKi8KK2NoYXIqICBhdmRJbmZvX2dldERhdGFJbml0SW1hZ2VQYXRoKCBjb25zdCBBdmRJbmZvKiBpICk7CisKKy8qIGF2ZEluZm9fZ2V0RGF0YUluaXREaXJQYXRoIHJldHVybnMgdGhlIHBhdGggdG8gdGhlIHVucGFja2VkIHVzZXIgZGF0YQorICogZm9sZGVyLiBOZXdlciB2ZXJzaW9ucyBvZiBzeXN0ZW0gaW1hZ2VzIHNoYWxsIHVzZSB0aGUgdW5wYWNrZWQgdXNlciBkYXRhCisgKiBpbnN0ZWFkIG9mIHRoZSBwcmVidWlsdCBpbWFnZSB0byBpbml0aWFsaXplIHVzZXJkYXRhLmltZy4KKyAqLworY2hhciogIGF2ZEluZm9fZ2V0RGF0YUluaXREaXJQYXRoKCBjb25zdCBBdmRJbmZvKiBpICk7CisKKy8qIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgYm9vdC5wcm9wIGZpbGUgZm9yIHRoaXMgQVZELCBpZiBhbnkuCisgKiBUaGUgZmlsZSBjb250YWlucyBhZGRpdGlvbm5hbCBwcm9wZXJ0aWVzIHRvIGluamVjdCBhdCBib290IHRpbWUKKyAqIGludG8gdGhlIGd1ZXN0IHN5c3RlbS4gTm90ZSB0aGF0IHRoaXMgbmV2ZXIgcmV0dXJucyBOVUxMLCBidXQKKyAqIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgY2FuIGJlIGVtcHR5LgorICovCitjb25zdCBGaWxlRGF0YSogYXZkSW5mb19nZXRCb290UHJvcGVydGllcyhjb25zdCBBdmRJbmZvKiBpKTsKKworLyogUmV0dXJucyB0aGUgcGF0aCB0byBhIGdpdmVuIEFWRCBpbWFnZSBmaWxlLiBUaGlzIHdpbGwgcmV0dXJuIE5VTEwgaWYKKyAqIHRoZSBmaWxlIGNhbm5vdCBiZSBmb3VuZCAvIGRvZXMgbm90IGV4aXN0LgorICovCitjb25zdCBjaGFyKiAgYXZkSW5mb19nZXRJbWFnZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpLCBBdmRJbWFnZVR5cGUgIGltYWdlVHlwZSApOworCisvKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHBhdGggb2YgYSBnaXZlbiBBVkQgaW1hZ2UgZmlsZS4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlCisgKiBpZiBhdmRJbmZvX2dldEltYWdlUGF0aCgpIHJldHVybmVkIE5VTEwuCisgKi8KK2NvbnN0IGNoYXIqICBhdmRJbmZvX2dldEltYWdlRGVmYXVsdFBhdGgoIGNvbnN0IEF2ZEluZm8qICBpLCBBdmRJbWFnZVR5cGUgIGltYWdlVHlwZSApOworCisKKy8qIFRyeSB0byBmaW5kIHRoZSBwYXRoIG9mIGEgZ2l2ZW4gaW1hZ2UgZmlsZSwgcmV0dXJucyBOVUxMCisgKiBpZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZC4gdGhlIHN0cmluZworICogYmVsb25ncyB0byB0aGUgQXZkSW5mbyBvYmplY3QuCisgKi8KK2NvbnN0IGNoYXIqICBhdmRJbmZvX2dldEltYWdlRmlsZSggY29uc3QgQXZkSW5mbyogIGksIEF2ZEltYWdlVHlwZSAgaW1hZ2VUeXBlICk7CisKKy8qIFJldHVybiB0aGUgc2l6ZSBvZiBhIGdpdmVuIGltYWdlIGZpbGUuIFJldHVybnMgMCBpZiB0aGUgZmlsZQorICogZG9lcyBub3QgZXhpc3Qgb3IgY291bGQgbm90IGJlIGFjY2Vzc2VkLgorICovCit1aW50NjRfdCAgICAgYXZkSW5mb19nZXRJbWFnZUZpbGVTaXplKCBjb25zdCBBdmRJbmZvKiAgaSwgQXZkSW1hZ2VUeXBlICBpbWFnZVR5cGUgKTsKKworLyogUmV0dXJucyAxIGlmIHRoZSBjb3JyZXNwb25kaW5nIGltYWdlIGZpbGUgaXMgcmVhZC1vbmx5CisgKi8KK2ludCAgICAgICAgICBhdmRJbmZvX2lzSW1hZ2VSZWFkT25seSggY29uc3QgQXZkSW5mbyogIGksIEF2ZEltYWdlVHlwZSAgaW1hZ2VUeXBlICk7CisKKy8qIGxvY2sgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyB3cml0YWJsZS4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xCisgKiBvdGhlcndpc2UuIG5vdGUgdGhhdCBpZiB0aGUgZmlsZSBpcyByZWFkLW9ubHksIGl0IGRvZXNuJ3QgbmVlZCB0bworICogYmUgbG9ja2VkIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gc3VjY2Vzcy4KKyAqLworaW50ICAgICAgICAgIGF2ZEluZm9fbG9ja0ltYWdlRmlsZSggY29uc3QgQXZkSW5mbyogIGksIEF2ZEltYWdlVHlwZSAgaW1hZ2VUeXBlLCBpbnQgIGFib3J0T25FcnJvcik7CisKKy8qIE1hbnVhbGx5IHNldCB0aGUgcGF0aCBvZiBhIGdpdmVuIGltYWdlIGZpbGUuICovCit2b2lkICAgICAgICAgYXZkSW5mb19zZXRJbWFnZUZpbGUoIGNvbnN0IEF2ZEluZm8qICBpLCBBdmRJbWFnZVR5cGUgIGltYWdlVHlwZSwgY29uc3QgY2hhciogIGltYWdlUGF0aCApOworCisvKiBSZXR1cm5zIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHZpcnR1YWwgZGV2aWNlICovCitjb25zdCBjaGFyKiAgYXZkSW5mb19nZXRDb250ZW50UGF0aCggY29uc3QgQXZkSW5mbyogIGkgKTsKKworLyogUmV0cmlldmUgdGhlIEFWRCdzIHNwZWNpZmljIHNraW4gaW5mb3JtYXRpb24uCisgKiBPbiBleGl0OgorICogICAnKnBTa2luTmFtZScgcG9pbnRzIHRvIHRoZSBza2luJ3MgbmFtZS4KKyAqICAgJypwU2tpbkRpcicgcG9pbnRzIHRvIHRoZSBza2luJ3MgZGlyZWN0b3J5LgorICoKKyAqIE5vdGUgdGhhdCB0aGUgc2tpbidzIGNvbnRlbnQgd2lsbCBiZSB1bmRlciA8c2tpbkRpcj4vPHNraW5OYW1lPi4KKyAqLwordm9pZCAgICAgICAgIGF2ZEluZm9fZ2V0U2tpbkluZm8oIGNvbnN0IEF2ZEluZm8qICBpLCBjaGFyKiogcFNraW5OYW1lLCBjaGFyKiogcFNraW5EaXIgKTsKKworLyogRmluZCBhIGNoYXJtYXAgZmlsZSBuYW1lZCA8Y2hhcm1hcE5hbWU+LmtjbSBmb3IgdGhpcyBBVkQuCisgKiBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBmaWxlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICogVGhlIHJlc3VsdCBzdHJpbmcgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitjaGFyKiAgICAgICAgYXZkSW5mb19nZXRDaGFybWFwRmlsZSggY29uc3QgQXZkSW5mbyogaSwgY29uc3QgY2hhciogY2hhcm1hcE5hbWUgKTsKKworLyogUmV0dXJucyBUUlVFIGlmZiBpbiB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0gKi8KK2ludCAgICAgICAgICBhdmRJbmZvX2luQW5kcm9pZEJ1aWxkKCBjb25zdCBBdmRJbmZvKiAgaSApOworCisvKiBSZXR1cm4gdGhlIHRhcmdldCBDUFUgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIEFWRC4KKyAqIFRoaXMgcmV0dXJucyBOVUxMIGlmIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQsIG9yIGEgc3RyaW5nIHRoYXQKKyAqIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciBvdGhlcndpc2UuCisgKi8KK2NoYXIqICAgICAgICBhdmRJbmZvX2dldFRhcmdldENwdUFyY2goY29uc3QgQXZkSW5mbyogaSk7CisKKy8qIFJldHVybnMgdGhlIHRhcmdldCBBQkkgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBsYXRmb3JtIGltYWdlLgorICogVGhpcyBtYXkgcmV0dXJuIE5VTEwgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuIE90aGVyd2lzZSB0aGlzIGlzCisgKiBhIHN0cmluZyBsaWtlICJhcm1lYWJpIiwgImFybWVhYmktdjdhIiBvciAieDg2IiB0aGF0IG11c3QgYmUgZnJlZWQKKyAqIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2NoYXIqICAgICAgICBhdmRJbmZvX2dldFRhcmdldEFiaSggY29uc3QgQXZkSW5mbyogIGkgKTsKKworLyogUmVhZHMgdGhlIEFWRCdzIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gaW50byAnaHcnLiByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZSAqLworaW50ICAgICAgICAgIGF2ZEluZm9faW5pdEh3Q29uZmlnKGNvbnN0IEF2ZEluZm8qIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZEh3Q29uZmlnKiBodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUWVtdTIpOworCisvKiBSZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBwYXRoIHVzZWQgdG8gc3RvcmUgcHJvZmlsZSAnZm9vJy4gcmVzdWx0IG11c3QgYmUgZnJlZWQgYnkgY2FsbGVyICovCitjaGFyKiAgICAgICAgYXZkSW5mb19nZXRDb2RlUHJvZmlsZVBhdGgoIGNvbnN0IEF2ZEluZm8qICBpLCBjb25zdCBjaGFyKiAgcHJvZmlsZU5hbWUgKTsKKworLyogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgaGFyZHdhcmUuaW5pIHdoZXJlIHdlIHdpbGwgd3JpdGUgdGhlIEFWRCdzCisgKiBjb21wbGV0ZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGNvcmUuCisgKi8KK2NvbnN0IGNoYXIqICBhdmRJbmZvX2dldENvcmVId0luaVBhdGgoIGNvbnN0IEF2ZEluZm8qIGkgKTsKKworLyogUmV0dXJucyBtb2RlIGluIHdoaWNoIEFEQiBkYWVtb24gcnVubmluZyBpbiB0aGUgZ3Vlc3QgY29tbXVuaWNhdGVzIHdpdGggdGhlCisgKiBlbXVsYXRvcgorICogUmV0dXJuOgorICogIDAgLSBBREJEIGNvbW11bmljYXRlcyB3aXRoIHRoZSBlbXVsYXRvciB2aWEgZm9yd2FyZGVkIFRDUCBwb3J0IDU1NTUgKGEKKyAqICAgICAgImxlZ2FjeSIgbW9kZSkuCisgKiAgMSAtIEFEQkQgY29tbXVuaWNhdGVzIHdpdGggdGhlIGVtdWxhdG9yIHZpYSAnYWRiJyBRRU1VRCBzZXJ2aWNlLgorICovCitpbnQgICAgICAgICAgYXZkSW5mb19nZXRBZGJkQ29tbXVuaWNhdGlvbk1vZGUoIGNvbnN0IEF2ZEluZm8qIGkgKTsKKworLyogUmV0dXJucyBjb25maWcuaW5pIHNuYXBzaG90IHByZXNlbnNlIHN0YXR1cy4KKyAqIFRoaXMgcm91dGluZSBjaGVja3MgaWYgc25hcHNob3RzIGFyZSBlbmFibGVkIGluIEFWRCBjb25maWcuaW5pIGZpbGUuCisgKiBSZXR1cm46CisgKiAgMSAtIFNuYXBzaG90cyBhcmUgZW5hYmxlZCBpbiBBVkQgY29uZmlnLmluaSBmaWxlLgorICogIDAgLSBTbmFwc2hvdHMgYXJlIGRpc2FibGVkIGluIEFWRCBjb25maWcuaW5pIGZpbGUsIG9mIGNvbmZpZy5pbmkgZmlsZSBpcyBub3QKKyAqICAgICAgZm91bmQuCisqLworaW50ICAgICAgICAgIGF2ZEluZm9fZ2V0U25hcHNob3RQcmVzZW50KGNvbnN0IEF2ZEluZm8qIGkpOworCisvKiBSZXR1cm5zIHRoZSBpbmNyZW1lbnRhbCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgQVZEJ3Mgc3lzdGVtIGltYWdlLgorICovCitpbnQgYXZkSW5mb19nZXRTeXNJbWdJbmNyZW1lbnRhbFZlcnNpb24oY29uc3QgQXZkSW5mbyogaSk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9rZXlzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2tleXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRiZDdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9rZXlzLmgKQEAgLTAsMCArMSw2MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKy8qIEtleXMgb2YgdGhlIHByb3BlcnRpZXMgZm91bmQgaW4gYXZkL25hbWUuaW5pIGFuZCBjb25maWcuaW5pIGZpbGVzLgorICoKKyAqIFRoZXNlIGtleXMgbXVzdCBtYXRjaCB0aGVpciBjb3VudGVycGFydCBkZWZpbmVkIGluCisgKiBzZGsvc2RrbWFuYWdlci9saWJzL3Nka2xpYi9zcmMvY29tL2FuZHJvaWQvc2RrbGliL2ludGVybmFsL2F2ZC9BdmRNYW5hZ2VyLmphdmEKKyAqLworCisKKy8qIC0tIEtleXMgdXNlZCBpbiBhdmQvbmFtZS5pbmkgLS0gKi8KKworLyogQWJzb2x1dGUgcGF0aCBvZiB0aGUgQVZEIGNvbnRlbnQgZGlyZWN0b3J5LgorICovCisjZGVmaW5lICBST09UX0FCU19QQVRIX0tFWSAgICAicGF0aCIKKworLyogUmVsYXRpdmUgcGF0aCBvZiB0aGUgQVZEIGNvbnRlbnQgZGlyZWN0b3J5LgorICogUGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgYnVmcHJpbnRfY29uZmlnX3BhdGgoKS4KKyAqLworI2RlZmluZSAgUk9PVF9SRUxfUEFUSF9LRVkgICAgInBhdGgucmVsIgorCisKKy8qIC0tIEtleXMgdXNlZCBpbiBjb25maWcuaW5pIC0tICovCisKKy8qIHRoZSBwcmVmaXggb2YgY29uZmlnLmluaSBrZXlzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBzZWFyY2ggZGlyZWN0b3JpZXMKKyAqIG9mIHN5c3RlbSBpbWFnZXMuCisgKi8KKyNkZWZpbmUgIFNFQVJDSF9QUkVGSVggICAiaW1hZ2Uuc3lzZGlyLiIKKworLyogdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlYXJjaCBwYXRoIGtleXMgd2UncmUgZ29pbmcgdG8gcmVhZCBmcm9tIHRoZQorICogY29uZmlnLmluaSBmaWxlCisgKi8KKyNkZWZpbmUgIE1BWF9TRUFSQ0hfUEFUSFMgIDIKKworLyogdGhlIGNvbmZpZy5pbmkga2V5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBmdWxsIHJlbGF0aXZlCisgKiBwYXRoIHRvIHRoZSBza2luIGRpcmVjdG9yeSAoaW5jbHVkaW5nIHRoZSBza2luIG5hbWUpLgorICovCisjZGVmaW5lICBTS0lOX1BBVEggICAgICAgInNraW4ucGF0aCIKKworLyogdGhlIGNvbmZpZy5pbmkga2V5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluZGljYXRlIHRoZSBkZWZhdWx0IHNraW4ncyBuYW1lLgorICogdGhpcyBpcyBpZ25vcmVkIGlmIHRoZXJlIGlzIGEgdmFsaWQgU0tJTl9QQVRIIGVudHJ5IGluIHRoZSBmaWxlLgorICovCisjZGVmaW5lICBTS0lOX05BTUUgICAgICAgInNraW4ubmFtZSIKKworLyogZGVmYXVsdCBza2luIG5hbWUgKi8KKyNkZWZpbmUgIFNLSU5fREVGQVVMVCAgICAiSFZHQSIKKworLyogdGhlIGNvbmZpZy5pbmkga2V5IHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYWJzb2x1dGUgcGF0aAorICogdG8gdGhlIFNEIENhcmQgaW1hZ2UgZmlsZSwgaWYgeW91IGRvbid0IHdhbnQgdG8gcGxhY2UgaXQgaW4KKyAqIHRoZSBjb250ZW50IGRpcmVjdG9yeS4KKyAqLworI2RlZmluZSAgU0RDQVJEX1BBVEggICAgICJzZGNhcmQucGF0aCIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvc2Nhbm5lci5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9zY2FubmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNDZiYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvc2Nhbm5lci5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9zY2FubmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC91dGlsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LF9fVkFfQVJHU19fKQorCitzdHJ1Y3QgQXZkU2Nhbm5lciB7CisgICAgRGlyU2Nhbm5lciogc2Nhbm5lcjsKKyAgICBjaGFyIHRlbXBbUEFUSF9NQVhdOworICAgIGNoYXIgbmFtZVtQQVRIX01BWF07Cit9OworCitBdmRTY2FubmVyKiBhdmRTY2FubmVyX25ldyhjb25zdCBjaGFyKiBzZGtfaG9tZSkgeworICAgIEF2ZFNjYW5uZXIqIHM7CisKKyAgICBBTkVXMChzKTsKKworICAgIGNoYXIqIHAgPSBzLT50ZW1wOworICAgIGNoYXIqIGVuZCA9IHAgKyBzaXplb2Yocy0+dGVtcCk7CisKKyAgICBpZiAoIXNka19ob21lKSB7CisgICAgICAgIHAgPSBidWZwcmludF9jb25maWdfcGF0aChwLCBlbmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICIlcyIsIHNka19ob21lKTsKKyAgICB9CisKKyAgICAvLyBCdWlsZCB0aGUgcGF0aCB0byAkQU5EUk9JRF9TREtfSE9NRS9hdmQvCisgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiVzIiwgUEFUSF9TRVAgQU5EUk9JRF9BVkRfRElSKTsKKyAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgLy8gUGF0aCBpcyB0b28gbG9uZywgbm8gc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVkLgorICAgICAgICBEKCJQYXRoIHRvbyBsb25nOiAlc1xuIiwgcy0+dGVtcCk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBpZiAoIXBhdGhfZXhpc3RzKHMtPnRlbXApKSB7CisgICAgICAgIC8vIFBhdGggZG9lcyBub3QgZXhpc3QsIG5vIHNlYXJjaCB3aWxsIGJlIHBlcmZvcm1lZC4KKyAgICAgICAgRCgiUGF0aCBkb2VzIG5vdCBleGlzdDogJXNcbiIsIHMtPnRlbXApOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgcy0+c2Nhbm5lciA9IGRpclNjYW5uZXJfbmV3KHMtPnRlbXApOworICAgIHJldHVybiBzOworfQorCitjb25zdCBjaGFyKiBhdmRTY2FubmVyX25leHQoQXZkU2Nhbm5lciogcykgeworICAgIGlmIChzLT5zY2FubmVyKSB7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5ID0gZGlyU2Nhbm5lcl9uZXh0KHMtPnNjYW5uZXIpOworICAgICAgICAgICAgaWYgKCFlbnRyeSkgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBlbnVtZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBlbnRyeV9sZW4gPSBzdHJsZW4oZW50cnkpOworICAgICAgICAgICAgaWYgKGVudHJ5X2xlbiA8IDQgfHwgCisgICAgICAgICAgICAgICAgbWVtY21wKGVudHJ5ICsgZW50cnlfbGVuIC0gNFUsICIuaW5pIiwgNCkgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIENhbid0IHBvc3NpYmx5IGJlIGEgPG5hbWU+LmluaSBmaWxlLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJdCdzIGEgbWF0Y2gsIGdldCByaWQgb2YgdGhlIC5pbmkgc3VmZml4IGFuZCByZXR1cm4gaXQuCisgICAgICAgICAgICBlbnRyeV9sZW4gLT0gNFU7CisgICAgICAgICAgICBpZiAoZW50cnlfbGVuID49IHNpemVvZihzLT5uYW1lKSkgeworICAgICAgICAgICAgICAgIEQoIk5hbWUgdG9vIGxvbmc6ICVzXG4iLCBlbnRyeSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocy0+bmFtZSwgZW50cnksIGVudHJ5X2xlbik7CisgICAgICAgICAgICBzLT5uYW1lW2VudHJ5X2xlbl0gPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIHMtPm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYXZkU2Nhbm5lcl9mcmVlKEF2ZFNjYW5uZXIqIHMpIHsKKyAgICBpZiAocykgeworICAgICAgICBpZiAocy0+c2Nhbm5lcikgeworICAgICAgICAgICAgZGlyU2Nhbm5lcl9mcmVlKHMtPnNjYW5uZXIpOworICAgICAgICAgICAgcy0+c2Nhbm5lciA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgQUZSRUUocyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9zY2FubmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3NjYW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RkYjFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9zY2FubmVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gSW1wbGVtZW50cyBhIHNpbXBsZSBoZWxwZXIgb2JqZWN0IHVzZWQgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YKKy8vIGF2YWlsYWJsZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlcy4KKy8vCisvLyBUeXBpY2FsIHVzYWdlIGlzOgorLy8KKy8vICAgICBBdmRTY2FubmVyKiBzY2FubmVyID0gYXZkU2Nhbm5lcl9uZXcoTlVMTCk7CisvLyAgICAgd2hpbGUgKChuYW1lID0gYXZkU2Nhbm5lcl9uZXh0KHNjYW5uZXIpKSAhPSBOVUxMKSB7CisvLyAgICAgICAgcHJpbnRmKCIlc1xuIiwgbmFtZSk7CisvLyAgICAgfQorLy8gICAgIGF2ZFNjYW5uZXJfZnJlZShzY2FubmVyKTsKKy8vCisKKy8vIE9wYXF1ZSB0eXBlIHRvIGFuIG9iamVjdCB1c2VkIHRvIHNjYW4gYWxsIGF2YWlsYWJsZSBBVkRzCisvLyB1bmRlciAkQU5EUk9JRF9TREtfSE9NRS4KK3R5cGVkZWYgc3RydWN0IEF2ZFNjYW5uZXIgQXZkU2Nhbm5lcjsKKworLy8gQ3JlYXRlIGEgbmV3IEFWRCBzY2FubmVyIGluc3RhbmNlLCB1c2VkIHRvIHBhcnNlIHRoZSBkaXJlY3RvcnkKKy8vIGF0IHxzZGtfaG9tZXwuIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoaXMgd2lsbCBmaW5kIHRoZQorLy8gZGlyZWN0b3J5IGZyb20gdGhlIGVudmlyb25tZW50LCBlLmcuIEFORFJPSURfU0RLX0hPTUUgaWYgaXQgaXMKKy8vIGRlZmluZWQsIG9yIGEgcGxhdGZvcm0tc3BlY2lmaWMgbG9jYXRpb24gKGUuZy4gfi8uYW5kcm9pZC8gb24gVW5peCkuCitBdmRTY2FubmVyKiBhdmRTY2FubmVyX25ldyhjb25zdCBjaGFyKiBzZGtfaG9tZSk7CisKKy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV4dCBBVkQgZGV0ZWN0ZWQgYnkgdGhlIHNjYW5uZXIuCisvLyBUaGlzIHdpbGwgYmUgTlVMTCBhdCB0aGUgZW5kIG9mIHRoZSBzY2FuLgorY29uc3QgY2hhciogYXZkU2Nhbm5lcl9uZXh0KEF2ZFNjYW5uZXIqIHNjYW5uZXIpOworCisvLyBSZWxlYXNlIGFuIEF2ZFNjYW5uZXIgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIHJlc291cmNlcy4KKy8vIFRoaXMgY2FuIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGVuZCBvZiBhIHNjYW4uCit2b2lkIGF2ZFNjYW5uZXJfZnJlZShBdmRTY2FubmVyKiBzY2FubmVyKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3V0aWwuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWQ4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3V0aWwuYwpAQCAtMCwwICsxLDM4MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9rZXlzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvdXRpbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9hbmRyb2lkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW5pLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYW5pYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcHJvcGVydHlfZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgRCguLi4pIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKworLyogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBBVkQncyByb290IGNvbmZpZ3VyYXRpb24gLmluaSBmaWxlLiBpdCBpcyBsb2NhdGVkIGluCisgKiB+Ly5hbmRyb2lkL2F2ZC88bmFtZT4uaW5pIG9yIFdpbmRvd3MgZXF1aXZhbGVudAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGF0aCB0byB0aGUgQVZEJ3MgY29udGVudCBkaXJlY3RvcnksIHdoaWNoCisgKiBpbmNsdWRlcyBpdHMgb3duIGNvbmZpZy5pbmkuCisgKi8KK2NoYXIqCitwYXRoX2dldFJvb3RJbmlQYXRoKCBjb25zdCBjaGFyKiAgYXZkTmFtZSApCit7CisgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKworICAgIHAgPSBidWZwcmludF9hdmRfaG9tZV9wYXRoKHRlbXAsIGVuZCk7CisgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgUEFUSF9TRVAgIiVzLmluaSIsIGF2ZE5hbWUpOworICAgIGlmIChwID49IGVuZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFwYXRoX2V4aXN0cyh0ZW1wKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIEFTVFJEVVAodGVtcCk7Cit9CisKK2NoYXIqCitwYXRoX2dldEF2ZENvbnRlbnRQYXRoKGNvbnN0IGNoYXIqIGF2ZE5hbWUpCit7CisgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKyAgICBDSW5pRmlsZSogaW5pID0gTlVMTDsKKyAgICBjaGFyKiAgICBpbmlQYXRoID0gcGF0aF9nZXRSb290SW5pUGF0aChhdmROYW1lKTsKKyAgICBjaGFyKiAgICBhdmRQYXRoID0gTlVMTDsKKworICAgIGlmIChpbmlQYXRoICE9IE5VTEwpIHsKKyAgICAgICAgaW5pID0gaW5pRmlsZV9uZXdGcm9tRmlsZShpbmlQYXRoKTsKKyAgICAgICAgaWYgKGluaSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBUEFOSUMoIkNvdWxkIG5vdCBwYXJzZSBmaWxlOiAlc1xuIiwgaW5pUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgQUZSRUUoaW5pUGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga0hvbWVTZWFyY2hEaXJbXSA9ICIkSE9NRSIgUEFUSF9TRVAgIi5hbmRyb2lkIiBQQVRIX1NFUCAiYXZkIjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga1Nka0hvbWVTZWFyY2hEaXJbXSA9ICIkQU5EUk9JRF9TREtfSE9NRSIgUEFUSF9TRVAgIi5hbmRyb2lkIgorICAgICAgICAgICAgUEFUSF9TRVAgImF2ZCI7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudk5hbWUgPSAiSE9NRSI7CisgICAgICAgIGNvbnN0IGNoYXIqIHNlYXJjaERpciA9IGtIb21lU2VhcmNoRGlyOworICAgICAgICBpZiAoZ2V0ZW52KCJBTkRST0lEX0FWRF9IT01FIikpIHsKKyAgICAgICAgICAgIGVudk5hbWUgPSAiQU5EUk9JRF9BVkRfSE9NRSI7CisgICAgICAgICAgICBzZWFyY2hEaXIgPSAiJEFORFJPSURfQVZEX0hPTUUiOworICAgICAgICB9IGVsc2UgaWYgKGdldGVudigiQU5EUk9JRF9TREtfSE9NRSIpKSB7CisgICAgICAgICAgICBlbnZOYW1lID0gIkFORFJPSURfU0RLX0hPTUUiOworICAgICAgICAgICAgc2VhcmNoRGlyID0ga1Nka0hvbWVTZWFyY2hEaXI7CisgICAgICAgIH0KKyAgICAgICAgQVBBTklDKCJVbmtub3duIEFWRCBuYW1lIFslc10sIHVzZSAtbGlzdC1hdmRzIHRvIHNlZSB2YWxpZCBsaXN0LlxuIgorICAgICAgICAgICAgICAgIiVzIGlzIGRlZmluZWQgYnV0IGNvdWxkIG5vdCBmaW5kICVzLmluaSBmaWxlIGluICVzXG4iCisgICAgICAgICAgICAgICAiKE5vdGU6IGF2ZCBpcyBzZWFyY2hlZCBpbiB0aGUgb3JkZXIgb2YgJEFORFJPSURfQVZEX0hPTUUsIgorICAgICAgICAgICAgICAgIiVzIGFuZCAlcylcbiIsCisgICAgICAgICAgICAgICBhdmROYW1lLCBlbnZOYW1lLCBhdmROYW1lLCBzZWFyY2hEaXIsIGtTZGtIb21lU2VhcmNoRGlyLAorICAgICAgICAgICAgICAga0hvbWVTZWFyY2hEaXIpOworICAgIH0KKworICAgIGF2ZFBhdGggPSBpbmlGaWxlX2dldFN0cmluZyhpbmksIFJPT1RfQUJTX1BBVEhfS0VZLCBOVUxMKTsKKworICAgIGlmICghcGF0aF9pc19kaXIoYXZkUGF0aCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIGFic29sdXRlIHBhdGggZG9lc24ndCBtYXRjaCBhbiBhY3R1YWwgZGlyZWN0b3J5LCB0cnkKKyAgICAgICAgLy8gdGhlIHJlbGF0aXZlIHBhdGggaWYgcHJlc2VudC4KKyAgICAgICAgY29uc3QgY2hhciogcmVsUGF0aCA9IGluaUZpbGVfZ2V0U3RyaW5nKGluaSwgUk9PVF9SRUxfUEFUSF9LRVksIE5VTEwpOworICAgICAgICBpZiAocmVsUGF0aCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwID0gYnVmcHJpbnRfY29uZmlnX3BhdGgodGVtcCwgZW5kKTsKKyAgICAgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsIFBBVEhfU0VQICIlcyIsIHJlbFBhdGgpOworICAgICAgICAgICAgaWYgKHAgPCBlbmQgJiYgcGF0aF9pc19kaXIodGVtcCkpIHsKKyAgICAgICAgICAgICAgICBBRlJFRShhdmRQYXRoKTsKKyAgICAgICAgICAgICAgICBhdmRQYXRoID0gQVNUUkRVUCh0ZW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGluaUZpbGVfZnJlZShpbmkpOworCisgICAgcmV0dXJuIGF2ZFBhdGg7Cit9CisKK2NoYXIqCitwcm9wZXJ0eUZpbGVfZ2V0VGFyZ2V0QWJpKGNvbnN0IEZpbGVEYXRhKiBkYXRhKSB7CisgICAgcmV0dXJuIHByb3BlcnR5RmlsZV9nZXRWYWx1ZSgoY29uc3QgY2hhciopZGF0YS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm8ucHJvZHVjdC5jcHUuYWJpIik7Cit9CisKKworY2hhcioKK3Byb3BlcnR5RmlsZV9nZXRUYXJnZXRBcmNoKGNvbnN0IEZpbGVEYXRhKiBkYXRhKSB7CisgICAgY2hhciogcmV0ID0gcHJvcGVydHlGaWxlX2dldFRhcmdldEFiaShkYXRhKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIC8vIFRyYW5zbGF0ZSBBQkkgbmFtZSBpbnRvIGFyY2hpdGVjdHVyZSBuYW1lLgorICAgICAgICAvLyBCeSBkZWZhdWx0LCB0aGVyZSBhcmUgdGhlIHNhbWUgd2l0aCBhIGZldyBleGNlcHRpb25zLgorICAgICAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGlucHV0OworICAgICAgICAgICAgY29uc3QgY2hhciogb3V0cHV0OworICAgICAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7ICJhcm1lYWJpIiwgImFybSIgfSwKKyAgICAgICAgICAgIHsgImFybWVhYmktdjdhIiwgImFybSIgfSwKKyAgICAgICAgICAgIHsgImFybTY0LXY4YSIsICJhcm02NCIgfSwKKyAgICAgICAgfTsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2Yoa0RhdGEpL3NpemVvZihrRGF0YVswXSk7ICsrbikgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAocmV0LCBrRGF0YVtuXS5pbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHJldCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVNUUkRVUChrRGF0YVtuXS5vdXRwdXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworaW50Citwcm9wZXJ0eUZpbGVfZ2V0SW50KGNvbnN0IEZpbGVEYXRhKiBkYXRhLCBjb25zdCBjaGFyKiBrZXksIGludCBfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgU2VhcmNoUmVzdWx0KiBzZWFyY2hSZXN1bHQpIHsKKyAgICBjaGFyKiBwcm9wID0gcHJvcGVydHlGaWxlX2dldFZhbHVlKChjb25zdCBjaGFyKilkYXRhLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSk7CisgICAgaWYgKCFwcm9wKSB7CisgICAgICAgIGlmIChzZWFyY2hSZXN1bHQpIHsKKyAgICAgICAgICAgICpzZWFyY2hSZXN1bHQgPSBSRVNVTFRfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZGVmYXVsdDsKKyAgICB9CisKKyAgICBjaGFyKiBlbmQ7CisgICAgLy8gbG9uZyBpcyBvbmx5IDMyIGJpdHMgb24gd2luZG93cyBzbyBpdCBpc24ndCBlbm91Z2ggdG8gZGV0ZWN0IGludCBvdmVyZmxvdworICAgIGxvbmcgbG9uZyB2YWwgPSBzdHJ0b2xsKHByb3AsICZlbmQsIDEwKTsKKyAgICBpZiAodmFsIDwgSU5UX01JTiB8fCB2YWwgPiBJTlRfTUFYIHx8CisgICAgICAgIGVuZCA9PSBwcm9wIHx8ICplbmQgIT0gJ1wwJykgeworICAgICAgICBEKCJJbnZhbGlkIGludCBwcm9wZXJ0eTogJyVzOiVzJyIsIGtleSwgcHJvcCk7CisgICAgICAgIEFGUkVFKHByb3ApOworICAgICAgICBpZiAoc2VhcmNoUmVzdWx0KSB7CisgICAgICAgICAgICAqc2VhcmNoUmVzdWx0ID0gUkVTVUxUX0lOVkFMSUQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0OworICAgIH0KKworICAgIEFGUkVFKHByb3ApOworCisgICAgaWYgKHNlYXJjaFJlc3VsdCkgeworICAgICAgICAqc2VhcmNoUmVzdWx0ID0gUkVTVUxUX0ZPVU5EOworICAgIH0KKyAgICByZXR1cm4gKGludCl2YWw7Cit9CisKK2ludAorcHJvcGVydHlGaWxlX2dldEFwaUxldmVsKGNvbnN0IEZpbGVEYXRhKiBkYXRhKSB7CisgICAgY29uc3QgaW50IGtNaW5MZXZlbCA9IDM7CisgICAgY29uc3QgaW50IGtNYXhMZXZlbCA9IDEwMDAwOworICAgIFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7CisgICAgaW50IGxldmVsID0gcHJvcGVydHlGaWxlX2dldEludChkYXRhLCAicm8uYnVpbGQudmVyc2lvbi5zZGsiLCBrTWluTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoUmVzdWx0KTsKKyAgICBpZiAoc2VhcmNoUmVzdWx0ID09IFJFU1VMVF9OT1RfRk9VTkQpIHsKKyAgICAgICAgbGV2ZWwgPSBrTWF4TGV2ZWw7CisgICAgICAgIEQoIkNvdWxkIG5vdCBmaW5kIFNESyB2ZXJzaW9uIGluIGJ1aWxkLnByb3AsIGRlZmF1bHQgaXM6ICVkIiwgbGV2ZWwpOworICAgIH0gZWxzZSBpZiAoc2VhcmNoUmVzdWx0ID09IFJFU1VMVF9JTlZBTElEIHx8IGxldmVsIDwgMCkgeworICAgICAgICBEKCJEZWZhdWx0aW5nIHRvIHRhcmdldCBBUEkgc2RrVmVyc2lvbiAlZCIsIGxldmVsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEKCJGb3VuZCB0YXJnZXQgQVBJIHNka1ZlcnNpb246ICVkXG4iLCBsZXZlbCk7CisgICAgfQorICAgIHJldHVybiBsZXZlbDsKK30KKworYm9vbAorcHJvcGVydHlGaWxlX2lzR29vZ2xlQXBpcyhjb25zdCBGaWxlRGF0YSogZGF0YSkgeworICAgIGNoYXIqIHByb3AgPSBwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkYXRhLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICBkYXRhLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAicm8ucHJvZHVjdC5uYW1lIik7CisgICAgaWYgKCFwcm9wKSB7IHJldHVybiBmYWxzZTsgfQorICAgIGlmIChzdHJzdHIocHJvcCwgInNka19nb29nbGUiKSB8fAorICAgICAgICBzdHJzdHIocHJvcCwgImdvb2dsZV9zZGsiKSkgeworICAgICAgICBmcmVlKHByb3ApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZnJlZShwcm9wKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NoYXIqIHBhdGhfZ2V0QnVpbGRCdWlsZFByb3AoY29uc3QgY2hhciogYW5kcm9pZE91dCkgeworICAgIGNoYXIgdGVtcFtNQVhfUEFUSF0sICpwID0gdGVtcCwgKmVuZCA9IHAgKyBzaXplb2YodGVtcCk7CisgICAgcCA9IGJ1ZnByaW50KHRlbXAsIGVuZCwgIiVzL3N5c3RlbS9idWlsZC5wcm9wIiwgYW5kcm9pZE91dCk7CisgICAgaWYgKHAgPj0gZW5kKSB7CisgICAgICAgIEQoIkFORFJPSURfQlVJTERfT1VUIGlzIHRvbyBsb25nOiAlc1xuIiwgYW5kcm9pZE91dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIXBhdGhfZXhpc3RzKHRlbXApKSB7CisgICAgICAgIEQoIkNhbm5vdCBmaW5kIGJ1aWxkIHByb3BlcnRpZXMgZmlsZTogJXNcbiIsIHRlbXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIEFTVFJEVVAodGVtcCk7Cit9CisKKworY2hhciogcGF0aF9nZXRCdWlsZEJvb3RQcm9wKGNvbnN0IGNoYXIqIGFuZHJvaWRPdXQpIHsKKyAgICBjaGFyIHRlbXBbTUFYX1BBVEhdLCAqcCA9IHRlbXAsICplbmQgPSBwICsgc2l6ZW9mKHRlbXApOworICAgIHAgPSBidWZwcmludCh0ZW1wLCBlbmQsICIlcy9ib290LnByb3AiLCBhbmRyb2lkT3V0KTsKKyAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgRCgiQU5EUk9JRF9CVUlMRF9PVVQgaXMgdG9vIGxvbmc6ICVzXG4iLCBhbmRyb2lkT3V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghcGF0aF9leGlzdHModGVtcCkpIHsKKyAgICAgICAgRCgiQ2Fubm90IGZpbmQgYm9vdCBwcm9wZXJ0aWVzIGZpbGU6ICVzXG4iLCB0ZW1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBBU1RSRFVQKHRlbXApOworfQorCisKK2NoYXIqCitwYXRoX2dldEJ1aWxkVGFyZ2V0QXJjaChjb25zdCBjaGFyKiBhbmRyb2lkT3V0KSB7CisgICAgY2hhciogYnVpbGRQcm9wUGF0aCA9IHBhdGhfZ2V0QnVpbGRCdWlsZFByb3AoYW5kcm9pZE91dCk7CisgICAgaWYgKCFidWlsZFByb3BQYXRoKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEZpbGVEYXRhIGJ1aWxkUHJvcFsxXTsKKyAgICBmaWxlRGF0YV9pbml0RnJvbUZpbGUoYnVpbGRQcm9wLCBidWlsZFByb3BQYXRoKTsKKyAgICBjaGFyKiByZXQgPSBwcm9wZXJ0eUZpbGVfZ2V0VGFyZ2V0QXJjaChidWlsZFByb3ApOworICAgIGZpbGVEYXRhX2RvbmUoYnVpbGRQcm9wKTsKKyAgICBBRlJFRShidWlsZFByb3BQYXRoKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBjaGFyKgorX2dldEF2ZENvbmZpZ1ZhbHVlKGNvbnN0IGNoYXIqIGF2ZFBhdGgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSkKK3sKKyAgICBDSW5pRmlsZSogaW5pOworICAgIGNoYXIqIHJlc3VsdCA9IE5VTEw7CisgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnAgPSB0ZW1wLCAqZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKyAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMiIFBBVEhfU0VQIENPUkVfQ09ORklHX0lOSSwgYXZkUGF0aCk7CisgICAgaWYgKHAgPj0gZW5kKSB7CisgICAgICAgIEFQQU5JQygiQVZEIHBhdGggdG9vIGxvbmc6ICVzXG4iLCBhdmRQYXRoKTsKKyAgICB9CisgICAgaW5pID0gaW5pRmlsZV9uZXdGcm9tRmlsZSh0ZW1wKTsKKyAgICBpZiAoaW5pID09IE5VTEwpIHsKKyAgICAgICAgQVBBTklDKCJDb3VsZCBub3Qgb3BlbiBBVkQgY29uZmlnIGZpbGU6ICVzXG4iLCB0ZW1wKTsKKyAgICB9CisgICAgcmVzdWx0ID0gaW5pRmlsZV9nZXRTdHJpbmcoaW5pLCBrZXksIGRlZmF1bHRWYWx1ZSk7CisgICAgaW5pRmlsZV9mcmVlKGluaSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjaGFyKgorcGF0aF9nZXRBdmRUYXJnZXRBcmNoKCBjb25zdCBjaGFyKiBhdmROYW1lICkKK3sKKyAgICBjaGFyKiAgYXZkUGF0aCA9IHBhdGhfZ2V0QXZkQ29udGVudFBhdGgoYXZkTmFtZSk7CisgICAgY2hhciogIGF2ZEFyY2ggPSBfZ2V0QXZkQ29uZmlnVmFsdWUoYXZkUGF0aCwgImh3LmNwdS5hcmNoIiwgImFybSIpOworICAgIEFGUkVFKGF2ZFBhdGgpOworCisgICAgcmV0dXJuIGF2ZEFyY2g7Cit9CisKK2NoYXIqCitwYXRoX2dldEF2ZFNuYXBzaG90UHJlc2VudCggY29uc3QgY2hhciogYXZkTmFtZSApCit7CisgICAgY2hhciogIGF2ZFBhdGggPSBwYXRoX2dldEF2ZENvbnRlbnRQYXRoKGF2ZE5hbWUpOworICAgIGNoYXIqICBzbmFwc2hvdFByZXNlbnQgPSBfZ2V0QXZkQ29uZmlnVmFsdWUoYXZkUGF0aCwgInNuYXBzaG90LnByZXNlbnQiLCAibm8iKTsKKyAgICBBRlJFRShhdmRQYXRoKTsKKworICAgIHJldHVybiBzbmFwc2hvdFByZXNlbnQ7Cit9CisKK2NoYXIqCitwYXRoX2dldEF2ZFN5c3RlbVBhdGgoY29uc3QgY2hhciogYXZkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZGtSb290KSB7CisgICAgY2hhciogcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyKiBhdmRQYXRoID0gcGF0aF9nZXRBdmRDb250ZW50UGF0aChhdmROYW1lKTsKKyAgICBpbnQgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX1NFQVJDSF9QQVRIUzsgKytubikgeworICAgICAgICBjaGFyIHNlYXJjaEtleVszMl07CisgICAgICAgIHNucHJpbnRmKHNlYXJjaEtleSwgc2l6ZW9mKHNlYXJjaEtleSksICIlcyVkIiwgU0VBUkNIX1BSRUZJWCwgbm4gKyAxKTsKKyAgICAgICAgY2hhciogc2VhcmNoUGF0aCA9IF9nZXRBdmRDb25maWdWYWx1ZShhdmRQYXRoLCBzZWFyY2hLZXksIE5VTEwpOworICAgICAgICBpZiAoIXNlYXJjaFBhdGgpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnAgPSB0ZW1wLCAqZW5kPSBwK3NpemVvZiB0ZW1wOworICAgICAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvJXMiLCBzZGtSb290LCBzZWFyY2hQYXRoKTsKKyAgICAgICAgaWYgKHAgPj0gZW5kIHx8ICFwYXRoX2lzX2Rpcih0ZW1wKSkgeworICAgICAgICAgICAgRCgiIE5vdCBhIGRpcmVjdG9yeTogJXNcbiIsIHRlbXApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRCgiIEZvdW5kIGRpcmVjdG9yeTogJXNcbiIsIHRlbXApOworICAgICAgICByZXN1bHQgPSBBU1RSRFVQKHRlbXApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQUZSRUUoYXZkUGF0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY2hhcioKK3BhdGhfZ2V0QXZkR3B1TW9kZShjb25zdCBjaGFyKiBhdmROYW1lKQoreworICAgIGNoYXIqIGF2ZFBhdGggPSBwYXRoX2dldEF2ZENvbnRlbnRQYXRoKGF2ZE5hbWUpOworICAgIGNoYXIqIGdwdUVuYWJsZWQgPSBfZ2V0QXZkQ29uZmlnVmFsdWUoYXZkUGF0aCwgImh3LmdwdS5lbmFibGVkIiwgIm5vIik7CisgICAgYm9vbCBlbmFibGVkID0gIXN0cmNtcChncHVFbmFibGVkLCAieWVzIik7CisgICAgQUZSRUUoZ3B1RW5hYmxlZCk7CisKKyAgICBjaGFyKiBncHVNb2RlID0gTlVMTDsKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBncHVNb2RlID0gX2dldEF2ZENvbmZpZ1ZhbHVlKGF2ZFBhdGgsICJody5ncHUubW9kZSIsICJhdXRvIik7CisgICAgfQorICAgIEFGUkVFKGF2ZFBhdGgpOworICAgIHJldHVybiBncHVNb2RlOworfQorCitjaGFyKgorcGF0aF9nZXRBdmRHcHVCbGFja2xpc3RlZChjb25zdCBjaGFyKiBhdmROYW1lKQoreworICAgIGNoYXIqIGF2ZFBhdGggPSBwYXRoX2dldEF2ZENvbnRlbnRQYXRoKGF2ZE5hbWUpOworICAgIGNoYXIqIGdwdUJsYWNrbGlzdGVkID0gTlVMTDsKKyAgICBncHVCbGFja2xpc3RlZCA9IF9nZXRBdmRDb25maWdWYWx1ZShhdmRQYXRoLCAiaHcuZ3B1LmJsYWNrbGlzdGVkIiwgIm5vIik7CisgICAgQUZSRUUoYXZkUGF0aCk7CisgICAgcmV0dXJuIGdwdUJsYWNrbGlzdGVkOworfQorCitjb25zdCBjaGFyKgorZW11bGF0b3JfZ2V0QmFja2VuZFN1ZmZpeChjb25zdCBjaGFyKiB0YXJnZXRBcmNoKQoreworICAgIGlmICghdGFyZ2V0QXJjaCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogYXZkX2FyY2g7CisgICAgICAgIGNvbnN0IGNoYXIqIGVtdWxhdG9yX3N1ZmZpeDsKKyAgICB9IGtQYWlyc1tdID0geworICAgICAgICB7ICJhcm0iLCAiYXJtIiB9LAorICAgICAgICB7ICJ4ODYiLCAieDg2IiB9LAorICAgICAgICB7ICJ4ODZfNjQiLCAieDg2IiB9LAorICAgICAgICB7ICJtaXBzIiwgIm1pcHMiIH0sCisgICAgICAgIHsgImFybTY0IiwgImFybTY0IiB9LAorICAgICAgICB7ICJtaXBzNjQiLCAibWlwczY0IiB9LAorICAgICAgICAvLyBBZGQgbW9yZSBpZiBuZWVkZWQgaGVyZS4KKyAgICB9OworICAgIHNpemVfdCBuOworICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2Yoa1BhaXJzKS9zaXplb2Yoa1BhaXJzWzBdKTsgKytuKSB7CisgICAgICAgIGlmICghc3RyY21wKHRhcmdldEFyY2gsIGtQYWlyc1tuXS5hdmRfYXJjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBrUGFpcnNbbl0uZW11bGF0b3Jfc3VmZml4OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTM2ZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIEEgY29sbGVjdGlvbiBvZiBzaW1wbGUgZnVuY3Rpb25zIHRvIGV4dHJhY3QgcmVsZXZhbnQgQVZELXJlbGF0ZWQKKyAqIGluZm9ybWF0aW9uIGVpdGhlciBmcm9tIGFuIFNESyBBVkQgb3IgYSBwbGF0Zm9ybSBidWlsZC4KKyAqLworCisvKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIEFuZHJvaWQgU0RLIHJvb3QgaW5zdGFsbGF0aW9uLgorICogQ2FsbGVyIG11c3QgZnJlZSgpIHJldHVybmVkIHN0cmluZy4KKyAqLworY2hhciogcGF0aF9nZXRTZGtSb290KCk7CisKKy8qIFJldHVybiB0aGUgcGF0aCB0byB0aGUgQVZEJ3Mgcm9vdCBjb25maWd1cmF0aW9uIC5pbmkgZmlsZS4gaXQgaXMgbG9jYXRlZCBpbgorICogfi8uYW5kcm9pZC9hdmQvPG5hbWU+LmluaSBvciBXaW5kb3dzIGVxdWl2YWxlbnQKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIEFWRCdzIGNvbnRlbnQgZGlyZWN0b3J5LCB3aGljaAorICogaW5jbHVkZXMgaXRzIG93biBjb25maWcuaW5pLgorICovCitjaGFyKiBwYXRoX2dldFJvb3RJbmlQYXRoKCBjb25zdCBjaGFyKiAgYXZkTmFtZSApOworCisvKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIEFWRCdzIGNvbnRlbnQgZGlyZWN0b3J5LiBpdCBpcyBsb2NhdGVkIGluCisgKiAgfi8uYW5kcm9pZC9hdmQvPG5hbWU+LmF2ZCBvciBXaW5kb3dzIGVxdWl2YWxlbnQKKyAqIENhbGxlciBtdXN0IGZyZWUoKSByZXR1cm5lZCBzdHJpbmcuCisgKi8KK2NoYXIqIHBhdGhfZ2V0QXZkQ29udGVudFBhdGgoIGNvbnN0IGNoYXIqIGF2ZE5hbWUgKTsKKworLyogUmV0dXJuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIGZvciBhIGdpdmVuIEFWRC4KKyAqIENhbGxlciBtdXN0IGZyZWUoKSByZXR1cm5lZCBzdHJpbmcuCisgKi8KK2NoYXIqIHBhdGhfZ2V0QXZkVGFyZ2V0QXJjaCggY29uc3QgY2hhciogYXZkTmFtZSApOworCisvKiBSZXR1cm4gdGhlIHNuYXBzaG90LnByZXNlbnQgZm9yIGEgZ2l2ZW4gQVZELgorICogQ2FsbGVyIG11c3QgZnJlZSgpIHJldHVybmVkIHN0cmluZy4KKyAqLworY2hhciogcGF0aF9nZXRBdmRTbmFwc2hvdFByZXNlbnQoIGNvbnN0IGNoYXIqIGF2ZE5hbWUgKTsKKworLyogUmV0dXJuIHRoZSBwYXRoIHRvIGFuIEFWRCdzIHN5c3RlbSBpbWFnZXMgZGlyZWN0b3J5LCByZWxhdGl2ZSB0byBhIGdpdmVuCisgKiByb290IFNESyBwYXRoLiBDYWxsZXIgbXVzdCBmcmVlKCkgdGhlIHJlc3VsdC4KKyAqLworY2hhciogcGF0aF9nZXRBdmRTeXN0ZW1QYXRoKGNvbnN0IGNoYXIqIGF2ZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2RrUm9vdFBhdGgpOworCisvKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGh3LmdwdS5tb2RlIGZvciBhIGdpdmVuIEFWRC4KKyAqIENhbGxlciBtdXN0IGZyZWUoKSByZXR1cm5lZCBzdHJpbmcuCisgKgorICogTk9URTogSWYgaHcuZ3B1LmVuYWJsZWQgaXMgZmFsc2UsIHRoZW4gdGhpcyByZXR1cm5zIE5VTEwKKyAqLworY2hhciogcGF0aF9nZXRBdmRHcHVNb2RlKGNvbnN0IGNoYXIqIGF2ZE5hbWUpOworCisvKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGh3LmdwdS5ibGFja2xpc3RlZCBmb3IgYSBnaXZlbiBBVkQuCisgKiBDYWxsZXIgbXVzdCBmcmVlKCkgcmV0dXJuZWQgc3RyaW5nLgorICovCitjaGFyKiBwYXRoX2dldEF2ZEdwdUJsYWNrbGlzdGVkKGNvbnN0IGNoYXIqIGF2ZE5hbWUpOworCit0eXBlZGVmIGVudW0geworICAgIFJFU1VMVF9JTlZBTElEICAgPSAtMSwgLy8ga2V5IHdhcyBmb3VuZCBidXQgdmFsdWUgY29udGFpbmVkIGludmFsaWQgZGF0YQorICAgIFJFU1VMVF9GT1VORCAgICAgPSAgMCwgLy8ga2V5IHdhcyBmb3VuZCBhbmQgdmFsdWUgcGFyc2VkIGNvcnJlY3RseQorICAgIFJFU1VMVF9OT1RfRk9VTkQgPSAgMSwgLy8ga2V5IHdhcyBub3QgZm91bmQgKGRlZmF1bHQgdXNlZCkKK30gU2VhcmNoUmVzdWx0OworCisvKiBSZXRyaWV2ZXMgYW4gaW50ZWdlciB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXJhbWV0ZXIKKyAqCisgKiB8ZGF0YXwgaXMgYSBGaWxlRGF0YSBpbnN0YW5jZQorICogfGtleXwgbmFtZSBvZiBrZXkgdG8gc2VhcmNoIGZvcgorICogfHNlYXJjaFJlc3VsdHwgaWYgbm9uLW51bGwsIHRoaXMgaXMgc2V0IHRvIFJFU1VMVF9JTlZBTElELCBSRVNVTFRfRk9VTkQsCisgKiAgICAgICAgICAgICAgICBvciBSRVNVTFRfTk9UX0ZPVU5ECisgKiBSZXR1cm5zIHZhbGlkIHBhcnNlZCBpbnQgdmFsdWUgaWYgZm91bmQsIHxkZWZhdWx0fCBvdGhlcndpc2UKKyAqLworaW50IHByb3BlcnR5RmlsZV9nZXRJbnQoY29uc3QgRmlsZURhdGEqIGRhdGEsIGNvbnN0IGNoYXIqIGtleSwgaW50IF9kZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoUmVzdWx0KiBzZWFyY2hSZXN1bHQpOworCisvKiBSZXRyaWV2ZXMgYSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICogZXh0cmFjdGVkIGZyb20gYSBidWlsZCBwcm9wZXJ0aWVzIGZpbGUuCisgKgorICogfGRhdGF8IGlzIGEgRmlsZURhdGEgaW5zdGFuY2UgaG9sZGluZyB0aGUgYnVpbGQucHJvcCBjb250ZW50cy4KKyAqIFJldHVybnMgYSBhIG5ldyBzdHJpbmcgdGhhdCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIHdoaWNoIGNhbgorICogYmUgJ2FybWVhYmknLCAnYXJtZWFiaS12N2EnLCAneDg2JywgZXRjLi4uIG9yIE5VTEwgaWYKKyAqIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorICovCitjaGFyKiBwcm9wZXJ0eUZpbGVfZ2V0VGFyZ2V0QWJpKGNvbnN0IEZpbGVEYXRhKiBkYXRhKTsKKworLyogUmV0cmlldmVzIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAqIGV4dHJhY3RlZCBmcm9tIGEgYnVpbGQgcHJvcGVydGllcyBmaWxlLgorICoKKyAqIHxkYXRhfCBpcyBhIEZpbGVEYXRhIGluc3RhbmNlIGhvbGRpbmcgdGhlIGJ1aWxkLnByb3AgY29udGVudHMuCisgKiBSZXR1cm5zIGEgbmV3IHN0cmluZyB0aGF0IG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciwgd2hpY2ggY2FuCisgKiBiZSAnYXJtJywgJ3g4NiwgJ21pcHMnLCBldGMuLi4sIG9yIE5VTEwgaWYgaWYgY2Fubm90IGJlIGRldGVybWluZWQuCisgKi8KK2NoYXIqIHByb3BlcnR5RmlsZV9nZXRUYXJnZXRBcmNoKGNvbnN0IEZpbGVEYXRhKiBkYXRhKTsKKworLyogUmV0cmlldmUgdGhlIHRhcmdldCBBUEkgbGV2ZWwgZnJvbSB0aGUgYnVpbGQucHJvcCBjb250ZW50cy4KKyAqIFJldHVybnMgYSB2ZXJ5IGxhcmdlIHZhbHVlIChlLmcuIDEwMDAwMCkgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQKKyAqICh3aGljaCBoYXBwZW5zIGZvciBwbGF0Zm9ybSBidWlsZHMpLCBvciAzICh0aGUgbWluaW11bSBTREsgQVBJIGxldmVsKQorICogaWYgdGhlcmUgaXMgaW52YWxpZCB2YWx1ZS4KKyAqLworaW50IHByb3BlcnR5RmlsZV9nZXRBcGlMZXZlbChjb25zdCBGaWxlRGF0YSogZGF0YSk7CisKKy8qIERldGVybWluZSB3aGV0aGVyIGEgR29vZ2xlIEFQSSdzIHN5c3RlbSBpbWFnZSBpcyB1c2VkLiAqLworYm9vbCBwcm9wZXJ0eUZpbGVfaXNHb29nbGVBcGlzKGNvbnN0IEZpbGVEYXRhKiBkYXRhKTsKKworLyogUmV0cmlldmUgdGhlIG1vZGUgZGVzY3JpYmluZyBob3cgdGhlIEFEQiBkYWVtb24gaXMgY29tbXVuaWNhdGluZyB3aXRoCisgKiB0aGUgZW11bGF0b3IgZnJvbSBpbnNpZGUgdGhlIGd1ZXN0LgorICogUmV0dXJuIDAgZm9yIGxlZ2FjeSBtb2RlLCB3aGljaCB1c2VzIFRDUCBwb3J0IDU1NTUuCisgKiBSZXR1cm4gMSBmb3IgdGhlICdxZW11ZCcgbW9kZSwgd2hpY2ggdXNlcyBhIFFFTVVEIHNlcnZpY2UgaW5zdGVhZC4KKyAqLworaW50IHByb3BlcnR5RmlsZV9nZXRBZGJkQ29tbXVuaWNhdGlvbk1vZGUoY29uc3QgRmlsZURhdGEqIGRhdGEpOworCisvKiBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGJ1aWxkIHByb3BlcnRpZXMgZmlsZSAoYnVpbGQucHJvcCkgZnJvbSBhbgorICogQW5kcm9pZCBwbGF0Zm9ybSBidWlsZCwgb3IgTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICovCitjaGFyKiBwYXRoX2dldEJ1aWxkQnVpbGRQcm9wKCBjb25zdCBjaGFyKiBhbmRyb2lkT3V0ICk7CisKKy8qIFJldHVybiB0aGUgcGF0aCBvZiB0aGUgYm9vdCBwcm9wZXJ0aWVzIGZpbGUgKGJvb3QucHJvcCkgZnJvbSBhbgorICogQW5kcm9pZCBwbGF0Zm9ybSBidWlsZCwgb3IgTlVMTCBpZiBpdCBkb2Vzbid0IGV4aXQuCisgKi8KK2NoYXIqIHBhdGhfZ2V0QnVpbGRCb290UHJvcCggY29uc3QgY2hhciogYW5kcm9pZE91dCApOworCisvKiBSZXR1cm4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgYnVpbGQgcHJvcGVydGllcyBmaWxlCisgKiAgKGJ1aWxkLnByb3ApIG9mIGFuIEFuZHJvaWQgcGxhdGZvcm1uIGJ1aWxkLiBSZXR1cm4gTlVMTCBvciBhIG5ldworICogc3RyaW5nIHRoYXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitjaGFyKiBwYXRoX2dldEJ1aWxkVGFyZ2V0QXJjaCggY29uc3QgY2hhciogYW5kcm9pZE91dCApOworCisvKiBHaXZlbiBhbiBBVkQncyB0YXJnZXQgYXJjaGl0ZWN0dXJlLCByZXR1cm4gdGhlIHN1ZmZpeCBvZiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZW11bGF0b3IgYmFja2VuZCBwcm9ncmFtLCBlLmcuICd4ODYnIGZvciB4ODYgYW5kIHg4Nl82NAorICogQ1BVcywgJ2FybScgZm9yIEFSTSBvbmVzIChpbmNsdWRpbmcgQVJNNjQgd2hlbiBzdXBwb3J0IGlzIGNvbXBsZXRlKSwKKyAqIGV0Yy4gUmV0dXJuZWQgc3RyaW5nIG11c3Qgbm90IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2NvbnN0IGNoYXIqIGVtdWxhdG9yX2dldEJhY2tlbmRTdWZmaXgoY29uc3QgY2hhciogdGFyZ2V0QXJjaCk7CisKKy8qIHRoaXMgaXMgdGhlIHN1YmRpcmVjdG9yeSBvZiAkSE9NRS8uYW5kcm9pZCB3aGVyZSBhbGwKKyAqIHJvb3QgY29uZmlndXJhdGlvbiBmaWxlcyAoYW5kIGRlZmF1bHQgY29udGVudCBkaXJlY3RvcmllcykKKyAqIGFyZSBsb2NhdGVkLgorICovCisjZGVmaW5lICBBTkRST0lEX0FWRF9ESVIgICAgImF2ZCIKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3V0aWxfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDEwZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL3V0aWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworVEVTVChBdmRVdGlsLCBlbXVsYXRvcl9nZXRCYWNrZW5kU3VmZml4KSB7CisgIEVYUEVDVF9TVFJFUSgiYXJtIiwgZW11bGF0b3JfZ2V0QmFja2VuZFN1ZmZpeCgiYXJtIikpOworICBFWFBFQ1RfU1RSRVEoIng4NiIsIGVtdWxhdG9yX2dldEJhY2tlbmRTdWZmaXgoIng4NiIpKTsKKyAgRVhQRUNUX1NUUkVRKCJ4ODYiLCBlbXVsYXRvcl9nZXRCYWNrZW5kU3VmZml4KCJ4ODZfNjQiKSk7CisgIEVYUEVDVF9TVFJFUSgibWlwcyIsIGVtdWxhdG9yX2dldEJhY2tlbmRTdWZmaXgoIm1pcHMiKSk7CisgIEVYUEVDVF9TVFJFUSgiYXJtNjQiLCBlbXVsYXRvcl9nZXRCYWNrZW5kU3VmZml4KCJhcm02NCIpKTsKKyAgRVhQRUNUX1NUUkVRKCJtaXBzNjQiLCBlbXVsYXRvcl9nZXRCYWNrZW5kU3VmZml4KCJtaXBzNjQiKSk7CisKKyAgRVhQRUNUX0ZBTFNFKGVtdWxhdG9yX2dldEJhY2tlbmRTdWZmaXgoTlVMTCkpOworICBFWFBFQ1RfRkFMU0UoZW11bGF0b3JfZ2V0QmFja2VuZFN1ZmZpeCgiZHVtbXkiKSk7Cit9CisKK1RFU1QoQXZkVXRpbCwgcHJvcGVydHlGaWxlX2dldEludCkgeworICBGaWxlRGF0YSBmZDsKKworICBjb25zdCBjaGFyKiB0ZXN0RmlsZSA9CisgICAgIm5pbmV0ZWVuPTE5XG4iCisgICAgImludF9taW49LTIxNDc0ODM2NDhcbiIKKyAgICAiaW50X21heD0yMTQ3NDgzNjQ3XG4iCisgICAgImludmFsaWQ9MjE0NzQ4MzY0OFxuIgorICAgICJpbnZhbGlkMj0tMjE0NzQ4MzY0OVxuIgorICAgICJpbnZhbGlkMz1iYXJcbiIKKyAgICAiZW1wdHk9XG4iOworCisgIEVYUEVDVF9FUSgwLGZpbGVEYXRhX2luaXRGcm9tTWVtb3J5KCZmZCwgdGVzdEZpbGUsIHN0cmxlbih0ZXN0RmlsZSkpKTsKKworICBjb25zdCBpbnQga0RlZmF1bHQgPSAxMTM4OworICBTZWFyY2hSZXN1bHQga1NlYXJjaFJlc3VsdEdhcmJhZ2UgPSAoU2VhcmNoUmVzdWx0KTB4ZGVhZGJlZWY7CisgIFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQgPSBrU2VhcmNoUmVzdWx0R2FyYmFnZTsKKworICBFWFBFQ1RfRVEoa0RlZmF1bHQscHJvcGVydHlGaWxlX2dldEludCgmZmQsICJpbnZhbGlkIiwga0RlZmF1bHQsICZzZWFyY2hSZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFJFU1VMVF9JTlZBTElELHNlYXJjaFJlc3VsdCk7CisKKyAgc2VhcmNoUmVzdWx0ID0ga1NlYXJjaFJlc3VsdEdhcmJhZ2U7CisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImludmFsaWQyIiwga0RlZmF1bHQsICZzZWFyY2hSZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFJFU1VMVF9JTlZBTElELHNlYXJjaFJlc3VsdCk7CisKKyAgc2VhcmNoUmVzdWx0ID0ga1NlYXJjaFJlc3VsdEdhcmJhZ2U7CisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImludmFsaWQzIiwga0RlZmF1bHQsICZzZWFyY2hSZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFJFU1VMVF9JTlZBTElELHNlYXJjaFJlc3VsdCk7CisKKyAgc2VhcmNoUmVzdWx0ID0ga1NlYXJjaFJlc3VsdEdhcmJhZ2U7CisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImJhciIsIGtEZWZhdWx0LCAmc2VhcmNoUmVzdWx0KSk7CisgIEVYUEVDVF9FUShSRVNVTFRfTk9UX0ZPVU5ELHNlYXJjaFJlc3VsdCk7CisKKyAgc2VhcmNoUmVzdWx0ID0ga1NlYXJjaFJlc3VsdEdhcmJhZ2U7CisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImVtcHR5Iiwga0RlZmF1bHQsICZzZWFyY2hSZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFJFU1VMVF9JTlZBTElELHNlYXJjaFJlc3VsdCk7CisKKyAgc2VhcmNoUmVzdWx0ID0ga1NlYXJjaFJlc3VsdEdhcmJhZ2U7CisgIEVYUEVDVF9FUSgxOSxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgIm5pbmV0ZWVuIiwga0RlZmF1bHQsICZzZWFyY2hSZXN1bHQpKTsKKyAgRVhQRUNUX0VRKFJFU1VMVF9GT1VORCxzZWFyY2hSZXN1bHQpOworCisgIC8vIGNoZWNrIHRoYXQgbnVsbCAic2VhcmNoUmVzdWx0IiBwYXJhbWV0ZXIgaXMgc3VwcG9ydGVkCisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImJhciIsIGtEZWZhdWx0LCBOVUxMKSk7CisgIEVYUEVDVF9FUShrRGVmYXVsdCxwcm9wZXJ0eUZpbGVfZ2V0SW50KCZmZCwgImludmFsaWQiLCBrRGVmYXVsdCwgTlVMTCkpOworICBFWFBFQ1RfRVEoMTkscHJvcGVydHlGaWxlX2dldEludCgmZmQsICJuaW5ldGVlbiIsIGtEZWZhdWx0LCBOVUxMKSk7Cit9CisKK1RFU1QoQXZkVXRpbCwgcHJvcGVydHlGaWxlX2dldEFwaUxldmVsKSB7CisgIEZpbGVEYXRhIGZkOworCisgIGNvbnN0IGNoYXIqIGVtcHR5RmlsZSA9CisgICAgIlxuIjsKKworICBjb25zdCBjaGFyKiB0ZXN0RmlsZTE5ID0KKyAgICAicm8uYnVpbGQudmVyc2lvbi5zZGs9MTlcbiI7CisKKyAgY29uc3QgY2hhciogdGVzdEZpbGVCb2d1cyA9CisgICAgInJvLmJ1aWxkLnZlcnNpb24uc2RrPWJvZ3VzXG4iOworCisgIEVYUEVDVF9FUSgwLGZpbGVEYXRhX2luaXRGcm9tTWVtb3J5KCZmZCwgZW1wdHlGaWxlLCBzdHJsZW4oZW1wdHlGaWxlKSkpOworICBFWFBFQ1RfRVEoMTAwMDAscHJvcGVydHlGaWxlX2dldEFwaUxldmVsKCZmZCkpOworCisgIEVYUEVDVF9FUSgwLGZpbGVEYXRhX2luaXRGcm9tTWVtb3J5KCZmZCwgdGVzdEZpbGUxOSwgc3RybGVuKHRlc3RGaWxlMTkpKSk7CisgIEVYUEVDVF9FUSgxOSxwcm9wZXJ0eUZpbGVfZ2V0QXBpTGV2ZWwoJmZkKSk7CisKKyAgRVhQRUNUX0VRKDAsZmlsZURhdGFfaW5pdEZyb21NZW1vcnkoJmZkLCB0ZXN0RmlsZUJvZ3VzLCBzdHJsZW4odGVzdEZpbGVCb2d1cykpKTsKKyAgRVhQRUNUX0VRKDMscHJvcGVydHlGaWxlX2dldEFwaUxldmVsKCZmZCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsX3dyYXBwZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC91dGlsX3dyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjkxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL3V0aWxfd3JhcHBlci5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC91dGlsLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnMuaCIKKworY2hhciogcGF0aF9nZXRTZGtSb290KCkgeworICAgIGF1dG8gcm9vdCA9IGFuZHJvaWQ6OkNvbmZpZ0RpcnM6OmdldFNka1Jvb3REaXJlY3RvcnkoKTsKKyAgICByZXR1cm4gIXJvb3QuZW1wdHkoKSA/IGFuZHJvaWQ6OmJhc2U6OnN0ckR1cChyb290KSA6IG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9BcnJheVNpemUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0FycmF5U2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTUzMjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9BcnJheVNpemUuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKy8vIFRoaXMgZmlsZSBkZWZpbmVzIG1hY3JvZXMgQVJSQVlfU0laRSgpIGFuZCBTVFJJTkdfTElURVJBTF9MRU5HVEggZm9yIHN0YXRpYworLy8gYXJyYXkgc2l6ZSBhbmQgc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIGRldGVjdGlvbgorLy8gSWYgdXNlZCBmcm9tIEMsIGl0J3MganVzdCBhIHN0YW5kYXJkIGRpdmlzaW9uIG9mIHNpemVzLiBJbiBDKysgdGhvdWdoLCBpdAorLy8gd291bGQgZ2l2ZSB5b3UgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdXNlZCB3aXRoIHNvbWV0aGluZyBvdGhlciB0aGFuCisvLyBhIGJ1aWx0LWluIGFycmF5IG9yIHN0ZDo6YXJyYXk8PgorLy8gQWxzbywgQysrIGRlZmluZXMgY29ycmVzcG9uZGluZyBjb25zdGV4cHIgZnVuY3Rpb25zIGZvciB0aGUgc2FtZSBwdXJwb3NlCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgQVJSQVlfU0laRShhcnIpIChzaXplb2YoYXJyKSAvIHNpemVvZigoYXJyKVswXSkpCisjICAgZGVmaW5lIFNUUklOR19MSVRFUkFMX0xFTkdUSChzdHIpIChBUlJBWV9TSVpFKHN0cikgLSAxKSkKKyNlbHNlCisKKyNpbmNsdWRlIDxhcnJheT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBhcnJheVNpemUoY29uc3QgVCAoJmFycilbTl0pIHsKKyAgICByZXR1cm4gTjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPgorc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgYXJyYXlTaXplKGNvbnN0IHN0ZDo6YXJyYXk8VCwgTj4mIGFycikgeworICAgIHJldHVybiBOOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IE4+CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBzdHJpbmdMaXRlcmFsTGVuZ3RoKGNvbnN0IGNoYXIgKCZzdHIpW05dKSB7CisgICAgcmV0dXJuIE4gLSAxOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gZm9yIHRob3NlIHdobyBsaWtlIG1hY3JvcywgZGVmaW5lIGl0IHRvIGJlIGEgc2ltcGxlIGZ1bmN0aW9uIGNhbGwKKyNkZWZpbmUgQVJSQVlfU0laRShhcnIpICg6OmFuZHJvaWQ6OmJhc2U6OmFycmF5U2l6ZShhcnIpKQorI2RlZmluZSBTVFJJTkdfTElURVJBTF9MRU5HVEgoc3RyKSAoOjphbmRyb2lkOjpiYXNlOjpzdHJpbmdMaXRlcmFsTGVuZ3RoKHN0cikpCisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0FycmF5U2l6ZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9BcnJheVNpemVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODgxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9BcnJheVNpemVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0FycmF5U2l6ZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKEFycmF5U2l6ZSwgU2l6ZXMpIHsKKyAgICBpbnQgYXJyYXkxWzEwMF07CisgICAgRVhQRUNUX0VRKDEwMCwgYXJyYXlTaXplKGFycmF5MSkpOworICAgIEVYUEVDVF9FUSgxMDAsIEFSUkFZX1NJWkUoYXJyYXkxKSk7CisKKyAgICBjaGFyIGFycmF5MlsyMDBdOworICAgIEVYUEVDVF9FUSgyMDAsIGFycmF5U2l6ZShhcnJheTIpKTsKKyAgICBFWFBFQ1RfRVEoMjAwLCBBUlJBWV9TSVpFKGFycmF5MikpOworCisgICAgc3RkOjphcnJheTxzdGQ6OnZlY3Rvcjxib29sPiwgMTU+IGFycmF5MzsKKyAgICBFWFBFQ1RfRVEoMTUsIGFycmF5U2l6ZShhcnJheTMpKTsKKyAgICBFWFBFQ1RfRVEoMTUsIEFSUkFZX1NJWkUoYXJyYXkzKSk7Cit9CisKK1RFU1QoQXJyYXlTaXplLCBDb21waWxlVGltZSkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGFyclsyMF0gPSB7fTsKKyAgICBzdGF0aWNfYXNzZXJ0KEFSUkFZX1NJWkUoYXJyKSA9PSAyMCwKKyAgICAgICAgICAgICAgICAgICJCYWQgQVJSQVlfU0laRSgpIHJlc3VsdCBpbiBjb21waWxlIHRpbWUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGFycmF5U2l6ZShhcnIpID09IDIwLAorICAgICAgICAgICAgICAgICAgIkJhZCBhcnJheVNpemUoKSByZXN1bHQgaW4gY29tcGlsZSB0aW1lIik7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgYXJyMlthcnJheVNpemUoYXJyKV0gPSB7fTsKKyAgICBzdGF0aWNfYXNzZXJ0KGFycmF5U2l6ZShhcnIyKSA9PSAyMCwKKyAgICAgICAgICAgICAgICAgICJCYWQgc2l6ZSBvZiBhIG5ldyBhcnJheSBkZWNsYXJlZCB3aXRoIGEgcmVzdWx0IG9mICIKKyAgICAgICAgICAgICAgICAgICJhcnJheVNpemUoKSBjYWxsIik7CisgICAgc3RhdGljX2Fzc2VydChhcnJheVNpemUoYXJyKSA9PSBBUlJBWV9TSVpFKGFycjIpLAorICAgICAgICAgICAgICAgICAgIk1hY3JvIGFuZCBmdW5jdGlvbiBhcmUgY29tcGF0aWJsZSIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Db21waWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmQ5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Db21waWxlci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworLy8gVXNlIHRoaXMgaW5zaWRlIGEgY2xhc3MgZGVjbGFyYXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgb2JqZWN0cworLy8gY2Fubm90IGJlIGNvcHktY29uc3RydWN0ZWQgb3IgYXNzaWduZWQuIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgRm9vIHsKKy8vICAgICAgIC4uLi4KKy8vICAgICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGb28pCisvLyAgICAgICAuLi4uCisvLyAgIH07CisvLworLy8gTm90ZTogdGhpcyBtYWNybyBpcyBzb21ldGltZXMgZGVmaW5lZCBpbiAzcmQtcGFydHkgbGlicywgc28gbGV0J3MgY2hlY2sgZmlyc3QKKyNpZm5kZWYgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOCisKKyNkZWZpbmUgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFQpIFwKKyAgICBUKGNvbnN0IFQmIG90aGVyKSA9IGRlbGV0ZTsgXAorICAgIFQmIG9wZXJhdG9yPShjb25zdCBUJiBvdGhlcikgPSBkZWxldGUKKworI2VuZGlmCisKKyNpZm5kZWYgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUKKworI2RlZmluZSBESVNBTExPV19DT1BZX0FTU0lHTl9BTkRfTU9WRShUKSBcCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFQpOyBcCisgICAgVChUJiYpID0gZGVsZXRlOyBcCisgICAgVCYgb3BlcmF0b3I9KFQmJikgPSBkZWxldGUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9EZWJ1Zy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9EZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0YTVhYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0RlYnVnLmNwcApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9EZWJ1Zy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0FycmF5U2l6ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2lmZGVmIF9fbGludXhfXworc3RhdGljIHN0ZDo6c3RyaW5nIHJlYWRGaWxlKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgIHN0ZDo6aWZzdHJlYW0gaXMocGF0aC5jX3N0cigpKTsKKworICAgIGlmICghaXMpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBpcy5yZGJ1ZigpOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKyNlbmRpZgorCitib29sIElzRGVidWdnZXJBdHRhY2hlZCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gOjpJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBzdGQ6OnN0cmluZyBwcm9jU3RhdHVzID0gcmVhZEZpbGUoIi9wcm9jL3NlbGYvc3RhdHVzIik7CisKKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1RyYWNlclBpZFByZWZpeCA9ICJUcmFjZXJQaWQ6IjsKKyAgICBjb25zdCBhdXRvIHRyYWNlclBpZCA9IHByb2NTdGF0dXMuZmluZChrVHJhY2VyUGlkUHJlZml4LmRhdGEoKSk7CisgICAgaWYgKHRyYWNlclBpZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHRyYWNlciBQSUQgaXMgcGFyc2VhYmxlIGFuZCBub3QgMCwgdGhlcmUncyBhIGRlYnVnZ2VyIGF0dGFjaGVkLgorICAgIGNvbnN0IGJvb2wgZGVidWdnZXJBdHRhY2hlZCA9CisgICAgICAgICAgICBhdG9pKHByb2NTdGF0dXMuY19zdHIoKSArIHRyYWNlclBpZCArIGtUcmFjZXJQaWRQcmVmaXguc2l6ZSgpKSAhPSAwOworICAgIHJldHVybiBkZWJ1Z2dlckF0dGFjaGVkOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgaW50IG1pYltdID0geyBDVExfS0VSTiwgS0VSTl9QUk9DLCBLRVJOX1BST0NfUElELCBnZXRwaWQoKSB9OworICAgIHN0cnVjdCBraW5mb19wcm9jIHByb2NJbmZvID0ge307CisgICAgc2l6ZV90IGluZm9TaXplOworICAgIGNvbnN0IGludCByZXMgPQorICAgICAgICAgICAgc3lzY3RsKG1pYiwgYXJyYXlTaXplKG1pYiksICZwcm9jSW5mbywgJmluZm9TaXplLCBudWxscHRyLCAwKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIChwcm9jSW5mby5rcF9wcm9jLnBfZmxhZyAmIFBfVFJBQ0VEKSAhPSAwOworI2Vsc2UKKyNlcnJvciBVbnN1cHBvcnRlZCBwbGF0Zm9ybQorI2VuZGlmCit9CisKK2Jvb2wgV2FpdEZvckRlYnVnZ2VyKFN5c3RlbTo6RHVyYXRpb24gdGltZW91dE1zKSB7CisgICAgc3RhdGljIGNvbnN0IFN5c3RlbTo6RHVyYXRpb24gc2xlZXBUaW1lb3V0TXMgPSA1MDA7CisKKyAgICBTeXN0ZW06OkR1cmF0aW9uIHNsZXB0Rm9yTXMgPSAwOworICAgIHdoaWxlICghSXNEZWJ1Z2dlckF0dGFjaGVkKCkKKyAgICAgICAgICAgJiYgKHRpbWVvdXRNcyA9PSAtMSB8fCBzbGVwdEZvck1zIDwgdGltZW91dE1zKSkgeworICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKHNsZWVwVGltZW91dE1zKTsKKyAgICAgICAgc2xlcHRGb3JNcyArPSBzbGVlcFRpbWVvdXRNczsKKyAgICB9CisgICAgcmV0dXJuIElzRGVidWdnZXJBdHRhY2hlZCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0RlYnVnLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9EZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNmFmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9EZWJ1Zy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaGFzIGEgZGVidWdnZXIgYXR0YWNoZWQuCitib29sIElzRGVidWdnZXJBdHRhY2hlZCgpOworCisvLyBTdXNwZW5kcyB0aGUgY3VycmVudCBwcm9jZXNzIGZvciB1cCB0byB8dGltZW91dE1zfCB1bnRpbCBhIGRlYnVnZ2VyIGF0dGFjaGVzLgorLy8gfHRpbWVvdXRNc3wgPT0gLTEgbWVhbnMgJ25vIHRpbWVvdXQnCitib29sIFdhaXRGb3JEZWJ1Z2dlcihTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXRNcyA9IC0xKTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0VpbnRyV3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2QwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBTZXQgRUlOVFJfV1JBUFBFUl9ERUJVRyB0byAxIHRvIGZvcmNlIHRoZSBkZWJ1ZyB2ZXJzaW9uIG9mIEhBTkRMRV9FSU5UUgorLy8gd2hpY2ggd2lsbCBjYWxsIGVpbnRyV3JhcHBlckZhdGFsKCkgaXMgdGhlIHN5c3RlbSBjYWxsIGxvb3BzCisvLyB0b28gbWFueSB0aW1lcywgb3IgMCB0byBnZXQgaXQgdG8gbG9vcCBpbmRlZmluaXRseS4KKy8vIE1vc3RseSB1c2VkIGZvciB1bml0IHRlc3RpbmcuCisvLyBJZiB0aGUgbWFjcm8gaXMgdW5kZWZpbmVkLCBhdXRvLWRldGVjdCB0aGUgdmFsdWUgYmFzZWQgb24gTkRFQlVHLgorI2lmICFkZWZpbmVkKEVJTlRSX1dSQVBQRVJfREVCVUcpCisjICBpZmRlZiBOREVCVUcKKyMgICAgZGVmaW5lIEVJTlRSX1dSQVBQRVJfREVCVUcgMAorIyAgZWxzZQorIyAgICBkZWZpbmUgRUlOVFJfV1JBUFBFUl9ERUJVRyAxCisjICBlbmRpZgorI2VuZGlmCisKKy8vIEhBTkRMRV9FSU5UUigpIGlzIGEgbWFjcm8gdXNlZCB0byBoYW5kbGUgRUlOVFIgcmV0dXJuIHZhbHVlcyB3aGVuCisvLyBjYWxsaW5nIHN5c3RlbSBjYWxscyBsaWtlIG9wZW4oKSBvciByZWFkKCkgb24gUG9zaXggc3lzdGVtcy4KKy8vCisvLyBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgbG9vcCBpbmRlZmluaXRseSwgcmV0cnlpbmcgdGhlIGNhbGwgdW50aWwKKy8vIHRoZSByZXN1bHQgaXMgbm8gbG9uZ2VyIC0xL0VJTlRSLCBleGNlcHQgaW4gZGVidWcgbW9kZSwgd2hlcmUgYQorLy8gbG9vcCBjb3VudGVyIGlzIGFjdHVhbGx5IHVzZWQgYW5kIHRvIHByb3Zva2UgYSBmYXRhbCBlcnJvciBpZiB0aGVyZQorLy8gYXJlIHRvbyBtYW55IGxvb3BzLgorLy8KKy8vIFVzYWdlIGV4YW1wbGU6CisvLyAgICAgaW50IHJldCA9IEhBTkRMRV9FSU5UUihvcGVuKCIvc29tZS9maWxlL3BhdGgiLCBPX1JET05MWSkpOworLy8KKy8vIElNUE9SVEFOVDogRG8gbm90IHVzZSB3aXRoIHRoZSBjbG9zZSgpIHN5c3RlbSBjYWxsICh1c2UgSUdOT1JFX0VJTlRSKCkKKy8vIGluc3RlYWQpLgorLy8KKy8vIC0gT24gTGludXgsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgYWx3YXlzIGFscmVhZHkgY2xvc2VkIHdoZW4gdGhpcworLy8gICBmdW5jdGlvbiByZXR1cm5zIC0xL0VJTlRSLCBhbmQgY2FsbGluZyBpdCBhZ2FpbiB3aXRoIHRoZSBzYW1lCisvLyAgIHBhcmFtZXRlcnMgcmlza3MgY2xvc2luZyBhbm90aGVyIGZpbGUgZGVzY3JpcHRvciBvcGVuIGJ5IGFub3RoZXIKKy8vICAgdGhyZWFkIGluIHBhcmFsbGVsIQorLy8KKy8vIC0gT24gT1MgWCwgd2hldGhlciB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBvciBub3QgaXMgcHJldHR5CisvLyAgIG11Y2ggcmFuZG9tISBJdCdzIGJldHRlciB0byBsZWF2ZSB0aGUgZGVzY3JpcHRvciBvcGVuIHRoYW4gcmlzaworLy8gICBjbG9zaW5nIGFub3RoZXIgb25lIGJ5IG1pc3Rha2UgOigKKy8vCisjZGVmaW5lIE1BWF9FSU5UUl9MT09QX0NPVU5UICAxMDAKKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIEhBTkRMRV9FSU5UUih4KSAgKHgpCisjZWxpZiBFSU5UUl9XUkFQUEVSX0RFQlVHID09IDAKKyMgIGRlZmluZSBIQU5ETEVfRUlOVFIoeCkgXAorICAgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAgICAgICBfX3R5cGVvZl9fKHgpIGVpbnRyX3dyYXBwZXJfcmVzdWx0OyBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQgPSAoeCk7IFwKKyAgICAgICAgfSB3aGlsZSAoZWludHJfd3JhcHBlcl9yZXN1bHQgPCAwICYmIGVycm5vID09IEVJTlRSKTsgXAorICAgICAgICBlaW50cl93cmFwcGVyX3Jlc3VsdDsgXAorICAgIH0pCisjZWxzZSAgLy8gIV9XSU4zMiAmJiBFSU5UUl9XUkFQUEVSX0RFQlVHCisKKyMgIGRlZmluZSBIQU5ETEVfRUlOVFIoeCkgXAorICAgIF9fZXh0ZW5zaW9uX18gKHsgXAorICAgICAgICBfX3R5cGVvZl9fKHgpIGVpbnRyX3dyYXBwZXJfcmVzdWx0OyBcCisgICAgICAgIGludCBlaW50cl93cmFwcGVyX2xvb3BfY291bnQgPSAwOyBcCisgICAgICAgIGZvciAoOzspIHsgXAorICAgICAgICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQgPSAoeCk7IFwKKyAgICAgICAgICAgIGlmIChlaW50cl93cmFwcGVyX3Jlc3VsdCAhPSAtMSB8fCBlcnJubyAhPSBFSU5UUikgXAorICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgICAgICArK2VpbnRyX3dyYXBwZXJfbG9vcF9jb3VudDsgXAorICAgICAgICAgICAgQ0hFQ0soZWludHJfd3JhcHBlcl9sb29wX2NvdW50IDwgTUFYX0VJTlRSX0xPT1BfQ09VTlQpIDw8IFwKKyAgICAgICAgICAgICAgICAiTG9vcGluZyBhcm91bmQgRUlOVFIgdG9vIG1hbnkgdGltZXMiOyBcCisgICAgICAgIH07IFwKKyAgICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQ7IFwKKyAgICB9KQorI2VuZGlmICAvLyAhX1dJTjMyICYmIEVJTlRSX1dSQVBQRVJfREVCVUcKKworLy8gSUdOT1JFX0VJTlRSKCkgaXMgYSBtYWNybyB1c2VkIHRvIHBlcmZvcm0gYSBzeXN0ZW0gY2FsbCBhbmQgaWdub3JlCisvLyBhbiBFSU5UUiByZXN1bHQsIGkuZS4gaXQgd2lsbCByZXR1cm4gMCBpbnN0ZWFkIG9mIC0xIGlmIHRoaXMgb2NjdXJzLgorLy8gVGhpcyBpcyBtb3N0bHkgdXNlZCB3aXRoIHRoZSBjbG9zZSgpIHN5c3RlbSBjYWxsLCBhcyBkZXNjcmliZWQKKy8vIGluIHRoZSBIQU5ETEVfRUlOVFIoKSBkb2N1bWVudGF0aW9uLgorI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIElHTk9SRV9FSU5UUih4KSAgKHgpCisjZWxzZQorIyAgZGVmaW5lIElHTk9SRV9FSU5UUih4KSBcCisgICAgX19leHRlbnNpb25fXyAoeyBcCisgICAgICAgIF9fdHlwZW9mX18oeCkgZWludHJfd3JhcHBlcl9yZXN1bHQgPSAoeCk7IFwKKyAgICAgICAgaWYgKGVpbnRyX3dyYXBwZXJfcmVzdWx0ID09IC0xICYmIGVycm5vID09IEVJTlRSKSBcCisgICAgICAgICAgICBlaW50cl93cmFwcGVyX3Jlc3VsdCA9IDA7IFwKKyAgICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQ7IFwKKyAgICB9KQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvRWludHJXcmFwcGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0VpbnRyV3JhcHBlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYwOTk5MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0VpbnRyV3JhcHBlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBGb3JjZXMgZGVidWcgbW9kZQorI2RlZmluZSBFSU5UUl9XUkFQUEVSX0RFQlVHIDEKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBhIGN1c3RvbSBwYW5pYyBmdW5jdGlvbiB1c2VkIHRvIGRldGVjdCB0aGF0CisvLyBIQU5ETEVfRUlOVFIoKSBjYWxsZWQgcGFuaWMgYWZ0ZXIgdG9vIG1hbnkgbG9vcCBpdGVyYXRpb25zLgorLy8gVXNlcyBzZXRqbXAoKS9sb25nam1wKCkgc2luY2UgdGhlIHBhbmljIGhhbmRsZXIgbXVzdCBiZQorLy8gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKS4KK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmJhc2U6OnRlc3Rpbmc7CisKK2NsYXNzIEVpbnRyV3JhcHBlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0LCBMb2dPdXRwdXQgeworcHVibGljOgorICAgIEVpbnRyV3JhcHBlclRlc3QoKSA6CisgICAgICAgICAgICBtRmF0YWwoZmFsc2UpLAorICAgICAgICAgICAgbUxvZ2dlZCh0cnVlKSwKKyAgICAgICAgICAgIG1QcmV2aW91cyhMb2dPdXRwdXQ6OnNldE5ld091dHB1dCh0aGlzKSkge30KKworICAgIH5FaW50cldyYXBwZXJUZXN0KCkgeworICAgICAgICBMb2dPdXRwdXQ6OnNldE5ld091dHB1dChtUHJldmlvdXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBsb2dNZXNzYWdlKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OkxvZ1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1lc3NhZ2VMZW4pIHsKKyAgICAgICAgbUZhdGFsID0gKHBhcmFtcy5zZXZlcml0eSA9PSBMT0dfRkFUQUwpOworICAgICAgICBtTG9nZ2VkID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1GYXRhbCkKKyAgICAgICAgICAgIGxvbmdqbXAobUp1bXBlciwgMSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBtRmF0YWw7CisgICAgYm9vbCBtTG9nZ2VkOworICAgIExvZ091dHB1dCogbVByZXZpb3VzOworICAgIGptcF9idWYgbUp1bXBlcjsKK307CisKKworLy8gTG9vcCBjb3VudGVyIHVzZWQgYnkgc2V2ZXJhbCBmdW5jdGlvbnMgYmVsb3cuCitzdGF0aWMgaW50IGdMb29wQ291bnQgPSAwOworCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLCBvciAtMS9FSU5WQUwKKy8vIG90aGVyd2lzZS4KK3N0YXRpYyBpbnQgcmV0dXJuRWludmFsQWZ0ZXJGaXJzdENhbGwodm9pZCkgeworICAgIGlmICgrK2dMb29wQ291bnQgPT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gLTE7Cit9CisKK1RFU1RfRihFaW50cldyYXBwZXJUZXN0LCBOb0xvb3BPblN1Y2Nlc3MpIHsKKyAgICBnTG9vcENvdW50ID0gMDsKKyAgICBFWFBFQ1RfRVEoMCwgSEFORExFX0VJTlRSKHJldHVybkVpbnZhbEFmdGVyRmlyc3RDYWxsKCkpKTsKKyAgICBFWFBFQ1RfRVEoMSwgZ0xvb3BDb3VudCk7Cit9CisKK1RFU1RfRihFaW50cldyYXBwZXJUZXN0LCBOb0xvb3BPblJlZ3VsYXJFcnJvcikgeworICAgIGdMb29wQ291bnQgPSAwOworICAgIEVYUEVDVF9FUSgwLCBIQU5ETEVfRUlOVFIocmV0dXJuRWludmFsQWZ0ZXJGaXJzdENhbGwoKSkpOworICAgIEVYUEVDVF9FUSgtMSwgSEFORExFX0VJTlRSKHJldHVybkVpbnZhbEFmdGVyRmlyc3RDYWxsKCkpKTsKKyAgICBFWFBFQ1RfRVEoRUlOVkFMLCBlcnJubyk7CisgICAgRVhQRUNUX0VRKDIsIGdMb29wQ291bnQpOworfQorCitzdGF0aWMgaW50IGFsd2F5c1JldHVybkVpbnRyKHZvaWQpIHsKKyAgICBnTG9vcENvdW50Kys7CisjaWZkZWYgX1dJTjMyCisgICAgLy8gV2luMzIgY2Fubm90IGdlbmVyYXRlIEVJTlRSLgorICAgIHJldHVybiAwOworI2Vsc2UKKyAgICBlcnJubyA9IEVJTlRSOworICAgIHJldHVybiAtMTsKKyNlbmRpZgorfQorCitURVNUX0YoRWludHJXcmFwcGVyVGVzdCwgSWdub3JlRWludHIpIHsKKyAgICBnTG9vcENvdW50ID0gMDsKKyAgICBFWFBFQ1RfRVEoMCwgSUdOT1JFX0VJTlRSKGFsd2F5c1JldHVybkVpbnRyKCkpKTsKKyAgICBFWFBFQ1RfRVEoMSwgZ0xvb3BDb3VudCk7Cit9CisKKyNpZm5kZWYgX1dJTjMyCisKKy8vIFRoaXMgZnVuY3Rpb24gbG9vcHMgMTAgdGltZXMgYXJvdW5kIHxnTG9vcENvdW50fCwgd2hpbGUgcmV0dXJuaW5nCisvLyAtMS9lcnJuby4KK3N0YXRpYyBpbnQgbG9vcEVpbnRyMTAodm9pZCkgeworICAgIGlmICgrK2dMb29wQ291bnQgPCAxMCkgeworICAgICAgICBlcnJubyA9IEVJTlRSOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitURVNUX0YoRWludHJXcmFwcGVyVGVzdCwgTG9vcE9uRWludHIpIHsKKyAgICBnTG9vcENvdW50ID0gMDsKKyAgICBFWFBFQ1RfRVEoMCwgSEFORExFX0VJTlRSKGxvb3BFaW50cjEwKCkpKTsKKyAgICBFWFBFQ1RfRVEoMTAsIGdMb29wQ291bnQpOworfQorCitzdGF0aWMgaW50IGxvb3BFaW50cjIwMCh2b2lkKSB7CisgICAgaWYgKCsrZ0xvb3BDb3VudCA8IDIwMCkgeworICAgICAgICBlcnJubyA9IEVJTlRSOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitURVNUX0YoRWludHJXcmFwcGVyVGVzdCwgUGFuaWNPblRvb01hbnlMb29wcykgeworICAgIGdMb29wQ291bnQgPSAwOworICAgIGlmIChzZXRqbXAobUp1bXBlcikgPT0gMCkgeworICAgICAgICBIQU5ETEVfRUlOVFIobG9vcEVpbnRyMjAwKCkpOworICAgICAgICBBU1NFUlRfVFJVRSgwKSA8PCAiSEFORExFX0VJTlRSKCkgZGlkbid0IHBhbmljISI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobUxvZ2dlZCk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1GYXRhbCk7CisgICAgICAgIEVYUEVDVF9FUShNQVhfRUlOVFJfTE9PUF9DT1VOVCwgZ0xvb3BDb3VudCk7CisgICAgfQorfQorCisjZW5kaWYgIC8vICFfV0lOMzIKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0VudW1GbGFncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzlhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgc29tZSB1dGl0aWx5IG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBzY29wZWQgZW51bXMgYXMgZmxhZ3MKKy8vIEMrKzExIHNjb3BlZCBlbnVtcyBieSBkZWZhdWx0IGRvbid0IHN1cHBvcnQgZmxhZyBvcGVyYXRpb25zIChlLmcuIGlmIChhICYgYikpCisvLyBXZSBuZWVkIHRvIGRlZmluZSBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yIHRoZW0gdG8gYmUgYWJsZSB0byBoYXZlIHN0cm9uZ2x5CisvLyB0eXBlZCBmbGFncyBpbiBvdXIgY29kZS4KKy8vCisvLyBUbyBlbmFibGUgdGhlIGZsYWcgb3BlcmF0b3JzIGZvciB5b3VyIGVudW0sIG1vc3QgcHJvYmFibHkgeW91IGp1c3QgbmVlZCB0bworLy8gaW5jbHVkZSB0aGlzIGZpbGUuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBpZiB5b3VyIGVudW0gaXMgbG9jYXRlZCBpbiBzb21lCisvLyBuYW1lc3BhY2Ugb3RoZXIgdGhhbiBhbmRyb2lkLCBhbmRyb2lkOjpiYXNlIG9yIGdsb2JhbC4gSW4gdGhhdCBjYXNlIHlvdSBhbHNvCisvLyBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIHVzaW5nIHRvIGJyaW5nIGluIHRoZSBvcGVyYXRvcnM6CisvLworLy8gdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YmFzZTo6RW51bUZsYWdzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CituYW1lc3BhY2UgRW51bUZsYWdzIHsKKworLy8gQSBwcmVkaWNhdGUgd2hpY2ggY2hlY2tzIGlmIHRlbXBsYXRlIGFndW1lbnQgaXMgYSBzY29wZWQgZW51bQordGVtcGxhdGU8Y2xhc3MgRT4KK3VzaW5nIGlzX3Njb3BlZF9lbnVtID0gc3RkOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgYm9vbCwKKyAgICAgICAgc3RkOjppc19lbnVtPEU+Ojp2YWx1ZSAmJiAhc3RkOjppc19jb252ZXJ0aWJsZTxFLCBpbnQ+Ojp2YWx1ZT47CisKK3RlbXBsYXRlIDxjbGFzcyBFPgordXNpbmcgdW5kZXJseWluZ19lbnVtX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIEUsIGNsYXNzIFJlcyA9IEU+Cit1c2luZyBlbmFibGVfaWZfc2NvcGVkX2VudW0gPQorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX3Njb3BlZF9lbnVtPEU+Ojp2YWx1ZSwgUmVzPjo6dHlwZTsKKwordGVtcGxhdGUgPGNsYXNzIEU+CitlbmFibGVfaWZfc2NvcGVkX2VudW08RT4gb3BlcmF0b3J8KEUgbCwgRSByKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KHN0YXRpY19jYXN0PHVuZGVybHlpbmdfZW51bV90eXBlPEU+PihsKQorICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0YXRpY19jYXN0PHVuZGVybHlpbmdfZW51bV90eXBlPEU+PihyKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorZW5hYmxlX2lmX3Njb3BlZF9lbnVtPEU+IG9wZXJhdG9yJihFIGwsIEUgcikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFPihzdGF0aWNfY2FzdDx1bmRlcmx5aW5nX2VudW1fdHlwZTxFPj4obCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiBzdGF0aWNfY2FzdDx1bmRlcmx5aW5nX2VudW1fdHlwZTxFPj4ocikpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRT4KK2VuYWJsZV9pZl9zY29wZWRfZW51bTxFPiBvcGVyYXRvcn4oRSBlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KH5zdGF0aWNfY2FzdDx1bmRlcmx5aW5nX2VudW1fdHlwZTxFPj4oZSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRT4KK2VuYWJsZV9pZl9zY29wZWRfZW51bTxFPiBvcGVyYXRvcnw9KEUmIGwsIEUgcikgeworICAgIHJldHVybiBsID0gKGwgfCByKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEU+CitlbmFibGVfaWZfc2NvcGVkX2VudW08RT4gb3BlcmF0b3ImPShFJiBsLCBFIHIpIHsKKyAgICByZXR1cm4gbCA9IChsICYgcik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorZW5hYmxlX2lmX3Njb3BlZF9lbnVtPEUsIGJvb2w+IG9wZXJhdG9yIShFIGUpIHsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PHVuZGVybHlpbmdfZW51bV90eXBlPEU+PihlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEU+CitlbmFibGVfaWZfc2NvcGVkX2VudW08RSwgYm9vbD4gb3BlcmF0b3IhPShFIGUsIGludCB2YWwpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5kZXJseWluZ19lbnVtX3R5cGU8RT4+KGUpICE9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bmRlcmx5aW5nX2VudW1fdHlwZTxFPj4odmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEU+CitlbmFibGVfaWZfc2NvcGVkX2VudW08RSwgYm9vbD4gb3BlcmF0b3IhPShpbnQgdmFsLCBFIGUpIHsKKyAgICByZXR1cm4gZSAhPSB2YWw7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorZW5hYmxlX2lmX3Njb3BlZF9lbnVtPEUsIGJvb2w+IG9wZXJhdG9yPT0oRSBlLCBpbnQgdmFsKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuZGVybHlpbmdfZW51bV90eXBlPEU+PihlKSA9PQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5kZXJseWluZ19lbnVtX3R5cGU8RT4+KHZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFPgorZW5hYmxlX2lmX3Njb3BlZF9lbnVtPEUsIGJvb2w+IG9wZXJhdG9yPT0oaW50IHZhbCwgRSBlKSB7CisgICAgcmV0dXJuIGUgPT0gdmFsOworfQorCit9ICAvLyBuYW1lc3BhY2UgRW51bUZsYWdzCisKKy8vIEZvciB0aGUgQURMIHRvIGtpY2sgaW4gbGV0J3MgbWFrZSBzdXJlIHdlIGJyaW5nIGFsbCB0aGUgb3BlcmF0b3JzIGludG8gb3VyCisvLyBtYWluIEFuZHJvaWRFbXUgbmFtZXNwYWNlcy4uLgordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YmFzZTo6RW51bUZsYWdzOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpiYXNlOjpFbnVtRmxhZ3M7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8vIC4uLiBhbmQgaW50byB0aGUgZ2xvYmFsIG9uZSwgd2hlcmUgbW9zdCBvZiB0aGUgY2xpZW50IGZ1bmN0aW9ucyBhcmUKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmJhc2U6OkVudW1GbGFnczsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0xvZy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Mb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzA0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Mb2cuY3BwCkBAIC0wLDAgKzEsMjg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIGN1cnJlbnQgbG9nIG91dHB1dC4KK3Rlc3Rpbmc6OkxvZ091dHB1dCogZ0xvZ091dHB1dCA9IE5VTEw7CisKK2Jvb2wgZ0RjaGVja0xldmVsID0gZmFsc2U7CitMb2dTZXZlcml0eSBnTWluTG9nTGV2ZWwgPSBMT0dfSU5GTzsKKworLy8gQ29udmVydCBhIHNldmVyaXR5IGxldmVsIGludG8gYSBzdHJpbmcuCitjb25zdCBjaGFyKiBzZXZlcml0eUxldmVsVG9TdHJpbmcoTG9nU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKyAgICBjb25zdCBjaGFyKiBrU2V2ZXJpdHlTdHJpbmdzW10gPSB7CisgICAgICAgICJJTkZPIiwgIldBUk5JTkciLCAiRVJST1IiLCAiRkFUQUwiLAorICAgIH07CisgICAgaWYgKHNldmVyaXR5ID49IDAgJiYgc2V2ZXJpdHkgPCBMT0dfTlVNX1NFVkVSSVRJRVMpCisgICAgICAgIHJldHVybiBrU2V2ZXJpdHlTdHJpbmdzW3NldmVyaXR5XTsKKyAgICBpZiAoc2V2ZXJpdHkgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuICJWRVJCT1NFIjsKKyAgICB9CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworLy8gRGVmYXVsdCBsb2cgb3V0cHV0IGZ1bmN0aW9uCit2b2lkIGRlZmF1bHRMb2dNZXNzYWdlKGNvbnN0IExvZ1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWVzc2FnZUxlbikgeworICAgIC8vIE9idGFpbmluZyBjdXJyZW50IHRocmVhZCdzIGlkIGlzIGV4cGVuc2l2ZS4gT25seSBkbyB0aGlzIGZvciB2ZXJib3NlCisgICAgLy8gbG9ncy4KKyAgICBzdGQ6OnN0cmluZyB0aWRTdHI7CisgICAgaWYgKHBhcmFtcy5zZXZlcml0eSA+PSBMT0dfVkVSQk9TRSkgeworICAgICAgICB0aWRTdHIgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXQoIlslbHVdOiIsIGdldEN1cnJlbnRUaHJlYWRJZCgpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICIlcyVzOiVzOiVkOiUuKnNcbiIsCisgICAgICAgICAgICB0aWRTdHIuY19zdHIoKSwKKyAgICAgICAgICAgIHNldmVyaXR5TGV2ZWxUb1N0cmluZyhwYXJhbXMuc2V2ZXJpdHkpLAorICAgICAgICAgICAgcGFyYW1zLmZpbGUsCisgICAgICAgICAgICBwYXJhbXMubGluZW5vLAorICAgICAgICAgICAgaW50KG1lc3NhZ2VMZW4pLAorICAgICAgICAgICAgbWVzc2FnZSk7CisgICAgLy8gTm90ZTogYnkgZGVmYXVsdCwgc3RkZXJyIGlzIG5vbiBidWZmZXJlZCwgYnV0IHRoZSBwcm9ncmFtIG1pZ2h0CisgICAgLy8gaGF2ZSBhbHRlcmVkIHRoaXMgc2V0dGluZywgc28gYWx3YXlzIGZsdXNoIGV4cGxpY2l0bHkgdG8gZW5zdXJlCisgICAgLy8gdGhhdCB0aGUgbG9nIGlzIGRpc3BsYXllZCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGlzIGF2b2lkcyBsb2cKKyAgICAvLyBtZXNzYWdlcyBiZWluZyBsb3N0IHdoZW4gYSBjcmFzaCBoYXBwZW5zLCBhbmQgbWFrZXMgZGVidWdnaW5nCisgICAgLy8gZWFzaWVyLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWVhbnMgbG90cyBvZiBsb2dnaW5nIHdpbGwgaW1wYWN0CisgICAgLy8gcGVyZm9ybWFuY2UuCisgICAgZmZsdXNoKHN0ZGVycik7CisKKyAgICBpZiAocGFyYW1zLnNldmVyaXR5ID49IExPR19GQVRBTCkKKyAgICAgICAgZXhpdCgxKTsKK30KKwordm9pZCBsb2dNZXNzYWdlKGNvbnN0IExvZ1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgc2l6ZV90IG1lc3NhZ2VMZW4pIHsKKyAgICBpZiAoZ0xvZ091dHB1dCkgeworICAgICAgICBnTG9nT3V0cHV0LT5sb2dNZXNzYWdlKHBhcmFtcywgbWVzc2FnZSwgbWVzc2FnZUxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVmYXVsdExvZ01lc3NhZ2UocGFyYW1zLCBtZXNzYWdlLCBtZXNzYWdlTGVuKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBEQ0hFQ0sgbGV2ZWwuCisKK2Jvb2wgZGNoZWNrSXNFbmFibGVkKCkgeworICAgIHJldHVybiBnRGNoZWNrTGV2ZWw7Cit9CisKK2Jvb2wgc2V0RGNoZWNrTGV2ZWwoYm9vbCBlbmFibGVkKSB7CisgICAgYm9vbCByZXQgPSBnRGNoZWNrTGV2ZWw7CisgICAgZ0RjaGVja0xldmVsID0gZW5hYmxlZDsKKyAgICByZXR1cm4gcmV0OworfQorCisvLyBMb2dTZXZlcml0eQorCitMb2dTZXZlcml0eSBnZXRNaW5Mb2dMZXZlbCgpIHsKKyAgICByZXR1cm4gZ01pbkxvZ0xldmVsOworfQorCit2b2lkIHNldE1pbkxvZ0xldmVsKExvZ1NldmVyaXR5IGxldmVsKSB7CisgICAgZ01pbkxvZ0xldmVsID0gbGV2ZWw7Cit9CisKKy8vIExvZ1N0cmluZworCitMb2dTdHJpbmc6OkxvZ1N0cmluZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgOiBtU3RyaW5nKE5VTEwpIHsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAxMDA7CisgICAgY2hhciogbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KDo6bWFsbG9jKGNhcGFjaXR5KSk7CisgICAgZm9yICg7OykgeworICAgICAgICB2YV9saXN0IGFyZ3M7CisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICAgIGludCByZXQgPSB2c25wcmludGYobWVzc2FnZSwgY2FwYWNpdHksIGZtdCwgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgICAgaWYgKHJldCA+PSAwICYmIHNpemVfdChyZXQpIDwgY2FwYWNpdHkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FwYWNpdHkgKj0gMjsKKyAgICB9CisgICAgbVN0cmluZyA9IG1lc3NhZ2U7Cit9CisKK0xvZ1N0cmluZzo6fkxvZ1N0cmluZygpIHsKKyAgICA6OmZyZWUobVN0cmluZyk7Cit9CisKKy8vIExvZ1N0cmVhbQorCitMb2dTdHJlYW06OkxvZ1N0cmVhbShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZW5vLCBMb2dTZXZlcml0eSBzZXZlcml0eSkgOgorICAgICAgICBtUGFyYW1zKGZpbGUsIGxpbmVubywgc2V2ZXJpdHkpLAorICAgICAgICBtU3RyaW5nKE5VTEwpLAorICAgICAgICBtU2l6ZSgwKSwKKyAgICAgICAgbUNhcGFjaXR5KDApIHt9CisKK0xvZ1N0cmVhbTo6fkxvZ1N0cmVhbSgpIHsKKyAgICBtU2l6ZSA9IDA7CisgICAgbUNhcGFjaXR5ID0gMDsKKyAgICA6OmZyZWUobVN0cmluZyk7Cit9CisKK0xvZ1N0cmVhbSYgTG9nU3RyZWFtOjpvcGVyYXRvcjw8KGNoYXIgY2gpIHsKKyAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPCAxMjcpIHsKKyAgICAgICAgYXBwZW5kKCZjaCwgMVUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgdGVtcFs1XTsKKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICJcXHglMDJ4IiwgY2gpOworICAgICAgICBhcHBlbmQodGVtcCwgNFUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0xvZ1N0cmVhbSYgTG9nU3RyZWFtOjpvcGVyYXRvcjw8KGNvbnN0IHZvaWQqIHB0cikgeworICAgIGNoYXIgdGVtcFsyMF07CisgICAgaW50IHJldCA9IHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiJXAiLCBwdHIpOworICAgIGFwcGVuZCh0ZW1wLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworTG9nU3RyZWFtJiBMb2dTdHJlYW06Om9wZXJhdG9yPDwoaW50IHYpIHsKKyAgICBjaGFyIHRlbXBbMjBdOworICAgIGludCByZXQgPSBzbnByaW50Zih0ZW1wLCBzaXplb2YgdGVtcCwgIiVkIiwgdik7CisgICAgYXBwZW5kKHRlbXAsIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitMb2dTdHJlYW0mIExvZ1N0cmVhbTo6b3BlcmF0b3I8PCh1bnNpZ25lZCB2KSB7CisgICAgY2hhciB0ZW1wWzIwXTsKKyAgICBpbnQgcmV0ID0gc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIldSIsIHYpOworICAgIGFwcGVuZCh0ZW1wLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworTG9nU3RyZWFtJiBMb2dTdHJlYW06Om9wZXJhdG9yPDwobG9uZyB2KSB7CisgICAgY2hhciB0ZW1wWzIwXTsKKyAgICBpbnQgcmV0ID0gc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIlbGQiLCB2KTsKKyAgICBhcHBlbmQodGVtcCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0xvZ1N0cmVhbSYgTG9nU3RyZWFtOjpvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgdikgeworICAgIGNoYXIgdGVtcFsyMF07CisgICAgaW50IHJldCA9IHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiJWx1Iiwgdik7CisgICAgYXBwZW5kKHRlbXAsIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCitMb2dTdHJlYW0mIExvZ1N0cmVhbTo6b3BlcmF0b3I8PChsb25nIGxvbmcgdikgeworICAgIGNoYXIgdGVtcFsyMF07CisgICAgaW50IHJldCA9IHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiJWxsZCIsIHYpOworICAgIGFwcGVuZCh0ZW1wLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworTG9nU3RyZWFtJiBMb2dTdHJlYW06Om9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIHYpIHsKKyAgICBjaGFyIHRlbXBbMjBdOworICAgIGludCByZXQgPSBzbnByaW50Zih0ZW1wLCBzaXplb2YgdGVtcCwgIiVsbHUiLCB2KTsKKyAgICBhcHBlbmQodGVtcCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0xvZ1N0cmVhbSYgTG9nU3RyZWFtOjpvcGVyYXRvcjw8KGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgdikgeworICAgIGlmICghdi5lbXB0eSgpKSB7CisgICAgICAgIGFwcGVuZCh2LmNfc3RyKCksIHYuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIExvZ1N0cmVhbTo6YXBwZW5kKGNvbnN0IGNoYXIqIHN0cikgeworICAgIGlmIChzdHIgJiYgc3RyWzBdKQorICAgICAgICBhcHBlbmQoc3RyLCBzdHJsZW4oc3RyKSk7Cit9CisKK3ZvaWQgTG9nU3RyZWFtOjphcHBlbmQoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuKSB7CisgICAgaWYgKCFsZW4gfHwgbGVuID4gSU5UMzJfTUFYKQorICAgICAgICByZXR1cm47CisKKyAgICBzaXplX3QgbmV3U2l6ZSA9IG1TaXplICsgbGVuOworICAgIGlmIChuZXdTaXplID4gbUNhcGFjaXR5KSB7CisgICAgICAgIHNpemVfdCBuZXdDYXBhY2l0eSA9IG1DYXBhY2l0eTsKKyAgICAgICAgd2hpbGUgKG5ld0NhcGFjaXR5IDwgbmV3U2l6ZSkKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ICs9IChuZXdDYXBhY2l0eSA+PiAyKSArIDMyOworICAgICAgICBtU3RyaW5nID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICAgICAgICAgICAgOjpyZWFsbG9jKG1TdHJpbmcsIG5ld0NhcGFjaXR5ICsgMSkpOworICAgICAgICBtQ2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICB9CisgICAgOjptZW1jcHkobVN0cmluZyArIG1TaXplLCBzdHIsIGxlbik7CisgICAgbVNpemUgKz0gbGVuOworICAgIG1TdHJpbmdbbVNpemVdID0gJ1wwJzsKK30KKworLy8gTG9nTWVzc2FnZQorCitMb2dNZXNzYWdlOjpMb2dNZXNzYWdlKGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLCBMb2dTZXZlcml0eSBzZXZlcml0eSkgOgorICAgICAgICBtU3RyZWFtKG5ldyBMb2dTdHJlYW0oZmlsZSwgbGluZSwgc2V2ZXJpdHkpKSB7fQorCitMb2dNZXNzYWdlOjp+TG9nTWVzc2FnZSgpIHsKKyAgICBsb2dNZXNzYWdlKG1TdHJlYW0tPnBhcmFtcygpLAorICAgICAgICAgICAgICAgbVN0cmVhbS0+c3RyaW5nKCksCisgICAgICAgICAgICAgICBtU3RyZWFtLT5zaXplKCkpOworICAgIGRlbGV0ZSBtU3RyZWFtOworfQorCisvLyBFcnJub0xvZ01lc3NhZ2UKKworRXJybm9Mb2dNZXNzYWdlOjpFcnJub0xvZ01lc3NhZ2UoY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nU2V2ZXJpdHkgc2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJybm9Db2RlKSA6CisgICAgICAgIG1TdHJlYW0oTlVMTCksIG1FcnJubyhlcnJub0NvZGUpIHsKKyAgICBtU3RyZWFtID0gbmV3IExvZ1N0cmVhbShmaWxlLCBsaW5lLCBzZXZlcml0eSk7Cit9CisKK0Vycm5vTG9nTWVzc2FnZTo6fkVycm5vTG9nTWVzc2FnZSgpIHsKKyAgICAoKm1TdHJlYW0pIDw8ICJFcnJvciBtZXNzYWdlOiAiIDw8IHN0cmVycm9yKG1FcnJubyk7CisgICAgbG9nTWVzc2FnZShtU3RyZWFtLT5wYXJhbXMoKSwKKyAgICAgICAgICAgICAgIG1TdHJlYW0tPnN0cmluZygpLAorICAgICAgICAgICAgICAgbVN0cmVhbS0+c2l6ZSgpKTsKKyAgICBkZWxldGUgbVN0cmVhbTsKKyAgICAvLyBSZXN0b3JlIHRoZSBlcnJuby4KKyAgICBlcnJubyA9IG1FcnJubzsKK30KKworLy8gTG9nT3V0cHV0CisKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworLy8gc3RhdGljCitMb2dPdXRwdXQqIExvZ091dHB1dDo6c2V0TmV3T3V0cHV0KExvZ091dHB1dCogbmV3T3V0cHV0KSB7CisgICAgTG9nT3V0cHV0KiByZXQgPSBnTG9nT3V0cHV0OworICAgIGdMb2dPdXRwdXQgPSBuZXdPdXRwdXQ7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworfSAgLy8gbmFlbXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Mb2cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL0xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OGE2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Mb2cuaApAQCAtMCwwICsxLDQxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworZW51bSBMb2dTZXZlcml0eSB7CisgICAgTE9HX1ZFUkJPU0UgPSAtMSwKKyAgICBMT0dfSU5GTyA9IDAsCisgICAgTE9HX1dBUk5JTkcgPSAxLAorICAgIExPR19FUlJPUiA9IDIsCisgICAgTE9HX0ZBVEFMID0gMywKKyAgICBMT0dfTlVNX1NFVkVSSVRJRVMsCisKKy8vIERGQVRBTCB3aWxsIGJlIEVSUk9SIGluIHJlbGVhc2UgYnVpbGRzLCBhbmQgRkFUQUwgaW4gZGVidWcgb25lcy4KKyNpZmRlZiBOREVCVUcKKyAgICBMT0dfREZBVEFMID0gTE9HX0VSUk9SLAorI2Vsc2UKKyAgICBMT0dfREZBVEFMID0gTE9HX0ZBVEFMLAorI2VuZGlmCit9OworCisvLyBSZXR1cm5zIHRoZSBtaW5pbWFsIGxvZyBsZXZlbC4KK0xvZ1NldmVyaXR5IGdldE1pbkxvZ0xldmVsKCk7Cit2b2lkIHNldE1pbkxvZ0xldmVsKExvZ1NldmVyaXR5IGxldmVsKTsKKworLy8gQ29udmVydCBhIGxvZyBsZXZlbCBuYW1lIChlLmcuICdJTkZPJykgaW50byB0aGUgZXF1aXZhbGVudAorLy8gOjphbmRyb2lkOjpiYXNlIExPR188bmFtZT4gY29uc3RhbnQuCisjZGVmaW5lIExPR19TRVZFUklUWV9GUk9NKHgpICA6OmFuZHJvaWQ6OmJhc2U6OkxPR18gIyMgeAorCisvLyBIZWxwZXIgbWFjcm8gdXNlZCB0byB0ZXN0IGlmIGxvZ2dpbmcgZm9yIGEgZ2l2ZW4gbG9nIGxldmVsIGlzCisvLyBjdXJyZW50bHkgZW5hYmxlZC4gfHNldmVyaXR5fCBtdXN0IGJlIGEgbG9nIGxldmVsIHdpdGhvdXQgdGhlIExPR18KKy8vIHByZWZpeCwgYXMgaW46CisvLworLy8gIGlmIChMT0dfSVNfT04oSU5GTykpIHsKKy8vICAgICAgLi4uIGRvIGFkZGl0aW9ubmFsIGxvZ2dpbmcKKy8vICB9CisvLworI2RlZmluZSBMT0dfSVNfT04oc2V2ZXJpdHkpIFwKKyAgICAgICAgKExPR19TRVZFUklUWV9GUk9NKHNldmVyaXR5KSA+PSAgOjphbmRyb2lkOjpiYXNlOjpnZXRNaW5Mb2dMZXZlbCgpKQorCisvLyBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQncyBpbXBvcnRhbnQgdG8gYXZvaWQgY29uc3RydWN0aW5nIGEKKy8vIExvZ01lc3NhZ2UgaW5zdGFuY2UgZXZlcnkgdGltZSBhIExPRygpIG9yIENIRUNLKCkgc3RhdGVtZW50IGlzCisvLyBlbmNvdW50ZXJlZCBhdCBydW50aW1lLCBpLmUuIHRoZXNlIG9iamVjdHMgc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0ZWQKKy8vIHdoZW4gYWJzb2x1dGVseSBuZWNlc3NhcnksIHdoaWNoIG1lYW5zOgorLy8gIC0gRm9yIExPRygpIHN0YXRlbWVudHMsIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbG9nIGxldmVsIGlzIGVuYWJsZWQuCisvLyAgLSBGb3IgQ0hFQ0soKSwgd2hlbiB0aGUgdGVzdGVkIGV4cHJlc3Npb24gZG9lc24ndCBob2xkLgorLy8KKy8vIEF0IHRoZSBzYW1lIHRpbWUsIHdlIHJlYWxseSB3YW50IHRvIHVzZSBleHByZXNzaW9ucyBsaWtlOgorLy8gICAgTE9HKHNldmVyaXR5KSA8PCBzb21lX3N0dWZmIDw8IHNvbWVfbW9yZV9zdHVmZjsKKy8vCisvLyBUaGlzIG1lYW5zIExPRyhzZXZlcml0eSkgc2hvdWxkIGV4cGFuZCB0byBzb21ldGhpbmcgdGhhdCBjYW4gdGFrZQorLy8gPDwgb3BlcmF0b3JzIG9uIGl0cyByaWdodCBoYW5kIHNpZGUuIFRoaXMgaXMgYWNoaWV2ZWQgd2l0aCB0aGUKKy8vIHRlcm5hcnkgJz8gOicsIGFzIGltcGxlbWVudGVkIGJ5IHRoaXMgaGVscGVyIG1hY3JvLgorLy8KKy8vIFVuZm9ydHVuYXRlbHksIGEgc2ltcGxlIHRoaW5nIGxpa2U6CisvLworLy8gICAhKGNvbmRpdGlvbikgPyAodm9pZCkwIDogKGV4cHIpCisvLworLy8gd2lsbCBub3Qgd29yaywgYmVjYXVzZSB0aGUgY29tcGlsZXIgY29tcGxhaW5zIGxvdWRseSB3aXRoOgorLy8KKy8vICAgZXJyb3I6IHNlY29uZCBvcGVyYW5kIHRvIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvciBpcyBvZiB0eXBlICd2b2lkJywKKy8vICAgYnV0IHRoZSB0aGlyZCBvcGVyYW5kIGlzIG5laXRoZXIgYSB0aHJvdy1leHByZXNzaW9uIG5vciBvZiB0eXBlICd2b2lkJworI2RlZmluZSBMT0dfTEFaWV9FVkFMKGNvbmRpdGlvbiwgZXhwcikgXAorICAhKGNvbmRpdGlvbikgPyAodm9pZCkwIDogOjphbmRyb2lkOjpiYXNlOjpMb2dTdHJlYW1Wb2lkaWZ5KCkgJiAoZXhwcikKKworLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIGxvZyBpZiB8c2V2ZXJpdHl8IGlzIGhpZ2hlciBvciBlcXVhbCB0byB0aGUgY3VycmVudAorLy8gbG9nZ2luZyBzZXZlcml0eSBsZXZlbC4gVGhpcyBtYWNybyBleHBhbmRzIHRvIGFuIGV4cHJlc3Npb24gdGhhdCBhY3RzIGFzCisvLyBhbiBpbnB1dCBzdHJlYW0gZm9yIHN0cmluZ3MsIGludHMgYW5kIGZsb2F0aW5nIHBvaW50IHZhbHVlcywgYXMgd2VsbCBhcworLy8gTG9nU3RyaW5nIGluc3RhbmNlcy4gVXNhZ2UgZXhhbXBsZToKKy8vCisvLyAgICBMT0coSU5GTykgPDwgIlN0YXJ0aW5nIGZsdXggY2FwYWNpdG9yIjsKKy8vICAgIGZsdXhDYXBhY2l0b3I6OnN0YXJ0KCk7CisvLyAgICBMT0coSU5GTykgPDwgIkZsdXggY2FwYWNpdG9yIHN0YXJ0ZWQiOworLy8KKy8vIE5vdGUgdGhhdCB0aGUgbWFjcm8gaW1wbGVtZW50YXRpb24gaXMgb3B0aW1pemVkIHRvIGF2b2lkIGRvaW5nIGFueSB3b3JrCisvLyBpZiB0aGUgc2V2ZXJpdHkgbGV2ZWwgaXMgZGlzYWJsZWQuCisvLworLy8gSXQncyBwb3NzaWJsZSB0byBkbyBjb25kaXRpb25hbCBsb2dnaW5nIHdpdGggTE9HX0lGKCkKKyNkZWZpbmUgTE9HKHNldmVyaXR5KSAgXAorICAgICAgICBMT0dfTEFaWV9FVkFMKExPR19JU19PTihzZXZlcml0eSksIFwKKyAgICAgICAgTE9HX01FU1NBR0VfU1RSRUFNX0NPTVBBQ1Qoc2V2ZXJpdHkpKQorCisvLyBBIHZhcmlhbnQgb2YgTE9HKCkgdGhhdCBvbmx5IHBlcmZvcm1zIGxvZ2dpbmcgaWYgYSBzcGVjaWZpYyBjb25kaXRpb24KKy8vIGlzIGVuY291bnRlcmVkLiBOb3RlIHRoYXQgfGNvbmRpdGlvbnwgaXMgb25seSBldmFsdWF0ZWQgaWYgfHNldmVyaXR5fAorLy8gaXMgaGlnaCBlbm91Z2guIFVzYWdlIGV4YW1wbGU6CisvLworLy8gICAgTE9HKElORk8pIDw8ICJTdGFydGluZyBmdWVsIGluamVjdG9yIjsKKy8vICAgIGZ1ZWxJbmplY3Rvcjo6c3RhcnQoKTsKKy8vICAgIExPRyhJTkZPKSA8PCAiRnVlbCBpbmplY3Rpb24gc3RhcnRlZCI7CisvLyAgICBMT0dfSUYoSU5GTywgZnVlbEluamVjdG9yOjpoYXNPcHRpbWFsTGV2ZWwoKSkKKy8vICAgICAgICAgICAgPDwgIkZ1ZWwgaW5qZWN0aW9uIGF0IG9wdGltYWwgbGV2ZWwiOworLy8KKyNkZWZpbmUgTE9HX0lGKHNldmVyaXR5LCBjb25kaXRpb24pIFwKKyAgICAgICAgTE9HX0xBWllfRVZBTChMT0dfSVNfT04oc2V2ZXJpdHkpICYmIChjb25kaXRpb24pLCBcCisgICAgICAgICAgICAgICAgICAgICAgTE9HX01FU1NBR0VfU1RSRUFNX0NPTVBBQ1Qoc2V2ZXJpdHkpKQorCisKKy8vIEEgdmFyaWFudCBvZiBMT0coKSB0aGF0IGFsc28gYXBwZW5kcyB0aGUgc3RyaW5nIG1lc3NhZ2UgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgJ2Vycm5vJyBqdXN0IGJlZm9yZSB0aGUgbWFjcm8gaXMgY2FsbGVkLiBUaGlzCisvLyBhbHNvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgJ2Vycm5vJyBzbyBpdCBjYW4gYmUgdGVzdGVkIGFmdGVyIHRoZQorLy8gbWFjcm8gY2FsbCAoaS5lLiBhbnkgZXJyb3IgZHVyaW5nIGxvZyBvdXRwdXQgZG9lcyBub3QgaW50ZXJmZXJlKS4KKyNkZWZpbmUgUExPRyhzZXZlcml0eSkgIFwKKyAgICAgICAgTE9HX0xBWllfRVZBTChMT0dfSVNfT04oc2V2ZXJpdHkpLCBcCisgICAgICAgIFBMT0dfTUVTU0FHRV9TVFJFQU1fQ09NUEFDVChzZXZlcml0eSkpCisKKy8vIEEgdmFyaWFudCBvZiBMT0dfSUYoKSB0aGF0IGFsc28gYXBwZW5kcyB0aGUgc3RyaW5nIG1lc3NhZ2UgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgJ2Vycm5vJyBqdXN0IGJlZm9yZSB0aGUgbWFjcm8gaXMgY2FsbGVkLiBUaGlzCisvLyBhbHNvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgJ2Vycm5vJyBzbyBpdCBjYW4gYmUgdGVzdGVkIGFmdGVyIHRoZQorLy8gbWFjcm8gY2FsbCAoaS5lLiBhbnkgZXJyb3IgZHVyaW5nIGxvZyBvdXRwdXQgZG9lcyBub3QgaW50ZXJmZXJlKS4KKyNkZWZpbmUgUExPR19JRihzZXZlcml0eSwgY29uZGl0aW9uKSBcCisgICAgICAgIExPR19MQVpZX0VWQUwoTE9HX0lTX09OKHNldmVyaXR5KSAmJiAoY29uZGl0aW9uKSwgXAorICAgICAgICAgICAgICAgICAgICAgIFBMT0dfTUVTU0FHRV9TVFJFQU1fQ09NUEFDVChzZXZlcml0eSkpCisKKy8vIEV2YWx1YXRlIHxjb25kaXRpb258LCBhbmQgaWYgaXQgZmFpbHMsIGxvZyBhIGZhdGFsIG1lc3NhZ2UuCisvLyBUaGlzIGlzIGEgYmV0dGVyIHZlcnNpb24gb2YgYXNzZXJ0KCksIGluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbAorLy8gYWxzbyBicmVhayBkaXJlY3RseSBpbnRvIHRoZSBkZWJ1Z2dlciBmb3IgZGVidWcgYnVpbGRzLgorLy8KKy8vIFVzYWdlIGlzIHNpbWlsYXIgdG8gTE9HKEZBVEFMKSwgZS5nLjoKKy8vCisvLyAgIENIRUNLKHNvbWVfY29uZGl0aW9uKSA8PCAiU29tZXRoaW5nIHJlYWxseSBiYWQgaGFwcGVuZWQhIjsKKy8vCisjZGVmaW5lIENIRUNLKGNvbmRpdGlvbikgXAorICAgIExPR19JRihGQVRBTCwgIShjb25kaXRpb24pKSA8PCAiQ2hlY2sgZmFpbGVkOiAiICNjb25kaXRpb24gIi4gIgorCisKKy8vIEEgdmFyaWFudCBvZiBDSEVDSygpIHRoYXQgYWxzbyBhcHBlbmRzIHRoZSBlcnJubyBtZXNzYWdlIHN0cmluZyBhdAorLy8gdGhlIGVuZCBvZiB0aGUgbG9nIG1lc3NhZ2UgYmVmb3JlIGV4aXRpbmcgdGhlIHByb2Nlc3MuCisjZGVmaW5lIFBDSEVDSyhjb25kaXRpb24pIFwKKyAgICBQTE9HX0lGKEZBVEFMLCAhKGNvbmRpdGlvbikpIDw8ICJDaGVjayBmYWlsZWQ6ICIgI2NvbmRpdGlvbiAiLiAiCisKKworLy8gRGVmaW5lIEVOQUJMRV9ETE9HIHRvIDEgaGVyZSBpZiBETE9HKCkgc3RhdGVtZW50cyBzaG91bGQgYmUgY29tcGlsZWQKKy8vIGFzIG5vcm1hbCBMT0coKSBvbmVzIGluIHRoZSBmaW5hbCBiaW5hcnkuIElmIDAsIHRoZSBzdGF0ZW1lbnRzIHdpbGwgbm90CisvLyBiZSBjb21waWxlZC4KKyNpZm5kZWYgRU5BQkxFX0RMT0cKKyMgIGlmIGRlZmluZWQoTkRFQlVHKQorIyAgICBkZWZpbmUgRU5BQkxFX0RMT0cgMAorIyAgZWxzZQorIyAgICBkZWZpbmUgRU5BQkxFX0RMT0cgMQorIyAgZW5kaWYKKyNlbmRpZgorCisvLyBFTkFCTEVfRENIRUNLIGNvbnRyb2xzIGhvdyBEQ0hFQ0soKSBzdGF0ZW1lbnRzIGFyZSBjb21waWxlZDoKKy8vICAgIDAgLSBEQ0hFQ0soKSBhcmUgbm90IGNvbXBpbGVkIGluIHRoZSBiaW5hcnkgYXQgYWxsLgorLy8gICAgMSAtIERDSEVDSygpIGFyZSBjb21waWxlZCwgYnV0IGFyZSBub3QgcGVyZm9ybWVkIGF0IHJ1bnRpbWUsIHVubGVzcworLy8gICAgICAgIHRoZSBEQ0hFQ0sgbGV2ZWwgaGFzIGJlZW4gaW5jcmVhc2VkIGV4cGxpY2l0ZWx5LgorLy8gICAgMiAtIERDSEVDSygpIGFyZSBhbHdheXMgY29tcGlsZWQgYXMgQ0hFQ0soKSBpbiB0aGUgZmluYWwgYmluYXJ5LgorI2lmbmRlZiBFTkFCTEVfRENIRUNLCisjICBpZiBkZWZpbmVkKE5ERUJVRykKKyMgICAgZGVmaW5lIEVOQUJMRV9EQ0hFQ0sgMQorIyAgZWxzZQorIyAgICBkZWZpbmUgRU5BQkxFX0RDSEVDSyAyCisjICBlbmRpZgorI2VuZGlmCisKKy8vIERMT0dfSVNfT04oc2V2ZXJpdHkpIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciBETE9HKCkgc2hvdWxkIHByaW50CisvLyBzb21ldGhpbmcgZm9yIHRoZSBjdXJyZW50IGxldmVsLgorI2lmIEVOQUJMRV9ETE9HCisjICBkZWZpbmUgRExPR19JU19PTihzZXZlcml0eSkgTE9HX0lTX09OKHNldmVyaXR5KQorI2Vsc2UKKy8vIE5PVEU6IFRoZSBjb21waWxlLXRpbWUgY29uc3RhbnQgZW5zdXJlcyB0aGF0IHRoZSBETE9HKCkgc3RhdGVtZW50cyBhcmUKKy8vICAgICAgIG5vdCBjb21waWxlZCBpbiB0aGUgZmluYWwgYmluYXJ5LgorIyAgZGVmaW5lIERMT0dfSVNfT04oc2V2ZXJpdHkpIGZhbHNlCisjZW5kaWYKKworLy8gRENIRUNLX0lTX09OKCkgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIERDSEVDSygpIHNob3VsZCBkbyBhbnl0aGluZy4KKyNpZiBFTkFCTEVfRENIRUNLID09IDAKKyAgICAvLyBOT1RFOiBDb21waWxlLXRpbWUgY29uc3RhbnQgZW5zdXJlcyB0aGUgRENIRUNLKCkgc3RhdGVtZW50cyBhcmUKKyAgICAvLyBub3QgY29tcGlsZWQgaW4gdGhlIGZpbmFsIGJpbmFyeS4KKyMgIGRlZmluZSBEQ0hFQ0tfSVNfT04oKSAgZmFsc2UKKyNlbGlmIEVOQUJMRV9EQ0hFQ0sgPT0gMQorIyAgZGVmaW5lIERDSEVDS19JU19PTigpICA6OmFuZHJvaWQ6OmJhc2U6OmRjaGVja0lzRW5hYmxlZCgpCisjZWxzZQorIyAgZGVmaW5lIERDSEVDS19JU19PTigpICB0cnVlCisjZW5kaWYKKworLy8gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZmYgRENIRUNLKCkgc2hvdWxkIGFjdHVhbGx5IGRvIGFueSBjaGVja2luZy4KK2Jvb2wgZGNoZWNrSXNFbmFibGVkKCk7CisKKy8vIENoYW5nZSB0aGUgRENIRUNLKCkgbGV2ZWwgdG8gZWl0aGVyIGZhbHNlIG9yIHRydWUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZAorLy8gZWFybHksIGUuZy4gYWZ0ZXIgcGFyc2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiBSZXR1cm5zIHByZXZpb3VzIHZhbHVlLgorYm9vbCBzZXREY2hlY2tMZXZlbChib29sIGVuYWJsZWQpOworCisvLyBETE9HKCkgaXMgbGlrZSBMT0coKSBmb3IgZGVidWcgYnVpbGRzLCBhbmQgZG9lc24ndCBkbyBhbnl0aGluZyBmb3IKKy8vIHJlbGVhc2Ugb25lLiBUaGlzIGlzIHVzZWZ1bCB0byBhZGQgbG9nIG1lc3NhZ2VzIHRoYXQgeW91IGRvbid0IHdhbnQKKy8vIHRvIHNlZSBpbiB0aGUgZmluYWwgYmluYXJpZXMsIGJ1dCBhcmUgdXNlZnVsIGR1cmluZyB0ZXN0aW5nLgorI2RlZmluZSBETE9HKHNldmVyaXR5KSAgRExPR19JRihzZXZlcml0eSwgdHJ1ZSkKKworLy8gRExPR19JRigpIGlzIGxpa2UgRExPRygpIGZvciBkZWJ1ZyBidWlsZHMsIGFuZCBkb2Vzbid0IGRvIGFueXRoaW5nIGZvcgorLy8gcmVsZWFzZSBvbmUuIFNlZSBETE9HKCkgY29tbWVudHMuCisjZGVmaW5lIERMT0dfSUYoc2V2ZXJpdHksIGNvbmRpdGlvbikgIFwKKyAgICAgICAgTE9HX0xBWllfRVZBTChETE9HX0lTX09OKHNldmVyaXR5KSAmJiAoY29uZGl0aW9uKSwgXAorICAgICAgICAgICAgICAgICAgICAgIExPR19NRVNTQUdFX1NUUkVBTV9DT01QQUNUKHNldmVyaXR5KSkKKworLy8gRENIRUNLKGNvbmRpdGlvbikgaXMgdXNlZCB0byBwZXJmb3JtIENIRUNLKCkgaW4gZGVidWcgYnVpbGRzLCBvciBpZgorLy8gdGhlIHByb2dyYW0gY2FsbGVkIHNldERjaGVja0xldmVsKHRydWUpIHByZXZpb3VzbHkuIE5vdGUgdGhhdCBpdCBpcworLy8gYWxzbyBwb3NzaWJsZSB0byBjb21wbGV0ZWx5IHJlbW92ZSB0aGVtIGZyb20gdGhlIGZpbmFsIGJpbmFyeSBieQorLy8gdXNpbmcgdGhlIGNvbXBpbGVyIGZsYWcgLURFTkFCTEVfRENIRUNLPTAKKyNkZWZpbmUgRENIRUNLKGNvbmRpdGlvbikgXAorICAgICAgICBMT0dfSUYoRkFUQUwsIERDSEVDS19JU19PTigpICYmICEoY29uZGl0aW9uKSkgXAorICAgICAgICAgICAgPDwgIkNoZWNrIGZhaWxlZDogIiAjY29uZGl0aW9uICIuICIKKworLy8gRFBMT0coKSBpcyBsaWtlIERMT0coKSB0aGF0IGFsc28gYXBwZW5kcyB0aGUgc3RyaW5nIG1lc3NhZ2UgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgJ2Vycm5vJyBqdXN0IGJlZm9yZSB0aGUgbWFjcm8gaXMgY2FsbGVkLiBUaGlzCisvLyBhbHNvIHByZXNlcnZlcyB0aGUgdmFsdWUgb2YgJ2Vycm5vJyBzbyBpdCBjYW4gYmUgdGVzdGVkIGFmdGVyIHRoZQorLy8gbWFjcm8gY2FsbCAoaS5lLiBhbnkgZXJyb3IgZHVyaW5nIGxvZyBvdXRwdXQgZG9lcyBub3QgaW50ZXJmZXJlKS4KKyNkZWZpbmUgRFBMT0coc2V2ZXJpdHkpICBEUExPR19JRihzZXZlcml0eSwgdHJ1ZSkKKworLy8gRFBMT0dfSUYoKSB0ZXN0cyB3aGV0aGVyIHxjb25kaXRpb258IGlzIHRydWUgYmVmb3JlIGNhbGxpbmcKKy8vIERQTE9HKHNldmVyaXR5KQorI2RlZmluZSBEUExPR19JRihzZXZlcml0eSwgY29uZGl0aW9uKSAgXAorICAgICAgICBMT0dfTEFaWV9FVkFMKERMT0dfSVNfT04oc2V2ZXJpdHkpICYmIChjb25kaXRpb24pLCBcCisgICAgICAgICAgICAgICAgICAgICAgUExPR19NRVNTQUdFX1NUUkVBTV9DT01QQUNUKHNldmVyaXR5KSkKKworLy8gQ29udmVuaWVuY2UgY2xhc3MgdXNlZCBob2xkIGEgZm9ybWF0dGVkIHN0cmluZyBmb3IgbG9nZ2luZyByZWFzb25zLgorLy8gVXNhZ2UgZXhhbXBsZToKKy8vCisvLyAgICBMT0coSU5GTykgPDwgTG9nU3RyaW5nKCJUaGVyZSBhcmUgJWQgaXRlbXMgaW4gdGhpcyBzZXQiLCBjb3VudCk7CisvLworY2xhc3MgTG9nU3RyaW5nIHsKK3B1YmxpYzoKKyAgICBMb2dTdHJpbmcoY29uc3QgY2hhciogZm10LCAuLi4pOworICAgIH5Mb2dTdHJpbmcoKTsKKyAgICBjb25zdCBjaGFyKiBzdHJpbmcoKSBjb25zdCB7IHJldHVybiBtU3RyaW5nOyB9Citwcml2YXRlOgorICAgIGNoYXIqIG1TdHJpbmc7Cit9OworCisvLyBIZWxwZXIgc3RydWN0dXJlIHVzZWQgdG8gZ3JvdXAgdGhlIHBhcmFtZXRlcnMgb2YgYSBMT0coKSBvciBDSEVDSygpCisvLyBzdGF0ZW1lbnQuCitzdHJ1Y3QgTG9nUGFyYW1zIHsKKyAgICBMb2dQYXJhbXMoKSA6CisgICAgICAgICAgICBmaWxlKE5VTEwpLCBsaW5lbm8oLTEpLCBzZXZlcml0eShMT0dfVkVSQk9TRSkge30KKworICAgIExvZ1BhcmFtcyhjb25zdCBjaGFyKiBhX2ZpbGUsIGludCBhX2xpbmVubywgTG9nU2V2ZXJpdHkgYV9zZXZlcml0eSkKKyAgICAgICAgICAgIDogZmlsZShhX2ZpbGUpLCBsaW5lbm8oYV9saW5lbm8pLCBzZXZlcml0eShhX3NldmVyaXR5KSB7fQorCisgICAgY29uc3QgY2hhciogZmlsZTsKKyAgICBpbnQgbGluZW5vOworICAgIExvZ1NldmVyaXR5IHNldmVyaXR5OworfTsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IGFuIGlucHV0IHN0cmVhbSBzaW1pbGFyIHRvIHN0ZDo6aXN0cmVhbQorLy8gd2hlcmUgaXQncyBwb3NzaWJsZSB0byBpbmplY3Qgc3RyaW5ncywgaW50ZWdlcnMsIGZsb2F0cyBhbmQgTG9nU3RyaW5nCisvLyBpbnN0YW5jZXMgd2l0aCB0aGUgPDwgb3BlcmF0b3IuCisvLworLy8gVGhpcyBhbHNvIHRha2VzIGEgc291cmNlIGZpbGUsIGxpbmUgbnVtYmVyIGFuZCBzZXZlcml0eSB0byBhdm9pZAorLy8gc3RvcmluZyB0aGVzZSBpbiB0aGUgc3RhY2sgb2YgdGhlIGZ1bmN0aW9ucyB3ZXJlIExPRygpIGFuZCBDSEVDSygpCisvLyBzdGF0ZW1lbnRzIGFyZSBjYWxsZWQuCitjbGFzcyBMb2dTdHJlYW0geworcHVibGljOgorICAgIExvZ1N0cmVhbShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZW5vLCBMb2dTZXZlcml0eSBzZXZlcml0eSk7CisgICAgfkxvZ1N0cmVhbSgpOworCisgICAgaW5saW5lIExvZ1N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBjaGFyKiBzdHIpIHsKKyAgICAgICAgYXBwZW5kKHN0cik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBpbmxpbmUgTG9nU3RyZWFtJiBvcGVyYXRvcjw8KGNvbnN0IExvZ1N0cmluZyYgc3RyKSB7CisgICAgICAgIGFwcGVuZChzdHIuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gTm90ZTogdGhpcyBwcmludHMgdGhlIHBvaW50ZXIgdmFsdWUgKGFkZHJlc3MpLgorICAgIExvZ1N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB2b2lkKiB2KTsKKworICAgIExvZ1N0cmVhbSYgb3BlcmF0b3I8PChjaGFyIGNoKTsKKyAgICBMb2dTdHJlYW0mIG9wZXJhdG9yPDwoaW50IHYpOworICAgIExvZ1N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCB2KTsKKyAgICBMb2dTdHJlYW0mIG9wZXJhdG9yPDwobG9uZyB2KTsKKyAgICBMb2dTdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyB2KTsKKyAgICAvL0xvZ1N0cmVhbSYgb3BlcmF0b3I8PChzaXplX3Qgdik7CisgICAgTG9nU3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgbG9uZyB2KTsKKyAgICBMb2dTdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIHYpOworICAgIExvZ1N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCB2KTsKKyAgICBMb2dTdHJlYW0mIG9wZXJhdG9yPDwoZG91YmxlIHYpOworICAgIExvZ1N0cmVhbSYgb3BlcmF0b3I8PChhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IHYpOworCisgICAgY29uc3QgY2hhciogc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZyA/IG1TdHJpbmcgOiAiIjsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBjb25zdCBMb2dQYXJhbXMmIHBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIG1QYXJhbXM7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGFwcGVuZChjb25zdCBjaGFyKiBzdHIpOworICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbik7CisKKyAgICBMb2dQYXJhbXMgbVBhcmFtczsKKyAgICBjaGFyKiBtU3RyaW5nOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbUNhcGFjaXR5OworfTsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gYXZvaWQgY29tcGlsZXIgZXJyb3JzLCBzZWUgTE9HX0xBWllfRVZBTCBmb3IKKy8vIG1vcmUgaW5mb3JtYXRpb24uCitjbGFzcyBMb2dTdHJlYW1Wb2lkaWZ5IHsKKyBwdWJsaWM6CisgIExvZ1N0cmVhbVZvaWRpZnkoKSB7IH0KKyAgLy8gVGhpcyBoYXMgdG8gYmUgYW4gb3BlcmF0b3Igd2l0aCBhIHByZWNlZGVuY2UgbG93ZXIgdGhhbiA8PCBidXQKKyAgLy8gaGlnaGVyIHRoYW4gPzoKKyAgdm9pZCBvcGVyYXRvciYoTG9nU3RyZWFtJikgeyB9Cit9OworCisvLyBUaGlzIHJlcHJlc2VudHMgYW4gbG9nIG1lc3NhZ2UuIEF0IGNyZWF0aW9uIHRpbWUsIHByb3ZpZGUgdGhlIG5hbWUgb2YKKy8vIHRoZSBjdXJyZW50IGZpbGUsIHRoZSBzb3VyY2UgbGluZSBudW1iZXIgYW5kIGEgc2V2ZXJpdHkuCisvLyBZb3UgY2FuIHRoZW0gc3RyZWFtIHN0dWZmIGludG8gaXQgd2l0aCA8PC4gRm9yIGV4YW1wbGU6CisvLworLy8gICBMb2dNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgTE9HX0lORk8pIDw8ICJIZWxsbyBXb3JsZCFcbiI7CisvLworLy8gV2hlbiBkZXN0cm95ZWQsIHRoZSBtZXNzYWdlIHNlbmRzIHRoZSBmaW5hbCBvdXRwdXQgdG8gdGhlIGFwcHJvcHJpYXRlCisvLyBsb2cgKGUuZy4gc3RkZXJyIGJ5IGRlZmF1bHQpLgorY2xhc3MgTG9nTWVzc2FnZSB7CitwdWJsaWM6CisgICAgTG9nTWVzc2FnZShjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwgTG9nU2V2ZXJpdHkgc2V2ZXJpdHkpOworICAgIH5Mb2dNZXNzYWdlKCk7CisKKyAgICBMb2dTdHJlYW0mIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuICptU3RyZWFtOyB9Citwcm90ZWN0ZWQ6CisgICAgLy8gQXZvaWQgdGhhdCBlYWNoIExPRygpIHN0YXRlbWVudAorICAgIExvZ1N0cmVhbSogbVN0cmVhbTsKK307CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gYXZvaWQgdG9vIG11Y2ggdHlwaW5nLiBUaGlzIGNyZWF0ZXMgYSBuZXcgTG9nTWVzc2FnZQorLy8gaW5zdGFuY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmlsZSBzb3VyY2UgcGF0aCwgZmlsZSBzb3VyY2UgbGluZSBhbmQKKy8vIHNldmVyaXR5LgorI2RlZmluZSBMT0dfTUVTU0FHRV9DT01QQUNUKHNldmVyaXR5KSBcCisgICAgOjphbmRyb2lkOjpiYXNlOjpMb2dNZXNzYWdlKCBcCisgICAgICAgICAgICBfX0ZJTEVfXywgXAorICAgICAgICAgICAgX19MSU5FX18sIFwKKyAgICAgICAgICAgIExPR19TRVZFUklUWV9GUk9NKHNldmVyaXR5KSkKKworI2RlZmluZSBMT0dfTUVTU0FHRV9TVFJFQU1fQ09NUEFDVChzZXZlcml0eSkgXAorICAgIExPR19NRVNTQUdFX0NPTVBBQ1Qoc2V2ZXJpdHkpLnN0cmVhbSgpCisKKworLy8gQSB2YXJpYW50IG9mIExvZ01lc3NhZ2UgdGhhdCBzYXZlcyB0aGUgZXJybm8gdmFsdWUgb24gY3JlYXRpb24sCisvLyB0aGVuIHJlc3RvcmVzIGl0IG9uIGRlc3RydWN0aW9uLCBhcyB3ZWxsIGFzIGFwcGVuZCBhIHN0cmVycm9yKCkKKy8vIGVycm9yIG1lc3NhZ2UgdG8gdGhlIGxvZyBiZWZvcmUgc2VuZGluZyBpdCBmb3Igb3V0cHV0LiBVc2VkIGJ5CisvLyB0aGUgUExPRygpIGltcGxlbWVudGF0aW9uKHMpLgorLy8KKy8vIFRoaXMgY2Fubm90IGJlIGEgc3ViLWNsYXNzIG9mIExvZ01lc3NhZ2UgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBuZWVkcworLy8gdG8gcmVzdG9yZSB0aGUgc2F2ZWQgZXJybm8gbWVzc2FnZSBhZnRlciBzZW5kaW5nIHRoZSBtZXNzYWdlIHRvIHRoZQorLy8gTG9nT3V0cHV0IGFuZCBkZWxldGluZyB0aGUgc3RyZWFtLgorY2xhc3MgRXJybm9Mb2dNZXNzYWdlIHsKK3B1YmxpYzoKKyAgICBFcnJub0xvZ01lc3NhZ2UoY29uc3QgY2hhciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgIExvZ1NldmVyaXR5IHNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICBpbnQgZXJybm9Db2RlKTsKKyAgICB+RXJybm9Mb2dNZXNzYWdlKCk7CisKKyAgICBMb2dTdHJlYW0mIHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuICptU3RyZWFtOyB9Citwcml2YXRlOgorICAgIExvZ1N0cmVhbSogbVN0cmVhbTsKKyAgICBpbnQgbUVycm5vOworfTsKKworLy8gSGVscGVyIG1hY3JvcyB0byBhdm9pZCB0b28gbXVjaCB0eXBpbmcuCisjZGVmaW5lIFBMT0dfTUVTU0FHRV9DT01QQUNUKHNldmVyaXR5KSBcCisgICAgOjphbmRyb2lkOjpiYXNlOjpFcnJub0xvZ01lc3NhZ2UoIFwKKyAgICAgICAgICAgIF9fRklMRV9fLCBcCisgICAgICAgICAgICBfX0xJTkVfXywgXAorICAgICAgICAgICAgTE9HX1NFVkVSSVRZX0ZST00oc2V2ZXJpdHkpLCBcCisgICAgICAgICAgICBlcnJubykKKworI2RlZmluZSBQTE9HX01FU1NBR0VfU1RSRUFNX0NPTVBBQ1Qoc2V2ZXJpdHkpIFwKKyAgICBQTE9HX01FU1NBR0VfQ09NUEFDVChzZXZlcml0eSkuc3RyZWFtKCkKKworbmFtZXNwYWNlIHRlc3RpbmcgeworCisvLyBBYnN0cmFjdCBpbnRlcmZhY2UgdG8gdGhlIG91dHB1dCB3aGVyZSB0aGUgbG9nIG1lc3NhZ2VzIGFyZSBzZW50LgorLy8gSU1QT1JUQU5UOiBPbmx5IHVzZSB0aGlzIGZvciB1bml0IHRlc3RpbmcgdGhlIGxvZyBmYWNpbGl0eS4KK2NsYXNzIExvZ091dHB1dCB7CitwdWJsaWM6CisgICAgTG9nT3V0cHV0KCkge30KKyAgICB2aXJ0dWFsIH5Mb2dPdXRwdXQoKSB7fQorCisgICAgLy8gU2VuZCBhIGZ1bGwgbG9nIG1lc3NhZ2UgdG8gdGhlIG91dHB1dC4gTm90IHplcm8gdGVybWluYXRlZCwgYW5kCisgICAgLy8gRG9lcyBub3QgaGF2ZSBhIHRyYWlsaW5nIFxuIHdoaWNoIGNhbiBiZSBhZGRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAvLyB3aGVuIHdyaXRpbmcgdGhlIG1lc3NhZ2UgdG8gYSBmaWxlLgorICAgIC8vIE5vdGU6IGlmIHxzZXZlcml0eXwgaXMgTE9HX0ZBVEFMLCB0aGlzIHNob3VsZCBhbHNvIHRlcm1pbmF0ZSB0aGUKKyAgICAvLyBwcm9jZXNzLgorICAgIHZpcnR1YWwgdm9pZCBsb2dNZXNzYWdlKGNvbnN0IExvZ1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1lc3NhZ2VfbGVuKSA9IDA7CisKKyAgICAvLyBTZXQgYSBuZXcgbG9nIG91dHB1dCwgYW5kIHJldHVybiBwb2ludGVyIHRvIHRoZSBwcmV2aW91cworICAgIC8vIGltcGxlbWVudGF0aW9uLCB3aGljaCB3aWxsIGJlIE5VTEwgZm9yIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAvLyB8bmV3T3V0cHV0fCBpcyBlaXRoZXIgTlVMTCAod2hpY2ggbWVhbnMgdGhlIGRlZmF1bHQpLCBvciBhCisgICAgLy8gY3VzdG9tIGluc3RhbmNlIG9mIExvZ091dHB1dC4KKyAgICBzdGF0aWMgTG9nT3V0cHV0KiBzZXROZXdPdXRwdXQoTG9nT3V0cHV0KiBuZXdPdXRwdXQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9Mb2dfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvTG9nX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBmMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvTG9nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDM0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIENyZWF0ZSBhIHNldmVyaXR5IGxldmVsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgZ2VuZXJhdGUgYSBsb2cKKy8vIG1lc3NhZ2UuIFNlZSBMb2dPbmx5RXZhbHVhdGVzQXJndW1lbnRzSWZOZWVkZWQgZm9yIHVzYWdlLgorY29uc3QgTG9nU2V2ZXJpdHkgTE9HX0lOVklTSUJMRSA9IHN0YXRpY19jYXN0PExvZ1NldmVyaXR5PigtMTAwMDApOworCitjbGFzcyBMb2dUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwgYW5kcm9pZDo6YmFzZTo6dGVzdGluZzo6TG9nT3V0cHV0IHsKK3B1YmxpYzoKKyAgICBMb2dUZXN0KCkgOiBtRmF0YWwoZmFsc2UpIHsKKyAgICAgICAgbVNhdmVkT3V0cHV0ID0gOjphbmRyb2lkOjpiYXNlOjp0ZXN0aW5nOjpMb2dPdXRwdXQ6OnNldE5ld091dHB1dCh0aGlzKTsKKyAgICAgICAgbUV4cGVjdGVkWzBdID0gJ1wwJzsKKyAgICAgICAgbUJ1ZmZlclswXSA9ICdceDdmJzsKKyAgICAgICAgbUJ1ZmZlclsxXSA9ICdcMCc7CisgICAgfQorCisgICAgfkxvZ1Rlc3QoKSB7CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6dGVzdGluZzo6TG9nT3V0cHV0OjpzZXROZXdPdXRwdXQobVNhdmVkT3V0cHV0KTsKKyAgICB9CisKKyAgICB2b2lkIHNldEV4cGVjdGVkKExvZ1NldmVyaXR5IHNldmVyaXR5LCBpbnQgbGluZSwgY29uc3QgY2hhciogc3VmZml4KSB7CisgICAgICAgIG1FeHBlY3RlZFBhcmFtcy5maWxlID0gX19GSUxFX187CisgICAgICAgIG1FeHBlY3RlZFBhcmFtcy5saW5lbm8gPSBsaW5lOworICAgICAgICBtRXhwZWN0ZWRQYXJhbXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKKyAgICAgICAgc25wcmludGYobUV4cGVjdGVkLCBzaXplb2YobUV4cGVjdGVkKSwgIiVzIiwgc3VmZml4KTsKKyAgICB9CisKKyAgICAvLyBMb2dPdXRwdXQgb3ZlcnJpZGUKKyAgICB2b2lkIGxvZ01lc3NhZ2UoY29uc3QgTG9nUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZXNzYWdlTGVuKSB7CisgICAgICAgIG1QYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIGlmIChtZXNzYWdlTGVuID4gc2l6ZW9mKG1CdWZmZXIpIC0gMSkKKyAgICAgICAgICAgIG1lc3NhZ2VMZW4gPSBzaXplb2YobUJ1ZmZlcikgLSAxOworICAgICAgICA6Om1lbWNweShtQnVmZmVyLCBtZXNzYWdlLCBtZXNzYWdlTGVuKTsKKyAgICAgICAgbUJ1ZmZlclttZXNzYWdlTGVuXSA9ICdcMCc7CisgICAgICAgIG1GYXRhbCA9IChwYXJhbXMuc2V2ZXJpdHkgPj0gTE9HX0ZBVEFMKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICA6OmFuZHJvaWQ6OmJhc2U6OnRlc3Rpbmc6OkxvZ091dHB1dCogbVNhdmVkT3V0cHV0OworICAgIExvZ1BhcmFtcyBtUGFyYW1zOworICAgIExvZ1BhcmFtcyBtRXhwZWN0ZWRQYXJhbXM7CisgICAgY2hhciBtRXhwZWN0ZWRbMTAyNF07CisgICAgY2hhciBtQnVmZmVyWzEwMjRdOworICAgIGJvb2wgbUZhdGFsOworfTsKKworY2xhc3MgQ2hlY2tUZXN0IDogcHVibGljIExvZ1Rlc3QgeworfTsKKworI2lmIEVOQUJMRV9EQ0hFQ0sgIT0gMAorY2xhc3MgRENoZWNrRW5hYmxlZFRlc3QgOiBwdWJsaWMgTG9nVGVzdCB7CitwdWJsaWM6CisgICAgRENoZWNrRW5hYmxlZFRlc3QoKSA6IExvZ1Rlc3QoKSB7CisgICAgICAgIC8vIEVuc3VyZSBEQ0hFQ0tTKCkgYWx3YXlzIHJ1bi4KKyAgICAgICAgbVNhdmVkTGV2ZWwgPSBzZXREY2hlY2tMZXZlbCh0cnVlKTsKKyAgICB9CisKKyAgICB+RENoZWNrRW5hYmxlZFRlc3QoKSB7CisgICAgICAgIHNldERjaGVja0xldmVsKG1TYXZlZExldmVsKTsKKyAgICB9Citwcml2YXRlOgorICAgIGJvb2wgbVNhdmVkTGV2ZWw7Cit9OworI2VuZGlmICAvLyBFTkFCTEVfRENIRUNLID09IDAKKworI2lmIEVOQUJMRV9EQ0hFQ0sgIT0gMgorY2xhc3MgRENoZWNrRGlzYWJsZWRUZXN0IDogcHVibGljIExvZ1Rlc3QgeworcHVibGljOgorICAgIERDaGVja0Rpc2FibGVkVGVzdCgpIDogTG9nVGVzdCgpIHsKKyAgICAgICAgbVNhdmVkTGV2ZWwgPSBzZXREY2hlY2tMZXZlbChmYWxzZSk7CisgICAgfQorCisgICAgfkRDaGVja0Rpc2FibGVkVGVzdCgpIHsKKyAgICAgICAgc2V0RGNoZWNrTGV2ZWwobVNhdmVkTGV2ZWwpOworICAgIH0KK3ByaXZhdGU6CisgICAgYm9vbCBtU2F2ZWRMZXZlbDsKK307CisjZW5kaWYgIC8vIEVOQUJMRV9EQ0hFQ0sgIT0gMgorCitjbGFzcyBQTG9nVGVzdCA6IHB1YmxpYyBMb2dUZXN0IHsKK3B1YmxpYzoKKyAgICBQTG9nVGVzdCgpIDogTG9nVGVzdCgpLCBtRm9yY2VkRXJybm8oLTEwMDApIHt9CisKKyAgICB2b2lkIHNldEZvcmNlZEVycm5vKGludCBlcnJub0NvZGUpIHsKKyAgICAgICAgbUZvcmNlZEVycm5vID0gZXJybm9Db2RlOworICAgIH0KKworICAgIHZvaWQgc2V0RXhwZWN0ZWRFcnJubyhMb2dTZXZlcml0eSBzZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJub0NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgICAgICBtRXhwZWN0ZWRQYXJhbXMuZmlsZSA9IF9fRklMRV9fOworICAgICAgICBtRXhwZWN0ZWRQYXJhbXMubGluZW5vID0gbGluZTsKKyAgICAgICAgbUV4cGVjdGVkUGFyYW1zLnNldmVyaXR5ID0gc2V2ZXJpdHk7CisgICAgICAgIHNucHJpbnRmKG1FeHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG1FeHBlY3RlZCksCisgICAgICAgICAgICAgICAgICIlc0Vycm9yIG1lc3NhZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3VmZml4LAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJub0NvZGUpKTsKKyAgICB9CisKKyAgICB2b2lkIGxvZ01lc3NhZ2UoY29uc3QgTG9nUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtZXNzYWdlTGVuKSB7CisgICAgICAgIExvZ1Rlc3Q6OmxvZ01lc3NhZ2UocGFyYW1zLCBtZXNzYWdlLCBtZXNzYWdlTGVuKTsKKworICAgICAgICBpZiAobUZvcmNlZEVycm5vICE9IC0xMDAwKQorICAgICAgICAgICAgZXJybm8gPSBtRm9yY2VkRXJybm87CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW50IG1Gb3JjZWRFcnJubzsKK307CisKKyNkZWZpbmUgU1RSSU5HSUZZKHgpIFNUUklOR0lGWV8oeCkKKyNkZWZpbmUgU1RSSU5HSUZZXyh4KSAjeAorCisjZGVmaW5lIEVYUEVDVEVEX1NUUklOR19QUkVGSVgocHJlZml4LCBsaW5lKSBcCisgIHByZWZpeCAiOiIgX19GSUxFX18gIjoiIFNUUklOR0lGWShsaW5lKSAiOiAiCisKKyNkZWZpbmUgQ0hFQ0tfRVhQRUNUQVRJT05TKCkgXAorICAgIEVYUEVDVF9TVFJFUShtRXhwZWN0ZWRQYXJhbXMuZmlsZSwgbVBhcmFtcy5maWxlKTsgXAorICAgIEVYUEVDVF9FUShtRXhwZWN0ZWRQYXJhbXMubGluZW5vLCBtUGFyYW1zLmxpbmVubyk7IFwKKyAgICBFWFBFQ1RfRVEobUV4cGVjdGVkUGFyYW1zLnNldmVyaXR5LCBtUGFyYW1zLnNldmVyaXR5KTsgXAorICAgIEVYUEVDVF9TVFJFUShtRXhwZWN0ZWQsIG1CdWZmZXIpCisKKy8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHNldCBhIGJvb2xlYW4gfGZsYWd8LCB0aGVuIHJldHVybiB8c3RyaW5nfC4KK3N0YXRpYyBjb25zdCBjaGFyKiBzZXRGbGFnKGJvb2wqIGZsYWcsIGNvbnN0IGNoYXIqIHN0cmluZykgeworICAgICpmbGFnID0gdHJ1ZTsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitURVNUKExvZ1N0cmluZywgRW1wdHlTdHJpbmcpIHsKKyAgICBMb2dTdHJpbmcgbHMoIiIpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgbHMuc3RyaW5nKCkpOworfQorCitURVNUKExvZ1N0cmluZywgU2ltcGxlU3RyaW5nKSB7CisgICAgTG9nU3RyaW5nIGxzKCJIZWxsbyIpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBscy5zdHJpbmcoKSk7Cit9CisKK1RFU1QoTG9nU3RyaW5nLCBGb3JtYXR0ZWRTdHJpbmcpIHsKKyAgICBMb2dTdHJpbmcgbHMoIiVkIHBsdXMgJWQgZXF1YWxzICVkIiwgMTIsIDIzLCAzNSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMiBwbHVzIDIzIGVxdWFscyAzNSIsIGxzLnN0cmluZygpKTsKK30KKworVEVTVF9GKExvZ1Rlc3QsIExvZ0luZm9FbXB0eSkgeworICAgIHNldEV4cGVjdGVkKExPR19JTkZPLCBfX0xJTkVfXyArIDEsICIiKTsKKyAgICBMT0coSU5GTyk7CisgICAgQ0hFQ0tfRVhQRUNUQVRJT05TKCk7Cit9CisKK1RFU1RfRihMb2dUZXN0LCBMb2dJbmZvV2l0aFN0cmluZykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdHJpbmdbXSA9ICJIZWxsbyBXb3JsZCEiOworICAgIHNldEV4cGVjdGVkKExPR19JTkZPLCBfX0xJTkVfXyArIDEsIGtTdHJpbmcpOworICAgIExPRyhJTkZPKSA8PCBrU3RyaW5nOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoTG9nVGVzdCwgTG9nSW5mb1dpdGhUd29TdHJpbmdzKSB7CisgICAgc2V0RXhwZWN0ZWQoTE9HX0lORk8sIF9fTElORV9fICsgMSwgIkhlbGxvIEdsb2JlISIpOworICAgIExPRyhJTkZPKSA8PCAiSGVsbG8gIiA8PCAiR2xvYmUhIjsKKyAgICBDSEVDS19FWFBFQ1RBVElPTlMoKTsKK30KKworVEVTVF9GKExvZ1Rlc3QsIExvZ0luZm9XaXRoTG9nU3RyaW5nKSB7CisgICAgTG9nU3RyaW5nIGxzKCJIZWxsbyBZb3UhIik7CisgICAgc2V0RXhwZWN0ZWQoTE9HX0lORk8sIF9fTElORV9fICsgMSwgbHMuc3RyaW5nKCkpOworICAgIExPRyhJTkZPKSA8PCBsczsKKyAgICBDSEVDS19FWFBFQ1RBVElPTlMoKTsKK30KKworVEVTVF9GKExvZ1Rlc3QsIExvZ1dhcm5pbmcpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrV2FybmluZ1tdID0gIkVsdmlzIGhhcyBsZWZ0IHRoZSBidWlsZGluZyEiOworICAgIHNldEV4cGVjdGVkKExPR19XQVJOSU5HLCBfX0xJTkVfXyArIDEsIGtXYXJuaW5nKTsKKyAgICBMT0coV0FSTklORykgPDwga1dhcm5pbmc7CisgICAgQ0hFQ0tfRVhQRUNUQVRJT05TKCk7Cit9CisKK1RFU1RfRihMb2dUZXN0LCBMb2dFcnJvcikgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFcnJvcltdID0gIkJhZCBCYWQgUm9ib3QhIjsKKyAgICBzZXRFeHBlY3RlZChMT0dfRVJST1IsIF9fTElORV9fICsgMSwga0Vycm9yKTsKKyAgICBMT0coRVJST1IpIDw8IGtFcnJvcjsKKworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoTG9nVGVzdCwgTG9nRmF0YWwpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRmF0YWxNZXNzYWdlW10gPSAiSSdtIGR5aW5nIjsKKyAgICBzZXRFeHBlY3RlZChMT0dfRkFUQUwsIF9fTElORV9fICsgMSwga0ZhdGFsTWVzc2FnZSk7CisgICAgTE9HKEZBVEFMKSA8PCBrRmF0YWxNZXNzYWdlOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworICAgIEVYUEVDVF9UUlVFKG1GYXRhbCk7Cit9CisKK1RFU1RfRihMb2dUZXN0LCBMb2dFdmFsdWF0ZXNBcmd1bWVudHNJZk5lZWRlZCkgeworICAgIC8vIFVzZSBMT0dfRkFUQUwgc2luY2UgaXQgaXMgYWx3YXlzIGFjdGl2ZS4KKyAgICBib29sIGZsYWcgPSBmYWxzZTsKKyAgICBzZXRFeHBlY3RlZChMT0dfRkFUQUwsIF9fTElORV9fICsgMSwgIlBBTklDOiBGbGFnIHdhcyBzZXQhIik7CisgICAgTE9HKEZBVEFMKSA8PCAiUEFOSUM6ICIgPDwgc2V0RmxhZygmZmxhZywgIkZsYWcgd2FzIHNldCEiKTsKKyAgICBDSEVDS19FWFBFQ1RBVElPTlMoKTsKKyAgICBFWFBFQ1RfVFJVRShtRmF0YWwpOworICAgIEVYUEVDVF9UUlVFKGZsYWcpOworfQorCitURVNUX0YoTG9nVGVzdCwgTG9nT25seUV2YWx1YXRlc0FyZ3VtZW50c0lmTmVlZGVkKSB7CisgICAgYm9vbCBmbGFnID0gZmFsc2U7CisgICAgTE9HKElOVklTSUJMRSkgPDwgc2V0RmxhZygmZmxhZywgIkZsYWcgd2FzIHNldCEiKTsKKyAgICBFWFBFQ1RfRkFMU0UoZmxhZyk7Cit9CisKKworLy8gVE9ETyhkaWdpdCk6IENvbnZlcnQgdGhpcyB0byBhIHJlYWwgZGVhdGggdGVzdCB3aGVuIHRoaXMgaXMgc3VwcG9ydGVkCisvLyBieSBvdXIgdmVyc2lvbiBvZiBHVGVzdC4KK1RFU1RfRihDaGVja1Rlc3QsIENoZWNrRmFsc2UpIHsKKyAgICBzZXRFeHBlY3RlZChMT0dfRkFUQUwsIF9fTElORV9fICsgMSwgIkNoZWNrIGZhaWxlZDogZmFsc2UuICIpOworICAgIENIRUNLKGZhbHNlKTsKKyAgICBDSEVDS19FWFBFQ1RBVElPTlMoKTsKK30KKworVEVTVF9GKENoZWNrVGVzdCwgQ2hlY2tGYWxzZUV2YWx1YXRlc0FyZ3VtZW50cykgeworICAgIGJvb2wgZmxhZyA9IGZhbHNlOworICAgIHNldEV4cGVjdGVkKExPR19GQVRBTCwgX19MSU5FX18gKyAxLCAiQ2hlY2sgZmFpbGVkOiBmYWxzZS4gRmxhZyB3YXMgc2V0ISIpOworICAgIENIRUNLKGZhbHNlKSA8PCBzZXRGbGFnKCZmbGFnLCAiRmxhZyB3YXMgc2V0ISIpOworICAgIEVYUEVDVF9UUlVFKGZsYWcpOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoQ2hlY2tUZXN0LCBDaGVja1RydWUpIHsKKyAgICBDSEVDSyh0cnVlKTsKKyAgICBFWFBFQ1RfRkFMU0UobUZhdGFsKTsKK30KKworVEVTVF9GKENoZWNrVGVzdCwgQ2hlY2tUcnVlRG9lc05vdEV2YWx1YXRlQXJndW1lbnRzKSB7CisgICAgYm9vbCBmbGFnID0gZmFsc2U7CisgICAgQ0hFQ0sodHJ1ZSkgPDwgc2V0RmxhZygmZmxhZywgIkZsYWcgd2FzIHNldCEiKTsKKyAgICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgICAgRVhQRUNUX0ZBTFNFKG1GYXRhbCk7Cit9CisKKyNpZiBFTkFCTEVfRENIRUNLICE9IDAKK1RFU1RfRihEQ2hlY2tFbmFibGVkVGVzdCwgRENoZWNrSXNPblJldHVybnNUcnVlKSB7CisgICAgRVhQRUNUX1RSVUUoRENIRUNLX0lTX09OKCkpOworfQorCitURVNUX0YoRENoZWNrRW5hYmxlZFRlc3QsIERDaGVja0ZhbHNlKSB7CisgICAgYm9vbCBmbGFnID0gZmFsc2U7CisgICAgc2V0RXhwZWN0ZWQoTE9HX0ZBVEFMLCBfX0xJTkVfXyArIDEsICJDaGVjayBmYWlsZWQ6IGZhbHNlLiBGbGFnIHdhcyBzZXQhIik7CisgICAgRENIRUNLKGZhbHNlKSA8PCBzZXRGbGFnKCZmbGFnLCAiRmxhZyB3YXMgc2V0ISIpOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoRENoZWNrRW5hYmxlZFRlc3QsIERDaGVja1RydWUpIHsKKyAgICBib29sIGZsYWcgPSBmYWxzZTsKKyAgICBEQ0hFQ0sodHJ1ZSkgPDwgc2V0RmxhZygmZmxhZywgIkZsYWcgd2FzIHNldCEiKTsKKyAgICBFWFBFQ1RfRkFMU0UoZmxhZyk7CisgICAgRVhQRUNUX0ZBTFNFKG1GYXRhbCk7Cit9CisjZW5kaWYgIC8vIEVOQUJMRV9EQ0hFQ0sgIT0gMAorCisjaWYgRU5BQkxFX0RDSEVDSyAhPSAyCitURVNUX0YoRENoZWNrRGlzYWJsZWRUZXN0LCBEQ2hlY2tJc09uUmV0dXJuc0ZhbHNlKSB7CisgICAgRVhQRUNUX0ZBTFNFKERDSEVDS19JU19PTigpKTsKK30KKworVEVTVF9GKERDaGVja0Rpc2FibGVkVGVzdCwgRENoZWNrRmFsc2UpIHsKKyAgICBib29sIGZsYWcgPSBmYWxzZTsKKyAgICBEQ0hFQ0soZmFsc2UpIDw8IHNldEZsYWcoJmZsYWcsICJGbGFnIHdhcyBzZXQhIik7CisgICAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICAgIEVYUEVDVF9GQUxTRShtRmF0YWwpOworfQorCitURVNUX0YoRENoZWNrRGlzYWJsZWRUZXN0LCBEQ2hlY2tUcnVlKSB7CisgICAgRENIRUNLKHRydWUpOworfQorI2VuZGlmICAvLyBFTkFCTEVfRENIRUNLICE9IDIKKworVEVTVF9GKFBMb2dUZXN0LCBQTG9nSW5mb0VtcHR5KSB7CisgICAgc2V0RXhwZWN0ZWRFcnJubyhMT0dfSU5GTywgX19MSU5FX18gKyAyLCBFSU5WQUwsICIiKTsKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICBQTE9HKElORk8pOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoUExvZ1Rlc3QsIFBMb2dJbmZvUHJlc2VydmVzRXJybm8pIHsKKyAgICAvLyBTZWxlY3QgYSB2YWx1ZSB0aGF0IGlzIHVubGlrZWx5IHRvIGV2ZXIgYmUgcmFpc2VkIGJ5IHRoZSBsb2dnaW5nCisgICAgLy8gbWFjaGluZXJ5LgorICAgIGNvbnN0IGludCBrRXJybm9Db2RlID0gRU5PRVhFQzsKKyAgICBzZXRGb3JjZWRFcnJubyhFSU5WQUwpOworICAgIHNldEV4cGVjdGVkRXJybm8oTE9HX0lORk8sIF9fTElORV9fICsgMiwga0Vycm5vQ29kZSwgIkhpIik7CisgICAgZXJybm8gPSBrRXJybm9Db2RlOworICAgIFBMT0coSU5GTykgPDwgIkhpIjsKKyAgICBFWFBFQ1RfRVEoa0Vycm5vQ29kZSwgZXJybm8pOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCisjaWYgRU5BQkxFX0RMT0cKK1RFU1RfRihQTG9nVGVzdCwgRFBsb2dJbmZvRW1wdHkpIHsKKyAgICBzZXRFeHBlY3RlZEVycm5vKExPR19JTkZPLCBfX0xJTkVfXyArIDIsIEVJTlZBTCwgIiIpOworICAgIGVycm5vID0gRUlOVkFMOworICAgIERQTE9HKElORk8pOworICAgIENIRUNLX0VYUEVDVEFUSU9OUygpOworfQorCitURVNUX0YoUExvZ1Rlc3QsIERQbG9nSW5mb1ByZXNlcnZlc0Vycm5vKSB7CisgICAgLy8gU2VsZWN0IGEgdmFsdWUgdGhhdCBpcyB1bmxpa2VseSB0byBldmVyIGJlIHJhaXNlZCBieSB0aGUgbG9nZ2luZworICAgIC8vIG1hY2hpbmVyeS4KKyAgICBjb25zdCBpbnQga0Vycm5vQ29kZSA9IEVOT0VYRUM7CisgICAgc2V0Rm9yY2VkRXJybm8oRUlOVkFMKTsKKyAgICBzZXRFeHBlY3RlZEVycm5vKExPR19JTkZPLCBfX0xJTkVfXyArIDIsIGtFcnJub0NvZGUsICJIaSIpOworICAgIGVycm5vID0ga0Vycm5vQ29kZTsKKyAgICBEUExPRyhJTkZPKSA8PCAiSGkiOworICAgIEVYUEVDVF9FUShrRXJybm9Db2RlLCBlcnJubyk7CisgICAgQ0hFQ0tfRVhQRUNUQVRJT05TKCk7Cit9CisKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL09wdGlvbmFsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9PcHRpb25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NzI5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9PcHRpb25hbC5oCkBAIC0wLDAgKzEsNDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNS0yMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLy8gT3B0aW9uYWw8VD4gLSBhIHRlbXBsYXRlIGNsYXNzIHRvIHN0b3JlIGFuIG9wdGlvbmFsIHZhbHVlIG9mIHR5cGUgVC4KKy8vCisvLyBVc2FnZSBleGFtcGxlczoKKy8vCisvLyBJbml0aWFsaXphdGlvbiBhbmQgY29uc3RydWN0aW9uOgorLy8gICBPcHRpb25hbDxGb28+IGZvbzsgICAgICAgICAgICAvLyB8Zm9vfCBkb2Vzbid0IGNvbnRhaW4gYSB2YWx1ZS4KKy8vICAgT3B0aW9uYWw8Rm9vPiBmb28oRm9vKDEwKSk7ICAgLy8gfGZvb3wgY29udGFpbnMgYSBjb3B5LWNvbnN0cnVjdGVkIHZhbHVlLgorLy8gICBPcHRpb25hbDxGb28+IGZvbzIoZm9vKTsgICAgICAvLyB8Zm9vMnwgY29udGFpbnMgYSBjb3B5IG9mIHxmb298J3MgdmFsdWUuCisvLyAgIE9wdGlvbmFsPEZvbz4gZm9vMyhzdGQ6Om1vdmUoZm9vMikpOyAgLy8gR3Vlc3Mgd2hhdD8KKy8vCisvLyBBc3NpZ25tZW50OgorLy8gICBGb28gZm9vX3ZhbHVlKDApOworLy8gICBPcHRpb25hbDxGb28+IGZvbzsgICAvLyB8Zm9vfCBpcyBlbXB0eS4KKy8vICAgT3B0aW9uYWw8Rm9vPiBmb28yOyAgLy8gfGZvbzJ8IGlzIGVtcHR5LgorLy8gICBmb28yID0gZm9vOyAgICAgICAgICAvLyB8Zm9vMnwgaXMgc3RpbGwgZW1wdHkuCisvLyAgIGZvbyA9IGZvb192YWx1ZTsgICAgIC8vIHNldCB2YWx1ZSBvZiB8Zm9vfCB0byBhIGNvcHkgb2YgfGZvb192YWx1ZXwKKy8vICAgZm9vID0gc3RkOjptb3ZlKGZvb192YWx1ZSk7ICAvLyBtb3ZlIHxmb29fdmFsdWV8IGludG8gfGZvb3wuCisvLyAgIGZvbzIgPSBmb287ICAgICAgICAgIC8vIG5vdyB8Zm9vMnwgaGFzIGEgY29weSBvZiB8Zm9vfCdzIHZhbHVlLgorLy8gICBmb28gPSBrTnVsbG9wdDsgICAgICAvLyB1bnNldCB8Zm9vfCwgaXQgaGFzIG5vIHZhbHVlLgorLy8KKy8vIENoZWNraW5nIGFuZCBhY2Nlc3NpbmcgdmFsdWU6CisvLyAgIGlmIChmb28pIHsKKy8vICAgICAgLy8gfGZvb3wgaGFzIGEgdmFsdWUuCisvLyAgICAgIGRvU3R1ZmYoKmZvbyk7ICAgICAgLy8gfCpmb298IGlzIHRoZSB2YWx1ZSBpbnNpZGUgfGZvb3wuCisvLyAgICAgIGZvby0+Y2FsbE1ldGhvZCgpOyAgLy8gU2FtZSBhcyAoKmZvbykuY2FsbE1ldGhvZCgpLgorLy8gICB9IGVsc2UgeworLy8gICAgICAvLyB8Zm9vfCBpcyBlbXB0eS4KKy8vICAgfQorLy8KKy8vICAgZm9vLnZhbHVlKCkgICAgICAgICAgICAgIC8vIFNhbWUgYXMgKmZvbworLy8gICBmb28udmFsdWVPcig8ZGVmYXVsdD4pICAgLy8gUmV0dXJuIDxkZWZhdWx0PiBpcyB8Zm9vfCBoYXMgbm8gdmFsdWUuCisvLworLy8gSW4tcGxhY2UgY29uc3RydWN0aW9uOgorLy8KKy8vICAgT3B0aW9uYWw8Rm9vPiBmb287ICAgLy8gfGZvb3wgaXMgZW1wdHkuCisvLyAgIGZvby5lbXBsYWNlKDIwKTsgICAgIC8vIHxmb298IG5vdyBjb250YWlucyBhIHZhbHVlIGNvbnN0cnVjdGVkIGFzIEZvbygyMCkKKy8vCisvLyAgIE9wdGlvbmFsPEZvbz4gZm9vKGtJbnBsYWNlLCAyMCk7ICAvLyB8Zm9vfCBpcyBpbml0aWFsaXplZCB3aXRoIGEgdmFsdWUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgaXMgY29uc3RydWN0ZWQgaW4tcGxhY2UgYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbygyMCkuCisvLworLy8gICByZXR1cm4gbWFrZU9wdGlvbmFsPEZvbz4oMjApOyAgICAgLy8gVGFrZXMgRm9vIGNvbnN0cnVjdG9yIGFyZ3VtZW50cworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkuCisvLworLy8gUmV0dXJuaW5nIHZhbHVlczoKKy8vCisvLyAgT3B0aW9uYWw8Rm9vPiBteUZ1bmMoLi4uKSB7CisvLyAgICAgIGlmIChzb21lQ29uZGl0aW9uKSB7CisvLyAgICAgICAgICByZXR1cm4gRm9vKDEwKTsgICAgICAvLyBjYWxsIE9wdGlvbmFsPEZvbz4oRm9vJikgY29uc3RydWN0b3IuCisvLyAgICAgIH0gZWxzZSB7CisvLyAgICAgICAgICByZXR1cm4ge307ICAgICAgICAgICAvLyBjYWxsIE9wdGlvbmFsPEZvbz4oKSBjb25zdHJ1Y3Rvciwgd2hpY2gKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkcyBhbiBlbXB0eSB2YWx1ZS4KKy8vICAgICAgfQorLy8gIH0KKy8vCisvLyBNZW1vcnkgbGF5b3V0OgorLy8gICBPcHRpb25hbDxGb28+IGlzIGVxdWl2YWxlbnQgdG86CisvLworLy8gICAgICAgc3RydWN0IHsKKy8vICAgICAgICAgICBib29sIGZsYWc7CisvLyAgICAgICAgICAgRm9vIHZhbHVlOworLy8gICAgICAgfTsKKy8vCisvLyAgaW4gdGVybXMgb2YgbWVtb3J5IGxheW91dC4gVGhpcyBtZWFucyBpdCAqZG91YmxlcyogdGhlIHNpemUgb2YgaW50ZWdyYWwKKy8vICB0eXBlcy4gQWxzbzoKKy8vCisvLyAgLSBPcHRpb25hbDxGb28+IGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIGFueXRoaW5nIHRoYXQgY29uc3RydWN0cyBhIEZvby4KKy8vCisvLyAgLSBTYW1lIHdpdGggT3B0aW9uYWw8Rm9vPihrSW5wbGFjZSwgQXJncy4uLikgd2hlcmUgQXJncy4uLiBtYXRjaGVzIGFueQorLy8gICAgYXJndW1lbnRzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBhIEZvbyBjb25zdHJ1Y3Rvci4KKy8vCisvLyAgLSBDb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcHJvdmlkZWQuIEJld2FyZTogYW4gZW1wdHkgT3B0aW9uYWw8Rm9vPgorLy8gICAgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiBhbnkgRm9vIHZhbHVlLgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSBkZXRhaWxzIHsKKworLy8gQSBiYXNlIGNsYXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGluc3RhbnRpYXRpb25zIG9mIHRoZSBPcHRpb25hbCdzCisvLyBpbnRlcm5hbCBzdG9yYWdlCit0ZW1wbGF0ZSA8c2l6ZV90IFNpemUsIHNpemVfdCBBbGlnbj4KK2NsYXNzIE9wdGlvbmFsQmFzZSB7Citwcm90ZWN0ZWQ6CisgICAgdXNpbmcgU3RvcmVUID0gdHlwZW5hbWUgc3RkOjphbGlnbmVkX3N0b3JhZ2U8U2l6ZSwgQWxpZ24+Ojp0eXBlOworCisgICAgU3RvcmVUIG1TdG9yYWdlID0ge307CisKKyAgICB2b2lkIHNldENvbnN0cnVjdGVkKGJvb2wgY29uc3RydWN0ZWQpIHsgbUNvbnN0cnVjdGVkID0gY29uc3RydWN0ZWQ7IH0KKyAgICBjb25zdGV4cHIgYm9vbCBjb25zdHJ1Y3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1Db25zdHJ1Y3RlZDsgfQorICAgIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gY29uc3RydWN0ZWQoKTsgfQorCisgICAgY29uc3RleHByIE9wdGlvbmFsQmFzZShib29sIGNvbnN0cnVjdGVkID0gZmFsc2UpCisgICAgICAgIDogbUNvbnN0cnVjdGVkKGNvbnN0cnVjdGVkKSB7fQorCitwcml2YXRlOgorICAgIGJvb2wgbUNvbnN0cnVjdGVkID0gZmFsc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZGV0YWlscworCisvLyBBIHRhZyB0eXBlIGZvciBlbXB0eSBvcHRpb25hbCBjb25zdHJ1Y3Rpb24KK3N0cnVjdCBOdWxsb3B0VCB7CisgICAgY29uc3RleHByIGV4cGxpY2l0IE51bGxvcHRUKGludCkge30KK307CisKKy8vIEEgdGFnIHR5cGUgZm9yIGlucGxhY2UgdmFsdWUgY29uc3RydWN0aW9uCitzdHJ1Y3QgSW5wbGFjZVQgeworICAgIGNvbnN0ZXhwciBleHBsaWNpdCBJbnBsYWNlVChpbnQpIHt9Cit9OworCisKKy8vIFRhZyB2YWx1ZXMgZm9yIG51bGwgb3B0aW9uYWwgYW5kIGlucGxhY2UgY29uc3RydWN0aW9uCitjb25zdGV4cHIgTnVsbG9wdFQga051bGxvcHR7MX07Citjb25zdGV4cHIgSW5wbGFjZVQga0lucGxhY2V7MX07CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb24gZm9yIGFuIGVhcmx5IHVzZQordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBPcHRpb25hbDsKKworLy8gQSB0eXBlIHRyYWl0IGZvciBjaGVja2luZyBpZiBhIHR5cGUgaXMgYW4gb3B0aW9uYWwgaW5zdGFudGlhdGlvbgorLy8gTm90ZTogaWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gdGhlIHRlbXBsYXRlIG5hbWUgaW5zaWRlIHRoZSB0ZW1wbGF0ZSwKKy8vICB5b3UgbmVlZCB0byBkZWNsYXJlIHRoaXMgYWxpYXMgb3V0c2lkZSBvZiBpdCAtIGJlY2F1c2UgdGhlCisvLyAgY2xhc3MgbmFtZSBpbnNpZGUgb2YgdGhlIHRlbXBsYXRlIHN0YW5kcyBmb3IgYW4gaW5zdGFudGlhdGVkIHRlbXBsYXRlCisvLyAgRS5nLCBmb3IgdGVtcGxhdGUgPFQ+IGNsYXNzIEZvbyBpZiB5b3Ugc2F5ICdGb28nIGluc2lkZSB0aGUgY2xhc3MsIGl0CisvLyAgYWN0dWFsbHkgbWVhbnMgRm9vPFQ+OwordGVtcGxhdGUgPGNsYXNzIFU+Cit1c2luZyBpc19hbnlfb3B0aW9uYWwgPSBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PFU+Ojp0eXBlLCBPcHRpb25hbD47CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgT3B0aW9uYWwgOiBwcml2YXRlIGRldGFpbHM6Ok9wdGlvbmFsQmFzZTxzaXplb2YoVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25tZW50X29mPFQ+Ojp2YWx1ZT4geworICAgIC8vIG1ha2Ugc3VyZSBhbGwgb3B0aW9uYWxzIGFyZSBidWRkaWVzIC0gdGhpcyBpcyBuZWVkZWQgdG8gaW1wbGVtZW50CisgICAgLy8gY29udmVyc2lvbiBmcm9tIG9wdGlvbmFscyBvZiBvdGhlciB0eXBlcworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBmcmllbmQgY2xhc3MgT3B0aW9uYWw7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgICB1c2luZyBzZWxmID0gT3B0aW9uYWw8VT47CisKKyAgICB1c2luZyBiYXNlX3R5cGUgPSBkZXRhaWxzOjpPcHRpb25hbEJhc2U8c2l6ZW9mKFQpLCBzdGQ6OmFsaWdubWVudF9vZjxUPjo6dmFsdWU+OworCitwdWJsaWM6CisgICAgLy8gc3RkOjpvcHRpb25hbCB3aWxsIGhhdmUgdGhpcywgc28gbGV0J3MgcHJvdmlkZSBpdAorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgICAgLy8gbWFrZSBzdXJlIHdlIGZvcmJpZCBzb21lIE9wdGlvbmFsIGluc3RhbnRpYXRpb25zIHdoZXJlIHRoaW5ncyBtYXkgZ2V0CisgICAgLy8gcmVhbGx5IG1lc3N5CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUsIE51bGxvcHRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiT3B0aW9uYWwgb2YgTnVsbG9wdFQgaXMgbm90IGFsbG93ZWQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZSwgSW5wbGFjZVQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJPcHRpb25hbCBvZiBJbnBsYWNlVCBpcyBub3QgYWxsb3dlZCIpOworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcmVmZXJlbmNlPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJPcHRpb25hbCByZWZlcmVuY2VzIGFyZSBub3QgYWxsb3dlZDogdXNlIGEgcG9pbnRlciBpbnN0ZWFkIik7CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMKKyAgICBjb25zdGV4cHIgT3B0aW9uYWwoKSB7fQorICAgIGNvbnN0ZXhwciBPcHRpb25hbChOdWxsb3B0VCkge30KKworICAgIE9wdGlvbmFsKGNvbnN0IE9wdGlvbmFsJiBvdGhlcikgOiBiYXNlX3R5cGUob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgbmV3ICgmZ2V0KCkpIFQob3RoZXIuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIE9wdGlvbmFsKE9wdGlvbmFsJiYgb3RoZXIpIDogYmFzZV90eXBlKG90aGVyLmNvbnN0cnVjdGVkKCkpIHsKKyAgICAgICAgaWYgKHRoaXMtPmNvbnN0cnVjdGVkKCkpIHsKKyAgICAgICAgICAgIG5ldyAoJmdldCgpKSBUKHN0ZDo6bW92ZShvdGhlci5nZXQoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29udmVyc2lvbiBjb25zdHJ1Y3RvciBmcm9tIG9wdGlvbmFsIG9mIHNpbWlsYXIgdHlwZQorICAgIHRlbXBsYXRlIDxjbGFzcyBVLAorICAgICAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgIWlzX2FueV9vcHRpb25hbDxVPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICYmIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBVPjo6dmFsdWU+PgorICAgIE9wdGlvbmFsKGNvbnN0IE9wdGlvbmFsPFU+JiBvdGhlcikgOiBiYXNlX3R5cGUob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgbmV3ICgmZ2V0KCkpIFQob3RoZXIuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTW92ZS1jb252ZXJzaW9uIGNvbnN0cnVjdG9yCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2M8CisgICAgICAgICAgICAgICAgICAhaXNfYW55X29wdGlvbmFsPFU+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgJiYgc3RkOjppc19jb25zdHJ1Y3RpYmxlPFQsIFU+Ojp2YWx1ZT4+CisgICAgT3B0aW9uYWwoT3B0aW9uYWw8VT4mJiBvdGhlcikgOiBiYXNlX3R5cGUob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgbmV3ICgmZ2V0KCkpIFQoc3RkOjptb3ZlKG90aGVyLmdldCgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3Rpb24gZnJvbSBhIHJhdyB2YWx1ZQorICAgIE9wdGlvbmFsKGNvbnN0IFQmIHZhbHVlKSA6IGJhc2VfdHlwZSh0cnVlKSB7CisgICAgICAgIG5ldyAoJmdldCgpKSBUKHZhbHVlKTsKKyAgICB9CisgICAgLy8gTW92ZSBjb25zdHJ1Y3Rpb24gZnJvbSBhIHJhdyB2YWx1ZQorICAgIE9wdGlvbmFsKFQmJiB2YWx1ZSkgOiBiYXNlX3R5cGUodHJ1ZSkgeworICAgICAgICBuZXcgKCZnZXQoKSkgVChzdGQ6Om1vdmUodmFsdWUpKTsKKyAgICB9CisKKyAgICAvLyBJbnBsYWNlIGNvbnN0cnVjdGlvbiBmcm9tIGEgbGlzdCBvZiB8VHwncyBjdG9yIGFyZ3VtZW50cworICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgIE9wdGlvbmFsKElucGxhY2VULCBBcmdzJiYuLi4gYXJncykgOiBiYXNlX3R5cGUodHJ1ZSkgeworICAgICAgICBuZXcgKCZnZXQoKSkgVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgIH0KKworICAgIC8vIElucGxhY2UgY29uc3RydWN0aW9uIGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCBwYXNzZWQgaW50byB8VHwncyBjdG9yCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4+Pj4KKyAgICBPcHRpb25hbChJbnBsYWNlVCwgc3RkOjppbml0aWFsaXplcl9saXN0PFU+IGlsKSA6IGJhc2VfdHlwZSh0cnVlKSB7CisgICAgICAgIG5ldyAoJmdldCgpKSBUKGlsKTsKKyAgICB9CisKKyAgICAvLyBkaXJlY3QgYXNzaWdubWVudAorICAgIE9wdGlvbmFsJiBvcGVyYXRvcj0oY29uc3QgT3B0aW9uYWwmIG90aGVyKSB7CisgICAgICAgIGlmICgmb3RoZXIgPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPmNvbnN0cnVjdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICAgICAgZ2V0KCkgPSBvdGhlci5nZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRDb25zdHJ1Y3RlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIG5ldyAoJmdldCgpKSBUKG90aGVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRDb25zdHJ1Y3RlZCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgOyAgLy8gd2UncmUgZ29vZAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBtb3ZlIGFzc2lnbm1lbnQKKyAgICBPcHRpb25hbCYgb3BlcmF0b3I9KE9wdGlvbmFsJiYgb3RoZXIpIHsKKyAgICAgICAgaWYgKHRoaXMtPmNvbnN0cnVjdGVkKCkpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICAgICAgZ2V0KCkgPSBzdGQ6Om1vdmUob3RoZXIuZ2V0KCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXN0cnVjdCgpOworICAgICAgICAgICAgICAgIHRoaXMtPnNldENvbnN0cnVjdGVkKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICAgICAgbmV3ICgmZ2V0KCkpIFQoc3RkOjptb3ZlKG90aGVyLmdldCgpKSk7CisgICAgICAgICAgICAgICAgdGhpcy0+c2V0Q29uc3RydWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIDsgIC8vIHdlJ3JlIGdvb2QKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gY29udmVyc2lvbiBhc3NpZ25tZW50CisgICAgdGVtcGxhdGUgPGNsYXNzIFUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2NvbnZlcnRpYmxlPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VT46OnR5cGUsIFQ+PgorICAgIE9wdGlvbmFsJiBvcGVyYXRvcj0oY29uc3QgT3B0aW9uYWw8VT4mIG90aGVyKSB7CisgICAgICAgIGlmICh0aGlzLT5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICBpZiAob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGdldCgpID0gb3RoZXIuZ2V0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3RydWN0KCk7CisgICAgICAgICAgICAgICAgdGhpcy0+c2V0Q29uc3RydWN0ZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG90aGVyLmNvbnN0cnVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBuZXcgKCZnZXQoKSkgVChvdGhlci5nZXQoKSk7CisgICAgICAgICAgICAgICAgdGhpcy0+c2V0Q29uc3RydWN0ZWQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIDsgIC8vIHdlJ3JlIGdvb2QKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gY29udmVyc2lvbiBtb3ZlIGFzc2lnbm1lbnQKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSwKKyAgICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfY29udmVydGlibGU8dHlwZW5hbWUgc3RkOjpkZWNheTxVPjo6dHlwZSwgVD4+CisgICAgT3B0aW9uYWwmIG9wZXJhdG9yPShPcHRpb25hbDxVPiYmIG90aGVyKSB7CisgICAgICAgIGlmICh0aGlzLT5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICBpZiAob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGdldCgpID0gc3RkOjptb3ZlKG90aGVyLmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVzdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICB0aGlzLT5zZXRDb25zdHJ1Y3RlZChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3RoZXIuY29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIG5ldyAoJmdldCgpKSBUKHN0ZDo6bW92ZShvdGhlci5nZXQoKSkpOworICAgICAgICAgICAgICAgIHRoaXMtPnNldENvbnN0cnVjdGVkKHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICA7ICAvLyB3ZSdyZSBnb29kCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIHRoZSBtb3N0IGNvbXBsaWNhdGVkIG9uZTogZm9yd2FyZGluZyBjb25zdHJ1Y3RvciBmb3IgYW55dGhpbmcgY29udmVydGlibGUKKyAgICAvLyB0byB8VHwsIGV4Y2x1ZGluZyB0aGUgc3R1ZmYgaW1wbGVtZW50ZWQgYWJvdmUgZXhwbGljaXRseQorICAgIHRlbXBsYXRlIDxjbGFzcyBVLAorICAgICAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgIWlzX2FueV9vcHRpb25hbDx0eXBlbmFtZSBzdGQ6OmRlY2F5PFU+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICYmIHN0ZDo6aXNfY29udmVydGlibGU8dHlwZW5hbWUgc3RkOjpkZWNheTxVPjo6dHlwZSwgVD46OnZhbHVlPj4KKyAgICBPcHRpb25hbCYgb3BlcmF0b3I9KFUmJiBvdGhlcikgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgZ2V0KCkgPSBzdGQ6OmZvcndhcmQ8VT4ob3RoZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3ICgmZ2V0KCkpIFQoc3RkOjpmb3J3YXJkPFU+KG90aGVyKSk7CisgICAgICAgICAgICB0aGlzLT5zZXRDb25zdHJ1Y3RlZCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gQWRvcHQgb3BlcmF0b3IgYm9vbCgpIGZyb20gdGhlIHBhcmVudAorICAgIHVzaW5nIGJhc2VfdHlwZTo6b3BlcmF0b3IgYm9vbDsKKworICAgIFQmIHZhbHVlKCkgeyByZXR1cm4gZ2V0KCk7IH0KKyAgICBjb25zdGV4cHIgY29uc3QgVCYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorCisgICAgLy8gVmFsdWUgZ2V0dGVyIHdpdGggZmFsbGJhY2sKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVSA9IFQsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2NvbnZlcnRpYmxlPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VT46OnR5cGUsIFQ+PgorICAgIGNvbnN0ZXhwciBUIHZhbHVlT3IoVSYmIGRlZmF1bHRWYWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gdGhpcy0+Y29uc3RydWN0ZWQoKSA/IGdldCgpIDogc3RkOjptb3ZlKGRlZmF1bHRWYWx1ZSk7CisgICAgfQorCisgICAgLy8gUG9pbnRlci1saWtlIG9wZXJhdG9ycworICAgIFQmIG9wZXJhdG9yKigpIHsgcmV0dXJuIGdldCgpOyB9CisgICAgY29uc3RleHByIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisKKyAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJmdldCgpOyB9CisgICAgY29uc3RleHByIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmZ2V0KCk7IH0KKworCisgICAgfk9wdGlvbmFsKCkgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgZGVzdHJ1Y3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGlmICh0aGlzLT5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICBkZXN0cnVjdCgpOworICAgICAgICAgICAgdGhpcy0+c2V0Q29uc3RydWN0ZWQoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2NvbnZlcnRpYmxlPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VT46OnR5cGUsIFQ+PgorICAgIHZvaWQgcmVzZXQoVSYmIHUpIHsKKyAgICAgICAgKnRoaXMgPSBzdGQ6OmZvcndhcmQ8VT4odSk7CisgICAgfQorCisgICAgLy8gSW4tcGxhY2UgY29uc3RydWN0aW9uIHdpdGggcG9zc2libGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIG9sZCB2YWx1ZQorICAgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICAgIHZvaWQgZW1wbGFjZShBcmdzJiYuLi4gYXJncykgeworICAgICAgICBpZiAodGhpcy0+Y29uc3RydWN0ZWQoKSkgeworICAgICAgICAgICAgZGVzdHJ1Y3QoKTsKKyAgICAgICAgfQorICAgICAgICBuZXcgKCZnZXQoKSkgVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgICB0aGlzLT5zZXRDb25zdHJ1Y3RlZCh0cnVlKTsKKyAgICB9CisKKyAgICAvLyBJbi1wbGFjZSBjb25zdHJ1Y3Rpb24gd2l0aCBwb3NzaWJsZSBkZXN0cnVjdGlvbiBvZiB0aGUgb2xkIHZhbHVlCisgICAgLy8gaW5pdGlhbGl6ZXItbGlzdCB2ZXJzaW9uCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VT4+Pj4KKyAgICB2b2lkIGVtcGxhY2Uoc3RkOjppbml0aWFsaXplcl9saXN0PFU+IGlsKSB7CisgICAgICAgIGlmICh0aGlzLT5jb25zdHJ1Y3RlZCgpKSB7CisgICAgICAgICAgICBkZXN0cnVjdCgpOworICAgICAgICB9CisgICAgICAgIG5ldyAoJmdldCgpKSBUKGlsKTsKKyAgICAgICAgdGhpcy0+c2V0Q29uc3RydWN0ZWQodHJ1ZSk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGludGVybmFsIHJhdyBzdG9yYWdlIHRvIFQmCisgICAgY29uc3RleHByIGNvbnN0IFQmIGdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPigKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRoaXMtPm1TdG9yYWdlKSk7CisgICAgfQorCisgICAgLy8gU2FtZSB0aGluZywgbXV0YWJsZQorICAgIFQmIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VCY+KGNvbnN0X2Nhc3Q8Y29uc3QgT3B0aW9uYWwqPih0aGlzKS0+Z2V0KCkpOworICAgIH0KKworICAgIC8vIFNob3J0Y3V0IGZvciBhIGRlc3RydWN0b3IgY2FsbCBmb3IgdGhlIHN0b3JlZCBvYmplY3QKKyAgICB2b2lkIGRlc3RydWN0KCkgeyBnZXQoKS5UOjp+VCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK09wdGlvbmFsPHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGU+IG1ha2VPcHRpb25hbChUJiYgdCkgeworICAgIHJldHVybiBPcHRpb25hbDx0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlPihzdGQ6OmZvcndhcmQ8VD4odCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxUPiYgbCwgY29uc3QgT3B0aW9uYWw8VD4mIHIpIHsKKyAgICByZXR1cm4gYm9vbChsKQorICAgICAgICAgICAgPyBib29sKHIpICYmICpsID09ICpyCisgICAgICAgICAgICA6ICFib29sKHIpOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPT0oY29uc3QgT3B0aW9uYWw8VD4mIGwsIE51bGxvcHRUKSB7CisgICAgcmV0dXJuICFsOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPT0oTnVsbG9wdFQsIGNvbnN0IE9wdGlvbmFsPFQ+JiByKSB7CisgICAgcmV0dXJuICFyOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPT0oY29uc3QgT3B0aW9uYWw8VD4mIGwsIGNvbnN0IFQmIHIpIHsKKyAgICByZXR1cm4gYm9vbChsKSAmJiAqbCA9PSByOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPT0oY29uc3QgVCYgbCwgY29uc3QgT3B0aW9uYWw8VD4mIHIpIHsKKyAgICByZXR1cm4gYm9vbChyKSAmJiBsID09ICpyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiYgbCwgY29uc3QgT3B0aW9uYWw8VD4mIHIpIHsKKyAgICByZXR1cm4gIShsID09IHIpOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yIT0oY29uc3QgT3B0aW9uYWw8VD4mIGwsIE51bGxvcHRUKSB7CisgICAgcmV0dXJuIGJvb2wobCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3IhPShOdWxsb3B0VCwgY29uc3QgT3B0aW9uYWw8VD4mIHIpIHsKKyAgICByZXR1cm4gYm9vbChyKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9wdGlvbmFsPFQ+JiBsLCBjb25zdCBUJiByKSB7CisgICAgcmV0dXJuICFsIHx8ICEoKmwgPT0gcik7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBUJiBsLCBjb25zdCBPcHRpb25hbDxUPiYgcikgeworICAgIHJldHVybiAhciB8fCAhKGwgPT0gKnIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IE9wdGlvbmFsPFQ+JiBsLCBjb25zdCBPcHRpb25hbDxUPiYgcikgeworICAgIHJldHVybiAhciA/IGZhbHNlIDogKCFsID8gdHJ1ZSA6ICpsIDwgKnIpOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPChjb25zdCBPcHRpb25hbDxUPiYsIE51bGxvcHRUKSB7CisgICAgcmV0dXJuIGZhbHNlOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPChOdWxsb3B0VCwgY29uc3QgT3B0aW9uYWw8VD4mIHIpIHsKKyAgICByZXR1cm4gYm9vbChyKTsKK30KK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBvcGVyYXRvcjwoY29uc3QgT3B0aW9uYWw8VD4mIGwsIGNvbnN0IFQmIHIpIHsKKyAgICByZXR1cm4gIWwgfHwgKmwgPCByOworfQordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yPChjb25zdCBUJiBsLCBjb25zdCBPcHRpb25hbDxUPiYgcikgeworICAgIHJldHVybiBib29sKHIpICYmIGwgPCAqcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9PcHRpb25hbF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9PcHRpb25hbF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiMTRiNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL09wdGlvbmFsX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQ2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvT3B0aW9uYWwuaCIKKworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChPcHRpb25hbCwgVHlwZVByb3BlcnRpZXMpIHsKKyAgICAvLyBNYWtpbmcgc3VyZSBvcHRpb25hbCBoYXMgdGhlIGNvcnJlY3QgYWxpZ25tZW50IGFuZCBkb2Vzbid0IHdhc3RlIHRvbyBtdWNoCisgICAgLy8gc3BhY2UKKworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKE9wdGlvbmFsPGJvb2w+KSA9PSAyLCAiYmFkIE9wdGlvbmFsPGJvb2w+IHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6YWxpZ25tZW50X29mPE9wdGlvbmFsPGJvb2w+Pjo6dmFsdWUgPT0KKyAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25tZW50X29mPGJvb2w+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYWQgT3B0aW9uYWw8Ym9vbD4gYWxpZ25tZW50Iik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihPcHRpb25hbDxjaGFyPikgPT0gMiwgImJhZCBPcHRpb25hbDxjaGFyPiBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmFsaWdubWVudF9vZjxPcHRpb25hbDxjaGFyPj46OnZhbHVlID09CisgICAgICAgICAgICAgICAgICBzdGQ6OmFsaWdubWVudF9vZjxjaGFyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiYmFkIE9wdGlvbmFsPGNoYXI+IGFsaWdubWVudCIpOworCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoT3B0aW9uYWw8aW50MTZfdD4pID09IDQsICJiYWQgT3B0aW9uYWw8aW50MTZfdD4gc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjphbGlnbm1lbnRfb2Y8T3B0aW9uYWw8aW50MTZfdD4+Ojp2YWx1ZSA9PQorICAgICAgICAgICAgICAgICAgc3RkOjphbGlnbm1lbnRfb2Y8aW50MTZfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImJhZCBPcHRpb25hbDxpbnQxNl90PiBhbGlnbm1lbnQiKTsKKworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKE9wdGlvbmFsPGludDMyX3Q+KSA9PSA4LCAiYmFkIE9wdGlvbmFsPGludDMyX3Q+IHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6YWxpZ25tZW50X29mPE9wdGlvbmFsPGludDMyX3Q+Pjo6dmFsdWUgPT0KKyAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25tZW50X29mPGludDMyX3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYWQgT3B0aW9uYWw8aW50MzJfdD4gYWxpZ25tZW50Iik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihPcHRpb25hbDxpbnQ2NF90PikgPT0gMTYsCisgICAgICAgICAgICAgICAgICAiYmFkIE9wdGlvbmFsPGludDY0X3Q+IHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6YWxpZ25tZW50X29mPE9wdGlvbmFsPGludDY0X3Q+Pjo6dmFsdWUgPT0KKyAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25tZW50X29mPGludDY0X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYWQgT3B0aW9uYWw8aW50NjRfdD4gYWxpZ25tZW50Iik7CisKKyAgICBzdHJ1Y3QgUzEyOCB7CisgICAgICAgIGludDY0X3QgZGF0YVsyXTsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoT3B0aW9uYWw8UzEyOD4pID09IDMqc2l6ZW9mKGludDY0X3QpLAorICAgICAgICAgICAgICAgICAgImJhZCBPcHRpb25hbDxTMTI4PiBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmFsaWdubWVudF9vZjxPcHRpb25hbDxTMTI4Pj46OnZhbHVlID09CisgICAgICAgICAgICAgICAgICBzdGQ6OmFsaWdubWVudF9vZjxTMTI4Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiYmFkIE9wdGlvbmFsPFMxMjg+IGFsaWdubWVudCIpOworfQorCitURVNUKE9wdGlvbmFsLCBDb25zdHJ1Y3RGcm9tVmFsdWUpIHsKKyAgICB7CisgICAgICAgIE9wdGlvbmFsPGludD4gbzsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8pOworICAgIH0KKyAgICB7CisgICAgICAgIE9wdGlvbmFsPGludD4gbyA9IHt9OworICAgICAgICBFWFBFQ1RfRkFMU0Uobyk7CisgICAgfQorICAgIHsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvID0ga051bGxvcHQ7CisgICAgICAgIEVYUEVDVF9GQUxTRShvKTsKKyAgICB9CisgICAgeworICAgICAgICBPcHRpb25hbDxpbnQ+IG8oMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG8pOworICAgICAgICBFWFBFQ1RfRVEoMSwgKm8pOworICAgIH0KKyAgICB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBzdGQ6OmRlY2F5PD4gY29uc3RydWN0b3IKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvID0gc3RhdGljX2Nhc3Q8Y29uc3Qgc2hvcnQmPigxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxLCAqbyk7CisgICAgfQorICAgIHsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvID0gMTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxLCAqbyk7CisgICAgfQorICAgIHsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvIHsgMSB9OworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKDEsICpvKTsKKyAgICB9CisgICAgeworICAgICAgICBzaG9ydCB2YWwgPSAxMDsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvID0gdmFsOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwLCAqbyk7CisgICAgfQorICAgIHsKKyAgICAgICAgT3B0aW9uYWw8c3RkOjp2ZWN0b3I8aW50Pj4gbyhrSW5wbGFjZSwgMTApOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKChzdGQ6OnZlY3RvcjxpbnQ+KDEwKSksICpvKTsKKyAgICB9CisgICAgeworICAgICAgICBPcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQ+PiBvKGtJbnBsYWNlLCB7MSwyLDMsNH0pOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKChzdGQ6OnZlY3RvcjxpbnQ+ezEsMiwzLDR9KSwgKm8pOworICAgIH0KK30KKworVEVTVChPcHRpb25hbCwgQ29uc3RydWN0RnJvbU9wdGlvbmFsKSB7CisgICAgeworICAgICAgICBPcHRpb25hbDxpbnQ+IG8gPSBPcHRpb25hbDxpbnQ+KCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShvKTsKKyAgICB9CisgICAgeworICAgICAgICBPcHRpb25hbDxzaG9ydD4gbzI7CisgICAgICAgIE9wdGlvbmFsPGludD4gbyhvMik7CisgICAgICAgIEVYUEVDVF9GQUxTRShvKTsKKyAgICB9CisgICAgeworICAgICAgICBPcHRpb25hbDxzaG9ydD4gbzIgPSA0MjsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvKG8yKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSg0MiwgKm8pOworICAgIH0KKyAgICB7CisgICAgICAgIE9wdGlvbmFsPGludD4gbyhPcHRpb25hbDxpbnQ+KDEpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxLCAqbyk7CisgICAgfQorICAgIHsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvMiA9IDI7CisgICAgICAgIE9wdGlvbmFsPGludD4gbyA9IG8yOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKDIsICpvKTsKKyAgICB9CisgICAgeworICAgICAgICBPcHRpb25hbDxzdGQ6OnZlY3RvcjxpbnQ+PiBvMiA9IHN0ZDo6dmVjdG9yPGludD57MjAsIDMwLCA0MH07CisgICAgICAgIE9wdGlvbmFsPHN0ZDo6dmVjdG9yPGludD4+IG8gPSBvMjsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgoc3RkOjp2ZWN0b3I8aW50PnsyMCwgMzAsIDQwfSksICpvKTsKKyAgICB9Cit9CisKK1RFU1QoT3B0aW9uYWwsIEFzc2lnbikgeworICAgIHsKKyAgICAgICAgT3B0aW9uYWw8aW50PiBvOworICAgICAgICBvID0gMTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxLCAqbyk7CisKKyAgICAgICAgbyA9IDI7CisgICAgICAgIEVYUEVDVF9UUlVFKG8pOworICAgICAgICBFWFBFQ1RfRVEoMiwgKm8pOworCisgICAgICAgIG8gPSBrTnVsbG9wdDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8pOworCisgICAgICAgIG8gPSBPcHRpb25hbDxpbnQ+KDEwKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxMCwgKm8pOworCisgICAgICAgIE9wdGlvbmFsPGludD4gbzI7CisgICAgICAgIG8gPSBvMjsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8pOworCisgICAgICAgIG8gPSAydTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgyLCAqbyk7CisKKyAgICAgICAgbyA9IE9wdGlvbmFsPHNob3J0PigpOworICAgICAgICBFWFBFQ1RfRkFMU0Uobyk7CisKKyAgICAgICAgbyA9IE9wdGlvbmFsPHNob3J0PigyMCk7CisgICAgICAgIEVYUEVDVF9UUlVFKG8pOworICAgICAgICBFWFBFQ1RfRVEoMjAsICpvKTsKKworICAgICAgICBPcHRpb25hbDxzaG9ydD4gbzMoMjAwKTsKKyAgICAgICAgbyA9IG8zOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKDIwMCwgKm8pOworCisgICAgICAgIG8gPSB7fTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8pOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBzdGQ6OmRlY2F5PD4gYXNzaWdubWVudAorICAgICAgICBvID0gc3RhdGljX2Nhc3Q8Y29uc3Qgc2hvcnQmPigxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobyk7CisgICAgICAgIEVYUEVDVF9FUSgxLCAqbyk7CisgICAgfQorfQorCitURVNUKE9wdGlvbmFsLCBNYWtlT3B0aW9uYWwpIHsKKyAgICB7CisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbCgxKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobyksIE9wdGlvbmFsPGludD4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAiQmFkIHR5cGUgZGVkdWN0aW9uIGluIG1ha2VPcHRpb25hbCgpIik7CisgICAgICAgIEVYUEVDVF9UUlVFKG8pOworICAgICAgICBFWFBFQ1RfRVEoMSwgKm8pOworICAgIH0KKyAgICB7CisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbChzdGQ6OnZlY3RvcjxjaGFyPnsnMScsICcyJ30pOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShvKSwgT3B0aW9uYWw8c3RkOjp2ZWN0b3I8Y2hhcj4+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIkJhZCB0eXBlIGRlZHVjdGlvbiBpbiBtYWtlT3B0aW9uYWwoKSIpOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX0VRKChzdGQ6OnZlY3RvcjxjaGFyPnsnMScsICcyJ30pLCAqbyk7CisgICAgfQorICAgIHsKKyAgICAgICAgLy8gY2hlY2sgc3RkOjpkZWNheTw+IGluIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbCgiU3RyaW5nIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG8pLCBPcHRpb25hbDxjb25zdCBjaGFyKj4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAiQmFkIHR5cGUgZGVkdWN0aW9uIGluIG1ha2VPcHRpb25hbCgpIik7CisgICAgICAgIEVYUEVDVF9UUlVFKG8pOworICAgICAgICBFWFBFQ1RfU1RSRVEoIlN0cmluZyIsICpvKTsKKyAgICB9Cit9CisKK1RFU1QoT3B0aW9uYWwsIE1vdmUpIHsKKyAgICBhdXRvIG8gPSBtYWtlT3B0aW9uYWwoc3RkOjp1bmlxdWVfcHRyPGludD4obmV3IGludCgxMCkpKTsKKyAgICB7CisgICAgICAgIGRlY2x0eXBlKG8pIG8yID0gc3RkOjptb3ZlKG8pOworICAgICAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobzIpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYm9vbCgqbykpOworICAgICAgICBFWFBFQ1RfVFJVRShib29sKCpvMikpOworICAgICAgICBFWFBFQ1RfRVEoMTAsICoqbzIpOworCisgICAgICAgIGRlY2x0eXBlKG8pIG8zOworICAgICAgICBvMyA9IHN0ZDo6bW92ZShvMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG8yKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobzMpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYm9vbCgqbzIpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYm9vbCgqbzMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwLCAqKm8zKTsKKworICAgICAgICBvMyA9IHN0ZDo6bW92ZShvMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG8yKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobzMpOworICAgICAgICBFWFBFQ1RfRkFMU0UoYm9vbCgqbzIpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGJvb2woKm8zKSk7CisgICAgfQorCisgICAgeworICAgICAgICBkZWNsdHlwZShvKSBvMTsKKyAgICAgICAgZGVjbHR5cGUobykgbzIgPSBzdGQ6Om1vdmUobzEpOworICAgICAgICBFWFBFQ1RfRkFMU0UobzEpOworICAgICAgICBFWFBFQ1RfRkFMU0UobzIpOworCisgICAgICAgIG8yID0gc3RkOjptb3ZlKG8xKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8xKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG8yKTsKKworICAgICAgICBkZWNsdHlwZShvKSBvMyB7a0lucGxhY2UsIG5ldyBpbnQoMjApfTsKKyAgICAgICAgbzMgPSBzdGQ6Om1vdmUobzEpOworICAgICAgICBFWFBFQ1RfRkFMU0UobzEpOworICAgICAgICBFWFBFQ1RfRkFMU0UobzMpOworICAgIH0KK30KKworVEVTVChPcHRpb25hbCwgVmFsdWUpIHsKKyAgICBhdXRvIG8gPSBtYWtlT3B0aW9uYWwoMSk7CisgICAgRVhQRUNUX0VRKDEsIG8udmFsdWUoKSk7CisgICAgRVhQRUNUX0VRKDEsIG8udmFsdWVPcigyKSk7CisKKyAgICBvID0ga051bGxvcHQ7CisgICAgRVhQRUNUX0VRKDIsIG8udmFsdWVPcigyKSk7Cit9CisKK1RFU1QoT3B0aW9uYWwsIENsZWFyKSB7CisgICAgYXV0byBvID0gbWFrZU9wdGlvbmFsKDEpOworICAgIG8uY2xlYXIoKTsKKyAgICBFWFBFQ1RfRkFMU0Uobyk7CisKKyAgICBvLmNsZWFyKCk7CisgICAgRVhQRUNUX0ZBTFNFKG8pOworfQorCitURVNUKE9wdGlvbmFsLCBFbXBsYWNlKSB7CisgICAgYXV0byBvID0gbWFrZU9wdGlvbmFsKHN0ZDo6dmVjdG9yPGludD57MSwyLDMsNH0pOworICAgIG8uZW1wbGFjZSgzLCAxKTsKKyAgICBFWFBFQ1RfVFJVRShvKTsKKyAgICBFWFBFQ1RfRVEoKHN0ZDo6dmVjdG9yPGludD57MSwxLDF9KSwgKm8pOworICAgIEVYUEVDVF9FUSgzLCBvLT5jYXBhY2l0eSgpKTsKKworICAgIG8uY2xlYXIoKTsKKyAgICBvLmVtcGxhY2UoezEsMn0pOworICAgIEVYUEVDVF9UUlVFKG8pOworICAgIEVYUEVDVF9FUSgoc3RkOjp2ZWN0b3I8aW50PnsxLDJ9KSwgKm8pOworICAgIEVYUEVDVF9FUSgyLCBvLT5jYXBhY2l0eSgpKTsKK30KKworVEVTVChPcHRpb25hbCwgUmVzZXQpIHsKKyAgICBhdXRvIG8gPSBtYWtlT3B0aW9uYWwoc3RkOjp2ZWN0b3I8aW50PnsxLDIsMyw0fSk7CisgICAgby5yZXNldChzdGQ6OnZlY3RvcjxpbnQ+ezQsM30pOworICAgIEVYUEVDVF9UUlVFKG8pOworICAgIEVYUEVDVF9FUSgoc3RkOjp2ZWN0b3I8aW50Pns0LDN9KSwgKm8pOworICAgIEVYUEVDVF9FUSgyLCBvLT5jYXBhY2l0eSgpKTsKKworICAgIG8uY2xlYXIoKTsKKyAgICBvLnJlc2V0KHN0ZDo6dmVjdG9yPGludD57MX0pOworICAgIEVYUEVDVF9FUSgoc3RkOjp2ZWN0b3I8aW50PnsxfSksICpvKTsKKyAgICBFWFBFQ1RfRVEoMSwgby0+Y2FwYWNpdHkoKSk7Cit9CisKK1RFU1QoT3B0aW9uYWwsIENvbXBhcmVFcXVhbCkgeworICAgIEVYUEVDVF9UUlVFKG1ha2VPcHRpb25hbCgxKSA9PSBtYWtlT3B0aW9uYWwoMSkpOworICAgIEVYUEVDVF9UUlVFKG1ha2VPcHRpb25hbCgxKSA9PSAxKTsKKyAgICBFWFBFQ1RfVFJVRSgxID09IG1ha2VPcHRpb25hbCgxKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgxKSA9PSBtYWtlT3B0aW9uYWwoMikpOworICAgIEVYUEVDVF9GQUxTRShtYWtlT3B0aW9uYWwoMikgPT0gMSk7CisgICAgRVhQRUNUX0ZBTFNFKDIgPT0gbWFrZU9wdGlvbmFsKDEpKTsKKyAgICBFWFBFQ1RfVFJVRShtYWtlT3B0aW9uYWwoMSkgIT0gbWFrZU9wdGlvbmFsKDIpKTsKKyAgICBFWFBFQ1RfVFJVRShtYWtlT3B0aW9uYWwoMSkgIT0gMik7CisgICAgRVhQRUNUX1RSVUUoMSAhPSBtYWtlT3B0aW9uYWwoMikpOworCisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgxKSA9PSBrTnVsbG9wdCk7CisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgxKSA9PSBPcHRpb25hbDxpbnQ+KCkpOworICAgIEVYUEVDVF9GQUxTRShrTnVsbG9wdCA9PSBtYWtlT3B0aW9uYWwoMSkpOworICAgIEVYUEVDVF9GQUxTRShPcHRpb25hbDxpbnQ+KCkgPT0gbWFrZU9wdGlvbmFsKDEpKTsKKyAgICBFWFBFQ1RfVFJVRShtYWtlT3B0aW9uYWwoMSkgIT0ga051bGxvcHQpOworICAgIEVYUEVDVF9UUlVFKG1ha2VPcHRpb25hbCgxKSAhPSBPcHRpb25hbDxpbnQ+KCkpOworICAgIEVYUEVDVF9UUlVFKGtOdWxsb3B0ICE9IG1ha2VPcHRpb25hbCgxKSk7CisgICAgRVhQRUNUX1RSVUUoT3B0aW9uYWw8aW50PigpICE9IG1ha2VPcHRpb25hbCgxKSk7CisKKyAgICBFWFBFQ1RfVFJVRShrTnVsbG9wdCA9PSBPcHRpb25hbDxpbnQ+KCkpOworICAgIEVYUEVDVF9UUlVFKGtOdWxsb3B0ID09IE9wdGlvbmFsPGNoYXIqPigpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoa051bGxvcHQgIT0gT3B0aW9uYWw8aW50PigpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoa051bGxvcHQgIT0gT3B0aW9uYWw8Y2hhcio+KCkpOworICAgIEVYUEVDVF9UUlVFKE9wdGlvbmFsPGludD4oKSA9PSBPcHRpb25hbDxpbnQ+KCkpOworICAgIEVYUEVDVF9GQUxTRShPcHRpb25hbDxpbnQ+KCkgIT0gT3B0aW9uYWw8aW50PigpKTsKK30KKworVEVTVChPcHRpb25hbCwgQ29tcGFyZUxlc3MpIHsKKyAgICBFWFBFQ1RfVFJVRShtYWtlT3B0aW9uYWwoMSkgPCBtYWtlT3B0aW9uYWwoMikpOworICAgIEVYUEVDVF9UUlVFKDEgPCBtYWtlT3B0aW9uYWwoMikpOworICAgIEVYUEVDVF9UUlVFKG1ha2VPcHRpb25hbCgxKSA8IDIpOworCisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgxKSA8IG1ha2VPcHRpb25hbCgxKSk7CisgICAgRVhQRUNUX0ZBTFNFKDEgPCBtYWtlT3B0aW9uYWwoMSkpOworICAgIEVYUEVDVF9GQUxTRShtYWtlT3B0aW9uYWwoMSkgPCAxKTsKKyAgICBFWFBFQ1RfRkFMU0UobWFrZU9wdGlvbmFsKDIpIDwgbWFrZU9wdGlvbmFsKDEpKTsKKyAgICBFWFBFQ1RfRkFMU0UoMiA8IG1ha2VPcHRpb25hbCgxKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgyKSA8IDEpOworCisgICAgRVhQRUNUX1RSVUUoa051bGxvcHQgPCBtYWtlT3B0aW9uYWwoMikpOworICAgIEVYUEVDVF9UUlVFKE9wdGlvbmFsPGludD4oKSA8IG1ha2VPcHRpb25hbCgyKSk7CisgICAgRVhQRUNUX1RSVUUoT3B0aW9uYWw8aW50PigpIDwgMik7CisgICAgRVhQRUNUX0ZBTFNFKG1ha2VPcHRpb25hbCgyKSA8IGtOdWxsb3B0KTsKKyAgICBFWFBFQ1RfRkFMU0UobWFrZU9wdGlvbmFsKDIpIDwgT3B0aW9uYWw8aW50PigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoMiA8IE9wdGlvbmFsPGludD4oKSk7CisKKyAgICBFWFBFQ1RfRkFMU0Uoa051bGxvcHQgPCBPcHRpb25hbDxpbnQ+KCkpOworICAgIEVYUEVDVF9GQUxTRShPcHRpb25hbDxpbnQ+KCkgPCBrTnVsbG9wdCk7Cit9CisKK1RFU1QoT3B0aW9uYWwsIERlc3RydWN0aW9uKSB7CisgICAgLy8gY3JlYXRlIGEgcmVmZXJlbmNlIGNvdW50aW5nIGNsYXNzIHRvIGNoZWNrIGlmIHdlIGRlbGV0ZSBldmVyeXRoaW5nCisgICAgLy8gd2UndmUgY3JlYXRlZAorICAgIHN0cnVjdCBUcmFjayB7CisgICAgICAgIFRyYWNrKGludCYgdmFsKSA6IG1WYWwodmFsKSB7CisgICAgICAgICAgICArK21WYWwuZ2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgVHJhY2soc3RkOjppbml0aWFsaXplcl9saXN0PGludCo+IHZhbHMpIDogbVZhbCgqKnZhbHMuYmVnaW4oKSkgeworICAgICAgICAgICAgKyttVmFsLmdldCgpOworICAgICAgICB9CisgICAgICAgIFRyYWNrKGNvbnN0IFRyYWNrJiBvdGhlcikgOiBtVmFsKG90aGVyLm1WYWwpIHsKKyAgICAgICAgICAgICsrbVZhbC5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICBUcmFjayhUcmFjayYmIG90aGVyKSA6IG1WYWwob3RoZXIubVZhbCkgeworICAgICAgICAgICAgKyttVmFsLmdldCgpOworICAgICAgICB9CisgICAgICAgIFRyYWNrJiBvcGVyYXRvcj0oY29uc3QgVHJhY2smIG90aGVyKSB7CisgICAgICAgICAgICAtLW1WYWwuZ2V0KCk7CisgICAgICAgICAgICBtVmFsID0gb3RoZXIubVZhbDsKKyAgICAgICAgICAgICsrbVZhbC5nZXQoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBUcmFjayYgb3BlcmF0b3I9KFRyYWNrJiYgb3RoZXIpIHsKKyAgICAgICAgICAgIC0tbVZhbC5nZXQoKTsKKyAgICAgICAgICAgIG1WYWwgPSBvdGhlci5tVmFsOworICAgICAgICAgICAgKyttVmFsLmdldCgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgflRyYWNrKCkgeworICAgICAgICAgICAgLS1tVmFsLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpyZWZlcmVuY2Vfd3JhcHBlcjxpbnQ+IG1WYWw7CisgICAgfTsKKworICAgIGludCBjb3VudGVyID0gMDsKKyAgICB7CisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbChUcmFjayhjb3VudGVyKSk7CisgICAgICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIpOworCisgICAgeworICAgICAgICBhdXRvIG8gPSBtYWtlT3B0aW9uYWwoVHJhY2soY291bnRlcikpOworICAgICAgICBFWFBFQ1RfRVEoMSwgY291bnRlcik7CisgICAgICAgIG8uY2xlYXIoKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcik7CisKKyAgICB7CisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbChUcmFjayhjb3VudGVyKSk7CisgICAgICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyKTsKKyAgICAgICAgaW50IGNvdW50ZXIyID0gMDsKKyAgICAgICAgby5lbXBsYWNlKGNvdW50ZXIyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIpOworICAgICAgICBFWFBFQ1RfRVEoMSwgY291bnRlcjIpOworICAgICAgICBvID0gVHJhY2soY291bnRlcik7CisgICAgICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIyKTsKKworICAgICAgICBhdXRvIG8yID0gbzsKKyAgICAgICAgRVhQRUNUX0VRKDIsIGNvdW50ZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgY291bnRlcjIpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcik7CisKKyAgICB7CisgICAgICAgIGF1dG8gbyA9IG1ha2VPcHRpb25hbChUcmFjayhjb3VudGVyKSk7CisgICAgICAgIGF1dG8gbzIgPSBzdGQ6Om1vdmUobyk7CisgICAgICAgIEVYUEVDVF9FUSgyLCBjb3VudGVyKTsKKyAgICAgICAgbyA9IG8yOworICAgICAgICBFWFBFQ1RfRVEoMiwgY291bnRlcik7CisgICAgfQorICAgIEVYUEVDVF9FUSgwLCBjb3VudGVyKTsKKworICAgIGludCBjb3VudGVyMiA9IDA7CisgICAgeworICAgICAgICBPcHRpb25hbDxUcmFjaz4gbzsKKyAgICAgICAgby5lbXBsYWNlKGNvdW50ZXIpOworICAgICAgICBFWFBFQ1RfRVEoMSwgY291bnRlcik7CisKKyAgICAgICAgby5lbXBsYWNlKGNvdW50ZXIyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIpOworICAgICAgICBFWFBFQ1RfRVEoMSwgY291bnRlcjIpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcik7CisgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIyKTsKKworICAgIHsKKyAgICAgICAgT3B0aW9uYWw8VHJhY2s+IG87CisgICAgICAgIG8uZW1wbGFjZSh7JmNvdW50ZXJ9KTsKKyAgICAgICAgRVhQRUNUX0VRKDEsIGNvdW50ZXIpOworCisgICAgICAgIGNvdW50ZXIyID0gMDsKKyAgICAgICAgby5lbXBsYWNlKHsmY291bnRlcjJ9KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIpOworICAgICAgICBFWFBFQ1RfRVEoMSwgY291bnRlcjIpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgY291bnRlcik7CisgICAgRVhQRUNUX0VRKDAsIGNvdW50ZXIyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZmQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmcuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBbGlhcyB1c2VkIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuIFJlbW92ZSB0aGlzIGhlYWRlciBvbmNlIGFsbCBjbGllbnQKKy8vIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuIHRvIHVzZSBzdGQ6OnN0cmluZyBkaXJlY3RseS4KK3VzaW5nIFN0cmluZyA9IHN0ZDo6c3RyaW5nOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjE3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitzdGQ6OnN0cmluZyBTdHJpbmdGb3JtYXRSYXcoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBhdXRvIHJlc3VsdCA9IFN0cmluZ0Zvcm1hdFdpdGhBcmdzKGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIFN0cmluZ0Zvcm1hdFdpdGhBcmdzKGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIFN0cmluZ0FwcGVuZEZvcm1hdFdpdGhBcmdzKCZyZXN1bHQsIGZvcm1hdCwgYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBTdHJpbmdBcHBlbmRGb3JtYXRSYXcoc3RkOjpzdHJpbmcqIHN0cmluZywgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBTdHJpbmdBcHBlbmRGb3JtYXRXaXRoQXJncyhzdHJpbmcsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIFN0cmluZ0FwcGVuZEZvcm1hdFdpdGhBcmdzKHN0ZDo6c3RyaW5nKiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKSB7CisgICAgc2l6ZV90IGN1cl9zaXplID0gc3RyaW5nLT5zaXplKCk7CisgICAgc2l6ZV90IGV4dHJhID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHZhX2xpc3QgYXJnczI7CisgICAgICAgIHZhX2NvcHkoYXJnczIsIGFyZ3MpOworICAgICAgICBpbnQgcmV0ID0gdnNucHJpbnRmKCYoKnN0cmluZylbY3VyX3NpemVdLCBleHRyYSwgZm9ybWF0LCBhcmdzMik7CisgICAgICAgIHZhX2VuZChhcmdzMik7CisKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgcmV0X3N6ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpOworICAgICAgICAgICAgaWYgKGV4dHJhID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBwYXNzLCByZXNpemUgdGhlIHN0cmluZyBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgICAgIGV4dHJhID0gcmV0X3N6ICsgMTsKKyAgICAgICAgICAgICAgICBzdHJpbmctPnJlc2l6ZShjdXJfc2l6ZSArIGV4dHJhKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXRfc3ogPCBleHRyYSkgeworICAgICAgICAgICAgICAgIC8vIFNlY29uZCBwYXNzIG9yIGxhdGVyLCBzdWNjZXNzIQorICAgICAgICAgICAgICAgIHN0cmluZy0+cmVzaXplKGN1cl9zaXplICsgcmV0X3N6KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiBUaGUgTVNWQ1JULkRMTCBpbXBsZW1lbnRhdGlvbiBvZiBzbnByaW50ZigpIGlzIGJyb2tlbiBhbmQKKyAgICAgICAgLy8gd2lsbCByZXR1cm4gLTEgaW4gY2FzZSBvZiB0cnVuY2F0aW9uLiBUaGlzIGNvZGUgcGF0aCBpcyB0YWtlbgorICAgICAgICAvLyB3aGVuIHRoaXMgaGFwcGVucywgb3Igd2hlbiB8cmV0X3N6fCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbgorICAgICAgICAvLyB8ZXh0cmF8LiBHcm93IHRoZSBidWZmZXIgdG8gYWxsb3cgZm9yIG1vcmUgcm9vbSwgdGhlbiB0cnkgYWdhaW4uCisgICAgICAgIGV4dHJhICs9IChleHRyYSA+PiAxKSArIDMyOworICAgICAgICBzdHJpbmctPnJlc2l6ZShjdXJfc2l6ZSArIGV4dHJhKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIHVucGFja0Zvcm1hdEFyZyhTdHJpbmdWaWV3IHN0cikgeworICAgIHJldHVybiBzdHIuY19zdHIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTJmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBDcmVhdGUgYSBuZXcgc3RyaW5nIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHByaW50Zi1zdHlsZSBmb3JtYXR0ZWQKKy8vIG91dHB1dCBmcm9tIHxmb3JtYXR8IGFuZCBwb3RlbnRpYWxseSBhbnkgZm9sbG93aW5nIGFyZ3VtZW50cy4KK3N0ZDo6c3RyaW5nIFN0cmluZ0Zvcm1hdFJhdyhjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIEEgdmFyaWFudCBvZiBTdHJpbmdGb3JtYXQoKSB3aGljaCB1c2VzIGEgdmFfbGlzdCB0byBsaXN0IGZvcm1hdHRpbmcKKy8vIHBhcmFtZXRlcnMgaW5zdGVhZC4KK3N0ZDo6c3RyaW5nIFN0cmluZ0Zvcm1hdFdpdGhBcmdzKGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKKworLy8gQXBwZW5kcyBhIGZvcm1hdHRlZCBzdHJpbmcgYXQgdGhlIGVuZCBvZiBhbiBleGlzdGluZyBzdHJpbmcuCisvLyB8c3RyaW5nfCBpcyB0aGUgdGFyZ2V0IHN0cmluZyBpbnN0YW5jZSwgfGZvcm1hdHwgdGhlIGZvcm1hdCBzdHJpbmcsCisvLyBmb2xsb3dlZCBieSBhbnkgZm9ybWF0dGluZyBwYXJhbWV0ZXJzLiBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKy8vIGFwcGVuZGluZyB0aGUgcmVzdWx0IG9mIFN0cmluZ0Zvcm1hdChmb3JtYXQsLi4uKSB0byB8KnN0cmluZ3wgZGlyZWN0bHkuCit2b2lkIFN0cmluZ0FwcGVuZEZvcm1hdFJhdyhzdGQ6OnN0cmluZyogc3RyaW5nLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIEEgdmFyaWFudCBvZiBTdHJpbmdBcHBlbmRGb3JtYXQoKSB0aGF0IHRha2VzIGEgdmFfbGlzdCB0byBsaXN0CisvLyBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCit2b2lkIFN0cmluZ0FwcGVuZEZvcm1hdFdpdGhBcmdzKHN0ZDo6c3RyaW5nKiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKKworLy8gdW5wYWNrRm9ybWF0QXJnKCkgaXMgYSBzZXQgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbnMgbmVlZGVkIHRvIHVucGFjaworLy8gYW4gYXJndW1lbnQgb2YgdGhlIGZvcm1hdHRpbmcgbGlzdCB0byBhIFBPRCB2YWx1ZSB3aGljaCBjYW4gYmUgcGFzc2VkCisvLyBpbnRvIHRoZSBzcHJpbnRmKCktbGlrZSBDIGZ1bmN0aW9uCisKKy8vIEFueXRoaW5nIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBhIHN0cmluZyB2aWV3IGdvZXMgaGVyZSBhbmQgdW5wYWNrcworLy8gaW50byBhIGNvbnN0IGNoYXIqCitjb25zdCBjaGFyKiB1bnBhY2tGb3JtYXRBcmcoU3RyaW5nVmlldyBzdHIpOworCisvLyBGb3J3YXJkIGFsbCBQT0RzIGFzLWlzCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QmJiB1bnBhY2tGb3JtYXRBcmcoVCYmIHQsCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvZDx0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlPjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgPjo6dHlwZSogPSBudWxscHRyKSB7CisgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPih0KTsKK30KKworLy8gVGhlc2UgdGVtcGxhdGVkIHZlcnNpb25zIG9mIFN0cmluZ0Zvcm1hdCooKSBhbGxvdyBvbmUgdG8gcGFzcyBhbGwga2luZHMgb2YKKy8vIHN0cmluZyBvYmplY3RzIGludG8gdGhlIGFyZ3VtZW50IGxpc3QKK3RlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorc3RkOjpzdHJpbmcgU3RyaW5nRm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICByZXR1cm4gU3RyaW5nRm9ybWF0UmF3KGZvcm1hdCwgdW5wYWNrRm9ybWF0QXJnKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKSkuLi4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KK3ZvaWQgU3RyaW5nQXBwZW5kRm9ybWF0KHN0ZDo6c3RyaW5nKiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBcmdzJiYuLi4gYXJncykgeworICAgIFN0cmluZ0FwcGVuZEZvcm1hdFJhdyhzdHJpbmcsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrRm9ybWF0QXJnKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKSkuLi4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTk3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKFN0cmluZ0Zvcm1hdCwgRW1wdHlTdHJpbmcpIHsKKyAgICBzdGQ6OnN0cmluZyBzID0gU3RyaW5nRm9ybWF0KCIiKTsKKyAgICBFWFBFQ1RfVFJVRShzLmVtcHR5KCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgcy5jX3N0cigpKTsKK30KKworVEVTVChTdHJpbmdGb3JtYXQsIFNpbXBsZVN0cmluZykgeworICAgIHN0ZDo6c3RyaW5nIHMgPSBTdHJpbmdGb3JtYXQoImZvb2JhciIpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vYmFyIiwgcy5jX3N0cigpKTsKK30KKworVEVTVChTdHJpbmdGb3JtYXQsIFNpbXBsZURlY2ltYWwpIHsKKyAgICBzdGQ6OnN0cmluZyBzID0gU3RyaW5nRm9ybWF0KCJQaSBpcyBhYm91dCAlZC4lZFxuIiwgMywgMTQxNSk7CisgICAgRVhQRUNUX1NUUkVRKCJQaSBpcyBhYm91dCAzLjE0MTVcbiIsIHMuY19zdHIoKSk7Cit9CisKK1RFU1QoU3RyaW5nRm9ybWF0LCBWZXJ5TG9uZ1N0cmluZykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtQaWVjZVtdID0gIkEgaG9zcGl0YWwgYmVkIGlzIGEgcGFya2VkIHRheGkgd2l0aCB0aGUgbWV0ZXIgcnVubmluZyAtIEdyb3VjaG8gTWFyeC4gIjsKKyAgICBjb25zdCBzaXplX3Qga1BpZWNlTGVuID0gc2l6ZW9mKGtQaWVjZSkgLSAxVTsKKyAgICBzdGQ6OnN0cmluZyBzID0gU3RyaW5nRm9ybWF0KCIlcyVzJXMlcyVzJXMlcyIsIGtQaWVjZSwga1BpZWNlLCBrUGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUGllY2UsIGtQaWVjZSwga1BpZWNlLCBrUGllY2UpOworICAgIEVYUEVDVF9FUSg3VSAqIGtQaWVjZUxlbiwgcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgN1U7ICsrbikgeworICAgICAgICBzdGQ6OnN0cmluZyBzMiA9IHN0ZDo6c3RyaW5nKHMuY19zdHIoKSArIG4gKiBrUGllY2VMZW4sIGtQaWVjZUxlbik7CisgICAgICAgIEVYUEVDVF9TVFJFUShrUGllY2UsIHMyLmNfc3RyKCkpIDw8ICJJbmRleCAjIiA8PCBuOworICAgIH0KK30KKworVEVTVChTdHJpbmdBcHBlbmRGb3JtYXQsIEVtcHR5U3RyaW5nKSB7CisgICAgc3RkOjpzdHJpbmcgcyA9ICJmb28iOworICAgIFN0cmluZ0FwcGVuZEZvcm1hdCgmcywgIiIpOworICAgIEVYUEVDVF9FUSgzVSwgcy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vIiwgcy5jX3N0cigpKTsKK30KKworVEVTVChTdHJpbmdBcHBlbmRGb3JtYXQsIFNpbXBsZVN0cmluZykgeworICAgIHN0ZDo6c3RyaW5nIHMgPSAiZm9vIjsKKyAgICBTdHJpbmdBcHBlbmRGb3JtYXQoJnMsICJiYXIiKTsKKyAgICBFWFBFQ1RfRVEoNlUsIHMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvb2JhciIsIHMuY19zdHIoKSk7Cit9CisKK1RFU1QoU3RyaW5nQXBwZW5kRm9ybWF0LCBWZXJ5TG9uZ1N0cmluZykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtQaWVjZVtdID0gIkEgaG9zcGl0YWwgYmVkIGlzIGEgcGFya2VkIHRheGkgd2l0aCB0aGUgbWV0ZXIgcnVubmluZyAtIEdyb3VjaG8gTWFyeC4gIjsKKyAgICBjb25zdCBzaXplX3Qga1BpZWNlTGVuID0gc2l6ZW9mKGtQaWVjZSkgLSAxVTsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTI7CisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdCgmcywgIiVzIiwga1BpZWNlKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoa0NvdW50ICoga1BpZWNlTGVuLCBzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBzdGQ6OnN0cmluZyBzMiA9IHN0ZDo6c3RyaW5nKHMuY19zdHIoKSArIG4gKiBrUGllY2VMZW4sIGtQaWVjZUxlbik7CisgICAgICAgIEVYUEVDVF9TVFJFUShrUGllY2UsIHMyLmNfc3RyKCkpIDw8ICJJbmRleCAjIiA8PCBuOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmYTc5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ1BhcnNlLmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nUGFyc2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2Vsc2UKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgX19BUFBMRV9fCisjaW5jbHVkZSA8eGxvY2FsZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2lmZGVmIF9XSU4zMgorCitTdHJpbmdWaWV3IGZpeFN0cmluZ0ZvckZsb2F0cyhTdHJpbmdWaWV3IHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZpZXcgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZpeGVkU3RyaW5nKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGZsb2F0aW5nUG9pbnRGb3JtYXRzW11bM10gPSB7IiVmIiwgIiVnIiwgIiVhIiwgIiVFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWUifTsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgZGVjaW1hbERvdCA9ICcuJzsKKyAgICBjb25zdCBTdHJpbmdWaWV3IGRlY2ltYWxQb2ludCA9IGxvY2FsZWNvbnYoKS0+ZGVjaW1hbF9wb2ludDsKKyAgICBpZiAoZGVjaW1hbFBvaW50ID09ICIuIikgeworICAgICAgICByZXR1cm4gc3RyaW5nOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgaGFzRGVjaW1hbERvdCA9CisgICAgICAgICAgICBzdGQ6OmZpbmQoc3RyaW5nLmJlZ2luKCksIHN0cmluZy5lbmQoKSwgZGVjaW1hbERvdCk7CisgICAgaWYgKCFoYXNEZWNpbWFsRG90KSB7CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBoYXNGbG9hdGluZ1BvaW50Rm9ybWF0ID0gc3RkOjphbnlfb2YoCisgICAgICAgICAgICBzdGQ6OmJlZ2luKGZsb2F0aW5nUG9pbnRGb3JtYXRzKSwgc3RkOjplbmQoZmxvYXRpbmdQb2ludEZvcm1hdHMpLAorICAgICAgICAgICAgW2Zvcm1hdF0oY29uc3QgY2hhcigmZnApWzNdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdC5lbmQoKSAhPSBzdGQ6OnNlYXJjaChmb3JtYXQuYmVnaW4oKSwgZm9ybWF0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiZWdpbihmcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByZXYoc3RkOjplbmQoZnApKSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIWhhc0Zsb2F0aW5nUG9pbnRGb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIHJlcGxhY2UgdGhlICcuJyB3aXRoIHdoYXRldmVyIHdlJ3ZlIGdvdCBpbiB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgZm9yIChjb25zdCBjaGFyIGMgOiBzdHJpbmcpIHsKKyAgICAgICAgaWYgKGMgPT0gZGVjaW1hbERvdCkgeworICAgICAgICAgICAgZml4ZWRTdHJpbmctPmFwcGVuZChkZWNpbWFsUG9pbnQuYmVnaW4oKSwgZGVjaW1hbFBvaW50LmVuZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpeGVkU3RyaW5nLT5wdXNoX2JhY2soYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICpmaXhlZFN0cmluZzsKK30KKworI2Vsc2UgIC8vICFfV0lOMzIKKworc3RydWN0IEdsb2JhbENMb2NhbGVUIHsKKyAgICBsb2NhbGVfdCB2YWx1ZSA9IG5ld2xvY2FsZShMQ19BTExfTUFTSywgIkMiLCAobG9jYWxlX3QpMCk7Cit9Oworc3RhdGljIExhenlJbnN0YW5jZTxHbG9iYWxDTG9jYWxlVD4gc0dsb2JhbENMb2NhbGU7CisKKyNlbmRpZiAgLy8gIV9XSU4zMgorCitleHRlcm4gIkMiIGludCBTc2NhbmZXaXRoQ0xvY2FsZShjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgY29uc3QgaW50IHJlcyA9IDo6U3NjYW5mV2l0aENMb2NhbGVXaXRoQXJncyhzdHJpbmcsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByZXM7Cit9CisKK2V4dGVybiAiQyIgaW50IFNzY2FuZldpdGhDTG9jYWxlV2l0aEFyZ3MoY29uc3QgY2hhciogc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXJncykgeworI2lmZGVmIF9XSU4zMgorCisgICAgLy8gTWluR1cgZG9lc24ndCBpbXBsZW1lbnQgcGVyLXRocmVhZCBsb2NhbGVzLCBhbmQgaXQncyBqdXN0IHRvbyBkYW5nZXJvdXMKKyAgICAvLyB0byBjaGFuZ2UgZ2xvYmFsIGxvY2FsZSBmb3IgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZS4KKyAgICAvLyBUaGF0J3Mgd2h5IGxldCdzIGRvIGl0IGRpZmZlcmVudGx5OiBpZiB0aGUgZmxvYXRpbmcgcG9pbnQgc2VwYXJhdG9yIGlzbid0CisgICAgLy8gJy4nLCBhbmQgdGhlcmUncyBhICVmLyVnLyVhIGluIHRoZSBmb3JtYXQgc3RyaW5nLCByZXBsYWNlIHRoZSBpbmNvbWluZworICAgIC8vIGRvdCB3aXRoIHRoZSBleHBlY3RlZCBkZWNpbWFsIHNlcGFyYXRvciBpbiB8c3RyaW5nfC4KKworICAgIHN0ZDo6c3RyaW5nIGZpeGVkU3RyaW5nOworICAgIHN0cmluZyA9IGZpeFN0cmluZ0ZvckZsb2F0cyhzdHJpbmcsIGZvcm1hdCwgJmZpeGVkU3RyaW5nKS5jX3N0cigpOworCisjZWxzZSAgLy8gIV9XSU4zMgorCisgICAgY29uc3QgYXV0byBsb2NhbGUgPSBzR2xvYmFsQ0xvY2FsZS0+dmFsdWU7CisgICAgY29uc3QgYXV0byBzY29wZWRDTG9jYWxlID0gbWFrZUN1c3RvbVNjb3BlZFB0cigKKyAgICAgICAgICAgIGxvY2FsZSA/IHVzZWxvY2FsZShsb2NhbGUpIDogbnVsbHB0ciwgdXNlbG9jYWxlKTsKKworI2VuZGlmICAvLyAhX1dJTjMyCisgICAgcmV0dXJuIHZzc2NhbmYoc3RyaW5nLCBmb3JtYXQsIGFyZ3MpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ1BhcnNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGEyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIEMgYW5kIEMrKyByZXBsYWNlbWVudHMgZm9yIHNjYW5mIHRvIHBhcnNlIGEgc3RyaW5nIGluIGEKKy8vIGxvY2FsZS1pbmRlcGVuZGVudCB3YXkuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGFyc2luZyBpbnB1dCBkYXRhIHRoYXQgY29tZXMKKy8vIG5vdCBmcm9tIHVzZXIsIGJ1dCBmcm9tIHNvbWUga2luZCBvZiBhIGZpeGVkIHByb3RvY29sIHdpdGggcHJlZGVmaW5lZCBsb2NhbGUKKy8vIHNldHRpbmdzLgorLy8gSnVzdCB1c2UgdGhlc2UgZnVuY3Rpb25zIGFzIGRyb3AtaW4gcmVwbGFjZW1lbnRzIG9mIHNzY2FuZigpOworLy8KKy8vIE5vdGUxOiBpZiB0aGUgaW5wdXQgc3RyaW5nIGNvbnRhaW5zIGFueSBkb3QgY2hhcmFjdGVycyBvdGhlciB0aGFuIGRlY2ltYWwKKy8vIHNlcGFyYXRvcnMsIHRoZSByZXN1bHRzIG9mIHBhcnNpbmcgd2lsbCBiZSBzY3Jld2VkOiBpbiBXaW5kb3dzIHRoZQorLy8gaW1wbGVtZW50YXRpb24gcmVwbGFjZXMgYWxsIGRvdHMgd2l0aCB0aGUgY3VycmVudCBkZWNpbWFsIHNlcGFyYXRvciB0byBwYXJzZQorLy8gdXNpbmcgY3VycmVudCBsb2NhbGUuCisvLyBOb3RlMjogY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBhcnNpbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyAtCisvLyBubyBjb2RlIGZvciBtb25ldGFyeSB2YWx1ZXMsIGRhdGVzLCBkaWdpdCBncm91cGluZyBldGMuCisvLyBUaGUgbGltaXRhdGlvbiBpcyBiZWNhdXNlIG9mIE1pbkdXJ3MgbGFjayBvZiBwZXItdGhyZWFkIGxvY2FsZXMgc3VwcG9ydC4KKy8vCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK2ludCBTc2NhbmZXaXRoQ0xvY2FsZShjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKK2ludCBTc2NhbmZXaXRoQ0xvY2FsZVdpdGhBcmdzKGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdzKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KK2ludCBTc2NhbmZXaXRoQ0xvY2FsZShjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGZvcm1hdCwgQXJncy4uLiBhcmdzKSB7CisgICAgcmV0dXJuIDo6U3NjYW5mV2l0aENMb2NhbGUoc3RyaW5nLCBmb3JtYXQsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwZDFjNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ1BhcnNlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdQYXJzZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvRnVuY3RvclRocmVhZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1V0aWxzLmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitzdGF0aWMgdm9pZCB0ZXN0U2NhbmYoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgY29tbWFbXSA9ICIxLDMiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGRvdFtdID0gIjEuMyI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W10gPSAiJWYlbiI7CisgICAgZmxvYXQgdmFsID0gMDsKKyAgICBpbnQgbiA9IDA7CisKKyAgICAvLyBOb3cgbWFrZSBzdXJlIHdlIHBhcnNlIGZsb2F0aW5nIHBvaW50IHN0cmluZ3MgYXMgZXhwZWN0ZWQuCisgICAgRVhQRUNUX0VRKDEsIHNzY2FuZihkb3QsIGZvcm1hdCwgJnZhbCwgJm4pKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoMSwgdmFsKTsKKyAgICBFWFBFQ1RfRVEoMSwgbik7CisgICAgRVhQRUNUX0VRKDEsIHNzY2FuZihjb21tYSwgZm9ybWF0LCAmdmFsLCAmbikpOworICAgIEVYUEVDVF9GTE9BVF9FUSgxLjMsIHZhbCk7CisgICAgRVhQRUNUX0VRKDMsIG4pOworCisgICAgLy8gQy1Mb2NhbGUgcGFyc2luZyBzaG91bGQgYmUgYWJsZSB0byBwYXJzZSBzdHJpbmdzIHdpdGggQyBsb2NhbGUKKyAgICBFWFBFQ1RfRVEoMSwgU3NjYW5mV2l0aENMb2NhbGUoZG90LCBmb3JtYXQsICZ2YWwsICZuKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKDEuMywgdmFsKTsKKyAgICBFWFBFQ1RfRVEoMywgbik7CisKKyAgICAvLyBBbmQgdGhlIHJlZ3VsYXIgcGFyc2luZyBzdGlsbCB3b3JrcyBhcyBpdCB1c2VkIHRvLgorICAgIEVYUEVDVF9FUSgxLCBzc2NhbmYoZG90LCBmb3JtYXQsICZ2YWwsICZuKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKDEsIHZhbCk7CisgICAgRVhQRUNUX0VRKDEsIG4pOworICAgIEVYUEVDVF9FUSgxLCBzc2NhbmYoY29tbWEsIGZvcm1hdCwgJnZhbCwgJm4pKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoMS4zLCB2YWwpOworICAgIEVYUEVDVF9FUSgzLCBuKTsKK30KKworVEVTVChTdHJpbmdQYXJzZSwgU3NjYW5mV2l0aENMb2NhbGUpIHsKKyAgICBhdXRvIHNjb3BlZENvbW1hTG9jYWxlID0gc2V0U2NvcGVkQ29tbWFMb2NhbGUoKTsKKyAgICB0ZXN0U2NhbmYoKTsKK30KKworVEVTVChTdHJpbmdQYXJzZSwgU3NjYW5mV2l0aENMb2NhbGVUaHJlYWRzKSB7CisgICAgYXV0byBzY29wZWRDb21tYUxvY2FsZSA9IHNldFNjb3BlZENvbW1hTG9jYWxlKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RnVuY3RvclRocmVhZD4+IHRocmVhZHM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgKytpKSB7CisgICAgICAgIHRocmVhZHMuZW1wbGFjZV9iYWNrKG5ldyBGdW5jdG9yVGhyZWFkKCZ0ZXN0U2NhbmYpKTsKKyAgICB9CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkcykgeworICAgICAgICBBU1NFUlRfVFJVRSh0LT5zdGFydCgpKTsKKyAgICB9CisgICAgZm9yIChhdXRvJiB0IDogdGhyZWFkcykgeworICAgICAgICBBU1NFUlRfVFJVRSh0LT53YWl0KCkpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NzIyMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworaW50IFN0cmluZ1ZpZXc6OmNvbXBhcmUoY29uc3QgU3RyaW5nVmlldyYgb3RoZXIpIGNvbnN0IHsKKyAgICBzaXplX3QgbWluU2l6ZSA9IHN0ZDo6bWluKG1TaXplLCBvdGhlci5zaXplKCkpOworICAgIGlmIChtaW5TaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIG1TaXplIDwgb3RoZXIuc2l6ZSgpID8gLTEgOiAobVNpemUgPiBvdGhlci5zaXplKCkgPyArMSA6IDApOworICAgIH0KKyAgICBpbnQgcmV0ID0gbWVtY21wKG1TdHJpbmcsIG90aGVyLnN0cigpLCBtaW5TaXplKTsKKyAgICBpZiAocmV0KSByZXR1cm4gcmV0OworICAgIGlmIChtU2l6ZSA8IG90aGVyLnNpemUoKSkgcmV0dXJuIC0xOworICAgIGlmIChtU2l6ZSA+IG90aGVyLnNpemUoKSkgcmV0dXJuICsxOworICAgIHJldHVybiAwOworfQorCitib29sIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nVmlldyYgeCwgY29uc3QgU3RyaW5nVmlldyYgeSkgeworICAgIGlmICh4LnNpemUoKSAhPSB5LnNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBtZW1jbXAoeC5zdHIoKSwgeS5zdHIoKSwgeC5zaXplKCkpID09IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzFmODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgKQEAgLTAsMCArMSwxODYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQSBTdHJpbmdWaWV3IGlzIGEgc2ltcGxlIChhZGRyZXNzLCBzaXplKSBwYWlyIHRoYXQgcG9pbnRzIHRvIGFuCisvLyBleGlzdGluZyByZWFkLW9ubHkgc3RyaW5nLiBJdCdzIGEgY29udmVuaWVuY2UgY2xhc3MgdXNlZCB0byBoaWRkZW4KKy8vIGNyZWF0aW9uIG9mIHN0ZDo6c3RyaW5nKCkgb2JqZWN0cyB1bi1uZWNlc3NhcmlseS4KKy8vCisvLyBDb25zaWRlciB0aGUgdHdvIGZvbGxvd2luZyBmdW5jdGlvbnM6CisvLworLy8gICAgIHNpemVfdCAgY291bnQxKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKy8vICAgICAgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisvLyAgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc3RyLnNpemUoKTsgKytuKSB7CisvLyAgICAgICAgICAgICAgaWYgKHN0cltuXSA9PSAnMScpIHsKKy8vICAgICAgICAgICAgICAgICAgY291bnQrKzsKKy8vICAgICAgICAgICAgICB9CisvLyAgICAgICAgIH0KKy8vICAgICB9CisvLworLy8gICAgIHNpemVfdCAgY291bnQyKGNvbnN0IFN0cmluZ1ZpZXcmIHN0cikgeworLy8gICAgICAgICBzaXplX3QgcmVzdWx0ID0gMDsKKy8vICAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzdHIuc2l6ZSgpOyArK24pIHsKKy8vICAgICAgICAgICAgICBpZiAoc3RyW25dID09ICcyJykgeworLy8gICAgICAgICAgICAgICAgICBjb3VudCsrOworLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgfQorLy8gICAgIH0KKy8vCisvLyBUaGVuIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FsbHM6CisvLworLy8gICAgICAgc2l6ZV90IG4xID0gY291bnQxKCJUaGVyZSBpcyAxIG9uZSBpbiB0aGlzIHN0cmluZyEiKTsKKy8vICAgICAgIHNpemVfdCBuMiA9IGNvdW50MigiSSBjYW4gY291bnQgMiB0b28iKTsKKy8vCisvLyBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGNvbXBpbGVyIHdpbGwgc2lsZW50bHkgY3JlYXRlIGEgdGVtcG9yYXJ5CisvLyBzdGQ6OnN0cmluZyBvYmplY3QsIGNvcHkgdGhlIGlucHV0IHN0cmluZyBpbnRvIGl0IChhbGxvY2F0aW5nIG1lbW9yeSBpbgorLy8gdGhlIGhlYXApLCBjYWxsIGNvdW50MSgpIGFuZCBkZXN0cm95IHRoZSBzdGQ6OnN0cmluZyB1cG9uIGl0cyByZXR1cm4uCisvLworLy8gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgY29tcGlsZXIgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgU3RyaW5nVmlldywKKy8vIGluaXRpYWxpemUgaXQgdHJpdmlhbGx5IGJlZm9yZSBjYWxsaW5nIGNvdW50MigpLCB0aGlzIHJlc3VsdHMgaW4KKy8vIG11Y2ggbGVzcyBnZW5lcmF0ZWQgY29kZSwgYXMgd2VsbCBhcyBiZXR0ZXIgcGVyZm9ybWFuY2UuCisvLworLy8gR2VuZXJhbGx5IHNwZWFraW5nLCBhbHdheXMgdXNlIGEgcmVmZXJlbmNlIG9yIHBvaW50ZXIgdG8gU3RyaW5nVmlldworLy8gaW5zdGVhZCBvZiBhIHN0ZDo6c3RyaW5nIGlmIHlvdXIgZnVuY3Rpb24gb3IgbWV0aG9kIGRvZXNuJ3QgbmVlZCB0byBtb2RpZnkKKy8vIGl0cyBpbnB1dC4KKy8vCitjbGFzcyBTdHJpbmdWaWV3IHsKK3B1YmxpYzoKKyAgICBjb25zdGV4cHIgU3RyaW5nVmlldygpIDogbVN0cmluZygiIiksIG1TaXplKDBVKSB7fQorCisgICAgY29uc3RleHByIFN0cmluZ1ZpZXcoY29uc3QgU3RyaW5nVmlldyYgb3RoZXIpIDoKKyAgICAgICAgbVN0cmluZyhvdGhlci5kYXRhKCkpLCBtU2l6ZShvdGhlci5zaXplKCkpIHt9CisKKyAgICAvLyBJTVBPUlRBTlQ6IGFsbCBTdHJpbmdWaWV3IGNvbnN0cnVjdG9ycyBhcmUgaW50ZW50aW9uYWxseSBub3QgZXhwbGljdAorICAgIC8vIGl0IGlzIG5lZWRlZCB0byBhbGxvdyBzZWFtbGVzcyBjcmVhdGlvbiBvZiBTdHJpbmdWaWV3IGZyb20gYWxsIHR5cGVzCisgICAgLy8gb2Ygc3RyaW5ncyBhcm91bmQgLSBhcyBpdCdzIGludGVuZGVkIHRvIGJlIGEgZ2VuZXJpYyBzdHJpbmcgd3JhcHBlcgorCisgICAgLy8gQSBjb25zdGV4cHIgY29uc3RydWN0b3IgZnJvbSBhIGNvbnN0YW50IGJ1ZmZlciwgaW5pdGlhbGl6aW5nIHxtU2l6ZXwKKyAgICAvLyBhcyB3ZWxsLiBUaGlzIGFsbG93cyBvbmUgdG8gZGVjbGFyZSBhIHN0YXRpYyBjb25zdCBTdHJpbmdWaWV3IGluc3RhbmNlCisgICAgLy8gYW5kIGluaXRpYWxpemUgaXQgYXQgY29tcGlsZSB0aW1lLCB3aXRoIG5vIHJ1bnRpbWUgb3ZlcmhlYWQ6CisgICAgLy8KKyAgICAvLyBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcgbWVzc2FnZSA9ICJibGFoIjsKKyAgICAvLworICAgIHRlbXBsYXRlIDxzaXplX3Qgc2l6ZT4KKyAgICBjb25zdGV4cHIgU3RyaW5nVmlldyhjb25zdCBjaGFyICgmYnVmKVtzaXplXSkgOgorICAgICAgICBtU3RyaW5nKGJ1ZiksIG1TaXplKHNpemUgLSAxKSB7fQorCisgICAgLy8gQ29uc3RydWN0b3IgZnJvbSBhIGNvbnN0IGNoYXIgcG9pbnRlci4gSXQgaGFzIHRvIGJlIHRlbXBsYXRlZCB0byBtYWtlCisgICAgLy8gc3VyZSB0aGUgYXJyYXktYmFzZWQgb25lIGlzIGNob3NlbiBmb3IgYW4gYXJyYXkgLSBvdGhlcndpc2Ugbm9uLXRlbXBsYXRlZAorICAgIC8vIG92ZXJsb2FkIGFsd2F5cyB3aW5zCisgICAgLy8gTm90ZTogdGhlIHBhcmFtZXRlciB0eXBlIGlzIGEgY29uc3QgcmVmZXJlbmNlIHRvIGEgY29uc3QgcG9pbnRlci4gVGhpcworICAgIC8vICAgaXMgdG8gbWFrZSB0aGlzIG92ZXJsb2FkIGEgcG9vcmVyIGNob2ljZSBmb3IgdGhlIGNhc2Ugb2YgYW4gYXJyYXkuIEZvcgorICAgIC8vICAgdGhlICdjb25zdCBjaGFyW10nIGFyZ3VtZW50IGJvdGggJ3JlZmVyZW5jZSB0byBhbiBhcnJheScgYW5kICdwb2ludGVyJworICAgIC8vICAgb3ZlcmxvYWRzIGFyZSB0aWVkLCBzbyBjb21waWxlciBjYW4ndCBjaG9vc2Ugd2l0aG91dCBoZWxwCisgICAgdGVtcGxhdGUgPGNsYXNzIENoYXIsIGNsYXNzID0gZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxDaGFyLCBjaGFyPj4+CisgICAgY29uc3RleHByIFN0cmluZ1ZpZXcoY29uc3QgQ2hhciogY29uc3QgJiBzdHJpbmcpIDoKKyAgICAgICAgICAgIG1TdHJpbmcoc3RyaW5nID8gc3RyaW5nIDogIiIpLCBtU2l6ZShzdHJpbmcgPyBzdHJsZW4oc3RyaW5nKSA6IDApIHt9CisKKyAgICBTdHJpbmdWaWV3KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIDoKKyAgICAgICAgbVN0cmluZyhzdHIuY19zdHIoKSksIG1TaXplKHN0ci5zaXplKCkpIHt9CisKKyAgICBjb25zdGV4cHIgU3RyaW5nVmlldyhjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pCisgICAgICAgIDogbVN0cmluZyhzdHIgPyBzdHIgOiAiIiksIG1TaXplKGxlbikge30KKworICAgIGNvbnN0ZXhwciBTdHJpbmdWaWV3KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpCisgICAgICAgIDogbVN0cmluZyhiZWdpbiA/IGJlZ2luIDogIiIpLCBtU2l6ZShiZWdpbiA/IGVuZCAtIGJlZ2luIDogMCkge30KKworICAgIGNvbnN0ZXhwciBTdHJpbmdWaWV3KHN0ZDo6bnVsbHB0cl90KSA6CisgICAgICAgICAgICBtU3RyaW5nKCIiKSwgbVNpemUoMCkge30KKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmc7IH0KKyAgICBjb25zdGV4cHIgY29uc3QgY2hhciogc3RyKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZzsgfQorICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbVN0cmluZzsgfQorICAgIGNvbnN0ZXhwciBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisKKyAgICB0eXBlZGVmIGNvbnN0IGNoYXIqIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgY29uc3QgY2hhciogY29uc3RfaXRlcmF0b3I7CisKKyAgICBjb25zdGV4cHIgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtU3RyaW5nOyB9CisgICAgY29uc3RleHByIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmcgKyBtU2l6ZTsgfQorCisgICAgY29uc3RleHByIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiAhc2l6ZSgpOyB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICBtU2l6ZSA9IDA7CisgICAgICAgIG1TdHJpbmcgPSAiIjsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgY2hhciBvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0cmluZ1tpbmRleF07CisgICAgfQorCisgICAgdm9pZCBzZXQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgeworICAgICAgICBtU3RyaW5nID0gZGF0YSA/IGRhdGEgOiAiIjsKKyAgICAgICAgbVNpemUgPSBsZW47CisgICAgfQorCisgICAgdm9pZCBzZXQoY29uc3QgY2hhciogc3RyKSB7CisgICAgICAgIG1TdHJpbmcgPSBzdHIgPyBzdHIgOiAiIjsKKyAgICAgICAgbVNpemUgPSA6OnN0cmxlbihtU3RyaW5nKTsKKyAgICB9CisKKyAgICB2b2lkIHNldChjb25zdCBTdHJpbmdWaWV3JiBvdGhlcikgeworICAgICAgICBtU3RyaW5nID0gb3RoZXIubVN0cmluZzsKKyAgICAgICAgbVNpemUgPSBvdGhlci5tU2l6ZTsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHdpdGggYW5vdGhlciBTdHJpbmdWaWV3LgorICAgIGludCBjb21wYXJlKGNvbnN0IFN0cmluZ1ZpZXcmIG90aGVyKSBjb25zdDsKKworICAgIFN0cmluZ1ZpZXcmIG9wZXJhdG9yPShjb25zdCBTdHJpbmdWaWV3JiBvdGhlcikgeworICAgICAgICBzZXQob3RoZXIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gQ29udmVydCB0byBzdGQ6OnN0cmluZyB3aGVuIG5lZWRlZC4KKyAgICBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6c3RyaW5nKG1TdHJpbmcsIG1TaXplKTsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIG1TdHJpbmc7CisgICAgc2l6ZV90IG1TaXplOworfTsKKworLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuIERlZmluZWQgYXMgZnVuY3Rpb25zIHRvIGFsbG93IGF1dG9tYXRpYyB0eXBlCisvLyBjb252ZXJzaW9ucyB3aXRoIEMgc3RyaW5ncyBhbmQgc3RkOjpzdHJpbmcgb2JqZWN0cy4KKworYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmluZ1ZpZXcmIHkpOworCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmluZ1ZpZXcmIHkpIHsKKyAgICByZXR1cm4gISh4ID09IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3RyaW5nVmlldyYgeCwgY29uc3QgU3RyaW5nVmlldyYgeSkgeworICAgIHJldHVybiB4LmNvbXBhcmUoeSkgPCAwOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmluZ1ZpZXcmIHkpIHsKKyAgICByZXR1cm4gISh4IDwgeSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yID4oY29uc3QgU3RyaW5nVmlldyYgeCwgY29uc3QgU3RyaW5nVmlldyYgeSkgeworICAgIHJldHVybiB4LmNvbXBhcmUoeSkgPiAwOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFN0cmluZ1ZpZXcmIHgsIGNvbnN0IFN0cmluZ1ZpZXcmIHkpIHsKKyAgICByZXR1cm4gISh4ID4geSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvU3RyaW5nVmlld191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9TdHJpbmdWaWV3X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjcwMGEyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvU3RyaW5nVmlld191bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChTdHJpbmdWaWV3LCBJbml0RW1wdHkpIHsKKyAgICBTdHJpbmdWaWV3IHZpZXc7CisgICAgRVhQRUNUX1RSVUUodmlldy5lbXB0eSgpKTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBJbml0V2l0aENTdHJpbmcpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1N0cmluZyA9ICJIZWxsbyI7CisgICAgU3RyaW5nVmlldyB2aWV3KGtTdHJpbmcpOworICAgIEVYUEVDVF9TVFJFUShrU3RyaW5nLCB2aWV3LnN0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0Uodmlldy5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RybGVuKGtTdHJpbmcpLCB2aWV3LnNpemUoKSk7Cit9CisKK1RFU1QoU3RyaW5nVmlldywgSW5pdFdpdGhDb25zdEJ1ZmZlcikgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdHJpbmdbXSA9ICJIZWxsbyI7CisgICAgU3RyaW5nVmlldyB2aWV3KGtTdHJpbmcpOworICAgIEVYUEVDVF9TVFJFUShrU3RyaW5nLCB2aWV3LnN0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0Uodmlldy5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RybGVuKGtTdHJpbmcpLCB2aWV3LnNpemUoKSk7Cit9CisKK25hbWVzcGFjZSB7CisgICAgLy8gSnVzdCBhIHRlc3QgY2xhc3Mgd2hpY2ggbmVlZHMgY29tcGlsZS10aW1lIGNvbnN0YW50IGFzIGFuIGFncnVtZW50CisgICAgdGVtcGxhdGUgPGludCBOPgorICAgIHN0cnVjdCBjaGVja0NvbnN0IHsKKyAgICAgICAgY2hlY2tDb25zdCgpIHsKKyAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiTiA9ICIgPDwgTiA8PCAnLyc7CisgICAgICAgIH0KKyAgICB9OworfQorCitURVNUKFN0cmluZ1ZpZXcsIEluaXRDb25zdGV4cHIpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1N0cmluZ1ZpZXcgPSAiSGVsbG8iOworCisgICAgLy8gdGhlc2UgbGluZXMgY29tcGlsZSBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudAorICAgIGNoZWNrQ29uc3Q8a1N0cmluZ1ZpZXdbMF0+IGNoZWNrZXIxOworICAgIGNoZWNrQ29uc3Q8a1N0cmluZ1ZpZXcuY19zdHIoKVsxXT4gY2hlY2tlcjI7CisgICAgY2hlY2tDb25zdDxrU3RyaW5nVmlldy5iZWdpbigpWzJdPiBjaGVja2VyMzsKKyAgICBjaGVja0NvbnN0PGtTdHJpbmdWaWV3LnNpemUoKT4gY2hlY2tlcjQ7CisgICAgY2hlY2tDb25zdDxrU3RyaW5nVmlldy5lbXB0eSgpPiBjaGVja2VyNTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBJbml0V2l0aFN0cmluZ1ZpZXcpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrU3RyaW5nW10gPSAiSGVsbG8yIjsKKyAgICBTdHJpbmdWaWV3IHZpZXcxKGtTdHJpbmcpOworICAgIFN0cmluZ1ZpZXcgdmlldzIodmlldzEpOworICAgIEVYUEVDVF9GQUxTRSh2aWV3Mi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa1N0cmluZywgdmlldzIuc3RyKCkpOworICAgIEVYUEVDVF9FUShzdHJsZW4oa1N0cmluZyksIHZpZXcyLnNpemUoKSk7Cit9CisKK1RFU1QoU3RyaW5nVmlldywgQ2xlYXIpIHsKKyAgICBTdHJpbmdWaWV3IHZpZXcoIkhlbGxvMyIpOworICAgIEVYUEVDVF9GQUxTRSh2aWV3LmVtcHR5KCkpOworICAgIHZpZXcuY2xlYXIoKTsKKyAgICBFWFBFQ1RfVFJVRSh2aWV3LmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwVSwgdmlldy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgdmlldy5zdHIoKSk7Cit9CisKK1RFU1QoU3RyaW5nVmlldywgU2V0RW1wdHkpIHsKKyAgICBTdHJpbmdWaWV3IHZpZXcoIkhlbGxvNCIpOworICAgIHZpZXcuc2V0KCIiKTsKKyAgICBFWFBFQ1RfVFJVRSh2aWV3LmVtcHR5KCkpOworfQorCitURVNUKFN0cmluZ1ZpZXcsIFNldEVtcHR5V2l0aExlbmd0aCkgeworICAgIFN0cmluZ1ZpZXcgdmlldygiSGVsbG81Iik7CisgICAgdmlldy5zZXQoIk9vcHMiLCAwVSk7CisgICAgRVhQRUNUX1RSVUUodmlldy5lbXB0eSgpKTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBTZXRXaXRoQ1N0cmluZykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdHJpbmdbXSA9ICJXb3ciOworICAgIFN0cmluZ1ZpZXcgdmlldygiSGVsbG82Iik7CisgICAgdmlldy5zZXQoa1N0cmluZyk7CisgICAgRVhQRUNUX0VRKGtTdHJpbmcsIHZpZXcuc3RyKCkpOworICAgIEVYUEVDVF9FUShzdHJsZW4oa1N0cmluZyksIHZpZXcuc2l6ZSgpKTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBTZXRXaXRoU3RyaW5nVmlldykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdHJpbmdbXSA9ICJXYXp6YSI7CisgICAgU3RyaW5nVmlldyB2aWV3MShrU3RyaW5nKTsKKyAgICBTdHJpbmdWaWV3IHZpZXcoIk5vcGUiKTsKKyAgICB2aWV3LnNldCh2aWV3MSk7CisgICAgRVhQRUNUX0VRKGtTdHJpbmcsIHZpZXcuc3RyKCkpOworICAgIEVYUEVDVF9FUShzdHJsZW4oa1N0cmluZyksIHZpZXcuc2l6ZSgpKTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBPcGVyYXRvckF0KSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0cmluZ1tdID0gIldoYXRldmVyIjsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTdHJpbmdMZW4gPSBzaXplb2Yoa1N0cmluZykgLSAxOworICAgIFN0cmluZ1ZpZXcgdmlldyhrU3RyaW5nKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtTdHJpbmdMZW47ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa1N0cmluZ1tuXSwgdmlld1tuXSkgPDwgImF0IGluZGV4ICIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU3RyaW5nVmlldywgSXRlcmF0b3JzKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1N0cmluZ1tdID0gIldoYXQgZWxzZT8iOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1N0cmluZ0xlbiA9IHNpemVvZihrU3RyaW5nKSAtIDE7CisgICAgU3RyaW5nVmlldyB2aWV3KGtTdHJpbmcpOworICAgIEVYUEVDVF9FUShrU3RyaW5nLCB2aWV3LmJlZ2luKCkpOworICAgIEVYUEVDVF9FUShrU3RyaW5nICsga1N0cmluZ0xlbiwgdmlldy5lbmQoKSk7CisKKyAgICBzaXplX3QgbiA9IDA7CisgICAgZm9yIChTdHJpbmdWaWV3Ojpjb25zdF9pdGVyYXRvciBpdCA9IHZpZXcuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IHZpZXcuZW5kKCk7ICsraXQsICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa1N0cmluZ1tuXSwgKml0KTsKKyAgICB9Cit9CisKK1RFU1QoU3RyaW5nVmlldywgQ29tcGFyaXNvbk9wZXJhdG9ycykgeworICAgIGNoYXIga0hlbGxvMVtdID0gIkhlbGxvIjsKKyAgICBjaGFyIGtIZWxsbzJbXSA9ICJIZWxsbyI7CisgICAgU3RyaW5nVmlldyB2aWV3MShrSGVsbG8xKTsKKyAgICBTdHJpbmdWaWV3IHZpZXcyKGtIZWxsbzIpOworICAgIEVYUEVDVF9UUlVFKHZpZXcxID09IHZpZXcyKTsKKyAgICBFWFBFQ1RfRkFMU0UodmlldzEgIT0gdmlldzIpOworICAgIEVYUEVDVF9UUlVFKHZpZXcxIDw9IHZpZXcyKTsKKyAgICBFWFBFQ1RfVFJVRSh2aWV3MSA+PSB2aWV3Mik7CisgICAgRVhQRUNUX0ZBTFNFKHZpZXcxIDwgdmlldzIpOworICAgIEVYUEVDVF9GQUxTRSh2aWV3MSA+IHZpZXcyKTsKKworICAgIFN0cmluZ1ZpZXcgdmlldzMoImhlbGwiKTsgIC8vIFNob3J0ZXIsIGJ1dCBmaXJzdCBjaGFyIGlzIGxhcmdlci4KKyAgICBFWFBFQ1RfRkFMU0UodmlldzEgPT0gdmlldzMpOworICAgIEVYUEVDVF9UUlVFKHZpZXcxICE9IHZpZXczKTsKKyAgICBFWFBFQ1RfVFJVRSh2aWV3MSA8IHZpZXczKTsKKyAgICBFWFBFQ1RfVFJVRSh2aWV3MSA8PSB2aWV3Myk7CisgICAgRVhQRUNUX0ZBTFNFKHZpZXcxID4gdmlldzMpOworICAgIEVYUEVDVF9GQUxTRSh2aWV3MSA+PSB2aWV3Myk7CisKKyAgICBTdHJpbmdWaWV3IHZpZXc0KCJIZWxsIik7ICAvLyBTaG9ydGVyLCBidXQgZmlyc3QgY2hhciBpcyBzbWFsbGVyLgorICAgIEVYUEVDVF9GQUxTRSh2aWV3MSA9PSB2aWV3NCk7CisgICAgRVhQRUNUX1RSVUUodmlldzEgIT0gdmlldzQpOworICAgIEVYUEVDVF9GQUxTRSh2aWV3MSA8IHZpZXc0KTsKKyAgICBFWFBFQ1RfRkFMU0UodmlldzEgPD0gdmlldzQpOworICAgIEVYUEVDVF9UUlVFKHZpZXcxID4gdmlldzQpOworICAgIEVYUEVDVF9UUlVFKHZpZXcxID49IHZpZXc0KTsKKworICAgIEVYUEVDVF9FUShTdHJpbmdWaWV3KCIiKSwgU3RyaW5nVmlldygiIikpOworICAgIEVYUEVDVF9HRShTdHJpbmdWaWV3KCIiKSwgU3RyaW5nVmlldygiIikpOworICAgIEVYUEVDVF9HVChTdHJpbmdWaWV3KCIxIiksIFN0cmluZ1ZpZXcoIiIpKTsKKyAgICBFWFBFQ1RfR0UoU3RyaW5nVmlldygiMSIpLCBTdHJpbmdWaWV3KCIiKSk7CisgICAgRVhQRUNUX0xUKFN0cmluZ1ZpZXcoIiIpLCBTdHJpbmdWaWV3KCIyIikpOworICAgIEVYUEVDVF9MRShTdHJpbmdWaWV3KCIiKSwgU3RyaW5nVmlldygiMiIpKTsKK30KKworVEVTVChTdHJpbmdWaWV3LCBDb21wYXJlKSB7CisgICAgLy8gZW1wdHkgc3RyaW5nCisgICAgRVhQRUNUX0VRKFN0cmluZ1ZpZXcoIiIpLmNvbXBhcmUoU3RyaW5nVmlldygiIikpLCAwKTsKKyAgICBFWFBFQ1RfR1QoU3RyaW5nVmlldygiMSIpLmNvbXBhcmUoU3RyaW5nVmlldygiIikpLCAwKTsKKyAgICBFWFBFQ1RfTFQoU3RyaW5nVmlldygiIikuY29tcGFyZShTdHJpbmdWaWV3KCIyIikpLCAwKTsKKworICAgIC8vIG5vbi1lbXB0eSBzdHJpbmdzLCBzYW1lIGxlbmd0aAorICAgIEVYUEVDVF9FUShTdHJpbmdWaWV3KCIxIikuY29tcGFyZShTdHJpbmdWaWV3KCIxIikpLCAwKTsKKyAgICBFWFBFQ1RfR1QoU3RyaW5nVmlldygiMiIpLmNvbXBhcmUoU3RyaW5nVmlldygiMSIpKSwgMCk7CisgICAgRVhQRUNUX0xUKFN0cmluZ1ZpZXcoIjEiKS5jb21wYXJlKFN0cmluZ1ZpZXcoIjIiKSksIDApOworCisgICAgLy8gbm9uLWVtcHR5IHN0cmluZ3MsIGZpcnN0IHNob3J0ZXIKKyAgICBFWFBFQ1RfR1QoU3RyaW5nVmlldygiMiIpLmNvbXBhcmUoU3RyaW5nVmlldygiMTIiKSksIDApOworICAgIEVYUEVDVF9MVChTdHJpbmdWaWV3KCIxIikuY29tcGFyZShTdHJpbmdWaWV3KCIxMSIpKSwgMCk7CisKKyAgICAvLyBub24tZW1wdHkgc3RyaW5ncywgZmlyc3QgbG9uZ2VyCisgICAgRVhQRUNUX0dUKFN0cmluZ1ZpZXcoIjExIikuY29tcGFyZShTdHJpbmdWaWV3KCIxIikpLCAwKTsKKyAgICBFWFBFQ1RfTFQoU3RyaW5nVmlldygiMTIiKS5jb21wYXJlKFN0cmluZ1ZpZXcoIjIiKSksIDApOworfQorCisvLyBUT0RPKGRpZ2l0KTogU3RyaW5nCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVHlwZVRyYWl0cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVHlwZVRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDg1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSBkZXRhaWxzIHsKKworLy8gYSBzaW1wbGUgaGVscGVyIGNsYXNzIGZvciBTRklOQUUgYmVsb3cuCit0ZW1wbGF0ZSA8Y2xhc3MgWCA9IHZvaWQ+CitzdHJ1Y3QgZHVtbXkgeworICAgIHVzaW5nIHR5cGUgPSBYOworfTsKKworfSAgLy8gbmFtZXNwYWNlcyBkZXRhaWxzCisKKy8vIGFkZCBzb21lIGNvbnZlbmllbmNlIHNob3J0Y3V0cyBmb3IgYW4gb3Zlcmx5IGNvbXBsZXggc3RkOjplbmFibGVfaWYgc3ludGF4CisKKy8vIFVzZSAnZW5hYmxlX2lmPFByZWRpY2F0ZSxUeXBlPicgaW5zdGVhZCBvZgorLy8gJ3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPFByZWRpY2F0ZTo6dmFsdWUsVHlwZT46OnR5cGUnCit0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlLCBjbGFzcyBUeXBlID0gdm9pZCo+Cit1c2luZyBlbmFibGVfaWYgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxQcmVkaWNhdGU6OnZhbHVlLCBUeXBlPjo6dHlwZTsKKworLy8gVXNlICdlbmFibGVfaWZfYzxCb29sZWFuRmxhZyxUeXBlPicgaW5zdGVhZCBvZgorLy8gJ3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPEJvb2xlYW5GbGFnLFR5cGU+Ojp0eXBlJwordGVtcGxhdGUgPGJvb2wgcHJlZGljYXRlLCBjbGFzcyBUeXBlID0gdm9pZCo+Cit1c2luZyBlbmFibGVfaWZfYyA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHByZWRpY2F0ZSwgVHlwZT46OnR5cGU7CisKKy8vIFVzZSAnZW5hYmxlX2lmX2NvbnZlcnRpYmxlPEZyb20sVG8sVHlwZT4nIGluc3RlYWQgb2YKKy8vICd0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPEZyb20sVG8+Ojp2YWx1ZSwgVHlwZT46OnR5cGUnCit0ZW1wbGF0ZSA8Y2xhc3MgRnJvbSwgY2xhc3MgVG8sIGNsYXNzIFR5cGUgPSB2b2lkKj4KK3VzaW5nIGVuYWJsZV9pZl9jb252ZXJ0aWJsZSA9IGVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPEZyb20sIFRvPj47CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBIHByZWRpY2F0ZSBmb3IgY2hlY2tpbmcgaWYgc29tZSBvYmplY3QgaXMgY2FsbGFibGUgd2l0aCBhIHNwZWNpZmljCisvLyBzaWduYXR1cmUuIEV4YW1wbGVzOgorLy8KKy8vICAgICBpc19jYWxsYWJsZV9hczxpbnQsIHZvaWQoKT46OnZhbHVlID09IGZhbHNlLgorLy8gICAgIGlzX2NhbGxhYmxlX2FzPHN0cmNtcCwgdm9pZCgpPjo6dmFsdWUgPT0gZmFsc2UuCisvLyAgICAgaXNfY2FsbGFibGVfYXM8c3RyY21wLCBpbnQoY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKT46OnZhbHVlID09IHRydWUKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRiwgY2xhc3MgU2lnbmF0dXJlLCBjbGFzcyBYID0gdm9pZD4KK3N0cnVjdCBpc19jYWxsYWJsZV9hcyA6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBpcyBTRklOQUUtZCBvdXQgaWYgdGVtcGxhdGUgYXJndW1lbnRzIGNhbid0IGJlIGNvbWJpbmVkCisvLyBpbnRvIGEgY2FsbCBleHByZXNzaW9uIEYoKSwgb3IgaWYgdGhlIHJlc3VsdCBvZiB0aGF0IGNhbGwgaXMgbm90IHxSfAordGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIFI+CitzdHJ1Y3QgaXNfY2FsbGFibGVfYXM8CisgICAgICAgIEYsCisgICAgICAgIFIoKSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbHM6OmR1bW15PGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGPigpKCkpPjo6dHlwZSwKKyAgICAgICAgICAgICAgICBSPjo6dmFsdWU+Ojp0eXBlPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCisvLyBPbmUgbW9yZSBzcGVjaWFsaXphdGlvbiwgZm9yIG5vbiBlbXB0eSBhcmd1bWVudCBsaXN0Cit0ZW1wbGF0ZSA8Y2xhc3MgRiwgY2xhc3MgUiwgY2xhc3MuLi4gQXJncz4KK3N0cnVjdCBpc19jYWxsYWJsZV9hczwKKyAgICAgICAgRiwKKyAgICAgICAgUihBcmdzLi4uKSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPHR5cGVuYW1lIGRldGFpbHM6OmR1bW15PGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGPigpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZGVjbHZhbDxBcmdzPigpLi4uKSk+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSPjo6dmFsdWU+Ojp0eXBlPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoZWNrIGlmIGEgdHlwZSB8VHwgaXMgYW55IGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSB8VXwuIEV4YW1wbGVzOgorLy8KKy8vICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8aW50LCBzdGQ6OnZlY3Rvcj46OnZhbHVlID09IGZhbHNlCisvLyAgICBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPAorLy8gICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8aW50Pj4sIHN0ZDo6dmVjdG9yPjo6dmFsdWUgPT0gZmFsc2UKKy8vICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8c3RkOjp2ZWN0b3I8aW50Piwgc3RkOjp2ZWN0b3I+Ojp2YWx1ZSA9PSB0cnVlCisvLyAgICBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPAorLy8gICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+Piwgc3RkOjp2ZWN0b3I+Ojp2YWx1ZSA9PSB0cnVlCisvLwordGVtcGxhdGUgPGNsYXNzIFQsIHRlbXBsYXRlIDxjbGFzcy4uLj4gY2xhc3MgVT4KK3N0cnVjdCBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mIDogc3RkOjpmYWxzZV90eXBlIHt9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLi4uPiBjbGFzcyBVLCBjbGFzcy4uLiBBcmdzPgorc3RydWN0IGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8VTxBcmdzLi4uPiwgVT4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBpc19yYW5nZTxUPiAtIGNoZWNrIGlmIHR5cGUgfFR8IGlzIGEgcmFuZ2UtbGlrZSB0eXBlLgorLy8KKy8vIEl0IG1ha2VzIHN1cmUgdGhhdCBleHByZXNzaW9ucyBzdGQ6OmJlZ2luKHQpIGFuZCBzdGQ6OmVuZCh0KSBhcmUgd2VsbC1mb3JtZWQKKy8vIGFuZCB0aG9zZSByZXR1cm4gdGhlIHNhbWUgdHlwZS4KKy8vCisvLyBOb3RlOiB3aXRoIGV4cHJlc3Npb24gU0ZJTkFFIGZyb20gQysrMTQgaXNfcmFuZ2VfaGVscGVyPD4gY291bGQgYmUgcmVuYW1lZCB0bworLy8gICBpc19yYW5nZTw+IHdpdGggbm8gZXh0cmEgY29kZS4gQysrMTEgbmVlZHMgYW4gZXh0cmEgbGV2ZWwgb2YgZW5hYmxlX2lmPD4KKy8vICAgdG8gbWFrZSBpdCB3b3JrIHdoZW4gdGhlIHR5cGUgaXNuJ3QgYSByYW5nZS4KKy8vCisKK25hbWVzcGFjZSBkZXRhaWxzIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBpc19yYW5nZV9oZWxwZXIgPSBzdGQ6OmlzX3NhbWU8CisgICAgICAgIGRlY2x0eXBlKHN0ZDo6YmVnaW4oCisgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPHR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGU+KCkpKSwKKyAgICAgICAgZGVjbHR5cGUoc3RkOjplbmQoCisgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPHR5cGVuYW1lIHN0ZDo6YWRkX2x2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGU+KCkpKT47CisKK30gIC8vIG5hbWVzcGFjZSBkZXRhaWxzCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyA9IHZvaWQ+CitzdHJ1Y3QgaXNfcmFuZ2UgOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGlzX3JhbmdlPAorICAgICAgICBULAorICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWxzOjppc19yYW5nZV9oZWxwZXI8VD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9UeXBlVHJhaXRzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1R5cGVUcmFpdHNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMmYzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9UeXBlVHJhaXRzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKFR5cGVUcmFpdHMsIElzQ2FsbGFibGUpIHsKKyAgICBjbGFzcyBDOworICAgIEMqIGMgPSBudWxscHRyOworCisgICAgYXV0byBsYW1iZGEgPSBbY10oYm9vbCkgLT4gQyogeyByZXR1cm4gbnVsbHB0cjsgfTsKKworICAgIHN0YXRpY19hc3NlcnQoaXNfY2FsbGFibGVfYXM8dm9pZCgpLCB2b2lkKCk+Ojp2YWx1ZSwgInNpbXBsZSBmdW5jdGlvbiIpOworICAgIHN0YXRpY19hc3NlcnQoaXNfY2FsbGFibGVfYXM8dm9pZCgmKSgpLCB2b2lkKCk+Ojp2YWx1ZSwgImZ1bmN0aW9uIHJlZmVyZW5jZSIpOworICAgIHN0YXRpY19hc3NlcnQoaXNfY2FsbGFibGVfYXM8dm9pZCgqKSgpLCB2b2lkKCk+Ojp2YWx1ZSwgImZ1bmN0aW9uIHBvaW50ZXIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX2NhbGxhYmxlX2FzPGludChDJiwgQyopLCBpbnQoQyYsIEMqKT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIHdpdGggYXJndW1lbnRzIGFuZCByZXR1cm4gdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoaXNfY2FsbGFibGVfYXM8ZGVjbHR5cGUobGFtYmRhKSwgQyooYm9vbCk+Ojp2YWx1ZSwgImxhbWJkYSIpOworICAgIHN0YXRpY19hc3NlcnQoaXNfY2FsbGFibGVfYXM8c3RkOjpmdW5jdGlvbjxib29sKGludCk+LCBib29sKGludCk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJzdGQ6OmZ1bmN0aW9uIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19jYWxsYWJsZV9hczxpbnQsIHZvaWQoKT46OnZhbHVlLCAiaW50IHNob3VsZCBub3QgYmUgY2FsbGFibGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19jYWxsYWJsZV9hczxDLCB2b2lkKCk+Ojp2YWx1ZSwgImluY29tcGxldGUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoIWlzX2NhbGxhYmxlX2FzPHZvaWQoKSwgdm9pZChpbnQpPjo6dmFsdWUsICJkaWZmZXJlbnQgYXJndW1lbnRzIik7CisgICAgc3RhdGljX2Fzc2VydCghaXNfY2FsbGFibGVfYXM8aW50KCksIHZvaWQoKT46OnZhbHVlLCAiZGlmZmVyZW50IHJldHVybiB0eXBlcyIpOworICAgIHN0YXRpY19hc3NlcnQoIWlzX2NhbGxhYmxlX2FzPGludCgpLCBzaG9ydCgpPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAic2xpZ2h0bHkgZGlmZmVyZW50IHJldHVybiB0eXBlcyIpOworICAgIHN0YXRpY19hc3NlcnQoIWlzX2NhbGxhYmxlX2FzPGludChpbnQpLCBpbnQoaW50LCBpbnQpPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAibW9yZSBhcmd1bWVudHMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19jYWxsYWJsZV9hczxpbnQoaW50LCBpbnQpLCBpbnQoaW50KT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImxlc3MgYXJndW1lbnRzIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19jYWxsYWJsZV9hczxpbnQoaW50KSwgaW50Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiYmFkIHJlcXVpcmVkIHNpZ25hdHVyZSIpOworfQorCitURVNUKFR5cGVUcmFpdHMsIElzVGVtcGxhdGVJbnN0YW50aWF0aW9uKSB7CisgICAgc3RhdGljX2Fzc2VydCghaXNfdGVtcGxhdGVfaW5zdGFudGlhdGlvbl9vZjxpbnQsIHN0ZDo6dmVjdG9yPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiaW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB2ZWN0b3IiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPHN0ZDo6bGlzdDxzdGQ6OnZlY3RvcjxpbnQ+Piwgc3RkOjp2ZWN0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJsaXN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB2ZWN0b3IiKTsKKworICAgIHN0YXRpY19hc3NlcnQoaXNfdGVtcGxhdGVfaW5zdGFudGlhdGlvbl9vZjxzdGQ6OnZlY3RvcjxpbnQ+LCBzdGQ6OnZlY3Rvcj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInN0ZDo6dmVjdG9yPGludD4gaXMgYW4gaW5zdGFuY2Ugb2YgdmVjdG9yIik7CisgICAgc3RhdGljX2Fzc2VydChpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+Piwgc3RkOjp2ZWN0b3I+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJuZXN0ZWQgc3RkOjp2ZWN0b3I8PiBpcyBhbiBpbnN0YW5jZSBvZiB2ZWN0b3IiKTsKK30KKworVEVTVChUeXBlVHJhaXRzLCBJc1JhbmdlKSB7CisgICAgc3RhdGljX2Fzc2VydChpc19yYW5nZTxzdGQ6OnZlY3RvcjxpbnQ+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAidmVjdG9yPD4gc2hvdWxkIGJlIGRldGVjdGVkIGFzIGEgcmFuZ2UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX3JhbmdlPGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiY29uc3QgbGlzdDw+IHNob3VsZCBiZSBkZXRlY3RlZCBhcyBhIHJhbmdlIik7CisgICAgc3RhdGljX2Fzc2VydChpc19yYW5nZTxzdGQ6OmFycmF5PHN0ZDo6dmVjdG9yPGludD4sIDEwPj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgImFycmF5PD4gc2hvdWxkIGJlIGRldGVjdGVkIGFzIGEgcmFuZ2UiKTsKKyAgICBjaGFyIGFyclsxMDBdOworICAgIHN0YXRpY19hc3NlcnQoaXNfcmFuZ2U8ZGVjbHR5cGUoYXJyKT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkMgYXJyYXkgc2hvdWxkIGJlIGRldGVjdGVkIGFzIGEgcmFuZ2UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGlzX3JhbmdlPGRlY2x0eXBlKCJzdHJpbmciKT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIlN0cmluZyBsaXRlcmFsIHNob3VsZCBiZSBkZXRlY3RlZCBhcyBhIHJhbmdlIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19yYW5nZTxpbnQ+Ojp2YWx1ZSwgImludCBzaG91bGRuJ3QgYmUgYSByYW5nZSIpOworICAgIHN0YXRpY19hc3NlcnQoIWlzX3JhbmdlPGludCo+Ojp2YWx1ZSwgImludCogc2hvdWxkbid0IGJlIGEgcmFuZ2UiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFpc19yYW5nZTxjb25zdCBpbnQqPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiZXZlbiBjb25zdCBpbnQqIHNob3VsZG4ndCBiZSBhIHJhbmdlIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXJpLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1VyaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNDAzNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1VyaS5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisvLyBTb21lIGZyZWUgZnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgc3RyaW5ncyBhcyBVUklzLiBXaGVyZXZlciBwb3NzaWJsZSwKKy8vIHRoZXNlIGZ1bmN0aW9ucyB0YWtlIGNvbnN0IHJlZmVyZW5jZXMgdG8gU3RyaW5nVmlldyB0byBhdm9pZCB1bm5lY2Vzc2FyeQorLy8gY29waWVzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1VyaS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gRnVuY3Rpb24gdG8gZW5jb2RlIGFuIGluZGl2aWR1YWwgY2hhcmFjdGVyIGFuZCBhcHBlbmQgaXQgdG8gKnxyZXN8CitzdGF0aWMgdm9pZCBhcHBlbmRFbmNvZGVkQ2hhcihjaGFyIGMsIHN0ZDo6c3RyaW5nKiByZXMpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnISc6CisgICAgICAgIGNhc2UgJyMnOgorICAgICAgICBjYXNlICckJzoKKyAgICAgICAgY2FzZSAnJic6CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgIGNhc2UgJyknOgorICAgICAgICBjYXNlICcqJzoKKyAgICAgICAgY2FzZSAnKyc6CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICBjYXNlICcvJzoKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgIGNhc2UgJzsnOgorICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgIGNhc2UgJ0AnOgorICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgY2FzZSAnXSc6CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChyZXMsICIlJSUwMlgiLCBjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzLT5wdXNoX2JhY2soYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgVXJpOjpFbmNvZGUoU3RyaW5nVmlldyB1cmkpIHsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkVXJpOworICAgIGVuY29kZWRVcmkucmVzZXJ2ZSh1cmkuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGNoYXIgYyA6IHVyaSkgeworICAgICAgICBhcHBlbmRFbmNvZGVkQ2hhcihjLCAmZW5jb2RlZFVyaSk7CisgICAgfQorICAgIHJldHVybiBlbmNvZGVkVXJpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIFVyaTo6RGVjb2RlKFN0cmluZ1ZpZXcgdXJpKSB7CisgICAgc3RkOjpzdHJpbmcgZGVjb2RlZFVyaTsKKyAgICBkZWNvZGVkVXJpLnJlc2VydmUodXJpLnNpemUoKSk7CisgICAgZm9yIChTdHJpbmdWaWV3Ojpjb25zdF9pdGVyYXRvciBjaXQgPSB1cmkuYmVnaW4oKTsgY2l0ICE9IHVyaS5lbmQoKTsKKyAgICAgICAgICsrY2l0KSB7CisgICAgICAgIGlmICgqY2l0ID09ICclJykgeworICAgICAgICAgICAgY2hhciBoZXhbM107CisgICAgICAgICAgICBjaGFyIGRlY29kZWRDaGFyOworCisgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIGlmIChjaXQgPT0gdXJpLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGV4WzBdID0gKmNpdDsKKyAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgaWYgKGNpdCA9PSB1cmkuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZXhbMV0gPSAqY2l0OworCisgICAgICAgICAgICBoZXhbMl0gPSAnXDAnOworICAgICAgICAgICAgZGVjb2RlZENoYXIgPSBzdGF0aWNfY2FzdDxjaGFyPihzdHJ0b3VsKGhleCwgTlVMTCwgMTYpKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVkQ2hhciA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVjb2RlZFVyaS5wdXNoX2JhY2soZGVjb2RlZENoYXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2RlZFVyaS5wdXNoX2JhY2soKmNpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlY29kZWRVcmk7Cit9CisKK3N0ZDo6c3RyaW5nIFVyaTo6Rm9ybWF0SGVscGVyOjplbmNvZGVBcmcoU3RyaW5nVmlldyBzdHIpIHsKKyAgICByZXR1cm4gVXJpOjpFbmNvZGUoc3RyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VcmkuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1VyaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTVkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VcmkuaApAQCAtMCwwICsxLDc2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gU29tZSBmcmVlIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHN0cmluZ3MgYXMgVVJJcy4gV2hlcmV2ZXIgcG9zc2libGUsCisvLyB0aGVzZSBmdW5jdGlvbnMgdGFrZSBjb25zdCByZWZlcmVuY2VzIHRvIFN0cmluZ1ZpZXcgdG8gYXZvaWQgdW5uZWNlc3NhcnkKKy8vIGNvcGllcy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgVXJpIHsKK3B1YmxpYzoKKyAgICAvLyB8RW5jb2RlfCBpcyBhZ2dyZXNzaXZlIC0tIGl0IHdpbGwgYWx3YXlzIGVuY29kZSBhIHJlc2VydmVkIGNoYXJhY3RlciwKKyAgICAvLyBkaXNyZWdhcmRpbmcgYSBwb3NzaWJseSBpbmNsdWRlZCBVUkwgc2NoZW1lLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBFbmNvZGUoU3RyaW5nVmlldyB1cmkpOworCisgICAgLy8gfERlY29kZXwgaXMgYWdncmVzc2l2ZS4gSXQgd2lsbCBkZWNvZGUgZXZlcnkgb2NjdXJhbmNlIG9mICVYWCBpbiBhIHNpbmdsZQorICAgIC8vIHBhc3MgLS0gZXZlbiBmb3IgdW5yZXNlcnZlZCBjaGFyYWN0ZXJzLgorICAgIC8vIFJldHVybnMgZW1wdHkgc3RyaW5nIG9uIGVycm9yLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBEZWNvZGUoU3RyaW5nVmlldyB1cmkpOworCisgICAgLy8gU2V0IG9mIGZ1bmN0aW9ucyBmb3IgYXJndW1lbnRzIGVuY29kaW5nCisgICAgc3RydWN0IEZvcm1hdEhlbHBlciB7CisgICAgICAgIC8vIEFueXRoaW5nIHdoaWNoIGNhbiBwb3RlbnRpYWxseSBoYXZlIGVuY29kYWJsZSBjaGFyYWN0ZXIgZ29lcyBoZXJlIGFuZAorICAgICAgICAvLyBpcyBlbmNvZGVkIGludG8gYSBjb25zdCBjaGFyKgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZW5jb2RlQXJnKFN0cmluZ1ZpZXcgc3RyKTsKKworICAgICAgICAvLyBGb3J3YXJkIHRoZSByZXN0IGFzLWlzIChub24tU3RyaW5nVmlldyB0eXBlcykKKyAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICAgICAgIHN0YXRpYyBUJiYgZW5jb2RlQXJnKFQmJiB0LAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICAhc3RkOjppc19jb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUsIFN0cmluZ1ZpZXcKKyAgICAgICAgICAgICAgICAgICAgPjo6dmFsdWUKKyAgICAgICAgICAgICAgICA+Ojp0eXBlKiA9IG51bGxwdHIpIHsKKworICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgc2luZ2xlIGNoYXIgcGFyYW1ldGVycyBhcyB0aGV5IGhhdmUgYSAnJWMnIGZvcm1hdAorICAgICAgICAgICAgLy8gc3BlY2lmaWVyIGJ1dCBwb3RlbnRpYWxseSBtYXkgZW5jb2RlIGludG8gYSB3aG9sZSBzdHJpbmcuIFRoaXMKKyAgICAgICAgICAgIC8vIGlzIHZlcnkgY29uZnVzaW5nIGZvciB0aGUgdXNlciAod2hpY2ggZm9ybWF0IHRvIHVzZSAtICVjIG9yICVzPykKKyAgICAgICAgICAgIC8vIGFuZCBpcyB0b28gZXJyb3ItcHJvbmUgKGhvdyB0byBtYWtlIHN1cmUgbm8gb25lIGxhdGVyCisgICAgICAgICAgICAvLyAnZml4ZXMnICd3cm9uZycgZm9ybWF0PykKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlLCBjaGFyPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlVyaTo6Rm9ybWF0RW5jb2RlQXJndW1lbnRzKCkgZG9lcyBub3Qgc3VwcG9ydCBhcmd1bWVudHMgb2YgdHlwZSAnY2hhciciKTsKKworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPih0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBBIHNtYWxsIGNvbnZlbmllbmNlIG1ldGhvZCB0byBlbmNvZGUgYWxsIGFyZ3VtZW50cyB3aGVuIGZvcm1hdHRpbmcgdGhlCisgICAgLy8gc3RyaW5nLCBidXQgZG9uJ3QgdG91Y2ggdGhlIHxmb3JtYXR8IHN0cmluZyBpdHNlbGYKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgRm9ybWF0RW5jb2RlQXJndW1lbnRzKGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgRm9ybWF0SGVscGVyOjplbmNvZGVBcmcoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpKS4uLik7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VcmlfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXJpX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM4N2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXJpX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9VcmkuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChVcmksIEVuY29kZSkgeworICAgIEVYUEVDVF9TVFJFUSgiIiwgVXJpOjpFbmNvZGUoIiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiJTIxJTIzJTI0JTI2JTI3JTI4JTI5JTJBJTJCJTJDJTJGJTNBJTNCJTNEJTNGJTQwJTVCJTVEIiwKKyAgICAgICAgICAgICAgICAgVXJpOjpFbmNvZGUoIiEjJCYnKCkqKywvOjs9P0BbXSIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiJTI1IiwgVXJpOjpFbmNvZGUoIiUiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiUyMCIsIFVyaTo6RW5jb2RlKCIgIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIlMjAlMjAlMjAuLiUyMCUyMCIsIFVyaTo6RW5jb2RlKCIgICAuLiAgIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJwYWNrJTIwbXklMjBib3glMjB3aXRoJTIwZml2ZSUyMGRvemVuJTIwbGlxb3IlMjBqdWdzIiwKKyAgICAgICAgICAgICAgICAgVXJpOjpFbmNvZGUoInBhY2sgbXkgYm94IHdpdGggZml2ZSBkb3plbiBsaXFvciBqdWdzIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAgICAgIlRIRSUyMFdJWkFSRCUyMFFVSUNLTFklMjBKSU5YRUQlMjBUSEUlMjBHTk9NRVMlMjBCRUZPUkUiCisgICAgICAgICAgICAiJTIwVEhFWSUyMFZBUE9SSVpFRC4iLAorICAgICAgICAgICAgVXJpOjpFbmNvZGUoIlRIRSBXSVpBUkQgUVVJQ0tMWSBKSU5YRUQgVEhFIEdOT01FUyBCRUZPUkUiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFRIRVkgVkFQT1JJWkVELiIpCisgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKK30KKworVEVTVChVcmksIERlY29kZSkgeworICAgIEVYUEVDVF9TVFJFUSgiIiwgVXJpOjpFbmNvZGUoIiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiISMkJicoKSorLC86Oz0/QFtdIiwKKyAgICAgICAgICAgICAgICAgVXJpOjpEZWNvZGUoIiUyMSUyMyUyNCUyNiUyNyUyOCUyOSUyQSUyQiUyQyUyRiUzQSUzQiUzRCUzRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU0MCU1QiU1RCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiJSIsIFVyaTo6RGVjb2RlKCIlMjUiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiAiLCBVcmk6OkRlY29kZSgiJTIwIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIgICAuLiAgIiwgVXJpOjpEZWNvZGUoIiUyMCUyMCUyMC4uJTIwJTIwIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJwYWNrIG15IGJveCB3aXRoIGZpdmUgZG96ZW4gbGlxb3IganVncyIsCisgICAgICAgICAgICAgICAgIFVyaTo6RGVjb2RlKCJwYWNrJTIwbXklMjBib3glMjB3aXRoJTIwZml2ZSUyMGRvemVuJTIwbGlxb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMjBqdWdzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJUSEUgV0laQVJEIFFVSUNLTFkgSklOWEVEIFRIRSBHTk9NRVMgQkVGT1JFIFRIRVkgVkFQT1JJWkVELiIsCisgICAgICAgICAgICAgICAgIFVyaTo6RGVjb2RlKCJUSEUlMjBXSVpBUkQlMjBRVUlDS0xZJTIwSklOWEVEJTIwVEhFJTIwR05PTUVTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTIwQkVGT1JFJTIwVEhFWSUyMFZBUE9SSVpFRC4iKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKK30KKworVEVTVChVcmksIEZvcm1hdEVuY29kZUFyZ3VtZW50cykgeworICAgIEVYUEVDVF9TVFJFUSgiIiwgVXJpOjpGb3JtYXRFbmNvZGVBcmd1bWVudHMoIiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWE9YiIsIFVyaTo6Rm9ybWF0RW5jb2RlQXJndW1lbnRzKCIlcz0lcyIsICJhYSIsICJiIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxPTImJTI2PSUzRCIsIFVyaTo6Rm9ybWF0RW5jb2RlQXJndW1lbnRzKCIlZD0ldSYlcz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDJ1LCAiJiIsICI9IikuY19zdHIoKSk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VdWlkLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1V1aWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTIyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VdWlkLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVXVpZC5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8cnBjLmg+CisjZWxzZQorI2luY2x1ZGUgPHV1aWQvdXVpZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY29uc3QgY2hhciogY29uc3QgVXVpZDo6bnVsbFV1aWRTdHIgPSAiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIjsKKworVXVpZDo6VXVpZCgpIDogbURhdGEoKSB7fQorCitjb25zdCB2b2lkKiBVdWlkOjpkYXRhUHRyKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oJm1EYXRhKTsKK30KKwordm9pZCogVXVpZDo6ZGF0YVB0cigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDx2b2lkKj4oY29uc3RfY2FzdDxjb25zdCBVdWlkKj4odGhpcyktPmRhdGFQdHIoKSk7Cit9CisKKyNpZmRlZiBfV0lOMzIKKworLy8gTm90ZXM6CisvLyAgIFdpbmRvd3MgcHJvdG90eXBlcyB0YWtlIGFsbCBVVUlEIHBvaW50ZXJzIGFzIG5vbi1jb25zdCwgdGhhdCdzIHdoeQorLy8gd2UgaGF2ZSB0byBjb25zdF9jYXN0IGV2ZXJ5dGhpbmcuIEJ1bW1lci4KKy8vCisvLyAgIFJwYyBzdHJpbmdzIGFyZSB1bnNpZ25lZCBjaGFycy4gQnVtbWVyICMyLgorCitVdWlkOjpVdWlkKFN0cmluZ1ZpZXcgYXNTdHJpbmcpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihVdWlkOjpkYXRhX3QpID49IHNpemVvZihVVUlEKSwKKyAgICAgICAgICAgICAgICAgICJVdWlkOjpkYXRhX3QgaXMgdG9vIHNtYWxsIG9uIFdpbmRvd3MiKTsKKworICAgIGlmICg6OlV1aWRGcm9tU3RyaW5nQShjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nLmNfc3RyKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VVVJRCo+KGRhdGFQdHIoKSkpICE9IFJQQ19TX09LKSB7CisgICAgICAgICp0aGlzID0gVXVpZCgpOworICAgIH0KK30KKworVXVpZCBVdWlkOjpnZW5lcmF0ZSgpIHsKKyAgICBVdWlkIHJlczsKKyAgICA6OlV1aWRDcmVhdGUoc3RhdGljX2Nhc3Q8VVVJRCo+KHJlcy5kYXRhUHRyKCkpKTsKKyAgICByZXR1cm4gcmVzOworfQorCitVdWlkIFV1aWQ6OmdlbmVyYXRlRmFzdCgpIHsKKyAgICBVdWlkIHJlczsKKyAgICA6OlV1aWRDcmVhdGVTZXF1ZW50aWFsKHN0YXRpY19jYXN0PFVVSUQqPihyZXMuZGF0YVB0cigpKSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjpzdHJpbmcgVXVpZDo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgdW5zaWduZWQgY2hhciogc3RyID0gbnVsbHB0cjsKKyAgICBpZiAoOjpVdWlkVG9TdHJpbmcoY29uc3RfY2FzdDxVVUlEKj4oc3RhdGljX2Nhc3Q8Y29uc3QgVVVJRCo+KGRhdGFQdHIoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAmc3RyKSAhPSBSUENfU19PSyB8fAorICAgICAgICAhc3RyKSB7CisgICAgICAgIHJldHVybiBudWxsVXVpZFN0cjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihzdHIpOworICAgIFJwY1N0cmluZ0ZyZWUoJnN0cik7CisgICAgcmV0dXJuIHJlczsKK30KKworI2Vsc2UgIC8vICFfV0lOMzIKKworLy8gU29tZSBQb3NpeCBoZWFkZXJzIGhhdmUgdXVpZF90IGFzIGEgdHlwZWRlZiBmb3IgYW4gYXJyYXkgb2YgY2hhcnMsCisvLyBvdGhlciBoZWFkZXJzIG5hbWUgYSBzdHJ1Y3QgdXVpZF90LiBUaGlzIHRlbXBsYXRlIGFsaWFzIGhlbHBzIHRvIHVuaWZ5IHRoZW0KKy8vIGZvciBhIHNpbXBsZXIgY2FzdGluZyBmcm9tL3RvIFV1aWQ6OmRhdGFfdAorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIGFzU3lzdGVtID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKKyAgICAgICAgc3RkOjppc19hcnJheTxUPjo6dmFsdWUsCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUsICAvLyBkZWNheSBhbiBhcnJheSB0byBhIHBvaW50ZXIKKyAgICAgICAgVCogIC8vIHdoZW4gY2FzdGluZyBhIHN0cnVjdCBjYXN0IHRvIGEgcG9pbnRlcgorICAgICAgICA+Ojp0eXBlOworCitVdWlkOjpVdWlkKFN0cmluZ1ZpZXcgYXNTdHJpbmcpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihVdWlkOjpkYXRhX3QpID49IHNpemVvZih1dWlkX3QpLAorICAgICAgICAgICAgICAgICAgIlV1aWQ6OmRhdGFfdCBpcyB0b28gc21hbGwgb24gUG9zaXgiKTsKKworICAgIGlmICh1dWlkX3BhcnNlKGFzU3RyaW5nLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXNTeXN0ZW08dXVpZF90Pj4oZGF0YVB0cigpKSkgPCAwKSB7CisgICAgICAgICp0aGlzID0gVXVpZCgpOworICAgIH0KK30KKworVXVpZCBVdWlkOjpnZW5lcmF0ZSgpIHsKKyAgICBVdWlkIHJlczsKKyAgICB1dWlkX2dlbmVyYXRlKHN0YXRpY19jYXN0PGFzU3lzdGVtPHV1aWRfdD4+KHJlcy5kYXRhUHRyKCkpKTsKKyAgICByZXR1cm4gcmVzOworfQorCitVdWlkIFV1aWQ6OmdlbmVyYXRlRmFzdCgpIHsKKyAgICAvLyBmb3IgUG9zaXggaXQncyB0aGUgc2FtZQorICAgIHJldHVybiBnZW5lcmF0ZSgpOworfQorCitzdGQ6OnN0cmluZyBVdWlkOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICAvLyBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciB0aGUgdXVpZCBzdHJpbmcgcmVwcmVzZW50YXRpb24KKyAgICAvLyBpbmNsdWRpbmcgbnVsbC10ZXJtaW5hdG9yCisgICAgc3RkOjpzdHJpbmcgcmVzKHN0cmxlbihudWxsVXVpZFN0cikgKyAxLCAnXDAnKTsKKyAgICB1dWlkX3VucGFyc2VfbG93ZXIoc3RhdGljX2Nhc3Q8YXNTeXN0ZW08Y29uc3QgdXVpZF90Pj4oZGF0YVB0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnJlc1swXSk7CisgICAgcmVzLnBvcF9iYWNrKCk7ICAvLyBnZXQgcmlkIG9mIHRoZSBudWxsLXRlcm1pbmF0b3Igbm93CisgICAgcmV0dXJuIHJlczsKK30KKworI2VuZGlmICAvLyAhX1dJTjMyCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXVpZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTUzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VdWlkLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFRoaXMgY2xhc3MgaW5jYXBzdWxhdGVzIGEgVXVpZCAtIHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVyLCBBS0EgR3VpZAorLy8gSXQncyBpbXBsZW1lbnRlZCB3aXRoIFV1aWQqIGZ1bmN0aW9ucyBpbiBXaW5kb3dzIGFuZCBsaWJ1dWlkIGZvciBQb3NpeC4KKy8vCitjbGFzcyBVdWlkIHsKK3B1YmxpYzoKKyAgICAvLyBDcmVhdGUgYSB6ZXJvZWQgVXVpZAorICAgIFV1aWQoKTsKKworICAgIC8vIFBhcnNlIGEgc3RyaW5nIGludG8gVXVpZCBpbnN0YW5jZS4gSWYgdGhlIHN0cmluZyBpc24ndCBwYXJzYWJsZSB0aGUKKyAgICAvLyBvYmplY3QgaXMgemVyby1pbml0aWFsaXplZCBpbnN0ZWFkCisgICAgZXhwbGljaXQgVXVpZChTdHJpbmdWaWV3IGFzU3RyaW5nKTsKKworICAgIC8vIFRoZXNlIHR3byBmdW5jdGlvbnMgZ2VuZXJhdGUgYSBuZXcgcmFuZG9tIFV1aWQuIGdlbmVyYXRlRmFzdCgpIG1heQorICAgIC8vIGJlIHNsaWdodGx5IGZhc3RlciBiZWNhdXNlIG9mIHRoZSBoaWdoZXIgcG9zc2liaWxpdHkgb2YKKyAgICAvLyBub24tZ2xvYmFsIHVuaXF1aW5lc3MuCisgICAgLy8gV2luZG93cyBoYXMgYSBmYXN0ZXIgZnVuY3Rpb24gYW5kIGl0IGlzIHVzZWQgaGVyZS4gQ3VycmVudCBQb3NpeAorICAgIC8vIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIHNhbWUgdXVpZF9nZW5lcmF0ZSgpIGZvciBib3RoCisgICAgc3RhdGljIFV1aWQgZ2VuZXJhdGUoKTsKKyAgICBzdGF0aWMgVXVpZCBnZW5lcmF0ZUZhc3QoKTsKKworICAgIC8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFV1aWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtOgorICAgIC8vICAgICAgeHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIEEgc3RyaW5nIGZvcm0gb2YgdGhlIHplcm9lZCBVdWlkCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IG51bGxVdWlkU3RyOworCisgICAgLy8gU2V0IG9mIGNvbXBhcmlzb24gb3BlcmF0b3JzIGZvciB0aGUgVXVpZHMKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgVXVpZCYgYSwgY29uc3QgVXVpZCYgYikgeworICAgICAgICByZXR1cm4gbWVtY21wKCZhLm1EYXRhLCAmYi5tRGF0YSwgc2l6ZW9mKFV1aWQ6OmRhdGFfdCkpIDwgMDsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFV1aWQmIGEsIGNvbnN0IFV1aWQmIGIpIHsgcmV0dXJuIGIgPCBhOyB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVdWlkJiBhLCBjb25zdCBVdWlkJiBiKSB7CisgICAgICAgIHJldHVybiBtZW1jbXAoJmEubURhdGEsICZiLm1EYXRhLCBzaXplb2YoVXVpZDo6ZGF0YV90KSkgPT0gMDsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVdWlkJiBhLCBjb25zdCBVdWlkJiBiKSB7IHJldHVybiAhKGEgPT0gYik7IH0KKworcHJpdmF0ZToKKyAgICAvLyBIZWxwZXJzIGZvciBjYXN0aW5nIHRvIGEgc3lzdGVtLXNwZWNpZmljIFV1aWQgdHlwZS4KKyAgICB2b2lkKiBkYXRhUHRyKCk7CisgICAgY29uc3Qgdm9pZCogZGF0YVB0cigpIGNvbnN0OworCisgICAgLy8gVGhlIFV1aWQgaXMgMTYtYnl0ZSBudW1iZXIsIGJ1dCB1bmRlcmx5aW5nIHN5c3RlbSB0eXBlcyBhcmUgZGlmZmVyZW50CisgICAgLy8gb24gZGlmZmVyZW50IE9TZXMuCisgICAgLy8gVGhpcyB0eXBlIGFsaWFzIGlzIGFibGUgdG8gc3RvcmUgYW55IG9mIHRob3NlCisgICAgdXNpbmcgZGF0YV90ID0gdHlwZW5hbWUgc3RkOjphbGlnbmVkX3N0b3JhZ2U8CisgICAgICAgICAgICAxNiwgc3RkOjphbGlnbm1lbnRfb2Y8aW50MzJfdD46OnZhbHVlPjo6dHlwZTsKKworICAgIGRhdGFfdCBtRGF0YTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXVpZF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9VdWlkX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNiMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVXVpZF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVXVpZC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKFV1aWQsIERlZmF1bHRDdG9yKSB7CisgICAgVXVpZCB1dWlkOworICAgIEVYUEVDVF9FUShVdWlkKFV1aWQ6Om51bGxVdWlkU3RyKSwgdXVpZCk7CisgICAgRVhQRUNUX1NUUkVRKFV1aWQ6Om51bGxVdWlkU3RyLCB1dWlkLnRvU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoVXVpZCwgU3RyaW5nQ3RvcikgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIHN0cltdID0gIjAxMDEwMTAxLTAxMDEtMDEwMS0wMTAxLTEwZmZhYzkwMDAxNyI7CisgICAgVXVpZCB1dWlkKHN0cik7CisgICAgRVhQRUNUX1NUUkVRKHN0ciwgdXVpZC50b1N0cmluZygpLmNfc3RyKCkpOworCisgICAgdXVpZCA9IFV1aWQoImJsYWgiKTsKKyAgICBFWFBFQ1RfRVEoVXVpZCgpLCB1dWlkKTsKK30KKworVEVTVChVdWlkLCBHZW5lcmF0ZSkgeworICAgIEVYUEVDVF9ORShVdWlkKCksIFV1aWQ6OmdlbmVyYXRlKCkpOworICAgIEVYUEVDVF9ORShVdWlkOjpnZW5lcmF0ZSgpLCBVdWlkOjpnZW5lcmF0ZSgpKTsKKyAgICAvLyB3ZWxsLCB3aGF0IGVsc2UgY291bGQgd2UgdGVzdCBoZXJlPworfQorCitURVNUKFV1aWQsIENvbXBhcmlzb25zKSB7CisgICAgVXVpZCBhKFV1aWQ6Om51bGxVdWlkU3RyKTsKKyAgICBVdWlkIGIoVXVpZDo6bnVsbFV1aWRTdHIpOworCisgICAgRVhQRUNUX1RSVUUoYSA9PSBiKTsKKyAgICBFWFBFQ1RfRkFMU0UoYSAhPSBiKTsKKyAgICBFWFBFQ1RfRkFMU0UoYSA8IGIpOworICAgIEVYUEVDVF9GQUxTRShhID4gYik7CisKKyAgICBiID0gVXVpZCgiMDEwMTAxMDEtMDEwMS0wMTAxLTAxMDEtMTBmZmFjOTAwMDE3Iik7CisgICAgRVhQRUNUX0ZBTFNFKGEgPT0gYik7CisgICAgRVhQRUNUX1RSVUUoYSAhPSBiKTsKKyAgICBFWFBFQ1RfVFJVRShhIDwgYik7CisgICAgRVhQRUNUX0ZBTFNFKGEgPiBiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9WZXJzaW9uLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1ZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGQ4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9WZXJzaW9uLmNwcApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9WZXJzaW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga0ludmFsaWRWZXJzaW9uID0gImludmFsaWQiOworCitzdGF0aWMgYm9vbCBpc0VvZihzdGQ6OmlzdHJlYW0mIGluKSB7CisgICAgcmV0dXJuIGluLnBlZWsoKSA9PSBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+Ojplb2YoKTsKK30KKworVmVyc2lvbjo6VmVyc2lvbihTdHJpbmdWaWV3IHZlcikgOiBtRGF0YSgpIHsKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW4odmVyKTsKKyAgICBpbiA+PiBzdGQ6Om5vc2tpcHdzOworCisgICAgLy8gcmVhZCB0aGUgbWFpbiBwYXJ0LCBtYWpvci5taW5vci5taWNybworICAgIGluID4+IHN0ZDo6Z2V0PGtNYWpvcj4obURhdGEpOworICAgIGlmICghaW4pIHsKKyAgICAgICAgKnRoaXMgPSBpbnZhbGlkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBkZWxpbWl0ZXJzW2tDb21wb25lbnRDb3VudCAtIDFdID0geycuJywgJy4nLCAnLSd9OworICAgIGZvciAoaW50IGNvbXAgPSBrTWlub3I7IGNvbXAgPD0ga0J1aWxkICYmICFpc0VvZihpbik7ICsrY29tcCkgeworICAgICAgICBjaGFyIGM7CisgICAgICAgIGluID4+IGMgPj4gY29tcG9uZW50KHN0YXRpY19jYXN0PENvbXBvbmVudD4oY29tcCkpOworICAgICAgICBpZiAoYyAhPSBkZWxpbWl0ZXJzW2NvbXAgLSAxXSB8fCAhaW4pIHsKKyAgICAgICAgICAgICp0aGlzID0gaW52YWxpZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbWFrZSBzdXJlIHRoZSBzdHJlYW0gaXMgY29uc3VtZWQgdG8gdGhlIGVuZAorICAgIGlmICghaXNFb2YoaW4pKSB7CisgICAgICAgICp0aGlzID0gaW52YWxpZCgpOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgVmVyc2lvbjo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIGtJbnZhbGlkVmVyc2lvbjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByZXMgPSBTdHJpbmdGb3JtYXQoIiV1LiV1LiV1IiwgY29tcG9uZW50PGtNYWpvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50PGtNaW5vcj4oKSwgY29tcG9uZW50PGtNaWNybz4oKSk7CisgICAgaWYgKGNvbXBvbmVudDxrQnVpbGQ+KCkgIT0ga05vbmUgJiYgY29tcG9uZW50PGtCdWlsZD4oKSAhPSAwKSB7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdCgmcmVzLCAiLSV1IiwgY29tcG9uZW50PGtCdWlsZD4oKSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK1ZlcnNpb246OkNvbXBvbmVudFR5cGUmIFZlcnNpb246OmNvbXBvbmVudChWZXJzaW9uOjpDb21wb25lbnQgYykgeworICAgIC8vIHRoaXMgaGFzIHRvIGJlIGEgc3dpdGNoOiB0dXBsZSBpc24ndCBhIGNvbnRhaW5lciwgc28gaXQgZG9lc24ndAorICAgIC8vIHByb3ZpZGUgcnVudGltZSBpbmRleGluZworICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIGtNYWpvcjoKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmdldDxrTWFqb3I+KG1EYXRhKTsKKyAgICAgICAgY2FzZSBrTWlub3I6CisgICAgICAgICAgICByZXR1cm4gc3RkOjpnZXQ8a01pbm9yPihtRGF0YSk7CisgICAgICAgIGNhc2Uga01pY3JvOgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6Z2V0PGtNaWNybz4obURhdGEpOworICAgICAgICBjYXNlIGtCdWlsZDoKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmdldDxrQnVpbGQ+KG1EYXRhKTsKKyAgICB9CisKKyAgICBhc3NlcnQoZmFsc2UpOworICAgIHN0YXRpYyBDb21wb25lbnRUeXBlIG5vbmUgPSBrTm9uZTsKKyAgICByZXR1cm4gbm9uZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBiYXNlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9WZXJzaW9uLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9WZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxZjc3MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1ZlcnNpb24uaApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBDbGFzcyB8VmVyc2lvbnwgaXMgYSBjbGFzcyBmb3Igc29mdHdhcmUgdmVyc2lvbiBtYW5pcHVsYXRpb25zCisvLyBpdCBpcyBhYmxlIHRvIHBhcnNlLCBzdG9yZSwgY29tcGFyZSBhbmQgY29udmVydCB2ZXJzaW9uIGJhY2sgdG8gc3RyaW5nCisvLyBFeHBlY3RlZCBzdHJpbmcgZm9ybWF0IGlzICJtYWpvci5taW5vci5taWNyb1suYnVpbGRdIiwgd2hlcmUgYWxsCisvLyBjb21wb25lbnRzIGFyZSB1bnNpZ25lZCBudW1iZXJzIChhbmQsIGhvcGVmdWxseSwgcmVhc29uYWJseSBzbWFsbCkKK2NsYXNzIFZlcnNpb24geworcHVibGljOgorICAgIGVudW0gQ29tcG9uZW50IHsga01ham9yLCBrTWlub3IsIGtNaWNybywga0J1aWxkIH07CisKKyAgICB1c2luZyBDb21wb25lbnRUeXBlID0gdW5zaWduZWQgaW50OworCisgICAgLy8gVGhpcyBpcyB0aGUgdmFsdWUgZm9yIGFuIGludmFsaWQvbWlzc2luZyB2ZXJzaW9uIGNvbXBvbmVudC4KKyAgICBzdGF0aWMgY29uc3RleHByIENvbXBvbmVudFR5cGUga05vbmUgPSBzdGF0aWNfY2FzdDxDb21wb25lbnRUeXBlPigtMSk7CisKKyAgICBleHBsaWNpdCBWZXJzaW9uKFN0cmluZ1ZpZXcgdmVyKTsKKworICAgIGNvbnN0ZXhwciBWZXJzaW9uKCk7CisKKyAgICBjb25zdGV4cHIgVmVyc2lvbihDb21wb25lbnRUeXBlIG1ham9yLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudFR5cGUgbWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50VHlwZSBtaWNybywKKyAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRUeXBlIGJ1aWxkID0gMCk7CisKKyAgICBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVyc2lvbiYgb3RoZXIpIGNvbnN0OworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgVmVyc2lvbiYgb3RoZXIpIGNvbnN0OworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgVmVyc2lvbiYgb3RoZXIpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBWZXJzaW9uIGludmFsaWQoKTsKKworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8Q29tcG9uZW50IEM+CisgICAgY29uc3RleHByIENvbXBvbmVudFR5cGUgY29tcG9uZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RkOjpnZXQ8c3RhdGljX2Nhc3Q8c2l6ZV90PihDKT4obURhdGEpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDb21wb25lbnRUeXBlJiBjb21wb25lbnQoQ29tcG9uZW50IGMpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBpbnQga0NvbXBvbmVudENvdW50ID0ga0J1aWxkICsgMTsKKworICAgIHN0ZDo6dHVwbGU8Q29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZSwgQ29tcG9uZW50VHlwZT4KKyAgICAgICAgICAgIG1EYXRhOworfTsKKworLy8gYWxsIGNvbnN0ZXhwciBmdW5jdGlvbnMgaGF2ZSB0byBiZSBkZWZpbmVkIGluIHRoZSBoZWFkZXIsIGp1c3QgbGlrZSB0ZW1wbGF0ZXMKKworY29uc3RleHByIFZlcnNpb246OlZlcnNpb24oKSA6IFZlcnNpb24oa05vbmUsIGtOb25lLCBrTm9uZSkge30KKworY29uc3RleHByIFZlcnNpb246OlZlcnNpb24oQ29tcG9uZW50VHlwZSBtYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudFR5cGUgbWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRUeXBlIG1pY3JvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50VHlwZSBidWlsZCkKKyAgICA6IG1EYXRhKG1ham9yLCBtaW5vciwgbWljcm8sIGJ1aWxkKSB7fQorCitjb25zdGV4cHIgYm9vbCBWZXJzaW9uOjppc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiAqdGhpcyAhPSBpbnZhbGlkKCk7Cit9CisKK2NvbnN0ZXhwciBib29sIFZlcnNpb246Om9wZXJhdG9yPChjb25zdCBWZXJzaW9uJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBtRGF0YSA8IG90aGVyLm1EYXRhOworfQorCitjb25zdGV4cHIgYm9vbCBWZXJzaW9uOjpvcGVyYXRvcj09KGNvbnN0IFZlcnNpb24mIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhID09IG90aGVyLm1EYXRhOworfQorCitjb25zdGV4cHIgYm9vbCBWZXJzaW9uOjpvcGVyYXRvciE9KGNvbnN0IFZlcnNpb24mIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworfQorCitjb25zdGV4cHIgVmVyc2lvbiBWZXJzaW9uOjppbnZhbGlkKCkgeworICAgIHJldHVybiBWZXJzaW9uKGtOb25lLCBrTm9uZSwga05vbmUpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGJhc2UKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1ZlcnNpb25fdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvVmVyc2lvbl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNDBiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL1ZlcnNpb25fdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1ZlcnNpb24uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChWZXJzaW9uLCBOdW1iZXJDdG9yKSB7CisgICAgVmVyc2lvbiB2MSgxLDEsMSk7CisgICAgRVhQRUNUX1NUUkVRKCIxLjEuMSIsIHYxLnRvU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBWZXJzaW9uIHYyKDEsMSwwKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEuMS4wIiwgdjIudG9TdHJpbmcoKS5jX3N0cigpKTsKKworICAgIFZlcnNpb24gdjMoMSwxLDAsMTIpOworICAgIEVYUEVDVF9TVFJFUSgiMS4xLjAtMTIiLCB2My50b1N0cmluZygpLmNfc3RyKCkpOworfQorCitURVNUKFZlcnNpb24sIENvbXBhcmUpIHsKKyAgICBWZXJzaW9uIHYoMSwgMSwgMSk7CisKKyAgICBFWFBFQ1RfTkUodiwgVmVyc2lvbigxLCAxLCAwKSk7CisgICAgRVhQRUNUX05FKHYsIFZlcnNpb24oMSwgMCwgMSkpOworICAgIEVYUEVDVF9ORSh2LCBWZXJzaW9uKDAsIDEsIDEpKTsKKyAgICBFWFBFQ1RfTkUodiwgVmVyc2lvbigxLCAxLCAxLCAxKSk7CisKKyAgICBFWFBFQ1RfRVEodiwgVmVyc2lvbigxLCAxLCAxKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMSwgMSwgMSwgMiksIFZlcnNpb24oMSwgMSwgMSwgMikpOworCisgICAgRVhQRUNUX0xUKHYsIFZlcnNpb24oMiwgMSwgMSkpOworICAgIEVYUEVDVF9MVCh2LCBWZXJzaW9uKDEsIDIsIDEpKTsKKyAgICBFWFBFQ1RfTFQodiwgVmVyc2lvbigxLCAxLCAyKSk7CisgICAgRVhQRUNUX0xUKHYsIFZlcnNpb246OmludmFsaWQoKSk7CisKKyAgICBFWFBFQ1RfTFQodiwgVmVyc2lvbigxLCAxLCAxLCAxKSk7Cit9CisKK1RFU1QoVmVyc2lvbiwgU3RyaW5nQ3RvcikgeworICAgIFZlcnNpb24gdjEoIjEuMS4xIik7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMSwxLDEpLCB2MSk7CisKKyAgICBWZXJzaW9uIHYyKCIxMi4xLjAiKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbigxMiwxLDApLCB2Mik7CisKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbigxMiwxLDApLCBWZXJzaW9uKCIxMi4xIikpOworICAgIEVYUEVDVF9FUShWZXJzaW9uKDEyLDAsMCksIFZlcnNpb24oIjEyIikpOworCisgICAgVmVyc2lvbiB2MygiMTIuMC4wIik7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMTIsMCwwKSwgdjMpOworCisgICAgVmVyc2lvbiB2NCgiMTIuMC4wMSIpOworICAgIEVYUEVDVF9FUShWZXJzaW9uKDEyLDAsMSksIHY0KTsKKworICAgIFZlcnNpb24gdjUoIjEyLi4xIik7CisgICAgRVhQRUNUX0VRKFZlcnNpb246OmludmFsaWQoKSwgdjUpOworCisgICAgVmVyc2lvbiB2NigiLjEiKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbjo6aW52YWxpZCgpLCB2Nik7CisKKyAgICBWZXJzaW9uIHY3KCIxLjIuMy40LjUiKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbjo6aW52YWxpZCgpLCB2Nyk7CisKKyAgICBWZXJzaW9uIHY4KCIxLjIuMy40LiIpOworICAgIEVYUEVDVF9FUShWZXJzaW9uOjppbnZhbGlkKCksIHY4KTsKKworICAgIFZlcnNpb24gdjkoIjEyLmZvb2JhciIpOworICAgIEVYUEVDVF9FUShWZXJzaW9uOjppbnZhbGlkKCksIHY5KTsKKworICAgIFZlcnNpb24gdjEwKCIxLjIuMy00Iik7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMSwgMiwgMywgNCksIHYxMCk7CisKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbjo6aW52YWxpZCgpLCBWZXJzaW9uKCIiKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb246OmludmFsaWQoKSwgVmVyc2lvbihudWxscHRyKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb246OmludmFsaWQoKSwgVmVyc2lvbigiMS4yLjMuMyBiZXRhIikpOworICAgIEVYUEVDVF9FUShWZXJzaW9uOjppbnZhbGlkKCksIFZlcnNpb24oIjEuMi4zIHByZXZpZXciKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb246OmludmFsaWQoKSwgVmVyc2lvbigiIDEuMi4zIikpOworICAgIEVYUEVDVF9FUShWZXJzaW9uOjppbnZhbGlkKCksIFZlcnNpb24oIjEuMi4zICIpKTsKKworICAgIEVYUEVDVF9FUShWZXJzaW9uOjppbnZhbGlkKCksIFZlcnNpb24oVmVyc2lvbjo6aW52YWxpZCgpLnRvU3RyaW5nKCkpKTsKK30KKworVEVTVChWZXJzaW9uLCBUb1N0cmluZykgeworICAgIFZlcnNpb24gdjEoMSwxLDEpOworICAgIEVYUEVDVF9TVFJFUSgiMS4xLjEiLCB2MS50b1N0cmluZygpLmNfc3RyKCkpOworCisgICAgVmVyc2lvbiB2MigwLCAwLCAxKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAuMC4xIiwgdjIudG9TdHJpbmcoKS5jX3N0cigpKTsKKworICAgIFZlcnNpb24gdjMoMSwwLDApOworICAgIEVYUEVDVF9TVFJFUSgiMS4wLjAiLCB2My50b1N0cmluZygpLmNfc3RyKCkpOworCisgICAgVmVyc2lvbiB2NCgxLDAsMCwxMik7CisgICAgRVhQRUNUX1NUUkVRKCIxLjAuMC0xMiIsIHY0LnRvU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK1RFU1QoVmVyc2lvbiwgQWNjZXNzb3JzKSB7CisgICAgVmVyc2lvbiB2ZXIoMTAsMTEsMjAwLDMwMzApOworICAgIEVYUEVDVF9FUSgxMCwgdmVyLmNvbXBvbmVudDxWZXJzaW9uOjprTWFqb3I+KCkpOworICAgIEVYUEVDVF9FUSgxMSwgdmVyLmNvbXBvbmVudDxWZXJzaW9uOjprTWlub3I+KCkpOworICAgIEVYUEVDVF9FUSgyMDAsIHZlci5jb21wb25lbnQ8VmVyc2lvbjo6a01pY3JvPigpKTsKKyAgICBFWFBFQ1RfRVEoMzAzMCwgdmVyLmNvbXBvbmVudDxWZXJzaW9uOjprQnVpbGQ+KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jUmVhZGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jUmVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTc1OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNSZWFkZXIuY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jUmVhZGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRFcnJvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK3ZvaWQgQXN5bmNSZWFkZXI6OnJlc2V0KHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpGZFdhdGNoKiB3YXRjaCkgeworICAgIG1CdWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWZmZXIpOworICAgIG1CdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKKyAgICBtUG9zID0gMFU7CisgICAgbUZkV2F0Y2ggPSB3YXRjaDsKKyAgICBpZiAoYnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgd2F0Y2gtPndhbnRSZWFkKCk7CisgICAgfQorfQorCitBc3luY1N0YXR1cyBBc3luY1JlYWRlcjo6cnVuKCkgeworICAgIGlmIChtUG9zID49IG1CdWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBrQXN5bmNDb21wbGV0ZWQ7CisgICAgfQorCisgICAgZG8geworICAgICAgICBzc2l6ZV90IHJldCA9IHNvY2tldFJlY3YobUZkV2F0Y2gtPmZkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyICsgbVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplIC0gbVBvcyk7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gRGlzY29ubmVjdGlvbiEKKyAgICAgICAgICAgIGVycm5vID0gRUNPTk5SRVNFVDsKKyAgICAgICAgICAgIHJldHVybiBrQXN5bmNFcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgbUZkV2F0Y2gtPndhbnRSZWFkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtBc3luY0FnYWluOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGtBc3luY0Vycm9yOworICAgICAgICB9CisgICAgICAgIG1Qb3MgKz0gc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpOworICAgIH0gd2hpbGUgKG1Qb3MgPCBtQnVmZmVyU2l6ZSk7CisKKyAgICBtRmRXYXRjaC0+ZG9udFdhbnRSZWFkKCk7CisgICAgcmV0dXJuIGtBc3luY0NvbXBsZXRlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1JlYWRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2UyZTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNSZWFkZXIuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTdGF0dXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBIZWxwZXIgY2xhc3MgdG8gaGVscCByZWFkIGRhdGEgZnJvbSBhIHNvY2tldCBhc3luY2hyb25vdXNseS4KKy8vCisvLyBDYWxsIHJlc2V0KCkgdG8gaW5kaWNhdGUgaG93IG1hbnkgYnl0ZXMgb2YgZGF0YSB0byByZWFkIGludG8gYQorLy8gY2xpZW50LXByb3ZpZGVkIGJ1ZmZlciwgYW5kIGEgTG9vcGVyOjpGZFdhdGNoIHRvIHVzZS4KKy8vCisvLyBUaGVuIGluIHRoZSBGZFdhdGNoIGNhbGxiYWNrLCBjYWxsIHJ1bigpIG9uIGkvbyByZWFkIGV2ZW50cy4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIEFzeW5jU3RhdHVzIHRoYXQgaW5kaWNhdGVzIHdoYXQgdG8gZG8KKy8vIGFmdGVyIHRoZSBydW4uCisvLworLy8gVXNhZ2UgZXhhbXBsZToKKy8vCisvLyAgICAgQXN5bmNSZWFkZXIgbXlSZWFkZXI7CisvLyAgICAgbXlSZWFkZXIucmVzZXQobXlCdWZmZXIsIHNpemVvZiBteUJ1ZmZlciwgbXlGZFdhdGNoKTsKKy8vICAgICAuLi4KKy8vICAgICAvLyB3aGVuIGFuIGV2ZW50IGhhcHBlbnMgb24gbXlGZFdhdGNoCisvLyAgICAgQXN5bmNTdGF0dXMgc3RhdHVzID0gbXlSZWFkZXIucnVuKCk7CisvLyAgICAgaWYgKHN0YXR1cyA9PSBrQ29tcGxldGVkKSB7CisvLyAgICAgICAgIC8vIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGRhdGEuCisvLyAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0ga0Vycm9yKSB7CisvLyAgICAgICAgIC8vIGkvbyBlcnJvciAoaS5lLiBzb2NrZXQgZGlzY29ubmVjdGlvbikuCisvLyAgICAgfSBlbHNlIHsgIC8vIHJlYWxseSB8c3RhdHVzID09IGtBZ2FpbnwKKy8vICAgICAgICAgLy8gc3RpbGwgbW9yZSBkYXRhIG5lZWRlZCB0byBmaWxsIHRoZSBidWZmZXIuCisvLyAgICAgfQorLy8KK2NsYXNzIEFzeW5jUmVhZGVyIHsKK3B1YmxpYzoKKyAgICBBc3luY1JlYWRlcigpIDoKKyAgICAgICAgICAgIG1CdWZmZXIoTlVMTCksCisgICAgICAgICAgICBtQnVmZmVyU2l6ZSgwVSksCisgICAgICAgICAgICBtUG9zKDApLAorICAgICAgICAgICAgbUZkV2F0Y2goTlVMTCkge30KKworICAgIHZvaWQgcmVzZXQodm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZlNpemUsIExvb3Blcjo6RmRXYXRjaCogd2F0Y2gpOworCisgICAgQXN5bmNTdGF0dXMgcnVuKCk7CisKK3ByaXZhdGU6CisgICAgdWludDhfdCogbUJ1ZmZlcjsKKyAgICBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgc2l6ZV90IG1Qb3M7CisgICAgTG9vcGVyOjpGZFdhdGNoKiBtRmRXYXRjaDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTb2NrZXRTZXJ2ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTb2NrZXRTZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MzJmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlci5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU29ja2V0U2VydmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK3VzaW5nIEZkV2F0Y2ggPSBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkZkV2F0Y2g7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEJhc2VTb2NrZXRTZXJ2ZXIgOiBwdWJsaWMgQXN5bmNTb2NrZXRTZXJ2ZXIgeworcHVibGljOgorICAgIEJhc2VTb2NrZXRTZXJ2ZXIoTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RDYWxsYmFjayBjb25uZWN0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICBpbnQgc29ja2V0NCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzb2NrZXQ2KQorICAgICAgICA6IG1Mb29wZXIobG9vcGVyKSwgbVBvcnQocG9ydCksIG1Db25uZWN0Q2FsbGJhY2soY29ubmVjdENhbGxiYWNrKSB7CisgICAgICAgIGlmIChzb2NrZXQ0ID49IDApIHsKKyAgICAgICAgICAgIG1Cb3VuZFNvY2tldDQucmVzZXQobG9vcGVyLT5jcmVhdGVGZFdhdGNoKHNvY2tldDQsIG9uQWNjZXB0LCB0aGlzKSk7CisgICAgICAgICAgICBDSEVDSyhtQm91bmRTb2NrZXQ0LmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29ja2V0NiA+PSAwKSB7CisgICAgICAgICAgICBtQm91bmRTb2NrZXQ2LnJlc2V0KGxvb3Blci0+Y3JlYXRlRmRXYXRjaChzb2NrZXQ2LCBvbkFjY2VwdCwgdGhpcykpOworICAgICAgICAgICAgQ0hFQ0sobUJvdW5kU29ja2V0Ni5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5CYXNlU29ja2V0U2VydmVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBpbnQgcG9ydCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1Qb3J0OyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQm91bmRTb2NrZXQ0KSB7CisgICAgICAgICAgICBtQm91bmRTb2NrZXQ0LT53YW50UmVhZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChtQm91bmRTb2NrZXQ2KSB7CisgICAgICAgICAgICBtQm91bmRTb2NrZXQ2LT53YW50UmVhZCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBzdG9wTGlzdGVuaW5nKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUJvdW5kU29ja2V0NCkgeworICAgICAgICAgICAgbUJvdW5kU29ja2V0NC0+ZG9udFdhbnRSZWFkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Cb3VuZFNvY2tldDYpIHsKKyAgICAgICAgICAgIG1Cb3VuZFNvY2tldDYtPmRvbnRXYW50UmVhZCgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgTG9vcGJhY2tNb2RlIGdldExpc3Rlbk1vZGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQm91bmRTb2NrZXQ0ID8gKG1Cb3VuZFNvY2tldDYgPyBrSVB2NEFuZElQdjYgOiBrSVB2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobUJvdW5kU29ja2V0NiA/IGtJUHY2IDoga05vbmUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBpL28gZXZlbnQgaGFwcGVucyBvbiB0aGUgYm91bmQgc29ja2V0LiBUeXBpY2FsbHkKKyAgICAvLyBhIHJlYWQgZXZlbnQgaW5kaWNhdGVzIGEgbmV3IGNsaWVudCBjb25uZWN0aW9uLgorICAgIHN0YXRpYyB2b2lkIG9uQWNjZXB0KHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICAgICAgYXV0byBzZXJ2ZXIgPSByZWludGVycHJldF9jYXN0PEJhc2VTb2NrZXRTZXJ2ZXIqPihvcGFxdWUpOworICAgICAgICBpZiAoZXZlbnRzICYgRmRXYXRjaDo6a0V2ZW50UmVhZCkgeworICAgICAgICAgICAgaW50IGNsaWVudEZkID0gc29ja2V0QWNjZXB0QW55KGZkKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRGZCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY2xpZW50IGNsb3NlZCB0aGUgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB3ZSBjb3VsZCBwcm9jZXNzIGl0LiBKdXN0IGV4aXQgYW5kIHRyeSB1bnRpbCB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXh0IHRpbWUuCisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRXJyb3Igd2hlbiBhY2NlcHRpbmcgaG9zdCBjb25uZWN0aW9uIjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTdG9wIGxpc3RlbmluZyBub3csIHRoaXMgbGV0cyB0aGUgY2FsbGJhY2sgY2FsbCBzdGFydExpc3RlbmluZygpCisgICAgICAgICAgICAvLyBpZiBpdCB3YW50cyB0byBhbGxvdyBuZXcgY29ubmVjdGlvbnMgaW1tZWRpYXRlbHkuIEl0IGFsc28gbWVhbnMKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2FsbCBpdCBleHBsaWNpdGx5IGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICAgICAgICBzZXJ2ZXItPnN0b3BMaXN0ZW5pbmcoKTsKKyAgICAgICAgICAgIGlmICghc2VydmVyLT5tQ29ubmVjdENhbGxiYWNrKGNsaWVudEZkKSkgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgY2FsbGJhY2sgcHJpbnRlZCBhbnkgbmVjZXNzYXJ5IGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgc29ja2V0Q2xvc2UoY2xpZW50RmQpOworICAgICAgICAgICAgICAgIHNlcnZlci0+c3RhcnRMaXN0ZW5pbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTY29wZWRTb2NrZXRXYXRjaCBtQm91bmRTb2NrZXQ0OworICAgIFNjb3BlZFNvY2tldFdhdGNoIG1Cb3VuZFNvY2tldDY7CisgICAgTG9vcGVyKiBtTG9vcGVyID0gbnVsbHB0cjsKKyAgICBpbnQgbVBvcnQgPSAwOworICAgIENvbm5lY3RDYWxsYmFjayBtQ29ubmVjdENhbGxiYWNrOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPEFzeW5jU29ja2V0U2VydmVyPiBBc3luY1NvY2tldFNlcnZlcjo6Y3JlYXRlVGNwTG9vcGJhY2tTZXJ2ZXIoCisgICAgICAgIGludCBwb3J0LAorICAgICAgICBDb25uZWN0Q2FsbGJhY2sgY29ubmVjdENhbGxiYWNrLAorICAgICAgICBMb29wYmFja01vZGUgbW9kZSwKKyAgICAgICAgTG9vcGVyKiBsb29wZXIpIHsKKyAgICBpZiAoIWxvb3BlcikgeworICAgICAgICBsb29wZXIgPSBUaHJlYWRMb29wZXI6OmdldCgpOworICAgIH0KKyAgICBTY29wZWRTb2NrZXQgc29jazQ7CisgICAgU2NvcGVkU29ja2V0IHNvY2s2OworCisgICAgLy8gSWYgfHBvcnR8IGlzIDAsIHdlIGxldCB0aGUgc3lzdGVtIGZpbmQgYSByYW5kb20gZnJlZSBwb3J0LCBidXQKKyAgICAvLyBpbiB0aGUgY2FzZSBvZiBrSVB2NEFuZElQdjYsIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMgcG9zc2libGUKKyAgICAvLyB0byBiaW5kIHRvIGJvdGggcG9ydHMuIExvb3AgYSBmZXcgdGltZXMgdG8gZW5zdXJlIHRoYXQgdGhpcyBpcyB0aGUKKyAgICAvLyBjYXNlLgorICAgIGludCB0cmllcyA9IChwb3J0ID09IDAgJiYgbW9kZSA9PSBrSVB2NEFuZElQdjYpID8gNSA6IDE7CisgICAgaW50IHBvcnQwID0gcG9ydDsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IgKDsgdHJpZXMgPiAwOyB0cmllcy0tKSB7CisgICAgICAgIHBvcnQgPSBwb3J0MDsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgICAgIGlmICgobW9kZSAmIGtJUHY0KSAhPSAwKSB7CisgICAgICAgICAgICBzb2NrNC5yZXNldChzb2NrZXRUY3A0TG9vcGJhY2tTZXJ2ZXIocG9ydCkpOworICAgICAgICAgICAgaWYgKCFzb2NrNC52YWxpZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIGtJUHY0T3B0aW9uYWwpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwb3J0KSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHNvY2tldEdldFBvcnQoc29jazQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgobW9kZSAmIGtJUHY2KSAhPSAwKSB7CisgICAgICAgICAgICBzb2NrNi5yZXNldChzb2NrZXRUY3A2TG9vcGJhY2tTZXJ2ZXIocG9ydCkpOworICAgICAgICAgICAgaWYgKCFzb2NrNi52YWxpZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobW9kZSAmIGtJUHY2T3B0aW9uYWwpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFwb3J0KSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IHNvY2tldEdldFBvcnQoc29jazYuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsgYnJlYWs7IH0KKyAgICB9CisKKyAgICBBc3luY1NvY2tldFNlcnZlciogcmVzdWx0ID0gbnVsbHB0cjsKKworICAgIGlmIChzdWNjZXNzICYmIChzb2NrNC52YWxpZCgpIHx8IHNvY2s2LnZhbGlkKCkpKSB7CisgICAgICAgIHJlc3VsdCA9IG5ldyBCYXNlU29ja2V0U2VydmVyKGxvb3BlciwgcG9ydCwgY29ubmVjdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrNC5yZWxlYXNlKCksIHNvY2s2LnJlbGVhc2UoKSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QXN5bmNTb2NrZXRTZXJ2ZXI+KHJlc3VsdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTb2NrZXRTZXJ2ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU29ja2V0U2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5ZmZlZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU29ja2V0U2VydmVyLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgTG9vcGVyOworCitjbGFzcyBBc3luY1NvY2tldFNlcnZlciB7CitwdWJsaWM6CisgICAgLy8gVHlwZSBvZiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAvLyBvY2N1cnMuIFRoZSBwYXJhbWV0ZXIgaXMgYSBzb2NrZXQgZGVzY3JpcHRvci4gTm90ZSB0aGF0IHN0b3BMaXN0ZW5pbmcoKQorICAgIC8vIHdpbGwgaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGxiYWNrLiBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZQorICAgIC8vIGFuZCBwYXNzIG93bmVyc2hpcCBvZiB0aGUgc29ja2V0IHRvIHRoZSBjYWxsYmFjay4gT24gZmFpbHVyZSwgcmV0dXJuCisgICAgLy8gZmFsc2UgKGFuZCB0aGUgY2FsbGVyIHdpbGwgY2xvc2UgdGhlIHNvY2tldCB0aGVuIGNhbGwgc3RhcnRMaXN0ZW5pbmcoKSkuCisgICAgdXNpbmcgQ29ubmVjdENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjxib29sKGludCk+OworCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsIH5Bc3luY1NvY2tldFNlcnZlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFJldHVybiB0aGUgcG9ydCB0aGF0IHRoaXMgc2VydmVyIGlzIGJvdW5kIHRvLiBUaGlzIGlzIHVzZWZ1bCBpZgorICAgIC8vIHRoZSB8cG9ydHwgcGFyYW1ldGVyIG9mIGZ1bmN0aW9ucyBsaWtlIGNyZWF0ZVRjcExvb3BiYWNrU2VydmVyKCkKKyAgICAvLyB3YXMgMCwgd2hpY2ggbWVhbnQgdGhlIHN5c3RlbSBmb3VuZCBhIHJhbmRvbSBmcmVlIHBvcnQgd2hpY2ggY2FuCisgICAgLy8gYmUgcmVwb3J0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIGludCBwb3J0KCkgY29uc3QgPSAwOworCisgICAgLy8gU3RhcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuCisgICAgLy8gTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIGEgbmV3IGluc3RhbmNlIGRvZXNuJ3QgbGlzdGVuIGZvciBjb25uZWN0aW9ucy4KKyAgICAvLyBNb3Jlb3ZlciwgdGhlIHNlcnZlciB3aWxsIHN0b3AgbGlzdGVuaW5nIGJlZm9yZSBpbnZva2luZyB0aGUgY2FsbGJhY2sKKyAgICAvLyBvbiBhIG5ldyBjb25uZWN0aW9uLiBVc2VyIGNvZGUgbXVzdCBjYWxsIHN0YXJ0TGlzdGVuaW5nKCkgZXhwbGljaXRseQorICAgIC8vIHRvIGFsbG93IG1vcmUgY29ubmVjdGlvbnMgdG8gcHJvY2VlZC4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSA9IDA7CisKKyAgICAvLyBTdG9wIGxpc3RlbmluZyBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICAgIHZpcnR1YWwgdm9pZCBzdG9wTGlzdGVuaW5nKCkgPSAwOworCisgICAgLy8gVmFsdWVzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggbG9vcGJhY2sgaW50ZXJmYWNlcyB0byBsaXN0ZW4gdG8uCisgICAgLy8ga05vbmUgbWVhbnMgbm8gbGlzdGVuaW5nIG9uIGFueSBpbnRlcmZhY2UuCisgICAgLy8ga0lQdjQgbWVhbnMgbGlzdGVuaW5nIG9uIDEyNy4wLjAuMS4KKyAgICAvLyBrSVB2NiBtZWFucyBsaXN0ZW5pbmcgb24gOjoxCisgICAgLy8ga0lQdjRPcHRpb25hbCBtZWFucyB0aGF0IGJpbmRpbmcgdG8gMTI3LjAuMC4xIGlzIGFsbG93ZWQgdG8gZmFpbC4KKyAgICAvLyBrSVB2Nk9wdGlvbmFsIG1lYW5zIHRoYXQgYmluZGluZyB0byA6OjEgaXMgYWxsb3dlZCB0byBmYWlsLgorICAgIC8vIGtJUHY0QW5kSVB2NiBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgc2hvdWxkIGJpbmQgdG8gYm90aCBpbnRlcmZhY2VzCisgICAgLy8gYXQgdGhlIHNhbWUgdGltZS4KKyAgICAvLyBrSVB2NEFuZE9wdGlvbmFsSVB2NiBtZWFucyB0aGF0IHRoZSBzZXJ2ZXIgbXVzdCBiaW5kIHRvIDEyNy4wLjAuMSBhbmQKKyAgICAvLyBpcyBhbGxvd2VkIHRvIGZhaWwgdG8gYmluZCB0byB0aGUgY29ycmVzcG9uZGluZyA6OjEgcG9ydC4KKyAgICBlbnVtIExvb3BiYWNrTW9kZSB7CisgICAgICAgIGtOb25lID0gMCwKKyAgICAgICAga0lQdjQgPSAoMSA8PCAwKSwKKyAgICAgICAga0lQdjYgPSAoMSA8PCAxKSwKKyAgICAgICAga0lQdjRPcHRpb25hbCA9ICgxIDw8IDIpLAorICAgICAgICBrSVB2Nk9wdGlvbmFsID0gKDEgPDwgMyksCisgICAgICAgIGtJUHY0QW5kSVB2NiA9IGtJUHY0IHwga0lQdjYsCisgICAgICAgIGtJUHY0QW5kT3B0aW9uYWxJUHY2ID0ga0lQdjQgfCBrSVB2NiB8IGtJUHY2T3B0aW9uYWwsCisgICAgfTsKKworICAgIC8vIFJldHVybiB0aGUgc2V0IG9mIGludGVyZmFjZXMgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgb24uCisgICAgLy8gUG9zc2libGUgdmFsdWVzIGFyZSBrTm9uZSwga0lQdjQsIGtJUHY2IGFuZCBrSVB2NEFuZElQdjYKKyAgICB2aXJ0dWFsIExvb3BiYWNrTW9kZSBnZXRMaXN0ZW5Nb2RlKCkgY29uc3QgPSAwOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHRoYXQgYmluZHMgdG8gYSBUQ1AgbG9vcGJhY2sgfHBvcnR8IGFuZCB3aWxsCisgICAgLy8gY2FsbCB8Y29ubmVjdENhbGxiYWNrfCB3aGVuIGEgbmV3IGhvc3QgY29ubmVjdGlvbiBvY2N1cnMuIHxtb2RlfAorICAgIC8vIGRldGVybWluZXMgb24gd2hpY2ggaW50ZXJmYWNlcyB0byBsaXN0ZW4gdG8gYW5kIGRlZmF1bHRzIHRvCisgICAgLy8ga0lQdjRBbmRJUHY2LCB3aGlsZSB8bG9vcGVyfCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgTG9vcGVyIGluc3RhbmNlCisgICAgLy8gKG90aGVyd2lzZSB0aGUgdGhyZWFkJ3MgY3VycmVudCBsb29wZXIgd2lsbCBiZSB1c2VkKS4KKyAgICAvLyBSZXR1cm4gYW4gZW1wdHkgc3RkOjp1bmlxdWVfcHRyPD4gb24gZXJyb3IuCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBc3luY1NvY2tldFNlcnZlcj4gY3JlYXRlVGNwTG9vcGJhY2tTZXJ2ZXIoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIENvbm5lY3RDYWxsYmFjayBjb25uZWN0Q2FsbGJhY2ssCisgICAgICAgICAgICBMb29wYmFja01vZGUgbW9kZSA9IGtJUHY0QW5kSVB2NiwKKyAgICAgICAgICAgIExvb3BlciogbG9vcGVyID0gbnVsbHB0cik7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBObyBkZWZhdWx0IGNvbnN0cnVjdG9yLCB1c2Ugb25lIG9mIHRoZSBzdGF0aWMgY3JlYXRlWFhYKCkgbWV0aG9kIHRvCisgICAgLy8gY3JlYXRlIGEgbmV3IGluc3RhbmNlLgorICAgIEFzeW5jU29ja2V0U2VydmVyKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlNTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU29ja2V0U2VydmVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTb2NrZXRTZXJ2ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IFRlc3REYXRhIHsKKyAgICBUZXN0RGF0YShMb29wZXIqIGxvb3BlciwgaW50IHBvcnQpIDogbUxvb3Blcihsb29wZXIpLCBtUG9ydChwb3J0KSB7fQorCisgICAgLy8gU3RhcnQgYSBzZXJ2ZXIgdGhhdCB3aWxsIGNhbGwgOjpvbkNvbm5lY3Rpb24gb24gZWFjaCBjb25uZWN0aW9uIGF0dGVtcHQuCisgICAgYm9vbCBzdGFydFNlcnZlcihBc3luY1NvY2tldFNlcnZlcjo6TG9vcGJhY2tNb2RlIG1vZGUpIHsKKyAgICAgICAgYXV0byBjYWxsYmFjayA9CisgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZUZXN0RGF0YTo6b25Db25uZWN0aW9uLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpOworICAgICAgICBtU2VydmVyID0gQXN5bmNTb2NrZXRTZXJ2ZXI6OmNyZWF0ZVRjcExvb3BiYWNrU2VydmVyKG1Qb3J0LCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBtTG9vcGVyKTsKKyAgICAgICAgaWYgKCFtU2VydmVyLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbVBvcnQgPSBtU2VydmVyLT5wb3J0KCk7CisgICAgICAgIG1TZXJ2ZXItPnN0YXJ0TGlzdGVuaW5nKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE9uIGV2ZXJ5IGNvbm5lY3Rpb24sIGluY3JlbWVudCB0aGUgY291bnRlciwgcmVhZCBvbmUgYnl0ZSBmcm9tIHRoZQorICAgIC8vIHNvY2tldCwgdGhlbiBjbG9zZSBpdCEgTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBzdGFydCBsaXN0ZW5pbmcgZm9yCisgICAgLy8gbmV3IGNvbm5lY3Rpb25zLCB0aGlzIGlzIGxlZnQgdG8gdGhlIHRlc3QgaXRzZWxmLgorICAgIGJvb2wgb25Db25uZWN0aW9uKGludCBzb2NrZXQpIHsKKyAgICAgICAgdGhpcy0+bUNvdW50ZXIrKzsKKyAgICAgICAgY2hhciBjID0gMDsKKyAgICAgICAgRVhQRUNUX0VRKDEsIHNvY2tldFJlY3Yoc29ja2V0LCAmYywgMSkpOworICAgICAgICBFWFBFQ1RfRVEoMHg0MiwgYyk7CisgICAgICAgIHNvY2tldENsb3NlKHNvY2tldCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENvbm5lY3QgdG8gSVB2NCBsb29wYmFjayB8cG9ydHwgYW5kIHNlbmQgb25lIGJ5dGUgb2YgZGF0YS4KKyAgICBzdGF0aWMgaW50cHRyX3QgY29ubmVjdEFuZFdyaXRlVG80KGludCBwb3J0KSB7CisgICAgICAgIC8vIEJsb2NraW5nIGNvbm5lY3QgdG8gdGhlIHNvY2tldC4KKyAgICAgICAgaW50IHMgPSBzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQocG9ydCk7CisgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvbm5lY3Rpb24gZmFpbGVkOiAiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8vIFdyaXRlIGEgYnl0ZSB0byBpdC4KKyAgICAgICAgY2hhciBjID0gMHg0MjsKKyAgICAgICAgaW50IHJldCA9IHNvY2tldFNlbmQocywgJmMsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBzZW5kIGRhdGEiOworICAgICAgICB9CisgICAgICAgIHNvY2tldENsb3NlKHMpOworICAgICAgICByZXR1cm4gKHJldCA9PSAxKSA/IDAgOiAtMTsKKyAgICB9CisKKyAgICAvLyBDb25uZWN0IHRvIElQdjYgbG9vcGJhY2sgfHBvcnR8IGFuZCBzZW5kIG9uZSBieXRlIG9mIGRhdGEuCisgICAgc3RhdGljIGludHB0cl90IGNvbm5lY3RBbmRXcml0ZVRvNihpbnQgcG9ydCkgeworICAgICAgICAvLyBCbG9ja2luZyBjb25uZWN0IHRvIHRoZSBzb2NrZXQuCisgICAgICAgIGludCBzID0gc29ja2V0VGNwNkxvb3BiYWNrQ2xpZW50KHBvcnQpOworICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvLyBXcml0ZSBhIGJ5dGUgdG8gaXQuCisgICAgICAgIGNoYXIgYyA9IDB4NDI7CisgICAgICAgIGludCByZXQgPSBzb2NrZXRTZW5kKHMsICZjLCAxKTsKKyAgICAgICAgc29ja2V0Q2xvc2Uocyk7CisgICAgICAgIHJldHVybiAocmV0ID09IDEpID8gMCA6IC0xOworICAgIH0KKworICAgIExvb3BlciogbUxvb3BlciA9IG51bGxwdHI7CisgICAgaW50IG1Qb3J0ID0gMDsKKyAgICBpbnQgbUNvdW50ZXIgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxBc3luY1NvY2tldFNlcnZlcj4gbVNlcnZlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKEFzeW5jU29ja2V0U2VydmVyLCBjcmVhdGVUY3BMb29wYmFja1NlcnZlcklQdjQpIHsKKyAgICBpbnQga1BvcnQgPSAwOyAgLy8gcmFuZG9tIGhpZ2ggdmFsdWU/CisgICAgaW50IGtEZWxheU1zID0gMjA7CisgICAgTG9vcGVyKiBsb29wZXIgPSBUaHJlYWRMb29wZXI6OmdldCgpOworCisgICAgVGVzdERhdGEgZGF0YShsb29wZXIsIGtQb3J0KTsKKyAgICBBU1NFUlRfVFJVRShkYXRhLnN0YXJ0U2VydmVyKEFzeW5jU29ja2V0U2VydmVyOjprSVB2NCkpOworICAgIEVYUEVDVF9FUShBc3luY1NvY2tldFNlcnZlcjo6a0lQdjQsIGRhdGEubVNlcnZlci0+Z2V0TGlzdGVuTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGF0YS5tQ291bnRlcik7CisKKyAgICAvLyBTdGFydCB0d28gYmFja2dyb3VuZCB0aHJlYWRzIHRoYXQgY29ubmVjdCB0byB0aGUgcG9ydC4KKyAgICAvLyBPbmx5IHRoZSBmaXJzdCBvbmUgd2lsbCBzdWNjZWVkIGJlY2F1c2UgdGhlIEFzeW5jU29ja2V0U2VydmVyCisgICAgLy8gd2lsbCBzdG9wIGxpc3RlbmluZyBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBmaXJzdCBjb25uZWN0aW9uLgorICAgIGF1dG8gY29ubmVjdG9yID0gc3RkOjpiaW5kKCZUZXN0RGF0YTo6Y29ubmVjdEFuZFdyaXRlVG80LCBkYXRhLm1Qb3J0KTsKKyAgICBhbmRyb2lkOjpiYXNlOjphc3luYyhjb25uZWN0b3IpOworICAgIGFuZHJvaWQ6OmJhc2U6OmFzeW5jKGNvbm5lY3Rvcik7CisKKyAgICBpbnQgcmV0ID0gbG9vcGVyLT5ydW5XaXRoRGVhZGxpbmVNcyhsb29wZXItPm5vd01zKCkgKyBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0VRKDEsIGRhdGEubUNvdW50ZXIpOworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIHJldCk7CisKKyAgICAvLyBTdGFydCBsaXN0ZW5pbmcsIHdoaWNoIHNob3VsZCB1bmJsb2NrIHRoZSBzZWNvbmQgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgZGF0YS5tU2VydmVyLT5zdGFydExpc3RlbmluZygpOworICAgIHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMobG9vcGVyLT5ub3dNcygpICsga0RlbGF5TXMpOworICAgIEVYUEVDVF9FUSgyLCBkYXRhLm1Db3VudGVyKTsKKyAgICBFWFBFQ1RfRVEoRVRJTUVET1VULCByZXQpOworfQorCitURVNUKEFzeW5jU29ja2V0U2VydmVyLCBjcmVhdGVUY3BMb29wYmFja1NlcnZlcklQdjYpIHsKKyAgICBpbnQga1BvcnQgPSAwOyAgLy8gcmFuZG9tIGhpZ2ggdmFsdWU/CisgICAgaW50IGtEZWxheU1zID0gMjA7CisgICAgTG9vcGVyKiBsb29wZXIgPSBUaHJlYWRMb29wZXI6OmdldCgpOworCisgICAgVGVzdERhdGEgZGF0YShsb29wZXIsIGtQb3J0KTsKKyAgICBBU1NFUlRfVFJVRShkYXRhLnN0YXJ0U2VydmVyKEFzeW5jU29ja2V0U2VydmVyOjprSVB2NikpOworICAgIEVYUEVDVF9FUShBc3luY1NvY2tldFNlcnZlcjo6a0lQdjYsIGRhdGEubVNlcnZlci0+Z2V0TGlzdGVuTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGF0YS5tQ291bnRlcik7CisKKyAgICAvLyBTdGFydCB0d28gYmFja2dyb3VuZCB0aHJlYWRzIHRoYXQgY29ubmVjdCB0byB0aGUgcG9ydC4KKyAgICAvLyBPbmx5IHRoZSBmaXJzdCBvbmUgd2lsbCBzdWNjZWVkIGJlY2F1c2UgdGhlIEFzeW5jU29ja2V0U2VydmVyCisgICAgLy8gd2lsbCBzdG9wIGxpc3RlbmluZyBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBmaXJzdCBjb25uZWN0aW9uLgorICAgIGF1dG8gY29ubmVjdG9yID0gc3RkOjpiaW5kKCZUZXN0RGF0YTo6Y29ubmVjdEFuZFdyaXRlVG82LCBkYXRhLm1Qb3J0KTsKKyAgICBhbmRyb2lkOjpiYXNlOjphc3luYyhjb25uZWN0b3IpOworICAgIGFuZHJvaWQ6OmJhc2U6OmFzeW5jKGNvbm5lY3Rvcik7CisKKyAgICBpbnQgcmV0ID0gbG9vcGVyLT5ydW5XaXRoRGVhZGxpbmVNcyhsb29wZXItPm5vd01zKCkgKyBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0VRKDEsIGRhdGEubUNvdW50ZXIpOworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIHJldCk7CisKKyAgICAvLyBTdGFydCBsaXN0ZW5pbmcsIHdoaWNoIHNob3VsZCB1bmJsb2NrIHRoZSBzZWNvbmQgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgZGF0YS5tU2VydmVyLT5zdGFydExpc3RlbmluZygpOworICAgIHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMobG9vcGVyLT5ub3dNcygpICsga0RlbGF5TXMpOworICAgIEVYUEVDVF9FUSgyLCBkYXRhLm1Db3VudGVyKTsKKyAgICBFWFBFQ1RfRVEoRVRJTUVET1VULCByZXQpOworfQorCitURVNUKEFzeW5jU29ja2V0U2VydmVyLCBjcmVhdGVUY3BMb29wYmFja1NlcnZlcklQdjRBbmRJUHY2KSB7CisgICAgaW50IGtQb3J0ID0gMDsgIC8vIHJhbmRvbSBoaWdoIHZhbHVlPworICAgIGludCBrRGVsYXlNcyA9IDIwOworICAgIExvb3BlciogbG9vcGVyID0gVGhyZWFkTG9vcGVyOjpnZXQoKTsKKworICAgIFRlc3REYXRhIGRhdGEobG9vcGVyLCBrUG9ydCk7CisgICAgQVNTRVJUX1RSVUUoZGF0YS5zdGFydFNlcnZlcihBc3luY1NvY2tldFNlcnZlcjo6a0lQdjRBbmRJUHY2KSk7CisgICAgRVhQRUNUX0VRKEFzeW5jU29ja2V0U2VydmVyOjprSVB2NEFuZElQdjYsIGRhdGEubVNlcnZlci0+Z2V0TGlzdGVuTW9kZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGF0YS5tQ291bnRlcik7CisKKyAgICAvLyBTdGFydCB0d28gYmFja2dyb3VuZCB0aHJlYWRzIHRoYXQgY29ubmVjdCB0byB0aGUgcG9ydC4KKyAgICAvLyBPbmx5IHRoZSBmaXJzdCBvbmUgd2lsbCBzdWNjZWVkIGJlY2F1c2UgdGhlIEFzeW5jU29ja2V0U2VydmVyCisgICAgLy8gd2lsbCBzdG9wIGxpc3RlbmluZyBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZSBmaXJzdCBjb25uZWN0aW9uLgorICAgIC8vIE5PVEU6IFRoZSBmaXJzdCBvbmUgY29ubmVjdHMgdGhyb3VnaCBJUHY0LCB0aGUgc2Vjb25kIG9uZSB0aHJvdWdoIElQdjYuCisgICAgYXV0byBjb25uZWN0b3I0ID0gc3RkOjpiaW5kKCZUZXN0RGF0YTo6Y29ubmVjdEFuZFdyaXRlVG80LCBkYXRhLm1Qb3J0KTsKKyAgICBhbmRyb2lkOjpiYXNlOjphc3luYyhjb25uZWN0b3I0KTsKKworICAgIGF1dG8gY29ubmVjdG9yNiA9IHN0ZDo6YmluZCgmVGVzdERhdGE6OmNvbm5lY3RBbmRXcml0ZVRvNiwgZGF0YS5tUG9ydCk7CisgICAgYW5kcm9pZDo6YmFzZTo6YXN5bmMoY29ubmVjdG9yNik7CisKKyAgICBpbnQgcmV0ID0gbG9vcGVyLT5ydW5XaXRoRGVhZGxpbmVNcyhsb29wZXItPm5vd01zKCkgKyBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0VRKDEsIGRhdGEubUNvdW50ZXIpOworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIHJldCk7CisKKyAgICAvLyBTdGFydCBsaXN0ZW5pbmcsIHdoaWNoIHNob3VsZCB1bmJsb2NrIHRoZSBzZWNvbmQgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgZGF0YS5tU2VydmVyLT5zdGFydExpc3RlbmluZygpOworICAgIHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMobG9vcGVyLT5ub3dNcygpICsga0RlbGF5TXMpOworICAgIEVYUEVDVF9FUSgyLCBkYXRhLm1Db3VudGVyKTsKKyAgICBFWFBFQ1RfRVEoRVRJTUVET1VULCByZXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0FzeW5jU3RhdHVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1N0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzA4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1N0YXR1cy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIGxpc3Qgb2YgdmFsdWVzIGluZGljYXRpbmcgdGhlIHN0YXRlIG9mIG9uZ29pbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMuCisvLyBUaGlzIGlzIHJldHVybmVkIGJ5IHZhcmlvdXMgbWV0aG9kcyBvZiBoZWxwZXIgY2xhc3NlcyBsaWtlIEFzeW5jUmVhZGVyCisvLyBvciBBc3luY1dyaXRlciB0byBpbmRpY2F0ZSB0byB0aGUgY2FsbGVyIHdoYXQgdG8gZG8gbmV4dC4KKy8vCisvLyB8a0FzeW5jQ29tcGxldGVkfCBtZWFucyB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBwcm9wZXJseS4KKy8vIHxrQXN5bmNBZ2FpbnwgbWVhbnMgdGhlIG9wZXJhdGlvbiBoYXNuJ3QgZmluaXNoZWQgeWV0LgorLy8gfGtBc3luY0Vycm9yfCBpbmRpY2F0ZXMgdGhhdCBhbiBpL28gZXJyb3Igb2NjdXJlZCBhbmQgd2FzIGRldGVjdGVkLgorLy8KK2VudW0gQXN5bmNTdGF0dXMgeworICAgIGtBc3luY0NvbXBsZXRlZCA9IDAsCisgICAga0FzeW5jQWdhaW4sCisgICAga0FzeW5jRXJyb3IKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NDY5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1dyaXRlci5jcHAKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1dyaXRlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RXJyb3JzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCit2b2lkIEFzeW5jV3JpdGVyOjpyZXNldChjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6RmRXYXRjaCogd2F0Y2gpIHsKKyAgICBtQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKTsKKyAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgbVBvcyA9IDA7CisgICAgbUZkV2F0Y2ggPSB3YXRjaDsKKyAgICBpZiAoYnVmZmVyU2l6ZSA+IDApIHsKKyAgICAgICAgd2F0Y2gtPndhbnRXcml0ZSgpOworICAgIH0KK30KKworQXN5bmNTdGF0dXMgQXN5bmNXcml0ZXI6OnJ1bigpIHsKKyAgICBpZiAobVBvcyA+PSBtQnVmZmVyU2l6ZSkgeworICAgICAgICByZXR1cm4ga0FzeW5jQ29tcGxldGVkOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgc3NpemVfdCByZXQgPSBzb2NrZXRTZW5kKG1GZFdhdGNoLT5mZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciArIG1Qb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVyU2l6ZSAtIG1Qb3MpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIC8vIERpc2Nvbm5lY3Rpb24hCisgICAgICAgICAgICBlcnJubyA9IEVDT05OUkVTRVQ7CisgICAgICAgICAgICByZXR1cm4ga0FzeW5jRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga0FzeW5jQWdhaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4ga0FzeW5jRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgbVBvcyArPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCk7CisgICAgfSB3aGlsZSAobVBvcyA8IG1CdWZmZXJTaXplKTsKKworICAgIG1GZFdhdGNoLT5kb250V2FudFdyaXRlKCk7CisgICAgcmV0dXJuIGtBc3luY0NvbXBsZXRlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1dyaXRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUwOWFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTdGF0dXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitjbGFzcyBBc3luY1dyaXRlciB7CitwdWJsaWM6CisgICAgQXN5bmNXcml0ZXIoKSA6CisgICAgICAgICAgICBtQnVmZmVyKE5VTEwpLAorICAgICAgICAgICAgbUJ1ZmZlclNpemUoMFUpLAorICAgICAgICAgICAgbVBvcygwVSksCisgICAgICAgICAgICBtRmRXYXRjaChOVUxMKSB7fQorCisgICAgdm9pZCByZXNldChjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgIExvb3Blcjo6RmRXYXRjaCogd2F0Y2gpOworCisgICAgQXN5bmNTdGF0dXMgcnVuKCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgdWludDhfdCogbUJ1ZmZlcjsKKyAgICBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgc2l6ZV90IG1Qb3M7CisgICAgTG9vcGVyOjpGZFdhdGNoKiBtRmRXYXRjaDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvRGVmYXVsdExvb3Blci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9EZWZhdWx0TG9vcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM0NTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvRGVmYXVsdExvb3Blci5jcHAKQEAgLTAsMCArMSwzOTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0RlZmF1bHRMb29wZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldEVycm9ycy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK0RlZmF1bHRMb29wZXI6OkRlZmF1bHRMb29wZXIoKSA6IG1XYWl0ZXIoU29ja2V0V2FpdGVyOjpjcmVhdGUoKSkge30KKworRGVmYXVsdExvb3Blcjo6fkRlZmF1bHRMb29wZXIoKSA9IGRlZmF1bHQ7CisKK0xvb3Blcjo6RHVyYXRpb24gRGVmYXVsdExvb3Blcjo6bm93TXMoTG9vcGVyOjpDbG9ja1R5cGUgY2xvY2tUeXBlKSB7CisgICAgRENIRUNLKGNsb2NrVHlwZSA9PSBDbG9ja1R5cGU6OmtIb3N0KTsKKworICAgIGNvbnN0IER1cmF0aW9uTnMgbnNUaW1lID0gbm93TnMoY2xvY2tUeXBlKTsKKyAgICByZXR1cm4gbnNUaW1lID09IHN0YXRpY19jYXN0PER1cmF0aW9uTnM+KC0xKQorICAgICAgICAgICAgICAgICAgID8gLTEKKyAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PER1cmF0aW9uPihuc1RpbWUgLyAxMDAwMDAwKTsKK30KKworTG9vcGVyOjpEdXJhdGlvbk5zIERlZmF1bHRMb29wZXI6Om5vd05zKExvb3Blcjo6Q2xvY2tUeXBlIGNsb2NrVHlwZSkgeworICAgIERDSEVDSyhjbG9ja1R5cGUgPT0gQ2xvY2tUeXBlOjprSG9zdCk7CisKKyAgICByZXR1cm4gU3lzdGVtOjpnZXQoKS0+Z2V0VW5peFRpbWVVcygpICogMTAwMHVsbDsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpmb3JjZVF1aXQoKSB7CisgICAgbUZvcmNlZEV4aXQgPSB0cnVlOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OmFkZEZkV2F0Y2goRGVmYXVsdExvb3Blcjo6RmRXYXRjaCogd2F0Y2gpIHsKKyAgICBtRmRXYXRjaGVzLmFkZCh3YXRjaCk7Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6ZGVsRmRXYXRjaChEZWZhdWx0TG9vcGVyOjpGZFdhdGNoKiB3YXRjaCkgeworICAgIG1GZFdhdGNoZXMucGljayh3YXRjaCk7Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6YWRkUGVuZGluZ0ZkV2F0Y2goRGVmYXVsdExvb3Blcjo6RmRXYXRjaCogd2F0Y2gpIHsKKyAgICBtUGVuZGluZ0ZkV2F0Y2hlcy5pbnNlcnRUYWlsKHdhdGNoKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpkZWxQZW5kaW5nRmRXYXRjaChEZWZhdWx0TG9vcGVyOjpGZFdhdGNoKiB3YXRjaCkgeworICAgIG1QZW5kaW5nRmRXYXRjaGVzLnJlbW92ZSh3YXRjaCk7Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6dXBkYXRlRmRXYXRjaChpbnQgZmQsIHVuc2lnbmVkIHdhbnRlZEV2ZW50cykgeworICAgIG1XYWl0ZXItPnVwZGF0ZShmZCwgd2FudGVkRXZlbnRzKTsKK30KKworTG9vcGVyOjpGZFdhdGNoKiBEZWZhdWx0TG9vcGVyOjpjcmVhdGVGZFdhdGNoKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6RmRXYXRjaDo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpIHsKKyAgICByZXR1cm4gbmV3IEZkV2F0Y2godGhpcywgZmQsIGNhbGxiYWNrLCBvcGFxdWUpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OmFkZFRpbWVyKERlZmF1bHRMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgIG1UaW1lcnMuYWRkKHRpbWVyKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpkZWxUaW1lcihEZWZhdWx0TG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBtVGltZXJzLnBpY2sodGltZXIpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OmVuYWJsZVRpbWVyKERlZmF1bHRMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgIC8vIEZpbmQgdGhlIGZpcnN0IHRpbWVyIHRoYXQgZXhwaXJlcyBhZnRlciB0aGlzIG9uZS4KKyAgICBUaW1lciogaXRlbSA9IG1BY3RpdmVUaW1lcnMuZnJvbnQoKTsKKyAgICB3aGlsZSAoaXRlbSAmJiBpdGVtLT5kZWFkbGluZSgpIDwgdGltZXItPmRlYWRsaW5lKCkpIHsKKyAgICAgICAgaXRlbSA9IGl0ZW0tPm5leHQoKTsKKyAgICB9CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgbUFjdGl2ZVRpbWVycy5pbnNlcnRCZWZvcmUoaXRlbSwgdGltZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1BY3RpdmVUaW1lcnMuaW5zZXJ0VGFpbCh0aW1lcik7CisgICAgfQorfQorCit2b2lkIERlZmF1bHRMb29wZXI6OmRpc2FibGVUaW1lcihEZWZhdWx0TG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICAvLyBTaW1wbHkgcmVtb3ZlIGZyb20gdGhlIGxpc3QuCisgICAgbUFjdGl2ZVRpbWVycy5yZW1vdmUodGltZXIpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OmFkZFBlbmRpbmdUaW1lcihEZWZhdWx0TG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBtUGVuZGluZ1RpbWVycy5pbnNlcnRUYWlsKHRpbWVyKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpkZWxQZW5kaW5nVGltZXIoRGVmYXVsdExvb3Blcjo6VGltZXIqIHRpbWVyKSB7CisgICAgbVBlbmRpbmdUaW1lcnMucmVtb3ZlKHRpbWVyKTsKK30KKworTG9vcGVyOjpUaW1lciogRGVmYXVsdExvb3Blcjo6Y3JlYXRlVGltZXIoTG9vcGVyOjpUaW1lcjo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpDbG9ja1R5cGUgY2xvY2spIHsKKyAgICByZXR1cm4gbmV3IERlZmF1bHRMb29wZXI6OlRpbWVyKHRoaXMsIGNhbGxiYWNrLCBvcGFxdWUsIGNsb2NrKTsKK30KKworaW50IERlZmF1bHRMb29wZXI6OnJ1bldpdGhEZWFkbGluZU1zKExvb3Blcjo6RHVyYXRpb24gZGVhZGxpbmVNcykgeworICAgIG1Gb3JjZWRFeGl0ID0gZmFsc2U7CisKKyAgICB3aGlsZSAoIW1Gb3JjZWRFeGl0KSB7CisgICAgICAgIC8vIFJldHVybiBpbW1lZGlhdGVseSB3aXRoIEVXT1VMREJMT0NLIGlmIHRoZXJlIGFyZSBubworICAgICAgICAvLyBtb3JlIHRpbWVycyBvciB3YXRjaGVzIHJlZ2lzdGVyZWQuCisgICAgICAgIGlmIChtRmRXYXRjaGVzLmVtcHR5KCkgJiYgbUFjdGl2ZVRpbWVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVdPVUxEQkxPQ0s7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBFVElNRURPVVQgaWYgd2UndmUgb3ZlcnJ1biB0aGUgZGVhZGxpbmUuCisgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0d28gd2F5czoKKyAgICAgICAgLy8gICAgIC0gV2Ugd2FpdGVkIHRpbGwgdGltZW91dCBvbiBzb21lIEZEcy4KKyAgICAgICAgLy8gICAgIC0gV2UgaGF2ZSBubyBGRHMgdG8gd2F0Y2gsIGJ1dCBzb21lIHRpbWVycyBvdmVycmFuIHRoZSBsb29wZXIKKyAgICAgICAgLy8gICAgICAgZGVhZGxpbmUuCisgICAgICAgIGlmIChub3dNcygpID4gZGVhZGxpbmVNcykgeworICAgICAgICAgICAgcmV0dXJuIEVUSU1FRE9VVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoZGVhZGxpbmVNcykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRGVmYXVsdExvb3Blcjo6cnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoTG9vcGVyOjpEdXJhdGlvbiBkZWFkbGluZU1zKSB7CisgICAgLy8gQ29tcHV0ZSBuZXh0IGRlYWRsaW5lIGZyb20gdGltZXJzLgorICAgIER1cmF0aW9uIG5leHREZWFkbGluZSA9IGtEdXJhdGlvbkluZmluaXRlOworCisgICAgVGltZXIqIGZpcnN0VGltZXIgPSBtQWN0aXZlVGltZXJzLmZyb250KCk7CisgICAgaWYgKGZpcnN0VGltZXIpIHsKKyAgICAgICAgbmV4dERlYWRsaW5lID0gZmlyc3RUaW1lci0+ZGVhZGxpbmUoKTsKKyAgICB9CisKKyAgICBpZiAobmV4dERlYWRsaW5lID4gZGVhZGxpbmVNcykgeworICAgICAgICBuZXh0RGVhZGxpbmUgPSBkZWFkbGluZU1zOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIGZkIGV2ZW50cyB1bnRpbCBuZXh0IGRlYWRsaW5lLgorICAgIER1cmF0aW9uIHRpbWVPdXQgPSBJTlQ2NF9NQVg7CisgICAgaWYgKG5leHREZWFkbGluZSA8IGtEdXJhdGlvbkluZmluaXRlKSB7CisgICAgICAgIHRpbWVPdXQgPSBuZXh0RGVhZGxpbmUgLSBub3dNcygpOworICAgICAgICBpZiAodGltZU91dCA8IDApCisgICAgICAgICAgICB0aW1lT3V0ID0gMDsKKyAgICB9CisKKyAgICBpZiAoIW1GZFdhdGNoZXMuZW1wdHkoKSkgeworICAgICAgICBpbnQgcmV0ID0gbVdhaXRlci0+d2FpdCh0aW1lT3V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8vIEVycm9yLCBmb3JjZSBzdG9wLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIERDSEVDSyhtUGVuZGluZ0ZkV2F0Y2hlcy5lbXB0eSgpKTsKKworICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgLy8gUXVldWUgcGVuZGluZyBGZFdhdGNoIGluc3RhbmNlcy4KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBldmVudHM7CisgICAgICAgICAgICAgICAgaW50IGZkID0gbVdhaXRlci0+bmV4dFBlbmRpbmdGZCgmZXZlbnRzKTsKKyAgICAgICAgICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIEZkV2F0Y2ggZm9yIHRoaXMgZmlsZSBkZXNjcmlwdG9yLgorICAgICAgICAgICAgICAgIC8vIFRPRE8oZGlnaXQpOiBJbXByb3ZlIGVmZmljaWVuY3kgd2l0aCBhIG1hcD8KKyAgICAgICAgICAgICAgICBGZFdhdGNoU2V0OjpJdGVyYXRvciBpdGVyKCZtRmRXYXRjaGVzKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmRXYXRjaCogd2F0Y2ggPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoLT5mZCgpID09IGZkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaC0+c2V0UGVuZGluZyhldmVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGFueSBGRHMgdG8gd2F0Y2gsIHNvIGp1c3Qgc2xlZXAgdGlsbCB0aGUgbmV4dAorICAgICAgICAvLyB0aW1lciBleHBpcmVzLgorICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKHRpbWVPdXQpOworICAgIH0KKworICAgIC8vIFF1ZXVlIHBlbmRpbmcgZXhwaXJlZCB0aW1lcnMuCisgICAgRENIRUNLKG1QZW5kaW5nVGltZXJzLmVtcHR5KCkpOworCisgICAgY29uc3QgRHVyYXRpb24ga05vdyA9IG5vd01zKCk7CisgICAgVGltZXIqIHRpbWVyID0gbUFjdGl2ZVRpbWVycy5mcm9udCgpOworICAgIHdoaWxlICh0aW1lcikgeworICAgICAgICBpZiAodGltZXItPmRlYWRsaW5lKCkgPiBrTm93KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBsaXN0LCBhZGQgdG8gcGVuZGluZyBsaXN0LgorICAgICAgICBtQWN0aXZlVGltZXJzLnJlbW92ZSh0aW1lcik7CisgICAgICAgIHRpbWVyLT5zZXRQZW5kaW5nKCk7CisgICAgICAgIHRpbWVyID0gdGltZXItPm5leHQoKTsKKyAgICB9CisKKyAgICAvLyBGaXJlIHRoZSBwZW5kaW5nIHRpbWVycywgdGhpcyBpcyBkb25lIGluIGEgc2VwYXJhdGUgc3RlcAorICAgIC8vIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGNvdWxkIG1vZGlmeSB0aGUgYWN0aXZlIHRpbWVycyBsaXN0LgorICAgIGZvciAoOzspIHsKKyAgICAgICAgVGltZXIqIHRpbWVyID0gbVBlbmRpbmdUaW1lcnMuZnJvbnQoKTsKKyAgICAgICAgaWYgKCF0aW1lcikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGltZXItPmNsZWFyUGVuZGluZygpOworICAgICAgICB0aW1lci0+ZmlyZSgpOworICAgIH0KKworICAgIC8vIEZpcmUgdGhlIHBlbmRpbmcgZmQgd2F0Y2hlcy4gQWxzbyBkb25lIGluIGEgc2VwYXJhdGUgc3RlcAorICAgIC8vIHNpbmNlIHRoZSBjYWxsYmFja3MgY291bGQgbW9kaWZ5CisgICAgZm9yICg7OykgeworICAgICAgICBGZFdhdGNoKiB3YXRjaCA9IG1QZW5kaW5nRmRXYXRjaGVzLmZyb250KCk7CisgICAgICAgIGlmICghd2F0Y2gpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHdhdGNoLT5jbGVhclBlbmRpbmcoKTsKKyAgICAgICAgd2F0Y2gtPmZpcmUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRGVmYXVsdExvb3Blcjo6RmRXYXRjaDo6RmRXYXRjaChEZWZhdWx0TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6RmRXYXRjaDo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKQorICAgIDogTG9vcGVyOjpGZFdhdGNoKGxvb3BlciwgZmQsIGNhbGxiYWNrLCBvcGFxdWUpLAorICAgICAgbVdhbnRlZEV2ZW50cygwVSksCisgICAgICBtTGFzdEV2ZW50cygwVSksCisgICAgICBtUGVuZGluZyhmYWxzZSksCisgICAgICBtUGVuZGluZ0xpbmsoKSB7CisgICAgbG9vcGVyLT5hZGRGZFdhdGNoKHRoaXMpOworfQorCitEZWZhdWx0TG9vcGVyKiBEZWZhdWx0TG9vcGVyOjpGZFdhdGNoOjpkZWZhdWx0TG9vcGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PERlZmF1bHRMb29wZXIqPihtTG9vcGVyKTsKK30KKworRGVmYXVsdExvb3Blcjo6RmRXYXRjaDo6fkZkV2F0Y2goKSB7CisgICAgZG9udFdhbnRXcml0ZSgpOworICAgIGRvbnRXYW50UmVhZCgpOworICAgIGNsZWFyUGVuZGluZygpOworICAgIGRlZmF1bHRMb29wZXIoKS0+ZGVsRmRXYXRjaCh0aGlzKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpGZFdhdGNoOjphZGRFdmVudHModW5zaWduZWQgZXZlbnRzKSB7CisgICAgZXZlbnRzICY9IGtFdmVudE1hc2s7CisgICAgdW5zaWduZWQgbmV3RXZlbnRzID0gbVdhbnRlZEV2ZW50cyB8IGV2ZW50czsKKyAgICBpZiAobmV3RXZlbnRzICE9IG1XYW50ZWRFdmVudHMpIHsKKyAgICAgICAgbVdhbnRlZEV2ZW50cyA9IG5ld0V2ZW50czsKKyAgICAgICAgZGVmYXVsdExvb3BlcigpLT51cGRhdGVGZFdhdGNoKG1GZCwgbmV3RXZlbnRzKTsKKyAgICB9Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6RmRXYXRjaDo6cmVtb3ZlRXZlbnRzKHVuc2lnbmVkIGV2ZW50cykgeworICAgIGV2ZW50cyAmPSBrRXZlbnRNYXNrOworICAgIHVuc2lnbmVkIG5ld0V2ZW50cyA9IG1XYW50ZWRFdmVudHMgJiB+ZXZlbnRzOworICAgIGlmIChuZXdFdmVudHMgIT0gbVdhbnRlZEV2ZW50cykgeworICAgICAgICBtV2FudGVkRXZlbnRzID0gbmV3RXZlbnRzOworICAgICAgICBkZWZhdWx0TG9vcGVyKCktPnVwZGF0ZUZkV2F0Y2gobUZkLCBuZXdFdmVudHMpOworICAgICAgICBpZiAoIW5ld0V2ZW50cykgeworICAgICAgICAgICAgY2xlYXJQZW5kaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVGhlc2UgZXZlbnRzIGFyZSBubyBsb25nZXIgZGVzaXJlZC4KKyAgICBtTGFzdEV2ZW50cyAmPSB+ZXZlbnRzOworfQorCit1bnNpZ25lZCBEZWZhdWx0TG9vcGVyOjpGZFdhdGNoOjpwb2xsKCkgY29uc3QgeworICAgIHJldHVybiBtTGFzdEV2ZW50czsKK30KKworYm9vbCBEZWZhdWx0TG9vcGVyOjpGZFdhdGNoOjppc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QZW5kaW5nOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OkZkV2F0Y2g6OnNldFBlbmRpbmcodW5zaWduZWQgZXZlbnRzKSB7CisgICAgRENIRUNLKCFtUGVuZGluZyk7CisgICAgbVBlbmRpbmcgPSB0cnVlOworICAgIG1MYXN0RXZlbnRzID0gZXZlbnRzICYga0V2ZW50TWFzazsKKyAgICBkZWZhdWx0TG9vcGVyKCktPmFkZFBlbmRpbmdGZFdhdGNoKHRoaXMpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OkZkV2F0Y2g6OmNsZWFyUGVuZGluZygpIHsKKyAgICBpZiAobVBlbmRpbmcpIHsKKyAgICAgICAgZGVmYXVsdExvb3BlcigpLT5kZWxQZW5kaW5nRmRXYXRjaCh0aGlzKTsKKyAgICAgICAgbVBlbmRpbmcgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6RmRXYXRjaDo6ZmlyZSgpIHsKKyAgICB1bnNpZ25lZCBldmVudHMgPSBtTGFzdEV2ZW50czsKKyAgICBtTGFzdEV2ZW50cyA9IDA7CisgICAgbUNhbGxiYWNrKG1PcGFxdWUsIG1GZCwgZXZlbnRzKTsKK30KKworRGVmYXVsdExvb3Blcjo6VGltZXI6OlRpbWVyKERlZmF1bHRMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6VGltZXI6OkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpDbG9ja1R5cGUgY2xvY2spCisgICAgOiBMb29wZXI6OlRpbWVyKGxvb3BlciwgY2FsbGJhY2ssIG9wYXF1ZSwgY2xvY2spLAorICAgICAgbURlYWRsaW5lKGtEdXJhdGlvbkluZmluaXRlKSwKKyAgICAgIG1QZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1QZW5kaW5nTGluaygpIHsKKyAgICAvLyB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgYSBob3N0IGNsb2NrCisgICAgRENIRUNLKGNsb2NrID09IENsb2NrVHlwZTo6a0hvc3QpOworICAgIERDSEVDSyhtQ2FsbGJhY2spOworICAgIGxvb3Blci0+YWRkVGltZXIodGhpcyk7Cit9CisKK0RlZmF1bHRMb29wZXIqIERlZmF1bHRMb29wZXI6OlRpbWVyOjpkZWZhdWx0TG9vcGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PERlZmF1bHRMb29wZXIqPihtTG9vcGVyKTsKK30KKworRGVmYXVsdExvb3Blcjo6VGltZXI6On5UaW1lcigpIHsKKyAgICBjbGVhclBlbmRpbmcoKTsKKyAgICBkZWZhdWx0TG9vcGVyKCktPmRlbFRpbWVyKHRoaXMpOworfQorCitEZWZhdWx0TG9vcGVyOjpUaW1lciogRGVmYXVsdExvb3Blcjo6VGltZXI6Om5leHQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QZW5kaW5nTGluay5uZXh0KCk7Cit9CisKK0xvb3Blcjo6RHVyYXRpb24gRGVmYXVsdExvb3Blcjo6VGltZXI6OmRlYWRsaW5lKCkgY29uc3QgeworICAgIHJldHVybiBtRGVhZGxpbmU7Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6VGltZXI6OnN0YXJ0UmVsYXRpdmUoTG9vcGVyOjpEdXJhdGlvbiBkZWFkbGluZU1zKSB7CisgICAgaWYgKGRlYWRsaW5lTXMgIT0ga0R1cmF0aW9uSW5maW5pdGUpIHsKKyAgICAgICAgZGVhZGxpbmVNcyArPSBtTG9vcGVyLT5ub3dNcyhtQ2xvY2tUeXBlKTsKKyAgICB9CisgICAgc3RhcnRBYnNvbHV0ZShkZWFkbGluZU1zKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpUaW1lcjo6c3RhcnRBYnNvbHV0ZShMb29wZXI6OkR1cmF0aW9uIGRlYWRsaW5lTXMpIHsKKyAgICBpZiAobURlYWRsaW5lICE9IGtEdXJhdGlvbkluZmluaXRlKSB7CisgICAgICAgIGRlZmF1bHRMb29wZXIoKS0+ZGlzYWJsZVRpbWVyKHRoaXMpOworICAgIH0KKyAgICBtRGVhZGxpbmUgPSBkZWFkbGluZU1zOworICAgIGlmIChtRGVhZGxpbmUgIT0ga0R1cmF0aW9uSW5maW5pdGUpIHsKKyAgICAgICAgZGVmYXVsdExvb3BlcigpLT5lbmFibGVUaW1lcih0aGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6VGltZXI6OnN0b3AoKSB7CisgICAgc3RhcnRBYnNvbHV0ZShrRHVyYXRpb25JbmZpbml0ZSk7Cit9CisKK2Jvb2wgRGVmYXVsdExvb3Blcjo6VGltZXI6OmlzQWN0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBtRGVhZGxpbmUgIT0ga0R1cmF0aW9uSW5maW5pdGU7Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6VGltZXI6OnNldFBlbmRpbmcoKSB7CisgICAgbVBlbmRpbmcgPSB0cnVlOworICAgIGRlZmF1bHRMb29wZXIoKS0+YWRkUGVuZGluZ1RpbWVyKHRoaXMpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OlRpbWVyOjpjbGVhclBlbmRpbmcoKSB7CisgICAgaWYgKG1QZW5kaW5nKSB7CisgICAgICAgIGRlZmF1bHRMb29wZXIoKS0+ZGVsUGVuZGluZ1RpbWVyKHRoaXMpOworICAgICAgICBtUGVuZGluZyA9IGZhbHNlOworICAgICAgICAvLyByZXNldHMgbURlYWRsaW5lIHNvIGl0IGNhbiBiZSBhZGRlZCB0byBhY3RpdmUgdGltZXJzIGxpc3QgYWdhaW4gbGF0ZXIKKyAgICAgICAgLy8gd2l0aG91dCBhc3NlcnRpb24gZmFpbHVyZSBpbnNpZGUgc3RhcnRBYnNvbHV0ZQorICAgICAgICAvLyAoZGVmYXVsdExvb3Blci0+ZGlzYWJsZVRpbWVyKQorICAgICAgICBtRGVhZGxpbmUgPSBrRHVyYXRpb25JbmZpbml0ZTsKKyAgICB9Cit9CisKK3ZvaWQgRGVmYXVsdExvb3Blcjo6VGltZXI6OmZpcmUoKSB7CisgICAgbUNhbGxiYWNrKG1PcGFxdWUsIHRoaXMpOworfQorCit2b2lkIERlZmF1bHRMb29wZXI6OlRpbWVyOjpzYXZlKFN0cmVhbSogc3RyZWFtKSBjb25zdCB7CisgICAgc3RyZWFtLT5wdXRCZTY0KHN0YXRpY19jYXN0PHVpbnQ2NF90PihtRGVhZGxpbmUpKTsKK30KKwordm9pZCBEZWZhdWx0TG9vcGVyOjpUaW1lcjo6bG9hZChTdHJlYW0qIHN0cmVhbSkgeworICAgIGNvbnN0IER1cmF0aW9uIGRlYWRsaW5lID0gc3RhdGljX2Nhc3Q8RHVyYXRpb24+KHN0cmVhbS0+Z2V0QmU2NCgpKTsKKyAgICBzdGFydEFic29sdXRlKGRlYWRsaW5lKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9EZWZhdWx0TG9vcGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9EZWZhdWx0TG9vcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjYjNlMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0RlZmF1bHRMb29wZXIuaApAQCAtMCwwICsxLDE3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL1Njb3BlZFBvaW50ZXJTZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9UYWlsUXVldWVMaXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gRGVmYXVsdCBsb29wZXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gc2VsZWN0KCkuIFRvIG1ha2Ugc3VyZSBhbGwgdGltZXJzIGFuZAorLy8gRkQgd2F0Y2hlcyBleGVjdXRlLCBydW4gaXRzIHJ1bldpdGhEZWFkbGluZU1zKCkgZXhwbGljaXRseS4KK2NsYXNzIERlZmF1bHRMb29wZXIgOiBwdWJsaWMgTG9vcGVyIHsKK3B1YmxpYzoKKyAgICBEZWZhdWx0TG9vcGVyKCk7CisKKyAgICB+RGVmYXVsdExvb3BlcigpIG92ZXJyaWRlOworCisgICAgRHVyYXRpb24gbm93TXMoQ2xvY2tUeXBlIGNsb2NrVHlwZSA9IENsb2NrVHlwZTo6a0hvc3QpIG92ZXJyaWRlOworCisgICAgRHVyYXRpb25OcyBub3dOcyhDbG9ja1R5cGUgY2xvY2tUeXBlID0gQ2xvY2tUeXBlOjprSG9zdCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZvcmNlUXVpdCgpIG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyAgRiBEICAgVyBBIFQgQyBIIEUgUworICAgIC8vCisgICAgY2xhc3MgRmRXYXRjaCA6IHB1YmxpYyBMb29wZXI6OkZkV2F0Y2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgRmRXYXRjaChEZWZhdWx0TG9vcGVyKiBsb29wZXIsIGludCBmZCwgQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIG9wYXF1ZSk7CisKKyAgICAgICAgRGVmYXVsdExvb3BlciogZGVmYXVsdExvb3BlcigpIGNvbnN0OworCisgICAgICAgIH5GZFdhdGNoKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBhZGRFdmVudHModW5zaWduZWQgZXZlbnRzKSBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHJlbW92ZUV2ZW50cyh1bnNpZ25lZCBldmVudHMpIG92ZXJyaWRlOworCisgICAgICAgIHVuc2lnbmVkIHBvbGwoKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgdGhpcyBGZFdhdGNoIGlzIHBlbmRpbmcgZXhlY3V0aW9uLgorICAgICAgICBib29sIGlzUGVuZGluZygpIGNvbnN0OworCisgICAgICAgIC8vIEFkZCB0aGlzIEZkV2F0Y2ggdG8gYSBwZW5kaW5nIHF1ZXVlLgorICAgICAgICB2b2lkIHNldFBlbmRpbmcodW5zaWduZWQgZXZlbnRzKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhpcyBGZFdhdGNoIGZyb20gYSBwZW5kaW5nIHF1ZXVlLgorICAgICAgICB2b2lkIGNsZWFyUGVuZGluZygpOworCisgICAgICAgIC8vIEZpcmUgdGhlIHdhdGNoLCBpLmUuIGludm9rZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgcmlnaHQKKyAgICAgICAgLy8gcGFyYW1ldGVycy4KKyAgICAgICAgdm9pZCBmaXJlKCk7CisKKyAgICAgICAgVEFJTF9RVUVVRV9MSVNUX1RSQUlUUyhUcmFpdHMsIEZkV2F0Y2gsIG1QZW5kaW5nTGluayk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB1bnNpZ25lZCBtV2FudGVkRXZlbnRzOworICAgICAgICB1bnNpZ25lZCBtTGFzdEV2ZW50czsKKyAgICAgICAgYm9vbCBtUGVuZGluZzsKKyAgICAgICAgVGFpbFF1ZXVlTGluazxGZFdhdGNoPiBtUGVuZGluZ0xpbms7CisgICAgfTsKKworICAgIHZvaWQgYWRkRmRXYXRjaChGZFdhdGNoKiB3YXRjaCk7CisKKyAgICB2b2lkIGRlbEZkV2F0Y2goRmRXYXRjaCogd2F0Y2gpOworCisgICAgdm9pZCBhZGRQZW5kaW5nRmRXYXRjaChGZFdhdGNoKiB3YXRjaCk7CisKKyAgICB2b2lkIGRlbFBlbmRpbmdGZFdhdGNoKEZkV2F0Y2gqIHdhdGNoKTsKKworICAgIHZvaWQgdXBkYXRlRmRXYXRjaChpbnQgZmQsIHVuc2lnbmVkIHdhbnRlZEV2ZW50cyk7CisKKyAgICBMb29wZXI6OkZkV2F0Y2gqIGNyZWF0ZUZkV2F0Y2goaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OkZkV2F0Y2g6OkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpIG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyAgVCBJIE0gRSBSIFMKKyAgICAvLworCisgICAgY2xhc3MgVGltZXIgOiBwdWJsaWMgTG9vcGVyOjpUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICBUaW1lcihEZWZhdWx0TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgIENsb2NrVHlwZSBjbG9jayk7CisKKyAgICAgICAgRGVmYXVsdExvb3BlciogZGVmYXVsdExvb3BlcigpIGNvbnN0OworCisgICAgICAgIH5UaW1lcigpIG92ZXJyaWRlOworCisgICAgICAgIFRpbWVyKiBuZXh0KCkgY29uc3Q7CisKKyAgICAgICAgRHVyYXRpb24gZGVhZGxpbmUoKSBjb25zdDsKKworICAgICAgICB2b2lkIHN0YXJ0UmVsYXRpdmUoRHVyYXRpb24gZGVhZGxpbmVNcykgb3ZlcnJpZGU7CisKKyAgICAgICAgdm9pZCBzdGFydEFic29sdXRlKER1cmF0aW9uIGRlYWRsaW5lTXMpIG92ZXJyaWRlOworCisgICAgICAgIHZvaWQgc3RvcCgpIG92ZXJyaWRlOworCisgICAgICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICB2b2lkIHNldFBlbmRpbmcoKTsKKworICAgICAgICB2b2lkIGNsZWFyUGVuZGluZygpOworCisgICAgICAgIHZvaWQgZmlyZSgpOworCisgICAgICAgIHZvaWQgc2F2ZShTdHJlYW0qIHN0cmVhbSkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBsb2FkKFN0cmVhbSogc3RyZWFtKTsKKworICAgICAgICBUQUlMX1FVRVVFX0xJU1RfVFJBSVRTKFRyYWl0cywgVGltZXIsIG1QZW5kaW5nTGluayk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBEdXJhdGlvbiBtRGVhZGxpbmU7CisgICAgICAgIGJvb2wgbVBlbmRpbmc7CisgICAgICAgIFRhaWxRdWV1ZUxpbms8VGltZXI+IG1QZW5kaW5nTGluazsKKyAgICB9OworCisgICAgdm9pZCBhZGRUaW1lcihUaW1lciogdGltZXIpOworCisgICAgdm9pZCBkZWxUaW1lcihUaW1lciogdGltZXIpOworCisgICAgdm9pZCBlbmFibGVUaW1lcihUaW1lciogdGltZXIpOworCisgICAgdm9pZCBkaXNhYmxlVGltZXIoVGltZXIqIHRpbWVyKTsKKworICAgIHZvaWQgYWRkUGVuZGluZ1RpbWVyKFRpbWVyKiB0aW1lcik7CisKKyAgICB2b2lkIGRlbFBlbmRpbmdUaW1lcihUaW1lciogdGltZXIpOworCisgICAgTG9vcGVyOjpUaW1lciogY3JlYXRlVGltZXIoTG9vcGVyOjpUaW1lcjo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb2NrVHlwZSBjbG9jaykgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vICBNIEEgSSBOICAgTCBPIE8gUAorICAgIC8vCisgICAgaW50IHJ1bldpdGhEZWFkbGluZU1zKER1cmF0aW9uIGRlYWRsaW5lTXMpIG92ZXJyaWRlOworCisgICAgdHlwZWRlZiBUYWlsUXVldWVMaXN0PFRpbWVyPiBUaW1lckxpc3Q7CisgICAgdHlwZWRlZiBTY29wZWRQb2ludGVyU2V0PFRpbWVyPiBUaW1lclNldDsKKworICAgIHR5cGVkZWYgVGFpbFF1ZXVlTGlzdDxGZFdhdGNoPiBGZFdhdGNoTGlzdDsKKyAgICB0eXBlZGVmIFNjb3BlZFBvaW50ZXJTZXQ8RmRXYXRjaD4gRmRXYXRjaFNldDsKKworcHJvdGVjdGVkOgorICAgIGJvb2wgcnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoRHVyYXRpb24gZGVhZGxpbmVNcyk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U29ja2V0V2FpdGVyPiBtV2FpdGVyOworICAgIEZkV2F0Y2hTZXQgbUZkV2F0Y2hlczsgICAgICAgICAgLy8gU2V0IG9mIGFsbCBmZCB3YXRjaGVzLgorICAgIEZkV2F0Y2hMaXN0IG1QZW5kaW5nRmRXYXRjaGVzOyAgLy8gUXVldWUgb2YgcGVuZGluZyBmZCB3YXRjaGVzLgorCisgICAgVGltZXJTZXQgbVRpbWVyczsgICAgICAgICAgLy8gU2V0IG9mIGFsbCB0aW1lcnMuCisgICAgVGltZXJMaXN0IG1BY3RpdmVUaW1lcnM7ICAgLy8gU29ydGVkIGxpc3Qgb2YgYWN0aXZlIHRpbWVycy4KKyAgICBUaW1lckxpc3QgbVBlbmRpbmdUaW1lcnM7ICAvLyBTb3J0ZWQgbGlzdCBvZiBwZW5kaW5nIHRpbWVycy4KKworICAgIGJvb2wgbUZvcmNlZEV4aXQgPSBmYWxzZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3ZmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5jcHAKQEAgLTAsMCArMSw4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvRGVmYXVsdExvb3Blci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIHN0YXRpYworY29uc3QgY2hhciogTG9vcGVyOjpjbG9ja1R5cGVUb1N0cmluZyhMb29wZXI6OkNsb2NrVHlwZSBjbG9jaykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtSZWFsdGltZVN0cltdID0gImtSZWFsVGltZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1ZpcnR1YWxTdHJbXSA9ICJrVmlydHVhbCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hvc3RTdHJbXSA9ICJrSG9zdCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ludmFsaWRTdHJbXSA9ICJJbnZhbGlkIjsKKyAgICBzd2l0Y2ggKGNsb2NrKSB7CisgICAgICAgIGNhc2UgTG9vcGVyOjpDbG9ja1R5cGU6OmtSZWFsdGltZToKKyAgICAgICAgICAgIHJldHVybiBrUmVhbHRpbWVTdHI7CisgICAgICAgIGNhc2UgTG9vcGVyOjpDbG9ja1R5cGU6OmtWaXJ0dWFsOgorICAgICAgICAgICAgcmV0dXJuIGtWaXJ0dWFsU3RyOworICAgICAgICBjYXNlIExvb3Blcjo6Q2xvY2tUeXBlOjprSG9zdDoKKyAgICAgICAgICAgIHJldHVybiBrSG9zdFN0cjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBrSW52YWxpZFN0cjsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworTG9vcGVyKiBMb29wZXI6OmNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IERlZmF1bHRMb29wZXIoKTsKK30KKworTG9vcGVyOjp+TG9vcGVyKCkgPSBkZWZhdWx0OworCit2b2lkIExvb3Blcjo6cnVuKCkgeworICAgIHJ1bldpdGhEZWFkbGluZU1zKGtEdXJhdGlvbkluZmluaXRlKTsKK30KKworaW50IExvb3Blcjo6cnVuV2l0aFRpbWVvdXRNcyhMb29wZXI6OkR1cmF0aW9uIHRpbWVvdXRNcykgeworICAgIGlmICh0aW1lb3V0TXMgIT0ga0R1cmF0aW9uSW5maW5pdGUpIHsKKyAgICAgICAgdGltZW91dE1zICs9IG5vd01zKCk7CisgICAgfQorICAgIHJldHVybiBydW5XaXRoRGVhZGxpbmVNcyh0aW1lb3V0TXMpOworfQorCitMb29wZXI6Okxvb3BlcigpID0gZGVmYXVsdDsKKworTG9vcGVyOjpUaW1lcjo6flRpbWVyKCkgPSBkZWZhdWx0OworCitMb29wZXIqIExvb3Blcjo6VGltZXI6OnBhcmVudExvb3BlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUxvb3BlcjsKK30KKworTG9vcGVyOjpUaW1lcjo6VGltZXIoTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OlRpbWVyOjpDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6Q2xvY2tUeXBlIGNsb2NrKQorICAgIDogbUxvb3Blcihsb29wZXIpLAorICAgICAgbUNhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1PcGFxdWUob3BhcXVlKSwKKyAgICAgIG1DbG9ja1R5cGUoY2xvY2spIHt9CisKK0xvb3Blcjo6RmRXYXRjaDo6fkZkV2F0Y2goKSA9IGRlZmF1bHQ7CisKK2ludCBMb29wZXI6OkZkV2F0Y2g6OmZkKCkgY29uc3QgeworICAgIHJldHVybiBtRmQ7Cit9CisKK0xvb3Blcjo6RmRXYXRjaDo6RmRXYXRjaChMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpGZFdhdGNoOjpDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpCisgICAgOiBtTG9vcGVyKGxvb3BlciksIG1GZChmZCksIG1DYWxsYmFjayhjYWxsYmFjayksIG1PcGFxdWUob3BhcXVlKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3ZmY1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oCkBAIC0wLDAgKzEsMTk3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgTG9vcGVyIGlzIGFuIGFic3RyYWN0aW9uIGZvciBhbiBldmVudCBsb29wIHRoYXQgY2FuIHdhaXQgZm9yIGVpdGhlcgorLy8gSS9PIGV2ZW50cyBvbiBmaWxlIGRlc2NyaXB0b3JzLCBvciB0aW1lcnMuCisvLworLy8gT25lIGNhbiBjYWxsIExvb3Blcjo6Y3JlYXRlKCkgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlLCBjcmVhdGUKKy8vIExvb3Blcjo6VGltZXIgYW5kIExvb3Blcjo6RmRXYXRjaCBpbnN0YW5jZXMsIHRoZW4gY2FsbCBMb29wZXI6OnJ1bigpCisvLyB0byBydW4gdGhlIGxvb3AgdW50aWwgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGRvLgorLy8KKy8vIEl0J3MgcG9zc2libGUgdG8gc3RvcCBhIExvb3BlciBmcm9tIHJ1bm5pbmcgYnkgY2FsbGluZworLy8gTG9vcGVyOjpmb3JjZVF1aXQoKSBmcm9tIHdpdGhpbiB0aGUgZXZlbnQgbG9vcC4KKy8vCitjbGFzcyBMb29wZXIgeworcHVibGljOgorICAgIHR5cGVkZWYgaW50NjRfdCBEdXJhdGlvbjsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IER1cmF0aW9uTnM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga0R1cmF0aW9uSW5maW5pdGUgPSBJTlQ2NF9NQVgsCisgICAgfTsKKworICAgIC8vIENsb2NrVHlwZXMgaGF2ZSB0byBtaW1pYyB0aGUgTG9vcGVyQ2xvY2tUeXBlIGVudW0gZnJvbSB1dGlscy8KKyAgICBlbnVtIGNsYXNzIENsb2NrVHlwZSB7CisgICAgICAgIGtSZWFsdGltZSwKKyAgICAgICAga1ZpcnR1YWwsCisgICAgICAgIGtIb3N0CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjbG9ja1R5cGVUb1N0cmluZyhDbG9ja1R5cGUgY2xvY2spOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGdlbmVyaWMgTG9vcGVyIGluc3RhbmNlLgorICAgIHN0YXRpYyBMb29wZXIqIGNyZWF0ZSgpOworCisgICAgdmlydHVhbCB+TG9vcGVyKCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBhcyBzZWVuIGJ5IHRoaXMgbG9vcGVyIGluc3RhbmNlIGluCisgICAgLy8gbWlsbGlzZWNvbmRzIGFuZCBuYW5vc2Vjb25kcy4KKyAgICB2aXJ0dWFsIER1cmF0aW9uIG5vd01zKENsb2NrVHlwZSBjbG9ja1R5cGUgPSBDbG9ja1R5cGU6OmtIb3N0KSA9IDA7CisgICAgdmlydHVhbCBEdXJhdGlvbk5zIG5vd05zKENsb2NrVHlwZSBjbG9ja1R5cGUgPSBDbG9ja1R5cGU6OmtIb3N0KSA9IDA7CisKKyAgICAvLyBSdW4gdGhlIGV2ZW50IGxvb3AgdW50aWwgZm9yY2VRdWl0KCkgaXMgY2FsbGVkIG9yIHRoZXJlIGlzIG5vCisgICAgLy8gbW9yZSByZWdpc3RlcmVkIHdhdGNoZXJzIG9yIHRpbWVycyBpbiB0aGUgbG9vcGVyLgorICAgIHZvaWQgcnVuKCk7CisKKyAgICAvLyBBIHZhcmlhbnQgb2YgcnVuKCkgdGhhdCBhbGxvd3MgdG8gcnVuIHRoZSBldmVudCBsb29wIG9ubHkgdW50aWwKKyAgICAvLyBhIGZpeGVkIGRlYWRsaW5lIGhhcyBwYXNzZWQuIHxkZWFkbGluZU1zfCBpcyBhIGRlYWRsaW5lIGluCisgICAgLy8gbWlsbGlzZWNvbmRzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGNsb2NrIHVzZWQgYnkgbm93TXMoKS4KKyAgICAvLyBJZiBjYW4gYmUga0R1cmF0aW9uSW5maW5pdGUgdG8gaW5kaWNhdGUgbm8gZGVhZGxpbmUuCisgICAgLy8gUmV0dXJuIHRoZSByZWFzb24gd2h5IHRoZSBsb29wZXIgc3RvcHBlZDoKKyAgICAvLyAgICAwICAgICAgICAgICAtPiBub3JtYWwgZXhpdCB0aHJvdWdoIGZvcmNlUXVpdCgpCisgICAgLy8gICAgRVdPVUxEQkxPQ0sgLT4gbm8gbW9yZSB3YXRjaGVycyBhbmQgdGltZXJzIHJlZ2lzdGVyZWQuCisgICAgLy8gICAgRVRJTUVPVVQgICAgLT4gdGltZW91dCByZWFjaGVkLgorICAgIHZpcnR1YWwgaW50IHJ1bldpdGhEZWFkbGluZU1zKER1cmF0aW9uIGRlYWRsaW5lTXMpID0gMDsKKworICAgIC8vIEEgdmFyaWFudCBvZiBydW4oKSB0aGF0IGFsbG93cyB0byBydW4gdGhlIGV2ZW50IGxvb3Agb25seSB1bnRpbAorICAgIC8vIGEgY2VydGFpbiB0aW1lb3V0IGlzIG1pbGxpc2Vjb25kcyBoYXMgcGFzc2VkLiBSZXR1cm4gdGhlIHJlYXNvbgorICAgIC8vIHdoeSB0aGUgbG9vcGVyIHN0b3BwZWQ6CisgICAgLy8gICAgMCAgICAgICAgICAgLT4gbm9ybWFsIGV4aXQgdGhyb3VnaCBmb3JjZVF1aXQoKQorICAgIC8vICAgIEVXT1VMREJMT0NLIC0+IG5vIG1vcmUgd2F0Y2hlcnMgYW5kIHRpbWVycyByZWdpc3RlcmVkLgorICAgIC8vICAgIEVUSU1FT1VUICAgIC0+IHRpbWVvdXQgcmVhY2hlZC4KKyAgICBpbnQgcnVuV2l0aFRpbWVvdXRNcyhEdXJhdGlvbiB0aW1lb3V0TXMpOworCisgICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gd2l0aGluIHRoZSBldmVudCBsb29wIHRvIGZvcmNlIGl0IHRvIHF1aXQKKyAgICAvLyBhcyBzb29uIGFzIHBvc3NpYmxlLiBydW5XaXRoRGVhZGxpbmVNUygpIGFuZCBydW5XaXRoVGltZW91dE1zKCkgd2lsbAorICAgIC8vIHJldHVybiAwLgorICAgIHZpcnR1YWwgdm9pZCBmb3JjZVF1aXQoKSA9IDA7CisKKyAgICAvLyBJbnRlcmZhY2UgY2xhc3MgZm9yIHRpbWVycyBpbXBsZW1lbnRlZCBieSBhIExvb3BlciBpbnN0YW5jZS4KKyAgICAvLyBVc2UgY3JlYXRlVGltZXIoKSB0byBjcmVhdGUgdGhlc2UuCisgICAgY2xhc3MgVGltZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVHlwZSBvZiBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcy4KKyAgICAgICAgdHlwZWRlZiB2b2lkICgqQ2FsbGJhY2spKHZvaWQqIG9wYXF1ZSwgVGltZXIqIHRpbWVyKTsKKworICAgICAgICB2aXJ0dWFsIH5UaW1lcigpOworCisgICAgICAgIC8vIEdldCB0aGUgcGFyZW50IGxvb3BlciBvYmplY3QKKyAgICAgICAgTG9vcGVyKiBwYXJlbnRMb29wZXIoKSBjb25zdDsKKworICAgICAgICAvLyBTdGFydCwgb3IgcmVzdGFydCB0aGUgdGltZXIgdG8gZXhwaXJlIGFmdGVyIHx0aW1lb3V0X21zfAorICAgICAgICAvLyBtaWxsaXNlY29uZHMuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzdGFydFJlbGF0aXZlKER1cmF0aW9uIHRpbWVvdXRfbXMpID0gMDsKKworICAgICAgICAvLyBTdGFydCwgb3IgcmVzdGFydCB0aGUgdGltZXIgdG8gZXhwaXJlIGF0IHxkZWFkbGluZV9tc3wKKyAgICAgICAgLy8gbWlsbGlzZWNvbmRzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgc3RhcnRBYnNvbHV0ZShEdXJhdGlvbiBkZWFkbGluZV9tcykgPSAwOworCisgICAgICAgIC8vIFN0b3AgdGhlIHRpbWVyLgorICAgICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpID0gMDsKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgdGltZXIgaXMgYWN0aXZlLgorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmUoKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gU2VyaWFsaXphdGlvbiB0by9mcm9tIHN0cmVhbXMKKyAgICAgICAgdmlydHVhbCB2b2lkIHNhdmUoYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGxvYWQoYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pID0gMDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgVGltZXIoTG9vcGVyKiBsb29wZXIsIENhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgIENsb2NrVHlwZSBjbG9jayk7CisKKyAgICAgICAgTG9vcGVyKiBtTG9vcGVyOworICAgICAgICBDYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHZvaWQqIG1PcGFxdWU7CisgICAgICAgIENsb2NrVHlwZSBtQ2xvY2tUeXBlOworICAgIH07CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgdGltZXIgZm9yIHRoaXMgTG9vcGVyIGluc3RhbmNlLgorICAgIHZpcnR1YWwgVGltZXIqIGNyZWF0ZVRpbWVyKFRpbWVyOjpDYWxsYmFjayBjYWxsYmFjaywgdm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb2NrVHlwZSBjbG9jayA9IENsb2NrVHlwZTo6a0hvc3QpID0gMDsKKworICAgIC8vIEludGVyZmFjZSBjbGFzcyBmb3IgSS9PIGV2ZW50IHdhdGNoZXJzIG9uIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgLy8gaW1wbGVtZW50ZWQgYnkgdGhpcyBMb29wZXIgaW5zdGFuY2UuCisgICAgY2xhc3MgRmRXYXRjaCB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIGtFdmVudFJlYWQgPSAoMSA8PCAwKSwKKyAgICAgICAgICAgIGtFdmVudFdyaXRlID0gKDEgPDwgMSksCisKKyAgICAgICAgICAgIGtFdmVudE1hc2sgPSAoa0V2ZW50UmVhZCB8IGtFdmVudFdyaXRlKSwKKyAgICAgICAgfTsKKworICAgICAgICAvLyBUeXBlIG9mIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGFuIEkvTyBldmVudCBvY2N1cnMuCisgICAgICAgIC8vIHxvcGFxdWV8IGlzIHRoZSBvcGFxdWUgcG9pbnRlciBwYXNzZWQgYXQgY3JlYXRpb24uCisgICAgICAgIC8vIHxmZHwgaXMgdGhlIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAgLy8gfGV2ZW50c3wgaXMgYW4gZXZlbnQgYml0bWFzay4KKyAgICAgICAgdHlwZWRlZiB2b2lkICgqQ2FsbGJhY2spKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpOworCisgICAgICAgIHZpcnR1YWwgfkZkV2F0Y2goKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkRXZlbnRzKHVuc2lnbmVkIGV2ZW50cykgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZW1vdmVFdmVudHModW5zaWduZWQgZXZlbnRzKSA9IDA7CisKKyAgICAgICAgaW5saW5lIHZvaWQgd2FudFJlYWQoKSB7CisgICAgICAgICAgICBhZGRFdmVudHMoRmRXYXRjaDo6a0V2ZW50UmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgd2FudFdyaXRlKCkgeworICAgICAgICAgICAgYWRkRXZlbnRzKEZkV2F0Y2g6OmtFdmVudFdyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBpbmxpbmUgdm9pZCBkb250V2FudFJlYWQoKSB7CisgICAgICAgICAgICByZW1vdmVFdmVudHMoRmRXYXRjaDo6a0V2ZW50UmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgZG9udFdhbnRXcml0ZSgpIHsKKyAgICAgICAgICAgIHJlbW92ZUV2ZW50cyhGZFdhdGNoOjprRXZlbnRXcml0ZSk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIHBvbGwoKSBjb25zdCA9IDA7CisKKyAgICAgICAgaW50IGZkKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEZkV2F0Y2goTG9vcGVyKiBsb29wZXIsIGludCBmZCwgQ2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIG9wYXF1ZSk7CisKKyAgICAgICAgTG9vcGVyKiBtTG9vcGVyOworICAgICAgICBpbnQgbUZkOworICAgICAgICBDYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgICAgIHZvaWQqIG1PcGFxdWU7CisgICAgfTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBGZFdhdGNoIGluc3RhbmNlIGZyb20gdGhpcyBsb29wZXIuCisgICAgdmlydHVhbCBGZFdhdGNoKiBjcmVhdGVGZFdhdGNoKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmRXYXRjaDo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSkgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQuIFVzZSBjcmVhdGUoKSBtZXRob2QgdG8gY3JlYXRlCisgICAgLy8gbmV3IGdlbmVyaWMgTG9vcGVyIGluc3RhbmNlcy4KKyAgICBMb29wZXIoKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTG9vcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmZmJkZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwzNDIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGVycm5vLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworc3RhdGljIGJvb2wgY3JlYXRlU2NvcGVkU29ja2V0UGFpcihTY29wZWRTb2NrZXQqIHMwLCBTY29wZWRTb2NrZXQqIHMxKSB7CisgICAgaW50IGZkMCA9IC0xLCBmZDEgPSAtMTsKKyAgICBpZiAoc29ja2V0Q3JlYXRlUGFpcigmZmQwLCAmZmQxKSA8IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IHBhaXIiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHMwLT5yZXNldChmZDApOworICAgIHMxLT5yZXNldChmZDEpOworICAgIHJldHVybiB0cnVlOworfQorCit1c2luZyBEdXJhdGlvbiA9IExvb3Blcjo6RHVyYXRpb247CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgQ3JlYXRpb25BbmREZXN0cnVjdGlvbikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKyAgICBBU1NFUlRfVFJVRShsb29wZXIuZ2V0KCkpOworfQorCitURVNUKEdlbmVyaWNMb29wZXIsIFJ1bldpdGhvdXRIYW5kbGVycykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIEEgc2ltcGxlIHJ1bigpIHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkuIEFjY2VwdCA1IG1zIG1heCwgd2hpY2ggaXMKKyAgICAvLyBodWdlIGJ1dCBtaWdodCBhY2NvdW50IGZvciBvdmVybG9hZGVkIG1hY2hpbmVzIHdoZW4gdGhlIHRlc3RzIGFyZSBydW4uCisgICAgY29uc3QgRHVyYXRpb24ga01heERlbGF5TXMgPSA1OworICAgIER1cmF0aW9uIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgbG9vcGVyLT5ydW4oKTsKKyAgICBEdXJhdGlvbiBub3cxID0gbG9vcGVyLT5ub3dNcygpOworICAgIEVYUEVDVF9MRShub3cxIC0gbm93MCwga01heERlbGF5TXMpOworCisgICAgLy8gU2ltaWxhcmx5LCBydW5XaXRoRGVhZGxpbmVNcyhrSW5maW5pdGVEdXJhdGlvbikgc2hvdWxkIHJldHVybgorICAgIC8vIEVXT1VMREJMT0NLLgorICAgIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0VRKEVXT1VMREJMT0NLLCBsb29wZXItPnJ1bldpdGhEZWFkbGluZU1zKAorICAgICAgICAgICAgTG9vcGVyOjprRHVyYXRpb25JbmZpbml0ZSkpOworICAgIG5vdzEgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0xFKG5vdzEgLSBub3cwLCBrTWF4RGVsYXlNcyk7CisKKyAgICAvLyBTYW1lIHdpdGggYW4gYXJiaXRyYXJ5IGZpeGVkIGRlYWRsaW5lLgorICAgIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0VRKEVXT1VMREJMT0NLLCBsb29wZXItPnJ1bldpdGhEZWFkbGluZU1zKG5vdzAgKyAxMDAwKSk7CisgICAgbm93MSA9IGxvb3Blci0+bm93TXMoKTsKKyAgICBFWFBFQ1RfTEUobm93MSAtIG5vdzAsIGtNYXhEZWxheU1zKTsKK30KKworc3RhdGljIHZvaWQgbXlUaW1lckNhbGxiYWNrTm9vcCh2b2lkKiBvcGFxdWUsIExvb3Blcjo6VGltZXIqIHRpbWVyKSB7fQorCitzdGF0aWMgdm9pZCBteVRpbWVyQ2FsbGJhY2tGb3JjZVF1aXQodm9pZCogb3BhcXVlLCBMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgIGF1dG8gbG9vcGVyID0gc3RhdGljX2Nhc3Q8TG9vcGVyKj4ob3BhcXVlKTsKKyAgICBsb29wZXItPmZvcmNlUXVpdCgpOworfQorCitzdGF0aWMgdm9pZCBteVRpbWVyQ2FsbGJhY2tTZWxmRGVsZXRlKHZvaWQqIG9wYXF1ZSwgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBkZWxldGUgdGltZXI7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBUaW1lckdyb3VwIHsKKyAgICBMb29wZXIqIGxvb3BlcjsKKyAgICBMb29wZXI6OlRpbWVyKiB0aW1lcjE7CisgICAgTG9vcGVyOjpUaW1lciogdGltZXIyOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXRpYyB2b2lkIG15VGltZXJDYWxsYmFja1N0b3BTZWNvbmRUaW1lcih2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBhdXRvIGdyb3VwID0gc3RhdGljX2Nhc3Q8VGltZXJHcm91cCo+KG9wYXF1ZSk7CisgICAgQVNTRVJUX0VRKHRpbWVyLCBncm91cC0+dGltZXIxKTsKKyAgICBncm91cC0+dGltZXIyLT5zdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIG15VGltZXJDYWxsYmFja1Nob3VsZE5ldmVyQmVDYWxsZWQodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgIEdURVNUX0ZBSUwoKSA8PCAiVGhpcyB0aW1lciBjYWxsYmFjayBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkISEiOworfQorCitURVNUKEdlbmVyaWNMb29wZXIsIFJ1bldpdGhTaW5nbGVUaW1lcikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSBhIHRpbWVyIHRoYXQgcnVucyBhZnRlciAxMG1zIHRoZW4gY2FsbHMgTG9vcGVyOjpmb3JjZVF1aXQoKS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyOjpUaW1lcj4gdGltZXIxKGxvb3Blci0+Y3JlYXRlVGltZXIoCisgICAgICAgICAgICBteVRpbWVyQ2FsbGJhY2tOb29wLCBsb29wZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfVFJVRSh0aW1lcjEuZ2V0KCkpOworICAgIEFTU0VSVF9FUShsb29wZXIuZ2V0KCksIHRpbWVyMS0+cGFyZW50TG9vcGVyKCkpOworICAgIEVYUEVDVF9GQUxTRSh0aW1lcjEtPmlzQWN0aXZlKCkpOworCisgICAgY29uc3QgRHVyYXRpb24ga0RlbGF5TXMgPSAxMDsKKyAgICBEdXJhdGlvbiBub3cwID0gbG9vcGVyLT5ub3dNcygpOworICAgIHRpbWVyMS0+c3RhcnRBYnNvbHV0ZShub3cwICsga0RlbGF5TXMpOworICAgIEVYUEVDVF9UUlVFKHRpbWVyMS0+aXNBY3RpdmUoKSk7CisgICAgaW50IHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMoTG9vcGVyOjprRHVyYXRpb25JbmZpbml0ZSk7CisgICAgRVhQRUNUX0VRKEVXT1VMREJMT0NLLCByZXQpOworICAgIER1cmF0aW9uIG5vdzEgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0dFKG5vdzEgLSBub3cwLCBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMS0+aXNBY3RpdmUoKSk7Cit9CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgUnVuV2l0aFNpbmdsZVRpbWVyVGltaW5nT3V0KSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPExvb3Blcj4gbG9vcGVyKExvb3Blcjo6Y3JlYXRlKCkpOworCisgICAgLy8gQ3JlYXRlIGEgdGltZXIgdGhhdCBydW5zIGFmdGVyIDEwbXMgdGhlbiBjYWxscyBMb29wZXI6OmZvcmNlUXVpdCgpLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI6OlRpbWVyPiB0aW1lcjEobG9vcGVyLT5jcmVhdGVUaW1lcigKKyAgICAgICAgICAgIG15VGltZXJDYWxsYmFja05vb3AsIGxvb3Blci5nZXQoKSkpOworICAgIEFTU0VSVF9UUlVFKHRpbWVyMS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKGxvb3Blci5nZXQoKSwgdGltZXIxLT5wYXJlbnRMb29wZXIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMS0+aXNBY3RpdmUoKSk7CisKKyAgICBjb25zdCBEdXJhdGlvbiBrRGVsYXlNcyA9IDEwOworICAgIER1cmF0aW9uIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgdGltZXIxLT5zdGFydEFic29sdXRlKG5vdzAgKyBrRGVsYXlNcyk7CisgICAgRVhQRUNUX1RSVUUodGltZXIxLT5pc0FjdGl2ZSgpKTsKKyAgICBpbnQgcmV0ID0gbG9vcGVyLT5ydW5XaXRoRGVhZGxpbmVNcyhub3cwICsga0RlbGF5TXMgLyAyKTsKKyAgICBFWFBFQ1RfRVEoRVRJTUVET1VULCByZXQpOworICAgIER1cmF0aW9uIG5vdzEgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0dFKG5vdzEgLSBub3cwLCBrRGVsYXlNcyAvIDIpOworICAgIEVYUEVDVF9MVChub3cxIC0gbm93MCwga0RlbGF5TXMpOworICAgIEVYUEVDVF9UUlVFKHRpbWVyMS0+aXNBY3RpdmUoKSk7Cit9CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgUnVuV2l0aFNpbmdsZVRpbWVyRm9yY2VRdWl0dGluZykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSBhIHRpbWVyIHRoYXQgcnVucyBhZnRlciAxMG1zIHRoZW4gY2FsbHMgTG9vcGVyOjpmb3JjZVF1aXQoKS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyOjpUaW1lcj4gdGltZXIxKGxvb3Blci0+Y3JlYXRlVGltZXIoCisgICAgICAgICAgICBteVRpbWVyQ2FsbGJhY2tGb3JjZVF1aXQsIGxvb3Blci5nZXQoKSkpOworICAgIEFTU0VSVF9UUlVFKHRpbWVyMS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKGxvb3Blci5nZXQoKSwgdGltZXIxLT5wYXJlbnRMb29wZXIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMS0+aXNBY3RpdmUoKSk7CisKKyAgICBjb25zdCBEdXJhdGlvbiBrRGVsYXlNcyA9IDEwOworICAgIER1cmF0aW9uIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgdGltZXIxLT5zdGFydEFic29sdXRlKG5vdzAgKyBrRGVsYXlNcyk7CisgICAgRVhQRUNUX1RSVUUodGltZXIxLT5pc0FjdGl2ZSgpKTsKKyAgICBsb29wZXItPnJ1bigpOworICAgIER1cmF0aW9uIG5vdzEgPSBsb29wZXItPm5vd01zKCk7CisgICAgRVhQRUNUX0dFKG5vdzEgLSBub3cwLCBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMS0+aXNBY3RpdmUoKSk7Cit9CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgUnVuV2l0aFNpbmdsZVRpbWVyU2VsZkRlbGV0aW5nKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPExvb3Blcj4gbG9vcGVyKExvb3Blcjo6Y3JlYXRlKCkpOworCisgICAgLy8gQ3JlYXRlIGEgdGltZXIgdGhhdCBydW5zIGFmdGVyIDEwbXMgdGhlbiBzZWxmIGRlbGV0ZXMgaXRzZWxmLCB3aGljaAorICAgIC8vIHdpbGwgZm9yY2UgcnVuKCkgdG8gZXhpdC4KKyAgICBMb29wZXI6OlRpbWVyKiB0aW1lcjEgPSBsb29wZXItPmNyZWF0ZVRpbWVyKAorICAgICAgICAgICAgbXlUaW1lckNhbGxiYWNrU2VsZkRlbGV0ZSwgbG9vcGVyLmdldCgpKTsKKyAgICBBU1NFUlRfVFJVRSh0aW1lcjEpOworICAgIEFTU0VSVF9FUShsb29wZXIuZ2V0KCksIHRpbWVyMS0+cGFyZW50TG9vcGVyKCkpOworCisgICAgY29uc3QgRHVyYXRpb24ga0RlbGF5TXMgPSAxMDsKKyAgICBEdXJhdGlvbiBub3cwID0gbG9vcGVyLT5ub3dNcygpOworICAgIHRpbWVyMS0+c3RhcnRBYnNvbHV0ZShub3cwICsga0RlbGF5TXMpOworICAgIEVYUEVDVF9UUlVFKHRpbWVyMS0+aXNBY3RpdmUoKSk7CisgICAgbG9vcGVyLT5ydW4oKTsKKyAgICBEdXJhdGlvbiBub3cxID0gbG9vcGVyLT5ub3dNcygpOworICAgIEVYUEVDVF9HRShub3cxIC0gbm93MCwga0RlbGF5TXMpOworICAgIC8vIFRJTUVSIFdBUyBERUxFVEVEOiBFWFBFQ1RfRkFMU0UodGltZXIxLT5pc0FjdGl2ZSgpKTsKK30KKworVEVTVChHZW5lcmljTG9vcGVyLCBSdW5XaXRoVHdvVGltZXJzT25lU3RvcHBpbmdUaGVPdGhlcikgeworICAgIC8vIENyZWF0ZSB0d28gdGltZXJzLCBvbmUgdGhhdCBydW5zIGFmdGVyIDEwbXMsIGFuZCB0aGUgb3RoZXIgYWZ0ZXIgMjBtcworICAgIC8vIFRoZSBmaXJzdCB0aW1lciBjYWxsYmFjayB3aWxsIHN0b3AgdGhlIHNlY29uZCBvbmUsIHdoaWNoIHdpbGwgZm9yY2UKKyAgICAvLyBMb29wZXI6OnJ1bigpIHRvIGV4aXQgYWZ0ZXIgMTBtcy4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyPiBsb29wZXIoTG9vcGVyOjpjcmVhdGUoKSk7CisKKyAgICBUaW1lckdyb3VwIGdyb3VwID0geyAubG9vcGVyID0gbG9vcGVyLmdldCgpLCB9OworCisgICAgLy8gQ3JlYXRlIGEgdGltZXIgdGhhdCBydW5zIGFmdGVyIDEwbXMgdGhlbiBjYWxscyBMb29wZXI6OmZvcmNlUXVpdCgpLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI6OlRpbWVyPiB0aW1lcjEobG9vcGVyLT5jcmVhdGVUaW1lcigKKyAgICAgICAgICAgIG15VGltZXJDYWxsYmFja1N0b3BTZWNvbmRUaW1lciwgJmdyb3VwKSk7CisgICAgQVNTRVJUX1RSVUUodGltZXIxLmdldCgpKTsKKyAgICBBU1NFUlRfRVEobG9vcGVyLmdldCgpLCB0aW1lcjEtPnBhcmVudExvb3BlcigpKTsKKyAgICBncm91cC50aW1lcjEgPSB0aW1lcjEuZ2V0KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyOjpUaW1lcj4gdGltZXIyKGxvb3Blci0+Y3JlYXRlVGltZXIoCisgICAgICAgICAgICBteVRpbWVyQ2FsbGJhY2tTaG91bGROZXZlckJlQ2FsbGVkLCBsb29wZXIuZ2V0KCkpKTsKKyAgICBBU1NFUlRfVFJVRSh0aW1lcjEuZ2V0KCkpOworICAgIEFTU0VSVF9FUShsb29wZXIuZ2V0KCksIHRpbWVyMi0+cGFyZW50TG9vcGVyKCkpOworICAgIGdyb3VwLnRpbWVyMiA9IHRpbWVyMi5nZXQoKTsKKworICAgIGNvbnN0IER1cmF0aW9uIGtEZWxheU1zID0gMTA7CisgICAgRHVyYXRpb24gbm93MCA9IGxvb3Blci0+bm93TXMoKTsKKyAgICB0aW1lcjEtPnN0YXJ0QWJzb2x1dGUobm93MCArIGtEZWxheU1zKTsKKyAgICBFWFBFQ1RfVFJVRSh0aW1lcjEtPmlzQWN0aXZlKCkpOworICAgIHRpbWVyMi0+c3RhcnRBYnNvbHV0ZShub3cwICsgMiAqIGtEZWxheU1zKTsKKyAgICBFWFBFQ1RfVFJVRSh0aW1lcjItPmlzQWN0aXZlKCkpOworICAgIGxvb3Blci0+cnVuKCk7CisgICAgRHVyYXRpb24gbm93MSA9IGxvb3Blci0+bm93TXMoKTsKKyAgICBFWFBFQ1RfR0Uobm93MSAtIG5vdzAsIGtEZWxheU1zKTsKKyAgICBFWFBFQ1RfTFQobm93MSAtIG5vdzAsIDIgKiBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMS0+aXNBY3RpdmUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRpbWVyMi0+aXNBY3RpdmUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIG15RmRXYXRjaENhbGxiYWNrV3JpdGVCb29sZWFuRmxhZyh2b2lkKiBvcGFxdWUsIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBFWFBFQ1RfRVEoTG9vcGVyOjpGZFdhdGNoOjprRXZlbnRSZWFkLCBldmVudHMpOworICAgIGF1dG8gcGZsYWcgPSBzdGF0aWNfY2FzdDxib29sKj4ob3BhcXVlKTsKKyAgICAqcGZsYWcgPSB0cnVlOworfQorCitURVNUKEdlbmVyaWNMb29wZXIsIFJ1bldpdGhTaW5nbGVGZFdhdGNoV2l0aFRpbWVvdXQpIHsKKyAgICBTY29wZWRTb2NrZXQgczA7CisgICAgU2NvcGVkU29ja2V0IHMxOworICAgIEFTU0VSVF9UUlVFKGNyZWF0ZVNjb3BlZFNvY2tldFBhaXIoJnMwLCAmczEpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSBhIHNpbmdsIEZkV2F0Y2ggdG8gc2V0IGEgYm9vbGVhbiBmbGFnIG9uIHNvY2tldCBldmVudCwKKyAgICAvLyBidXQgZG8gbm90IGFjdGl2YXRlIGl0IChpLmUuIGRvIG5vdCBjYWxsIDo6d2FudFJlYWQoKSksIHRoZQorICAgIC8vIGxvb3BlciBzaG91bGQgY29uc2lkZXIgdGhlcmUgYXJlIG5vIGFjdGl2ZSBoYW5kbGUgYW5kIHJldHVybgorICAgIC8vIGltbWVkaWF0ZWx5IGZyb20gaXRzIGxvb3Agd2l0aCBFV09VTERCTE9DSy4KKyAgICBib29sIGZsYWcgPSBmYWxzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyOjpGZFdhdGNoPiB3YXRjaDEoCisgICAgICAgIGxvb3Blci0+Y3JlYXRlRmRXYXRjaChzMS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RmRXYXRjaENhbGxiYWNrV3JpdGVCb29sZWFuRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnKSk7CisgICAgQVNTRVJUX1RSVUUod2F0Y2gxLmdldCgpKTsKKworICAgIEVYUEVDVF9FUSgwVSwgd2F0Y2gxLT5wb2xsKCkpOworICAgIEVYUEVDVF9GQUxTRShmbGFnKTsKKworICAgIHNvY2tldFNlbmQoczAuZ2V0KCksICJ4IiwgMSk7CisKKyAgICBjb25zdCBEdXJhdGlvbiBrRGVsYXlNcyA9IDEwOworICAgIER1cmF0aW9uIG5vdzAgPSBsb29wZXItPm5vd01zKCk7CisgICAgaW50IHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMobm93MCArIGtEZWxheU1zKTsKKyAgICBEdXJhdGlvbiBub3cxID0gbG9vcGVyLT5ub3dNcygpOworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIHJldCk7CisgICAgRVhQRUNUX0xUKG5vdzAgLSBub3cxLCBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0ZBTFNFKGZsYWcpOyAgLy8gQ2FsbGJhY2sgd2FzIG5vdCBjYWxsZWQuCit9CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgUnVuV2l0aFNpbmdsZUZkV2F0Y2hTZXR0aW5nQm9vbGVhbkZsYWcpIHsKKyAgICBTY29wZWRTb2NrZXQgczA7CisgICAgU2NvcGVkU29ja2V0IHMxOworICAgIEFTU0VSVF9UUlVFKGNyZWF0ZVNjb3BlZFNvY2tldFBhaXIoJnMwLCAmczEpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSBhIHNpbmdsIEZkV2F0Y2ggdG8gc2V0IGEgYm9vbGVhbiBmbGFnIG9uIHNvY2tldCBldmVudCwKKyAgICAvLyBhbmQgYWN0aXZhdGUgaXQuIFZlcmlmeSB0aGF0IHRoZSBsb29wZXIgcmV0dXJucyBiZWZvcmUgYSBtYXggZGVsYXkKKyAgICAvLyBvZiAxMDBtcyBkdWUgdG8gdGhlIGV2ZW50LgorICAgIGJvb2wgZmxhZyA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI6OkZkV2F0Y2g+IHdhdGNoMSgKKyAgICAgICAgbG9vcGVyLT5jcmVhdGVGZFdhdGNoKHMxLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlGZFdhdGNoQ2FsbGJhY2tXcml0ZUJvb2xlYW5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWcpKTsKKyAgICBBU1NFUlRfVFJVRSh3YXRjaDEuZ2V0KCkpOworCisgICAgRVhQRUNUX0VRKDBVLCB3YXRjaDEtPnBvbGwoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZsYWcpOworCisgICAgc29ja2V0U2VuZChzMC5nZXQoKSwgIngiLCAxKTsKKyAgICB3YXRjaDEtPndhbnRSZWFkKCk7CisKKyAgICBjb25zdCBEdXJhdGlvbiBrRGVsYXlNcyA9IDEwMDsKKyAgICBEdXJhdGlvbiBub3cwID0gbG9vcGVyLT5ub3dNcygpOworICAgIGludCByZXQgPSBsb29wZXItPnJ1bldpdGhEZWFkbGluZU1zKG5vdzAgKyBrRGVsYXlNcyk7CisgICAgRHVyYXRpb24gbm93MSA9IGxvb3Blci0+bm93TXMoKTsKKyAgICBFWFBFQ1RfRVEoRVRJTUVET1VULCByZXQpOworICAgIEVYUEVDVF9MVChub3cwIC0gbm93MSwga0RlbGF5TXMpOworICAgIEVYUEVDVF9UUlVFKGZsYWcpOyAgLy8gQ2FsbGJhY2sgd2FzIGNhbGxlZC4KK30KKworc3RhdGljIHZvaWQgbXlUaW1lckNhbGxiYWNrUmVtb3ZlRmRXYXRjaFJlYWQodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBhdXRvIHdhdGNoID0gc3RhdGljX2Nhc3Q8TG9vcGVyOjpGZFdhdGNoKj4ob3BhcXVlKTsKKyAgICBBU1NFUlRfRVEoTG9vcGVyOjpGZFdhdGNoOjprRXZlbnRSZWFkLCB3YXRjaC0+cG9sbCgpKTsKKyAgICB3YXRjaC0+ZG9udFdhbnRSZWFkKCk7Cit9CisKK1RFU1QoR2VuZXJpY0xvb3BlciwgUnVuVGltZXJBbmRGZFdhdGNoV2l0aFRpbWVyUmVtb3ZpbmdQZW5kaW5nV2F0Y2gpIHsKKyAgICBTY29wZWRTb2NrZXQgczA7CisgICAgU2NvcGVkU29ja2V0IHMxOworICAgIEFTU0VSVF9UUlVFKGNyZWF0ZVNjb3BlZFNvY2tldFBhaXIoJnMwLCAmczEpKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IGxvb3BlcihMb29wZXI6OmNyZWF0ZSgpKTsKKworICAgIC8vIENyZWF0ZSBhIHNpbmdsIEZkV2F0Y2ggdG8gc2V0IGEgYm9vbGVhbiBmbGFnIG9uIHNvY2tldCBldmVudCwKKyAgICAvLyBhbmQgYWN0aXZhdGUgaXQuIFZlcmlmeSB0aGF0IHRoZSBsb29wZXIgcmV0dXJucyBiZWZvcmUgYSBtYXggZGVsYXkKKyAgICAvLyBvZiAxMDBtcyBkdWUgdG8gdGhlIGV2ZW50LgorICAgIGJvb2wgZmxhZyA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI6OkZkV2F0Y2g+IHdhdGNoMSgKKyAgICAgICAgICAgIGxvb3Blci0+Y3JlYXRlRmRXYXRjaChzMS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteUZkV2F0Y2hDYWxsYmFja1dyaXRlQm9vbGVhbkZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWcpKTsKKyAgICBBU1NFUlRfVFJVRSh3YXRjaDEuZ2V0KCkpOworCisgICAgRVhQRUNUX0VRKDBVLCB3YXRjaDEtPnBvbGwoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZsYWcpOworICAgIHdhdGNoMS0+d2FudFJlYWQoKTsKKworICAgIC8vIFdyaXRlIGEgYnl0ZSB0byB0aGUgc29ja2V0IHBhaXIsIHRoaXMgd2lsbCBtYWtlIHRoZSB3YXRjaCBwZW5kaW5nCisgICAgLy8gZm9yIHRoZSBuZXh0IExvb3Blcjo6cnVuKCkgY2FsbC4KKyAgICBzb2NrZXRTZW5kKHMwLmdldCgpLCAieCIsIDEpOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IHRpbWVyIHRoYXQgd2lsbCBiZSBmaXJlZCBpbW1lZGlhdGVseSBhbmQgd2lsbCByZW1vdmUgdGhlCisgICAgLy8gcGVuZGluZyB3YXRjaC4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyOjpUaW1lcj4gdGltZXIxKAorICAgICAgICAgICAgbG9vcGVyLT5jcmVhdGVUaW1lcihteVRpbWVyQ2FsbGJhY2tSZW1vdmVGZFdhdGNoUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2gxLmdldCgpKSk7CisKKworICAgIGNvbnN0IER1cmF0aW9uIGtEZWxheU1zID0gMTA7CisgICAgRHVyYXRpb24gbm93MCA9IGxvb3Blci0+bm93TXMoKTsKKyAgICB0aW1lcjEtPnN0YXJ0QWJzb2x1dGUobm93MCk7CisgICAgaW50IHJldCA9IGxvb3Blci0+cnVuV2l0aERlYWRsaW5lTXMobm93MCArIGtEZWxheU1zKTsKKyAgICBEdXJhdGlvbiBub3cxID0gbG9vcGVyLT5ub3dNcygpOworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIHJldCk7CisgICAgRVhQRUNUX0xUKG5vdzAgLSBub3cxLCBrRGVsYXlNcyk7CisgICAgRVhQRUNUX0ZBTFNFKGZsYWcpOyAgLy8gQ2FsbGJhY2sgd2FzIG5vdCBjYWxsZWQuCit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvUmVjdXJyZW50VGFzay5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvUmVjdXJyZW50VGFzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDAzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9SZWN1cnJlbnRUYXNrLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIFJlY3VycmVudFRhc2sgaXMgYW4gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBydW4gYSB0YXNrIHJlcGVhdGVkbHkgb24gdGhlCisvLyBldmVudCBsb29wLCB1bnRpbCB5b3UncmUgZG9uZS4KKy8vIEV4YW1wbGU6CisvLworLy8gICAgIGNsYXNzIEFyZVdlVGhlcmVZZXQgeworLy8gICAgIHB1YmxpYzoKKy8vICAgICAgICAgQXJlV2VUaGVyZVlldChMb29wZXIqIGxvb3BlcikgOgorLy8gICAgICAgICAgICAgICAgIG1Bc2tSZXBlYXRlZGx5KGxvb3BlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJkFyZVdlVGhlcmVZZXQ6OmFza0FnYWluKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICogNjAgKiAxMDAwKSB7fQorLy8KKy8vICAgICAgICAgdm9pZCBhc2tBZ2FpbigpIHsKKy8vICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiQXJlIHdlIHRoZXJlIHlldD8iIDw8IHN0ZDo6ZW5kbDsKKy8vICAgICAgICAgfQorLy8KKy8vICAgICAgICAgdm9pZCBzdGFydEhpa2UoKSB7CisvLyAgICAgICAgICAgICBtQXNrUmVwZWF0ZWRseS5zdGFydCgpOworLy8gICAgICAgICB9CisvLworLy8gICAgIHByaXZhdGU6CisvLyAgICAgICAgIFJlY3VycmVudFRhc2sgbUFza1JlcGVhdGVkbHk7CisvLyAgICAgfTsKKy8vCisvLyBOb3RlOiBSZWN1cnJlbnRUYXNrIGlzIG1lYW50IHRvIGV4ZWN1dGUgYSB0YXNrIF9fb24gdGhlIGxvb3BlciB0aHJlYWRfXy4KKy8vIEl0IGlzIG5vdCB0aHJlYWQgc2FmZS4KK2NsYXNzIFJlY3VycmVudFRhc2sgeworcHVibGljOgorICAgIHVzaW5nIFRhc2tGdW5jdGlvbiA9IHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPjsKKworICAgIFJlY3VycmVudFRhc2soTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICBUYXNrRnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OkR1cmF0aW9uIHRhc2tJbnRlcnZhbE1zKSA6CisgICAgICAgIG1Mb29wZXIobG9vcGVyKSwgbUZ1bmN0aW9uKGZ1bmN0aW9uKSwgbVRhc2tJbnRlcnZhbE1zKHRhc2tJbnRlcnZhbE1zKSwKKyAgICAgICAgbVRpbWVyKG1Mb29wZXItPmNyZWF0ZVRpbWVyKCZSZWN1cnJlbnRUYXNrOjp0YXNrQ2FsbGJhY2ssIHRoaXMpKSB7fQorCisgICAgflJlY3VycmVudFRhc2soKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisKKyAgICB2b2lkIHN0YXJ0KCkgeworICAgICAgICBzdG9wKCk7CisgICAgICAgIG1JbkZsaWdodCA9IHRydWU7CisgICAgICAgIG1UaW1lci0+c3RhcnRSZWxhdGl2ZShtVGFza0ludGVydmFsTXMpOworICAgIH0KKworICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUluRmxpZ2h0ID0gZmFsc2U7CisgICAgICAgIGlmKG1UaW1lcikgeworICAgICAgICAgICAgbVRpbWVyLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGluRmxpZ2h0KCkgeworICAgICAgICByZXR1cm4gbUluRmxpZ2h0OworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIHRhc2tDYWxsYmFjayh2b2lkKiBvcGFxdWVUaGlzLCBMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgICAgICBhdXRvIHRoaXNQdHIgPSBzdGF0aWNfY2FzdDxSZWN1cnJlbnRUYXNrKj4ob3BhcXVlVGhpcyk7CisgICAgICAgIGlmICghdGhpc1B0ci0+bUZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgIHRoaXNQdHItPm1JbkZsaWdodCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGNsaWVudCBjb2RlIGluIHxtRnVuY3Rpb258IGNhbGxzIHxzdG9wfCwgc28KKyAgICAgICAgLy8gd2UgbXVzdCBkb3VibGUgY2hlY2sgYmVmb3JlIHJlcG9zdGluZyB0aGUgdGFzay4KKyAgICAgICAgaWYgKHRoaXNQdHItPm1JbkZsaWdodCkgeworICAgICAgICAgICAgdGhpc1B0ci0+bVRpbWVyLT5zdGFydFJlbGF0aXZlKHRoaXNQdHItPm1UYXNrSW50ZXJ2YWxNcyk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgTG9vcGVyKiBtTG9vcGVyOworICAgIFRhc2tGdW5jdGlvbiBtRnVuY3Rpb247CisgICAgTG9vcGVyOjpEdXJhdGlvbiBtVGFza0ludGVydmFsTXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPExvb3Blcjo6VGltZXI+IG1UaW1lcjsKKyAgICBib29sIG1JbkZsaWdodCA9IGZhbHNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9SZWN1cnJlbnRUYXNrX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1JlY3VycmVudFRhc2tfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZGI5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9SZWN1cnJlbnRUYXNrX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1JlY3VycmVudFRhc2suaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TG9vcGVyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0TG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVjdXJyZW50VGFzazsKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKKworY2xhc3MgQ291bnRVcFRvTiB7CitwdWJsaWM6CisgICAgQ291bnRVcFRvTihMb29wZXIqIGxvb3BlciwgaW50IG1heENvdW50KQorICAgICAgICA6IG1NYXhDb3VudChtYXhDb3VudCksCisgICAgICAgICAgbVJlY3VycmVudFRhc2sobG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmQ291bnRVcFRvTjo6Y291bnRPbmUsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgIG1QdHJNYXlCZU51bGwoJnNpZGVFZmZlY3RWYXIpIHt9CisKKyAgICB+Q291bnRVcFRvTigpIHsKKyAgICAgICAgbVB0ck1heUJlTnVsbCA9IG51bGxwdHI7CisgICAgfQorCisgICAgUmVjdXJyZW50VGFzayYgdGFzaygpIHsKKyAgICAgICAgcmV0dXJuIG1SZWN1cnJlbnRUYXNrOworICAgIH0KKworICAgIHZvaWQgc3RhcnQoKSB7IG1SZWN1cnJlbnRUYXNrLnN0YXJ0KCk7IH0KKworICAgIGJvb2wgY291bnRPbmUoKSB7CisKKyAgICAgICAgYmxvd1VwSWZEZWxldGVkKCk7CisKKyAgICAgICAgaWYgKG1DdXJDb3VudCA+PSBtTWF4Q291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICArK21DdXJDb3VudDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBibG93VXBJZkRlbGV0ZWQoKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGlzIGhhcyBhIHNpZGUgZWZmZWN0LgorICAgICAgICAqbVB0ck1heUJlTnVsbCA9IHNpZGVFZmZlY3RWYXI7CisgICAgfQorCisgICAgaW50IGN1ckNvdW50KCkgY29uc3QgeyByZXR1cm4gbUN1ckNvdW50OyB9CisKK3ByaXZhdGU6CisgICAgaW50IG1NYXhDb3VudDsKKyAgICBSZWN1cnJlbnRUYXNrIG1SZWN1cnJlbnRUYXNrOworICAgIGludCBtQ3VyQ291bnQgPSAwOworCisgICAgLy8gRGVzaWduZWQgdG8gYmxvdyB1cCBpZiB8Y291bnRPbmV8IGlzIGNhbGxlZCBhZnRlciB3ZSd2ZSBiZWVuIGRlbGV0ZWQuCisgICAgdm9sYXRpbGUgaW50KiB2b2xhdGlsZSBtUHRyTWF5QmVOdWxsOworICAgIHZvbGF0aWxlIGludCBzaWRlRWZmZWN0VmFyOworfTsKKworVEVTVChSZWN1cnJlbnRUYXNrVGVzdCwgemVyb1RpbWVzKSB7CisgICAgVGVzdExvb3BlciBsb29wZXI7CisgICAgQ291bnRVcFRvTiB0YXNrZXIoJmxvb3BlciwgMCk7CisgICAgdGFza2VyLnN0YXJ0KCk7CisKKyAgICBFWFBFQ1RfVFJVRSh0YXNrZXIudGFzaygpLmluRmxpZ2h0KCkpOworICAgIEVYUEVDVF9FUSgwLCB0YXNrZXIuY3VyQ291bnQoKSk7CisgICAgbG9vcGVyLnJ1bldpdGhUaW1lb3V0TXMoNTAwKTsKKyAgICBFWFBFQ1RfRkFMU0UodGFza2VyLnRhc2soKS5pbkZsaWdodCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGFza2VyLmN1ckNvdW50KCkpOworfQorCitURVNUKFJlY3VycmVudFRhc2tUZXN0LCBmaXZlVGltZXMpIHsKKyAgICBUZXN0TG9vcGVyIGxvb3BlcjsKKyAgICBDb3VudFVwVG9OIHRhc2tlcigmbG9vcGVyLCA1KTsKKyAgICB0YXNrZXIuc3RhcnQoKTsKKworICAgIEVYUEVDVF9UUlVFKHRhc2tlci50YXNrKCkuaW5GbGlnaHQoKSk7CisgICAgRVhQRUNUX0VRKDAsIHRhc2tlci5jdXJDb3VudCgpKTsKKyAgICBsb29wZXIucnVuV2l0aFRpbWVvdXRNcyg1MDApOworICAgIEVYUEVDVF9GQUxTRSh0YXNrZXIudGFzaygpLmluRmxpZ2h0KCkpOworICAgIEVYUEVDVF9FUSg1LCB0YXNrZXIuY3VyQ291bnQoKSk7Cit9CisKK1RFU1QoUmVjdXJyZW50VGFza1Rlc3QsIGRlbGV0ZVN0YXJ0ZWRPYmplY3QpIHsKKyAgICBUZXN0TG9vcGVyIGxvb3BlcjsKKyAgICBhdXRvIHRhc2tlciA9IG5ldyBDb3VudFVwVG9OKCZsb29wZXIsIDUpOworICAgIHRhc2tlci0+c3RhcnQoKTsKKyAgICBkZWxldGUgdGFza2VyOworCisgICAgLy8gSWYgfFJlY3VycmVudFRhc2t8IGRvZXMgbm90IGdyYWNlZnVsbHkgaGFuZGxlIGJlaW5nIGRlbGV0ZWQgd2hpbGUgYWN0aXZlLAorICAgIC8vIHRoaXMgd2lsbCBibG93IHVwLgorICAgIGxvb3Blci5ydW5XaXRoVGltZW91dE1zKDUwMCk7Cit9CisKK3N0YXRpYyBib29sIHN0b3BBbmRSZXR1cm4oUmVjdXJyZW50VGFzayogdGFzaywgaW50KiBjb3VudCkgeworICAgIHRhc2stPnN0b3AoKTsKKyAgICAvLyBMZXQncyBub3Qgb3ZlcmZsb3cgYW5kIHN1Y2NlZWQgZmxha2lseS4KKyAgICBpZiAoKmNvdW50IDwgMTApIHsKKyAgICAgICAgKysoKmNvdW50KTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1QoUmVjdXJyZW50VGFza1Rlc3QsIHN0b3BGcm9tQ2FsbGJhY2spIHsKKyAgICBUZXN0TG9vcGVyIGxvb3BlcjsKKyAgICBpbnQgY291bnQgPSAwOworICAgIFJlY3VycmVudFRhc2sgdGFzaygmbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICBbJnRhc2ssICZjb3VudF0oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcEFuZFJldHVybigmdGFzaywgJmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgdGFzay5zdGFydCgpOworICAgIEVYUEVDVF9UUlVFKHRhc2suaW5GbGlnaHQoKSk7CisgICAgbG9vcGVyLnJ1bldpdGhUaW1lb3V0TXMoNTApOworICAgIEVYUEVDVF9FUSgxLCBjb3VudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9TY29wZWRTb2NrZXRXYXRjaC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9TY29wZWRTb2NrZXRXYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4MWYzZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9TY29wZWRTb2NrZXRXYXRjaC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKwordm9pZCBhbmRyb2lkOjpiYXNlOjpTb2NrZXRXYXRjaERlbGV0ZXI6Om9wZXJhdG9yKCkoCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6RmRXYXRjaCogd2F0Y2gpIGNvbnN0IHsKKyAgICBpbnQgZmQgPSB3YXRjaC0+ZmQoKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBzb2NrZXRDbG9zZSh3YXRjaC0+ZmQoKSk7CisgICAgfQorICAgIGRlbGV0ZSB3YXRjaDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9TY29wZWRTb2NrZXRXYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDQyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9TY29wZWRTb2NrZXRXYXRjaC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBTY29wZWRTb2NrZXRXYXRjaCBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHNjb3BlZAorLy8gTG9vcGVyOjpGZFdhdGNoIHBvaW50ZXIgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgY2FsbCBzb2NrZXRDbG9zZSgpCisvLyBvbiBkZXN0cnVjdGlvbi4KKworLy8gQ3VzdG9tIGRlbGV0ZXIgZnJvbSBzdGQ6OnVuaXF1ZV9wdHIKK3N0cnVjdCBTb2NrZXRXYXRjaERlbGV0ZXIgeworICAgIHZvaWQgb3BlcmF0b3IoKShhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkZkV2F0Y2gqIHdhdGNoKSBjb25zdDsKK307CisKK3VzaW5nIFNjb3BlZFNvY2tldFdhdGNoID0gc3RkOjp1bmlxdWVfcHRyPExvb3Blcjo6RmRXYXRjaCwgU29ja2V0V2F0Y2hEZWxldGVyPjsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY1YjBkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvU2NvcGVkU29ja2V0V2F0Y2hfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworc3RydWN0IERhdGEgeworICAgIERhdGEoKSB7CisgICAgICAgIHNvY2tldENyZWF0ZVBhaXIoJnNvY2tbMF0sICZzb2NrWzFdKTsKKyAgICB9CisKKyAgICB+RGF0YSgpIHsKKyAgICAgICAgLy8gT25seSBkZXN0cm95IHNvY2tbMV0gaGVyZSwgc2luY2Ugc29jazAoKSBpcyBzdXBwb3NlZCB0byBiZSBjbG9zZWQKKyAgICAgICAgLy8gYnkgdGhlIHRlc3QuCisgICAgICAgIHNvY2tldENsb3NlKHNvY2tbMV0pOworICAgIH0KKworICAgIGludCBzb2NrMCgpIGNvbnN0IHsgcmV0dXJuIHNvY2tbMF07IH0KKworICAgIGJvb2wgdHJ5V3JpdGUoKSB7CisgICAgICAgIGNoYXIgYyA9ICdcMCc7CisgICAgICAgIHJldHVybiBzb2NrZXRTZW5kKHNvY2tbMF0sICZjLCAxKSA9PSAxOworICAgIH0KKworICAgIGJvb2wgdHJ5UmVhZCgpIHsKKyAgICAgICAgY2hhciBjID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIHNvY2tldFJlY3Yoc29ja1sxXSwgJmMsIDEpID09IDE7CisgICAgfQorCitwcml2YXRlOgorICAgIGludCBzb2NrWzJdOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU2NvcGVkU29ja2V0V2F0Y2gsIENvbnN0cnVjdGlvbkFuZERlc3RydWN0aW9uKSB7CisgICAgRGF0YSBkYXRhOworICAgIGludCBzb2NrMCA9IGRhdGEuc29jazAoKTsKKworICAgIHsKKyAgICAgICAgU2NvcGVkU29ja2V0V2F0Y2ggcyhUaHJlYWRMb29wZXI6OmdldCgpLT5jcmVhdGVGZFdhdGNoKAorICAgICAgICAgICAgICAgIHNvY2swLCBudWxscHRyLCBudWxscHRyKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHMuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShkYXRhLnRyeVdyaXRlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShkYXRhLnRyeVJlYWQoKSk7CisgICAgICAgIC8vIEV4aXRpbmcgdGhlIHNjb3BlIHdpbGwgY2xvc2UgdGhlIHNvY2tldC4KKyAgICB9CisKKyAgICAvLyBUaGUgc29ja2V0IGlzIG5vdyBpbnZhbGlkLCB3cml0aW5nIHNob3VsZCBmYWlsIHdpdGggRUlOVkFMLgorICAgIEVYUEVDVF9GQUxTRShkYXRhLnRyeVdyaXRlKCkpOworICAgIEVYUEVDVF9GQUxTRShkYXRhLnRyeVJlYWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvU3Vic2NyaWJlckxpc3QuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1N1YnNjcmliZXJMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyMmFkNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1N1YnNjcmliZXJMaXN0LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQW55IG9iamVjdCB0aGF0IGludGVuZHMgdG8gbm90aWZ5IGNlcnRhaW4gc3Vic2NyaWJlcnMgb24gdGhlIGV2ZW50IGxvb3AgY2FuCisvLyB1c2UgdGhlIFN1YnNjcmliZXJMaXN0IHRvIGtlZXAgdHJhY2sgb2YgYWxsIGFjdGl2ZSBjbGllbnRzLiBUaGUgY2xpZW50cyBpbgorLy8gdHVybiwgbXVzdCBrZWVwIHRoZSByZXR1cm5lZCBTdWJzY3JpcHRpb25Ub2tlbiBhbGl2ZSBmb3IgYXMgbG9uZyBhcyB0aGV5IHdhbnQKKy8vIHRvIGJlIG5vdGlmaWVkIG9mIHVwZGF0ZXMuCisvLworLy8gT25jZSBhIFN1YnNjcmlwdGlvblRva2VuIGlzIGRlc3Ryb3llZCwgdGhlIFN1YnNjcmlwdGlvbkxpc3QgcmVtb3ZlcyB0aGF0CisvLyBjbGllbnQgZnJvbSBmdXR1cmUgbm90aWZpY2F0aW9ucy4KKy8vIElmIHRoZSBTdWJzY3JpcHRpb25MaXN0IGlzIGRlc3Ryb3llZCB3aGlsZSBzb21lIHRva2VucyBhcmUgc3RpbGwgYWN0aXZlLAorLy8gZGVzdHJ5b25nIHRoZW0gbm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LgorLy8KKy8vIFNlZSBTdWJzY3JpYmVyTGlzdF91bml0dGVzdC5jcHAgLS0gVGVzdFN1YnNjcmlwdGlvbiBhbmQgVGVzdENsaWVudCAtLSBmb3IgYW4KKy8vIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGlzLgorLy8KKy8vIFRoZXNlIG9iamVjdHMgYXJlIG5vdCB0aHJlYWQgc2FmZS4gVGhlc2Ugb3BlcmF0aW9ucyBNVVNUIGJlIGRvbmUgb24gdGhlIHNhbWUKKy8vIHRocmVhZDoKKy8vIC0gfGluc2VydHwgLyB8ZW1wbGFjZXwgbmV3IHN1YnNjcmlwdGlvbnMuCisvLyAtIERlc3Ryb3kgYSByZXR1cm5lZCBTdWJzY3JpcHRpb25Ub2tlbi4KKy8vIC0gRGVzdHJveSB0aGUgU3Vic2NyaWJlckxpc3QuCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8gSGVscGVyIGNsYXNzIHRoYXQgc3RvcmVzIGEgY2FsbGFibGUgb2JqZWN0IGFuZCBpbnZva2VzIGl0IHVwb24gZGVzdHJ1Y3Rpb24KKy8vICh1bmxlc3MgaW52YWxpZGF0ZSgpIGhhcyBiZWVuIGNhbGxlZCkuCitjbGFzcyBTdWJzY3JpcHRpb25Ub2tlbkltcGwgeworcHVibGljOgorICAgIHVzaW5nIENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKCk+OworCisgICAgZXhwbGljaXQgU3Vic2NyaXB0aW9uVG9rZW5JbXBsKGNvbnN0IENhbGxiYWNrJiBjYikgOiBtQ2IoY2IpIHt9CisKKyAgICB+U3Vic2NyaXB0aW9uVG9rZW5JbXBsKCkgeworICAgICAgICBpZiAobUNiKQorICAgICAgICAgICAgbUNiKCk7CisgICAgfQorCisgICAgLy8gSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RvcmVkIGNhbGxhYmxlIG9iamVjdAorICAgIC8vIHdpbGwgbm90IGJlIGludm9rZWQgdXBvbiBkZXN0cnVjdGlvbi4KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7IG1DYiA9IENhbGxiYWNrKCk7IH0KKworcHJpdmF0ZToKKyAgICBDYWxsYmFjayBtQ2I7CisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoU3Vic2NyaXB0aW9uVG9rZW5JbXBsKTsKK307Cit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKwordXNpbmcgU3Vic2NyaXB0aW9uVG9rZW4gPSBzdGQ6OnVuaXF1ZV9wdHI8aW50ZXJuYWw6OlN1YnNjcmlwdGlvblRva2VuSW1wbD47CisKK3RlbXBsYXRlIDxjbGFzcyBTdWJzY3JpYmVySW5mbz4KK2NsYXNzIFN1YnNjcmliZXJMaXN0IHsKK3ByaXZhdGU6CisgICAgLy8gRE8gTk9UIENIQU5HRSBUTyBzdGQ6OnZlY3RvciAob3IgYW55IG90aGVyIHR5cGUgb2YgY29udGFpbmVyCisgICAgLy8gdGhhdCBpbnZhbGlkYXRlcyBpdGVyYXRvcnMgb24gcmVtb3ZhbCkhCisgICAgLy8gQSBsaXN0IG9mIG9iamVjdHMgdGhhdCBvdXIgY2xpZW50cyBjYXJlIGFib3V0LgorICAgIHVzaW5nIFN1YnNjcmliZXJJbmZvTGlzdCA9IHN0ZDo6bGlzdDxTdWJzY3JpYmVySW5mbz47CisgICAgdXNpbmcgU3Vic2NyaWJlckluZm9JdGVyYXRvciA9IHR5cGVuYW1lIFN1YnNjcmliZXJJbmZvTGlzdDo6aXRlcmF0b3I7CisgICAgLy8gQSBsaXN0IGZvciBpbnRlcm5hbCBib29ra2VlcGluZy4KKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludGVybmFsOjpTdWJzY3JpcHRpb25Ub2tlbkltcGwqIHRva2VuOworICAgICAgICBTdWJzY3JpYmVySW5mb0l0ZXJhdG9yIGluZm9JdGVyYXRvcjsKKyAgICB9IE1ldGFEYXRhOworICAgIHVzaW5nIE1ldGFEYXRhTGlzdCA9IHN0ZDo6bGlzdDxNZXRhRGF0YT47CisgICAgdXNpbmcgTWV0YURhdGFMaXN0SXRlcmF0b3IgPSB0eXBlbmFtZSBNZXRhRGF0YUxpc3Q6Oml0ZXJhdG9yOworCitwdWJsaWM6CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBTdWJzY3JpYmVySW5mb0xpc3Q6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgU3Vic2NyaWJlckxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICBTdWJzY3JpcHRpb25Ub2tlbiBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICAgIG1TdWJzY3JpYmVySW5mb3MuZW1wbGFjZV9iYWNrKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgICAgIHJldHVybiBpbnNlcnRJbnRlcm5hbChzdGQ6OnByZXYobVN1YnNjcmliZXJJbmZvcy5lbmQoKSkpOworICAgIH0KKworICAgIFN1YnNjcmlwdGlvblRva2VuIGluc2VydChTdWJzY3JpYmVySW5mbyYmIGluZm8pIHsKKyAgICAgICAgbVN1YnNjcmliZXJJbmZvcy5wdXNoX2JhY2soc3RkOjptb3ZlKGluZm8pKTsKKyAgICAgICAgcmV0dXJuIGluc2VydEludGVybmFsKHN0ZDo6cHJldihtU3Vic2NyaWJlckluZm9zLmVuZCgpKSk7CisgICAgfQorCisgICAgU3Vic2NyaXB0aW9uVG9rZW4gaW5zZXJ0KGNvbnN0IFN1YnNjcmliZXJJbmZvJiBpbmZvKSB7CisgICAgICAgIG1TdWJzY3JpYmVySW5mb3MucHVzaF9iYWNrKGluZm8pOworICAgICAgICByZXR1cm4gaW5zZXJ0SW50ZXJuYWwoc3RkOjpwcmV2KG1TdWJzY3JpYmVySW5mb3MuZW5kKCkpKTsKKyAgICB9CisKKyAgICAvLyBZb3VyIGdhdGV3YXkgdG8gdGhlIHN1YnNjcmliZXJzLgorICAgIC8vIFRoZXNlIGl0ZXJhdG9ycyBjYW4gYmUgaW52YWxpZGF0ZWQgYXMgc3Vic2NyaWJlcnMgYXJlIGRlc3Ryb3llZC4gRG8gbm90CisgICAgLy8gY2FwdHVyZSB0aGUgaXRlcmF0b3JzIGZvciBhc3luY2hyb25vdXMgdXNlLgorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbVN1YnNjcmliZXJJbmZvcy5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbVN1YnNjcmliZXJJbmZvcy5lbmQoKTsgfQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbVN1YnNjcmliZXJJbmZvcy5zaXplKCk7IH0KKworICAgIH5TdWJzY3JpYmVyTGlzdCgpIHsKKyAgICAgICAgLy8gSW52YWxpZGF0ZSBhbGwgdGhlIHRva2VucyBkaXNwZW5zZWQgYnkgdGhpcyBpbnN0YW5jZS4gIEZhaWxpbmcgdG8gZG8KKyAgICAgICAgLy8gdGhhdCB3b3VsZCBjYXVzZSB0aGUgdG9rZW5zIHRvIHRyeSBhbmQgY2FsbCBpbnRvIHRoaXMgaW5zdGFuY2UgdXBvbgorICAgICAgICAvLyBkZXN0cnVjdGlvbiwgcmVzdWx0aW5nIGluIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdWJzY3JpYmVyIDogbU1ldGFEYXRhKSB7CisgICAgICAgICAgICAvLyBObyB3YXkgdGhlIHRva2VuIGNhbiBiZSBOVUxMLgorICAgICAgICAgICAgYXNzZXJ0KHN1YnNjcmliZXIudG9rZW4pOworICAgICAgICAgICAgc3Vic2NyaWJlci50b2tlbi0+aW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgdW5zdWJzY3JpYmUoTWV0YURhdGFMaXN0SXRlcmF0b3IgaXRlcmF0b3IpIHsKKyAgICAgICAgbVN1YnNjcmliZXJJbmZvcy5lcmFzZShpdGVyYXRvci0+aW5mb0l0ZXJhdG9yKTsKKyAgICAgICAgbU1ldGFEYXRhLmVyYXNlKGl0ZXJhdG9yKTsKKyAgICB9CisKKyAgICBTdWJzY3JpcHRpb25Ub2tlbiBpbnNlcnRJbnRlcm5hbChTdWJzY3JpYmVySW5mb0l0ZXJhdG9yIGluZm9JdGVyYXRvcikgeworICAgICAgICAvLyBBZGQgYW4gZW50cnkgd2l0aCBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHN1YnNjcmliZXIgYm9vay1rZWVwaW5nLgorICAgICAgICBtTWV0YURhdGEuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF1dG8gZGF0dW0gPSBzdGQ6OnByZXYobU1ldGFEYXRhLmVuZCgpKTsKKyAgICAgICAgZGF0dW0tPmluZm9JdGVyYXRvciA9IGluZm9JdGVyYXRvcjsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdG9rZW4gdGhhdCBjYWxscyB8dW5zdWJzY3JpYmV8IHVwb24gZGVzdHJ1Y3Rpb24uCisgICAgICAgIFN1YnNjcmlwdGlvblRva2VuIHRva2VuKG5ldyBpbnRlcm5hbDo6U3Vic2NyaXB0aW9uVG9rZW5JbXBsKAorICAgICAgICAgICAgICAgIFt0aGlzLCBkYXR1bV0geyB0aGlzLT51bnN1YnNjcmliZShkYXR1bSk7IH0pKTsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhpcyBpbnN0YW5jZSBjYW4gaW52YWxpZGF0ZSB0aGUgdG9rZW4uCisgICAgICAgIGRhdHVtLT50b2tlbiA9IHRva2VuLmdldCgpOworCisgICAgICAgIC8vIEdpdmUgdGhlIHRva2VuIHRvIHRoZSBzdWJzY3JpYmVyLgorICAgICAgICAvLyBUaGUgdG9rZW4gd2lsbCByZW1haW4gYWxpdmUgZm9yIGFzIGxvbmcgYXMgdGhlIHN1YnNjcmliZXIgdGhhdCBpcworICAgICAgICAvLyBob2xkaW5nIG9uIHRvIGl0IGlzIGFsaXZlLgorICAgICAgICAvLyBJZiB0aGUgdG9rZW4gaXMgZGVzdHJveWVkIGJlZm9yZSB0aGUgU3Vic2NyaXB0aW9uTGlzdCBpcyBkZXN0cm95ZWQsCisgICAgICAgIC8vIGl0IHdpbGwgbm90aWZ5IHVzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc3Vic2NyaWJlciBlbnRyeSB3aWxsIGJlCisgICAgICAgIC8vIHJlbW92ZWQuCisgICAgICAgIC8vIFdoZW4gdGhlIFN1YnNjcmlwdGlvbkxpc3QgaXMgZGVzdHJveWVkLCBpdCB3aWxsIGdvIHRocm91Z2ggYWxsIHRoZQorICAgICAgICAvLyByZW1haW5pbmcgc3Vic2NyaWJlciBlbnRyaWVzIGFuZCBpbnZhbGlkYXRlIHRoZWlyIHRva2Vucywgc28gdGhhdAorICAgICAgICAvLyB0aGV5IGRvbid0IHRyeSBub3RpZnlpbmcgdGhlICJkZWFkIiBTdWJzY3JpcHRpb25MaXN0LgorICAgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorCisgICAgU3Vic2NyaWJlckluZm9MaXN0IG1TdWJzY3JpYmVySW5mb3M7CisgICAgTWV0YURhdGFMaXN0IG1NZXRhRGF0YTsKKworICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKFN1YnNjcmliZXJMaXN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvU3Vic2NyaWJlckxpc3RfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvU3Vic2NyaWJlckxpc3RfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTk1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9TdWJzY3JpYmVyTGlzdF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvU3Vic2NyaWJlckxpc3QuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN1YnNjcmliZXJMaXN0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3Vic2NyaXB0aW9uVG9rZW47Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK25hbWVzcGFjZSB7CisvLyBFdmVyeXRoaW5nIGlzIHB1YmxpYy4gTGlmZSBpcyBlYXN5LgorY2xhc3MgVGVzdENsaWVudCB7CitwdWJsaWM6CisgICAgdm9pZCBub3RpZnkoKSB7ICsrbUNhbGxzOyB9CisgICAgaW50IG1DYWxscyA9IDA7Cit9OworCitjbGFzcyBUZXN0RmVlZCB7CitwdWJsaWM6CisgICAgLy8gVGhpcyBzdHJ1Y3QgaXMgcHVyZWx5IGluc3RydWN0aW9uYWwuCisgICAgc3RydWN0IFN1YnNjcmliZXJJbmZvIHsKKyAgICAgICAgVGVzdENsaWVudCogY2xpZW50OworICAgICAgICBTdWJzY3JpYmVySW5mbyhUZXN0Q2xpZW50KiBjKSA6IGNsaWVudChjKSB7fQorICAgIH07CisKKyAgICB1c2luZyBTdWJzY3JpYmVyTGlzdCA9IGFuZHJvaWQ6OmJhc2U6OlN1YnNjcmliZXJMaXN0PFN1YnNjcmliZXJJbmZvPjsKKworICAgIFN1YnNjcmlwdGlvblRva2VuIHN1YnNjcmliZShUZXN0Q2xpZW50KiBjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIG1TdWJzY3JpYmVycy5lbXBsYWNlKGNsaWVudCk7CisgICAgfQorCisgICAgU3Vic2NyaXB0aW9uVG9rZW4gc3Vic2NyaWJlVmlhSW5zZXJ0KFRlc3RDbGllbnQqIGNsaWVudCkgeworICAgICAgICBTdWJzY3JpYmVySW5mbyBpbmZvKGNsaWVudCk7CisgICAgICAgIHJldHVybiBtU3Vic2NyaWJlcnMuaW5zZXJ0KGluZm8pOworICAgIH0KKworICAgIHZvaWQgbm90aWZ5QWxsKCkgeworICAgICAgICBmb3IgKGF1dG8mIHN1YnNjcmliZXIgOiBtU3Vic2NyaWJlcnMpIHsKKyAgICAgICAgICAgIHN1YnNjcmliZXIuY2xpZW50LT5ub3RpZnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN1YnNjcmliZXJMaXN0IG1TdWJzY3JpYmVyczsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChTdWJzY3JpYmVyTGlzdCwgaW5zZXJ0KSB7CisgICAgVGVzdENsaWVudCBjbGllbnQ7CisgICAgVGVzdEZlZWQgZmVlZDsKKworICAgIGF1dG8gdG9rZW4gPSBmZWVkLnN1YnNjcmliZVZpYUluc2VydCgmY2xpZW50KTsKKyAgICBmZWVkLm5vdGlmeUFsbCgpOworICAgIEVYUEVDVF9FUSgxLCBjbGllbnQubUNhbGxzKTsKKyAgICBmZWVkLm5vdGlmeUFsbCgpOworICAgIEVYUEVDVF9FUSgyLCBjbGllbnQubUNhbGxzKTsKKworICAgIHRva2VuLnJlc2V0KCk7CisgICAgZmVlZC5ub3RpZnlBbGwoKTsKKyAgICBFWFBFQ1RfRVEoMiwgY2xpZW50Lm1DYWxscyk7Cit9CisKK1RFU1QoU3Vic2NyaWJlckxpc3QsIGVtcGxhY2UpIHsKKyAgICBUZXN0Q2xpZW50IGNsaWVudDsKKyAgICBUZXN0RmVlZCBmZWVkOworCisgICAgYXV0byB0b2tlbiA9IGZlZWQuc3Vic2NyaWJlKCZjbGllbnQpOworICAgIGZlZWQubm90aWZ5QWxsKCk7CisgICAgRVhQRUNUX0VRKDEsIGNsaWVudC5tQ2FsbHMpOworICAgIGZlZWQubm90aWZ5QWxsKCk7CisgICAgRVhQRUNUX0VRKDIsIGNsaWVudC5tQ2FsbHMpOworCisgICAgdG9rZW4ucmVzZXQoKTsKKyAgICBmZWVkLm5vdGlmeUFsbCgpOworICAgIEVYUEVDVF9FUSgyLCBjbGllbnQubUNhbGxzKTsKK30KKworVEVTVChTdWJzY3JpYmVyTGlzdCwgZGVhZExpc3QpIHsKKyAgICBUZXN0Q2xpZW50IGNsaWVudDEsIGNsaWVudDI7CisgICAgdW5pcXVlX3B0cjxUZXN0RmVlZD4gZmVlZChuZXcgVGVzdEZlZWQoKSk7CisKKyAgICBhdXRvIHRva2VuMSA9IGZlZWQtPnN1YnNjcmliZSgmY2xpZW50MSk7CisgICAgYXV0byB0b2tlbjIgPSBmZWVkLT5zdWJzY3JpYmUoJmNsaWVudDIpOworCisgICAgZmVlZC0+bm90aWZ5QWxsKCk7CisgICAgRVhQRUNUX0VRKDEsIGNsaWVudDEubUNhbGxzKTsKKyAgICBFWFBFQ1RfRVEoMSwgY2xpZW50Mi5tQ2FsbHMpOworICAgIHRva2VuMS5yZXNldCgpOworICAgIGZlZWQtPm5vdGlmeUFsbCgpOworICAgIEVYUEVDVF9FUSgxLCBjbGllbnQxLm1DYWxscyk7CisgICAgRVhQRUNUX0VRKDIsIGNsaWVudDIubUNhbGxzKTsKKworICAgIGZlZWQucmVzZXQoKTsKKyAgICAvLyBUaGlzIF9tYXlfIGNyYXNoIGlmIG91ciBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGludmFsaWRhdGUgdG9rZW5zCisgICAgLy8gcHJvcGVybHkuIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXNuJ3QgYSB3YXkgdG8gbWFrZSB0aGlzIGNyYXNoIGV2ZXJ5IHRpbWUuCisgICAgdG9rZW4yLnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDM2ZmRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmNwcApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgU3RhdGUgeworcHVibGljOgorICAgIFN0YXRlKExvb3BlciogbG9vcGVyLCBib29sIG93bmVkKSA6IG1Mb29wZXIobG9vcGVyKSwgbU93bmVkKG93bmVkKSB7fQorCisgICAgflN0YXRlKCkgeworICAgICAgICBpZiAobU93bmVkKSB7CisgICAgICAgICAgICBkZWxldGUgbUxvb3BlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIExvb3BlciogbG9vcGVyKCkgY29uc3QgeyByZXR1cm4gbUxvb3BlcjsgfQorCitwcml2YXRlOgorICAgIExvb3BlciogbUxvb3BlcjsKKyAgICBib29sIG1Pd25lZDsKK307CisKK2NsYXNzIFRocmVhZExvb3BlclN0b3JlIDogcHVibGljIFRocmVhZFN0b3JlPFN0YXRlPiB7CitwdWJsaWM6CisgICAgYm9vbCBoYXNMb29wZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUaHJlYWRTdG9yZUJhc2U6OmdldCgpICE9IE5VTEw7CisgICAgfQorCisgICAgdm9pZCBzZXRMb29wZXIoTG9vcGVyKiBsb29wZXIsIGJvb2wgb3duKSB7CisgICAgICAgIENIRUNLKCFnZXQoKSk7CisgICAgICAgIFN0YXRlKiBzdGF0ZSA9IG5ldyBTdGF0ZShsb29wZXIsIG93bik7CisgICAgICAgIHNldChzdGF0ZSk7CisgICAgfQorCisgICAgTG9vcGVyKiBnZXRMb29wZXIoKSB7CisgICAgICAgIFN0YXRlKiBzdGF0ZSA9IGdldCgpOworICAgICAgICBpZiAoIXN0YXRlKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBnZW5lcmljIGxvb3BlciBpZiBub25lIGV4aXN0cy4KKyAgICAgICAgICAgIExvb3BlciogbG9vcGVyID0gTG9vcGVyOjpjcmVhdGUoKTsKKyAgICAgICAgICAgIHN0YXRlID0gbmV3IFN0YXRlKGxvb3BlciwgdHJ1ZSk7CisgICAgICAgICAgICBzZXQoc3RhdGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0ZS0+bG9vcGVyKCk7CisgICAgfQorfTsKKworc3RhdGljIExhenlJbnN0YW5jZTxUaHJlYWRMb29wZXJTdG9yZT4gc1N0b3JlID0gTEFaWV9JTlNUQU5DRV9JTklUOworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitMb29wZXIqIFRocmVhZExvb3Blcjo6Z2V0KCkgeworICAgIHJldHVybiBzU3RvcmUtPmdldExvb3BlcigpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgVGhyZWFkTG9vcGVyOjpzZXRMb29wZXIoTG9vcGVyKiBsb29wZXIsIGJvb2wgb3duKSB7CisgICAgLy8gU2FuaXR5IGNoZWNrcworICAgIENIRUNLKGxvb3BlcikgPDwgIk5VTEwgbG9vcGVyISI7CisKKyAgICBDSEVDSyghc1N0b3JlLmhhc0luc3RhbmNlKCkgfHwgIXNTdG9yZS0+aGFzTG9vcGVyKCkpCisgICAgICAgICAgICA8PCAiVGhyZWFkTG9vcGVyOjpnZXQoKSBhbHJlYWR5IGNhbGxlZCBmb3IgY3VycmVudCB0aHJlYWQhIjsKKworICAgIHNTdG9yZS0+c2V0TG9vcGVyKGxvb3Blciwgb3duKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzZjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQ29udmVuaWVuY2UgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgcGVyLXRocmVhZCBMb29wZXIgaW5zdGFuY2VzLgorLy8gVGhpcyBhbGxvd3Mgb25lIHRvIGNhbGwgVGhyZWFkTG9vcGVyOjpnZXQoKSBmcm9tIGFueSBwbGFjZSB0byByZXRyaWV2ZQorLy8gYSB0aHJlYWQtbG9jYWwgTG9vcGVyIGluc3RhbmNlLgorY2xhc3MgVGhyZWFkTG9vcGVyIHsKK3B1YmxpYzoKKyAgICAvLyBSZXRyaWV2ZSB0aGUgY3VycmVudCB0aHJlYWQncyBMb29wZXIgaW5zdGFuY2UuCisgICAgLy8KKyAgICAvLyBJZiBzZXRMb29wZXIoKSB3YXMgY2FsbGVkIHByZXZpb3VzbHkgb24gdGhpcyB0aHJlYWQsIHJldHVybiB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIHZhbHVlLiBPdGhlcndpc2UsIG9uIGZpcnN0IGNhbGwsIHVzZSBMb29wZXI6Y3JlYXRlKCkKKyAgICAvLyBhbmQgc3RvcmUgdGhlIG5ldyBpbnN0c2FuY2UgaW4gdGhyZWFkLWxvY2FsIHN0b3JhZ2UuIE5vdGUgdGhhdCB0aGlzCisgICAgLy8gbmV3IGluc3RhbmNlIHdpbGwgYmUgZnJlZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSB0aHJlYWQgZXhpdHMuCisgICAgc3RhdGljIExvb3BlciogZ2V0KCk7CisKKyAgICAvLyBTZXRzIHRoZSBsb29wZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGdldCgpCisgICAgLy8gZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gfGxvb3BlcnwgaXMgYSBMb29wZXIgaW5zdGFuY2UgdGhhdCBjYW5ub3QgYmUKKyAgICAvLyBOVUxMLCBhbmQgd2lsbCBiZSByZXR1cm5lZCBieSBmdXR1cmUgY2FsbHMgdG8gZ2V0KCkuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgfGxvb3Blcnwgd2lsbCBiZSBzdG9yZWQgaW4gdGhyZWFkLWxvY2FsIHN0b3JhZ2UgYnV0IHdpbGwKKyAgICAvLyBub3QgYmUgZGVzdHJveWVkIHdoZW4gdGhlIHRocmVhZCBleGl0cyAodW5sZXNzIHxvd258IGlzIHRydWUpLgorICAgIHN0YXRpYyB2b2lkIHNldExvb3BlcihMb29wZXIqIGxvb3BlciwgYm9vbCBvd24gPSBmYWxzZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvQ2lyY3VsYXJCdWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvQ2lyY3VsYXJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM4MTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9DaXJjdWxhckJ1ZmZlci5oCkBAIC0wLDAgKzEsMTQxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgQ2lyY3VsYXJCdWZmZXI8VD4gaXMgYSB3cmFwcGVyIG92ZXIgc3RkOjp2ZWN0b3I8VD4gb2YgZml4ZWQgc2l6ZQorLy8gdGhhdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorLy8gMS4gT25seSBhbGxvd3MgYWRkaW5nIG5ldyBlbGVtZW50cyB2aWEgfHB1c2hfYmFja3wKKy8vIDIuIEl0ZW1zIGNhbiBiZSByZW1vdmVkIGVpdGhlciBmcm9tIHRoZSBmcm9udCBvciBmcm9tIHRoZSBiYWNrLgorLy8gMy4gV2hlbiBhdCBtYXhpbXVtIGNhcGFjaXR5LCB0aGUgb2xkZXN0IGVsZW1lbnQgaXMgcmVtb3ZlZCB0byBtYWtlCisvLyAgICBzcGFjZSBmb3IgdGhlIG5ldyBvbmUuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IHN0ZDo6YWxsb2NhdG9yPFQ+PgorY2xhc3MgQ2lyY3VsYXJCdWZmZXIgeworcHVibGljOgorICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGNpcmN1bGFyIGJ1ZmZlciB3aXRoIHRoZSBnaXZlbiB8Y2FwYWNpdHl8LgorICAgIGV4cGxpY2l0IENpcmN1bGFyQnVmZmVyKGludCBjYXBhY2l0eSkgOgorICAgICAgICBtQnVmKGNhcGFjaXR5KSwgbVNpemUoMCksIG1Gcm9udElkeCgwKSwgbUJhY2tJZHgoMCkgeworICAgICAgICBhc3NlcnQoY2FwYWNpdHkgPiAwKTsKKyAgICB9CisKKyAgICAvLyBBZGRzIGEgbmV3IGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLiBJZiB0aGUgY29udGFpbmVyCisgICAgLy8gaXMgYXQgbWF4aW11bSBjYXBhY2l0eSwgdGhlIG9sZGVzdCBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCB0byBtYWtlCisgICAgLy8gc3BhY2UgZm9yIHRoZSBuZXcgb25lLgorICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8VSwgVD46OnZhbHVlPjo6dHlwZQorICAgIHB1c2hfYmFjayhVJiYgdmFsdWUpIHsKKyAgICAgICAgbUJ1ZlttQmFja0lkeF0gPSBzdGQ6OmZvcndhcmQ8VT4odmFsdWUpOworICAgICAgICBpbmNyZW1lbnRCYWNrSWR4KCk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgorICAgIC8vIFVuZGVmaW5lZCBiZWhhdmlvciBpZiBjYWxsZWQgb24gYW4gZW1wdHkgY29udGFpbmVyLgorICAgIFQmIGZyb250KCkgeworICAgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgICByZXR1cm4gbUJ1ZlttRnJvbnRJZHhdOworICAgIH0KKworICAgIC8vIFNhbWUgYXMgYWJvdmUsIGNvbnN0IHZlcnNpb24uCisgICAgY29uc3QgVCYgZnJvbnQoKSBjb25zdCB7CisgICAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICAgIHJldHVybiBtQnVmW21Gcm9udElkeF07CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuCisgICAgLy8gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGNhbGxlZCBvbiBhbiBlbXB0eSBjb250YWluZXIuCisgICAgVCYgYmFjaygpIHsKKyAgICAgICAgYXNzZXJ0KCFlbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuIG1CdWZbKG1Gcm9udElkeCArIG1TaXplIC0gMSkgJSBtQnVmLnNpemUoKV07CisgICAgfQorCisgICAgLy8gU2FtZSBhcyBhYm92ZSwgY29uc3QgdmVyc2lvbi4KKyAgICBjb25zdCBUJiBiYWNrKCkgY29uc3QgeworICAgICAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgICAgICByZXR1cm4gbUJ1ZlsobUZyb250SWR4ICsgbVNpemUgLSAxKSAlIG1CdWYuc2l6ZSgpXTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmVzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXIuCisgICAgLy8gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGNhbGxlZCBvbiBhbiBlbXB0eSBjb250YWluZXIuCisgICAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICAgIG1TaXplLS07CisgICAgICAgIG1Gcm9udElkeCA9IChtRnJvbnRJZHggKyAxKSAlIG1CdWYuc2l6ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyLgorICAgIC8vIFVuZGVmaW5lZCBiZWhhdmlvciBpZiBjYWxsZWQgb24gYW4gZW1wdHkgY29udGFpbmVyLgorICAgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICAgIG1TaXplLS07CisgICAgICAgIG1CYWNrSWR4IC09IDE7CisgICAgICAgIGlmIChtQmFja0lkeCA8IDApIG1CYWNrSWR4ID0gbUJ1Zi5zaXplKCkgLSAxOworICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGFpbmVyIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplID09IDA7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIKKyAgICBpbnQgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIC8vIEdldCBhIHNwZWNpZmljIGVsZW1lbnQgZnJvbSB0aGUgYnVmZmVyLgorICAgIC8vIHxpZHh8IG11c3QgYmUgYmV0d2VlbiAwIGFuZCB8c2l6ZXwuCisgICAgVCYgb3BlcmF0b3JbXShpbnQgaWR4KSB7CisgICAgICAgIHJldHVybiBtQnVmWyhtRnJvbnRJZHggKyBpZHgpICUgbUJ1Zi5zaXplKCldOworICAgIH0KKworICAgIC8vIFNhbWUgYXMgYWJvdmUsIGNvbnN0IHZlcnNpb24uCisgICAgY29uc3QgVCYgb3BlcmF0b3JbXShpbnQgaWR4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQnVmWyhtRnJvbnRJZHggKyBpZHgpICUgbUJ1Zi5zaXplKCldOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluY3JlbWVudEJhY2tJZHgoKSB7CisgICAgICAgIGlmIChtU2l6ZSA8IG1CdWYuc2l6ZSgpKSB7CisgICAgICAgICAgICBtU2l6ZSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAvLyBCdWZmZXIgaXMgYXQgZnVsbCBjYXBhY2l0eSwgZXJhc2UgZmlyc3QKKyAgICAgICAgICAgLy8gZWxlbWVudC4KKyAgICAgICAgICAgbUZyb250SWR4ID0gKG1Gcm9udElkeCArIDEpICUgbUJ1Zi5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgbUJhY2tJZHggPSAobUJhY2tJZHggKyAxKSAlIG1CdWYuc2l6ZSgpOworICAgIH0KKworICAgIC8vIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhLgorICAgIHN0ZDo6dmVjdG9yPFQsIEE+IG1CdWY7CisKKyAgICAvLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAgICBpbnQgbVNpemU7CisKKyAgICAvLyBJbmRleCwgYXQgd2hpY2ggdGhlIGZpcnN0IChvbGRlc3QpIGVsZW1lbnQgb2YKKyAgICAvLyB0aGUgY2lyY3VsYXIgYnVmZmVyIGlzIHN0b3JlZCBpbiBtQnVmLgorICAgIGludCBtRnJvbnRJZHg7CisKKyAgICAvLyBJbmRleCBhdCB3aGljaCB0aGUgbmV4dCBlbGVtZW50IHdpbGwgYmUgcGxhY2VkCisgICAgLy8gaW4gbUJ1Zi4KKyAgICBpbnQgbUJhY2tJZHg7Cit9OworCit9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL0NpcmN1bGFyQnVmZmVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvQ2lyY3VsYXJCdWZmZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYWYyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL0NpcmN1bGFyQnVmZmVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9DaXJjdWxhckJ1ZmZlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChDaXJjdWxhckJ1ZmZlciwgRW1wdHkpIHsKKyAgICBDaXJjdWxhckJ1ZmZlcjxpbnQ+IGNiKDEpOworICAgIEVYUEVDVF9UUlVFKGNiLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwLCBjYi5zaXplKCkpOworfQorCitURVNUKENpcmN1bGFyQnVmZmVyLCBBcHBlbmRPbmNlKSB7CisgICAgQ2lyY3VsYXJCdWZmZXI8aW50PiBjYigxKTsKKyAgICBjYi5wdXNoX2JhY2soMTAwOTgpOworICAgIEVYUEVDVF9GQUxTRShjYi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgY2Iuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMTAwOTgsIGNiWzBdKTsKKyAgICBFWFBFQ1RfRVEoMTAwOTgsIGNiLmZyb250KCkpOworICAgIEVYUEVDVF9FUSgxMDA5OCwgY2IuYmFjaygpKTsKK30KKworVEVTVChDaXJjdWxhckJ1ZmZlciwgQXBwZW5kVHdpY2UpIHsKKyAgICBDaXJjdWxhckJ1ZmZlcjxpbnQ+IGNiKDEpOworICAgIGNiLnB1c2hfYmFjaygxMDA5OCk7CisgICAgRVhQRUNUX0ZBTFNFKGNiLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgxLCBjYi5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxMDA5OCwgY2JbMF0pOworICAgIGNiLnB1c2hfYmFjaygxMDA5OSk7CisgICAgRVhQRUNUX0ZBTFNFKGNiLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgxLCBjYi5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxMDA5OSwgY2JbMF0pOworfQorCitURVNUKENpcmN1bGFyQnVmZmVyLCBNYW55SXRlbXNTaW1wbGUpIHsKKyAgICBDaXJjdWxhckJ1ZmZlcjxpbnQ+IGNiKDUpOworICAgIGNiLnB1c2hfYmFjaygxKTsKKyAgICBjYi5wdXNoX2JhY2soMik7CisgICAgY2IucHVzaF9iYWNrKDMpOworICAgIEVYUEVDVF9FUSgxLCBjYi5mcm9udCgpKTsKKyAgICBFWFBFQ1RfRVEoMywgY2IuYmFjaygpKTsKKyAgICBFWFBFQ1RfRVEoMywgY2Iuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgY2JbMF0pOworICAgIEVYUEVDVF9FUSgyLCBjYlsxXSk7CisgICAgRVhQRUNUX0VRKDMsIGNiWzJdKTsKK30KKworVEVTVChDaXJjdWxhckJ1ZmZlciwgTWFueUl0ZW1zKSB7CisgICAgQ2lyY3VsYXJCdWZmZXI8aW50PiBjYig1KTsKKyAgICBjYi5wdXNoX2JhY2soMSk7CisgICAgY2IucHVzaF9iYWNrKDIpOworICAgIGNiLnB1c2hfYmFjaygzKTsKKyAgICBjYi5wdXNoX2JhY2soNCk7CisgICAgY2IucHVzaF9iYWNrKDUpOworICAgIGNiLnB1c2hfYmFjayg2KTsKKyAgICBjYi5wdXNoX2JhY2soNyk7CisKKworICAgIEVYUEVDVF9GQUxTRShjYi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgY2Iuc2l6ZSgpKTsKKworICAgIGludCBleHBlY3RlZF92YWx1ZXNbXSA9IHszLCA0LCA1LCA2LCA3fTsKKyAgICBFWFBFQ1RfRVEoMywgY2IuZnJvbnQoKSk7CisgICAgRVhQRUNUX0VRKDcsIGNiLmJhY2soKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYi5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdmFsdWVzW2ldLCBjYltpXSk7CisgICAgfQorCisgICAgY2IucG9wX2JhY2soKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNiLnNpemUoKTsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF92YWx1ZXNbaV0sIGNiW2ldKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKDMsIGNiLmZyb250KCkpOworICAgIEVYUEVDVF9FUSg2LCBjYi5iYWNrKCkpOworfQorCitURVNUKENpcmN1bGFyQnVmZmVyLCBQb3BGcm9udCkgeworICAgIENpcmN1bGFyQnVmZmVyPGludD4gY2IoMSk7CisgICAgY2IucHVzaF9iYWNrKDEwMDk4KTsKKyAgICBFWFBFQ1RfRkFMU0UoY2IuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDEsIGNiLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDEwMDk4LCBjYlswXSk7CisgICAgY2IucG9wX2Zyb250KCk7CisgICAgRVhQRUNUX1RSVUUoY2IuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDAsIGNiLnNpemUoKSk7Cit9CisKK1RFU1QoQ2lyY3VsYXJCdWZmZXIsIFBvcEJhY2spIHsKKyAgICBDaXJjdWxhckJ1ZmZlcjxpbnQ+IGNiKDEpOworICAgIGNiLnB1c2hfYmFjaygxMDA5OCk7CisgICAgRVhQRUNUX0ZBTFNFKGNiLmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgxLCBjYi5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxMDA5OCwgY2JbMF0pOworICAgIGNiLnBvcF9iYWNrKCk7CisgICAgRVhQRUNUX1RSVUUoY2IuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDAsIGNiLnNpemUoKSk7Cit9CisKK1RFU1QoQ2lyY3VsYXJCdWZmZXIsIE1vdmVPbmx5VHlwZSkgeworICAgQ2lyY3VsYXJCdWZmZXI8c3RkOjp1bmlxdWVfcHRyPGludD4+IGNiKDEpOworICAgc3RkOjp1bmlxdWVfcHRyPGludD4gcHRyKG5ldyBpbnRbMV0pOworICAgKnB0ciA9IDEwMDk4OworICAgY2IucHVzaF9iYWNrKHN0ZDo6bW92ZShwdHIpKTsKKyAgIEVYUEVDVF9FUSgxMDA5OCwgKmNiLmJhY2soKSk7Cit9CisKK30KK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9IYXNoVXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9IYXNoVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGI0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL0hhc2hVdGlscy5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK25hbWVzcGFjZSB7CisKK2lubGluZSBpbnQgaGFzaENhcGFjaXR5Q29tcGFyZShzaXplX3Qgc2l6ZSwgc2l6ZV90IHNoaWZ0KSB7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gMVUgPDwgc2hpZnQ7CisgICAgLy8gRXNzZW50aWFsbHksIG9uZSBjYW4gcmV3cml0ZToKKyAgICAvLyAgIGxvYWQgPCBtaW5Mb2FkCisgICAgLy8gYXM6CisgICAgLy8gICBzaXplIC8gY2FwYWNpdHkgPCBtaW5Mb2FkCisgICAgLy8gICBjYXBhY2l0eSAqIG1pbkxvYWQgPiBzaXplCisgICAgaWYgKGNhcGFjaXR5ICoga01pbkxvYWQgID4gc2l6ZSAqIGtMb2FkU2NhbGUpCisgICAgICAgIHJldHVybiArMTsKKworICAgIC8vIFNpbWlsYXJseSwgb25lIGNhbiByZXdyaXRlOgorICAgIC8vICAgbG9hZCA+IG1heExvYWQKKyAgICAvLyBhczoKKyAgICAvLyAgIHNpemUgLyBjYXBhY2l0eSA+IG1heExvYWQKKyAgICAvLyAgIGNhcGFjaXR5ICogbWF4TG9hZCA8IHNpemUKKyAgICBpZiAoY2FwYWNpdHkgKiBrTWF4TG9hZCA8IHNpemUgKiBrTG9hZFNjYWxlKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IGludCBrUHJpbWVzWzMyXSA9IHsKKyAgICAxLCAgICAgICAgICAvKiBGb3IgMSA8PCAwICovCisgICAgMiwKKyAgICAzLAorICAgIDcsCisgICAgMTMsCisgICAgMzEsCisgICAgNjEsCisgICAgMTI3LAorICAgIDI1MSwKKyAgICA1MDksCisgICAgMTAyMSwKKyAgICAyMDM5LAorICAgIDQwOTMsCisgICAgODE5MSwKKyAgICAxNjM4MSwKKyAgICAzMjc0OSwKKyAgICA2NTUyMSwgICAgICAvKiBGb3IgMSA8PCAxNiAqLworICAgIDEzMTA3MSwKKyAgICAyNjIxMzksCisgICAgNTI0Mjg3LAorICAgIDEwNDg1NzMsCisgICAgMjA5NzE0MywKKyAgICA0MTk0MzAxLAorICAgIDgzODg1OTMsCisgICAgMTY3NzcyMTMsCisgICAgMzM1NTQzOTMsCisgICAgNjcxMDg4NTksCisgICAgMTM0MjE3Njg5LAorICAgIDI2ODQzNTM5OSwKKyAgICA1MzY4NzA5MDksCisgICAgMTA3Mzc0MTc4OSwKKyAgICAyMTQ3NDgzNjQ3ICAvKiBGb3IgMSA8PCAzMSAqLworICAgIH07CisKKworc2l6ZV90IGhhc2hTaGlmdEFkanVzdChzaXplX3Qgc2l6ZSwgc2l6ZV90IHNoaWZ0KSB7CisgICAgc2l6ZV90IG5ld1NoaWZ0ID0gc2hpZnQ7CisgICAgaW50IHJldCA9IGhhc2hDYXBhY2l0eUNvbXBhcmUoc2l6ZSwgc2hpZnQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIC8vIENhcGFjaXR5IGlzIHRvbyBzbWFsbCBhbmQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChuZXdTaGlmdCA9PSBrTWF4U2hpZnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbmV3U2hpZnQ7CisgICAgICAgIH0gd2hpbGUgKGhhc2hDYXBhY2l0eUNvbXBhcmUoc2l6ZSwgbmV3U2hpZnQpIDwgMCk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgIC8vIENhcGFjaXR5IGlzIHRvbyBsYXJnZSBhbmQgbXVzdCBiZSBkZWNyZWFzZWQuCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChuZXdTaGlmdCA9PSBrTWluU2hpZnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld1NoaWZ0LS07CisgICAgICAgIH0gd2hpbGUgKGhhc2hDYXBhY2l0eUNvbXBhcmUoc2l6ZSwgbmV3U2hpZnQpID4gMCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld1NoaWZ0OworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9IYXNoVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMjA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK2V4dGVybiBjb25zdCBpbnQga1ByaW1lc1szMl07CisKK2VudW0geworICAgIGtNaW5TaGlmdCA9IDMsCisgICAga01heFNoaWZ0ID0gMzEsCisgICAga01pbkNhcGFjaXR5ID0gKDEgPDwga01pblNoaWZ0KSwKKyAgICBrTG9hZFNjYWxlID0gMTAyNCwKKyAgICBrTWluTG9hZCA9IGtMb2FkU2NhbGUgLyA0LCAgICAgIC8vIDI1JSBtaW5pbXVtIGxvYWQuCisgICAga01heExvYWQgPSBrTG9hZFNjYWxlICogMyAvIDQsICAvLyA3NSUgbWF4aW11bSBsb2FkLgorfTsKKworLy8gQSBoYXNoIHRhYmxlIHVzZXMgYW4gYXJyYXkgb2YgfDEgPDwgc2hpZnR8IGl0ZW1zLiBEZXRlcm1pbmUgYSBzaGlmdAorLy8gdmFsdWUgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCB8c2l6ZXwgaXRlbXMgd2l0aCBjb21mb3J0YWJsZSBsb2FkLgorLy8gfG9sZFNoaWZ0fCBpcyB0aGUgY3VycmVudCBzaGlmdCBvZiB0aGUgYXJyYXksIG9yIDAgaWYgaXQgaXMgbm90IGtub3duLgorLy8KKy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB8b2xkU2hpZnR8LCB0aGVuIG5vIHJlc2l6aW5nIGlzIG5lZWRlZC4KKy8vIE90aGVyd2lzZSwgdGhlIGFycmF5IG11c3QgYmUgcmVzaXplZCB0byB8MSA8PCByZXN1bHR8IGl0ZW1zLgorc2l6ZV90IGhhc2hTaGlmdEFkanVzdChzaXplX3Qgc2l6ZSwgc2l6ZV90IG9sZFNoaWZ0KTsKKworLy8gSGFzaCBhIHBvaW50ZXIgdmFsdWUgaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQKKy8vIGhhc2ggdGFibGVzLgoraW5saW5lIHNpemVfdCBwb2ludGVySGFzaChjb25zdCB2b2lkKiBwdHIpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwdHIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDA4YjIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9IYXNoVXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvSGFzaFV0aWxzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIEFSUkFZTEVOKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCisvLyBSZXR1cm4gdHJ1ZSBpZmYgfHh8IGlzIGEgcHJpbWUgaW50ZWdlci4KK2Jvb2wgaXNQcmltZShpbnQgeCkgeworICAgIGlmICh4ID09IDEgfHwgeCA9PSAyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGludCBtYXhfbiA9IChpbnQpY2VpbChzcXJ0KHgpKTsKKyAgICBmb3IgKGludCBuID0gMjsgbiA8PSBtYXhfbjsgKytuKSB7CisgICAgICAgIGlmICgoeCAlIG4pID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoSGFzaFV0aWxzLCBrUHJpbWVzKSB7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCAzMlU7ICsrbikgeworICAgICAgICBpbnQgcHJpbWUgPSBpbnRlcm5hbDo6a1ByaW1lc1tuXTsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICBFWFBFQ1RfTFQoaW50ZXJuYWw6OmtQcmltZXNbbiAtIDFdLCBwcmltZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIlByaW1lICMiIDw8IG4gPDwgIiAoIiA8PCBwcmltZSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgRVhQRUNUX1RSVUUoaXNQcmltZShwcmltZSkpCisgICAgICAgICAgICAgICAgPDwgIlByaW1lICMiIDw8IG4gPDwgIiAoIiA8PCBwcmltZSA8PCAiKSI7CisgICAgfQorfQorCitURVNUKEhhc2hVdGlscywgaGFzaFNoaWZ0QWRqdXN0KSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBzaXplX3Qgc2hpZnQ7CisgICAgICAgIHNpemVfdCBleHBlY3RlZDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgMCwgMywgMyB9LAorICAgICAgICB7IDEsIDMsIDMgfSwKKyAgICAgICAgeyAyLCAzLCAzIH0sCisgICAgICAgIHsgMywgMywgMyB9LAorICAgICAgICB7IDQsIDMsIDMgfSwKKyAgICAgICAgeyA0LCAzLCAzIH0sCisgICAgICAgIHsgNiwgMywgMyB9LAorICAgICAgICB7IDcsIDMsIDQgfSwKKyAgICAgICAgeyA4LCAzLCA0IH0sCisgICAgICAgIHsgOCwgNCwgNCB9LAorICAgICAgICB7IDMsIDQsIDMgfSwKKyAgICAgICAgeyAxNSwgNCwgNSB9LAorICAgICAgICB7IDE1MDAwLCAxNiwgMTUgfSwKKyAgICAgICAgeyAzMjc2OCwgMTYsIDE2IH0sCisgICAgICAgIHsgNTUwMDAsIDE2LCAxNyB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWUxFTihrRGF0YSk7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6aGFzaFNoaWZ0QWRqdXN0KGtEYXRhW25dLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhW25dLnNoaWZ0KSkKKyAgICAgICAgICAgICAgICA8PCAiRm9yIHNpemU9IgorICAgICAgICAgICAgICAgIDw8IGtEYXRhW25dLnNpemUKKyAgICAgICAgICAgICAgICA8PCAiIGFuZCBzaGlmdD0iCisgICAgICAgICAgICAgICAgPDwga0RhdGFbbl0uc2hpZnQ7CisgICAgfQorfQorCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9Mb29rdXAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvTG9va3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlZGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvTG9va3VwLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vIEEgc2V0IG9mIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgbWFwIGFuZCBzZXQgbG9va3Vwcy4gVGhleSBhbGxvdyBhIHNpbXBsZXIKKy8vIHN5bnRheCwgZS5nLgorLy8gICBpZiAoYXV0byB2YWwgPSBmaW5kKG1hcCwgImtleSIpKSB7CisvLyAgICAgICA8cHJvY2VzcyB0aGUgdmFsdWU+CisvLyAgIH0KKy8vIC4uLiBvcgorLy8gICBhdXRvIHZhbHVlID0gZmluZChmdW5jVGhhdFJldHVybnNNYXAoKSwgIm90aGVyX2tleSIpOworLy8gICBpZiAoIXZhbHVlKSAuLi4KKy8vCisvLyBOb3RlOiB0aGVzZSBkb24ndCB3b3JrIGZvciBtdWx0aW1hcHMsIGFzIHRoZXJlJ3Mgbm8gc2luZ2xlIHZhbHVlCisvLyAgdG8gcmV0dXJuIChhbmQsIG1vcmUgaW1wb3J0YW50bHksIGFzIHRob3NlIGFyZSBjb21wbGV0ZWx5IHVzZWxlc3MpLgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEhlbHBlciBwcmVkaWNhdGVzIHRoYXQgY2hlY2sgaWYgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IGlzIGEgbWFwIC8gc2V0IC8KKy8vIGEgbXV0bGlrZXkgY29sbGVjdGlvbiBvZiBhbnkga2luZC4KKy8vIFRoZXNlIGFyZSB1c2VkIGFzIGEgY29uc3RyYWludHMgZm9yIHRoZSBsb29rdXAgZnVuY3Rpb25zIHRvIGdldCBiZXR0ZXIgZXJyb3IKKy8vIG1lc3NhZ2VzIGlmIHRoZSBhcmd1bWVudHMgZG9uJ3Qgc3VwcG9ydCB0aGUgbWFwIGludGVyZmFjZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgaXNfYW55X21hcCA9IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgIGJvb2wsCisgICAgICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8VCwgc3RkOjptYXA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8VCwgc3RkOjp1bm9yZGVyZWRfbWFwPjo6dmFsdWU+OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIGlzX2FueV9zZXQgPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICBib29sLAorICAgICAgICBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPFQsIHN0ZDo6c2V0Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPFQsIHN0ZDo6dW5vcmRlcmVkX3NldD46OnZhbHVlPjsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBpc19hbnlfbXVsdGlrZXkgPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICBib29sLAorICAgICAgICBpc190ZW1wbGF0ZV9pbnN0YW50aWF0aW9uX29mPFQsIHN0ZDo6bXVsdGltYXA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8VCwgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgIGlzX3RlbXBsYXRlX2luc3RhbnRpYXRpb25fb2Y8VCwgc3RkOjptdWx0aXNldD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgaXNfdGVtcGxhdGVfaW5zdGFudGlhdGlvbl9vZjxULCBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldD46OnZhbHVlPjsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzID0gZW5hYmxlX2lmPGlzX2FueV9tYXA8VD4+PgorY29uc3QgdHlwZW5hbWUgVDo6bWFwcGVkX3R5cGUqIGZpbmQoY29uc3QgVCYgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVDo6a2V5X3R5cGUmIGtleSkgeworICAgIGNvbnN0IGF1dG8gaXQgPSBtYXAuZmluZChrZXkpOworICAgIGlmIChpdCA9PSBtYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuICZpdC0+c2Vjb25kOworfQorCisvLyBWZXJzaW9uIHRoYXQgcmV0dXJucyBhIG1vZGlmaWFibGUgdmFsdWUuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgPSBlbmFibGVfaWY8aXNfYW55X21hcDxUPj4+Cit0eXBlbmFtZSBUOjptYXBwZWRfdHlwZSogZmluZChUJiBtYXAsIGNvbnN0IHR5cGVuYW1lIFQ6OmtleV90eXBlJiBrZXkpIHsKKyAgICBhdXRvIGl0ID0gbWFwLmZpbmQoa2V5KTsKKyAgICBpZiAoaXQgPT0gbWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiAmaXQtPnNlY29uZDsKK30KKworLy8gVmVyc2lvbiB3aXRoIGEgZGVmYXVsdCwgcmV0dXJucyBhIF9jb3B5XyBiZWNhdXNlIG9mIHRoZSBwb3NzaWJsZSBmYWxsYmFjaworLy8gdG8gYSBkZWZhdWx0IC0gaXQgbWlnaHQgYmUgZGVzdHJveWVkIGFmdGVyIHRoZSBjYWxsLgordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgVSwKKyAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jPAorICAgICAgICAgICAgICAgICAgaXNfYW55X21hcDxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VSwgdHlwZW5hbWUgVDo6bWFwcGVkX3R5cGU+Ojp2YWx1ZT4+Cit0eXBlbmFtZSBUOjptYXBwZWRfdHlwZSBmaW5kT3JEZWZhdWx0KGNvbnN0IFQmIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgVDo6a2V5X3R5cGUmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVSYmIGRlZmF1bHRWYWwpIHsKKyAgICBpZiAoYXV0byB2YWxQdHIgPSBmaW5kKG1hcCwga2V5KSkgeworICAgICAgICByZXR1cm4gKnZhbFB0cjsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxVPihkZWZhdWx0VmFsKTsKK30KKworLy8gVmVyc2lvbiB0aGF0IGZpbmRzIHRoZSBmaXJzdCBvZiB0aGUgdmFsdWVzIHBhc3NlZCBpbiB8a2V5c3wgaW4gdGhlIG9yZGVyIHRoZXkKKy8vIGFyZSBwYXNzZWQuIEUuZy4sIHRoZSBmb2xsb3dpbmcgY29kZSBmaW5kcyAnMicgYXMgdGhlIGZpcnN0IHZhbHVlIGluIHxrZXlzfDoKKy8vICAgc2V0PGludD4gcyA9IHsxLCAyLCAzfTsKKy8vICAgYXV0byB2YWwgPSBmaW5kRmlyc3RPZihzLCB7MiwgMX0pOworLy8gICBFWFBFQ1RfRVEoMiwgKnZhbCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgPSBlbmFibGVfaWY8aXNfYW55X21hcDxUPj4+Citjb25zdCB0eXBlbmFtZSBUOjptYXBwZWRfdHlwZSogZmluZEZpcnN0T2YoCisgICAgICAgIGNvbnN0IFQmIG1hcCwKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PHR5cGVuYW1lIFQ6OmtleV90eXBlPiBrZXlzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXkgOiBrZXlzKSB7CisgICAgICAgIGlmIChjb25zdCBhdXRvIHZhbFB0ciA9IGZpbmQobWFwLCBrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsUHRyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgPSBlbmFibGVfaWY8aXNfYW55X21hcDxUPj4+Cit0eXBlbmFtZSBUOjptYXBwZWRfdHlwZSogZmluZEZpcnN0T2YoCisgICAgICAgIFQmIG1hcCwKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PHR5cGVuYW1lIFQ6OmtleV90eXBlPiBrZXlzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXkgOiBrZXlzKSB7CisgICAgICAgIGlmIChjb25zdCBhdXRvIHZhbFB0ciA9IGZpbmQobWFwLCBrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsUHRyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBWZXJzaW9uIHRoYXQgZmluZHMgZmlyc3Qgb2YgdGhlIHBhc3NlZCB8a2V5fCB2YWx1ZXMgb3IgcmV0dXJucyB0aGUKKy8vIHxkZWZhdWx0VmFsfCBpZiBub25lIHdlcmUgZm91bmQuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyBVLAorICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2M8CisgICAgICAgICAgICAgICAgICBpc19hbnlfbWFwPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxVLCB0eXBlbmFtZSBUOjptYXBwZWRfdHlwZT46OnZhbHVlPj4KK3R5cGVuYW1lIFQ6Om1hcHBlZF90eXBlIGZpbmRGaXJzdE9mT3JEZWZhdWx0KAorICAgICAgICBjb25zdCBUJiBtYXAsCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx0eXBlbmFtZSBUOjprZXlfdHlwZT4ga2V5cywKKyAgICAgICAgVSYmIGRlZmF1bHRWYWwpIHsKKyAgICBpZiAoY29uc3QgYXV0byB2YWxQdHIgPSBmaW5kRmlyc3RPZihtYXAsIGtleXMpKSB7CisgICAgICAgIHJldHVybiAqdmFsUHRyOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpmb3J3YXJkPFU+KGRlZmF1bHRWYWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwKKyAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jPGlzX2FueV9tYXA8VD46OnZhbHVlIHx8IGlzX2FueV9zZXQ8VD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19hbnlfbXVsdGlrZXk8VD46OnZhbHVlPj4KK2Jvb2wgY29udGFpbnMoY29uc3QgVCYgYywgY29uc3QgdHlwZW5hbWUgVDo6a2V5X3R5cGUmIGtleSkgeworICAgIGNvbnN0IGF1dG8gaXQgPSBjLmZpbmQoa2V5KTsKKyAgICByZXR1cm4gaXQgIT0gYy5lbmQoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfYzxpc19hbnlfbWFwPFQ+Ojp2YWx1ZSB8fCBpc19hbnlfc2V0PFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYW55X211bHRpa2V5PFQ+Ojp2YWx1ZT4+Citib29sIGNvbnRhaW5zQW55T2YoY29uc3QgVCYgYywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8dHlwZW5hbWUgVDo6a2V5X3R5cGU+IGtleXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleSA6IGtleXMpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zKGMsIGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL0xvb2t1cF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL0xvb2t1cF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkNTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvTG9va3VwX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL0xvb2t1cC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKExvb2t1cCwgRmluZHNIYXNoTWFwKSB7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludCwgY2hhcj4gbSA9IHt7MSwgJzEnfSwgezIsICcyJ30sIHszLCAnMyd9fTsKKworICAgIEVYUEVDVF9UUlVFKGZpbmQobSwgMSkpOworICAgIEVYUEVDVF9FUSgnMScsICpmaW5kKG0sIDEpKTsKKyAgICBFWFBFQ1RfRVEoJzEnLCBmaW5kT3JEZWZhdWx0KG0sIDEsICd4JykpOworCisgICAgRVhQRUNUX1RSVUUoZmluZChtLCAyKSk7CisgICAgRVhQRUNUX0VRKCcyJywgKmZpbmQobSwgMikpOworICAgIEVYUEVDVF9FUSgnMicsIGZpbmRPckRlZmF1bHQobSwgMiwgJ3gnKSk7CisKKyAgICBFWFBFQ1RfRkFMU0UoZmluZChtLCA0KSk7CisgICAgRVhQRUNUX0VRKCd4JywgZmluZE9yRGVmYXVsdChtLCA0LCAneCcpKTsKKworICAgIEVYUEVDVF9GQUxTRShmaW5kRmlyc3RPZihtLCB7NSwgNH0pKTsKKyAgICBFWFBFQ1RfVFJVRShmaW5kRmlyc3RPZihtLCB7NSwgNCwgMywgMn0pKTsKKyAgICBFWFBFQ1RfRVEoJzMnLCAqZmluZEZpcnN0T2YobSwgezUsIDQsIDMsIDJ9KSk7CisgICAgRVhQRUNUX0VRKCczJywgZmluZEZpcnN0T2ZPckRlZmF1bHQobSwgezUsIDQsIDMsIDJ9LCAneCcpKTsKKyAgICBFWFBFQ1RfRVEoJ3gnLCBmaW5kRmlyc3RPZk9yRGVmYXVsdChtLCB7NSwgNH0sICd4JykpOworfQorCitURVNUKExvb2t1cCwgRmluZHNNYXApIHsKKyAgICBzdGQ6Om1hcDxpbnQsIGNoYXI+IG0gPSB7ezEsICcxJ30sIHsyLCAnMid9LCB7MywgJzMnfX07CisKKyAgICBFWFBFQ1RfVFJVRShmaW5kKG0sIDEpKTsKKyAgICBFWFBFQ1RfRVEoJzEnLCAqZmluZChtLCAxKSk7CisgICAgRVhQRUNUX0VRKCcxJywgZmluZE9yRGVmYXVsdChtLCAxLCAneCcpKTsKKworICAgIEVYUEVDVF9UUlVFKGZpbmQobSwgMikpOworICAgIEVYUEVDVF9FUSgnMicsICpmaW5kKG0sIDIpKTsKKyAgICBFWFBFQ1RfRVEoJzInLCBmaW5kT3JEZWZhdWx0KG0sIDIsICd4JykpOworCisgICAgRVhQRUNUX0ZBTFNFKGZpbmQobSwgNCkpOworICAgIEVYUEVDVF9FUSgneCcsIGZpbmRPckRlZmF1bHQobSwgNCwgJ3gnKSk7CisKKyAgICBFWFBFQ1RfRkFMU0UoZmluZEZpcnN0T2YobSwgezUsIDR9KSk7CisgICAgRVhQRUNUX1RSVUUoZmluZEZpcnN0T2YobSwgezUsIDQsIDMsIDJ9KSk7CisgICAgRVhQRUNUX0VRKCczJywgKmZpbmRGaXJzdE9mKG0sIHs1LCA0LCAzLCAyfSkpOworICAgIEVYUEVDVF9FUSgnMycsIGZpbmRGaXJzdE9mT3JEZWZhdWx0KG0sIHs1LCA0LCAzLCAyfSwgJ3gnKSk7CisgICAgRVhQRUNUX0VRKCd4JywgZmluZEZpcnN0T2ZPckRlZmF1bHQobSwgezUsIDR9LCAneCcpKTsKK30KKworVEVTVChMb29rdXAsIENvbnRhaW5zKSB7CisgICAgRVhQRUNUX1RSVUUoY29udGFpbnMoc3RkOjpzZXQ8aW50PnsxLCAyfSwgMSkpOworICAgIEVYUEVDVF9UUlVFKGNvbnRhaW5zQW55T2Yoc3RkOjpzZXQ8aW50PnsxLCAyfSwgezQsIDMsIDJ9KSk7CisKKyAgICBFWFBFQ1RfRkFMU0UoY29udGFpbnMoc3RkOjp1bm9yZGVyZWRfc2V0PGludD57MSwgMn0sIDUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29udGFpbnNBbnlPZihzdGQ6OnVub3JkZXJlZF9zZXQ8aW50PnsxLCAyfSwgezQsIDN9KSk7CisKKyAgICBFWFBFQ1RfVFJVRShjb250YWlucyhzdGQ6Om1hcDxpbnQsIGludD57ezEsIDF9LCB7MiwgMn19LCAxKSk7CisgICAgRVhQRUNUX1RSVUUoY29udGFpbnNBbnlPZihzdGQ6Om1hcDxpbnQsIGludD57ezEsIDF9LCB7MiwgMn19LCB7NCwgMywgMn0pKTsKKworICAgIEVYUEVDVF9GQUxTRShjb250YWlucyhzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBpbnQ+e3sxLCAxfSwgezIsIDJ9fSwgNSkpOworICAgIEVYUEVDVF9GQUxTRShjb250YWluc0FueU9mKHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIGludD57ezEsIDF9LCB7MiwgMn19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LCAzfSkpOworCisgICAgRVhQRUNUX1RSVUUoY29udGFpbnMoc3RkOjptdWx0aW1hcDxpbnQsIGludD57ezEsIDF9LCB7MSwgMn19LCAxKSk7CisgICAgRVhQRUNUX1RSVUUoY29udGFpbnNBbnlPZigKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPGludCwgaW50Pnt7MSwgMX0sIHsyLCAyfSwgezIsIDN9fSwKKyAgICAgICAgICAgIHs0LCAzLCAyfSkpOworCisgICAgRVhQRUNUX0ZBTFNFKGNvbnRhaW5zKHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PGludD57MSwgMiwgMn0sIDUpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29udGFpbnNBbnlPZihzdGQ6Om11bHRpc2V0PGludD57MSwgMiwgMiwgMiwgM30sIHs0LCA1fSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1BvaW50ZXJTZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTE4Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1BvaW50ZXJTZXQuY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL1BvaW50ZXJTZXQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL0hhc2hVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKKy8vIFNwZWNpYWwgdmFsdWVzIHVzZWQgaW4gdGhlIHNldCdzIGl0ZW1zIGFycmF5IHRvIGluZGljYXRlIGVpdGhlcgorLy8gdW51c2VkIHNsb3RzLCBvciB0b21ic3RvbmUgb25lcy4KKyNkZWZpbmUgVU5VU0VEX1NMT1QgTlVMTAorI2RlZmluZSBUT01CU1RPTkUgKCh2b2lkKikofih1aW50cHRyX3QpMCkpCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSB8b2JqfCBjb3JyZXNwb25kcyB0byBhIHJlYWwgb2JqZWN0IGluIHRoZSBzZXQsCisvLyBmYWxzZSBvdGhlcndpc2UuCitib29sIHZhbGlkVmFsdWUodm9pZCogb2JqKSB7CisgICAgcmV0dXJuIG9iaiAhPSBVTlVTRURfU0xPVCAmJiBvYmogIT0gVE9NQlNUT05FOworfQorCisvLyBQcm9iZSB0aGUgYXJyYXkgfGl0ZW1zfCBob2xkaW5nIHwxVSA8PCBzaGlmdHwgaXRlbXMgZm9yIG9iamVjdCB8b2JqfC4KKy8vIHxvYmpIYXNofCBpcyB0aGUgb2JqZWN0IGhhc2guCisvLyBJZiB8b2JqfCBpcyBmb3VuZCwgcmV0dXJuIGl0cyBpbmRleCBpbiB0aGUgYXJyYXkuCisvLyBJZiB8b2JqfCBpcyBub3QgZm91bmQsIHJldHVybiB0aGUgaW5kZXggb2YgYSB1bnVzZWQgb3IgdG9tYnN0b25lIHNsb3QKKy8vIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGl0Lgorc2l6ZV90IHByb2JlSXRlbXMoY29uc3Qgdm9pZCogb2JqLCBzaXplX3Qgb2JqSGFzaCwgdm9pZCoqIGl0ZW1zLCBzaXplX3Qgc2hpZnQpIHsKKyAgICBEQ0hFQ0sob2JqKTsKKyAgICBEQ0hFQ0soc2hpZnQgPCAzMlUpOworCisgICAgc2l6ZV90IHByb2JlX21hc2sgPSAoKDFVIDw8IHNoaWZ0KSAtIDFVKTsKKyAgICBjb25zdCBzaXplX3QgcHJvYmVfaW5kZXgwID0gKG9iakhhc2ggJSBpbnRlcm5hbDo6a1ByaW1lc1tzaGlmdF0pICYgcHJvYmVfbWFzazsKKyAgICBzaXplX3QgcHJvYmVfaW5kZXggPSBwcm9iZV9pbmRleDA7CisgICAgc2l6ZV90IHN0ZXAgPSAwOworCisgICAgaW50cHRyX3QgdG9tYnN0b25lID0gLTE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHZvaWQqIGl0ZW0gPSBpdGVtc1twcm9iZV9pbmRleF07CisgICAgICAgIGlmIChpdGVtID09IG9iaikgeworICAgICAgICAgICAgcmV0dXJuIHByb2JlX2luZGV4OworICAgICAgICB9CisgICAgICAgIGlmIChpdGVtID09IFVOVVNFRF9TTE9UKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbSA9PSBUT01CU1RPTkUgJiYgdG9tYnN0b25lIDwgMCkgeworICAgICAgICAgICAgdG9tYnN0b25lID0gKGludHB0cl90KXByb2JlX2luZGV4OworICAgICAgICB9CisgICAgICAgIHN0ZXArKzsKKyAgICAgICAgaWYgKHN0ZXAgPiBwcm9iZV9tYXNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcm9iZV9pbmRleCA9IChwcm9iZV9pbmRleCArIHN0ZXApICYgcHJvYmVfbWFzazsKKyAgICB9CisgICAgaWYgKHRvbWJzdG9uZSA+PSAwKSB7CisgICAgICAgIHJldHVybiAoc2l6ZV90KXRvbWJzdG9uZTsKKyAgICB9CisgICAgcmV0dXJuIHByb2JlX2luZGV4OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworUG9pbnRlclNldEJhc2U6OlBvaW50ZXJTZXRCYXNlKCkgOgorICAgICAgICBtU2hpZnQoaW50ZXJuYWw6OmtNaW5TaGlmdCksCisgICAgICAgIG1Db3VudCgwKSwKKyAgICAgICAgbUl0ZW1zKE5VTEwpIHsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAxVSA8PCBtU2hpZnQ7CisgICAgbUl0ZW1zID0gc3RhdGljX2Nhc3Q8dm9pZCoqPig6OmNhbGxvYyhjYXBhY2l0eSwgc2l6ZW9mKG1JdGVtc1swXSkpKTsKK30KKworUG9pbnRlclNldEJhc2U6On5Qb2ludGVyU2V0QmFzZSgpIHsKKyAgICBtQ291bnQgPSAwOworICAgIG1TaGlmdCA9IDA7CisgICAgOjpmcmVlKG1JdGVtcyk7Cit9CisKK1BvaW50ZXJTZXRCYXNlOjpJdGVyYXRvcjo6SXRlcmF0b3IoUG9pbnRlclNldEJhc2UqIHNldCkgOgorICAgICAgICBtSXRlbXMoc2V0LT5tSXRlbXMpLAorICAgICAgICBtQ2FwYWNpdHkoMVUgPDwgc2V0LT5tU2hpZnQpLAorICAgICAgICBtUG9zKDBVKSB7fQorCit2b2lkKiBQb2ludGVyU2V0QmFzZTo6SXRlcmF0b3I6Om5leHQoKSB7CisgICAgd2hpbGUgKG1Qb3MgPCBtQ2FwYWNpdHkpIHsKKyAgICAgICAgdm9pZCogaXRlbSA9IG1JdGVtc1ttUG9zKytdOworICAgICAgICBpZiAodmFsaWRWYWx1ZShpdGVtKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgUG9pbnRlclNldEJhc2U6OmNvbnRhaW5zKGNvbnN0IHZvaWQqIG9iaiwgSGFzaEZ1bmN0aW9uIGhhc2hGdW5jKSBjb25zdCB7CisgICAgaWYgKCFvYmopIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzaXplX3Qgb2JqSGFzaCA9IGhhc2hGdW5jKG9iaik7CisgICAgc2l6ZV90IHBvcyA9IHByb2JlSXRlbXMob2JqLCBvYmpIYXNoLCBtSXRlbXMsIG1TaGlmdCk7CisgICAgRENIRUNLKHBvcyA8ICgxVSA8PCBtU2hpZnQpKTsKKworICAgIHJldHVybiB2YWxpZFZhbHVlKG1JdGVtc1twb3NdKTsKK30KKwordm9pZCBQb2ludGVyU2V0QmFzZTo6Y2xlYXIoKSB7CisgICAgbUNvdW50ID0gMDsKKyAgICBtU2hpZnQgPSBpbnRlcm5hbDo6a01pblNoaWZ0OworICAgIHNpemVfdCBjYXBhY2l0eSA9IDFVIDw8IG1TaGlmdDsKKyAgICBtSXRlbXMgPSBzdGF0aWNfY2FzdDx2b2lkKio+KAorICAgICAgICAgICAgOjpyZWFsbG9jKG1JdGVtcywgc2l6ZW9mKG1JdGVtc1swXSkgKiBjYXBhY2l0eSkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgY2FwYWNpdHk7ICsrbikgeworICAgICAgICBtSXRlbXNbbl0gPSBVTlVTRURfU0xPVDsKKyAgICB9Cit9CisKK3ZvaWQqIFBvaW50ZXJTZXRCYXNlOjphZGRJdGVtKHZvaWQqIG9iaiwgSGFzaEZ1bmN0aW9uIGhhc2hGdW5jKSB7CisgICAgaWYgKCF2YWxpZFZhbHVlKG9iaikpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmKG1Db3VudCA+PSAoMVUgPDwgbVNoaWZ0KSkgbWF5YmVSZXNpemUoaGFzaEZ1bmMpOworICAgIHNpemVfdCBvYmpIYXNoID0gaGFzaEZ1bmMob2JqKTsKKyAgICBzaXplX3QgcG9zID0gcHJvYmVJdGVtcyhvYmosIG9iakhhc2gsIG1JdGVtcywgbVNoaWZ0KTsKKyAgICBEQ0hFQ0socG9zIDwgKDFVIDw8IG1TaGlmdCkpOworCisgICAgdm9pZCogcmVzdWx0ID0gbUl0ZW1zW3Bvc107CisgICAgaWYgKHZhbGlkVmFsdWUocmVzdWx0KSkgeworICAgICAgICAvLyBTaW1wbGUgcmVwbGFjZW1lbnQuCisgICAgICAgIERDSEVDSyhyZXN1bHQgPT0gb2JqKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgbUl0ZW1zW3Bvc10gPSBvYmo7CisgICAgbUNvdW50Kys7CisKKyAgICBpZiAocmVzdWx0ICE9IFRPTUJTVE9ORSkgeworICAgICAgICAvLyBObyBuZWVkIHRvIHJlc2l6ZSB3aGVuIHJlcGxhY2luZyB0b21ic3RvbmUuCisgICAgICAgIG1heWJlUmVzaXplKGhhc2hGdW5jKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCogUG9pbnRlclNldEJhc2U6OnJlbW92ZUl0ZW0odm9pZCogb2JqLCBIYXNoRnVuY3Rpb24gaGFzaEZ1bmMpIHsKKyAgICBpZiAoIXZhbGlkVmFsdWUob2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZV90IG9iakhhc2ggPSBoYXNoRnVuYyhvYmopOworICAgIHNpemVfdCBwb3MgPSBwcm9iZUl0ZW1zKG9iaiwgb2JqSGFzaCwgbUl0ZW1zLCBtU2hpZnQpOworICAgIERDSEVDSyhwb3MgPCAoMVUgPDwgbVNoaWZ0KSk7CisKKyAgICB2b2lkKiByZXN1bHQgPSBtSXRlbXNbcG9zXTsKKyAgICBpZiAoIXZhbGlkVmFsdWUocmVzdWx0KSkgeworICAgICAgICAvLyBJdGVtIHdhcyBub3QgaW4gdGhlIGFycmF5LgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbUl0ZW1zW3Bvc10gPSBUT01CU1RPTkU7CisgICAgbUNvdW50LS07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCoqIFBvaW50ZXJTZXRCYXNlOjp0b0FycmF5KCkgY29uc3QgeworICAgIGlmICghbUNvdW50KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2b2lkKiogcmVzdWx0ID0gc3RhdGljX2Nhc3Q8dm9pZCoqPig6OmNhbGxvYyhtQ291bnQsIHNpemVvZihtSXRlbXNbMF0pKSk7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gMVUgPDwgbVNoaWZ0OworICAgIHNpemVfdCBjb3VudCA9IDA7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBjYXBhY2l0eTsgKytuKSB7CisgICAgICAgIHZvaWQqIGl0ZW0gPSBtSXRlbXNbbl07CisgICAgICAgIGlmICghdmFsaWRWYWx1ZShpdGVtKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0W2NvdW50KytdID0gaXRlbTsKKyAgICB9CisKKyAgICBEQ0hFQ0soY291bnQgPT0gbUNvdW50KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFBvaW50ZXJTZXRCYXNlOjptYXliZVJlc2l6ZShIYXNoRnVuY3Rpb24gaGFzaEZ1bmMpIHsKKyAgICBzaXplX3QgbmV3U2hpZnQgPSBpbnRlcm5hbDo6aGFzaFNoaWZ0QWRqdXN0KG1Db3VudCwgbVNoaWZ0KTsKKyAgICBpZiAobmV3U2hpZnQgPT0gbVNoaWZ0KSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gcmVzaXplCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAxVSA8PCBtU2hpZnQ7CisgICAgc2l6ZV90IG5ld0NhcGFjaXR5ID0gMVUgPDwgbmV3U2hpZnQ7CisgICAgdm9pZCoqIG5ld0l0ZW1zID0gc3RhdGljX2Nhc3Q8dm9pZCoqPigKKyAgICAgICAgICAgIDo6Y2FsbG9jKG5ld0NhcGFjaXR5LCBzaXplb2YobmV3SXRlbXNbMF0pKSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGNhcGFjaXR5OyArK24pIHsKKyAgICAgICAgdm9pZCogaXRlbSA9IG1JdGVtc1tuXTsKKyAgICAgICAgaWYgKCF2YWxpZFZhbHVlKGl0ZW0pKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgaXRlbUhhc2ggPSBoYXNoRnVuYyhpdGVtKTsKKyAgICAgICAgc2l6ZV90IHNsb3QgPSBwcm9iZUl0ZW1zKGl0ZW0sIGl0ZW1IYXNoLCBuZXdJdGVtcywgbmV3U2hpZnQpOworICAgICAgICBEQ0hFQ0soIXZhbGlkVmFsdWUobmV3SXRlbXNbc2xvdF0pKTsKKyAgICAgICAgbmV3SXRlbXNbc2xvdF0gPSBpdGVtOworICAgIH0KKworICAgIDo6ZnJlZShtSXRlbXMpOworICAgIG1JdGVtcyA9IG5ld0l0ZW1zOworICAgIG1TaGlmdCA9IG5ld1NoaWZ0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9Qb2ludGVyU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4YmJhYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldC5oCkBAIC0wLDAgKzEsMTkwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9IYXNoVXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIFBvaW50ZXJTZXQ8VD4gbW9kZWxzIGEgc2V0IHJlZmVyZW5jaW5nIGhlYXAtYWxsb2NhdGVkIG9iamVjdHMgb2YgdHlwZSBULgorLy8KKy8vIFRoZSBvYmplY3RzIGFyZSBub3Qgb3duZWQgYnkgdGhlIFBvaW50ZXJTZXQ8VD4sIHNlZSBTY29wZWRQb2ludGVyU2V0PFQ+CisvLyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRoZSBzZXQgdG8gYWxzbyBvd24gdGhlIG9iamVjdHMuCisvLworLy8gRWFjaCBvYmplY3QgaXMgaWRlbnRpZmllZCBieSBpdHMgYWRkcmVzcyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGhhc2hpbmcKKy8vIGtleS4gVGhpcyBtYWtlcyB0aGUgaW1wbGVtZW50YXRpb24gc2ltcGxlLCBidXQgYWxzbyBlbnN1cmVzIHRoYXQKKy8vIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lLWNvbnN0cnVjdGVkIHNldCB3aWxsIG5vdCBwcm92aWRlIHRoZSBzYW1lCisvLyByZXN1bHQgYmV0d2VlbiB0d28gcnVucyBvZiB0aGUgc2FtZSBwcm9ncmFtLgorLy8KKy8vIFVzYWdlIGV4YW1wbGU6CisvLworLy8gICAgIFBvaW50ZXJTZXQ8Rm9vPiBzZXRPZkZvb3M7ICAgLy8gQ3JlYXRlcyBuZXcgZW1wdHkgc2V0LgorLy8gICAgIHNldE9mRm9vcy5hZGQoZm9vMSk7ICAgICAgICAgLy8gQWRkIGZvbzEgdG8gdGhlIHNldC4KKy8vICAgICBpZiAoc2V0T2ZGb29zLmNvbnRhaW5zKGZvbzEpKSB7ICAvLyBUZXN0IHdoZXRoZXIgdGhlIHNldCBjb250YWlucyBmb28xCisvLyAgICAgICAgc2V0T2ZGb29zLnJlbW92ZShmb28xKTsgICAvLyBSZW1vdmUgZm9vMSBmcm9tIHNldC4KKy8vICAgICB9CisvLyAgICAgQ0hFQ0soc2V0T2ZGb29zLmVtcHR5KCkpOworLy8gICAgIENIRUNLKHNldE9mRm9vcy5zaXplKCkgPT0gMCk7CisvLworLy8gIEl0ZXJhdGluZyBvdmVyIGEgc2V0OgorLy8KKy8vICAgICBQb2ludGVyU2V0PEZvbz46Okl0ZXJhdG9yICBpdGVyKCZzZXRPZkZvb3MpOworLy8gICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworLy8gICAgICAgIEZvbyogZm9vID0gaXRlci5uZXh0KCk7CisvLyAgICAgICAgLi4gZG8gc29tZXRoaW5nIHdpdGggZm9vCisvLyAgICAgfQorLy8KKy8vICBOb3RlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlY29tZXMgaW52YWxpZCBpZiB5b3UgYWRkIG9yIHJlbW92ZSBvYmplY3RzCisvLyAgdG8vZnJvbSB0aGUgc2V0LgorCitjbGFzcyBQb2ludGVyU2V0QmFzZSB7CitwdWJsaWM6CisgICAgUG9pbnRlclNldEJhc2UoKTsKKyAgICB+UG9pbnRlclNldEJhc2UoKTsKKworICAgIGNsYXNzIEl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEl0ZXJhdG9yKFBvaW50ZXJTZXRCYXNlKiBzZXQpOworICAgICAgICB+SXRlcmF0b3IoKSB7fQorCisgICAgICAgIGlubGluZSBib29sIGhhc05leHQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1Qb3MgPCBtQ2FwYWNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCogbmV4dCgpOworICAgIHByaXZhdGU6CisgICAgICAgIC8vIE5vIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgSXRlcmF0b3IoKTsKKworICAgICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oSXRlcmF0b3IpOworCisgICAgICAgIHZvaWQqKiBtSXRlbXM7CisgICAgICAgIHNpemVfdCBtQ2FwYWNpdHk7CisgICAgICAgIHNpemVfdCBtUG9zOworICAgIH07CisKKyAgICB0eXBlZGVmIHNpemVfdCAoKkhhc2hGdW5jdGlvbikoY29uc3Qgdm9pZCogb2JqKTsKKworICAgIHN0cnVjdCBEZWZhdWx0VHJhaXRzIHsKKyAgICAgICAgc3RhdGljIHNpemVfdCBoYXNoKGNvbnN0IHZvaWQqIG9iaikgeworICAgICAgICAgICAgcmV0dXJuIDo6YW5kcm9pZDo6YmFzZTo6aW50ZXJuYWw6OnBvaW50ZXJIYXNoKG9iaik7CisgICAgICAgIH0KKyAgICB9OworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db3VudCA9PSAwOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIGJvb2wgY29udGFpbnMoY29uc3Qgdm9pZCogb2JqLCBIYXNoRnVuY3Rpb24gaGFzaEZ1bmMpIGNvbnN0OworCisgICAgdm9pZCBjbGVhcigpOworCisgICAgdm9pZCogYWRkSXRlbSh2b2lkKiBvYmosIEhhc2hGdW5jdGlvbiBoYXNoRnVuYyk7CisKKyAgICB2b2lkKiByZW1vdmVJdGVtKHZvaWQqIG9iaiwgSGFzaEZ1bmN0aW9uIGhhc2hGdW5jKTsKKworICAgIHZvaWQqKiB0b0FycmF5KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy9mcmllbmQgY2xhc3MgUG9pbnRlclNldEJhc2U6Okl0ZXJhdG9yOworCisgICAgdm9pZCBtYXliZVJlc2l6ZShIYXNoRnVuY3Rpb24gaGFzaEZ1bmMpOworCisgICAgc2l6ZV90IG1TaGlmdDsKKyAgICBzaXplX3QgbUNvdW50OworICAgIHZvaWQqKiBtSXRlbXM7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwKKyAgICAgICAgICB0eXBlbmFtZSBUUkFJVFMgPSB0eXBlbmFtZSA6OmFuZHJvaWQ6OmJhc2U6OlBvaW50ZXJTZXRCYXNlOjpEZWZhdWx0VHJhaXRzPgorY2xhc3MgUG9pbnRlclNldCA6IHB1YmxpYyBQb2ludGVyU2V0QmFzZSB7CitwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGVtcHR5IHNldC4KKyAgICBQb2ludGVyU2V0KCkgOiBQb2ludGVyU2V0QmFzZSgpIHt9OworCisgICAgLy8gRGVzdHJ1Y3RvciBzaW1wbHkgZGVzdHJveXMgdGhlIHNldCwgbm90IHRoZSBvYmplY3RzIGluIGl0LgorICAgIH5Qb2ludGVyU2V0KCkge30KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGUgc2V0IGlzIGVtcHR5LgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBQb2ludGVyU2V0QmFzZTo6ZW1wdHkoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBzZXQuCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBQb2ludGVyU2V0QmFzZTo6c2l6ZSgpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGUgc2V0IGNvbnRhaW5zIG9iamVjdCB8b2JqfC4gQWx3YXlzIHJldHVybiBmYWxzZQorICAgIC8vIGlmIHxvYmp8IGlzIE5VTEwuCisgICAgYm9vbCBjb250YWlucyhjb25zdCBUKiBvYmopIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFBvaW50ZXJTZXRCYXNlOjpjb250YWlucyhzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4ob2JqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFJVFM6Omhhc2gpOworICAgIH0KKworICAgIC8vIFJlbW92ZSBhbGwgb2JqZWN0cyBmcm9tIHRoZSBzZXQuCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgUG9pbnRlclNldEJhc2U6OmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gQWRkIG9iamVjdCB8b2JqfCB0byB0aGUgc2V0LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBhZGRlZCwKKyAgICAvLyBhbmQgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgaW4gdGhlIHNldC4gQWx3YXlzIHJldHVybiBmYWxzZSBpZgorICAgIC8vIHxvYmp8IGlzIE5VTEwuCisgICAgYm9vbCBhZGQoVCogb2JqKSB7CisgICAgICAgIHJldHVybiBQb2ludGVyU2V0QmFzZTo6YWRkSXRlbShvYmosIFRSQUlUUzo6aGFzaCkgIT0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgb2JqZWN0IHxvYmp8IGZyb20gdGhlIHNldC4gUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCB3YXMKKyAgICAvLyBhbHJlYWR5IGluIHRoZSBzZXQsIGFuZCBmYWxzZSBvdGhlcndpc2UuIFJldHVybiBmYWxzZSBpZiB8b2JqfAorICAgIC8vIGlzIE5VTEwuCisgICAgYm9vbCByZW1vdmUoVCogb2JqKSB7CisgICAgICAgIHJldHVybiBQb2ludGVyU2V0QmFzZTo6cmVtb3ZlSXRlbShvYmosIFRSQUlUUzo6aGFzaCkgIT0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRvciBjbGFzcyBmb3IgdGhpcyBzZXQuIE5vdGUgdGhhdCBhZGRpbmcgb3IgcmVtb3ZpbmcgaXRlbXMKKyAgICAvLyBpbiB0aGUgc2V0IG1ha2VzIHRoZSBpdGVyYXRvciBpbnZhbGlkLiBVc2FnZSBleGFtcGxlIGlzOgorICAgIC8vCisgICAgLy8gICAgIFBvaW50ZXJTZXQ8Rm9vPjo6SXRlcmF0b3IgIGl0ZXIoJmZvb1NldCk7CisgICAgLy8gICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgIC8vICAgICAgICBGb28qIGZvbyA9IGl0ZXIubmV4dCgpOworICAgIC8vICAgICAgICAuLiBkbyBzb21ldGhpbmcgd2l0aCB8Zm9vfAorICAgIC8vICAgICB9CisgICAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgUG9pbnRlclNldEJhc2U6Okl0ZXJhdG9yIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEl0ZXJhdG9yKFBvaW50ZXJTZXQqIHNldCkgOiBQb2ludGVyU2V0QmFzZTo6SXRlcmF0b3Ioc2V0KSB7fQorCisgICAgICAgIGJvb2wgaGFzTmV4dCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQb2ludGVyU2V0QmFzZTo6SXRlcmF0b3I6Omhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFQqIG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oUG9pbnRlclNldEJhc2U6Okl0ZXJhdG9yOjpuZXh0KCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIENyZWF0ZSBhIGhlYXAtYWxsb2NhdGVkIGFycmF5IG9mIHNpemUoKSBwb2ludGVycyB0byB0aGUgb2JqZWN0cworICAgIC8vIGNvbnRhaW5lZCBpbiB0aGUgc2V0LiBUaGUgYXJyYXkgbXVzdCBiZSBmcmVlKCktZWQgYnkgdGhlIGNhbGxlci4KKyAgICAvLyBSZXR1cm4gTlVMTCBpZiB0aGUgc2V0IGlzIGVtcHR5LgorICAgIFQqKiB0b0FycmF5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKio+KFBvaW50ZXJTZXRCYXNlOjp0b0FycmF5KCkpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9Qb2ludGVyU2V0X3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmYzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvUG9pbnRlclNldC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEZvbyB7CitwdWJsaWM6CisgICAgRm9vKCkgOiBtVmFsdWUoMCkge30KKyAgICBleHBsaWNpdCBGb28oaW50IHZhbHVlKSA6IG1WYWx1ZSh2YWx1ZSkge30KKworICAgIGludCB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1WYWx1ZTsgfQorCitwcml2YXRlOgorICAgIGludCBtVmFsdWU7Cit9OworCitjbGFzcyBTY29wZWRGb29TZXQgOiBwdWJsaWMgUG9pbnRlclNldDxGb28+IHsKK3B1YmxpYzoKKyAgICB+U2NvcGVkRm9vU2V0KCkgeworICAgICAgICBJdGVyYXRvciBpdGVyKHRoaXMpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBpdGVyLm5leHQoKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFBvaW50ZXJTZXQsIGluaXQpIHsKKyAgICBQb2ludGVyU2V0PEZvbz4gc2V0OworICAgIEVYUEVDVF9UUlVFKHNldC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMFUsIHNldC5zaXplKCkpOworfQorCitURVNUKFBvaW50ZXJTZXQsIGVtcHR5KSB7CisgICAgU2NvcGVkRm9vU2V0IHNldDsKKworICAgIEVYUEVDVF9UUlVFKHNldC5lbXB0eSgpKTsKKworICAgIEZvbyogZm9vMCA9IG5ldyBGb28oMCk7CisgICAgc2V0LmFkZChmb28wKTsKKworICAgIEVYUEVDVF9GQUxTRShzZXQuZW1wdHkoKSk7CisKKyAgICBzZXQucmVtb3ZlKGZvbzApOworICAgIEVYUEVDVF9UUlVFKHNldC5lbXB0eSgpKTsKKworICAgIGRlbGV0ZSBmb28wOworfQorCitURVNUKFBvaW50ZXJTZXQsIGFkZCkgeworICAgIFNjb3BlZEZvb1NldCBzZXQ7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMFU7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIHNldC5hZGQobmV3IEZvbyhuKSk7CisgICAgICAgIEVYUEVDVF9FUShuICsgMVUsIHNldC5zaXplKCkpOworICAgIH0KKworICAgIGJvb2wgZmxhZ3Nba0NvdW50XTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGZsYWdzW25dID0gZmFsc2U7CisgICAgfQorCisgICAgRm9vKiogYXJyYXkgPSBzZXQudG9BcnJheSgpOworICAgIEFTU0VSVF9UUlVFKGFycmF5KTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIEZvbyogZm9vID0gYXJyYXlbbl07CisgICAgICAgIEFTU0VSVF9UUlVFKGZvbyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShmbGFnc1tmb28tPnZhbHVlKCldKTsKKyAgICAgICAgZmxhZ3NbZm9vLT52YWx1ZSgpXSA9IHRydWU7CisgICAgfQorICAgIDo6ZnJlZShhcnJheSk7Cit9CisKK1RFU1QoUG9pbnRlclNldCwgY29udGFpbnMpIHsKKyAgICBTY29wZWRGb29TZXQgc2V0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDBVOworICAgIEZvbyogZm9vc1trQ291bnRdOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBmb29zW25dID0gbmV3IEZvbyhuKTsKKyAgICAgICAgc2V0LmFkZChmb29zW25dKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoa0NvdW50LCBzZXQuc2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoc2V0LmNvbnRhaW5zKGZvb3Nbbl0pKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KK30KKworVEVTVChQb2ludGVyU2V0LCByZW1vdmUpIHsKKyAgICBTY29wZWRGb29TZXQgc2V0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDBVOworICAgIEZvbyogZm9vc1trQ291bnRdOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBmb29zW25dID0gbmV3IEZvbyhuKTsKKyAgICAgICAgc2V0LmFkZChmb29zW25dKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoa0NvdW50LCBzZXQuc2l6ZSgpKTsKKworICAgIC8vIFJlbW92ZSBvZGQgaXRlbXMgZnJvbSB0aGUgc2V0IG9ubHkuCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQgLyAyVTsgKytuKSB7CisgICAgICAgIEZvbyogaXRlbSA9IGZvb3NbbiAqIDJVICsgMVVdOworICAgICAgICBFWFBFQ1RfVFJVRShzZXQucmVtb3ZlKGl0ZW0pKTsKKyAgICAgICAgRVhQRUNUX0VRKGtDb3VudCAtIG4gLSAxLCBzZXQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcmVtb3ZlIHRoZW0gYWdhaW4sIGNoZWNrIHRoYXQgdGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2V0LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBGb28qIGl0ZW0gPSBmb29zW24gKiAyVSArIDFVXTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHNldC5yZW1vdmUoaXRlbSkpOworICAgICAgICBFWFBFQ1RfRVEoa0NvdW50IC8gMlUsIHNldC5zaXplKCkpOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgZXZlbiBpdGVtcyByZW1haW4gaW4gdGhlIHNldC4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudCAvIDJVOyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoc2V0LmNvbnRhaW5zKGZvb3NbbiAqIDJVXSkpIDw8ICJJdGVtICMiIDw8IG47CisgICAgfQorCisgICAgLy8gRGVsZXRlIG9mZiBpdGVtcyB3aGljaCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBzY29wZWQgc2V0LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBkZWxldGUgZm9vc1tuICogMlUgKyAxVV07CisgICAgfQorfQorCitURVNUKFBvaW50ZXJTZXQsIGNsZWFyKSB7CisgICAgU2NvcGVkRm9vU2V0IHNldDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwVTsKKyAgICBGb28qIGZvb3Nba0NvdW50XTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZm9vc1tuXSA9IG5ldyBGb28obik7CisgICAgICAgIHNldC5hZGQoZm9vc1tuXSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgc2V0LnNpemUoKSk7CisKKyAgICBzZXQuY2xlYXIoKTsKKworICAgIEVYUEVDVF9UUlVFKHNldC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMFUsIHNldC5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBFWFBFQ1RfRkFMU0Uoc2V0LmNvbnRhaW5zKGZvb3Nbbl0pKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZGVsZXRlIGZvb3Nbbl07CisgICAgfQorfQorCitURVNUKFBvaW50ZXJTZXQsIEl0ZXJhdG9yKSB7CisgICAgU2NvcGVkRm9vU2V0IHNldDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwVTsKKyAgICBGb28qIGZvb3Nba0NvdW50XTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZm9vc1tuXSA9IG5ldyBGb28obik7CisgICAgICAgIHNldC5hZGQoZm9vc1tuXSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgc2V0LnNpemUoKSk7CisKKyAgICBib29sIGZsYWdzW2tDb3VudF07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBmbGFnc1tuXSA9IGZhbHNlOworICAgIH0KKworICAgIFBvaW50ZXJTZXQ8Rm9vPjo6SXRlcmF0b3IgaXRlcigmc2V0KTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGl0ZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgRm9vKiBmb28gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZm9vKTsKKyAgICAgICAgQVNTRVJUX0xUKGZvby0+dmFsdWUoKSwga0NvdW50KTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGZsYWdzW2Zvby0+dmFsdWUoKV0pIDw8ICJJdGVtICMiIDw8IGZvby0+dmFsdWUoKTsKKyAgICAgICAgZmxhZ3NbZm9vLT52YWx1ZSgpXSA9IHRydWU7CisgICAgfQorCisgICAgRVhQRUNUX0ZBTFNFKGl0ZXIubmV4dCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1Njb3BlZFBvaW50ZXJTZXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU2NvcGVkUG9pbnRlclNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGNhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1Njb3BlZFBvaW50ZXJTZXQuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9Qb2ludGVyU2V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQSBTY29wZWRQb2ludGVyU2V0LFQ+IGlzIGEgdmFyaWFudCBvZiBQb2ludGVyU2V0PFQ+IHRoYXQgYWxzbyBvd25zCisvLyB0aGUgb2JqZWN0cyByZWZlcmVuY2VkIGJ5IHRoZSBzZXQuIEluIHByYWN0aWNlIHRoaXMgbWVhbnMgdGhhdDoKKy8vCisvLyAgIC0gVGhlIGFkZCgpIG1ldGhvZCB0cmFuc2ZlcnMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QgdG8gdGhlIHNldC4KKy8vCisvLyAgIC0gVGhlIHJlbW92ZSgpIG1ldGhvZCBhY3R1YWxseSBkZXN0cm95cyB0aGUgb2JqZWN0IHJlbW92ZWQgZnJvbQorLy8gICAgIHRoZSBzZXQuCisvLworLy8gICAtIFRoZSBjbGVhcigpIG1ldGhvZCBkZXN0cm95cyBhbGwgb2JqZWN0cyBmcm9tIHRoZSBzZXQuCisvLworLy8gICAtIFRoZSBwaWNrKCkgbWV0aG9kIGlzIHByb3ZpZGVkIHRvIHJlbW92ZSBhbiBvYmplY3QgZnJvbSB0aGUgc2V0CisvLyAgICAgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorLy8KKy8vICAgLSBEZXN0cm95aW5nIHRoZSBzZXQgYWxzbyBkZXN0cm95cyBhbGwgb2JqZWN0cyB3aXRoaW4gaXQuCisvLwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRSQUlUUyA9IFBvaW50ZXJTZXRCYXNlOjpEZWZhdWx0VHJhaXRzPgorY2xhc3MgU2NvcGVkUG9pbnRlclNldCA6IHB1YmxpYyBQb2ludGVyU2V0PFQ+IHsKK3B1YmxpYzoKKyAgICBTY29wZWRQb2ludGVyU2V0KCkgOiBQb2ludGVyU2V0PFQ+KCkge30KKworICAgIH5TY29wZWRQb2ludGVyU2V0KCkgeworICAgICAgICBjbGVhcigpOworICAgIH0KKworICAgIHR5cGVkZWYgdHlwZW5hbWUgUG9pbnRlclNldDxUPjo6SXRlcmF0b3IgSXRlcmF0b3I7CisKKyAgICBib29sIHJlbW92ZShUKiBvYmopIHsKKyAgICAgICAgdm9pZCogb2xkID0gUG9pbnRlclNldEJhc2U6OnJlbW92ZUl0ZW0ob2JqLCBUUkFJVFM6Omhhc2gpOworICAgICAgICBpZiAoIW9sZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSByZWludGVycHJldF9jYXN0PFQqPihvbGQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBUKiBwaWNrKFQqIG9iaikgeworICAgICAgICB2b2lkKiBvbGQgPSBQb2ludGVyU2V0QmFzZTo6cmVtb3ZlSXRlbShvYmosIFRSQUlUUzo6aGFzaCk7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihvbGQpOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIodGhpcyk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgZGVsZXRlIGl0ZXIubmV4dCgpOworICAgICAgICB9CisgICAgICAgIFBvaW50ZXJTZXRCYXNlOjpjbGVhcigpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TY29wZWRQb2ludGVyU2V0X3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU2NvcGVkUG9pbnRlclNldF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjY2YwMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU2NvcGVkUG9pbnRlclNldF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyODUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU2NvcGVkUG9pbnRlclNldC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitjbGFzcyBGb28geworcHVibGljOgorICAgIEZvbygpIDogbVZhbHVlKDApIHsgbUNyZWF0ZXMrKzsgfQorICAgIGV4cGxpY2l0IEZvbyhpbnQgdmFsdWUpIDogbVZhbHVlKHZhbHVlKSB7IG1DcmVhdGVzKys7IH0KKyAgICB+Rm9vKCkgeyBtRGVsZXRlcysrOyB9CisKKyAgICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtVmFsdWU7IH0KKworICAgIHN0YXRpYyB2b2lkIHJlc2V0U3RhdHMoKSB7CisgICAgICAgIG1EZWxldGVzID0gMDsKKyAgICAgICAgbUNyZWF0ZXMgPSAwOworICAgIH0KKworICAgIHN0YXRpYyBzaXplX3QgbURlbGV0ZXM7CisgICAgc3RhdGljIHNpemVfdCBtQ3JlYXRlczsKKworcHJpdmF0ZToKKyAgICBpbnQgbVZhbHVlOworfTsKKworc2l6ZV90IEZvbzo6bUNyZWF0ZXMgPSAwVTsKK3NpemVfdCBGb286Om1EZWxldGVzID0gMFU7CisKK3R5cGVkZWYgU2NvcGVkUG9pbnRlclNldDxGb28+IFNjb3BlZEZvb1NldDsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU2NvcGVkUG9pbnRlclNldCwgaW5pdCkgeworICAgIFNjb3BlZFBvaW50ZXJTZXQ8Rm9vPiBzZXQ7CisgICAgRVhQRUNUX1RSVUUoc2V0LmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwVSwgc2V0LnNpemUoKSk7Cit9CisKK1RFU1QoU2NvcGVkUG9pbnRlclNldCwgZW1wdHkpIHsKKyAgICBGb286OnJlc2V0U3RhdHMoKTsKKworICAgIFNjb3BlZEZvb1NldCBzZXQ7CisKKyAgICBFWFBFQ1RfVFJVRShzZXQuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDBVLCBGb286Om1DcmVhdGVzKTsKKyAgICBFWFBFQ1RfRVEoMFUsIEZvbzo6bURlbGV0ZXMpOworCisgICAgRm9vKiBmb28wID0gbmV3IEZvbygwKTsKKyAgICBFWFBFQ1RfRVEoMVUsIEZvbzo6bUNyZWF0ZXMpOworICAgIEVYUEVDVF9FUSgwVSwgRm9vOjptRGVsZXRlcyk7CisKKyAgICBzZXQuYWRkKGZvbzApOworICAgIEVYUEVDVF9FUSgxVSwgRm9vOjptQ3JlYXRlcyk7CisgICAgRVhQRUNUX0VRKDBVLCBGb286Om1EZWxldGVzKTsKKworICAgIEVYUEVDVF9GQUxTRShzZXQuZW1wdHkoKSk7CisKKyAgICBzZXQucmVtb3ZlKGZvbzApOworICAgIEVYUEVDVF9UUlVFKHNldC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMVUsIEZvbzo6bUNyZWF0ZXMpOworICAgIEVYUEVDVF9FUSgxVSwgRm9vOjptRGVsZXRlcyk7Cit9CisKK1RFU1QoU2NvcGVkUG9pbnRlclNldCwgYWRkKSB7CisgICAgU2NvcGVkRm9vU2V0IHNldDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwVTsKKworICAgIEZvbzo6cmVzZXRTdGF0cygpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBzZXQuYWRkKG5ldyBGb28obikpOworICAgICAgICBFWFBFQ1RfRVEobiArIDFVLCBzZXQuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKG4gKyAxVSwgRm9vOjptQ3JlYXRlcyk7CisgICAgICAgIEVYUEVDVF9FUSgwVSwgRm9vOjptRGVsZXRlcyk7CisgICAgfQorCisgICAgYm9vbCBmbGFnc1trQ291bnRdOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZmxhZ3Nbbl0gPSBmYWxzZTsKKyAgICB9CisKKyAgICBGb28qKiBhcnJheSA9IHNldC50b0FycmF5KCk7CisgICAgQVNTRVJUX1RSVUUoYXJyYXkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRm9vKiBmb28gPSBhcnJheVtuXTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZm9vKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGZsYWdzW2Zvby0+dmFsdWUoKV0pOworICAgICAgICBmbGFnc1tmb28tPnZhbHVlKCldID0gdHJ1ZTsKKyAgICB9CisgICAgOjpmcmVlKGFycmF5KTsKK30KKworVEVTVChTY29wZWRQb2ludGVyU2V0LCBjb250YWlucykgeworICAgIFNjb3BlZEZvb1NldCBzZXQ7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMFU7CisgICAgRm9vKiBmb29zW2tDb3VudF07CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGZvb3Nbbl0gPSBuZXcgRm9vKG4pOworICAgICAgICBzZXQuYWRkKGZvb3Nbbl0pOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQsIHNldC5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBFWFBFQ1RfVFJVRShzZXQuY29udGFpbnMoZm9vc1tuXSkpIDw8ICJJdGVtICMiIDw8IG47CisgICAgfQorfQorCitURVNUKFNjb3BlZFBvaW50ZXJTZXQsIHJlbW92ZSkgeworICAgIFNjb3BlZEZvb1NldCBzZXQ7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMFU7CisgICAgRm9vKiBmb29zW2tDb3VudF07CisKKyAgICBGb286OnJlc2V0U3RhdHMoKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZm9vc1tuXSA9IG5ldyBGb28obik7CisgICAgICAgIHNldC5hZGQoZm9vc1tuXSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgc2V0LnNpemUoKSk7CisKKyAgICAvLyBSZW1vdmUgb2RkIGl0ZW1zIGZyb20gdGhlIHNldCBvbmx5LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBGb28qIGl0ZW0gPSBmb29zW24gKiAyVSArIDFVXTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc2V0LnJlbW92ZShpdGVtKSk7CisgICAgICAgIEVYUEVDVF9FUShrQ291bnQgLSBuIC0gMSwgc2V0LnNpemUoKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgRm9vOjptQ3JlYXRlcyk7CisgICAgRVhQRUNUX0VRKGtDb3VudCAvIDJVLCBGb286Om1EZWxldGVzKTsKKworICAgIC8vIFRyeSB0byByZW1vdmUgdGhlbSBhZ2FpbiwgY2hlY2sgdGhhdCB0aGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBzZXQuCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQgLyAyVTsgKytuKSB7CisgICAgICAgIEZvbyogaXRlbSA9IGZvb3NbbiAqIDJVICsgMVVdOworICAgICAgICBFWFBFQ1RfRkFMU0Uoc2V0LnJlbW92ZShpdGVtKSk7CisgICAgICAgIEVYUEVDVF9FUShrQ291bnQgLyAyVSwgc2V0LnNpemUoKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgRm9vOjptQ3JlYXRlcyk7CisgICAgRVhQRUNUX0VRKGtDb3VudCAvIDJVLCBGb286Om1EZWxldGVzKTsKKworCisgICAgLy8gQ2hlY2sgdGhhdCBldmVuIGl0ZW1zIHJlbWFpbiBpbiB0aGUgc2V0LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBFWFBFQ1RfVFJVRShzZXQuY29udGFpbnMoZm9vc1tuICogMlVdKSkgPDwgIkl0ZW0gIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU2NvcGVkUG9pbnRlclNldCwgcGljaykgeworICAgIFNjb3BlZEZvb1NldCBzZXQ7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMFU7CisgICAgRm9vKiBmb29zW2tDb3VudF07CisKKyAgICBGb286OnJlc2V0U3RhdHMoKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgZm9vc1tuXSA9IG5ldyBGb28obik7CisgICAgICAgIHNldC5hZGQoZm9vc1tuXSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgc2V0LnNpemUoKSk7CisKKyAgICAvLyBSZW1vdmUgb2RkIGl0ZW1zIGZyb20gdGhlIHNldCBvbmx5LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBGb28qIGl0ZW0gPSBmb29zW24gKiAyVSArIDFVXTsKKyAgICAgICAgRm9vKiBwaWNrZWQgPSBzZXQucGljayhpdGVtKTsKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0sIHBpY2tlZCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShzZXQuY29udGFpbnMoaXRlbSkpOworICAgICAgICBFWFBFQ1RfRVEoa0NvdW50IC0gbiAtIDEsIHNldC5zaXplKCkpOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQsIEZvbzo6bUNyZWF0ZXMpOworICAgIEVYUEVDVF9FUSgwVSwgRm9vOjptRGVsZXRlcyk7CisKKyAgICAvLyBUcnkgdG8gcmVtb3ZlIHRoZW0gYWdhaW4sIGNoZWNrIHRoYXQgdGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgc2V0LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBGb28qIGl0ZW0gPSBmb29zW24gKiAyVSArIDFVXTsKKyAgICAgICAgRm9vKiBwaWNrZWQgPSBzZXQucGljayhpdGVtKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHBpY2tlZCk7CisgICAgICAgIEVYUEVDVF9FUShrQ291bnQgLyAyVSwgc2V0LnNpemUoKSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgRm9vOjptQ3JlYXRlcyk7CisgICAgRVhQRUNUX0VRKDBVLCBGb286Om1EZWxldGVzKTsKKworCisgICAgLy8gQ2hlY2sgdGhhdCBldmVuIGl0ZW1zIHJlbWFpbiBpbiB0aGUgc2V0LgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBFWFBFQ1RfVFJVRShzZXQuY29udGFpbnMoZm9vc1tuICogMlVdKSkgPDwgIkl0ZW0gIyIgPDwgbjsKKyAgICB9CisKKyAgICAvLyBEZWxldGUgb2RkIGl0ZW1zLgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50IC8gMlU7ICsrbikgeworICAgICAgICBkZWxldGUgZm9vc1tuICogMlUgKyAxVV07CisgICAgfQorfQorCitURVNUKFNjb3BlZFBvaW50ZXJTZXQsIGNsZWFyKSB7CisgICAgU2NvcGVkRm9vU2V0IHNldDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwVTsKKworICAgIEZvbzo6cmVzZXRTdGF0cygpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBzZXQuYWRkKG5ldyBGb28obikpOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQsIHNldC5zaXplKCkpOworICAgIEVYUEVDVF9FUShrQ291bnQsIEZvbzo6bUNyZWF0ZXMpOworICAgIEVYUEVDVF9FUSgwVSwgRm9vOjptRGVsZXRlcyk7CisKKyAgICBzZXQuY2xlYXIoKTsKKworICAgIEVYUEVDVF9FUShrQ291bnQsIEZvbzo6bUNyZWF0ZXMpOworICAgIEVYUEVDVF9FUShrQ291bnQsIEZvbzo6bURlbGV0ZXMpOworCisgICAgRVhQRUNUX1RSVUUoc2V0LmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwVSwgc2V0LnNpemUoKSk7Cit9CisKK1RFU1QoU2NvcGVkUG9pbnRlclNldCwgSXRlcmF0b3IpIHsKKyAgICBTY29wZWRGb29TZXQgc2V0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDBVOworICAgIEZvbyogZm9vc1trQ291bnRdOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBmb29zW25dID0gbmV3IEZvbyhuKTsKKyAgICAgICAgc2V0LmFkZChmb29zW25dKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoa0NvdW50LCBzZXQuc2l6ZSgpKTsKKworICAgIGJvb2wgZmxhZ3Nba0NvdW50XTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGZsYWdzW25dID0gZmFsc2U7CisgICAgfQorCisgICAgUG9pbnRlclNldDxGb28+OjpJdGVyYXRvciBpdGVyKCZzZXQpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXRlci5oYXNOZXh0KCkpOworICAgICAgICBGb28qIGZvbyA9IGl0ZXIubmV4dCgpOworICAgICAgICBFWFBFQ1RfVFJVRShmb28pOworICAgICAgICBBU1NFUlRfTFQoZm9vLT52YWx1ZSgpLCBrQ291bnQpOworICAgICAgICBFWFBFQ1RfRkFMU0UoZmxhZ3NbZm9vLT52YWx1ZSgpXSkgPDwgIkl0ZW0gIyIgPDwgZm9vLT52YWx1ZSgpOworICAgICAgICBmbGFnc1tmb28tPnZhbHVlKCldID0gdHJ1ZTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRkFMU0UoaXRlci5uZXh0KCkpOworfQorCitURVNUKFNjb3BlZFBvaW50ZXJTZXQsIGRlc3RydWN0b3JDbGVhcnNJdGVtcykgeworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDBVOworICAgIEZvbzo6cmVzZXRTdGF0cygpOworCisgICAgeworICAgICAgICBTY29wZWRGb29TZXQgc2V0OworCisgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgICAgIHNldC5hZGQobmV3IEZvbyhuKSk7CisgICAgICAgIH0KKyAgICB9ICAvLyBkZXN0cnVjdG9yIGNhbGxlZCBoZXJlLgorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgRm9vOjptQ3JlYXRlcyk7CisgICAgRVhQRUNUX0VRKGtDb3VudCwgRm9vOjptRGVsZXRlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TbWFsbFZlY3Rvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TbWFsbFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzE2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1NtYWxsVmVjdG9yLmgKQEAgLTAsMCArMSwzODcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vCisvLyBTbWFsbFZlY3RvcjxUPiwgU21hbGxGaXhlZFZlY3RvcjxULCBTbWFsbFNpemU+CisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBhIHJlcGxhY2VtZW50IGZvciBhIHN0ZDo6dmVjdG9yPD4gdGhhdCB1c2VzIHNtYWxsIGJ1ZmZlcgorLy8gb3B0aW1pemF0aW9uIHRlY2huaXF1ZSAtIGZvciBzb21lIHByZXNldCBudW1iZXIgb2YgZWxlbWVudHMgfFNtYWxsU2l6ZXwgaXQKKy8vIHN0b3JlcyB0aGVtIGluc2lkZSBvZiB0aGUgb2JqZWN0LCBhbmQgZmFsbHMgYmFjayB0byB0aGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisvLyBhcnJheSBvbmx5IGlmIG9uZSBuZWVkcyB0byBhZGQgbW9yZSBlbGVtZW50cy4KKy8vIFRoaXMgaXMgdXNlZnVsIGZvciB0aGUgcGVyZm9ybWFuY2UtY3JpdGljYWwgcGxhY2VzIHdoZXJlIGNvbW1vbiBudW1iZXIgb2YKKy8vIHByb2Nlc3NlZCBpdGVtcyBpcyBzbWFsbCwgYnV0IGl0IG1heSBzdGlsbCBiZSBxdWl0ZSBsYXJnZSBmb3IgYSBzdGFjayBhcnJheS4KKy8vCisvLyBTbWFsbEZpeGVkVmVjdG9yPD4gaXMgdGhlIGNsYXNzIHlvdSB1c2UgdG8gc3RvcmUgZWxlbWVudHMsIHdoaWxlCisvLyBTbWFsbFZlY3Rvcjw+IGlzIGl0cyBiYXNlIGNsYXNzIHRoYXQgZXJhc2VzIHRoZSBzbWFsbCBzaXplIGZyb20gdGhlIHR5cGUuCisvLworLy8gTk9URTogU21hbGxWZWN0b3I8PiBjYW5ub3QgZ3VhcmFudGVlIHN0ZDo6dmVjdG9yPD4ncyBpdGVyYXRvciBpbnZhbGlkYXRpb24KKy8vICAgcnVsZXMgZm9yIG1vdmUoKSBhbmQgc3dhcCgpIG9wZXJhdGlvbnMgLSBzdGQ6OnZlY3Rvcjw+cyBqdXN0IGV4Y2hhbmdlCisvLyAgIHRoZWlyIGl0ZXJhdG9ycyBvbiBzd2FwKCkgYW5kIHBhc3MgdGhlIG1vdmVkIG9uZXMgb3Zlciwgd2hpbGUgU21hbGxWZWN0b3I8PgorLy8gICBtYXkgbGVhdmUgdGhlIGl0ZXJhdG9ycyBwb2ludGluZyB0byBub3doZXJlIGlmIHRoZXkgd2VyZSBmb3IgdGhlIGluLXBsYWNlCisvLyAgIGFycmF5IHN0b3JhZ2UuCisvLworLy8gQ3VycmVubHkgb25seSBhIGxpbWl0ZWQgc3Vic2V0IG9mIHN0ZDo6dmVjdG9yPD4ncyBvcGVyYXRpb25zIGlzIGltcGxlbWVudGVkLAorLy8gYnV0IGZpbGwgZnJlZSB0byBhZGQgdGhlIG9uZXMgeW91IG5lZWQuCisvLworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vCisvLyBGb3J3YXJkLWRlY2xhcmUgdGhlICdyZWFsJyBzbWFsbCB2ZWN0b3IgY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IFM+CitjbGFzcyBTbWFsbEZpeGVkVmVjdG9yOworCisvLworLy8gU21hbGxWZWN0b3I8VD4gLSBhbiBpbnRlcmZhY2UgZm9yIGEgc21hbGwtYnVmZmVyLW9wdGltaXplZCB2ZWN0b3IuCisvLyBJdCBoaWRlcyB0aGUgZml4ZWQgc2l6ZSBmcm9tIGl0cyB0eXBlLCBzbyBvbmUgY2FuIHVzZSBpdCB0byBwYXNzIHNtYWxsCisvLyB2ZWN0b3JzIGFyb3VuZCBhbmQgbm90IGxlYWsgdGhlIGJ1ZmZlciBzaXplIHRvIGFsbCBjYWxsZXJzOgorLy8KKy8vICB2b2lkIHByb2Nlc3MoU21hbGxWZWN0b3I8Rm9vPiYgZGF0YSk7CisvLyAgLi4uCisvLyAgLi4uCisvLyAgU21hbGxGaXhlZFZlY3RvcjxGb28sIDEwMD4gYUxpdHRsZUJpdE9mRm9vcyA9IC4uLjsKKy8vICBwcm9jZXNzKGFMaXR0bGVCaXRPZkZvb3MpOworLy8gIC4uLgorLy8gIFNtYWxsRml4ZWRWZWN0b3I8Rm9vLCAxMDAwPiBtb3JlRm9vcyA9IC4uLjsKKy8vICBwcm9jZXNzKG1vcmVGb29zKTsKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFNtYWxsVmVjdG9yIHsKKyAgICAvLyBNYWtlIHRoZW0gZnJpZW5kcyBzbyBTbWFsbEZpeGVkVmVjdG9yIGlzIGFibGUgdG8gcmVmZXIgdG8gU21hbGxWZWN0b3IncworICAgIC8vIHByb3RlY3RlZCBtZW1iZXJzIGluIHN0YXRpY19hc3NlcnQoKXMuCisgICAgdGVtcGxhdGUgPGNsYXNzIFUsIHNpemVfdCBTPgorICAgIGZyaWVuZCBjbGFzcyBTbWFsbEZpeGVkVmVjdG9yOworCitwdWJsaWM6CisgICAgLy8gQ29tbW9uIHNldCBvZiB0eXBlIGFsaWFzZXMuCisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisgICAgdXNpbmcgaXRlcmF0b3IgPSBUKjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IFQqOworICAgIHVzaW5nIHBvaW50ZXIgPSBUKjsKKyAgICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVCo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gVCY7CisgICAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gY29uc3QgVCY7CisgICAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworCisgICAgLy8gSXQncyBvayB0byBkZWxldGUgU21hbGxWZWN0b3I8PiB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzIC0gZHRvcigpIGFjdHVhbGx5CisgICAgLy8gdGFrZXMgY2FyZSBvZiBhbGwgbGl2aW5nIGVsZW1lbnRzIGFuZCB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAgICB+U21hbGxWZWN0b3IoKSB7IGR0b3IoKTsgfQorCisgICAgLy8gc3RkOjp2ZWN0b3I8PiBpbnRlcmZhY2Ugb3BlcmF0aW9ucy4KKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1CZWdpbjsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBtRW5kOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbUVuZDsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBtRW5kOyB9CisKKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGVuZCgpIC0gYmVnaW4oKTsgfQorICAgIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1DYXBhY2l0eTsgfQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBiZWdpbigpID09IGVuZCgpOyB9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgaSkgeyByZXR1cm4gKihiZWdpbigpICsgaSk7IH0KKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gKihjYmVnaW4oKSArIGkpOyB9CisKKyAgICBwb2ludGVyIGRhdGEoKSB7IHJldHVybiBtQmVnaW47IH0KKyAgICBjb25zdF9wb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBtQmVnaW47IH0KKyAgICBjb25zdF9wb2ludGVyIGNkYXRhKCkgY29uc3QgeyByZXR1cm4gbUJlZ2luOyB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICB2b2lkIGVtcGxhY2VfYmFjayhBcmdzJiYuLi4gYXJncykgeworICAgICAgICBncm93X2Zvcl9zaXplKHNpemUoKSArIDEpOworICAgICAgICBuZXcgKG1FbmQpIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICAgICAgKyttRW5kOworICAgIH0KKworICAgIHZvaWQgcHVzaF9iYWNrKGNvbnN0IFQmIHQpIHsgZW1wbGFjZV9iYWNrKHQpOyB9CisgICAgdm9pZCBwdXNoX2JhY2soVCYmIHQpIHsgZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZSh0KSk7IH0KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGRlc3RydWN0KGJlZ2luKCksIGVuZCgpKTsKKyAgICAgICAgbUVuZCA9IG1CZWdpbjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIG5ld0NhcCkgeworICAgICAgICBpZiAobmV3Q2FwIDw9IHRoaXMtPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZXRfY2FwYWNpdHkobmV3Q2FwKTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgbmV3U2l6ZSkgeyByZXNpemVfaW1wbDx0cnVlPihuZXdTaXplKTsgfQorCisgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIHJlc2l6aW5nIGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGVsZW1lbnRzCisgICAgLy8gVXNlZnVsIGZvciB0aGUgY2FzZXMgd2hlbiB2YWx1ZS1pbml0aWFsaXphdGlvbiBpcyBub3RpY2VhYmx5IHNsb3cgYW5kCisgICAgLy8gb25lIHdhbnRzIHRvIGRpcmVjdGx5IGNvbnN0cnVjdCBvciBtZW1jcHkgdGhlIGVsZW1lbnRzIGludG8gdGhlIHJlc2l6ZWQKKyAgICAvLyBwbGFjZS4KKyAgICB2b2lkIHJlc2l6ZV9ub2luaXQoc2l6ZV90eXBlIG5ld1NpemUpIHsgcmVzaXplX2ltcGw8ZmFsc2U+KG5ld1NpemUpOyB9CisKKyAgICAvLyBSZXR1cm5zIGlmIHRoZSBjdXJyZW50IHZlY3RvcidzIGJ1ZmZlciBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCisgICAgYm9vbCBpc0FsbG9jYXRlZCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmNiZWdpbigpICE9IHNtYWxsQnVmZmVyU3RhcnQoKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gSGlkZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBzbyBvbmx5IFNtYWxsRml4ZWRWZWN0b3IgY2FuIGJlCisgICAgLy8gaW5zdGFudGlhdGVkLgorICAgIFNtYWxsVmVjdG9yKCkgPSBkZWZhdWx0OworCisgICAgLy8gRGVzdHJveSBhbGwgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBhbmQgZnJlZSB0aGUgYXJyYXkgaWYgaXQgd2FzIGFsbG9jYXRlZAorICAgIC8vIGR5bmFtaWNhbGx5LgorICAgIHZvaWQgZHRvcigpIHsKKyAgICAgICAgdGhpcy0+ZGVzdHJ1Y3QodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworICAgICAgICBpZiAoaXNBbGxvY2F0ZWQoKSkgeworICAgICAgICAgICAgZnJlZSh0aGlzLT5tQmVnaW4pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSnVzdCBhIGNvbnZlbmllbmNlIHNldHRlciBmdW5jdGlvbiB0byBpbml0IGFsbCBtZW1iZXJzIGF0IG9uY2UuCisgICAgdm9pZCBpbml0KGl0ZXJhdG9yIGJlZ2luLCBpdGVyYXRvciBlbmQsIHNpemVfdHlwZSBjYXBhY2l0eSkgeworICAgICAgICB0aGlzLT5tQmVnaW4gPSBiZWdpbjsKKyAgICAgICAgdGhpcy0+bUVuZCA9IGVuZDsKKyAgICAgICAgdGhpcy0+bUNhcGFjaXR5ID0gY2FwYWNpdHk7CisgICAgfQorCisgICAgLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgZGlmZmVyZW50IHJlc2l6aW5nIHZlcnNpb25zLgorICAgIHRlbXBsYXRlIDxib29sIGluaXQ+CisgICAgdm9pZCByZXNpemVfaW1wbChzaXplX3R5cGUgbmV3U2l6ZSkgeworICAgICAgICBpZiAobmV3U2l6ZSA8IHRoaXMtPnNpemUoKSkgeworICAgICAgICAgICAgY29uc3QgYXV0byBuZXdFbmQgPSB0aGlzLT5iZWdpbigpICsgbmV3U2l6ZTsKKyAgICAgICAgICAgIHRoaXMtPmRlc3RydWN0KG5ld0VuZCwgdGhpcy0+ZW5kKCkpOworICAgICAgICAgICAgdGhpcy0+bUVuZCA9IG5ld0VuZDsKKyAgICAgICAgfSBlbHNlIGlmIChuZXdTaXplID4gdGhpcy0+c2l6ZSgpKSB7CisgICAgICAgICAgICBncm93X2Zvcl9zaXplKG5ld1NpemUpOworICAgICAgICAgICAgY29uc3QgYXV0byBuZXdFbmQgPSB0aGlzLT5iZWdpbigpICsgbmV3U2l6ZTsKKyAgICAgICAgICAgIGlmIChpbml0KSB7CisgICAgICAgICAgICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+ZW5kKCksIG5ld0VuZCwgVCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMtPm1FbmQgPSBuZXdFbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUZW1wbGF0ZWQgYXBwZW5kIG9wZXJhdGlvbiBmb3IgYSByYW5nZSBvZiBlbGVtZW50cy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcj4KKyAgICB2b2lkIGluc2VydF9iYWNrKEl0ZXIgYiwgSXRlciBlKSB7CisgICAgICAgIGlmIChiID09IGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBhdXRvIG5ld1NpemUgPSB0aGlzLT5zaXplKCkgKyAoZSAtIGIpOworICAgICAgICBncm93X2Zvcl9zaXplKG5ld1NpemUpOworICAgICAgICB0aGlzLT5tRW5kID0gc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoYiwgZSwgdGhpcy0+bUVuZCk7CisgICAgfQorCisgICAgLy8gTXVsdGlwbGljYXRpdmUgZ3JvdyBmb3IgdGhlIGludGVybmFsIGFycmF5IHNvIGl0IGNhbiBob2xkIHxuZXdTaXplfAorICAgIC8vIGVsZW1lbnRzLgorICAgIC8vIERvZXNuJ3QgY2hhbmdlIHNpemUoKSwgb25seSBjYXBhY2l0eSgpLgorICAgIHZvaWQgZ3Jvd19mb3Jfc2l6ZShzaXplX3R5cGUgbmV3U2l6ZSkgeworICAgICAgICAvLyBHcm93IGJ5IDEuNXggYnkgZGVmYXVsdC4KKyAgICAgICAgaWYgKG5ld1NpemUgPiBjYXBhY2l0eSgpKSB7CisgICAgICAgICAgICBzZXRfY2FwYWNpdHkoc3RkOjptYXgobmV3U2l6ZSwgY2FwYWNpdHkoKSArIGNhcGFjaXR5KCkgLyAyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXRzIHRoZSBjYXBhY2l0eSgpIHRvIGJlIGV4YWNseSB8bmV3Q2FwfC4gQWxsb2NhdGVzIHRoZSBhcnJheQorICAgIC8vIGR5bmFtaWNhbGx5LCBtb3ZlcyBhbGwgZWxlbWVudHMgb3ZlciBhbmQgKHBvdGVudGlhbGx5KSBkZWFsbG9jYXRlcyB0aGUKKyAgICAvLyBvbGQgYXJyYXkuCisgICAgLy8gRG9lc24ndCBjaGFuZ2Ugc2l6ZSgpLCBvbmx5IGNhcGFjaXR5KCkuCisgICAgdm9pZCBzZXRfY2FwYWNpdHkoc2l6ZV90eXBlIG5ld0NhcCkgeworICAgICAgICAvLyBIZXJlIHdlIGNhbiBvbmx5IGJlIHN3aXRjaGluZyB0byB0aGUgZHluYW1pYyB2ZWN0b3IsIGFzIHN0YXRpYyBvbmUKKyAgICAgICAgLy8gYWx3YXlzIGhhcyBpdHMgY2FwYWNpdHkgb24gdGhlIG1heGltdW0uCisgICAgICAgIGNvbnN0IGF1dG8gbmV3QmVnaW4gPSAoVCopbWFsbG9jKHNpemVvZihUKSAqIG5ld0NhcCk7CisgICAgICAgIGlmICghbmV3QmVnaW4pIHsKKyAgICAgICAgICAgIGFib3J0KCk7ICAvLyB3aGF0IGVsc2UgY2FuIHdlIGRvIGhlcmU/CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXV0byBuZXdFbmQgPSBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih0aGlzLT5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih0aGlzLT5lbmQoKSksIG5ld0JlZ2luKTsKKyAgICAgICAgZHRvcigpOworICAgICAgICB0aGlzLT5tQmVnaW4gPSBuZXdCZWdpbjsKKyAgICAgICAgdGhpcy0+bUVuZCA9IG5ld0VuZDsKKyAgICAgICAgdGhpcy0+bUNhcGFjaXR5ID0gbmV3Q2FwOworICAgIH0KKworICAgIC8vIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBkZXN0cnVjdG9yIGZvciBhIHJhbmdlIG9mIGVsZW1lbnRzLgorICAgIHN0YXRpYyB2b2lkIGRlc3RydWN0KFQqIGIsIFQqIGUpIHsKKyAgICAgICAgaWYgKCFzdGQ6OmlzX3RyaXZpYWxseV9kZXN0cnVjdGlibGU8VD46OnZhbHVlKSB7CisgICAgICAgICAgICBmb3IgKDsgYiAhPSBlOyArK2IpIHsKKyAgICAgICAgICAgICAgICBiLT5+VCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQnkgZGVzaWduIG9mIHRoZSBjbGFzcywgU21hbGxGaXhlZFZlY3Rvcjw+IHdpbGwgYmUgaW5oZXJpdGluZyBmcm9tCisgICAgLy8gU21hbGxWZWN0b3I8Piwgc28gaXRzIGluLXBsYWNlIHN0b3JhZ2UgYXJyYXkgaXMgZ29pbmcgdG8gYmUgdGhlIHZlcnkgbmV4dAorICAgIC8vIG1lbWJlciBhZnRlciB0aGUgbGFzdCBvbmUgaGVyZS4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhhdCBhZGRyZXNzLCBhbmQgU21hbGxGaXhlZFZlY3Rvcjw+IGhhcyBhIHN0YXRpYworICAgIC8vIGFzc2VydCB0byBtYWtlIHN1cmUgaXQgcmVtYWlucyBjb3JyZWN0LgorICAgIGNvbnN0ZXhwciBjb25zdCB2b2lkKiBzbWFsbEJ1ZmZlclN0YXJ0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gKGNvbnN0IHZvaWQqKSgmbUNhcGFjaXR5ICsgMSk7CisgICAgfQorCisgICAgLy8gU3RhbmRhcmQgc2V0IG9mIG1lbWJlcnMgZm9yIGEgdmVjdG9yIC0gYmVnaW4sIGVuZCBhbmQgY2FwYWNpdHkuCisgICAgLy8gVGhlc2UgcG9pbnQgdG8gdGhlIGN1cnJlbnRseSB1c2VkIGNodW5rIG9mIG1lbW9yeSwgbm8gbWF0dGVyIGlmIGl0J3MgYQorICAgIC8vIGhlYXAtYWxsb2NhdGVkIG9uZSBvciBhbiBpbi1wbGFjZSBhcnJheS4KKyAgICBpdGVyYXRvciBtQmVnaW47CisgICAgaXRlcmF0b3IgbUVuZDsKKyAgICBzaXplX3R5cGUgbUNhcGFjaXR5OworfTsKKworLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgU21hbGxWZWN0b3Igd2l0aCBhIGZpeGVkIGluLXBsYWNlIHNpemUsIHxTbWFsbFNpemV8LgordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBTbWFsbFNpemU+CitjbGFzcyBTbWFsbEZpeGVkVmVjdG9yIDogcHVibGljIFNtYWxsVmVjdG9yPFQ+IHsKKyAgICB1c2luZyBiYXNlID0gU21hbGxWZWN0b3I8VD47CisKK3B1YmxpYzoKKyAgICAvLyBHcmFiIHRoZXNlIGZyb20gdGhlIGJhc2UgY2xhc3MuCisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIGJhc2U6OnZhbHVlX3R5cGU7CisgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBiYXNlOjppdGVyYXRvcjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIGJhc2U6OmNvbnN0X2l0ZXJhdG9yOworICAgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBiYXNlOjpwb2ludGVyOworICAgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBiYXNlOjpjb25zdF9wb2ludGVyOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIGJhc2U6OnJlZmVyZW5jZTsKKyAgICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSB0eXBlbmFtZSBiYXNlOjpjb25zdF9yZWZlcmVuY2U7CisgICAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgYmFzZTo6c2l6ZV90eXBlOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3R5cGUga1NtYWxsU2l6ZSA9IFNtYWxsU2l6ZTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgLSBzZXQgdXAgYW4gZW1wdHkgdmVjdG9yIHdpdGggY2FwYWNpdHkgYXQgZnVsbAorICAgIC8vIGludGVybmFsIGFycmF5IHNpemUuCisgICAgU21hbGxGaXhlZFZlY3RvcigpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHNtYWxsIGFycmF5IHN0YXJ0cyBleGFjdGx5IHdoZXJlIGJhc2UgY2xhc3MKKyAgICAgICAgLy8gZXhwZWN0cyBpdDogcmlnaHQgYWZ0ZXIgdGhlIHxtQ2FwYWNpdHl8LgorICAgICAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKGJhc2UsIG1DYXBhY2l0eSkgKyBzaXplb2YoYmFzZTo6bUNhcGFjaXR5KSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihTbWFsbEZpeGVkVmVjdG9yLCBtRGF0YSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKERhdGEsIGFycmF5KSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICJTbWFsbEZpeGVkVmVjdG9yPD4gY2xhc3MgbGF5b3V0IGlzIHdyb25nLCAiCisgICAgICAgICAgICAgICAgICAgICAgInxtRGF0YXwgbmVlZHMgdG8gZm9sbG93IHxtQ2FwYWNpdHl8Iik7CisKKyAgICAgICAgaW5pdF9pbnBsYWNlKCk7CisgICAgfQorCisgICAgLy8gQ3RvciBmcm9tIGEgcmFuZ2Ugb2YgaXRlcmF0b3JzCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0ZXI+CisgICAgU21hbGxGaXhlZFZlY3RvcihJdGVyIGIsIEl0ZXIgZSkgOiBTbWFsbEZpeGVkVmVjdG9yKCkgeworICAgICAgICB0aGlzLT5pbnNlcnRfYmFjayhiLCBlKTsKKyAgICB9CisKKyAgICAvLyBDdG9yIGZyb20gYSByYW5nZSAtIGFueXRoaW5nIHRoYXQgaGFzIGJlZ2luIGFuZCBlbmQuCisgICAgLy8gTm90ZTogdGVtcGxhdGUgY29uc3RydWN0b3IgaXMgbmV2ZXIgYSBjb3B5L21vdmUtY3Rvci4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmFuZ2UsCisgICAgICAgICAgICAgIGNsYXNzID0gZW5hYmxlX2lmX2M8IXN0ZDo6aXNfc2FtZTxSYW5nZSwgVD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmFuZ2U8UmFuZ2U+Ojp2YWx1ZT4+CisgICAgZXhwbGljaXQgU21hbGxGaXhlZFZlY3Rvcihjb25zdCBSYW5nZSYgcikKKyAgICAgICAgOiBTbWFsbEZpeGVkVmVjdG9yKHN0ZDo6YmVnaW4ociksIHN0ZDo6ZW5kKHIpKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBSYW5nZSwKKyAgICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWZfYzwhc3RkOjppc19zYW1lPFJhbmdlLCBUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yYW5nZTxSYW5nZT46OnZhbHVlPj4KKyAgICBleHBsaWNpdCBTbWFsbEZpeGVkVmVjdG9yKFJhbmdlJiYgcikKKyAgICAgICAgOiBTbWFsbEZpeGVkVmVjdG9yKHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHN0ZDo6YmVnaW4ocikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Ioc3RkOjplbmQocikpKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBVLAorICAgICAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jb252ZXJ0aWJsZTxVLCBUPj4KKyAgICBTbWFsbEZpeGVkVmVjdG9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiBsaXN0KQorICAgICAgICA6IFNtYWxsRml4ZWRWZWN0b3Ioc3RkOjpiZWdpbihsaXN0KSwgc3RkOjplbmQobGlzdCkpIHt9CisKKworICAgIFNtYWxsRml4ZWRWZWN0b3IoY29uc3QgU21hbGxGaXhlZFZlY3RvciYgb3RoZXIpCisgICAgICAgIDogU21hbGxGaXhlZFZlY3RvcihvdGhlci5iZWdpbigpLCBvdGhlci5lbmQoKSkge30KKworICAgIFNtYWxsRml4ZWRWZWN0b3IoU21hbGxGaXhlZFZlY3RvciYmIG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlci5pc0FsbG9jYXRlZCgpKSB7CisgICAgICAgICAgICAvLyBKdXN0IHN0ZWFsIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGZyb20gdGhlIHxvdGhlcnwuCisgICAgICAgICAgICB0aGlzLT5tQmVnaW4gPSBvdGhlci5tQmVnaW47CisgICAgICAgICAgICB0aGlzLT5tRW5kID0gb3RoZXIubUVuZDsKKyAgICAgICAgICAgIHRoaXMtPm1DYXBhY2l0eSA9IG90aGVyLm1DYXBhY2l0eTsKKyAgICAgICAgICAgIG90aGVyLmluaXRfaW5wbGFjZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSGF2ZSB0byBtb3ZlIGluZGl2aWR1YWwgZWxlbWVudHMuCisgICAgICAgICAgICB0aGlzLT5tQmVnaW4gPSBtRGF0YS5hcnJheTsKKyAgICAgICAgICAgIHRoaXMtPm1FbmQgPSBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3Iob3RoZXIuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKG90aGVyLmVuZCgpKSwgdGhpcy0+YmVnaW4oKSk7CisgICAgICAgICAgICB0aGlzLT5tQ2FwYWNpdHkgPSBrU21hbGxTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgU21hbGxGaXhlZFZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IFNtYWxsRml4ZWRWZWN0b3ImIG90aGVyKSB7CisgICAgICAgIGlmICgmb3RoZXIgIT0gdGhpcykgeworICAgICAgICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMtPmluc2VydF9iYWNrKG90aGVyLmJlZ2luKCksIG90aGVyLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU21hbGxGaXhlZFZlY3RvciYgb3BlcmF0b3I9KFNtYWxsRml4ZWRWZWN0b3ImJiBvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuaXNBbGxvY2F0ZWQoKSkgeworICAgICAgICAgICAgLy8gU3RlYWwgaXQgYW5kIHdlJ3JlIGRvbmUuCisgICAgICAgICAgICB0aGlzLT5kdG9yKCk7CisgICAgICAgICAgICB0aGlzLT5tQmVnaW4gPSBvdGhlci5tQmVnaW47CisgICAgICAgICAgICB0aGlzLT5tRW5kID0gb3RoZXIubUVuZDsKKyAgICAgICAgICAgIHRoaXMtPm1DYXBhY2l0eSA9IG90aGVyLm1DYXBhY2l0eTsKKyAgICAgICAgICAgIG90aGVyLmluaXRfaW5wbGFjZSgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMtPmlzQWxsb2NhdGVkKCkgJiYgdGhpcy0+bUNhcGFjaXR5IDwgb3RoZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBOb3QgZW5vdWdoIGR5bmFtaWMgbWVtb3J5LCBzd2l0Y2ggdG8gaW4tcGxhY2UuCisgICAgICAgICAgICB0aGlzLT5kdG9yKCk7CisgICAgICAgICAgICBpbml0X2lucGxhY2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY291bGQgcG90ZW50aWFsbHkgYmUgaW1wcm92ZWQgYnkgbW92ZS1hc3NpZ25pbmcKKyAgICAgICAgICAgIC8vIG9ubHkgbmVlZGVkIGl0ZW1zIGFuZCBkZXN0cm95aW5nIHRoZSByZXN0LCBidXQKKyAgICAgICAgICAgIC8vIGRlc3Ryb3ktYWxsK2NvbnN0cnVjdC1hbGwgaXMganVzdCBzaW1wbGVyLiBGb3IgUE9EcyBpdCBhY3R1YWxseQorICAgICAgICAgICAgLy8gaXMgZXZlbiBmYXN0ZXIgYXMgaXQncyBhbHdheXMgYSBzaW5nbGUgbWVtY3B5KCkuCisgICAgICAgICAgICB0aGlzLT5kZXN0cnVjdCh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNb3ZlIHRoZSB3aG9sZSB8b3RoZXJ8IGludG8gdGhlIHByZS1jbGVhbmVkIG1lbW9yeQorICAgICAgICBjb25zdCBhdXRvIG5ld0VuZCA9IHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKG90aGVyLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKG90aGVyLmVuZCgpKSwgdGhpcy0+bUJlZ2luKTsKKyAgICAgICAgdGhpcy0+bUVuZCA9IG5ld0VuZDsKKyAgICAgICAgLy8gfG90aGVyfCBpcyB2YWxpZCBhcy1pcy4KKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgdHJ5aW5nIHRvIG1vdmUgZnJvbSBhbiBpbnRlcmZhY2UgLSBpdCdzIGp1c3QKKyAgICAvLyBpbmVmZmljaWVudCB3aXRoIHRoZSBjdXJyZW50IGNvZGUuCisgICAgU21hbGxGaXhlZFZlY3RvcihiYXNlJiYgb3RoZXIpID0gZGVsZXRlOworICAgIFNtYWxsRml4ZWRWZWN0b3ImIG9wZXJhdG9yPShiYXNlJiYgb3RoZXIpID0gZGVsZXRlOworCitwcml2YXRlOgorICAgIC8vIEEgc2hvcnRjdXQgZm9yIGluaXRpYWxpemF0aW9uIGZvciBpbi1wbGFjZSBzdG9yYWdlLgorICAgIHZvaWQgaW5pdF9pbnBsYWNlKCkgeyB0aGlzLT5pbml0KG1EYXRhLmFycmF5LCBtRGF0YS5hcnJheSwga1NtYWxsU2l6ZSk7IH0KKworICAgIC8vIEEgdW5pb24gd2l0aCBlbXB0eSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBtYWtlcyBzdXJlIHRoYXQgdGhlIGFycmF5CisgICAgLy8gZWxlbWVudHMgYXJlIG5vdCBkZWZhdWx0LWNvbnN0cnVjdGVkIGluIGN0b3IgYW5kIG5vdCBkZXN0cnVjdGVkIGluIGR0b3I6CisgICAgLy8gdGhlIGNsYXNzIG5lZWRzIHRvIGJlIGFibGUgbWFuYWdlIHRoZWlyIGxpZmV0aW1lIG1vcmUgcHJlY2lzZWx5LgorICAgIHVuaW9uIERhdGEgeworICAgICAgICBhbGlnbmFzKHNpemVfdHlwZSkgVCBhcnJheVtrU21hbGxTaXplXTsKKworICAgICAgICBEYXRhKCkge30KKyAgICAgICAgfkRhdGEoKSB7fQorICAgIH0gbURhdGE7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU21hbGxWZWN0b3JfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TbWFsbFZlY3Rvcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4NWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU21hbGxWZWN0b3JfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjIyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL1NtYWxsVmVjdG9yLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL0dUZXN0VXRpbHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChTbWFsbFZlY3RvciwgYmFzaWMpIHsKKyAgICBTbWFsbEZpeGVkVmVjdG9yPGNoYXIsIDEwPiBzdjsKKyAgICBFWFBFQ1RfRVEoc3Yuc2l6ZSgpLCAwKTsKKyAgICBFWFBFQ1RfVFJVRShzdi5lbXB0eSgpKTsKKworICAgIEVYUEVDVF9FUSgxMCwgc3YuY2FwYWNpdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN2LmlzQWxsb2NhdGVkKCkpOworCisgICAgY29uc3QgaW50IHZhbHVlc1tdID0gezEsIDIsIDN9OworICAgIHN2ID0gU21hbGxGaXhlZFZlY3RvcjxjaGFyLCAxMD4odmFsdWVzLCB2YWx1ZXMgKyAzKTsKKyAgICBFWFBFQ1RfRVEoMywgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3YuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDEwLCBzdi5jYXBhY2l0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3YuaXNBbGxvY2F0ZWQoKSk7CisgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2godmFsdWVzLCBzdikpOworCisgICAgc3YuY2xlYXIoKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShzdi5lbXB0eSgpKTsKKworICAgIGNvbnN0IGNoYXIgc3RyW10gPSAidGhpcyBpcyBhIGxvbmcgc3RyaW5nIGZvciBpbnNlcnRpb24iOworICAgIHN2ID0gU21hbGxGaXhlZFZlY3RvcjxjaGFyLCAxMD4oc3RyKTsKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKHN0ciksIHN2LnNpemUoKSk7CisgICAgRVhQRUNUX0dUKHN2LmNhcGFjaXR5KCksIDEwKTsKKyAgICBFWFBFQ1RfVFJVRShzdi5pc0FsbG9jYXRlZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShSYW5nZXNNYXRjaChzdHIsIHN2KSk7CisKKyAgICAvLyBtYWtlIHN1cmUgZXhwbGljaXQgbG9vcHMgb3ZlciBpbmRpY2VzIGFuZCBpdGVyYXRvcnMgd29yaworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IHN2LnNpemUoKTsgKytpKSB7CisgICAgICAgIEVYUEVDVF9FUShzdHJbaV0sIHN2W2ldKTsKKyAgICB9CisgICAgY29uc3QgY2hhciogYyA9IHN0cjsKKyAgICBmb3IgKGF1dG8gaSA6IHN2KSB7CisgICAgICAgIEVYUEVDVF9FUSgqYysrLCBpKTsKKyAgICB9CisgICAgYyA9IHN0cjsKKyAgICBmb3IgKGF1dG8gaXQgPSBzdi5iZWdpbigpOyBpdCAhPSBzdi5lbmQoKTsgKytpdCwgKytjKSB7CisgICAgICAgIEVYUEVDVF9FUSgqYywgKml0KTsKKyAgICB9CisKKyAgICBjID0gc3RyOworICAgIGZvciAoYXV0byBpdCA9IHN2LmRhdGEoKTsgaXQgIT0gc3YuZGF0YSgpICsgc3Yuc2l6ZSgpOyArK2l0LCArK2MpIHsKKyAgICAgICAgRVhQRUNUX0VRKCpjLCAqaXQpOworICAgIH0KK30KKworVEVTVChTbWFsbFZlY3RvciwgY3RvcikgeworICAgIHsKKyAgICAgICAgU21hbGxGaXhlZFZlY3RvcjxpbnQsIDE+IHN2OworICAgICAgICBFWFBFQ1RfRVEoc3Yuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0IGludCB2YWx1ZXNbXSA9IHsxLCAyLCAzfTsKKyAgICAgICAgU21hbGxGaXhlZFZlY3RvcjxpbnQsIDEwPiBzdih2YWx1ZXMsIHZhbHVlcyArIDMpOworICAgICAgICBFWFBFQ1RfVFJVRShSYW5nZXNNYXRjaCh2YWx1ZXMsIHN2KSk7CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdCBpbnQgdmFsdWVzW10gPSB7MSwgMiwgM307CisgICAgICAgIFNtYWxsRml4ZWRWZWN0b3I8aW50LCAxMD4gc3YodmFsdWVzKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2godmFsdWVzLCBzdikpOworICAgIH0KKworICAgIHsKKyAgICAgICAgY29uc3QgaW50IHZhbHVlc1tdID0gezEsIDIsIDN9OworICAgICAgICBTbWFsbEZpeGVkVmVjdG9yPGludCwgMTA+IHN2KHZhbHVlcyk7CisgICAgICAgIEVYUEVDVF9UUlVFKFJhbmdlc01hdGNoKHZhbHVlcywgc3YpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNvbnN0IGludCB2YWx1ZXNbXSA9IHsxLCAyLCAzfTsKKyAgICAgICAgU21hbGxGaXhlZFZlY3RvcjxpbnQsIDEwPiBzdiA9IHsxLCAyLCAzfTsKKyAgICAgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2godmFsdWVzLCBzdikpOworICAgIH0KKworICAgIHsKKyAgICAgICAgY29uc3QgaW50IHZhbHVlc1tdID0gezEsIDIsIDN9OworICAgICAgICBTbWFsbEZpeGVkVmVjdG9yPGludCwgMTA+IHN2MSh2YWx1ZXMpOworICAgICAgICBTbWFsbEZpeGVkVmVjdG9yPGludCwgMTA+IHN2MihzdjEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKFJhbmdlc01hdGNoKHZhbHVlcywgc3YxKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKFJhbmdlc01hdGNoKHN2Miwgc3YxKSk7CisKKyAgICAgICAgU21hbGxGaXhlZFZlY3RvcjxpbnQsIDEwPiBzdjMoc3RkOjptb3ZlKHN2MSkpOworICAgICAgICBFWFBFQ1RfVFJVRShSYW5nZXNNYXRjaChzdjMsIHZhbHVlcykpOworICAgICAgICAvLyBkb24ndCBjaGVjayB8c3YxfCAtIGl0IGlzIG5vdCByZXF1aXJlZCB0byBiZSBlbXB0eS4KKyAgICB9Cit9CisKK1RFU1QoU21hbGxWZWN0b3IsIGR0b3IpIHsKKyAgICAvLyBDb3VudCBhbGwgZGVzdHJ1Y3RvciBjYWxscyBmb3IgdGhlIGVsZW1lbnRzIGFuZCBtYWtlIHN1cmUgdGhleSdyZSBjYWxsZWQKKyAgICAvLyBlbm91Z2ggdGltZXMuCisgICAgaW50IGRlc3RydWN0ZWRUaW1lcyA9IDA7CisgICAgYXV0byBkZWxldGVyID0gW10oaW50KiBwKSB7ICsrKCpwKTsgfTsKKyAgICBhdXRvIGl0ZW0xID0gbWFrZUN1c3RvbVNjb3BlZFB0cigmZGVzdHJ1Y3RlZFRpbWVzLCBkZWxldGVyKTsKKyAgICBhdXRvIGl0ZW0yID0gbWFrZUN1c3RvbVNjb3BlZFB0cigmZGVzdHJ1Y3RlZFRpbWVzLCBkZWxldGVyKTsKKyAgICBhdXRvIGl0ZW0zID0gbWFrZUN1c3RvbVNjb3BlZFB0cigmZGVzdHJ1Y3RlZFRpbWVzLCBkZWxldGVyKTsKKworICAgIHsKKyAgICAgICAgU21hbGxGaXhlZFZlY3RvcjxkZWNsdHlwZShpdGVtMSksIDE+IHN2OworICAgICAgICBzdi5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGl0ZW0xKSk7CisgICAgICAgIHN2LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoaXRlbTIpKTsKKyAgICAgICAgLy8gdGhpcyBvbmUgaXMgYWxyZWFkeSBlbXB0eSwgc28gaXQgd29uJ3QgYWRkIHRvIHxkZXN0cnVjdGVkVGltZXN8LgorICAgICAgICBzdi5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGl0ZW0yKSk7CisgICAgICAgIHN2LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoaXRlbTMpKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoMywgZGVzdHJ1Y3RlZFRpbWVzKTsKK30KKworVEVTVChTbWFsbFZlY3RvciwgbW9kaWZpZXJzKSB7CisgICAgU21hbGxGaXhlZFZlY3Rvcjx1bnNpZ25lZCwgNT4gc3Y7CisKKyAgICBFWFBFQ1RfRVEoMCwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgc3YuY2FwYWNpdHkoKSk7CisKKyAgICBzdi5yZXNlcnZlKDQpOworICAgIEVYUEVDVF9FUSgwLCBzdi5zaXplKCkpOworICAgIEVYUEVDVF9FUSg1LCBzdi5jYXBhY2l0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3YuaXNBbGxvY2F0ZWQoKSk7CisKKyAgICBzdi5yZXNlcnZlKDYpOworICAgIEVYUEVDVF9FUSgwLCBzdi5zaXplKCkpOworICAgIEVYUEVDVF9FUSg2LCBzdi5jYXBhY2l0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRShzdi5pc0FsbG9jYXRlZCgpKTsKKworICAgIHN2LnJlc2l6ZSgzKTsKKyAgICBFWFBFQ1RfRVEoMywgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNiwgc3YuY2FwYWNpdHkoKSk7CisgICAgRVhQRUNUX1RSVUUoc3YuaXNBbGxvY2F0ZWQoKSk7CisKKyAgICBzdi5yZXNpemUoMTApOworICAgIEVYUEVDVF9FUSgxMCwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfR0Uoc3YuY2FwYWNpdHkoKSwgMTApOworICAgIEVYUEVDVF9UUlVFKHN2LmlzQWxsb2NhdGVkKCkpOworCisgICAgc3YucHVzaF9iYWNrKDEpOworICAgIEVYUEVDVF9FUSgxMSwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfR0Uoc3YuY2FwYWNpdHkoKSwgMTEpOworCisgICAgc3YuZW1wbGFjZV9iYWNrKDIpOworICAgIEVYUEVDVF9FUSgxMiwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfR0Uoc3YuY2FwYWNpdHkoKSwgMTIpOworCisgICAgc3YuY2xlYXIoKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3Yuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfR0Uoc3YuY2FwYWNpdHkoKSwgMTIpOworCisgICAgLy8gcmVzaXplX25vaW5pdCgpIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYW55dGhpbmcgc3BlY2lmaWMgd2UgY2FuIHRlc3QKKyAgICAvLyBjb21wYXJlZCB0byByZXNpemUoKQorICAgIHN2LnJlc2l6ZV9ub2luaXQoMSk7CisgICAgRVhQRUNUX0VRKDEsIHN2LnNpemUoKSk7CisgICAgRVhQRUNUX0dFKHN2LmNhcGFjaXR5KCksIDEyKTsKKworICAgIHN2LnJlc2l6ZV9ub2luaXQoMTAwKTsKKyAgICBFWFBFQ1RfRVEoMTAwLCBzdi5zaXplKCkpOworICAgIEVYUEVDVF9HRShzdi5jYXBhY2l0eSgpLCAxMDApOworCisgICAgU21hbGxGaXhlZFZlY3RvcjxzdGQ6OnN0cmluZywgNT4gc3RyaW5ncyA9IHsiYSIsICJiIiwgImMifTsKKyAgICBzdHJpbmdzLmVtcGxhY2VfYmFjaygiZCIpOworICAgIHN0cmluZ3MucHVzaF9iYWNrKCJlIik7CisgICAgRVhQRUNUX0VRKDUsIHN0cmluZ3Muc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoNSwgc3RyaW5ncy5jYXBhY2l0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyaW5ncy5pc0FsbG9jYXRlZCgpKTsKKworICAgIHN0cmluZ3MucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCJlIikpOworICAgIEVYUEVDVF9FUSg2LCBzdHJpbmdzLnNpemUoKSk7CisgICAgRVhQRUNUX0dFKHN0cmluZ3MuY2FwYWNpdHkoKSwgNik7CisgICAgRVhQRUNUX1RSVUUoc3RyaW5ncy5pc0FsbG9jYXRlZCgpKTsKK30KKworVEVTVChTbWFsbFZlY3RvciwgdXNlVGhyb3VnaEludGVyZmFjZSkgeworICAgIFNtYWxsRml4ZWRWZWN0b3I8aW50LCAxMD4gc2Z2ID0gezEsIDIsIDN9OworICAgIFNtYWxsVmVjdG9yPGludD4mIHN2ID0gc2Z2OworICAgIEVYUEVDVF9UUlVFKFJhbmdlc01hdGNoKHN2LCBzZnYpKTsKKyAgICBFWFBFQ1RfRVEoc3YuaXNBbGxvY2F0ZWQoKSwgc2Z2LmlzQWxsb2NhdGVkKCkpOworCisgICAgc3YucmVzZXJ2ZSgyMCk7CisgICAgRVhQRUNUX1RSVUUoc3YuaXNBbGxvY2F0ZWQoKSk7CisgICAgRVhQRUNUX0VRKHN2LmlzQWxsb2NhdGVkKCksIHNmdi5pc0FsbG9jYXRlZCgpKTsKKworICAgIC8vIG5vdyBtYWtlIHN1cmUgdGhhdCBkZWxldGluZyB0aHJvdWdoIGJhc2UgY2xhc3MgY2xlYW5zIHVwIHRoZSBtZW1vcnkKKyAgICB7CisgICAgICAgIGludCBkZXN0cnVjdGVkVGltZXMgPSAwOworICAgICAgICBhdXRvIGRlbGV0ZXIgPSBbXShpbnQqIHApIHsgKysoKnApOyB9OworICAgICAgICBhdXRvIGl0ZW0xID0gbWFrZUN1c3RvbVNjb3BlZFB0cigmZGVzdHJ1Y3RlZFRpbWVzLCBkZWxldGVyKTsKKyAgICAgICAgYXV0byBpdGVtMiA9IG1ha2VDdXN0b21TY29wZWRQdHIoJmRlc3RydWN0ZWRUaW1lcywgZGVsZXRlcik7CisgICAgICAgIFNtYWxsVmVjdG9yPGRlY2x0eXBlKGl0ZW0xKT4qIHN2ID0KKyAgICAgICAgICAgICAgICBuZXcgU21hbGxGaXhlZFZlY3RvcjxkZWNsdHlwZShpdGVtMSksIDE+KCk7CisgICAgICAgIHN2LT5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0xKSk7CisgICAgICAgIHN2LT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGl0ZW0yKSk7CisgICAgICAgIGRlbGV0ZSBzdjsKKyAgICAgICAgRVhQRUNUX0VRKDIsIGRlc3RydWN0ZWRUaW1lcyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAgLy8gbmFtZXNwYWNlIGJhc2UKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU3RyaW5nVmVjdG9yLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1N0cmluZ1ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTYwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1N0cmluZ1ZlY3Rvci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQWxpYXMgdXNlZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiBSZW1vdmUgdGhpcyBvbmNlIGFsbCBjbGllbnQgY29kZQorLy8gaGFzIGJlZW4gdXBkYXRlZCB0byB1c2Ugc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRpcmVjdGx5LgordXNpbmcgU3RyaW5nVmVjdG9yID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvVGFpbFF1ZXVlTGlzdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvY29udGFpbmVycy9UYWlsUXVldWVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MTliNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvVGFpbFF1ZXVlTGlzdC5oCkBAIC0wLDAgKzEsMzMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBDb252ZW5pZW5jZSBjbGFzc2VzIGFuZCBtYWNyb3MgdG8gZGVmaW5lIGdlbmVyaWMgdGFpbC1xdWV1ZSBsaXN0cy4KKy8vCisvLyBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZXNlIGxpc3RzIHBlcmZvcm0gcG9vcmx5IG9uIG1vZGVybiBDUFVzIHNpbmNlIHRoZWlyCisvLyB1c2UgY2FuIGludHJvZHVjZSBjYWNoZSB0cmFzaGluZyBhdCBydW50aW1lLiBIb3dldmVyLCB0aGV5J3JlIHN0aWxsCisvLyBlZmZpY2llbnQgaWYgb25lIHdhbnRzIHRvIHF1aWNrbHkgYW5kIG9mdGVuIHJlbW92ZSBsaWJlcmFsIGl0ZW1zIGZyb20KKy8vIHRoZSBsaXN0IGluIGFuIE8oMSkgd2F5LgorLy8KKy8vIFVzYWdlIGV4YW1wbGU6CisvLworLy8gICAxLyBUaGUgdHlwZSBvZiBlYWNoIGl0ZW0gaW4gdGhlIGxpc3QgbXVzdCBoYXZlIGEgVGFpbFF1ZXVlTGluazxUPiBmaWVsZCwKKy8vICAgICAgY2FsbGVkIHRoZSAnbGluaycsICB3aGljaCBpcyB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBzdG9yZQorLy8gICAgICBvcGFxdWUgcXVldWUtcmVsYXRlZCBmaWVsZHMuIEZvciBleGFtcGxlOgorLy8KKy8vICAgICAgc3RydWN0IEZvbyB7CisvLyAgICAgICAgICBGb28oKSB7IC4uLiB9CisvLyAgICAgICAgICBUYWlsUXVldWVMaW5rPEZvbz4gbUxpbms7CisvLyAgICAgIH0KKy8vCisvLyAgIDIvIFRoZSB0eXBlIG11c3QgYWxzbyBoYXZlIGEgcHVibGljIFRyYWl0cyBzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcworLy8gICAgICBhIHNpbmdsZSBmdW5jdGlvbiBuYW1lZCBsaW5rKCkgdXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYQorLy8gICAgICBsaW5rLiBPbmUgd2F5IHRvIGRlZmluZSBpdCBpcyB0byB1c2UgdGhlIG1hY3JvOgorLy8KKy8vICAgICAgICAgIFRBSUxfUVVFVUVfTElTVF9UUkFJVFMoVHJhaXRzLCBGb28sIG1MaW5rKTsKKy8vCisvLyAgICAgIHdoaWNoIGRlZmluZXMgdGhlIHxUcmFpdHN8IHN0cnVjdHVyZSB0aGF0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YKKy8vICAgICAgRm9vOjptTGluayBpbnNpZGUgYSBGb28gaW5zdGFuY2UuIElmIHlvdSBkb24ndCB3YW50IHRvIHVzZSB0aGUKKy8vICAgICAgbWFjcm8sIHRoZSBkZWZpbml0aW9uIG11c3QgYmU6CisvLworLy8gICAgICAgICAgc3RydWN0IFRyYWl0cyB7CisvLyAgICAgICAgICAgICAgc3RhdGljIGlubGluZSBUYWlsUXVldWVMaW5rPEZvbz4qIGxpbmsoRm9vKiBmb28pIHsKKy8vICAgICAgICAgICAgICAgICAgcmV0dXJuICZmb28tPm1MaW5rOworLy8gICAgICAgICAgICAgIH0KKy8vICAgICAgICAgIH07CisvLworLy8gICAzLyBEZWZpbmUgdGhlIHRhaWwtcXVldWUtbGlzdCB0eXBlIHdpdGg6CisvLworLy8gICAgICAgICAgdHlwZWRlZiBUYWlsUXVldWVMaXN0PEZvbz4gRm9vTGlzdDsKKy8vCisvLyAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgcmVsaWVzIG9uIEZvbzo6VHJhaXRzIGJlaW5nIGRlZmluZWQsIGl0IGlzIHBvc3NpYmxlCisvLyAgICAgIHRvIGdpdmUgdGhlIG5hbWUgb2YgYSBkaWZmZXJlbnQgVHJhaXRzIHN0cnVjdHVyZSBhcyBhIHNlY29uZCB0ZW1wbGF0ZQorLy8gICAgICBwYXJhbWV0ZXIuIFRoaXMgaXMgdXNlZnVsIGlmIGEgc2luZ2xlIG9iamVjdCBjYW4gYWN0dWFsbHkgYmUKKy8vICAgICAgY29udGFpbmVkIGluc2lkZSB0d28gcGFyYWxsZWwgbGlzdHMsIGFzIGluOgorLy8KKy8vICAgICAgICAgIGNsYXNzIEJhciB7CisvLyAgICAgICAgICBwdWJsaWM6CisvLyAgICAgICAgICAgICAgQmFyKCkgeyAuLi4gfQorLy8KKy8vICAgICAgICAgICAgICBUQUlMX1FVRVVFX0xJU1RfVFJBSVRTKFRyYWl0czEsIEJhciwgbUxpbmsxKTsKKy8vICAgICAgICAgICAgICBUQUlMX1FVRVVFX0xJU1RfVFJBSVRTKFRyYWl0czIsIEJhciwgbUxpbmsyKTsKKy8vICAgICAgICAgIHByaXZhdGU6CisvLyAgICAgICAgICAgICAgVGFpbFF1ZXVlTGluazxCYXI+IG1MaW5rMTsKKy8vICAgICAgICAgICAgICBUYWlsUXVldWVMaW5rPEJhcj4gbUxpbmsyOworLy8gICAgICAgICAgICAgIC4uLgorLy8gICAgICAgICAgfTsKKy8vCisvLyAgICAgICAgICB0eXBlZGVmIFRhaWxRdWV1ZUxpc3Q8QmFyLCBUcmFpdHMxPiAgQmFyTGlzdDE7CisvLyAgICAgICAgICB0eXBlZGVmIFRhaWxRdWV1ZUxpc3Q8QmFyLCBUcmFpdHMyPiAgQmFyTGlzdDI7CisvLworLy8gICA0LyBPbmUgY2FuIHVzZSB0aGUgbGluaydzIG5leHQoKSBtZXRob2QgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgbmV4dAorLy8gICAgICBpdGVtIGluIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgaXRlbS4gRm9yIGV4YW1wbGUsIHRoZQorLy8gICAgICBmb2xsb3dpbmcgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGFsbCBpdGVtcyBmcm9tIGEgcXVldWUgaWYgfG1MaW5rfCBpcworLy8gICAgICBhIHB1YmxpYyBmaWVsZC4KKy8vCisvLyAgICAgICAgICBGb29MaXN0KiBxdWV1ZSA9IC4uLjsKKy8vICAgICAgICAgIEZvbyogZm9vID0gcXVldWUtPmZyb250KCk7CisvLyAgICAgICAgICB3aGlsZSAoZm9vKSB7CisvLyAgICAgICAgICAgICAgRm9vKiBuZXh0ID0gZm9vLT5tTGluay5uZXh0KCk7CisvLyAgICAgICAgICAgICAgcXVldWUtPnJlbW92ZShmb28pOworLy8gICAgICAgICAgICAgIGZvbyA9IG5leHQ7CisvLyAgICAgICAgICB9CisvLworLy8gICAgICBJZiB0aGUgZmllbGQgaXMgcHJpdmF0ZSwgY29uc2lkZXIgYWRkaW5nIGFuIGFwcHJvcHJpYXRlIHB1YmxpYworLy8gICAgICBtZXRob2QgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIEZvbywgYXMgaW46CisvLworLy8gICAgICAgICAgY2xhc3MgRm9vIHsKKy8vICAgICAgICAgIHB1YmxpYzoKKy8vICAgICAgICAgICAgICBGb28oKSAuLi47CisvLyAgICAgICAgICAgICAgRm9vKiBuZXh0SW5MaXN0KCkgY29uc3QgeyByZXR1cm4gbUxpbmsubmV4dCgpOyB9CisvLyAgICAgICAgICBwcml2YXRlOgorLy8gICAgICAgICAgICAgIFRhaWxRdWV1ZUxpbms8Rm9vPiBtTGluazsKKy8vICAgICAgICAgICAgICAuLi4KKy8vICAgICAgICAgIH07CisvLworLy8gICAgICBUaGVuIHVzZSBmb28tPm5leHRJbkxpc3QoKSB3aXRoaW4gdGhlIGxvb3AgaW5zdGVhZCBvZiBmb28tPm1MaW5rLm5leHQoKQorLy8KKworLy8gVGVtcGxhdGUgY2xhc3MgZm9yIGxpbmsgZmllbGRzIGluc2lkZSBvYmplY3RzIHRoYXQgYmVsb25nIHRvIGEKKy8vIHRhaWwtcXVldWUgbGlzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgVGFpbFF1ZXVlTGluayB7CitwdWJsaWM6CisgICAgVGFpbFF1ZXVlTGluaygpIDogbU5leHQoTlVMTCksIG1QcmV2UG9pbnRlcihOVUxMKSB7fQorCisgICAgflRhaWxRdWV1ZUxpbmsoKSB7fQorCisgICAgVCogbmV4dCgpIGNvbnN0IHsgcmV0dXJuIG1OZXh0OyB9CisKKyAgICBib29sIGluUXVldWUoKSBjb25zdCB7IHJldHVybiAhIW1QcmV2UG9pbnRlcjsgfQorCisgICAgYm9vbCBpc0xhc3QoKSBjb25zdCB7IHJldHVybiAhbU5leHQ7IH0KKworICAgIC8vIFRoZXNlIGZpZWxkcyBhcmUgcHVibGljIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBUYWlsUXVldWVMaXN0PD4KKyAgICAvLyB0byBhY2Nlc3MgdGhlbS4KKyAgICBUKiBtTmV4dDsKKyAgICBUKiogbVByZXZQb2ludGVyOworfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIGNsYXNzIGZvciB0YWlsLXF1ZXVlIGxpc3QgaW5zdGFuY2VzLgorLy8gfFR8IGlzIHRoZSB0eXBlIG9mIG9iamVjdHMgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3QuCisvLyB8VFJBSVRTfCBpcyB0aGUgdHlwZSBvZiBhIHN0cnVjdHVyZSB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlCisvLyBtZXRob2QgdGhhdCBpczoKKy8vCisvLyAgICBzdGF0aWMgVGFpbFF1ZXVlTGluazxUPiogbGluayhUKiB0KSBjb25zdDsKKy8vCisvLyBEbyBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHksIHVzZSB0aGUgREVDTEFSRV9UQUlMX1FVRVVFX0xJU1RfQ0xBU1MKKy8vIG1hY3JvIGluc3RlYWQsIGFzIGRlZmluZWQgYmVsb3cuCisvLworLy8gTm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0aGUgc2l6ZSBhbmQgZmllbGQKKy8vIGxheW91dCBvZiBhIFRhaWxRdWV1ZUxpc3Q8VCxPRkZTRVQ+IGlzIGlkZW50aWNhbCB0byB0aGUgb25lIG9mIGEKKy8vIFRhaWxRdWV1ZUxpc3RCYXNlLiBUaGlzIGNvbnNpZGVyYWJseSByZWR1Y2VzIHRlbXBsYXRlIGluc3RhbnRpYXRpb24KKy8vIGJsb2F0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRSQUlUUyA9IHR5cGVuYW1lIFQ6OlRyYWl0cz4KK2NsYXNzIFRhaWxRdWV1ZUxpc3QgeworcHVibGljOgorICAgIC8vIENvbnZlbmllbmNlIHR5cGVkZWYgZm9yIGxpbmsgdHlwZXMuCisgICAgdHlwZWRlZiBUYWlsUXVldWVMaW5rPFQ+IExpbmtUeXBlOworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbml0aWFsaXplcyBhbiBlbXB0eSB0YWlsLXF1ZXVlIGxpc3QuCisgICAgVGFpbFF1ZXVlTGlzdCgpIDogbUhlYWQoTlVMTCksIG1UYWlsKCZtSGVhZCkge30KKworICAgIC8vIERlZmF1bHQgZGVzdHJ1Y3RvciBkb2Vzbid0IGRvIGFueXRoaW5nLgorICAgIH5UYWlsUXVldWVMaXN0KCkge30KKworICAgIC8vIFJldHVybnMgdHJ1ZWUgaWZmIHRoZSBsaXN0IGlzIGVtcHR5LgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGVhZCA9PSBOVUxMOworICAgIH0KKworICAgIC8vIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGxpc3QsIG9yIE5VTEwgaWYgaXQKKyAgICAvLyBpcyBlbXB0eS4gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIGxpc3QuCisgICAgVCogZnJvbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGVhZDsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpc3QsIG9yIE5VTEwgaWYgaXQKKyAgICAvLyBpcyBlbXB0eS4gVGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIGxpc3QuCisgICAgVCogbGFzdCgpIGNvbnN0IHsKKyAgICAgICAgLy8gVGVjaG5pY2FsIG5vdGU6IG1UYWlsIHBvaW50cyB0byBlaXRoZXIgYSBsaW5rIGluc2lkZSB0aGUgbGFzdAorICAgICAgICAvLyBpdGVtLCBvciB0aGUgbUhlYWQuIERlcmVmZW5jaW5nIHRoZSB2YWx1ZSB3aWxsIHBvaW50IHRvIHRoZQorICAgICAgICAvLyBsYXN0IGl0ZW0gaW4gdGhlIHRhaWwgcXVldWUgbGlzdC4KKyAgICAgICAgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxUYWlsUXVldWVMaXN0Kj4obVRhaWwpLT5tVGFpbCk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGxpc3QgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgIC8vIFJldHVybiBOVUxMIGlmIHRoZSBsaXN0IHdhcyBlbXB0eS4KKyAgICBUKiBwb3BGcm9udCgpIHsKKyAgICAgICAgVCogcmVzdWx0ID0gZnJvbnQoKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgcmVtb3ZlKHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgYSBuZXcgaXRlbSB0byB0aGUgbGlzdC4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGFsaWFzIGZvcgorICAgIC8vIGluc2VydFRhaWwoKS4KKyAgICB2b2lkIHB1c2hCYWNrKFQqIG9iaikgeworICAgICAgICBpbnNlcnRUYWlsKG9iaik7CisgICAgfQorCisgICAgLy8gUHJlcGVuZCBhIG5ldyBvYmplY3QgfG9ianwgdG8gdGhlIGxpc3QuIE5vdGUgdGhhdCB8b2JqfCBjYW5ub3QgYmUKKyAgICAvLyBOVUxMIG9yIGFscmVhZHkgaW4gYW5vdGhlciBsaXN0IHVzaW5nIHRoZSBzYW1lIGxpbmsuCisgICAgdm9pZCBpbnNlcnRIZWFkKFQqIG9iaikgeworICAgICAgICBMaW5rVHlwZSogbGluayA9IFRSQUlUUzo6bGluayhvYmopOworICAgICAgICBEQ0hFQ0soIWxpbmstPmluUXVldWUoKSk7CisKKyAgICAgICAgbGluay0+bU5leHQgPSBtSGVhZDsKKyAgICAgICAgaWYgKG1IZWFkKSB7CisgICAgICAgICAgICBMaW5rVHlwZSogZmlyc3RMaW5rID0gVFJBSVRTOjpsaW5rKG1IZWFkKTsKKyAgICAgICAgICAgIGZpcnN0TGluay0+bVByZXZQb2ludGVyID0gJmxpbmstPm1OZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRhaWwgPSAmbGluay0+bU5leHQ7CisgICAgICAgIH0KKyAgICAgICAgbUhlYWQgPSBvYmo7CisgICAgICAgIGxpbmstPm1QcmV2UG9pbnRlciA9ICZtSGVhZDsKKyAgICB9CisKKyAgICAvLyBBcHBlbmQgYSBuZXcgb2JqZWN0IHxvYmp8IHRvIHRoZSBsaXN0LiBOb3RlIHRoYXQgfG9ianwgY2Fubm90IGJlCisgICAgLy8gTlVMTCBvciBhbHJlYWR5IGluIGFub3RoZXIgbGlzdCB1c2luZyB0aGUgc2FtZSBsaW5rLgorICAgIHZvaWQgaW5zZXJ0VGFpbChUKiBvYmopIHsKKyAgICAgICAgTGlua1R5cGUqIGxpbmsgPSBUUkFJVFM6Omxpbmsob2JqKTsKKyAgICAgICAgRENIRUNLKCFsaW5rLT5pblF1ZXVlKCkpOworCisgICAgICAgIGxpbmstPm1OZXh0ID0gTlVMTDsKKyAgICAgICAgbGluay0+bVByZXZQb2ludGVyID0gbVRhaWw7CisgICAgICAgICptVGFpbCA9IG9iajsKKyAgICAgICAgbVRhaWwgPSAmbGluay0+bU5leHQ7CisgICAgfQorCisgICAgLy8gSW5zZXJ0IGEgbmV3IG9iamVjdCB8b2JqfCBpbnRvIHRoZSBsaXN0LCBiZWZvcmUgb2JqZWN0IHxpbnNlcnR8LgorICAgIC8vIE5vdGUgdGhhdCB8b2JqfCBhbmQgfGluc2VydHwgY2Fubm90IGJlIE5VTEwsIHxvYmp8IG11c3Qgbm90IGJlIGluCisgICAgLy8gYW5vdGhlciBsaXN0IHVzaW5nIHRoZSBzYW1lIGxpbmssIGFuZCB8aW5zZXJ0fCBtdXN0IGFscmVhZHkgYmUKKyAgICAvLyBpbiB0aGUgbGlzdC4KKyAgICB2b2lkIGluc2VydEJlZm9yZShUKiBpbnNlcnQsIFQqIG9iaikgeworICAgICAgICBMaW5rVHlwZSogbGluayA9IFRSQUlUUzo6bGluayhvYmopOworICAgICAgICBEQ0hFQ0soIWxpbmstPmluUXVldWUoKSk7CisKKyAgICAgICAgTGlua1R5cGUqIGluc2VydExpbmsgPSBUUkFJVFM6OmxpbmsoaW5zZXJ0KTsKKyAgICAgICAgRENIRUNLKGluc2VydExpbmstPmluUXVldWUoKSk7CisKKyAgICAgICAgbGluay0+bVByZXZQb2ludGVyID0gaW5zZXJ0TGluay0+bVByZXZQb2ludGVyOworICAgICAgICBsaW5rLT5tTmV4dCA9IGluc2VydDsKKyAgICAgICAgKmluc2VydExpbmstPm1QcmV2UG9pbnRlciA9IG9iajsKKyAgICAgICAgaW5zZXJ0TGluay0+bVByZXZQb2ludGVyID0gJmxpbmstPm1OZXh0OworICAgIH0KKworICAgIC8vIEluc2VydCBhIG5ldyBvYmplY3QgfG9ianwgaW50byB0aGUgbGlzdCwgYWZ0ZXIgb2JqZWN0IHxpbnNlcnR8LgorICAgIC8vIE5vdGUgdGhhdCB8b2JqfCBhbmQgfGluc2VydHwgY2Fubm90IGJlIE5VTEwsIHxvYmp8IG11c3Qgbm90IGJlIGluCisgICAgLy8gYW5vdGhlciBsaXN0IHVzaW5nIHRoZSBzYW1lIGxpbmssIGFuZCB8aW5zZXJ0fCBtdXN0IGFscmVhZHkgYmUKKyAgICAvLyBpbiB0aGUgbGlzdC4KKyAgICB2b2lkIGluc2VydEFmdGVyKFQqIGluc2VydCwgVCogb2JqKSB7CisgICAgICAgIExpbmtUeXBlKiBsaW5rID0gVFJBSVRTOjpsaW5rKG9iaik7CisgICAgICAgIERDSEVDSyghbGluay0+aW5RdWV1ZSgpKTsKKworICAgICAgICBMaW5rVHlwZSogaW5zZXJ0TGluayA9IFRSQUlUUzo6bGluayhpbnNlcnQpOworICAgICAgICBEQ0hFQ0soaW5zZXJ0TGluay0+aW5RdWV1ZSgpKTsKKworICAgICAgICBsaW5rLT5tTmV4dCA9IGluc2VydExpbmstPm1OZXh0OworICAgICAgICBpZiAobGluay0+bU5leHQpIHsKKyAgICAgICAgICAgIExpbmtUeXBlKiBuZXh0TGluayA9IFRSQUlUUzo6bGluayhsaW5rLT5tTmV4dCk7CisgICAgICAgICAgICBuZXh0TGluay0+bVByZXZQb2ludGVyID0gJmxpbmstPm1OZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRhaWwgPSAmbGluay0+bU5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaW5zZXJ0TGluay0+bU5leHQgPSBvYmo7CisgICAgICAgIGxpbmstPm1QcmV2UG9pbnRlciA9ICZpbnNlcnRMaW5rLT5tTmV4dDsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgb2JqZWN0IHxvYmp8IGZyb20gdGhlIGxpc3QuIHxvYmp8IGNhbm5vdCBiZSBOVUxMIGFuZCBtdXN0CisgICAgLy8gYmUgaW4gdGhlIGxpc3QuCisgICAgdm9pZCByZW1vdmUoVCogb2JqKSB7CisgICAgICAgIExpbmtUeXBlKiBsaW5rID0gVFJBSVRTOjpsaW5rKG9iaik7CisgICAgICAgIERDSEVDSyhsaW5rLT5pblF1ZXVlKCkpOworCisgICAgICAgIGlmIChsaW5rLT5tTmV4dCkgeworICAgICAgICAgICAgTGlua1R5cGUqIG5leHRMaW5rID0gVFJBSVRTOjpsaW5rKGxpbmstPm1OZXh0KTsKKyAgICAgICAgICAgIG5leHRMaW5rLT5tUHJldlBvaW50ZXIgPSBsaW5rLT5tUHJldlBvaW50ZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGFpbCA9IGxpbmstPm1QcmV2UG9pbnRlcjsKKyAgICAgICAgfQorICAgICAgICAqbGluay0+bVByZXZQb2ludGVyID0gbGluay0+bU5leHQ7CisKKyAgICAgICAgbGluay0+bU5leHQgPSBOVUxMOworICAgICAgICBsaW5rLT5tUHJldlBvaW50ZXIgPSBOVUxMOworICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhpcyBsaXN0LiBXQVJOSU5HOiBPKG4pIHBlcmZvcm1hbmNlLgorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICBzaXplX3QgY291bnQgPSAwOworICAgICAgICBUKiBpdGVtID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChpdGVtKSB7CisgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgaXRlbSA9IFRSQUlUUzo6bGluayhpdGVtKS0+bU5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGUgbGlzdCBjb250YWlucyBvYmplY3QgfG9ianwuCisgICAgLy8gV0FSTklORzogTyhuKSBwZXJmb3JtYW5jZS4KKyAgICBib29sIGNvbnRhaW5zKFQqIG9iaikgY29uc3QgeworICAgICAgICBUKiBpdGVtID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChpdGVtKSB7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0ZW0gPSBUUkFJVFM6OmxpbmsoaXRlbSktPm1OZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG4tdGggaXRlbSBpbiB0aGUgbGlzdCwgd2hlcmUgfHBvc3wgaXMgaXRzIHBvc2l0aW9uLAorICAgIC8vIHN0YXJ0aW5nIGZyb20gMC4gUmV0dXJuIE5VTEwgaWYgdGhlIHBvc2l0aW9uIGlzIG91dCBvZiBib3VuZHMuCisgICAgLy8gV0FSTklORzogTyhuKSBwZXJmb3JtYW5jZS4KKyAgICBUKiBudGgoc2l6ZV90IHBvcykgY29uc3QgeworICAgICAgICBUKiBpdGVtID0gbUhlYWQ7CisgICAgICAgIHdoaWxlIChpdGVtICYmIHBvcyA+IDApIHsKKyAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgICAgaXRlbSA9IFRSQUlUUzo6bGluayhpdGVtKS0+bU5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUYWlsUXVldWVMaXN0KTsKKworICAgIC8vIFRoZSBsYXlvdXQgb2YgdGhlc2UgZmllbGRzIHNob3VsZCBtYXRjaCBUYWlsUXVldWVMaXN0QmFzZSBleGFjdGx5LgorICAgIFQqIG1IZWFkOworICAgIFQqKiBtVGFpbDsKK307CisKKyNkZWZpbmUgVEFJTF9RVUVVRV9MSVNUX1RSQUlUUyh0cmFpdHNfbmFtZSwgdHlwZV9uYW1lLCBmaWVsZF9uYW1lKSBcCisgICAgc3RydWN0IHRyYWl0c19uYW1lIHsgXAorICAgICAgICBzdGF0aWMgaW5saW5lIDo6YW5kcm9pZDo6YmFzZTo6VGFpbFF1ZXVlTGluazx0eXBlX25hbWU+KiBcCisgICAgICAgICAgICAgICAgbGluayh0eXBlX25hbWUqIHQpIHsgXAorICAgICAgICAgICAgcmV0dXJuICYodCktPmZpZWxkX25hbWU7IFwKKyAgICAgICAgfSBcCisgICAgfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvVGFpbFF1ZXVlTGlzdF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1RhaWxRdWV1ZUxpc3RfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTk3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9jb250YWluZXJzL1RhaWxRdWV1ZUxpc3RfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzEyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL1RhaWxRdWV1ZUxpc3QuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gaG9sZCBhbiBpbnRlZ2VyIHZhbHVlLCBhbmQgd2hpY2ggY2FuIGJlCitjbGFzcyBGb28geworcHVibGljOgorICAgIEZvbygpIDogbVZhbHVlKDApIHt9CisgICAgZXhwbGljaXQgRm9vKGludCB2YWx1ZSkgOiBtVmFsdWUodmFsdWUpIHt9CisKKyAgICBpbnQgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtVmFsdWU7IH0KKyAgICBGb28qIG5leHQoKSBjb25zdCB7IHJldHVybiBtTGluay5uZXh0KCk7IH0KKworICAgIFRBSUxfUVVFVUVfTElTVF9UUkFJVFMoVHJhaXRzLCBGb28sIG1MaW5rKTsKKworcHJpdmF0ZToKKyAgICBUYWlsUXVldWVMaW5rPEZvbz4gbUxpbms7CisgICAgaW50IG1WYWx1ZTsKK307CisKK3R5cGVkZWYgVGFpbFF1ZXVlTGlzdDxGb28+IEZvb0xpc3Q7CisKK3ZvaWQgY2xlYXJGb29MaXN0KEZvb0xpc3QqIGxpc3QpIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEZvbyogZm9vID0gbGlzdC0+cG9wRnJvbnQoKTsKKyAgICAgICAgaWYgKCFmb28pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBmb287CisgICAgfQorfQorCitjbGFzcyBTY29wZWRGb29MaXN0IDogcHVibGljIEZvb0xpc3QgeworcHVibGljOgorICAgIH5TY29wZWRGb29MaXN0KCkgeworICAgICAgICBjbGVhckZvb0xpc3QoKEZvb0xpc3QqKXRoaXMpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFRhaWxRdWV1ZUxpc3QsIGluaXQpIHsKKyAgICBGb29MaXN0IGxpc3Q7CisgICAgRVhQRUNUX1RSVUUobGlzdC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMFUsIGxpc3Quc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobGlzdC5jb250YWlucyhOVUxMKSk7Cit9CisKK1RFU1QoVGFpbFF1ZXVlTGlzdCwgZnJvbnQpIHsKKyAgICBTY29wZWRGb29MaXN0IGxpc3Q7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMDsKKworICAgIEVYUEVDVF9GQUxTRShsaXN0LmZyb250KCkpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBsaXN0LnB1c2hCYWNrKG5ldyBGb28obikpOworICAgICAgICBFWFBFQ1RfVFJVRShsaXN0LmZyb250KCkpIDw8ICJJdGVtICMiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUSgwVSwgbGlzdC5mcm9udCgpLT52YWx1ZSgpKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KK30KKworVEVTVChUYWlsUXVldWVMaXN0LCBsYXN0KSB7CisgICAgU2NvcGVkRm9vTGlzdCBsaXN0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDA7CisKKyAgICBFWFBFQ1RfRkFMU0UobGlzdC5sYXN0KCkpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBsaXN0LnB1c2hCYWNrKG5ldyBGb28obikpOworICAgICAgICBFWFBFQ1RfVFJVRShsaXN0Lmxhc3QoKSkgPDwgIkl0ZW0gIyIgPDwgbjsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGxpc3QubGFzdCgpLT52YWx1ZSgpKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KK30KKworVEVTVChUYWlsUXVldWVMaXN0LCBpbnNlcnRUYWlsKSB7CisgICAgU2NvcGVkRm9vTGlzdCBsaXN0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDA7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGxpc3QucHVzaEJhY2sobmV3IEZvbyhuKSk7CisgICAgICAgIEVYUEVDVF9FUShuICsgMSwgbGlzdC5zaXplKCkpIDw8ICJJdGVtICMiIDw8IG47CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgbGlzdC5zaXplKCkpOworCisgICAgc2l6ZV90IG4gPSAwOworICAgIEZvbyogZm9vID0gbGlzdC5mcm9udCgpOworICAgIGZvciAoOyBuIDwga0NvdW50ICYmIGZvbzsgbisrLCBmb28gPSBmb28tPm5leHQoKSkgeworICAgICAgICBFWFBFQ1RfRVEobiwgZm9vLT52YWx1ZSgpKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQsIG4pOworICAgIEVYUEVDVF9GQUxTRShmb28pOworfQorCitURVNUKFRhaWxRdWV1ZUxpc3QsIGluc2VydEhlYWQpIHsKKyAgICBTY29wZWRGb29MaXN0IGxpc3Q7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMDsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgbGlzdC5pbnNlcnRIZWFkKG5ldyBGb28obikpOworICAgICAgICBFWFBFQ1RfRVEobiArIDEsIGxpc3Quc2l6ZSgpKSA8PCAiSXRlbSAjIiA8PCBuOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQsIGxpc3Quc2l6ZSgpKTsKKworICAgIHNpemVfdCBuID0gMDsKKyAgICBGb28qIGZvbyA9IGxpc3QuZnJvbnQoKTsKKyAgICBmb3IgKDsgbiA8IGtDb3VudCAmJiBmb287IG4rKywgZm9vID0gZm9vLT5uZXh0KCkpIHsKKyAgICAgICAgRVhQRUNUX0VRKGtDb3VudCAtIDEgLSBuLCBmb28tPnZhbHVlKCkpIDw8ICJJdGVtICMiIDw8IG47CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCwgbik7CisgICAgRVhQRUNUX0ZBTFNFKGZvbyk7Cit9CisKK1RFU1QoVGFpbFF1ZXVlTGlzdCwgaW5zZXJ0QmVmb3JlKSB7CisgICAgU2NvcGVkRm9vTGlzdCBsaXN0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDA7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGxpc3QuaW5zZXJ0VGFpbChuZXcgRm9vKG4pKTsKKyAgICB9CisKKyAgICAvLyBJbnNlcnQgYmVmb3JlIGhlYWQuCisgICAgbGlzdC5pbnNlcnRCZWZvcmUobGlzdC5mcm9udCgpLCBuZXcgRm9vKGtDb3VudCArIDFVKSk7CisgICAgRVhQRUNUX0VRKGtDb3VudCArIDFVLCBsaXN0LnNpemUoKSk7CisKKyAgICBGb28qIGZvbyA9IGxpc3QuZnJvbnQoKTsKKyAgICBFWFBFQ1RfRVEoa0NvdW50ICsgMVUsIGZvby0+dmFsdWUoKSk7CisKKyAgICAvLyBJbnNlcnQgYmVmb3JlIHNlY29uZC4KKyAgICBmb28gPSBmb28tPm5leHQoKTsKKyAgICBFWFBFQ1RfRVEoMFUsIGZvby0+dmFsdWUoKSkgPDwgIkl0ZW0gIzEiOworCisgICAgbGlzdC5pbnNlcnRCZWZvcmUoZm9vLCBuZXcgRm9vKGtDb3VudCArIDJVKSk7CisgICAgRVhQRUNUX0VRKGtDb3VudCArIDJVLCBsaXN0LnNpemUoKSk7CisKKyAgICBmb28gPSBsaXN0LmZyb250KCk7CisgICAgRVhQRUNUX0VRKGtDb3VudCArIDFVLCBmb28tPnZhbHVlKCkpOworICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgIEVYUEVDVF9FUShrQ291bnQgKyAyVSwgZm9vLT52YWx1ZSgpKTsKKyAgICBmb28gPSBmb28tPm5leHQoKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGZvby0+dmFsdWUoKSkgPDwgIkl0ZW0gIyIgPDwgKG4gKyAydSk7CisgICAgICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgIH0KK30KKworVEVTVChUYWlsUXVldWVMaXN0LCBpbnNlcnRBZnRlcikgeworICAgIFNjb3BlZEZvb0xpc3QgbGlzdDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBsaXN0Lmluc2VydFRhaWwobmV3IEZvbyhuKSk7CisgICAgfQorCisgICAgLy8gSW5zZXJ0IGFmdGVyIGhlYWQuCisgICAgbGlzdC5pbnNlcnRBZnRlcihsaXN0LmZyb250KCksIG5ldyBGb28oa0NvdW50ICsgMVUpKTsKKyAgICBFWFBFQ1RfRVEoa0NvdW50ICsgMVUsIGxpc3Quc2l6ZSgpKTsKKworICAgIEZvbyogZm9vID0gbGlzdC5mcm9udCgpOworICAgIEVYUEVDVF9FUSgwVSwgZm9vLT52YWx1ZSgpKTsKKyAgICBmb28gPSBmb28tPm5leHQoKTsKKyAgICBFWFBFQ1RfRVEoa0NvdW50ICsgMVUsIGZvby0+dmFsdWUoKSk7CisgICAgZm9vID0gZm9vLT5uZXh0KCk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMTsgbiA8IGtDb3VudCAtIDFVOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGZvby0+dmFsdWUoKSkgPDwgIkl0ZW0gIyIgPDwgKG4gKyAyVSk7CisgICAgICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQgLSAxVSwgZm9vLT52YWx1ZSgpKSA8PCAiSXRlbSAjIiA8PCBrQ291bnQgLSAxVTsKKworICAgIC8vIEluc2VydCBhZnRlciBsYXN0LgorICAgIGxpc3QuaW5zZXJ0QWZ0ZXIoZm9vLCBuZXcgRm9vKGtDb3VudCArIDJVKSk7CisgICAgZm9vID0gbGlzdC5mcm9udCgpOworICAgIEVYUEVDVF9FUSgwVSwgZm9vLT52YWx1ZSgpKTsKKyAgICBmb28gPSBmb28tPm5leHQoKTsKKyAgICBFWFBFQ1RfRVEoa0NvdW50ICsgMVUsIGZvby0+dmFsdWUoKSk7CisgICAgZm9vID0gZm9vLT5uZXh0KCk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMTsgbiA8IGtDb3VudCAtIDFVOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGZvby0+dmFsdWUoKSkgPDwgIkl0ZW0gIyIgPDwgKG4gKyAxVSk7CisgICAgICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgIH0KKworICAgIEVYUEVDVF9FUShrQ291bnQgLSAxVSwgZm9vLT52YWx1ZSgpKTsKKyAgICBmb28gPSBmb28tPm5leHQoKTsKKyAgICBFWFBFQ1RfVFJVRShmb28pOworICAgIEVYUEVDVF9FUShrQ291bnQgKyAyVSwgZm9vLT52YWx1ZSgpKTsKK30KKworVEVTVChUYWlsUXVldWVMaXN0LCByZW1vdmVMaW5lYXJGcm9tSGVhZCkgeworICAgIFNjb3BlZEZvb0xpc3QgbGlzdDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBsaXN0Lmluc2VydFRhaWwobmV3IEZvbyhuKSk7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcyBpbiBvcmRlciwgZnJvbSB0aGUgaGVhZC4KKyAgICBGb28qIGZvbyA9IGxpc3QuZnJvbnQoKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIEZvbyogbmV4dCA9IGZvby0+bmV4dCgpOworICAgICAgICBFWFBFQ1RfRVEobiwgZm9vLT52YWx1ZSgpKTsKKyAgICAgICAgbGlzdC5yZW1vdmUoZm9vKTsKKyAgICAgICAgRVhQRUNUX0VRKGtDb3VudCAtIG4gLSAxLCBsaXN0LnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShuZXh0LCBsaXN0LmZyb250KCkpOworICAgICAgICBmb28gPSBuZXh0OworICAgIH0KKyAgICBFWFBFQ1RfVFJVRShsaXN0LmVtcHR5KCkpOworICAgIEVYUEVDVF9FUSgwVSwgbGlzdC5zaXplKCkpOworfQorCitURVNUKFRhaWxRdWV1ZUxpc3QsIHJlbW92ZUxpbmVhckZyb21UYWlsKSB7CisgICAgU2NvcGVkRm9vTGlzdCBsaXN0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDA7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGxpc3QuaW5zZXJ0VGFpbChuZXcgRm9vKG4pKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zIGluIHJldmVyc2Ugb3JkZXIsIGZyb20gdGhlIHRhaWwuCisgICAgZm9yIChzaXplX3QgcG9zID0ga0NvdW50OyBwb3MgPiAwOyAtLXBvcykgeworICAgICAgICAvLyBHZXQgaXRlbSBhdCBwb3NpdGlvbiB8cG9zIC0gMXwKKyAgICAgICAgRm9vKiBmb28gPSBsaXN0LmZyb250KCk7CisgICAgICAgIGZvciAoc2l6ZV90IG4gPSAxOyBuIDwgcG9zOyArK24pIHsKKyAgICAgICAgICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9UUlVFKGZvbyk7CisgICAgICAgIEVYUEVDVF9FUShwb3MgLSAxVSwgZm9vLT52YWx1ZSgpKTsKKyAgICAgICAgbGlzdC5yZW1vdmUoZm9vKTsKKyAgICAgICAgRVhQRUNUX0VRKHBvcyAtIDFVLCBsaXN0LnNpemUoKSk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGxpc3QuZW1wdHkoKSk7CisgICAgRVhQRUNUX0VRKDBVLCBsaXN0LnNpemUoKSk7Cit9CisKK1RFU1QoVGFpbFF1ZXVlTGlzdCwgcmVtb3ZlT2RkT25seSkgeworICAgIFNjb3BlZEZvb0xpc3QgbGlzdDsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gMTAwOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBsaXN0Lmluc2VydFRhaWwobmV3IEZvbyhuKSk7CisgICAgfQorCisgICAgRm9vKiBmb28gPSBsaXN0LmZyb250KCktPm5leHQoKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudCAvIDJVOyArK24pIHsKKyAgICAgICAgRm9vKiBuZXh0ID0gKG4gPCBrQ291bnQgLyAyVSAtIDFVKSA/IGZvby0+bmV4dCgpLT5uZXh0KCkgOiBOVUxMOworICAgICAgICBFWFBFQ1RfRVEobiAqIDJVICsgMVUsIGZvby0+dmFsdWUoKSk7CisgICAgICAgIGxpc3QucmVtb3ZlKGZvbyk7CisgICAgICAgIGZvbyA9IG5leHQ7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtDb3VudCAvIDJVLCBsaXN0LnNpemUoKSk7CisKKyAgICBmb28gPSBsaXN0LmZyb250KCk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQgLyAyOyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoZm9vKTsKKyAgICAgICAgRVhQRUNUX0VRKG4qMlUsIGZvby0+dmFsdWUoKSk7CisgICAgICAgIGZvbyA9IGZvby0+bmV4dCgpOworICAgIH0KK30KKworVEVTVChUYWlsUXVldWVMaXN0LCBzaXplKSB7CisgICAgU2NvcGVkRm9vTGlzdCBsaXN0OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSAxMDA7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIGxpc3QuaW5zZXJ0VGFpbChuZXcgRm9vKG4pKTsKKyAgICAgICAgRVhQRUNUX0VRKG4gKyAxVSwgbGlzdC5zaXplKCkpOworICAgIH0KK30KKworVEVTVChUYWlsUXVldWVMaXN0LCBudGgpIHsKKyAgICBTY29wZWRGb29MaXN0IGxpc3Q7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMDsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgbGlzdC5pbnNlcnRUYWlsKG5ldyBGb28obikpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRm9vKiBmb28gPSBsaXN0Lm50aChuKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZm9vKTsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGZvby0+dmFsdWUoKSk7CisgICAgfQorCisgICAgRVhQRUNUX0ZBTFNFKGxpc3QubnRoKGtDb3VudCkpOworICAgIEVYUEVDVF9GQUxTRShsaXN0Lm50aChrQ291bnQgKyAxVSkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL0luaUZpbGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvSW5pRmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxNmIzOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL0luaUZpbGUuY3BwCkBAIC0wLDAgKzEsNDYyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisKKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCit1c2luZyBzdGQ6Omlmc3RyZWFtOwordXNpbmcgc3RkOjppb3NfYmFzZTsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp0b19zdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKwordm9pZCBJbmlGaWxlOjpzZXRCYWNraW5nRmlsZShjb25zdCBzdHJpbmcmIGZpbGVQYXRoKSB7CisgICAgLy8gV2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIG5ldyBiYWNraW5nIGZpbGUgY29udGFpbnMuCisgICAgbURpcnR5ID0gdHJ1ZTsKKyAgICBtQmFja2luZ0ZpbGVQYXRoID0gZmlsZVBhdGg7Cit9CisKK3N0YXRpYyBib29sIGlzU3BhY2VDaGFyKHVuc2lnbmVkIHVjKSB7CisgICAgcmV0dXJuIHVjID09ICcgJyB8fCB1YyA9PSAnXHInIHx8IHVjID09ICdcdCc7Cit9CisKK3N0YXRpYyBib29sIGlzVmFsdWVDaGFyKHVuc2lnbmVkIHVjKSB7CisgICAgcmV0dXJuIHVjICE9ICdccicgJiYgdWMgIT0gJ1xuJzsKK30KKworc3RhdGljIGJvb2wgaXNLZXlTdGFydENoYXIodW5zaWduZWQgdWMpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc21hbGxSYW5nZSA9ICd6JyAtICdhJyArIDE7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhcGl0YWxSYW5nZSA9ICdaJyAtICdBJyArIDE7CisgICAgcmV0dXJuICh1YyAtICdhJyA8IHNtYWxsUmFuZ2UpIHx8ICh1YyAtICdBJyA8IGNhcGl0YWxSYW5nZSkgfHwgKHVjID09ICdfJyk7Cit9CisKK3N0YXRpYyBib29sIGlzS2V5Q2hhcih1bnNpZ25lZCB1YykgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBudW1SYW5nZSA9ICc5JyAtICcwJyArIDE7CisgICAgcmV0dXJuIGlzS2V5U3RhcnRDaGFyKHVjKSB8fCAodWMgLSAnMCcgPCBudW1SYW5nZSkgfHwgKHVjID09ICcuJykgfHwKKyAgICAgICAgICAgKHVjID09ICctJyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDSXRlcmF0b3IsIHR5cGVuYW1lIFByZWQ+CitzdGF0aWMgQ0l0ZXJhdG9yIGVhdChDSXRlcmF0b3IgY2l0ZXIsIENJdGVyYXRvciBjZW5kLCBQcmVkIHByZWQpIHsKKyAgICB3aGlsZSAoY2l0ZXIgIT0gY2VuZCAmJiBwcmVkKCpjaXRlcikpIHsKKyAgICAgICAgKytjaXRlcjsKKyAgICB9CisgICAgcmV0dXJuIGNpdGVyOworfQorCit2b2lkIEluaUZpbGU6OnBhcnNlRmlsZShzdGQ6OmlzdHJlYW0qIGluRmlsZSkgeworICAgIHN0cmluZyBsaW5lOworICAgIGludCBsaW5lbm8gPSAwOworICAgIC8vIFRoaXMgaXMgdGhlIGxpbmUgbnVtYmVyIHdlJ2QgcHJpbnQgYXQgaWYgdGhlIEluaUZpbGUgd2VyZSBpbW1lZGlhdGVseQorICAgIC8vIHdyaXR0ZW4gYmFjay4gVW5saWtlIHxsaW5lfCwgdGhpcyB3aWxsIG5vdCBiZSBpbmNyZW1lbnRlZCBmb3IgaW52YWxpZAorICAgIC8vIGxpbmVzLCBzaW5jZSB0aGV5J3JlIGNvbXBsZXRlbHkgZHJvcHBlZC4KKyAgICBpbnQgb3V0cHV0TGluZW5vID0gMDsKKyAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKCppbkZpbGUsIGxpbmUpKSB7CisgICAgICAgICsrbGluZW5vOworICAgICAgICArK291dHB1dExpbmVubzsKKworICAgICAgICBjb25zdCBzdHJpbmcmIGNsaW5lID0gbGluZTsKKyAgICAgICAgYXV0byBjaXRlciA9IHN0ZDo6YmVnaW4oY2xpbmUpOworICAgICAgICBhdXRvIGNlbmQgPSBzdGQ6OmVuZChjbGluZSk7CisgICAgICAgIGNpdGVyID0gZWF0KGNpdGVyLCBjZW5kLCBpc1NwYWNlQ2hhcik7CisKKyAgICAgICAgLy8gSGFuZGxlIGVtcHR5IGxpbmVzLCBjb21tZW50cy4KKyAgICAgICAgaWYgKGNpdGVyID09IGNlbmQpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTGluZSAiIDw8IGxpbmVubyA8PCAiOiBTa2lwcGVkIGVtcHR5IGxpbmUuIjsKKyAgICAgICAgICAgIG1Db21tZW50cy5wdXNoX2JhY2soe291dHB1dExpbmVubywgbGluZX0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpjaXRlciA9PSAnIycgfHwgKmNpdGVyID09ICc7JykgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJMaW5lICIgPDwgbGluZW5vIDw8ICI6IFNraXBwZWQgY29tbWVudCBsaW5lLiI7CisgICAgICAgICAgICBtQ29tbWVudHMucHVzaF9iYWNrKHtvdXRwdXRMaW5lbm8sIGxpbmV9KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCBhbmQgdmFsaWRhdGUga2V5LgorICAgICAgICBjb25zdCBhdXRvIGtleVN0YXJ0SXRlciA9IGNpdGVyOworICAgICAgICBpZiAoIWlzS2V5U3RhcnRDaGFyKCpjaXRlcikpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTGluZSAiIDw8IGxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEtleSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgdmFsaWQgY2hhcmFjdGVyLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIFNraXBwZWQgbGluZS4iOworICAgICAgICAgICAgLS1vdXRwdXRMaW5lbm87CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICArK2NpdGVyOworICAgICAgICBjaXRlciA9IGVhdChjaXRlciwgY2VuZCwgaXNLZXlDaGFyKTsKKyAgICAgICAgYXV0byBrZXkgPSBzdHJpbmcoa2V5U3RhcnRJdGVyLCBjaXRlcik7CisKKyAgICAgICAgLy8gR29iYmxlIHRoZSA9IHNpZ24uCisgICAgICAgIGNpdGVyID0gZWF0KGNpdGVyLCBjZW5kLCBpc1NwYWNlQ2hhcik7CisgICAgICAgIGlmIChjaXRlciA9PSBjZW5kIHx8ICpjaXRlciAhPSAnPScpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTGluZSAiIDw8IGxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IE1pc3NpbmcgZXhwZWN0ZWQgYXNzaWdubWVudCBvcGVyYXRvciAoPSkuIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgU2tpcHBlZCBsaW5lLiI7CisgICAgICAgICAgICAtLW91dHB1dExpbmVubzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICsrY2l0ZXI7CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgdmFsdWUuCisgICAgICAgIGNpdGVyID0gZWF0KGNpdGVyLCBjZW5kLCBpc1NwYWNlQ2hhcik7CisgICAgICAgIGNvbnN0IGF1dG8gdmFsdWVTdGFydEl0ZXIgPSBjaXRlcjsKKyAgICAgICAgY2l0ZXIgPSBlYXQoY2l0ZXIsIGNlbmQsIGlzVmFsdWVDaGFyKTsKKyAgICAgICAgYXV0byB2YWx1ZSA9IHN0cmluZyh2YWx1ZVN0YXJ0SXRlciwgY2l0ZXIpOworICAgICAgICAvLyBSZW1vdmUgdHJhaWxpbmcgc3BhY2UuCisgICAgICAgIGF1dG8gdHJhaWxpbmdTcGFjZUl0ZXIgPSBlYXQodmFsdWUucmJlZ2luKCksIHZhbHVlLnJlbmQoKSwgaXNTcGFjZUNoYXIpOworICAgICAgICB2YWx1ZS5lcmFzZSh0cmFpbGluZ1NwYWNlSXRlci5iYXNlKCksIHZhbHVlLmVuZCgpKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhlcmUncyBubyBpbnZhbGlkIHJlbWFpbmRlci4KKyAgICAgICAgY2l0ZXIgPSBlYXQoY2l0ZXIsIGNlbmQsIGlzU3BhY2VDaGFyKTsKKyAgICAgICAgaWYgKGNpdGVyICE9IGNlbmQpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiTGluZSAiIDw8IGxpbmVubworICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IENvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyIGluIHRoZSB2YWx1ZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBTa2lwcGVkIGxpbmUuIjsKKyAgICAgICAgICAgIC0tb3V0cHV0TGluZW5vOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBFdmVyeXRoaW5nIHBhcnNlZC4KKyAgICAgICAgbUtleXMucHVzaF9iYWNrKGtleSk7CisgICAgICAgIG1EYXRhW2tleV0gPSB2YWx1ZTsKKyAgICB9Cit9CisKK2Jvb2wgSW5pRmlsZTo6cmVhZCgpIHsKKyAgICBtRGlydHkgPSBmYWxzZTsKKyAgICBtRGF0YS5jbGVhcigpOworICAgIG1LZXlzLmNsZWFyKCk7CisgICAgbUNvbW1lbnRzLmNsZWFyKCk7CisKKyAgICBpZiAobUJhY2tpbmdGaWxlUGF0aC5lbXB0eSgpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiUmVhZCBjYWxsZWQgd2l0aG91dCBhIGJhY2tpbmcgZmlsZSEiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWZzdHJlYW0gaW5GaWxlKG1CYWNraW5nRmlsZVBhdGgsIGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjphdGUpOworICAgIGlmICghaW5GaWxlKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHByb2Nlc3MgLmluaSBmaWxlICIgPDwgbUJhY2tpbmdGaWxlUGF0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgcmVhZGluZy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gYXZvaWQgcmVhZGluZyBhIHZlcnkgbGFyZ2UgZmlsZSB0aGF0IHdhcyBwYXNzZWQgYnkgbWlzdGFrZQorICAgIC8vIHRoaXMgdGhyZXNob2xkIGlzIHF1aXRlIGxpYmVyYWwuCisgICAgc3RhdGljIGNvbnN0IGF1dG8ga01heEluaUZpbGVTaXplID0gaWZzdHJlYW06OnBvc190eXBlKDY1NTM2MCk7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0ludmxpZFBvcyA9IGlmc3RyZWFtOjpwb3NfdHlwZSgtMSk7CisgICAgY29uc3QgaWZzdHJlYW06OnBvc190eXBlIGVuZFBvcyA9IGluRmlsZS50ZWxsZygpOworICAgIGluRmlsZS5zZWVrZygwLCBpb3NfYmFzZTo6YmVnKTsKKyAgICBjb25zdCBpZnN0cmVhbTo6cG9zX3R5cGUgYmVnUG9zID0gaW5GaWxlLnRlbGxnKCk7CisgICAgaWYgKGJlZ1BvcyA9PSBrSW52bGlkUG9zIHx8IGVuZFBvcyA9PSBrSW52bGlkUG9zIHx8CisgICAgICAgIGVuZFBvcyAtIGJlZ1BvcyA+IGtNYXhJbmlGaWxlU2l6ZSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIi5pbmkgRmlsZSAiIDw8IG1CYWNraW5nRmlsZVBhdGggPDwgIiB0b28gbGFyZ2UgKCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IChlbmRQb3MgLSBiZWdQb3MpIDw8ICIgYnl0ZXMpIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcnNlRmlsZSgmaW5GaWxlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbmlGaWxlOjp3cml0ZUNvbW1vbihib29sIGRpc2NhcmRFbXB0eSkgeworICAgIGlmIChtQmFja2luZ0ZpbGVQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJXcml0ZSBjYWxsZWQgd2l0aG91dCBhIGJhY2tpbmcgZmlsZSEiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpvZnN0cmVhbSBvdXRGaWxlKG1CYWNraW5nRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om91dCB8IHN0ZDo6aW9zX2Jhc2U6OnRydW5jKTsKKyAgICBpZiAoIW91dEZpbGUpIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gb3BlbiAuaW5pIGZpbGUgIiA8PCBtQmFja2luZ0ZpbGVQYXRoCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciB3cml0aW5nLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgbGluZW5vID0gMDsKKyAgICB2ZWN0b3I8cGFpcjxpbnQsIHN0cmluZz4+Ojpjb25zdF9pdGVyYXRvciBjb21tZW50SXRlciA9CisgICAgICAgICAgICBzdGQ6OmJlZ2luKG1Db21tZW50cyk7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXkgOiBtS2V5cykgeworICAgICAgICArK2xpbmVubzsKKworICAgICAgICAvLyBXcml0ZSBjb21tZW50cworICAgICAgICBmb3IgKDsKKyAgICAgICAgICAgICBjb21tZW50SXRlciAhPSBzdGQ6OmVuZChtQ29tbWVudHMpICYmIGxpbmVubyA+PSBjb21tZW50SXRlci0+Zmlyc3Q7CisgICAgICAgICAgICAgKytjb21tZW50SXRlciwgKytsaW5lbm8pIHsKKyAgICAgICAgICAgIG91dEZpbGUgPDwgY29tbWVudEl0ZXItPnNlY29uZCA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IG1EYXRhLmF0KGtleSk7CisgICAgICAgIGlmIChkaXNjYXJkRW1wdHkgJiYgdmFsdWUuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3V0RmlsZSA8PCBrZXkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIlxuIjsKKyAgICB9CisKKyAgICBtRGlydHkgPSBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJbmlGaWxlOjp3cml0ZSgpIHsKKyAgICByZXR1cm4gd3JpdGVDb21tb24oZmFsc2UpOworfQorCitib29sIEluaUZpbGU6OndyaXRlRGlzY2FyZGluZ0VtcHR5KCkgeworICAgIHJldHVybiB3cml0ZUNvbW1vbih0cnVlKTsKK30KKworYm9vbCBJbmlGaWxlOjp3cml0ZUlmQ2hhbmdlZCgpIHsKKyAgICByZXR1cm4gIW1EaXJ0eSB8fCB3cml0ZUNvbW1vbihmYWxzZSk7Cit9CisKK2ludCBJbmlGaWxlOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1EYXRhLnNpemUoKSk7Cit9CisKK2Jvb2wgSW5pRmlsZTo6aGFzS2V5KGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CisgICAgcmV0dXJuIG1EYXRhLmZpbmQoa2V5KSAhPSBzdGQ6OmVuZChtRGF0YSk7Cit9CisKK3N0ZDo6c3RyaW5nIEluaUZpbGU6Om1ha2VWYWxpZEtleShTdHJpbmdWaWV3IHN0cikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXM7CisgICAgcmVzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6dXBwZXJjYXNlOworICAgIHJlcyA8PCAnXyc7IC8vIG1hcmsgYWxsIGtleXMgcGFzc2VkIHRocm91Z2ggdGhpcyBmdW5jdGlvbiB3aXRoIGEgbGVhZGluZworICAgICAgICAgICAgICAgIC8vIHVuZGVyc2NvcmUKKyAgICBmb3IgKGNoYXIgYyA6IHN0cikgeworICAgICAgICBpZiAoaXNLZXlDaGFyKGMpKSB7CisgICAgICAgICAgICByZXMgPDwgYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA8PCAnLicgPDwgc3RkOjpzZXR3KDIpIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0YXRpY19jYXN0PGludD4oYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlcy5zdHIoKTsKK30KKworc3RyaW5nIEluaUZpbGU6OmdldFN0cmluZyhjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKKyAgICBhdXRvIGNpdGVyID0gbURhdGEuZmluZChrZXkpOworICAgIHJldHVybiAoY2l0ZXIgPT0gc3RkOjplbmQobURhdGEpKSA/IGRlZmF1bHRWYWx1ZSA6IGNpdGVyLT5zZWNvbmQ7Cit9CisKK2ludCBJbmlGaWxlOjpnZXRJbnQoY29uc3Qgc3RyaW5nJiBrZXksIGludCBkZWZhdWx0VmFsdWUpIGNvbnN0IHsKKyAgICBhdXRvIGNpdGVyID0gbURhdGEuZmluZChrZXkpOworICAgIGlmIChjaXRlciA9PSBzdGQ6OmVuZChtRGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICBjaGFyKiBlbmQ7CisgICAgZXJybm8gPSAwOworICAgIGNvbnN0IGludCByZXN1bHQgPSBzdHJ0b2woY2l0ZXItPnNlY29uZC5jX3N0cigpLCAmZW5kLCAxMCk7CisgICAgaWYgKGVycm5vIHx8ICplbmQgIT0gMCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIk1hbGZvcm1lZCBpbnQgdmFsdWUgIiA8PCBjaXRlci0+c2Vjb25kIDw8ICIgZm9yIGtleSAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrZXk7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludDY0X3QgSW5pRmlsZTo6Z2V0SW50NjQoY29uc3Qgc3RyaW5nJiBrZXksIGludDY0X3QgZGVmYXVsdFZhbHVlKSBjb25zdCB7CisgICAgYXV0byBjaXRlciA9IG1EYXRhLmZpbmQoa2V5KTsKKyAgICBpZiAoY2l0ZXIgPT0gc3RkOjplbmQobURhdGEpKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgY2hhciogZW5kOworICAgIGVycm5vID0gMDsKKyAgICBjb25zdCBpbnQ2NF90IHJlc3VsdCA9IHN0cnRvbGwoY2l0ZXItPnNlY29uZC5jX3N0cigpLCAmZW5kLCAxMCk7CisgICAgaWYgKGVycm5vIHx8ICplbmQgIT0gMCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIk1hbGZvcm1lZCBpbnQ2NCB2YWx1ZSAiIDw8IGNpdGVyLT5zZWNvbmQgPDwgIiBmb3Iga2V5ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtleTsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworZG91YmxlIEluaUZpbGU6OmdldERvdWJsZShjb25zdCBzdHJpbmcmIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgY29uc3QgeworICAgIGF1dG8gY2l0ZXIgPSBtRGF0YS5maW5kKGtleSk7CisgICAgaWYgKGNpdGVyID09IHN0ZDo6ZW5kKG1EYXRhKSkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIGNoYXIqIGVuZDsKKyAgICBlcnJubyA9IDA7CisgICAgY29uc3QgZG91YmxlIHJlc3VsdCA9IHN0cnRvZChjaXRlci0+c2Vjb25kLmNfc3RyKCksICZlbmQpOworICAgIGlmIChlcnJubyB8fCAqZW5kICE9IDApIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJNYWxmb3JtZWQgZG91YmxlIHZhbHVlICIgPDwgY2l0ZXItPnNlY29uZAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3Iga2V5ICIgPDwga2V5OworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYm9vbCBpc0Jvb2xUcnVlKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKKyAgICBjb25zdCBjaGFyKiBjc3RyID0gdmFsdWUuY19zdHIoKTsKKyAgICByZXR1cm4gc3RyY2FzZWNtcCgieWVzIiwgY3N0cikgPT0gMCB8fCBzdHJjYXNlY21wKCJ0cnVlIiwgY3N0cikgPT0gMCB8fAorICAgICAgICAgICBzdHJjYXNlY21wKCIxIiwgY3N0cikgPT0gMDsKK30KKworc3RhdGljIGJvb2wgaXNCb29sRmFsc2UoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICAgIGNvbnN0IGNoYXIqIGNzdHIgPSB2YWx1ZS5jX3N0cigpOworICAgIHJldHVybiBzdHJjYXNlY21wKCJubyIsIGNzdHIpID09IDAgfHwgc3RyY2FzZWNtcCgiZmFsc2UiLCBjc3RyKSA9PSAwIHx8CisgICAgICAgICAgIHN0cmNhc2VjbXAoIjAiLCBjc3RyKSA9PSAwOworfQorCitib29sIEluaUZpbGU6OmdldEJvb2woY29uc3Qgc3RyaW5nJiBrZXksIGJvb2wgZGVmYXVsdFZhbHVlKSBjb25zdCB7CisgICAgYXV0byBjaXRlciA9IG1EYXRhLmZpbmQoa2V5KTsKKyAgICBpZiAoY2l0ZXIgPT0gc3RkOjplbmQobURhdGEpKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGNpdGVyLT5zZWNvbmQ7CisgICAgaWYgKGlzQm9vbFRydWUodmFsdWUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXNCb29sRmFsc2UodmFsdWUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIk1hbGZvcm1lZCBib29sIHZhbHVlICIgPDwgdmFsdWUgPDwgIiBmb3Iga2V5ICIgPDwga2V5OworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KK30KKworYm9vbCBJbmlGaWxlOjpnZXRCb29sU3RyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIGRlZmF1bHRWYWx1ZSkgY29uc3QgeworICAgIHJldHVybiBnZXRCb29sKGtleSwgaXNCb29sVHJ1ZShkZWZhdWx0VmFsdWUpKTsKK30KKworLy8gSWYgbm90IG51bGxwdHIsIHwqb3V0TWFsZm9ybWVkfCBpcyBzZXQgdG8gdHJ1ZSBpZiB8dmFsdWVTdHJ8IGlzIG1hbGZvcm1lZC4KK3N0YXRpYyBJbmlGaWxlOjpEaXNrU2l6ZSBwYXJzZURpc2tTaXplKGNvbnN0IHN0cmluZyYgdmFsdWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pRmlsZTo6RGlza1NpemUgZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dE1hbGZvcm1lZCkgeworICAgIGlmKG91dE1hbGZvcm1lZCkgeworICAgICAgICAqb3V0TWFsZm9ybWVkID0gZmFsc2U7CisgICAgfQorCisgICAgY2hhciogZW5kOworICAgIGVycm5vID0gMDsKKyAgICBJbmlGaWxlOjpEaXNrU2l6ZSByZXN1bHQgPSBzdHJ0b2xsKHZhbHVlU3RyLmNfc3RyKCksICZlbmQsIDEwKTsKKyAgICBib29sIG1hbGZvcm1lZCA9IChlcnJubyAhPSAwKTsKKyAgICBpZiAoIW1hbGZvcm1lZCkgeworICAgICAgICBzd2l0Y2ggKCplbmQpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2snOgorICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICo9IDEwMjRVTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSAxMDI0ICogMTAyNFVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICo9IDEwMjQgKiAxMDI0ICogMTAyNFVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYWxmb3JtZWQpIHsKKyAgICAgICAgaWYob3V0TWFsZm9ybWVkKSB7CisgICAgICAgICAgICAqb3V0TWFsZm9ybWVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitJbmlGaWxlOjpEaXNrU2l6ZSBJbmlGaWxlOjpnZXREaXNrU2l6ZShjb25zdCBzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaUZpbGU6OkRpc2tTaXplIGRlZmF1bHRWYWx1ZSkgY29uc3QgeworICAgIGlmICghaGFzS2V5KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisgICAgYm9vbCBtYWxmb3JtZWQgPSBmYWxzZTsKKyAgICBJbmlGaWxlOjpEaXNrU2l6ZSByZXN1bHQgPSBwYXJzZURpc2tTaXplKG1EYXRhLmF0KGtleSksIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWxmb3JtZWQpOworCisgICAgTE9HX0lGKFZFUkJPU0UsIG1hbGZvcm1lZCkgPDwgIk1hbGZvcm1lZCBEaXNrU2l6ZSB2YWx1ZSAiIDw8IG1EYXRhLmF0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBrZXkgIiA8PCBrZXk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworSW5pRmlsZTo6RGlza1NpemUgSW5pRmlsZTo6Z2V0RGlza1NpemVTdHIoY29uc3Qgc3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRlZmF1bHRWYWx1ZVN0cikgY29uc3QgeworICAgIHJldHVybiBnZXREaXNrU2l6ZShrZXksIHBhcnNlRGlza1NpemUoZGVmYXVsdFZhbHVlU3RyLCAwLCBudWxscHRyKSk7Cit9CisKK3ZvaWQgSW5pRmlsZTo6dXBkYXRlRGF0YShjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICAgIG1EaXJ0eSA9IHRydWU7CisgICAgYXV0byByZXN1bHQgPSBtRGF0YS5lbXBsYWNlKGtleSwgdmFsdWUpOworICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgLy8gTmV3IGVsZW1lbnQgd2FzIGNyZWF0ZWQuCisgICAgICAgbUtleXMucHVzaF9iYWNrKGtleSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZW1wbGFjZSBkb2VzIG5vdCB1cGRhdGUgYW4gZXhpc3RpbmcgdmFsdWUuCisgICAgICAgIHJlc3VsdC5maXJzdC0+c2Vjb25kID0gdmFsdWU7CisgICAgfQorfQorCit2b2lkIEluaUZpbGU6OnNldFN0cmluZyhjb25zdCBzdHJpbmcmIGtleSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICAgIHVwZGF0ZURhdGEoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgSW5pRmlsZTo6c2V0SW50KGNvbnN0IHN0cmluZyYga2V5LCBpbnQgdmFsdWUpIHsKKyAgICB1cGRhdGVEYXRhKGtleSwgdG9fc3RyaW5nKHZhbHVlKSk7Cit9CisKK3ZvaWQgSW5pRmlsZTo6c2V0SW50NjQoY29uc3Qgc3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICAvLyBsb25nIGxvbmcgaXMgYXQgbGVhc3QgNjQgYml0IGluIEMrKzB4LgorICAgIHVwZGF0ZURhdGEoa2V5LCB0b19zdHJpbmcoc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih2YWx1ZSkpKTsKK30KKwordm9pZCBJbmlGaWxlOjpzZXREb3VibGUoY29uc3Qgc3RyaW5nJiBrZXksIGRvdWJsZSB2YWx1ZSkgeworICAgIHVwZGF0ZURhdGEoa2V5LCB0b19zdHJpbmcodmFsdWUpKTsKK30KKwordm9pZCBJbmlGaWxlOjpzZXRCb29sKGNvbnN0IHN0cmluZyYga2V5LCBib29sIHZhbHVlKSB7CisgICAgdXBkYXRlRGF0YShrZXksIHZhbHVlID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3ZvaWQgSW5pRmlsZTo6c2V0RGlza1NpemUoY29uc3Qgc3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrS2lsbyA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01lZ2EgPSAxMDI0ICoga0tpbG87CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0dpZ2EgPSAxMDI0ICoga01lZ2E7CisKKyAgICBjaGFyIHN1ZmZpeCA9IDA7CisgICAgaWYgKHZhbHVlID49IGtHaWdhICYmICEodmFsdWUgJSBrR2lnYSkpIHsKKyAgICAgICAgdmFsdWUgLz0ga0dpZ2E7CisgICAgICAgIHN1ZmZpeCA9ICdnJzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID49IGtNZWdhICYmICEodmFsdWUgJSBrTWVnYSkpIHsKKyAgICAgICAgdmFsdWUgLz0ga01lZ2E7CisgICAgICAgIHN1ZmZpeCA9ICdtJzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID49IGtLaWxvICYmICEodmFsdWUgJSBrS2lsbykpIHsKKyAgICAgICAgdmFsdWUgLz0ga0tpbG87CisgICAgICAgIHN1ZmZpeCA9ICdrJzsKKyAgICB9CisKKyAgICBhdXRvIHZhbHVlU3RyID0gdG9fc3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoc3VmZml4KSB7CisgICAgICAgIHZhbHVlU3RyICs9IHN1ZmZpeDsKKyAgICB9CisgICAgdXBkYXRlRGF0YShrZXksIHZhbHVlU3RyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxODdiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL0luaUZpbGUuaApAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPGlvc2Z3ZD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgSW5pRmlsZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBpbnQ2NF90IERpc2tTaXplOworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gTWFwVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBLZXlMaXN0VHlwZTsKKworICAgIC8vIE5vdGUgdGhhdCB0aGUgY29uc3RydWN0b3IgX2RvZXMgbm90XyByZWFkIGRhdGEgZnJvbSB0aGUgYmFja2luZyBmaWxlLgorICAgIC8vIENhbGwgfFJlYWR8IHRvIHJlYWQgdGhlIGRhdGEuCisgICAgSW5pRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgYmFja2luZ0ZpbGVQYXRoKQorICAgICAgICA6IG1EaXJ0eSh0cnVlKSwgbUJhY2tpbmdGaWxlUGF0aChiYWNraW5nRmlsZVBhdGgpIHt9CisgICAgLy8gV2hlbiBjcmVhdGVkIHdpdGhvdXQgYSBiYWNraW5nIGZpbGUsIGFsbCB8cmVhZHwvfHdyaXRlKnwgb3BlcmF0aW9ucyB3aWxsCisgICAgLy8gZmFpbCB1bmxlc3MgfHNldEJhY2tpbmdGaWxlfCBpcyBjYWxsZWQgdG8gcG9pbnQgdG8gYSB2YWxpZCBmaWxlIHBhdGguCisgICAgSW5pRmlsZSgpIDogbURpcnR5KHRydWUpIHt9CisKKyAgICAvLyBTZXQgYSBuZXcgYmFja2luZyBmaWxlLiBUaGlzIGRvZXMgbm90IHJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLiBDYWxsCisgICAgLy8gfHJlYWR8CisgICAgLy8gdG8gcmVmcmVzaCBkYXRhIGZyb20gdGhlIG5ldyBiYWNraW5nIGZpbGUuCisgICAgdm9pZCBzZXRCYWNraW5nRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZVBhdGgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRCYWNraW5nRmlsZSgpIGNvbnN0IHsgcmV0dXJuIG1CYWNraW5nRmlsZVBhdGg7IH0KKworICAgIC8vIFJlYWRzIGRhdGEgaW50byBJbmlGaWxlIGZyb20gdGhlIHRoZSBiYWNraW5nIGZpbGUsIG92ZXJ3cml0aW5nIGFueQorICAgIC8vIGV4aXN0aW5nIGRhdGEuCisgICAgYm9vbCByZWFkKCk7CisKKyAgICAvLyBXcml0ZSB0aGUgY3VycmVudCBJbmlGaWxlIHRvIHRoZSBiYWNraW5nIGZpbGUuCisgICAgYm9vbCB3cml0ZSgpOworICAgIC8vIFdyaXRlIHRoZSBjdXJyZW50IEluaUZpbGUgdG8gYmFja2luZyBmaWxlLiBEaXNjYXJkIGFueSBrZXlzIHRoYXQgaGF2ZQorICAgIC8vIGVtcHR5IHZhbHVlcy4KKyAgICBib29sIHdyaXRlRGlzY2FyZGluZ0VtcHR5KCk7CisgICAgLy8gQW4gb3B0aW1pemVkIHdyaXRlLgorICAgIC8vIC0gQWR2YW50YWdlOiBXZSBkb24ndCB3cml0ZSBpZiB0aGVyZSBoYXZlIGJlZW4gbm8gdXBkYXRlcyBzaW5jZSBsYXN0CisgICAgLy8gd3JpdGUuCisgICAgLy8gLSBEaXNhZHZhbnRhZ2U6IE5vdCBzYWZlIGlmIHNvbWV0aGluZyBlbHNlIG1pZ2h0IGJlIGNoYW5naW5nIHRoZSBpbmkKKyAgICAvLyAgIGZpbGUgLS0geW91ciB2aWV3IG9mIHRoZSBmaWxlIGlzIG5vIGxvbmdlciBjb25zaXN0ZW50LiBBY3R1YWxseSwgdGhpcworICAgIC8vICAgImJ1ZyIgY2FuIGJlIGNvbnNpZGVyZWQgYSAiZmVhdHVyZSIsIGlmIHRoZSBpbmkgZmlsZSBjaGFuZ2VkIHVuYmVrbm93bgorICAgIC8vICAgdG8geW91LCB5b3UncmUgcHJvYmFibHkgZG9pbmcgd3JvbmcgaW4gb3ZlcndyaXRpbmcgdGhlIGNoYW5nZXMgd2l0aG91dAorICAgIC8vICAgYW55IHVwZGF0ZSBvbiB5b3VyIHNpZGUuCisgICAgYm9vbCB3cml0ZUlmQ2hhbmdlZCgpOworCisgICAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIChrZXksdmFsdWUpIHBhaXJzIGluIHRoZSBmaWxlLgorICAgIGludCBzaXplKCkgY29uc3Q7CisgICAgLy8gQ2hlY2sgaWYgYSBjZXJ0YWluIGtleSBleGlzdHMgaW4gdGhlIGZpbGUuCisgICAgYm9vbCBoYXNLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgY29uc3Q7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIHN0cmluZyBjYW4gYmUgdXNlZCBhcyBhIHZhbGlkIGtleQorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBtYWtlVmFsaWRLZXkoU3RyaW5nVmlldyBzdHIpOworCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFZhbHVlIEdldHRlcnMKKyAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRoZSBJbmlGaWxlIGhhcyBubyBrbm93bGVkZ2UgYWJvdXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlcy4KKyAgICAvLyB8ZGVmYXVsdFZhbHVlfCBpcyByZXR1cm5lZCBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgdGhlIHZhbHVlIGlzIGJhZGx5CisgICAgLy8gZm9ybWF0dGVkIGZvciB0aGUgcmVxdWVzdGVkIHR5cGUuCisgICAgLy8KKyAgICAvLyBGb3Igc29tZSB2YWx1ZSB0eXBlcyB3aGVyZSB0aGUgZGlzayBmb3JtYXQgaXMgc2lnbmlmaWNhbnRseSBtb3JlIHVzZWZ1bAorICAgIC8vIGZvciBodW1hbi1wYXJzaW5nLCBvdmVybG9hZHMgYXJlIHByb3ZpZGVkIHRoYXQgYWNjZXB0IGRlZmF1bHQgdmFsdWVzIGFzCisgICAgLy8gc3RyaW5ncyB0byBiZSBwYXJzZWQganVzdCBsaWtlIHRoZSBiYWNraW5nIGluaSBmaWxlLgorICAgIC8vIC0gVGhpcyBoYXMgdGhlIGJlbmVmaXQgdGhhdCBkZWZhdWx0IHZhbHVlcyBjYW4gYmUgc3RvcmVkIGluIGEgc2VwYXJhdGUKKyAgICAvLyAgIGZpbGUgaW4gaHVtYW4gZnJpZW5kbHkgZm9ybSwgYW5kIHVzZWQgZGlyZWN0bHkuCisgICAgLy8gLSBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgYmVoYXZpb3VyIGlzIHVuZGVmaW5lZCBpZiB3ZSBmYWlsIHRvIHBhcnNlIHRoZQorICAgIC8vICAgZGVmYXVsdCB2YWx1ZS4KKyAgICBzdGQ6OnN0cmluZyBnZXRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHRWYWx1ZSkgY29uc3Q7CisgICAgaW50IGdldEludChjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSBjb25zdDsKKyAgICBpbnQ2NF90IGdldEludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgZGVmYXVsdFZhbHVlKSBjb25zdDsKKyAgICBkb3VibGUgZ2V0RG91YmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIGNvbnN0OworICAgIC8vIFRoZSBzZXJpYWxpemVkIGZvcm1hdCBmb3IgYSBib29sIGFjY2VlcHRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgIC8vICAgICBUcnVlOiAiMSIsICJ5ZXMiLCAiWUVTIi4KKyAgICAvLyAgICAgRmFsc2U6ICIwIiwgIm5vIiwgIk5PIi4KKyAgICBib29sIGdldEJvb2woY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgYm9vbCBkZWZhdWx0VmFsdWUpIGNvbnN0OworICAgIGJvb2wgZ2V0Qm9vbFN0cihjb25zdCBzdGQ6OnN0cmluZyYga3llLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdFZhbHVlU3RyKSBjb25zdDsKKyAgICAvLyBQYXJzZXMgYSBzdHJpbmcgYXMgZGlzayBzaXplLiBUaGUgc2VyaWFsaXplZCBmb3JtYXQgaXMgWzAtOV0rW2tLbU1nR10uCisgICAgLy8gVGhlCisgICAgLy8gc3VmZml4ZXMgY29ycmVzcG9uZCB0byBLaUIsIE1pQiBhbmQgR2lCIG11bHRpcGxpZXJzLgorICAgIC8vIE5vdGU6IFdlIGNvbnNpZGVyIDFLID0gMTAyNCwgbm90IDEwMDAuCisgICAgRGlza1NpemUgZ2V0RGlza1NpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgRGlza1NpemUgZGVmYXVsdFZhbHVlKSBjb25zdDsKKyAgICBEaXNrU2l6ZSBnZXREaXNrU2l6ZVN0cihjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0VmFsdWVTdHIpIGNvbnN0OworCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFZhbHVlIFNldHRlcnMKKyAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIHZvaWQgc2V0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCBzZXRJbnQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgaW50IHZhbHVlKTsKKyAgICB2b2lkIHNldEludDY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGludDY0X3QgdmFsdWUpOworICAgIHZvaWQgc2V0RG91YmxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBzZXRCb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGJvb2wgdmFsdWUpOworICAgIHZvaWQgc2V0RGlza1NpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgRGlza1NpemUgdmFsdWUpOworCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXRlcmF0b3JzCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFlvdSBjYW4gaXRlcmF0ZSB0aHJvdWdoIChzdHJpbmcpIGtleXMgaW4gdGhpcyBJbmlGaWxlLCBhbmQgdGhlbiB1c2UgdGhlCisgICAgLy8gY29ycmVjdCB8Z2V0KnwgZnVuY3Rpb24gdG8gb2J0YWluIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorICAgIC8vIFRoZSBvcmRlciBvZiBrZXlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgYW4gZXh0ZW5zaW9uIG9mIHRoZSBvcmRlciBpbiB0aGUKKyAgICAvLyBiYWNraW5nIGZpbGU6CisgICAgLy8gICAgLSBGb3Iga2V5cyB0aGF0IGV4aXN0IGluIHRoZSBiYWNraW5nIGZpbGUsIG9yZGVyIGlzIG1haW50YWluZWQuCisgICAgLy8gICAgLSBSZXN0IG9mIHRoZSBrZXlzIGFyZSBhcHBlbmRlZCBpbiB0aGUgZW5kLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlCisgICAgLy8gICAgICBmaXJzdCBhZGRlZC4KKyAgICAvLyAgT25seSBjb25zdF9pdGVyYXRvciBpcyBwcm92aWRlZC4gVXNlIHxzZXQqfCBmdW5jdGlvbnMgdG8gbW9kaWZ5IHRoZQorICAgIC8vICBJbmlGaWxlLgorICAgIHR5cGVkZWYgS2V5TGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gc3RkOjpiZWdpbihtS2V5cyk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBzdGQ6OmVuZChtS2V5cyk7IH0KKworcHJvdGVjdGVkOgorICAgIC8vIEhlbHBlciBmdW5jdGlvbnMuCisgICAgdm9pZCBwYXJzZUZpbGUoc3RkOjppc3RyZWFtKiBpbkZpbGUpOworICAgIHZvaWQgdXBkYXRlRGF0YShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICAgIGJvb2wgd3JpdGVDb21tb24oYm9vbCBkaXNjYXJkRW1wdHkpOworCitwcml2YXRlOgorICAgIGJvb2wgbURpcnR5OworICAgIE1hcFR5cGUgbURhdGE7CisgICAgS2V5TGlzdFR5cGUgbUtleXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgc3RkOjpzdHJpbmc+PiBtQ29tbWVudHM7CisgICAgc3RkOjpzdHJpbmcgbUJhY2tpbmdGaWxlUGF0aDsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihJbmlGaWxlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvSW5pRmlsZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTdmYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvSW5pRmlsZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw0ODggQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL0luaUZpbGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpudW1lcmljX2xpbWl0czsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOwordXNpbmcgc3RkOjp1bm9yZGVyZWRfbWFwOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEluaUZpbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRlbXBEaXIucmVzZXQobmV3IFRlc3RUZW1wRGlyKCJpbmlmaWxldGVzdCIpKTsKKyAgICAgICAgbUluaUZpbGVQYXRoID0gbVRlbXBEaXItPm1ha2VTdWJQYXRoKCJ0ZXN0LmluaSIpLmNfc3RyKCk7CisgICAgICAgIG1JbmkucmVzZXQobmV3IEluaUZpbGUobUluaUZpbGVQYXRoKSk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgbUluaS5yZXNldCgpOworICAgICAgICBtVGVtcERpci5yZXNldCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgd3JpdGVJbmlGaWxlRGF0YShjb25zdCB2ZWN0b3I8c3RyaW5nPiYgbGluZXMpIHsKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBvdXRGaWxlKG1JbmlGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6Om91dCB8IHN0ZDo6aW9zX2Jhc2U6OnRydW5jKTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKG91dEZpbGUuZmFpbCgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBsaW5lIDogbGluZXMpIHsKKyAgICAgICAgICAgIG91dEZpbGUgPDwgbGluZSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlGaWxlQ29udGVudHMoY29uc3QgdmVjdG9yPHN0cmluZz4mIGxpbmVzKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gaW5GaWxlKG1JbmlGaWxlUGF0aCk7CisgICAgICAgIEFTU0VSVF9GQUxTRShpbkZpbGUuZmFpbCgpKTsKKyAgICAgICAgdmVjdG9yPHN0cmluZz4gZmlsZUxpbmVzOworICAgICAgICBzdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShpbkZpbGUsIGxpbmUpKSB7CisgICAgICAgICAgICBmaWxlTGluZXMucHVzaF9iYWNrKGxpbmUpOworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX0VRKGxpbmVzLnNpemUoKSwgZmlsZUxpbmVzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShsaW5lc1tpXSwgZmlsZUxpbmVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZSBmb3IgfGluaXwgaXMgfHVwZGF0ZWR8IHdoZW4KKyAgICAvLyB8d3JpdGVJZkNoYW5nZWR8IGlzIGNhbGxlZC4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBjaGFuZ2VzIHxpbml8LiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgfGluaXwgaXMKKyAgICAvLyBhbHdheXMKKyAgICAvLyBjbGVhbiwgYW5kIHRoZSBkYXRhIGhhcyBiZWVuIGNoYW5nZWQgYXJiaXRyYXJpbHkuCisgICAgdm9pZCB2ZXJpZnlGaWxlVXBkYXRlZChib29sIHVwZGF0ZWQpIHsKKyAgICAgICAgc3RhdGljIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgc3RyaW5nIGtleSA9ICJrZXkiICsgc3RkOjp0b19zdHJpbmcoY291bnRlcisrKTsKKyAgICAgICAgdmVjdG9yPHN0cmluZz4gbGluZXMgPSB7a2V5ICsgIiA9IHNvbWV2YWx1ZSJ9OworCisgICAgICAgIHdyaXRlSW5pRmlsZURhdGEobGluZXMpOworICAgICAgICBFWFBFQ1RfVFJVRShtSW5pLT53cml0ZUlmQ2hhbmdlZCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+cmVhZCgpKTsKKworICAgICAgICAvLyBJZiB0aGUgZmlsZSB3YXMgdXBkYXRlZCwgdGhlbiB0aGUgbmV3IHVuaXF1ZWx5IHdyaXR0ZW4gZGF0YSBtdXN0IGhhdmUKKyAgICAgICAgLy8gZGlzYXBwZWFyZWQsIG5vdCBvdGhlcndpc2UuCisgICAgICAgIGlmICh1cGRhdGVkKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobUluaS0+aGFzS2V5KGtleSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+aGFzS2V5KGtleSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdW5pcXVlX3B0cjxUZXN0VGVtcERpcj4gbVRlbXBEaXI7CisgICAgc3RyaW5nIG1JbmlGaWxlUGF0aDsKKyAgICB1bmlxdWVfcHRyPEluaUZpbGU+IG1Jbmk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKEluaUZpbGVUZXN0LCByZWFkV3JpdGUpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5vcmRlcmVkX21hcDxzdHJpbmcsIGludD4gaW50RGF0YSA9IHsKKyAgICAgICAgICAgIHsiemVyb0ludCIsIDB9LAorICAgICAgICAgICAgeyJwb3NpdGl2ZUludCIsIDF9LAorICAgICAgICAgICAgeyJuZWdhdGl2ZUludCIsIC0xfSwKKyAgICAgICAgICAgIHsibWF4SW50IiwgbnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCl9LAorICAgICAgICAgICAgeyJtaW5JbnQiLCBudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKX0sCisgICAgICAgICAgICB7Imxvd2VzdEludCIsIG51bWVyaWNfbGltaXRzPGludD46Omxvd2VzdCgpfX07CisgICAgc3RhdGljIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ2NF90PiBpbnQ2NERhdGEgPSB7CisgICAgICAgICAgICB7Inplcm9JbnQ2NCIsIDBVTEx9LAorICAgICAgICAgICAgeyJwb3NpdGl2ZUludDY0IiwgMVVMTH0sCisgICAgICAgICAgICB7Im5lZ2F0aXZlSW50NjQiLCAtMVVMTH0sCisgICAgICAgICAgICB7Im1heEludDY0IiwgbnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpfSwKKyAgICAgICAgICAgIHsibWluSW50NjQiLCBudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKCl9LAorICAgICAgICAgICAgeyJsb3dlc3RJbnQ2NCIsIG51bWVyaWNfbGltaXRzPGludDY0X3Q+Ojpsb3dlc3QoKX19OworICAgIHN0YXRpYyBjb25zdCB1bm9yZGVyZWRfbWFwPHN0cmluZywgZG91YmxlPiBkb3VibGVEYXRhID0geworICAgICAgICAgICAgeyJ6ZXJvRG91YmxlIiwgMC4wfSwKKyAgICAgICAgICAgIHsicG9zaXRpdmVEb3VibGUiLCAxLjV9LAorICAgICAgICAgICAgeyJuZWdhdGl2ZURvdWJsZSIsIC0xLjV9LAorICAgICAgICAgICAgeyJtYXhEb3VibGUiLCBudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKX0sCisgICAgICAgICAgICAvLyBtaW5Eb3VibGUgZmFpbHMgYmVjYXVzZSBvZiByb3VuZGluZyBlcnJvcnMuCisgICAgICAgICAgICAvLyB7Im1pbkRvdWJsZSIsIG51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1pbigpfSwKKyAgICAgICAgICAgIHsibG93ZXN0RG91YmxlIiwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bG93ZXN0KCl9fTsKKworICAgIC8vIFRoaXMgZG9lc24ndCBhY3R1YWxseSB0ZXN0IHRoZSBmb3JtYXQgaW4gd2hpY2ggdmFsdWVzIGFyZSBwZXJzaXN0ZWQuCisgICAgLy8gQnV0IGl0IGRvZXMgdGVzdCB0aGF0IHNlcmlhbGl6ZS1kZXNlcmlhbGl6ZSBhcmUgY29uc2lzdGVudC4KKyAgICBzdGF0aWMgY29uc3QgdW5vcmRlcmVkX21hcDxzdHJpbmcsIGJvb2w+IGJvb2xEYXRhID0ge3sidHJ1ZUtleSIsIHRydWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmYWxzZUtleSIsIGZhbHNlfX07CisgICAgc3RhdGljIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBJbmlGaWxlOjpEaXNrU2l6ZT4gZGlza1NpemVEYXRhID0geworICAgICAgICAgICAgeyJkczAiLCAwVUxMfSwKKyAgICAgICAgICAgIHsiZHMxMDAwQiIsIDEwMDBVTEx9LAorICAgICAgICAgICAgeyJkczFLIiwgMTAyNFVMTH0sCisgICAgICAgICAgICB7ImRzNWsiLCA1ICogMTAyNFVMTH0sCisgICAgICAgICAgICB7ImRzMU0iLCAxMDI0ICogMTAyNFVMTH0sCisgICAgICAgICAgICB7ImRzM0ciLCAzICogMTAyNCAqIDEwMjQgKiAxMDI0VUxMfX07CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleXZhbCA6IGludERhdGEpIHsKKyAgICAgICAgbUluaS0+c2V0SW50KGtleXZhbC5maXJzdCwga2V5dmFsLnNlY29uZCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogaW50NjREYXRhKSB7CisgICAgICAgIG1JbmktPnNldEludDY0KGtleXZhbC5maXJzdCwga2V5dmFsLnNlY29uZCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogZG91YmxlRGF0YSkgeworICAgICAgICBtSW5pLT5zZXREb3VibGUoa2V5dmFsLmZpcnN0LCBrZXl2YWwuc2Vjb25kKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiBib29sRGF0YSkgeworICAgICAgICBtSW5pLT5zZXRCb29sKGtleXZhbC5maXJzdCwga2V5dmFsLnNlY29uZCk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogZGlza1NpemVEYXRhKSB7CisgICAgICAgIG1JbmktPnNldERpc2tTaXplKGtleXZhbC5maXJzdCwga2V5dmFsLnNlY29uZCk7CisgICAgfQorCisgICAgQVNTRVJUX1RSVUUobUluaS0+d3JpdGUoKSk7CisKKyAgICBtSW5pLnJlc2V0KG5ldyBJbmlGaWxlKG1JbmlGaWxlUGF0aCkpOworICAgIEFTU0VSVF9FUSgwLCBtSW5pLT5zaXplKCkpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPnJlYWQoKSk7CisgICAgRVhQRUNUX0VRKGludERhdGEuc2l6ZSgpICsgaW50NjREYXRhLnNpemUoKSArIGRvdWJsZURhdGEuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICBib29sRGF0YS5zaXplKCkgKyBkaXNrU2l6ZURhdGEuc2l6ZSgpLAorICAgICAgICAgICAgICBtSW5pLT5zaXplKCkpOworCisgICAgLy8gTWl4LXVwIHRoZSBvcmRlciBhIGJpdC4KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleXZhbCA6IGJvb2xEYXRhKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1JbmktPmhhc0tleShrZXl2YWwuZmlyc3QpKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleXZhbC5zZWNvbmQsIG1JbmktPmdldEJvb2woa2V5dmFsLmZpcnN0LCA5OSkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleXZhbCA6IGRpc2tTaXplRGF0YSkgeworICAgICAgICBFWFBFQ1RfVFJVRShtSW5pLT5oYXNLZXkoa2V5dmFsLmZpcnN0KSk7CisgICAgICAgIEVYUEVDVF9FUShrZXl2YWwuc2Vjb25kLCBtSW5pLT5nZXREaXNrU2l6ZShrZXl2YWwuZmlyc3QsIDk5KSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogaW50NjREYXRhKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1JbmktPmhhc0tleShrZXl2YWwuZmlyc3QpKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleXZhbC5zZWNvbmQsIG1JbmktPmdldEludDY0KGtleXZhbC5maXJzdCwgOTkpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiBpbnREYXRhKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1JbmktPmhhc0tleShrZXl2YWwuZmlyc3QpKTsKKyAgICAgICAgRVhQRUNUX0VRKGtleXZhbC5zZWNvbmQsIG1JbmktPmdldEludChrZXl2YWwuZmlyc3QsIDk5KSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogZG91YmxlRGF0YSkgeworICAgICAgICBFWFBFQ1RfVFJVRShtSW5pLT5oYXNLZXkoa2V5dmFsLmZpcnN0KSk7CisgICAgICAgIEVYUEVDVF9FUShrZXl2YWwuc2Vjb25kLCBtSW5pLT5nZXREb3VibGUoa2V5dmFsLmZpcnN0LCA5OSkpOworICAgIH0KK30KKworVEVTVF9GKEluaUZpbGVUZXN0LCBkdXBsaWNhdGVBbmRNaXNpbmdLZXlzKSB7CisgICAgbUluaS0+c2V0SW50KCJpbnQiLCAwKTsKKyAgICBtSW5pLT5zZXRJbnQoImludCIsIDEpOworICAgIG1JbmktPnNldEludDY0KCJpbnQ2NCIsIDBVTEwpOworICAgIG1JbmktPnNldEludDY0KCJpbnQ2NCIsIDFVTEwpOworICAgIG1JbmktPnNldERvdWJsZSgiZG91YmxlIiwgMC4wKTsKKyAgICBtSW5pLT5zZXREb3VibGUoImRvdWJsZSIsIDEuMSk7CisgICAgbUluaS0+c2V0Qm9vbCgiYm9vbCIsIGZhbHNlKTsKKyAgICBtSW5pLT5zZXRCb29sKCJib29sIiwgdHJ1ZSk7CisgICAgbUluaS0+c2V0RGlza1NpemUoImRzIiwgMFVMTCk7CisgICAgbUluaS0+c2V0RGlza1NpemUoImRzIiwgMVVMTCk7CisKKyAgICBBU1NFUlRfVFJVRShtSW5pLT53cml0ZSgpKTsKKyAgICBtSW5pLnJlc2V0KG5ldyBJbmlGaWxlKG1JbmlGaWxlUGF0aCkpOworICAgIEFTU0VSVF9FUSgwLCBtSW5pLT5zaXplKCkpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPnJlYWQoKSk7CisgICAgRVhQRUNUX05FKDAsIG1JbmktPnNpemUoKSk7CisKKyAgICBFWFBFQ1RfRVEoMSwgbUluaS0+Z2V0SW50KCJpbnQiLCA5OSkpOworICAgIEVYUEVDVF9FUSgxVUxMLCBtSW5pLT5nZXRJbnQ2NCgiaW50NjQiLCA5OSkpOworICAgIEVYUEVDVF9FUSgxLjEsIG1JbmktPmdldERvdWJsZSgiZG91YmxlIiwgOTkpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbUluaS0+Z2V0Qm9vbCgiYm9vbCIsIGZhbHNlKSk7CisgICAgRVhQRUNUX0VRKDFVTEwsIG1JbmktPmdldERpc2tTaXplKCJkcyIsIDk5VUxMKSk7CisKKyAgICBFWFBFQ1RfRVEoLTExLCBtSW5pLT5nZXRJbnQoIm1pc3NpbmciLCAtMTEpKTsKKyAgICBFWFBFQ1RfRVEoMjJVTEwsIG1JbmktPmdldEludDY0KCJtaXNzaW5nIiwgMjJVTEwpKTsKKyAgICBFWFBFQ1RfRVEoMy4zLCBtSW5pLT5nZXREb3VibGUoIm1pc3NpbmciLCAzLjMpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbUluaS0+Z2V0Qm9vbCgibWlzc2luZyIsIHRydWUpKTsKKyAgICBFWFBFQ1RfRVEoNDRVTEwsIG1JbmktPmdldEludCgibWlzc2luZyIsIDQ0VUxMKSk7Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgdmFsdWVGb3JtYXQpIHsKKyAgICBzdGF0aWMgY29uc3QgdmVjdG9yPHN0cmluZz4gZmlsZURhdGEgPSB7CisgICAgICAgICAgICAia2V5MSA9IHZhbHVlIHdpdGggc3BhY2VzIiwgImtleTIgPSB2YWx1ZSB3aXRoIHRyYWlsaW5nIHNwYWNlcyAgIiwKKyAgICAgICAgICAgICJrZXkzID0gXCJ2YWx1ZSB3aXRoIHJlZHVuZGFudCBxdW90ZXNcIiIsICJrZXlBbGxTcGFjZXMgPSAgICAgICAifTsKKyAgICB3cml0ZUluaUZpbGVEYXRhKGZpbGVEYXRhKTsKKworICAgIEFTU0VSVF9UUlVFKG1JbmktPnJlYWQoKSk7CisgICAgRVhQRUNUX0VRKGZpbGVEYXRhLnNpemUoKSwgbUluaS0+c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoInZhbHVlIHdpdGggc3BhY2VzIiwgbUluaS0+Z2V0U3RyaW5nKCJrZXkxIiwgIiIpKTsKKyAgICBFWFBFQ1RfRVEoInZhbHVlIHdpdGggdHJhaWxpbmcgc3BhY2VzIiwgbUluaS0+Z2V0U3RyaW5nKCJrZXkyIiwgIiIpKTsKKyAgICBFWFBFQ1RfRVEoIlwidmFsdWUgd2l0aCByZWR1bmRhbnQgcXVvdGVzXCIiLCBtSW5pLT5nZXRTdHJpbmcoImtleTMiLCAiIikpOworICAgIEVYUEVDVF9FUSgiIiwgbUluaS0+Z2V0U3RyaW5nKCJrZXlBbGxTcGFjZXMiLCAibm9uZW1wdHlkZWZhdWx0IikpOworfQorCitURVNUX0YoSW5pRmlsZVRlc3QsIHJlYWRNYWxmb3JtZWRGaWxlKSB7CisgICAgc3RhdGljIGNvbnN0IGludCBkZWZhdWx0SW50ID0gLTk5OworICAgIHN0YXRpYyBjb25zdCB2ZWN0b3I8c3RyaW5nPiBmaWxlRGF0YSA9IHsKKyAgICAgICAgICAgICJhID0gNSIsCisgICAgICAgICAgICAiOyBUaGlzIGNvbW1lbnQgd2lsbCBiZSBza2lwcGVkIiwKKyAgICAgICAgICAgICIgIGIgPSA0IiwKKyAgICAgICAgICAgICIgICAjIFNvIHdpbGwgdGhpczogaXJyZWxldmFudCA7IGFuZCAjIiwKKyAgICAgICAgICAgICJjPTQzIiwKKyAgICAgICAgICAgICJkPSAzN21hbGZvcm1lZGludCxvdGhlcndpc2VPSyIsCisgICAgICAgICAgICAiVGhpcyBpcyBhY3R1YWxseSBtYWxmb3JtZWQsIGFuZCB3aWxsIGJlIHNraXBwZWQgd2l0aCB3YXJuaW5nIiwKKyAgICAgICAgICAgICIgZCA9IDQ1LjYgbm93IHRoaXMgYmVjb21lcyBtYWxmb3JtZWQgaGVyZSIsCisgICAgICAgICAgICAiZCA9IDQzIDsgaGFuZ2luZyBjb21tZW50cyBhcmUgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgIiBlZSA9IDU0NiIsCisgICAgICAgICAgICAiZj1cIjU2XCIiLAorICAgICAgICAgICAgImYzMkFTREZfLS5kZmFlMz0xIiwKKyAgICAgICAgICAgICI5MD1LZXlNdXN0U3RhcnRXaXRoQWxwaGEiLAorICAgICAgICAgICAgImE5JTA9S2V5Q2FuTm90Q29udGFpblBlcmNlbnQiLAorICAgICAgICAgICAgIiJ9OworICAgIHN0YXRpYyBjb25zdCB1bm9yZGVyZWRfbWFwPHN0cmluZywgaW50PiB2YWxpZEVudHJpZXMgPSB7CisgICAgICAgICAgICB7ImEiLCA1fSwKKyAgICAgICAgICAgIHsiYiIsIDR9LAorICAgICAgICAgICAgeyJjIiwgNDN9LAorICAgICAgICAgICAgeyJkIiwgZGVmYXVsdEludH0sCisgICAgICAgICAgICB7ImVlIiwgNTQ2fSwKKyAgICAgICAgICAgIHsiZiIsIGRlZmF1bHRJbnR9LAorICAgICAgICAgICAgeyJmMzJBU0RGXy0uZGZhZTMiLCAxfX07CisKKyAgICB3cml0ZUluaUZpbGVEYXRhKGZpbGVEYXRhKTsKKworICAgIEFTU0VSVF9UUlVFKG1JbmktPnJlYWQoKSk7CisgICAgRVhQRUNUX0VRKHZhbGlkRW50cmllcy5zaXplKCksIG1JbmktPnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiB2YWxpZEVudHJpZXMpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+aGFzS2V5KGtleXZhbC5maXJzdCkpOworICAgICAgICBFWFBFQ1RfRVEoa2V5dmFsLnNlY29uZCwgbUluaS0+Z2V0SW50KGtleXZhbC5maXJzdCwgZGVmYXVsdEludCkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZm9ybWF0VG9MaW5lcyh2ZWN0b3I8c3RyaW5nPiogbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBzdHJpbmc+JiBkYXRhTWFwKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiBkYXRhTWFwKSB7CisgICAgICAgIGxpbmVzLT5wdXNoX2JhY2soa2V5dmFsLmZpcnN0ICsgIiA9ICIgKyBrZXl2YWwuc2Vjb25kKTsKKyAgICB9Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgYm9vbEZvcm1hdCkgeworICAgIHN0YXRpYyBjb25zdCB1bm9yZGVyZWRfbWFwPHN0cmluZywgc3RyaW5nPiB2YWxpZFRydWVzID0ge3sidHJ1ZTEiLCAieWVzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ0cnVlMiIsICJZRVMifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InRydWUzIiwgInRydWUifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InRydWU0IiwgIlRSVUUifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InRydWU1IiwgIjEifX07CisgICAgc3RhdGljIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBzdHJpbmc+IHZhbGlkRmFsc2VzID0geworICAgICAgICAgICAgeyJmYWxzZTEiLCAibm8ifSwKKyAgICAgICAgICAgIHsiZmFsc2UyIiwgIk5PIn0sCisgICAgICAgICAgICB7ImZhbHNlMyIsICJmYWxzZSJ9LAorICAgICAgICAgICAgeyJmbGFzZTQiLCAiRkFMU0UifSwKKyAgICAgICAgICAgIHsiZmFsc2U1IiwgIjAifX07CisgICAgc3RhdGljIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBzdHJpbmc+IGludmFsaWRUcnVlcyA9IHsKKyAgICAgICAgICAgIHsidHJ1ZTEyIiwgImJsYWgifSwgeyJ0cnVlMTMiLCAiXCIxXCIifX07CisgICAgc3RhdGljIGNvbnN0IHVub3JkZXJlZF9tYXA8c3RyaW5nLCBzdHJpbmc+IGludmFsaWRGYWxzZXMgPSB7CisgICAgICAgICAgICB7ImZhbHNlMTIiLCAiYmxhaCJ9LCB7ImZhbHNlMTMiLCAiXCIwXCIifX07CisKKyAgICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKKyAgICBmb3JtYXRUb0xpbmVzKCZsaW5lcywgdmFsaWRUcnVlcyk7CisgICAgZm9ybWF0VG9MaW5lcygmbGluZXMsIGludmFsaWRUcnVlcyk7CisgICAgZm9ybWF0VG9MaW5lcygmbGluZXMsIHZhbGlkRmFsc2VzKTsKKyAgICBmb3JtYXRUb0xpbmVzKCZsaW5lcywgaW52YWxpZEZhbHNlcyk7CisgICAgd3JpdGVJbmlGaWxlRGF0YShsaW5lcyk7CisKKyAgICBBU1NFUlRfVFJVRShtSW5pLT5yZWFkKCkpOworICAgIEVYUEVDVF9FUShsaW5lcy5zaXplKCksIG1JbmktPnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiB2YWxpZFRydWVzKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1JbmktPmhhc0tleShrZXl2YWwuZmlyc3QpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+Z2V0Qm9vbChrZXl2YWwuZmlyc3QsIGZhbHNlKSk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYga2V5dmFsIDogdmFsaWRGYWxzZXMpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+aGFzS2V5KGtleXZhbC5maXJzdCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UobUluaS0+Z2V0Qm9vbChrZXl2YWwuZmlyc3QsIHRydWUpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiBpbnZhbGlkVHJ1ZXMpIHsKKyAgICAgICAgLy8gVGhlIGtleXZhbCBleGlzdHMsIGl0J3MganVzdCBub3QgYSB2YWxpZCBib29sIHZhbHVlLgorICAgICAgICBFWFBFQ1RfVFJVRShtSW5pLT5oYXNLZXkoa2V5dmFsLmZpcnN0KSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtSW5pLT5nZXRCb29sKGtleXZhbC5maXJzdCwgZmFsc2UpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXl2YWwgOiBpbnZhbGlkRmFsc2VzKSB7CisgICAgICAgIC8vIFRoZSBrZXl2YWwgZXhpc3RzLCBpdCdzIGp1c3Qgbm90IGEgdmFsaWQgYm9vbCB2YWx1ZS4KKyAgICAgICAgRVhQRUNUX1RSVUUobUluaS0+aGFzS2V5KGtleXZhbC5maXJzdCkpOworICAgICAgICBFWFBFQ1RfVFJVRShtSW5pLT5nZXRCb29sKGtleXZhbC5maXJzdCwgdHJ1ZSkpOworICAgIH0KK30KKworVEVTVF9GKEluaUZpbGVUZXN0LCBkaXNrU2l6ZUZvcm1hdCkgeworICAgIHN0YXRpYyBjb25zdCB1bm9yZGVyZWRfbWFwPHN0cmluZywgc3RyaW5nPiB2YWxpZERpc2tTaXplcyA9IHsKKyAgICAgICAgICAgIHsiVGhpcnR5QiIsICIzMCJ9LCB7Ik9uZUtpbG8iLCAiMWsifSwgIHsiRml2ZUtpbG8iLCAiNUsifSwKKyAgICAgICAgICAgIHsiT25lTWVnYSIsICIxbSJ9LCB7IkZpdmVNZWdhIiwgIjVNIn0sIHsiT25lR2lnYSIsICIxZyJ9LAorICAgICAgICAgICAgeyJGaXZlR2lnYSIsICI1RyJ9fTsKKyAgICBzdGF0aWMgY29uc3QgdW5vcmRlcmVkX21hcDxzdHJpbmcsIHN0cmluZz4gaW52YWxpZERpc2tTaXplcyA9IHsKKyAgICAgICAgICAgIHsiV3JvbmdVbml0IiwgIjMwaGVydHoifSwKKyAgICAgICAgICAgIHsiRnJhY3Rpb25hbE51bWJlciIsICIyLjE0MTQyMTM1NDIzIn0sCisgICAgICAgICAgICB7IkZyYWN0aW9uYWxLaWxvIiwgIjMuMTRLIn0sCisgICAgICAgICAgICB7InNtaWxleV9yZWFsbHkiLCAiOy0pIn19OworCisgICAgdmVjdG9yPHN0cmluZz4gbGluZXM7CisgICAgZm9ybWF0VG9MaW5lcygmbGluZXMsIHZhbGlkRGlza1NpemVzKTsKKyAgICBmb3JtYXRUb0xpbmVzKCZsaW5lcywgaW52YWxpZERpc2tTaXplcyk7CisgICAgd3JpdGVJbmlGaWxlRGF0YShsaW5lcyk7CisKKyAgICBBU1NFUlRfVFJVRShtSW5pLT5yZWFkKCkpOworICAgIEVYUEVDVF9FUShsaW5lcy5zaXplKCksIG1JbmktPnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDMwVUxMLCBtSW5pLT5nZXREaXNrU2l6ZSgiVGhpcnR5QiIsIDk5KSk7CisgICAgRVhQRUNUX0VRKDEwMjRVTEwsIG1JbmktPmdldERpc2tTaXplKCJPbmVLaWxvIiwgOTkpKTsKKyAgICBFWFBFQ1RfRVEoMTAyNCAqIDEwMjRVTEwsIG1JbmktPmdldERpc2tTaXplKCJPbmVNZWdhIiwgOTkpKTsKKyAgICBFWFBFQ1RfRVEoMTAyNCAqIDEwMjQgKiAxMDI0VUxMLCBtSW5pLT5nZXREaXNrU2l6ZSgiT25lR2lnYSIsIDk5KSk7CisgICAgRVhQRUNUX0VRKDUgKiAxMDI0VUxMLCBtSW5pLT5nZXREaXNrU2l6ZSgiRml2ZUtpbG8iLCA5OSkpOworICAgIEVYUEVDVF9FUSg1ICogMTAyNCAqIDEwMjRVTEwsIG1JbmktPmdldERpc2tTaXplKCJGaXZlTWVnYSIsIDk5KSk7CisgICAgRVhQRUNUX0VRKDUgKiAxMDI0ICogMTAyNCAqIDEwMjRVTEwsIG1JbmktPmdldERpc2tTaXplKCJGaXZlR2lnYSIsIDk5KSk7CisKKyAgICBFWFBFQ1RfRVEoOTlMLCBtSW5pLT5nZXREaXNrU2l6ZSgiV3JvbmdVbml0IiwgOTlMKSk7CisgICAgRVhQRUNUX0VRKDk5TCwgbUluaS0+Z2V0RGlza1NpemUoIkZyYWN0aW9uYWxOdW1iZXIiLCA5OUwpKTsKKyAgICBFWFBFQ1RfRVEoOTlMLCBtSW5pLT5nZXREaXNrU2l6ZSgiRnJhY3Rpb25hbEtpbG8iLCA5OUwpKTsKKyAgICBFWFBFQ1RfRVEoOTlMLCBtSW5pLT5nZXREaXNrU2l6ZSgic21pbGV5X3JlYWxseSIsIDk5TCkpOworfQorCitURVNUX0YoSW5pRmlsZVRlc3QsIGRpc2NhcmRFbXB0eSkgeworICAgIG1JbmktPnNldFN0cmluZygibm9uRW1wdHkiLCAic29tZVZhbHVlIik7CisgICAgbUluaS0+c2V0U3RyaW5nKCJlbXB0eSIsICIiKTsKKworICAgIEFTU0VSVF9UUlVFKG1JbmktPndyaXRlKCkpOworICAgIG1JbmkucmVzZXQobmV3IEluaUZpbGUobUluaUZpbGVQYXRoKSk7CisgICAgQVNTRVJUX0VRKDAsIG1JbmktPnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUobUluaS0+cmVhZCgpKTsKKyAgICBFWFBFQ1RfRVEoMiwgbUluaS0+c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoInNvbWVWYWx1ZSIsIG1JbmktPmdldFN0cmluZygibm9uRW1wdHkiLCAiZGVmYXVsdFN0cmluZyIpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIG1JbmktPmdldFN0cmluZygiZW1wdHkiLCAiZGVmYXVsdFN0cmluZyIpKTsKKworICAgIEVYUEVDVF9UUlVFKG1JbmktPndyaXRlRGlzY2FyZGluZ0VtcHR5KCkpOworICAgIG1JbmkucmVzZXQobmV3IEluaUZpbGUobUluaUZpbGVQYXRoKSk7CisgICAgQVNTRVJUX0VRKDAsIG1JbmktPnNpemUoKSk7CisgICAgQVNTRVJUX1RSVUUobUluaS0+cmVhZCgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbUluaS0+c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoInNvbWVWYWx1ZSIsIG1JbmktPmdldFN0cmluZygibm9uRW1wdHkiLCAiZGVmYXVsdFN0cmluZyIpKTsKKyAgICBFWFBFQ1RfRVEoImRlZmF1bHRTdHJpbmciLCBtSW5pLT5nZXRTdHJpbmcoImVtcHR5IiwgImRlZmF1bHRTdHJpbmciKSk7Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgd3JpdGVJZkNoYW5nZWQpIHsKKyAgICAvLyBJbml0aWFsbHksIHdlIG11c3QgdHJlYXQgdGhlIG9iamVjdCBhcyBkaXJ0eS4KKyAgICAvLyBIZW5jZSwgd2UnbGwgY2xlYXIgdGhlIGxpbmVzIHdlJ2Qgd3JpdHRlbiBwcmV2aW91c2x5LgorICAgIG1JbmkucmVzZXQobmV3IEluaUZpbGUobUluaUZpbGVQYXRoKSk7CisgICAgdmVyaWZ5RmlsZVVwZGF0ZWQodHJ1ZSk7CisKKyAgICBtSW5pLT53cml0ZSgpOworICAgIC8vIE5vdyB3ZSBjb25zaWRlciB0aGUgb2JqZWN0IGFzIGNsZWFuLCBzbyB3cml0ZSBzaG91bGRuJ3QgbW9kaWZ5IHRoZQorICAgIC8vIHVuZGVybHlpbmcgZmlsZS4KKyAgICB2ZXJpZnlGaWxlVXBkYXRlZChmYWxzZSk7CisKKyAgICAvLyBOb3cgbGV0J3MgY2hhbmdlIHRoZSBkYXRhLgorICAgIG1JbmktPnNldFN0cmluZygicmFuZG9tIiwgInlpcHBlZWVlIik7CisgICAgdmVyaWZ5RmlsZVVwZGF0ZWQodHJ1ZSk7CisKKyAgICBtSW5pLT5yZWFkKCk7CisgICAgLy8gTm8gY2hhbmdlcywgc28gd3JpdGUgc2hvdWxkbid0IGRvIGFueXRoaW5nLgorICAgIHZlcmlmeUZpbGVVcGRhdGVkKGZhbHNlKTsKKyAgICAvLyBCdXQgcmVzZXR0aW5nIHRoZSBmaWxlIHBhdGggbWVhbnMgd2Ugc2hvdWxkIGZsdXNoLgorICAgIG1JbmktPnNldEJhY2tpbmdGaWxlKG1JbmlGaWxlUGF0aCk7CisgICAgdmVyaWZ5RmlsZVVwZGF0ZWQodHJ1ZSk7Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgbm9CYWNraW5nRmlsZSkgeworICAgIG1JbmkucmVzZXQobmV3IEluaUZpbGUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKG1JbmktPnJlYWQoKSk7CisKKyAgICBtSW5pLT5zZXRCYWNraW5nRmlsZShtSW5pRmlsZVBhdGgpOworICAgIEFTU0VSVF9GQUxTRShtSW5pLT5yZWFkKCkpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPndyaXRlKCkpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPnJlYWQoKSk7Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgaXRlcmF0b3IpIHsKKyAgICBtSW5pLT5zZXRTdHJpbmcoImZpcnN0S2V5IiwgImZpcnN0VmFsdWUiKTsKKyAgICBtSW5pLT5zZXRTdHJpbmcoInNlY29uZEtleSIsICJzZWNvbmRWYWx1ZSIpOworCisgICAgLy8gQ29uc3QgaXRlcmF0b3JzLCBhbHNvIHZlcmlmeSBvcmRlci4KKyAgICBjb25zdCBJbmlGaWxlJiBjSW5pID0gKm1Jbmk7CisgICAgdmVjdG9yPHN0cmluZz4ga2V5cyA9IHsiZmlyc3RLZXkiLCAic2Vjb25kS2V5In07CisgICAgQVNTRVJUX0VRKGtleXMuc2l6ZSgpLCBtSW5pLT5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleSA6IGNJbmkpIHsKKyAgICAgICAgRVhQRUNUX0VRKGtleXNbaV0sIGtleSk7CisgICAgICAgICsraTsKKyAgICB9Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgZGlza0ZpbGVPcmRlcikgeworICAgIHZlY3RvcjxzdHJpbmc+IGxpbmVzID0geworICAgICAgICAgICAgImZpcnN0ID0gc29tZSB2YWxpZCB2YWx1ZSIsICAic2Vjb25kIGxpbmUgaXMgaW52YWxpZCIsCisgICAgICAgICAgICAiOyBUaGlyZCBsaW5lIGlzIGEgY29tbWVudCIsICJmb3VydGggPSBpcyB2YWxpZCIsCisgICAgICAgICAgICAiIyBGaWZ0aCBpcyBhbHNvIGEgY29tbWVudCIsICIiLAorICAgICAgICAgICAgIjtTaXh0aCB3YXMgYSBjb21tZW50IiwgICAgICAiM3AwID0gaXMgYW4gaW52YWxpZCBrZXkiLAorICAgICAgICAgICAgImxldHMgPSBmaW5pc2ggd2l0aCB2YWxpZCJ9OworICAgIHZlY3RvcjxzdHJpbmc+IHJld3JpdHRlbl9saW5lcyA9IHsiZmlyc3QgPSBzb21lIHZhbGlkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsgVGhpcmQgbGluZSBpcyBhIGNvbW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91cnRoID0gaXMgdmFsaWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBGaWZ0aCBpcyBhbHNvIGEgY29tbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiO1NpeHRoIHdhcyBhIGNvbW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGV0cyA9IGZpbmlzaCB3aXRoIHZhbGlkIn07CisKKyAgICB3cml0ZUluaUZpbGVEYXRhKGxpbmVzKTsKKyAgICBBU1NFUlRfVFJVRShtSW5pLT5yZWFkKCkpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPndyaXRlKCkpOworICAgIHZlcmlmeUZpbGVDb250ZW50cyhyZXdyaXR0ZW5fbGluZXMpOworCisgICAgLy8gVGhpcyBpcyBvcmRlciBpbmRwZW5kZW50LiBMZXQncyB0cnkgdGhlIHJldmVyc2UKKyAgICBzdGQ6OnJldmVyc2Uoc3RkOjpiZWdpbihsaW5lcyksIHN0ZDo6ZW5kKGxpbmVzKSk7CisgICAgc3RkOjpyZXZlcnNlKHN0ZDo6YmVnaW4ocmV3cml0dGVuX2xpbmVzKSwgc3RkOjplbmQocmV3cml0dGVuX2xpbmVzKSk7CisgICAgd3JpdGVJbmlGaWxlRGF0YShsaW5lcyk7CisgICAgQVNTRVJUX1RSVUUobUluaS0+cmVhZCgpKTsKKyAgICBBU1NFUlRfVFJVRShtSW5pLT53cml0ZSgpKTsKKyAgICB2ZXJpZnlGaWxlQ29udGVudHMocmV3cml0dGVuX2xpbmVzKTsKKworICAgIC8vIEV4dHJhIGtleXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLgorICAgIG1JbmktPnNldFN0cmluZygiZXh0cmFLZXkiLCAiZXh0cmFWYWx1ZSIpOworICAgIEFTU0VSVF9UUlVFKG1JbmktPndyaXRlKCkpOworICAgIHJld3JpdHRlbl9saW5lcy5wdXNoX2JhY2soImV4dHJhS2V5ID0gZXh0cmFWYWx1ZSIpOworICAgIHZlcmlmeUZpbGVDb250ZW50cyhyZXdyaXR0ZW5fbGluZXMpOworCisgICAgLy8gVGVzdCBvcmRlciBvZiBpdGVyYXRpb24gaW4gdGhpcyBjb21wbGljYXRlZCBjYXNlLgorICAgIC8vIFJlbWViZXIgd2UgcmV2ZXJzZWQgdGhlIGxpbmVzLgorICAgIHZlY3RvcjxzdHJpbmc+IGtleXMgPSB7ImxldHMiLCAiZm91cnRoIiwgImZpcnN0IiwgImV4dHJhS2V5In07CisgICAgQVNTRVJUX0VRKGtleXMuc2l6ZSgpLCBtSW5pLT5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGtleSA6ICptSW5pKSB7CisgICAgICAgIEVYUEVDVF9FUShrZXlzW2ldLCBrZXkpOworICAgICAgICArK2k7CisgICAgfQorfQorCitURVNUX0YoSW5pRmlsZVRlc3QsIHN0ckRlZmF1bHRWYWx1ZXMpIHsKKyAgICBBU1NFUlRfRVEoMCwgbUluaS0+c2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShtSW5pLT5nZXRCb29sU3RyKCJtaXNzaW5nS2V5IiwgInllcyIpKTsKKyAgICBFWFBFQ1RfRkFMU0UobUluaS0+Z2V0Qm9vbFN0cigibWlzc2luZ0tleSIsICJubyIpKTsKKyAgICBFWFBFQ1RfRVEoMTAyNFVMTCwgbUluaS0+Z2V0RGlza1NpemVTdHIoIm1pc3NpbmdLZXkiLCAiMWsiKSk7Cit9CisKK1RFU1RfRihJbmlGaWxlVGVzdCwgbWFrZVZhbGlkS2V5KSB7CisgICAgRVhQRUNUX1NUUkVRKCJfa2V5IiwgSW5pRmlsZTo6bWFrZVZhbGlkS2V5KCJrZXkiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIl8iLCBJbmlGaWxlOjptYWtlVmFsaWRLZXkoIiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiXy4zRCIsIEluaUZpbGU6Om1ha2VWYWxpZEtleSgiPSIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiX2EuMjBzaWduLjIwLjIzIiwgSW5pRmlsZTo6bWFrZVZhbGlkS2V5KCJhIHNpZ24gIyIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiX3NvbWUuMjBudW1iZXIuMjAxMC4yMHdpdGhpbiIsCisgICAgICAgICAgICAgICAgIEluaUZpbGU6Om1ha2VWYWxpZEtleSgic29tZSBudW1iZXIgMTAgd2l0aGluIikuY19zdHIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkOThlMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5jcHAKQEAgLTAsMCArMSwyOTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY29uc3QgY2hhciogY29uc3QgUGF0aFV0aWxzOjprRXhlTmFtZVN1ZmZpeGVzW2tIb3N0VHlwZUNvdW50XSA9IHsgIiIsICIuZXhlIiB9OworCitjb25zdCBjaGFyKiBjb25zdCBQYXRoVXRpbHM6OmtFeGVOYW1lU3VmZml4ID0KKyAgICAgICAgUGF0aFV0aWxzOjprRXhlTmFtZVN1ZmZpeGVzW1BhdGhVdGlsczo6SE9TVF9UWVBFXTsKKworc3RkOjpzdHJpbmcgUGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKFN0cmluZ1ZpZXcgYmFzZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+KGJhc2VOYW1lKS5hcHBlbmQoCisgICAgICAgICAgICBrRXhlTmFtZVN1ZmZpeGVzW2hvc3RUeXBlXSk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBQYXRoVXRpbHM6OmlzRGlyU2VwYXJhdG9yKGludCBjaCwgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICByZXR1cm4gKGNoID09ICcvJykgfHwgKGhvc3RUeXBlID09IEhPU1RfV0lOMzIgJiYgY2ggPT0gJ1xcJyk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBQYXRoVXRpbHM6OmlzUGF0aFNlcGFyYXRvcihpbnQgY2gsIEhvc3RUeXBlIGhvc3RUeXBlKSB7CisgICAgcmV0dXJuIChob3N0VHlwZSA9PSBIT1NUX1BPU0lYICYmIGNoID09ICc6JykgfHwKKyAgICAgICAgICAgIChob3N0VHlwZSA9PSBIT1NUX1dJTjMyICYmIGNoID09ICc7Jyk7Cit9CisKKy8vIHN0YXRpYworc2l6ZV90IFBhdGhVdGlsczo6cm9vdFByZWZpeFNpemUoU3RyaW5nVmlldyBwYXRoLCBIb3N0VHlwZSBob3N0VHlwZSkgeworICAgIGlmIChwYXRoLmVtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGhvc3RUeXBlICE9IEhPU1RfV0lOMzIpCisgICAgICAgIHJldHVybiAocGF0aFswXSA9PSAnLycpID8gMVUgOiAwVTsKKworICAgIHNpemVfdCByZXN1bHQgPSAwOworICAgIGlmIChwYXRoWzFdID09ICc6JykgeworICAgICAgICBpbnQgY2ggPSBwYXRoWzBdOworICAgICAgICBpZiAoKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHx8IChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IDJVOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAocGF0aC5iZWdpbigpLCAiXFxcXC5cXCIsIDQpIHx8CisgICAgICAgICAgICAhc3RybmNtcChwYXRoLmJlZ2luKCksICJcXFxcP1xcIiwgNCkpIHsKKyAgICAgICAgLy8gVU5DIHByZWZpeGVzLgorICAgICAgICByZXR1cm4gNFU7CisgICAgfSBlbHNlIGlmIChpc0RpclNlcGFyYXRvcihwYXRoWzBdLCBob3N0VHlwZSkpIHsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgaWYgKGlzRGlyU2VwYXJhdG9yKHBhdGhbMV0sIGhvc3RUeXBlKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gMjsKKyAgICAgICAgICAgIHdoaWxlIChwYXRoW3Jlc3VsdF0gJiYgIWlzRGlyU2VwYXJhdG9yKHBhdGhbcmVzdWx0XSwgSE9TVF9XSU4zMikpCisgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlc3VsdCAmJiBwYXRoW3Jlc3VsdF0gJiYgaXNEaXJTZXBhcmF0b3IocGF0aFtyZXN1bHRdLCBIT1NUX1dJTjMyKSkKKyAgICAgICAgcmVzdWx0Kys7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK2Jvb2wgUGF0aFV0aWxzOjppc0Fic29sdXRlKFN0cmluZ1ZpZXcgcGF0aCwgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICBzaXplX3QgcHJlZml4U2l6ZSA9IHJvb3RQcmVmaXhTaXplKHBhdGgsIGhvc3RUeXBlKTsKKyAgICBpZiAoIXByZWZpeFNpemUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaG9zdFR5cGUgIT0gSE9TVF9XSU4zMikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGlzRGlyU2VwYXJhdG9yKHBhdGhbcHJlZml4U2l6ZSAtIDFdLCBIT1NUX1dJTjMyKTsKK30KKworLy8gc3RhdGljCitTdHJpbmdWaWV3IFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGNvbnN0IFN0cmluZ1ZpZXcgcGF0aCwgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICB1c2luZyByaXRlciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxTdHJpbmdWaWV3Ojpjb25zdF9pdGVyYXRvcj47CisKKyAgICBmb3IgKGF1dG8gaXQgPSByaXRlcihwYXRoLmVuZCgpKSwgaXRFbmQgPSByaXRlcihwYXRoLmJlZ2luKCkpOworICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKCppdCA9PSAnLicpIHsKKyAgICAgICAgICAgIC8vIHJldmVyc2UgaXRlcmF0b3Igc3RvcmVzIGEgYmFzZSsxLCBzbyBkZWNyZW1lbnQgaXQgd2hlbiByZXR1cm5pbmcKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdWaWV3KHN0ZDo6cHJldihpdC5iYXNlKCkpLCBwYXRoLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNEaXJTZXBhcmF0b3IoKml0LCBob3N0VHlwZSkpIHsKKyAgICAgICAgICAgIC8vIG5vIGV4dGVuc2lvbiBoZXJlIC0gd2UndmUgZm91bmQgdGhlIGVuZCBvZiBmaWxlIG5hbWUgYWxyZWFkeQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBlaXRoZXIgdGhlcmUncyBubyBkb3QgaW4gdGhlIHdob2xlIHBhdGgsIG9yIHdlIGZvdW5kIGRpcmVjdG9yeSBzZXBhcmF0b3IKKyAgICAvLyBmaXJzdCAtIGFueXdheSwgdGhlcmUncyBubyBleHRlbnNpb24gaW4gdGhpcyBuYW1lCisgICAgcmV0dXJuIFN0cmluZ1ZpZXcoKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBQYXRoVXRpbHM6OnJlbW92ZVRyYWlsaW5nRGlyU2VwYXJhdG9yKFN0cmluZ1ZpZXcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwYXRoOworICAgIHNpemVfdCBwYXRoTGVuID0gcmVzdWx0LnNpemUoKTsKKyAgICAvLyBOT1RFOiBEb24ndCByZW1vdmUgaW5pdGlhbCBwYXRoIHNlcGFyYXRvciBmb3IgYWJzb2x1dGUgcGF0aHMuCisgICAgd2hpbGUgKHBhdGhMZW4gPiAxVSAmJiBpc0RpclNlcGFyYXRvcihyZXN1bHRbcGF0aExlbiAtIDFVXSwgaG9zdFR5cGUpKSB7CisgICAgICAgIHBhdGhMZW4tLTsKKyAgICB9CisgICAgcmVzdWx0LnJlc2l6ZShwYXRoTGVuKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIFBhdGhVdGlsczo6YWRkVHJhaWxpbmdEaXJTZXBhcmF0b3IoU3RyaW5nVmlldyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0VHlwZSBob3N0VHlwZSkgeworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHBhdGg7CisgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAwICYmICFpc0RpclNlcGFyYXRvcihyZXN1bHRbcmVzdWx0LnNpemUoKSAtIDFVXSkpIHsKKyAgICAgICAgcmVzdWx0ICs9IGdldERpclNlcGFyYXRvcihob3N0VHlwZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworYm9vbCBQYXRoVXRpbHM6OnNwbGl0KFN0cmluZ1ZpZXcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBIb3N0VHlwZSBob3N0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZGlyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogYmFzZU5hbWUpIHsKKyAgICBpZiAocGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhIHRyYWlsaW5nIGRpcmVjdG9yeSBzZXBhcmF0b3IsIHJldHVybiBhbiBlcnJvci4KKyAgICBzaXplX3QgZW5kID0gcGF0aC5zaXplKCk7CisgICAgaWYgKGlzRGlyU2VwYXJhdG9yKHBhdGhbZW5kIC0gMVVdLCBob3N0VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEZpbmQgbGFzdCBzZXBhcmF0b3IuCisgICAgc2l6ZV90IHByZWZpeExlbiA9IHJvb3RQcmVmaXhTaXplKHBhdGgsIGhvc3RUeXBlKTsKKyAgICBzaXplX3QgcG9zID0gZW5kOworICAgIHdoaWxlIChwb3MgPiBwcmVmaXhMZW4gJiYgIWlzRGlyU2VwYXJhdG9yKHBhdGhbcG9zIC0gMVVdLCBob3N0VHlwZSkpIHsKKyAgICAgICAgcG9zLS07CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvbW1vbiBjYXNlLgorICAgIGlmIChwb3MgPiBwcmVmaXhMZW4pIHsKKyAgICAgICAgaWYgKGRpck5hbWUpIHsKKyAgICAgICAgICAgIGRpck5hbWUtPmFzc2lnbihwYXRoLmJlZ2luKCksIHBvcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VOYW1lKSB7CisgICAgICAgICAgICBiYXNlTmFtZS0+YXNzaWduKHBhdGguYmVnaW4oKSArIHBvcywgZW5kIC0gcG9zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSBpcyBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLCB0aGUgcGF0aCBpcyBhIHNpbmdsZSBmaWxlIG5hbWUuCisgICAgaWYgKGRpck5hbWUpIHsKKyAgICAgICAgaWYgKCFwcmVmaXhMZW4pIHsKKyAgICAgICAgICAgIGRpck5hbWUtPmFzc2lnbigiLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlyTmFtZS0+YXNzaWduKHBhdGguYmVnaW4oKSwgcHJlZml4TGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmFzZU5hbWUpIHsKKyAgICAgICAgYmFzZU5hbWUtPmFzc2lnbihwYXRoLmJlZ2luKCkgKyBwcmVmaXhMZW4sIGVuZCAtIHByZWZpeExlbik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIFBhdGhVdGlsczo6am9pbihTdHJpbmdWaWV3IHBhdGgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZpZXcgcGF0aDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICBpZiAocGF0aDEuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gcGF0aDI7CisgICAgfQorICAgIGlmIChwYXRoMi5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBwYXRoMTsKKyAgICB9CisgICAgaWYgKGlzQWJzb2x1dGUocGF0aDIsIGhvc3RUeXBlKSkgeworICAgICAgICByZXR1cm4gcGF0aDI7CisgICAgfQorICAgIHNpemVfdCBwcmVmaXhMZW4gPSByb290UHJlZml4U2l6ZShwYXRoMSwgaG9zdFR5cGUpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdChwYXRoMSk7CisgICAgc2l6ZV90IGVuZCA9IHJlc3VsdC5zaXplKCk7CisgICAgaWYgKGVuZCA+IHByZWZpeExlbiAmJiAhaXNEaXJTZXBhcmF0b3IocmVzdWx0W2VuZCAtIDFVXSwgaG9zdFR5cGUpKSB7CisgICAgICAgIHJlc3VsdCArPSBnZXREaXJTZXBhcmF0b3IoaG9zdFR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcGF0aDI7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUGF0aFV0aWxzOjpkZWNvbXBvc2UoU3RyaW5nVmlldyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RUeXBlIGhvc3RUeXBlKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKKyAgICBpZiAocGF0aC5lbXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgc2l6ZV90IHByZWZpeExlbiA9IHJvb3RQcmVmaXhTaXplKHBhdGgsIGhvc3RUeXBlKTsKKyAgICBhdXRvIGl0ID0gcGF0aC5iZWdpbigpOworICAgIGlmIChwcmVmaXhMZW4pIHsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhzdGQ6OnN0cmluZyhpdCwgcHJlZml4TGVuKSk7CisgICAgICAgIGl0ICs9IHByZWZpeExlbjsKKyAgICB9CisgICAgZm9yICg7OykgeworICAgICAgICBhdXRvIHAgPSBpdDsKKyAgICAgICAgd2hpbGUgKCpwICYmICFpc0RpclNlcGFyYXRvcigqcCwgaG9zdFR5cGUpKQorICAgICAgICAgICAgcCsrOworICAgICAgICBpZiAocCA+IGl0KSB7CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGl0LCBwIC0gaXQpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpdCA9IHAgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIFBhdGhVdGlsczo6cmVjb21wb3NlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RUeXBlIGhvc3RUeXBlKSB7CisgICAgY29uc3QgY2hhciBkaXJTZXBhcmF0b3IgPSBnZXREaXJTZXBhcmF0b3IoaG9zdFR5cGUpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBzaXplX3QgY2FwYWNpdHkgPSAwOworICAgIC8vIFRvIHJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbnMsIGNvbXB1dGUgY2FwYWNpdHkgYmVmb3JlIGRvaW5nIHRoZQorICAgIC8vIHJlYWwgYXBwZW5kLgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgY29tcG9uZW50cy5zaXplKCk7ICsrbikgeworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGNhcGFjaXR5Kys7CisgICAgICAgIGNhcGFjaXR5ICs9IGNvbXBvbmVudHNbbl0uc2l6ZSgpOworICAgIH0KKworICAgIHJlc3VsdC5yZXNlcnZlKGNhcGFjaXR5KTsKKworICAgIGJvb2wgYWRkU2VwYXJhdG9yID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBjb21wb25lbnRzLnNpemUoKTsgKytuKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21wb25lbnQgPSBjb21wb25lbnRzW25dOworICAgICAgICBpZiAoYWRkU2VwYXJhdG9yKQorICAgICAgICAgICAgcmVzdWx0ICs9IGRpclNlcGFyYXRvcjsKKyAgICAgICAgYWRkU2VwYXJhdG9yID0gdHJ1ZTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IHByZWZpeExlbiA9IHJvb3RQcmVmaXhTaXplKGNvbXBvbmVudCwgaG9zdFR5cGUpOworICAgICAgICAgICAgaWYgKHByZWZpeExlbiA9PSBjb21wb25lbnQuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgYWRkU2VwYXJhdG9yID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGNvbXBvbmVudHNbbl07CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYwordm9pZCBQYXRoVXRpbHM6OnNpbXBsaWZ5Q29tcG9uZW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvbXBvbmVudHMpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RhY2s7CisgICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29tcG9uZW50cy0+YmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNvbXBvbmVudHMtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgqaXQgPT0gIi4iKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgYW55IGluc3RhbmNlIG9mICcuJyBmcm9tIHRoZSBsaXN0LgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCppdCA9PSAiLi4iKSB7CisgICAgICAgICAgICAvLyBIYW5kbGluZyBvZiAnLi4nIGlzIHNwZWNpZmljOiBpZiB0aGVyZSBpcyBhIGl0ZW0gb24gdGhlCisgICAgICAgICAgICAvLyBzdGFjayB0aGF0IGlzIG5vdCAnLi4nLCB0aGVuIHJlbW92ZSBpdCwgb3RoZXJ3aXNlIHB1c2gKKyAgICAgICAgICAgIC8vIHRoZSAnLi4nLgorICAgICAgICAgICAgaWYgKCFzdGFjay5lbXB0eSgpICYmIHN0YWNrW3N0YWNrLnNpemUoKSAtMVVdICE9ICIuLiIpIHsKKyAgICAgICAgICAgICAgICBzdGFjay5yZXNpemUoc3RhY2suc2l6ZSgpIC0gMVUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFjay5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIElmIG5vdCBhICcuLicsIGp1c3QgcHVzaCBvbiB0aGUgc3RhY2suCisgICAgICAgIHN0YWNrLnB1c2hfYmFjaygqaXQpOworICAgIH0KKyAgICBpZiAoc3RhY2suZW1wdHkoKSkKKyAgICAgICAgc3RhY2sucHVzaF9iYWNrKCIuIik7CisKKyAgICBjb21wb25lbnRzLT5zd2FwKHN0YWNrKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMThlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaApAQCAtMCwwICsxLDIyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFuYWdlIGZpbGUgcGF0aHMuIE5vbmUgb2YgdGhlc2Ugc2hvdWxkIHRvdWNoIHRoZQorLy8gZmlsZSBzeXN0ZW0uIEFsbCBtZXRob2RzIG11c3QgYmUgc3RhdGljLgorY2xhc3MgUGF0aFV0aWxzIHsKK3B1YmxpYzoKKyAgICAvLyBBbiBlbnVtIGxpc3RpbmcgdGhlIHN1cHBvcnRlZCBob3N0IGZpbGUgc3lzdGVtIHR5cGVzLgorICAgIC8vIEhPU1RfUE9TSVggbWVhbnMgYSBQb3NpeC1saWtlIGZpbGUgc3lzdGVtLgorICAgIC8vIEhPU1RfV0lOMzIgbWVhbnMgYSBXaW5kb3dzLWxpa2UgZmlsZSBzeXN0ZW0uCisgICAgLy8gSE9TVF9UWVBFIG1lYW5zIHRoZSBjdXJyZW50IGhvc3QgdHlwZSAob25lIG9mIHRoZSBhYm92ZSkuCisgICAgLy8gTk9URTogSWYgeW91IHVwZGF0ZSB0aGlzIGxpc3QsIG1vZGlmeSBrSG9zdFR5cGVDb3VudCBiZWxvdyB0b28uCisgICAgZW51bSBIb3N0VHlwZSB7CisgICAgICAgIEhPU1RfUE9TSVggPSAwLAorICAgICAgICBIT1NUX1dJTjMyID0gMSwKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgSE9TVF9UWVBFID0gSE9TVF9XSU4zMiwKKyNlbHNlCisgICAgICAgIEhPU1RfVFlQRSA9IEhPU1RfUE9TSVgsCisjZW5kaWYKKyAgICB9OworCisgICAgLy8gVGhlIG51bWJlciBvZiBkaXN0aW5jdCBpdGVtcyBpbiB0aGUgSG9zdFR5cGUgZW51bWVyYXRpb24gYWJvdmUuCisgICAgc3RhdGljIGNvbnN0IGludCBrSG9zdFR5cGVDb3VudCA9IDI7CisKKyAgICAvLyBTdWZmaXhlcyBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlICguZXhlIG9uIFdpbmRvd3MsIGVtcHR5IG90aGVyd2lzZSkKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0V4ZU5hbWVTdWZmaXhlc1trSG9zdFR5cGVDb3VudF07CisKKyAgICAvLyBTdWZmaXhlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0KKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0V4ZU5hbWVTdWZmaXg7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBleGVjdXRhYmxlIG5hbWUgZm9yIGEgYmFzZSBuYW1lIHxiYXNlTmFtZXwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdG9FeGVjdXRhYmxlTmFtZShTdHJpbmdWaWV3IGJhc2VOYW1lLCBIb3N0VHlwZSBob3N0VHlwZSk7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdG9FeGVjdXRhYmxlTmFtZShTdHJpbmdWaWV3IGJhc2VOYW1lKSB7CisgICAgICAgIHJldHVybiB0b0V4ZWN1dGFibGVOYW1lKGJhc2VOYW1lLCBIT1NUX1RZUEUpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmIHxjaHwgaXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGZvciBhIGdpdmVuIHxob3N0VHlwZXwuCisgICAgc3RhdGljIGJvb2wgaXNEaXJTZXBhcmF0b3IoaW50IGNoLCBIb3N0VHlwZSBob3N0VHlwZSk7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB8Y2h8IGlzIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisgICAgc3RhdGljIGJvb2wgaXNEaXJTZXBhcmF0b3IoaW50IGNoKSB7CisgICAgICAgIHJldHVybiBpc0RpclNlcGFyYXRvcihjaCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB8Y2h8IGlzIGEgcGF0aCBzZXBhcmF0b3IgZm9yIGEgZ2l2ZW4gfGhvc3RUeXBlfC4KKyAgICBzdGF0aWMgYm9vbCBpc1BhdGhTZXBhcmF0b3IoaW50IGNoLCBIb3N0VHlwZSBob3N0VHlwZSk7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB8Y2h8IGlzIGEgcGF0aCBzZXBhcmF0b3IgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAgIHN0YXRpYyBib29sIGlzUGF0aFNlcGFyYXRvcihpbnQgY2gpIHsKKyAgICAgICAgcmV0dXJuIGlzUGF0aFNlcGFyYXRvcihjaCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyIGZvciBhIGdpdmVuIHxob3N0VHlwZXwKKyAgICBzdGF0aWMgY2hhciBnZXREaXJTZXBhcmF0b3IoSG9zdFR5cGUgaG9zdFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIChob3N0VHlwZSA9PSBIT1NUX1dJTjMyKSA/ICdcXCcgOiAnLyc7CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNlcGFyYXRvcnMgZnJvbSBhIHxwYXRofCBzdHJpbmcsIGZvciBhIGdpdmVuIHxob3N0VHlwZXwuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHJlbW92ZVRyYWlsaW5nRGlyU2VwYXJhdG9yKFN0cmluZ1ZpZXcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpOworCisgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNlcGFyYXRvcnMgZnJvbSBhIHxwYXRofCBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IGhvc3QuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHJlbW92ZVRyYWlsaW5nRGlyU2VwYXJhdG9yKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgICAgICByZXR1cm4gcmVtb3ZlVHJhaWxpbmdEaXJTZXBhcmF0b3IocGF0aCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYSB0cmFpbGluZyBzZXBhcmF0b3IgaWYgbmVlZGVkLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBhZGRUcmFpbGluZ0RpclNlcGFyYXRvcihTdHJpbmdWaWV3IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RUeXBlIGhvc3RUeXBlKTsKKworICAgIC8vIEFkZCBhIHRyYWlsaW5nIHNlcGFyYXRvciBpZiBuZWVkZWQuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgICAgICByZXR1cm4gYWRkVHJhaWxpbmdEaXJTZXBhcmF0b3IocGF0aCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBJZiB8cGF0aH0gc3RhcnRzIHdpdGggYSByb290IHByZWZpeCwgcmV0dXJuIGl0cyBzaXplIGluIGJ5dGVzLCBvcgorICAgIC8vIDAgb3RoZXJ3aXNlLiBUaGUgZGVmaW5pdGlvbiBvZiB2YWxpZCByb290IHByZWZpeGVzIGRlcGVuZHMgb24gdGhlCisgICAgLy8gdmFsdWUgb2YgfGhvc3RUeXBlfC4gRm9yIEhPU1RfUE9TSVgsIGl0J3MgYW55IHBhdGggdGhhdCBiZWdpbnMKKyAgICAvLyB3aXRoIGEgc2xhc2ggKC8pLiBGb3IgSE9TVF9XSU4zMiwgdGhlIGZvbGxvd2luZyBwcmVmaXhlcyBhcmUKKyAgICAvLyByZWNvZ25pemVkOgorICAgIC8vICAgIDxkcml2ZT46CisgICAgLy8gICAgPGRyaXZlPjo8c2VwPgorICAgIC8vICAgIDxzZXA+PHNlcD52b2x1bWVOYW1lPHNlcD4KKyAgICBzdGF0aWMgc2l6ZV90IHJvb3RQcmVmaXhTaXplKFN0cmluZ1ZpZXcgcGF0aCwgSG9zdFR5cGUgaG9zdFR5cGUpOworCisgICAgLy8gUmV0dXJuIHRoZSByb290IHByZWZpeCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uIFNlZSBhYm92ZSBmb3IKKyAgICAvLyBkb2N1bWVudGF0aW9uLgorICAgIHN0YXRpYyBzaXplX3Qgcm9vdFByZWZpeFNpemUoU3RyaW5nVmlldyBwYXRoKSB7CisgICAgICAgIHJldHVybiByb290UHJlZml4U2l6ZShwYXRoLCBIT1NUX1RZUEUpOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB8cGF0aHwgaXMgYW4gYWJzb2x1dGUgcGF0aCBmb3IgYSBnaXZlbiB8aG9zdFR5cGV8LgorICAgIHN0YXRpYyBib29sIGlzQWJzb2x1dGUoU3RyaW5nVmlldyBwYXRoLCBIb3N0VHlwZSBob3N0VHlwZSk7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgfHBhdGh8IGlzIGFuIGFic29sdXRlIHBhdGggZm9yIHRoZSBjdXJyZW50IGhvc3QuCisgICAgc3RhdGljIGJvb2wgaXNBYnNvbHV0ZShTdHJpbmdWaWV3IHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGlzQWJzb2x1dGUocGF0aCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYW4gZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIG5hbWUvcGF0aCAodGhlIHBhcnQgb2YgdGhlIG5hbWUgYWZ0ZXIKKyAgICAvLyBsYXN0IGRvdCwgaW5jbHVkaW5nIHRoZSBkb3QuIEUuZy46CisgICAgLy8gICJmaWxlLm5hbWUiIC0+ICIubmFtZSIKKyAgICAvLyAgImZpbGUiIC0+ICIiCisgICAgLy8gICJmaWxlLiIgLT4gIi4iCisgICAgLy8gICIvZnVsbC9wYXRoLnBuZyIgLT4gIi5wbmciCisgICAgc3RhdGljIFN0cmluZ1ZpZXcgZXh0ZW5zaW9uKFN0cmluZ1ZpZXcgcGF0aCwgSG9zdFR5cGUgaG9zdFR5cGUgPSBIT1NUX1RZUEUpOworCisgICAgLy8gU3BsaXQgfHBhdGh8IGludG8gYSBkaXJlY3RvcnkgbmFtZSBhbmQgYSBmaWxlIG5hbWUuIHxkaXJOYW1lfCBhbmQKKyAgICAvLyB8YmFzZU5hbWV8IGFyZSBvcHRpb25hbCBwb2ludGVycyB0byBzdHJpbmdzIHRoYXQgd2lsbCByZWNlaXZlIHRoZQorICAgIC8vIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50cyBvbiBzdWNjZXNzLiB8aG9zdFR5cGV8IGlzIGEgaG9zdCB0eXBlLgorICAgIC8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIG9uIGZhaWx1cmUuCisgICAgLy8gTm90ZSB0aGF0IHVubGlrZSB0aGUgVW5peCAnYmFzZW5hbWUnIGNvbW1hbmQsIHRoZSBjb21tYW5kIHdpbGwgZmFpbAorICAgIC8vIGlmIHxwYXRofCBlbmRzIHdpdGggZGlyZWN0b3J5IHNlcGFyYXRvciBvciBpcyBhIHNpbmdsZSByb290IHByZWZpeC4KKyAgICAvLyBXaW5kb3dzIHJvb3QgcHJlZml4ZXMgYXJlIGZ1bGx5IHN1cHBvcnRlZCwgd2hpY2ggbWVhbnMgdGhlIGZvbGxvd2luZzoKKyAgICAvLworICAgIC8vICAgICAvICAgICAgICAgICAgLT4gZXJyb3IuCisgICAgLy8gICAgIC9mb28gICAgICAgICAtPiAnLycgKyAnZm9vJworICAgIC8vICAgICBmb28gICAgICAgICAgLT4gJy4nICsgJ2ZvbycKKyAgICAvLyAgICAgPGRyaXZlPjogICAgIC0+IGVycm9yLgorICAgIC8vICAgICA8ZHJpdmU+OmZvbyAgLT4gJzxkcml2ZT46JyArICdmb28nCisgICAgLy8gICAgIDxkcml2ZT46XGZvbyAtPiAnPGRyaXZlPjpcJyArICdmb28nCisgICAgLy8KKyAgICBzdGF0aWMgYm9vbCBzcGxpdChTdHJpbmdWaWV3IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGRpck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGJhc2VOYW1lKTsKKworICAgIC8vIEEgdmFyaWFudCBvZiBzcGxpdCgpIGZvciB0aGUgY3VycmVudCBwcm9jZXNzJyBob3N0IHR5cGUuCisgICAgc3RhdGljIGJvb2wgc3BsaXQoU3RyaW5nVmlldyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBkaXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBiYXNlTmFtZSkgeworICAgICAgICByZXR1cm4gc3BsaXQocGF0aCwgSE9TVF9UWVBFLCBkaXJOYW1lLCBiYXNlTmFtZSk7CisgICAgfQorCisgICAgLy8gSm9pbiB0d28gcGF0aCBjb21wb25lbnRzIHRvZ2V0aGVyLiBOb3RlIHRoYXQgaWYgfHBhdGgyfCBpcyBhbgorICAgIC8vIGFic29sdXRlIHBhdGgsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGNvcHkgb2YgfHBhdGgyfCwgb3RoZXJ3aXNlCisgICAgLy8gdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIHxwYXRoMXwgYW5kIHxwYXRoMnwsIGlmCisgICAgLy8gfHBhdGgxfCBkb2Vzbid0IGVuZCB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvciwgYSB8aG9zdFR5cGV8IHNwZWNpZmljCisgICAgLy8gb25lIHdpbGwgYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgdHdvIHBhdGhzIGluIHRoZSByZXN1bHQuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGpvaW4oU3RyaW5nVmlldyBwYXRoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IHBhdGgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvc3RUeXBlIGhvc3RUeXBlKTsKKworICAgIC8vIEEgdmFyaWFudCBvZiBqb2luKCkgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MnIGhvc3QgdHlwZS4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgam9pbihTdHJpbmdWaWV3IHBhdGgxLCBTdHJpbmdWaWV3IHBhdGgyKSB7CisgICAgICAgIHJldHVybiBqb2luKHBhdGgxLCBwYXRoMiwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGpvaW4gYSBidW5jaCBvZiBwYXRocyBhdCBvbmNlCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIFBhdGhzPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBqb2luKFN0cmluZ1ZpZXcgcGF0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmlldyBwYXRoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocyYmLi4uIHBhdGhzKSB7CisgICAgICAgIHJldHVybiBqb2luKHBhdGgxLCBqb2luKHBhdGgyLCBzdGQ6OmZvcndhcmQ8UGF0aHM+KHBhdGhzKS4uLikpOworICAgIH0KKworICAgIC8vIERlY29tcG9zZSB8cGF0aHwgaW50byBpbmRpdmlkdWFsIGNvbXBvbmVudHMuIElmIHxwYXRofCBoYXMgYSByb290CisgICAgLy8gcHJlZml4LCBpdCB3aWxsIGFsd2F5cyBiZSB0aGUgZmlyc3QgY29tcG9uZW50LiBJLmUuIGZvciBQb3NpeAorICAgIC8vIHN5c3RlbXMgdGhpcyB3aWxsIGJlICcvJyAoZm9yIGFic29sdXRlIHBhdGhzKS4gRm9yIFdpbjMyIHN5c3RlbXMsCisgICAgLy8gaXQgY291bGQgYmUgJ0M6IiAoZm9yIGEgcGF0aCByZWxhdGl2ZSB0byBhIHJvb3Qgdm9sdW1lKSBvciAiQzpcIgorICAgIC8vIGZvciBhbiBhYnNvbHV0ZSBwYXRoIGZyb20gdm9sdW1lIEMpLiwKKyAgICAvLyBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cyB8b3V0fCB0byBhIHZlY3RvciBvZiBzdHJpbmdzLAorICAgIC8vIGVhY2ggb25lIGJlaW5nIGEgcGF0aCBjb21wb25lbnQgKHByZWZpeCBvciBzdWJkaXJlY3Rvcnkgb3IgZmlsZQorICAgIC8vIG5hbWUpLiBEaXJlY3Rvcnkgc2VwYXJhdG9ycyBkbyBub3QgYXBwZWFyIGluIGNvbXBvbmVudHMsIGV4Y2VwdAorICAgIC8vIGZvciB0aGUgcm9vdCBwcmVmaXgsIGlmIGFueS4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRlY29tcG9zZShTdHJpbmdWaWV3IHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpOworCisgICAgLy8gRGVjb21wb3NlIHxwYXRofCBpbnRvIGluZGl2aWR1YWwgY29tcG9uZW50cyBmb3IgdGhlIGhvc3QgcGxhdGZvcm0uCisgICAgLy8gU2VlIGNvbW1lbnRzIGFib3ZlIGZvciBtb3JlIGRldGFpbHMuCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZWNvbXBvc2UoU3RyaW5nVmlldyBwYXRoKSB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UocGF0aCwgSE9TVF9UWVBFKTsKKyAgICB9CisKKyAgICAvLyBSZWNvbXBvc2UgYSBwYXRoIGZyb20gaW5kaXZpZHVhbCBjb21wb25lbnRzIGludG8gYSBmaWxlIHBhdGggc3RyaW5nLgorICAgIC8vIHxjb21wb25lbnRzfCBpcyBhIHZlY3RvciBvZiBzdHJpbmdzLCBhbmQgfGhvc3RUeXBlfCB0aGUgdGFyZ2V0CisgICAgLy8gaG9zdCB0eXBlIHRvIHVzZS4gUmV0dXJuIGEgbmV3IGZpbGUgcGF0aCBzdHJpbmcuIE5vdGUgdGhhdCBpZiB0aGUKKyAgICAvLyBmaXJzdCBjb21wb25lbnQgaXMgYSByb290IHByZWZpeCwgaXQgd2lsbCBiZSBrZXB0IGFzIGlzLCBpLmUuOgorICAgIC8vICAgWyAnQzonLCAnZm9vJyBdIC0+ICdDOmZvbycgb24gV2luMzIsIGJ1dCBub3QgUG9zaXggd2hlcmUgaXQgd2lsbAorICAgIC8vIGJlICdDOi9mb28nLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyByZWNvbXBvc2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21wb25lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG9zdFR5cGUgaG9zdFR5cGUpOworCisgICAgLy8gUmVjb21wb3NlIGEgcGF0aCBmcm9tIGluZGl2aWR1YWwgY29tcG9uZW50cyBpbnRvIGEgZmlsZSBwYXRoIHN0cmluZworICAgIC8vIGZvciB0aGUgY3VycmVudCBob3N0LiB8Y29tcG9uZW50c3wgaXMgYSB2ZWN0b3Igb3Mgc3RyaW5ncy4KKyAgICAvLyBSZXR1cm5zIGEgbmV3IGZpbGUgcGF0aCBzdHJpbmcuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHJlY29tcG9zZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbXBvbmVudHMpIHsKKyAgICAgICAgcmV0dXJuIHJlY29tcG9zZShjb21wb25lbnRzLCBIT1NUX1RZUEUpOworICAgIH0KKworICAgIC8vIEdpdmVuIGEgbGlzdCBvZiBjb21wb25lbnRzIHJldHVybmVkIGJ5IGRlY29tcG9zZSgpLCBzaW1wbGlmeSBpdAorICAgIC8vIGJ5IHJlbW92aW5nIGluc3RhbmNlcyBvZiAnLicgYW5kICcuLicgd2hlbiB0aGF0IG1ha2VzIHNlbnNlLgorICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gc2ltcGxpZnkgaW5pdGlhbCBpbnN0YW5jZXMgb2YKKyAgICAvLyAnLi4nLCBpLmUuICJmb28vLi4vLi4vYmFyIiAtPiAiLi4vYmFyIgorICAgIHN0YXRpYyB2b2lkIHNpbXBsaWZ5Q29tcG9uZW50cyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGNvbXBvbmVudHMpOworfTsKKworLy8gVXNlZnVsIHNob3J0Y3V0cyB0byBhdm9pZCB0b28gbXVjaCB0eXBpbmcuCitzdGF0aWMgY29uc3QgUGF0aFV0aWxzOjpIb3N0VHlwZSBrSG9zdFBvc2l4ID0gUGF0aFV0aWxzOjpIT1NUX1BPU0lYOworc3RhdGljIGNvbnN0IFBhdGhVdGlsczo6SG9zdFR5cGUga0hvc3RXaW4zMiA9IFBhdGhVdGlsczo6SE9TVF9XSU4zMjsKK3N0YXRpYyBjb25zdCBQYXRoVXRpbHM6Okhvc3RUeXBlIGtIb3N0VHlwZSA9IFBhdGhVdGlsczo6SE9TVF9UWVBFOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZWY1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKKyNkZWZpbmUgRFVQKHgpIHgsIHgKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitzdGF0aWMgY29uc3QgaW50IGtIb3N0VHlwZUNvdW50ID0gUGF0aFV0aWxzOjprSG9zdFR5cGVDb3VudDsKKworVEVTVChQYXRoVXRpbHMsIGlzRGlyU2VwYXJhdG9yKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGludCBjaDsKKyAgICAgICAgYm9vbCBleHBlY3RlZFtrSG9zdFR5cGVDb3VudF07CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICcvJywgeyB0cnVlLCB0cnVlIH19LAorICAgICAgICB7ICdcXCcsIHsgZmFsc2UsIHRydWUgfX0sCisgICAgICAgIHsgJyQnLCB7IGZhbHNlLCBmYWxzZSB9fSwKKyAgICAgICAgeyAnOicsIHsgZmFsc2UsIGZhbHNlIH19LAorICAgICAgICB7ICc7JywgeyBmYWxzZSwgZmFsc2UgfX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBpbnQgY2ggPSBrRGF0YVtuXS5jaDsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0UG9zaXhdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjppc0RpclNlcGFyYXRvcihjaCwga0hvc3RQb3NpeCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgY2ggPDwgIiciOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RXaW4zMl0sCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmlzRGlyU2VwYXJhdG9yKGNoLCBrSG9zdFdpbjMyKSkKKyAgICAgICAgICAgICAgICA8PCAiVGVzdGluZyAnIiA8PCBjaCA8PCAiJyI7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFR5cGVdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjppc0RpclNlcGFyYXRvcihjaCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgY2ggPDwgIiciOworICAgIH0KK30KKworVEVTVChQYXRoVXRpbHMsIGlzUGF0aFNlcGFyYXRvcikgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBpbnQgY2g7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRba0hvc3RUeXBlQ291bnRdOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyAnOicsIHsgdHJ1ZSwgZmFsc2UgfX0sCisgICAgICAgIHsgJzsnLCB7IGZhbHNlLCB0cnVlIH19LAorICAgICAgICB7ICcvJywgeyBmYWxzZSwgZmFsc2UgfX0sCisgICAgICAgIHsgJ1xcJywgeyBmYWxzZSwgZmFsc2UgfX0sCisgICAgICAgIHsgJyQnLCB7IGZhbHNlLCBmYWxzZSB9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGludCBjaCA9IGtEYXRhW25dLmNoOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RQb3NpeF0sCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmlzUGF0aFNlcGFyYXRvcihjaCwga0hvc3RQb3NpeCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgY2ggPDwgIiciOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RXaW4zMl0sCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmlzUGF0aFNlcGFyYXRvcihjaCwga0hvc3RXaW4zMikpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgY2ggPDwgIiciOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6aXNQYXRoU2VwYXJhdG9yKGNoKSkKKyAgICAgICAgICAgICAgICA8PCAiVGVzdGluZyAnIiA8PCBjaCA8PCAiJyI7CisgICAgfQorfQorCitURVNUKFBhdGhVdGlscywgZ2V0RGlyU2VwYXJhdG9yKSB7CisgICAgRVhQRUNUX0VRKCcvJywgUGF0aFV0aWxzOjpnZXREaXJTZXBhcmF0b3Ioa0hvc3RQb3NpeCkpOworICAgIEVYUEVDVF9FUSgnXFwnLCBQYXRoVXRpbHM6OmdldERpclNlcGFyYXRvcihrSG9zdFdpbjMyKSk7Cit9CisKK1RFU1QoUGF0aFV0aWxzLCByZW1vdmVUcmFpbGluZ0RpclNlcGFyYXRvcikgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBwYXRoOworICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZFtrSG9zdFR5cGVDb3VudF07CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICIvIiwgeyAiLyIsICIvIiB9IH0sCisgICAgICAgIHsgIlxcIiwgeyAiXFwiLCAiXFwiIH0gfSwKKyAgICAgICAgeyAiZm9vIiwgeyAiZm9vIiwgImZvbyIgfSB9LAorICAgICAgICB7ICJmb28vYmFyIiwgeyAiZm9vL2JhciIsICJmb28vYmFyIiB9IH0sCisgICAgICAgIHsgImZvb1xcYmFyIiwgeyAiZm9vXFxiYXIiLCAiZm9vXFxiYXIiIH0gfSwKKyAgICAgICAgeyAiZm9vL2Jhci8iLCB7ICJmb28vYmFyIiwgImZvby9iYXIiIH0gfSwKKyAgICAgICAgeyAiZm9vXFxiYXJcXCIsIHsgImZvb1xcYmFyXFwiLCAiZm9vXFxiYXIiIH0gfSwKKyAgICAgICAgeyAiL2ZvbyIsIHsgIi9mb28iLCAiL2ZvbyIgfSB9LAorICAgICAgICB7ICIvZm9vLyIsIHsgIi9mb28iLCAiL2ZvbyIgfSB9LAorICAgICAgICB7ICIvZm9vL2JhciIsIHsgIi9mb28vYmFyIiwgIi9mb28vYmFyIiB9IH0sCisgICAgICAgIHsgIi9mb28vYmFyLyIsIHsgIi9mb28vYmFyIiwgIi9mb28vYmFyIiB9IH0sCisgICAgICAgIHsgIlxcZm9vIiwgeyAiXFxmb28iLCAiXFxmb28iIH0gfSwKKyAgICAgICAgeyAiXFxmb29cXGJhciIsIHsgIlxcZm9vXFxiYXIiLCAiXFxmb29cXGJhciIgfSB9LAorICAgICAgICB7ICJcXGZvb1xcYmFyXFwiLCB7ICJcXGZvb1xcYmFyXFwiLCAiXFxmb29cXGJhciIgfSB9CisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dCA9IGtEYXRhW25dLnBhdGg7CisgICAgICAgIHBhdGggPSBQYXRoVXRpbHM6OnJlbW92ZVRyYWlsaW5nRGlyU2VwYXJhdG9yKGlucHV0LCBrSG9zdFBvc2l4KTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0UG9zaXhdLCBwYXRoLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgaW5wdXQuY19zdHIoKSA8PCAiJyI7CisKKyAgICAgICAgcGF0aCA9IFBhdGhVdGlsczo6cmVtb3ZlVHJhaWxpbmdEaXJTZXBhcmF0b3IoaW5wdXQsIGtIb3N0V2luMzIpOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RXaW4zMl0sIHBhdGguY19zdHIoKSkKKyAgICAgICAgICAgICAgICA8PCAiVGVzdGluZyAnIiA8PCBpbnB1dC5jX3N0cigpIDw8ICInIjsKKworICAgICAgICBwYXRoID0gUGF0aFV0aWxzOjpyZW1vdmVUcmFpbGluZ0RpclNlcGFyYXRvcihpbnB1dCk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFR5cGVdLCBwYXRoLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgaW5wdXQuY19zdHIoKSA8PCAiJyI7CisgICAgfQorfQorCitURVNUKFBhdGhVdGlscywgcm9vdFByZWZpeFNpemUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICAgICAgc2l6ZV90IHByZWZpeFNpemVba0hvc3RUeXBlQ291bnRdOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyBOVUxMLCB7IDB1LCAwdX0gfSwKKyAgICAgICAgeyAiIiwgeyAwdSwgMHUgfSB9LAorICAgICAgICB7ICJmb28iLCB7IDB1LCAwdSB9IH0sCisgICAgICAgIHsgImZvby9iYXIiLCB7IDB1LCAwdSB9IH0sCisgICAgICAgIHsgIi9mb28iLCB7IDF1LCAxdSB9IH0sCisgICAgICAgIHsgIi8vZm9vIiwgeyAxdSwgNXUgfSB9LAorICAgICAgICB7ICIvL2Zvby9iYXIiLCB7IDF1LCA2dSB9IH0sCisgICAgICAgIHsgImM6IiwgeyAwdSwgMnUgfSB9LAorICAgICAgICB7ICJjOmZvbyIsIHsgMHUsIDJ1IH0gfSwKKyAgICAgICAgeyAiYy9mb28iLCB7IDB1LCAwdSB9IH0sCisgICAgICAgIHsgImM6L2ZvbyIsIHsgMHUsIDN1IH0gfSwKKyAgICAgICAgeyAiYzpcXCIsIHsgMHUsIDN1IH0gfSwKKyAgICAgICAgeyAiYzpcXFxcIiwgeyAwdSwgM3UgfSB9LAorICAgICAgICB7ICIxOi9mb28iLCB7IDB1LCAwdSB9IH0sCisgICAgICAgIHsgIlxcIiwgeyAwdSwgMXUgfSB9LAorICAgICAgICB7ICJcXGZvbyIsIHsgMHUsIDF1IH0gfSwKKyAgICAgICAgeyAiXFxmb29cXGJhciIsIHsgMHUsIDF1IH0gfSwKKyAgICAgICAgeyAiXFxcXGZvbyIsIHsgMHUsIDV1IH0gfSwKKyAgICAgICAgeyAiXFxcXGZvb1xcIiwgeyAwdSwgNnUgfSB9LAorICAgICAgICB7ICJcXFxcZm9vXFxcXGJhciIsIHsgMHUsIDZ1IH0gfSwKKyAgICB9OworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBjb25zdCBjaGFyKiBwYXRoID0ga0RhdGFbbl0ucGF0aDsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLnByZWZpeFNpemVba0hvc3RQb3NpeF0sCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnJvb3RQcmVmaXhTaXplKHBhdGgsIGtIb3N0UG9zaXgpKQorICAgICAgICAgICAgICAgIDw8ICJUZXN0aW5nICciIDw8IChwYXRoID8gcGF0aCA6ICI8TlVMTD4iKSA8PCAiJyI7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5wcmVmaXhTaXplW2tIb3N0V2luMzJdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpyb290UHJlZml4U2l6ZShwYXRoLCBrSG9zdFdpbjMyKSkKKyAgICAgICAgICAgICAgICA8PCAiVGVzdGluZyAnIiA8PCAocGF0aCA/IHBhdGggOiAiPE5VTEw+IikgPDwgIiciOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0ucHJlZml4U2l6ZVtrSG9zdFR5cGVdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpyb290UHJlZml4U2l6ZShwYXRoKSkKKyAgICAgICAgICAgICAgICA8PCAiVGVzdGluZyAnIiA8PCAocGF0aCA/IHBhdGggOiAiPE5VTEw+IikgPDwgIiciOworICAgIH0KK30KKworVEVTVChQYXRoVXRpbHMsIGlzQWJzb2x1dGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICAgICAgYm9vbCBleHBlY3RlZFtrSG9zdFR5cGVDb3VudF07CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICJmb28iLCB7IGZhbHNlLCBmYWxzZSB9IH0sCisgICAgICAgIHsgIi9mb28iLCB7IHRydWUsIHRydWUgfSB9LAorICAgICAgICB7ICJcXGZvbyIsIHsgZmFsc2UsIHRydWUgfSB9LAorICAgICAgICB7ICIvZm9vL2JhciIsIHsgdHJ1ZSwgdHJ1ZSB9IH0sCisgICAgICAgIHsgIlxcZm9vXFxiYXIiLCB7IGZhbHNlLCB0cnVlIH0gfSwKKyAgICAgICAgeyAiQzpmb28iLCB7IGZhbHNlLCBmYWxzZSB9IH0sCisgICAgICAgIHsgIkM6L2ZvbyIsIHsgZmFsc2UsIHRydWUgfSB9LAorICAgICAgICB7ICJDOlxcZm9vIiwgeyBmYWxzZSwgdHJ1ZSB9IH0sCisgICAgICAgIHsgIi8vc2VydmVyIiwgeyB0cnVlLCBmYWxzZSB9IH0sCisgICAgICAgIHsgIi8vc2VydmVyL3BhdGgiLCB7IHRydWUsIHRydWUgfSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBrRGF0YVtuXS5wYXRoOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RQb3NpeF0sCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmlzQWJzb2x1dGUocGF0aCwga0hvc3RQb3NpeCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgKHBhdGggPyBwYXRoIDogIjxOVUxMPiIpIDw8ICInIjsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0V2luMzJdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjppc0Fic29sdXRlKHBhdGgsIGtIb3N0V2luMzIpKQorICAgICAgICAgICAgICAgIDw8ICJUZXN0aW5nICciIDw8IChwYXRoID8gcGF0aCA6ICI8TlVMTD4iKSA8PCAiJyI7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFR5cGVdLAorICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjppc0Fic29sdXRlKHBhdGgpKQorICAgICAgICAgICAgICAgIDw8ICJUZXN0aW5nICciIDw8IChwYXRoID8gcGF0aCA6ICI8TlVMTD4iKSA8PCAiJyI7CisgICAgfQorfQorCitURVNUKFBhdGhVdGlscywgc3BsaXQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0OworICAgICAgICAgICAgY29uc3QgY2hhciogZGlybmFtZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VuYW1lOworICAgICAgICB9IGV4cGVjdGVkW2tIb3N0VHlwZUNvdW50XTsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7Ii4iLCB7e3RydWUsICIuIiwgIi4ifSwge3RydWUsICIuIiwgIi4ifX19LAorICAgICAgICAgICAgeyIvIiwge3tmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cn0sIHtmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cn19fSwKKyAgICAgICAgICAgIHsiZm9vIiwge3t0cnVlLCAiLiIsICJmb28ifSwge3RydWUsICIuIiwgImZvbyJ9fX0sCisgICAgICAgICAgICB7Ii9mb28iLCB7e3RydWUsICIvIiwgImZvbyJ9LCB7dHJ1ZSwgIi8iLCAiZm9vIn19fSwKKyAgICAgICAgICAgIHsiZm9vL2JhciIsIHt7dHJ1ZSwgImZvby8iLCAiYmFyIn0sIHt0cnVlLCAiZm9vLyIsICJiYXIifX19LAorICAgICAgICAgICAgeyJmb29cXGJhciIsIHt7dHJ1ZSwgIi4iLCAiZm9vXFxiYXIifSwge3RydWUsICJmb29cXCIsICJiYXIifX19LAorICAgICAgICAgICAgeyJmb28vIiwge3tmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cn0sIHtmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cn19fSwKKyAgICAgICAgICAgIHsiZm9vXFwiLCB7e3RydWUsICIuIiwgImZvb1xcIn0sIHtmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cn19fSwKKyAgICAgICAgICAgIHsiQzpmb28iLCB7e3RydWUsICIuIiwgIkM6Zm9vIn0sIHt0cnVlLCAiQzoiLCAiZm9vIn19fSwKKyAgICAgICAgICAgIHsiQzovZm9vIiwge3t0cnVlLCAiQzovIiwgImZvbyJ9LCB7dHJ1ZSwgIkM6LyIsICJmb28ifX19LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRpcm5hbWUsIGJhc2VuYW1lOworCisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFBvc2l4XS5yZXN1bHQsCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnNwbGl0KGtEYXRhW25dLnBhdGgsIGtIb3N0UG9zaXgsICZkaXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzZW5hbWUpKQorICAgICAgICAgICAgICAgIDw8ICJ3aGVuIHRlc3RpbmcgcG9zaXggWyIgPDwga0RhdGFbbl0ucGF0aCA8PCAiXSI7CisgICAgICAgIGlmIChrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFBvc2l4XS5yZXN1bHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFBvc2l4XS5kaXJuYW1lLCBkaXJuYW1lLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ3aGVuIHRlc3RpbmcgcG9zaXggWyIgPDwga0RhdGFbbl0ucGF0aCA8PCAiXSI7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RQb3NpeF0uYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIndoZW4gdGVzdGluZyBwb3NpeCBbIiA8PCBrRGF0YVtuXS5wYXRoIDw8ICJdIjsKKyAgICAgICAgfQorCisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFdpbjMyXS5yZXN1bHQsCisgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnNwbGl0KGtEYXRhW25dLnBhdGgsIGtIb3N0V2luMzIsICZkaXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzZW5hbWUpKQorICAgICAgICAgICAgICAgIDw8ICJ3aGVuIHRlc3Rpbmcgd2luMzIgWyIgPDwga0RhdGFbbl0ucGF0aCA8PCAiXSI7CisgICAgICAgIGlmIChrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFdpbjMyXS5yZXN1bHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFdpbjMyXS5kaXJuYW1lLCBkaXJuYW1lLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ3aGVuIHRlc3Rpbmcgd2luMzIgWyIgPDwga0RhdGFbbl0ucGF0aCA8PCAiXSI7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RXaW4zMl0uYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIndoZW4gdGVzdGluZyB3aW4zMiBbIiA8PCBrRGF0YVtuXS5wYXRoIDw8ICJdIjsKKyAgICAgICAgfQorCisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFR5cGVdLnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6c3BsaXQoa0RhdGFbbl0ucGF0aCwgJmRpcm5hbWUsICZiYXNlbmFtZSkpCisgICAgICAgICAgICAgICAgPDwgIndoZW4gdGVzdGluZyBob3N0IFsiIDw8IGtEYXRhW25dLnBhdGggPDwgIl0iOworICAgICAgICBpZiAoa0RhdGFbbl0uZXhwZWN0ZWRba0hvc3RUeXBlXS5yZXN1bHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFtrSG9zdFR5cGVdLmRpcm5hbWUsIGRpcm5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIndoZW4gdGVzdGluZyBob3N0IFsiIDw8IGtEYXRhW25dLnBhdGggPDwgIl0iOworICAgICAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0VHlwZV0uYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUuY19zdHIoKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIndoZW4gdGVzdGluZyBob3N0IFsiIDw8IGtEYXRhW25dLnBhdGggPDwgIl0iOworICAgICAgICB9CisgICAgfQorfQorCitURVNUKFBhdGhVdGlscywgam9pbikgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBwYXRoMTsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDI7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkW2tIb3N0VHlwZUNvdW50XTsKKyAgICB9IGtEYXRhW10gPSB7eyIuIiwgImZvbyIsIHsiLi9mb28iLCAiLlxcZm9vIn19LAorICAgICAgICAgICAgICAgICB7ImZvbyIsICIvYmFyIiwgeyIvYmFyIiwgIi9iYXIifX0sCisgICAgICAgICAgICAgICAgIHsiZm9vIiwgImJhciIsIHsiZm9vL2JhciIsICJmb29cXGJhciJ9fSwKKyAgICAgICAgICAgICAgICAgeyJmb28vIiwgImJhciIsIHsiZm9vL2JhciIsICJmb28vYmFyIn19LAorICAgICAgICAgICAgICAgICB7ImZvb1xcIiwgImJhciIsIHsiZm9vXFwvYmFyIiwgImZvb1xcYmFyIn19LAorICAgICAgICAgICAgICAgICB7IkM6IiwgImZvbyIsIHsiQzovZm9vIiwgIkM6Zm9vIn19LAorICAgICAgICAgICAgICAgICB7IkM6LyIsICJmb28iLCB7IkM6L2ZvbyIsICJDOi9mb28ifX0sCisgICAgICAgICAgICAgICAgIHsiQzpcXCIsICJmb28iLCB7IkM6XFwvZm9vIiwgIkM6XFxmb28ifX19OworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0KKyAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmpvaW4oa0RhdGFbbl0ucGF0aDEsIGtEYXRhW25dLnBhdGgyLCBrSG9zdFBvc2l4KTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0UG9zaXhdLCBwYXRoLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIldoZW4gdGVzdGluZyBwb3NpeCBbIiA8PCBrRGF0YVtuXS5wYXRoMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwga0RhdGFbbl0ucGF0aDIgPDwgIl0iOworCisgICAgICAgIHBhdGggPSBQYXRoVXRpbHM6OmpvaW4oa0RhdGFbbl0ucGF0aDEsIGtEYXRhW25dLnBhdGgyLCBrSG9zdFdpbjMyKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0V2luMzJdLCBwYXRoLmNfc3RyKCkpCisgICAgICAgICAgICAgICAgPDwgIldoZW4gdGVzdGluZyB3aW4zMiBbIiA8PCBrRGF0YVtuXS5wYXRoMSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwga0RhdGFbbl0ucGF0aDIgPDwgIl0iOworCisgICAgICAgIHBhdGggPSBQYXRoVXRpbHM6OmpvaW4oa0RhdGFbbl0ucGF0aDEsIGtEYXRhW25dLnBhdGgyKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkW2tIb3N0VHlwZV0sIHBhdGguY19zdHIoKSkKKyAgICAgICAgICAgICAgICA8PCAiV2hlbiB0ZXN0aW5nIGhvc3QgWyIgPDwga0RhdGFbbl0ucGF0aDEgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IGtEYXRhW25dLnBhdGgyIDw8ICJdIjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga01heENvbXBvbmVudHMgPSAxMDsKKwordHlwZWRlZiBjb25zdCBjaGFyKiBDb21wb25lbnRMaXN0W2tNYXhDb21wb25lbnRzXTsKKworc3RhdGljIHZvaWQgY2hlY2tDb21wb25lbnRzKGNvbnN0IENvbXBvbmVudExpc3QmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBob3N0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgc2l6ZV90IG07CisgICAgZm9yIChtID0gMDsgbSA8IGNvbXBvbmVudHMuc2l6ZSgpOyArK20pIHsKKyAgICAgICAgaWYgKCFleHBlY3RlZFttXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjb25zdCBjaGFyKiBjb21wb25lbnQgPSBleHBlY3RlZFttXTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGNvbXBvbmVudCwgY29tcG9uZW50c1ttXS5jX3N0cigpKQorICAgICAgICAgICAgICAgIDw8IGhvc3RUeXBlIDw8ICIgY29tcG9uZW50ICMiIDw8IChtICsgMSkgPDwgIiBpbiAiIDw8IHBhdGg7CisgICAgfQorICAgIEVYUEVDVF9FUShtLCBjb21wb25lbnRzLnNpemUoKSkKKyAgICAgICAgICAgICAgICA8PCBob3N0VHlwZSA8PCAiIGNvbXBvbmVudCAjIiA8PCAobSArIDEpIDw8ICIgaW4gIiA8PCBwYXRoOworfQorCitURVNUKFBhdGhVdGlscywgZGVjb21wb3NlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGg7CisgICAgICAgIGNvbnN0IENvbXBvbmVudExpc3QgY29tcG9uZW50c1trSG9zdFR5cGVDb3VudF07CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICIiLCB7IHsgTlVMTCB9LCB7IE5VTEwgfSB9IH0sCisgICAgICAgIHsgImZvbyIsIHsKKyAgICAgICAgICAgIHsgImZvbyIsIE5VTEwgfSwKKyAgICAgICAgICAgIHsgImZvbyIsIE5VTEwgfSB9IH0sCisgICAgICAgIHsgImZvby8iLCB7CisgICAgICAgICAgICB7ICJmb28iLCBOVUxMIH0sCisgICAgICAgICAgICB7ICJmb28iLCBOVUxMIH0gfSB9LAorICAgICAgICB7ICJmb28vYmFyIiwgeworICAgICAgICAgICAgeyAiZm9vIiwgImJhciIsIE5VTEwgfSwKKyAgICAgICAgICAgIHsgImZvbyIsICJiYXIiLCBOVUxMIH0gfSB9LAorICAgICAgICB7ICJmb28vL2Jhci96b28iLCB7CisgICAgICAgICAgICB7ICJmb28iLCAiYmFyIiwgInpvbyIsIE5VTEwgfSwKKyAgICAgICAgICAgIHsgImZvbyIsICJiYXIiLCAiem9vIiwgTlVMTCB9IH0gfSwKKyAgICAgICAgeyAiXFxmb29cXGJhclxcIiwgeworICAgICAgICAgICAgeyAiXFxmb29cXGJhclxcIiwgTlVMTCB9LAorICAgICAgICAgICAgeyAiXFwiLCAiZm9vIiwgImJhciIsIE5VTEwgfSB9IH0sCisgICAgICAgIHsgIkM6Zm9vXFxiYXIiLCB7CisgICAgICAgICAgICB7ICJDOmZvb1xcYmFyIiwgTlVMTCB9LAorICAgICAgICAgICAgeyAiQzoiLCAiZm9vIiwgImJhciIsIE5VTEwgfSB9IH0sCisgICAgICAgIHsgIkM6L2ZvbyIsIHsKKyAgICAgICAgICAgIHsgIkM6IiwgImZvbyIsIE5VTEwgfSwKKyAgICAgICAgICAgIHsgIkM6LyIsICJmb28iLCBOVUxMIH0gfSB9LAorICAgICAgICB7ICIvZm9vIiwgeworICAgICAgICAgICAgeyAiLyIsICJmb28iLCBOVUxMIH0sCisgICAgICAgICAgICB7ICIvIiwgImZvbyIsIE5VTEwgfSB9IH0sCisgICAgICAgIHsgIlxcZm9vIiwgeworICAgICAgICAgICAgeyAiXFxmb28iLCBOVUxMIH0sCisgICAgICAgICAgICB7ICJcXCIsICJmb28iLCBOVUxMIH0gfSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBrRGF0YVtuXS5wYXRoOworICAgICAgICBjaGVja0NvbXBvbmVudHMoa0RhdGFbbl0uY29tcG9uZW50c1trSG9zdFBvc2l4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6ZGVjb21wb3NlKHBhdGgsIGtIb3N0UG9zaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOworCisgICAgICAgIGNoZWNrQ29tcG9uZW50cyhrRGF0YVtuXS5jb21wb25lbnRzW2tIb3N0V2luMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpkZWNvbXBvc2UocGF0aCwga0hvc3RXaW4zMiksCisgICAgICAgICAgICAgICAgICAgICAgICAid2luMzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisKKyAgICAgICAgY2hlY2tDb21wb25lbnRzKGtEYXRhW25dLmNvbXBvbmVudHNba0hvc3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6ZGVjb21wb3NlKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7CisgICAgfQorfQorCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbXBvbmVudExpc3RUb1ZlY3RvcigKKyAgICAgICAgY29uc3QgQ29tcG9uZW50TGlzdCYgaW5wdXQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzdWx0OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpbnB1dFtpXTsgKytpKQorICAgICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitURVNUKFBhdGhVdGlscywgcmVjb21wb3NlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IENvbXBvbmVudExpc3QgaW5wdXQ7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGhba0hvc3RUeXBlQ291bnRdOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyB7IE5VTEwgfSwgeyAiIiwgIiIgfSB9LAorICAgICAgICB7IHsgIi4iLCBOVUxMIH0sIHsgIi4iLCAiLiIgfSB9LAorICAgICAgICB7IHsgIi4uIiwgTlVMTCB9LCB7ICIuLiIsICIuLiIgfSB9LAorICAgICAgICB7IHsgIi8iLCBOVUxMIH0sIHsgIi8iLCAiLyIgfSB9LAorICAgICAgICB7IHsgIi8iLCAiZm9vIiwgTlVMTCB9LCB7ICIvZm9vIiwgIi9mb28iIH0gfSwKKyAgICAgICAgeyB7ICJcXCIsICJmb28iLCBOVUxMIH0sIHsgIlxcL2ZvbyIsICJcXGZvbyIgfSB9LAorICAgICAgICB7IHsgImZvbyIsIE5VTEwgfSwgeyAiZm9vIiwgImZvbyIgfSB9LAorICAgICAgICB7IHsgImZvbyIsICJiYXIiLCBOVUxMIH0sIHsgImZvby9iYXIiLCAiZm9vXFxiYXIiIH0gfSwKKyAgICAgICAgeyB7ICIuIiwgImZvbyIsICIuLiIsIE5VTEwgfSwgeyAiLi9mb28vLi4iLCAiLlxcZm9vXFwuLiIgfSB9LAorICAgICAgICB7IHsgIkM6IiwgImZvbyIsIE5VTEwgfSwgeyAiQzovZm9vIiwgIkM6Zm9vIiB9IH0sCisgICAgICAgIHsgeyAiL2Zvby9iYXIiLCAibGliIiwgTlVMTCB9LCB7ICIvZm9vL2Jhci9saWIiLCAiL2Zvby9iYXJcXGxpYiIgfSB9LAorICAgICAgICB7IHsgIlxcZm9vXFxiYXIiLCAibGliIiwgTlVMTCB9LCB7ICJcXGZvb1xcYmFyL2xpYiIsICJcXGZvb1xcYmFyXFxsaWIiIH0gfSwKKyAgICB9OworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tcG9uZW50cyA9CisgICAgICAgICAgICAgICAgY29tcG9uZW50TGlzdFRvVmVjdG9yKGtEYXRhW25dLmlucHV0KTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnBhdGhba0hvc3RQb3NpeF0sCisgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnJlY29tcG9zZShjb21wb25lbnRzLCBrSG9zdFBvc2l4KS5jX3N0cigpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnBhdGhba0hvc3RXaW4zMl0sCisgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnJlY29tcG9zZShjb21wb25lbnRzLCBrSG9zdFdpbjMyKS5jX3N0cigpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnBhdGhba0hvc3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6cmVjb21wb3NlKGNvbXBvbmVudHMpLmNfc3RyKCkpOworICAgIH0KK30KKworCisvLyBDb252ZXJ0IGEgdmVjdG9yIG9mIHN0cmluZ3MgfGNvbXBvbmVudHN8IGludG8gYSBmaWxlIHBhdGgsIHVzaW5nCisvLyB8c2VwYXJhdG9yfCBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvci4KK3N0YXRpYyBzdGQ6OnN0cmluZyBjb21wb25lbnRzVG9QYXRoKGNvbnN0IENvbXBvbmVudExpc3QmIGNvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHNlcGFyYXRvcikgeworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgY29tcG9uZW50c1tuXTsgKytuKSB7CisgICAgICAgIGlmIChuKQorICAgICAgICAgICAgcmVzdWx0ICs9IHNlcGFyYXRvcjsKKyAgICAgICAgcmVzdWx0ICs9IGNvbXBvbmVudHNbbl07CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBzdHJpbmdWZWN0b3JUb1BhdGgoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzZXBhcmF0b3IpIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBpbnB1dC5zaXplKCk7ICsrbikgeworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7CisgICAgICAgIHJlc3VsdCArPSBpbnB1dFtuXTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChQYXRoVXRpbHMsIHNpbXBsaWZ5Q29tcG9uZW50cykgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBDb21wb25lbnRMaXN0IGlucHV0OworICAgICAgICBjb25zdCBDb21wb25lbnRMaXN0IGV4cGVjdGVkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyB7IE5VTEwgfSwgeyAiLiIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgIi4iLCBOVUxMIH0sIHsgIi4iLCBOVUxMIH0gfSwKKyAgICAgICAgeyB7ICIuLiIsIE5VTEwgfSwgeyAiLi4iLCBOVUxMIH0gfSwKKyAgICAgICAgeyB7ICJmb28iLCBOVUxMIH0sIHsgImZvbyIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgImZvbyIsICIuIiwgTlVMTCB9LCB7ICJmb28iLCBOVUxMIH0gfSwKKyAgICAgICAgeyB7ICJmb28iLCAiYmFyIiwgTlVMTCB9LCB7ICJmb28iLCAiYmFyIiwgTlVMTCB9IH0sCisgICAgICAgIHsgeyAiLiIsICJmb28iLCAiLiIsICJiYXIiLCAiLiIsIE5VTEwgfSwgeyAiZm9vIiwgImJhciIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgImZvbyIsICIuLiIsICJiYXIiLCBOVUxMIH0sIHsgImJhciIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgIi4iLCAiLi4iLCAiZm9vIiwgImJhciIsIE5VTEwgfSwgeyAiLi4iLCAiZm9vIiwgImJhciIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgIi4uIiwgImZvbyIsICIuLiIsICJiYXIiLCBOVUxMIH0sIHsgIi4uIiwgImJhciIsIE5VTEwgfSB9LAorICAgICAgICB7IHsgImZvbyIsICIuLiIsICIuLiIsICJiYXIiLCBOVUxMIH0sIHsgIi4uIiwgImJhciIsIE5VTEwgfSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGNvbnN0IENvbXBvbmVudExpc3QmIGlucHV0ID0ga0RhdGFbbl0uaW5wdXQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0UGF0aCA9IGNvbXBvbmVudHNUb1BhdGgoaW5wdXQsICchJyk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkUGF0aCA9IGNvbXBvbmVudHNUb1BhdGgoa0RhdGFbbl0uZXhwZWN0ZWQsICchJyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb21wb25lbnRzID0gY29tcG9uZW50TGlzdFRvVmVjdG9yKGlucHV0KTsKKyAgICAgICAgUGF0aFV0aWxzOjpzaW1wbGlmeUNvbXBvbmVudHMoJmNvbXBvbmVudHMpOworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gc3RyaW5nVmVjdG9yVG9QYXRoKGNvbXBvbmVudHMsICchJyk7CisKKyAgICAgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkUGF0aC5jX3N0cigpLCBwYXRoLmNfc3RyKCkpCisgICAgICAgICAgICA8PCAiV2hlbiBzaW1wbGlmeWluZyAiIDw8IGlucHV0UGF0aC5jX3N0cigpOworICAgIH0KK30KKworVEVTVChQYXRoVXRpbHMsIHRvRXhlY3V0YWJsZU5hbWUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgUGF0aFV0aWxzOjpIb3N0VHlwZSBob3N0OworICAgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQ7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9QT1NJWCwgImJsYWgiLCAiYmxhaCIgfSwKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfV0lOMzIsICJibGFoIiwgImJsYWguZXhlIiB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9TVFJFUSgKKyAgICAgICAgICAgIGtEYXRhW25dLmV4cGVjdGVkLAorICAgICAgICAgICAgUGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKGtEYXRhW25dLmlucHV0LCBrRGF0YVtuXS5ob3N0KS5jX3N0cigpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG92ZXJsb2FkIHdpdGhvdXQgaG9zdCBwYXJhbWV0ZXIgd29ya3MgY29ycmVjdGx5IHRvbworICAgICAgICBpZiAoa0RhdGFbbl0uaG9zdCA9PSBQYXRoVXRpbHM6OkhPU1RfVFlQRSkgeworICAgICAgICAgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6dG9FeGVjdXRhYmxlTmFtZShrRGF0YVtuXS5pbnB1dCwga0RhdGFbbl0uaG9zdCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoa0RhdGFbbl0uaW5wdXQpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUKFBhdGhVdGlscywgZXh0ZW5zaW9uKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIFBhdGhVdGlsczo6SG9zdFR5cGUgaG9zdDsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfUE9TSVgsICIiLCAiIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9QT1NJWCwgIm5hbWUuZXh0IiwgIi5leHQiIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1BPU0lYLCAibmFtZS4iLCAiLiIgfSwKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfUE9TSVgsICIuIiwgIi4iIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1BPU0lYLCAiZGlyL3BhdGgiLCAiIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9QT1NJWCwgImRpci9wYXRoLmV4dCIsICIuZXh0IiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9QT1NJWCwgImRpci5leHQvcGF0aCIsICIiIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1BPU0lYLCAiLm5hbWUiLCAiLm5hbWUiIH0sCisKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfV0lOMzIsICIiLCAiIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9XSU4zMiwgIm5hbWUuZXh0IiwgIi5leHQiIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1dJTjMyLCAibmFtZS4iLCAiLiIgfSwKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfV0lOMzIsICIuIiwgIi4iIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1dJTjMyLCAiZGlyXFxwYXRoIiwgIiIgfSwKKyAgICAgICAgeyBQYXRoVXRpbHM6OkhPU1RfV0lOMzIsICJkaXJcXHBhdGguZXh0IiwgIi5leHQiIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1dJTjMyLCAiZGlyL3BhdGguZXh0IiwgIi5leHQiIH0sCisgICAgICAgIHsgUGF0aFV0aWxzOjpIT1NUX1dJTjMyLCAiZGlyXFxwYXRoLmV4dCIsICIuZXh0IiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9XSU4zMiwgImRpci5iYWQvL3BhdGgiLCAiIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9XSU4zMiwgImRpci5iYWRcXHBhdGgiLCAiIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9XSU4zMiwgIi5uYW1lIiwgIi5uYW1lIiB9LAorICAgICAgICB7IFBhdGhVdGlsczo6SE9TVF9XSU4zMiwgImM6XFxwYXRoLi5leHQiLCAiLmV4dCIgfSwKKyAgICB9OworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrRGF0YSk7ICsrbikgeworICAgICAgICBFWFBFQ1RfU1RSRVEoCisgICAgICAgICAgICBrRGF0YVtuXS5leHBlY3RlZCwKKyAgICAgICAgICAgIFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGtEYXRhW25dLmlucHV0LCBrRGF0YVtuXS5ob3N0KS5jX3N0cigpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIG92ZXJsb2FkIHdpdGhvdXQgaG9zdCBwYXJhbWV0ZXIgd29ya3MgY29ycmVjdGx5IHRvbworICAgICAgICBpZiAoa0RhdGFbbl0uaG9zdCA9PSBQYXRoVXRpbHM6OkhPU1RfVFlQRSkgeworICAgICAgICAgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGtEYXRhW25dLmlucHV0LCBrRGF0YVtuXS5ob3N0KS5jX3N0cigpLAorICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGtEYXRhW25dLmlucHV0KS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBiYXNlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGM2OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmQuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gSGVscGVyIGNsYXNzIHRvIGhvbGQgYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IsIGFuZCBoYXZlIHRoZSAnY2xvc2UnCisvLyBmdW5jdGlvbiBjYWxsZWQgYXV0b21hdGljYWxseSBvbiBzY29wZSBleGl0LCB1bmxlc3MgdGhlICdyZWxlYXNlJworLy8gbWV0aG9kIHdhcyBjYWxsZWQgcHJldmlvdXNseS4KK2NsYXNzIFNjb3BlZEZkIHsKK3B1YmxpYzoKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpbGwgaG9sZCBhbiBpbnZhbGlkIGRlc2NyaXB0b3IuCisgICAgU2NvcGVkRmQoKSA6IGZkXygtMSkge30KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2VzIG93bmVyc2hpcCBvZiB8ZmR8LgorICAgIGV4cGxpY2l0IFNjb3BlZEZkKGludCBmZCkgOiBmZF8oZmQpIHt9CisKKyAgICAvLyBEZXN0cnVjdG9yIGNhbGxzIGNsb3NlKCkuCisgICAgflNjb3BlZEZkKCkgeyBjbG9zZSgpOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciB2YWx1ZSwgZG9lcyBfbm90XyB0cmFuc2ZlciBvd25lcnNoaXAuCisgICAgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIGZkXzsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgdmFsdWUsIHRyYW5zZmVycyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4KKyAgICBpbnQgcmVsZWFzZSgpIHsKKyAgICAgICAgaW50IGZkID0gZmRfOworICAgICAgICBmZF8gPSAtMTsKKyAgICAgICAgcmV0dXJuIGZkOworICAgIH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIHZhbGlkLgorICAgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBmZF8gPj0gMDsgfQorCisgICAgLy8gQ2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciAoYW5kIG1ha2UgdGhlIHdyYXBwZWQgdmFsdWUgaW52YWxpZCkuCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKGZkXyAhPSAtMSkgeworICAgICAgICAgICAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmRfKTsKKyAgICAgICAgICAgIGZkXyA9IC0xOworICAgICAgICAgICAgZXJybm8gPSBzYXZlX2Vycm5vOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3dhcCB0d28gU2NvcGVkRmQgaW5zdGFuY2VzLgorICAgIHZvaWQgc3dhcChTY29wZWRGZCogb3RoZXIpIHsKKyAgICAgICAgaW50IGZkID0gZmRfOworICAgICAgICBmZF8gPSBvdGhlci0+ZmRfOworICAgICAgICBvdGhlci0+ZmRfID0gZmQ7CisgICAgfQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY29wZWRGZCk7CisKKyAgICBpbnQgZmRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGZF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGZF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ZWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZkX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGZC5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIHBhdGggb2YgYSBmaWxlIHRoYXQgY2FuIGFsd2F5cyBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgb24gYW55IHBsYXRmb3JtLgorI2lmZGVmIF9XSU4zMgorc3RhdGljIGNvbnN0IGNoYXIga051bGxGaWxlW10gPSAiTlVMIjsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciBrTnVsbEZpbGVbXSA9ICIvZGV2L251bGwiOworI2VuZGlmCisKK2ludCBPcGVuTnVsbCgpIHsKKyAgICByZXR1cm4gOjpvcGVuKGtOdWxsRmlsZSwgT19SRE9OTFkpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChTY29wZWRGZCwgRGVmYXVsdENvbnN0cnVjdG9yKSB7CisgICAgU2NvcGVkRmQgZjsKKyAgICBFWFBFQ1RfRkFMU0UoZi52YWxpZCgpKTsKKyAgICBFWFBFQ1RfRVEoLTEsIGYuZ2V0KCkpOworfQorCitURVNUKFNjb3BlZEZkLCBDb25zdHJ1Y3RvcikgeworICAgIFNjb3BlZEZkIGYoT3Blbk51bGwoKSk7CisgICAgRVhQRUNUX1RSVUUoZi52YWxpZCgpKTsKK30KKworVEVTVChTY29wZWRGZCwgUmVsZWFzZSkgeworICAgIFNjb3BlZEZkIGYoT3Blbk51bGwoKSk7CisgICAgRVhQRUNUX1RSVUUoZi52YWxpZCgpKTsKKyAgICBpbnQgZmQgPSBmLnJlbGVhc2UoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZi52YWxpZCgpKTsKKyAgICBFWFBFQ1RfTkUoLTEsIGZkKTsKKyAgICA6OmNsb3NlKGZkKTsKK30KKworVEVTVChTY29wZWRGZCwgQ2xvc2UpIHsKKyAgICBTY29wZWRGZCBmKE9wZW5OdWxsKCkpOworICAgIEVYUEVDVF9UUlVFKGYudmFsaWQoKSk7CisgICAgZi5jbG9zZSgpOworICAgIEVYUEVDVF9GQUxTRShmLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZEZkLCBTd2FwKSB7CisgICAgU2NvcGVkRmQgZjE7CisgICAgU2NvcGVkRmQgZjIoT3Blbk51bGwoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGYxLnZhbGlkKCkpOworICAgIEVYUEVDVF9UUlVFKGYyLnZhbGlkKCkpOworICAgIGludCBmZCA9IGYyLmdldCgpOworICAgIGYxLnN3YXAoJmYyKTsKKyAgICBFWFBFQ1RfRkFMU0UoZjIudmFsaWQoKSk7CisgICAgRVhQRUNUX1RSVUUoZjEudmFsaWQoKSk7CisgICAgRVhQRUNUX0VRKGZkLCBmMS5nZXQoKSk7Cit9CisKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGaWxlSGFuZGxlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGaWxlSGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3OTE4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZpbGVIYW5kbGUuaApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX1dJTjMyCisvLyBub3RoaW5nIGhlcmUKKyNlbHNlICAvLyBfV0lOMzIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBIZWxwZXIgY2xhc3MgdXNlZCB0byB3cmFwIGEgV2luMzIgIGZpbGUgSEFORExFIHRoYXQgd2lsbCBiZSBjbG9zZWQgd2hlbgorLy8gdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgdW5sZXNzIHRoZSByZWxlYXNlKCkgbWV0aG9kIHdhcyBjYWxsZWQKKy8vIGJlZm9yZSB0aGF0LgorY2xhc3MgU2NvcGVkRmlsZUhhbmRsZSB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IgdGFrZXMgb3duZXJzaGlwIG9mIHxoYW5kbGV8LgorICAgIGV4cGxpY2l0IFNjb3BlZEZpbGVIYW5kbGUoSEFORExFIGhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICA6IGhhbmRsZV8oaGFuZGxlKSB7fQorCisgICAgLy8gRGVzdHJ1Y3RvciBjYWxscyBjbG9zZSgpIG1ldGhvZC4KKyAgICB+U2NvcGVkRmlsZUhhbmRsZSgpIHsgY2xvc2UoKTsgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgd3JhcHBlZCBIQU5ETEUgdmFsdWUgaXMgdmFsaWQuCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV8gIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IEhBTkRMRSB2YWx1ZS4gRG9lcyBfbm90XyB0cmFuc2ZlciBvd25lcnNoaXAuCisgICAgSEFORExFIGdldCgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IEhBTkRMRSB2YWx1ZSwgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgorICAgIEhBTkRMRSByZWxlYXNlKCkgeworICAgICAgICBIQU5ETEUgaCA9IGhhbmRsZV87CisgICAgICAgIGhhbmRsZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLy8gQ2xvc2UgaGFuZGxlIGlmIGl0IGlzIG5vdCBpbnZhbGlkLgorICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChoYW5kbGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZV8pOworICAgICAgICAgICAgaGFuZGxlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3dhcCB0aGUgY29udGVudCBvZiB0d28gU2NvcGVkRmlsZUhhbmRsZSBpbnN0YW5jZXMuCisgICAgdm9pZCBzd2FwKFNjb3BlZEZpbGVIYW5kbGUqIG90aGVyKSB7CisgICAgICAgIEhBTkRMRSBoYW5kbGUgPSBoYW5kbGVfOworICAgICAgICBoYW5kbGVfID0gb3RoZXItPmhhbmRsZV87CisgICAgICAgIG90aGVyLT5oYW5kbGVfID0gaGFuZGxlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2NvcGVkRmlsZUhhbmRsZSk7CisKKyAgICBIQU5ETEUgaGFuZGxlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9XSU4zMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmlsZUhhbmRsZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRGaWxlSGFuZGxlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGJjMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmlsZUhhbmRsZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmlsZUhhbmRsZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCisvLyBUaGUgcGF0aCBvZiBhIGZpbGUgdGhhdCBjYW4gYWx3YXlzIGJlIG9wZW5lZCBmb3IgcmVhZGluZyBvbiBhbnkgcGxhdGZvcm0uCitzdGF0aWMgY29uc3QgY2hhciBrTnVsbEZpbGVbXSA9ICJOVUwiOworCitIQU5ETEUgT3Blbk51bGwoKSB7CisgICAgcmV0dXJuIDo6Q3JlYXRlRmlsZShrTnVsbEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUR8RklMRV9TSEFSRV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFNjb3BlZEZpbGVIYW5kbGUsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAgIFNjb3BlZEZpbGVIYW5kbGUgaDsKKyAgICBFWFBFQ1RfRkFMU0UoaC52YWxpZCgpKTsKKyAgICBFWFBFQ1RfRVEoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGguZ2V0KCkpOworfQorCitURVNUKFNjb3BlZEZpbGVIYW5kbGUsIENvbnN0cnVjdG9yKSB7CisgICAgU2NvcGVkRmlsZUhhbmRsZSBoKE9wZW5OdWxsKCkpOworICAgIEVYUEVDVF9UUlVFKGgudmFsaWQoKSk7Cit9CisKK1RFU1QoU2NvcGVkRmlsZUhhbmRsZSwgUmVsZWFzZSkgeworICAgIFNjb3BlZEZpbGVIYW5kbGUgaChPcGVuTnVsbCgpKTsKKyAgICBFWFBFQ1RfVFJVRShoLnZhbGlkKCkpOworICAgIEhBTkRMRSBoYW5kbGUgPSBoLnJlbGVhc2UoKTsKKyAgICBFWFBFQ1RfRkFMU0UoaC52YWxpZCgpKTsKKyAgICBFWFBFQ1RfTkUoSU5WQUxJRF9IQU5ETEVfVkFMVUUsIGhhbmRsZSk7CisgICAgOjpDbG9zZUhhbmRsZShoYW5kbGUpOworfQorCitURVNUKFNjb3BlZEZpbGVIYW5kbGUsIENsb3NlKSB7CisgICAgU2NvcGVkRmlsZUhhbmRsZSBoKE9wZW5OdWxsKCkpOworICAgIEVYUEVDVF9UUlVFKGgudmFsaWQoKSk7CisgICAgaC5jbG9zZSgpOworICAgIEVYUEVDVF9GQUxTRShoLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZEZpbGVIYW5kbGUsIFN3YXApIHsKKyAgICBTY29wZWRGaWxlSGFuZGxlIGgxOworICAgIFNjb3BlZEZpbGVIYW5kbGUgaDIoT3Blbk51bGwoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGgxLnZhbGlkKCkpOworICAgIEVYUEVDVF9UUlVFKGgyLnZhbGlkKCkpOworICAgIEhBTkRMRSBoYW5kbGUgPSBoMi5nZXQoKTsKKyAgICBoMS5zd2FwKCZoMik7CisgICAgRVhQRUNUX0ZBTFNFKGgyLnZhbGlkKCkpOworICAgIEVYUEVDVF9UUlVFKGgxLnZhbGlkKCkpOworICAgIEVYUEVDVF9FUShoYW5kbGUsIGgxLmdldCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRSZWdLZXkuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFJlZ0tleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTFmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRSZWdLZXkuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU42NCkKKyNlcnJvciAiT25seSBjb21waWxlIHRoaXMgZmlsZSB3aGVuIHRhcmdldHRpbmcgV2luZG93cyEiCisjZW5kaWYKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gd3JhcCBhIFdpbjMyIEhLRVkgdGhhdCB3aWxsIGJlIGNsb3NlZCB3aGVuCisvLyB0aGUgaW5zdGFuY2UgaXMgZGVzdHJveWVkLCB1bmxlc3MgdGhlIHJlbGVhc2UoKSBtZXRob2Qgd2FzIGNhbGxlZAorLy8gYmVmb3JlIHRoYXQuCitjbGFzcyBTY29wZWRSZWdLZXkgeworcHVibGljOgorICAgIC8vIERlZmF1bHQgZGVzdHJ1Y3RvciBpcyB1c2VkIHRvIHdyYXAgYW4gaW52YWxpZCBIS0VZIHZhbHVlLgorICAgIFNjb3BlZFJlZ0tleSgpIDogaGtleV8oMCksIHZhbGlkXyhmYWxzZSkge30KKworICAgIC8vIENvbnN0cnVjdG9yIHRha2VzIG93bmVyc2hpcCBvZiB8SEtFWXwuCisgICAgZXhwbGljaXQgU2NvcGVkUmVnS2V5KEhLRVkgaGtleSkgOiBoa2V5Xyhoa2V5KSwgdmFsaWRfKHRydWUpIHt9CisKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyBvd25lcnNoaXAgb2YgfEhLRVl8LgorICAgIGV4cGxpY2l0IFNjb3BlZFJlZ0tleShIS0VZIGhrZXksIGJvb2wgdmFsaWRfKSA6IGhrZXlfKGhrZXkpLCB2YWxpZF8odmFsaWRfKSB7fQorCisgICAgLy8gRGVzdHJ1Y3RvciBjYWxscyBjbG9zZSgpIG1ldGhvZC4KKyAgICB+U2NvcGVkUmVnS2V5KCkgeyBjbG9zZSgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSB3cmFwcGVkIEhLRVkgdmFsdWUgaXMgdmFsaWQuCisgICAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHZhbGlkXzsgfQorCisgICAgLy8gUmV0dXJuIGN1cnJlbnQgSEtFWSB2YWx1ZS4gIHVuZGVmaW5lZCBpZiAhdmFsaWRfCisgICAgSEtFWSBnZXQoKSBjb25zdCB7IHJldHVybiBoa2V5XzsgfQorCisgICAgLy8gUmV0dXJuIGN1cnJlbnQgSEtFWSB2YWx1ZSwgdHJhbnNmZXJyaW5nIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgorICAgIEhLRVkgcmVsZWFzZSgpIHsKKyAgICAgICAgSEtFWSBoID0gaGtleV87CisgICAgICAgIGhrZXlfID0gMDsKKyAgICAgICAgdmFsaWRfID0gZmFsc2U7CisgICAgICAgIHJldHVybiBoOworICAgIH0KKworICAgIC8vIENsb3NlIEhLRVkgaWYgaXQgaXMgbm90IGludmFsaWQuCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKHZhbGlkXykgeworICAgICAgICAgICAgOjpSZWdDbG9zZUtleShoa2V5Xyk7CisgICAgICAgICAgICBoa2V5XyA9IDA7CisgICAgICAgICAgICB2YWxpZF8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFN3YXAgdGhlIGNvbnRlbnQgb2YgdHdvIFNjb3BlZFJlZ0tleSBpbnN0YW5jZXMuCisgICAgdm9pZCBzd2FwKFNjb3BlZFJlZ0tleSogb3RoZXIpIHsKKyAgICAgICAgc3RkOjpzd2FwKGhrZXlfLCBvdGhlci0+aGtleV8pOworICAgICAgICBzdGQ6OnN3YXAodmFsaWRfLCBvdGhlci0+dmFsaWRfKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNjb3BlZFJlZ0tleSk7CisKKyAgICBIS0VZIGhrZXlfOworICAgIGJvb2wgdmFsaWRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRSZWdLZXlfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkUmVnS2V5X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM1NzFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkUmVnS2V5X3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRSZWdLZXkuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIHBhdGggb2YgYSBmaWxlIHRoYXQgY2FuIGFsd2F5cyBiZSBvcGVuZWQgZm9yIHJlYWRpbmcgb24gYW55IHBsYXRmb3JtLgorc3RhdGljIGNvbnN0IGNoYXIga051bGxGaWxlW10gPSAiTlVMIjsKKworSEtFWSBPcGVuSEtMTShib29sKiBvaykgeworICAgIEhLRVkgaGtleSA9IDA7CisgICAgKm9rID0gRVJST1JfU1VDQ0VTUyA9PSA6OlJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhrZXkpOworICAgIHJldHVybiBoa2V5OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChTY29wZWRSZWdLZXksIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAgIFNjb3BlZFJlZ0tleSBoOworICAgIEVYUEVDVF9GQUxTRShoLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZFJlZ0tleSwgQ29uc3RydWN0b3IpIHsKKyAgICBib29sIG9rOworICAgIFNjb3BlZFJlZ0tleSBoKE9wZW5IS0xNKCZvaykpOworICAgIEVYUEVDVF9UUlVFKG9rKTsKKyAgICBFWFBFQ1RfVFJVRShoLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZFJlZ0tleSwgUmVsZWFzZSkgeworICAgIGJvb2wgb2s7CisgICAgU2NvcGVkUmVnS2V5IGgoT3BlbkhLTE0oJm9rKSk7CisgICAgRVhQRUNUX1RSVUUob2spOworICAgIEVYUEVDVF9UUlVFKGgudmFsaWQoKSk7CisgICAgSEtFWSBoa2V5ID0gaC5yZWxlYXNlKCk7CisgICAgRVhQRUNUX0ZBTFNFKGgudmFsaWQoKSk7CisgICAgOjpSZWdDbG9zZUtleShoa2V5KTsKK30KKworVEVTVChTY29wZWRSZWdLZXksIENsb3NlKSB7CisgICAgYm9vbCBvazsKKyAgICBTY29wZWRSZWdLZXkgaChPcGVuSEtMTSgmb2spKTsKKyAgICBFWFBFQ1RfVFJVRShvayk7CisgICAgRVhQRUNUX1RSVUUoaC52YWxpZCgpKTsKKyAgICBoLmNsb3NlKCk7CisgICAgRVhQRUNUX0ZBTFNFKGgudmFsaWQoKSk7Cit9CisKK1RFU1QoU2NvcGVkUmVnS2V5LCBTd2FwKSB7CisgICAgU2NvcGVkUmVnS2V5IGgxOworICAgIGJvb2wgb2s7CisgICAgU2NvcGVkUmVnS2V5IGgyKE9wZW5IS0xNKCZvaykpOworICAgIEVYUEVDVF9UUlVFKG9rKTsKKyAgICBFWFBFQ1RfRkFMU0UoaDEudmFsaWQoKSk7CisgICAgRVhQRUNUX1RSVUUoaDIudmFsaWQoKSk7CisgICAgSEtFWSBoa2V5ID0gaDIuZ2V0KCk7CisgICAgaDEuc3dhcCgmaDIpOworICAgIEVYUEVDVF9GQUxTRShoMi52YWxpZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShoMS52YWxpZCgpKTsKKyAgICBFWFBFQ1RfRVEoaGtleSwgaDEuZ2V0KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkU3RkaW9GaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3NzJiZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IGEgc2NvcGVkIHN0ZGlvIEZJTEUqIHBvaW50ZXIuCisvLyBJLmUuIGd1YXJhbnRlZXMgdGhhdCB0aGUgZmlsZSBpcyBjbG9zZWQgb24gc2NvcGUgZXhpdCwgdW5sZXNzCisvLyB0aGUgcmVsZWFzZSgpIG1ldGhvZCBpcyBjYWxsZWQuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gY2xvc2UKKy8vIHRoZSBmaWxlIGV4cGxpY2l0bHkgd2l0aCBjbG9zZSgpLgorY2xhc3MgU2NvcGVkU3RkaW9GaWxlIHsKK3B1YmxpYzoKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLCB1c2VzIGFuIGVtcHR5IGZpbGUuCisgICAgU2NvcGVkU3RkaW9GaWxlKCkgOiBtRmlsZShOVUxMKSB7fQorCisgICAgLy8gUmVndWxhciBjb25zdHJ1Y3RvciwgdGFrZXMgb3duZXNoaXAgb2YgfGZpbGV8LgorICAgIGV4cGxpY2l0IFNjb3BlZFN0ZGlvRmlsZShGSUxFKiBmaWxlKSA6IG1GaWxlKGZpbGUpIHt9CisKKyAgICAvLyBEZXN0cnVjdG9yIGFsd2F5cyBjYWxscyBjbG9zZSgpLgorICAgIH5TY29wZWRTdGRpb0ZpbGUoKSB7IGNsb3NlKCk7IH0KKworICAgIC8vIFJldHVybnMgRklMRSogcG9pbnRlciBkaXJlY3RseS4KKyAgICBGSUxFKiBnZXQoKSBjb25zdCB7IHJldHVybiBtRmlsZTsgfQorCisgICAgLy8gUmVsZWFzZSB0aGUgRklMRSogaGFuZGxlIGFuZCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlciwgd2hpY2ggYmVjb21lcworICAgIC8vIGl0cyBvd25lci4gUmV0dXJucyBOVUxMIGlmIHRoZSBpbnN0YW5jZSB3YXMgYWxyZWFkeSBjbG9zZWQgb3IgZW1wdHkuCisgICAgRklMRSogcmVsZWFzZSgpIHsKKyAgICAgICAgRklMRSogZmlsZSA9IG1GaWxlOworICAgICAgICBtRmlsZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8vIFN3YXAgdHdvIHNjb3BlZCBGSUxFKiBwb2ludGVycy4KKyAgICB2b2lkIHN3YXAoU2NvcGVkU3RkaW9GaWxlKiBvdGhlcikgeworICAgICAgICBGSUxFKiB0bXAgPSBvdGhlci0+bUZpbGU7CisgICAgICAgIG90aGVyLT5tRmlsZSA9IG1GaWxlOworICAgICAgICBtRmlsZSA9IHRtcDsKKyAgICB9CisKKyAgICAvLyBFeHBsaWNpdCBjbG9zZSBvZiBhIHNjb3BlZCBGSUxFKi4KKyAgICB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAobUZpbGUpIHsKKyAgICAgICAgICAgIDo6ZmNsb3NlKG1GaWxlKTsKKyAgICAgICAgICAgIG1GaWxlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK3ByaXZhdGU6CisgICAgRklMRSogbUZpbGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRTdGRpb0ZpbGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzZjYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRTdGRpb0ZpbGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBUaGUgcGF0aCBvZiBhIGZpbGUgdGhhdCBjYW4gYWx3YXlzIGJlIG9wZW5lZCBmb3IgcmVhZGluZyBvbiBhbnkgcGxhdGZvcm0uCisjaWZkZWYgX1dJTjMyCitzdGF0aWMgY29uc3QgY2hhciBrTnVsbEZpbGVbXSA9ICJOVUwiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIGtOdWxsRmlsZVtdID0gIi9kZXYvbnVsbCI7CisjZW5kaWYKKworVEVTVChTY29wZWRTdGRpb0ZpbGUsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAgIFNjb3BlZFN0ZGlvRmlsZSBmOworICAgIEVYUEVDVF9GQUxTRShmLmdldCgpKTsKK30KKworVEVTVChTY29wZWRTdGRpb0ZpbGUsIENvbnN0cnVjdG9yKSB7CisgICAgU2NvcGVkU3RkaW9GaWxlIGYoZm9wZW4oa051bGxGaWxlLCAicmIiKSk7CisgICAgRVhQRUNUX1RSVUUoZi5nZXQoKSk7Cit9CisKK1RFU1QoU2NvcGVkU3RkaW9GaWxlLCBSZWxlYXNlKSB7CisgICAgRklMRSogaGFuZGxlID0gTlVMTDsKKyAgICBTY29wZWRTdGRpb0ZpbGUgZihmb3BlbihrTnVsbEZpbGUsICJyYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShmLmdldCgpKTsKKyAgICBoYW5kbGUgPSBmLnJlbGVhc2UoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZi5nZXQoKSk7CisgICAgRVhQRUNUX1RSVUUoaGFuZGxlKTsKKyAgICA6OmZjbG9zZShoYW5kbGUpOworfQorCitURVNUKFNjb3BlZFN0ZGlvRmlsZSwgQ2xvc2UpIHsKKyAgICBTY29wZWRTdGRpb0ZpbGUgZihmb3BlbihrTnVsbEZpbGUsICJyYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShmLmdldCgpKTsKKyAgICBmLmNsb3NlKCk7CisgICAgRVhQRUNUX0ZBTFNFKGYuZ2V0KCkpOworfQorCitURVNUKFNjb3BlZFN0ZGlvRmlsZSwgU3dhcCkgeworICAgIFNjb3BlZFN0ZGlvRmlsZSBmMTsKKyAgICBTY29wZWRTdGRpb0ZpbGUgZjIoZm9wZW4oa051bGxGaWxlLCAicmIiKSk7CisgICAgRVhQRUNUX0ZBTFNFKGYxLmdldCgpKTsKKyAgICBFWFBFQ1RfVFJVRShmMi5nZXQoKSk7CisgICAgRklMRSogZnAgPSBmMi5nZXQoKTsKKyAgICBmMS5zd2FwKCZmMik7CisgICAgRVhQRUNUX0ZBTFNFKGYyLmdldCgpKTsKKyAgICBFWFBFQ1RfVFJVRShmMS5nZXQoKSk7CisgICAgRVhQRUNUX0VRKGZwLCBmMS5nZXQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RkaW9TdHJlYW0uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RkaW9TdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2Q4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TdGRpb1N0cmVhbS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvU3RkaW9TdHJlYW0uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworU3RkaW9TdHJlYW06OlN0ZGlvU3RyZWFtKEZJTEUqIGZpbGUsIE93bmVyc2hpcCBvd25lcnNoaXApIDoKKyAgICAgICAgbUZpbGUoZmlsZSksIG1Pd25lcnNoaXAoKSB7fQorCitTdGRpb1N0cmVhbTo6flN0ZGlvU3RyZWFtKCkgeworICAgIGlmIChtT3duZXJzaGlwID09IGtPd25lcikgeworICAgICAgICA6OmZjbG9zZShtRmlsZSk7CisgICAgfQorfQorCitzc2l6ZV90IFN0ZGlvU3RyZWFtOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgcmVzID0gOjpmcmVhZChidWZmZXIsIDEsIHNpemUsIG1GaWxlKTsKKyAgICBpZiAocmVzIDwgc2l6ZSkgeworICAgICAgICBpZiAoITo6ZmVvZihtRmlsZSkpIHsKKyAgICAgICAgICAgIGVycm5vID0gOjpmZXJyb3IobUZpbGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXMpOworfQorCitzc2l6ZV90IFN0ZGlvU3RyZWFtOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IHJlcyA9IDo6ZndyaXRlKGJ1ZmZlciwgMSwgc2l6ZSwgbUZpbGUpOworICAgIGlmIChyZXMgPCBzaXplKSB7CisgICAgICAgIGlmICghOjpmZW9mKG1GaWxlKSkgeworICAgICAgICAgICAgZXJybm8gPSA6OmZlcnJvcihtRmlsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RkaW9TdHJlYW0uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1N0ZGlvU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2NWU0NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1N0ZGlvU3RyZWFtLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpiYXNlOjpTdHJlYW0gaW50ZXJmYWNlIG9uIHRvcCBvZiBhbgorLy8gc3RkaW8gRklMRSogaW5zdGFuY2UuCitjbGFzcyBTdGRpb1N0cmVhbSA6IHB1YmxpYyBTdHJlYW0geworcHVibGljOgorICAgIGVudW0gT3duZXJzaGlwIHsKKyAgICAgICAga05vdE93bmVyLAorICAgICAgICBrT3duZXIKKyAgICB9OworCisgICAgU3RkaW9TdHJlYW0oRklMRSogZmlsZSwgT3duZXJzaGlwIG93bmVyc2hpcCA9IGtOb3RPd25lcik7CisgICAgdmlydHVhbCB+U3RkaW9TdHJlYW0oKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgU3RkaW9TdHJlYW0oKTsgIC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3RkaW9TdHJlYW0pOworCisgICAgRklMRSogbUZpbGU7CisgICAgT3duZXJzaGlwIG1Pd25lcnNoaXA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYWE2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK3ZvaWQgU3RyZWFtOjpwdXRCeXRlKHVpbnQ4X3QgdmFsdWUpIHsKKyAgICB3cml0ZSgmdmFsdWUsIDFVKTsKK30KKwordWludDhfdCBTdHJlYW06OmdldEJ5dGUoKSB7CisgICAgdWludDhfdCB2YWx1ZVsxXSA9IHsgMCB9OworICAgIHJlYWQodmFsdWUsIDFVKTsKKyAgICByZXR1cm4gdmFsdWVbMF07Cit9CisKK3ZvaWQgU3RyZWFtOjpwdXRCZTE2KHVpbnQxNl90IHZhbHVlKSB7CisgICAgdWludDhfdCBiWzJdID0geyAodWludDhfdCkodmFsdWUgPj4gOCksICh1aW50OF90KXZhbHVlIH07CisgICAgd3JpdGUoYiwgMlUpOworfQorCit1aW50MTZfdCBTdHJlYW06OmdldEJlMTYoKSB7CisgICAgdWludDhfdCBiWzJdID0geyAwLCAwIH07CisgICAgcmVhZChiLCAyVSk7CisgICAgcmV0dXJuICgodWludDE2X3QpYlswXSA8PCA4KSB8ICh1aW50MTZfdCliWzFdOworfQorCit2b2lkIFN0cmVhbTo6cHV0QmUzMih1aW50MzJfdCB2YWx1ZSkgeworICAgIHVpbnQ4X3QgYls0XSA9IHsKKyAgICAgICAgICAgICh1aW50OF90KSh2YWx1ZSA+PiAyNCksCisgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gMTYpLAorICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlID4+IDgpLAorICAgICAgICAgICAgKHVpbnQ4X3QpdmFsdWUgfTsKKyAgICB3cml0ZShiLCA0VSk7Cit9CisKK3VpbnQzMl90IFN0cmVhbTo6Z2V0QmUzMigpIHsKKyAgICB1aW50OF90IGJbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICByZWFkKGIsIDRVKTsKKyAgICByZXR1cm4gKCh1aW50MzJfdCliWzBdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDMyX3QpYlsxXSA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQzMl90KWJbMl0gPDwgOCkgfAorICAgICAgICAgICAodWludDMyX3QpYlszXTsKK30KKwordm9pZCBTdHJlYW06OnB1dEJlNjQodWludDY0X3QgdmFsdWUpIHsKKyAgICB1aW50OF90IGJbOF0gPSB7CisgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gNTYpLAorICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlID4+IDQ4KSwKKyAgICAgICAgICAgICh1aW50OF90KSh2YWx1ZSA+PiA0MCksCisgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gMzIpLAorICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlID4+IDI0KSwKKyAgICAgICAgICAgICh1aW50OF90KSh2YWx1ZSA+PiAxNiksCisgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gOCksCisgICAgICAgICAgICAodWludDhfdCl2YWx1ZSB9OworICAgIHdyaXRlKGIsIDhVKTsKK30KKwordWludDY0X3QgU3RyZWFtOjpnZXRCZTY0KCkgeworICAgIHVpbnQ4X3QgYls4XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIHJlYWQoYiwgOFUpOworICAgIHJldHVybiAoKHVpbnQ2NF90KWJbMF0gPDwgNTYpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCliWzFdIDw8IDQ4KSB8CisgICAgICAgICAgICgodWludDY0X3QpYlsyXSA8PCA0MCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KWJbM10gPDwgMzIpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdCliWzRdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDY0X3QpYls1XSA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQ2NF90KWJbNl0gPDwgOCkgfAorICAgICAgICAgICAodWludDY0X3QpYls3XTsKK30KKwordm9pZCBTdHJlYW06OnB1dEZsb2F0KGZsb2F0IHYpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0IGY7CisgICAgICAgIHVpbnQ4X3QgYnl0ZXNbc2l6ZW9mKGZsb2F0KV07CisgICAgfSB1OworICAgIHUuZiA9IHY7CisgICAgdGhpcy0+d3JpdGUodS5ieXRlcywgc2l6ZW9mKHUuYnl0ZXMpKTsKK30KKworZmxvYXQgU3RyZWFtOjpnZXRGbG9hdCgpIHsKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0IGY7CisgICAgICAgIHVpbnQ4X3QgYnl0ZXNbc2l6ZW9mKGZsb2F0KV07CisgICAgfSB1OworICAgIHRoaXMtPnJlYWQodS5ieXRlcywgc2l6ZW9mKHUuYnl0ZXMpKTsKKyAgICByZXR1cm4gdS5mOworfQorCit2b2lkIFN0cmVhbTo6cHV0U3RyaW5nKFN0cmluZ1ZpZXcgc3RyKSB7CisgICAgcHV0U3RyaW5nKHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpKTsKK30KKwordm9pZCBTdHJlYW06OnB1dFN0cmluZyhjb25zdCBjaGFyKiBzdHIpIHsKKyAgICBwdXRTdHJpbmcoc3RyLCBzdHIgPyA6OnN0cmxlbihzdHIpIDogMFUpOworfQorCit2b2lkIFN0cmVhbTo6cHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbikgeworICAgIGlmICghc3RyKSB7CisgICAgICAgIHN0ciA9ICIiOworICAgICAgICBsZW4gPSAwOworICAgIH0KKyAgICB0aGlzLT5wdXRCZTMyKGxlbik7CisgICAgdGhpcy0+d3JpdGUoc3RyLCBsZW4pOworfQorCitzdGQ6OnN0cmluZyBTdHJlYW06OmdldFN0cmluZygpIHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgc2l6ZV90IGxlbiA9IHRoaXMtPmdldEJlMzIoKTsKKyAgICByZXN1bHQucmVzaXplKGxlbik7CisgICAgaWYgKHRoaXMtPnJlYWQoJnJlc3VsdFswXSwgbGVuKSAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihsZW4pKSB7CisgICAgICAgIHJlc3VsdC5yZXNpemUoMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIxNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHRvIGJ5dGUgc3RyZWFtcyBvZiBhbGwga2luZC4KKy8vIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gaW1wbGVtZW50IGRpc2sgc2VyaWFsaXphdGlvbi4KK2NsYXNzIFN0cmVhbSB7CitwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBTdHJlYW0oKSB7fQorCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsIH5TdHJlYW0oKSB7fQorCisgICAgLy8gUmVhZCB1cCB0byB8c2l6ZXwgYnl0ZXMgYW5kIGNvcHkgdGhlbSB0byB8YnVmZmVyfC4gUmV0dXJuIHRoZSBudW1iZXIKKyAgICAvLyBvZiBieXRlcyB0aGF0IHdlcmUgYWN0dWFsbHkgdHJhbnNmZXJyZWQsIG9yIC1lcnJubyB2YWx1ZSBvbiBlcnJvci4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZCh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvLyBXcml0ZSB1cCB0byB8c2l6ZXwgYnl0ZXMgZnJvbSB8YnVmZmVyfCBpbnRvIHRoZSBzdHJlYW0uIFJldHVybiB0aGUKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHRyYW5zZmVycmVkLCBvciAtZXJybm8gdmFsdWUgb24KKyAgICAvLyBlcnJvci4KKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLy8gV3JpdGUgYSBzaW5nbGUgYnl0ZSB8dmFsdWV8IGludG8gdGhlIHN0cmVhbS4gSWdub3JlIGVycm9ycy4KKyAgICB2b2lkIHB1dEJ5dGUodWludDhfdCB2YWx1ZSk7CisKKyAgICAvLyBXcml0ZSBhIDE2LWJpdCB8dmFsdWV8IGFzIGJpZy1lbmRpYW4gaW50byB0aGUgc3RyZWFtLiBJZ25vcmUgZXJyb3JzLgorICAgIHZvaWQgcHV0QmUxNih1aW50MTZfdCB2YWx1ZSk7CisKKyAgICAvLyBXcml0ZSBhIDMyLWJpdCB8dmFsdWV8IGFzIGJpZy1lbmRpYW4gaW50byB0aGUgc3RyZWFtLiBJZ25vcmUgZXJyb3JzLgorICAgIHZvaWQgcHV0QmUzMih1aW50MzJfdCB2YWx1ZSk7CisKKyAgICAvLyBXcml0ZSBhIDY0LWJpdCB8dmFsdWV8IGFzIGJpZy1lbmRpYW4gaW50byB0aGUgc3RyZWFtLiBJZ25vcmUgZXJyb3JzLgorICAgIHZvaWQgcHV0QmU2NCh1aW50NjRfdCB2YWx1ZSk7CisKKyAgICAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgc3RyZWFtLiBSZXR1cm4gMCBvbiBlcnJvci4KKyAgICB1aW50OF90IGdldEJ5dGUoKTsKKworICAgIC8vIFJlYWQgYSBzaW5nbGUgYmlnLWVuZGlhbiAxNi1iaXQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgorICAgIC8vIFJldHVybiAwIG9uIGVycm9yLgorICAgIHVpbnQxNl90IGdldEJlMTYoKTsKKworICAgIC8vIFJlYWQgYSBzaW5nbGUgYmlnLWVuZGlhbiAzMi1iaXQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgorICAgIC8vIFJldHVybiAwIG9uIGVycm9yLgorICAgIHVpbnQzMl90IGdldEJlMzIoKTsKKworICAgIC8vIFJlYWQgYSBzaW5nbGUgYmlnLWVuZGlhbiA2NC1iaXQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgorICAgIC8vIFJldHVybiAwIG9uIGVycm9yLgorICAgIHVpbnQ2NF90IGdldEJlNjQoKTsKKworICAgIC8vIFdyaXRlIGEgMzItYml0IGZsb2F0IHx2YWx1ZXwgdG8gdGhlIHN0cmVhbS4KKyAgICB2b2lkIHB1dEZsb2F0KGZsb2F0IHZhbHVlKTsKKworICAgIC8vIFJlYWQgYSBzaW5nbGUgMzItYml0IGZsb2F0IHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KKyAgICBmbG9hdCBnZXRGbG9hdCgpOworCisgICAgLy8gV3JpdGUgYSBzdHJpbmcgfHN0cnwgaW50byB0aGUgc3RyZWFtLiBJZ25vcmUgZXJyb3JzLgorICAgIHZvaWQgcHV0U3RyaW5nKFN0cmluZ1ZpZXcgc3RyKTsKKworICAgIC8vIFdyaXRlIGEgMC10ZXJtaW5hdGVkIEMgc3RyaW5nIHxzdHJ8IGludG8gdGhlIHN0cmVhbS4gSWdub3JlIGVycm9yLgorICAgIHZvaWQgcHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgICAvLyBXcml0ZSBhIHN0cmluZyB8c3RyfCBvZiB8c3RybGVufCBieXRlcyBpbnRvIHRoZSBzdHJlYW0uCisgICAgLy8gSWdub3JlIGVycm9ycy4KKyAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IHN0cmxlbik7CisKKyAgICAvLyBSZWFkIGEgc3RyaW5nIGZyb20gdGhlIHN0cmVhbS4gUmV0dXJuIGEgbmV3IHN0cmluZyBpbnN0YW5jZSwKKyAgICAvLyB3aGljaCB3aWxsIGJlIGVtcHR5IG9uIGVycm9yLiBOb3RlIHRoYXQgdGhpcyBjYW4gb25seSBiZSB1c2VkCisgICAgLy8gdG8gcmVhZCBzdHJpbmdzIHRoYXQgd2VyZSB3cml0dGVuIHdpdGggcHV0U3RyaW5nKCkuCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTdHJpbmcoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNGIzZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyNTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIEFSUkFZTEVOKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIHNtYWxsIFN0cmVhbSBpbXBsZW1lbnRhdGlvbiB1c2VkIGR1cmluZyB0aGlzIHRlc3QuIEl0IHVzZXMgYQorLy8gY2xpZW50LXByb3ZpZGVkIGZpeGVkLXNpemUgYnVmZmVyIHRvIHN0b3JlIHRoZSBkYXRhLCB3aGljaCBjYW4gYmUKKy8vIHVzZWQgZWl0aGVyIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCitjbGFzcyBNZW1vcnlTdHJlYW0gOiBwdWJsaWMgU3RyZWFtIHsKK3B1YmxpYzoKKyAgICBNZW1vcnlTdHJlYW0odm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKSA6CisgICAgICAgICAgICBtQnVmZmVyKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpKSwKKyAgICAgICAgICAgIG1TaXplKGJ1ZmZlckxlbiksCisgICAgICAgICAgICBtUG9zKDApIHt9CisKKyAgICBNZW1vcnlTdHJlYW0oY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKSA6CisgICAgICAgICAgICBtQnVmZmVyKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PHZvaWQqPihidWZmZXIpKSksCisgICAgICAgICAgICBtU2l6ZShidWZmZXJMZW4pLAorICAgICAgICAgICAgbVBvcygwKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1TaXplIC0gbVBvczsKKyAgICAgICAgaWYgKGxlbiA+IGF2YWlsKSB7CisgICAgICAgICAgICBsZW4gPSBhdmFpbDsKKyAgICAgICAgfQorICAgICAgICA6Om1lbWNweShidWZmZXIsIG1CdWZmZXIgKyBtUG9zLCBsZW4pOworICAgICAgICBtUG9zICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KGxlbik7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtU2l6ZSAtIG1Qb3M7CisgICAgICAgIGlmIChsZW4gPiBhdmFpbCkgeworICAgICAgICAgICAgbGVuID0gYXZhaWw7CisgICAgICAgIH0KKyAgICAgICAgOjptZW1jcHkobUJ1ZmZlciArIG1Qb3MsIGJ1ZmZlciwgbGVuKTsKKyAgICAgICAgbVBvcyArPSBsZW47CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihsZW4pOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90KiBtQnVmZmVyOworICAgIHNpemVfdCAgIG1TaXplOworICAgIHNpemVfdCAgIG1Qb3M7Cit9OworCitURVNUKFN0cmVhbSxnZXRCeXRlKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0RhdGFbXSA9ICJIZWxsbyB3b3JsZCEiOworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oa0RhdGEsIHNpemVvZihrRGF0YSkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKGtEYXRhKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50OF90PihrRGF0YVtuXSksIHN0cmVhbS5nZXRCeXRlKCkpCisgICAgICAgICAgICAgICAgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFN0cmVhbSxwdXRCeXRlKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0RhdGFbXSA9ICJIZWxsbyB3b3JsZCEiOworICAgIGNoYXIgYnVmZmVyW3NpemVvZihrRGF0YSldOworICAgIDo6bWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0RhdGEpOyArK24pIHsKKyAgICAgICAgc3RyZWFtLnB1dEJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oa0RhdGFbbl0pKTsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLCBidWZmZXJbbl0pIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworCitURVNUKFN0cmVhbSxwdXRCZTE2KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtEYXRhW10gPSB7CisgICAgICAgIDB4MTIzNCwgMHg1Njc4LCAweDlhYmMsIDB4ZGVmMAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkW3NpemVvZihrRGF0YSldID0geworICAgICAgICAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjLCAweGRlLCAweGYwLAorICAgIH07CisgICAgdWludDhfdCBidWZmZXJbc2l6ZW9mKGtFeHBlY3RlZCldID0geyAwLCB9OworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHNpemVvZihrRGF0YSkgLyBzaXplb2YoKmtEYXRhKTsgKytuKSB7CisgICAgICAgIHN0cmVhbS5wdXRCZTE2KGtEYXRhW25dKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIGJ1ZmZlcltuXSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFN0cmVhbSxnZXRCZTE2KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RhdGFbXSA9IHsKKyAgICAgICAgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5YSwgMHhiYywgMHhkZSwgMHhmMCwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBrRXhwZWN0ZWRbXSA9IHsKKyAgICAgICAgMHgxMjM0LCAweDU2NzgsIDB4OWFiYywgMHhkZWYwCisgICAgfTsKKyAgICBNZW1vcnlTdHJlYW0gc3RyZWFtKGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlMRU4oa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIHN0cmVhbS5nZXRCZTE2KCkpIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworVEVTVChTdHJlYW0scHV0QmUzMikgeworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrRGF0YVtdID0geworICAgICAgICAweDEyMzQ1Njc4LCAweDlhYmNkZWYwCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbc2l6ZW9mKGtEYXRhKV0gPSB7CisgICAgICAgIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OWEsIDB4YmMsIDB4ZGUsIDB4ZjAsCisgICAgfTsKKyAgICB1aW50OF90IGJ1ZmZlcltzaXplb2Yoa0V4cGVjdGVkKV0gPSB7IDAsIH07CisgICAgTWVtb3J5U3RyZWFtIHN0cmVhbShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKGtEYXRhKSAvIHNpemVvZigqa0RhdGEpOyArK24pIHsKKyAgICAgICAgc3RyZWFtLnB1dEJlMzIoa0RhdGFbbl0pOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHNpemVvZihrRXhwZWN0ZWQpOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZFtuXSwgYnVmZmVyW25dKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU3RyZWFtLGdldEJlMzIpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YVtdID0geworICAgICAgICAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjLCAweGRlLCAweGYwLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtFeHBlY3RlZFtdID0geworICAgICAgICAweDEyMzQ1Njc4LCAweDlhYmNkZWYwCisgICAgfTsKKyAgICBNZW1vcnlTdHJlYW0gc3RyZWFtKGtEYXRhLCBzaXplb2Yoa0RhdGEpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlMRU4oa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIHN0cmVhbS5nZXRCZTMyKCkpIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworVEVTVChTdHJlYW0scHV0QmU2NCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrRGF0YVtdID0geworICAgICAgICAweDEyMzQ1Njc4OWFiY2RlZjAKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtFeHBlY3RlZFtzaXplb2Yoa0RhdGEpXSA9IHsKKyAgICAgICAgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5YSwgMHhiYywgMHhkZSwgMHhmMCwKKyAgICB9OworICAgIHVpbnQ4X3QgYnVmZmVyW3NpemVvZihrRXhwZWN0ZWQpXSA9IHsgMCwgfTsKKyAgICBNZW1vcnlTdHJlYW0gc3RyZWFtKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0RhdGEpIC8gc2l6ZW9mKCprRGF0YSk7ICsrbikgeworICAgICAgICBzdHJlYW0ucHV0QmU2NChrRGF0YVtuXSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKGtFeHBlY3RlZCk7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCBidWZmZXJbbl0pIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworVEVTVChTdHJlYW0sZ2V0QmU2NCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhW10gPSB7CisgICAgICAgIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OWEsIDB4YmMsIDB4ZGUsIDB4ZjAsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0V4cGVjdGVkW10gPSB7CisgICAgICAgIDB4MTIzNDU2Nzg5YWJjZGVmMAorICAgIH07CisgICAgTWVtb3J5U3RyZWFtIHN0cmVhbShrRGF0YSwgc2l6ZW9mKGtEYXRhKSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZTEVOKGtFeHBlY3RlZCk7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCBzdHJlYW0uZ2V0QmU2NCgpKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU3RyZWFtLCBwdXRGbG9hdCkgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrVmFsdWUgPSAzLjE0MTU5MjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbXSA9IHsKKyAgICAgICAgMHhkOCwgMHgwZiwgMHg0OSwgMHg0MCwKKyAgICB9OworICAgIHVpbnQ4X3QgYnVmZmVyW3NpemVvZihrRXhwZWN0ZWQpXSA9IHsgMCwgfTsKKyAgICBNZW1vcnlTdHJlYW0gc3RyZWFtKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgc3RyZWFtLnB1dEZsb2F0KGtWYWx1ZSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIGJ1ZmZlcltuXSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFN0cmVhbSwgZ2V0RmxvYXQpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRGF0YVtdID0geworICAgICAgICAweGQ4LCAweDBmLCAweDQ5LCAweDQwLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtFeHBlY3RlZCA9IDMuMTQxNTkyOworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oa0RhdGEsIHNpemVvZihrRGF0YSkpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWQsIHN0cmVhbS5nZXRGbG9hdCgpKTsKK30KKworVEVTVChTdHJlYW0sIHB1dFN0cmluZ1dpdGhCYXNlU3RyaW5nKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0lucHV0W10gPSAiSGVsbG8gd29ybGQiOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtFeHBlY3RlZFtdID0geworICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDBiLAorICAgICAgICAnSCcsICdlJywgJ2wnLCAnbCcsICdvJywgJyAnLCAndycsICdvJywgJ3InLCAnbCcsICdkJywKKyAgICB9OworICAgIHVpbnQ4X3QgYnVmZmVyWzMyXTsKKyAgICBNZW1vcnlTdHJlYW0gc3RyZWFtKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHN0cmVhbS5wdXRTdHJpbmcoc3RkOjpzdHJpbmcoa0lucHV0KSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIGJ1ZmZlcltuXSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFN0cmVhbSwgcHV0U3RyaW5nV2l0aENTdHJpbmcpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrSW5wdXRbXSA9ICJIZWxsbyB3b3JsZCI7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkW10gPSB7CisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGIsCisgICAgICAgICdIJywgJ2UnLCAnbCcsICdsJywgJ28nLCAnICcsICd3JywgJ28nLCAncicsICdsJywgJ2QnLAorICAgIH07CisgICAgdWludDhfdCBidWZmZXJbMzJdOworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgc3RyZWFtLnB1dFN0cmluZyhrSW5wdXQpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKGtFeHBlY3RlZCk7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCBidWZmZXJbbl0pIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworVEVTVChTdHJlYW0sIHB1dFN0cmluZykgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtJbnB1dFtdID0gIkhlbGxvIHdvcmxkIjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbXSA9IHsKKyAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwKKyAgICAgICAgJ0gnLCAnZScsICdsJywgJ2wnLCAnbycsICcgJywgJ3cnLCAnbycsICdyJywgJ2wnLCAnZCcsCisgICAgfTsKKyAgICB1aW50OF90IGJ1ZmZlclszMl07CisgICAgTWVtb3J5U3RyZWFtIHN0cmVhbShidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgICBzdHJlYW0ucHV0U3RyaW5nKGtJbnB1dCwgc2l6ZW9mKGtJbnB1dCkgLSAxVSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yoa0V4cGVjdGVkKTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRbbl0sIGJ1ZmZlcltuXSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFN0cmVhbSwgZ2V0U3RyaW5nKSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0lucHV0W10gPSB7CisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGIsCisgICAgICAgICdIJywgJ2UnLCAnbCcsICdsJywgJ28nLCAnICcsICd3JywgJ28nLCAncicsICdsJywgJ2QnLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0V4cGVjdGVkW10gPSAiSGVsbG8gd29ybGQiOworICAgIE1lbW9yeVN0cmVhbSBzdHJlYW0oa0lucHV0LCBzaXplb2Yoa0lucHV0KSk7CisgICAgc3RkOjpzdHJpbmcgc3RyID0gc3RyZWFtLmdldFN0cmluZygpOworICAgIEVYUEVDVF9FUShzaXplb2Yoa0V4cGVjdGVkKSAtIDFVLCBzdHIuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0V4cGVjdGVkLCBzdHIuY19zdHIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JhYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxzY2hlZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3R5cGVkZWYgTGF6eUluc3RhbmNlU3RhdGU6OkF0b21pY1R5cGUgQXRvbWljVHlwZTsKKworI2lmIGRlZmluZWQoX19HTlVDX18pCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcGlsZXJCYXJyaWVyKCkgeworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiIiA6IDogOiAibWVtb3J5Iik7Cit9CisjZWxzZQorI2Vycm9yICJZb3VyIGNvbXBpbGVyIGlzIG5vdCBzdXBwb3J0ZWQiCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyMgIGRlZmluZSBhY3F1aXJlQmFycmllcigpIGNvbXBpbGVyQmFycmllcigpCisjICBkZWZpbmUgcmVsZWFzZUJhcnJpZXIoKSBjb21waWxlckJhcnJpZXIoKQorI2Vsc2UKKyMgIGVycm9yICJZb3VyIENQVSBpcyBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgQXRvbWljVHlwZSBsb2FkQWNxdWlyZShBdG9taWNUeXBlIHZvbGF0aWxlKiBwdHIpIHsKKyAgICBBdG9taWNUeXBlIHJldCA9ICpwdHI7CisgICAgYWNxdWlyZUJhcnJpZXIoKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcmVSZWxlYXNlKEF0b21pY1R5cGUgdm9sYXRpbGUqIHB0ciwgQXRvbWljVHlwZSB2YWx1ZSkgeworICAgIHJlbGVhc2VCYXJyaWVyKCk7CisgICAgKnB0ciA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IGF0b21pY0NvbXBhcmVBbmRTd2FwKEF0b21pY1R5cGUgdm9sYXRpbGUqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UocHRyLCB2YWx1ZSwgZXhwZWN0ZWQpOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyAgICByZXR1cm4gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgZXhwZWN0ZWQsIHZhbHVlKTsKKyNlbHNlCisjZXJyb3IgIllvdXIgY29tcGlsZXIgaXMgbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB5aWVsZFRocmVhZCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoITo6U3dpdGNoVG9UaHJlYWQoKSkgeworICAgICAgICA6OlNsZWVwKDApOworICAgIH0KKyNlbHNlCisgICAgc2NoZWRfeWllbGQoKTsKKyNlbmRpZgorfQorCitib29sIExhenlJbnN0YW5jZVN0YXRlOjppbkluaXRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbG9hZEFjcXVpcmUoJm1TdGF0ZSkgPT0gU1RBVEVfSU5JVDsKK30KKworYm9vbCBMYXp5SW5zdGFuY2VTdGF0ZTo6bmVlZENvbnN0cnVjdGlvbigpIHsKKyAgICBBdG9taWNUeXBlIHN0YXRlID0gbG9hZEFjcXVpcmUoJm1TdGF0ZSk7CisgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9ET05FKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBzdGF0ZSA9IGF0b21pY0NvbXBhcmVBbmRTd2FwKCZtU3RhdGUsIFNUQVRFX0lOSVQsIFNUQVRFX0NPTlNUUlVDVElORyk7CisgICAgaWYgKHN0YXRlID09IFNUQVRFX0lOSVQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgZG8geworICAgICAgICB5aWVsZFRocmVhZCgpOworICAgICAgICBzdGF0ZSA9IGxvYWRBY3F1aXJlKCZtU3RhdGUpOworICAgIH0gd2hpbGUgKHN0YXRlICE9IFNUQVRFX0RPTkUpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIExhenlJbnN0YW5jZVN0YXRlOjpkb25lQ29uc3RydWN0aW5nKCkgeworICAgIHN0b3JlUmVsZWFzZSgmbVN0YXRlLCBTVEFURV9ET05FKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMxNGVmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBBIExhenlJbnN0YW5jZSBpcyBhIGhlbHBlciB0ZW1wbGF0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0KKy8vIHRocmVhZC1zYWZlIGxhenkgaW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIEMrKyBvYmplY3RzIHdpdGhvdXQgZm9yY2luZworLy8gdGhlIGdlbmVyYXRpb24gb2YgQysrIHN0YXRpYyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisvLworLy8gSW4gYSBudXRzaGVsbCwgeW91IGNhbiByZXBsYWNlIGEgc3RhdGVtZW50IGxpa2U6CisvLworLy8gICAgc3RhdGljIEZvbyBnRm9vOworLy8KKy8vIFdpdGg6CisvLworLy8gICAgc3RhdGljIExhenlJbnN0YW5jZTxGb28+IGdGb28gPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisvLworLy8gSW4gdGhlIGZpcnN0IGNhc2UsIGEgaGlkZGVuIHN0YXRpYyBDKysgY29uc3RydWN0b3IgaXMgZW1iZWRkZWQgaW4gdGhlCisvLyBmaW5hbCBleGVjdXRhYmxlLCBhbmQgZXhlY3V0ZWQgYXQgKmxvYWQqICp0aW1lKiB0byBjYWxsIHRoZSBGb286OkZvbworLy8gY29uc3RydWN0b3Igb24gdGhlIGdGb28gb2JqZWN0LgorLy8KKy8vIE9uIHRoZSBzZWNvbmQgY2FzZSwgZ0ZvbyB3aWxsIG9ubHkgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5LCBpLmUuIHRoZSBmaXJzdAorLy8gdGltZSBhbnkgY29kZSBhY3R1YWxseSB0cmllcyB0byBhY2Nlc3MgdGhlIHZhcmlhYmxlLgorLy8KKy8vIE5vdGUgdGhhdCBhY2Nlc3MgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LCBpLmUuOgorLy8KKy8vICAgIGdGb28uZ2V0KCkgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGF6eS1pbml0aWFsaXplZCBvYmplY3QuCisvLyAgICBnRm9vLnB0cigpIHJldHVybnMgYSBwb2ludGVyIHRvIGl0LgorLy8gICAgZ0Zvby0+U29tZXRoaW5nKCkgaXMgZXF1aXZhbGVudCB0byBkb2luZyBnRm9vLnB0cigpLT5Tb21ldGhpbmcoKS4KKy8vCisvLyAnZ0ZvbycgaXMgc3RvcmVkIGluIHRoZSAuYnNzIHNlY3Rpb24gYW5kIHRoaXMgZG9lc24ndCB1c2UgaGVhcCBhbGxvY2F0aW9uLgorLy8gVGhpcyBjbGFzcyBjYW4gb25seSBiZSB1c2VkIHRvIHBlcmZvcm0gbGF6eSBpbml0aWFsaXphdGlvbiB0aHJvdWdoIHRoZQorLy8gY2xhc3MnIGRlZmF1bHQgY29uc3RydWN0b3IuIEZvciBtb3JlIHNwZWNpYWxpemVkIGNhc2VzLCB5b3Ugd2lsbCBoYXZlCisvLyB0byBjcmVhdGUgYSBkZXJpdmVkIGNsYXNzLCBlLmcuOgorLy8KKy8vICAgIGNsYXNzIEZvb3JXaXRoRGVmYXVsdFBhcmFtcyA6IHB1YmxpYyBGb28geworLy8gICAgcHVibGljOgorLy8gICAgICAgRm9vV2l0aERlZmF1bHRQYXJhbXMoKSA6IEZvbyg8ZGVmYXVsdC1wYXJhbWV0ZXJzPikge30KKy8vICAgIH07CisvLworLy8gICAgTGF6eUluc3RhbmNlPEZvb1dpdGhEZWZhdWx0UGFyYW1zPiBnRm9vID0gTEFaWV9JTlNUQU5DRV9JTklUOworLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBMYXp5SW5zdGFuY2UgcmVsaWVzIG9uIGF0b21pYyBvcGVyYXRpb25zIGFuZAorLy8gUE9ELXN0cnVjdCBjbGFzcyBkZWZpbml0aW9ucywgaS5lLiBvbmUgdGhhdCBkb2Vzbid0IGhhdmUgYW55IGNvbnN0cnVjdG9yLAorLy8gZGVzdHJ1Y3RvciwgdmlydHVhbCBtZW1iZXJzLCBvciBwcml2YXRlIG9uZXMsIGFuZCB0aGF0IGNhbiBiZQorLy8gemVyby1pbml0aWFsaXplZCBhdCBsaW5rIHRpbWUuCisvLworLy8gWW91IGNhbiBhbHNvIHVzZSBMYXp5SW5zdGFuY2U8PiBpbnN0YW5jZXMgYXMgc3RhdGljIGxvY2FsIHZhcmlhYmxlcywKKy8vIGUuZy46CisvLworLy8gICAgIEZvbyogIGdldEZvb1NpbmdsZXRvbigpIHsKKy8vICAgICAgICBzdGF0aWMgTGF6eUluc3RhbmNlPEZvbz4gc0ZvbyA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKy8vICAgICAgICByZXR1cm4gc0Zvby5wdHIoKTsKKy8vICAgICB9CisvLworLy8gVGhpcyBpcyB1c2VmdWwgb24gV2luZG93cyB3aGljaCBkb2Vzbid0IHN1cHBvcnQgdGhyZWFkLXNhZmUgbGF6eQorLy8gaW5pdGlhbGl6YXRpb24gb2Ygc3RhdGljIEMrKyBsb2NhbCB2YXJpYWJsZXMsIG9yIG9uIG90aGVyIHBsYXRmb3JtcworLy8gd2hlbiB0aGUgY29kZSBpcyBjb21waWxlZCB3aXRoIC1mbm8tdGhyZWFkc2FmZS1zdGF0aWNzLgorLy8KKy8vIFRoaXMgY2xhc3MgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBDaHJvbWl1bSdzIGltcGxlbWVudGF0aW9uIG9mIHRoZQorLy8gc2FtZS1uYW1lZCBjbGFzcyAoc2VlICRDSFJPTUlVTS9zcmMvYmFzZS9sYXp5X2luc3RhbmNlLmgpLgorCisvLyBBdG9taWMgc3RhdGUgdmFyaWFibGUgdHlwZS4gVXNlZCB0byBlbnN1cmUgdG8gc3luY2hyb25pemUgY29uY3VycmVudAorLy8gaW5pdGlhbGl6YXRpb24gYW5kIGFjY2VzcyB3aXRob3V0IGluY3VycmluZyB0aGUgZnVsbCBjb3N0IG9mIGEgbXV0ZXgKKy8vIGxvY2svdW5sb2NrLgorc3RydWN0IExhenlJbnN0YW5jZVN0YXRlIHsKKyAgICBlbnVtIHsKKyAgICAgICAgU1RBVEVfSU5JVCA9IDAsCisgICAgICAgIFNUQVRFX0NPTlNUUlVDVElORyA9IDEsCisgICAgICAgIFNUQVRFX0RPTkUgPSAyLAorICAgIH07CisKKyAgICBib29sIGluSW5pdFN0YXRlKCk7CisgICAgYm9vbCBuZWVkQ29uc3RydWN0aW9uKCk7CisgICAgdm9pZCBkb25lQ29uc3RydWN0aW5nKCk7CisKKyNpZmRlZiBfV0lOMzIKKyAgICB0eXBlZGVmIExPTkcgdm9sYXRpbGUgQXRvbWljVHlwZTsKKyNlbHNlCisgICAgdHlwZWRlZiBpbnQgdm9sYXRpbGUgQXRvbWljVHlwZTsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUgQXRvbWljVHlwZSBtU3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKKworLy8gTGF6eUluc3RhbmNlIHRlbXBsYXRlIGRlZmluaXRpb24sIHNlZSBjb21tZW50IGFib3ZlIGZvciB1c2FnZQorLy8gaW5zdHJ1Y3Rpb25zLiBJdCBpcyBjcnVjaWFsIHRvIG1ha2UgdGhpcyBhIFBPRC1zdHJ1Y3QgY29tcGF0aWJsZQorLy8gdHlwZSBbMV0uCisvLworLy8gWzFdIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGxhaW5fT2xkX0RhdGFfU3RydWN0dXJlcworLy8KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IExhenlJbnN0YW5jZSB7CisgICAgYm9vbCBoYXNJbnN0YW5jZSgpIGNvbnN0IHsgcmV0dXJuICFtU3RhdGUuaW5Jbml0U3RhdGUoKTsgfQorCisgICAgY29uc3QgVCYgZ2V0KCkgY29uc3QgeyByZXR1cm4gKnB0cigpOyB9CisgICAgVCYgZ2V0KCkgeyByZXR1cm4gKnB0cigpOyB9CisKKyAgICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gcHRyKCk7IH0KKyAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gcHRyKCk7IH0KKworICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gZ2V0KCk7IH0KKworICAgIFQqIHB0cigpIHsgcmV0dXJuIHB0ckludGVybmFsKCk7IH0KKyAgICBjb25zdCBUKiBwdHIoKSBjb25zdCB7IHJldHVybiBwdHJJbnRlcm5hbCgpOyB9CisKK3ByaXZhdGU6CisgICAgVCogcHRySW50ZXJuYWwoKSBjb25zdDsKKworICAgIHVzaW5nIFN0b3JhZ2VUID0KKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6YWxpZ25lZF9zdG9yYWdlPAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoVCksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YWxpZ25tZW50X29mPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgPjo6dHlwZTsKKworICAgIGFsaWduYXMoZG91YmxlKSBtdXRhYmxlIGludGVybmFsOjpMYXp5SW5zdGFuY2VTdGF0ZSBtU3RhdGU7CisgICAgbXV0YWJsZSBTdG9yYWdlVCBtU3RvcmFnZTsKK307CisKKy8vIEluaXRpYWxpemF0aW9uIHZhbHVlLCBtdXN0IHJlc29sdmUgdG8gYWxsLTAgdG8gZW5zdXJlIHRoZSBvYmplY3QKKy8vIGluc3RhbmNlIGlzIGFjdHVhbGx5IHBsYWNlZCBpbiB0aGUgLmJzcworI2RlZmluZSBMQVpZX0lOU1RBTkNFX0lOSVQgIHsgfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1QqIExhenlJbnN0YW5jZTxUPjo6cHRySW50ZXJuYWwoKSBjb25zdCB7CisgICAgLy8gbWFrZSBzdXJlIHRoYXQgTGF6eUluc3RhbmNlPD4gaW5zdGFudGlhdGlvbiByZW1haW5zIFBPRAorICAgIC8vIE5COiB0aGlzIGNhbid0IGdvIGluIGEgY2xhc3Mgc2NvcGUgLSBvbmUgbmVlZHMgYSB3YXkgb2Ygc3BlY2lmeWluZworICAgIC8vIGN1cnJlbnQgaW5zdGFudGlhdGlvbiB0eXBlIHdpdGhvdXQgZXhwbGljaXRseSBzYXlpbmcgTGF6eUluc3RhbmNlPFQ+CisgICAgLy8gd2hpY2ggaXMgYSByZWN1cnNpdmUgaW5zdGFudGlhdGlvbiBhbmQgZ2l2ZXMgY29tcGlsZXIgZXJyb3IKKyAgICAvLyBkZWNsdHlwZSgqdGhpcykgaXMgYSB3YXkgb2YgZG9pbmcgaXQsIGJ1dCBpdCBvbmx5IHdvcmtzIGluIGEgZnVuY3Rpb24KKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfcG9kPAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmRlY2F5PGRlY2x0eXBlKCp0aGlzKT46OnR5cGUKKyAgICAgICAgICAgICAgICAgID46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkxhenlJbnN0YW5jZTxUPiBpcyBub3QgYSBQT0QgdHlwZSIpOworCisgICAgaWYgKG1TdGF0ZS5uZWVkQ29uc3RydWN0aW9uKCkpIHsKKyAgICAgICAgbmV3ICgmbVN0b3JhZ2UpIFQoKTsKKyAgICAgICAgbVN0YXRlLmRvbmVDb25zdHJ1Y3RpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCZtU3RvcmFnZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJhM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGhyZWFkLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEZvbyB7CitwdWJsaWM6CisgICAgRm9vKCkgOiBtVmFsdWUoNDIpIHt9CisgICAgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1WYWx1ZTsgfQorICAgIHZvaWQgc2V0KGludCB2YWx1ZSkgeyBtVmFsdWUgPSB2YWx1ZTsgfQorICAgIH5Gb28oKSB7IG1WYWx1ZSA9IDEzOyB9Citwcml2YXRlOgorICAgIGludCBtVmFsdWU7Cit9OworCitjbGFzcyBTdGF0aWNDb3VudGVyIHsKK3B1YmxpYzoKKyAgICBTdGF0aWNDb3VudGVyKCkgeworICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbUNvdW50ZXIrKzsKKyAgICB9CisKKyAgICBpbnQgZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbUNvdW50ZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBMb2NrIG1Mb2NrOworICAgIHN0YXRpYyBpbnQgbUNvdW50ZXI7Cit9OworCisvLyBOT1RFOiBUaGlzIGludHJvZHVjZXMgYSBzdGF0aWMgQysrIGNvbnN0cnVjdG9yIGZvciB0aGlzIG9iamVjdCBmaWxlLAorLy8gICAgICAgYnV0IHRoYXQncyBvayBiZWNhdXNlIGEgTGF6eUluc3RhbmNlPExvY2s+IHNob3VsZCBub3QgYmUgdXNlZCB0bworLy8gICAgICAgdGVzdCB0aGUgYmVoYXZpb3VyIG9mIExhenlJbnN0YW5jZSA6LSkKK0xvY2sgU3RhdGljQ291bnRlcjo6bUxvY2s7CitpbnQgU3RhdGljQ291bnRlcjo6bUNvdW50ZXIgPSAwOworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChMYXp5SW5zdGFuY2UsIEhhc0luc3RhbmNlKSB7CisgICAgTGF6eUluc3RhbmNlPEZvbz4gZm9vX2luc3RhbmNlID0gTEFaWV9JTlNUQU5DRV9JTklUOworICAgIEVYUEVDVF9GQUxTRShmb29faW5zdGFuY2UuaGFzSW5zdGFuY2UoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZvb19pbnN0YW5jZS5oYXNJbnN0YW5jZSgpKTsKKyAgICBmb29faW5zdGFuY2UucHRyKCk7CisgICAgRVhQRUNUX1RSVUUoZm9vX2luc3RhbmNlLmhhc0luc3RhbmNlKCkpOworfQorCitURVNUKExhenlJbnN0YW5jZSwgU2ltcGxlKSB7CisgICAgTGF6eUluc3RhbmNlPEZvbz4gZm9vX2luc3RhbmNlID0gTEFaWV9JTlNUQU5DRV9JTklUOworICAgIEZvbyogZm9vMSA9IGZvb19pbnN0YW5jZS5wdHIoKTsKKyAgICBFWFBFQ1RfVFJVRShmb28xKTsKKyAgICBFWFBFQ1RfRVEoNDIsIGZvb19pbnN0YW5jZS0+Z2V0KCkpOworICAgIGZvbzEtPnNldCgxMCk7CisgICAgRVhQRUNUX0VRKDEwLCBmb29faW5zdGFuY2UtPmdldCgpKTsKKyAgICBFWFBFQ1RfRVEoZm9vMSwgZm9vX2luc3RhbmNlLnB0cigpKTsKK30KKworLy8gRm9yIHRoZSBmb2xsb3dpbmcgdGVzdCwgbGF1bmNoIDEwMDAgdGhyZWFkcyB0aGF0IGVhY2ggdHJ5IHRvIGdldAorLy8gdGhlIGluc3RhbmNlIHBvaW50ZXIgb2YgYSBsYXp5IGluc3RhbmNlLiBUaGVuIHZlcmlmeSB0aGF0IHRoZXkncmUgYWxsCisvLyB0aGUgc2FtZSB2YWx1ZS4KKy8vCisvLyBUaGUgbGF6eSBpbnN0YW5jZSBoYXMgYSBzcGVjaWFsIGNvbnN0cnVjdG9yIHRoYXQgd2lsbCBpbmNyZW1lbnQgYQorLy8gZ2xvYmFsIGNvdW50ZXIuIFRoaXMgYWxsb3dzIHVzIHRvIGVuc3VyZSB0aGF0IGl0IGlzIG9ubHkgY2FsbGVkIG9uY2UuCisvLworCituYW1lc3BhY2UgeworCisvLyBUaGUgZm9sbG93aW5nIGlzIHRoZSBzaGFyZWQgc3RydWN0dXJlIGJldHdlZW4gYWxsIHRocmVhZHMuCitzdHJ1Y3QgTXVsdGlTdGF0ZSB7CisgICAgTXVsdGlTdGF0ZShMYXp5SW5zdGFuY2U8U3RhdGljQ291bnRlcj4qIHN0YXRpY0NvdW50ZXIpIDoKKyAgICAgICAgICAgIG1Mb2NrKCksIG1TdGF0aWNDb3VudGVyKHN0YXRpY0NvdW50ZXIpLCBtQ291bnQoMCkge30KKworICAgIGVudW0geworICAgICAgICBrTWF4VGhyZWFkcyA9IDEwMDAsCisgICAgfTsKKworICAgIExvY2sgIG1Mb2NrOworICAgIExhenlJbnN0YW5jZTxTdGF0aWNDb3VudGVyPiogbVN0YXRpY0NvdW50ZXI7CisgICAgc2l6ZV90IG1Db3VudDsKKyAgICB2b2lkKiBtVmFsdWVzW2tNYXhUaHJlYWRzXTsKKyAgICBUZXN0VGhyZWFkKiBtVGhyZWFkc1trTWF4VGhyZWFkc107Cit9OworCisvLyBUaGUgdGhyZWFkIGZ1bmN0aW9uIGZvciB0aGUgdGVzdCBiZWxvdy4KK3N0YXRpYyB2b2lkKiB0aHJlYWRGdW5jKHZvaWQqIHBhcmFtKSB7CisgICAgTXVsdGlTdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxNdWx0aVN0YXRlKj4ocGFyYW0pOworICAgIEF1dG9Mb2NrIGxvY2soc3RhdGUtPm1Mb2NrKTsKKyAgICBpZiAoc3RhdGUtPm1Db3VudCA8IE11bHRpU3RhdGU6OmtNYXhUaHJlYWRzKSB7CisgICAgICAgIHN0YXRlLT5tVmFsdWVzW3N0YXRlLT5tQ291bnQrK10gPSBzdGF0ZS0+bVN0YXRpY0NvdW50ZXItPnB0cigpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoTGF6eUluc3RhbmNlLCBNdWx0aXBsZVRocmVhZHMpIHsKKyAgICBMYXp5SW5zdGFuY2U8U3RhdGljQ291bnRlcj4gY291bnRlcl9pbnN0YW5jZSA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKyAgICBNdWx0aVN0YXRlIHN0YXRlKCZjb3VudGVyX2luc3RhbmNlKTsKKyAgICBjb25zdCBzaXplX3Qga051bVRocmVhZHMgPSBNdWx0aVN0YXRlOjprTWF4VGhyZWFkczsKKworICAgIC8vIENyZWF0ZSBhbGwgdGhyZWFkcy4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgc3RhdGUubVRocmVhZHNbbl0gPSBuZXcgVGVzdFRocmVhZCh0aHJlYWRGdW5jLCAmc3RhdGUpOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIHRoZWlyIGNvbXBsZXRpb24uCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrTnVtVGhyZWFkczsgKytuKSB7CisgICAgICAgIHN0YXRlLm1UaHJlYWRzW25dLT5qb2luKCk7CisgICAgfQorCisgICAgLy8gTm93IGNoZWNrIHRoYXQgdGhlIGNvbnN0cnVjdG9yIHdhcyBvbmx5IGNhbGxlZCBvbmNlLgorICAgIEVYUEVDVF9FUSgxLCBjb3VudGVyX2luc3RhbmNlLT5nZXRWYWx1ZSgpKTsKKworICAgIC8vIE5vdyBjb21wYXJlIGFsbCB0aGUgc3RvcmUgdmFsdWVzLCB0aGV5IHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICBTdGF0aWNDb3VudGVyKiBleHBlY3RlZFZhbHVlID0gY291bnRlcl9pbnN0YW5jZS5wdHIoKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkVmFsdWUsIHN0YXRlLm1WYWx1ZXNbbl0pIDw8ICJGb3IgdGhyZWFkICIgPDwgbjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgZGVsZXRlIHN0YXRlLm1UaHJlYWRzW25dOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvTWFsbG9jVXNhYmxlU2l6ZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2JkNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemUuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKy8vIERlZmluZSBIQVZFX01BTExPQ19VU0FCTEVfU0laRSB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQKKy8vIHN5c3RlbSBoYXMgbWFsbG9jX3VzYWJsZV9zaXplKCkuIFdoaWNoIHRha2VzIHRoZSBhZGRyZXNzIG9mIGEgbWFsbG9jLWVkCisvLyBwb2ludGVyLCBhbmQgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgYmxvY2suCisvLyBUaGlzIGlzIHVzZWZ1bCB0byBvcHRpbWl6ZSBoZWFwIG1lbW9yeSB1c2FnZS4KKworLy8gSW5jbHVkaW5nIGF0IGxlYXN0IG9uZSBDIGxpYnJhcnkgaGVhZGVyIGlzIHJlcXVpcmVkIHRvIGRlZmluZSBzeW1ib2xzCisvLyBsaWtlIF9fR0xJQkNfXy4gQ2hvb3NlIGNhcmVmdWxseSBiZWNhdXNlIHNvbWUgaGVhZGVycyBsaWtlIDxzdGRkZWYuaD4KKy8vIGFyZSBhY3R1YWxseSBwcm92aWRlZCBieSB0aGUgY29tcGlsZXIsIG5vdCB0aGUgQyBsaWJyYXJ5IGFuZCBkbyBub3QKKy8vIGRlZmluZSB0aGUgbWFjcm9zIHdlIG5lZWQuCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgZGVmaW5lIFVTRV9NQUxMT0NfVVNBQkxFX1NJWkUgIDEKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorIyAgaW5jbHVkZSA8bWFsbG9jL21hbGxvYy5oPgorIyAgZGVmaW5lIG1hbGxvY191c2FibGVfc2l6ZSAgbWFsbG9jX3NpemUKKyMgIGRlZmluZSBVU0VfTUFMTE9DX1VTQUJMRV9TSVpFICAxCisjZWxzZQorIyAgZGVmaW5lIFVTRV9NQUxMT0NfVVNBQkxFX1NJWkUgIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjk2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvTWFsbG9jVXNhYmxlU2l6ZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L01hbGxvY1VzYWJsZVNpemUuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisjaWYgVVNFX01BTExPQ19VU0FCTEVfU0laRQorCitzdGF0aWMgc2l6ZV90IGNvbXB1dGVTaXplKHNpemVfdCBpbmRleCkgeworICAgIHJldHVybiAzICsgaW5kZXggKiAxNzsKK30KKworVEVTVChNYWxsb2NVc2FibGVTaXplLCBVc2VNYWxsb2NVc2FibGVTaXplKSB7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMDA7CisgICAgdm9pZCogYmxvY2tzW2tDb3VudF07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBibG9ja3Nbbl0gPSA6Om1hbGxvYyhjb21wdXRlU2l6ZShuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJsb2Nrc1tuXSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IGNvbXB1dGVTaXplKG4pOworICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgOjptYWxsb2NfdXNhYmxlX3NpemUoYmxvY2tzW25dKSkKKyAgICAgICAgICAgICAgICA8PCAiRm9yIGJsb2NrICIgPDwgbiA8PCAiIG9mICIgPDwgc2l6ZSA8PCAiIGJ5dGVzIjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBuID0ga0NvdW50OyBuID4gMDsgLS1uKSB7CisgICAgICAgIDo6ZnJlZShibG9ja3NbbiAtIDFVXSk7CisgICAgfQorfQorCisjZWxzZSAgLy8gIVVTRV9NQUxMT0NfVVNBQkxFX1NJWkUKKworVEVTVChNYWxsb2NVc2FibGVTaXplLCBEb05vdFVzZU1hbGxvY1VzYWJsZVNpemUpIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBFWFBFQ1RfVFJVRShmYWxzZSkgPDwgIkxpbnV4IHNob3VsZCBoYXZlIG1hbGxvY191c2FibGVfc2l6ZSI7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICBFWFBFQ1RfVFJVRShmYWxzZSkgPDwgIkRhcndpbiBzaG91bGQgaGF2ZSBtYWxsb2Nfc2l6ZSI7CisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorICAgIEVYUEVDVF9UUlVFKGZhbHNlKSA8PCAiRnJlZUJTRCBzaG91bGQgaGF2ZSBtYWxsb2Nfc2l6ZSI7CisjZW5kaWYKK30KKworI2VuZGlmICAvLyAhVVNFX01BTExPQ19VU0FCTEVfU0laRQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9RU29ydC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1FTb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxNzMyNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9RU29ydC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFRlbXBsYXRlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IHF1aWNrLXNvcnQgZm9yIGFycmF5cyBvZiB0eXBlIHxUfC4KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gICAgMSkgRGVmaW5lIGEgVFJBSVRTIHN0cnVjdHVyZSB0eXBlIHRoYXQgaW1wbGVtZW50cyB0d28gbWV0aG9kcworLy8gICAgICAgYXMgZm9sbG93czoKKy8vCisvLyAgICAgICAgICAgLy8gQ29tcGFyZSB0d28gaXRlbXMgfGF8IGFuZCB8YnwgYW5kIHJldHVybiAtMSwgMCBvciArMQorLy8gICAgICAgICAgIHN0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUKiBhLCBjb25zdCBUKiBiKTsKKy8vCisvLyAgICAgICAgICAgLy8gU3dhcCBpdGVtcyB8YXwgYW5kIHxifCBpbi1wbGFjZS4KKy8vICAgICAgICAgICBzdGF0aWMgdm9pZCBzd2FwKFQqIGEsIFQqIGIpOworLy8KKy8vICAgIDIpIENhbGwgOjphbmRyb2lkOjpiYXNlOjpRU29ydDxGb28sIEZvb1RyYWl0cz46OnNvcnQoKQorLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRSQUlUUz4KK2NsYXNzIFFTb3J0IHsKK3B1YmxpYzoKKyAgICAvLyBTb3J0IGFuIGFycmF5IG9mIHxufCBpdGVtcyBvZiB0eXBlIHxUfCBzdGFydGluZyBhdCB8YmFzZXwuCisgICAgLy8gVXNpbmcgdGhlIGNvbXBhcmlzb24gYW5kIHN3YXAgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHxUUkFJVFN8LgorICAgIHN0YXRpYyB2b2lkIHNvcnQoVCogYmFzZSwgc2l6ZV90IG4pIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgVCogcG07CisgICAgICAgICAgICBpZiAobiA8IDcpIHsKKyAgICAgICAgICAgICAgICBpbnNlcnRpb25Tb3J0KGJhc2UsIG4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBtID0gYmFzZSArIChuIC8gMik7CisgICAgICAgICAgICBpZiAobiA+IDcpIHsKKyAgICAgICAgICAgICAgICBUKiBwbCA9IGJhc2U7CisgICAgICAgICAgICAgICAgVCogcG4gPSBiYXNlICsgKG4gLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDQwKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkID0gKG4gLyA4KTsKKyAgICAgICAgICAgICAgICAgICAgcGwgPSBtZWQzKHBsLCBwbCArIGQsIHBsICsgMiAqIGQpOworICAgICAgICAgICAgICAgICAgICBwbSA9IG1lZDMocG0gLSBkLCBwbSwgcG0gKyBkKTsKKyAgICAgICAgICAgICAgICAgICAgcG4gPSBtZWQzKHBuIC0gMiAqIGQsIHBuIC0gZCwgcG4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbSA9IG1lZDMocGwsIHBtLCBwbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUUkFJVFM6OnN3YXAoYmFzZSwgcG0pOworICAgICAgICAgICAgVCogcGEgPSBiYXNlICsgMTsKKyAgICAgICAgICAgIFQqIHBiID0gcGE7CisKKyAgICAgICAgICAgIFQqIHBjID0gYmFzZSArIChuIC0gMSk7CisgICAgICAgICAgICBUKiBwZCA9IHBjOworCisgICAgICAgICAgICBpbnQgc3dhcF9jbnQgPSAwOworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIGludCByOworICAgICAgICAgICAgICAgIHdoaWxlIChwYiA8PSBwYyAmJiAociA9IFRSQUlUUzo6Y29tcGFyZShwYiwgYmFzZSkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9jbnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTOjpzd2FwKHBhLCBwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBwYSArPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBiICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChwYiA8PSBwYyAmJiAociA9IFRSQUlUUzo6Y29tcGFyZShwYywgYmFzZSkpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9jbnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgVFJBSVRTOjpzd2FwKHBjLCBwZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwZCAtPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBjIC09IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYiA+IHBjKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUUkFJVFM6OnN3YXAocGIsIHBjKTsKKyAgICAgICAgICAgICAgICBzd2FwX2NudCA9IDE7CisgICAgICAgICAgICAgICAgcGIgKz0gMTsKKyAgICAgICAgICAgICAgICBwYyAtPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN3YXBfY250ID09IDApIHsgIC8qIFN3aXRjaCB0byBpbnNlcnRpb24gc29ydCAqLworICAgICAgICAgICAgICAgIGluc2VydGlvblNvcnQoYmFzZSwgbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUKiBwbiA9IGJhc2UgKyBuOworICAgICAgICAgICAgaW50IHIgPSBzdGQ6Om1pbihwYSAtIGJhc2UsIHBiIC0gcGEpOworICAgICAgICAgICAgdmVjc3dhcChiYXNlLCBwYiAtIHIsIHIpOworICAgICAgICAgICAgciA9IHN0ZDo6bWluKHBkIC0gcGMsIHBuIC0gcGQgLSAxKTsKKyAgICAgICAgICAgIHZlY3N3YXAocGIsIHBuIC0gciwgcik7CisgICAgICAgICAgICBpZiAoKHIgPSBwYiAtIHBhKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc29ydChiYXNlLCByKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgociA9IHBkIC0gcGMpID4gMSkgeworICAgICAgICAgICAgICAgIC8qIEl0ZXJhdGUgcmF0aGVyIHRoYW4gcmVjdXJzZSB0byBzYXZlIHN0YWNrIHNwYWNlICovCisgICAgICAgICAgICAgICAgYmFzZSA9IHBuIC0gcjsKKyAgICAgICAgICAgICAgICBuID0gcjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBwZXJmb3JtIGluc2VydGlvbiBzb3J0LgorICAgIHN0YXRpYyB2b2lkIGluc2VydGlvblNvcnQoVCogYmFzZSwgc2l6ZV90IG4pIHsKKyAgICAgICAgZm9yIChUKiBwbSA9IGJhc2UgKyAxOyBwbSA8IGJhc2UgKyBuOyBwbSsrKSB7CisgICAgICAgICAgICBUKiBwbCA9IHBtOworICAgICAgICAgICAgd2hpbGUgKHBsID4gYmFzZSAmJiBUUkFJVFM6OmNvbXBhcmUocGwgLSAxLCBwbCkgPiAwKSB7CisgICAgICAgICAgICAgICAgVFJBSVRTOjpzd2FwKHBsLCBwbCAtIDEpOworICAgICAgICAgICAgICAgIHBsIC09IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2VkIGludGVybmFsbHkgdG8gcmV0dXJuIHRoZSBtZWRpYW4gb2YgdGhyZWUgaXRlbXMgfGF8LCB8YnwgYW5kIHxjfC4KKyAgICBzdGF0aWMgVCogbWVkMyhUKiBhLCBUKiBiLCBUKiBjKSB7CisgICAgICAgIHJldHVybiBUUkFJVFM6OmNvbXBhcmUoYSwgYikgPCAwCisgICAgICAgICAgICAgICAgPyAoVFJBSVRTOjpjb21wYXJlKGIsIGMpIDwgMAorICAgICAgICAgICAgICAgICAgICA/IGIgOiAoVFJBSVRTOjpjb21wYXJlKGEsIGMpIDwgMCA/IGMgOiBhKSkKKyAgICAgICAgICAgICAgIDogKFRSQUlUUzo6Y29tcGFyZShiLCBjKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgPyBiIDogKFRSQUlUUzo6Y29tcGFyZShhLCBjKSA8IDAgPyBhIDogYykpOworICAgIH0KKworICAgIC8vIFVzZWQgaW50ZXJuYWxseSB0byBzd2FwIHxufCBpdGVtcyBmcm9tIHNsaWNlcyBzdGFydGluZyBhdCB8cGl8IGFuZCB8cGp8CisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIHN0YXRpYyB2b2lkIHZlY3N3YXAoVCogcGksIFQqIHBqLCBzaXplX3QgbikgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgVFJBSVRTOjpzd2FwKHBpICsgaSwgcGogKyBpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1FTb3J0X3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9RU29ydF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk0MmE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21lbW9yeS9RU29ydF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvUVNvcnQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBBUlJBWUxFTih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworc3RydWN0IEJ5dGVRU29ydFRyYWl0cyB7CisgICAgc3RhdGljIGludCBjb21wYXJlKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgICAgICAgcmV0dXJuICphIC0gKmI7CisgICAgfQorICAgIHN0YXRpYyB2b2lkIHN3YXAodWludDhfdCogYSwgdWludDhfdCogYikgeworICAgICAgICB1aW50OF90IHRtcCA9ICphOworICAgICAgICAqYSA9ICpiOworICAgICAgICAqYiA9IHRtcDsKKyAgICB9Cit9OworCitzdHJ1Y3QgSW50MzJSZXZlcnNlUVNvcnRUcmFpdHMgeworICAgIHN0YXRpYyBpbnQgY29tcGFyZShjb25zdCBpbnQzMl90KiBhLCBjb25zdCBpbnQzMl90KiBiKSB7CisgICAgICAgIHJldHVybiAoaW50KSgqYiAtICphKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgc3dhcChpbnQzMl90KiBhLCBpbnQzMl90KiBiKSB7CisgICAgICAgIGludDMyX3QgdG1wID0gKmE7CisgICAgICAgICphID0gKmI7CisgICAgICAgICpiID0gdG1wOworICAgIH0KK307CisKK2NsYXNzIEZvbyB7CitwdWJsaWM6CisgICAgRm9vKCkgOiBtWCgwKSB7fQorICAgIEZvbyhpbnQgeCkgOiBtWCh4KSB7fQorICAgIHZvaWQgc2V0KGludCB4KSB7IG1YID0geDsgfQorICAgIGludCB4KCkgY29uc3QgeyByZXR1cm4gbVg7IH0KKworICAgIHZvaWQgc3dhcChGb28qIG90aGVyKSB7CisgICAgICAgIGludCB0bXAgPSBtWDsKKyAgICAgICAgbVggPSBvdGhlci0+bVg7CisgICAgICAgIG90aGVyLT5tWCA9IHRtcDsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAgICAgc3RhdGljIGludCBjb21wYXJlKGNvbnN0IEZvbyogYSwgY29uc3QgRm9vKiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYi0+eCgpIC0gYS0+eCgpOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyB2b2lkIHN3YXAoRm9vKiBhLCBGb28qIGIpIHsKKyAgICAgICAgICAgIGEtPnN3YXAoYik7CisgICAgICAgIH0KKyAgICB9OworcHJpdmF0ZToKKyAgICBpbnQgbVg7Cit9OworCitURVNUKFFTb3J0LCBTb3J0Qnl0ZXMpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRbMTBdID0geworICAgICAgICAwLCAxLCAyLCA0LCA4LCAxMCwgNDAsIDEyOCwgMTkyLCAyNTUsCisgICAgfTsKKyAgICB1aW50OF90IHRhYlsxMF0gPSB7CisgICAgICAgIDgsIDQwLCAxLCAxOTIsIDEyOCwgMTAsIDI1NSwgMiwgMCwgNCwKKyAgICB9OworICAgIFFTb3J0PHVpbnQ4X3QsIEJ5dGVRU29ydFRyYWl0cz46OnNvcnQodGFiLCBBUlJBWUxFTih0YWIpKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZTEVOKHRhYik7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCB0YWJbbl0pIDw8IG47CisgICAgfQorfQorCitURVNUKFFTb3J0LCBTb3J0SW50ZWdlcnNSZXZlcnNlZCkgeworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtFeHBlY3RlZFsxMF0gPSB7CisgICAgfTsKKyAgICBpbnQzMl90IHRhYlsxMF0gPSB7CisgICAgfTsKKyAgICBRU29ydDxpbnQzMl90LCBJbnQzMlJldmVyc2VRU29ydFRyYWl0cz46OnNvcnQodGFiLCBBUlJBWUxFTih0YWIpKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZTEVOKHRhYik7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCB0YWJbbl0pIDw8IG47CisgICAgfQorfQorCitURVNUKFFTb3J0LCBTb3J0Rm9vT2JqZWN0cykgeworICAgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkWzExXSA9IHsgMTAsIDgsIDYsIDQsIDIsIDAsIC0yLCAtNCwgLTYsIC04LCAtMTAgfTsKKyAgICBGb28gZm9vc1sxMV0gPSB7IC0xMCwgLTgsIC02LCA0LCAyLCAwLCAtMiwgLTQsIDYsIDgsIDEwIH07CisgICAgUVNvcnQ8Rm9vLCBGb286OlRyYWl0cz46OnNvcnQoZm9vcywgQVJSQVlMRU4oZm9vcykpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlMRU4oZm9vcyk7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkW25dLCBmb29zW25dLngoKSkgPDwgbjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmUzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgKQEAgLTAsMCArMSw5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1R5cGVUcmFpdHMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworc3RydWN0IEZyZWVEZWxldGUgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHZvaWQgb3BlcmF0b3IoKShUIHB0cikgY29uc3QgeworICAgICAgICBmcmVlKCh2b2lkKilwdHIpOworICAgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBGdW5jPgorc3RydWN0IEZ1bmNEZWxldGUgeworICAgIGV4cGxpY2l0IEZ1bmNEZWxldGUoRnVuYyBmID0ge30pIDogbUYoZikge30KKworICAgIEZ1bmNEZWxldGUoY29uc3QgRnVuY0RlbGV0ZSYgb3RoZXIpID0gZGVmYXVsdDsKKyAgICBGdW5jRGVsZXRlKEZ1bmNEZWxldGUmJiBvdGhlcikgPSBkZWZhdWx0OworICAgIEZ1bmNEZWxldGUmIG9wZXJhdG9yPShjb25zdCBGdW5jRGVsZXRlJiBvdGhlcikgPSBkZWZhdWx0OworICAgIEZ1bmNEZWxldGUmIG9wZXJhdG9yPShGdW5jRGVsZXRlJiYgb3RoZXIpID0gZGVmYXVsdDsKKworICAgIC8vIFRvIGJlIGFibGUgdG8gY29weS9tb3ZlIGZyb20gYWxsIGNvbXBhdGlibGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMuCisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IGZyaWVuZCBzdHJ1Y3QgRnVuY0RlbGV0ZTsKKworICAgIC8vIFRlbXBsYXRlIGNvbnN0cnVjdG9ycyBhbmQgbW92ZSBhc3NpZ25tZW50IGZyb20gY29tcGF0aWJsZSBpbnN0YW50aWF0aW9ucy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgICBGdW5jRGVsZXRlKGNvbnN0IEZ1bmNEZWxldGU8VT4mIG90aGVyKSA6IG1GKG90aGVyLm1GKSB7fQorICAgIHRlbXBsYXRlIDxjbGFzcyBVPgorICAgIEZ1bmNEZWxldGUoRnVuY0RlbGV0ZTxVPiYmIG90aGVyKSA6IG1GKHN0ZDo6bW92ZShvdGhlci5tRikpIHt9CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+CisgICAgRnVuY0RlbGV0ZSYgb3BlcmF0b3I9KGNvbnN0IEZ1bmNEZWxldGU8VT4mIG90aGVyKSB7CisgICAgICAgIG1GID0gb3RoZXIubUY7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+CisgICAgRnVuY0RlbGV0ZSYgb3BlcmF0b3I9KEZ1bmNEZWxldGU8VT4mJiBvdGhlcikgeworICAgICAgICBtRiA9IHN0ZDo6bW92ZShvdGhlci5tRik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHRoZSBhY3R1YWwgZGVsZXRlciBjYWxsLgorICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHZvaWQgb3BlcmF0b3IoKShUIHQpIGNvbnN0IHsKKyAgICAgICAgbUYodCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEZ1bmMgbUY7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8VD4+Cit1c2luZyBTY29wZWRQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRGVsZXRlcj47CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgU2NvcGVkQ1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBGcmVlRGVsZXRlPjsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEZ1bmM+Cit1c2luZyBTY29wZWRDdXN0b21QdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgRnVuY0RlbGV0ZTxGdW5jPj47CisKKy8vIEEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBzY29wZWQgcG9pbnRlciB3aXRoIHxkZWxldGVyfAorLy8gZnVuY3Rpb24gdXNlZCBhcyBhIGRlbGV0ZXIgLSBpdCBpcyBjYWxsZWQgYXQgdGhlIHNjb3BlIGV4aXQuCisvLyBOb3RlOiBlbmFibGVfaWY8PiBsaW1pdHMgdGhlIHNjb3BlIG9mIGFsbG93ZWQgYXJndW1lbnRzIHRvIHBvaW50ZXJzIGFuZAorLy8gIHN0ZDo6bnVsbHB0cl90ICh0byBhbGxvdyBtYWtlQ3VzdG9tU2NvcGVkUHRyKG51bGxwdHIsIC4uLikgY2FsbHMpLgordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgRnVuYywKKyAgICAgICAgICBjbGFzcyA9IGVuYWJsZV9pZl9jPHN0ZDo6aXNfc2FtZTxULCBzdGQ6Om51bGxwdHJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlPj4KK1Njb3BlZEN1c3RvbVB0cjwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpkZWNheTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPFQ+Ojp0eXBlPjo6dHlwZSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpkZWNheTxGdW5jPjo6dHlwZT4KK21ha2VDdXN0b21TY29wZWRQdHIoVCBkYXRhLCBGdW5jIGRlbGV0ZXIpIHsKKyAgICByZXR1cm4gU2NvcGVkQ3VzdG9tUHRyPAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpkZWNheTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9wb2ludGVyPFQ+Ojp0eXBlPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8RnVuYz46OnR5cGU+KAorICAgICAgICAgICAgZGF0YSwgRnVuY0RlbGV0ZTx0eXBlbmFtZSBzdGQ6OmRlY2F5PEZ1bmM+Ojp0eXBlPihkZWxldGVyKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0cl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTczYzZmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0cl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RFU1QoU2NvcGVkUHRyLCBGdW5jRGVsZXRlX2NvbnZlcnNpb25zKSB7CisgICAgLy8gVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhlIGNvZGUgY29tcGlsZXMsIGl0IGRvZXNuJ3QgZG8gYW55IHJ1bnRpbWUgY2hlY2tzLgorICAgIGF1dG8gbGFtYmRhID0gW10oaW50IGkpIHsgcmV0dXJuIGk7IH07CisgICAgRnVuY0RlbGV0ZTxkZWNsdHlwZShsYW1iZGEpPiBsYW1iZGFGZChsYW1iZGEpOworICAgIC8vIHVuYXJ5ICsgY29udmVydHMgYSBjYXB0dXJlbGVzcyBsYW1iZGEgaW50byBhIHJhdyBmdW5jdGlvbiBwb2ludGVyCisgICAgRnVuY0RlbGV0ZTxkZWNsdHlwZSgrbGFtYmRhKT4gZnVuY0ZkMSgrbGFtYmRhKTsKKworICAgIC8vIGNvcHkgY3RvcgorICAgIEZ1bmNEZWxldGU8ZGVjbHR5cGUoK2xhbWJkYSk+IGZ1bmNGZDIoZnVuY0ZkMSk7CisgICAgLy8gYXNzaWdubWVudCBvcGVyYXRvcgorICAgIGZ1bmNGZDIgPSBmdW5jRmQxOworICAgIC8vIG1vdmUgb3BlcmF0b3IKKyAgICBmdW5jRmQyID0gc3RkOjptb3ZlKGZ1bmNGZDEpOworCisgICAgLy8gY29udmVyc2lvbiBjdG9yCisgICAgRnVuY0RlbGV0ZTxkZWNsdHlwZSgrbGFtYmRhKT4gZnVuY0ZkMyhsYW1iZGFGZCk7CisgICAgLy8gY29udmVyc2lvbiBtb3ZlIGN0b3IKKyAgICBGdW5jRGVsZXRlPGRlY2x0eXBlKCtsYW1iZGEpPiBmdW5jRmQ0KHN0ZDo6bW92ZShsYW1iZGFGZCkpOworICAgIC8vIGNvbnZlcnNpb24gYXNzaWdubWVudAorICAgIGZ1bmNGZDMgPSBsYW1iZGFGZDsKKyAgICAvLyBjb252ZXJzaW9uIG1vdmUKKyAgICBmdW5jRmQzID0gc3RkOjptb3ZlKGxhbWJkYUZkKTsKK30KKworVEVTVChTY29wZWRQdHIsIG1ha2VDdXN0b21TY29wZWRQdHJfZnJvbUxhbWJkYSkgeworICAgIGF1dG8gZnJlZUFzTGFtYmRhID0gW10odm9pZCogcHRyKSB7IGZyZWUocHRyKTsgfTsKKworICAgIGF1dG8gcHRyMSA9IG1ha2VDdXN0b21TY29wZWRQdHIobWFsbG9jKDEpLCBmcmVlQXNMYW1iZGEpOworCisgICAgU2NvcGVkUHRyPHZvaWQsIEZ1bmNEZWxldGU8dm9pZCgqKSh2b2lkKik+PiBwdHIyID0KKyAgICAgICAgICAgIG1ha2VDdXN0b21TY29wZWRQdHIobWFsbG9jKDEpLCBmcmVlQXNMYW1iZGEpOworCisgICAgU2NvcGVkUHRyPHZvaWQsIEZ1bmNEZWxldGU8dm9pZCgqKSh2b2lkKik+PiBwdHIzID0KKyAgICAgICAgICAgIG1ha2VDdXN0b21TY29wZWRQdHIobWFsbG9jKDEpLCArZnJlZUFzTGFtYmRhKTsKKworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfc2FtZTxkZWNsdHlwZShwdHIxKSwgZGVjbHR5cGUocHRyMik+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDdXN0b20gU2NvcGVkUHRyPD4gZnJvbSBhIGxhbWJkYSBleHByZXNzaW9uIHR5cGUgbWF5IG5vdCAiCisgICAgICAgICAgICAgICAgICAiYmUgdGhlIHNhbWUgYXMgd2l0aCBhIGZ1bmN0aW9uIHBvaW50ZXIiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0ZpbGVVdGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0ZpbGVVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmMTQyNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvRmlsZVV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCByZWFkRmlsZUludG9TdHJpbmcoaW50IGZkLCBzdGQ6OnN0cmluZyogZmlsZV9jb250ZW50cykgeworICAgIG9mZl90IHNpemUgPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpOworICAgIGlmIChzaXplID09IChvZmZfdCktMSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG9mZl90IGVyciA9IGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisgICAgaWYgKGVyciA9PSAob2ZmX3QpLTEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZihzaXplKTsKKyAgICBzc2l6ZV90IHJlc3VsdCA9IEhBTkRMRV9FSU5UUihyZWFkKGZkLCAmYnVmWzBdLCBzaXplKSk7CisgICAgaWYgKHJlc3VsdCAhPSBzaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmlsZV9jb250ZW50cy0+YXNzaWduKCZidWZbMF0sIHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgd3JpdGVTdHJpbmdUb0ZpbGUoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9jb250ZW50cykgeworICAgIHNzaXplX3QgcmVzdWx0ID0gSEFORExFX0VJTlRSKAorICAgICAgICAgICAgd3JpdGUoZmQsIGZpbGVfY29udGVudHMuY19zdHIoKSwgZmlsZV9jb250ZW50cy5zaXplKCkpKTsKKyAgICBpZiAocmVzdWx0ICE9IChzc2l6ZV90KWZpbGVfY29udGVudHMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0ZpbGVVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE2MTdmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHMuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFJlYWRzIGZyb20gfGZkfCBpbnRvIHxmaWxlX2NvbnRlbnRzfAorLy8gUmV0dXJucyBmYWxzZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZworYm9vbCByZWFkRmlsZUludG9TdHJpbmcoaW50IGZkLCBzdGQ6OnN0cmluZyogZmlsZV9jb250ZW50cyk7CisKKy8vIFdyaXRlcyB8ZmlsZV9jb250ZW50c3wgdG8gfGZkfAorLy8gUmV0dXJucyBmYWxzZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZworYm9vbCB3cml0ZVN0cmluZ1RvRmlsZShpbnQgZmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlX2NvbnRlbnRzKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvRmlsZVV0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvRmlsZVV0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVlZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL0ZpbGVVdGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkRmQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVEVTVChGaWxlVXRpbHMsIHN0cmluZ1RvRmlsZSkgeworICAgIGNvbnN0IGNoYXIgdGVzdF9wYXR0ZXJuW10gPSAidGVzdCBwYXR0ZXJuIjsKKyAgICBUZW1wRmlsZSogdGYgPSB0ZW1wZmlsZV9jcmVhdGUoKTsKKworICAgIFNjb3BlZEZkIGZkKEhBTkRMRV9FSU5UUihvcGVuKHRlbXBmaWxlX3BhdGgodGYpLCBPX1JEV1IsIDA2MDApKSk7CisgICAgRVhQRUNUX05FKC0xLCBmZC5nZXQoKSk7CisKKyAgICBFWFBFQ1RfRkFMU0Uod3JpdGVTdHJpbmdUb0ZpbGUoLTEsIHRlc3RfcGF0dGVybikpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlU3RyaW5nVG9GaWxlKGZkLmdldCgpLCB0ZXN0X3BhdHRlcm4pKTsKKworICAgIHN0ZDo6c3RyaW5nIGR1bW15X2J1ZmZlcigiZHVtbXkiKTsKKyAgICBFWFBFQ1RfRkFMU0UocmVhZEZpbGVJbnRvU3RyaW5nKC0xLCAmZHVtbXlfYnVmZmVyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJkdW1teSIsIGR1bW15X2J1ZmZlci5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHJlYWRfYnVmZmVyOworICAgIEVYUEVDVF9UUlVFKHJlYWRGaWxlSW50b1N0cmluZyhmZC5nZXQoKSwgJnJlYWRfYnVmZmVyKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RfcGF0dGVybiwgcmVhZF9idWZmZXIuY19zdHIoKSk7CisKKyAgICBmZC5jbG9zZSgpOworCisgICAgdGVtcGZpbGVfY2xvc2UodGYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9IdHRwVXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9IdHRwVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0h0dHBVdGlscy5jcHAKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9IdHRwVXRpbHMuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgQVJSQVlMRU4oeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCitib29sIGlzSHR0cFNwYWNlKGludCBjaCkgeworICAgIC8vIFNlZSBTZWN0aW9uIDIuMiBvZiBSRkMgMjYxNiwgaW4gcGFydGljdWxhciB0aGlzIHNlY3Rpb246CisgICAgLy8KKyAgICAvLyAgICBBbGwgbGluZWFyIHdoaXRlIHNwYWNlLCBpbmNsdWRpbmcgZm9sZGluZywgaGFzIHRoZSBzYW1lCisgICAgLy8gICAgc2VtYW50aWNzIGFzIFNQLiBBIHJlY2lwaWVudCBNQVkgcmVwbGFjZSBhbnkgbGluZWFyIHdoaXRlIHNwYWNlCisgICAgLy8gICAgd2l0aCBhIHNpbmdsZSBTUCBiZWZvcmUgaW50ZXJwcmV0aW5nIHRoZSBmaWVsZCB2YWx1ZSBvcgorICAgIC8vICAgIGZvcndhcmRpbmcgdGhlIG1lc3NhZ2UgZG93bnN0cmVhbS4KKyAgICAvLworICAgIHJldHVybiAoY2ggPT0gOSB8fCBjaCA9PSAzMik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIGh0dHBJc1JlcXVlc3RMaW5lKGNvbnN0IGNoYXIqIGxpbmUsIHNpemVfdCBsaW5lTGVuKSB7CisgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgdGhlIGxpbmUgYmVnaW5zIHdpdGggYW4gSFRUUCBtZXRob2QKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0h0dHBNZXRob2RzW10gPSB7CisgICAgICAgICJHRVQiLAorICAgICAgICAiSEVBRCIsCisgICAgICAgICJQT1NUIiwKKyAgICAgICAgIlBVVCIsCisgICAgICAgICJERUxFVEUiLAorICAgICAgICAiVFJBQ0UiLAorICAgICAgICAiQ09OTkVDVCIsCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0h0dHBNZXRob2RzU2l6ZSA9IEFSUkFZTEVOKGtIdHRwTWV0aG9kcyk7CisKKyAgICBib29sIG1ldGhvZE1hdGNoID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtIdHRwTWV0aG9kc1NpemU7ICsrbikgeworICAgICAgICBjb25zdCBjaGFyKiBtZXRob2QgPSBrSHR0cE1ldGhvZHNbbl07CisgICAgICAgIHNpemVfdCBtZXRob2RMZW4gPSBzdHJsZW4obWV0aG9kKTsKKworICAgICAgICBpZiAobGluZUxlbiA8IG1ldGhvZExlbiB8fCBtZW1jbXAobWV0aG9kLCBsaW5lLCBtZXRob2RMZW4pKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNIdHRwU3BhY2UobGluZVttZXRob2RMZW5dKSkgeworICAgICAgICAgICAgbWV0aG9kTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1ldGhvZE1hdGNoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBOb3cgY2hlY2sgdGhhdCB0aGUgbGluZSBlbmRzIHdpdGggSFRUUC88dmVyc2lvbj4KKworICAgIC8vIEdldCByaWQgb2YgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKyAgICBjb25zdCBjaGFyKiBlbmQgPSBsaW5lICsgbGluZUxlbjsKKyAgICB3aGlsZSAoZW5kID4gbGluZSAmJiBpc0h0dHBTcGFjZShlbmRbLTFdKSkgeworICAgICAgICBlbmQtLTsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IEhUVFAgdmVyc2lvbiBmaWVsZC4KKyAgICBjb25zdCBjaGFyKiB2ZXJzaW9uID0gZW5kOworICAgIHdoaWxlICh2ZXJzaW9uID4gbGluZSAmJiAhaXNIdHRwU3BhY2UodmVyc2lvblstMV0pKSB7CisgICAgICAgIHZlcnNpb24tLTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVmVyc2lvbltdID0gIkhUVFAvIjsKKyAgICBjb25zdCBzaXplX3Qga1ZlcnNpb25MZW4gPSBzaXplb2Yoa1ZlcnNpb24pIC0gMVU7CisgICAgaWYgKHZlcnNpb24gPT0gbGluZSB8fCAoc2l6ZV90KShlbmQgLSB2ZXJzaW9uKSA8PSBrVmVyc2lvbkxlbiB8fAorICAgICAgICBtZW1jbXAodmVyc2lvbiwga1ZlcnNpb24sIGtWZXJzaW9uTGVuKSAhPSAwKSB7CisgICAgICAgIC8vIE5vIEhUVFAgdmVyc2lvbiBmaWVsZC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIERvbid0IGNoZWNrIHRoZSB2ZXJzaW9uIGZpZWxkLCB0aGlzIGxvb2sgZ29vZCBlbm91Z2guCisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9IdHRwVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvSHR0cFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljODJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvSHR0cFV0aWxzLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gUmV0dXJuIHRydWUgaWZmIHRoZSBjb250ZW50IG9mIHxsaW5lfCwgb3IgfGxpbmVMZW58IGNoYXJhY3RlcnMsCisvLyBtYXRjaGVzIGFuIEhUVFAgcmVxdWVzdCBkZWZpbml0aW9uLiBTZWUgc2VjdGlvbiA1LjEgb3IgUkZDIDI2MTYuCitib29sIGh0dHBJc1JlcXVlc3RMaW5lKGNvbnN0IGNoYXIqIGxpbmUsIHNpemVfdCBsaW5lTGVuKTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0h0dHBVdGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL0h0dHBVdGlsc191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhYThjOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvSHR0cFV0aWxzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL0h0dHBVdGlscy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RFU1QoSHR0cFV0aWxzLCBodHRwSXNSZXF1ZXN0TGluZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBjb25zdCBjaGFyKiBsaW5lOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyB0cnVlLCAiR0VUIC9pbmRleC5odG1sIEhUVFAvMS4wXHJcbiIgfSwKKyAgICAgICAgeyBmYWxzZSwgIkdFVCBUSEUgR1JJTkdPISIgfSwKKyAgICAgICAgeyB0cnVlLCAiUE9TVCAvc29tZXRoaW5nIEhUVFAvMy4xNDE1OTI2NTM1OSIgfSwKKyAgICAgICAgeyBmYWxzZSwgIlBPU1RBTCBIVFRQLzEuMVxyXG4iIH0sCisgICAgICAgIHsgZmFsc2UsICJPUFRJT05TIGh0dHAvMS4wXHJcbiIgfSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YVNpemUgPSBzaXplb2Yoa0RhdGEpL3NpemVvZihrRGF0YVswXSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgIGh0dHBJc1JlcXVlc3RMaW5lKAorICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFbbl0ubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrRGF0YVtuXS5saW5lKSkpIDw8IGtEYXRhW25dLmxpbmU7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhMTA3YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9XSU4zMgorY29uc3Qgdm9pZCogbWVtbWVtKGNvbnN0IHZvaWQqIGhheXN0YWNrLCBzaXplX3QgaGF5c3RhY2tMZW4sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbmVlZGxlLCBzaXplX3QgbmVlZGxlTGVuKSB7CisgICAgaWYgKCFoYXlzdGFjayB8fCAhbmVlZGxlKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gaXQgPSBzdGQ6OnNlYXJjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihoYXlzdGFjayksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oaGF5c3RhY2spICsgaGF5c3RhY2tMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4obmVlZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihuZWVkbGUpICsgbmVlZGxlTGVuKTsKKyAgICByZXR1cm4gaXQgPT0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGhheXN0YWNrKSArIGhheXN0YWNrTGVuCisgICAgICAgICAgICA/IG51bGxwdHIKKyAgICAgICAgICAgIDogaXQ7Cit9CisjZW5kaWYgIC8vIF9XSU4zMgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK2NoYXIqIHN0ckR1cChTdHJpbmdWaWV3IHZpZXcpIHsKKyAgICAvLyBTYW1lIGFzIHN0cmR1cChzdHIuY19zdHIoKSkgYnV0IGF2b2lkcyBhIHN0cmxlbigpIGNhbGwuCisgICAgY2hhciogcmV0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1hbGxvYyh2aWV3LnNpemUoKSArIDF1KSk7CisgICAgOjptZW1jcHkocmV0LCB2aWV3LmNfc3RyKCksIHZpZXcuc2l6ZSgpKTsKKyAgICByZXRbdmlldy5zaXplKCldID0gJ1wwJzsKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIHN0ckNvbnRhaW5zKFN0cmluZ1ZpZXcgaGF5c3RhY2ssIGNvbnN0IGNoYXIqIG5lZWRsZSkgeworICAgIHJldHVybiA6Om1lbW1lbShoYXlzdGFjay5jX3N0cigpLCBoYXlzdGFjay5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIG5lZWRsZSwgOjpzdHJsZW4obmVlZGxlKSkgIT0gbnVsbHB0cjsKK30KKworc3RkOjpzdHJpbmcgdHJpbShjb25zdCBzdGQ6OnN0cmluZyYgaW4pIHsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIHdoaWxlIChzdGFydCA8IGluLnNpemUoKSAmJiBpc3NwYWNlKGluW3N0YXJ0XSkpIHsKKyAgICAgICAgc3RhcnQrKzsKKyAgICB9CisKKyAgICBzaXplX3QgZW5kID0gaW4uc2l6ZSgpOworICAgIHdoaWxlIChlbmQgPiBzdGFydCAmJiBpc3NwYWNlKGluW2VuZCAtIDFdKSkgeworICAgICAgICBlbmQtLTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGluLmNfc3RyKCkgKyBzdGFydCwgZW5kIC0gc3RhcnQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzhmNjUxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX1dJTjMyCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB8bmVlZGxlfCBpbiB8aGF5c3RhY2t8LCBvciBhCisvLyBOVUxMIHBvaW50ZXIgaWYgfG5lZWRsZXwgaXMgbm90IHBhcnQgb2YgfGhheXN0YWNrfC4KKy8vIEludGVudGlvbmFsbHkgaW4gZ2xvYmFsIG5hbWVzcGFjZS4gVGhpcyBpcyBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0KKy8vIEMgbGlicmFyeSBvbiBMaW51eCBhbmQgT1MgWC4KK2V4dGVybiAiQyIgY29uc3Qgdm9pZCogbWVtbWVtKGNvbnN0IHZvaWQqIGhheXN0YWNrLCBzaXplX3QgaGF5c3RhY2tfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbmVlZGxlLCBzaXplX3QgbmVlZGxlbGVuKTsKKyNlbmRpZiAgLy8gX1dJTjMyCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQ29weSB0aGUgY29udGVudCBvZiB8dmlld3wgaW50byBhIG5ldyBoZWFwLWFsbG9jYXRlZCB6ZXJvLXRlcm1pbmF0ZWQKKy8vIEMgc3RyaW5nLiBDYWxsZXIgbXVzdCBmcmVlKCkgdGhlIHJlc3VsdC4KK2NoYXIqIHN0ckR1cChTdHJpbmdWaWV3IHN0cik7CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgfGhheXN0YWNrfCBjb250YWlucyB8bmVlZGxlfC4KK2Jvb2wgc3RyQ29udGFpbnMoU3RyaW5nVmlldyBoYXlzdGFjaywgY29uc3QgY2hhciogbmVlZGxlKTsKKworLy8gSm9pbnMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIHxyYW5nZXwgaW50byBhIHNpbmdsZSBzdHJpbmcsIHVzaW5nIHxkZWxpbXwKKy8vIGFzIGEgZGVsaW1pdGVyCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZ2UsIGNsYXNzIERlbGltaXRlcj4KK3N0ZDo6c3RyaW5nIGpvaW4oY29uc3QgUmFuZ2UmIHJhbmdlLCBjb25zdCBEZWxpbWl0ZXImIGRlbGltKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICAgIC8vIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIEFETCB2ZXJzaW9ucyBvZiBiZWdpbi9lbmQgZm9yIGN1c3RvbSByYW5nZXMKKyAgICB1c2luZyBzdGQ6OmJlZ2luOworICAgIHVzaW5nIHN0ZDo6ZW5kOworICAgIGF1dG8gaXQgPSBiZWdpbihyYW5nZSk7CisgICAgY29uc3QgYXV0byBpdEVuZCA9IGVuZChyYW5nZSk7CisgICAgaWYgKGl0ICE9IGl0RW5kKSB7CisgICAgICAgIG91dCA8PCAqaXQ7CisgICAgICAgIGZvciAoKytpdDsgaXQgIT0gaXRFbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIG91dCA8PCBkZWxpbSA8PCAqaXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0LnN0cigpOworfQorCisvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGpvaW4oKSB3aXRoIGRlbGltaXRlciBzZXQgdG8gYSBzaW5nbGUgY29tbWEKK3RlbXBsYXRlIDxjbGFzcyBSYW5nZT4KK3N0ZDo6c3RyaW5nIGpvaW4oY29uc3QgUmFuZ2UmIHJhbmdlKSB7CisgICAgcmV0dXJuIGpvaW4ocmFuZ2UsICcsJyk7Cit9CisKKy8vIFJldHVybnMgYSB2ZXJzaW9uIG9mIHxpbnwgd2l0aCB3aGl0ZXNwYWNlIHRyaW1tZWQgZnJvbSB0aGUgZnJvbnQvZW5kCitzdGQ6OnN0cmluZyB0cmltKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbik7CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc5OTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlsc191bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKyNpZmRlZiBfV0lOMzIKK1RFU1QoU3RyaW5nVXRpbHMsIG1lbW1lbSkgeworICAgIGF1dG8gc3JjID0gInN0cmluZyI7CisKKyAgICAvLyBiYXNpYyBjYXNlcyAtIHdoZW4gdGhlIHN1YnN0cmluZyBpcyB0aGVyZQorICAgIEVYUEVDVF9FUShzcmMgKyAyLCBtZW1tZW0oc3JjLCBzdHJsZW4oc3JjKSwgInJpbmciLCA0KSk7CisgICAgRVhQRUNUX0VRKHNyYyArIDEsIG1lbW1lbShzcmMsIHN0cmxlbihzcmMpLCAidHJpIiwgMykpOworCisgICAgLy8gbm8gc3Vic3RyaW5nCisgICAgRVhQRUNUX0VRKG51bGxwdHIsIG1lbW1lbShzcmMsIHN0cmxlbihzcmMpLCAiMTIzIiwgMykpOworICAgIEVYUEVDVF9FUShudWxscHRyLCBtZW1tZW0oc3JjLCBzdHJsZW4oc3JjKSwgInN0cmluZ3MiLCA3KSk7CisKKyAgICAvLyBtYWtlIHN1cmUgaXQncyBsb29raW5nIGF0IGxlbmd0aHMsIGFuZCBub3QgYXQgdGhlIG51bGwtdGVybWluYXRvcgorICAgIEVYUEVDVF9FUShzcmMgKyAyLCBtZW1tZW0oc3JjLCBzdHJsZW4oc3JjKSwgInJpbmdlciIsIDQpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKHNyYywgMiwgInRyIiwgMikpOworCisgICAgLy8gY29ybmVyIGNhc2VzIC0gZW1wdHkvc2luZ2xlIGNoYXIgYW5kIHRoZSBuZWVkbGUgc2FtZSBhcyBoYXlzdGFjaworICAgIEVYUEVDVF9FUShzcmMsIG1lbW1lbShzcmMsIHN0cmxlbihzcmMpLCAiIiwgMCkpOworICAgIEVYUEVDVF9FUShzcmMsIG1lbW1lbShzcmMsIHN0cmxlbihzcmMpLCAicyIsIDEpKTsKKyAgICBFWFBFQ1RfRVEoc3JjLCBtZW1tZW0oc3JjLCAxLCAicyIsIDEpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKCIiLCAwLCAicyIsIDEpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKCIiLCAwLCAiIiwgMCkpOworICAgIEVYUEVDVF9FUShzcmMsIG1lbW1lbShzcmMsIHN0cmxlbihzcmMpLCBzcmMsIHN0cmxlbihzcmMpKSk7CisKKyAgICAvLyBudWxsIGlucHV0IHBhcmFtZXRlcnMKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKHNyYywgc3RybGVuKHNyYyksIG51bGxwdHIsIDIpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKG51bGxwdHIsIDEwLCAiYXNkZiIsIDQpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgbWVtbWVtKG51bGxwdHIsIDEwLCBudWxscHRyLCAxKSk7Cit9CisjZW5kaWYgLy8gX1dJTjMyCisKK1RFU1QoU3RyaW5nVXRpbHMsIHN0ckR1cFdpdGhTdHJpbmdWaWV3KSB7CisgICAgU3RyaW5nVmlldyB2aWV3KCJIZWxsbyBXb3JsZCIpOworICAgIGNoYXIqIHMgPSBzdHJEdXAodmlldyk7CisgICAgRVhQRUNUX1RSVUUocyk7CisgICAgRVhQRUNUX1NUUkVRKHZpZXcuY19zdHIoKSwgcyk7CisgICAgRVhQRUNUX05FKHZpZXcuY19zdHIoKSwgcyk7CisgICAgZnJlZShzKTsKK30KKworVEVTVChTdHJpbmdVdGlscywgc3RyRHVwV2l0aFN0ZFN0cmluZykgeworICAgIHN0ZDo6c3RyaW5nIHN0cigiSGVsbG8gV29ybGQiKTsKKyAgICBjaGFyKiBzID0gc3RyRHVwKHN0cik7CisgICAgRVhQRUNUX1RSVUUocyk7CisgICAgRVhQRUNUX1NUUkVRKHN0ci5jX3N0cigpLCBzKTsKKyAgICBFWFBFQ1RfTkUoc3RyLmNfc3RyKCksIHMpOworICAgIGZyZWUocyk7Cit9CisKK1RFU1QoU3RyaW5nVXRpbHMsIHN0ckNvbnRhaW5zV2l0aFN0cmluZ1ZpZXcpIHsKKyAgICBTdHJpbmdWaWV3IGhheXN0YWNrKCJUaGlzIGlzIGEgbG9uZyBzdHJpbmcgdG8gc2VhcmNoIGZvciBzdHVmZiIpOworICAgIEVYUEVDVF9GQUxTRShzdHJDb250YWlucyhoYXlzdGFjaywgIm5lZWRsZSIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyQ29udGFpbnMoaGF5c3RhY2ssICJzdHVmZnkiKSk7CisgICAgRVhQRUNUX1RSVUUoc3RyQ29udGFpbnMoaGF5c3RhY2ssICJzdHVmIikpOworICAgIEVYUEVDVF9UUlVFKHN0ckNvbnRhaW5zKGhheXN0YWNrLCAic3R1ZmYiKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0ckNvbnRhaW5zKGhheXN0YWNrLCAiVGhpcyBpcyBhIHNob3J0IHBocmFzZSIpKTsKKyAgICBFWFBFQ1RfVFJVRShzdHJDb250YWlucyhoYXlzdGFjaywgImEgbG9uZyBzdHJpbmciKSk7Cit9CisKK1RFU1QoU3RyaW5nVXRpbHMsIHN0ckNvbnRhaW5zV2l0aFN0ZFN0cmluZykgeworICAgIHN0ZDo6c3RyaW5nIGhheXN0YWNrKCJUaGlzIGlzIGEgbG9uZyBzdHJpbmcgdG8gc2VhcmNoIGZvciBzdHVmZiIpOworICAgIEVYUEVDVF9GQUxTRShzdHJDb250YWlucyhoYXlzdGFjaywgIm5lZWRsZSIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyQ29udGFpbnMoaGF5c3RhY2ssICJzdHVmZnkiKSk7CisgICAgRVhQRUNUX1RSVUUoc3RyQ29udGFpbnMoaGF5c3RhY2ssICJzdHVmZiIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyQ29udGFpbnMoaGF5c3RhY2ssICJUaGlzIGlzIGEgc2hvcnQgcGhyYXNlIikpOworICAgIEVYUEVDVF9UUlVFKHN0ckNvbnRhaW5zKGhheXN0YWNrLCAiYSBsb25nIHN0cmluZyIpKTsKK30KKworVEVTVChTdHJpbmdVdGlscywgam9pbikgeworICAgIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OmpvaW47CisKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIGpvaW4oc3RkOjp2ZWN0b3I8aW50Pnt9KS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImFhIiwgam9pbihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57ImFhIn0pLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWEsYmIiLCBqb2luKHN0ZDo6bGlzdDxjb25zdCBjaGFyKj57ImFhIiwgImJiIn0pLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMSwyLDMiLCBqb2luKHN0ZDo6dmVjdG9yPGludD57MSwgMiwgM30pLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMXwyfDMiLCBqb2luKHN0ZDo6dmVjdG9yPGludD57MSwgMiwgM30sICd8JykuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxPHw+Mjx8PnNkIiwKKyAgICAgICAgICAgICAgICAgam9pbihzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj57IjEiLCAiMiIsICJzZCJ9LCAiPHw+IikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIuLi4tLS0uLi4iLAorICAgICAgICAgICAgICAgICBqb2luKHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPnsiLi4uIiwgIi4uLiJ9LCAiLS0tIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIuLi4tLS0uLi4iLAorICAgICAgICAgICAgICAgICBqb2luKHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPnsiLi4uIiwgIi0tLSIsICIuLi4ifSwgIiIpLmNfc3RyKCkpOworCisgICAgLy8gY2hlY2sgc29tZSBzcGVjaWFsIGNhc2VzIC0gbHZhbHVlIG1vZGlmaWFibGUgYW5kIGNvbnN0IHJlZmVyZW5jZXMKKyAgICB1c2luZyBTdHJpbmdWZWMgPSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz47CisgICAgU3RyaW5nVmVjIHNyYyA9IHsgIjEiLCAiYSIsICJmb28iIH07CisKKyAgICBFWFBFQ1RfU1RSRVEoIjEsYSxmb28iLCBqb2luKHNyYykuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxLCBhLCBmb28iLCBqb2luKHNyYywgIiwgIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxLGEsZm9vIiwgam9pbihjb25zdF9jYXN0PGNvbnN0IFN0cmluZ1ZlYyY+KHNyYykpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMSwgYSwgZm9vIiwKKyAgICAgICAgICAgICAgICAgam9pbihjb25zdF9jYXN0PGNvbnN0IFN0cmluZ1ZlYyY+KHNyYyksICIsICIpLmNfc3RyKCkpOworfQorCitURVNUKFN0cmluZ1V0aWxzLCB0cmltKSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogYmVmb3JlOworICAgICAgICBjb25zdCBjaGFyKiBhZnRlcjsKKyAgICB9IHRlc3RfZGF0YVtdID0geworICAgICAgICAgICAgeyJubyBjaGFuZ2UiLCAibm8gY2hhbmdlIn0sCisgICAgICAgICAgICB7IiIsICIifSwKKyAgICAgICAgICAgIHsiIGxlZnQiLCAibGVmdCJ9LAorICAgICAgICAgICAgeyJyaWdodCAiLCAicmlnaHQifSwKKyAgICAgICAgICAgIHsiXG5uZXdsaW5lXHIiLCAibmV3bGluZSJ9LAorICAgICAgICAgICAgeyIgXHJcblx0bXVsdGkgXHRcclxuIiwgIm11bHRpIn0sCisgICAgfTsKKyAgICBzaXplX3QgVEVTVF9EQVRBX0NPVU5UID0gc2l6ZW9mKHRlc3RfZGF0YSkgLyBzaXplb2YodGVzdF9kYXRhWzBdKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgVEVTVF9EQVRBX0NPVU5UOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYmVmb3JlKHRlc3RfZGF0YVtpXS5iZWZvcmUpOworICAgICAgICBzdGQ6OnN0cmluZyBhZnRlciA9IHRyaW0oYmVmb3JlKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKHRlc3RfZGF0YVtpXS5hZnRlciwgYWZ0ZXIuY19zdHIoKSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvVXRmOFV0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvVXRmOFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQ4MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9VdGY4VXRpbHMuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1V0ZjhVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK2Jvb2wgdXRmOElzVmFsaWQoY29uc3QgY2hhciogdGV4dCwgc2l6ZV90IHRleHRMZW4pIHsKKyAgICBjb25zdCBjaGFyKiBlbmQgPSB0ZXh0ICsgdGV4dExlbjsKKworICAgIHdoaWxlICh0ZXh0IDwgZW5kKSB7CisgICAgICAgIHNpemVfdCBuID0gMDsKKyAgICAgICAgaW50IGNoID0gKnRleHQ7CisgICAgICAgIGlmICghKGNoICYgMHg4MCkpIHsKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZTApID09IDB4YzApIHsKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZjApID09IDB4ZTApIHsKKyAgICAgICAgICAgIG4gPSAyOworICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZjgpID09IDB4ZjApIHsKKyAgICAgICAgICAgIG4gPSAzOworICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZmMpID09IDB4ZjgpIHsKKyAgICAgICAgICAgIG4gPSA0OworICAgICAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZmUpID09IDB4ZmMpIHsKKyAgICAgICAgICAgIG4gPSA1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgoc2l6ZV90KShlbmQgLSB0ZXh0KSA8IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHRleHQrKzsgbiA+IDA7IHRleHQrKywgbi0tKSB7CisgICAgICAgICAgICBpZiAoKCp0ZXh0ICYgMHhjMCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IHV0ZjhEZWNvZGUoY29uc3QgdWludDhfdCogdGV4dCwgc2l6ZV90IHRleHRMZW4sIHVpbnQzMl90KiBjb2RlcG9pbnQpIHsKKyAgICBpZiAoIXRleHRMZW4pIHsKKyAgICAgICAgLy8gTm8gaW5wdXQhCisgICAgICAgICpjb2RlcG9pbnQgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbnQgbiA9IDA7CisgICAgaW50IGNoID0gKnRleHQ7CisgICAgaWYgKCEoY2ggJiAweDgwKSkgeworICAgICAgICBuID0gMDsKKyAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZTApID09IDB4YzApIHsKKyAgICAgICAgbiA9IDE7CisgICAgfSBlbHNlIGlmICgoY2ggJiAweGYwKSA9PSAweGUwKSB7CisgICAgICAgIG4gPSAyOworICAgIH0gZWxzZSBpZiAoKGNoICYgMHhmOCkgPT0gMHhmMCkgeworICAgICAgICBuID0gMzsKKyAgICB9IGVsc2UgaWYgKChjaCAmIDB4ZmMpID09IDB4ZjgpIHsKKyAgICAgICAgbiA9IDQ7CisgICAgfSBlbHNlIGlmICgoY2ggJiAweGZlKSA9PSAweGZjKSB7CisgICAgICAgIG4gPSA1OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludmFsaWQgaW5wdXQuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChzaXplX3QpbiArIDFVID4gdGV4dExlbikgeworICAgICAgICAvLyBJbnB1dCBpcyB0b28gc2hvcnQuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgdWludDMyX3QgdmFsdWUgPSAwOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgdmFsdWUgPSB0ZXh0WzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gdGV4dFswXSAmICgweDdmID4+IG4pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgPDwgNlUpIHwgKHVpbnQzMl90KSh0ZXh0W2kgKyAxXSAmIDB4M2YpOworICAgICAgICB9CisgICAgfQorICAgICpjb2RlcG9pbnQgPSB2YWx1ZTsKKyAgICByZXR1cm4gbiArIDE7Cit9CisKK2ludCB1dGY4RW5jb2RlKHVpbnQzMl90IGNvZGVwb2ludCwgdWludDhfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKSB7CisgICAgaW50IGxlbiA9IDA7CisKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIHsKKyAgICAgICAgbGVuID0gMTsKKyAgICB9IGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDdmZikgeworICAgICAgICBsZW4gPSAyOworICAgIH0gZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4ZmZmZikgeworICAgICAgICBsZW4gPSAzOworICAgIH0gZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSB7CisgICAgICAgIGxlbiA9IDQ7CisgICAgfSBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHgzZmZmZmZmKSB7CisgICAgICAgIGxlbiA9IDU7CisgICAgfSBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3ZmZmZmZmZikgeworICAgICAgICBsZW4gPSA2OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludmFsaWQgdmFsdWUuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgaWYgKGJ1ZmZlckxlbiA8IChzaXplX3QpbGVuKSB7CisgICAgICAgIC8vIGJ1ZmZlciB0b28gc21hbGwuCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKGludCBuID0gbGVuIC0gMTsgbiA+IDA7IC0tbikgeworICAgICAgICBidWZmZXJbbl0gPSAodWludDhfdCkoY29kZXBvaW50ICYgMHgzZikgfCAweDgwOworICAgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgIGJ1ZmZlclswXSA9ICh1aW50OF90KWNvZGVwb2ludDsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXJbMF0gPSAodWludDhfdCkoMHhmZjAwID4+IGxlbikgfCBjb2RlcG9pbnQ7CisgICAgfQorCisgICAgcmV0dXJuIGxlbjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9taXNjL1V0ZjhVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9VdGY4VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhMTEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9VdGY4VXRpbHMuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBSZXR1cm4gdHJ1ZSBpZmYgfHRleHR8IGNvcnJlc3BvbmRzIHRvIHx0ZXh0TGVufCBieXRlcyBvZiB2YWxpZCBVVEYtOAorLy8gZW5jb2RlZCB0ZXh0LgorYm9vbCB1dGY4SXNWYWxpZChjb25zdCBjaGFyKiB0ZXh0LCBzaXplX3QgdGV4dExlbik7CisKKy8vIERlY29kZSBhIHNpbmdsZSBVVEYtOCBlbmNvZGVkIGlucHV0IHZhbHVlLiBSZWFkcyBhdCBtb3N0IHx0ZXh0TGVufCBieXRlcworLy8gZnJvbSB8dGV4dHwgYW5kIHRyaWVzIHRvIGludGVycHJldCB0aGUgZGF0YSBhcyB0aGUgc3RhcnQgb2YgYW4gVVRGLTgKKy8vIGVuY29kZWQgVW5pY29kZSB2YWx1ZS4gT24gc3VjY2VzcywgcmV0dXJuIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlCisvLyBlbmNvZGluZyBhbmQgc2V0cyB8KmNvZGVwb2ludHwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29kZXBvaW50LgorLy8gT24gZXJyb3IgKGUuZy4gaW52YWxpZCBlbmNvZGluZywgb3IgaW5wdXQgdG9vIHNob3J0KSwgcmV0dXJuIC0xLgoraW50IHV0ZjhEZWNvZGUoY29uc3QgdWludDhfdCogdGV4dCwgc2l6ZV90IHRleHRMZW4sIHVpbnQzMl90KiBjb2RlcG9pbnQpOworCisvLyBFbmNvZGUgVW5pY29kZSB8Y29kZXBvaW50fCBpbnRvIGl0cyBVVEYtOCByZXByZXNlbnRhdGlvbiBpbnRvIHxidWZmZXJ8CisvLyB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IHxidWZmZXJfbGVufCBieXRlcy4gUmV0dXJucyBlbmNvZGluZyBsZW5ndGgsIG9yCisvLyAtMSBpbiBjYXNlIG9mIGVycm9yLiBOb3RlIHRoYXQgfGJ1ZmZlcnwgY2FuIGJlIE5VTEwsIGluIHdoaWNoIGNhc2UKKy8vIHxidWZmZXJfbGVufCBpcyBpZ25vcmVkIGFuZCB0aGUgZnVsbCBlbmNvZGluZyBsZW5ndGggaXMgcmV0dXJuZWQuCitpbnQgdXRmOEVuY29kZSh1aW50MzJfdCBjb2RlcG9pbnQsIHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9sZW4pOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvVXRmOFV0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL21pc2MvVXRmOFV0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEwMDMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbWlzYy9VdGY4VXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1V0ZjhVdGlscy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBBUlJBWUxFTih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2RlZmluZSBEQVRBKGV4cGVjdGVkLCB0ZXh0KSB7IGV4cGVjdGVkLCB0ZXh0LCBzaXplb2YodGV4dCkgLSAxVSB9CisKK1RFU1QoVXRmOFV0aWxzLCB1dGY4SXNWYWxpZCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBjb25zdCBjaGFyKiB0ZXh0OworICAgICAgICBzaXplX3QgdGV4dExlbjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIERBVEEodHJ1ZSwgIiIpLAorICAgICAgICBEQVRBKHRydWUsICJIZWxsbyBXb3JsZCEiKSwKKyAgICAgICAgREFUQSh0cnVlLCAiVFx4QzNceEE5bFx4QzNceEE5dmlzaW9uIiksCisgICAgICAgIERBVEEoZmFsc2UsICJceDgwXHg4MCIpLAorICAgICAgICBEQVRBKHRydWUsICJceEMxXHhCNiIpLAorICAgICAgICBEQVRBKGZhbHNlLCAiXHhDMFx4N2YiKSwKKyAgICAgICAgREFUQSh0cnVlLCAiZm9vXHhFMFx4ODBceDgwIiksCisgICAgICAgIERBVEEoZmFsc2UsICJmb29ceEUwXHg4MCIpLAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgIHV0ZjhJc1ZhbGlkKGtEYXRhW25dLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS50ZXh0TGVuKSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKFV0ZjhVdGlscywgdXRmOERlY29kZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBpbnQgZXhwZWN0ZWRfbGVuOworICAgICAgICB1aW50MzJfdCBleHBlY3RlZF9jb2RlcG9pbnQ7CisgICAgICAgIHVpbnQ4X3QgdGV4dFsxNl07CisgICAgICAgIGludCB0ZXh0X2xlbjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgMCwgMCwgeyAwLCB9LCAwIH0sICAvLyBlbXB0eSBpbnB1dCByZXR1cm5zIDAKKyAgICAgICAgeyAxLCAwLCB7IDAsIH0sIDEgfSwgIC8vIGlucHV0IGlzIGp1c3QgMAorICAgICAgICB7IDEsIDEyNywgeyAweDdmLCB9LCAxIH0sCisgICAgICAgIHsgMiwgMCwgeyAweGMwLCAweDgwIH0sIDIgfSwKKyAgICAgICAgeyAyLCAweDgwLCB7IDB4YzIsIDB4ODAgfSwgMiB9LAorICAgICAgICB7IDIsIDB4ODEsIHsgMHhjMiwgMHg4MSB9LCAyIH0sCisgICAgICAgIHsgMiwgMHg3ZmYsIHsgMHhkZiwgMHhiZiB9LCAyIH0sCisgICAgICAgIHsgMywgMHg4MDAsIHsgMHhlMCwgMHhhMCwgMHg4MCB9LCAzIH0sCisgICAgICAgIHsgMywgMHg3ZmZmLCB7IDB4ZTcsIDB4YmYsIDB4YmYgfSwgMyB9LAorICAgICAgICB7IDMsIDB4ZmZmZiwgeyAweGVmLCAweGJmLCAweGJmIH0sIDMgfSwKKyAgICAgICAgeyA0LCAweDEwMDAwLCB7IDB4ZjAsIDB4OTAsIDB4ODAsIDB4ODAgfSwgNCB9LAorICAgICAgICB7IDQsIDB4MWZmZmZmLCB7IDB4ZjcsIDB4YmYsIDB4YmYsIDB4YmYgfSwgNCB9LAorICAgICAgICB7IDEsIDMyLCB7IDMyLCAwLCB9LCAzMiB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIHVpbnQzMl90IGNvZGVwb2ludCA9IDA7CisgICAgICAgIGludCBsZW4gPSB1dGY4RGVjb2RlKGtEYXRhW25dLnRleHQsIGtEYXRhW25dLnRleHRfbGVuLCAmY29kZXBvaW50KTsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkX2xlbiwgbGVuKSA8PCAiIyIgPDwgbjsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkX2NvZGVwb2ludCwgY29kZXBvaW50KSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoVXRmOFV0aWxzLCB1dGY4RW5jb2RlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGludCBleHBlY3RlZF9sZW47CisgICAgICAgIHVpbnQ4X3QgZXhwZWN0ZWRfdGV4dFszMl07CisgICAgICAgIHVpbnQzMl90IGNvZGVwb2ludDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgLTEsIHsgMCwgfSwgMHg4MDAwMDAwMFUgfSwKKyAgICAgICAgeyAxLCB7IDAsIDAgfSwgMCB9LAorICAgICAgICB7IDEsIHsgMzIsIH0sIDMyIH0sCisgICAgICAgIHsgMSwgeyAxMjcsIH0sIDEyNyB9LAorICAgICAgICB7IDIsIHsgMHhjMiwgMHg4MCwgfSwgMHg4MCB9LAorICAgICAgICB7IDIsIHsgMHhjMiwgMHg4MSwgfSwgMHg4MSB9LAorICAgICAgICB7IDIsIHsgMHhkZiwgMHhiZiwgfSwgMHg3ZmYgfSwKKyAgICAgICAgeyAzLCB7IDB4ZTAsIDB4YTAsIDB4ODAgfSwgMHg4MDAgfSwKKyAgICAgICAgeyAzLCB7IDB4ZTcsIDB4YmYsIDB4YmYgfSwgMHg3ZmZmIH0sCisgICAgICAgIHsgMywgeyAweGVmLCAweGJmLCAweGJmIH0sIDB4ZmZmZiB9LAorICAgICAgICB7IDQsIHsgMHhmMCwgMHg5MCwgMHg4MCwgMHg4MCB9LCAweDEwMDAwIH0sCisgICAgICAgIHsgNCwgeyAweGY3LCAweGJmLCAweGJmLCAweGJmIH0sIDB4MWZmZmZmIH0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFTaXplID0gQVJSQVlMRU4oa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFTaXplOyArK24pIHsKKyAgICAgICAgdWludDhfdCBidWZmZXJbMzJdID0geyAwLCB9OworCisgICAgICAgIC8vIEZpcnN0LCBjaGVjayBsZW5ndGggd2l0aG91dCBhbiBvdXRwdXQgYnVmZmVyLgorICAgICAgICBpbnQgbGVuID0gdXRmOEVuY29kZShrRGF0YVtuXS5jb2RlcG9pbnQsIE5VTEwsIDApOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfbGVuLCBsZW4pIDw8ICIjIiA8PCBuOworCisgICAgICAgIC8vIFNlY29uZCwgY2hlY2sgbGVuZ3RoIHdpdGggYW4gb3V0cHV0IGJ1ZmZlci4KKyAgICAgICAgbGVuID0gdXRmOEVuY29kZShrRGF0YVtuXS5jb2RlcG9pbnQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfbGVuLCBsZW4pIDw8ICIjIiA8PCBuOworICAgICAgICBmb3IgKGludCBpaSA9IDA7IGlpIDwgbGVuOyArK2lpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfdGV4dFtpaV0sIGJ1ZmZlcltpaV0pIAorICAgICAgICAgICAgICAgICAgICA8PCAiIyIgPDwgbiA8PCAiIEAiIDw8IGlpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcmQsIGNoZWNrIGxlbmd0aCB3aXRoIGEgYnVmZmVyIHRoYXQgaXMgdG9vIHNob3J0LgorICAgICAgICBpZiAoa0RhdGFbbl0uZXhwZWN0ZWRfbGVuID4gMCkgeworICAgICAgICAgICAgbGVuID0gdXRmOEVuY29kZShrRGF0YVtuXS5jb2RlcG9pbnQsIGJ1ZmZlciwgKHNpemVfdCkobGVuIC0gMSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKC0xLCBsZW4pIDw8ICIjIiA8PCBuOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU0OTBiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9EbnMuY3BwCkBAIC0wLDAgKzEsMjk5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0Rucy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RXJyb3JzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVXRpbHMuaCIKKyNpbmNsdWRlICJpcGhscGFwaS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFNldCB0byAxIHRvIGluY3JlYXNlIHZlcmJvc2l0eSBvZiBkZWJ1ZyBtZXNzYWdlcy4KKyNkZWZpbmUgREVCVUcgMAorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIEFkZHJlc3NMaXN0ID0gYW5kcm9pZDo6YmFzZTo6RG5zOjpBZGRyZXNzTGlzdDsKKworI2lmIERFQlVHCisjaWZkZWYgX1dJTjMyCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzYXZlIHR5cGluZy4KK3N0YXRpYyBzdGQ6OnN0cmluZyB0b1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydFRvVXRmOChzdHIpOworfQorI2VuZGlmICAvLyAhX1dJTjMyCisjZW5kaWYgIC8vIF9ERUJVRworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBEbnM6OlJlc29sdmVyIGludGVyZmFjZSBiYXNlZCBvbiA6OmdldGFkZHJpbmZvKCkuCitjbGFzcyBTeXN0ZW1SZXNvbHZlciA6IHB1YmxpYyBEbnM6OlJlc29sdmVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCByZXNvbHZlTmFtZShTdHJpbmdWaWV3IGRuc19zZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzTGlzdCogb3V0KSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lID0gZG5zX3NlcnZlcl9uYW1lOworICAgICAgICBzdHJ1Y3QgYWRkcmluZm8qIHJlczsKKyAgICAgICAgaW50IHJldCA9IDo6Z2V0YWRkcmluZm8oaG9zdG5hbWUuY19zdHIoKSwgbnVsbHB0ciwgbnVsbHB0ciwgJnJlcyk7CisgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgRExPRyhFUlJPUikgPDwgImdldGFkZHJpbmZvKCciIDw8IGRuc19zZXJ2ZXJfbmFtZSA8PCAiJykgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcmV0OworICAgICAgICAgICAgc3dpdGNoIChyZXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVBSV9BR0FJTjogIC8vIHNlcnZlciBpcyBkb3duLgorICAgICAgICAgICAgICAgIGNhc2UgRUFJX0ZBSUw6ICAgLy8gc2VydmVyIGlzIHNpY2suCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUhPU1RET1dOOworCisjaWYgZGVmaW5lZChFQUlfTk9EQVRBKSAmJiAoRUFJX05PREFUQSAhPSBFQUhPX05PTkFNRSkKKyAgICAgICAgICAgICAgICBjYXNlIEVBSV9OT0RBVEE6CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjYXNlIEVBSV9OT05BTUU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgICAgICAgICAgICAgY2FzZSBFQUlfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgdGhlIHJldHVybmVkIGxpc3Qgb2YgYWRkcmVzc2VzLgorICAgICAgICBmb3IgKHN0cnVjdCBhZGRyaW5mbyogciA9IHJlczsgciAhPSBudWxscHRyOyByID0gci0+YWlfbmV4dCkgeworICAgICAgICAgICAgLy8gT24gTGludXgsIGdldGFkZHJpbmZvKCkgd2lsbCByZXR1cm4gdGhlIHNhbWUgYWRkcmVzcyB3aXRoIHVwIHRvCisgICAgICAgICAgICAvLyAqdGhyZWUqIHN0cnVjdCBhZGRyaW5mbyB0aGF0IG9ubHkgZGlmZmVyIGJ5IHRoZWlyCisgICAgICAgICAgICAvLyB8YWlfc29ja3R5cGV8IGZpZWxkLCB3aGljaCB3aWxsIGJlIFNPQ0tfU1RSRUFNLCBTT0NLX0RHUkFNLAorICAgICAgICAgICAgLy8gYW5kIFNPQ0tfUkFXLiBJZ25vcmUgdGhlIG9uZXMgdGhhdCBhcmUgbm90IFNPQ0tfU1RSRUFNCisgICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBleHBlY3QgYSBtYWNoaW5lIHRvIGhhdmUgZGlmZmVyZW50IElQCisgICAgICAgICAgICAvLyBhZGRyZXNzZXMgZm9yIFRDUCBhbmQgVURQLgorICAgICAgICAgICAgaWYgKHItPmFpX3NvY2t0eXBlICE9IFNPQ0tfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKHItPmFpX2ZhbWlseSkgeworICAgICAgICAgICAgICAgIGNhc2UgQUZfSU5FVDogeworICAgICAgICAgICAgICAgICAgICBhdXRvIHNpbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHJfaW4qPihyLT5haV9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soSXBBZGRyZXNzKG50b2hsKHNpbi0+c2luX2FkZHIuc19hZGRyKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEFGX0lORVQ2OiB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gc2luNiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oci0+YWlfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKElwQWRkcmVzcyhzaW42LT5zaW42X2FkZHIuczZfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbjYtPnNpbjZfc2NvcGVfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgOjpmcmVlYWRkcmluZm8ocmVzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBnZXRTeXN0ZW1TZXJ2ZXJMaXN0KEFkZHJlc3NMaXN0KiBvdXQpIG92ZXJyaWRlIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgc3RkOjpzdHJpbmcgYnVmZmVyOworICAgICAgICBVTE9ORyBidWZmZXJMZW4gPSAwOworICAgICAgICBEV09SRCByZXQgPSBHZXRBZGFwdGVyc0FkZHJlc3NlcyhBRl9VTlNQRUMsIDAsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJMZW4pOworICAgICAgICBpZiAocmV0ID09IEVSUk9SX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgYnVmZmVyLnJlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlckxlbikpOworICAgICAgICAgICAgcmV0ID0gR2V0QWRhcHRlcnNBZGRyZXNzZXMoCisgICAgICAgICAgICAgICAgICAgIEFGX1VOU1BFQywgMCwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxJUF9BREFQVEVSX0FERFJFU1NFUyo+KCZidWZmZXJbMF0pLAorICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIERMT0coRVJST1IpIDw8ICJHZXRBZGFwdGVyc0FkZHJlc3NlcygpIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBXaW4zMlV0aWxzOjpnZXRFcnJvclN0cmluZyhyZXQpOworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUZWNobmljYWwgbm90ZTogV2luZG93cyBETlMgcmVzb2x1dGlvbiB3aXRoIG11bHRpcGxlIGFkYXB0ZXJzCisgICAgICAgIC8vIGlzIHRyaWNreSBhbmQgZGV0YWlsZWQgaW4gdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gICBodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2RkMTk3NTUyKFdTLjEwKS5hc3B4CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIGEgbnV0c2hlbGwsIHRoZXJlIGlzIGEgInByZWZlcnJlZCBuZXR3b3JrIGFkYXB0ZXIiIGFuZCBpdHMgbGlzdAorICAgICAgICAvLyBvZiBETlMgc2VydmVycyB3aWxsIGJlIGNvbnNpZGVyZWQgZmlyc3QuIElmIHRoZXJlIGlzIG5vIHJlc3BvbnNlCisgICAgICAgIC8vIGFmdGVyIHNvbWUgdGltZSBmcm9tIHRoZW0sIHRoZSBETlMgc2VydmVyIGxpc3QgZnJvbSBvdGhlciBhZGFwdGVycworICAgICAgICAvLyB3aWxsIGJlIGNvbnNpZGVyZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSB0cmlja3kgcGFydCBpcyB0aGF0IHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHJlbGlhYmxlIHdheQorICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIHByZWZlcnJlZCBuZXR3b3JrIGFkYXB0ZXIsIG9yIHRoZSBvcmRlciBvZgorICAgICAgICAvLyBhbHRlcm5hdGl2ZSBvbmVzIHRoYXQgYXJlIHVzZWQgaW4gY2FzZSBvZiBmYWxsYmFjay4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGVyZSwgdGhlIGNvZGUgd2lsbCBzaW1wbHkgY2FsbCBHZXRBZGFwdGVyc0FkZHJlc3NlcygpIHRvIGxpc3QKKyAgICAgICAgLy8gdGhlIEROUyBzZXJ2ZXIgbGlzdCBmb3IgYWxsIGludGVyZmFjZXMuIEl0IHRoZW4gbWFrZXMgdGhlIGZvbGxvd2luZworICAgICAgICAvLyBhc3N1bXB0aW9uczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBUaGUgYWRhcHRlcnMgYXJlIGxpc3RlZCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLCBpLmUuIHRoZSBETlMKKyAgICAgICAgLy8gICBzZXJ2ZXJzIGZyb20gdGhlIGZpcnN0IGFkYXB0ZXIgc2hvdWxkIGFwcGVhciBpbiB0aGUgcmVzdWx0CisgICAgICAgIC8vICAgYmVmb3JlIHRob3NlIGZvdW5kIGluIGFkYXB0ZXJzIHRoYXQgYXBwZWFyIGxhdGVyIGluIHRoZSBsaXN0LgorICAgICAgICAvLworICAgICAgICAvLyAtIEROUyBzZXJ2ZXJzIGNhbiBhcHBlYXIgbXVsdGlwbGUgdGltZXMgKGkuZS4gYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIC8vICAgbXVsdGlwbGUgbmV0d29yayBhZGFwdGVycyksIGFuZCBpdCdzIHVzZWxlc3MgdG8gcmV0dXJuIGR1cGxpY2F0ZQorICAgICAgICAvLyAgIGVudHJpZXMgaW4gdGhlIHJlc3VsdC4KKyAgICAgICAgLy8KKworICAgICAgICAvLyBUaGUgc2V0IG9mIEROUyBzZXJ2ZXIgYWRkcmVzc2VzIGFscmVhZHkgaW4gdGhlIG91dHB1dCBsaXN0LAorICAgICAgICAvLyB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGVzLgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8SXBBZGRyZXNzPiBwcmVzZW50OworCisgICAgICAgIGZvciAoYXV0byBhZGFwdGVyID0gcmVpbnRlcnByZXRfY2FzdDxJUF9BREFQVEVSX0FERFJFU1NFUyo+KCZidWZmZXJbMF0pOworICAgICAgICAgICAgIGFkYXB0ZXIgIT0gbnVsbHB0cjsgYWRhcHRlciA9IGFkYXB0ZXItPk5leHQpIHsKKyNpZiBERUJVRworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJOZXR3b3JrIEFkYXB0ZXIgIiA8PCBhZGFwdGVyLT5BZGFwdGVyTmFtZTsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiICBGcmllbmRseSBuYW1lOiAiIDw8IHRvVXRmOChhZGFwdGVyLT5GcmllbmRseU5hbWUpOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICIgIERlc2NyaXB0aW9uICA6ICIgPDwgdG9VdGY4KGFkYXB0ZXItPkRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiICBETlMgc3VmZml4ICAgOiAiIDw8IHRvVXRmOChhZGFwdGVyLT5EbnNTdWZmaXgpOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICIgIEROUyBzZXJ2ZXJzICA6IjsKKyNlbmRpZiAgLy8gREVCVUcKKyAgICAgICAgICAgIGZvciAoYXV0byBkbnNTZXJ2ZXIgPSBhZGFwdGVyLT5GaXJzdERuc1NlcnZlckFkZHJlc3M7CisgICAgICAgICAgICAgICAgIGRuc1NlcnZlciAhPSBudWxscHRyOyBkbnNTZXJ2ZXIgPSBkbnNTZXJ2ZXItPk5leHQpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGFkZHJlc3MgPSBkbnNTZXJ2ZXItPkFkZHJlc3MubHBTb2NrYWRkcjsKKyAgICAgICAgICAgICAgICBJcEFkZHJlc3MgaXA7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhZGRyZXNzLT5zYV9mYW1pbHkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBRl9JTkVUOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHJfaW4qPihhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gSXBBZGRyZXNzKG50b2hsKHNpbi0+c2luX2FkZHIuc19hZGRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXNlIEFGX0lORVQ2OiB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHNpbjYgPSByZWludGVycHJldF9jYXN0PHNvY2thZGRyX2luNio+KGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSBJcEFkZHJlc3Moc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjaWYgREVCVUcKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIiAgICAiIDw8IGlwLnRvU3RyaW5nKCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAoaXAudmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIHJldCA9IHByZXNlbnQuaW5zZXJ0KGlwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgbmV3IGl0ZW0gd2FzIGluc2VydGVkIGludG8gdGhlIHNldCwgc28gc2F2ZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgcmVzdWx0LgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKGlwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlc2VudC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlICAvLyAhX1dJTjMyCisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZmluOworI2lmZGVmIF9fQVBQTEVfXworICAgICAgICAvLyBvbiBEYXJ3aW4gL2V0Yy9yZXNvbHYuY29uZiBpcyBhIHN5bWxpbmsgdG8KKyAgICAgICAgLy8gL3ByaXZhdGUvdmFyL3J1bi9yZXNvbHYuY29uZgorICAgICAgICAvLyBpbiBzb21lIHNpdHVhdGlvbnMsIHRoZSBzeW1saW5rIGNhbiBiZSBkZXN0cm95ZWQgYW5kIHRoZSBzeXN0ZW0gd2lsbAorICAgICAgICAvLyBub3QKKyAgICAgICAgLy8gcmUtY3JlYXRlIGl0LiBEYXJ3aW4tYXdhcmUgYXBwbGljYXRpb25zIHdpbGwgY29udGludWUgdG8gcnVuLCBidXQKKyAgICAgICAgLy8gImxlZ2FjeSIgVW5peCBvbmVzIHdpbGwgbm90LgorICAgICAgICBmaW4ub3BlbigiL3ByaXZhdGUvdmFyL3J1bi9yZXNvbHYuY29uZiIpOworICAgICAgICBpZiAoIWZpbikgeworICAgICAgICAgICAgZmluLm9wZW4oIi9ldGMvcmVzb2x2LmNvbmYiKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZmluLm9wZW4oIi9ldGMvcmVzb2x2LmNvbmYiKTsKKyNlbmRpZgorICAgICAgICBpZiAoIWZpbi5nb29kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShmaW4sIGxpbmUpKSB7CisgICAgICAgICAgICBjaGFyIG5hbWVzZXJ2ZXJbMjU3XTsKKyAgICAgICAgICAgIGlmIChzc2NhbmYobGluZS5jX3N0cigpLCAibmFtZXNlcnZlciUqWyBcdF0lMjU2cyIsIG5hbWVzZXJ2ZXIpID09CisgICAgICAgICAgICAgICAgMSkgeworICAgICAgICAgICAgICAgIElwQWRkcmVzcyBpcChuYW1lc2VydmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaXAudmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQtPmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoaXApKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyNlbmRpZiAgLy8gIV9XSU4zMgorICAgIH0KK307CisKKy8vIEN1cnJlbnQgcHJvY2Vzcy1nbG9iYWwgUmVzb2x2ZXIgaW5zdGFuY2UuCitEbnM6OlJlc29sdmVyKiBzUmVzb2x2ZXIgPSBudWxscHRyOworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitBZGRyZXNzTGlzdCBEbnM6OnJlc29sdmVOYW1lKFN0cmluZ1ZpZXcgc2VydmVyTmFtZSkgeworICAgIEFkZHJlc3NMaXN0IHJlc3VsdDsKKyAgICBpbnQgZXJyID0gRG5zOjpSZXNvbHZlcjo6Z2V0KCktPnJlc29sdmVOYW1lKHNlcnZlck5hbWUsICZyZXN1bHQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICByZXN1bHQuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitBZGRyZXNzTGlzdCBEbnM6OmdldFN5c3RlbVNlcnZlckxpc3QoKSB7CisgICAgQWRkcmVzc0xpc3QgcmVzdWx0OworICAgIGludCBlcnIgPSBEbnM6OlJlc29sdmVyOjpnZXQoKS0+Z2V0U3lzdGVtU2VydmVyTGlzdCgmcmVzdWx0KTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgcmVzdWx0LmNsZWFyKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworRG5zOjpSZXNvbHZlciogRG5zOjpSZXNvbHZlcjo6Z2V0KCkgeworICAgIGlmICghc1Jlc29sdmVyKSB7CisgICAgICAgIHNSZXNvbHZlciA9IG5ldyBTeXN0ZW1SZXNvbHZlcigpOworICAgIH0KKyAgICByZXR1cm4gc1Jlc29sdmVyOworfQorCisvLyBzdGF0aWMKK0Ruczo6UmVzb2x2ZXIqIERuczo6UmVzb2x2ZXI6OnNldEZvclRlc3RpbmcoRG5zOjpSZXNvbHZlciogcmVzb2x2ZXIpIHsKKyAgICBEbnM6OlJlc29sdmVyKiByZXN1bHQgPSBzUmVzb2x2ZXI7CisgICAgc1Jlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9uZXR3b3JrL0Rucy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9EbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDkxYWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9EbnMuaApAQCAtMCwwICsxLDgwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gd3JhcCB0aGUgc3lzdGVtJ3MgRE5TIHJlc29sdmVyLgorLy8KKy8vIFVzYWdlOgorLy8gICAgRG5zOjpBZGRyZXNzTGlzdCBsaXN0ID0gRG5zOjpyZXNvbHZlTmFtZSgiPHNlcnZlci1uYW1lPiIpOworLy8gICAgaWYgKGxpc3QuZW1wdHkoKSkgeyAuLi4gZXJyb3IgLi4uIH0KKy8vCitjbGFzcyBEbnMgeworcHVibGljOgorICAgIHVzaW5nIEFkZHJlc3NMaXN0ID0gc3RkOjp2ZWN0b3I8SXBBZGRyZXNzPjsKKworICAgIC8vIFJlc29sdmUgbmFtZSB8c2VydmVyX25hbWV8IGludG8gYSBsaXN0IG9mIElwQWRkcmVzcyBpbnN0YW5jZXMuCisgICAgLy8gUmV0dXJuIGFuIGVtcHR5IGxpc3Qgb24gZmFpbHVyZS4KKyAgICBzdGF0aWMgQWRkcmVzc0xpc3QgcmVzb2x2ZU5hbWUoU3RyaW5nVmlldyBzZXJ2ZXJfbmFtZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGxpc3Qgb2YgRE5TIHNlcnZlciBhZGRyZXNzZXMgdXNlZCBieSB0aGUgc3lzdGVtLgorICAgIC8vIFRoaXMgd29ya3MgYnkgZWl0aGVyIHBhcnNpbmcgL2V0Yy9yZXNvbHZlci5jb25mIG9uIFBvc2l4IG9yCisgICAgLy8gY2FsbGluZyB0aGUgYXBwcm9wcmlhdGUgV2luMzIgQVBJLgorICAgIHN0YXRpYyBBZGRyZXNzTGlzdCBnZXRTeXN0ZW1TZXJ2ZXJMaXN0KCk7CisKKyAgICAvLyBBYnN0cmFjdCBpbnRlcmZhY2UgdG8gYSBzeXN0ZW0gcmVzb2x2ZXIuCisgICAgLy8gVXNhZ2U6CisgICAgLy8gICAxKSBVc2UgUmVzb2x2ZXI6OmdldCgpIHRvIHJldHJpZXZlIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgLy8KKyAgICAvLyAgIDIpIFVzZSBSZXNvbHZlcjo6c2V0Rm9yVGVzdGluZygpIHRvIGluamVjdCBjdXN0b20gdmVyc2lvbiBkdXJpbmcKKyAgICAvLyAgICAgIHVuaXQtdGVzdHMuCisgICAgY2xhc3MgUmVzb2x2ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+UmVzb2x2ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gUGFyc2UgfHNlcnZlcl9uYW1lfCBhcyBhIEROUyBzZXJ2ZXIgbmFtZSBvciBJUCBhZGRyZXNzIGFuZAorICAgICAgICAvLyByZXNvbHZlcyBpdCB0byBhIGxpc3Qgb2YgSXBBZGRyZXNzIGluc3RhbmNlcy4gT24gc3VjY2VzcywgcmV0dXJuCisgICAgICAgIC8vIDAgYW5kIGFwcGVuZCByZXN1bHRzIHRvIHwqb3V0fC4gT24gZmFpbHVyZSwganVzdCByZXR1cm4gYSBuZWdhdGl2ZQorICAgICAgICAvLyBlcnJubyBjb2RlLgorICAgICAgICB2aXJ0dWFsIGludCByZXNvbHZlTmFtZShTdHJpbmdWaWV3IHNlcnZlcl9uYW1lLCBBZGRyZXNzTGlzdCogb3V0KSA9IDA7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHVzZWQgYnkgdGhlIHN5c3RlbS4gT24gc3VjY2VzcywKKyAgICAgICAgLy8gcmV0dXJuIDAgYW5kIGFwcGVuZCByZXN1bHRzIHRvIHwqb3V0fC4gT24gZmFpbHVyZSwganVzdCByZXR1cm4KKyAgICAgICAgLy8gYSBuZWdhdGl2ZSBlcnJubyBjb2RlLgorICAgICAgICB2aXJ0dWFsIGludCBnZXRTeXN0ZW1TZXJ2ZXJMaXN0KEFkZHJlc3NMaXN0KiBvdXQpID0gMDsKKworICAgICAgICAvLyBSZXR1cm4gY3VycmVudCBnbG9iYWwgcmVzb2x2ZXIgZm9yIHRoZSBwcm9jZXNzLiBUaGlzIGNhbiBiZQorICAgICAgICAvLyBhbHRlcmVkIHdpdGggc2V0Rm9yVGVzdGluZygpLiBOZXZlciByZXR1cm5zIG51bGxwdHIuIENyZWF0ZXMKKyAgICAgICAgLy8gYSBuZXcgaW5zdGFuY2UgbGF6aWx5IGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgc3RhdGljIFJlc29sdmVyKiBnZXQoKTsKKworICAgICAgICAvLyBDaGFuZ2UgdGhlIHByb2Nlc3MtZ2xvYmFsIHJlc29sdmVyLiBSZXR1cm4gdGhlIG9sZCBvbmUsIG9yCisgICAgICAgIC8vIG51bGxwdHIuIHxyZXNvbHZlcnwgY2FuIGJlIG51bGxwdHIsIGluIHdoaWNoIGNhc2UgYSBmdXR1cmUKKyAgICAgICAgLy8gY2FsbCB0byBnZXQoKSB3aWxsIGNyZWF0ZSBhIG5ldyBzeXN0ZW0tbGV2ZWwgcmVzb2x2ZXIKKyAgICAgICAgLy8gKGUuZy4gcmVwYXJzaW5nIC9ldGMvcmVzb2x2LmNvbmYgZXhwbGljaXRseSkuCisgICAgICAgIHN0YXRpYyBSZXNvbHZlciogc2V0Rm9yVGVzdGluZyhSZXNvbHZlciogcmVzb2x2ZXIpOworICAgIH07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGYwNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9EbnNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvR1Rlc3RVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3REbnNSZXNvbHZlci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKERucywgUmVzb2x2ZUxvY2FsaG9zdCkgeworICAgIC8vIFVzZSB0aGUgc3lzdGVtIHJlc29sdmVyIHRvIHJlc29sdmUgJ2xvY2FsaG9zdCcgYW5kIHByaW50IHRoZSByZXN1bHQuCisgICAgLy8gRG9uJ3QgY2hlY2sgYW55dGhpbmcgYmVjYXVzZSB0aGUgaG9zdCBzeXN0ZW0gY291bGQgYmUgbGl0ZXJhbGx5CisgICAgLy8gYW55dGhpbmcgOikKKyAgICBEbnM6OkFkZHJlc3NMaXN0IGxpc3QgPSBEbnM6OnJlc29sdmVOYW1lKCJsb2NhbGhvc3QiKTsKKyNpZm5kZWYgX1dJTjMyCisgICAgLy8gV2luZG93cyBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgJ2xvY2FsaG9zdCcsIHRoZSBsb29wYmFjayBhZGRyZXNzCisgICAgLy8gY2FuIGhhdmUgYSBzb3BoaXN0aWNhdGVkIG5hbWUgbGlrZSAiTG9vcGJhY2sgUHNldWRvLUludGVyZmFjZSAxIiBidXQKKyAgICAvLyBkb24ndCBjb3VudCBvbiBpdCAoYW5kIG11bHRpcGxlIGxvb3BiYWNrcyBjYW4gYmUgaW5zdGFsbGVkIHRvbyBpbgorICAgIC8vIGNlcnRhaW4gY2FzZXMpLiBTbyBvbmx5IGNoZWNrIHRoYXQgdGhlIGxpc3QgaXMgbm90IGVtcHR5IG9uIFBvc2l4LgorICAgIEVYUEVDVF9GQUxTRShsaXN0LmVtcHR5KCkpOworI2VuZGlmCisgICAgZm9yIChjb25zdCBhdXRvJiBhZGRyZXNzIDogbGlzdCkgeworICAgICAgICBMT0coSU5GTykgPDwgImxvY2FsaG9zdDogIiA8PCBhZGRyZXNzLnRvU3RyaW5nKCk7CisgICAgfQorfQorCitURVNUKERucywgUmVzb2x2ZVVua25vd25Ib3N0KSB7CisgICAgRG5zOjpBZGRyZXNzTGlzdCBsaXN0ID0gRG5zOjpyZXNvbHZlTmFtZSgiZG9lcy5ub3QuZXhpc3QuZXhhbXBsZS5jb20iKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0LmVtcHR5KCkpOworfQorCitURVNUKERucywgR2V0U3lzdGVtU2VydmVyTGlzdCkgeworICAgIERuczo6QWRkcmVzc0xpc3QgbGlzdCA9IERuczo6Z2V0U3lzdGVtU2VydmVyTGlzdCgpOworICAgIEVYUEVDVF9ORSgwLCBsaXN0LnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBhZGRyZXNzIDogbGlzdCkgeworICAgICAgICBMT0coSU5GTykgPDwgIkROUyBuYW1lc2VydmVyOiAiIDw8IGFkZHJlc3MudG9TdHJpbmcoKTsKKyAgICB9Cit9CisKK1RFU1QoRG5zLCBUZXN0RG5zUmVzb2x2ZXIpIHsKKyAgICBUZXN0RG5zUmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgcmVzb2x2ZXIuYWRkRW50cnkoImxvY2FsaG9zdCIsICIxMjcuMC4wLjIiKTsKKyAgICByZXNvbHZlci5hZGRFbnRyeSgid3d3LmV4YW1wbGUuY29tIiwgIjEwLjAuMy40Iik7CisgICAgcmVzb2x2ZXIuYWRkRW50cnkoInd3dy5leGFtcGxlLmNvbSIsICI6OjEwLjAuMy40Iik7CisKKyAgICBEbnM6OkFkZHJlc3NMaXN0IGxpc3QgPSBEbnM6OnJlc29sdmVOYW1lKCJsb2NhbGhvc3QiKTsKKyAgICBFWFBFQ1RfRVEoMVUsIGxpc3Quc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShsaXN0WzBdLnZhbGlkKCkpOworICAgIEVYUEVDVF9UUlVFKGxpc3RbMF0uaXNJcHY0KCkpOworICAgIEVYUEVDVF9FUSgweDdmMDAwMDAyVSwgbGlzdFswXS5pcHY0KCkpOworCisgICAgbGlzdCA9IERuczo6cmVzb2x2ZU5hbWUoInd3dy5leGFtcGxlLmNvbSIpOworICAgIEVYUEVDVF9FUSgyVSwgbGlzdC5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGxpc3RbMF0udmFsaWQoKSk7CisgICAgRVhQRUNUX1RSVUUobGlzdFswXS5pc0lwdjQoKSk7CisgICAgRVhQRUNUX0VRKDB4MGEwMDAzMDQsIGxpc3RbMF0uaXB2NCgpKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtFeHBlY3RlZFsxNl0gPSB7MCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAxMCwgMCwgMywgNH07CisgICAgRVhQRUNUX1RSVUUobGlzdFsxXS5pc0lwdjYoKSk7CisgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2goa0V4cGVjdGVkLCBsaXN0WzFdLmlwdjZBZGRyKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzLmNwcApAQCAtMCwwICsxLDIxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbmV0d29yay9JcEFkZHJlc3MuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisjaW5jbHVkZSA8aXBobHBhcGkuaD4KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisjaWZkZWYgX1dJTjMyCisKKy8vIFdpbmRvd3MgaGFzIEluZXRQdG9uQSgpIGFuZCBJbmV0TnRvcEEoKSBidXQgdGhlc2UgYXJlIG5vdCBpbXBsZW1lbnRlZAorLy8gYnkgV2luZSBpbiAzMi1iaXQgbW9kZSwgd2hpY2ggd2lsbCBhY3R1YWxseSBhYm9ydCB3aGVuIHJ1bm5pbmcgb3VyCisvLyB1bml0LXRlc3Qgc3VpdGUsIHNvIGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGhlcmUgZGlyZWN0bHk6CitzdGF0aWMgaW50IG15X2luZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIqIHNyYywgdm9pZCogZHN0KSB7CisgICAgaWYgKGFmID09IEFGX0lORVQpIHsKKyAgICAgICAgYXV0byBpbiA9IHN0YXRpY19jYXN0PHN0cnVjdCBpbl9hZGRyKj4oZHN0KTsKKyAgICAgICAgcmV0dXJuIG5ldFN0cmluZ1RvSXB2NChzcmMsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZpbi0+c19hZGRyKSk7CisgICAgfQorICAgIGlmIChhZiA9PSBBRl9JTkVUNikgeworICAgICAgICBhdXRvIGluNiA9IHN0YXRpY19jYXN0PHN0cnVjdCBpbjZfYWRkcio+KGRzdCk7CisgICAgICAgIHJldHVybiBuZXRTdHJpbmdUb0lwdjYoc3JjLCBpbjYtPnM2X2FkZHIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBpbmV0X3B0b24gbXlfaW5ldF9wdG9uCisKKy8vIEluZXROdG9wQSB3b3JrcyBvbiBXaW5lIHRob3VnaC4KKyNkZWZpbmUgaW5ldF9udG9wIEluZXROdG9wQQorI2VuZGlmCisKK0lwQWRkcmVzczo6SXBBZGRyZXNzKGNvbnN0IElwdjZBZGRyZXNzIGJ5dGVzLCB1aW50MzJfdCBzY29wZUlkKQorICAgIDogbUtpbmQoS2luZDo6SXB2NikgeworICAgIG1lbWNweShtSXB2Ni5tQWRkciwgYnl0ZXMsIHNpemVvZihtSXB2Ni5tQWRkcikpOworICAgIG1JcHY2Lm1TY29wZUlkID0gc2NvcGVJZDsKK30KKworSXBBZGRyZXNzOjpJcEFkZHJlc3MoY29uc3QgY2hhciogc3RyKSB7CisgICAgLy8gVHJ5IHRvIHBhcnNlIGl0IGFzIGFuIElQdjQgYWRkcmVzcyBmaXJzdC4KKyAgICBzdHJ1Y3QgaW5fYWRkciBpcDQ7CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVULCBzdHIsICZpcDQpID4gMCkgeworICAgICAgICBtS2luZCA9IEtpbmQ6OklwdjQ7CisgICAgICAgIG1JcHY0ID0gbnRvaGwoaXA0LnNfYWRkcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcGFyc2UgaXQgYXMgYW4gSVB2NiBhZGRyZXNzIHNlY29uZC4KKyAgICBzdGQ6OnN0cmluZyBzdHIyOworICAgIHN0cnVjdCBpbjZfYWRkciBpcDY7CisgICAgdWludDMyX3Qgc2NvcGVJZCA9IDA7CisgICAgY29uc3QgY2hhciogcCA9IDo6c3RyY2hyKHN0ciwgJyUnKTsKKyAgICBpZiAocCAhPSBudWxscHRyKSB7CisgICAgICAgIGludCBpZHggPSBuZXRTdHJpbmdUb0ludGVyZmFjZUluZGV4KHAgKyAxKTsKKyAgICAgICAgaWYgKGlkeCA8IDApIHsgIC8vIGludmFsaWQgaW50ZXJmYWNlIG5hbWUuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2NvcGVJZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpZHgpOworCisgICAgICAgIHN0cjIuYXNzaWduKHN0ciwgcCk7CisgICAgICAgIHN0ciA9IHN0cjIuY19zdHIoKTsKKyAgICB9CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgc3RyLCAmaXA2KSA+IDApIHsKKyAgICAgICAgbUtpbmQgPSBLaW5kOjpJcHY2OworICAgICAgICBtSXB2Ni5tU2NvcGVJZCA9IHNjb3BlSWQ7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKG1JcHY2Lm1BZGRyKSA9PSBzaXplb2YoaXA2LnM2X2FkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNpemUgb2YgSXB2NkFkZHJlc3MiKTsKKyAgICAgICAgbWVtY3B5KG1JcHY2Lm1BZGRyLCBpcDYuczZfYWRkciwgc2l6ZW9mKG1JcHY2Lm1BZGRyKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbnZhbGlkLgorICAgIG1LaW5kID0gS2luZDo6SW52YWxpZDsKK30KKworc3RkOjpzdHJpbmcgSXBBZGRyZXNzOjp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgc3dpdGNoIChtS2luZCkgeworICAgICAgICBjYXNlIEtpbmQ6OklwdjQ6IHsKKyAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyIGlwNDsKKyAgICAgICAgICAgIGlwNC5zX2FkZHIgPSBodG9ubChtSXB2NCk7CisgICAgICAgICAgICByZXN1bHQucmVzaXplKElORVRfQUREUlNUUkxFTik7CisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVCwgJmlwNCwgJnJlc3VsdFswXSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHJlc3VsdC5zaXplKCkpKTsKKyAgICAgICAgICAgIHJlc3VsdC5yZXNpemUoOjpzdHJsZW4ocmVzdWx0LmNfc3RyKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgS2luZDo6SXB2NjogeworICAgICAgICAgICAgc3RydWN0IGluNl9hZGRyIGlwNjsKKyAgICAgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGlwNi5zNl9hZGRyKSA9PSBzaXplb2YobUlwdjYubUFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJcHY2QWRkcmVzcyBzaXplIik7CisgICAgICAgICAgICBtZW1jcHkoaXA2LnM2X2FkZHIsIG1JcHY2Lm1BZGRyLCBzaXplb2YoaXA2LnM2X2FkZHIpKTsKKyAgICAgICAgICAgIHJlc3VsdC5yZXNpemUoSU5FVDZfQUREUlNUUkxFTik7CisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsICZpcDYsICZyZXN1bHRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXN1bHQuc2l6ZSgpKSk7CisgICAgICAgICAgICByZXN1bHQucmVzaXplKDo6c3RybGVuKHJlc3VsdC5jX3N0cigpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzdWx0ID0gIjxpbnZhbGlkPiI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBJcEFkZHJlc3M6Omhhc2goKSBjb25zdCB7CisgICAgc2l6ZV90IGhhc2ggPSAwVTsKKyAgICBzd2l0Y2ggKG1LaW5kKSB7CisgICAgICAgIGNhc2UgS2luZDo6SW52YWxpZDoKKyAgICAgICAgICAgIC8vIERvbid0IHdhbnQgMCBoZXJlLCBzaW5jZSBpdCdzIHRoZSBoYXNoIG9mIDAuMC4wLjAgYXMgd2VsbAorICAgICAgICAgICAgLy8gd2hpY2ggY2FuIGJlIHF1aXRlIGNvbW1vbi4KKyAgICAgICAgICAgIGhhc2ggPSAweDEyMzQ1Njc4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2luZDo6SXB2NDoKKyAgICAgICAgICAgIGhhc2ggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1JcHY0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtpbmQ6OklwdjY6CisgICAgICAgICAgICAvLyBUT0RPKGRpZ2l0KTogRmluZCBiZXR0ZXIgaGFzaCBmdW5jdGlvbj8KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKG1JcHY2Lm1BZGRyKTsgKytuKSB7CisgICAgICAgICAgICAgICAgaGFzaCA9IChoYXNoICogMzMpIF4gbUlwdjYubUFkZHJbbl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNoID0gaGFzaCBeIG1JcHY2Lm1TY29wZUlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoYXNoOworfQorCit2b2lkIElwQWRkcmVzczo6Y29weUZyb20oSXBBZGRyZXNzKiBkc3QsIGNvbnN0IElwQWRkcmVzcyogc3JjKSB7CisgICAgZHN0LT5tS2luZCA9IHNyYy0+bUtpbmQ7CisgICAgc3dpdGNoIChkc3QtPm1LaW5kKSB7CisgICAgICAgIGNhc2UgS2luZDo6SW52YWxpZDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtpbmQ6OklwdjQ6CisgICAgICAgICAgICBkc3QtPm1JcHY0ID0gc3JjLT5tSXB2NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtpbmQ6OklwdjY6CisgICAgICAgICAgICBkc3QtPm1JcHY2ID0gc3JjLT5tSXB2NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVXNlZnVsIHRvIGRldGVjdCBjb3JydXB0ZWQgaW5zdGFuY2VzLgorICAgICAgICAgICAgRENIRUNLKGZhbHNlKSA8PCAiSW52YWxpZCBJcEFkZHJlc3MgbUtpbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KGRzdC0+bUtpbmQpOworICAgIH0KK30KKworYm9vbCBJcEFkZHJlc3M6Om9wZXJhdG9yPT0oY29uc3QgSXBBZGRyZXNzJiBvdGhlcikgY29uc3QgeworICAgIGlmIChtS2luZCAhPSBvdGhlci5tS2luZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN3aXRjaCAobUtpbmQpIHsKKyAgICAgICAgY2FzZSBLaW5kOjpJbnZhbGlkOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgY2FzZSBLaW5kOjpJcHY0OgorICAgICAgICAgICAgcmV0dXJuIG1JcHY0ID09IG90aGVyLm1JcHY0OworCisgICAgICAgIGNhc2UgS2luZDo6SXB2NjoKKyAgICAgICAgICAgIHJldHVybiBtSXB2Ni5tU2NvcGVJZCA9PSBvdGhlci5tSXB2Ni5tU2NvcGVJZCAmJgorICAgICAgICAgICAgICAgICAgICFtZW1jbXAobUlwdjYubUFkZHIsIG90aGVyLm1JcHY2Lm1BZGRyLCBzaXplb2YobUlwdjYubUFkZHIpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRENIRUNLKGZhbHNlKSA8PCAiSW52YWxpZCBJcEFkZHJlc3MgbUtpbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KG1LaW5kKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgSXBBZGRyZXNzOjpvcGVyYXRvcjwoY29uc3QgSXBBZGRyZXNzJiBvdGhlcikgY29uc3QgeworICAgIGlmIChtS2luZCAhPSBvdGhlci5tS2luZCkgeworICAgICAgICAvLyBJbnZhbGlkIGFkZHJlc3NlcyBhcmUgYWx3YXlzIHNtYWxsZXIgdGhhbiB2YWxpZCBvbmVzLgorICAgICAgICAvLyBJcHY0IGFkZHJlc3NlcyBhcmUgc21hbGxlciB0aGFuIElQdjYgb25lcy4KKyAgICAgICAgcmV0dXJuIG1LaW5kIDwgb3RoZXIubUtpbmQ7CisgICAgfQorICAgIHN3aXRjaCAobUtpbmQpIHsKKyAgICAgICAgY2FzZSBLaW5kOjpJbnZhbGlkOgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEtpbmQ6OklwdjQ6CisgICAgICAgICAgICByZXR1cm4gKG1JcHY0IDwgb3RoZXIubUlwdjQpOworICAgICAgICBjYXNlIEtpbmQ6OklwdjY6CisgICAgICAgICAgICBpbnQgcmV0ID0gOjptZW1jbXAobUlwdjYubUFkZHIsIG90aGVyLm1JcHY2Lm1BZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtSXB2Ni5tQWRkcikpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQgPCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1JcHY2Lm1TY29wZUlkIDwgb3RoZXIubUlwdjYubVNjb3BlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9JcEFkZHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjgzZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9JcEFkZHJlc3MuaApAQCAtMCwwICsxLDE4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBlbmNhcHN1bGF0ZSBhbiBJUHY0IG9yIElQdjYgYWRkcmVzcy4KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gICAxKSBJUHY0IGFkZHJlc3NlczoKKy8vICAgICAgICAgICBJcEFkZHJlc3MgaXAoMHg3ZjAwMDAwMSk7ICAgLy8gaG9zdC1vcmRlciBlbmNvZGluZy4KKy8vICAgICAgICAgICBDSEVDSyhpcC5pc0lwdjQoKSk7CisvLyAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcyA9IGlwLmlwdjQoKTsgICAvLyByZWFkIGhvc3Qtb3JkZXIgMzItYml0IGFkZHJlc3MuCisvLworLy8gICAyKSBJUHY2IGFkZHJlc3M6CisvLyAgICAgICAgICAgSXBBZGRyZXNzIGlwKHswLDAsMCwwLDAsLi4uLi4sMCwxfSk7ICAgLy8gMTYtYnl0ZSBJUHY2IGFkZHJlc3MuCisvLyAgICAgICAgICAgQ0hFQ0soaXAuaXNJcHY2KCkpOworLy8gICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFkZHJlc3MgPSBpcC5pcHY2QWRkcigpOworLy8KKy8vICAgMykgSVB2NiBhZGRyZXNzIHdpdGggc2NvcGUgaWQ6CisvLyAgICAgICAgICAgSXBBZGRyZXNzIGlwKHsuLi4ufSwgMSk7ICAvLyAxNi1ieXRlIGFkZHJlc3MgKyBub24tMCBzY29wZS1pZC4KKy8vICAgICAgICAgICBDSEVDSyhpcC5pc0lwdjYoKSk7CisvLyAgICAgICAgICAgY29uc3QgdWludDhfdCogYWRkcmVzcyA9IGlwLmlwdjYuYWRkcjsKKy8vICAgICAgICAgICB1aW50MzJfdCBzY29wZV9pZCA9IGlwLmlwdjZTY29wZWRJZCgpOworLy8KKy8vICAgNCkgSW5pdGlhbGl6ZSBmcm9tIHN0cmluZyByZXByZXNlbnRhdGlvbjoKKy8vICAgICAgICAgICBJcEFkZHJlc3MgaXAxKCIxMjcuMC4wLjEiKTsKKy8vICAgICAgICAgICBDSEVDSyhpcDEuaXNWYWxpZCgpKTsKKy8vICAgICAgICAgICBDSEVDSyhpcDEuaXNJcHY0KCkpOworLy8gICAgICAgICAgIEFTU0VSVF9FUSgweDdmMDAwMDAxLCBpcDEuaXB2NCgpKTsKKy8vCisvLyAgICAgICAgICAgSXBBZGRyZXNzIGlwMigiOjoxIik7CisvLyAgICAgICAgICAgQ0hFQ0soaXAyLmlzVmFsaWQoKSk7CisvLyAgICAgICAgICAgQ0hFQ0soaXAyLmlzSXB2NigpKTsKKy8vICAgICAgICAgICBBU1NFUlRfVFJVRShSYW5nZXNNYXRjaChpcDIuaXB2Ni5hZGRyLCB7MCwwLDAsLi4uLiwwLDF9KTsKKy8vICAgICAgICAgICBBU1NFUlRfRVEoMCwgaXAyLmlwdjZTY29wZUlkKCkpOworLy8KKy8vICAgICAgICAgICBJcEFkZHJlc3MgaXAzKCI6OjJAMyIpOworLy8gICAgICAgICAgIENIRUNLKGlwMy5pc1ZhbGlkKCkpOworLy8gICAgICAgICAgIENIRUNLKGlwMy5pc0lwdjYoKSk7CisvLyAgICAgICAgICAgQVNTRVJUX1RSVUUoUmFuZ2VzTWF0Y2goaXAzLmlwdjZBZGRyKCksIHswLDAsMCwuLi4uLDAsMn0pOworLy8gICAgICAgICAgIEFTU0VSVF9FUSgzLCBpcDMuaXB2NlNjb3BlSWQoKSk7CisvLworLy8gICA1KSBDb252ZXJ0IHRvIHN0cmluZyByZXByZXNlbnRhdGlvbjoKKy8vICAgICAgICAgICBJcEFkZHJlc3MgaXAgPSAuLi47CisvLyAgICAgICAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IGlwLnRvU3RyaW5nKCk7CisvLworY2xhc3MgSXBBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICB1c2luZyBJcHY2QWRkcmVzcyA9IHVpbnQ4X3RbMTZdOworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBJcEFkZHJlc3MoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW4gSVB2NCBhZGRyZXNzIGluc3RhbmNlLgorICAgIC8vIHxpcHwgaXMgYSBob3N0LW9yZGVyIDMyLWJpdCBJUCBhZGRyZXNzIChlLmcuIDB4N2YwMDAwMDEgZm9yIDEyNy4wLjAuMSkuCisgICAgZXhwbGljaXQgSXBBZGRyZXNzKHVpbnQzMl90IGlwKSA6IG1LaW5kKEtpbmQ6OklwdjQpLCBtSXB2NChpcCkge30KKworICAgIC8vIENvbnN0cnVjdCBhbiBJUHY2IGFkZHJlc3MgaW5zdGFuY2UuIHxieXRlc3wgY29udGFpbnMgdGhlIGFkZHJlc3MKKyAgICAvLyBhbmQgfHNjb3BlX2lkfCB0aGUgb3B0aW9uYWwgc2NvcGUgaWQsIHdoaWNoIGlzIGEgc3lzdGVtLXNwZWNpZmljCisgICAgLy8gbmV0d29yayBpbnRlcmZhY2UgaW5kZXggKHNlZSBpZl9uYW1ldG9pbmRleCgpKS4KKyAgICBJcEFkZHJlc3MoY29uc3QgSXB2NkFkZHJlc3MgYnl0ZXMsIHVpbnQzMl90IHNjb3BlX2lkID0gMCk7CisKKyAgICAvLyBDb25zdHJ1Y3QgYW4gaW5zdGFuY2UgZnJvbSB8c3RyaW5nfCB3aGljaCBtdXN0IGJlIGVpdGhlciBhbiBJUHY0CisgICAgLy8gZG90dGVkLWRlY2ltYWwgYWRkcmVzcywgb2YgYSBjb2x1bW4tc2VwYXJhdGVkIElQdjYgYWRkcmVzcywgcG9zc2libHkKKyAgICAvLyBmb2xsb3dlZCBieSBhICclJyBhbmQgYSBzY29wZSBpZC4gQ2FsbGVyIHNob3VsZCBsYXRlciBjYWxsIHZhbGlkKCkKKyAgICAvLyB0byBlbnN1cmUgdGhlIGlucHV0IHxzdHJpbmd8IHdhcyB2YWxpZC4KKyAgICBleHBsaWNpdCBJcEFkZHJlc3MoY29uc3QgY2hhciogc3RyaW5nKTsKKworICAgIC8vIEEgdmFyaWFudCBvZiB0aGUgYWJvdmUgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIGNvbnN0IHN0ZDo6c3RyaW5nJgorICAgIC8vIHBhcmFtZXRlciBpbnN0ZWFkLgorICAgIGV4cGxpY2l0IElwQWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSA6IElwQWRkcmVzcyhzdHIuY19zdHIoKSkge30KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpbnN0YW5jZSBpcyB2YWxpZC4KKyAgICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gbUtpbmQgPT0gS2luZDo6SXB2NCB8fCBtS2luZCA9PSBLaW5kOjpJcHY2OyB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgaW5zdGFuY2UgaXMgSVB2NC4KKyAgICBib29sIGlzSXB2NCgpIGNvbnN0IHsgcmV0dXJuIG1LaW5kID09IEtpbmQ6OklwdjQ7IH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpbnN0YW5jZSBpcyBJUHY2LgorICAgIGJvb2wgaXNJcHY2KCkgY29uc3QgeyByZXR1cm4gbUtpbmQgPT0gS2luZDo6SXB2NjsgfQorCisgICAgLy8gUmV0dXJuIElQdjQgYWRkcmVzcyBhcyBhIDMyLWJpdCBob3N0LW9yZGVyIHZhbHVlLgorICAgIC8vIFJlc3VsdCBpcyBvbmx5IHZhbGlkIGlmZiBpc0lwdjQoKSBpcyB0cnVlLgorICAgIHVpbnQzMl90IGlwdjQoKSBjb25zdCB7IHJldHVybiBtSXB2NDsgfQorCisgICAgLy8gUmV0dXJuIHRoZSAxMjgtYml0IGFkZHJlc3Mgb2YgYW4gSVB2NiBpbnN0YW5jZS4KKyAgICAvLyBSZXN1bHQgaXMgb25seSB2YWxpZCBpZmYgaXNJcHY2KCkgaXMgdHJ1ZSwgYW5kIGlzIGEgcG9pbnRlcgorICAgIC8vIHRvIGEgMTYtYnl0ZSBhcnJheSBvZiBieXRlcy4KKyAgICBjb25zdCBJcHY2QWRkcmVzcyYgaXB2NkFkZHIoKSBjb25zdCB7IHJldHVybiBtSXB2Ni5tQWRkcjsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBvcHRpb25hbCBzY29wZS1pZCBvZiBhbiBJUHY2IGluc3RhbmNlLgorICAgIC8vIFJlc3VsdCBpcyBvbmx5IGRlZmluZWQgaWZmIGlzSXB2NigpIGlzIHRydWUsIGFuZCB3aWxsIGJlIDAKKyAgICAvLyBpZiB0aGVyZSBpcyBubyBzY29wZS1pZCwgb3RoZXJ3aXNlIHdpbGwgYmUgdGhlIHN5c3RlbS1zcGVjaWZpYworICAgIC8vIGluZGV4IG9mIGEgbG9jYWwgbmV0d29yayBpbnRlcmZhY2UuCisgICAgdWludDMyX3QgaXB2NlNjb3BlSWQoKSBjb25zdCB7IHJldHVybiBtSXB2Ni5tU2NvcGVJZDsgfQorCisgICAgLy8gQ29weSBhbmQgTW92ZSBvcGVyYXRpb25zLgorICAgIElwQWRkcmVzcyhjb25zdCBJcEFkZHJlc3MmIG90aGVyKSB7IGNvcHlGcm9tKHRoaXMsICZvdGhlcik7IH0KKworICAgIElwQWRkcmVzcyYgb3BlcmF0b3I9KGNvbnN0IElwQWRkcmVzcyYgb3RoZXIpIHsKKyAgICAgICAgaWYgKCp0aGlzICE9IG90aGVyKSB7CisgICAgICAgICAgICBjb3B5RnJvbSh0aGlzLCAmb3RoZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJcEFkZHJlc3MoSXBBZGRyZXNzJiYgb3RoZXIpIHsgY29weUZyb20odGhpcywgJm90aGVyKTsgfQorCisgICAgSXBBZGRyZXNzJiBvcGVyYXRvcj0oSXBBZGRyZXNzJiYgb3RoZXIpIHsKKyAgICAgICAgY29weUZyb20odGhpcywgJm90aGVyKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIEVxdWFsaXR5IGNvbXBhcmF0b3IuCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IElwQWRkcmVzcyYgb3RoZXIpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IElwQWRkcmVzcyYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyAgICAvLyBMZXNzLXRoYW4gb3BlcmF0b3IsIHVzZWQgZm9yIGluY2x1c2lvbiBpbiBvcmRlcmVkIGNvbnRhaW5lcnMuCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgSXBBZGRyZXNzJiBvdGhlcikgY29uc3Q7CisKKyAgICAvLyBDb252ZXJ0IGluc3RhbmNlIHRvIGEgc3RkOjpzdHJpbmcuCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIENvbXB1dGUgYSBoYXNoIGZvciB0aGlzIGluc3RhbmNlLgorICAgIHNpemVfdCBoYXNoKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gVHlwZSBvZiBzdXBwb3J0ZWQgSVAgYWRkcmVzc2VzLgorICAgIGVudW0gY2xhc3MgS2luZCB7CisgICAgICAgIEludmFsaWQgPSAtMSwKKyAgICAgICAgSXB2NCA9IDQsCisgICAgICAgIElwdjYgPSA2LAorICAgIH07CisKKyAgICBzdGF0aWMgdm9pZCBjb3B5RnJvbShJcEFkZHJlc3MqIGRzdCwgY29uc3QgSXBBZGRyZXNzKiBzcmMpOworCisgICAgS2luZCBtS2luZCA9IEtpbmQ6OkludmFsaWQ7CisgICAgdW5pb24geworICAgICAgICB1aW50MzJfdCBtSXB2NDsgIC8vIDMyLWJpdCBJUCBhZGRyZXNzLCBob3N0LW9yZGVyLgorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgSXB2NkFkZHJlc3MgbUFkZHI7ICAvLyAxMjgtYml0IElQdjYgYWRkcmVzcy4KKyAgICAgICAgICAgIHVpbnQzMl90CisgICAgICAgICAgICAgICAgICAgIG1TY29wZUlkOyAgLy8gMCwgb3Igc3lzdGVtLXNwZWNpZmljIG5ldHdvcmsgaW50ZXJmYWNlIGluZGV4LgorICAgICAgICB9IG1JcHY2OworICAgIH07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gc3RkOjpoYXNoPD4gc3VwcG9ydCBmb3IgaW5jbHVzaW9uIGluIHVub3JkZXJlZCBjb250YWluZXJzLgorbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxhbmRyb2lkOjpiYXNlOjpJcEFkZHJlc3M+IHsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmJhc2U6OklwQWRkcmVzcyBhcmd1bWVudF90eXBlOworICAgIHR5cGVkZWYgc2l6ZV90IHJlc3VsdF90eXBlOworICAgIGlubGluZSByZXN1bHRfdHlwZSBvcGVyYXRvcigpKGNvbnN0IGFyZ3VtZW50X3R5cGUmIGEpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGEuaGFzaCgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDBmZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9JcEFkZHJlc3NfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzA4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9HVGVzdFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdE5ldHdvcmtJbnRlcmZhY2VOYW1lUmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworVEVTVChJcEFkZHJlc3MsIERlZmF1bHRDb25zdHJ1Y3RvcikgeworICAgIElwQWRkcmVzcyBhZGRyOworICAgIEVYUEVDVF9GQUxTRShhZGRyLnZhbGlkKCkpOworICAgIEVYUEVDVF9GQUxTRShhZGRyLmlzSXB2NCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYWRkci5pc0lwdjYoKSk7Cit9CisKK1RFU1QoSXBBZGRyZXNzLCBDb25zdHJ1Y3RvcklwdjQpIHsKKyAgICBJcEFkZHJlc3MgYWRkcjEoMHgxMjM0NTY3OCk7CisgICAgRVhQRUNUX1RSVUUoYWRkcjEudmFsaWQoKSk7CisgICAgRVhQRUNUX1RSVUUoYWRkcjEuaXNJcHY0KCkpOworICAgIEVYUEVDVF9FUSgweDEyMzQ1Njc4LCBhZGRyMS5pcHY0KCkpOworfQorCitURVNUKElwQWRkcmVzcywgQ29weU9wZXJhdGlvbnMpIHsKKyAgICBJcEFkZHJlc3MgYWRkcjAoMHgxMjM0NTY3OCk7CisKKyAgICBJcEFkZHJlc3MgYWRkcjEoYWRkcjApOyAgLy8gY29weS1jb25zdHJ1Y3Rvci4KKyAgICBFWFBFQ1RfVFJVRShhZGRyMS5pc0lwdjQoKSk7CisgICAgRVhQRUNUX0VRKGFkZHIwLmlwdjQoKSwgYWRkcjEuaXB2NCgpKTsKKyAgICBFWFBFQ1RfRVEoYWRkcjAuaXB2NCgpLCBhZGRyMC5pcHY0KCkpOworCisgICAgSXBBZGRyZXNzIGFkZHIyOworICAgIEVYUEVDVF9GQUxTRShhZGRyMi5pc0lwdjQoKSk7CisgICAgYWRkcjIgPSBhZGRyMDsgIC8vIGNvcHktYXNzaWdubWVudAorICAgIEVYUEVDVF9UUlVFKGFkZHIyLmlzSXB2NCgpKTsKKyAgICBFWFBFQ1RfRVEoYWRkcjIuaXB2NCgpLCBhZGRyMC5pcHY0KCkpOworfQorCitURVNUKElwQWRkcmVzcywgQ29uc3RydWN0b3JJcHY2KSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWRkcjZbMTZdID0geworICAgICAgICAgICAgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHg5YSwgMHhiYywgMHhkZSwgMHhmMCwKKyAgICAgICAgICAgIDB4MGYsIDB4ZWQsIDB4Y2IsIDB4YTksIDB4ODcsIDB4NjUsIDB4NDMsIDB4MjEsCisgICAgfTsKKworICAgIElwQWRkcmVzcyBhZGRyMShhZGRyNik7CisgICAgRVhQRUNUX1RSVUUoYWRkcjEudmFsaWQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFkZHIxLmlzSXB2NCgpKTsKKyAgICBFWFBFQ1RfVFJVRShhZGRyMS5pc0lwdjYoKSk7CisgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2goYWRkcjYsIGFkZHIxLmlwdjZBZGRyKCkpKTsKK30KKworVEVTVChJcEFkZHJlc3MsIENvbnN0cnVjdG9yRnJvbVN0cmluZ0lwdjQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRfdmFsaWQ7CisgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkX2lwOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIHsiMC4wLjAuMCIsIHRydWUsIDB4MDAwMDAwMDBVfSwKKyAgICAgICAgICAgIHsiMTI3LjAuMC4xIiwgdHJ1ZSwgMHg3ZjAwMDAwMVV9LAorICAgICAgICAgICAgeyIwLjAuMC4yNTUiLCB0cnVlLCAweDAwMDAwMEZGVX0sCisgICAgICAgICAgICB7IjAuMC4wLjI1NiIsIGZhbHNlLCAwfSwKKyAgICAgICAgICAgIHsiMS4yLjMuNDUiLCB0cnVlLCAweDAxMDIwMzJEVX0sCisgICAgICAgICAgICB7IjEuMi4zLjQiLCB0cnVlLCAweDAxMDIwMzA0VX0sCisgICAgICAgICAgICB7IjEuMi4zLiIsIGZhbHNlLCAwfSwKKyAgICAgICAgICAgIHsiMS4yLjMiLCBmYWxzZSwgMH0sCisgICAgICAgICAgICB7IjEuMi4iLCBmYWxzZSwgMH0sCisgICAgICAgICAgICB7IjEuMiIsIGZhbHNlLCAwfSwKKyAgICAgICAgICAgIHsiMS4iLCBmYWxzZSwgMH0sCisgICAgICAgICAgICB7IjEuIiwgZmFsc2UsIDB9LAorICAgICAgICAgICAgeyIxIiwgZmFsc2UsIDB9LAorICAgIH07CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDoga0RhdGEpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGV4dCA9ICJQYXJzaW5nIElQdjQgYWRkcmVzcyBbIjsKKyAgICAgICAgdGV4dCArPSBpdGVtLmlucHV0OworICAgICAgICB0ZXh0ICs9ICJdIjsKKyAgICAgICAgSXBBZGRyZXNzIGFkZHIoaXRlbS5pbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkX3ZhbGlkLCBhZGRyLnZhbGlkKCkpIDw8IHRleHQ7CisgICAgICAgIGlmIChpdGVtLmV4cGVjdGVkX3ZhbGlkICYmIGFkZHIudmFsaWQoKSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoYWRkci5pc0lwdjQoKSkgPDwgdGV4dDsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkX2lwLCBhZGRyLmlwdjQoKSkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChJcEFkZHJlc3MsIENvbnN0cnVjdG9yRnJvbVN0cmluZ0lwdjYpIHsKKyAgICBUZXN0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciByZXNvbHZlcjsKKyAgICByZXNvbHZlci5hZGRFbnRyeSgibG9vcCIsIDEpOworICAgIHJlc29sdmVyLmFkZEVudHJ5KCJldGhlciIsIDIpOworCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGlucHV0OworICAgICAgICBib29sIGV4cGVjdGVkX3ZhbGlkOworICAgICAgICB1aW50OF90IGV4cGVjdGVkX2lwNlsxNl07CisgICAgICAgIHVpbnQzMl90IGV4cGVjdGVkX3Njb3BlX2lkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIHsiOjoxIiwgdHJ1ZSwgezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDF9LCAwfSwKKyAgICAgICAgICAgIHsiZmZmZTo6MjA0LjE1Mi4xODkuMTE2IiwKKyAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgIHsyNTUsIDI1NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMjA0LCAxNTIsIDE4OSwgMTE2fSwKKyAgICAgICAgICAgICAwfSwKKyAgICAgICAgICAgIHsiOjoxJVVua25vd24gSW50ZXJmYWNlIiwgZmFsc2UsIHt9LCAwfSwKKyAgICAgICAgICAgIHsiOjoyJTE1IiwKKyAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAyfSwKKyAgICAgICAgICAgICAxNX0sCisgICAgICAgICAgICB7Ijo6MyVsb29wIiwKKyAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzfSwKKyAgICAgICAgICAgICAxfSwKKyAgICAgICAgICAgIHsiOjo0JWV0aGVyIiwKKyAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0fSwKKyAgICAgICAgICAgICAyfSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGtEYXRhKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRleHQgPSAiUGFyc2luZyBJUHY2IGFkZHJlc3MgWyI7CisgICAgICAgIHRleHQgKz0gaXRlbS5pbnB1dDsKKyAgICAgICAgdGV4dCArPSAiXSI7CisgICAgICAgIElwQWRkcmVzcyBhZGRyKGl0ZW0uaW5wdXQpOworICAgICAgICBFWFBFQ1RfRVEoaXRlbS5leHBlY3RlZF92YWxpZCwgYWRkci52YWxpZCgpKSA8PCB0ZXh0OworICAgICAgICBpZiAoaXRlbS5leHBlY3RlZF92YWxpZCAmJiBhZGRyLnZhbGlkKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGFkZHIuaXNJcHY2KCkpIDw8IHRleHQ7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShSYW5nZXNNYXRjaChpdGVtLmV4cGVjdGVkX2lwNiwgYWRkci5pcHY2QWRkcigpKSkKKyAgICAgICAgICAgICAgICAgICAgPDwgdGV4dDsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkX3Njb3BlX2lkLCBhZGRyLmlwdjZTY29wZUlkKCkpIDw8IHRleHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoSXBBZGRyZXNzLCB0b1N0cmluZ0lwdjQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgdWludDMyX3QgaW5wdXQ7CisgICAgICAgIFN0cmluZ1ZpZXcgZXhwZWN0ZWQ7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICAgICAgezB4MDAwMDAwMDBVLCAiMC4wLjAuMCJ9LAorICAgICAgICAgICAgezB4N2YwMDAwMDFVLCAiMTI3LjAuMC4xIn0sCisgICAgICAgICAgICB7MHhmZmZmZmZmZlUsICIyNTUuMjU1LjI1NS4yNTUifSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGtEYXRhKSB7CisgICAgICAgIElwQWRkcmVzcyBpcChpdGVtLmlucHV0KTsKKyAgICAgICAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGl0ZW0uZXhwZWN0ZWQpLCBpcC50b1N0cmluZygpKSA8PCAiRm9yIElQdjQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZW0uaW5wdXQ7CisgICAgfQorfQorCitURVNUKElwQWRkcmVzcywgdG9TdHJpbmdJcHY2KSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgaW5wdXRbMTZdOworICAgICAgICBTdHJpbmdWaWV3IGV4cGVjdGVkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIHt7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sICI6OiJ9LAorICAgICAgICAgICAge3swLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxfSwgIjo6MSJ9LAorICAgICAgICAgICAge3syNTUsIDI1NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMjA0LCAxNTIsIDE4OSwgMTE2fSwKKyAgICAgICAgICAgICAiZmZmZTo6Y2M5ODpiZDc0In0sCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBrRGF0YSkgeworICAgICAgICBJcEFkZHJlc3MgaXAoaXRlbS5pbnB1dCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRleHQ7CisgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgMTY7IG4gKz0gMikgeworICAgICAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KCZ0ZXh0LCAiJTAyeCUwMng6IiwgaXRlbS5pbnB1dFtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmlucHV0W24gKyAxXSk7CisgICAgICAgIH0KKyAgICAgICAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGl0ZW0uZXhwZWN0ZWQpLCBpcC50b1N0cmluZygpKSA8PCAiRm9yIElQdjYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRleHQ7CisgICAgfQorfQorCitURVNUKElwQWRkcmVzcywgaGFzaCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBzaXplX3QgZXhwZWN0ZWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3M7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICAgICAgezB4MTIzNDU2NzgsICI8aW52YWxpZD4ifSwKKyAgICAgICAgICAgIHswLCAiMC4wLjAuMCJ9LAorICAgICAgICAgICAgezB4N2YwMDAwMDEsICIxMjcuMC4wLjEifSwKKyAgICAgICAgICAgIHsxLCAiOjoxIn0sCisgICAgICAgICAgICB7MTMsICI6OjIlMTUifSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGtEYXRhKSB7CisgICAgICAgIElwQWRkcmVzcyBpcChpdGVtLmFkZHJlc3MpOworICAgICAgICBFWFBFQ1RfRVEoaXRlbS5leHBlY3RlZCwgaXAuaGFzaCgpKSA8PCAiRm9yIGFkZHJlc3MgWyIgPDwgaXRlbS5hZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdIjsKKyAgICB9Cit9CisKK1RFU1QoSXBBZGRyZXNzLCBvcGVyYXRvckVxdWFscykgeworICAgIElwQWRkcmVzcyBpcDA7CisgICAgSXBBZGRyZXNzIGlwMSgweDAwMDAwMDAwVSk7CisgICAgSXBBZGRyZXNzIGlwMigweDdmMDAwMDAxVSk7CisgICAgSXBBZGRyZXNzIGlwMygiOjoiKTsKKyAgICBJcEFkZHJlc3MgaXA0KCI6OjEiKTsKKyAgICBJcEFkZHJlc3MgaXA1KCI6OjElMiIpOworICAgIElwQWRkcmVzcyBpcDYoIjo6MSU0Iik7CisKKyAgICBFWFBFQ1RfVFJVRShpcDAgPT0gaXAwKTsKKyAgICBFWFBFQ1RfVFJVRShpcDEgPT0gaXAxKTsKKyAgICBFWFBFQ1RfVFJVRShpcDIgPT0gaXAyKTsKKyAgICBFWFBFQ1RfVFJVRShpcDMgPT0gaXAzKTsKKyAgICBFWFBFQ1RfVFJVRShpcDQgPT0gaXA0KTsKKyAgICBFWFBFQ1RfVFJVRShpcDUgPT0gaXA1KTsKKyAgICBFWFBFQ1RfVFJVRShpcDYgPT0gaXA2KTsKKworICAgIEVYUEVDVF9GQUxTRShpcDAgPT0gaXAxKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXAwID09IGlwMik7CisgICAgRVhQRUNUX0ZBTFNFKGlwMCA9PSBpcDMpOworICAgIEVYUEVDVF9GQUxTRShpcDAgPT0gaXA0KTsKKyAgICBFWFBFQ1RfRkFMU0UoaXAwID09IGlwNSk7CisgICAgRVhQRUNUX0ZBTFNFKGlwMCA9PSBpcDYpOworCisgICAgRVhQRUNUX0ZBTFNFKGlwMSA9PSBpcDIpOworICAgIEVYUEVDVF9GQUxTRShpcDEgPT0gaXAzKTsKKworICAgIEVYUEVDVF9GQUxTRShpcDMgPT0gaXA0KTsKKyAgICBFWFBFQ1RfRkFMU0UoaXAzID09IGlwNSk7CisgICAgRVhQRUNUX0ZBTFNFKGlwMyA9PSBpcDYpOworCisgICAgRVhQRUNUX0ZBTFNFKGlwNCA9PSBpcDUpOworICAgIEVYUEVDVF9GQUxTRShpcDUgPT0gaXA2KTsKK30KKworVEVTVChJcEFkZHJlc3MsIG9wZXJhdG9yTm90RXF1YWxzKSB7CisgICAgSXBBZGRyZXNzIGlwMDsKKyAgICBJcEFkZHJlc3MgaXAxKDB4MDAwMDAwMDBVKTsKKyAgICBJcEFkZHJlc3MgaXAyKDB4N2YwMDAwMDFVKTsKKyAgICBJcEFkZHJlc3MgaXAzKCI6OiIpOworICAgIElwQWRkcmVzcyBpcDQoIjo6MSIpOworICAgIElwQWRkcmVzcyBpcDUoIjo6MSUyIik7CisgICAgSXBBZGRyZXNzIGlwNigiOjoxJTQiKTsKKworICAgIEVYUEVDVF9GQUxTRShpcDAgIT0gaXAwKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXAxICE9IGlwMSk7CisgICAgRVhQRUNUX0ZBTFNFKGlwMiAhPSBpcDIpOworICAgIEVYUEVDVF9GQUxTRShpcDMgIT0gaXAzKTsKKyAgICBFWFBFQ1RfRkFMU0UoaXA0ICE9IGlwNCk7CisgICAgRVhQRUNUX0ZBTFNFKGlwNSAhPSBpcDUpOworICAgIEVYUEVDVF9GQUxTRShpcDYgIT0gaXA2KTsKKworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDEpOworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDIpOworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDMpOworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDQpOworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDUpOworICAgIEVYUEVDVF9UUlVFKGlwMCAhPSBpcDYpOworCisgICAgRVhQRUNUX1RSVUUoaXAxICE9IGlwMik7CisgICAgRVhQRUNUX1RSVUUoaXAxICE9IGlwMyk7CisKKyAgICBFWFBFQ1RfVFJVRShpcDMgIT0gaXA0KTsKKyAgICBFWFBFQ1RfVFJVRShpcDMgIT0gaXA1KTsKKyAgICBFWFBFQ1RfVFJVRShpcDMgIT0gaXA2KTsKKworICAgIEVYUEVDVF9UUlVFKGlwNCAhPSBpcDUpOworICAgIEVYUEVDVF9UUlVFKGlwNSAhPSBpcDYpOworfQorCitURVNUKElwQWRkcmVzcywgb3BlcmF0b3JMZXNzVGhhbikgeworICAgIElwQWRkcmVzcyBpcDA7CisgICAgSXBBZGRyZXNzIGlwMSgweDAwMDAwMDAwVSk7CisgICAgSXBBZGRyZXNzIGlwMigweDdmMDAwMDAxVSk7CisgICAgSXBBZGRyZXNzIGlwMygweDgwODA4MDgwKTsKKyAgICBJcEFkZHJlc3MgaXA0KCI6OiIpOworICAgIElwQWRkcmVzcyBpcDUoIjo6MSIpOworICAgIElwQWRkcmVzcyBpcDYoIjgwODA6OjEiKTsKKyAgICBJcEFkZHJlc3MgaXA3KCI6OjElMiIpOworICAgIElwQWRkcmVzcyBpcDgoIjo6MSU0Iik7CisKKyAgICBFWFBFQ1RfRkFMU0UoaXAwIDwgaXAwKTsKKyAgICBFWFBFQ1RfVFJVRShpcDAgPCBpcDEpOworICAgIEVYUEVDVF9UUlVFKGlwMCA8IGlwNCk7CisKKyAgICBFWFBFQ1RfRkFMU0UoaXAxIDwgaXAxKTsKKyAgICBFWFBFQ1RfVFJVRShpcDEgPCBpcDIpOworICAgIEVYUEVDVF9UUlVFKGlwMSA8IGlwMyk7CisgICAgRVhQRUNUX1RSVUUoaXAyIDwgaXAzKTsKKworICAgIEVYUEVDVF9GQUxTRShpcDQgPCBpcDQpOworICAgIEVYUEVDVF9UUlVFKGlwNCA8IGlwNSk7CisgICAgRVhQRUNUX1RSVUUoaXA1IDwgaXA2KTsKKyAgICBFWFBFQ1RfVFJVRShpcDUgPCBpcDcpOworICAgIEVYUEVDVF9UUlVFKGlwNSA8IGlwOCk7CisgICAgRVhQRUNUX1RSVUUoaXA3IDwgaXA4KTsKKworICAgIEVYUEVDVF9UUlVFKGlwNyA8IGlwNik7CisKKyAgICBFWFBFQ1RfVFJVRShpcDEgPCBpcDQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvTmV0d29ya1V0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvTmV0d29ya1V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk1YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9OZXR3b3JrVXRpbHMuY3BwCkBAIC0wLDAgKzEsMzIwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZmRlZiBfX0FQUExFX18KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlIDxpcGhscGFwaS5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2VuZGlmCisKKy8vIFNldCB0byAxIHRvIGRpc3BsYXkgZGVidWcgbWVzc2FnZXMuCisjZGVmaW5lIERFQlVHIDAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvKiAgICAgICRPcGVuQlNEOiBpbmV0X3B0b24uYyx2IDEuOCAyMDEwLzA1LzA2IDE1OjQ3OjE0IGNsYXVkaW8gRXhwICQgICAqLworLyogICAgICAkT3BlbkJTRDogaW5ldF9udG9wLmMsdiAxLjEwIDIwMTQvMDUvMTcgMTg6MTY6MTQgdGVkdSBFeHAgJCAgICAgKi8KKworLyogQ29weXJpZ2h0IChjKSAxOTk2IGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJTlRFUk5FVCBTT0ZUV0FSRSBDT05TT1JUSVVNIERJU0NMQUlNUworICogQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBJTlRFUk5FVCBTT0ZUV0FSRQorICogQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICovCisKKyNkZWZpbmUgSU5BRERSU1ogNAorI2RlZmluZSBJTjZBRERSU1ogMTYKKyNkZWZpbmUgSU5UMTZTWiAyCisKK3VzaW5nIHVfY2hhciA9IHVuc2lnbmVkIGNoYXI7Cit1c2luZyB1X2ludCA9IHVuc2lnbmVkIGludDsKKworYm9vbCBuZXRTdHJpbmdUb0lwdjQoY29uc3QgY2hhciogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5IjsKKyAgICBpbnQgc2F3X2RpZ2l0LCBvY3RldHMsIGNoOworICAgIHVfY2hhciB0bXBbSU5BRERSU1pdLCAqdHA7CisKKyAgICBzYXdfZGlnaXQgPSAwOworICAgIG9jdGV0cyA9IDA7CisgICAgKih0cCA9IHRtcCkgPSAwOworICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9ICdcMCcpIHsKKyAgICAgICAgY29uc3QgY2hhciogcGNoOworCisgICAgICAgIGlmICgocGNoID0gc3RyY2hyKGRpZ2l0cywgY2gpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1X2ludCB2YWwgPSAqdHAgKiAxMCArIChwY2ggLSBkaWdpdHMpOworCisgICAgICAgICAgICBpZiAodmFsID4gMjU1KQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICBpZiAoIXNhd19kaWdpdCkgeworICAgICAgICAgICAgICAgIGlmICgrK29jdGV0cyA+IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgc2F3X2RpZ2l0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICp0cCA9IHZhbDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLicgJiYgc2F3X2RpZ2l0KSB7CisgICAgICAgICAgICBpZiAob2N0ZXRzID09IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICorK3RwID0gMDsKKyAgICAgICAgICAgIHNhd19kaWdpdCA9IDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgaWYgKG9jdGV0cyA8IDQpCisgICAgICAgIHJldHVybiAoMCk7CisKKyAgICBtZW1jcHkoZHN0LCB0bXAsIElOQUREUlNaKTsKKyAgICByZXR1cm4gKDEpOworfQorCitib29sIG5ldFN0cmluZ1RvSXB2Nihjb25zdCBjaGFyKiBzcmMsIHVpbnQ4X3QqIGRzdCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIHhkaWdpdHNfbFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiLAorICAgICAgICAgICAgICAgICAgICAgIHhkaWdpdHNfdVtdID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgIHVfY2hhciB0bXBbSU42QUREUlNaXSwgKnRwLCAqZW5kcCwgKmNvbG9ucDsKKyAgICBjb25zdCBjaGFyICp4ZGlnaXRzLCAqY3VydG9rOworICAgIGludCBjaCwgc2F3X3hkaWdpdCwgY291bnRfeGRpZ2l0OworICAgIHVfaW50IHZhbDsKKworICAgIG1lbXNldCgodHAgPSB0bXApLCAnXDAnLCBJTjZBRERSU1opOworICAgIGVuZHAgPSB0cCArIElONkFERFJTWjsKKyAgICBjb2xvbnAgPSBOVUxMOworICAgIC8qIExlYWRpbmcgOjogcmVxdWlyZXMgc29tZSBzcGVjaWFsIGhhbmRsaW5nLiAqLworICAgIGlmICgqc3JjID09ICc6JykKKyAgICAgICAgaWYgKCorK3NyYyAhPSAnOicpCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgIGN1cnRvayA9IHNyYzsKKyAgICBzYXdfeGRpZ2l0ID0gY291bnRfeGRpZ2l0ID0gMDsKKyAgICB2YWwgPSAwOworICAgIHdoaWxlICgoY2ggPSAqc3JjKyspICE9ICdcMCcpIHsKKyAgICAgICAgY29uc3QgY2hhciogcGNoOworCisgICAgICAgIGlmICgocGNoID0gc3RyY2hyKCh4ZGlnaXRzID0geGRpZ2l0c19sKSwgY2gpKSA9PSBOVUxMKQorICAgICAgICAgICAgcGNoID0gc3RyY2hyKCh4ZGlnaXRzID0geGRpZ2l0c191KSwgY2gpOworICAgICAgICBpZiAocGNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChjb3VudF94ZGlnaXQgPj0gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgdmFsIDw8PSA0OworICAgICAgICAgICAgdmFsIHw9IChwY2ggLSB4ZGlnaXRzKTsKKyAgICAgICAgICAgIGlmICh2YWwgPiAweGZmZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgIHNhd194ZGlnaXQgPSAxOworICAgICAgICAgICAgY291bnRfeGRpZ2l0Kys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gJzonKSB7CisgICAgICAgICAgICBjdXJ0b2sgPSBzcmM7CisgICAgICAgICAgICBpZiAoIXNhd194ZGlnaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sb25wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgICAgIGNvbG9ucCA9IHRwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgqc3JjID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRwICsgSU5UMTZTWiA+IGVuZHApCisgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgICAgICp0cCsrID0gKHVfY2hhcikodmFsID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICp0cCsrID0gKHVfY2hhcil2YWwgJiAweGZmOworICAgICAgICAgICAgc2F3X3hkaWdpdCA9IDA7CisgICAgICAgICAgICBjb3VudF94ZGlnaXQgPSAwOworICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjaCA9PSAnLicgJiYgKCh0cCArIElOQUREUlNaKSA8PSBlbmRwKSAmJgorICAgICAgICAgICAgbmV0U3RyaW5nVG9JcHY0KGN1cnRvaywgdHApID4gMCkgeworICAgICAgICAgICAgdHAgKz0gSU5BRERSU1o7CisgICAgICAgICAgICBzYXdfeGRpZ2l0ID0gMDsKKyAgICAgICAgICAgIGNvdW50X3hkaWdpdCA9IDA7CisgICAgICAgICAgICBicmVhazsgLyogJ1wwJyB3YXMgc2VlbiBieSBpbmV0X3B0b240KCkuICovCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgwKTsKKyAgICB9CisgICAgaWYgKHNhd194ZGlnaXQpIHsKKyAgICAgICAgaWYgKHRwICsgSU5UMTZTWiA+IGVuZHApCisgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICAqdHArKyA9ICh1X2NoYXIpKHZhbCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICp0cCsrID0gKHVfY2hhcil2YWwgJiAweGZmOworICAgIH0KKyAgICBpZiAoY29sb25wICE9IE5VTEwpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2Ugc29tZSBtZW1tb3ZlKCkncyBlcnJvbmVvdXNseSBmYWlsIHRvIGhhbmRsZQorICAgICAgICAgKiBvdmVybGFwcGluZyByZWdpb25zLCB3ZSdsbCBkbyB0aGUgc2hpZnQgYnkgaGFuZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IGludCBuID0gdHAgLSBjb2xvbnA7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICh0cCA9PSBlbmRwKQorICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgIGVuZHBbLWldID0gY29sb25wW24gLSBpXTsKKyAgICAgICAgICAgIGNvbG9ucFtuIC0gaV0gPSAwOworICAgICAgICB9CisgICAgICAgIHRwID0gZW5kcDsKKyAgICB9CisgICAgaWYgKHRwICE9IGVuZHApCisgICAgICAgIHJldHVybiAoMCk7CisgICAgbWVtY3B5KGRzdCwgdG1wLCBJTjZBRERSU1opOworICAgIHJldHVybiAoMSk7Cit9CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworbmFtZXNwYWNlIHsKKworI2lmZGVmIF9XSU4zMgorCisvLyBUZWNobmljYWwgbm90ZToKKy8vCisvLyBUaGlzIHVzZXMgR2V0SW50ZXJmYWNlSW5mbygpIHRvIHJldHJpZXZlIHRoZSB0YWJsZSBvZiBuZXR3b3JrIGludGVyZmFjZXMKKy8vIHRoYXQgaGF2ZSBJUHY0IGVuYWJsZWQsIGV2ZW4gdGhvdWdoIHRoaXMgZmVhdHVyZSB3b3VsZCBub3JtYWxseSBiZSB1c2VkCisvLyBmb3IgSVB2Ni1lbmFibGVkIG9uZXMuIEZvciBub3cganVzdCBhc3N1bWUgdGhlc2UgYXJlIHRoZSBzYW1lIGludGVyZmFjZXMuCisvLworLy8gVE9ETzogRmluZCB0aGUgcmlnaHQgV2luMzIgQVBJIHRvIGxpc3QgdGhlIElQdjYtZW5hYmxlZCBpbnRlcmZhY2VzLgorLy8KK3N0cnVjdCBTeXN0ZW1OZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyCisgICAgICAgIDogcHVibGljIE5ldHdvcmtJbnRlcmZhY2VOYW1lUmVzb2x2ZXIgeworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgU3lzdGVtTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlcigpIHsgcmVmcmVzaCgpOyB9CisKKyAgICAvLyBGaW5kIHRoZSBpbmRleCBmb3IgYW4gaW50ZXJmYWNlIG5hbWVkIHxzcmN8LiBSZXR1cm4gLTEgaWYgbm90IGZvdW5kLgorICAgIHZpcnR1YWwgaW50IHF1ZXJ5SW50ZXJmYWNlTmFtZShjb25zdCBjaGFyKiBzcmMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXZvaWQgY2FsbGluZyBHZXRJbnRlcmZhY2VJbmZvKCkgb24gZWFjaCBxdWVyeS4KKyAgICAgICAgaWYgKChTeXN0ZW06OmdldCgpLT5nZXRVbml4VGltZVVzKCkgLSBtTGFzdFRpbWVzdGFtcCkgPgorICAgICAgICAgICAga1JlZnJlc2hUaW1lb3V0VXMpIHsKKyAgICAgICAgICAgIHJlZnJlc2goKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGl0ID0gbU1hcC5maW5kKHN0ZDo6c3RyaW5nKHNyYykpOworICAgICAgICBpZiAoaXQgPT0gbU1hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1c2luZyBJbnRlcmZhY2VNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGludD47CisKKyAgICAvLyBDYWxsIEdldEludGVyZmFjZUluZm8oKSBhbmQgcmVmcmVzaCB0aGUgbWFwIG9mIGludGVyZmFjZSBuYW1lcy4KKyAgICB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIEludGVyZmFjZU1hcCBtYXA7CisKKyAgICAgICAgbUxhc3RUaW1lc3RhbXAgPSBTeXN0ZW06OmdldCgpLT5nZXRVbml4VGltZVVzKCk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgYnVmZmVyOworICAgICAgICBVTE9ORyBvdXRCdWZMZW4gPSAwOworICAgICAgICBEV09SRCByZXQgPSBHZXRJbnRlcmZhY2VJbmZvKE5VTEwsICZvdXRCdWZMZW4pOworICAgICAgICBpZiAocmV0ID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihvdXRCdWZMZW4pKTsKKyAgICAgICAgICAgIHJldCA9IEdldEludGVyZmFjZUluZm8oCisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SVBfSU5URVJGQUNFX0lORk8qPigmYnVmZmVyWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgJm91dEJ1Zkxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlYWQgbmV0d29yayBpbnRlcmZhY2UgdGFibGUiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBpbmZvID0gcmVpbnRlcnByZXRfY2FzdDxJUF9JTlRFUkZBQ0VfSU5GTyo+KCZidWZmZXJbMF0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZm8tPk51bUFkYXB0ZXJzOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPQorICAgICAgICAgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgoaW5mby0+QWRhcHRlcltpXS5OYW1lKTsKKyNpZiBERUJVRworICAgICAgICAgICAgTE9HKElORk8pIDw8IFN0cmluZ0Zvcm1hdCgiTmV0d29yayBpbnRlcmZhY2UgJTJkIFslc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5BZGFwdGVyW2ldLkluZGV4LCBuYW1lLmNfc3RyKCkpOworI2VuZGlmCisgICAgICAgICAgICBtYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUobmFtZSksIHN0YXRpY19jYXN0PGludD4oaW5mby0+QWRhcHRlcltpXS5JbmRleCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1NYXAuc3dhcChtYXApOworICAgIH0KKworICAgIEludGVyZmFjZU1hcCBtTWFwOworICAgIFN5c3RlbTo6RHVyYXRpb24gbUxhc3RUaW1lc3RhbXAgPSAwOworICAgIHN0YXRpYyBjb25zdGV4cHIgU3lzdGVtOjpEdXJhdGlvbiBrUmVmcmVzaFRpbWVvdXRVcyA9IDIwMDAwMDBMTDsKK307CisKKyNlbHNlICAvLyAhX1dJTjMyCisKK2NsYXNzIFN5c3RlbU5ldHdvcmtJbnRlcmZhY2VOYW1lUmVzb2x2ZXIgOiBwdWJsaWMgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgcXVlcnlJbnRlcmZhY2VOYW1lKGNvbnN0IGNoYXIqIHNyYykgb3ZlcnJpZGUgeworICAgICAgICBpbnQgcmV0ID0gaWZfbmFtZXRvaW5kZXgoc3JjKTsKKyAgICAgICAgcmV0dXJuIChyZXQgPT0gMCkgPyAtMSA6IHJldDsKKyAgICB9Cit9OworCisjZW5kaWYgIC8vICFfV0lOMzIKKworTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciogc1Jlc29sdmVyID0gbnVsbHB0cjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBuZXRTdHJpbmdUb0ludGVyZmFjZUluZGV4KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAvLyBJZiB8bmFtZXwgaXMgYSBkZWNpbWFsIG51bWJlciwgZG9uJ3QgdHJ5IHRvIGxvb2t1cCB0aGUgbmFtZS4KKyAgICBpZiAobmFtZVswXSA+PSAnMCcgJiYgbmFtZVswXSA8PSAnOScpIHsKKyAgICAgICAgY2hhciogZW5kID0gbnVsbHB0cjsKKyAgICAgICAgbG9uZyB2YWwgPSBzdHJ0b2wobmFtZSwgJmVuZCwgMTApOworICAgICAgICBpZiAoKmVuZCAhPSAnXDAnIHx8IHZhbCA8IDAgfHwgdmFsID4gSU5UX01BWCkgeworICAgICAgICAgICAgLy8gSW52YWxpZCBkZWNpbWFsIG51bWJlci4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih2YWwpOworICAgIH0KKyAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgY3VycmVudCBzeXN0ZW0gcmVzb2x2ZXIuCisgICAgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciogcmVzb2x2ZXIgPSBzUmVzb2x2ZXI7CisgICAgaWYgKCFyZXNvbHZlcikgeworICAgICAgICBzUmVzb2x2ZXIgPSByZXNvbHZlciA9IG5ldyBTeXN0ZW1OZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyKCk7CisgICAgfQorICAgIHJldHVybiByZXNvbHZlci0+cXVlcnlJbnRlcmZhY2VOYW1lKG5hbWUpOworfQorCitOZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyKiBuZXRTZXROZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyRm9yVGVzdGluZygKKyAgICAgICAgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciogcmVzb2x2ZXIpIHsKKyAgICBOZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyKiBvbGQgPSBzUmVzb2x2ZXI7CisgICAgc1Jlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgcmV0dXJuIG9sZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVwc2FjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9OZXR3b3JrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGE2NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9OZXR3b3JrVXRpbHMuaApAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIGZldyBjb252ZW5pZW5jZSBuZXR3b3JrLXJlbGF0ZWQgZnVuY3Rpb25zLiBUaGVzZSBhcmUgbW9zdGx5IHByb3ZpZGVkCisvLyBiZWNhdXNlIFdpbmUgcHJvdmlkZXMgaW5ldF9wdG9uKCksIGluZXRfbnRvcCgpIGFuZCBpZl9uYW1ldG9pbmRleCgpCisvLyB0aGF0IHJhaXNlIGFuICJ1bmltcGxlbWVudGVkIGZ1bmN0aW9uIiBhdCBydW50aW1lIDotLworCisvLyBFeHBlY3RlZCBhIGRvdHRlZC1kZWNpbWFsIElQdjQgYWRkcmVzcyByZXByZXNlbnRhdGlvbiBpbiB8c3JjfC4gT24gc3VjY2VzcywKKy8vIHJldHVybiB0cnVlIGFuZCBzdG9yZXMgdGhlIGFkZHJlc3MgYXMgNCBieXRlcyBpbiBuZXR3b3JrIG9yZGVyIGF0IHxkc3R8LgorLy8gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlLgorLy8KKy8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0byBpbmV0X3B0b24oQUZfSU5FVCwgc3JjLCBkc3QpLCBhbmQgcHJvdmlkZWQKKy8vICAgICAgIGJlY2F1c2UgdGhlIGxhdHRlciBmdW5jdGlvbiBjcmFzaGVzIFdpbmUgYXQgcnVudGltZSEKK2Jvb2wgbmV0U3RyaW5nVG9JcHY0KGNvbnN0IGNoYXIqIHNyYywgdWludDhfdCogZHN0KTsKKworLy8gRXhwZWN0IGFuIElQdjYgYWRkcmVzcyByZXByZXNlbnRhdGlvbiBpbiB8c3JjfC4gT24gc3VjY2VzcywgcmV0dXJuIHRydWUKKy8vIGFuZCBzdG9yZXMgdGhlIGFkZHJlc3MgYXMgMTYgYnl0ZXMgYXQgfGRzdHwuIE9uIGZhaWx1cmUgcmV0dXJuIGZhbHNlLgorLy8KKy8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0byBpbmV0X250b3AoQUZfSU5FVDYsIHNyYywgZHN0KSwgYW5kIHByb3ZpZGVkCisvLyAgICAgICBiZWNhdXNlIHRoZSBsYXR0ZXIgZnVuY3Rpb24gY3Jhc2hlcyBXaW5lIGF0IHJ1bnRpbWUhCitib29sIG5ldFN0cmluZ1RvSXB2Nihjb25zdCBjaGFyKiBzcmMsIHVpbnQ4X3QqIGRzdCk7CisKKy8vIEV4cGVjdCB8c3JjfCB0byBjb250YWluIGEgZGVjaW1hbCBudW1iZXIgb3IgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZQorLy8gc3lzdGVtJ3MgbmV0d29yayBpbnRlcmZhY2UgKGUuZy4gJ2xvJyBvbiBMaW51eCBpcyB0eXBpY2FsbHkgdXNlZCBmb3IKKy8vIHRoZSBsb29wYmFjayBhZGRyZXNzKS4gT24gc3VjY2VzcywgcmV0dXJuIGFuIGluZGV4LCBvciAtMSBvbiBmYWlsdXJlLgorLy8KKy8vIE5PVEU6IFRoaXMgaXMgbmVhcmx5IGVxdWl2YWxlbnQgdG8gaWZfbmFtZXRvaW5kZXgoKSwgZXhjZXB0IHRoYXQgaXQgcmV0dXJucworLy8gICAgICAgLTEgaW5zdGVhZCBvZiAwIGluIGNhc2Ugb2YgZXJyb3IuIFRoaXMgaXMgcHJvdmlkZWQgYmVjYXVzZSB0aGUKKy8vICAgICAgIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gY3Jhc2hlcyBXaW5lIGF0IHJ1bnRpbWUhCitpbnQgbmV0U3RyaW5nVG9JbnRlcmZhY2VJbmRleChjb25zdCBjaGFyKiBzcmMpOworCisvLyBUZXN0aW5nIHN1cHBvcnQuIFRoaXMgYWxsb3dzIG9uZSB0byBpbmplY3QgYSBjdXN0b20gbmV0d29yayBpbnRlcmZhY2UKKy8vIHJlc29sdmVyIGR1cmluZyB1bml0LXRlc3RpbmcuCitjbGFzcyBOZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5OZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyKCkge30KKyAgICB2aXJ0dWFsIGludCBxdWVyeUludGVyZmFjZU5hbWUoY29uc3QgY2hhciogc3JjKSA9IDA7Cit9OworCitOZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyKiBuZXRTZXROZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyRm9yVGVzdGluZygKKyAgICAgICAgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciogcmVzb2x2ZXIpOworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvTmV0d29ya1V0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL25ldHdvcmsvTmV0d29ya1V0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGYyODVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvbmV0d29yay9OZXR3b3JrVXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL05ldHdvcmtVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL0dUZXN0VXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlci5oIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RFU1QoTmV0d29ya1V0aWxzLCBuZXRTdHJpbmdUb0lwdjQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgYm9vbCBleHBlY3RlZF9yZXN1bHQ7CisgICAgICAgIHVpbnQ4X3QgZXhwZWN0ZWRfaXBbNF07CisgICAgICAgIGNvbnN0IGNoYXIqIHN0cmluZzsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7ZmFsc2UsIHt9LCAiMC4wLjAuMC4ifSwKKyAgICAgICAgICAgIHtmYWxzZSwge30sICIwLjAuMC4ifSwKKyAgICAgICAgICAgIHtmYWxzZSwge30sICIuMC4wLjAuMCJ9LAorICAgICAgICAgICAge2ZhbHNlLCB7fSwgIi4wLjAuMCJ9LAorICAgICAgICAgICAge3RydWUsIHswLCAwLCAwLCAwfSwgIjAuMC4wLjAifSwKKyAgICAgICAgICAgIHt0cnVlLCB7MSwgMiwgMywgNH0sICIxLjIuMy40In0sCisgICAgICAgICAgICB7dHJ1ZSwgezE5MiwgMTY4LCAxMCwgMX0sICIxOTIuMTY4LjEwLjEifSwKKyAgICAgICAgICAgIHt0cnVlLCB7MjU1LCAyNTUsIDI1NSwgMjU1fSwgIjI1NS4yNTUuMjU1LjI1NSJ9LAorICAgICAgICAgICAge2ZhbHNlLCB7fSwgIjI1NS4yNTUuMjU1LjI1NiJ9LAorICAgIH07CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDoga0RhdGEpIHsKKyAgICAgICAgdWludDhfdCBpcFs0XTsKKyAgICAgICAgYm9vbCByZXQgPSBuZXRTdHJpbmdUb0lwdjQoaXRlbS5zdHJpbmcsIGlwKTsKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0uZXhwZWN0ZWRfcmVzdWx0LCByZXQpIDw8ICJGb3IgWyIgPDwgaXRlbS5zdHJpbmcgPDwgIl0iOworICAgICAgICBpZiAocmV0ID09IGl0ZW0uZXhwZWN0ZWRfcmVzdWx0ICYmIHJldCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2goaXRlbS5leHBlY3RlZF9pcCwgaXApKQorICAgICAgICAgICAgICAgICAgICA8PCAiRm9yIFsiIDw8IGl0ZW0uc3RyaW5nIDw8ICJdIjsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChOZXR3b3JrVXRpbHMsIG5ldFN0cmluZ1RvSXB2NikgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBib29sIGV4cGVjdGVkX3Jlc3VsdDsKKyAgICAgICAgdWludDhfdCBleHBlY3RlZF9pcFsxNl07CisgICAgICAgIGNvbnN0IGNoYXIqIHN0cmluZzsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7ZmFsc2UsIHt9LCAiMC4wLjAuMCJ9LAorICAgICAgICAgICAge3RydWUsIHt9LCAiOjoifSwKKyAgICAgICAgICAgIHt0cnVlLCB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMX0sICI6OjEifSwKKyAgICAgICAgICAgIHt0cnVlLAorICAgICAgICAgICAgIHsyNTUsIDI1NCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMjA0LCAxNTIsIDE4OSwgMTE2fSwKKyAgICAgICAgICAgICAiZmZmZTo6MjA0LjE1Mi4xODkuMTE2In0sCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBrRGF0YSkgeworICAgICAgICB1aW50OF90IGlwWzE2XTsKKyAgICAgICAgYm9vbCByZXQgPSBuZXRTdHJpbmdUb0lwdjYoaXRlbS5zdHJpbmcsIGlwKTsKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0uZXhwZWN0ZWRfcmVzdWx0LCByZXQpIDw8ICJGb3IgWyIgPDwgaXRlbS5zdHJpbmcgPDwgIl0iOworICAgICAgICBpZiAocmV0ID09IGl0ZW0uZXhwZWN0ZWRfcmVzdWx0ICYmIHJldCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2goaXRlbS5leHBlY3RlZF9pcCwgaXApKQorICAgICAgICAgICAgICAgICAgICA8PCAiRm9yIFsiIDw8IGl0ZW0uc3RyaW5nIDw8ICJdIjsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChOZXR3b3JrVXRpbHMsIG5ldFN0cmluZ1RvSW50ZXJmYWNlTmFtZSkgeworICAgIFRlc3ROZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyIHJlc29sdmVyOworICAgIHJlc29sdmVyLmFkZEVudHJ5KCJMb29weWJhY2siLCAxMTEpOworICAgIHJlc29sdmVyLmFkZEVudHJ5KCJFdGhlcm51dCAzIiwgMjMwKTsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBpbnQgZXhwZWN0ZWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIHN0cmluZzsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7LTEsICIifSwgICAgICAgICAgIHstMSwgIjEgIn0sCisgICAgICAgICAgICB7LTEsICIgMSJ9LCAgICAgICAgIHsxLCAiMSJ9LAorICAgICAgICAgICAgezEwMDAsICIxMDAwIn0sICAgICB7LTEsICJsbyJ9LAorICAgICAgICAgICAgey0xLCAiTG9vcGJhY2sifSwgICB7LTEsICJFdGhlcm5ldCAzIn0sCisgICAgICAgICAgICB7MTExLCAiTG9vcHliYWNrIn0sIHsyMzAsICJFdGhlcm51dCAzIn0sCisgICAgICAgICAgICB7LTEsICJFdGhlcm5ldCJ9LCAgIHstMSwgIkV0aGVybmV0IDIifSwKKyAgICAgICAgICAgIHstMSwgIkV0aGVybmV0IDQifSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGtEYXRhKSB7CisgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkLCBuZXRTdHJpbmdUb0ludGVyZmFjZUluZGV4KGl0ZW0uc3RyaW5nKSkKKyAgICAgICAgICAgICAgICA8PCAiRm9yIFsiIDw8IGl0ZW0uc3RyaW5nIDw8ICJdIjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMTI4MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitjbGFzcyBTY29wZWRTb2NrZXQgeworcHVibGljOgorICAgIFNjb3BlZFNvY2tldCgpIDogbVNvY2tldCgtMSkge30KKworICAgIFNjb3BlZFNvY2tldChpbnQgc29ja2V0KSA6IG1Tb2NrZXQoc29ja2V0KSB7fQorCisgICAgflNjb3BlZFNvY2tldCgpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKKyAgICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVNvY2tldCA+PSAwOyB9CisKKyAgICBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVNvY2tldDsgfQorCisgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKG1Tb2NrZXQgPj0gMCkgeworICAgICAgICAgICAgc29ja2V0Q2xvc2UobVNvY2tldCk7CisgICAgICAgICAgICBtU29ja2V0ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgcmVsZWFzZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IG1Tb2NrZXQ7CisgICAgICAgIG1Tb2NrZXQgPSAtMTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KGludCBzb2NrZXQpIHsKKyAgICAgICAgaW50IG9sZFNvY2tldCA9IG1Tb2NrZXQ7CisgICAgICAgIG1Tb2NrZXQgPSBzb2NrZXQ7CisgICAgICAgIGlmIChvbGRTb2NrZXQgPj0gMCkgeworICAgICAgICAgICAgc29ja2V0Q2xvc2Uob2xkU29ja2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc3dhcChTY29wZWRTb2NrZXQqIG90aGVyKSB7CisgICAgICAgIGludCB0bXAgPSBtU29ja2V0OworICAgICAgICBtU29ja2V0ID0gb3RoZXItPm1Tb2NrZXQ7CisgICAgICAgIG90aGVyLT5tU29ja2V0ID0gdG1wOworICAgIH0KKworcHJpdmF0ZToKKyAgICBpbnQgbVNvY2tldDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXRfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjU1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitpbnQgT3Blbk51bGwoKSB7CisgICAgcmV0dXJuIHNvY2tldENyZWF0ZVRjcDQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU2NvcGVkU29ja2V0LCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgICBTY29wZWRTb2NrZXQgZjsKKyAgICBFWFBFQ1RfRkFMU0UoZi52YWxpZCgpKTsKKyAgICBFWFBFQ1RfRVEoLTEsIGYuZ2V0KCkpOworfQorCitURVNUKFNjb3BlZFNvY2tldCwgQ29uc3RydWN0b3IpIHsKKyAgICBTY29wZWRTb2NrZXQgZihPcGVuTnVsbCgpKTsKKyAgICBFWFBFQ1RfVFJVRShmLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZFNvY2tldCwgUmVsZWFzZSkgeworICAgIFNjb3BlZFNvY2tldCBmKE9wZW5OdWxsKCkpOworICAgIEVYUEVDVF9UUlVFKGYudmFsaWQoKSk7CisgICAgaW50IGZkID0gZi5yZWxlYXNlKCk7CisgICAgRVhQRUNUX0ZBTFNFKGYudmFsaWQoKSk7CisgICAgRVhQRUNUX05FKC0xLCBmZCk7CisgICAgOjpjbG9zZShmZCk7Cit9CisKK1RFU1QoU2NvcGVkU29ja2V0LCBSZXNldCkgeworICAgIFNjb3BlZFNvY2tldCBmKE9wZW5OdWxsKCkpOworICAgIGludCBmZDIgPSBPcGVuTnVsbCgpOworICAgIEVYUEVDVF9UUlVFKGYudmFsaWQoKSk7CisgICAgZi5yZXNldChmZDIpOworICAgIEVYUEVDVF9UUlVFKGYudmFsaWQoKSk7CisgICAgRVhQRUNUX0VRKGZkMiwgZi5nZXQoKSk7Cit9CisKK1RFU1QoU2NvcGVkU29ja2V0LCBDbG9zZSkgeworICAgIFNjb3BlZFNvY2tldCBmKE9wZW5OdWxsKCkpOworICAgIEVYUEVDVF9UUlVFKGYudmFsaWQoKSk7CisgICAgZi5jbG9zZSgpOworICAgIEVYUEVDVF9GQUxTRShmLnZhbGlkKCkpOworfQorCitURVNUKFNjb3BlZFNvY2tldCwgU3dhcCkgeworICAgIFNjb3BlZFNvY2tldCBmMTsKKyAgICBTY29wZWRTb2NrZXQgZjIoT3Blbk51bGwoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGYxLnZhbGlkKCkpOworICAgIEVYUEVDVF9UUlVFKGYyLnZhbGlkKCkpOworICAgIGYxLnN3YXAoJmYyKTsKKyAgICBFWFBFQ1RfRkFMU0UoZjIudmFsaWQoKSk7CisgICAgRVhQRUNUX1RSVUUoZjEudmFsaWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXREcmFpbmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5MGZmZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lci5jcHAKQEAgLTAsMCArMSwxODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvU2NvcGVkUG9pbnRlclNldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRFcnJvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKworLy8gU29tZSBpbXBsZW1lbnRhdGlvbiB3aHlzOgorLy8gV2hlbiB0aGUgbG9vcGVyIGlzIHJ1bm5pbmcsIHRoZSBzb2NrZXRzIGFyZSBub24tYmxvY2tpbmcgYW5kIGFyZSBvbmx5CisvLyBjbG9zZWQgYWZ0ZXIgYWxsIGRhdGEgaGFzIGJlZW4gcmVhZC4KKy8vIFdoZW4gbG9vcGVyIHN0b3BzLCB0aGUgcmVtYWluaW5nIHNvY2tldHMgYXJlIHN0aWxsIG5vbi1ibG9ja2luZyBhbmQgYXJlCisvLyBjbG9zZWQgYWZ0ZXIgYWxsIGF2YWlsYWJsZSBkYXRhIGhhcyBiZWVuIHJlYWQgKGNhbm5vdCBzZXQgdG8gYmxvY2tpbmcsIGJlY2F1c2UKKy8vIGRvaW5nIHRoYXQgY291bGQgcHV0IHRoZSBwcm9ncmFtIHNsZWVwaW5nIGZvcmV2ZXIpLgorLy8gV2hlbiBzb2NrZXQgaXMgYWxyZWFkeSBjbG9zZWQgZm9yIHJlYWQsIHdlIG9ubHkgbmVlZCB0byBzaHV0ZG93biB3cml0aW5nCisvLyBhbmQgY2xvc2UgdGhlIHNvY2tldC4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitjbGFzcyBEcmFpbmVyT2JqZWN0OworCisvLyBTb2NrZXREcmFpbkltcGwgaW1wbGVtZW50cyB0aGUgU29ja2V0RHJhaW5lciBhbmQgbWFuYWdlcyBhbGwgdGhlIERyYWluZXJPYmplY3RzCitjbGFzcyBTb2NrZXREcmFpbmVySW1wbCB7CitwdWJsaWM6CisgICAgU29ja2V0RHJhaW5lckltcGwoTG9vcGVyKiBsb29wZXIpIDoKKyAgICAgICAgICAgIG1Mb29wZXIobG9vcGVyKSwgbURyYWluZXJPYmplY3RzKCkgeyB9CisKKyAgICB+U29ja2V0RHJhaW5lckltcGwoKSB7fQorCitwdWJsaWM6CisgICAgdm9pZCBhZGRTb2NrZXRUb0RyYWluKGludCBzb2NrZXRfZmQpOworCisgICAgdm9pZCByZW1vdmVEcmFpbmVyT2JqZWN0KERyYWluZXJPYmplY3QqIGRyYWluZXIpIHsKKyAgICAgICAgbURyYWluZXJPYmplY3RzLnJlbW92ZShkcmFpbmVyKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBTY29wZWRQb2ludGVyU2V0PERyYWluZXJPYmplY3Q+IERyYWluU2V0OworCisgICAgTG9vcGVyKiAgbUxvb3BlcjsKKyAgICBEcmFpblNldCBtRHJhaW5lck9iamVjdHM7Cit9OworCisvLyBEcmFpbmVyT2JqZWN0IGRyYWlucyBhbmQgY2xvc2VzIHNvY2tldAorY2xhc3MgRHJhaW5lck9iamVjdCB7CitwdWJsaWM6CisgICAgRHJhaW5lck9iamVjdChpbnQgc29ja2V0X2ZkLCBMb29wZXIqIGxvb3BlciwgU29ja2V0RHJhaW5lckltcGwqIHBhcmVudCk7CisgICAgfkRyYWluZXJPYmplY3QoKTsKK3B1YmxpYzoKKyAgICAvLyBkcmFpbiBzb2NrZXQgYW5kIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIHN0aWxsIG1vcmUgZGF0YSB0byBkcmFpbgorICAgIGJvb2wgZHJhaW5Tb2NrZXQoKTsKKworICAgIC8vIHJldHVybiB0cnVlIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSB0byBkcmFpbgorICAgIGJvb2wgc29ja2V0SXNEcmFpbmVkKCkgY29uc3QgeyByZXR1cm4gbVNvY2tldElzRHJhaW5lZDsgfQorCisgICAgLy8gcmVtb3ZlIGZyb20gU29ja2V0RHJhaW5lckltcGwKKyAgICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKSB7CisgICAgICAgIGlmKG1QYXJlbnQpIHsKKyAgICAgICAgICAgIG1QYXJlbnQtPnJlbW92ZURyYWluZXJPYmplY3QodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgaW50ICAgICBtU29ja2V0OworICAgIExvb3BlciogbUxvb3BlcjsKKyAgICBTb2NrZXREcmFpbmVySW1wbCogbVBhcmVudDsKKyAgICBMb29wZXI6OkZkV2F0Y2gqICBtSW87CisgICAgYm9vbCAgICBtU29ja2V0SXNEcmFpbmVkOworCisgICAgdm9pZCBzaHV0ZG93blJlYWQoKTsKKyAgICB2b2lkIHNodXRkb3duV3JpdGUoKTsKKyAgICB2b2lkIGNsb3NlU29ja2V0KCk7Cit9OworCisvLyBjYWxsYmFjayBmcm9tIGxvb3BlciB3aGVuIHRoZSBzb2NrZXRfZmQgaGFzIHNvbWUgZGF0YSByZWFkeSB0byByZWFkCitzdGF0aWMgdm9pZCBfb25fcmVhZF9zb2NrZXRfZmQodm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cykgeworICAgIERyYWluZXJPYmplY3QgKiBkcmFpbmVyT2JqZWN0ID0gKERyYWluZXJPYmplY3QqKW9wYXF1ZTsKKyAgICBpZiAoIWRyYWluZXJPYmplY3QpIHJldHVybjsKKyAgICBpZiAoKGV2ZW50cyAmIExvb3Blcjo6RmRXYXRjaDo6a0V2ZW50UmVhZCkgIT0gMCkgeworICAgICAgICBkcmFpbmVyT2JqZWN0LT5kcmFpblNvY2tldCgpOworICAgIH0KKyAgICBpZiAoZHJhaW5lck9iamVjdC0+c29ja2V0SXNEcmFpbmVkKCkpIHsKKyAgICAgICAgZHJhaW5lck9iamVjdC0+cmVtb3ZlRnJvbVBhcmVudCgpOworICAgIH0KK30KKworRHJhaW5lck9iamVjdDo6RHJhaW5lck9iamVjdChpbnQgc29ja2V0X2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0RHJhaW5lckltcGwqIHBhcmVudCkgOgorICAgICAgICAgICAgbVNvY2tldChzb2NrZXRfZmQpLAorICAgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICAgICAgbVBhcmVudChwYXJlbnQpLAorICAgICAgICAgICAgbUlvKE5VTEwpLAorICAgICAgICAgICAgbVNvY2tldElzRHJhaW5lZChmYWxzZSkgeworICAgIHNvY2tldFNodXRkb3duV3JpdGVzKG1Tb2NrZXQpOworICAgIGlmIChkcmFpblNvY2tldCgpICYmIG1Mb29wZXIgJiYgbVBhcmVudCkgeworICAgICAgICBtSW8gPSBsb29wZXItPmNyZWF0ZUZkV2F0Y2gobVNvY2tldCwgX29uX3JlYWRfc29ja2V0X2ZkLCB0aGlzKTsKKyAgICAgICAgbUlvLT53YW50UmVhZCgpOworICAgICAgICBtSW8tPmRvbnRXYW50V3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0aGVyZSBpcyBub3RoaW5nIHRvIHJlYWQsIHRoZSBkcmFpbmVyIG9iamVjdCBpcyBkb25lCisgICAgICAgIG1Mb29wZXIgPSAwOworICAgIH0KK30KKworRHJhaW5lck9iamVjdDo6fkRyYWluZXJPYmplY3QoKSB7CisgICAgaWYgKCFtU29ja2V0SXNEcmFpbmVkKSB7CisgICAgICAgIGNoYXIgYnVmZlsxMDI0XTsKKyAgICAgICAgd2hpbGUoc29ja2V0UmVjdihtU29ja2V0LCBidWZmLCBzaXplb2YoYnVmZikpID4gMCkge30KKyAgICAgICAgbVNvY2tldElzRHJhaW5lZCA9IHRydWU7CisgICAgfQorICAgIHNvY2tldFNodXRkb3duUmVhZHMobVNvY2tldCk7CisgICAgZGVsZXRlIG1JbzsKKyAgICBzb2NrZXRDbG9zZShtU29ja2V0KTsKKyAgICBtU29ja2V0ID0gLTE7CisgICAgbVBhcmVudCA9IDA7Cit9CisKK2Jvb2wgRHJhaW5lck9iamVjdDo6ZHJhaW5Tb2NrZXQoKSB7CisgICAgZXJybm8gPSAwOworICAgIGNoYXIgYnVmZlsxMDI0XTsKKyAgICBzc2l6ZV90IHNpemUgPSBzb2NrZXRSZWN2KG1Tb2NrZXQsIGJ1ZmYsIHNpemVvZihidWZmKSk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8IDAgJiYgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIG1Tb2NrZXRJc0RyYWluZWQgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU29ja2V0RHJhaW5lckltcGwgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFNvY2tldERyYWluZXJJbXBsOjphZGRTb2NrZXRUb0RyYWluKGludCBzb2NrZXRfZmQpIHsKKyAgICBEcmFpbmVyT2JqZWN0KiBkcmFpbmVyID0gbmV3IERyYWluZXJPYmplY3Qoc29ja2V0X2ZkLCBtTG9vcGVyLCB0aGlzKTsKKyAgICBpZiAoZHJhaW5lci0+c29ja2V0SXNEcmFpbmVkKCkpIHsKKyAgICAgICAgZGVsZXRlIGRyYWluZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbURyYWluZXJPYmplY3RzLmFkZChkcmFpbmVyKTsKKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNvY2tldERyYWluZXIgSW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29ja2V0RHJhaW5lcjo6U29ja2V0RHJhaW5lcihMb29wZXIqIGxvb3BlcikgOgorICAgIG1Tb2NrZXREcmFpbmVySW1wbChuZXcgU29ja2V0RHJhaW5lckltcGwobG9vcGVyKSkgeworfQorCitTb2NrZXREcmFpbmVyOjp+U29ja2V0RHJhaW5lcigpIHsKKyAgICBkZWxldGUgbVNvY2tldERyYWluZXJJbXBsOworICAgIG1Tb2NrZXREcmFpbmVySW1wbCA9IDA7Cit9CisKK3ZvaWQgU29ja2V0RHJhaW5lcjo6ZHJhaW5BbmRDbG9zZShpbnQgc29ja2V0RmQpIHsKKyAgICBpZiAoc29ja2V0RmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNvY2tldERyYWluZXJJbXBsLT5hZGRTb2NrZXRUb0RyYWluKHNvY2tldEZkKTsKK30KKworLy8gc3RhdGljCit2b2lkIFNvY2tldERyYWluZXI6OmRyYWluQW5kQ2xvc2VCbG9ja2luZyhpbnQgc29ja2V0RmQpIHsKKyAgICBEcmFpbmVyT2JqZWN0IGRyYWluZXIoc29ja2V0RmQsIDAsIDApOworfQorCit9IC8vIG5hbWVzcGFjZSBiYXNlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGV4dGVybiBDIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXREcmFpbmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTdjMzY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXREcmFpbmVyLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorCisvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBtYW5hZ2UgZ3JhY2VmdWwgY2xvc2Ugb2Ygc29ja2V0cworLy8gYXMgZGVzY3JpYmVkIGJ5ICJUaGUgdWx0aW1hdGUgU09fTElOR0VSIHBhZ2UiIFsxXSwgd2hpY2ggcmVxdWlyZXMKKy8vIHNldmVyYWwgc3RlcHMgdG8gZG8gcHJvcGVybHkuCisvLworLy8gVG8gdXNlIGl0LCBzaW1wbHkgY3JlYXRlIGEgc29ja2V0RHJhaW5lciBpbnN0YW5jZSBhZnRlciBjcmVhdGluZyBhCisvLyBMb29wZXIsIGFzIGluOgorLy8KKy8vICAgICAgU29ja2V0RHJhaW5lciAgc29ja2V0RHJhaW5lcihsb29wZXIpOworLy8KKy8vIFdoZW4gYSBzb2NrZXQgbmVlZHMgdG8gYmUgZ3JhY2VmdWxseSBjbG9zZWQsIGNhbGwgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgICAgICBzb2NrZXREcmFpbmVyLmRyYWluQW5kQ2xvc2Uoc29ja2V0RmQpOworLy8KKy8vIFdoZW4gdGhlIGRyYWluZXIgaXMgZGVzdHJveWVkIChlLmcuIGZhaWxpbmcgb3V0IG9mIHNjb3BlLCBvciB0aHJvdWdoCisvLyBkZWxldGUpLCBhbGwgcmVtYWluaW5nIHNvY2tldHMgd2lsbCBiZSBzaHV0IGRvd24gYW5kIGNsb3NlZCB3aXRob3V0CisvLyBmdXJ0aGVyIGRyYWluaW5nLgorLy8KKy8vIFsxXSBodHRwOi8vYmxvZy5uZXRoZXJsYWJzLm5sL2FydGljbGVzLzIwMDkvMDEvMTgvdGhlLXVsdGltYXRlLXNvX2xpbmdlci1wYWdlLW9yLXdoeS1pcy1teS10Y3Atbm90LXJlbGlhYmxlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgU29ja2V0RHJhaW5lckltcGw7CitjbGFzcyBTb2NrZXREcmFpbmVyIHsKK3B1YmxpYzoKKyAgICBTb2NrZXREcmFpbmVyKExvb3BlciogbG9vcGVyKTsKKworICAgIH5Tb2NrZXREcmFpbmVyKCk7CisKKyAgICAvLyBBZGQgYSBzb2NrZXQgdG8gYmUgZHJhaW5lZCBhbmQgY2xvc2VkCisgICAgdm9pZCBkcmFpbkFuZENsb3NlKGludCBzb2NrZXRGZCk7CisKKyAgICBzdGF0aWMgdm9pZCBkcmFpbkFuZENsb3NlQmxvY2tpbmcoaW50IHNvY2tldEZkKTsKKworcHJpdmF0ZToKKyAgICBTb2NrZXREcmFpbmVySW1wbCogIG1Tb2NrZXREcmFpbmVySW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGJhc2UKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0X2RyYWluZXIuaCIKKworLy8gVGhlIGZvbGxvd2luZyB1bml0IHRlc3RzIG9ubHkgd29yayBvbiBMaW51eCBhbmQgT1MgWCwgYmVjYXVzZSB0aGV5IHJlbHkgb24gImZvcmsoKSIKKy8vIHN5c3RlbSBjYWxsLCB3aGljaCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFdpbmRvd3MgeWV0LgorCisjaWZuZGVmIF9XSU4zMgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga0JpZ051bWJlciA9ICgxPDwxMCk7CisKK2ludCB3cml0ZVRvU29ja2V0KGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgc29ja2V0X2ZkKSB7CisgICAgRklMRSogZmYgPSBmb3BlbihmaWxlbmFtZSwgInciKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGtCaWdOdW1iZXI7ICsraSkgeworICAgICAgICBzc2l6ZV90IHNpemUgPSBzb2NrZXRTZW5kKHNvY2tldF9mZCwgImEiLCAxKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZwcmludGYoZmYsICIlZCIsIGkpOworICAgIGZjbG9zZShmZik7CisgICAgc29ja2V0U2h1dGRvd25Xcml0ZXMoc29ja2V0X2ZkKTsKKyAgICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU29ja2V0RHJhaW5lciwgR3JhY2VmdWxTaHV0RG93bkZyb21DKSB7CisgICAgaW50IHNvY2tldF9mZDEgPSAtMTsKKyAgICBpbnQgc29ja2V0X2ZkMiA9IC0xOworICAgIGludCBlcnJvciA9IHNvY2tldENyZWF0ZVBhaXIoJnNvY2tldF9mZDEsICZzb2NrZXRfZmQyKTsKKyAgICBFWFBFQ1RfRVEoZXJyb3IsIDApOworICAgIEFTU0VSVF9HRShzb2NrZXRfZmQxLCAwKTsKKyAgICBBU1NFUlRfR0Uoc29ja2V0X2ZkMiwgMCk7CisKKyAgICBUZW1wRmlsZSogY2hpbGRGaWxlID0gdGVtcGZpbGVfY3JlYXRlKCk7CisgICAgY29uc3QgY2hhcioga0NoaWxkRmlsZU5hbWUgPSB0ZW1wZmlsZV9wYXRoKGNoaWxkRmlsZSk7CisKKyAgICAvLyBjcmVhdGUgYSBwcm9jZXNzIHRvIHNlbmQgYnl0ZXMgZnJvbSB0aGUgd3JpdGluZyBzb2NrZXQKKyAgICBpbnQgY2hpbGRwaWQgPSBmb3JrKCk7CisgICAgaW50IGNoaWxkRXhpdFN0YXR1czsKKyAgICBpZiAoY2hpbGRwaWQgPT0gMCkgeworICAgICAgICBzb2NrZXRDbG9zZShzb2NrZXRfZmQyKTsKKyAgICAgICAgX2V4aXQod3JpdGVUb1NvY2tldChrQ2hpbGRGaWxlTmFtZSwgc29ja2V0X2ZkMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tldENsb3NlKHNvY2tldF9mZDEpOworICAgICAgICBBU1NFUlRfR1QoY2hpbGRwaWQsIDApOworICAgIH0KKworICAgIC8vIGRyYWluIHRoZSByZWFkaW5nIHNvY2tldDogQyBzdHlsZQorICAgIDo6TG9vcGVyKiBtYWluTG9vcGVyID0gbG9vcGVyX25ld0dlbmVyaWMoKTsKKyAgICBzb2NrZXRfZHJhaW5lcl9zdGFydChtYWluTG9vcGVyKTsKKyAgICBzb2NrZXRfZHJhaW5lcl9kcmFpbl9hbmRfY2xvc2Uoc29ja2V0X2ZkMik7CisgICAgbG9vcGVyX3J1bihtYWluTG9vcGVyKTsKKyAgICBzb2NrZXRfZHJhaW5lcl9zdG9wKCk7CisgICAgbG9vcGVyX2ZyZWUobWFpbkxvb3Blcik7CisgICAgd2FpdCgmY2hpbGRFeGl0U3RhdHVzKTsKKworICAgIC8vIGZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuCisgICAgRklMRSogZmNoaWxkID0gZm9wZW4oa0NoaWxkRmlsZU5hbWUsICJyIik7CisgICAgaW50IG51bVdyaXR0ZW4gPSAwOworICAgIGZzY2FuZihmY2hpbGQsICIlZCIsICZudW1Xcml0dGVuKTsKKyAgICB0ZW1wZmlsZV9jbG9zZShjaGlsZEZpbGUpOworCisgICAgLy8gc2hvdWxkIG5vdCBtaXNzIGFueSBieXRlCisgICAgRVhQRUNUX0VRKGtCaWdOdW1iZXIsIG51bVdyaXR0ZW4pOworfQorCitURVNUKFNvY2tldERyYWluZXIsIEdyYWNlZnVsU2h1dERvd25Gcm9tQ3BwKSB7CisgICAgaW50IHNvY2tldF9mZDEgPSAtMTsKKyAgICBpbnQgc29ja2V0X2ZkMiA9IC0xOworICAgIGludCBlcnJvciA9IHNvY2tldENyZWF0ZVBhaXIoJnNvY2tldF9mZDEsICZzb2NrZXRfZmQyKTsKKyAgICBFWFBFQ1RfRVEoMCwgZXJyb3IpOworICAgIEFTU0VSVF9HRShzb2NrZXRfZmQxLCAwKTsKKyAgICBBU1NFUlRfR0Uoc29ja2V0X2ZkMiwgMCk7CisKKyAgICBUZW1wRmlsZSogY2hpbGRGaWxlID0gdGVtcGZpbGVfY3JlYXRlKCk7CisgICAgY29uc3QgY2hhcioga0NoaWxkRmlsZU5hbWUgPSB0ZW1wZmlsZV9wYXRoKGNoaWxkRmlsZSk7CisKKyAgICBpbnQgY2hpbGRwaWQgPSBmb3JrKCk7CisgICAgaW50IGNoaWxkRXhpdFN0YXR1czsKKyAgICBpZiAoY2hpbGRwaWQgPT0gMCkgeworICAgICAgICBzb2NrZXRDbG9zZShzb2NrZXRfZmQyKTsKKyAgICAgICAgX2V4aXQod3JpdGVUb1NvY2tldChrQ2hpbGRGaWxlTmFtZSwgc29ja2V0X2ZkMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNvY2tldENsb3NlKHNvY2tldF9mZDEpOworICAgICAgICBBU1NFUlRfR1QoY2hpbGRwaWQsIDApOworICAgIH0KKworICAgIC8vIGRyYWluIHRoZSByZWFkaW5nIHNvY2tldDogQysrIHN0eWxlCisgICAgTG9vcGVyKiBtYWluTG9vcGVyID0gTG9vcGVyOjpjcmVhdGUoKTsKKyAgICB7CisgICAgICAgIFNvY2tldERyYWluZXIgc29ja2V0RHJhaW5lcihtYWluTG9vcGVyKTsKKyAgICAgICAgc29ja2V0RHJhaW5lci5kcmFpbkFuZENsb3NlKHNvY2tldF9mZDIpOworICAgICAgICBtYWluTG9vcGVyLT5ydW4oKTsKKyAgICB9CisgICAgZGVsZXRlIG1haW5Mb29wZXI7CisgICAgd2FpdCgmY2hpbGRFeGl0U3RhdHVzKTsKKworICAgIEZJTEUqIGZjaGlsZCA9IGZvcGVuKGtDaGlsZEZpbGVOYW1lLCAiciIpOworICAgIGludCBudW1Xcml0dGVuID0gMDsKKyAgICBmc2NhbmYoZmNoaWxkLCAiJWQiLCAmbnVtV3JpdHRlbik7CisgICAgdGVtcGZpbGVfY2xvc2UoY2hpbGRGaWxlKTsKKworICAgIEVYUEVDVF9FUShrQmlnTnVtYmVyLCBudW1Xcml0dGVuKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYmFzZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RXJyb3JzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldEVycm9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTYxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldEVycm9ycy5oCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKy8vIE9sZGVyIE1pbmd3MzIgaGVhZGVycyBkaWRuJ3QgZGVmaW5lIGFsbCBlcnJvciBtYWNyb3MgYXBwcm9wcmlhdGVseS4KKy8vIEluY2x1ZGUgdGhpcyBoZWFkZXIgdG8gd29yay1hcm91bmQgdGhpcy4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZkZWYgX1dJTjMyCisjICBpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisKKyMgIGlmbmRlZiBFSU5UUgorIyAgICBkZWZpbmUgRUlOVFIgICAgICAgIDEwMDA0CisjICBlbmRpZgorIyAgaWZuZGVmIEVBR0FJTgorIyAgICBkZWZpbmUgRUFHQUlOICAgICAgIDEwMDM1CisjICBlbmRpZgorIyAgaWZuZGVmIEVXT1VMREJMT0NLCisjICAgIGRlZmluZSBFV09VTERCTE9DSyAgRUFHQUlOCisjICBlbmRpZgorIyAgaWZuZGVmIEVJTlBST0dSRVNTCisjICAgIGRlZmluZSBFSU5QUk9HUkVTUyAgMTAwMzYKKyMgIGVuZGlmCisjICBpZm5kZWYgRUFMUkVBRFkKKyMgICAgZGVmaW5lIEVBTFJFQURZICAgICAxMDAzNworIyAgZW5kaWYKKyMgIGlmbmRlZiBFREVTVEFERFJSRVEKKyMgICAgZGVmaW5lIEVERVNUQUREUlJFUSAxMDAzOQorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTVNHU0laRQorIyAgICBkZWZpbmUgRU1TR1NJWkUgICAgIDEwMDQwCisjICBlbmRpZgorIyAgaWZuZGVmIEVQUk9UT1RZUEUKKyMgICAgZGVmaW5lIEVQUk9UT1RZUEUgICAxMDA0MQorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTk9QUk9UT09QVAorIyAgICBkZWZpbmUgRU5PUFJPVE9PUFQgIDEwMDQyCisjICBlbmRpZgorIyAgaWZuZGVmIEVBRk5PU1VQUE9SVAorIyAgICBkZWZpbmUgRUFGTk9TVVBQT1JUIDEwMDQ3CisjICBlbmRpZgorIyAgaWZuZGVmIEVBRERSSU5VU0UKKyMgICAgZGVmaW5lIEVBRERSSU5VU0UgICAxMDA0OAorIyAgZW5kaWYKKyMgIGlmbmRlZiBFQUREUk5PVEFWQUlMCisjICAgIGRlZmluZSBFQUREUk5PVEFWQUlMIDEwMDQ5CisjICBlbmRpZgorIyAgaWZuZGVmIEVORVRET1dOCisjICAgIGRlZmluZSBFTkVURE9XTiAgICAgMTAwNTAKKyMgIGVuZGlmCisjICBpZm5kZWYgRU5FVFVOUkVBQ0gKKyMgICAgZGVmaW5lIEVORVRVTlJFQUNIICAxMDA1MQorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTkVUUkVTRVQKKyMgICAgZGVmaW5lIEVORVRSRVNFVCAgICAxMDA1MgorIyAgZW5kaWYKKyMgIGlmbmRlZiBFQ09OTkFCT1JURUQKKyMgICAgZGVmaW5lIEVDT05OQUJPUlRFRCAxMDA1MworIyAgZW5kaWYKKyMgIGlmbmRlZiBFQ09OTlJFU0VUCisjICAgIGRlZmluZSBFQ09OTlJFU0VUICAgMTAwNTQKKyMgIGVuZGlmCisjICBpZm5kZWYgRU5PQlVGUworIyAgICBkZWZpbmUgRU5PQlVGUyAgICAgIDEwMDU1CisjICBlbmRpZgorIyAgaWZuZGVmIEVJU0NPTk4KKyMgICAgZGVmaW5lIEVJU0NPTk4gICAgICAxMDA1NgorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTk9UQ09OTgorIyAgICBkZWZpbmUgRU5PVENPTk4gICAgIDEwMDU3CisjICBlbmRpZgorIyAgaWZuZGVmIEVTSFVURE9XTgorIyAgICBkZWZpbmUgRVNIVVRET1dOICAgICAxMDA1OAorIyAgZW5kaWYKKyMgIGlmbmRlZiBFVE9PTUFOWVJFRlMKKyMgICAgZGVmaW5lIEVUT09NQU5ZUkVGUyAgMTAwNTkKKyMgIGVuZGlmCisjICBpZm5kZWYgRVRJTUVET1VUCisjICAgIGRlZmluZSBFVElNRURPVVQgICAgIDEwMDYwCisjICBlbmRpZgorIyAgaWZuZGVmIEVDT05OUkVGVVNFRAorIyAgICBkZWZpbmUgRUNPTk5SRUZVU0VEICAxMDA2MQorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTE9PUAorIyAgICBkZWZpbmUgRUxPT1AgICAgICAgICAxMDA2MgorIyAgZW5kaWYKKyMgIGlmbmRlZiBFSE9TVERPV04KKyMgICAgZGVmaW5lIEVIT1NURE9XTiAgICAgMTAwNjQKKyMgIGVuZGlmCisjICBpZm5kZWYgRUhPU1RVTlJFQUNICisjICAgIGRlZmluZSBFSE9TVFVOUkVBQ0ggIDEwMDY1CisjICBlbmRpZgorI2VuZGlmIC8qIF9XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDcwNTBhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5jcHAKQEAgLTAsMCArMSw3MjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvRW51bUZsYWdzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RXJyb3JzLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICBpbmNsdWRlIDxmY250bC5oPgorIyAgaW5jbHVkZSA8bmV0ZGIuaD4KKyMgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgIGluY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBfV0lOMzIKKworIyAgaWZuZGVmIEVTSFVURE9XTgorIyAgICBkZWZpbmUgRVNIVVRET1dOICAgICAxMDA1OAorIyAgZW5kaWYKKworIyAgaWZuZGVmIEVUT09NQU5ZUkVGUworIyAgICBkZWZpbmUgRVRPT01BTllSRUZTICAxMDA1OQorIyAgZW5kaWYKKworIyAgaWZuZGVmIEVIT1NURE9XTgorIyAgICBkZWZpbmUgRUhPU1RET1dOICAgICAxMDA2NAorIyAgZW5kaWYKKworLy8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIGltcGxlbWVudCBhIG1hcHBpbmcgb2YgV2luc29jayBlcnJvciBjb2RlcworLy8gdG8gZXF1aXZhbGVudCBlcnJubyBvbmVzLiBUaGUgcG9pbnQgaGVyZSBpcyB0byBlbnN1cmUgdGhhdCBvdXIgc29ja2V0CisvLyBoZWxwZXIgZnVuY3Rpb25zIGFsd2F5cyB1cGRhdGUgZXJybm8gdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsIGV2ZW4gb24KKy8vIFdpbmRvd3MsIHdoZXJlIFdpbnNvY2sgbm9ybWFsbHkgbGVhdmVzIHRoaXMgdmFyaWFibGUgdW50b3VjaGVkIGluIGNhc2UKKy8vIG9mIGVycm9yIChjbGllbnQgY29kZSBuZWVkcyB0byBjYWxsIFdTQUdldExhc3RFcnJvcigpIGluc3RlYWQpLgorIyAgZGVmaW5lICBXSU5TT0NLX0VSUk9SU19MSVNUIFwKKyAgICBFRShXU0FfSU5WQUxJRF9IQU5ETEUsRUlOVkFMLCJpbnZhbGlkIGhhbmRsZSIpIFwKKyAgICBFRShXU0FfTk9UX0VOT1VHSF9NRU1PUlksRU5PTUVNLCJub3QgZW5vdWdoIG1lbW9yeSIpIFwKKyAgICBFRShXU0FfSU5WQUxJRF9QQVJBTUVURVIsRUlOVkFMLCJpbnZhbGlkIHBhcmFtZXRlciIpIFwKKyAgICBFRShXU0FFSU5UUixFSU5UUiwiaW50ZXJydXB0ZWQgZnVuY3Rpb24gY2FsbCIpIFwKKyAgICBFRShXU0FFQUxSRUFEWSxFQUxSRUFEWSwib3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSBcCisgICAgRUUoV1NBRUJBREYsRUJBREYsImJhZCBmaWxlIGRlc2NyaXB0b3IiKSBcCisgICAgRUUoV1NBRUFDQ0VTLEVBQ0NFUywicGVybWlzc2lvbiBkZW5pZWQiKSBcCisgICAgRUUoV1NBRUZBVUxULEVGQVVMVCwiYmFkIGFkZHJlc3MiKSBcCisgICAgRUUoV1NBRUlOVkFMLEVJTlZBTCwiaW52YWxpZCBhcmd1bWVudCIpIFwKKyAgICBFRShXU0FFTUZJTEUsRU1GSUxFLCJ0b28gbWFueSBvcGVuZWQgZmlsZXMiKSBcCisgICAgRUUoV1NBRVdPVUxEQkxPQ0ssRVdPVUxEQkxPQ0ssInJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIikgXAorICAgIEVFKFdTQUVJTlBST0dSRVNTLEVJTlBST0dSRVNTLCJvcGVyYXRpb24gbm93IGluIHByb2dyZXNzIikgXAorICAgIEVFKFdTQUVBTFJFQURZLEVBR0FJTiwib3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSBcCisgICAgRUUoV1NBRU5PVFNPQ0ssRUJBREYsInNvY2tldCBvcGVyYXRpb24gbm90IG9uIHNvY2tldCIpIFwKKyAgICBFRShXU0FFREVTVEFERFJSRVEsRURFU1RBRERSUkVRLCJkZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIikgXAorICAgIEVFKFdTQUVNU0dTSVpFLEVNU0dTSVpFLCJtZXNzYWdlIHRvbyBsb25nIikgXAorICAgIEVFKFdTQUVQUk9UT1RZUEUsRVBST1RPVFlQRSwid3JvbmcgcHJvdG9jb2wgdHlwZSBmb3Igc29ja2V0IikgXAorICAgIEVFKFdTQUVOT1BST1RPT1BULEVOT1BST1RPT1BULCJiYWQgcHJvdG9jb2wgb3B0aW9uIikgXAorICAgIEVFKFdTQUVBRERSSU5VU0UsRUFERFJJTlVTRSwiYWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpIFwKKyAgICBFRShXU0FFQUREUk5PVEFWQUlMLEVBRERSTk9UQVZBSUwsImNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSBcCisgICAgRUUoV1NBRU5FVERPV04sRU5FVERPV04sIm5ldHdvcmsgaXMgZG93biIpIFwKKyAgICBFRShXU0FFTkVUVU5SRUFDSCxFTkVUVU5SRUFDSCwibmV0d29yayB1bnJlYWNoYWJsZSIpIFwKKyAgICBFRShXU0FFTkVUUkVTRVQsRU5FVFJFU0VULCJuZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldCIpIFwKKyAgICBFRShXU0FFQ09OTkFCT1JURUQsRUNPTk5BQk9SVEVELCJzb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpIFwKKyAgICBFRShXU0FFQ09OTlJFU0VULEVDT05OUkVTRVQsImNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpIFwKKyAgICBFRShXU0FFTk9CVUZTLEVOT0JVRlMsIm5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSBcCisgICAgRUUoV1NBRUlTQ09OTixFSVNDT05OLCJzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKSBcCisgICAgRUUoV1NBRU5PVENPTk4sRU5PVENPTk4sInNvY2tldCBpcyBub3QgY29ubmVjdGVkIikgXAorICAgIEVFKFdTQUVTSFVURE9XTixFU0hVVERPV04sImNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biIpIFwKKyAgICBFRShXU0FFVE9PTUFOWVJFRlMsRVRPT01BTllSRUZTLCJ0b28gbWFueSByZWZlcmVuY2VzIikgXAorICAgIEVFKFdTQUVUSU1FRE9VVCxFVElNRURPVVQsImNvbm5lY3Rpb24gdGltZWQgb3V0IikgXAorICAgIEVFKFdTQUVDT05OUkVGVVNFRCxFQ09OTlJFRlVTRUQsImNvbm5lY3Rpb24gcmVmdXNlZCIpIFwKKyAgICBFRShXU0FFTE9PUCxFTE9PUCwiY2Fubm90IHRyYW5zbGF0ZSBuYW1lIikgXAorICAgIEVFKFdTQUVOQU1FVE9PTE9ORyxFTkFNRVRPT0xPTkcsIm5hbWUgdG9vIGxvbmciKSBcCisgICAgRUUoV1NBRUhPU1RET1dOLEVIT1NURE9XTiwiaG9zdCBpcyBkb3duIikgXAorICAgIEVFKFdTQUVIT1NUVU5SRUFDSCxFSE9TVFVOUkVBQ0gsIm5vIHJvdXRlIHRvIGhvc3QiKSBcCisKK3N0cnVjdCBXaW5zb2NrRXJyb3IgeworICAgIGludCB3aW5zb2NrX2Vycm9yOworICAgIGludCB1bml4X2Vycm9yOworfTsKKworY29uc3QgV2luc29ja0Vycm9yIGtXaW5zb2NrRXJyb3JzW10gPSB7CisjZGVmaW5lICBFRSh3LHUscykgICB7IHcsIHUsIH0sCisgICAgV0lOU09DS19FUlJPUlNfTElTVAorI3VuZGVmICAgRUUKK307CisKK2NvbnN0IHNpemVfdCBrV2luc29ja0Vycm9yc1NpemUgPQorICAgICAgICBzaXplb2Yoa1dpbnNvY2tFcnJvcnMpIC8gc2l6ZW9mKGtXaW5zb2NrRXJyb3JzWzBdKTsKKworLy8gUmVhZCB0aGUgbGF0ZXN0IHdpbnNvY2sgZXJyb3IgY29kZSBhbmQgdXBkYXRlcyBlcnJubyBhcHByb3ByaWF0ZWx5LgorLy8gQWxzbyBhbHdheXMgcmV0dXJucyAtMSBzbyBpdCBjYW4gYmUgY2hhaW5lZCBpbiBmdW5jdGlvbiBjYWxscywgYXMgaW46CisvLworLy8gICAgIHJldHVybiBmaXhFcnJubygpOworLy8KK2ludCBmaXhFcnJubygpIHsKKyAgICBpbnQgdW5peF9lcnJvciA9IEVJTlZBTDsgIC8qIGdlbmVyaWMgZXJyb3IgY29kZSAqLworICAgIGludCB3aW5zb2NrX2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtXaW5zb2NrRXJyb3JzU2l6ZTsgKytuKSB7CisgICAgICAgIGlmIChrV2luc29ja0Vycm9yc1tuXS53aW5zb2NrX2Vycm9yID09IHdpbnNvY2tfZXJyb3IpIHsKKyAgICAgICAgICAgIHVuaXhfZXJyb3IgPSBrV2luc29ja0Vycm9yc1tuXS51bml4X2Vycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnJubyA9IHVuaXhfZXJyb3I7CisgICAgcmV0dXJuIC0xOworfQorCisvLyBDYWxsZWQgb24gcHJvY2VzcyBleGl0IHRvIGNsZWFudXAgV2luc29jayBkYXRhLgordm9pZCB3aW5zb2NrQ2xlYW51cCgpIHsKKyAgICBXU0FDbGVhbnVwKCk7Cit9CisKKy8vIEluaXRpYWxpemUgV2luc29jaywgbXVzdCBiZSBjYWxsZWQgZWFybHksIG9yIHNvY2tldCBjcmVhdGlvbiB3aWxsIGZhaWwuCitpbnQgd2luc29ja0luaXQoKSB7CisgICAgV1NBREFUQSBEYXRhOworICAgIGludCByZXQgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDIsMiksICZEYXRhKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgKHZvaWQpIFdTQUdldExhc3RFcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIDo6YXRleGl0KHdpbnNvY2tDbGVhbnVwKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzb2NrZXRJbml0V2luc29jaygpIHsKKyAgICBlbnVtIHsKKyAgICAgICAgVU5JTklUSUFMSVpFRCA9IDAsCisgICAgICAgIElOSVRJQUxJWklORyA9IDEsCisgICAgICAgIENPTVBMRVRFRCA9IDIsCisgICAgfTsKKyAgICAvLyBFbnN1cmUgdGhyZWFkLXNhZmUgbGF6eSBpbml0aWFsaXphdGlvbi4KKyAgICAvLworICAgIC8vIFRPRE8oZGlnaXQpOiBDcmVhdGUgYW5kcm9pZDo6YmFzZTo6T25jZSBpbnN0ZWFkIHRvIG1ha2UgdGhpcyBhCisgICAgLy8gbGl0dGxlIG1vcmUgcG9ydGFibGUgLyB0ZXN0YWJsZS4KKyAgICBzdGF0aWMgTE9ORyB2b2xhdGlsZSBzV2luc29ja0luaXQgPSAwOworCisgICAgTE9ORyBzdGF0dXMgPSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgKKyAgICAgICAgICAgICZzV2luc29ja0luaXQsIElOSVRJQUxJWklORywgVU5JTklUSUFMSVpFRCk7CisgICAgaWYgKHN0YXR1cyA9PSBDT01QTEVURUQpIHsKKyAgICAgICAgLy8gV2luc29jayBhbHJlYWR5IGluaXRpYWxpemVkLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gVU5JTklUSUFMSVpFRCkgeworICAgICAgICAvLyBGaXJzdCB0aHJlYWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICAgICAgICB3aW5zb2NrSW5pdCgpOworICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlKCZzV2luc29ja0luaXQsIENPTVBMRVRFRCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKHN0YXR1cyA9PSBJTklUSUFMSVpJTkcpIHsKKyAgICAgICAgOjpTbGVlcCgwKTsKKyAgICAgICAgc3RhdHVzID0gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoCisgICAgICAgICAgICAgICAgJnNXaW5zb2NrSW5pdCwgSU5JVElBTElaSU5HLCBJTklUSUFMSVpJTkcpOworICAgIH0KK30KKworI2VuZGlmIC8vICFfV0lOMzIKKworLy8gVXNlIE9OX1NPQ0tFVF9FUlJPUl9SRVRVUk5fTTEgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGggdmFsdWUgLTEKKy8vIGFuZCBlcnJubyBzZXQgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsIHdoZW4gfHJldHwgY29ycmVzcG9uZHMgdG8KKy8vIGEgc29ja2V0IGVycm9yIGNvZGUuCisvLworLy8gT24gV2luZG93cywgaWYgfHJldHwgaXMgU09DS0VUX0VSUk9SLCB0aGlzIGNhbGxzIGZpeEVycm5vKCkgdG8KKy8vIHNldCBlcnJubyB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBhbmQgcmV0dXJuIC0xLgorLy8KKy8vIE9uIFBvc2l4LCBpZiB8cmV0fCBpcyBuZWdhdGl2ZSwgdGhpcyBzaW1wbHkgcmV0dXJucyAtMS4KKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBPTl9TT0NLRVRfRVJST1JfUkVUVVJOX00xKHJldCkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIGlmIChyZXQgPT0gU09DS0VUX0VSUk9SKSB7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gZml4RXJybm8oKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gd2hpbGUgKDApCisjZWxzZSAgLy8gIV9XSU4zMgorIyAgZGVmaW5lIE9OX1NPQ0tFVF9FUlJPUl9SRVRVUk5fTTEocmV0KSBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgaWYgKChyZXQpIDwgMCkgeyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSB3aGlsZSAoMCk7CisjZW5kaWYgIC8vICFfV0lOMzIKKworLy8gR2VuZXJpYyB1bmlvbiB0byBoYW5kbGUgdGhlIG1lc3Mgb2Ygc29ja2FkZHIgdmFyaWFudHMgd2l0aG91dAorLy8gY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgYWxpYXNpbmcuCit1bmlvbiBTb2NrQWRkcmVzc1N0b3JhZ2UgeworICAgIHN0cnVjdCBzb2NrYWRkciBnZW5lcmljOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbmV0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaW42OworCisgICAgdm9pZCBpbml0TG9vcGJhY2tGb3IoaW50IHBvcnQsIGludCBkb21haW4pIHsKKyAgICAgICAgaWYgKGRvbWFpbiA9PSBBRl9JTkVUKSB7CisgICAgICAgICAgICBtZW1zZXQoJmluZXQsIDAsIHNpemVvZihpbmV0KSk7CisgICAgICAgICAgICBpbmV0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICAgICAgaW5ldC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICAgICAgaW5ldC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICAgICAgICB9IGVsc2UgaWYgKGRvbWFpbiA9PSBBRl9JTkVUNikgeworICAgICAgICAgICAgbWVtc2V0KCZpbjYsIDAsIHNpemVvZihpbjYpKTsKKyAgICAgICAgICAgIGluNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICAgICAgaW42LnNpbjZfcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICAgICAgaW42LnNpbjZfYWRkciA9IElONkFERFJfTE9PUEJBQ0tfSU5JVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENIRUNLKGZhbHNlKSA8PCAiSW52YWxpZCBkb21haW4gIiA8PCBkb21haW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGZyb20gYSBnZW5lcmljIEJTRCBzb2NrZXQgYWRkcmVzcy4KKyAgICAvLyB8ZnJvbXwgcG9pbnRzIHRvIGEgc29ja2FkZHJfaW4gb3Igc29ja2FkZHJfaW42IHN0cnVjdHVyZS4KKyAgICAvLyB8ZnJvbUxlbnwgaXMgaXRzIGxlbmd0aCBpbiBieXRlcy4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZS9lcnJubyBvdGhlcndpc2UuCisgICAgYm9vbCBpbml0RnJvbUJzZChjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgZnJvbUxlbikgeworICAgICAgICBhdXRvIHNyYyA9IHN0YXRpY19jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcio+KGZyb20pOworICAgICAgICBzd2l0Y2goc3JjLT5zYV9mYW1pbHkpIHsKKyAgICAgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgICAgICBpZiAoZnJvbUxlbiAhPSBzaXplb2YoaW5ldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5ldCA9ICpzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPihmcm9tKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgICAgICBpZiAoZnJvbUxlbiAhPSBzaXplb2YoaW42KSkgeworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbjYgPSAqc3RhdGljX2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KGZyb20pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFBvcnQoaW50IHBvcnQpIHsKKyAgICAgICAgc3dpdGNoIChnZW5lcmljLnNhX2ZhbWlseSkgeworICAgICAgICAgICAgY2FzZSBBRl9JTkVUOiBpbmV0LnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRl9JTkVUNjogaW42LnNpbjZfcG9ydCA9IGh0b25zKHBvcnQpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBnZXRQb3J0KCkgeworICAgICAgICBzd2l0Y2ggKGdlbmVyaWMuc2FfZmFtaWx5KSB7CisgICAgICAgICAgICBjYXNlIEFGX0lORVQ6IHJldHVybiBudG9ocyhpbmV0LnNpbl9wb3J0KTsKKyAgICAgICAgICAgIGNhc2UgQUZfSU5FVDY6IHJldHVybiBudG9ocyhpbjYuc2luNl9wb3J0KTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBmYW1pbHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZW5lcmljLnNhX2ZhbWlseTsKKyAgICB9CisKKyAgICBzb2NrbGVuX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IHN6OworICAgICAgICBzd2l0Y2ggKGdlbmVyaWMuc2FfZmFtaWx5KSB7CisgICAgICAgICAgICBjYXNlIEFGX0lORVQ6IHN6ID0gc2l6ZW9mKGluZXQpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZfSU5FVDY6IHN6ID0gc2l6ZW9mKGluNik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogc3ogPSBzaXplb2YoZ2VuZXJpYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc3opOworICAgIH0KKworICAgIGVudW0gUmVzb2x2ZU9wdGlvbiB7CisgICAgICAgIGtEZWZhdWx0UmVzb2x1dGlvbiA9IDAsCisgICAgICAgIGtQcmVmZXJJcHY2ID0gKDEgPDwgMCksCisgICAgfTsKKworICAgIC8vIFJlc29sdmUgaG9zdCBuYW1lIHxob3N0TmFtZXwgaW50byBhIGxpc3Qgb2YgU29ja0FkZHJlc3NTdG9yYWdlLgorICAgIC8vIElmIHxwcmVmZXJJcHY2fCBpcyB0cnVlLCBwcmVmZXIgSVB2NiBhZGRyZXNzZXMgaWYgYXZhaWxhYmxlLgorICAgIC8vIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlIGFuZCBzZXRzIHwqb3V0fCB0byB0aGUgcmVzdWx0LgorICAgIHN0YXRpYyBib29sIHJlc29sdmVIb3N0TmFtZVRvTGlzdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGhvc3ROYW1lLCBSZXNvbHZlT3B0aW9uIHJlc29sdmVPcHRpb24sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb2NrQWRkcmVzc1N0b3JhZ2U+KiBvdXQpIHsKKyAgICAgICAgYWRkcmluZm8qIHJlcyA9IG51bGxwdHI7CisgICAgICAgIGJvb2wgcHJlZmVySXB2NiA9IChyZXNvbHZlT3B0aW9uID09IGtQcmVmZXJJcHY2KTsKKyAgICAgICAgYWRkcmluZm8gaGludHMgPSB7fTsKKyAgICAgICAgaGludHMuYWlfZmFtaWx5ID0gcHJlZmVySXB2NiA/IEFGX0lORVQ2IDogQUZfVU5TUEVDOworICAgICAgICBpbnQgcmV0ID0gOjpnZXRhZGRyaW5mbyhob3N0TmFtZSwgbnVsbHB0ciwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3JzLgorICAgICAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICAgICAgICAgIGNhc2UgRUFJX0FHQUlOOiAgLy8gc2VydmVyIGlzIGRvd24KKyAgICAgICAgICAgICAgICBjYXNlIEVBSV9GQUlMOiAgIC8vIHNlcnZlciBpcyBzaWNrCisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVIT1NURE9XTjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisvKiBOT1RFIHRoYXQgaW4geDg2XzY0LXc2NC1taW5ndzMyIGJvdGggRUFJX05PREFUQSBhbmQgRUFJX05PTkFNRSBhcmUgdGhlIHNhbWUgKi8KKyNpZiBkZWZpbmVkKEVBSV9OT0RBVEEpICYmIChFQUlfTk9EQVRBICE9IEVBSV9OT05BTUUpCisgICAgICAgICAgICAgICAgY2FzZSBFQUlfTk9EQVRBOgorI2VuZGlmCisgICAgICAgICAgICAgICAgY2FzZSBFQUlfTk9OQU1FOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBFTk9FTlQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFQUlfTUVNT1JZOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBFTk9NRU07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJybm8gPSBlcnI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbnN1cmUgfHJlc3wgaXMgYWx3YXlzIGRlbGV0ZWQgb24gZXhpdC4KKyAgICAgICAgc3RkOjp2ZWN0b3I8U29ja0FkZHJlc3NTdG9yYWdlPiByZXN1bHQ7CisgICAgICAgIGZvciAoYXV0byByID0gcmVzOyByICE9IG51bGxwdHI7IHIgPSByLT5haV9uZXh0KSB7CisgICAgICAgICAgICBTb2NrQWRkcmVzc1N0b3JhZ2UgYWRkcjsKKyAgICAgICAgICAgIGlmICghYWRkci5pbml0RnJvbUJzZChyLT5haV9hZGRyLCByLT5haV9hZGRybGVuKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoYWRkcikpOworICAgICAgICB9CisgICAgICAgIDo6ZnJlZWFkZHJpbmZvKHJlcyk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3V0LT5zd2FwKHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgYSBTb2NrQWRkcmVzc1N0b3JhZ2UgaW5zdGFuY2UgYnkgcmVzb2x2aW5nIHxob3N0bmFtZXwgdG8KKyAgICAvLyBpdHMgcHJlZmVycmVkIGFkZHJlc3MsIGFjY29yZGluZyB0byB8cmVzb2x2ZU9wdGlvbnN8LCB3aXRoIHBvcnQgfHBvcnR8LgorICAgIC8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlL2Vycm5vIG9uIGVycm9yLgorICAgIGJvb2wgaW5pdFJlc29sdmUoY29uc3QgY2hhciogaG9zdG5hbWUsIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZU9wdGlvbiByZXNvbHZlT3B0aW9ucyA9IGtEZWZhdWx0UmVzb2x1dGlvbikgeworICAgICAgICBzdGQ6OnZlY3RvcjxTb2NrQWRkcmVzc1N0b3JhZ2U+IGFkZHJlc3NlczsKKyAgICAgICAgaWYgKCFyZXNvbHZlSG9zdE5hbWVUb0xpc3QoaG9zdG5hbWUsIHJlc29sdmVPcHRpb25zLCAmYWRkcmVzc2VzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGJvb2wgcHJlZmVySXB2NiA9IChyZXNvbHZlT3B0aW9ucyAmIGtQcmVmZXJJcHY2KTsKKyAgICAgICAgY29uc3QgU29ja0FkZHJlc3NTdG9yYWdlKiBhZGRyNiA9IG51bGxwdHI7CisgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzU3RvcmFnZSogYWRkcjQgPSBudWxscHRyOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFkZHIgOiBhZGRyZXNzZXMpIHsKKyAgICAgICAgICAgIGlmIChhZGRyLmZhbWlseSgpID09IEFGX0lORVQgJiYgIWFkZHI0KSB7CisgICAgICAgICAgICAgICAgYWRkcjQgPSAmYWRkcjsKKyAgICAgICAgICAgICAgICBpZiAoIXByZWZlcklwdjYpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRyLmZhbWlseSgpID09IEFGX0lORVQ2ICYmICFhZGRyNikgeworICAgICAgICAgICAgICAgIGFkZHI2ID0gJmFkZHI7CisgICAgICAgICAgICAgICAgaWYgKHByZWZlcklwdjYpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzU3RvcmFnZSogYWRkcjsKKyAgICAgICAgaWYgKHByZWZlcklwdjYpIHsKKyAgICAgICAgICAgIGFkZHIgPSBhZGRyNiA/IGFkZHI2IDogYWRkcjQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRyID0gYWRkcjQgPyBhZGRyNCA6IGFkZHI2OworICAgICAgICB9CisgICAgICAgIGlmICghYWRkcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICp0aGlzID0gKmFkZHI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK2ludCBzb2NrZXRTZXRPcHRpb24oaW50IHNvY2tldCwgaW50ICBkb21haW4sIGludCBvcHRpb24sIGludCAgX2ZsYWcpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBEV09SRCBmbGFnID0gKERXT1JEKSBfZmxhZzsKKyNlbHNlCisgICAgaW50IGZsYWcgPSBfZmxhZzsKKyNlbmRpZgorICAgIGVycm5vID0gMDsKKyAgICBpbnQgcmV0ID0gOjpzZXRzb2Nrb3B0KHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKikmZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbGFnKSk7CisgICAgT05fU09DS0VUX0VSUk9SX1JFVFVSTl9NMShyZXQpOworICAgIHJldHVybiAwOworfQorCitpbnQgc29ja2V0U2V0WFJldXNlQWRkcihpbnQgc29ja2V0KSB7CisjaWZkZWYgX1dJTjMyCisgICAvKiBvbiBXaW5kb3dzLCBTT19SRVVTRUFERFIgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHNldmVyYWwgcHJvZ3JhbXMgY2FuCisgICAgKiBiaW5kIHRvIHRoZSBzYW1lIHBvcnQuIHRoaXMgaXMgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgVW5peAorICAgICogc2VtYW50aWNzLiBVc2UgaW5zdGVhZCBTT19FWENMVVNJVkVBRERSIHRvIGV4cGxpY2l0ZWx5IHByZXZlbnQgdGhpcy4KKyAgICAqLworICAgIHJldHVybiBzb2NrZXRTZXRPcHRpb24oc29ja2V0LCBTT0xfU09DS0VULCBTT19FWENMVVNJVkVBRERSVVNFLCAxKTsKKyNlbHNlCisgICAgcmV0dXJuIHNvY2tldFNldE9wdGlvbihzb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgMSk7CisjZW5kaWYKK30KKworI2lmZGVmIF9XSU4zMgoraW50IHNvY2tldFRjcENvbm5lY3QoaW50IHNvY2tldCwgY29uc3QgU29ja0FkZHJlc3NTdG9yYWdlKiBhZGRyKSB7CisgICAgZXJybm8gPSAwOworICAgIGludCByZXQgPSA6OmNvbm5lY3Qoc29ja2V0LCAmYWRkci0+Z2VuZXJpYywgYWRkci0+c2l6ZSgpKTsKKyAgICBPTl9TT0NLRVRfRVJST1JfUkVUVVJOX00xKHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZiAgLy8gX1dJTjMyCisKK2ludCBzb2NrZXRUY3BCaW5kQW5kTGlzdGVuKGludCBzb2NrZXQsIGNvbnN0IFNvY2tBZGRyZXNzU3RvcmFnZSogYWRkcikgeworICAgIGludCBrQmFja2xvZyA9IDU7CisKKyAgICBlcnJubyA9IDA7CisgICAgaW50IHJldCA9IDo6YmluZChzb2NrZXQsICZhZGRyLT5nZW5lcmljLCBhZGRyLT5zaXplKCkpOworICAgIE9OX1NPQ0tFVF9FUlJPUl9SRVRVUk5fTTEocmV0KTsKKworICAgIGVycm5vID0gMDsKKyAgICByZXQgPSA6Omxpc3Rlbihzb2NrZXQsIGtCYWNrbG9nKTsKKyAgICBPTl9TT0NLRVRfRVJST1JfUkVUVVJOX00xKHJldCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIF9XSU4zMgoraW50IHNvY2tldEFjY2VwdChpbnQgc29ja2V0KSB7CisgICAgZXJybm8gPSAwOworICAgIGludCByZXQgPSA6OmFjY2VwdChzb2NrZXQsIE5VTEwsIE5VTEwpOworICAgIE9OX1NPQ0tFVF9FUlJPUl9SRVRVUk5fTTEocmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmICAvLyBfV0lOMzIKKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgc29ja2V0Q2xvc2UoaW50IHNvY2tldCkgeworICAgIGludCBzYXZlX2Vycm5vID0gZXJybm87CisjaWZkZWYgX1dJTjMyCisgICAgOjpjbG9zZXNvY2tldChzb2NrZXQpOworI2Vsc2UKKyAgICBJR05PUkVfRUlOVFIoOjpjbG9zZShzb2NrZXQpKTsKKyNlbmRpZgorICAgIGVycm5vID0gc2F2ZV9lcnJubzsKK30KKworc3NpemVfdCBzb2NrZXRSZWN2KGludCBzb2NrZXQsIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlckxlbikgeworICAgIGVycm5vID0gMDsKKyAgICBzc2l6ZV90IHJldCA9IDo6cmVjdihzb2NrZXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlciksIGJ1ZmZlckxlbiwgMCk7CisgICAgT05fU09DS0VUX0VSUk9SX1JFVFVSTl9NMShyZXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3Qgc29ja2V0U2VuZChpbnQgc29ja2V0LCBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJMZW4pIHsKKyAgICBlcnJubyA9IDA7CisjaWZkZWYgTVNHX05PU0lHTkFMCisgICAgLy8gUHJldmVudCBTSUdQSVBFIGdlbmVyYXRpb24gb24gTGludXggd2hlbiB3cml0aW5nIHRvIGEgYnJva2VuIHBpcGUuCisgICAgLy8gOjpzZW5kKCkgd2lsbCByZXR1cm4gLTEvRVBJUEUgaW5zdGVhZC4KKyAgICBjb25zdCBpbnQgc2VuZEZsYWdzID0gTVNHX05PU0lHTkFMOworI2Vsc2UKKyAgICAvLyBGb3IgRGFyd2luLCB0aGlzIGlzIGhhbmRsZWQgYnkgc2V0dGluZyBTT19OT1NJR1BJUEUgd2hlbiBjcmVhdGluZworICAgIC8vIHRoZSBzb2NrZXQuIE9uIFdpbmRvd3MsIHRoZXJlIGlzIG5vIFNJR1BJUEUgc2lnbmFsIHRvIGNvbnNpZGVyLgorICAgIGNvbnN0IGludCBzZW5kRmxhZ3MgPSAwOworI2VuZGlmCisgICAgc3NpemVfdCByZXQgPSA6OnNlbmQoc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGVuLCBzZW5kRmxhZ3MpOworICAgIE9OX1NPQ0tFVF9FUlJPUl9SRVRVUk5fTTEocmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIHNvY2tldFNlbmRBbGwoaW50IHNvY2tldCwgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKSB7CisgICAgYXV0byBidWYgPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKTsKKyAgICB3aGlsZSAoYnVmZmVyTGVuID4gMCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IHNvY2tldFNlbmQoc29ja2V0LCBidWYsIGJ1ZmZlckxlbik7CisgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgIGJ1ZmZlckxlbiAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIHNvY2tldFJlY3ZBbGwoaW50IHNvY2tldCwgdm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKSB7CisgICAgYXV0byBidWYgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmZmVyKTsKKyAgICB3aGlsZSAoYnVmZmVyTGVuID4gMCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IHNvY2tldFJlY3Yoc29ja2V0LCBidWYsIGJ1ZmZlckxlbik7CisgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgIGJ1ZmZlckxlbiAtPSByZXQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIHNvY2tldFNodXRkb3duV3JpdGVzKGludCBzb2NrZXQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICA6OnNodXRkb3duKHNvY2tldCwgU0RfU0VORCk7CisjZWxzZQorICAgIDo6c2h1dGRvd24oc29ja2V0LCBTSFVUX1dSKTsKKyNlbmRpZgorfQorCit2b2lkIHNvY2tldFNodXRkb3duUmVhZHMoaW50IHNvY2tldCkgeworI2lmZGVmIF9XSU4zMgorICAgIDo6c2h1dGRvd24oc29ja2V0LCBTRF9SRUNFSVZFKTsKKyNlbHNlCisgICAgOjpzaHV0ZG93bihzb2NrZXQsIFNIVVRfUkQpOworI2VuZGlmCit9CisKK3ZvaWQgc29ja2V0U2V0Tm9uQmxvY2tpbmcoaW50IHNvY2tldCkgeworI2lmZGVmIF9XSU4zMgorICAgIHVuc2lnbmVkIGxvbmcgb3B0ID0gMTsKKyAgICBpb2N0bHNvY2tldChzb2NrZXQsIEZJT05CSU8sICZvcHQpOworI2Vsc2UKKyAgICBpbnQgICBmbGFncyA9IGZjbnRsKHNvY2tldCwgRl9HRVRGTCk7CisgICAgZmNudGwoc29ja2V0LCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spOworI2VuZGlmCit9CisKK3ZvaWQgc29ja2V0U2V0QmxvY2tpbmcoaW50IHNvY2tldCkgeworI2lmZGVmIF9XSU4zMgorICAgIHVuc2lnbmVkIGxvbmcgb3B0ID0gMDsKKyAgICBpb2N0bHNvY2tldChzb2NrZXQsIEZJT05CSU8sICZvcHQpOworI2Vsc2UKKyAgICBpbnQgICBmbGFncyA9IGZjbnRsKHNvY2tldCwgRl9HRVRGTCk7CisgICAgZmNudGwoc29ja2V0LCBGX1NFVEZMLCBmbGFncyAmIH5PX05PTkJMT0NLKTsKKyNlbmRpZgorfQorCit2b2lkIHNvY2tldFNldE5vRGVsYXkoaW50IHNvY2tldCkgeworICAgIHNvY2tldFNldE9wdGlvbihzb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgc29ja2V0Q3JlYXRlVGNwRm9yKGludCBkb21haW4pIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBzb2NrZXRJbml0V2luc29jaygpOworI2VuZGlmCisgICAgZXJybm8gPSAwOworICAgIGludCBzID0gOjpzb2NrZXQoZG9tYWluLCBTT0NLX1NUUkVBTSwgMCk7CisgICAgT05fU09DS0VUX0VSUk9SX1JFVFVSTl9NMShzKTsKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgICAvLyBEaXNhYmxlIFNJR1BJUEUgZ2VuZXJhdGlvbiBvbiBEYXJ3aW4uCisgICAgLy8gV2hlbiB3cml0aW5nIHRvIGEgYnJva2VuIHBpcGUsIHNlbmQoKSB3aWxsIHJldHVybiAtMSBhbmQKKyAgICAvLyBzZXQgZXJybm8gdG8gRVBJUEUuCisgICAgc29ja2V0U2V0T3B0aW9uKHMsIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgMSk7CisjZW5kaWYKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGludCBzb2NrZXRUY3BMb29wYmFja1NlcnZlckZvcihpbnQgcG9ydCwgaW50IGRvbWFpbikgeworICAgIFNjb3BlZFNvY2tldCBzKHNvY2tldENyZWF0ZVRjcEZvcihkb21haW4pKTsKKyAgICBpZiAocy5nZXQoKSA8IDApIHsKKyAgICAgICAgRFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXRcbiI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzb2NrZXRTZXRYUmV1c2VBZGRyKHMuZ2V0KCkpOworCisgICAgU29ja0FkZHJlc3NTdG9yYWdlIGFkZHI7CisgICAgYWRkci5pbml0TG9vcGJhY2tGb3IocG9ydCwgZG9tYWluKTsKKworICAgIGlmIChzb2NrZXRUY3BCaW5kQW5kTGlzdGVuKHMuZ2V0KCksICZhZGRyKSA8IDApIHsKKyAgICAgICAgRFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgYmluZCB0byBUQ1AgbG9vcGJhY2sgcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBwb3J0CisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHMucmVsZWFzZSgpOworfQorCitpbnQgc29ja2V0VGNwNExvb3BiYWNrU2VydmVyKGludCBwb3J0KSB7CisgICAgcmV0dXJuIHNvY2tldFRjcExvb3BiYWNrU2VydmVyRm9yKHBvcnQsIEFGX0lORVQpOworfQorCitpbnQgc29ja2V0VGNwNkxvb3BiYWNrU2VydmVyKGludCBwb3J0KSB7CisgICAgcmV0dXJuIHNvY2tldFRjcExvb3BiYWNrU2VydmVyRm9yKHBvcnQsIEFGX0lORVQ2KTsKK30KKworc3RhdGljIGludCBzb2NrZXRUY3BMb29wYmFja0NsaWVudEZvcihpbnQgcG9ydCwgaW50IGRvbWFpbikgeworICAgIFNjb3BlZFNvY2tldCBzKHNvY2tldENyZWF0ZVRjcEZvcihkb21haW4pKTsKKyAgICBpZiAocy5nZXQoKSA8IDApIHsKKyAgICAgICAgRFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXRcbiI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBTb2NrQWRkcmVzc1N0b3JhZ2UgYWRkcjsKKyAgICBhZGRyLmluaXRMb29wYmFja0Zvcihwb3J0LCBkb21haW4pOworCisgICAgaWYgKDo6Y29ubmVjdChzLmdldCgpLCAmYWRkci5nZW5lcmljLCBhZGRyLnNpemUoKSkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcy5yZWxlYXNlKCk7Cit9CisKK2ludCBzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQoaW50IHBvcnQpIHsKKyAgICByZXR1cm4gc29ja2V0VGNwTG9vcGJhY2tDbGllbnRGb3IocG9ydCwgQUZfSU5FVCk7Cit9CisKK2ludCBzb2NrZXRUY3A2TG9vcGJhY2tDbGllbnQoaW50IHBvcnQpIHsKKyAgICByZXR1cm4gc29ja2V0VGNwTG9vcGJhY2tDbGllbnRGb3IocG9ydCwgQUZfSU5FVDYpOworfQorCitpbnQgc29ja2V0QWNjZXB0QW55KGludCBzZXJ2ZXJTb2NrZXQpIHsKKyAgICBlcnJubyA9IDA7CisgICAgaW50IHMgPSBIQU5ETEVfRUlOVFIoOjphY2NlcHQoc2VydmVyU29ja2V0LCBOVUxMLCBOVUxMKSk7CisgICAgT05fU09DS0VUX0VSUk9SX1JFVFVSTl9NMShzKTsKKyAgICByZXR1cm4gczsKK30KKworaW50IHNvY2tldENyZWF0ZVBhaXIoaW50KiBmZDEsIGludCogZmQyKSB7CisjaWZuZGVmIF9XSU4zMgorICAgIGludCBmZHNbMl07CisgICAgaW50IHJldCA9IDo6c29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgZmRzKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIHNvY2tldFNldE5vbkJsb2NraW5nKGZkc1swXSk7CisgICAgICAgIHNvY2tldFNldE5vbkJsb2NraW5nKGZkc1sxXSk7CisjaWZkZWYgU09fTk9TSUdQSVBFCisgICAgICAgIHNvY2tldFNldE9wdGlvbihmZHNbMF0sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgMSk7CisgICAgICAgIHNvY2tldFNldE9wdGlvbihmZHNbMV0sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgMSk7CisjZW5kaWYKKyAgICAgICAgKmZkMSA9IGZkc1swXTsKKyAgICAgICAgKmZkMiA9IGZkc1sxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBEUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IHBhaXJcbiI7CisgICAgfQorICAgIHJldHVybiByZXQ7CisjZWxzZSAvKiBfV0lOMzIgKi8KKyAgICAvKiBvbiBXaW5kb3dzLCBzZWxlY3QoKSBvbmx5IHdvcmtzIHdpdGggbmV0d29yayBzb2NrZXRzLCB3aGljaAorICAgICAqIG1lYW5zIHdlIGFic29sdXRlbHkgY2Fubm90IHVzZSBXaW4zMiBQSVBFcyB0byBpbXBsZW1lbnQKKyAgICAgKiBzb2NrZXQgcGFpcnMgd2l0aCB0aGUgY3VycmVudCBldmVudCBsb29wIGltcGxlbWVudGF0aW9uLgorICAgICAqIFdlJ3JlIGdvaW5nIHRvIGRvIGxpa2UgQ3lnd2luOiBjcmVhdGUgYSByYW5kb20gcGFpcgorICAgICAqIG9mIGxvY2FsaG9zdCBUQ1Agc29ja2V0cyBhbmQgY29ubmVjdCB0aGVtIHRvZ2V0aGVyCisgICAgICovCisKKyAgICAvKiBmaXJzdCwgY3JlYXRlIHRoZSAnc2VydmVyJyBzb2NrZXQuCisgICAgICogYSBwb3J0IG51bWJlciBvZiAwIG1lYW5zICdhbnkgcG9ydCBiZXR3ZWVuIDEwMjQgYW5kIDUwMDAuCisgICAgICogc2VlIFdpbnNvY2sgYmluZCgpIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgKi8KKyAgICBTY29wZWRTb2NrZXQgczAoc29ja2V0VGNwNExvb3BiYWNrU2VydmVyKDApKTsKKyAgICBpZiAoczAuZ2V0KCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBJTVBPUlRBTlQ6IEtlZXAgdGhlIHMwIHNvY2tldCBpbiBibG9ja2luZyBtb2RlLCBvciB0aGUgYWNjZXB0KCkKKyAgICAvLyBiZWxvdyBtYXkgZmFpbCB3aXRoIFdTQUVXT1VMREJMT0NLIHJhbmRvbWx5LgorCisgICAgLyogbm93IGNvbm5lY3QgYSBjbGllbnQgc29ja2V0IHRvIGl0LCB3ZSBmaXJzdCBuZWVkIHRvCisgICAgICogZXh0cmFjdCB0aGUgc2VydmVyIHNvY2tldCdzIHBvcnQgbnVtYmVyICovCisgICAgaW50IHBvcnQgPSBzb2NrZXRHZXRQb3J0KHMwLmdldCgpKTsKKworICAgIFNjb3BlZFNvY2tldCBzMihzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQocG9ydCkpOworICAgIGlmICghczIudmFsaWQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogd2UgbmVlZCB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gb24gdGhlIHNlcnZlciBzb2NrZXQKKyAgICAgKiB0aGlzIHdpbGwgY3JlYXRlIHRoZSBzZWNvbmQgc29ja2V0IGZvciB0aGUgcGFpcgorICAgICAqLworICAgIFNjb3BlZFNvY2tldCBzMShzb2NrZXRBY2NlcHQoczAuZ2V0KCkpKTsKKyAgICBpZiAoIXMxLnZhbGlkKCkpIHsKKyAgICAgICAgICAgIERQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gc2VydmVyIHNvY2tldFxuIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzb2NrZXRTZXROb25CbG9ja2luZyhzMS5nZXQoKSk7CisKKyAgICAqZmQxID0gczEucmVsZWFzZSgpOworICAgICpmZDIgPSBzMi5yZWxlYXNlKCk7CisKKyAgICByZXR1cm4gMDsKKyNlbmRpZiAvKiBfV0lOMzIgKi8KK30KKworaW50IHNvY2tldENyZWF0ZVRjcDQoKSB7CisgICAgcmV0dXJuIHNvY2tldENyZWF0ZVRjcEZvcihBRl9JTkVUKTsKK30KKworaW50IHNvY2tldENyZWF0ZVRjcDYoKSB7CisgICAgcmV0dXJuIHNvY2tldENyZWF0ZVRjcEZvcihBRl9JTkVUNik7Cit9CisKK2ludCBzb2NrZXRHZXRQb3J0KGludCBzb2NrZXQpIHsKKyAgICBTb2NrQWRkcmVzc1N0b3JhZ2UgYWRkcjsKKyAgICBzb2NrbGVuX3QgYWRkckxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHIpKTsKKyAgICBpZiAoZ2V0c29ja25hbWUoc29ja2V0LCAmYWRkci5nZW5lcmljLCAmYWRkckxlbikgPCAwKSB7CisgICAgICAgIERQTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGdldCBzb2NrZXQgbmFtZSFcbiI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGFkZHIuZ2V0UG9ydCgpOworfQorCitpbnQgc29ja2V0R2V0UGVlclBvcnQoaW50IHNvY2tldCkgeworICAgIFNvY2tBZGRyZXNzU3RvcmFnZSBhZGRyOworICAgIHNvY2tsZW5fdCBhZGRyTGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcikpOworICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXQsICZhZGRyLmdlbmVyaWMsICZhZGRyTGVuKSA8IDApIHsKKyAgICAgICAgRFBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgZ2V0IHNvY2tldCBwZWVyIG5hbWUhIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gYWRkci5nZXRQb3J0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZmQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIENsb3NlIGEgc29ja2V0LCBwcmVzZXJ2ZXMgZXJybm8gdG8gZW5zdXJlIGl0IGNhbiBiZSB1c2VkIGluCisvLyBlcnJvci1oYW5kbGluZyBjb2RlIHBhdGhzLgordm9pZCBzb2NrZXRDbG9zZShpbnQgc29ja2V0KTsKKworLy8gVHJ5IHRvIHJlY2VpdmUgdXAgdG8gfGJ1ZmZlckxlbnwgYnl0ZXMgZnJvbSB8c29ja2V0fCBpbnRvIHxidWZmZXJ8LgorLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZCwgMCBpbiBjYXNlIG9mIGRpc2Nvbm5lY3Rpb24sCisvLyBvciAtMS9lcnJubyBpbiBjYXNlIG9mIGVycm9yLiBOb3RlIHRoYXQgdGhpcyBsb29wcyBhcm91bmQgRUlOVFIgYXMKKy8vIGEgY29udmVuaWVuY2UuCitzc2l6ZV90IHNvY2tldFJlY3YoaW50IHNvY2tldCwgdm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKTsKKworLy8gVHJ5IHRvIHNlbmQgdXAgdG8gfGJ1ZmZlckxlbnwgYnl0ZXMgdG8gfHNvY2tldHwgZnJvbSB8YnVmZmVyfC4KKy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHNlbnQsIDAgaW4gY2FzZSBvZiBkaXNjb25uZWN0aW9uLAorLy8gb3IgLTEvZXJybm8gaW4gY2FzZSBvZiBlcnJvci4gTm90ZSB0aGF0IHRoaXMgbG9vcHMgYXJvdW5kIEVJTlRSIGFzCisvLyBhIGNvbnZlbmllbmNlLiBBbHNvLCB0aGlzIHdpbGwgKm5vdCogZ2VuZXJhdGUgYSBTSUdQSVBFIHNpZ25hbCB3aGVuCisvLyB3cml0aW5nIHRvIGEgYnJva2VuIHBpcGUgKGJ1dCBlcnJubyB3aWxsIGJlIHNldCB0byBFUElQRSkuCitzc2l6ZV90IHNvY2tldFNlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnVmZmVyTGVuKTsKKworLy8gU2FtZSBhcyBzb2NrZXRTZW5kKCkgYnV0IGxvb3AgYXJvdW5kIHRyYW5zaWVudCB3cml0ZXMuCisvLyBSZXR1cm5zIHRydWUgaWYgYWxsIGJ5dGVzIHdlcmUgc2VudCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBzb2NrZXRTZW5kQWxsKGludCBzb2NrZXQsIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlckxlbik7CisKKy8vIFNhbWUgYXMgc29ja2V0UmVjdigpIGJ1dCBsb29wIGFyb3VuZCB0cmFuc2llbnQgcmVhZHMuCisvLyBSZXR1cm5zIHR1cmUgaWYgYWxsIGJ5dGVzIHdlcmUgcmVjZWl2ZWQsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgc29ja2V0UmVjdkFsbChpbnQgc29ja2V0LCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJMZW4pOworCisvLyBTaHV0ZG93biBhbGwgd3JpdGVzIHRvIGEgc29ja2V0Lgordm9pZCBzb2NrZXRTaHV0ZG93bldyaXRlcyhpbnQgc29ja2V0KTsKKworLy8gU2h1dGRvd24gYWxsIHJlYWRzIGZyb20gYSBzb2NrZXQuCit2b2lkIHNvY2tldFNodXRkb3duUmVhZHMoaW50IHNvY2tldCk7CisKKy8vIFNldCB0aGUgc29ja2V0IGRlc2NyaXB0b3IgfHNvY2tldHwgdG8gbm9uLWJsb2NraW5nIG1vZGUuCit2b2lkIHNvY2tldFNldE5vbkJsb2NraW5nKGludCBzb2NrZXQpOworCisvLyBTZXQgdGhlIHNvY2tldCBkZXNjcmlwdG9yIHxzb2NrZXR8IHRvIGJsb2NraW5nIG1vZGUuCit2b2lkIHNvY2tldFNldEJsb2NraW5nKGludCBzb2NrZXQpOworCisvLyBEaXNhYmxlIFRDUCBOYWdsZSBhbGdvcml0aG0gZm9yIHxzb2NrZXR8Lgordm9pZCBzb2NrZXRTZXROb0RlbGF5KGludCBzb2NrZXQpOworCisvLyBCaW5kIGFuZCBsaXN0ZW4gb24gVENQIHxwb3J0fCBvbiBsb29wYmFjayBpbnRlcmZhY2UgKGkuZS4gMTI3LjAuMC4xKS4KKy8vIFJldHVybiBuZXcgc29ja2V0IG9uIHN1Y2Nlc3MsIG9yIC0xL2Vycm5vIG9uIGVycm9yLgoraW50IHNvY2tldFRjcDRMb29wYmFja1NlcnZlcihpbnQgcG9ydCk7CisKKy8vIEJpbmQgYW5kIGxpc3RlbiBvbiBUQ1AgfHBvcnR8IG9uIElQdjYgbG9vcGJhY2sgaW50ZXJmYWNlIChpLmUuIDo6MSkuCisvLyBSZXR1cm4gbmV3IHNvY2tldCBvbiBzdWNjZXNzLCBvciAtMS9lcnJubyBvbiBlcnJvci4KK2ludCBzb2NrZXRUY3A2TG9vcGJhY2tTZXJ2ZXIoaW50IHBvcnQpOworCisvLyBDb25uZWN0IHRvIFRDUCB8cG9ydHwgb24gbG9vcGJhY2sgaW50ZXJmYWNlIChpLmUuIDEyNy4wLjAuMSkuCisvLyBSZXR1cm4gbmV3IHNvY2tldCBvbiBzdWNjZXNzLCBvciAtMS9lcnJubyBvbiBlcnJvci4KK2ludCBzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQoaW50IHBvcnQpOworCisvLyBDb25uZWN0byBUQ1AgfHBvcnR8IG9uIElQVjYgbG9vcGJhY2sgaW50ZXJmYWNlIChpLmUuIDo6MSkuCisvLyBSZXR1cm4gbmV3IHNvY2tldCBvbiBzdWNjZXNzLCBvciAtMS9lcnJubyBvbiBlcnJvci4KK2ludCBzb2NrZXRUY3A2TG9vcGJhY2tDbGllbnQoaW50IHBvcnQpOworCisvLyBBY2NlcHQgYSBjb25uZWN0aW9uIG9uIHNlcnZlciB8c29ja2V0fCwgYW5kIHJldHVybiB0aGUgbmV3IGNvbm5lY3Rpb24KKy8vIHNvY2tldCBkZXNjcmlwdG9yLCBvciAtMS9lcnJubyBvbiBlcnJvci4KK2ludCBzb2NrZXRBY2NlcHRBbnkoaW50IHNvY2tldCk7CisKKy8vIENyZWF0ZSBhIHBhaXIgb2Ygbm9uLWJsb2NraW5nIHNvY2tldHMgY29ubmVjdGVkIHRvIGVhY2ggb3RoZXIsIHRoaXMgaXMKKy8vIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgVW5peCBmdW5jdGlvbjoKKy8vICAgICBzb2NrZXRwYWlyKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgJmZkcyk7CisvLworLy8gT24gV2luZG93cyB0aGlzIHdpbGwgdXNlIGEgcGFpciBvZiBUQ1AgbG9vcGJhY2sgc29ja2V0cyBpbnN0ZWFkLgorLy8gUmV0dXJuIDAgaW4gc3VjY2Vzcywgb3IgLTEvZXJybm8gb24gZXJyb3IuCitpbnQgc29ja2V0Q3JlYXRlUGFpcihpbnQgKnMxLCBpbnQqIHMyKTsKKworLy8gQ3JlYXRlIGEgbmV3IFRDUC1iYXNlZCBzb2NrZXQuIEF0IHRoZSBtb21lbnQsIHRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZAorLy8gZm9yIHVuaXQtdGVzdGluZy4KK2ludCBzb2NrZXRDcmVhdGVUY3A0KCk7CitpbnQgc29ja2V0Q3JlYXRlVGNwNigpOworCisvLyBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIG9mIGEgVENQIG9yIFVEUCBzb2NrZXQsIG9yIC0xL2Vycm5vIG90aGVyd2lzZS4KK2ludCBzb2NrZXRHZXRQb3J0KGludCBzb2NrZXQpOworCisvLyBSZXR1cm4gdGhlIHBvcnQgbnVtYmVyIG9mIGEgVENQIHNvY2tldCBwZWVyLCBpZiBhdmFpbGFibGUsIG9yCisvLyAtMS9lcnJubyBvdGhlcndpc2UuCitpbnQgc29ja2V0R2V0UGVlclBvcnQoaW50IHNvY2tldCk7CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWZiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlsc191bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldC5oIgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RFU1QoU29ja2V0VXRpbHMsIHNvY2tldFNlbmRBbGwpIHsKKyAgICBjaGFyIGtEYXRhW10gPSAiSGVsbG8gV29ybGQhIjsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBzaXplb2Yoa0RhdGEpIC0gMVU7CisKKyAgICBpbnQgc29ja1syXTsKKyAgICBBU1NFUlRfRVEoMCwgc29ja2V0Q3JlYXRlUGFpcigmc29ja1swXSwgJnNvY2tbMV0pKTsKKworICAgIEVYUEVDVF9UUlVFKHNvY2tldFNlbmRBbGwoc29ja1swXSwga0RhdGEsIGtEYXRhTGVuKSk7CisKKyAgICBjaGFyIGRhdGFba0RhdGFMZW5dID0ge307CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrRGF0YUxlbjsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUSgxLCBzb2NrZXRSZWN2KHNvY2tbMV0sICZkYXRhW25dLCAxKSkgPDwgIiMiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXSwgZGF0YVtuXSkgPDwgIiMiIDw8IG47CisgICAgfQorCisgICAgc29ja2V0Q2xvc2Uoc29ja1sxXSk7CisgICAgc29ja2V0Q2xvc2Uoc29ja1swXSk7Cit9CisKK1RFU1QoU29ja2V0VXRpbHMsIHNvY2tldFJlY3ZBbGwpIHsKKyAgICBjaGFyIGtEYXRhW10gPSAiSGVsbG8gV29ybGQhIjsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBzaXplb2Yoa0RhdGEpIC0gMVU7CisKKyAgICBpbnQgc29ja1syXTsKKyAgICBBU1NFUlRfRVEoMCwgc29ja2V0Q3JlYXRlUGFpcigmc29ja1swXSwgJnNvY2tbMV0pKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFMZW47ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoMSwgc29ja2V0U2VuZChzb2NrWzBdLCAma0RhdGFbbl0sIDEpKSA8PCAiIyIgPDwgbjsKKyAgICB9CisKKyAgICBjaGFyIGRhdGFba0RhdGFMZW5dID0ge307CisgICAgRVhQRUNUX1RSVUUoc29ja2V0UmVjdkFsbChzb2NrWzFdLCBkYXRhLCBrRGF0YUxlbikpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrRGF0YUxlbjsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXSwgZGF0YVtuXSkgPDwgIiMiIDw8IG47CisgICAgfQorCisgICAgc29ja2V0Q2xvc2Uoc29ja1sxXSk7CisgICAgc29ja2V0Q2xvc2Uoc29ja1swXSk7Cit9CisKK1RFU1QoU29ja2V0VXRpbHMsIHNvY2tldEdldFBvcnQpIHsKKyAgICBTY29wZWRTb2NrZXQgczA7CisgICAgLy8gRmluZCBhIGZyZWUgVENQIElQdjQgcG9ydCBhbmQgYmluZCB0byBpdC4KKyAgICBpbnQgcG9ydDsKKyAgICBmb3IgKHBvcnQgPSAxMDI0OyBwb3J0IDwgNjU1MzY7ICsrcG9ydCkgeworICAgICAgICBzMC5yZXNldChzb2NrZXRUY3A0TG9vcGJhY2tTZXJ2ZXIocG9ydCkpOworICAgICAgICBpZiAoczAudmFsaWQoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX1RSVUUoczAudmFsaWQoKSkgPDwgIkNvdWxkIG5vdCBmaW5kIGZyZWUgVENQIHBvcnQiOworICAgIEVYUEVDVF9FUShwb3J0LCBzb2NrZXRHZXRQb3J0KHMwLmdldCgpKSk7CisKKyAgICAvLyBDb25uZWN0IHRvIGl0LgorICAgIFNjb3BlZFNvY2tldCBzMShzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQocG9ydCkpOworICAgIEFTU0VSVF9UUlVFKHMxLnZhbGlkKCkpOworCisgICAgLy8gQWNjZXB0IGl0IHRvIGNyZWF0ZSBhIHBhaXIgb2YgY29ubmVjdGVkIHNvY2tldC4KKyAgICAvLyBUaGUgcG9ydCBudW1iZXIgb2YgfHMyfCBzaG91bGQgYmUgfHBvcnR8LgorICAgIFNjb3BlZFNvY2tldCBzMihzb2NrZXRBY2NlcHRBbnkoczAuZ2V0KCkpKTsKKyAgICBBU1NFUlRfVFJVRShzMi52YWxpZCgpKTsKKworICAgIEVYUEVDVF9FUShwb3J0LCBzb2NrZXRHZXRQb3J0KHMyLmdldCgpKSk7Cit9CisKK1RFU1QoU29ja2V0VXRpbHMsIHNvY2tldEdldFBlZXJQb3J0KSB7CisgICAgLy8gQ3JlYXRlIGEgc2VydmVyIHNvY2tldCBib3VuZCB0byBhIHJhbmRvbSBwb3J0LgorICAgIFNjb3BlZFNvY2tldCBzMChzb2NrZXRUY3A0TG9vcGJhY2tTZXJ2ZXIoMCkpOworICAgIEFTU0VSVF9UUlVFKHMwLnZhbGlkKCkpOworICAgIGludCBzZXJ2ZXJQb3J0ID0gc29ja2V0R2V0UG9ydChzMC5nZXQoKSk7CisgICAgQVNTRVJUX0dUKHNlcnZlclBvcnQsIDApOworCisgICAgLy8gQ29ubmVjdCB0byBpdC4KKyAgICBTY29wZWRTb2NrZXQgczEoc29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KHNlcnZlclBvcnQpKTsKKyAgICBBU1NFUlRfVFJVRShzMS52YWxpZCgpKSA8PCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmVyIHNvY2tldCI7CisKKyAgICAvLyBBY2NlcHQgaXQgdG8gY3JlYXRlIGEgcGFpciBvZiBjb25uZWN0ZWQgc29ja2V0cy4KKyAgICBTY29wZWRTb2NrZXQgczIoc29ja2V0QWNjZXB0QW55KHMwLmdldCgpKSk7CisgICAgQVNTRVJUX1RSVUUoczIudmFsaWQoKSk7CisKKyAgICBFWFBFQ1RfRVEoc29ja2V0R2V0UG9ydChzMS5nZXQoKSksIHNvY2tldEdldFBlZXJQb3J0KHMyLmdldCgpKSk7CisgICAgRVhQRUNUX0VRKHNvY2tldEdldFBvcnQoczIuZ2V0KCkpLCBzb2NrZXRHZXRQZWVyUG9ydChzMS5nZXQoKSkpOworfQorCisjaWZuZGVmIF9XSU4zMgorbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGNsYXNzIHRvIHRlbXBvcmFyeSBpbnN0YWxsIGEgU0lHUElQRSBzaWduYWwgaGFuZGxlciB0aGF0CisvLyB3aWxsIHNpbXBseSBzdG9yZSB0aGUgc2lnbmFsIG51bWJlciBpbnRvIGEgZ2xvYmFsIHZhcmlhYmxlLgorY2xhc3MgU2lnUGlwZVNpZ25hbEhhbmRsZXIgeworcHVibGljOgorICAgIFNpZ1BpcGVTaWduYWxIYW5kbGVyKCkgeworICAgICAgICBzU2lnbmFsID0gLTE7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0ID0ge307CisgICAgICAgIGFjdC5zYV9oYW5kbGVyID0gbXlIYW5kbGVyOworICAgICAgICA6OnNpZ2FjdGlvbihTSUdQSVBFLCAmYWN0LCAmbU9sZEFjdGlvbik7CisgICAgfQorCisgICAgflNpZ1BpcGVTaWduYWxIYW5kbGVyKCkgeworICAgICAgICA6OnNpZ2FjdGlvbihTSUdQSVBFLCAmbU9sZEFjdGlvbiwgbnVsbHB0cik7CisgICAgfQorCisgICAgaW50IHNpZ25hbGVkKCkgY29uc3QgeyByZXR1cm4gc1NpZ25hbDsgfQorCitwcml2YXRlOgorICAgIHN0cnVjdCBzaWdhY3Rpb24gbU9sZEFjdGlvbjsKKworICAgIHN0YXRpYyBpbnQgc1NpZ25hbDsKKworICAgIHN0YXRpYyB2b2lkIG15SGFuZGxlcihpbnQgc2lnKSB7IHNTaWduYWwgPSBzaWc7IH0KK307CisKKy8vIHN0YXRpYworaW50IFNpZ1BpcGVTaWduYWxIYW5kbGVyOjpzU2lnbmFsID0gMDsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU29ja2V0VXRpbHMsIHNvY2tldFNlbmREb2VzTm90R2VuZXJhdGVTaWdQaXBlKSB7CisgICAgLy8gQ2hlY2sgdGhhdCB3cml0aW5nIHRvIGEgYnJva2VuIHBpcGUgZG9lcyBub3QgZ2VuZXJhdGUgYSBTSUdQSVBFCisgICAgLy8gc2lnbmFsIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KKworICAgIC8vIEZpcnN0LCBjaGVjayB0aGF0IHRoaXMgaXMgdHJ1ZSBmb3Igc29ja2V0IHBhaXJzLgorICAgIHsKKyAgICAgICAgU2lnUGlwZVNpZ25hbEhhbmRsZXIgaGFuZGxlcjsKKyAgICAgICAgaW50IHMxLCBzMjsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBoYW5kbGVyLnNpZ25hbGVkKCkpOworICAgICAgICBBU1NFUlRfRVEoMCwgc29ja2V0Q3JlYXRlUGFpcigmczEsICZzMikpOworICAgICAgICBzb2NrZXRDbG9zZShzMik7CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBzb2NrZXRTZW5kKHMxLCAieCIsIDEpKTsKKyAgICAgICAgRVhQRUNUX0VRKEVQSVBFLCBlcnJubyk7CisgICAgICAgIEVYUEVDVF9FUSgtMSwgaGFuZGxlci5zaWduYWxlZCgpKTsKKyAgICAgICAgc29ja2V0Q2xvc2UoczEpOworICAgIH0KKworICAgIC8vIFNlY29uZCwgY2hlY2sgdGhhdCB0aGlzIGlzIHRydWUgZm9yIHJhbmRvbSBUQ1Agc29ja2V0cy4KKyAgICB7CisgICAgICAgIFNpZ1BpcGVTaWduYWxIYW5kbGVyIGhhbmRsZXI7CisgICAgICAgIEVYUEVDVF9FUSgtMSwgaGFuZGxlci5zaWduYWxlZCgpKTsKKyAgICAgICAgU2NvcGVkU29ja2V0IHMxKHNvY2tldFRjcDRMb29wYmFja1NlcnZlcigwKSk7ICAvLyBCaW5kIHRvIHJhbmRvbSBwb3J0CisgICAgICAgIEFTU0VSVF9UUlVFKHMxLnZhbGlkKCkpOworCisgICAgICAgIGludCBwb3J0ID0gc29ja2V0R2V0UG9ydChzMS5nZXQoKSk7CisgICAgICAgIFNjb3BlZFNvY2tldCBzMihzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQocG9ydCkpOworICAgICAgICBBU1NFUlRfVFJVRShzMi4gdmFsaWQoKSk7CisKKyAgICAgICAgU2NvcGVkU29ja2V0IHMzKHNvY2tldEFjY2VwdEFueShzMS5nZXQoKSkpOworICAgICAgICBBU1NFUlRfVFJVRShzMy52YWxpZCgpKTsKKworICAgICAgICAvLyBzMiBhbmQgczMgYXJlIG5vdyBjb25uZWN0ZWQuIENsb3NlIHMyIGltbWVkaWF0ZWx5LCB0aGVuIHRyeSB0bworICAgICAgICAvLyBzZW5kIGRhdGEgdGhyb3VnaCBzMy4KKyAgICAgICAgc29ja2V0U2h1dGRvd25SZWFkcyhzMi5nZXQoKSk7CisgICAgICAgIHMyLmNsb3NlKCk7CisKKyAgICAgICAgLy8gVGhlIEVQSVBFIG1pZ2h0IG5vdCBoYXBwZW4gb24gdGhlIGZpcnN0IHNlbmQgZHVlIHRvCisgICAgICAgIC8vIFRDUCBwYWNrZXQgYnVmZmVyaW5nIGluIHRoZSBrZXJuZWwuIFBlcmZvcm0gbXVsdGlwbGUgc2VuZCgpCisgICAgICAgIC8vIGluIGEgbG9vcCB0byB3b3JrLWFyb3VuZCB0aGlzLgorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNvbnN0IGludCBrTWF4U2VuZENvdW50ID0gMTAwOworICAgICAgICBpbnQgbiA9IDA7CisgICAgICAgIHdoaWxlIChuIDwga01heFNlbmRDb3VudCkgeworICAgICAgICAgICAgaW50IHJldCA9IHNvY2tldFNlbmQoczMuZ2V0KCksICJ4eHh4IiwgNCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworI2lmZGVmIF9fQVBQTEVfXworICAgICAgICAgICAgICAgIC8vIE9uIE9TIFgsIGVycm5vIGlzIHNvbWV0aW1lcyBFUFJPVE9UWVBFIGluc3RlYWQgb2YgRVBJUEUKKyAgICAgICAgICAgICAgICAvLyB3aGVuIHRoaXMgaGFwcGVucy4KKyAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShlcnJubyA9PSBFUElQRSB8fCBlcnJubyA9PSBFUFJPVE9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RyZXJyb3IoZXJybm8pOworI2Vsc2UKKyAgICAgICAgICAgICAgICBFWFBFQ1RfRVEoRVBJUEUsIGVycm5vKSA8PCBzdHJlcnJvcihlcnJubyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgdGhlIHJlY29yZCwgdGhlIHZhbHVlIG9mIHxufCB3b3VsZCB0eXBpY2FsbHkgYmUgMiBvbiBMaW51eCwKKyAgICAgICAgLy8gYW5kIDkgb3IgMTAgb24gRGFyd2luLCB3aGVuIHJ1biBvbiBsb2NhbCB3b3Jrc3RhdGlvbnMuCisgICAgICAgIEVYUEVDVF9MVChuLCBrTWF4U2VuZENvdW50KTsKKworICAgICAgICBFWFBFQ1RfRVEoLTEsIGhhbmRsZXIuc2lnbmFsZWQoKSk7CisgICAgfQorfQorI2VuZGlmICAvLyAhX1dJTjMyCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRXYWl0ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRXYWl0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzYwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlci5jcHAKQEAgLTAsMCArMSwyNTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RXJyb3JzLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgiCisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCituYW1lc3BhY2UgeworCitjbGFzcyBTZWxlY3RTb2NrZXRXYWl0ZXIgOiBwdWJsaWMgU29ja2V0V2FpdGVyIHsKK3B1YmxpYzoKKyAgICBTZWxlY3RTb2NrZXRXYWl0ZXIoKSA6IFNvY2tldFdhaXRlcigpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5TZWxlY3RTb2NrZXRXYWl0ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgeworICAgICAgICBGRF9aRVJPKG1SZWFkcyk7CisgICAgICAgIEZEX1pFUk8obVdyaXRlcyk7CisgICAgICAgIEZEX1pFUk8obVJlYWRzUmVzdWx0KTsKKyAgICAgICAgRkRfWkVSTyhtV3JpdGVzUmVzdWx0KTsKKyAgICAgICAgbU1heEZkID0gLTE7CisgICAgICAgIG1NYXhGZFZhbGlkID0gdHJ1ZTsKKyAgICAgICAgbVBlbmRpbmdGZCA9IDA7CisgICAgfQorCisgICAgdmlydHVhbCB1bnNpZ25lZCB3YW50ZWRFdmVudHNGb3IoaW50IGZkKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZEZkKGZkKSkgeworICAgICAgICAgICAgcmV0dXJuIDBVOworICAgICAgICB9CisgICAgICAgIC8vIENvbXB1dGUgY3VycmVudCBmbGFncyBmb3IgZmQuCisgICAgICAgIHVuc2lnbmVkIGV2ZW50cyA9IDA7CisgICAgICAgIGlmIChGRF9JU1NFVChmZCwgbVJlYWRzKSkgeworICAgICAgICAgICAgZXZlbnRzIHw9IGtFdmVudFJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZEX0lTU0VUKGZkLCBtV3JpdGVzKSkgeworICAgICAgICAgICAgZXZlbnRzIHw9IGtFdmVudFdyaXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBldmVudHM7CisgICAgfQorCisgICAgdmlydHVhbCB1bnNpZ25lZCBwZW5kaW5nRXZlbnRzRm9yKGludCBmZCkgY29uc3QgeworICAgICAgICBpZiAoIWlzVmFsaWRGZChmZCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwVTsKKyAgICAgICAgfQorICAgICAgICAvLyBDb21wdXRlIGN1cnJlbnQgZmxhZ3MgZm9yIGZkLgorICAgICAgICB1bnNpZ25lZCBldmVudHMgPSAwOworICAgICAgICBpZiAoRkRfSVNTRVQoZmQsIG1SZWFkc1Jlc3VsdCkpIHsKKyAgICAgICAgICAgIGV2ZW50cyB8PSBrRXZlbnRSZWFkOworICAgICAgICB9CisgICAgICAgIGlmIChGRF9JU1NFVChmZCwgbVdyaXRlc1Jlc3VsdCkpIHsKKyAgICAgICAgICAgIGV2ZW50cyB8PSBrRXZlbnRXcml0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXZlbnRzOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBoYXNGZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRGZENvdW50KCkgPiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICAgICAgRENIRUNLKGlzVmFsaWRGZChmZCkpIDw8ICJmZCAiIDw8IGZkIDw8ICIgbWF4ICIgPDwgRkRfU0VUU0laRTsKKworICAgICAgICAvLyBDb21wdXRlIGN1cnJlbnQgZmxhZ3MgZm9yIGZkLgorICAgICAgICB1bnNpZ25lZCBvbGRFdmVudHMgPSB3YW50ZWRFdmVudHNGb3IoZmQpOworICAgICAgICBpZiAoZXZlbnRzID09IG9sZEV2ZW50cykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcGFyZSBjaGFuZ2VkIGZsYWdzLgorICAgICAgICB1bnNpZ25lZCBjaGFuZ2VkID0gKGV2ZW50cyBeIG9sZEV2ZW50cyk7CisgICAgICAgIGlmICgoY2hhbmdlZCAmIGtFdmVudFJlYWQpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoZXZlbnRzICYga0V2ZW50UmVhZCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldEZkSW5TZXQoZmQsIG1SZWFkcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsZWFyRmRJblNldChmZCwgbVJlYWRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGNoYW5nZWQgJiBrRXZlbnRXcml0ZSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKChldmVudHMgJiBrRXZlbnRXcml0ZSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHNldEZkSW5TZXQoZmQsIG1Xcml0ZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbGVhckZkSW5TZXQoZmQsIG1Xcml0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIG1NYXhGZCAvIG1NYXhGZFZhbGlkCisgICAgICAgIGlmIChvbGRFdmVudHMgPT0gMCAmJiBtTWF4RmRWYWxpZCAmJiBmZCA+IG1NYXhGZCkgeworICAgICAgICAgICAgbU1heEZkID0gZmQ7CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzID09IDAgJiYgbU1heEZkVmFsaWQgJiYgZmQgPT0gbU1heEZkKSB7CisgICAgICAgICAgICBtTWF4RmRWYWxpZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIHsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0RmRDb3VudCgpOworCisgICAgICAgIG1QZW5kaW5nRmQgPSAwOworCisgICAgICAgIC8vIE5vdGhpbmcgdG8gd2FpdCBvbi4KKyAgICAgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAvLyBUaGUgTWFjIHZlcnNpb24gb2Ygc2VsZWN0KCkgd2lsbCByZXR1cm4gRUlOVkFMIG9uIHRpbWVvdXRzIGxhcmdlcgorICAgICAgIC8vIHRoYW4gMTAwMDAwMDAwLCBzbyBjbGFtcCBpdCBpbnN0ZWFkIHNpbmNlIGl0J3MgdW5saWtlbHkgd2UncmUKKyAgICAgICAvLyBnb2luZyB0byB3YWl0IHRoaXMgbG9uZyAoMjcuNzc3LiBob3VycykuCisjaWYgX0RBUldJTl9DX1NPVVJDRQorICAgICAgICBpZiAodGltZW91dF9tcyAhPSBJTlQ2NF9NQVggJiYgdGltZW91dF9tcyA+IDEwMDAwMDAwMDAwMExMKSB7CisgICAgICAgICAgICB0aW1lb3V0X21zID0gMTAwMDAwMDAwMDAwTEw7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIENvbXB1dGUgdGltZW91dCBwb2ludGVyLgorICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0bTAsICp0bTsKKyAgICAgICAgaWYgKHRpbWVvdXRfbXMgPCAwIHx8IHRpbWVvdXRfbXMgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICB0bSA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0bTAudHZfc2VjID0gdGltZW91dF9tcyAvIDEwMDA7CisgICAgICAgICAgICB0bTAudHZfdXNlYyA9ICh0aW1lb3V0X21zIC0gMTAwMCAqIHRtMC50dl9zZWMpICogMTAwMDsKKyAgICAgICAgICAgIHRtID0gJnRtMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZXQ7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZkX3NldCBlcnJzOworICAgICAgICAgICAgRkRfWkVSTygmZXJycyk7CisKKyAgICAgICAgICAgIG1SZWFkc1Jlc3VsdFswXSA9IG1SZWFkc1swXTsKKyAgICAgICAgICAgIG1Xcml0ZXNSZXN1bHRbMF0gPSBtV3JpdGVzWzBdOworCisgICAgICAgICAgICByZXQgPSA6OnNlbGVjdChjb3VudCwgbVJlYWRzUmVzdWx0LCBtV3JpdGVzUmVzdWx0LCAmZXJycywgdG0pOworICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFVElNRURPVVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8IExvZ1N0cmluZygiRXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgbmV4dFBlbmRpbmdGZCh1bnNpZ25lZCAqZmRFdmVudHMpIHsKKyAgICAgICAgaW50IGNvdW50ID0gZ2V0RmRDb3VudCgpOworICAgICAgICBpbnQgZmQgPSBtUGVuZGluZ0ZkOworCisgICAgICAgIHdoaWxlIChmZCA8IGNvdW50KSB7CisgICAgICAgICAgICArK2ZkOworICAgICAgICAgICAgdW5zaWduZWQgZXZlbnRzID0gMDsKKyAgICAgICAgICAgIGlmIChGRF9JU1NFVChmZCwgbVJlYWRzUmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBrRXZlbnRSZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEZEX0lTU0VUKGZkLCBtV3JpdGVzUmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBrRXZlbnRXcml0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChldmVudHMpIHsKKyAgICAgICAgICAgICAgICAqZmRFdmVudHMgPSBldmVudHM7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdGZCA9IGZkOworICAgICAgICAgICAgICAgIHJldHVybiBmZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpmZEV2ZW50cyA9IDA7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgfGZkfCBpcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci4KKyAgICBib29sIGlzVmFsaWRGZChpbnQgZmQpIGNvbnN0IHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZClmZCA8IEZEX1NFVFNJWkU7CisjZWxzZQorICAgICAgICByZXR1cm4gZmQgPj0gMCAmJiBmZCA8IEZEX1NFVFNJWkU7CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIHNldEZkSW5TZXQoaW50IGZkLCBmZF9zZXQqIHNldCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBGRF9TRVQoKHVuc2lnbmVkKWZkLCBzZXQpOworI2Vsc2UKKyAgICAgICAgRkRfU0VUKGZkLCBzZXQpOworI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBjbGVhckZkSW5TZXQoaW50IGZkLCBmZF9zZXQqIHNldCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBGRF9DTFIoKHVuc2lnbmVkKWZkLCBzZXQpOworI2Vsc2UKKyAgICAgICAgRkRfQ0xSKGZkLCBzZXQpOworI2VuZGlmCisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0byB3YWl0IG9uIGR1cmluZyBzZWxlY3QoKS4KKyAgICBpbnQgZ2V0RmRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgaW50IG1heEZkID0gbU1heEZkOworCisgICAgICAgIGlmIChtTWF4RmRWYWxpZCkgeworICAgICAgICAgICAgcmV0dXJuIG1heEZkICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY29tcHV0ZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgIG1heEZkID0gLTE7CisgICAgICAgIGZvciAoaW50IGZkID0gMDsgZmQgPCBGRF9TRVRTSVpFOyArK2ZkKSB7CisgICAgICAgICAgICBpZiAoIUZEX0lTU0VUKGZkLCBtUmVhZHMpICYmICFGRF9JU1NFVChmZCwgbVdyaXRlcykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heEZkID0gZmQ7CisgICAgICAgIH0KKworICAgICAgICBtTWF4RmQgPSBtYXhGZDsKKyAgICAgICAgbU1heEZkVmFsaWQgPSB0cnVlOworCisgICAgICAgIHJldHVybiBtYXhGZCArIDE7CisgICAgfQorCitwcml2YXRlOgorICAgIGZkX3NldCBtUmVhZHNbMV07CisgICAgZmRfc2V0IG1Xcml0ZXNbMV07CisgICAgZmRfc2V0IG1SZWFkc1Jlc3VsdFsxXTsKKyAgICBmZF9zZXQgbVdyaXRlc1Jlc3VsdFsxXTsKKyAgICBtdXRhYmxlIGludCBtTWF4RmQ7CisgICAgbXV0YWJsZSBib29sIG1NYXhGZFZhbGlkOworICAgIGludCBtUGVuZGluZ0ZkOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworU29ja2V0V2FpdGVyKiBTb2NrZXRXYWl0ZXI6OmNyZWF0ZSgpIHsKKyAgICByZXR1cm4gbmV3IFNlbGVjdFNvY2tldFdhaXRlcigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzcwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlci5oCkBAIC0wLDAgKzEsMTE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgU29ja2V0V2FpdGVyIGlzIGFuIGFic3RyYWN0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byB3YWl0IGZvciBpL28KKy8vIGV2ZW50cyBvbiBhIHNldCBvZiBzb2NrZXQgZmlsZSBkZXNjcmlwdG9ycyBmb3IgYSBjZXJ0YWluIGFtb3VudAorLy8gb2YgdGltZS4gVXNhZ2UgaXM6CisvLworLy8gIDEvIENyZWF0ZSB0aGUgd2FpdGVyIGluc3RhbmNlOgorLy8KKy8vICAgICAgIFNvY2tldFdhaXRlciogd2FpdGVyID0gU29ja2V0V2FpdGVyOjpjcmVhdGUoKTsKKy8vCisvLyAgMi8gQ2FsbCB0aGUgdXBkYXRlKCkgbWV0aG9kIHRvIGluZGljYXRlIHdoaWNoIEkvTyBldmVudHMgeW91IHdhbnQKKy8vICAgICB0byBsaXN0ZW4gdG8gZm9yIGEgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIHxmZHw6CisvLworLy8gICAgICAgd2FpdGVyLT51cGRhdGUoZmQxLCBTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQpOworLy8gICAgICAgd2FpdGVyLT51cGRhdGUoZmQyLCBTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlKTsKKy8vCisvLyAgMy8gQ2FsbCB0aGUgd2FpdCgpIG1ldGhvZCB0byB3YWl0IGZvciBpL28gZXZlbnRzIG9uIHRoZSByZWdpc3RlcmVkCisvLyAgICAgc29ja2V0IGZpbGUgZGVzY3JpcHRvcnMuCisvLworLy8gICAgICAgaW50IHJldCA9IHdhaXRlci0+d2FpdCh0aW1lb3V0X21zKTsKKy8vCisvLyAgNC8gQWZ0ZXIgd2FpdCgpIHJldHVybnMsIGNhbGwgbmV4dFBlbmRpbmdGZCgpIHRvIGdldCB0aGUgbGlzdCBvZgorLy8gICAgIGZpbGUgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIHBlbmRpbmcgaS9vIGV2ZW50cywgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisvLyAgICAgZXZlbnQgbWFzay4gVGhlIGZ1bmN0aW9uIHJldHVybnMgLTEgb25jZSB5b3UgcmVhY2ggcGFzdCB0aGUgbGlzdDoKKy8vCisvLyAgICAgICBmb3IgKDs7KSB7CisvLyAgICAgICAgICB1bnNpZ25lZCBldmVudHMgPSAwOworLy8gICAgICAgICAgaW50IGZkID0gd2FpdGVyLT5uZXh0UGVuZGluZ0ZkKCZldmVudHMpOworLy8gICAgICAgICAgaWYgKGZkIDwgMCkgeworLy8gICAgICAgICAgICBicmVhazsKKy8vICAgICAgICAgIH0KKy8vICAgICAgICAgIC8vIEhhbmRsZSB8ZXZlbnRzfCBvbiBzb2NrZXQgfGZkfC4KKy8vICAgICAgIH0KKy8vCisvLyAgNS8gV2hpY2ggZmlsZSBkZXNjcmlwdG9ycyBhcmUgYmVpbmcgd2F0Y2hlZCBpcyByZWNvcmRlZCBieSB0aGUgd2FpdGVyCisvLyAgICAgYmV0d2VlbiBzZXZlcmFsIGNhbGxzIHRvIHdhaXQoKS4gWW91IGNhbiB1c2UgcmVzZXQoKSB0byBjbGVhciBhbGwKKy8vICAgICBvZiB0aGVtIGF0IG9uY2UsIG9yIGNhbGwgdXBkYXRlKCkgd2l0aCAwIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHRvCisvLyAgICAgaW5kaWNhdGUgeW91IG5vIGxvbmdlciB3YW50IHRvIGxpc3RlbiB0byBldmVudHMgb24gYSBnaXZlbgorLy8gICAgIGRlc2NyaXB0b3IsIGFzIGluOgorLy8KKy8vICAgICAgICB3YWl0ZXItPnVwZGF0ZShmZDIsIDApOworLy8KK2NsYXNzIFNvY2tldFdhaXRlciB7CitwdWJsaWM6CisgICAgZW51bSBFdmVudCB7CisgICAgICAgIGtFdmVudFJlYWQgPSAoMVUgPDwgMCksCisgICAgICAgIGtFdmVudFdyaXRlID0gKDFVIDw8IDEpLAorICAgIH07CisKKyAgICAvLyBDcmVhdGUgbmV3IFNvY2tldFdhaXRlciBpbnN0YW5jZS4KKyAgICBzdGF0aWMgU29ja2V0V2FpdGVyKiBjcmVhdGUoKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIGluc3RhbmNlLgorICAgIHZpcnR1YWwgflNvY2tldFdhaXRlcigpIHt9CisKKyAgICAvLyBSZXNldCB0aGUgd2FpdGVyLCBpLmUuIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB1cGRhdGUoZmQsIDApIG9uCisgICAgLy8gYWxsIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBzb2NrZXQgZGVzY3JpcHRvcnMuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHdhbnRlZCBldmVudCBiaXRtYXNrIGZvciBhIGdpdmVuIHxmZHwuCisgICAgdmlydHVhbCB1bnNpZ25lZCB3YW50ZWRFdmVudHNGb3IoaW50IGZkKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm4gdGhlIHBlbmRpbmcgZXZlbnQgYml0bWFzayBmb3IgYSBnaXZlbiB8ZmR8LiBPbmx5IHVzZSB0aGlzCisgICAgLy8gYWZ0ZXIgY2FsbGluZyB3YWl0KCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBwZW5kaW5nRXZlbnRzRm9yKGludCBmZCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIHRoZXJlIGFyZSByZWdpc3RlcmVkIHNvY2tldCBkZXNjcmlwdG9ycy4KKyAgICB2aXJ0dWFsIGJvb2wgaGFzRmRzKCkgY29uc3QgPSAwOworCisgICAgLy8gVGVsbCB0aGUgd2FpdGVyIHRvIGxvb2sgZm9yIGkvbyBldmVudHMgb24gc29ja2V0IGRlc2NyaXB0b3IgfGZkfC4KKyAgICAvLyB8ZXZlbnRzfCBpcyBhIGJpdG1hc2sgY29udGFpbmluZyBrRXZlbnRSZWFkLCBrRXZlbnRXcml0ZSBvciBib3RoLgorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoaW50IGZkLCB1bnNpZ25lZCBldmVudHMpID0gMDsKKworICAgIC8vIFdhaXQgYXQgbW9zdCB8dGltZW91dF9tc3wgbWlsbGktc2Vjb25kcyBmb3IgaS9vIGV2ZW50cyB0byBvY2N1cgorICAgIC8vIG9uIHJlZ2lzdGVyZWQgc29ja2V0IGRlc2NyaXB0b3JzLiBJZiB8dGltZW91dF9tc3wgaXMgMCwgcmV0dXJuCisgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgcG9sbGluZyB0aGUgZGVzY3JpcHRvcnMuIElmIGl0IGlzIElOVDY0X01BWCwKKyAgICAvLyB0aGVuIHdhaXQgaW5kZWZpbml0ZWx5LgorICAgIC8vCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgdGhhdCBoYXZlIGkvbyBldmVudHMuCisgICAgLy8gSW4gY2FzZSBvZiB0aW1lb3V0LCByZXR1cm4gMCBhbmQgc2V0cyBlcnJubyB0byBFVElNRURPVVQuCisgICAgLy8gSW4gY2FzZSBvZiBlcnJvciwgcmV0dXJuIC0xL2Vycm5vLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBsb29wcyBhcm91bmQgRUlOVFIgYXMgYSBjb252ZW5pZW5jZS4KKyAgICB2aXJ0dWFsIGludCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgPSAwOworCisgICAgLy8gR2V0IHRoZSBuZXh0IHBlbmRpbmcgc29ja2V0IGRlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgaS9vIGV2ZW50IG1hc2suCisgICAgLy8gUmV0dXJuIHRoZSBuZXh0IHNvY2tldCBkZXNjcmlwdG9yLCBvciAtMSB3aGVuIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAvLyBpcyByZWFjaGVkLiBPbiBzdWNjZXNzLCBzZXRzIHwqZmRFdmVudHN8IHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gZXZlbnQgbWFzay4KKyAgICB2aXJ0dWFsIGludCBuZXh0UGVuZGluZ0ZkKHVuc2lnbmVkKiBmZEV2ZW50cykgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgU29ja2V0V2FpdGVyKCkge30KKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTb2NrZXRXYWl0ZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMjRmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0V2FpdGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIENoZWNrIHRoYXQgaW5pdGlhbGl6YXRpb24gLyBkZXN0cnVjdGlvbiB3b3JrcyB3aXRob3V0IGNyYXNoaW5nLgorVEVTVChTb2NrZXRXYWl0ZXIsIGluaXQpIHsKKyAgICBTY29wZWRQdHI8U29ja2V0V2FpdGVyPiB3YWl0ZXIoU29ja2V0V2FpdGVyOjpjcmVhdGUoKSk7CisKKyAgICB1bnNpZ25lZCBldmVudHMgPSB+MFU7CisgICAgRVhQRUNUX0VRKC0xLCB3YWl0ZXItPm5leHRQZW5kaW5nRmQoJmV2ZW50cykpOworICAgIEVYUEVDVF9FUSgwLCBldmVudHMpOworfQorCitURVNUKFNvY2tldFdhaXRlciwgcmVzZXQpIHsKKyAgICBTY29wZWRQdHI8U29ja2V0V2FpdGVyPiB3YWl0ZXIoU29ja2V0V2FpdGVyOjpjcmVhdGUoKSk7CisKKyAgICBFWFBFQ1RfRkFMU0Uod2FpdGVyLT5oYXNGZHMoKSk7CisKKyAgICBpbnQgczEsIHMyOworCisgICAgQVNTRVJUX0VRKDAsIHNvY2tldENyZWF0ZVBhaXIoJnMxLCAmczIpKTsKKworICAgIHdhaXRlci0+dXBkYXRlKHMxLCBTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQpOworICAgIEVYUEVDVF9UUlVFKHdhaXRlci0+aGFzRmRzKCkpOworICAgIEVYUEVDVF9FUShTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQsIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMxKSk7CisKKyAgICB3YWl0ZXItPnJlc2V0KCk7CisgICAgRVhQRUNUX0ZBTFNFKHdhaXRlci0+aGFzRmRzKCkpOworICAgIEVYUEVDVF9FUSgwVSwgd2FpdGVyLT53YW50ZWRFdmVudHNGb3IoczEpKTsKK30KKworVEVTVChTb2NrZXRXYWl0ZXIsIHVwZGF0ZSkgeworICAgIFNjb3BlZFB0cjxTb2NrZXRXYWl0ZXI+IHdhaXRlcihTb2NrZXRXYWl0ZXI6OmNyZWF0ZSgpKTsKKworICAgIGludCBzMSwgczI7CisKKyAgICBBU1NFUlRfRVEoMCwgc29ja2V0Q3JlYXRlUGFpcigmczEsICZzMikpOworCisgICAgd2FpdGVyLT51cGRhdGUoczEsIFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCk7CisgICAgd2FpdGVyLT51cGRhdGUoczIsIFNvY2tldFdhaXRlcjo6a0V2ZW50V3JpdGUpOworICAgIEVYUEVDVF9UUlVFKHdhaXRlci0+aGFzRmRzKCkpOworICAgIEVYUEVDVF9FUShTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQsIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMxKSk7CisgICAgRVhQRUNUX0VRKFNvY2tldFdhaXRlcjo6a0V2ZW50V3JpdGUsIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMyKSk7CisKKyAgICB3YWl0ZXItPnVwZGF0ZShzMSwgU29ja2V0V2FpdGVyOjprRXZlbnRXcml0ZSk7CisgICAgd2FpdGVyLT51cGRhdGUoczIsIFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCk7CisgICAgRVhQRUNUX1RSVUUod2FpdGVyLT5oYXNGZHMoKSk7CisgICAgRVhQRUNUX0VRKFNvY2tldFdhaXRlcjo6a0V2ZW50V3JpdGUsIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMxKSk7CisgICAgRVhQRUNUX0VRKFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCwgd2FpdGVyLT53YW50ZWRFdmVudHNGb3IoczIpKTsKKworICAgIHdhaXRlci0+dXBkYXRlKHMxLCBTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQgfCBTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlKTsKKyAgICB3YWl0ZXItPnVwZGF0ZShzMiwgU29ja2V0V2FpdGVyOjprRXZlbnRSZWFkIHwgU29ja2V0V2FpdGVyOjprRXZlbnRXcml0ZSk7CisgICAgRVhQRUNUX1RSVUUod2FpdGVyLT5oYXNGZHMoKSk7CisgICAgRVhQRUNUX0VRKFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCB8IFNvY2tldFdhaXRlcjo6a0V2ZW50V3JpdGUsCisgICAgICAgICAgICAgIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMxKSk7CisgICAgRVhQRUNUX0VRKFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCB8IFNvY2tldFdhaXRlcjo6a0V2ZW50V3JpdGUsCisgICAgICAgICAgICAgIHdhaXRlci0+d2FudGVkRXZlbnRzRm9yKHMyKSk7CisKKyAgICB3YWl0ZXItPnJlc2V0KCk7CisKKyAgICBFWFBFQ1RfRkFMU0Uod2FpdGVyLT5oYXNGZHMoKSk7CisgICAgRVhQRUNUX0VRKDBVLCB3YWl0ZXItPndhbnRlZEV2ZW50c0ZvcihzMSkpOworICAgIEVYUEVDVF9FUSgwVSwgd2FpdGVyLT53YW50ZWRFdmVudHNGb3IoczIpKTsKK30KKworVEVTVChTb2NrZXRXYWl0ZXIsIHdhaXRPblJlYWRFdmVudCkgeworICAgIFNjb3BlZFB0cjxTb2NrZXRXYWl0ZXI+IHdhaXRlcihTb2NrZXRXYWl0ZXI6OmNyZWF0ZSgpKTsKKworICAgIGludCBzMSwgczI7CisKKyAgICBBU1NFUlRfRVEoMCwgc29ja2V0Q3JlYXRlUGFpcigmczEsICZzMikpOworCisgICAgd2FpdGVyLT51cGRhdGUoczEsIFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZCk7CisKKyAgICBFWFBFQ1RfRVEoMSwgc29ja2V0U2VuZChzMiwgIiEiLCAxKSk7CisgICAgaW50IHJldCA9IHdhaXRlci0+d2FpdCgwKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmV0KTsKKyAgICB1bnNpZ25lZCBldmVudHMgPSAwOworICAgIEVYUEVDVF9FUShzMSwgd2FpdGVyLT5uZXh0UGVuZGluZ0ZkKCZldmVudHMpKTsKKyAgICBFWFBFQ1RfRVEoU29ja2V0V2FpdGVyOjprRXZlbnRSZWFkLCBldmVudHMpOworCisgICAgRVhQRUNUX0VRKC0xLCB3YWl0ZXItPm5leHRQZW5kaW5nRmQoJmV2ZW50cykpOworCisgICAgc29ja2V0Q2xvc2UoczIpOworICAgIHNvY2tldENsb3NlKHMxKTsKK30KKworVEVTVChTb2NrZXRXYWl0ZXIsIHdhaXRPbldyaXRlRXZlbnQpIHsKKyAgICBTY29wZWRQdHI8U29ja2V0V2FpdGVyPiB3YWl0ZXIoU29ja2V0V2FpdGVyOjpjcmVhdGUoKSk7CisKKyAgICBpbnQgczEsIHMyOworCisgICAgQVNTRVJUX0VRKDAsIHNvY2tldENyZWF0ZVBhaXIoJnMxLCAmczIpKTsKKworICAgIHdhaXRlci0+dXBkYXRlKHMyLCBTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlKTsKKyAgICBpbnQgcmV0ID0gd2FpdGVyLT53YWl0KDApOworICAgIEVYUEVDVF9FUSgxLCByZXQpOworICAgIHVuc2lnbmVkIGV2ZW50cyA9IDA7CisgICAgRVhQRUNUX0VRKHMyLCB3YWl0ZXItPm5leHRQZW5kaW5nRmQoJmV2ZW50cykpOworICAgIEVYUEVDVF9FUShTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlLCBldmVudHMpOworCisgICAgRVhQRUNUX0VRKC0xLCB3YWl0ZXItPm5leHRQZW5kaW5nRmQoJmV2ZW50cykpOworCisgICAgc29ja2V0Q2xvc2UoczIpOworICAgIHNvY2tldENsb3NlKHMxKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvV2luc29jay5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc29ja2V0cy9XaW5zb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkNzA2YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3NvY2tldHMvV2luc29jay5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2lmbmRlZiBfV0lOMzIKKyNlcnJvciAiT25seSBpbmNsdWRlIHRoaXMgaGVhZGVyIHdoZW4gYnVpbGRpbmcgZm9yIFdpbmRvd3MuIgorI2VuZGlmCisKKyNpZm5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNlbmRpZgorCisvLyBEZWZhdWx0IEZEX1NFVFNJWkUgaXMgNjQgd2hpY2ggaXMgbm90IGVub3VnaCBmb3IgdXMuCisvLyBOb3RlOiBwcmV2aW91c2x5IHNldCB0byAxMDI0LCB3aGljaCB3YXMgbm90IGVub3VnaCwgc2VlOgorLy8gICAgIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTEwMjM2MQorLy8KKy8vIFRoZSB2YWx1ZSAzMjc2OCBpcyB3aGF0IGEgdHlwaWNhbCBXaW5zb2NrIGluaXRpYWxpemF0aW9uIHJldHVybnMKKy8vIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzb2NrZXRzLCBzZWUgIzEyIG9uIHRoZSBsaW5rIGFib3ZlLiBKdXN0IGFzc3VtZQorLy8gdGhhdCB0aGlzIHRyYW5zbGF0ZXMgdG8gdGhlIG1heCBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciBvdXIgdXNlcy4KKy8vIE9mIGNvdXJzZSB0aGF0IGFsc28gbWVhbnMgZWFjaCBmZF9zZXQgd2lsbCBiZSA0IEtpQi4KKyNkZWZpbmUgRkRfU0VUU0laRSAzMjc2OAorCisvLyBPcmRlciBvZiBpbmNsdXNpb24gb2Ygd2luc29jazIuaCBhbmQgd2luZG93cy5oIGRlcGVuZHMgb24gdGhlIHZlcnNpb24KKy8vIG9mIE1pbmd3MzIgYmVpbmcgdXNlZC4KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorCisjdW5kZWYgRVJST1IgIC8vIG5lY2Vzc2FyeSB0byBjb21waWxlIExPRyhFUlJPUikgc3RhdGVtZW50cy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Db25kaXRpb25WYXJpYWJsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0NvbmRpdGlvblZhcmlhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc4MWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Db25kaXRpb25WYXJpYWJsZS5oCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY29uZGl0aW9uIHZhcmlhYmxlLCB3aGljaCBjYW4gYmUgdXNlZCBpbgorLy8gYXNzb2NpYXRpb24gd2l0aCBhIExvY2sgdG8gYmxvY2tpbmctd2FpdCBmb3Igc3BlY2lmaWMgY29uZGl0aW9ucy4KKy8vIFVzZWZ1bCB0byBpbXBsZW1lbnQgdmFyaW91cyBzeW5jaHJvbml6YXRpb24gZGF0YSBzdHJ1Y3R1cmVzLgorY2xhc3MgQ29uZGl0aW9uVmFyaWFibGUgeworcHVibGljOgorICAgIC8vIEEgc2V0IG9mIGZ1bmN0aW9ucyB0byBlZmZpY2llbnRseSB1bmxvY2sgdGhlIGxvY2sgdXNlZCB3aXRoCisgICAgLy8gdGhlIGN1cnJlbnQgY29uZGl0aW9uIHZhcmlhYmxlIGFuZCBzaWduYWwgb3IgYnJvYWRjYXN0IGl0LgorICAgIC8vCisgICAgLy8gVGhlIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMgKFBvc2l4KSBpdCdzIG1vcmUKKyAgICAvLyBlZmZpY2llbnQgdG8gc2lnbmFsIHRoZSB2YXJpYWJsZSBiZWZvcmUgdW5sb2NraW5nIG11dGV4LCB3aGlsZSBvbiBvdGhlcnMKKyAgICAvLyAoV2luZG93cykgaXQncyBleGFjdGx5IHRoZSBvcHBvc2l0ZS4gRnVuY3Rpb25zIGltcGxlbWVudCB0aGUgYmVzdCB3YXkKKyAgICAvLyBmb3IgZWFjaCBwbGF0Zm9ybSBhbmQgYWJzdHJhY3QgaXQgb3V0IGZyb20gdGhlIHVzZXIuCisgICAgdm9pZCBzaWduYWxBbmRVbmxvY2soTG9jayogbG9jayk7CisgICAgdm9pZCBzaWduYWxBbmRVbmxvY2soQXV0b0xvY2sqIGxvY2spOworCisgICAgdm9pZCBicm9hZGNhc3RBbmRVbmxvY2soTG9jayogbG9jayk7CisgICAgdm9pZCBicm9hZGNhc3RBbmRVbmxvY2soQXV0b0xvY2sqIGxvY2spOworCisjaWZkZWYgX1dJTjMyCisKKyAgICBDb25kaXRpb25WYXJpYWJsZSgpIHsKKyAgICAgICAgOjpJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUoJm1Db25kKTsKKyAgICB9CisKKyAgICAvLyBUaGVyZSdzIG5vIHNwZWNpYWwgZnVuY3Rpb24gdG8gZGVzdHJveSBDT05ESVRJT05fVkFSSUFCTEUgaW4gV2luZG93cy4KKyAgICB+Q29uZGl0aW9uVmFyaWFibGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaXMgc2lnbmFsZWQuIE5vdGUgdGhhdCBzcHVyaW91cworICAgIC8vIHdha2V1cHMgYXJlIGFsd2F5cyBhIHBvc3NpYmlsaXR5LCBzbyBhbHdheXMgY2hlY2sgdGhlIGNvbmRpdGlvbgorICAgIC8vIGluIGEgbG9vcCwgaS5lLiBkbzoKKyAgICAvLworICAgIC8vICAgIHdoaWxlICghY29uZGl0aW9uKSB7IGNvbmRWYXIud2FpdCgmbG9jayk7IH0KKyAgICAvLworICAgIC8vIGluc3RlYWQgb2Y6CisgICAgLy8KKyAgICAvLyAgICBpZiAoIWNvbmRpdGlvbikgeyBjb25kVmFyLndhaXQoJmxvY2spOyB9CisgICAgLy8KKyAgICB2b2lkIHdhaXQoTG9jayogdXNlckxvY2spIHsKKyAgICAgICAgOjpTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKCZtQ29uZCwgJnVzZXJMb2NrLT5tTG9jaywgSU5GSU5JVEUsIDApOworICAgIH0KKworICAgIC8vIFNpZ25hbCB0aGF0IGEgY29uZGl0aW9uIHdhcyByZWFjaGVkLiBUaGlzIHdpbGwgd2FrZSBhdCBsZWFzdCAoYW5kCisgICAgLy8gcHJlZmVycmFibHkpIG9uZSB3YWl0aW5nIHRocmVhZCB0aGF0IGlzIGJsb2NrZWQgb24gd2FpdCgpLgorICAgIHZvaWQgc2lnbmFsKCkgeworICAgICAgICA6Oldha2VDb25kaXRpb25WYXJpYWJsZSgmbUNvbmQpOworICAgIH0KKworICAgIC8vIExpa2Ugc2lnbmFsKCksIGJ1dCB3YWtlcyBhbGwgb2YgdGhlIHdhaXRpbmcgdGhyZWFkcy4KKyAgICB2b2lkIGJyb2FkY2FzdCgpIHsKKyAgICAgICAgOjpXYWtlQWxsQ29uZGl0aW9uVmFyaWFibGUoJm1Db25kKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ09ORElUSU9OX1ZBUklBQkxFIG1Db25kOworCisjZWxzZSAgLy8gIV9XSU4zMgorCisgICAgLy8gTm90ZTogb24gUG9zaXggc3lzdGVtcywgbWFrZSBpdCBhIG5haXZlIHdyYXBwZXIgYXJvdW5kIHB0aHJlYWRfY29uZF90LgorCisgICAgQ29uZGl0aW9uVmFyaWFibGUoKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZCwgTlVMTCk7CisgICAgfQorCisgICAgfkNvbmRpdGlvblZhcmlhYmxlKCkgeworICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmQpOworICAgIH0KKworICAgIHZvaWQgd2FpdChMb2NrKiB1c2VyTG9jaykgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmbUNvbmQsICZ1c2VyTG9jay0+bUxvY2spOworICAgIH0KKworICAgIHZvaWQgc2lnbmFsKCkgeworICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtQ29uZCk7CisgICAgfQorCisgICAgdm9pZCBicm9hZGNhc3QoKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJm1Db25kKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgcHRocmVhZF9jb25kX3QgbUNvbmQ7CisKKyNlbmRpZiAgLy8gIV9XSU4zMgorCisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoQ29uZGl0aW9uVmFyaWFibGUpOworfTsKKworI2lmZGVmIF9XSU4zMgoraW5saW5lIHZvaWQgQ29uZGl0aW9uVmFyaWFibGU6OnNpZ25hbEFuZFVubG9jayhMb2NrKiBsb2NrKSB7CisgICAgbG9jay0+dW5sb2NrKCk7CisgICAgc2lnbmFsKCk7Cit9CitpbmxpbmUgdm9pZCBDb25kaXRpb25WYXJpYWJsZTo6c2lnbmFsQW5kVW5sb2NrKEF1dG9Mb2NrKiBsb2NrKSB7CisgICAgbG9jay0+dW5sb2NrKCk7CisgICAgc2lnbmFsKCk7Cit9CisKK2lubGluZSB2b2lkIENvbmRpdGlvblZhcmlhYmxlOjpicm9hZGNhc3RBbmRVbmxvY2soTG9jayogbG9jaykgeworICAgIGxvY2stPnVubG9jaygpOworICAgIGJyb2FkY2FzdCgpOworfQoraW5saW5lIHZvaWQgQ29uZGl0aW9uVmFyaWFibGU6OmJyb2FkY2FzdEFuZFVubG9jayhBdXRvTG9jayogbG9jaykgeworICAgIGxvY2stPnVubG9jaygpOworICAgIGJyb2FkY2FzdCgpOworfQorI2Vsc2UgIC8vICFfV0lOMzIKK2lubGluZSB2b2lkIENvbmRpdGlvblZhcmlhYmxlOjpzaWduYWxBbmRVbmxvY2soTG9jayogbG9jaykgeworICAgIHNpZ25hbCgpOworICAgIGxvY2stPnVubG9jaygpOworfQoraW5saW5lIHZvaWQgQ29uZGl0aW9uVmFyaWFibGU6OnNpZ25hbEFuZFVubG9jayhBdXRvTG9jayogbG9jaykgeworICAgIHNpZ25hbCgpOworICAgIGxvY2stPnVubG9jaygpOworfQoraW5saW5lIHZvaWQgQ29uZGl0aW9uVmFyaWFibGU6OmJyb2FkY2FzdEFuZFVubG9jayhMb2NrKiBsb2NrKSB7CisgICAgYnJvYWRjYXN0KCk7CisgICAgbG9jay0+dW5sb2NrKCk7Cit9CitpbmxpbmUgdm9pZCBDb25kaXRpb25WYXJpYWJsZTo6YnJvYWRjYXN0QW5kVW5sb2NrKEF1dG9Mb2NrKiBsb2NrKSB7CisgICAgYnJvYWRjYXN0KCk7CisgICAgbG9jay0+dW5sb2NrKCk7Cit9CisjZW5kaWYgIC8vICFfV0lOMzIKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vQ29uZGl0aW9uVmFyaWFibGVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0NvbmRpdGlvblZhcmlhYmxlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjEzMjJhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0NvbmRpdGlvblZhcmlhYmxlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Db25kaXRpb25WYXJpYWJsZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRocmVhZC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitURVNUKENvbmRpdGlvblZhcmlhYmxlLCBpbml0KSB7CisgICAgQ29uZGl0aW9uVmFyaWFibGUgY29uZDsKK30KKworVEVTVChDb25kaXRpb25WYXJpYWJsZSwgaW5pdEFuZFNpZ25hbCkgeworICAgIENvbmRpdGlvblZhcmlhYmxlIGNvbmQ7CisgICAgY29uZC5zaWduYWwoKTsKK30KKworc3RydWN0IFRlc3RUaHJlYWRQYXJhbXMgeworICAgIFRlc3RUaHJlYWRQYXJhbXMoKSA6IG11dGV4KCksIGN2KCksIGNvdW50ZXIoMCkgeyB9CisgICAgTG9jayBtdXRleDsKKyAgICBDb25kaXRpb25WYXJpYWJsZSBjdjsKKyAgICBpbnQgY291bnRlcjsKK307CisKK3N0YXRpYyB2b2lkKiB0ZXN0VGhyZWFkRnVuY3Rpb25CYXNpY1dhaXQodm9pZCogcGFyYW0pIHsKKyAgICBUZXN0VGhyZWFkUGFyYW1zKiBwID0gc3RhdGljX2Nhc3Q8VGVzdFRocmVhZFBhcmFtcyo+KHBhcmFtKTsKKworICAgIHAtPm11dGV4LmxvY2soKTsKKworICAgIHdoaWxlIChwLT5jb3VudGVyID09IDApIHsKKyAgICAgICAgcC0+Y3Yud2FpdCgmcC0+bXV0ZXgpOworICAgIH0KKworICAgIHAtPm11dGV4LnVubG9jaygpOworICAgIHJldHVybiBOVUxMOworfQorCitURVNUKENvbmRpdGlvblZhcmlhYmxlLCBiYXNpY1dhaXRTaWduYWwpIHsKKyAgICBUZXN0VGhyZWFkUGFyYW1zIHA7CisKKyAgICBUZXN0VGhyZWFkIHRlc3RUaHJlYWQodGVzdFRocmVhZEZ1bmN0aW9uQmFzaWNXYWl0LCAmcCk7CisKKyAgICBwLm11dGV4LmxvY2soKTsKKyAgICBwLmNvdW50ZXIrKzsKKyAgICBwLmN2LnNpZ25hbCgpOworICAgIHAubXV0ZXgudW5sb2NrKCk7CisKKyAgICB0ZXN0VGhyZWFkLmpvaW4oKTsKKworICAgIEVYUEVDVF9FUShwLmNvdW50ZXIsIDEpOworfQorCitURVNUKENvbmRpdGlvblZhcmlhYmxlLCBiYXNpY1dhaXRCcm9hZGNhc3QpIHsKKyAgICBUZXN0VGhyZWFkUGFyYW1zIHA7CisKKyAgICBUZXN0VGhyZWFkIHRlc3RUaHJlYWRBKHRlc3RUaHJlYWRGdW5jdGlvbkJhc2ljV2FpdCwgJnApOworICAgIFRlc3RUaHJlYWQgdGVzdFRocmVhZEIodGVzdFRocmVhZEZ1bmN0aW9uQmFzaWNXYWl0LCAmcCk7CisKKyAgICBwLm11dGV4LmxvY2soKTsKKyAgICBwLmNvdW50ZXIrKzsKKyAgICBwLmN2LmJyb2FkY2FzdCgpOworICAgIHAubXV0ZXgudW5sb2NrKCk7CisKKyAgICB0ZXN0VGhyZWFkQS5qb2luKCk7CisgICAgdGVzdFRocmVhZEIuam9pbigpOworCisgICAgRVhQRUNUX0VRKHAuY291bnRlciwgMSk7Cit9CisKK1RFU1QoQ29uZGl0aW9uVmFyaWFibGUsIHdhaXRCcm9hZGNhc3QpIHsKKyAgICBUZXN0VGhyZWFkUGFyYW1zIHA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzID0gMjAwMDsKKworICAgIHN0ZDo6dmVjdG9yPFRlc3RUaHJlYWQ+IHRlc3RUaHJlYWRzOworICAgIHRlc3RUaHJlYWRzLnJlc2VydmUoa051bVRocmVhZHMpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrTnVtVGhyZWFkczsgKytuKSB7CisgICAgICAgIHRlc3RUaHJlYWRzLmVtcGxhY2VfYmFjayh0ZXN0VGhyZWFkRnVuY3Rpb25CYXNpY1dhaXQsICZwKTsKKyAgICB9CisKKyAgICBwLm11dGV4LmxvY2soKTsKKyAgICBwLmNvdW50ZXIrKzsKKyAgICBwLmN2LmJyb2FkY2FzdCgpOworICAgIHAubXV0ZXgudW5sb2NrKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzOyArK2kpIHsKKyAgICAgICAgdGVzdFRocmVhZHNbaV0uam9pbigpOworICAgIH0KKworICAgIEVYUEVDVF9FUShwLmNvdW50ZXIsIDEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0YmJhOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgKQEAgLTAsMCArMSwyMzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgQXV0b0xvY2s7CitjbGFzcyBBdXRvV3JpdGVMb2NrOworY2xhc3MgQXV0b1JlYWRMb2NrOworCisvLyBTaW1wbGUgd3JhcHBlciBjbGFzcyBmb3IgbXV0ZXhlcy4KK2NsYXNzIExvY2sgeworcHVibGljOgorICAgIHVzaW5nIEF1dG9Mb2NrID0gYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2s7CisKKyNpZmRlZiBfV0lOMzIKKyAgICBMb2NrKCkgPSBkZWZhdWx0OworICAgIH5Mb2NrKCkgPSBkZWZhdWx0OworI2Vsc2UKKyAgICBMb2NrKCkgeworICAgICAgICA6OnB0aHJlYWRfbXV0ZXhfaW5pdCgmbUxvY2ssIE5VTEwpOworICAgIH0KKyAgICB+TG9jaygpIHsKKyAgICAgICAgOjpwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1Mb2NrKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIEFjcXVpcmUgdGhlIGxvY2suCisgICAgdm9pZCBsb2NrKCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgOjpBY3F1aXJlU1JXTG9ja0V4Y2x1c2l2ZSgmbUxvY2spOworI2Vsc2UKKyAgICAgIDo6cHRocmVhZF9tdXRleF9sb2NrKCZtTG9jayk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBSZWxlYXNlIHRoZSBsb2NrLgorICAgIHZvaWQgdW5sb2NrKCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgIDo6UmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJm1Mb2NrKTsKKyNlbHNlCisgICAgICAgOjpwdGhyZWFkX211dGV4X3VubG9jaygmbUxvY2spOworI2VuZGlmCisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBDb25kaXRpb25WYXJpYWJsZTsKKworI2lmZGVmIF9XSU4zMgorICAgIC8vIEJlbmNobWFya3Mgc2hvdyB0aGF0IG9uIFdpbmRvd3MgU1JXTE9DSyBwZXJmb3JtcyBhIGxpdHRsZSBiaXQgYmV0dGVyIHRoYW4KKyAgICAvLyBDUklUSUNBTF9TRUNUSU9OIGZvciB1bmNvbnRlbmRlZCBtb2RlIGFuZCBtdWNoIGJldHRlciBpbiBjYXNlIG9mCisgICAgLy8gY29udGVudGlvbi4KKyAgICBTUldMT0NLIG1Mb2NrID0gU1JXTE9DS19JTklUOworI2Vsc2UKKyAgICBwdGhyZWFkX211dGV4X3QgbUxvY2s7CisjZW5kaWYKKyAgICAvLyBCb3RoIFBPU0lYIHRocmVhZHMgYW5kIFdpbkFQSSBkb24ndCBhbGxvdyBtb3ZlICh1bmRlZmluZWQgYmVoYXZpb3IpLgorICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKExvY2spOworfTsKKworCitjbGFzcyBSZWFkV3JpdGVMb2NrIHsKK3B1YmxpYzoKKyAgICB1c2luZyBBdXRvV3JpdGVMb2NrID0gYW5kcm9pZDo6YmFzZTo6QXV0b1dyaXRlTG9jazsKKyAgICB1c2luZyBBdXRvUmVhZExvY2sgPSBhbmRyb2lkOjpiYXNlOjpBdXRvUmVhZExvY2s7CisKKyNpZmRlZiBfV0lOMzIKKyAgICBSZWFkV3JpdGVMb2NrKCkgPSBkZWZhdWx0OworICAgIH5SZWFkV3JpdGVMb2NrKCkgPSBkZWZhdWx0OworICAgIHZvaWQgbG9ja1JlYWQoKSB7CisgICAgICAgIDo6QWNxdWlyZVNSV0xvY2tTaGFyZWQoJm1Mb2NrKTsKKyAgICB9CisgICAgdm9pZCB1bmxvY2tSZWFkKCkgeworICAgICAgICA6OlJlbGVhc2VTUldMb2NrU2hhcmVkKCZtTG9jayk7CisgICAgfQorICAgIHZvaWQgbG9ja1dyaXRlKCkgeworICAgICAgICA6OkFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZtTG9jayk7CisgICAgfQorICAgIHZvaWQgdW5sb2NrV3JpdGUoKSB7CisgICAgICAgIDo6UmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUoJm1Mb2NrKTsKKyAgICB9Citwcml2YXRlOgorICAgIFNSV0xPQ0sgbUxvY2sgPSBTUldMT0NLX0lOSVQ7CisjZWxzZSAgLy8gIV9XSU4zMgorICAgIFJlYWRXcml0ZUxvY2soKSB7CisgICAgICAgIDo6cHRocmVhZF9yd2xvY2tfaW5pdCgmbUxvY2ssIE5VTEwpOworICAgIH0KKyAgICB2b2lkIGxvY2tSZWFkKCkgeworICAgICAgICA6OnB0aHJlYWRfcndsb2NrX3JkbG9jaygmbUxvY2spOworICAgIH0KKyAgICB2b2lkIHVubG9ja1JlYWQoKSB7CisgICAgICAgIDo6cHRocmVhZF9yd2xvY2tfdW5sb2NrKCZtTG9jayk7CisgICAgfQorICAgIHZvaWQgbG9ja1dyaXRlKCkgeworICAgICAgICA6OnB0aHJlYWRfcndsb2NrX3dybG9jaygmbUxvY2spOworICAgIH0KKyAgICB2b2lkIHVubG9ja1dyaXRlKCkgeworICAgICAgICA6OnB0aHJlYWRfcndsb2NrX3VubG9jaygmbUxvY2spOworICAgIH0KK3ByaXZhdGU6CisgICAgcHRocmVhZF9yd2xvY2tfdCBtTG9jazsKKyNlbmRpZiAgLy8gIV9XSU4zMgorCisgICAgZnJpZW5kIGNsYXNzIENvbmRpdGlvblZhcmlhYmxlOworICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKFJlYWRXcml0ZUxvY2spOworfTsKKworLy8gSGVscGVyIGNsYXNzIHRvIGxvY2sgLyB1bmxvY2sgYSBtdXRleCBhdXRvbWF0aWNhbGx5IG9uIHNjb3BlCisvLyBlbnRyeSBhbmQgZXhpdC4KKy8vIE5COiBub3QgdGhyZWFkLXNhZmUgKGFzIG9wcG9zZWQgdG8gdGhlIExvY2sgY2xhc3MpCitjbGFzcyBBdXRvTG9jayB7CitwdWJsaWM6CisgICAgQXV0b0xvY2soTG9jayYgbG9jaykgOiBtTG9jayhsb2NrKSB7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIGxvY2soKSB7CisgICAgICAgIGFzc2VydCghbUxvY2tlZCk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgbUxvY2tlZCA9IHRydWU7CisgICAgfQorCisgICAgdm9pZCB1bmxvY2soKSB7CisgICAgICAgIGFzc2VydChtTG9ja2VkKTsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIG1Mb2NrZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB+QXV0b0xvY2soKSB7CisgICAgICAgIGlmIChtTG9ja2VkKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBMb2NrJiBtTG9jazsKKyAgICBib29sIG1Mb2NrZWQgPSB0cnVlOworICAgIC8vIERvbid0IGFsbG93IG1vdmUgYmVjYXVzZSB0aGlzIGNsYXNzCisgICAgLy8gaGFzIGEgbm9uLW1vdmFibGUgb2JqZWN0LgorICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKEF1dG9Mb2NrKTsKK307CisKK2NsYXNzIEF1dG9Xcml0ZUxvY2sgeworcHVibGljOgorICAgIEF1dG9Xcml0ZUxvY2soUmVhZFdyaXRlTG9jayYgbG9jaykgOiBtTG9jayhsb2NrKSB7CisgICAgICAgIG1Mb2NrLmxvY2tXcml0ZSgpOworICAgIH0KKworICAgIHZvaWQgbG9ja1dyaXRlKCkgeworICAgICAgICBhc3NlcnQoIW1Xcml0ZUxvY2tlZCk7CisgICAgICAgIG1Mb2NrLmxvY2tXcml0ZSgpOworICAgICAgICBtV3JpdGVMb2NrZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgdW5sb2NrV3JpdGUoKSB7CisgICAgICAgIGFzc2VydChtV3JpdGVMb2NrZWQpOworICAgICAgICBtTG9jay51bmxvY2tXcml0ZSgpOworICAgICAgICBtV3JpdGVMb2NrZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB+QXV0b1dyaXRlTG9jaygpIHsKKyAgICAgICAgaWYgKG1Xcml0ZUxvY2tlZCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrV3JpdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBSZWFkV3JpdGVMb2NrJiBtTG9jazsKKyAgICBib29sIG1Xcml0ZUxvY2tlZCA9IHRydWU7CisgICAgLy8gVGhpcyBjbGFzcyBoYXMgYSBub24tbW92YWJsZSBvYmplY3QuCisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoQXV0b1dyaXRlTG9jayk7Cit9OworCitjbGFzcyBBdXRvUmVhZExvY2sgeworcHVibGljOgorICAgIEF1dG9SZWFkTG9jayhSZWFkV3JpdGVMb2NrJiBsb2NrKSA6IG1Mb2NrKGxvY2spIHsKKyAgICAgICAgbUxvY2subG9ja1JlYWQoKTsKKyAgICB9CisKKyAgICB2b2lkIGxvY2tSZWFkKCkgeworICAgICAgICBhc3NlcnQoIW1SZWFkTG9ja2VkKTsKKyAgICAgICAgbUxvY2subG9ja1JlYWQoKTsKKyAgICAgICAgbVJlYWRMb2NrZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgdW5sb2NrUmVhZCgpIHsKKyAgICAgICAgYXNzZXJ0KG1SZWFkTG9ja2VkKTsKKyAgICAgICAgbUxvY2sudW5sb2NrUmVhZCgpOworICAgICAgICBtUmVhZExvY2tlZCA9IGZhbHNlOworICAgIH0KKworICAgIH5BdXRvUmVhZExvY2soKSB7CisgICAgICAgIGlmIChtUmVhZExvY2tlZCkgeworICAgICAgICAgICAgbUxvY2sudW5sb2NrUmVhZCgpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIFJlYWRXcml0ZUxvY2smIG1Mb2NrOworICAgIGJvb2wgbVJlYWRMb2NrZWQgPSB0cnVlOworICAgIC8vIFRoaXMgY2xhc3MgaGFzIGEgbm9uLW1vdmFibGUgb2JqZWN0LgorICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKEF1dG9SZWFkTG9jayk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrX2JlbmNobWFyay5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9ja19iZW5jaG1hcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDNmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9ja19iZW5jaG1hcmsuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBBIHNtYWxsIGJlbmNobWFyayB1c2VkIHRvIGNvbXBhcmUgdGhlIHBlcmZvcm1hbmNlIG9mIGFuZHJvaWQ6OmJhc2U6OkxvY2sKKy8vIHdpdGggb3RoZXIgbXV0ZXggaW1wbGVtZW50aW9ucy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8YXRvbWljPgorCisjaW5jbHVkZSAiYmVuY2htYXJrL2JlbmNobWFya19hcGkuaCIKKworI2RlZmluZSBCQVNJQ19CRU5DSE1BUktfVEVTVCh4KSBcCisgICAgQkVOQ0hNQVJLKHgpLT5BcmcoOCktPkFyZyg1MTIpLT5BcmcoODE5MikKKwordm9pZCBCTV9CYXNlTG9ja19Mb2NrVW5sb2NrKGJlbmNobWFyazo6U3RhdGUmIHN0YXRlKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6TG9jayBsb2NrOworICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKSB7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBsb2NrLnVubG9jaygpOworICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX0Jhc2VMb2NrX0xvY2tVbmxvY2spOworQkVOQ0hNQVJLKEJNX0Jhc2VMb2NrX0xvY2tVbmxvY2spLT5UaHJlYWRQZXJDcHUoKTsKKworc3RydWN0IEJhc2VMb2NrQ29udGVudGlvbiB7CisgICAgaW50IGNvdW50ZXIgPSAwOworICAgIGFuZHJvaWQ6OmJhc2U6OkxvY2sgbG9jazsKK307CisKK3ZvaWQgQk1fU3RkTXV0ZXhfTG9ja1VubG9jayhiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIHN0ZDo6bXV0ZXggbG9jazsKKyAgICB3aGlsZSAoc3RhdGUuS2VlcFJ1bm5pbmcoKSkgeworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKK0JFTkNITUFSSyhCTV9TdGRNdXRleF9Mb2NrVW5sb2NrKTsKK0JFTkNITUFSSyhCTV9TdGRNdXRleF9Mb2NrVW5sb2NrKS0+VGhyZWFkUGVyQ3B1KCk7CisKK3N0YXRpYyBCYXNlTG9ja0NvbnRlbnRpb24gc0Jhc2VDb250ZW50aW9uOworCit2b2lkIEJNX0Jhc2VMb2NrX0NvbnRlbnRpb24oYmVuY2htYXJrOjpTdGF0ZSYgc3RhdGUpIHsKKyAgICBzdGF0aWMgQmFzZUxvY2tDb250ZW50aW9uIGNvbnRlbnRpb247CisgICAgaWYgKHN0YXRlLnRocmVhZF9pbmRleCA9PSAwKSB7CisgICAgICAgIGNvbnRlbnRpb24uY291bnRlciA9IDA7CisgICAgfQorICAgIHdoaWxlIChzdGF0ZS5LZWVwUnVubmluZygpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhdGUucmFuZ2VfeCgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnRlbnRpb24ubG9jay5sb2NrKCk7CisgICAgICAgICAgICBjb250ZW50aW9uLmNvdW50ZXIrKzsKKyAgICAgICAgICAgIGNvbnRlbnRpb24ubG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KKworQkVOQ0hNQVJLKEJNX0Jhc2VMb2NrX0NvbnRlbnRpb24pLT5BcmcoMzIpOworQkVOQ0hNQVJLKEJNX0Jhc2VMb2NrX0NvbnRlbnRpb24pLT5BcmcoMzIpLT5UaHJlYWRQZXJDcHUoKTsKKworc3RydWN0IFN0ZE11dGV4Q29udGVudGlvbiB7CisgICAgaW50IGNvdW50ZXIgPSAwOworICAgIHN0ZDo6bXV0ZXggbG9jazsKK307CisKK3ZvaWQgQk1fU3RkTXV0ZXhfQ29udGVudGlvbihiZW5jaG1hcms6OlN0YXRlJiBzdGF0ZSkgeworICAgIHN0YXRpYyBTdGRNdXRleENvbnRlbnRpb24gY29udGVudGlvbjsKKyAgICBpZiAoc3RhdGUudGhyZWFkX2luZGV4ID09IDApIHsKKyAgICAgICAgY29udGVudGlvbi5jb3VudGVyID0gMDsKKyAgICB9CisgICAgd2hpbGUgKHN0YXRlLktlZXBSdW5uaW5nKCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZS5yYW5nZV94KCk7ICsraSkgeworICAgICAgICAgICAgY29udGVudGlvbi5sb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGNvbnRlbnRpb24uY291bnRlcisrOworICAgICAgICAgICAgY29udGVudGlvbi5sb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorfQorCitCRU5DSE1BUksoQk1fU3RkTXV0ZXhfQ29udGVudGlvbiktPkFyZygzMik7CitCRU5DSE1BUksoQk1fU3RkTXV0ZXhfQ29udGVudGlvbiktPkFyZygzMiktPlRocmVhZFBlckNwdSgpOworCitzdGF0aWMgU3RkTXV0ZXhDb250ZW50aW9uIHNTdGRDb250ZW50aW9uOworCisKK0JFTkNITUFSS19NQUlOKCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDAyNDlmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2tfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUaHJlYWQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQ2hlY2sgdGhhdCBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uIGRvZXNuJ3QgY3Jhc2guCitURVNUKExvY2ssIENvbnN0cnVjdGlvbkRlc3RydWN0aW9uKSB7CisgICAgTG9jayBsb2NrOworfQorCisvLyBDaGVjayB0aGF0IGEgc2ltcGxlIGxvY2sgKyB1bmxvY2sgd29ya3MuCitURVNUKExvY2ssIExvY2tVbmxvY2spIHsKKyAgICBMb2NrIGxvY2s7CisgICAgbG9jay5sb2NrKCk7CisgICAgbG9jay51bmxvY2soKTsKK30KKworLy8gQ2hlY2sgdGhhdCBBdXRvTG9jayBjb21waWxlcyBhbmQgZG9lc24ndCBjcmFzaC4KK1RFU1QoTG9jaywgQXV0b0xvY2spIHsKKyAgICBMb2NrIG11dGV4OworICAgIEF1dG9Mb2NrIGxvY2sobXV0ZXgpOworfQorCisvLyBXcmFwcGVyIGNsYXNzIGZvciB0aHJlYWRzLiBEb2VzIG5vdCB1c2UgZW11Z2w6OlRocmVhZCBpbnRlbnRpb25hbGx5LgorLy8gQ29tbW9uIGRhdGEgdHlwZSB1c2VkIGJ5IHRoZSBmb2xsb3dpbmcgdGVzdHMgYmVsb3cuCitzdHJ1Y3QgVGhyZWFkUGFyYW1zIHsKKyAgICBUaHJlYWRQYXJhbXMoKSA6IG11dGV4KCksIGNvdW50ZXIoMCkge30KKworICAgIExvY2sgbXV0ZXg7CisgICAgaW50IGNvdW50ZXI7Cit9OworCisvLyBUaGlzIHRocmVhZCBmdW5jdGlvbiB1c2VzIExvY2s6OmxvY2svdW5sb2NrIHRvIHN5bmNocm9uaXplIGEgY291bnRlcgorLy8gaW5jcmVtZW50IG9wZXJhdGlvbi4KK3N0YXRpYyB2b2lkKiB0aHJlYWRGdW5jdGlvbih2b2lkKiBwYXJhbSkgeworICAgIFRocmVhZFBhcmFtcyogcCA9IHN0YXRpY19jYXN0PFRocmVhZFBhcmFtcyo+KHBhcmFtKTsKKworICAgIHAtPm11dGV4LmxvY2soKTsKKyAgICBwLT5jb3VudGVyKys7CisgICAgcC0+bXV0ZXgudW5sb2NrKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1RFU1QoTG9jaywgU3luY2hyb25pemF0aW9uKSB7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzID0gMjAwMDsKKyAgICBUZXN0VGhyZWFkKiB0aHJlYWRzW2tOdW1UaHJlYWRzXTsKKyAgICBUaHJlYWRQYXJhbXMgcDsKKworICAgIC8vIENyZWF0ZSBhbmQgbGF1bmNoIGFsbCB0aHJlYWRzLgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICB0aHJlYWRzW25dID0gbmV3IFRlc3RUaHJlYWQodGhyZWFkRnVuY3Rpb24sICZwKTsKKyAgICB9CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZWlyIGNvbXBsZXRpb24uCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrTnVtVGhyZWFkczsgKytuKSB7CisgICAgICAgIHRocmVhZHNbbl0tPmpvaW4oKTsKKyAgICAgICAgZGVsZXRlIHRocmVhZHNbbl07CisgICAgfQorCisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa051bVRocmVhZHMpLCBwLmNvdW50ZXIpOworfQorCisvLyBUaGlzIHRocmVhZCBmdW5jdGlvbiB1c2VzIGEgQXV0b0xvY2sgdG8gcHJvdGVjdCB0aGUgY291bnRlci4KK3N0YXRpYyB2b2lkKiB0aHJlYWRBdXRvTG9ja0Z1bmN0aW9uKHZvaWQqIHBhcmFtKSB7CisgICAgVGhyZWFkUGFyYW1zKiBwID0gc3RhdGljX2Nhc3Q8VGhyZWFkUGFyYW1zKj4ocGFyYW0pOworCisgICAgQXV0b0xvY2sgbG9jayhwLT5tdXRleCk7CisgICAgcC0+Y291bnRlcisrOworICAgIHJldHVybiBOVUxMOworfQorCitURVNUKExvY2ssIEF1dG9Mb2NrU3luY2hyb25pemF0aW9uKSB7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzID0gMjAwMDsKKyAgICBUZXN0VGhyZWFkKiB0aHJlYWRzW2tOdW1UaHJlYWRzXTsKKyAgICBUaHJlYWRQYXJhbXMgcDsKKworICAgIC8vIENyZWF0ZSBhbmQgbGF1bmNoIGFsbCB0aHJlYWRzLgorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICB0aHJlYWRzW25dID0gbmV3IFRlc3RUaHJlYWQodGhyZWFkQXV0b0xvY2tGdW5jdGlvbiwgJnApOworICAgIH0KKworICAgIC8vIFdhaXQgdW50aWwgdGhlaXIgY29tcGxldGlvbi4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgdGhyZWFkc1tuXS0+am9pbigpOworICAgICAgICBkZWxldGUgdGhyZWFkc1tuXTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTnVtVGhyZWFkcyksIHAuY291bnRlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9NZXNzYWdlQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwOGVlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9NZXNzYWdlQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworTWVzc2FnZUNoYW5uZWxCYXNlOjpNZXNzYWdlQ2hhbm5lbEJhc2Uoc2l6ZV90IGNhcGFjaXR5KSA6IG1DYXBhY2l0eShjYXBhY2l0eSkge30KKwordm9pZCBNZXNzYWdlQ2hhbm5lbEJhc2U6OnN0b3AoKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIG1Db3VudCA9IDA7CisgICAgbUNhblJlYWQuYnJvYWRjYXN0KCk7CisgICAgbUNhbldyaXRlLmJyb2FkY2FzdCgpOworfQorCitzaXplX3QgTWVzc2FnZUNoYW5uZWxCYXNlOjpiZWZvcmVXcml0ZSgpIHsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgd2hpbGUgKG1Db3VudCA+PSBtQ2FwYWNpdHkgJiYgIW1TdG9wcGVkKSB7CisgICAgICAgIG1DYW5Xcml0ZS53YWl0KCZtTG9jayk7CisgICAgfQorICAgIC8vIFJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQgaWYgc3RvcHBlZCwgc28gbGV0J3Mgc2F2ZSBhIGJyYW5jaCBhbmQgc2tpcCB0aGUKKyAgICAvLyBjaGVjayBmb3IgaXQuCisgICAgc2l6ZV90IHJlc3VsdCA9IG1Qb3MgKyBtQ291bnQ7CisgICAgaWYgKHJlc3VsdCA+PSBtQ2FwYWNpdHkpIHsKKyAgICAgICAgcmVzdWx0IC09IG1DYXBhY2l0eTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworT3B0aW9uYWw8c2l6ZV90PiBNZXNzYWdlQ2hhbm5lbEJhc2U6OmJlZm9yZVRyeVdyaXRlKCkgeworICAgIG1Mb2NrLmxvY2soKTsKKworICAgIGlmIChtQ291bnQgPj0gbUNhcGFjaXR5IHx8IG1TdG9wcGVkKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgc2l6ZV90IHJlc3VsdCA9IG1Qb3MgKyBtQ291bnQ7CisgICAgaWYgKHJlc3VsdCA+PSBtQ2FwYWNpdHkpIHsKKyAgICAgICAgcmVzdWx0IC09IG1DYXBhY2l0eTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBNZXNzYWdlQ2hhbm5lbEJhc2U6OmFmdGVyV3JpdGUoYm9vbCBzdWNjZXNzKSB7CisgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgKyttQ291bnQ7CisgICAgfQorICAgIG1DYW5SZWFkLnNpZ25hbEFuZFVubG9jaygmbUxvY2spOworfQorCitzaXplX3QgTWVzc2FnZUNoYW5uZWxCYXNlOjpiZWZvcmVSZWFkKCkgeworICAgIG1Mb2NrLmxvY2soKTsKKyAgICB3aGlsZSAobUNvdW50ID09IDAgJiYgIW1TdG9wcGVkKSB7CisgICAgICAgIG1DYW5SZWFkLndhaXQoJm1Mb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIG1Qb3M7IC8vIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQgaWYgc3RvcHBlZCwgc28gbGV0J3Mgc2F2ZSBhIGJyYW5jaAorfQorCitPcHRpb25hbDxzaXplX3Q+IE1lc3NhZ2VDaGFubmVsQmFzZTo6YmVmb3JlVHJ5UmVhZCgpIHsKKyAgICBtTG9jay5sb2NrKCk7CisKKyAgICBpZiAobUNvdW50ID09IDAgfHwgbVN0b3BwZWQpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICByZXR1cm4gbVBvczsKK30KKwordm9pZCBNZXNzYWdlQ2hhbm5lbEJhc2U6OmFmdGVyUmVhZChib29sIHN1Y2Nlc3MpIHsKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICBpZiAoKyttUG9zID09IG1DYXBhY2l0eSkgeworICAgICAgICAgICAgbVBvcyA9IDBVOworICAgICAgICB9CisgICAgICAgIC0tbUNvdW50OworICAgIH0KKyAgICBtQ2FuV3JpdGUuc2lnbmFsQW5kVW5sb2NrKCZtTG9jayk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjFlMWZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vQ29uZGl0aW9uVmFyaWFibGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQmFzZSBub24tdGVtcGxhdGVkIGNsYXNzIHVzZWQgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgdGVtcGxhdGUKKy8vIHNwZWNpYWxpemF0aW9uLgorY2xhc3MgTWVzc2FnZUNoYW5uZWxCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgY2hhbm5lbCBzaXplCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIC8vIEFib3J0IHRoZSBjdXJyZW50bHkgcGVuZGluZyBvcGVyYXRpb25zIGFuZCBkb24ndCBhbGxvdyBhbnkgb3RoZXIgb25lcworICAgIHZvaWQgc3RvcCgpOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIGNoYW5uZWwgaXMgc3RvcHBlZC4KKyAgICBib29sIGlzU3RvcHBlZCgpIGNvbnN0IHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIHJldHVybiBpc1N0b3BwZWRMb2NrZWQoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb25zdHJ1Y3Rvci4gfGNhcGFjaXR5fCBpcyB0aGUgYnVmZmVyIGNhcGFjaXR5IGluIG1lc3NhZ2VzLgorICAgIE1lc3NhZ2VDaGFubmVsQmFzZShzaXplX3QgY2FwYWNpdHkpOworCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB+TWVzc2FnZUNoYW5uZWxCYXNlKCkgPSBkZWZhdWx0OworCisgICAgLy8gQ2FsbCB0aGlzIG1ldGhvZCBpbiB0aGUgc2VuZGVyIHRocmVhZCBiZWZvcmUgd3JpdGluZyBhIG5ldyBtZXNzYWdlLgorICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGF2YWlsYWJsZSBzbG90IGluIHRoZSBtZXNzYWdlIGFycmF5CisgICAgLy8gd2hlcmUgdG8gY29weSB0aGUgbmV3IGZpeGVkLXNpemUgbWVzc2FnZS4gQWZ0ZXIgdGhlIGNvcHksIGNhbGwKKyAgICAvLyBhZnRlcldyaXRlKCkuCisgICAgLy8gSWYgdGhlIGNoYW5uZWwgaXMgc3RvcHBlZCwgcmV0dXJuIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICBzaXplX3QgYmVmb3JlV3JpdGUoKTsKKworICAgIC8vIFNhbWUgYXMgYmVmb3JlV3JpdGUoKSwgYnV0IHJldHVybnMgYW4gZW1wdHkgb3B0aW9uYWwgaWYgdGhlcmUgd2FzCisgICAgLy8gbm8gcm9vbSB0byB3cml0ZSB0byBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIGl0LgorICAgIC8vIE9uZSBzdGlsbCBuZWVkcyB0byBjYWxsIGFmdGVyV3JpdGUoKSBhbnl3YXkuCisgICAgT3B0aW9uYWw8c2l6ZV90PiBiZWZvcmVUcnlXcml0ZSgpOworCisgICAgLy8gVG8gYmUgY2FsbGVkIGFmdGVyIHRyeWluZyB0byB3cml0ZSBhIG5ldyBmaXhlZC1zaXplIG1lc3NhZ2UgKHdoaWNoIHNob3VsZAorICAgIC8vIGhhcHBlbiBhZnRlciBiZWZvcmVXcml0ZSgpIG9yIGJlZm9yZVRyeVdyaXRlKCkpLgorICAgIC8vIHxzdWNjZXNzfCBtdXN0IGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBpdGVtIHdhcyBhZGRlZCB0byB0aGUKKyAgICAvLyBjaGFubmVsLCBvciBmYWxzZSBvdGhlcndpc2UgKGkuZS4gaWYgdGhlIGNoYW5uZWwgaXMgc3RvcHBlZCwgb3IgaWYKKyAgICAvLyBiZWZvcmVUcnlXcml0ZSgpIHJldHVybmVkIGFuIGVtcHR5IG9wdGlvbmFsKS4KKyAgICB2b2lkIGFmdGVyV3JpdGUoYm9vbCBzdWNjZXNzKTsKKworICAgIC8vIENhbGwgdGhpcyBtZXRob2QgaW4gdGhlIHJlY2VpdmVyIHRocmVhZCBiZWZvcmUgcmVhZGluZyBhIG5ldyBtZXNzYWdlLgorICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIG1lc3NhZ2UgYXJyYXkgd2hlcmUgdGhlIG5ldyBtZXNzYWdlCisgICAgLy8gY2FuIGJlIHJlYWQuIENhbGxlciBtdXN0IHByb2Nlc3MgdGhlIG1lc3NhZ2UsIHRoZW4gY2FsbCBhZnRlclJlYWQoKS4KKyAgICAvLyBJZiB0aGUgY2hhbm5lbCBpcyBzdG9wcGVkLCByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLgorICAgIHNpemVfdCBiZWZvcmVSZWFkKCk7CisKKyAgICAvLyBTYW1lIGFzIGJlZm9yZVJlYWQoKSwgYnV0IHJldHVybnMgYW4gZW1wdHkgb3B0aW9uYWwgaWYgdGhlcmUgd2FzCisgICAgLy8gbm8gZGF0YSB0byByZWFkIGluc3RlYWQgb2Ygd2FpdGluZyBmb3IgaXQuCisgICAgLy8gT25lIHN0aWxsIG5lZWRzIHRvIGNhbGwgYWZ0ZXJXcml0ZSgpIGFueXdheS4KKyAgICBPcHRpb25hbDxzaXplX3Q+IGJlZm9yZVRyeVJlYWQoKTsKKworICAgIC8vIFRvIGJlIGNhbGxlZCBhZnRlciByZWFkaW5nIGEgZml4ZWQtc2l6ZSBtZXNzYWdlIGZyb20gdGhlIGNoYW5uZWwgKHdoaWNoCisgICAgLy8gbXVzdCBoYXBwZW4gYWZ0ZXIgYmVmb3JlUmVhZCgpIG9yIGJlZm9yZVRyeVJlYWQoKSkuCisgICAgLy8gfHN1Y2Nlc3N8IG11c3QgYmUgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IGEgbWVzc2FnZSB3YXMgcmVhZCwgb3IgZmFsc2UKKyAgICAvLyBvdGhlcndpc2UgKGkuZS4gaWYgdGhlIGNoYW5uZWwgaXMgc3RvcHBlZCBvciBpZiBiZWZvcmVUcnlSZWFkKCkgcmV0dXJuZWQKKyAgICAvLyBhbiBlbXB0eSBvcHRpb25hbCkuCisgICAgdm9pZCBhZnRlclJlYWQoYm9vbCBzdWNjZXNzKTsKKworICAgIC8vIEEgdmVyc2lvbiBvZiBpc1N0b3BwZWQoKSB0aGF0IGRvZXNuJ3QgbG9jayB0aGUgY2hhbm5lbCBidXQgZXhwZWN0cyBpdAorICAgIC8vIHRvIGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyLgorICAgIGJvb2wgaXNTdG9wcGVkTG9ja2VkKCkgY29uc3QgeyByZXR1cm4gbVN0b3BwZWQ7IH0KKworcHJpdmF0ZToKKyAgICBzaXplX3QgbVBvcyA9IDA7CisgICAgc2l6ZV90IG1DYXBhY2l0eTsKKyAgICBzaXplX3QgbUNvdW50ID0gMDsKKyAgICBib29sIG1TdG9wcGVkID0gZmFsc2U7CisgICAgbXV0YWJsZSBMb2NrIG1Mb2NrOyAgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBjb25zdCBtZW1iZXJzIHRvIGxvY2sgaXQuCisgICAgQ29uZGl0aW9uVmFyaWFibGUgbUNhblJlYWQ7CisgICAgQ29uZGl0aW9uVmFyaWFibGUgbUNhbldyaXRlOworfTsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IGFuIHVuaS1kaXJlY3Rpb25hbCBJUEMgY2hhbm5lbCBiZXR3ZWVuCisvLyB0d28gdGhyZWFkcy4gVGhlIGNoYW5uZWwgY2FuIGJlIHVzZWQgdG8gc2VuZCBmaXhlZC1zaXplIG1lc3NhZ2VzIG9mIHR5cGUKKy8vIHxUfCwgd2l0aCBhbiBpbnRlcm5hbCBidWZmZXIgc2l6ZSBvZiB8Q0FQQUNJVFl8IGl0ZW1zLiBBbGwgY2FsbHMgYXJlCisvLyBibG9ja2luZy4KKy8vCisvLyBVc2FnZSBpcyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOgorLy8KKy8vICAgLSBGcm9tIHRoZSBzZW5kZXIgdGhyZWFkLCBjYWxsIHNlbmQobXNnKTsKKy8vICAgLSBGcm9tIHRoZSByZWNlaXZlciB0aHJlYWQsIGNhbGwgcmVjZWl2ZSgmbXNnKTsKKy8vICAgLSBJZiB5b3Ugd2FudCB0byBzdG9wIHRoZSBJUEMsIGNhbGwgc3RvcCgpOwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBDQVBBQ0lUWT4KK2NsYXNzIE1lc3NhZ2VDaGFubmVsIDogcHVibGljIE1lc3NhZ2VDaGFubmVsQmFzZSB7CitwdWJsaWM6CisgICAgTWVzc2FnZUNoYW5uZWwoKSA6IE1lc3NhZ2VDaGFubmVsQmFzZShDQVBBQ0lUWSkge30KKworICAgIGJvb2wgc2VuZChjb25zdCBUJiBtc2cpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHBvcyA9IGJlZm9yZVdyaXRlKCk7CisgICAgICAgIGNvbnN0IGJvb2wgcmVzID0gIWlzU3RvcHBlZExvY2tlZCgpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBtSXRlbXNbcG9zXSA9IG1zZzsKKyAgICAgICAgfQorICAgICAgICBhZnRlcldyaXRlKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYm9vbCBzZW5kKFQmJiBtc2cpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHBvcyA9IGJlZm9yZVdyaXRlKCk7CisgICAgICAgIGNvbnN0IGJvb2wgcmVzID0gIWlzU3RvcHBlZExvY2tlZCgpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBtSXRlbXNbcG9zXSA9IHN0ZDo6bW92ZShtc2cpOworICAgICAgICB9CisgICAgICAgIGFmdGVyV3JpdGUocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBib29sIHRyeVNlbmQoY29uc3QgVCYgbXNnKSB7CisgICAgICAgIGNvbnN0IGF1dG8gcG9zID0gYmVmb3JlVHJ5V3JpdGUoKTsKKyAgICAgICAgaWYgKHBvcykgeworICAgICAgICAgICAgbUl0ZW1zWypwb3NdID0gbXNnOworICAgICAgICB9CisgICAgICAgIGFmdGVyV3JpdGUocG9zKTsKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBib29sIHRyeVNlbmQoVCYmIG1zZykgeworICAgICAgICBjb25zdCBhdXRvIHBvcyA9IGJlZm9yZVRyeVdyaXRlKCk7CisgICAgICAgIGlmIChwb3MpIHsKKyAgICAgICAgICAgIG1JdGVtc1sqcG9zXSA9IHN0ZDo6bW92ZShtc2cpOworICAgICAgICB9CisgICAgICAgIGFmdGVyV3JpdGUocG9zKTsKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBib29sIHJlY2VpdmUoVCogbXNnKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBwb3MgPSBiZWZvcmVSZWFkKCk7CisgICAgICAgIGNvbnN0IGJvb2wgcmVzID0gIWlzU3RvcHBlZExvY2tlZCgpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAqbXNnID0gc3RkOjptb3ZlKG1JdGVtc1twb3NdKTsKKyAgICAgICAgfQorICAgICAgICBhZnRlclJlYWQocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBPcHRpb25hbDxUPiByZWNlaXZlKCkgeworICAgICAgICBjb25zdCBzaXplX3QgcG9zID0gYmVmb3JlUmVhZCgpOworICAgICAgICBpZiAoIWlzU3RvcHBlZExvY2tlZCgpKSB7CisgICAgICAgICAgICBPcHRpb25hbDxUPiBtc2coc3RkOjptb3ZlKG1JdGVtc1twb3NdKSk7CisgICAgICAgICAgICBhZnRlclJlYWQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWZ0ZXJSZWFkKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdHJ5UmVjZWl2ZShUKiBtc2cpIHsKKyAgICAgICAgY29uc3QgYXV0byBwb3MgPSBiZWZvcmVUcnlSZWFkKCk7CisgICAgICAgIGlmIChwb3MpIHsKKyAgICAgICAgICAgICptc2cgPSBzdGQ6Om1vdmUobUl0ZW1zWypwb3NdKTsKKyAgICAgICAgfQorICAgICAgICBhZnRlclJlYWQocG9zKTsKKyAgICAgICAgcmV0dXJuIHBvczsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgc2l6ZV90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gQ0FQQUNJVFk7IH0KKworcHJpdmF0ZToKKyAgICBUIG1JdGVtc1tDQVBBQ0lUWV07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9NZXNzYWdlQ2hhbm5lbF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWxfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWRjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWxfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUaHJlYWQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBQaW5nUG9uZ1N0YXRlIHsKKyAgICBNZXNzYWdlQ2hhbm5lbDxzdGQ6OnN0cmluZywgM1U+IGluOworICAgIE1lc3NhZ2VDaGFubmVsPHN0ZDo6c3RyaW5nLCAzVT4gb3V0OworfTsKKwordm9pZCogcGluZ1BvbmdGdW5jdGlvbih2b2lkKiBwYXJhbSkgeworICAgIGZvciAoOzspIHsKKyAgICAgICAgUGluZ1BvbmdTdGF0ZSogcyA9IHN0YXRpY19jYXN0PFBpbmdQb25nU3RhdGUqPihwYXJhbSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgICAgcy0+aW4ucmVjZWl2ZSgmc3RyKTsKKyAgICAgICAgaWYgKHMtPmluLmlzU3RvcHBlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gKHZvaWQqKS0xOworICAgICAgICB9CisgICAgICAgIHMtPm91dC5zZW5kKHN0cik7CisgICAgICAgIGlmIChzLT5vdXQuaXNTdG9wcGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAodm9pZCopLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ciA9PSAicXVpdCIpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChNZXNzYWdlQ2hhbm5lbCwgU2luZ2xlVGhyZWFkV2l0aEludCkgeworICAgIE1lc3NhZ2VDaGFubmVsPGludCwgM1U+IGNoYW5uZWw7CisgICAgY2hhbm5lbC5zZW5kKDEpOworICAgIGNoYW5uZWwuc2VuZCgyKTsKKyAgICBjaGFubmVsLnNlbmQoMyk7CisKKyAgICBpbnQgcmV0OworICAgIGNoYW5uZWwucmVjZWl2ZSgmcmV0KTsKKyAgICBFWFBFQ1RfRVEoMSwgcmV0KTsKKyAgICBjaGFubmVsLnJlY2VpdmUoJnJldCk7CisgICAgRVhQRUNUX0VRKDIsIHJldCk7CisgICAgY2hhbm5lbC5yZWNlaXZlKCZyZXQpOworICAgIEVYUEVDVF9FUSgzLCByZXQpOworfQorCitURVNUKE1lc3NhZ2VDaGFubmVsLCBTaW5nbGVUaHJlYWRXaXRoU3RkU3RyaW5nKSB7CisgICAgTWVzc2FnZUNoYW5uZWw8c3RkOjpzdHJpbmcsIDVVPiBjaGFubmVsOworICAgIGNoYW5uZWwuc2VuZChzdGQ6OnN0cmluZygiZm9vIikpOworICAgIGNoYW5uZWwuc2VuZChzdGQ6OnN0cmluZygiYmFyIikpOworICAgIGNoYW5uZWwuc2VuZChzdGQ6OnN0cmluZygiem9vIikpOworCisgICAgc3RkOjpzdHJpbmcgc3RyOworICAgIGNoYW5uZWwucmVjZWl2ZSgmc3RyKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIHN0ci5jX3N0cigpKTsKKyAgICBjaGFubmVsLnJlY2VpdmUoJnN0cik7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBzdHIuY19zdHIoKSk7CisgICAgY2hhbm5lbC5yZWNlaXZlKCZzdHIpOworICAgIEVYUEVDVF9TVFJFUSgiem9vIiwgc3RyLmNfc3RyKCkpOworfQorCitURVNUKE1lc3NhZ2VDaGFubmVsLCBUd29UaHJlYWRzUGluZ1BvbmcpIHsKKyAgICBQaW5nUG9uZ1N0YXRlIHN0YXRlOworICAgIGF1dG8gdGhyZWFkID0gc3RkOjp1bmlxdWVfcHRyPFRlc3RUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IFRlc3RUaHJlYWQocGluZ1BvbmdGdW5jdGlvbiwgJnN0YXRlKSk7CisKKyAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgY29uc3Qgc2l6ZV90IGtDb3VudCA9IDEwMDsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIHN0YXRlLmluLnNlbmQoc3RkOjpzdHJpbmcoImZvbyIpKTsKKyAgICAgICAgc3RhdGUuaW4uc2VuZChzdGQ6OnN0cmluZygiYmFyIikpOworICAgICAgICBzdGF0ZS5pbi5zZW5kKHN0ZDo6c3RyaW5nKCJ6b28iKSk7CisgICAgICAgIHN0YXRlLm91dC5yZWNlaXZlKCZzdHIpOworICAgICAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIHN0ci5jX3N0cigpKTsKKyAgICAgICAgc3RhdGUub3V0LnJlY2VpdmUoJnN0cik7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiYmFyIiwgc3RyLmNfc3RyKCkpOworICAgICAgICBzdGF0ZS5vdXQucmVjZWl2ZSgmc3RyKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJ6b28iLCBzdHIuY19zdHIoKSk7CisgICAgfQorICAgIHN0YXRlLmluLnNlbmQoc3RkOjpzdHJpbmcoInF1aXQiKSk7CisgICAgc3RhdGUub3V0LnJlY2VpdmUoJnN0cik7CisgICAgRVhQRUNUX1NUUkVRKCJxdWl0Iiwgc3RyLmNfc3RyKCkpOworCisgICAgdGhyZWFkLT5qb2luKCk7Cit9CisKK1RFU1QoTWVzc2FnZUNoYW5uZWwsIFN0b3ApIHsKKyAgICB7CisgICAgICAgIFBpbmdQb25nU3RhdGUgc3RhdGU7CisgICAgICAgIGF1dG8gdGhyZWFkID0gc3RkOjp1bmlxdWVfcHRyPFRlc3RUaHJlYWQ+KAorICAgICAgICAgICAgICAgIG5ldyBUZXN0VGhyZWFkKHBpbmdQb25nRnVuY3Rpb24sICZzdGF0ZSkpOworCisgICAgICAgIC8vIHRoZSB0aHJlYWQgaGFzIHRvIGJlIGJsb2NrZWQgb24gaW4ucmVjZWl2ZSgpLCBsZXQncyBzdG9wIGl0CisgICAgICAgIHN0YXRlLmluLnN0b3AoKTsKKyAgICAgICAgRVhQRUNUX05FKDAsIHRocmVhZC0+am9pbigpKTsKKyAgICAgICAgRVhQRUNUX0VRKGFuZHJvaWQ6OmJhc2U6OmtOdWxsb3B0LCBzdGF0ZS5pbi5yZWNlaXZlKCkpOworICAgICAgICBzdGF0ZS5pbi5zZW5kKCIxIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBzdGF0ZS5pbi5zaXplKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgUGluZ1BvbmdTdGF0ZSBzdGF0ZTsKKyAgICAgICAgYXV0byB0aHJlYWQgPSBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFRocmVhZD4oCisgICAgICAgICAgICAgICAgbmV3IFRlc3RUaHJlYWQocGluZ1BvbmdGdW5jdGlvbiwgJnN0YXRlKSk7CisKKyAgICAgICAgLy8gZmlsbCBpbiB0aGUgcmVjZWl2aW5nIG1lc3NhZ2UgY2hhbm5lbAorICAgICAgICB3aGlsZSAoc3RhdGUub3V0LnNpemUoKSA8IHN0YXRlLm91dC5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICBzdGF0ZS5pbi5zZW5kKCIxIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3QgdGhlIHRocmVhZCBpcyBibG9ja2VkIG9uIG91dC5zZW5kKCkKKyAgICAgICAgc3RhdGUub3V0LnN0b3AoKTsKKworICAgICAgICBFWFBFQ1RfTkUoMCwgdGhyZWFkLT5qb2luKCkpOworICAgIH0KK30KKworVEVTVChNZXNzYWdlQ2hhbm5lbCwgVHJ5VmVyc2lvbnMpIHsKKyAgICBNZXNzYWdlQ2hhbm5lbDxpbnQsIDI+IGNoYW5uZWw7CisgICAgaW50IHJldDsKKyAgICBFWFBFQ1RfRkFMU0UoY2hhbm5lbC50cnlSZWNlaXZlKCZyZXQpKTsKKworICAgIEVYUEVDVF9UUlVFKGNoYW5uZWwudHJ5U2VuZCgxKSk7CisgICAgRVhQRUNUX1RSVUUoY2hhbm5lbC50cnlTZW5kKDIpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY2hhbm5lbC50cnlTZW5kKDMpKTsKKworICAgIEVYUEVDVF9UUlVFKGNoYW5uZWwudHJ5UmVjZWl2ZSgmcmV0KSk7CisgICAgRVhQRUNUX0VRKDEsIHJldCk7CisgICAgRVhQRUNUX1RSVUUoY2hhbm5lbC50cnlSZWNlaXZlKCZyZXQpKTsKKyAgICBFWFBFQ1RfRVEoMiwgcmV0KTsKKyAgICBFWFBFQ1RfRkFMU0UoY2hhbm5lbC50cnlSZWNlaXZlKCZyZXQpKTsKKyAgICAvLyBtYWtlIHN1cmUgfHJldHwgd2Fzbid0IGNoYW5nZWQKKyAgICBFWFBFQ1RfRVEoMiwgcmV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vUmVhZFdyaXRlTG9ja191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vUmVhZFdyaXRlTG9ja191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxYjVjMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9SZWFkV3JpdGVMb2NrX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI0MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGhyZWFkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVXRpbHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIE9uIHdpbmRvd3MgdmVyc2lvbnMgcHJpb3IgdG8gVmlzdGEsCisvLyB0aGlzIHNob3VsZCB1c2UgdGhlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uLgorLy8gSXQgc2hvdWxkIHdvcmsgZm9yIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZiB0aGUgdW5pdCB0ZXN0CisvLyAoV0lOQVBJICh3aGljaCBjaGFuZ2VzIGNhbGxpbmcgY29udmVudGlvbikKKy8vIHdhcyBuZWVkZWQgdG8gbWFrZSB0aGUgMzIgYml0IHZlcnNpb24gd29yaykKK1RFU1QoUmVhZFdyaXRlTG9jaywgaW5pdCkgeworICAgIFJlYWRXcml0ZUxvY2sgcndsOworfQorCisvLyBiYXNpYyBsb2NrL3VubG9jayBmb3IgcmVhZGVycworVEVTVChSZWFkV3JpdGVMb2NrLCByZWFkTG9ja0Jhc2ljKSB7CisgICAgUmVhZFdyaXRlTG9jayByd2w7CisgICAgcndsLmxvY2tSZWFkKCk7CisgICAgcndsLnVubG9ja1JlYWQoKTsKK30KKworLy8gYmFzaWMgbG9jay91bmxvY2sgZm9yIHdyaXRlcgorVEVTVChSZWFkV3JpdGVMb2NrLCB3cml0ZUxvY2tCYXNpYykgeworICAgIFJlYWRXcml0ZUxvY2sgcndsOworICAgIHJ3bC5sb2NrV3JpdGUoKTsKKyAgICByd2wudW5sb2NrV3JpdGUoKTsKK30KKworLy8gY2hlY2sgd2UgY2FuIGxvY2sgcmVhZGVyIG11bHRpcGxlIHRpbWVzIGZyb20gdGhlIHNhbWUgdGhyZWFkCitURVNUKFJlYWRXcml0ZUxvY2ssIHJlYWRMb2NrTXVsdGlSZWFkU2luZ2xlVGhyZWFkKSB7CisgICAgUmVhZFdyaXRlTG9jayByd2w7CisgICAgcndsLmxvY2tSZWFkKCk7CisgICAgcndsLmxvY2tSZWFkKCk7CisgICAgcndsLmxvY2tSZWFkKCk7CisgICAgcndsLmxvY2tSZWFkKCk7CisgICAgcndsLnVubG9ja1JlYWQoKTsKKyAgICByd2wudW5sb2NrUmVhZCgpOworICAgIHJ3bC51bmxvY2tSZWFkKCk7CisgICAgcndsLnVubG9ja1JlYWQoKTsKK30KKworLy8gV3JpdGUgbG9jayB0ZXN0cy4KKworLy8gUldUaHJlYWRQYXJhbXMgY2xhc3MgKyB0aHJlYWQgZm4gaW5zcGlyZWQgYnkgTG9ja191bml0dGVzdAorLy8gUGFja2FnZSB1cCBkYXRhIGJlaW5nIG1vZGlmaWVkICsgbG9jayBjbGFzcworCitzdHJ1Y3QgUldUaHJlYWRQYXJhbXMgeworICAgIFJXVGhyZWFkUGFyYW1zKCkgOiBtdXRleCgpLCBjb3VudGVyKDApLCByZWFkX2NvdW50ZXIoMCkge30KKyAgICBSZWFkV3JpdGVMb2NrIG11dGV4OworICAgIGludCBjb3VudGVyOworICAgIGludCByZWFkX2NvdW50ZXI7Cit9OworCitzdGF0aWMgdm9pZCogd3JpdGVUaHJlYWRGdW5jdGlvbih2b2lkKiBwYXJhbSkgeworICAgIFJXVGhyZWFkUGFyYW1zKiBwID0gc3RhdGljX2Nhc3Q8UldUaHJlYWRQYXJhbXMqPihwYXJhbSk7CisKKyAgICBwLT5tdXRleC5sb2NrV3JpdGUoKTsKKyAgICBwLT5jb3VudGVyKys7CisgICAgcC0+bXV0ZXgudW5sb2NrV3JpdGUoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQqIHJlYWRUaHJlYWRGdW5jdGlvbih2b2lkKiBwYXJhbSkgeworICAgIFJXVGhyZWFkUGFyYW1zKiBwID0gc3RhdGljX2Nhc3Q8UldUaHJlYWRQYXJhbXMqPihwYXJhbSk7CisKKyAgICBwLT5tdXRleC5sb2NrUmVhZCgpOworICAgIHAtPnJlYWRfY291bnRlcisrOworICAgIHAtPm11dGV4LnVubG9ja1JlYWQoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gYmFzaWMgc3luY2hyb25pemVkIHdyaXRlIC8gcmVhZCB0ZXN0cworCisvLyB3cml0ZToganVzdCBsaWtlIGZvciBMb2NrCitURVNUKFJlYWRXcml0ZUxvY2ssIFN5bmNXcml0ZSkgeworICAgIFJlYWRXcml0ZUxvY2sgcndsOworCisgICAgY29uc3Qgc2l6ZV90IGtOdW1Xcml0ZVRocmVhZHMgPSAyMDAwOworICAgIHN0ZDo6dmVjdG9yPFRlc3RUaHJlYWQ+IHdyaXRlX3RocmVhZHM7CisgICAgd3JpdGVfdGhyZWFkcy5yZXNlcnZlKGtOdW1Xcml0ZVRocmVhZHMpOworICAgIFJXVGhyZWFkUGFyYW1zIHA7CisKKyAgICAvLyBDcmVhdGUgYW5kIGxhdW5jaCBhbGwgdGhyZWFkcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1Xcml0ZVRocmVhZHM7IGkrKykgeworICAgICAgICB3cml0ZV90aHJlYWRzLmVtcGxhY2VfYmFjayh3cml0ZVRocmVhZEZ1bmN0aW9uLCAmcCk7CisgICAgfQorCisgICAgLy8gV2FpdCB1bnRpbCB0aGVpciBjb21wbGV0aW9uLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVdyaXRlVGhyZWFkczsgKytpKSB7CisgICAgICAgIHdyaXRlX3RocmVhZHNbaV0uam9pbigpOworICAgIH0KKworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtOdW1Xcml0ZVRocmVhZHMpLCBwLmNvdW50ZXIpOworfQorCisvLyBIYXZlIGhhbGYgb2YgdGhlIHRocmVhZHMgcmVhZC93cml0ZS4KKy8vIExhdW5jaCB0aGVtIGluIHZhcmlvdXMgd2F5cyAoaW50ZXJsZWF2ZWQsCisvLyBhbGwgd3JpdGVzIGZpcnN0LCBhbGwgcmVhZHMgZmlyc3QsIHJhbmRvbSkKKworVEVTVChSZWFkV3JpdGVMb2NrLCBTeW5jUmVhZFdyaXRlKSB7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzID0gMTAwMDsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0VGhyZWFkPiB3cml0ZV90aHJlYWRzOworICAgIHN0ZDo6dmVjdG9yPFRlc3RUaHJlYWQ+IHJlYWRfdGhyZWFkczsKKyAgICB3cml0ZV90aHJlYWRzLnJlc2VydmUoa051bVRocmVhZHMpOworICAgIHJlYWRfdGhyZWFkcy5yZXNlcnZlKGtOdW1UaHJlYWRzKTsKKworICAgIFJXVGhyZWFkUGFyYW1zIHA7CisKKyAgICAvLyBDcmVhdGUgYW5kIGxhdW5jaCBhbGwgdGhyZWFkcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzOyArK2kpIHsKKyAgICAgICAgd3JpdGVfdGhyZWFkcy5lbXBsYWNlX2JhY2sod3JpdGVUaHJlYWRGdW5jdGlvbiwgJnApOworICAgICAgICByZWFkX3RocmVhZHMuZW1wbGFjZV9iYWNrKHJlYWRUaHJlYWRGdW5jdGlvbiwgJnApOworICAgIH0KKworICAgIC8vIFdhaXQgdW50aWwgdGhlaXIgY29tcGxldGlvbi4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgd3JpdGVfdGhyZWFkc1tuXS5qb2luKCk7CisgICAgICAgIHJlYWRfdGhyZWFkc1tuXS5qb2luKCk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa051bVRocmVhZHMpLCBwLmNvdW50ZXIpOworICAgIEVYUEVDVF9HRShzdGF0aWNfY2FzdDxpbnQ+KGtOdW1UaHJlYWRzKSwgcC5yZWFkX2NvdW50ZXIpOworCisgICAgcC5jb3VudGVyID0gMDsKKyAgICBwLnJlYWRfY291bnRlciA9IDA7CisKKyAgICAvLyBDcmVhdGUgYW5kIGxhdW5jaCBhbGwgdGhyZWFkcy4KKyAgICB3cml0ZV90aHJlYWRzLmNsZWFyKCk7CisgICAgcmVhZF90aHJlYWRzLmNsZWFyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7CisgICAgICAgIHdyaXRlX3RocmVhZHMuZW1wbGFjZV9iYWNrKHdyaXRlVGhyZWFkRnVuY3Rpb24sICZwKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7CisgICAgICAgIHJlYWRfdGhyZWFkcy5lbXBsYWNlX2JhY2socmVhZFRocmVhZEZ1bmN0aW9uLCAmcCk7CisgICAgfQorCisgICAgLy8gV2FpdCB1bnRpbCB0aGVpciBjb21wbGV0aW9uLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVRocmVhZHM7ICsraSkgeworICAgICAgICB3cml0ZV90aHJlYWRzW2ldLmpvaW4oKTsKKyAgICAgICAgcmVhZF90aHJlYWRzW2ldLmpvaW4oKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrTnVtVGhyZWFkcyksIHAuY291bnRlcik7CisgICAgRVhQRUNUX0dFKHN0YXRpY19jYXN0PGludD4oa051bVRocmVhZHMpLCBwLnJlYWRfY291bnRlcik7CisKKyAgICBwLmNvdW50ZXIgPSAwOworICAgIHAucmVhZF9jb3VudGVyID0gMDsKKworICAgIC8vIENyZWF0ZSBhbmQgbGF1bmNoIGFsbCB0aHJlYWRzLgorICAgIHdyaXRlX3RocmVhZHMuY2xlYXIoKTsKKyAgICByZWFkX3RocmVhZHMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzOyArK2kpIHsKKyAgICAgICAgcmVhZF90aHJlYWRzLmVtcGxhY2VfYmFjayhyZWFkVGhyZWFkRnVuY3Rpb24sICZwKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7CisgICAgICAgIHdyaXRlX3RocmVhZHMuZW1wbGFjZV9iYWNrKHdyaXRlVGhyZWFkRnVuY3Rpb24sICZwKTsKKyAgICB9CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZWlyIGNvbXBsZXRpb24uCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVGhyZWFkczsgKytpKSB7CisgICAgICAgIHdyaXRlX3RocmVhZHNbaV0uam9pbigpOworICAgICAgICByZWFkX3RocmVhZHNbaV0uam9pbigpOworICAgIH0KKworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtOdW1UaHJlYWRzKSwgcC5jb3VudGVyKTsKKyAgICBFWFBFQ1RfR0Uoc3RhdGljX2Nhc3Q8aW50PihrTnVtVGhyZWFkcyksIHAucmVhZF9jb3VudGVyKTsKK30KKworVEVTVChSZWFkV3JpdGVMb2NrLCBTeW5jUmVhZFdyaXRlUmFuZG9tKSB7CisgICAgY29uc3Qgc2l6ZV90IGtUcmlhbHMgPSAxMDA7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzUGVyVHJpYWwgPSAxMDA7CisgICAgUldUaHJlYWRQYXJhbXMgcDsKKworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbmVyYXRvcjsKKworICAgIC8vIEF0IGxlYXN0IG9uZSB3cml0ZXIgYW5kIHJlYWRlcgorICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gd3JpdGVycygxLCBrTnVtVGhyZWFkc1BlclRyaWFsIC0gMSk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdFRocmVhZCo+IHRocmVhZHMoa051bVRocmVhZHNQZXJUcmlhbCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtUcmlhbHM7IGkrKykgeworICAgICAgICBwLmNvdW50ZXIgPSAwOworICAgICAgICBwLnJlYWRfY291bnRlciA9IDA7CisKKyAgICAgICAgc2l6ZV90IG51bV93cml0ZXJzID0gd3JpdGVycyhnZW5lcmF0b3IpOworICAgICAgICBzaXplX3QgbnVtX3JlYWRlcnMgPSBrTnVtVGhyZWFkc1BlclRyaWFsIC0gbnVtX3dyaXRlcnM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCwgYm9vbD4gPiBpbmRpY2VzX3dyaXRlcnM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVRocmVhZHNQZXJUcmlhbDsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnBhaXI8aW50LCBib29sPiBpdGVtOworICAgICAgICAgICAgaXRlbS5maXJzdCA9IGk7CisgICAgICAgICAgICBpdGVtLnNlY29uZCA9IGkgPCBudW1fd3JpdGVyczsKKyAgICAgICAgICAgIGluZGljZXNfd3JpdGVycy5wdXNoX2JhY2soaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpyYW5kb21fc2h1ZmZsZShpbmRpY2VzX3dyaXRlcnMuYmVnaW4oKSwgaW5kaWNlc193cml0ZXJzLmVuZCgpKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UaHJlYWRzUGVyVHJpYWw7IGkrKykgeworICAgICAgICAgICAgaWYgKGluZGljZXNfd3JpdGVyc1tpXS5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWRzW2luZGljZXNfd3JpdGVyc1tpXS5maXJzdF0gPQorICAgICAgICAgICAgICAgICAgICBuZXcgVGVzdFRocmVhZCh3cml0ZVRocmVhZEZ1bmN0aW9uLCAmcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocmVhZHNbaW5kaWNlc193cml0ZXJzW2ldLmZpcnN0XSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0VGhyZWFkKHJlYWRUaHJlYWRGdW5jdGlvbiwgJnApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtVGhyZWFkc1BlclRyaWFsOyBpKyspIHsKKyAgICAgICAgICAgIHRocmVhZHNbaV0tPmpvaW4oKTsKKyAgICAgICAgICAgIGRlbGV0ZSB0aHJlYWRzW2ldOworICAgICAgICB9CisKKyAgICAgICAgRVhQRUNUX0VRKG51bV93cml0ZXJzLCBwLmNvdW50ZXIpOworICAgICAgICAvLyBTaW11bHRhbmVvdXMgcmVhZGVyIHRocmVhZHMgY2FuIGluY3JlbWVudCBvbGQgdmVyc2lvbnMKKyAgICAgICAgLy8gb2YgcmVhZF9jb3VudGVyLCBzbyB0aGlzIGlzIGFsbG93ZWQgdG8gYmUgPj0uCisgICAgICAgIEVYUEVDVF9HRShudW1fcmVhZGVycywgKHNpemVfdClwLnJlYWRfY291bnRlcik7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmEyNjNjMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uY3BwCkBAIC0wLDAgKzEsMTQwMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmgiCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHNobG9iai5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzaGxvYmouaD4KKyNlbmRpZgorCisjaWZkZWYgX19BUFBMRV9fCisjaW1wb3J0IDxDYXJib24vQ2FyYm9uLmg+CisjaW5jbHVkZSA8bWFjaC9jbG9jay5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaC5oPgorI2luY2x1ZGUgPHNwYXduLmg+CisjZW5kaWYgIC8vIF9fQVBQTEVfXworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLy8gVGhpcyB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYSB6ZXJvLXRlcm1pbmF0ZWQgYXJyYXkgb2YgYWxsIGVudmlyb25tZW50CisvLyB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKy8vIFBvc2l4IHJlcXVpcmVzIHRoaXMgdG8gYmUgZGVjbGFyZWQgYXMgZXh0ZXJuIGF0IHRoZSBwb2ludCBvZiB1c2UKKy8vIE5PVEU6IEFwcGxlIGRldmVsb3BlciBtYW51YWwgc3RhdGVzIHRoYXQgdGhpcyB2YXJpYWJsZSBpc24ndCBhdmFpbGFibGUgZm9yCisvLyB0aGUgc2hhcmVkIGxpYnJhcmllcywgYW5kIG9uZSBoYXMgdG8gdXNlIHRoZSBfTlNHZXRFbnZpcm9uKCkgZnVuY3Rpb24gaW5zdGVhZAorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+CisjZGVmaW5lIGVudmlyb24gKCpfTlNHZXRFbnZpcm9uKCkpCisjZWxzZQorZXh0ZXJuICJDIiBjaGFyKiogZW52aXJvbjsKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp1bmlxdWVfcHRyOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBUaWNrQ291bnRJbXBsIHsKK3ByaXZhdGU6CisgICAgU3lzdGVtOjpXYWxsRHVyYXRpb24gbVN0YXJ0VGltZVVzOworI2lmZGVmIF9XSU4zMgorICAgIGxvbmcgbG9uZyBtRnJlcVBlclNlYyA9IDA7ICAgIC8vIDAgbWVhbnMgJ2hpZ2ggcGVyZiBjb3VudGVyIGlzbid0IGF2YWlsYWJsZScKKyNlbmRpZgorCitwdWJsaWM6CisgICAgVGlja0NvdW50SW1wbCgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgTEFSR0VfSU5URUdFUiBmcmVxOworICAgICAgICBpZiAoOjpRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKSkgeworICAgICAgICAgICAgbUZyZXFQZXJTZWMgPSBmcmVxLlF1YWRQYXJ0OworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgbVN0YXJ0VGltZVVzID0gZ2V0VXMoKTsKKyAgICB9CisKKyAgICBTeXN0ZW06OldhbGxEdXJhdGlvbiBnZXRTdGFydFRpbWVVcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGFydFRpbWVVczsKKyAgICB9CisKKyAgICBTeXN0ZW06OldhbGxEdXJhdGlvbiBnZXRVcygpIGNvbnN0IHsKKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoIW1GcmVxUGVyU2VjKSB7CisgICAgICAgIHJldHVybiA6OkdldFRpY2tDb3VudCgpICogMTAwMDsKKyAgICB9CisgICAgTEFSR0VfSU5URUdFUiBub3c7CisgICAgOjpRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbm93KTsKKyAgICByZXR1cm4gKG5vdy5RdWFkUGFydCAqIDEwMDAwMDB1bGwpIC8gbUZyZXFQZXJTZWM7CisjZWxpZiBkZWZpbmVkIF9fbGludXhfXworICAgIHRpbWVzcGVjIHRzOworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHJldHVybiB0cy50dl9zZWMgKiAxMDAwMDAwbGwgKyB0cy50dl9uc2VjIC8gMTAwMDsKKyNlbHNlIC8vIE1BQworICAgIGNsb2NrX3NlcnZfdCBjbG9ja1NlcnY7CisgICAgbWFjaF90aW1lc3BlY190IG10czsKKyAgICBob3N0X2dldF9jbG9ja19zZXJ2aWNlKG1hY2hfaG9zdF9zZWxmKCksIFNZU1RFTV9DTE9DSywgJmNsb2NrU2Vydik7CisgICAgY2xvY2tfZ2V0X3RpbWUoY2xvY2tTZXJ2LCAmbXRzKTsKKyAgICBtYWNoX3BvcnRfZGVhbGxvY2F0ZShtYWNoX3Rhc2tfc2VsZigpLCBjbG9ja1NlcnYpOworCisgICAgcmV0dXJuIG10cy50dl9zZWMgKiAxMDAwMDAwbGwgKyBtdHMudHZfbnNlYyAvIDEwMDA7CisjZW5kaWYKKyAgICB9Cit9OworCisvLyBUaGlzIGlzLCBtYXliZSwgdGhlIG9ubHkgc3RhdGljIHZhcmlhYmxlIHRoYXQgbWF5IG5vdCBiZSBhIExhenlJbnN0YW5jZToKKy8vIGl0IGhvbGRzIHRoZSBhY3R1YWwgdGltZXN0YW1wIGF0IHN0YXJ0dXAsIGFuZCBoYXMgdG8gYmUgaW5pdGlhbGl6ZWQgYXMKKy8vIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIGxhdW5jaC4KK3N0YXRpYyBjb25zdCBUaWNrQ291bnRJbXBsIGtUaWNrQ291bnQ7CisKK30gIC8vIG5hbWVzcGFjZQorCisjaWZkZWYgX1dJTjMyCisvLyBDaGVjayBpZiB3ZSdyZSBjdXJyZW50bHkgcnVubmluZyB1bmRlciBXaW5lCitzdGF0aWMgYm9vbCBpc1J1bm5pbmdVbmRlcldpbmUoKSB7CisgICAgLy8gdGhpcyBpcyB0aGUgb25seSBnb29kIHdheSBvZiBkZXRlY3RpbmcgV2luZTogaXQgZXhwb3J0cyBhIGZ1bmN0aW9uCisgICAgLy8gJ3dpbmVfZ2V0X3ZlcnNpb24oKScgZnJvbSBpdHMgbnRkbGwuZGxsCisgICAgLy8gTm90ZTogdGhlIHR5cGVkZWYgYW5kIGNhc3RpbmcgaGVyZSBhcmUgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXM6CisgICAgLy8gIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgYWN0dWFsIFdpbmUgdmVyc2lvbiwgeW91IGp1c3QgYWxyZWFkeSBrbm93IHRoZQorICAgIC8vICB0eXBlLCBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIGFyZ3VtZW50cy4KKyAgICB1c2luZyB3aW5lR2V0VmVyc2lvbkZ1bmMgPSBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKChjZGVjbCkpICgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNhbGwgRnJlZUxpYnJhcnkoKSBmb3IgdGhpcyBoYW5kbGUgYXMKKyAgICAvLyBHZXRNb2R1bGVIYW5kbGUoKSBkb2Vzbid0IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50CisgICAgY29uc3QgSE1PRFVMRSBudERsbCA9IDo6R2V0TW9kdWxlSGFuZGxlVyhMIm50ZGxsLmRsbCIpOworICAgIGlmICghbnREbGwpIHsKKyAgICAgICAgLy8gc29tZSBzdHJhbmdlIHZlcnNpb24gb2YgV2luZG93cywgZGVmaW5pdGVseSBub3QgV2luZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGNvbnN0IGF1dG8gd2luZUdldFZlcnNpb24gPSByZWludGVycHJldF9jYXN0PHdpbmVHZXRWZXJzaW9uRnVuYyo+KAorICAgICAgICAgICAgICAgIDo6R2V0UHJvY0FkZHJlc3MobnREbGwsICJ3aW5lX2dldF92ZXJzaW9uIikpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGV4dHJhY3RGdWxsUGF0aChzdGQ6OnN0cmluZyogY21kKSB7CisgICAgaWYgKFBhdGhVdGlsczo6aXNBYnNvbHV0ZSgqY21kKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0cnkgc2VhcmNoaW5nICVQQVRIJSBhbmQgY3VycmVudCBkaXJlY3RvcnkgZm9yIHRoZSBiaW5hcnkKKyAgICAgICAgY29uc3QgV2luMzJVbmljb2RlU3RyaW5nIG5hbWUoKmNtZCk7CisgICAgICAgIGNvbnN0IFdpbjMyVW5pY29kZVN0cmluZyBleHRlbnNpb24oUGF0aFV0aWxzOjprRXhlTmFtZVN1ZmZpeCk7CisgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyBidWZmZXIoTUFYX1BBVEgpOworCisgICAgICAgIERXT1JEIHNpemUgPSA6OlNlYXJjaFBhdGhXKG51bGxwdHIsIG5hbWUuY19zdHIoKSwgZXh0ZW5zaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zaXplKCkgKyAxLCBidWZmZXIuZGF0YSgpLCBudWxscHRyKTsKKyAgICAgICAgaWYgKHNpemUgPiBidWZmZXIuc2l6ZSgpKSB7CisgICAgICAgICAgICAvLyBmdW5jdGlvbiBtYXkgYXNrIGZvciBtb3JlIHNwYWNlCisgICAgICAgICAgICBidWZmZXIucmVzaXplKHNpemUpOworICAgICAgICAgICAgc2l6ZSA9IDo6U2VhcmNoUGF0aFcobnVsbHB0ciwgbmFtZS5jX3N0cigpLCBleHRlbnNpb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5zaXplKCkgKyAxLCBidWZmZXIuZGF0YSgpLCBudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIG1hdGNoaW5nIHRoZSBwYXNzZWQgbmFtZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIuc2l6ZSgpICE9IHNpemUpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNpemUoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgKmNtZCA9IGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEhvc3RTeXN0ZW0gOiBwdWJsaWMgU3lzdGVtIHsKK3B1YmxpYzoKKyAgICBIb3N0U3lzdGVtKCkgOiBtUHJvZ3JhbURpcigpLCBtSG9tZURpcigpLCBtQXBwRGF0YURpcigpIHt9CisKKyAgICB2aXJ0dWFsIH5Ib3N0U3lzdGVtKCkge30KKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFByb2dyYW1EaXJlY3RvcnkoKSBjb25zdCB7CisgICAgICAgIGlmIChtUHJvZ3JhbURpci5lbXB0eSgpKSB7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgICAgICAgICBjaGFyIHBhdGhbMTAyNF07CisgICAgICAgICAgICBtZW1zZXQocGF0aCwgMCwgc2l6ZW9mKHBhdGgpKTsgIC8vIGhhcHB5IHZhbGdyaW5kIQorICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIHBhdGgsIHNpemVvZihwYXRoKSk7CisgICAgICAgICAgICBpZiAobGVuID4gMCAmJiBsZW4gPCAoaW50KXNpemVvZihwYXRoKSkgeworICAgICAgICAgICAgICAgIGNoYXIqIHggPSA6OnN0cnJjaHIocGF0aCwgJy8nKTsKKyAgICAgICAgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgICAgICAgICAqeCA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmFtRGlyLmFzc2lnbihwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIgcHNuOworICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoJnBzbik7CisgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgZGljdCA9CisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NJbmZvcm1hdGlvbkNvcHlEaWN0aW9uYXJ5KCZwc24sIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgdmFsdWUgPSAoQ0ZTdHJpbmdSZWYpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgIGRpY3QsIENGU1RSKCJDRkJ1bmRsZUV4ZWN1dGFibGUiKSk7CisgICAgICAgICAgICBjaGFyIHNbUEFUSF9NQVhdOworICAgICAgICAgICAgQ0ZTdHJpbmdHZXRDU3RyaW5nKHZhbHVlLCBzLCBQQVRIX01BWCAtIDEsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgICAgICAgICAgICBjaGFyKiB4ID0gOjpzdHJyY2hyKHMsICcvJyk7CisgICAgICAgICAgICBpZiAoeCkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgYWxsIHNsYXNoZXMgLSB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lCisgICAgICAgICAgICAgICAgd2hpbGUgKHggPiBzICYmIHhbLTFdID09ICcvJykgeworICAgICAgICAgICAgICAgICAgICAtLXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp4ID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbURpci5hc3NpZ24ocyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9ncmFtRGlyLmFzc2lnbigiPHVua25vd24tYXBwbGljYXRpb24tZGlyPiIpOworICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgYXBwRGlyKFBBVEhfTUFYKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZVcoMCwgYXBwRGlyLmRhdGEoKSwgYXBwRGlyLnNpemUoKSk7CisgICAgICAgICAgICBtUHJvZ3JhbURpci5hc3NpZ24oIjx1bmtub3duLWFwcGxpY2F0aW9uLWRpcj4iKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IChpbnQpYXBwRGlyLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBhcHBEaXIucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4obGVuKSk7CisgICAgICAgICAgICAgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lVygwLCBhcHBEaXIuZGF0YSgpLCBhcHBEaXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGlyID0gYXBwRGlyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgY2hhciogc2VwID0gOjpzdHJyY2hyKCZkaXJbMF0sICdcXCcpOworICAgICAgICAgICAgICAgIGlmIChzZXApIHsKKyAgICAgICAgICAgICAgICAgICAgKnNlcCA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmFtRGlyLmFzc2lnbihkaXIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgcGxhdGZvcm0hIgorI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1Qcm9ncmFtRGlyOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudERpcmVjdG9yeSgpIGNvbnN0IHsKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAgICAgaW50IGN1cnJlbnRMZW4gPSBHZXRDdXJyZW50RGlyZWN0b3J5VygwLCBudWxscHRyKTsKKyAgICAgICAgaWYgKGN1cnJlbnRMZW4gPCAwKSB7CisgICAgICAgICAgICAvLyBDb3VsZCBub3QgZ2V0IHNpemUgb2Ygd29ya2luZyBkaXJlY3RvcnkuIFNvbWV0aGluZyBpcyByZWFsbHkKKyAgICAgICAgICAgIC8vIGZpc2h5IGhlcmUsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICB3Y2hhcl90KiBjdXJyZW50RGlyID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90Kj4oY2FsbG9jKGN1cnJlbnRMZW4gKyAxLCBzaXplb2Yod2NoYXJfdCkpKTsKKyAgICAgICAgaWYgKCFHZXRDdXJyZW50RGlyZWN0b3J5VyhjdXJyZW50TGVuICsgMSwgY3VycmVudERpcikpIHsKKyAgICAgICAgICAgIC8vIEFnYWluLCBzb21lIHVuZXhwZWN0ZWQgcHJvYmxlbS4gQ2FuJ3QgZG8gbXVjaCBoZXJlLgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgc3RyaW5nIGVtcHR5LgorICAgICAgICAgICAgY3VycmVudERpclswXSA9IEwnMCc7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgoY3VycmVudERpcik7CisgICAgICAgIDo6ZnJlZShjdXJyZW50RGlyKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyNlbHNlICAgLy8gIV9XSU4zMgorICAgICAgICBjaGFyIGN1cnJlbnREaXJbUEFUSF9NQVhdOworICAgICAgICBpZiAoIWdldGN3ZChjdXJyZW50RGlyLCBzaXplb2YoY3VycmVudERpcikpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoY3VycmVudERpcik7CisjZW5kaWYgIC8vICFfV0lOMzIKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRMYXVuY2hlckRpcmVjdG9yeSgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1MYXVuY2hlckRpci5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYXVuY2hlckRpckVudiA9IGVudkdldCgiQU5EUk9JRF9FTVVMQVRPUl9MQVVOQ0hFUl9ESVIiKTsKKyAgICAgICAgICAgIGlmICghbGF1bmNoZXJEaXJFbnYuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1MYXVuY2hlckRpciA9IGxhdW5jaGVyRGlyRW52OworICAgICAgICAgICAgICAgIHJldHVybiBtTGF1bmNoZXJEaXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcm9ncmFtRGlyID0gZ2V0UHJvZ3JhbURpcmVjdG9yeSgpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsYXVuY2hlck5hbWUoImVtdWxhdG9yIik7CisjaWZkZWYgX1dJTjMyCisgICAgICAgICAgICBsYXVuY2hlck5hbWUgKz0gIi5leGUiOworI2VuZGlmCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aExpc3QgPSB7cHJvZ3JhbURpciwgbGF1bmNoZXJOYW1lfTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxhdW5jaGVyUGF0aCA9IFBhdGhVdGlsczo6cmVjb21wb3NlKHBhdGhMaXN0KTsKKworICAgICAgICAgICAgaWYgKHBhdGhJc0ZpbGUobGF1bmNoZXJQYXRoKSkgeworICAgICAgICAgICAgICAgIG1MYXVuY2hlckRpciA9IHByb2dyYW1EaXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1MYXVuY2hlckRpcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd2UgYXJlIHByb2JhYmx5IGV4ZWN1dGluZyBhIHFlbXUyIGJpbmFyeSwgd2hpY2ggbGl2ZSBpbgorICAgICAgICAgICAgLy8gPGxhdW5jaGVyLWRpcj4vcWVtdS88b3M+LTxhcmNoPi8KKyAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBsYXVuY2hlciBpbiBncmFuZHBhcmVudCBkaXJlY3RvcnkKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwcm9ncmFtRGlyVmVjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpkZWNvbXBvc2UocHJvZ3JhbURpcik7CisgICAgICAgICAgICBpZiAocHJvZ3JhbURpclZlY3Rvci5zaXplKCkgPj0gMikgeworICAgICAgICAgICAgICAgIHByb2dyYW1EaXJWZWN0b3IucmVzaXplKHByb2dyYW1EaXJWZWN0b3Iuc2l6ZSgpIC0gMik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ3JhbmRwYXJlbnREaXIgPSBQYXRoVXRpbHM6OnJlY29tcG9zZShwcm9ncmFtRGlyVmVjdG9yKTsKKyAgICAgICAgICAgICAgICBwcm9ncmFtRGlyVmVjdG9yLnB1c2hfYmFjayhsYXVuY2hlck5hbWUpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxhdW5jaGVyUGF0aCA9IFBhdGhVdGlsczo6cmVjb21wb3NlKHByb2dyYW1EaXJWZWN0b3IpOworICAgICAgICAgICAgICAgIGlmIChwYXRoSXNGaWxlKGxhdW5jaGVyUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUxhdW5jaGVyRGlyID0gZ3JhbmRwYXJlbnREaXI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtTGF1bmNoZXJEaXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtTGF1bmNoZXJEaXIuYXNzaWduKCI8dW5rbm93bi1sYXVuY2hlci1kaXI+Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1MYXVuY2hlckRpcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRIb21lRGlyZWN0b3J5KCkgY29uc3QgeworICAgICAgICBpZiAobUhvbWVEaXIuZW1wdHkoKSkgeworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICAgICAgLy8gTk9URTogU0hHZXRGb2xkZXJQYXRoVyBhbHdheXMgdGFrZXMgYSBidWZmZXIgb2YgTUFYX1BBVEggc2l6ZSwKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHVzZSBhIFdpbjMyVW5pY29kZVN0cmluZyBoZXJlIHRvIGF2b2lkIHVuLW5lY2Vzc2FyeQorICAgICAgICAgICAgLy8gZHluYW1pYyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgd2NoYXJfdCBwYXRoW01BWF9QQVRIXSA9IHswfTsKKyAgICAgICAgICAgIC8vIFF1ZXJ5IFdpbmRvd3Mgc2hlbGwgZm9yIGtub3duIGZvbGRlciBwYXRocy4KKyAgICAgICAgICAgIC8vIFNIR2V0Rm9sZGVyUGF0aCBhY3RzIGFzIGEgd3JhcHBlciB0byBLbm93bkZvbGRlcnM7CisgICAgICAgICAgICAvLyB0aGlzIGlzIHByZWZlcnJlZCBmb3Igc2ltcGxpY2l0eSBhbmQgWFAgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgIGlmIChTVUNDRUVERUQoCisgICAgICAgICAgICAgICAgICAgICAgICBTSEdldEZvbGRlclBhdGhXKE5VTEwsIENTSURMX1BST0ZJTEUsIE5VTEwsIDAsIHBhdGgpKSkgeworICAgICAgICAgICAgICAgIG1Ib21lRGlyID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byB3aW5kb3dzLWVxdWl2YWxlbnQgb2YgSE9NRSBlbnYgdmFyCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaG9tZWRyaXZlID0gZW52R2V0KCJIT01FRFJJVkUiKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob21lcGF0aCA9IGVudkdldCgiSE9NRVBBVEgiKTsKKyAgICAgICAgICAgICAgICBpZiAoIWhvbWVkcml2ZS5lbXB0eSgpICYmICFob21lcGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ib21lRGlyLmFzc2lnbihob21lZHJpdmUpOworICAgICAgICAgICAgICAgICAgICBtSG9tZURpci5hcHBlbmQoaG9tZXBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoX19saW51eF9fKSB8fCAoX19BUFBMRV9fKQorICAgICAgICAgICAgLy8gVHJ5IGdldHRpbmcgSE9NRSBmcm9tIGVudiBmaXJzdAorICAgICAgICAgICAgY29uc3QgY2hhciogaG9tZSA9IGdldGVudigiSE9NRSIpOworICAgICAgICAgICAgaWYgKGhvbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1Ib21lRGlyLmFzc2lnbihob21lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgZW52IEhPTUUgYXBwZWFycyBlbXB0eSBmb3Igc29tZSByZWFzb24sCisgICAgICAgICAgICAgICAgLy8gdHJ5IGdldHRpbmcgSE9NRSBieSBxdWVyeWluZyBzeXN0ZW0gcGFzc3dvcmQgZGF0YWJhc2UKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHcgIT0gTlVMTCAmJiBwdy0+cHdfZGlyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhvbWVEaXIuYXNzaWduKHB3LT5wd19kaXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIHBsYXRmb3JtISIKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBtSG9tZURpcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRBcHBEYXRhRGlyZWN0b3J5KCkgY29uc3QgeworI2lmIGRlZmluZWQoX1dJTjMyKQorICAgICAgICBpZiAobUFwcERhdGFEaXIuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gTk9URTogU2VlIGNvbW1lbnQgaW4gZ2V0SG9tZURpcmVjdG9yeSgpLgorICAgICAgICAgICAgd2NoYXJfdCBwYXRoW01BWF9QQVRIXSA9IHswfTsKKyAgICAgICAgICAgIGlmIChTVUNDRUVERUQoCisgICAgICAgICAgICAgICAgICAgICAgICBTSEdldEZvbGRlclBhdGhXKE5VTEwsIENTSURMX0FQUERBVEEsIE5VTEwsIDAsIHBhdGgpKSkgeworICAgICAgICAgICAgICAgIG1BcHBEYXRhRGlyID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBhcHBkYXRhID0gX3dnZXRlbnYoTCJBUFBEQVRBIik7CisgICAgICAgICAgICAgICAgaWYoYXBwZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1BcHBEYXRhRGlyID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KGFwcGRhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZCAoX19BUFBMRV9fKQorICAgICAgICBpZiAobUFwcERhdGFEaXIuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlIGVxdWl2YWxlbnQgb2YgQXBwRGF0YSBkaXJlY3RvcnkgaW4gTWFjT1MgWCBpcworICAgICAgICAgICAgLy8gdW5kZXIgfi9MaWJyYXJ5L1ByZWZlcmVuY2VzLiBBcHBsZSBkb2VzIG5vdCBvZmZlcgorICAgICAgICAgICAgLy8gYSBDL0MrKyBBUEkgdG8gcXVlcnkgdGhpcyBsb2NhdGlvbiAoaW4gT2JqQyBjb2NvYQorICAgICAgICAgICAgLy8gYXBwbGljYXRpb25zIE5TU2VhcmNoUGF0aEZvckRpcmVjdG9yaWVzSW5Eb21haW5zCisgICAgICAgICAgICAvLyBjYW4gYmUgdXNlZCksIHNvIHdlIGFwcGx5IHRoZSBjb21tb24gcHJhY3RpY2Ugb2YKKyAgICAgICAgICAgIC8vIGhhcmQgY29kaW5nIGl0CisgICAgICAgICAgICBtQXBwRGF0YURpci5hc3NpZ24oZ2V0SG9tZURpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgIG1BcHBEYXRhRGlyLmFwcGVuZCgiL0xpYnJhcnkvUHJlZmVyZW5jZXMiKTsKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgICAgIDsgLy8gbm90IGFwcGxpY2FibGUKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIHBsYXRmb3JtISIKKyNlbmRpZgorICAgICAgICByZXR1cm4gbUFwcERhdGFEaXI7CisgICAgfQorCisKKyAgICB2aXJ0dWFsIGludCBnZXRIb3N0Qml0bmVzcygpIGNvbnN0IHsKKyNpZmRlZiBfV0lOMzIKKworICAgICAgICAvLyBSZXRyaWV2ZXMgdGhlIHBhdGggb2YgdGhlIFdPVzY0IHN5c3RlbSBkaXJlY3RvcnksIHdoaWNoIGRvZXNuJ3QKKyAgICAgICAgLy8gZXhpc3Qgb24gMzItYml0IHN5c3RlbXMuCisgICAgICAgIC8vIE5COiB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGUgZGlyZWN0b3J5LCB3ZSBqdXN0IHdhbnQgdG8gc2VlIGlmCisgICAgICAgIC8vICAgICBXaW5kb3dzIGhhcyBpdCAtIHNvIGxldCdzIG5vdCBldmVuIHRyeSB0byBwYXNzIGEgYnVmZmVyIHRoYXQKKyAgICAgICAgLy8gICAgIGlzIGxvbmcgZW5vdWdoOyByZXR1cm4gdmFsdWUgaXMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBsZW5ndGguCisgICAgICAgIHN0ZDo6YXJyYXk8d2NoYXJfdCwgMT4gZGlyZWN0b3J5OworICAgICAgICBjb25zdCB1bnNpZ25lZCBsZW4gPSBHZXRTeXN0ZW1Xb3c2NERpcmVjdG9yeVcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGRpcmVjdG9yeS5zaXplKCkpKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gNjQ7CisgICAgICAgIH0KKworI2Vsc2UgLy8gIV9XSU4zMgorICAgIC8qCisgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyA2NCBpZiBob3N0IGlzIHJ1bm5pbmcgNjQtYml0IE9TLCBvciAzMiBvdGhlcndpc2UuCisKKyAgICAgICAgSXQgdXNlcyB0aGUgc2FtZSB0ZWNobmlxdWUgaW4gbmRrL2J1aWxkL2NvcmUvbmRrLWNvbW1vbi5zaC4KKyAgICAgICAgSGVyZSBhcmUgY29tbWVudHMgZnJvbSB0aGVyZToKKworICAgICAgICAjIyBPbiBMaW51eCBvciBEYXJ3aW4sIGEgNjQtYml0IGtlcm5lbCAoKikgZG9lc24ndCBtZWFuIHRoYXQgdGhlCisgICAgICAgICMjIHVzZXItbGFuZCBpcyBhbHdheXMgMzItYml0LCBzbyB1c2UgImZpbGUiIHRvIGRldGVybWluZSB0aGUgYml0bmVzcworICAgICAgICAjIyBvZiB0aGUgc2hlbGwgdGhhdCBpbnZva2VkIHVzLiBUaGUgLUwgb3B0aW9uIGlzIHVzZWQgdG8gZGUtcmVmZXJlbmNlCisgICAgICAgICMjIHN5bWxpbmtzLgorICAgICAgICAjIworICAgICAgICAjIyBOb3RlIHRoYXQgb24gRGFyd2luLCBhIHNpbmdsZSBleGVjdXRhYmxlIGNhbiBjb250YWluIGJvdGggeDg2IGFuZAorICAgICAgICAjIyB4ODZfNjQgbWFjaGluZSBjb2RlLCBzbyBqdXN0IGxvb2sgZm9yIHg4Nl82NCAoZGFyd2luKSBvciB4ODYtNjQKKyAgICAgICAgIyMgKExpbnV4KSBpbiB0aGUgb3V0cHV0LgorCisgICAgICAgICgqKSBpZS4gVGhlIGZvbGxvd2luZyBjb2RlIGRvZXNuJ3QgYWx3YXlzIHdvcms6CisgICAgICAgICAgICBzdHJ1Y3QgdXRzbmFtZSB1OworICAgICAgICAgICAgaW50IGhvc3RfcnVuc182NGJpdF9PUyA9ICh1bmFtZSgmdSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCh1Lm1hY2hpbmUsICJ4ODZfNjQiKSA9PSAwKTsKKyAgICAqLworICAgICAgICBpZiAoc3lzdGVtKCJmaWxlIC1MIFwiJFNIRUxMXCIgfCBncmVwIC1xIFwieDg2W18tXTY0XCIiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDY0OworICAgICAgICB9IGVsc2UgaWYgKHN5c3RlbSgiZmlsZSAtTCBcIiRTSEVMTFwiID4gL2Rldi9udWxsIikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogQ2Fubm90IGRlY2lkZSBob3N0IGJpdG5lc3MgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgICIkU0hFTEwgaXMgbm90IHByb3Blcmx5IGRlZmluZWQ7IDMyIGJpdHMgYXNzdW1lZC5cbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAzMjsKKworI2VuZGlmIC8vICFfV0lOMzIKKyAgICB9CisKKyAgICB2aXJ0dWFsIE9zVHlwZSBnZXRPc1R5cGUoKSBjb25zdCBvdmVycmlkZSB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIHJldHVybiBPc1R5cGU6OldpbmRvd3M7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAgICAgcmV0dXJuIE9zVHlwZTo6TWFjOworI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgICAgIHJldHVybiBPc1R5cGU6OkxpbnV4OworI2Vsc2UKKyAgICAgICAgI2Vycm9yIGdldE9zVHlwZSgpOiB1bnN1cHBvcnRlZCBPUzsKKyNlbmRpZgorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1J1bm5pbmdVbmRlcldpbmUoKSBjb25zdCBvdmVycmlkZSB7CisjaWZuZGVmIF9XSU4zMgorICAgICAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc1VuZGVyV2luZSA9IGFuZHJvaWQ6OmJhc2U6OmlzUnVubmluZ1VuZGVyV2luZSgpOworICAgICAgICByZXR1cm4gaXNVbmRlcldpbmU7CisjZW5kaWYKKyAgICB9CisKKyAgICBTeXN0ZW06OlBpZCBnZXRDdXJyZW50UHJvY2Vzc0lkKCkgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIHJldHVybiA6OkdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKyNlbHNlCisgICAgICAgIHJldHVybiBnZXRwaWQoKTsKKyNlbmRpZgorICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNjYW5EaXJFbnRyaWVzKAorICAgICAgICAgICAgU3RyaW5nVmlldyBkaXJQYXRoLAorICAgICAgICAgICAgYm9vbCBmdWxsUGF0aCA9IGZhbHNlKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN1bHQgPSBzY2FuRGlySW50ZXJuYWwoZGlyUGF0aCk7CisgICAgICAgIGlmIChmdWxsUGF0aCkgeworICAgICAgICAgICAgLy8gUHJlLXBlbmQgfGRpclBhdGh8IHRvIGVhY2ggZW50cnkuCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBQYXRoVXRpbHM6OmFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKGRpclBhdGgpOworICAgICAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCByZXN1bHQuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gcHJlZml4OworICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKHJlc3VsdFtuXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0W25dID0gcGF0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZW52R2V0KFN0cmluZ1ZpZXcgdmFybmFtZSkgY29uc3QgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgdmFybmFtZV91bmljb2RlKHZhcm5hbWUpOworICAgICAgICBjb25zdCB3Y2hhcl90KiB2YWx1ZSA9IF93Z2V0ZW52KHZhcm5hbWVfdW5pY29kZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KHZhbHVlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgY29uc3QgY2hhciogdmFsdWUgPSBnZXRlbnYodmFybmFtZS5jX3N0cigpKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcodmFsdWUpOworI2VuZGlmCisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGVudlNldChTdHJpbmdWaWV3IHZhcm5hbWUsIFN0cmluZ1ZpZXcgdmFydmFsdWUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgc3RkOjpzdHJpbmcgZW52U3RyID0KKyAgICAgICAgICAgICAgICBTdHJpbmdGb3JtYXQoIiVzPSVzIiwgdmFybmFtZSwgdmFydmFsdWUpOworICAgICAgICAvLyBOb3RlOiB0aGlzIGxlYWtzIHRoZSByZXN1bHQgb2YgcmVsZWFzZSgpLgorICAgICAgICBfd3B1dGVudihXaW4zMlVuaWNvZGVTdHJpbmcoZW52U3RyKS5yZWxlYXNlKCkpOworI2Vsc2UKKyAgICAgICAgaWYgKHZhcnZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHVuc2V0ZW52KHZhcm5hbWUuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRlbnYodmFybmFtZS5jX3N0cigpLCB2YXJ2YWx1ZS5jX3N0cigpLCAxKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgdmlydHVhbCBib29sIGVudlRlc3QoU3RyaW5nVmlldyB2YXJuYW1lKSBjb25zdCB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyB2YXJuYW1lX3VuaWNvZGUodmFybmFtZSk7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIHZhbHVlID0gX3dnZXRlbnYodmFybmFtZV91bmljb2RlLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWVbMF0gIT0gTCdcMCc7CisjZWxzZQorICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSA9IGdldGVudih2YXJuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gdmFsdWUgJiYgdmFsdWVbMF0gIT0gJ1wwJzsKKyNlbmRpZgorICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVudkdldEFsbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICAgICAgZm9yIChhdXRvIGVudiA9IGVudmlyb247IGVudiAmJiAqZW52OyArK2VudikgeworICAgICAgICAgICAgcmVzLnB1c2hfYmFjaygqZW52KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1JlbW90ZVNlc3Npb24oc3RkOjpzdHJpbmcqIHNlc3Npb25UeXBlKSBjb25zdCB7CisgICAgICAgIGlmIChlbnZUZXN0KCJOWF9URU1QIikpIHsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uVHlwZSkgeworICAgICAgICAgICAgICAgICpzZXNzaW9uVHlwZSA9ICJOWCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW52VGVzdCgiQ0hST01FX1JFTU9URV9ERVNLVE9QX1NFU1NJT04iKSkgeworICAgICAgICAgICAgaWYgKHNlc3Npb25UeXBlKSB7CisgICAgICAgICAgICAgICAgKnNlc3Npb25UeXBlID0gIkNocm9tZSBSZW1vdGUgRGVza3RvcCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorI2lmZGVmIF9XSU4zMgorICAgICAgICBpZiAoR2V0U3lzdGVtTWV0cmljcyhTTV9SRU1PVEVTRVNTSU9OKSkgeworICAgICAgICAgICAgaWYgKHNlc3Npb25UeXBlKSB7CisgICAgICAgICAgICAgICAgKnNlc3Npb25UeXBlID0gIldpbmRvd3MgUmVtb3RlIERlc2t0b3AiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyNlbmRpZiAgLy8gX1dJTjMyCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aEV4aXN0cyhTdHJpbmdWaWV3IHBhdGgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHBhdGhFeGlzdHNJbnRlcm5hbChwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aElzRmlsZShTdHJpbmdWaWV3IHBhdGgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHBhdGhJc0ZpbGVJbnRlcm5hbChwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aElzRGlyKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3QgeworICAgICAgICByZXR1cm4gcGF0aElzRGlySW50ZXJuYWwocGF0aCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHBhdGhDYW5SZWFkKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gcGF0aENhblJlYWRJbnRlcm5hbChwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENhbldyaXRlKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gcGF0aENhbldyaXRlSW50ZXJuYWwocGF0aCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHBhdGhDYW5FeGVjKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gcGF0aENhbkV4ZWNJbnRlcm5hbChwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZGVsZXRlRmlsZShTdHJpbmdWaWV3IHBhdGgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZUZpbGVJbnRlcm5hbChwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aEZpbGVTaXplKFN0cmluZ1ZpZXcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVTaXplKiBvdXRGaWxlU2l6ZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gcGF0aEZpbGVTaXplSW50ZXJuYWwocGF0aCwgb3V0RmlsZVNpemUpOworICAgIH0KKworICAgIFRpbWVzIGdldFByb2Nlc3NUaW1lcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgVGltZXMgcmVzID0ge307CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgRklMRVRJTUUgY3JlYXRpb25UaW1lID0ge307CisgICAgICAgIEZJTEVUSU1FIGV4aXRUaW1lID0ge307CisgICAgICAgIEZJTEVUSU1FIGtlcm5lbFRpbWUgPSB7fTsKKyAgICAgICAgRklMRVRJTUUgdXNlclRpbWUgPSB7fTsKKyAgICAgICAgOjpHZXRQcm9jZXNzVGltZXMoOjpHZXRDdXJyZW50UHJvY2VzcygpLCAmY3JlYXRpb25UaW1lLCAmZXhpdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXJuZWxUaW1lLCAmdXNlclRpbWUpOworCisgICAgICAgIC8vIGNvbnZlcnQgMTAwLW5zIGludGVydmFscyBmcm9tIGEgc3RydWN0IHRvIGludDY0X3QgbWlsbGlzZWNvbmRzCisgICAgICAgIFVMQVJHRV9JTlRFR0VSIGtlcm5lbEludDY0OworICAgICAgICBrZXJuZWxJbnQ2NC5Mb3dQYXJ0ID0ga2VybmVsVGltZS5kd0xvd0RhdGVUaW1lOworICAgICAgICBrZXJuZWxJbnQ2NC5IaWdoUGFydCA9IGtlcm5lbFRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHJlcy5zeXN0ZW1NcyA9IHN0YXRpY19jYXN0PER1cmF0aW9uPihrZXJuZWxJbnQ2NC5RdWFkUGFydCAvIDEwMDAwKTsKKworICAgICAgICBVTEFSR0VfSU5URUdFUiB1c2VySW50NjQ7CisgICAgICAgIHVzZXJJbnQ2NC5Mb3dQYXJ0ID0gdXNlclRpbWUuZHdMb3dEYXRlVGltZTsKKyAgICAgICAgdXNlckludDY0LkhpZ2hQYXJ0ID0gdXNlclRpbWUuZHdIaWdoRGF0ZVRpbWU7CisgICAgICAgIHJlcy51c2VyTXMgPSBzdGF0aWNfY2FzdDxEdXJhdGlvbj4odXNlckludDY0LlF1YWRQYXJ0IC8gMTAwMDApOworI2Vsc2UKKyAgICAgICAgdG1zIHRpbWVzID0ge307CisgICAgICAgIDo6dGltZXMoJnRpbWVzKTsKKyAgICAgICAgLy8gY29udmVydCB0byBtaWxsaXNlY29uZHMKKyAgICAgICAgY29uc3QgbG9uZyBpbnQgdGlja3NQZXJTZWMgPSA6OnN5c2NvbmYoX1NDX0NMS19UQ0spOworICAgICAgICByZXMuc3lzdGVtTXMgPSAodGltZXMudG1zX3N0aW1lICogMTAwMGxsKSAvIHRpY2tzUGVyU2VjOworICAgICAgICByZXMudXNlck1zID0gKHRpbWVzLnRtc191dGltZSAqIDEwMDBsbCkgLyB0aWNrc1BlclNlYzsKKyNlbmRpZgorICAgICAgICByZXMud2FsbENsb2NrTXMgPQorICAgICAgICAgICAgICAgIChrVGlja0NvdW50LmdldFVzKCkgLSBrVGlja0NvdW50LmdldFN0YXJ0VGltZVVzKCkpIC8gMTAwMDsKKworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHRpbWVfdCBnZXRVbml4VGltZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHRpbWUoTlVMTCk7CisgICAgfQorCisgICAgRHVyYXRpb24gZ2V0VW5peFRpbWVVcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgdGltZXZhbCB0djsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwMDAwTEwgKyB0di50dl91c2VjOworICAgIH0KKworICAgIFdhbGxEdXJhdGlvbiBnZXRIaWdoUmVzVGltZVVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4ga1RpY2tDb3VudC5nZXRVcygpOworICAgIH0KKworICAgIHZvaWQgc2xlZXBNcyh1bnNpZ25lZCBuKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIFRocmVhZDo6c2xlZXBNcyhuKTsKKyAgICB9CisKKyAgICB2b2lkIHlpZWxkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBUaHJlYWQ6OnlpZWxkKCk7CisgICAgfQorCisgICAgYm9vbCBydW5Db21tYW5kKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgICAgIFJ1bk9wdGlvbnMgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpEdXJhdGlvbiB0aW1lb3V0TXMsCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UHJvY2Vzc0V4aXRDb2RlKiBvdXRFeGl0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQaWQqIG91dENoaWxkUGlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0RmlsZSkgb3ZlcnJpZGUgeworICAgICAgICAvLyBTYW5pdHkgY2hlY2suCisgICAgICAgIGlmIChjb21tYW5kTGluZS5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworI2lmZGVmIF9XSU4zMgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tbWFuZExpbmVDb3B5ID0gY29tbWFuZExpbmU7CisgICAgICAgIFNUQVJUVVBJTkZPVyBzdGFydHVwID0ge307CisgICAgICAgIHN0YXJ0dXAuY2IgPSBzaXplb2Yoc3RhcnR1cCk7CisKKyAgICAgICAgaWYgKCFleHRyYWN0RnVsbFBhdGgoJmNvbW1hbmRMaW5lQ29weVswXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OlNob3dPdXRwdXQpID09IDAgfHwKKyAgICAgICAgICAgICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OkR1bXBPdXRwdXRUb0ZpbGUpICE9IDAgJiYKKyAgICAgICAgICAgICAhb3V0cHV0RmlsZS5lbXB0eSgpKSkgeworICAgICAgICAgICAgc3RhcnR1cC5kd0ZsYWdzID0gU1RBUlRGX1VTRVNIT1dXSU5ET1c7CisKKyAgICAgICAgICAgIC8vICdOb3JtYWwnIHdheSBvZiBoaWRpbmcgY29uc29sZSBvdXRwdXQgaXMgcGFzc2luZyBudWxsIHN0ZCBoYW5kbGVzCisgICAgICAgICAgICAvLyB0byB0aGUgQ3JlYXRlUHJvY2VzcygpIGZ1bmN0aW9uIGFuZCBDUkVBVEVfTk9fV0lORE9XIGFzIGEgZmxhZy4KKyAgICAgICAgICAgIC8vIFNhZGx5LCBpbiB0aGlzIGNhc2UgQ3lnd2luIHJ1bnRpbWUgZ29lcyBjb21wbGV0ZWx5IG1hZCAtIGl0cworICAgICAgICAgICAgLy8gd2hvbGUgRklMRSogbWFjaGluZXJ5IGp1c3Qgc3RvcHMgd29ya2luZy4gRS5nLiwgcmVzaXplMmZzIGFsd2F5cworICAgICAgICAgICAgLy8gY3JlYXRlcyBjb3JydXB0ZWQgaW1hZ2VzIGlmIHlvdSB0cnkgZG9pbmcgaXQgaW4gYSAnbm9ybWFsJyB3YXkuCisgICAgICAgICAgICAvLyBTbywgaW5zdGVhZCwgd2UgZG8gdGhlIGZvbGxvd2luZzogcnVuIHRoZSBjb21tYW5kIGluIGEgY21kLmV4ZQorICAgICAgICAgICAgLy8gd2l0aCBzdGRvdXQgYW5kIHN0ZGVyciByZWRpcmVjdGVkIHRvIGVpdGhlciBudWwgKGZvciBubyBvdXRwdXQpCisgICAgICAgICAgICAvLyBvciB0aGUgc3BlY2lmaWVkIGZpbGUgKGZvciBmaWxlIG91dHB1dCkuCisKKyAgICAgICAgICAgIC8vIDEuIEZpbmQgdGhlIGNvbW1tYW5kLWxpbmUgaW50ZXJwcmV0ZXIgLSB3aGljaCBoaWRlcyBiZWhpbmQgdGhlCisgICAgICAgICAgICAvLyAlQ09NU1BFQyUgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXNwZWMgPSBlbnZHZXQoIkNPTVNQRUMiKTsKKyAgICAgICAgICAgIGlmIChjb21zcGVjLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb21zcGVjID0gImNtZC5leGUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWV4dHJhY3RGdWxsUGF0aCgmY29tc3BlYykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIDIuIE5vdyB0dXJuIHRoZSBjb21tYW5kIGludG8gdGhlIHByb3BlciBjbWQgY29tbWFuZDoKKyAgICAgICAgICAgIC8vICAgY21kLmV4ZSAvQyAiY29tbWFuZCIgImFyZ3VtZW50cyIgLi4uID5udWwgMj4mMQorICAgICAgICAgICAgLy8gVGhpcyBleGVjdXRlcyBhIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMgcGFzc2VkIGFuZCByZWRpcmVjdHMKKyAgICAgICAgICAgIC8vIHN0ZG91dCB0byBudWwsIHN0ZGVyciBpcyBhdHRhY2hlZCB0byBzdGRvdXQgKHNvIGl0IGFsc28KKyAgICAgICAgICAgIC8vIGdvZXMgdG8gbnVsKQorICAgICAgICAgICAgY29tbWFuZExpbmVDb3B5Lmluc2VydChjb21tYW5kTGluZUNvcHkuYmVnaW4oKSwgIi9DIik7CisgICAgICAgICAgICBjb21tYW5kTGluZUNvcHkuaW5zZXJ0KGNvbW1hbmRMaW5lQ29weS5iZWdpbigpLCBjb21zcGVjKTsKKworICAgICAgICAgICAgaWYgKChvcHRpb25zICYgUnVuT3B0aW9uczo6RHVtcE91dHB1dFRvRmlsZSkgIT0gUnVuT3B0aW9uczo6RW1wdHkpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZUNvcHkucHVzaF9iYWNrKCI+Iik7CisgICAgICAgICAgICAgICAgY29tbWFuZExpbmVDb3B5LnB1c2hfYmFjayhvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZUNvcHkucHVzaF9iYWNrKCIyPiYxIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChvcHRpb25zICYgUnVuT3B0aW9uczo6U2hvd091dHB1dCkgPT0gUnVuT3B0aW9uczo6RW1wdHkpIHsKKyAgICAgICAgICAgICAgICBjb21tYW5kTGluZUNvcHkucHVzaF9iYWNrKCI+bnVsIik7CisgICAgICAgICAgICAgICAgY29tbWFuZExpbmVDb3B5LnB1c2hfYmFjaygiMj4mMSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaW5mbyA9IHt9OworCisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ3MgPSBjb21tYW5kTGluZUNvcHlbMF07CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgY29tbWFuZExpbmVDb3B5LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBhcmdzICs9ICcgJzsKKyAgICAgICAgICAgIGFyZ3MgKz0gYW5kcm9pZDo6YmFzZTo6V2luMzJVdGlsczo6cXVvdGVDb21tYW5kTGluZShjb21tYW5kTGluZUNvcHlbaV0pOworICAgICAgICB9CisKKyAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIGNvbW1hbmRVbmljb2RlKGNvbW1hbmRMaW5lQ29weVswXSk7CisgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyBhcmdzVW5pY29kZShhcmdzKTsKKworICAgICAgICBpZiAoITo6Q3JlYXRlUHJvY2Vzc1coY29tbWFuZFVuaWNvZGUuY19zdHIoKSwgLy8gcHJvZ3JhbSBwYXRoCisgICAgICAgICAgICAgICAgYXJnc1VuaWNvZGUuZGF0YSgpLCAvLyBjb21tYW5kIGxpbmUgYXJncywgaGFzIHRvIGJlIHdyaXRhYmxlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAvLyBwcm9jZXNzIGhhbmRsZSBpcyBub3QgaW5oZXJpdGFibGUKKyAgICAgICAgICAgICAgICBudWxscHRyLCAgICAgICAgICAgIC8vIHRocmVhZCBoYW5kbGUgaXMgbm90IGluaGVyaXRhYmxlCisgICAgICAgICAgICAgICAgRkFMU0UsICAgICAgICAgICAgICAvLyBubywgZG9uJ3QgaW5oZXJpdCBhbnkgaGFuZGxlcworICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBjcmVhdGlvbiBmbGFncworICAgICAgICAgICAgICAgIG51bGxwdHIsICAgICAgICAgICAgLy8gdXNlIHBhcmVudCdzIGVudmlyb25tZW50IGJsb2NrCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgICAvLyB1c2UgcGFyZW50J3Mgc3RhcnRpbmcgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgJnN0YXJ0dXAsICAgICAgICAgICAvLyBzdGFydHVwIGluZm8sIGkuZS4gc3RkIGhhbmRsZXMKKyAgICAgICAgICAgICAgICAmcGluZm8pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBDbG9zZUhhbmRsZShwaW5mby5oVGhyZWFkKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNsb3NlIHRoZSBwcm9jZXNzIGhhbmRsZSBvbiBleGl0CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OldpbjMyVXRpbHM6OlNjb3BlZEhhbmRsZSBwcm9jZXNzKHBpbmZvLmhQcm9jZXNzKTsKKworICAgICAgICBpZiAob3V0Q2hpbGRQaWQpIHsKKyAgICAgICAgICAgICpvdXRDaGlsZFBpZCA9IHBpbmZvLmR3UHJvY2Vzc0lkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvcHRpb25zICYgUnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24pID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gY29tcGxldGUuCisgICAgICAgIERXT1JEIHJldCA9IDo6V2FpdEZvclNpbmdsZU9iamVjdChwaW5mby5oUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRNcyA/IHRpbWVvdXRNcyA6IElORklOSVRFKTsKKyAgICAgICAgaWYgKHJldCA9PSBXQUlUX0ZBSUxFRCB8fCByZXQgPT0gV0FJVF9USU1FT1VUKSB7CisgICAgICAgICAgICBpZiAoKG9wdGlvbnMgJiBSdW5PcHRpb25zOjpUZXJtaW5hdGVPblRpbWVvdXQpICE9IDApIHsKKyAgICAgICAgICAgICAgICA6OlRlcm1pbmF0ZVByb2Nlc3MocGluZm8uaFByb2Nlc3MsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgRFdPUkQgZXhpdENvZGU7CisgICAgICAgIGF1dG8gZXhpdENvZGVTdWNjZXNzID0gOjpHZXRFeGl0Q29kZVByb2Nlc3MocGluZm8uaFByb2Nlc3MsICZleGl0Q29kZSk7CisgICAgICAgIGFzc2VydChleGl0Q29kZVN1Y2Nlc3MpOworICAgICAgICAodm9pZClleGl0Q29kZVN1Y2Nlc3M7CisgICAgICAgIGlmIChvdXRFeGl0Q29kZSkgeworICAgICAgICAgICAgKm91dEV4aXRDb2RlID0gZXhpdENvZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyNlbHNlICAgLy8gIV9XSU4zMgorICAgICAgICBzaWdzZXRfdCBvbGRzZXQ7CisgICAgICAgIHNpZ3NldF90IHNldDsKKyAgICAgICAgaWYgKHNpZ2VtcHR5c2V0KCZzZXQpIHx8IHNpZ2FkZHNldCgmc2V0LCBTSUdDSExEKSB8fAorICAgICAgICAgICAgcHRocmVhZF9zaWdtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCAmb2xkc2V0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGF1dG8gcmVzdWx0ID0gcnVuQ29tbWFuZFBvc2l4KGNvbW1hbmRMaW5lLCBvcHRpb25zLCB0aW1lb3V0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4aXRDb2RlLCBvdXRDaGlsZFBpZCwgb3V0cHV0RmlsZSk7CisgICAgICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisjZW5kaWYgIC8vICFfV0lOMzIKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFRlbXBEaXIoKSBjb25zdCB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyBwYXRoKFBBVEhfTUFYKTsKKyAgICAgICAgRFdPUkQgcmV0dmFsID0gR2V0VGVtcFBhdGhXKHBhdGguc2l6ZSgpLCBwYXRoLmRhdGEoKSk7CisgICAgICAgIGlmIChyZXR2YWwgPiBwYXRoLnNpemUoKSkgeworICAgICAgICAgICAgcGF0aC5yZXNpemUoc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXR2YWwpKTsKKyAgICAgICAgICAgIHJldHZhbCA9IEdldFRlbXBQYXRoVyhwYXRoLnNpemUoKSwgcGF0aC5kYXRhKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgICAgICAvLyBCZXN0IGVmZm9ydCEKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygiQzpcXFRlbXAiKTsKKyAgICAgICAgfQorICAgICAgICBwYXRoLnJlc2l6ZShyZXR2YWwpOworICAgICAgICAvLyBUaGUgcmVzdWx0IG9mIEdldFRlbXBQYXRoKCkgaXMgYWxyZWFkeSB1c2VyLWRlcGVuZGVudAorICAgICAgICAvLyBzbyBkb24ndCBhcHBlbmQgdGhlIHVzZXJuYW1lIG9yIHVzZXJpZCB0byB0aGUgcmVzdWx0LgorICAgICAgICBwYXRoLmFwcGVuZChMIlxcQW5kcm9pZEVtdWxhdG9yIik7CisgICAgICAgIDo6X3dta2RpcihwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcGF0aC50b1N0cmluZygpOworI2Vsc2UgICAvLyAhX1dJTjMyCisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgICAgY29uc3QgY2hhciogdG1wcGF0aCA9IGdldGVudigiQU5EUk9JRF9UTVAiKTsKKyAgICAgICAgaWYgKCF0bXBwYXRoKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB1c2VyID0gZ2V0ZW52KCJVU0VSIik7CisgICAgICAgICAgICBpZiAodXNlciA9PSBOVUxMIHx8IHVzZXJbMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIHVzZXIgPSAidW5rbm93biI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSAiL3RtcC9hbmRyb2lkLSI7CisgICAgICAgICAgICByZXN1bHQgKz0gdXNlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRtcHBhdGg7CisgICAgICAgIH0KKyAgICAgICAgOjpta2RpcihyZXN1bHQuY19zdHIoKSwgMDc0NCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisjZW5kaWYgIC8vICFfV0lOMzIKKyAgICB9CisKKyNpZm5kZWYgX1dJTjMyCisgICAgYm9vbCBydW5Db21tYW5kUG9zaXgoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSdW5PcHRpb25zIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpEdXJhdGlvbiB0aW1lb3V0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUqIG91dEV4aXRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UGlkKiBvdXRDaGlsZFBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0RmlsZSkgeworICAgICAgICB2ZWN0b3I8Y2hhcio+IHBhcmFtczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogY29tbWFuZExpbmUpIHsKKyAgICAgICAgICAgIHBhcmFtcy5wdXNoX2JhY2soY29uc3RfY2FzdDxjaGFyKj4oaXRlbS5jX3N0cigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1zLnB1c2hfYmFjayhudWxscHRyKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBjbWQgPSAiIjsKKyAgICAgICAgaWYoTE9HX0lTX09OKFZFUkJPU0UpKSB7CisgICAgICAgICAgICBjbWQgPSAifCI7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhcmFtIDogY29tbWFuZExpbmUpIHsKKyAgICAgICAgICAgICAgICBjbWQgKz0gcGFyYW07CisgICAgICAgICAgICAgICAgY21kICs9ICIgIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZCArPSAifCI7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICBpbnQgcGlkID0gcnVuVmlhUG9zaXhTcGF3bihjb21tYW5kTGluZVswXS5jX3N0cigpLCBwYXJhbXMsIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUpOworI2Vsc2UKKyAgICAgICAgaW50IHBpZCA9IHJ1blZpYUZvcmtBbmRFeGVjKGNvbW1hbmRMaW5lWzBdLmNfc3RyKCksIHBhcmFtcywgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUpOworI2VuZGlmICAvLyAhZGVmaW5lZChfX0FQUExFX18pCisKKyAgICAgICAgaWYgKHBpZCA8IDApIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRmFpbGVkIHRvIGZvcmsgZm9yIGNvbW1hbmQgIiA8PCBjbWQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0Q2hpbGRQaWQpIHsKKyAgICAgICAgICAgICpvdXRDaGlsZFBpZCA9IHBpZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHdlcmUgcmVxdWVzdGVkIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGNvbXBsZXRlLgorICAgICAgICBpbnQgZXhpdENvZGU7CisgICAgICAgIC8vIERvIG5vdCB1c2UgU0lHQ0hMRCBoZXJlIGJlY2F1c2Ugd2UncmUgbm90IHN1cmUgaWYgd2UncmUKKyAgICAgICAgLy8gcnVubmluZyBvbiB0aGUgbWFpbiB0aHJlYWQgYW5kL29yIHdoYXQgb3VyIHNpZ21hc2sgaXMuCisgICAgICAgIGlmICh0aW1lb3V0TXMgPT0ga0luZmluaXRlKSB7CisgICAgICAgICAgICAvLyBMZXQncyBqdXN0IHdhaXQgZm9yZXZlciBhbmQgaG9wZSB0aGF0IHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAgICAgICAvLyBleGl0cy4KKyAgICAgICAgICAgIEhBTkRMRV9FSU5UUih3YWl0cGlkKHBpZCwgJmV4aXRDb2RlLCAwKSk7CisgICAgICAgICAgICBpZiAob3V0RXhpdENvZGUpIHsKKyAgICAgICAgICAgICAgICAqb3V0RXhpdENvZGUgPSBXRVhJVFNUQVRVUyhleGl0Q29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gV0lGRVhJVEVEKGV4aXRDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gc3RhcnRUaW1lID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgICAgIGF1dG8gZWxhcHNlZCA9IHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM6Onplcm8oKTsKKyAgICAgICAgd2hpbGUgKGVsYXBzZWQuY291bnQoKSA8IHRpbWVvdXRNcykgeworICAgICAgICAgICAgcGlkX3Qgd2FpdFBpZCA9IEhBTkRMRV9FSU5UUih3YWl0cGlkKHBpZCwgJmV4aXRDb2RlLCBXTk9IQU5HKSk7CisgICAgICAgICAgICBpZiAod2FpdFBpZCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvY2FsX2Vycm5vID0gZXJybm87CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJFcnJvciBydW5uaW5nIGNvbW1hbmQgIiA8PCBjbWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4gd2FpdHBpZCBmYWlsZWQgd2l0aCB8IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdHJlcnJvcihsb2NhbF9lcnJubykgPDwgInwiOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdhaXRQaWQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG91dEV4aXRDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRFeGl0Q29kZSA9IFdFWElUU1RBVFVTKGV4aXRDb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFdJRkVYSVRFRChleGl0Q29kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNsZWVwTXMoMTApOworICAgICAgICAgICAgZWxhcHNlZCA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHN0YXJ0VGltZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaW1lb3V0IG9jY3VyZWQuCisgICAgICAgIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OlRlcm1pbmF0ZU9uVGltZW91dCkgIT0gMCkgeworICAgICAgICAgICAga2lsbChwaWQsIFNJR0tJTEwpOworICAgICAgICAgICAgd2FpdHBpZChwaWQsIG51bGxwdHIsIFdOT0hBTkcpOworICAgICAgICB9CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiVGltZWQgb3V0IHdpdGggcnVubmluZyBjb21tYW5kICIgPDwgY21kOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJ1blZpYUZvcmtBbmRFeGVjKGNvbnN0IGNoYXIqIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxjaGFyKj4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuT3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG91dHB1dEZpbGUpIHsKKyAgICAgICAgLy8gSWYgYW4gb3V0cHV0IGZpbGUgd2FzIHJlcXVlc3RlZCwgb3BlbiBpdCBiZWZvcmUgZm9ya2luZywgc2luY2UKKyAgICAgICAgLy8gY3JlYXRpbmcgYSBmaWxlIGluIHRoZSBjaGlsZCBvZiBhIG11bHRpLXRocmVhZGVkIHByb2Nlc3MgaXMgc2tldGNoeS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSXQgd2lsbCBiZSBpbW1lZGlhdGVseSBjbG9zZWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzLCBhbmQgZHVwMidkIGludG8KKyAgICAgICAgLy8gc3Rkb3V0IGFuZCBzdGRlcnIgaW4gdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIGludCBvdXRwdXRGZCA9IDA7CisgICAgICAgIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OkR1bXBPdXRwdXRUb0ZpbGUpICE9IFJ1bk9wdGlvbnM6OkVtcHR5KSB7CisgICAgICAgICAgICBpZiAob3V0cHV0RmlsZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJDYW4gbm90IHJlZGlyZWN0IG91dHB1dCB0byBlbXB0eSBmaWxlISI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIHVtYXNrIGRvZXNuJ3QgZ2V0IGluIHRoZSB3YXkgd2hpbGUgY3JlYXRpbmcgdGhlCisgICAgICAgICAgICAvLyBvdXRwdXQgZmlsZS4KKyAgICAgICAgICAgIG1vZGVfdCBvbGQgPSB1bWFzaygwKTsKKyAgICAgICAgICAgIG91dHB1dEZkID0gb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDcwMCk7CisgICAgICAgICAgICB1bWFzayhvbGQpOworICAgICAgICAgICAgaWYgKG91dHB1dEZkIDwgMCkgeworICAgICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZSB0byByZWRpcmVjdCBzdGRvdXQvc3RkZXJyIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGlkID0gZm9yaygpOworCisgICAgICAgIGlmIChwaWQgIT0gMCkgeworICAgICAgICAgICAgaWYgKG91dHB1dEZkID4gMCkgeworICAgICAgICAgICAgICAgIGNsb3NlKG91dHB1dEZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgY2hpbGQncyBwaWQgLyBlcnJvciBjb2RlIHRvIHBhcmVudCBwcm9jZXNzLgorICAgICAgICAgICAgcmV0dXJuIHBpZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgICAvLyBEbyBub3QgZG8gX19hbnl0aGluZ19fIGV4Y2VwdCBleGVjdmUuIFRoYXQgaW5jbHVkZXMgcHJpbnRpbmcgdG8KKyAgICAgICAgLy8gc3Rkb3V0L3N0ZGVyci4gTm9uZSBvZiBpdCBpcyBzYWZlIGluIHRoZSBjaGlsZCBwcm9jZXNzIGZvcmtlZCBmcm9tIGEKKyAgICAgICAgLy8gcGFyZW50IHdpdGggbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgICAgaWYgKChvcHRpb25zICYgUnVuT3B0aW9uczo6RHVtcE91dHB1dFRvRmlsZSkgIT0gUnVuT3B0aW9uczo6RW1wdHkpIHsKKyAgICAgICAgICAgIGR1cDIob3V0cHV0RmQsIDEpOworICAgICAgICAgICAgZHVwMihvdXRwdXRGZCwgMik7CisgICAgICAgICAgICBjbG9zZShvdXRwdXRGZCk7CisgICAgICAgIH0gZWxzZSBpZiAoKG9wdGlvbnMgJiBSdW5PcHRpb25zOjpTaG93T3V0cHV0KSA9PSBSdW5PcHRpb25zOjpFbXB0eSkgeworICAgICAgICAgICAgLy8gV2Ugd2VyZSByZXF1ZXN0ZWQgdG8gUnVuT3B0aW9uczo6SGlkZUFsbE91dHB1dAorICAgICAgICAgICAgaW50IGZkID0gb3BlbigiL2Rldi9udWxsIiwgT19XUk9OTFkpOworICAgICAgICAgICAgaWYgKGZkID4gMCkgeworICAgICAgICAgICAgICAgIGR1cDIoZmQsIDEpOworICAgICAgICAgICAgICAgIGR1cDIoZmQsIDIpOworICAgICAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIG5ldmVyIHdhbnQgdG8gZm9yd2FyZCBvdXIgc3RkaW4gdG8gdGhlIGNoaWxkIHByb2Nlc3MuIE9uIHRoZSBvdGhlcgorICAgICAgICAvLyBoYW5kLCBjbG9zaW5nIGl0IGNhbiBjb25mdXNlIHNvbWUgcHJvZ3JhbXMuCisgICAgICAgIGludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKKyAgICAgICAgaWYgKGZkID4gMCkgeworICAgICAgICAgICAgZHVwMihmZCwgMCk7CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhlY3ZwKGNvbW1hbmQsIHBhcmFtcy5kYXRhKCkpID09IC0xKSB7CisgICAgICAgICAgICAvLyBlbXVsYXRvciBkb2Vzbid0IHJlYWxseSBsaWtlIGV4aXQgY2FsbHMgZnJvbSBhIGZvcmtlZCBwcm9jZXNzCisgICAgICAgICAgICAvLyAoaXQganVzdCBoYW5ncyksIHNvIGxldCdzIGp1c3Qga2lsbCBpdAorICAgICAgICAgICAgaWYgKHJhaXNlKFNJR0tJTEwpICE9IDApIHsKKyAgICAgICAgICAgICAgICBleGl0KFJ1bkZhaWxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBsZXQncyBrZWVwIHRoZSBjb21waWxlciBoYXBweQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgaW50IHJ1blZpYVBvc2l4U3Bhd24oY29uc3QgY2hhciogY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8Y2hhcio+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUnVuT3B0aW9ucyBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0RmlsZSkgeworICAgICAgICBwb3NpeF9zcGF3bmF0dHJfdCBhdHRyOworICAgICAgICBpZiAocG9zaXhfc3Bhd25hdHRyX2luaXQoJmF0dHIpKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIHNwYXduYXR0ciBvYmouIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBhdHRyLgorICAgICAgICBhdXRvIGF0dHJEZWxldGVyID0gW10ocG9zaXhfc3Bhd25hdHRyX3QqIHQpIHsKKyAgICAgICAgICAgIHBvc2l4X3NwYXduYXR0cl9kZXN0cm95KHQpOworICAgICAgICB9OworICAgICAgICB1bmlxdWVfcHRyPHBvc2l4X3NwYXduYXR0cl90LCBkZWNsdHlwZShhdHRyRGVsZXRlcik+IHNjb3BlZEF0dHIoCisgICAgICAgICAgICAgICAgJmF0dHIsIGF0dHJEZWxldGVyKTsKKworICAgICAgICBpZiAocG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzKCZhdHRyLCBQT1NJWF9TUEFXTl9DTE9FWEVDX0RFRkFVTFQpKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkZhaWxlZCB0byByZXF1ZXN0IENMT0VYRUMuIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc190IGZpbGVBY3Rpb25zOworICAgICAgICBpZiAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2luaXQoJmZpbGVBY3Rpb25zKSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBmaWxlYWN0aW9ucyBvYmouIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRlc3Ryb3kgdGhlIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBmaWxlQWN0aW9ucy4KKyAgICAgICAgYXV0byBmaWxlQWN0aW9uc0RlbGV0ZXIgPSBbXShwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfdCogdCkgeworICAgICAgICAgICAgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2Rlc3Ryb3kodCk7CisgICAgICAgIH07CisgICAgICAgIHVuaXF1ZV9wdHI8cG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX3QsIGRlY2x0eXBlKGZpbGVBY3Rpb25zRGVsZXRlcik+CisgICAgICAgICAgICAgICAgc2NvcGVkRmlsZUFjdGlvbnMoJmZpbGVBY3Rpb25zLCBmaWxlQWN0aW9uc0RlbGV0ZXIpOworCisgICAgICAgIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OkR1bXBPdXRwdXRUb0ZpbGUpICE9IFJ1bk9wdGlvbnM6OkVtcHR5KSB7CisgICAgICAgICAgICBpZiAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZG9wZW4oCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUFjdGlvbnMsIDEsIG91dHB1dEZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA3MDApIHx8CisgICAgICAgICAgICAgICAgcG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZG9wZW4oCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUFjdGlvbnMsIDIsIG91dHB1dEZpbGUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA3MDApKSB7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGYWlsZWQgdG8gcmVkaXJlY3QgY2hpbGQgb3V0cHV0IHRvIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBvdXRwdXRGaWxlOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgob3B0aW9ucyAmIFJ1bk9wdGlvbnM6OlNob3dPdXRwdXQpICE9IFJ1bk9wdGlvbnM6OkVtcHR5KSB7CisgICAgICAgICAgICBpZiAocG9zaXhfc3Bhd25fZmlsZV9hY3Rpb25zX2FkZGluaGVyaXRfbnAoJmZpbGVBY3Rpb25zLCAxKSB8fAorICAgICAgICAgICAgICAgIHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRpbmhlcml0X25wKCZmaWxlQWN0aW9ucywgMikpIHsKKyAgICAgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkZhaWxlZCB0byByZXF1ZXN0IGNoaWxkIHN0ZG91dC9zdGRlcnIgdG8gYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVmdCBpbnRhY3QiOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb3NpeF9zcGF3bl9maWxlX2FjdGlvbnNfYWRkb3BlbigmZmlsZUFjdGlvbnMsIDEsICIvZGV2L251bGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9fV1JPTkxZLCAwNzAwKSB8fAorICAgICAgICAgICAgICAgIHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRvcGVuKCZmaWxlQWN0aW9ucywgMiwgIi9kZXYvbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT19XUk9OTFksIDA3MDApKSB7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGYWlsZWQgdG8gcmVkaXJlY3QgY2hpbGQgb3V0cHV0IHRvIC9kZXYvbnVsbCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgbmV2ZXIgd2FudCB0byBmb3J3YXJkIG91ciBzdGRpbiB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gT24gdGhlIG90aGVyCisgICAgICAgIC8vIGhhbmQsIGNsb3NpbmcgaXQgY2FuIGNvbmZ1c2Ugc29tZSBwcm9ncmFtcy4KKyAgICAgICAgaWYgKHBvc2l4X3NwYXduX2ZpbGVfYWN0aW9uc19hZGRvcGVuKCZmaWxlQWN0aW9ucywgMCwgIi9kZXYvbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX1JET05MWSwgMDcwMCkpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRmFpbGVkIHRvIHJlZGlyZWN0IGNoaWxkIHN0ZGluIGZyb20gL2Rldi9udWxsIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBvc2l4IHNwYXduIHJlcXVpcmVzIHRoYXQgYXJndlswXSBleGlzdHMuCisgICAgICAgIGFzc2VydChwYXJhbXNbMF0gIT0gbnVsbHB0cik7CisKKyAgICAgICAgaW50IHBpZDsKKyAgICAgICAgaWYgKGludCBlcnJvcl9jb2RlID0gcG9zaXhfc3Bhd25wKCZwaWQsIGNvbW1hbmQsICZmaWxlQWN0aW9ucywgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZGF0YSgpLCBlbnZpcm9uKSkgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJwb3NpeF9zcGF3bnAgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwaWQ7CisgICAgfQorI2VuZGlmICAvLyBkZWZpbmVkKF9fQVBQTEVfXykKKyNlbmRpZiAgLy8gIV9XSU4zMgorCitwcml2YXRlOgorICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbVByb2dyYW1EaXI7CisgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtTGF1bmNoZXJEaXI7CisgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtSG9tZURpcjsKKyAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1BcHBEYXRhRGlyOworfTsKKworTGF6eUluc3RhbmNlPEhvc3RTeXN0ZW0+IHNIb3N0U3lzdGVtID0gTEFaWV9JTlNUQU5DRV9JTklUOworU3lzdGVtKiBzU3lzdGVtRm9yVGVzdGluZyA9IE5VTEw7CisKKyNpZmRlZiBfV0lOMzIKKy8vIFJldHVybiB8cGF0aHwgYXMgYSBVbmljb2RlIHN0cmluZywgd2hpbGUgZGlzY2FyZGluZyB0cmFpbGluZyBzZXBhcmF0b3JzLgorV2luMzJVbmljb2RlU3RyaW5nIHdpbjMyUGF0aChTdHJpbmdWaWV3IHBhdGgpIHsKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgd3BhdGgocGF0aCk7CisgICAgLy8gR2V0IHJpZCBvZiB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9ycywgV2luZG93cyBkb2Vzbid0IGxpa2UgdGhlbS4KKyAgICBzaXplX3Qgc2l6ZSA9IHdwYXRoLnNpemUoKTsKKyAgICB3aGlsZSAoc2l6ZSA+IDBVICYmCisgICAgICAgICAgICh3cGF0aFtzaXplIC0gMVVdID09IEwnXFwnIHx8IHdwYXRoW3NpemUgLSAxVV0gPT0gTCcvJykpIHsKKyAgICAgICAgc2l6ZS0tOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IHdwYXRoLnNpemUoKSkgeworICAgICAgICB3cGF0aC5yZXNpemUoc2l6ZSk7CisgICAgfQorICAgIHJldHVybiB3cGF0aDsKK30KKwordXNpbmcgUGF0aFN0YXQgPSBzdHJ1Y3QgX3N0YXQ7CisKKyNlbHNlICAvLyBfV0lOMzIKKwordXNpbmcgUGF0aFN0YXQgPSBzdHJ1Y3Qgc3RhdDsKKworI2VuZGlmICAvLyBfV0lOMzIKKworaW50IHBhdGhTdGF0KFN0cmluZ1ZpZXcgcGF0aCwgUGF0aFN0YXQqIHN0KSB7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIF93c3RhdCh3aW4zMlBhdGgocGF0aCkuY19zdHIoKSwgc3QpOworI2Vsc2UgICAvLyAhX1dJTjMyCisgICAgcmV0dXJuIEhBTkRMRV9FSU5UUihzdGF0KHBhdGguY19zdHIoKSwgc3QpKTsKKyNlbmRpZiAgLy8gIV9XSU4zMgorfQorCitpbnQgcGF0aEFjY2VzcyhTdHJpbmdWaWV3IHBhdGgsIGludCBtb2RlKSB7CisjaWZkZWYgX1dJTjMyCisgICAgLy8gQ29udmVydCB8bW9kZXwgdG8gd2luMzIgcGVybWlzc2lvbiBiaXRzLgorICAgIGludCB3aW4zMm1vZGUgPSAweDA7CisgICAgaWYgKChtb2RlICYgUl9PSykgfHwgKG1vZGUgJiBYX09LKSkgeworICAgICAgICB3aW4zMm1vZGUgfD0gMHg0OworICAgIH0KKyAgICBpZiAobW9kZSAmIFdfT0spIHsKKyAgICAgICAgd2luMzJtb2RlIHw9IDB4MjsKKyAgICB9CisgICAgcmV0dXJuIF93YWNjZXNzKHdpbjMyUGF0aChwYXRoKS5jX3N0cigpLCB3aW4zMm1vZGUpOworI2Vsc2UgICAvLyAhX1dJTjMyCisgICAgcmV0dXJuIEhBTkRMRV9FSU5UUihhY2Nlc3MocGF0aC5jX3N0cigpLCBtb2RlKSk7CisjZW5kaWYgIC8vICFfV0lOMzIKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworU3lzdGVtKiBTeXN0ZW06OmdldCgpIHsKKyAgICBTeXN0ZW0qIHJlc3VsdCA9IHNTeXN0ZW1Gb3JUZXN0aW5nOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdCA9IHNIb3N0U3lzdGVtLnB0cigpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgX194ODZfNjRfXworLy8gc3RhdGljCitjb25zdCBjaGFyKiBTeXN0ZW06OmtMaWJTdWJEaXIgPSAibGliNjQiOworLy8gc3RhdGljCitjb25zdCBjaGFyKiBTeXN0ZW06OmtCaW5TdWJEaXIgPSAiYmluNjQiOworI2Vsc2UKKy8vIHN0YXRpYworY29uc3QgY2hhciogU3lzdGVtOjprTGliU3ViRGlyID0gImxpYiI7CisvLyBzdGF0aWMKK2NvbnN0IGNoYXIqIFN5c3RlbTo6a0JpblN1YkRpciA9ICJiaW4iOworI2VuZGlmCisKK2NvbnN0IGNoYXIqIFN5c3RlbTo6a0JpbjMyU3ViRGlyID0gImJpbiI7CisKKy8vIFRoZXNlIG5lZWQgdG8gYmUgZGVmaW5lZCBzbyBvbmUgY2FuIHRha2UgYW4gYWRkcmVzcyBvZiB0aGVtLgorY29uc3QgaW50IFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzOworY29uc3QgY2hhciBTeXN0ZW06OmtEaXJTZXBhcmF0b3I7Citjb25zdCBjaGFyIFN5c3RlbTo6a1BhdGhTZXBhcmF0b3I7CisKKyNpZmRlZiBfV0lOMzIKKy8vIHN0YXRpYworY29uc3QgY2hhciogU3lzdGVtOjprTGlicmFyeVNlYXJjaExpc3RFbnZWYXJOYW1lID0gIlBBVEgiOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCitjb25zdCBjaGFyKiBTeXN0ZW06OmtMaWJyYXJ5U2VhcmNoTGlzdEVudlZhck5hbWUgPSAiRFlMRF9MSUJSQVJZX1BBVEgiOworI2Vsc2UKKy8vIHN0YXRpYworY29uc3QgY2hhciogU3lzdGVtOjprTGlicmFyeVNlYXJjaExpc3RFbnZWYXJOYW1lID0gIkxEX0xJQlJBUllfUEFUSCI7CisjZW5kaWYKKworLy8gc3RhdGljCitTeXN0ZW0qIFN5c3RlbTo6c2V0Rm9yVGVzdGluZyhTeXN0ZW0qIHN5c3RlbSkgeworICAgIFN5c3RlbSogcmVzdWx0ID0gc1N5c3RlbUZvclRlc3Rpbmc7CisgICAgc1N5c3RlbUZvclRlc3RpbmcgPSBzeXN0ZW07CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3lzdGVtOjpzY2FuRGlySW50ZXJuYWwoU3RyaW5nVmlldyBkaXJQYXRoKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlc3VsdDsKKworICAgIGlmIChkaXJQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisjaWZkZWYgX1dJTjMyCisgICAgYXV0byByb290ID0gUGF0aFV0aWxzOjphZGRUcmFpbGluZ0RpclNlcGFyYXRvcihkaXJQYXRoKTsKKyAgICByb290ICs9ICcqJzsKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgcm9vdFVuaWNvZGUocm9vdCk7CisgICAgc3RydWN0IF93ZmluZGRhdGFfdCBmaW5kRGF0YTsKKyAgICBpbnRwdHJfdCBmaW5kSW5kZXggPSBfd2ZpbmRmaXJzdChyb290VW5pY29kZS5jX3N0cigpLCAmZmluZERhdGEpOworICAgIGlmIChmaW5kSW5kZXggPj0gMCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBuYW1lID0gZmluZERhdGEubmFtZTsKKyAgICAgICAgICAgIGlmICh3Y3NjbXAobmFtZSwgTCIuIikgIT0gMCAmJiB3Y3NjbXAobmFtZSwgTCIuLiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydFRvVXRmOChuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKF93ZmluZG5leHQoZmluZEluZGV4LCAmZmluZERhdGEpID49IDApOworICAgICAgICBfZmluZGNsb3NlKGZpbmRJbmRleCk7CisgICAgfQorI2Vsc2UgIC8vICFfV0lOMzIKKyAgICBESVIqIGRpciA9IDo6b3BlbmRpcihkaXJQYXRoLmNfc3RyKCkpOworICAgIGlmIChkaXIpIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgc3RydWN0IGRpcmVudCogZW50cnkgPSA6OnJlYWRkaXIoZGlyKTsKKyAgICAgICAgICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBlbnRyeS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiLiIpICE9IDAgJiYgc3RyY21wKG5hbWUsICIuLiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICA6OmNsb3NlZGlyKGRpcik7CisgICAgfQorI2VuZGlmICAvLyAhX1dJTjMyCisgICAgc3RkOjpzb3J0KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworYm9vbCBTeXN0ZW06OnBhdGhFeGlzdHNJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpIHsKKyAgICBpZiAocGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50IHJldCA9IHBhdGhBY2Nlc3MocGF0aCwgRl9PSyk7CisgICAgcmV0dXJuIChyZXQgPT0gMCkgfHwgKGVycm5vICE9IEVOT0VOVCk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBTeXN0ZW06OnBhdGhJc0ZpbGVJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpIHsKKyAgICBpZiAocGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUGF0aFN0YXQgc3Q7CisgICAgaW50IHJldCA9IHBhdGhTdGF0KHBhdGgsICZzdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gU19JU1JFRyhzdC5zdF9tb2RlKTsKK30KKworLy8gc3RhdGljCitib29sIFN5c3RlbTo6cGF0aElzRGlySW50ZXJuYWwoU3RyaW5nVmlldyBwYXRoKSB7CisgICAgaWYgKHBhdGguZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFBhdGhTdGF0IHN0OworICAgIGludCByZXQgPSBwYXRoU3RhdChwYXRoLCAmc3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBTeXN0ZW06OnBhdGhDYW5SZWFkSW50ZXJuYWwoU3RyaW5nVmlldyBwYXRoKSB7CisgICAgaWYgKHBhdGguZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBwYXRoQWNjZXNzKHBhdGgsIFJfT0spID09IDA7Cit9CisKKy8vIHN0YXRpYworYm9vbCBTeXN0ZW06OnBhdGhDYW5Xcml0ZUludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcGF0aEFjY2VzcyhwYXRoLCBXX09LKSA9PSAwOworfQorCisvLyBzdGF0aWMKK2Jvb2wgU3lzdGVtOjpwYXRoQ2FuRXhlY0ludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcGF0aEFjY2VzcyhwYXRoLCBYX09LKSA9PSAwOworfQorCitib29sIFN5c3RlbTo6ZGVsZXRlRmlsZUludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgIGlmICghcGF0aElzRmlsZUludGVybmFsKHBhdGgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgcmVtb3ZlX3JlcyA9IC0xOworCisjaWZkZWYgX1dJTjMyCisgICAgcmVtb3ZlX3JlcyA9IHJlbW92ZShwYXRoLmNfc3RyKCkpOworICAgIGlmIChyZW1vdmVfcmVzIDwgMCkgeworICAgICAgICAvLyBXaW5kb3dzIHNvbWV0aW1lcyBqdXN0IGZhaWxzIHRvIGRlbGV0ZSBhIGZpbGUKKyAgICAgICAgLy8gb24gdGhlIGZpcnN0IHRyeS4KKyAgICAgICAgLy8gU2xlZXAgYSBsaXR0bGUgYml0IGFuZCB0cnkgYWdhaW4gaGVyZS4KKyAgICAgICAgU3lzdGVtOjpnZXQoKS0+c2xlZXBNcygxKTsKKyAgICAgICAgcmVtb3ZlX3JlcyA9IHJlbW92ZShwYXRoLmNfc3RyKCkpOworICAgIH0KKyNlbHNlCisgICAgcmVtb3ZlX3JlcyA9IHJlbW92ZShwYXRoLmNfc3RyKCkpOworI2VuZGlmCisKKyAgICBpZiAocmVtb3ZlX3JlcyAhPSAwKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiRmFpbGVkIHRvIGRlbGV0ZSBmaWxlIFsiIDw8IHBhdGggPDwgIl0uIjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVtb3ZlX3JlcyA9PSAwOworfQorCisvLyBzdGF0aWMKK2Jvb2wgU3lzdGVtOjpwYXRoRmlsZVNpemVJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgsIEZpbGVTaXplKiBvdXRGaWxlU2l6ZSkgeworICAgIGlmIChwYXRoLmVtcHR5KCkgfHwgIW91dEZpbGVTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUGF0aFN0YXQgc3Q7CisgICAgaW50IHJldCA9IHBhdGhTdGF0KHBhdGgsICZzdCk7CisgICAgaWYgKHJldCA8IDAgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBUaGlzIGlzIG9mZl90IG9uIFBPU0lYIGFuZCBhIDMyLzY0IGJpdCBpbnRlZ3JhbCB0eXBlIG9uIHdpbmRvd3MgYmFzZWQgb24KKyAgICAvLyB0aGUgaG9zdCAvIGNvbXBpbGVyIGNvbWJpbmF0aW9uLiBXZSBjYXN0IGV2ZXJ5dGhpbmcgdG8gNjQgYml0IHVuc2lnbmVkIHRvCisgICAgLy8gcGxheSBzYWZlLgorICAgICpvdXRGaWxlU2l6ZSA9IHN0YXRpY19jYXN0PEZpbGVTaXplPihzdC5zdF9zaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCit2b2lkIFN5c3RlbTo6YWRkTGlicmFyeVNlYXJjaERpcihTdHJpbmdWaWV3IHBhdGgpIHsKKyAgICBTeXN0ZW0qIHN5c3RlbSA9IFN5c3RlbTo6Z2V0KCk7CisgICAgY29uc3QgY2hhciogdmFyTmFtZSA9IGtMaWJyYXJ5U2VhcmNoTGlzdEVudlZhck5hbWU7CisKKyAgICBzdGQ6OnN0cmluZyBsaWJTZWFyY2hQYXRoID0gc3lzdGVtLT5lbnZHZXQodmFyTmFtZSk7CisgICAgaWYgKGxpYlNlYXJjaFBhdGguc2l6ZSgpKSB7CisgICAgICAgIGxpYlNlYXJjaFBhdGggPQorICAgICAgICAgICAgICAgIFN0cmluZ0Zvcm1hdCgiJXMlYyVzIiwgcGF0aCwga1BhdGhTZXBhcmF0b3IsIGxpYlNlYXJjaFBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYlNlYXJjaFBhdGggPSBwYXRoOworICAgIH0KKyAgICBzeXN0ZW0tPmVudlNldCh2YXJOYW1lLCBsaWJTZWFyY2hQYXRoKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBTeXN0ZW06OmZpbmRCdW5kbGVkRXhlY3V0YWJsZShTdHJpbmdWaWV3IHByb2dyYW1OYW1lKSB7CisgICAgU3lzdGVtKiBjb25zdCBzeXN0ZW0gPSBTeXN0ZW06OmdldCgpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4ZWN1dGFibGVOYW1lID0gUGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKHByb2dyYW1OYW1lKTsKKworICAgIC8vIGZpcnN0LCB0cnkgdGhlIHJvb3QgbGF1bmNoZXIgZGlyZWN0b3J5CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhdGhMaXN0ID0ge3N5c3RlbS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZU5hbWV9OworICAgIHN0ZDo6c3RyaW5nIGV4ZWN1dGFibGVQYXRoID0gUGF0aFV0aWxzOjpyZWNvbXBvc2UocGF0aExpc3QpOworICAgIGlmIChzeXN0ZW0tPnBhdGhJc0ZpbGUoZXhlY3V0YWJsZVBhdGgpKSB7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDsKKyAgICB9CisKKyAgICAvLyBpdCdzIG5vdCB0aGVyZSAtIGxldCdzIHRyeSB0aGUgJ2Jpbi8nIHN1YmRpcmVjdG9yeQorICAgIGFzc2VydChwYXRoTGlzdC5zaXplKCkgPT0gMik7CisgICAgYXNzZXJ0KHBhdGhMaXN0WzFdID09IGV4ZWN1dGFibGVOYW1lLmNfc3RyKCkpOworICAgIHBhdGhMaXN0WzFdID0ga0JpblN1YkRpcjsKKyAgICBwYXRoTGlzdC5wdXNoX2JhY2soZXhlY3V0YWJsZU5hbWUpOworICAgIGV4ZWN1dGFibGVQYXRoID0gUGF0aFV0aWxzOjpyZWNvbXBvc2UocGF0aExpc3QpOworICAgIGlmIChzeXN0ZW0tPnBhdGhJc0ZpbGUoZXhlY3V0YWJsZVBhdGgpKSB7CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlUGF0aDsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX3g4Nl82NCkKKyAgICAvLyBPbiBXaW5kb3dzIHdlIGRvbid0IGhhdmUgYSB4NjQgdmVyc2lvbiBlMmZzcHJvZ3MsIHNvIGxldCdzIHRyeQorICAgIC8vIDMyLWJpdCBkaXJlY3RvcnkgaWYgNjQtYml0IGxvb2t1cCBmYWlsZWQKKyAgICBhc3NlcnQocGF0aExpc3RbMV0gPT0ga0JpblN1YkRpcik7CisgICAgcGF0aExpc3RbMV0gPSBrQmluMzJTdWJEaXI7CisgICAgZXhlY3V0YWJsZVBhdGggPSBQYXRoVXRpbHM6OnJlY29tcG9zZShwYXRoTGlzdCk7CisgICAgaWYgKHN5c3RlbS0+cGF0aElzRmlsZShleGVjdXRhYmxlUGF0aCkpIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGVQYXRoOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKE9zVHlwZSBvc1R5cGUpIHsKKyAgICBzd2l0Y2ggKG9zVHlwZSkgeworICAgIGNhc2UgT3NUeXBlOjpXaW5kb3dzOgorICAgICAgICByZXR1cm4gIldpbmRvd3MiOworICAgIGNhc2UgT3NUeXBlOjpMaW51eDoKKyAgICAgICAgcmV0dXJuICJMaW51eCI7CisgICAgY2FzZSBPc1R5cGU6Ok1hYzoKKyAgICAgICAgcmV0dXJuICJNYWMiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVW5rbm93biI7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgwMGUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oCkBAIC0wLDAgKzEsMzQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0VudW1GbGFncy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjZW5kaWYKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjdW5kZWYgRVJST1IgIC8vIG5lY2Vzc2FyeSB0byBjb21waWxlIExPRyhFUlJPUikgc3RhdGVtZW50cworI2Vsc2UgIC8vICFfV0lOMzIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgICAgICAgLy8gIV9XSU4zMgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gVHlwZSBvZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtCitlbnVtIGNsYXNzIE9zVHlwZSB7CisgICAgV2luZG93cywKKyAgICBNYWMsCisgICAgTGludXgKK307CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKE9zVHlwZSBvc1R5cGUpOworCitlbnVtIGNsYXNzIFJ1bk9wdGlvbnMgeworICAgIC8vIENhbid0IHVzZSBOb25lIGhlcmU6IFguaCBkZWZpbmVzIE5vbmUgdG8gMEwuCisgICAgRW1wdHkgPSAwLAorCisgICAgLy8gc29tZSBwc2V1ZG8gZmxhZ3MgdG8ganVzdCBzdGF0ZSB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgIERvbnRXYWl0ID0gMCwKKyAgICBIaWRlQWxsT3V0cHV0ID0gMCwKKworICAgIC8vIFdhaXQgZm9yIHRoZSBsYXVuY2hlZCBzaGVsbCBjb21tYW5kIHRvIGZpbmlzaCwgYW5kIHJldHVybiB0cnVlIG9ubHkgaWYKKyAgICAvLyB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bC4KKyAgICBXYWl0Rm9yQ29tcGxldGlvbiA9IDEsCisgICAgLy8gQXR0ZW1wdCB0byB0ZXJtaW5hdGUgdGhlIGxhdW5jaGVkIHByb2Nlc3MgaWYgaXQgZG9lc24ndCBmaW5pc2ggaW4gdGltZS4KKyAgICAvLyBOb3RlIHRoYXQgdGVybWluYXRpbmcgYSBtaWQtZmxpZ2h0IHByb2Nlc3MgY2FuIGxlYXZlIHRoZSB3aG9sZSBzeXN0ZW0gaW4KKyAgICAvLyBhIHdlaXJkIHN0YXRlLgorICAgIC8vIE9ubHkgbWFrZSBzZW5zZSB3aXRoIHxXYWl0Rm9yQ29tcGxldGlvbnwuCisgICAgVGVybWluYXRlT25UaW1lb3V0ID0gMiwKKworICAgIC8vIFRoZXNlIGZsYWdzIGFuZCBSdW5PcHRpb25zOjpIaWRlQWxsT3V0cHV0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisgICAgU2hvd091dHB1dCA9IDQsCisgICAgRHVtcE91dHB1dFRvRmlsZSA9IDgsCisKKyAgICBEZWZhdWx0ID0gMCwgIC8vIGRvbid0IHdhaXQsIGhpZGUgYWxsIG91dHB1dAorfTsKKworLy8gSW50ZXJmYWNlIGNsYXNzIHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCitjbGFzcyBTeXN0ZW0geworcHVibGljOgorICAgIHR5cGVkZWYgaW50NjRfdCAgRHVyYXRpb247CisgICAgdHlwZWRlZiB1aW50NjRfdCBXYWxsRHVyYXRpb247CisgICAgdXNpbmcgRmlsZVNpemUgPSB1aW50NjRfdDsKKworICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IHVzZXIsIHN5c3RlbSBhbmQgd2FsbCBjbG9jayB0aW1lcyBmb3Igc29tZSBwcm9jZXNzLAorICAgIC8vIGluIG1pbGxpc2Vjb25kcworICAgIHN0cnVjdCBUaW1lcyB7CisgICAgICAgIER1cmF0aW9uIHVzZXJNczsKKyAgICAgICAgRHVyYXRpb24gc3lzdGVtTXM7CisgICAgICAgIFdhbGxEdXJhdGlvbiB3YWxsQ2xvY2tNczsKKyAgICB9OworCisgICAgZW51bSB7IFJ1bkZhaWxlZCA9IC0xIH07CisKKyAgICB1c2luZyBSdW5PcHRpb25zID0gYW5kcm9pZDo6YmFzZTo6UnVuT3B0aW9uczsKKworI2lmZGVmIF9XSU4zMgorICAgIHVzaW5nIFBpZCA9IERXT1JEOworICAgIHVzaW5nIFByb2Nlc3NFeGl0Q29kZSA9IERXT1JEOworI2Vsc2UKKyAgICB1c2luZyBQaWQgPSBwaWRfdDsKKyAgICB1c2luZyBQcm9jZXNzRXhpdENvZGUgPSBpbnQ7CisjZW5kaWYKKworcHVibGljOgorICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgdGhlIGluc3RhbmNlCisgICAgc3RhdGljIFN5c3RlbSogZ2V0KCk7CisKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGRvZXNuJ3QgZG8gYW55dGhpbmcuCisgICAgU3lzdGVtKCkgPSBkZWZhdWx0OworCisgICAgLy8gRGVmYXVsdCBkZXN0cnVjdG9yIGlzIGVtcHR5IGJ1dCB2aXJ0dWFsLgorICAgIHZpcnR1YWwgflN5c3RlbSgpID0gZGVmYXVsdDsKKworICAgIC8vIFJldHVybiB0aGUgaG9zdCBiaXRuZXNzIGFzIGFuIGludGVnZXIsIGVpdGhlciAzMiBvciA2NC4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJvZ3JhbSdzIGJpdG5lc3MuIEkuZS4gaWYKKyAgICAvLyBhIDMyLWJpdCBwcm9ncmFtIHJ1bnMgdW5kZXIgYSA2NC1iaXQgaG9zdCwgZ2V0UHJvZ3JhbUJpdG5lc3MoKQorICAgIC8vIHNoYWxsIHJldHVybiAzMiwgYnV0IGdldEhvc3RCaXRuZXNzKCkgc2hhbGwgcmV0dXJuIDY0LgorICAgIHZpcnR1YWwgaW50IGdldEhvc3RCaXRuZXNzKCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IE9TIHR5cGUKKyAgICB2aXJ0dWFsIE9zVHlwZSBnZXRPc1R5cGUoKSBjb25zdCA9IDA7CisKKyAgICAvLyBDaGVjayBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFdpbmU7CisgICAgLy8gcmV0dXJucyBmYWxzZSBmb3Igbm9uLVdpbmRvd3MgYnVpbGRzCisgICAgdmlydHVhbCBib29sIGlzUnVubmluZ1VuZGVyV2luZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIEdldCB0aGUgY3VycmVudCBwcm9jZXNzIElECisgICAgdmlydHVhbCBQaWQgZ2V0Q3VycmVudFByb2Nlc3NJZCgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0aGUgcHJvZ3JhbSBiaXRuZXNzIGFzIGFuIGludGVnZXIsIGVpdGhlciAzMiBvciA2NC4KKyNpZmRlZiBfX3g4Nl82NF9fCisgICAgc3RhdGljIGNvbnN0IGludCBrUHJvZ3JhbUJpdG5lc3MgPSA2NDsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGludCBrUHJvZ3JhbUJpdG5lc3MgPSAzMjsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0RpclNlcGFyYXRvciA9ICdcXCc7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBjaGFyIGtEaXJTZXBhcmF0b3IgPSAnLyc7CisjZW5kaWYKKworICAgIC8vIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0b3IgZGlyZWN0b3JpZXMgaW4gcGF0aC1yZWxhdGVkCisgICAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorI2lmZGVmIF9XSU4zMgorICAgIHN0YXRpYyBjb25zdCBjaGFyIGtQYXRoU2VwYXJhdG9yID0gJzsnOworI2Vsc2UKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrUGF0aFNlcGFyYXRvciA9ICc6JzsKKyNlbmRpZgorCisgICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaWJyYXJ5IHNlYXJjaAorICAgIC8vIGxpc3QgZm9yIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtMaWJyYXJ5U2VhcmNoTGlzdEVudlZhck5hbWU7CisKKyAgICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN1Yi1kaXJlY3RvcnkgY29udGFpbmluZyBsaWJyYXJpZXMKKyAgICAvLyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIGkuZS4gImxpYiIgb3IgImxpYjY0IiBkZXBlbmRpbmcKKyAgICAvLyBvbiB0aGUgdmFsdWUgb2Yga1Byb2dyYW1CaXRuZXNzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrTGliU3ViRGlyOworCisgICAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdWItZGlyZWN0b3J5IGNvbnRhaW5pbmcgZXhlY3V0YWJsZXMKKyAgICAvLyBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIGkuZS4gImJpbiIgb3IgImJpbjY0IiBkZXBlbmRpbmcKKyAgICAvLyBvbiB0aGUgdmFsdWUgb2Yga1Byb2dyYW1CaXRuZXNzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQmluU3ViRGlyOworCisgICAgLy8gTmFtZSBvZiB0aGUgMzItYml0IGJpbmFyaWVzIHN1YmRpcmVjdG9yeQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQmluMzJTdWJEaXI7CisKKyAgICAvLyBSZXR1cm4gcHJvZ3JhbSdzIGJpdG5lc3MsIGVpdGhlciAzMiBvciA2NC4KKyAgICBzdGF0aWMgaW50IGdldFByb2dyYW1CaXRuZXNzKCkgeyByZXR1cm4ga1Byb2dyYW1CaXRuZXNzOyB9CisKKyAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gRW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiBhIGdpdmVuIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgIC8vIEVxdWl2YWxlbnQgdG8gZ2V0ZW52KCkgYnV0IHJldHVybnMgYSBzdGQ6OnN0cmluZyBpbnN0YW5jZS4KKyAgICAvLyBJZiB0aGUgdmFyaWFibGUgaXMgbm90IGRlZmluZWQsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisgICAgLy8gTk9URTogT24gV2luZG93cywgdGhpcyB1c2VzIF93Z2V0ZW52KCkgYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAvLyBVVEYtOCB0ZXh0IHN0cmluZy4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGVudkdldChTdHJpbmdWaWV3IHZhcm5hbWUpIGNvbnN0ID0gMDsKKworICAgIC8vIFNldCB0aGUgdmFsdWUgb2YgYSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAvLyBJZiB8dmFydmFsdWV8IGlzIE5VTEwgb3IgZW1wdHksIHRoaXMgdW5zZXRzIHRoZSB2YXJpYWJsZS4KKyAgICAvLyBFcXVpdmFsZW50IHRvIHNldGVudigpLgorICAgIHZpcnR1YWwgdm9pZCBlbnZTZXQoU3RyaW5nVmlldyB2YXJuYW1lLCBTdHJpbmdWaWV3IHZhcnZhbHVlKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgZW52aXJvbm1lbnQgdmFyaWFibGUgfHZhcm5hbWV8IGlzIHNldCBhbmQgbm9uLWVtcHR5LgorICAgIHZpcnR1YWwgYm9vbCBlbnZUZXN0KFN0cmluZ1ZpZXcgdmFybmFtZSkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyBhbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZyb20gdGhlIGN1cnJlbnQgcHJvY2VzcyBpbiBhCisgICAgLy8gIm5hbWU9dmFsdWUiIGZvcm0KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlbnZHZXRBbGwoKSBjb25zdCA9IDA7CisKKyAgICAvLyBQcmVwZW5kIGEgbmV3IGRpcmVjdG9yeSB0byB0aGUgc3lzdGVtJ3MgbGlicmFyeSBzZWFyY2ggcGF0aC4gVGhpcworICAgIC8vIG9ubHkgYWx0ZXJzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGxpa2UgUEFUSCBvciBMRF9MSUJSQVJZX1BBVEgsCisgICAgLy8gYW5kIHRodXMgdHlwaWNhbGx5IHRha2VzIGVmZmVjdCBvbmx5IGFmdGVyIHNwYXduaW5nL2V4ZWN1dGluZyBhIG5ldworICAgIC8vIHByb2Nlc3MuCisgICAgc3RhdGljIHZvaWQgYWRkTGlicmFyeVNlYXJjaERpcihTdHJpbmdWaWV3IGRpclBhdGgpOworCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFBhdGggZnVuY3Rpb25zIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uCisgICAgLy8gICAgIFB1cmUgcGF0aCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zIGFyZSBpbiBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHMuCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIHxwYXRofCBleGlzdHMgb24gdGhlIGZpbGUgc3lzdGVtLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoRXhpc3RzKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIHxwYXRofCBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlIG9uIHRoZSBmaWxlIHN5c3RlbS4KKyAgICB2aXJ0dWFsIGJvb2wgcGF0aElzRmlsZShTdHJpbmdWaWV3IHBhdGgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB8cGF0aHwgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeSBvbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgdmlydHVhbCBib29sIHBhdGhJc0RpcihTdHJpbmdWaWV3IHBhdGgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB8cGF0aHwgZXhpc3RzIGFuZCBjYW4gYmUgcmVhZCBieSB0aGUgY3VycmVudCB1c2VyLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoQ2FuUmVhZChTdHJpbmdWaWV3IHBhdGgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB8cGF0aHwgZXhpc3RzIGFuZCBjYW4gYmUgd3JpdHRlbiB0byBieSB0aGUgY3VycmVudAorICAgIC8vIHVzZXIuCisgICAgdmlydHVhbCBib29sIHBhdGhDYW5Xcml0ZShTdHJpbmdWaWV3IHBhdGgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB8cGF0aHwgZXhpc3RzIGFuZCBjYW4gYmUgZXhlY3V0ZWQgdG8gYnkgdGhlIGN1cnJlbnQKKyAgICAvLyB1c2VyLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoQ2FuRXhlYyhTdHJpbmdWaWV3IHBhdGgpIGNvbnN0ID0gMDsKKworICAgIC8vIEZ1bmN0aW9uIGZvciBkZWxldGluZyBmaWxlcy4gUmV0dXJuIHRydWUgaWZmCisgICAgLy8gKHxwYXRofCBpcyBhIGZpbGUgYW5kIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgaXQpCisgICAgdmlydHVhbCBib29sIGRlbGV0ZUZpbGUoU3RyaW5nVmlldyBwYXRoKSBjb25zdCA9IDA7CisKKyAgICAvLyBHZXQgdGhlIHNpemUgb2YgZmlsZSBhdCB8cGF0aHwuCisgICAgLy8gRmFpbHMgaWYgcGF0aCBpcyBub3QgYSBmaWxlIG9yIG5vdCByZWFkYWJsZSwgYW5kIGluIGNhc2Ugb2Ygb3RoZXIgZXJyb3JzLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoRmlsZVNpemUoU3RyaW5nVmlldyBwYXRoLCBGaWxlU2l6ZSogb3V0RmlsZVNpemUpIGNvbnN0ID0gMDsKKyAgICAvLyBTY2FuIGRpcmVjdG9yeSB8ZGlyUGF0aHwgZm9yIGVudHJpZXMsIGFuZCByZXR1cm4gdGhlbSBhcyBhIHNvcnRlZAorICAgIC8vIHZlY3RvciBvciBlbnRyaWVzLiBJZiB8ZnVsbFBhdGh8IGlzIHRydWUsIHRoZW4gZWFjaCBpdGVtIG9mIHRoZQorICAgIC8vIHJlc3VsdCB2ZWN0b3IgY29udGFpbnMgYSBmdWxsIHBhdGguCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2NhbkRpckVudHJpZXMoCisgICAgICAgICAgICBTdHJpbmdWaWV3IGRpclBhdGgsCisgICAgICAgICAgICBib29sIGZ1bGxQYXRoID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8vIEZpbmQgYSBidW5kbGVkIGV4ZWN1dGFibGUgbmFtZWQgfHByb2dyYW1OYW1lfCwgaXQgbXVzdCBhcHBlYXIgaW4gdGhlCisgICAgLy8ga0JpblN1YkRpciBvZiBnZXRMYXVuY2hlckRpcmVjdG9yeSgpLiBUaGUgbmFtZSBzaG91bGQgbm90IGluY2x1ZGUgdGhlCisgICAgLy8gZXhlY3V0YWJsZSBleHRlbnNpb24gKC5leGUpIG9uIFdpbmRvd3MuCisgICAgLy8gUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBmaW5kQnVuZGxlZEV4ZWN1dGFibGUoU3RyaW5nVmlldyBwcm9ncmFtTmFtZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbSdzIGRpcmVjdG9yeS4KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRQcm9ncmFtRGlyZWN0b3J5KCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBlbXVsYXRvciBsYXVuY2hlcidzIGRpcmVjdG9yeS4KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRMYXVuY2hlckRpcmVjdG9yeSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0aGUgcGF0aCB0byB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgKGFzIGRlZmluZWQgaW4gdGhlCisgICAgLy8gdW5kZXJseWluZyBwbGF0Zm9ybSkgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGNhbid0IGJlIGZvdW5kCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SG9tZURpcmVjdG9yeSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0aGUgcGF0aCB0byB1c2VyJ3MgQXBwIERhdGEgZGlyZWN0b3J5IChvbmx5IGFwcGxpZXMKKyAgICAvLyBpbiBNaWNyb3NvZnQgV2luZG93cykgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIGl0IGNhbid0IGJlIGZvdW5kCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0QXBwRGF0YURpcmVjdG9yeSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBkaXJlY3RvcnkgcGF0aC4gQmVjYXVzZSB0aGlzIGNhbiBjaGFuZ2UgYXQKKyAgICAvLyBydW50aW1lLCB0aGlzIHJldHVybnMgYSBuZXcgc3RkOjpzdHJpbmcgaW5zdGFuY2UsIG5vdCBhIGNvbnN0LXJlZmVyZW5jZQorICAgIC8vIHRvIGEgY29uc3RhbnQgb25lIGhlbGQgYnkgdGhlIG9iamVjdC4gUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSBpcworICAgIC8vIGEgcHJvYmxlbSB3aXRoIHRoZSBzeXN0ZW0gd2hlbiBnZXR0aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnREaXJlY3RvcnkoKSBjb25zdCA9IDA7CisKKyAgICAvLyBSZXR1cm4gdGhlIHBhdGggb2YgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFwcHJvcHJpYXRlIGZvciB0aGUgc3lzdGVtLgorICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VGVtcERpcigpIGNvbnN0ID0gMDsKKworICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUaW1lIHJlbGF0ZWQgZnVuY3Rpb25zLgorICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIC8vIENoZWNrcyB0aGUgc3lzdGVtIHRvIHNlZSBpZiBpdCBpcyBydW5uaW5nIHVuZGVyIGEgcmVtb3Rpbmcgc2Vzc2lvbgorICAgIC8vIGxpa2UgTm9tYWNoaW5lJ3MgTlgsIENocm9tZSBSZW1vdGUgRGVza3RvcCBvciBXaW5kb3dzIFRlcm1pbmFsIFNlcnZpY2VzLgorICAgIC8vIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlIGFuZCBzZXRzIHwqc2Vzc2lvblR5cGV8IHRvIHRoZSBkZXRlY3RlZAorICAgIC8vIHNlc3Npb24gdHlwZS4gT3RoZXJ3aXNlLCBqdXN0IHJldHVybiBmYWxzZS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNSZW1vdGVTZXNzaW9uKHN0ZDo6c3RyaW5nKiBzZXNzaW9uVHlwZSkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyBUaW1lcyBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MKKyAgICB2aXJ0dWFsIFRpbWVzIGdldFByb2Nlc3NUaW1lcygpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgVW5peCB0aW1lc3RhbXAKKyAgICB2aXJ0dWFsIHRpbWVfdCBnZXRVbml4VGltZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgVW5peCB0aW1lc3RhbXAgd2l0aCBtaWNyb3NlY29uZCByZXNvbHV0aW9uCisgICAgdmlydHVhbCBEdXJhdGlvbiBnZXRVbml4VGltZVVzKCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgT1Mtc3BlY2lmaWMgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcC4KKyAgICB2aXJ0dWFsIFdhbGxEdXJhdGlvbiBnZXRIaWdoUmVzVGltZVVzKCkgY29uc3QgPSAwOworCisgICAgLy8gU2xlZXAgZm9yIHxufCBtaWxsaXNlY29uZHMKKyAgICB2aXJ0dWFsIHZvaWQgc2xlZXBNcyh1bnNpZ25lZCBuKSBjb25zdCA9IDA7CisKKyAgICAvLyBZaWVsZCB0aGUgcmVtYWluaW5nIHBhcnQgb2YgY3VycmVudCB0aHJlYWQncyBDUFUgdGltZSBzbGljZSB0byBhbm90aGVyCisgICAgLy8gdGhyZWFkIHRoYXQncyByZWFkeSB0byBydW4uCisgICAgdmlydHVhbCB2b2lkIHlpZWxkKCkgY29uc3QgPSAwOworCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIEV4ZWN1dGUgY29tbWFuZHMuCisgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gUnVuIGEgc2hlbGwgY29tbWFuZC4KKyAgICAvLyBBcmdzOgorICAgIC8vICAgICBjb21tYW5kTGluZTogU2V0IG9mIGNvbW1hbmQgdG8gcnVuICsgaXRzIGFyZ3VtZW50cworICAgIC8vICAgICBvcHRpb25zOiBvcHRpb25zIHRvIGNvbnRyb2xzIHNoZWxsIGJlaGF2aW91ciBpbiB2YXJpb3VzIHdheXMuCisgICAgLy8gICAgIHRpbWVvdXRNczogSWYgfG9wdGlvbnN8IGluY2x1ZGVzIFdhaXRGb3JDb21wbGV0aW9uLCB0aGlzIGFyZ3VtZW50CisgICAgLy8gICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBiZWZvcmUgYWJvcnRpbmcgdGhlCisgICAgLy8gICAgICAgICAgICAgY29tbWFuZC4gV2FpdHMgZm9yZXZlciBpZiBzZXQgdG8gMC4KKyAgICAvLyAgICAgb3V0RXhpdENvZGU6IEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gZXhpc3RpbmcgbG9jYXRpb24gd2hlcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgZXhpdCBjb2RlIGZvciB0aGUgbGF1bmNoZWQgcHJvY2VzcyBpcyByZXR1cm5lZC4KKyAgICAvLyAgICAgb3V0Q2hpbGRQaWQ6IEFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gYW4gZXhpc3RpbmcgbG9jYXRpb24gd2hlcmUgdGhlCisgICAgLy8gICAgICAgICAgICAgcGlkIGZvciB0aGUgbGF1bmNoZWQgY2hpbGQgcHJvY2VzcyBpcyByZXR1cm5lZC4gT25seSB2YWxpZAorICAgIC8vICAgICAgICAgICAgIGlmIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKyAgICAvLyAgICAgb3V0VGVtcEZpbGU6IEFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgZmlsZSB0bworICAgIC8vICAgICAgICAgICAgIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvLiBPbmx5IHVzZWQgaWYgfG9wdGlvbnN8CisgICAgLy8gICAgICAgICAgICAgaW5jbHVkZXMgRHVtcE91dHB1dFRvRmlsZS4KKyAgICAvLworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gc3VjY2VlZGVkIGluIHJ1bm5pbmcgdGhlIGNvbW1hbmQuIElmIHlvdQorICAgIC8vIHJlcXVlc3QgfFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9ufCwgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlCisgICAgLy8gY29tbWFuZCBmaW5pc2hlZCB3aXRoICJzdWNjZXNzIiBleGl0IHN0YXR1cywganVzdCB0aGF0IHdlIHN1Y2NlZWRlZCBpbgorICAgIC8vIHJ1bm5pbmcgaXQsIGNmIHxvdXRFeGl0Q29kZXwuCisgICAgc3RhdGljIGNvbnN0IFN5c3RlbTo6RHVyYXRpb24ga0luZmluaXRlID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcnVuQ29tbWFuZChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bk9wdGlvbnMgb3B0aW9ucyA9IFJ1bk9wdGlvbnM6OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpEdXJhdGlvbiB0aW1lb3V0TXMgPSBrSW5maW5pdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUqIG91dEV4aXRDb2RlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OlBpZCogb3V0Q2hpbGRQaWQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRwdXRGaWxlID0gIiIpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBTeXN0ZW0qIHNldEZvclRlc3RpbmcoU3lzdGVtKiBzeXN0ZW0pOworCisgICAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2Ygc2NhbkRpckVudHJpZXMoKSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgICAgLy8gbW9jayBpbXBsZW1lbnRhdGlvbiB1c2luZyBhIGZha2UgZmlsZSBzeXN0ZW0gcm9vdGVkIGludG8gYSB0ZW1wb3JhcnkKKyAgICAvLyBkaXJlY3Rvcnkgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gQWx3YXlzIHJldHVybnMgc2hvcnQgcGF0aHMuCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzY2FuRGlySW50ZXJuYWwoU3RyaW5nVmlldyBkaXJQYXRoKTsKKworICAgIHN0YXRpYyBib29sIHBhdGhFeGlzdHNJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpOworICAgIHN0YXRpYyBib29sIHBhdGhJc0ZpbGVJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpOworICAgIHN0YXRpYyBib29sIHBhdGhJc0RpckludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCk7CisgICAgc3RhdGljIGJvb2wgcGF0aENhblJlYWRJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpOworICAgIHN0YXRpYyBib29sIHBhdGhDYW5Xcml0ZUludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCk7CisgICAgc3RhdGljIGJvb2wgcGF0aENhbkV4ZWNJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpOworICAgIHN0YXRpYyBib29sIGRlbGV0ZUZpbGVJbnRlcm5hbChTdHJpbmdWaWV3IHBhdGgpOworICAgIHN0YXRpYyBib29sIHBhdGhGaWxlU2l6ZUludGVybmFsKFN0cmluZ1ZpZXcgcGF0aCwgRmlsZVNpemUqIG91dEZpbGVTaXplKTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU3lzdGVtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTA5OTVhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw0NjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvRWludHJXcmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgQVJSQVlMRU4oeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK3N0YXRpYyB2b2lkIG1ha2Vfc3ViZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZGlyLCBjb25zdCBjaGFyKiBmaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGRpcjsKKyAgICBwYXRoLmFwcGVuZCgiLyIpOworICAgIHBhdGguYXBwZW5kKGZpbGUpOworICAgIGludCBmZCA9IDo6b3BlbihwYXRoLmNfc3RyKCksIE9fV1JPTkxZfE9fQ1JFQVQsIDA3NTUpOworICAgIEVYUEVDVF9HRShmZCwgMCkgPDwgIlBhdGg6ICIgPDwgcGF0aC5jX3N0cigpOworICAgIDo6Y2xvc2UoZmQpOworfQorCitURVNUKFN5c3RlbSwgZ2V0KSB7CisgICAgU3lzdGVtKiBzeXMxID0gU3lzdGVtOjpnZXQoKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMxKTsKKworICAgIFN5c3RlbSogc3lzMiA9IFN5c3RlbTo6Z2V0KCk7CisgICAgRVhQRUNUX0VRKHN5czEsIHN5czIpOworfQorCitURVNUKFN5c3RlbSwgZ2V0UHJvZ3JhbURpcmVjdG9yeSkgeworICAgIHN0ZDo6c3RyaW5nIGRpciA9IFN5c3RlbTo6Z2V0KCktPmdldFByb2dyYW1EaXJlY3RvcnkoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGlyLmVtcHR5KCkpOworICAgIExPRyhJTkZPKSA8PCAiUHJvZ3JhbSBkaXJlY3Rvcnk6IFsiIDw8IGRpci5jX3N0cigpIDw8ICJdIjsKK30KKworVEVTVChTeXN0ZW0sIGdldEhvbWVEaXJlY3RvcnkpIHsKKyAgICBzdGQ6OnN0cmluZyBkaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRIb21lRGlyZWN0b3J5KCk7CisgICAgRVhQRUNUX0ZBTFNFKGRpci5lbXB0eSgpKTsKKyAgICBMT0coSU5GTykgPDwgIkhvbWUgZGlyZWN0b3J5OiBbIiA8PCBkaXIuY19zdHIoKSA8PCAiXSI7Cit9CisKK1RFU1QoU3lzdGVtLCBnZXRBcHBEYXRhRGlyZWN0b3J5KSB7CisgICAgc3RkOjpzdHJpbmcgZGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0QXBwRGF0YURpcmVjdG9yeSgpOworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAgIEVYUEVDVF9UUlVFKGRpci5lbXB0eSgpKTsKKyNlbHNlCisgICAgLy8gTWFjIE9TIFgsIE1pY3Jvc29mdCBXaW5kb3dzCisgICAgRVhQRUNUX0ZBTFNFKGRpci5lbXB0eSgpKTsKKyNlbmRpZiAvLyBfX2xpbnV4X18KKyAgICBMT0coSU5GTykgPDwgIkFwcERhdGEgZGlyZWN0b3J5OiBbIiA8PCBkaXIuY19zdHIoKSA8PCAiXSI7Cit9CisKK1RFU1QoU3lzdGVtLCBnZXRDdXJyZW50RGlyZWN0b3J5KSB7CisgICAgc3RkOjpzdHJpbmcgZGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0Q3VycmVudERpcmVjdG9yeSgpOworICAgIEVYUEVDVF9GQUxTRShkaXIuZW1wdHkoKSk7CisgICAgTE9HKElORk8pIDw8ICJDdXJyZW50IGRpcmVjdG9yeTogWyIgPDwgZGlyLmNfc3RyKCkgPDwgIl0iOworfQorCisvLyBUZXN0cyBjYXNlIHdoZXJlIHByb2dyYW0gZGlyZWN0b3J5ID09IGxhdW5jaGVyIGRpcmVjdG9yeSAoUUVNVTEpCitURVNUKFRlc3RTeXN0ZW0sIGdldERpcmVjdG9yeSkgeworICAgIGNvbnN0IGNoYXIga0xhdW5jaGVyRGlyW10gPSAiL2Zvby9iYXIiOworICAgIGNvbnN0IGNoYXIgIGtIb21lRGlyW10gICAgPSAiL21hbWEvcGFwYSI7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgY29uc3QgY2hhciAqa0FwcERhdGFEaXIgICA9ICIiOworI2Vsc2UKKyAgICAvLyBNYWMgT1MgWCwgTWljcm9zb2Z0IFdpbmRvd3MKKyAgICBjb25zdCBjaGFyICBrQXBwRGF0YURpcltdID0gIi9sYWxhL2tha2EiOworI2VuZGlmIC8vIF9fbGludXhfXworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhrTGF1bmNoZXJEaXIsIDMyLCBrSG9tZURpciwga0FwcERhdGFEaXIpOworICAgIHN0ZDo6c3RyaW5nIGxkaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpOworICAgIEVYUEVDVF9TVFJFUShrTGF1bmNoZXJEaXIsIGxkaXIuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcGRpciA9IFN5c3RlbTo6Z2V0KCktPmdldFByb2dyYW1EaXJlY3RvcnkoKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xhdW5jaGVyRGlyLCBwZGlyLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGhkaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRIb21lRGlyZWN0b3J5KCk7CisgICAgRVhQRUNUX1NUUkVRKGtIb21lRGlyLCBoZGlyLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGFkaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRBcHBEYXRhRGlyZWN0b3J5KCk7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgRVhQRUNUX1RSVUUoYWRpci5lbXB0eSgpKTsKKyNlbHNlCisgICAgLy8gTWFjIE9TIFgsIE1pY3Jvc29mdCBXaW5kb3dzCisgICAgRVhQRUNUX1NUUkVRKGtBcHBEYXRhRGlyLCBhZGlyLmNfc3RyKCkpOworI2VuZGlmICAvLyBfX2xpbnV4X18KK30KKworLy8gVGVzdHMgY2FzZSB3aGVyZSBwcm9ncmFtIGRpcmVjdG9yeSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBsYXVuY2hlciBkaXJlY3RvcnkKKy8vIChRRU1VMikKK1RFU1QoVGVzdFN5c3RlbSwgZ2V0RGlyZWN0b3J5UHJvZ3JhbURpcikgeworICAgIGNvbnN0IGNoYXIga0xhdW5jaGVyRGlyW10gPSAiL2Zvby9iYXIiOworICAgIGNvbnN0IGNoYXIga1Byb2dyYW1EaXJbXSA9ICJxZW11L29zLWFyY2giOworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhrTGF1bmNoZXJEaXIsIDMyLCAiL2hvbWUiLCAiL2FwcCIpOworICAgIHRlc3RTeXMuc2V0UHJvZ3JhbVN1YkRpcihrUHJvZ3JhbURpcik7CisKKyAgICBzdGQ6OnN0cmluZyBsZGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xhdW5jaGVyRGlyLCBsZGlyLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHBkaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRQcm9ncmFtRGlyZWN0b3J5KCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKCIvZm9vL2JhclxccWVtdS9vcy1hcmNoIiwgcGRpci5jX3N0cigpKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKCIvZm9vL2Jhci9xZW11L29zLWFyY2giLCBwZGlyLmNfc3RyKCkpOworI2VuZGlmCit9CisKK1RFU1QoU3lzdGVtLCBnZXRIb3N0Qml0bmVzcykgeworICAgIGludCBob3N0Qml0bmVzcyA9IFN5c3RlbTo6Z2V0KCktPmdldEhvc3RCaXRuZXNzKCk7CisgICAgTE9HKElORk8pIDw8ICJIb3N0IGJpdG5lc3M6ICIgPDwgaG9zdEJpdG5lc3M7CisgICAgRVhQRUNUX1RSVUUoaG9zdEJpdG5lc3MgPT0gMzIgfHwgaG9zdEJpdG5lc3MgPT0gNjQpOworCisgICAgeworICAgICAgICBUZXN0U3lzdGVtIHN5c1Rlc3QoIi9mb28iLCAzMik7CisgICAgICAgIEVYUEVDVF9FUSgzMiwgU3lzdGVtOjpnZXQoKS0+Z2V0SG9zdEJpdG5lc3MoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgVGVzdFN5c3RlbSBzeXNUZXN0KCIvZm9vNjQiLCA2NCk7CisgICAgICAgIEVYUEVDVF9FUSg2NCwgU3lzdGVtOjpnZXQoKS0+Z2V0SG9zdEJpdG5lc3MoKSk7CisgICAgfQorfQorCitURVNUKFN5c3RlbSwgZ2V0UHJvZ3JhbUJpdG5lc3MpIHsKKyAgICBjb25zdCBpbnQga0V4cGVjdGVkID0gKHNpemVvZih2b2lkKikgPT0gOCkgPyA2NCA6IDMyOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWQsIFN5c3RlbTo6Z2V0KCktPmdldFByb2dyYW1CaXRuZXNzKCkpOworfQorCitURVNUKFN5c3RlbSwgc2NhbmREaXJFbnRyaWVzKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFeHBlY3RlZFtdID0geworICAgICAgICAiZmlmdGgiLCAiZmlyc3QiLCAiZm91cnRoIiwgInNlY29uZCIsICJzaXh0aCIsICJ0aGlyZCIKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrSW5wdXRbXSA9IHsKKyAgICAgICAgImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCIsICJmb3VydGgiLCAiZmlmdGgiLCAic2l4dGgiCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0NvdW50ID0gQVJSQVlMRU4oa0lucHV0KTsKKworICAgIFRlc3RUZW1wRGlyIG15RGlyKCJzY2FuRGlyRW50cmllcyIpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgbWFrZV9zdWJmaWxlKG15RGlyLnBhdGgoKSwga0lucHV0W25dKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW50cmllcyA9CisgICAgICAgICAgICBTeXN0ZW06OmdldCgpLT5zY2FuRGlyRW50cmllcyhteURpci5wYXRoKCkpOworCisgICAgRVhQRUNUX0VRKGtDb3VudCwgZW50cmllcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtFeHBlY3RlZFtuXSwgZW50cmllc1tuXS5jX3N0cigpKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU3lzdGVtLCBlbnZHZXRBbmRTZXQpIHsKKyAgICBTeXN0ZW0qIHN5cyA9IFN5c3RlbTo6Z2V0KCk7CisgICAgY29uc3QgY2hhciBrVmFyTmFtZVtdID0gIkZPT19CQVJfVEVTVElOR19TVFVGRiI7CisgICAgY29uc3QgY2hhciBrVmFyVmFsdWVbXSA9ICJTb21ldGhpbmdDb21wbGV0ZWx5UmFuZG9tRm9yWW91ISI7CisKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5lbnZUZXN0KGtWYXJOYW1lKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBzeXMtPmVudkdldChrVmFyTmFtZSkuY19zdHIoKSk7CisgICAgc3lzLT5lbnZTZXQoa1Zhck5hbWUsIGtWYXJWYWx1ZSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5lbnZUZXN0KGtWYXJOYW1lKSk7CisgICAgRVhQRUNUX1NUUkVRKGtWYXJWYWx1ZSwgc3lzLT5lbnZHZXQoa1Zhck5hbWUpLmNfc3RyKCkpOworICAgIHN5cy0+ZW52U2V0KGtWYXJOYW1lLCBudWxscHRyKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5lbnZUZXN0KGtWYXJOYW1lKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBzeXMtPmVudkdldChrVmFyTmFtZSkuY19zdHIoKSk7Cit9CisKK1RFU1QoU3lzdGVtLCBwYXRoSXNEaXIpIHsKKyAgICBUZXN0U3lzdGVtIHN5cygiL2JpbiIsIDMyKTsKKworICAgIEVYUEVDVF9GQUxTRShzeXMucGF0aElzRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN5cy5wYXRoSXNEaXIoImZvby8iKSk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX0ZBTFNFKHN5cy5wYXRoSXNEaXIoImZvb1xcIikpOworI2VuZGlmCisKKyAgICBzeXMuZ2V0VGVtcFJvb3QoKS0+bWFrZVN1YkRpcigiZm9vIik7CisKKyAgICBFWFBFQ1RfVFJVRShzeXMucGF0aElzRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLnBhdGhJc0RpcigiZm9vLyIpKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBFWFBFQ1RfVFJVRShzeXMucGF0aElzRGlyKCJmb29cXCIpKTsKKyNlbmRpZgorfQorCitURVNUKFN5c3RlbSwgcGF0aE9wZXJhdGlvbnMpIHsKKyAgICBTeXN0ZW0qIHN5cyA9IFN5c3RlbTo6Z2V0KCk7CisgICAgVGVzdFRlbXBEaXIgdGVtcERpcigicGF0aF9vcHRzIik7CisgICAgc3RkOjpzdHJpbmcgZm9vUGF0aCA9IHRlbXBEaXIucGF0aCgpOworICAgIGZvb1BhdGggKz0gIi9mb28iOworICAgIFN5c3RlbTo6RmlsZVNpemUgZmlsZVNpemU7CisKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoRXhpc3RzKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoSXNGaWxlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoSXNEaXIoZm9vUGF0aCkpOworICAgIEVYUEVDVF9GQUxTRShzeXMtPnBhdGhDYW5SZWFkKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoQ2FuV3JpdGUoZm9vUGF0aCkpOworICAgIEVYUEVDVF9GQUxTRShzeXMtPnBhdGhDYW5FeGVjKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoRmlsZVNpemUoZm9vUGF0aCwgJmZpbGVTaXplKSk7CisKKyAgICBtYWtlX3N1YmZpbGUodGVtcERpci5wYXRoKCksICJmb28iKTsKKworICAgIEVYUEVDVF9UUlVFKHN5cy0+cGF0aEV4aXN0cyhmb29QYXRoKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoSXNGaWxlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoSXNEaXIoZm9vUGF0aCkpOworCisgICAgLy8gTk9URTogV2luZG93cyBkb2Vzbid0IGhhdmUgJ2V4ZWN1dGUnIHBlcm1pc3Npb24gYml0cy4KKyAgICAvLyBBbnkgcmVhZGFibGUgZmlsZSBjYW4gYmUgZXhlY3V0ZWQuIEFsc28gYW55IHdyaXRhYmxlIGZpbGUKKyAgICAvLyBpcyByZWFkYWJsZS4KKyAgICBFWFBFQ1RfRkFMU0UoSEFORExFX0VJTlRSKGNobW9kKGZvb1BhdGguY19zdHIoKSwgU19JUlVTUnxTX0lXVVNSfFNfSVhVU1IpKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuUmVhZChmb29QYXRoKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuV3JpdGUoZm9vUGF0aCkpOworICAgIEVYUEVDVF9UUlVFKHN5cy0+cGF0aENhbkV4ZWMoZm9vUGF0aCkpOworCisgICAgRVhQRUNUX0ZBTFNFKEhBTkRMRV9FSU5UUihjaG1vZChmb29QYXRoLmNfc3RyKCksIFNfSVJVU1IpKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuUmVhZChmb29QYXRoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhbldyaXRlKGZvb1BhdGgpKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5FeGVjKGZvb1BhdGgpKTsKKyNlbHNlCisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhbkV4ZWMoZm9vUGF0aCkpOworI2VuZGlmCisKKyAgICBFWFBFQ1RfRkFMU0UoSEFORExFX0VJTlRSKGNobW9kKGZvb1BhdGguY19zdHIoKSwgU19JV1VTUikpKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5SZWFkKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5Xcml0ZShmb29QYXRoKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuRXhlYyhmb29QYXRoKSk7CisjZWxzZQorICAgIEVYUEVDVF9GQUxTRShzeXMtPnBhdGhDYW5SZWFkKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5Xcml0ZShmb29QYXRoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhbkV4ZWMoZm9vUGF0aCkpOworI2VuZGlmCisKKyAgICBFWFBFQ1RfRkFMU0UoSEFORExFX0VJTlRSKGNobW9kKGZvb1BhdGguY19zdHIoKSwgU19JWFVTUikpKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5SZWFkKGZvb1BhdGgpKTsKKyNlbHNlCisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhblJlYWQoZm9vUGF0aCkpOworI2VuZGlmCisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhbldyaXRlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5FeGVjKGZvb1BhdGgpKTsKKworICAgIEVYUEVDVF9GQUxTRShIQU5ETEVfRUlOVFIoY2htb2QoZm9vUGF0aC5jX3N0cigpLCBTX0lSVVNSfFNfSVdVU1IpKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuUmVhZChmb29QYXRoKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuV3JpdGUoZm9vUGF0aCkpOworI2lmZGVmIF9XSU4zMgorICAgIEVYUEVDVF9UUlVFKHN5cy0+cGF0aENhbkV4ZWMoZm9vUGF0aCkpOworI2Vsc2UKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoQ2FuRXhlYyhmb29QYXRoKSk7CisjZW5kaWYKKworICAgIEVYUEVDVF9GQUxTRShIQU5ETEVfRUlOVFIoY2htb2QoZm9vUGF0aC5jX3N0cigpLCBTX0lSVVNSfFNfSVhVU1IpKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuUmVhZChmb29QYXRoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN5cy0+cGF0aENhbldyaXRlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5FeGVjKGZvb1BhdGgpKTsKKworICAgIEVYUEVDVF9GQUxTRShIQU5ETEVfRUlOVFIoY2htb2QoZm9vUGF0aC5jX3N0cigpLCBTX0lXVVNSfFNfSVhVU1IpKSk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoQ2FuUmVhZChmb29QYXRoKSk7CisjZWxzZQorICAgIEVYUEVDVF9GQUxTRShzeXMtPnBhdGhDYW5SZWFkKGZvb1BhdGgpKTsKKyNlbmRpZgorICAgIEVYUEVDVF9UUlVFKHN5cy0+cGF0aENhbldyaXRlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhDYW5FeGVjKGZvb1BhdGgpKTsKKworICAgIEVYUEVDVF9GQUxTRShzeXMtPnBhdGhGaWxlU2l6ZShmb29QYXRoLCBudWxscHRyKSk7CisgICAgRVhQRUNUX1RSVUUoc3lzLT5wYXRoRmlsZVNpemUoZm9vUGF0aCwgJmZpbGVTaXplKSk7CisgICAgRVhQRUNUX0VRKDAsIGZpbGVTaXplKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gZm9vRmlsZShmb29QYXRoKTsKKyAgICBBU1NFUlRfVFJVRShib29sKGZvb0ZpbGUpKTsKKyAgICBmb29GaWxlIDw8ICJTb21lIG5vbi16ZXJvIGRhdGEiOworICAgIGZvb0ZpbGUuY2xvc2UoKTsKKyAgICBFWFBFQ1RfVFJVRShzeXMtPnBhdGhGaWxlU2l6ZShmb29QYXRoLCAmZmlsZVNpemUpKTsKKyAgICBFWFBFQ1RfTFQoMCwgZmlsZVNpemUpOworCisgICAgLy8gVGVzdCBmaWxlIGRlbGV0aW9uCisgICAgRVhQRUNUX1RSVUUoc3lzLT5kZWxldGVGaWxlKGZvb1BhdGgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3lzLT5wYXRoRmlsZVNpemUoZm9vUGF0aCwgJmZpbGVTaXplKSk7Cit9CisKK1RFU1QoU3lzdGVtLCBzY2FuRGlyRW50cmllc1dpdGhGdWxsUGF0aHMpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0V4cGVjdGVkW10gPSB7CisgICAgICAgICJmaWZ0aCIsICJmaXJzdCIsICJmb3VydGgiLCAic2Vjb25kIiwgInNpeHRoIiwgInRoaXJkIgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtJbnB1dFtdID0geworICAgICAgICAiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCIsICJzaXh0aCIKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSBBUlJBWUxFTihrSW5wdXQpOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInNjYW5EaXJFbnRyaWVzRnVsbCIpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgbWFrZV9zdWJmaWxlKG15RGlyLnBhdGgoKSwga0lucHV0W25dKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW50cmllcyA9CisgICAgICAgICAgICBTeXN0ZW06OmdldCgpLT5zY2FuRGlyRW50cmllcyhteURpci5wYXRoKCksIHRydWUpOworCisgICAgRVhQRUNUX0VRKGtDb3VudCwgZW50cmllcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQobXlEaXIucGF0aCgpKTsKKyAgICAgICAgZXhwZWN0ZWQgPSBQYXRoVXRpbHM6OmFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKGV4cGVjdGVkKTsKKyAgICAgICAgZXhwZWN0ZWQgKz0ga0V4cGVjdGVkW25dOworICAgICAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWQuY19zdHIoKSwgZW50cmllc1tuXS5jX3N0cigpKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoU3lzdGVtLCBpc1JlbW90ZVNlc3Npb24pIHsKKyAgICBzdGQ6OnN0cmluZyBzZXNzaW9uVHlwZTsKKyAgICBib29sIGlzUmVtb3RlID0gU3lzdGVtOjpnZXQoKS0+aXNSZW1vdGVTZXNzaW9uKCZzZXNzaW9uVHlwZSk7CisgICAgaWYgKGlzUmVtb3RlKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiUmVtb3RlIHNlc3Npb24gdHlwZSBbIiA8PCBzZXNzaW9uVHlwZS5jX3N0cigpIDw8ICJdIjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coSU5GTykgPDwgIkxvY2FsIHNlc3Npb24gdHlwZSI7CisgICAgfQorfQorCitURVNUKFN5c3RlbSwgYWRkTGlicmFyeVNlYXJjaERpcikgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiL2Zvby9iYXIiLCAzMik7CisgICAgVGVzdFRlbXBEaXIqIHRlc3REaXIgPSB0ZXN0U3lzLmdldFRlbXBSb290KCk7CisgICAgQVNTRVJUX1RSVUUodGVzdERpci0+bWFrZVN1YkRpcigibGliIikpOworICAgIHRlc3RTeXMuYWRkTGlicmFyeVNlYXJjaERpcigibGliIik7Cit9CisKK1RFU1QoU3lzdGVtLCBmaW5kQnVuZGxlZEV4ZWN1dGFibGUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrUHJvZ3JhbUZpbGVbXSA9ICJteXByb2dyYW0uZXhlIjsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIga1Byb2dyYW1GaWxlW10gPSAibXlwcm9ncmFtIjsKKyNlbmRpZgorCisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCIvZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIEFTU0VSVF9UUlVFKHRlc3REaXItPm1ha2VTdWJEaXIoImZvbyIpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYXRoTGlzdDsKKyAgICBwYXRoTGlzdC5wdXNoX2JhY2soc3RkOjpzdHJpbmcoImZvbyIpKTsKKyAgICBwYXRoTGlzdC5wdXNoX2JhY2soc3RkOjpzdHJpbmcoU3lzdGVtOjprQmluU3ViRGlyKSk7CisgICAgQVNTRVJUX1RSVUUodGVzdERpci0+bWFrZVN1YkRpcihQYXRoVXRpbHM6OnJlY29tcG9zZShwYXRoTGlzdCkuY19zdHIoKSkpOworCisgICAgcGF0aExpc3QucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGtQcm9ncmFtRmlsZSkpOworICAgIHN0ZDo6c3RyaW5nIHByb2dyYW1QYXRoID0gUGF0aFV0aWxzOjpyZWNvbXBvc2UocGF0aExpc3QpOworICAgIG1ha2Vfc3ViZmlsZSh0ZXN0RGlyLT5wYXRoKCksIHByb2dyYW1QYXRoLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IHRlc3RTeXMuZmluZEJ1bmRsZWRFeGVjdXRhYmxlKCJteXByb2dyYW0iKTsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZFBhdGgoIi8iKTsKKyAgICBleHBlY3RlZFBhdGggKz0gcHJvZ3JhbVBhdGg7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkUGF0aC5jX3N0cigpLCBwYXRoLmNfc3RyKCkpOworCisgICAgcGF0aCA9IHRlc3RTeXMuZmluZEJ1bmRsZWRFeGVjdXRhYmxlKCJvdGhlcnByb2dyYW0iKTsKKyAgICBFWFBFQ1RfRkFMU0UocGF0aC5zaXplKCkpOworfQorCitURVNUKFN5c3RlbSwgZ2V0UHJvY2Vzc1RpbWVzKSB7CisgICAgY29uc3QgU3lzdGVtOjpUaW1lcyB0aW1lczEgPSBTeXN0ZW06OmdldCgpLT5nZXRQcm9jZXNzVGltZXMoKTsKKyAgICBjb25zdCBTeXN0ZW06OlRpbWVzIHRpbWVzMiA9IFN5c3RlbTo6Z2V0KCktPmdldFByb2Nlc3NUaW1lcygpOworICAgIEFTU0VSVF9HRSh0aW1lczIudXNlck1zLCB0aW1lczEudXNlck1zKTsKKyAgICBBU1NFUlRfR0UodGltZXMyLnN5c3RlbU1zLCB0aW1lczEuc3lzdGVtTXMpOworfQorCitURVNUKFN5c3RlbSwgZ2V0VW5peFRpbWUpIHsKKyAgICBjb25zdCB0aW1lX3QgY3VyVGltZSA9IHRpbWUoTlVMTCk7CisgICAgY29uc3QgdGltZV90IHRpbWUxID0gU3lzdGVtOjpnZXQoKS0+Z2V0VW5peFRpbWUoKTsKKyAgICBjb25zdCB0aW1lX3QgdGltZTIgPSBTeXN0ZW06OmdldCgpLT5nZXRVbml4VGltZSgpOworICAgIEFTU0VSVF9HRSh0aW1lMSwgY3VyVGltZSk7CisgICAgQVNTRVJUX0dFKHRpbWUyLCB0aW1lMSk7Cit9CisKK1RFU1QoU3lzdGVtLCBydW5Db21tYW5kVHJ1ZSkgeworI2lmbmRlZiBfV0lOMzIKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kID0geyJscyJ9OworI2Vsc2UKKyAgICAvLyAndmVyJyBpcyBhIGJ1aWx0aW4gY29tbWFuZCwgc28gYWxsIHlvdSBuZWVkIGlzIGEgc2FuZSBjbWQuZXhlCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZCA9IHsiY21kLmV4ZSIsICIvQyIsICJ2ZXIifTsKKyNlbmRpZgorCisgICAgRVhQRUNUX1RSVUUoU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZChjbWQpKTsKKyAgICBFWFBFQ1RfVFJVRShTeXN0ZW06OmdldCgpLT5ydW5Db21tYW5kKGNtZCwgUnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24pKTsKKworICAgIFN5c3RlbTo6UGlkIHBpZCA9IDA7CisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdENvZGUgPSA2NjY7CisgICAgRVhQRUNUX1RSVUUoU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZChjbWQsIFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjprSW5maW5pdGUsICZleGl0Q29kZSwgJnBpZCkpOworICAgIEVYUEVDVF9FUSgwLCBleGl0Q29kZSk7CisgICAgRVhQRUNUX0dUKHBpZCwgMCk7Cit9CisKK1RFU1QoU3lzdGVtLCBydW5Db21tYW5kVGltZW91dCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kID0geyJzbGVlcCIsICIwLjEifTsKKyNlbHNlCisgICAgLy8gMiBBdHRlbXB0cyBnaXZlIHVzIGEgZGVsYXkgb2YgMSBzZWNvbmQuCisgICAgLy8gJ3BpbmcnIGlzIG5vdCBhbiBpbnRlcm5hbCBjbWQuZXhlIGNvbW1hbmQsIGJ1dCBzZWVtcyBhbHdheXMgYmVpbmcgc2hpcHBlZAorICAgIC8vIG9uIHJlY2VudCB3aW5kb3dzIGJveGVzIGFuZCB3aW5lLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWQgPSB7InBpbmciLCAiLW4iLCAiMiIsICIxMjcuMC4wLjEifTsKKyNlbmRpZgorCisgICAgRVhQRUNUX0ZBTFNFKAorICAgICAgICAgICAgU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZChjbWQsIFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uLCAxKSk7CisKKyAgICBTeXN0ZW06OlBpZCBwaWQgPSAwOworICAgIFN5c3RlbTo6UHJvY2Vzc0V4aXRDb2RlIGV4aXRDb2RlID0gNjY2OworI2lmZGVmIF9XSU4zMgorICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCB3YWl0IGZvciB0b28gbG9uZyBoZXJlLCB3aGVyZSB3ZSBleHBlY3QgdG8gc3VjY2VlZC4KKyAgICBjbWQgPSB7ImNtZC5leGUiLCAiL0MiLCAidmVyIn07CisjZW5kaWYKKyAgICBFWFBFQ1RfVFJVRShTeXN0ZW06OmdldCgpLT5ydW5Db21tYW5kKGNtZCwgUnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OmtJbmZpbml0ZSwgJmV4aXRDb2RlLCAmcGlkKSk7CisgICAgRVhQRUNUX0VRKDAsIGV4aXRDb2RlKTsKKyAgICBFWFBFQ1RfR1QocGlkLCAwKTsKK30KKworVEVTVChTeXN0ZW0sIERJU0FCTEVEX3J1bkNvbW1hbmRXaXRoT3V0cHV0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZCA9IHsiZWNobyIsICJoZWxsbyJ9OworICAgIFN5c3RlbTo6UGlkIHBpZCA9IDY2NjsKKyAgICBTeXN0ZW06OlByb2Nlc3NFeGl0Q29kZSBleGl0Q29kZSA9IDA7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZSA9IFBhdGhVdGlsczo6cmVjb21wb3NlKAorICAgICAgICAgICAge1N5c3RlbTo6Z2V0KCktPmdldFRlbXBEaXIoKSwgc3RkOjpzdHJpbmcoInRlc3QudHh0Iil9KTsKKworICAgIEVYUEVDVF9UUlVFKFN5c3RlbTo6Z2V0KCktPnJ1bkNvbW1hbmQoCisgICAgICAgICAgICBjbWQsIFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uIHwgUnVuT3B0aW9uczo6RHVtcE91dHB1dFRvRmlsZSwKKyAgICAgICAgICAgIFN5c3RlbTo6a0luZmluaXRlLCAmZXhpdENvZGUsICZwaWQsIG91dHB1dEZpbGUpKTsKKworICAgIEVYUEVDVF9UUlVFKFN5c3RlbTo6Z2V0KCktPnBhdGhFeGlzdHMob3V0cHV0RmlsZSkpOworICAgIEVYUEVDVF9UUlVFKFN5c3RlbTo6Z2V0KCktPnBhdGhJc0ZpbGUob3V0cHV0RmlsZSkpOworICAgIEVYUEVDVF9UUlVFKFN5c3RlbTo6Z2V0KCktPnBhdGhDYW5SZWFkKG91dHB1dEZpbGUpKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZmlsZShvdXRwdXRGaWxlKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlLmlzX29wZW4oKSk7CisKKyAgICBpZiAoZmlsZS5pc19vcGVuKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdGljX2Nhc3Q8Ym9vbD4oc3RkOjpnZXRsaW5lKGZpbGUsIGxpbmUpKSk7CisKKyAgICAgICAgLy8gQW4gaWRvc3luY3Jhc3kgb2YgY21kLmV4ZSdzICJlY2hvIiBjb21tYW5kIC0gd2UgYWRkIHNwYWNlcyBiZXR3ZWVuCisgICAgICAgIC8vIGFyZ3VtZW50cywgYW5kIHRoYXQgc3BhY2UgZ2V0cyBjYXB0dXJlZCBieSBlY2hvLiBUaGlzIGlzIG9ubHkgYQorICAgICAgICAvLyBwcm9ibGVtIHdpdGggZWNobyBpdHNlbGYuCisgICAgICAgIEVYUEVDVF9UUlVFKCFzdHJuY21wKCJoZWxsbyIsIGxpbmUuY19zdHIoKSwgNSkpOworCisgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpyZW1vdmUob3V0cHV0RmlsZS5jX3N0cigpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRmZmQxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5jcHAKQEAgLTAsMCArMSwyNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitXaW4zMlVuaWNvZGVTdHJpbmc6OldpbjMyVW5pY29kZVN0cmluZygpIDogbVN0cihudWxscHRyKSwgbVNpemUoMHUpIHt9CisKK1dpbjMyVW5pY29kZVN0cmluZzo6V2luMzJVbmljb2RlU3RyaW5nKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbikKKyAgICA6IG1TdHIobnVsbHB0ciksIG1TaXplKDB1KSB7CisgICAgcmVzZXQoU3RyaW5nVmlldyhzdHIsIGxlbikpOworfQorCitXaW4zMlVuaWNvZGVTdHJpbmc6OldpbjMyVW5pY29kZVN0cmluZyhTdHJpbmdWaWV3IHN0cikKKyAgICA6IG1TdHIobnVsbHB0ciksIG1TaXplKDB1KSB7CisgICAgcmVzZXQoc3RyKTsKK30KKworV2luMzJVbmljb2RlU3RyaW5nOjpXaW4zMlVuaWNvZGVTdHJpbmcoc2l6ZV90IHNpemUpIDogbVN0cihudWxscHRyKSwgbVNpemUoMHUpIHsKKyAgICByZXNpemUoc2l6ZSk7Cit9CisKK1dpbjMyVW5pY29kZVN0cmluZzo6V2luMzJVbmljb2RlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHN0cikKKyAgICA6IG1TdHIobnVsbHB0ciksIG1TaXplKDB1KSB7CisgICAgc2l6ZV90IGxlbiA9IHN0ciA/IHdjc2xlbihzdHIpIDogMHU7CisgICAgcmVzaXplKGxlbik7CisgICAgOjptZW1jcHkobVN0ciwgc3RyID8gc3RyIDogTCIiLCBsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworfQorCitXaW4zMlVuaWNvZGVTdHJpbmc6OldpbjMyVW5pY29kZVN0cmluZyhjb25zdCBXaW4zMlVuaWNvZGVTdHJpbmcmIG90aGVyKQorICAgIDogbVN0cihudWxscHRyKSwgbVNpemUoMHUpIHsKKyAgICByZXNpemUob3RoZXIubVNpemUpOworICAgIDo6bWVtY3B5KG1TdHIsIG90aGVyLmNfc3RyKCksIG90aGVyLm1TaXplICogc2l6ZW9mKHdjaGFyX3QpKTsKK30KKworV2luMzJVbmljb2RlU3RyaW5nOjp+V2luMzJVbmljb2RlU3RyaW5nKCkgeworICAgIGRlbGV0ZVtdIG1TdHI7Cit9CisKK1dpbjMyVW5pY29kZVN0cmluZyYgV2luMzJVbmljb2RlU3RyaW5nOjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IFdpbjMyVW5pY29kZVN0cmluZyYgb3RoZXIpIHsKKyAgICByZXNpemUob3RoZXIubVNpemUpOworICAgIDo6bWVtY3B5KG1TdHIsIG90aGVyLmNfc3RyKCksIG90aGVyLm1TaXplICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1dpbjMyVW5pY29kZVN0cmluZyYgV2luMzJVbmljb2RlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3Qgd2NoYXJfdCogc3RyKSB7CisgICAgc2l6ZV90IGxlbiA9IHN0ciA/IHdjc2xlbihzdHIpIDogMHU7CisgICAgcmVzaXplKGxlbik7CisgICAgOjptZW1jcHkobVN0ciwgc3RyID8gc3RyIDogTCIiLCBsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworICAgIHJldHVybiAqdGhpczsKK30KKword2NoYXJfdCogV2luMzJVbmljb2RlU3RyaW5nOjpkYXRhKCkgeworICAgIGlmICghbVN0cikgeworICAgICAgICAvLyBFbnN1cmUgdGhlIGZ1bmN0aW9uIG5ldmVyIHJldHVybnMgTlVMTC4KKyAgICAgICAgLy8gaXQgaXMgc2FmZSB0byBjb25zdF9jYXN0IHRoZSBwb2ludGVyIGhlcmUgLSB1c2VyIGlzbid0IGFsbG93ZWQgdG8KKyAgICAgICAgLy8gd3JpdGUgaW50byBpdCBhbnl3YXkKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8d2NoYXJfdCo+KEwiIik7CisgICAgfQorICAgIHJldHVybiBtU3RyOworfQorCitzdGQ6OnN0cmluZyBXaW4zMlVuaWNvZGVTdHJpbmc6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBjb252ZXJ0VG9VdGY4KG1TdHIsIG1TaXplKTsKK30KKwordm9pZCBXaW4zMlVuaWNvZGVTdHJpbmc6OnJlc2V0KGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IGxlbikgeworICAgIGlmIChtU3RyKSB7CisgICAgICAgIGRlbGV0ZVtdIG1TdHI7CisgICAgfQorICAgIGNvbnN0IGludCB1dGYxNkxlbiA9IGNhbGNVdGYxNkJ1ZmZlckxlbmd0aChzdHIsIGxlbik7CisgICAgbVN0ciA9IG5ldyB3Y2hhcl90W3V0ZjE2TGVuICsgMV07CisgICAgbVNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHV0ZjE2TGVuKTsKKyAgICBjb252ZXJ0RnJvbVV0ZjgobVN0ciwgdXRmMTZMZW4sIHN0ciwgbGVuKTsKKyAgICBtU3RyW21TaXplXSA9IEwnXDAnOworfQorCit2b2lkIFdpbjMyVW5pY29kZVN0cmluZzo6cmVzZXQoU3RyaW5nVmlldyBzdHIpIHsKKyAgICByZXNldChzdHIuY19zdHIoKSwgc3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgV2luMzJVbmljb2RlU3RyaW5nOjpyZXNpemUoc2l6ZV90IG5ld1NpemUpIHsKKyAgICBpZiAobmV3U2l6ZSA9PSAwKSB7CisgICAgICAgIGRlbGV0ZSBbXSBtU3RyOworICAgICAgICBtU3RyID0gbnVsbHB0cjsKKyAgICAgICAgbVNpemUgPSAwOworICAgIH0gZWxzZSBpZiAobmV3U2l6ZSA8PSBtU2l6ZSkgeworICAgICAgICBtU3RyW25ld1NpemVdID0gMDsKKyAgICAgICAgbVNpemUgPSBuZXdTaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHdjaGFyX3QqIG9sZFN0ciA9IG1TdHI7CisgICAgICAgIG1TdHIgPSBuZXcgd2NoYXJfdFtuZXdTaXplICsgMXVdOworICAgICAgICBzaXplX3QgY29weVNpemUgPSBzdGQ6Om1pbihuZXdTaXplLCBtU2l6ZSk7CisgICAgICAgIDo6bWVtY3B5KG1TdHIsIG9sZFN0ciA/IG9sZFN0ciA6IEwiIiwgY29weVNpemUgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgICBtU3RyW2NvcHlTaXplXSA9IEwnXDAnOworICAgICAgICBtU3RyW25ld1NpemVdID0gTCdcMCc7CisgICAgICAgIG1TaXplID0gbmV3U2l6ZTsKKyAgICAgICAgZGVsZXRlW10gb2xkU3RyOworICAgIH0KK30KKwordm9pZCBXaW4zMlVuaWNvZGVTdHJpbmc6OmFwcGVuZChjb25zdCB3Y2hhcl90KiBzdHIpIHsKKyAgICBhcHBlbmQoc3RyLCB3Y3NsZW4oc3RyKSk7Cit9CisKK3ZvaWQgV2luMzJVbmljb2RlU3RyaW5nOjphcHBlbmQoY29uc3Qgd2NoYXJfdCogc3RyLCBzaXplX3QgbGVuKSB7CisgICAgLy8gTk9URTogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHJhcmVseSB1c2VkLCBzbyBkb24ndCB0cnkgdG8gb3B0aW1pemUKKyAgICAvLyBzdG9yYWdlIHdpdGggbGFyZ2VyIGNhcGFjaXR5IHZhbHVlcyBhbmQgZXhwb25lbnRpYWwgaW5jcmVtZW50cy4KKyAgICBpZiAoIXN0ciB8fCAhbGVuKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IG9sZFNpemUgPSBzaXplKCk7CisgICAgcmVzaXplKG9sZFNpemUgKyBsZW4pOworICAgIG1lbW1vdmUobVN0ciArIG9sZFNpemUsIHN0ciwgbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKK30KKwordm9pZCBXaW4zMlVuaWNvZGVTdHJpbmc6OmFwcGVuZChjb25zdCBXaW4zMlVuaWNvZGVTdHJpbmcmIG90aGVyKSB7CisgICAgYXBwZW5kKG90aGVyLmNfc3RyKCksIG90aGVyLnNpemUoKSk7Cit9CisKK3djaGFyX3QqIFdpbjMyVW5pY29kZVN0cmluZzo6cmVsZWFzZSgpIHsKKyAgICB3Y2hhcl90KiByZXN1bHQgPSBtU3RyOworICAgIG1TdHIgPSBudWxscHRyOworICAgIG1TaXplID0gMHU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgoY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbGVuKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGNvbnN0IGludCB1dGY4TGVuID0gY2FsY1V0ZjhCdWZmZXJMZW5ndGgoc3RyLCBsZW4pOworICAgIGlmICh1dGY4TGVuID4gMCkgeworICAgICAgICByZXN1bHQucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4odXRmOExlbikpOworICAgICAgICBjb252ZXJ0VG9VdGY4KCZyZXN1bHRbMF0sIHV0ZjhMZW4sIHN0ciwgbGVuKTsKKyAgICAgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICAgICAgcmVzdWx0LnJlc2l6ZSh1dGY4TGVuIC0gMSk7ICAvLyBnZXQgcmlkIG9mIHRoZSBudWxsLXRlcm1pbmF0b3IKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyByZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBXaW4zMlVuaWNvZGVTdHJpbmcgcHVibGljIGNvbnZlcnNpb24gZnVuY3Rpb24KKy8vIGZyb20gYSBXaW5BUEkgY29udmVyc2lvbiBmdW5jdGlvbiByZXR1cm5lZCBjb2RlCitzdGF0aWMgaW50IGNvbnZlcnRSZXRWYWwoaW50IHdpbmFwaVJlc3VsdCkgeworICAgIHJldHVybiB3aW5hcGlSZXN1bHQgPyB3aW5hcGlSZXN1bHQgOiAtMTsKK30KKworLy8gc3RhdGljCitpbnQgV2luMzJVbmljb2RlU3RyaW5nOjpjYWxjVXRmOEJ1ZmZlckxlbmd0aChjb25zdCB3Y2hhcl90KiBzdHIsIGludCBsZW4pIHsKKyAgICBpZiAobGVuIDwgMCAmJiBsZW4gIT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGludCB1dGY4TGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAgLy8gQ29kZVBhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGR3RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCAgICAgIC8vIGxwV2lkZUNoYXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgIC8vIGNjaFdpZGVDaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICAvLyBscE11bHRpQnl0ZVN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgLy8gY2JNdWx0aUJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxwRGVmYXVsdENoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7IC8vIGxwVXNlZERlZmF1bHRDaGFyCisKKyAgICByZXR1cm4gY29udmVydFJldFZhbCh1dGY4TGVuKTsKK30KKworLy8gc3RhdGljCitpbnQgV2luMzJVbmljb2RlU3RyaW5nOjpjYWxjVXRmMTZCdWZmZXJMZW5ndGgoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuKSB7CisgICAgaWYgKGxlbiA8IDAgJiYgbGVuICE9IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBpbnQgdXRmMTZMZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsICAvLyBDb2RlUGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGR3RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgICAgICAvLyBscE11bHRpQnl0ZVN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgIC8vIGNiTXVsdGlCeXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAgLy8gbHBXaWRlQ2hhclN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgIC8vIGNjaFdpZGVDaGFyCisKKyAgICByZXR1cm4gY29udmVydFJldFZhbCh1dGYxNkxlbik7Cit9CisKKy8vIHN0YXRpYworaW50IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydFRvVXRmOChjaGFyKiBvdXRTdHIsIGludCBvdXRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IGxlbikgeworICAgIGlmICghb3V0U3RyIHx8IG91dExlbiA8IDAgfHwgIXN0ciB8fCAobGVuIDwgMCAmJiBsZW4gIT0gLTEpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnN0IGludCB1dGY4TGVuID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAgLy8gQ29kZVBhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGR3RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCAgICAgIC8vIGxwV2lkZUNoYXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgIC8vIGNjaFdpZGVDaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0ciwgICAvLyBscE11bHRpQnl0ZVN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRMZW4sICAgLy8gY2JNdWx0aUJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIGxwRGVmYXVsdENoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7IC8vIGxwVXNlZERlZmF1bHRDaGFyCisgICAgcmV0dXJuIGNvbnZlcnRSZXRWYWwodXRmOExlbik7Cit9CisKKy8vIHN0YXRpYworaW50IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydEZyb21VdGY4KHdjaGFyX3QqIG91dFN0ciwgaW50IG91dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsIGludCBsZW4pIHsKKyAgICBpZiAoIW91dFN0ciB8fCBvdXRMZW4gPCAwIHx8ICFzdHIgfHwgKGxlbiA8IDAgJiYgbGVuICE9IC0xKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBpbnQgdXRmMTZMZW4gPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsICAvLyBDb2RlUGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIGR3RmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwgICAgICAvLyBscE11bHRpQnl0ZVN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCAgICAgIC8vIGNiTXVsdGlCeXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHIsICAgLy8gbHBXaWRlQ2hhclN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TGVuKTsgIC8vIGNjaFdpZGVDaGFyCisgICAgcmV0dXJuIGNvbnZlcnRSZXRWYWwodXRmMTZMZW4pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTEwM2UwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oCkBAIC0wLDAgKzEsMTU1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaWZuZGVmIF9XSU4zMgorLy8gdGhpcyBmaWxlIGlzIGp1c3QgZW1wdHkgb24gbm9uLVdpbjMyCisjZWxzZSAgLy8gX1dJTjMyCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8d2NoYXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBIZWxwZXIgY2xhc3MgdXNlZCB0byBtb2RlbCBhIFdpbmRvd3MgVW5pY29kZSBzdHJpbmcsIHdoaWNoIHN0b3JlcworLy8gdGV4dCBhbmQgZmlsZSBwYXRocyBhcyBhIHplcm8tdGVybWluYXRlZCBhcnJheSBvZiBVVEYtMTYgY29kZSBwb2ludHMKKy8vIChhdCBsZWFzdCBzaW5jZSBXaW5kb3dzIFZpc3RhLCBiZWZvcmUgdGhhdCB0aGUgZW5jb2Rpbmcgd2FzIHNsaWdodGx5CisvLyBkaWZmZXJlbnQpLgorLy8KKy8vIFRoaXMgaXMgdmVyeSBpbnRlbnRpb25hbGx5ICpub3QqIGEgZ2VuZXJhbCBwdXJwb3NlIGNsYXNzLiBJdCBzaG91bGQgb25seQorLy8gYmUgdXNlZCB0byBzaW1wbGlmeSBjb252ZXJzaW9ucyBiZXR3ZWVuIHRoZSBXaW4zMiBVbmljb2RlIEFQSSBhbmQgdGhlCisvLyByZXN0IG9mIGFuZHJvaWQ6OmJhc2Ugd2hpY2ggdXNlcyBVVEYtOCBmb3IgYWxsIFVuaWNvZGUgdGV4dC4KK2NsYXNzIFdpbjMyVW5pY29kZVN0cmluZyB7CitwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcoKTsKKworICAgIC8vIEluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2UgZnJvbSBVVEYtOCB0ZXh0IGF0IHxzdHJ8IG9mIHxsZW58IGJ5dGVzLgorICAgIC8vIFRoaXMgZG9lc24ndCB0cnkgdG8gdmFsaWRhdGUgdGhlIGlucHV0LCBpLmUuIG9uIGVycm9yLCB0aGUgaW5zdGFuY2UncworICAgIC8vIGNvbnRlbnQgaXMgdW5kZWZpbmVkLgorICAgIFdpbjMyVW5pY29kZVN0cmluZyhjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pOworCisgICAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGFuIGV4aXN0aW5nIHN0cmluZyBpbnN0YW5jZSB8c3RyfC4KKyAgICBleHBsaWNpdCBXaW4zMlVuaWNvZGVTdHJpbmcoU3RyaW5nVmlldyBzdHIpOworCisgICAgLy8gSW5pdGlhbGl6ZSBieSByZXNlcnZpbmcgZW5vdWdoIHJvb20gZm9yIGEgc3RyaW5nIG9mIHxzaXplfCBVVEYtMTYKKyAgICAvLyBjb2RlcG9pbnRzLgorICAgIGV4cGxpY2l0IFdpbjMyVW5pY29kZVN0cmluZyhzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBJbml0aWFsaXplIGZyb20gYSB6ZXJvLXRlcm1pbmF0ZWQgd2NoYXJfdCBhcnJheS4KKyAgICBleHBsaWNpdCBXaW4zMlVuaWNvZGVTdHJpbmcoY29uc3Qgd2NoYXJfdCogc3RyKTsKKworICAgIC8vIENvcHktY29uc3RydWN0b3IuCisgICAgV2luMzJVbmljb2RlU3RyaW5nKGNvbnN0IFdpbjMyVW5pY29kZVN0cmluZyYgb3RoZXIpOworCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB+V2luMzJVbmljb2RlU3RyaW5nKCk7CisKKyAgICAvLyBBc3NpZ25tZW50IG9wZXJhdG9ycy4KKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBXaW4zMlVuaWNvZGVTdHJpbmcmIG90aGVyKTsKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCB3Y2hhcl90KiBzdHIpOworCisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gZmlyc3Qgd2NoYXJfdCBpbiB0aGUgc3RyaW5nLgorICAgIGNvbnN0IHdjaGFyX3QqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gbVN0ciA/IG1TdHIgOiBMIiI7IH0KKworICAgIC8vIFJldHVybiBwb2ludGVyIHRvIHdyaXRhYmxlIHdjaGFyX3QgYXJyYXkuIFRoaXMgY2FuIG5ldmVyIGJlIE5VTEwKKyAgICAvLyBidXQgbm8gbW9yZSB0aGFuIHNpemUoKSBpdGVtcyBzaG91bGQgYmUgYWNjZXNzZWQuCisgICAgd2NoYXJfdCogZGF0YSgpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgdGhlIHN0cmluZywgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIFVURi0xNiBjb2RlIHBvaW50cworICAgIC8vIHN0b3JlZCBieSB0aGUgc3RyaW5nLCB3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBhY3R1YWwKKyAgICAvLyBVbmljb2RlIGNoYXJhY3RlcnMgaW4gaXQuCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorCisgICAgLy8gQ29udmVydCB0byBhIHN0cmluZyBpbnN0YW5jZSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIFVURi04IHRleHQuCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8vIFJldHVybiBuLXRoIGNoYXJhY3RlciBmcm9tIHN0cmluZy4KKyAgICB3Y2hhcl90IG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtU3RyW2luZGV4XTsgfQorCisgICAgLy8gUmVzZXQgY29udGVudCBmcm9tIFVURi04IHRleHQgYXQgfHN0cnwgb3IgfGxlbnwgYnl0ZXMuCisgICAgdm9pZCByZXNldChjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4pOworCisgICAgLy8gUmVzZXQgY29udGVudCBmcm9tIFVURi04IHRleHQgYXQgfHN0cnwuCisgICAgdm9pZCByZXNldChTdHJpbmdWaWV3IHN0cik7CisKKyAgICAvLyBSZXNpemUgYXJyYXkuCisgICAgdm9pZCByZXNpemUoc2l6ZV90IG5ld1NpemUpOworCisgICAgLy8gQXBwZW5kIGF0IHRoZSBlbmQgb2YgYSBXaW4zMlVuaWNvZGVTdHJpbmcuCisgICAgdm9pZCBhcHBlbmQoY29uc3Qgd2NoYXJfdCogb3RoZXIpOworICAgIHZvaWQgYXBwZW5kKGNvbnN0IHdjaGFyX3QqIG90aGVyLCBzaXplX3QgbGVuKTsKKyAgICB2b2lkIGFwcGVuZChjb25zdCBXaW4zMlVuaWNvZGVTdHJpbmcmIG90aGVyKTsKKworICAgIC8vIFJlbGVhc2UgdGhlIFVuaWNvZGUgc3RyaW5nIGFycmF5IHRvIHRoZSBjYWxsZXIuCisgICAgd2NoYXJfdCogcmVsZWFzZSgpOworCisgICAgLy8gRGlyZWN0bHkgY29udmVydCBhIFVuaWNvZGUgc3RyaW5nIHRvIFVURi04IHRleHQgYW5kIGJhY2suCisgICAgLy8gfGxlbnwgLSBpbnB1dCBsZW5ndGguIGlmIHNldCB0byAtMSwgbWVhbnMgdGhlIGlucHV0IGlzIG51bGwtdGVybWluYXRlZAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0VG9VdGY4KGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IGxlbiA9IC0xKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBCZSBjYXJlZnVsIHdoZW4gY3Jvc3NpbmcgdGhpcyBsaW5lLiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3b3JrIHdpdGgKKyAgICAvLyByYXcgYnVmZmVycyBvZiBzdGF0aWMgbGVuZ3RoLCBhbmQgYXJlIG11Y2ggaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHkuCisgICAgLy8gWW91J3ZlIGJlZW4gd2FybmVkCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZWVkZWQgYnVmZmVyIHNpemUgKGluIGNoYXJhY3RlcnMpIHRvIGNvbnZlcnQgdGhlIHxzdHJ8CisgICAgLy8gcGFyYW1ldGVyIGVpdGhlciB0byBvciBmcm9tIFVURjgKKyAgICAvLyB8bGVufCAtIHNpemUgb2YgdGhlIGlucHV0LiAtMSBtZWFucyBpdCBpcyAwLXRlcm1pbmF0ZWQKKyAgICAvLyBSZXR1cm4gdmFsdWUgaXMgZWl0aGVyIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvIGNvbnZlcnQgdGhlIHdob2xlCisgICAgLy8gaW5wdXQgb2Ygc2l6ZSB8bGVufCwgb3IsIGlmIHxsZW58IGlzIC0xLCB0aGUgc2l6ZSBuZWVkZWQgdG8gY29udmVydCBhCisgICAgLy8gemVyby10ZXJtaW5hdGVkIHN0cmluZywgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdG9yIGNoYXJhY3Rlciwgb3IgbmVnYXRpdmUgLQorICAgIC8vIGlmIHRoZSBzaXplIGNhbid0IGJlIGNhbGN1bGF0ZWQKKyAgICBzdGF0aWMgaW50IGNhbGNVdGY4QnVmZmVyTGVuZ3RoKGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IGxlbiA9IC0xKTsKKyAgICBzdGF0aWMgaW50IGNhbGNVdGYxNkJ1ZmZlckxlbmd0aChjb25zdCBjaGFyKiBzdHIsIGludCBsZW4gPSAtMSk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgY29udmVydCB8c3RyfCBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLCBpbnN0ZWFkCisgICAgLy8gb2YgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNsYXNzIG9iamVjdC4KKyAgICAvLyB8c3RyfCAtIHNvdXJjZSBzdHJpbmcgdG8gY29udmVydCwgbXVzdCBiZSBub3QgbnVsbAorICAgIC8vIHxsZW58IC0gbGVuZ3RoIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLCBpbiBjaGFyczsgbXVzdCBiZSBwb3NpdGl2ZSBvciAtMS4KKyAgICAvLyAgLTEgbWVhbnMgJ3RoZSBpbnB1dCBpcyB6ZXJvLXRlcm1pbmF0ZWQnLiBJbiB0aGF0IGNhc2Ugb3V0cHV0IGhhcyB0bworICAgIC8vICBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHplcm8gY2hhcmFjdGVyIGFzIHdlbGwuCisgICAgLy8gfG91dFN0cnwgLSB0aGUgb3V0cHV0IGJ1ZmZlciwgbXVzdCBiZSBub3QgbnVsbAorICAgIC8vIHxvdXRMZW58IC0gdGhlIG91dHB1dCBidWZmZXIgbGVuZ3RoLCBpbiBjaGFyczsgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8KKyAgICAvLyAgaG9sZCB0aGUgY29udmVydGVkIHN0cmluZy4gT25lIGNhbiBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGxlbmd0aCB1c2luZworICAgIC8vICBvbmUgb2YgdGhlIGdldFV0ZjwqPkJ1ZmZlckxlbmd0aCgpIGZ1bmN0aW9ucworICAgIC8vCisgICAgLy8gUmV0dXJucyBhIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gdGhlIHxvdXRCdWZ8LCBvciAtMSBvbiBmYWlsdXJlCisgICAgLy8KKyAgICAvLyBOb3RlOiB5b3UgY2FuJ3QgZ2V0IHRoZSByZWFzb24gb2YgdGhlIGZhaWx1cmUgZnJvbSB0aGlzIGZ1bmN0aW9uIGNhbGw6CisgICAgLy8gIGl0IGNvdWxkIGJlIGJhZCBpbnB1dCBwYXJhbWV0ZXIgKGUuZy4gbnVsbCBidWZmZXIpLCB0b28gc2hvcnQgb3V0cHV0LAorICAgIC8vICBiYWQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgc3RyaW5nLCBldmVuIE9TIGZhaWx1cmUuIFNvIG1ha2Ugc3VyZQorICAgIC8vICB5b3UgZG8gdGhlIGNhbGwgdG8gZ2V0VXRmPCo+QnVmZmVyTGVuZ3RoKCkgYW5kIGFsbCBwYXJhbWV0ZXJzIGFyZQorICAgIC8vICBjb3JyZWN0IC0gaWYgeW91IG5lZWQgdG8ga25vdyB0aGUgZXhhY3QgcmVhc29uIGFuZCBub3QganVzdCAiY2FuJ3QiIG9uZS4KKyAgICBzdGF0aWMgaW50IGNvbnZlcnRUb1V0ZjgoY2hhciogb3V0U3RyLCBpbnQgb3V0TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogc3RyLCBpbnQgbGVuID0gLTEpOworICAgIHN0YXRpYyBpbnQgY29udmVydEZyb21VdGY4KHdjaGFyX3QqIG91dFN0ciwgaW50IG91dExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyLCBpbnQgbGVuID0gLTEpOworCitwcml2YXRlOgorICAgIHdjaGFyX3QqIG1TdHI7CisgICAgc2l6ZV90IG1TaXplOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX1dJTjMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Mzk2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIyOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKHhbMF0pKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK1RFU1QoV2luMzJVbmljb2RlU3RyaW5nLCBEZWZhdWx0Q29uc3RydWN0b3IpIHsKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc3RyOworICAgIEVYUEVDVF9FUSgwdSwgc3RyLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKEwiIiwgc3RyLmNfc3RyKCkpOworICAgIEVYUEVDVF9UUlVFKHN0ci5kYXRhKCkpOworfQorCitURVNUKFdpbjMyVW5pY29kZVN0cmluZywgQ29uc3RydWN0b3JzKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHV0Zjg7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIHV0ZjE2OworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIHsiIiwgTCIifSwKKyAgICAgICAgICAgIHsiSGVsbG8gV29ybGQhIiwgTCJIZWxsbyBXb3JsZCEifSwKKyAgICAgICAgICAgIHsiVFx4QzNceEE5bFx4QzNceEE5dmlzaW9uIiwgTCJUXHhFOWxceEU5dmlzaW9uIn0sCisgICAgICAgICAgICB7ImZvb1x4RTFceDgwXHg4MCBiYXIiLCBMImZvb1x4MTAwMCBiYXIifSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YVNpemUgPSBBUlJBWV9TSVpFKGtEYXRhKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFTaXplOyArK24pIHsKKyAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIHN0cjEoa0RhdGFbbl0udXRmOCk7CisgICAgICAgIEVYUEVDVF9FUSh3Y3NsZW4oa0RhdGFbbl0udXRmMTYpLCBzdHIxLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS51dGYxNiwgc3RyMS5jX3N0cigpKTsKKworICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc3RyMihrRGF0YVtuXS51dGY4LCBzdHJsZW4oa0RhdGFbbl0udXRmOCkpOworICAgICAgICBFWFBFQ1RfRVEod2NzbGVuKGtEYXRhW25dLnV0ZjE2KSwgc3RyMi5zaXplKCkpOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0udXRmMTYsIHN0cjIuY19zdHIoKSk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgYmFzZVN0cihrRGF0YVtuXS51dGY4KTsKKyAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIHN0cjMoYmFzZVN0cik7CisgICAgICAgIEVYUEVDVF9FUSh3Y3NsZW4oa0RhdGFbbl0udXRmMTYpLCBzdHIzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS51dGYxNiwgc3RyMy5jX3N0cigpKTsKKworICAgICAgICBzaXplX3QgdXRmMTZMZW4gPSB3Y3NsZW4oa0RhdGFbbl0udXRmMTYpOworICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc3RyNChrRGF0YVtuXS51dGYxNik7CisgICAgICAgIEVYUEVDVF9FUSh1dGYxNkxlbiwgc3RyNC5zaXplKCkpOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0udXRmMTYsIHN0cjQuY19zdHIoKSk7CisKKyAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIHN0cjUgPSBzdHI0OworICAgICAgICBFWFBFQ1RfRVEodXRmMTZMZW4sIHN0cjUuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnV0ZjE2LCBzdHI1LmNfc3RyKCkpOworCisgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyBzdHI2KCJmb28iKTsKKyAgICAgICAgc3RyNiA9IHN0cjU7CisgICAgICAgIEVYUEVDVF9FUSh1dGYxNkxlbiwgc3RyNi5zaXplKCkpOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0udXRmMTYsIHN0cjYuY19zdHIoKSk7CisgICAgfQorfQorCitURVNUKFdpbjMyVW5pY29kZVN0cmluZywgY29udmVydFRvVXRmOCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiB1dGY4OworICAgICAgICBjb25zdCB3Y2hhcl90KiB1dGYxNjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7IiIsIEwiIn0sCisgICAgICAgICAgICB7IkhlbGxvIFdvcmxkISIsIEwiSGVsbG8gV29ybGQhIn0sCisgICAgICAgICAgICB7IlRceEMzXHhBOWxceEMzXHhBOXZpc2lvbiIsIEwiVFx4RTlsXHhFOXZpc2lvbiJ9LAorICAgICAgICAgICAgeyJmb29ceEUxXHg4MFx4ODAgYmFyIiwgTCJmb29ceDEwMDAgYmFyIn0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFTaXplID0gQVJSQVlfU0laRShrRGF0YSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjEgPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0Zjgoa0RhdGFbbl0udXRmMTYpOworICAgICAgICBFWFBFQ1RfRVEoc3RybGVuKGtEYXRhW25dLnV0ZjgpLCBzdHIxLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS51dGY4LCBzdHIxLmNfc3RyKCkpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjIgPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgoCisgICAgICAgICAgICAgICAga0RhdGFbbl0udXRmMTYsIHdjc2xlbihrRGF0YVtuXS51dGYxNikpOworICAgICAgICBFWFBFQ1RfRVEoc3RybGVuKGtEYXRhW25dLnV0ZjgpLCBzdHIyLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS51dGY4LCBzdHIyLmNfc3RyKCkpOworCisgICAgICAgIGNoYXIgb3V0WzI1Nl07CisgICAgICAgIGludCBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0Zjgob3V0LCBzaXplb2Yob3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS51dGYxNik7CisgICAgICAgIEVYUEVDVF9FUShzdHJsZW4oa0RhdGFbbl0udXRmOCkgKyAxLCBsZW4pOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0udXRmOCwgb3V0KTsKKworICAgICAgICBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0Zjgob3V0LCBzaXplb2Yob3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhW25dLnV0ZjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NzbGVuKGtEYXRhW25dLnV0ZjE2KSk7CisgICAgICAgIEVYUEVDVF9FUShzdHJsZW4oa0RhdGFbbl0udXRmOCksIGxlbik7CisgICAgICAgIG91dFtsZW5dID0gMDsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnV0ZjgsIG91dCk7CisKKyAgICAgICAgaWYgKGtEYXRhW25dLnV0ZjhbMF0gIT0gMCkgeworICAgICAgICAgICAgbGVuID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KG91dCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS51dGYxNik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoLTEsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgobnVsbHB0ciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhW25dLnV0ZjE2KTsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBsZW4pOworCisgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydFRvVXRmOChudWxscHRyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFbbl0udXRmMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y3NsZW4oa0RhdGFbbl0udXRmMTYpKTsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBsZW4pOworCisgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y2FsY1V0ZjhCdWZmZXJMZW5ndGgoa0RhdGFbbl0udXRmMTYpOworICAgICAgICBFWFBFQ1RfRVEoc3RybGVuKGtEYXRhW25dLnV0ZjgpICsgMSwgbGVuKTsKKworICAgICAgICBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNhbGNVdGY4QnVmZmVyTGVuZ3RoKGtEYXRhW25dLnV0ZjE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NzbGVuKGtEYXRhW25dLnV0ZjE2KSk7CisgICAgICAgIEVYUEVDVF9FUShzdHJsZW4oa0RhdGFbbl0udXRmOCksIGxlbik7CisgICAgfQorfQorCitURVNUKFdpbjMyVW5pY29kZVN0cmluZywgY29udmVydEZyb21VdGY4KSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHV0Zjg7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIHV0ZjE2OworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIHsiIiwgTCIifSwKKyAgICAgICAgICAgIHsiSGVsbG8gV29ybGQhIiwgTCJIZWxsbyBXb3JsZCEifSwKKyAgICAgICAgICAgIHsiVFx4QzNceEE5bFx4QzNceEE5dmlzaW9uIiwgTCJUXHhFOWxceEU5dmlzaW9uIn0sCisgICAgICAgICAgICB7ImZvb1x4RTFceDgwXHg4MCBiYXIiLCBMImZvb1x4MTAwMCBiYXIifSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YVNpemUgPSBBUlJBWV9TSVpFKGtEYXRhKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFTaXplOyArK24pIHsKKyAgICAgICAgd2NoYXJfdCBvdXRbMjU2XTsKKyAgICAgICAgaW50IGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydEZyb21VdGY4KG91dCwgQVJSQVlfU0laRShvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFbbl0udXRmOCk7CisgICAgICAgIEVYUEVDVF9FUSh3Y3NsZW4oa0RhdGFbbl0udXRmMTYpICsgMSwgbGVuKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLnV0ZjE2LCBvdXQpOworCisgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydEZyb21VdGY4KG91dCwgQVJSQVlfU0laRShvdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS51dGY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oa0RhdGFbbl0udXRmOCkpOworICAgICAgICBFWFBFQ1RfRVEod2NzbGVuKGtEYXRhW25dLnV0ZjE2KSwgbGVuKTsKKyAgICAgICAgb3V0W2xlbl0gPSAwOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0udXRmMTYsIG91dCk7CisKKyAgICAgICAgaWYgKGtEYXRhW25dLnV0ZjE2WzBdICE9IDApIHsKKyAgICAgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydEZyb21VdGY4KG91dCwgMSwga0RhdGFbbl0udXRmOCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoLTEsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRGcm9tVXRmOChudWxscHRyLCAwLCBrRGF0YVtuXS51dGY4KTsKKyAgICAgICAgRVhQRUNUX0VRKC0xLCBsZW4pOworCisgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydEZyb21VdGY4KG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhW25dLnV0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrRGF0YVtuXS51dGY4KSk7CisgICAgICAgIEVYUEVDVF9FUSgtMSwgbGVuKTsKKworICAgICAgICBsZW4gPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNhbGNVdGYxNkJ1ZmZlckxlbmd0aChrRGF0YVtuXS51dGY4KTsKKyAgICAgICAgRVhQRUNUX0VRKHdjc2xlbihrRGF0YVtuXS51dGYxNikgKyAxLCBsZW4pOworCisgICAgICAgIGxlbiA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y2FsY1V0ZjE2QnVmZmVyTGVuZ3RoKGtEYXRhW25dLnV0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGtEYXRhW25dLnV0ZjgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHdjc2xlbihrRGF0YVtuXS51dGYxNiksIGxlbik7CisgICAgfQorfQorCitURVNUKFdpbjMyVW5pY29kZVN0cmluZywgYXBwZW5kaW5nKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZpcnN0OworICAgICAgICBjb25zdCB3Y2hhcl90KiBzZWNvbmQ7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIHJlc3VsdDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHtMImZvbyIsIEwiYmFyIiwgTCJmb29iYXIifSwKKyAgICAgICAge0wiIiwgTCJiYXIiLCBMImJhciJ9LAorICAgICAgICB7TCJmb28iLCBMIiIsIEwiZm9vIn0sCisgICAgICAgIHtMImZvb2JhciIsIEwiIHdpdGggaWNlIGNyZWFtIiwgTCJmb29iYXIgd2l0aCBpY2UgY3JlYW0ifSwKKyAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiBkYXRhIDoga0RhdGEpIHsKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGVzdCBhcHBlbmRpbmcgV2luMzJVbmljb2RlU3RyaW5nCisgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgZmlyc3QoZGF0YS5maXJzdCk7CisgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc2Vjb25kKGRhdGEuc2Vjb25kKTsKKworICAgICAgICAgICAgZmlyc3QuYXBwZW5kKHNlY29uZCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEod2NzbGVuKGRhdGEucmVzdWx0KSwgZmlyc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShkYXRhLnJlc3VsdCwgZmlyc3QuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGVzdCBhcHBlbmRpbmcgd2NoYXJfdCoKKyAgICAgICAgICAgIFdpbjMyVW5pY29kZVN0cmluZyBzdHIoZGF0YS5maXJzdCk7CisgICAgICAgICAgICBzdHIuYXBwZW5kKGRhdGEuc2Vjb25kKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh3Y3NsZW4oZGF0YS5yZXN1bHQpLCBzdHIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShkYXRhLnJlc3VsdCwgc3RyLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRlc3QgYXBwZW5kaW5nIHdjaGFyX3QqIHdpdGggbGVuZ3RoCisgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc3RyKGRhdGEuZmlyc3QpOworICAgICAgICAgICAgc3RyLmFwcGVuZChkYXRhLnNlY29uZCwgd2NzbGVuKGRhdGEuc2Vjb25kKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEod2NzbGVuKGRhdGEucmVzdWx0KSwgc3RyLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoZGF0YS5yZXN1bHQsIHN0ci5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2NzbGVuKGRhdGEuc2Vjb25kKSA+IDApIHsKKyAgICAgICAgICAgIC8vIFRlc3QgYXBwZW5kaW5nIHdpdGggZmV3ZXIgY2hhcmFjdGVycworICAgICAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIHN0cihkYXRhLmZpcnN0KTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmQoZGF0YS5zZWNvbmQsIHdjc2xlbihkYXRhLnNlY29uZCkgLSAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSh3Y3NsZW4oZGF0YS5yZXN1bHQpIC0gMSwgc3RyLnNpemUoKSk7CisgICAgICAgICAgICBzdGQ6OndzdHJpbmcgY2hvcHBlZFJlc3VsdChkYXRhLnJlc3VsdCwgd2NzbGVuKGRhdGEucmVzdWx0KSAtIDEpOworICAgICAgICAgICAgRVhQRUNUX1NUUkVRKGNob3BwZWRSZXN1bHQuY19zdHIoKSwgc3RyLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZkMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVXRpbHMuY3BwCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgV2luMzJVdGlsczo6cXVvdGVDb21tYW5kTGluZShTdHJpbmdWaWV3IGNvbW1hbmRMaW5lKSB7CisgICAgLy8gSWYgfGNvbW1hbmRMaW5lfCBkb2Vzbid0IGNvbnRhaW4gYW55IHByb2JsZW1hdGljIGNoYXJhY3RlciwganVzdCByZXR1cm4KKyAgICAvLyBpdCBhcy1pcy4KKyAgICBzaXplX3QgbiA9IHN0cmNzcG4oY29tbWFuZExpbmUuY19zdHIoKSwgIiBcdFx2XG5cIiIpOworICAgIGlmIChjb21tYW5kTGluZVtuXSA9PSAnXDAnKSB7CisgICAgICAgIHJldHVybiBjb21tYW5kTGluZTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gcXVvdGUgc29tZSBvZiB0aGUgY2hhcmFjdGVycy4KKyAgICBzdGQ6OnN0cmluZyBvdXQoIlwiIik7CisKKyAgICBuID0gMDsKKyAgICB3aGlsZSAoY29tbWFuZExpbmVbbl0pIHsKKyAgICAgICAgc2l6ZV90IG51bV9iYWNrc2xhc2hlcyA9IDA7CisgICAgICAgIHdoaWxlIChjb21tYW5kTGluZVtuXSA9PSAnXFwnKSB7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBudW1fYmFja3NsYXNoZXMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29tbWFuZExpbmVbbl0pIHsKKyAgICAgICAgICAgIC8vIEVuZCBvZiBzdHJpbmcsIGlmIHRoZXJlIGFyZSBiYWNrc2xhc2hlcywgZG91YmxlIHRoZW0uCisgICAgICAgICAgICBmb3IgKDsgbnVtX2JhY2tzbGFzaGVzID4gMDsgbnVtX2JhY2tzbGFzaGVzLS0pCisgICAgICAgICAgICAgICAgb3V0ICs9ICJcXFxcIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbW1hbmRMaW5lW25dID09ICciJykgeworICAgICAgICAgICAgLy8gRXNjYXBlIGFsbCBiYWNrc2xhc2hlcyBhcyB3ZWxsIGFzIHRoZSBxdW90ZSB0aGF0IGZvbGxvd3MgdGhlbS4KKyAgICAgICAgICAgIGZvciAoOyBudW1fYmFja3NsYXNoZXMgPiAwOyBudW1fYmFja3NsYXNoZXMtLSkKKyAgICAgICAgICAgICAgICBvdXQgKz0gIlxcXFwiOworICAgICAgICAgICAgb3V0ICs9ICJcXFwiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoOyBudW1fYmFja3NsYXNoZXMgPiAwOyBudW1fYmFja3NsYXNoZXMtLSkKKyAgICAgICAgICAgICAgICBvdXQgKz0gJ1xcJzsKKyAgICAgICAgICAgIG91dCArPSBjb21tYW5kTGluZVtuXTsKKyAgICAgICAgfQorICAgICAgICBuKys7CisgICAgfQorCisgICAgLy8gQWRkIGZpbmFsIHF1b3RlLgorICAgIG91dCArPSAnIic7CisgICAgcmV0dXJuIG91dDsKK30KKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBXaW4zMlV0aWxzOjpnZXRFcnJvclN0cmluZyhEV09SRCBlcnJvcl9jb2RlKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgTFBXU1RSIGVycm9yX3N0cmluZyA9IG51bGxwdHI7CisKKyAgICBEV09SRCBmb3JtYXRfcmVzdWx0ID0gRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKyAgICAgICAgICAgIG51bGxwdHIsIGVycm9yX2NvZGUsIDAsIChMUFdTVFIpJmVycm9yX3N0cmluZywgMiwgbnVsbHB0cik7CisgICAgaWYgKGVycm9yX3N0cmluZykgeworICAgICAgICByZXN1bHQgPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0ZjgoZXJyb3Jfc3RyaW5nKTsKKyAgICAgICAgOjpMb2NhbEZyZWUoZXJyb3Jfc3RyaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBDb2RlOiAlbGkgKEZvcm1hdE1lc3NhZ2UgcmVzdWx0OiAlbGkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUsIGZvcm1hdF9yZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjgyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX1dJTjMyCisvLyBub3RoaW5nJ3MgaGVyZSBmb3IgUG9zaXgKKyNlbHNlICAvLyBfV0lOMzIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFRoaXMgY2xhc3MgaG9sZHMgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgV2luZG93cyBob3N0IHN5c3RlbXMuCisvLyBBbGwgbWV0aG9kcyBoZXJlIG11c3QgYmUgc3RhdGljIQorY2xhc3MgV2luMzJVdGlscyB7CitwdWJsaWM6CisgICAgLy8gUXVvdGUgYSBnaXZlbiBjb21tYW5kLWxpbmUgY29tbWFuZCBvciBwYXJhbWV0ZXIgc28gdGhhdCBpdCBjYW4gYmUKKyAgICAvLyBzZW50IHRvIF9leGVjdigpIG9uIFdpbmRvd3MsIGFuZCBiZSByZWNlaXZlZCBwcm9wZXJseSBieSB0aGUgbmV3CisgICAgLy8gcHJvY2Vzcy4KKyAgICAvLworICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHdvcmstYXJvdW5kIGFuIGFubm95aW5nIGlzc3VlIG9uIFdpbmRvd3MsIHdoZXJlCisgICAgLy8gc3Bhd24oKSAvIGV4ZWMoKSBmdW5jdGlvbnMgYXJlIG1lcmUgd3JhcHBlcnMgYXJvdW5kIENyZWF0ZVByb2Nlc3MsIHdoaWNoCisgICAgLy8gYWx3YXlzIHBhc3MgdGhlIGNvbW1hbmQtbGluZSBhcyBhIF9zaW5nbGVfIHN0cmluZyBtYWRlIG9mIHRoZSBzaW1wbGUKKyAgICAvLyBjb25jYXRlbmF0aW9ucyBvZiB0aGVpciBhcmd1bWVudHMsIHdoaWxlIHRoZSBuZXcgcHJvY2VzcyB3aWxsIHR5cGljYWxseQorICAgIC8vIHVzZSBDb21tYW5kTGluZVRvQXJndiB0byBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mIGNvbW1hbmQtbGluZQorICAgIC8vIGFyZ3VtZW50cywgZXhwZWN0ZWQgdGhlIHZhbHVlcyB0byBiZSBxdW90ZWQgcHJvcGVybHkuCisgICAgLy8KKyAgICAvLyBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoaXMgbWVzcywgcmVhZCB0aGUgTVNETiBibG9nIHBvc3QgbmFtZWQKKyAgICAvLyAiRXZlcnlvbmUgcXVvdGVzIGFyZ3VtZW50cyB0aGUgd3Jvbmcgd2F5Ii4KKyAgICAvLworICAgIC8vIHxjb21tYW5kTGluZXwgaXMgYW4gaW5wdXQgc3RyaW5nLCB0aGF0IG1heSBjb250YWluIHNwYWNlcywgcXVvdGVzIG9yCisgICAgLy8gYmFja3NsYXNoZXMuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgdmVyc2lvbgorICAgIC8vIG9mIHxjb21tYW5kTGluZXwgdGhhdCBjYW4gYmUgZGVjb2RlZCBwcm9wZXJseSBieSBDb21tYW5kTGluZVRvQXJndigpLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBxdW90ZUNvbW1hbmRMaW5lKFN0cmluZ1ZpZXcgY29tbWFuZExpbmUpOworCisgICAgLy8gQ3JlYXRlcyBhIFVURi04IGVuY29kZWQgZXJyb3IgbWVzc2FnZSBzdHJpbmcgZnJvbSBhIFdpbmRvd3MgU3lzdGVtIEVycm9yCisgICAgLy8gQ29kZS4gIFN0cmluZyByZXR1cm5lZCBkZXBlbmRzIG9uIGN1cnJlbnQgbGFuZ3VhZ2UgaWQuICBTZWUKKyAgICAvLyBGb3JtYXRNZXNzYWdlLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFcnJvclN0cmluZyhEV09SRCBlcnJvcl9jb2RlKTsKKworICAgIC8vIEEgc21hbGwgaGFuZHkgc3RydWN0IGZvciBhbiBhdXRvbWF0aWMgSEFORExFIG1hbmFnZW1lbnQKKyAgICBzdHJ1Y3QgSGFuZGxlQ2xvc2VyIHsKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKEhBTkRMRSBoKSBjb25zdCB7IDo6Q2xvc2VIYW5kbGUoaCk7IH0KKyAgICB9OworICAgIHVzaW5nIFNjb3BlZEhhbmRsZSA9IHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBIYW5kbGVDbG9zZXI+OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gX1dJTjMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlsc191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4ZDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIERlZmluZSBXSU5WRVIgYW5kIF9XSU4zMl9XSU5OVCB0byAweDA2MDAgd2hpY2ggbWF0Y2hlcyBXaW5kb3dzIFZpc3RhLgorLy8gVGhpcyBpcyB0byBnZXQgR2V0VGhyZWFkVUlMYW5ndWFnZSgpLiBUaGlzIGlzIG9rIHNpbmNlIHRoaXMgdW5pdC10ZXN0CisvLyB3aWxsIG9ubHkgcnVuIG9uIHJlY2VudCB2ZXJzaW9ucyBvZiBXaW5kb3dzIG9yIHVuZGVyIFdpbmUgb24gTGludXguCisjaWZkZWYgV0lOVkVSCisjdW5kZWYgV0lOVkVSCisjZW5kaWYKKyNpZmRlZiBfV0lOMzJfV0lOTlQKKyN1bmRlZiBfV0lOMzJfV0lOTlQKKyNlbmRpZgorI2RlZmluZSBXSU5WRVIgMHgwNjAwCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5ubHMuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCitURVNUKFdpbjMyVXRpbHMsIHF1b3RlQ29tbWFuZExpbmUpIHsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkOworICB9IGtEYXRhW10gPSB7CisgICAgICB7ICJmb28iLCAiZm9vIiB9LAorICAgICAgeyAiZm9vIGJhciIsICJcImZvbyBiYXJcIiIgfSwKKyAgICAgIHsgImZvb1xcYmFyIiwgImZvb1xcYmFyIiB9LAorICAgICAgeyAiZm9vXFxcXGJhciIsICJmb29cXFxcYmFyIiB9LAorICAgICAgeyAiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiIH0sCisgICAgICB7ICJmb29cXFwiYmFyIiwgIlwiZm9vXFxcXFxcXCJiYXJcIiIgfSwKKyAgICAgIHsgImZvb1xcYmFyIHpvbyIsICJcImZvb1xcYmFyIHpvb1wiIiB9LAorICB9OworICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZX1NJWkUoa0RhdGEpOyArK24pIHsKKyAgICAgIGNvbnN0IGNoYXIqIGlucHV0ID0ga0RhdGFbbl0uaW5wdXQ7CisgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZCA9IGtEYXRhW25dLmV4cGVjdGVkOworCisgICAgICBzdGQ6OnN0cmluZyBvdXQgPSBXaW4zMlV0aWxzOjpxdW90ZUNvbW1hbmRMaW5lKGlucHV0KTsKKyAgICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZCwgb3V0LmNfc3RyKCkpIDw8ICJRdW90aW5nICciIDw8IGlucHV0IDw8ICInIjsKKyAgfQorfQorCitURVNUKFdpbjMyVXRpbHMsIGdldEVycm9yU3RyaW5nKSB7CisgICAgTEFOR0lEIGxhbmdpZCA9IDo6R2V0VGhyZWFkVUlMYW5ndWFnZSgpOworICAgIExBTkdJRCBrTGFuZ0lkRW5nbGlzaFVTID0gMTAzMzsKKyAgICBpZiAoa0xhbmdJZEVuZ2xpc2hVUyAhPSBsYW5naWQpIHsKKyAgICAgICAgLy8gVGhpcyB0ZXN0IG9ubHkgaGFzIFVTIEVuZ2xpc2ggc3RyaW5ncworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiV2luMzJVdGlsczo6Z2V0RXJyb3JTdHJpbmcgc2tpcHBpbmcgdGVzdHMgb24gbm9uLVVTIEVuZ2xpc2ggIgorICAgICAgICAgICAgICAgICJzeXN0ZW0gKExBTkdJRCAlaSlcbiIsCisgICAgICAgICAgICAgICAgbGFuZ2lkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpbGVfbm90X2ZvdW5kID0gV2luMzJVdGlsczo6Z2V0RXJyb3JTdHJpbmcoMik7CisgICAgRVhQRUNUX1RSVUUoMCA9PSBzdHJjbXAoIlRoZSBzeXN0ZW0gY2Fubm90IGZpbmQgdGhlIGZpbGUgc3BlY2lmaWVkLlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbm90X2ZvdW5kLmNfc3RyKCkpIHx8CisgICAgICAgICAgICAgICAgMCA9PSBzdHJjbXAoIkZpbGUgbm90IGZvdW5kLlxyXG4iLCBmaWxlX25vdF9mb3VuZC5jX3N0cigpKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9HVGVzdFV0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL0dUZXN0VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY0Njk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9HVGVzdFV0aWxzLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1R5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisvLyBNaXNjZWxsZW5hb3VzIGhlbHBlciBkZWNsYXJhdGlvbnMgZm9yIHVuaXQtdGVzdHMgdXNpbmcgdGhlIEdvb2dsZVRlc3QKKy8vIGZyYW1ld29yay4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBSYW5nZXNNYXRjaCBpcyBhIHVzZWZ1bCB0ZW1wbGF0ZSB1c2VkIHRvIGNvbXBhcmUgdGhlIGNvbnRlbnQgb2YgdHdvCisvLyByYW5nZXMgYXQgcnVudGltZS4gVXNhZ2UgaXMgc2ltcGx5OgorLy8KKy8vICAgRVhQRUNUX1RSVUUoUmFuZ2VzTWF0Y2gocmFuZ2UxLCByYW5nZTIpOworLy8KKy8vIFdoZXJlIHxyYW5nZTF8IGFuZCB8cmFuZ2UyfCBtdXN0IGhhdmUgdGhlIHNhbWUgaXRlbSB0eXBlLCBhbmQgc2l6ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZTEsCisgICAgICAgICAgdHlwZW5hbWUgUmFuZ2UyLAorICAgICAgICAgIHR5cGVuYW1lID0gZW5hYmxlX2lmX2M8aXNfcmFuZ2U8UmFuZ2UxPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JhbmdlPFJhbmdlMj46OnZhbHVlPj4KK2lubGluZSA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBSYW5nZXNNYXRjaChjb25zdCBSYW5nZTEmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJhbmdlMiYgYWN0dWFsKSB7CisgICAgY29uc3QgYXV0byBleHBlY3RlZFNpemUgPQorICAgICAgICAgICAgc3RkOjpkaXN0YW5jZShzdGQ6OmJlZ2luKGV4cGVjdGVkKSwgc3RkOjplbmQoZXhwZWN0ZWQpKTsKKyAgICBjb25zdCBhdXRvIGFjdHVhbFNpemUgPSBzdGQ6OmRpc3RhbmNlKHN0ZDo6YmVnaW4oYWN0dWFsKSwgc3RkOjplbmQoYWN0dWFsKSk7CisgICAgaWYgKGFjdHVhbFNpemUgIT0gZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICAgICAgICAgPDwgImFjdHVhbCByYW5nZSBzaXplICIgPDwgYWN0dWFsU2l6ZSA8PCAiICE9IGV4cGVjdGVkIHNpemUgIgorICAgICAgICAgICAgICAgPDwgZXhwZWN0ZWRTaXplOworICAgIH0KKworICAgIGF1dG8gaXRFeHAgPSBzdGQ6OmJlZ2luKGV4cGVjdGVkKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdCA6IGFjdHVhbCkgeworICAgICAgICBpZiAoKml0RXhwICE9IGFjdCkgeworICAgICAgICAgICAgY29uc3QgYXV0byBpbmRleCA9IHN0ZDo6ZGlzdGFuY2Uoc3RkOjpiZWdpbihleHBlY3RlZCksIGl0RXhwKTsKKyAgICAgICAgICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvbkZhaWx1cmUoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyYW5nZVsiIDw8IGluZGV4IDw8ICJdICgiIDw8IGFjdCA8PCAiKSAhPSBleHBlY3RlZFsiCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZXggPDwgIl0gKCIgPDwgKml0RXhwIDw8ICIpIjsKKyAgICAgICAgfQorICAgICAgICArK2l0RXhwOworICAgIH0KKworICAgIHJldHVybiA6OnRlc3Rpbmc6OkFzc2VydGlvblN1Y2Nlc3MoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3REbnNSZXNvbHZlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0RG5zUmVzb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDQ2MWUzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0RG5zUmVzb2x2ZXIuaApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbmV0d29yay9EbnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBDb252ZW5pZW5jZSBjbGFzcyB1c2VkIHRvIG1vY2sgdGhlIHN5c3RlbSBETlMgcmVzb2x2ZXIgZHVyaW5nIHVuaXQtdGVzdGluZy4KKy8vCisvLyBVc2FnZToKKy8vICAgICAxKSBDcmVhdGUgVGVzdERuc1Jlc29sdmVyIGluc3RhbmNlLgorLy8KKy8vICAgICAyKSBDYWxsIGFkZEVudHJ5KCksIGFkZEVudHJ5SXB2NCgpIG9yIGFkZEVudHJ5SXB2NigpIG9uIGl0IGFzIG1hbnkgdGltZXMKKy8vICAgICAgICBhcyBuZWVkZWQgdG8gcG9wdWxhdGUgaXRzIHRhYmxlLiBPbmUgY2FuIGFkZCBzZXZlcmFsIGFkZHJlc3NlcyBwZXIKKy8vICAgICAgICBzZXJ2ZXIgbmFtZS4KKy8vCisvLyAgICAgMykgUnVuIHlvdXIgdGVzdCwgY2FsbHMgdG8gRG5zOjpyZXNvbHZlTmFtZSgpIHdpbGwgdXNlIHRoZQorLy8gICAgICAgIFRlc3REbnNSZXNvbHZlcigpIGNvbnRlbnQgYXV0b21hdGljYWxseS4KKy8vCitjbGFzcyBUZXN0RG5zUmVzb2x2ZXIgOiBwdWJsaWMgRG5zOjpSZXNvbHZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQWRkcmVzc0xpc3QgPSBEbnM6OkFkZHJlc3NMaXN0OworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpbmplY3RzIHRoaXMgaW5zdGFuY2UgaW50byB0aGUgcHJvY2VzcycgZ2xvYmFsCisgICAgLy8gc3RhdGUuCisgICAgVGVzdERuc1Jlc29sdmVyKCkgeyBtUHJldlJlc29sdmVyID0gRG5zOjpSZXNvbHZlcjo6c2V0Rm9yVGVzdGluZyh0aGlzKTsgfQorCisgICAgLy8gRGVzdHJ1Y3RvciByZXN0b3JlcyB0aGUgcHJldmlvdXMgZ2xvYmFsIHJlc29sdmVyIGluc3RhbmNlLgorICAgIH5UZXN0RG5zUmVzb2x2ZXIoKSB7IERuczo6UmVzb2x2ZXI6OnNldEZvclRlc3RpbmcobVByZXZSZXNvbHZlcik7IH0KKworICAgIC8vIENsZWFyIHRoZSBpbnRlcm5hbCB0YWJsZS4KKyAgICB2b2lkIHJlc2V0KCkgeyBtTWFwLmNsZWFyKCk7IH0KKworICAgIC8vIEFkZCBuZXcgZW50cnkgdG8gdGhlIGludGVybmFsIHRhYmxlLiB8c2VydmVyX25hbWV8IGlzIGEgc2VydmVyIG5hbWUsCisgICAgLy8gYW5kIHxhZGRyZXNzfCBpcyBhIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGVpdGhlciBhIGRvdHRlZCBJUHY0IGFkZHJlc3MKKyAgICAvLyBvciBjb2x1bW4tc2VwYXJhdGVkIElQdjYgb25lLgorICAgIHZvaWQgYWRkRW50cnkoU3RyaW5nVmlldyBzZXJ2ZXJfbmFtZSwgU3RyaW5nVmlldyBhZGRyZXNzKSB7CisgICAgICAgIEFkZHJlc3NMaXN0IGxpc3QgPSB7SXBBZGRyZXNzKGFkZHJlc3MpfTsKKyAgICAgICAgYWRkRW50cnlMaXN0KHNlcnZlcl9uYW1lLCBsaXN0KTsKKyAgICB9CisKKyAgICAvLyBBZGQgbmV3IGVudHJ5IHRvIHRoZSBpbnRlcm5hbCB0YWJsZS4gfHNlcnZlcl9uYW18IGlzIGEgc2VydmVyIG5hbWUsCisgICAgLy8gYW5kIHxpcHY0fCBpcyB0aGUgaG9zdC1vcmRlciAzMi1iaXQgSVB2NCBhZGRyZXNzIGZvciBpdC4KKyAgICB2b2lkIGFkZEVudHJ5SXB2NChTdHJpbmdWaWV3IHNlcnZlcl9uYW1lLCB1aW50MzJfdCBpcHY0KSB7CisgICAgICAgIEFkZHJlc3NMaXN0IGxpc3QgPSB7SXBBZGRyZXNzKGlwdjQpfTsKKyAgICAgICAgYWRkRW50cnlMaXN0KHNlcnZlcl9uYW1lLCBsaXN0KTsKKyAgICB9CisKKyAgICAvLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGludGVybmFsIHRhYmxlLiB8c2VydmVyX25hbWV8IGlzIGEgc2VydmVyIG5hbWUsCisgICAgLy8gYW5kIHxpcHY2fCBpcyBhIDI2LWJ5dGUgSVB2NiBhZGRyZXNzIGZvciBpdC4KKyAgICB2b2lkIGFkZEVudHJ5SXB2NihTdHJpbmdWaWV3IHNlcnZlcl9uYW1lLCBjb25zdCB1aW50OF90IGlwdjZbMTZdKSB7CisgICAgICAgIGFkZEVudHJ5TGlzdChzZXJ2ZXJfbmFtZSwgQWRkcmVzc0xpc3Qoe0lwQWRkcmVzcyhpcHY2KX0pKTsKKyAgICB9CisKKyAgICAvLyBBZGQgYSB8bGlzdHwgb2YgSVAgYWRkcmVzc2VzIHRvIHRoZSBpbnRlcm5hbCB0YWJsZSwgYXNzb2NpYXRlZCB3aXRoCisgICAgLy8gfHNlcnZlcl9uYW1lfC4KKyAgICB2b2lkIGFkZEVudHJ5TGlzdChTdHJpbmdWaWV3IHNlcnZlcl9uYW1lLCBjb25zdCBBZGRyZXNzTGlzdCYgbGlzdCkgeworICAgICAgICBzdGQ6OnN0cmluZyBrZXkoc2VydmVyX25hbWUpOworICAgICAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGtleSk7CisgICAgICAgIGlmIChpdCA9PSBtTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBtTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIGxpc3QpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBsaXN0KSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLnB1c2hfYmFjayhpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybiB0aGUgbGlzdCBvZiBJcEFkZHJlc3MgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB8c2VydmVyX25hbWV8CisgICAgLy8gdGhyb3VnaCBwcmV2aW91cyBhZGRFbnRyeVhYWCgpIGNhbGxzLgorICAgIHZpcnR1YWwgaW50IHJlc29sdmVOYW1lKFN0cmluZ1ZpZXcgc2VydmVyX25hbWUsIEFkZHJlc3NMaXN0KiBvdXQpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5KHNlcnZlcl9uYW1lKTsKKyAgICAgICAgLy8gRmlyc3QgdHJ5IHRvIHBhcnNlIGl0IGFzIGEgbnVtZXJpY2FsIElQIGFkZHJlc3MuCisgICAgICAgIElwQWRkcmVzcyBpcChrZXkpOworICAgICAgICBpZiAoaXAudmFsaWQoKSkgeworICAgICAgICAgICAgb3V0LT5wdXNoX2JhY2soc3RkOjptb3ZlKGlwKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGl0ID0gbU1hcC5maW5kKGtleSk7CisgICAgICAgIGlmIChpdCA9PSBtTWFwLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gaXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHVzZWQgYnkgdGhlIHN5c3RlbSBjdXJyZW50bHkuCisgICAgdmlydHVhbCBpbnQgZ2V0U3lzdGVtU2VydmVyTGlzdChBZGRyZXNzTGlzdCogb3V0KSBvdmVycmlkZSB7CisgICAgICAgIG91dC0+ZW1wbGFjZV9iYWNrKElwQWRkcmVzcygweDdmMDAwMDAxKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICBEbnM6OlJlc29sdmVyKiBtUHJldlJlc29sdmVyID0gbnVsbHB0cjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEFkZHJlc3NMaXN0PiBtTWFwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RJbnB1dEJ1ZmZlclNvY2tldFNlcnZlclRocmVhZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0SW5wdXRCdWZmZXJTb2NrZXRTZXJ2ZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTRiN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0SW5wdXRCdWZmZXJTb2NrZXRTZXJ2ZXJUaHJlYWQuaApAQCAtMCwwICsxLDk5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmIF9XSU4zMgorI3VuZGVmIEVSUk9SCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBTaW1wbGUgc2VydmVyIHRocmVhZCB0aGF0IHJlY2VpdmVzIGRhdGEgYW5kIHN0b3JlcyBpdCBpbiBhIGJ1ZmZlci4KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gMSkgQ3JlYXRlIGluc3RhbmNlLCBwYXNzaW5nIGEgcG9ydCB0byBsaXN0ZW4gdG8gdGhlIGNvbnN0cnVjdG9yLgorLy8gICAgVGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2lsbCBiaW5kIHRvIGEgcmFuZG9tIHBvcnQsIHdoaWNoIHlvdQorLy8gICAgY2FuIHJldHJpZXZlIHdpdGggdGhlIHBvcnQoKSBtZXRob2QuIENoZWNrIHRoYXQgdGhlIHBvcnQgY291bGQgYmUKKy8vICAgIGJlIGJvdW5kIHdpdGggdGhlIHZhbGlkKCkgbWV0aG9kLgorLy8KKy8vIDIpIFN0YXJ0IHRoZSB0aHJlYWQsIGl0IHdpbGwgc3RvcmUgYWxsIHRoZSBkYXRhIGl0IHJlY2VpdmVzIGludG8KKy8vICAgIGFuIGludGVybmFsIGJ1ZmZlci4gVGhlIHRocmVhZCBvbmx5IHN0b3BzIHdoZW4gdGhlIGNvbm5lY3Rpb24KKy8vICAgIGlzIGNsb3NlZCBmcm9tIHRoZSByZW1vdGUgZW5kLgorLy8KKy8vIDMpIEpvaW4gdGhlIHRocmVhZCwgdGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLCBvcgorLy8gICAgLTEgaWYgYSBjb25uZWN0aW9uIGNvdWxkIG5vdCBiZSBhY2NlcHRlZC4KKy8vCisvLyA0KSBVc2UgdmlldygpIHRvIHJldHJpZXZlIGEgdmlldyBvZiB0aGUgY29udGVudC4KKy8vCitjbGFzcyBUZXN0SW5wdXRCdWZmZXJTb2NrZXRTZXJ2ZXJUaHJlYWQgOiBwdWJsaWMgYW5kcm9pZDo6YmFzZTo6VGhyZWFkIHsKK3B1YmxpYzoKKyAgICAvLyBDcmVhdGUgbmV3IHRocmVhZCBpbnN0YW5jZSwgdHJ5IHRvIGJvdW5kIHRvIHNwZWNpZmljIFRDUCB8cG9ydHwsCisgICAgLy8gYSB2YWx1ZSBvZiAwIGxldCB0aGUgc3lzdGVtIGNob29zZSBhIGZyZWUgSVB2NCBwb3J0LCB3aGljaCBjYW4KKyAgICAvLyBsYXRlciBiZSByZXRyaWV2ZWQgd2l0aCBwb3J0KCkuCisgICAgVGVzdElucHV0QnVmZmVyU29ja2V0U2VydmVyVGhyZWFkKGludCBwb3J0ID0gMCkKKyAgICAgICAgOiBUaHJlYWQoKSwgbVNvY2tldChhbmRyb2lkOjpiYXNlOjpzb2NrZXRUY3A0TG9vcGJhY2tTZXJ2ZXIocG9ydCkpIHt9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgcG9ydCBjb3VsZCBiZSBib3VuZC4KKyAgICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVNvY2tldC52YWxpZCgpOyB9CisKKyAgICAvLyBSZXR1cm4gYm91bmQgc2VydmVyIHBvcnQuCisgICAgaW50IHBvcnQoKSBjb25zdCB7IHJldHVybiBhbmRyb2lkOjpiYXNlOjpzb2NrZXRHZXRQb3J0KG1Tb2NrZXQuZ2V0KCkpOyB9CisKKyAgICAvLyBSZXR1cm4gYnVmZmVyIGNvbnRlbnQgYXMgYSBTdHJpbmdWaWV3LgorICAgIFN0cmluZ1ZpZXcgdmlldygpIGNvbnN0IHsgcmV0dXJuIG1TdHJpbmc7IH0KKworICAgIC8vIE1haW4gZnVuY3Rpb24gc2ltcGx5IHJlY2VpdmVzIGV2ZXJ5dGhpbmcgYW5kIHN0b3JlcyBpdCBpbiBhIHN0cmluZy4KKyAgICB2aXJ0dWFsIGludHB0cl90IG1haW4oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFdhaXQgZm9yIGEgc2luZ2xlIGNvbm5lY3Rpb24uCisgICAgICAgIGludCBmZCA9IGFuZHJvaWQ6OmJhc2U6OnNvY2tldEFjY2VwdEFueShtU29ja2V0LmdldCgpKTsKKyAgICAgICAgaWYgKGZkIDwgMCkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGFjY2VwdCBvbmUgY29ubmVjdGlvbiEiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHJlYWQgZGF0YSBmcm9tIHRoZSBjb25uZWN0aW9uIHVudGlsIGl0IGNsb3Nlcy4KKyAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBzaXplX3QgY2FwYWNpdHkgPSBtU3RyaW5nLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChzaXplID49IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgbVN0cmluZy5yZXNpemUoMTAyNCArIGNhcGFjaXR5ICogMik7CisgICAgICAgICAgICAgICAgY2FwYWNpdHkgPSBtU3RyaW5nLnNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IGNhcGFjaXR5IC0gc2l6ZTsKKyAgICAgICAgICAgIHNzaXplX3QgbGVuID0gYW5kcm9pZDo6YmFzZTo6c29ja2V0UmVjdihmZCwgJm1TdHJpbmdbc2l6ZV0sIGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSArPSBsZW47CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0Q2xvc2UoZmQpOworCisgICAgICAgIG1TdHJpbmcucmVzaXplKHNpemUpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KHNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTY29wZWRTb2NrZXQgbVNvY2tldDsKKyAgICBzdGQ6OnN0cmluZyBtU3RyaW5nOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RMb29wZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdExvb3Blci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2U2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RMb29wZXIuaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvRGVmYXVsdExvb3Blci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgVGVzdExvb3BlciBpcyBhIExvb3BlciBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyBpdHMgdXNlciB0byBpbnNwZWN0IGFsbAorLy8gaW50ZXJuYWxzLgorLy8KK2NsYXNzIFRlc3RMb29wZXIgOiBwdWJsaWMgRGVmYXVsdExvb3BlciB7CitwdWJsaWM6CisgICAgdXNpbmcgRGVmYXVsdExvb3Blcjo6RGVmYXVsdExvb3BlcjsKKworICAgIC8vIEFkZCBzb21lIGZ1bmN0aW9ucyB0byB1bmNvdmVyIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgIGNvbnN0IFRpbWVyU2V0JiB0aW1lcnMoKSBjb25zdDsKKyAgICBjb25zdCBUaW1lckxpc3QmIGFjdGl2ZVRpbWVycygpIGNvbnN0OworICAgIGNvbnN0IFRpbWVyTGlzdCYgcGVuZGluZ1RpbWVycygpIGNvbnN0OworCisgICAgY29uc3QgRmRXYXRjaFNldCYgZmRXYXRjaGVzKCkgY29uc3Q7CisgICAgY29uc3QgRmRXYXRjaExpc3QmIHBlbmRpbmdGZFdhdGNoZXMoKSBjb25zdDsKKworICAgIGJvb2wgZXhpdFJlcXVlc3RlZCgpIGNvbnN0OworCisgICAgdXNpbmcgRGVmYXVsdExvb3Blcjo6cnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXM7Cit9OworCitpbmxpbmUgY29uc3QgRGVmYXVsdExvb3Blcjo6VGltZXJTZXQmIFRlc3RMb29wZXI6OnRpbWVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRpbWVyczsKK30KKworaW5saW5lIGNvbnN0IERlZmF1bHRMb29wZXI6OlRpbWVyTGlzdCYgVGVzdExvb3Blcjo6YWN0aXZlVGltZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtQWN0aXZlVGltZXJzOworfQorCitpbmxpbmUgY29uc3QgRGVmYXVsdExvb3Blcjo6VGltZXJMaXN0JiBUZXN0TG9vcGVyOjpwZW5kaW5nVGltZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtUGVuZGluZ1RpbWVyczsKK30KKworaW5saW5lIGNvbnN0IERlZmF1bHRMb29wZXI6OkZkV2F0Y2hTZXQmIFRlc3RMb29wZXI6OmZkV2F0Y2hlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZkV2F0Y2hlczsKK30KKworaW5saW5lIGNvbnN0IERlZmF1bHRMb29wZXI6OkZkV2F0Y2hMaXN0JiBUZXN0TG9vcGVyOjpwZW5kaW5nRmRXYXRjaGVzKCkgY29uc3QgeworICAgIHJldHVybiBtUGVuZGluZ0ZkV2F0Y2hlczsKK30KKworaW5saW5lIGJvb2wgVGVzdExvb3Blcjo6ZXhpdFJlcXVlc3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvcmNlZEV4aXQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TWVtb3J5T3V0cHV0U3RyZWFtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RNZW1vcnlPdXRwdXRTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmFhZmYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TWVtb3J5T3V0cHV0U3RyZWFtLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBIGNvbnZlbmllbmNlIGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNvbGxlY3RzCisvLyBhbGwgd3JpdHRlbiBkYXRhIGludG8gYSBtZW1vcnkgYnVmZmVyLCB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgd2l0aAorLy8gaXRzIHZpZXcoKSBtZXRob2QsIGFuZCBjbGVhcmVkIHdpdGggaXRzIHJlc2V0KCkgbWV0aG9kLgorLy8gcmVhZCgpIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbSBhcmUgZm9yYmlkZGVuLgorY2xhc3MgVGVzdE1lbW9yeU91dHB1dFN0cmVhbSA6IHB1YmxpYyBTdHJlYW0geworcHVibGljOgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgb3ZlcnJpZGUgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIG92ZXJyaWRlIHsKKyAgICAgICAgbURhdGEuaW5zZXJ0KG1EYXRhLmVuZCgpLCBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpICsgbGVuKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KGxlbik7CisgICAgfQorCisgICAgU3RyaW5nVmlldyB2aWV3KCkgY29uc3QgeyByZXR1cm4gU3RyaW5nVmlldyhtRGF0YS5kYXRhKCksIG1EYXRhLnNpemUoKSk7IH0KKworICAgIHZvaWQgcmVzZXQoKSB7IG1EYXRhLmNsZWFyKCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBtRGF0YTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NzNhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3ROZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvTmV0d29ya1V0aWxzLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gQSBjdXN0b20gbmFtZSByZXNvbHZlciB1c2VkIGZvciB1bml0LXRlc3RpbmcuCisvLyBVc2FnZToKKy8vICAgIDEpIENyZWF0ZSBpbnN0YW5jZSBpbiBsb2NhbCBzY29wZS4KKy8vICAgIDIpIENhbGwgYWRkRW50cnkoKSB0byBhZGQgc3BlY2lmaWMgZW50cmllcy4KKy8vICAgIDMpIFBlcmZvcm0gYW55IGNhbGxzIHRoYXQgbWlnaHQgZW5kIHVwIGNhbGxpbmcgcXVlcnlJbnRlcmZhY2VOYW1lKCkKKy8vICAgIDQpIEF1dG9tYXRpY2FsbHkgY2xlYW5lZC11cCB3aGVuIGV4aXRpbmcgdGhlIHNjb3BlLgorY2xhc3MgVGVzdE5ldHdvcmtJbnRlcmZhY2VOYW1lUmVzb2x2ZXIgOiBwdWJsaWMgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciB7CitwdWJsaWM6CisgICAgVGVzdE5ldHdvcmtJbnRlcmZhY2VOYW1lUmVzb2x2ZXIoKQorICAgICAgICA6IG1PbGRSZXNvbHZlcihuZXRTZXROZXR3b3JrSW50ZXJmYWNlTmFtZVJlc29sdmVyRm9yVGVzdGluZyh0aGlzKSkge30KKworICAgIH5UZXN0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlcigpIHsKKyAgICAgICAgbmV0U2V0TmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlckZvclRlc3RpbmcobU9sZFJlc29sdmVyKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBxdWVyeUludGVyZmFjZU5hbWUoY29uc3QgY2hhciogc3RyKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IG1FbnRyaWVzKSB7CisgICAgICAgICAgICBpZiAoaXRlbS5maXJzdCA9PSBzdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZvaWQgYWRkRW50cnkoY29uc3QgY2hhciogbmFtZSwgaW50IGluZGV4KSB7CisgICAgICAgIG1FbnRyaWVzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihzdGQ6OnN0cmluZyhuYW1lKSwgaW5kZXgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgTmV0d29ya0ludGVyZmFjZU5hbWVSZXNvbHZlciogbU9sZFJlc29sdmVyOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgaW50Pj4gbUVudHJpZXM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0Y2IxNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oCkBAIC0wLDAgKzEsMzgxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgVGVzdFN5c3RlbSA6IHB1YmxpYyBTeXN0ZW0geworcHVibGljOgorICAgIFRlc3RTeXN0ZW0oU3RyaW5nVmlldyBsYXVuY2hlckRpciwKKyAgICAgICAgICAgICAgIGludCBob3N0Qml0bmVzcywKKyAgICAgICAgICAgICAgIFN0cmluZ1ZpZXcgaG9tZURpciA9ICIvaG9tZSIsCisgICAgICAgICAgICAgICBTdHJpbmdWaWV3IGFwcERhdGFEaXIgPSAiIikKKyAgICAgICAgOiBtUHJvZ3JhbURpcihsYXVuY2hlckRpciksCisgICAgICAgICAgbVByb2dyYW1TdWJkaXIoIiIpLAorICAgICAgICAgIG1MYXVuY2hlckRpcihsYXVuY2hlckRpciksCisgICAgICAgICAgbUhvbWVEaXIoaG9tZURpciksCisgICAgICAgICAgbUFwcERhdGFEaXIoYXBwRGF0YURpciksCisgICAgICAgICAgbUN1cnJlbnREaXIoaG9tZURpciksCisgICAgICAgICAgbUhvc3RCaXRuZXNzKGhvc3RCaXRuZXNzKSwKKyAgICAgICAgICBtSXNSZW1vdGVTZXNzaW9uKGZhbHNlKSwKKyAgICAgICAgICBtUmVtb3RlU2Vzc2lvblR5cGUoKSwKKyAgICAgICAgICBtVGVtcERpcihOVUxMKSwKKyAgICAgICAgICBtVGVtcFJvb3RQcmVmaXgoKSwKKyAgICAgICAgICBtRW52UGFpcnMoKSwKKyAgICAgICAgICBtUHJldlN5c3RlbShTeXN0ZW06OnNldEZvclRlc3RpbmcodGhpcykpLAorICAgICAgICAgIG1UaW1lcygpLAorICAgICAgICAgIG1TaGVsbEZ1bmMoTlVMTCksCisgICAgICAgICAgbVNoZWxsT3BhcXVlKE5VTEwpLAorICAgICAgICAgIG1Vbml4VGltZSgpLAorICAgICAgICAgIG1QaWQoKSB7fQorCisgICAgdmlydHVhbCB+VGVzdFN5c3RlbSgpIHsKKyAgICAgICAgU3lzdGVtOjpzZXRGb3JUZXN0aW5nKG1QcmV2U3lzdGVtKTsKKyAgICAgICAgZGVsZXRlIG1UZW1wRGlyOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFByb2dyYW1EaXJlY3RvcnkoKSBjb25zdCB7IHJldHVybiBtUHJvZ3JhbURpcjsgfQorCisgICAgLy8gU2V0IGRpcmVjdG9yeSBvZiBjdXJyZW50bHkgZXhlY3V0aW5nIGJpbmFyeS4gIFRoaXMgbXVzdCBiZSBhIHN1YmRpcmVjdG9yeQorICAgIC8vIG9mIG1MYXVuY2hlckRpciBhbmQgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIG1MYXVuY2hlckRpcgorICAgIHZvaWQgc2V0UHJvZ3JhbVN1YkRpcihTdHJpbmdWaWV3IHByb2dyYW1TdWJEaXIpIHsKKyAgICAgICAgbVByb2dyYW1TdWJkaXIgPSBwcm9ncmFtU3ViRGlyOworICAgICAgICBpZiAocHJvZ3JhbVN1YkRpci5lbXB0eSgpKSB7CisgICAgICAgICAgICBtUHJvZ3JhbURpciA9IGdldExhdW5jaGVyRGlyZWN0b3J5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUHJvZ3JhbURpciA9IFBhdGhVdGlsczo6am9pbihnZXRMYXVuY2hlckRpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbVN1YkRpcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRMYXVuY2hlckRpcmVjdG9yeSgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1MYXVuY2hlckRpci5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtTGF1bmNoZXJEaXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGVtcFJvb3QoKS0+cGF0aFN0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRMYXVuY2hlckRpcmVjdG9yeShTdHJpbmdWaWV3IGxhdW5jaGVyRGlyKSB7CisgICAgICAgIG1MYXVuY2hlckRpciA9IGxhdW5jaGVyRGlyOworICAgICAgICAvLyBVcGRhdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3VmZml4ZXMgb2YgfG1MYXVuY2hlckRpcnwuCisgICAgICAgIHNldFByb2dyYW1TdWJEaXIobVByb2dyYW1TdWJkaXIpOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldEhvbWVEaXJlY3RvcnkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSG9tZURpcjsKKyAgICB9CisKKyAgICB2b2lkIHNldEhvbWVEaXJlY3RvcnkoU3RyaW5nVmlldyBob21lRGlyKSB7IG1Ib21lRGlyID0gaG9tZURpcjsgfQorCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0QXBwRGF0YURpcmVjdG9yeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BcHBEYXRhRGlyOworICAgIH0KKworICAgIHZvaWQgc2V0QXBwRGF0YURpcmVjdG9yeShTdHJpbmdWaWV3IGFwcERhdGFEaXIpIHsKKyAgICAgICAgbUFwcERhdGFEaXIgPSBhcHBEYXRhRGlyOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudERpcmVjdG9yeSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50RGlyOyB9CisKKyAgICAvLyBTZXQgY3VycmVudCBkaXJlY3RvcnkgZHVyaW5nIHVuaXQtdGVzdGluZy4KKyAgICB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnlGb3JUZXN0aW5nKFN0cmluZ1ZpZXcgcGF0aCkgeyBtQ3VycmVudERpciA9IHBhdGg7IH0KKworICAgIHZpcnR1YWwgaW50IGdldEhvc3RCaXRuZXNzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhvc3RCaXRuZXNzOworICAgIH0KKworICAgIHZpcnR1YWwgT3NUeXBlIGdldE9zVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Pc1R5cGU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzUnVubmluZ1VuZGVyV2luZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1VbmRlcldpbmU7CisgICAgfQorCisgICAgdm9pZCBzZXRSdW5uaW5nVW5kZXJXaW5lKGJvb2wgdW5kZXJXaW5lKSB7CisgICAgICAgIG1VbmRlcldpbmUgPSB1bmRlcldpbmU7CisgICAgfQorCisgICAgdmlydHVhbCBQaWQgZ2V0Q3VycmVudFByb2Nlc3NJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1QaWQ7CisgICAgfQorCisgICAgdm9pZCBzZXRDdXJyZW50UHJvY2Vzc0lkKFBpZCBwaWQpIHsKKyAgICAgICAgbVBpZCA9IHBpZDsKKyAgICB9CisKKyAgICB2b2lkIHNldE9zVHlwZShPc1R5cGUgdHlwZSkgeworICAgICAgICBtT3NUeXBlID0gdHlwZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGVudkdldChTdHJpbmdWaWV3IHZhcm5hbWUpIGNvbnN0IHsKKyAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBtRW52UGFpcnMuc2l6ZSgpOyBuICs9IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gbUVudlBhaXJzW25dOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gdmFybmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtRW52UGFpcnNbbiArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVudkdldEFsbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW52UGFpcnMuc2l6ZSgpOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gbUVudlBhaXJzW2ldOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCA9IG1FbnZQYWlyc1tpICsgMV07CisgICAgICAgICAgICByZXMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKG5hbWUuY19zdHIoKSwgbmFtZS5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgJz0nICsgdmFsLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGVudlNldChTdHJpbmdWaWV3IHZhcm5hbWUsIFN0cmluZ1ZpZXcgdmFydmFsdWUpIHsKKyAgICAgICAgLy8gRmlyc3QsIGZpbmQgaWYgdGhlIG5hbWUgaXMgaW4gdGhlIGFycmF5LgorICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBtRW52UGFpcnMuc2l6ZSgpOyBuICs9IDIpIHsKKyAgICAgICAgICAgIGlmIChtRW52UGFpcnNbbl0gPT0gdmFybmFtZSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gc3RhdGljX2Nhc3Q8aW50PihuKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmFydmFsdWUuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gUmVtb3ZlIGRlZmluaXRpb24sIGlmIGFueS4KKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUVudlBhaXJzLmVyYXNlKG1FbnZQYWlycy5iZWdpbigpICsgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbnZQYWlycy5iZWdpbigpICsgaW5kZXggKyAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gUmVwbGFjZW1lbnQuCisgICAgICAgICAgICAgICAgbUVudlBhaXJzW2luZGV4ICsgMV0gPSB2YXJ2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gQWRkaXRpb24uCisgICAgICAgICAgICAgICAgbUVudlBhaXJzLnB1c2hfYmFjayh2YXJuYW1lKTsKKyAgICAgICAgICAgICAgICBtRW52UGFpcnMucHVzaF9iYWNrKHZhcnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBlbnZUZXN0KFN0cmluZ1ZpZXcgdmFybmFtZSkgY29uc3QgeworICAgICAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IG1FbnZQYWlycy5zaXplKCk7IG4gKz0gMikgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBtRW52UGFpcnNbbl07CisgICAgICAgICAgICBpZiAobmFtZSA9PSB2YXJuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoRXhpc3RzKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3QgeworICAgICAgICByZXR1cm4gcGF0aEV4aXN0c0ludGVybmFsKHRvVGVtcFJvb3QocGF0aCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoSXNGaWxlKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3QgeworICAgICAgICByZXR1cm4gcGF0aElzRmlsZUludGVybmFsKHRvVGVtcFJvb3QocGF0aCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoSXNEaXIoU3RyaW5nVmlldyBwYXRoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBwYXRoSXNEaXJJbnRlcm5hbCh0b1RlbXBSb290KHBhdGgpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENhblJlYWQoU3RyaW5nVmlldyBwYXRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoQ2FuUmVhZEludGVybmFsKHRvVGVtcFJvb3QocGF0aCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoQ2FuV3JpdGUoU3RyaW5nVmlldyBwYXRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoQ2FuV3JpdGVJbnRlcm5hbCh0b1RlbXBSb290KHBhdGgpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENhbkV4ZWMoU3RyaW5nVmlldyBwYXRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoQ2FuRXhlY0ludGVybmFsKHRvVGVtcFJvb3QocGF0aCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBkZWxldGVGaWxlKFN0cmluZ1ZpZXcgcGF0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZGVsZXRlRmlsZUludGVybmFsKHRvVGVtcFJvb3QocGF0aCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoRmlsZVNpemUoU3RyaW5nVmlldyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVNpemUqIG91dEZpbGVTaXplKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoRmlsZVNpemVJbnRlcm5hbCh0b1RlbXBSb290KHBhdGgpLCBvdXRGaWxlU2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2NhbkRpckVudHJpZXMoCisgICAgICAgICAgICBTdHJpbmdWaWV3IGRpclBhdGgsCisgICAgICAgICAgICBib29sIGZ1bGxQYXRoID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgZ2V0VGVtcFJvb3QoKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSB0ZW1wIHJvb3Q7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmV3UGF0aCA9IHRvVGVtcFJvb3QoZGlyUGF0aCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXN1bHQgPSBzY2FuRGlySW50ZXJuYWwobmV3UGF0aCk7CisgICAgICAgIGlmIChmdWxsUGF0aCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gUGF0aFV0aWxzOjphZGRUcmFpbGluZ0RpclNlcGFyYXRvcihkaXJQYXRoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgcmVzdWx0LnNpemUoKTsgKytuKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W25dID0gcHJlZml4ICsgcmVzdWx0W25dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCBUZXN0VGVtcERpciogZ2V0VGVtcFJvb3QoKSBjb25zdCB7CisgICAgICAgIGlmICghbVRlbXBEaXIpIHsKKyAgICAgICAgICAgIG1UZW1wRGlyID0gbmV3IFRlc3RUZW1wRGlyKCJUZXN0U3lzdGVtIik7CisgICAgICAgICAgICBtVGVtcFJvb3RQcmVmaXggPSBQYXRoVXRpbHM6OmFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhtVGVtcERpci0+cGF0aCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1UZW1wRGlyOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1JlbW90ZVNlc3Npb24oc3RkOjpzdHJpbmcqIHNlc3Npb25UeXBlKSBjb25zdCB7CisgICAgICAgIGlmICghbUlzUmVtb3RlU2Vzc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpzZXNzaW9uVHlwZSA9IG1SZW1vdGVTZXNzaW9uVHlwZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRm9yY2UgdGhlIHJlbW90ZSBzZXNzaW9uIHR5cGUuIElmIHxzZXNzaW9uVHlwZXwgaXMgTlVMTCBvciBlbXB0eSwKKyAgICAvLyB0aGlzIHNldHMgdGhlIHNlc3Npb24gYXMgbG9jYWwuIE90aGVyd2lzZSwgfCpzZXNzaW9uVHlwZXwgbXVzdCBiZQorICAgIC8vIGEgc2Vzc2lvbiB0eXBlLgorICAgIHZvaWQgc2V0UmVtb3RlU2Vzc2lvblR5cGUoU3RyaW5nVmlldyBzZXNzaW9uVHlwZSkgeworICAgICAgICBtSXNSZW1vdGVTZXNzaW9uID0gIXNlc3Npb25UeXBlLmVtcHR5KCk7CisgICAgICAgIGlmIChtSXNSZW1vdGVTZXNzaW9uKSB7CisgICAgICAgICAgICBtUmVtb3RlU2Vzc2lvblR5cGUgPSBzZXNzaW9uVHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgVGltZXMgZ2V0UHJvY2Vzc1RpbWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRpbWVzOworICAgIH0KKworICAgIHZvaWQgc2V0UHJvY2Vzc1RpbWVzKGNvbnN0IFRpbWVzJiB0aW1lcykgeworICAgICAgICBtVGltZXMgPSB0aW1lczsKKyAgICB9CisKKyAgICAvLyBUeXBlIG9mIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZHVyaW5nIHVuaXQtdGVzdGluZyB0bworICAgIC8vIHJlY2VpdmUgdGhlIHBhcmFtZXRlcnMgb2YgYSBydW5Db21tYW5kKCkgY2FsbC4gUmVnaXN0ZXIgaXQKKyAgICAvLyB3aXRoIHNldFNoZWxsQ29tbWFuZCgpLgorICAgIHR5cGVkZWYgYm9vbChTaGVsbENvbW1hbmQpKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6RHVyYXRpb24gdGltZW91dE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UHJvY2Vzc0V4aXRDb2RlKiBvdXRFeGl0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OlBpZCogb3V0Q2hpbGRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dHB1dEZpbGUpOworCisgICAgLy8gUmVnaXN0ZXIgYSBzaWxlbnQgc2hlbGwgZnVuY3Rpb24uIHxzaGVsbHwgaXMgdGhlIGZ1bmN0aW9uIGNhbGxiYWNrLAorICAgIC8vIGFuZCB8c2hlbGxPcGFxdWV8IGEgdXNlci1wcm92aWRlZCBwb2ludGVyIHBhc3NlZCBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyLgorICAgIHZvaWQgc2V0U2hlbGxDb21tYW5kKFNoZWxsQ29tbWFuZCogc2hlbGwsIHZvaWQqIHNoZWxsT3BhcXVlKSB7CisgICAgICAgIG1TaGVsbEZ1bmMgPSBzaGVsbDsKKyAgICAgICAgbVNoZWxsT3BhcXVlID0gc2hlbGxPcGFxdWU7CisgICAgfQorCisgICAgYm9vbCBydW5Db21tYW5kKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgICAgIFJ1bk9wdGlvbnMgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpEdXJhdGlvbiB0aW1lb3V0TXMsCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UHJvY2Vzc0V4aXRDb2RlKiBvdXRFeGl0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQaWQqIG91dENoaWxkUGlkLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0cHV0RmlsZSkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIWNvbW1hbmRMaW5lLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIElmIGEgc2lsZW50IHNoZWxsIGZ1bmN0aW9uIHdhcyByZWdpc3RlcmVkLCBpbnZva2UgaXQsIG90aGVyd2lzZQorICAgICAgICAvLyBpZ25vcmUgdGhlIGNvbW1hbmQgY29tcGxldGVseS4KKyAgICAgICAgYm9vbCByZXN1bHQgPSB0cnVlOworCisgICAgICAgIGlmIChtU2hlbGxGdW5jKSB7CisgICAgICAgICAgICByZXN1bHQgPSAoKm1TaGVsbEZ1bmMpKG1TaGVsbE9wYXF1ZSwgY29tbWFuZExpbmUsIHRpbWVvdXRNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhpdENvZGUsIG91dENoaWxkUGlkLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRUZW1wRGlyKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoIi90bXAiKTsgfQorCisgICAgdmlydHVhbCB0aW1lX3QgZ2V0VW5peFRpbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtVW5peFRpbWUgLyAxMDAwMDAwOworICAgIH0KKworICAgIHZpcnR1YWwgRHVyYXRpb24gZ2V0VW5peFRpbWVVcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Vbml4VGltZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFdhbGxEdXJhdGlvbiBnZXRIaWdoUmVzVGltZVVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVVuaXhUaW1lOworICAgIH0KKworICAgIHZvaWQgc2V0VW5peFRpbWUodGltZV90IHRpbWUpIHsKKyAgICAgICAgc2V0VW5peFRpbWVVcyh0aW1lICogMTAwMDAwMExMKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFVuaXhUaW1lVXMoRHVyYXRpb24gdGltZSkgeworICAgICAgICBtVW5peFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzbGVlcE1zKHVuc2lnbmVkIG4pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gRG9uJ3Qgc2xlZXAgaW4gdGVzdHMsIHVzZSB0aGUgc3RhdGljIGZ1bmN0aW9ucyBmcm9tIFRocmVhZCBjbGFzcworICAgICAgICAvLyBpZiB5b3UgbmVlZCBhIGRlbGF5ICh5b3UgZG9uJ3QhKS4KKyAgICAgICAgVGhyZWFkOjp5aWVsZCgpOyAgICAvLyBBZGQgYSBzbWFsbCBkZWxheSB0byBtaW1pYyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IuCisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHlpZWxkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBUaHJlYWQ6OnlpZWxkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIHRvVGVtcFJvb3QoU3RyaW5nVmlldyBwYXRoKSBjb25zdCB7CisgICAgICAgIC8vIG1UZW1wUm9vdFByZWZpeCBlbmRzIHdpdGggYSBkaXIgc2VwYXJhdG9yLCBpZ25vcmUgaXQgZm9yIGNvbXBhcmlzb24uCisgICAgICAgIFN0cmluZ1ZpZXcgcHJlZml4KG1UZW1wUm9vdFByZWZpeC5jX3N0cigpLCBtVGVtcFJvb3RQcmVmaXguc2l6ZSgpIC0gMSk7CisgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpIDw9IHBhdGguc2l6ZSgpICYmCisgICAgICAgICAgICBwcmVmaXggPT0gU3RyaW5nVmlldyhwYXRoLmNfc3RyKCksIHByZWZpeC5zaXplKCkpICYmCisgICAgICAgICAgICAocHJlZml4LnNpemUoKSA9PSBwYXRoLnNpemUoKSB8fAorICAgICAgICAgICAgIFBhdGhVdGlsczo6aXNEaXJTZXBhcmF0b3IocGF0aFtwcmVmaXguc2l6ZSgpXSkpKSB7CisgICAgICAgICAgICAvLyBBdm9pZCBwcmVwZW5kaW5nIHByZWZpeCBpZiBpdCdzIGFscmVhZHkgdGhlcmUuCisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtVGVtcFJvb3RQcmVmaXggKyBwYXRoLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBtUHJvZ3JhbURpcjsKKyAgICBzdGQ6OnN0cmluZyBtUHJvZ3JhbVN1YmRpcjsKKyAgICBzdGQ6OnN0cmluZyBtTGF1bmNoZXJEaXI7CisgICAgc3RkOjpzdHJpbmcgbUhvbWVEaXI7CisgICAgc3RkOjpzdHJpbmcgbUFwcERhdGFEaXI7CisgICAgc3RkOjpzdHJpbmcgbUN1cnJlbnREaXI7CisgICAgaW50IG1Ib3N0Qml0bmVzczsKKyAgICBib29sIG1Jc1JlbW90ZVNlc3Npb247CisgICAgc3RkOjpzdHJpbmcgbVJlbW90ZVNlc3Npb25UeXBlOworICAgIG11dGFibGUgVGVzdFRlbXBEaXIqIG1UZW1wRGlyOworICAgIG11dGFibGUgc3RkOjpzdHJpbmcgbVRlbXBSb290UHJlZml4OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtRW52UGFpcnM7CisgICAgU3lzdGVtKiBtUHJldlN5c3RlbTsKKyAgICBUaW1lcyBtVGltZXM7CisgICAgU2hlbGxDb21tYW5kKiBtU2hlbGxGdW5jOworICAgIHZvaWQqIG1TaGVsbE9wYXF1ZTsKKyAgICBEdXJhdGlvbiBtVW5peFRpbWU7CisgICAgT3NUeXBlIG1Pc1R5cGUgPSBPc1R5cGU6OldpbmRvd3M7CisgICAgYm9vbCBtVW5kZXJXaW5lID0gZmFsc2U7CisgICAgUGlkIG1QaWQgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaApAQCAtMCwwICsxLDIzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyN1bmRlZiBFUlJPUgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgY2xhc3MgdXNlZCB0byBtb2RlbCBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdXNlZCBkdXJpbmcgdGVzdGluZy4KKy8vIFVzYWdlIGlzIHNpbXBsZToKKy8vCisvLyAgICAgIHsKKy8vICAgICAgICBUZXN0VGVtcERpciBteURpcigibXlfdGVzdCIpOyAgIC8vIGNyZWF0ZXMgbmV3IHRlbXAgZGlyZWN0b3J5LgorLy8gICAgICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7ICAgICAgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisvLyAgICAgICAgLi4uIHdyaXRlIGZpbGVzIGludG8gZGlyZWN0b3J5IHBhdGggbXlEaXItPnBhdGgoKQorLy8gICAgICAgIC4uLiBkbyB5b3VyIHRlc3QKKy8vICAgICAgfSAgIC8vIGRlc3RydWN0b3IgcmVtb3ZlcyB0ZW1wIGRpcmVjdG9yeSBhbmQgYWxsIGZpbGVzIHVuZGVyIGl0LgorCitjbGFzcyBUZXN0VGVtcERpciB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZS4gVGhpcyBhbHNvIHRyaWVzIHRvIGNyZWF0ZSBhIG5ldyB0ZW1wb3JhcnkKKyAgICAvLyBkaXJlY3RvcnkuIHxkZWJ1Z1ByZWZpeHwgaXMgYW4gb3B0aW9uYWwgbmFtZSBwcmVmaXggYW5kIGNhbiBiZSBOVUxMLgorICAgIFRlc3RUZW1wRGlyKFN0cmluZ1ZpZXcgZGVidWdOYW1lKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRlbXBfZGlyID0gZ2V0VGVtcFBhdGgoKTsKKyAgICAgICAgaWYgKCFkZWJ1Z05hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgdGVtcF9kaXIgKz0gZGVidWdOYW1lOworICAgICAgICAgICAgdGVtcF9kaXIgKz0gIi4iOworICAgICAgICB9CisgICAgICAgIHRlbXBfZGlyICs9ICJYWFhYWFgiOworICAgICAgICBpZiAobWtkdGVtcCgmdGVtcF9kaXJbMF0pKSB7CisgICAgICAgICAgICBtUGF0aCA9IHRlbXBfZGlyLmNfc3RyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnksIG9yIE5VTEwgaWYgaXQgY291bGQgbm90CisgICAgLy8gYmUgY3JlYXRlZCBmb3Igc29tZSByZWFzb24uCisgICAgY29uc3QgY2hhciogcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRoLnNpemUoKSA/IG1QYXRoLmNfc3RyKCkgOiBOVUxMOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIHBhdGggYXMgYSBzdHJpbmcuIEl0IHdpbGwgYmUgZW1wdHkgaWYgdGhlIGRpcmVjdG9yeSBjb3VsZAorICAgIC8vIG5vdCBiZSBjcmVhdGVkIGZvciBzb21lIHJlYXNvbi4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1QYXRoOyB9CisKKyAgICAvLyBEZXN0cm95IGluc3RhbmNlLCBhbmQgcmVtb3ZlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgYWxsIGZpbGVzCisgICAgLy8gaW5zaWRlIGl0LgorICAgIH5UZXN0VGVtcERpcigpIHsKKyAgICAgICAgaWYgKG1QYXRoLnNpemUoKSkgeworICAgICAgICAgICAgRGVsZXRlUmVjdXJzaXZlKG1QYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIENyZWF0ZSB0aGUgcGF0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeSB1bmRlciB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICBzdGQ6OnN0cmluZyBtYWtlU3ViUGF0aChTdHJpbmdWaWV3IHN1YnBhdGgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0Zvcm1hdCgiJXMvJXMiLCBtUGF0aCwgc3VicGF0aCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGRpcmVjdG9yeSB1bmRlciB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAgICBib29sIG1ha2VTdWJEaXIoU3RyaW5nVmlldyBzdWJkaXIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG1ha2VTdWJQYXRoKHN1YmRpcik7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIGlmIChta2RpcihwYXRoLmNfc3RyKCkpIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbid0IGNyZWF0ZSAiIDw8IHBhdGguY19zdHIoKSA8PCAiOiAiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAobWtkaXIocGF0aC5jX3N0cigpLCAwNzU1KSA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW4ndCBjcmVhdGUgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIjogIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBmaWxlIHVuZGVyIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgIGJvb2wgbWFrZVN1YkZpbGUoU3RyaW5nVmlldyBmaWxlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBtYWtlU3ViUGF0aChmaWxlKTsKKyAgICAgICAgaW50IGZkID0gOjpvcGVuKHBhdGguY19zdHIoKSwgT19XUk9OTFl8T19DUkVBVCwgMDc0NCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW4ndCBjcmVhdGUgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIjogIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICA6OmNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUZXN0VGVtcERpcik7CisKKyAgICB2b2lkIERlbGV0ZVJlY3Vyc2l2ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgICAgICAvLyBGaXJzdCByZW1vdmUgYW55IGZpbGVzIGluIHRoZSBkaXIKKyAgICAgICAgRElSKiBkaXIgPSBvcGVuZGlyKHBhdGguY19zdHIoKSk7CisgICAgICAgIGlmICghZGlyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkaXJlbnQqIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChlbnRyeS0+ZF9uYW1lLCAiLiIpIHx8ICFzdHJjbXAoZW50cnktPmRfbmFtZSwgIi4uIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVudHJ5X3BhdGggPSBTdHJpbmdGb3JtYXQoIiVzLyVzIiwgcGF0aCwgZW50cnktPmRfbmFtZSk7CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0czsKKyAgICAgICAgICAgIGFuZHJvaWRfbHN0YXQoZW50cnlfcGF0aC5jX3N0cigpLCAmc3RhdHMpOworICAgICAgICAgICAgaWYgKFNfSVNESVIoc3RhdHMuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICBEZWxldGVSZWN1cnNpdmUoZW50cnlfcGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVubGluayhlbnRyeV9wYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNsb3NlZGlyKGRpcik7CisgICAgICAgIHJtZGlyKHBhdGguY19zdHIoKSk7CisgICAgfQorCisjaWZkZWYgX1dJTjMyCisgICAgc3RkOjpzdHJpbmcgZ2V0VGVtcFBhdGgoKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgICAgRFdPUkQgbGVuID0gR2V0VGVtcFBhdGgoMCwgTlVMTCk7CisgICAgICAgIGlmICghbGVuKSB7CisgICAgICAgICAgICBMT0coRkFUQUwpIDw8ICJDYW4ndCBmaW5kIHRlbXBvcmFyeSBwYXRoISI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnJlc2l6ZShzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikpOworICAgICAgICBHZXRUZW1wUGF0aChsZW4sICZyZXN1bHRbMF0pOworICAgICAgICAvLyBUaGUgbGVuZ3RoIHJldHVybmVkIGJ5IEdldFRlbXBQYXRoKCkgaXMgc29tZXRpbWVzIHRvbyBsYXJnZS4KKyAgICAgICAgcmVzdWx0LnJlc2l6ZSg6OnN0cmxlbihyZXN1bHQuY19zdHIoKSkpOworICAgICAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHJlc3VsdC5zaXplKCk7ICsrbikgeworICAgICAgICAgICAgaWYgKHJlc3VsdFtuXSA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0W25dID0gJy8nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuc2l6ZSgpICYmIHJlc3VsdFtyZXN1bHQuc2l6ZSgpIC0gMV0gIT0gJy8nKSB7CisgICAgICAgICAgICByZXN1bHQgKz0gJy8nOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgY2hhciogbWtkdGVtcChjaGFyKiBwYXRoKSB7CisgICAgICAgIGNoYXIqIHNlcCA9IDo6c3RycmNocihwYXRoLCAnLycpOworICAgICAgICBpZiAoc2VwKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICAqc2VwID0gJ1wwJzsgIC8vIHRlbXBvcmFyaWx5IHplcm8tdGVybWluYXRlIHRoZSBkaXJuYW1lLgorICAgICAgICAgICAgcmV0ID0gYW5kcm9pZF9zdGF0KHBhdGgsICZzdCk7CisgICAgICAgICAgICAqc2VwID0gJy8nOyAgIC8vIHJlc3RvcmUgZnVsbCBwYXRoLgorICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghU19JU0RJUihzdC5zdF9tb2RlKSkgeworICAgICAgICAgICAgICAgIGVycm5vID0gRU5PVERJUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExvb3AuIE9uIGVhY2ggaXRlcmF0aW9uLCByZXBsYWNlIHRoZSBYWFhYWFggc3VmZml4IHdpdGggYSByYW5kb20KKyAgICAgICAgLy8gbnVtYmVyLgorICAgICAgICBjaGFyKiBwYXRoX2VuZCA9IHBhdGggKyA6OnN0cmxlbihwYXRoKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtTdWZmaXhMZW4gPSA2VTsKKyAgICAgICAgZm9yIChpbnQgdHJpZXMgPSAxMjg7IHRyaWVzID4gMDsgdHJpZXMtLSkgeworICAgICAgICAgICAgaW50IHJhbmRvbSA9IHJhbmQoKSAlIDEwMDAwMDA7CisKKyAgICAgICAgICAgIHNucHJpbnRmKHBhdGhfZW5kIC0ga1N1ZmZpeExlbiwga1N1ZmZpeExlbiArIDEsICIlMGQiLCByYW5kb20pOworICAgICAgICAgICAgaWYgKG1rZGlyKHBhdGgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsgIC8vIFN1Y2Nlc3MKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZWxzZSAgLy8gIV9XSU4zMgorICAgIHN0ZDo6c3RyaW5nIGdldFRlbXBQYXRoKCkgeworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICAgIC8vIE9ubHkgY2hlY2sgVE1QRElSIGlmIHdlJ3JlIG5vdCByb290LgorICAgICAgICBpZiAoZ2V0dWlkKCkgIT0gMCAmJiBnZXRnaWQoKSAhPSAwKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0bXBkaXIgPSA6OmdldGVudigiVE1QRElSIik7CisgICAgICAgICAgICBpZiAodG1wZGlyICYmIHRtcGRpclswXSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRtcGRpcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBPdGhlcndpc2UgdXNlIFBfdG1wZGlyLCB3aGljaCBkZWZhdWx0cyB0byAvdG1wCisgICAgICAgIGlmIChyZXN1bHQuZW1wdHkoKSkgeworIyAgaWZuZGVmIFBfdG1wZGlyCisjICBkZWZpbmUgUF90bXBkaXIgIi90bXAiCisjICBlbmRpZgorICAgICAgICAgICAgcmVzdWx0ID0gUF90bXBkaXI7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBpdCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5LgorICAgICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICAgICAgaW50IHJldCA9IGFuZHJvaWRfc3RhdChyZXN1bHQuY19zdHIoKSwgJnN0KTsKKyAgICAgICAgaWYgKHJldCA8IDAgfHwgIVNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIExPRyhGQVRBTCkgPDwgIkNhbid0IGZpbmQgdGVtcG9yYXJ5IHBhdGg6IFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdC5jX3N0cigpIDw8ICJdIjsKKyAgICAgICAgfQorICAgICAgICAvLyBFbnN1cmUgdGhlcmUgaXMgYSB0cmFpbGluZyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorICAgICAgICBpZiAocmVzdWx0LnNpemUoKSAmJiByZXN1bHRbcmVzdWx0LnNpemUoKSAtIDFdICE9ICcvJykgeworICAgICAgICAgICAgcmVzdWx0ICs9ICcvJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyNlbmRpZiAgLy8gIV9XSU4zMgorCisgICAgc3RkOjpzdHJpbmcgbVBhdGg7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRocmVhZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxM2UzZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRocmVhZC5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFZlcnkgYmFzaWMgcGxhdGZvcm0gdGhyZWFkIHdyYXBwZXIgdGhhdCBvbmx5IHVzZXMgYSB0aW55IHN0YWNrLgorLy8gVGhpcyBzaGFsbCBvbmx5IGJlIHVzZWQgZHVyaW5nIHVuaXQgdGVzdGluZywgYW5kIGFsbG93cyB0ZXN0IGNvZGUKKy8vIHRvIG5vdCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmJhc2U6OlRocmVhZC4KK2NsYXNzIFRlc3RUaHJlYWQgeworcHVibGljOgorICAgIC8vIE1haW4gdGhyZWFkIGZ1bmN0aW9uIHR5cGUuCisgICAgdHlwZWRlZiB2b2lkKiAoVGhyZWFkRnVuY3Rpb24pKHZvaWQqIHBhcmFtKTsKKworICAgIC8vIENvbnN0cnVjdG9yIGFjdHVhbGx5IGxhdW5jaGVzIGEgbmV3IHBsYXRmb3JtIHRocmVhZC4KKyAgICBUZXN0VGhyZWFkKFRocmVhZEZ1bmN0aW9uKiBmdW5jLCB2b2lkKiBmdW5jUGFyYW0sCisgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplID0gMTYzODQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgbVRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQgV0lOQVBJICgqKSh2b2lkKikpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyNlbHNlCisgICAgICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0ciwgc3RhY2tTaXplKTsKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1UaHJlYWQsICAmYXR0ciwgZnVuYywgZnVuY1BhcmFtKTsKKyAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworI2VuZGlmCisgICAgfQorCisgICAgflRlc3RUaHJlYWQoKSB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIENsb3NlSGFuZGxlKG1UaHJlYWQpOworI2VuZGlmCisgICAgfQorCisgICAgaW50cHRyX3Qgam9pbigpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChtVGhyZWFkLCBJTkZJTklURSk7CisgICAgICAgIERXT1JEIHJldCA9IDA7CisgICAgICAgIDo6R2V0RXhpdENvZGVUaHJlYWQobVRocmVhZCwgJnJldCk7CisjZWxzZQorICAgICAgICB2b2lkKiByZXQgPSBOVUxMOworICAgICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJnJldCk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIChpbnRwdHJfdClyZXQ7CisgICAgfQorCitwcml2YXRlOgorI2lmZGVmIF9XSU4zMgorICAgIEhBTkRMRSBtVGhyZWFkOworI2Vsc2UKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKyNlbmRpZgorfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1V0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90ZXN0aW5nL1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxYjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVXRpbHMuaApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNkZWZpbmUgU0tJUF9URVNUX09OX1dJTkUoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKFN5c3RlbTo6Z2V0KCktPmlzUnVubmluZ1VuZGVyV2luZSgpKSB7IFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitpbmxpbmUgYXV0byBzZXRTY29wZWRDb21tYUxvY2FsZSgpIC0+CisgICAgYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ3VzdG9tUHRyPGNoYXIsIHZvaWQoKikoY29uc3QgY2hhciopPiB7CisjaWZkZWYgX1dJTjMyCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbW1hTG9jYWxlTmFtZVtdID0gIkZyZW5jaCI7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb21tYUxvY2FsZU5hbWVbXSA9ICJmcl9GUi5VVEYtOCI7CisjZW5kaWYKKworICAgIC8vIFNldCB1cCBhIGxvY2FsZSB3aXRoIGNvbW1hIGFzIGEgZGVjaW1hbCBtYXJrLgorICAgIGF1dG8gb2xkTG9jYWxlID0gc2V0bG9jYWxlKExDX0FMTCwgbnVsbHB0cik7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIG9sZExvY2FsZSk7CisgICAgaWYgKCFvbGRMb2NhbGUpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICAvLyBzZXRsb2NhbGUoKSB3aWxsIG92ZXJ3cml0ZSB0aGUgfG9sZExvY2FsZXwgcG9pbnRlcidzIGRhdGEsIHNvIGNvcHkgaXQuCisgICAgYXV0byBvbGRMb2NhbGVDb3B5ID0gYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ1B0cjxjaGFyPihzdHJkdXAob2xkTG9jYWxlKSk7CisgICAgYXV0byBuZXdMb2NhbGUgPSBzZXRsb2NhbGUoTENfQUxMLCBjb21tYUxvY2FsZU5hbWUpOworICAgIEVYUEVDVF9ORShudWxscHRyLCBuZXdMb2NhbGUpOworICAgIGlmICghbmV3TG9jYWxlKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBFWFBFQ1RfU1RSRVEoIiwiLCBsb2NhbGVjb252KCktPmRlY2ltYWxfcG9pbnQpOworCisgICAgLy8gUmVzdG9yZSB0aGUgbG9jYWxlIGFmdGVyIHRoZSB0ZXN0LgorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjptYWtlQ3VzdG9tU2NvcGVkUHRyKAorICAgICAgICAgICAgb2xkTG9jYWxlQ29weS5yZWxlYXNlKCksIFtdKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAgICAgICAgICAgICBhdXRvIG5hbWVEZWxldGVyID0gYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ1B0cjxjb25zdCBjaGFyPihuYW1lKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgc2V0bG9jYWxlKExDX0FMTCwgbmFtZSkpOworICAgICAgICAgICAgfSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvQXN5bmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MWY2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmNwcApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9Bc3luYy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvRnVuY3RvclRocmVhZC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFNlbGZEZWxldGluZ1RocmVhZCBmaW5hbCA6IHB1YmxpYyBGdW5jdG9yVGhyZWFkIHsKK3B1YmxpYzoKKyAgICB1c2luZyBGdW5jdG9yVGhyZWFkOjpGdW5jdG9yVGhyZWFkOworCisgICAgZXhwbGljaXQgU2VsZkRlbGV0aW5nVGhyZWFkKGNvbnN0IEZ1bmN0b3JUaHJlYWQ6OkZ1bmN0b3ImIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEZsYWdzIGZsYWdzID0gVGhyZWFkRmxhZ3M6Ok1hc2tTaWduYWxzKQorICAgICAgICA6IEZ1bmN0b3JUaHJlYWQoZnVuYywgZmxhZ3MgfCBUaHJlYWRGbGFnczo6RGV0YWNoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorfTsKKworfQorCitib29sIGFzeW5jKGNvbnN0IFRocmVhZEZ1bmN0b3ImIGZ1bmMsIFRocmVhZEZsYWdzIGZsYWdzKSB7CisgICAgYXV0byB0aHJlYWQgPQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNlbGZEZWxldGluZ1RocmVhZD4oCisgICAgICAgICAgICAgICAgbmV3IFNlbGZEZWxldGluZ1RocmVhZChmdW5jLCBmbGFncykpOworICAgIGlmICh0aHJlYWQtPnN0YXJ0KCkpIHsKKyAgICAgICAgdGhyZWFkLnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvQXN5bmMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvQXN5bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTRiNzAwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9Bc3luYy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UeXBlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9UeXBlVHJhaXRzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gUnVuIGEgc3BlY2lmaWVkIGZ1bmN0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsCisvLyBub3Qgd2FpdGluZyBmb3IgYW55IGtpbmQgb2YgcmVzdWx0CisvLyByZXR1cm5zIHRydWUgaWYgdGhyZWFkIHN0YXJ0cyBzdWNjZXNzZnVsbHkKK2Jvb2wgYXN5bmMoY29uc3QgVGhyZWFkRnVuY3RvciYgZnVuYywKKyAgICAgICAgICAgVGhyZWFkRmxhZ3MgZmxhZ3MgPSBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ2FsbGFibGUsIGNsYXNzID0gZW5hYmxlX2lmPGlzX2NhbGxhYmxlX2FzPENhbGxhYmxlLCB2b2lkKCk+Pj4KK2Jvb2wgYXN5bmMoQ2FsbGFibGUmJiBmdW5jLCBUaHJlYWRGbGFncyBmbGFncyA9IFRocmVhZEZsYWdzOjpNYXNrU2lnbmFscykgeworICAgIHJldHVybiBhc3luYyhUaHJlYWRGdW5jdG9yKFtmdW5jXSgpIHsgZnVuYygpOyByZXR1cm4gaW50cHRyX3QoKTsgfSksIGZsYWdzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9GdW5jdG9yVGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY1YjY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9GdW5jdG9yVGhyZWFkLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJGdW5jdG9yVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworCitGdW5jdG9yVGhyZWFkOjpGdW5jdG9yVGhyZWFkKGNvbnN0IEZ1bmN0b3ImIGZ1bmMsIFRocmVhZEZsYWdzIGZsYWdzKQorICAgIDogVGhyZWFkKGZsYWdzKQorICAgICwgbVRocmVhZEZ1bmMoZnVuYykgeworICAgIGFzc2VydChtVGhyZWFkRnVuYyk7Cit9CisKK2ludHB0cl90IEZ1bmN0b3JUaHJlYWQ6Om1haW4oKSB7CisgICAgcmV0dXJuIG1UaHJlYWRGdW5jKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9GdW5jdG9yVGhyZWFkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEzNTAzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9GdW5jdG9yVGhyZWFkLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1R5cGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1R5cGVUcmFpdHMuaCIKKworLy8gRnVuY3RvclRocmVhZCBjbGFzcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiYXNlIFRocmVhZCBpbnRlcmZhY2UgdGhhdAorLy8gYWxsb3dzIG9uZSB0byBydW4gYSBmdW5jdGlvbiBvYmplY3QgaW4gc2VwYXJhdGUgdGhyZWFkLiBJdCdzIG1vc3RseSBhCisvLyBjb252ZW5pZW5jZSBjbGFzcyBzbyBvbmUgZG9lc24ndCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGNsYXNzIGlmIHRoZSBvbmx5CisvLyBuZWVkZWQgdGhpbmcgaXMgdG8gcnVuIGEgc3BlY2lmaWMgZXhpc3RpbmcgZnVuY3Rpb24gaW4gYSB0aHJlYWQuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworY2xhc3MgRnVuY3RvclRocmVhZCA6IHB1YmxpYyBhbmRyb2lkOjpiYXNlOjpUaHJlYWQgeworcHVibGljOgorICAgIHVzaW5nIEZ1bmN0b3IgPSBhbmRyb2lkOjpiYXNlOjpUaHJlYWRGdW5jdG9yOworCisgICAgZXhwbGljaXQgRnVuY3RvclRocmVhZChjb25zdCBGdW5jdG9yJiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRmxhZ3MgZmxhZ3MgPSBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpOworCisgICAgLy8gQSBjb25zdHJ1Y3RvciBmcm9tIGEgdm9pZCBmdW5jdGlvbiBpbiBjYXNlIHdoZW4gcmVzdWx0IGlzbid0IGltcG9ydGFudC4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRnVuYywKKyAgICAgICAgICAgICAgY2xhc3MgPSBlbmFibGVfaWY8aXNfY2FsbGFibGVfYXM8RnVuYywgdm9pZCgpPj4+CisgICAgZXhwbGljaXQgRnVuY3RvclRocmVhZChjb25zdCBGdW5jJiBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRmxhZ3MgZmxhZ3MgPSBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpCisgICAgICAgIDogVGhyZWFkKGZsYWdzKSwgbVRocmVhZEZ1bmMoW2Z1bmNdKCkgeworICAgICAgICAgICAgICBmdW5jKCk7CisgICAgICAgICAgICAgIHJldHVybiBpbnRwdHJfdCgpOworICAgICAgICAgIH0pIHt9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCBpbnRwdHJfdCBtYWluKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgRnVuY3RvciBtVGhyZWFkRnVuYzsKKyAgICBUaHJlYWRGbGFncyBtRmxhZ3M7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvRnVuY3RvclRocmVhZF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZmUwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkZ1bmN0b3JUaHJlYWQ7CisKK3N0YXRpYyBpbnQgaW50RnVuYygpIHsKKyAgICByZXR1cm4gNDM7Cit9CisKK3N0YXRpYyBpbnRwdHJfdCBpbnRwdHJGdW5jKCkgeworICAgIHJldHVybiBpbnRwdHJfdCgmaW50RnVuYyk7Cit9CisKK3N0YXRpYyBpbnQgcGFyYW1GdW5jKGludCBpKSB7CisgICAgcmV0dXJuIDA7Cit9CisKK1RFU1QoRnVuY3RvclRocmVhZFRlc3QsIFRlc3RDdG9yKSB7CisgICAgLy8gdGhpcyB0ZXN0IGFjdHVhbGx5IGp1c3QgbWFrZXMgc3VyZSBhbGwgY29uc3RydWN0b3Igc3ludGF4ZXMgY29tcGlsZSBmaW5lCisgICAgRnVuY3RvclRocmVhZCB0MXtpbnRGdW5jfTsKKyAgICBGdW5jdG9yVGhyZWFkIHQye2ludHB0ckZ1bmN9OworICAgIEZ1bmN0b3JUaHJlYWQgdDN7c3RkOjpiaW5kKHBhcmFtRnVuYywgMil9OworICAgIEZ1bmN0b3JUaHJlYWQgdDR7RnVuY3RvclRocmVhZDo6RnVuY3RvcihpbnRGdW5jKX07CisgICAgRnVuY3RvclRocmVhZCB0NXtbXSgpeyByZXR1cm4gLTE7fX07Cit9CisKK1RFU1QoRnVuY3RvclRocmVhZFRlc3QsIFRlc3RSdW4pIHsKKyAgICBib29sIHJhbiA9IGZhbHNlOworICAgIEZ1bmN0b3JUaHJlYWQgdChbJnJhbl17IHJhbiA9IHRydWU7IHJldHVybiAwOyB9KTsKKyAgICBFWFBFQ1RfRkFMU0UocmFuKTsKKyAgICBFWFBFQ1RfVFJVRSh0LnN0YXJ0KCkpOworICAgIEVYUEVDVF9UUlVFKHQud2FpdCgpKTsKKyAgICBFWFBFQ1RfVFJVRShyYW4pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9QYXJhbGxlbFRhc2suaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkNjUwNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrLmgKQEAgLTAsMCArMSwxODQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvaW50ZXJuYWwvUGFyYWxsZWxUYXNrQmFzZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1R5cGVzLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgUGFyYWxsZWxUYXNrPFJlc3VsdD4gaXMgYW4gb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBydW4gYSB0YXNrIGluIGEKKy8vIHNlcGFyYXRlIHRocmVhZCwgYW5kIHRha2UgZm9sbG93IHVwIGFjdGlvbiBiYWNrIG9uIHRoZSBjdXJyZW50IHRocmVhZCdzIGV2ZW50CisvLyBsb29wLiBBZGRpdGlvbmFsbHksIHRoZSB8dGFza0RvbmVGdW5jdGlvbnwgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYSByZXN1bHQKKy8vIG9mIHR5cGUgfFJlc3VsdHwgcmV0dXJuZWQgZnJvbSB0aGUgbGF1bmNoZWQgdGhyZWFkLgorLy8KKy8vIEFuIGV4YW1wbGUgb2YgYSB0aHJlYWQgcmV0dXJuaW5nIHRoZSB0eXBpY2FsIGludCBleGl0U3RhdHVzOgorLy8KKy8vICAgY2xhc3MgTGlmZVVuaXZlcnNlQW5kRXZlcnl0aGluZ0luUGFyYWxsZWwgeworLy8gICBwdWJsaWM6CisvLyAgICAgICBMaWZlVW5pdmVyc2VBbmRFdmVyeXRoaW5nSW5QYXJhbGxlbChMb29wZXIqIGxvb3BlcikgOgorLy8gICAgICAgICAgICAgICBtRWFydGgobG9vcGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZMaWZlVW5pdmVyc2VBbmRFdmVyeXRoaW5nSW5QYXJhbGxlbDo6Y29tcHV0ZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorLy8gICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICZMaWZlVW5pdmVyc2VBbmRFdmVyeXRoaW5nSW5QYXJhbGxlbDo6cHJpbnRBbnN3ZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSB7fQorLy8KKy8vICAgICAgIC8vIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IG9mIGNvbXB1dGF0aW9uLgorLy8gICAgICAgYm9vbCBzdGFydE9mVGltZSgpIHsKKy8vICAgICAgICAgICByZXR1cm4gbUVhcnRoLnN0YXJ0KCk7CisvLyAgICAgICB9CisvLyAgICAgICAvLyBDYWxsZWQgYnkgdGhlIHBhcmFsbGVsIHRhc2suCisvLyAgICAgICB2b2lkIGNvbXB1dGUoaW50KiBvdXRSZXN1bHQpIHsKKy8vICAgICAgICAgICAqb3V0UmVzdWx0ID0gNDI7CisvLyAgICAgICB9CisvLworLy8gICAgICAgdm9pZCBwcmludEFuc3dlcihjb25zdCBpbnQmIG91dFJlc3VsdCkgeworLy8gICAgICAgICAgIHN0ZDo6Y291dCA8PCAiVGhlIG1pY2Ugc2F5IGl0J3MgIiA8PCBvdXRSZXN1bHQgPDwgc3RkOjplbmRsOworLy8gICAgICAgfQorLy8KKy8vICAgcHJpdmF0ZToKKy8vICAgICAgIFBhcmFsbGVsVGFzazxpbnQ+IG1FYXJ0aDsKKy8vICAgfTsKKy8vCisvLyAgIGludCBtYWluKCkgeworLy8gICAgIExpZmVVbml2ZXJzZUFuZEV2ZXJ5dGhpbmdJblBhcmFsbGVsIHdoYXRzVGhlQW5zd2VyOworLy8gICAgIHdoYXRzVGhlQW5zd2VyLnN0YXJ0T2ZUaW1lKCk7CisvLyAgICAgYW5kcm9pZDo6YmFzZTo6VGhyZWFkTG9vcGVyOjpnZXQoKS0+cnVuV2l0aERlYWRsaW5lKAorLy8gICAgICAgICAgICAgLy8gMTAgbWlsbGlvbiB5ZWFycyk7CisvLyAgICAgLy8gLi4uIERvIG90aGVyIHN0dWZmIHdoaWxlIHRoZSBtaWNlIHJ1biBpbnNpZGUgY29udHJhcHRpb25zIC4uLgorLy8gICB9CisvLworLy8gICBJZiB5b3UganVzdCB3YW50IHRvIHJ1biBhIGZyZWUgZnVuY3Rpb24gdG8gY29tcHV0ZSBzb21ldGhpbmcgaW4gcGFyYWxsZWwKKy8vICAgYW5kIHRoZW4gdGFrZSBmb2xsb3cgdXAgYWN0aW9uIHVzaW5nIGFub3RoZXIgZnJlZSBmdW5jdGlvbiwgYSB0ZW1wbGF0aXplZAorLy8gICBoZWxwZXIgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYXMgd2VsbDoKKy8vCisvLyAgIHZvaWQgY29tcHV0ZVN0YW5kYWxvbmUoaW50KiBvdXRSZXN1bHQpIHsKKy8vICAgICAgICpvdXRSZXN1bHQgPSA0MjsKKy8vICAgfQorLy8KKy8vICAgdm9pZCBwcmludEFuc3dlcihjb25zdCBpbnQmIG91dFJlc3VsdCkgeworLy8gICAgICAgc3RkOjpjb3V0IDw8ICJUaGUgbWljZSBzYXkgaXQncyAiIDw8IG91dFJlc3VsdCA8PCBzdGQ6OmVuZGw7CisvLyAgIH0KKy8vCisvLyAgIHJ1blBhcmFsbGVsVGFzazxpbnQ+KAorLy8gICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCksCisvLyAgICAgICAgICAgJmNvbXB1dGVTdGFuZGFsb25lLAorLy8gICAgICAgICAgICZwcmludEFuc3dlcik7CisvLwordGVtcGxhdGUgPGNsYXNzIFJlc3VsdFR5cGU+CitjbGFzcyBQYXJhbGxlbFRhc2sgZmluYWwgOiBwdWJsaWMgaW50ZXJuYWw6OlBhcmFsbGVsVGFza0Jhc2UgeworcHVibGljOgorICAgIHVzaW5nIFRhc2tGdW5jdGlvbiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChSZXN1bHRUeXBlKik+OworICAgIHVzaW5nIFRhc2tEb25lRnVuY3Rpb24gPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVzdWx0VHlwZSYpPjsKKworICAgIC8vIEFyZ3M6CisgICAgLy8gICAgIGxvb3BlcjogQSBydW5uaW5nIGxvb3BlciBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIC8vICAgICB0YXNrRnVuY3Rpb246IFRoZSBmdW5jdGlvbiB5b3Ugd2FudCB0byBiZSBjYWxsZWQgb24gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAvLyAgICAgICAgICAgICB0byBwZXJmb3JtIHRoZSB0YXNrLgorICAgIC8vICAgICB0YXNrRG9uZUZ1bmN0aW9uOiBUaGUgZnVuY3Rpb24geW91IHdhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZSBldmVudAorICAgIC8vICAgICAgICAgICAgIGxvb3AgaW4gdGhlIGN1cnJlbnQgdGhyZWFkIG9uY2UgdGhlIHRhc2sgaXMgY29tcGxldGVkLgorICAgIC8vICAgICBjaGVja1RpbWVvdXRNczogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gY29uc2VjdXRpdmUgY2hlY2tzCisgICAgLy8gICAgICAgICAgICAgZm9yIHRocmVhZCB0ZXJtaW5hdGlvbi4gQSBiaWdnZXIgdmFsdWUgcG9zc2libHkgZGVsYXllcyB0aGUKKyAgICAvLyAgICAgICAgICAgICBjYWxsIHRvIHx0YXNrRG9uZUZ1bmN0aW9ufCwgYnV0IGxlYWRzIHRvIGZld2VyIGNoZWNrcy4KKyAgICAvLyAgICAgICAgICAgICBEZWZhdWx0OiAxIHNlY29uZC4KKyAgICAvLyAgICAgZmxhZ3M6IFNlZSBhbmRyb2lkOjpiYXNlOjpUaHJlYWQuCisgICAgUGFyYWxsZWxUYXNrKGFuZHJvaWQ6OmJhc2U6Okxvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICAgICBUYXNrRnVuY3Rpb24gdGFza0Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICBUYXNrRG9uZUZ1bmN0aW9uIHRhc2tEb25lRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6RHVyYXRpb24gY2hlY2tUaW1lb3V0TXMgPSAxICogMTAwMCwKKyAgICAgICAgICAgICAgICAgVGhyZWFkRmxhZ3MgZmxhZ3MgPSBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpCisgICAgICAgIDogUGFyYWxsZWxUYXNrQmFzZShsb29wZXIsIGNoZWNrVGltZW91dE1zLCBmbGFncyksCisgICAgICAgIG1UYXNrRnVuY3Rpb24odGFza0Z1bmN0aW9uKSwgbVRhc2tEb25lRnVuY3Rpb24odGFza0RvbmVGdW5jdGlvbikge30KKworICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQgaW5zdGFuY2UuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgLy8gKGUuZy4gaWYgdGhlIHRocmVhZCB3YXMgYWxyZWFkeSBzdGFydGVkIG9yIHRlcm1pbmF0ZWQpLgorICAgIGJvb2wgc3RhcnQoKSB7IHJldHVybiBQYXJhbGxlbFRhc2tCYXNlOjpzdGFydCgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgaGFzIGJlZW4gfHN0YXJ0fCdlZCwgYnV0IHRoZSBjYWxsIHRvCisgICAgLy8gfHRhc2tEb25lfCBoYXNuJ3QgZmluaXNoZWQgeWV0LgorICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHRocmVhZCB0aGF0IGNhbGxlZCB8c3RhcnR8LgorICAgIGJvb2wgaW5GbGlnaHQoKSBjb25zdCB7IHJldHVybiBQYXJhbGxlbFRhc2tCYXNlOjppbkZsaWdodCgpOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHRhc2tJbXBsKCkgb3ZlcnJpZGUgZmluYWwgeyBtVGFza0Z1bmN0aW9uKCZtUmVzdWx0QnVmZmVyKTsgfQorCisgICAgdm9pZCB0YXNrRG9uZUltcGwoKSBvdmVycmlkZSBmaW5hbCB7IG1UYXNrRG9uZUZ1bmN0aW9uKG1SZXN1bHRCdWZmZXIpOyB9CisKK3ByaXZhdGU6CisgICAgUmVzdWx0VHlwZSBtUmVzdWx0QnVmZmVyOworICAgIFRhc2tGdW5jdGlvbiBtVGFza0Z1bmN0aW9uOworICAgIFRhc2tEb25lRnVuY3Rpb24gbVRhc2tEb25lRnVuY3Rpb247CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUGFyYWxsZWxUYXNrKTsKK307CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBSZXN1bHRUeXBlPgorY2xhc3MgU2VsZkRlbGV0aW5nUGFyYWxsZWxUYXNrIHsKK3B1YmxpYzoKKyAgICB1c2luZyBUYXNrRnVuY3Rpb24gPSB0eXBlbmFtZSBQYXJhbGxlbFRhc2s8UmVzdWx0VHlwZT46OlRhc2tGdW5jdGlvbjsKKyAgICB1c2luZyBUYXNrRG9uZUZ1bmN0aW9uID0KKyAgICAgICAgICAgIHR5cGVuYW1lIFBhcmFsbGVsVGFzazxSZXN1bHRUeXBlPjo6VGFza0RvbmVGdW5jdGlvbjsKKworICAgIFNlbGZEZWxldGluZ1BhcmFsbGVsVGFzayhhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0Z1bmN0aW9uIHRhc2tGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0RvbmVGdW5jdGlvbiB0YXNrRG9uZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkR1cmF0aW9uIGNoZWNrVGltZW91dE1zKQorICAgICAgICA6IG1UYXNrRG9uZUZ1bmN0aW9uKHRhc2tEb25lRnVuY3Rpb24pLAorICAgICAgICAgIG1QYXJhbGxlbFRhc2sobG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFza0Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZTZWxmRGVsZXRpbmdQYXJhbGxlbFRhc2s6OnRhc2tEb25lRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tUaW1lb3V0TXMpIHt9CisKKyAgICBib29sIHN0YXJ0KCkgeyByZXR1cm4gbVBhcmFsbGVsVGFzay5zdGFydCgpOyB9OworCisgICAgdm9pZCB0YXNrRG9uZUZ1bmN0aW9uKGNvbnN0IFJlc3VsdFR5cGUmIHJlc3VsdCkgeworICAgICAgICBtVGFza0RvbmVGdW5jdGlvbihyZXN1bHQpOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgVGFza0RvbmVGdW5jdGlvbiBtVGFza0RvbmVGdW5jdGlvbjsKKyAgICBQYXJhbGxlbFRhc2s8UmVzdWx0VHlwZT4gbVBhcmFsbGVsVGFzazsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZWxmRGVsZXRpbmdQYXJhbGxlbFRhc2spOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK3RlbXBsYXRlPGNsYXNzIFJlc3VsdFR5cGU+Citib29sIHJ1blBhcmFsbGVsVGFzayhhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChSZXN1bHRUeXBlKik+IHRhc2tGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZXN1bHRUeXBlJik+IHRhc2tEb25lRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkR1cmF0aW9uIGNoZWNrVGltZW91dE1zID0gMSAqIDEwMDApIHsKKyAgICBhdXRvIGZseWF3YXkgPSBuZXcgaW50ZXJuYWw6OlNlbGZEZWxldGluZ1BhcmFsbGVsVGFzazxSZXN1bHRUeXBlPigKKyAgICAgICAgICAgIGxvb3BlciwgdGFza0Z1bmN0aW9uLCB0YXNrRG9uZUZ1bmN0aW9uLCBjaGVja1RpbWVvdXRNcyk7CisgICAgcmV0dXJuIGZseWF3YXktPnN0YXJ0KCk7CisKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1BhcmFsbGVsVGFza191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1BhcmFsbGVsVGFza191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2ZDgwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXJhbGxlbFRhc2s7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKK3N0cnVjdCBSZXN1bHQgeworICAgIGJvb2wgbVdhc0pvaW5lZCA9IGZhbHNlOworICAgIGludCBtRXhpdFN0YXR1cyA9IDA7Cit9OworCitjbGFzcyBQYXJhbGxlbFRhc2tUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIC8vIHNldCBtQ2hlY2tUaW1lb3V0TXMgdG8gMTAgdG8gc3BlZWQgdGhpbmdzIHVwLgorICAgIFBhcmFsbGVsVGFza1Rlc3QoKQorICAgICAgICA6IG1QYXJhbGxlbFRhc2soJm1Mb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBhcmFsbGVsVGFza1Rlc3Q6OnRhc2tGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlBhcmFsbGVsVGFza1Rlc3Q6OnRhc2tEb25lRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgMTApIHt9CisKKyAgICB2b2lkIHRhc2tGdW5jdGlvbihSZXN1bHQqIG91dFJlc3VsdCkgeworICAgICAgICB3aGlsZSAoIW1TaG91bGRSdW4pIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTo6Z2V0KCktPnNsZWVwTXMoMTApOworICAgICAgICB9CisgICAgICAgIG91dFJlc3VsdC0+bUV4aXRTdGF0dXMgPSA0MjsKKyAgICB9CisKKyAgICB2b2lkIHRhc2tEb25lRnVuY3Rpb24oY29uc3QgUmVzdWx0JiByZXN1bHQpIHsKKyAgICAgICAgbVJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgbVJlc3VsdC5tV2FzSm9pbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHVuYmxvY2soKSB7IG1TaG91bGRSdW4gPSB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBUZXN0TG9vcGVyIG1Mb29wZXI7CisgICAgUGFyYWxsZWxUYXNrPFJlc3VsdD4gbVBhcmFsbGVsVGFzazsKKyAgICBSZXN1bHQgbVJlc3VsdDsKKyAgICBzdGQ6OmF0b21pY19ib29sIG1TaG91bGRSdW4gPSB7ZmFsc2V9OworfTsKKworVEVTVF9GKFBhcmFsbGVsVGFza1Rlc3QsIHN0YXJ0KSB7CisgICAgdW5ibG9jaygpOworICAgIEVYUEVDVF9UUlVFKG1QYXJhbGxlbFRhc2suc3RhcnQoKSk7CisgICAgbUxvb3Blci5ydW5XaXRoVGltZW91dE1zKDIwMDApOworCisgICAgRVhQRUNUX0ZBTFNFKG1QYXJhbGxlbFRhc2suaW5GbGlnaHQoKSk7CisgICAgRVhQRUNUX1RSVUUobVJlc3VsdC5tV2FzSm9pbmVkKTsKKyAgICBFWFBFQ1RfRVEoNDIsIG1SZXN1bHQubUV4aXRTdGF0dXMpOworfQorCitURVNUX0YoUGFyYWxsZWxUYXNrVGVzdCwgaW5GbGlnaHQpIHsKKyAgICBFWFBFQ1RfVFJVRShtUGFyYWxsZWxUYXNrLnN0YXJ0KCkpOworICAgIC8vIFRoZSB0ZXN0IHdpbGwgYWN0dWFsbHkgYmxvY2sgaGVyZSB0aWxsIHRpbWVvdXQuIFVzZSBhIHNtYWxsIHZhbHVlLgorICAgIG1Mb29wZXIucnVuV2l0aFRpbWVvdXRNcygxMDApOworICAgIEVYUEVDVF9GQUxTRShtUmVzdWx0Lm1XYXNKb2luZWQpOworICAgIEVYUEVDVF9UUlVFKG1QYXJhbGxlbFRhc2suaW5GbGlnaHQoKSk7CisKKyAgICB1bmJsb2NrKCk7CisgICAgbUxvb3Blci5ydW5XaXRoVGltZW91dE1zKDIwMDApOworICAgIEVYUEVDVF9GQUxTRShtUGFyYWxsZWxUYXNrLmluRmxpZ2h0KCkpOworICAgIEVYUEVDVF9FUSg0MiwgbVJlc3VsdC5tRXhpdFN0YXR1cyk7CisgICAgRVhQRUNUX1RSVUUobVJlc3VsdC5tV2FzSm9pbmVkKTsKK30KKworc3RhdGljIGJvb2wgcGFySm9pbmVkID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIHNldFBhcihpbnQqIG91dFJlc3VsdCkgeworICAgICpvdXRSZXN1bHQgPSA0MjsKK30KKworc3RhdGljIHZvaWQgb25Kb2luZWQoY29uc3QgaW50JiBvdXRSZXN1bHQpIHsKKyAgICBFWFBFQ1RfRVEoNDIsIG91dFJlc3VsdCk7CisgICAgcGFySm9pbmVkID0gdHJ1ZTsKK30KKworVEVTVChQYXJhbGxlbFRhc2tGdW5jdGlvblRlc3QsIGJhc2ljKSB7CisgICAgVGVzdExvb3BlciBsb29wZXI7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZDo6YmFzZTo6cnVuUGFyYWxsZWxUYXNrPGludD4oJmxvb3BlciwgJnNldFBhciwgJm9uSm9pbmVkLCAxMCkpOworICAgIEVYUEVDVF9GQUxTRShwYXJKb2luZWQpOworICAgIGxvb3Blci5ydW5XaXRoVGltZW91dE1zKDIwMDApOworICAgIEVYUEVDVF9UUlVFKHBhckpvaW5lZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxZTdmMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UeXBlcy5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gV3JhcHBlciBjbGFzcyBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkcy4KKy8vIFRvIGNyZWF0ZSB5b3VyIG93biB0aHJlYWQsIGRlZmluZSBhIHN1Yi1jbGFzcyBvZiBlbXVnbDo6VGhyZWFkCisvLyBhbmQgb3ZlcnJpZGUgaXRzIG1haW4oKSBtZXRob2QuCisvLworLy8gRm9yIGV4YW1wbGU6CisvLworLy8gICAgY2xhc3MgTXlUaHJlYWQgOiBwdWJsaWMgZW11Z2w6OlRocmVhZCB7CisvLyAgICBwdWJsaWM6CisvLyAgICAgICAgTXlUaHJlYWQoKSA6IFRocmVhZCgpIHt9CisvLworLy8gICAgICAgIHZpcnR1YWwgaW50cHRyX3QgbWFpbigpIHsKKy8vICAgICAgICAgICAgLi4uIG1haW4gdGhyZWFkIGxvb3AgaW1wbGVtZW50YXRpb24KKy8vICAgICAgICAgICAgcmV0dXJuIDA7CisvLyAgICAgICAgfQorLy8gICAgfTsKKy8vCisvLyAgICAuLi4KKy8vCisvLyAgICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlLCBidXQgZG9lcyBub3Qgc3RhcnQgaXQuCisvLyAgICBNeVRocmVhZCogdGhyZWFkID0gbmV3IE15VGhyZWFkKCk7CisvLworLy8gICAgLy8gU3RhcnQgdGhlIHRocmVhZC4KKy8vICAgIHRocmVhZC0+c3RhcnQoKTsKKy8vCisvLyAgICAvLyBXYWl0IGZvciB0aHJlYWQgY29tcGxldGlvbiwgYW5kIGdldHMgcmVzdWx0IGludG8gfGV4aXRTdGF0dXN8LgorLy8gICAgaW50IGV4aXRTdGF0dXM7CisvLyAgICB0aHJlYWQtPndhaXQoJmV4aXRTdGF0dXMpOworLy8KK2NsYXNzIFRocmVhZCB7CisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoVGhyZWFkKTsKKworcHVibGljOgorICAgIC8vIFB1YmxpYyBjb25zdHJ1Y3Rvci4KKyAgICBUaHJlYWQoVGhyZWFkRmxhZ3MgZmxhZ3MgPSBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpOworCisgICAgLy8gVmlydHVhbCBkZXN0cnVjdG9yLgorICAgIHZpcnR1YWwgflRocmVhZCgpOworCisgICAgLy8gT3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4geW91ciBvd24gdGhyZWFkIHN1Yi1jbGFzc2VzLiBUaGlzIHdpbGwKKyAgICAvLyBiZSBjYWxsZWQgd2hlbiBzdGFydCgpIGlzIGludm9rZWQgb24gdGhlIFRocmVhZCBpbnN0YW5jZS4KKyAgICB2aXJ0dWFsIGludHB0cl90IG1haW4oKSA9IDA7CisKKyAgICAvLyBPdmVycmlkZSB0aGlzIGlmIHlvdSBuZWVkIHRvIGV4ZWN1dGUgc29tZSBjb2RlIGFmdGVyIHRocmVhZCBoYXMKKyAgICAvLyBleGl0ZWQgbWFpbigpIGFuZCBpcyBndWFyYW50ZWVkIG5vdCB0byBhY2Nlc3MgYW55IG9mIGl0cyBtZW1iZXJzLgorICAgIC8vIEUuZy4gaWYgeW91IG5lZWQgdG8gZGVsZXRlIGEgdGhyZWFkIG9iamVjdCBmcm9tIHRoZSBzYW1lIHRocmVhZAorICAgIC8vIGl0IGhhcyBjcmVhdGVkCisgICAgdmlydHVhbCB2b2lkIG9uRXhpdCgpIHt9CisKKyAgICAvLyBTdGFydCBhIHRocmVhZCBpbnN0YW5jZS4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgLy8gKGUuZy4gaWYgdGhlIHRocmVhZCB3YXMgYWxyZWFkeSBzdGFydGVkIG9yIHRlcm1pbmF0ZWQpLgorICAgIGJvb2wgc3RhcnQoKTsKKworICAgIC8vIFdhaXQgZm9yIHRocmVhZCB0ZXJtaW5hdGlvbiBhbmQgcmV0cmlldmUgZXhpc3Qgc3RhdHVzIGludG8KKyAgICAvLyB8KmV4aXRTdGF0dXN8LiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgLy8gTk9URTogfGV4aXRTdGF0dXN8IGNhbiBiZSBOVUxMLgorICAgIGJvb2wgIHdhaXQoaW50cHRyX3QgKmV4aXRTdGF0dXMgPSBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHdoZXRoZXIgYSB0aHJlYWQgaGFzIHRlcm1pbmF0ZWQuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlCisgICAgLy8gYW5kIHNldHMgfCpleGl0U3RhdHVzfC4gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlLgorICAgIC8vIE5PVEU6IHxleGl0U3RhdHVzfCBjYW4gYmUgTlVMTC4KKyAgICBib29sIHRyeVdhaXQoaW50cHRyX3QgKmV4aXRTdGF0dXMpOworCisgICAgLy8gTWFzayBhbGwgc2lnbmFscyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBxZW11IGd1ZXN0IHRvIHJ1biBwcm9wZXJseQorICAgIC8vIE5COiBub29wIGZvciBXaW4zMgorICAgIHN0YXRpYyB2b2lkIG1hc2tBbGxTaWduYWxzKCk7CisKKyAgICAvLyBTbGVlcCBmb3IgfG58IG1pbGxpc2Vjb25kcworICAgIHN0YXRpYyB2b2lkIHNsZWVwTXModW5zaWduZWQgbik7CisKKyAgICAvLyBZaWVsZCB0aGUgcmVtYWluaW5nIHBhcnQgb2YgY3VycmVudCB0aHJlYWQncyBDUFUgdGltZSBzbGljZSB0byBhbm90aGVyCisgICAgLy8gdGhyZWFkIHRoYXQncyByZWFkeSB0byBydW4uCisgICAgc3RhdGljIHZvaWQgeWllbGQoKTsKKworcHJpdmF0ZToKKyNpZmRlZiBfV0lOMzIKKyAgICBzdGF0aWMgRFdPUkQgV0lOQVBJIHRocmVhZF9tYWluKHZvaWQqIGFyZyk7CisKKyAgICBIQU5ETEUgbVRocmVhZCA9IG51bGxwdHI7CisgICAgRFdPUkQgbVRocmVhZElkID0gMDsKKyAgICBDUklUSUNBTF9TRUNUSU9OIG1Mb2NrOworI2Vsc2UgLy8gIVdJTjMyCisgICAgc3RhdGljIHZvaWQqIHRocmVhZF9tYWluKHZvaWQqIGFyZyk7CisKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKyAgICBwdGhyZWFkX211dGV4X3QgbUxvY2s7CisjZW5kaWYKKyAgICAvLyBBY2Nlc3MgZ3VhcmRlZCBieSB8bUxvY2t8LgorICAgIGludHB0cl90IG1FeGl0U3RhdHVzID0gMDsKKyAgICBjb25zdCBUaHJlYWRGbGFncyBtRmxhZ3M7CisgICAgYm9vbCBtU3RhcnRlZCA9IGZhbHNlOworICAgIC8vIEFjY2VzcyBndWFyZGVkIGJ5IHxtTG9ja3wuCisgICAgYm9vbCBtRmluaXNoZWQgPSBmYWxzZTsKKyNpZm5kZWYgX1dJTjMyCisgICAgLy8gUG9zaXgtb25seSwgcmVtZW1iZXIgaWYgd2UndmUgam9pbmVkIG91ciBub24tZGV0YWNoZWQgdGhyZWFkIGFscmVhZHkuCisgICAgYm9vbCBtSm9pbmVkID0gZmFsc2U7CisjZW5kaWYKK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gYSBwcmludGFibGUgaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KK3Vuc2lnbmVkIGxvbmcgZ2V0Q3VycmVudFRocmVhZElkKCk7CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRTdG9yZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRTdG9yZS5jcHAKQEAgLTAsMCArMSwyNDYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFNldCB0byAxIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzLgorI2RlZmluZSBERUJVR19USFJFQURfU1RPUkUgIDAKKworI2lmIERFQlVHX1RIUkVBRF9TVE9SRQorIyAgZGVmaW5lIEQoLi4uKSAgIGRvIHsgcHJpbnRmKCIlczolZDogIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IHByaW50ZihfX1ZBX0FSR1NfXyk7IGZmbHVzaChzdGRvdXQpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSBEKC4uLikgICAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKyNpZmRlZiBfV0lOMzIKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIFRocmVhZFN0b3JlIGltcGxlbWVudGF0aW9uIG9uIFdpbmRvd3MgaXMgdmVyeSB0cmlja3ksIGJlY2F1c2UKKy8vIFRsc0FsbG9jKCkgZG9lc24ndCBhbGxvdyBvbmUgdG8gcHJvdmlkZSBhIGRlc3RydWN0b3IgZnVuY3Rpb24uIEFzCisvLyBzdWNoIHRocmVhZHMgYXJlIGV4cGVjdGVkIHRvIGRlc3Ryb3kgYWxsIFRMUyB2YWx1ZXMgZXhwbGljaXRlbHkuCisvLworLy8gVG8gc29sdmUgdGhpcyBpc3N1ZSwgdGhpcyBzb3VyY2UgZmlsZSBwcm92aWRlcyBhIHN0YXRpYyBtZXRob2QgY2FsbGVkCisvLyBUaHJlYWRTdG9yZTo6T25UaHJlYWRFeGl0KCkgdGhhdCBtdXN0IGJlIGNhbGxlZCB3aGVuIGEgdGhyZWFkIGV4aXRzLAorLy8gd2hpY2ggd2lsbCBjbGVhbnVwIGFsbCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKy8vCisvLyBCdXQgdGhpcyBmb3JjZXMgdXMgdG8gdHJhY2sgdGhyZWFkLXNwZWNpZmljIHZhbHVlcyBvdXJzZWx2ZXMuCisKKy8vIE1heGltdW0gYW1vdW50IG9mIHRocmVhZC1zcGVjaWZpYyBzbG90cyBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KK2VudW0geworICAgIGtNYXhUbHNTbG90cyA9IDY0Cit9OworCisvLyBUbHNTbG90QXJyYXkgaXMgYSB0aHJlYWQtc3BlY2lmaWMgYXJyYXkgb2YgdmFsdWVzLiBJbnN0YW5jZXMgd2lsbAorLy8gYmUgc3RvcmVkIGluIGEgV2luMzIgVExTIHZhbHVlIGNvbnRyb2xsZWQgYnkgYSBzaW5nbGUgbWFzdGVyIFRMUworLy8ga2V5LgorLy8KK3R5cGVkZWYgdm9pZCogVGxzU2xvdEFycmF5W2tNYXhUbHNTbG90c107CisKKy8vIEdsb2JhbCBzdGF0ZSBzaGFyZWQgYnkgYWxsIHRocmVhZHMKK2NsYXNzIEdsb2JhbFN0YXRlIHsKK3B1YmxpYzoKKyAgICBHbG9iYWxTdGF0ZSgpIHsKKyAgICAgICAgRCgiRW50ZXJpbmdcbiIpOworICAgICAgICBtTWFzdGVyVGxzID0gVGxzQWxsb2MoKTsKKyAgICAgICAgRCgiTWFzdGVyIFRMUyA9ICVkXG4iLCAoaW50KW1NYXN0ZXJUbHMpOworICAgICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZtU2VjdGlvbik7CisgICAgICAgIG1MYXN0SW5kZXggPSAwOworICAgICAgICA6Om1lbXNldChtRGVzdHJ1Y3RvcnMsIDAsIHNpemVvZihtRGVzdHJ1Y3RvcnMpKTsKKyAgICAgICAgRCgiRXhpdGluZ1xuIik7CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgYSBuZXcgVExTIGtleSwgb3IgcmV0dXJuIC0xIG9uIGVycm9yICh0b28gbWFueSBrZXlzKS4KKyAgICAvLyB8ZGVzdHJveXwgaXMgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBrZXkuCisgICAgaW50IHJlZ2lzdGVyS2V5KFRocmVhZFN0b3JlQmFzZTo6RGVzdHJ1Y3RvciogZGVzdHJveSkgeworICAgICAgICBEKCJFbnRlcmluZyBkZXN0cm95PSVwXG4iLCBkZXN0cm95KTsKKyAgICAgICAgaW50IHJldCA9IC0xOworICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbVNlY3Rpb24pOworICAgICAgICBpZiAobUxhc3RJbmRleCA8IGtNYXhUbHNTbG90cykgeworICAgICAgICAgICAgcmV0ID0gbUxhc3RJbmRleCsrOworICAgICAgICAgICAgbURlc3RydWN0b3JzW3JldF0gPSBkZXN0cm95OworICAgICAgICB9CisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtU2VjdGlvbik7CisgICAgICAgIEQoIkV4aXRpbmcgbmV3S2V5PSVkXG4iLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHZvaWQgdW5yZWdpc3RlcktleShpbnQga2V5KSB7CisgICAgICAgIEQoImtleT0lZFxuIiwga2V5KTsKKyAgICAgICAgaWYgKGtleSA8IDAgfHwga2V5ID49IGtNYXhUbHNTbG90cykgeworICAgICAgICAgICAgRCgiSW52YWxpZCBrZXlcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm90ZToga2V5cyBhcmUgbm90IHJldXNhYmxlLCBidXQgcmVtb3ZlIHRoZSBkZXN0cnVjdG9yIHRvIGF2b2lkCisgICAgICAgIC8vIGNyYXNoZXMgaW4gbGVhdmVDdXJyZW50VGhyZWFkKCkgd2hlbiBpdCBwb2ludHMgdG8gYSBmdW5jdGlvbiB0aGF0CisgICAgICAgIC8vIGlzIGdvaW5nIHRvIGJlIHVubG9hZGVkIGZyb20gdGhlIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtU2VjdGlvbik7CisgICAgICAgIG1EZXN0cnVjdG9yc1trZXldID0gTlVMTDsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJm1TZWN0aW9uKTsKKyAgICAgICAgRCgiRXhpdGluZ1xuIik7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRocmVhZC1sb2NhbCB2YWx1ZSBmb3IgYSBnaXZlbiB8a2V5fC4KKyAgICB2b2lkKiBnZXRWYWx1ZShpbnQga2V5KSBjb25zdCB7CisgICAgICAgIEQoIkVudGVyaW5nIGtleT0lZFxuIiwga2V5KTsKKyAgICAgICAgaWYgKGtleSA8IDAgfHwga2V5ID49IGtNYXhUbHNTbG90cykgeworICAgICAgICAgICAgRCgiSW52YWxpZCBrZXksIHJlc3VsdD1OVUxMXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgVGxzU2xvdEFycmF5KiBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgIHZvaWQqIHJldCA9ICgqYXJyYXkpW2tleV07CisgICAgICAgIEQoIkV4aXRpbmcga2V5VmFsdWU9JXBcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBjdXJyZW50IHRocmVhZC1sb2NhbCB8dmFsdWV8IGZvciBhIGdpdmVuIHxrZXl8LgorICAgIHZvaWQgc2V0VmFsdWUoaW50IGtleSwgdm9pZCogdmFsdWUpIHsKKyAgICAgICAgRCgiRW50ZXJpbmcga2V5PSVkXG4iLGtleSk7CisgICAgICAgIGlmIChrZXkgPCAwIHx8IGtleSA+PSBrTWF4VGxzU2xvdHMpIHsKKyAgICAgICAgICAgIEQoIkludmFsaWQga2V5LCByZXR1cm5pbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVGxzU2xvdEFycmF5KiBhcnJheSA9IGdldEFycmF5KCk7CisgICAgICAgICgqYXJyYXkpW2tleV0gPSB2YWx1ZTsKKyAgICAgICAgRCgiRXhpdGluZ1xuIik7CisgICAgfQorCisgICAgLy8gQ2FsbCB0aGlzIHdoZW4gYSB0aHJlYWQgZXhpdHMgdG8gZGVzdHJveSBhbGwgaXRzIHRocmVhZC1sb2NhbCB2YWx1ZXMuCisgICAgdm9pZCBsZWF2ZUN1cnJlbnRUaHJlYWQoKSB7CisgICAgICAgIEQoIkVudGVyaW5nXG4iKTsKKyAgICAgICAgVGxzU2xvdEFycmF5KiBhcnJheSA9CisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUbHNTbG90QXJyYXkqPihUbHNHZXRWYWx1ZShtTWFzdGVyVGxzKSk7CisgICAgICAgIGlmICghYXJyYXkpIHsKKyAgICAgICAgICAgIEQoIkV4aXRpbmcsIG5vIHRocmVhZC1sb2NhbCBkYXRhIGluIHRoaXMgdGhyZWFkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga01heFRsc1Nsb3RzOyArK24pIHsKKyAgICAgICAgICAgIHZvaWQqIHZhbHVlID0gKCphcnJheSlbbl07CisgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmFycmF5KVtuXSA9IE5VTEw7CisKKyAgICAgICAgICAgIC8vIE5PVEU6IEluIHRoZW9yeSwgYSBkZXN0cnVjdG9yIGNvdWxkIHJlc2V0IHRoZSBzbG90IHRvCisgICAgICAgICAgICAvLyBhIG5ldyB2YWx1ZSwgYW5kIHdlIHdvdWxkIGhhdmUgdG8gbG9vcCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBpbiBpbnRlcmVzdGluZyB3YXlzLiBJbiBwcmFjdGljZSwgaWdub3JlIHRoZSBpc3N1ZS4KKyAgICAgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtU2VjdGlvbik7CisgICAgICAgICAgICBUaHJlYWRTdG9yZUJhc2U6OkRlc3RydWN0b3IqIGRlc3Ryb3kgPSBtRGVzdHJ1Y3RvcnNbbl07CisgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmbVNlY3Rpb24pOworICAgICAgICAgICAgaWYgKGRlc3Ryb3kpIHsKKyAgICAgICAgICAgICAgICBEKCJDYWxsaW5nIGRlc3RydWN0b3IgJXAgZm9yIGtleT0lZCwgd2l0aCB2YWx1ZT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzdHJveSwgKGludCluLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgKCpkZXN0cm95KSh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVGxzU2V0VmFsdWUobU1hc3RlclRscywgTlVMTCk7CisgICAgICAgIDo6ZnJlZShhcnJheSk7CisgICAgICAgIEQoIkV4aXRpbmdcbiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBSZXR1cm4gdGhlIHRocmVhZC1sb2NhbCBhcnJheSBvZiBUTFMgc2xvdHMgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAvLyBDYW5ub3QgcmV0dXJuIE5VTEwuCisgICAgVGxzU2xvdEFycmF5KiBnZXRBcnJheSgpIGNvbnN0IHsKKyAgICAgICAgRCgiRW50ZXJpbmdcbiIpOworICAgICAgICBUbHNTbG90QXJyYXkqIGFycmF5ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFRsc1Nsb3RBcnJheSo+KFRsc0dldFZhbHVlKG1NYXN0ZXJUbHMpKTsKKyAgICAgICAgaWYgKCFhcnJheSkgeworICAgICAgICAgICAgYXJyYXkgPSByZWludGVycHJldF9jYXN0PFRsc1Nsb3RBcnJheSo+KAorICAgICAgICAgICAgICAgICAgICA6OmNhbGxvYyhzaXplb2YoKmFycmF5KSwgMSkpOworICAgICAgICAgICAgVGxzU2V0VmFsdWUobU1hc3RlclRscywgYXJyYXkpOworICAgICAgICAgICAgRCgiQWxsb2NhdGVkIG5ldyBhcnJheSBhdCAlcFxuIiwgYXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgiUmV0cmlldmVkIGFycmF5IGF0ICVwXG4iLCBhcnJheSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIERXT1JEIG1NYXN0ZXJUbHM7CisgICAgQ1JJVElDQUxfU0VDVElPTiBtU2VjdGlvbjsKKyAgICBpbnQgbUxhc3RJbmRleDsKKyAgICBUaHJlYWRTdG9yZUJhc2U6OkRlc3RydWN0b3IqIG1EZXN0cnVjdG9yc1trTWF4VGxzU2xvdHNdOworfTsKKworTGF6eUluc3RhbmNlPEdsb2JhbFN0YXRlPiBnR2xvYmFsU3RhdGUgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK30gIC8vIG5hbWVzcGFjZQorCitUaHJlYWRTdG9yZUJhc2U6OlRocmVhZFN0b3JlQmFzZShEZXN0cnVjdG9yKiBkZXN0cm95KSB7CisgICAgRCgiRW50ZXJpbmcgdGhpcz0lcCBkZXN0cm95PSVwXG4iLCB0aGlzLCBkZXN0cm95KTsKKyAgICBtS2V5ID0gZ0dsb2JhbFN0YXRlLT5yZWdpc3RlcktleShkZXN0cm95KTsKKyAgICBEKCJFeGl0aW5nIHRoaXM9JXAga2V5PSVkXG4iLCB0aGlzLCBtS2V5KTsKK30KKworVGhyZWFkU3RvcmVCYXNlOjp+VGhyZWFkU3RvcmVCYXNlKCkgeworICAgIEQoIkVudGVyaW5nIHRoaXM9JXBcbiIsIHRoaXMpOworICAgIEdsb2JhbFN0YXRlKiBzdGF0ZSA9IGdHbG9iYWxTdGF0ZS5wdHIoKTsKKyAgICBzdGF0ZS0+dW5yZWdpc3RlcktleShtS2V5KTsKKyAgICBEKCJFeGl0aW5nIHRoaXM9JXBcbiIsIHRoaXMpOworfQorCit2b2lkKiBUaHJlYWRTdG9yZUJhc2U6OmdldCgpIGNvbnN0IHsKKyAgICBEKCJFbnRlcmluZyB0aGlzPSVwXG4iLCB0aGlzKTsKKyAgICB2b2lkKiByZXQgPSBnR2xvYmFsU3RhdGUtPmdldFZhbHVlKG1LZXkpOworICAgIEQoIkV4aXRpbmcgdGhpcz0lcCB2YWx1ZT0lcFxuIiwgdGhpcywgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIFRocmVhZFN0b3JlQmFzZTo6c2V0KHZvaWQqIHZhbHVlKSB7CisgICAgRCgiRW50ZXJpbmcgdGhpcz0lcCB2YWx1ZT0lcFxuIiwgdGhpcywgdmFsdWUpOworICAgIGdHbG9iYWxTdGF0ZS0+c2V0VmFsdWUobUtleSwgdmFsdWUpOworICAgIEQoIkV4aXRpbmcgdGhpcz0lcFxuIiwgdGhpcyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBUaHJlYWRTdG9yZUJhc2U6Ok9uVGhyZWFkRXhpdCgpIHsKKyAgICBnR2xvYmFsU3RhdGUtPmxlYXZlQ3VycmVudFRocmVhZCgpOworfQorCisjZWxzZSAgLy8gIV9XSU4zMgorCitUaHJlYWRTdG9yZUJhc2U6OlRocmVhZFN0b3JlQmFzZShEZXN0cnVjdG9yKiBkZXN0cm95KSB7CisgICAgaW50IHJldCA9IHB0aHJlYWRfa2V5X2NyZWF0ZSgmbUtleSwgZGVzdHJveSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIHRocmVhZCBzdG9yZSBrZXk6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKHJldCkpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworVGhyZWFkU3RvcmVCYXNlOjp+VGhyZWFkU3RvcmVCYXNlKCkgeworICAgIHB0aHJlYWRfa2V5X2RlbGV0ZShtS2V5KTsKK30KKworI2VuZGlmICAvLyAhX1dJTjMyCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRTdG9yZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjJhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIEEgY2xhc3MgdG8gbW9kZWwgc3RvcmFnZSBvZiB0aHJlYWQtc3BlY2lmaWMgdmFsdWVzLCB0aGF0IGNhbiBiZQorLy8gZGVzdHJveWVkIG9uIHRocmVhZCBleGl0LgorLy8KKy8vIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCBhIHRocmVhZCBtdXN0IGNhbGwgT25UaHJlYWRFeGl0KCkgZXhwbGljaXRseQorLy8gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgdmFsdWVzIGFyZSBwcm9iYWJseSBkaXNjYXJkZWQuIFRoaXMgaXMgYW4KKy8vIHVuZm9ydHVuYXRlIHJlcXVpcmVtZW50IG9mIHRoZSBXaW4zMiBBUEksIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydAorLy8gZGVzdHJ1Y3RvcnMgYXQgYWxsLgorLy8KKy8vIFRoZXJlIGFyZSB2YXJpb3VzIGhhY2tzIG9uIHRoZSB3ZWIgdG8gdHJ5IHRvIGFjaGlldmUgdGhpcyBhdXRvbWF0aWNhbGx5CisvLyAoZS5nLiBbMV0pIGJ1dCB0aGV5IHJlbHkgb24gdXNpbmcgdGhlIE1pY3Jvc29mdCBidWlsZCB0b29scywKKy8vIHdoaWNoIGRvZXNuJ3Qgd29yayBmb3IgdXMuCisvLworLy8gTm90ZSBhbm90aGVyIGltcG9ydGFudCBpc3N1ZSB3aXRoIFRocmVhZFN0b3JlIGluc3RhbmNlczogaWYgeW91IGNyZWF0ZQorLy8gb25lIGluc3RhbmNlIGluIGEgc2hhcmVkIGxpYnJhcnksIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzCisvLyBhbHdheXMgZGVzdHJveWVkIGJlZm9yZSB0aGUgbGlicmFyeSBpcyB1bmxvYWRlZC4gT3RoZXJ3aXNlLCBmdXR1cmUKKy8vIHRocmVhZCBleGl0IHdpbGwgbGlrZWx5IGNyYXNoLCBkdWUgdG8gY2FsbGluZyBhIGRlc3RydWN0b3IgZnVuY3Rpb24KKy8vIHRoYXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorLy8KKy8vIEZpbmFsbHksIGRlc3Ryb3lpbmcgYW4gaW5zdGFuY2UgZG9lcyBfbm90XyBmcmVlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcywKKy8vIGJlY2F1c2UgZG9pbmcgc28gcHJvcGVybHkgcmVxdWlyZXMgY29vcmRpbmF0aW5nIGFsbCBwYXJ0aWNpcGF0aW5nIHRocmVhZHMsCisvLyB3aGljaCBpcyBpbXBvc3NpYmxlIHRvIGFjaGlldmUgaW4gdGhlIG1vc3QgZ2VuZXJhbCBjYXNlLiBUaHVzLCBjb25zaWRlcgorLy8gdGhhdCB0aHJlYWQtbG9jYWwgdmFsdWVzIGFyZSBhbHdheXMgbGVha2VkIG9uIGxpYnJhcnkgdW5sb2FkLCBvciBvbgorLy8gcHJvZ3JhbSBleGl0LgorLy8KKy8vIFsxXSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0NTM4MTU5L2Fib3V0LXRscy1jYWxsYmFjay1pbi13aW5kb3dzCisKKy8vIFRocmVhZFN0b3JlQmFzZSBpcyB0aGUgYmFzZSBjbGFzcyB1c2VkIGJ5IGFsbCBUaHJlYWRTdG9yZSB0ZW1wbGF0ZQorLy8gaW5zdGFuY2VzLCB1c2VkIHRvIHJlZHVjZSBibG9hdC4KK2NsYXNzIFRocmVhZFN0b3JlQmFzZSB7CitwdWJsaWM6CisgICAgLy8gVHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSBhIHRocmVhZC1zcGVjaWZpYyB2YWx1ZSB0aGF0CisgICAgLy8gd2FzIHByZXZpb3VzbHkgYXNzaWduZWQgYnkgY2FsbGluZyBzZXQoKS4KKyAgICB0eXBlZGVmIHZvaWQgKERlc3RydWN0b3IpKHZvaWQqIHZhbHVlKTsKKworICAgIC8vIEluaXRpYWxpemUgaW5zdGFuY2Ugc28gdGhhdCBpcyBob2xkIGtleXMgdGhhdCBtdXN0IGJlIGRlc3Ryb3llZAorICAgIC8vIG9uIHRocmVhZCBleGl0IGJ5IGNhbGxpbmcgfGRlc3Ryb3l8LgorICAgIGV4cGxpY2l0IFRocmVhZFN0b3JlQmFzZShEZXN0cnVjdG9yKiBkZXN0cm95KTsKKworICAgIC8vIE5PVEU6IERlc3RydWN0b3IgZG9uJ3QgZnJlZSB0aGUgdGhyZWFkLWxvY2FsIHZhbHVlcywgYnV0IGFyZSByZXF1aXJlZAorICAgIC8vIHRvIGF2b2lkIGNyYXNoZXMgKHNlZSBub3RlIGFib3ZlKS4KKyAgICB+VGhyZWFkU3RvcmVCYXNlKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBjdXJyZW50IHRocmVhZC1zcGVjaWZpYyB2YWx1ZSBmcm9tIHN0b3JlLgorI2lmZGVmIF9XSU4zMgorICAgIHZvaWQqIGdldCgpIGNvbnN0OworI2Vsc2UKKyAgICBpbmxpbmUgdm9pZCogZ2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gcHRocmVhZF9nZXRzcGVjaWZpYyhtS2V5KTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFNldCB0aGUgbmV3IHRocmVhZC1zcGVjaWZpYyB2YWx1ZS4KKyNpZmRlZiBfV0lOMzIKKyAgICB2b2lkIHNldCh2b2lkKiB2YWx1ZSk7CisjZWxzZQorICAgIGlubGluZSB2b2lkIHNldCh2b2lkKiB2YWx1ZSkgeworICAgICAgICBwdGhyZWFkX3NldHNwZWNpZmljKG1LZXksIHZhbHVlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlubGluZSB2b2lkKiBzd2FwKHZvaWQqIHZhbHVlKSB7CisgICAgICAgIHZvaWQqIG9sZCA9IGdldCgpOworICAgICAgICBzZXQodmFsdWUpOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworI2lmZGVmIF9XSU4zMgorICAgIC8vIEVhY2ggdGhyZWFkIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gb24gZXhpdCB0byBlbnN1cmUgdGhhdAorICAgIC8vIGFsbCBjb3JyZXNwb25kaW5nIFRMUyB2YWx1ZXMgYXJlIHByb3Blcmx5IGZyZWVkLgorICAgIHN0YXRpYyB2b2lkIE9uVGhyZWFkRXhpdCgpOworI2Vsc2UKKyAgICAvLyBOb3RoaW5nIHRvIGRvIG9uIFBvc2l4LgorICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBPblRocmVhZEV4aXQoKSB7fQorI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLy8gRW5zdXJlIHlvdSBjYW4ndCBjcmVhdGUgYW4gZW1wdHkgVGhyZWFkU3RvcmUgaW5zdGFuY2UuCisgICAgVGhyZWFkU3RvcmVCYXNlKCk7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGhyZWFkU3RvcmVCYXNlKTsKKworI2lmZGVmIF9XSU4zMgorICAgIGludCBtS2V5OworI2Vsc2UKKyAgICBwdGhyZWFkX2tleV90IG1LZXk7CisjZW5kaWYKK307CisKKy8vIFRocmVhZFN0b3JlIGlzIGEgdGVtcGxhdGUgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgYSB0aHJlYWQtbG9jYWwgc3RvcmUKKy8vIG9mIG9iamVjdHMgb2YgdHlwZSB8VHwuIE5vdGUgdGhhdCB0aGUgc3RvcmUgb3ducyB0aGUgb2JqZWN0cywgYW5kIHRoZXNlCisvLyBhcmUgZGVzdHJveWVkIHdoZW4gYW4gYW5kcm9pZDo6YmFzZTo6VGhyZWFkIGV4aXRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUaHJlYWRTdG9yZSA6IHB1YmxpYyBUaHJlYWRTdG9yZUJhc2UgeworcHVibGljOgorICAgIC8vIENyZWF0ZSBhIG5ldyBUaHJlYWRTdG9yZSBpbnN0YW5jZS4KKyAgICBUaHJlYWRTdG9yZSgpIDogVGhyZWFkU3RvcmVCYXNlKG15RGVzdHJ1Y3Rvcikge30KKworICAgIC8vIFJldHJpZXZlIHRoZSB0aHJlYWQtc3BlY2lmaWMgb2JqZWN0IGluc3RhbmNlLCBvciBOVUxMIGlmIHNldCgpCisgICAgLy8gd2FzIG5ldmVyIGNhbGxlZCBiZWZvcmUgaW4gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIFQqIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihUaHJlYWRTdG9yZUJhc2U6OmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkLXNwZWNpZmljIG9iamV0IGluc3RhbmNlIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLyB8dHwgaXMgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UuCisgICAgLy8gTk9URTogQW55IHByZXZpb3VzIG9iamVjdCBpbnN0YW5jZSBpcyBkZWxldGVkLgorICAgIHZvaWQgc2V0KFQqIHQpIHsKKyAgICAgICAgVCogb2xkID0gc3RhdGljX2Nhc3Q8VCo+KHN3YXAodCkpOworICAgICAgICBkZWxldGUgb2xkOworICAgIH0KKworICAgIC8vIFN3YXAgdGhlIGN1cnJlbnQgdGhyZWFkLXNwZWNpZmljIG9iamVjdCBmb3IgdGhpcyB0aHJlYWQuCisgICAgLy8gfHR8IGlzIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlLgorICAgIC8vIFJldHVybiB0aGUgcHJldmlvdXMgb25lLiBUcmFuc2ZlcnMgb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIuCisgICAgVCogc3dhcChUKiB0KSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oVGhyZWFkU3RvcmVCYXNlOjpzd2FwKHQpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgbXlEZXN0cnVjdG9yKHZvaWQqIG9wYXF1ZSkgeworICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8VCo+KG9wYXF1ZSk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTZiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIwMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUaHJlYWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gY291bnQgaW5zdGFuY2UgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uLgorY2xhc3MgU3RhdGljQ291bnRlciB7CitwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhJbnN0YW5jZXMgPSAxMDAwLAorICAgIH07CisKKyAgICBTdGF0aWNDb3VudGVyKCkgeworICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1DcmVhdGlvbkNvdW50IDwga01heEluc3RhbmNlcykKKyAgICAgICAgICAgIG1JbnN0YW5jZXNbbUNyZWF0aW9uQ291bnRdID0gdGhpczsKKyAgICAgICAgbUNyZWF0aW9uQ291bnQrKzsKKyAgICB9CisKKyAgICB+U3RhdGljQ291bnRlcigpIHsKKyAgICAgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgICAgIG1EZXN0cnVjdGlvbkNvdW50Kys7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICBtQ3JlYXRpb25Db3VudCA9IDA7CisgICAgICAgIG1EZXN0cnVjdGlvbkNvdW50ID0gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90IGdldENyZWF0aW9uQ291bnQoKSB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbUNyZWF0aW9uQ291bnQ7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCBnZXREZXN0cnVjdGlvbkNvdW50KCkgeworICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1EZXN0cnVjdGlvbkNvdW50OworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGZyZWVBbGwoKSB7CisgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga01heEluc3RhbmNlczsgKytuKQorICAgICAgICAgICAgZGVsZXRlIG1JbnN0YW5jZXNbbl07CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBMb2NrIG1Mb2NrOworICAgIHN0YXRpYyBzaXplX3QgbUNyZWF0aW9uQ291bnQ7CisgICAgc3RhdGljIHNpemVfdCBtRGVzdHJ1Y3Rpb25Db3VudDsKKyAgICBzdGF0aWMgU3RhdGljQ291bnRlciogbUluc3RhbmNlc1trTWF4SW5zdGFuY2VzXTsKK307CisKK3R5cGVkZWYgVGhyZWFkU3RvcmU8U3RhdGljQ291bnRlcj4gU3RhdGljQ291bnRlclN0b3JlOworCitMb2NrIFN0YXRpY0NvdW50ZXI6Om1Mb2NrOworc2l6ZV90IFN0YXRpY0NvdW50ZXI6Om1DcmVhdGlvbkNvdW50ID0gMDsKK3NpemVfdCBTdGF0aWNDb3VudGVyOjptRGVzdHJ1Y3Rpb25Db3VudCA9IDA7CitTdGF0aWNDb3VudGVyKiBTdGF0aWNDb3VudGVyOjptSW5zdGFuY2VzW2tNYXhJbnN0YW5jZXNdOworCitjbGFzcyBNeVRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIE15VGhyZWFkKFN0YXRpY0NvdW50ZXJTdG9yZSogc3RvcmUpIDogbVN0b3JlKHN0b3JlKSB7fQorCisgICAgdmlydHVhbCBpbnRwdHJfdCBtYWluKCkgeworICAgICAgICBtU3RvcmUtPnNldChuZXcgU3RhdGljQ291bnRlcigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorcHJpdmF0ZToKKyAgICBTdGF0aWNDb3VudGVyU3RvcmUqIG1TdG9yZTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBKdXN0IGNoZWNrIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIG5ldyBUaHJlYWRTdG9yZUJhc2Ugd2l0aCBhbiBlbXB0eQorLy8gZGVzdHJ1Y3RvciwgYW5kIHVzZSBpdCBpbiB0aGUgY3VycmVudCB0aHJlYWQuCitURVNUKFRocmVhZFN0b3JlQmFzZSwgTWFpblRocmVhZFdpdGhvdXREZXN0cnVjdG9yKSB7CisgICAgVGhyZWFkU3RvcmVCYXNlIHN0b3JlKE5VTEwpOworICAgIHN0YXRpYyBpbnQgeCA9IDQyOworICAgIHN0b3JlLnNldCgmeCk7CisgICAgRVhQRUNUX0VRKCZ4LCBzdG9yZS5nZXQoKSk7Cit9CisKKy8vIFRoZSBmb2xsb3dpbmcgdGVzdCBjaGVja3MgdGhhdCBleGl0aW5nIGEgdGhyZWFkIGNvcnJlY3RseSBkZWxldGVzCisvLyBhbnkgdGhyZWFkLWxvY2FsIHZhbHVlIHN0b3JlZCBpbiBpdC4KK3N0YXRpYyB2b2lkIHNpbXBseURlc3Ryb3kodm9pZCogdmFsdWUpIHsKKyAgICBkZWxldGUgKFN0YXRpY0NvdW50ZXIqKSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQqIHNpbXBsZVRocmVhZEZ1bmModm9pZCogcGFyYW0pIHsKKyAgICBUaHJlYWRTdG9yZUJhc2UqIHN0b3JlID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3RvcmVCYXNlKj4ocGFyYW0pOworICAgIHN0b3JlLT5zZXQobmV3IFN0YXRpY0NvdW50ZXIoKSk7CisgICAgVGhyZWFkU3RvcmVCYXNlOjpPblRocmVhZEV4aXQoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworVEVTVChUaHJlYWRTdG9yZUJhc2UsIFRocmVhZHNXaXRoRGVzdHJ1Y3RvcikgeworICAgIFRocmVhZFN0b3JlQmFzZSBzdG9yZShzaW1wbHlEZXN0cm95KTsKKyAgICBjb25zdCBzaXplX3Qga051bVRocmVhZHMgPSAxMDAwOworICAgIFRlc3RUaHJlYWQqIHRocmVhZHNba051bVRocmVhZHNdOworICAgIFN0YXRpY0NvdW50ZXI6OnJlc2V0KCk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgdGhyZWFkc1tuXSA9IG5ldyBUZXN0VGhyZWFkKCZzaW1wbGVUaHJlYWRGdW5jLCAmc3RvcmUpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgdGhyZWFkc1tuXS0+am9pbigpOworICAgIH0KKworICAgIEVYUEVDVF9FUShrTnVtVGhyZWFkcywgU3RhdGljQ291bnRlcjo6Z2V0Q3JlYXRpb25Db3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoa051bVRocmVhZHMsIFN0YXRpY0NvdW50ZXI6OmdldERlc3RydWN0aW9uQ291bnQoKSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgZGVsZXRlIHRocmVhZHNbbl07CisgICAgfQorfQorCitURVNUKFRocmVhZFN0b3JlQmFzZSwgVGhyZWFkc1dpdGhvdXREZXN0cnVjdG9yKSB7CisgICAgVGhyZWFkU3RvcmVCYXNlIHN0b3JlKE5VTEwpOworICAgIGNvbnN0IHNpemVfdCBrTnVtVGhyZWFkcyA9IDEwMDA7CisgICAgVGVzdFRocmVhZCogdGhyZWFkc1trTnVtVGhyZWFkc107CisgICAgU3RhdGljQ291bnRlcjo6cmVzZXQoKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICB0aHJlYWRzW25dID0gbmV3IFRlc3RUaHJlYWQoJnNpbXBsZVRocmVhZEZ1bmMsICZzdG9yZSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICB0aHJlYWRzW25dLT5qb2luKCk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtOdW1UaHJlYWRzLCBTdGF0aWNDb3VudGVyOjpnZXRDcmVhdGlvbkNvdW50KCkpOworICAgIEVYUEVDVF9FUSgwVSwgU3RhdGljQ291bnRlcjo6Z2V0RGVzdHJ1Y3Rpb25Db3VudCgpKTsKKworICAgIFN0YXRpY0NvdW50ZXI6OmZyZWVBbGwoKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICBkZWxldGUgdGhyZWFkc1tuXTsKKyAgICB9Cit9CisKK1RFU1QoVGhyZWFkU3RvcmUsIE1haW5UaHJlYWQpIHsKKyAgICBTdGF0aWNDb3VudGVyOjpyZXNldCgpOworCisgICAgVGhyZWFkU3RvcmU8U3RhdGljQ291bnRlcj4gc3RvcmU7CisgICAgRVhQRUNUX0VRKE5VTEwsIHN0b3JlLmdldCgpKTsKKworICAgIFN0YXRpY0NvdW50ZXIqIGNvdW50ZXIgPSBuZXcgU3RhdGljQ291bnRlcigpOworICAgIHN0b3JlLnNldChjb3VudGVyKTsKKyAgICBFWFBFQ1RfRVEoY291bnRlciwgc3RvcmUuZ2V0KCkpOworICAgIEVYUEVDVF9FUSgwVSwgU3RhdGljQ291bnRlcjo6Z2V0RGVzdHJ1Y3Rpb25Db3VudCgpKTsKKworICAgIHN0b3JlLnNldChOVUxMKTsKKyAgICBFWFBFQ1RfRVEoMVUsIFN0YXRpY0NvdW50ZXI6OmdldERlc3RydWN0aW9uQ291bnQoKSk7Cit9CisKK1RFU1QoVGhyZWFkU3RvcmUsIFRocmVhZHMpIHsKKyAgICBTdGF0aWNDb3VudGVyU3RvcmUgc3RvcmU7CisgICAgY29uc3Qgc2l6ZV90IGtOdW1UaHJlYWRzID0gMTAwOworICAgIE15VGhyZWFkKiB0aHJlYWRzW2tOdW1UaHJlYWRzXTsKKyAgICBTdGF0aWNDb3VudGVyOjpyZXNldCgpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrTnVtVGhyZWFkczsgKytuKSB7CisgICAgICAgIHRocmVhZHNbbl0gPSBuZXcgTXlUaHJlYWQoJnN0b3JlKTsKKyAgICAgICAgdGhyZWFkc1tuXS0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtOdW1UaHJlYWRzOyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUodGhyZWFkc1tuXS0+d2FpdChOVUxMKSkgPDwgIlRocmVhZCAiIDw8IG47CisgICAgfQorCisgICAgRVhQRUNUX0VRKGtOdW1UaHJlYWRzLCBTdGF0aWNDb3VudGVyOjpnZXRDcmVhdGlvbkNvdW50KCkpOworICAgIEVYUEVDVF9FUShrTnVtVGhyZWFkcywgU3RhdGljQ291bnRlcjo6Z2V0RGVzdHJ1Y3Rpb25Db3VudCgpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga051bVRocmVhZHM7ICsrbikgeworICAgICAgICBkZWxldGUgdGhyZWFkc1tuXTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRfcHRocmVhZC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZF9wdGhyZWFkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkyODg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRfcHRocmVhZC5jcHAKQEAgLTAsMCArMSwxODIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZFN0b3JlLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyB0byBhdXRvbWF0aWNhbGx5IGxvY2sgLyB1bmxvY2sgYSBtdXRleCBvbiBzY29wZSBlbnRlci9leGl0LgorLy8gRXF1aXZhbGVudCB0byBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jaywgYnV0IGF2b2lkIHVzaW5nIGl0IHRvIHJlZHVjZQorLy8gY291cGxpbmcuCitjbGFzcyBTY29wZWRMb2NrZXIgeworcHVibGljOgorICAgIFNjb3BlZExvY2tlcihwdGhyZWFkX211dGV4X3QqIG11dGV4KSA6IG1Mb2NrKG11dGV4KSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jayhtTG9jayk7CisgICAgfQorCisgICAgflNjb3BlZExvY2tlcigpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2sobUxvY2spOworICAgIH0KK3ByaXZhdGU6CisgICAgcHRocmVhZF9tdXRleF90KiBtTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitUaHJlYWQ6OlRocmVhZChUaHJlYWRGbGFncyBmbGFncykgOgorICAgIG1UaHJlYWQoKHB0aHJlYWRfdClOVUxMKSwKKyAgICBtRmxhZ3MoZmxhZ3MpIHsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1Mb2NrLCBOVUxMKTsKK30KKworVGhyZWFkOjp+VGhyZWFkKCkgeworICAgIGFzc2VydCghbVN0YXJ0ZWQgfHwgbUZpbmlzaGVkKTsKKyAgICBpZiAoKG1GbGFncyAmIFRocmVhZEZsYWdzOjpEZXRhY2gpID09IFRocmVhZEZsYWdzOjpOb0ZsYWdzCisgICAgICAgICYmIG1TdGFydGVkICYmICFtSm9pbmVkKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSByZWNsYWltIHRoZSBPUyByZXNvdXJjZXMuCisgICAgICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCBudWxscHRyKTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtTG9jayk7Cit9CisKK2Jvb2wgVGhyZWFkOjpzdGFydCgpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCBOVUxMLCB0aHJlYWRfbWFpbiwgdGhpcykpIHsKKyAgICAgICAgcmV0ID0gZmFsc2U7CisgICAgICAgIC8vIFdlIF9kbyBub3RfIG5lZWQgdG8gZ3VhcmQgdGhpcyBhY2Nlc3MgdG8gfG1GaW5pc2hlZHwgYmVjYXVzZSB3ZSdyZQorICAgICAgICAvLyBzdXJlIHRoYXQgdGhlIGxhdW5jaGVkIHRocmVhZCBmYWlsZWQsIHNvIHRoZXJlIGNhbid0IGJlIHBhcmFsbGVsCisgICAgICAgIC8vIGFjY2Vzcy4KKyAgICAgICAgbUZpbmlzaGVkID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBUaHJlYWQ6OndhaXQoaW50cHRyX3QgKmV4aXRTdGF0dXMpIHsKKyAgICBpZiAoIW1TdGFydGVkIHx8IChtRmxhZ3MgJiBUaHJlYWRGbGFnczo6RGV0YWNoKSAhPSBUaHJlYWRGbGFnczo6Tm9GbGFncykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTk9URTogRG8gbm90IGhvbGQgdGhlIGxvY2sgd2hlbiB3YWl0aW5nIGZvciB0aGUgdGhyZWFkIHRvIGVuc3VyZQorICAgIC8vIGl0IGNhbiB1cGRhdGUgbUZpbmlzaGVkIGFuZCBtRXhpdFN0YXR1cyBwcm9wZXJseSBpbiB0aHJlYWRfbWFpbgorICAgIC8vIHdpdGhvdXQgYmxvY2tpbmcuCisgICAgaWYgKCFtSm9pbmVkICYmIHB0aHJlYWRfam9pbihtVGhyZWFkLCBOVUxMKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1Kb2luZWQgPSB0cnVlOworCisgICAgaWYgKGV4aXRTdGF0dXMpIHsKKyAgICAgICAgKmV4aXRTdGF0dXMgPSBtRXhpdFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGhyZWFkOjp0cnlXYWl0KGludHB0cl90ICpleGl0U3RhdHVzKSB7CisgICAgaWYgKCFtU3RhcnRlZCB8fCAobUZsYWdzICYgVGhyZWFkRmxhZ3M6OkRldGFjaCkgIT0gVGhyZWFkRmxhZ3M6Ok5vRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFNjb3BlZExvY2tlciBsb2NrZXIoJm1Mb2NrKTsKKyAgICBpZiAoIW1GaW5pc2hlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtSm9pbmVkICYmIHB0aHJlYWRfam9pbihtVGhyZWFkLCBOVUxMKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1Kb2luZWQgPSB0cnVlOworCisgICAgaWYgKGV4aXRTdGF0dXMpIHsKKyAgICAgICAgKmV4aXRTdGF0dXMgPSBtRXhpdFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYwordm9pZCogVGhyZWFkOjp0aHJlYWRfbWFpbih2b2lkICphcmcpIHsKKyAgICBpbnRwdHJfdCByZXQ7CisKKyAgICB7CisgICAgICAgIFRocmVhZCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGhyZWFkKj4oYXJnKTsKKyAgICAgICAgaWYgKChzZWxmLT5tRmxhZ3MgJiBUaHJlYWRGbGFnczo6TWFza1NpZ25hbHMpICE9IFRocmVhZEZsYWdzOjpOb0ZsYWdzKSB7CisgICAgICAgICAgICBUaHJlYWQ6Om1hc2tBbGxTaWduYWxzKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHNlbGYtPm1GbGFncyAmIFRocmVhZEZsYWdzOjpEZXRhY2gpICE9IFRocmVhZEZsYWdzOjpOb0ZsYWdzKSB7CisgICAgICAgICAgICBpZiAocHRocmVhZF9kZXRhY2gocHRocmVhZF9zZWxmKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBvbmx5IG1lYW5zIGEgc2xvdyBtZW1vcnkgbGVhaywgc28gdXNlIFZFUkJPU0UuCisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGYWlsZWQgdG8gc2V0IHRocmVhZCB0byBkZXRhY2ggbW9kZSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBzZWxmLT5tYWluKCk7CisKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzZWxmLT5tTG9jayk7CisgICAgICAgIHNlbGYtPm1GaW5pc2hlZCA9IHRydWU7CisgICAgICAgIHNlbGYtPm1FeGl0U3RhdHVzID0gcmV0OworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc2VsZi0+bUxvY2spOworCisgICAgICAgIHNlbGYtPm9uRXhpdCgpOworICAgICAgICAvLyB8c2VsZnwgaXMgbm90IHZhbGlkIGJleW9uZCB0aGlzIHBvaW50CisgICAgfQorCisgICAgOjphbmRyb2lkOjpiYXNlOjpUaHJlYWRTdG9yZUJhc2U6Ok9uVGhyZWFkRXhpdCgpOworCisgICAgLy8gVGhpcyByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gc3RhdGljCit2b2lkIFRocmVhZDo6bWFza0FsbFNpZ25hbHMoKSB7CisgICAgc2lnc2V0X3Qgc2V0OworICAgIHNpZ2ZpbGxzZXQoJnNldCk7CisgICAgcHRocmVhZF9zaWdtYXNrKFNJR19TRVRNQVNLLCAmc2V0LCBudWxscHRyKTsKK30KKworLy8gc3RhdGljCit2b2lkIFRocmVhZDo6c2xlZXBNcyh1bnNpZ25lZCBuKSB7CisgICAgdXNsZWVwKG4gKiAxMDAwKTsKK30KKworLy8gc3RhdGljCit2b2lkIFRocmVhZDo6eWllbGQoKSB7CisgICAgc2NoZWRfeWllbGQoKTsKK30KKwordW5zaWduZWQgbG9uZyBnZXRDdXJyZW50VGhyZWFkSWQoKSB7CisgICAgcHRocmVhZF90IHRpZCA9IHB0aHJlYWRfc2VsZigpOworICAgIC8vIFBPU0lYIGRvZXNuJ3QgcmVxdWlyZSBwdGhyZWFkX3QgdG8gYmUgYSBudW1lcmljIHR5cGUuCisgICAgLy8gSW5zdGVhZCwganVzdCBwaWNrIHVwIHRoZSBmaXJzdCBzaXplb2YobG9uZykgYnl0ZXMgYXMgdGhlICJpZCIuCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YodGlkKSA+PSA0LAorICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIHB0aHJlYWRfdCB0byBiZSBhdCBsZWFzdCBzaXplb2YobG9uZykgd2lkZSIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nKj4oJnRpZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjE3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpUaHJlYWQ7CisKKy8vIEEgc2ltcGxlIHRocmVhZCBpbnN0YW5jZSB0aGF0IGRvZXMgbm90aGluZyBhdCBhbGwgYW5kIGV4aXRzIGltbWVkaWF0ZWx5LgorY2xhc3MgRW1wdHlUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBpbnRwdHJfdCBtYWluKCkgeyByZXR1cm4gNDI7IH0KK307CisKKy8vIEEgdGhyZWFkIHRoYXQgY2hlY2tzIGlmIG9uRXhpdCBpcyBjYWxsZWQKK2NsYXNzIE9uRXhpdFRocmVhZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OmJhc2U6OlRocmVhZCB7CitwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgb25FeGl0Q2FsbGVkOworICAgIHN0YXRpYyBib29sIGR0b3JDYWxsZWQ7CisKKyAgICBPbkV4aXRUaHJlYWQoKSB7IG9uRXhpdENhbGxlZCA9IGR0b3JDYWxsZWQgPSBmYWxzZTsgfQorCisgICAgfk9uRXhpdFRocmVhZCgpIHsgZHRvckNhbGxlZCA9IHRydWU7IH0KKworICAgIHZpcnR1YWwgaW50cHRyX3QgbWFpbigpIHsgcmV0dXJuIDQyOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FeGl0KCkgeworICAgICAgICBvbkV4aXRDYWxsZWQgPSB0cnVlOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9Cit9OworCitib29sIE9uRXhpdFRocmVhZDo6b25FeGl0Q2FsbGVkID0gZmFsc2U7Citib29sIE9uRXhpdFRocmVhZDo6ZHRvckNhbGxlZCA9IGZhbHNlOworCitjbGFzcyBDb3VudGluZ1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworcHVibGljOgorICAgIGNsYXNzIFN0YXRlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFN0YXRlKCkgOiBtTG9jaygpLCBtQ291bnQoMCkge30KKyAgICAgICAgflN0YXRlKCkge30KKworICAgICAgICB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIG1Db3VudCsrOworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgcmV0ID0gbUNvdW50OworICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBtdXRhYmxlIExvY2sgbUxvY2s7CisgICAgICAgIGludCBtQ291bnQ7CisgICAgfTsKKworICAgIENvdW50aW5nVGhyZWFkKFN0YXRlKiBzdGF0ZSkgOiBUaHJlYWQoKSwgbVN0YXRlKHN0YXRlKSB7fQorCisgICAgaW50cHRyX3QgbWFpbigpIHsKKyAgICAgICAgbVN0YXRlLT5pbmNyZW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCitwcml2YXRlOgorICAgIFN0YXRlKiBtU3RhdGU7Cit9OworCisvLyBBIHRocmVhZCB0aGF0IGJsb2NrcyB0aWxsIGl0J3MgaW5zdHJ1Y3RlZCB0byBjb250aW51ZS4KK2NsYXNzIEJsb2NraW5nVGhyZWFkIDogcHVibGljIFRocmVhZCB7CisgcHVibGljOgorICAgIEJsb2NraW5nVGhyZWFkKCkgOiBUaHJlYWQoKSwgbUxvY2soKSwgbVNoYXJlZENvbnRpbnVlRmxhZyhuZXcgYm9vbCkgeworICAgICAgICAqbVNoYXJlZENvbnRpbnVlRmxhZyA9IGZhbHNlOworICAgIH0KKworICAgIHZvaWQgdW5ibG9jaygpIHsKKyAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAqbVNoYXJlZENvbnRpbnVlRmxhZyA9IHRydWU7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KKworICAgIGludHB0cl90IG1haW4oKSB7CisgICAgICAgIGJvb2wgY29udGludWVGbGFnOworICAgICAgICBkbyB7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICBjb250aW51ZUZsYWcgPSAqbVNoYXJlZENvbnRpbnVlRmxhZzsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgICAgIH0gd2hpbGUgKCFjb250aW51ZUZsYWcpOworICAgICAgICByZXR1cm4gNDI7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBtdXRhYmxlIExvY2sgbUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPGJvb2w+IG1TaGFyZWRDb250aW51ZUZsYWc7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChUaHJlYWRUZXN0LCBTaW1wbGVUaHJlYWQpIHsKKyAgICBUaHJlYWQqIHRocmVhZCA9IG5ldyBFbXB0eVRocmVhZCgpOworICAgIGludHB0cl90IHN0YXR1czsKKyAgICAvLyBDYW4ndCB3YWl0IG9uIHRocmVhZHMgYmVmb3JlIHN0YXJ0aW5nIHRoZW0uCisgICAgRVhQRUNUX0ZBTFNFKHRocmVhZC0+d2FpdCgmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRocmVhZC0+dHJ5V2FpdCgmc3RhdHVzKSk7CisKKyAgICBFWFBFQ1RfVFJVRSh0aHJlYWQpOworICAgIEVYUEVDVF9UUlVFKHRocmVhZC0+c3RhcnQoKSk7CisgICAgc3RhdHVzID0gMDsKKyAgICBFWFBFQ1RfVFJVRSh0aHJlYWQtPndhaXQoJnN0YXR1cykpOworICAgIEVYUEVDVF9FUSg0Miwgc3RhdHVzKTsKKworICAgIC8vIFRocmVhZCBvYmplY3RzIGFyZSBzaW5nbGUgdXNlLgorICAgIEVYUEVDVF9GQUxTRSh0aHJlYWQtPnN0YXJ0KCkpOworfQorCitURVNUKFRocmVhZFRlc3QsIE11bHRpcGxlVGhyZWFkcykgeworICAgIENvdW50aW5nVGhyZWFkOjpTdGF0ZSBzdGF0ZTsKKyAgICBjb25zdCBzaXplX3Qga01heFRocmVhZHMgPSAxMDA7CisgICAgVGhyZWFkKiB0aHJlYWRzW2tNYXhUaHJlYWRzXTsKKworICAgIC8vIENyZWF0ZSBhbGwgdGhyZWFkcy4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtNYXhUaHJlYWRzOyArK24pIHsKKyAgICAgICAgdGhyZWFkc1tuXSA9IG5ldyBDb3VudGluZ1RocmVhZCgmc3RhdGUpOworICAgICAgICBFWFBFQ1RfVFJVRSh0aHJlYWRzW25dKSA8PCAidGhyZWFkICIgPDwgbjsKKyAgICB9CisKKyAgICAvLyBTdGFydCB0aGVtIGFsbC4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtNYXhUaHJlYWRzOyArK24pIHsKKyAgICAgICAgRVhQRUNUX1RSVUUodGhyZWFkc1tuXS0+c3RhcnQoKSkgPDwgInRocmVhZCAiIDw8IG47CisgICAgfQorCisgICAgLy8gV2FpdCBmb3IgdGhlbSBhbGwuCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrTWF4VGhyZWFkczsgKytuKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKHRocmVhZHNbbl0tPndhaXQoTlVMTCkpIDw8ICJ0aHJlYWQgIiA8PCBuOworICAgIH0KKworICAgIC8vIENoZWNrIHN0YXRlLgorICAgIEVYUEVDVF9FUSgoaW50KWtNYXhUaHJlYWRzLCBzdGF0ZS5jb3VudCgpKTsKKworICAgIC8vIERlbGV0ZSB0aGVtIGFsbC4KKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtNYXhUaHJlYWRzOyArK24pIHsKKyAgICAgICAgZGVsZXRlIHRocmVhZHNbbl07CisgICAgfQorfQorCitURVNUKFRocmVhZFRlc3QsIE9uRXhpdCkgeworICAgIE9uRXhpdFRocmVhZCogdGhyZWFkID0gbmV3IE9uRXhpdFRocmVhZCgpOworICAgIEVYUEVDVF9GQUxTRShPbkV4aXRUaHJlYWQ6Om9uRXhpdENhbGxlZCk7CisgICAgRVhQRUNUX0ZBTFNFKE9uRXhpdFRocmVhZDo6ZHRvckNhbGxlZCk7CisgICAgRVhQRUNUX1RSVUUodGhyZWFkLT5zdGFydCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0aHJlYWQtPndhaXQoTlVMTCkpOworICAgIEVYUEVDVF9UUlVFKE9uRXhpdFRocmVhZDo6b25FeGl0Q2FsbGVkKTsKKyAgICBFWFBFQ1RfVFJVRShPbkV4aXRUaHJlYWQ6OmR0b3JDYWxsZWQpOworfQorCitURVNUKFRocmVhZFRlc3QsIHRyeVdhaXQpIHsKKyAgICBCbG9ja2luZ1RocmVhZCB0aHJlYWQ7CisgICAgaW50cHRyX3QgcmVzdWx0ID0gMDsKKyAgICBFWFBFQ1RfRkFMU0UodGhyZWFkLnRyeVdhaXQoJnJlc3VsdCkpOworICAgIEVYUEVDVF9UUlVFKHRocmVhZC5zdGFydCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGhyZWFkLnRyeVdhaXQoJnJlc3VsdCkpOworICAgIHRocmVhZC51bmJsb2NrKCk7CisKKyAgICAvLyBUaGlzIGhhcyB0aGUgcG90ZW50aWFsIHRvIGhhbmcgZm9yZXZlciBpbiBjYXNlIG9mIGEgYnVnIGluIHRoZQorICAgIC8vIFRocmVhZCB1bmRlciB0ZXN0LiBTbywgZmFpbCBhZnRlciBhIHJlYW9uc2FibHkgbG9uZyBhdHRlbXB0LgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWF4V2FpdFRpbWVNcyA9IDUwMDA7ICAvLyA1IHNlY29uZHMuCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtTbGVlcFRpbWVNcyA9IDEwOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrTWF4TnVtQ2hlY2tzID0ga01heFdhaXRUaW1lTXMgLyBrU2xlZXBUaW1lTXM7CisgICAgdW5zaWduZWQgbnVtSXRlcnMgPSAwOworICAgIHJlc3VsdCA9IDA7CisgICAgd2hpbGUobnVtSXRlcnMgPCBrTWF4TnVtQ2hlY2tzICYmICF0aHJlYWQudHJ5V2FpdCgmcmVzdWx0KSkgeworICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKGtTbGVlcFRpbWVNcyk7CisgICAgfQorICAgIEVYUEVDVF9MVChudW1JdGVycywga01heE51bUNoZWNrcyk7CisgICAgRVhQRUNUX0VRKDQyLCByZXN1bHQpOworfQorCitjbGFzcyBUaWRTZXR0ZXJUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgICBpbnRwdHJfdCBtYWluKCkgeworICAgICAgICBtVGlkID0gZ2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIGxvbmcgbVRpZCA9IDA7Cit9OworCitURVNUKFRocmVhZFRlc3QsIGlkKSB7CisgICAgRVhQRUNUX05FKDAsIGdldEN1cnJlbnRUaHJlYWRJZCgpKTsKKworICAgIFRpZFNldHRlclRocmVhZCB0aHJlYWQxOworICAgIFRpZFNldHRlclRocmVhZCB0aHJlYWQyOworCisgICAgRVhQRUNUX1RSVUUodGhyZWFkMS5zdGFydCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0aHJlYWQyLnN0YXJ0KCkpOworICAgIEVYUEVDVF9UUlVFKHRocmVhZDEud2FpdCgpKTsKKyAgICBFWFBFQ1RfVFJVRSh0aHJlYWQyLndhaXQoKSk7CisgICAgRVhQRUNUX05FKDAsIHRocmVhZDEubVRpZCk7CisgICAgRVhQRUNUX05FKDAsIHRocmVhZDIubVRpZCk7CisgICAgRVhQRUNUX05FKHRocmVhZDEubVRpZCwgdGhyZWFkMi5tVGlkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZF93aW4zMi5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1RocmVhZF93aW4zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhMGRlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkX3dpbjMyLmNwcApAQCAtMCwwICsxLDE1NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYmFzZSB7CisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyB0byBlbnRlci9sZWF2ZSBhIGNyaXRpY2FsIHNlY3Rpb24gb24gc2NvcGUgZW50ZXIvZXhpdC4KKy8vIEVxdWl2YWxlbnQgdG8gYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgYnV0IGRvIG5vdCB1c2UgaXQgdG8gcmVkdWNlCisvLyBjb3VwbGluZy4KK2NsYXNzIFNjb3BlZExvY2tlciB7CitwdWJsaWM6CisgICAgU2NvcGVkTG9ja2VyKENSSVRJQ0FMX1NFQ1RJT04qIHNlY3Rpb24pIDogbVNlY3Rpb24oc2VjdGlvbikgeworICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbihtU2VjdGlvbik7CisgICAgfQorCisgICAgflNjb3BlZExvY2tlcigpIHsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24obVNlY3Rpb24pOworICAgIH0KK3ByaXZhdGU6CisgICAgQ1JJVElDQUxfU0VDVElPTiogbVNlY3Rpb247Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVGhyZWFkOjpUaHJlYWQoVGhyZWFkRmxhZ3MgZmxhZ3MpIDoKKyAgICBtRmxhZ3MoZmxhZ3MpIHsKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZtTG9jayk7Cit9CisKK1RocmVhZDo6flRocmVhZCgpIHsKKyAgICBpZiAobVRocmVhZCkgeworICAgICAgICBhc3NlcnQoIW1TdGFydGVkIHx8IG1GaW5pc2hlZCk7CisgICAgICAgIENsb3NlSGFuZGxlKG1UaHJlYWQpOworICAgIH0KKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJm1Mb2NrKTsKK30KKworYm9vbCBUaHJlYWQ6OnN0YXJ0KCkgeworICAgIGlmIChtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU2NvcGVkTG9ja2VyIGxvY2tlcigmbUxvY2spOworICAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgbVRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLCAwLCAmVGhyZWFkOjp0aHJlYWRfbWFpbiwgdGhpcywgMCwgJm1UaHJlYWRJZCk7CisgICAgaWYgKCFtVGhyZWFkKSB7CisgICAgICAgIC8vIGRvbid0IHJlc2V0IG1TdGFydGVkIGhlcmU6IHdlJ3JlIGFydGlmaWNhbGx5IGxpbWl0aW5nIHRoZSB1c2VyJ3MKKyAgICAgICAgLy8gYWJpbGl0eSB0byByZXRyeSB0aGUgZmFpbGVkIHN0YXJ0cyBoZXJlLgorICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICAgbUZpbmlzaGVkID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgVGhyZWFkOjp3YWl0KGludHB0cl90KiBleGl0U3RhdHVzKSB7CisgICAgaWYgKCFtU3RhcnRlZCB8fCAobUZsYWdzICYgVGhyZWFkRmxhZ3M6OkRldGFjaCkgIT0gVGhyZWFkRmxhZ3M6Ok5vRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5PVEU6IERvIG5vdCBob2xkIGxvY2sgZHVyaW5nIHdhaXQgdG8gYWxsb3cgdGhyZWFkX21haW4gdG8KKyAgICAvLyBwcm9wZXJseSB1cGRhdGUgbUlzUnVubmluZyBhbmQgbUZpbmlzaGVkIG9uIHRocmVhZCBleGl0LgorICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KG1UaHJlYWQsIElORklOSVRFKSA9PSBXQUlUX0ZBSUxFRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIERDSEVDSyhtRmluaXNoZWQpOworCisgICAgaWYgKGV4aXRTdGF0dXMpIHsKKyAgICAgICAgKmV4aXRTdGF0dXMgPSBtRXhpdFN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVGhyZWFkOjp0cnlXYWl0KGludHB0cl90KiBleGl0U3RhdHVzKSB7CisgICAgaWYgKCFtU3RhcnRlZCB8fCAobUZsYWdzICYgVGhyZWFkRmxhZ3M6OkRldGFjaCkgIT0gVGhyZWFkRmxhZ3M6Ok5vRmxhZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFNjb3BlZExvY2tlciBsb2NrZXIoJm1Mb2NrKTsKKyAgICBpZiAoIW1GaW5pc2hlZCB8fAorICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KG1UaHJlYWQsIDApICE9IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChleGl0U3RhdHVzKSB7CisgICAgICAgICpleGl0U3RhdHVzID0gbUV4aXRTdGF0dXM7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK0RXT1JEIFdJTkFQSSBUaHJlYWQ6OnRocmVhZF9tYWluKHZvaWQgKmFyZykgeworICAgIHsKKyAgICAgICAgLy8gbm8gbmVlZCB0byBjYWxsIG1hc2tBbGxTaWduYWxzKCkgaGVyZTogd2Uga25vdworICAgICAgICAvLyB0aGF0IG9uIFdpbmRvd3MgaXQncyBhIG5vb3AKKyAgICAgICAgVGhyZWFkKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxUaHJlYWQqPihhcmcpOworICAgICAgICBhdXRvIHJldCA9IHNlbGYtPm1haW4oKTsKKworICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmc2VsZi0+bUxvY2spOworICAgICAgICBzZWxmLT5tRmluaXNoZWQgPSB0cnVlOworICAgICAgICBzZWxmLT5tRXhpdFN0YXR1cyA9IHJldDsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnNlbGYtPm1Mb2NrKTsKKworICAgICAgICBzZWxmLT5vbkV4aXQoKTsKKyAgICAgICAgLy8gfHNlbGZ8IGlzIG5vdCB2YWxpZCBiZXlvbmQgdGhpcyBwb2ludAorICAgIH0KKworICAgIC8vIEVuc3VyZSBhbGwgdGhyZWFkLWxvY2FsIHZhbHVlcyBhcmUgcmVsZWFzZWQgZm9yIHRoaXMgdGhyZWFkLgorICAgIDo6YW5kcm9pZDo6YmFzZTo6VGhyZWFkU3RvcmVCYXNlOjpPblRocmVhZEV4aXQoKTsKKworICAgIC8vIFRoaXMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIHN0YXRpYwordm9pZCBUaHJlYWQ6Om1hc2tBbGxTaWduYWxzKCkgeworICAgIC8vIG5vIHN1Y2ggdGhpbmcgYXMgc2lnbmFsIGluIFdpbmRvd3MKK30KKworLy8gc3RhdGljCit2b2lkIFRocmVhZDo6c2xlZXBNcyh1bnNpZ25lZCBuKSB7CisgICAgOjpTbGVlcChuKTsKK30KKworLy8gc3RhdGljCit2b2lkIFRocmVhZDo6eWllbGQoKSB7CisgICAgaWYgKCE6OlN3aXRjaFRvVGhyZWFkKCkpIHsKKyAgICAgICAgOjpTbGVlcCgwKTsKKyAgICB9Cit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0Q3VycmVudFRocmVhZElkKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihHZXRDdXJyZW50VGhyZWFkSWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UeXBlcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL1R5cGVzLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gYSBmdW5jdG9yIHdoaWNoIGNhbiBydW4gaW4gYSBzZXBhcmF0ZSB0aHJlYWQKK3VzaW5nIFRocmVhZEZ1bmN0b3IgPSBzdGQ6OmZ1bmN0aW9uPGludHB0cl90KCk+OworCitlbnVtIGNsYXNzIFRocmVhZEZsYWdzIDogdW5zaWduZWQgY2hhciB7CisgICAgTm9GbGFncyA9IDAsCisgICAgTWFza1NpZ25hbHMgPSAxLAorICAgIC8vIEEgRGV0YWNoLWVkIHRocmVhZCBpcyBhIGxhdW5jaC1hbmQtZm9yZ2V0IHRocmVhZC4KKyAgICAvLyB3YWl0KCkgYW5kIHRyeVdhaXQoKSBvbiBhIERldGFjaC1lZCB0aHJlYWQgYWx3YXlzIGZhaWxzLgorICAgIC8vIE9UT0gsIGlmIHlvdSBkb24ndCB3YWl0KCkgb24gYSBub24gRGV0YWNoLWVkIHRocmVhZCBpdCB3b3VsZCBkbyBpdAorICAgIC8vIGluIGR0b3IgYW55d2F5LgorICAgIERldGFjaCA9IDEgPDwgMQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYmFzZS90aHJlYWRzL2ludGVybmFsL1BhcmFsbGVsVGFza0Jhc2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9pbnRlcm5hbC9QYXJhbGxlbFRhc2tCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIxNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9pbnRlcm5hbC9QYXJhbGxlbFRhc2tCYXNlLmNwcApAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9pbnRlcm5hbC9QYXJhbGxlbFRhc2tCYXNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3VzaW5nIHN0ZDo6dW5pcXVlX3B0cjsKKworUGFyYWxsZWxUYXNrQmFzZTo6UGFyYWxsZWxUYXNrQmFzZShMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpEdXJhdGlvbiBjaGVja1RpbWVvdXRNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRmxhZ3MgZmxhZ3MpCisgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICBtQ2hlY2tUaW1lb3V0TXMoY2hlY2tUaW1lb3V0TXMpLAorICAgICAgbU1hbmFnZWRUaHJlYWQobmV3IE1hbmFnZWRUaHJlYWQodGhpcywgZmxhZ3MpKSB7fQorCitib29sIFBhcmFsbGVsVGFza0Jhc2U6OnN0YXJ0KCkgeworICAgIGlmICghbU1hbmFnZWRUaHJlYWQtPnN0YXJ0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtVGltZXIucmVzZXQobUxvb3Blci0+Y3JlYXRlVGltZXIoJnRyeVdhaXRUaWxsSm9pbmVkLCB0aGlzKSk7CisgICAgbVRpbWVyLT5zdGFydFJlbGF0aXZlKDApOworICAgIGlzUnVubmluZyA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFyYWxsZWxUYXNrQmFzZTo6aW5GbGlnaHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzUnVubmluZzsKK30KKworLy8gc3RhdGljCit2b2lkIFBhcmFsbGVsVGFza0Jhc2U6OnRyeVdhaXRUaWxsSm9pbmVkKHZvaWQqIG9wYXF1ZVRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3Blcjo6VGltZXIqIHRpbWVyKSB7CisgICAgYXV0byB0aGlzUHRyID0gc3RhdGljX2Nhc3Q8UGFyYWxsZWxUYXNrQmFzZSo+KG9wYXF1ZVRoaXMpOworICAgIGlmICghdGhpc1B0ci0+bU1hbmFnZWRUaHJlYWQtPnRyeVdhaXQobnVsbHB0cikpIHsKKyAgICAgICAgdGhpc1B0ci0+bVRpbWVyLT5zdGFydFJlbGF0aXZlKHRoaXNQdHItPm1DaGVja1RpbWVvdXRNcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aGlzUHRyLT5pc1J1bm5pbmcgPSBmYWxzZTsKKyAgICB0aGlzUHRyLT50YXNrRG9uZUltcGwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvaW50ZXJuYWwvUGFyYWxsZWxUYXNrQmFzZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jhc2UvdGhyZWFkcy9pbnRlcm5hbC9QYXJhbGxlbFRhc2tCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkZmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9iYXNlL3RocmVhZHMvaW50ZXJuYWwvUGFyYWxsZWxUYXNrQmFzZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVHlwZXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGJhc2UgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gQmFzZSBjbGFzcyBjb250YWluaW5nIHRlbXBsYXRlIGZyZWUgaW1wbGVtZW5hdGF0aW9uIGRldGFpbHMgb2YgUGFyYWxsZWxUYXNrCisvLyB0byBtaW5pbWl6ZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBibG93dXAuCisvLworLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIERPIE5PVCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseS4KK2NsYXNzIFBhcmFsbGVsVGFza0Jhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgflBhcmFsbGVsVGFza0Jhc2UoKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgICBQYXJhbGxlbFRhc2tCYXNlKGFuZHJvaWQ6OmJhc2U6Okxvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpEdXJhdGlvbiBjaGVja1RpbWVvdXRNcywKKyAgICAgICAgICAgICAgICAgICAgIFRocmVhZEZsYWdzIGZsYWdzKTsKKworICAgIC8vIEFQSSBmdW5jdGlvbnMuCisgICAgYm9vbCBzdGFydCgpOworICAgIGJvb2wgaW5GbGlnaHQoKSBjb25zdDsKKworICAgIC8vIHxQYXJhbGxlbFRhc2s8VD58IGltcGxlbWVudHMgdGhlc2UgaG9va3MuCisgICAgdmlydHVhbCB2b2lkIHRhc2tJbXBsKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCB0YXNrRG9uZUltcGwoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgTWFuYWdlZFRocmVhZCA6IHB1YmxpYyA6OmFuZHJvaWQ6OmJhc2U6OlRocmVhZCB7CisgICAgcHVibGljOgorICAgICAgICBNYW5hZ2VkVGhyZWFkKFBhcmFsbGVsVGFza0Jhc2UqIG1hbmFnZXIsIFRocmVhZEZsYWdzIGZsYWdzKQorICAgICAgICAgICAgOiBUaHJlYWQoZmxhZ3MpLCBtTWFuYWdlcihtYW5hZ2VyKSB7fQorCisgICAgICAgIGludHB0cl90IG1haW4oKSB7CisgICAgICAgICAgICBtTWFuYWdlci0+dGFza0ltcGwoKTsKKyAgICAgICAgICAgIC8vIFRoaXMgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUGFyYWxsZWxUYXNrQmFzZSogbU1hbmFnZXI7CisgICAgfTsKKworICAgIC8vIENhbGxlZCBwcmVkaW9kaWNhbGx5IHRvIHx0cnlKb2lufCB0aGUgbGF1bmNoZWQgdGhyZWFkLgorICAgIHN0YXRpYyB2b2lkIHRyeVdhaXRUaWxsSm9pbmVkKHZvaWQqIG9wYXF1ZVRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpUaW1lciogdGltZXIpOworCisgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBtTG9vcGVyOworICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6RHVyYXRpb24gbUNoZWNrVGltZW91dE1zOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNYW5hZ2VkVGhyZWFkPiBtTWFuYWdlZFRocmVhZDsKKworICAgIGJvb2wgaXNSdW5uaW5nID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6VGltZXI+IG1UaW1lcjsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihQYXJhbGxlbFRhc2tCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYm9vdC1wcm9wZXJ0aWVzLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYm9vdC1wcm9wZXJ0aWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3NWI3MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ib290LXByb3BlcnRpZXMuYwpAQCAtMCwwICsxLDM3MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvYm9vdC1wcm9wZXJ0aWVzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgIEQoLi4uKSAgVkVSQk9TRV9QUklOVChpbml0LF9fVkFfQVJHU19fKQorCisvKiBkZWZpbmUgVF9BQ1RJVkUgdG8gMSB0byBkZWJ1ZyB0cmFuc3BvcnQgY29tbXVuaWNhdGlvbnMgKi8KKyNkZWZpbmUgIFRfQUNUSVZFICAwCisKKyNpZiBUX0FDVElWRQorI2RlZmluZSAgVCguLi4pICBWRVJCT1NFX1BSSU5UKGluaXQsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgVCguLi4pICAgKCh2b2lkKTApCisjZW5kaWYKKworLyogdGhpcyBjb2RlIHN1cHBvcnRzIHRoZSBsaXN0IG9mIHN5c3RlbSBwcm9wZXJ0aWVzIHRoYXQgd2lsbAorICogYmUgc2V0IG9uIGJvb3QgaW4gdGhlIGVtdWxhdGVkIHN5c3RlbS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBCb290UHJvcGVydHkgeworICAgIHN0cnVjdCBCb290UHJvcGVydHkqICBuZXh0OworICAgIGNoYXIqICAgICAgICAgICAgICAgICBwcm9wZXJ0eTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworfSBCb290UHJvcGVydHk7CisKK3N0YXRpYyBCb290UHJvcGVydHkqCitib290X3Byb3BlcnR5X2FsbG9jKCBjb25zdCBjaGFyKiAgbmFtZSwgIGludCAgbmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICB2YWx1ZSwgaW50ICB2YWx1ZWxlbiApCit7CisgICAgaW50ICAgICAgICAgICAgbGVuZ3RoID0gbmFtZWxlbiArIDEgKyB2YWx1ZWxlbjsKKyAgICBCb290UHJvcGVydHkqICBwcm9wID0gYW5kcm9pZF9hbGxvYyggc2l6ZW9mKCpwcm9wKSArIGxlbmd0aCArIDEgKTsKKyAgICBjaGFyKiAgICAgICAgICBwOworCisgICAgcHJvcC0+bmV4dCAgICAgPSBOVUxMOworICAgIHByb3AtPnByb3BlcnR5ID0gcCA9IChjaGFyKikocHJvcCArIDEpOworICAgIHByb3AtPmxlbmd0aCAgID0gbGVuZ3RoOworCisgICAgbWVtY3B5KCBwLCBuYW1lLCBuYW1lbGVuICk7CisgICAgcCArPSBuYW1lbGVuOworICAgICpwKysgPSAnPSc7CisgICAgbWVtY3B5KCBwLCB2YWx1ZSwgdmFsdWVsZW4gKTsKKyAgICBwICs9IHZhbHVlbGVuOworICAgICpwID0gJ1wwJzsKKworICAgIHJldHVybiBwcm9wOworfQorCitzdGF0aWMgQm9vdFByb3BlcnR5KiAgIF9ib290X3Byb3BlcnRpZXMgPSBOVUxMOworLyogYWRkcmVzcyB0byBzdG9yZSBwb2ludGVyIHRvIG5leHQgbmV3IGxpc3QgZWxlbWVudCAqLworc3RhdGljIEJvb3RQcm9wZXJ0eSoqICBfYm9vdF9wcm9wZXJ0aWVzX3RhaWwgPSAmX2Jvb3RfcHJvcGVydGllczsKK3N0YXRpYyBpbnQgICAgICAgICAgICAgX2luaXRlZDsKKworLyogQ2xlYXJzIGFsbCBleGlzdGluZyBib290IHByb3BlcnRpZXMKKyAqLworc3RhdGljIHZvaWQKK2Jvb3RfcHJvcGVydHlfY2xlYXJfYWxsKCkKK3sKKyAgICAvKiBmcmVlIGFsbCBlbGVtZW50cyBvZiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICBCb290UHJvcGVydHkgKnAgPSBfYm9vdF9wcm9wZXJ0aWVzOworICAgIEJvb3RQcm9wZXJ0eSAqbmV4dCA9IE5VTEw7CisgICAgd2hpbGUgKHApIHsKKyAgICAgICAgbmV4dCA9IHAtPm5leHQ7CisgICAgICAgIEFGUkVFKHApOworICAgICAgICBwID0gbmV4dDsKKyAgICB9CisKKyAgICAvKiByZXNldCBsaXN0IGFkbWluaXN0cmF0aW9uIHRvIGluaXRpYWwgc3RhdGUgKi8KKyAgICBfYm9vdF9wcm9wZXJ0aWVzID0gTlVMTDsKKyAgICBfYm9vdF9wcm9wZXJ0aWVzX3RhaWwgPSAmX2Jvb3RfcHJvcGVydGllczsKK30KKworLyogQXBwZW5kcyBhIG5ldyBib290IHByb3BlcnR5IHRvIHRoZSBlbmQgb2YgdGhlIGludGVybmFsIGxpc3QuCisgKi8KK2ludAorYm9vdF9wcm9wZXJ0eV9hZGQyKCBjb25zdCBjaGFyKiAgbmFtZSwgaW50ICBuYW1lbGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdmFsdWUsIGludCAgdmFsdWVsZW4gKQoreworICAgIEJvb3RQcm9wZXJ0eSogIHByb3A7CisKKyAgICAvKiBjaGVjayB0aGUgbGVuZ3RocworICAgICAqLworICAgIGlmIChuYW1lbGVuID4gUFJPUEVSVFlfTUFYX05BTUUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICh2YWx1ZWxlbiA+IFBST1BFUlRZX01BWF9WQUxVRSkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLyogY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm90IGludmFsaWQgY2hhcmFjdGVycyBpbiB0aGUKKyAgICAgKiBwcm9wZXJ0eSBuYW1lCisgICAgICovCisgICAgY29uc3QgY2hhciogIHJlamVjdCA9ICIgPSQqPydcIiI7CisgICAgaW50ICAgICAgICAgIG5uOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgbmFtZWxlbjsgbm4rKykgeworICAgICAgICBpZiAoc3RyY2hyKHJlamVjdCwgbmFtZVtubl0pICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisgICAgLyogaW5pdCB0aGUgc2VydmljZSAqLworICAgIGJvb3RfcHJvcGVydHlfaW5pdF9zZXJ2aWNlKCk7CisKKyAgICBEKCJBZGRpbmcgYm9vdCBwcm9wZXJ0eTogJyUuKnMnID0gJyUuKnMnIiwKKyAgICAgIG5hbWVsZW4sIG5hbWUsIHZhbHVlbGVuLCB2YWx1ZSk7CisKKyAgICAvKiBhZGQgdG8gdGhlIGVuZCBvZiB0aGUgaW50ZXJuYWwgbGlzdCAqLworICAgIHByb3AgPSBib290X3Byb3BlcnR5X2FsbG9jKG5hbWUsIG5hbWVsZW4sIHZhbHVlLCB2YWx1ZWxlbik7CisKKyAgICAqX2Jvb3RfcHJvcGVydGllc190YWlsID0gcHJvcDsKKyAgICBfYm9vdF9wcm9wZXJ0aWVzX3RhaWwgID0gJnByb3AtPm5leHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogUHJpbnRzIHRoZSB3YXJuaW5nIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5CisgKiBib290X3Byb3BlcnlfYWRkMigpLgorICovCitzdGF0aWMgdm9pZAorYm9vdF9wcm9wZXJ0eV9yYWlzZV93YXJuaW5nKCBpbnQgcmV0LCBjb25zdCBjaGFyKiAgbmFtZSwgaW50ICBuYW1lbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgdmFsdWUsIGludCAgdmFsdWVsZW4gKQoreworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgZHdhcm5pbmcoImJvb3QgcHJvcGVydHkgbmFtZSB0b28gbG9uZzogJyUuKnMnIiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZWxlbiwgbmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLTI6CisgICAgICAgIGR3YXJuaW5nKCJib290IHByb3BlcnR5IHZhbHVlIHRvbyBsb25nOiAnJS4qcyciLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZWxlbiwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIC0zOgorICAgICAgICBkd2FybmluZygiYm9vdCBwcm9wZXJ0eSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcnM6ICUuKnMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lbGVuLCBuYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitpbnQKK2Jvb3RfcHJvcGVydHlfYWRkKCBjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIHZhbHVlICkKK3sKKyAgICBpbnQgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgaW50ICB2YWx1ZWxlbiA9IHN0cmxlbih2YWx1ZSk7CisKKyAgICByZXR1cm4gYm9vdF9wcm9wZXJ0eV9hZGQyKG5hbWUsIG5hbWVsZW4sIHZhbHVlLCB2YWx1ZWxlbik7Cit9CisKKy8qIFNhdmVzIGEgc2luZ2xlIEJvb3RQcm9wZXJ0eSB0byBmaWxlLgorICovCitzdGF0aWMgaW50IGJvb3RfcHJvcGVydHlfc2F2ZV9wcm9wZXJ0eShTdHJlYW0qIGYsIEJvb3RQcm9wZXJ0eSogcCkgeworICAgIC8qIHNwbGl0IGluIGtleSBhbmQgdmFsdWUsIHNvIHdlIGNhbiByZS11c2UgYm9vdF9wcm9wZXJ0eV9hZGQgKGFuZCBpdHMKKyAgICAgKiBzYW5pdHkgY2hlY2tzKSB3aGVuIGxvYWRpbmcKKyAgICAgKi8KKworICAgIGNoYXIgKnNwbGl0ID0gc3RyY2hyKHAtPnByb3BlcnR5LCAnPScpOworICAgIGlmIChzcGxpdCA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBzYXZlIGZhaWxlZDogaWxsZWdhbCBrZXkvdmFsdWUgcGFpciBcIiVzXCIgKG1pc3NpbmcgJz0nKVxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHAtPnByb3BlcnR5KTsKKyAgICAgICAgLy8gcWVtdV9maWxlX3NldF9lcnJvcihmLCAtRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICpzcGxpdCA9ICdcMCc7ICAvKiBwLT5wcm9wZXJ0eSBpcyBub3cgIjxrZXk+XDA8dmFsdWU+XDAiICovCisKKyAgICB1aW50MzJfdCBrZXlfYnVmX2xlbiA9IChzcGxpdCAtIHAtPnByb3BlcnR5KSArIDE7IC8vICsxOiAnXDAnIHRlcm1pbmF0b3IKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwga2V5X2J1Zl9sZW4pOworICAgIHN0cmVhbV93cml0ZShmLCAodWludDhfdCopcC0+cHJvcGVydHksIGtleV9idWZfbGVuKTsKKworICAgIHVpbnQzMl90IHZhbHVlX2J1Zl9sZW4gPSBwLT5sZW5ndGggLSBrZXlfYnVmX2xlbiArIDE7IC8vICsxOiAnXDAnIHRlcm1pbmF0b3IKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgdmFsdWVfYnVmX2xlbik7CisgICAgc3RyZWFtX3dyaXRlKGYsICh1aW50OF90KilzcGxpdCArIDEsIHZhbHVlX2J1Zl9sZW4pOworCisgICAgKnNwbGl0ID0gJz0nOyAgLyogcmVzdG9yZSBwcm9wZXJ0eSB0byAiPGtleT49PHZhbHVlPlwwIiAqLworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIExvYWRzIGEgc2luZ2xlIGJvb3QgcHJvcGVydHkgZnJvbSBhIHNuYXBzaG90IGZpbGUKKyAqLworc3RhdGljIGludCBib290X3Byb3BlcnR5X2xvYWRfcHJvcGVydHkoU3RyZWFtKiBmKSB7CisgICAgaW50IHJldDsKKworICAgIC8qIGxvYWQga2V5ICovCisgICAgdWludDMyX3Qga2V5X2J1Zl9sZW4gPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgY2hhcioga2V5ID0gYW5kcm9pZF9hbGxvYyhrZXlfYnVmX2xlbik7CisgICAgaWYgKChyZXQgPSBzdHJlYW1fcmVhZChmLCAodWludDhfdCopa2V5LCBrZXlfYnVmX2xlbikgIT0KKyAgICAgICAgICAgICAgIChpbnQpa2V5X2J1Zl9sZW4pKSB7CisgICAgICAgIEQoIiVzOiBrZXkgbG9hZCBmYWlsZWQ6IGV4cGVjdGVkICVkIGJ5dGVzLCBnb3QgJWRcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBrZXlfYnVmX2xlbiwgcmV0KTsKKyAgICAgICAgZ290byBmYWlsX2tleTsKKyAgICB9CisKKyAgICAvKiBsb2FkIHZhbHVlICovCisgICAgdWludDMyX3QgdmFsdWVfYnVmX2xlbiA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBjaGFyKiB2YWx1ZSA9IGFuZHJvaWRfYWxsb2ModmFsdWVfYnVmX2xlbik7CisgICAgaWYgKChyZXQgPSBzdHJlYW1fcmVhZChmLCAodWludDhfdCopdmFsdWUsIHZhbHVlX2J1Zl9sZW4pICE9CisgICAgICAgICAgICAgICAoaW50KXZhbHVlX2J1Zl9sZW4pKSB7CisgICAgICAgIEQoIiVzOiB2YWx1ZSBsb2FkIGZhaWxlZDogZXhwZWN0ZWQgJWQgYnl0ZXMsIGdvdCAlZFxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbHVlX2J1Zl9sZW4sIHJldCk7CisgICAgICAgIGdvdG8gZmFpbF92YWx1ZTsKKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIHByb3BlcnR5ICovCisgICAgcmV0ID0gYm9vdF9wcm9wZXJ0eV9hZGQyKGtleSwga2V5X2J1Zl9sZW4gLSAxLCB2YWx1ZSwgdmFsdWVfYnVmX2xlbiAtIDEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEQoIiVzOiBsb2FkIGZhaWxlZDogY2Fubm90IGFkZCBib290IHByb3BlcnR5IChkZXRhaWxzIGZvbGxvdylcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYm9vdF9wcm9wZXJ0eV9yYWlzZV93YXJuaW5nKHJldCwga2V5LCBrZXlfYnVmX2xlbiAtIDEsIHZhbHVlLCB2YWx1ZV9idWZfbGVuIC0gMSk7CisgICAgICAgIGdvdG8gZmFpbF92YWx1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworICAgIC8qIGluIGNhc2Ugb2YgZXJyb3JzLCBjbGVhbiB1cCBiZWZvcmUgcmV0dXJuICovCisgICAgZmFpbF92YWx1ZToKKyAgICAgICAgQUZSRUUodmFsdWUpOworICAgIGZhaWxfa2V5OgorICAgICAgICBBRlJFRShrZXkpOworICAgICAgICByZXR1cm4gLUVJTzsKK30KKworLyogU2F2ZXMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYm9vdCBwcm9wZXJ0aWVzIHRvIGZpbGUKKyAqLworc3RhdGljIHZvaWQgYm9vdF9wcm9wZXJ0eV9zYXZlX2NvdW50KFN0cmVhbSogZiwgQm9vdFByb3BlcnR5KiBwKSB7CisgICAgdWludDMyX3QgcHJvcGVydHlfY291bnQgPSAwOworICAgIGZvciAoOyBwOyBwID0gcC0+bmV4dCkgeworICAgICAgICBwcm9wZXJ0eV9jb3VudCsrOworICAgIH0KKworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBwcm9wZXJ0eV9jb3VudCk7Cit9CisKKy8qIFNhdmVzIGFsbCBhdmFpbGFibGUgYm9vdCBwcm9wZXJ0aWVzIHRvIHNuYXBzaG90LgorICovCitzdGF0aWMgdm9pZCBib290X3Byb3BlcnR5X3NhdmUoU3RyZWFtKiBmLCBRZW11ZFNlcnZpY2UqIHNlcnZpY2UsIHZvaWQqIG9wYXF1ZSkgeworICAgIGJvb3RfcHJvcGVydHlfc2F2ZV9jb3VudChmLCBfYm9vdF9wcm9wZXJ0aWVzKTsKKworICAgIEJvb3RQcm9wZXJ0eSAqcCA9IF9ib290X3Byb3BlcnRpZXM7CisgICAgZm9yICggOyBwOyBwID0gcC0+bmV4dCkgeworICAgICAgICBpZiAoYm9vdF9wcm9wZXJ0eV9zYXZlX3Byb3BlcnR5KGYsIHApKSB7CisgICAgICAgICAgICBicmVhazsgIC8qIGFib3J0IG9uIGVycm9yICovCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFJlcGxhY2VzIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGJvb3QgcHJvcGVydGllcyBieSB0aG9zZSBzdG9yZWQKKyAqIGluIGEgc25hcHNob3QuCisgKi8KK3N0YXRpYyBpbnQgYm9vdF9wcm9wZXJ0eV9sb2FkKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlLCB2b2lkKiBvcGFxdWUpIHsKKyAgICBpbnQgcmV0OworCisgICAgLyogcmVtb3ZlIHByb3BlcnRpZXMgZnJvbSBvbGQgcnVuICovCisgICAgYm9vdF9wcm9wZXJ0eV9jbGVhcl9hbGwoKTsKKworICAgIC8qIGxvYWQgcHJvcGVydGllcyBmcm9tIHNuYXBzaG90ICovCisgICAgdWludDMyX3QgaSwgcHJvcGVydHlfY291bnQgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnR5X2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBib290X3Byb3BlcnR5X2xvYWRfcHJvcGVydHkoZikpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VSVklDRV9OQU1FICAiYm9vdC1wcm9wZXJ0aWVzIgorCitzdGF0aWMgdm9pZAorYm9vdF9wcm9wZXJ0eV9jbGllbnRfcmVjdiggdm9pZCogICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiAgICAgIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbXNnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqICBjbGllbnQgKQoreworICAgIC8qIHRoZSAnbGlzdCcgY29tbWFuZCBzaGFsbCBzZW5kIGFsbCBib290IHByb3BlcnRpZXMKKyAgICAgKiB0byB0aGUgY2xpZW50LCB0aGVuIGNsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIGlmIChtc2dsZW4gPT0gNCAmJiAhbWVtY21wKG1zZywgImxpc3QiLCA0KSkgeworICAgICAgICBCb290UHJvcGVydHkqICBwcm9wOworICAgICAgICBmb3IgKHByb3AgPSBfYm9vdF9wcm9wZXJ0aWVzOyBwcm9wICE9IE5VTEw7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisgICAgICAgICAgICBxZW11ZF9jbGllbnRfc2VuZChjbGllbnQsICh1aW50OF90Kilwcm9wLT5wcm9wZXJ0eSwgcHJvcC0+bGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNlbmQgYSBOVUwgdG8gc2lnbmFsIHRoZSBlbmQgb2YgdGhlIGxpc3QuICovCisgICAgICAgIHFlbXVkX2NsaWVudF9zZW5kKGNsaWVudCwgKHVpbnQ4X3QqKSIiLCAxKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogdW5rbm93biBjb21tYW5kID8gKi8KKyAgICBEKCIlczogaWdub3JpbmcgdW5rbm93biBjb21tYW5kOiAlLipzIiwgX19GVU5DVElPTl9fLCBtc2dsZW4sIG1zZyk7Cit9CisKK3N0YXRpYyBRZW11ZENsaWVudCoKK2Jvb3RfcHJvcGVydHlfc2VydmljZV9jb25uZWN0KCB2b2lkKiAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlKiAgc2VydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIGNsaWVudF9wYXJhbSApCit7CisgICAgUWVtdWRDbGllbnQqICBjbGllbnQ7CisKKyAgICBjbGllbnQgPSBxZW11ZF9jbGllbnRfbmV3KCBzZXJ2LCBjaGFubmVsLCBjbGllbnRfcGFyYW0sIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdF9wcm9wZXJ0eV9jbGllbnRfcmVjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMICk7CisKKyAgICBxZW11ZF9jbGllbnRfc2V0X2ZyYW1pbmcoY2xpZW50LCAxKTsKKyAgICByZXR1cm4gY2xpZW50OworfQorCisKK3ZvaWQKK2Jvb3RfcHJvcGVydHlfaW5pdF9zZXJ2aWNlKCB2b2lkICkKK3sKKyAgICBpZiAoIV9pbml0ZWQpIHsKKyAgICAgICAgUWVtdWRTZXJ2aWNlKiAgc2VydiA9IHFlbXVkX3NlcnZpY2VfcmVnaXN0ZXIoIFNFUlZJQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290X3Byb3BlcnR5X3NlcnZpY2VfY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfcHJvcGVydHlfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfcHJvcGVydHlfbG9hZCk7CisgICAgICAgIGlmIChzZXJ2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlcnJvcigiY291bGQgbm90IHJlZ2lzdGVyICclcycgc2VydmljZSIsIFNFUlZJQ0VfTkFNRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgRCgicmVnaXN0ZXJlZCAnJXMnIHFlbXVkIHNlcnZpY2UiLCBTRVJWSUNFX05BTUUpOworCisgICAgICAgIF9pbml0ZWQgPSAxOworICAgIH0KK30KKworCisKK3ZvaWQKK2Jvb3RfcHJvcGVydHlfcGFyc2Vfb3B0aW9uKCBjb25zdCBjaGFyKiAgcGFyYW0gKQoreworICAgIGNoYXIqIHEgPSBzdHJjaHIocGFyYW0sJz0nKTsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGNvbnN0IGNoYXIqIHZhbHVlOworICAgIGludCAgIG5hbWVsZW4sIHZhbHVlbGVuLCByZXQ7CisKKyAgICBpZiAocSA9PSBOVUxMKSB7CisgICAgICAgIGR3YXJuaW5nKCJib290IHByb3BlcnR5IG1pc3NpbmcgKD0pIHNlcGFyYXRvcjogJXMiLCBwYXJhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBuYW1lICAgID0gcGFyYW07CisgICAgbmFtZWxlbiA9IHEgLSBwYXJhbTsKKworICAgIHZhbHVlICAgID0gcSsxOworICAgIHZhbHVlbGVuID0gc3RybGVuKG5hbWUpIC0gKG5hbWVsZW4rMSk7CisKKyAgICByZXQgPSBib290X3Byb3BlcnR5X2FkZDIobmFtZSwgbmFtZWxlbiwgdmFsdWUsIHZhbHVlbGVuKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBib290X3Byb3BlcnR5X3JhaXNlX3dhcm5pbmcocmV0LCBuYW1lLCBuYW1lbGVuLCB2YWx1ZSwgdmFsdWVsZW4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ib290LXByb3BlcnRpZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ib290LXByb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2JmZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Jvb3QtcHJvcGVydGllcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvKiBNYW5hZ2UgdGhlIHNldCBvZiBib290IHN5c3RlbSBwcm9wZXJ0aWVzLgorICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgJ2Jvb3QtcHJvcGVydGllcycgc2VydmljZQorICogaW4gZG9jcy9BTkRST0lELVFFTVVELVNFUlZJQ0VTLlRYVAorICovCisKKy8qIHRoZXNlIHZhbHVlcyBnaXZlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBzeXN0ZW0gcHJvcGVydHkKKyAqIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZXkgbXVzdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyBkZWZpbml0aW9ucworICogaW4gdGhlIEFuZHJvaWQgc291cmNlIHRyZWUgKGluIHN5c3RlbS9jb3JlL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCkKKyAqLworI2RlZmluZSAgUFJPUEVSVFlfTUFYX05BTUUgICAgMzIKKyNkZWZpbmUgIFBST1BFUlRZX01BWF9WQUxVRSAgIDkyCisKKy8qIHJlY29yZCBhIG5ldyBib290IHN5c3RlbSBwcm9wZXJ0eSwgdGhpcyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlCisgKiBWTSBpcyBzdGFydGVkLiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgPCAwIG9uIGVycm9yLgorICogUG9zc2libGUgZXJyb3JzIGFyZToKKyAqIC0xIHByb3BlcnR5IG5hbWUgdG9vIGxvbmcKKyAqIC0yIHByb3BlcnR5IHZhbHVlIHRvbyBsb25nCisgKiAtMyBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gcHJvcGVydHkgbmFtZQorICovCitpbnQgIGJvb3RfcHJvcGVydHlfYWRkKCBjb25zdCBjaGFyKiAgbmFtZSwgY29uc3QgY2hhciogIHZhbHVlICk7CisKKy8qIHNhbWUgYXMgYm9vdF9wcm9wZXJ0eV9hZGQsIGJ1dCBhbGxvd3MgdG8gdXNlIG5vbi16ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAqLworaW50ICBib290X3Byb3BlcnR5X2FkZDIoIGNvbnN0IGNoYXIqICBuYW1lLCBpbnQgIG5hbWVsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHZhbHVlLCBpbnQgIHZhbHVlbGVuICk7CisKKy8qIGluaXQgdGhlIGJvb3QgcHJvcGVydHkgUUVNVUQgc2VydmljZS4gVGhpcyBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUKKyAqIHRoZSBWTSBpcyBzdGFydGVkLiBUaGlzIGlzIGFsc28gcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkgaWYgeW91IGNhbGwKKyAqIGJvb3RfcHJvcGVydHlfYWRkKCkuCisgKi8KK3ZvaWQgIGJvb3RfcHJvcGVydHlfaW5pdF9zZXJ2aWNlKCB2b2lkICk7CisKKy8qIHBhcnNlIHRoZSBwYXJhbWV0ZXIgb2YgLXByb3Agb3B0aW9ucyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICovCit2b2lkICBib290X3Byb3BlcnR5X3BhcnNlX29wdGlvbiggY29uc3QgY2hhciogIHBhcmFtICk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLWxpbnV4LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwZGEwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUtbGludXguYwpAQCAtMCwwICsxLDExMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ29udGFpbnMgY29kZSB0aGF0IGlzIHVzZWQgdG8gY2FwdHVyZSB2aWRlbyBmcmFtZXMgZnJvbSBhIGNhbWVyYSBkZXZpY2UKKyAqIG9uIExpbnV4LiBUaGlzIGNvZGUgdXNlcyBWNEwyIEFQSSB0byB3b3JrIHdpdGggY2FtZXJhIGRldmljZXMsIGFuZCByZXF1aXJlcworICogTGludXgga2VybmVsIHZlcnNpb24gYXQgbGVhc3QgMi41CisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWZvcm1hdC1jb252ZXJ0ZXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2lvLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lICBFKC4uLikgICAgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSAgVyguLi4pICAgIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSAgRCguLi4pICAgIFZFUkJPU0VfUFJJTlQoY2FtZXJhLF9fVkFfQVJHU19fKQorI2RlZmluZSAgRF9BQ1RJVkUgIFZFUkJPU0VfQ0hFQ0soY2FtZXJhKQorCisvKiB0aGUgVCguLi4pIG1hY3JvIGlzIHVzZWQgdG8gZHVtcCB0cmFmZmljICovCisjZGVmaW5lICBUX0FDVElWRSAgIDAKKworI2lmIFRfQUNUSVZFCisjZGVmaW5lICBUKC4uLikgICAgVkVSQk9TRV9QUklOVChjYW1lcmEsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgVCguLi4pICAgICgodm9pZCkwKQorI2VuZGlmCisKKyNkZWZpbmUgQ0xFQVIoeCkgbWVtc2V0ICgmKHgpLCAwLCBzaXplb2YoeCkpCisKKy8qIFBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yLgorICogSW5zdGFuY2VzIG9mIHRoaXMgZGVzY3JpcHRvciBhcmUgY3JlYXRlZCBkdXJpbmcgY2FtZXJhIGRldmljZSBlbnVtZXJhdGlvbiwgYW5kCisgKiBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBkZXNjcmliaW5nIHBpeGVsIGZvcm1hdCBjaG9zZW4gZm9yIHRoZSBjYW1lcmEKKyAqIGVtdWxhdGlvbiBpcyBzYXZlZCBieSB0aGUgY2FtZXJhIGZhY3Rvcnkgc2VydmljZSB0byByZXByZXNlbnQgYW4gZW11bGF0aW5nCisgKiBjYW1lcmEgcHJvcGVydGllcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUWVtdVBpeGVsRm9ybWF0IHsKKyAgICAvKiBQaXhlbCBmb3JtYXQgaW4gVjRMMl9QSVhfRk1UX1hYWCBmb3JtLiAqLworICAgIHVpbnQzMl90ICAgICAgICBmb3JtYXQ7CisgICAgLyogRnJhbWUgZGltZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhpcyBmb3JtYXQuICovCisgICAgQ2FtZXJhRnJhbWVEaW0qIGRpbXM7CisgICAgLyogTnVtYmVyIG9mIGZyYW1lIGRpbWVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgZm9ybWF0LiAqLworICAgIGludCAgICAgICAgICAgICBkaW1fbnVtOworfSBRZW11UGl4ZWxGb3JtYXQ7CisKKy8qIERlc2NyaWJlcyBhIGZyYW1lYnVmZmVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgQ2FtZXJhRnJhbWVCdWZmZXIgeworICAgIC8qIEZyYW1lYnVmZmVyIGRhdGEuICovCisgICAgdWludDhfdCogICAgZGF0YTsKKyAgICAvKiBGcmFtZWJ1ZmZlciBkYXRhIHNpemUuICovCisgICAgc2l6ZV90ICAgICAgc2l6ZTsKK30gQ2FtZXJhRnJhbWVCdWZmZXI7CisKKy8qIERlZmluZXMgdHlwZSBvZiB0aGUgSS9PIHVzZWQgdG8gb2J0YWluIGZyYW1lcyBmcm9tIHRoZSBkZXZpY2UuICovCit0eXBlZGVmIGVudW0gQ2FtZXJhSW9UeXBlIHsKKyAgICAvKiBGcmFtZWJ1ZmZlcnMgYXJlIHNoYXJlZCB2aWEgbWVtb3J5IG1hcHBpbmcuICovCisgICAgQ0FNRVJBX0lPX01FTU1BUCwKKyAgICAvKiBGcmFtZWJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSB2aWEgdXNlciBwb2ludGVycy4gKi8KKyAgICBDQU1FUkFfSU9fVVNFUlBUUiwKKyAgICAvKiBGcmFtZWJ1ZmZlcnMgYXJlIHRvIGJlIHJlYWQgZnJvbSB0aGUgZGV2aWNlLiAqLworICAgIENBTUVSQV9JT19ESVJFQ1QKK30gQ2FtZXJhSW9UeXBlOworCit0eXBlZGVmIHN0cnVjdCBMaW51eENhbWVyYURldmljZSBMaW51eENhbWVyYURldmljZTsKKy8qCisgKiBEZXNjcmliZXMgYSBjb25uZWN0aW9uIHRvIGFuIGFjdHVhbCBjYW1lcmEgZGV2aWNlLgorICovCitzdHJ1Y3QgTGludXhDYW1lcmFEZXZpY2UgeworICAgIC8qIENvbW1vbiBoZWFkZXIuICovCisgICAgQ2FtZXJhRGV2aWNlICAgICAgICAgICAgICAgIGhlYWRlcjsKKworICAgIC8qIENhbWVyYSBkZXZpY2UgbmFtZS4gKGRlZmF1bHQgaXMgL2Rldi92aWRlbzApICovCisgICAgY2hhciogICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lOworICAgIC8qIElucHV0IGNoYW5uZWwuIChkZWZhdWx0IGlzIDApICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2NoYW5uZWw7CisKKyAgICAvKgorICAgICAqIFNldCBieSB0aGUgZnJhbWV3b3JrIGFmdGVyIGluaXRpYWxpemluZyBjYW1lcmEgY29ubmVjdGlvbi4KKyAgICAgKi8KKworICAgIC8qIEhhbmRsZSB0byB0aGUgb3BlbmVkIGNhbWVyYSBkZXZpY2UuICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZTsKKyAgICAvKiBEZXZpY2UgY2FwYWJpbGl0aWVzLiAqLworICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgICAgICBjYXBzOworICAgIC8qIEFjdHVhbCBwaXhlbCBmb3JtYXQgcmVwb3J0ZWQgYnkgdGhlIGRldmljZSB3aGVuIGNhcHR1cmluZyBpcyBzdGFydGVkLiAqLworICAgIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgICAgICBhY3R1YWxfcGl4ZWxfZm9ybWF0OworICAgIC8qIERlZmluZXMgdHlwZSBvZiB0aGUgSS9PIHRvIHVzZSB0byByZXRyaWV2ZSBmcmFtZXMgZnJvbSB0aGUgZGV2aWNlLiAqLworICAgIENhbWVyYUlvVHlwZSAgICAgICAgICAgICAgICBpb190eXBlOworICAgIC8qIEFsbG9jYXRlZCBmcmFtZWJ1ZmZlcnMuICovCisgICAgc3RydWN0IENhbWVyYUZyYW1lQnVmZmVyKiAgIGZyYW1lYnVmZmVyczsKKyAgICAvKiBBY3R1YWwgbnVtYmVyIG9mIGFsbG9jYXRlZCBmcmFtZWJ1ZmZlcnMuICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyX251bTsKK307CisKKy8qIFByZWZlcnJlZCBwaXhlbCBmb3JtYXRzIGFycmFuZ2VkIGZyb20gdGhlIG1vc3QgdG8gdGhlIGxlYXN0IGRlc2lyZWQuCisgKgorICogTW9yZSB0aGFuIGFueXRoaW5nIGVsc2UgdGhpcyBhcnJheSBpcyBkZWZpbmVkIGJ5IGFuIGV4aXN0YW5jZSBvZiBmb3JtYXQKKyAqIGNvbnZlcnNpb24gYmV0d2VlbiB0aGUgY2FtZXJhIHN1cHBvcnRlZCBmb3JtYXRzLCBhbmQgZm9ybWF0cyB0aGF0IGFyZQorICogc3VwcG9ydGVkIGJ5IGNhbWVyYSBmcmFtZXdvcmsgaW4gdGhlIGd1ZXN0IHN5c3RlbS4gQ3VycmVudGx5LCBndWVzdCBzdXBwb3J0cworICogb25seSBZVjEyIHBpeGVsIGZvcm1hdCBmb3IgZGF0YSwgYW5kIFJHQjMyIGZvciBwcmV2aWV3LiBTbywgdGhpcyBhcnJheSBzaG91bGQKKyAqIGNvbnRhaW4gb25seSB0aG9zZSBmb3JtYXRzLCBmb3Igd2hpY2ggY29udmVydGVycyBhcmUgaW1wbGVtZW50ZWQuIEdlbmVyYWxseQorICogc3BlYWtpbmcsIHRoZSBvcmRlciBpbiB3aGljaCBlbnRyaWVzIHNob3VsZCBiZSBhcnJhbmdlZCBpbiB0aGlzIGFycmF5IG1hdHRlcnMKKyAqIG9ubHkgYXMgZmFyIGFzIGNvbnZlcnNpb24gc3BlZWQgaXMgY29uY2VybmVkLiBTbywgZm9ybWF0cyB3aXRoIHRoZSBmYXN0ZXN0CisgKiBjb252ZXJ0ZXJzIHNob3VsZCBiZSBwdXQgY2xvc2VyIHRvIHRoZSB0b3Agb2YgdGhlIGFycmF5LCB3aGlsZSBzbG93ZXIgb25lcworICogc2hvdWxkIGJlIHB1dCBjbG9zZXIgdG8gdGhlIGJvdHRvbS4gQnV0IGFzIGZhciBhcyBmdW5jdGlvbmFsaXR5IGlzIGNvbmNlcm5lZCwKKyAqIHRoZSBvcnNlciBkb2Vzbid0IG1hdHRlciwgYW5kIGFueSBmb3JtYXQgY2FuIGJlIHBsYWNlZCBhbnl3aGVyZSBpbiB0aGlzIGFycmF5LAorICogYXMgbG9uZyBhcyBjb252ZXJzaW9uIGZvciBpdCBleGlzdHMuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBfcHJlZmVycmVkX2Zvcm1hdHNbXSA9Cit7CisgICAgLyogTmF0aXZlIGZvcm1hdCBmb3IgdGhlIGVtdWxhdGVkIGNhbWVyYTogbm8gY29udmVyc2lvbiBhdCBhbGwuICovCisgICAgVjRMMl9QSVhfRk1UX1lVVjQyMCwKKyAgICBWNEwyX1BJWF9GTVRfWVZVNDIwLAorICAgIC8qIENvbnRpbnVlIHdpdGggWUNiQ3I6IGxlc3MgbWF0aCB0aGFuIHdpdGggUkdCICovCisgICAgVjRMMl9QSVhfRk1UX05WMTIsCisgICAgVjRMMl9QSVhfRk1UX05WMjEsCisgICAgVjRMMl9QSVhfRk1UX1lVWVYsCisgICAgLyogRW5kIHdpdGggUkdCLiAqLworICAgIFY0TDJfUElYX0ZNVF9SR0IzMiwKKyAgICBWNEwyX1BJWF9GTVRfUkdCMjQsCisgICAgVjRMMl9QSVhfRk1UX1JHQjU2NSwKK307CisvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBfcHJlZmVycmVkX2Zvcm1hdHMgYXJyYXkuICovCitzdGF0aWMgY29uc3QgaW50IF9wcmVmZXJyZWRfZm9ybWF0X251bSA9CisgICAgc2l6ZW9mKF9wcmVmZXJyZWRfZm9ybWF0cykvc2l6ZW9mKCpfcHJlZmVycmVkX2Zvcm1hdHMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBIZWxwZXIgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIElPQ1RMIHdyYXBwZXIuICovCitzdGF0aWMgaW50CitfeGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QsIHZvaWQgKmFyZykgeworICAgIHJldHVybiBIQU5ETEVfRUlOVFIoaW9jdGwoZmQsIHJlcXVlc3QsIGFyZykpOworfQorCisvKiBGcmVlcyByZXNvdXJjZSBhbGxvY2F0ZWQgZm9yIFFlbXVQaXhlbEZvcm1hdCBpbnN0YW5jZSwgZXhjbHVkaW5nIHRoZSBpbnN0YW5jZQorICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZCBfcWVtdV9waXhlbF9mb3JtYXRfZnJlZShRZW11UGl4ZWxGb3JtYXQqIGZtdCkKK3sKKyAgICBpZiAoZm10ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGZtdC0+ZGltcyAhPSBOVUxMKQorICAgICAgICAgICAgZnJlZShmbXQtPmRpbXMpOworICAgIH0KK30KKworLyogUmV0dXJucyBhbiBpbmRleCBvZiB0aGUgZ2l2ZW4gcGl4ZWwgZm9ybWF0IGluIGFuIGFycmF5IGNvbnRhaW5pbmcgcGl4ZWwKKyAqIGZvcm1hdCBkZXNjcmlwdG9ycy4KKyAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNob29zZSBhIHBpeGVsIGZvcm1hdCBmb3IgYSBjYW1lcmEgZGV2aWNlLiBUaGUgaWRlYQorICogaXMgdGhhdCB3aGVuIHRoZSBjYW1lcmEgc2VydmljZSBlbnVtZXJhdGVzIGFsbCBwaXhlbCBmb3JtYXRzIGZvciBhbGwgY2FtZXJhcworICogY29ubmVjdGVkIHRvIHRoZSBob3N0LCB3ZSBuZWVkIHRvIGNob29zZSBqdXN0IG9uZSwgd2hpY2ggd291bGQgYmUgbW9zdAorICogYXBwcm9wcmlhdGUgZm9yIGNhbWVyYSBlbXVsYXRpb24uIFRvIGRvIHRoYXQsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIHJ1bgorICogZm9ybWF0cywgY29udGFpbmVkIGluIF9wcmVmZXJyZWRfZm9ybWF0cyBhcnJheSBhZ2FpbnN0IGVudW1lcmF0ZWQgcGl4ZWwKKyAqIGZvcm1hdHMgdG8gcGljayB0aGUgZmlyc3QgZm9ybWF0IHRoYXQgbWF0Y2guCisgKiBQYXJhbToKKyAqICBmbXQgLSBQaXhlbCBmb3JtYXQsIGZvciB3aGljaCB0byBvYnRhaW4gdGhlIGluZGV4LgorICogIGZvcm1hdHMgLSBBcnJheSBjb250YWluaW5nIGxpc3Qgb2YgcGl4ZWwgZm9ybWF0cywgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKKyAqICAgICAgZGV2aWNlLgorICogIHNpemUgLSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICdmb3JtYXRzJyBhcnJheS4KKyAqIFJldHVybjoKKyAqICBJbmRleCBvZiB0aGUgbWF0Y2hlZCBlbnRyeSBpbiB0aGUgYXJyYXksIG9yIC0xIGlmIG5vIGVudHJ5IGhhcyBiZWVuIGZvdW5kLgorICovCitzdGF0aWMgaW50CitfZ2V0X2Zvcm1hdF9pbmRleCh1aW50MzJfdCBmbXQsIFFlbXVQaXhlbEZvcm1hdCogZm9ybWF0cywgaW50IHNpemUpCit7CisgICAgaW50IGY7CisgICAgZm9yIChmID0gMDsgZiA8IHNpemUgJiYgZm9ybWF0c1tmXS5mb3JtYXQgIT0gZm10OyBmKyspOworICAgIHJldHVybiBmIDwgc2l6ZSA/IGYgOiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRnJhbWVCdWZmZXIgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZyZWVzIGFycmF5IG9mIGZyYW1lYnVmZmVycywgZGVwZW5kaW5nIG9uIHRoZSBJL08gbWV0aG9kIHRoZSBhcnJheSBoYXMgYmVlbgorICogaW5pdGlhbGl6ZWQgZm9yLgorICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBkb2Vzbid0IGZyZWVzIHRoZSBhcnJheSBpdHNlbGYuCisgKiBQYXJhbToKKyAqICBmYiwgbnVtIC0gQXJyYXkgZGF0YSwgYW5kIGl0cyBzaXplLgorICogIGlvX3R5cGUgLSBUeXBlIG9mIHRoZSBJL08gdGhlIGFycmF5IGhhcyBiZWVuIGluaXRpYWxpemVkIGZvci4KKyAqLworc3RhdGljIHZvaWQKK19mcmVlX2ZyYW1lYnVmZmVycyhDYW1lcmFGcmFtZUJ1ZmZlciogZmIsIGludCBudW0sIENhbWVyYUlvVHlwZSBpb190eXBlKQoreworICAgIGlmIChmYiAhPSBOVUxMKSB7CisgICAgICAgIGludCBuOworCisgICAgICAgIHN3aXRjaCAoaW9fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfSU9fTUVNTUFQOgorICAgICAgICAgICAgICAgIC8qIFVubWFwIGZyYW1lYnVmZmVycy4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbnVtOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZiW25dLmRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXVubWFwKGZiW25dLmRhdGEsIGZiW25dLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZmJbbl0uZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBmYltuXS5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDQU1FUkFfSU9fVVNFUlBUUjoKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0lPX0RJUkVDVDoKKyAgICAgICAgICAgICAgICAvKiBGcmVlIGZyYW1lYnVmZmVycy4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbnVtOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZiW25dLmRhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmYltuXS5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZiW25dLmRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgZmJbbl0uc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRSgiJXM6IEludmFsaWQgSS9PIHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIGlvX3R5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2Ugcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFsbG9jYXRlcyBhbiBpbnN0YW5jZSBvZiBMaW51eENhbWVyYURldmljZSBzdHJ1Y3R1cmUuCisgKiBSZXR1cm46CisgKiAgQWxsb2NhdGVkIGluc3RhbmNlIG9mIExpbnV4Q2FtZXJhRGV2aWNlIHN0cnVjdHVyZS4gTm90ZSB0aGF0IHRoaXMgcm91dGluZQorICogIGFsc28gc2V0cyAnb3BhcXVlJyBmaWVsZCBpbiB0aGUgJ2hlYWRlcicgc3RydWN0dXJlIHRvIHBvaW50IGJhY2sgdG8gdGhlCisgKiAgY29udGFpbmluZyBMaW51eENhbWVyYURldmljZSBpbnN0YW5jZS4KKyAqLworc3RhdGljIExpbnV4Q2FtZXJhRGV2aWNlKgorX2NhbWVyYV9kZXZpY2VfYWxsb2Modm9pZCkKK3sKKyAgICBMaW51eENhbWVyYURldmljZSogY2Q7CisKKyAgICBBTkVXMChjZCk7CisgICAgbWVtc2V0KGNkLCAwLCBzaXplb2YoKmNkKSk7CisgICAgY2QtPmhlYWRlci5vcGFxdWUgPSBjZDsKKyAgICBjZC0+aGFuZGxlID0gLTE7CisKKyAgICByZXR1cm4gY2Q7Cit9CisKKy8qIFVuaW5pdGlhbGl6ZXMgYW5kIGZyZWVzIENhbWVyYURldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2RldmljZV9mcmVlKExpbnV4Q2FtZXJhRGV2aWNlKiBsY2QpCit7CisgICAgaWYgKGxjZCAhPSBOVUxMKSB7CisgICAgICAgIC8qIENsb3NpbmcgaGFuZGxlIHdpbGwgYWxzbyBkaXNjb25uZWN0IGZyb20gdGhlIGRyaXZlci4gKi8KKyAgICAgICAgaWYgKGxjZC0+aGFuZGxlID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGxjZC0+aGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGNkLT5kZXZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGxjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChsY2QtPmZyYW1lYnVmZmVycyAhPSBOVUxMKSB7CisgICAgICAgICAgICBfZnJlZV9mcmFtZWJ1ZmZlcnMobGNkLT5mcmFtZWJ1ZmZlcnMsIGxjZC0+ZnJhbWVidWZmZXJfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjZC0+aW9fdHlwZSk7CisgICAgICAgICAgICBmcmVlKGxjZC0+ZnJhbWVidWZmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBBRlJFRShsY2QpOworICAgIH0gZWxzZSB7CisgICAgICAgIEUoIiVzOiBObyBkZXNjcmlwdG9yIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKKy8qIFJlc2V0cyBjYW1lcmEgZGV2aWNlIGFmdGVyIGNhcHR1cmluZy4KKyAqIFNpbmNlIG5ldyBjYXB0dXJlIHJlcXVlc3QgbWF5IHJlcXVpcmUgZGlmZmVyZW50IGZyYW1lIGRpbWVuc2lvbnMgd2UgbXVzdAorICogcmVzZXQgY2FtZXJhIGRldmljZSBieSByZW9wZW5pbmcgaXRzIGhhbmRsZS4gT3RoZXJ3aXNlIGF0dGVtcHRzIHRvIHNldCB1cCBuZXcKKyAqIGZyYW1lIHByb3BlcnRpZXMgKGRpZmZlcmVudCBmcm9tIHRoZSBwcmV2aW91cyBvbmUpIG1heSBmYWlsLiAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfZGV2aWNlX3Jlc2V0KExpbnV4Q2FtZXJhRGV2aWNlKiBjZCkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwIGNyb3BjYXA7CisgICAgc3RydWN0IHY0bDJfY3JvcCBjcm9wOworCisgICAgLyogRnJlZSBjYXB0dXJpbmcgZnJhbWVidWZmZXJzIGZpcnN0LiAqLworICAgIGlmIChjZC0+ZnJhbWVidWZmZXJzICE9IE5VTEwpIHsKKyAgICAgICAgX2ZyZWVfZnJhbWVidWZmZXJzKGNkLT5mcmFtZWJ1ZmZlcnMsIGNkLT5mcmFtZWJ1ZmZlcl9udW0sIGNkLT5pb190eXBlKTsKKyAgICAgICAgZnJlZShjZC0+ZnJhbWVidWZmZXJzKTsKKyAgICAgICAgY2QtPmZyYW1lYnVmZmVycyA9IE5VTEw7CisgICAgICAgIGNkLT5mcmFtZWJ1ZmZlcl9udW0gPSAwOworICAgIH0KKworICAgIC8qIFJlc2V0IGRldmljZSBoYW5kbGUuICovCisgICAgY2xvc2UoY2QtPmhhbmRsZSk7CisgICAgY2QtPmhhbmRsZSA9IG9wZW4oY2QtPmRldmljZV9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKworICAgIGlmIChjZC0+aGFuZGxlID49IDApIHsKKyAgICAgICAgLyogU2VsZWN0IHZpZGVvIGlucHV0LCB2aWRlbyBzdGFuZGFyZCBhbmQgdHVuZSBoZXJlLiAqLworICAgICAgICBjcm9wY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgIF94aW9jdGwoY2QtPmhhbmRsZSwgVklESU9DX0NST1BDQVAsICZjcm9wY2FwKTsKKyAgICAgICAgY3JvcC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgICBjcm9wLmMgPSBjcm9wY2FwLmRlZnJlY3Q7IC8qIHJlc2V0IHRvIGRlZmF1bHQgKi8KKyAgICAgICAgX3hpb2N0bCAoY2QtPmhhbmRsZSwgVklESU9DX1NfQ1JPUCwgJmNyb3ApOworICAgIH0KK30KKworLyogTWVtb3J5IG1hcHMgYnVmZmVycyBhbmQgc2hhcmVzIG1hcHBlZCBtZW1vcnkgd2l0aCB0aGUgZGV2aWNlLgorICogUmV0dXJuOgorICogIDAgRnJhbWVidWZmZXJzIGhhdmUgYmVlbiBtYXBwZWQuCisgKiAgLTEgQSBjcml0aWNhbCBlcnJvciBoYXMgb2N1cnJlZC4KKyAqICAxIE1lbW9yeSBtYXBwaW5nIGlzIG5vdCBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQKK19jYW1lcmFfZGV2aWNlX21tYXBfZnJhbWVidWZmZXIoTGludXhDYW1lcmFEZXZpY2UqIGNkKQoreworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKKyAgICBDTEVBUihyZXEpOworICAgIHJlcS5jb3VudCAgID0gNDsKKyAgICByZXEudHlwZSAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICByZXEubWVtb3J5ICA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICAvKiBSZXF1ZXN0IG1lbW9yeSBtYXBwZWQgYnVmZmVycy4gTm90ZSB0aGF0IGRldmljZSBjYW4gcmV0dXJuIGxlc3MgYnVmZmVycworICAgICAqIHRoYW4gcmVxdWVzdGVkLiAqLworICAgIGlmKF94aW9jdGwoY2QtPmhhbmRsZSwgVklESU9DX1JFUUJVRlMsICZyZXEpKSB7CisgICAgICAgIGlmIChFSU5WQUwgPT0gZXJybm8pIHsKKyAgICAgICAgICAgIEQoIiVzOiBEZXZpY2UgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IG1lbW9yeSBtYXBwaW5nIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFKCIlczogVklESU9DX1JFUUJVRlMgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBmcmFtZWJ1ZmZlciBhcnJheS4gKi8KKyAgICBjZC0+ZnJhbWVidWZmZXJzID0gY2FsbG9jKHJlcS5jb3VudCwgc2l6ZW9mKENhbWVyYUZyYW1lQnVmZmVyKSk7CisgICAgaWYgKGNkLT5mcmFtZWJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXIgYXJyYXkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogTWFwIGV2ZXJ5IGZyYW1lYnVmZmVyIHRvIHRoZSBzaGFyZWQgbWVtb3J5LCBhbmQgcXVldWUgaXQKKyAgICAgKiB3aXRoIHRoZSBkZXZpY2UuICovCisgICAgZm9yKGNkLT5mcmFtZWJ1ZmZlcl9udW0gPSAwOyBjZC0+ZnJhbWVidWZmZXJfbnVtIDwgcmVxLmNvdW50OworICAgICAgICBjZC0+ZnJhbWVidWZmZXJfbnVtKyspIHsKKyAgICAgICAgLyogTWFwIGZyYW1lYnVmZmVyLiAqLworICAgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOworICAgICAgICBDTEVBUihidWYpOworICAgICAgICBidWYudHlwZSAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICAgICAgYnVmLm1lbW9yeSAgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBidWYuaW5kZXggICA9IGNkLT5mcmFtZWJ1ZmZlcl9udW07CisgICAgICAgIGlmKF94aW9jdGwoY2QtPmhhbmRsZSwgVklESU9DX1FVRVJZQlVGLCAmYnVmKSA8IDApIHsKKyAgICAgICAgICAgIEUoIiVzOiBWSURJT0NfUVVFUllCVUYgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5zaXplID0gYnVmLmxlbmd0aDsKKyAgICAgICAgY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5kYXRhID0KKyAgICAgICAgICAgIG1tYXAoTlVMTCwgYnVmLmxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgY2QtPmhhbmRsZSwgYnVmLm0ub2Zmc2V0KTsKKyAgICAgICAgaWYgKE1BUF9GQUlMRUQgPT0gY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5kYXRhKSB7CisgICAgICAgICAgICBFKCIlczogTWVtb3J5IG1hcHBpbmcgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKiBRdWV1ZSB0aGUgbWFwcGVkIGJ1ZmZlci4gKi8KKyAgICAgICAgQ0xFQVIoYnVmKTsKKyAgICAgICAgYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgIGJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworICAgICAgICBidWYuaW5kZXggPSBjZC0+ZnJhbWVidWZmZXJfbnVtOworICAgICAgICBpZiAoX3hpb2N0bChjZC0+aGFuZGxlLCBWSURJT0NfUUJVRiwgJmJ1ZikgPCAwKSB7CisgICAgICAgICAgICBFKCIlczogVklESU9DX1FCVUYgaGFzIGZhaWxlZDogJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjZC0+aW9fdHlwZSA9IENBTUVSQV9JT19NRU1NQVA7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogQWxsb2NhdGVzIGZyYW1lIGJ1ZmZlcnMgYW5kIHJlZ2lzdGVycyB0aGVtIHdpdGggdGhlIGRldmljZS4KKyAqIFJldHVybjoKKyAqICAwIEZyYW1lYnVmZmVycyBoYXZlIGJlZW4gbWFwcGVkLgorICogIC0xIEEgY3JpdGljYWwgZXJyb3IgaGFzIG9jdXJyZWQuCisgKiAgMSBEZXZpY2UgZG9lc24ndCBzdXBwb3J0IHVzZXIgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBpbnQKK19jYW1lcmFfZGV2aWNlX3VzZXJfZnJhbWVidWZmZXIoTGludXhDYW1lcmFEZXZpY2UqIGNkKQoreworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKKyAgICBDTEVBUiAocmVxKTsKKyAgICByZXEuY291bnQgICA9IDQ7CisgICAgcmVxLnR5cGUgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgcmVxLm1lbW9yeSAgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworCisgICAgLyogUmVxdWVzdCB1c2VyIGJ1ZmZlcnMuIE5vdGUgdGhhdCBkZXZpY2UgY2FuIHJldHVybiBsZXNzIGJ1ZmZlcnMKKyAgICAgKiB0aGFuIHJlcXVlc3RlZC4gKi8KKyAgICBpZihfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19SRVFCVUZTLCAmcmVxKSkgeworICAgICAgICBpZiAoRUlOVkFMID09IGVycm5vKSB7CisgICAgICAgICAgICBEKCIlczogRGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCB1c2VyIHBvaW50ZXJzIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFKCIlczogVklESU9DX1JFUUJVRlMgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBmcmFtZWJ1ZmZlciBhcnJheS4gKi8KKyAgICBjZC0+ZnJhbWVidWZmZXJzID0gY2FsbG9jKHJlcS5jb3VudCwgc2l6ZW9mKENhbWVyYUZyYW1lQnVmZmVyKSk7CisgICAgaWYgKGNkLT5mcmFtZWJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXIgYXJyYXkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgYnVmZmVycywgcXVldWVpbmcgdGhlbSB3aXQgdGhlIGRldmljZSBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgZm9yKGNkLT5mcmFtZWJ1ZmZlcl9udW0gPSAwOyBjZC0+ZnJhbWVidWZmZXJfbnVtIDwgcmVxLmNvdW50OworICAgICAgICBjZC0+ZnJhbWVidWZmZXJfbnVtKyspIHsKKyAgICAgICAgY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5zaXplID0KKyAgICAgICAgICAgIGNkLT5hY3R1YWxfcGl4ZWxfZm9ybWF0LnNpemVpbWFnZTsKKyAgICAgICAgY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5kYXRhID0KKyAgICAgICAgICAgIG1hbGxvYyhjZC0+ZnJhbWVidWZmZXJzW2NkLT5mcmFtZWJ1ZmZlcl9udW1dLnNpemUpOworICAgICAgICBpZiAoY2QtPmZyYW1lYnVmZmVyc1tjZC0+ZnJhbWVidWZmZXJfbnVtXS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEUoIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvKiBRdWV1ZSB0aGUgdXNlciBidWZmZXIuICovCisgICAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgICAgIENMRUFSKGJ1Zik7CisgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgICBidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICAgICAgYnVmLm0udXNlcnB0ciA9ICh1bnNpZ25lZCBsb25nKWNkLT5mcmFtZWJ1ZmZlcnNbY2QtPmZyYW1lYnVmZmVyX251bV0uZGF0YTsKKyAgICAgICAgYnVmLmxlbmd0aCA9IGNkLT5mcmFtZWJ1ZmZlcnNbY2QtPmZyYW1lYnVmZmVyX251bV0uc2l6ZTsKKyAgICAgICAgaWYgKF94aW9jdGwoY2QtPmhhbmRsZSwgVklESU9DX1FCVUYsICZidWYpIDwgMCkgeworICAgICAgICAgICAgRSgiJXM6IFZJRElPQ19RQlVGIGhhcyBmYWlsZWQ6ICVzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgY2QtPmlvX3R5cGUgPSBDQU1FUkFfSU9fVVNFUlBUUjsKKworICAgIHJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBmcmFtZSBidWZmZXIgZm9yIGRpcmVjdCByZWFkIGZyb20gdGhlIGRldmljZS4KKyAqIFJldHVybjoKKyAqICAwIEZyYW1lYnVmZmVycyBoYXZlIGJlZW4gbWFwcGVkLgorICogIC0xIEEgY3JpdGljYWwgZXJyb3IgaGFzIG9jdXJyZWQuCisgKiAgMSBNZW1vcnkgbWFwcGluZyBpcyBub3QgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50CitfY2FtZXJhX2RldmljZV9kaXJlY3RfZnJhbWVidWZmZXIoTGludXhDYW1lcmFEZXZpY2UqIGNkKQoreworICAgIC8qIEFsbG9jYXRlIGZyYW1lYnVmZmVyIGFycmF5LiAqLworICAgIGNkLT5mcmFtZWJ1ZmZlcl9udW0gPSAxOworICAgIGNkLT5mcmFtZWJ1ZmZlcnMgPSBtYWxsb2Moc2l6ZW9mKENhbWVyYUZyYW1lQnVmZmVyKSk7CisgICAgaWYgKGNkLT5mcmFtZWJ1ZmZlcnMgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXIgYXJyYXkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2QtPmZyYW1lYnVmZmVyc1swXS5zaXplID0gY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQuc2l6ZWltYWdlOworICAgIGNkLT5mcmFtZWJ1ZmZlcnNbMF0uZGF0YSA9IG1hbGxvYyhjZC0+ZnJhbWVidWZmZXJzWzBdLnNpemUpOworICAgIGlmIChjZC0+ZnJhbWVidWZmZXJzWzBdLmRhdGEgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZnJhbWVidWZmZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2QtPmlvX3R5cGUgPSBDQU1FUkFfSU9fRElSRUNUOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE9wZW5zIGNhbWVyYSBkZXZpY2UuCisgKiBQYXJhbToKKyAqICBjZCAtIENhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciB0byBvcGVuIHRoZSBjYW1lcmEgZm9yLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2VzcywgIT0gMCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50CitfY2FtZXJhX2RldmljZV9vcGVuKExpbnV4Q2FtZXJhRGV2aWNlKiBjZCkKK3sKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKworICAgIGlmIChhbmRyb2lkX3N0YXQoY2QtPmRldmljZV9uYW1lLCAmc3QpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgRSgiJXM6ICclcycgaXMgbm90IGEgZGV2aWNlIiwgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogT3BlbiBoYW5kbGUgdG8gdGhlIGRldmljZSwgYW5kIHF1ZXJ5IGRldmljZSBjYXBhYmlsaXRpZXMuICovCisgICAgY2QtPmhhbmRsZSA9IG9wZW4oY2QtPmRldmljZV9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAoY2QtPmhhbmRsZSA8IDApIHsKKyAgICAgICAgRSgiJXM6IENhbm5vdCBvcGVuIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2QtPmRldmljZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19RVUVSWUNBUCwgJmNkLT5jYXBzKSA8IDApIHsKKyAgICAgICAgaWYgKEVJTlZBTCA9PSBlcnJubykgeworICAgICAgICAgICAgRSgiJXM6IENhbWVyYSAnJXMnIGlzIG5vdCBhIFY0TDIgZGV2aWNlIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgY2xvc2UoY2QtPmhhbmRsZSk7CisgICAgICAgICAgICBjZC0+aGFuZGxlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNhcGFiaWxpdGllcyBmb3IgY2FtZXJhIGRldmljZSAnJXMnIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgY2xvc2UoY2QtPmhhbmRsZSk7CisgICAgICAgICAgICBjZC0+aGFuZGxlID0gLTE7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBjYW1lcmEgc3VwcG9ydHMgbWluaW1hbCByZXF1aXJlbWVudHMuICovCisgICAgaWYgKCEoY2QtPmNhcHMuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkpIHsKKyAgICAgICAgRSgiJXM6IENhbWVyYSAnJXMnIGlzIG5vdCBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNkLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIGNsb3NlKGNkLT5oYW5kbGUpOworICAgICAgICBjZC0+aGFuZGxlID0gLTE7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRW51bWVyYXRlcyBmcmFtZSBzaXplcyBmb3IgdGhlIGdpdmVuIHBpeGVsIGZvcm1hdC4KKyAqIFBhcmFtOgorICogIGNkIC0gT3BlbmVkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvci4KKyAqICBmbXQgLSBQaXhlbCBmb3JtYXQgdG8gZW51bSBmcmFtZSBzaXplcyBmb3IuCisgKiAgc2l6ZXMgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIGZyYW1lIHNpemVzLiBUaGUgc2l6ZSBvZgorICogICAgICB0aGUgYXJyYXkgaXMgZGVmaW5lZCBieSB0aGUgdmFsdWUsIHJldHVybmVkIGZyb20gdGhpcyByb3V0aW5lLiBUaGUgY2FsbGVyCisgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgYXJyYXkuCisgKiBSZXR1cm46CisgKiAgT24gc3VjY2VzcyByZXR1cm5zIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAnc2l6ZXMnIGFycmF5LiBPbiBmYWlsdXJlIHJldHVybnMKKyAqICBhIG5lZ2F0aXZlIHZhbHVlLgorICovCitzdGF0aWMgaW50CitfY2FtZXJhX2RldmljZV9lbnVtX2Zvcm1hdF9zaXplcyhMaW51eENhbWVyYURldmljZSogY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFGcmFtZURpbSoqIHNpemVzKQoreworICAgIGludCBuOworICAgIGludCBzaXplc19udW0gPSAwOworICAgIGludCBvdXRfbnVtID0gMDsKKyAgICBzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSBzaXplX2VudW07CisgICAgQ2FtZXJhRnJhbWVEaW0qIGFycjsKKworICAgIC8qIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3VwcG9ydGVkIHNpemVzIGZvciB0aGUgZ2l2ZW4gZm9ybWF0LiAqLworICAgIGZvciAobiA9IDA7IDsgbisrKSB7CisgICAgICAgIHNpemVfZW51bS5pbmRleCA9IG47CisgICAgICAgIHNpemVfZW51bS5waXhlbF9mb3JtYXQgPSBmbXQ7CisgICAgICAgIGlmKF94aW9jdGwoY2QtPmhhbmRsZSwgVklESU9DX0VOVU1fRlJBTUVTSVpFUywgJnNpemVfZW51bSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplX2VudW0udHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURSkgeworICAgICAgICAgICAgLyogU2l6ZSBpcyBpbiB0aGUgc2ltcGUgd2lkdGgsIGhlaWdodCBmb3JtLiAqLworICAgICAgICAgICAgc2l6ZXNfbnVtKys7CisgICAgICAgIH0gZWxzZSBpZiAoc2l6ZV9lbnVtLnR5cGUgPT0gVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0UpIHsKKyAgICAgICAgICAgIC8qIFNpemVzIGFyZSByZXByZXNlbnRlZCBhcyBtaW4vbWF4IHdpZHRoIGFuZCBoZWlnaHQgd2l0aCBhIHN0ZXAgZm9yCisgICAgICAgICAgICAgKiBlYWNoIGRpbWVuc2lvbi4gU2luY2UgYXQgdGhlIGVuZCB3ZSB3YW50IHRvIGxpc3QgZWFjaCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAqIHNpemUgaW4gdGhlIGFycmF5ICh0aGF0J3MgdGhlIG9ubHkgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgZ3Vlc3QKKyAgICAgICAgICAgICAqIGNhbWVyYSBmcmFtZXdvcmspLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBob3cgbWFueSBhcnJheSBlbnRyaWVzCisgICAgICAgICAgICAgKiB0aGlzIHdpbGwgZ2VuZXJhdGUuICovCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkaWZfd2lkdGhzID0KKyAgICAgICAgICAgICAgICAoc2l6ZV9lbnVtLnN0ZXB3aXNlLm1heF93aWR0aCAtIHNpemVfZW51bS5zdGVwd2lzZS5taW5fd2lkdGgpIC8KKyAgICAgICAgICAgICAgICBzaXplX2VudW0uc3RlcHdpc2Uuc3RlcF93aWR0aCArIDE7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBkaWZfaGVpZ2h0cyA9CisgICAgICAgICAgICAgICAgKHNpemVfZW51bS5zdGVwd2lzZS5tYXhfaGVpZ2h0IC0gc2l6ZV9lbnVtLnN0ZXB3aXNlLm1pbl9oZWlnaHQpIC8KKyAgICAgICAgICAgICAgICBzaXplX2VudW0uc3RlcHdpc2Uuc3RlcF9oZWlnaHQgKyAxOworICAgICAgICAgICAgc2l6ZXNfbnVtICs9IGRpZl93aWR0aHMgKiBkaWZfaGVpZ2h0czsKKyAgICAgICAgfSBlbHNlIGlmIChzaXplX2VudW0udHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTKSB7CisgICAgICAgICAgICAvKiBTcGVjaWFsIHN0ZXB3aXNlIGNhc2UsIHdoZW4gc3RlcHMgYXJlIHNldCB0byAxLiBXZSBzdGlsbCBuZWVkIHRvCisgICAgICAgICAgICAgKiBmbGF0dGVuIHRoaXMgZm9yIHRoZSBndWVzdCwgYnV0IHRoZSBhcnJheSBtYXkgYmUgdG9vIGJpZy4KKyAgICAgICAgICAgICAqIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBuZWVkIHRvIGJlIGZhbmN5LCBzbyB0aHJlZSBzaXplcyB3b3VsZCBiZQorICAgICAgICAgICAgICogc3VmZmljaWVudCBoZXJlOiBtaW4sIG1heCwgYW5kIG9uZSBpbiB0aGUgbWlkZGxlLiAqLworICAgICAgICAgICAgc2l6ZXNfbnVtICs9IDM7CisgICAgICAgIH0KKworICAgIH0KKyAgICBpZiAoc2l6ZXNfbnVtID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUsIGFuZCBpbml0aWFsaXplIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgZW50cmllcy4gKi8KKyAgICAqc2l6ZXMgPSAoQ2FtZXJhRnJhbWVEaW0qKW1hbGxvYyhzaXplc19udW0gKiBzaXplb2YoQ2FtZXJhRnJhbWVEaW0pKTsKKyAgICBpZiAoKnNpemVzID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFyciA9ICpzaXplczsKKyAgICBmb3IgKG4gPSAwOyBvdXRfbnVtIDwgc2l6ZXNfbnVtOyBuKyspIHsKKyAgICAgICAgc2l6ZV9lbnVtLmluZGV4ID0gbjsKKyAgICAgICAgc2l6ZV9lbnVtLnBpeGVsX2Zvcm1hdCA9IGZtdDsKKyAgICAgICAgaWYoX3hpb2N0bChjZC0+aGFuZGxlLCBWSURJT0NfRU5VTV9GUkFNRVNJWkVTLCAmc2l6ZV9lbnVtKSkgeworICAgICAgICAgICAgLyogRXJyb3JzIGFyZSBub3Qgd2VsY29tZSBoZXJlIGFueW1vcmUuICovCisgICAgICAgICAgICBFKCIlczogVW5leHBlY3RlZCBmYWlsdXJlIHdoaWxlIGdldHRpbmcgcGl4ZWwgZGltZW5zaW9uczogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBmcmVlKGFycik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2l6ZV9lbnVtLnR5cGUgPT0gVjRMMl9GUk1TSVpFX1RZUEVfRElTQ1JFVEUpIHsKKyAgICAgICAgICAgIGFycltvdXRfbnVtXS53aWR0aCA9IHNpemVfZW51bS5kaXNjcmV0ZS53aWR0aDsKKyAgICAgICAgICAgIGFycltvdXRfbnVtXS5oZWlnaHQgPSBzaXplX2VudW0uZGlzY3JldGUuaGVpZ2h0OworICAgICAgICAgICAgb3V0X251bSsrOworICAgICAgICB9IGVsc2UgaWYgKHNpemVfZW51bS50eXBlID09IFY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFKSB7CisgICAgICAgICAgICB1aW50MzJfdCB3OworICAgICAgICAgICAgZm9yICh3ID0gc2l6ZV9lbnVtLnN0ZXB3aXNlLm1pbl93aWR0aDsKKyAgICAgICAgICAgICAgICAgdyA8PSBzaXplX2VudW0uc3RlcHdpc2UubWF4X3dpZHRoOworICAgICAgICAgICAgICAgICB3ICs9IHNpemVfZW51bS5zdGVwd2lzZS5zdGVwX3dpZHRoKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaDsKKyAgICAgICAgICAgICAgICBmb3IgKGggPSBzaXplX2VudW0uc3RlcHdpc2UubWluX2hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgIGggPD0gc2l6ZV9lbnVtLnN0ZXB3aXNlLm1heF9oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICBoICs9IHNpemVfZW51bS5zdGVwd2lzZS5zdGVwX2hlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBhcnJbb3V0X251bV0ud2lkdGggPSB3OworICAgICAgICAgICAgICAgICAgICBhcnJbb3V0X251bV0uaGVpZ2h0ID0gaDsKKyAgICAgICAgICAgICAgICAgICAgb3V0X251bSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzaXplX2VudW0udHlwZSA9PSBWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTKSB7CisgICAgICAgICAgICAvKiBtaW4gKi8KKyAgICAgICAgICAgIGFycltvdXRfbnVtXS53aWR0aCA9IHNpemVfZW51bS5zdGVwd2lzZS5taW5fd2lkdGg7CisgICAgICAgICAgICBhcnJbb3V0X251bV0uaGVpZ2h0ID0gc2l6ZV9lbnVtLnN0ZXB3aXNlLm1pbl9oZWlnaHQ7CisgICAgICAgICAgICBvdXRfbnVtKys7CisgICAgICAgICAgICAvKiBvbmUgaW4gdGhlIG1pZGRsZSAqLworICAgICAgICAgICAgYXJyW291dF9udW1dLndpZHRoID0KKyAgICAgICAgICAgICAgICAoc2l6ZV9lbnVtLnN0ZXB3aXNlLm1pbl93aWR0aCArIHNpemVfZW51bS5zdGVwd2lzZS5tYXhfd2lkdGgpIC8gMjsKKyAgICAgICAgICAgIGFycltvdXRfbnVtXS5oZWlnaHQgPQorICAgICAgICAgICAgICAgIChzaXplX2VudW0uc3RlcHdpc2UubWluX2hlaWdodCArIHNpemVfZW51bS5zdGVwd2lzZS5tYXhfaGVpZ2h0KSAvIDI7CisgICAgICAgICAgICBvdXRfbnVtKys7CisgICAgICAgICAgICAvKiBtYXggKi8KKyAgICAgICAgICAgIGFycltvdXRfbnVtXS53aWR0aCA9IHNpemVfZW51bS5zdGVwd2lzZS5tYXhfd2lkdGg7CisgICAgICAgICAgICBhcnJbb3V0X251bV0uaGVpZ2h0ID0gc2l6ZV9lbnVtLnN0ZXB3aXNlLm1heF9oZWlnaHQ7CisgICAgICAgICAgICBvdXRfbnVtKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0X251bTsKK30KKworLyogRW51bWVyYXRlcyBwaXhlbCBmb3JtYXRzLCBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4KKyAqIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgd2lsbCBlbnVtZXJhdGUgb25seSByYXcgKHVuY29tcHJlc3NlZCkgZm9ybWF0cy4KKyAqIFBhcmFtOgorICogIGNkIC0gT3BlbmVkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvci4KKyAqICBmbXRzIC0gVXBvbiBzdWNjZXNzIGNvbnRhaW5zIGFuIGFycmF5IG9mIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzLiBUaGUgc2l6ZSBvZgorICogICAgICB0aGUgYXJyYXkgaXMgZGVmaW5lZCBieSB0aGUgdmFsdWUsIHJldHVybmVkIGZyb20gdGhpcyByb3V0aW5lLiBUaGUgY2FsbGVyCisgKiAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgYXJyYXkuCisgKiBSZXR1cm46CisgKiAgT24gc3VjY2VzcyByZXR1cm5zIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAnZm10cycgYXJyYXkuIE9uIGZhaWx1cmUgcmV0dXJucworICogIGEgbmVnYXRpdmUgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQKK19jYW1lcmFfZGV2aWNlX2VudW1fcGl4ZWxfZm9ybWF0cyhMaW51eENhbWVyYURldmljZSogY2QsIFFlbXVQaXhlbEZvcm1hdCoqIGZtdHMpCit7CisgICAgaW50IG4sIG1heF9mbXQ7CisgICAgaW50IGZtdF9udW0gPSAwOworICAgIGludCBvdXRfbnVtID0gMDsKKyAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZtdF9lbnVtOworICAgIFFlbXVQaXhlbEZvcm1hdCogYXJyOworCisgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBzdXBwb3J0ZWQgZm9ybWF0cy4gKi8KKyAgICBmb3IgKG1heF9mbXQgPSAwOyA7IG1heF9mbXQrKykgeworICAgICAgICBtZW1zZXQoJmZtdF9lbnVtLCAwLCBzaXplb2YoZm10X2VudW0pKTsKKyAgICAgICAgZm10X2VudW0uaW5kZXggPSBtYXhfZm10OworICAgICAgICBmbXRfZW51bS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgICBpZihfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19FTlVNX0ZNVCwgJmZtdF9lbnVtKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogU2tpcCB0aGUgY29tcHJlc3NlZCBvbmVzLiAqLworICAgICAgICBpZiAoKGZtdF9lbnVtLmZsYWdzICYgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEKSA9PSAwKSB7CisgICAgICAgICAgICBmbXRfbnVtKys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZtdF9udW0gPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSwgYW5kIGluaXRpYWxpemUgYXJyYXkgZm9yIGVudW1lcmF0ZWQgZm9ybWF0cy4gKi8KKyAgICAqZm10cyA9IChRZW11UGl4ZWxGb3JtYXQqKW1hbGxvYyhmbXRfbnVtICogc2l6ZW9mKFFlbXVQaXhlbEZvcm1hdCkpOworICAgIGlmICgqZm10cyA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhcnIgPSAqZm10czsKKyAgICBtZW1zZXQoYXJyLCAwLCBmbXRfbnVtICogc2l6ZW9mKFFlbXVQaXhlbEZvcm1hdCkpOworICAgIGZvciAobiA9IDA7IG4gPCBtYXhfZm10ICYmIG91dF9udW0gPCBmbXRfbnVtOyBuKyspIHsKKyAgICAgICAgbWVtc2V0KCZmbXRfZW51bSwgMCwgc2l6ZW9mKGZtdF9lbnVtKSk7CisgICAgICAgIGZtdF9lbnVtLmluZGV4ID0gbjsKKyAgICAgICAgZm10X2VudW0udHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICAgICAgaWYoX3hpb2N0bChjZC0+aGFuZGxlLCBWSURJT0NfRU5VTV9GTVQsICZmbXRfZW51bSkpIHsKKyAgICAgICAgICAgIGludCBubjsKKyAgICAgICAgICAgIC8qIEVycm9ycyBhcmUgbm90IHdlbGNvbWUgaGVyZSBhbnltb3JlLiAqLworICAgICAgICAgICAgRSgiJXM6IFVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBnZXR0aW5nIHBpeGVsIGZvcm1hdDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBvdXRfbnVtOyBubisrKSB7CisgICAgICAgICAgICAgICAgX3FlbXVfcGl4ZWxfZm9ybWF0X2ZyZWUoYXJyICsgbm4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShhcnIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8qIFNraXAgdGhlIGNvbXByZXNzZWQgb25lcy4gKi8KKyAgICAgICAgaWYgKChmbXRfZW51bS5mbGFncyAmIFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRCkgPT0gMCkgeworICAgICAgICAgICAgYXJyW291dF9udW1dLmZvcm1hdCA9IGZtdF9lbnVtLnBpeGVsZm9ybWF0OworICAgICAgICAgICAgLyogRW51bWVyYXRlIGZyYW1lIGRpbWVuc2lvbnMgc3VwcG9ydGVkIGZvciB0aGlzIGZvcm1hdC4gKi8KKyAgICAgICAgICAgIGFycltvdXRfbnVtXS5kaW1fbnVtID0KKyAgICAgICAgICAgICAgICBfY2FtZXJhX2RldmljZV9lbnVtX2Zvcm1hdF9zaXplcyhjZCwgZm10X2VudW0ucGl4ZWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFycltvdXRfbnVtXS5kaW1zKTsKKyAgICAgICAgICAgIGlmIChhcnJbb3V0X251bV0uZGltX251bSA+IDApIHsKKyAgICAgICAgICAgICAgICBvdXRfbnVtKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFycltvdXRfbnVtXS5kaW1fbnVtIDwgMCkgeworICAgICAgICAgICAgICAgIGludCBubjsKKyAgICAgICAgICAgICAgICBFKCJVbmFibGUgdG8gZW51bWVyYXRlIHN1cHBvcnRlZCBkaW1lbnNpb25zIGZvciBwaXhlbCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgICAgZm10X2VudW0ucGl4ZWxmb3JtYXQpOworICAgICAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IG91dF9udW07IG5uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgX3FlbXVfcGl4ZWxfZm9ybWF0X2ZyZWUoYXJyICsgbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKGFycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dF9udW07Cit9CisKKy8qIENvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZW5lZCBjYW1lcmEgZGV2aWNlLgorICogVGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGlzIHJvdXRpbmUgY29udGFpbnMgbGlzdCBvZiBwaXhlbCBmb3JtYXRzLAorICogc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIGFuZCBsaXN0IG9mIGZyYW1lIGRpbWVuc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEKKyAqIGZvciBlYWNoIHBpeGVsIGZvcm1hdC4KKyAqIFBhcmFtOgorICogIGNkIC0gT3BlbmVkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvci4KKyAqICBjaXMgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIGNhbWVyYSBkZXZpY2UuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCAhPSAwIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK19jYW1lcmFfZGV2aWNlX2dldF9pbmZvKExpbnV4Q2FtZXJhRGV2aWNlKiBjZCwgQ2FtZXJhSW5mbyogY2lzKQoreworICAgIGludCBmOworICAgIGludCBjaG9zZW4gPSAtMTsKKyAgICBRZW11UGl4ZWxGb3JtYXQqIGZvcm1hdHMgPSBOVUxMOworICAgIGludCBudW1fcGl4X2ZtdHMgPSBfY2FtZXJhX2RldmljZV9lbnVtX3BpeGVsX2Zvcm1hdHMoY2QsICZmb3JtYXRzKTsKKyAgICBpZiAobnVtX3BpeF9mbXRzIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIExldHMgc2VlIGlmIGNhbWVyYSBzdXBwb3J0cyBwcmVmZXJyZWQgZm9ybWF0cyAqLworICAgIGZvciAoZiA9IDA7IGYgPCBfcHJlZmVycmVkX2Zvcm1hdF9udW07IGYrKykgeworICAgICAgICBjaG9zZW4gPSBfZ2V0X2Zvcm1hdF9pbmRleChfcHJlZmVycmVkX2Zvcm1hdHNbZl0sIGZvcm1hdHMsIG51bV9waXhfZm10cyk7CisgICAgICAgIGlmIChjaG9zZW4gPj0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNob3NlbiA8IDApIHsKKyAgICAgICAgLyogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgb2YgdGhlIGNob3NlbiBmb3JtYXRzLiBUaGVuIGl0IGRvZXNuJ3QKKyAgICAgICAgICogbWF0dGVyIHdoaWNoIG9uZSB3ZSBjaG9vc2UuIExldHMgY2hvb3NlIHRoZSBmaXJzdCBvbmUuICovCisgICAgICAgIGNob3NlbiA9IDA7CisgICAgfQorCisgICAgY2lzLT5kZXZpY2VfbmFtZSA9IEFTVFJEVVAoY2QtPmRldmljZV9uYW1lKTsKKyAgICBjaXMtPmlucF9jaGFubmVsID0gY2QtPmlucHV0X2NoYW5uZWw7CisgICAgY2lzLT5waXhlbF9mb3JtYXQgPSBmb3JtYXRzW2Nob3Nlbl0uZm9ybWF0OworICAgIGNpcy0+ZnJhbWVfc2l6ZXNfbnVtID0gZm9ybWF0c1tjaG9zZW5dLmRpbV9udW07CisgICAgLyogU3dhcCBpbnN0ZWFkIG9mIGNvcHkuICovCisgICAgY2lzLT5mcmFtZV9zaXplcyA9IGZvcm1hdHNbY2hvc2VuXS5kaW1zOworICAgIGZvcm1hdHNbY2hvc2VuXS5kaW1zID0gTlVMTDsKKyAgICBjaXMtPmluX3VzZSA9IDA7CisKKyAgICBmb3IgKGYgPSAwOyBmIDwgbnVtX3BpeF9mbXRzOyBmKyspIHsKKyAgICAgICAgX3FlbXVfcGl4ZWxfZm9ybWF0X2ZyZWUoZm9ybWF0cyArIGYpOworICAgIH0KKyAgICBmcmVlKGZvcm1hdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIENhbWVyYURldmljZSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NhbWVyYURldmljZSoKK2NhbWVyYV9kZXZpY2Vfb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgaW5wX2NoYW5uZWwpCit7CisgICAgc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwOworICAgIHN0cnVjdCB2NGwyX2Nyb3AgY3JvcDsKKyAgICBMaW51eENhbWVyYURldmljZSogY2Q7CisKKyAgICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvci4gKi8KKyAgICBjZCA9IF9jYW1lcmFfZGV2aWNlX2FsbG9jKCk7CisgICAgY2QtPmRldmljZV9uYW1lID0gbmFtZSAhPSBOVUxMID8gQVNUUkRVUChuYW1lKSA6IEFTVFJEVVAoIi9kZXYvdmlkZW8wIik7CisgICAgY2QtPmlucHV0X2NoYW5uZWwgPSBpbnBfY2hhbm5lbDsKKworICAgIC8qIE9wZW4gdGhlIGRldmljZS4gKi8KKyAgICBpZiAoX2NhbWVyYV9kZXZpY2Vfb3BlbihjZCkpIHsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfZnJlZShjZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIFNlbGVjdCB2aWRlbyBpbnB1dCwgdmlkZW8gc3RhbmRhcmQgYW5kIHR1bmUgaGVyZS4gKi8KKyAgICBjcm9wY2FwLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgX3hpb2N0bChjZC0+aGFuZGxlLCBWSURJT0NfQ1JPUENBUCwgJmNyb3BjYXApOworICAgIGNyb3AudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICBjcm9wLmMgPSBjcm9wY2FwLmRlZnJlY3Q7IC8qIHJlc2V0IHRvIGRlZmF1bHQgKi8KKyAgICBfeGlvY3RsIChjZC0+aGFuZGxlLCBWSURJT0NfU19DUk9QLCAmY3JvcCk7CisKKyAgICByZXR1cm4gJmNkLT5oZWFkZXI7Cit9CisKK2ludAorY2FtZXJhX2RldmljZV9zdGFydF9jYXB0dXJpbmcoQ2FtZXJhRGV2aWNlKiBjY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfaGVpZ2h0KQoreworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7CisgICAgTGludXhDYW1lcmFEZXZpY2UqIGNkOworICAgIGNoYXIgZm10X3N0cls1XTsKKyAgICBpbnQgcjsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgaWYgKGNjZCA9PSBOVUxMIHx8IGNjZC0+b3BhcXVlID09IE5VTEwpIHsKKyAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNkID0gKExpbnV4Q2FtZXJhRGV2aWNlKiljY2QtPm9wYXF1ZTsKKyAgICBpZiAoY2QtPmhhbmRsZSA8IDApIHsKKyAgICAgIEUoIiVzOiBDYW1lcmEgZGV2aWNlIGlzIG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFRyeSB0byBzZXQgcGl4ZWwgZm9ybWF0IHdpdGggdGhlIGdpdmVuIGRpbWVuc2lvbnMuICovCisgICAgQ0xFQVIoZm10KTsKKyAgICBmbXQudHlwZSAgICAgICAgICAgICAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICBmbXQuZm10LnBpeC53aWR0aCAgICAgICA9IGZyYW1lX3dpZHRoOworICAgIGZtdC5mbXQucGl4LmhlaWdodCAgICAgID0gZnJhbWVfaGVpZ2h0OworICAgIGZtdC5mbXQucGl4LnBpeGVsZm9ybWF0ID0gcGl4ZWxfZm9ybWF0OworICAgIGlmIChfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19TX0ZNVCwgJmZtdCkgPCAwKSB7CisgICAgICAgIG1lbWNweShmbXRfc3RyLCAmcGl4ZWxfZm9ybWF0LCA0KTsKKyAgICAgICAgZm10X3N0cls0XSA9ICdcMCc7CisgICAgICAgIEUoIiVzOiBDYW1lcmEgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHBpeGVsIGZvcm1hdCAnJXMnIHdpdGggZGltZW5zaW9ucyAlZHglZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUsIGZtdF9zdHIsIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQpOworICAgICAgICBfY2FtZXJhX2RldmljZV9yZXNldChjZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogVklESU9DX1NfRk1UIG1heSBoYXMgY2hhbmdlZCBzb21lIHByb3BlcnRpZXMgb2YgdGhlIHN0cnVjdHVyZS4gTWFrZSBzdXJlCisgICAgICogdGhhdCBkaW1lbnNpb25zIGRpZG4ndCBjaGFuZ2UuICovCisgICAgaWYgKGZtdC5mbXQucGl4LndpZHRoICE9IGZyYW1lX3dpZHRoIHx8IGZtdC5mbXQucGl4LmhlaWdodCAhPSBmcmFtZV9oZWlnaHQpIHsKKyAgICAgICAgbWVtY3B5KGZtdF9zdHIsICZwaXhlbF9mb3JtYXQsIDQpOworICAgICAgICBmbXRfc3RyWzRdID0gJ1wwJzsKKyAgICAgICAgRSgiJXM6IERpbWVuc2lvbnMgJWR4JWQgYXJlIHdyb25nIGZvciBwaXhlbCBmb3JtYXQgJyVzJyIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LCBmbXRfc3RyKTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQoY2QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweSgmY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQsICZmbXQuZm10LnBpeCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQpKTsKKworICAgIC8qCisgICAgICogTGV0cyBpbml0aWFsaXplIGZyYW1lIGJ1ZmZlcnMsIGFuZCBzZWUgd2hhdCBraW5kIG9mIEkvTyB3ZSdyZSBnb2luZyB0bworICAgICAqIHVzZSB0byByZXRyaWV2ZSBmcmFtZXMuCisgICAgICovCisKKyAgICAvKiBGaXJzdCwgbGV0cyBzZWUgaWYgd2UgY2FuIGRvIG1hcHBlZCBJL08gKGFzIG1vc3QgcGVyZm9ybWFudCBvbmUpLiAqLworICAgIHIgPSBfY2FtZXJhX2RldmljZV9tbWFwX2ZyYW1lYnVmZmVyKGNkKTsKKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgLyogU29tZSBjcml0aWNhbCBlcnJvciBoYXMgb2N1cnJlZC4gQmFpbCBvdXQuICovCisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KGNkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAociA+IDApIHsKKyAgICAgICAgLyogRGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBtZW1vcnkgbWFwcGluZy4gUmV0cmlldmUgdG8gdGhlIG5leHQgcGVyZm9ybWFudAorICAgICAgICAgKiBvbmU6IHByZWFsbG9jYXRlZCB1c2VyIGJ1ZmZlcnMuICovCisgICAgICAgIHIgPSBfY2FtZXJhX2RldmljZV91c2VyX2ZyYW1lYnVmZmVyKGNkKTsKKyAgICAgICAgaWYgKHIgPCAwKSB7CisgICAgICAgICAgICAvKiBTb21lIGNyaXRpY2FsIGVycm9yIGhhcyBvY3VycmVkLiBCYWlsIG91dC4gKi8KKyAgICAgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KGNkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChyID4gMCkgeworICAgICAgICAgICAgLyogVGhlIG9ubHkgdGhpbmcgbGVmdCBmb3IgdXMgaXMgZGlyZWN0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlLiAqLworICAgICAgICAgICAgaWYgKCEoY2QtPmNhcHMuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfUkVBRFdSSVRFKSkgeworICAgICAgICAgICAgICAgIEUoIiVzOiBEb24ndCBrbm93IGhvdyB0byBhY2Nlc3MgZnJhbWVzIG9uIGRldmljZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2QtPmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICBfY2FtZXJhX2RldmljZV9yZXNldChjZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgciA9IF9jYW1lcmFfZGV2aWNlX2RpcmVjdF9mcmFtZWJ1ZmZlcihjZCk7CisgICAgICAgICAgICBpZiAociAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogQW55IGVycm9yIGF0IHRoaXMgcG9pbnQgaXMgYSBjcml0aWNhbCBvbmUuICovCisgICAgICAgICAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQoY2QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFN0YXJ0IGNhcHR1cmluZyBmcm9tIHRoZSBkZXZpY2UuICovCisgICAgaWYgKGNkLT5pb190eXBlICE9IENBTUVSQV9JT19ESVJFQ1QpIHsKKyAgICAgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7CisgICAgICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgIGlmIChfeGlvY3RsIChjZC0+aGFuZGxlLCBWSURJT0NfU1RSRUFNT04sICZ0eXBlKSA8IDApIHsKKyAgICAgICAgICAgIEUoIiVzOiBWSURJT0NfU1RSRUFNT04gb24gY2FtZXJhICclcycgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNkLT5kZXZpY2VfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KGNkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CitjYW1lcmFfZGV2aWNlX3N0b3BfY2FwdHVyaW5nKENhbWVyYURldmljZSogY2NkKQoreworICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworICAgIExpbnV4Q2FtZXJhRGV2aWNlKiBjZDsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgaWYgKGNjZCA9PSBOVUxMIHx8IGNjZC0+b3BhcXVlID09IE5VTEwpIHsKKyAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNkID0gKExpbnV4Q2FtZXJhRGV2aWNlKiljY2QtPm9wYXF1ZTsKKyAgICBpZiAoY2QtPmhhbmRsZSA8IDApIHsKKyAgICAgIEUoIiVzOiBDYW1lcmEgZGV2aWNlIGlzIG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaCAoY2QtPmlvX3R5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfSU9fRElSRUNUOgorICAgICAgICAgICAgLyogTm90aGluZyB0byBkby4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ0FNRVJBX0lPX01FTU1BUDoKKyAgICAgICAgY2FzZSBDQU1FUkFfSU9fVVNFUlBUUjoKKyAgICAgICAgICAgIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgICAgICBpZiAoX3hpb2N0bChjZC0+aGFuZGxlLCBWSURJT0NfU1RSRUFNT0ZGLCAmdHlwZSkgPCAwKSB7CisJICAgICAgICAgICAgRSgiJXM6IFZJRElPQ19TVFJFQU1PRkYgb24gY2FtZXJhICclcycgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFKCIlczogVW5rbm93biBJL08gbWV0aG9kOiAlZCIsIF9fRlVOQ1RJT05fXywgY2QtPmlvX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJlb3BlbiB0aGUgZGV2aWNlIHRvIHJlc2V0IGl0cyBpbnRlcm5hbCBzdGF0ZS4gSXQgc2VlbXMgdGhhdCBpZiB3ZSBkb24ndAorICAgICAqIGRvIHRoYXQsIGFuIGF0dGVtcHQgdG8gcmVpbml0IHRoZSBkZXZpY2Ugd2l0aCBkaWZmZXJlbnQgZnJhbWUgZGltZW5zaW9ucworICAgICAqIHdvdWxkIGZhaWwuICovCisgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQoY2QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorY2FtZXJhX2RldmljZV9yZWFkX2ZyYW1lKENhbWVyYURldmljZSogY2NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEZyYW1lQnVmZmVyKiBmcmFtZWJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgTGludXhDYW1lcmFEZXZpY2UqIGNkOworCisgICAgLyogU2FuaXR5IGNoZWNrcy4gKi8KKyAgICBpZiAoY2NkID09IE5VTEwgfHwgY2NkLT5vcGFxdWUgPT0gTlVMTCkgeworICAgICAgRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSBkZXNjcmlwdG9yIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY2QgPSAoTGludXhDYW1lcmFEZXZpY2UqKWNjZC0+b3BhcXVlOworICAgIGlmIChjZC0+aGFuZGxlIDwgMCkgeworICAgICAgRSgiJXM6IENhbWVyYSBkZXZpY2UgaXMgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGNkLT5pb190eXBlID09IENBTUVSQV9JT19ESVJFQ1QpIHsKKyAgICAgICAgLyogUmVhZCBkaXJlY3RseSBmcm9tIHRoZSBkZXZpY2UuICovCisgICAgICAgIHNpemVfdCB0b3RhbF9yZWFkX2J5dGVzID0gMDsKKyAgICAgICAgLyogVGhlcmUgaXMgb25lIGZyYW1lYnVmZmVyIGFsbG9jYXRlZCBmb3IgZGlyZWN0IHJlYWQuICovCisgICAgICAgIHZvaWQqIGJ1ZmYgPSBjZC0+ZnJhbWVidWZmZXJzWzBdLmRhdGE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCByZWFkX2J5dGVzID0KKyAgICAgICAgICAgICAgICByZWFkKGNkLT5oYW5kbGUsIGJ1ZmYgKyB0b3RhbF9yZWFkX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQuc2l6ZWltYWdlIC0gdG90YWxfcmVhZF9ieXRlcyk7CisgICAgICAgICAgICBpZiAocmVhZF9ieXRlcyA8IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRUlPOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEVBR0FJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgRSgiJXM6IFVuYWJsZSB0byByZWFkIGZyb20gdGhlIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNkLT5kZXZpY2VfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9yZWFkX2J5dGVzICs9IHJlYWRfYnl0ZXM7CisgICAgICAgIH0gd2hpbGUgKHRvdGFsX3JlYWRfYnl0ZXMgPCBjZC0+YWN0dWFsX3BpeGVsX2Zvcm1hdC5zaXplaW1hZ2UpOworICAgICAgICAvKiBDb252ZXJ0IHRoZSByZWFkIGZyYW1lIGludG8gdGhlIGNhbGxlcidzIGZyYW1lYnVmZmVycy4gKi8KKyAgICAgICAgcmV0dXJuIGNvbnZlcnRfZnJhbWUoYnVmZiwgY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQucGl4ZWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkLT5hY3R1YWxfcGl4ZWxfZm9ybWF0LnNpemVpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkLT5hY3R1YWxfcGl4ZWxfZm9ybWF0LmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJzLCBmYnNfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlLCBleHBfY29tcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGVxdWV1ZSBuZXh0IGJ1ZmZlciBmcm9tIHRoZSBkZXZpY2UuICovCisgICAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgICAgIGludCByZXM7CisgICAgICAgIENMRUFSKGJ1Zik7CisgICAgICAgIGJ1Zi50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgICBidWYubWVtb3J5ID0gY2QtPmlvX3R5cGUgPT0gQ0FNRVJBX0lPX01FTU1BUCA/IFY0TDJfTUVNT1JZX01NQVAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfTUVNT1JZX1VTRVJQVFI7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCByZXMgPSBfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19EUUJVRiwgJmJ1Zik7CisgICAgICAgICAgICBpZiAocmVzID49IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7ICAgLy8gVGVsbHMgdGhlIGNhbGxlciB0byByZXBlYXQuCisgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVJTykgeworICAgICAgICAgICAgICAgIEUoIiVzOiBWSURJT0NfRFFCVUYgb24gY2FtZXJhICclcycgaGFzIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjZC0+ZGV2aWNlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ29udmVydCBmcmFtZSB0byB0aGUgcmVjZWl2aW5nIGJ1ZmZlcnMuICovCisgICAgICAgIHJlcyA9IGNvbnZlcnRfZnJhbWUoY2QtPmZyYW1lYnVmZmVyc1tidWYuaW5kZXhdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQucGl4ZWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QtPmFjdHVhbF9waXhlbF9mb3JtYXQuc2l6ZWltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkLT5hY3R1YWxfcGl4ZWxfZm9ybWF0LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkLT5hY3R1YWxfcGl4ZWxfZm9ybWF0LmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcnMsIGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworCisgICAgICAgIC8qIFJlcXVldWUgdGhlIGJ1ZmZlciBiYWNrIHRvIHRoZSBkZXZpY2UuICovCisgICAgICAgIGlmIChfeGlvY3RsKGNkLT5oYW5kbGUsIFZJRElPQ19RQlVGLCAmYnVmKSA8IDApIHsKKyAgICAgICAgICAgIFcoIiVzOiBWSURJT0NfUUJVRiBvbiBjYW1lcmEgJyVzJyBoYXMgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2QtPmRldmljZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9Cit9CisKK3ZvaWQKK2NhbWVyYV9kZXZpY2VfY2xvc2UoQ2FtZXJhRGV2aWNlKiBjY2QpCit7CisgICAgTGludXhDYW1lcmFEZXZpY2UqIGNkOworCisgICAgLyogU2FuaXR5IGNoZWNrcy4gKi8KKyAgICBpZiAoY2NkICE9IE5VTEwgJiYgY2NkLT5vcGFxdWUgIT0gTlVMTCkgeworICAgICAgICBjZCA9IChMaW51eENhbWVyYURldmljZSopY2NkLT5vcGFxdWU7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX2ZyZWUoY2QpOworICAgIH0gZWxzZSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorfQorCitpbnQgY2FtZXJhX2VudW1lcmF0ZV9kZXZpY2VzKENhbWVyYUluZm8qIGNpcywgaW50IG1heCkgeworICAgIGNoYXIgZGV2X25hbWVbMjRdOworICAgIGludCBmb3VuZCA9IDA7CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbWF4OyBuKyspIHsKKyAgICAgICAgc25wcmludGYoZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSksICIvZGV2L3ZpZGVvJWQiLCBuKTsKKyAgICAgICAgQ2FtZXJhRGV2aWNlKiBjZCA9IGNhbWVyYV9kZXZpY2Vfb3BlbihkZXZfbmFtZSwgMCk7CisgICAgICAgIGlmIChjZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBMaW51eENhbWVyYURldmljZSogbGNkID0gKExpbnV4Q2FtZXJhRGV2aWNlKiljZC0+b3BhcXVlOworICAgICAgICAgICAgaWYgKCFfY2FtZXJhX2RldmljZV9nZXRfaW5mbyhsY2QsIGNpcyArIGZvdW5kKSkgeworICAgICAgICAgICAgICAgIGNoYXIgdXNlcl9uYW1lWzI0XTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zih1c2VyX25hbWUsIHNpemVvZih1c2VyX25hbWUpLCAid2ViY2FtJWQiLCBmb3VuZCk7CisgICAgICAgICAgICAgICAgY2lzW2ZvdW5kXS5kaXNwbGF5X25hbWUgPSBBU1RSRFVQKHVzZXJfbmFtZSk7CisgICAgICAgICAgICAgICAgY2lzW2ZvdW5kXS5pbl91c2UgPSAwOworICAgICAgICAgICAgICAgIGZvdW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYW1lcmFfZGV2aWNlX2Nsb3NlKGNkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS1tYWMubSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUtbWFjLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYxYzljNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUtbWFjLm0KQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ29udGFpbnMgY29kZSB0aGF0IGlzIHVzZWQgdG8gY2FwdHVyZSB2aWRlbyBmcmFtZXMgZnJvbSBhIGNhbWVyYSBkZXZpY2UKKyAqIG9uIE1hYy4gVGhpcyBjb2RlIHVzZXMgUVRLaXQgQVBJIHRvIHdvcmsgd2l0aCBjYW1lcmEgZGV2aWNlcywgYW5kIHJlcXVpcmVzCisgKiBNYWMgT1MgYXQgbGVhc3QgMTAuNQorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvY2FtZXJhL2NhbWVyYS1mb3JtYXQtY29udmVydGVycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW1wb3J0IDxBVkZvdW5kYXRpb24vQVZGb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorI2ltcG9ydCA8Q29yZUF1ZGlvL0NvcmVBdWRpby5oPgorCisjaWYgMAorI2ltcG9ydCA8UVRLaXQvUVRLaXQ+CisjZWxzZQorLy8gUVRNb3ZpZU1vZGVybml6ZXIuaCBkb2VzIG5vdCBjb21waWxlIHdpdGggY3VycmVudCB0b29sY2hhaW4uCisvLyBUT0RPOiByZXZlcnQgdGhpcyB3aGVuIHRvb2xjaGFpbiBpcyB1cGRhdGVkLgorI2ltcG9ydCA8UVRLaXQvUVRDYXB0dXJlQ29ubmVjdGlvbi5oPgorI2ltcG9ydCA8UVRLaXQvUVRDYXB0dXJlRGV2aWNlLmg+CisjaW1wb3J0IDxRVEtpdC9RVENhcHR1cmVEZXZpY2VJbnB1dC5oPgorI2ltcG9ydCA8UVRLaXQvUVRDYXB0dXJlU2Vzc2lvbi5oPgorI2ltcG9ydCA8UVRLaXQvUVRDYXB0dXJlVmlkZW9QcmV2aWV3T3V0cHV0Lmg+CisjaW1wb3J0IDxRVEtpdC9RVE1lZGlhLmg+CisjaW1wb3J0IDxRVEtpdC9RVFNhbXBsZUJ1ZmZlci5oPgorI2VuZGlmCisKKyNkZWZpbmUgIEUoLi4uKSAgICBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lICBXKC4uLikgICAgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lICBEKC4uLikgICAgVkVSQk9TRV9QUklOVChjYW1lcmEsX19WQV9BUkdTX18pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIEhlbHBlciByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29udmVydHMgaW50ZXJuYWwgUVQgcGl4ZWwgZm9ybWF0IHRvIGEgRk9VUkNDIHZhbHVlLiAqLworc3RhdGljIHVpbnQzMl90CitfUVR0b0ZPVVJDQyh1aW50MzJfdCBxdF9waXhfZm9ybWF0KQoreworICBzd2l0Y2ggKHF0X3BpeF9mb3JtYXQpIHsKKyAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV8yNFJHQjoKKyAgICAgIHJldHVybiBWNEwyX1BJWF9GTVRfUkdCMjQ7CisKKyAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV8yNEJHUjoKKyAgICAgIHJldHVybiBWNEwyX1BJWF9GTVRfQkdSMzI7CisKKyAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV8zMkFSR0I6CisgICAgY2FzZSBrQ1ZQaXhlbEZvcm1hdFR5cGVfMzJSR0JBOgorICAgICAgcmV0dXJuIFY0TDJfUElYX0ZNVF9SR0IzMjsKKworICAgIGNhc2Uga0NWUGl4ZWxGb3JtYXRUeXBlXzMyQkdSQToKKyAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV8zMkFCR1I6CisgICAgICByZXR1cm4gVjRMMl9QSVhfRk1UX0JHUjMyOworCisgICAgY2FzZSBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIyWXBDYkNyODoKKyAgICAgIHJldHVybiBWNEwyX1BJWF9GTVRfVVlWWTsKKworICAgIGNhc2Uga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhQbGFuYXI6CisgICAgY2FzZSBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIwWXBDYkNyOEJpUGxhbmFyVmlkZW9SYW5nZToKKyAgICAgIHJldHVybiBWNEwyX1BJWF9GTVRfWVZVNDIwOworCisgICAgY2FzZSAneXV2cyc6ICAvLyBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIyWXBDYkNyOF95dXZzIC0gdW5kZWNsYXJlZD8KKyAgICAgIHJldHVybiBWNEwyX1BJWF9GTVRfWVVZVjsKKworICAgIGRlZmF1bHQ6CisgICAgICBFKCJVbnJlY29nbml6ZWQgcGl4ZWwgZm9ybWF0ICclLjRzJyIsIChjb25zdCBjaGFyKikmcXRfcGl4X2Zvcm1hdCk7CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBNYWNDYW1lcmEgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEVuY2Fwc3VsYXRlcyBhIGNhbWVyYSBkZXZpY2Ugb24gTWFjT1MgKi8KK0BpbnRlcmZhY2UgTWFjQ2FtZXJhIDogTlNPYmplY3QgeworICAgIC8qIENhcHR1cmUgc2Vzc2lvbi4gKi8KKyAgICBRVENhcHR1cmVTZXNzaW9uKiAgICAgICAgICAgICBjYXB0dXJlX3Nlc3Npb247CisgICAgLyogQ2FtZXJhIGNhcHR1cmUgZGV2aWNlLiAqLworICAgIC8qIE5PVEU6IGRvIE5PVCByZWxlYXNlIGNhcHR1cmVfZGV2aWNlICovCisgICAgLyogUmVsZWFzaW5nIHQgY2F1c2VzIGEgY3Jhc2ggb24gZXhpdC4gKi8KKyAgICAvKiBUaGUgb2ZmaWNpYWwgQXBwbGUgUVRLaXQgZXhhbXBsZXMgZG8gbm90IHJlbGVhc2UgUVRDYXB0dXJlRGV2aWNlLiAqLworICAgIFFUQ2FwdHVyZURldmljZSogICAgICAgICAgICAgIGNhcHR1cmVfZGV2aWNlOworICAgIC8qIElucHV0IGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGNhcHR1cmUgc2Vzc2lvbi4gKi8KKyAgICBRVENhcHR1cmVEZXZpY2VJbnB1dCogICAgICAgICBpbnB1dF9kZXZpY2U7CisgICAgLyogT3V0cHV0IGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGNhcHR1cmUgc2Vzc2lvbi4gKi8KKyAgICBRVENhcHR1cmVWaWRlb1ByZXZpZXdPdXRwdXQqICBvdXRwdXRfZGV2aWNlOworICAgIC8qIEN1cnJlbnQgZnJhbWVidWZmZXIuICovCisgICAgQ1ZJbWFnZUJ1ZmZlclJlZiAgICAgICAgICAgICAgY3VycmVudF9mcmFtZTsKKyAgICAvKiBEZXNpcmVkIGZyYW1lIHdpZHRoICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZF93aWR0aDsKKyAgICAvKiBEZXNpcmVkIGZyYW1lIGhlaWdodCAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRfaGVpZ2h0OworfQorCisvKiBJbml0aWFsaXplcyBNYWNDYW1lcmEgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgUG9pbnRlciB0byBpbml0aWFsaXplZCBpbnN0YW5jZSBvbiBzdWNjZXNzLCBvciBuaWwgb24gZmFpbHVyZS4KKyAqLworLSAoTWFjQ2FtZXJhKilpbml0OworCisvKiBVbmRvZXMgJ2luaXQnICovCistICh2b2lkKWZyZWU7CisKKy8qIFN0YXJ0cyBjYXB0dXJpbmcgdmlkZW8gZnJhbWVzLgorICogUGFyYW06CisgKiAgd2lkdGgsIGhlaWdodCAtIFJlcXVlc3RlZCBkaW1lbnNpb25zIGZvciB0aGUgY2FwdHVyZWQgdmlkZW8gZnJhbWVzLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2Vzcywgb3IgIT0wIG9uIGZhaWx1cmUuCisgKi8KKy0gKGludClzdGFydF9jYXB0dXJpbmc6KGludCl3aWR0aDooaW50KWhlaWdodDsKKworLyogQ2FwdHVyZXMgYSBmcmFtZSBmcm9tIHRoZSBjYW1lcmEgZGV2aWNlLgorICogUGFyYW06CisgKiAgZnJhbWVidWZmZXJzIC0gQXJyYXkgb2YgZnJhbWVidWZmZXJzIHdoZXJlIHRvIHJlYWQgdGhlIGZyYW1lLiBTaXplIG9mIHRoaXMKKyAqICAgICAgYXJyYXkgaXMgZGVmaW5lZCBieSB0aGUgJ2Zic19udW0nIHBhcmFtZXRlci4gTm90ZSB0aGF0IHRoZSBjYWxsZXIgbXVzdAorICogICAgICBtYWtlIHN1cmUgdGhhdCBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBlbnRpcmUgZnJhbWUgY2FwdHVyZWQKKyAqICAgICAgZnJvbSB0aGUgZGV2aWNlLgorICogIGZic19udW0gLSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgJ2ZyYW1lYnVmZmVycycgYXJyYXkuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciBub24temVybyB2YWx1ZSBvbiBmYWlsdXJlLiBUaGVyZSBpcyBhIHNwZWNpYWwgdmF1bGUgMQorICogIHJldHVybmVkIGZyb20gdGhpcyByb3V0aW5lIHdoaWNoIGluZGljYXRlcyB0aGF0IGZyYW1lcyBhcmUgbm90IHlldCBhdmFpbGFibGUKKyAqICBpbiB0aGUgZGV2aWNlLiBUaGUgY2xpZW50IHNob3VsZCByZXNwb25kIHRvIHRoaXMgdmFsdWUgYnkgcmVwZWF0aW5nIHRoZQorICogIHJlYWQsIHJhdGhlciB0aGFuIHJlcG9ydGluZyBhbiBlcnJvci4KKyAqLworLSAoaW50KXJlYWRfZnJhbWU6KENsaWVudEZyYW1lQnVmZmVyKilmcmFtZWJ1ZmZlcnM6KGludClmYnNfbnVtOihmbG9hdClyX3NjYWxlOihmbG9hdClnX3NjYWxlOihmbG9hdCliX3NjYWxlOihmbG9hdClleHBfY29tcDsKKworQGVuZAorCitAaW1wbGVtZW50YXRpb24gTWFjQ2FtZXJhCisKKy0gKE1hY0NhbWVyYSopaW5pdAoreworICAgIE5TRXJyb3IgKmVycm9yOworICAgIEJPT0wgc3VjY2VzczsKKworICAgIC8qIE9idGFpbiB0aGUgY2FwdHVyZSBkZXZpY2UsIG1ha2Ugc3VyZSBpdCdzIG5vdCB1c2VkIGJ5IGFub3RoZXIKKyAgICAgKiBhcHBsaWNhdGlvbiwgYW5kIG9wZW4gaXQuICovCisgICAgY2FwdHVyZV9kZXZpY2UgPQorICAgICAgICBbUVRDYXB0dXJlRGV2aWNlIGRlZmF1bHRJbnB1dERldmljZVdpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107CisgICAgaWYgKGNhcHR1cmVfZGV2aWNlID09IG5pbCkgeworICAgICAgICBFKCJUaGVyZSBhcmUgbm8gYXZhaWxhYmxlIHZpZGVvIGRldmljZXMgZm91bmQuIik7CisgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBpZiAoW2NhcHR1cmVfZGV2aWNlIGlzSW5Vc2VCeUFub3RoZXJBcHBsaWNhdGlvbl0pIHsKKyAgICAgICAgRSgiRGVmYXVsdCBjYW1lcmEgZGV2aWNlIGlzIGluIHVzZSBieSBhbm90aGVyIGFwcGxpY2F0aW9uLiIpOworICAgICAgICBjYXB0dXJlX2RldmljZSA9IG5pbDsKKyAgICAgICAgW3NlbGYgcmVsZWFzZV07CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIHN1Y2Nlc3MgPSBbY2FwdHVyZV9kZXZpY2Ugb3BlbjomZXJyb3JdOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBFKCJVbmFibGUgdG8gb3BlbiBjYW1lcmEgZGV2aWNlOiAnJXMnIiwKKyAgICAgICAgICBbW2Vycm9yIGxvY2FsaXplZERlc2NyaXB0aW9uXSBVVEY4U3RyaW5nXSk7CisgICAgICAgIFtzZWxmIGZyZWVdOworICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgY2FwdHVyZSBzZXNzaW9uLiAqLworICAgIGNhcHR1cmVfc2Vzc2lvbiA9IFtbUVRDYXB0dXJlU2Vzc2lvbiBhbGxvY10gaW5pdF07CisgICAgaWYgKGNhcHR1cmVfc2Vzc2lvbiA9PSBuaWwpIHsKKyAgICAgICAgRSgiVW5hYmxlIHRvIGNyZWF0ZSBjYXB1cmUgc2Vzc2lvbi4iKTsKKyAgICAgICAgW3NlbGYgZnJlZV07CisgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhbiBpbnB1dCBkZXZpY2UgYW5kIHJlZ2lzdGVyIGl0IHdpdGggdGhlIGNhcHR1cmUgc2Vzc2lvbi4gKi8KKyAgICBpbnB1dF9kZXZpY2UgPSBbW1FUQ2FwdHVyZURldmljZUlucHV0IGFsbG9jXSBpbml0V2l0aERldmljZTpjYXB0dXJlX2RldmljZV07CisgICAgc3VjY2VzcyA9IFtjYXB0dXJlX3Nlc3Npb24gYWRkSW5wdXQ6aW5wdXRfZGV2aWNlIGVycm9yOiZlcnJvcl07CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBpbml0aWFsaXplIGlucHV0IGRldmljZTogJyVzJyIsCisgICAgICAgICAgW1tlcnJvciBsb2NhbGl6ZWREZXNjcmlwdGlvbl0gVVRGOFN0cmluZ10pOworICAgICAgICBbaW5wdXRfZGV2aWNlIHJlbGVhc2VdOworICAgICAgICBpbnB1dF9kZXZpY2UgPSBuaWw7CisgICAgICAgIFtzZWxmIGZyZWVdOworICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYW4gb3V0cHV0IGRldmljZSBhbmQgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgY2FwdHVyZSBzZXNzaW9uLiAqLworICAgIG91dHB1dF9kZXZpY2UgPSBbW1FUQ2FwdHVyZVZpZGVvUHJldmlld091dHB1dCBhbGxvY10gaW5pdF07CisgICAgc3VjY2VzcyA9IFtjYXB0dXJlX3Nlc3Npb24gYWRkT3V0cHV0Om91dHB1dF9kZXZpY2UgZXJyb3I6JmVycm9yXTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgb3V0cHV0IGRldmljZTogJyVzJyIsCisgICAgICAgICAgW1tlcnJvciBsb2NhbGl6ZWREZXNjcmlwdGlvbl0gVVRGOFN0cmluZ10pOworICAgICAgICBbb3V0cHV0X2RldmljZSByZWxlYXNlXTsKKyAgICAgICAgb3V0cHV0X2RldmljZSA9IG5pbDsKKyAgICAgICAgW3NlbGYgZnJlZV07CisgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICByZXR1cm4gbmlsOworICAgIH0KKyAgICBbb3V0cHV0X2RldmljZSBzZXREZWxlZ2F0ZTpzZWxmXTsKKworICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWZyZWUKK3sKKyAgICAvKiBVbmluaXRpYWxpemUgY2FwdHVyZSBzZXNzaW9uLiAqLworICAgIGlmIChjYXB0dXJlX3Nlc3Npb24gIT0gbmlsKSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IGNhcHR1cmluZyBpcyBzdG9wcGVkLiAqLworICAgICAgICBpZiAoW2NhcHR1cmVfc2Vzc2lvbiBpc1J1bm5pbmddKSB7CisgICAgICAgICAgICBbY2FwdHVyZV9zZXNzaW9uIHN0b3BSdW5uaW5nXTsKKyAgICAgICAgfQorICAgICAgICAvKiBEZXRhY2ggaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIGZyb20gdGhlIHNlc3Npb24uICovCisgICAgICAgIGlmIChpbnB1dF9kZXZpY2UgIT0gbmlsKSB7CisgICAgICAgICAgICBbY2FwdHVyZV9zZXNzaW9uIHJlbW92ZUlucHV0OmlucHV0X2RldmljZV07CisgICAgICAgICAgICBbaW5wdXRfZGV2aWNlIHJlbGVhc2VdOworICAgICAgICAgICAgaW5wdXRfZGV2aWNlID0gbmlsOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRwdXRfZGV2aWNlICE9IG5pbCkgeworICAgICAgICAgICAgW2NhcHR1cmVfc2Vzc2lvbiByZW1vdmVPdXRwdXQ6b3V0cHV0X2RldmljZV07CisgICAgICAgICAgICBbb3V0cHV0X2RldmljZSByZWxlYXNlXTsKKyAgICAgICAgICAgIG91dHB1dF9kZXZpY2UgPSBuaWw7CisgICAgICAgIH0KKyAgICAgICAgLyogRGVzdHJveSBjYXB0dXJlIHNlc3Npb24uICovCisgICAgICAgIFtjYXB0dXJlX3Nlc3Npb24gcmVsZWFzZV07CisgICAgICAgIGNhcHR1cmVfc2Vzc2lvbiA9IG5pbDsKKyAgICB9CisKKyAgICAvKiBVbmluaXRpYWxpemUgY2FwdHVyZSBkZXZpY2UuICovCisgICAgaWYgKGNhcHR1cmVfZGV2aWNlICE9IG5pbCkgeworICAgICAgICAvKiBNYWtlIHN1cmUgZGV2aWNlIGlzIG5vdCBvcGVuZWQuICovCisgICAgICAgIGlmIChbY2FwdHVyZV9kZXZpY2UgaXNPcGVuXSkgeworICAgICAgICAgICAgW2NhcHR1cmVfZGV2aWNlIGNsb3NlXTsKKyAgICAgICAgfQorICAgICAgICBjYXB0dXJlX2RldmljZSA9IG5pbDsKKyAgICB9CisKKyAgICBAc3luY2hyb25pemVkIChzZWxmKQorICAgIHsKKyAgICAgICAgLyogUmVsZWFzZSBjdXJyZW50IGZyYW1lYnVmZmVyLiAqLworICAgICAgICBpZiAoY3VycmVudF9mcmFtZSAhPSBuaWwpIHsKKyAgICAgICAgICAgIENWQnVmZmVyUmVsZWFzZShjdXJyZW50X2ZyYW1lKTsKKyAgICAgICAgICAgIGN1cnJlbnRfZnJhbWUgPSBuaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy0gKGludClzdGFydF9jYXB0dXJpbmc6KGludCl3aWR0aDooaW50KWhlaWdodAoreworICBpZiAoIVtjYXB0dXJlX3Nlc3Npb24gaXNSdW5uaW5nXSkgeworICAgICAgICAvKiBTZXQgZGVzaXJlZCBmcmFtZSBkaW1lbnNpb25zLiAqLworICAgICAgICBkZXNpcmVkX3dpZHRoID0gd2lkdGg7CisgICAgICAgIGRlc2lyZWRfaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBbb3V0cHV0X2RldmljZSBzZXRQaXhlbEJ1ZmZlckF0dHJpYnV0ZXM6CisgICAgICAgICAgW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOgorICAgICAgICAgICAgICBbTlNOdW1iZXIgbnVtYmVyV2l0aEludDogd2lkdGhdLCBrQ1ZQaXhlbEJ1ZmZlcldpZHRoS2V5LAorICAgICAgICAgICAgICBbTlNOdW1iZXIgbnVtYmVyV2l0aEludDogaGVpZ2h0XSwga0NWUGl4ZWxCdWZmZXJIZWlnaHRLZXksCisgICAgICAgICAgICAgIG5pbF1dOworICAgICAgICBbY2FwdHVyZV9zZXNzaW9uIHN0YXJ0UnVubmluZ107CisgICAgICAgIHJldHVybiAwOworICB9IGVsc2UgaWYgKHdpZHRoID09IGRlc2lyZWRfd2lkdGggJiYgaGVpZ2h0ID09IGRlc2lyZWRfaGVpZ2h0KSB7CisgICAgICBXKCIlczogQWxyZWFkeSBjYXB0dXJpbmcgJWR4JWQgZnJhbWVzIiwKKyAgICAgICAgX19GVU5DVElPTl9fLCBkZXNpcmVkX3dpZHRoLCBkZXNpcmVkX2hlaWdodCk7CisgICAgICByZXR1cm4gLTE7CisgIH0gZWxzZSB7CisgICAgICBFKCIlczogQWxyZWFkeSBjYXB0dXJpbmcgJWR4JWQgZnJhbWVzLiBSZXF1ZXN0ZWQgZnJhbWUgZGltZW5zaW9ucyBhcmUgJWR4JWQiLAorICAgICAgICBfX0ZVTkNUSU9OX18sIGRlc2lyZWRfd2lkdGgsIGRlc2lyZWRfaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorfQorCistIChpbnQpcmVhZF9mcmFtZTooQ2xpZW50RnJhbWVCdWZmZXIqKWZyYW1lYnVmZmVyczooaW50KWZic19udW06KGZsb2F0KXJfc2NhbGU6KGZsb2F0KWdfc2NhbGU6KGZsb2F0KWJfc2NhbGU6KGZsb2F0KWV4cF9jb21wCit7CisgICAgaW50IHJlcyA9IC0xOworCisgICAgLyogRnJhbWVzIGFyZSBwdXNoZWQgYnkgUVQgaW4gYW5vdGhlciB0aHJlYWQuCisgICAgICogU28gd2UgbmVlZCBhIHByb3RlY3Rpb24gaGVyZS4gKi8KKyAgICBAc3luY2hyb25pemVkIChzZWxmKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnRfZnJhbWUgIT0gbmlsKSB7CisgICAgICAgICAgICAvKiBDb2xsZWN0IGZyYW1lIGluZm8uICovCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwaXhlbF9mb3JtYXQgPQorICAgICAgICAgICAgICAgIF9RVHRvRk9VUkNDKENWUGl4ZWxCdWZmZXJHZXRQaXhlbEZvcm1hdFR5cGUoY3VycmVudF9mcmFtZSkpOworICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lX3dpZHRoID0gQ1ZQaXhlbEJ1ZmZlckdldFdpZHRoKGN1cnJlbnRfZnJhbWUpOworICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lX2hlaWdodCA9IENWUGl4ZWxCdWZmZXJHZXRIZWlnaHQoY3VycmVudF9mcmFtZSk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVfc2l6ZSA9CisgICAgICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlckdldEJ5dGVzUGVyUm93KGN1cnJlbnRfZnJhbWUpICogZnJhbWVfaGVpZ2h0OworCisgICAgICAgICAgICAvKiBHZXQgZnJhbWVidWZmZXIgcG9pbnRlci4gKi8KKyAgICAgICAgICAgIENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3MoY3VycmVudF9mcmFtZSwgMCk7CisgICAgICAgICAgICBjb25zdCB2b2lkKiBwaXhlbHMgPSBDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3MoY3VycmVudF9mcmFtZSk7CisgICAgICAgICAgICBpZiAocGl4ZWxzICE9IG5pbCkgeworICAgICAgICAgICAgICAgIC8qIENvbnZlcnQgZnJhbWVidWZmZXIuICovCisgICAgICAgICAgICAgICAgcmVzID0gY29udmVydF9mcmFtZShwaXhlbHMsIHBpeGVsX2Zvcm1hdCwgZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3dpZHRoLCBmcmFtZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcnMsIGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlLCBleHBfY29tcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gb2J0YWluIGZyYW1lYnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhjdXJyZW50X2ZyYW1lLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZpcnN0IGZyYW1lIGRpZG4ndCBjb21lIGluIGp1c3QgeWV0LiBMZXQgdGhlIGNhbGxlciByZXBlYXQuICovCisgICAgICAgICAgICByZXMgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLSAodm9pZCljYXB0dXJlT3V0cHV0OihRVENhcHR1cmVPdXRwdXQqKSBjYXB0dXJlT3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgZGlkT3V0cHV0VmlkZW9GcmFtZTooQ1ZJbWFnZUJ1ZmZlclJlZil2aWRlb0ZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgd2l0aFNhbXBsZUJ1ZmZlcjooUVRTYW1wbGVCdWZmZXIqKSBzYW1wbGVCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICBmcm9tQ29ubmVjdGlvbjooUVRDYXB0dXJlQ29ubmVjdGlvbiopIGNvbm5lY3Rpb24KK3sKKyAgICBDVkltYWdlQnVmZmVyUmVmIHRvX3JlbGVhc2U7CisgICAgQ1ZCdWZmZXJSZXRhaW4odmlkZW9GcmFtZSk7CisKKyAgICAvKiBGcmFtZXMgYXJlIHB1bGxlZCBieSB0aGUgY2xpZW50IGluIGFub3RoZXIgdGhyZWFkLgorICAgICAqIFNvIHdlIG5lZWQgYSBwcm90ZWN0aW9uIGhlcmUuICovCisgICAgQHN5bmNocm9uaXplZCAoc2VsZikKKyAgICB7CisgICAgICAgIHRvX3JlbGVhc2UgPSBjdXJyZW50X2ZyYW1lOworICAgICAgICBjdXJyZW50X2ZyYW1lID0gdmlkZW9GcmFtZTsKKyAgICB9CisgICAgQ1ZCdWZmZXJSZWxlYXNlKHRvX3JlbGVhc2UpOworfQorCitAZW5kCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIENhbWVyYURldmljZSByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgTWFjQ2FtZXJhRGV2aWNlIE1hY0NhbWVyYURldmljZTsKKy8qIE1hY09TLXNwZWNpZmljIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBNYWNDYW1lcmFEZXZpY2UgeworICAgIC8qIENvbW1vbiBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IuICovCisgICAgQ2FtZXJhRGV2aWNlICBoZWFkZXI7CisgICAgLyogQWN0dWFsIGNhbWVyYSBkZXZpY2Ugb2JqZWN0LiAqLworICAgIE1hY0NhbWVyYSogICAgZGV2aWNlOworICAgIGludCBzdGFydGVkOworICAgIGludCBmcmFtZV93aWR0aDsKKyAgICBpbnQgZnJhbWVfaGVpZ2h0OworfTsKKworLyogQWxsb2NhdGVzIGFuIGluc3RhbmNlIG9mIE1hY0NhbWVyYURldmljZSBzdHJ1Y3R1cmUuCisgKiBSZXR1cm46CisgKiAgQWxsb2NhdGVkIGluc3RhbmNlIG9mIE1hY0NhbWVyYURldmljZSBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUKKyAqICBhbHNvIHNldHMgJ29wYXF1ZScgZmllbGQgaW4gdGhlICdoZWFkZXInIHN0cnVjdHVyZSB0byBwb2ludCBiYWNrIHRvIHRoZQorICogIGNvbnRhaW5pbmcgTWFjQ2FtZXJhRGV2aWNlIGluc3RhbmNlLgorICovCitzdGF0aWMgTWFjQ2FtZXJhRGV2aWNlKgorX2NhbWVyYV9kZXZpY2VfYWxsb2Modm9pZCkKK3sKKyAgICBNYWNDYW1lcmFEZXZpY2UqIGNkID0gKE1hY0NhbWVyYURldmljZSopbWFsbG9jKHNpemVvZihNYWNDYW1lcmFEZXZpY2UpKTsKKyAgICBpZiAoY2QgIT0gTlVMTCkgeworICAgICAgICBtZW1zZXQoY2QsIDAsIHNpemVvZihNYWNDYW1lcmFEZXZpY2UpKTsKKyAgICAgICAgY2QtPmhlYWRlci5vcGFxdWUgPSBjZDsKKyAgICB9IGVsc2UgeworICAgICAgICBFKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIE1hY0NhbWVyYURldmljZSBpbnN0YW5jZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIHJldHVybiBjZDsKK30KKworLyogVW5pbml0aWFsaXplcyBhbmQgZnJlZXMgTWFjQ2FtZXJhRGV2aWNlIGRlc2NyaXB0b3IuCisgKiBOb3RlIHRoYXQgdXBvbiByZXR1cm4gZnJvbSB0aGlzIHJvdXRpbmUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGRlc2NyaXB0b3IKKyAqIHdpbGwgYmUgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2RldmljZV9mcmVlKE1hY0NhbWVyYURldmljZSogY2QpCit7CisgICAgaWYgKGNkICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGNkLT5kZXZpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgW2NkLT5kZXZpY2UgZnJlZV07CisgICAgICAgICAgICBbY2QtPmRldmljZSByZWxlYXNlXTsKKyAgICAgICAgICAgIGNkLT5kZXZpY2UgPSBuaWw7CisgICAgICAgIH0KKyAgICAgICAgQUZSRUUoY2QpOworICAgIH0gZWxzZSB7CisgICAgICAgIFcoIiVzOiBObyBkZXNjcmlwdG9yIiwgX19GVU5DVElPTl9fKTsKKyAgICB9Cit9CisKKy8qIFJlc2V0cyBjYW1lcmEgZGV2aWNlIGFmdGVyIGNhcHR1cmluZy4KKyAqIFNpbmNlIG5ldyBjYXB0dXJlIHJlcXVlc3QgbWF5IHJlcXVpcmUgZGlmZmVyZW50IGZyYW1lIGRpbWVuc2lvbnMgd2UgbXVzdAorICogcmVzZXQgZnJhbWUgaW5mbyBjYWNoZWQgaW4gdGhlIGNhcHR1cmUgd2luZG93LiBUaGUgb25seSB3YXkgdG8gZG8gdGhhdCB3b3VsZAorICogYmUgY2xvc2luZywgYW5kIHJlb3BlbmluZyBpdCBhZ2Fpbi4gKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2RldmljZV9yZXNldChNYWNDYW1lcmFEZXZpY2UqIGNkKQoreworICAgIGlmIChjZCAhPSBOVUxMICYmIGNkLT5kZXZpY2UpIHsKKyAgICAgICAgW2NkLT5kZXZpY2UgZnJlZV07CisgICAgICAgIGNkLT5kZXZpY2UgPSBbY2QtPmRldmljZSBpbml0XTsKKyAgICAgICAgY2QtPnN0YXJ0ZWQgPSAwOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ2FtZXJhRGV2aWNlKgorY2FtZXJhX2RldmljZV9vcGVuKGNvbnN0IGNoYXIqIG5hbWUsIGludCBpbnBfY2hhbm5lbCkKK3sKKyAgICBNYWNDYW1lcmFEZXZpY2UqIG1jZDsKKworICAgIG1jZCA9IF9jYW1lcmFfZGV2aWNlX2FsbG9jKCk7CisgICAgaWYgKG1jZCA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgTWFjQ2FtZXJhRGV2aWNlIGluc3RhbmNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1jZC0+ZGV2aWNlID0gW1tNYWNDYW1lcmEgYWxsb2NdIGluaXRdOworICAgIGlmIChtY2QtPmRldmljZSA9PSBuaWwpIHsKKyAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmbWNkLT5oZWFkZXI7Cit9CisKK2ludAorY2FtZXJhX2RldmljZV9zdGFydF9jYXB0dXJpbmcoQ2FtZXJhRGV2aWNlKiBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9oZWlnaHQpCit7CisgICAgTWFjQ2FtZXJhRGV2aWNlKiBtY2Q7CisKKyAgICAvKiBTYW5pdHkgY2hlY2tzLiAqLworICAgIGlmIChjZCA9PSBOVUxMIHx8IGNkLT5vcGFxdWUgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1jZCA9IChNYWNDYW1lcmFEZXZpY2UqKWNkLT5vcGFxdWU7CisgICAgaWYgKG1jZC0+ZGV2aWNlID09IG5pbCkgeworICAgICAgICBFKCIlczogQ2FtZXJhIGRldmljZSBpcyBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1jZC0+ZnJhbWVfd2lkdGggPSBmcmFtZV93aWR0aDsKKyAgICBtY2QtPmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodDsKKyAgICByZXR1cm4gMDsKK30KKworaW50CitjYW1lcmFfZGV2aWNlX3N0b3BfY2FwdHVyaW5nKENhbWVyYURldmljZSogY2QpCit7CisgICAgTWFjQ2FtZXJhRGV2aWNlKiBtY2Q7CisKKyAgICAvKiBTYW5pdHkgY2hlY2tzLiAqLworICAgIGlmIChjZCA9PSBOVUxMIHx8IGNkLT5vcGFxdWUgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1jZCA9IChNYWNDYW1lcmFEZXZpY2UqKWNkLT5vcGFxdWU7CisgICAgaWYgKG1jZC0+ZGV2aWNlID09IG5pbCkgeworICAgICAgICBFKCIlczogQ2FtZXJhIGRldmljZSBpcyBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJlc2V0IGNhcHR1cmUgc2V0dGluZ3MsIHNvIG5leHQgY2FsbCB0byBjYXB0dXJlIGNhbiBzZXQgaXRzIG93bi4gKi8KKyAgICBfY2FtZXJhX2RldmljZV9yZXNldChtY2QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorY2FtZXJhX2RldmljZV9yZWFkX2ZyYW1lKENhbWVyYURldmljZSogY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RnJhbWVCdWZmZXIqIGZyYW1lYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBleHBfY29tcCkKK3sKKyAgICBNYWNDYW1lcmFEZXZpY2UqIG1jZDsKKworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgaWYgKGNkID09IE5VTEwgfHwgY2QtPm9wYXF1ZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWNkID0gKE1hY0NhbWVyYURldmljZSopY2QtPm9wYXF1ZTsKKyAgICBpZiAobWNkLT5kZXZpY2UgPT0gbmlsKSB7CisgICAgICAgIEUoIiVzOiBDYW1lcmEgZGV2aWNlIGlzIG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFtY2QtPnN0YXJ0ZWQpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IFttY2QtPmRldmljZSBzdGFydF9jYXB0dXJpbmc6bWNkLT5mcmFtZV93aWR0aDptY2QtPmZyYW1lX2hlaWdodF07CisgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiAtMTsKKyAgICAgICAgbWNkLT5zdGFydGVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIFttY2QtPmRldmljZSByZWFkX2ZyYW1lOmZyYW1lYnVmZmVyczpmYnNfbnVtOnJfc2NhbGU6Z19zY2FsZTpiX3NjYWxlOmV4cF9jb21wXTsKK30KKwordm9pZAorY2FtZXJhX2RldmljZV9jbG9zZShDYW1lcmFEZXZpY2UqIGNkKQoreworICAgIC8qIFNhbml0eSBjaGVja3MuICovCisgICAgaWYgKGNkID09IE5VTEwgfHwgY2QtPm9wYXF1ZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfZnJlZSgoTWFjQ2FtZXJhRGV2aWNlKiljZC0+b3BhcXVlKTsKKyAgICB9Cit9CisKK2ludCBjYW1lcmFfZW51bWVyYXRlX2RldmljZXMoQ2FtZXJhSW5mbyogY2lzLCBpbnQgbWF4KSB7CisgICAgLyogQXJyYXkgY29udGFpbmluZyBlbXVsYXRlZCB3ZWJjYW0gZnJhbWUgZGltZW5zaW9ucy4KKyAgICAgKiBRVCBBUEkgcHJvdmlkZXMgZGV2aWNlIGluZGVwZW5kZW50IGZyYW1lIGRpbWVuc2lvbnMsIGJ5IHNjYWxpbmcgZnJhbWVzCisgICAgICogcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlIHRvIHdoYXRldmVyIGRpbWVuc2lvbnMgd2VyZSByZXF1ZXN0ZWQgZm9yIHRoZQorICAgICAqIG91dHB1dCBkZXZpY2UuIFNvLCB3ZSBjYW4ganVzdCB1c2UgYSBzbWFsbCBzZXQgb2YgZnJhbWUgZGltZW5zaW9ucyB0bworICAgICAqIGVtdWxhdGUuCisgICAgICovCisgICAgc3RhdGljIGNvbnN0IENhbWVyYUZyYW1lRGltIF9lbXVsYXRlX2RpbXNbXSA9IHsKKyAgICAgICAgICAgIC8qIEVtdWxhdGVzIDY0MHg0ODAgZnJhbWUuICovCisgICAgICAgICAgICB7NjQwLCA0ODB9LAorICAgICAgICAgICAgLyogRW11bGF0ZXMgMzUyeDI4OCBmcmFtZSAocmVxdWlyZWQgYnkgY2FtZXJhIGZyYW1ld29yaykuICovCisgICAgICAgICAgICB7MzUyLCAyODh9LAorICAgICAgICAgICAgLyogRW11bGF0ZXMgMzIweDI0MCBmcmFtZSAocmVxdWlyZWQgYnkgY2FtZXJhIGZyYW1ld29yaykuICovCisgICAgICAgICAgICB7MzIwLCAyNDB9LAorICAgICAgICAgICAgLyogRW11bGF0ZXMgMTc2eDE0NCBmcmFtZSAocmVxdWlyZWQgYnkgY2FtZXJhIGZyYW1ld29yaykuICovCisgICAgICAgICAgICB7MTc2LCAxNDR9fTsKKworICAgIC8qIE9idGFpbiBkZWZhdWx0IHZpZGVvIGRldmljZS4gUVQgQVBJIGRvZXNuJ3QgcmVhbGx5IHByb3ZpZGUgYSByZWxpYWJsZQorICAgICAqIHdheSB0byBpZGVudGlmeSBjYW1lcmEgZGV2aWNlcy4gVGhlcmUgaXMgYSBRVENhcHR1cmVEZXZpY2U6OnVuaXF1ZUlkCisgICAgICogbWV0aG9kIHRoYXQgc3VwcG9zZWRseSBkb2VzIHRoYXQsIGJ1dCBpbiBzb21lIGNhc2VzIGl0IGp1c3QgZG9lc24ndAorICAgICAqIHdvcmsuIFVudGlsIHdlIGZpZ3VyZSBvdXQgYSByZWxpYWJsZSBkZXZpY2UgaWRlbnRpZmljYXRpb24sIHdlIHdpbGwKKyAgICAgKiBzdGljayB0byB1c2luZyBvbmx5IG9uZSAoZGVmYXVsdCkgY2FtZXJhIGZvciBlbXVsYXRpb24uICovCisgICAgUVRDYXB0dXJlRGV2aWNlKiB2aWRlb19kZXYgPQorICAgICAgICBbUVRDYXB0dXJlRGV2aWNlIGRlZmF1bHRJbnB1dERldmljZVdpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107CisgICAgaWYgKHZpZGVvX2RldiA9PSBuaWwpIHsKKyAgICAgICAgRCgiTm8gd2ViIGNhbWVyYXMgYXJlIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogT2J0YWluIHBpeGVsIGZvcm1hdCBmb3IgdGhlIGRldmljZS4gKi8KKyAgICBOU0FycmF5KiBwaXhfZm9ybWF0cyA9IFt2aWRlb19kZXYgZm9ybWF0RGVzY3JpcHRpb25zXTsKKyAgICBpZiAocGl4X2Zvcm1hdHMgPT0gbmlsIHx8IFtwaXhfZm9ybWF0cyBjb3VudF0gPT0gMCkgeworICAgICAgICBFKCJVbmFibGUgdG8gb2J0YWluIHBpeGVsIGZvcm1hdCBmb3IgdGhlIGRlZmF1bHQgY2FtZXJhIGRldmljZS4iKTsKKyAgICAgICAgW3ZpZGVvX2RldiByZWxlYXNlXTsKKyAgICAgICAgdmlkZW9fZGV2ID0gbmlsOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgdWludDMyX3QgcXRfcGl4X2Zvcm1hdCA9IFtbcGl4X2Zvcm1hdHMgb2JqZWN0QXRJbmRleDowXSBmb3JtYXRUeXBlXTsKKyAgICBbcGl4X2Zvcm1hdHMgcmVsZWFzZV07CisKKyAgICAvKiBPYnRhaW4gRk9VUkNDIHBpeGVsIGZvcm1hdCBmb3IgdGhlIGRldmljZS4gKi8KKyAgICBjaXNbMF0ucGl4ZWxfZm9ybWF0ID0gX1FUdG9GT1VSQ0MocXRfcGl4X2Zvcm1hdCk7CisgICAgaWYgKGNpc1swXS5waXhlbF9mb3JtYXQgPT0gMCkgeworICAgICAgICBBVkNhcHR1cmVEZXZpY2UgKnZpZGVvRGV2aWNlID0gW0FWQ2FwdHVyZURldmljZSBkZWZhdWx0RGV2aWNlV2l0aE1lZGlhVHlwZTpBVk1lZGlhVHlwZVZpZGVvXTsKKyAgICAgICAgZm9yKEFWQ2FwdHVyZURldmljZUZvcm1hdCAqdkZvcm1hdCBpbiBbdmlkZW9EZXZpY2UgZm9ybWF0c10pIHsKKyAgICAgICAgICAgIENNRm9ybWF0RGVzY3JpcHRpb25SZWYgZGVzY3JpcHRpb249IHZGb3JtYXQuZm9ybWF0RGVzY3JpcHRpb247CisgICAgICAgICAgICBjaXNbMF0ucGl4ZWxfZm9ybWF0ID0gX1FUdG9GT1VSQ0MoQ01Gb3JtYXREZXNjcmlwdGlvbkdldE1lZGlhU3ViVHlwZShkZXNjcmlwdGlvbikpOworICAgICAgICAgICAgaWYgKGNpc1swXS5waXhlbF9mb3JtYXQpIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjaXNbMF0ucGl4ZWxfZm9ybWF0ID09IDApIHsKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LiAqLworICAgICAgICBFKCJQaXhlbCBmb3JtYXQgJyUuNHMnIHJlcG9ydGVkIGJ5IHRoZSBjYW1lcmEgZGV2aWNlIGlzIHVuc3VwcG9ydGVkIiwKKyAgICAgICAgICAoY29uc3QgY2hhciopJnF0X3BpeF9mb3JtYXQpOworICAgICAgICBbdmlkZW9fZGV2IHJlbGVhc2VdOworICAgICAgICB2aWRlb19kZXYgPSBuaWw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgY2FtZXJhIGluZm8gc3RydWN0dXJlLiAqLworICAgIGNpc1swXS5mcmFtZV9zaXplcyA9IChDYW1lcmFGcmFtZURpbSopbWFsbG9jKHNpemVvZihfZW11bGF0ZV9kaW1zKSk7CisgICAgaWYgKGNpc1swXS5mcmFtZV9zaXplcyAhPSBOVUxMKSB7CisgICAgICAgIGNpc1swXS5mcmFtZV9zaXplc19udW0gPSBzaXplb2YoX2VtdWxhdGVfZGltcykgLyBzaXplb2YoKl9lbXVsYXRlX2RpbXMpOworICAgICAgICBtZW1jcHkoY2lzWzBdLmZyYW1lX3NpemVzLCBfZW11bGF0ZV9kaW1zLCBzaXplb2YoX2VtdWxhdGVfZGltcykpOworICAgICAgICBjaXNbMF0uZGV2aWNlX25hbWUgPSBBU1RSRFVQKCJ3ZWJjYW0wIik7CisgICAgICAgIGNpc1swXS5pbnBfY2hhbm5lbCA9IDA7CisgICAgICAgIGNpc1swXS5kaXNwbGF5X25hbWUgPSBBU1RSRFVQKCJ3ZWJjYW0wIik7CisgICAgICAgIGNpc1swXS5pbl91c2UgPSAwOworICAgICAgICBbdmlkZW9fZGV2IHJlbGVhc2VdOworICAgICAgICB2aWRlb19kZXYgPSBuaWw7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNhbWVyYSBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgW3ZpZGVvX2RldiByZWxlYXNlXTsKKyAgICAgICAgdmlkZW9fZGV2ID0gbmlsOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLXdpbmRvd3MuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS13aW5kb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFlOGJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS13aW5kb3dzLmNwcApAQCAtMCwwICsxLDEwMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQ29udGFpbnMgY29kZSBjYXB0dXJpbmcgdmlkZW8gZnJhbWVzIGZyb20gYSBjYW1lcmEgZGV2aWNlIG9uIFdpbmRvd3MuCisgKiBUaGlzIGNvZGUgdXNlcyBjYXBYeHggQVBJLCBhdmFpbGFibGUgdmlhIGNhcENyZWF0ZUNhcHR1cmVXaW5kb3cuCisgKi8KKworLyogTk9URTogT24gV2luZG93cywgd2UgbWFrZSBjZXJ0YWluIGFzc3VtcHRpb25zIGFib3V0ICogaG93IG1hbnkgdGhyZWFkcworICogYXJlIGFjY2Vzc2luZyAqIHRoZSBjYW1lcmEgY2FwdHVyZSBBUEkgYXQgYSB0aW1lOgorICoKKyAqIE5hbWVseSwgdGhhdCBvbmx5IE9ORSBjYW1lcmEgdGhyZWFkIGlzIGFjY2Vzc2luZyB0aGUgY2FtZXJhIGNhcHR1cmUgQVBJCisgKiBhdCBhbnkgdGltZS4KKyAqCisgKiBNb3JlIGRldGFpbHM6CisgKgorICogRmlyc3QsIHNvbWUgYmFja2dyb3VuZC4gVGhlIHdpbmRvd3MgY2FtZXJhIGNhcHR1cmUgbGlicmFyeSAodmZ3MzIpCisgKiBjYW5ub3QgYmUgb3BlcmF0ZWQgb24gZnJvbSBtdWx0aXBsZSB0aHJlYWRzLAorICogb3Igc3RyYW5nZXMgZnJlZXplcy9jcmFzaGVzIHdpbGwgcmVzdWx0LgorICoKKyAqIFRoZXJlZm9yZSwgYWxsIHZmdzMyIGNhbGxzIHdpbGwgZ28gdGhyb3VnaCBhIHNpbmdsZSB0aHJlYWQsCisgKiBhbmQgdGhlIENhbWVyYURldmljZSBBUEkgb24gd2luZG93cworICogbWVyZWx5IHNldHMgYXJndW1lbnRzIGFuZCBzaWduYWxzIHRoYXQgdGhyZWFkLgorICoKKyAqIFRoZSBzdGF0ZSBtYWNoaW5lIHJ1bm5pbmcgb24gdGhhdCB0aHJlYWQKKyAqIHRoZW4gYXNzdW1lcyB0aGF0IG9ubHkgb25lIG90aGVyIHRocmVhZCBpcyBpbnRlcmFjdGluZworICogd2l0aCBpdCBhdCBhIHRpbWUuIFRoaXMgaXMgYmVjYXVzZQorICogd2UgYXNzdW1lIHRoZSBleGlzdGVuY2Ugb2Ygb25seSBvbmUgY2FtZXJhIGNsaWVudCwKKyAqIHdoaWNoIHJlc3VsdHMgaW4gb25seSBzZXJpYWwgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nCisgKiBjYW1lcmEgQVBJLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWZvcm1hdC1jb252ZXJ0ZXJzLmgiCisKK3VzaW5nIFRocmVhZCA9IGFuZHJvaWQ6OmJhc2U6OlRocmVhZDsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dmZ3Lmg+CisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgIEUoLi4uKSAgICBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lICBXKC4uLikgICAgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lICBEKC4uLikgICAgVkVSQk9TRV9QUklOVChjYW1lcmEsX19WQV9BUkdTX18pCisjZGVmaW5lICBEX0FDVElWRSAgVkVSQk9TRV9DSEVDSyhjYW1lcmEpCisKKy8qIHRoZSBUKC4uLikgbWFjcm8gaXMgdXNlZCB0byBkdW1wIHRyYWZmaWMgKi8KKyNkZWZpbmUgIFRfQUNUSVZFICAgMAorCisjaWYgVF9BQ1RJVkUKKyNkZWZpbmUgIFQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKGNhbWVyYSxfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBUKC4uLikgICAgKCh2b2lkKTApCisjZW5kaWYKKworLyogRGVmYXVsdCBuYW1lIGZvciB0aGUgY2FwdHVyZSB3aW5kb3cuICovCitzdGF0aWMgY29uc3QgY2hhciogX2RlZmF1bHRfd2luZG93X25hbWUgPSAiQW5kcm9pZEVtdWxhdG9yVkMiOworCit0eXBlZGVmIHN0cnVjdCBXbmRDYW1lcmFEZXZpY2UgV25kQ2FtZXJhRGV2aWNlOworLyogV2luZG93cy1zcGVjaWZpYyBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IuICovCitzdHJ1Y3QgV25kQ2FtZXJhRGV2aWNlIHsKKyAgICAvKiBDb21tb24gY2FtZXJhIGRldmljZSBkZXNjcmlwdG9yLiAqLworICAgIENhbWVyYURldmljZSAgICAgICAgaGVhZGVyOworICAgIC8qIENhcHR1cmUgd2luZG93IG5hbWUuIChkZWZhdWx0IGlzIEFuZHJvaWRFbXVsYXRvclZDKSAqLworICAgIGNoYXIqICAgICAgICAgICAgICAgd2luZG93X25hbWU7CisgICAgLyogSW5wdXQgY2hhbm5lbCAodmlkZW8gZHJpdmVyIGluZGV4KS4gKGRlZmF1bHQgaXMgMCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGlucHV0X2NoYW5uZWw7CisKKyAgICAvKgorICAgICAqIFNldCB3aGVuIGZyYW1ld29yayBnZXRzIGluaXRpYWxpemVkLgorICAgICAqLworCisgICAgLyogVmlkZW8gY2FwdHVyaW5nIHdpbmRvdy4gTnVsbCBpbmRpY2F0ZXMgdGhhdCBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZC4gKi8KKyAgICBIV05EICAgICAgICAgICAgICAgIGNhcF93aW5kb3c7CisgICAgLyogREMgZm9yIGZyYW1lIGJpdG1hcCBtYW5pcHVsYXRpb24uIE51bGwgaW5kaWNhdGVzIHRoYXQgZnJhbWVzIGFyZSBub3QKKyAgICAgKiBiZWluZyBjYXB0dXJpbmcuICovCisgICAgSERDICAgICAgICAgICAgICAgICBkYzsKKyAgICAvKiBCaXRtYXAgaW5mbyBmb3IgdGhlIGZyYW1lcyBvYnRhaW5lZCBmcm9tIHRoZSB2aWRlbyBjYXB0dXJlIGRyaXZlci4gKi8KKyAgICBCSVRNQVBJTkZPKiAgICAgICAgIGZyYW1lX2JpdG1hcDsKKyAgICAgLyogQml0bWFwIGluZm8gdG8gdXNlIGZvciBHZXRESUJpdHMgY2FsbHMuIFdlIGNhbid0IHJlYWxseSB1c2UgYml0bWFwIGluZm8KKyAgICAgICogb2J0YWluZWQgZnJvbSB0aGUgdmlkZW8gY2FwdHVyZSBkcml2ZXIsIGJlY2F1c2Ugb2YgdGhlIHR3byBpc3N1ZXMuIEZpcnN0LAorICAgICAgKiB0aGUgZHJpdmVyIG1heSByZXR1cm4gYW4gaW5jb21wYXRpYmxlICdiaUNvbXByZXNzdGlvbicgdmFsdWUuIEZvciBpbnN0YW5jZSwKKyAgICAgICogc29tZXRpbWVzIGl0IHJldHVybnMgYSAiZm91cmNjJyBwaXhlbCBmb3JtYXQgdmFsdWUgaW5zdGVhZCBvZiBCSV9YWFgsCisgICAgICAqIHdoaWNoIGNhdXNlcyBHZXRESUJpdHMgdG8gZmFpbC4gU2Vjb25kLCB0aGUgYml0bWFwIHRoYXQgcmVwcmVzZW50cyBhIGZyYW1lCisgICAgICAqIHRoYXQgaGFzIGJlZW4gYWN0dWFsbHkgb2J0YWluZWQgZnJvbSB0aGUgZGV2aWNlIGlzIG5vdCBuZWNlc3NhcmlseSBtYXRjaGVzCisgICAgICAqIGJpdG1hcCBpbmZvIHRoYXQgY2FwdHVyZSBkcml2ZXIgaGFzIHJldHVybmVkLiBTb21ldGltZXMgdGhlIGNhcHR1cmVkIGJpdG1hcAorICAgICAgKiBpcyBhIDMyLWJpdCBSR0IsIHdoaWxlIGJpdCBjb3VudCByZXBvcnRlZCBieSB0aGUgZHJpdmVyIGlzIDE2LiBTbywgdG8KKyAgICAgICogYWRkcmVzcyB0aGVzZSBpc3N1ZXMgd2UgbmVlZCB0byBoYXZlIGFub3RoZXIgYml0bWFwIGluZm8sIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgICogaW4gR2V0RElCaXRzIGNhbGxzLiAqLworICAgIEJJVE1BUElORk8qICAgICAgICAgZ2RpX2JpdG1hcDsKKyAgICAvKiBGcmFtZWJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gZml0IHRoZSBmcmFtZS4gKi8KKyAgICB1aW50OF90KiAgICAgICAgICAgIGZyYW1lYnVmZmVyOworICAgIC8qIEZyYW1lYnVmZmVyIHNpemUuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcl9zaXplOworICAgIC8qIEZyYW1lYnVmZmVyJ3MgcGl4ZWwgZm9ybWF0LiAqLworICAgIHVpbnQzMl90ICAgICAgICAgICAgcGl4ZWxfZm9ybWF0OworICAgIC8qIElmICE9IDAsIGZyYW1lIGJpdG1hcCBpcyAidG9wLWRvd24iLiBJZiAwLCBmcmFtZSBiaXRtYXAgaXMgImJvdHRvbS11cCIuICovCisgICAgaW50ICAgICAgICAgICAgICAgICBpc190b3BfZG93bjsKKyAgICAvKiBGbGFncyB3aGV0aGVyIGZyYW1lIHNob3VsZCBiZSBjYXB0dXJlZCB1c2luZyBjbGlwYm9hcmQgKDEpLCBvciB2aWEgZnJhbWUKKyAgICAgKiBjYWxsYmFjayAoMCkgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZV9jbGlwYm9hcmQ7CisgICAgLyogQ29udGFpbnMgbGFzdCBmcmFtZSBjYXB0dXJlZCB2aWEgZnJhbWUgY2FsbGJhY2suICovCisgICAgdm9pZCogICAgICAgICAgICAgICBsYXN0X2ZyYW1lOworICAgIC8qIEJ5dGUgc2l6ZSBvZiB0aGUgJ2xhc3RfZnJhbWUnIGJ1ZmZlci4gKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIGxhc3RfZnJhbWVfc2l6ZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgIENhbWVyYURldmljZSByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWxsb2NhdGVzIGFuIGluc3RhbmNlIG9mIFduZENhbWVyYURldmljZSBzdHJ1Y3R1cmUuCisgKiBSZXR1cm46CisgKiAgQWxsb2NhdGVkIGluc3RhbmNlIG9mIFduZENhbWVyYURldmljZSBzdHJ1Y3R1cmUuIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUKKyAqICBhbHNvIHNldHMgJ29wYXF1ZScgZmllbGQgaW4gdGhlICdoZWFkZXInIHN0cnVjdHVyZSB0byBwb2ludCBiYWNrIHRvIHRoZQorICogIGNvbnRhaW5pbmcgV25kQ2FtZXJhRGV2aWNlIGluc3RhbmNlLgorICovCitzdGF0aWMgV25kQ2FtZXJhRGV2aWNlKgorX2NhbWVyYV9kZXZpY2VfYWxsb2Modm9pZCkKK3sKKyAgICBXbmRDYW1lcmFEZXZpY2UqIGNkID0gKFduZENhbWVyYURldmljZSopbWFsbG9jKHNpemVvZihXbmRDYW1lcmFEZXZpY2UpKTsKKyAgICBpZiAoY2QgIT0gTlVMTCkgeworICAgICAgICBtZW1zZXQoY2QsIDAsIHNpemVvZihXbmRDYW1lcmFEZXZpY2UpKTsKKyAgICAgICAgY2QtPmhlYWRlci5vcGFxdWUgPSBjZDsKKyAgICB9IGVsc2UgeworICAgICAgICBFKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIFduZENhbWVyYURldmljZSBpbnN0YW5jZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorICAgIHJldHVybiBjZDsKK30KKworLyogVW5pbml0aWFsaXplcyBhbmQgZnJlZXMgV25kQ2FtZXJhRGV2aWNlIGRlc2NyaXB0b3IuCisgKiBOb3RlIHRoYXQgdXBvbiByZXR1cm4gZnJvbSB0aGlzIHJvdXRpbmUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGRlc2NyaXB0b3IKKyAqIHdpbGwgYmUgZnJlZWQuCisgKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2RldmljZV9mcmVlKFduZENhbWVyYURldmljZSogY2QpCit7CisgICAgaWYgKGNkICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGNkLT5jYXBfd2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIERpc2Nvbm5lY3QgZnJvbSB0aGUgZHJpdmVyLiAqLworICAgICAgICAgICAgY2FwRHJpdmVyRGlzY29ubmVjdChjZC0+Y2FwX3dpbmRvdyk7CisKKyAgICAgICAgICAgIGlmIChjZC0+ZGMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFcoIiVzOiBGcmFtZXMgc2hvdWxkIG5vdCBiZSBjYXB0dXJpbmcgYXQgdGhpcyBwb2ludCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIFJlbGVhc2VEQyhjZC0+Y2FwX3dpbmRvdywgY2QtPmRjKTsKKyAgICAgICAgICAgICAgICBjZC0+ZGMgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRGVzdHJveSB0aGUgY2FwdHVyaW5nIHdpbmRvdy4gKi8KKyAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coY2QtPmNhcF93aW5kb3cpOworICAgICAgICAgICAgY2QtPmNhcF93aW5kb3cgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+Z2RpX2JpdG1hcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5nZGlfYml0bWFwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2QtPmZyYW1lX2JpdG1hcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5mcmFtZV9iaXRtYXApOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+d2luZG93X25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShjZC0+d2luZG93X25hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+ZnJhbWVidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShjZC0+ZnJhbWVidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+bGFzdF9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBBRlJFRShjZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVygiJXM6IE5vIGRlc2NyaXB0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworLyogUmVzZXRzIGNhbWVyYSBkZXZpY2UgYWZ0ZXIgY2FwdHVyaW5nLgorICogU2luY2UgbmV3IGNhcHR1cmUgcmVxdWVzdCBtYXkgcmVxdWlyZSBkaWZmZXJlbnQgZnJhbWUgZGltZW5zaW9ucyB3ZSBtdXN0CisgKiByZXNldCBmcmFtZSBpbmZvIGNhY2hlZCBpbiB0aGUgY2FwdHVyZSB3aW5kb3cuIFRoZSBvbmx5IHdheSB0byBkbyB0aGF0IHdvdWxkCisgKiBiZSBjbG9zaW5nLCBhbmQgcmVvcGVuaW5nIGl0IGFnYWluLiAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfZGV2aWNlX3Jlc2V0KFduZENhbWVyYURldmljZSogY2QpCit7CisgICAgaWYgKGNkICE9IE5VTEwgJiYgY2QtPmNhcF93aW5kb3cgIT0gTlVMTCkgeworICAgICAgICBjYXBEcml2ZXJEaXNjb25uZWN0KGNkLT5jYXBfd2luZG93KTsKKyAgICAgICAgaWYgKGNkLT5kYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBSZWxlYXNlREMoY2QtPmNhcF93aW5kb3csIGNkLT5kYyk7CisgICAgICAgICAgICBjZC0+ZGMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+Z2RpX2JpdG1hcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5nZGlfYml0bWFwKTsKKyAgICAgICAgICAgIGNkLT5nZGlfYml0bWFwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2QtPmZyYW1lX2JpdG1hcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5mcmFtZV9iaXRtYXApOworICAgICAgICAgICAgY2QtPmZyYW1lX2JpdG1hcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNkLT5mcmFtZWJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5mcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICBjZC0+ZnJhbWVidWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChjZC0+bGFzdF9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGNkLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgICAgIGNkLT5sYXN0X2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjZC0+bGFzdF9mcmFtZV9zaXplID0gMDsKKworICAgICAgICAvKiBSZWNyZWF0ZSB0aGUgY2FwdHVyaW5nIHdpbmRvdy4gKi8KKyAgICAgICAgRGVzdHJveVdpbmRvdyhjZC0+Y2FwX3dpbmRvdyk7CisgICAgICAgIGNkLT5jYXBfd2luZG93ID0gY2FwQ3JlYXRlQ2FwdHVyZVdpbmRvdyhjZC0+d2luZG93X25hbWUsIFdTX0NISUxELCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgSFdORF9NRVNTQUdFLCAxKTsKKyAgICAgICAgaWYgKGNkLT5jYXBfd2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFNhdmUgY2FwdHVyZSB3aW5kb3cgZGVzY3JpcHRvciBhcyB3aW5kb3cncyB1c2VyIGRhdGEuICovCisgICAgICAgICAgICBjYXBTZXRVc2VyRGF0YShjZC0+Y2FwX3dpbmRvdywgY2QpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBHZXRzIGFuIGFic29sdXRlIHZhbHVlIG91dCBvZiBhIHNpZ25lZCBpbnRlZ2VyLiAqLworc3RhdGljIF9faW5saW5lX18gaW50CitfYWJzKGludCB2YWwpCit7CisgICAgcmV0dXJuICh2YWwgPCAwKSA/IC12YWwgOiB2YWw7Cit9CisKKy8qIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIGEgZnJhbWUgZ2V0cyBjYXB0dXJlZCBpbiBjYXBHcmFiRnJhbWVOb1N0b3AgKi8KK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLCitfb25fY2FwdHVyZWRfZnJhbWUoSFdORCBod25kLCBMUFZJREVPSERSIGhkcikKK3sKKyAgICAvKiBDYXB0dXJlIHdpbmRvdyBkZXNjcmlwdG9yIGlzIHNhdmVkIGluIHdpbmRvdydzIHVzZXIgZGF0YS4gKi8KKyAgICBXbmRDYW1lcmFEZXZpY2UqIHdjZCA9IChXbmRDYW1lcmFEZXZpY2UqKWNhcEdldFVzZXJEYXRhKGh3bmQpOworCisgICAgLyogUmVhbGxvY2F0ZSBmcmFtZSBidWZmZXIgKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAod2NkLT5sYXN0X2ZyYW1lX3NpemUgPCBoZHItPmR3Qnl0ZXNVc2VkKSB7CisgICAgICAgIHdjZC0+bGFzdF9mcmFtZV9zaXplID0gaGRyLT5kd0J5dGVzVXNlZDsKKyAgICAgICAgaWYgKHdjZC0+bGFzdF9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHdjZC0+bGFzdF9mcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgd2NkLT5sYXN0X2ZyYW1lID0gbWFsbG9jKHdjZC0+bGFzdF9mcmFtZV9zaXplKTsKKyAgICB9CisKKyAgICAvKiBDb3B5IGNhcHR1cmVkIGZyYW1lLiAqLworICAgIG1lbWNweSh3Y2QtPmxhc3RfZnJhbWUsIGhkci0+bHBEYXRhLCBoZHItPmR3Qnl0ZXNVc2VkKTsKKworICAgIC8qIElmIGJpQ29tcHJlc3Npb24gaXMgc2V0IHRvIGRlZmF1bHQgKFJHQiksIHNldCBjb3JyZWN0IHBpeGVsIGZvcm1hdAorICAgICAqIGZvciBjb252ZXJ0ZXJzLiAqLworICAgIGlmICh3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpQ29tcHJlc3Npb24gPT0gQklfUkdCKSB7CisgICAgICAgIGlmICh3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMzIpIHsKKyAgICAgICAgICAgIHdjZC0+cGl4ZWxfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOworICAgICAgICB9IGVsc2UgaWYgKHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSAxNikgeworICAgICAgICAgICAgd2NkLT5waXhlbF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCNTY1OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2NkLT5waXhlbF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3Y2QtPnBpeGVsX2Zvcm1hdCA9IHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbjsKKyAgICB9CisKKyAgICByZXR1cm4gKExSRVNVTFQpMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhRGV2aWNlIEFQSSBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIENhbWVyYURldmljZSoKK2NtZF9jYW1lcmFfZGV2aWNlX29wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGlucF9jaGFubmVsKQoreworICAgIFduZENhbWVyYURldmljZSogd2NkOworCisgICAgLyogQWxsb2NhdGUgZGVzY3JpcHRvciBhbmQgaW5pdGlhbGl6ZSB3aW5kb3dzLXNwZWNpZmljIGZpZWxkcy4gKi8KKyAgICB3Y2QgPSBfY2FtZXJhX2RldmljZV9hbGxvYygpOworICAgIGlmICh3Y2QgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlIFduZENhbWVyYURldmljZSBpbnN0YW5jZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3Y2QtPndpbmRvd19uYW1lID0gKG5hbWUgIT0gTlVMTCkgPyBBU1RSRFVQKG5hbWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1RSRFVQKF9kZWZhdWx0X3dpbmRvd19uYW1lKTsKKyAgICBpZiAod2NkLT53aW5kb3dfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gc2F2ZSB3aW5kb3cgbmFtZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX2ZyZWUod2NkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdjZC0+aW5wdXRfY2hhbm5lbCA9IGlucF9jaGFubmVsOworCisgICAgLyogQ3JlYXRlIGNhcHR1cmUgd2luZG93IHRoYXQgaXMgYSBjaGlsZCBvZiBIV05EX01FU1NBR0Ugd2luZG93LgorICAgICAqIFdlIG1ha2UgaXQgaW52aXNpYmxlLCBzbyBpdCBkb2Vzbid0IG1lc3Mgd2l0aCB0aGUgVUkuIEFsc28KKyAgICAgKiBub3RlIHRoYXQgd2Ugc3VwcGx5IHN0YW5kYXJkIEhXTkRfTUVTU0FHRSB3aW5kb3cgaGFuZGxlIGFzCisgICAgICogdGhlIHBhcmVudCB3aW5kb3csIHNpbmNlIHdlIGRvbid0IHdhbnQgdmlkZW8gY2FwdHVyaW5nCisgICAgICogbWFjaGluZXJ5IHRvIGJlIGRlcGVuZGVudCBvbiB0aGUgZGV0YWlscyBvZiBvdXIgVUkuICovCisgICAgd2NkLT5jYXBfd2luZG93ID0gY2FwQ3JlYXRlQ2FwdHVyZVdpbmRvdyh3Y2QtPndpbmRvd19uYW1lLCBXU19DSElMRCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEhXTkRfTUVTU0FHRSwgMSk7CisgICAgaWYgKHdjZC0+Y2FwX3dpbmRvdyA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gY3JlYXRlIHZpZGVvIGNhcHR1cmluZyB3aW5kb3cgJyVzJzogJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2NkLT53aW5kb3dfbmFtZSwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBfY2FtZXJhX2RldmljZV9mcmVlKHdjZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBTYXZlIGNhcHR1cmUgd2luZG93IGRlc2NyaXB0b3IgYXMgd2luZG93J3MgdXNlciBkYXRhLiAqLworICAgIGNhcFNldFVzZXJEYXRhKHdjZC0+Y2FwX3dpbmRvdywgd2NkKTsKKworICAgIHJldHVybiAmd2NkLT5oZWFkZXI7Cit9CisKK3N0YXRpYyBpbnQKK2NtZF9jYW1lcmFfZGV2aWNlX3N0YXJ0X2NhcHR1cmluZyhDYW1lcmFEZXZpY2UqIGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2hlaWdodCkKK3sKKyAgICBXbmRDYW1lcmFEZXZpY2UqIHdjZDsKKyAgICBIQklUTUFQIGJtX2hhbmRsZTsKKyAgICBCSVRNQVAgIGJpdG1hcDsKKyAgICBzaXplX3QgZm9ybWF0X2luZm9fc2l6ZTsKKyAgICBDQVBUVVJFUEFSTVMgY2FwX3BhcmFtOworCisgICAgaWYgKGNkID09IE5VTEwgfHwgY2QtPm9wYXF1ZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2NkID0gKFduZENhbWVyYURldmljZSopY2QtPm9wYXF1ZTsKKworICAgIC8qIHdjZC0+ZGMgaXMgYW4gaW5kaWNhdG9yIG9mIGNhcHR1cmluZzogIU5VTEwgLSBjYXB0dXJpbmcsIE5VTEwgLSBub3QgKi8KKyAgICBpZiAod2NkLT5kYyAhPSBOVUxMKSB7CisgICAgICAgIFcoIiVzOiBDYXB0dXJpbmcgaXMgYWxyZWFkeSBvbiBvbiBkZXZpY2UgJyVzJyIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCB3Y2QtPndpbmRvd19uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQ29ubmVjdCBjYXB0dXJlIHdpbmRvdyB0byB0aGUgdmlkZW8gY2FwdHVyZSBkcml2ZXIuICovCisgICAgaWYgKCFjYXBEcml2ZXJDb25uZWN0KHdjZC0+Y2FwX3dpbmRvdywgd2NkLT5pbnB1dF9jaGFubmVsKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogR2V0IGN1cnJlbnQgZnJhbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZHJpdmVyLiAqLworICAgIGZvcm1hdF9pbmZvX3NpemUgPSBjYXBHZXRWaWRlb0Zvcm1hdFNpemUod2NkLT5jYXBfd2luZG93KTsKKyAgICBpZiAoZm9ybWF0X2luZm9fc2l6ZSA9PSAwKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gZ2V0IHZpZGVvIGZvcm1hdCBzaXplOiAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2NkLT5mcmFtZV9iaXRtYXAgPSAoQklUTUFQSU5GTyopbWFsbG9jKGZvcm1hdF9pbmZvX3NpemUpOworICAgIGlmICh3Y2QtPmZyYW1lX2JpdG1hcCA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZnJhbWUgYml0bWFwIGluZm8gYnVmZmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQod2NkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWNhcEdldFZpZGVvRm9ybWF0KHdjZC0+Y2FwX3dpbmRvdywgd2NkLT5mcmFtZV9iaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfaW5mb19zaXplKSkgeworICAgICAgICBFKCIlczogVW5hYmxlIHRvIG9idGFpbiB2aWRlbyBmb3JtYXQ6ICVkIiwgX19GVU5DVElPTl9fLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBMZXRzIHNlZSBpZiB3ZSBuZWVkIHRvIHNldCBkaWZmZXJlbnQgZnJhbWUgZGltZW5zaW9ucyAqLworICAgIGlmICh3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpV2lkdGggIT0gZnJhbWVfd2lkdGggfHwKKyAgICAgICAgICAgIGFicyh3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0KSAhPSBmcmFtZV9oZWlnaHQpIHsKKyAgICAgICAgLyogRGltZW5zaW9ucyBkb24ndCBtYXRjaC4gU2V0IG5ldyBmcmFtZSBpbmZvLiAqLworICAgICAgICB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpV2lkdGggPSBmcmFtZV93aWR0aDsKKyAgICAgICAgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCA9IGZyYW1lX2hlaWdodDsKKyAgICAgICAgLyogV2UgbmVlZCB0byByZWNhbGN1bGF0ZSBpbWFnZSBzaXplLCBzaW5jZSB0aGUgY2FwdHVyZSB3aW5kb3cgLyBkcml2ZXIKKyAgICAgICAgICogd2lsbCB1c2UgaW1hZ2Ugc2l6ZSBwcm92aWRlZCBieSB1cy4gKi8KKyAgICAgICAgaWYgKHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSAyNCkgeworICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlIHRoYXQgbWF5IHJlcXVpcmUgV09SRCBib3VuZGFyeSBhbGlnbm1lbnQuICovCisgICAgICAgICAgICB1aW50MzJfdCBicGwgPSAoZnJhbWVfd2lkdGggKiAzICsgMSkgJiB+MTsKKyAgICAgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UgPSBicGwgKiBmcmFtZV9oZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlID0KKyAgICAgICAgICAgICAgICAoZnJhbWVfd2lkdGggKiBmcmFtZV9oZWlnaHQgKiB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpQml0Q291bnQpIC8gODsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNhcFNldFZpZGVvRm9ybWF0KHdjZC0+Y2FwX3dpbmRvdywgd2NkLT5mcmFtZV9iaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2luZm9fc2l6ZSkpIHsKKyAgICAgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gc2V0IHZpZGVvIGZvcm1hdDogJWQiLCBfX0ZVTkNUSU9OX18sIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAod2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID4gQklfUE5HKSB7CisgICAgICAgIEQoIiVzOiBWaWRlbyBjYXB0dXJpbmcgZHJpdmVyIGhhcyByZXBvcnRlZCBwaXhlbCBmb3JtYXQgJS40cyIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCAoY29uc3QgY2hhciopJndjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbik7CisgICAgfQorCisgICAgLyogTW9zdCBvZiB0aGUgdGltZSBmcmFtZSBiaXRtYXBzIGNvbWUgaW4gImJvdHRvbS11cCIgZm9ybSwgd2hlcmUgaXRzIG9yaWdpbgorICAgICAqIGlzIHRoZSBsb3dlci1sZWZ0IGNvcm5lci4gSG93ZXZlciwgaXQgY291bGQgYmUgaW4gdGhlIG5vcm1hbCAidG9wLWRvd24iCisgICAgICogZm9ybSB3aXRoIHRoZSBvcmlnaW4gaW4gdGhlIHVwcGVyLWxlZnQgY29ybmVyLiBTbywgd2UgbXVzdCBhZGp1c3QgdGhlCisgICAgICogYmlIZWlnaHQgZmllbGQsIHNpbmNlIHRoZSB3YXkgInRvcC1kb3duIiBmb3JtIGlzIHJlcG9ydGVkIGhlcmUgaXMgYnkKKyAgICAgKiBzZXR0aW5nIGJpSGVpZ2h0IHRvIGEgbmVnYXRpdmUgdmFsdWUuICovCisgICAgaWYgKHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQgPCAwKSB7CisgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQgPQorICAgICAgICAgICAgLXdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQ7CisgICAgICAgIHdjZC0+aXNfdG9wX2Rvd24gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHdjZC0+aXNfdG9wX2Rvd24gPSAwOworICAgIH0KKworICAgIC8qIEdldCBEQyBmb3IgdGhlIGNhcHR1cmluZyB3aW5kb3cgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBkZWFsIHdpdGgKKyAgICAgKiBiaXRtYXBzIG9idGFpbmVkIGZyb20gdGhlIGNhbWVyYSBkZXZpY2UgZHVyaW5nIGZyYW1lIGNhcHR1cmluZy4gKi8KKyAgICB3Y2QtPmRjID0gR2V0REMod2NkLT5jYXBfd2luZG93KTsKKyAgICBpZiAod2NkLT5kYyA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gb2J0YWluIERDIGZvciAlczogJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2NkLT53aW5kb3dfbmFtZSwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBfY2FtZXJhX2RldmljZV9yZXNldCh3Y2QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogU2V0dXAgc29tZSBjYXB0dXJlIHBhcmFtZXRlcnMuICovCisgICAgaWYgKGNhcENhcHR1cmVHZXRTZXR1cCh3Y2QtPmNhcF93aW5kb3csICZjYXBfcGFyYW0sIHNpemVvZihjYXBfcGFyYW0pKSkgeworICAgICAgICAvKiBVc2Ugc2VwYXJhdGUgdGhyZWFkIHRvIGNhcHR1cmUgdmlkZW8gc3RyZWFtLiAqLworICAgICAgICBjYXBfcGFyYW0uZllpZWxkID0gVFJVRTsKKyAgICAgICAgLyogRG9uJ3Qgc2hvdyBhbnkgZGlhbG9ncy4gKi8KKyAgICAgICAgY2FwX3BhcmFtLmZNYWtlVXNlckhpdE9LVG9DYXB0dXJlID0gRkFMU0U7CisgICAgICAgIGNhcENhcHR1cmVTZXRTZXR1cCh3Y2QtPmNhcF93aW5kb3csICZjYXBfcGFyYW0sIHNpemVvZihjYXBfcGFyYW0pKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgbmVlZCB0byBncmFiIGEgZnJhbWUgdG8gcHJvcGVybHkgc2V0dXAgZnJhbWVidWZmZXIsIGFuZAorICAgICAqIGNhbGN1bGF0ZSBwaXhlbCBmb3JtYXQuIFRoZSBwcm9ibGVtIGlzIHRoYXQgYml0bWFwIGluZm9ybWF0aW9uIG9idGFpbmVkCisgICAgICogZnJvbSB0aGUgZHJpdmVyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWF0Y2ggdGhlIGFjdHVhbCBiaXRtYXAgd2UncmUgZ29pbmcgdG8KKyAgICAgKiBvYnRhaW4gdmlhIGNhcEdyYWJGcmFtZSAvIGNhcEVkaXRDb3B5IC8gR2V0Q2xpcGJvYXJkRGF0YQorICAgICAqLworCisgICAgLyogR3JhYiBhIGZyYW1lLCBhbmQgcG9zdCBpdCB0byB0aGUgY2xpcGJvYXJkLiBOb3QgdmVyeSBlZmZlY3RpdmUsIGJ1dCB0aGlzCisgICAgICogaXMgaG93IGNhcFh4eCBBUEkgaXMgb3BlcmF0aW5nLiAqLworICAgIGlmICghY2FwR3JhYkZyYW1lTm9TdG9wKHdjZC0+Y2FwX3dpbmRvdykgfHwKKyAgICAgICAgIWNhcEVkaXRDb3B5KHdjZC0+Y2FwX3dpbmRvdykgfHwKKyAgICAgICAgIU9wZW5DbGlwYm9hcmQod2NkLT5jYXBfd2luZG93KSkgeworICAgICAgICBFKCIlczogRGV2aWNlICclcycgaXMgdW5hYmxlIHRvIHNhdmUgZnJhbWUgdG8gdGhlIGNsaXBib2FyZDogJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2NkLT53aW5kb3dfbmFtZSwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBfY2FtZXJhX2RldmljZV9yZXNldCh3Y2QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogR2V0IGJpdG1hcCBoYW5kbGUgc2F2ZWQgaW50byBjbGlwYm9hcmQuIE5vdGUgdGhhdCBiaXRtYXAgaXMgc3RpbGwKKyAgICAgKiBvd25lZCBieSB0aGUgY2xpcGJvYXJkIGhlcmUhICovCisgICAgYm1faGFuZGxlID0gKEhCSVRNQVApR2V0Q2xpcGJvYXJkRGF0YShDRl9CSVRNQVApOworICAgIGlmIChibV9oYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogRGV2aWNlICclcycgaXMgdW5hYmxlIHRvIG9idGFpbiBmcmFtZSBmcm9tIHRoZSBjbGlwYm9hcmQ6ICVkIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+d2luZG93X25hbWUsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQod2NkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEdldCBiaXRtYXAgb2JqZWN0IHRoYXQgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgYWN0dWFsIGJpdG1hcCBpbmZvLiAqLworICAgIGlmICghR2V0T2JqZWN0KGJtX2hhbmRsZSwgc2l6ZW9mKEJJVE1BUCksICZiaXRtYXApKSB7CisgICAgICAgIEUoIiVzOiBEZXZpY2UgJyVzJyBpcyB1bmFibGUgdG8gb2J0YWluIGZyYW1lJ3MgYml0bWFwOiAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCB3Y2QtPndpbmRvd19uYW1lLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIEVtcHR5Q2xpcGJvYXJkKCk7CisgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGFsbCB3ZSBuZWVkIGluICdiaXRtYXAnICovCisgICAgRW1wdHlDbGlwYm9hcmQoKTsKKyAgICBDbG9zZUNsaXBib2FyZCgpOworCisgICAgLyogTWFrZSBzdXJlIHRoYXQgZGltZW5zaW9ucyBtYXRjaC4gT3RoZXdpc2UgLSBmYWlsLiAqLworICAgIGlmICh3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpV2lkdGggIT0gYml0bWFwLmJtV2lkdGggfHwKKyAgICAgICAgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCAhPSBiaXRtYXAuYm1IZWlnaHQgKSB7CisgICAgICAgIEUoIiVzOiBSZXF1ZXN0ZWQgZGltZW5zaW9ucyAlZHglZCBkbyBub3QgbWF0Y2ggdGhlIGFjdHVhbCAlZHglZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZV93aWR0aCwgZnJhbWVfaGVpZ2h0LAorICAgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlXaWR0aCwKKyAgICAgICAgICB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0KTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQod2NkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENyZWF0ZSBiaXRtYXAgaW5mbyB0aGF0IHdpbGwgYmUgdXNlZCB3aXRoIEdldERJQml0cy4gKi8KKyAgICB3Y2QtPmdkaV9iaXRtYXAgPSAoQklUTUFQSU5GTyopbWFsbG9jKHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlTaXplKTsKKyAgICBpZiAod2NkLT5nZGlfYml0bWFwID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBnZGkgYml0bWFwIGluZm8iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfY2FtZXJhX2RldmljZV9yZXNldCh3Y2QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweSh3Y2QtPmdkaV9iaXRtYXAsIHdjZC0+ZnJhbWVfYml0bWFwLAorICAgICAgICAgICB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpU2l6ZSk7CisgICAgd2NkLT5nZGlfYml0bWFwLT5ibWlIZWFkZXIuYmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKKyAgICB3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUJpdENvdW50ID0gYml0bWFwLmJtQml0c1BpeGVsOworICAgIHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlID0gYml0bWFwLmJtV2lkdGhCeXRlcyAqIGJpdG1hcC5ibVdpZHRoOworICAgIC8qIEFkanVzdCBHREkncyBiaXRtYXAgYmlIZWlnaHQgZm9yIHByb3BlciBmcmFtZSBkaXJlY3Rpb24gKCJ0b3AtZG93biIsIG9yCisgICAgICogImJvdHRvbS11cCIpIFdlIGRvIHRoaXMgdHJpY2sgaW4gb3JkZXIgdG8gc2ltcGxpZnkgcGl4ZWwgZm9ybWF0IGNvbnZlcnNpb24KKyAgICAgKiByb3V0aW5lcywgd2hlcmUgd2UgYWx3YXlzIGFzc3VtZSAidG9wLWRvd24iIGZyYW1lcy4gVGhlIHRyaWNrIGhlIGlzIHRvCisgICAgICogaGF2ZSBuZWdhdGl2ZSBiaUhlaWdodCBpbiAnZ2RpX2JpdG1hcCcgaWYgZHJpdmVyIHByb3ZpZGVzICJib3R0b20tdXAiCisgICAgICogZnJhbWVzLCBhbmQgcG9zaXRpdmUgYmlIZWlnaHQgaW4gJ2dkaV9iaXRtYXAnIGlmIGRyaXZlciBwcm92aWRlcyAidG9wLWRvd24iCisgICAgICogZnJhbWVzLiBUaGlzIHdheSBHZXRHRElCaXRzIHdpbGwgYWx3YXlzIHJldHVybiAidG9wLWRvd24iIGZyYW1lcy4gKi8KKyAgICBpZiAod2NkLT5pc190b3BfZG93bikgeworICAgICAgICB3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCA9CisgICAgICAgICAgICB3Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0KKyAgICAgICAgICAgIC13Y2QtPmZyYW1lX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0OworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIGZyYW1lYnVmZmVyLiAqLworICAgIHdjZC0+ZnJhbWVidWZmZXIgPSAodWludDhfdCopbWFsbG9jKHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlKTsKKyAgICBpZiAod2NkLT5mcmFtZWJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGZyYW1lYnVmZmVyIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpU2l6ZUltYWdlKTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVzZXQod2NkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIExldHMgc2VlIHdoYXQgcGl4ZWwgZm9ybWF0IHdlIHdpbGwgdXNlLiAqLworICAgIGlmICh3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDE2KSB7CisgICAgICAgIHdjZC0+cGl4ZWxfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1JHQjU2NTsKKyAgICB9IGVsc2UgaWYgKHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMjQpIHsKKyAgICAgICAgd2NkLT5waXhlbF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfQkdSMjQ7CisgICAgfSBlbHNlIGlmICh3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUJpdENvdW50ID09IDMyKSB7CisgICAgICAgIHdjZC0+cGl4ZWxfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0JHUjMyOworICAgIH0gZWxzZSB7CisgICAgICAgIEUoIiVzOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2NkLT5nZGlfYml0bWFwLT5ibWlIZWFkZXIuYmlCaXRDb3VudCk7CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBEKCIlczogQ2FwdHVyaW5nIGRldmljZSAnJXMnOiAlZCBiaXRzIHBlciBwaXhlbCBpbiAlLjRzIFslZHglZF0gZnJhbWUiLAorICAgICAgX19GVU5DVElPTl9fLCB3Y2QtPndpbmRvd19uYW1lLCB3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUJpdENvdW50LAorICAgICAgKGNvbnN0IGNoYXIqKSZ3Y2QtPnBpeGVsX2Zvcm1hdCwgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaVdpZHRoLAorICAgICAgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCk7CisKKyAgICAvKiBUcnkgdG8gc2V0dXAgY2FwdHVyZSBmcmFtZSBjYWxsYmFjay4gKi8KKyAgICB3Y2QtPnVzZV9jbGlwYm9hcmQgPSAxOworICAgIGlmIChjYXBTZXRDYWxsYmFja09uRnJhbWUod2NkLT5jYXBfd2luZG93LCBfb25fY2FwdHVyZWRfZnJhbWUpKSB7CisgICAgICAgIC8qIENhbGxiYWNrIGlzIHNldC4gRG9uJ3QgdXNlIGNsaXBib2FyZCB3aGVuIGNhcHR1cmluZyBmcmFtZXMuICovCisgICAgICAgIHdjZC0+dXNlX2NsaXBib2FyZCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2NtZF9jYW1lcmFfZGV2aWNlX3N0b3BfY2FwdHVyaW5nKENhbWVyYURldmljZSogY2QpCit7CisgICAgV25kQ2FtZXJhRGV2aWNlKiB3Y2Q7CisgICAgaWYgKGNkID09IE5VTEwgfHwgY2QtPm9wYXF1ZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UgZGVzY3JpcHRvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2NkID0gKFduZENhbWVyYURldmljZSopY2QtPm9wYXF1ZTsKKworICAgIC8qIERpc2FibGUgZnJhbWUgY2FsbGJhY2suICovCisgICAgY2FwU2V0Q2FsbGJhY2tPbkZyYW1lKHdjZC0+Y2FwX3dpbmRvdywgTlVMTCk7CisKKyAgICAvKiB3Y2QtPmRjIGlzIHRoZSBpbmRpY2F0b3Igb2YgY2FwdHVyZS4gKi8KKyAgICBpZiAod2NkLT5kYyA9PSBOVUxMKSB7CisgICAgICAgIFcoIiVzOiBEZXZpY2UgJyVzJyBpcyBub3QgY2FwdHVyaW5nIHZpZGVvIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+d2luZG93X25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUmVsZWFzZURDKHdjZC0+Y2FwX3dpbmRvdywgd2NkLT5kYyk7CisgICAgd2NkLT5kYyA9IE5VTEw7CisKKyAgICAvKiBSZXNldCB0aGUgZGV2aWNlIGluIHByZXBhcmF0aW9uIGZvciB0aGUgbmV4dCBjYXB0dXJlLiAqLworICAgIF9jYW1lcmFfZGV2aWNlX3Jlc2V0KHdjZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogQ2FwdHVyZSBmcmFtZSB1c2luZyBmcmFtZSBjYWxsYmFjay4KKyAqIFBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZSBmb3IgdGhpcyByb3V0aW5lIG1hdGNoZXMgX2NhbWVyYV9kZXZpY2VfcmVhZF9mcmFtZQorICovCitzdGF0aWMgaW50CitfY2FtZXJhX2RldmljZV9yZWFkX2ZyYW1lX2NhbGxiYWNrKFduZENhbWVyYURldmljZSogd2NkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRGcmFtZUJ1ZmZlciogZnJhbWVidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgLyogR3JhYiB0aGUgZnJhbWUuIE5vdGUgdGhhdCB0aGlzIGNhbGwgd2lsbCBjYXVzZSBmcmFtZSBjYWxsYmFjayB0byBiZQorICAgICAqIGludm9rZWQgYmVmb3JlIGNhcEdyYWJGcmFtZU5vU3RvcCByZXR1cm5zLiAqLworICAgIGlmICghY2FwR3JhYkZyYW1lTm9TdG9wKHdjZC0+Y2FwX3dpbmRvdykgfHwgd2NkLT5sYXN0X2ZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IERldmljZSAnJXMnIGlzIHVuYWJsZSB0byBncmFiIGEgZnJhbWU6ICVkIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+d2luZG93X25hbWUsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENvbnZlcnQgZnJhbWVidWZmZXIuICovCisgICAgcmV0dXJuIGNvbnZlcnRfZnJhbWUod2NkLT5sYXN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdjZC0+cGl4ZWxfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJzLCBmYnNfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUsIGV4cF9jb21wKTsKK30KKworLyogQ2FwdHVyZSBmcmFtZSB1c2luZyBjbGlwYm9hcmQuCisgKiBQYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUgZm9yIHRoaXMgcm91dGluZSBtYXRjaGVzIF9jYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWUKKyAqLworc3RhdGljIGludAorX2NhbWVyYV9kZXZpY2VfcmVhZF9mcmFtZV9jbGlwYm9hcmQoV25kQ2FtZXJhRGV2aWNlKiB3Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRGcmFtZUJ1ZmZlciogZnJhbWVidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBleHBfY29tcCkKK3sKKyAgICBIQklUTUFQIGJtX2hhbmRsZTsKKworICAgIC8qIEdyYWIgYSBmcmFtZSwgYW5kIHBvc3QgaXQgdG8gdGhlIGNsaXBib2FyZC4gTm90IHZlcnkgZWZmZWN0aXZlLCBidXQgdGhpcworICAgICAqIGlzIGhvdyBjYXBYeHggQVBJIGlzIG9wZXJhdGluZy4gKi8KKyAgICBpZiAoIWNhcEdyYWJGcmFtZU5vU3RvcCh3Y2QtPmNhcF93aW5kb3cpIHx8CisgICAgICAgICFjYXBFZGl0Q29weSh3Y2QtPmNhcF93aW5kb3cpIHx8CisgICAgICAgICFPcGVuQ2xpcGJvYXJkKHdjZC0+Y2FwX3dpbmRvdykpIHsKKyAgICAgICAgRSgiJXM6IERldmljZSAnJXMnIGlzIHVuYWJsZSB0byBzYXZlIGZyYW1lIHRvIHRoZSBjbGlwYm9hcmQ6ICVkIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+d2luZG93X25hbWUsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEdldCBiaXRtYXAgaGFuZGxlIHNhdmVkIGludG8gY2xpcGJvYXJkLiBOb3RlIHRoYXQgYml0bWFwIGlzIHN0aWxsCisgICAgICogb3duZWQgYnkgdGhlIGNsaXBib2FyZCBoZXJlISAqLworICAgIGJtX2hhbmRsZSA9IChIQklUTUFQKUdldENsaXBib2FyZERhdGEoQ0ZfQklUTUFQKTsKKyAgICBpZiAoYm1faGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IERldmljZSAnJXMnIGlzIHVuYWJsZSB0byBvYnRhaW4gZnJhbWUgZnJvbSB0aGUgY2xpcGJvYXJkOiAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCB3Y2QtPndpbmRvd19uYW1lLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIEVtcHR5Q2xpcGJvYXJkKCk7CisgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBHZXQgYml0bWFwIGJ1ZmZlci4gKi8KKyAgICBpZiAod2NkLT5nZGlfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQgPiAwKSB7CisgICAgICAgIHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0ID0gLXdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0OworICAgIH0KKworICAgIGlmICghR2V0RElCaXRzKHdjZC0+ZGMsIGJtX2hhbmRsZSwgMCwgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICB3Y2QtPmZyYW1lYnVmZmVyLCB3Y2QtPmdkaV9iaXRtYXAsIERJQl9SR0JfQ09MT1JTKSkgeworICAgICAgICBFKCIlczogRGV2aWNlICclcycgaXMgdW5hYmxlIHRvIHRyYW5zZmVyIGZyYW1lIHRvIHRoZSBmcmFtZWJ1ZmZlcjogJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2NkLT53aW5kb3dfbmFtZSwgR2V0TGFzdEVycm9yKCkpOworICAgICAgICBFbXB0eUNsaXBib2FyZCgpOworICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHdjZC0+Z2RpX2JpdG1hcC0+Ym1pSGVhZGVyLmJpSGVpZ2h0IDwgMCkgeworICAgICAgICB3Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodCA9IC13Y2QtPmdkaV9iaXRtYXAtPmJtaUhlYWRlci5iaUhlaWdodDsKKyAgICB9CisKKyAgICBFbXB0eUNsaXBib2FyZCgpOworICAgIENsb3NlQ2xpcGJvYXJkKCk7CisKKyAgICAvKiBDb252ZXJ0IGZyYW1lYnVmZmVyLiAqLworICAgIHJldHVybiBjb252ZXJ0X2ZyYW1lKHdjZC0+ZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2NkLT5waXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2NkLT5nZGlfYml0bWFwLT5ibWlIZWFkZXIuYmlTaXplSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2NkLT5mcmFtZV9iaXRtYXAtPmJtaUhlYWRlci5iaVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdjZC0+ZnJhbWVfYml0bWFwLT5ibWlIZWFkZXIuYmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJzLCBmYnNfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUsIGV4cF9jb21wKTsKK30KKworc3RhdGljIGludAorY21kX2NhbWVyYV9kZXZpY2VfcmVhZF9mcmFtZShDYW1lcmFEZXZpY2UqIGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEZyYW1lQnVmZmVyKiBmcmFtZWJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgV25kQ2FtZXJhRGV2aWNlKiB3Y2Q7CisKKyAgICAvKiBTYW5pdHkgY2hlY2tzLiAqLworICAgIGlmIChjZCA9PSBOVUxMIHx8IGNkLT5vcGFxdWUgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHdjZCA9IChXbmRDYW1lcmFEZXZpY2UqKWNkLT5vcGFxdWU7CisgICAgaWYgKHdjZC0+ZGMgPT0gTlVMTCkgeworICAgICAgICBXKCIlczogRGV2aWNlICclcycgaXMgbm90IGNhcHR1aW5nIHZpZGVvIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdjZC0+d2luZG93X25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogRGlzcGF0Y2ggdGhlIGNhbGwgdG8gYW4gYXBwcm9wcmlhdGUgcm91dGluZTogZ3JhYmJpbmcgYSBmcmFtZSB1c2luZworICAgICAqIGNsaXBib2FyZCwgb3IgdXNpbmcgYSBmcmFtZSBjYWxsYmFjay4gKi8KKyAgICByZXR1cm4gd2NkLT51c2VfY2xpcGJvYXJkID8KKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfcmVhZF9mcmFtZV9jbGlwYm9hcmQod2NkLCBmcmFtZWJ1ZmZlcnMsIGZic19udW0sIHJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc2NhbGUsIGJfc2NhbGUsIGV4cF9jb21wKSA6CisgICAgICAgIF9jYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWVfY2FsbGJhY2sod2NkLCBmcmFtZWJ1ZmZlcnMsIGZic19udW0sIHJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworfQorCitzdGF0aWMgdm9pZAorY21kX2NhbWVyYV9kZXZpY2VfY2xvc2UoQ2FtZXJhRGV2aWNlKiBjZCkKK3sKKyAgICAvKiBTYW5pdHkgY2hlY2tzLiAqLworICAgIGlmIChjZCA9PSBOVUxMIHx8IGNkLT5vcGFxdWUgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgIH0gZWxzZSB7CisgICAgICAgIFduZENhbWVyYURldmljZSogd2NkID0gKFduZENhbWVyYURldmljZSopY2QtPm9wYXF1ZTsKKyAgICAgICAgX2NhbWVyYV9kZXZpY2VfZnJlZSh3Y2QpOworICAgIH0KK30KKworc3RhdGljIGludCBjbWRfY2FtZXJhX2VudW1lcmF0ZV9kZXZpY2VzKENhbWVyYUluZm8qIGNpcywgaW50IG1heCkgeworICAgIC8qIEFycmF5IGNvbnRhaW5pbmcgZW11bGF0ZWQgd2ViY2FtIGZyYW1lIGRpbWVuc2lvbnMuCisgICAgKiBjYXBYeHggQVBJIHByb3ZpZGVzIGRldmljZSBpbmRlcGVuZGVudCBmcmFtZSBkaW1lbnNpb25zLCBieSBzY2FsaW5nIGZyYW1lcworICAgICogcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlIHRvIHdoYXRldmVyIGRpbWVuc2lvbnMgd2VyZSByZXF1ZXN0ZWQgYnkgdGhlCisgICAgKiB1c2VyLgorICAgICogU28sIHdlIGNhbiBqdXN0IHVzZSBhIHNtYWxsIHNldCBvZiBmcmFtZSBkaW1lbnNpb25zIHRvIGVtdWxhdGUuCisgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgQ2FtZXJhRnJhbWVEaW0gX2VtdWxhdGVfZGltc1tdID0geworICAgICAgICAgICAgLyogRW11bGF0ZXMgNjQweDQ4MCBmcmFtZS4gKi8KKyAgICAgICAgICAgIHs2NDAsIDQ4MH0sCisgICAgICAgICAgICAvKiBFbXVsYXRlcyAzNTJ4Mjg4IGZyYW1lIChyZXF1aXJlZCBieSBjYW1lcmEgZnJhbWV3b3JrKS4gKi8KKyAgICAgICAgICAgIHszNTIsIDI4OH0sCisgICAgICAgICAgICAvKiBFbXVsYXRlcyAzMjB4MjQwIGZyYW1lIChyZXF1aXJlZCBieSBjYW1lcmEgZnJhbWV3b3JrKS4gKi8KKyAgICAgICAgICAgIHszMjAsIDI0MH0sCisgICAgICAgICAgICAvKiBFbXVsYXRlcyAxNzZ4MTQ0IGZyYW1lIChyZXF1aXJlZCBieSBjYW1lcmEgZnJhbWV3b3JrKS4gKi8KKyAgICAgICAgICAgIHsxNzYsIDE0NH19OworICAgIGludCBpbnBfY2hhbm5lbCwgZm91bmQgPSAwOworCisgICAgZm9yIChpbnBfY2hhbm5lbCA9IDA7IGlucF9jaGFubmVsIDwgMTAgJiYgZm91bmQgPCBtYXg7IGlucF9jaGFubmVsKyspIHsKKyAgICAgICAgY2hhciBuYW1lWzI1Nl07CisgICAgICAgIENhbWVyYURldmljZSogY2Q7CisKKyAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMlZCIsIF9kZWZhdWx0X3dpbmRvd19uYW1lLCBmb3VuZCk7CisgICAgICAgIGNkID0gY21kX2NhbWVyYV9kZXZpY2Vfb3BlbihuYW1lLCBpbnBfY2hhbm5lbCk7CisgICAgICAgIGlmIChjZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBXbmRDYW1lcmFEZXZpY2UqIHdjZCA9IChXbmRDYW1lcmFEZXZpY2UqKWNkLT5vcGFxdWU7CisKKyAgICAgICAgICAgIC8qIFVuZm9ydHVuYXRlbHksIG9uIFdpbmRvd3Mgd2UgaGF2ZSB0byBzdGFydCBjYXB0dXJpbmcgaW4gb3JkZXIgdG8gZ2V0IHRoZQorICAgICAgICAgICAgICogYWN0dWFsIGZyYW1lIHByb3BlcnRpZXMuICovCisgICAgICAgICAgICBpZiAoIWNtZF9jYW1lcmFfZGV2aWNlX3N0YXJ0X2NhcHR1cmluZyhjZCwgVjRMMl9QSVhfRk1UX1JHQjMyLCA2NDAsIDQ4MCkpIHsKKyAgICAgICAgICAgICAgICBjaXNbZm91bmRdLmZyYW1lX3NpemVzID0gKENhbWVyYUZyYW1lRGltKiltYWxsb2Moc2l6ZW9mKF9lbXVsYXRlX2RpbXMpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2lzW2ZvdW5kXS5mcmFtZV9zaXplcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlzcF9uYW1lWzI0XTsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZGlzcF9uYW1lLCBzaXplb2YoZGlzcF9uYW1lKSwgIndlYmNhbSVkIiwgZm91bmQpOworICAgICAgICAgICAgICAgICAgICBjaXNbZm91bmRdLmRpc3BsYXlfbmFtZSA9IEFTVFJEVVAoZGlzcF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY2lzW2ZvdW5kXS5kZXZpY2VfbmFtZSA9IEFTVFJEVVAobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGNpc1tmb3VuZF0uZGlyZWN0aW9uID0gQVNUUkRVUCgiZnJvbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgY2lzW2ZvdW5kXS5pbnBfY2hhbm5lbCA9IGlucF9jaGFubmVsOworICAgICAgICAgICAgICAgICAgICBjaXNbZm91bmRdLmZyYW1lX3NpemVzX251bSA9IHNpemVvZihfZW11bGF0ZV9kaW1zKSAvIHNpemVvZigqX2VtdWxhdGVfZGltcyk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShjaXNbZm91bmRdLmZyYW1lX3NpemVzLCBfZW11bGF0ZV9kaW1zLCBzaXplb2YoX2VtdWxhdGVfZGltcykpOworICAgICAgICAgICAgICAgICAgICBjaXNbZm91bmRdLnBpeGVsX2Zvcm1hdCA9IHdjZC0+cGl4ZWxfZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBjaXNbZm91bmRdLmluX3VzZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkaW1lbnNpb25zIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY21kX2NhbWVyYV9kZXZpY2Vfc3RvcF9jYXB0dXJpbmcoY2QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBObyBtb3JlIGNhbWVyYXMuICovCisgICAgICAgICAgICAgICAgY21kX2NhbWVyYV9kZXZpY2VfY2xvc2UoY2QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kX2NhbWVyYV9kZXZpY2VfY2xvc2UoY2QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm8gbW9yZSBjYW1lcmFzLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZm91bmQ7Cit9CisKKy8vIENhbWVyYSB0aHJlYWQgc3RhdGUKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNRVJBX0NNRF9OT1AsCisgIENBTUVSQV9DTURfT1BFTiwKKyAgQ0FNRVJBX0NNRF9TVEFSVF9DQVBUVVJJTkcsCisgIENBTUVSQV9DTURfU1RPUF9DQVBUVVJJTkcsCisgIENBTUVSQV9DTURfUkVBRF9GUkFNRSwKKyAgQ0FNRVJBX0NNRF9DTE9TRSwKKyAgQ0FNRVJBX0NNRF9FTlVNRVJBVEVfREVWSUNFUworfSBjYW1lcmFfY21kX3Q7CisKKy8vIFN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgY29tbWFuZCBzZW50IGZyb20gdGhlIG1haW4gdGhyZWFkIHRvCisvLyB0aGUgY2FtZXJhIHRocmVhZC4gVGhlIHByb2Nlc3MoKSBtZXRob2QgaGFuZGxlcyB0aGUgY29tbWFuZCBhbmQKKy8vIHJldHVybnMgYSByZXN1bHQgYXMgYW4gaW50cHRyX3QsIHNpbmNlIHRoZSByZXN1bHQgb2YgQ0FNRVJBX0NNRF9PUEVOCisvLyBpcyBhIHBvaW50ZXIgdG8gYSBDYW1lcmFEZXZpY2UqIGluc3RhbmNlLgorc3RydWN0IENhbWVyYUNvbW1hbmQgeworICAgIGNhbWVyYV9jbWRfdCBjbWQ7CisgICAgdW5pb24geworICAgICAgICAvLyBDQU1FUkFfQ01EX09QRU4KKyAgICAgICAgLy8gTk9URTogVGhlIHJlc3VsdCBpcyBhIENhbWVyYURldmljZSogY2FzdCBhcyBhbiBpbnRwdHJfdAorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICAgICAgICAgIGludCBjaGFubmVsOworICAgICAgICB9IG9wZW47CisKKyAgICAgICAgLy8gQ0FNRVJBX0NNRF9TVEFSVF9DQVBUVVJJTkcKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlOworICAgICAgICAgICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0OworICAgICAgICAgICAgaW50IGZyYW1lX3dpZHRoOworICAgICAgICAgICAgaW50IGZyYW1lX2hlaWdodDsKKyAgICAgICAgfSBzdGFydDsKKworICAgICAgICAvLyBDQU1FUkFfQ01EX1NUT1BfQ0FQVFVSSU5HCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2UqIGRldmljZTsKKyAgICAgICAgfSBzdG9wOworCisgICAgICAgIC8vIENBTUVSQV9DTURfUkVBRF9GUkFNRQorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlKiBkZXZpY2U7CisgICAgICAgICAgICBDbGllbnRGcmFtZUJ1ZmZlciogZnJhbWVidWZmZXJzOworICAgICAgICAgICAgaW50IGZic19udW07CisgICAgICAgICAgICBmbG9hdCByX3NjYWxlOworICAgICAgICAgICAgZmxvYXQgZ19zY2FsZTsKKyAgICAgICAgICAgIGZsb2F0IGJfc2NhbGU7CisgICAgICAgICAgICBmbG9hdCBleHBfY29tcDsKKyAgICAgICAgfSByZWFkX2ZyYW1lOworCisgICAgICAgIC8vIENBTUVSQV9DTURfQ0xPU0UKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlOworICAgICAgICB9IGNsb3NlOworCisgICAgICAgIC8vIENBTUVSQV9DTURfRU5VTUVSQVRFX0RFVklDRVMKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIENhbWVyYUluZm8qIGluZm87CisgICAgICAgICAgICBpbnQgbWF4OworICAgICAgICB9IGVudW1lcmF0ZTsKKyAgICB9OworCisgICAgLy8gUHJvY2VzcyBhIGNvbW1hbmQgKGkuZS4gZXhlY3V0ZSBpdCkuIE11c3QgYmUgY2FsbGVkIGluIHRoZSBjYW1lcmEKKyAgICAvLyB0aHJlYWQgY29udGV4dC4KKyAgICBpbnRwdHJfdCBwcm9jZXNzKCkgY29uc3QgeworICAgICAgICBjb25zdCBDYW1lcmFDb21tYW5kJiBjbWQgPSAqdGhpczsKKyAgICAgICAgaW50cHRyX3QgcmVzdWx0ID0gMDsKKworICAgICAgICAvLyBFeGVjdXRlIHRoZSBjb21tYW5kCisgICAgICAgIHN3aXRjaCAoY21kLmNtZCkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX05PUDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX09QRU46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY21kX2NhbWVyYV9kZXZpY2Vfb3BlbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5vcGVuLm5hbWUsIGNtZC5vcGVuLmNoYW5uZWwpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1NUQVJUX0NBUFRVUklORzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjbWRfY2FtZXJhX2RldmljZV9zdGFydF9jYXB0dXJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQuc3RhcnQuZGV2aWNlLCBjbWQuc3RhcnQucGl4ZWxfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgY21kLnN0YXJ0LmZyYW1lX3dpZHRoLCBjbWQuc3RhcnQuZnJhbWVfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1NUT1BfQ0FQVFVSSU5HOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNtZF9jYW1lcmFfZGV2aWNlX3N0b3BfY2FwdHVyaW5nKGNtZC5zdG9wLmRldmljZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9SRUFEX0ZSQU1FOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNtZF9jYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQucmVhZF9mcmFtZS5kZXZpY2UsIGNtZC5yZWFkX2ZyYW1lLmZyYW1lYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5yZWFkX2ZyYW1lLmZic19udW0sIGNtZC5yZWFkX2ZyYW1lLnJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQucmVhZF9mcmFtZS5nX3NjYWxlLCBjbWQucmVhZF9mcmFtZS5iX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kLnJlYWRfZnJhbWUuZXhwX2NvbXApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENBTUVSQV9DTURfQ0xPU0U6CisgICAgICAgICAgICAgICAgY21kX2NhbWVyYV9kZXZpY2VfY2xvc2UoY21kLmNsb3NlLmRldmljZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9FTlVNRVJBVEVfREVWSUNFUzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjbWRfY2FtZXJhX2VudW1lcmF0ZV9kZXZpY2VzKGNtZC5lbnVtZXJhdGUuaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5lbnVtZXJhdGUubWF4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK307CisKKy8vIFRoZSBjYW1lcmEgdGhlYWQgaW5zdGFuY2UuCitjbGFzcyBDYW1lcmFUaHJlYWQgOiBwdWJsaWMgYW5kcm9pZDo6YmFzZTo6VGhyZWFkIHsKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RvciwgY2FsbGVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAgIENhbWVyYVRocmVhZCgpIDogbUlucHV0KCksIG1PdXRwdXQoKSB7CisgICAgICAgIHRoaXMtPnN0YXJ0KCk7CisgICAgfQorCisgICAgLy8gTWFpbiB0aHJlYWQgZnVuY3Rpb24sIHJ1bnMgaW4gdGhlIGNhbWVyYSB0aHJlYWQgY29udGV4dC4KKyAgICB2aXJ0dWFsIGludHB0cl90IG1haW4oKSBvdmVycmlkZSB7CisgICAgICAgIGJvb2wgcnVubmluZyA9IHRydWU7CisgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICBDYW1lcmFDb21tYW5kIGNtZCA9IHt9OworICAgICAgICAgICAgbUlucHV0LnJlY2VpdmUoJmNtZCk7CisgICAgICAgICAgICBpbnRwdHJfdCByZXN1bHQgPSBjbWQucHJvY2VzcygpOworICAgICAgICAgICAgbU91dHB1dC5zZW5kKHJlc3VsdCk7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFN0b3AgdGhlIHRocmVhZCBhdCBzb21lIHBvaW50PworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIENhbGwgZnJvbSB0aGUgbWFpbiB0aHJlYWQgdG8gc2VuZCBhIGNvbW1hbmQgYW5kIHdhaXQgZm9yIGl0cyByZXN1bHQuCisgICAgaW50cHRyX3Qgc2VuZENvbW1hbmRBbmRHZXRSZXN1bHQoY29uc3QgQ2FtZXJhQ29tbWFuZCYgY21kKSB7CisgICAgICAgIG1JbnB1dC5zZW5kKGNtZCk7CisgICAgICAgIGludHB0cl90IHJlc3VsdCA9IDA7CisgICAgICAgIG1PdXRwdXQucmVjZWl2ZSgmcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gbWVzc2FnZSBjaGFubmVsIHVzZWQgdG8gc2VuZCBjb21tYW5kcyBmcm9tIHRoZSBtYWluIHRocmVhZAorICAgIC8vIHRvIHRoZSBjYW1lcmEgdGhyZWFkLgorICAgIGFuZHJvaWQ6OmJhc2U6Ok1lc3NhZ2VDaGFubmVsPENhbWVyYUNvbW1hbmQsIDRVPiBtSW5wdXQ7CisKKyAgICAvLyBtZXNzYWdlIGNoYW5uZWwgdXNlZCB0byBzZW5kIHJlc3VsdHMgZnJvbSB0aGUgY2FtZXJhCisgICAgLy8gdGhyZWFkIHRvIHRoZSBtYWluIG9uZS4KKyAgICBhbmRyb2lkOjpiYXNlOjpNZXNzYWdlQ2hhbm5lbDxpbnRwdHJfdCwgNFU+IG1PdXRwdXQ7Cit9OworCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPENhbWVyYVRocmVhZD4gc0NhbWVyYVRocmVhZCA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworZXh0ZXJuICJDIiBpbnQgd2luZG93c19jYW1lcmFfdGhyZWFkX2luaXQoKSB7CisgICAgLy8gRm9yY2UgdGhyZWFkIGNyZWF0aW9uIGFuZCBzdGFydC4KKyAgICAodm9pZClzQ2FtZXJhVGhyZWFkLnB0cigpOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICBDYW1lcmFEZXZpY2UgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDYW1lcmFEZXZpY2UqIGNhbWVyYV9kZXZpY2Vfb3Blbihjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhbm5lbCkgeworICAgIENhbWVyYUNvbW1hbmQgY21kID0ge307CisgICAgY21kLmNtZCA9IENBTUVSQV9DTURfT1BFTjsKKyAgICBjbWQub3Blbi5uYW1lID0gbmFtZTsKKyAgICBjbWQub3Blbi5jaGFubmVsID0gY2hhbm5lbDsKKworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PENhbWVyYURldmljZSo+KAorICAgICAgICAgICAgc0NhbWVyYVRocmVhZC0+c2VuZENvbW1hbmRBbmRHZXRSZXN1bHQoY21kKSk7Cit9CisKK2ludCBjYW1lcmFfZGV2aWNlX3N0YXJ0X2NhcHR1cmluZyhDYW1lcmFEZXZpY2UqIGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2hlaWdodCkgeworICAgIENhbWVyYUNvbW1hbmQgY21kID0ge307CisgICAgY21kLmNtZCA9IENBTUVSQV9DTURfU1RBUlRfQ0FQVFVSSU5HOworICAgIGNtZC5zdGFydC5kZXZpY2UgPSBjZDsKKyAgICBjbWQuc3RhcnQucGl4ZWxfZm9ybWF0ID0gcGl4ZWxfZm9ybWF0OworICAgIGNtZC5zdGFydC5mcmFtZV93aWR0aCA9IGZyYW1lX3dpZHRoOworICAgIGNtZC5zdGFydC5mcmFtZV9oZWlnaHQgPSBmcmFtZV9oZWlnaHQ7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzQ2FtZXJhVGhyZWFkLT5zZW5kQ29tbWFuZEFuZEdldFJlc3VsdChjbWQpKTsKK30KKworaW50IGNhbWVyYV9kZXZpY2Vfc3RvcF9jYXB0dXJpbmcoQ2FtZXJhRGV2aWNlKiBjZCkgeworICAgIENhbWVyYUNvbW1hbmQgY21kID0ge307CisgICAgY21kLmNtZCA9IENBTUVSQV9DTURfU1RPUF9DQVBUVVJJTkc7CisgICAgY21kLnN0b3AuZGV2aWNlID0gY2Q7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc0NhbWVyYVRocmVhZC0+c2VuZENvbW1hbmRBbmRHZXRSZXN1bHQoY21kKSk7Cit9CisKK2ludCBjYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWUoQ2FtZXJhRGV2aWNlKiBjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RnJhbWVCdWZmZXIqIGZyYW1lYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGV4cF9jb21wKSB7CisgICAgQ2FtZXJhQ29tbWFuZCBjbWQgPSB7fTsKKyAgICBjbWQuY21kID0gQ0FNRVJBX0NNRF9SRUFEX0ZSQU1FOworICAgIGNtZC5yZWFkX2ZyYW1lLmRldmljZSA9IGNkOworICAgIGNtZC5yZWFkX2ZyYW1lLmZyYW1lYnVmZmVycyA9IGZyYW1lYnVmZmVyczsKKyAgICBjbWQucmVhZF9mcmFtZS5mYnNfbnVtID0gZmJzX251bTsKKyAgICBjbWQucmVhZF9mcmFtZS5yX3NjYWxlID0gcl9zY2FsZTsKKyAgICBjbWQucmVhZF9mcmFtZS5nX3NjYWxlID0gZ19zY2FsZTsKKyAgICBjbWQucmVhZF9mcmFtZS5iX3NjYWxlID0gYl9zY2FsZTsKKyAgICBjbWQucmVhZF9mcmFtZS5leHBfY29tcCA9IGV4cF9jb21wOworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc0NhbWVyYVRocmVhZC0+c2VuZENvbW1hbmRBbmRHZXRSZXN1bHQoY21kKSk7Cit9CisKK3ZvaWQgY2FtZXJhX2RldmljZV9jbG9zZShDYW1lcmFEZXZpY2UqIGNkKSB7CisgICAgQ2FtZXJhQ29tbWFuZCBjbWQgPSB7fTsKKyAgICBjbWQuY21kID0gQ0FNRVJBX0NNRF9DTE9TRTsKKyAgICBjbWQuY2xvc2UuZGV2aWNlID0gY2Q7CisgICAgKHZvaWQpc0NhbWVyYVRocmVhZC0+c2VuZENvbW1hbmRBbmRHZXRSZXN1bHQoY21kKTsKK30KKworaW50IGNhbWVyYV9lbnVtZXJhdGVfZGV2aWNlcyhDYW1lcmFJbmZvKiBjaXMsIGludCBtYXgpIHsKKyAgICBDYW1lcmFDb21tYW5kIGNtZCA9IHt9OworICAgIGNtZC5jbWQgPSBDQU1FUkFfQ01EX0VOVU1FUkFURV9ERVZJQ0VTOworICAgIGNtZC5lbnVtZXJhdGUuaW5mbyA9IGNpczsKKyAgICBjbWQuZW51bWVyYXRlLm1heCA9IG1heDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzQ2FtZXJhVGhyZWFkLT5zZW5kQ29tbWFuZEFuZEdldFJlc3VsdChjbWQpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYyNGRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtY2FwdHVyZS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8qCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIHZpZGVvIGNhcHR1cmluZyBBUEkgdGhhdCBpcyB1c2VkIGJ5IHRoZSBjYW1lcmEKKyAqIGVtdWxhdG9yLgorICovCisKKyNpbmNsdWRlICJjYW1lcmEtY29tbW9uLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIE5PVEU6IE9uIFdpbmRvd3MsIHdlIG1ha2UgY2VydGFpbiBhc3N1bXB0aW9ucyBhYm91dCAqIGhvdyBtYW55IHRocmVhZHMKKyAqIGFyZSBhY2Nlc3NpbmcgKiB0aGUgY2FtZXJhIGNhcHR1cmUgQVBJIGF0IGEgdGltZToKKyAqCisgKiBOYW1lbHksIHRoYXQgb25seSBPTkUgY2FtZXJhIHRocmVhZCBpcyBhY2Nlc3NpbmcgdGhlIGNhbWVyYSBjYXB0dXJlIEFQSQorICogYXQgYW55IHRpbWUuCisgKgorICogTW9yZSBkZXRhaWxzOgorICoKKyAqIEZpcnN0LCBzb21lIGJhY2tncm91bmQuIFRoZSB3aW5kb3dzIGNhbWVyYSBjYXB0dXJlIGxpYnJhcnkgKHZmdzMyKQorICogY2Fubm90IGJlIG9wZXJhdGVkIG9uIGZyb20gbXVsdGlwbGUgdGhyZWFkcywKKyAqIG9yIHN0cmFuZ2VzIGZyZWV6ZXMvY3Jhc2hlcyB3aWxsIHJlc3VsdC4KKyAqCisgKiBUaGVyZWZvcmUsIGFsbCB2ZnczMiBjYWxscyB3aWxsIGdvIHRocm91Z2ggYSBzaW5nbGUgdGhyZWFkLAorICogYW5kIHRoZSBDYW1lcmFEZXZpY2UgQVBJIG9uIHdpbmRvd3MKKyAqIG1lcmVseSBzZXRzIGFyZ3VtZW50cyBhbmQgc2lnbmFscyB0aGF0IHRocmVhZC4KKyAqCisgKiBUaGUgc3RhdGUgbWFjaGluZSBydW5uaW5nIG9uIHRoYXQgdGhyZWFkCisgKiB0aGVuIGFzc3VtZXMgdGhhdCBvbmx5IG9uZSBvdGhlciB0aHJlYWQgaXMgaW50ZXJhY3RpbmcKKyAqIHdpdGggaXQgYXQgYSB0aW1lLiBUaGlzIGlzIGJlY2F1c2UKKyAqIHdlIGFzc3VtZSB0aGUgZXhpc3RlbmNlIG9mIG9ubHkgb25lIGNhbWVyYSBjbGllbnQsCisgKiB3aGljaCByZXN1bHRzIGluIG9ubHkgc2VyaWFsIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZworICogY2FtZXJhIEFQSS4KKyAqLworCisvKiBDYW1lcmEgY2FwdHVyZSBBUEkgZm9sbG93cyAqLworCisvKiBJbml0aWFsaXplcyBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3IsIGFuZCBjb25uZWN0cyB0byB0aGUgY2FtZXJhIGRldmljZS4KKyAqIFBhcmFtOgorICogIG5hbWUgLSBPbiBMaW51eCBjb250YWlucyBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHZpZGVvLgorICogICAgT24gV2luZG93cyBjb250YWlucyBuYW1lIHRvIGFzc2lnbiB0byB0aGUgY2FwdHVyaW5nIHdpbmRvdy4gVGhpcyBwYXJhbWV0ZXIKKyAqICAgIGNhbiBiZSBOVUxMLCBpbiB3aGljaCBjYXNlICcvZGV2L3ZpZGVvMCcgd2lsbCBiZSB1c2VkIGFzIGRldmljZSBuYW1lIG9uCisgKiAgICBMaW51eCwgb3IgJ0FuZHJvaWRFbXVsYXRvclZDJyBvbiBXaW5kb3dzLgorICogIGlucF9jaGFubmVsIC0gT24gTGludXggZGVmaW5lcyBpbnB1dCBjaGFubmVsIHRvIHVzZSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aAorICogICAgdGhlIGNhbWVyYSBkcml2ZXIuIE9uIFdpbmRvd3MgY29udGFpbnMgYW4gaW5kZXggKHVwIHRvIDEwKSBvZiB0aGUgZHJpdmVyCisgKiAgICB0byB1c2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgY2FtZXJhIGRldmljZS4KKyAqIFJldHVybjoKKyAqICBJbml0aWFsaXplZCBjYW1lcmEgZGV2aWNlIGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICovCitleHRlcm4gQ2FtZXJhRGV2aWNlKiBjYW1lcmFfZGV2aWNlX29wZW4oY29uc3QgY2hhciogbmFtZSwgaW50IGlucF9jaGFubmVsKTsKKworLyogU3RhcnRzIGNhcHR1cmluZyBmcmFtZXMgZnJvbSB0aGUgY2FtZXJhIGRldmljZS4KKyAqIFBhcmFtOgorICogIGNkIC0gQ2FtZXJhIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIGEgY2FtZXJhIGRldmljZSBvcGVuZWQgaW4KKyAqICAgIGNhbWVyYV9kZXZpY2Vfb3BlbiByb3V0aW5lLgorICogIHBpeGVsX2Zvcm1hdCAtIERlZmluZXMgcGl4ZWwgZm9ybWF0IGZvciB0aGUgY2FwdHVyZWQgZnJhbWVzLiBNdXN0IGJlIG9uZSBvZgorICogICAgICB0aGUgZm9ybWF0cywgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLgorICogIHdpZHRoLCBoZWlnaHQgLSBGcmFtZSBkaW1lbnNpb25zIGZvciB0aGUgY2FwdHVyZWQgdmlkZW8gZnJhbWUuIE11c3QgbWF0Y2gKKyAqICAgICAgZGltZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGNhbWVyYSBmb3IgdGhlIHBpeGVsIGZvcm1hdCBkZWZpbmVkIGJ5IHRoZQorICogICAgICAncGl4ZWxfZm9ybWF0JyBwYXJhbWV0ZXIuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciBub24temVybyB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IGNhbWVyYV9kZXZpY2Vfc3RhcnRfY2FwdHVyaW5nKENhbWVyYURldmljZSogY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfaGVpZ2h0KTsKKworLyogU3RvcHMgY2FwdHVyaW5nIGZyYW1lcyBmcm9tIHRoZSBjYW1lcmEgZGV2aWNlLgorICogUGFyYW06CisgKiAgY2QgLSBDYW1lcmEgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgYSBjYW1lcmEgZGV2aWNlIG9wZW5lZCBpbgorICogICAgY2FtZXJhX2RldmljZV9vcGVuIHJvdXRpbmUuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciBub24temVybyB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IGNhbWVyYV9kZXZpY2Vfc3RvcF9jYXB0dXJpbmcoQ2FtZXJhRGV2aWNlKiBjZCk7CisKKy8qIENhcHR1cmVzIGEgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIGRldmljZS4KKyAqIFBhcmFtOgorICogIGNkIC0gQ2FtZXJhIGRlc2NyaXB0b3IgcmVwcmVzZW50aW5nIGEgY2FtZXJhIGRldmljZSBvcGVuZWQgaW4KKyAqICAgIGNhbWVyYV9kZXZpY2Vfb3BlbiByb3V0aW5lLgorICogIGZyYW1lYnVmZmVycyAtIEFycmF5IG9mIGZyYW1lYnVmZmVycyB3aGVyZSB0byByZWFkIHRoZSBmcmFtZS4gU2l6ZSBvZiB0aGlzCisgKiAgICAgIGFycmF5IGlzIGRlZmluZWQgYnkgdGhlICdmYnNfbnVtJyBwYXJhbWV0ZXIuIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3QKKyAqICAgICAgbWFrZSBzdXJlIHRoYXQgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gZW50aXJlIGZyYW1lIGNhcHR1cmVkCisgKiAgICAgIGZyb20gdGhlIGRldmljZS4KKyAqICBmYnNfbnVtIC0gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlICdmcmFtZWJ1ZmZlcnMnIGFycmF5LgorICogIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUgLSBXaGl0ZSBiYWxhbmNlIHNjYWxlLgorICogIGV4cF9jb21wIC0gRXhwc291cmUgY29tcGVuc2F0aW9uLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gdmFsdWUgb24gZmFpbHVyZS4gVGhlcmUgaXMgYSBzcGVjaWFsIHZhdWxlIDEKKyAqICByZXR1cm5lZCBmcm9tIHRoaXMgcm91dGluZSB3aGljaCBpbmRpY2F0ZXMgdGhhdCBmcmFtZXMgd2VyZSBub3QgYXZhaWxhYmxlIGluCisgKiAgdGhlIGRldmljZS4gVGhpcyB2YWx1ZSBpcyByZXR1cm5lZCBvbiBMaW51eCBpbXBsZW1lbnRhdGlvbiB3aGVuIGZyYW1lIGlvY3RsCisgKiAgaGFzIHJldHVybmVkIEVBR0FJTiBlcnJvci4gVGhlIGNsaWVudCBzaG91bGQgcmVzcG9uZCB0byB0aGlzIHZhbHVlIGJ5CisgKiAgcmVwZWF0aW5nIHRoZSByZWFkLCByYXRoZXIgdGhhbiByZXBvcnRpbmcgYW4gZXJyb3IuCisgKi8KK2V4dGVybiBpbnQgY2FtZXJhX2RldmljZV9yZWFkX2ZyYW1lKENhbWVyYURldmljZSogY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRGcmFtZUJ1ZmZlciogZnJhbWVidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZic19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBleHBfY29tcCk7CisKKy8qIENsb3NlcyBjYW1lcmEgZGV2aWNlLCBvcGVuZWQgaW4gY2FtZXJhX2RldmljZV9vcGVuIHJvdXRpbmUuCisgKiBQYXJhbToKKyAqICBjZCAtIENhbWVyYSBkZXNjcmlwdG9yIHJlcHJlc2VudGluZyBhIGNhbWVyYSBkZXZpY2Ugb3BlbmVkIGluCisgKiAgICBjYW1lcmFfZGV2aWNlX29wZW4gcm91dGluZS4KKyAqLworZXh0ZXJuIHZvaWQgY2FtZXJhX2RldmljZV9jbG9zZShDYW1lcmFEZXZpY2UqIGNkKTsKKworLyogRW51bWVyYXRlcyBjYW1lcmEgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlIGhvc3QsIGFuZCBjb2xsZWN0cyBpbmZvcm1hdGlvbgorICogYWJvdXQgZWFjaCBkZXZpY2UuCisgKiBBcHBhcmVudGx5LCBjYW1lcmEgZnJhbWV3b3JrIGluIHRoZSBndWVzdCB3aWxsIG9ubHkgYWNjZXB0IHRoZSB0aGUgWVYxMgorICogKFY0TDJfUElYX0ZNVF9ZVlU0MjApIHBpeGVsIGZvcm1hdC4gU28sIHdlIGRvbid0IHJlYWxseSBuZWVkIHRvIHJlcG9ydCBhbGwgdGhlCisgKiBwaXhlbCBmb3JtYXRzLCBzdXBwb3J0ZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UgYmFjayB0byB0aGUgZ3Vlc3QuIFdlIGNhbiBzaW1weQorICogcGljayBhbnkgZm9ybWF0IHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIGFuZCBjb2xsZWN0IGZyYW1lIGRpbWVuc2lvbnMKKyAqIGF2YWlsYWJsZSBmb3IgaXQuIFRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBpcyB0byBzcGVjaWZpY2FsbHkgY2hlY2ssIGlmIGNhbWVyYQorICogc3VwcG9ydCBZVjEyLCBhbmQgY2hvb3NlIGl0LCBpbiBvcmRlciB0byBzcGFyZSBzb21lIENQVSBjeWNsZXMgb24gdGhlCisgKiBjb252ZXJzaW9uLgorICogUGFyYW06CisgKiAgY2lzIC0gQW4gYWxsb2NhdGVkIGFycmF5IHdoZXJlIHRvIHN0b3JlIGluZm9ybWFpb24gYWJvdXQgZm91bmQgY2FtZXJhCisgKiAgICAgIGRldmljZXMuIEZvciBlYWNoIGZvdW5kIGNhbWVyYSBkZXZpY2UgYW4gZW50cnkgd2lsbCBiZSBpbml0aWFsaXplZCBpbiB0aGUKKyAqICAgICAgYXJyYXkuIEl0J3MgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvcgorICogICAgICB0aGUgZW50cmllcy4KKyAqICBtYXggLSBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRoYXQgY2FuIGZpdCBpbnRvIHRoZSBhcnJheS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2YgZW50cmllcyBhZGRlZCB0byB0aGUgJ2NpcycgYXJyYXkgb24gc3VjY2Vzcywgb3IgPCAwIG9uIGZhaWx1cmUuCisgKi8KK2V4dGVybiBpbnQgY2FtZXJhX2VudW1lcmF0ZV9kZXZpY2VzKENhbWVyYUluZm8qIGNpcywgaW50IG1heCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtY29tbW9uLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiM2YwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNvbW1vbi5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHJlYXNzaWduKGNoYXIqKiBwc3RyLCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICAgIGlmICgqcHN0cikgeworICAgICAgICA6OmZyZWUoKnBzdHIpOworICAgICAgICAqcHN0ciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmICh2YWx1ZSkgeworICAgICAgICAqcHN0ciA9IDo6c3RyZHVwKHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgY2FtZXJhX2luZm9fZG9uZShDYW1lcmFJbmZvKiBjaSkgeworICAgIGlmIChjaSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlYXNzaWduKCZjaS0+ZGlzcGxheV9uYW1lLCBudWxscHRyKTsKKyAgICAgICAgcmVhc3NpZ24oJmNpLT5kZXZpY2VfbmFtZSwgbnVsbHB0cik7CisgICAgICAgIGNpLT5pbnBfY2hhbm5lbCA9IDA7CisgICAgICAgIGNpLT5waXhlbF9mb3JtYXQgPSAwOworICAgICAgICByZWFzc2lnbigmY2ktPmRpcmVjdGlvbiwgbnVsbHB0cik7CisgICAgICAgIGlmIChjaS0+ZnJhbWVfc2l6ZXMpIHsKKyAgICAgICAgICAgIDo6ZnJlZShjaS0+ZnJhbWVfc2l6ZXMpOworICAgICAgICAgICAgY2ktPmZyYW1lX3NpemVzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjaS0+ZnJhbWVfc2l6ZXNfbnVtID0gMDsKKyAgICAgICAgY2ktPmluX3VzZSA9IDA7CisgICAgfQorfQorCit2b2lkIGNhbWVyYV9pbmZvX2NvcHkoQ2FtZXJhSW5mbyogY2ksIGNvbnN0IENhbWVyYUluZm8qIGZyb20pIHsKKyAgICBpZiAoIWZyb20pIHsKKyAgICAgICAgY2FtZXJhX2luZm9fZG9uZShjaSk7CisgICAgfSBlbHNlIGlmICgoY29uc3QgQ2FtZXJhSW5mbyopY2kgIT0gZnJvbSkgeworICAgICAgICByZWFzc2lnbigmY2ktPmRpc3BsYXlfbmFtZSwgZnJvbS0+ZGlzcGxheV9uYW1lKTsKKyAgICAgICAgcmVhc3NpZ24oJmNpLT5kZXZpY2VfbmFtZSwgZnJvbS0+ZGV2aWNlX25hbWUpOworICAgICAgICBjaS0+aW5wX2NoYW5uZWwgPSBmcm9tLT5pbnBfY2hhbm5lbDsKKyAgICAgICAgY2ktPnBpeGVsX2Zvcm1hdCA9IGZyb20tPnBpeGVsX2Zvcm1hdDsKKyAgICAgICAgcmVhc3NpZ24oJmNpLT5kaXJlY3Rpb24sIGZyb20tPmRpcmVjdGlvbik7CisgICAgICAgIGlmIChjaS0+ZnJhbWVfc2l6ZXMpIHsKKyAgICAgICAgICAgIDo6ZnJlZShjaS0+ZnJhbWVfc2l6ZXMpOworICAgICAgICAgICAgY2ktPmZyYW1lX3NpemVzID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjaS0+ZnJhbWVfc2l6ZXNfbnVtID0gZnJvbS0+ZnJhbWVfc2l6ZXNfbnVtOworICAgICAgICBpZiAoY2ktPmZyYW1lX3NpemVzX251bSA+IDApIHsKKyAgICAgICAgICAgIGNpLT5mcmFtZV9zaXplcyA9IHN0YXRpY19jYXN0PENhbWVyYUZyYW1lRGltKj4oCisgICAgICAgICAgICAgICAgICAgIDo6bWFsbG9jKHNpemVvZihjaS0+ZnJhbWVfc2l6ZXNbMF0pICogY2ktPmZyYW1lX3NpemVzX251bSkpOworICAgICAgICAgICAgOjptZW1jcHkoY2ktPmZyYW1lX3NpemVzLCBmcm9tLT5mcmFtZV9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgIGNpLT5mcmFtZV9zaXplc19udW0gKiBzaXplb2YoY2ktPmZyYW1lX3NpemVzWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgY2ktPmluX3VzZSA9IGZyb20tPmluX3VzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1jb21tb24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjg2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1jb21tb24uaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisvKgorICogQ29udGFpbnMgZGVjbGFyYXRpb25zIG9mIHBsYXRmb3JtLWluZGVwZW5kZW50IHRoZSBzdHVmZiB0aGF0IGlzIHVzZWQgaW4KKyAqIGNhbWVyYSBlbXVsYXRpb24uCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9taXNjLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpZmRlZiBfV0lOMzIKKy8qIEluY2x1ZGUgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG1pc3NpbmcgaW4gbm9uLUxpbnV4IGhlYWRlcnMuICovCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXdpbi5oIgorI2VsaWYgX0RBUldJTl9DX1NPVVJDRQorLyogSW5jbHVkZSBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbWlzc2luZyBpbiBub24tTGludXggaGVhZGVycy4gKi8KKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtd2luLmgiCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2VuZGlmICAvKiBfV0lOMzIgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2VuZGlmCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qCisgKiBUaGVzZSBhcmUgbWlzc2luZyBpbiB0aGUgY3VycmVudCBsaW51eC92aWRlb2RldjIuaAorICovCisKKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1lWWVUKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWWVUgICAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdZJywgJ1UnKQorI2VuZGlmIC8qIFY0TDJfUElYX0ZNVF9ZVllVICovCisjaWZuZGVmIFY0TDJfUElYX0ZNVF9WWVVZCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WWVVZICAgIHY0bDJfZm91cmNjKCdWJywgJ1knLCAnVScsICdZJykKKyNlbmRpZiAvKiBWNEwyX1BJWF9GTVRfVllVWSAqLworI2lmbmRlZiBWNEwyX1BJWF9GTVRfWVVZMgorI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVZMiAgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1knLCAnMicpCisjZW5kaWYgLyogVjRMMl9QSVhfRk1UX1lVWTIgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1lVTlYKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVTlYgICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdOJywgJ1YnKQorI2VuZGlmIC8qIFY0TDJfUElYX0ZNVF9ZVU5WICovCisjaWZuZGVmIFY0TDJfUElYX0ZNVF9WNDIyCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WNDIyICAgIHY0bDJfZm91cmNjKCdWJywgJzQnLCAnMicsICcyJykKKyNlbmRpZiAvKiBWNEwyX1BJWF9GTVRfVjQyMiAqLworI2lmbmRlZiBWNEwyX1BJWF9GTVRfWVlWVQorI2RlZmluZSBWNEwyX1BJWF9GTVRfWVlWVSAgICB2NGwyX2ZvdXJjYygnWScsICdZJywgJ1YnLCAnVScpCisjZW5kaWYgLyogVjRMMl9QSVhfRk1UX1lZVlUgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NHQlJHOAorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkc4ICB2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnRycpCisjZW5kaWYgIC8qIFY0TDJfUElYX0ZNVF9TR0JSRzggKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NHUkJHOAorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkc4ICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpCisjZW5kaWYgIC8qIFY0TDJfUElYX0ZNVF9TR1JCRzggKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NSR0dCOAorI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0I4ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0cnLCAnQicpCisjZW5kaWYgIC8qIFY0TDJfUElYX0ZNVF9TUkdHQjggKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NCR0dSMTAKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJ1wwJykKKyNlbmRpZiAgLyogVjRMMl9QSVhfRk1UX1NCR0dSMTAgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NHQlJHMTAKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHQlJHMTAgdjRsMl9mb3VyY2MoJ0cnLCAnQicsICcxJywgJ1wwJykKKyNlbmRpZiAgLyogVjRMMl9QSVhfRk1UX1NHQlJHMTAgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NHUkJHMTAKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTAgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJ1wwJykKKyNlbmRpZiAgLyogVjRMMl9QSVhfRk1UX1NHUkJHMTAgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NSR0dCMTAKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJ1wwJykKKyNlbmRpZiAgLyogVjRMMl9QSVhfRk1UX1NSR0dCMTAgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NCR0dSMTIKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSMTIgdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzInKQorI2VuZGlmICAvKiBWNEwyX1BJWF9GTVRfU0JHR1IxMiAqLworI2lmbmRlZiBWNEwyX1BJWF9GTVRfU0dCUkcxMgorI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMiB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnMicpCisjZW5kaWYgIC8qIFY0TDJfUElYX0ZNVF9TR0JSRzEyICovCisjaWZuZGVmIFY0TDJfUElYX0ZNVF9TR1JCRzEyCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzEyIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcyJykKKyNlbmRpZiAgLyogVjRMMl9QSVhfRk1UX1NHUkJHMTIgKi8KKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1NSR0dCMTIKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCMTIgdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzInKQorI2VuZGlmICAvKiBWNEwyX1BJWF9GTVRfU1JHR0IxMiAqLworCisvKiBEZXNjcmliZXMgZnJhbWVidWZmZXIsIHVzZWQgYnkgdGhlIGNsaWVudCBvZiBjYW1lcmEgY2FwdHVyaW5nIEFQSS4KKyAqIFRoaXMgZGVzY3JpdHB0b3IgaXMgdXNlZCBpbiBjYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWUgY2FsbC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ2xpZW50RnJhbWVCdWZmZXIgeworICAgIC8qIFBpeGVsIGZvcm1hdCB1c2VkIGluIHRoZSBjbGllbnQgZnJhbWVidWZmZXIuICovCisgICAgdWludDMyX3QgICAgcGl4ZWxfZm9ybWF0OworICAgIC8qIEFkZHJlc3Mgb2YgdGhlIGNsaWVudCBmcmFtZWJ1ZmZlci4gKi8KKyAgICB2b2lkKiAgICAgICBmcmFtZWJ1ZmZlcjsKK30gQ2xpZW50RnJhbWVCdWZmZXI7CisKKy8qIERlc2NyaWJlcyBmcmFtZSBkaW1lbnNpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCBDYW1lcmFGcmFtZURpbSB7CisgICAgLyogRnJhbWUgd2lkdGguICovCisgICAgaW50ICAgICB3aWR0aDsKKyAgICAvKiBGcmFtZSBoZWlnaHQuICovCisgICAgaW50ICAgICBoZWlnaHQ7Cit9IENhbWVyYUZyYW1lRGltOworCisvKiBDYW1lcmEgaW5mb3JtYXRpb24gZGVzY3JpcHRvciwgY29udGFpbmluZyBwcm9wZXJ0aWVzIG9mIGEgY2FtZXJhIGNvbm5lY3RlZAorICogdG8gdGhlIGhvc3QuCisgKgorICogSW5zdGFuY2VzIG9mIHRoaXMgc3RydWN0dXJlIGFyZSBjcmVhdGVkIGR1cmluZyBjYW1lcmEgZGV2aWNlIGVudW1lcmF0aW9ucywKKyAqIGFuZCBhcmUgY29uc2lkZXJlZCB0byBiZSBjb25zdGFudCBldmVyeXdoZXJlIGVsc2UuIFRoZSBvbmx5IGV4Y2VwdGlvbiB0byB0aGlzCisgKiBydWxlIGlzIGNoYW5naW5nIHRoZSAnaW5fdXNlJyBmbGFnIGR1cmluZyBjcmVhdGlvbiAvIGRlc3RydWN0aW9uIG9mIGEgc2VydmljZQorICogcmVwcmVzZW50aW5nIHRoYXQgY2FtZXJhLgorICovCit0eXBlZGVmIHN0cnVjdCBDYW1lcmFJbmZvIHsKKyAgICAvKiBVc2VyLWZyaWVuZGx5IGNhbWVyYSBkaXNwbGF5IG5hbWUuICovCisgICAgY2hhciogICAgICAgICAgICAgICBkaXNwbGF5X25hbWU7CisgICAgLyogRGV2aWNlIG5hbWUgZm9yIHRoZSBjYW1lcmEuICovCisgICAgY2hhciogICAgICAgICAgICAgICBkZXZpY2VfbmFtZTsKKyAgICAvKiBJbnB1dCBjaGFubmVsIGZvciB0aGUgY2FtZXJhLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaW5wX2NoYW5uZWw7CisgICAgLyogUGl4ZWwgZm9ybWF0IGNob3NlbiBmb3IgdGhlIGNhbWVyYS4gKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIHBpeGVsX2Zvcm1hdDsKKyAgICAvKiBEaXJlY3Rpb24gdGhlIGNhbWVyYSBpcyBmYWNpbmc6ICdmcm9udCcsIG9yICdiYWNrJyAqLworICAgIGNoYXIqICAgICAgICAgICAgICAgZGlyZWN0aW9uOworICAgIC8qIEFycmF5IG9mIGZyYW1lIHNpemVzIHN1cHBvcnRlZCBmb3IgdGhlIHBpeGVsIGZvcm1hdCBjaG9zZW4gZm9yIHRoZSBjYW1lcmEuCisgICAgICogVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQgYnkgdGhlIGZyYW1lX3NpemVzX251bSBmaWVsZCBvZiB0aGlzCisgICAgICogc3RydWN0dXJlLiAqLworICAgIENhbWVyYUZyYW1lRGltKiAgICAgZnJhbWVfc2l6ZXM7CisgICAgLyogTnVtYmVyIG9mIGZyYW1lIHNpemVzIHN1cHBvcnRlZCBmb3IgdGhlIHBpeGVsIGZvcm1hdCBjaG9zZW4KKyAgICAgKiBmb3IgdGhlIGNhbWVyYS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGZyYW1lX3NpemVzX251bTsKKyAgICAvKiBJbiB1c2Ugc3RhdHVzLiBXaGVuIHRoZXJlIGlzIGEgY2FtZXJhIHNlcnZpY2UgY3JlYXRlZCBmb3IgdGhpcyBjYW1lcmEsCisgICAgICogImluIHVzZSIgaXMgc2V0IHRvIG9uZS4gT3RoZXJ3aXNlIHRoaXMgZmxhZyBpcyB6ZXQgdG8gMC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGluX3VzZTsKK30gQ2FtZXJhSW5mbzsKKworLyogRnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIENhbWVyYUluZm8gaW5zdGFuY2UgKE5PVCBpbmNsdWRpbmcgdGhlCisgKiBpbnN0YW5jZSBpdHNlbGYpLiAqLwordm9pZCBjYW1lcmFfaW5mb19kb25lKENhbWVyYUluZm8qIGNpKTsKKworLyogQ29weSBhIENhbWVyYUluZm8gaW5zdGFuY2UgfCpmcm9tfCBpbnRvIHwqY2l8LiAqLwordm9pZCBjYW1lcmFfaW5mb19jb3B5KENhbWVyYUluZm8qIGNpLCBjb25zdCBDYW1lcmFJbmZvKiBmcm9tKTsKKworLyogRGVzY3JpYmVzIGEgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2UuCisgKiBUaGlzIGlzIGEgcHJhdGZvcm0taW5kZXBlbmRlbnQgY2FtZXJhIGRldmljZSBkZXNjcmlwdG9yIHRoYXQgaXMgdXNlZCBpbgorICogdGhlIGNhbWVyYSBBUEkuCisgKi8KK3R5cGVkZWYgc3RydWN0IENhbWVyYURldmljZSB7CisgICAgLyogT3BhcXVlIHBvaW50ZXIgdXNlZCBieSB0aGUgY2FtZXJhIGNhcHR1cmluZyBBUEkuICovCisgICAgdm9pZCogICAgICAgb3BhcXVlOworfSBDYW1lcmFEZXZpY2U7CisKKy8qIFJldHVybnMgY3VycmVudCB0aW1lIGluIG1pY3Jvc2Vjb25kcy4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHVpbnQ2NF90CitfZ2V0X3RpbWVzdGFtcCh2b2lkKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwOworICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgcmV0dXJuICh1aW50NjRfdCl0LnR2X3NlYyAqIDEwMDAwMDBMTCArIHQudHZfdXNlYzsKK30KKworLyogU2xlZXBzIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mIG1pbGxpc2Vjb25kcyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorX2NhbWVyYV9zbGVlcChpbnQgbWlsbGlzZWMpCit7CisgICAgc3RydWN0IHRpbWV2YWwgdDsKKyAgICBjb25zdCB1aW50NjRfdCB3YWtlX2F0ID0gX2dldF90aW1lc3RhbXAoKSArICh1aW50NjRfdCltaWxsaXNlYyAqIDEwMDA7CisgICAgZG8geworICAgICAgICBjb25zdCB1aW50NjRfdCBzdGFtcCA9IF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgIGlmICgoc3RhbXAgLyAxMDAwKSA+PSAod2FrZV9hdCAvIDEwMDApKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0LnR2X3NlYyA9ICh3YWtlX2F0IC0gc3RhbXApIC8gMTAwMDAwMDsKKyAgICAgICAgdC50dl91c2VjID0gKHdha2VfYXQgLSBzdGFtcCkgLSAodWludDY0X3QpdC50dl9zZWMgKiAxMDAwMDAwOworICAgIH0gd2hpbGUgKHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdCkgPCAwICYmIGVycm5vID09IEVJTlRSKTsKK30KKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1mb3JtYXQtY29udmVydGVycy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtZm9ybWF0LWNvbnZlcnRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI4Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtZm9ybWF0LWNvbnZlcnRlcnMuYwpAQCAtMCwwICsxLDE3MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWZvcm1hdC1jb252ZXJ0ZXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9taXNjLmgiCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSAgRSguLi4pICAgIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFcoLi4uKSAgICBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKGNhbWVyYSxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKGNhbWVyYSkKKworIC8qCisgKiBOT1RFOiBSR0IgYW5kIGJpZy9saXR0bGUgZW5kaWFuIGNvbnNpZGVyYXRpb25zLiBXaGVyZXdlciBpbiB0aGlzIGNvZGUgUkdCCisgKiBwaXhlbHMgYXJlIHJlcHJlc2VudGVkIGFzIFdPUkQsIG9yIERXT1JELCB0aGUgY29sb3Igb3JkZXIgaW5zaWRlIHRoZQorICogV09SRCAvIERXT1JEIG1hdGNoZXMgdGhlIG9uZSB0aGF0IHdvdWxkIG9jY3VyIGlmIHRoYXQgV09SRCAvIERXT1JEIHdvdWxkIGhhdmUKKyAqIGJlZW4gcmVhZCBmcm9tIHRoZSB0eXBlY2FzdGVkIGZyYW1lYnVmZmVyOgorICoKKyAqICAgICAgY29uc3QgdWludDMyX3QgcmdiID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihmcmFtZWJ1ZmZlcik7CisgKgorICogU28sIGlmIHRoaXMgY29kZSBydW5zIG9uIHRoZSBsaXR0bGUgZW5kaWFuIENQVSwgcmVkIGNvbG9yIGluICdyZ2InIHdvdWxkIGJlCisgKiBtYXNrZWQgYXMgMHgwMDAwMDBmZiwgYW5kIGJsdWUgY29sb3Igd291bGQgYmUgbWFza2VkIGFzIDB4MDBmZjAwMDAsIHdoaWxlIGlmCisgKiB0aGUgY29kZSBydW5zIG9uIGEgYmlnIGVuZGlhbiBDUFUsIHRoZSByZWQgY29sb3IgaW4gJ3JnYicgd291bGQgYmUgbWFza2VkIGFzCisgKiAweGZmMDAwMDAwLCBhbmQgYmx1ZSBjb2xvciB3b3VsZCBiZSBtYXNrZWQgYXMgMHgwMDAwZmYwMCwKKyAqLworCisvKgorICogUkdCNTY1IGNvbG9yIG1hc2tzCisgKi8KKworI2lmbmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorc3RhdGljIGNvbnN0IHVpbnQxNl90IGtSZWQ1ICAgICA9IDB4MDAxZjsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrR3JlZW42ICAgPSAweDA3ZTA7CitzdGF0aWMgY29uc3QgdWludDE2X3Qga0JsdWU1ICAgID0gMHhmODAwOworI2Vsc2UgICAvLyAhSE9TVF9XT1JEU19CSUdFTkRJQU4KK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrUmVkNSAgICAgPSAweGY4MDA7CitzdGF0aWMgY29uc3QgdWludDE2X3Qga0dyZWVuNiAgID0gMHgwN2UwOworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtCbHVlNSAgICA9IDB4MDAxZjsKKyNlbmRpZiAgLy8gIUhPU1RfV09SRFNfQklHRU5ESUFOCisKKy8qCisgKiBSR0IzMiBjb2xvciBtYXNrcworICovCisKKyNpZm5kZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUga1JlZDggICAgICgodWludDMyX3QpMHgwMDAwMDBmZlUpCisjZGVmaW5lIGtHcmVlbjggICAoKHVpbnQzMl90KTB4MDAwMGZmMDBVKQorI2RlZmluZSBrQmx1ZTggICAgKCh1aW50MzJfdCkweDAwZmYwMDAwVSkKKyNlbHNlICAgLy8gIUhPU1RfV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIGtSZWQ4ICAgICAoKHVpbnQzMl90KTB4MDBmZjAwMDBVKQorI2RlZmluZSBrR3JlZW44ICAgKCh1aW50MzJfdCkweDAwMDBmZjAwVSkKKyNkZWZpbmUga0JsdWU4ICAgICgodWludDMyX3QpMHgwMDAwMDBmZlUpCisjZW5kaWYgIC8vICFIT1NUX1dPUkRTX0JJR0VORElBTgorCisvKgorICogRXh0cmFjdGluZywgYW5kIHNhdmluZyBjb2xvciBieXRlcyBmcm9tIC8gdG8gV09SRCAvIERXT1JEIFJHQi4KKyAqLworCisjaWZuZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisvKiBFeHRyYWN0IHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJ5dGVzIGZyb20gUkdCNTY1IHdvcmQuICovCisjZGVmaW5lIFIxNihyZ2IpICAgICh1aW50OF90KSgocmdiKSAmIGtSZWQ1KQorI2RlZmluZSBHMTYocmdiKSAgICAodWludDhfdCkoKChyZ2IpICYga0dyZWVuNikgPj4gNSkKKyNkZWZpbmUgQjE2KHJnYikgICAgKHVpbnQ4X3QpKCgocmdiKSAmIGtCbHVlNSkgPj4gMTEpCisvKiBNYWtlIDggYml0cyByZWQsIGdyZWVuLCBhbmQgYmx1ZSwgZXh0cmFjdGVkIGZyb20gUkdCNTY1IHdvcmQuICovCisjZGVmaW5lIFIxNl8zMihyZ2IpICh1aW50OF90KSgoKChyZ2IpICYga1JlZDUpIDw8IDMpIHwgKCgocmdiKSAmIGtSZWQ1KSA+PiAyKSkKKyNkZWZpbmUgRzE2XzMyKHJnYikgKHVpbnQ4X3QpKCgoKHJnYikgJiBrR3JlZW42KSA+PiAzKSB8ICgoKHJnYikgJiBrR3JlZW42KSA+PiA5KSkKKyNkZWZpbmUgQjE2XzMyKHJnYikgKHVpbnQ4X3QpKCgoKHJnYikgJiBrQmx1ZTUpID4+IDgpIHwgKCgocmdiKSAmIGtCbHVlNSkgPj4gMTQpKQorLyogRXh0cmFjdCByZWQsIGdyZWVuLCBhbmQgYmx1ZSBieXRlcyBmcm9tIFJHQjMyIGR3b3JkLiAqLworI2RlZmluZSBSMzIocmdiKSAgICAodWludDhfdCkoKHJnYikgJiBrUmVkOCkKKyNkZWZpbmUgRzMyKHJnYikgICAgKHVpbnQ4X3QpKCgoKHJnYikgJiBrR3JlZW44KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIEIzMihyZ2IpICAgICh1aW50OF90KSgoKChyZ2IpICYga0JsdWU4KSA+PiAxNikgJiAweGZmKQorLyogQnVpbGQgUkdCNTY1IHdvcmQgZnJvbSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBieXRlcy4gKi8KKyNkZWZpbmUgUkdCNTY1KHIsIGcsIGIpICh1aW50MTZfdCkoKCgoKHVpbnQxNl90KShiKSA8PCA2KSB8IChnKSkgPDwgNSkgfCAocikpCisvKiBCdWlsZCBSR0IzMiBkd29yZCBmcm9tIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJ5dGVzLiAqLworI2RlZmluZSBSR0IzMihyLCBnLCBiKSAodWludDMyX3QpKCgoKCh1aW50MzJfdCkoYikgPDwgOCkgfCAoZykpIDw8IDgpIHwgKHIpKQorI2Vsc2UgICAvLyAhSE9TVF9XT1JEU19CSUdFTkRJQU4KKy8qIEV4dHJhY3QgcmVkLCBncmVlbiwgYW5kIGJsdWUgYnl0ZXMgZnJvbSBSR0I1NjUgd29yZC4gKi8KKyNkZWZpbmUgUjE2KHJnYikgICAgKHVpbnQ4X3QpKCgocmdiKSAmIGtSZWQ1KSA+PiAxMSkKKyNkZWZpbmUgRzE2KHJnYikgICAgKHVpbnQ4X3QpKCgocmdiKSAmIGtHcmVlbjYpID4+IDUpCisjZGVmaW5lIEIxNihyZ2IpICAgICh1aW50OF90KSgocmdiKSAmIGtCbHVlNSkKKy8qIE1ha2UgOCBiaXRzIHJlZCwgZ3JlZW4sIGFuZCBibHVlLCBleHRyYWN0ZWQgZnJvbSBSR0I1NjUgd29yZC4gKi8KKyNkZWZpbmUgUjE2XzMyKHJnYikgKHVpbnQ4X3QpKCgoKHJnYikgJiBrUmVkNSkgPj4gOCkgfCAoKChyZ2IpICYga1JlZDUpID4+IDE0KSkKKyNkZWZpbmUgRzE2XzMyKHJnYikgKHVpbnQ4X3QpKCgoKHJnYikgJiBrR3JlZW42KSA+PiAzKSB8ICgoKHJnYikgJiBrR3JlZW42KSA+PiA5KSkKKyNkZWZpbmUgQjE2XzMyKHJnYikgKHVpbnQ4X3QpKCgoKHJnYikgJiBrQmx1ZTUpIDw8IDMpIHwgKCgocmdiKSAmIGtCbHVlNSkgPj4gMikpCisvKiBFeHRyYWN0IHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJ5dGVzIGZyb20gUkdCMzIgZHdvcmQuICovCisjZGVmaW5lIFIzMihyZ2IpICAgICh1aW50OF90KSgoKHJnYikgJiBrUmVkOCkgPj4gMTYpCisjZGVmaW5lIEczMihyZ2IpICAgICh1aW50OF90KSgoKHJnYikgJiBrR3JlZW44KSA+PiA4KQorI2RlZmluZSBCMzIocmdiKSAgICAodWludDhfdCkoKHJnYikgJiBrQmx1ZTgpCisvKiBCdWlsZCBSR0I1NjUgd29yZCBmcm9tIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGJ5dGVzLiAqLworI2RlZmluZSBSR0I1NjUociwgZywgYikgKHVpbnQxNl90KSgoKCgodWludDE2X3QpKHIpIDw8IDYpIHwgKGcpKSA8PCA1KSB8IChiKSkKKy8qIEJ1aWxkIFJHQjMyIGR3b3JkIGZyb20gcmVkLCBncmVlbiwgYW5kIGJsdWUgYnl0ZXMuICovCisjZGVmaW5lIFJHQjMyKHIsIGcsIGIpICh1aW50MzJfdCkoKCgoKHVpbnQzMl90KShyKSA8PCA4KSB8IChnKSkgPDwgOCkgfCAoYikpCisjZW5kaWYgIC8vICFIT1NUX1dPUkRTX0JJR0VORElBTgorCisvKgorICogQkFZRVIgYml0bWFza3MKKyAqLworCisvKiBCaXRtYXNrIGZvciA4LWJpdHMgQkFZRVIgcGl4ZWwuICovCisjZGVmaW5lIGtCYXllcjggICAgIDB4ZmYKKy8qIEJpdG1hc2sgZm9yIDEwLWJpdHMgQkFZRVIgcGl4ZWwuICovCisjZGVmaW5lIGtCYXllcjEwICAgIDB4M2ZmCisvKiBCaXRtYXNrIGZvciAxMi1iaXRzIEJBWUVSIHBpeGVsLiAqLworI2RlZmluZSBrQmF5ZXIxMiAgICAweGZmZgorCisvKiBBbiB1bmlvbiB0aGF0IHNpbXBsaWZpZXMgYnJlYWtpbmcgMzIgYml0IFJHQiBpbnRvIHNlcGFyYXRlIFIsIEcsIGFuZCBCIGNvbG9ycy4KKyAqLwordHlwZWRlZiB1bmlvbiBSR0IzMl90IHsKKyAgICB1aW50MzJfdCAgICBjb2xvcjsKKyAgICBzdHJ1Y3QgeworI2lmbmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICB1aW50OF90IHI7IHVpbnQ4X3QgZzsgdWludDhfdCBiOyB1aW50OF90IGE7CisjZWxzZSAgIC8vICFIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICB1aW50OF90IGE7IHVpbnQ4X3QgYjsgdWludDhfdCBnOyB1aW50OF90IHI7CisjZW5kaWYgIC8vIEhPU1RfV09SRFNfQklHRU5ESUFOCisgICAgfTsKK30gUkdCMzJfdDsKKworLyogQ2xpcHMgYSB2YWx1ZSB0byB0aGUgdW5zaWduZWQgMC0yNTUgcmFuZ2UsIHRyZWF0aW5nIG5lZ2F0aXZlIHZhbHVlcyBhcyB6ZXJvLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2NsYW1wKGludCB4KQoreworICAgIGlmICh4ID4gMjU1KSByZXR1cm4gMjU1OworICAgIGlmICh4IDwgMCkgICByZXR1cm4gMDsKKyAgICByZXR1cm4geDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCYXNpY3Mgb2YgUkdCIC0+IFlVViBjb252ZXJzaW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFJHQiAtPiBZVVYgY29udmVyc2lvbiBtYWNyb3MKKyAqLworI2RlZmluZSBSR0IyWShyLCBnLCBiKSAodWludDhfdCkoKCg2NiAqIChyKSArIDEyOSAqIChnKSArICAyNSAqIChiKSArIDEyOCkgPj4gOCkgKyAgMTYpCisjZGVmaW5lIFJHQjJVKHIsIGcsIGIpICh1aW50OF90KSgoKC0zOCAqIChyKSAtIDc0ICogKGcpICsgMTEyICogKGIpICsgMTI4KSA+PiA4KSArIDEyOCkKKyNkZWZpbmUgUkdCMlYociwgZywgYikgKHVpbnQ4X3QpKCgoMTEyICogKHIpIC0gOTQgKiAoZykgLSAgMTggKiAoYikgKyAxMjgpID4+IDgpICsgMTI4KQorCisvKiBDb252ZXJ0cyBSOCBHOCBCOCBjb2xvciB0byBZVVYuICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitSOEc4QjhUb1lVVih1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiLCB1aW50OF90KiB5LCB1aW50OF90KiB1LCB1aW50OF90KiB2KQoreworICAgICp5ID0gUkdCMlkoKGludClyLCAoaW50KWcsIChpbnQpYik7CisgICAgKnUgPSBSR0IyVSgoaW50KXIsIChpbnQpZywgKGludCliKTsKKyAgICAqdiA9IFJHQjJWKChpbnQpciwgKGludClnLCAoaW50KWIpOworfQorCisjaWYgMAorLyogQ29udmVydHMgUkdCNTY1IGNvbG9yIHRvIFlVVi4gKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK1JHQjU2NVRvWVVWKHVpbnQxNl90IHJnYiwgdWludDhfdCogeSwgdWludDhfdCogdSwgdWludDhfdCogdikKK3sKKyAgICBSOEc4QjhUb1lVVihSMTZfMzIocmdiKSwgRzE2XzMyKHJnYiksIEIxNl8zMihyZ2IpLCB5LCB1LCB2KTsKK30KKworLyogQ29udmVydHMgUkdCMzIgY29sb3IgdG8gWVVWLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorUkdCMzJUb1lVVih1aW50MzJfdCByZ2IsIHVpbnQ4X3QqIHksIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYpCit7CisgICAgUkdCMzJfdCByZ2JfYzsKKyAgICByZ2JfYy5jb2xvciA9IHJnYjsKKyAgICBSOEc4QjhUb1lVVihyZ2JfYy5yLCByZ2JfYy5nLCByZ2JfYy5iLCB5LCB1LCB2KTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJhc2ljcyBvZiBZVVYgLT4gUkdCIGNvbnZlcnNpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlVViAtPiBSR0IgY29udmVyc2lvbiBtYWNyb3MKKyAqLworCisvKiAiT3B0aW1pemVkIiBtYWNyb3MgdGhhdCB0YWtlIHNwZWNpYWx5IHByZXBhcmVkIFksIFUsIGFuZCBWIHZhbHVlczoKKyAqICBDID0gWSAtIDE2CisgKiAgRCA9IFUgLSAxMjgKKyAqICBFID0gViAtIDEyOAorICovCisjZGVmaW5lIFlVVjJSTyhDLCBELCBFKSBjbGFtcCgoMjk4ICogKEMpICsgNDA5ICogKEUpICsgMTI4KSA+PiA4KQorI2RlZmluZSBZVVYyR08oQywgRCwgRSkgY2xhbXAoKDI5OCAqIChDKSAtIDEwMCAqIChEKSAtIDIwOCAqIChFKSArIDEyOCkgPj4gOCkKKyNkZWZpbmUgWVVWMkJPKEMsIEQsIEUpIGNsYW1wKCgyOTggKiAoQykgKyA1MTYgKiAoRCkgKyAxMjgpID4+IDgpCisKKy8qCisgKiAgTWFpbiBtYWNyb3MgdGhhdCB0YWtlIHRoZSBvcmlnaW5hbCBZLCBVLCBhbmQgViB2YWx1ZXMKKyAqLworI2RlZmluZSBZVVYyUih5LCB1LCB2KSBjbGFtcCgoMjk4ICogKCh5KS0xNikgKyA0MDkgKiAoKHYpLTEyOCkgKyAxMjgpID4+IDgpCisjZGVmaW5lIFlVVjJHKHksIHUsIHYpIGNsYW1wKCgyOTggKiAoKHkpLTE2KSAtIDEwMCAqICgodSktMTI4KSAtIDIwOCAqICgodiktMTI4KSArIDEyOCkgPj4gOCkKKyNkZWZpbmUgWVVWMkIoeSwgdSwgdikgY2xhbXAoKDI5OCAqICgoeSktMTYpICsgNTE2ICogKCh1KS0xMjgpICsgMTI4KSA+PiA4KQorCisKKyNpZiAwCisvKiBDb252ZXJ0cyBZVVYgY29sb3IgdG8gUkdCNTY1LiAqLworc3RhdGljIF9faW5saW5lX18gdWludDE2X3QKK1lVVlRvUkdCNTY1KGludCB5LCBpbnQgdSwgaW50IHYpCit7CisgICAgLyogQ2FsY3VsYXRlIEMsIEQsIGFuZCBFIHZhbHVlcyBmb3IgdGhlIG9wdGltaXplZCBtYWNyby4gKi8KKyAgICB5IC09IDE2OyB1IC09IDEyODsgdiAtPSAxMjg7CisgICAgY29uc3QgdWludDE2X3QgciA9IFlVVjJSTyh5LHUsdikgPj4gMzsKKyAgICBjb25zdCB1aW50MTZfdCBnID0gWVVWMkdPKHksdSx2KSA+PiAyOworICAgIGNvbnN0IHVpbnQxNl90IGIgPSBZVVYyQk8oeSx1LHYpID4+IDM7CisgICAgcmV0dXJuIFJHQjU2NShyLCBnLCBiKTsKK30KKworLyogQ29udmVydHMgWVVWIGNvbG9yIHRvIFJHQjMyLiAqLworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QKK1lVVlRvUkdCMzIoaW50IHksIGludCB1LCBpbnQgdikKK3sKKyAgICAvKiBDYWxjdWxhdGUgQywgRCwgYW5kIEUgdmFsdWVzIGZvciB0aGUgb3B0aW1pemVkIG1hY3JvLiAqLworICAgIHkgLT0gMTY7IHUgLT0gMTI4OyB2IC09IDEyODsKKyAgICBSR0IzMl90IHJnYjsKKyAgICByZ2IuciA9IFlVVjJSTyh5LHUsdik7CisgICAgcmdiLmcgPSBZVVYyR08oeSx1LHYpOworICAgIHJnYi5iID0gWVVWMkJPKHksdSx2KTsKKyAgICByZXR1cm4gcmdiLmNvbG9yOworfQorI2VuZGlmCisKKy8qIENvbnZlcnRzIFlVViBjb2xvciB0byBzZXBhcmF0ZWQgUkdCMzIgY29sb3JzLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorWVVWVG9SR0JQaXgoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogciwgdWludDhfdCogZywgdWludDhfdCogYikKK3sKKyAgICAvKiBDYWxjdWxhdGUgQywgRCwgYW5kIEUgdmFsdWVzIGZvciB0aGUgb3B0aW1pemVkIG1hY3JvLiAqLworICAgIHkgLT0gMTY7IHUgLT0gMTI4OyB2IC09IDEyODsKKyAgICAqciA9ICh1aW50OF90KVlVVjJSTyh5LHUsdik7CisgICAgKmcgPSAodWludDhfdClZVVYyR08oeSx1LHYpOworICAgICpiID0gKHVpbnQ4X3QpWVVWMkJPKHksdSx2KTsKK30KKworLyogQ29tcHV0ZXMgYSBsdW1pbmFuY2UgdmFsdWUgYWZ0ZXIgdGFraW5nIHRoZSBleHBvc3VyZSBjb21wZW5zYXRpb24uCisgKiB2YWx1ZSBpbnRvIGFjY291bnQuCisgKgorICogUGFyYW06CisgKiBpbnB1dFkgLSBUaGUgaW5wdXQgbHVtaW5hbmNlIHZhbHVlLgorICogUmV0dXJuOgorICogVGhlIGx1bWluYW5jZSB2YWx1ZSBhZnRlciBhZGp1c3RpbmcgdGhlIGV4cG9zdXJlIGNvbXBlbnNhdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lX18gdWludDhfdAorX2NoYW5nZV9leHBvc3VyZSh1aW50OF90IGlucHV0WSwgZmxvYXQgZXhwX2NvbXApCit7CisgICAgcmV0dXJuICh1aW50OF90KWNsYW1wKChmbG9hdClpbnB1dFkgKiBleHBfY29tcCk7Cit9CisKKy8qIEFkanVzdHMgYW4gUkdCIHBpeGVsIGZvciB0aGUgZ2l2ZW4gZXhwb3N1cmUgY29tcGVuc2F0aW9uLiAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorX2NoYW5nZV9leHBvc3VyZV9SR0IodWludDhfdCogciwgdWludDhfdCogZywgdWludDhfdCogYiwgZmxvYXQgZXhwX2NvbXApCit7CisgICAgdWludDhfdCB5LCB1LCB2OworICAgIFI4RzhCOFRvWVVWKCpyLCAqZywgKmIsICZ5LCAmdSwgJnYpOworICAgIFlVVlRvUkdCUGl4KF9jaGFuZ2VfZXhwb3N1cmUoeSwgZXhwX2NvbXApLCB1LCB2LCByLCBnLCBiKTsKK30KKworLyogQWRqdXN0cyBhbiBSR0IgcGl4ZWwgZm9yIHRoZSBnaXZlbiBleHBvc3VyZSBjb21wZW5zYXRpb24uICovCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitfY2hhbmdlX2V4cG9zdXJlX1JHQl9pKGludCogciwgaW50KiBnLCBpbnQqIGIsIGZsb2F0IGV4cF9jb21wKQoreworICAgIHVpbnQ4X3QgeSwgdSwgdjsKKyAgICBSOEc4QjhUb1lVVigqciwgKmcsICpiLCAmeSwgJnUsICZ2KTsKKyAgICB5ID0gX2NoYW5nZV9leHBvc3VyZSh5LCBleHBfY29tcCk7CisgICAgKnIgPSBZVVYyUk8oeSx1LHYpOworICAgICpnID0gWVVWMkdPKHksdSx2KTsKKyAgICAqYiA9IFlVVjJCTyh5LHUsdik7Cit9CisKKy8qIENvbXB1dGVzIHRoZSBwaXhlbCB2YWx1ZSBhZnRlciBhZGp1c3RpbmcgdGhlIHdoaXRlIGJhbGFuY2UgdG8gdGhlIGN1cnJlbnQKKyAqIG9uZS4gVGhlIGlucHV0IHRoZSB5LCB1LCB2IGNoYW5uZWwgb2YgdGhlIHBpeGVsIGFuZCB0aGUgYWRqdXN0ZWQgdmFsdWUgd2lsbAorICogYmUgc3RvcmVkIGluIHBsYWNlLiBUaGUgYWRqdXN0bWVudCBpcyBkb25lIGluIFJHQiBzcGFjZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorX2NoYW5nZV93aGl0ZV9iYWxhbmNlX1lVVih1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiX3NjYWxlKQoreworICAgIGludCByID0gKGZsb2F0KShZVVYyUigoaW50KSp5LCAoaW50KSp1LCAoaW50KSp2KSkgLyByX3NjYWxlOworICAgIGludCBnID0gKGZsb2F0KShZVVYyRygoaW50KSp5LCAoaW50KSp1LCAoaW50KSp2KSkgLyBnX3NjYWxlOworICAgIGludCBiID0gKGZsb2F0KShZVVYyQigoaW50KSp5LCAoaW50KSp1LCAoaW50KSp2KSkgLyBiX3NjYWxlOworCisgICAgKnkgPSBSR0IyWShyLCBnLCBiKTsKKyAgICAqdSA9IFJHQjJVKHIsIGcsIGIpOworICAgICp2ID0gUkdCMlYociwgZywgYik7Cit9CisKKy8qIENvbXB1dGVzIHRoZSBwaXhlbCB2YWx1ZSBhZnRlciBhZGp1c3RpbmcgdGhlIHdoaXRlIGJhbGFuY2UgdG8gdGhlIGN1cnJlbnQKKyAqIG9uZS4gVGhlIGlucHV0IHRoZSByLCBhbmQgYiBjaGFubmVscyBvZiB0aGUgcGl4ZWwgYW5kIHRoZSBhZGp1c3RlZCB2YWx1ZSB3aWxsCisgKiBiZSBzdG9yZWQgaW4gcGxhY2UuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK19jaGFuZ2Vfd2hpdGVfYmFsYW5jZV9SR0IoaW50KiByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYl9zY2FsZSkKK3sKKyAgICAqciA9IChmbG9hdCkqciAvIHJfc2NhbGU7CisgICAgKmcgPSAoZmxvYXQpKmcgLyBnX3NjYWxlOworICAgICpiID0gKGZsb2F0KSpiIC8gYl9zY2FsZTsKK30KKworLyogQ29tcHV0ZXMgdGhlIHBpeGVsIHZhbHVlIGFmdGVyIGFkanVzdGluZyB0aGUgd2hpdGUgYmFsYW5jZSB0byB0aGUgY3VycmVudAorICogb25lLiBUaGUgaW5wdXQgdGhlIHIsIGFuZCBiIGNoYW5uZWxzIG9mIHRoZSBwaXhlbCBhbmQgdGhlIGFkanVzdGVkIHZhbHVlIHdpbGwKKyAqIGJlIHN0b3JlZCBpbiBwbGFjZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZAorX2NoYW5nZV93aGl0ZV9iYWxhbmNlX1JHQl9iKHVpbnQ4X3QqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiX3NjYWxlKQoreworICAgICpyID0gKGZsb2F0KSpyIC8gcl9zY2FsZTsKKyAgICAqZyA9IChmbG9hdCkqZyAvIGdfc2NhbGU7CisgICAgKmIgPSAoZmxvYXQpKmIgLyBiX3NjYWxlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgY29udmVydGVycyBiZXR3ZWVuIFlVViBhbmQgUkdCIGZvcm1hdHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlIGNvbnZlcnRlcnMgZ28gbGluZSBieSBsaW5lLCBjb252ZXJpbmcgb25lIGZyYW1lIGZvcm1hdCB0byBhbm90aGVyLgorICogSXQncyBwcmV0dHkgbXVjaCBzdHJhaWdodCBmb3J3YXJkIGZvciBSR0IvQlJHLCB3aGVyZSBhbGwgY29sb3JzIGFyZQorICogZ3JvdXBlZCBuZXh0IHRvIGVhY2ggb3RoZXIgaW4gbWVtb3J5LiBUaGUgb25seSB0d28gdGhpbmdzIHRoYXQgZGlmZmVyIG9uZSBSR0IKKyAqIGZvcm1hdCBmcm9tIGFub3RoZXIgYXJlOgorICogLSBJcyBpdCBhbiBSR0IsIG9yIEJSRyAoaS5lLiBjb2xvciBvcmRlcmluZykKKyAqIC0gSXMgaXQgMTYsIDI0LCBvciAzMiBiaXRzIGZvcm1hdC4KKyAqIEFsbCB0aGVzZSBkaWZmZXJlbmNlcyBhcmUgYWRkcmVzc2VkIGJ5IGxvYWRfcmdiIC8gc2F2ZV9yZ2Igcm91dGluZXMsIHByb3ZpZGVkCisgKiBmb3IgZWFjaCBmb3JtYXQgaW4gdGhlIFJHQiBkZXNjcmlwdG9yIHRvIGxvYWQgLyBzYXZlIFJHQiBjb2xvciBieXRlcyBmcm9tIC8gdG8KKyAqIHRoZSBidWZmZXIuIEFzIGZhciBhcyBtb3ZpbmcgZnJvbSBvbmUgUkdCIHBpeGVsIHRvIHRoZSBuZXh0LCB0aGVyZQorICogYXJlIHR3byBxdWVzdGlvbiB0byBjb25zaWRlcjoKKyAqIC0gSG93IG1hbnkgYnl0ZXMgaXQgdGFrZXMgdG8gZW5jb2RlIG9uZSBSR0IgcGl4ZWwgKGNvdWxkIGJlIDIsIDMsIG9yIDQpCisgKiAtIEhvdyBtYW55IGJ5dGVzIGl0IHRha2VzIHRvIGVuY29kZSBhIGxpbmUgKGkuZS4gbGluZSBhbGlnbm1lbnQgaXNzdWUsIHdoaWNoCisgKiAgIG1ha2VzIHNlbmNlIG9ubHkgZm9yIDI0LWJpdCBmb3JtYXRzLCBzaW5jZSAxNiwgYW5kIDMyIGJpdCBmb3JtYXRzIHByb3ZpZGUKKyAqICAgYXV0b21hdGljIHdvcmQgYWxpZ25tZW50LikKKyAqIFRoZSBmaXJzdCBxdWVzdGlvbiBpcyBhbnN3ZXJlZCB3aXRoIHRoZSAncmdiX2luYycgZmllbGQgb2YgdGhlIFJHQiBkZXNjcmlwdG9yLAorICogYW5kIHRoZSBzZWNvbmQgb25lIGlzIGRvbmUgYnkgYWxpZ25pbmcgcmdiIHBvaW50ZXIgdXAgdG8gdGhlIG5lYXJlc3QgMTYgYml0CisgKiBib3VuZGFyaWVzIGF0IHRoZSBlbmQgb2YgZWFjaCBsaW5lLgorICogWVVWIGZvcm1hdCBoYXMgbXVjaCBncmVhdGVyIGNvbXBsZXhpdHkgZm9yIGNvbnZlcnNpb24uIGluIFlVViBjb2xvciBlbmNvZGluZworICogaXMgZGl2aWRlZCBpbnRvIHRocmVlIHNlcGFyYXRlIHBhbmVzIHRoYXQgY2FuIGJlIG1peGVkIHRvZ2V0aGVyIGluIGFueSB3YXkKKyAqIGltYWdpbmFibGUuIEZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgc3RpbGwgc29tZSBjb25zaXN0ZW50IHBhdHRlcm5zIGluIGRpZmZlcmVudAorCisgKiBZVVYgZm9ybWF0cyB0aGF0IGNhbiBiZSBhYnN0cmFjdGVkIHRocm91Z2ggYSBkZXNjcmlwdG9yOgorICogLSBBdCB0aGUgbGluZS1ieS1saW5lIGxldmVsLCBjb2xvcnMgYXJlIGFsd2F5cyBncm91cHBlZCBhcm91ZCBwYWlycyBvZiBwaXhlbHMsCisgKiAgIHdoZXJlIGVhY2ggcGl4ZWwgaW4gdGhlIHBhaXIgaGFzIGl0cyBvd24gWSB2YWx1ZSwgYW5kIGVhY2ggcGFpciBvZiBwaXhlbHMKKyAqICAgc2hhcmUgdGhlc2FtZSBVLCBhbmQgViB2YWx1ZXMuCisgKiAtIFBvc2l0aW9uIG9mIFksIFUsIGFuZCBWIGlzIHRoZSBzYW1lIGZvciBlYWNoIHBhaXIsIHNvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuCisgKiAgIFlzLCBhbmQgVS9WIGZvciBhZGphY2VudCBwYWlycyBpcyB0aGUgc2FtZS4KKyAqIC0gSW5zaWRlIHRoZSBwYWlyLCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gWXMgaXMgYWx3YXlzIHRoZSBzYW1lLgorCisgKiBNb3ZpbmcgYmV0d2VlbiB0aGUgbGluZXMgaW4gWVVWIGNhbiBhbHNvIGJlIGVhc2lseSBmb3JtYWxpemVkLiBFc3NlbnRpYWxseSwKKyAqIHRoZXJlIGFyZSB0aHJlZSB3YXlzIGhvdyBjb2xvciBwYW5lcyBhcmUgYXJyYW5nZWQ6CisgKiAxLiBBbGwgaW50ZXJsZWF2ZWQsIHdoZXJlIGFsbCB0aHJlZSBZLCBVLCBhbmQgViB2YWx1ZXMgYXJlIGVuY29kZWQgdG9nZXRoZXIgaW4KKyAqICAgIG9uZSBibG9jazoKKyAqICAgICAgICAgICAgICAgMSwyICAzLDQgIDUsNiAgICAgIG4sbisxCisgKiAgICAgICAgICAgICAgWVVWWSBZVVZZIFlVVlkgLi4uLiBZVVZZCisgKgorICogICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gZW5jb2RlIFlVViA0OjI6MiBmb3JtYXRzLgorICoKKyAqIDIuIE9uZSBzZXBhcmF0ZSBibG9jayBvZiBtZW1vcnkgZm9yIFkgcGFuZSwgYW5kIG9uZSBzZXBhcmF0ZSBibG9jayBvZiBtZW1vcnkKKyAqICAgIGNvbnRhaW5pbmcgaW50ZXJsZWF2ZWQgVSwgYW5kIFYgcGFuZXMuCisgKgorICogICAgICBZWSB8IFlZIHwgWVkgfCBZWQorICogICAgICBZWSB8IFlZIHwgWVkgfCBZWQorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLQorICogICAgICBVViB8IFVWIHwgVVYgfCBVVgorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGVuY29kZSA0OjI6MCBmb3JtYXRzLgorICoKKyAqIDMuIFRocmVlIHNlcGFyYXRlIGJsb2NrcyBvZiBtZW1vcnkgZm9yIGVhY2ggcGFuZS4KKyAqCisgKiAgICAgIFlZIHwgWVkgfCBZWSB8IFlZCisgKiAgICAgIFlZIHwgWVkgfCBZWSB8IFlZCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIFUgIHwgVSAgfCBVICB8IFUKKyAqICAgICAgViAgfCBWICB8IFYgIHwgVgorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgIFRoaXMgdHlwZSBpcyBhbHNvIHVzZWQgdG8gZW5jb2RlIDQ6MjowIGZvcm1hdHMuCisgKgorICogTm90ZSB0aGF0IGluIGNhc2VzIDIsIGFuZCAzIGVhY2ggcGFpciBvZiBVIGFuZCBWIGlzIHNoYXJlZCBhbW9uZyBmb3VyIHBpeGVscywKKyAqIGdyb3VwZWQgdG9nZXRoZXIgYXMgdGhleSBhcmUgZ3JvdXBwZWQgaW4gdGhlIGZyYW1lYmVmZmVyOiBkaXZpZGUgdGhlIGZyYW1lJ3MKKyAqIHJlY3RhbmdsZSBpbnRvIDJ4MiBwaXhlbHMgc3F1YXJlcywgc3RhcnRpbmcgZnJvbSAwLDAgY29ybmVyIC0gYW5kIGVhY2ggc3F1YXJlCisgKiByZXByZXNlbnRzIHRoZSBncm91cCBvZiBwaXhlbHMgdGhhdCBzaGFyZSBzYW1lIHBhaXIgb2YgVVYgdmFsdWVzLiBTbywgZWFjaAorICogbGluZSBpbiB0aGUgVS9WIHBhbmVzIHRhYmxlIGlzIHNoYXJlZCBiZXR3ZWVuIHR3byBhZGphY2VudCBsaW5lcyBpbiBZIHBhbmUsCisgKiB3aGljaCBwcm92aWRlcyBhIHBhdHRlcm4gb24gaG93IHRvIG1vdmUgYmV0d2VlbiBVL1YgbGluZXMgYXMgd2UgbW92ZSBiZXR3ZWVuCisgKiBZIGxpbmVzLgorICoKKyAqIFNvLCBhbGwgdGhlc2UgcGF0dGVybnMgY2FuIGJlIGNvZGVkIGluIGEgWVVWIGZvcm1hdCBkZXNjcmlwdG9yLCBzbyB0aGVyZSBjYW4KKyAqIGp1c3Qgb25lIGdlbmVyaWMgd2F5IG9mIHdhbGtpbmcgWVVWIGZyYW1lLgorICoKKyAqIEJBWUVSIGZvcm1hdC4KKyAqIFdlIGRvbid0IHVzZSBCQVlFUiBpbnNpZGUgdGhlIGd1ZXN0IHN5c3RlbSwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEKKyAqIGNvbnZlcnRlciB0byB0aGUgQkFZRVIgZm9ybWF0cywgb25seSBmcm9tIGl0LiBUaGUgY29sb3IgYXBwcm94aW1hdGlvbiAgdXNlZCBpbgorICogdGhlIEJBWUVSIGZvcm1hdCBjb252ZXJ0ZXJzIGltcGxlbWVudGVkIGhlcmUgc2ltcGx5IGF2ZXJhZ2VzIGNvcnJlc3BvbmRlZAorICogY29sb3IgdmFsdWVzIGZvdW5kIGluIHBpeGVscyBzb3Jyb3VuZGluZyB0aGUgb25lIGZvciB3aGljaCBSR0IgY29sb3JzIGFyZQorICogY2FsY3VsYXRlZC4KKyAqCisgKiBQZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9uczoKKyAqIFNpbmNlIGNvbnZlcnRlcnMgaW1wbGVtZW50ZWQgaGVyZSBhcmUgaW50ZW5kZWQgdG8gd29yayBhcyBwYXJ0IG9mIHRoZSBjYW1lcmEKKyAqIGVtdWxhdGlvbiwgbWFraW5nIHRoZSBjb2RlIHN1cGVyIHBlcmZvcm1hbnQgaXMgbm90IGEgcHJpb3JpdHkgYXQgYWxsLiBUaGVyZQorICogd2lsbCBiZSBlbm91Z2ggbG9zZXMgaW4gb3RoZXIgcGFydHMgb2YgdGhlIGVtdWx0aW9uIHRvIG92ZXJsb29rIGFueSBzbGlnaHQKKyAqIGluZWZmaWNpZW5jZXMgaW4gdGhlIGNvbnZlcnNpb24gYWxnb3JpdGhtIGFzIG5lZ2xlY3RhYmxlLgorICovCisKK3R5cGVkZWYgc3RydWN0IFJHQkRlc2MgUkdCRGVzYzsKK3R5cGVkZWYgc3RydWN0IFlVVkRlc2MgWVVWRGVzYzsKK3R5cGVkZWYgc3RydWN0IEJheWVyRGVzYyBCYXllckRlc2M7CisKKy8qIFByb3RvdHlwZSBmb3IgYSByb3V0aW5lIHRoYXQgbG9hZHMgUkdCIGNvbG9ycyBmcm9tIGFuIFJHQi9CUkcgc3RyZWFtLgorICogUGFyYW06CisgKiAgcmdiIC0gUG9pbnRlciB0byBhIHBpeGVsIGluc2lkZSB0aGUgc3RyZWFtIHdoZXJlIHRvIGxvYWQgY29sb3JzIGZyb20uCisgKiAgciwgZywgYiAtIFVwb24gcmV0dXJuIHdpbGwgY29udGFpbiByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb2xvcnMgZm9yIHRoZSBwaXhlbAorICogICAgICBhZGRyZXNzZWQgYnkgJ3JnYicgcG9pbnRlci4KKyAqIFJldHVybjoKKyAqICBQb2ludGVyIHRvIHRoZSBuZXh0IHBpeGVsIGluIHRoZSBzdHJlYW0uCisgKi8KK3R5cGVkZWYgY29uc3Qgdm9pZCogKCpsb2FkX3JnYl9mdW5jKShjb25zdCB2b2lkKiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGIpOworCisvKiBQcm90b3R5cGUgZm9yIGEgcm91dGluZSB0aGF0IHNhdmVzIFJHQiBjb2xvcnMgdG8gYW4gUkdCL0JSRyBzdHJlYW0uCisgKiBQYXJhbToKKyAqICByZ2IgLSBQb2ludGVyIHRvIGEgcGl4ZWwgaW5zaWRlIHRoZSBzdHJlYW0gd2hlcmUgdG8gc2F2ZSBjb2xvcnMuCisgKiAgciwgZywgYiAtIFJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbG9ycyB0byBzYXZlIHRvIHRoZSBwaXhlbCBhZGRyZXNzZWQgYnkKKyAqICAgICAgJ3JnYicgcG9pbnRlci4KKyAqIFJldHVybjoKKyAqICBQb2ludGVyIHRvIHRoZSBuZXh0IHBpeGVsIGluIHRoZSBzdHJlYW0uCisgKi8KK3R5cGVkZWYgdm9pZCogKCpzYXZlX3JnYl9mdW5jKSh2b2lkKiByZ2IsIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIpOworCisvKiBQcm90b3R5cGUgZm9yIGEgcm91dGluZSB0aGF0IGNhbGN1bGF0ZXMgYW4gb2Zmc2V0IG9mIHRoZSBmaXJzdCBZLCBVIG9yIFYKKyAqIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbGluZSBpbiBhIFlVViBmcmFtZWJ1ZmZlci4KKyAqIFBhcmFtOgorICogIGRlc2MgLSBEZXNjcmlwdG9yIGZvciB0aGUgWVVWIGZyYW1lIGZvciB3aGljaCB0aGUgb2Zmc2V0IGlzIGJlaW5nIGNhbGN1bGF0ZWQuCisgKiAgbGluZSAtIFplcm8tYmFzZWQgbGluZSBudW1iZXIgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LgorICogIHdpZHRoLCBoZWlnaHQgLSBGcmFtZSBkaW1lbnNpb25zLgorICogUmV0dXJuOgorICogIE9mZnNldCBvZiB0aGUgZmlyc3QgWSwgVSBvciBWIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZnJhbWUgbGluZS4gVGhlIG9mZnNldAorICogIHJldHVybmVkIGhlcmUgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgWVVWIGZyYW1lYnVmZmVyLgorICovCit0eXBlZGVmIGludCAoKnl1dl9vZmZzZXRfZnVuYykoY29uc3QgWVVWRGVzYyogZGVzYywgaW50IGxpbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qIFJHQi9CUkcgZm9ybWF0IGRlc2NyaXB0b3IuICovCitzdHJ1Y3QgUkdCRGVzYyB7CisgICAgLyogUm91dGluZSB0aGF0IGxvYWRzIFJHQiBjb2xvcnMgZnJvbSBhIGJ1ZmZlci4gKi8KKyAgICBsb2FkX3JnYl9mdW5jICAgbG9hZF9yZ2I7CisgICAgLyogUm91dGluZSB0aGF0IHNhdmVzIFJHQiBjb2xvcnMgaW50byBhIGJ1ZmZlci4gKi8KKyAgICBzYXZlX3JnYl9mdW5jICAgc2F2ZV9yZ2I7CisgICAgLyogQnl0ZSBzaXplIG9mIGFuIGVuY29kZWQgUkdCIHBpeGVsLiAqLworICAgIGludCAgICAgICAgICAgICByZ2JfaW5jOworfTsKKworLyogWVVWIGZvcm1hdCBkZXNjcmlwdG9yLiAqLworc3RydWN0IFlVVkRlc2MgeworICAgIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgWSB2YWx1ZSBpbiBhIGZ1bGx5IGludGVybGVhdmVkIFlVViBmcmFtZWJ1ZmZlci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgWV9vZmZzZXQ7CisgICAgLyogRGlzdGFuY2UgYmV0d2VlbiB0d28gWSB2YWx1ZXMgaW5zaWRlIGEgcGFpciBvZiBwaXhlbHMgaW4gYSBmdWxseQorICAgICAqIGludGVybGVhdmVkIFlVViBmcmFtZWJ1ZmZlci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgWV9pbmM7CisgICAgLyogRGlzdGFuY2UgYmV0d2VlbiBmaXJzdCBZIHZhbHVlcyBvZiB0aGUgYWRqYWNlbnQgcGl4ZWwgcGFpcnMgaW4gYSBmdWxseQorICAgICAqIGludGVybGVhdmVkIFlVViBmcmFtZWJ1ZmZlci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgWV9uZXh0X3BhaXI7CisgICAgLyogSW5jcmVtZW50IGJldHdlZW4gYWRqYWNlbnQgVS9WIHZhbHVlcyBpbiBhIFlVViBmcmFtZWJ1ZmZlci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgVVZfaW5jOworICAgIC8qIENvbnRyb2xzIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBVIHZhbHVlIGluIFlVViBmcmFtZWJ1ZmZlci4gRGVwZW5kaW5nIG9uCisgICAgICogdGhlIGFjdHVhbCBZVVYgZm9ybWF0IGNhbiBtZWFuIHRocmVlIHRoaW5nczoKKyAgICAgKiAgLSBGb3IgZnVsbHkgaW50ZXJsZWF2ZWQgWVVWIGZvcm1hdHMgY29udGFpbnMgb2Zmc2V0IG9mIHRoZSBmaXJzdCBVIHZhbHVlCisgICAgICogICAgaW4gZWFjaCBsaW5lLgorICAgICAqICAtIEZvciBZVVYgZm9ybWF0IHRoYXQgdXNlIHNlcGFyYXRlLCBidXQgaW50ZXJsZWF2ZWQgVVYgcGFuZSwgdGhpcyBmaWVsZAorICAgICAqICAgIGNvbnRhaW5zIGFuIG9mZnNldCBvZiB0aGUgZmlyc3QgVSB2YWx1ZSBpbiB0aGUgVVYgcGFuZS4KKyAgICAgKiAgLSBGb3IgWVVWIGZvcm1hdCB0aGF0IHVzZSBmdWxseSBzZXBhcmF0ZWQgWSwgVSwgYW5kIFYgcGFuZXMgdGhpcyBmaWVsZAorICAgICAqICAgIGRlZmluZXMgb3JkZXIgb2YgVSBhbmQgViBwYW5lcyBpbiB0aGUgZnJhbWVidWZmZXI6CisgICAgICogICAgICA9IDEgLSBVIHBhbmUgY29tZXMgZmlyc3QsIHJpZ2h0IGFmdGVyIFkgcGFuZS4KKyAgICAgKiAgICAgID0gMCAtIFUgcGFuZSBmb2xsb3dzIFYgcGFuZSB0aGF0IHN0YXJ0ZXMgcmlnaHQgYWZ0ZXIgWSBwYW5lLiAqLworICAgIGludCAgICAgICAgICAgICBVX29mZnNldDsKKyAgICAvKiBDb250cm9scyBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgViB2YWx1ZSBpbiBZVVYgZnJhbWVidWZmZXIuCisgICAgICogU2VlIGNvbW1lbnRzIHRvIFVfb2Zmc2V0IGZvciBtb3JlIGluZm8uICovCisgICAgaW50ICAgICAgICAgICAgIFZfb2Zmc2V0OworICAgIC8qIFJvdXRpbmUgdGhhdCBjYWxjdWxhdGVzIGFuIG9mZnNldCBvZiB0aGUgZmlyc3QgWSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxpbmUKKyAgICAgKiBpbiBhIFlVViBmcmFtZWJ1ZmZlci4gKi8KKyAgICB5dXZfb2Zmc2V0X2Z1bmMgeV9vZmZzZXQ7CisgICAgLyogUm91dGluZSB0aGF0IGNhbGN1bGF0ZXMgYW4gb2Zmc2V0IG9mIHRoZSBmaXJzdCBVIHZhbHVlIGZvciB0aGUgZ2l2ZW4gbGluZQorICAgICAqIGluIGEgWVVWIGZyYW1lYnVmZmVyLiAqLworICAgIHl1dl9vZmZzZXRfZnVuYyB1X29mZnNldDsKKyAgICAvKiBSb3V0aW5lIHRoYXQgY2FsY3VsYXRlcyBhbiBvZmZzZXQgb2YgdGhlIGZpcnN0IFYgdmFsdWUgZm9yIHRoZSBnaXZlbiBsaW5lCisgICAgICogaW4gYSBZVVYgZnJhbWVidWZmZXIuICovCisgICAgeXV2X29mZnNldF9mdW5jIHZfb2Zmc2V0OworfTsKKworLyogQmF5ZXIgZm9ybWF0IGRlc2NyaXB0b3IuICovCitzdHJ1Y3QgQmF5ZXJEZXNjIHsKKyAgICAvKiBEZWZpbmVzIGNvbG9yIG9yZGVyaW5nIGluIHRoZSBCQVlFUiBmcmFtZWJ1ZmZlci4gQ2FuIGJlIG9uZSBvZiB0aGUgZm91cjoKKyAgICAgKiAgLSAiR0JSRyIgZm9yIEdCR0JHQiAvIFJHUkdSRworICAgICAqICAtICJHUkJHIiBmb3IgR1JHUkdSIC8gQkdCR0JHCisgICAgICogIC0gIlJHR0IiIGZvciBSR1JHUkcgLyBHQkdCR0IKKyAgICAgKiAgLSAiQkdHUiIgZm9yIEJHQkdCRyAvIEdSR1JHUgorICAgICAqLworICAgIGNvbnN0IGNoYXIqIGNvbG9yX29yZGVyOworICAgIC8qIEJpdG1hc2sgZm9yIHZhbGlkIGJpdHMgaW4gdGhlIHBpeGVsOgorICAgICAqICAtIDB4ZmYgIEZvciBhIDgtYml0IEJBWUVSIGZvcm1hdAorICAgICAqICAtIDB4M2ZmIEZvciBhIDEwLWJpdCBCQVlFUiBmb3JtYXQKKyAgICAgKiAgLSAweGZmZiBGb3IgYSAxMi1iaXQgQkFZRVIgZm9ybWF0CisgICAgICovCisgICAgaW50ICAgICAgICAgbWFzazsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkdCL0JSRyBsb2FkIC8gc2F2ZSByb3V0aW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBMb2FkcyBSLCBHLCBhbmQgQiBjb2xvcnMgZnJvbSBhIFJHQjMyIGZyYW1lYnVmZmVyLiAqLworc3RhdGljIGNvbnN0IHZvaWQqCitfbG9hZF9SR0IzMihjb25zdCB2b2lkKiByZ2IsIHVpbnQ4X3QqIHIsIHVpbnQ4X3QqIGcsIHVpbnQ4X3QqIGIpCit7CisgICAgY29uc3QgdWludDhfdCogcmdiX3B0ciA9IChjb25zdCB1aW50OF90KilyZ2I7CisgICAgKnIgPSByZ2JfcHRyWzBdOyAqZyA9IHJnYl9wdHJbMV07ICpiID0gcmdiX3B0clsyXTsKKyAgICByZXR1cm4gcmdiX3B0ciArIDQ7Cit9CisKKy8qIFNhdmVzIFIsIEcsIGFuZCBCIGNvbG9ycyB0byBhIFJHQjMyIGZyYW1lYnVmZmVyLiAqLworc3RhdGljIHZvaWQqCitfc2F2ZV9SR0IzMih2b2lkKiByZ2IsIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIpCit7CisgICAgdWludDhfdCogcmdiX3B0ciA9ICh1aW50OF90KilyZ2I7CisgICAgcmdiX3B0clswXSA9IHI7IHJnYl9wdHJbMV0gPSBnOyByZ2JfcHRyWzJdID0gYjsKKyAgICByZXR1cm4gcmdiX3B0ciArIDQ7Cit9CisKKy8qIExvYWRzIFIsIEcsIGFuZCBCIGNvbG9ycyBmcm9tIGEgQlJHMzIgZnJhbWVidWZmZXIuICovCitzdGF0aWMgY29uc3Qgdm9pZCoKK19sb2FkX0JSRzMyKGNvbnN0IHZvaWQqIHJnYiwgdWludDhfdCogciwgdWludDhfdCogZywgdWludDhfdCogYikKK3sKKyAgICBjb25zdCB1aW50OF90KiByZ2JfcHRyID0gKGNvbnN0IHVpbnQ4X3QqKXJnYjsKKyAgICAqciA9IHJnYl9wdHJbMl07ICpnID0gcmdiX3B0clsxXTsgKmIgPSByZ2JfcHRyWzBdOworICAgIHJldHVybiByZ2JfcHRyICsgNDsKK30KKworLyogU2F2ZXMgUiwgRywgYW5kIEIgY29sb3JzIHRvIGEgQlJHMzIgZnJhbWVidWZmZXIuICovCitzdGF0aWMgdm9pZCoKK19zYXZlX0JSRzMyKHZvaWQqIHJnYiwgdWludDhfdCByLCB1aW50OF90IGcsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50OF90KiByZ2JfcHRyID0gKHVpbnQ4X3QqKXJnYjsKKyAgICByZ2JfcHRyWzJdID0gcjsgcmdiX3B0clsxXSA9IGc7IHJnYl9wdHJbMF0gPSBiOworICAgIHJldHVybiByZ2JfcHRyICsgNDsKK30KKworLyogTG9hZHMgUiwgRywgYW5kIEIgY29sb3JzIGZyb20gYSBSR0IyNCBmcmFtZWJ1ZmZlci4KKyAqIE5vdGUgdGhhdCBpdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBvZiB0aGUKKyAqIHJldHVybmVkIHBvaW50ZXIgYXQgdGhlIGxpbmUncyBicmVhay4gKi8KK3N0YXRpYyBjb25zdCB2b2lkKgorX2xvYWRfUkdCMjQoY29uc3Qgdm9pZCogcmdiLCB1aW50OF90KiByLCB1aW50OF90KiBnLCB1aW50OF90KiBiKQoreworICAgIGNvbnN0IHVpbnQ4X3QqIHJnYl9wdHIgPSAoY29uc3QgdWludDhfdCopcmdiOworICAgICpyID0gcmdiX3B0clswXTsgKmcgPSByZ2JfcHRyWzFdOyAqYiA9IHJnYl9wdHJbMl07CisgICAgcmV0dXJuIHJnYl9wdHIgKyAzOworfQorCisvKiBTYXZlcyBSLCBHLCBhbmQgQiBjb2xvcnMgdG8gYSBSR0IyNCBmcmFtZWJ1ZmZlci4KKyAqIE5vdGUgdGhhdCBpdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgcHJvcGVyIGFsaWdubWVudCBvZiB0aGUKKyAqIHJldHVybmVkIHBvaW50ZXIgYXQgdGhlIGxpbmUncyBicmVhay4gKi8KK3N0YXRpYyB2b2lkKgorX3NhdmVfUkdCMjQodm9pZCogcmdiLCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiKQoreworICAgIHVpbnQ4X3QqIHJnYl9wdHIgPSAodWludDhfdCopcmdiOworICAgIHJnYl9wdHJbMF0gPSByOyByZ2JfcHRyWzFdID0gZzsgcmdiX3B0clsyXSA9IGI7CisgICAgcmV0dXJuIHJnYl9wdHIgKyAzOworfQorCisvKiBMb2FkcyBSLCBHLCBhbmQgQiBjb2xvcnMgZnJvbSBhIEJSRzMyIGZyYW1lYnVmZmVyLgorICogTm90ZSB0aGF0IGl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZQorICogcmV0dXJuZWQgcG9pbnRlciBhdCB0aGUgbGluZSdzIGJyZWFrLiAqLworc3RhdGljIGNvbnN0IHZvaWQqCitfbG9hZF9CUkcyNChjb25zdCB2b2lkKiByZ2IsIHVpbnQ4X3QqIHIsIHVpbnQ4X3QqIGcsIHVpbnQ4X3QqIGIpCit7CisgICAgY29uc3QgdWludDhfdCogcmdiX3B0ciA9IChjb25zdCB1aW50OF90KilyZ2I7CisgICAgKnIgPSByZ2JfcHRyWzJdOyAqZyA9IHJnYl9wdHJbMV07ICpiID0gcmdiX3B0clswXTsKKyAgICByZXR1cm4gcmdiX3B0ciArIDM7Cit9CisKKy8qIFNhdmVzIFIsIEcsIGFuZCBCIGNvbG9ycyB0byBhIEJSRzI0IGZyYW1lYnVmZmVyLgorICogTm90ZSB0aGF0IGl0J3MgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZQorICogcmV0dXJuZWQgcG9pbnRlciBhdCB0aGUgbGluZSdzIGJyZWFrLiAqLworc3RhdGljIHZvaWQqCitfc2F2ZV9CUkcyNCh2b2lkKiByZ2IsIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIpCit7CisgICAgdWludDhfdCogcmdiX3B0ciA9ICh1aW50OF90KilyZ2I7CisgICAgcmdiX3B0clsyXSA9IHI7IHJnYl9wdHJbMV0gPSBnOyByZ2JfcHRyWzBdID0gYjsKKyAgICByZXR1cm4gcmdiX3B0ciArIDM7Cit9CisKKy8qIExvYWRzIFIsIEcsIGFuZCBCIGNvbG9ycyBmcm9tIGEgUkdCNTY1IGZyYW1lYnVmZmVyLiAqLworc3RhdGljIGNvbnN0IHZvaWQqCitfbG9hZF9SR0IxNihjb25zdCB2b2lkKiByZ2IsIHVpbnQ4X3QqIHIsIHVpbnQ4X3QqIGcsIHVpbnQ4X3QqIGIpCit7CisgICAgY29uc3QgdWludDE2X3QgcmdiMTYgPSAqKGNvbnN0IHVpbnQxNl90KilyZ2I7CisgICAgKnIgPSBSMTYocmdiMTYpOyAqZyA9IEcxNihyZ2IxNik7ICpiID0gQjE2KHJnYjE2KTsKKyAgICByZXR1cm4gKGNvbnN0IHVpbnQ4X3QqKXJnYiArIDI7Cit9CisKKy8qIFNhdmVzIFIsIEcsIGFuZCBCIGNvbG9ycyB0byBhIFJHQjU2NSBmcmFtZWJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkKgorX3NhdmVfUkdCMTYodm9pZCogcmdiLCB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiKQoreworICAgICoodWludDE2X3QqKXJnYiA9IFJHQjU2NShyICYgMHgxZiwgZyAmIDB4M2YsIGIgJiAweDFmKTsKKyAgICByZXR1cm4gKHVpbnQ4X3QqKXJnYiArIDI7Cit9CisKKyNpZiAwCisvKiBMb2FkcyBSLCBHLCBhbmQgQiBjb2xvcnMgZnJvbSBhIEJSRzU2NSBmcmFtZWJ1ZmZlci4gKi8KK3N0YXRpYyBjb25zdCB2b2lkKgorX2xvYWRfQlJHMTYoY29uc3Qgdm9pZCogcmdiLCB1aW50OF90KiByLCB1aW50OF90KiBnLCB1aW50OF90KiBiKQoreworICAgIGNvbnN0IHVpbnQxNl90IHJnYjE2ID0gKihjb25zdCB1aW50MTZfdCopcmdiOworICAgICpyID0gQjE2KHJnYjE2KTsgKmcgPSBHMTYocmdiMTYpOyAqYiA9IFIxNihyZ2IxNik7CisgICAgcmV0dXJuIChjb25zdCB1aW50OF90KilyZ2IgKyAyOworfQorCisvKiBTYXZlcyBSLCBHLCBhbmQgQiBjb2xvcnMgdG8gYSBCUkc1NjUgZnJhbWVidWZmZXIuICovCitzdGF0aWMgdm9pZCoKK19zYXZlX0JSRzE2KHZvaWQqIHJnYiwgdWludDhfdCByLCB1aW50OF90IGcsIHVpbnQ4X3QgYikKK3sKKyAgICAqKHVpbnQxNl90KilyZ2IgPSBSR0I1NjUoYiAmIDB4MWYsIGcgJiAweDNmLCByICYgMHgxZik7CisgICAgcmV0dXJuICh1aW50OF90KilyZ2IgKyAyOworfQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWVVWJ3MgWS9VL1Ygb2Zmc2V0IGNhbGN1bGF0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFkgb2Zmc2V0IGluIGFuIGFsaWduZWQgZm9ybWF0IHN1Y2ggYXMgWVYxMiAqLworc3RhdGljIGludCBZT2ZmQWxpZ25lZFlVVihjb25zdCBZVVZEZXNjKiBkZXNjLCBpbnQgbGluZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBzdHJpZGUgPSBhbGlnbih3aWR0aCwgMTYpOworICAgIC8vIEFzIHRoZSBuYW1lIGltcGxpZXMgdGhlIFlfbmV4dF9wYWlyIHZhbHVlIHNraXBzIGEgcGFpciBvZiB2YWx1ZXMuIFNpbmNlCisgICAgLy8gdGhpcyBpcyBjb3VudGluZyB2YWx1ZXMsIG5vdCBwYWlycywgcGVyIGxpbmUgd2UgZGl2aWRlIGJ5IHR3by4KKyAgICByZXR1cm4gbGluZSAqIHN0cmlkZSAqIChkZXNjLT5ZX25leHRfcGFpciAvIDIpICsgZGVzYy0+WV9vZmZzZXQ7Cit9CisKKy8qIFkgb2Zmc2V0IGluIGEgcGFja2VkIGZvcm1hdCB3aXRoIG5vIHBhZGRpbmcgb3IgYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLworc3RhdGljIGludCBZT2ZmUGFja2VkWVVWKGNvbnN0IFlVVkRlc2MqIGRlc2MsIGludCBsaW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgLy8gQXMgdGhlIG5hbWUgaW1wbGllcyB0aGUgWV9uZXh0X3BhaXIgdmFsdWUgc2tpcHMgYSBwYWlyIG9mIHZhbHVlcy4gU2luY2UKKyAgICAvLyB0aGlzIGlzIGNvdW50aW5nIHZhbHVlcywgbm90IHBhaXJzLCBwZXIgbGluZSB3ZSBkaXZpZGUgYnkgdHdvLgorICAgIHJldHVybiBsaW5lICogd2lkdGggKiAoZGVzYy0+WV9uZXh0X3BhaXIgLyAyKSArIGRlc2MtPllfb2Zmc2V0OworfQorCisvKiBVIG9mZnNldCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIFlVViA0OjI6MiAqLworc3RhdGljIGludAorX1VPZmZJbnRybFlVVihjb25zdCBZVVZEZXNjKiBkZXNjLCBpbnQgbGluZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIC8qIEluIGludGVybGVhdmVkIFlVViA0OjI6MiBlYWNoIHBhaXIgb2YgcGl4ZWxzIGlzIGVuY29kZWQgd2l0aCA0IGNvbnNlY3V0aXZlCisgICAgICogYnl0ZXMgKG9yIDIgYnl0ZXMgcGVyIHBpeGVsKS4gU28gbGluZSBzaXplIGluIGEgZnVsbHkgaW50ZXJsZWF2ZWQgWVVWIDQ6MjoyCisgICAgICogaXMgdHdpY2UgaXRzIHdpZHRoLiAqLworICAgIHJldHVybiBsaW5lICogd2lkdGggKiAyICsgZGVzYy0+VV9vZmZzZXQ7Cit9CisKKy8qIFYgb2Zmc2V0IGluIGEgZnVsbHkgaW50ZXJsZWF2ZWQgWVVWIDQ6MjoyICovCitzdGF0aWMgaW50CitfVk9mZkludHJsWVVWKGNvbnN0IFlVVkRlc2MqIGRlc2MsIGludCBsaW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgLyogU2VlIF9VT2ZmSW50cmxZVVYgY29tbWVudHMuICovCisgICAgcmV0dXJuIGxpbmUgKiB3aWR0aCAqIDIgKyBkZXNjLT5WX29mZnNldDsKK30KKworLyogVSBvZmZzZXQgaW4gYW4gaW50ZXJsZWF2ZWQgVVYgcGFuZSBvZiBZVVYgNDoyOjAgKi8KK3N0YXRpYyBpbnQKK19VT2ZmSW50cmxVVihjb25zdCBZVVZEZXNjKiBkZXNjLCBpbnQgbGluZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIC8qIFVWIHBhbmUgc3RhcnRzIHJpZ2h0IGFmdGVyIHRoZSBZIHBhbmUsIHRoYXQgb2NjdXBpZXMgJ2hlaWdodCAqIHdpZHRoJworICAgICAqIGJ5dGVzLiBFYWNodCBsaW5lIGluIFVWIHBhbmUgY29udGFpbnMgd2lkdGggLyAyICdVVicgcGFpcnMsIHdoaWNoIG1ha2VzIFVWCisgICAgICogbGFuZSB0byBjb250YWluIGFzIG1hbnkgYnl0ZXMsIGFzIHRoZSB3aWR0aCBpcy4KKyAgICAgKiBFYWNoIGxpbmUgaW4gdGhlIFVWIHBhbmUgaXMgc2hhcmVkIGJldHdlZW4gdHdvIFkgbGluZXMuIFNvLCBmaW5hbCBmb3JtdWxhCisgICAgICogZm9yIHRoZSBiZWdnaW5pbmcgb2YgdGhlIFVWIHBhbmUncyBsaW5lIGZvciB0aGUgZ2l2ZW4gbGluZSBpbiBZVVYKKyAgICAgKiBmcmFtZWJ1ZmZlciBpczoKKyAgICAgKgorICAgICAqICAgIGhlaWdodCAqIHdpZHRoICsgKGxpbmUgLyAyKSAqIHdpZHRoID0gKGhlaWdodCArIGxpbmUgLyAyKSAqIHdpZHRoCisgICAgICovCisgICAgcmV0dXJuIChoZWlnaHQgKyBsaW5lIC8gMikgKiB3aWR0aCArIGRlc2MtPlVfb2Zmc2V0OworfQorCisvKiBWIG9mZnNldCBpbiBhbiBpbnRlcmxlYXZlZCBVViBwYW5lIG9mIFlVViA0OjI6MCAqLworc3RhdGljIGludAorX1ZPZmZJbnRybFVWKGNvbnN0IFlVVkRlc2MqIGRlc2MsIGludCBsaW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgLyogU2VlIGNvbW1lbnRzIGluIF9VT2ZmSW50cmxVVi4gKi8KKyAgICByZXR1cm4gKGhlaWdodCArIGxpbmUgLyAyKSAqIHdpZHRoICsgZGVzYy0+Vl9vZmZzZXQ7Cit9CisKKy8qIFUgb2Zmc2V0IGluIGEgMy1wYW5lIGFsaWduZWQgWVVWIDQ6MjowICovCitzdGF0aWMgaW50CitfVU9mZlNlcEFsaWduZWRZVVYoY29uc3QgWVVWRGVzYyogZGVzYywgaW50IGxpbmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICAvKiBVLCBvciBWIHBhbmUgc3RhcnRzIHJpZ2h0IGFmdGVyIHRoZSBZIHBhbmUsIHRoYXQgb2NjdXBpZXMgJ2hlaWdodCAqIHdpZHRoJworICAgICAqIGJ5dGVzLiBFYWNodCBsaW5lIGluIGVhY2ggb2YgVSBhbmQgViBwYW5lcyBjb250YWlucyB3aWR0aCAvIDIgZWxlbWVudHMuCisgICAgICogQWxzbywgZWFjaCBsaW5lIGluIGVhY2ggb2YgVSBhbmQgViBwYW5lcyBpcyBzaGFyZWQgYmV0d2VlbiB0d28gWSBsaW5lcy4KKyAgICAgKiBTbywgZmluYWwgZm9ybXVsYSBmb3IgdGhlIGJlZ2dpbmluZyBvZiBhIGxpbmUgaW4gdGhlIFUvViBwYW5lIGlzOgorICAgICAqCisgICAgICogICAgPFkgcGFuZSBzaXplPiArIChsaW5lIC8gMikgKiB3aWR0aCAvIDIKKyAgICAgKgorICAgICAqIGZvciB0aGUgcGFuZSB0aGF0IGZvbGxvd3MgcmlnaHQgYWZ0ZXIgdGhlIFkgcGFuZSwgb3IKKyAgICAgKgorICAgICAqICAgIDxZIHBhbmUgc2l6ZT4gKyA8WSBwYW5lIHNpemU+IC8gNCArIChsaW5lIC8gMikgKiB3aWR0aCAvIDIKKyAgICAgKgorICAgICAqIGZvciB0aGUgc2Vjb25kIHBhbmUuCisgICAgICovCisgICAgY29uc3QgaW50IHlfc3RyaWRlID0gYWxpZ24od2lkdGgsIDE2KTsKKyAgICBjb25zdCBpbnQgdXZfc3RyaWRlID0gYWxpZ24oeV9zdHJpZGUgLyAyLCAxNik7CisgICAgY29uc3QgaW50IHlfcGFuZV9zaXplID0gaGVpZ2h0ICogeV9zdHJpZGU7CisgICAgaWYgKGRlc2MtPlVfb2Zmc2V0KSB7CisgICAgICAgIC8qIFUgcGFuZSBjb21lcyByaWdodCBhZnRlciB0aGUgWSBwYW5lLiAqLworICAgICAgICByZXR1cm4geV9wYW5lX3NpemUgKyAobGluZSAvIDIpICogdXZfc3RyaWRlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFUgcGFuZSBmb2xsb3dzIFYgcGFuZS4gKi8KKyAgICAgICAgcmV0dXJuIHlfcGFuZV9zaXplICsgKGhlaWdodCAvIDIgKyBsaW5lIC8gMikgKiB1dl9zdHJpZGU7CisgICAgfQorfQorCisvKiBWIG9mZnNldCBpbiBhIDMtcGFuZSBhbGlnbmVkIFlVViA0OjI6MCAqLworc3RhdGljIGludAorX1ZPZmZTZXBBbGlnbmVkWVVWKGNvbnN0IFlVVkRlc2MqIGRlc2MsIGludCBsaW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgLyogU2VlIGNvbW1lbnQgZm9yIF9VT2ZmU2VwWVVWLiAqLworICAgIGNvbnN0IGludCB5X3N0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgY29uc3QgaW50IHV2X3N0cmlkZSA9IGFsaWduKHlfc3RyaWRlIC8gMiwgMTYpOworICAgIGNvbnN0IGludCB5X3BhbmVfc2l6ZSA9IGhlaWdodCAqIHlfc3RyaWRlOworICAgIGlmIChkZXNjLT5WX29mZnNldCkgeworICAgICAgICAvKiBWIHBhbmUgY29tZXMgcmlnaHQgYWZ0ZXIgdGhlIFkgcGFuZS4gKi8KKyAgICAgICAgcmV0dXJuIHlfcGFuZV9zaXplICsgKGxpbmUgLyAyKSAqIHV2X3N0cmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBWIHBhbmUgZm9sbG93cyBVIHBhbmUuICovCisgICAgICAgIHJldHVybiB5X3BhbmVfc2l6ZSArIChoZWlnaHQgLyAyICsgbGluZSAvIDIpICogdXZfc3RyaWRlOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBCYXllciByb3V0aW5lcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHZXRzIGEgY29sb3IgdmFsdWUgZm9yIHRoZSBnaXZlbiBwaXhlbCBpbiBhIGJheWVyIGZyYW1lYnVmZmVyLgorICogUGFyYW06CisgKiAgZGVzYyAtIEJheWVyIGZyYW1lYnVmZmVyIGRlc2NyaXB0b3IuCisgKiAgYnVmIC0gQmVnaW5uaW5nIG9mIHRoZSBmcmFtZWJ1ZmZlci4KKyAqICB4LCB5IC0gQ29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIGluc2lkZSB0aGUgZnJhbWVidWZmZXIgdG8gZ2V0IHRoZSBjb2xvciBmb3IuCisgKiAgd2lkdGggLSBOdW1iZXIgb2YgcGl4ZWwgaW4gYSBsaW5lIGluc2lkZSB0aGUgZnJhbWVidWZmZXIuCisgKiBSZXR1cm46CisgKiAgR2l2ZW4gcGl4ZWwgY29sb3IuCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIGludAorX2dldF9iYXllcl9jb2xvcihjb25zdCBCYXllckRlc2MqIGRlc2MsIGNvbnN0IHZvaWQqIGJ1ZiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgpCit7CisgICAgaWYgKGRlc2MtPm1hc2sgPT0ga0JheWVyOCkgeworICAgICAgICAvKiBFYWNoIHBpeGVsIGlzIHJlcHJlc2VudGVkIHdpdGggb25lIGJ5dGUuICovCisgICAgICAgIHJldHVybiAqKChjb25zdCB1aW50OF90KilidWYgKyB5ICogd2lkdGggKyB4KTsKKyAgICB9IGVsc2UgeworI2lmbmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICByZXR1cm4gKigoY29uc3QgaW50MTZfdCopYnVmICsgeSAqIHdpZHRoICsgeCkgJiBkZXNjLT5tYXNrOworI2Vsc2UKKyAgICAgICAgY29uc3QgdWludDhfdCogcGl4ZWwgPSAoY29uc3QgdWludDhfdCopYnVmICsgKHkgKiB3aWR0aCArIHgpICogMjsKKyAgICAgICAgcmV0dXJuICgoKHVpbnQxNl90KXBpeGVsWzFdIDw8IDgpIHwgcGl4ZWxbMF0pICYgZGVzYy0+bWFzazsKKyNlbmRpZiAgLyogIUhPU1RfV09SRFNfQklHRU5ESUFOICovCisgICAgfQorfQorCisvKiBHZXRzIGFuIGF2ZXJhZ2UgdmFsdWUgb2YgY29sb3JzIHRoYXQgYXJlIGhvcmlzb250YWxseSBhZGphY2VudCB0byBhIHBpeGVsIGluCisgKiBhIGJheWVyIGZyYW1lYnVmZmVyLgorICogUGFyYW06CisgKiAgZGVzYyAtIEJheWVyIGZyYW1lYnVmZmVyIGRlc2NyaXB0b3IuCisgKiAgYnVmIC0gQmVnaW5uaW5nIG9mIHRoZSBmcmFtZWJ1ZmZlci4KKyAqICB4LCB5IC0gQ29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIGluc2lkZSB0aGUgZnJhbWVidWZmZXIgdGhhdCBpcyB0aGUgY2VudGVyIGZvcgorICogICAgICB0aGUgY2FsY3VsYXRpb24uCisgKiAgd2lkdGgsIGhlaWdodCAtIEZyYW1lYnVmZmVyIGRpbWVuc2lvbnMuCisgKiBSZXR1cm46CisgKiAgQXZlcmFnZSBjb2xvciBmb3IgaG9yaXNvbnRhbGx5IGFkamFjZW50IHBpeGVscy4KKyAqLworc3RhdGljIGludAorX2dldF9iYXllcl9hdmVfaG9yKGNvbnN0IEJheWVyRGVzYyogZGVzYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCit7CisgICAgaWYgKHggPT0gMCkgeworICAgICAgICByZXR1cm4gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHggKyAxLCB5LCB3aWR0aCk7CisgICAgfSBlbHNlIGlmICh4ID09ICh3aWR0aCAtIDEpKSB7CisgICAgICAgIHJldHVybiBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCAtIDEsIHksIHdpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4IC0gMSwgeSwgd2lkdGgpICsKKyAgICAgICAgICAgICAgICBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCArIDEsIHksIHdpZHRoKSkgLyAyOworICAgIH0KK30KKworLyogR2V0cyBhbiBhdmVyYWdlIHZhbHVlIG9mIGNvbG9ycyB0aGF0IGFyZSB2ZXJ0aWNhbGx5IGFkamFjZW50IHRvIGEgcGl4ZWwgaW4KKyAqIGEgYmF5ZXIgZnJhbWVidWZmZXIuCisgKiBQYXJhbToKKyAqICBkZXNjIC0gQmF5ZXIgZnJhbWVidWZmZXIgZGVzY3JpcHRvci4KKyAqICBidWYgLSBCZWdpbm5pbmcgb2YgdGhlIGZyYW1lYnVmZmVyLgorICogIHgsIHkgLSBDb29yZGluYXRlcyBvZiB0aGUgcGl4ZWwgaW5zaWRlIHRoZSBmcmFtZWJ1ZmZlciB0aGF0IGlzIHRoZSBjZW50ZXIgZm9yCisgKiAgICAgIHRoZSBjYWxjdWxhdGlvbi4KKyAqICB3aWR0aCwgaGVpZ2h0IC0gRnJhbWVidWZmZXIgZGltZW5zaW9ucy4KKyAqIFJldHVybjoKKyAqICBBdmVyYWdlIGNvbG9yIGZvciB2ZXJ0aWNhbGx5IGFkamFjZW50IHBpeGVscy4KKyAqLworc3RhdGljIGludAorX2dldF9iYXllcl9hdmVfdmVydChjb25zdCBCYXllckRlc2MqIGRlc2MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCit7CisgICAgaWYgKHkgPT0gMCkgeworICAgICAgICByZXR1cm4gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHgsIHkgKyAxLCB3aWR0aCk7CisgICAgfSBlbHNlIGlmICh5ID09IChoZWlnaHQgLSAxKSkgeworICAgICAgICByZXR1cm4gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHgsIHkgLSAxLCB3aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCwgeSAtIDEsIHdpZHRoKSArCisgICAgICAgICAgICAgICAgX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHgsIHkgKyAxLCB3aWR0aCkpIC8gMjsKKyAgICB9Cit9CisKKy8qIEdldHMgYW4gYXZlcmFnZSB2YWx1ZSBvZiBjb2xvcnMgdGhhdCBhcmUgaG9yaXNvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5IGFkamFjZW50CisgKiB0byBhIHBpeGVsIGluIGEgYmF5ZXIgZnJhbWVidWZmZXIuCisgKiBQYXJhbToKKyAqICBkZXNjIC0gQmF5ZXIgZnJhbWVidWZmZXIgZGVzY3JpcHRvci4KKyAqICBidWYgLSBCZWdpbm5pbmcgb2YgdGhlIGZyYW1lYnVmZmVyLgorICogIHgsIHkgLSBDb29yZGluYXRlcyBvZiB0aGUgcGl4ZWwgaW5zaWRlIHRoZSBmcmFtZWJ1ZmZlciB0aGF0IGlzIHRoZSBjZW50ZXIgZm9yCisgKiAgICAgIHRoZSBjYWxjdWxhdGlvbi4KKyAqICB3aWR0aCwgaGVpZ2h0IC0gRnJhbWVidWZmZXIgZGltZW5zaW9ucy4KKyAqIFJldHVybjoKKyAqICBBdmVyYWdlIGNvbG9yIGZvciBob3Jpc29udGFsbHkgYW5kIHZlcnRpY2FsbHkgYWRqYWNlbnQgcGl4ZWxzLgorICovCitzdGF0aWMgaW50CitfZ2V0X2JheWVyX2F2ZV9jcm9zcyhjb25zdCBCYXllckRlc2MqIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoeCA+IDAgJiYgeCA8ICh3aWR0aCAtIDEpICYmIHkgPiAwICYmIHkgPCAoaGVpZ2h0IC0gMSkpIHsKKyAgICAgICAgLyogTW9zdCBvZiB0aGUgdGltZSB0aGUgY29kZSB3aWxsIHRha2UgdGhpcyBwYXRoLiBTbyBpdCBtYWtlcyBzZW5jZSB0bworICAgICAgICAgKiBzcGVjaWFsIGNhc2UgaXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuICovCisgICAgICAgIHJldHVybiAoX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHggLSAxLCB5LCB3aWR0aCkgKworICAgICAgICAgICAgICAgIF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4ICsgMSwgeSwgd2lkdGgpICsKKyAgICAgICAgICAgICAgICBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCwgeSAtIDEsIHdpZHRoKSArCisgICAgICAgICAgICAgICAgX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHgsIHkgKyAxLCB3aWR0aCkpIC8gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgaW50IG51bSA9IDA7CisKKyAgICAgICAgLyogSG9yaXNvbnRhbCBzdW0gKi8KKyAgICAgICAgaWYgKHggPT0gMCkgeworICAgICAgICAgICAgc3VtICs9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4ICsgMSwgeSwgd2lkdGgpOworICAgICAgICAgICAgbnVtKys7CisgICAgICAgIH0gZWxzZSBpZiAoeCA9PSAod2lkdGggLSAxKSkgeworICAgICAgICAgICAgc3VtICs9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4IC0gMSwgeSwgd2lkdGgpOworICAgICAgICAgICAgbnVtKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdW0gKz0gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHggLSAxLCB5LCB3aWR0aCkgKworICAgICAgICAgICAgICAgICAgIF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4ICsgMSwgeSwgd2lkdGgpOworICAgICAgICAgICAgbnVtICs9IDI7CisgICAgICAgIH0KKworICAgICAgICAvKiBWZXJ0aWNhbCBzdW0gKi8KKyAgICAgICAgaWYgKHkgPT0gMCkgeworICAgICAgICAgICAgc3VtICs9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4LCB5ICsgMSwgd2lkdGgpOworICAgICAgICAgICAgbnVtKys7CisgICAgICAgIH0gZWxzZSBpZiAoeSA9PSAoaGVpZ2h0IC0gMSkpIHsKKyAgICAgICAgICAgIHN1bSArPSBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCwgeSAtIDEsIHdpZHRoKTsKKyAgICAgICAgICAgIG51bSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VtICs9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4LCB5IC0gMSwgd2lkdGgpICsKKyAgICAgICAgICAgICAgICAgICBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCwgeSArIDEsIHdpZHRoKTsKKyAgICAgICAgICAgIG51bSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1bSAvIG51bTsKKyAgICB9Cit9CisKKy8qIEdldHMgYW4gYXZlcmFnZSB2YWx1ZSBvZiBjb2xvcnMgdGhhdCBhcmUgZGlhZ29uYWxseSBhZGphY2VudCB0byBhIHBpeGVsIGluIGEKKyAqIGJheWVyIGZyYW1lYnVmZmVyLgorICogUGFyYW06CisgKiAgZGVzYyAtIEJheWVyIGZyYW1lYnVmZmVyIGRlc2NyaXB0b3IuCisgKiAgYnVmIC0gQmVnaW5uaW5nIG9mIHRoZSBmcmFtZWJ1ZmZlci4KKyAqICB4LCB5IC0gQ29vcmRpbmF0ZXMgb2YgdGhlIHBpeGVsIGluc2lkZSB0aGUgZnJhbWVidWZmZXIgdGhhdCBpcyB0aGUgY2VudGVyIGZvcgorICogICAgICB0aGUgY2FsY3VsYXRpb24uCisgKiAgd2lkdGgsIGhlaWdodCAtIEZyYW1lYnVmZmVyIGRpbWVuc2lvbnMuCisgKiBSZXR1cm46CisgKiAgQXZlcmFnZSBjb2xvciBmb3IgZGlhZ29uYWxseSBhZGphY2VudCBwaXhlbHMuCisgKi8KK3N0YXRpYyBpbnQKK19nZXRfYmF5ZXJfYXZlX2RpYWcoY29uc3QgQmF5ZXJEZXNjKiBkZXNjLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KQoreworICAgIGlmICh4ID4gMCAmJiB4IDwgKHdpZHRoIC0gMSkgJiYgeSA+IDAgJiYgeSA8IChoZWlnaHQgLSAxKSkgeworICAgICAgICAvKiBNb3N0IG9mIHRoZSB0aW1lIHRoZSBjb2RlIHdpbGwgdGFrZSB0aGlzIHBhdGguIFNvIGl0IG1ha2VzIHNlbmNlIHRvCisgICAgICAgICAqIHNwZWNpYWwgY2FzZSBpdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gKi8KKyAgICAgICAgcmV0dXJuIChfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCAtIDEsIHkgLSAxLCB3aWR0aCkgKworICAgICAgICAgICAgICAgIF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4ICsgMSwgeSAtIDEsIHdpZHRoKSArCisgICAgICAgICAgICAgICAgX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHggLSAxLCB5ICsgMSwgd2lkdGgpICsKKyAgICAgICAgICAgICAgICBfZ2V0X2JheWVyX2NvbG9yKGRlc2MsIGJ1ZiwgeCArIDEsIHkgKyAxLCB3aWR0aCkpIC8gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgaW50IG51bSA9IDA7CisgICAgICAgIGludCB4eCwgeXk7CisgICAgICAgIGZvciAoeHggPSB4IC0gMTsgeHggPCAoeCArIDIpOyB4eCArPSAyKSB7CisgICAgICAgICAgICBmb3IgKHl5ID0geSAtIDE7IHl5IDwgKHkgKyAyKTsgeXkgKz0gMikgeworICAgICAgICAgICAgICAgIGlmICh4eCA+PSAwICYmIHl5ID49IDAgJiYgeHggPCB3aWR0aCAmJiB5eSA8IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHh4LCB5eSwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1bSAvIG51bTsKKyAgICB9Cit9CisKKy8qIEdldHMgcGl4ZWwgY29sb3Igc2VsZWN0b3IgZm9yIHRoZSBnaXZlbiBwaXhlbCBpbiBhIGJheWVyIGZyYW1lYnVmZmVyLgorICogUGFyYW06CisgKiAgZGVzYyAtIEJheWVyIGZyYW1lYnVmZmVyIGRlc2NyaXB0b3IuCisgKiAgeCwgeSAtIENvb3JkaW5hdGVzIG9mIHRoZSBwaXhlbCBpbnNpZGUgdGhlIGZyYW1lYnVmZmVyIHRvIGdldCB0aGUgY29sb3IKKyAqICAgICAgc2VsZWN0b3IgZm9yLgorICogUmV0dXJuOgorICogIFBpeGVsIGNvbG9yIHNlbGVjdG9yOgorICogICAgICAtICdSJyAtIHBpeGVsIGlzIHJlZC4KKyAqICAgICAgLSAnRycgLSBwaXhlbCBpcyBncmVlbi4KKyAqICAgICAgLSAnQicgLSBwaXhlbCBpcyBibHVlLgorICovCitzdGF0aWMgX19pbmxpbmVfXyBjaGFyCitfZ2V0X2JheWVyX2NvbG9yX3NlbChjb25zdCBCYXllckRlc2MqIGRlc2MsIGludCB4LCBpbnQgeSkKK3sKKyAgICByZXR1cm4gZGVzYy0+Y29sb3Jfb3JkZXJbKCh5ICYgMSkgPDwgMSkgfCAoeCAmIDEpXTsKK30KKworLyogQ2FsY3VsYXRlcyBSR0IgY29sb3JzIGZvciBhIHBpeGVsIGluIGEgYmF5ZXIgZnJhbWVidWZmZXIuCisgKiBQYXJhbToKKyAqICBkZXNjIC0gQmF5ZXIgZnJhbWVidWZmZXIgZGVzY3JpcHRvci4KKyAqICBidWYgLSBCZWdpbm5pbmcgb2YgdGhlIGZyYW1lYnVmZmVyLgorICogIHgsIHkgLSBDb29yZGluYXRlcyBvZiB0aGUgcGl4ZWwgaW5zaWRlIHRoZSBmcmFtZWJ1ZmZlciB0byBnZXQgdGhlIGNvbG9ycyBmb3IuCisgKiAgd2lkdGgsIGhlaWdodCAtIEZyYW1lYnVmZmVyIGRpbWVuc2lvbnMuCisgKiAgcmVkLCBncmVlbiBibHV1IC0gVXBvbiByZXR1cm4gd2lsbCBjb250YWluIFJHQiBjb2xvcnMgY2FsY3VsYXRlZCBmb3IgdGhlIHBpeGVsLgorICovCitzdGF0aWMgdm9pZAorX2dldF9iYXllclJHQihjb25zdCBCYXllckRlc2MqIGRlc2MsCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgIGludCogcmVkLAorICAgICAgICAgICAgICBpbnQqIGdyZWVuLAorICAgICAgICAgICAgICBpbnQqIGJsdWUpCit7CisgICAgY29uc3QgY2hhciBwaXhlbF9jb2xvciA9IF9nZXRfYmF5ZXJfY29sb3Jfc2VsKGRlc2MsIHgsIHkpOworCisgICAgaWYgKHBpeGVsX2NvbG9yID09ICdHJykgeworICAgICAgICAvKiBUaGlzIGlzIGEgZ3JlZW4gcGl4ZWwuICovCisgICAgICAgIGNvbnN0IGNoYXIgbmV4dF9waXhlbF9jb2xvciA9IF9nZXRfYmF5ZXJfY29sb3Jfc2VsKGRlc2MsIHggKyAxLCB5KTsKKyAgICAgICAgKmdyZWVuID0gX2dldF9iYXllcl9jb2xvcihkZXNjLCBidWYsIHgsIHksIHdpZHRoKTsKKyAgICAgICAgaWYgKG5leHRfcGl4ZWxfY29sb3IgPT0gJ1InKSB7CisgICAgICAgICAgICAqcmVkID0gX2dldF9iYXllcl9hdmVfaG9yKGRlc2MsIGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAqYmx1ZSA9IF9nZXRfYmF5ZXJfYXZlX3ZlcnQoZGVzYywgYnVmLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpyZWQgPSBfZ2V0X2JheWVyX2F2ZV92ZXJ0KGRlc2MsIGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAqYmx1ZSA9IF9nZXRfYmF5ZXJfYXZlX2hvcihkZXNjLCBidWYsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwaXhlbF9jb2xvciA9PSAnUicpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIHJlZCBwaXhlbC4gKi8KKyAgICAgICAgKnJlZCA9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4LCB5LCB3aWR0aCk7CisgICAgICAgICpncmVlbiA9IF9nZXRfYmF5ZXJfYXZlX2Nyb3NzKGRlc2MsIGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICpibHVlID0gX2dldF9iYXllcl9hdmVfZGlhZyhkZXNjLCBidWYsIHgsIHksIHdpZHRoLCBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgaXMgYSBibHVlIHBpeGVsLiAqLworICAgICAgICAqYmx1ZSA9IF9nZXRfYmF5ZXJfY29sb3IoZGVzYywgYnVmLCB4LCB5LCB3aWR0aCk7CisgICAgICAgICpncmVlbiA9IF9nZXRfYmF5ZXJfYXZlX2Nyb3NzKGRlc2MsIGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICpyZWQgPSBfZ2V0X2JheWVyX2F2ZV9kaWFnKGRlc2MsIGJ1ZiwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyaWMgWVVWL1JHQi9CQVlFUiBjb252ZXJ0ZXJzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJpYyBjb252ZXJ0ZXIgZnJvbSBhbiBSR0IvQlJHIGZvcm1hdCB0byBhIFlVViBmb3JtYXQuICovCitzdGF0aWMgdm9pZAorUkdCVG9ZVVYoY29uc3QgUkdCRGVzYyogcmdiX2ZtdCwKKyAgICAgICAgIGNvbnN0IFlVVkRlc2MqIHl1dl9mbXQsCisgICAgICAgICBjb25zdCB2b2lkKiByZ2IsCisgICAgICAgICB2b2lkKiB5dXYsCisgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICBmbG9hdCBiX3NjYWxlLAorICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgaW50IHksIHg7CisgICAgY29uc3QgaW50IFlfSW5jID0geXV2X2ZtdC0+WV9pbmM7CisgICAgY29uc3QgaW50IFVWX2luYyA9IHl1dl9mbXQtPlVWX2luYzsKKyAgICBjb25zdCBpbnQgWV9uZXh0X3BhaXIgPSB5dXZfZm10LT5ZX25leHRfcGFpcjsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgdWludDhfdCogcFkgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKXl1diArIHl1dl9mbXQtPnlfb2Zmc2V0KHl1dl9mbXQsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB1aW50OF90KiBwVSA9CisgICAgICAgICAgICAodWludDhfdCopeXV2ICsgeXV2X2ZtdC0+dV9vZmZzZXQoeXV2X2ZtdCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHVpbnQ4X3QqIHBWID0KKyAgICAgICAgICAgICh1aW50OF90Kil5dXYgKyB5dXZfZm10LT52X29mZnNldCh5dXZfZm10LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFkgKz0gWV9uZXh0X3BhaXIsIHBVICs9IFVWX2luYywgcFYgKz0gVVZfaW5jKSB7CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICByZ2IgPSByZ2JfZm10LT5sb2FkX3JnYihyZ2IsICZyLCAmZywgJmIpOworICAgICAgICAgICAgX2NoYW5nZV93aGl0ZV9iYWxhbmNlX1JHQl9iKCZyLCAmZywgJmIsIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUpOworICAgICAgICAgICAgX2NoYW5nZV9leHBvc3VyZV9SR0IoJnIsICZnLCAmYiwgZXhwX2NvbXApOworICAgICAgICAgICAgUjhHOEI4VG9ZVVYociwgZywgYiwgcFksIHBVLCBwVik7CisgICAgICAgICAgICByZ2IgPSByZ2JfZm10LT5sb2FkX3JnYihyZ2IsICZyLCAmZywgJmIpOworICAgICAgICAgICAgX2NoYW5nZV93aGl0ZV9iYWxhbmNlX1JHQl9iKCZyLCAmZywgJmIsIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUpOworICAgICAgICAgICAgX2NoYW5nZV9leHBvc3VyZV9SR0IoJnIsICZnLCAmYiwgZXhwX2NvbXApOworICAgICAgICAgICAgcFlbWV9JbmNdID0gUkdCMlkoKGludClyLCAoaW50KWcsIChpbnQpYik7CisgICAgICAgIH0KKyAgICAgICAgLyogQWxpbmcgcmdiX3B0ciB0byAxNiBiaXQgKi8KKyAgICAgICAgaWYgKCgodWludHB0cl90KXJnYiAmIDEpICE9IDApIHJnYiA9IChjb25zdCB1aW50OF90KilyZ2IgKyAxOworICAgIH0KK30KKworLyogR2VuZXJpYyBjb252ZXJ0ZXIgZnJvbSBvbmUgUkdCL0JSRyBmb3JtYXQgdG8gYW5vdGhlciBSR0IvQlJHIGZvcm1hdC4gKi8KK3N0YXRpYyB2b2lkCitSR0JUb1JHQihjb25zdCBSR0JEZXNjKiBzcmNfcmdiX2ZtdCwKKyAgICAgICAgIGNvbnN0IFJHQkRlc2MqIGRzdF9yZ2JfZm10LAorICAgICAgICAgY29uc3Qgdm9pZCogc3JjX3JnYiwKKyAgICAgICAgIHZvaWQqIGRzdF9yZ2IsCisgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICBmbG9hdCBiX3NjYWxlLAorICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7CisgICAgICAgICAgICBzcmNfcmdiID0gc3JjX3JnYl9mbXQtPmxvYWRfcmdiKHNyY19yZ2IsICZyLCAmZywgJmIpOworICAgICAgICAgICAgX2NoYW5nZV93aGl0ZV9iYWxhbmNlX1JHQl9iKCZyLCAmZywgJmIsIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUpOworICAgICAgICAgICAgX2NoYW5nZV9leHBvc3VyZV9SR0IoJnIsICZnLCAmYiwgZXhwX2NvbXApOworICAgICAgICAgICAgZHN0X3JnYiA9IGRzdF9yZ2JfZm10LT5zYXZlX3JnYihkc3RfcmdiLCByLCBnLCBiKTsKKyAgICAgICAgfQorICAgICAgICAvKiBBbGluZyByZ2IgcGludGVycyB0byAxNiBiaXQgKi8KKyAgICAgICAgaWYgKCgodWludHB0cl90KXNyY19yZ2IgJiAxKSAhPSAwKSBzcmNfcmdiID0gKHVpbnQ4X3QqKXNyY19yZ2IgKyAxOworICAgICAgICBpZiAoKCh1aW50cHRyX3QpZHN0X3JnYiAmIDEpICE9IDApIGRzdF9yZ2IgPSAodWludDhfdCopZHN0X3JnYiArIDE7CisgICAgfQorfQorCisvKiBHZW5lcmljIGNvbnZlcnRlciBmcm9tIGEgWVVWIGZvcm1hdCB0byBhbiBSR0IvQlJHIGZvcm1hdC4gKi8KK3N0YXRpYyB2b2lkCitZVVZUb1JHQihjb25zdCBZVVZEZXNjKiB5dXZfZm10LAorICAgICAgICAgY29uc3QgUkdCRGVzYyogcmdiX2ZtdCwKKyAgICAgICAgIGNvbnN0IHZvaWQqIHl1diwKKyAgICAgICAgIHZvaWQqIHJnYiwKKyAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgIGZsb2F0IGJfc2NhbGUsCisgICAgICAgICBmbG9hdCBleHBfY29tcCkKK3sKKyAgICBpbnQgeSwgeDsKKyAgICBjb25zdCBpbnQgWV9JbmMgPSB5dXZfZm10LT5ZX2luYzsKKyAgICBjb25zdCBpbnQgVVZfaW5jID0geXV2X2ZtdC0+VVZfaW5jOworICAgIGNvbnN0IGludCBZX25leHRfcGFpciA9IHl1dl9mbXQtPllfbmV4dF9wYWlyOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBjb25zdCB1aW50OF90KiBwWSA9CisgICAgICAgICAgICAoY29uc3QgdWludDhfdCopeXV2ICsgeXV2X2ZtdC0+eV9vZmZzZXQoeXV2X2ZtdCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBVID0KKyAgICAgICAgICAgIChjb25zdCB1aW50OF90Kil5dXYgKyB5dXZfZm10LT51X29mZnNldCh5dXZfZm10LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCogcFYgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXl1diArIHl1dl9mbXQtPnZfb2Zmc2V0KHl1dl9mbXQsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWSArPSBZX25leHRfcGFpciwgcFUgKz0gVVZfaW5jLCBwViArPSBVVl9pbmMpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgciwgZywgYjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgVSA9ICpwVTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgViA9ICpwVjsKKyAgICAgICAgICAgIFlVVlRvUkdCUGl4KCpwWSwgVSwgViwgJnIsICZnLCAmYik7CisgICAgICAgICAgICBfY2hhbmdlX3doaXRlX2JhbGFuY2VfUkdCX2IoJnIsICZnLCAmYiwgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSk7CisgICAgICAgICAgICBfY2hhbmdlX2V4cG9zdXJlX1JHQigmciwgJmcsICZiLCBleHBfY29tcCk7CisgICAgICAgICAgICByZ2IgPSByZ2JfZm10LT5zYXZlX3JnYihyZ2IsIHIsIGcsIGIpOworICAgICAgICAgICAgWVVWVG9SR0JQaXgocFlbWV9JbmNdLCBVLCBWLCAmciwgJmcsICZiKTsKKyAgICAgICAgICAgIF9jaGFuZ2Vfd2hpdGVfYmFsYW5jZV9SR0JfYigmciwgJmcsICZiLCByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlKTsKKyAgICAgICAgICAgIF9jaGFuZ2VfZXhwb3N1cmVfUkdCKCZyLCAmZywgJmIsIGV4cF9jb21wKTsKKyAgICAgICAgICAgIHJnYiA9IHJnYl9mbXQtPnNhdmVfcmdiKHJnYiwgciwgZywgYik7CisgICAgICAgIH0KKyAgICAgICAgLyogQWxpbmcgcmdiX3B0ciB0byAxNiBiaXQgKi8KKyAgICAgICAgaWYgKCgodWludHB0cl90KXJnYiAmIDEpICE9IDApIHJnYiA9ICh1aW50OF90KilyZ2IgKyAxOworICAgIH0KK30KKworLyogR2VuZXJpYyBjb252ZXJ0ZXIgZnJvbSBvbmUgWVVWIGZvcm1hdCB0byBhbm90aGVyIFlVViBmb3JtYXQuICovCitzdGF0aWMgdm9pZAorWVVWVG9ZVVYoY29uc3QgWVVWRGVzYyogc3JjX2ZtdCwKKyAgICAgICAgIGNvbnN0IFlVVkRlc2MqIGRzdF9mbXQsCisgICAgICAgICBjb25zdCB2b2lkKiBzcmMsCisgICAgICAgICB2b2lkKiBkc3QsCisgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICBmbG9hdCBiX3NjYWxlLAorICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgaW50IHksIHg7CisgICAgY29uc3QgaW50IFlfSW5jX3NyYyA9IHNyY19mbXQtPllfaW5jOworICAgIGNvbnN0IGludCBVVl9pbmNfc3JjID0gc3JjX2ZtdC0+VVZfaW5jOworICAgIGNvbnN0IGludCBZX25leHRfcGFpcl9zcmMgPSBzcmNfZm10LT5ZX25leHRfcGFpcjsKKyAgICBjb25zdCBpbnQgWV9JbmNfZHN0ID0gZHN0X2ZtdC0+WV9pbmM7CisgICAgY29uc3QgaW50IFVWX2luY19kc3QgPSBkc3RfZm10LT5VVl9pbmM7CisgICAgY29uc3QgaW50IFlfbmV4dF9wYWlyX2RzdCA9IGRzdF9mbXQtPllfbmV4dF9wYWlyOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBjb25zdCB1aW50OF90KiBwWXNyYyA9CisgICAgICAgICAgICAoY29uc3QgdWludDhfdCopc3JjICsgc3JjX2ZtdC0+eV9vZmZzZXQoc3JjX2ZtdCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBVc3JjID0KKyAgICAgICAgICAgIChjb25zdCB1aW50OF90KilzcmMgKyBzcmNfZm10LT51X29mZnNldChzcmNfZm10LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCogcFZzcmMgPQorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXNyYyArIHNyY19mbXQtPnZfb2Zmc2V0KHNyY19mbXQsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICB1aW50OF90KiBwWWRzdCA9CisgICAgICAgICAgICAodWludDhfdCopZHN0ICsgZHN0X2ZtdC0+eV9vZmZzZXQoZHN0X2ZtdCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHVpbnQ4X3QqIHBVZHN0ID0KKyAgICAgICAgICAgICh1aW50OF90Kilkc3QgKyBkc3RfZm10LT51X29mZnNldChkc3RfZm10LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdWludDhfdCogcFZkc3QgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdCArIGRzdF9mbXQtPnZfb2Zmc2V0KGRzdF9mbXQsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMiwgcFlzcmMgKz0gWV9uZXh0X3BhaXJfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzcmMgKz0gVVZfaW5jX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWc3JjICs9IFVWX2luY19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWWRzdCArPSBZX25leHRfcGFpcl9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVWRzdCArPSBVVl9pbmNfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZkc3QgKz0gVVZfaW5jX2RzdCkgeworICAgICAgICAgICAgKnBZZHN0ID0gKnBZc3JjOyAqcFVkc3QgPSAqcFVzcmM7ICpwVmRzdCA9ICpwVnNyYzsKKyAgICAgICAgICAgIF9jaGFuZ2Vfd2hpdGVfYmFsYW5jZV9ZVVYocFlkc3QsIHBVZHN0LCBwVmRzdCwgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSk7CisgICAgICAgICAgICAqcFlkc3QgPSBfY2hhbmdlX2V4cG9zdXJlKCpwWWRzdCwgZXhwX2NvbXApOworICAgICAgICAgICAgcFlkc3RbWV9JbmNfZHN0XSA9IF9jaGFuZ2VfZXhwb3N1cmUocFlzcmNbWV9JbmNfc3JjXSwgZXhwX2NvbXApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBHZW5lcmljIGNvbnZlcnRlciBmcm9tIGEgQkFZRVIgZm9ybWF0IHRvIGFuIFJHQi9CUkcgZm9ybWF0LiAqLworc3RhdGljIHZvaWQKK0JBWUVSVG9SR0IoY29uc3QgQmF5ZXJEZXNjKiBiYXllcl9mbXQsCisgICAgICAgICAgIGNvbnN0IFJHQkRlc2MqIHJnYl9mbXQsCisgICAgICAgICAgIGNvbnN0IHZvaWQqIGJheWVyLAorICAgICAgICAgICB2b2lkKiByZ2IsCisgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgZmxvYXQgcl9zY2FsZSwKKyAgICAgICAgICAgZmxvYXQgZ19zY2FsZSwKKyAgICAgICAgICAgZmxvYXQgYl9zY2FsZSwKKyAgICAgICAgICAgZmxvYXQgZXhwX2NvbXApCit7CisgICAgaW50IHksIHg7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgciwgZywgYjsKKyAgICAgICAgICAgIF9nZXRfYmF5ZXJSR0IoYmF5ZXJfZm10LCBiYXllciwgeCwgeSwgd2lkdGgsIGhlaWdodCwgJnIsICZnLCAmYik7CisgICAgICAgICAgICBpZiAoYmF5ZXJfZm10LT5tYXNrID09IGtCYXllcjEwKSB7CisgICAgICAgICAgICAgICAgciA+Pj0gMjsgZyA+Pj0gMjsgYiA+Pj0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmF5ZXJfZm10LT5tYXNrID09IGtCYXllcjEyKSB7CisgICAgICAgICAgICAgICAgciA+Pj0gNDsgZyA+Pj0gNDsgYiA+Pj0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9jaGFuZ2Vfd2hpdGVfYmFsYW5jZV9SR0IoJnIsICZnLCAmYiwgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSk7CisgICAgICAgICAgICBfY2hhbmdlX2V4cG9zdXJlX1JHQl9pKCZyLCAmZywgJmIsIGV4cF9jb21wKTsKKyAgICAgICAgICAgIHJnYiA9IHJnYl9mbXQtPnNhdmVfcmdiKHJnYiwgciwgZywgYik7CisgICAgICAgIH0KKyAgICAgICAgLyogQWxpbmcgcmdiX3B0ciB0byAxNiBiaXQgKi8KKyAgICAgICAgaWYgKCgodWludHB0cl90KXJnYiAmIDEpICE9IDApIHJnYiA9ICh1aW50OF90KilyZ2IgKyAxOworICAgIH0KK30KKworLyogR2VuZXJpYyBjb252ZXJ0ZXIgZnJvbSBhIEJBWUVSIGZvcm1hdCB0byBhIFlVViBmb3JtYXQuICovCitzdGF0aWMgdm9pZAorQkFZRVJUb1lVVihjb25zdCBCYXllckRlc2MqIGJheWVyX2ZtdCwKKyAgICAgICAgICAgY29uc3QgWVVWRGVzYyogeXV2X2ZtdCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCogYmF5ZXIsCisgICAgICAgICAgIHZvaWQqIHl1diwKKyAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICBmbG9hdCBnX3NjYWxlLAorICAgICAgICAgICBmbG9hdCBiX3NjYWxlLAorICAgICAgICAgICBmbG9hdCBleHBfY29tcCkKK3sKKyAgICBpbnQgeSwgeDsKKyAgICBjb25zdCBpbnQgWV9JbmMgPSB5dXZfZm10LT5ZX2luYzsKKyAgICBjb25zdCBpbnQgVVZfaW5jID0geXV2X2ZtdC0+VVZfaW5jOworICAgIGNvbnN0IGludCBZX25leHRfcGFpciA9IHl1dl9mbXQtPllfbmV4dF9wYWlyOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICB1aW50OF90KiBwWSA9CisgICAgICAgICAgICAodWludDhfdCopeXV2ICsgeXV2X2ZtdC0+eV9vZmZzZXQoeXV2X2ZtdCwgeSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHVpbnQ4X3QqIHBVID0KKyAgICAgICAgICAgICh1aW50OF90Kil5dXYgKyB5dXZfZm10LT51X29mZnNldCh5dXZfZm10LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgdWludDhfdCogcFYgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKXl1diArIHl1dl9mbXQtPnZfb2Zmc2V0KHl1dl9mbXQsIHksIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwWSArPSBZX25leHRfcGFpciwgcFUgKz0gVVZfaW5jLCBwViArPSBVVl9pbmMpIHsKKyAgICAgICAgICAgIGludCByLCBnLCBiOworICAgICAgICAgICAgX2dldF9iYXllclJHQihiYXllcl9mbXQsIGJheWVyLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCAmciwgJmcsICZiKTsKKyAgICAgICAgICAgIF9jaGFuZ2Vfd2hpdGVfYmFsYW5jZV9SR0IoJnIsICZnLCAmYiwgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSk7CisgICAgICAgICAgICBfY2hhbmdlX2V4cG9zdXJlX1JHQl9pKCZyLCAmZywgJmIsIGV4cF9jb21wKTsKKyAgICAgICAgICAgIFI4RzhCOFRvWVVWKHIsIGcsIGIsIHBZLCBwVSwgcFYpOworICAgICAgICAgICAgX2dldF9iYXllclJHQihiYXllcl9mbXQsIGJheWVyLCB4ICsgMSwgeSwgd2lkdGgsIGhlaWdodCwgJnIsICZnLCAmYik7CisgICAgICAgICAgICBfY2hhbmdlX3doaXRlX2JhbGFuY2VfUkdCKCZyLCAmZywgJmIsIHJfc2NhbGUsIGdfc2NhbGUsIGJfc2NhbGUpOworICAgICAgICAgICAgX2NoYW5nZV9leHBvc3VyZV9SR0JfaSgmciwgJmcsICZiLCBleHBfY29tcCk7CisgICAgICAgICAgICBwWVtZX0luY10gPSBSR0IyWShyLCBnLCBiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSR0IgZm9ybWF0IGRlc2NyaXB0b3JzLgorICovCisKKy8qIERlc2NyaWJlcyBSR0IzMiBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgUkdCRGVzYyBfUkdCMzIgPQoreworICAgIC5sb2FkX3JnYiAgID0gX2xvYWRfUkdCMzIsCisgICAgLnNhdmVfcmdiICAgPSBfc2F2ZV9SR0IzMiwKKyAgICAucmdiX2luYyAgICA9IDQKK307CisKKy8qIERlc2NyaWJlcyBCUkczMiBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgUkdCRGVzYyBfQlJHMzIgPQoreworICAgIC5sb2FkX3JnYiAgID0gX2xvYWRfQlJHMzIsCisgICAgLnNhdmVfcmdiICAgPSBfc2F2ZV9CUkczMiwKKyAgICAucmdiX2luYyAgICA9IDQKK307CisKKy8qIERlc2NyaWJlcyBSR0IyNCBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgUkdCRGVzYyBfUkdCMjQgPQoreworICAgIC5sb2FkX3JnYiAgID0gX2xvYWRfUkdCMjQsCisgICAgLnNhdmVfcmdiICAgPSBfc2F2ZV9SR0IyNCwKKyAgICAucmdiX2luYyAgICA9IDMKK307CisKKy8qIERlc2NyaWJlcyBCUkcyNCBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgUkdCRGVzYyBfQlJHMjQgPQoreworICAgIC5sb2FkX3JnYiAgID0gX2xvYWRfQlJHMjQsCisgICAgLnNhdmVfcmdiICAgPSBfc2F2ZV9CUkcyNCwKKyAgICAucmdiX2luYyAgICA9IDMKK307CisKKy8qIERlc2NyaWJlcyBSR0IxNiBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgUkdCRGVzYyBfUkdCMTYgPQoreworICAgIC5sb2FkX3JnYiAgID0gX2xvYWRfUkdCMTYsCisgICAgLnNhdmVfcmdiICAgPSBfc2F2ZV9SR0IxNiwKKyAgICAucmdiX2luYyAgICA9IDIKK307CisKKyNpZiAwCisvKiBEZXNjcmliZXMgQlJHMTYgZm9ybWF0LiAqLworc3RhdGljIGNvbnN0IFJHQkRlc2MgX0JSRzE2ID0KK3sKKyAgICAubG9hZF9yZ2IgICA9IF9sb2FkX0JSRzE2LAorICAgIC5zYXZlX3JnYiAgID0gX3NhdmVfQlJHMTYsCisgICAgLnJnYl9pbmMgICAgPSAyCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogWVVWIDQ6MjoyIGZvcm1hdCBkZXNjcmlwdG9ycy4KKyAqLworCisvKiBZVVlWOiA0OjI6MiwgWVVWIGFyZSBpbnRlcmxlYXZlZC4gKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9ZVVlWID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5ZX2luYyAgICAgICAgICA9IDIsCisgICAgLllfbmV4dF9wYWlyICAgID0gNCwKKyAgICAuVVZfaW5jICAgICAgICAgPSA0LAorICAgIC5VX29mZnNldCAgICAgICA9IDEsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMywKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZlBhY2tlZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZJbnRybFlVViwKKyAgICAudl9vZmZzZXQgICAgICAgPSAmX1ZPZmZJbnRybFlVVgorfTsKKworLyogVVlWWTogNDoyOjIsIFlVViBhcmUgaW50ZXJsZWF2ZWQuICovCitzdGF0aWMgY29uc3QgWVVWRGVzYyBfVVlWWSA9Cit7CisgICAgLllfb2Zmc2V0ICAgICAgID0gMSwKKyAgICAuWV9pbmMgICAgICAgICAgPSAyLAorICAgIC5ZX25leHRfcGFpciAgICA9IDQsCisgICAgLlVWX2luYyAgICAgICAgID0gNCwKKyAgICAuVV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5WX29mZnNldCAgICAgICA9IDIsCisgICAgLnlfb2Zmc2V0ICAgICAgID0gJllPZmZQYWNrZWRZVVYsCisgICAgLnVfb2Zmc2V0ICAgICAgID0gJl9VT2ZmSW50cmxZVVYsCisgICAgLnZfb2Zmc2V0ICAgICAgID0gJl9WT2ZmSW50cmxZVVYKK307CisKKy8qIFlWWVU6IDQ6MjoyLCBZVVYgYXJlIGludGVybGVhdmVkLiAqLworc3RhdGljIGNvbnN0IFlVVkRlc2MgX1lWWVUgPQoreworICAgIC5ZX29mZnNldCAgICAgICA9IDAsCisgICAgLllfaW5jICAgICAgICAgID0gMiwKKyAgICAuWV9uZXh0X3BhaXIgICAgPSA0LAorICAgIC5VVl9pbmMgICAgICAgICA9IDQsCisgICAgLlVfb2Zmc2V0ICAgICAgID0gMywKKyAgICAuVl9vZmZzZXQgICAgICAgPSAxLAorICAgIC55X29mZnNldCAgICAgICA9ICZZT2ZmUGFja2VkWVVWLAorICAgIC51X29mZnNldCAgICAgICA9ICZfVU9mZkludHJsWVVWLAorICAgIC52X29mZnNldCAgICAgICA9ICZfVk9mZkludHJsWVVWCit9OworCisvKiBWWVVZOiA0OjI6MiwgWVVWIGFyZSBpbnRlcmxlYXZlZC4gKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9WWVVZID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAxLAorICAgIC5ZX2luYyAgICAgICAgICA9IDIsCisgICAgLllfbmV4dF9wYWlyICAgID0gNCwKKyAgICAuVVZfaW5jICAgICAgICAgPSA0LAorICAgIC5VX29mZnNldCAgICAgICA9IDIsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMCwKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZlBhY2tlZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZJbnRybFlVViwKKyAgICAudl9vZmZzZXQgICAgICAgPSAmX1ZPZmZJbnRybFlVVgorfTsKKworLyogWVlVViAoYWxzbyBZVVkyLCBZVU5WLCBWNDIyKSA6IDQ6MjoyLCBZVVYgYXJlIGludGVybGVhdmVkLiAqLworc3RhdGljIGNvbnN0IFlVVkRlc2MgX1lZVVYgPQoreworICAgIC5ZX29mZnNldCAgICAgICA9IDAsCisgICAgLllfaW5jICAgICAgICAgID0gMSwKKyAgICAuWV9uZXh0X3BhaXIgICAgPSA0LAorICAgIC5VVl9pbmMgICAgICAgICA9IDQsCisgICAgLlVfb2Zmc2V0ICAgICAgID0gMiwKKyAgICAuVl9vZmZzZXQgICAgICAgPSAzLAorICAgIC55X29mZnNldCAgICAgICA9ICZZT2ZmUGFja2VkWVVWLAorICAgIC51X29mZnNldCAgICAgICA9ICZfVU9mZkludHJsWVVWLAorICAgIC52X29mZnNldCAgICAgICA9ICZfVk9mZkludHJsWVVWCit9OworCisvKiBZWVZVOiA0OjI6MiwgWVVWIGFyZSBpbnRlcmxlYXZlZC4gKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9ZWVZVID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5ZX2luYyAgICAgICAgICA9IDEsCisgICAgLllfbmV4dF9wYWlyICAgID0gNCwKKyAgICAuVVZfaW5jICAgICAgICAgPSA0LAorICAgIC5VX29mZnNldCAgICAgICA9IDMsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMiwKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZlBhY2tlZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZJbnRybFlVViwKKyAgICAudl9vZmZzZXQgICAgICAgPSAmX1ZPZmZJbnRybFlVVgorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBZVVYgNDoyOjAgZGVzY3JpcHRvcnMuCisgKi8KKworLyogWVYxMjogNDoyOjAsIFlVViBhcmUgZnVsbHkgc2VwYXJhdGVkLCBVIHBhbmUgZm9sbG93cyBWIHBhbmUgKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9ZVjEyID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5ZX2luYyAgICAgICAgICA9IDEsCisgICAgLllfbmV4dF9wYWlyICAgID0gMiwKKyAgICAuVVZfaW5jICAgICAgICAgPSAxLAorICAgIC5VX29mZnNldCAgICAgICA9IDAsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMSwKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZkFsaWduZWRZVVYsCisgICAgLnVfb2Zmc2V0ICAgICAgID0gJl9VT2ZmU2VwQWxpZ25lZFlVViwKKyAgICAudl9vZmZzZXQgICAgICAgPSAmX1ZPZmZTZXBBbGlnbmVkWVVWCit9OworCisvKiBZVTEyOiA0OjI6MCwgWVVWIGFyZSBmdWxseSBzZXBhcmF0ZWQsIFYgcGFuZSBmb2xsb3dzIFUgcGFuZSAqLworc3RhdGljIGNvbnN0IFlVVkRlc2MgX1lVMTIgPQoreworICAgIC5ZX29mZnNldCAgICAgICA9IDAsCisgICAgLllfaW5jICAgICAgICAgID0gMSwKKyAgICAuWV9uZXh0X3BhaXIgICAgPSAyLAorICAgIC5VVl9pbmMgICAgICAgICA9IDEsCisgICAgLlVfb2Zmc2V0ICAgICAgID0gMSwKKyAgICAuVl9vZmZzZXQgICAgICAgPSAwLAorICAgIC55X29mZnNldCAgICAgICA9ICZZT2ZmQWxpZ25lZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZTZXBBbGlnbmVkWVVWLAorICAgIC52X29mZnNldCAgICAgICA9ICZfVk9mZlNlcEFsaWduZWRZVVYKK307CisKKy8qIE5WMTI6IDQ6MjowLCBVViBhcmUgaW50ZXJsZWF2ZWQsIFYgZm9sbG93cyBVIGluIFVWIHBhbmUgKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9OVjEyID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5ZX2luYyAgICAgICAgICA9IDEsCisgICAgLllfbmV4dF9wYWlyICAgID0gMiwKKyAgICAuVVZfaW5jICAgICAgICAgPSAyLAorICAgIC5VX29mZnNldCAgICAgICA9IDAsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMSwKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZlBhY2tlZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZJbnRybFVWLAorICAgIC52X29mZnNldCAgICAgICA9ICZfVk9mZkludHJsVVYKK307CisKKy8qIE5WMjE6IDQ6MjowLCBVViBhcmUgaW50ZXJsZWF2ZWQsIFUgZm9sbG93cyBWIGluIFVWIHBhbmUgKi8KK3N0YXRpYyBjb25zdCBZVVZEZXNjIF9OVjIxID0KK3sKKyAgICAuWV9vZmZzZXQgICAgICAgPSAwLAorICAgIC5ZX2luYyAgICAgICAgICA9IDEsCisgICAgLllfbmV4dF9wYWlyICAgID0gMiwKKyAgICAuVVZfaW5jICAgICAgICAgPSAyLAorICAgIC5VX29mZnNldCAgICAgICA9IDEsCisgICAgLlZfb2Zmc2V0ICAgICAgID0gMCwKKyAgICAueV9vZmZzZXQgICAgICAgPSAmWU9mZlBhY2tlZFlVViwKKyAgICAudV9vZmZzZXQgICAgICAgPSAmX1VPZmZJbnRybFVWLAorICAgIC52X29mZnNldCAgICAgICA9ICZfVk9mZkludHJsVVYKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUkdCIGJheWVyIGZvcm1hdCBkZXNjcmlwdG9ycy4KKyAqLworCisvKiBEZXNjcmlwdG9yIGZvciBhIDgtYml0IEdCR0IgLyBSR1JHIGZvcm1hdC4gKi8KK3N0YXRpYyBjb25zdCBCYXllckRlc2MgX0dCOCA9Cit7CisgICAgLm1hc2sgICAgICAgICAgID0ga0JheWVyOCwKKyAgICAuY29sb3Jfb3JkZXIgICAgPSAiR0JSRyIKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIGEgOC1iaXQgR1JHUiAvIEJHQkcgZm9ybWF0LiAqLworc3RhdGljIGNvbnN0IEJheWVyRGVzYyBfR1I4ID0KK3sKKyAgICAubWFzayAgICAgICAgICAgPSBrQmF5ZXI4LAorICAgIC5jb2xvcl9vcmRlciAgICA9ICJHUkJHIgorfTsKKworLyogRGVzY3JpcHRvciBmb3IgYSA4LWJpdCBCR0JHIC8gR1JHUiBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgQmF5ZXJEZXNjIF9CRzggPQoreworICAgIC5tYXNrICAgICAgICAgICA9IGtCYXllcjgsCisgICAgLmNvbG9yX29yZGVyICAgID0gIkJHR1IiCit9OworCisvKiBEZXNjcmlwdG9yIGZvciBhIDgtYml0IFJHUkcgLyBHQkdCIGZvcm1hdC4gKi8KK3N0YXRpYyBjb25zdCBCYXllckRlc2MgX1JHOCA9Cit7CisgICAgLm1hc2sgICAgICAgICAgID0ga0JheWVyOCwKKyAgICAuY29sb3Jfb3JkZXIgICAgPSAiUkdHQiIKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIGEgMTAtYml0IEdCR0IgLyBSR1JHIGZvcm1hdC4gKi8KK3N0YXRpYyBjb25zdCBCYXllckRlc2MgX0dCMTAgPQoreworICAgIC5tYXNrICAgICAgICAgICA9IGtCYXllcjEwLAorICAgIC5jb2xvcl9vcmRlciAgICA9ICJHQlJHIgorfTsKKworLyogRGVzY3JpcHRvciBmb3IgYSAxMC1iaXQgR1JHUiAvIEJHQkcgZm9ybWF0LiAqLworc3RhdGljIGNvbnN0IEJheWVyRGVzYyBfR1IxMCA9Cit7CisgICAgLm1hc2sgICAgICAgICAgID0ga0JheWVyMTAsCisgICAgLmNvbG9yX29yZGVyICAgID0gIkdSQkciCit9OworCisvKiBEZXNjcmlwdG9yIGZvciBhIDEwLWJpdCBCR0JHIC8gR1JHUiBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgQmF5ZXJEZXNjIF9CRzEwID0KK3sKKyAgICAubWFzayAgICAgICAgICAgPSBrQmF5ZXIxMCwKKyAgICAuY29sb3Jfb3JkZXIgICAgPSAiQkdHUiIKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIGEgMTAtYml0IFJHUkcgLyBHQkdCIGZvcm1hdC4gKi8KK3N0YXRpYyBjb25zdCBCYXllckRlc2MgX1JHMTAgPQoreworICAgIC5tYXNrICAgICAgICAgICA9IGtCYXllcjEwLAorICAgIC5jb2xvcl9vcmRlciAgICA9ICJSR0dCIgorfTsKKworLyogRGVzY3JpcHRvciBmb3IgYSAxMi1iaXQgR0JHQiAvIFJHUkcgZm9ybWF0LiAqLworc3RhdGljIGNvbnN0IEJheWVyRGVzYyBfR0IxMiA9Cit7CisgICAgLm1hc2sgICAgICAgICAgID0ga0JheWVyMTIsCisgICAgLmNvbG9yX29yZGVyICAgID0gIkdCUkciCit9OworCisvKiBEZXNjcmlwdG9yIGZvciBhIDEyLWJpdCBHUkdSIC8gQkdCRyBmb3JtYXQuICovCitzdGF0aWMgY29uc3QgQmF5ZXJEZXNjIF9HUjEyID0KK3sKKyAgICAubWFzayAgICAgICAgICAgPSBrQmF5ZXIxMiwKKyAgICAuY29sb3Jfb3JkZXIgICAgPSAiR1JCRyIKK307CisKKy8qIERlc2NyaXB0b3IgZm9yIGEgMTItYml0IEJHQkcgLyBHUkdSIGZvcm1hdC4gKi8KK3N0YXRpYyBjb25zdCBCYXllckRlc2MgX0JHMTIgPQoreworICAgIC5tYXNrICAgICAgICAgICA9IGtCYXllcjEyLAorICAgIC5jb2xvcl9vcmRlciAgICA9ICJCR0dSIgorfTsKKworLyogRGVzY3JpcHRvciBmb3IgYSAxMi1iaXQgUkdSRyAvIEdCR0IgZm9ybWF0LiAqLworc3RhdGljIGNvbnN0IEJheWVyRGVzYyBfUkcxMiA9Cit7CisgICAgLm1hc2sgICAgICAgICAgID0ga0JheWVyMTIsCisgICAgLmNvbG9yX29yZGVyICAgID0gIlJHR0IiCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGlzdCBvZiBkZXNjcmlwdG9ycyBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRW51bWVyYXRlcyBwaXhlbCBmb3JtYXRzIHN1cHBvcnRlZCBieSBjb252ZXJ0ZXJzLiAqLwordHlwZWRlZiBlbnVtIFBJWEZvcm1hdFNlbCB7CisgICAgLyogUGl4ZWwgZm9ybWF0IGlzIFJHQi9CR1IgKi8KKyAgICBQSVhfRk1UX1JHQiwKKyAgICAvKiBQaXhlbCBmb3JtYXQgaXMgWVVWICovCisgICAgUElYX0ZNVF9ZVVYsCisgICAgLyogUGl4ZWwgZm9ybWF0IGlzIEJBWUVSICovCisgICAgUElYX0ZNVF9CQVlFUgorfSBQSVhGb3JtYXRTZWw7CisKKy8qIEZvcm1hdHMgZW50cnkgaW4gdGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLiAqLwordHlwZWRlZiBzdHJ1Y3QgUElYRm9ybWF0IHsKKyAgICAvKiAiRk9VUkNDIiAoVjRMMl9QSVhfRk1UX1hYWCkgZm9ybWF0IHR5cGUuICovCisgICAgdWludDMyX3QgICAgICAgIGZvdXJjY190eXBlOworICAgIC8qIFJHQi9ZVVYvQkFZRVIgZm9ybWF0IHNlbGVjdG9yICovCisgICAgUElYRm9ybWF0U2VsICAgIGZvcm1hdF9zZWw7CisgICAgdW5pb24geworICAgICAgICAvKiBSZWZlcmVuY2VzIFJHQiBmb3JtYXQgZGVzY3JpcHRvciBmb3IgdGhhdCBmb3JtYXQuICovCisgICAgICAgIGNvbnN0IFJHQkRlc2MqICAgICAgcmdiX2Rlc2M7CisgICAgICAgIC8qIFJlZmVyZW5jZXMgWVVWIGZvcm1hdCBkZXNjcmlwdG9yIGZvciB0aGF0IGZvcm1hdC4gKi8KKyAgICAgICAgY29uc3QgWVVWRGVzYyogICAgICB5dXZfZGVzYzsKKyAgICAgICAgLyogUmVmZXJlbmNlcyBCQVlFUiBmb3JtYXQgZGVzY3JpcHRvciBmb3IgdGhhdCBmb3JtYXQuICovCisgICAgICAgIGNvbnN0IEJheWVyRGVzYyogICAgYmF5ZXJfZGVzYzsKKyAgICB9IGRlc2M7Cit9IFBJWEZvcm1hdDsKKworLyogQXJyYXkgb2Ygc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycy4gKi8KK3N0YXRpYyBjb25zdCBQSVhGb3JtYXQgX1BJWEZvcm1hdHNbXSA9IHsKKyAgICAvKiBSR0IvQlJHIGZvcm1hdHMuICovCisgICAgeyBWNEwyX1BJWF9GTVRfUkdCMzIsICAgUElYX0ZNVF9SR0IsICAgIC5kZXNjLnJnYl9kZXNjID0gJl9SR0IzMiAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9CR1IzMiwgICBQSVhfRk1UX1JHQiwgICAgLmRlc2MucmdiX2Rlc2MgPSAmX0JSRzMyICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1JHQjU2NSwgIFBJWF9GTVRfUkdCLCAgICAuZGVzYy5yZ2JfZGVzYyA9ICZfUkdCMTYgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfUkdCMjQsICAgUElYX0ZNVF9SR0IsICAgIC5kZXNjLnJnYl9kZXNjID0gJl9SR0IyNCAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9CR1IyNCwgICBQSVhfRk1UX1JHQiwgICAgLmRlc2MucmdiX2Rlc2MgPSAmX0JSRzI0ICB9LAorCisgICAgLyogWVVWIDQ6MjowIGZvcm1hdHMuICovCisgICAgeyBWNEwyX1BJWF9GTVRfWVZVNDIwLCAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9ZVjEyICAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9ZVVY0MjAsICBQSVhfRk1UX1lVViwgICAgLmRlc2MueXV2X2Rlc2MgPSAmX1lVMTIgICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX05WMTIsICAgIFBJWF9GTVRfWVVWLCAgICAuZGVzYy55dXZfZGVzYyA9ICZfTlYxMiAgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfTlYyMSwgICAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9OVjIxICAgfSwKKworICAgIC8qIFlVViA0OjI6MiBmb3JtYXRzLiAqLworICAgIHsgVjRMMl9QSVhfRk1UX1lVWVYsICAgIFBJWF9GTVRfWVVWLCAgICAuZGVzYy55dXZfZGVzYyA9ICZfWVVZViAgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfWVlVViwgICAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9ZWVVWICAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9ZVllVLCAgICBQSVhfRk1UX1lVViwgICAgLmRlc2MueXV2X2Rlc2MgPSAmX1lWWVUgICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1VZVlksICAgIFBJWF9GTVRfWVVWLCAgICAuZGVzYy55dXZfZGVzYyA9ICZfVVlWWSAgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfVllVWSwgICAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9WWVVZICAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9ZVllVLCAgICBQSVhfRk1UX1lVViwgICAgLmRlc2MueXV2X2Rlc2MgPSAmX1lWWVUgICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1ZZVVksICAgIFBJWF9GTVRfWVVWLCAgICAuZGVzYy55dXZfZGVzYyA9ICZfVllVWSAgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfWVlWVSwgICAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9ZWVZVICAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9ZVVkyLCAgICBQSVhfRk1UX1lVViwgICAgLmRlc2MueXV2X2Rlc2MgPSAmX1lVWVYgICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1lVTlYsICAgIFBJWF9GTVRfWVVWLCAgICAuZGVzYy55dXZfZGVzYyA9ICZfWVVZViAgIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfVjQyMiwgICAgUElYX0ZNVF9ZVVYsICAgIC5kZXNjLnl1dl9kZXNjID0gJl9ZVVlWICAgfSwKKworICAgIC8qIEJBWUVSIGZvcm1hdHMuICovCisgICAgeyBWNEwyX1BJWF9GTVRfU0JHR1I4LCAgUElYX0ZNVF9CQVlFUiwgIC5kZXNjLmJheWVyX2Rlc2MgPSAmX0JHOCAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9TR0JSRzgsICBQSVhfRk1UX0JBWUVSLCAgLmRlc2MuYmF5ZXJfZGVzYyA9ICZfR0I4ICB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1NHUkJHOCwgIFBJWF9GTVRfQkFZRVIsICAuZGVzYy5iYXllcl9kZXNjID0gJl9HUjggIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfU1JHR0I4LCAgUElYX0ZNVF9CQVlFUiwgIC5kZXNjLmJheWVyX2Rlc2MgPSAmX1JHOCAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9TQkdHUjEwLCBQSVhfRk1UX0JBWUVSLCAgLmRlc2MuYmF5ZXJfZGVzYyA9ICZfQkcxMCB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1NHQlJHMTAsIFBJWF9GTVRfQkFZRVIsICAuZGVzYy5iYXllcl9kZXNjID0gJl9HQjEwIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfU0dSQkcxMCwgUElYX0ZNVF9CQVlFUiwgIC5kZXNjLmJheWVyX2Rlc2MgPSAmX0dSMTAgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9TUkdHQjEwLCBQSVhfRk1UX0JBWUVSLCAgLmRlc2MuYmF5ZXJfZGVzYyA9ICZfUkcxMCB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1NCR0dSMTIsIFBJWF9GTVRfQkFZRVIsICAuZGVzYy5iYXllcl9kZXNjID0gJl9CRzEyIH0sCisgICAgeyBWNEwyX1BJWF9GTVRfU0dCUkcxMiwgUElYX0ZNVF9CQVlFUiwgIC5kZXNjLmJheWVyX2Rlc2MgPSAmX0dCMTIgfSwKKyAgICB7IFY0TDJfUElYX0ZNVF9TR1JCRzEyLCBQSVhfRk1UX0JBWUVSLCAgLmRlc2MuYmF5ZXJfZGVzYyA9ICZfR1IxMiB9LAorICAgIHsgVjRMMl9QSVhfRk1UX1NSR0dCMTIsIFBJWF9GTVRfQkFZRVIsICAuZGVzYy5iYXllcl9kZXNjID0gJl9SRzEyIH0sCit9Oworc3RhdGljIGNvbnN0IGludCBfUElYRm9ybWF0c19udW0gPSBzaXplb2YoX1BJWEZvcm1hdHMpIC8gc2l6ZW9mKCpfUElYRm9ybWF0cyk7CisKKy8qIEdldCBhbiBlbnRyeSBpbiB0aGUgYXJyYXkgb2Ygc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycy4KKyAqIFBhcmFtOgorICogIHBpeGVsX2Zvcm1hdCAtICJmb3VyY2MiIHBpeGVsIGZvcm1hdCB0byBsb29rdXAgYW4gZW50cnkgZm9yLgorICogUmV0dXJuIgorICogIFBvaW50ZXIgdG8gdGhlIGZvdW5kIGVudHJ5LCBvciBOVUxMIGlmIG5vIGVudHJ5IGV4aXN0cyBmb3IgdGhlIGdpdmVuIHBpeGVsCisgKiAgZm9ybWF0LgorICovCitzdGF0aWMgY29uc3QgUElYRm9ybWF0KgorX2dldF9waXhlbF9mb3JtYXRfZGVzY3JpcHRvcih1aW50MzJfdCBwaXhlbF9mb3JtYXQpCit7CisgICAgaW50IGY7CisgICAgZm9yIChmID0gMDsgZiA8IF9QSVhGb3JtYXRzX251bTsgZisrKSB7CisgICAgICAgIGlmIChfUElYRm9ybWF0c1tmXS5mb3VyY2NfdHlwZSA9PSBwaXhlbF9mb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiAmX1BJWEZvcm1hdHNbZl07CisgICAgICAgIH0KKyAgICB9CisgICAgVygiJXM6IFBpeGVsIGZvcm1hdCAlLjRzIGlzIHVua25vd24iLAorICAgICAgX19GVU5DVElPTl9fLCAoY29uc3QgY2hhciopJnBpeGVsX2Zvcm1hdCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUHVibGljIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAoraGFzX2NvbnZlcnRlcih1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bykKK3sKKyAgICBpZiAoZnJvbSA9PSB0bykgeworICAgICAgICAvKiBTYW1lIGZvcm1hdDogY29udmVydGVyIGVzaXN0cy4gKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBfZ2V0X3BpeGVsX2Zvcm1hdF9kZXNjcmlwdG9yKGZyb20pICE9IE5VTEwgJiYKKyAgICAgICAgICAgX2dldF9waXhlbF9mb3JtYXRfZGVzY3JpcHRvcih0bykgIT0gTlVMTDsKK30KKworaW50Citjb252ZXJ0X2ZyYW1lKGNvbnN0IHZvaWQqIGZyYW1lLAorICAgICAgICAgICAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgIHNpemVfdCBmcmFtZWJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgIENsaWVudEZyYW1lQnVmZmVyKiBmcmFtZWJ1ZmZlcnMsCisgICAgICAgICAgICAgIGludCBmYnNfbnVtLAorICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICBmbG9hdCBnX3NjYWxlLAorICAgICAgICAgICAgICBmbG9hdCBiX3NjYWxlLAorICAgICAgICAgICAgICBmbG9hdCBleHBfY29tcCkKK3sKKyAgICBpbnQgbjsKKyAgICBjb25zdCBQSVhGb3JtYXQqIHNyY19kZXNjID0gX2dldF9waXhlbF9mb3JtYXRfZGVzY3JpcHRvcihwaXhlbF9mb3JtYXQpOworICAgIGlmIChzcmNfZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBTb3VyY2UgcGl4ZWwgZm9ybWF0ICUuNHMgaXMgdW5rbm93biIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCAoY29uc3QgY2hhciopJnBpeGVsX2Zvcm1hdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZmJzX251bTsgbisrKSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGFwcGx5IHdoaXRlIGJhbGFuY2UsIGV4cG9zdXJlIGNvbXBlbnNhdGlvbiwgZXRjLgorICAgICAgICAgKiB3aGVuIHdlIHRyYW5zZmVyIHRoZSBjYXB0dXJlZCBmcmFtZSB0byB0aGUgdXNlciBmcmFtZWJ1ZmZlci4gU28sIGV2ZW4KKyAgICAgICAgICogaWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmb3JtYXRzIGFyZSB0aGUgc2FtZSwgd2Ugd2lsbCBoYXZlIHRvIGdvCisgICAgICAgICAqIHRocnVnaCB0aGUgY29udmVydGVycyB0byBhcHBseSB0aGVzZSB0aGluZ3MuICovCisgICAgICAgIGNvbnN0IFBJWEZvcm1hdCogZHN0X2Rlc2MgPQorICAgICAgICAgICAgX2dldF9waXhlbF9mb3JtYXRfZGVzY3JpcHRvcihmcmFtZWJ1ZmZlcnNbbl0ucGl4ZWxfZm9ybWF0KTsKKyAgICAgICAgaWYgKGRzdF9kZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEUoIiVzOiBEZXN0aW5hdGlvbiBwaXhlbCBmb3JtYXQgJS40cyBpcyB1bmtub3duIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAoY29uc3QgY2hhciopJmZyYW1lYnVmZmVyc1tuXS5waXhlbF9mb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc3JjX2Rlc2MtPmZvcm1hdF9zZWwpIHsKKyAgICAgICAgICAgIGNhc2UgUElYX0ZNVF9SR0I6CisgICAgICAgICAgICAgICAgaWYgKGRzdF9kZXNjLT5mb3JtYXRfc2VsID09IFBJWF9GTVRfUkdCKSB7CisgICAgICAgICAgICAgICAgICAgIFJHQlRvUkdCKHNyY19kZXNjLT5kZXNjLnJnYl9kZXNjLCBkc3RfZGVzYy0+ZGVzYy5yZ2JfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGZyYW1lYnVmZmVyc1tuXS5mcmFtZWJ1ZmZlciwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHN0X2Rlc2MtPmZvcm1hdF9zZWwgPT0gUElYX0ZNVF9ZVVYpIHsKKyAgICAgICAgICAgICAgICAgICAgUkdCVG9ZVVYoc3JjX2Rlc2MtPmRlc2MucmdiX2Rlc2MsIGRzdF9kZXNjLT5kZXNjLnl1dl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSwgZnJhbWVidWZmZXJzW25dLmZyYW1lYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlLCBleHBfY29tcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRSgiJXM6IFVuZXhwZWN0ZWQgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRzdF9kZXNjLT5mb3JtYXRfc2VsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUElYX0ZNVF9ZVVY6CisgICAgICAgICAgICAgICAgaWYgKGRzdF9kZXNjLT5mb3JtYXRfc2VsID09IFBJWF9GTVRfUkdCKSB7CisgICAgICAgICAgICAgICAgICAgIFlVVlRvUkdCKHNyY19kZXNjLT5kZXNjLnl1dl9kZXNjLCBkc3RfZGVzYy0+ZGVzYy5yZ2JfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGZyYW1lYnVmZmVyc1tuXS5mcmFtZWJ1ZmZlciwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHN0X2Rlc2MtPmZvcm1hdF9zZWwgPT0gUElYX0ZNVF9ZVVYpIHsKKyAgICAgICAgICAgICAgICAgICAgWVVWVG9ZVVYoc3JjX2Rlc2MtPmRlc2MueXV2X2Rlc2MsIGRzdF9kZXNjLT5kZXNjLnl1dl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSwgZnJhbWVidWZmZXJzW25dLmZyYW1lYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlLCBleHBfY29tcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRSgiJXM6IFVuZXhwZWN0ZWQgZGVzdGluYXRpb24gcGl4ZWwgZm9ybWF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRzdF9kZXNjLT5mb3JtYXRfc2VsKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUElYX0ZNVF9CQVlFUjoKKyAgICAgICAgICAgICAgICBpZiAoZHN0X2Rlc2MtPmZvcm1hdF9zZWwgPT0gUElYX0ZNVF9SR0IpIHsKKyAgICAgICAgICAgICAgICAgICAgQkFZRVJUb1JHQihzcmNfZGVzYy0+ZGVzYy5iYXllcl9kZXNjLCBkc3RfZGVzYy0+ZGVzYy5yZ2JfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBmcmFtZWJ1ZmZlcnNbbl0uZnJhbWVidWZmZXIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3NjYWxlLCBnX3NjYWxlLCBiX3NjYWxlLCBleHBfY29tcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkc3RfZGVzYy0+Zm9ybWF0X3NlbCA9PSBQSVhfRk1UX1lVVikgeworICAgICAgICAgICAgICAgICAgICBCQVlFUlRvWVVWKHNyY19kZXNjLT5kZXNjLmJheWVyX2Rlc2MsIGRzdF9kZXNjLT5kZXNjLnl1dl9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBmcmFtZWJ1ZmZlcnNbbl0uZnJhbWVidWZmZXIsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEUoIiVzOiBVbmV4cGVjdGVkIGRlc3RpbmF0aW9uIHBpeGVsIGZvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkc3RfZGVzYy0+Zm9ybWF0X3NlbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEUoIiVzOiBVbmV4cGVjdGVkIHNvdXJjZSBwaXhlbCBmb3JtYXQgJWQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkc3RfZGVzYy0+Zm9ybWF0X3NlbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1mb3JtYXQtY29udmVydGVycy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtZm9ybWF0LWNvbnZlcnRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFkY2EwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtZm9ybWF0LWNvbnZlcnRlcnMuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8qCisgKiBDb250YWlucyBkZWNsYXJhdGlvbiBvZiB0aGUgQVBJIHRoYXQgYWxsb3dzIGNvbnZlcnRpbmcgZnJhbWVzIGZyb20gb25lCisgKiBwaXhlbCBmb3JtYXQgdG8gYW5vdGhlci4KKyAqCisgKiBGb3IgdGhlIGVtdWxhdG9yLCB3ZSByZWFsbHkgbmVlZCB0byBjb252ZXJ0IGludG8gdHdvIGZvcm1hdHM6IFlWMTIsIHdoaWNoIGlzCisgKiB1c2VkIGJ5IHRoZSBjYW1lcmEgZnJhbWV3b3JrIGZvciB2aWRlbywgYW5kIFJHQjMyIGZvciBwcmV2aWV3IHdpbmRvdy4KKyAqLworCisjaW5jbHVkZSAiY2FtZXJhLWNvbW1vbi5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBDaGVja3MgaWYgY29udmVyc2lvbiBiZXR3ZWVuIHR3byBwaXhlbCBmb3JtYXRzIGlzIGF2YWlsYWJsZS4KKyAqIFBhcmFtOgorICogIGZyb20gLSBQaXhlbCBmb3JtYXQgdG8gY29udmVydCBmcm9tLgorICogIHRvIC0gUGl4ZWwgZm9ybWF0IHRvIGNvbnZlcnQgdG8uCisgKiBSZXR1cm46CisgKiAgYm9vbGVhbjogMSBpZiBjb252ZXJ0ZXIgaXMgYXZhaWxhYmxlLCBvciAwIGlmIG5vIGNvbnZlcnNpb24gZXhpc3RzLgorICovCitleHRlcm4gaW50IGhhc19jb252ZXJ0ZXIodWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8pOworCisvKiBDb252ZXJ0cyBhIGZyYW1lIGludG8gbXVsdGlwbGUgZnJhbWVidWZmZXJzLgorICogV2hlbiBjYW1lcmEgc2VydmljZSByZXBsaWVzIHRvIGEgZnJhbWVidWZmZXIgcmVxdWVzdCBmcm9tIHRoZSBjbGllbnQsIGl0CisgKiB1c3VhbHkgc2VuZHMgdHdvIGZyYW1lYnVmZmVycyBpbiB0aGUgcmVwbHk6IG9uZSBmb3IgdmlkZW8sIGFuZCBhbm90aGVyIGZvcgorICogcHJldmlldyB3aW5kb3cuIFNpbmNlIHRoZXNlIHR3byBmcmFtZWJ1ZmZlcnMgaGF2ZSBkaWZmZXJlbnQgcGl4ZWwgZm9ybWF0cworICogKG1vc3Qgb2YgdGhlIHRpbWUpLCB3ZSBuZWVkIHRvIGRvIHR3byBjb252ZXJzaW9ucyBmb3IgZWFjaCBmcmFtZSByZWNlaXZlZCBmcm9tCisgKiB0aGUgY2FtZXJhLiBUaGlzIGlzIHRoZSBtYWluIGludGVudGlvbiBiZWhpbmQgdGhpcyByb3V0aW5lOiB0byBoYXZlIGEgb25lIGNhbGwKKyAqIHRoYXQgcHJvZHVjZXMgYXMgbWFueSBjb252ZXJzaW9ucyBhcyBuZWVkZWQuCisgKiBQYXJhbToKKyAqICBmcmFtZSAtIEZyYW1lIHRvIGNvbnZlcnQuCisgKiAgcGl4ZWxfZm9ybWF0IC0gRGVmaW5lcyBwaXhlbCBmb3JtYXQgZm9yIHRoZSBjb252ZXJ0aW5nIGZyYW1lYnVmZmVyLgorICogIGZyYW1lYnVmZmVyX3NpemUsIHdpZHRoLCBoZWlnaHQgLSBDb252ZXJ0aW5nIGZyYW1lYnVmZmVyIGJ5dGUgc2l6ZSwgd2lkdGgsCisgKiAgICAgIGFuZCBoZWlnaHQuCisgKiAgZnJhbWVidWZmZXJzIC0gQXJyYXkgb2YgZnJhbWVidWZmZXJzIHdoZXJlIHRvIGNvbnZlcnQgdGhlIGZyYW1lLiBTaXplIG9mIHRoaXMKKyAqICAgICAgYXJyYXkgaXMgZGVmaW5lZCBieSB0aGUgJ2Zic19udW0nIHBhcmFtZXRlci4gTm90ZSB0aGF0IHRoZSBjYWxsZXIgbXVzdAorICogICAgICBtYWtlIHN1cmUgdGhhdCBidWZmZXJzIGFyZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBlbnRpcmUgZnJhbWUgY2FwdHVyZWQKKyAqICAgICAgZnJvbSB0aGUgZGV2aWNlLgorICogIGZic19udW0gLSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgJ2ZyYW1lYnVmZmVycycgYXJyYXkuCisgKiAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSAtIFdoaXRlIGJhbGFuY2Ugc2NhbGUuCisgKiAgZXhwX2NvbXAgLSBFeHBzb3VyZSBjb21wZW5zYXRpb24uCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciBub24temVybyB2YWx1ZSBvbiBmYWlsdXJlLgorKi8KK2V4dGVybiBpbnQgY29udmVydF9mcmFtZShjb25zdCB2b2lkKiBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RnJhbWVCdWZmZXIqIGZyYW1lYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBleHBfY29tcCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtbGlzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1saXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI4MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtbGlzdC5jcHAKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtbGlzdC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWNhcHR1cmUuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBlbXVsYXRlZCBjYW1lcmFzLiAqLworI2RlZmluZSBNQVhfQ0FNRVJBIDgKKwordm9pZCBhbmRyb2lkX2NhbWVyYV9saXN0X3dlYmNhbXModm9pZCkgeworICAgIENhbWVyYUluZm8gY2lbTUFYX0NBTUVSQV0gPSB7fTsKKworICAgIC8qIEVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlIGhvc3QuICovCisgICAgaW50IGNvbm5lY3RlZF9jbnQgPSBjYW1lcmFfZW51bWVyYXRlX2RldmljZXMoY2ksIE1BWF9DQU1FUkEpOworICAgIGlmIChjb25uZWN0ZWRfY250IDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaW50ZigiTGlzdCBvZiB3ZWIgY2FtZXJhcyBjb25uZWN0ZWQgdG8gdGhlIGNvbXB1dGVyOlxuIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25uZWN0ZWRfY250OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIgQ2FtZXJhICclcycgaXMgY29ubmVjdGVkIHRvIGRldmljZSAnJXMnIG9uIGNoYW5uZWwgJWQgIgorICAgICAgICAgICAgICAgInVzaW5nIHBpeGVsIGZvcm1hdCAnJS40cydcbiIsCisgICAgICAgICAgICAgICBjaVtpXS5kaXNwbGF5X25hbWUsIGNpW2ldLmRldmljZV9uYW1lLCBjaVtpXS5pbnBfY2hhbm5lbCwKKyAgICAgICAgICAgICAgIChjb25zdCBjaGFyKikmY2lbaV0ucGl4ZWxfZm9ybWF0KTsKKworICAgICAgICBjYW1lcmFfaW5mb19kb25lKCZjaVtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWxpc3QuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIzMDcxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtbGlzdC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gTGlzdCBhdmFpbGFibGUgd2UgY2FtZXJhcyB0byBzdGRvdXQuIFVzZWQgdG8gaW1wbGVtZW50IC13ZWJjYW0tbGlzdAorLy8gb3B0aW9uLgorZXh0ZXJuIHZvaWQgYW5kcm9pZF9jYW1lcmFfbGlzdF93ZWJjYW1zKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXNlcnZpY2UuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXNlcnZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRhOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtc2VydmljZS5jCkBAIC0wLDAgKzEsMTM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBDb250YWlucyBlbXVsYXRlZCBjYW1lcmEgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXNlcnZpY2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvY2FtZXJhL2NhbWVyYS1jYXB0dXJlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWZvcm1hdC1jb252ZXJ0ZXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIiAgLyogZm9yIGFuZHJvaWRfaHcgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2Jvb3QtcHJvcGVydGllcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSAgRSguLi4pICAgIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFcoLi4uKSAgICBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKGNhbWVyYSxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKGNhbWVyYSkKKworLyogdGhlIFQoLi4uKSBtYWNybyBpcyB1c2VkIHRvIGR1bXAgdHJhZmZpYyAqLworI2RlZmluZSAgVF9BQ1RJVkUgICAwCisKKyNpZiBUX0FDVElWRQorI2RlZmluZSAgVCguLi4pICAgIFZFUkJPU0VfUFJJTlQoY2FtZXJhLF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgIFQoLi4uKSAgICAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBEZWZpbmVzIG5hbWUgb2YgdGhlIGNhbWVyYSBzZXJ2aWNlLiAqLworI2RlZmluZSBTRVJWSUNFX05BTUUgICAgImNhbWVyYSIKKworLyogTWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIGVtdWxhdGVkIGNhbWVyYXMuICovCisjZGVmaW5lIE1BWF9DQU1FUkEgICAgICA4CisKKy8qIHRoZSBxdWVyeSBmcm9tIGd1ZXN0IHNob3VsZCBub3QgYmUgdG9vIGxvbmcsIHNvIDgwOTIgaXMgbW9yZSB0aGFuIGVub3VnaCAqLworI2RlZmluZSBNQVhfUVVFUllfTUVTU0FHRV9TSVpFIDgwOTIKKworLyogQ2FtZXJhIHNldmljZSBkZXNjcmlwdG9yLiAqLwordHlwZWRlZiBzdHJ1Y3QgQ2FtZXJhU2VydmljZURlc2MgQ2FtZXJhU2VydmljZURlc2M7CitzdHJ1Y3QgQ2FtZXJhU2VydmljZURlc2MgeworICAgIC8qIEluZm9ybWF0aW9uIGFib3V0IGNhbWVyYSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4KKyAgICAgKiBOb3RlIHRoYXQgb25jZSBpbml0aWFsaXplZCwgZW50cmllcyBpbiB0aGlzIGFycmF5IGFyZSBjb25zaWRlcmVkIHRvIGJlCisgICAgICogY29uc3RhbnQuICovCisgICAgQ2FtZXJhSW5mbyAgY2FtZXJhX2luZm9bTUFYX0NBTUVSQV07CisgICAgLyogTnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4gKi8KKyAgICBpbnQgICAgICAgICBjYW1lcmFfY291bnQ7Cit9OworCisvKiBPbmUgYW5kIG9ubHkgb25lIGNhbWVyYSBzZXJ2aWNlLiAqLworc3RhdGljIENhbWVyYVNlcnZpY2VEZXNjICAgIF9jYW1lcmFfc2VydmljZV9kZXNjOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEhlbHBlciByb3V0aW5lcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEV4dHJhY3RzIHF1ZXJ5IG5hbWUsIGFuZCAob3B0aW9uYWxseSkgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBxdWVyeSBzdHJpbmcuCisgKiBQYXJhbToKKyAqICBxdWVyeSAtIFF1ZXJ5IHN0cmluZy4gUXVlcnkgc3RyaW5nIGluIHRoZSBjYW1lcmEgc2VydmljZSBhcmUgZm9ybWF0dGVkIGFzIHN1Y2g6CisgKiAgICAgICAgICAiPHF1ZXJ5IG5hbWU+WyA8cGFyYW1ldGVycz5dIiwKKyAqICAgICAgd2hlcmUgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwsIGFuZCBpZiBwcmVzZW50LCBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZQorICogICAgICBxdWVyeSBuYW1lIHdpdGggYSBzaW5nbGUgJyAnLiBTZWUgY29tbWVudHMgdG8gZ2V0X3Rva2VuX3ZhbHVlIHJvdXRpbmUKKyAqICAgICAgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIHBhcmFtZXRlcnMgc3RyaW5nLgorICogIHF1ZXJ5X25hbWUgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgcXVlcnkgbmFtZSBleHRyYWN0ZWQgZnJvbSB0aGUgcXVlcnkKKyAqICAgICAgc3RyaW5nLgorICogIHF1ZXJ5X25hbWVfc2l6ZSAtIEJ1ZmZlciBzaXplIGZvciAncXVlcnlfbmFtZScgc3RyaW5nLgorICogIHF1ZXJ5X3BhcmFtIC0gVXBvbiBzdWNjZXNzIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWVyeQorICogICAgICBwYXJhbWV0ZXJzLiBJZiBxdWVyeSBoYXMgbm8gcGFyYW1ldGVycywgTlVMTCB3aWxsIGJlIHBhc3NlZCBiYWNrIHdpdGgKKyAqICAgICAgdGhpcyBwYXJhbWV0ZXIuIFRoaXMgcGFyYW1ldGVyIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgTlVMTC4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgcXVlcnkgbmFtZSBpZiAncXVlcnlfbmFtZScKKyAqICBzdHJpbmcgYnVmZmVyIHdhcyB0b28gc21hbGwgdG8gY29udGFpbiBpdC4KKyAqLworc3RhdGljIGludAorX3BhcnNlX3F1ZXJ5KGNvbnN0IGNoYXIqIHF1ZXJ5LAorICAgICAgICAgICAgIGNoYXIqIHF1ZXJ5X25hbWUsCisgICAgICAgICAgICAgaW50IHF1ZXJ5X25hbWVfc2l6ZSwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiogcXVlcnlfcGFyYW0pCit7CisgICAgLyogRXh0cmFjdCBxdWVyeSBuYW1lLiAqLworICAgIGNvbnN0IGNoYXIqIHFlbmQgPSBzdHJjaHIocXVlcnksICcgJyk7CisgICAgaWYgKHFlbmQgPT0gTlVMTCkgeworICAgICAgICBxZW5kID0gcXVlcnkgKyBzdHJsZW4ocXVlcnkpOworICAgIH0KKyAgICBpZiAoKHFlbmQgLSBxdWVyeSkgPj0gcXVlcnlfbmFtZV9zaXplKSB7CisgICAgICAgIHJldHVybiBxZW5kIC0gcXVlcnkgKyAxOworICAgIH0KKyAgICBtZW1jcHkocXVlcnlfbmFtZSwgcXVlcnksIHFlbmQgLSBxdWVyeSk7CisgICAgcXVlcnlfbmFtZVtxZW5kIC0gcXVlcnldID0gJ1wwJzsKKworICAgIC8qIENhbGN1bGF0ZSBxdWVyeSBwYXJhbWV0ZXJzIHBvaW50ZXIgKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAocXVlcnlfcGFyYW0gIT0gTlVMTCkgeworICAgICAgICBpZiAoKnFlbmQgPT0gJyAnKSB7CisgICAgICAgICAgICBxZW5kKys7CisgICAgICAgIH0KKyAgICAgICAgKnF1ZXJ5X3BhcmFtID0gKCpxZW5kID09ICdcMCcpID8gTlVMTCA6IHFlbmQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEFwcGVuZHMgb25lIHN0cmluZyB0byBhbm90aGVyLCBncm93aW5nIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgYnVmZmVyIGlmCisgKiBuZWVkZWQuCisgKiBQYXJhbToKKyAqICBzdHJfYnVmZmVyIC0gQ29udGFpbnMgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nIGJ1ZmZlci4gQ29udGVudCBvZgorICogICAgICB0aGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4gTm90ZSB0aGF0IGNvbnRlbnQgb2YgdGhpcyBwYXJhbWV0ZXIgd2lsbAorICogICAgICBjaGFuZ2UgaWYgc3RyaW5nIGJ1ZmZlciBoYXMgYmVlbiByZWFsbG9jYXRlZC4KKyAqICBzdHJfYnVmX3NpemUgLSBDb250YWlucyBjdXJyZW50IGJ1ZmZlciBzaXplIG9mIHRoZSBzdHJpbmcsIGFkZHJlc3NlZCBieQorICogICAgICAnc3RyX2J1ZmZlcicgcGFyYW1ldGVyLiBOb3RlIHRoYXQgY29udGVudCBvZiB0aGlzIHBhcmFtZXRlciB3aWxsIGNoYW5nZQorICogICAgICBpZiBzdHJpbmcgYnVmZmVyIGhhcyBiZWVuIHJlYWxsb2NhdGVkLgorICogIHN0ciAtIFN0cmluZyB0byBhcHBlbmQuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlIChtZW1vcnkgYWxsb2NhdGlvbikuCisgKi8KK3N0YXRpYyBpbnQKK19hcHBlbmRfc3RyaW5nKGNoYXIqKiBzdHJfYnVmLCBzaXplX3QqIHN0cl9idWZfc2l6ZSwgY29uc3QgY2hhciogc3RyKQoreworICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSAoKnN0cl9idWYgIT0gTlVMTCkgPyBzdHJsZW4oKnN0cl9idWYpIDogMDsKKyAgICBjb25zdCBzaXplX3QgYXBwZW5kX2J5dGVzID0gc3RybGVuKHN0cikgKyAxOworCisgICAgLyogTWFrZSBzdXJlIHRoZXNlIHR3byBtYXRjaC4gKi8KKyAgICBpZiAoKnN0cl9idWYgPT0gTlVMTCkgeworICAgICAgICAqc3RyX2J1Zl9zaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoKG9mZnNldCArIGFwcGVuZF9ieXRlcykgPiAqc3RyX2J1Zl9zaXplKSB7CisgICAgICAgIC8qIFJlYWxsb2NhdGUgc3RyaW5nLCBzbyBpdCBjYW4gZml0IHdoYXQncyBiZWluZyBhcHBlbmQgdG8gaXQuIE5vdGUgdGhhdAorICAgICAgICAgKiB3ZSByZWFsbG9jYXRlIGEgYml0IGJpZ2dlciBidWZmZXIgdGhhbiBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gbWluaW1pemUKKyAgICAgICAgICogbnVtYmVyIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGxzIGluIGNhc2UgdGhlcmUgYXJlIG1vcmUgImFwcGVuZHMiCisgICAgICAgICAqIGNvbWluZy4gKi8KKyAgICAgICAgY29uc3Qgc2l6ZV90IHJlcXVpcmVkX21lbSA9IG9mZnNldCArIGFwcGVuZF9ieXRlcyArIDI1NjsKKyAgICAgICAgY2hhciogbmV3X2J1ZiA9IChjaGFyKilyZWFsbG9jKCpzdHJfYnVmLCByZXF1aXJlZF9tZW0pOworICAgICAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBFKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBhIHN0cmluZyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxdWlyZWRfbWVtKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqc3RyX2J1ZiA9IG5ld19idWY7CisgICAgICAgICpzdHJfYnVmX3NpemUgPSByZXF1aXJlZF9tZW07CisgICAgfQorICAgIG1lbWNweSgqc3RyX2J1ZiArIG9mZnNldCwgc3RyLCBhcHBlbmRfYnl0ZXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlcHJlc2VudHMgY2FtZXJhIGluZm9ybWF0aW9uIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBmb2xsb3dzOgorICogICduYW1lPTxkZXZuYW1lPiBjaGFubmVsPTxudW0+IHBpeD08Zm9ybWF0PiBmYWNpbmc9PGRpcmVjdGlvbj4gZnJhbWVkaW1zPTx3aWRoMXhoZWlnaHQxLC4uLj5cbicKKyAqIFBhcmFtOgorICogIGNpIC0gQ2FtZXJhIGluZm9ybWF0aW9uIGRlc2NyaXB0b3IgdG8gY29udmVydCBpbnRvIGEgc3RyaW5nLgorICogIHN0ciAtIFBvaW50ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIgd2hlcmUgdG8gc2F2ZSB0aGUgY29udmVydGVkIGNhbWVyYQorICogICAgICBpbmZvcm1hdGlvbiBkZXNjcmlwdG9yLiBPbiBlbnRyeSwgY29udGVudCBvZiB0aGlzIHBhcmFtZXRlciBjYW4gYmUgTlVMTC4KKyAqICAgICAgTm90ZSB0aGF0IHN0cmluZyBidWZmZXIgYWRkcmVzc2VkIHdpdGggdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIHJlYWxsb2NhdGVkCisgKiAgICAgIGluIHRoaXMgcm91dGluZSwgc28gKGlmIG5vdCBOVUxMKSBpdCBtdXN0IGNvbnRhaW4gYSBidWZmZXIgYWxsb2NhdGVkIHdpdGgKKyAqICAgICAgbWFsbG9jLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyBzdHJpbmcgYnVmZmVyIHJldHVybmVkIGluCisgKiAgICAgIHRoaXMgcGFyYW1ldGVyLgorICogIHN0cl9zaXplIC0gQ29udGFpbnMgYnl0ZSBzaXplIG9mIHRoZSBidWZmZXIgYWRkcmVzc2VkIGJ5ICdzdHInIHBhcmFtZXRlci4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yICE9IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorX2NhbWVyYV9pbmZvX3RvX3N0cmluZyhjb25zdCBDYW1lcmFJbmZvKiBjaSwgY2hhcioqIHN0ciwgc2l6ZV90KiBzdHJfc2l6ZSkgeworICAgIGludCByZXM7CisgICAgaW50IG47CisgICAgY2hhciB0bXBbMTI4XTsKKworICAgIC8qIEFwcGVuZCBkZXZpY2UgbmFtZS4gKi8KKyAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAibmFtZT0lcyAiLCBjaS0+ZGV2aWNlX25hbWUpOworICAgIHJlcyA9IF9hcHBlbmRfc3RyaW5nKHN0ciwgc3RyX3NpemUsIHRtcCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICAvKiBBcHBlbmQgaW5wdXQgY2hhbm5lbC4gKi8KKyAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiY2hhbm5lbD0lZCAiLCBjaS0+aW5wX2NoYW5uZWwpOworICAgIHJlcyA9IF9hcHBlbmRfc3RyaW5nKHN0ciwgc3RyX3NpemUsIHRtcCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICAvKiBBcHBlbmQgcGl4ZWwgZm9ybWF0LiAqLworICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJwaXg9JWQgIiwgY2ktPnBpeGVsX2Zvcm1hdCk7CisgICAgcmVzID0gX2FwcGVuZF9zdHJpbmcoc3RyLCBzdHJfc2l6ZSwgdG1wKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8qIEFwcGVuZCBkaXJlY3Rpb24uICovCisgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgImRpcj0lcyAiLCBjaS0+ZGlyZWN0aW9uKTsKKyAgICByZXMgPSBfYXBwZW5kX3N0cmluZyhzdHIsIHN0cl9zaXplLCB0bXApOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgLyogQXBwZW5kIHN1cHBvcnRlZCBmcmFtZSBzaXplcy4gKi8KKyAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiZnJhbWVkaW1zPSVkeCVkIiwKKyAgICAgICAgICAgICBjaS0+ZnJhbWVfc2l6ZXNbMF0ud2lkdGgsIGNpLT5mcmFtZV9zaXplc1swXS5oZWlnaHQpOworICAgIHJlcyA9IF9hcHBlbmRfc3RyaW5nKHN0ciwgc3RyX3NpemUsIHRtcCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBmb3IgKG4gPSAxOyBuIDwgY2ktPmZyYW1lX3NpemVzX251bTsgbisrKSB7CisgICAgICAgIGlmIChjaS0+ZnJhbWVfc2l6ZXNbbl0ud2lkdGggPiAxMDAwIHx8IGNpLT5mcmFtZV9zaXplc1tuXS5oZWlnaHQgPiAxMDAwKSB7CisgICAgICAgICAgICAvKiBHdWVzdCBjYW5ub3QgaGFuZGxlIGxhcmdlIHBpY3R1cmVzIGR1ZSB0byBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtCisgICAgICAgICAgICAgICBidWc6MzA4MzUyNTkKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiwlZHglZCIsCisgICAgICAgICAgICAgICAgIGNpLT5mcmFtZV9zaXplc1tuXS53aWR0aCwgY2ktPmZyYW1lX3NpemVzW25dLmhlaWdodCk7CisgICAgICAgIHJlcyA9IF9hcHBlbmRfc3RyaW5nKHN0ciwgc3RyX3NpemUsIHRtcCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdHJpbmdpZmllZCBjYW1lcmEgcHJvcGVydGllcyBzaG91bGQgZW5kIHdpdGggRU9MLiAqLworICAgIHJldHVybiBfYXBwZW5kX3N0cmluZyhzdHIsIHN0cl9zaXplLCAiXG4iKTsKK30KKworLyogR2V0cyBjYW1lcmEgaW5mb3JtYXRpb24gbWF0Y2hpbmcgYSBkaXNwbGF5IG5hbWUuCisgKiBQYXJhbToKKyAqICBkaXNwX25hbWUgLSBEaXNwbGF5IG5hbWUgdG8gbWF0Y2guCisgKiAgYXJyIC0gQXJyYXkgb2YgY2FtZXJhIGluZm9ybWF0aW9ucy4KKyAqICBudW0gLSBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICogUmV0dXJuOgorICogIE1hdGNoaW5nIGNhbWVyYSBpbmZvcm1hdGlvbiwgb3IgTlVMTCBpZiBtYXRjaGluZyBjYW1lcmEgaW5mb3JtYXRpb24gZm9yIHRoZQorICogIGdpdmVuIGRpc3BsYXkgbmFtZSBoYXMgbm90IGJlZW4gZm91bmQgaW4gdGhlIGFycmF5LgorICovCitzdGF0aWMgQ2FtZXJhSW5mbyogX2NhbWVyYV9pbmZvX2dldF9ieV9kaXNwbGF5X25hbWUoY29uc3QgY2hhciogZGlzcF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbWVyYUluZm8qIGFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtKSB7CisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IG51bTsgbisrKSB7CisgICAgICAgIGlmICghYXJyW25dLmluX3VzZSAmJiBhcnJbbl0uZGlzcGxheV9uYW1lICE9IE5VTEwgJiYKKyAgICAgICAgICAgICFzdHJjbXAoYXJyW25dLmRpc3BsYXlfbmFtZSwgZGlzcF9uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuICZhcnJbbl07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldHMgY2FtZXJhIGluZm9ybWF0aW9uIG1hdGNoaW5nIGEgZGV2aWNlIG5hbWUuCisgKiBQYXJhbToKKyAqICBkZXZpY2VfbmFtZSAtIERldmljZSBuYW1lIHRvIG1hdGNoLgorICogIGFyciAtIEFycmF5IG9mIGNhbWVyYSBpbmZvcm1hdGlvbnMuCisgKiAgbnVtIC0gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAqIFJldHVybjoKKyAqICBNYXRjaGluZyBjYW1lcmEgaW5mb3JtYXRpb24sIG9yIE5VTEwgaWYgbWF0Y2hpbmcgY2FtZXJhIGluZm9ybWF0aW9uIGZvciB0aGUKKyAqICBnaXZlbiBkZXZpY2UgbmFtZSBoYXMgbm90IGJlZW4gZm91bmQgaW4gdGhlIGFycmF5LgorICovCitzdGF0aWMgQ2FtZXJhSW5mbyoKK19jYW1lcmFfaW5mb19nZXRfYnlfZGV2aWNlX25hbWUoY29uc3QgY2hhciogZGV2aWNlX25hbWUsIENhbWVyYUluZm8qIGFyciwgaW50IG51bSkKK3sKKyAgICBpbnQgbjsKKyAgICBmb3IgKG4gPSAwOyBuIDwgbnVtOyBuKyspIHsKKyAgICAgICAgaWYgKGFycltuXS5kZXZpY2VfbmFtZSAhPSBOVUxMICYmICFzdHJjbXAoYXJyW25dLmRldmljZV9uYW1lLCBkZXZpY2VfbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAmYXJyW25dOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbWVyYVNlcnZpY2VEZXNjIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemVkIHdlYmNhbSBlbXVsYXRpb24gcmVjb3JkIGluIGNhbWVyYSBzZXJ2aWNlIGRlc2NyaXB0b3IuCisgKiBQYXJhbToKKyAqICBjc2QgLSBDYW1lcmEgc2VydmljZSBkZXNjcmlwdG9yIHRvIGluaXRpYWxpemUgYSByZWNvcmQgaW4uCisgKiAgZGlzcF9uYW1lIC0gRGlzcGxheSBuYW1lIG9mIGEgd2ViIGNhbWVyYSAoJ3dlYmNhbTxOPicpIHRvIHVzZSBmb3IgZW11bGF0aW9uLgorICogIGRpciAtIERpcmVjdGlvbiAoJ2JhY2snLCBvciAnZnJvbnQnKSB0aGF0IGVtdWxhdGVkIGNhbWVyYSBpcyBmYWNpbmcuCisgKiAgY2ksIGNpX2NudCAtIEFycmF5IG9mIHdlYmNhbSBpbmZvcm1hdGlvbiBmb3IgZW51bWVyYXRlZCB3ZWIgY2FtZXJhcyBjb25uZWN0ZWQKKyAqICAgICAgdG8gdGhlIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkCitfd2VjYW1fc2V0dXAoQ2FtZXJhU2VydmljZURlc2MqIGNzZCwKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiBkaXNwX25hbWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogZGlyLAorICAgICAgICAgICAgIENhbWVyYUluZm8qIGNpLAorICAgICAgICAgICAgIGludCBjaV9jbnQpCit7CisgICAgLyogRmluZCB3ZWJjYW0gcmVjb3JkIGluIHRoZSBsaXN0IG9mIGVudW1lcmF0ZWQgd2ViIGNhbWVyYXMuICovCisgICAgQ2FtZXJhSW5mbyogZm91bmQgPSBfY2FtZXJhX2luZm9fZ2V0X2J5X2Rpc3BsYXlfbmFtZShkaXNwX25hbWUsIGNpLCBjaV9jbnQpOworICAgIGlmIChmb3VuZCA9PSBOVUxMKSB7CisgICAgICAgIFcoIkNhbWVyYSBuYW1lICclcycgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBjYW1lcmFzLlxuIgorICAgICAgICAgICJVc2UgJy13ZWJjYW0tbGlzdCcgZW11bGF0b3Igb3B0aW9uIHRvIG9idGFpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgY2FtZXJhIG5hbWVzLlxuIiwKKyAgICAgICAgICBkaXNwX25hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogU2F2ZSB0byB0aGUgY2FtZXJhIGluZm8gYXJyYXkgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIHNlcnZpY2UuICovCisgICAgY2FtZXJhX2luZm9fY29weSgmY3NkLT5jYW1lcmFfaW5mb1tjc2QtPmNhbWVyYV9jb3VudF0sIGZvdW5kKTsKKyAgICAvKiBUaGlzIGNhbWVyYSBpcyB0YWtlbi4gKi8KKyAgICBmb3VuZC0+aW5fdXNlID0gMTsKKyAgICAvKiBVcGRhdGUgZGlyZWN0aW9uIHBhcmFtZXRlci4gKi8KKyAgICBpZiAoY3NkLT5jYW1lcmFfaW5mb1tjc2QtPmNhbWVyYV9jb3VudF0uZGlyZWN0aW9uICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShjc2QtPmNhbWVyYV9pbmZvW2NzZC0+Y2FtZXJhX2NvdW50XS5kaXJlY3Rpb24pOworICAgIH0KKyAgICBjc2QtPmNhbWVyYV9pbmZvW2NzZC0+Y2FtZXJhX2NvdW50XS5kaXJlY3Rpb24gPSBBU1RSRFVQKGRpcik7CisgICAgRCgiQ2FtZXJhICVkICclcycgY29ubmVjdGVkIHRvICclcycgZmFjaW5nICVzIHVzaW5nICUuNHMgcGl4ZWwgZm9ybWF0IiwKKyAgICAgIGNzZC0+Y2FtZXJhX2NvdW50LCBjc2QtPmNhbWVyYV9pbmZvW2NzZC0+Y2FtZXJhX2NvdW50XS5kaXNwbGF5X25hbWUsCisgICAgICBjc2QtPmNhbWVyYV9pbmZvW2NzZC0+Y2FtZXJhX2NvdW50XS5kZXZpY2VfbmFtZSwKKyAgICAgIGNzZC0+Y2FtZXJhX2luZm9bY3NkLT5jYW1lcmFfY291bnRdLmRpcmVjdGlvbiwKKyAgICAgIChjb25zdCBjaGFyKikoJmNzZC0+Y2FtZXJhX2luZm9bY3NkLT5jYW1lcmFfY291bnRdLnBpeGVsX2Zvcm1hdCkpOworCisgICAgY3NkLT5jYW1lcmFfY291bnQrKzsKK30KKworLyogSW5pdGlhbGl6ZXMgY2FtZXJhIHNlcnZpY2UgZGVzY3JpcHRvci4KKyAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfc2VydmljZV9pbml0KENhbWVyYVNlcnZpY2VEZXNjKiBjc2QpCit7CisgICAgQ2FtZXJhSW5mbyBjaVtNQVhfQ0FNRVJBXSA9IHt9OworICAgIGludCBjb25uZWN0ZWRfY250OworCisgICAgLyogRW51bWVyYXRlIGNhbWVyYSBkZXZpY2VzIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4gKi8KKyAgICBtZW1zZXQoY3NkLT5jYW1lcmFfaW5mbywgMCwgc2l6ZW9mKENhbWVyYUluZm8pICogTUFYX0NBTUVSQSk7CisgICAgY3NkLT5jYW1lcmFfY291bnQgPSAwOworCisgICAgLyogTGV0cyBzZWUgaWYgSFcgY29uZmlnIHVzZXMgd2ViIGNhbWVyYXMuICovCisgICAgaWYgKHN0cm5jbXAoYW5kcm9pZF9ody0+aHdfY2FtZXJhX2JhY2ssICJ3ZWJjYW0iLCA2KSAmJgorICAgICAgICBzdHJuY21wKGFuZHJvaWRfaHctPmh3X2NhbWVyYV9mcm9udCwgIndlYmNhbSIsIDYpKSB7CisgICAgICAgIC8qIFdlYiBjYW1lcmEgZW11bGF0aW9uIGlzIGRpc2FibGVkLiBTa2lwIGVudW1lcmF0aW9uIG9mIHdlYmNhbWVyYXMuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBFbnVtZXJhdGUgd2ViIGNhbWVyYXMgY29ubmVjdGVkIHRvIHRoZSBob3N0LiAqLworICAgIGNvbm5lY3RlZF9jbnQgPSBjYW1lcmFfZW51bWVyYXRlX2RldmljZXMoY2ksIE1BWF9DQU1FUkEpOworICAgIGlmIChjb25uZWN0ZWRfY250IDw9IDApIHsKKyAgICAgICAgLyogTm90aGluZyBpcyBjb25uZWN0ZWQgLSBub3RoaW5nIHRvIGVtdWxhdGUuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgYmFjayBjYW1lcmEgZW11bGF0aW9uLiAqLworICAgIGlmICghc3RybmNtcChhbmRyb2lkX2h3LT5od19jYW1lcmFfYmFjaywgIndlYmNhbSIsIDYpKSB7CisgICAgICAgIF93ZWNhbV9zZXR1cChjc2QsIGFuZHJvaWRfaHctPmh3X2NhbWVyYV9iYWNrLCAiYmFjayIsIGNpLCBjb25uZWN0ZWRfY250KTsKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgZnJvbnQgY2FtZXJhIGVtdWxhdGlvbi4gKi8KKyAgICBpZiAoIXN0cm5jbXAoYW5kcm9pZF9ody0+aHdfY2FtZXJhX2Zyb250LCAid2ViY2FtIiwgNikpIHsKKyAgICAgICAgX3dlY2FtX3NldHVwKGNzZCwgYW5kcm9pZF9ody0+aHdfY2FtZXJhX2Zyb250LCAiZnJvbnQiLCBjaSwgY29ubmVjdGVkX2NudCk7CisgICAgfQorCisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGNvbm5lY3RlZF9jbnQ7ICsraSkgeworICAgICAgICBjYW1lcmFfaW5mb19kb25lKCZjaVtpXSk7CisgICAgfQorfQorCisvKiBHZXRzIGNhbWVyYSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIGNhbWVyYSBkZXZpY2UgbmFtZS4KKyAqIFBhcmFtOgorICogIGNzIC0gSW5pdGlhbGl6ZWQgY2FtZXJhIHNlcnZpY2UgZGVzY3JpcHRvci4KKyAqICBkZXZpY2VfbmFtZSAtIENhbWVyYSdzIGRldmljZSBuYW1lIHRvIGxvb2sgdXAgdGhlIGluZm9ybWF0aW9uIGZvci4KKyAqIFJldHVybjoKKyAqICBDYW1lcmEgaW5mb3JtYXRpb24gcG9pbnRlciBvbiBzdWNjZXNzLCBvciBOVUxMIGlmIG5vIGNhbWVyYSBpbmZvcm1hdGlvbiBoYXMKKyAqICBiZWVuIGZvdW5kIGZvciB0aGUgZ2l2ZW4gZGV2aWNlIG5hbWUuCisgKi8KK3N0YXRpYyBDYW1lcmFJbmZvKgorX2NhbWVyYV9zZXJ2aWNlX2dldF9jYW1lcmFfaW5mb19ieV9kZXZpY2VfbmFtZShDYW1lcmFTZXJ2aWNlRGVzYyogY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRldmljZV9uYW1lKQoreworICAgIHJldHVybiBfY2FtZXJhX2luZm9fZ2V0X2J5X2RldmljZV9uYW1lKGRldmljZV9uYW1lLCBjcy0+Y2FtZXJhX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmNhbWVyYV9jb3VudCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSGVscGVycyBmb3IgaGFuZGxpbmcgY2FtZXJhIGNsaWVudCBxdWVyaWVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRm9ybWF0cyBwYWxvYWQgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIHByb3RvY29sLCBhbmQgc2VuZHMgaXQgdG8gdGhlIGNsaWVudC4KKyAqIFRvIHNpbXBsaWZ5IGVuZGlhbmVzcyBoYW5kbGluZyB3ZSBjb252ZXJ0IHBheWxvYWQgc2l6ZSB0byBhbiBlaWdodCBjaGFyYWN0ZXJzCisgKiBzdHJpbmcsIHJlcHJlc2VudGluZyBwYXlsb2FkIHNpemUgdmFsdWUgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LgorICogUGFyYW06CisgKiAgcWMgLSBRZW11IGNsaWVudCB0byBzZW5kIHRoZSBwYXlsb2FkIHNpemUgdG8uCisgKiAgcGF5bG9hZF9zaXplIC0gUGF5bG9hZCBzaXplIHRvIHJlcG9ydCB0byB0aGUgY2xpZW50LgorICovCitzdGF0aWMgdm9pZAorX3FlbXVfY2xpZW50X3JlcGx5X3BheWxvYWQoUWVtdWRDbGllbnQqIHFjLCBzaXplX3QgcGF5bG9hZF9zaXplKQoreworICAgIGNoYXIgcGF5bG9hZF9zaXplX3N0cls5XTsKKyAgICBzbnByaW50ZihwYXlsb2FkX3NpemVfc3RyLCBzaXplb2YocGF5bG9hZF9zaXplX3N0ciksICIlMDh6eCIsIHBheWxvYWRfc2l6ZSk7CisgICAgcWVtdWRfY2xpZW50X3NlbmQocWMsIChjb25zdCB1aW50OF90KilwYXlsb2FkX3NpemVfc3RyLCA4KTsKK30KKworLyoKKyAqIFByZWZpeGVzIGZvciByZXBsaWVzIHRvIGNhbWVyYSBjbGllbnQgcXVlcmllcy4KKyAqLworCisvKiBTdWNjZXNzLCBubyBkYXRhIHRvIHNlbmQgaW4gcmVwbHkuICovCisjZGVmaW5lIE9LX1JFUExZICAgICAgICAib2siCisvKiBGYWlsdXJlLCBubyBkYXRhIHRvIHNlbmQgaW4gcmVwbHkuICovCisjZGVmaW5lIEtPX1JFUExZICAgICAgICAia28iCisvKiBTdWNjZXNzLCB0aGVyZSBhcmUgZGF0YSB0byBzZW5kIGluIHJlcGx5LiAqLworI2RlZmluZSBPS19SRVBMWV9EQVRBICAgT0tfUkVQTFkgIjoiCisvKiBGYWlsdXJlLCB0aGVyZSBhcmUgZGF0YSB0byBzZW5kIGluIHJlcGx5LiAqLworI2RlZmluZSBLT19SRVBMWV9EQVRBICAgS09fUkVQTFkgIjoiCisKKy8qIEJ1aWxkcyBhbmQgc2VuZHMgYSByZXBseSB0byBhIHF1ZXJ5LgorICogQWxsIHJlcGxpZXMgdG8gYSBxdWVyeSBpbiBjYW1lcmEgc2VydmljZSBoYXZlIGEgcHJlZml4IGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqIHF1ZXJ5IGhhcyBzdWNjZWVkZWQgKCJvayIpLCBvciBmYWlsZWQgKCJrbyIpLiBUaGUgcHJlZml4IGNhbiBiZSBmb2xsb3dlZCBieQorICogZXh0cmEgZGF0YSwgY29udGFpbmluZyByZXNwb25zZSB0byB0aGUgcXVlcnkuIEluIGNhc2UgdGhlcmUgYXJlIGV4dHJhIGRhdGEsCisgKiB0aGV5IGFyZSBzZXBhcmF0ZWQgZnJvbSB0aGUgcHJlZml4IHdpdGggYSAnOicgY2hhcmFjdGVyLgorICogUGFyYW06CisgKiAgcWMgLSBRZW11IGNsaWVudCB0byBzZW5kIHRoZSByZXBseSB0by4KKyAqICBva19rbyAtIEFuICJvayIsIG9yICJrbyIgc2VsZWN0b3IsIHdoZXJlIDAgaXMgZm9yICJrbyIsIGFuZCAhMCBpcyBmb3IgIm9rIi4KKyAqICBleHRyYSAtIE9wdGlvbmFsIGV4dHJhIHF1ZXJ5IGRhdGEuIENhbiBiZSBOVUxMLgorICogIGV4dHJhX3NpemUgLSBFeHRyYSBkYXRhIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkCitfcWVtdV9jbGllbnRfcXVlcnlfcmVwbHkoUWVtdWRDbGllbnQqIHFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBva19rbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBleHRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXh0cmFfc2l6ZSkKK3sKKyAgICBjb25zdCBjaGFyKiBva19rb19zdHI7CisgICAgc2l6ZV90IHBheWxvYWRfc2l6ZTsKKworICAgIC8qIE1ha2Ugc3VyZSBleHRyYV9zaXplIGlzIDAgaWYgZXh0cmEgaXMgTlVMTC4gKi8KKyAgICBpZiAoZXh0cmEgPT0gTlVMTCAmJiBleHRyYV9zaXplICE9IDApIHsKKyAgICAgICAgVygiJXM6ICdleHRyYScgPSBOVUxMLCB3aGlsZSAnZXh0cmFfc2l6ZScgPSAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCAoaW50KWV4dHJhX3NpemUpOworICAgICAgICBleHRyYV9zaXplID0gMDsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdG90YWwgcGF5bG9hZCBzaXplLCBhbmQgc2VsZWN0IGFwcHJvcHJpYXRlICdvaycvJ2tvJyBwcmVmaXggKi8KKyAgICBpZiAoZXh0cmFfc2l6ZSkgeworICAgICAgICAvKiAnZXh0cmEnIHNpemUgKyAyICdvaycvJ2tvJyBieXRlcyArIDEgJzonIHNlcGFyYXRvciBieXRlLiAqLworICAgICAgICBwYXlsb2FkX3NpemUgPSBleHRyYV9zaXplICsgMzsKKyAgICAgICAgb2tfa29fc3RyID0gb2tfa28gPyBPS19SRVBMWV9EQVRBIDogS09fUkVQTFlfREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBObyBleHRyYSBkYXRhOiBqdXN0IHplcm8tdGVybWluYXRlZCAnb2snLydrbycuICovCisgICAgICAgIHBheWxvYWRfc2l6ZSA9IDM7CisgICAgICAgIG9rX2tvX3N0ciA9IG9rX2tvID8gT0tfUkVQTFkgOiBLT19SRVBMWTsKKyAgICB9CisKKyAgICAvKiBTZW5kIHBheWxvYWQgc2l6ZSBmaXJzdC4gKi8KKyAgICBfcWVtdV9jbGllbnRfcmVwbHlfcGF5bG9hZChxYywgcGF5bG9hZF9zaXplKTsKKyAgICAvKiBTZW5kICdva1s6XScvJ2tvWzpdJyBuZXh0LiBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gZXh0cmEgZGF0YSwgd2Ugc3RpbGwKKyAgICAgKiBuZWVkIHRvIHNlbmQgYSB6ZXJvLXRlcm1pbmF0b3IgZm9yICdvaycvJ2tvJyBzdHJpbmcgaW5zdGVhZCBvZiB0aGUgJzonCisgICAgICogc2VwYXJhdG9yLiBTbywgb25lIHdheSBvciBhbm90aGVyLCB0aGUgcHJlZml4IGlzIGFsd2F5cyAzIGJ5dGVzLiAqLworICAgIHFlbXVkX2NsaWVudF9zZW5kKHFjLCAoY29uc3QgdWludDhfdCopb2tfa29fc3RyLCAzKTsKKyAgICAvKiBTZW5kIGV4dHJhIGRhdGEgKGlmIHByZXNlbnQpLiAqLworICAgIGlmIChleHRyYSAhPSBOVUxMKSB7CisgICAgICAgIHFlbXVkX2NsaWVudF9zZW5kKHFjLCAoY29uc3QgdWludDhfdCopZXh0cmEsIGV4dHJhX3NpemUpOworICAgIH0KK30KKworLyogUmVwbGllcyBxdWVyeSBzdWNjZXNzICgiT0siKSBiYWNrIHRvIHRoZSBjbGllbnQuCisgKiBQYXJhbToKKyAqICBxYyAtIFFlbXUgY2xpZW50IHRvIHNlbmQgdGhlIHJlcGx5IHRvLgorICogIG9rX3N0ciAtIEFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIHF1ZXJ5IHJlc3VsdHMuIENhbiBiZSBOVUxMLgorICovCitzdGF0aWMgdm9pZAorX3FlbXVfY2xpZW50X3JlcGx5X29rKFFlbXVkQ2xpZW50KiBxYywgY29uc3QgY2hhciogb2tfc3RyKQoreworICAgIF9xZW11X2NsaWVudF9xdWVyeV9yZXBseShxYywgMSwgb2tfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2tfc3RyICE9IE5VTEwpID8gKHN0cmxlbihva19zdHIpICsgMSkgOiAwKTsKK30KKworLyogUmVwbGllcyBxdWVyeSBmYWlsdXJlICgiS08iKSBiYWNrIHRvIHRoZSBjbGllbnQuCisgKiBQYXJhbToKKyAqICBxYyAtIFFlbXUgY2xpZW50IHRvIHNlbmQgdGhlIHJlcGx5IHRvLgorICogIGtvX3N0ciAtIEFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIHJlYXNvbiBmb3IgZmFpbHVyZS4gQ2FuIGJlIE5VTEwuCisgKi8KK3N0YXRpYyB2b2lkCitfcWVtdV9jbGllbnRfcmVwbHlfa28oUWVtdWRDbGllbnQqIHFjLCBjb25zdCBjaGFyKiBrb19zdHIpCit7CisgICAgX3FlbXVfY2xpZW50X3F1ZXJ5X3JlcGx5KHFjLCAwLCBrb19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrb19zdHIgIT0gTlVMTCkgPyAoc3RybGVuKGtvX3N0cikgKyAxKSA6IDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbWVyYSBGYWN0b3J5IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEhhbmRsZXMgJ2xpc3QnIHF1ZXJ5IHJlY2VpdmVkIGZyb20gdGhlIEZhY3RvcnkgY2xpZW50LgorICogUmVzcG9uc2UgdG8gdGhpcyBxdWVyeSBpcyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgZWFjaCBjb25uZWN0ZWQgY2FtZXJhIGluCisgKiB0aGlzIGZvcm1hdDogJ25hbWU9ZGV2bmFtZSBmcmFtZWRpbXM9d2lkaDF4aGVpZ2h0MSx3aWRoMnhoZWlnaHQyLHdpZGhOeGhlaWdodE5cbicKKyAqIFN0cmluZ3MsIHJlcHJlc2VudGluZyBlYWNoIGNhbWVyYSBhcmUgc2VwYXJhdGVkIHdpdGggRU9MIHN5bWJvbC4KKyAqIFBhcmFtOgorICogIGNzZCwgY2xpZW50IC0gRmFjdG9yeSBzZXJpdmljZSwgYW5kIGNsaWVudC4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yICE9IDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorX2ZhY3RvcnlfY2xpZW50X2xpc3RfY2FtZXJhcyhDYW1lcmFTZXJ2aWNlRGVzYyogY3NkLCBRZW11ZENsaWVudCogY2xpZW50KQoreworICAgIGludCBuOworICAgIHNpemVfdCByZXBseV9zaXplID0gMDsKKyAgICBjaGFyKiByZXBseSA9IE5VTEw7CisKKyAgICAvKiBMZXRzIHNlZSBpZiB0aGVyZSB3YXMgYW55dGhpbmcgZm91bmQuLi4gKi8KKyAgICBpZiAoY3NkLT5jYW1lcmFfY291bnQgPT0gMCkgeworICAgICAgICAvKiBObyBjYW1lcmFzIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4gUmVwbHkgd2l0aCAiXG4iICovCisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9vayhjbGllbnQsICJcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiAiU3RyaW5naWZ5IiBlYWNoIGNhbWVyYSBpbmZvcm1hdGlvbiBpbnRvIHRoZSByZXBseSBzdHJpbmcuICovCisgICAgZm9yIChuID0gMDsgbiA8IGNzZC0+Y2FtZXJhX2NvdW50OyBuKyspIHsKKyAgICAgICAgY29uc3QgaW50IHJlcyA9CisgICAgICAgICAgICBfY2FtZXJhX2luZm9fdG9fc3RyaW5nKGNzZC0+Y2FtZXJhX2luZm8gKyBuLCAmcmVwbHksICZyZXBseV9zaXplKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgaWYgKHJlcGx5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKHJlcGx5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhjbGllbnQsICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEQoIiVzIFJlcGxpZWQ6ICVzIiwgX19GVU5DVElPTl9fLCByZXBseSk7CisgICAgX3FlbXVfY2xpZW50X3JlcGx5X29rKGNsaWVudCwgcmVwbHkpOworICAgIGZyZWUocmVwbHkpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZXMgYSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIGVtdWxhdGVkIGNhbWVyYSBmYWN0b3J5IGNsaWVudC4KKyAqIFF1ZXJpZXMgcmVjZWl2ZWQgaGVyZSBhcmUgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKKyAqICAnbGlzdCcgLSBRdWVyaWVzIGxpc3Qgb2YgY2FtZXJhcyBjb25uZWN0ZWQgdG8gdGhlIGhvc3QuCisgKiBQYXJhbToKKyAqICBvcGFxdWUgLSBDYW1lcmEgc2VydmljZSBkZXNjcmlwdG9yLgorICogIG1zZywgbXNnbGVuIC0gTWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoZSBjYW1lcmEgZmFjdG9yeSBjbGllbnQuCisgKiAgY2xpZW50IC0gQ2FtZXJhIGZhY3RvcnkgY2xpZW50IHBpcGUuCisgKi8KK3N0YXRpYyB2b2lkCitfZmFjdG9yeV9jbGllbnRfcmVjdih2b2lkKiAgICAgICAgIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgbXNnLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudCogIGNsaWVudCkKK3sKKyAgICAvKgorICAgICAqIEVtdWxhdGVkIGNhbWVyYSBmYWN0b3J5IGNsaWVudCBxdWVyaWVzLgorICAgICAqLworCisgICAgLyogTGlzdCBjYW1lcmFzIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4gKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBfcXVlcnlfbGlzdFtdICAgICA9ICJsaXN0IjsKKworICAgIENhbWVyYVNlcnZpY2VEZXNjKiBjc2QgPSAoQ2FtZXJhU2VydmljZURlc2MqKW9wYXF1ZTsKKyAgICBjaGFyIHF1ZXJ5X25hbWVbNjRdOworICAgIGNvbnN0IGNoYXIqIHF1ZXJ5X3BhcmFtID0gTlVMTDsKKworICAgIC8qIFBhcnNlIHRoZSBxdWVyeSwgZXh0cmFjdGluZyBxdWVyeSBuYW1lIGFuZCBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChfcGFyc2VfcXVlcnkoKGNvbnN0IGNoYXIqKW1zZywgcXVlcnlfbmFtZSwgc2l6ZW9mKHF1ZXJ5X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgJnF1ZXJ5X3BhcmFtKSkgeworICAgICAgICBFKCIlczogSW52YWxpZCBmb3JtYXQgaW4gcXVlcnkgJyVzJyIsIF9fRlVOQ1RJT05fXywgKGNvbnN0IGNoYXIqKW1zZyk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhjbGllbnQsICJJbnZhbGlkIHF1ZXJ5IGZvcm1hdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRCgiJXMgQ2FtZXJhIGZhY3RvcnkgcXVlcnkgJyVzJyIsIF9fRlVOQ1RJT05fXywgcXVlcnlfbmFtZSk7CisKKyAgICAvKiBEaXNwYXRjaCB0aGUgcXVlcnkgdG8gYW4gYXBwcm9wcmlhdGUgaGFuZGxlci4gKi8KKyAgICBpZiAoIXN0cmNtcChxdWVyeV9uYW1lLCBfcXVlcnlfbGlzdCkpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhICJsaXN0IiBxdWVyeS4gKi8KKyAgICAgICAgX2ZhY3RvcnlfY2xpZW50X2xpc3RfY2FtZXJhcyhjc2QsIGNsaWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRSgiJXM6IFVua25vd24gY2FtZXJhIGZhY3RvcnkgcXVlcnkgbmFtZSBpbiAnJXMnIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIChjb25zdCBjaGFyKiltc2cpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfa28oY2xpZW50LCAiVW5rbm93biBxdWVyeSBuYW1lIik7CisgICAgfQorfQorCisvKiBFbXVsYXRlZCBjYW1lcmEgZmFjdG9yeSBjbGllbnQgaGFzIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIHNlcnZpY2UuICovCitzdGF0aWMgdm9pZAorX2ZhY3RvcnlfY2xpZW50X2Nsb3NlKHZvaWQqICBvcGFxdWUpCit7CisgICAgLyogVGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiB1cCBoZXJlOiBmYWN0b3J5IHNlcnZpY2UgaXMganVzdCBhbiBhbGlhcyBmb3IKKyAgICAgKiB0aGUgInJvb3QiIGNhbWVyYSBzZXJ2aWNlLCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhbnl0aGluZyBtb3JlLCB0aGFuIGNhbWVyYQorICAgICAqIGRlcnZpY2UgZGVzY3JpcHRvciBhbHJlYWR5IHByb3ZpZGVzLiAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbWVyYSBjbGllbnQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVzY3JpYmVzIGFuIGVtdWxhdGVkIGNhbWVyYSBjbGllbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IENhbWVyYUNsaWVudCBDYW1lcmFDbGllbnQ7CitzdHJ1Y3QgQ2FtZXJhQ2xpZW50Cit7CisgICAgLyogQ2xpZW50IG5hbWUuCisgICAgICogIE9uIExpbnV4IHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbWVyYSBkZXZpY2UuCisgICAgICogIE9uIFdpbmRvd3MgdGhpcyBpcyB0aGUgbmFtZSBvZiBjYXB0dXJpbmcgd2luZG93LgorICAgICAqLworICAgIGNoYXIqICAgICAgICAgICAgICAgZGV2aWNlX25hbWU7CisgICAgLyogSW5wdXQgY2hhbm5lbCB0byB1c2UgdG8gY29ubmVjdCB0byB0aGUgY2FtZXJhLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgaW5wX2NoYW5uZWw7CisgICAgLyogQ2FtZXJhIGluZm9ybWF0aW9uLiAqLworICAgIGNvbnN0IENhbWVyYUluZm8qICAgY2FtZXJhX2luZm87CisgICAgLyogRW11bGF0ZWQgY2FtZXJhIGRldmljZSBkZXNjcmlwdG9yLiAqLworICAgIENhbWVyYURldmljZSogICAgICAgY2FtZXJhOworICAgIC8qIEJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHZpZGVvIGZyYW1lcy4KKyAgICAgKiBOb3RlIHRoYXQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhpcyBidWZmZXIKKyAgICAgKiBhbHNvIGNvbnRhaW5zIHByZXZpZXcgZnJhbWVidWZmZXIuICovCisgICAgdWludDhfdCogICAgICAgICAgICB2aWRlb19mcmFtZTsKKyAgICAvKiBQcmV2aWV3IGZyYW1lIGJ1ZmZlci4KKyAgICAgKiBUaGlzIGFkZHJlc3MgcG9pbnRzIGluc2lkZSB0aGUgJ3ZpZGVvX2ZyYW1lJyBidWZmZXIuICovCisgICAgdWludDE2X3QqICAgICAgICAgICBwcmV2aWV3X2ZyYW1lOworICAgIC8qIEJ5dGUgc2l6ZSBvZiB0aGUgdmlkZW9mcmFtZSBidWZmZXIuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICB2aWRlb19mcmFtZV9zaXplOworICAgIC8qIEJ5dGUgc2l6ZSBvZiB0aGUgcHJldmlldyBmcmFtZSBidWZmZXIuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICBwcmV2aWV3X2ZyYW1lX3NpemU7CisgICAgLyogUGl4ZWwgZm9ybWF0IHJlcXVpcmVkIGJ5IHRoZSBndWVzdC4gKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgIHBpeGVsX2Zvcm1hdDsKKyAgICAvKiBGcmFtZSB3aWR0aC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOworICAgIC8qIEZyYW1lIGhlaWdodC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodDsKKyAgICAvKiBOdW1iZXIgb2YgcGl4ZWxzIGluIGEgZnJhbWUgYnVmZmVyLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgcGl4ZWxfbnVtOworICAgIC8qIFN0YXR1cyBvZiB2aWRlbyBhbmQgcHJldmlldyBmcmFtZSBjYWNoZS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGZyYW1lc19jYWNoZWQ7CisgICAgLyogUXVlcmllcyBiZWluZyBzZW50IGZyb20gdGhlIGd1ZXN0IGNhbiBiZSBpbnRlcnJ1cHRlZCwgcmVzdWx0aW5nIGluIHRoZSBjYW1lcmEgcmVjZWl2aW5nCisgICAgICAgdGhlIHBhcnRpYWwgdGV4dCBvZiBhIHF1ZXJ5LiAgKFRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IHRoZSBxdWVyeSBub3QgZW5kaW5nIHdpdGggYQorICAgICAgIHRlcm1pbmF0aW5nIDAgY2hhcmFjdGVyLikgIEluIHRoYXQgY2FzZSwgdGhlIHBhcnRpYWwgY29tbWFuZCBpcyBzdG9yZWQgaW4gY29tbWFuZF9idWZmZXIsCisgICAgICAgYW5kIGNvbW1hbmRfYnVmZmVyX29mZnNldCByZWNvcmRzIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2VzIHJlY2VpdmVkIHNvIGZhciwgYW5kIHRodXMgd2hlcmUKKyAgICAgICB0aGUgbmV4dCBzZWdtZW50IHNob3VsZCBiZSB3cml0dGVuLgorICAgICAgICovCisgICAgY2hhciBjb21tYW5kX2J1ZmZlcltNQVhfUVVFUllfTUVTU0FHRV9TSVpFXTsKKyAgICBpbnQgIGNvbW1hbmRfYnVmZmVyX29mZnNldDsKK307CisKKy8qIEZyZWVzIGVtdWxhdGVkIGNhbWVyYSBjbGllbnQgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2NsaWVudF9mcmVlKENhbWVyYUNsaWVudCogY2MpCit7CisgICAgLyogVGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoZSAicmVhZCBvbmx5IiBydWxlOiB3ZSBoYXZlIHRvIG1hcmsgdGhlIGNhbWVyYQorICAgICAqIGFzIGJlaW5nIG5vdCB1c2VkIHdoZW4gd2UgZGVzdHJveSBhIHNlcnZpY2UgZm9yIGl0LiAqLworICAgIGlmIChjYy0+Y2FtZXJhX2luZm8gIT0gTlVMTCkgeworICAgICAgICAoKENhbWVyYUluZm8qKWNjLT5jYW1lcmFfaW5mbyktPmluX3VzZSA9IDA7CisgICAgfQorICAgIGlmIChjYy0+Y2FtZXJhICE9IE5VTEwpIHsKKyAgICAgICAgY2FtZXJhX2RldmljZV9jbG9zZShjYy0+Y2FtZXJhKTsKKyAgICB9CisgICAgaWYgKGNjLT52aWRlb19mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUoY2MtPnZpZGVvX2ZyYW1lKTsKKyAgICB9CisgICAgaWYgKGNjLT5kZXZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUoY2MtPmRldmljZV9uYW1lKTsKKyAgICB9CisKKyAgICBBRlJFRShjYyk7Cit9CisKKy8qIENyZWF0ZXMgZGVzY3JpcHRvciBmb3IgYSBjb25uZWN0aW5nIGVtdWxhdGVkIGNhbWVyYSBjbGllbnQuCisgKiBQYXJhbToKKyAqICBjc2QgLSBDYW1lcmEgc2VydmljZSBkZXNjcmlwdG9yLgorICogIHBhcmFtIC0gQ2xpZW50IHBhcmFtZXRlcnMuIE11c3QgYmUgZm9ybWF0dGVkIGFzIGRlc2NyaWJlZCBpbiBjb21tZW50cyB0bworICogICAgICBnZXRfdG9rZW5fdmFsdWUgcm91dGluZSwgYW5kIG11c3QgY29udGFpbiBhdCBsZWFzdCAnbmFtZScgcGFyYW1ldGVyLAorICogICAgICBpZGVudGlmaXlpbmcgdGhlIGNhbWVyYSBkZXZpY2UgdG8gY3JlYXRlIHRoZSBzZXJ2aWNlIGZvci4gQWxzbyBwYXJhbWV0ZXJzCisgKiAgICAgIG1heSBjb250YWluIGEgZGVjaW1hbCAnaW5wX2NoYW5uZWwnIHBhcmFtZXRlciwgc2VsZWN0aW5nIHRoZSBpbnB1dAorICogICAgICBjaGFubmVsIHRvIHVzZSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgY2FtZXJhIGRldmljZS4KKyAqIFJldHVybjoKKyAqICBFbXVsYXRlZCBjYW1lcmEgY2xpZW50IGRlc2NyaXB0b3Igb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgQ2FtZXJhQ2xpZW50KgorX2NhbWVyYV9jbGllbnRfY3JlYXRlKENhbWVyYVNlcnZpY2VEZXNjKiBjc2QsIGNvbnN0IGNoYXIqIHBhcmFtKQoreworICAgIENhbWVyYUNsaWVudCogY2M7CisgICAgQ2FtZXJhSW5mbyogY2k7CisgICAgaW50IHJlczsKKyAgICBBTkVXMChjYyk7CisKKyAgICAvKgorICAgICAqIFBhcnNlIHBhcmFtZXRlciBzdHJpbmcsIGNvbnRhaW5pbmcgY2FtZXJhIGNsaWVudCBwcm9wZXJ0aWVzLgorICAgICAqLworCisgICAgLyogUHVsbCByZXF1aXJlZCBkZXZpY2UgbmFtZS4gKi8KKyAgICBpZiAoZ2V0X3Rva2VuX3ZhbHVlX2FsbG9jKHBhcmFtLCAibmFtZSIsICZjYy0+ZGV2aWNlX25hbWUpKSB7CisgICAgICAgIEUoIiVzOiBBbGxvY2F0aW9uIGZhaWx1cmUsIG9yIHJlcXVpcmVkICduYW1lJyBwYXJhbWV0ZXIgaXMgbWlzc2luZywgb3IgbWlzZm9ybWVkIGluICclcyciLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGFyYW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBQdWxsIG9wdGlvbmFsIGlucHV0IGNoYW5uZWwuICovCisgICAgcmVzID0gZ2V0X3Rva2VuX3ZhbHVlX2ludChwYXJhbSwgImlucF9jaGFubmVsIiwgJmNjLT5pbnBfY2hhbm5lbCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gLTEpIHsKKyAgICAgICAgICAgIC8qICdpbnBfY2hhbm5lbCcgcGFyYW1ldGVyIGhhcyBiZWVuIG9tbWl0ZWQuIFVzZSBkZWZhdWx0IGlucHV0CisgICAgICAgICAgICAgKiBjaGFubmVsLCB3aGljaCBpcyB6ZXJvLiAqLworICAgICAgICAgICAgY2MtPmlucF9jaGFubmVsID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEUoIiVzOiAnaW5wX2NoYW5uZWwnIHBhcmFtZXRlciBpcyBtaXNmb3JtZWQgaW4gJyVzJyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGFyYW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgY2FtZXJhIGluZm8gZm9yIHRoZSBlbXVsYXRlZCBjYW1lcmEgcmVwcmVzZW50ZWQgd2l0aCB0aGlzIHNlcnZpY2UuCisgICAgICogQXJyYXkgb2YgY2FtZXJhIGluZm9ybWF0aW9uIHJlY29yZHMgaGFzIGJlZW4gY3JlYXRlZCB3aGVuIHRoZSBjYW1lcmEKKyAgICAgKiBzZXJ2aWNlIHdhcyBlbnVtZXJhdGluZyBjYW1lcmEgZGV2aWNlcyBkdXJpbmcgdGhlIHNlcnZpY2UgaW5pdGlhbGl6YXRpb24uCisgICAgICogQnkgdGhlIGNhbWVyYSBzZXJ2aWNlIHByb3RvY29sLCBjYW1lcmEgc2VydmljZSBjbGllbnRzIG11c3QgZmlyc3Qgb2J0YWluCisgICAgICogbGlzdCBvZiBlbnVtZXJhdGVkIGNhbWVyYXMgdmlhIHRoZSAnbGlzdCcgcXVlcnkgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlLCBhbmQKKyAgICAgKiB0aGVuIHVzZSBkZXZpY2UgbmFtZSByZXBvcnRlZCBpbiB0aGUgbGlzdCB0byBjb25uZWN0IHRvIGFuIGVtdWxhdGVkIGNhbWVyYQorICAgICAqIHNlcnZpY2UuIFNvLCBpZiBjYW1lcmEgaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbiBkZXZpY2UgbmFtZSBpcyBub3QgZm91bmQKKyAgICAgKiBpbiB0aGUgYXJyYXksIHdlIGZhaWwgdGhpcyBjb25uZWN0aW9uIGR1ZSB0byBwcm90b2NvbCB2aW9sYXRpb24uICovCisgICAgY2kgPSBfY2FtZXJhX3NlcnZpY2VfZ2V0X2NhbWVyYV9pbmZvX2J5X2RldmljZV9uYW1lKGNzZCwgY2MtPmRldmljZV9uYW1lKTsKKyAgICBpZiAoY2kgPT0gTlVMTCkgeworICAgICAgICBFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGluZm8gZm9yIGRldmljZSAnJXMnIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIF9jYW1lcmFfY2xpZW50X2ZyZWUoY2MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBXZSBjYW4ndCBhbGxvdyBtdWx0aXBsZSBjYW1lcmEgc2VydmljZXMgZm9yIGEgc2luZ2xlIGNhbWVyYSBkZXZpY2UsIExldHMKKyAgICAgKiBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBubyBjbGllbnQgY3JlYXRlZCBmb3IgdGhpcyBjYW1lcmEuICovCisgICAgaWYgKGNpLT5pbl91c2UpIHsKKyAgICAgICAgRSgiJXM6IENhbWVyYSBkZXZpY2UgJyVzJyBpcyBpbiB1c2UiLCBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIF9jYW1lcmFfY2xpZW50X2ZyZWUoY2MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBXZSdyZSBkb25lLiBTZXQgY2FtZXJhIGluIHVzZSwgYW5kIHN1Y2NlZWQgdGhlIGNvbm5lY3Rpb24uICovCisgICAgY2ktPmluX3VzZSA9IDE7CisgICAgY2MtPmNhbWVyYV9pbmZvID0gY2k7CisKKyAgICBEKCIlczogQ2FtZXJhIHNlcnZpY2UgaXMgY3JlYXRlZCBmb3IgZGV2aWNlICclcycgdXNpbmcgaW5wdXQgY2hhbm5lbCAlZCIsCisgICAgICBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSwgY2MtPmlucF9jaGFubmVsKTsKKworICAgIHJldHVybiBjYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDYW1lcmEgY2xpZW50IHF1ZXJpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDbGllbnQgaGFzIHF1ZXJpZWQgY29uZWN0aW9uIHRvIHRoZSBjYW1lcmEuCisgKiBQYXJhbToKKyAqICBjYyAtIFF1ZXJpZWQgY2FtZXJhIGNsaWVudCBkZXNjcmlwdG9yLgorICogIHFjIC0gUWVtdSBjbGllbnQgZm9yIHRoZSBlbXVsYXRlZCBjYW1lcmEuCisgKiAgcGFyYW0gLSBRdWVyeSBwYXJhbWV0ZXJzLiBUaGVyZSBhcmUgbm8gcGFyYW1ldGVycyBleHBlY3RlZCBmb3IgdGhpcyBxdWVyeS4KKyAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfY2xpZW50X3F1ZXJ5X2Nvbm5lY3QoQ2FtZXJhQ2xpZW50KiBjYywgUWVtdWRDbGllbnQqIHFjLCBjb25zdCBjaGFyKiBwYXJhbSkKK3sKKyAgICBpZiAoY2MtPmNhbWVyYSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEFscmVhZHkgY29ubmVjdGVkLiAqLworICAgICAgICBXKCIlczogQ2FtZXJhICclcycgaXMgYWxyZWFkeSBjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9vayhxYywgIkNhbWVyYSBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogT3BlbiBjYW1lcmEgZGV2aWNlLiAqLworICAgIGNjLT5jYW1lcmEgPSBjYW1lcmFfZGV2aWNlX29wZW4oY2MtPmRldmljZV9uYW1lLCBjYy0+aW5wX2NoYW5uZWwpOworICAgIGlmIChjYy0+Y2FtZXJhID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBvcGVuIGNhbWVyYSBkZXZpY2UgJyVzJyIsIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X2tvKHFjLCAiVW5hYmxlIHRvIG9wZW4gY2FtZXJhIGRldmljZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEQoIiVzOiBDYW1lcmEgZGV2aWNlICclcycgaXMgbm93IGNvbm5lY3RlZCIsIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lKTsKKworICAgIF9xZW11X2NsaWVudF9yZXBseV9vayhxYywgTlVMTCk7Cit9CisKKy8qIENsaWVudCBoYXMgcXVlcmllZCBkaXNjb25lY3Rpb24gZnJvbSB0aGUgY2FtZXJhLgorICogUGFyYW06CisgKiAgY2MgLSBRdWVyaWVkIGNhbWVyYSBjbGllbnQgZGVzY3JpcHRvci4KKyAqICBxYyAtIFFlbXUgY2xpZW50IGZvciB0aGUgZW11bGF0ZWQgY2FtZXJhLgorICogIHBhcmFtIC0gUXVlcnkgcGFyYW1ldGVycy4gVGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMgZXhwZWN0ZWQgZm9yIHRoaXMgcXVlcnkuCisgKi8KK3N0YXRpYyB2b2lkCitfY2FtZXJhX2NsaWVudF9xdWVyeV9kaXNjb25uZWN0KENhbWVyYUNsaWVudCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50KiBxYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFyYW0pCit7CisgICAgaWYgKGNjLT5jYW1lcmEgPT0gTlVMTCkgeworICAgICAgICAvKiBBbHJlYWR5IGRpc2Nvbm5lY3RlZC4gKi8KKyAgICAgICAgVygiJXM6IENhbWVyYSAnJXMnIGlzIGFscmVhZHkgZGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfb2socWMsICJDYW1lcmEgaXMgbm90IGNvbm5lY3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQmVmb3JlIHdlIGNhbiBnbyBhaGVhZCBhbmQgZGlzY29ubmVjdCwgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBjYW1lcmEgaXMKKyAgICAgKiBub3QgY2FwdHVyaW5nIGZyYW1lcy4gKi8KKyAgICBpZiAoY2MtPnZpZGVvX2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IENhbm5vdCBkaXNjb25uZWN0IGNhbWVyYSAnJXMnIHdoaWxlIGl0IGlzIG5vdCBzdG9wcGVkIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkNhbWVyYSBpcyBub3Qgc3RvcHBlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQ2xvc2UgY2FtZXJhIGRldmljZS4gKi8KKyAgICBjYW1lcmFfZGV2aWNlX2Nsb3NlKGNjLT5jYW1lcmEpOworICAgIGNjLT5jYW1lcmEgPSBOVUxMOworCisgICAgRCgiQ2FtZXJhIGRldmljZSAnJXMnIGlzIG5vdyBkaXNjb25uZWN0ZWQiLCBjYy0+ZGV2aWNlX25hbWUpOworCisgICAgX3FlbXVfY2xpZW50X3JlcGx5X29rKHFjLCBOVUxMKTsKK30KKworc3RhdGljIGJvb2wgY2FsY3VsYXRlX3ZpZGVvX2ZyYW1lX3NpemUodWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogZnJhbWVfc2l6ZSkgeworICAgIGludCB5U3RyaWRlID0gMDsKKyAgICBpbnQgdXZTdHJpZGUgPSAwOworICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVZVNDIwOgorICAgICAgICAgICAgeVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgICAgICAgICAgICB1dlN0cmlkZSA9IGFsaWduKHlTdHJpZGUgLyAyLCAxNik7CisgICAgICAgICAgICAqZnJhbWVfc2l6ZSA9IHlTdHJpZGUgKiBoZWlnaHQgKyB1dlN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjIxOgorICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAod2lkdGggKiBoZWlnaHQgKiAxMikgLyA4OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKiBDbGllbnQgaGFzIHF1ZXJpZWQgdGhlIGNsaWVudCB0byBzdGFydCBjYXB0dXJpbmcgdmlkZW8uCisgKiBQYXJhbToKKyAqICBjYyAtIFF1ZXJpZWQgY2FtZXJhIGNsaWVudCBkZXNjcmlwdG9yLgorICogIHFjIC0gUWVtdSBjbGllbnQgZm9yIHRoZSBlbXVsYXRlZCBjYW1lcmEuCisgKiAgcGFyYW0gLSBRdWVyeSBwYXJhbWV0ZXJzLiBQYXJhbWV0ZXJzIGZvciB0aGlzIHF1ZXJ5IG11c3QgY29udGFpbiBhICdkaW0nLCBhbmQKKyAqICAgICAgYSAncGl4JyBwYXJhbWV0ZXJzLCB3aGVyZSAnZGltJyBtdXN0IGJlICJkaW09PHdpZHRoPng8aGVpZ2h0PiIsIGFuZCAncGl4JworICogICAgICBtdXN0IGJlICJwaXg9PGZvcm1hdD4iLCB3aGVyZSAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBtdXN0IGJlIG51bWVyaWNhbAorICogICAgICB2YWx1ZXMgZm9yIHRoZSBjYXB0dXJpbmcgdmlkZW8gZnJhbWUgd2lkdGgsIGFuZCBoZWlnaHQsIGFuZCAnZm9ybWF0JyBtdXN0CisgKiAgICAgIGJlIGEgbnVtZXJpY2FsIHZhbHVlIGZvciB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSB2aWRlbyBmcmFtZXMgZXhwZWN0ZWQgYnkKKyAqICAgICAgdGhlIGNsaWVudC4gJ2Zvcm1hdCcgbXVzdCBiZSBvbmUgb2YgdGhlIFY0TDJfUElYX0ZNVF9YWFggdmFsdWVzLgorICovCitzdGF0aWMgdm9pZAorX2NhbWVyYV9jbGllbnRfcXVlcnlfc3RhcnQoQ2FtZXJhQ2xpZW50KiBjYywgUWVtdWRDbGllbnQqIHFjLCBjb25zdCBjaGFyKiBwYXJhbSkKK3sKKyAgICBjaGFyKiB3OworICAgIGNoYXIgZGltWzY0XTsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgcGl4X2Zvcm1hdDsKKworICAgIC8qIFNhbml0eSBjaGVjay4gKi8KKyAgICBpZiAoY2MtPmNhbWVyYSA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vdCBjb25uZWN0ZWQuICovCisgICAgICAgIEUoIiVzOiBDYW1lcmEgJyVzJyBpcyBub3QgY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfa28ocWMsICJDYW1lcmEgaXMgbm90IGNvbm5lY3RlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBQYXJzZSBwYXJhbWV0ZXJzLgorICAgICAqLworCisgICAgaWYgKHBhcmFtID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IE1pc3NpbmcgcGFyYW1ldGVycyBmb3IgdGhlIHF1ZXJ5IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X2tvKHFjLCAiTWlzc2luZyBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnkiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFB1bGwgcmVxdWlyZWQgJ2RpbScgcGFyYW1ldGVyLiAqLworICAgIGlmIChnZXRfdG9rZW5fdmFsdWUocGFyYW0sICJkaW0iLCBkaW0sIHNpemVvZihkaW0pKSkgeworICAgICAgICBFKCIlczogSW52YWxpZCBvciBtaXNzaW5nICdkaW0nIHBhcmFtZXRlciBpbiAnJXMnIiwgX19GVU5DVElPTl9fLCBwYXJhbSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkludmFsaWQgb3IgbWlzc2luZyAnZGltJyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFB1bGwgcmVxdWlyZWQgJ3BpeCcgcGFyYW1ldGVyLiAqLworICAgIGlmIChnZXRfdG9rZW5fdmFsdWVfaW50KHBhcmFtLCAicGl4IiwgJnBpeF9mb3JtYXQpKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkIG9yIG1pc3NpbmcgJ3BpeCcgcGFyYW1ldGVyIGluICclcyciLCBfX0ZVTkNUSU9OX18sIHBhcmFtKTsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X2tvKHFjLCAiSW52YWxpZCBvciBtaXNzaW5nICdwaXgnIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUGFyc2UgJ2RpbScgcGFyYW1ldGVyLCBhbmQgZ2V0IHJlcXVlc3RlZCBmcmFtZSB3aWR0aCBhbmQgaGVpZ2h0LiAqLworICAgIHcgPSBzdHJjaHIoZGltLCAneCcpOworICAgIGlmICh3ID09IE5VTEwgfHwgd1sxXSA9PSAnXDAnKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkICdkaW0nIHBhcmFtZXRlciBpbiAnJXMnIiwgX19GVU5DVElPTl9fLCBwYXJhbSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkludmFsaWQgJ2RpbScgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKncgPSAnXDAnOyB3Kys7CisgICAgZXJybm8gPSAwOworICAgIHdpZHRoID0gc3RydG9pKGRpbSwgTlVMTCwgMTApOworICAgIGhlaWdodCA9IHN0cnRvaSh3LCBOVUxMLCAxMCk7CisgICAgaWYgKGVycm5vKSB7CisgICAgICAgIEUoIiVzOiBJbnZhbGlkICdkaW0nIHBhcmFtZXRlciBpbiAnJXMnIiwgX19GVU5DVElPTl9fLCBwYXJhbSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkludmFsaWQgJ2RpbScgcGFyYW1ldGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBBZnRlciBjb2xsZWN0aW5nIGNhcHR1cmUgcGFyYW1ldGVycyBsZXRzIHNlZSBpZiBjYW1lcmEgaGFzIGFscmVhZHkKKyAgICAgKiBzdGFydGVkLCBhbmQgaWYgc28sIGxldHMgc2VlIGlmIHBhcmFtZXRlcnMgbWF0Y2guICovCisgICAgaWYgKGNjLT52aWRlb19mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEFscmVhZHkgc3RhcnRlZC4gTWF0Y2ggY2FwdHVyZSBwYXJhbWV0ZXJzLiAqLworICAgICAgICBpZiAoY2MtPnBpeGVsX2Zvcm1hdCAhPSAodWludDMyX3QpcGl4X2Zvcm1hdCB8fGNjLT53aWR0aCAhPSB3aWR0aCB8fAorICAgICAgICAgICAgY2MtPmhlaWdodCAhPSBoZWlnaHQpIHsKKyAgICAgICAgICAgIC8qIFBhcmFtZXRlcnMgbWF0Y2guIFN1Y2NlZWQgdGhlIHF1ZXJ5LiAqLworICAgICAgICAgICAgVygiJXM6IENhbWVyYSAnJXMnIGlzIGFscmVhZHkgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9vayhxYywgIkNhbWVyYSBpcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFBhcmFtZXRlcnMgZG9uJ3QgbWF0Y2guIEZhaWwgdGhlIHF1ZXJ5LiAqLworICAgICAgICAgICAgRSgiJXM6IENhbWVyYSAnJXMnIGlzIGFscmVhZHkgc3RhcnRlZCwgYW5kIHBhcmFtZXRlcnMgZG9uJ3QgbWF0Y2g6XG4iCisgICAgICAgICAgICAgICJDdXJyZW50ICUuNHNbJWR4JWRdICE9IHJlcXVlc3RlZCAlLjRzWyVkeCVkXSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lLCAoY29uc3QgY2hhciopJmNjLT5waXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgIGNjLT53aWR0aCwgY2MtPmhlaWdodCwgKGNvbnN0IGNoYXIqKSZwaXhfZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywKKyAgICAgICAgICAgICAgICAiQ2FtZXJhIGlzIGFscmVhZHkgc3RhcnRlZCB3aXRoIGRpZmZlcmVudCBjYXB0dXJpbmcgcGFyYW1ldGVycyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFN0YXJ0IHRoZSBjYW1lcmEuCisgICAgICovCisKKyAgICAvKiBTYXZlIGNhcHR1cmluZyBwYXJhbWV0ZXJzLiAqLworICAgIGNjLT5waXhlbF9mb3JtYXQgPSBwaXhfZm9ybWF0OworICAgIGNjLT53aWR0aCA9IHdpZHRoOworICAgIGNjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgY2MtPnBpeGVsX251bSA9IGNjLT53aWR0aCAqIGNjLT5oZWlnaHQ7CisgICAgY2MtPmZyYW1lc19jYWNoZWQgPSAwOworCisgICAgLyogTWFrZSBzdXJlIHRoYXQgcGl4ZWwgZm9ybWF0IGlzIGtub3duLCBhbmQgY2FsY3VsYXRlIHZpZGVvIGZyYW1lYnVmZmVyCisgICAgICogc2l6ZSBhbG9uZyB0aGUgbGluZXMuICovCisgICAgaWYgKCFjYWxjdWxhdGVfdmlkZW9fZnJhbWVfc2l6ZShjYy0+cGl4ZWxfZm9ybWF0LCBjYy0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYy0+aGVpZ2h0LCAmY2MtPnZpZGVvX2ZyYW1lX3NpemUpKSB7CisgICAgICAgIEUoIiVzOiBVbmtub3duIHBpeGVsIGZvcm1hdCAlLjRzIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIChjaGFyKikmY2MtPnBpeGVsX2Zvcm1hdCk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIlBpeGVsIGZvcm1hdCBpcyB1bmtub3duIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgY29udmVydGVycyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBjYW1lcmEgcGl4ZWwKKyAgICAgKiBmb3JtYXQgYW5kIHRoZSBvbmUgdGhhdCB0aGUgY2xpZW50IGV4cGVjdHMuIEFsc28gYSBjb252ZXJ0ZXIgbXVzdCBleGlzdAorICAgICAqIGZvciB0aGUgcHJldmlldyB3aW5kb3cgcGl4ZWwgZm9ybWF0IChSR0IzMikgKi8KKyAgICBpZiAoIWhhc19jb252ZXJ0ZXIoY2MtPmNhbWVyYV9pbmZvLT5waXhlbF9mb3JtYXQsIGNjLT5waXhlbF9mb3JtYXQpIHx8CisgICAgICAgICFoYXNfY29udmVydGVyKGNjLT5jYW1lcmFfaW5mby0+cGl4ZWxfZm9ybWF0LCBWNEwyX1BJWF9GTVRfUkdCMzIpKSB7CisgICAgICAgIEUoIiVzOiBObyBjb252ZXJzaW9uIGV4aXN0IGJldHdlZW4gJS40cyBhbmQgJS40cyAob3IgUkdCMzIpIHBpeGVsIGZvcm1hdHMiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgKGNoYXIqKSZjYy0+Y2FtZXJhX2luZm8tPnBpeGVsX2Zvcm1hdCwgKGNoYXIqKSZjYy0+cGl4ZWxfZm9ybWF0KTsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X2tvKHFjLCAiTm8gY29udmVyc2lvbiBleGlzdCBmb3IgdGhlIHJlcXVlc3RlZCBwaXhlbCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFRPRE86IEF0IHRoZSBtb21lbnQgY2FtZXJhIGZyYW1ld29yayBpbiB0aGUgZW11bGF0b3IgcmVxdWlyZXMgUkdCMzIgcGl4ZWwKKyAgICAgKiBmb3JtYXQgZm9yIHByZXZpZXcgd2luZG93LiBTbywgd2UgbmVlZCB0byBrZWVwIHR3byBmcmFtZWJ1ZmZlcnMgaGVyZTogb25lCisgICAgICogZm9yIHRoZSB2aWRlbywgYW5kIGFub3RoZXIgZm9yIHRoZSBwcmV2aWV3IHdpbmRvdy4gV2F0Y2ggb3V0IHdoZW4gdGhpcworICAgICAqIGNoYW5nZXMgKGlmIGNoYW5nZXMpLiAqLworICAgIGNjLT5wcmV2aWV3X2ZyYW1lX3NpemUgPSBjYy0+cGl4ZWxfbnVtICogNDsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBib3RoLCB2aWRlbyBhbmQgcHJldmlldworICAgICAqIGZyYW1lYnVmZmVycy4gKi8KKyAgICBjYy0+dmlkZW9fZnJhbWUgPQorICAgICAgICAodWludDhfdCopbWFsbG9jKGNjLT52aWRlb19mcmFtZV9zaXplICsgY2MtPnByZXZpZXdfZnJhbWVfc2l6ZSk7CisgICAgaWYgKGNjLT52aWRlb19mcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIEUoIiVzOiBOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZnJhbWVidWZmZXJzICVkICsgJWQiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2MtPnZpZGVvX2ZyYW1lX3NpemUsIGNjLT5wcmV2aWV3X2ZyYW1lX3NpemUpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfa28ocWMsICJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTZXQgZnJhbWVidWZmZXIgcG9pbnRlcnMuICovCisgICAgY2MtPnByZXZpZXdfZnJhbWUgPSAodWludDE2X3QqKShjYy0+dmlkZW9fZnJhbWUgKyBjYy0+dmlkZW9fZnJhbWVfc2l6ZSk7CisKKyAgICAvKiBTdGFydCB0aGUgY2FtZXJhLiAqLworICAgIGlmIChjYW1lcmFfZGV2aWNlX3N0YXJ0X2NhcHR1cmluZyhjYy0+Y2FtZXJhLCBjYy0+Y2FtZXJhX2luZm8tPnBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2MtPndpZHRoLCBjYy0+aGVpZ2h0KSkgeworICAgICAgICBFKCIlczogQ2Fubm90IHN0YXJ0IGNhbWVyYSAnJXMnIGZvciAlLjRzWyVkeCVkXTogJXMiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lLCAoY29uc3QgY2hhciopJmNjLT5waXhlbF9mb3JtYXQsCisgICAgICAgICAgY2MtPndpZHRoLCBjYy0+aGVpZ2h0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBmcmVlKGNjLT52aWRlb19mcmFtZSk7CisgICAgICAgIGNjLT52aWRlb19mcmFtZSA9IE5VTEw7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkNhbm5vdCBzdGFydCB0aGUgY2FtZXJhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEKCIlczogQ2FtZXJhICclcycgaXMgbm93IHN0YXJ0ZWQgZm9yICUuNHNbJWR4JWRdIiwKKyAgICAgIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lLCAoY2hhciopJmNjLT5waXhlbF9mb3JtYXQsIGNjLT53aWR0aCwKKyAgICAgIGNjLT5oZWlnaHQpOworCisgICAgX3FlbXVfY2xpZW50X3JlcGx5X29rKHFjLCBOVUxMKTsKK30KKworLyogQ2xpZW50IGhhcyBxdWVyaWVkIHRoZSBjbGllbnQgdG8gc3RvcCBjYXB0dXJpbmcgdmlkZW8uCisgKiBQYXJhbToKKyAqICBjYyAtIFF1ZXJpZWQgY2FtZXJhIGNsaWVudCBkZXNjcmlwdG9yLgorICogIHFjIC0gUWVtdSBjbGllbnQgZm9yIHRoZSBlbXVsYXRlZCBjYW1lcmEuCisgKiAgcGFyYW0gLSBRdWVyeSBwYXJhbWV0ZXJzLiBUaGVyZSBhcmUgbm8gcGFyYW1ldGVycyBleHBlY3RlZCBmb3IgdGhpcyBxdWVyeS4KKyAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfY2xpZW50X3F1ZXJ5X3N0b3AoQ2FtZXJhQ2xpZW50KiBjYywgUWVtdWRDbGllbnQqIHFjLCBjb25zdCBjaGFyKiBwYXJhbSkKK3sKKyAgICBpZiAoY2MtPnZpZGVvX2ZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgLyogTm90IHN0YXJ0ZWQuICovCisgICAgICAgIFcoIiVzOiBDYW1lcmEgJyVzJyBpcyBub3Qgc3RhcnRlZCIsIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lKTsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X29rKHFjLCAiQ2FtZXJhIGlzIG5vdCBzdGFydGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBTdG9wIHRoZSBjYW1lcmEuICovCisgICAgaWYgKGNhbWVyYV9kZXZpY2Vfc3RvcF9jYXB0dXJpbmcoY2MtPmNhbWVyYSkpIHsKKyAgICAgICAgRSgiJXM6IENhbm5vdCBzdG9wIGNhbWVyYSBkZXZpY2UgJyVzJzogJXMiLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2MtPmRldmljZV9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfa28ocWMsICJDYW5ub3Qgc3RvcCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmVlKGNjLT52aWRlb19mcmFtZSk7CisgICAgY2MtPnZpZGVvX2ZyYW1lID0gTlVMTDsKKworICAgIEQoIiVzOiBDYW1lcmEgZGV2aWNlICclcycgaXMgbm93IHN0b3BwZWQuIiwgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUpOworICAgIF9xZW11X2NsaWVudF9yZXBseV9vayhxYywgTlVMTCk7Cit9CisKKy8qIENsaWVudCBoYXMgcXVlcmllZCBuZXh0IGZyYW1lLgorICogUGFyYW06CisgKiAgY2MgLSBRdWVyaWVkIGNhbWVyYSBjbGllbnQgZGVzY3JpcHRvci4KKyAqICBxYyAtIFFlbXUgY2xpZW50IGZvciB0aGUgZW11bGF0ZWQgY2FtZXJhLgorICogIHBhcmFtIC0gUXVlcnkgcGFyYW1ldGVycy4gUGFyYW1ldGVycyBmb3IgdGhpcyBxdWVyeSBhcmUgZm9ybWF0dGVkIGFzIHN1Y2g6CisgKiAgICAgICAgICB2aWRlbz08c2l6ZT4gcHJldmlldz08c2l6ZT4gd2hpdGViPTxyZWQ+LDxncmVlbj4sPGJsdWU+IGV4cGNvbXA9PGNvbXA+CisgKiAgICAgIHdoZXJlOgorICogICAgICAgLSAndmlkZW8nLCBhbmQgJ3ByZXZpZXcnIGJvdGggbXVzdCBiZSBkZWNpbWFsIHZhbHVlcywgZGVmaW5pbmcgc2l6ZSBvZgorICogICAgICAgICByZXF1ZXN0ZWQgdmlkZW8sIGFuZCBwcmV2aWV3IGZyYW1lcyByZXNwZWN0aXZlbHkuIFplcm8gdmFsdWUgZm9yIGFueQorICogICAgICAgICBvZiB0aGVzZSBwYXJhbWV0ZXJzIG1lYW5zIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGZyYW1lIGlzIG5vdCByZXF1ZXN0ZWQuCisgKiAgICAgICAtIHdoaXRlYiBjb250YWlucyBmbG9hdCB2YWx1ZXMgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHdoaWx0ZSBiYWxhbmNlLgorICogICAgICAgLSBleHBjb21wIGNvbnRhaW5zIGEgZmxvYXQgdmFsdWUgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIGV4cG9zdXJlCisgKiAgICAgICAgIGNvbXBlbnNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfY2xpZW50X3F1ZXJ5X2ZyYW1lKENhbWVyYUNsaWVudCogY2MsIFFlbXVkQ2xpZW50KiBxYywgY29uc3QgY2hhciogcGFyYW0pCit7CisgICAgaW50IHZpZGVvX3NpemUgPSAwOworICAgIGludCBwcmV2aWV3X3NpemUgPSAwOworICAgIGludCByZXBlYXQ7CisgICAgQ2xpZW50RnJhbWVCdWZmZXIgZmJzWzJdOworICAgIGludCBmYnNfbnVtID0gMDsKKyAgICBzaXplX3QgcGF5bG9hZF9zaXplOworICAgIHVpbnQ2NF90IHRpY2s7CisgICAgZmxvYXQgcl9zY2FsZSA9IDEuMGYsIGdfc2NhbGUgPSAxLjBmLCBiX3NjYWxlID0gMS4wZiwgZXhwX2NvbXAgPSAxLjBmOworICAgIGNoYXIgdG1wWzI1Nl07CisKKyAgICAvKiBTYW5pdHkgY2hlY2suICovCisgICAgaWYgKGNjLT52aWRlb19mcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vdCBzdGFydGVkLiAqLworICAgICAgICBFKCIlczogQ2FtZXJhICclcycgaXMgbm90IHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkNhbWVyYSBpcyBub3Qgc3RhcnRlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUHVsbCByZXF1aXJlZCBwYXJhbWV0ZXJzLiAqLworICAgIGlmIChnZXRfdG9rZW5fdmFsdWVfaW50KHBhcmFtLCAidmlkZW8iLCAmdmlkZW9fc2l6ZSkgfHwKKyAgICAgICAgZ2V0X3Rva2VuX3ZhbHVlX2ludChwYXJhbSwgInByZXZpZXciLCAmcHJldmlld19zaXplKSkgeworICAgICAgICBFKCIlczogSW52YWxpZCBvciBtaXNzaW5nICd2aWRlbycsIG9yICdwcmV2aWV3JyBwYXJhbWV0ZXIgaW4gJyVzJyIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBwYXJhbSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywKKyAgICAgICAgICAgICJJbnZhbGlkIG9yIG1pc3NpbmcgJ3ZpZGVvJywgb3IgJ3ByZXZpZXcnIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogUHVsbCB3aGl0ZSBiYWxhbmNlIHZhbHVlcy4gKi8KKyAgICBpZiAoIWdldF90b2tlbl92YWx1ZShwYXJhbSwgIndoaXRlYiIsIHRtcCwgc2l6ZW9mKHRtcCkpKSB7CisgICAgICAgIGlmIChzc2NhbmYodG1wLCAiJWcsJWcsJWciLCAmcl9zY2FsZSwgJmdfc2NhbGUsICZiX3NjYWxlKSAhPSAzKSB7CisgICAgICAgICAgICBEKCJJbnZhbGlkIHZhbHVlICclcycgZm9yIHBhcmFtZXRlciAnd2hpdGViJyIsIHRtcCk7CisgICAgICAgICAgICByX3NjYWxlID0gZ19zY2FsZSA9IGJfc2NhbGUgPSAxLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUHVsbCBleHBvc3VyZSBjb21wZW5zYXRpb24uICovCisgICAgaWYgKCFnZXRfdG9rZW5fdmFsdWUocGFyYW0sICJleHBjb21wIiwgdG1wLCBzaXplb2YodG1wKSkpIHsKKyAgICAgICAgaWYgKHNzY2FuZih0bXAsICIlZyIsICZleHBfY29tcCkgIT0gMSkgeworICAgICAgICAgICAgRCgiSW52YWxpZCB2YWx1ZSAnJXMnIGZvciBwYXJhbWV0ZXIgJ3doaXRlYiciLCB0bXApOworICAgICAgICAgICAgZXhwX2NvbXAgPSAxLjBmOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVmVyaWZ5IHRoYXQgZnJhbWVidWZmZXIgc2l6ZXMgbWF0Y2ggdGhlIG9uZXMgdGhhdCB0aGUgc3RhcnRlZCBjYW1lcmEKKyAgICAgKiBvcGVyYXRlcyB3aXRoLiAqLworICAgIGlmICgodmlkZW9fc2l6ZSAhPSAwICYmIGNjLT52aWRlb19mcmFtZV9zaXplICE9IChzaXplX3QpdmlkZW9fc2l6ZSkgfHwKKyAgICAgICAgKHByZXZpZXdfc2l6ZSAhPSAwICYmIGNjLT5wcmV2aWV3X2ZyYW1lX3NpemUgIT0gKHNpemVfdClwcmV2aWV3X3NpemUpKSB7CisgICAgICAgIEUoIiVzOiBGcmFtZSBzaXplcyBkb24ndCBtYXRjaCBmb3IgY2FtZXJhICclcyc6XG4iCisgICAgICAgICAgIkV4cGVjdGVkICVkIGZvciB2aWRlbywgYW5kICVkIGZvciBwcmV2aWV3LiBSZXF1ZXN0ZWQgJWQsIGFuZCAlZCIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUsIGNjLT52aWRlb19mcmFtZV9zaXplLAorICAgICAgICAgIGNjLT5wcmV2aWV3X2ZyYW1lX3NpemUsIHZpZGVvX3NpemUsIHByZXZpZXdfc2l6ZSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgIkZyYW1lIHNpemUgbWlzbWF0Y2giKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBmcmFtZWJ1ZmZlciBhcnJheSBmb3IgZnJhbWUgcmVhZC4KKyAgICAgKi8KKworICAgIGlmICh2aWRlb19zaXplKSB7CisgICAgICAgIGZic1tmYnNfbnVtXS5waXhlbF9mb3JtYXQgPSBjYy0+cGl4ZWxfZm9ybWF0OworICAgICAgICBmYnNbZmJzX251bV0uZnJhbWVidWZmZXIgPSBjYy0+dmlkZW9fZnJhbWU7CisgICAgICAgIGZic19udW0rKzsKKyAgICB9CisgICAgaWYgKHByZXZpZXdfc2l6ZSkgeworICAgICAgICAvKiBUT0RPOiBXYXRjaCBvdXQgZm9yIHByZXZpZXcgZm9ybWF0IGNoYW5nZXMhICovCisgICAgICAgIGZic1tmYnNfbnVtXS5waXhlbF9mb3JtYXQgPSBWNEwyX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIGZic1tmYnNfbnVtXS5mcmFtZWJ1ZmZlciA9IGNjLT5wcmV2aWV3X2ZyYW1lOworICAgICAgICBmYnNfbnVtKys7CisgICAgfQorCisgICAgLyogQ2FwdHVyZSBuZXcgZnJhbWUuICovCisgICAgdGljayA9IF9nZXRfdGltZXN0YW1wKCk7CisgICAgcmVwZWF0ID0gY2FtZXJhX2RldmljZV9yZWFkX2ZyYW1lKGNjLT5jYW1lcmEsIGZicywgZmJzX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworCisgICAgLyogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIChrbm93bikgd2F5IGhvdyB0byB3YWl0IG9uIG5leHQgZnJhbWUgYmVpbmcKKyAgICAgKiBhdmFpbGFibGUsIHNvIHdlIGNvdWxkIGRlcXVldWUgZnJhbWUgYnVmZmVyIGZyb20gdGhlIGRldmljZSBvbmx5IHdoZW4gd2UKKyAgICAgKiBrbm93IGl0J3MgYXZhaWxhYmxlLiBJbnN0ZWFkIHdlJ3JlIHNob290aW5nIGluIHRoZSBkYXJrLCBhbmQgcXVpdGUgb2Z0ZW4KKyAgICAgKiBkZXZpY2Ugd2lsbCByZXNwb25zZSB3aXRoIEVBR0FJTiwgaW5kaWNhdGluZyB0aGF0IGl0IGRvZXNuJ3QgaGF2ZSBmcmFtZQorICAgICAqIHJlYWR5LiBJbiB0dXJuLCBpdCBtZWFucyB0aGF0IHRoZSBsYXN0IGZyYW1lIHdlIGhhdmUgb2J0YWluZWQgZnJvbSB0aGUKKyAgICAgKiBkZXZpY2UgaXMgc3RpbGwgZ29vZCwgYW5kIHdlIGNhbiByZXBseSB3aXRoIHRoZSBjYWNoZWQgZnJhbWVzLiBUaGUgb25seQorICAgICAqIGNhc2Ugd2hlbiB3ZSBuZWVkIHRvIGtlZXAgdHJ5aW5nIHRvIG9idGFpbiBhIG5ldyBmcmFtZSBpcyB3aGVuIGZyYW1lIGNhY2hlCisgICAgICogaXMgZW1wdHkuIFRvIHByZXZlbnQgb3Vyc2VsdmVzIGZyb20gYW4gaW5kZWZpbml0ZSBsb29wIGluIGNhc2UgZGV2aWNlIGdvdAorICAgICAqIHN0dWNrIG9uIHNvbWV0aGluZyAob2JzZXJ2ZWQgd2l0aCBzb21lIE1pY3Jvc29mdCBkZXZpY2VzKSB3ZSB3aWxsIGxpbWl0CisgICAgICogdGhlIGxvb3AgYnkgMiBzZWNvbmQgdGltZSBwZXJpb2QgKHdoaWNoIGlzIG1vcmUgdGhhbiBlbm91Z2ggdG8gb2J0YWluCisgICAgICogc29tZXRoaW5nIGZyb20gdGhlIGRldmljZSkgKi8KKyAgICB3aGlsZSAocmVwZWF0ID09IDEgJiYgIWNjLT5mcmFtZXNfY2FjaGVkICYmCisgICAgICAgICAgIChfZ2V0X3RpbWVzdGFtcCgpIC0gdGljaykgPCAyMDAwMDAwTEwpIHsKKyAgICAgICAgLyogU2xlZXAgZm9yIDEwIG1pbGxpc2VjIGJlZm9yZSByZXBlYXRpbmcgdGhlIGF0dGVtcHQuICovCisgICAgICAgIF9jYW1lcmFfc2xlZXAoMTApOworICAgICAgICByZXBlYXQgPSBjYW1lcmFfZGV2aWNlX3JlYWRfZnJhbWUoY2MtPmNhbWVyYSwgZmJzLCBmYnNfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9zY2FsZSwgZ19zY2FsZSwgYl9zY2FsZSwgZXhwX2NvbXApOworICAgIH0KKyAgICBpZiAocmVwZWF0ID09IDEgJiYgIWNjLT5mcmFtZXNfY2FjaGVkKSB7CisgICAgICAgIC8qIFdhaXRlZCB0b28gbG9uZyBmb3IgdGhlIGZpcnN0IGZyYW1lLiAqLworICAgICAgICBFKCIlczogVW5hYmxlIHRvIG9idGFpbiBmaXJzdCB2aWRlbyBmcmFtZSBmcm9tIHRoZSBjYW1lcmEgJyVzJyBpbiAlZCBtaWxsaXNlY29uZHM6ICVzLiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUsCisgICAgICAgICAgKHVpbnQzMl90KShfZ2V0X3RpbWVzdGFtcCgpIC0gdGljaykgLyAxMDAwLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBfcWVtdV9jbGllbnRfcmVwbHlfa28ocWMsICJVbmFibGUgdG8gb2J0YWluIHZpZGVvIGZyYW1lIGZyb20gdGhlIGNhbWVyYSIpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChyZXBlYXQgPCAwKSB7CisgICAgICAgIC8qIEFuIEkvTyBlcnJvci4gKi8KKyAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBvYnRhaW4gdmlkZW8gZnJhbWUgZnJvbSB0aGUgY2FtZXJhICclcyc6ICVzLiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBjYy0+ZGV2aWNlX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhxYywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIGhhdmUgY2FjaGVkIHNvbWV0aGluZy4uLiAqLworICAgIGNjLT5mcmFtZXNfY2FjaGVkID0gMTsKKworICAgIC8qCisgICAgICogQnVpbGQgdGhlIHJlcGx5LgorICAgICAqLworCisgICAgLyogUGF5bG9hZCBpbmNsdWRlcyAib2s6IiArIHJlcXVlc3RlZCB2aWRlbyBhbmQgcHJldmlldyBmcmFtZXMuICovCisgICAgcGF5bG9hZF9zaXplID0gMyArIHZpZGVvX3NpemUgKyBwcmV2aWV3X3NpemU7CisKKyAgICAvKiBTZW5kIHBheWxvYWQgc2l6ZSBmaXJzdC4gKi8KKyAgICBfcWVtdV9jbGllbnRfcmVwbHlfcGF5bG9hZChxYywgcGF5bG9hZF9zaXplKTsKKworICAgIC8qIEFmdGVyIHRoYXQgc2VuZCB0aGUgJ29rOicuIE5vdGUgdGhhdCBpZiB0aGVyZSBpcyBubyBmcmFtZXMgc2VudCwgd2Ugc2hvdWxkCisgICAgICogdXNlIHByZWZpeCAib2siIGluc3RlYWQgb2YgIm9rOiIgKi8KKyAgICBpZiAodmlkZW9fc2l6ZSB8fCBwcmV2aWV3X3NpemUpIHsKKyAgICAgICAgcWVtdWRfY2xpZW50X3NlbmQocWMsIChjb25zdCB1aW50OF90Kikib2s6IiwgMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU3RpbGwgMyBieXRlczogemVybyB0ZXJtaW5hdG9yIGlzIHJlcXVpcmVkIGluIHRoaXMgY2FzZS4gKi8KKyAgICAgICAgcWVtdWRfY2xpZW50X3NlbmQocWMsIChjb25zdCB1aW50OF90Kikib2siLCAzKTsKKyAgICB9CisKKyAgICAvKiBBZnRlciB0aGF0IHNlbmQgdmlkZW8gZnJhbWUgKGlmIHJlcXVlc3RlZCkuICovCisgICAgaWYgKHZpZGVvX3NpemUpIHsKKyAgICAgICAgcWVtdWRfY2xpZW50X3NlbmQocWMsIGNjLT52aWRlb19mcmFtZSwgdmlkZW9fc2l6ZSk7CisgICAgfQorCisgICAgLyogQWZ0ZXIgdGhhdCBzZW5kIHByZXZpZXcgZnJhbWUgKGlmIHJlcXVlc3RlZCkuICovCisgICAgaWYgKHByZXZpZXdfc2l6ZSkgeworICAgICAgICBxZW11ZF9jbGllbnRfc2VuZChxYywgKGNvbnN0IHVpbnQ4X3QqKWNjLT5wcmV2aWV3X2ZyYW1lLCBwcmV2aWV3X3NpemUpOworICAgIH0KK30KKworLyogSGFuZGxlcyBhIG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgZW11bGF0ZWQgY2FtZXJhIGNsaWVudC4KKyAqIFF1ZXJpZXMgcmVjZWl2ZWQgaGVyZSBhcmUgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKKyAqIC0gJ2Nvbm5lY3QnIC0gQ29ubmVjdHMgdG8gdGhlIGNhbWVyYSBkZXZpY2UgKG9wZW5zIGl0KS4KKyAqIC0gJ2Rpc2Nvbm5lY3QnIC0gRGlzY29ubmV4dHMgZnJvbSB0aGUgY2FtZXJhIGRldmljZSAoY2xvc2VzIGl0KS4KKyAqIC0gJ3N0YXJ0JyAtIFN0YXJ0cyBjYXB0dXJpbmcgdmlkZW8gZnJvbSB0aGUgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2UuCisgKiAtICdzdG9wJyAtIFN0b3AgY2FwdHVyaW5nIHZpZGVvIGZyb20gdGhlIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlLgorICogLSAnZnJhbWUnIC0gUXVlcmllcyB2aWRlbyBhbmQgcHJldmlldyBmcmFtZXMgY2FwdHVyZWQgZnJvbSB0aGUgY2FtZXJhLgorICogUGFyYW06CisgKiAgb3BhcXVlIC0gQ2FtZXJhIHNlcnZpY2UgZGVzY3JpcHRvci4KKyAqICBtc2csIG1zZ2xlbiAtIE1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGUgY2FtZXJhIGZhY3RvcnkgY2xpZW50LgorICogIGNsaWVudCAtIENhbWVyYSBmYWN0b3J5IGNsaWVudCBwaXBlLgorICovCitzdGF0aWMgdm9pZAorX2NhbWVyYV9jbGllbnRfcmVjdih2b2lkKiAgICAgICAgIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgbXNnbGVuLAorICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudCogIGNsaWVudCkKK3sKKyAgICAvKgorICAgICAqIEVtdWxhdGVkIGNhbWVyYSBjbGllbnQgcXVlcmllcy4KKyAgICAgKi8KKyAgICBDYW1lcmFDbGllbnQqIGNjID0gKENhbWVyYUNsaWVudCopb3BhcXVlOworCisgICAgaWYgKG1zZ2xlbiA8PSAwKSB7CisgICAgICAgIEQoIiVzOiBxdWVyeSBtZXNzYWdlIGhhcyBpbnZhbGlkIGxlbmd0aCAlZCIsIF9fZnVuY19fLCBtc2dsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGNjLT5jb21tYW5kX2J1ZmZlcl9vZmZzZXQgKyBtc2dsZW4gPj0gTUFYX1FVRVJZX01FU1NBR0VfU0laRSkgeworICAgICAgICBFKCIlczogY29tbWFuZCBidWZmZXIgb3ZlcmZsb3dlZDogZXhpc3RpbmcgYnVmZmVyLXNpemUgJWQgbmVlZGVkICVkXG4iLAorICAgICAgICAgICAgICAgIE1BWF9RVUVSWV9NRVNTQUdFX1NJWkUsIGNjLT5jb21tYW5kX2J1ZmZlcl9vZmZzZXQgKyBtc2dsZW4pOworICAgICAgICBjYy0+Y29tbWFuZF9idWZmZXJfb2Zmc2V0ID0gMDsKKyAgICAgICAgX3FlbXVfY2xpZW50X3JlcGx5X2tvKGNsaWVudCwgInF1ZXJ5IHRvbyBsb25nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KGNjLT5jb21tYW5kX2J1ZmZlciArIGNjLT5jb21tYW5kX2J1ZmZlcl9vZmZzZXQsIG1zZywgbXNnbGVuKTsKKyAgICBjYy0+Y29tbWFuZF9idWZmZXJfb2Zmc2V0ICs9IG1zZ2xlbjsKKworICAgIGlmIChjYy0+Y29tbWFuZF9idWZmZXJbY2MtPmNvbW1hbmRfYnVmZmVyX29mZnNldCAtIDFdICE9ICdcMCcpIHsKKyAgICAgICAgRCgiJXM6IGltY29tcGxldGUgcXVlcnkiLCBfX2Z1bmNfXyk7CisgICAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIGNvbW1hbmQsIGFuZCB3ZSBleHBlY3QgX2NhbWVyYV9jbGllbnRfcmVjdiB0byBiZSBpbnZva2VkIGFnYWluCisgICAgICAgICAgIHdpdGggdGhlIG5leHQgc2VnbWVudCBvZiB0aGUgY29tbWFuZCAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1zZyA9ICh1aW50OF90KikoY2MtPmNvbW1hbmRfYnVmZmVyKTsKKyAgICBjYy0+Y29tbWFuZF9idWZmZXJfb2Zmc2V0ID0gMDsKKyAgICAvKiBFKCIlczogcXVlcnkgaXMgJyVzJ1xuIiwgX19mdW5jX18sIG1zZyk7ICovCisgICAgLyogQ29ubmVjdCB0byB0aGUgY2FtZXJhLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyIF9xdWVyeV9jb25uZWN0W10gICAgPSAiY29ubmVjdCI7CisgICAgLyogRGlzY29ubmVjdCBmcm9tIHRoZSBjYW1lcmEuICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgX3F1ZXJ5X2Rpc2Nvbm5lY3RbXSA9ICJkaXNjb25uZWN0IjsKKyAgICAvKiBTdGFydCB2aWRlbyBjYXB0dXJpbmcuICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgX3F1ZXJ5X3N0YXJ0W10gICAgICA9ICJzdGFydCI7CisgICAgLyogU3RvcCB2aWRlbyBjYXB0dXJpbmcuICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgX3F1ZXJ5X3N0b3BbXSAgICAgICA9ICJzdG9wIjsKKyAgICAvKiBRdWVyeSBmcmFtZShzKS4gKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBfcXVlcnlfZnJhbWVbXSAgICAgID0gImZyYW1lIjsKKworICAgIGNoYXIgcXVlcnlfbmFtZVs2NF07CisgICAgY29uc3QgY2hhciogcXVlcnlfcGFyYW0gPSBOVUxMOworCisgICAgLyoKKyAgICAgKiBFbXVsYXRlZCBjYW1lcmEgcXVlcmllcyBhcmUgZm9ybWF0dGVkIGFzIHN1Y2g6CisgICAgICogICI8cXVlcnkgbmFtZT4gWzxwYXJhbWV0ZXJzPl0iCisgICAgICovCisKKyAgICBUKCIlczogQ2FtZXJhIGNsaWVudCBxdWVyeTogJyVzJyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKW1zZyk7CisgICAgaWYgKF9wYXJzZV9xdWVyeSgoY29uc3QgY2hhciopbXNnLCBxdWVyeV9uYW1lLCBzaXplb2YocXVlcnlfbmFtZSksCisgICAgICAgICZxdWVyeV9wYXJhbSkpIHsKKyAgICAgICAgRSgiJXM6IEludmFsaWQgcXVlcnkgJyVzJyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKW1zZyk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhjbGllbnQsICJJbnZhbGlkIHF1ZXJ5Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEaXNwYXRjaCB0aGUgcXVlcnkgdG8gYW4gYXBwcm9wcmlhdGUgaGFuZGxlci4gKi8KKyAgICBpZiAoIXN0cmNtcChxdWVyeV9uYW1lLCBfcXVlcnlfZnJhbWUpKSB7CisgICAgICAgIC8qIEEgZnJhbWUgaXMgcXVlcmllZC4gKi8KKyAgICAgICAgX2NhbWVyYV9jbGllbnRfcXVlcnlfZnJhbWUoY2MsIGNsaWVudCwgcXVlcnlfcGFyYW0pOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChxdWVyeV9uYW1lLCBfcXVlcnlfY29ubmVjdCkpIHsKKyAgICAgICAgLyogQ2FtZXJhIGNvbm5lY3Rpb24gaXMgcXVlcmllZC4gKi8KKyAgICAgICAgX2NhbWVyYV9jbGllbnRfcXVlcnlfY29ubmVjdChjYywgY2xpZW50LCBxdWVyeV9wYXJhbSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKHF1ZXJ5X25hbWUsIF9xdWVyeV9kaXNjb25uZWN0KSkgeworICAgICAgICAvKiBDYW1lcmEgZGlzbmVjdGlvbiBpcyBxdWVyaWVkLiAqLworICAgICAgICBfY2FtZXJhX2NsaWVudF9xdWVyeV9kaXNjb25uZWN0KGNjLCBjbGllbnQsIHF1ZXJ5X3BhcmFtKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAocXVlcnlfbmFtZSwgX3F1ZXJ5X3N0YXJ0KSkgeworICAgICAgICAvKiBTdGFydCBjYXB0dXJpbmcgaXMgcXVlcmllZC4gKi8KKyAgICAgICAgX2NhbWVyYV9jbGllbnRfcXVlcnlfc3RhcnQoY2MsIGNsaWVudCwgcXVlcnlfcGFyYW0pOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChxdWVyeV9uYW1lLCBfcXVlcnlfc3RvcCkpIHsKKyAgICAgICAgLyogU3RvcCBjYXB0dXJpbmcgaXMgcXVlcmllZC4gKi8KKyAgICAgICAgX2NhbWVyYV9jbGllbnRfcXVlcnlfc3RvcChjYywgY2xpZW50LCBxdWVyeV9wYXJhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRSgiJXM6IFVua25vd24gcXVlcnkgJyVzJyIsIF9fRlVOQ1RJT05fXywgKGNoYXIqKW1zZyk7CisgICAgICAgIF9xZW11X2NsaWVudF9yZXBseV9rbyhjbGllbnQsICJVbmtub3duIHF1ZXJ5Iik7CisgICAgfQorfQorCisvKiBFbXVsYXRlZCBjYW1lcmEgY2xpZW50IGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzZXJ2aWNlLiAqLworc3RhdGljIHZvaWQKK19jYW1lcmFfY2xpZW50X2Nsb3NlKHZvaWQqIG9wYXF1ZSkKK3sKKyAgICBDYW1lcmFDbGllbnQqIGNjID0gKENhbWVyYUNsaWVudCopb3BhcXVlOworCisgICAgRCgiJXM6IENhbWVyYSBjbGllbnQgZm9yIGRldmljZSAnJXMnIG9uIGlucHV0IGNoYW5uZWwgJWQgaXMgbm93IGNsb3NlZCIsCisgICAgICBfX0ZVTkNUSU9OX18sIGNjLT5kZXZpY2VfbmFtZSwgY2MtPmlucF9jaGFubmVsKTsKKworICAgIF9jYW1lcmFfY2xpZW50X2ZyZWUoY2MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENhbWVyYSBzZXJ2aWNlIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbm5lY3RzIGEgY2xpZW50IHRvIHRoZSBjYW1lcmEgc2VydmljZS4KKyAqIFRoZXJlIGFyZSB0d28gY2xhc3NlcyBvZiB0aGUgY2xpZW50IHRoYXQgY2FuIGNvbm5lY3QgdG8gdGhlIHNlcnZpY2U6CisgKiAgLSBDYW1lcmEgZmFjdG9yeSB0aGF0IGlzIGluc3RlcmVzdGVkIG9ubHkgaW4gbGlzdGluZyBjYW1lcmEgZGV2aWNlcyBhdHRhY2hlZAorICogICAgdG8gdGhlIGhvc3QuCisgKiAgLSBDYW1lcmEgZGV2aWNlIGVtdWxhdG9ycyB0aGF0IGF0dGFjaCB0byB0aGUgYWN0dWFsIGNhbWVyYSBkZXZpY2VzLgorICogVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlc2UgdHdvIGNsYXNzZXMgaXMgbWFkZSBieSBsb29raW5nIGF0IGV4dHJhCisgKiBwYXJhbWV0ZXJzIHBhc3NlZCBpbiBjbGllbnRfcGFyYW0gdmFyaWFibGUuIElmIGl0J3MgTlVMTCwgb3IgZW1wdHksIHRoZSBjbGllbnQKKyAqIGNvbm5lY3RzIHRvIGEgY2FtZXJhIGZhY3RvcnkuIE90aGVyd2lzZSwgcGFyYW1ldGVycyBkZXNjcmliZSB0aGUgY2FtZXJhIGRldmljZQorICogdGhlIGNsaWVudCB3YW50cyB0byBjb25uZWN0IHRvLgorICovCitzdGF0aWMgUWVtdWRDbGllbnQqCitfY2FtZXJhX3NlcnZpY2VfY29ubmVjdCh2b2lkKiAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2UqICBzZXJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIGNsaWVudF9wYXJhbSkKK3sKKyAgICBRZW11ZENsaWVudCogIGNsaWVudCA9IE5VTEw7CisgICAgQ2FtZXJhU2VydmljZURlc2MqIGNzZCA9IChDYW1lcmFTZXJ2aWNlRGVzYyopb3BhcXVlOworCisgICAgRCgiJXM6IENvbm5lY3RpbmcgY2FtZXJhIGNsaWVudCAnJXMnIiwKKyAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50X3BhcmFtID8gY2xpZW50X3BhcmFtIDogIkZhY3RvcnkiKTsKKyAgICBpZiAoY2xpZW50X3BhcmFtID09IE5VTEwgfHwgKmNsaWVudF9wYXJhbSA9PSAnXDAnKSB7CisgICAgICAgIC8qIFRoaXMgaXMgYW4gZW11bGF0ZWQgY2FtZXJhIGZhY3RvcnkgY2xpZW50LiAqLworICAgICAgICBjbGllbnQgPSBxZW11ZF9jbGllbnRfbmV3KHNlcnYsIGNoYW5uZWwsIGNsaWVudF9wYXJhbSwgY3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mYWN0b3J5X2NsaWVudF9yZWN2LCBfZmFjdG9yeV9jbGllbnRfY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhpcyBpcyBhbiBlbXVsYXRlZCBjYW1lcmEgY2xpZW50LiAqLworICAgICAgICBDYW1lcmFDbGllbnQqIGNjID0gX2NhbWVyYV9jbGllbnRfY3JlYXRlKGNzZCwgY2xpZW50X3BhcmFtKTsKKyAgICAgICAgaWYgKGNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsaWVudCA9IHFlbXVkX2NsaWVudF9uZXcoc2VydiwgY2hhbm5lbCwgY2xpZW50X3BhcmFtLCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NhbWVyYV9jbGllbnRfcmVjdiwgX2NhbWVyYV9jbGllbnRfY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNsaWVudDsKK30KKworI2lmZGVmIF9XSU4zMgorZXh0ZXJuIGludCB3aW5kb3dzX2NhbWVyYV90aHJlYWRfaW5pdCgpOworI2VuZGlmCisKK3ZvaWQgYW5kcm9pZF9jYW1lcmFfc2VydmljZV9pbml0KHZvaWQpIHsKKyAgICBzdGF0aWMgaW50IF9pbml0ZWQgPSAwOworCisgICAgaWYgKCFfaW5pdGVkKSB7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgLy8gRm9yIFdpbmRvd3MsIGluaXRpYWxpemUgYSBzZXBhcmF0ZSBjYW1lcmEgdGhyZWFkLgorICAgICAgICB3aW5kb3dzX2NhbWVyYV90aHJlYWRfaW5pdCgpOworI2VuZGlmCisgICAgICAgIF9jYW1lcmFfc2VydmljZV9pbml0KCZfY2FtZXJhX3NlcnZpY2VfZGVzYyk7CisgICAgICAgIFFlbXVkU2VydmljZSogIHNlcnYgPSBxZW11ZF9zZXJ2aWNlX3JlZ2lzdGVyKCBTRVJWSUNFX05BTUUsIDAsCisgICAgICAgICAgICAgICAgJl9jYW1lcmFfc2VydmljZV9kZXNjLAorICAgICAgICAgICAgICAgIF9jYW1lcmFfc2VydmljZV9jb25uZWN0LAorICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoc2VydiA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZXJyb3IoIiVzOiBDb3VsZCBub3QgcmVnaXN0ZXIgJyVzJyBzZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBTRVJWSUNFX05BTUUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cmNtcChhbmRyb2lkX2h3LT5od19jYW1lcmFfYmFjaywgImVtdWxhdGVkIikgJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAoYW5kcm9pZF9ody0+aHdfY2FtZXJhX2Zyb250LCAiZW11bGF0ZWQiKSkgeworICAgICAgICAgICAgLyogRmFrZSBjYW1lcmEgaXMgbm90IHVzZWQgZm9yIGNhbWVyYSBlbXVsYXRpb24uICovCisgICAgICAgICAgICBib290X3Byb3BlcnR5X2FkZCgicWVtdS5zZi5mYWtlX2NhbWVyYSIsICJub25lIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZighc3RyY21wKGFuZHJvaWRfaHctPmh3X2NhbWVyYV9iYWNrLCAiZW11bGF0ZWQiKSAmJgorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGFuZHJvaWRfaHctPmh3X2NhbWVyYV9mcm9udCwgImVtdWxhdGVkIikpIHsKKyAgICAgICAgICAgICAgICAvKiBGYWtlIGNhbWVyYSBpcyB1c2VkIGZvciBib3RoLCBmcm9udCBhbmQgYmFjayBjYW1lcmEgZW11bGF0aW9uLiAqLworICAgICAgICAgICAgICAgIGJvb3RfcHJvcGVydHlfYWRkKCJxZW11LnNmLmZha2VfY2FtZXJhIiwgImJvdGgiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhbmRyb2lkX2h3LT5od19jYW1lcmFfYmFjaywgImVtdWxhdGVkIikpIHsKKyAgICAgICAgICAgICAgICBib290X3Byb3BlcnR5X2FkZCgicWVtdS5zZi5mYWtlX2NhbWVyYSIsICJiYWNrIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb3RfcHJvcGVydHlfYWRkKCJxZW11LnNmLmZha2VfY2FtZXJhIiwgImZyb250Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBEKCIlczogUmVnaXN0ZXJlZCAnJXMnIHFlbXVkIHNlcnZpY2UiLCBfX0ZVTkNUSU9OX18sIFNFUlZJQ0VfTkFNRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtc2VydmljZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NhbWVyYS9jYW1lcmEtc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTBjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS1zZXJ2aWNlLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisvKgorICogQ29udGFpbnMgcHVibGljIGNhbWVyYSBzZXJ2aWNlIEFQSS4KKyAqLworCisvKiBJbml0aWFsaXplcyBjYW1lcmEgZW11bGF0aW9uIHNlcnZpY2Ugb3ZlciBxZW11IHBpcGUuICovCitleHRlcm4gdm9pZCBhbmRyb2lkX2NhbWVyYV9zZXJ2aWNlX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS13aW4uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NmU1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2FtZXJhL2NhbWVyYS13aW4uaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKy8qCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbWlzc2luZyBpbiBub24tTGludXggaGVhZGVycy4KKyAqLworCisvKiAgRm91ci1jaGFyYWN0ZXItY29kZSAoRk9VUkNDKSAqLworI2RlZmluZSB2NGwyX2ZvdXJjYyhhLGIsYyxkKVwKKyAgICAoKCh1aW50MzJfdCkoYSk8PDApfCgodWludDMyX3QpKGIpPDw4KXwoKHVpbnQzMl90KShjKTw8MTYpfCgodWludDMyX3QpKGQpPDwyNCkpCisKKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I0NDQgIHY0bDJfZm91cmNjKCdSJywnNCcsJzQnLCc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCNTU1WCB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnUScpIC8qIDE2ICBSR0ItNS01LTUgQkUgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NjVYIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdSJykgLyogMTYgIFJHQi01LTYtNSBCRSAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0JHUjI0ICAgdjRsMl9mb3VyY2MoJ0InLCdHJywnUicsJzMnKSAvKiAyNCAgQkdSLTgtOC04ICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMjQgICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMycpIC8qIDI0ICBSR0ItOC04LTggICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9CR1IzMiAgIHY0bDJfZm91cmNjKCdCJywnRycsJ1InLCc0JykgLyogMzIgIEJHUi04LTgtOC04ICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjMyICAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJzQnKSAvKiAzMiAgUkdCLTgtOC04LTggICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfR1JFWSAgICB2NGwyX2ZvdXJjYygnRycsJ1InLCdFJywnWScpIC8qICA4ICBHcmV5c2NhbGUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9QQUw4ICAgIHY0bDJfZm91cmNjKCdQJywnQScsJ0wnLCc4JykgLyogIDggIDgtYml0IHBhbGV0dGUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWVTQxMCAgdjRsMl9mb3VyY2MoJ1knLCdWJywnVScsJzknKSAvKiAgOSAgWVZVIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVZVNDIwICB2NGwyX2ZvdXJjYygnWScsJ1YnLCcxJywnMicpIC8qIDEyICBZVlUgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVlWICAgIHY0bDJfZm91cmNjKCdZJywnVScsJ1knLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1VZVlkgICAgdjRsMl9mb3VyY2MoJ1UnLCdZJywnVicsJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIyUCB2NGwyX2ZvdXJjYygnNCcsJzInLCcyJywnUCcpIC8qIDE2ICBZVlU0MjIgcGxhbmFyICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY0MTFQIHY0bDJfZm91cmNjKCc0JywnMScsJzEnLCdQJykgLyogMTYgIFlWVTQxMSBwbGFuYXIgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1k0MVAgICAgdjRsMl9mb3VyY2MoJ1knLCc0JywnMScsJ1AnKSAvKiAxMiAgWVVWIDQ6MToxICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDQ0ICB2NGwyX2ZvdXJjYygnWScsJzQnLCc0JywnNCcpIC8qIDE2ICB4eHh4eXl5eSB1dXV1dnZ2diAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNTU1ICB2NGwyX2ZvdXJjYygnWScsJ1UnLCdWJywnTycpIC8qIDE2ICBZVVYtNS01LTUgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZVVY1NjUgIHY0bDJfZm91cmNjKCdZJywnVScsJ1YnLCdQJykgLyogMTYgIFlVVi01LTYtNSAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjMyICAgdjRsMl9mb3VyY2MoJ1knLCdVJywnVicsJzQnKSAvKiAzMiAgWVVWLTgtOC04LTggICAqLworCisvKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTIgICAgdjRsMl9mb3VyY2MoJ04nLCdWJywnMScsJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMSAgICB2NGwyX2ZvdXJjYygnTicsJ1YnLCcyJywnMScpIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCisKKy8qICBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIG5vdCBkZWZpbmVkIGluIHRoZSBWNEwyIHNwZWNpZmljYXRpb24gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lVVjQxMCAgdjRsMl9mb3VyY2MoJ1knLCdVJywnVicsJzknKSAvKiAgOSAgWVVWIDQ6MTowICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWVVWNDIwICB2NGwyX2ZvdXJjYygnWScsJ1UnLCcxJywnMicpIC8qIDEyICBZVVYgNDoyOjAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9ZWVVWICAgIHY0bDJfZm91cmNjKCdZJywnWScsJ1UnLCdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0hJMjQwICAgdjRsMl9mb3VyY2MoJ0gnLCdJJywnMicsJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSE0xMiAgICB2NGwyX2ZvdXJjYygnSCcsJ00nLCcxJywnMicpIC8qICA4ICBZVVYgNDoyOjAgMTZ4MTYgbWFjcm9ibG9ja3MgKi8KKworLyogQmF5ZXIgZm9ybWF0cyAtIHNlZSBodHRwOi8vd3d3LnNpbGljb25pbWFnaW5nLmNvbS9SR0IlMjBCYXllci5odG0gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NCR0dSOCAgdjRsMl9mb3VyY2MoJ0InLCAnQScsICc4JywgJzEnKSAvKiAgOCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkc4ICB2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnRycpIC8qICA4ICBHQkdCLi4gUkdSRy4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR1JCRzggIHY0bDJfZm91cmNjKCdHJywgJ1InLCAnQicsICdHJykgLyogIDggIEdSR1IuLiBCR0JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NSR0dCOCAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdHJywgJ0InKSAvKiAgOCAgUkdSRy4uIEdCR0IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMCB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnXDAnKSAvKiAxMCAgQkdCRy4uIEdSR1IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dCUkcxMCB2NGwyX2ZvdXJjYygnRycsICdCJywgJzEnLCAnXDAnKSAvKiAxMCAgR0JHQi4uIFJHUkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0dSQkcxMCB2NGwyX2ZvdXJjYygnQicsICdBJywgJzEnLCAnXDAnKSAvKiAxMCAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMCB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnXDAnKSAvKiAxMCAgUkdSRy4uIEdCR0IuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0JHR1IxMiB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMicpIC8qIDEyICBCR0JHLi4gR1JHUi4uICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9TR0JSRzEyIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcyJykgLyogMTIgIEdCR0IuLiBSR1JHLi4gKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NHUkJHMTIgdjRsMl9mb3VyY2MoJ0InLCAnQScsICcxJywgJzInKSAvKiAxMiAgR1JHUi4uIEJHQkcuLiAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU1JHR0IxMiB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMicpIC8qIDEyICBSR1JHLi4gR0JHQi4uICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2xpcGJvYXJkLXBpcGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbGlwYm9hcmQtcGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY2xpcGJvYXJkLXBpcGUuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIEluaXRpYWxpemUgdGhlICdjbGlwYm9hcmQnIHBpcGUuCit2b2lkIGFuZHJvaWRfaW5pdF9jbGlwYm9hcmRfcGlwZSh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY21kbGluZS1vcHRpb24uYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbWRsaW5lLW9wdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVhZWM1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY21kbGluZS1vcHRpb24uYwpAQCAtMCwwICsxLDM4MSBAQAorI2luY2x1ZGUgImFuZHJvaWQvY21kbGluZS1vcHRpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgIF9WRVJCT1NFX1RBRyh4LHkpICAgeyAjeCwgVkVSQk9TRV8jI3gsIHkgfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBjb25zdCBjaGFyKiAgbmFtZTsgaW50ICBmbGFnOyBjb25zdCBjaGFyKiAgdGV4dDsgfQorZGVidWdfdGFnc1tdID0geworICAgIFZFUkJPU0VfVEFHX0xJU1QKKyAgICB7IDAsIDAsIDAgfQorfTsKKwordm9pZCAgcGFyc2VfZW52X2RlYnVnX3RhZ3MoIHZvaWQgKTsKKworZW51bSB7CisgICAgT1BUSU9OX0lTX0ZMQUcgPSAwLAorICAgIE9QVElPTl9JU19QQVJBTSwKKyAgICBPUFRJT05fSVNfTElTVCwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgbmFtZTsKKyAgICBpbnQgICAgICAgICAgdmFyX29mZnNldDsKKyAgICBpbnQgICAgICAgICAgdmFyX3R5cGU7CisgICAgaW50ICAgICAgICAgIHZhcl9pc19jb25maWc7Cit9IE9wdGlvbkluZm87CisKKyNkZWZpbmUgIE9QVElPTihfbmFtZSxfdHlwZSxfY29uZmlnKSAgXAorICAgIHsgI19uYW1lLCBvZmZzZXRvZihBbmRyb2lkT3B0aW9ucyxfbmFtZSksIF90eXBlLCBfY29uZmlnIH0sCisKKworc3RhdGljIGNvbnN0IE9wdGlvbkluZm8gIG9wdGlvbl9rZXlzW10gPSB7CisjZGVmaW5lICBPUFRfRkxBRyhfbmFtZSxfZGVzY3IpICAgICAgICAgICAgIE9QVElPTihfbmFtZSxPUFRJT05fSVNfRkxBRywwKQorI2RlZmluZSAgT1BUX1BBUkFNKF9uYW1lLF90ZW1wbGF0ZSxfZGVzY3IpICBPUFRJT04oX25hbWUsT1BUSU9OX0lTX1BBUkFNLDApCisjZGVmaW5lICBPUFRfTElTVChfbmFtZSxfdGVtcGxhdGUsX2Rlc2NyKSAgIE9QVElPTihfbmFtZSxPUFRJT05fSVNfTElTVCwwKQorI2RlZmluZSAgQ0ZHX0ZMQUcoX25hbWUsX2Rlc2NyKSAgICAgICAgICAgICBPUFRJT04oX25hbWUsT1BUSU9OX0lTX0ZMQUcsMSkKKyNkZWZpbmUgIENGR19QQVJBTShfbmFtZSxfdGVtcGxhdGUsX2Rlc2NyKSAgT1BUSU9OKF9uYW1lLE9QVElPTl9JU19QQVJBTSwxKQorI2luY2x1ZGUgImFuZHJvaWQvY21kbGluZS1vcHRpb25zLmgiCisgICAgeyBOVUxMLCAwLCAwLCAwIH0KK307CisKK2ludAorYW5kcm9pZF9wYXJzZV9vcHRpb25zKCBpbnQgICpwYXJnYywgY2hhcioqICAqcGFyZ3YsIEFuZHJvaWRPcHRpb25zKiAgb3B0ICkKK3sKKyAgICBpbnQgICAgIG5hcmdzID0gKnBhcmdjLTE7CisgICAgY2hhcioqICBhcmVhZCA9ICpwYXJndisxOworICAgIGNoYXIqKiAgYXdyaXRlID0gYXJlYWQ7CisKKyAgICBtZW1zZXQoIG9wdCwgMCwgc2l6ZW9mICpvcHQgKTsKKworICAgIHdoaWxlIChuYXJncyA+IDApIHsKKyAgICAgICAgY2hhciogIGFyZzsKKyAgICAgICAgY2hhciAgIGFyZzJfdGFiWzY0XSwgKmFyZzIgPSBhcmcyX3RhYjsKKworICAgICAgICAvKiBwcm9jZXNzIEA8bmFtZT4gYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiBtZWFuaW5nCisgICAgICAgICAqICctYXZkIDxuYW1lPicKKyAgICAgICAgICovCisgICAgICAgIGlmIChhcmVhZFswXVswXSA9PSAnQCcpIHsKKyAgICAgICAgICAgIG9wdC0+YXZkID0gYXJlYWRbMF0gKyAxOworICAgICAgICAgICAgbmFyZ3MtLTsKKyAgICAgICAgICAgIGFyZWFkKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFueXRoaW5nIHRoYXQgaXNuJ3QgYW4gb3B0aW9uIHBhc3QgdGhpcyBwb2ludHMKKyAgICAgICAgICogZXhpdHMgdGhlIGxvb3AKKyAgICAgICAgICovCisgICAgICAgIGlmIChhcmVhZFswXVswXSAhPSAnLScpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYXJnID0gYXJlYWRbMF0rMTsKKworICAgICAgICAvKiBhbiBvcHRpb24gY2Fubm90IGNvbnRhaW4gYW4gdW5kZXJzY29yZSAqLworICAgICAgICBpZiAoc3RyY2hyKGFyZywgJ18nKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG5hcmdzLS07CisgICAgICAgIGFyZWFkKys7CisKKyAgICAgICAgLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnMgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnLCAidmVyYm9zZSIpKSB7CisgICAgICAgICAgICBhcmcgPSAiZGVidWctaW5pdCI7CisgICAgICAgIH0KKworICAgICAgICAvKiBzcGVjaWFsIGhhbmRpbmcgZm9yIC1kZWJ1ZyA8dGFncz4gYW5kIC1kZWJ1Zy08dGFncz4gKi8KKyAgICAgICAgaWYgKCFzdHJjbXAoYXJnLCAiZGVidWciKSkgeworICAgICAgICAgICAgaWYgKG5hcmdzID09IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoICItZGVidWcgbXVzdCBiZSBmb2xsb3dlZCBieSB0YWdzIChzZWUgLWhlbHAtdmVyYm9zZSlcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hcmdzLS07CisgICAgICAgICAgICBhbmRyb2lkX3BhcnNlX2RlYnVnX3RhZ3Nfb3B0aW9uKCphcmVhZCsrLCAvKnBhcnNlX2FzX3N1ZmZpeCovZmFsc2UpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiZGVidWctIiwgc2l6ZW9mKCJkZWJ1Zy0iKSAtIDEpKSB7CisgICAgICAgICAgICAvLyBGb3IgYSAiLWRlYnVnLTx0YWc+IiBvcHRpb24gd2Ugb25seSBhbGxvdyBhIHNpbmdsZSB0YWcsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgaXQgbWF5IGxvb2sgc3RyYW5nZSB0byBzb21lb25lLgorICAgICAgICAgICAgYW5kcm9pZF9wYXJzZV9kZWJ1Z190YWdzX29wdGlvbihhcmcgKyBzaXplb2YoImRlYnVnLSIpIC0gMSwgLypwYXJzZV9hc19zdWZmaXgqL3RydWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBOT1RFOiB2YXJpYWJsZSB0YWJsZXMgbWFwIG9wdGlvbiBuYW1lcyB0byB2YWx1ZXMKKyAgICAgICAgICogKGUuZy4gZmllbGQgb2Zmc2V0cyBpbnRvIHRoZSBBbmRyb2lkT3B0aW9ucyBzdHJ1Y3R1cmUpLgorICAgICAgICAgKgorICAgICAgICAgKiBob3dldmVyLCB0aGUgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZSB1c2VkIHVuZGVyc2NvcmVzCisgICAgICAgICAqIGluc3RlYWQgb2YgZGFzaGVzLiB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24KKyAgICAgICAgICogJy1mb28tYmFyJyB3aWxsIGJlIGFzc29jaWF0ZWQgdG8gdGhlIG5hbWUgJ2Zvb19iYXInIGluCisgICAgICAgICAqIHRoaXMgdGFibGUsIGFuZCB3aWxsIHBvaW50IHRvIHRoZSBmaWVsZCAnZm9vX2Jhcicgb3IKKyAgICAgICAgICogQW5kcm9pZE9wdGlvbnMuCisgICAgICAgICAqCisgICAgICAgICAqIGFzIHN1Y2gsIGJlZm9yZSBjb21wYXJpbmcgdGhlIGN1cnJlbnQgb3B0aW9uIHRvIHRoZQorICAgICAgICAgKiBjb250ZW50IG9mIHRoZSB0YWJsZSwgd2UncmUgZ29pbmcgdG8gdHJhbnNsYXRlIGRhc2hlcworICAgICAgICAgKiBpbnRvIHVuZGVyc2NvcmVzLgorICAgICAgICAgKi8KKyAgICAgICAgYXJnMiA9IGFyZzJfdGFiOworICAgICAgICBidWZmZXJfdHJhbnNsYXRlX2NoYXIoIGFyZzJfdGFiLCBzaXplb2YoYXJnMl90YWIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgJy0nLCAnXycpOworCisgICAgICAgIC8qIGxvb2sgaW50byBvdXIgdGFibGUgb2Ygb3B0aW9ucworICAgICAgICAgKgorICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgT3B0aW9uSW5mbyogIG9vID0gb3B0aW9uX2tleXM7CisKKyAgICAgICAgICAgIGZvciAoIDsgb28tPm5hbWU7IG9vKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAhc3RyY21wKCBvby0+bmFtZSwgYXJnMiApICkgeworICAgICAgICAgICAgICAgICAgICB2b2lkKiAgZmllbGQgPSAoY2hhciopb3B0ICsgb28tPnZhcl9vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9vLT52YXJfdHlwZSAhPSBPUFRJT05fSVNfRkxBRykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldGVyL2xpc3Qgb3B0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFyZ3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcnJvciggIi0lcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHBhcmFtZXRlciAoc2VlIC1oZWxwLSVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIGFyZyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuYXJncy0tOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob28tPnZhcl90eXBlID09IE9QVElPTl9JU19QQVJBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNoYXIqKilmaWVsZClbMF0gPSBzdHJkdXAoKmFyZWFkKyspOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAob28tPnZhcl90eXBlID09IE9QVElPTl9JU19MSVNUKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTGlzdCoqICBoZWFkID0gKFBhcmFtTGlzdCoqKWZpZWxkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtTGlzdCogICBwbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkVXMChwbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90ZTogc3RvcmUgbGlzdCBpdGVtcyBpbiByZXZlcnNlIG9yZGVyIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICB0aGUgbGlzdCBpcyByZXZlcnNlZCBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLT5wYXJhbSA9IHN0cmR1cCgqYXJlYWQrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGwtPm5leHQgID0gKmhlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhlYWQgICAgID0gcGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnIG9wdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQqKWZpZWxkKVswXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob28tPm5hbWUgPT0gTlVMTCkgeyAgLyogdW5rbm93biBvcHRpb24gPyAqLworICAgICAgICAgICAgICAgIG5hcmdzKys7CisgICAgICAgICAgICAgICAgYXJlYWQtLTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgcmVtYWluaW5nIHBhcmFtZXRlcnMsIGlmIGFueSwgdG8gY29tbWFuZCBsaW5lICovCisgICAgKnBhcmdjID0gbmFyZ3MgKyAxOworCisgICAgd2hpbGUgKG5hcmdzID4gMCkgeworICAgICAgICBhd3JpdGVbMF0gPSBhcmVhZFswXTsKKyAgICAgICAgYXdyaXRlICsrOworICAgICAgICBhcmVhZCAgKys7CisgICAgICAgIG5hcmdzICAtLTsKKyAgICB9CisKKyAgICBhd3JpdGVbMF0gPSBOVUxMOworCisgICAgLyogcmV2ZXJzZSBhbnkgcGFyYW1ldGVyIGxpc3QgYmVmb3JlIGV4aXQuCisgICAgICovCisgICAgeworICAgICAgICBjb25zdCBPcHRpb25JbmZvKiAgb28gPSBvcHRpb25fa2V5czsKKworICAgICAgICBmb3IgKCA7IG9vLT5uYW1lOyBvbysrICkgeworICAgICAgICAgICAgaWYgKCBvby0+dmFyX3R5cGUgPT0gT1BUSU9OX0lTX0xJU1QgKSB7CisgICAgICAgICAgICAgICAgUGFyYW1MaXN0KiogIGhlYWQgPSAoUGFyYW1MaXN0KiopKChjaGFyKilvcHQgKyBvby0+dmFyX29mZnNldCk7CisgICAgICAgICAgICAgICAgUGFyYW1MaXN0KiAgIHByZXYgPSBOVUxMOworICAgICAgICAgICAgICAgIFBhcmFtTGlzdCogICBjdXIgID0gKmhlYWQ7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyYW1MaXN0KiAgbmV4dCA9IGN1ci0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgY3VyLT5uZXh0ID0gcHJldjsKKyAgICAgICAgICAgICAgICAgICAgcHJldiAgICAgID0gY3VyOworICAgICAgICAgICAgICAgICAgICBjdXIgICAgICAgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaGVhZCA9IHByZXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKy8qIHNwZWNpYWwgaGFuZGxpbmcgb2YgLWRlYnVnIG9wdGlvbiBhbmQgdGFncyAqLworI2RlZmluZSAgRU5WX0RFQlVHICAgIkFORFJPSURfREVCVUciCisKKy8vIENoZWNrcyBpZiBhIGNoYXJhY3RlciByYW5nZSBbdGFnU3RhcnQsIHRhZ0VuZCkgcmVwcmVzZW50cyBhIGRlYnVnIHRhZyB8dG98LgorLy8gfHRhZ1N0YXJ0fCB0byB8dGFnRW5kfCBpcyBhc3N1bWVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGEgemVyby10ZXJtaW5hdGVkIEMKKy8vICBzdHJpbmcsIHdpdGggbm8gXDAgY2hhcmFjdGVycyBpbiB0aGUgbWlkZGxlLgorc3RhdGljIGJvb2wgaXNfdGFnX2VxdWFsKGNvbnN0IGNoYXIqIHRhZ1N0YXJ0LCBjb25zdCBjaGFyKiB0YWdFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdG8pIHsKKyAgICBjb25zdCBzaXplX3QgdGFnTGVuID0gdGFnRW5kIC0gdGFnU3RhcnQ7CisgICAgaWYgKHN0cm5jbXAodG8sIHRhZ1N0YXJ0LCB0YWdMZW4pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDYW4ndCBkbyB0aGlzIGJlZm9yZSB0aGUgc3RybmNtcCgpIGNhbGwgYXMgfHRvfCBtaWdodCBiZSBub3QgbG9uZyBlbm91Z2guCisgICAgaWYgKHRvW3RhZ0xlbl0gIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFuZHJvaWRfcGFyc2VfZGVidWdfdGFnc19vcHRpb24oY29uc3QgY2hhciogb3B0LCBib29sIHBhcnNlX2FzX3N1ZmZpeCkgeworICAgIGlmIChvcHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBjb25zdCBjaGFyKiB4ID0gb3B0OworICAgIHdoaWxlICgqeCkgeworICAgICAgICBjb25zdCBjaGFyKiB5ID0gcGFyc2VfYXNfc3VmZml4ID8gKHggKyBzdHJsZW4oeCkpIDogc3RyY2hyKHgsICcsJyk7CisgICAgICAgIGlmICh5ID09IE5VTEwpCisgICAgICAgICAgICB5ID0geCArIHN0cmxlbih4KTsKKworICAgICAgICBpZiAoeSA+IHgrMSkgeworICAgICAgICAgICAgaW50IHJlbW92ZSA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB4MCA9IHg7IC8vIGluIGNhc2Ugd2UgbmVlZCB0byBwcmludCBpdCBvdXQKKworICAgICAgICAgICAgaWYgKCFwYXJzZV9hc19zdWZmaXggJiYgeFswXSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICByZW1vdmUgPSAxOworICAgICAgICAgICAgICAgIHggKz0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoeCwgIm5vLSIsIDMpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlID0gMTsKKyAgICAgICAgICAgICAgICB4ICs9IDM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc190YWdfZXF1YWwoeCwgeSwgImFsbCIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmFzZV9kaXNhYmxlX3ZlcmJvc2VfbG9ncygpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGJhc2VfZW5hYmxlX3ZlcmJvc2VfbG9ncygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyICB0ZW1wWzMyXTsKKyAgICAgICAgICAgICAgICBidWZmZXJfdHJhbnNsYXRlX2NoYXJfd2l0aF9sZW4odGVtcCwgc2l6ZW9mIHRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHkgLSB4LCAnLScsICdfJyk7CisKKyAgICAgICAgICAgICAgICBpbnQgbm47CisgICAgICAgICAgICAgICAgdWludDY0X3QgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChubiA9IDA7IGRlYnVnX3RhZ3Nbbm5dLm5hbWUgIT0gTlVMTDsgbm4rKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNfdGFnX2VxdWFsKHRlbXAsIHRlbXAgKyAoeSAtIHgpLCBkZWJ1Z190YWdzW25uXS5uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSAoMVVMTCA8PCBkZWJ1Z190YWdzW25uXS5mbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1hc2sgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBkcHJpbnQoImlnbm9yaW5nIHVua25vd24gZGVidWcgaXRlbSAnJS4qcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoeSAtIHgwKSwgeDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3ZlcmJvc2UgJj0gfm1hc2s7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfdmVyYm9zZSB8PSBtYXNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBTa2lwIHRoZSBjb21tYSwgYnV0IGRvbid0IGp1bXAgb3ZlciB0aGUgdGVybWluYXRpbmcgemVyby4KKyAgICAgICAgeCA9ICp5ID8geSArIDEgOiB5OworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK3BhcnNlX2Vudl9kZWJ1Z190YWdzKCB2b2lkICkKK3sKKyAgICBjb25zdCBjaGFyKiAgZW52ID0gZ2V0ZW52KCBFTlZfREVCVUcgKTsKKyAgICBhbmRyb2lkX3BhcnNlX2RlYnVnX3RhZ3Nfb3B0aW9uKGVudiwgLypwYXJzZV9hc19zdWZmaXgqL2ZhbHNlKTsKK30KKworYm9vbCBhbmRyb2lkX3ZhbGlkYXRlX3BvcnRzKGludCBjb25zb2xlX3BvcnQsIGludCBhZGJfcG9ydCkgeworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKworICAgIGludCBsb3dlcl9ib3VuZCA9IEFORFJPSURfQ09OU09MRV9CQVNFUE9SVCAgKyAxOworICAgIGludCB1cHBlcl9ib3VuZCA9IGxvd2VyX2JvdW5kICsgKE1BWF9BTkRST0lEX0VNVUxBVE9SUyAtIDEpICogMiArIDE7CisgICAgaWYgKGFkYl9wb3J0IDwgbG93ZXJfYm91bmQgfHwgYWRiX3BvcnQgPiB1cHBlcl9ib3VuZCkgeworICAgICAgICBkd2FybmluZygiUmVxdWVzdGVkIGFkYiBwb3J0ICglZCkgaXMgb3V0c2lkZSB0aGUgcmVjb21tZW5kZWQgcmFuZ2UgIgorICAgICAgICAgICAgICAgICAiWyVkLCVkXS4gQURCIG1heSBub3QgZnVuY3Rpb24gcHJvcGVybHkgZm9yIHRoZSBlbXVsYXRvci4gU2VlICIKKyAgICAgICAgICAgICAgICAgIi1oZWxwLXBvcnQgZm9yIGRldGFpbHMuIiwKKyAgICAgICAgICAgICAgICAgYWRiX3BvcnQsIGxvd2VyX2JvdW5kLCB1cHBlcl9ib3VuZCk7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAoYWRiX3BvcnQgJSAyID09IDApIHsKKyAgICAgICAgZHdhcm5pbmcoIlJlcXVlc3RlZCBhZGIgcG9ydCAoJWQpIGlzIGFuIGV2ZW4gbnVtYmVyLiBBREIgbWF5IG5vdCAiCisgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBwcm9wZXJseSBmb3IgdGhlIGVtdWxhdG9yLiBTZWUgLWhlbHAtcG9ydCBmb3IgIgorICAgICAgICAgICAgICAgICAiZGV0YWlscy4iLCBhZGJfcG9ydCk7CisgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgYW5kcm9pZF9wYXJzZV9wb3J0X29wdGlvbihjb25zdCBjaGFyKiBwb3J0X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnNvbGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGFkYl9wb3J0KSB7CisgICAgaWYgKHBvcnRfc3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNoYXIqIGVuZDsKKyAgICBlcnJubyA9IDA7CisgICAgaW50IHBvcnQgPSBzdHJ0b2wocG9ydF9zdHJpbmcsICZlbmQsIDApOworICAgIGlmIChlbmQgPT0gTlVMTCB8fCAqZW5kIHx8IGVycm5vIHx8IHBvcnQgPCAxIHx8IHBvcnQgPiBVSU5UMTZfTUFYKSB7CisgICAgICAgIGRlcnJvcigib3B0aW9uIC1wb3J0IG11c3QgYmUgZm9sbG93ZWQgYnkgYW4gaW50ZWdlci4gIgorICAgICAgICAgICAgICAgIiclcycgaXMgbm90IGEgdmFsaWQgaW5wdXQuIiwgcG9ydF9zdHJpbmcpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNvbnNvbGVfcG9ydCA9IHBvcnQ7CisgICAgKmFkYl9wb3J0ID0gKmNvbnNvbGVfcG9ydCArIDE7CisgICAgZHByaW50KCJSZXF1ZXN0ZWQgY29uc29sZSBwb3J0ICVkOiBJbmZlcnJpbmcgYWRiIHBvcnQgJWQuIiwKKyAgICAgICAgICAgKmNvbnNvbGVfcG9ydCwgKmFkYl9wb3J0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIGFuZHJvaWRfcGFyc2VfcG9ydHNfb3B0aW9uKGNvbnN0IGNoYXIqIHBvcnRzX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zb2xlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYWRiX3BvcnQpIHsKKyAgICBpZiAocG9ydHNfc3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNoYXIqIGNvbW1hX2xvY2F0aW9uOworICAgIGNoYXIqIGVuZDsKKyAgICBpbnQgZmlyc3RfcG9ydCA9IHN0cnRvbChwb3J0c19zdHJpbmcsICZjb21tYV9sb2NhdGlvbiwgMCk7CisgICAgaWYgKGNvbW1hX2xvY2F0aW9uID09IE5VTEwgfHwgKmNvbW1hX2xvY2F0aW9uICE9ICcsJyB8fAorICAgICAgICBmaXJzdF9wb3J0IDwgMSB8fCBmaXJzdF9wb3J0ID4gVUlOVDE2X01BWCkgeworICAgICAgICBkZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBvcHRpb246IHwlc3wgKENvdWxkIG5vdCBwYXJzZSBmaXJzdCBwb3J0KS4gIgorICAgICAgICAgICAgICAgIlNlZSAtaGVscC1wb3J0cy4iLCBwb3J0c19zdHJpbmcpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHNlY29uZF9wb3J0ID0gc3RydG9sKGNvbW1hX2xvY2F0aW9uKzEsICZlbmQsIDApOworICAgIGlmIChlbmQgPT0gTlVMTCB8fCAqZW5kIHx8IHNlY29uZF9wb3J0IDwgMSB8fCBzZWNvbmRfcG9ydCA+IFVJTlQxNl9NQVgpIHsKKyAgICAgICAgZGVycm9yKCJGYWlsZWQgdG8gcGFyc2Ugb3B0aW9uOiB8JXN8LiAoQ291bGQgbm90IHBhcnNlIHNlY29uZCBwb3J0KS4gIgorICAgICAgICAgICAgICAgIlNlZSAtaGVscC1wb3J0cy4iLCBwb3J0c19zdHJpbmcpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmaXJzdF9wb3J0ID09IHNlY29uZF9wb3J0KSB7CisgICAgICAgIGRlcnJvcigiRmFpbGVkIHRvIHBhcnNlIG9wdGlvbjogfCVzfC4gKEJvdGggcG9ydHMgYXJlIGlkZW50aWNhbCkuICIKKyAgICAgICAgICAgICAgICJTZWUgLWhlbHAtcG9ydHMuIiwgcG9ydHNfc3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpjb25zb2xlX3BvcnQgPSBmaXJzdF9wb3J0OworICAgICphZGJfcG9ydCA9IHNlY29uZF9wb3J0OworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY21kbGluZS1vcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYzYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgKQEAgLTAsMCArMSw5MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIGEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBsaW5rZWQgbGlzdCBvZiBwYXJhbWV0ZXJzCisgKi8KK3R5cGVkZWYgc3RydWN0IFBhcmFtTGlzdCB7CisgICAgY2hhciogICAgICAgICAgICAgIHBhcmFtOworICAgIHN0cnVjdCBQYXJhbUxpc3QqICBuZXh0OworfSBQYXJhbUxpc3Q7CisKKy8qIGRlZmluZSBhIHN0cnVjdHVyZSB0aGF0IHdpbGwgaG9sZCBhbGwgb3B0aW9uIHZhcmlhYmxlcworICovCit0eXBlZGVmIHN0cnVjdCB7CisjZGVmaW5lIE9QVF9MSVNUKG4sdCxkKSAgICBQYXJhbUxpc3QqICBuOworI2RlZmluZSBPUFRfUEFSQU0obix0LGQpICAgY2hhciogIG47CisjZGVmaW5lIE9QVF9GTEFHKG4sZCkgICAgICBpbnQgICAgbjsKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9ucy5oIgorfSBBbmRyb2lkT3B0aW9uczsKKworCisvKiBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIG9wdGlvbnMgYW5kIHJlbW92ZSB0aGVtIGZyb20gKGFyZ2MsYXJndikKKyAqICdvcHQnIHdpbGwgYmUgc2V0IHRvIHRoZSBjb250ZW50IG9mIHBhcnNlZCBvcHRpb25zCisgKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKHVua25vd24gb3B0aW9uKQorICovCitleHRlcm4gaW50CithbmRyb2lkX3BhcnNlX29wdGlvbnMoIGludCAgKnBhcmdjLCBjaGFyKiogICpwYXJndiwgQW5kcm9pZE9wdGlvbnMqICBvcHQgKTsKKworLyogUGFyc2UgfHBvcnRfc3RyaW5nfCBpbnRvIHxjb25zb2xlX3BvcnR8IGFuZCB8YWRiX3BvcnR8LiBFcnJvciBjaGVja2luZyBpcworICogZG9uZSBhbmQgYXBwcm9yaWF0ZSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzIHNob3duIGlmIG5lZWRlZC4gSWYgdGhlCisgKiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIHRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIG5vdCB0b3VjaGVkLgorICovCitleHRlcm4gYm9vbCBhbmRyb2lkX3BhcnNlX3BvcnRfb3B0aW9uKGNvbnN0IGNoYXIqIHBvcnRfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnNvbGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBhZGJfcG9ydCk7CisKKy8qIFBhcnNlIHxwb3J0c19zdHJpbmd8IGludG8gfGNvbnNvbGVfcG9ydHwgYW5kIHxhZGJfcG9ydHwuIFRoZSBmb3JtYXQgb2YgdGhlCisgKiAtcG9ydHMgb3B0aW9uIGlzIGN1cnJlbnRseSAiPGNvbnNvbGUgcG9ydD4sPGFkYiBwb3J0PiIuIEVycm9yIGNoZWNraW5nIGlzCisgKiBkb25lIGFuZCB0aGUgYXBwcm9yaWF0ZSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzIHNob3duIGlmIG5lZWRlZC4gSWYgdGhlCisgKiBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIG5laXRoZXIgb2YgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIGFyZSB0b3VjaGVkLgorICovCitleHRlcm4gYm9vbCBhbmRyb2lkX3BhcnNlX3BvcnRzX29wdGlvbihjb25zdCBjaGFyKiBwb3J0c19zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnNvbGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYWRiX3BvcnQpOworCisvKiBWYWxpZGF0ZXMgdGhlIHBvcnRzIGluIHVzZSBhbmQgd2FybnMgdGhlIHVzZXIgaWYgdGhleSBhcmUgbGlrZWx5IHRvIGNhdXNlCisgKiBwcm9ibGVtcy4gQWxzbyBhbm5vdW5jZXMgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGVtdWxhdG9yIGFzIHNlZW4gZnJvbSBhZGIuCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBubyB2YWxpZGF0aW9uIGVycm9ycyB3ZXJlIGRldGVjdGVkLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBib29sIGFuZHJvaWRfdmFsaWRhdGVfcG9ydHMoaW50IGNvbnNvbGVfcG9ydCwgaW50IGFkYl9wb3J0KTsKKworLy8gUGFyc2UgdGhlIGRlYnVnLXJlbGF0ZWQgY29tYmluYXRpb24gb2YgdGFncyBmcm9tIHRoZSB8b3B0fCBhcmd1bWVudCBhbmQKKy8vIGFwcGx5IHRoZW0uCisvLyB8cGFyc2VfYXNfc3VmZml4fCBzcGVjaWZpZXMgaWYgdGhlIGFncnVtZW50IGluIHxvcHR8IGlzIGp1c3QgYSBzdWZmaXggb2YgYQorLy8gIGxvbmdlciBjb21tYW5kLWxpbmUgYXJndW1lbnQgYW5kIGhhcyB0byBiZSB0cmVhdGVkIGxpa2Ugb25lIChubyBjb21tYS0KKy8vICBzZXBhcmF0ZWQgdGFncywgbm8gJy10YWcnIHN5bnRheCkKKy8vICBpbiB8b3B0fCBvciBpdCBoYXMgdG8gYmUganVzdCBhIHNpbmdsZSB0YWcuCisvLyBFeHBlY3RlZCBmb3JtYXQ6IDxvcHRpb24+Wyw8b3B0aW9uPlssLi4uXV0KKy8vICAgd2hlcmUgPG9wdGlvbj4gaXMgZWl0aGVyIG9uZSBvZiB0aGUgZGVidWcgdGFncyBvciAiYWxsIiB0byBjb250cm9sCisvLyAgIGFsbCB0YWdzIGF0IG9uY2UuIElmIGFuIDxvcHRpb24+IGhhcyBhICctJyBvciAnbm8tJyBwcmVmaXgsIHRoYXQgdGFnIGlzCisvLyAgIGRpc2FibGVkLiBVbmtub3duIHRhZ3MgYXJlIGp1c3QgaWdub3JlZC4gVGFncyBhcmUgYXBwbGllZCBsZWZ0LXRvLXJpZ2h0LAorLy8gICBzbyB0aGUgbGFzdCB0YWcgdmFsdWUgKCd0YWcnIG9yICduby10YWcnKSB3aW5zLgorLy8gRS5nLiB8b3B0fCA9ICJhbGwsLWluaXQsbm8tcWVtdWQsYmxhaCIgZW5hYmxlcyBhbGwgZGVidWdnaW5nIHRhZ3MgZXhjZXB0CisvLyAgIG9mICJpbml0IiBhbmQgInFlbXVkIi4gImJsYWgiIHRhZyBkb2Vzbid0IGV4aXN0IChJIGhvcGUpIHNvIGl0IGFkZHMKKy8vICAgbm90aGluZy4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHxvcHR8IGhhZCBhdCBsZWFzdCBvbmUgdmFsaWQgZGVidWcgdGFnLgorYm9vbCBhbmRyb2lkX3BhcnNlX2RlYnVnX3RhZ3Nfb3B0aW9uKGNvbnN0IGNoYXIqIG9wdCwgYm9vbCBwYXJzZV9hc19zdWZmaXgpOworCisvKiB0aGUgZGVmYXVsdCBkZXZpY2UgRFBJIGlmIG5vbmUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBza2luCisgKi8KKyNkZWZpbmUgIERFRkFVTFRfREVWSUNFX0RQSSAgMTY1CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NtZGxpbmUtb3B0aW9uX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbWRsaW5lLW9wdGlvbl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0MmVlYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbWRsaW5lLW9wdGlvbl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworVEVTVChDbWRMaW5lT3B0aW9ucywgcGFyc2VQb3J0KSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICAgIGJvb2wgZXhwZWN0U3VjY2VzczsKKyAgICAgICAgaW50IGV4cGVjdENvbnNvbGVQb3J0OworICAgICAgICBpbnQgZXhwZWN0QWRiUG9ydDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsiNTU1NCIsIHRydWUsIDU1NTQsIDU1NTV9LAorICAgICAgICB7IjU1NTUiLCB0cnVlLCA1NTU1LCA1NTU2fSwgIC8vIE9kZCBwb3J0LgorICAgICAgICB7IjU1NTIiLCB0cnVlLCA1NTUyLCA1NTUzfSwgIC8vIFBvcnQgYmVsb3cgbG93ZXIgYm91bmQgb2YgNTU1NC4KKyAgICAgICAgeyI1NTUzIiwgdHJ1ZSwgNTU1MywgNTU1NH0sICAvLyBQb3J0IGJlbG93IGxvd2VyIGJvdW5kIG9mIDU1NTQuCisgICAgICAgIHsiNjAwMCIsIHRydWUsIDYwMDAsIDYwMDF9LCAgLy8gUG9ydCBhYm92ZSB1cHBlciBib3VuZC4KKyAgICAgICAgeyI2MDAxIiwgdHJ1ZSwgNjAwMSwgNjAwMn0sICAvLyBFdmVuIHBvcnQgYWJvdmUgcmFuZ2UKKyAgICAgICAgeyJmb28iLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHsiNTU1NHRyYWlsaW5nVGV4dCIsIGZhbHNlLCAwLCAwfSwKKyAgICAgICAgeyIiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHtudWxscHRyLCBmYWxzZSwgMCwgMH0sCisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGtEYXRhKSB7CisgICAgICAgIGludCBjb25zb2xlUG9ydCA9IDA7CisgICAgICAgIGludCBhZGJQb3J0ID0gMDsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBhbmRyb2lkX3BhcnNlX3BvcnRfb3B0aW9uKGRhdGEuaW5wdXQsICZjb25zb2xlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGJQb3J0KTsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0U3VjY2VzcywgcmVzdWx0KQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgb24gdGVzdCBjYXNlOiAoIiA8PCBkYXRhLmlucHV0IDw8ICIpIjsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0Q29uc29sZVBvcnQsIGNvbnNvbGVQb3J0KQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgb24gdGVzdCBjYXNlOiAoIiA8PCBkYXRhLmlucHV0IDw8ICIpIjsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0QWRiUG9ydCwgYWRiUG9ydCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIG9uIHRlc3QgY2FzZTogKCIgPDwgZGF0YS5pbnB1dCA8PCAiKSI7CisgICAgfQorfQorCitURVNUKENtZExpbmVPcHRpb25zLCBwYXJzZVBvcnRzKSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICAgIGJvb2wgZXhwZWN0U3VjY2VzczsKKyAgICAgICAgaW50IGV4cGVjdENvbnNvbGVQb3J0OworICAgICAgICBpbnQgZXhwZWN0QWRiUG9ydDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsiNTU1NCw1NTU1IiwgdHJ1ZSwgNTU1NCwgNTU1NX0sCisgICAgICAgIHsiMSwyMDAiLCB0cnVlLCAxLCAyMDB9LCAgICAgICAgICAgLy8gTm8gcmVzdHJpY3Rpb25zIG9uIHBvcnRzCisgICAgICAgIHsiNjUwMDAsNyIsIHRydWUsIDY1MDAwLCA3fSwKKyAgICAgICAgeyItMiw1NTU1IiwgZmFsc2UsIDAsIDB9LCAgICAgICAgICAvLyBObyBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAgICAgeyI1NTU0LC00MiIsIGZhbHNlLCAwLCAwfSwgICAgICAgICAvLyBObyBuZWdhdGl2ZSB2YWx1ZXMKKyAgICAgICAgeyIgNTU1NCwgNTU1NSIsIHRydWUsIDU1NTQsIDU1NTV9LCAvLyBMZWFkaW5nIHNwYWNlcyBhcmUgZmluZQorICAgICAgICB7IjU1NTQgLDU1NTUiLCBmYWxzZSwgMCwgMH0sICAgICAgIC8vIEJ1dCBub3QgdHJhaWxpbmcgc3BhY2VzCisgICAgICAgIHsiNTU1NCw1NTU1ICIsIGZhbHNlLCAwLCAwfSwgICAgICAgLy8gQnV0IG5vdCB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgeyI1NTU0LDU1NTV0cmFpbGluZ1RleHQiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHsiNTU1NHRyYWlsaW5ndGV4dCw1NTU1IiwgZmFsc2UsIDAsIDB9LAorICAgICAgICB7IjM0NSwiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHsiLDY3OCIsIGZhbHNlLCAwLCAwfSwKKyAgICAgICAgeyIxMjMiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHsiMTIzIDQ1NiIsIGZhbHNlLCAwLCAwfSwKKyAgICAgICAgeyIwLDIzNCIsIGZhbHNlLCAwLCAwfSwgICAgICAgICAgICAvLyBObyBwb3J0cyBiZWxvdyAxCisgICAgICAgIHsiMjM0LDAiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHsiNjU1MzYsMjM0IiwgZmFsc2UsIDAsIDB9LCAgICAgICAgLy8gTm8gcG9ydHMgYWJvdmUgNjU1MzUKKyAgICAgICAgeyIyMzQsNjU1MzYiLCBmYWxzZSwgMCwgMH0sCisgICAgICAgIHtudWxscHRyLCBmYWxzZSwgMCwgMH0sCisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGtEYXRhKSB7CisgICAgICAgIGludCBjb25zb2xlUG9ydCA9IDAsIGFkYlBvcnQgPSAwOworICAgICAgICBib29sIHJlc3VsdCA9IGFuZHJvaWRfcGFyc2VfcG9ydHNfb3B0aW9uKGRhdGEuaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnNvbGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGJQb3J0KTsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0U3VjY2VzcywgcmVzdWx0KQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgb24gdGVzdCBjYXNlOiAoIiA8PCBkYXRhLmlucHV0IDw8ICIpIjsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0Q29uc29sZVBvcnQsIGNvbnNvbGVQb3J0KQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgb24gdGVzdCBjYXNlOiAoIiA8PCBkYXRhLmlucHV0IDw8ICIpIjsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0QWRiUG9ydCwgYWRiUG9ydCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIG9uIHRlc3QgY2FzZTogKCIgPDwgZGF0YS5pbnB1dCA8PCAiKSI7CisgICAgfQorfQorCitURVNUKENtZExpbmVPcHRpb25zLCB2YWxpZGF0ZVBvcnRzKSB7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IGNvbnNvbGVQb3J0SW5wdXQ7CisgICAgICAgIGludCBhZGJQb3J0SW5wdXQ7CisgICAgICAgIGJvb2wgZXhwZWN0U3VjY2VzczsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHs1NTU0LCA1NTU1LCB0cnVlfSwKKyAgICAgICAgezU1NTMsIDU1NTQsIGZhbHNlfSwKKyAgICAgICAgezU1NTIsIDU1NTMsIGZhbHNlfSwKKyAgICAgICAgezU1ODQsIDU1ODUsIHRydWV9LCAgLy8gQXQgbGVhc3QgMTYgcG9ydCBjb21iaW5hdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgezU1NTUsIDU1NTYsIGZhbHNlfSwgIC8vIE9kZCBwb3J0cyBub3QgYWxsb3dlZC4KKyAgICAgICAgezU1NTIsIDU1NTMsIGZhbHNlfSwgIC8vIFBvcnQgYmVsb3cgbG93ZXIgYm91bmQuCisgICAgICAgIHs1NTUzLCA1NTU0LCBmYWxzZX0sICAvLyBQb3J0IGJlbG93IGxvd2VyIGJvdW5kLgorICAgICAgICB7NjAwMCwgNjAwMSwgZmFsc2V9LCAgLy8gUG9ydCBhYm92ZSB1cHBlciBib3VuZC4KKyAgICAgICAgezYwMDEsIDYwMDIsIGZhbHNlfSwgIC8vIFBvcnQgYWJvdmUgdXBwZXIgYm91bmQuCisgICAgfTsKKworICAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGtEYXRhKSB7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gYW5kcm9pZF92YWxpZGF0ZV9wb3J0cyhkYXRhLmNvbnNvbGVQb3J0SW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmFkYlBvcnRJbnB1dCk7CisgICAgICAgIEVYUEVDVF9FUShkYXRhLmV4cGVjdFN1Y2Nlc3MsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIG9uIHRlc3QgY2FzZTogKCIgPDwgZGF0YS5jb25zb2xlUG9ydElucHV0CisgICAgICAgICAgICAgICAgPDwgIiwiIDw8IGRhdGEuYWRiUG9ydElucHV0IDw8ICIpIjsKKyAgICB9Cit9CisKKworVEVTVChDbWRMaW5lT3B0aW9ucywgcGFyc2VEZWJ1ZykgeworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIG9wdGlvbjsKKyAgICAgICAgYm9vbCBwYXJzZUFzU3VmZml4OworICAgICAgICBib29sIGV4cGVjdGVkUmVzdWx0OworICAgICAgICB1aW50NjRfdCBpbml0aWFsRmxhZ3M7CisgICAgICAgIHVpbnQ2NF90IHBhcnNlZEZsYWdzOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyBOVUxMLCBmYWxzZSwgZmFsc2UsIDAsIDAgfSwKKyAgICAgICAgeyBOVUxMLCB0cnVlLCBmYWxzZSwgMCwgMCB9LAorICAgICAgICB7ICIiLCBmYWxzZSwgMCwgMCB9LAorICAgICAgICB7ICJhbGwiLCBmYWxzZSwgdHJ1ZSwgMCwgLTF1bGwgfSwKKyAgICAgICAgeyAiLWFsbCIsIGZhbHNlLCB0cnVlLCAxLCAwIH0sCisgICAgICAgIHsgImFsbCIsIHRydWUsIHRydWUsIDAsIC0xdWxsIH0sCisgICAgICAgIHsgIi1hbGwiLCB0cnVlLCBmYWxzZSwgMSwgMSB9LAorICAgICAgICB7ICJuby1hbGwiLCBmYWxzZSwgdHJ1ZSwgMSwgMCB9LAorICAgICAgICB7ICJub2FsbCIsIGZhbHNlLCBmYWxzZSwgMSwgMSB9LAorICAgICAgICB7ICJpbml0IiwgZmFsc2UsIHRydWUsIDAsIDEgfSwKKyAgICAgICAgeyAiaW5pdCIsIHRydWUsIHRydWUsIDAsIDEgfSwKKyAgICAgICAgeyAiLWluaXQiLCB0cnVlLCBmYWxzZSwgMSwgMSB9LAorICAgICAgICB7ICJhbGwsbm8taW5pdCIsIGZhbHNlLCB0cnVlLCAwLCAtMXVsbCAmIH4xIH0sCisgICAgICAgIHsgImFsbCxuby1pbml0IiwgdHJ1ZSwgZmFsc2UsIDAsIDAgfSwKKyAgICAgICAgeyAiaW5pdCxibGFoLC1mb28sbm8tYmFyIiwgZmFsc2UsIHRydWUsIDAsIDEgfSwKKyAgICAgICAgeyAiaW5pdCxibGFoLC1mb28sbm8tYmFyIiwgdHJ1ZSwgZmFsc2UsIDAsIDAgfQorICAgIH07CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGFuZHJvaWRfdmVyYm9zZSBkZWJ1ZyBmbGFncyBhcmUgcmVzdG9yZWQgZXZlbiBpZiBhbnkgdGVzdAorICAgIC8vIGNhc2UgZmFpbHMuCisgICAgY29uc3QgYXV0byBvbGRGbGFncyA9IGFuZHJvaWRfdmVyYm9zZTsKKyAgICBhdXRvIHJlc3RvcmVGbGFncyA9IGFuZHJvaWQ6OmJhc2U6Om1ha2VDdXN0b21TY29wZWRQdHIobnVsbHB0ciwKKyAgICAgICAgW29sZEZsYWdzXShzdGQ6Om51bGxwdHJfdCopIHsgYW5kcm9pZF92ZXJib3NlID0gb2xkRmxhZ3M7IH0pOworCisgICAgZm9yIChjb25zdCBhdXRvJiBkYXRhIDoga0RhdGEpIHsKKyAgICAgICAgYW5kcm9pZF92ZXJib3NlID0gZGF0YS5pbml0aWFsRmxhZ3M7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gYW5kcm9pZF9wYXJzZV9kZWJ1Z190YWdzX29wdGlvbihkYXRhLm9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucGFyc2VBc1N1ZmZpeCk7CisgICAgICAgIEVYUEVDVF9FUShkYXRhLmV4cGVjdGVkUmVzdWx0LCByZXN1bHQpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCBvbiB0ZXN0IGNhc2U6ICgiCisgICAgICAgICAgICAgICAgPDwgKGRhdGEub3B0aW9uID8gZGF0YS5vcHRpb24gOiAibnVsbCIpIDw8ICIpIjsKKyAgICAgICAgRVhQRUNUX0VRKGRhdGEucGFyc2VkRmxhZ3MsIGFuZHJvaWRfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIG9uIHRlc3QgY2FzZTogKCIKKyAgICAgICAgICAgICAgICA8PCAoZGF0YS5vcHRpb24gPyBkYXRhLm9wdGlvbiA6ICJudWxsIikgPDwgIikiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbWRsaW5lLW9wdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jbWRsaW5lLW9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNhZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NtZGxpbmUtb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiB0aGlzIGhlYWRlciBmaWxlIGNhbiBiZSBpbmNsdWRlZCBzZXZlcmFsIHRpbWVzIGJ5IHRoZSBzYW1lIHNvdXJjZSBjb2RlLgorICogaXQgY29udGFpbnMgdGhlIGxpc3Qgb2Ygc3VwcG9ydCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEFuZHJvaWQKKyAqIGVtdWxhdG9yIHByb2dyYW0KKyAqLworI2lmbmRlZiBPUFRfUEFSQU0KKyNlcnJvciBPUFRfUEFSQU0gaXMgbm90IGRlZmluZWQKKyNlbmRpZgorI2lmbmRlZiBPUFRfTElTVAorI2Vycm9yIE9QVF9MSVNUIGlzIG5vdCBkZWZpbmVkCisjZW5kaWYKKyNpZm5kZWYgT1BUX0ZMQUcKKyNlcnJvciBPUFRfRkxBRyBpcyBub3QgZGVmaW5lZAorI2VuZGlmCisjaWZuZGVmIENGR19QQVJBTQorI2RlZmluZSBDRkdfUEFSQU0gIE9QVF9QQVJBTQorI2VuZGlmCisjaWZuZGVmIENGR19GTEFHCisjZGVmaW5lIENGR19GTEFHICAgT1BUX0ZMQUcKKyNlbmRpZgorCisvKiByZXF1aXJlZCB0byBlbnN1cmUgdGhhdCB0aGUgQ09ORklHX1hYWCBtYWNyb3MgYXJlIHByb3Blcmx5IGRlZmluZWQgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2NvbmZpZy9jb25maWcuaCIKKworLyogU29tZSBvcHRpb25zIGFjdHMgbGlrZSBmbGFncywgd2hpbGUgb3RoZXJzIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBwYXJhbWV0ZXIKKyAqIHN0cmluZy4gTm90aGluZyByZWFsbHkgbmV3IGhlcmUuCisgKgorICogU29tZSBvcHRpb25zIGNvcnJlc3BvbmQgdG8gQVZEIChBbmRyb2lkIFZpcnR1YWwgRGV2aWNlKSBjb25maWd1cmF0aW9uCisgKiBhbmQgd2lsbCBiZSBpZ25vcmVkIGlmIHlvdSBzdGFydCB0aGUgZW11bGF0b3Igd2l0aCB0aGUgLWF2ZCA8bmFtZT4gZmxhZy4KKyAqCisgKiBIb3dldmVyLCBpZiB5b3UgdXNlIHRoZW0gd2l0aCAtYXZkLWNyZWF0ZSA8bmFtZT4sIHRoZXNlIG9wdGlvbnMgd2lsbCBiZQorICogcmVjb3JkZWQgaW50byB0aGUgbmV3IEFWRCBkaXJlY3RvcnkuIE9uY2UgYW4gQVZEIGlzIGNyZWF0ZWQsIHRoZXJlIGlzIG5vCisgKiB3YXkgdG8gY2hhbmdlIHRoZXNlIG9wdGlvbnMuCisgKgorICogU2V2ZXJhbCBtYWNyb3MgYXJlIHVzZWQgdG8gZGVmaW5lIG9wdGlvbnM6CisgKgorICogICAgT1BUX0ZMQUcoIG5hbWUsICJkZXNjcmlwdGlvbiIgKQorICogICAgICAgdXNlZCB0byBkZWZpbmUgYSBub24tY29uZmlnIGZsYWcgb3B0aW9uLgorICogICAgICAgKiAnbmFtZScgaXMgdGhlIG9wdGlvbiBzdWZmaXggdGhhdCBtdXN0IGZvbGxvdyB0aGUgZGFzaCAoLSkKKyAqICAgICAgICAgIGFzIHdlbGwgYXMgdGhlIG5hbWUgb2YgYW4gaW50ZWdlciB2YXJpYWJsZSB3aG9zZSB2YWx1ZSB3aWxsCisgKiAgICAgICAgICBiZSAxIGlmIHRoZSBmbGFnIGlzIHVzZWQsIG9yIDAgb3RoZXJ3aXNlLgorICogICAgICAgKiAiZGVzY3JpcHRpb24iIGlzIGEgc2hvcnQgZGVzY3JpcHRpb24gc3RyaW5nIHRoYXQgd2lsbCBiZQorICogICAgICAgICBkaXNwbGF5ZWQgYnkgJ2VtdWxhdG9yIC1oZWxwJy4KKyAqCisgKiAgICBPUFRfUEFSQU0oIG5hbWUsICI8cGFyYW0+IiwgImRlc2NyaXB0aW9uIiApCisgKiAgICAgICB1c2VkIHRvIGRlZmluZSBhIG5vbi1jb25maWcgcGFyYW1ldGVyIG9wdGlvbgorICogICAgICAgICogJ25hbWUnIHdpbGwgcG9pbnQgdG8gYSBjaGFyKiB2YXJpYWJsZSAoTlVMTCBpZiBvcHRpb24gaXMgdW51c2VkKQorICogICAgICAgICogIjxwYXJhbT4iIGlzIGEgdGVtcGxhdGUgZm9yIHRoZSBwYXJhbWV0ZXIgZGlzcGxheWVkIGJ5IHRoZSBoZWxwCisgKiAgICAgICAgKiAndmFybmFtZScgaXMgdGhlIG5hbWUgb2YgYSBjaGFyKiB2YXJpYWJsZSB0aGF0IHdpbGwgcG9pbnQKKyAqICAgICAgICAgIHRvIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLCBpZiBhbnksIG9yIHdpbGwgYmUgTlVMTCBvdGhlcndpc2UuCisgKgorICogICAgQ0ZHX0ZMQUcoIG5hbWUsICJkZXNjcmlwdGlvbiIgKQorICogICAgICAgIHVzZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbi1zcGVjaWZpYyBmbGFnIG9wdGlvbi4KKyAqCisgKiAgICBDRkdfUEFSQU0oIG5hbWUsICI8cGFyYW0+IiwgImRlc2NyaXB0aW9uIiApCisgKiAgICAgICAgdXNlZCB0byBkZWZpbmUgYSBjb25maWd1cmF0aW9uLXNwZWNpZmljIHBhcmFtZXRlciBvcHRpb24uCisgKgorICogTk9URTogS2VlcCBpbiBtaW5kIHRoYXQgb3B0aW8gbmFtZXMgYXJlIGNvbnZlcnRlZCBieSB0cmFuc2xhdGluZworICogICAgICAgZGFzaGVzIGludG8gdW5kZXJzY29yZS4KKyAqCisgKiAgICAgICBUaGlzIG1lYW5zIHRoYXQgJy1zb21lLW9wdGlvbicgaXMgZXF1aXZhbGVudCB0byAnLXNvbWVfb3B0aW9uJworICogICAgICAgYW5kIHdpbGwgYmUgYmFja2VkIGJ5IGEgdmFyaWFibGUgbmFtZSAnc29tZV9vcHRpb24nCisgKgorICovCisKK09QVF9GTEFHKCBsaXN0X2F2ZHMsICJsaXN0IGF2YWlsYWJsZSBBVkRzIikKK0NGR19QQVJBTSggc3lzZGlyLCAgIjxkaXI+IiwgICJzZWFyY2ggZm9yIHN5c3RlbSBkaXNrIGltYWdlcyBpbiA8ZGlyPiIgKQorQ0ZHX1BBUkFNKCBzeXN0ZW0sICAiPGZpbGU+IiwgInJlYWQgaW5pdGlhbCBzeXN0ZW0gaW1hZ2UgZnJvbSA8ZmlsZT4iICkKK0NGR19GTEFHICggd3JpdGFibGVfc3lzdGVtLCAibWFrZSBzeXN0ZW0gaW1hZ2Ugd3JpdGFibGUgYWZ0ZXIgJ2FkYiByZW1vdW50JyIgKQorQ0ZHX1BBUkFNKCBkYXRhZGlyLCAiPGRpcj4iLCAgIndyaXRlIHVzZXIgZGF0YSBpbnRvIDxkaXI+IiApCitDRkdfUEFSQU0oIGtlcm5lbCwgICI8ZmlsZT4iLCAidXNlIHNwZWNpZmljIGVtdWxhdGVkIGtlcm5lbCIgKQorQ0ZHX1BBUkFNKCByYW1kaXNrLCAiPGZpbGU+IiwgInJhbWRpc2sgaW1hZ2UgKGRlZmF1bHQgPHN5c3RlbT4vcmFtZGlzay5pbWciICkKK0NGR19QQVJBTSggaW1hZ2UsICAgIjxmaWxlPiIsICJvYnNvbGV0ZSwgdXNlIC1zeXN0ZW0gPGZpbGU+IGluc3RlYWQiICkKK0NGR19QQVJBTSggaW5pdGRhdGEsICI8ZmlsZT4iLCAic2FtZSBhcyAnLWluaXQtZGF0YSA8ZmlsZT4nIiApCitDRkdfUEFSQU0oIGRhdGEsICAgICAiPGZpbGU+IiwgImRhdGEgaW1hZ2UgKGRlZmF1bHQgPGRhdGFkaXI+L3VzZXJkYXRhLXFlbXUuaW1nIiApCitDRkdfUEFSQU0oIHBhcnRpdGlvbl9zaXplLCAiPHNpemU+IiwgInN5c3RlbS9kYXRhIHBhcnRpdGlvbiBzaXplIGluIE1CcyIgKQorQ0ZHX1BBUkFNKCBjYWNoZSwgICAgIjxmaWxlPiIsICJjYWNoZSBwYXJ0aXRpb24gaW1hZ2UgKGRlZmF1bHQgaXMgdGVtcG9yYXJ5IGZpbGUpIiApCitPUFRfUEFSQU0oIGNhY2hlX3NpemUsICI8c2l6ZT4iLCAiY2FjaGUgcGFydGl0aW9uIHNpemUgaW4gTUJzIiApCitDRkdfRkxBRyAoIG5vX2NhY2hlLCAiZGlzYWJsZSB0aGUgY2FjaGUgcGFydGl0aW9uIiApCitDRkdfRkxBRyAoIG5vY2FjaGUsICAic2FtZSBhcyAtbm8tY2FjaGUiICkKK09QVF9QQVJBTSggc2RjYXJkLCAiPGZpbGU+IiwgIlNEIGNhcmQgaW1hZ2UgKGRlZmF1bHQgPGRhdGFkaXI+L3NkY2FyZC5pbWciKQorT1BUX1BBUkFNKCBzbmFwc3RvcmFnZSwgICAgIjxmaWxlPiIsICJmaWxlIHRoYXQgY29udGFpbnMgYWxsIHN0YXRlIHNuYXBzaG90cyAoZGVmYXVsdCA8ZGF0YWRpcj4vc25hcHNob3RzLmltZykiKQorT1BUX0ZMQUcgKCBub19zbmFwc3RvcmFnZSwgImRvIG5vdCBtb3VudCBhIHNuYXBzaG90IHN0b3JhZ2UgZmlsZSAodGhpcyBkaXNhYmxlcyBhbGwgc25hcHNob3QgZnVuY3Rpb25hbGl0eSkiICkKK09QVF9QQVJBTSggc25hcHNob3QsICAgICAgICI8bmFtZT4iLCAibmFtZSBvZiBzbmFwc2hvdCB3aXRoaW4gc3RvcmFnZSBmaWxlIGZvciBhdXRvLXN0YXJ0IGFuZCBhdXRvLXNhdmUgKGRlZmF1bHQgJ2RlZmF1bHQtYm9vdCcpIiApCitPUFRfRkxBRyAoIG5vX3NuYXBzaG90LCAgICAicGVyZm9ybSBhIGZ1bGwgYm9vdCBhbmQgZG8gbm90IGRvIG5vdCBhdXRvLXNhdmUsIGJ1dCBxZW11IHZtbG9hZCBhbmQgdm1zYXZlIG9wZXJhdGUgb24gc25hcHN0b3JhZ2UiICkKK09QVF9GTEFHICggbm9fc25hcHNob3Rfc2F2ZSwgImRvIG5vdCBhdXRvLXNhdmUgdG8gc25hcHNob3Qgb24gZXhpdDogYWJhbmRvbiBjaGFuZ2VkIHN0YXRlIiApCitPUFRfRkxBRyAoIG5vX3NuYXBzaG90X2xvYWQsICJkbyBub3QgYXV0by1zdGFydCBmcm9tIHNuYXBzaG90OiBwZXJmb3JtIGEgZnVsbCBib290IiApCitPUFRfRkxBRyAoIHNuYXBzaG90X2xpc3QsICAic2hvdyBhIGxpc3Qgb2YgYXZhaWxhYmxlIHNuYXBzaG90cyIgKQorT1BUX0ZMQUcgKCBub19zbmFwc2hvdF91cGRhdGVfdGltZSwgImRvIG5vdCBkbyB0cnkgdG8gY29ycmVjdCBzbmFwc2hvdCB0aW1lIG9uIHJlc3RvcmUiICkKK09QVF9GTEFHICggd2lwZV9kYXRhLCAicmVzZXQgdGhlIHVzZXIgZGF0YSBpbWFnZSAoY29weSBpdCBmcm9tIGluaXRkYXRhKSIgKQorQ0ZHX1BBUkFNKCBhdmQsICI8bmFtZT4iLCAidXNlIGEgc3BlY2lmaWMgYW5kcm9pZCB2aXJ0dWFsIGRldmljZSIgKQorQ0ZHX1BBUkFNKCBza2luZGlyLCAiPGRpcj4iLCAic2VhcmNoIHNraW5zIGluIDxkaXI+IChkZWZhdWx0IDxzeXN0ZW0+L3NraW5zKSIgKQorQ0ZHX1BBUkFNKCBza2luLCAiPG5hbWU+IiwgInNlbGVjdCBhIGdpdmVuIHNraW4iICkKK0NGR19GTEFHICggbm9fc2tpbiwgImRlcHJlY2F0ZWQ6IGNyZWF0ZSBhbiBBVkQgd2l0aCBubyBza2luIGluc3RlYWQiICkKK0NGR19GTEFHICggbm9za2luLCAic2FtZSBhcyAtbm8tc2tpbiIgKQorQ0ZHX1BBUkFNKCBtZW1vcnksICI8c2l6ZT4iLCAicGh5c2ljYWwgUkFNIHNpemUgaW4gTUJzIiApCisKK09QVF9QQVJBTSggYWNjZWwsICI8bW9kZT4iLCAiQ29uZmlndXJlIGVtdWxhdGlvbiBhY2NlbGVyYXRpb24iICkKK09QVF9GTEFHICggbm9fYWNjZWwsICJTYW1lIGFzICctYWNjZWwgb2ZmJyIgKQorT1BUX0ZMQUcgKCByYW5jaHUsICJVc2UgbmV3IGVtdWxhdG9yIGJhY2tlbmQgaW5zdGVhZCBvZiB0aGUgY2xhc3NpYyBvbmUiICkKK09QVF9QQVJBTSggZW5naW5lLCAiPGVuZ2luZT4iLCAiU2VsZWN0IGVuZ2luZS4gYXV0b3xjbGFzc2ljfHFlbXUyIiApCisKK09QVF9QQVJBTSggbmV0c3BlZWQsICI8c3BlZWQ+IiwgIm1heGltdW0gbmV0d29yayBkb3dubG9hZC91cGxvYWQgc3BlZWRzIiApCitPUFRfUEFSQU0oIG5ldGRlbGF5LCAiPGRlbGF5PiIsICJuZXR3b3JrIGxhdGVuY3kgZW11bGF0aW9uIiApCitPUFRfRkxBRyAoIG5ldGZhc3QsICJkaXNhYmxlIG5ldHdvcmsgc2hhcGluZyIgKQorCitPUFRfUEFSQU0oIGNvZGVfcHJvZmlsZSwgIjxuYW1lPiIsICJlbmFibGUgY29kZSBwcm9maWxpbmciICkKK09QVF9GTEFHICggc2hvd19rZXJuZWwsICJkaXNwbGF5IGtlcm5lbCBtZXNzYWdlcyIgKQorT1BUX0ZMQUcgKCBzaGVsbCwgImVuYWJsZSByb290IHNoZWxsIG9uIGN1cnJlbnQgdGVybWluYWwiICkKK09QVF9GTEFHICggbm9fam5pLCAiZGlzYWJsZSBKTkkgY2hlY2tzIGluIHRoZSBEYWx2aWsgcnVudGltZSIgKQorT1BUX0ZMQUcgKCBub2puaSwgInNhbWUgYXMgLW5vLWpuaSIgKQorT1BUX1BBUkFNKCBsb2djYXQsICI8dGFncz4iLCAiZW5hYmxlIGxvZ2NhdCBvdXRwdXQgd2l0aCBnaXZlbiB0YWdzIiApCisKKyNpZmRlZiBfX2xpbnV4X18KK09QVF9GTEFHICggdXNlX3N5c3RlbV9saWJzLCAiVXNlIHN5c3RlbSBsaWJzdGRjKysgaW5zdGVhZCBvZiBidW5kbGVkIG9uZSIgKQorI2VuZGlmICAvLyBfX2xpbnV4X18KKworT1BUX0ZMQUcgKCBub19hdWRpbywgImRpc2FibGUgYXVkaW8gc3VwcG9ydCIgKQorT1BUX0ZMQUcgKCBub2F1ZGlvLCAgInNhbWUgYXMgLW5vLWF1ZGlvIiApCitPUFRfUEFSQU0oIGF1ZGlvLCAgICAiPGJhY2tlbmQ+IiwgInVzZSBzcGVjaWZpYyBhdWRpbyBiYWNrZW5kIiApCisKK09QVF9QQVJBTSggcmFkaW8sICI8ZGV2aWNlPiIsICJyZWRpcmVjdCByYWRpbyBtb2RlbSBpbnRlcmZhY2UgdG8gY2hhcmFjdGVyIGRldmljZSIgKQorT1BUX1BBUkFNKCBwb3J0LCAiPHBvcnQ+IiwgIlRDUCBwb3J0IHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgY29uc29sZSIgKQorT1BUX1BBUkFNKCBwb3J0cywgIjxjb25zb2xlcG9ydD4sPGFkYnBvcnQ+IiwgIlRDUCBwb3J0cyB1c2VkIGZvciB0aGUgY29uc29sZSBhbmQgYWRiIGJyaWRnZSIgKQorT1BUX1BBUkFNKCBvbmlvbiwgIjxpbWFnZT4iLCAidXNlIG92ZXJsYXkgUE5HIGltYWdlIG92ZXIgc2NyZWVuIiApCitPUFRfUEFSQU0oIG9uaW9uX2FscGhhLCAiPCVhZ2U+IiwgInNwZWNpZnkgb25pb24tc2tpbiB0cmFuc2x1Y2VuY3kiICkKK09QVF9QQVJBTSggb25pb25fcm90YXRpb24sICIwfDF8MnwzIiwgInNwZWNpZnkgb25pb24tc2tpbiByb3RhdGlvbiIgKQorCitPUFRfUEFSQU0oIGRwaV9kZXZpY2UsICI8ZHBpPiIsICJzcGVjaWZ5IGRldmljZSdzIHJlc29sdXRpb24gaW4gZHBpIChkZWZhdWx0ICIKKyAgICAgICAgICAgIFNUUklOR0lGWShERUZBVUxUX0RFVklDRV9EUEkpICIpIiApCitPUFRfUEFSQU0oIHNjYWxlLCAiPHNjYWxlPiIsICJzY2FsZSBlbXVsYXRvciB3aW5kb3cgKGRlcHJlY2F0ZWQpIiApCisKK09QVF9QQVJBTSggaHR0cF9wcm94eSwgIjxwcm94eT4iLCAibWFrZSBUQ1AgY29ubmVjdGlvbnMgdGhyb3VnaCBhIEhUVFAvSFRUUFMgcHJveHkiICkKK09QVF9QQVJBTSggdGltZXpvbmUsICI8dGltZXpvbmU+IiwgInVzZSB0aGlzIHRpbWV6b25lIGluc3RlYWQgb2YgdGhlIGhvc3QncyBkZWZhdWx0IiApCitPUFRfUEFSQU0oIGRuc19zZXJ2ZXIsICI8c2VydmVycz4iLCAidXNlIHRoaXMgRE5TIHNlcnZlcihzKSBpbiB0aGUgZW11bGF0ZWQgc3lzdGVtIiApCitPUFRfUEFSQU0oIGNwdV9kZWxheSwgIjxjcHVkZWxheT4iLCAidGhyb3R0bGUgQ1BVIGVtdWxhdGlvbiIgKQorT1BUX0ZMQUcgKCBub19ib290X2FuaW0sICJkaXNhYmxlIGFuaW1hdGlvbiBmb3IgZmFzdGVyIGJvb3QiICkKKworT1BUX0ZMQUcoIG5vX3dpbmRvdywgImRpc2FibGUgZ3JhcGhpY2FsIHdpbmRvdyBkaXNwbGF5IiApCitPUFRfRkxBRyggdmVyc2lvbiwgImRpc3BsYXkgZW11bGF0b3IgdmVyc2lvbiBudW1iZXIiICkKKworT1BUX1BBUkFNKCByZXBvcnRfY29uc29sZSwgIjxzb2NrZXQ+IiwgInJlcG9ydCBjb25zb2xlIHBvcnQgdG8gcmVtb3RlIHNvY2tldCIgKQorT1BUX1BBUkFNKCBncHMsICI8ZGV2aWNlPiIsICJyZWRpcmVjdCBOTUVBIEdQUyB0byBjaGFyYWN0ZXIgZGV2aWNlIiApCitPUFRfUEFSQU0oIHNoZWxsX3NlcmlhbCwgIjxkZXZpY2U+IiwgInNwZWNpZmljIGNoYXJhY3RlciBkZXZpY2UgZm9yIHJvb3Qgc2hlbGwiICkKK09QVF9QQVJBTSggdGNwZHVtcCwgIjxmaWxlPiIsICJjYXB0dXJlIG5ldHdvcmsgcGFja2V0cyB0byBmaWxlIiApCisKK09QVF9QQVJBTSggYm9vdGNoYXJ0LCAiPHRpbWVvdXQ+IiwgImVuYWJsZSBib290Y2hhcnRpbmciKQorCitPUFRfUEFSQU0oIGNoYXJtYXAsICI8ZmlsZT4iLCAidXNlIHNwZWNpZmljIGtleSBjaGFyYWN0ZXIgbWFwIikKKworT1BUX0xJU1QoICBwcm9wLCAiPG5hbWU+PTx2YWx1ZT4iLCAic2V0IHN5c3RlbSBwcm9wZXJ0eSBvbiBib290IikKKworT1BUX1BBUkFNKCBzaGFyZWRfbmV0X2lkLCAiPG51bWJlcj4iLCAiam9pbiB0aGUgc2hhcmVkIG5ldHdvcmssIHVzaW5nIElQIGFkZHJlc3MgMTAuMS4yLjxudW1iZXI+IikKKworI2lmZGVmIENPTkZJR19OQU5EX0xJTUlUUworT1BUX1BBUkFNKCBuYW5kX2xpbWl0cywgIjxubGltaXRzPiIsICJlbmZvcmNlIE5BTkQvRmxhc2ggcmVhZC93cml0ZSB0aHJlc2hvbGRzIiApCisjZW5kaWYKKworT1BUX1BBUkFNKCBncHUsICI8bW9kZT4iLCAic2V0IGhhcmR3YXJlIE9wZW5HTEVTIGVtdWxhdGlvbiBtb2RlIiApCisKK09QVF9QQVJBTSggY2FtZXJhX2JhY2ssICI8bW9kZT4iLCAic2V0IGVtdWxhdGlvbiBtb2RlIGZvciBhIGNhbWVyYSBmYWNpbmcgYmFjayIgKQorT1BUX1BBUkFNKCBjYW1lcmFfZnJvbnQsICI8bW9kZT4iLCAic2V0IGVtdWxhdGlvbiBtb2RlIGZvciBhIGNhbWVyYSBmYWNpbmcgZnJvbnQiICkKK09QVF9GTEFHKCB3ZWJjYW1fbGlzdCwgImxpc3RzIHdlYiBjYW1lcmFzIGF2YWlsYWJsZSBmb3IgZW11bGF0aW9uIiApCisKK09QVF9QQVJBTSggc2NyZWVuLCAiPG1vZGU+IiwgInNldCBlbXVsYXRlZCBzY3JlZW4gbW9kZSIgKQorCitPUFRfRkxBRyggZm9yY2VfMzJiaXQsICJhbHdheXMgdXNlIDMyLWJpdCBlbXVsYXRvciIgKQorCitPUFRfUEFSQU0oc2VsaW51eCwgIjxkaXNhYmxlZHxwZXJtaXNzaXZlPiIsICJTZXQgU0VMaW51eCB0byBlaXRoZXIgZGlzYWJsZWQgb3IgcGVybWlzc2l2ZSBtb2RlIikKK09QVF9MSVNUKHVuaXhfcGlwZSwgIjxwYXRoPiIsICJBZGQgPHBhdGg+IHRvIHRoZSBsaXN0IG9mIGFsbG93ZWQgVW5peCBwaXBlcyIpCisKK0NGR19GTEFHIChmaXhlZF9zY2FsZSwgIlVzZSBmaXhlZCAxOjEgc2NhbGUgZm9yIHRoZSBpbml0aWFsIGVtdWxhdG9yIHdpbmRvdy4iKQorCitPUFRfRkxBRyh3YWl0X2Zvcl9kZWJ1Z2dlciwgIlBhdXNlIG9uIGxhdW5jaCBhbmQgd2FpdCBmb3IgYSBkZWJ1Z2dlciBwcm9jZXNzIHRvIGF0dGFjaCBiZWZvcmUgcmVzdW1pbmciKQorCitPUFRfRkxBRyhza2lwX2FkYl9hdXRoLCAiU2tpcCBhZGIgYXV0aGVudGljYXRpb24gZGlhbG9ndWUiKQorCisjdW5kZWYgQ0ZHX0ZMQUcKKyN1bmRlZiBDRkdfUEFSQU0KKyN1bmRlZiBPUFRfRkxBRworI3VuZGVmIE9QVF9QQVJBTQorI3VuZGVmIE9QVF9MSVNUCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uZmlnL2NvbmZpZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbmZpZy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAyMDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbmZpZy9jb25maWcuaApAQCAtMCwwICsxLDEyIEBACisvKiBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgdGFyZ2V0LXNwZWNpZmljIGZpbGVzIHVuZGVyCisgKiBhbmRyb2lkL2NvbmZpZy90YXJnZXQtJEFSQ0gvY29uZmlnLmgsIGJ1dCBjb250YWlucyBhbGwgY29uZmlnCisgKiBkZWZpbml0aW9ucyB0aGF0IGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgdGFyZ2V0IENQVS4KKyAqCisgKiBEbyBub3QgaW5jbHVkZSBkaXJlY3RseS4KKyAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisKKyNkZWZpbmUgQ09ORklHX1NPRlRNTVUgMQorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgQ09ORklHX05BTkRfTElNSVRTIDEKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGUuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jb25zb2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMmI4MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jb25zb2xlLmMKQEAgLTAsMCArMSwyOTA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisvKgorICogIEFuZHJvaWQgZW11bGF0b3IgY29udHJvbCBjb25zb2xlCisgKgorICogIHRoaXMgY29uc29sZSBpcyBlbmFibGVkIGF1dG9tYXRpY2FsbHkgYXQgZW11bGF0b3Igc3RhcnR1cCwgb24gcG9ydCA1NTU0IGJ5IGRlZmF1bHQsCisgKiAgdW5sZXNzIHNvbWUgb3RoZXIgZW11bGF0b3IgaXMgYWxyZWFkeSBydW5uaW5nLiBTZWUgKGFuZHJvaWRfZW11bGF0aW9uX3N0YXJ0IGluIGFuZHJvaWRfc2RsLmMKKyAqICBmb3IgZGV0YWlscykKKyAqCisgKiAgeW91IGNhbiB0ZWxuZXQgdG8gdGhlIGNvbnNvbGUsIHRoZW4gdXNlIGNvbW1hbmRzIGxpa2UgJ2hlbHAnIG9yIG90aGVycyB0byBkeW5hbWljYWxseQorICogIGNoYW5nZSBlbXVsYXRvciBzZXR0aW5ncy4KKyAqCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvY29uc29sZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9hbmRyb2lkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jbWRsaW5lLW9wdGlvbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvY29uc29sZV9hdXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ody1ldmVudHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LXNlbnNvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29udHJvbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2hhcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2NoYXJtYXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RjcGR1bXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaHR0cF91dGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaXBhZGRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy91dGY4X3V0aWxzLmgiCisKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgIERFQlVHICAxCisKKyNpZiAxCisjICBkZWZpbmUgIERfQUNUSVZFICAgVkVSQk9TRV9DSEVDSyhjb25zb2xlKQorI2Vsc2UKKyMgIGRlZmluZSAgRF9BQ1RJVkUgICBERUJVRworI2VuZGlmCisKKyNpZiBERUJVRworIyAgZGVmaW5lICBEKHgpICAgZG8geyBpZiAoRF9BQ1RJVkUpICggcHJpbnRmIHggLCBmZmx1c2goc3Rkb3V0KSApOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSAgRCh4KSAgIGRve313aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgRElOSVQoLi4uKSBkbyB7ICBpZiAoVkVSQk9TRV9DSEVDSyhpbml0KSkgZHByaW50KF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKwordHlwZWRlZiBzdHJ1Y3QgQ29udHJvbEdsb2JhbFJlY18qICBDb250cm9sR2xvYmFsOworCit0eXBlZGVmIHN0cnVjdCBDb250cm9sQ2xpZW50UmVjXyogIENvbnRyb2xDbGllbnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgIGhvc3RfcG9ydDsKKyAgICBpbnQgICAgICAgICAgIGhvc3RfdWRwOworICAgIHVuc2lnbmVkIGludCAgZ3Vlc3RfaXA7CisgICAgaW50ICAgICAgICAgICBndWVzdF9wb3J0OworfSBSZWRpclJlYywgKlJlZGlyOworCisKK3R5cGVkZWYgaW50IFNvY2tldDsKK3R5cGVkZWYgY29uc3Qgc3RydWN0IENvbW1hbmREZWZSZWNfKiBDb21tYW5kRGVmOworCit0eXBlZGVmIHN0cnVjdCBDb250cm9sQ2xpZW50UmVjXworeworICAgIHN0cnVjdCBDb250cm9sQ2xpZW50UmVjXyogIG5leHQ7ICAgICAgIC8qIG5leHQgY2xpZW50IGluIGxpc3QgICAgICAgICAgICovCisgICAgU29ja2V0ICAgICAgICAgICAgICAgICAgICAgc29jazsgICAgICAgLyogc29ja2V0IHVzZWQgZm9yIGNvbW11bmljYXRpb24gKi8KKyAgICAvLyBUaGUgbG9vcElvIGN1cnJlbnRseSBjb21tdW5pY2F0aW5nIG92ZXIgfHNvY2t8LiBNYXkgY2hhbmdlIG92ZXIgdGhlCisgICAgLy8gbGlmZXRpbWUgb2YgYSBDb250cm9sQ2xpZW50LgorICAgIExvb3BJbyogbG9vcElvOworICAgIENvbnRyb2xHbG9iYWwgICAgICAgICAgICAgIGdsb2JhbDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICBidWZmWyA0MDk2IF07CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYnVmZl9sZW47CisgICAgQ29tbWFuZERlZiAgICAgICAgICAgICAgICAgY29tbWFuZHM7Cit9IENvbnRyb2xDbGllbnRSZWM7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ29udHJvbEdsb2JhbFJlY18KK3sKKyAgICAvLyBJbnRlcmZhY2VzIHRvIGNhbGwgaW50byBRRU1VIHNwZWNpZmljIGNvZGUuCisjZGVmaW5lIEFORFJPSURfQ09OU09MRV9ERUZJTkVfRklFTEQodHlwZSwgbmFtZSkgdHlwZSBuYW1lICMjIF9hZ2VudCBbMV07CisgICAgQU5EUk9JRF9DT05TT0xFX0FHRU5UU19MSVNUKEFORFJPSURfQ09OU09MRV9ERUZJTkVfRklFTEQpCisKKyAgICAvKiBJTyAqLworICAgIExvb3BlciogbG9vcGVyOworICAgIExvb3BJbyogbGlzdGVuNF9sb29waW87CisgICAgTG9vcElvKiBsaXN0ZW42X2xvb3BpbzsKKworICAgIC8qIHRoZSBsaXN0IG9mIGN1cnJlbnQgY2xpZW50cyAqLworICAgIENvbnRyb2xDbGllbnQgICBjbGllbnRzOworCisgICAgLyogdGhlIGxpc3Qgb2YgcmVkaXJlY3Rpb25zIGN1cnJlbnRseSBhY3RpdmUgKi8KKyAgICBSZWRpciAgICAgcmVkaXJzOworICAgIGludCAgICAgICBudW1fcmVkaXJzOworICAgIGludCAgICAgICBtYXhfcmVkaXJzOworCit9IENvbnRyb2xHbG9iYWxSZWM7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgUUFuZHJvaWRWbU9wZXJhdGlvbnMqIHZtb3BlcnMoQ29udHJvbENsaWVudCBjbGllbnQpIHsKKyAgICByZXR1cm4gY2xpZW50LT5nbG9iYWwtPnZtX2FnZW50OworfQorCisvLy8vLy8vLy8vLy8gTW9kdWxlIGxldmVsIGdsb2JhbHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBDb250cm9sR2xvYmFsUmVjIF9nX2dsb2JhbDsKKworc3RhdGljIGludAorY29udHJvbF9nbG9iYWxfYWRkX3JlZGlyKCBDb250cm9sR2xvYmFsICBnbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhvc3RfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaG9zdF91ZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgIGd1ZXN0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBndWVzdF9wb3J0ICkKK3sKKyAgICBSZWRpciAgcmVkaXI7CisKKyAgICBpZiAoZ2xvYmFsLT5udW1fcmVkaXJzID49IGdsb2JhbC0+bWF4X3JlZGlycykKKyAgICB7CisgICAgICAgIGludCAgb2xkX21heCA9IGdsb2JhbC0+bWF4X3JlZGlyczsKKyAgICAgICAgaW50ICBuZXdfbWF4ID0gb2xkX21heCArIChvbGRfbWF4ID4+IDEpICsgNDsKKworICAgICAgICBSZWRpciAgbmV3X3JlZGlycyA9IHJlYWxsb2MoIGdsb2JhbC0+cmVkaXJzLCBuZXdfbWF4KnNpemVvZihnbG9iYWwtPnJlZGlyc1swXSkgKTsKKyAgICAgICAgaWYgKG5ld19yZWRpcnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBnbG9iYWwtPnJlZGlycyAgICAgPSBuZXdfcmVkaXJzOworICAgICAgICBnbG9iYWwtPm1heF9yZWRpcnMgPSBuZXdfbWF4OworICAgIH0KKworICAgIHJlZGlyID0gJmdsb2JhbC0+cmVkaXJzWyBnbG9iYWwtPm51bV9yZWRpcnMrKyBdOworCisgICAgcmVkaXItPmhvc3RfcG9ydCAgPSBob3N0X3BvcnQ7CisgICAgcmVkaXItPmhvc3RfdWRwICAgPSBob3N0X3VkcDsKKyAgICByZWRpci0+Z3Vlc3RfaXAgICA9IGd1ZXN0X2lwOworICAgIHJlZGlyLT5ndWVzdF9wb3J0ID0gZ3Vlc3RfcG9ydDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citjb250cm9sX2dsb2JhbF9kZWxfcmVkaXIoIENvbnRyb2xHbG9iYWwgIGdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaG9zdF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBob3N0X3VkcCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGdsb2JhbC0+bnVtX3JlZGlyczsgbm4rKykKKyAgICB7CisgICAgICAgIFJlZGlyICByZWRpciA9ICZnbG9iYWwtPnJlZGlyc1tubl07CisKKyAgICAgICAgaWYgKCByZWRpci0+aG9zdF9wb3J0ID09IGhvc3RfcG9ydCAmJgorICAgICAgICAgICAgIHJlZGlyLT5ob3N0X3VkcCAgPT0gaG9zdF91ZHAgICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtbW92ZSggcmVkaXIsIHJlZGlyICsgMSwgKChnbG9iYWwtPm51bV9yZWRpcnMgLSBubiktMSkqc2l6ZW9mKCpyZWRpcikgKTsKKyAgICAgICAgICAgIGdsb2JhbC0+bnVtX3JlZGlycyAtPSAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogd2UgZGlkbid0IGZpbmQgaXQgKi8KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIERldGFjaCB0aGUgc29ja2V0IGRlc2NyaXB0b3IgZnJvbSBhIGdpdmVuIENvbnRyb2xDbGllbnQKKyAqIGFuZCByZXR1cm4gaXRzIHZhbHVlLiBUaGlzIGlzIHVzZWZ1bCBlaXRoZXIgd2hlbiBkZXN0cm95aW5nCisgKiB0aGUgY2xpZW50LCBvciByZWRpcmVjdGluZyB0aGUgc29ja2V0IHRvIGFub3RoZXIgc2VydmljZS4KKyAqCisgKiBOT1RFOiB0aGlzIGRvZXMgbm90IGNsb3NlIHRoZSBzb2NrZXQuCisgKi8KK3N0YXRpYyBpbnQKK2NvbnRyb2xfY2xpZW50X2RldGFjaCggQ29udHJvbENsaWVudCAgY2xpZW50ICkKK3sKKyAgICBpbnQgIHJlc3VsdDsKKworICAgIGlmIChjbGllbnQtPnNvY2sgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBsb29wSW9fZnJlZShjbGllbnQtPmxvb3BJbyk7CisgICAgY2xpZW50LT5sb29wSW8gPSBOVUxMOworICAgIHJlc3VsdCA9IGNsaWVudC0+c29jazsKKyAgICBjbGllbnQtPnNvY2sgPSAtMTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCitjb250cm9sX2NsaWVudF9kZXN0cm95KCBDb250cm9sQ2xpZW50ICBjbGllbnQgKQoreworICAgIENvbnRyb2xHbG9iYWwgIGdsb2JhbCA9IGNsaWVudC0+Z2xvYmFsOworICAgIENvbnRyb2xDbGllbnQgICpwbm9kZSA9ICZnbG9iYWwtPmNsaWVudHM7CisgICAgaW50ICAgICAgICAgICAgc29jazsKKworICAgIEQoKCAiZGVzdHJveWluZyBjb250cm9sIGNsaWVudCAlcFxuIiwgY2xpZW50ICkpOworCisgICAgc29jayA9IGNvbnRyb2xfY2xpZW50X2RldGFjaCggY2xpZW50ICk7CisgICAgaWYgKHNvY2sgPj0gMCkKKyAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2spOworCisgICAgZm9yICggOzsgKSB7CisgICAgICAgIENvbnRyb2xDbGllbnQgIG5vZGUgPSAqcG5vZGU7CisgICAgICAgIGlmICggbm9kZSA9PSBOVUxMICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIG5vZGUgPT0gY2xpZW50ICkgeworICAgICAgICAgICAgKnBub2RlICAgICA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBub2RlID0gJm5vZGUtPm5leHQ7CisgICAgfQorCisgICAgZnJlZSggY2xpZW50ICk7Cit9CisKKy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEaWZmZXJlbnQgd3JpdGUgY2FsbGJhY2tzIHVzZWQgdG8gcmVwb3J0IGJhY2sgdG8gdGhlIGNsaWVudC4KKworc3RhdGljIHZvaWQgIGNvbnRyb2xfY29udHJvbF93cml0ZSggQ29udHJvbENsaWVudCAgY2xpZW50LCBjb25zdCBjaGFyKiAgYnVmZiwgaW50ICBsZW4gKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgbGVuID0gc3RybGVuKGJ1ZmYpOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgcmV0ID0gSEFORExFX0VJTlRSKHNvY2tldF9zZW5kKCBjbGllbnQtPnNvY2ssIGJ1ZmYsIGxlbikpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVXT1VMREJMT0NLICYmIGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmICs9IHJldDsKKyAgICAgICAgICAgIGxlbiAgLT0gcmV0OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50ICBjb250cm9sX3Z3cml0ZSggQ29udHJvbENsaWVudCAgY2xpZW50LCBjb25zdCBjaGFyKiAgZm9ybWF0LCB2YV9saXN0IGFyZ3MgKQoreworICAgIHN0YXRpYyBjaGFyICB0ZW1wWzEwMjRdOworICAgIGludCByZXQgPSB2c25wcmludGYoIHRlbXAsIHNpemVvZih0ZW1wKSwgZm9ybWF0LCBhcmdzICk7CisgICAgdGVtcFsgc2l6ZW9mKHRlbXApLTEgXSA9IDA7CisgICAgY29udHJvbF9jb250cm9sX3dyaXRlKCBjbGllbnQsIHRlbXAsIC0xICk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50ICBjb250cm9sX3dyaXRlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApCit7CisgICAgaW50IHJldDsKKyAgICB2YV9saXN0ICAgICAgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHJldCA9IGNvbnRyb2xfdndyaXRlKGNsaWVudCwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbnRyb2xfd3JpdGVfb3V0X2NiKHZvaWQqIG9wYXF1ZSwgY29uc3QgY2hhciogc3RyLCBpbnQgc3Ryc2l6ZSkgeworICAgIENvbnRyb2xDbGllbnQgY2xpZW50ID0gb3BhcXVlOworICAgIGNvbnRyb2xfY29udHJvbF93cml0ZShjbGllbnQsIHN0ciwgc3Ryc2l6ZSk7CisgICAgcmV0dXJuIHN0cnNpemU7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbF93cml0ZV9lcnJfY2Iodm9pZCogb3BhcXVlLCBjb25zdCBjaGFyKiBzdHIsIGludCBzdHJzaXplKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgQ29udHJvbENsaWVudCBjbGllbnQgPSBvcGFxdWU7CisgICAgcmV0ICs9IGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086ICIpOworICAgIGNvbnRyb2xfY29udHJvbF93cml0ZShjbGllbnQsIHN0ciwgc3Ryc2l6ZSk7CisgICAgcmV0dXJuIHJldCArIHN0cnNpemU7Cit9CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3N0YXRpYyB2b2lkIGNvbnRyb2xfY2xpZW50X3JlYWQodm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cyk7CisKK3R5cGVkZWYgY29uc3Qgc3RydWN0IENvbW1hbmREZWZSZWNfKiBDb21tYW5kRGVmOworCit0eXBlZGVmIHN0cnVjdCBDb21tYW5kRGVmUmVjXyB7CisgICAgY29uc3QgY2hhciogbmFtZXM7CisgICAgY29uc3QgY2hhciogYWJzdHJhY3Q7CisgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb247CisgICAgdm9pZCAoKmRlc2NyaXB0b3IpKENvbnRyb2xDbGllbnQgY2xpZW50KTsKKyAgICBpbnQgKCpoYW5kbGVyKShDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciogYXJncyk7CisgICAgQ29tbWFuZERlZiBzdWJjb21tYW5kczsgLyogaWYgaGFuZGxlciBpcyBOVUxMICovCisKK30gQ29tbWFuZERlZlJlYzsKKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgbWFpbl9jb21tYW5kc1tdOyAgICAgICAgIC8qIGZvcndhcmQgKi8KK3N0YXRpYyBjb25zdCBDb21tYW5kRGVmUmVjIG1haW5fY29tbWFuZHNfcHJlYXV0aFtdOyAvKiBmb3J3YXJkICovCisKK3N0YXRpYyBDb250cm9sQ2xpZW50Citjb250cm9sX2NsaWVudF9jcmVhdGUoIFNvY2tldCAgICAgICAgIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEdsb2JhbCAgZ2xvYmFsICkKK3sKKyAgICBDb250cm9sQ2xpZW50ICBjbGllbnQgPSBjYWxsb2MoIHNpemVvZigqY2xpZW50KSwgMSApOworCisgICAgaWYgKGNsaWVudCkgeworICAgICAgICBzb2NrZXRfc2V0X25vZGVsYXkoIHNvY2tldCApOworICAgICAgICBzb2NrZXRfc2V0X25vbmJsb2NrKCBzb2NrZXQgKTsKKyAgICAgICAgY2xpZW50LT5jb21tYW5kcyA9IG1haW5fY29tbWFuZHNfcHJlYXV0aDsKKyAgICAgICAgY2xpZW50LT5maW5pc2hlZCA9IDA7CisgICAgICAgIGNsaWVudC0+Z2xvYmFsICA9IGdsb2JhbDsKKyAgICAgICAgY2xpZW50LT5zb2NrICAgID0gc29ja2V0OworICAgICAgICBjbGllbnQtPmxvb3BJbyA9CisgICAgICAgICAgICAgICAgbG9vcElvX25ldyhnbG9iYWwtPmxvb3Blciwgc29ja2V0LCBjb250cm9sX2NsaWVudF9yZWFkLCBjbGllbnQpOworICAgICAgICBjbGllbnQtPm5leHQgICAgPSBnbG9iYWwtPmNsaWVudHM7CisgICAgICAgIGdsb2JhbC0+Y2xpZW50cyA9IGNsaWVudDsKKworICAgICAgICBsb29wSW9fd2FudFJlYWQoY2xpZW50LT5sb29wSW8pOworICAgICAgICBsb29wSW9fZG9udFdhbnRXcml0ZShjbGllbnQtPmxvb3BJbyk7CisgICAgfQorICAgIHJldHVybiBjbGllbnQ7Cit9CisKK3N0YXRpYyBDb21tYW5kRGVmCitmaW5kX2NvbW1hbmQoIGNoYXIqICBpbnB1dCwgQ29tbWFuZERlZiAgY29tbWFuZHMsIGNoYXIqICAqcGVuZCwgY2hhciogICpwYXJncyApCit7CisgICAgaW50ICAgIG5uOworICAgIGNoYXIqICBhcmdzID0gc3RyY2hyKGlucHV0LCAnICcpOworCisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICB3aGlsZSAoKmFyZ3MgPT0gJyAnKQorICAgICAgICAgICAgYXJncysrOworCisgICAgICAgIGlmIChhcmdzWzBdID09IDApCisgICAgICAgICAgICBhcmdzID0gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKG5uID0gMDsgY29tbWFuZHNbbm5dLm5hbWVzICE9IE5VTEw7IG5uKyspCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiAgbmFtZSA9IGNvbW1hbmRzW25uXS5uYW1lczsKKyAgICAgICAgY29uc3QgY2hhciogIHNlcDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQgIGxlbiwgYzsKKworICAgICAgICAgICAgc2VwID0gc3RyY2hyKCBuYW1lLCAnfCcgKTsKKyAgICAgICAgICAgIGlmIChzZXApCisgICAgICAgICAgICAgICAgbGVuID0gc2VwIC0gbmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4obmFtZSk7CisKKyAgICAgICAgICAgIGMgPSBpbnB1dFtsZW5dOworICAgICAgICAgICAgaWYgKCAhbWVtY21wKCBuYW1lLCBpbnB1dCwgbGVuICkgJiYgKGMgPT0gJyAnIHx8IGMgPT0gMCkgKSB7CisgICAgICAgICAgICAgICAgKnBlbmQgID0gaW5wdXQgKyBsZW47CisgICAgICAgICAgICAgICAgKnBhcmdzID0gYXJnczsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmNvbW1hbmRzW25uXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNlcCkKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VwICsgMTsKKworICAgICAgICB9IHdoaWxlIChzZXAgIT0gTlVMTCAmJiAqbmFtZSk7CisgICAgfQorICAgIC8qIE5PVEU6IGRvbid0IHRvdWNoICpwZW5kIGFuZCAqcGFyZ3MgaWYgbm8gY29tbWFuZCBpcyBmb3VuZCAqLworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9oZWxwKCBDb250cm9sQ2xpZW50ICBjbGllbnQsCisgICAgICAgICAgIENvbW1hbmREZWYgICAgIGNtZCwKKyAgICAgICAgICAgY29uc3QgY2hhciogICAgcHJlZml4ICkKK3sKKyAgICBpZiAoY21kLT5kZXNjcmlwdGlvbikgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIlcyIsIGNtZC0+ZGVzY3JpcHRpb24gKTsKKyAgICB9IGVsc2UgaWYgKGNtZC0+ZGVzY3JpcHRvcikgeworICAgICAgICBjbWQtPmRlc2NyaXB0b3IoIGNsaWVudCApOworICAgIH0gZWxzZQorICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIlc1xyXG4iLCBjbWQtPmFic3RyYWN0ICk7CisKKyAgICBpZiAoY21kLT5zdWJjb21tYW5kcykgeworICAgICAgICBjbWQgPSBjbWQtPnN1YmNvbW1hbmRzOworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJcclxuYXZhaWxhYmxlIHN1Yi1jb21tYW5kczpcclxuIiApOworICAgICAgICBmb3IgKCA7IGNtZC0+bmFtZXMgIT0gTlVMTDsgY21kKysgKSB7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgICAlcyAlLTE1cyAgJXNcclxuIiwgcHJlZml4LCBjbWQtPm5hbWVzLCBjbWQtPmFic3RyYWN0ICk7CisgICAgICAgIH0KKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiXHJcbiIgKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZG9fcXVpdChDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciogYXJncyk7ICAvLyBmb3J3YXJkCisKK3N0YXRpYyB2b2lkIGNvbnRyb2xfc2VuZF9oZWxwX3Byb21wdChDb250cm9sQ2xpZW50IGNsaWVudCkgeworICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LAorICAgICAgICAgICAgICAgICAgIkFuZHJvaWQgQ29uc29sZTogdHlwZSAnaGVscCcgZm9yIGEgbGlzdCBvZiBjb21tYW5kc1xyXG4iKTsKK30KKworc3RhdGljIHZvaWQgY29udHJvbF9jbGllbnRfZG9fY29tbWFuZChDb250cm9sQ2xpZW50IGNsaWVudCkgeworICAgIGNoYXIqICAgICAgIGxpbmUgICAgID0gY2xpZW50LT5idWZmOworICAgIGNoYXIqICAgICAgIGFyZ3MgICAgID0gTlVMTDsKKyAgICBDb21tYW5kRGVmICBjb21tYW5kcyA9IGNsaWVudC0+Y29tbWFuZHM7CisgICAgY2hhciogICAgICAgY21kZW5kICAgPSBjbGllbnQtPmJ1ZmY7CisgICAgQ29tbWFuZERlZiAgY21kID0gTlVMTDsKKworICAgIC8vIGRvIHNlY3VyaXR5IGNoZWNrcyBiZWZvcmUgZXhlY3V0aW5nIGZpbmRfY29tbWFuZAorICAgIHNpemVfdCBsaW5lX2xlbiA9IHN0cmxlbihsaW5lKTsKKyAgICBpZiAoYW5kcm9pZF9odHRwX2lzX3JlcXVlc3RfbGluZShsaW5lLCBsaW5lX2xlbikpIHsKKyAgICAgICAgY29udHJvbF93cml0ZShjbGllbnQsICJLTzogRm9yYmlkZGVuIEhUVFAgcmVxdWVzdC4gQWJvcnRpbmdcclxuIik7CisgICAgICAgIGRvX3F1aXQoY2xpZW50LCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoIWFuZHJvaWRfdXRmOF9pc192YWxpZChsaW5lLCBsaW5lX2xlbikpIHsKKyAgICAgICAgY29udHJvbF93cml0ZShjbGllbnQsICJLTzogRm9yYmlkZGVuIGJpbmFyeSByZXF1ZXN0LiBBYm9ydGluZ1xyXG4iKTsKKyAgICAgICAgZG9fcXVpdChjbGllbnQsIE5VTEwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY21kID0gZmluZF9jb21tYW5kKGxpbmUsIGNvbW1hbmRzLCAmY21kZW5kLCAmYXJncyk7CisKKyAgICBpZiAoY21kID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZShjbGllbnQsICJLTzogdW5rbm93biBjb21tYW5kLCB0cnkgJ2hlbHAnXHJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBDb21tYW5kRGVmICBzdWJjbWQ7CisKKyAgICAgICAgaWYgKGNtZC0+aGFuZGxlcikgeworICAgICAgICAgICAgaWYgKCAhY21kLT5oYW5kbGVyKCBjbGllbnQsIGFyZ3MgKSApIHsKKyAgICAgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJPS1xyXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vIGhhbmRsZXIgbWVhbnMgd2Ugc2hvdWxkIGhhdmUgc3ViLWNvbW1hbmRzICovCisgICAgICAgIGlmIChjbWQtPnN1YmNvbW1hbmRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBpbnRlcm5hbCBlcnJvcjogYnVnZ3kgY29tbWFuZCB0YWJsZSBmb3IgJyUuKnMnXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRlbmQgLSBjbGllbnQtPmJ1ZmYsIGNsaWVudC0+YnVmZiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSBuZWVkIGEgc3ViLWNvbW1hbmQgaGVyZSAqLworICAgICAgICBpZiAoICFhcmdzICkgeworICAgICAgICAgICAgZHVtcF9oZWxwKCBjbGllbnQsIGNtZCwgIiIgKTsKKyAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIHN1Yi1jb21tYW5kXHJcbiIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbGluZSAgICAgPSBhcmdzOworICAgICAgICBjb21tYW5kcyA9IGNtZC0+c3ViY29tbWFuZHM7CisgICAgICAgIHN1YmNtZCAgID0gZmluZF9jb21tYW5kKCBsaW5lLCBjb21tYW5kcywgJmNtZGVuZCwgJmFyZ3MgKTsKKyAgICAgICAgaWYgKHN1YmNtZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBkdW1wX2hlbHAoIGNsaWVudCwgY21kLCAiIiApOworICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086ICBiYWQgc3ViLWNvbW1hbmRcclxuIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY21kID0gc3ViY21kOworICAgIH0KK30KKworLyogaW1wbGVtZW50IHRoZSAnaGVscCcgY29tbWFuZCAqLworc3RhdGljIGludAorZG9faGVscCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgY2hhciogICAgICAgbGluZTsKKyAgICBjaGFyKiAgICAgICBzdGFydCA9IGFyZ3M7CisgICAgY2hhciogICAgICAgZW5kID0gc3RhcnQ7CisgICAgQ29tbWFuZERlZiAgY21kID0gY2xpZW50LT5jb21tYW5kczsKKworICAgIC8qIHdpdGhvdXQgYXJndW1lbnRzLCBzaW1wbHkgZHVtcCBhbGwgY29tbWFuZHMgKi8KKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIkFuZHJvaWQgY29uc29sZSBjb21tYW5kIGhlbHA6XHJcblxyXG4iICk7CisgICAgICAgIGZvciAoIDsgY21kLT5uYW1lcyAhPSBOVUxMOyBjbWQrKyApIHsKKyAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIiAgICAlLTE1cyAgJXNcclxuIiwgY21kLT5uYW1lcywgY21kLT5hYnN0cmFjdCApOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIlxyXG50cnkgJ2hlbHAgPGNvbW1hbmQ+JyBmb3IgY29tbWFuZC1zcGVjaWZpYyBoZWxwXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogd2l0aCBhbiBhcmd1bWVudCwgZmluZCB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kICovCisgICAgZm9yICg7OykgeworICAgICAgICBDb21tYW5kRGVmICBzdWJjbWQ7CisKKyAgICAgICAgbGluZSAgICA9IGFyZ3M7CisgICAgICAgIHN1YmNtZCAgPSBmaW5kX2NvbW1hbmQoIGxpbmUsIGNtZCwgJmVuZCwgJmFyZ3MgKTsKKyAgICAgICAgaWYgKHN1YmNtZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJ0cnkgb25lIG9mIHRoZXNlIGluc3RlYWQ6XHJcblxyXG4iICk7CisgICAgICAgICAgICBmb3IgKCA7IGNtZC0+bmFtZXMgIT0gTlVMTDsgY21kKysgKSB7CisgICAgICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiICAgICUuKnMgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCAtIHN0YXJ0LCBzdGFydCwgY21kLT5uYW1lcyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiXHJcbktPOiB1bmtub3duIGNvbW1hbmRcclxuIiApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCAhYXJncyB8fCAhc3ViY21kLT5zdWJjb21tYW5kcyApIHsKKyAgICAgICAgICAgIGR1bXBfaGVscCggY2xpZW50LCBzdWJjbWQsIHN0YXJ0ICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBjbWQgPSBzdWJjbWQtPnN1YmNvbW1hbmRzOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorY29udHJvbF9jbGllbnRfcmVhZF9ieXRlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIHVuc2lnbmVkIGNoYXIgIGNoICkKK3sKKyAgICBpZiAoY2ggPT0gJ1xyJykKKyAgICB7CisgICAgICAgIC8qIGZpbHRlciB0aGVtIG91dCAqLworICAgIH0KKyAgICBlbHNlIGlmIChjaCA9PSAnXG4nKQorICAgIHsKKyAgICAgICAgY2xpZW50LT5idWZmWyBjbGllbnQtPmJ1ZmZfbGVuIF0gPSAwOworICAgICAgICBjb250cm9sX2NsaWVudF9kb19jb21tYW5kKCBjbGllbnQgKTsKKyAgICAgICAgaWYgKGNsaWVudC0+ZmluaXNoZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2xpZW50LT5idWZmX2xlbiA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChjbGllbnQtPmJ1ZmZfbGVuID49IHNpemVvZihjbGllbnQtPmJ1ZmYpLTEpCisgICAgICAgICAgICBjbGllbnQtPmJ1ZmZfbGVuID0gMDsKKworICAgICAgICBjbGllbnQtPmJ1ZmZbIGNsaWVudC0+YnVmZl9sZW4rKyBdID0gY2g7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb250cm9sX2NsaWVudF9yZWFkKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBDb250cm9sQ2xpZW50IGNsaWVudCA9IG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKworICAgIGFzc2VydChmZCA9PSBjbGllbnQtPnNvY2spOworICAgIGFzc2VydCgoZXZlbnRzICYgTE9PUF9JT19SRUFEKSAhPSAwKTsKKworICAgIEQoKCAiaW4gY29udHJvbF9jbGllbnQgcmVhZDogIiApKTsKKyAgICBzaXplID0gc29ja2V0X3JlY3YoIGNsaWVudC0+c29jaywgYnVmLCBzaXplb2YoYnVmKSApOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBEKCggInNpemUgPCAwLCBleGl0aW5nIHdpdGggJWQ6ICVzXG4iLCBlcnJubywgZXJybm9fc3RyICkpOworICAgICAgICBpZiAoZXJybm8gIT0gRVdPVUxEQkxPQ0sgJiYgZXJybm8gIT0gRUFHQUlOKQorICAgICAgICAgICAgY29udHJvbF9jbGllbnRfZGVzdHJveSggY2xpZW50ICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIGVuZCBvZiBjb25uZWN0aW9uICovCisgICAgICAgIEQoKCAiZW5kIG9mIGNvbm5lY3Rpb24gZGV0ZWN0ZWQgISFcbiIgKSk7CisgICAgICAgIGNvbnRyb2xfY2xpZW50X2Rlc3Ryb3koIGNsaWVudCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50ICBubjsKKyNpZmRlZiBfV0lOMzIKKyMgIGlmIERFQlVHCisgICAgICAgIGNoYXIgIHRlbXBbMTZdOworICAgICAgICBpbnQgICBjb3VudCA9IHNpemUgPiBzaXplb2YodGVtcCktMSA/IHNpemVvZih0ZW1wKS0xIDogc2l6ZTsKKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgY291bnQ7IG5uKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgIGMgPSBidWZbbm5dOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wW25uXSA9ICchJzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPCAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbbm5dID0gJy4nOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGVtcFtubl0gPSAoY2hhciljOworICAgICAgICB9CisgICAgICAgIHRlbXBbbm5dID0gMDsKKyAgICAgICAgRCgoICJyZWNlaXZlZCAlZCBieXRlczogJXNcbiIsIHNpemUsIHRlbXAgKSk7CisjICBlbmRpZgorI2Vsc2UKKyAgICAgICAgRCgoICJyZWNlaXZlZCAlLipzXG4iLCBzaXplLCBidWYgKSk7CisjZW5kaWYKKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgc2l6ZTsgbm4rKykgeworICAgICAgICAgICAgY29udHJvbF9jbGllbnRfcmVhZF9ieXRlKCBjbGllbnQsIGJ1Zltubl0gKTsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmZpbmlzaGVkKSB7CisgICAgICAgICAgICAgICAgY29udHJvbF9jbGllbnRfZGVzdHJveShjbGllbnQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24gKi8KK3N0YXRpYyB2b2lkIGNvbnRyb2xfZ2xvYmFsX2FjY2VwdCh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpc3Rlbl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBDb250cm9sR2xvYmFsIGdsb2JhbCA9IG9wYXF1ZTsKKyAgICBDb250cm9sQ2xpZW50IGNsaWVudDsKKyAgICBTb2NrZXQgZmQ7CisKKyAgICBEKCggImNvbnRyb2xfZ2xvYmFsX2FjY2VwdDoganVzdCBpbiAoZmQ9JWQpXG4iLCBsaXN0ZW5fZmQgKSk7CisgICAgLy8gY29ubmVjdCgpcyBhcmUgbWFwcGVkIHRvIExPT1BfSU9fUkVBRAorICAgIGFzc2VydChldmVudHMgJiBMT09QX0lPX1JFQUQpOworCisgICAgZmQgPSBIQU5ETEVfRUlOVFIoc29ja2V0X2FjY2VwdChsaXN0ZW5fZmQsIE5VTEwpKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEQoKCAicHJvYmxlbSBpbiBhY2NlcHQ6ICVkOiAlc1xuIiwgZXJybm8sIGVycm5vX3N0ciApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvY2tldF9zZXRfeHJldXNlYWRkciggZmQgKTsKKworICAgIEQoKCAiY29udHJvbF9nbG9iYWxfYWNjZXB0OiBjcmVhdGluZyBuZXcgY2xpZW50XG4iICkpOworICAgIGNsaWVudCA9IGNvbnRyb2xfY2xpZW50X2NyZWF0ZSggZmQsIGdsb2JhbCApOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgY2hhciogZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuX3BhdGggPQorICAgICAgICAgICAgICAgIGFuZHJvaWRfY29uc29sZV9hdXRoX3Rva2VuX3BhdGhfZHVwKCk7CisKKyAgICAgICAgaW50IGNvbnNvbGVfYXV0aF9zdGF0dXMgPSBhbmRyb2lkX2NvbnNvbGVfYXV0aF9nZXRfc3RhdHVzKCk7CisgICAgICAgIHN3aXRjaCAoY29uc29sZV9hdXRoX3N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBDT05TT0xFX0FVVEhfU1RBVFVTX0RJU0FCTEVEOgorICAgICAgICAgICAgICAgIGNsaWVudC0+Y29tbWFuZHMgPSBtYWluX2NvbW1hbmRzOworICAgICAgICAgICAgICAgIGNvbnRyb2xfc2VuZF9oZWxwX3Byb21wdChjbGllbnQpOworICAgICAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiT0tcclxuIik7CisgICAgICAgICAgICAgICAgRCgoImNvbnRyb2xfZ2xvYmFsX2FjY2VwdDogbmV3IGNsaWVudCAlcFxuIiwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTlNPTEVfQVVUSF9TVEFUVVNfUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IFN0dWRpbyBsb29rcyBmb3IgdGhlIGZpcnN0IGxpbmUgb2YgdGhpcyBtZXNzYWdlCisgICAgICAgICAgICAgICAgLy8gL2V4YWN0bHkvCisgICAgICAgICAgICAgICAgY29udHJvbF93cml0ZShjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZCBDb25zb2xlOiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZFxyXG4iKTsKKyAgICAgICAgICAgICAgICBjb250cm9sX3dyaXRlKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbmRyb2lkIENvbnNvbGU6IHR5cGUgJ2F1dGggPGF1dGhfdG9rZW4+JyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXV0aGVudGljYXRlXHJcbiIpOworICAgICAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZHJvaWQgQ29uc29sZTogeW91IGNhbiBmaW5kIHlvdXIgPGF1dGhfdG9rZW4+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBcclxuJyIpOworICAgICAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCBlbXVsYXRvcl9jb25zb2xlX2F1dGhfdG9rZW5fcGF0aCk7CisgICAgICAgICAgICAgICAgY29udHJvbF93cml0ZShjbGllbnQsICInXHJcbk9LXHJcbiIpOworICAgICAgICAgICAgICAgIEQoKCJjb250cm9sX2dsb2JhbF9hY2NlcHQ6IGF1dGggcmVxdWlyZWQgJXBcbiIsIGNsaWVudCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDT05TT0xFX0FVVEhfU1RBVFVTX0VSUk9SOgorICAgICAgICAgICAgICAgIGNvbnRyb2xfY2xpZW50X2Rlc3Ryb3koY2xpZW50KTsKKyAgICAgICAgICAgICAgICBEKCgiY29udHJvbF9nbG9iYWxfYWNjZXB0OiByZWplY3RlZCBjbGllbnRcbiIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlbl9wYXRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnRyb2xfZ2xvYmFsX2FjY2VwdDQodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBhc3NlcnQobGlzdGVuX2ZkID09IGxvb3BJb19mZCgoKENvbnRyb2xHbG9iYWwpb3BhcXVlKS0+bGlzdGVuNF9sb29waW8pKTsKKyAgICBjb250cm9sX2dsb2JhbF9hY2NlcHQob3BhcXVlLCBsaXN0ZW5fZmQsIGV2ZW50cyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnRyb2xfZ2xvYmFsX2FjY2VwdDYodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBhc3NlcnQobGlzdGVuX2ZkID09IGxvb3BJb19mZCgoKENvbnRyb2xHbG9iYWwpb3BhcXVlKS0+bGlzdGVuNl9sb29waW8pKTsKKyAgICBjb250cm9sX2dsb2JhbF9hY2NlcHQob3BhcXVlLCBsaXN0ZW5fZmQsIGV2ZW50cyk7Cit9CisKKworaW50IGFuZHJvaWRfY29uc29sZV9zdGFydChpbnQgY29udHJvbF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkQ29uc29sZUFnZW50cyogYWdlbnRzKSB7CisgICAgQ29udHJvbEdsb2JhbCBnbG9iYWwgPSAmX2dfZ2xvYmFsOworCisgICAgbWVtc2V0KCBnbG9iYWwsIDAsIHNpemVvZigqZ2xvYmFsKSApOworICAgIC8vIENvcHkgdGhlIFFFTVUgc3BlY2lmaWMgaW50ZXJmYWNlcyBwYXNzZWQgaW4gdG8gbWFrZSBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgLy8gc2ltcGxlci4KKyNkZWZpbmUgQU5EUk9JRF9DT05TT0xFX0NPUFlfQUdFTlQodHlwZSwgbmFtZSkgXAorICAgICAgICBnbG9iYWwtPiBuYW1lICMjIF9hZ2VudCBbMF0gPSBhZ2VudHMtPiBuYW1lIFswXTsKKyAgICBBTkRST0lEX0NPTlNPTEVfQUdFTlRTX0xJU1QoQU5EUk9JRF9DT05TT0xFX0NPUFlfQUdFTlQpCisKKyAgICBpbnQgY29uc29sZV9hdXRoX3N0YXR1cyA9IGFuZHJvaWRfY29uc29sZV9hdXRoX2dldF9zdGF0dXMoKTsKKyAgICBpZiAoY29uc29sZV9hdXRoX3N0YXR1cyA9PSBDT05TT0xFX0FVVEhfU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIC8vIEJhbm5lcnMgZG9uJ3QgZ2V0IHNlbnQgcmVsaWFibHkgaW4gUUVNVTIgaWYgd2UgZGlzY29ubmVjdCBxdWlja2x5LCBzbworICAgICAgICAvLyB3ZSBvdXRwdXQgdGhlIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIHRoZXJlLiAgRG8gdGhlIHNhbWUgaGVyZS4KKyAgICAgICAgY2hhciogZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuX3BhdGggPQorICAgICAgICAgICAgICAgIGFuZHJvaWRfY29uc29sZV9hdXRoX3Rva2VuX3BhdGhfZHVwKCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJFUlJPUjogVW5hYmxlIHRvIGFjY2VzcyAnJXMnOiBlbXVsYXRvciBjb25zb2xlIHdpbGwgbm90ICIKKyAgICAgICAgICAgICAgICAid29ya1xuIiwKKyAgICAgICAgICAgICAgICBlbXVsYXRvcl9jb25zb2xlX2F1dGhfdG9rZW5fcGF0aCk7CisgICAgICAgIGZyZWUoZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuX3BhdGgpOworICAgIH0KKworCisgICAgU29ja2V0IGZkNCA9IHNvY2tldF9sb29wYmFjazRfc2VydmVyKGNvbnRyb2xfcG9ydCwgU09DS0VUX1NUUkVBTSk7CisgICAgU29ja2V0IGZkNiA9IC0xOworICAgIC8vIE9ubHkgdHJ5IHRvIGxpc3RlbiBvbiBpcHY2IGlmIGlwdjQgaXMgbm90IHN1cHBvcnRlZCBieSBzeXN0ZW0uCisgICAgLy8gVGhpcyBpcyBhbm90aGVyIHdvcmsgYXJvdW5kIGZvciBiLmFuZHJvaWQuY29tLzIxMzczNAorICAgIGlmIChmZDQgPCAwICYmIGVycm5vID09IEVBRk5PU1VQUE9SVCkgeworICAgICAgZmQ2ID0gc29ja2V0X2xvb3BiYWNrNl9zZXJ2ZXIoY29udHJvbF9wb3J0LCBTT0NLRVRfU1RSRUFNKTsKKyAgICB9CisKKyAgICBpZiAoZmQ0IDwgMCAmJiBmZDYgPCAwKSB7CisgICAgICAgIC8vIENvdWxkIG5vdCBiaW5kIHRvIGVpdGhlciBJUHY0IG9yIElQdjYgaW50ZXJmYWNlPworICAgICAgICBwZXJyb3IoImJpbmQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGdsb2JhbC0+bG9vcGVyID0gbG9vcGVyX2dldEZvclRocmVhZCgpOworICAgIGlmIChmZDQgPj0gMCkgeworICAgICAgICBnbG9iYWwtPmxpc3RlbjRfbG9vcGlvID0KKyAgICAgICAgICAgICAgICBsb29wSW9fbmV3KGdsb2JhbC0+bG9vcGVyLCBmZDQsIGNvbnRyb2xfZ2xvYmFsX2FjY2VwdDQsIGdsb2JhbCk7CisgICAgICAgIGxvb3BJb193YW50UmVhZChnbG9iYWwtPmxpc3RlbjRfbG9vcGlvKTsKKyAgICAgICAgbG9vcElvX2RvbnRXYW50V3JpdGUoZ2xvYmFsLT5saXN0ZW40X2xvb3Bpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xvYmFsLT5saXN0ZW40X2xvb3BpbyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGZkNiA+PSAwKSB7CisgICAgICAgIGdsb2JhbC0+bGlzdGVuNl9sb29waW8gPQorICAgICAgICAgICAgICAgIGxvb3BJb19uZXcoZ2xvYmFsLT5sb29wZXIsIGZkNiwgY29udHJvbF9nbG9iYWxfYWNjZXB0NiwgZ2xvYmFsKTsKKyAgICAgICAgbG9vcElvX3dhbnRSZWFkKGdsb2JhbC0+bGlzdGVuNl9sb29waW8pOworICAgICAgICBsb29wSW9fZG9udFdhbnRXcml0ZShnbG9iYWwtPmxpc3RlbjZfbG9vcGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnbG9iYWwtPmxpc3RlbjZfbG9vcGlvID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQKK2RvX3F1aXQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGNsaWVudC0+ZmluaXNoZWQgPSAxOworICAgIHJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgTiBFIFQgVyBPIFIgSyAgIFMgRSBUIFQgSSBOIEcgUyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citkb19uZXR3b3JrX3N0YXR1cyggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiQ3VycmVudCBuZXR3b3JrIHN0YXR1czpcclxuIiApOworCisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiICBkb3dubG9hZCBzcGVlZDogICAlOGQgYml0cy9zICglLjFmIEtCL3MpXHJcbiIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcpYW5kcm9pZF9uZXRfZG93bmxvYWRfc3BlZWQsIGFuZHJvaWRfbmV0X2Rvd25sb2FkX3NwZWVkLzgxOTIuICk7CisKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgIHVwbG9hZCBzcGVlZDogICAgICU4ZCBiaXRzL3MgKCUuMWYgS0IvcylcclxuIiwKKyAgICAgICAgICAgICAgICAgICAobG9uZylhbmRyb2lkX25ldF91cGxvYWRfc3BlZWQsIGFuZHJvaWRfbmV0X3VwbG9hZF9zcGVlZC84MTkyLiApOworCisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiICBtaW5pbXVtIGxhdGVuY3k6ICAlbGQgbXNcclxuIiwgYW5kcm9pZF9uZXRfbWluX2xhdGVuY3kgKTsKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgIG1heGltdW0gbGF0ZW5jeTogICVsZCBtc1xyXG4iLCBhbmRyb2lkX25ldF9tYXhfbGF0ZW5jeSApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZHVtcF9uZXR3b3JrX3NwZWVkcyggQ29udHJvbENsaWVudCAgY2xpZW50ICkKK3sKKyAgICBjb25zdCBBbmRyb2lkTmV0d29ya1NwZWVkKiBzcGVlZCA9IGFuZHJvaWRfbmV0d29ya19zcGVlZHM7CisgICAgY29uc3QgQW5kcm9pZE5ldHdvcmtTcGVlZCogc3BlZWRfZW5kID0gc3BlZWQgKyBhbmRyb2lkX25ldHdvcmtfc3BlZWRzX2NvdW50OworICAgIGNvbnN0IGNoYXIqIGNvbnN0ICBmb3JtYXQgPSAiICAlLThzICVzXHJcbiI7CisgICAgZm9yICggOyBzcGVlZCA8IHNwZWVkX2VuZDsgKytzcGVlZCApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCBmb3JtYXQsIHNwZWVkLT5uYW1lLCBzcGVlZC0+ZGlzcGxheV9uYW1lICk7CisgICAgfQorICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgZm9ybWF0LCAiPG51bT4iLCAic2VsZWN0cyBib3RoIHVwbG9hZCBhbmQgZG93bmxvYWQgc3BlZWQiICk7CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCBmb3JtYXQsICI8dXA+Ojxkb3duPiIsICJzZWxlY3QgaW5kaXZpZHVhbCB1cGxvYWQvZG93bmxvYWQgc3BlZWRzIiApOworfQorCisKK3N0YXRpYyBpbnQKK2RvX25ldHdvcmtfc3BlZWQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGlmICggIWFyZ3MgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIDxzcGVlZD4gYXJndW1lbnQsIHNlZSAnaGVscCBuZXR3b3JrIHNwZWVkJ1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFhbmRyb2lkX25ldHdvcmtfc2V0X3NwZWVkKGFyZ3MpKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBpbnZhbGlkIDxzcGVlZD4gYXJndW1lbnQsIHNlZSAnaGVscCBuZXR3b3JrIHNwZWVkJyBmb3IgdmFsaWQgdmFsdWVzXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG5ldHNoYXBlcl9zZXRfcmF0ZSggYW5kcm9pZF9uZXRfc2hhcGVyX2luLCAgYW5kcm9pZF9uZXRfZG93bmxvYWRfc3BlZWQgKTsKKyAgICBuZXRzaGFwZXJfc2V0X3JhdGUoIGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQsIGFuZHJvaWRfbmV0X3VwbG9hZF9zcGVlZCApOworCisgICAgaWYgKGFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgYW1vZGVtX3NldF9kYXRhX25ldHdvcmtfdHlwZSggYW5kcm9pZF9tb2RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGFyc2VfbmV0d29ya190eXBlKCBhcmdzICkgKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitkZXNjcmliZV9uZXR3b3JrX3NwZWVkKCBDb250cm9sQ2xpZW50ICBjbGllbnQgKQoreworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAiJ25ldHdvcmsgc3BlZWQgPHNwZWVkPicgYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHNwZWVkIG9mIHRoZSBlbXVsYXRlZFxyXG4iCisgICAgICAgICAgICAgICAgICAgIm5ldHdvcmsgb24gdGhlIGRldmljZSwgd2hlcmUgPHNwZWVkPiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzpcclxuXHJcbiIgKTsKKyAgICBkdW1wX25ldHdvcmtfc3BlZWRzKCBjbGllbnQgKTsKK30KKworc3RhdGljIGludAorZG9fbmV0d29ya19kZWxheSggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgaWYgKCAhYXJncyApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG1pc3NpbmcgPGRlbGF5PiBhcmd1bWVudCwgc2VlICdoZWxwIG5ldHdvcmsgZGVsYXknXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWFuZHJvaWRfbmV0d29ya19zZXRfbGF0ZW5jeShhcmdzKSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogaW52YWxpZCA8ZGVsYXk+IGFyZ3VtZW50LCBzZWUgJ2hlbHAgbmV0d29yayBkZWxheScgZm9yIHZhbGlkIHZhbHVlc1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbmV0ZGVsYXlfc2V0X2xhdGVuY3koIGFuZHJvaWRfbmV0X2RlbGF5X2luLCBhbmRyb2lkX25ldF9taW5fbGF0ZW5jeSwgYW5kcm9pZF9uZXRfbWF4X2xhdGVuY3kgKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2Rlc2NyaWJlX25ldHdvcmtfZGVsYXkoIENvbnRyb2xDbGllbnQgIGNsaWVudCApCit7CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LAorICAgICAgICAgICAgICAgICAgICInbmV0d29yayBkZWxheSA8bGF0ZW5jeT4nIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgY2hhbmdlIHRoZSBsYXRlbmN5IG9mIHRoZSBlbXVsYXRlZFxyXG4iCisgICAgICAgICAgICAgICAgICAgIm5ldHdvcmsgb24gdGhlIGRldmljZSwgd2hlcmUgPGxhdGVuY3k+IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxyXG5cclxuIiApOworICAgIC8qIFhYWDogVE9ETyAqLworfQorCitzdGF0aWMgaW50Citkb19uZXR3b3JrX2NhcHR1cmVfc3RhcnQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGlmICggIWFyZ3MgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIDxmaWxlPiBhcmd1bWVudCwgc2VlICdoZWxwIG5ldHdvcmsgY2FwdHVyZSBzdGFydCdcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggcWVtdV90Y3BkdW1wX3N0YXJ0KGFyZ3MpIDwgMCkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogY291bGQgbm90IHN0YXJ0IGNhcHR1cmU6ICVzIiwgc3RyZXJyb3IoZXJybm8pICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX25ldHdvcmtfY2FwdHVyZV9zdG9wKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICAvKiBubyBuZWVkIHRvIHJldHVybiBhbiBlcnJvciBoZXJlICovCisgICAgcWVtdV90Y3BkdW1wX3N0b3AoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIG5ldHdvcmtfY2FwdHVyZV9jb21tYW5kc1tdID0KK3sKKyAgICB7ICJzdGFydCIsICJzdGFydCBuZXR3b3JrIGNhcHR1cmUiLAorICAgICAgIiduZXR3b3JrIGNhcHR1cmUgc3RhcnQgPGZpbGU+JyBzdGFydHMgYSBuZXcgY2FwdHVyZSBvZiBuZXR3b3JrIHBhY2tldHNcclxuIgorICAgICAgImludG8gYSBzcGVjaWZpYyA8ZmlsZT4uIFRoaXMgd2lsbCBzdG9wIGFueSBjYXB0dXJlIGFscmVhZHkgaW4gcHJvZ3Jlc3MuXHJcbiIKKyAgICAgICJ0aGUgY2FwdHVyZSBmaWxlIGNhbiBsYXRlciBiZSBhbmFseXplZCBieSB0b29scyBsaWtlIFdpcmVTaGFyay4gSXQgdXNlc1xyXG4iCisgICAgICAidGhlIGxpYnBjYXAgZmlsZSBmb3JtYXQuXHJcblxyXG4iCisgICAgICAieW91IGNhbiBzdG9wIHRoZSBjYXB0dXJlIGFueXRpbWUgd2l0aCAnbmV0d29yayBjYXB0dXJlIHN0b3AnXHJcbiIsIE5VTEwsCisgICAgICBkb19uZXR3b3JrX2NhcHR1cmVfc3RhcnQsIE5VTEwgfSwKKworICAgIHsgInN0b3AiLCAic3RvcCBuZXR3b3JrIGNhcHR1cmUiLAorICAgICAgIiduZXR3b3JrIGNhcHR1cmUgc3RvcCcgc3RvcHMgYSBjdXJyZW50bHkgcnVubmluZyBwYWNrZXQgY2FwdHVyZSwgaWYgYW55LlxyXG4iCisgICAgICAieW91IGNhbiBzdGFydCBvbmUgd2l0aCAnbmV0d29yayBjYXB0dXJlIHN0YXJ0IDxmaWxlPidcclxuIiwgTlVMTCwKKyAgICAgIGRvX25ldHdvcmtfY2FwdHVyZV9zdG9wLCBOVUxMIH0sCisKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIG5ldHdvcmtfY29tbWFuZHNbXSA9Cit7CisgICAgeyAic3RhdHVzIiwgImR1bXAgbmV0d29yayBzdGF0dXMiLCBOVUxMLCBOVUxMLAorICAgICAgIGRvX25ldHdvcmtfc3RhdHVzLCBOVUxMIH0sCisKKyAgICB7ICJzcGVlZCIsICJjaGFuZ2UgbmV0d29yayBzcGVlZCIsIE5VTEwsIGRlc2NyaWJlX25ldHdvcmtfc3BlZWQsCisgICAgICBkb19uZXR3b3JrX3NwZWVkLCBOVUxMIH0sCisKKyAgICB7ICJkZWxheSIsICJjaGFuZ2UgbmV0d29yayBsYXRlbmN5IiwgTlVMTCwgZGVzY3JpYmVfbmV0d29ya19kZWxheSwKKyAgICAgICBkb19uZXR3b3JrX2RlbGF5LCBOVUxMIH0sCisKKyAgICB7ICJjYXB0dXJlIiwgImR1bXAgbmV0d29yayBwYWNrZXRzIHRvIGZpbGUiLAorICAgICAgImFsbG93cyB0byBzdGFydC9zdG9wIGNhcHR1cmUgb2YgbmV0d29yayBwYWNrZXRzIHRvIGEgZmlsZSBmb3IgbGF0ZXIgYW5hbHlzaXNcclxuIiwgTlVMTCwKKyAgICAgIE5VTEwsIG5ldHdvcmtfY2FwdHVyZV9jb21tYW5kcyB9LAorCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgUCBPIFIgVCAgIFIgRSBEIEkgUiBFIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZG9fcmVkaXJfbGlzdCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgQ29udHJvbEdsb2JhbCAgZ2xvYmFsID0gY2xpZW50LT5nbG9iYWw7CisKKyAgICBpZiAoZ2xvYmFsLT5udW1fcmVkaXJzID09IDApCisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIm5vIGFjdGl2ZSByZWRpcmVjdGlvbnNcclxuIiApOworICAgIGVsc2UgeworICAgICAgICBpbnQgIG5uOworICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBnbG9iYWwtPm51bV9yZWRpcnM7IG5uKyspIHsKKyAgICAgICAgICAgIFJlZGlyICByZWRpciA9ICZnbG9iYWwtPnJlZGlyc1tubl07CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIlczolLTVkID0+ICUtNWRcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXItPmhvc3RfdWRwID8gInVkcCIgOiAidGNwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXItPmhvc3RfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXItPmd1ZXN0X3BvcnQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogcGFyc2UgYSBwcm90b2NvbDpwb3J0IHNwZWNpZmljYXRpb24gKi8KK3N0YXRpYyBpbnQKK3JlZGlyX3BhcnNlX3Byb3RvX3BvcnQoIGNoYXIqICBhcmdzLCBpbnQgICpwcG9ydCwgaW50ICAqcHByb3RvICkKK3sKKyAgICBpbnQgIHByb3RvID0gLTE7CisgICAgaW50ICBsZW4gICA9IDA7CisgICAgY2hhciogIGVuZDsKKworICAgIGlmICggIW1lbWNtcCggYXJncywgInRjcDoiLCA0ICkgKSB7CisgICAgICAgIHByb3RvID0gMDsKKyAgICAgICAgbGVuICAgPSA0OworICAgIH0KKyAgICBlbHNlIGlmICggIW1lbWNtcCggYXJncywgInVkcDoiLCA0ICkgKSB7CisgICAgICAgIHByb3RvID0gMTsKKyAgICAgICAgbGVuICAgPSA0OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworCisgICAgYXJncyAgICs9IGxlbjsKKyAgICAqcHByb3RvID0gcHJvdG87CisgICAgKnBwb3J0ICA9IHN0cnRvbCggYXJncywgJmVuZCwgMTAgKTsKKyAgICBpZiAoZW5kID09IGFyZ3MpCisgICAgICAgIHJldHVybiAwOworCisgICAgbGVuICs9IGVuZCAtIGFyZ3M7CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludAorcmVkaXJfcGFyc2VfZ3Vlc3RfcG9ydCggY2hhciogIGFyZywgaW50ICAqcHBvcnQgKQoreworICAgIGNoYXIqICBlbmQ7CisKKyAgICAqcHBvcnQgPSBzdHJ0b3VsKCBhcmcsICZlbmQsIDEwICk7CisgICAgaWYgKGVuZCA9PSBhcmcpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGVuZCAtIGFyZzsKK30KKworc3RhdGljIFJlZGlyCityZWRpcl9maW5kKCBDb250cm9sR2xvYmFsICBnbG9iYWwsIGludCAgcG9ydCwgaW50ICBpc3VkcCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGdsb2JhbC0+bnVtX3JlZGlyczsgbm4rKykgeworICAgICAgICBSZWRpciAgcmVkaXIgPSAmZ2xvYmFsLT5yZWRpcnNbbm5dOworCisgICAgICAgIGlmIChyZWRpci0+aG9zdF9wb3J0ID09IHBvcnQgJiYgcmVkaXItPmhvc3RfdWRwID09IGlzdWRwKQorICAgICAgICAgICAgcmV0dXJuIHJlZGlyOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgaW50Citkb19yZWRpcl9hZGQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGludCAgICAgICBsZW4sIGhvc3RfcHJvdG8sIGhvc3RfcG9ydCwgZ3Vlc3RfcG9ydDsKKyAgICB1aW50MzJfdCAgZ3Vlc3RfaXA7CisgICAgUmVkaXIgICAgIHJlZGlyOworCisgICAgaWYgKCAhYXJncyApCisgICAgICAgIGdvdG8gQmFkRm9ybWF0OworCisgICAgaWYgKCFjbGllbnQtPmdsb2JhbC0+bmV0X2FnZW50LT5pc1NsaXJwSW5pdGVkKCkpCisgICAgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbmV0d29yayBlbXVsYXRpb24gZGlzYWJsZWRcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBsZW4gPSByZWRpcl9wYXJzZV9wcm90b19wb3J0KCBhcmdzLCAmaG9zdF9wb3J0LCAmaG9zdF9wcm90byApOworICAgIGlmIChsZW4gPT0gMCB8fCBhcmdzW2xlbl0gIT0gJzonKQorICAgICAgICBnb3RvIEJhZEZvcm1hdDsKKworICAgIGFyZ3MgKz0gbGVuICsgMTsKKyAgICBsZW4gPSByZWRpcl9wYXJzZV9ndWVzdF9wb3J0KCBhcmdzLCAmZ3Vlc3RfcG9ydCApOworICAgIGlmIChsZW4gPT0gMCB8fCBhcmdzW2xlbl0gIT0gMCkKKyAgICAgICAgZ290byBCYWRGb3JtYXQ7CisKKyAgICByZWRpciA9IHJlZGlyX2ZpbmQoIGNsaWVudC0+Z2xvYmFsLCBob3N0X3BvcnQsIGhvc3RfcHJvdG8gKTsKKyAgICBpZiAoIHJlZGlyICE9IE5VTEwgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBob3N0IHBvcnQgYWxyZWFkeSBhY3RpdmUsIHVzZSAncmVkaXIgZGVsJyB0byByZW1vdmUgZmlyc3RcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGluZXRfc3RydG9pcCgiMTAuMC4yLjE1IiwgJmd1ZXN0X2lwKSA8IDApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IHVuZXhwZWN0ZWQgaW50ZXJuYWwgZmFpbHVyZSB3aGVuIHJlc29sdmluZyAxMC4wLjIuMTVcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRCgoInBhdHRlcm4gaHBvcnQ9JWQgZ3BvcnQ9JWQgcHJvdG89JWRcbiIsIGhvc3RfcG9ydCwgZ3Vlc3RfcG9ydCwgaG9zdF9wcm90byApKTsKKyAgICBpZiAoIGNvbnRyb2xfZ2xvYmFsX2FkZF9yZWRpciggY2xpZW50LT5nbG9iYWwsIGhvc3RfcG9ydCwgaG9zdF9wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3RfaXAsIGd1ZXN0X3BvcnQgKSA8IDAgKQorICAgIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJlZGlyZWN0aW9uXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghY2xpZW50LT5nbG9iYWwtPm5ldF9hZ2VudC0+c2xpcnBSZWRpcihob3N0X3Byb3RvLCBob3N0X3BvcnQsIGd1ZXN0X2lwLCBndWVzdF9wb3J0KSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogY2FuJ3Qgc2V0dXAgcmVkaXJlY3Rpb24sIHBvcnQgcHJvYmFibHkgdXNlZCBieSBhbm90aGVyIHByb2dyYW0gb24gaG9zdFxyXG4iICk7CisgICAgICAgIGNvbnRyb2xfZ2xvYmFsX2RlbF9yZWRpciggY2xpZW50LT5nbG9iYWwsIGhvc3RfcG9ydCwgaG9zdF9wcm90byApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK0JhZEZvcm1hdDoKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYmFkIHJlZGlyZWN0aW9uIGZvcm1hdCwgdHJ5ICh0Y3B8dWRwKTpob3N0cG9ydDpndWVzdHBvcnRcclxuIiwgLTEgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludAorZG9fcmVkaXJfZGVsKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpbnQgICAgbGVuLCBwcm90bywgcG9ydDsKKyAgICBSZWRpciAgcmVkaXI7CisKKyAgICBpZiAoICFhcmdzICkKKyAgICAgICAgZ290byBCYWRGb3JtYXQ7CisgICAgbGVuID0gcmVkaXJfcGFyc2VfcHJvdG9fcG9ydCggYXJncywgJnBvcnQsICZwcm90byApOworICAgIGlmICggbGVuID09IDAgfHwgYXJnc1tsZW5dICE9IDAgKQorICAgICAgICBnb3RvIEJhZEZvcm1hdDsKKworICAgIHJlZGlyID0gcmVkaXJfZmluZCggY2xpZW50LT5nbG9iYWwsIHBvcnQsIHByb3RvICk7CisgICAgaWYgKHJlZGlyID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGNhbid0IHJlbW92ZSB1bmtub3duIHJlZGlyZWN0aW9uICglczolZClcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvID8gInVkcCIgOiAidGNwIiwgcG9ydCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2xpZW50LT5nbG9iYWwtPm5ldF9hZ2VudC0+c2xpcnBVbnJlZGlyKCByZWRpci0+aG9zdF91ZHAsIHJlZGlyLT5ob3N0X3BvcnQgKTsKKyAgICBjb250cm9sX2dsb2JhbF9kZWxfcmVkaXIoIGNsaWVudC0+Z2xvYmFsLCBwb3J0LCBwcm90byApOworCisgICAgcmV0dXJuIDA7CisKK0JhZEZvcm1hdDoKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYmFkIHJlZGlyZWN0aW9uIGZvcm1hdCwgdHJ5ICh0Y3B8dWRwKTpob3N0cG9ydFxyXG4iICk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgQ29tbWFuZERlZlJlYyAgcmVkaXJfY29tbWFuZHNbXSA9Cit7CisgICAgeyAibGlzdCIsICJsaXN0IGN1cnJlbnQgcmVkaXJlY3Rpb25zIiwKKyAgICAibGlzdCBjdXJyZW50IHBvcnQgcmVkaXJlY3Rpb25zLiB1c2UgJ3JlZGlyIGFkZCcgYW5kICdyZWRpciBkZWwnIHRvIGFkZCBhbmQgcmVtb3ZlIHRoZW1cclxuIiwgTlVMTCwKKyAgICBkb19yZWRpcl9saXN0LCBOVUxMIH0sCisKKyAgICB7ICJhZGQiLCAgImFkZCBuZXcgcmVkaXJlY3Rpb24iLAorICAgICJhZGQgYSBuZXcgcG9ydCByZWRpcmVjdGlvbiwgYXJndW1lbnRzIG11c3QgYmU6XHJcblxyXG4iCisgICAgICAgICAgICAiICByZWRpciBhZGQgPHByb3RvY29sPjo8aG9zdC1wb3J0Pjo8Z3Vlc3QtcG9ydD5cclxuXHJcbiIKKyAgICAgICAgICAgICJ3aGVyZTogICA8cHJvdG9jb2w+ICAgICBpcyBlaXRoZXIgJ3RjcCcgb3IgJ3VkcCdcclxuIgorICAgICAgICAgICAgIiAgICAgICAgIDxob3N0LXBvcnQ+ICAgIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggcG9ydCBvbiB0aGUgaG9zdCB0byBvcGVuXHJcbiIKKyAgICAgICAgICAgICIgICAgICAgICA8Z3Vlc3QtcG9ydD4gICBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gcm91dGUgdG8gb24gdGhlIGRldmljZVxyXG4iCisgICAgICAgICAgICAiXHJcbmFzIGFuIGV4YW1wbGUsICdyZWRpciAgdGNwOjUwMDA6NjAwMCcgd2lsbCBhbGxvdyBhbnkgcGFja2V0cyBzZW50IHRvXHJcbiIKKyAgICAgICAgICAgICJ0aGUgaG9zdCdzIFRDUCBwb3J0IDUwMDAgdG8gYmUgcm91dGVkIHRvIFRDUCBwb3J0IDYwMDAgb2YgdGhlIGVtdWxhdGVkIGRldmljZVxyXG4iLCBOVUxMLAorICAgIGRvX3JlZGlyX2FkZCwgTlVMTCB9LAorCisgICAgeyAiZGVsIiwgICJyZW1vdmUgZXhpc3RpbmcgcmVkaXJlY3Rpb24iLAorICAgICJyZW1vdmUgYSBwb3J0IHJlZGlyZWNpb24gdGhhdCB3YXMgY3JlYXRlZCB3aXRoICdyZWRpciBhZGQnLCBhcmd1bWVudHMgbXVzdCBiZTpcclxuXHJcbiIKKyAgICAgICAgICAgICIgIHJlZGlyICBkZWwgPHByb3RvY29sPjo8aG9zdC1wb3J0PlxyXG5cclxuIgorICAgICAgICAgICAgInNlZSB0aGUgJ2hlbHAgcmVkaXIgYWRkJyBmb3IgdGhlIG1lYW5pbmcgb2YgPHByb3RvY29sPiBhbmQgPGhvc3QtcG9ydD5cclxuIiwgTlVMTCwKKyAgICBkb19yZWRpcl9kZWwsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBDIEQgTSBBICAgTSBPIEQgRSBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICogICAgICAgICAgICBuYW1lOworICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIGRpc3BsYXk7CisgICAgQUNkbWFTdWJzY3JpcHRpb25Tb3VyY2Ugc291cmNlOworfSBfY2RtYV9zdWJzY3JpcHRpb25fc291cmNlc1tdID0geworICAgIHsgIm52IiwgICAgICAgICAgICAiUmVhZCBzdWJzY3JpcHRpb24gZnJvbSBub24tdm9sYXRpbGUgUkFNIiwgQV9TVUJTQ1JJUFRJT05fTlZSQU0gfSwKKyAgICB7ICJydWltIiwgICAgICAgICAgIlJlYWQgc3Vic2NyaXB0aW9uIGZyb20gUlVJTSIsIEFfU1VCU0NSSVBUSU9OX1JVSU0gfSwKK307CisKK3N0YXRpYyB2b2lkCitkdW1wX3N1YnNjcmlwdGlvbl9zb3VyY2VzKCBDb250cm9sQ2xpZW50IGNsaWVudCApCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsKKyAgICAgICAgIGkgPCBzaXplb2YoX2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZXMpIC8gc2l6ZW9mKF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2VzWzBdKTsKKyAgICAgICAgIGkrKykgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgICAgJXM6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2VzW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2VzW2ldLmRpc3BsYXkgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitkZXNjcmliZV9zdWJzY3JpcHRpb25fc291cmNlKCBDb250cm9sQ2xpZW50IGNsaWVudCApCit7CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LAorICAgICAgICAgICAgICAgICAgICInY2RtYSBzc291cmNlIDxzc291cmNlPicgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZXJlIHRvIHJlYWQgdGhlIHN1YnNjcmlwdGlvbiBmcm9tXHJcbiIgKTsKKyAgICBkdW1wX3N1YnNjcmlwdGlvbl9zb3VyY2VzKCBjbGllbnQgKTsKK30KKworc3RhdGljIGludAorZG9fY2RtYV9zc291cmNlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpbnQgbm47CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ2NkbWEgc3NvdXJjZSA8c291cmNlPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChubiA9IDA7IG5uIDwgc2l6ZW9mKF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2VzKSAvIHNpemVvZihfY2RtYV9zdWJzY3JpcHRpb25fc291cmNlc1swXSk7CisgICAgICAgICAgICBubisrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgbmFtZSAgICA9IF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2VzW25uXS5uYW1lOworICAgICAgICBBQ2RtYVN1YnNjcmlwdGlvblNvdXJjZSBzc291cmNlID0gX2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZXNbbm5dLnNvdXJjZTsKKworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIXN0cmNhc2VjbXAoIGFyZ3MsIG5hbWUgKSkgeworICAgICAgICAgICAgYW1vZGVtX3NldF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2UoIGFuZHJvaWRfbW9kZW0sIHNzb3VyY2UgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBEb24ndCBrbm93IHNvdXJjZSAlc1xyXG4iLCBhcmdzICk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Citkb19jZG1hX3BybF92ZXJzaW9uKCBDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciAqIGFyZ3MgKQoreworICAgIGludCB2ZXJzaW9uID0gMDsKKyAgICBjaGFyICplbmRwdHI7CisKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG1pc3NpbmcgYXJndW1lbnQsIHRyeSAnY2RtYSBwcmxfdmVyc2lvbiA8dmVyc2lvbj4nXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdmVyc2lvbiA9IHN0cnRvbChhcmdzLCAmZW5kcHRyLCAwKTsKKyAgICBpZiAoZW5kcHRyICE9IGFyZ3MpIHsKKyAgICAgICAgYW1vZGVtX3NldF9jZG1hX3BybF92ZXJzaW9uKCBhbmRyb2lkX21vZGVtLCB2ZXJzaW9uICk7CisgICAgfQorICAgIHJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgRyBTIE0gICBNIE8gRCBFIE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgIG5hbWU7CisgICAgY29uc3QgY2hhciogICAgICAgICBkaXNwbGF5OworICAgIEFSZWdpc3RyYXRpb25TdGF0ZSAgc3RhdGU7Cit9IF9nc21fc3RhdGVzW10gPSB7CisgICAgeyAidW5yZWdpc3RlcmVkIiwgICJubyBuZXR3b3JrIGF2YWlsYWJsZSIsIEFfUkVHSVNUUkFUSU9OX1VOUkVHSVNURVJFRCB9LAorICAgIHsgImhvbWUiLCAgICAgICAgICAib24gbG9jYWwgbmV0d29yaywgbm9uLXJvYW1pbmciLCBBX1JFR0lTVFJBVElPTl9IT01FIH0sCisgICAgeyAicm9hbWluZyIsICAgICAgICJvbiByb2FtaW5nIG5ldHdvcmsiLCBBX1JFR0lTVFJBVElPTl9ST0FNSU5HIH0sCisgICAgeyAic2VhcmNoaW5nIiwgICAgICJzZWFyY2hpbmcgbmV0d29ya3MiLCBBX1JFR0lTVFJBVElPTl9TRUFSQ0hJTkcgfSwKKyAgICB7ICJkZW5pZWQiLCAgICAgICAgImVtZXJnZW5jeSBjYWxscyBvbmx5IiwgQV9SRUdJU1RSQVRJT05fREVOSUVEIH0sCisgICAgeyAib2ZmIiwgICAgICAgICAgICJzYW1lIGFzICd1bnJlZ2lzdGVyZWQnIiwgQV9SRUdJU1RSQVRJT05fVU5SRUdJU1RFUkVEIH0sCisgICAgeyAib24iLCAgICAgICAgICAgICJzYW1lIGFzICdob21lJyIsIEFfUkVHSVNUUkFUSU9OX0hPTUUgfSwKKyAgICB7IE5VTEwsIE5VTEwsIEFfUkVHSVNUUkFUSU9OX1VOUkVHSVNURVJFRCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhcioKK2dzbV9zdGF0ZV90b19zdHJpbmcoIEFSZWdpc3RyYXRpb25TdGF0ZSAgc3RhdGUgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IF9nc21fc3RhdGVzW25uXS5uYW1lICE9IE5VTEw7IG5uKyspIHsKKyAgICAgICAgaWYgKHN0YXRlID09IF9nc21fc3RhdGVzW25uXS5zdGF0ZSkKKyAgICAgICAgICAgIHJldHVybiBfZ3NtX3N0YXRlc1tubl0ubmFtZTsKKyAgICB9CisgICAgcmV0dXJuICI8dW5rbm93bj4iOworfQorCitzdGF0aWMgaW50Citkb19nc21fc3RhdHVzKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpZiAoYXJncykgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbm8gYXJndW1lbnQgcmVxdWlyZWRcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghYW5kcm9pZF9tb2RlbSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbW9kZW0gZW11bGF0aW9uIG5vdCBydW5uaW5nXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJnc20gdm9pY2Ugc3RhdGU6ICVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgZ3NtX3N0YXRlX3RvX3N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgYW1vZGVtX2dldF92b2ljZV9yZWdpc3RyYXRpb24oYW5kcm9pZF9tb2RlbSkgKSApOworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgImdzbSBkYXRhIHN0YXRlOiAgJXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICBnc21fc3RhdGVfdG9fc3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICBhbW9kZW1fZ2V0X2RhdGFfcmVnaXN0cmF0aW9uKGFuZHJvaWRfbW9kZW0pICkgKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF9nc21fZGF0YSggQ29udHJvbENsaWVudCAgY2xpZW50ICkKK3sKKyAgICBpbnQgIG5uOworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwKKyAgICAgICAgICAgICJ0aGUgJ2dzbSBkYXRhIDxzdGF0ZT4nIGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB5b3VyIEdQUlMgY29ubmVjdGlvblxyXG4iCisgICAgICAgICAgICAidmFsaWQgdmFsdWVzIGZvciA8c3RhdGU+IGFyZSB0aGUgZm9sbG93aW5nOlxyXG5cclxuIiApOworICAgIGZvciAobm4gPSAwOyA7IG5uKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICBuYW1lICAgID0gX2dzbV9zdGF0ZXNbbm5dLm5hbWU7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgZGlzcGxheSA9IF9nc21fc3RhdGVzW25uXS5kaXNwbGF5OworCisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIiAgJS0xNXMgJXNcclxuIiwgbmFtZSwgZGlzcGxheSApOworICAgIH0KKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJcclxuIiApOworfQorCisKK3N0YXRpYyBpbnQKK2RvX2dzbV9kYXRhKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpbnQgIG5uOworCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ2dzbSBkYXRhIDxzdGF0ZT4nXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAobm4gPSAwOyA7IG5uKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICBuYW1lICAgID0gX2dzbV9zdGF0ZXNbbm5dLm5hbWU7CisgICAgICAgIEFSZWdpc3RyYXRpb25TdGF0ZSAgc3RhdGUgICA9IF9nc21fc3RhdGVzW25uXS5zdGF0ZTsKKworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoICFzdHJjbXAoIGFyZ3MsIG5hbWUgKSApIHsKKyAgICAgICAgICAgIGlmICghYW5kcm9pZF9tb2RlbSkgeworICAgICAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtb2RlbSBlbXVsYXRpb24gbm90IHJ1bm5pbmdcclxuIiApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFtb2RlbV9zZXRfZGF0YV9yZWdpc3RyYXRpb24oIGFuZHJvaWRfbW9kZW0sIHN0YXRlICk7CisgICAgICAgICAgICBhbmRyb2lkX25ldF9kaXNhYmxlID0gKHN0YXRlICE9IEFfUkVHSVNUUkFUSU9OX0hPTUUgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgIT0gQV9SRUdJU1RSQVRJT05fUk9BTUlORyApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGJhZCBHU00gZGF0YSBzdGF0ZSBuYW1lLCB0cnkgJ2hlbHAgZ3NtIGRhdGEnIGZvciBsaXN0IG9mIHZhbGlkIHZhbHVlc1xyXG4iICk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAoraGVscF9nc21fdm9pY2UoIENvbnRyb2xDbGllbnQgIGNsaWVudCApCit7CisgICAgaW50ICBubjsKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsCisgICAgICAgICAgICAidGhlICdnc20gdm9pY2UgPHN0YXRlPicgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHlvdXIgR1BSUyBjb25uZWN0aW9uXHJcbiIKKyAgICAgICAgICAgICJ2YWxpZCB2YWx1ZXMgZm9yIDxzdGF0ZT4gYXJlIHRoZSBmb2xsb3dpbmc6XHJcblxyXG4iICk7CisgICAgZm9yIChubiA9IDA7IDsgbm4rKykgeworICAgICAgICBjb25zdCBjaGFyKiAgICAgICAgIG5hbWUgICAgPSBfZ3NtX3N0YXRlc1tubl0ubmFtZTsKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgICBkaXNwbGF5ID0gX2dzbV9zdGF0ZXNbbm5dLmRpc3BsYXk7CisKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiICAlLTE1cyAlc1xyXG4iLCBuYW1lLCBkaXNwbGF5ICk7CisgICAgfQorICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIlxyXG4iICk7Cit9CisKKworc3RhdGljIGludAorZG9fZ3NtX3ZvaWNlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpbnQgIG5uOworCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ2dzbSB2b2ljZSA8c3RhdGU+J1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKG5uID0gMDsgOyBubisrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgbmFtZSAgICA9IF9nc21fc3RhdGVzW25uXS5uYW1lOworICAgICAgICBBUmVnaXN0cmF0aW9uU3RhdGUgIHN0YXRlICAgPSBfZ3NtX3N0YXRlc1tubl0uc3RhdGU7CisKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCAhc3RyY21wKCBhcmdzLCBuYW1lICkgKSB7CisgICAgICAgICAgICBpZiAoIWFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbW9kZW0gZW11bGF0aW9uIG5vdCBydW5uaW5nXHJcbiIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbW9kZW1fc2V0X3ZvaWNlX3JlZ2lzdHJhdGlvbiggYW5kcm9pZF9tb2RlbSwgc3RhdGUgKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBiYWQgR1NNIGRhdGEgc3RhdGUgbmFtZSwgdHJ5ICdoZWxwIGdzbSB2b2ljZScgZm9yIGxpc3Qgb2YgdmFsaWQgdmFsdWVzXHJcbiIgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludAorZ3NtX2NoZWNrX251bWJlciggY2hhciogIGFyZ3MgKQoreworICAgIGludCAgbm47CisKKyAgICBmb3IgKG5uID0gMDsgYXJnc1tubl0gIT0gMDsgbm4rKykgeworICAgICAgICBpbnQgIGMgPSBhcmdzW25uXTsKKyAgICAgICAgaWYgKCAhaXNkaWdpdChjKSAmJiBjICE9ICcrJyAmJiBjICE9ICcjJyApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobm4gPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2dzbV9jYWxsKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSBwaG9uZSBudW1iZXIgbWFkZSBvZiBkaWdpdHMgKi8KKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG1pc3NpbmcgYXJndW1lbnQsIHRyeSAnZ3NtIGNhbGwgPHBob25lbnVtYmVyPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGdzbV9jaGVja19udW1iZXIoYXJncykpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGJhZCBwaG9uZSBudW1iZXIgZm9ybWF0LCB1c2UgZGlnaXRzLCAjIGFuZCArIG9ubHlcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkX21vZGVtKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtb2RlbSBlbXVsYXRpb24gbm90IHJ1bm5pbmdcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFtb2RlbV9hZGRfaW5ib3VuZF9jYWxsKCBhbmRyb2lkX21vZGVtLCBhcmdzICk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2dzbV9jYW5jZWwoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGlmICghYXJncykgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbWlzc2luZyBhcmd1bWVudCwgdHJ5ICdnc20gY2FsbCA8cGhvbmVudW1iZXI+J1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGdzbV9jaGVja19udW1iZXIoYXJncykpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGJhZCBwaG9uZSBudW1iZXIgZm9ybWF0LCB1c2UgZGlnaXRzLCAjIGFuZCArIG9ubHlcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghYW5kcm9pZF9tb2RlbSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbW9kZW0gZW11bGF0aW9uIG5vdCBydW5uaW5nXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGFtb2RlbV9kaXNjb25uZWN0X2NhbGwoIGFuZHJvaWRfbW9kZW0sIGFyZ3MgKSA8IDAgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBjb3VsZCBub3QgY2FuY2VsIHRoaXMgbnVtYmVyXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3QgY2hhcioKK2NhbGxfc3RhdGVfdG9fc3RyaW5nKCBBQ2FsbFN0YXRlICBzdGF0ZSApCit7CisgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIEFfQ0FMTF9BQ1RJVkU6ICAgcmV0dXJuICJhY3RpdmUiOworICAgICAgICBjYXNlIEFfQ0FMTF9IRUxEOiAgICAgcmV0dXJuICJoZWxkIjsKKyAgICAgICAgY2FzZSBBX0NBTExfQUxFUlRJTkc6IHJldHVybiAicmluZ2luZyI7CisgICAgICAgIGNhc2UgQV9DQUxMX1dBSVRJTkc6ICByZXR1cm4gIndhaXRpbmciOworICAgICAgICBjYXNlIEFfQ0FMTF9JTkNPTUlORzogcmV0dXJuICJpbmNvbWluZyI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7CisgICAgfQorfQorCitzdGF0aWMgaW50Citkb19nc21fbGlzdCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgcGhvbmUgbnVtYmVyIG1hZGUgb2YgZGlnaXRzICovCisgICAgaW50ICAgY291bnQgPSBhbW9kZW1fZ2V0X2NhbGxfY291bnQoIGFuZHJvaWRfbW9kZW0gKTsKKyAgICBpbnQgICBubjsKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKykgeworICAgICAgICBBQ2FsbCAgICAgICAgY2FsbCA9IGFtb2RlbV9nZXRfY2FsbCggYW5kcm9pZF9tb2RlbSwgbm4gKTsKKyAgICAgICAgY29uc3QgY2hhciogIGRpcjsKKworICAgICAgICBpZiAoY2FsbCA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGNhbGwtPmRpciA9PSBBX0NBTExfT1VUQk9VTkQpCisgICAgICAgICAgICBkaXIgPSAib3V0Ym91bmQgdG8gIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRpciA9ICJpbmJvdW5kIGZyb20iOworCisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIiVzICUtMTBzIDogJXNcclxuIiwgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5udW1iZXIsIGNhbGxfc3RhdGVfdG9fc3RyaW5nKGNhbGwtPnN0YXRlKSApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fZ3NtX2J1c3koIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIEFDYWxsICBjYWxsOworCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ2dzbSBidXN5IDxwaG9uZW51bWJlcj4nXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjYWxsID0gYW1vZGVtX2ZpbmRfY2FsbF9ieV9udW1iZXIoIGFuZHJvaWRfbW9kZW0sIGFyZ3MgKTsKKyAgICBpZiAoY2FsbCA9PSBOVUxMIHx8IGNhbGwtPmRpciAhPSBBX0NBTExfT1VUQk9VTkQpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG5vIGN1cnJlbnQgb3V0Ym91bmQgY2FsbCB0byBudW1iZXIgJyVzJyAoY2FsbCAlcClcclxuIiwgYXJncywgY2FsbCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggYW1vZGVtX2Rpc2Nvbm5lY3RfY2FsbCggYW5kcm9pZF9tb2RlbSwgYXJncyApIDwgMCApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGNvdWxkIG5vdCBjYW5jZWwgdGhpcyBudW1iZXJcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19nc21faG9sZCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgQUNhbGwgIGNhbGw7CisKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG1pc3NpbmcgYXJndW1lbnQsIHRyeSAnZ3NtIGhvbGQgPHBob25lbnVtYmVyPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNhbGwgPSBhbW9kZW1fZmluZF9jYWxsX2J5X251bWJlciggYW5kcm9pZF9tb2RlbSwgYXJncyApOworICAgIGlmIChjYWxsID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG5vIGN1cnJlbnQgY2FsbCB0by9mcm9tIG51bWJlciAnJXMnXHJcbiIsIGFyZ3MgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGFtb2RlbV91cGRhdGVfY2FsbCggYW5kcm9pZF9tb2RlbSwgYXJncywgQV9DQUxMX0hFTEQgKSA8IDAgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBjb3VsZCBwdXQgdGhpcyBjYWxsIG9uIGhvbGRcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK2RvX2dzbV9hY2NlcHQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIEFDYWxsICBjYWxsOworCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ2dzbSBhY2NlcHQgPHBob25lbnVtYmVyPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNhbGwgPSBhbW9kZW1fZmluZF9jYWxsX2J5X251bWJlciggYW5kcm9pZF9tb2RlbSwgYXJncyApOworICAgIGlmIChjYWxsID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG5vIGN1cnJlbnQgY2FsbCB0by9mcm9tIG51bWJlciAnJXMnXHJcbiIsIGFyZ3MgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGFtb2RlbV91cGRhdGVfY2FsbCggYW5kcm9pZF9tb2RlbSwgYXJncywgQV9DQUxMX0FDVElWRSApIDwgMCApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGNvdWxkIG5vdCBhY3RpdmF0ZSB0aGlzIGNhbGxcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citkb19nc21fc2lnbmFsKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBlbnVtIHsgU0lHTkFMX1JTU0kgPSAwLCBTSUdOQUxfQkVSLCBOVU1fU0lHTkFMX1BBUkFNUyB9OworICAgIGNoYXIqICAgcCA9IGFyZ3M7CisgICAgaW50ICAgICB0b3BfcGFyYW0gPSAtMTsKKyAgICBpbnQgICAgIHBhcmFtc1sgTlVNX1NJR05BTF9QQVJBTVMgXTsKKworICAgIHN0YXRpYyAgaW50ICBsYXN0X2JlciA9IDk5OworCisgICAgaWYgKCFwKQorICAgICAgICBwID0gIiI7CisKKyAgICAvKiB0b2tlbml6ZSAqLworICAgIHdoaWxlICgqcCkgeworICAgICAgICBjaGFyKiAgIGVuZDsKKyAgICAgICAgaW50ICB2YWwgPSBzdHJ0b2woIHAsICZlbmQsIDEwICk7CisKKyAgICAgICAgaWYgKGVuZCA9PSBwKSB7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYXJndW1lbnQgJyVzJyBpcyBub3QgYSBudW1iZXJcbiIsIHAgKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtc1srK3RvcF9wYXJhbV0gPSB2YWw7CisgICAgICAgIGlmICh0b3BfcGFyYW0gKyAxID09IE5VTV9TSUdOQUxfUEFSQU1TKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9IGVuZDsKKyAgICAgICAgd2hpbGUgKCpwICYmIChwWzBdID09ICcgJyB8fCBwWzBdID09ICdcdCcpKQorICAgICAgICAgICAgcCArPSAxOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmICh0b3BfcGFyYW0gPCBTSUdOQUxfUlNTSSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbm90IGVub3VnaCBhcmd1bWVudHM6IHNlZSAnaGVscCBnc20gc2lnbmFsJyBmb3IgZGV0YWlsc1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgcnNzaSA9IHBhcmFtc1tTSUdOQUxfUlNTSV07CisgICAgaWYgKChyc3NpIDwgMCB8fCByc3NpID4gMzEpICYmIHJzc2kgIT0gOTkpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGludmFsaWQgUlNTSSAtIG11c3QgYmUgMC4uMzEgb3IgOTlcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjaGVjayBiZXIgaXMgMC4uNyBvciA5OSAqLworICAgIGlmICh0b3BfcGFyYW0gPj0gU0lHTkFMX0JFUikgeworICAgICAgICBpbnQgYmVyID0gcGFyYW1zW1NJR05BTF9CRVJdOworICAgICAgICBpZiAoKGJlciA8IDAgfHwgYmVyID4gNykgJiYgYmVyICE9IDk5KSB7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogaW52YWxpZCBCRVIgLSBtdXN0IGJlIDAuLjcgb3IgOTlcclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbGFzdF9iZXIgPSBiZXI7CisgICAgfQorCisgICAgYW1vZGVtX3NldF9zaWduYWxfc3RyZW5ndGgoIGFuZHJvaWRfbW9kZW0sIHJzc2ksIGxhc3RfYmVyICk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fZ3NtX3NpZ25hbF9wcm9maWxlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBjaGFyKiBlbmQ7CisgICAgY2hhciogICBwID0gYXJnczsKKyAgICBpZiAoIXApCisgICAgICAgIHAgPSAiIjsKKyAgICBpbnQgIHZhbCA9IHN0cnRvbCggcCwgJmVuZCwgMTAgKTsKKworICAgIGlmIChlbmQgPT0gcCkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYXJndW1lbnQgJyVzJyBpcyBub3QgYSBudW1iZXJcclxuIiwgcCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gNCkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogaW52YWxpZCBzaWduYWwgc3RyZW5ndGggLSBtdXN0IGJlIDAuLjRcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhbW9kZW1fc2V0X3NpZ25hbF9zdHJlbmd0aF9wcm9maWxlKCBhbmRyb2lkX21vZGVtLCB2YWwgKTsKKworICAgIHJldHVybiAwOworfQorCisKKyNpZiAwCitzdGF0aWMgY29uc3QgQ29tbWFuZERlZlJlYyAgZ3NtX2luX2NvbW1hbmRzW10gPQoreworICAgIHsgIm5ldyIsICJjcmVhdGUgYSBuZXcgJ3dhaXRpbmcnIGluYm91bmQgY2FsbCIsCisgICAgIidnc20gaW4gY3JlYXRlIDxwaG9uZW51bWJlcj4nIGNyZWF0ZXMgYSBuZXcgaW5ib3VuZCBwaG9uZSBjYWxsLCBwbGFjZWQgaW5cclxuIgorICAgICJ0aGUgJ3dhaXRpbmcnIHN0YXRlIGJ5IGRlZmF1bHQsIHVudGlsIHRoZSBzeXN0ZW0gYW5zd2Vycy9ob2xkcy9jbG9zZXMgaXRcclxuIiwgTlVMTAorICAgIGRvX2dzbV9pbl9jcmVhdGUsIE5VTEwgfSwKKworICAgIHsgImhvbGQiLCAiY2hhbmdlIHRoZSBzdGF0ZSBvZiBhbiBvdXRib3VuZCBjYWxsIHRvICdoZWxkJyIsCisgICAgImNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gb3V0Ym91bmQgY2FsbCB0byAnaGVsZCcuIHRoaXMgaXMgb25seSBwb3NzaWJsZVxyXG4iCisgICAgImlmIHRoZSBjYWxsIGluIHRoZSAnd2FpdGluZycgb3IgJ2FjdGl2ZScgc3RhdGVcclxuIiwgTlVMTCwKKyAgICBkb19nc21fb3V0X2hvbGQsIE5VTEwgfSwKKworICAgIHsgImFjY2VwdCIsICJjaGFuZ2UgdGhlIHN0YXRlIG9mIGFuIG91dGJvdW5kIGNhbGwgdG8gJ2FjdGl2ZSciLAorICAgICJjaGFuZ2UgdGhlIHN0YXRlIG9mIGFuIG91dGJvdW5kIGNhbGwgdG8gJ2FjdGl2ZScuIHRoaXMgaXMgb25seSBwb3NzaWJsZVxyXG4iCisgICAgImlmIHRoZSBjYWxsIGlzIGluIHRoZSAnd2FpdGluZycgb3IgJ2hlbGQnIHN0YXRlXHJcbiIsIE5VTEwsCisgICAgZG9fZ3NtX291dF9hY2NlcHQsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworI2VuZGlmCisKKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIGNkbWFfY29tbWFuZHNbXSA9Cit7CisgICAgeyAic3NvdXJjZSIsICJTZXQgdGhlIGN1cnJlbnQgQ0RNQSBzdWJzY3JpcHRpb24gc291cmNlIiwKKyAgICAgIE5VTEwsIGRlc2NyaWJlX3N1YnNjcmlwdGlvbl9zb3VyY2UsCisgICAgICBkb19jZG1hX3Nzb3VyY2UsIE5VTEwgfSwKKyAgICB7ICJwcmxfdmVyc2lvbiIsICJEdW1wIHRoZSBjdXJyZW50IFBSTCB2ZXJzaW9uIiwKKyAgICAgIE5VTEwsIE5VTEwsCisgICAgICBkb19jZG1hX3BybF92ZXJzaW9uLCBOVUxMIH0sCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBDb21tYW5kRGVmUmVjICBnc21fY29tbWFuZHNbXSA9Cit7CisgICAgeyAibGlzdCIsICJsaXN0IGN1cnJlbnQgcGhvbmUgY2FsbHMiLAorICAgICInZ3NtIGxpc3QnIGxpc3RzIGFsbCBpbmJvdW5kIGFuZCBvdXRib3VuZCBjYWxscyBhbmQgdGhlaXIgc3RhdGVcclxuIiwgTlVMTCwKKyAgICBkb19nc21fbGlzdCwgTlVMTCB9LAorCisgICAgeyAiY2FsbCIsICJjcmVhdGUgaW5ib3VuZCBwaG9uZSBjYWxsIiwKKyAgICAiJ2dzbSBjYWxsIDxwaG9uZW51bWJlcj4nIGFsbG93cyB5b3UgdG8gc2ltdWxhdGUgYSBuZXcgaW5ib3VuZCBjYWxsXHJcbiIsIE5VTEwsCisgICAgZG9fZ3NtX2NhbGwsIE5VTEwgfSwKKworICAgIHsgImJ1c3kiLCAiY2xvc2Ugd2FpdGluZyBvdXRib3VuZCBjYWxsIGFzIGJ1c3kiLAorICAgICInZ3NtIGJ1c3kgPHJlbW90ZU51bWJlcj4nIGNsb3NlcyBhbiBvdXRib3VuZCBjYWxsLCByZXBvcnRpbmdcclxuIgorICAgICJ0aGUgcmVtb3RlIHBob25lIGFzIGJ1c3kuIG9ubHkgcG9zc2libGUgaWYgdGhlIGNhbGwgaXMgJ3dhaXRpbmcnLlxyXG4iLCBOVUxMLAorICAgIGRvX2dzbV9idXN5LCBOVUxMIH0sCisKKyAgICB7ICJob2xkIiwgImNoYW5nZSB0aGUgc3RhdGUgb2YgYW4gb3V0Ym91bmQgY2FsbCB0byAnaGVsZCciLAorICAgICInZ3NtIGhvbGQgPHJlbW90ZU51bWJlcj4nIGNoYW5nZSB0aGUgc3RhdGUgb2YgYSBjYWxsIHRvICdoZWxkJy4gdGhpcyBpcyBvbmx5IHBvc3NpYmxlXHJcbiIKKyAgICAiaWYgdGhlIGNhbGwgaW4gdGhlICd3YWl0aW5nJyBvciAnYWN0aXZlJyBzdGF0ZVxyXG4iLCBOVUxMLAorICAgIGRvX2dzbV9ob2xkLCBOVUxMIH0sCisKKyAgICB7ICJhY2NlcHQiLCAiY2hhbmdlIHRoZSBzdGF0ZSBvZiBhbiBvdXRib3VuZCBjYWxsIHRvICdhY3RpdmUnIiwKKyAgICAiJ2dzbSBhY2NlcHQgPHJlbW90ZU51bWJlcj4nIGNoYW5nZSB0aGUgc3RhdGUgb2YgYSBjYWxsIHRvICdhY3RpdmUnLiB0aGlzIGlzIG9ubHkgcG9zc2libGVcclxuIgorICAgICJpZiB0aGUgY2FsbCBpcyBpbiB0aGUgJ3dhaXRpbmcnIG9yICdoZWxkJyBzdGF0ZVxyXG4iLCBOVUxMLAorICAgIGRvX2dzbV9hY2NlcHQsIE5VTEwgfSwKKworICAgIHsgImNhbmNlbCIsICJkaXNjb25uZWN0IGFuIGluYm91bmQgb3Igb3V0Ym91bmQgcGhvbmUgY2FsbCIsCisgICAgIidnc20gY2FuY2VsIDxwaG9uZW51bWJlcj4nIGFsbG93cyB5b3UgdG8gc2ltdWxhdGUgdGhlIGVuZCBvZiBhbiBpbmJvdW5kIG9yIG91dGJvdW5kIGNhbGxcclxuIiwgTlVMTCwKKyAgICBkb19nc21fY2FuY2VsLCBOVUxMIH0sCisKKyAgICB7ICJkYXRhIiwgIm1vZGlmeSBkYXRhIGNvbm5lY3Rpb24gc3RhdGUiLCBOVUxMLCBoZWxwX2dzbV9kYXRhLAorICAgIGRvX2dzbV9kYXRhLCBOVUxMIH0sCisKKyAgICB7ICJ2b2ljZSIsICJtb2RpZnkgdm9pY2UgY29ubmVjdGlvbiBzdGF0ZSIsIE5VTEwsIGhlbHBfZ3NtX3ZvaWNlLAorICAgIGRvX2dzbV92b2ljZSwgTlVMTCB9LAorCisgICAgeyAic3RhdHVzIiwgImRpc3BsYXkgR1NNIHN0YXR1cyIsCisgICAgIidnc20gc3RhdHVzJyBkaXNwbGF5cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgR1NNIGVtdWxhdGlvblxyXG4iLCBOVUxMLAorICAgIGRvX2dzbV9zdGF0dXMsIE5VTEwgfSwKKworICAgIHsgInNpZ25hbCIsICJzZXQgc2V0cyB0aGUgcnNzaSBhbmQgYmVyIiwKKyAgICAiJ2dzbSBzaWduYWwgPHJzc2k+IFs8YmVyPl0nIGNoYW5nZXMgdGhlIHJlcG9ydGVkIHN0cmVuZ3RoIGFuZCBlcnJvciByYXRlIG9uIG5leHQgKDE1cykgdXBkYXRlLlxyXG4iCisgICAgInJzc2kgcmFuZ2UgaXMgMC4uMzEgYW5kIDk5IGZvciB1bmtub3duXHJcbiIKKyAgICAiYmVyIHJhbmdlIGlzIDAuLjcgcGVyY2VudCBhbmQgOTkgZm9yIHVua25vd25cclxuIiwKKyAgICBOVUxMLCBkb19nc21fc2lnbmFsLCBOVUxMIH0sCisKKyAgICB7ICJzaWduYWwtcHJvZmlsZSIsICJzZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBwcm9maWxlIiwKKyAgICAiJ2dzbSBzaWduYWwtcHJvZmlsZSA8c3RyZW5ndGg+JyBjaGFuZ2VzIHRoZSByZXBvcnRlZCBzdHJlbmd0aCBvbiBuZXh0ICgxNXMpIHVwZGF0ZS5cclxuIgorICAgICJzdHJlbmd0aCByYW5nZSBpcyAwLi40XHJcbiIsCisgICAgTlVMTCwgZG9fZ3NtX3NpZ25hbF9wcm9maWxlLCBOVUxMIH0sCisKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgUyBNIFMgICBDIE8gTSBNIEEgTiBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citkb19zbXNfc2VuZCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgY2hhciogICAgICAgICAgcDsKKyAgICBpbnQgICAgICAgICAgICB0ZXh0bGVuOworICAgIFNtc0FkZHJlc3NSZWMgIHNlbmRlcjsKKyAgICBTbXNQRFUqICAgICAgICBwZHVzOworICAgIGludCAgICAgICAgICAgIG5uOworCisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgcGhvbmUgbnVtYmVyIG1hZGUgb2YgZGlnaXRzICovCisgICAgaWYgKCFhcmdzKSB7CisgICAgTWlzc2luZ0FyZ3VtZW50OgorICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbWlzc2luZyBhcmd1bWVudCwgdHJ5ICdzbXMgc2VuZCA8cGhvbmVudW1iZXI+IDx0ZXh0IG1lc3NhZ2U+J1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcCA9IHN0cmNociggYXJncywgJyAnICk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIGdvdG8gTWlzc2luZ0FyZ3VtZW50OworICAgIH0KKworICAgIGlmICggc21zX2FkZHJlc3NfZnJvbV9zdHIoICZzZW5kZXIsIGFyZ3MsIHAgLSBhcmdzICkgPCAwICkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYmFkIHBob25lIG51bWJlciBmb3JtYXQsIG11c3QgYmUgWytdKDAtOSkqXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworCisgICAgLyogdW4tZXNjYXBlIG1lc3NhZ2UgdGV4dCBpbnRvIHByb3BlciB1dGYtOCAoY29udmVyc2lvbiBoYXBwZW5zIGluLXNpdGUpICovCisgICAgcCAgICAgICs9IDE7CisgICAgdGV4dGxlbiA9IHN0cmxlbihwKTsKKyAgICB0ZXh0bGVuID0gc21zX3V0ZjhfZnJvbV9tZXNzYWdlX3N0ciggcCwgdGV4dGxlbiwgKHVuc2lnbmVkIGNoYXIqKXAsIHRleHRsZW4gKTsKKyAgICBpZiAodGV4dGxlbiA8IDApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAibWVzc2FnZSBtdXN0IGJlIHV0ZjggYW5kIGNhbiB1c2UgdGhlIGZvbGxvd2luZyBlc2NhcGVzOlxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgXFxuICAgICAgZm9yIGEgbmV3bGluZVxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgXFx4Tk4gICAgd2hlcmUgTk4gYXJlIHR3byBoZXhhZGVjaW1hbCBudW1iZXJzXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcXHVOTk5OICB3aGVyZSBOTk5OIGFyZSBmb3VyIGhleGFkZWNpbWFsIG51bWJlcnNcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgIFxcXFwgICAgIHRvIHNlbmQgYSAnXFwnIGNoYXJhY3RlclxyXG5cclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFueXRoaW5nIGVsc2UgaXMgYW4gZXJyb3JcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiS086IGJhZGx5IGZvcm1hdHRlZCB0ZXh0XHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghYW5kcm9pZF9tb2RlbSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbW9kZW0gZW11bGF0aW9uIG5vdCBydW5uaW5nXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBhIGxpc3Qgb2YgU01TIFBEVXMsIHRoZW4gc2VuZCB0aGVtICovCisgICAgcGR1cyA9IHNtc3BkdV9jcmVhdGVfZGVsaXZlcl91dGY4KCAoY2J5dGVzX3QpcCwgdGV4dGxlbiwgJnNlbmRlciwgTlVMTCApOworICAgIGlmIChwZHVzID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGludGVybmFsIGVycm9yIHdoZW4gY3JlYXRpbmcgU01TLURFTElWRVIgUERVc1xuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChubiA9IDA7IHBkdXNbbm5dICE9IE5VTEw7IG5uKyspCisgICAgICAgIGFtb2RlbV9yZWNlaXZlX3NtcyggYW5kcm9pZF9tb2RlbSwgcGR1c1tubl0gKTsKKworICAgIHNtc3BkdV9mcmVlX2xpc3QoIHBkdXMgKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fc21zX3NlbmRwZHUoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIFNtc1BEVSAgcGR1OworCisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgcGhvbmUgbnVtYmVyIG1hZGUgb2YgZGlnaXRzICovCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBtaXNzaW5nIGFyZ3VtZW50LCB0cnkgJ3NtcyBzZW5kcGR1IDxoZXhzdHJpbmc+J1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IG1vZGVtIGVtdWxhdGlvbiBub3QgcnVubmluZ1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwZHUgPSBzbXNwZHVfY3JlYXRlX2Zyb21faGV4KCBhcmdzLCBzdHJsZW4oYXJncykgKTsKKyAgICBpZiAocGR1ID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGJhZGx5IGZvcm1hdHRlZCA8aGV4c3RyaW5nPlxyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhbW9kZW1fcmVjZWl2ZV9zbXMoIGFuZHJvaWRfbW9kZW0sIHBkdSApOworICAgIHNtc3BkdV9mcmVlKCBwZHUgKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIHNtc19jb21tYW5kc1tdID0KK3sKKyAgICB7ICJzZW5kIiwgInNlbmQgaW5ib3VuZCBTTVMgdGV4dCBtZXNzYWdlIiwKKyAgICAiJ3NtcyBzZW5kIDxwaG9uZW51bWJlcj4gPG1lc3NhZ2U+JyBhbGxvd3MgeW91IHRvIHNpbXVsYXRlIGEgbmV3IGluYm91bmQgc21zIG1lc3NhZ2VcclxuIiwgTlVMTCwKKyAgICBkb19zbXNfc2VuZCwgTlVMTCB9LAorCisgICAgeyAicGR1IiwgInNlbmQgaW5ib3VuZCBTTVMgUERVIiwKKyAgICAiJ3NtcyBwZHUgPGhleHN0cmluZz4nIGFsbG93cyB5b3UgdG8gc2ltdWxhdGUgYSBuZXcgaW5ib3VuZCBzbXMgUERVXHJcbiIKKyAgICAiKHVzZWQgaW50ZXJuYWxseSB3aGVuIG9uZSBlbXVsYXRvciBzZW5kcyBTTVMgbWVzc2FnZXMgdG8gYW5vdGhlciBpbnN0YW5jZSkuXHJcbiIKKyAgICAieW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gcGxheSB3aXRoIHRoaXMgYXQgYWxsXHJcbiIsIE5VTEwsCisgICAgZG9fc21zX3NlbmRwZHUsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKiogKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFAgTyBXIEUgUiAgIEMgTyBNIE0gQSBOIEQgKioqKioqLworLyoqKioqICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBkb19jb250cm9sX3dyaXRlKHZvaWQqIG9wYXF1ZSwgY29uc3QgY2hhciogYXJncykgeworICAgIGNvbnRyb2xfd3JpdGUoKENvbnRyb2xDbGllbnQpb3BhcXVlLCBhcmdzKTsKK30KKworc3RhdGljIGludAorZG9fcG93ZXJfZGlzcGxheSggQ29udHJvbENsaWVudCBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+YmF0dGVyeURpc3BsYXkoY2xpZW50LCBjb250cm9sX3dyaXRlX291dF9jYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2FjX3N0YXRlKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpZiAoYXJncykgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAib24iKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0SXNDaGFyZ2luZyh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJvZmYiKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0SXNDaGFyZ2luZyhmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBVc2FnZTogXCJhYyBvblwiIG9yIFwiYWMgb2ZmXCJcbiIgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2JhdHRlcnlfc3RhdHVzKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpZiAoYXJncykgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAidW5rbm93biIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRTdGF0dXMoQkFUVEVSWV9TVEFUVVNfVU5LTk9XTik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAiY2hhcmdpbmciKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0U3RhdHVzKEJBVFRFUllfU1RBVFVTX0NIQVJHSU5HKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJkaXNjaGFyZ2luZyIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRTdGF0dXMoCisgICAgICAgICAgICAgICAgICAgIEJBVFRFUllfU1RBVFVTX0RJU0NIQVJHSU5HKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJub3QtY2hhcmdpbmciKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0U3RhdHVzKAorICAgICAgICAgICAgICAgICAgICBCQVRURVJZX1NUQVRVU19OT1RfQ0hBUkdJTkcpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNhc2VjbXAoYXJncywgImZ1bGwiKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0U3RhdHVzKEJBVFRFUllfU1RBVFVTX0ZVTEwpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogVXNhZ2U6IFwic3RhdHVzIHVua25vd258Y2hhcmdpbmd8ZGlzY2hhcmdpbmd8bm90LWNoYXJnaW5nfGZ1bGxcIlxuIiApOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAorZG9fYmF0dGVyeV9wcmVzZW50KCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpZiAoYXJncykgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAidHJ1ZSIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRJc0JhdHRlcnlQcmVzZW50KHRydWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNhc2VjbXAoYXJncywgImZhbHNlIikgPT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5nbG9iYWwtPmJhdHRlcnlfYWdlbnQtPnNldElzQmF0dGVyeVByZXNlbnQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBVc2FnZTogXCJwcmVzZW50IHRydWVcIiBvciBcInByZXNlbnQgZmFsc2VcIlxuIiApOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAorZG9fYmF0dGVyeV9oZWFsdGgoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGlmIChhcmdzKSB7CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJ1bmtub3duIikgPT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5nbG9iYWwtPmJhdHRlcnlfYWdlbnQtPnNldEhlYWx0aChCQVRURVJZX0hFQUxUSF9VTktOT1dOKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJnb29kIikgPT0gMCkgeworICAgICAgICAgICAgY2xpZW50LT5nbG9iYWwtPmJhdHRlcnlfYWdlbnQtPnNldEhlYWx0aChCQVRURVJZX0hFQUxUSF9HT09EKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjYXNlY21wKGFyZ3MsICJvdmVyaGVhdCIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRIZWFsdGgoQkFUVEVSWV9IRUFMVEhfT1ZFUkhFQVRFRCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAiZGVhZCIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRIZWFsdGgoQkFUVEVSWV9IRUFMVEhfREVBRCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAib3ZlcnZvbHRhZ2UiKSA9PSAwKSB7CisgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+YmF0dGVyeV9hZ2VudC0+c2V0SGVhbHRoKAorICAgICAgICAgICAgICAgICAgICBCQVRURVJZX0hFQUxUSF9PVkVSVk9MVEFHRSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY2FzZWNtcChhcmdzLCAiZmFpbHVyZSIpID09IDApIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5iYXR0ZXJ5X2FnZW50LT5zZXRIZWFsdGgoQkFUVEVSWV9IRUFMVEhfRkFJTEVEKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IFVzYWdlOiBcImhlYWx0aCB1bmtub3dufGdvb2R8b3ZlcmhlYXR8ZGVhZHxvdmVydm9sdGFnZXxmYWlsdXJlXCJcbiIgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2JhdHRlcnlfY2FwYWNpdHkoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGlmIChhcmdzKSB7CisgICAgICAgIGludCBjYXBhY2l0eTsKKworICAgICAgICBpZiAoc3NjYW5mKGFyZ3MsICIlZCIsICZjYXBhY2l0eSkgPT0gMSAmJiBjYXBhY2l0eSA+PSAwICYmIGNhcGFjaXR5IDw9IDEwMCkgeworICAgICAgICAgICAgY2xpZW50LT5nbG9iYWwtPmJhdHRlcnlfYWdlbnQtPnNldENoYXJnZUxldmVsKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IFVzYWdlOiBcImNhcGFjaXR5IDxwZXJjZW50YWdlPlwiXG4iICk7CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyBjb25zdCBDb21tYW5kRGVmUmVjICBwb3dlcl9jb21tYW5kc1tdID0KK3sKKyAgICB7ICJkaXNwbGF5IiwgImRpc3BsYXkgYmF0dGVyeSBhbmQgY2hhcmdlciBzdGF0ZSIsCisgICAgImRpc3BsYXkgYmF0dGVyeSBhbmQgY2hhcmdlciBzdGF0ZVxyXG4iLCBOVUxMLAorICAgIGRvX3Bvd2VyX2Rpc3BsYXksIE5VTEwgfSwKKworICAgIHsgImFjIiwgInNldCBBQyBjaGFyZ2luZyBzdGF0ZSIsCisgICAgIidhYyBvbnxvZmYnIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBBQyBjaGFyZ2luZyBzdGF0ZSB0byBvbiBvciBvZmZcclxuIiwgTlVMTCwKKyAgICBkb19hY19zdGF0ZSwgTlVMTCB9LAorCisgICAgeyAic3RhdHVzIiwgInNldCBiYXR0ZXJ5IHN0YXR1cyIsCisgICAgIidzdGF0dXMgdW5rbm93bnxjaGFyZ2luZ3xkaXNjaGFyZ2luZ3xub3QtY2hhcmdpbmd8ZnVsbCcgYWxsb3dzIHlvdSB0byBzZXQgYmF0dGVyeSBzdGF0dXNcclxuIiwgTlVMTCwKKyAgICBkb19iYXR0ZXJ5X3N0YXR1cywgTlVMTCB9LAorCisgICAgeyAicHJlc2VudCIsICJzZXQgYmF0dGVyeSBwcmVzZW50IHN0YXRlIiwKKyAgICAiJ3ByZXNlbnQgdHJ1ZXxmYWxzZScgYWxsb3dzIHlvdSB0byBzZXQgYmF0dGVyeSBwcmVzZW50IHN0YXRlIHRvIHRydWUgb3IgZmFsc2VcclxuIiwgTlVMTCwKKyAgICBkb19iYXR0ZXJ5X3ByZXNlbnQsIE5VTEwgfSwKKworICAgIHsgImhlYWx0aCIsICJzZXQgYmF0dGVyeSBoZWFsdGggc3RhdGUiLAorICAgICInaGVhbHRoIHVua25vd258Z29vZHxvdmVyaGVhdHxkZWFkfG92ZXJ2b2x0YWdlfGZhaWx1cmUnIGFsbG93cyB5b3UgdG8gc2V0IGJhdHRlcnkgaGVhbHRoIHN0YXRlXHJcbiIsIE5VTEwsCisgICAgZG9fYmF0dGVyeV9oZWFsdGgsIE5VTEwgfSwKKworICAgIHsgImNhcGFjaXR5IiwgInNldCBiYXR0ZXJ5IGNhcGFjaXR5IHN0YXRlIiwKKyAgICAiJ2NhcGFjaXR5IDxwZXJjZW50YWdlPicgYWxsb3dzIHlvdSB0byBzZXQgYmF0dGVyeSBjYXBhY2l0eSB0byBhIHZhbHVlIDAgLSAxMDBcclxuIiwgTlVMTCwKKyAgICBkb19iYXR0ZXJ5X2NhcGFjaXR5LCBOVUxMIH0sCisKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIEUgIFYgIEUgIE4gIFQgICBDIE8gTSBNIEEgTiBEIFMgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQKK2RvX2V2ZW50X3NlbmQoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGNoYXIqICAgcDsKKworICAgIGlmICghYXJncykgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogVXNhZ2U6IGV2ZW50IHNlbmQgPHR5cGU+Ojxjb2RlPjo8dmFsdWU+IC4uLlxyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwID0gYXJnczsKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgY2hhciogIHE7CisgICAgICAgIGNoYXIgICB0ZW1wWzEyOF07CisgICAgICAgIGludCAgICB0eXBlLCBjb2RlLCB2YWx1ZSwgcmV0OworCisgICAgICAgIHAgKz0gc3Ryc3BuKCBwLCAiIFx0IiApOyAgLyogc2tpcCBzcGFjZXMgKi8KKyAgICAgICAgaWYgKCpwID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBxICA9IHAgKyBzdHJjc3BuKCBwLCAiIFx0IiApOworCisgICAgICAgIGlmIChxID09IHApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzbnByaW50Zih0ZW1wLCBzaXplb2YgdGVtcCwgIiUuKnMiLCAoaW50KShpbnRwdHJfdCkocS1wKSwgcCk7CisgICAgICAgIHJldCA9IGFuZHJvaWRfZXZlbnRfZnJvbV9zdHIoIHRlbXAsICZ0eXBlLCAmY29kZSwgJnZhbHVlICk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLTzogaW52YWxpZCBldmVudCB0eXBlIGluICclLipzJywgdHJ5ICdldmVudCBsaXN0IHR5cGVzJyBmb3IgdmFsaWQgdmFsdWVzXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS1wLCBwICk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAtMikgeworICAgICAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS086IGludmFsaWQgZXZlbnQgY29kZSBpbiAnJS4qcycsIHRyeSAnZXZlbnQgbGlzdCBjb2RlcyA8dHlwZT4nIGZvciB2YWxpZCB2YWx1ZXNcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLXAsIHAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLTzogaW52YWxpZCBldmVudCB2YWx1ZSBpbiAnJS4qcycsIG11c3QgYmUgYW4gaW50ZWdlclxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtcCwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBjbGllbnQtPmdsb2JhbC0+dXNlcl9ldmVudF9hZ2VudC0+c2VuZEdlbmVyaWNFdmVudCh0eXBlLCBjb2RlLCB2YWx1ZSk7CisgICAgICAgIHAgPSBxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fZXZlbnRfdHlwZXMoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGludCAgY291bnQgPSBhbmRyb2lkX2V2ZW50X2dldF90eXBlX2NvdW50KCk7CisgICAgaW50ICBubjsKKworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgImV2ZW50IDx0eXBlPiBjYW4gYmUgYW4gaW50ZWdlciBvciBvbmUgb2YgdGhlIGZvbGxvd2luZyBhbGlhc2VzXHJcbiIgKTsKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKykgeworICAgICAgICBjaGFyICB0bXBbMTZdOworICAgICAgICBjaGFyKiBwID0gdG1wOworICAgICAgICBjaGFyKiBlbmQgPSBwICsgc2l6ZW9mKHRtcCk7CisgICAgICAgIGludCAgIGNvdW50MiA9IGFuZHJvaWRfZXZlbnRfZ2V0X2NvZGVfY291bnQoIG5uICk7OworCisgICAgICAgIHAgPSBhbmRyb2lkX2V2ZW50X2J1ZnByaW50X3R5cGVfc3RyKCBwLCBlbmQsIG5uICk7CisKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiICAgICUtOHMiLCB0bXAgKTsKKyAgICAgICAgaWYgKGNvdW50MiA+IDApCisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgICglZCBjb2RlIGFsaWFzZXMpIiwgY291bnQyICk7CisKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiXHJcbiIgKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2V2ZW50X2NvZGVzKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpbnQgIGNvdW50OworICAgIGludCAgbm4sIHR5cGUsIGR1bW15OworCisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBhcmd1bWVudCBtaXNzaW5nLCB0cnkgJ2V2ZW50IGNvZGVzIDx0eXBlPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCBhbmRyb2lkX2V2ZW50X2Zyb21fc3RyKCBhcmdzLCAmdHlwZSwgJmR1bW15LCAmZHVtbXkgKSA8IDAgKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBiYWQgYXJndW1lbnQsIHNlZSAnZXZlbnQgdHlwZXMnIGZvciB2YWxpZCB2YWx1ZXNcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY291bnQgPSBhbmRyb2lkX2V2ZW50X2dldF9jb2RlX2NvdW50KCB0eXBlICk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAibm8gY29kZSBhbGlhc2VzIGRlZmluZWQgZm9yIHRoaXMgdHlwZVxyXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAidHlwZSAnJXMnIGFjY2VwdHMgdGhlIGZvbGxvd2luZyA8Y29kZT4gYWxpYXNlczpcclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXJncyApOworICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKykgeworICAgICAgICAgICAgY2hhciAgdGVtcFsyMF0sICpwID0gdGVtcCwgKmVuZCA9IHAgKyBzaXplb2YodGVtcCk7CisgICAgICAgICAgICBhbmRyb2lkX2V2ZW50X2J1ZnByaW50X2NvZGVfc3RyKCBwLCBlbmQsIHR5cGUsIG5uICk7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICIgICAgJS0xMnNcclxuIiwgdGVtcCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAordXRmOF9uZXh0KCB1bnNpZ25lZCBjaGFyKiAqcHAsIHVuc2lnbmVkIGNoYXIqICBlbmQgKQoreworICAgIHVuc2lnbmVkIGNoYXIqICBwICAgICAgPSAqcHA7CisgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworCisgICAgaWYgKHAgPCBlbmQpIHsKKyAgICAgICAgaW50ICBjPSAqcCsrOworICAgICAgICBpZiAoYyA+PSAxMjgpIHsKKyAgICAgICAgICAgIGlmICgoYyAmIDB4ZTApID09IDB4YzApCisgICAgICAgICAgICAgICAgYyAmPSAweDFmOworICAgICAgICAgICAgZWxzZSBpZiAoKGMgJiAweGYwKSA9PSAweGUwKQorICAgICAgICAgICAgICAgIGMgJj0gMHgwZjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjICY9IDB4MDc7CisKKyAgICAgICAgICAgIHdoaWxlIChwIDwgZW5kICYmIChwWzBdICYgMHhjMCkgPT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGMgPSAoYyA8PCA2KSB8IChwWzBdICYgMHgzZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYzsKKyAgICAgICAgKnBwICAgID0gcDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorZG9fZXZlbnRfdGV4dCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgU2tpbktleWNvZGVCdWZmZXIga2V5Y29kZXM7CisgICAgdW5zaWduZWQgY2hhciogIHAgICA9ICh1bnNpZ25lZCBjaGFyKikgYXJnczsKKyAgICB1bnNpZ25lZCBjaGFyKiAgZW5kID0gcCArIHN0cmxlbihhcmdzKTsKKyAgICBpbnQgICAgICAgICAgICAgdGV4dGxlbjsKKyAgICBjb25zdCBTa2luQ2hhcm1hcCogY2hhcm1hcDsKKworICAgIGlmICghYXJncykgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYXJndW1lbnQgbWlzc2luZywgdHJ5ICdldmVudCB0ZXh0IDxtZXNzYWdlPidcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogR2V0IGFjdGl2ZSBjaGFybWFwLiAqLworICAgIGNoYXJtYXAgPSBza2luX2NoYXJtYXBfZ2V0KCk7CisgICAgaWYgKGNoYXJtYXAgPT0gTlVMTCkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogbm8gY2hhcmFjdGVyIG1hcCBhY3RpdmUgaW4gY3VycmVudCBkZXZpY2UgbGF5b3V0L2NvbmZpZ1xyXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBza2luX2tleWNvZGVfYnVmZmVyX2luaXQoJmtleWNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdsb2JhbC0+dXNlcl9ldmVudF9hZ2VudC0+c2VuZEtleUNvZGVzKTsKKworICAgIC8qIHVuLXNlY2FwZSBtZXNzYWdlIHRleHQgaW50byBwcm9wZXIgdXRmLTggKGNvbnZlcnNpb24gaGFwcGVucyBpbi1zaXRlKSAqLworICAgIHRleHRsZW4gPSBzdHJsZW4oKGNoYXIqKXApOworICAgIHRleHRsZW4gPSBzbXNfdXRmOF9mcm9tX21lc3NhZ2Vfc3RyKCBhcmdzLCB0ZXh0bGVuLCAodW5zaWduZWQgY2hhciopcCwgdGV4dGxlbiApOworICAgIGlmICh0ZXh0bGVuIDwgMCkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJtZXNzYWdlIG11c3QgYmUgdXRmOCBhbmQgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGVzY2FwZXM6XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcXG4gICAgICBmb3IgYSBuZXdsaW5lXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcXHhOTiAgICB3aGVyZSBOTiBhcmUgdHdvIGhleGFkZWNpbWFsIG51bWJlcnNcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAiICAgIFxcdU5OTk4gIHdoZXJlIE5OTk4gYXJlIGZvdXIgaGV4YWRlY2ltYWwgbnVtYmVyc1xyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgXFxcXCAgICAgdG8gc2VuZCBhICdcXCcgY2hhcmFjdGVyXHJcblxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIgICAgYW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvclxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJLTzogYmFkbHkgZm9ybWF0dGVkIHRleHRcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZW5kID0gcCArIHRleHRsZW47CisgICAgd2hpbGUgKHAgPCBlbmQpIHsKKyAgICAgICAgaW50ICBjID0gdXRmOF9uZXh0KCAmcCwgZW5kICk7CisgICAgICAgIGlmIChjIDw9IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBza2luX2NoYXJtYXBfcmV2ZXJzZV9tYXBfdW5pY29kZSggTlVMTCwgKHVuc2lnbmVkKWMsIDEsICZrZXljb2RlcyApOworICAgICAgICBza2luX2NoYXJtYXBfcmV2ZXJzZV9tYXBfdW5pY29kZSggTlVMTCwgKHVuc2lnbmVkKWMsIDAsICZrZXljb2RlcyApOworICAgICAgICBza2luX2tleWNvZGVfYnVmZmVyX2ZsdXNoKCAma2V5Y29kZXMgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIGV2ZW50X2NvbW1hbmRzW10gPQoreworICAgIHsgInNlbmQiLCAic2VuZCBhIHNlcmllcyBvZiBldmVudHMgdG8gdGhlIGtlcm5lbCIsCisgICAgIidldmVudCBzZW5kIDx0eXBlPjo8Y29kZT46PHZhbHVlPiAuLi4nIGFsbG93cyB5b3UgdG8gc2VuZCBvbmUgb3IgbW9yZSBoYXJkd2FyZSBldmVudHNcclxuIgorICAgICJ0byB0aGUgQW5kcm9pZCBrZXJuZWwuIFlvdSBjYW4gdXNlIHRleHQgbmFtZXMgb3IgaW50ZWdlcnMgZm9yIDx0eXBlPiBhbmQgPGNvZGU+XHJcbiIsIE5VTEwsCisgICAgZG9fZXZlbnRfc2VuZCwgTlVMTCB9LAorCisgICAgeyAidHlwZXMiLCAibGlzdCBhbGwgPHR5cGU+IGFsaWFzZXMiLAorICAgICInZXZlbnQgdHlwZXMnIGxpc3QgYWxsIDx0eXBlPiBzdHJpbmcgYWxpYXNlcyBzdXBwb3J0ZWQgYnkgdGhlICdldmVudCcgc3ViY29tbWFuZHNcclxuIiwKKyAgICBOVUxMLCBkb19ldmVudF90eXBlcywgTlVMTCB9LAorCisgICAgeyAiY29kZXMiLCAibGlzdCBhbGwgPGNvZGU+IGFsaWFzZXMgZm9yIGEgZ2l2ZW4gPHR5cGU+IiwKKyAgICAiJ2V2ZW50IGNvZGVzIDx0eXBlPicgbGlzdHMgYWxsIDxjb2RlPiBzdHJpbmcgYWxpYXNlcyBmb3IgYSBnaXZlbiBldmVudCA8dHlwZT5cclxuIiwKKyAgICBOVUxMLCBkb19ldmVudF9jb2RlcywgTlVMTCB9LAorCisgICAgeyAidGV4dCIsICJzaW11bGF0ZSBrZXlzdHJva2VzIGZyb20gYSBnaXZlbiB0ZXh0IiwKKyAgICAiJ2V2ZW50IHRleHQgPG1lc3NhZ2U+JyBhbGxvd3MgeW91IHRvIHNpbXVsYXRlIGtleXByZXNzZXMgdG8gZ2VuZXJhdGUgYSBnaXZlbiB0ZXh0XHJcbiIKKyAgICAibWVzc2FnZS4gPG1lc3NhZ2U+IG11c3QgYmUgYW4gdXRmLTggc3RyaW5nLiBVbmljb2RlIHBvaW50cyB3aWxsIGJlIHJldmVyc2UtbWFwcGVkXHJcbiIKKyAgICAiYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGRldmljZSBrZXlib2FyZC4gVW5zdXBwb3J0ZWQgY2hhcmFjdGVycyB3aWxsIGJlIGRpc2NhcmRlZFxyXG4iCisgICAgInNpbGVudGx5XHJcbiIsIE5VTEwsIGRvX2V2ZW50X3RleHQsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICBTIE4gQSBQIFMgSCBPIFQgICBDIE8gTSBNIEEgTiBEIFMgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkb19zbmFwc2hvdF9saXN0KENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzKSB7CisgICAgYm9vbCBzdWNjZXNzID0gdm1vcGVycyhjbGllbnQpLT5zbmFwc2hvdExpc3QoY2xpZW50LCBjb250cm9sX3dyaXRlX291dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sX3dyaXRlX2Vycl9jYik7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fc25hcHNob3Rfc2F2ZShDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciogYXJncykgeworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgIktPOiBBcmd1bWVudCBtaXNzaW5nLCB0cnkgJ2F2ZCBzbmFwc2hvdCBzYXZlIDxuYW1lPidcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBib29sIHN1Y2Nlc3MgPQorICAgICAgICAgICAgdm1vcGVycyhjbGllbnQpLT5zbmFwc2hvdFNhdmUoYXJncywgY2xpZW50LCBjb250cm9sX3dyaXRlX291dF9jYik7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fc25hcHNob3RfbG9hZChDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciogYXJncykgeworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgY29udHJvbF93cml0ZSgKKyAgICAgICAgICAgICAgICBjbGllbnQsCisgICAgICAgICAgICAgICAgIktPOiBBcmd1bWVudCBtaXNzaW5nLCB0cnkgJ2F2ZCBzbmFwc2hvdCBsb2FkIDxuYW1lPidcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBib29sIHN1Y2Nlc3MgPQorICAgICAgICAgICAgdm1vcGVycyhjbGllbnQpLT5zbmFwc2hvdExvYWQoYXJncywgY2xpZW50LCBjb250cm9sX3dyaXRlX291dF9jYik7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZG9fc25hcHNob3RfZGVsKENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzKSB7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBjb250cm9sX3dyaXRlKAorICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICAiS086IEFyZ3VtZW50IG1pc3NpbmcsIHRyeSAnYXZkIHNuYXBzaG90IGxpc3QgPG5hbWU+J1xyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGJvb2wgc3VjY2VzcyA9CisgICAgICAgICAgICB2bW9wZXJzKGNsaWVudCktPnNuYXBzaG90RGVsZXRlKGFyZ3MsIGNsaWVudCwgY29udHJvbF93cml0ZV9vdXRfY2IpOworICAgIHJldHVybiBzdWNjZXNzID8gMCA6IC0xOworfQorCitzdGF0aWMgY29uc3QgQ29tbWFuZERlZlJlYyAgc25hcHNob3RfY29tbWFuZHNbXSA9Cit7CisgICAgeyAibGlzdCIsICJsaXN0IGF2YWlsYWJsZSBzdGF0ZSBzbmFwc2hvdHMiLAorICAgICInYXZkIHNuYXBzaG90IGxpc3QnIHdpbGwgc2hvdyBhIGxpc3Qgb2YgYWxsIHN0YXRlIHNuYXBzaG90cyB0aGF0IGNhbiBiZSBsb2FkZWRcclxuIiwKKyAgICBOVUxMLCBkb19zbmFwc2hvdF9saXN0LCBOVUxMIH0sCisKKyAgICB7ICJzYXZlIiwgInNhdmUgc3RhdGUgc25hcHNob3QiLAorICAgICInYXZkIHNuYXBzaG90IHNhdmUgPG5hbWU+JyB3aWxsIHNhdmUgdGhlIGN1cnJlbnQgKHJ1bi10aW1lKSBzdGF0ZSB0byBhIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWVcclxuIiwKKyAgICBOVUxMLCBkb19zbmFwc2hvdF9zYXZlLCBOVUxMIH0sCisKKyAgICB7ICJsb2FkIiwgImxvYWQgc3RhdGUgc25hcHNob3QiLAorICAgICInYXZkIHNuYXBzaG90IGxvYWQgPG5hbWU+JyB3aWxsIGxvYWQgdGhlIHN0YXRlIHNuYXBzaG90IG9mIHRoZSBnaXZlbiBuYW1lXHJcbiIsCisgICAgTlVMTCwgZG9fc25hcHNob3RfbG9hZCwgTlVMTCB9LAorCisgICAgeyAiZGVsIiwgImRlbGV0ZSBzdGF0ZSBzbmFwc2hvdCIsCisgICAgIidhdmQgc25hcHNob3QgZGVsIDxuYW1lPicgd2lsbCBkZWxldGUgdGhlIHN0YXRlIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWVcclxuIiwKKyAgICBOVUxMLCBkb19zbmFwc2hvdF9kZWwsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgTSAgIEMgTyBNIE0gQSBOIEQgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citkb19hdmRfc3RvcCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgaWYgKCEodm1vcGVycyhjbGllbnQpLT52bUlzUnVubmluZygpKSkgeworICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogdmlydHVhbCBkZXZpY2UgYWxyZWFkeSBzdG9wcGVkXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gdm1vcGVycyhjbGllbnQpLT52bVN0b3AoKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludAorZG9fYXZkX3N0YXJ0KCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBpZiAodm1vcGVycyhjbGllbnQpLT52bUlzUnVubmluZygpKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiB2aXJ0dWFsIGRldmljZSBhbHJlYWR5IHJ1bm5pbmdcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiB2bW9wZXJzKGNsaWVudCktPnZtU3RhcnQoKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludAorZG9fYXZkX3N0YXR1cyggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgY29udHJvbF93cml0ZShjbGllbnQsICJ2aXJ0dWFsIGRldmljZSBpcyAlc1xyXG4iLAorICAgICAgICAgICAgICAgICAgdm1vcGVycyhjbGllbnQpLT52bUlzUnVubmluZygpID8gInJ1bm5pbmciIDogInN0b3BwZWQiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fYXZkX25hbWUoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIiVzXHJcbiIsIGFuZHJvaWRfaHctPmF2ZF9uYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIHZtX2NvbW1hbmRzW10gPQoreworICAgIHsgInN0b3AiLCAic3RvcCB0aGUgdmlydHVhbCBkZXZpY2UiLAorICAgICInYXZkIHN0b3AnIHN0b3BzIHRoZSB2aXJ0dWFsIGRldmljZSBpbW1lZGlhdGVseSwgdXNlICdhdmQgc3RhcnQnIHRvIGNvbnRpbnVlIGV4ZWN1dGlvblxyXG4iLAorICAgIE5VTEwsIGRvX2F2ZF9zdG9wLCBOVUxMIH0sCisKKyAgICB7ICJzdGFydCIsICJzdGFydC9yZXN0YXJ0IHRoZSB2aXJ0dWFsIGRldmljZSIsCisgICAgIidhdmQgc3RhcnQnIHdpbGwgc3RhcnQgb3IgY29udGludWUgdGhlIHZpcnR1YWwgZGV2aWNlLCB1c2UgJ2F2ZCBzdG9wJyB0byBzdG9wIGl0XHJcbiIsCisgICAgTlVMTCwgZG9fYXZkX3N0YXJ0LCBOVUxMIH0sCisKKyAgICB7ICJzdGF0dXMiLCAicXVlcnkgdmlydHVhbCBkZXZpY2Ugc3RhdHVzIiwKKyAgICAiJ2F2ZCBzdGF0dXMnIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgdmlydHVhbCBkZXZpY2UgaXMgcnVubmluZyBvciBub3RcclxuIiwKKyAgICBOVUxMLCBkb19hdmRfc3RhdHVzLCBOVUxMIH0sCisKKyAgICB7ICJuYW1lIiwgInF1ZXJ5IHZpcnR1YWwgZGV2aWNlIG5hbWUiLAorICAgICInYXZkIG5hbWUnIHdpbGwgcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgdmlydHVhbCBkZXZpY2VcclxuIiwKKyAgICBOVUxMLCBkb19hdmRfbmFtZSwgTlVMTCB9LAorCisgICAgeyAic25hcHNob3QiLCAic3RhdGUgc25hcHNob3QgY29tbWFuZHMiLAorICAgICJhbGxvd3MgeW91IHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhlIHZpcnR1YWwgZGV2aWNlIHN0YXRlIGluIHNuYXBzaG90c1xyXG4iLAorICAgIE5VTEwsIE5VTEwsIHNuYXBzaG90X2NvbW1hbmRzIH0sCisKKyAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHIEUgTyAgIEMgTyBNIE0gQSBOIEQgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50Citkb19nZW9fbm1lYSggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBOTUVBIHNlbnRlbmNlIG1pc3NpbmcsIHRyeSAnaGVscCBnZW8gbm1lYSdcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghY2xpZW50LT5nbG9iYWwtPmxvY2F0aW9uX2FnZW50LT5ncHNJc1N1cHBvcnRlZCgpKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBubyBHUFMgZW11bGF0aW9uIGluIHRoaXMgdmlydHVhbCBkZXZpY2VcclxuIiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNsaWVudC0+Z2xvYmFsLT5sb2NhdGlvbl9hZ2VudC0+Z3BzU2VuZE5tZWEoYXJncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2dlb19maXgoIENvbnRyb2xDbGllbnQgIGNsaWVudCwgY2hhciogIGFyZ3MgKQoreworICAgIC8vIEdFT19TQVQyIHByb3ZpZGVzIGJ1ZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAgICBlbnVtIHsgR0VPX0xPTkcgPSAwLCBHRU9fTEFULCBHRU9fQUxULCBHRU9fU0FULCBHRU9fU0FUMiwgTlVNX0dFT19QQVJBTVMgfTsKKyAgICBjaGFyKiAgIHAgPSBhcmdzOworICAgIGludCAgICAgdG9wX3BhcmFtID0gLTE7CisgICAgZG91YmxlICBhbHRpdHVkZTsKKyAgICBkb3VibGUgIHBhcmFtc1sgTlVNX0dFT19QQVJBTVMgXTsKKyAgICBpbnQgICAgIG5fc2F0ZWxsaXRlcyA9IDE7CisKKyAgICBzdHJ1Y3QgIHRpbWV2YWwgdFZhbDsKKworICAgIGlmICghcCkKKyAgICAgICAgcCA9ICIiOworCisgICAgLyogdG9rZW5pemUgKi8KKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgY2hhciogICBlbmQ7CisgICAgICAgIGRvdWJsZSAgdmFsID0gc3RydG9kKCBwLCAmZW5kICk7CisKKyAgICAgICAgaWYgKGVuZCA9PSBwKSB7CisgICAgICAgICAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogYXJndW1lbnQgJyVzJyBpcyBub3QgYSBudW1iZXJcbiIsIHAgKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtc1srK3RvcF9wYXJhbV0gPSB2YWw7CisgICAgICAgIGlmICh0b3BfcGFyYW0gKyAxID09IE5VTV9HRU9fUEFSQU1TKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9IGVuZDsKKyAgICAgICAgd2hpbGUgKCpwICYmIChwWzBdID09ICcgJyB8fCBwWzBdID09ICdcdCcpKQorICAgICAgICAgICAgcCArPSAxOworICAgIH0KKworICAgIC8qIHNhbml0eSBjaGVjayAqLworICAgIGlmICh0b3BfcGFyYW0gPCBHRU9fTEFUKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBub3QgZW5vdWdoIGFyZ3VtZW50czogc2VlICdoZWxwIGdlbyBmaXgnIGZvciBkZXRhaWxzXHJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUgKi8KKyAgICB7CisgICAgICAgIGRvdWJsZSBsb25naXR1ZGUgPSBwYXJhbXNbMF07CisgICAgICAgIGlmIChsb25naXR1ZGUgPCAtMTgwLjAgfHwgbG9uZ2l0dWRlID4gMTgwLjApIHsKKyAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IGludmFsaWQgbG9uZ2l0dWRlIHZhbHVlLiBTaG91bGQgYmUgaW4gWy0xODAsKzE4MF0gcmFuZ2VcclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIGxhdGl0dWRlID0gcGFyYW1zWzFdOworICAgICAgICBpZiAobGF0aXR1ZGUgPCAtOTAuMCB8fCBsYXRpdHVkZSA+IDkwLjApIHsKKyAgICAgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IGludmFsaWQgbGF0aXR1ZGUgdmFsdWUuIFNob3VsZCBiZSBpbiBbLTkwLCs5MF0gcmFuZ2VcclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBudW1iZXIgb2Ygc2F0ZWxsaXRlcywgbXVzdCBiZSBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTIgKi8KKyAgICBpZiAodG9wX3BhcmFtID49IEdFT19TQVQpIHsKKyAgICAgICAgaW50IHNhdF9pbmRleCA9ICh0b3BfcGFyYW0gPj0gR0VPX1NBVDIpID8gR0VPX1NBVDIgOiBHRU9fU0FUOworICAgICAgICBuX3NhdGVsbGl0ZXMgPSAoaW50KSBwYXJhbXNbc2F0X2luZGV4XTsKKyAgICAgICAgaWYgKG5fc2F0ZWxsaXRlcyAhPSBwYXJhbXNbc2F0X2luZGV4XQorICAgICAgICAgICAgfHwgbl9zYXRlbGxpdGVzIDwgMSB8fCBuX3NhdGVsbGl0ZXMgPiAxMikgeworICAgICAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiS086IGludmFsaWQgbnVtYmVyIG9mIHNhdGVsbGl0ZXMuIE11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEyXHJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgYWx0aXR1ZGUgPSAwLjA7CisgICAgaWYgKHRvcF9wYXJhbSA8IEdFT19BTFQpIHsKKyAgICAgICAgYWx0aXR1ZGUgPSBwYXJhbXNbR0VPX0FMVF07CisgICAgfQorCisgICAgbWVtc2V0KCZ0VmFsLCAwLCBzaXplb2YodFZhbCkpOworICAgIGdldHRpbWVvZmRheSgmdFZhbCwgTlVMTCk7CisKKyAgICBjbGllbnQtPmdsb2JhbC0+bG9jYXRpb25fYWdlbnQtPmdwc1NlbmRMb2MocGFyYW1zW0dFT19MQVRdLCBwYXJhbXNbR0VPX0xPTkddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZSwgbl9zYXRlbGxpdGVzLCAmdFZhbCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBDb21tYW5kRGVmUmVjICBnZW9fY29tbWFuZHNbXSA9Cit7CisgICAgeyAibm1lYSIsICJzZW5kIGEgR1BTIE5NRUEgc2VudGVuY2UiLAorICAgICInZ2VvIG5lbWEgPHNlbnRlbmNlPicgc2VuZHMgYW4gTk1FQSAwMTgzIHNlbnRlbmNlIHRvIHRoZSBlbXVsYXRlZCBkZXZpY2UsIGFzXHJcbiIKKyAgICAiaWYgaXQgY2FtZSBmcm9tIGFuIGVtdWxhdGVkIEdQUyBtb2RlbS4gPHNlbnRlbmNlPiBtdXN0IGJlZ2luIHdpdGggJyRHUCcuIE9ubHlcclxuIgorICAgICInJEdQR0dBJyBhbmQgJyRHUFJNQycgc2VudGVuY2VzIGFyZSBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC5cclxuIiwKKyAgICBOVUxMLCBkb19nZW9fbm1lYSwgTlVMTCB9LAorCisgICAgeyAiZml4IiwgInNlbmQgYSBzaW1wbGUgR1BTIGZpeCIsCisgICAgIidnZW8gZml4IDxsb25naXR1ZGU+IDxsYXRpdHVkZT4gWzxhbHRpdHVkZT4gWzxzYXRlbGxpdGVzPl1dJ1xyXG4iCisgICAgIiBhbGxvd3MgeW91IHRvIHNlbmQgYSBzaW1wbGUgR1BTIGZpeCB0byB0aGUgZW11bGF0ZWQgc3lzdGVtLlxyXG4iCisgICAgIiBUaGUgcGFyYW1ldGVycyBhcmU6XHJcblxyXG4iCisgICAgIiAgPGxvbmdpdHVkZT4gICBsb25naXR1ZGUsIGluIGRlY2ltYWwgZGVncmVlc1xyXG4iCisgICAgIiAgPGxhdGl0dWRlPiAgICBsYXRpdHVkZSwgaW4gZGVjaW1hbCBkZWdyZWVzXHJcbiIKKyAgICAiICA8YWx0aXR1ZGU+ICAgIG9wdGlvbmFsIGFsdGl0dWRlIGluIG1ldGVyc1xyXG4iCisgICAgIiAgPHNhdGVsbGl0ZXM+ICBudW1iZXIgb2Ygc2F0ZWxsaXRlcyBiZWluZyB0cmFja2VkICgxLTEyKVxyXG4iCisgICAgIlxyXG4iLAorICAgIE5VTEwsIGRvX2dlb19maXgsIE5VTEwgfSwKKworICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIFMgRSBOIFMgTyBSIFMgIEMgTyBNIE0gQSBOIEQgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRm9yIHNlbnNvcnMgdXNlciBwcm9tcHQgc3RyaW5nIHNpemUuKi8KKyNkZWZpbmUgU0VOU09SU19JTkZPX1NJWkUgMTUwCisKKy8qIEdldCBzZW5zb3IgZGF0YSAtIChhLGIsYykgZnJvbSBzZW5zb3IgbmFtZSAqLworc3RhdGljIGludAorZG9fc2Vuc29yc19nZXQoIENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzICkKK3sKKyAgICBpZiAoISBhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBVc2FnZTogXCJnZXQgPHNlbnNvcm5hbWU+XCJcbiIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBzdGF0dXMgPSBTRU5TT1JfU1RBVFVTX1VOS05PV047CisgICAgY2hhciBzZW5zb3Jbc3RybGVuKGFyZ3MpICsgMV07CisgICAgaWYgKDEgIT0gc3NjYW5mKCBhcmdzLCAiJXMiLCAmc2Vuc29yWzBdICkpCisgICAgICAgIGdvdG8gU0VOU09SX1NUQVRVU19FUlJPUjsKKworICAgIGludCBzZW5zb3JfaWQgPSBhbmRyb2lkX3NlbnNvcnNfZ2V0X2lkX2Zyb21fbmFtZSggc2Vuc29yICk7CisgICAgY2hhciBidWZmZXJbU0VOU09SU19JTkZPX1NJWkVdID0geyAwIH07CisgICAgZmxvYXQgYSwgYiwgYzsKKworICAgIGlmIChzZW5zb3JfaWQgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IHNlbnNvcl9pZDsKKyAgICAgICAgZ290byBTRU5TT1JfU1RBVFVTX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IGFuZHJvaWRfc2Vuc29yc19nZXQoIHNlbnNvcl9pZCwgJmEsICZiLCAmYyApOworICAgICAgICBpZiAoc3RhdHVzICE9IFNFTlNPUl9TVEFUVVNfT0spCisgICAgICAgICAgICBnb3RvIFNFTlNPUl9TVEFUVVNfRVJST1I7CisgICAgICAgIHNucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICIlcyA9ICVnOiVnOiVnXHJcbiIsIHNlbnNvciwgYSwgYiwgYyApOworICAgICAgICBkb19jb250cm9sX3dyaXRlKCBjbGllbnQsIGJ1ZmZlciApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKK1NFTlNPUl9TVEFUVVNfRVJST1I6CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgIGNhc2UgU0VOU09SX1NUQVRVU19OT19TRVJWSUNFOgorICAgICAgICBzbnByaW50ZiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIktPOiBObyBzZW5zb3Igc2VydmljZSBmb3VuZCFcclxuIiApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFTlNPUl9TVEFUVVNfRElTQUJMRUQ6CisgICAgICAgIHNucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAiS086ICclcycgc2Vuc29yIGlzIGRpc2FibGVkLlxyXG4iLCBzZW5zb3IgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRU5TT1JfU1RBVFVTX1VOS05PV046CisgICAgICAgIHNucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICJLTzogdW5rbm93biBzZW5zb3IgbmFtZTogJXMsIHJ1biAnc2Vuc29yIHN0YXR1cycgdG8gZ2V0IGF2YWlsYWJsZSBzZW5zb3JzLlxyXG4iLCBzZW5zb3IgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc25wcmludGYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJLTzogJyVzJyBzZW5zb3I6IGV4Y2VwdGlvbiBoYXBwZW5zLlxyXG4iLCBzZW5zb3IgKTsKKyAgICB9CisgICAgZG9fY29udHJvbF93cml0ZSggY2xpZW50LCBidWZmZXIgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHNldCBzZW5zb3IgZGF0YSAtIChhLGIsYykgZnJvbSBzZW5zb3IgbmFtZSAqLworc3RhdGljIGludAorZG9fc2Vuc29yc19zZXQoIENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzICkKK3sKKyAgICBpZiAoISBhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBVc2FnZTogXCJzZXQgPHNlbnNvcm5hbWU+IDx2YWx1ZS1hPls6PHZhbHVlLWI+Wzo8dmFsdWUtYz5dXVwiXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbnQgc3RhdHVzOworICAgIGNoYXIqIHNlbnNvcjsKKyAgICBjaGFyKiB2YWx1ZTsKKyAgICBjaGFyKiBhcmdzX2R1cCA9IHN0cmR1cCggYXJncyApOworICAgIGlmIChhcmdzX2R1cCA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoIGNsaWVudCwgIktPOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY2hhciogcCA9IGFyZ3NfZHVwOworCisgICAgLyogUGFyc2luZyB0aGUgYXJncyB0byBnZXQgc2Vuc29yIG5hbWUgc3RyaW5nICovCisgICAgd2hpbGUgKCpwICYmIGlzc3BhY2UoKnApKSBwKys7CisgICAgaWYgKCpwID09IDApCisgICAgICAgIGdvdG8gSU5QVVRfRVJST1I7CisgICAgc2Vuc29yID0gcDsKKworICAgIC8qIFBhcnNpbmcgdGhlIGFyZ3MgdG8gZ2V0IHZhbHVlIHN0cmluZyAqLworICAgIHdoaWxlICgqcCAmJiAoISBpc3NwYWNlKCpwKSkpIHArKzsKKyAgICBpZiAoKnAgPT0gMCB8fCAqKHAgKyAxKSA9PSAwLyogbWFrZSBzdXJlIHZhbHVlIGlzbid0IE5VTEwgKi8pCisgICAgICAgIGdvdG8gSU5QVVRfRVJST1I7CisgICAgKnAgPSAwOworICAgIHZhbHVlID0gcCArIDE7CisKKyAgICBpZiAoISAoc3RybGVuKHNlbnNvcikgJiYgc3RybGVuKHZhbHVlKSkpCisgICAgICAgIGdvdG8gSU5QVVRfRVJST1I7CisKKyAgICBpbnQgc2Vuc29yX2lkID0gYW5kcm9pZF9zZW5zb3JzX2dldF9pZF9mcm9tX25hbWUoIHNlbnNvciApOworICAgIGNoYXIgYnVmZmVyW1NFTlNPUlNfSU5GT19TSVpFXSA9IHsgMCB9OworCisgICAgaWYgKHNlbnNvcl9pZCA8IDApIHsKKyAgICAgICAgc3RhdHVzID0gc2Vuc29yX2lkOworICAgICAgICBnb3RvIFNFTlNPUl9TVEFUVVNfRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQgZnZhbHVlc1szXTsKKyAgICAgICAgc3RhdHVzID0gYW5kcm9pZF9zZW5zb3JzX2dldCggc2Vuc29yX2lkLCAmZnZhbHVlc1swXSwgJmZ2YWx1ZXNbMV0sICZmdmFsdWVzWzJdICk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU0VOU09SX1NUQVRVU19PSykKKyAgICAgICAgICAgIGdvdG8gU0VOU09SX1NUQVRVU19FUlJPUjsKKworICAgICAgICAvKiBQYXJzaW5nIHRoZSB2YWx1ZSBwYXJ0IHRvIGdldCB0aGUgc2Vuc29yIHZhbHVlcyhhLCBiLCBjKSAqLworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciogcG5leHQ7CisgICAgICAgIGNoYXIqIHBlbmQgPSB2YWx1ZSArIHN0cmxlbih2YWx1ZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyssIHZhbHVlID0gcG5leHQgKyAxKSB7CisgICAgICAgICAgICBwbmV4dD1zdHJjaHIoIHZhbHVlLCAnOicgKTsKKyAgICAgICAgICAgIGlmIChwbmV4dCkgeworICAgICAgICAgICAgICAgICpwbmV4dCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBuZXh0ID0gcGVuZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBuZXh0ID4gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoMSAhPSBzc2NhbmYoIHZhbHVlLCIlZyIsICZmdmFsdWVzW2ldICkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gSU5QVVRfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBhbmRyb2lkX3NlbnNvcnNfc2V0KCBzZW5zb3JfaWQsIGZ2YWx1ZXNbMF0sIGZ2YWx1ZXNbMV0sIGZ2YWx1ZXNbMl0gKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBTRU5TT1JfU1RBVFVTX09LKQorICAgICAgICAgICAgZ290byBTRU5TT1JfU1RBVFVTX0VSUk9SOworCisgICAgICAgIGZyZWUoIGFyZ3NfZHVwICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworU0VOU09SX1NUQVRVU19FUlJPUjoKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgY2FzZSBTRU5TT1JfU1RBVFVTX05PX1NFUlZJQ0U6CisgICAgICAgIHNucHJpbnRmKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAiS086IE5vIHNlbnNvciBzZXJ2aWNlIGZvdW5kIVxyXG4iICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VOU09SX1NUQVRVU19ESVNBQkxFRDoKKyAgICAgICAgc25wcmludGYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJLTzogJyVzJyBzZW5zb3IgaXMgZGlzYWJsZWQuXHJcbiIsIHNlbnNvciApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFTlNPUl9TVEFUVVNfVU5LTk9XTjoKKyAgICAgICAgc25wcmludGYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgIktPOiB1bmtub3duIHNlbnNvciBuYW1lOiAlcywgcnVuICdzZW5zb3Igc3RhdHVzJyB0byBnZXQgYXZhaWxhYmxlIHNlbnNvcnMuXHJcbiIsIHNlbnNvciApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzbnByaW50ZiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIktPOiAnJXMnIHNlbnNvcjogZXhjZXB0aW9uIGhhcHBlbnMuXHJcbiIsIHNlbnNvciApOworICAgIH0KKyAgICBkb19jb250cm9sX3dyaXRlKCBjbGllbnQsIGJ1ZmZlciApOworICAgIGZyZWUoIGFyZ3NfZHVwICk7CisgICAgcmV0dXJuIC0xOworCitJTlBVVF9FUlJPUjoKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJLTzogVXNhZ2U6IFwic2V0IDxzZW5zb3JuYW1lPiA8dmFsdWUtYT5bOjx2YWx1ZS1iPls6PHZhbHVlLWM+XV1cIlxuIiApOworICAgIGZyZWUoIGFyZ3NfZHVwICk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBnZXQgYWxsIGF2YWlsYWJsZSBzZW5zb3IgbmFtZXMgYW5kIGVuYWJsZSBzdGF0dXMgcmVzcGVjdGl2ZWx5LiAqLworc3RhdGljIGludAorZG9fc2Vuc29yc19zdGF0dXMoIENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzICkKK3sKKyAgICB1aW50OF90IGlkLCBzdGF0dXM7CisgICAgY2hhciBidWZmZXJbU0VOU09SU19JTkZPX1NJWkVdID0geyAwIH07CisKKyAgICBmb3IoaWQgPSAwOyBpZCA8IE1BWF9TRU5TT1JTOyBpZCsrKSB7CisgICAgICAgIHN0YXR1cyA9IGFuZHJvaWRfc2Vuc29yc19nZXRfc2Vuc29yX3N0YXR1cyggaWQgKTsKKyAgICAgICAgc25wcmludGYoIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlczogJXNcbiIsCisgICAgICAgICAgICAgICAgYW5kcm9pZF9zZW5zb3JzX2dldF9uYW1lX2Zyb21faWQoaWQpLCAoc3RhdHVzID8gImVuYWJsZWQuIjoiZGlzYWJsZWQuIikgKTsKKyAgICAgICAgY29udHJvbF93cml0ZSggY2xpZW50LCBidWZmZXIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogU2Vuc29yIGNvbW1hbmRzIGZvciBnZXQvc2V0IHNlbnNvciB2YWx1ZXMgYW5kIGdldCBhdmFpbGFibGUgc2Vuc29yIG5hbWVzLiAqLworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgc2Vuc29yX2NvbW1hbmRzW10gPQoreworICAgIHsgInN0YXR1cyIsICJsaXN0IGFsbCBzZW5zb3JzIGFuZCB0aGVpciBzdGF0dXMuIiwKKyAgICAgICInc3RhdHVzJzogbGlzdCBhbGwgc2Vuc29ycyBhbmQgdGhlaXIgc3RhdHVzLlxyXG4iLAorICAgICAgTlVMTCwgZG9fc2Vuc29yc19zdGF0dXMsIE5VTEwgfSwKKworICAgIHsgImdldCIsICJnZXQgc2Vuc29yIHZhbHVlcyIsCisgICAgICAiJ2dldCA8c2Vuc29ybmFtZT4nIHJldHVybnMgdGhlIHZhbHVlcyBvZiBhIGdpdmVuIHNlbnNvci5cclxuIiwKKyAgICAgIE5VTEwsIGRvX3NlbnNvcnNfZ2V0LCBOVUxMIH0sCisKKyAgICB7ICJzZXQiLCAic2V0IHNlbnNvciB2YWx1ZXMiLAorICAgICAgIidzZXQgPHNlbnNvcm5hbWU+IDx2YWx1ZS1hPls6PHZhbHVlLWI+Wzo8dmFsdWUtYz5dXScgc2V0IHRoZSB2YWx1ZXMgb2YgYSBnaXZlbiBzZW5zb3IuXHJcbiIsCisgICAgICBOVUxMLCBkb19zZW5zb3JzX3NldCwgTlVMTCB9LAorCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgIEYgSSBOIEcgRSBSIFAgUiBJIE4gVCAgQyBPIE0gTSBBIE4gRCBTICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAorZG9fZmluZ2VycHJpbnRfdG91Y2goQ29udHJvbENsaWVudCBjbGllbnQsIGNoYXIqIGFyZ3MgKQoreworICAgIGlmIChhcmdzKSB7CisgICAgICAgIGNoYXIgKmVuZHB0cjsKKyAgICAgICAgaW50IGZpbmdlcmlkID0gc3RydG9sKGFyZ3MsICZlbmRwdHIsIDApOworICAgICAgICBpZiAoZW5kcHRyICE9IGFyZ3MpIHsKKyAgICAgICAgICAgIGNsaWVudC0+Z2xvYmFsLT5maW5nZXJfYWdlbnQtPnNldFRvdWNoKHRydWUsIGZpbmdlcmlkKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IGludmFsaWQgZmluZ2VyaWRcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY29udHJvbF93cml0ZShjbGllbnQsICJLTzogbWlzc2luZyBmaW5nZXJpZFxyXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2RvX2ZpbmdlcnByaW50X3JlbW92ZShDb250cm9sQ2xpZW50IGNsaWVudCwgY2hhciogYXJncyApCit7CisgICAgY2xpZW50LT5nbG9iYWwtPmZpbmdlcl9hZ2VudC0+c2V0VG91Y2goZmFsc2UsIC0xKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgZmluZ2VycHJpbnRfY29tbWFuZHNbXSA9Cit7CisgICAgeyAidG91Y2giLCAidG91Y2ggZmluZ2VyIHByaW50IHNlbnNvciB3aXRoIDxmaW5nZXJpZD4iLAorICAgICAgIid0b3VjaCA8ZmluZ2VyaWQ+JyB0b3VjaCBmaW5nZXIgcHJpbnQgc2Vuc29yIHdpdGggPGZpbmdlcmlkPi5cclxuIiwKKyAgICAgIE5VTEwsIGRvX2ZpbmdlcnByaW50X3RvdWNoLCBOVUxMIH0sCisgICAgeyAicmVtb3ZlIiwgInJlbW92ZSBmaW5nZXIgZnJvbSB0aGUgZmluZ2VycHJpbnQgc2Vuc29yIiwKKyAgICAgICIncmVtb3ZlJyByZW1vdmUgZmluZ2VyIGZyb20gdGhlIGZpbmdlcnByaW50IHNlbnNvci5cclxuIiwKKyAgICAgIE5VTEwsIGRvX2ZpbmdlcnByaW50X3JlbW92ZSwgTlVMTCB9LAorICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBRIEUgTSBVICAgQyBPIE0gTSBBIE4gRCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2RvX3FlbXVfbW9uaXRvciggQ29udHJvbENsaWVudCBjbGllbnQsIGNoYXIqIGFyZ3MgKQoreworICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IFFFTVUgc3VwcG9ydCBubyBsb25nZXIgYXZhaWxhYmxlXHJcbiIpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgIHFlbXVfY29tbWFuZHNbXSA9Cit7CisgICAgeyAibW9uaXRvciIsICJlbnRlciBRRU1VIG1vbml0b3IiLAorICAgICJFbnRlciB0aGUgUUVNVSB2aXJ0dWFsIG1hY2hpbmUgbW9uaXRvclxyXG4iLAorICAgIE5VTEwsIGRvX3FlbXVfbW9uaXRvciwgTlVMTCB9LAorCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKyNkZWZpbmUgSEVMUF9DT01NQU5EIFwKKyAgICB7ICJoZWxwfGh8PyIsICJwcmludCBhIGxpc3Qgb2YgY29tbWFuZHMiLCBOVUxMLCBOVUxMLCBkb19oZWxwLCBOVUxMIH0KKworI2RlZmluZSBRVUlUX0NPTU1BTkQgXAorICAgIHsgInF1aXR8ZXhpdCIsICJxdWl0IGNvbnRyb2wgc2Vzc2lvbiIsIE5VTEwsIE5VTEwsIGRvX3F1aXQsIE5VTEwgfQorCisjZGVmaW5lIEFWRF9DT01NQU5EKHN1Yl9jb21tYW5kcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImF2ZCIsICJjb250cm9sIHZpcnR1YWwgZGV2aWNlIGV4ZWN1dGlvbiIsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgImFsbG93cyB5b3UgdG8gY29udHJvbCAoZS5nLiBzdGFydC9zdG9wKSB0aGUgZXhlY3V0aW9uIG9mICIgXAorICAgICAgICAgICAgICAgICJ0aGUgdmlydHVhbCBkZXZpY2VcclxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBzdWJfY29tbWFuZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBNIEEgSSBOICAgQyBPIE0gTSBBIE4gRCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2RvX2NyYXNoKCBDb250cm9sQ2xpZW50ICBjbGllbnQsIGNoYXIqICBhcmdzICkKK3sKKyAgICBjb250cm9sX3dyaXRlKCBjbGllbnQsICJPSzogY3Jhc2hpbmcgZW11bGF0b3IsIGJ5ZSBieWVcclxuIiApOworICAgIHZvbGF0aWxlIGludCAqIHB0ciA9IE5VTEw7CisgICAgKnB0cis9MTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fa2lsbCggQ29udHJvbENsaWVudCAgY2xpZW50LCBjaGFyKiAgYXJncyApCit7CisgICAgY29udHJvbF93cml0ZSggY2xpZW50LCAiT0s6IGtpbGxpbmcgZW11bGF0b3IsIGJ5ZSBieWVcclxuIiApOworICAgIERJTklUKCJFbXVsYXRvciBraWxsZWQgYnkgY29uc29sZSBraWxsIGNvbW1hbmQuXG4iKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBleGl0KDApOworfQorCitzdGF0aWMgaW50IGRvX2RlYnVnKENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzKSB7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IGFyZ3VtZW50IG1pc3NpbmcsIHRyeSAnZGVidWcgPHRhZ3M+J1xyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWFuZHJvaWRfcGFyc2VfZGVidWdfdGFnc19vcHRpb24oYXJncywgLypwYXJzZV9hc19zdWZmaXgqL2ZhbHNlKSkgeworICAgICAgICBjb250cm9sX3dyaXRlKGNsaWVudCwgIktPOiBiYWQgdGFncywgc2VlIGNvbW1hbmQgbGluZSBoZWxwIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiItZGVidWciIiBvcHRpb24gZm9yIGEgbGlzdCBvZiB2YWxpZCBvbmVzXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBDb21tYW5kRGVmUmVjICAgbWFpbl9jb21tYW5kc1tdID0KK3sKKyAgICB7ICJoZWxwfGh8PyIsICJwcmludCBhIGxpc3Qgb2YgY29tbWFuZHMiLCBOVUxMLCBOVUxMLCBkb19oZWxwLCBOVUxMIH0sCisKKyAgICB7ICJldmVudCIsICJzaW11bGF0ZSBoYXJkd2FyZSBldmVudHMiLAorICAgICJhbGxvd3MgeW91IHRvIHNlbmQgZmFrZSBoYXJkd2FyZSBldmVudHMgdG8gdGhlIGtlcm5lbFxyXG4iLCBOVUxMLAorICAgIE5VTEwsIGV2ZW50X2NvbW1hbmRzIH0sCisKKyAgICB7ICJnZW8iLCAiR2VvLWxvY2F0aW9uIGNvbW1hbmRzIiwKKyAgICAgICJhbGxvd3MgeW91IHRvIGNoYW5nZSBHZW8tcmVsYXRlZCBzZXR0aW5ncywgb3IgdG8gc2VuZCBHUFMgTk1FQSBzZW50ZW5jZXNcclxuIiwgTlVMTCwKKyAgICAgIE5VTEwsIGdlb19jb21tYW5kcyB9LAorCisgICAgeyAiZ3NtIiwgIkdTTSByZWxhdGVkIGNvbW1hbmRzIiwKKyAgICAgICJhbGxvd3MgeW91IHRvIGNoYW5nZSBHU00tcmVsYXRlZCBzZXR0aW5ncywgb3IgdG8gbWFrZSBhIG5ldyBpbmJvdW5kIHBob25lIGNhbGxcclxuIiwgTlVMTCwKKyAgICAgIE5VTEwsIGdzbV9jb21tYW5kcyB9LAorCisgICAgeyAiY2RtYSIsICJDRE1BIHJlbGF0ZWQgY29tbWFuZHMiLAorICAgICAgImFsbG93cyB5b3UgdG8gY2hhbmdlIENETUEtcmVsYXRlZCBzZXR0aW5nc1xyXG4iLCBOVUxMLAorICAgICAgTlVMTCwgY2RtYV9jb21tYW5kcyB9LAorCisgICAgeyAiY3Jhc2giLCAiY3Jhc2ggdGhlIGVtdWxhdG9yIGluc3RhbmNlIiwgTlVMTCwgTlVMTCwKKyAgICAgIGRvX2NyYXNoLCBOVUxMIH0sCisKKyAgICB7ICJraWxsIiwgImtpbGwgdGhlIGVtdWxhdG9yIGluc3RhbmNlIiwgTlVMTCwgTlVMTCwKKyAgICAgIGRvX2tpbGwsIE5VTEwgfSwKKworICAgIHsgIm5ldHdvcmsiLCAibWFuYWdlIG5ldHdvcmsgc2V0dGluZ3MiLAorICAgICAgImFsbG93cyB5b3UgdG8gbWFuYWdlIHRoZSBzZXR0aW5ncyByZWxhdGVkIHRvIHRoZSBuZXR3b3JrIGRhdGEgY29ubmVjdGlvbiBvZiB0aGVcclxuIgorICAgICAgImVtdWxhdGVkIGRldmljZS5cclxuIiwgTlVMTCwKKyAgICAgIE5VTEwsIG5ldHdvcmtfY29tbWFuZHMgfSwKKworICAgIHsgInBvd2VyIiwgInBvd2VyIHJlbGF0ZWQgY29tbWFuZHMiLAorICAgICAgImFsbG93cyB0byBjaGFuZ2UgYmF0dGVyeSBhbmQgQUMgcG93ZXIgc3RhdHVzXHJcbiIsIE5VTEwsCisgICAgICBOVUxMLCBwb3dlcl9jb21tYW5kcyB9LAorCisgICAgeyAicXVpdHxleGl0IiwgInF1aXQgY29udHJvbCBzZXNzaW9uIiwgTlVMTCwgTlVMTCwKKyAgICAgIGRvX3F1aXQsIE5VTEwgfSwKKworICAgIHsgInJlZGlyIiwgICAgIm1hbmFnZSBwb3J0IHJlZGlyZWN0aW9ucyIsCisgICAgICAiYWxsb3dzIHlvdSB0byBhZGQsIGxpc3QgYW5kIHJlbW92ZSBVRFAgYW5kL29yIFBPUlQgcmVkaXJlY3Rpb24gZnJvbSB0aGUgaG9zdCB0byB0aGUgZGV2aWNlXHJcbiIKKyAgICAgICJhcyBhbiBleGFtcGxlLCAncmVkaXIgIHRjcDo1MDAwOjYwMDAnIHdpbGwgcm91dGUgYW55IHBhY2tldCBzZW50IHRvIHRoZSBob3N0J3MgVENQIHBvcnQgNTAwMFxyXG4iCisgICAgICAidG8gVENQIHBvcnQgNjAwMCBvZiB0aGUgZW11bGF0ZWQgZGV2aWNlXHJcbiIsIE5VTEwsCisgICAgICBOVUxMLCByZWRpcl9jb21tYW5kcyB9LAorCisgICAgeyAic21zIiwgIlNNUyByZWxhdGVkIGNvbW1hbmRzIiwKKyAgICAgICJhbGxvd3MgeW91IHRvIHNpbXVsYXRlIGFuIGluYm91bmQgU01TXHJcbiIsIE5VTEwsCisgICAgICBOVUxMLCBzbXNfY29tbWFuZHMgfSwKKworICAgIHsgImF2ZCIsICJjb250cm9sIHZpcnR1YWwgZGV2aWNlIGV4ZWN1dGlvbiIsCisgICAgImFsbG93cyB5b3UgdG8gY29udHJvbCAoZS5nLiBzdGFydC9zdG9wKSB0aGUgZXhlY3V0aW9uIG9mIHRoZSB2aXJ0dWFsIGRldmljZVxyXG4iLCBOVUxMLAorICAgIE5VTEwsIHZtX2NvbW1hbmRzIH0sCisKKyAgICB7ICJxZW11IiwgIlFFTVUtc3BlY2lmaWMgY29tbWFuZHMiLAorICAgICJhbGxvd3MgdG8gY29ubmVjdCB0byB0aGUgUUVNVSB2aXJ0dWFsIG1hY2hpbmUgbW9uaXRvclxyXG4iLCBOVUxMLAorICAgIE5VTEwsIHFlbXVfY29tbWFuZHMgfSwKKworICAgIHsgInNlbnNvciIsICJtYW5hZ2UgZW11bGF0b3Igc2Vuc29ycyIsCisgICAgICAiYWxsb3dzIHlvdSB0byByZXF1ZXN0IHRoZSBlbXVsYXRvciBzZW5zb3JzXHJcbiIsIE5VTEwsCisgICAgICBOVUxMLCBzZW5zb3JfY29tbWFuZHMgfSwKKworICAgIHsgImZpbmdlciIsICJtYW5hZ2UgZW11bGF0b3IgZmluZ2VyIHByaW50IiwKKyAgICAgICJhbGxvd3MgeW91IHRvIHRvdWNoIHRoZSBlbXVsYXRvciBmaW5nZXIgcHJpbnQgc2Vuc29yXHJcbiIsIE5VTEwsCisgICAgICBOVUxMLCBmaW5nZXJwcmludF9jb21tYW5kc30sCisKKyAgICB7ICJkZWJ1ZyIsICJjb250cm9sIHRoZSBlbXVsYXRvciBkZWJ1ZyBvdXRwdXQgdGFncyIsCisgICAgICBOVUxMLCBOVUxMLCBkb19kZWJ1ZyB9LAorCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgVSBUIEggICBDIE8gTSBNIEEgTiBEIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBkb19hdXRoKENvbnRyb2xDbGllbnQgY2xpZW50LCBjaGFyKiBhcmdzKSB7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICAgIGNvbnRyb2xfd3JpdGUoY2xpZW50LCAiS086IG1pc3NpbmcgYXV0aGVudGljYXRpb24gdG9rZW5cclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjaGFyKiBhdXRoX3Rva2VuID0gYW5kcm9pZF9jb25zb2xlX2F1dGhfZ2V0X3Rva2VuX2R1cCgpOworICAgIGlmICghYXV0aF90b2tlbikgeworICAgICAgICBjb250cm9sX3dyaXRlKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAiS086IHVuYWJsZSB0byByZWFkIH4vLmVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlblxyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgwICE9IHN0cmNtcChhdXRoX3Rva2VuLCBhcmdzKSkgeworICAgICAgICBmcmVlKGF1dGhfdG9rZW4pOworICAgICAgICBjb250cm9sX3dyaXRlKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAiS086IGF1dGhlbnRpY2F0aW9uIHRva2VuIGRvZXMgbm90IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAifi8uZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZyZWUoYXV0aF90b2tlbik7CisKKyAgICBjb250cm9sX3NlbmRfaGVscF9wcm9tcHQoY2xpZW50KTsKKyAgICBjbGllbnQtPmNvbW1hbmRzID0gbWFpbl9jb21tYW5kczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgdm1fY29tbWFuZHNfcHJlYXV0aFtdID0geworICAgICAgICB7Im5hbWUiLAorICAgICAgICAgInF1ZXJ5IHZpcnR1YWwgZGV2aWNlIG5hbWUiLAorICAgICAgICAgIidhdmQgbmFtZScgd2lsbCByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB2aXJ0dWFsIGRldmljZVxyXG4iLAorICAgICAgICAgTlVMTCwKKyAgICAgICAgIGRvX2F2ZF9uYW1lLAorICAgICAgICAgTlVMTH0sCisKKyAgICAgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9fTsKKworLyogInByZWF1dGgiIGNvbW1hbmRzIGFyZSB0aGUgc2V0IG9mIGNvbW1hbmRzIHRoYXQgYXJlIGxlZ2FsIGJlZm9yZQorICogYXV0aGVudGljYXRpb24uICAiYXZkIG5hbWUgaXMgc3BlY2lhbCBjYXNlZCBoZXJlIGJlY2F1c2UgaXQgaXMgbmVlZGVkIGJ5CisgKiBvbGRlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIFN0dWRpbyAqLworc3RhdGljIGNvbnN0IENvbW1hbmREZWZSZWMgbWFpbl9jb21tYW5kc19wcmVhdXRoW10gPSB7CisgICAgSEVMUF9DT01NQU5ELAorCisgICAgQVZEX0NPTU1BTkQodm1fY29tbWFuZHNfcHJlYXV0aCksCisKKyAgICB7ImF1dGgiLAorICAgICAidXNlciBhdXRoZW50aWNhdGlvbiBmb3IgdGhlIGVtdWxhdG9yIGNvbnNvbGUiLAorICAgICAidXNlICdhdXRoIDxhdXRoX3Rva2VuPicgdG8gZ2V0IGV4dGVuZGVkIGNvbnNvbGUgZnVuY3Rpb25hbGl0eVxyXG4iLAorICAgICBOVUxMLAorICAgICBkb19hdXRoLAorICAgICBOVUxMfSwKKworICAgIFFVSVRfQ09NTUFORCwKKworICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfX07CisKK2NvbnN0IGNoYXIqIGFuZHJvaWRfY29uc29sZV9hdXRoX2Jhbm5lcl9nZXQoKSB7CisgICAgc3RhdGljIGNoYXIgc19hbmRyb2lkX21vbml0b3JfYXV0aF9iYW5uZXJbMTAyNF07CisgICAgc3RhdGljIGJvb2wgc19yZWFkeSA9IGZhbHNlOworCisgICAgaWYgKCFzX3JlYWR5KSB7CisgICAgICAgIC8vIGluIFFFTVUyLCBiYW5uZXJzIGdldCBcbiBhcHBlbmRlZCB3aGVuIHRoZXkgYXJlIG91dHB1dCBzbyBubyB0cmFpbGluZworICAgICAgICAvLyBcbiBoZXJlCisgICAgICAgIC8vIE5vdGUgdGhhdCBTdHVkaW8gbG9va3MgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgbWVzc2FnZSAvZXhhY3RseS8KKyAgICAgICAgY2hhciogZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuX3BhdGggPQorICAgICAgICAgICAgICAgIGFuZHJvaWRfY29uc29sZV9hdXRoX3Rva2VuX3BhdGhfZHVwKCk7CisgICAgICAgIHNucHJpbnRmKHNfYW5kcm9pZF9tb25pdG9yX2F1dGhfYmFubmVyLAorICAgICAgICAgICAgICAgICBzaXplb2Yoc19hbmRyb2lkX21vbml0b3JfYXV0aF9iYW5uZXIpLAorICAgICAgICAgICAgICAgICAiQW5kcm9pZCBDb25zb2xlOiBBdXRoZW50aWNhdGlvbiByZXF1aXJlZFxuIgorICAgICAgICAgICAgICAgICAiQW5kcm9pZCBDb25zb2xlOiB0eXBlICdhdXRoIDxhdXRoX3Rva2VuPicgdG8gYXV0aGVudGljYXRlXG4iCisgICAgICAgICAgICAgICAgICJBbmRyb2lkIENvbnNvbGU6IHlvdSBjYW4gZmluZCB5b3VyIDxhdXRoX3Rva2VuPiBpbiAiCisgICAgICAgICAgICAgICAgICJcbiclcydcbk9LIiwKKyAgICAgICAgICAgICAgICAgZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuX3BhdGgpOworICAgICAgICBmcmVlKGVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlbl9wYXRoKTsKKworICAgICAgICBzX3JlYWR5ID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc19hbmRyb2lkX21vbml0b3JfYXV0aF9iYW5uZXI7Cit9CisKK2NvbnN0IGNoYXIqIGFuZHJvaWRfY29uc29sZV9oZWxwX2Jhbm5lcl9nZXQoKSB7CisgICAgLy8gaW4gUUVNVTIsIGJhbm5lcnMgZ2V0IFxuIGFwcGVuZGVkIHdoZW4gdGhleSBhcmUgb3V0cHV0IHNvIG5vIHRyYWlsaW5nIFxuCisgICAgLy8gaGVyZQorICAgIHJldHVybiAiQW5kcm9pZCBDb25zb2xlOiB0eXBlICdoZWxwJyBmb3IgYSBsaXN0IG9mIGNvbW1hbmRzIgorICAgICAgICAgICAiXG5PSyI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc29sZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNhNmViCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGUuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2JhdHRlcnlfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2Zpbmdlcl9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvbG9jYXRpb25fYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL25ldF9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdGVsZXBob255X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC91c2VyX2V2ZW50X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC92bV9vcGVyYXRpb25zLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBBIG1hY3JvIHVzZWQgdG8gbGlzdCBhbGwgdGhlIGFnZW50cyB1c2VkIGJ5IHRoZSBBbmRyb2lkIENvbnNvbGUuCisvLyBUaGUgbWFjcm8gdGFrZXMgYSBwYXJhbWV0ZXIgfFh8IHdoaWNoIG11c3QgYmUgYSBtYWNybyB0aGF0IHRha2VzIHR3bworLy8gcGFyYW1ldGVyIGFzIGZvbGxvd3M6ICBYKHR5cGUsIG5hbWUpLCB3aGVyZSB8dHlwZXwgaXMgdGhlIGFnZW50IHR5cGUKKy8vIG5hbWUsIGFuZCB8bmFtZXwgaXMgYSBmaWVsZCBuYW1lLiBTZWUgdXNhZ2UgYmVsb3cgdG8gZGVjbGFyZQorLy8gQW5kcm9pZENvbnNvbGVBZ2VudHMuCisjZGVmaW5lIEFORFJPSURfQ09OU09MRV9BR0VOVFNfTElTVChYKSBcCisgICBYKFFBbmRyb2lkQmF0dGVyeUFnZW50LCBiYXR0ZXJ5KSBcCisgICBYKFFBbmRyb2lkRmluZ2VyQWdlbnQsIGZpbmdlcikgXAorICAgWChRQW5kcm9pZExvY2F0aW9uQWdlbnQsIGxvY2F0aW9uKSBcCisgICBYKFFBbmRyb2lkVGVsZXBob255QWdlbnQsIHRlbGVwaG9ueSkgXAorICAgWChRQW5kcm9pZFVzZXJFdmVudEFnZW50LCB1c2VyX2V2ZW50KSBcCisgICBYKFFBbmRyb2lkVm1PcGVyYXRpb25zLCB2bSkgXAorICAgWChRQW5kcm9pZE5ldEFnZW50LCBuZXQpCisKKy8vIEEgc3RydWN0dXJlIHVzZWQgdG8gZ3JvdXAgcG9pbnRlcnMgdG8gYWxsIGFnZW50IGludGVyZmFjZXMgdXNlZCBieSB0aGUKKy8vIEFuZHJvaWQgY29uc29sZS4KKyNkZWZpbmUgQU5EUk9JRF9DT05TT0xFX0RFRklORV9QT0lOVEVSKHR5cGUsbmFtZSkgY29uc3QgdHlwZSogbmFtZTsKK3R5cGVkZWYgc3RydWN0IEFuZHJvaWRDb25zb2xlQWdlbnRzIHsKKyAgICBBTkRST0lEX0NPTlNPTEVfQUdFTlRTX0xJU1QoQU5EUk9JRF9DT05TT0xFX0RFRklORV9QT0lOVEVSKQorfSBBbmRyb2lkQ29uc29sZUFnZW50czsKKworLy8gR2VuZXJpYyBlbnRyeSBwb2ludCB0byBzdGFydCBhbiBhbmRyb2lkIGNvbnNvbGUuCisvLyBRRU1VIGltcGxlbWVudGF0aW9ucyBzaG91bGQgcG9wdWxhdGUgfCphZ2VudHN8IHdpdGggUUVNVSBzcGVjaWZpYworLy8gZnVuY3Rpb25zLiBUYWtlcyBvd25lcnNoaXAgb2YgfGFnZW50c3wuCitleHRlcm4gaW50IGFuZHJvaWRfY29uc29sZV9zdGFydChpbnQgcG9ydCwgY29uc3QgQW5kcm9pZENvbnNvbGVBZ2VudHMqIGFnZW50cyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc29sZV9hdXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZhZWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aC5jcHAKQEAgLTAsMCArMSwxNTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkRmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9GaWxlVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jb25zb2xlX2F1dGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnNvbGVfYXV0aF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWlzYy9SYW5kb20uaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfaW50LmgiCit9CisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIEUoLi4uKSBkZXJyb3IoX19WQV9BUkdTX18pCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZEZkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY29uc29sZV9hdXRoIHsKKworLy8gY3JlYXRlcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIGF1dGhlbnRpY2F0aW9uIHRva2VuCisvLyAodGV4dCB0aGF0IGlzIGhhcmQgdG8gZ3Vlc3MpCitib29sIHRva2VuR2VuZXJhdGUoc3RkOjpzdHJpbmcqIGF1dGhfdG9rZW4pIHsKKyAgICBjaGFyIGJ1ZlsxMl07ICAvLyA5NiBiaXQKKyAgICBpZiAoIWFuZHJvaWQ6OmdlbmVyYXRlUmFuZG9tQnl0ZXMoYnVmLCBzaXplb2YoYnVmKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBrQmFzZTY0TGVuID0gNCAqICgoc2l6ZW9mKGJ1ZikgKyAyKSAvIDMpOworICAgIGNoYXIgYmFzZTY0W2tCYXNlNjRMZW5dOworICAgIGludCBlcnIgPSBwcm94eV9iYXNlNjRfZW5jb2RlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGJhc2U2NCwga0Jhc2U2NExlbik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgRSgicHJveHlfYmFzZTY0X2VuY29kZSBmYWlsZWQuICAoV2hhdD8pIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRoX3Rva2VuLT5hc3NpZ24oYmFzZTY0LCBrQmFzZTY0TGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gcmVhZHMgYXV0aCB0b2tlbiBmcm9tIHRoZSBzcGVjaWZpZWQgcGF0aAorLy8gaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZXMgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aAorLy8gYW5kIHdyaXRlcyBhbiBhdXRoIHRva2VuIHRvIGl0CisvLworLy8gfHBhdGh8IGlzIGEgc2VwYXJhdGUgcGFyYW1ldGVyIHRvIG1ha2UgaXQgdW5pdCB0ZXN0YWJsZQorYm9vbCB0b2tlbkxvYWRPckNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGF1dGhfdG9rZW4pIHsKKyAgICAvLyBpdCBpcyBjcml0aWNhbCB0aGF0IHRoaXMgZmlsZSBvbmx5IGJlIHJlYWRhYmxlIGJ5IHRoZSBjdXJyZW50IHVzZXIKKyAgICAvLyB0byBwcmV2ZW50IG90aGVyIHVzZXJzIG9uIHRoZSBzeXN0ZW0gZnJvbSByZWFkaW5nIGl0IGFuZCBnYWluaW5nIGFjY2VzcworICAgIC8vIHRvIHRoZSBlbXVsYXRvciBjb25zb2xlCisgICAgY29uc3QgbW9kZV90IHVzZXJfcmVhZF9vbmx5ID0gMDYwMDsKKworICAgIC8vIHRoaXMgb3BlbiB3aWxsIGZhaWwgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMKKyAgICBTY29wZWRGZCBmZChIQU5ETEVfRUlOVFIoCisgICAgICAgICAgICBvcGVuKHBhdGguY19zdHIoKSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQklOQVJZLAorICAgICAgICAgICAgICAgICB1c2VyX3JlYWRfb25seSkpKTsKKyAgICBpZiAoZmQuZ2V0KCkgPCAwKSB7CisgICAgICAgIC8vIGZpbGUgYWxyZWFkeSBleGlzdHMsIHJlYWQgaXQKKyAgICAgICAgU2NvcGVkRmQgcmVhZChIQU5ETEVfRUlOVFIob3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19CSU5BUlkpKSk7CisgICAgICAgIGlmIChyZWFkLmdldCgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZV9jb250ZW50czsKKyAgICAgICAgaWYgKCFhbmRyb2lkOjpyZWFkRmlsZUludG9TdHJpbmcocmVhZC5nZXQoKSwgJmZpbGVfY29udGVudHMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKmF1dGhfdG9rZW4gPSBhbmRyb2lkOjpiYXNlOjp0cmltKGZpbGVfY29udGVudHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghdG9rZW5HZW5lcmF0ZShhdXRoX3Rva2VuKSkgeworICAgICAgICAgICAgZmQuY2xvc2UoKTsKKyAgICAgICAgICAgIHVubGluayhwYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghYW5kcm9pZDo6d3JpdGVTdHJpbmdUb0ZpbGUoZmQuZ2V0KCksICphdXRoX3Rva2VuKSkgeworICAgICAgICAgICAgRSgiT2ggc25hcCEgIGNvdWxkbid0IHdyaXRlIH4vLmVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIGEgcGF0aCB0byB0aGUgY29uc29sZSBhdXRoIHRva2VuIGZpbGUgb24gdGhlIGN1cnJlbnQgc3lzdGVtCitzdGQ6OnN0cmluZyB0b2tlbkdldFBhdGhEZWZhdWx0KCkgeworICAgIFN5c3RlbSogc3lzID0gU3lzdGVtOjpnZXQoKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgc3lzLT5nZXRIb21lRGlyZWN0b3J5KCksICIuZW11bGF0b3JfY29uc29sZV9hdXRoX3Rva2VuIik7Cit9CisKK2ZuX2dldF9hdXRoX3Rva2VuX3BhdGggZ19nZXRfYXV0aF90b2tlbl9wYXRoID0gdG9rZW5HZXRQYXRoRGVmYXVsdDsKKworLy8gR2V0cy9jcmVhdGVzIGFuIGF1dGggdG9rZW4gaW4gdGhlIGRlZmF1bHQgcGF0aAorYm9vbCB0b2tlbkdldChzdGQ6OnN0cmluZyogYXV0aF90b2tlbikgeworICAgIHJldHVybiB0b2tlbkxvYWRPckNyZWF0ZShnX2dldF9hdXRoX3Rva2VuX3BhdGgoKSwgYXV0aF90b2tlbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb25zb2xlX2F1dGgKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworY2hhciogYW5kcm9pZF9jb25zb2xlX2F1dGhfZ2V0X3Rva2VuX2R1cCgpIHsKKyAgICBzdGQ6OnN0cmluZyBhdXRoX3Rva2VuOworICAgIGlmICghYW5kcm9pZDo6Y29uc29sZV9hdXRoOjp0b2tlbkdldCgmYXV0aF90b2tlbikpIHsKKyAgICAgICAgLy8gY291bGRuJ3QgZ2V0IGF1dGggdG9rZW4sIGRpc2FibGUgdGhlIGNvbnNvbGUKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmR1cChhdXRoX3Rva2VuLmNfc3RyKCkpOworfQorCitpbnQgYW5kcm9pZF9jb25zb2xlX2F1dGhfZ2V0X3N0YXR1cygpIHsKKyAgICBzdGQ6OnN0cmluZyBhdXRoX3Rva2VuOworICAgIGlmICghYW5kcm9pZDo6Y29uc29sZV9hdXRoOjp0b2tlbkdldCgmYXV0aF90b2tlbikpIHsKKyAgICAgICAgLy8gY291bGRuJ3QgZ2V0IGF1dGggdG9rZW4sIGRpc2FibGUgdGhlIGNvbnNvbGUKKyAgICAgICAgcmV0dXJuIENPTlNPTEVfQVVUSF9TVEFUVVNfRVJST1I7CisgICAgfQorCisgICAgaWYgKGF1dGhfdG9rZW4uc2l6ZSgpID09IDApIHsKKyAgICAgICAgLy8gYW4gZW1wdHkgYXV0aCB0b2tlbiBzdHJpbmcgbWVhbnMgdGhhdCBhdXRoIGlzbid0IHJlcXVpcmVkCisgICAgICAgIHJldHVybiBDT05TT0xFX0FVVEhfU1RBVFVTX0RJU0FCTEVEOworICAgIH0KKyAgICByZXR1cm4gQ09OU09MRV9BVVRIX1NUQVRVU19SRVFVSVJFRDsKK30KKworY2hhciogYW5kcm9pZF9jb25zb2xlX2F1dGhfdG9rZW5fcGF0aF9kdXAoKSB7CisgICAgc3RkOjpzdHJpbmcgYXV0aF90b2tlbiA9IGFuZHJvaWQ6OmNvbnNvbGVfYXV0aDo6Z19nZXRfYXV0aF90b2tlbl9wYXRoKCk7CisgICAgcmV0dXJuIHN0cmR1cChhdXRoX3Rva2VuLmNfc3RyKCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYWExNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc29sZV9hdXRoLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworY2hhciogYW5kcm9pZF9jb25zb2xlX2F1dGhfdG9rZW5fcGF0aF9kdXAoKTsKKworY2hhciogYW5kcm9pZF9jb25zb2xlX2F1dGhfZ2V0X3Rva2VuX2R1cCgpOworCisjZGVmaW5lIENPTlNPTEVfQVVUSF9TVEFUVVNfUkVRVUlSRUQgXAorICAgIDAgIC8vIH4vLmVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlbiBjb250YWlucyBhbiBhdXRoIHRva2VuCisjZGVmaW5lIENPTlNPTEVfQVVUSF9TVEFUVVNfRElTQUJMRUQgXAorICAgIDEgIC8vIH4vLmVtdWxhdG9yX2NvbnNvbGVfYXV0aF90b2tlbiBpcyBlbXB0eQorI2RlZmluZSBDT05TT0xFX0FVVEhfU1RBVFVTX0VSUk9SIFwKKyAgICAyICAvLyB+Ly5lbXVsYXRvcl9jb25zb2xlX2F1dGhfdG9rZW4gaXMgaW5hY2Nlc3NpYmxlCisKK2ludCBhbmRyb2lkX2NvbnNvbGVfYXV0aF9nZXRfc3RhdHVzKCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aF9pbnRlcm5hbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NmMyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc29sZV9hdXRoX2ludGVybmFsLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNvbnNvbGVfYXV0aCB7CisKK2Jvb2wgdG9rZW5Mb2FkT3JDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBhdXRoX3Rva2VuKTsKKworc3RkOjpzdHJpbmcgdG9rZW5HZXRQYXRoRGVmYXVsdCgpOworCisvLyBGb3IgdW5pdCB0ZXN0IG1vY2tpbmcgb25seS4gIFRoaXMgbGV0cyB1bml0IHRlc3RzIHJ1biB3aXRoIGEgdGVtcCBmaWxlCisvLyBpbnN0ZWFkIG9mIHRoZSB1c2VyJ3MgcmVhbCBhdXRoIHRva2VuCit0eXBlZGVmIHN0ZDo6c3RyaW5nICgqZm5fZ2V0X2F1dGhfdG9rZW5fcGF0aCkoKTsKK2V4dGVybiBmbl9nZXRfYXV0aF90b2tlbl9wYXRoIGdfZ2V0X2F1dGhfdG9rZW5fcGF0aDsKKworfSAgLy8gbmFtZXNwYWNlIGNvbnNvbGVfYXV0aAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jb25zb2xlX2F1dGhfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NvbnNvbGVfYXV0aF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzNjc2YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jb25zb2xlX2F1dGhfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnNvbGVfYXV0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvY29uc29sZV9hdXRoX2ludGVybmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvRmlsZVV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgYmFzZTo6U2NvcGVkRmQ7CisKK25hbWVzcGFjZSBjb25zb2xlX2F1dGggeworCitzdGF0aWMgc3RkOjpzdHJpbmcgdGVtcF9hdXRoX3Rva2VuX2ZpbGU7CitzdGQ6OnN0cmluZyBnZXRfdGVtcF9hdXRoX3Rva2VuX2ZpbGUoKSB7CisgICAgcmV0dXJuIHRlbXBfYXV0aF90b2tlbl9maWxlOworfQorCitURVNUKENvbnNvbGVBdXRoLCBnZXRfYXV0aF90b2tlbl9mcm9tX2V4aXN0cykgeworICAgIHN0ZDo6c3RyaW5nIGF1dGhfdG9rZW47CisKKyAgICBjb25zdCBjaGFyKiB0ZXN0X2RhdGFbXSA9IHsKKyAgICAgICAgICAgICJ0ZXN0IHBhdHRlcm4iLAorICAgICAgICAgICAgInRlc3QgcGF0dGVyblxyXG4iLAorICAgICAgICAgICAgIiAgdGVzdCBwYXR0ZXJuIiwKKyAgICAgICAgICAgICIgIHRlc3QgcGF0dGVyblxyXG4iLAorICAgIH07CisgICAgc2l6ZV90IFRFU1RfREFUQV9DT1VOVCA9IHNpemVvZih0ZXN0X2RhdGEpIC8gc2l6ZW9mKHRlc3RfZGF0YVswXSk7CisKKyAgICBUZW1wRmlsZSogdGYgPSB0ZW1wZmlsZV9jcmVhdGUoKTsKKyAgICB0ZW1wZmlsZV9jbG9zZSh0Zik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFRFU1RfREFUQV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGludCBmZCA9IEhBTkRMRV9FSU5UUigKKyAgICAgICAgICAgICAgICBvcGVuKHRlbXBmaWxlX3BhdGgodGYpLCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fV1JPTkxZLCAwNjAwKSk7CisgICAgICAgIEVYUEVDVF9ORSgtMSwgZmQpOworICAgICAgICBFWFBFQ1RfVFJVRShhbmRyb2lkOjp3cml0ZVN0cmluZ1RvRmlsZShmZCwgdGVzdF9kYXRhW2ldKSk7CisgICAgICAgIEhBTkRMRV9FSU5UUihjbG9zZShmZCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKHRva2VuTG9hZE9yQ3JlYXRlKHRlbXBmaWxlX3BhdGgodGYpLCAmYXV0aF90b2tlbikpOworICAgICAgICBFWFBFQ1RfU1RSRVEoInRlc3QgcGF0dGVybiIsIGF1dGhfdG9rZW4uY19zdHIoKSk7CisgICAgICAgIHRlbXBmaWxlX2Nsb3NlKHRmKTsKKyAgICB9Cit9CisKK2Jvb2wgaXNiYXNlNjQoY2hhciBjKSB7CisgICAgcmV0dXJuICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8IGMgPT0gJysnIHx8IGMgPT0gJy8nIHx8IGMgPT0gJz0nOworfQorCitURVNUKENvbnNvbGVBdXRoLCBnZXRfYXV0aF90b2tlbl9mcm9tX2NyZWF0ZSkgeworICAgIHN0ZDo6c3RyaW5nIGF1dGhfdG9rZW47CisKKyAgICBUZW1wRmlsZSogdGYgPSB0ZW1wZmlsZV9jcmVhdGUoKTsKKyAgICB0ZW1wZmlsZV9jbG9zZSh0Zik7CisKKyAgICBjb25zdCBpbnQga0Jhc2U2NExlbiA9IDE2OworICAgIEVYUEVDVF9UUlVFKHRva2VuTG9hZE9yQ3JlYXRlKHRlbXBmaWxlX3BhdGgodGYpLCAmYXV0aF90b2tlbikpOworICAgIHN0cnVjdCBzdGF0IHN0YXRfaW5mbzsKKyAgICBFWFBFQ1RfRVEoMCwgc3RhdCh0ZW1wZmlsZV9wYXRoKHRmKSwgJnN0YXRfaW5mbykpOworICAgIEVYUEVDVF9FUShrQmFzZTY0TGVuLCBzdGF0X2luZm8uc3Rfc2l6ZSk7CisgICAgLy8gYWxsIHdlIGtub3cgYWJvdXQgdGhpcyB0b2tlbiBpcyB0aGF0IGl0IHdpbGwgYmUgMTYgYnl0ZXMgYmFzZTY0IGVuY29kZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtCYXNlNjRMZW47IGkrKykgeworICAgICAgICBFWFBFQ1RfVFJVRShpc2Jhc2U2NChhdXRoX3Rva2VuW2ldKSk7CisgICAgfQorICAgIEVYUEVDVF9FUShrQmFzZTY0TGVuLCBhdXRoX3Rva2VuLnNpemUoKSk7CisKKyAgICB0ZW1wZmlsZV9jbG9zZSh0Zik7Cit9CisKK1RFU1QoQ29uc29sZUF1dGgsIGdldF9hdXRoX3Rva2VuX2Zyb21fZmFpbCkgeworICAgIHN0ZDo6c3RyaW5nIGF1dGhfdG9rZW47CisgICAgRVhQRUNUX0ZBTFNFKHRva2VuTG9hZE9yQ3JlYXRlKCIvYWJzb2x1dGVseS9ib2d1cy9wYXRoIiwgJmF1dGhfdG9rZW4pKTsKK30KKworc3RkOjpzdHJpbmcgcmVhZF9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgU2NvcGVkRmQgZmQoSEFORExFX0VJTlRSKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSkpKTsKKyAgICBFWFBFQ1RfTkUoLTEsIGZkLmdldCgpKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZDo6cmVhZEZpbGVJbnRvU3RyaW5nKGZkLmdldCgpLCAmcmVzdWx0KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChDb25zb2xlQXV0aCwgYW5kcm9pZF9jb25zb2xlX2F1dGhfZ2V0X3N0YXR1cykgeworICAgIFRlbXBGaWxlKiB0ZiA9IHRlbXBmaWxlX2NyZWF0ZSgpOworCisgICAgLy8gb3ZlcnJpZGUgZGVmYXVsdCBhdXRoIHRva2VuIGZpbGUgcGF0aAorICAgIHRlbXBfYXV0aF90b2tlbl9maWxlLmFzc2lnbih0ZW1wZmlsZV9wYXRoKHRmKSk7CisgICAgZ19nZXRfYXV0aF90b2tlbl9wYXRoID0gZ2V0X3RlbXBfYXV0aF90b2tlbl9maWxlOworCisgICAgLy8gdGVzdCB3aXRoIGFuIGVtcHR5IGF1dGggdG9rZW4gZmlsZQorICAgIEVYUEVDVF9FUShDT05TT0xFX0FVVEhfU1RBVFVTX0RJU0FCTEVELCBhbmRyb2lkX2NvbnNvbGVfYXV0aF9nZXRfc3RhdHVzKCkpOworCisgICAgLy8gdGVzdCB3aXRoIG5vIGF1dGggdG9rZW4gZmlsZSAoaXQgc2hvdWxkIGJlIGNyZWF0ZWQpCisgICAgdGVtcGZpbGVfY2xvc2UodGYpOworICAgIEVYUEVDVF9FUShDT05TT0xFX0FVVEhfU1RBVFVTX1JFUVVJUkVELCBhbmRyb2lkX2NvbnNvbGVfYXV0aF9nZXRfc3RhdHVzKCkpOworCisgICAgdGVtcF9hdXRoX3Rva2VuX2ZpbGUuYXNzaWduKCIvdmVyeS9iYWQvcGF0aCIpOworICAgIEVYUEVDVF9FUShDT05TT0xFX0FVVEhfU1RBVFVTX0VSUk9SLCBhbmRyb2lkX2NvbnNvbGVfYXV0aF9nZXRfc3RhdHVzKCkpOworCisgICAgY2hhciogZHVwID0gYW5kcm9pZF9jb25zb2xlX2F1dGhfdG9rZW5fcGF0aF9kdXAoKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi92ZXJ5L2JhZC9wYXRoIiwgZHVwKTsKKyAgICBmcmVlKGR1cCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjb25zb2xlX2F1dGgKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc3RhbnRzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NDNiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jb25zdGFudHMuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworLyogTWF4aW11bSBudW1iZXJzIG9mIGVtdWxhdG9ycyB0aGF0IGNhbiBydW4gY29uY3VycmVudGx5IHdpdGhvdXQKKyAqIGZvcmNpbmcgdGhlaXIgcG9ydCBudW1iZXJzIHdpdGggdGhlIC1wb3J0IG9wdGlvbi4KKyAqIFRoaXMgaXMgbm90IGEgaGFyZCBsaW1pdC4gSW5zdGVhZCwgd2hlbiBzdGFydGluZyB1cCwgdGhlIHByb2dyYW0KKyAqIHdpbGwgdHJ5IHRvIGJpbmQgdG8gbG9jYWxob3N0IHBvcnRzIDU1NTQgKyBuKjIsIGZvciBuIGluCisgKiBbMC4uTUFYX0VNVUxBVE9SUyksIGlmIGl0IGZhaWxzLCBpdCB3aWxsIHJlZnVzZSB0byBzdGFydC4KKyAqIFlvdSBjYW4gcm91dGUgYXJvdW5kIHRoaXMgYnkgdXNpbmcgdGhlIC1wb3J0IG9yIC1wb3J0cyBvcHRpb25zCisgKiB0byBzcGVjaWZ5IHRoZSBwb3J0cyBtYW51YWxseS4KKyAqLworI2RlZmluZSBNQVhfQU5EUk9JRF9FTVVMQVRPUlMgIDE2CisKKyNkZWZpbmUgQU5EUk9JRF9DT05TT0xFX0JBU0VQT1JUIDU1NTQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0OWVlYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvY3B1X2FjY2VsZXJhdG9yLmgiCisKKy8vIFRoaXMgc291cmNlIGFjdHMgYXMgYSBzbWFsbCBDKysgLT4gQyBicmlkZ2UgYmV0d2VlbiBhbmRyb2lkL2VtdWxhdGlvbi8KKy8vIGFuZCBhbmRyb2lkLXFlbXUxLWdsdWUvbWFpbi5jCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKK2V4dGVybiAiQyIgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBhbmRyb2lkQ3B1QWNjZWxlcmF0aW9uX2dldFN0YXR1cygKKyAgICAgICAgY2hhcioqIHN0YXR1c19wKSB7CisgICAgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiByZXN1bHQgPSBhbmRyb2lkOjpHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3JTdGF0dXNDb2RlKCk7CisKKyAgICBpZiAoc3RhdHVzX3ApIHsKKyAgICAgICAgKnN0YXR1c19wID0gYW5kcm9pZDo6YmFzZTo6c3RyRHVwKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkdldEN1cnJlbnRDcHVBY2NlbGVyYXRvclN0YXR1cygpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzkwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3B1X2FjY2VsZXJhdG9yLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gZG9uJ3QgY2hhbmdlIHRoZXNlIG51bWJlcnMKKy8vIEFuZHJvaWQgU3R1ZGlvIGRlcGVuZHMgb24gdGhlbQordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fUkVBRFkgICAgICAgICAgICAgICAgICAgID0gMCwgLy8gQWNjZWxlcmF0aW9uIGlzIGF2YWlsYWJsZQorICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ORVNURURfTk9UX1NVUFBPUlRFRCAgICAgPSAxLCAvLyBIQVhNIGRvZXNuJ3Qgc3VwcG9ydCBuZXN0ZWQgVk0KKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fSU5URUxfUkVRVUlSRUQgICAgICAgICAgID0gMiwgLy8gSEFYTSByZXF1aXJlcyBHZW5pdW5lSW50ZWwgcHJvY2Vzc29yCisgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05PX0NQVV9TVVBQT1JUICAgICAgICAgICA9IDMsIC8vIENQVSBkb2Vzbid0IHN1cHBvcnQgcmVxdWlyZWQgZmVhdHVyZXMgKFZULXggb3IgU1ZNKQorICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9OT19DUFVfVlRYX1NVUFBPUlQgICAgICAgPSA0LCAvLyBDUFUgZG9lc24ndCBzdXBwb3J0IFZULXgKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fTk9fQ1BVX05YX1NVUFBPUlQgICAgICAgID0gNSwgLy8gQ1BVIGRvZXNuJ3Qgc3VwcG9ydCBOWAorICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9BQ0NFTF9OT1RfSU5TVEFMTEVEICAgICAgPSA2LCAvLyBLVk0vSEFYTSBwYWNrYWdlIG5vdCBpbnN0YWxsZWQKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fQUNDRUxfT0JTT0xFVEUgICAgICAgICAgID0gNywgLy8gSEFYTSBwYWNrYWdlIGlzIG9ic29sZXRlCisgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9OT1RfRk9VTkQgICAgICAgICAgICA9IDgsIC8vIC9kZXYva3ZtIGlzIG5vdCBmb3VuZDogVlQgZGlzYWJsZWQgaW4gQklPUyBvciBLVk0ga2VybmVsIG1vZHVsZSBub3QgbG9hZGVkCisgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1ZUX0RJU0FCTEVEICAgICAgICAgICAgICA9IDksIC8vIEhBWE0gaXMgaW5zdGFsbGVkIGJ1dCBWVCBkaXNhYmxlZCBpbiBCSU9TCisgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05YX0RJU0FCTEVEICAgICAgICAgICAgICA9IDEwLCAvLyBIQVhNIGlzIGluc3RhbGxlZCBidXQgTlggZGlzYWJsZWQgaW4gQklPUworICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfUEVSTUlTU0lPTiAgICAgICAgICAgPSAxMSwgLy8gL2Rldi9rdm0gb3IgSEFYTSBkZXZpY2U6IHBlcm1pc3Npb24gZGVuaWVkCisgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9PUEVOX0ZBSUxFRCAgICAgICAgICA9IDEyLCAvLyAvZGV2L2t2bSBvciBIQVhNIGRldmljZTogb3BlbiBmYWlsZWQKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX0lPQ1RMX0ZBSUxFRCAgICAgICAgID0gMTMsIC8vIC9kZXYva3ZtIG9yIEhBWE0gZGV2aWNlOiBpb2N0bCBmYWlsZWQKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX09CU09MRVRFICAgICAgICAgICAgID0gMTQsIC8vIEtWTSBvciBIQVhNIHN1cHBvcnRlZCBBUEkgaXMgdG9vIG9sZAorICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9IWVBFUlZfRU5BQkxFRCAgICAgICAgICAgPSAxNSwgLy8gSHlwZXJWIG11c3QgYmUgZGlzYWJsZWQKKyAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fRVJST1IgICAgICAgICAgICAgICAgICAgID0gMTM4LCAvLyBTb21lIG90aGVyIGVycm9yIG9jY3VycmVkCit9IEFuZHJvaWRDcHVBY2NlbGVyYXRpb247CisKKy8vIGRpdHRvCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfSFlQRVJWX0FCU0VOVCAgICAgICA9IDAsICAgIC8vIE5vIGh5cGVyLVYgZm91bmQKKyAgICBBTkRST0lEX0hZUEVSVl9JTlNUQUxMRUQgICAgPSAxLCAgICAvLyBIeXBlci1WIGlzIGluc3RhbGxlZCBidXQgbm90IHJ1bm5pbmcKKyAgICBBTkRST0lEX0hZUEVSVl9SVU5OSU5HICAgICAgPSAyLCAgICAvLyBIeXBlci1WIGlzIHVwIGFuZCBydW5uaW5nCisgICAgQU5EUk9JRF9IWVBFUlZfRVJST1IgICAgICAgID0gMTAwLCAgLy8gRmFpbGVkIHRvIGRldGVjdCBzdGF0dXMKK30gQW5kcm9pZEh5cGVyVlN0YXR1czsKKworLy8gKzEsIGNwdSBpbmZvCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfQ1BVX0lORk9fRkFJTEVEID0gMCwgICAgLy8gdGhpcyBpcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VudCB3cm9uZworCisgICAgQU5EUk9JRF9DUFVfSU5GT19BTUQgPSAxIDw8IDAsICAgICAgIC8vIEFNRCBDUFUKKyAgICBBTkRST0lEX0NQVV9JTkZPX0lOVEVMID0gMSA8PCAxLCAgICAgLy8gSW50ZWwgQ1BVCisgICAgQU5EUk9JRF9DUFVfSU5GT19PVEhFUiA9IDEgPDwgMiwgICAgIC8vIE90aGVyIENQVSBtYW51ZmFjdHVyZXIKKyAgICBBTkRST0lEX0NQVV9JTkZPX1ZNID0gMSA8PCAzLCAgICAgICAgLy8gUnVubmluZyBpbiBhIFZNCisgICAgQU5EUk9JRF9DUFVfSU5GT19WSVJUX1NVUFBPUlRFRCA9IDEgPDwgNCwgICAgLy8gQ1BVIHN1cHBvcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmlydHVhbGl6YXRpb24gdGVjaG5vbG9naWVzCisKKyAgICBBTkRST0lEX0NQVV9JTkZPXzMyX0JJVCA9IDEgPDwgNSwgICAgICAgICAgIC8vIDMyLWJpdCBDUFUsIHJlYWxseSEKKyAgICBBTkRST0lEX0NQVV9JTkZPXzY0X0JJVF8zMl9CSVRfT1MgPSAxIDw8IDYsIC8vIDMyLWJpdCBPUyBvbiBhIDY0LWJpdCBDUFUKKyAgICBBTkRST0lEX0NQVV9JTkZPXzY0X0JJVCA9IDEgPDwgNywgICAgICAgICAgIC8vIDY0LWJpdCBDUFUKKworfSBBbmRyb2lkQ3B1SW5mb0ZsYWdzOworCisvKiBSZXR1cm5zIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9SRUFEWSBpZiBDUFUgYWNjZWxlcmF0aW9uIGlzCisgKiAgcG9zc2libGUgb24gdGhpcyBtYWNoaW5lLiAgSWYgfHN0YXR1c3wgaXMgbm90IE5VTEwsIG9uIGV4aXQsCisgKiB8KnN0YXR1c3wgd2lsbCBiZSBzZXQgdG8gYSBoZWFwLWFsbG9jYXRlZCBzdHJpbmcgZGVzY3JpYmluZworICogdGhlIHN0YXR1cyBvZiBhY2NlbGVyYXRpb24sIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK0FuZHJvaWRDcHVBY2NlbGVyYXRpb24gYW5kcm9pZENwdUFjY2VsZXJhdGlvbl9nZXRTdGF0dXMoY2hhcioqIHN0YXR1cyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwZmZlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCisvLyBDbGFzcyBDcmFzaFJlcG9ydGVyIGlzIGEgc2luZ2xldG9uIGNsYXNzIHRoYXQgd3JhcHMgYnJlYWtwYWQgT09QIGNyYXNoCisvLyBjbGllbnQuCisvLyBJdCBwcm92aWRlcyBmdW5jdGlvbnMgdG8gYXR0YWNoIHRvIGEgY3Jhc2ggc2VydmVyIGFuZCB0byB3YWl0IGZvciBhIGNyYXNoCisvLyBzZXJ2ZXIgdG8gc3RhcnQgY3Jhc2ggY29tbXVuaWNhdGlvbiBwaXBlcy4KK2NsYXNzIENyYXNoUmVwb3J0ZXIgeworcHVibGljOgorICAgIHVzaW5nIENyYXNoQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT47CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtXYWl0RXhwaXJlTVMgPSA1MDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrV2FpdEludGVydmFsTVMgPSAyMDsKKworICAgIC8vIE5hbWUgb2YgdGhlIGZpbGUgd2l0aCB0aGUgZHVtcCBtZXNzYWdlIHBhc3NlZCBmcm9tIHRoZSBlbXVsYXRvciBpbgorICAgIC8vIGEgZHVtcCBkYXRhIGV4Y2hhbmdlIGRpcmVjdG9yeQorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRHVtcE1lc3NhZ2VGaWxlTmFtZTsKKworICAgIC8vIEZpbGUgd2l0aCB0aGUgcHJvY2VzcyBtZW1vcnkgaW5mb3JtYXRpb24KKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1Byb2Nlc3NNZW1vcnlJbmZvRmlsZU5hbWU7CisKKyAgICAvLyBGaWxlIHRvIGxvZyBjcmFzaGVzIG9uIGV4aXQKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0NyYXNoT25FeGl0RmlsZU5hbWU7CisKKyAgICAvLyBGaWxlIHRvIGxvZyB0aGUgcHJvY2VzcyBsaXN0CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtQcm9jZXNzTGlzdEZpbGVOYW1lOworCisgICAgLy8gUGF0dGVybiB0byBjaGVjayBmb3Igd2hlbiBkZXRlY3RpbmcgY3Jhc2hlcyBvbiBleGl0CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtDcmFzaE9uRXhpdFBhdHRlcm47CisKKyAgICAvLyBRU2V0dGluZyBrZXkgdGhhdCBpcyBzYXZlZCB3aGVuIGNyYXNoIHJlcG9ydGluZyBhdXRvbWF0aWNhbGx5IG9yIG5vdAorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrUHJvY2Vzc0NyYXNoZXNRdWlldGx5S2V5OworCisgICAgQ3Jhc2hSZXBvcnRlcigpOworCisgICAgdmlydHVhbCB+Q3Jhc2hSZXBvcnRlcigpOworCisgICAgLy8gQXR0YWNoIHBsYXRmb3JtIGRlcGVuZGVudCBjcmFzaCBoYW5kbGVyLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBhdHRhY2hlZCBvciBpZiBhdHRhY2ggZmFpbHMuCisgICAgdmlydHVhbCBib29sIGF0dGFjaENyYXNoSGFuZGxlcigKKyAgICAgICAgICAgIGNvbnN0IENyYXNoU3lzdGVtOjpDcmFzaFBpcGUmIGNyYXNocGlwZSkgPSAwOworCisgICAgLy8gV2FpdHMgZm9yIGEgcGxhdGZvcm0gZGVwZW5kZW50IHBpcGUgdG8gYmVjb21lIHZhbGlkIG9yIHRpbWVvdXQgb2NjdXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGltZW91dCBvY2N1cnMuCisgICAgdmlydHVhbCBib29sIHdhaXRTZXJ2aWNlUGlwZVJlYWR5KGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXRfbXMgPSBrV2FpdEV4cGlyZU1TKSA9IDA7CisKKyAgICAvLyBTcGVjaWFsIGNvbmZpZyB3aGVuIGNyYXNoIHNlcnZpY2UgaXMgaW4gY2hpbGQgcHJvY2VzcworICAgIHZpcnR1YWwgdm9pZCBzZXR1cENoaWxkQ3Jhc2hQcm9jZXNzKGludCBwaWQpID0gMDsKKworICAgIC8vIHJldHVybnMgZHVtcCBkaXIKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RHVtcERpcigpIGNvbnN0OworCisgICAgLy8gcmV0dXJucyB0aGUgZGlyZWN0b3J5IGZvciBkYXRhIGV4Y2hhbmdlIGZpbGVzLiBBbGwgZmlsZXMgZnJvbSB0aGlzCisgICAgLy8gZGlyZWN0b3J5IHdpbGwgZ28gdG8gdGhlIHJlcG9ydGluZyBzZXJ2ZXIgdG9nZXRoZXIgd2l0aCB0aGUgY3Jhc2ggZHVtcC4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RGF0YUV4Y2hhbmdlRGlyKCkgY29uc3Q7CisKKyAgICAvLyBHZXRzIGEgaGFuZGxlIHRvIHNpbmdsZSBpbnN0YW5jZSBvZiBjcmFzaCByZXBvcnRlcgorICAgIHN0YXRpYyBDcmFzaFJlcG9ydGVyKiBnZXQoKTsKKworICAgIC8vIFBhc3Mgc29tZSBkYXRhIHRvIHRoZSBjcmFzaCByZXBvcnRlciwgc28gaW4gY2FzZSBvZiBhIGNyYXNoIGl0J3MgdXBsb2FkZWQKKyAgICAvLyB3aXRoIHRoZSBkdW1wCisgICAgLy8gfG5hbWV8IC0gYSBnZW5lcmljIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhIGJlaW5nIGFkZGVkLiBDdXJyZW50CisgICAgLy8gICAgICAgICAgaW1wbGVtZW50YXRpb24gdXBsb2FkcyB0aGUgZGF0YSBpbiBhIGZpbGUgbmFtZWQgfG5hbWV8CisgICAgLy8gICAgICAgICAgaWYgfG5hbWV8IGlzIGVtcHR5IHRoZSBmaWxlIGdldHMgc29tZSBkZWZhdWx0IGdlbmVyaWMgbmFtZQorICAgIC8vIHxkYXRhfCAtIGEgc3RyaW5nIG9mIGRhdGEgdG8gdXBsb2FkIHdpdGggdGhlIGNyYXNoIHJlcG9ydAorICAgIC8vIHxyZXBsYWNlfCAtIHJlcGxhY2UgYWxsIHRoZSBkYXRhIHdpdGggdGhlIHNhbWUgbmFtZSBpbnN0ZWFkIG9mIGFwcGVuZGluZworICAgIHZvaWQgYXR0YWNoRGF0YShhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBsYWNlID0gZmFsc2UpOworCisgICAgLy8gUGFzcyBzb21lIGZpbGUgdG8gdGhlIGNyYXNoIHJlcG9ydGVyIHRvIHVwbG9hZCBpdCB3aXRoIHRoZSBkdW1wCisgICAgYm9vbCBhdHRhY2hGaWxlKGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgc291cmNlRnVsbE5hbWUsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGVzdEJhc2VOYW1lKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyB3cml0ZSBhIGR1bXAgb2YgY3VycmVudCBwcm9jZXNzIHN0YXRlLgorICAgIC8vIEJvdGggcGFzcyB0aGUgfG1lc3NhZ2V8IHRvIHRoZSBkdW1wIHdyaXRlciwgc28gaXQgaXMgc2VudCB0b2dldGhlciB3aXRoCisgICAgLy8gdGhlIGR1bXAgZmlsZQorICAgIC8vIEdlbmVyYXRlRHVtcEFuZERpZSgpIGFsc28gZG9lc24ndCByZXR1cm4gLSBpdCB0ZXJtaW5hdGVzIHByb2Nlc3MgaW4gYQorICAgIC8vIGZhc3Rlc3QgcG9zc2libGUgd2F5LiBUaGUgcHJvY2VzcyBkb2Vzbid0IHNob3cvcHJpbnQgYW55IG1lc3NhZ2UgdG8gdGhlCisgICAgLy8gdXNlciB3aXRoIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gb2YgIlNlZ21lbnRhdGlvbiBmYXVsdCIuCisgICAgdm9pZCBHZW5lcmF0ZUR1bXAoY29uc3QgY2hhciogbWVzc2FnZSk7CisgICAgdm9pZCBHZW5lcmF0ZUR1bXBBbmREaWUoY29uc3QgY2hhciogbWVzc2FnZSk7CisKKyAgICB2b2lkIFNldEV4aXRNb2RlKGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICAgIGJvb2wgaXNJbkV4aXRNb2RlKCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZENyYXNoQ2FsbGJhY2soQ3Jhc2hDYWxsYmFjayBjYikgeworICAgICAgICBhc3NlcnQoYm9vbChjYikpOworICAgICAgICBtQ3Jhc2hDYWxsYmFja3MucHVzaF9iYWNrKHN0ZDo6bW92ZShjYikpOworICAgIH0KKworICAgIGJvb2wgb25DcmFzaCgpOworCitwcml2YXRlOgorICAgIHZpcnR1YWwgYm9vbCBvbkNyYXNoUGxhdGZvcm1TcGVjaWZpYygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVEdW1wKCkgPSAwOworICAgIC8vIFBhc3MgdGhlIHxtZXNzYWdlfCB0byB0aGUgY3Jhc2ggc2VydmljZSBwcm9jZXNzCisgICAgdm9pZCBwYXNzRHVtcE1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyYXNoUmVwb3J0ZXIpOworCisgICAgc3RkOjp2ZWN0b3I8Q3Jhc2hDYWxsYmFjaz4gbUNyYXNoQ2FsbGJhY2tzOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1EdW1wRGlyOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1EYXRhRXhjaGFuZ2VEaXI7CisgICAgYm9vbCBtSXNJbkV4aXRNb2RlID0gZmFsc2U7Cit9OworCit9ICAvLyBjcmFzaHJlcG9ydAorfSAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXJfY29tbW9uLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyX2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhZDE3MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9VdWlkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL21ldHJpY3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2RlZmluZSBFKC4uLikgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSBXKC4uLikgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKQorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VXVpZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNyYXNocmVwb3J0IHsKKworY29uc3QgY2hhciogY29uc3QgQ3Jhc2hSZXBvcnRlcjo6a0R1bXBNZXNzYWdlRmlsZU5hbWUgPQorICAgICAgICAiaW50ZXJuYWwtZXJyb3ItbXNnLnR4dCI7Citjb25zdCBjaGFyKiBjb25zdCBDcmFzaFJlcG9ydGVyOjprUHJvY2Vzc01lbW9yeUluZm9GaWxlTmFtZSA9CisgICAgICAgICJwcm9jZXNzLW1lbW9yeS1pbmZvLnR4dCI7Citjb25zdCBjaGFyKiBjb25zdCBDcmFzaFJlcG9ydGVyOjprQ3Jhc2hPbkV4aXRGaWxlTmFtZSA9CisgICAgICAgICJjcmFzaC1vbi1leGl0LnR4dCI7Citjb25zdCBjaGFyKiBjb25zdCBDcmFzaFJlcG9ydGVyOjprUHJvY2Vzc0xpc3RGaWxlTmFtZSA9CisgICAgICAgICJzeXN0ZW0tcHJvY2Vzcy1saXN0LnR4dCI7Citjb25zdCBjaGFyKiBjb25zdCBDcmFzaFJlcG9ydGVyOjprQ3Jhc2hPbkV4aXRQYXR0ZXJuID0KKyAgICAgICAgIkNyYXNoIG9uIGV4aXQiOworCitjb25zdCBjaGFyKiBjb25zdCBDcmFzaFJlcG9ydGVyOjprUHJvY2Vzc0NyYXNoZXNRdWlldGx5S2V5ID0KKyAgICAgICAgInNldC9wcm9jZXNzQ3Jhc2hlc1F1aWV0bHkiOworCitDcmFzaFJlcG9ydGVyOjpDcmFzaFJlcG9ydGVyKCkKKyAgICA6IG1EdW1wRGlyKFN5c3RlbTo6Z2V0KCktPmdldFRlbXBEaXIoKS5jX3N0cigpKSwKKyAgICAgIC8vIFRPRE86IGFkZCBhIGZ1bmN0aW9uIHRoYXQgY2FuIGNyZWF0ZSBhIGRpcmVjdG9yeSBvciBlcnJvci1vdXQKKyAgICAgIC8vIGlmIGl0IGV4aXN0cyBhdG9taWNhbGx5LiBGb3Igbm93IGxldCdzIGp1c3QgYWxsb3cgVVVJRHMgdG8gZG8gdGhlaXIKKyAgICAgIC8vIGpvYiB0byBrZWVwIHRoZXNlIHVuaXF1ZQorICAgICAgbURhdGFFeGNoYW5nZURpcigKKyAgICAgICAgICAgICAgUGF0aFV0aWxzOjpqb2luKG1EdW1wRGlyLCBVdWlkOjpnZW5lcmF0ZUZhc3QoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSB7CisgICAgY29uc3QgYXV0byByZXMgPSBwYXRoX21rZGlyX2lmX25lZWRlZChtRGF0YUV4Y2hhbmdlRGlyLmNfc3RyKCksIDA3NDQpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIEUoIkZhaWxlZCB0byBjcmVhdGUgdGVtcCBkaXJlY3RvcnkgZm9yIGNyYXNoIHNlcnZpY2UgY29tbXVuaWNhdGlvbjogIgorICAgICAgICAgICInJXMnIiwKKyAgICAgICAgICBtRGF0YUV4Y2hhbmdlRGlyLmNfc3RyKCkpOworICAgIH0KK30KKworQ3Jhc2hSZXBvcnRlcjo6fkNyYXNoUmVwb3J0ZXIoKSA9IGRlZmF1bHQ7CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBDcmFzaFJlcG9ydGVyOjpnZXREdW1wRGlyKCkgY29uc3QgeworICAgIHJldHVybiBtRHVtcERpcjsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIENyYXNoUmVwb3J0ZXI6OmdldERhdGFFeGNoYW5nZURpcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGFFeGNoYW5nZURpcjsKK30KKwordm9pZCBDcmFzaFJlcG9ydGVyOjpHZW5lcmF0ZUR1bXAoY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIHBhc3NEdW1wTWVzc2FnZShtZXNzYWdlKTsKKyAgICB3cml0ZUR1bXAoKTsKK30KKwordm9pZCBDcmFzaFJlcG9ydGVyOjpHZW5lcmF0ZUR1bXBBbmREaWUoY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIGFuZHJvaWRfbWV0cmljc19zdG9wKCk7CisgICAgcGFzc0R1bXBNZXNzYWdlKG1lc3NhZ2UpOworICAgIC8vIHRoaXMgaXMgdGhlIG1vc3QgY3Jvc3MtcGxhdGZvcm0gd2F5IG9mIGNyYXNoaW5nCisgICAgLy8gYW55IG90aGVyIEkga25vdyBhYm91dCBoYXMgaXRzIGZsb3dzOgorICAgIC8vICAtIGFib3J0KCkgaXNuJ3QgY2F1Z2h0IGJ5IEJyZWFrcGFkIG9uIFdpbmRvd3MKKyAgICAvLyAgLSBudWxsKCkgbWF5IHNjcmV3IHRoZSBjYWxsc3RhY2sKKyAgICAvLyAgLSBleHBsaWNpdCAqbnVsbCA9IDEgY2FuIGJlIG9wdGltaXplZCBvdXQKKyAgICAvLyAgLSByZXF1ZXN0aW5nIGR1bXAgYW5kIGV4aXRpbmcgbGF0ZXIgaGFzIGEgdmVyeSBub3RpY2FibGUgZGVsYXkgaW4KKyAgICAvLyAgICBiZXR3ZWVuLCBzbyBzb21lIHJlYWwgY3Jhc2ggY291bGQgc3RpY2sgaW4gdGhlIG1pZGRsZQorICAgIHZvbGF0aWxlIGludCogdm9sYXRpbGUgcHRyID0gbnVsbHB0cjsKKyAgICAqcHRyID0gMTMxMzsgIC8vIGRpZQorfQorCit2b2lkIENyYXNoUmVwb3J0ZXI6OlNldEV4aXRNb2RlKGNvbnN0IGNoYXIqIG1zZykgeworICAgIG1Jc0luRXhpdE1vZGUgPSB0cnVlOworICAgIC8vIFRoaXMgaXMgYSB0ZW1wb3JhcnkgcGF0Y2ggZml4IGZvciBhbiBpc3N1ZSB3aXRoIHRvbyBtYW55IGNyYXNoZXMgb24gZXhpdAorICAgIC8vIFN0b3AgdGhlIG1ldHJpY3MgcmVwb3J0ZXIgYXMgc29vbiBhcyB3ZSBzdGFydGVkIGV4aXRpbmcsIG5vdCBpbiB0aGUgbGFzdAorICAgIC8vIG1vbWVudC4KKyAgICAvLyBUT0RPOiBhZnRlciBleGl0IGNyYXNoZXMgYXJlIGZpeGVkLCBqdXN0IHJlcG9ydCB0aGUgJ2V4aXQgc3RhcnRlZCcgbWV0cmljCisgICAgLy8gIG1lc3NhZ2UgaGVyZS4KKyAgICAvLyBCdWc9aHR0cDovL2IuYW5kcm9pZC5jb20vMjAwNjY1CisgICAgYW5kcm9pZDo6bWV0cmljczo6TWV0cmljc1JlcG9ydGVyOjpnZXQoKS5yZXBvcnQoCisgICAgICAgICAgICAgICAgW10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpLT5zZXRfZXhpdF9zdGFydGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9zZXNzaW9uX3BoYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6RW11bGF0b3JEZXRhaWxzOjpFWElUX0dFTkVSQUwpOworICAgICAgICAgICAgICAgIH0pOworICAgIGFuZHJvaWRfbWV0cmljc19zdG9wKCk7CisgICAgYXR0YWNoRGF0YShrQ3Jhc2hPbkV4aXRGaWxlTmFtZSwgbXNnKTsKK30KKworYm9vbCBDcmFzaFJlcG9ydGVyOjppc0luRXhpdE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc0luRXhpdE1vZGU7Cit9CisKK3ZvaWQgQ3Jhc2hSZXBvcnRlcjo6cGFzc0R1bXBNZXNzYWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKKyAgICBhdHRhY2hEYXRhKGtEdW1wTWVzc2FnZUZpbGVOYW1lLCBtZXNzYWdlKTsKK30KKworLy8gQ29uc3RydWN0IHRoZSBmdWxsIG5hbWUgb2YgYSBmaWxlIHRvIHB1dCB0aGUgZGF0YSBmb3IgdGhlIGNyYXNoIHJlcG9ydGVyCisvLyBEb24ndCBhbGxvY2F0ZSEKK3RlbXBsYXRlIDxzaXplX3QgTj4KK3N0YXRpYyB2b2lkIGZvcm1hdERhdGFGaWxlTmFtZShjaGFyICgmYnVmZmVyKVtOXSwgU3RyaW5nVmlldyBiYXNlTmFtZSkgeworICAgIHN0YXRpY19hc3NlcnQoTiA+PSBQQVRIX01BWCwgIlRvbyBzbWFsbCBidWZmZXIgZm9yIGEgcGF0aCIpOworCisgICAgLy8gZG9uJ3QgZG8gYW55IGR5bmFtaWMgYWxsb2NhdGlvbiBoZXJlIC0gaXQgbWlnaHQgYmUgY2FsbGVkIGR1cmluZyBkdW1wCisgICAgLy8gd3JpdGluZywgZS5nLiBiZWNhdXNlIG9mIE9PTSBleGNlcHRpb24KKyAgICBtZW1zZXQoJmJ1ZmZlclswXSwgMCwgTik7CisgICAgc25wcmludGYoYnVmZmVyLCBOIC0gMSwKKyAgICAgICAgICAgICAiJXMlYyVzIiwKKyAgICAgICAgICAgICBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+Z2V0RGF0YUV4Y2hhbmdlRGlyKCkuY19zdHIoKSwKKyAgICAgICAgICAgICBTeXN0ZW06OmtEaXJTZXBhcmF0b3IsCisgICAgICAgICAgICAgKGJhc2VOYW1lLmVtcHR5KCkgPyAiYWRkaXRpb25hbF9kYXRhLnR4dCIgOiBiYXNlTmFtZS5jX3N0cigpKSk7Cit9CisKK3ZvaWQgQ3Jhc2hSZXBvcnRlcjo6YXR0YWNoRGF0YShTdHJpbmdWaWV3IG5hbWUsIFN0cmluZ1ZpZXcgZGF0YSwgYm9vbCByZXBsYWNlKSB7CisgICAgY29uc3QgaW50IGJ1ZmZlckxlbmd0aCA9IFBBVEhfTUFYICsgMTsKKyAgICBjaGFyIGZ1bGxOYW1lW2J1ZmZlckxlbmd0aF07CisgICAgZm9ybWF0RGF0YUZpbGVOYW1lKGZ1bGxOYW1lLCBuYW1lKTsKKworICAgIC8vIE9wZW4gdGhlIGNvbW11bmljYXRpb24gZmlsZSBpbiBhcHBlbmQgbW9kZSB0byBtYWtlIHN1cmUgd2Ugd29uJ3QKKyAgICAvLyBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIG1lc3NhZ2UgKGUuZy4gaWYgc2V2ZXJhbCB0aHJlYWRzIGFyZSB3cml0aW5nIGF0CisgICAgLy8gb25jZSkKKyNpZmRlZiBfV0lOMzIKKyAgICB3Y2hhcl90IHdpZGVGdWxsUGF0aFtidWZmZXJMZW5ndGhdID0ge307CisgICAgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0RnJvbVV0Zjgod2lkZUZ1bGxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsTmFtZSk7CisgICAgaW50IGZkID0gX3dvcGVuKHdpZGVGdWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgX09fV1JPTkxZIHwgX09fQ1JFQVQgfCBfT19OT0lOSEVSSVQgfCBfT19URVhUCisgICAgICAgICAgICAgICAgICAgIHwgKHJlcGxhY2UgPyBfT19UUlVOQyA6IF9PX0FQUEVORCksCisgICAgICAgICAgICAgICAgICAgIF9TX0lSRUFEIHwgX1NfSVdSSVRFKTsKKyNlbHNlCisgICAgaW50IGZkID0gSEFORExFX0VJTlRSKG9wZW4oZnVsbE5hbWUsCisgICAgICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0NMT0VYRUMKKyAgICAgICAgICAgICAgICAgIHwgKHJlcGxhY2UgPyBPX1RSVU5DIDogT19BUFBFTkQpLCAwNjQ0KSk7CisjZW5kaWYKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIFcoIkZhaWxlZCB0byBvcGVuIGEgdGVtcCBmaWxlICclcycgZm9yIHdyaXRpbmciLCBmdWxsTmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBIQU5ETEVfRUlOVFIod3JpdGUoZmQsIGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSkpOworICAgIEhBTkRMRV9FSU5UUih3cml0ZShmZCwgIlxuIiwgMSkpOworCisgICAgY2xvc2UoZmQpOworfQorCitib29sIENyYXNoUmVwb3J0ZXI6OmF0dGFjaEZpbGUoU3RyaW5nVmlldyBzb3VyY2VGdWxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IGRlc3RCYXNlTmFtZSkgeworICAgIGNoYXIgZnVsbE5hbWVbUEFUSF9NQVggKyAxXTsKKyAgICBmb3JtYXREYXRhRmlsZU5hbWUoZnVsbE5hbWUsIGRlc3RCYXNlTmFtZSk7CisKKyAgICByZXR1cm4gcGF0aF9jb3B5X2ZpbGUoZnVsbE5hbWUsIHNvdXJjZUZ1bGxOYW1lLmNfc3RyKCkpID49IDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaFVwdGltZSgpIHsKKyAgICBjb25zdCB1aW50NjRfdCB3YWxsQ2xvY2tUaW1lID0gU3lzdGVtOjpnZXQoKS0+Z2V0UHJvY2Vzc1RpbWVzKCkud2FsbENsb2NrTXM7CisKKyAgICAvLyBmb3JtYXQgdGhlIHRpbWUgaW50byBhIHN0cmluZyBidWZmZXIgKG5vIGFsbG9jYXRpb25zLCB3ZSd2ZSBqdXN0IGNyYXNoZWQpCisgICAgLy8gYW5kIHB1dCBpdCBib3RoIGludG8gdGhlIGZpbGUgYW5kIGludG8gdGhlIGZpbGUgbmFtZS4gVGhpcyB3YXkKKyAgICAvLyBpdCdzIG11Y2ggZWFzaWVyIHRvIHNlZSB0aGUgdGltZSBpbiB0aGUgY3Jhc2ggcmVwb3J0IHdpbmRvdworICAgIGNoYXIgdGltZVN0clszMl0gPSB7fTsKKyAgICBzbnByaW50Zih0aW1lU3RyLCBzaXplb2YodGltZVN0cikgLSAxLCAiJSIgUFJJdTY0ICJtcyIsIHdhbGxDbG9ja1RpbWUpOworCisgICAgY2hhciBmaWxlTmFtZVtzaXplb2YodGltZVN0cikgKyAxNl0gPSB7fTsKKyAgICBzbnByaW50ZihmaWxlTmFtZSwgc2l6ZW9mKGZpbGVOYW1lKSAtIDEsICJ1cHRpbWUtJXMudHh0IiwgdGltZVN0cik7CisKKyAgICBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoRGF0YShmaWxlTmFtZSwgdGltZVN0cik7Cit9CisKK2Jvb2wgQ3Jhc2hSZXBvcnRlcjo6b25DcmFzaCgpIHsKKyAgICAvLyBzdG9yZSB0aGUgdXB0aW1lIGZpcnN0IC0gYXMgQnJlYWtwYWQgZG9lc24ndCBkbyBpdCBzb21ldGltZXMKKyAgICBhdHRhY2hVcHRpbWUoKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2FsbGJhY2sgOiBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+bUNyYXNoQ2FsbGJhY2tzKSB7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgfQorCisgICAgcmV0dXJuIENyYXNoUmVwb3J0ZXI6OmdldCgpLT5vbkNyYXNoUGxhdGZvcm1TcGVjaWZpYygpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOwordXNpbmcgYW5kcm9pZDo6Y3Jhc2hyZXBvcnQ6OkNyYXNoU3lzdGVtOworCitleHRlcm4gIkMiIHsKKworYm9vbCBjcmFzaGhhbmRsZXJfaW5pdCgpIHsKKyAgICBpZiAoQ3Jhc2hTeXN0ZW06OkNyYXNoVHlwZTo6Q1JBU0hVUExPQUQgPT0gQ3Jhc2hTeXN0ZW06OkNyYXNoVHlwZTo6Tk9ORSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFDcmFzaFN5c3RlbTo6Z2V0KCktPnZhbGlkYXRlUGF0aHMoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ3Jhc2hTeXN0ZW06OkNyYXNoUGlwZSBjcmFzaHBpcGUoQ3Jhc2hTeXN0ZW06OmdldCgpLT5nZXRDcmFzaFBpcGUoKSk7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwcm9jaWRlbnQgPSBDcmFzaFN5c3RlbTo6Z2V0KCktPmdldFByb2Nlc3NJZCgpOworCisgICAgaWYgKHByb2NpZGVudC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWNyYXNocGlwZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWRsaW5lID0KKyAgICAgICAgICAgIENyYXNoU3lzdGVtOjpnZXQoKS0+Z2V0Q3Jhc2hTZXJ2aWNlQ21kTGluZShjcmFzaHBpcGUubVNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jaWRlbnQpOworCisgICAgaW50IHBpZCA9IENyYXNoU3lzdGVtOjpzcGF3blNlcnZpY2UoY21kbGluZSk7CisgICAgaWYgKHBpZCA+IDApIHsKKyAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6Z2V0KCktPnNldHVwQ2hpbGRDcmFzaFByb2Nlc3MocGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBXKCJDb3VsZCBub3Qgc3Bhd24gY3Jhc2ggc2VydmljZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUNyYXNoUmVwb3J0ZXI6OmdldCgpLT53YWl0U2VydmljZVBpcGVSZWFkeShjcmFzaHBpcGUubUNsaWVudCkpIHsKKyAgICAgICAgVygiQ3Jhc2ggc2VydmljZSBkaWQgbm90IHN0YXJ0XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoQ3Jhc2hIYW5kbGVyKGNyYXNocGlwZSk7Cit9CisKK3ZvaWQgY3Jhc2hoYW5kbGVyX2RpZShjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gcmVwb3J0ZXIgPSBDcmFzaFJlcG9ydGVyOjpnZXQoKSkgeworICAgICAgICByZXBvcnRlci0+R2VuZXJhdGVEdW1wQW5kRGllKG1lc3NhZ2UpOworICAgICAgICAvLyBjb252aW5jZSB0aGUgY29tcGlsZXIgYW5kIGV2ZXJ5b25lIGVsc2UgdGhhdCB3ZSB3aWxsIG5ldmVyIHJldHVybgorICAgICAgICBhYm9ydCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEkoIkVtdWxhdG9yOiBleGl0aW5nIGJlY2FzZSBvZiB0aGUgaW50ZXJuYWwgZXJyb3IgJyVzJ1xuIiwgbWVzc2FnZSk7CisgICAgICAgIF9leGl0KDEpOworICAgIH0KK30KKwordm9pZCBjcmFzaGhhbmRsZXJfZGllX2Zvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICAgIGNoYXIgbWVzc2FnZVsyMDQ4XSA9IHt9OworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgdnNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSAtIDEsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgY3Jhc2hoYW5kbGVyX2RpZShtZXNzYWdlKTsKK30KKwordm9pZCBjcmFzaGhhbmRsZXJfYWRkX3N0cmluZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBzdHJpbmcpIHsKKyAgICBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoRGF0YShuYW1lLCBzdHJpbmcpOworfQorCit2b2lkIGNyYXNoaGFuZGxlcl9leGl0bW9kZShjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgQ3Jhc2hSZXBvcnRlcjo6Z2V0KCktPlNldEV4aXRNb2RlKG1lc3NhZ2UpOworfQorCitib29sIGNyYXNoaGFuZGxlcl9jb3B5X2F0dGFjaG1lbnQoY29uc3QgY2hhciogZGVzdGluYXRpb24sIGNvbnN0IGNoYXIqIHNvdXJjZSkgeworICAgIHJldHVybiBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoRmlsZShzb3VyY2UsIGRlc3RpbmF0aW9uKTsKK30KKworfSAgLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl9kYXJ3aW4uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXJfZGFyd2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQwNmRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXJfZGFyd2luLmNwcApAQCAtMCwwICsxLDEzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiY2xpZW50L21hYy9oYW5kbGVyL2V4Y2VwdGlvbl9oYW5kbGVyLmgiCisKKyNpbmNsdWRlIDxtYWNoL21hY2guaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVyguLi4pIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSSguLi4pIHByaW50ZihfX1ZBX0FSR1NfXykKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNyYXNocmVwb3J0IHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgSG9zdENyYXNoUmVwb3J0ZXIgOiBwdWJsaWMgQ3Jhc2hSZXBvcnRlciB7CitwdWJsaWM6CisgICAgSG9zdENyYXNoUmVwb3J0ZXIoKSA6IENyYXNoUmVwb3J0ZXIoKSwgbUhhbmRsZXIoKSB7fQorCisgICAgdmlydHVhbCB+SG9zdENyYXNoUmVwb3J0ZXIoKSB7fQorCisgICAgYm9vbCBhdHRhY2hDcmFzaEhhbmRsZXIoY29uc3QgQ3Jhc2hTeXN0ZW06OkNyYXNoUGlwZSYgY3Jhc2hwaXBlKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtSGFuZGxlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUhhbmRsZXIucmVzZXQobmV3IGdvb2dsZV9icmVha3BhZDo6RXhjZXB0aW9uSGFuZGxlcigKKyAgICAgICAgICAgICAgICBnZXREdW1wRGlyKCksICZIb3N0Q3Jhc2hSZXBvcnRlcjo6ZXhjZXB0aW9uRmlsdGVyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIG5vIG1pbmlkdW1wIGNhbGxiYWNrCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIG5vIGNhbGxiYWNrIGNvbnRleHQKKyAgICAgICAgICAgICAgICB0cnVlLCAgICAgLy8gaW5zdGFsbCBzaWduYWwgaGFuZGxlcnMKKyAgICAgICAgICAgICAgICBjcmFzaHBpcGUubUNsaWVudC5jX3N0cigpKSk7CisKKyAgICAgICAgcmV0dXJuIG1IYW5kbGVyICE9IG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCB3YWl0U2VydmljZVBpcGVSZWFkeShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dF9tcykgb3ZlcnJpZGUgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGtXYWl0SW50ZXJ2YWxNUyA+IDAsICJrV2FpdEludGVydmFsTVMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpOworICAgICAgICBtYWNoX3BvcnRfdCB0YXNrX2Jvb3RzdHJhcF9wb3J0ID0gMDsKKyAgICAgICAgbWFjaF9wb3J0X3QgcG9ydDsKKyAgICAgICAgdGFza19nZXRfYm9vdHN0cmFwX3BvcnQobWFjaF90YXNrX3NlbGYoKSwgJnRhc2tfYm9vdHN0cmFwX3BvcnQpOworICAgICAgICBmb3IgKDsgdGltZW91dF9tcyA+IDA7IHRpbWVvdXRfbXMgLT0ga1dhaXRJbnRlcnZhbE1TKSB7CisgICAgICAgICAgICBpZiAoYm9vdHN0cmFwX2xvb2tfdXAodGFza19ib290c3RyYXBfcG9ydCwgcGlwZW5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydCkgPT0gS0VSTl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OlN5c3RlbTo6Z2V0KCktPnNsZWVwTXMoa1dhaXRJbnRlcnZhbE1TKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZXR1cENoaWxkQ3Jhc2hQcm9jZXNzKGludCBwaWQpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHdyaXRlRHVtcCgpIG92ZXJyaWRlIHsgbUhhbmRsZXItPldyaXRlTWluaWR1bXAoKTsgfQorCisgICBzdGF0aWMgYm9vbCBleGNlcHRpb25GaWx0ZXJDYWxsYmFjayh2b2lkKiBjb250ZXh0KTsKKworcHJpdmF0ZToKKyAgICBib29sIG9uQ3Jhc2hQbGF0Zm9ybVNwZWNpZmljKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Z29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyPiBtSGFuZGxlcjsKK307CisKKzo6YW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEhvc3RDcmFzaFJlcG9ydGVyPiBzQ3Jhc2hSZXBvcnRlciA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworYm9vbCBIb3N0Q3Jhc2hSZXBvcnRlcjo6ZXhjZXB0aW9uRmlsdGVyQ2FsbGJhY2sodm9pZCopIHsKKyAgICByZXR1cm4gQ3Jhc2hSZXBvcnRlcjo6Z2V0KCktPm9uQ3Jhc2goKTsKK30KKworc3RhdGljIHZvaWQgYXR0YWNoTWVtb3J5SW5mbygpCit7CisgICAgcnVzYWdlIHVzYWdlID0ge307CisgICAgZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmdXNhZ2UpOworCisgICAgbWFjaF90YXNrX2Jhc2ljX2luZm8gaW5mbyA9IHt9OworICAgIG1hY2hfbXNnX3R5cGVfbnVtYmVyX3QgaW5mb0NvdW50ID0gTUFDSF9UQVNLX0JBU0lDX0lORk9fQ09VTlQ7CisgICAgdGFza19pbmZvKG1hY2hfdGFza19zZWxmKCksIE1BQ0hfVEFTS19CQVNJQ19JTkZPLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0YXNrX2luZm9fdD4oJmluZm8pLCAmaW5mb0NvdW50KTsKKworICAgIGNoYXIgYnVmWzEwMjRdID0ge307CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsCisgICAgICAgICAgICAiPT09PSBQcm9jZXNzIG1lbW9yeSB1c2FnZSA9PT09XG4iCisgICAgICAgICAgICAibWF4IHJlc2lkZW50IHNpemUgPSAlIiBQUkl1NjQgIiBrQlxuIgorICAgICAgICAgICAgInZpcnR1YWwgc2l6ZSA9ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAicmVzaWRlbnQgc2l6ZSA9ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAibWVzc2FnZXMgc2VudCA9ICUiIFBSSXU2NCAiXG4iCisgICAgICAgICAgICAibWVzc2FnZXMgcmVjZWl2ZWQgPSAlIiBQUkl1NjQgIlxuIgorICAgICAgICAgICAgInZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzID0gJSIgUFJJdTY0ICJcbiIKKyAgICAgICAgICAgICJpbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzID0gJSIgUFJJdTY0ICJcbiIsCisgICAgICAgICAgICAgdWludDY0X3QoaW5mby5yZXNpZGVudF9zaXplX21heCAvIDEwMjQpLAorICAgICAgICAgICAgIHVpbnQ2NF90KGluZm8udmlydHVhbF9zaXplIC8gMTAyNCksCisgICAgICAgICAgICAgdWludDY0X3QoaW5mby5yZXNpZGVudF9zaXplIC8gMTAyNCksCisgICAgICAgICAgICAgdWludDY0X3QodXNhZ2UucnVfbXNnc25kKSwKKyAgICAgICAgICAgICB1aW50NjRfdCh1c2FnZS5ydV9tc2dyY3YpLAorICAgICAgICAgICAgIHVpbnQ2NF90KHVzYWdlLnJ1X252Y3N3KSwKKyAgICAgICAgICAgICB1aW50NjRfdCh1c2FnZS5ydV9uaXZjc3cpKTsKKworICAgIENyYXNoUmVwb3J0ZXI6OmdldCgpLT5hdHRhY2hEYXRhKAorICAgICAgICAgICAgICAgIENyYXNoUmVwb3J0ZXI6OmtQcm9jZXNzTWVtb3J5SW5mb0ZpbGVOYW1lLCBidWYpOworfQorCitib29sIEhvc3RDcmFzaFJlcG9ydGVyOjpvbkNyYXNoUGxhdGZvcm1TcGVjaWZpYygpIHsKKyAgICBhdHRhY2hNZW1vcnlJbmZvKCk7CisgICAgcmV0dXJuIHRydWU7ICAgIC8vIHByb2NlZWQgd2l0aCBoYW5kbGluZyB0aGUgY3Jhc2gKK30KKworfSAgLy8gbmFtZXNwYWNlIGFub255bW91cworCitDcmFzaFJlcG9ydGVyKiBDcmFzaFJlcG9ydGVyOjpnZXQoKSB7CisgICAgcmV0dXJuIHNDcmFzaFJlcG9ydGVyLnB0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl9saW51eC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl9saW51eC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4ZDE0MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyX2xpbnV4LmNwcApAQCAtMCwwICsxLDEwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImNsaWVudC9saW51eC9oYW5kbGVyL2V4Y2VwdGlvbl9oYW5kbGVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVyguLi4pIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSSguLi4pIHByaW50ZihfX1ZBX0FSR1NfXykKKworLy8gVGFrZW4gZnJvbSBicmVha3BhZCB0byBhbGxvdyBjaGlsZCBiYXNlZCBjcmFzaCBzZXJ2ZXIgb3V0IG9mIHByb2Nlc3MgY3Jhc2gKKy8vIGhhbmRsaW5nLiBTZWUgaHR0cHM6Ly9icmVha3BhZC5hcHBzcG90LmNvbS8xNjYwMDEvc2hvdworI2lmbmRlZiBQUl9TRVRfUFRSQUNFUgorI2RlZmluZSBQUl9TRVRfUFRSQUNFUiAweDU5NjE2ZDYxCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNyYXNocmVwb3J0IHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgSG9zdENyYXNoUmVwb3J0ZXIgOiBwdWJsaWMgQ3Jhc2hSZXBvcnRlciB7CitwdWJsaWM6CisgICAgSG9zdENyYXNoUmVwb3J0ZXIoKSA6IENyYXNoUmVwb3J0ZXIoKSwgbUhhbmRsZXIoKSB7fQorCisgICAgdmlydHVhbCB+SG9zdENyYXNoUmVwb3J0ZXIoKSB7fQorCisgICAgYm9vbCBhdHRhY2hDcmFzaEhhbmRsZXIoY29uc3QgQ3Jhc2hTeXN0ZW06OkNyYXNoUGlwZSYgY3Jhc2hwaXBlKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtSGFuZGxlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbUhhbmRsZXIucmVzZXQobmV3IGdvb2dsZV9icmVha3BhZDo6RXhjZXB0aW9uSGFuZGxlcigKKyAgICAgICAgICAgICAgICBnb29nbGVfYnJlYWtwYWQ6Ok1pbmlkdW1wRGVzY3JpcHRvcihnZXREdW1wRGlyKCkpLAorICAgICAgICAgICAgICAgICZIb3N0Q3Jhc2hSZXBvcnRlcjo6ZXhjZXB0aW9uRmlsdGVyQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSwgc3RkOjpzdG9pKGNyYXNocGlwZS5tQ2xpZW50KSkpOworCisgICAgICAgIHJldHVybiBtSGFuZGxlciAhPSBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgd2FpdFNlcnZpY2VQaXBlUmVhZHkoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVvdXRfbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdm9pZCBzZXR1cENoaWxkQ3Jhc2hQcm9jZXNzKGludCBwaWQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGFrZW4gZnJvbSBicmVha3BhZCB0byBhbGxvdyBjaGlsZCBiYXNlZCBjcmFzaCBzZXJ2ZXIgb3V0IG9mIHByb2Nlc3MKKyAgICAgICAgLy8gY3Jhc2ggaGFuZGxpbmcuIFNlZSBodHRwczovL2JyZWFrcGFkLmFwcHNwb3QuY29tLzE2NjAwMS9zaG93CisgICAgICAgIHN5c19wcmN0bChQUl9TRVRfUFRSQUNFUiwgcGlkLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlRHVtcCgpIG92ZXJyaWRlIHsgbUhhbmRsZXItPldyaXRlTWluaWR1bXAoKTsgfQorCisgICAgc3RhdGljIGJvb2wgZXhjZXB0aW9uRmlsdGVyQ2FsbGJhY2sodm9pZCogY29udGV4dCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBvbkNyYXNoUGxhdGZvcm1TcGVjaWZpYygpIG92ZXJyaWRlOworCisgICAgc3RkOjp1bmlxdWVfcHRyPGdvb2dsZV9icmVha3BhZDo6RXhjZXB0aW9uSGFuZGxlcj4gbUhhbmRsZXI7Cit9OworCis6OmFuZHJvaWQ6OmJhc2U6OkxhenlJbnN0YW5jZTxIb3N0Q3Jhc2hSZXBvcnRlcj4gc0NyYXNoUmVwb3J0ZXIgPQorICAgICAgICBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK2Jvb2wgSG9zdENyYXNoUmVwb3J0ZXI6OmV4Y2VwdGlvbkZpbHRlckNhbGxiYWNrKHZvaWQqKSB7CisgICAgcmV0dXJuIENyYXNoUmVwb3J0ZXI6OmdldCgpLT5vbkNyYXNoKCk7Cit9CisKK2Jvb2wgSG9zdENyYXNoUmVwb3J0ZXI6Om9uQ3Jhc2hQbGF0Zm9ybVNwZWNpZmljKCkgeworICAgIC8vIGNvbGxlY3QgdGhlIG1lbW9yeSB1c2FnZSBhdCB0aGUgdGltZSBvZiB0aGUgY3Jhc2gKKyAgICBjcmFzaGhhbmRsZXJfY29weV9hdHRhY2htZW50KAorICAgICAgICAgICAgICAgIENyYXNoUmVwb3J0ZXI6OmtQcm9jZXNzTWVtb3J5SW5mb0ZpbGVOYW1lLCAiL3Byb2Mvc2VsZi9zdGF0dXMiKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFub255bW91cworCitDcmFzaFJlcG9ydGVyKiBDcmFzaFJlcG9ydGVyOjpnZXQoKSB7CisgICAgcmV0dXJuIHNDcmFzaFJlcG9ydGVyLnB0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl93aW5kb3dzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyX3dpbmRvd3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTYzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlcl93aW5kb3dzLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJjbGllbnQvd2luZG93cy9oYW5kbGVyL2V4Y2VwdGlvbl9oYW5kbGVyLmgiCisKKyNpbmNsdWRlIDxwc2FwaS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBFKC4uLikgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSBXKC4uLikgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCituYW1lc3BhY2UgeworCitjbGFzcyBIb3N0Q3Jhc2hSZXBvcnRlciA6IHB1YmxpYyBDcmFzaFJlcG9ydGVyIHsKK3B1YmxpYzoKKyAgICBIb3N0Q3Jhc2hSZXBvcnRlcigpIDogQ3Jhc2hSZXBvcnRlcigpLCBtSGFuZGxlcigpIHt9CisKKyAgICB2aXJ0dWFsIH5Ib3N0Q3Jhc2hSZXBvcnRlcigpIHt9CisKKyAgICBib29sIGF0dGFjaENyYXNoSGFuZGxlcihjb25zdCBDcmFzaFN5c3RlbTo6Q3Jhc2hQaXBlJiBjcmFzaHBpcGUpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZyBkdW1wRGlyKGdldER1bXBEaXIoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldER1bXBEaXIoKS5sZW5ndGgoKSk7CisgICAgICAgIHN0ZDo6d3N0cmluZyBkdW1wRGlyX3dzdHIoZHVtcERpci5jX3N0cigpKTsKKworICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZyBjcmFzaFBpcGUoY3Jhc2hwaXBlLm1DbGllbnQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmFzaHBpcGUubUNsaWVudC5sZW5ndGgoKSk7CisKKyAgICAgICAgLy8gZ29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyIG1ha2VzIGEgbG9jYWwgY29weSBvZiBkdW1wRGlyIGFyZy4KKyAgICAgICAgLy8gY3Jhc2hQaXBlIGFyZyBpcyBjb3BpZWQgbG9jYWxseSBkdXJpbmcgRXhjZXB0aW9uSGFuZGxlcidzIGNvbnN0cnVjdGlvbgorICAgICAgICAvLyBvZiBDcmFzaEdlbmVyYXRpb25DbGllbnQuCisgICAgICAgIG1IYW5kbGVyLnJlc2V0KG5ldyBnb29nbGVfYnJlYWtwYWQ6OkV4Y2VwdGlvbkhhbmRsZXIoCisgICAgICAgICAgICAgICAgZHVtcERpcl93c3RyLCAmSG9zdENyYXNoUmVwb3J0ZXI6OmV4Y2VwdGlvbkZpbHRlckNhbGxiYWNrLAorICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgZ29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyOjpIQU5ETEVSX0FMTCwgTWluaUR1bXBOb3JtYWwsCisgICAgICAgICAgICAgICAgY3Jhc2hQaXBlLmNfc3RyKCksIG51bGxwdHIpKTsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGVyICE9IG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCB3YWl0U2VydmljZVBpcGVSZWFkeShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGltZW91dF9tcykgb3ZlcnJpZGUgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KGtXYWl0SW50ZXJ2YWxNUyA+IDAsICJrV2FpdEludGVydmFsTVMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpOworICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZyBwaXBlbmFtZV91bmljb2RlKHBpcGVuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZW5hbWUubGVuZ3RoKCkpOworICAgICAgICBmb3IgKDsgdGltZW91dF9tcyA+IDA7IHRpbWVvdXRfbXMgLT0ga1dhaXRJbnRlcnZhbE1TKSB7CisgICAgICAgICAgICBpZiAoV2FpdE5hbWVkUGlwZVcocGlwZW5hbWVfdW5pY29kZS5jX3N0cigpLCB0aW1lb3V0X21zKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9TRU1fVElNRU9VVCkgeworICAgICAgICAgICAgICAgIC8vIFBpcGUgZXhpc3RzIGJ1dCB0aW1lZCBvdXQgd2FpdGluZyB0byBiZWNvbWUgcmVhZHkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFBpcGUgZG9lcyBub3QgZXhpc3QgeWV0LCBzbGVlcCBhbmQgdHJ5IGFnYWluCisgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmdldCgpLT5zbGVlcE1zKGtXYWl0SW50ZXJ2YWxNUyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBzZXR1cENoaWxkQ3Jhc2hQcm9jZXNzKGludCBwaWQpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHdyaXRlRHVtcCgpIG92ZXJyaWRlIHsgbUhhbmRsZXItPldyaXRlTWluaWR1bXAoKTsgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBib29sIGV4Y2VwdGlvbkZpbHRlckNhbGxiYWNrKAorICAgICAgICB2b2lkKiwKKyAgICAgICAgRVhDRVBUSU9OX1BPSU5URVJTKiwKKyAgICAgICAgTURSYXdBc3NlcnRpb25JbmZvKik7CisKKyAgICBib29sIG9uQ3Jhc2hQbGF0Zm9ybVNwZWNpZmljKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Z29vZ2xlX2JyZWFrcGFkOjpFeGNlcHRpb25IYW5kbGVyPiBtSGFuZGxlcjsKK307CisKKzo6YW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEhvc3RDcmFzaFJlcG9ydGVyPiBzQ3Jhc2hSZXBvcnRlciA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworYm9vbCBIb3N0Q3Jhc2hSZXBvcnRlcjo6ZXhjZXB0aW9uRmlsdGVyQ2FsbGJhY2soCisgICAgdm9pZCosCisgICAgRVhDRVBUSU9OX1BPSU5URVJTKiwKKyAgICBNRFJhd0Fzc2VydGlvbkluZm8qKSB7CisgICAgcmV0dXJuIENyYXNoUmVwb3J0ZXI6OmdldCgpLT5vbkNyYXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaE1lbW9yeUluZm8oKQoreworICAgIFBST0NFU1NfTUVNT1JZX0NPVU5URVJTX0VYIG1lbUNvdW50ZXJzID0ge3NpemVvZihtZW1Db3VudGVycyl9OworICAgIGlmICg6OkdldFByb2Nlc3NNZW1vcnlJbmZvKDo6R2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBST0NFU1NfTUVNT1JZX0NPVU5URVJTKj4oJm1lbUNvdW50ZXJzKSwKKyAgICAgICAgICAgICAgICBzaXplb2YobWVtQ291bnRlcnMpKSkgeworICAgICAgICBjaGFyIGJ1ZlsxMDI0XSA9IHt9OworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwKKyAgICAgICAgICAgICJQYWdlRmF1bHRDb3VudDogJSIgUFJJdTY0ICJcbiIKKyAgICAgICAgICAgICJQZWFrV29ya2luZ1NldFNpemU6ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAiV29ya2luZ1NldFNpemU6ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAiUXVvdGFQZWFrUGFnZWRQb29sVXNhZ2U6ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAiUXVvdGFQYWdlZFBvb2xVc2FnZTogJSIgUFJJdTY0ICIga0JcbiIKKyAgICAgICAgICAgICJRdW90YVBlYWtOb25QYWdlZFBvb2xVc2FnZTogJSIgUFJJdTY0ICIga0JcbiIKKyAgICAgICAgICAgICJRdW90YU5vblBhZ2VkUG9vbFVzYWdlOiAlIiBQUkl1NjQgIiBrQlxuIgorICAgICAgICAgICAgIlBhZ2VmaWxlVXNhZ2UgKGNvbW1pdCk6ICUiIFBSSXU2NCAiIGtCXG4iCisgICAgICAgICAgICAiUGVha1BhZ2VmaWxlVXNhZ2U6ICUiIFBSSXU2NCAiIGtCXG4iLAorICAgICAgICAgICAgdWludDY0X3QobWVtQ291bnRlcnMuUGFnZUZhdWx0Q291bnQpLAorICAgICAgICAgICAgdWludDY0X3QobWVtQ291bnRlcnMuUGVha1dvcmtpbmdTZXRTaXplIC8gMTAyNCksCisgICAgICAgICAgICB1aW50NjRfdChtZW1Db3VudGVycy5Xb3JraW5nU2V0U2l6ZSAvIDEwMjQpLAorICAgICAgICAgICAgdWludDY0X3QobWVtQ291bnRlcnMuUXVvdGFQZWFrUGFnZWRQb29sVXNhZ2UgLyAxMDI0KSwKKyAgICAgICAgICAgIHVpbnQ2NF90KG1lbUNvdW50ZXJzLlF1b3RhUGFnZWRQb29sVXNhZ2UgLyAxMDI0KSwKKyAgICAgICAgICAgIHVpbnQ2NF90KG1lbUNvdW50ZXJzLlF1b3RhUGVha05vblBhZ2VkUG9vbFVzYWdlIC8gMTAyNCksCisgICAgICAgICAgICB1aW50NjRfdChtZW1Db3VudGVycy5RdW90YU5vblBhZ2VkUG9vbFVzYWdlIC8gMTAyNCksCisgICAgICAgICAgICB1aW50NjRfdCgobWVtQ291bnRlcnMuUGFnZWZpbGVVc2FnZQorICAgICAgICAgICAgICAgID8gbWVtQ291bnRlcnMuUGFnZWZpbGVVc2FnZQorICAgICAgICAgICAgICAgIDogbWVtQ291bnRlcnMuUHJpdmF0ZVVzYWdlKSAvIDEwMjQpLAorICAgICAgICAgICAgdWludDY0X3QobWVtQ291bnRlcnMuUGVha1BhZ2VmaWxlVXNhZ2UgLyAxMDI0KSk7CisKKyAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6Z2V0KCktPmF0dGFjaERhdGEoCisgICAgICAgICAgICAgICAgICAgIENyYXNoUmVwb3J0ZXI6OmtQcm9jZXNzTWVtb3J5SW5mb0ZpbGVOYW1lLCBidWYpOworICAgIH0KK30KKworYm9vbCBIb3N0Q3Jhc2hSZXBvcnRlcjo6b25DcmFzaFBsYXRmb3JtU3BlY2lmaWMoKSB7CisgICAgLy8gY29sbGVjdCB0aGUgbWVtb3J5IHVzYWdlIGF0IHRoZSB0aW1lIG9mIHRoZSBjcmFzaAorICAgIGF0dGFjaE1lbW9yeUluZm8oKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFub255bW91cworCitDcmFzaFJlcG9ydGVyKiBDcmFzaFJlcG9ydGVyOjpnZXQoKSB7CisgICAgcmV0dXJuIHNDcmFzaFJlcG9ydGVyLnB0cigpOworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1ODRkMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2UuaApAQCAtMCwwICsxLDIyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvcHJvY2Vzc19zdGF0ZS5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvYmFzaWNfc291cmNlX2xpbmVfcmVzb2x2ZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCisvLyBUaGUgU3VnZ2VzdGlvbiB0eXBlIHJlcHJlc2VudHMgcG9zc2libGUgc3VnZ2VzdGlvbnMKKy8vIHByZXNlbnRlZCB0byB0aGUgdXNlciB1cG9uCisvLyBhbmFseXppbmcgYSBjcmFzaCByZXBvcnQuCitlbnVtIGNsYXNzIFN1Z2dlc3Rpb24geworICAgIC8vIFRPRE86IEFkZCBtb3JlIHN1Z2dlc3Rpb24gdHlwZXMKKyAgICAvLyAoVXBkYXRlIE9TLCBHZXQgbW9yZSBSQU0sIGV0YykKKyAgICAvLyBhcyB3ZSBmaW5kIHRoZW0KKyAgICBVcGRhdGVHZnhEcml2ZXJzCit9OworCisvLyBDbGFzcyBVc2VyU3VnZ2VzdGlvbnMgcGFyc2VzIGFuZCBnZW5lcmF0ZXMgdXNlciBzdWdnZXN0aW9ucy4KKworY2xhc3MgVXNlclN1Z2dlc3Rpb25zIHsKK3B1YmxpYzoKKyAgICBzdGQ6OnNldDxTdWdnZXN0aW9uPiBzdWdnZXN0aW9uczsKKworICAgIFVzZXJTdWdnZXN0aW9ucyhnb29nbGVfYnJlYWtwYWQ6OlByb2Nlc3NTdGF0ZSogcHJvY2Vzc19zdGF0ZSk7Cit9OworCisvLyBDbGFzcyBDcmFzaFNlcnZpY2Ugd3JhcHMgQnJlYWtwYWQgcGxhdGZvcm0gc3BlY2lmaWMgY3Jhc2ggZ2VuZXJhdGlvbiBzZXJ2ZXIKKy8vCisvLyBVc2FnZToKKy8vICAgIEluc3RhbnRpYXRlIHdpdGggYSB2ZXJzaW9uIGFuZCBidWlsZCBudW1iZXIgdG8gYmUgdXNlZCBhcyBkZWZhdWx0IHJlcG9ydAorLy8gICAgdmVyc2lvbgorLy8KKy8vICAgIEZvciBtYW51YWwgcHJvY2Vzc2luZzoKKy8vICAgICAgICBzZXREdW1wRmlsZQorLy8gICAgT3RoZXJ3aXNlOgorLy8gICAgICAgIHN0YXJ0Q3Jhc2hTZXJ2ZXIKKy8vICAgICAgICB3YWl0Rm9yRHVtcEZpbGUKKy8vICAgICAgICBzdG9wQ3Jhc2hTZXJ2ZXIKKy8vCisvLyAgICBQcm9jZXNzIHRoZSBjcmFzaCBmb3IgZGV0YWlsczoKKy8vICAgICAgICBwcm9jZXNzQ3Jhc2gKKy8vCisvLyAgICBGaW5hbGx5LCB0byB1cGxvYWQgdGhlIGNyYXNoOgorLy8gICAgICAgIHVwbG9hZENyYXNoCisvLworLy8gICAgQWZ0ZXIgdXBsb2FkaW5nLCB0aGUgcmVwb3J0IGlkIGlzIHBvcHVsYXRlZDoKKy8vICAgICAgICBnZXRSZXBvcnRJZAorLy8KK2NsYXNzIENyYXNoU2VydmljZSB7CitwdWJsaWM6CisgICAgLy8gQ29udGV4dCBzdGF0ZSB1c2VkIGJ5IGJyZWFrcGFkIGNyYXNoIHNlcnZlciBkdW1wIHJlcXVlc3QgY2FsbGJhY2tzCisgICAgc3RydWN0IER1bXBSZXF1ZXN0Q29udGV4dCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aDsKKyAgICB9OworCisgICAgLy8gU2VydmVyIHN0YXRlIHVzZWQgYnkgYnJlYWtwYWQgY3Jhc2ggc2VydmVyIGNvbm5lY3QgLyBleGl0IGNhbGxiYWNrcworICAgIHN0cnVjdCBTZXJ2ZXJTdGF0ZSB7CisgICAgICAgIGJvb2wgd2FpdGluZzsKKyAgICAgICAgaW50IGNvbm5lY3RlZDsKKyAgICB9OworCisgICAgLy8gdmVyc2lvbiBhbmQgYnVpbGQgYXJncyB3aWxsIGJlIHVzZWQgdG8gY29uc3RydWN0IGJyZWFrcGFkIHZlcnNpb24KKyAgICAvLyBpZGVudGlmaWVyCisgICAgQ3Jhc2hTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVpbGQsCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGFEaXIpOworCisgICAgdmlydHVhbCB+Q3Jhc2hTZXJ2aWNlKCk7CisKKyAgICAvLyBTYXZlIGEgZHVtcGZpbGUgcGF0aAorICAgIHZvaWQgc2V0RHVtcEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGR1bXBmaWxlKTsKKworICAgIC8vIEdldCBzYXZlZCBkdW1wZmlsZSBwYXRoCisgICAgc3RkOjpzdHJpbmcgZ2V0RHVtcEZpbGUoKSBjb25zdDsKKworICAgIC8vIENoZWNrIGlmIHNhdmVkIGR1bXBmaWxlIHBhdGggaXMgdmFsaWQKKyAgICBib29sIHZhbGlkRHVtcEZpbGUoKSBjb25zdDsKKworICAgIC8vIFdhaXQgZm9yIGNsaWVudCB0byBjcmFzaGR1bXAgb3IgZXhpdCBvciB0aW1lb3V0IGluIG1zLiB8dGltZW91dHwgb2YgLTEKKyAgICAvLyBmb3Igbm8gdGltZW91dC4KKyAgICAvLyBSZXR1cm5zIC0xIGlmIHBhcmVudCBkaWVzIHVuZXhwZWN0ZWRseSBvciB0aW1lb3V0CisgICAgLy8gUmV0dXJuIG1zIHRpbWUgdGFrZW4gdG8gcmVjZWl2ZSBjcmFzaGR1bXAgb3RoZXJ3aXNlCisgICAgaW50NjRfdCB3YWl0Rm9yRHVtcEZpbGUoaW50IGNsaWVudHBpZCwgaW50IHRpbWVvdXRfbXMgPSAtMSk7CisKKyAgICAvLyBQbGF0Zm9ybSBzcGVjaWZpYyBzdGFydCBvZiB0aGUgY3Jhc2ggc2VydmVyCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBhbHJlYWR5IHN0YXJ0ZWQgb3Igbm90IHN1Y2Nlc3NmdWwKKyAgICB2aXJ0dWFsIGJvb2wgc3RhcnRDcmFzaFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZSkgPSAwOworCisgICAgLy8gUGxhdGZvcm0gc3BlY2lmaWMgc3RvcCBvZiB0aGUgY3Jhc2ggc2VydmVyCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBub3Qgc3RhcnRlZAorICAgIHZpcnR1YWwgYm9vbCBzdG9wQ3Jhc2hTZXJ2ZXIoKSA9IDA7CisKKyAgICBVc2VyU3VnZ2VzdGlvbnMgZ2V0U3VnZ2VzdGlvbnMoKTsKKworICAgIC8vIFByb2Nlc3NlcyB0aGUgc2F2ZWQgZHVtcGZpbGUgd2l0aCBicmVha3BhZCBwcm9jZXNzb3IgbGlicmFyaWVzCisgICAgLy8gQ29udGFpbnMgc3RhY2sgdHJhY2UgYW5kIGxvYWRlZCBtb2R1bGVzLgorICAgIC8vIElzIHBhcnNlZCBmb3Igc3VnZ2VzdGlvbnMgb24gZGVidWdnaW5nCisgICAgLy8gKGRyaXZlciB1cGRhdGUgZXRjKQorICAgIC8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKKyAgICBib29sIHByb2Nlc3NDcmFzaCgpOworCisgICAgLy8gQ29sbGVjdHMgc3lzdGVtIGluZm8sIHJlc3VsdGluZyBpbiB0aGUgImZ1bGwiIGR1bXAgZmlsZS4KKyAgICBib29sIGNvbGxlY3RTeXNJbmZvKCk7CisKKyAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgdHh0IGZpbGUgaW50byBzdHJpbmcKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgcmVhZEZpbGUoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBwYXRoKTsKKworICAgIC8vIFJldHVybiBzdHJpbmcgY29udGFpbmluZyBjb2xsZWN0U3lzSW5mbyByZXN1bHQKKyAgICBzdGQ6OnN0cmluZyBnZXRTeXNJbmZvKCk7CisKKyAgICAvLyBVcGxvYWRzIHRoZSBzYXZlZCBkdW1wZmlsZSB0byBzZXJ2ZXIgZGVmaW5lZCBieSBDcmFzaFN5c3RlbQorICAgIGJvb2wgdXBsb2FkQ3Jhc2goKTsKKworICAgIC8vIEdldCB0aGUgcHJvY2Vzc2VkIGNyYXNoIHJlcG9ydAorICAgIHN0ZDo6c3RyaW5nIGdldFJlcG9ydCgpOworCisgICAgLy8gR2V0IHRoZSBjcmFzaCByZXBvcnQgSUQgcmV0dXJuZWQgYnkgdGhlIGNyYXNoIHNlcnZlcnMKKyAgICBzdGQ6OnN0cmluZyBnZXRSZXBvcnRJZCgpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgZHVtcCBtZXNzYWdlIHBhc3NlZCBieSB0aGUgZW11bGF0b3IgKG9yIGVtcHR5IHN0cmluZyBpZgorICAgIC8vIHRoZXJlJ3Mgbm9uZSkKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RHVtcE1lc3NhZ2UoKSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q3Jhc2hPbkV4aXRNZXNzYWdlKCkgY29uc3Q7CisKKyAgICAvLyBUZWxscyB1cyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNyYXNoIHdhcyBhbiBleGl0IGNyYXNoLgorICAgIGJvb2wgZGlkQ3Jhc2hPbkV4aXQoKSBjb25zdDsKKworICAgIC8vIEZhY3RvcnkgbWV0aG9kCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDcmFzaFNlcnZpY2U+IG1ha2VDcmFzaFNlcnZpY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmVyc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBidWlsZCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGFEaXIpOworCisgICAgLy8gS2V5IHZhbHVlIHBhaXIgdG8gYmUgYWRkZWQgdG8gY3Jhc2ggcmVwb3J0CisgICAgdm9pZCBhZGRSZXBvcnRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgICAgLy8gS2V5IGZpbGVwYXRoIHBhaXIgdG8gYmUgYWRkZWQgdG8gY3Jhc2ggcmVwb3J0CisgICAgdm9pZCBhZGRSZXBvcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKKworICAgIC8vIFVzZXIgY29tbWVudHMgdG8gYmUgYWRkZWQgdG8gY3Jhc2ggcmVwb3J0CisgICAgdm9pZCBhZGRVc2VyQ29tbWVudHMoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRzKTsKKworICAgIC8vIFJlYWQgdGhlIGR1bXAgbWVzc2FnZSBwYXNzZWQgYnkgdGhlIHdhdGNoZWQvZHVtcGVkIGFwcGxpY2F0aW9uCisgICAgdm9pZCByZXRyaWV2ZUR1bXBNZXNzYWdlKCk7CisKKyAgICAvLyBDb2xsZWN0cyB0aGUgcHJvY2VzcyBsaXN0LCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJ1bnMgdGhlIFBPU0lYIHBzCisgICAgLy8gY29tbWFuZAorICAgIHZpcnR1YWwgdm9pZCBjb2xsZWN0UHJvY2Vzc0xpc3QoKTsKKworcHJvdGVjdGVkOgorICAgIC8vIEluaXRpYWxpemUgc2VydmVyc3RhdGUKKyAgICB2b2lkIGluaXRDcmFzaFNlcnZlcigpOworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldERhdGFEaXJlY3RvcnkoKSBjb25zdDsKKworICAgIC8vIFBsYXRmb3JtIHNwZWNpZmljIHNldCBpbnN0YW5jZSBjbGllbnQKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGludmFsaWQgcGlkCisgICAgdmlydHVhbCBib29sIHNldENsaWVudChpbnQgY2xpZW50cGlkKTsKKworICAgIC8vIFBsYXRmb3JtIHNwZWNpZmljIGNoZWNrIGlmIGluc3RhbmNlIGNsaWVudCBpcyBzdGlsbCBydW5uaW5nCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBjbGllbnQgbm90IHNldCBvciBub3QgcnVubmluZworICAgIHZpcnR1YWwgYm9vbCBpc0NsaWVudEFsaXZlKCkgPSAwOworCisgICAgLy8gVXBsb2FkcyBzeXN0ZW0tc3BlY2lmaWMgaGFyZHdhcmUgaW5mb3JtYXRpb24uCisgICAgdmlydHVhbCBib29sIGdldEhXSW5mbygpID0gMDsKKworICAgIC8vIFVwbG9hZHMgc3lzdGVtLXNwZWNpZmljIG1lbW9yeSBpbmZvcm1hdGlvbi4KKyAgICB2aXJ0dWFsIGJvb2wgZ2V0TWVtSW5mbygpID0gMDsKKworICAgIER1bXBSZXF1ZXN0Q29udGV4dCBtRHVtcFJlcXVlc3RDb250ZXh0OworICAgIFNlcnZlclN0YXRlIG1TZXJ2ZXJTdGF0ZTsKKworICAgIGludCBtQ2xpZW50UElEID0gMDsKKyAgICBzdGQ6OnN0cmluZyBtRGF0YURpcmVjdG9yeTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrSHdJbmZvTmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga01lbUluZm9OYW1lOworCitwcml2YXRlOgorICAgIENyYXNoU2VydmljZSgpOworCisgICAgLy8gUmVhZCB0aGUgZGF0YSBmaWxlcyBwYXNzZWQgYnkgdGhlIHdhdGNoZWQvZHVtcGVkIGFwcGxpY2F0aW9uCisgICAgdm9pZCBjb2xsZWN0RGF0YUZpbGVzKCk7CisKKyAgICBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKKyAgICBzdGQ6OnN0cmluZyBtQnVpbGQ7CisgICAgc3RkOjpzdHJpbmcgbVZlcnNpb25JZDsKKyAgICBzdGQ6OnN0cmluZyBtRHVtcEZpbGU7CisgICAgc3RkOjpzdHJpbmcgbVJlcG9ydElkOworICAgIHN0ZDo6c3RyaW5nIG1Db21tZW50czsKKyAgICBzdGQ6OnN0cmluZyBtRHVtcE1lc3NhZ2U7CisgICAgc3RkOjpzdHJpbmcgbUNyYXNoT25FeGl0TWVzc2FnZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1SZXBvcnRWYWx1ZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtUmVwb3J0RmlsZXM7CisgICAgZ29vZ2xlX2JyZWFrcGFkOjpQcm9jZXNzU3RhdGUgbVByb2Nlc3NTdGF0ZTsKKyAgICBnb29nbGVfYnJlYWtwYWQ6OkJhc2ljU291cmNlTGluZVJlc29sdmVyIG1MaW5lUmVzb2x2ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGdvb2dsZV9icmVha3BhZDo6TWluaWR1bXA+IG1NaW5pZHVtcDsKKworICAgIGJvb2wgbURpZENyYXNoT25FeGl0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9jb21tb24uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTZjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2NvbW1vbi5jcHAKQEAgLTAsMCArMSw1MzggQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZkZWYgX1dJTjMyCisvLyBUbyBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgdGhhdCBhc2tzIHRvIGluY2x1ZGUgdGhpcyBiZWZvcmUgPHdpbmRvd3MuaD4KKy8vIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IDxjdXJsL2N1cmwuaD4uIFRoaXMgbXVzdCBhcHBlYXIgYmVmb3JlIG90aGVyIGluY2x1ZGVzLgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX3dpbmRvd3MuaCIKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2Rhcndpbi5oIgorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfbGludXguaCIKKyNlbHNlCisjZXJyb3IgIlVuc3VwcG9ydGVkIHBsYXRmb3JtIgorI2VuZGlmCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3VybC1zdXBwb3J0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvZmFzdF9zb3VyY2VfbGluZV9yZXNvbHZlci5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvY2FsbF9zdGFjay5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvY29kZV9tb2R1bGUuaCIKKyNpbmNsdWRlICJnb29nbGVfYnJlYWtwYWQvcHJvY2Vzc29yL2NvZGVfbW9kdWxlcy5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3IvbWluaWR1bXAuaCIKKyNpbmNsdWRlICJnb29nbGVfYnJlYWtwYWQvcHJvY2Vzc29yL21pbmlkdW1wX3Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgImdvb2dsZV9icmVha3BhZC9wcm9jZXNzb3Ivc3RhY2tfZnJhbWVfY3B1LmgiCisjaW5jbHVkZSAicHJvY2Vzc29yL3N0YWNrd2Fsa19jb21tb24uaCIKKyNpbmNsdWRlICJwcm9jZXNzb3IvcGF0aG5hbWVfc3RyaXBwZXIuaCIKKworI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVyguLi4pIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSSguLi4pIHByaW50ZihfX1ZBX0FSR1NfXykKKworI2RlZmluZSBXQUlUX0lOVEVSVkFMX01TIDEwMAorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCitleHRlcm4gIkMiIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGFuZHJvaWRfZW11bGF0b3JfaWNvbl9maW5kKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogcHNpemUpOworCitjb25zdCBjaGFyIGtOYW1lS2V5W10gPSAicHJvZCI7Citjb25zdCBjaGFyIGtWZXJzaW9uS2V5W10gPSAidmVyIjsKK2NvbnN0IGNoYXIga05hbWVbXSA9ICJBbmRyb2lkRW11bGF0b3IiOworY29uc3QgY2hhciBrQ29tbWVudHNLZXlbXSA9ICJjb21tZW50cyI7CisKKy8vIENhbGxiYWNrIHRvIGdldCB0aGUgcmVzcG9uc2UgZGF0YSBmcm9tIHNlcnZlci4KK3N0YXRpYyBzaXplX3QgV3JpdGVDYWxsYmFjayh2b2lkKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIHZvaWQqIHVzZXJwKSB7CisgICAgaWYgKCF1c2VycCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBhdXRvJiByZXNwb25zZSA9ICpzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZyo+KHVzZXJwKTsKKyAgICBzaXplX3QgcmVhbF9zaXplID0gc2l6ZSAqIG5tZW1iOworICAgIHJlc3BvbnNlLmFwcGVuZChzdGF0aWNfY2FzdDxjaGFyKj4ocHRyKSwgcmVhbF9zaXplKTsKKyAgICByZXR1cm4gcmVhbF9zaXplOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCitjb25zdCBjaGFyKiBjb25zdCBDcmFzaFNlcnZpY2U6OmtId0luZm9OYW1lID0gImh3X2luZm8udHh0IjsKK2NvbnN0IGNoYXIqIGNvbnN0IENyYXNoU2VydmljZTo6a01lbUluZm9OYW1lID0gIm1lbV9pbmZvLnR4dCI7CisKK0NyYXNoU2VydmljZTo6Q3Jhc2hTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YURpcikKKyAgICA6IG1EdW1wUmVxdWVzdENvbnRleHQoKSwKKyAgICAgIG1TZXJ2ZXJTdGF0ZSgpLAorICAgICAgbURhdGFEaXJlY3RvcnkoZGF0YURpciA/IGRhdGFEaXIgOiAiIiksCisgICAgICBtVmVyc2lvbih2ZXJzaW9uKSwKKyAgICAgIG1CdWlsZChidWlsZCksCisgICAgICBtVmVyc2lvbklkKCksCisgICAgICBtRHVtcEZpbGUoKSwKKyAgICAgIG1SZXBvcnRJZCgpLAorICAgICAgbUNvbW1lbnRzKCksCisgICAgICBtRGlkQ3Jhc2hPbkV4aXQoZmFsc2UpIHsKKyAgICBtVmVyc2lvbklkID0gdmVyc2lvbjsKKyAgICBtVmVyc2lvbklkICs9ICItIjsKKyAgICBtVmVyc2lvbklkICs9IGJ1aWxkOworfTsKKworQ3Jhc2hTZXJ2aWNlOjp+Q3Jhc2hTZXJ2aWNlKCkgeworICAgIGlmICh2YWxpZER1bXBGaWxlKCkpIHsKKyAgICAgICAgcmVtb3ZlKG1EdW1wRmlsZS5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKCFtRGF0YURpcmVjdG9yeS5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gZmlsZXMgPSBTeXN0ZW06OmdldCgpLT5zY2FuRGlyRW50cmllcyhtRGF0YURpcmVjdG9yeSwgdHJ1ZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgcmVtb3ZlKGZpbGUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbW92ZShtRGF0YURpcmVjdG9yeS5jX3N0cigpKSA8IDApIHsKKyAgICAgICAgICAgIC8vIG9uIFdpbmRvd3Mgd2FpdGluZyBhIGJpdCB1c3VhbGx5IGhlbHBzCisgICAgICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKDEpOworICAgICAgICAgICAgcmVtb3ZlKG1EYXRhRGlyZWN0b3J5LmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENyYXNoU2VydmljZTo6c2V0RHVtcEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGR1bXBmaWxlKSB7CisgICAgbUR1bXBGaWxlID0gZHVtcGZpbGU7Cit9CisKK3N0ZDo6c3RyaW5nIENyYXNoU2VydmljZTo6Z2V0RHVtcEZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EdW1wRmlsZTsKK30KKworYm9vbCBDcmFzaFNlcnZpY2U6OnZhbGlkRHVtcEZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIDo6YW5kcm9pZDo6Y3Jhc2hyZXBvcnQ6OkNyYXNoU3lzdGVtOjpnZXQoKS0+aXNEdW1wKG1EdW1wRmlsZSk7Cit9CisKK3N0ZDo6c3RyaW5nIENyYXNoU2VydmljZTo6Z2V0UmVwb3J0KCkgeworICAgIC8vIENhcHR1cmUgcHJpbnRmJ3MgZnJvbSBQcmludFByb2Nlc3NTdGF0ZSB0byBmaWxlCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0RmlsZShtRHVtcEZpbGUpOworICAgIHJlcG9ydEZpbGUgKz0gInJlcG9ydCI7CisKKyAgICBGSUxFKiBmcCA9IGZvcGVuKHJlcG9ydEZpbGUuY19zdHIoKSwgIncrIik7CisgICAgaWYgKCFmcCkgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJtc2c7CisgICAgICAgIGVycm1zZyArPSAiRXJyb3IsIENvdWxkbid0IG9wZW4gIiArIHJlcG9ydEZpbGUgKworICAgICAgICAgICAgICAgICAgImZvciB3cml0aW5nIGNyYXNoIHJlcG9ydC4iOworICAgICAgICBlcnJtc2cgKz0gIlxuIjsKKyAgICAgICAgcmV0dXJuIGVycm1zZzsKKyAgICB9CisgICAgZ29vZ2xlX2JyZWFrcGFkOjpTZXRQcmludFN0cmVhbShmcCk7CisgICAgZ29vZ2xlX2JyZWFrcGFkOjpQcmludFByb2Nlc3NTdGF0ZShtUHJvY2Vzc1N0YXRlLCB0cnVlLCAmbUxpbmVSZXNvbHZlcik7CisKKyAgICBmcHJpbnRmKGZwLCAidGhyZWFkIHJlcXVlc3RlZD0lZFxuIiwgbVByb2Nlc3NTdGF0ZS5yZXF1ZXN0aW5nX3RocmVhZCgpKTsKKyAgICBmY2xvc2UoZnApOworCisgICAgc3RkOjpzdHJpbmcgcmVwb3J0KHJlYWRGaWxlKHJlcG9ydEZpbGUpKTsKKyAgICByZW1vdmUocmVwb3J0RmlsZS5jX3N0cigpKTsKKworICAgIHJldHVybiByZXBvcnQ7Cit9CisKK3N0ZDo6c3RyaW5nIENyYXNoU2VydmljZTo6Z2V0UmVwb3J0SWQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZXBvcnRJZDsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIENyYXNoU2VydmljZTo6Z2V0RHVtcE1lc3NhZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EdW1wTWVzc2FnZTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIENyYXNoU2VydmljZTo6Z2V0Q3Jhc2hPbkV4aXRNZXNzYWdlKCkgY29uc3QgeworICAgIHJldHVybiBtQ3Jhc2hPbkV4aXRNZXNzYWdlOworfQorCitib29sIENyYXNoU2VydmljZTo6ZGlkQ3Jhc2hPbkV4aXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EaWRDcmFzaE9uRXhpdDsKK30KKwordm9pZCBDcmFzaFNlcnZpY2U6OmFkZFJlcG9ydFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgICAgbVJlcG9ydFZhbHVlc1trZXldID0gdmFsdWU7Cit9CisKK3ZvaWQgQ3Jhc2hTZXJ2aWNlOjphZGRSZXBvcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIG1SZXBvcnRGaWxlc1trZXldID0gcGF0aDsKK30KKwordm9pZCBDcmFzaFNlcnZpY2U6OmFkZFVzZXJDb21tZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudHMpIHsKKyAgICBhZGRSZXBvcnRWYWx1ZShrQ29tbWVudHNLZXksIGNvbW1lbnRzKTsKK30KKworYm9vbCBDcmFzaFNlcnZpY2U6OnVwbG9hZENyYXNoKCkgeworICAgIGN1cmxfaW5pdCg6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFN5c3RlbTo6Z2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAtPmdldENhQnVuZGxlUGF0aCgpLmNfc3RyKCkpOworICAgIGNoYXIqIGVycm9yID0gbnVsbHB0cjsKKyAgICBDVVJMKiBjb25zdCBjdXJsID0gY3VybF9lYXN5X2RlZmF1bHRfaW5pdCgmZXJyb3IpOworICAgIGlmICghY3VybCkgeworICAgICAgICBFKCJDdXJsIGluc3RhbnRpYXRpb24gZmFpbGVkOiAlc1xuIiwgZXJyb3IpOworICAgICAgICA6OmZyZWUoZXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX1VSTCwKKyAgICAgICAgICAgICAgICAgICAgIENyYXNoU3lzdGVtOjpnZXQoKS0+Z2V0Q3Jhc2hVUkwoKS5jX3N0cigpKTsKKworICAgIGN1cmxfaHR0cHBvc3QqIGZvcm1wb3N0ID0gbnVsbHB0cjsKKyAgICBjdXJsX2h0dHBwb3N0KiBsYXN0cHRyID0gbnVsbHB0cjsKKworICAgIGFkZFJlcG9ydFZhbHVlKGtOYW1lS2V5LCBrTmFtZSk7CisgICAgYWRkUmVwb3J0VmFsdWUoa1ZlcnNpb25LZXksIG1WZXJzaW9uSWQpOworICAgIGFkZFJlcG9ydEZpbGUoInVwbG9hZF9maWxlX21pbmlkdW1wIiwgbUR1bXBGaWxlKTsKKworICAgIGZvciAoYXV0byBjb25zdCYgeCA6IG1SZXBvcnRWYWx1ZXMpIHsKKyAgICAgICAgY3VybF9mb3JtYWRkKCZmb3JtcG9zdCwgJmxhc3RwdHIsIENVUkxGT1JNX0NPUFlOQU1FLCB4LmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICBDVVJMRk9STV9DT1BZQ09OVEVOVFMsIHguc2Vjb25kLmNfc3RyKCksIENVUkxGT1JNX0VORCk7CisgICAgfQorCisgICAgZm9yIChhdXRvIGNvbnN0JiB4IDogbVJlcG9ydEZpbGVzKSB7CisgICAgICAgIGN1cmxfZm9ybWFkZCgmZm9ybXBvc3QsICZsYXN0cHRyLCBDVVJMRk9STV9DT1BZTkFNRSwgeC5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgQ1VSTEZPUk1fRklMRSwgeC5zZWNvbmQuY19zdHIoKSwgQ1VSTEZPUk1fRU5EKTsKKyAgICB9CisKKyAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfRkFJTE9ORVJST1IsIHRydWUpOworICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9IVFRQUE9TVCwgZm9ybXBvc3QpOworICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9XUklURUZVTkNUSU9OLCBXcml0ZUNhbGxiYWNrKTsKKworICAgIC8vIFRoZSA0dGggcG9pbnRlciB0byBiZSBwYXNzZWQgdG8gdGhlIFdSSVRFRlVOQ1RJT04gYWJvdmUKKyAgICBzdGQ6OnN0cmluZyBodHRwX3Jlc3BvbnNlX2RhdGE7CisgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX1dSSVRFREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqPigmaHR0cF9yZXNwb25zZV9kYXRhKSk7CisKKyAgICBib29sIHN1Y2Nlc3MgPSB0cnVlOworICAgIENVUkxjb2RlIGN1cmxSZXMgPSBjdXJsX2Vhc3lfcGVyZm9ybShjdXJsKTsKKworICAgIGlmIChjdXJsUmVzICE9IENVUkxFX09LKSB7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgRSgiY3VybF9lYXN5X3BlcmZvcm0oKSBmYWlsZWQgd2l0aCBjb2RlICVkICglcykiLCBjdXJsUmVzLAorICAgICAgICAgIGN1cmxfZWFzeV9zdHJlcnJvcihjdXJsUmVzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9uZyBodHRwX3Jlc3BvbnNlID0gMDsKKyAgICAgICAgY3VybFJlcyA9CisgICAgICAgICAgICAgICAgY3VybF9lYXN5X2dldGluZm8oY3VybCwgQ1VSTElORk9fUkVTUE9OU0VfQ09ERSwgJmh0dHBfcmVzcG9uc2UpOworICAgICAgICBpZiAoY3VybFJlcyA9PSBDVVJMRV9PSykgeworICAgICAgICAgICAgaWYgKGh0dHBfcmVzcG9uc2UgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgRSgiR290IEhUVFAgcmVzcG9uc2UgY29kZSAlbGQiLCBodHRwX3Jlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3VybFJlcyA9PSBDVVJMRV9VTktOT1dOX09QVElPTikgeworICAgICAgICAgICAgRSgiQ2FuIG5vdCBnZXQgYSB2YWxpZCByZXNwb25zZSBjb2RlOiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFKCJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIGNoZWNraW5nIGh0dHAgcmVzcG9uc2U6ICVzIiwKKyAgICAgICAgICAgICAgY3VybF9lYXN5X3N0cmVycm9yKGN1cmxSZXMpKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICBJKCJDcmFzaCBSZXBvcnQgSUQ6ICVzXG4iLCBodHRwX3Jlc3BvbnNlX2RhdGEuY19zdHIoKSk7CisgICAgICAgICAgICBtUmVwb3J0SWQgPSBodHRwX3Jlc3BvbnNlX2RhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJsX2Zvcm1mcmVlKGZvcm1wb3N0KTsKKyAgICBjdXJsX2Vhc3lfY2xlYW51cChjdXJsKTsKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworVXNlclN1Z2dlc3Rpb25zIENyYXNoU2VydmljZTo6Z2V0U3VnZ2VzdGlvbnMoKSB7CisgICAgcmV0dXJuIFVzZXJTdWdnZXN0aW9ucygmbVByb2Nlc3NTdGF0ZSk7Cit9CisKK2Jvb2wgQ3Jhc2hTZXJ2aWNlOjpwcm9jZXNzQ3Jhc2goKSB7CisgICAgbU1pbmlkdW1wLnJlc2V0KG5ldyBnb29nbGVfYnJlYWtwYWQ6Ok1pbmlkdW1wKG1EdW1wRmlsZSkpOworICAgIGdvb2dsZV9icmVha3BhZDo6TWluaWR1bXBQcm9jZXNzb3IgbWluaWR1bXBfcHJvY2Vzc29yKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lUmVzb2x2ZXIpOworCisgICAgLy8gUHJvY2VzcyB0aGUgbWluaWR1bXAuCisgICAgaWYgKCFtTWluaWR1bXAtPlJlYWQoKSkgeworICAgICAgICBFKCJNaW5pZHVtcCAlcyBjb3VsZCBub3QgYmUgcmVhZCIsIG1NaW5pZHVtcC0+cGF0aCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtaW5pZHVtcF9wcm9jZXNzb3IuUHJvY2VzcyhtTWluaWR1bXAuZ2V0KCksICZtUHJvY2Vzc1N0YXRlKSAhPQorICAgICAgICBnb29nbGVfYnJlYWtwYWQ6OlBST0NFU1NfT0spIHsKKyAgICAgICAgRSgiTWluaWR1bXBQcm9jZXNzb3I6OlByb2Nlc3MgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ3Jhc2hTZXJ2aWNlOjpjb2xsZWN0U3lzSW5mbygpIHsKKyAgICAvLyBBcyBsb25nIGFzIG9uZSBvZiB0aGVzZSBzdWNjZWVkIHdlIGNvbnNpZGVyIGl0IGEgc3VjY2VzcywgaXQncyBiZXR0ZXIgdG8KKyAgICAvLyB1cGxvYWQgYSBwYXJ0aWFsIHJlcG9ydCBpZiB3ZSBoYXZlIHNvbWV0aGluZy4KKyAgICBib29sIHN1Y2Nlc3MgPSBnZXRIV0luZm8oKTsKKyAgICBzdWNjZXNzIHw9IGdldE1lbUluZm8oKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYWxsIHRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gYXMgd2VsbCBhcyBhbnkgZGF0YSB0aGUKKyAgICAvLyBlbXVsYXRvciBwbGFjZWQgaW4gdGhlIGRhdGEgZGlyZWN0b3J5IHdlIGNhbiBjb2xsZWN0IHRoZSBmaWxlcyBhbmQgYWRkCisgICAgLy8gdGhlbSB0byB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgcmVwb3J0LgorICAgIGNvbGxlY3REYXRhRmlsZXMoKTsKKworICAgIHJldHVybiBzdWNjZXNzOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q3Jhc2hTZXJ2aWNlPiBDcmFzaFNlcnZpY2U6Om1ha2VDcmFzaFNlcnZpY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYnVpbGQsCisgICAgICAgIGNvbnN0IGNoYXIqIGRhdGFEaXIpIHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPENyYXNoU2VydmljZT4oCisgICAgICAgICAgICBuZXcgSG9zdENyYXNoU2VydmljZSh2ZXJzaW9uLCBidWlsZCwgZGF0YURpcikpOworfQorCitzdGQ6OnN0cmluZyBDcmFzaFNlcnZpY2U6OnJlYWRGaWxlKFN0cmluZ1ZpZXcgcGF0aCkgeworICAgIHN0ZDo6aWZzdHJlYW0gaXMocGF0aC5jX3N0cigpKTsKKworICAgIGlmICghaXMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJybXNnOworICAgICAgICBlcnJtc2cgPSBzdGQ6OnN0cmluZygiRXJyb3IsIENhbid0IG9wZW4gZmlsZSAiKSArIHBhdGguY19zdHIoKSArCisgICAgICAgICAgICAgICAgICIgZm9yIHJlYWRpbmcuIEVycm5vPSIgKyBzdGQ6OnRvX3N0cmluZyhlcnJubykgKyAiXG4iOworICAgICAgICByZXR1cm4gZXJybXNnOworICAgIH0KKworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBpcy5yZGJ1ZigpOworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgQ3Jhc2hTZXJ2aWNlOjpnZXRTeXNJbmZvKCkgeworICAgIGNvbnN0IGF1dG8gZmlsZXMgPSBTeXN0ZW06OmdldCgpLT5zY2FuRGlyRW50cmllcyhtRGF0YURpcmVjdG9yeSwgdHJ1ZSk7CisgICAgc3RkOjpzdHJpbmcgaW5mbzsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgLy8gQnkgY29udmVudGlvbiB3ZSBvbmx5IHNob3cgZmlsZXMgdGhhdCBlbmQgd2l0aCAudHh0LCBvdGhlciBmaWxlcworICAgICAgICAvLyBtYXkgaGF2ZSBiaW5hcnkgY29udGVudCB0aGF0IHdpbGwgbm90IGRpc3BsYXkgaW4gYSByZWFkYWJsZSB3YXkuCisgICAgICAgIGlmIChzdHJjYXNlY21wKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGUpLmNfc3RyKCksICIudHh0IikgPT0gMCkgeworICAgICAgICAgICAgLy8gUHJlcGVuZCBlYWNoIHBpZWNlIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUgYXMgYSBzZXBhcmF0b3IKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJhc2VuYW1lOworICAgICAgICAgICAgaWYgKFBhdGhVdGlsczo6c3BsaXQoZmlsZSwgbnVsbHB0ciwgJmJhc2VuYW1lKSkgeworICAgICAgICAgICAgICAgIGluZm8gKz0gIi0tLS0gIjsKKyAgICAgICAgICAgICAgICBpbmZvICs9IGJhc2VuYW1lLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgaW5mbyArPSAiIC0tLS1cbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmZvICs9IHJlYWRGaWxlKGZpbGUpOworICAgICAgICAgICAgaW5mbyArPSAiXG4iOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmZvOworfQorCit2b2lkIENyYXNoU2VydmljZTo6aW5pdENyYXNoU2VydmVyKCkgeworICAgIG1TZXJ2ZXJTdGF0ZS53YWl0aW5nID0gdHJ1ZTsKKyAgICBtU2VydmVyU3RhdGUuY29ubmVjdGVkID0gMDsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIENyYXNoU2VydmljZTo6Z2V0RGF0YURpcmVjdG9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbURhdGFEaXJlY3Rvcnk7Cit9CisKK2ludDY0X3QgQ3Jhc2hTZXJ2aWNlOjp3YWl0Rm9yRHVtcEZpbGUoaW50IGNsaWVudHBpZCwgaW50IHRpbWVvdXQpIHsKKyAgICBpbnQ2NF90IHdhaXRkdXJhdGlvbl9tcyA9IDA7CisgICAgaWYgKCFzZXRDbGllbnQoY2xpZW50cGlkKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghaXNDbGllbnRBbGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoKCFtU2VydmVyU3RhdGUud2FpdGluZykgJiYgKG1TZXJ2ZXJTdGF0ZS5jb25uZWN0ZWQgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRSgiQ3Jhc2hTZXJ2aWNlIGNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aW1lb3V0ID49IDAgJiYgd2FpdGR1cmF0aW9uX21zID49IHRpbWVvdXQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKFdBSVRfSU5URVJWQUxfTVMpOworICAgICAgICB3YWl0ZHVyYXRpb25fbXMgKz0gV0FJVF9JTlRFUlZBTF9NUzsKKyAgICB9CisgICAgaWYgKCFtRHVtcFJlcXVlc3RDb250ZXh0LmZpbGVfcGF0aC5lbXB0eSgpKSB7CisgICAgICAgIG1EdW1wRmlsZSA9IG1EdW1wUmVxdWVzdENvbnRleHQuZmlsZV9wYXRoOworICAgIH0KKyAgICByZXR1cm4gd2FpdGR1cmF0aW9uX21zOworfQorCitib29sIENyYXNoU2VydmljZTo6c2V0Q2xpZW50KGludCBjbGllbnRwaWQpIHsKKyAgICAvLyByZXR1cm4gZmFsc2UgZm9yIGludmFsaWQgcGlkCisgICAgaWYgKGNsaWVudHBpZCA8PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUNsaWVudFBJRCA9IGNsaWVudHBpZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDcmFzaFNlcnZpY2U6OmNvbGxlY3RQcm9jZXNzTGlzdCgpCit7CisgICAgaWYgKG1EYXRhRGlyZWN0b3J5LmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gY29tbWFuZCA9IFN0cmluZ0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzIGF1eCA+JXMvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YURpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6a1Byb2Nlc3NMaXN0RmlsZU5hbWUpOworICAgIHN5c3RlbShjb21tYW5kLmNfc3RyKCkpOworfQorCit2b2lkIENyYXNoU2VydmljZTo6cmV0cmlldmVEdW1wTWVzc2FnZSgpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gUGF0aFV0aWxzOjpqb2luKG1EYXRhRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6a0R1bXBNZXNzYWdlRmlsZU5hbWUpOworICAgIGlmIChTeXN0ZW06OmdldCgpLT5wYXRoSXNGaWxlKHBhdGgpKSB7CisgICAgICAgIC8vIHJlbWVtYmVyIHRoZSBkdW1wIG1lc3NhZ2UgdG8gc2hvdyBpdCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZQorICAgICAgICBtRHVtcE1lc3NhZ2UgPSByZWFkRmlsZShwYXRoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ3Jhc2hTZXJ2aWNlOjpjb2xsZWN0RGF0YUZpbGVzKCkgeworICAgIGlmIChtRGF0YURpcmVjdG9yeS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIGZpbGVzID0gU3lzdGVtOjpnZXQoKS0+c2NhbkRpckVudHJpZXMobURhdGFEaXJlY3RvcnkpOworICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgOiBmaWxlcykgeworICAgICAgICBjb25zdCBhdXRvIGZ1bGxOYW1lID0gUGF0aFV0aWxzOjpqb2luKG1EYXRhRGlyZWN0b3J5LCBuYW1lKTsKKyAgICAgICAgYWRkUmVwb3J0RmlsZShuYW1lLmNfc3RyKCksIGZ1bGxOYW1lLmNfc3RyKCkpOworICAgICAgICBpZiAobmFtZSA9PSBDcmFzaFJlcG9ydGVyOjprRHVtcE1lc3NhZ2VGaWxlTmFtZSkgeworICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGR1bXAgbWVzc2FnZSB0byBzaG93IGl0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lCisgICAgICAgICAgICBtRHVtcE1lc3NhZ2UgPSByZWFkRmlsZShmdWxsTmFtZSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSBDcmFzaFJlcG9ydGVyOjprQ3Jhc2hPbkV4aXRGaWxlTmFtZSkgeworICAgICAgICAgICAgLy8gcmVtZW1iZXIgdGhlIGR1bXAgbWVzc2FnZSB0byBzaG93IGl0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lCisgICAgICAgICAgICBtQ3Jhc2hPbkV4aXRNZXNzYWdlID0gcmVhZEZpbGUoZnVsbE5hbWUpOworICAgICAgICAgICAgbURpZENyYXNoT25FeGl0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gVGhpcyBpcyBhIGxpc3Qgb2YgYWxsIHN1YnN0cmluZ3MgdGhhdCBkZWZpbml0ZWx5IGJlbG9uZyB0byBzb21lIGdyYXBoaWNzCisvLyBkcml2ZXJzLgorLy8gTkI6IGFsbCBuYW1lcyBoYXZlIHRvIGJlIGxvd2VyLWNhc2UgLSB3ZSB0cmFuc2Zvcm0gdGhlIHN0cmluZyBmcm9tIHRoZSBzdGFjaworLy8gdHJhY2UgdG8gbG93ZSBjYXNlIGJlZm9yZSBkb2luZyB0aGUgY29tcGFyaXNvbnMKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGdmeF9kcml2ZXJzX2xjYXNlW10gPSB7CisgICAgLy8gTlZJRElBCisgICAgIm52Y3BsIiwgLy8gQ29udHJvbCBQYW5lbAorICAgICJudnNoZWxsIiwgLy8gRGVza3RvcCBFeHBsb3JlcgorICAgICJudmluaXQiLCAvLyBpbml0aWFsaXplcgorICAgICJudjRfZGlzcCIsIC8vIFdpbmRvd3MgMjAwMCAoISkgZGlzcGxheSBkcml2ZXIKKyAgICAibnZjb2QiLCAvLyBDb0luc3RhbGxlcgorICAgICJudmN1ZGEiLCAvLyBDdWRhCisgICAgIm52b3BlbmNsIiwgLy8gT3BlbkNMCisgICAgIm52Y3V2aWQiLCAvLyBWaWRlbyBkZWNvZGUKKyAgICAibnZvZ2wiLCAvLyBPcGVuR0wgKG1vZGVybikKKyAgICAiaWc0aWNkIiwgLy8gT3BlbkdMIChpY2Q/KQorICAgICJnZWZvcmNlZ2xkcml2ZXIiLCAvLyBPcGVuR0wgKG9sZCkKKyAgICAibnZkM2QiLCAvLyBEaXJlY3QzRAorICAgICJudndnZjIiLCAvLyBEM0QxMAorICAgICJudmR4IiwgLy8gRDNEIHNoaW0gZHJpdmVycworICAgICJudm1sIiwgLy8gbWFuYWdlbWVudCBsaWJyYXJ5CisgICAgIm52ZmJjIiwgLy8gZnJvbnQgYnVmZmVyIGNhcHR1cmUgbGlicmFyeQorICAgICJudmFwaSIsIC8vIE5WQVBJIExpYnJhcnkKKyAgICAibGlibnZpZGlhIiwgLy8gTlZJRElBIExpbnV4CisKKyAgICAvLyBBVEkKKyAgICAiYXRpb2dseHgiLCAvLyBPcGVuR0wKKyAgICAiYXRpZzZ0eHgiLCAvLyBPcGVuR0wKKyAgICAicjYwMCIsIC8vIFJhZGVvbiByNjAwIHNlcmllcworICAgICJhdGljZngiLCAvLyBEWDExCisgICAgImF0aXVtZCIsIC8vIEQzRAorICAgICJhdGlkeHgiLCAvLyAiVE1NIENvbSBDbG9uZSBDb250cm9sIE1vZHVsZSIgKD8/PykKKyAgICAiYXRpbXBlbmMiLCAvLyB2aWRlbyBlbmNvZGVyCisgICAgImF0aWdsIiwgLy8gYW5vdGhlciBBVEkgT3BlbkdMIGRyaXZlcgorCisgICAgLy8gSW50ZWwKKyAgICAiaTkxNSIsIC8vIEludGVsIGk5MTUgZ3B1CisgICAgImlnZCIsIC8vICdpZ2QnIHNlcmllcyBvZiBJbnRlbCBHUFUncworICAgICJpZ2wiLCAvLyA/CisgICAgImlnZngiLCAvLyA/CisgICAgImlnNzVpY2QiLCAvLyBJbnRlbCBpY2QKKyAgICAiaW50ZWxvY2wiLCAvLyBJbnRlbCBPcGVuQ0wKKworICAgIC8vIE90aGVycworICAgICJsaWJnbC4iLCAvLyBMb3ctbGV2ZWwgTGludXggT3BlbkdMCisgICAgIm9wZW5nbDMyLmRsbCIsIC8vIExvdy1sZXZlbCBXaW5kb3dzIE9wZW5HTAorfTsKKworc3RhdGljIGJvb2wgY29udGFpbnNHZnhQYXR0ZXJuKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBmb3IgKGNvbnN0IGNoYXIqIHBhdHRlcm4gOiBnZnhfZHJpdmVyc19sY2FzZSkgeworICAgICAgICBpZiAoc3RyLmZpbmQocGF0dGVybikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitVc2VyU3VnZ2VzdGlvbnM6OlVzZXJTdWdnZXN0aW9ucyhnb29nbGVfYnJlYWtwYWQ6OlByb2Nlc3NTdGF0ZSogcHJvY2Vzc19zdGF0ZSkgeworICAgIHN1Z2dlc3Rpb25zLmNsZWFyKCk7CisKKyAgICAvLyBHbyB0aHJvdWdoIGFsbCBmcmFtZXMgb2YgdGhlIHN0YWNrIG9mCisgICAgLy8gdGhlIHRocmVhZCByZXF1ZXN0aW5nIGR1bXAuCisKKyAgICBpbnQgY3Jhc2hlZF90aHJlYWRfaWQgPSBwcm9jZXNzX3N0YXRlLT5yZXF1ZXN0aW5nX3RocmVhZCgpOworICAgIGdvb2dsZV9icmVha3BhZDo6Q2FsbFN0YWNrKiBjcmFzaGVkX3N0YWNrID0KKyAgICAgICAgICAgIHByb2Nlc3Nfc3RhdGUtPnRocmVhZHMoKS0+YXQoY3Jhc2hlZF90aHJlYWRfaWQpOworICAgIGlmICghY3Jhc2hlZF9zdGFjaykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgaW50IGZyYW1lX2NvdW50ID0gY3Jhc2hlZF9zdGFjay0+ZnJhbWVzKCktPnNpemUoKTsKKyAgICBmb3IgKGludCBmcmFtZV9pbmRleCA9IDA7IGZyYW1lX2luZGV4IDwgZnJhbWVfY291bnQ7ICsrZnJhbWVfaW5kZXgpIHsKKyAgICAgICAgZ29vZ2xlX2JyZWFrcGFkOjpTdGFja0ZyYW1lKiBjb25zdCBmcmFtZSA9CisgICAgICAgICAgICAgICAgY3Jhc2hlZF9zdGFjay0+ZnJhbWVzKCktPmF0KGZyYW1lX2luZGV4KTsKKyAgICAgICAgaWYgKCFmcmFtZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgYXV0byYgbW9kdWxlID0gZnJhbWUtPm1vZHVsZTsKKworICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWxlID0gZ29vZ2xlX2JyZWFrcGFkOjpQYXRobmFtZVN0cmlwcGVyOjpGaWxlKAorICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmNvZGVfZmlsZSgpKTsKKyAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKGZpbGUuYmVnaW4oKSwgZmlsZS5lbmQoKSwgZmlsZS5iZWdpbigpLCA6OnRvbG93ZXIpOworCisgICAgICAgICAgICAvLyBTaG91bGQgdGhlIHVzZXIgdXBkYXRlIHRoZWlyIGdyYXBoaWNzIGRyaXZlcnM/CisgICAgICAgICAgICBpZiAoY29udGFpbnNHZnhQYXR0ZXJuKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMuaW5zZXJ0KFN1Z2dlc3Rpb246OlVwZGF0ZUdmeERyaXZlcnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2Rhcndpbi5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2Rhcndpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNWFjMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfZGFyd2luLmNwcApAQCAtMCwwICsxLDIyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9kYXJ3aW4uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPG1hY2gvdm1fc3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaF90eXBlcy5oPgorI2luY2x1ZGUgPG1hY2gvbWFjaF9pbml0Lmg+CisjaW5jbHVkZSA8bWFjaC9tYWNoX2hvc3QuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBFKC4uLikgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSBXKC4uLikgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEhXSU5GT19DTUQgInN5c3RlbV9wcm9maWxlciAtZGV0YWlsTGV2ZWwgbWluaSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlBhdGhVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCitIb3N0Q3Jhc2hTZXJ2aWNlOjp+SG9zdENyYXNoU2VydmljZSgpIHsKKyAgICBzdG9wQ3Jhc2hTZXJ2ZXIoKTsKK30KKwordm9pZCBIb3N0Q3Jhc2hTZXJ2aWNlOjpPbkNsaWVudER1bXBSZXF1ZXN0KAorICAgICAgICB2b2lkKiBjb250ZXh0LAorICAgICAgICBjb25zdCBnb29nbGVfYnJlYWtwYWQ6OkNsaWVudEluZm8mIGNsaWVudF9pbmZvLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKSB7CisgICAgaWYgKHN0YXRpY19jYXN0PENyYXNoU2VydmljZTo6RHVtcFJlcXVlc3RDb250ZXh0Kj4oY29udGV4dCkKKyAgICAgICAgICAgICAgICAtPmZpbGVfcGF0aC5lbXB0eSgpKSB7CisgICAgICAgIEQoIkNsaWVudCBSZXF1ZXN0aW5nIGR1bXAgJXNcbiIsIGZpbGVfcGF0aC5jX3N0cigpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Q3Jhc2hTZXJ2aWNlOjpEdW1wUmVxdWVzdENvbnRleHQqPihjb250ZXh0KS0+ZmlsZV9wYXRoID0KKyAgICAgICAgICAgICAgICBmaWxlX3BhdGg7CisgICAgfQorfQorCit2b2lkIEhvc3RDcmFzaFNlcnZpY2U6Ok9uQ2xpZW50RXhpdCgKKyAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgY29uc3QgZ29vZ2xlX2JyZWFrcGFkOjpDbGllbnRJbmZvJiBjbGllbnRfaW5mbykgeworICAgIEQoIkNsaWVudCBleGl0aW5nXG4iKTsKKyAgICBDcmFzaFNlcnZpY2U6OlNlcnZlclN0YXRlKiBzZXJ2ZXJzdGF0ZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDcmFzaFNlcnZpY2U6OlNlcnZlclN0YXRlKj4oY29udGV4dCk7CisgICAgaWYgKHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgPiAwKSB7CisgICAgICAgIHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgLT0gMTsKKyAgICB9CisgICAgaWYgKHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgPT0gMCkgeworICAgICAgICBzZXJ2ZXJzdGF0ZS0+d2FpdGluZyA9IGZhbHNlOworICAgIH0KK30KKworYm9vbCBIb3N0Q3Jhc2hTZXJ2aWNlOjpzdGFydENyYXNoU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlKSB7CisgICAgaWYgKG1DcmFzaFNlcnZlcikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGluaXRDcmFzaFNlcnZlcigpOworCisgICAgbUNyYXNoU2VydmVyLnJlc2V0KG5ldyA6Omdvb2dsZV9icmVha3BhZDo6Q3Jhc2hHZW5lcmF0aW9uU2VydmVyKAorICAgICAgICAgICAgcGlwZS5jX3N0cigpLCBudWxscHRyLCBudWxscHRyLCAmT25DbGllbnREdW1wUmVxdWVzdCwKKyAgICAgICAgICAgICZtRHVtcFJlcXVlc3RDb250ZXh0LCAmT25DbGllbnRFeGl0LCAmbVNlcnZlclN0YXRlLCB0cnVlLAorICAgICAgICAgICAgQ3Jhc2hTeXN0ZW06OmdldCgpLT5nZXRDcmFzaERpcmVjdG9yeSgpKSk7CisgICAgaWYgKCFtQ3Jhc2hTZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUNyYXNoU2VydmVyLT5TdGFydCgpOworfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OnN0b3BDcmFzaFNlcnZlcigpIHsKKyAgICBpZiAobUNyYXNoU2VydmVyKSB7CisgICAgICAgIG1DcmFzaFNlcnZlci5yZXNldCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OmlzQ2xpZW50QWxpdmUoKSB7CisgICAgaWYgKCFtQ2xpZW50UElEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gd2FpdHBpZCBhZGRlZCBmb3IgY2hpbGQgY2xpZW50cworICAgIHdhaXRwaWQobUNsaWVudFBJRCwgbnVsbHB0ciwgV05PSEFORyk7CisgICAgLy8ga2lsbCB3aXRoIDAgc2lnbmFsIHdpbGwgcmV0dXJuIG5vbiAwIGlmIHByb2Nlc3MgZG9lcyBub3QgZXhpc3QKKyAgICBpZiAoa2lsbChtQ2xpZW50UElELCAwKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6Z2V0SFdJbmZvKCkgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVfcGF0aCA9IFBhdGhVdGlsczo6am9pbihnZXREYXRhRGlyZWN0b3J5KCksIGtId0luZm9OYW1lKTsKKworICAgIHN0ZDo6c3RyaW5nIHN5c2NtZChIV0lORk9fQ01EKTsKKyAgICBzeXNjbWQgKz0gIiA+ICI7CisgICAgc3lzY21kICs9IGZpbGVfcGF0aDsKKyAgICBpbnQgc3RhdHVzID0gc3lzdGVtKHN5c2NtZC5jX3N0cigpKTsKKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGhhcmR3YXJlIGluZm8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY29udmVydCBhIHZhbHVlIHRvIGEgdmFsdWUgaW4ga2lsb2J5dGVzCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIFQgdG9LQihUIHZhbHVlKSB7CisgICAgcmV0dXJuIHZhbHVlIC8gMTAyNDsKK30KKworYm9vbCBIb3N0Q3Jhc2hTZXJ2aWNlOjpnZXRNZW1JbmZvKCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhX2RpcmVjdG9yeSA9IGdldERhdGFEaXJlY3RvcnkoKTsKKyAgICBpZiAoZGF0YV9kaXJlY3RvcnkuZW1wdHkoKSkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGRhdGEgZGlyZWN0b3J5IGZvciBjcmFzaCByZXBvcnQgYXR0YWNobWVudHMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWxlX3BhdGggPSBQYXRoVXRpbHM6OmpvaW4oZGF0YV9kaXJlY3RvcnksIGtNZW1JbmZvTmFtZSk7CisgICAgLy8gT3BlbiB0aGlzIGZpbGUgZWFybHkgc28gd2UgY2FuIHByaW50IGFueSBlcnJvcnMgaW50byBpdCwgd2UgbWlnaHQgbm90CisgICAgLy8gYmUgYWJsZSB0byBnZXQgYWxsIGRhdGEgYnV0IHdoYXRldmVyIHdlIGNhbiBnZXQgaXMgaW50ZXJlc3RpbmcgYW5kCisgICAgLy8ga25vd2luZyB3aGF0IGZhaWxlZCBjb3VsZCBhbHNvIGJlIHVzZWZ1bAorICAgIHN0ZDo6b2ZzdHJlYW0gZm91dChmaWxlX3BhdGguY19zdHIoKSk7CisgICAgaWYgKCFmb3V0KSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBvcGVuICclcycgZmlsZSBmb3Igd3JpdGluZyIsIGZpbGVfcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEdldCB0b3RhbCBwaHlzaWNhbCBtZW1vcnkgZnJvbSB0aGUgc3lzY3RsIHZhbHVlICJody5tZW1zaXplIgorICAgIHVpbnQ2NF90IHBoeXNpY2FsTWVtID0gMDsKKyAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihwaHlzaWNhbE1lbSk7CisgICAgaWYgKHN5c2N0bGJ5bmFtZSgiaHcubWVtc2l6ZSIsICZwaHlzaWNhbE1lbSwgJnNpemUsIG51bGxwdHIsIDApICE9IDApIHsKKyAgICAgICAgRSgiVW5hYmxlIHRvIGdldCBtZW1vcnkgc2l6ZSIpOworICAgICAgICBmb3V0IDw8ICJFUlJPUjogVW5hYmxlIHRvIGdldCBtZW1vcnkgc2l6ZTogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgIlxuIjsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgcGFnZSBzaXplLCB3ZSdyZSBnb2luZyB0byBuZWVkIGl0IGZvciBWTSBzdGF0cworICAgIG1hY2hfcG9ydF90IG1hY2hQb3J0ID0gbWFjaF9ob3N0X3NlbGYoKTsKKyAgICB2bV9zaXplX3QgcGFnZVNpemUgPSAwOworICAgIHZtX3N0YXRpc3RpY3M2NF9kYXRhX3Qgdm1TdGF0czsKKyAgICBtYWNoX21zZ190eXBlX251bWJlcl90IGNvdW50ID0gc2l6ZW9mKHZtU3RhdHMpIC8gc2l6ZW9mKGludGVnZXJfdCk7CisgICAga2Vybl9yZXR1cm5fdCByZXN1bHQgPSBob3N0X3BhZ2Vfc2l6ZShtYWNoUG9ydCwgJnBhZ2VTaXplKTsKKyAgICBpZiAocmVzdWx0ICE9IEtFUk5fU1VDQ0VTUykgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IHBhZ2Ugc2l6ZSIpOworICAgICAgICBmb3V0IDw8ICJFUlJPUjogVW5hYmxlIHRvIGdldCBwYWdlIHNpemU6ICIgPDwgcmVzdWx0IDw8ICJcbiI7CisgICAgfQorCisgICAgLy8gR2V0IGhvc3Qgc3RhdGlzdGljcyB3aGljaCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB1c2VkL2ZyZWUgbWVtCisgICAgcmVzdWx0ID0gaG9zdF9zdGF0aXN0aWNzNjQobWFjaFBvcnQsIEhPU1RfVk1fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGhvc3RfaW5mbzY0X3Q+KCZ2bVN0YXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpOworICAgIGlmIChyZXN1bHQgIT0gS0VSTl9TVUNDRVNTKSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBnZXQgaG9zdCBzdGF0aXN0aWNzIik7CisgICAgICAgIGZvdXQgPDwgIkVSUk9SOiBVbmFibGUgdG8gZ2V0IGhvc3Qgc3RhdGlzdGljczogIiA8PCByZXN1bHQgPDwgIlxuIjsKKyAgICB9CisgICAgdWludDY0X3QgZnJlZU1lbSA9IHZtU3RhdHMuZnJlZV9jb3VudCAqIHBhZ2VTaXplOworICAgIHVpbnQ2NF90IGFjdGl2ZU1lbSA9IHZtU3RhdHMuYWN0aXZlX2NvdW50ICogcGFnZVNpemU7CisgICAgdWludDY0X3QgaW5hY3RpdmVNZW0gPSB2bVN0YXRzLmluYWN0aXZlX2NvdW50ICogcGFnZVNpemU7CisgICAgdWludDY0X3Qgd2lyZWRNZW0gPSB2bVN0YXRzLndpcmVfY291bnQgKiBwYWdlU2l6ZTsKKworICAgIC8vIFRoZSBsYXJnZXN0IHBvc3NpYmxlIHN3YXAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYW1vdW50IG9mIHNwYWNlCisgICAgLy8gYXZhaWxhYmxlIG9uIHRoZSByb290IGZpbGVzeXN0ZW0uIFRoZSBEYXJ3aW4gc3dhcCBjYW4gZ3JvdyB0bworICAgIC8vIGNvbnN1bWUgYWxsIHRoYXQgc3BhY2UuCisgICAgc3RydWN0IHN0YXRmcyBzdGF0czsKKyAgICBpZiAoc3RhdGZzKCIvIiwgJnN0YXRzKSAhPSAwKSB7CisgICAgICAgIEUoIlVuYWxlIHRvIHN0YXQgcm9vdCBmaWxlc3lzdGVtIik7CisgICAgICAgIGZvdXQgPDwgIkVSUk9SOiBVbmFibGUgdG8gc3RhdCByb290IGZpbGVzeXN0ZW06ICIgPDwgc3RyZXJyb3IoZXJybm8pCisgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICB9CisgICAgdWludDY0X3QgbWF4U3dhcCA9IHN0YXRzLmZfYnNpemUgKiBzdGF0cy5mX2JmcmVlOworCisgICAgLy8gR2V0IHN3YXAgZGV0YWlscyB1c2luZyB0aGUgc3lzY3RsIHZhbHVlICJ2bS5zd2FwdXNhZ2UiLiBOb3RlIHRoYXQKKyAgICAvLyB0aGUgdG90YWwgc3dhcCByZXR1cm5lZCBoZXJlIGlzIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHN3YXAgZmlsZS4KKyAgICAvLyBUaGUgc3dhcCBmaWxlIGNhbiBncm93IGFzIG5lZWRlZCB1cCB0byB0aGUgcm9vdCBmaWxlc3lzdGVtIHNwYWNlCisgICAgeHN3X3VzYWdlIHZtVXNhZ2UgPSB7MH07CisgICAgc2l6ZSA9IHNpemVvZih2bVVzYWdlKTsKKyAgICBpZiAoc3lzY3RsYnluYW1lKCJ2bS5zd2FwdXNhZ2UiLCAmdm1Vc2FnZSwgJnNpemUsIG51bGxwdHIsIDApICE9IDApIHsKKyAgICAgICAgRSgiVW5hYmxlIHRvIGdldCBzd2FwIHVzYWdlIik7CisgICAgICAgIGZvdXQgPDwgIkVSUk9SOiBVbmFibGUgdG8gZ2V0IHN3YXAgdXNhZ2U6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8ICJcbiI7CisgICAgfQorCisgICAgZm91dCA8PCAiUGh5c2ljYWwgbWVtb3J5OiAiIDw8IHRvS0IocGh5c2ljYWxNZW0pIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJGcmVlIG1lbW9yeTogIiA8PCB0b0tCKGZyZWVNZW0pIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJBY3RpdmUgbWVtb3J5OiAiIDw8IHRvS0IoYWN0aXZlTWVtKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiSW5hY3RpdmUgbWVtb3J5OiAiIDw8IHRvS0IoaW5hY3RpdmVNZW0pIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJXaXJlZCBtZW1vcnk6ICIgPDwgdG9LQih3aXJlZE1lbSkgPDwgIiBrQlxuIgorICAgICAgICAgPDwgIk1heGltdW0gcG9zc2libGUgc3dhcDogIiA8PCB0b0tCKG1heFN3YXApIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJUb3RhbCBzd2FwOiAiIDw8IHRvS0Iodm1Vc2FnZS54c3VfdG90YWwpIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJBdmFpbGFibGUgc3dhcDogIiA8PCB0b0tCKHZtVXNhZ2UueHN1X2F2YWlsKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiVXNlZCBzd2FwOiAiIDw8IHRvS0Iodm1Vc2FnZS54c3VfdXNlZCkgPDwgIiBrQlxuIjsKKworICAgIHJldHVybiBmb3V0Lmdvb2QoKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2Rhcndpbi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9kYXJ3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE2MjVhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9kYXJ3aW4uaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZS5oIgorCisjaW5jbHVkZSAiY2xpZW50L21hYy9jcmFzaF9nZW5lcmF0aW9uL2NyYXNoX2dlbmVyYXRpb25fc2VydmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjcmFzaHJlcG9ydCB7CisKK2NsYXNzIEhvc3RDcmFzaFNlcnZpY2UgOiBwdWJsaWMgQ3Jhc2hTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbmhlcml0IENyYXNoU2VydmVyIGNvbnN0cnVjdG9yCisgICAgdXNpbmcgQ3Jhc2hTZXJ2aWNlOjpDcmFzaFNlcnZpY2U7CisKKyAgICB2aXJ0dWFsIH5Ib3N0Q3Jhc2hTZXJ2aWNlKCk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkNsaWVudER1bXBSZXF1ZXN0KAorICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgIGNvbnN0IGdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyYgY2xpZW50X2luZm8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9wYXRoKTsKKworICAgIHN0YXRpYyB2b2lkIE9uQ2xpZW50RXhpdCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnb29nbGVfYnJlYWtwYWQ6OkNsaWVudEluZm8mIGNsaWVudF9pbmZvKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdGFydENyYXNoU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYm9vbCBzdG9wQ3Jhc2hTZXJ2ZXIoKSBvdmVycmlkZSBmaW5hbDsKKworICAgIGJvb2wgaXNDbGllbnRBbGl2ZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCBnZXRIV0luZm8oKSBvdmVycmlkZTsKKyAgICBib29sIGdldE1lbUluZm8oKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Ojpnb29nbGVfYnJlYWtwYWQ6OkNyYXNoR2VuZXJhdGlvblNlcnZlcj4gbUNyYXNoU2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9saW51eC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2xpbnV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2NkYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9saW51eC5jcHAKQEAgLTAsMCArMSwxNDEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2VfbGludXguaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2RlZmluZSBFKC4uLikgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSBXKC4uLikgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIEhXSU5GT19DTUQgImxzaHciCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworbmFtZXNwYWNlIGNyYXNocmVwb3J0IHsKKworSG9zdENyYXNoU2VydmljZTo6fkhvc3RDcmFzaFNlcnZpY2UoKSB7CisgICAgc3RvcENyYXNoU2VydmVyKCk7Cit9CisKK3ZvaWQgSG9zdENyYXNoU2VydmljZTo6T25DbGllbnREdW1wUmVxdWVzdCgKKyAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgY29uc3QgOjpnb29nbGVfYnJlYWtwYWQ6OkNsaWVudEluZm8qIGNsaWVudF9pbmZvLAorICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nKiBmaWxlX3BhdGgpIHsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8Q3Jhc2hTZXJ2aWNlOjpEdW1wUmVxdWVzdENvbnRleHQqPihjb250ZXh0KQorICAgICAgICAgICAgICAgIC0+ZmlsZV9wYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgRCgiQ2xpZW50IFJlcXVlc3RpbmcgZHVtcCAlc1xuIiwgZmlsZV9wYXRoLT5jX3N0cigpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Q3Jhc2hTZXJ2aWNlOjpEdW1wUmVxdWVzdENvbnRleHQqPihjb250ZXh0KS0+ZmlsZV9wYXRoID0KKyAgICAgICAgICAgICAgICAqZmlsZV9wYXRoOworICAgIH0KK30KKwordm9pZCBIb3N0Q3Jhc2hTZXJ2aWNlOjpPbkNsaWVudEV4aXQoCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIGNvbnN0IDo6Z29vZ2xlX2JyZWFrcGFkOjpDbGllbnRJbmZvKiBjbGllbnRfaW5mbykgeworICAgIEQoIkNsaWVudCBleGl0aW5nXG4iKTsKKyAgICBDcmFzaFNlcnZpY2U6OlNlcnZlclN0YXRlKiBzZXJ2ZXJzdGF0ZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDcmFzaFNlcnZpY2U6OlNlcnZlclN0YXRlKj4oY29udGV4dCk7CisgICAgaWYgKHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgPiAwKSB7CisgICAgICAgIHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgLT0gMTsKKyAgICB9CisgICAgaWYgKHNlcnZlcnN0YXRlLT5jb25uZWN0ZWQgPT0gMCkgeworICAgICAgICBzZXJ2ZXJzdGF0ZS0+d2FpdGluZyA9IGZhbHNlOworICAgIH0KK30KKworYm9vbCBIb3N0Q3Jhc2hTZXJ2aWNlOjpzdGFydENyYXNoU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlKSB7CisgICAgY29uc3QgaW50IGxpc3Rlbl9mZCA9IHN0ZDo6c3RvaShwaXBlKTsKKyAgICBpZiAobUNyYXNoU2VydmVyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbml0Q3Jhc2hTZXJ2ZXIoKTsKKworICAgIG1DcmFzaFNlcnZlci5yZXNldChuZXcgOjpnb29nbGVfYnJlYWtwYWQ6OkNyYXNoR2VuZXJhdGlvblNlcnZlcigKKyAgICAgICAgICAgIGxpc3Rlbl9mZCwgT25DbGllbnREdW1wUmVxdWVzdCwgJm1EdW1wUmVxdWVzdENvbnRleHQsIE9uQ2xpZW50RXhpdCwKKyAgICAgICAgICAgICZtU2VydmVyU3RhdGUsIHRydWUsICZDcmFzaFN5c3RlbTo6Z2V0KCktPmdldENyYXNoRGlyZWN0b3J5KCkpKTsKKworICAgIHJldHVybiBtQ3Jhc2hTZXJ2ZXItPlN0YXJ0KCk7Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6c3RvcENyYXNoU2VydmVyKCkgeworICAgIGlmIChtQ3Jhc2hTZXJ2ZXIpIHsKKyAgICAgICAgbUNyYXNoU2VydmVyLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6aXNDbGllbnRBbGl2ZSgpIHsKKyAgICBpZiAoIW1DbGllbnRQSUQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIHdhaXRwaWQgZm9yIGNoaWxkIGNsaWVudHMKKyAgICB3YWl0cGlkKG1DbGllbnRQSUQsIG51bGxwdHIsIFdOT0hBTkcpOworICAgIC8vIGtpbGwgd2l0aCAwIHNpZ25hbCB3aWxsIHJldHVybiBub24gMCBpZiBwcm9jZXNzIGRvZXMgbm90IGV4aXN0CisgICAgaWYgKGtpbGwobUNsaWVudFBJRCwgMCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OmdldEhXSW5mbygpIHsKKyAgICBzdGQ6OnN0cmluZyBkYXRhX2RpcmVjdG9yeSA9IGdldERhdGFEaXJlY3RvcnkoKTsKKyAgICBpZiAoZGF0YV9kaXJlY3RvcnkuZW1wdHkoKSkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGRhdGEgZGlyZWN0b3J5IGZvciBjcmFzaCByZXBvcnQgYXR0YWNobWVudHMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWxlX3BhdGggPSBQYXRoVXRpbHM6OmpvaW4oZGF0YV9kaXJlY3RvcnksIGtId0luZm9OYW1lKTsKKworICAgIHN0ZDo6c3RyaW5nIHN5c2NtZChIV0lORk9fQ01EKTsKKyAgICBzeXNjbWQgKz0gIiA+ICI7CisgICAgc3lzY21kICs9IGZpbGVfcGF0aDsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlJ1bm5pbmcgJyVzJyB0byBnZXQgaGFyZHdhcmUgaW5mbyIsIHN5c2NtZC5jX3N0cigpKTsKKyAgICBpbnQgc3RhdHVzID0gc3lzdGVtKHN5c2NtZC5jX3N0cigpKTsKKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGhhcmR3YXJlIGluZm8gZm9yIGNyYXNoIHJlcG9ydCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OmdldE1lbUluZm8oKSB7CisgICAgLy8gL3Byb2MvbWVtaW5mbyBjb250YWlucyBhbGwgdGhlIGRldGFpbHMgd2UgbmVlZCBzbyBqdXN0IHVwbG9hZCB0aGF0CisgICAgc3RkOjpzdHJpbmcgZmlsZV9wYXRoID0gUGF0aFV0aWxzOjpqb2luKGdldERhdGFEaXJlY3RvcnkoKSwga01lbUluZm9OYW1lKTsKKyAgICByZXR1cm4gcGF0aF9jb3B5X2ZpbGUoZmlsZV9wYXRoLmNfc3RyKCksICIvcHJvYy9tZW1pbmZvIikgPT0gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9saW51eC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV9saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDkyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX2xpbnV4LmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvbGludXgvY3Jhc2hfZ2VuZXJhdGlvbi9jcmFzaF9nZW5lcmF0aW9uX3NlcnZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCitjbGFzcyBIb3N0Q3Jhc2hTZXJ2aWNlIDogcHVibGljIENyYXNoU2VydmljZSB7CitwdWJsaWM6CisgICAgLy8gSW5oZXJpdCBDcmFzaFNlcnZlciBjb25zdHJ1Y3RvcgorICAgIHVzaW5nIENyYXNoU2VydmljZTo6Q3Jhc2hTZXJ2aWNlOworCisgICAgdmlydHVhbCB+SG9zdENyYXNoU2VydmljZSgpOworCisgICAgc3RhdGljIHZvaWQgT25DbGllbnREdW1wUmVxdWVzdCgKKyAgICAgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICBjb25zdCA6Omdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyogY2xpZW50X2luZm8sCisgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nKiBmaWxlX3BhdGgpOworCisgICAgc3RhdGljIHZvaWQgT25DbGllbnRFeGl0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlX2JyZWFrcGFkOjpDbGllbnRJbmZvKiBjbGllbnRfaW5mbyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3RhcnRDcmFzaFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3RvcENyYXNoU2VydmVyKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDbGllbnRBbGl2ZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIGdldEhXSW5mbygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBnZXRNZW1JbmZvKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Ojpnb29nbGVfYnJlYWtwYWQ6OkNyYXNoR2VuZXJhdGlvblNlcnZlcj4gbUNyYXNoU2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODRkNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L3Rlc3RpbmcvVGVzdENyYXNoU3lzdGVtLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y3Jhc2hyZXBvcnQ7CisKK1RFU1QoQ3Jhc2hTZXJ2aWNlLCBnZXRfc2V0X2R1bXBmaWxlKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENyYXNoU2VydmljZT4gY3Jhc2goCisgICAgICAgICAgICBDcmFzaFNlcnZpY2U6Om1ha2VDcmFzaFNlcnZpY2UoImZvbyIsICJiYXIiLCBudWxscHRyKSk7CisgICAgc3RkOjpzdHJpbmcgcGF0aCgiL3Rlc3QvZm9vL2JhciIpOworICAgIGNyYXNoLT5zZXREdW1wRmlsZShwYXRoKTsKKyAgICBFWFBFQ1RfU1RSRVEoY3Jhc2gtPmdldER1bXBGaWxlKCkuY19zdHIoKSwgcGF0aC5jX3N0cigpKTsKK30KKworVEVTVChDcmFzaFNlcnZpY2UsIHZhbGlkRHVtcEZpbGUpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RzeXMoIi9sYXVuY2hkaXIiLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcyk7CisgICAgVGVzdFRlbXBEaXIqIHRlc3REaXIgPSB0ZXN0c3lzLmdldFRlbXBSb290KCk7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigiZm9vIik7CisgICAgdGVzdERpci0+bWFrZVN1YkZpbGUoImZvby9iYXIuZG1wIik7CisgICAgdGVzdERpci0+bWFrZVN1YkZpbGUoImZvby9iYXIuZG1wMiIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDcmFzaFNlcnZpY2U+IGNyYXNoKAorICAgICAgICAgICAgQ3Jhc2hTZXJ2aWNlOjptYWtlQ3Jhc2hTZXJ2aWNlKCJmb28iLCAiYmFyIiwgbnVsbHB0cikpOworICAgIHN0ZDo6c3RyaW5nIHBhdGg7CisKKyAgICBwYXRoID0gImZvby9iYXIuZG1wIjsKKyAgICBjcmFzaC0+c2V0RHVtcEZpbGUocGF0aCk7CisgICAgRVhQRUNUX1RSVUUoY3Jhc2gtPnZhbGlkRHVtcEZpbGUoKSk7CisKKyAgICBwYXRoID0gImZvby9iYXIyLmRtcCI7CisgICAgY3Jhc2gtPnNldER1bXBGaWxlKHBhdGgpOworICAgIEVYUEVDVF9GQUxTRShjcmFzaC0+dmFsaWREdW1wRmlsZSgpKTsKKworICAgIHBhdGggPSAiZm9vL2Jhci5kbXAyIjsKKyAgICBjcmFzaC0+c2V0RHVtcEZpbGUocGF0aCk7CisgICAgRVhQRUNUX0ZBTFNFKGNyYXNoLT52YWxpZER1bXBGaWxlKCkpOworfQorCisvLyBVbml0dGVzdCBsaW1pdGVkIHRvIGxpbnV4IGFzIHdpbmUgc2VlbXMgaW5jb21wYXRpYmxlLCBhbmQgbWFjIHNob3dzCisvLyBpbmNvbnNpc3RlbnQgcmVzdWx0cy4KKyNpZmRlZiBfX2xpbnV4X18KKworc3RhdGljIHN0ZDo6c3RyaW5nIGdldFRlc3RDcmFzaGVyKCkgeworICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpLmNfc3RyKCk7CisgICAgcGF0aCArPSBTeXN0ZW06OmtEaXJTZXBhcmF0b3I7CisgICAgcGF0aCArPSAiZW11bGF0b3IiOworICAgIGlmIChTeXN0ZW06OmdldCgpLT5nZXRQcm9ncmFtQml0bmVzcygpID09IDY0KSB7CisgICAgICAgIHBhdGggKz0gIjY0IjsKKyAgICB9CisgICAgcGF0aCArPSAiX3Rlc3RfY3Jhc2hlciI7CisjaWZkZWYgX1dJTjMyCisgICAgcGF0aCArPSAiLmV4ZSI7CisjZW5kaWYKKyAgICBFWFBFQ1RfVFJVRShTeXN0ZW06OmdldCgpLT5wYXRoSXNGaWxlKHBhdGgpKTsKKyAgICByZXR1cm4gcGF0aDsKK30KKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRUZXN0Q3Jhc2hlckNtZExpbmUoc3RkOjpzdHJpbmcgcGlwZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWRsaW5lID0ge2dldFRlc3RDcmFzaGVyKCksICItcGlwZSIsIHBpcGV9OworICAgIHJldHVybiBjbWRsaW5lOworfQorCisvLyBpbnZhbGlkVVJMVXBsb2FkIGhhbmdzIG9uIHdpbmUsIGJ1dCBwYXNzZXMgb24gd2luZG93cyBob3N0CitURVNUKENyYXNoU2VydmljZSwgaW52YWxpZFVSTFVwbG9hZCkgeworICAgIFRlc3RUZW1wRGlyIGNyYXNoZGlyKCJjcmFzaGRpciIpOworICAgIFRlc3RDcmFzaFN5c3RlbSBjcmFzaHN5c3RlbShjcmFzaGRpci5wYXRoKCksICJub24tZXhpc3RlbnQtZG9tYWluLW5hbWUtZm9yLWNyYXNoLXJlcG9ydHMuY29tIik7CisgICAgY3Jhc2hkaXIubWFrZVN1YkZpbGUoImJhci5kbXAiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3Jhc2hTZXJ2aWNlPiBjcmFzaCgKKyAgICAgICAgICAgIENyYXNoU2VydmljZTo6bWFrZUNyYXNoU2VydmljZSgiZm9vIiwgImJhciIsIG51bGxwdHIpKTsKKyAgICBjcmFzaC0+c2V0RHVtcEZpbGUoY3Jhc2hkaXIubWFrZVN1YlBhdGgoImJhci5kbXAiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY3Jhc2gtPnVwbG9hZENyYXNoKCkpOworfQorCisvLyBDcmFzaGluZyBiaW5hcnkgZG9lc24ndCB3b3JrIHdlbGwgaW4gV2luZQorLy8gRmFpbHMgaW50ZXJtaXR0ZW50bHkgb24gbWFjIGJ1aWxkIHN5c3RlbXMKK1RFU1QoQ3Jhc2hTZXJ2aWNlLCBzdGFydEF0dGFjaFdhaXRDcmFzaCkgeworICAgIFRlc3RUZW1wRGlyIGNyYXNoZGlyKCJjcmFzaGRpciIpOworICAgIFRlc3RDcmFzaFN5c3RlbSBjcmFzaHN5c3RlbShjcmFzaGRpci5wYXRoKCksICJsb2NhbGhvc3QiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3Jhc2hTZXJ2aWNlPiBjcmFzaCgKKyAgICAgICAgICAgIENyYXNoU2VydmljZTo6bWFrZUNyYXNoU2VydmljZSgiZm9vIiwgImJhciIsIG51bGxwdHIpKTsKKyAgICBDcmFzaFN5c3RlbTo6Q3Jhc2hQaXBlIGNyYXNocGlwZSA9IENyYXNoU3lzdGVtOjpnZXQoKS0+Z2V0Q3Jhc2hQaXBlKCk7CisgICAgRVhQRUNUX1RSVUUoY3Jhc2hwaXBlLmlzVmFsaWQoKSk7CisgICAgY3Jhc2gtPnN0YXJ0Q3Jhc2hTZXJ2ZXIoY3Jhc2hwaXBlLm1TZXJ2ZXIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWRsaW5lID0gZ2V0VGVzdENyYXNoZXJDbWRMaW5lKGNyYXNocGlwZS5tQ2xpZW50KTsKKworICAgIGludCBwaWQgPSBDcmFzaFN5c3RlbTo6c3Bhd25TZXJ2aWNlKGNtZGxpbmUpOworICAgIEVYUEVDVF9HVChwaWQsIDApOworICAgIGludDY0X3Qgd2FpdGR1cmF0aW9uID0gY3Jhc2gtPndhaXRGb3JEdW1wRmlsZShwaWQsIDEwMDAwKTsKKyAgICBFWFBFQ1RfTkUod2FpdGR1cmF0aW9uLCAtMSk7CisgICAgRVhQRUNUX1RSVUUoQ3Jhc2hTeXN0ZW06OmlzRHVtcChjcmFzaC0+Z2V0RHVtcEZpbGUoKSkpOworICAgIGNyYXNoLT5wcm9jZXNzQ3Jhc2goKTsKKyAgICBzdGQ6OnN0cmluZyBkZXRhaWxzID0gY3Jhc2gtPmdldFJlcG9ydCgpOworICAgIEVYUEVDVF9ORShkZXRhaWxzLmZpbmQoIkNyYXNoIHJlYXNvbjoiKSwgc3RkOjpzdHJpbmc6Om5wb3MpOworICAgIEVYUEVDVF9ORShkZXRhaWxzLmZpbmQoIlRocmVhZCAwIiksIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgICBFWFBFQ1RfTkUoZGV0YWlscy5maW5kKCJMb2FkZWQgbW9kdWxlczoiKSwgc3RkOjpzdHJpbmc6Om5wb3MpOworfQorCitURVNUKENyYXNoU2VydmljZSwgc3RhcnRBdHRhY2hXYWl0Tm9DcmFzaCkgeworICAgIFRlc3RUZW1wRGlyIGNyYXNoZGlyKCJjcmFzaGRpciIpOworICAgIFRlc3RDcmFzaFN5c3RlbSBjcmFzaHN5c3RlbShjcmFzaGRpci5wYXRoKCksICJsb2NhbGhvc3QiKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q3Jhc2hTZXJ2aWNlPiBjcmFzaCgKKyAgICAgICAgICAgIENyYXNoU2VydmljZTo6bWFrZUNyYXNoU2VydmljZSgiZm9vIiwgImJhciIsIG51bGxwdHIpKTsKKyAgICBDcmFzaFN5c3RlbTo6Q3Jhc2hQaXBlIGNyYXNocGlwZSA9IENyYXNoU3lzdGVtOjpnZXQoKS0+Z2V0Q3Jhc2hQaXBlKCk7CisgICAgRVhQRUNUX1RSVUUoY3Jhc2hwaXBlLmlzVmFsaWQoKSk7CisgICAgY3Jhc2gtPnN0YXJ0Q3Jhc2hTZXJ2ZXIoY3Jhc2hwaXBlLm1TZXJ2ZXIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWRsaW5lID0gZ2V0VGVzdENyYXNoZXJDbWRMaW5lKGNyYXNocGlwZS5tQ2xpZW50KTsKKyAgICBjbWRsaW5lLnB1c2hfYmFjayhTdHJpbmdWaWV3KCItbm9jcmFzaCIpKTsKKyAgICBpbnQgcGlkID0gQ3Jhc2hTeXN0ZW06OnNwYXduU2VydmljZShjbWRsaW5lKTsKKyAgICBFWFBFQ1RfR1QocGlkLCAwKTsKKyAgICBpbnQ2NF90IHdhaXRkdXJhdGlvbiA9IGNyYXNoLT53YWl0Rm9yRHVtcEZpbGUocGlkLCAxMDAwMCk7CisgICAgRVhQRUNUX0VRKHdhaXRkdXJhdGlvbiwgLTEpOworfQorCitURVNUKENyYXNoU2VydmljZSwgc3RhcnRXYWl0Tm9BdHRhY2gpIHsKKyAgICBUZXN0VGVtcERpciBjcmFzaGRpcigiY3Jhc2hkaXIiKTsKKyAgICBUZXN0Q3Jhc2hTeXN0ZW0gY3Jhc2hzeXN0ZW0oY3Jhc2hkaXIucGF0aCgpLCAibG9jYWxob3N0Iik7CisgICAgc3RkOjp1bmlxdWVfcHRyPENyYXNoU2VydmljZT4gY3Jhc2goCisgICAgICAgICAgICBDcmFzaFNlcnZpY2U6Om1ha2VDcmFzaFNlcnZpY2UoImZvbyIsICJiYXIiLCBudWxscHRyKSk7CisgICAgQ3Jhc2hTeXN0ZW06OkNyYXNoUGlwZSBjcmFzaHBpcGUgPSBDcmFzaFN5c3RlbTo6Z2V0KCktPmdldENyYXNoUGlwZSgpOworICAgIEVYUEVDVF9UUlVFKGNyYXNocGlwZS5pc1ZhbGlkKCkpOworICAgIGNyYXNoLT5zdGFydENyYXNoU2VydmVyKGNyYXNocGlwZS5tU2VydmVyKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY21kbGluZSA9IGdldFRlc3RDcmFzaGVyQ21kTGluZShjcmFzaHBpcGUubUNsaWVudCk7CisgICAgY21kbGluZS5wdXNoX2JhY2soU3RyaW5nVmlldygiLW5vYXR0YWNoIikpOworICAgIGludCBwaWQgPSBDcmFzaFN5c3RlbTo6c3Bhd25TZXJ2aWNlKGNtZGxpbmUpOworICAgIEVYUEVDVF9HVChwaWQsIDApOworICAgIGludDY0X3Qgd2FpdGR1cmF0aW9uID0gY3Jhc2gtPndhaXRGb3JEdW1wRmlsZShwaWQsIDEpOworICAgIEVYUEVDVF9FUSh3YWl0ZHVyYXRpb24sIC0xKTsKK30KKworLy8gVGVzdCBmYWlscyByZWd1bGFybHkgb24gb25lIG9mIHRoZSBsaW51eCBidWlsZCBtYWNoaW5lcworLy8gZmFpbHVyZSBoYXBwZW5zIHdoZW4gd2FpdEZvckR1bXBGaWxlIHRpbWVzIG91dCBpbnN0ZWFkIG9mCisvLyBmaW5kaW5nIGEgY3Jhc2gKKy8vVEVTVChDcmFzaFNlcnZpY2UsIHN0YXJ0QXR0YWNoV2FpdFRpbWVvdXQpIHsKKy8vICAgIFRlc3RUZW1wRGlyIGNyYXNoZGlyKCJjcmFzaGRpciIpOworLy8gICAgVGVzdENyYXNoU3lzdGVtIGNyYXNoc3lzdGVtKGNyYXNoZGlyLnBhdGgoKSwgImxvY2FsaG9zdCIpOworLy8gICAgc3RkOjp1bmlxdWVfcHRyPENyYXNoU2VydmljZT4gY3Jhc2goCisvLyAgICAgICAgICAgIENyYXNoU2VydmljZTo6bWFrZUNyYXNoU2VydmljZSgiZm9vIiwgImJhciIsIG51bGxwdHIpKTsKKy8vICAgIENyYXNoU3lzdGVtOjpDcmFzaFBpcGUgY3Jhc2hwaXBlID0gQ3Jhc2hTeXN0ZW06OmdldCgpLT5nZXRDcmFzaFBpcGUoKTsKKy8vICAgIEVYUEVDVF9UUlVFKGNyYXNocGlwZS5pc1ZhbGlkKCkpOworLy8gICAgY3Jhc2gtPnN0YXJ0Q3Jhc2hTZXJ2ZXIoY3Jhc2hwaXBlLm1TZXJ2ZXIpOworLy8gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZGxpbmUgPSBnZXRUZXN0Q3Jhc2hlckNtZExpbmUoY3Jhc2hwaXBlLm1DbGllbnQpOworLy8gICAgY21kbGluZS5wdXNoX2JhY2soU3RyaW5nVmlldygiLWRlbGF5X21zIikpOworLy8gICAgY21kbGluZS5wdXNoX2JhY2soU3RyaW5nVmlldygiMTAwIikpOworLy8gICAgaW50IHBpZCA9IENyYXNoU3lzdGVtOjpzcGF3blNlcnZpY2UoY21kbGluZSk7CisvLyAgICBFWFBFQ1RfR1QocGlkLCAwKTsKKy8vICAgIGludDY0X3Qgd2FpdGR1cmF0aW9uID0gY3Jhc2gtPndhaXRGb3JEdW1wRmlsZShwaWQsIDEpOworLy8gICAgRVhQRUNUX0VRKHdhaXRkdXJhdGlvbiwgLTEpOworLy8gICAgd2FpdGR1cmF0aW9uID0gY3Jhc2gtPndhaXRGb3JEdW1wRmlsZShwaWQsIDIwMCk7CisvLyAgICBFWFBFQ1RfTkUod2FpdGR1cmF0aW9uLCAtMSk7CisvL30KKyNlbmRpZiAgLy8gX19saW51eF9fCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlX3dpbmRvd3MuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV93aW5kb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGQ4MjllCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV93aW5kb3dzLmNwcApAQCAtMCwwICsxLDIzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV93aW5kb3dzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8cHNhcGkuaD4KKworI2RlZmluZSBFKC4uLikgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSBXKC4uLikgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKQorCisjZGVmaW5lIENNRF9CVUZfU0laRSAxMDI0CisjZGVmaW5lIEhXSU5GT19DTUQgTCJkeGRpYWcgL2RvbnRza2lwIC93aHFsOm9mZiAvNjRiaXQgL3QiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOworCituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCitIb3N0Q3Jhc2hTZXJ2aWNlOjp+SG9zdENyYXNoU2VydmljZSgpIHsKKyAgICBzdG9wQ3Jhc2hTZXJ2ZXIoKTsKK30KKwordm9pZCBIb3N0Q3Jhc2hTZXJ2aWNlOjpPbkNsaWVudENvbm5lY3QoCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIGNvbnN0IGdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyogY2xpZW50X2luZm8pIHsKKyAgICBEKCJDbGllbnQgY29ubmVjdGVkLCBwaWQgPSAlZFxuIiwgY2xpZW50X2luZm8tPnBpZCgpKTsKKyAgICBzdGF0aWNfY2FzdDxDcmFzaFNlcnZpY2U6OlNlcnZlclN0YXRlKj4oY29udGV4dCktPmNvbm5lY3RlZCArPSAxOworfQorCit2b2lkIEhvc3RDcmFzaFNlcnZpY2U6Ok9uQ2xpZW50RHVtcFJlcXVlc3QoCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIGNvbnN0IGdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyogY2xpZW50X2luZm8sCisgICAgICAgIGNvbnN0IHN0ZDo6d3N0cmluZyogZmlsZV9wYXRoKSB7CisgICAgaWYgKHN0YXRpY19jYXN0PENyYXNoU2VydmljZTo6RHVtcFJlcXVlc3RDb250ZXh0Kj4oY29udGV4dCkKKyAgICAgICAgICAgICAgICAtPmZpbGVfcGF0aC5lbXB0eSgpKSB7CisgICAgICAgIDo6c3RkOjpzdHJpbmcgZmlsZV9wYXRoX3N0cmluZyA9CisgICAgICAgICAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoLT5jX3N0cigpKTsKKyAgICAgICAgRCgiQ2xpZW50IFJlcXVlc3RpbmcgZHVtcCAlc1xuIiwgZmlsZV9wYXRoX3N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgc3RhdGljX2Nhc3Q8Q3Jhc2hTZXJ2aWNlOjpEdW1wUmVxdWVzdENvbnRleHQqPihjb250ZXh0KQorICAgICAgICAgICAgICAgIC0+ZmlsZV9wYXRoLmFzc2lnbihmaWxlX3BhdGhfc3RyaW5nLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBIb3N0Q3Jhc2hTZXJ2aWNlOjpPbkNsaWVudEV4aXQoCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIGNvbnN0IGdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyogY2xpZW50X2luZm8pIHsKKyAgICBEKCJDbGllbnQgZXhpdGluZ1xuIik7CisgICAgQ3Jhc2hTZXJ2aWNlOjpTZXJ2ZXJTdGF0ZSogc2VydmVyc3RhdGUgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q3Jhc2hTZXJ2aWNlOjpTZXJ2ZXJTdGF0ZSo+KGNvbnRleHQpOworICAgIGlmIChzZXJ2ZXJzdGF0ZS0+Y29ubmVjdGVkID4gMCkgeworICAgICAgICBzZXJ2ZXJzdGF0ZS0+Y29ubmVjdGVkIC09IDE7CisgICAgfQorICAgIGlmIChzZXJ2ZXJzdGF0ZS0+Y29ubmVjdGVkID09IDApIHsKKyAgICAgICAgc2VydmVyc3RhdGUtPndhaXRpbmcgPSBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6c3RhcnRDcmFzaFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZSkgeworICAgIGlmIChtQ3Jhc2hTZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGluaXRDcmFzaFNlcnZlcigpOworCisgICAgV2luMzJVbmljb2RlU3RyaW5nIHBpcGVfdW5pY29kZShwaXBlLmNfc3RyKCksIHBpcGUubGVuZ3RoKCkpOworICAgIDo6c3RkOjp3c3RyaW5nIHBpcGVfc3RyaW5nKHBpcGVfdW5pY29kZS5kYXRhKCkpOworICAgIFdpbjMyVW5pY29kZVN0cmluZyBjcmFzaGRpcl91bmljb2RlKAorICAgICAgICAgICAgOjphbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hTeXN0ZW06OmdldCgpCisgICAgICAgICAgICAgICAgICAgIC0+Z2V0Q3Jhc2hEaXJlY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisgICAgc3RkOjp3c3RyaW5nIGNyYXNoZGlyX3dzdHIoY3Jhc2hkaXJfdW5pY29kZS5jX3N0cigpKTsKKworICAgIG1DcmFzaFNlcnZlci5yZXNldChuZXcgOjpnb29nbGVfYnJlYWtwYWQ6OkNyYXNoR2VuZXJhdGlvblNlcnZlcigKKyAgICAgICAgICAgIHBpcGVfc3RyaW5nLCBudWxscHRyLCBPbkNsaWVudENvbm5lY3QsICZtU2VydmVyU3RhdGUsCisgICAgICAgICAgICBPbkNsaWVudER1bXBSZXF1ZXN0LCAmbUR1bXBSZXF1ZXN0Q29udGV4dCwgT25DbGllbnRFeGl0LAorICAgICAgICAgICAgJm1TZXJ2ZXJTdGF0ZSwgbnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSwgJmNyYXNoZGlyX3dzdHIpKTsKKworICAgIHJldHVybiBtQ3Jhc2hTZXJ2ZXItPlN0YXJ0KCk7Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6c3RvcENyYXNoU2VydmVyKCkgeworICAgIGlmIChtQ3Jhc2hTZXJ2ZXIpIHsKKyAgICAgICAgbUNyYXNoU2VydmVyLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgSG9zdENyYXNoU2VydmljZTo6c2V0Q2xpZW50KGludCBjbGllbnRwaWQpIHsKKyAgICBtQ2xpZW50UHJvY2Vzcy5yZXNldChPcGVuUHJvY2VzcyhTWU5DSFJPTklaRSwgRkFMU0UsIGNsaWVudHBpZCkpOworICAgIHJldHVybiBtQ2xpZW50UHJvY2Vzcy5nZXQoKSAhPSBudWxscHRyOworfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OmlzQ2xpZW50QWxpdmUoKSB7CisgICAgaWYgKCFtQ2xpZW50UHJvY2VzcykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KG1DbGllbnRQcm9jZXNzLmdldCgpLCAwKSAhPSBXQUlUX1RJTUVPVVQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBIb3N0Q3Jhc2hTZXJ2aWNlOjpnZXRIV0luZm8oKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGFEaXJlY3RvcnkgPSBnZXREYXRhRGlyZWN0b3J5KCk7CisgICAgaWYgKGRhdGFEaXJlY3RvcnkuZW1wdHkoKSkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGRhdGEgZGlyZWN0b3J5IGZvciBjcmFzaCByZXBvcnQgYXR0YWNobWVudHMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB1dGY4UGF0aCA9IFBhdGhVdGlsczo6am9pbihkYXRhRGlyZWN0b3J5LCBrSHdJbmZvTmFtZSk7CisgICAgV2luMzJVbmljb2RlU3RyaW5nIGZpbGVfcGF0aCh1dGY4UGF0aCk7CisKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgc3lzY21kKEhXSU5GT19DTUQpOworICAgIHN5c2NtZC5hcHBlbmQoZmlsZV9wYXRoKTsKKyAgICBpbnQgcmVzdWx0ID0gX3dzeXN0ZW0oc3lzY21kLmNfc3RyKCkpOworICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICBFKCJVbmFibGUgdG8gZ2V0IGhhcmR3YXJlIGluZm86ICVkIiwgZXJybm8pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjb252ZXJ0IGEgdmFsdWUgdG8gYSB2YWx1ZSBpbiBraWxvYnl0ZXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGF0aWMgVCB0b0tCKFQgdmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUgLyAxMDI0OworfQorCitib29sIEhvc3RDcmFzaFNlcnZpY2U6OmdldE1lbUluZm8oKSB7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGFfZGlyZWN0b3J5ID0gZ2V0RGF0YURpcmVjdG9yeSgpOworICAgIGlmIChkYXRhX2RpcmVjdG9yeS5lbXB0eSgpKSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBnZXQgZGF0YSBkaXJlY3RvcnkgZm9yIGNyYXNoIHJlcG9ydCBhdHRhY2htZW50cyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBQYXRoVXRpbHM6OmpvaW4oZGF0YV9kaXJlY3RvcnksIGtNZW1JbmZvTmFtZSk7CisgICAgLy8gVE9ETzogUmVwbGFjZSBvZnN0cmVhbSB3aGVuIHdlIGhhdmUgYSBnb29kIHdheSBvZiBoYW5kbGluZyBVVEYtOCBwYXRocworICAgIHN0ZDo6b2ZzdHJlYW0gZm91dChwYXRoLmNfc3RyKCkpOworICAgIGlmICghZm91dCkgeworICAgICAgICBFKCJVbmFibGUgdG8gb3BlbiAnJXMnIHRvIHdyaXRlIGNyYXNoIHJlcG9ydCBhdHRhY2htZW50IiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE1FTU9SWVNUQVRVU0VYIG1lbTsKKyAgICBtZW0uZHdMZW5ndGggID0gc2l6ZW9mKG1lbSk7CisgICAgaWYgKCFHbG9iYWxNZW1vcnlTdGF0dXNFeCgmbWVtKSkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBFKCJGYWlsZWQgdG8gZ2V0IGdsb2JhbCBtZW1vcnkgc3RhdHVzOiAlbHUiLCBlcnJvcik7CisgICAgICAgIGZvdXQgPDwgIkVSUk9SOiBGYWlsZWQgdG8gZ2V0IGdsb2JhbCBtZW1vcnkgc3RhdHVzOiAiIDw8IGVycm9yIDw8ICJcbiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQRVJGT1JNQU5DRV9JTkZPUk1BVElPTiBwaSA9IHsgc2l6ZW9mKHBpKSB9OworICAgIGlmICghR2V0UGVyZm9ybWFuY2VJbmZvKCZwaSwgc2l6ZW9mKHBpKSkpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgRSgiRmFpbGVkIHRvIGdldCBwZXJmb3JtYW5jZSBpbmZvOiAlbHUiLCBlcnJvcik7CisgICAgICAgIGZvdXQgPDwgIkVSUk9SOiBGYWlsZWQgdG8gZ2V0IHBlcmZvcm1hbmNlIGluZm86ICIgPDwgZXJyb3IgPDwgIlxuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNpemVfdCBwYWdlU2l6ZSA9IHBpLlBhZ2VTaXplOworICAgIGZvdXQgPDwgIlRvdGFsIHBoeXNpY2FsIG1lbW9yeTogIiA8PCB0b0tCKG1lbS51bGxUb3RhbFBoeXMpIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJBdmFpbCBwaHlzaWNhbCBtZW1vcnk6ICIgPDwgdG9LQihtZW0udWxsQXZhaWxQaHlzKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiVG90YWwgcGFnZSBmaWxlOiAiIDw8IHRvS0IobWVtLnVsbFRvdGFsUGFnZUZpbGUpIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJBdmFpbCBwYWdlIGZpbGU6ICIgPDwgdG9LQihtZW0udWxsQXZhaWxQYWdlRmlsZSkgPDwgIiBrQlxuIgorICAgICAgICAgPDwgIlRvdGFsIHZpcnR1YWw6ICIgPDwgdG9LQihtZW0udWxsVG90YWxWaXJ0dWFsKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiQXZhaWwgdmlydHVhbDogIiA8PCB0b0tCKG1lbS51bGxBdmFpbFZpcnR1YWwpIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJDb21taXQgdG90YWw6ICIgPDwgdG9LQihwaS5Db21taXRUb3RhbCAqIHBhZ2VTaXplKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiQ29tbWl0IGxpbWl0OiAiIDw8IHRvS0IocGkuQ29tbWl0TGltaXQgKiBwYWdlU2l6ZSkgPDwgIiBrQlxuIgorICAgICAgICAgPDwgIkNvbW1pdCBwZWFrOiAiIDw8IHRvS0IocGkuQ29tbWl0UGVhayAqIHBhZ2VTaXplKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiU3lzdGVtIGNhY2hlOiAiIDw8IHRvS0IocGkuU3lzdGVtQ2FjaGUgKiBwYWdlU2l6ZSkgPDwgIiBrQlxuIgorICAgICAgICAgPDwgIktlcm5lbCB0b3RhbDogIiA8PCB0b0tCKHBpLktlcm5lbFRvdGFsICogcGFnZVNpemUpIDw8ICIga0JcbiIKKyAgICAgICAgIDw8ICJLZXJuZWwgcGFnZWQ6ICIgPDwgdG9LQihwaS5LZXJuZWxQYWdlZCAqIHBhZ2VTaXplKSA8PCAiIGtCXG4iCisgICAgICAgICA8PCAiS2VybmVsIG5vbnBhZ2VkOiAiIDw8IHRvS0IocGkuS2VybmVsTm9ucGFnZWQgKiBwYWdlU2l6ZSkgPDwgIiBrQlxuIgorICAgICAgICAgPDwgIkhhbmRsZSBjb3VudDogIiA8PCBwaS5IYW5kbGVDb3VudCA8PCAiXG4iCisgICAgICAgICA8PCAiUHJvY2VzcyBjb3VudDogIiA8PCBwaS5Qcm9jZXNzQ291bnQgPDwgIlxuIgorICAgICAgICAgPDwgIlRocmVhZCBjb3VudDogIiA8PCBwaS5UaHJlYWRDb3VudCA8PCAiXG4iOworCisgICAgcmV0dXJuIGZvdXQuZ29vZCgpOworfQorCit2b2lkIEhvc3RDcmFzaFNlcnZpY2U6OmNvbGxlY3RQcm9jZXNzTGlzdCgpCit7CisgICAgaWYgKG1EYXRhRGlyZWN0b3J5LmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gY29tbWFuZCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgInRhc2tsaXN0IC9WID4lc1xcJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBtRGF0YURpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6a1Byb2Nlc3NMaXN0RmlsZU5hbWUpOworCisgICAgaWYgKHN5c3RlbShjb21tYW5kLmNfc3RyKCkpICE9IDApIHsKKyAgICAgICAgLy8gdHJ5IHRvIGNhbGwgdGhlICJxdWVyeSBwcm9jZXNzICoiIGNvbW1hbmQsIHdoaWNoIHVzZWQgdG8gZXhpc3QKKyAgICAgICAgLy8gYmVmb3JlIHRoZSB0YXNra2lsbAorICAgICAgICBjb21tYW5kID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAicXVlcnkgcHJvY2VzcyAqID4lc1xcJXMiLAorICAgICAgICAgICAgICAgICAgICBtRGF0YURpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgQ3Jhc2hSZXBvcnRlcjo6a1Byb2Nlc3NMaXN0RmlsZU5hbWUpOworICAgICAgICBzeXN0ZW0oY29tbWFuZC5jX3N0cigpKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjcmFzaHJlcG9ydAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2Vfd2luZG93cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZV93aW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4ZWY1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFNlcnZpY2Vfd2luZG93cy5oCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlLmgiCisKKyNpbmNsdWRlICJjbGllbnQvd2luZG93cy9jcmFzaF9nZW5lcmF0aW9uL2NyYXNoX2dlbmVyYXRpb25fc2VydmVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjcmFzaHJlcG9ydCB7CisKK2NsYXNzIEhvc3RDcmFzaFNlcnZpY2UgOiBwdWJsaWMgQ3Jhc2hTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICAvLyBJbmhlcml0IENyYXNoU2VydmVyIGNvbnN0cnVjdG9yCisgICAgdXNpbmcgQ3Jhc2hTZXJ2aWNlOjpDcmFzaFNlcnZpY2U7CisKKyAgICB2aXJ0dWFsIH5Ib3N0Q3Jhc2hTZXJ2aWNlKCk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkNsaWVudENvbm5lY3Qodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlX2JyZWFrcGFkOjpDbGllbnRJbmZvKiBjbGllbnRfaW5mbyk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkNsaWVudER1bXBSZXF1ZXN0KAorICAgICAgICAgICAgdm9pZCogY29udGV4dCwKKyAgICAgICAgICAgIGNvbnN0IGdvb2dsZV9icmVha3BhZDo6Q2xpZW50SW5mbyogY2xpZW50X2luZm8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OndzdHJpbmcqIGZpbGVfcGF0aCk7CisKKyAgICBzdGF0aWMgdm9pZCBPbkNsaWVudEV4aXQodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ29vZ2xlX2JyZWFrcGFkOjpDbGllbnRJbmZvKiBjbGllbnRfaW5mbyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3RhcnRDcmFzaFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZSkgb3ZlcnJpZGU7CisKKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGR0b3IsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGl0J3MgdGhlCisgICAgLy8gZmluYWwgb3ZlcnJpZGUKKyAgICB2aXJ0dWFsIGJvb2wgc3RvcENyYXNoU2VydmVyKCkgb3ZlcnJpZGUgZmluYWw7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q2xpZW50KGludCBjbGllbnRwaWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBib29sIGlzQ2xpZW50QWxpdmUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBnZXRIV0luZm8oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0TWVtSW5mbygpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBjb2xsZWN0UHJvY2Vzc0xpc3QoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Ojpnb29nbGVfYnJlYWtwYWQ6OkNyYXNoR2VuZXJhdGlvblNlcnZlcj4gbUNyYXNoU2VydmVyOworICAgIGFuZHJvaWQ6OmJhc2U6OldpbjMyVXRpbHM6OlNjb3BlZEhhbmRsZSBtQ2xpZW50UHJvY2VzczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjcmFzaHJlcG9ydAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzExMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjaW5jbHVkZSAiY2xpZW50L2xpbnV4L2NyYXNoX2dlbmVyYXRpb24vY3Jhc2hfZ2VuZXJhdGlvbl9zZXJ2ZXIuaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKyNpbXBvcnQgPENhcmJvbi9DYXJib24uaD4KKyNlbmRpZiAgLy8gX19BUFBMRV9fCisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVyguLi4pIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSSguLi4pIHByaW50ZihfX1ZBX0FSR1NfXykKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNyYXNocmVwb3J0IHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlBhdGhVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6UnVuT3B0aW9uczsKK3VzaW5nIDo6YW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpTeXN0ZW07CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIga0NyYXNoVVJMX3Byb2RbXSA9ICJodHRwczovL2NsaWVudHMyLmdvb2dsZS5jb20vY3IvcmVwb3J0IjsKK2NvbnN0IGNoYXIga0NyYXNoVVJMX3N0YWdpbmdbXSA9CisgICAgICAgICJodHRwczovL2NsaWVudHMyLmdvb2dsZS5jb20vY3Ivc3RhZ2luZ19yZXBvcnQiOworCisjaWYgZGVmaW5lZChfV0lOMzIpCitjb25zdCBjaGFyIGtQaXBlTmFtZVtdID0gIlxcXFwuXFxwaXBlXFxBbmRyb2lkRW11bGF0b3JDcmFzaFNlcnZpY2UiOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCitjb25zdCBjaGFyIGtQaXBlTmFtZVtdID0gImNvbS5nb29nbGUuQW5kcm9pZEVtdWxhdG9yLkNyYXNoU2VydmljZSI7CisjZW5kaWYKKworY29uc3QgY2hhciBrQ3Jhc2hTdWJEaXJbXSA9ICJicmVha3BhZCI7CisKK2NsYXNzIEhvc3RDcmFzaFN5c3RlbSA6IHB1YmxpYyBDcmFzaFN5c3RlbSB7CitwdWJsaWM6CisgICAgSG9zdENyYXNoU3lzdGVtKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+SG9zdENyYXNoU3lzdGVtKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q3Jhc2hEaXJlY3RvcnkoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ3Jhc2hEaXIuZW1wdHkoKSkgeworICAgICAgICAgICAgbUNyYXNoRGlyID0KKyAgICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpqb2luKDo6YW5kcm9pZDo6Q29uZmlnRGlyczo6Z2V0VXNlckRpcmVjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NyYXNoU3ViRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQ3Jhc2hEaXI7CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q3Jhc2hVUkwoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ3Jhc2hVUkwuZW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKENyYXNoVHlwZTo6Q1JBU0hVUExPQUQgPT0gQ3Jhc2hUeXBlOjpQUk9EKSB7CisgICAgICAgICAgICAgICAgbUNyYXNoVVJMLmFzc2lnbihrQ3Jhc2hVUkxfcHJvZCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENyYXNoVHlwZTo6Q1JBU0hVUExPQUQgPT0gQ3Jhc2hUeXBlOjpTVEFHSU5HKSB7CisgICAgICAgICAgICAgICAgbUNyYXNoVVJMLmFzc2lnbihrQ3Jhc2hVUkxfc3RhZ2luZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DcmFzaFVSTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVQYXRocygpIG92ZXJyaWRlIHsKKyAgICAgICAgYm9vbCB2YWxpZCA9IENyYXNoU3lzdGVtOjp2YWxpZGF0ZVBhdGhzKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNyYXNoRGlyID0gZ2V0Q3Jhc2hEaXJlY3RvcnkoKTsKKyAgICAgICAgaWYgKCFTeXN0ZW06OmdldCgpLT5wYXRoRXhpc3RzKGNyYXNoRGlyKSkgeworICAgICAgICAgICAgaWYgKHBhdGhfbWtkaXJfaWZfbmVlZGVkKGNyYXNoRGlyLmNfc3RyKCksIDA3NDQpID09IC0xKSB7CisgICAgICAgICAgICAgICAgVygiQ291bGRuJ3QgY3JlYXRlIGNyYXNoIGRpciAlc1xuIiwgY3Jhc2hEaXIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChTeXN0ZW06OmdldCgpLT5wYXRoSXNGaWxlKGNyYXNoRGlyKSkgeworICAgICAgICAgICAgVygiQ3Jhc2ggZGlyIGlzIGEgZmlsZSEgJXNcbiIsIGNyYXNoRGlyLmNfc3RyKCkpOworICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1DcmFzaERpcjsKKyAgICBzdGQ6OnN0cmluZyBtQ3Jhc2hVUkw7Cit9OworCitMYXp5SW5zdGFuY2U8SG9zdENyYXNoU3lzdGVtPiBzQ3Jhc2hTeXN0ZW0gPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CitDcmFzaFN5c3RlbSogc0NyYXNoU3lzdGVtRm9yVGVzdGluZyA9IG51bGxwdHI7CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQgQ3Jhc2hTeXN0ZW06OnNwYXduU2VydmljZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvbW1hbmRMaW5lKSB7CisgICAgU3lzdGVtOjpQaWQgcGlkOworICAgIGF1dG8gc3VjY2VzcyA9IFN5c3RlbTo6Z2V0KCktPnJ1bkNvbW1hbmQoY29tbWFuZExpbmUsIFJ1bk9wdGlvbnM6OkRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OmtJbmZpbml0ZSwgbnVsbHB0ciwgJnBpZCk7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPyBwaWQgOiAtMTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIENyYXNoU3lzdGVtOjpnZXRDYUJ1bmRsZVBhdGgoKSB7CisgICAgaWYgKG1DYUJ1bmRsZVBhdGguZW1wdHkoKSkgeworICAgICAgICBtQ2FCdW5kbGVQYXRoID0gUGF0aFV0aWxzOjpqb2luKFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsICJjYS1idW5kbGUucGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCk7CisgICAgfQorICAgIHJldHVybiBtQ2FCdW5kbGVQYXRoOworfQorCitjb25zdCBzdGQ6OnN0cmluZyYgQ3Jhc2hTeXN0ZW06OmdldENyYXNoU2VydmljZVBhdGgoKSB7CisgICAgaWYgKG1DcmFzaFNlcnZpY2VQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgbUNyYXNoU2VydmljZVBhdGggPQorICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoU3RyaW5nRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW11bGF0b3Ilcy1jcmFzaC1zZXJ2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MgPT0gNjQgPyAiNjQiIDogIiIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpOworICAgIH0KKyAgICByZXR1cm4gbUNyYXNoU2VydmljZVBhdGg7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBDcmFzaFN5c3RlbTo6Z2V0UHJvY2Vzc0lkKCkgeworICAgIGlmIChtUHJvY2Vzc0lkLmVtcHR5KCkpIHsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisgICAgICAgIG1Qcm9jZXNzSWQgPSBzdGQ6OnRvX3N0cmluZyhnZXRwaWQoKSk7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyAgICAgICAgbVByb2Nlc3NJZCA9IHN0ZDo6dG9fc3RyaW5nKEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIG1Qcm9jZXNzSWQ7Cit9CisKK2NvbnN0IENyYXNoU3lzdGVtOjpDcmFzaFBpcGUmIENyYXNoU3lzdGVtOjpnZXRDcmFzaFBpcGUoKSB7CisgICAgaWYgKCFtQ3Jhc2hQaXBlLmlzVmFsaWQoKSkgeworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAgICAgICBpbnQgc2VydmVyX2ZkOworICAgICAgICBpbnQgY2xpZW50X2ZkOworICAgICAgICBpZiAoIWdvb2dsZV9icmVha3BhZDo6Q3Jhc2hHZW5lcmF0aW9uU2VydmVyOjpDcmVhdGVSZXBvcnRDaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAmc2VydmVyX2ZkLCAmY2xpZW50X2ZkKSkgeworICAgICAgICAgICAgVygiQ3Jhc2hSZXBvcnRlciBDcmVhdGVSZXBvcnRDaGFubmVsIGZhaWxlZCFcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUNyYXNoUGlwZSA9IENyYXNoUGlwZShzZXJ2ZXJfZmQsIGNsaWVudF9mZCk7CisgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9XSU4zMikKKyAgICAgICAgc3RkOjpzdHJpbmcgcGlwZW5hbWU7CisgICAgICAgIHBpcGVuYW1lLmFwcGVuZChrUGlwZU5hbWUpOworICAgICAgICBwaXBlbmFtZS5hcHBlbmQoIi4iKTsKKyAgICAgICAgcGlwZW5hbWUuYXBwZW5kKGdldFByb2Nlc3NJZCgpKTsKKyAgICAgICAgbUNyYXNoUGlwZSA9IENyYXNoUGlwZShwaXBlbmFtZSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIG1DcmFzaFBpcGU7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDcmFzaFN5c3RlbTo6Z2V0Q3Jhc2hTZXJ2aWNlQ21kTGluZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9jKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZGxpbmUgPSB7CisgICAgICAgICAgICBnZXRDcmFzaFNlcnZpY2VQYXRoKCksCisgICAgICAgICAgICAiLXBpcGUiLAorICAgICAgICAgICAgcGlwZSwKKyAgICAgICAgICAgICItcHBpZCIsCisgICAgICAgICAgICBwcm9jLAorICAgICAgICAgICAgIi1kYXRhLWRpciIsCisgICAgICAgICAgICBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+Z2V0RGF0YUV4Y2hhbmdlRGlyKCl9OworICAgIHJldHVybiBjbWRsaW5lOworfQorCitib29sIENyYXNoU3lzdGVtOjp2YWxpZGF0ZVBhdGhzKCkgeworICAgIGJvb2wgdmFsaWQgPSB0cnVlOworICAgIHN0ZDo6c3RyaW5nIGNhQnVuZGxlUGF0aCA9IGdldENhQnVuZGxlUGF0aCgpOworICAgIHN0ZDo6c3RyaW5nIGNyYXNoU2VydmljZVBhdGggPSBnZXRDcmFzaFNlcnZpY2VQYXRoKCk7CisgICAgaWYgKCFTeXN0ZW06OmdldCgpLT5wYXRoSXNGaWxlKGNhQnVuZGxlUGF0aCkpIHsKKyAgICAgICAgVygiQ291bGRuJ3QgZmluZCBmaWxlICVzXG4iLCBjYUJ1bmRsZVBhdGguY19zdHIoKSk7CisgICAgICAgIHZhbGlkID0gZmFsc2U7CisgICAgfQorICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cGF0aElzRmlsZShjcmFzaFNlcnZpY2VQYXRoKSkgeworICAgICAgICBXKCJDb3VsZG4ndCBmaW5kIGNyYXNoIHNlcnZpY2UgZXhlY3V0YWJsZSAlc1xuIiwKKyAgICAgICAgICBjcmFzaFNlcnZpY2VQYXRoLmNfc3RyKCkpOworICAgICAgICB2YWxpZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdmFsaWQ7Cit9CisKK0NyYXNoU3lzdGVtKiBDcmFzaFN5c3RlbTo6Z2V0KCkgeworICAgIENyYXNoU3lzdGVtKiByZXN1bHQgPSBzQ3Jhc2hTeXN0ZW1Gb3JUZXN0aW5nOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdCA9IHNDcmFzaFN5c3RlbS5wdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitib29sIENyYXNoU3lzdGVtOjppc0R1bXAoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICByZXR1cm4gUGF0aFV0aWxzOjpleHRlbnNpb24ocGF0aCkgPT0gIi5kbXAiICYmCisgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPnBhdGhJc0ZpbGUocGF0aCk7Cit9CisKKy8vIHN0YXRpYworQ3Jhc2hTeXN0ZW0qIENyYXNoU3lzdGVtOjpzZXRGb3JUZXN0aW5nKENyYXNoU3lzdGVtKiBjcmFzaHN5c3RlbSkgeworICAgIENyYXNoU3lzdGVtKiByZXN1bHQgPSBzQ3Jhc2hTeXN0ZW1Gb3JUZXN0aW5nOworICAgIHNDcmFzaFN5c3RlbUZvclRlc3RpbmcgPSBjcmFzaHN5c3RlbTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgY3Jhc2hyZXBvcnQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYTVlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworLy8gU2luZ2xldG9uIGNsYXNzIGNvbnN0cnVjdHMgcGF0aHMgYW5kIHByb3ZpZGVzIGNyYXNoIHJlbGF0ZWQgdXRpbGl0eQorLy8gICBmdW5jdGlvbnMKKy8vIFJlc3VsdCBmcm9tIHZhbGlkYXRlUGF0aHMgd2lsbCBkZXRlcm1pbmUgd2hldGhlciBjcmFzaCByZXBvcnRpbmcKKy8vICAgY2FuIGJlIGVuYWJsZWQgb24gdGhlIHN5c3RlbQorLy8gUGF0aHMgY2hlY2tlZDoKKy8vICAgQ2hlY2tzIGlmIGNyYXNoIGR1bXAgZGlyZWN0b3J5IGV4aXN0cywgaWYgbm90IHRyaWVzIHRvIGNyZWF0ZQorLy8gICBDaGVja3MgaWYgY2FCdW5kbGVQYXRoIGZvciBsaWJjdXJsIGV4aXN0cworLy8gICBjaGVja3MgaWYgY3Jhc2gtc2VydmljZSBiaW5hcnkgZXhpc3RzCitjbGFzcyBDcmFzaFN5c3RlbSB7CitwdWJsaWM6CisgICAgQ3Jhc2hTeXN0ZW0oKQorICAgICAgICA6IG1DYUJ1bmRsZVBhdGgoKSwgbUNyYXNoU2VydmljZVBhdGgoKSwgbVByb2Nlc3NJZCgpLCBtQ3Jhc2hQaXBlKCkge30KKworICAgIHZpcnR1YWwgfkNyYXNoU3lzdGVtKCkge30KKworICAgIGVudW0gY2xhc3MgQ3Jhc2hUeXBlIHsgUFJPRCwgU1RBR0lORywgTk9ORSB9OworCisgICAgc3RydWN0IENyYXNoUGlwZSB7CisgICAgICAgIENyYXNoUGlwZSgpIDogbVNlcnZlcigpLCBtQ2xpZW50KCksIG1WYWxpZChmYWxzZSkge30KKyAgICAgICAgQ3Jhc2hQaXBlKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICAgICAgICA6IG1TZXJ2ZXIobmFtZSksIG1DbGllbnQobmFtZSksIG1WYWxpZCh0cnVlKSB7fQorICAgICAgICBDcmFzaFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgICAgICAgICA6IG1TZXJ2ZXIobmFtZSksIG1DbGllbnQobmFtZSksIG1WYWxpZCh0cnVlKSB7fQorICAgICAgICBDcmFzaFBpcGUoaW50IHNlcnZlcl9mZCwgaW50IGNsaWVudF9mZCkKKyAgICAgICAgICAgIDogbVNlcnZlcihzdGQ6OnRvX3N0cmluZyhzZXJ2ZXJfZmQpKSwKKyAgICAgICAgICAgICAgbUNsaWVudChzdGQ6OnRvX3N0cmluZyhjbGllbnRfZmQpKSwKKyAgICAgICAgICAgICAgbVZhbGlkKHRydWUpIHt9CisgICAgICAgIENyYXNoUGlwZShpbnQgZmQpCisgICAgICAgICAgICA6IG1TZXJ2ZXIoc3RkOjp0b19zdHJpbmcoZmQpKSwKKyAgICAgICAgICAgICAgbUNsaWVudChzdGQ6OnRvX3N0cmluZyhmZCkpLAorICAgICAgICAgICAgICBtVmFsaWQodHJ1ZSkge30KKyAgICAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVZhbGlkOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIG1TZXJ2ZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1DbGllbnQ7CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1WYWxpZDsKKyAgICB9OworCisgICAgLy8gUmV0dXJuIHByZWRlZmluZWQgbG9jYXRpb24gb2YgY3Jhc2ggZHVtcCBkaXJlY3RvcnkKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRDcmFzaERpcmVjdG9yeSgpID0gMDsKKworICAgIC8vIFJldHVybnMgVVJMIGZvciBjcmFzaCBzZXJ2ZXIKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRDcmFzaFVSTCgpID0gMDsKKworICAgIC8vIFJldHVybnMgcHJlZGVmaW5lZCBwYXRoIHRvIGJ1bmRsZSByZXF1aXJlZCBmb3IgY3VybCBpbml0CisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q2FCdW5kbGVQYXRoKCk7CisKKyAgICAvLyBSZXR1cm5zIHByZWRlZmluZWQgcGF0aCB0byBjcmFzaC1zZXJ2aWNlCisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Q3Jhc2hTZXJ2aWNlUGF0aCgpOworCisgICAgLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvY2VzcyB1c2VkIGZvciBwYXNzaW5nIGJldHdlZW4KKyAgICAvLyBwcm9jZXNzZXMKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRQcm9jZXNzSWQoKTsKKworICAgIC8vIFJldHVybnMgcGlwZSBzdHJ1Y3QgZm9yIGNyYXNoIHJlcG9ydGluZworICAgIHZpcnR1YWwgY29uc3QgQ3Jhc2hQaXBlJiBnZXRDcmFzaFBpcGUoKTsKKworICAgIC8vIFJldHVybiBjcmFzaCBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZSBjcmFzaCBzZXJ2aWNlIGluCisgICAgLy8gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZvcm1hdC4KKyAgICAvLyBUYWtlcyBhIHBpcGUgaWRlbnRmaWVyIGFuZCBhIGN1cnJlbnQgcHJvYyBpZGVudGlmaWVyCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0Q3Jhc2hTZXJ2aWNlQ21kTGluZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb2MpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFsbCByZXF1aXJlZCBwYXRocyB0byBkaXJlY3RvcmllcywgZXhlY3V0YWJsZXMsIGZpbGVzCisgICAgLy8gYXJlIHZhbGlkLgorICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZVBhdGhzKCk7CisKKyAgICAvLyBSZXR1cm5zIGluc3RhbmNlIHBvaW50ZXIgdG8gZ2xvYmFsIHN0cnVjdHVyZQorICAgIHN0YXRpYyBDcmFzaFN5c3RlbSogZ2V0KCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgcGF0aCBpcyBhIHZhbGlkIGR1bXAgZmlsZQorICAgIC8vIFRha2VzIHBhdGggdG8gY3Jhc2ggZHVtcCBhcyBhcmd1bWVudAorICAgIHN0YXRpYyBib29sIGlzRHVtcChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKKworICAgIHN0YXRpYyBpbnQgc3Bhd25TZXJ2aWNlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tbWFuZExpbmUpOworCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIENyYXNoU3lzdGVtKiBzZXRGb3JUZXN0aW5nKENyYXNoU3lzdGVtKiBjcmFzaHN5c3RlbSk7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyYXNoU3lzdGVtKTsKKyAgICBzdGQ6OnN0cmluZyBtQ2FCdW5kbGVQYXRoOworICAgIHN0ZDo6c3RyaW5nIG1DcmFzaFNlcnZpY2VQYXRoOworICAgIHN0ZDo6c3RyaW5nIG1Qcm9jZXNzSWQ7CisgICAgQ3Jhc2hQaXBlIG1DcmFzaFBpcGU7Cit9OworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU3lzdGVtX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NGNmZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjcmFzaHJlcG9ydDsKKworLy8gVE9ETyBmaXggdmFsaWRhdGVQYXRoc19ub25Xcml0YWJsZUhvbWVEaXIKKy8vIFRPRE8gd2luZG93cyB0ZXN0cworCitjbGFzcyBDcmFzaFN5c3RlbVRlc3Q6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIENyYXNoU3lzdGVtVGVzdCgpIDogbVRlc3RTeXN0ZW0oIi9wcm9nZGlyIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9ob21lZGlyIiwgIi9hcHBkaXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0RGlyKG1UZXN0U3lzdGVtLmdldFRlbXBSb290KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNyYXNoU2VydmljZU5hbWUoKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1UZXN0RGlyLT5tYWtlU3ViRGlyKCJwcm9nZGlyIikpOworICAgICAgICBFWFBFQ1RfVFJVRShtVGVzdERpci0+bWFrZVN1YkRpcigiaG9tZWRpciIpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVRlc3REaXItPm1ha2VTdWJEaXIoImFwcGRpciIpKTsKKyAgICAgICAgaWYgKFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzID09IDMyKSB7CisgICAgICAgICAgICBtQ3Jhc2hTZXJ2aWNlTmFtZSA9ICJlbXVsYXRvci1jcmFzaC1zZXJ2aWNlIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DcmFzaFNlcnZpY2VOYW1lID0gImVtdWxhdG9yNjQtY3Jhc2gtc2VydmljZSI7CisgICAgICAgIH0KKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgbUNyYXNoU2VydmljZU5hbWUrPSIuZXhlIjsKKyNlbmRpZgorICAgIH0KKworICAgIFRlc3RUZW1wRGlyKiBnZXRUZXN0RGlyKCkgeworICAgICAgICByZXR1cm4gbVRlc3REaXI7CisgICAgfQorICAgIHZvaWQgbWFrZUNhQnVuZGxlKCkgeworICAgICAgICBFWFBFQ1RfVFJVRShtVGVzdERpci0+bWFrZVN1YkRpcigicHJvZ2Rpci9saWIiKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1UZXN0RGlyLT5tYWtlU3ViRmlsZSgicHJvZ2Rpci9saWIvY2EtYnVuZGxlLnBlbSIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBnZXRDcmFzaFNlcnZpY2VUZXN0RGlyUGF0aCgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY3Jhc2hwYXRoICgicHJvZ2RpciIpOworICAgICAgICBjcmFzaHBhdGggKz0gU3lzdGVtOjprRGlyU2VwYXJhdG9yOworICAgICAgICBjcmFzaHBhdGggKz0gbUNyYXNoU2VydmljZU5hbWU7CisgICAgICAgIHJldHVybiBjcmFzaHBhdGg7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2V0Q3Jhc2hTZXJ2aWNlUGF0aCgpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY3Jhc2hwYXRoICgiLyIpOworICAgICAgICBjcmFzaHBhdGggKz0gZ2V0Q3Jhc2hTZXJ2aWNlVGVzdERpclBhdGgoKTsKKyAgICAgICAgcmV0dXJuIGNyYXNocGF0aDsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VDcmFzaFNlcnZpY2UoKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKG1UZXN0RGlyLT5tYWtlU3ViRmlsZShnZXRDcmFzaFNlcnZpY2VUZXN0RGlyUGF0aCgpLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICB2b2lkIG1ha2VBbmRyb2lkSG9tZSgpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobVRlc3REaXItPm1ha2VTdWJEaXIoImhvbWVkaXIvLmFuZHJvaWQiKSk7CisgICAgfQorCisgICAgdm9pZCBtYWtlQnJlYWtwYWRIb21lKCkgeworICAgICAgICBtYWtlQW5kcm9pZEhvbWUoKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVRlc3REaXItPm1ha2VTdWJEaXIoImhvbWVkaXIvLmFuZHJvaWQvYnJlYWtwYWQiKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW0gbVRlc3RTeXN0ZW07CisgICAgVGVzdFRlbXBEaXIqIG1UZXN0RGlyOworICAgIHN0ZDo6c3RyaW5nIG1DcmFzaFNlcnZpY2VOYW1lOworfTsKKworCitURVNUX0YoQ3Jhc2hTeXN0ZW1UZXN0LCBnZXRDcmFzaERpcmVjdG9yeSkgeworICAgIHN0ZDo6c3RyaW5nIHRtcDEgPSBDcmFzaFN5c3RlbTo6Z2V0KCktPmdldENyYXNoRGlyZWN0b3J5KCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKHRtcDEuY19zdHIoKSwgIi9ob21lZGlyXFwuYW5kcm9pZFxcYnJlYWtwYWQiKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKHRtcDEuY19zdHIoKSwgIi9ob21lZGlyLy5hbmRyb2lkL2JyZWFrcGFkIik7CisjZW5kaWYKK30KKworVEVTVF9GKENyYXNoU3lzdGVtVGVzdCwgZ2V0Q2FCdW5kbGVQYXRoKSB7CisgICAgc3RkOjpzdHJpbmcgdG1wMSA9IENyYXNoU3lzdGVtOjpnZXQoKS0+Z2V0Q2FCdW5kbGVQYXRoKCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKHRtcDEuY19zdHIoKSwgIi9wcm9nZGlyXFxsaWJcXGNhLWJ1bmRsZS5wZW0iKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKHRtcDEuY19zdHIoKSwgIi9wcm9nZGlyL2xpYi9jYS1idW5kbGUucGVtIik7CisjZW5kaWYKK30KKworVEVTVF9GKENyYXNoU3lzdGVtVGVzdCwgZ2V0Q3Jhc2hTZXJ2aWNlUGF0aCkgeworICAgIHN0ZDo6c3RyaW5nIHRtcDEgPSBDcmFzaFN5c3RlbTo6Z2V0KCktPmdldENyYXNoU2VydmljZVBhdGgoKTsKKyAgICBzdGQ6OnN0cmluZyBjcmFzaHBhdGggPSBnZXRDcmFzaFNlcnZpY2VQYXRoKCk7CisgICAgRVhQRUNUX1NUUkVRKHRtcDEuY19zdHIoKSwgY3Jhc2hwYXRoLmNfc3RyKCkpOworfQorCitURVNUX0YoQ3Jhc2hTeXN0ZW1UZXN0LCBnZXRDcmFzaFNlcnZpY2VDbWRMaW5lKSB7CisgICAgc3RkOjpzdHJpbmcgcGlwZSgicGlwZXZhbCIpOworICAgIHN0ZDo6c3RyaW5nIHByb2MoInByb2N2YWwiKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG1wMSA9CisgICAgICAgICAgICBDcmFzaFN5c3RlbTo6Z2V0KCktPmdldENyYXNoU2VydmljZUNtZExpbmUocGlwZSwgcHJvYyk7CisgICAgRVhQRUNUX0VRKHRtcDEuc2l6ZSgpLCA3KTsKKyAgICBFWFBFQ1RfU1RSRVEodG1wMVswXS5jX3N0cigpLCBnZXRDcmFzaFNlcnZpY2VQYXRoKCkuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRtcDFbMV0uY19zdHIoKSwgIi1waXBlIik7CisgICAgRVhQRUNUX1NUUkVRKHRtcDFbMl0uY19zdHIoKSwgcGlwZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEodG1wMVszXS5jX3N0cigpLCAiLXBwaWQiKTsKKyAgICBFWFBFQ1RfU1RSRVEodG1wMVs0XS5jX3N0cigpLCBwcm9jLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSh0bXAxWzVdLmNfc3RyKCksICItZGF0YS1kaXIiKTsKKyAgICAvLyBjaGVjayB0aGF0IGFyZ3VtZW50IG9mIC1kYXRhLWRpciBzdGFydHMgd2l0aCB0ZW1wIGRpcmVjdG9yeSBuYW1lCisgICAgY29uc3QgYXV0byB0ZW1wRGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0VGVtcERpcigpOworICAgIEVYUEVDVF9UUlVFKHRtcDFbNl0uc2l6ZSgpID4gdGVtcERpci5zaXplKCkgKyAyKTsKKyAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcodG1wMVs2XS5jX3N0cigpLCB0ZW1wRGlyLnNpemUoKSksIHRlbXBEaXIpOworICAgIEVYUEVDVF9UUlVFKFBhdGhVdGlsczo6aXNEaXJTZXBhcmF0b3IodG1wMVs2XVt0ZW1wRGlyLnNpemUoKV0pKTsKKyAgICBFWFBFQ1RfRkFMU0UoUGF0aFV0aWxzOjppc0RpclNlcGFyYXRvcih0bXAxWzZdW3RlbXBEaXIuc2l6ZSgpICsgMV0pKTsKK30KKworVEVTVF9GKENyYXNoU3lzdGVtVGVzdCwgdmFsaWRhdGVQYXRoc19WYWxpZFBhdGhzKSB7CisgICAgbWFrZUNhQnVuZGxlKCk7CisgICAgbWFrZUNyYXNoU2VydmljZSgpOworICAgIG1ha2VCcmVha3BhZEhvbWUoKTsKKyAgICBFWFBFQ1RfVFJVRShDcmFzaFN5c3RlbTo6Z2V0KCktPnZhbGlkYXRlUGF0aHMoKSk7Cit9CisKK1RFU1RfRihDcmFzaFN5c3RlbVRlc3QsIHZhbGlkYXRlUGF0aHNfTm9DcmFzaFNlcnZpY2VGaWxlKSB7CisgICAgbWFrZUNhQnVuZGxlKCk7CisgICAgbWFrZUJyZWFrcGFkSG9tZSgpOworICAgIEVYUEVDVF9GQUxTRShDcmFzaFN5c3RlbTo6Z2V0KCktPnZhbGlkYXRlUGF0aHMoKSk7Cit9CisKK1RFU1RfRihDcmFzaFN5c3RlbVRlc3QsIHZhbGlkYXRlUGF0aHNfQ3Jhc2hTZXJ2aWNlSXNEaXIpIHsKKyAgICBFWFBFQ1RfVFJVRShnZXRUZXN0RGlyKCktPm1ha2VTdWJEaXIoZ2V0Q3Jhc2hTZXJ2aWNlVGVzdERpclBhdGgoKS5jX3N0cigpKSk7CisgICAgbWFrZUJyZWFrcGFkSG9tZSgpOworICAgIEVYUEVDVF9GQUxTRShDcmFzaFN5c3RlbTo6Z2V0KCktPnZhbGlkYXRlUGF0aHMoKSk7Cit9CisKK1RFU1RfRihDcmFzaFN5c3RlbVRlc3QsIHZhbGlkYXRlUGF0aHNfTm9DYUJ1bmRsZSkgeworICAgIG1ha2VDcmFzaFNlcnZpY2UoKTsKKyAgICBtYWtlQnJlYWtwYWRIb21lKCk7CisgICAgRVhQRUNUX0ZBTFNFKENyYXNoU3lzdGVtOjpnZXQoKS0+dmFsaWRhdGVQYXRocygpKTsKK30KKworVEVTVF9GKENyYXNoU3lzdGVtVGVzdCwgdmFsaWRhdGVQYXRoc19DYUJ1bmRsZUlzRGlyKSB7CisgICAgRVhQRUNUX1RSVUUoZ2V0VGVzdERpcigpLT5tYWtlU3ViRGlyKCJwcm9nZGlyL2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShnZXRUZXN0RGlyKCktPm1ha2VTdWJEaXIoInByb2dkaXIvbGliL2NhLWJ1bmRsZS5wZW0iKSk7CisgICAgbWFrZUNyYXNoU2VydmljZSgpOworICAgIG1ha2VCcmVha3BhZEhvbWUoKTsKKyAgICBFWFBFQ1RfRkFMU0UoQ3Jhc2hTeXN0ZW06OmdldCgpLT52YWxpZGF0ZVBhdGhzKCkpOworfQorCitURVNUX0YoQ3Jhc2hTeXN0ZW1UZXN0LCB2YWxpZGF0ZVBhdGhzX2NyYXNoRGlySXNGaWxlKSB7CisgICAgbWFrZUNhQnVuZGxlKCk7CisgICAgbWFrZUNyYXNoU2VydmljZSgpOworICAgIG1ha2VBbmRyb2lkSG9tZSgpOworICAgIEVYUEVDVF9UUlVFKGdldFRlc3REaXIoKS0+bWFrZVN1YkZpbGUoImhvbWVkaXIvLmFuZHJvaWQvYnJlYWtwYWQiKSk7CisgICAgRVhQRUNUX0ZBTFNFKENyYXNoU3lzdGVtOjpnZXQoKS0+dmFsaWRhdGVQYXRocygpKTsKK30KKworLy8gIFRoaXMgdGVzdCBpcyBhIGZhbHNlIHBhc3MuICBDdXJyZW50bHkgdmFsaWRhdGVQYXRocyBjYWxscyBhCisvLyAgICB1dGlscy9wYXRoczo6cGF0aF9ta2Rpcl9pZl9uZWVkZWQgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBicmVha3BhZAorLy8gICAgZGlyZWN0b3J5IGlmIG5vdCBhbHJlYWR5IGV4aXN0aW5nLgorLy8gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBTeXN0ZW0vVGVzdFN5c3RlbSBpbmZyYXN0cnVjdHVyZSBhbmQgZG9lcworLy8gICAgaWdub3JlcyB0aGUgdGVzdHJvb3QsIGluc3RlYWQgdHJ5aW5nIHRvIG1rZGlyIGF0IHRoZSBzeXN0ZW0gcm9vdCAiLyIuCisvLyAgICBUaGlzIGhhcyB0aGUgc2FtZSByZXN1bHQgYXMgaWYgdGhlIEhPTUUgZGlyZWN0b3J5IHBhdGggd2FzIG5vdCB3cml0YWJsZS4KKy8vICBURVNUKENyYXNoU3lzdGVtVGVzdCwgdmFsaWRhdGVQYXRoc19ub25Xcml0YWJsZUhvbWVEaXIpIHsKKy8vICAgICAgIG1ha2VDYUJ1bmRsZSgpOworLy8gICAgICAgbWFrZUNyYXNoU2VydmljZSgpOworLy8gICAgICAgRVhQRUNUX0ZBTFNFKENyYXNoU3lzdGVtOjpnZXQoKS0+dmFsaWRhdGVQYXRocygpKTsKKy8vfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkOGY4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjZW5kaWYKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gRW5hYmxlIGNyYXNoIHJlcG9ydGluZyBieSBzdGFydGluZyBjcmFzaCBzZXJ2aWNlIHByb2Nlc3MsIGluaXRpYWxpemluZyBhbmQKKy8vIGF0dGFjaGluZyBjcmFzaCBoYW5kbGVycy4gIFNob3VsZCBvbmx5IGJlIHJ1biBvbmNlIGF0IHRoZSBzdGFydCBvZiB0aGUKKy8vIHByb2dyYW0uICBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2Ugb24gZmFpbHVyZSB3aGljaAorLy8gY2FuIG9jY3VyIG9uIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vICAgIE1pc3NpbmcgZXhlY3V0YWJsZXMgLyByZXNvdXJjZSBmaWxlcworLy8gICAgTm9uIHdyaXRhYmxlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIGNyYXNoIGR1bXBzCisvLyAgICBVbmFibGUgdG8gc3RhcnQgY3Jhc2ggc2VydmljZSBwcm9jZXNzIChpbml0IGZhaWx1cmUgb3IgdGltZW91dCBvbgorLy8gICAgcmVzcG9uc2UpCisvLyAgICBVbmFibGUgdG8gY29ubmVjdCB0byBjcmFzaCBzZXJ2aWNlIHByb2Nlc3MKKy8vICAgIFN1Y2Nlc3Mgb24gcHJldmlvdXMgY2FsbAorYm9vbCBjcmFzaGhhbmRsZXJfaW5pdCh2b2lkKTsKKworLy8gQWJvcnQgdGhlIHByb2dyYW0gZXhlY3V0aW9uIGltbWlkaWF0ZWx5OyB3aGVuIHNob3dpbmcgYSBjcmFzaCBkaWFsb2csIHVzZQorLy8gc2hvdyB8bWVzc2FnZXwgdG8gdGhlIHVzZXIgaW5zdGVhZCBvZiBzdGFuZGFyZCAnZW11bGF0b3IgaGF2ZSBjcmFzaGVkJwordm9pZCBjcmFzaGhhbmRsZXJfZGllKGNvbnN0IGNoYXIqIG1lc3NhZ2UpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7CisKKy8vIEEgdmFyaWFkaWMgb3ZlcmxvYWQgd2l0aCBDIGludGVyZmFjZQordm9pZCBjcmFzaGhhbmRsZXJfZGllX2Zvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CisKKy8vIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgY3Jhc2ggcmVwb3J0LiBPbmUgaXMgZnJlZSB0byBmcmVlIGJvdGggb2YgdGhlCisvLyBwYXJhbWV0ZXJzIGFmdGVyIHRoZSBjYWxsIC0gZnVuY3Rpb24gZG9lc24ndCB0YWtlIG93bmVyc2hpcCBvZiB0aGVtLgordm9pZCBjcmFzaGhhbmRsZXJfYWRkX3N0cmluZyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBzdHJpbmcpOworCisvLyBUcmFjayBjcmFzaGVzIG9uIGV4aXQuCit2b2lkIGNyYXNoaGFuZGxlcl9leGl0bW9kZShjb25zdCBjaGFyKiBtZXNzYWdlKTsKKworLy8gQ29weSB0aGUgZmlsZW5hbWUgaW5kaWNhdGVkIGJ5IHxzb3VyY2V8IHRvIGEgZmlsZSBjYWxsZWQgfGRlc3RpbmF0aW9ufCBpbiB0aGUKKy8vIGNyYXNoIHJlcG9ydCBhdHRhY2htZW50IGRpcmVjdG9yeS4gSWYgdGhpcyBpbnN0YW5jZSBvZiB0aGUgZW11bGF0b3IgY3Jhc2hlcworLy8gdGhlIGRlc3RpbmF0aW9uIGZpbGUgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgY3Jhc2ggcmVwb3J0IHdpdGggdGhlIG5hbWUKKy8vIHxkZXN0aW5hdGlvbnwuCitib29sIGNyYXNoaGFuZGxlcl9jb3B5X2F0dGFjaG1lbnQoY29uc3QgY2hhciogZGVzdGluYXRpb24sIGNvbnN0IGNoYXIqIHNvdXJjZSk7CisKK0FORFJPSURfRU5EX0hFQURFUgorCisjaWZkZWYgX19jcGx1c3BsdXMKKy8vIEEgdmFyaWFkaWMgb3ZlcmxvYWQgZm9yIGEgY29udmVuaWVudCBtZXNzYWdlIGZvcm1hdHRpbmcKK3RlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgordm9pZCBjcmFzaGhhbmRsZXJfZGllKGNvbnN0IGNoYXIqIGZvcm1hdCwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBjaGFyIGJ1ZmZlclsyMDQ4XSA9IHt9OyAgICAvLyAyMDQ4IGlzIGVub3VnaCBmb3IgZXZlcnlvbmUgOykKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSwgZm9ybWF0LAorICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVucGFja0Zvcm1hdEFyZyhzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykpLi4uKTsKKyAgICBjcmFzaGhhbmRsZXJfZGllKGJ1ZmZlcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9tYWluLWNyYXNoLXNlcnZpY2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L21haW4tY3Jhc2gtc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMmQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC9tYWluLWNyYXNoLXNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMTc5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLyoKKyAqIFRoaXMgaXMgdGhlIHNvdXJjZSBmb3IgdGhlIGNyYXNoIHNlcnZpY2UgdGhhdCBpcyBzcGF3bmVkIGJ5IHRoZSBtYWluCisgKiBlbXVsYXRvci4gIEl0IGlzIHNwYXduZWQgb25jZSBwZXIgZW11bGF0b3IgaW5zdGFuY2UgYW5kIHNlcnZpY2VzIHRoYXQKKyAqIGVtdWxhdG9yIGluc3RhbmNlIGluIGNhc2Ugb2YgYSBjcmFzaC4KKyAqCisgKiBDb25maXJtYXRpb24gdG8gc2VuZCB0aGUgY3Jhc2ggZHVtcCBpcyByZXF1ZXN0ZWQgYnkgYSBndWkgZWxlbWVudC4KKyAqCisgKiBPbmNlIGNvbmZpcm1hdGlvbiBpcyBnaXZlbiwgdGhlIGNyYXNoIGR1bXAgaXMgY3VybCdkIHRvIGdvb2dsZSBjcmFzaCBzZXJ2ZXJzLgorICovCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1V1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoU2VydmljZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L3VpL0NvbmZpcm1EaWFsb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3F0L3F0X3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvaW5pdC1xdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL1N5bmNNZXRyaWNzUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC92ZXJzaW9uLmgiCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRUHJvZ3Jlc3NEaWFsb2c+CisjaW5jbHVkZSA8UVNldHRpbmdzPgorI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRVGhyZWFkPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjZGVmaW5lIEUoLi4uKSBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lIFcoLi4uKSBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgRCguLi4pIFZFUkJPU0VfUFJJTlQoaW5pdCwgX19WQV9BUkdTX18pCisjZGVmaW5lIEkoLi4uKSBwcmludGYoX19WQV9BUkdTX18pCisKK3N0YXRpYyBib29sIGRpc3BsYXlDb25maXJtRGlhbG9nKAorICAgICAgICBhbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hTZXJ2aWNlKiBjcmFzaHNlcnZpY2UsCisgICAgICAgIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSByZXBvcnRQcmVmZXJlbmNlLAorICAgICAgICBjb25zdCBjaGFyKiBkYXRhX2RpcikgeworICAgIGlmIChyZXBvcnRQcmVmZXJlbmNlID09IFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9ORVZFUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjcmFzaHNlcnZpY2UtPmdldER1bXBNZXNzYWdlKCkuZW1wdHkoKSAmJgorICAgICAgICBjcmFzaHNlcnZpY2UtPmRpZENyYXNoT25FeGl0KCkgJiYKKyAgICAgICAgcmVwb3J0UHJlZmVyZW5jZSAhPSBVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfQUxXQVlTKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDb25maXJtRGlhbG9nIG1zZ0JveChudWxscHRyLCBjcmFzaHNlcnZpY2UsIHJlcG9ydFByZWZlcmVuY2UsIGRhdGFfZGlyKTsKKworICAgIGlmIChyZXBvcnRQcmVmZXJlbmNlID09IFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BU0spIHsKKyAgICAgICAgbXNnQm94LnNob3coKTsKKyAgICAgICAgaW50IHJldCA9IG1zZ0JveC5leGVjKCk7CisgICAgICAgIHJldHVybiByZXQgPT0gQ29uZmlybURpYWxvZzo6QWNjZXB0ZWQ7CisgICAgfSBlbHNlIGlmIChyZXBvcnRQcmVmZXJlbmNlID09IFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BTFdBWVMpIHsKKyAgICAgICAgbXNnQm94LnNlbmRSZXBvcnQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZmluYWxpemVNZXRyaWNzKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZXRyaWNzOworCisgICAgRCgiRmluYWxpemluZyB0aGUgbWV0cmljcyBsb2cgZmlsZSIpOworCisgICAgY29uc3QgYXV0byBjcmFzaGVkU2Vzc2lvbnMgPQorICAgICAgICAgICAgRmlsZU1ldHJpY3NXcml0ZXI6OmZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzKAorICAgICAgICAgICAgICAgIGdldFNwb29sRGlyZWN0b3J5KCkpOworICAgIEQoImZvdW5kICVkIGNyYXNoZWQgc2Vzc2lvbnMiLCAoaW50KWNyYXNoZWRTZXNzaW9ucy5zaXplKCkpOworICAgIGlmIChjcmFzaGVkU2Vzc2lvbnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byB3cml0ZXIgPSBGaWxlTWV0cmljc1dyaXRlcjo6Y3JlYXRlKAorICAgICAgICAgICAgZ2V0U3Bvb2xEaXJlY3RvcnkoKSwgYW5kcm9pZDo6YmFzZTo6VXVpZDo6Z2VuZXJhdGUoKS50b1N0cmluZygpLAorICAgICAgICAgICAgMCwgbnVsbHB0ciwgMCk7ICAvLyBObyByZWNvcmQgb3IgdGltZSBsaW1pdHMgZm9yIHRoaXMgd3JpdGVyLgorICAgIGNvbnN0IGF1dG8gcmVwb3J0ZXIgPQorICAgICAgICAgICAgTWV0cmljc1JlcG9ydGVyOjpQdHIobmV3IFN5bmNNZXRyaWNzUmVwb3J0ZXIoc3RkOjptb3ZlKHdyaXRlcikpKTsKKyAgICByZXBvcnRDcmFzaE1ldHJpY3MoKnJlcG9ydGVyLCBjcmFzaGVkU2Vzc2lvbnMpOworfQorCisvKiBNYWluIHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIC8vIFBhcnNlIGFyZ3MKKyAgICBjb25zdCBjaGFyKiBzZXJ2aWNlX2FyZyA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogZHVtcF9maWxlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBkYXRhX2RpciA9IG51bGxwdHI7CisgICAgaW50IHBwaWQgPSAwOworICAgIGZvciAoaW50IG5uID0gMTsgbm4gPCBhcmdjOyBubisrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG9wdCA9IGFyZ3Zbbm5dOworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICItcGlwZSIpKSB7CisgICAgICAgICAgICBpZiAobm4gKyAxIDwgYXJnYykgeworICAgICAgICAgICAgICAgIG5uKys7CisgICAgICAgICAgICAgICAgc2VydmljZV9hcmcgPSBhcmd2W25uXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdCwgIi1kdW1wZmlsZSIpKSB7CisgICAgICAgICAgICBpZiAobm4gKyAxIDwgYXJnYykgeworICAgICAgICAgICAgICAgIG5uKys7CisgICAgICAgICAgICAgICAgZHVtcF9maWxlID0gYXJndltubl07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICItcHBpZCIpKSB7CisgICAgICAgICAgICBpZiAobm4gKyAxIDwgYXJnYykgeworICAgICAgICAgICAgICAgIG5uKys7CisgICAgICAgICAgICAgICAgcHBpZCA9IGF0b2koYXJndltubl0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiLWRhdGEtZGlyIikpIHsKKyAgICAgICAgICAgIGlmIChubiArIDEgPCBhcmdjKSB7CisgICAgICAgICAgICAgICAgbm4rKzsKKyAgICAgICAgICAgICAgICBkYXRhX2RpciA9IGFyZ3Zbbm5dOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYXV0byBjcmFzaHNlcnZpY2UgPSA6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFNlcnZpY2U6Om1ha2VDcmFzaFNlcnZpY2UoCisgICAgICAgICAgICBFTVVMQVRPUl9WRVJTSU9OX1NUUklORywgRU1VTEFUT1JfQlVJTERfU1RSSU5HLCBkYXRhX2Rpcik7CisgICAgaWYgKGR1bXBfZmlsZSAmJgorICAgICAgICA6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFN5c3RlbTo6Z2V0KCktPmlzRHVtcChkdW1wX2ZpbGUpKSB7CisgICAgICAgIGNyYXNoc2VydmljZS0+c2V0RHVtcEZpbGUoZHVtcF9maWxlKTsKKyAgICB9IGVsc2UgaWYgKHNlcnZpY2VfYXJnICYmIHBwaWQpIHsKKyAgICAgICAgaWYgKCFjcmFzaHNlcnZpY2UtPnN0YXJ0Q3Jhc2hTZXJ2ZXIoc2VydmljZV9hcmcpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3Jhc2hzZXJ2aWNlLT53YWl0Rm9yRHVtcEZpbGUocHBpZCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGNyYXNoc2VydmljZS0+c3RvcENyYXNoU2VydmVyKCk7CisKKyAgICAgICAgZmluYWxpemVNZXRyaWNzKCk7CisKKyAgICAgICAgaWYgKGNyYXNoc2VydmljZS0+Z2V0RHVtcEZpbGUoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBObyBjcmFzaCBkdW1wIGNyZWF0ZWQKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgRSgiTXVzdCBzdXBwbHkgYSBkdW1wIHBhdGhcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWNyYXNoc2VydmljZS0+dmFsaWREdW1wRmlsZSgpKSB7CisgICAgICAgIEUoIkNyYXNoUGF0aCAnJXMnIGlzIGludmFsaWRcbiIsIGNyYXNoc2VydmljZS0+Z2V0RHVtcEZpbGUoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgY3Jhc2hzZXJ2aWNlLT5yZXRyaWV2ZUR1bXBNZXNzYWdlKCk7CisgICAgY3Jhc2hzZXJ2aWNlLT5jb2xsZWN0UHJvY2Vzc0xpc3QoKTsKKworICAgIFFBcHBsaWNhdGlvbiBhcHAoYXJnYywgYXJndik7CisgICAgYW5kcm9pZFF0RGVmYXVsdEluaXQoKTsKKworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBhdXRvIHJlcG9ydFByZWZlcmVuY2UgPQorICAgICAgICBzdGF0aWNfY2FzdDxVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfVkFMVUU+KAorICAgICAgICAgICAgc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFLCAwKS50b0ludCgpKTsKKworICAgIGlmICghZGlzcGxheUNvbmZpcm1EaWFsb2coY3Jhc2hzZXJ2aWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0UHJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZGlyKSAgICAgICAgICApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvdGVzdGluZy9UZXN0Q3Jhc2hTeXN0ZW0uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC90ZXN0aW5nL1Rlc3RDcmFzaFN5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvdGVzdGluZy9UZXN0Q3Jhc2hTeXN0ZW0uaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY3Jhc2hyZXBvcnQgeworCitjbGFzcyBUZXN0Q3Jhc2hTeXN0ZW0gOiBwdWJsaWMgQ3Jhc2hTeXN0ZW0geworcHVibGljOgorICAgIFRlc3RDcmFzaFN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyYgY3Jhc2hEaXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjcmFzaFVSTCkKKyAgICAgICAgOiBtUHJldkNyYXNoU3lzdGVtKENyYXNoU3lzdGVtOjpzZXRGb3JUZXN0aW5nKHRoaXMpKSwKKyAgICAgICAgICBtQ3Jhc2hEaXIoY3Jhc2hEaXIpLAorICAgICAgICAgIG1DcmFzaFVSTChjcmFzaFVSTCkge30KKworICAgIHZpcnR1YWwgflRlc3RDcmFzaFN5c3RlbSgpIHsgQ3Jhc2hTeXN0ZW06OnNldEZvclRlc3RpbmcobVByZXZDcmFzaFN5c3RlbSk7IH0KKworICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldENyYXNoRGlyZWN0b3J5KHZvaWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1DcmFzaERpcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRDcmFzaFVSTCh2b2lkKSBvdmVycmlkZSB7IHJldHVybiBtQ3Jhc2hVUkw7IH0KKworcHJpdmF0ZToKKyAgICBDcmFzaFN5c3RlbSogbVByZXZDcmFzaFN5c3RlbTsKKyAgICBzdGQ6OnN0cmluZyBtQ3Jhc2hEaXI7CisgICAgc3RkOjpzdHJpbmcgbUNyYXNoVVJMOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNyYXNocmVwb3J0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L3Rlc3RpbmcvbWFpbi10ZXN0LWNyYXNoZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L3Rlc3RpbmcvbWFpbi10ZXN0LWNyYXNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzZlM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvdGVzdGluZy9tYWluLXRlc3QtY3Jhc2hlci5jcHAKQEAgLTAsMCArMSw4NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHNvdXJjZSBmb3IgYSBkdW1teSBjcmFzaCBwcm9ncmFtIHRoYXQgc3RhcnRzIHRoZSBjcmFzaCByZXBvcnRlcgorICogYW5kIHRoZW4gY3Jhc2hlcyBkdWUgdG8gYW4gdW5kZWZpbmVkIHN5bWJvbAorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKwordm9pZCBjcmFzaG1lKGludCBhcmcsIGJvb2wgbm9jcmFzaCwgaW50IGRlbGF5X21zKSB7CisgICAgaWYgKGRlbGF5X21zKSB7CisgICAgICAgIHByaW50ZigiRGVsYXlpbmcgY3Jhc2ggYnkgJWQgbXNcbiIsIGRlbGF5X21zKTsKKyAgICAgICAgc2xlZXBfbXMoZGVsYXlfbXMpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZzsgaSsrKSB7CisgICAgICAgIGlmICghbm9jcmFzaCkgeworICAgICAgICAgICAgcHJpbnRmKCJDcmFzaCBNZSBOb3dcbiIpOworICAgICAgICAgICAgYXNtKCIuYnl0ZSAwIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIE1haW4gcm91dGluZSAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgY29uc3QgY2hhciogcGlwZSA9IG51bGxwdHI7CisgICAgYm9vbCBub2NyYXNoID0gZmFsc2U7CisgICAgYm9vbCBub2F0dGFjaCA9IGZhbHNlOworICAgIGludCBkZWxheV9tcyA9IDA7CisgICAgaW50IG5uOworICAgIGZvciAobm4gPSAxOyBubiA8IGFyZ2M7IG5uKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogb3B0ID0gYXJndltubl07CisgICAgICAgIGlmICghc3RyY21wKG9wdCwgIi1waXBlIikpIHsKKyAgICAgICAgICAgIGlmIChubiArIDEgPCBhcmdjKSB7CisgICAgICAgICAgICAgICAgbm4rKzsKKyAgICAgICAgICAgICAgICBwaXBlID0gYXJndltubl07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICItbm9jcmFzaCIpKSB7CisgICAgICAgICAgICBub2NyYXNoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdCwgIi1ub2F0dGFjaCIpKSB7CisgICAgICAgICAgICBub2F0dGFjaCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICItZGVsYXlfbXMiKSkgeworICAgICAgICAgICAgaWYgKG5uICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgICAgICBubisrOworICAgICAgICAgICAgICAgIGRlbGF5X21zID0gYXRvaShhcmd2W25uXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXBpcGUpIHsKKyAgICAgICAgZGVycm9yKCJVc2FnZTogLXBpcGUgPHBpcGU+IDwtbm9jcmFzaD4gPC1ub2F0dGFjaD4gPC1kZWxheV9tcyB4eD5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICA6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFN5c3RlbTo6Q3Jhc2hQaXBlIGNyYXNocGlwZShwaXBlKTsKKworICAgIGlmICghbm9hdHRhY2gpIHsKKyAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoQ3Jhc2hIYW5kbGVyKAorICAgICAgICAgICAgICAgICAgICBjcmFzaHBpcGUpKSB7CisgICAgICAgICAgICBkZXJyb3IoIkNvdWxkbid0IGF0dGFjaCB0byBjcmFzaCBoYW5kbGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJOb3QgYXR0YWNoaW5nIHRvIGNyYXNoIHBpcGVcbiIpOworICAgIH0KKworICAgIGNyYXNobWUoYXJnYywgbm9jcmFzaCwgZGVsYXlfbXMpOworICAgIHByaW50ZigidGVzdCBjcmFzaGVyIGRvbmVcbiIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L3VpL0NvbmZpcm1EaWFsb2cuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L3VpL0NvbmZpcm1EaWFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGY3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3Jhc2hyZXBvcnQvdWkvQ29uZmlybURpYWxvZy5jcHAKQEAgLTAsMCArMSw0MTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L3VpL0NvbmZpcm1EaWFsb2cuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSA8UUV2ZW50TG9vcD4KKyNpbmNsdWRlIDxRRnV0dXJlV2F0Y2hlcj4KKyNpbmNsdWRlIDxRU2Nyb2xsQmFyPgorI2luY2x1ZGUgPFFTZXR0aW5ncz4KKyNpbmNsdWRlICJRdENvbmN1cnJlbnQvcXRjb25jdXJyZW50cnVuLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIGtNZXNzYWdlQm94VGl0bGVbXSA9ICJBbmRyb2lkIEVtdWxhdG9yIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtNZXNzYWdlQm94TWVzc2FnZUludGVybmFsRXJyb3JbXSA9CisgICAgICAgICI8cD5BbmRyb2lkIEVtdWxhdG9yIGNsb3NlZCBiZWNhdXNlIG9mIGFuIGludGVybmFsIGVycm9yOjwvcD4iOworc3RhdGljIGNvbnN0IGNoYXIga01lc3NhZ2VCb3hNZXNzYWdlW10gPQorICAgICAgICAiPHA+QW5kcm9pZCBFbXVsYXRvciBjbG9zZWQgdW5leHBlY3RlZGx5LjwvcD4iOworc3RhdGljIGNvbnN0IGNoYXIga01lc3NhZ2VCb3hNZXNzYWdlRm9vdGVyW10gPQorICAgICAgICAiPHA+RG8geW91IHdhbnQgdG8gc2VuZCBhIGNyYXNoIHJlcG9ydCBhYm91dCB0aGUgcHJvYmxlbT88L3A+IjsKK3N0YXRpYyBjb25zdCBjaGFyIGtNZXNzYWdlQm94TWVzc2FnZURldGFpbEhXW10gPQorICAgICAgICAiQW4gZXJyb3IgcmVwb3J0IGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHNob3duIGJlbG93LCAiCisgICAgICAgICJpbmNsdWRpbmcgc3lzdGVtLXNwZWNpZmljIGluZm9ybWF0aW9uLCAiCisgICAgICAgICJ3aWxsIGJlIHNlbnQgdG8gR29vZ2xlJ3MgQW5kcm9pZCB0ZWFtIHRvIGhlbHAgaWRlbnRpZnkgIgorICAgICAgICAiYW5kIGZpeCB0aGUgcHJvYmxlbS4gIgorICAgICAgICAiPGEgaHJlZj1cImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcG9saWNpZXMvcHJpdmFjeS9cIj5Qcml2YWN5ICIKKyAgICAgICAgIlBvbGljeTwvYT4uIjsKKworc3RhdGljIGNvbnN0IGNoYXIga0ljb25GaWxlW10gPSAiZW11bGF0b3JfaWNvbl8xMjgucG5nIjsKKworZXh0ZXJuICJDIiBjb25zdCB1bnNpZ25lZCBjaGFyKiBhbmRyb2lkX2VtdWxhdG9yX2ljb25fZmluZChjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBzaXplKTsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6SW5pRmlsZTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhdGhVdGlsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXc7Cit1c2luZyBhbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hTZXJ2aWNlOworCitDb25maXJtRGlhbG9nOjpDb25maXJtRGlhbG9nKFFXaWRnZXQqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3Jhc2hTZXJ2aWNlKiBjcmFzaHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSByZXBvcnRQcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXBvcnRpbmdEaXIpCisgICAgOiBRRGlhbG9nKHBhcmVudCksCisgICAgICBtQ3Jhc2hTZXJ2aWNlKGNyYXNoc2VydmljZSksCisgICAgICBtUmVwb3J0UHJlZmVyZW5jZShyZXBvcnRQcmVmZXJlbmNlKSwKKyAgICAgIG1EZXRhaWxzSGlkZGVuKHRydWUpLAorICAgICAgbURpZEdldFN5c0luZm8oZmFsc2UpLAorICAgICAgbURpZFVwZGF0ZURldGFpbHMoZmFsc2UpLAorICAgICAgbVJlcG9ydGluZ0RpcihyZXBvcnRpbmdEaXIpIHsKKworICAgIG1TZW5kQnV0dG9uID0gbmV3IFFQdXNoQnV0dG9uKHRyKCJTZW5kIHJlcG9ydCIpKTsKKyAgICBtRG9udFNlbmRCdXR0b24gPSBuZXcgUVB1c2hCdXR0b24odHIoIkRvbid0IHNlbmQiKSk7CisgICAgbURldGFpbHNCdXR0b24gPSBuZXcgUVB1c2hCdXR0b24odHIoIiIpKTsKKyAgICBtTGFiZWxUZXh0ID0gbmV3IFFMYWJlbChRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKGNvbnN0cnVjdER1bXBNZXNzYWdlKCkpKTsKKyAgICBtSW5mb1RleHQgPSBuZXcgUUxhYmVsKGtNZXNzYWdlQm94TWVzc2FnZURldGFpbEhXKTsKKyAgICBtSWNvbiA9IG5ldyBRTGFiZWwoKTsKKyAgICBtQ29tbWVudHNUZXh0ID0gbmV3IFFUZXh0RWRpdCgpOworICAgIG1EZXRhaWxzVGV4dCA9IG5ldyBRUGxhaW5UZXh0RWRpdCgpOworICAgIG1Qcm9ncmVzc1RleHQgPSBuZXcgUUxhYmVsKHRyKCJXb3JraW5nLi4uIikpOworICAgIG1Qcm9ncmVzcyA9IG5ldyBRUHJvZ3Jlc3NCYXI7CisgICAgbVNhdmVQcmVmZXJlbmNlID0KKyAgICAgICAgbmV3IFFDaGVja0JveCh0cigiQXV0b21hdGljYWxseSBzZW5kIGZ1dHVyZSBjcmFzaCByZXBvcnRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKFJlLWNvbmZpZ3VyZSBpbiBFbXVsYXRvciBzZXR0aW5ncyBtZW51KSIpKTsKKworICAgIC8vIENyZWF0ZSBhIGNoZWNrYm94LCBidXQgZG9uJ3QgdXNlIGl0IHVubGVzcyB0aGUgR1BVIGNhdXNlZCB0aGUgY3Jhc2gKKyAgICBtU29mdHdhcmVHUFUgPSBuZXcgUUNoZWNrQm94KHRyKCJVc2Ugc29mdHdhcmUgcmVuZGVyaW5nIGZvciB0aGlzIGRldmljZSIpKTsKKyAgICBtU29mdHdhcmVHUFUtPnNldENoZWNrZWQoZmFsc2UpOworCisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIGJvb2wgc2F2ZV9wcmVmZXJlbmNlX2NoZWNrZWQgPQorICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1NBVkVQUkVGRVJFTkNFX0NIRUNLRUQsIDEpLnRvSW50KCk7CisgICAgbVNhdmVQcmVmZXJlbmNlLT5zZXRDaGVja2VkKHNhdmVfcHJlZmVyZW5jZV9jaGVja2VkKTsKKyAgICBtU2F2ZVByZWZlcmVuY2UtPnNob3coKTsKKworICAgIG1TdWdnZXN0aW9uVGV4dCA9IG5ldyBRTGFiZWwodHIoIlN1Z2dlc3Rpb24ocykgYmFzZWQgb24gY3Jhc2ggaW5mbzpcblxuIikpOworICAgIG1TdWdnZXN0aW9uVGV4dC0+c2V0VGV4dEludGVyYWN0aW9uRmxhZ3MoUXQ6OlRleHRTZWxlY3RhYmxlQnlNb3VzZSk7CisKKyAgICBtRXh0ZW5zaW9uID0gbmV3IFFXaWRnZXQ7CisgICAgbVllc05vQnV0dG9uQm94ID0gbmV3IFFEaWFsb2dCdXR0b25Cb3goUXQ6Okhvcml6b250YWwpOworICAgIG1EZXRhaWxzQnV0dG9uQm94ID0gbmV3IFFEaWFsb2dCdXR0b25Cb3goUXQ6Okhvcml6b250YWwpOworICAgIG1Db21tZW50ID0gbmV3IFFXaWRnZXQ7CisKKyAgICBzaXplX3QgaWNvbl9zaXplOworICAgIFFQaXhtYXAgaWNvbjsKKworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGljb25fZGF0YSA9CisgICAgICAgICAgICBhbmRyb2lkX2VtdWxhdG9yX2ljb25fZmluZChrSWNvbkZpbGUsICZpY29uX3NpemUpOworCisgICAgaWNvbi5sb2FkRnJvbURhdGEoaWNvbl9kYXRhLCBpY29uX3NpemUpOworCisgICAgbUljb24tPnNldFBpeG1hcChpY29uKTsKKyAgICBtU2VuZEJ1dHRvbi0+c2V0RGVmYXVsdCh0cnVlKTsKKyAgICBtSW5mb1RleHQtPnNldFdvcmRXcmFwKHRydWUpOworICAgIG1JbmZvVGV4dC0+c2V0T3BlbkV4dGVybmFsTGlua3ModHJ1ZSk7CisgICAgbUNvbW1lbnRzVGV4dC0+c2V0UGxhY2Vob2xkZXJUZXh0KAorICAgICAgICAgICAgdHIoIihPcHRpb25hbCkgUGxlYXNlIGRlc2NyaWJlIHdoYXQgeW91IHdlcmUgZG9pbmcgd2hlbiB0aGUgY3Jhc2ggIgorICAgICAgICAgICAgICAgIm9jY3VyZWQuIikpOworICAgIG1EZXRhaWxzVGV4dC0+c2V0UmVhZE9ubHkodHJ1ZSk7CisgICAgbVByb2dyZXNzVGV4dC0+aGlkZSgpOworICAgIG1Qcm9ncmVzcy0+c2V0UmFuZ2UoMCwgMCk7CisgICAgbVByb2dyZXNzLT5oaWRlKCk7CisKKyAgICBjcmFzaHNlcnZpY2UtPnByb2Nlc3NDcmFzaCgpOworICAgIGF1dG8gc3VnZ2VzdGlvbnMgPSBjcmFzaHNlcnZpY2UtPmdldFN1Z2dlc3Rpb25zKCkuc3VnZ2VzdGlvbnM7CisgICAgYm9vbCBoYXZlR2Z4RmFpbHVyZSA9IGZhbHNlOworICAgIGlmICghc3VnZ2VzdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBpZiAoc3VnZ2VzdGlvbnMuZmluZCgKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6Y3Jhc2hyZXBvcnQ6OlN1Z2dlc3Rpb246OlVwZGF0ZUdmeERyaXZlcnMpICE9CisgICAgICAgICAgICBzdWdnZXN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgaGF2ZUdmeEZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgYWRkU3VnZ2VzdGlvbih0cigiSXQgYXBwZWFycyB0aGF0IHlvdXIgY29tcHV0ZXIncyBPcGVuR0wgZ3JhcGhpY3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHJpdmVyIGNyYXNoZWQuIFRoaXMgd2FzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9iYWJseSBjYXVzZWQgYnkgYSBidWcgaW4gdGhlIGRyaXZlciBvciBieSBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZyBpbiB5b3VyIGFwcCdzIE9wZW5HTCBjb2RlLlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3Ugc2hvdWxkIGNoZWNrIHlvdXIgbWFudWZhY3R1cmVyJ3Mgd2Vic2l0ZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gdXBkYXRlZCBncmFwaGljcyBkcml2ZXIuXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBjYW4gYWxzbyB0ZWxsIHRoZSBFbXVsYXRvciB0byB1c2Ugc29mdHdhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyaW5nIGZvciB0aGlzIGRldmljZS4gVGhpc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgYXZvaWQgZHJpdmVyIHByb2JsZW1zIGFuZCBtYWtlIGl0IGVhc2llciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBkZWJ1ZyB0aGUgT3BlbkdMIGNvZGUgaW5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdXIgYXBwLiIKKyNpZmRlZiBfX0FQUExFX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKFlvdSBtYXkgbmVlZCB0byByZWR1Y2UgeW91ciBzY3JlZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzb2x1dGlvbiB0byBydW4gdGhpcyB3YXkuKSIKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgfQorICAgICAgICBtU3VnZ2VzdGlvblRleHQtPnNob3coKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3VnZ2VzdGlvblRleHQtPmhpZGUoKTsKKyAgICB9CisKKyAgICBtWWVzTm9CdXR0b25Cb3gtPmFkZEJ1dHRvbihtU2VuZEJ1dHRvbiwgUURpYWxvZ0J1dHRvbkJveDo6QWNjZXB0Um9sZSk7CisgICAgbVllc05vQnV0dG9uQm94LT5hZGRCdXR0b24obURvbnRTZW5kQnV0dG9uLCBRRGlhbG9nQnV0dG9uQm94OjpSZWplY3RSb2xlKTsKKyAgICBtRGV0YWlsc0J1dHRvbkJveC0+YWRkQnV0dG9uKG1EZXRhaWxzQnV0dG9uLCBRRGlhbG9nQnV0dG9uQm94OjpBY3Rpb25Sb2xlKTsKKworICAgIHNldFdpbmRvd0ljb24oaWNvbik7CisgICAgY29ubmVjdChtU2VuZEJ1dHRvbiwgU0lHTkFMKGNsaWNrZWQoKSksIHRoaXMsIFNMT1Qoc2VuZFJlcG9ydCgpKSk7CisgICAgY29ubmVjdChtRG9udFNlbmRCdXR0b24sIFNJR05BTChjbGlja2VkKCkpLCB0aGlzLCBTTE9UKGRvbnRTZW5kUmVwb3J0KCkpKTsKKyAgICBjb25uZWN0KG1EZXRhaWxzQnV0dG9uLCBTSUdOQUwoY2xpY2tlZCgpKSwgdGhpcywgU0xPVChkZXRhaWx0b2dnbGUoKSkpOworCisgICAgUVZCb3hMYXlvdXQqIGNvbW1lbnRMYXlvdXQgPSBuZXcgUVZCb3hMYXlvdXQ7CisgICAgY29tbWVudExheW91dC0+c2V0TWFyZ2luKDApOworICAgIGNvbW1lbnRMYXlvdXQtPmFkZFdpZGdldChtQ29tbWVudHNUZXh0KTsKKyAgICBtQ29tbWVudC0+c2V0TGF5b3V0KGNvbW1lbnRMYXlvdXQpOworICAgIG1Db21tZW50LT5zZXRNYXhpbXVtSGVpZ2h0KAorICAgICAgICAgICAgUUZvbnRNZXRyaWNzKG1Db21tZW50c1RleHQtPmN1cnJlbnRGb250KCkpLmhlaWdodCgpICogNyk7CisKKyAgICBRVkJveExheW91dCogZXh0ZW5zaW9uTGF5b3V0ID0gbmV3IFFWQm94TGF5b3V0OworICAgIGV4dGVuc2lvbkxheW91dC0+c2V0TWFyZ2luKDApOworICAgIGV4dGVuc2lvbkxheW91dC0+YWRkV2lkZ2V0KG1EZXRhaWxzVGV4dCk7CisKKyAgICBtRXh0ZW5zaW9uLT5zZXRMYXlvdXQoZXh0ZW5zaW9uTGF5b3V0KTsKKworICAgIFFHcmlkTGF5b3V0KiBtYWluTGF5b3V0ID0gbmV3IFFHcmlkTGF5b3V0OworCisgICAgUUZyYW1lKiBoTGluZUZyYW1lID0gbmV3IFFGcmFtZSgpOworICAgIGhMaW5lRnJhbWUtPnNldEZyYW1lU2hhcGUoUUZyYW1lOjpITGluZSk7CisKKyAgICBpbnQgcm93ID0gMDsKKyAgICBtYWluTGF5b3V0LT5hZGRXaWRnZXQobUljb24sIHJvdywgMCk7CisgICAgbWFpbkxheW91dC0+YWRkV2lkZ2V0KG1MYWJlbFRleHQsIHJvdywgMSwgMSwgMik7CisKKyAgICByb3crKzsKKyAgICBtYWluTGF5b3V0LT5hZGRXaWRnZXQobVN1Z2dlc3Rpb25UZXh0LCByb3csIDAsIDEsIDMpOworCisgICAgaWYgKGhhdmVHZnhGYWlsdXJlKSB7CisgICAgICAgIHJvdysrOworICAgICAgICBtYWluTGF5b3V0LT5hZGRXaWRnZXQobVNvZnR3YXJlR1BVLCByb3csIDAsIDEsIDMpOworICAgIH0KKworICAgIHJvdysrOworICAgIG1haW5MYXlvdXQtPmFkZFdpZGdldChoTGluZUZyYW1lLCByb3csIDAsIDEsIDMpOworCisgICAgcm93Kys7CisgICAgbWFpbkxheW91dC0+YWRkV2lkZ2V0KG1JbmZvVGV4dCwgcm93LCAwLCAxLCAzKTsKKworICAgIHJvdysrOworICAgIG1haW5MYXlvdXQtPmFkZFdpZGdldChtQ29tbWVudCwgcm93LCAwLCAxLCAzKTsKKworICAgIHJvdysrOworICAgIG1haW5MYXlvdXQtPmFkZFdpZGdldChtU2F2ZVByZWZlcmVuY2UsIHJvdywgMCwgMSwgMyk7CisKKyAgICByb3crKzsKKyAgICBtYWluTGF5b3V0LT5hZGRXaWRnZXQobURldGFpbHNCdXR0b25Cb3gsIHJvdywgMCwgUXQ6OkFsaWduTGVmdCk7CisgICAgbWFpbkxheW91dC0+YWRkV2lkZ2V0KG1ZZXNOb0J1dHRvbkJveCwgcm93LCAxLCAxLCAyKTsKKworICAgIHJvdysrOworICAgIG1haW5MYXlvdXQtPmFkZFdpZGdldChtRXh0ZW5zaW9uLCByb3csIDAsIDEsIDMpOworCisgICAgcm93Kys7CisgICAgbWFpbkxheW91dC0+YWRkV2lkZ2V0KG1Qcm9ncmVzc1RleHQsIHJvdywgMCwgMSwgMyk7CisgICAgcm93Kys7CisgICAgbWFpbkxheW91dC0+YWRkV2lkZ2V0KG1Qcm9ncmVzcywgcm93LCAwLCAxLCAzKTsKKworICAgIG1haW5MYXlvdXQtPnNldFNpemVDb25zdHJhaW50KFFMYXlvdXQ6OlNldEZpeGVkU2l6ZSk7CisgICAgc2V0TGF5b3V0KG1haW5MYXlvdXQpOworICAgIHNldFdpbmRvd1RpdGxlKHRyKGtNZXNzYWdlQm94VGl0bGUpKTsKKyAgICBoaWRlRGV0YWlscygpOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OmhpZGVEZXRhaWxzKCkgeworICAgIG1EZXRhaWxzQnV0dG9uLT5zZXRUZXh0KHRyKCJTaG93IGRldGFpbHMiKSk7CisgICAgbURldGFpbHNUZXh0LT5oaWRlKCk7CisgICAgbURldGFpbHNIaWRkZW4gPSB0cnVlOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OmRpc2FibGVJbnB1dCgpIHsKKyAgICBtU2VuZEJ1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgbURvbnRTZW5kQnV0dG9uLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICBtRGV0YWlsc0J1dHRvbi0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgbUNvbW1lbnRzVGV4dC0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgbVNhdmVQcmVmZXJlbmNlLT5zZXRFbmFibGVkKGZhbHNlKTsKK30KKwordm9pZCBDb25maXJtRGlhbG9nOjplbmFibGVJbnB1dCgpIHsKKyAgICBtU2VuZEJ1dHRvbi0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICBtRG9udFNlbmRCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgbURldGFpbHNCdXR0b24tPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgbUNvbW1lbnRzVGV4dC0+c2V0RW5hYmxlZCh0cnVlKTsKKyAgICBtU2F2ZVByZWZlcmVuY2UtPnNldEVuYWJsZWQodHJ1ZSk7Cit9CisKK3ZvaWQgQ29uZmlybURpYWxvZzo6Z2V0RGV0YWlscygpIHsKKyAgICBpZiAoIW1EaWRHZXRTeXNJbmZvKSB7CisgICAgICAgIGRpc2FibGVJbnB1dCgpOworCisgICAgICAgIHNob3dQcm9ncmVzc0JhcigiQ29sbGVjdGluZyBjcmFzaCBpbmZvLi4uIHRoaXMgbWF5IHRha2UgYSBtaW51dGUuIik7CisgICAgICAgIFFFdmVudExvb3AgZXZlbnRsb29wOworCisgICAgICAgIFFGdXR1cmVXYXRjaGVyPGJvb2w+IHdhdGNoZXI7CisgICAgICAgIGNvbm5lY3QoJndhdGNoZXIsIFNJR05BTChmaW5pc2hlZCgpKSwgJmV2ZW50bG9vcCwgU0xPVChxdWl0KCkpKTsKKworICAgICAgICAvLyBTdGFydCB0aGUgY29tcHV0YXRpb24uCisgICAgICAgIFFGdXR1cmU8Ym9vbD4gZnV0dXJlID0gUXRDb25jdXJyZW50OjpydW4oCisgICAgICAgICAgICAgICAgbUNyYXNoU2VydmljZSwKKyAgICAgICAgICAgICAgICAmOjphbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hTZXJ2aWNlOjpjb2xsZWN0U3lzSW5mbyk7CisgICAgICAgIHdhdGNoZXIuc2V0RnV0dXJlKGZ1dHVyZSk7CisKKyAgICAgICAgZXZlbnRsb29wLmV4ZWMoKTsKKworICAgICAgICBoaWRlUHJvZ3Jlc3NCYXIoKTsKKyAgICAgICAgZW5hYmxlSW5wdXQoKTsKKyAgICB9CisgICAgbURpZEdldFN5c0luZm8gPSB0cnVlOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OnNob3dEZXRhaWxzKCkgeworICAgIGdldERldGFpbHMoKTsKKyAgICBpZiAoIW1EaWRVcGRhdGVEZXRhaWxzKSB7CisgICAgICAgIFFTdHJpbmcgZGV0YWlscyA9IFFTdHJpbmc6OmZyb21TdGRTdHJpbmcobUNyYXNoU2VydmljZS0+Z2V0UmVwb3J0KCkpOworICAgICAgICBkZXRhaWxzICs9IFFTdHJpbmc6OmZyb21TdGRTdHJpbmcobUNyYXNoU2VydmljZS0+Z2V0U3lzSW5mbygpKTsKKworICAgICAgICBtRGV0YWlsc1RleHQtPmRvY3VtZW50KCktPnNldFBsYWluVGV4dChkZXRhaWxzKTsKKyAgICAgICAgbURpZFVwZGF0ZURldGFpbHMgPSB0cnVlOworICAgIH0KKworICAgIG1EZXRhaWxzQnV0dG9uLT5zZXRUZXh0KHRyKCJIaWRlIGRldGFpbHMiKSk7CisgICAgbURldGFpbHNUZXh0LT5zaG93KCk7CisgICAgbURldGFpbHNUZXh0LT52ZXJ0aWNhbFNjcm9sbEJhcigpLT5zZXRWYWx1ZSgKKyAgICAgICAgICAgIG1EZXRhaWxzVGV4dC0+dmVydGljYWxTY3JvbGxCYXIoKS0+bWluaW11bSgpKTsKKyAgICBtRGV0YWlsc0hpZGRlbiA9IGZhbHNlOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OmFkZFN1Z2dlc3Rpb24oY29uc3QgUVN0cmluZyYgc3RyKSB7CisgICAgUVN0cmluZyBuZXh0X3RleHQgPSBtU3VnZ2VzdGlvblRleHQtPnRleHQoKSArIHN0ciArICJcbiI7CisgICAgbVN1Z2dlc3Rpb25UZXh0LT5zZXRUZXh0KG5leHRfdGV4dCk7Cit9CisKK2Jvb2wgQ29uZmlybURpYWxvZzo6ZGlkR2V0U3lzSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbURpZEdldFN5c0luZm87Cit9CisKK1FTdHJpbmcgQ29uZmlybURpYWxvZzo6Z2V0VXNlckNvbW1lbnRzKCkgeworICAgIHJldHVybiBtQ29tbWVudHNUZXh0LT50b1BsYWluVGV4dCgpOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OnNob3dQcm9ncmVzc0Jhcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgbVByb2dyZXNzVGV4dC0+c2V0VGV4dChtc2cuY19zdHIoKSk7CisgICAgbVByb2dyZXNzVGV4dC0+c2hvdygpOworICAgIG1Qcm9ncmVzcy0+c2hvdygpOworfQorCit2b2lkIENvbmZpcm1EaWFsb2c6OmhpZGVQcm9ncmVzc0JhcigpIHsKKyAgICBtUHJvZ3Jlc3NUZXh0LT5oaWRlKCk7CisgICAgbVByb2dyZXNzLT5oaWRlKCk7Cit9CisKK2Jvb2wgQ29uZmlybURpYWxvZzo6dXBsb2FkQ3Jhc2goKSB7CisgICAgZGlzYWJsZUlucHV0KCk7CisgICAgc2hvd1Byb2dyZXNzQmFyKCJTZW5kaW5nIGNyYXNoIHJlcG9ydC4uLiIpOworICAgIFFFdmVudExvb3AgZXZlbnRsb29wOworCisgICAgUUZ1dHVyZVdhdGNoZXI8Ym9vbD4gd2F0Y2hlcjsKKyAgICBjb25uZWN0KCZ3YXRjaGVyLCBTSUdOQUwoZmluaXNoZWQoKSksICZldmVudGxvb3AsIFNMT1QocXVpdCgpKSk7CisKKyAgICAvLyBTdGFydCB0aGUgY29tcHV0YXRpb24uCisgICAgUUZ1dHVyZTxib29sPiBmdXR1cmUgPSBRdENvbmN1cnJlbnQ6OnJ1bigKKyAgICAgICAgICAgIG1DcmFzaFNlcnZpY2UsICY6OmFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFNlcnZpY2U6OnVwbG9hZENyYXNoKTsKKyAgICB3YXRjaGVyLnNldEZ1dHVyZShmdXR1cmUpOworCisgICAgZXZlbnRsb29wLmV4ZWMoKTsKKworICAgIGhpZGVQcm9ncmVzc0JhcigpOworCisgICAgcmV0dXJuIHdhdGNoZXIucmVzdWx0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVQcmVmKGJvb2wgY2hlY2tlZCwgVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFX1ZBTFVFIHYpIHsKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFLAorICAgICAgICAgICAgY2hlY2tlZCA/IHYgOiBVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfQVNLKTsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1NBVkVQUkVGRVJFTkNFX0NIRUNLRUQsCisgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCk7Cit9CisKK3ZvaWQgQ29uZmlybURpYWxvZzo6c2VuZFJlcG9ydCgpIHsKKyAgICBnZXREZXRhaWxzKCk7CisgICAgbUNyYXNoU2VydmljZS0+YWRkVXNlckNvbW1lbnRzKG1Db21tZW50c1RleHQtPnRvUGxhaW5UZXh0KCkudG9TdGRTdHJpbmcoKSk7CisgICAgYm9vbCB1cGxvYWRfc3VjY2VzcyA9IHVwbG9hZENyYXNoKCk7CisKKyAgICBpZiAodXBsb2FkX3N1Y2Nlc3MgJiYKKyAgICAgICAgKG1SZXBvcnRQcmVmZXJlbmNlID09IFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BU0spKSB7CisgICAgICAgIFFNZXNzYWdlQm94IG1zZ2JveCh0aGlzKTsKKyAgICAgICAgbXNnYm94LnNldFdpbmRvd1RpdGxlKHRyKCJDcmFzaCBSZXBvcnQgU3VibWl0dGVkIikpOworICAgICAgICBtc2dib3guc2V0VGV4dCh0cigiPHA+VGhhbmsgeW91IGZvciBzdWJtaXR0aW5nIGEgY3Jhc2ggcmVwb3J0ITwvcD4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8cD5JZiB5b3Ugd291bGQgbGlrZSB0byBjb250YWN0IHVzIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIGZvbGxvd2luZyBDcmFzaCBSZXBvcnQgSUQ6PC9wPiIpKTsKKyAgICAgICAgUVN0cmluZyBtc2cgPSBRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKG1DcmFzaFNlcnZpY2UtPmdldFJlcG9ydElkKCkpOworICAgICAgICBtc2dib3guc2V0SW5mb3JtYXRpdmVUZXh0KG1zZyk7CisgICAgICAgIG1zZ2JveC5zZXRUZXh0SW50ZXJhY3Rpb25GbGFncyhRdDo6VGV4dFNlbGVjdGFibGVCeU1vdXNlKTsKKyAgICAgICAgbXNnYm94LmV4ZWMoKTsKKyAgICB9CisKKyAgICBzZXRTd0dwdSgpOworCisgICAgc2F2ZVByZWYobVNhdmVQcmVmZXJlbmNlLT5pc0NoZWNrZWQoKSwgVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFX0FMV0FZUyk7CisgICAgYWNjZXB0KCk7Cit9CisKK3ZvaWQgQ29uZmlybURpYWxvZzo6ZG9udFNlbmRSZXBvcnQoKSB7CisgICAgc2V0U3dHcHUoKTsKKyAgICByZWplY3QoKTsKK30KKworLy8gSWYgdGhlIHVzZXIgcmVxdWVzdHMgYSBzd2l0Y2ggdG8gc29mdHdhcmUgR1BVLCBtb2RpZnkKKy8vIGNvbmZpZy5pbmkKK3ZvaWQgQ29uZmlybURpYWxvZzo6c2V0U3dHcHUoKSB7CisgICAgaWYgKCBtU29mdHdhcmVHUFUtPmlzQ2hlY2tlZCgpICYmCisgICAgICAgICBtUmVwb3J0aW5nRGlyICAgICAgICAgICAgICAgICkKKyAgICB7CisgICAgICAgIC8vIFRoZSB1c2VyIHdhbnRzIHRoZSBzd2l0Y2ggYW5kIHdlIGhhdmUgdGhlCisgICAgICAgIC8vIHBhdGggdG8gdGhlIGF2ZF9pbmZvLnR4dCBmaWxlCisgICAgICAgIHN0ZDo6c3RyaW5nIGF2ZEluZm9QYXRoID0KKyAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmpvaW4obVJlcG9ydGluZ0RpciwgQ1JBU0hfQVZEX0hBUkRXQVJFX0lORk8pLmNfc3RyKCk7CisKKyAgICAgICAgSW5pRmlsZSBpbmlGKGF2ZEluZm9QYXRoKTsKKyAgICAgICAgaW5pRi5yZWFkKCk7CisKKyAgICAgICAgLy8gR2V0IHRoZSBwYXRoIHRvIGNvbmZpZy5pbmkKKyAgICAgICAgc3RkOjpzdHJpbmcgZGlza1BhcnREaXIgPSBpbmlGLmdldFN0cmluZygiZGlzay5kYXRhUGFydGl0aW9uLnBhdGgiLCAiIik7CisgICAgICAgIGlmICggIWRpc2tQYXJ0RGlyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRoZSBwYXRoOyBkaXNjYXJkIHRoZSBmaWxlIG5hbWUKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG91dHB1dERpcjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVudXNlZDsKKyAgICAgICAgICAgIGJvb2wgaXNPSyA9IFBhdGhVdGlsczo6c3BsaXQoZGlza1BhcnREaXIsICZvdXRwdXREaXIsICZ1bnVzZWQpOworICAgICAgICAgICAgaWYgKGlzT0spIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBod1FlbXVQYXRoID0gUGF0aFV0aWxzOjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ob3V0cHV0RGlyLCBDT1JFX0NPTkZJR19JTkkpLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgcGF0aCB0byBjb25maWcuaW5pCisgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGF0CisgICAgICAgICAgICAgICAgSW5pRmlsZSBod1FlbXVJbmlGKGh3UWVtdVBhdGgpOworICAgICAgICAgICAgICAgIGh3UWVtdUluaUYucmVhZCgpOworCisgICAgICAgICAgICAgICAgLy8gU2V0IGh3LmdwdS5lbmFibGVkPW5vIGFuZCBody5ncHUubW9kZT1ndWVzdAorICAgICAgICAgICAgICAgIGh3UWVtdUluaUYuc2V0U3RyaW5nKCJody5ncHUuZW5hYmxlZCIsICJubyIpOworICAgICAgICAgICAgICAgIGh3UWVtdUluaUYuc2V0U3RyaW5nKCJody5ncHUubW9kZSIsICJndWVzdCIpOworCisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIG1vZGlmaWVkIGNvbmZpZ3VyYXRpb24gYmFjaworICAgICAgICAgICAgICAgIGh3UWVtdUluaUYud3JpdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25maXJtRGlhbG9nOjpkZXRhaWx0b2dnbGUoKSB7CisgICAgaWYgKG1EZXRhaWxzSGlkZGVuKSB7CisgICAgICAgIHNob3dEZXRhaWxzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGlkZURldGFpbHMoKTsKKyAgICB9Cit9CisKK3N0ZDo6c3RyaW5nIENvbmZpcm1EaWFsb2c6OmNvbnN0cnVjdER1bXBNZXNzYWdlKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGR1bXBNZXNzYWdlID0gbUNyYXNoU2VydmljZS0+Z2V0RHVtcE1lc3NhZ2UoKTsKKyAgICBpZiAoZHVtcE1lc3NhZ2UuZW1wdHkoKSkgeworICAgICAgICBkdW1wTWVzc2FnZSA9IGtNZXNzYWdlQm94TWVzc2FnZTsKKyAgICB9IGVsc2UgeworICAgICAgICBkdW1wTWVzc2FnZSA9IHN0ZDo6c3RyaW5nKGtNZXNzYWdlQm94TWVzc2FnZUludGVybmFsRXJyb3IpICsgIjxwPiIgKworICAgICAgICAgICAgICAgICAgICAgIGR1bXBNZXNzYWdlICsgIjwvcD4iOworICAgIH0KKyAgICBkdW1wTWVzc2FnZSArPSBrTWVzc2FnZUJveE1lc3NhZ2VGb290ZXI7CisgICAgcmV0dXJuIGR1bXBNZXNzYWdlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2NyYXNocmVwb3J0L3VpL0NvbmZpcm1EaWFsb2cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC91aS9Db25maXJtRGlhbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhMTdiNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jcmFzaHJlcG9ydC91aS9Db25maXJtRGlhbG9nLmgKQEAgLTAsMCArMSw5MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9xdC1zZXR0aW5ncy5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hSZXBvcnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvQ3Jhc2hTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxRQ2hlY2tCb3g+CisjaW5jbHVkZSA8UURpYWxvZ0J1dHRvbkJveD4KKyNpbmNsdWRlIDxRRm9udERhdGFiYXNlPgorI2luY2x1ZGUgPFFHcmlkTGF5b3V0PgorI2luY2x1ZGUgPFFMYWJlbD4KKyNpbmNsdWRlIDxRTWVzc2FnZUJveD4KKyNpbmNsdWRlIDxRUGl4bWFwPgorI2luY2x1ZGUgPFFQbGFpblRleHRFZGl0PgorI2luY2x1ZGUgPFFQdXNoQnV0dG9uPgorI2luY2x1ZGUgPFFQcm9ncmVzc0Jhcj4KKyNpbmNsdWRlIDxRVGV4dEVkaXQ+CisKKy8vIFFUIENvbXBvbmVudCB0aGF0IGRpc3BsYXlzIHRoZSBzZW5kIGNyYXNoIGR1bXAgY29uZmlybWF0aW9uCitjbGFzcyBDb25maXJtRGlhbG9nIDogcHVibGljIFFEaWFsb2cgeworcHJpdmF0ZToKKyAgICBRX09CSkVDVAorICAgIFFQdXNoQnV0dG9uKiBtU2VuZEJ1dHRvbjsKKyAgICBRUHVzaEJ1dHRvbiogbURvbnRTZW5kQnV0dG9uOworICAgIFFQdXNoQnV0dG9uKiBtRGV0YWlsc0J1dHRvbjsKKyAgICBRTGFiZWwqIG1MYWJlbFRleHQ7CisgICAgUUxhYmVsKiBtSW5mb1RleHQ7CisgICAgUUxhYmVsKiBtSWNvbjsKKworICAgIFFXaWRnZXQqIG1Db21tZW50OworICAgIFFXaWRnZXQqIG1FeHRlbnNpb247CisgICAgUVRleHRFZGl0KiBtQ29tbWVudHNUZXh0OworICAgIFFQbGFpblRleHRFZGl0KiBtRGV0YWlsc1RleHQ7CisgICAgUUxhYmVsKiBtUHJvZ3Jlc3NUZXh0OworICAgIFFQcm9ncmVzc0JhciogbVByb2dyZXNzOworICAgIFFDaGVja0JveCogbVNhdmVQcmVmZXJlbmNlOworICAgIFFDaGVja0JveCogbVNvZnR3YXJlR1BVOworCisgICAgUUxhYmVsKiBtU3VnZ2VzdGlvblRleHQ7CisKKyAgICBRRGlhbG9nQnV0dG9uQm94KiBtWWVzTm9CdXR0b25Cb3g7CisgICAgUURpYWxvZ0J1dHRvbkJveCogbURldGFpbHNCdXR0b25Cb3g7CisKKyAgICBhbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hTZXJ2aWNlKiBtQ3Jhc2hTZXJ2aWNlOworICAgIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSBtUmVwb3J0UHJlZmVyZW5jZTsKKworICAgIGJvb2wgbURldGFpbHNIaWRkZW47CisgICAgYm9vbCBtRGlkR2V0U3lzSW5mbzsKKyAgICBib29sIG1EaWRVcGRhdGVEZXRhaWxzOworICAgIGJvb2wgbUlzRXhpdENyYXNoOworICAgIGJvb2wgbVF1aWV0TW9kZTsKKyAgICBjb25zdCBjaGFyKiBtUmVwb3J0aW5nRGlyOyAgLy8gRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBvcmFyeSBmaWxlcworCisgICAgdm9pZCBkaXNhYmxlSW5wdXQoKTsKKyAgICB2b2lkIGVuYWJsZUlucHV0KCk7CisgICAgdm9pZCBzaG93UHJvZ3Jlc3NCYXIoY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisgICAgdm9pZCBoaWRlUHJvZ3Jlc3NCYXIoKTsKKyAgICB2b2lkIGdldERldGFpbHMoKTsKKyAgICBib29sIHVwbG9hZENyYXNoKCk7CisgICAgdm9pZCBhZGRTdWdnZXN0aW9uKGNvbnN0IFFTdHJpbmcmIHN0cik7CisgICAgdm9pZCBoaWRlRGV0YWlscyh2b2lkKTsKKyAgICB2b2lkIHNob3dEZXRhaWxzKHZvaWQpOworICAgIHZvaWQgc2V0U3dHcHUodm9pZCk7CisKK3B1YmxpYzoKKyAgICBDb25maXJtRGlhbG9nKFFXaWRnZXQqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFNlcnZpY2UqIGNyYXNoc2VydmljZSwKKyAgICAgICAgICAgICAgICAgIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSByZXBvcnRQcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVwb3J0aW5nRGlyKTsKKyAgICBib29sIGRpZEdldFN5c0luZm8oKSBjb25zdDsKKworICAgIFFTdHJpbmcgZ2V0VXNlckNvbW1lbnRzKCk7CitwdWJsaWMgc2xvdHM6CisgICAgdm9pZCBzZW5kUmVwb3J0KCk7CisgICAgdm9pZCBkb250U2VuZFJlcG9ydCgpOworICAgIHZvaWQgZGV0YWlsdG9nZ2xlKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgY29uc3RydWN0RHVtcE1lc3NhZ2UoKSBjb25zdDsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3VybC1zdXBwb3J0LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3VybC1zdXBwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxOWY2MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jdXJsLXN1cHBvcnQuYwpAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2N1cmwtc3VwcG9ydC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuc3NsLXN1cHBvcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQgaW5pdENvdW50ID0gMDsKK3N0YXRpYyBjaGFyKiBjYWNoZWRfY2FfaW5mbyA9IE5VTEw7CisKK2Jvb2wgY3VybF9pbml0KGNvbnN0IGNoYXIqIGNhX2luZm8pIHsKKyAgICBpZiAoaW5pdENvdW50ID09IDApIHsKKyAgICAgICAgLy8gZmlyc3QgdGltZSAtIHRyeSB0byBpbml0aWFsaXplIHRoZSBsaWJyYXJ5CisgICAgICAgIGNvbnN0IENVUkxjb2RlIHJlcyA9IGN1cmxfZ2xvYmFsX2luaXQoQ1VSTF9HTE9CQUxfQUxMKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDVVJMRV9PSykgeworICAgICAgICAgICAgZHdhcm5pbmcoIkNVUkw6IGdsb2JhbCBpbml0IGZhaWxlZCB3aXRoIGNvZGUgJWQgKCVzKSIsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgIGN1cmxfZWFzeV9zdHJlcnJvcihyZXMpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFuZHJvaWRfb3BlbnNzbF9pbml0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyZWUoY2FjaGVkX2NhX2luZm8pOworICAgIGNhY2hlZF9jYV9pbmZvID0gTlVMTDsKKyAgICBpZiAoY2FfaW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGNhY2hlZF9jYV9pbmZvID0gc3RyZHVwKGNhX2luZm8pOworICAgIH0KKyAgICArK2luaXRDb3VudDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBjdXJsX2NsZWFudXAoKSB7CisgICAgaWYgKGluaXRDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKC0taW5pdENvdW50ID09IDApIHsKKyAgICAgICAgZnJlZShjYWNoZWRfY2FfaW5mbyk7CisgICAgICAgIGNhY2hlZF9jYV9pbmZvID0gTlVMTDsKKyAgICAgICAgLy8gV2Uga25vdyB3ZSdyZSBsZWFraW5nIG1lbW9yeSBieSBub3QgY2FsbGluZyBjdXJsX2dsb2JhbF9jbGVhbnVwLgorICAgICAgICAvLyBXZSBjYW4gbm90IGd1YXJhbnRlZSB0aGF0IG5vIHRocmVhZHMgZXhpc3Qgd2hlbiB0aGUgcHJvZ3JhbSBleGl0cworICAgICAgICAvLyAoZS5nLiBhbmRyb2lkOjpiYXNlOjphc3luYyBoYXMgdW5rbm93biBsaWZldGltZSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIERpdHRvIGZvciBhbmRyb2lkX29wZW5zc2xfZmluaXNoLgorICAgIH0KK30KKwordm9pZCogY3VybF9lYXN5X2RlZmF1bHRfaW5pdChjaGFyKiogZXJyb3IpIHsKKyAgICAvLyB8Y3VybF9lYXN5X2luaXR8IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgbGliY3VybCBnbG9iYWxseSBpZiBpdCBpc24ndAorICAgIC8vIGFscmVhZHkgaW5pdGlhbGl6ZWQuIFRoaXMgYmVoYXZpb3VyIGlzIGRhbmdlcm91cyBpbiBtdWx0aS10aHJlYWRlZAorICAgIC8vIGVudmlyb25tZW50LgorICAgIGlmICghaW5pdENvdW50KSB7CisgICAgICAgICplcnJvciA9IHN0cmR1cCgibGliY3VybCBpcyBub3QgaW5pdGlhbGl6ZWQuIEJhaWxpbmcuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIENVUkwqIGN1cmwgPSBjdXJsX2Vhc3lfaW5pdCgpOworICAgIENVUkxjb2RlIGN1cmxSZXM7CisKKyAgICBpZiAoIWN1cmwpIHsKKyAgICAgICAgKmVycm9yID0gc3RyZHVwKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBsaWJjdXJsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGN1cmxSZXMgPSBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfTk9TSUdOQUwsIDFMKTsKKyAgICBpZiAoY3VybFJlcyAhPSBDVVJMRV9PSykgeworICAgICAgICBhc3ByaW50ZihlcnJvciwgIkNvdWxkIG5vdCBkaXNhYmxlIHNpZ25hbHM6ICVzIiwKKyAgICAgICAgICAgICAgICAgY3VybF9lYXN5X3N0cmVycm9yKGN1cmxSZXMpKTsKKyAgICAgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChjYWNoZWRfY2FfaW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGN1cmxSZXMgPSBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ0FJTkZPLCBjYWNoZWRfY2FfaW5mbyk7CisgICAgICAgIGlmIChjdXJsUmVzICE9IENVUkxFX09LKSB7CisgICAgICAgICAgICBhc3ByaW50ZihlcnJvciwgIkNvdWxkIG5vdCBzZXQgQ1VSTE9QVF9DQUlORk86ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGN1cmxfZWFzeV9zdHJlcnJvcihjdXJsUmVzKSk7CisgICAgICAgICAgICBjdXJsX2Vhc3lfY2xlYW51cChjdXJsKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjdXJsOworfQorCisvLyBBIEN1cmxXcml0ZUNhbGxiYWNrIHRoYXQgZHJvcHMgYW55IGRvd25sb2FkZWQgZGF0YS4KKy8vIFVzaW5nIGl0IGF2b2lkcyBkdW1waW5nIHRoZSBjb250ZW50IHRvIHN0ZG91dCwgdGhlIGRlZmF1bHQgQ1VSTCBiZWhhdmlvdXIuCitzdGF0aWMgc2l6ZV90IG51bGxfd3JpdGVfY2FsbGJhY2soY2hhciogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyZGF0YSkgeworICAgIHJldHVybiBzaXplICogbm1lbWI7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJsb2NrIGZvcmV2ZXIuIFdlIGRvIG5vdCBzZXQgYW55IHRpbWVvdXQgZm9yCisvLyBjdXJsX2Vhc3lfcGVyZm9ybS4gU2luY2Ugd2UgZGlzYWJsZSBzaWduYWxzLCB0aGUgRE5TIGxvb2t1cCB0aW1lb3V0IGlzIGlnbm9yZQorLy8gYnkgbGliY3VybC4KKy8vIFRPRE86IGJ1aWxkIHVzaW5nIGMtYXJlcywgYW5kIHNldCB0aW1lb3V0IGZvciBjdXJsX2Vhc3lfcGVyZm9ybS4KK3N0YXRpYyBib29sIGN1cmxfZG93bmxvYWRfaW50ZXJuYWwoY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwb3N0X2ZpZWxkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VybFdyaXRlQ2FsbGJhY2sgY2FsbGJhY2tfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbGJhY2tfdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfNDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogZXJyb3IpIHsKKyAgICBDVVJMKiBjdXJsID0gY3VybF9lYXN5X2RlZmF1bHRfaW5pdChlcnJvcik7CisgICAgaWYgKCFjdXJsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX1VSTCwgdXJsKTsKKyAgICBpZiAoY2FsbGJhY2tfZnVuYykgeworICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgY2FsbGJhY2tfZnVuYyk7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9XUklURURBVEEsIGNhbGxiYWNrX3VzZXJkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfV1JJVEVGVU5DVElPTiwgbnVsbF93cml0ZV9jYWxsYmFjayk7CisgICAgfQorCisgICAgaWYgKHBvc3RfZmllbGRzKSB7CisgICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9QT1NURklFTERTLCBwb3N0X2ZpZWxkcyk7CisgICAgfQorCisgICAgY29uc3QgQ1VSTGNvZGUgcmVzID0gY3VybF9lYXN5X3BlcmZvcm0oY3VybCk7CisgICAgaWYgKHJlcyAhPSBDVVJMRV9PSykgeworICAgICAgICBhc3ByaW50ZihlcnJvciwgIiVzIiwgY3VybF9lYXN5X3N0cmVycm9yKHJlcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRvb2xiYXIgcmV0dXJucyBhIDQwNCBieSBkZXNpZ24uCisgICAgICAgIGxvbmcgaHR0cF9yZXNwb25zZSA9IDA7CisgICAgICAgIGludCBjdXJsUmVzID0gY3VybF9lYXN5X2dldGluZm8oY3VybCwgQ1VSTElORk9fUkVTUE9OU0VfQ09ERSwgJmh0dHBfcmVzcG9uc2UpOworICAgICAgICBpZiAoY3VybFJlcyA9PSBDVVJMRV9PSykgeworICAgICAgICAgICAgaWYgKGh0dHBfcmVzcG9uc2UgPT0gMjAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHR0cF9yZXNwb25zZSA9PSA0MDQgJiYgYWxsb3dfNDA0KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNwcmludGYoZXJyb3IsICIlcyIsIGN1cmxfZWFzeV9zdHJlcnJvcihjdXJsUmVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3ByaW50ZihlcnJvciwgIlVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgY2hlY2tpbmcgaHR0cCByZXNwb25zZTogJXMiLAorICAgICAgICAgICAgICAgICAgICBjdXJsX2Vhc3lfc3RyZXJyb3IoY3VybFJlcykpOworICAgICAgICB9CisgICAgfQorCisgICAgY3VybF9lYXN5X2NsZWFudXAoY3VybCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIGN1cmxfZG93bmxvYWQoY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBvc3RfZmllbGRzLAorICAgICAgICAgICAgICAgICAgIEN1cmxXcml0ZUNhbGxiYWNrIGNhbGxiYWNrX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbGJhY2tfdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgY2hhcioqIGVycm9yKSB7CisgICAgcmV0dXJuIGN1cmxfZG93bmxvYWRfaW50ZXJuYWwodXJsLCBwb3N0X2ZpZWxkcywgY2FsbGJhY2tfZnVuYywgY2FsbGJhY2tfdXNlcmRhdGEsIGZhbHNlLCBlcnJvcik7Cit9CisKK2V4dGVybiBib29sIGN1cmxfZG93bmxvYWRfbnVsbChjb25zdCBjaGFyKiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcG9zdF9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd180MDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIGVycm9yKSB7CisgICAgcmV0dXJuIGN1cmxfZG93bmxvYWRfaW50ZXJuYWwodXJsLCBwb3N0X2ZpZWxkcywgTlVMTCwgTlVMTCwgYWxsb3dfNDA0LCBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3VybC1zdXBwb3J0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvY3VybC1zdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2ZWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9jdXJsLXN1cHBvcnQuaApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIENVUkwgbGlicmFyeSB3cmFwcGVyLiBUaGlzIGlzIHVzZWQgdG8gcGVyZm9ybSB0aGUgZm9sbG93aW5nOgorLy8KKy8vIC0gSW5pdGlhbGl6YXRpb24gYW5kIGRlaW5pdGlhbGl6YXRpb24gb2YgdGhlIGxpYnJhcnksIGluIGEgbXVsdGktdGhyZWFkZWQKKy8vICAgY29udGV4dC4KKy8vIC0gRG93bmxvYWQgZGF0YSBmcm9tIGEgZ2l2ZW4gVVJMLCBwYXNzaW5nIG9wdGlvbmFsIFBPU1QgZGF0YSB0byB0aGUgc2VydmVyLgorLy8KKy8vIEl0IGlzIGltcG9ydGFudCB0byBhdm9pZCBleHBvc2luZyA8Y3VybC9jdXJsLmg+IHRvIGNsaWVudCBjb2RlLCBhcyB0aGlzCisvLyByZXF1aXJlcyBkcmFnZ2luZyB0aGUgQ1VSTC1zcGVjaWZpYyBjb21waWxlciBmbGFncyB0byB0aGUgY2xpZW50IGNvZGUKKy8vIG90aGVyd2lzZS4KKworLy8gSW5pdGlhbGl6ZSBDVVJMIGxpYnJhcnkuIHxjYV9pbmZvfCBpcyBhbiBvcHRpb24gU1NMIENlcnRpZmljYXRlIEF1dGhvcml0eQorLy8gYnVuZGxlLiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuIE5PVEU6IG5vdCB0aHJlYWQtc2FmZS4KK2V4dGVybiBib29sIGN1cmxfaW5pdChjb25zdCBjaGFyKiBjYV9pbmZvKTsKKworLy8gRGUtaW5pdGlhbGl6ZSBDVVJMIGxpYnJhcnkuIE5vdCB0aHJlYWQtc2FmZSBlaXRoZXIuCitleHRlcm4gdm9pZCBjdXJsX2NsZWFudXAoKTsKKworLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgY3VybF9lYXN5X2luaXQoKSwgYmVjYXVzZSBpdCB3aWxsIGFkZCB0aGUKKy8vIHxjYV9pbmZvfCBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIHRvIGN1cmxfaW5pdCgpIHRvIHRoZSByZXR1cm5lZCBDVVJMCisvLyBpbnN0YW5jZS4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGdlbmVyaWMgcG9pbnRlciB0aGF0IG11c3QgYmUKKy8vIGNhc3QgdG8gQ1VSTCogYnkgdGhlIGNhbGxlci4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZQorLy8gPGN1cmwvY3VybC5oPiBmcm9tIHRoaXMgaGVhZGVyLCBzaW5jZSBpdCB3b3VsZCBkcmFnIHRoaXMgZGVwZW5kZW5jeQorLy8gaW50byBhbnkgY2xpZW50IGNvZGUgdGhhdCBpbmNsdWRlcyBpdCwgbW9zdCBvZiB0aGVtIGRvbid0IG5lZWQgaXQuCisvLyAobm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgY2xpZW50IGNvZGUgdG8gdXNlICQoTElCQ1VSTF9DRkxBR1MpIHRvbyB0bworLy8gcHJvcGVybHkgY29tcGlsZSBvbiBXaW5kb3dzKS4KK2V4dGVybiB2b2lkKiBjdXJsX2Vhc3lfZGVmYXVsdF9pbml0KGNoYXIqKiBlcnJvcik7CisKKy8vIEEgQ1VSTC1zdHlsZSB3cml0ZSBjYWxsYmFjay4gUmVjZWl2ZXMgdGhlIGRhdGEgZG93bmxvYWRlZCBmcm9tIHRoZSBVUkwKKy8vIGluc2lkZSBhIGN1cmxfZG93bmxvYWQoKSBjYWxsLiBNdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZQorLy8gYWN0dWFsbHkgcmVhZCBmcm9tIHxwdHJ8LiB8c2l6ZXwgaXMgdGhlIHNpemUgb2YgZWFjaCBpdGVtIGluIGJ5dGVzLCBhbmQKKy8vIHxubWVtYnwgaXMgdGhlIG51bWJlciBvZiBpdGVtcy4gfHVzZXJkYXRhfCBpcyBhIGNsaWVudC1wcm92aWRlZCBvcGFxdWUKKy8vIHBvaW50ZXIuCit0eXBlZGVmIHNpemVfdCAoKkN1cmxXcml0ZUNhbGxiYWNrKShjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBubWVtYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhKTsKKworLy8gRG93bmxvYWQgYSBmaWxlIGZyb20gYSBnaXZlbiB8dXJsfCwgcGFzc2luZyBvcHRpb25hbCBQT1NUIGZpZWxkcyBpbgorLy8gfHBvc3RfZmllbGRzfCwgd2hpY2ggY2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4gVGhlIGRhdGEgaXMgc2VudCB0bworLy8gdGhlIHxjYWxsYmFja19mdW5jfCBmdW5jdGlvbiwgd2hpY2ggd2lsbCByZWNlaXZlIHxjYWxsYmFja191c2VyZGF0YXwgYXMKKy8vIGl0cyBmb3VydGggcGFyYW1ldGVyLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJsb2NrIGZvcmV2ZXIuCisvLworLy8gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZCBzZXRzIHwqZXJyb3J8IHRvIGEgaGVhcC1hbGxvY2F0ZWQgZXJyb3IgbWVzc2FnZQorLy8gc3RyaW5nIHRoYXQgbXVzdCBiZSBmcmVlKCktZWQgYnkgdGhlIGNhbGxlci4gT24gc3VjY2VzcywgcmV0dXJuIHRydWUgYW5kCisvLyBkbyBub3QgdG91Y2ggfCplcnJvcnwuCitleHRlcm4gYm9vbCBjdXJsX2Rvd25sb2FkKGNvbnN0IGNoYXIqIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcG9zdF9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cmxXcml0ZUNhbGxiYWNrIGNhbGxiYWNrX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxiYWNrX3VzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogZXJyb3IpOworCisvLyBBIHZhcmlhbnQgb2YgY3VybF9kb3dubG9hZCgpIHRoYXQgdGhyb3dzIHRoZSBkb3dubG9hZGVkIGZpbGUgdG8gL2Rldi9udWxsLgorLy8gVGhpcyBpcyByZWFsbHkgdXNlZCB0byBjaGVjayB0aGF0IGEgZmlsZSBpcyBhdmFpbGFibGUsIG9yIHRvIHNlbmQgYSBQT1NUCisvLyByZXF1ZXN0IGlmIHxwb3N0X2ZpZWxkc3wgaXMgbm90IE5VTEwuIElmIHxhbGxvd180MDR8IGlzIHRydWUsIHRoZW4gYW4KKy8vIEhUVFAgcmVzcG9uc2Ugb2YgNDA0IChmaWxlIG5vdCBmb3VuZCkgaXMgYWxsb3dlZCwgYXMgdGhpcyBpcyB1c2VkIGJ5IHRoZQorLy8gR29vZ2xlIFRvb2xzIFRvb2xiYXIgQVBJIGJ5IGRlc2lnbi4gT24gZmFpbGx1cmUsIHJldHVybiBmYWxzZSBhbmQgc2V0cworLy8gfCplcnJvcnwuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJsb2NrIGZvcmV2ZXIuCitleHRlcm4gYm9vbCBjdXJsX2Rvd25sb2FkX251bGwoY29uc3QgY2hhciogdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBvc3RfZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dfNDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBlcnJvcik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWN0bC1jbGllbnQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWN0bC1jbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OGQyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11Y3RsLWNsaWVudC5jcHAKQEAgLTAsMCArMSwzNDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11Y3RsLWNsaWVudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9BcnJheVNpemUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvc2Vuc29yc19hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctc2Vuc29ycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZWN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2xpbnV4X2tleWNvZGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tdWx0aXRvdWNoLXNjcmVlbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvanBlZy1jb21wcmVzcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ3B1X2ZyYW1lLmgiCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworZW51bSBQYWNrZXRUeXBlIHsKKyAgICBQQUNLRVRfVFlQRV9TRU5TT1JfREFUQV9BQ0NFTEVST01FVEVSID0gKDB4MDEpLAorICAgIFBBQ0tFVF9UWVBFX1NFTlNPUl9EQVRBX01BR05FVE9NRVRFUiA9ICgweDAyKSwKKyAgICBQQUNLRVRfVFlQRV9TRU5TT1JfREFUQV9PUklFTlRBVElPTiA9ICgweDAzKSwgLyogZGVwcmVjYXRlZCAqLworICAgIFBBQ0tFVF9UWVBFX1NFTlNPUl9EQVRBX0FNQklFTlRfVEVNUEVSQVRVUkUgPSAoMHgwNCksCisgICAgUEFDS0VUX1RZUEVfU0VOU09SX0RBVEFfUFJPWElNSVRZID0gKDB4MDUpLAorICAgIFBBQ0tFVF9UWVBFX1NFTlNPUl9EQVRBX0xJR0hUID0gKDB4MDYpLAorICAgIFBBQ0tFVF9UWVBFX1NFTlNPUl9EQVRBX1BSRVNTVVJFID0gKDB4MDcpLAorICAgIFBBQ0tFVF9UWVBFX1NFTlNPUl9EQVRBX0hVTUlESVRZID0gKDB4MDgpLAorICAgIFBBQ0tFVF9UWVBFX01UX0FDVElPTl9ET1dOID0gKDB4MDkpLAorICAgIFBBQ0tFVF9UWVBFX01UX0FDVElPTl9NT1ZFID0gKDB4MEEpLAorICAgIFBBQ0tFVF9UWVBFX01UX0FDVElPTl9VUCA9ICgweDBCKSwKKyAgICBQQUNLRVRfVFlQRV9NVF9BQ1RJT05fQ0FOQ0VMID0gKDB4MEMpCit9OworCituYW1lc3BhY2UgeworCisvLyBBIGRhdGEgcGFja2V0IHNlbnQgYnkgdGhlIGNvbnRyb2xsZXIgYXBwLgorLy8gQWxsIHZhbHVlcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgorc3RydWN0IEluYm91bmRQYWNrZXQgeworICAgIC8vIE9uZSBvZiB0aGUgUEFDS0VUX1RZUEVfKiBjb25zdGFudHMsIGluZGljYXRlcyB3aGF0IGRhdGEgaXMgY29udGFpbmVkCisgICAgLy8gaW4gdGhpcyBwYWNrZXQuCisgICAgdWludDMyX3QgdHlwZTsKKworICAgIC8vIEZvciBTRU5TT1JfREFUQV8qIGRhdGEgcGFja2V0cywgeCwgeSBhbmQgeiBhcmUgdGhlIHJlYWRpbmdzIG9mCisgICAgLy8gdGhlIHNlbnNvcnMuCisgICAgLy8gRm9yIE1UX0FDVElPTl8qIHBhY2tldHMsIHggYW5kIHkgY29udGFpbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvdWNoCisgICAgLy8gZXZlbnQgaW4gc2NyZWVuIHBpeGVscywgd2hpbGUgeiBpcyB0aGUgcHJlc3N1cmUuCisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGZsb2F0IHo7CisKKyAgICAvLyBGb3IgTVRfQUNUSU9OXyogcGFja2V0cywgdHJhY2tpbmdfaWQgY29udGFpbnMgdGhlIHBvaW50ZXIgaWQuCisgICAgdWludDMyX3QgdHJhY2tpbmdfaWQ7Cit9OworCisvLyBBIGhlYWRlciB0aGF0IGlzIHNlbnQgdG8gdGhlIGNvbnRyb2xsZXIgYXBwIHdpdGggZXZlcnkgc2NyZWVuIHVwZGF0ZS4KK3N0cnVjdCBGcmFtZWJ1ZmZlclBhY2tldEhlYWRlciB7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgdWludDMyX3Qgc2NyZWVuX29yaWVudGF0aW9uOworfTsKKworc3RydWN0IEdsb2JhbHMgeworICAgIDo6YW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXI7CisgICAgY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIHNlbnNvcnM7CisgICAgOjphbmRyb2lkOjpiYXNlOjpTY29wZWRTb2NrZXRXYXRjaCBzb2NrZXQ7CisgICAgdWludDhfdCBwa3RfYnVmW3NpemVvZihJbmJvdW5kUGFja2V0KV07CisgICAgaW50IHBrdF9ieXRlc19yZW1haW5pbmc7CisgICAgaW50IHBrdF9ieXRlc19yZWFkOworICAgIFNraW5Sb3RhdGlvbiBsYXN0X2tub3duX3NjcmVlbl9vcmllbnRhdGlvbjsKKyAgICBBSlBFR0Rlc2MqIGpwZWdfY29tcHJlc3NvcjsKK307CisKK2FuZHJvaWQ6OmJhc2U6OkxhenlJbnN0YW5jZTxHbG9iYWxzPiBzR2xvYmFscyA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworLy8gQ29udmVydHMgYSBmbG9hdCBmcm9tIG5ldHdvcmsgdG8gaG9zdCBieXRlLW9yZGVyLgoraW5saW5lIHN0YXRpYyBmbG9hdCBmbG9hdF9udG9obChmbG9hdCBhKSB7CisgICAgdW5pb24geworICAgICAgICBmbG9hdCBmOworICAgICAgICB1aW50MzJfdCBpOworICAgIH0gdjsKKyAgICB2LmYgPSBhOworICAgIHYuaSA9IG50b2hsKHYuaSk7CisgICAgcmV0dXJuIHYuZjsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBzZW5kaW5nIHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBjb250cm9sbGVyIGFwcC4KKy8vIEl0IHRyaWVzIHRvIGd1ZXNzIHRoZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIGZyb20KKy8vIHRoZSBhY2NlbGVyb21ldGVyIHZhbHVlcy4KKy8vIFRoaXMgbWV0aG9kIGlzIG5vdCBpZGVhbCwgYWx0aG91Z2ggaXQgd29ya3MgaW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzLgorLy8gSXQgcmVsaWVzIG9uIGdyYXZpdHkgZ2l2aW5nIHRoZSBtb3N0IHNpZ25pZmljYW50CisvLyBjb250cmlidXRpb24gdG8gdGhlIGFjY2VsZXJhdGlvbiB2ZWN0b3IuIEFsc28sIHNvbWUgYXBwcyBtaWdodCBsb2NrIHRoZQorLy8gc2NyZWVuIGluIGEgcGFydGljdWxhciBvcmllbnRhdGlvbiBzbyB0aGF0IGl0J3Mgbm90IGFmZmVjdGVkIGJ5IHRoZQorLy8gYWNjZWxlcm9tZXRlciBhdCBhbGwsIHdoaWNoIGlzbid0IHRha2VuIGludG8gYWNjb3VudCBieSB0aGlzIGZ1bmN0aW9uLgorLy8gVE9ETzogaW1wbGVtZW50IGEgbWV0aG9kIGZvciByZXRyaWV2aW5nIHRoZSBhY3R1YWwgc2NyZWVuIG9yaWVudGF0aW9uIGZyb20KKy8vIHRoZSBlbXVsYXRlZCBkZXZpY2UuCitzdGF0aWMgU2tpblJvdGF0aW9uIGd1ZXNzU2NyZWVuT3JpZW50YXRpb24oKSB7CisgICAgLy8gVmFsdWVzIGZvciBncmF2aXR5IGluIGRpZmZlcmVudCBvcmllbnRhdGlvbnMKKyAgICBmbG9hdCBncmF2aXR5W11bM10gPSB7CisgICAgICAgIC8vIEZhY2UgdXAvZG93bgorICAgICAgICB7MC4wZiwgMC4wZiwgOS44Zn0sCisgICAgICAgIHswLjBmLCAwLjBmLCAtOS44Zn0sCisKKyAgICAgICAgLy8gUG9ydHJhaXQvcmV2ZXJzZSBwb3J0cmFpdAorICAgICAgICB7MC4wZiwgOS44ZiwgMC4wZn0sCisgICAgICAgIHswLjBmLCAtOS44ZiwgMC4wZn0sCisKKyAgICAgICAgLy8gTGFuZHNjYXBlL3JldmVyc2UgbGFuZHNjYXBlCisgICAgICAgIHs5LjhmLCAwLjBmLCAwLjBmfSwKKyAgICAgICAgey05LjhmLCAwLjBmLCAwLjBmfQorICAgIH07CisgICAgU2tpblJvdGF0aW9uIG9yaWVudGF0aW9uc1tdID0geworICAgICAgICBTS0lOX1JPVEFUSU9OXzAsCisgICAgICAgIFNLSU5fUk9UQVRJT05fMTgwLAorICAgICAgICBTS0lOX1JPVEFUSU9OXzI3MCwKKyAgICAgICAgU0tJTl9ST1RBVElPTl85MAorICAgIH07CisKKyAgICBmbG9hdCBtaW5fZGlmZl9ub3JtID0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46Om1heCgpOworICAgIGludCBncmF2aXR5X2RpcmVjdGlvbl9pbmRleCA9IDI7CisgICAgZmxvYXQgYWNjZWxlcmF0aW9uWzNdOworICAgIHNHbG9iYWxzLT5zZW5zb3JzLT5nZXRTZW5zb3IoCisgICAgICAgIEFORFJPSURfU0VOU09SX0FDQ0VMRVJBVElPTiwKKyAgICAgICAgJmFjY2VsZXJhdGlvblswXSwKKyAgICAgICAgJmFjY2VsZXJhdGlvblsxXSwKKyAgICAgICAgJmFjY2VsZXJhdGlvblsyXSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8ICBBUlJBWV9TSVpFKGdyYXZpdHkpOyBpKyspIHsKKyAgICAgICAgZmxvYXQgZGlmZl9jb21wb25lbnQgPSAwLjBmOworICAgICAgICBmbG9hdCBkaWZmX25vcm0gPSAwLjBmOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFSUkFZX1NJWkUoYWNjZWxlcmF0aW9uKTsgaisrKSB7CisgICAgICAgICAgICBkaWZmX2NvbXBvbmVudCA9IGFjY2VsZXJhdGlvbltqXSAtIGdyYXZpdHlbaV1bal07CisgICAgICAgICAgICBkaWZmX2NvbXBvbmVudCAqPSBkaWZmX2NvbXBvbmVudDsKKyAgICAgICAgICAgIGRpZmZfbm9ybSArPSBkaWZmX2NvbXBvbmVudDsKKyAgICAgICAgfQorICAgICAgICBpZiAobWluX2RpZmZfbm9ybSA+IGRpZmZfbm9ybSkgeworICAgICAgICAgICAgbWluX2RpZmZfbm9ybSA9IGRpZmZfbm9ybTsKKyAgICAgICAgICAgIGdyYXZpdHlfZGlyZWN0aW9uX2luZGV4ID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEx5aW5nIGZhY2UgdXAvZG93biBkb2Vzbid0IGNoYW5nZSB0aGUgc2NyZWVuIG9yaWVudGF0aW9uLgorICAgIC8vIEluIG90aGVyIGNhc2VzLCB1cGRhdGUgdGhlIGxhc3Qga25vd24gb3JpZW50YXRpb24KKyAgICBpZiAoZ3Jhdml0eV9kaXJlY3Rpb25faW5kZXggPiAxKSB7CisgICAgICAgIHNHbG9iYWxzLT5sYXN0X2tub3duX3NjcmVlbl9vcmllbnRhdGlvbiA9CisgICAgICAgICAgICBvcmllbnRhdGlvbnNbZ3Jhdml0eV9kaXJlY3Rpb25faW5kZXggLSAyXTsKKyAgICB9CisKKyAgICByZXR1cm4gc0dsb2JhbHMtPmxhc3Rfa25vd25fc2NyZWVuX29yaWVudGF0aW9uOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGNvbnRlbnRzIG9mIHRoZSB3aW5kb3cgY2hhbmdlcy4KK3N0YXRpYyB2b2lkIG9uRnJhbWVidWZmZXJQb3N0ZWQodm9pZCosIGludCB3LCBpbnQgaCwgY29uc3Qgdm9pZCogcGl4ZWxzKSB7CisgICAgLy8gV2UgZXhwZWN0IHNjcmVlbiBjb250ZW50cyB0byBpbiBSR0IgZm9ybWF0LCBvbmUgYnl0ZSBwZXIgY2hhbm5lbC4KKyAgICBzdGF0aWMgY29uc3QgaW50IGJ5dGVzX3Blcl9waXhlbCA9IDM7CisgICAgc3RhdGljIGNvbnN0IGludCBqcGVnX3F1YWxpdHkgPSA1MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IGRpcmVjdGlvbiA9IDE7CisKKyAgICBpZiAoc0dsb2JhbHMtPnNvY2tldCkgeworICAgICAgICAvLyBKUEVHLWNvbXByZXNzIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93LgorICAgICAgICBjb25zdCB1aW50OF90KiBmYiA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihwaXhlbHMpOworICAgICAgICBqcGVnX2NvbXByZXNzb3JfY29tcHJlc3NfZmIoCisgICAgICAgICAgICBzR2xvYmFscy0+anBlZ19jb21wcmVzc29yLAorICAgICAgICAgICAgMCwgMCwgdywgaCwKKyAgICAgICAgICAgIGgsCisgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWwsIHcgKiBieXRlc19wZXJfcGl4ZWwsCisgICAgICAgICAgICBmYiwKKyAgICAgICAgICAgIGpwZWdfcXVhbGl0eSwKKyAgICAgICAgICAgIGRpcmVjdGlvbik7CisgICAgICAgIHZvaWQqIGNvbXByX2J1ZiA9CisgICAgICAgICAgICBqcGVnX2NvbXByZXNzb3JfZ2V0X2J1ZmZlcihzR2xvYmFscy0+anBlZ19jb21wcmVzc29yKTsKKworICAgICAgICAvLyBGaWxsIG91dCBoZWFkZXIgZmllbGRzLgorICAgICAgICBGcmFtZWJ1ZmZlclBhY2tldEhlYWRlciogaGRyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lYnVmZmVyUGFja2V0SGVhZGVyKj4oY29tcHJfYnVmKTsKKyAgICAgICAgaGRyLT5idWZfc2l6ZSA9CisgICAgICAgICAgICBqcGVnX2NvbXByZXNzb3JfZ2V0X2pwZWdfc2l6ZShzR2xvYmFscy0+anBlZ19jb21wcmVzc29yKTsKKyAgICAgICAgaGRyLT5zY3JlZW5fb3JpZW50YXRpb24gPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihndWVzc1NjcmVlbk9yaWVudGF0aW9uKCkpOworCisgICAgICAgIC8vIFNlbmQgdGhlIHVwZGF0ZSB0byB0aGUgY29udHJvbGxlciBhcHAuCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnNvY2tldFNlbmQoCisgICAgICAgICAgICBzR2xvYmFscy0+c29ja2V0LT5mZCgpLAorICAgICAgICAgICAgY29tcHJfYnVmLAorICAgICAgICAgICAgc2l6ZW9mKEZyYW1lYnVmZmVyUGFja2V0SGVhZGVyKSArIGhkci0+YnVmX3NpemUpOworICAgIH0KKworfQorCisvLyBIZWxwZXIgdG8gY29udmVydCB0b3VjaCBjb29yZGluYXRlcyBpbiBzY3JlZW4gcGl4ZWxzIGludG8gb25lcyB1c2VkIGJ5CisvLyB0aGUgc3lzdGVtLgorc3RhdGljIGludCBzY2FsZUZvclRvdWNocGFkKGZsb2F0IGluLCBpbnQgYXhpc19pbikgeworICAgIC8vIENvbnN0YW50IGRlZmluZWQgaW4gUUVNVTIgZ2x1ZSBjb2RlLCByZWRlZmluaW5nIGl0IGhlcmUgdG8gYXZvaWQKKyAgICAvLyBpbmNsdWRpbmcgUUVNVTItc3BlY2lmaWMgaGVhZGVycy4KKyAgICBzdGF0aWMgY29uc3QgaW50IHRvdWNocGFkX3NpemUgPSAweDgwMDA7CisgICAgcmV0dXJuIGluICogKHRvdWNocGFkX3NpemUtMSkgLyAoYXhpc19pbi0xKTsKK30KKworLy8gSGFuZGxlcyBhbiBpbmNvbWluZyBwYWNrZXQuCitzdGF0aWMgdm9pZCBoYW5kbGVQYWNrZXQoSW5ib3VuZFBhY2tldCogcCkgeworICAgIHVpbnQzMl90IHR5cGUgPSBudG9obChwLT50eXBlKTsKKyAgICBpZiAodHlwZSA8IFBBQ0tFVF9UWVBFX01UX0FDVElPTl9ET1dOICYmIHNHbG9iYWxzLT5zZW5zb3JzKSB7CisgICAgICAgIC8vIFNlbnNvciBkYXRhIHBhY2tldC4KKyAgICAgICAgc0dsb2JhbHMtPnNlbnNvcnMtPnNldFNlbnNvcigKKyAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0FDQ0VMRVJBVElPTiArICh0eXBlLTEpLAorICAgICAgICAgICAgZmxvYXRfbnRvaGwocC0+eCksCisgICAgICAgICAgICBmbG9hdF9udG9obChwLT55KSwKKyAgICAgICAgICAgIGZsb2F0X250b2hsKHAtPnopKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBNdWx0aXRvdWNoIGRhdGEgcGFja2V0LgorICAgICAgICBpbnQgeCA9CisgICAgICAgICAgICBzY2FsZUZvclRvdWNocGFkKGZsb2F0X250b2hsKHAtPngpLCBhbmRyb2lkX2h3LT5od19sY2Rfd2lkdGgpOworICAgICAgICBpbnQgeSA9CisgICAgICAgICAgICBzY2FsZUZvclRvdWNocGFkKGZsb2F0X250b2hsKHAtPnkpLCBhbmRyb2lkX2h3LT5od19sY2RfaGVpZ2h0KTsKKyAgICAgICAgaW50IHByZXNzdXJlID0gc3RhdGljX2Nhc3Q8aW50PigxMDAuMGYgKiBmbG9hdF9udG9obChwLT56KSk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIFBBQ0tFVF9UWVBFX01UX0FDVElPTl9ET1dOOgorICAgICAgICBjYXNlIFBBQ0tFVF9UWVBFX01UX0FDVElPTl9NT1ZFOgorICAgICAgICAgICAgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcigKKyAgICAgICAgICAgICAgICBNVEVTX0RFVklDRSwKKyAgICAgICAgICAgICAgICBudG9obChwLT50cmFja2luZ19pZCksCisgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgIHByZXNzdXJlLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQQUNLRVRfVFlQRV9NVF9BQ1RJT05fVVA6CisgICAgICAgIGNhc2UgUEFDS0VUX1RZUEVfTVRfQUNUSU9OX0NBTkNFTDoKKyAgICAgICAgICAgIG11bHRpdG91Y2hfdXBkYXRlX3BvaW50ZXIoCisgICAgICAgICAgICAgICAgTVRFU19ERVZJQ0UsCisgICAgICAgICAgICAgICAgbnRvaGwocC0+dHJhY2tpbmdfaWQpLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENhbGxlZCB3aGVuIHRoZXJlJ3Mgc29tZSBkYXRhIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIGNvbnRyb2xsZXIgYXBwCisvLyBjb25uZWN0aW9uLgorc3RhdGljIHZvaWQgb25EYXRhQXZhaWxhYmxlKHZvaWQqIG9wYXF1ZSwgaW50IHNvY2ssIHVuc2lnbmVkIGludCkgeworICAgIHNzaXplX3Qgc2l6ZSA9IDA7CisgICAgYm9vbCBmaXJzdF9yZWFkID0gdHJ1ZTsKKworICAgIC8vIFJlYWQgYXMgbXVjaCBkYXRhIGFzIHBvc3NpYmxlLiBBcyBzb29uIGFzIHdlIGdldCBlbm91Z2ggYnl0ZXMKKyAgICAvLyBmb3IgYSBwYWNrZXQsIHByb2Nlc3MgdGhhdCBwYWNrZXQuCisgICAgZG8geworICAgICAgICBzaXplID0KKyAgICAgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6c29ja2V0UmVjdigKKyAgICAgICAgICAgICAgICBzb2NrLAorICAgICAgICAgICAgICAgIHNHbG9iYWxzLT5wa3RfYnVmICsgc0dsb2JhbHMtPnBrdF9ieXRlc19yZWFkLAorICAgICAgICAgICAgICAgIHNHbG9iYWxzLT5wa3RfYnl0ZXNfcmVtYWluaW5nKTsKKyAgICAgICAgaWYgKGZpcnN0X3JlYWQgJiYgc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VzIGNvbm5lY3Rpb24uCisgICAgICAgICAgICBhbmRyb2lkX2VtdWN0bF9jbGllbnRfZGlzY29ubmVjdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpcnN0X3JlYWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBzR2xvYmFscy0+cGt0X2J5dGVzX3JlbWFpbmluZyAtPSBzaXplOworICAgICAgICAgICAgc0dsb2JhbHMtPnBrdF9ieXRlc19yZWFkICs9IHNpemU7CisgICAgICAgICAgICBpZiAoc0dsb2JhbHMtPnBrdF9ieXRlc19yZW1haW5pbmcgPT0gMCkgeworICAgICAgICAgICAgICAgIEluYm91bmRQYWNrZXQqIHAgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEluYm91bmRQYWNrZXQqPigmc0dsb2JhbHMtPnBrdF9idWYpOworICAgICAgICAgICAgICAgIGhhbmRsZVBhY2tldChwKTsKKyAgICAgICAgICAgICAgICBzR2xvYmFscy0+cGt0X2J5dGVzX3JlbWFpbmluZyA9IHNpemVvZihJbmJvdW5kUGFja2V0KTsKKyAgICAgICAgICAgICAgICBzR2xvYmFscy0+cGt0X2J5dGVzX3JlYWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoc2l6ZSA+IDApOworICAgIGlmIChzaXplIDwgMCAmJiAoZXJybm8gIT0gRUFHQUlOIHx8IGVycm5vICE9IEVXT1VMREJMT0NLKSkgeworICAgICAgICBhbmRyb2lkX2VtdWN0bF9jbGllbnRfZGlzY29ubmVjdCgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgYW5kcm9pZF9lbXVjdGxfY2xpZW50X2luaXQodm9pZCkgeworICAgIHNHbG9iYWxzLT5sb29wZXIgPSBhbmRyb2lkOjpiYXNlOjpUaHJlYWRMb29wZXI6OmdldCgpOworICAgIHNHbG9iYWxzLT5zZW5zb3JzID0gbnVsbHB0cjsKKyAgICBzR2xvYmFscy0+bGFzdF9rbm93bl9zY3JlZW5fb3JpZW50YXRpb24gPSBTS0lOX1JPVEFUSU9OXzA7CisgICAgc0dsb2JhbHMtPmpwZWdfY29tcHJlc3NvciA9CisgICAgICAgIGpwZWdfY29tcHJlc3Nvcl9jcmVhdGUoCisgICAgICAgICAgICBzaXplb2YoRnJhbWVidWZmZXJQYWNrZXRIZWFkZXIpLAorICAgICAgICAgICAgNDA5Nik7Cit9CisKK3ZvaWQgYW5kcm9pZF9lbXVjdGxfY2xpZW50X2Nvbm5lY3QoaW50IHBvcnQpIHsKKyAgICBhbmRyb2lkX2VtdWN0bF9jbGllbnRfZGlzY29ubmVjdCgpOworICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZFNvY2tldCBzb2NrICgKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KHBvcnQpKTsKKyAgICBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZXROb25CbG9ja2luZyhzb2NrLmdldCgpKTsKKyAgICBpZiAoc29jay5nZXQoKSA+IDApIHsKKyAgICAgICAgc0dsb2JhbHMtPnBrdF9ieXRlc19yZW1haW5pbmcgPSBzaXplb2YoSW5ib3VuZFBhY2tldCk7CisgICAgICAgIHNHbG9iYWxzLT5wa3RfYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIHNHbG9iYWxzLT5zb2NrZXQucmVzZXQoCisgICAgICAgICAgICBzR2xvYmFscy0+bG9vcGVyLT5jcmVhdGVGZFdhdGNoKAorICAgICAgICAgICAgICAgIHNvY2sucmVsZWFzZSgpLAorICAgICAgICAgICAgICAgIG9uRGF0YUF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICBudWxscHRyKSk7CisgICAgICAgIHNHbG9iYWxzLT5zb2NrZXQtPndhbnRSZWFkKCk7CisgICAgICAgIGdwdV9mcmFtZV9zZXRfcG9zdF9jYWxsYmFjaygKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TG9vcGVyKj4oc0dsb2JhbHMtPmxvb3BlciksCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgb25GcmFtZWJ1ZmZlclBvc3RlZCk7CisgICAgfQorfQorCit2b2lkIGFuZHJvaWRfZW11Y3RsX2NsaWVudF9kaXNjb25uZWN0KHZvaWQpIHsKKyAgICBncHVfZnJhbWVfc2V0X3Bvc3RfY2FsbGJhY2soCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PExvb3Blcio+KHNHbG9iYWxzLT5sb29wZXIpLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIpOworICAgIHNHbG9iYWxzLT5zb2NrZXQucmVzZXQoMCk7Cit9CisKK3ZvaWQgYW5kcm9pZF9lbXVjdGxfY2xpZW50X3NldHNlbnNvcnMoY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIGFnZW50KSB7CisgICAgc0dsb2JhbHMtPnNlbnNvcnMgPSBhZ2VudDsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWN0bC1jbGllbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVjdGwtY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxYmY5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVjdGwtY2xpZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3NlbnNvcnNfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3VzZXJfZXZlbnRfYWdlbnQuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKK2V4dGVybiB2b2lkIGFuZHJvaWRfZW11Y3RsX2NsaWVudF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW5kcm9pZF9lbXVjdGxfY2xpZW50X3NldHNlbnNvcnMoY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIGFnZW50KTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfZW11Y3RsX2NsaWVudF9jb25uZWN0KGludCBwb3J0KTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfZW11Y3RsX2NsaWVudF9kaXNjb25uZWN0KHZvaWQpOworQU5EUk9JRF9FTkRfSEVBREVSCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI1ODIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJEZWJ1Z1BpcGUuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworQW5kcm9pZFBpcGUqIEFkYkRlYnVnUGlwZTo6U2VydmljZTo6Y3JlYXRlKHZvaWQqIGh3UGlwZSwgY29uc3QgY2hhciogYXJncykgeworICAgIHJldHVybiBuZXcgQWRiRGVidWdQaXBlKGh3UGlwZSwgdGhpcywgbU91dHB1dC5nZXQoKSk7Cit9CisKK2Jvb2wgQWRiRGVidWdQaXBlOjpTZXJ2aWNlOjpjYW5Mb2FkKCkgY29uc3QgeworICAgIC8vIGNhbkxvYWQoKSByZXR1cm5zIHRydWUgdG8gYXZvaWQgZm9yY2UtY2xvc2luZyB0aGUgcGlwZSBvbgorICAgIC8vIHJlc3RvcmUuIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHN0YXRlIHRvIHNhdmUgcHJvcGVyIDopCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0FuZHJvaWRQaXBlKiBBZGJEZWJ1Z1BpcGU6OlNlcnZpY2U6OmxvYWQodm9pZCogaHdQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgeworICAgIC8vIE5vIHN0YXRlIHRvIGxvYWQsIGp1c3QgY3JlYXRlIG5ldyBpbnN0YW5jZS4KKyAgICByZXR1cm4gY3JlYXRlKGh3UGlwZSwgYXJncyk7Cit9CisKK3ZvaWQgQWRiRGVidWdQaXBlOjpvbkd1ZXN0Q2xvc2UoKSB7CisgICAgLy8gTm90aGluZyB0byBkbyBoZXJlCit9CisKK3Vuc2lnbmVkIEFkYkRlYnVnUGlwZTo6b25HdWVzdFBvbGwoKSBjb25zdCB7CisgICAgLy8gR3Vlc3QgY2FuIGFsd2F5cyB3cml0ZSBhbmQgbmV2ZXIgcmVhZC4KKyAgICByZXR1cm4gUElQRV9QT0xMX09VVDsKK30KKworaW50IEFkYkRlYnVnUGlwZTo6b25HdWVzdFJlY3YoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBjb3VudCkgeworICAgIC8vIEd1ZXN0IGNhbiBuZXZlciByZWFkLgorICAgIHJldHVybiBQSVBFX0VSUk9SX0lPOworfQorCitpbnQgQWRiRGVidWdQaXBlOjpvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSB7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgd2hpbGUgKG51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGlmIChtT3V0cHV0KSB7CisgICAgICAgICAgICBtT3V0cHV0LT53cml0ZShidWZmZXJzLT5kYXRhLCBidWZmZXJzLT5zaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJzLT5zaXplKTsKKyAgICAgICAgYnVmZmVycysrOworICAgICAgICBudW1CdWZmZXJzLS07CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgQWRiRGVidWdQaXBlOjpvbkd1ZXN0V2FudFdha2VPbihpbnQgZmxhZ3MpIHsKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGhlcmUsIHNpbmNlIG9uR3Vlc3RTZW5kKCkgbmV2ZXIgcmV0dXJucworICAgIC8vIFBJUEVfRVJST1JfQUdBSU4uCit9CisKK3ZvaWQgQWRiRGVidWdQaXBlOjpvblNhdmUoYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pIHsKKyAgICAvLyBObyBzdGF0ZSB0byBzYXZlLgorfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJEZWJ1Z1BpcGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1MWZiOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FuZHJvaWRQaXBlLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCisvLyBBZGJEZWJ1Z1BpcGUgaW1wbGVtZW50cyBwaXBlcyBmb3IgdGhlICdxZW11ZDphZGItZGVidWcnIHBpcGUgc2VydmljZQorLy8gd2hpY2ggc2ltcGx5IHByaW50cyBBREIgZGVidWcgbWVzc2FnZXMgdG8gYW4gb3B0aW9uYWwgb3V0cHV0IHN0cmVhbS4KKy8vCisvLyBVc2FnZToKKy8vICAgIDEpIENyZWF0ZSBhIG5ldyBBZGJEZWJ1Z1BpcGU6OlNlcnZpY2UgaW5zdGFuY2UsIHBhc3NpbmcgYW4KKy8vICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSBpbnN0YW5jZSwgb3IgbnVsbHB0ciB0byBkaXNhYmxlIGFueSBvdXRwdXQuCisvLworLy8gICAgMikgQ2FsbCBBbmRyb2lkUGlwZTo6U2VydmljZTo6YWRkKCkgdG8gcmVnaXN0ZXIgaXQgYXQgZW11bGF0aW9uIHNldHVwCisvLyAgICAgICB0aW1lLgorLy8KK2NsYXNzIEFkYkRlYnVnUGlwZSA6IHB1YmxpYyBBbmRyb2lkUGlwZSB7CitwdWJsaWM6CisgICAgdXNpbmcgU3RyZWFtID0gYW5kcm9pZDo6YmFzZTo6U3RyZWFtOworCisgICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICBjbGFzcyBTZXJ2aWNlIDogcHVibGljIEFuZHJvaWRQaXBlOjpTZXJ2aWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIENyZWF0ZSBuZXcgc2VydmljZSBpbnN0YW5jZS4gfG91dHB1dHwgaXMgZWl0aGVyIG51bGxwdHIKKyAgICAgICAgLy8gKHRvIGRpc2FibGUgb3V0cHV0KSwgb3IgYSB2YWxpZCBhbmRyb2lkOjpiYXNlOjpTdHJlYW0KKyAgICAgICAgLy8gaW5zdGFuY2UuIE5PVEU6IFRoaXMgdHJhbnNmZXJzIG93bmVyc2hpcCBvZiB8b3V0cHV0fAorICAgICAgICAvLyB0byB0aGUgc2VydmljZS4KKyAgICAgICAgU2VydmljZShTdHJlYW0qIG91dHB1dCkKKyAgICAgICAgICAgIDogQW5kcm9pZFBpcGU6OlNlcnZpY2UoInFlbXVkOmFkYi1kZWJ1ZyIpLCBtT3V0cHV0KG91dHB1dCkge30KKworICAgICAgICB2aXJ0dWFsIEFuZHJvaWRQaXBlKiBjcmVhdGUodm9pZCogaHdQaXBlLCBjb25zdCBjaGFyKiBhcmdzKSBvdmVycmlkZTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgY2FuTG9hZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHZpcnR1YWwgQW5kcm9pZFBpcGUqIGxvYWQodm9pZCogaHdQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmVhbT4gbU91dHB1dDsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RDbG9zZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdW5zaWduZWQgb25HdWVzdFBvbGwoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0UmVjdihBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IGNvdW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RXYW50V2FrZU9uKGludCBmbGFncykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG9uU2F2ZShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQWRiRGVidWdQaXBlKHZvaWQqIGh3UGlwZSwgU2VydmljZSogc2VydmljZSwgU3RyZWFtKiBvdXRwdXQpCisgICAgICAgIDogQW5kcm9pZFBpcGUoaHdQaXBlLCBzZXJ2aWNlKSwgbU91dHB1dChvdXRwdXQpIHt9CisKKyAgICBTdHJlYW0qIG1PdXRwdXQgPSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWxhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTJmNThhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJEZWJ1Z1BpcGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiRGVidWdQaXBlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RNZW1vcnlPdXRwdXRTdHJlYW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi90ZXN0aW5nL1Rlc3RBbmRyb2lkUGlwZURldmljZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXc7CisKK1RFU1QoQWRiRGVidWdQaXBlLCBub091dHB1dCkgeworICAgIFRlc3RBbmRyb2lkUGlwZURldmljZSB0ZXN0RGV2aWNlOworICAgIEFuZHJvaWRQaXBlOjpTZXJ2aWNlOjphZGQobmV3IEFkYkRlYnVnUGlwZTo6U2VydmljZShudWxscHRyKSk7CisKKyAgICBhdXRvIGd1ZXN0ID0gVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpHdWVzdDo6Y3JlYXRlKCk7CisgICAgRVhQRUNUX0VRKDAsIGd1ZXN0LT5jb25uZWN0KCJxZW11ZDphZGItZGVidWciKSk7CisgICAgY29uc3RleHByIFN0cmluZ1ZpZXcga01lc3NhZ2UgPSAiSGVsbG8gZGVidWcgd29ybGQhIjsKKyAgICBFWFBFQ1RfRVEoa01lc3NhZ2Uuc2l6ZSgpLCBndWVzdC0+d3JpdGUoa01lc3NhZ2UuY19zdHIoKSwga01lc3NhZ2Uuc2l6ZSgpKSk7Cit9CisKK1RFU1QoQWRiRGVidWdQaXBlLCB3aXRoT3V0cHV0KSB7CisgICAgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHRlc3REZXZpY2U7CisgICAgYXV0byBvdXRTdHJlYW0gPSBuZXcgYW5kcm9pZDo6YmFzZTo6VGVzdE1lbW9yeU91dHB1dFN0cmVhbSgpOworICAgIEFuZHJvaWRQaXBlOjpTZXJ2aWNlOjphZGQobmV3IEFkYkRlYnVnUGlwZTo6U2VydmljZShvdXRTdHJlYW0pKTsKKworICAgIGF1dG8gZ3Vlc3QgPSBUZXN0QW5kcm9pZFBpcGVEZXZpY2U6Okd1ZXN0OjpjcmVhdGUoKTsKKyAgICBFWFBFQ1RfRVEoMCwgZ3Vlc3QtPmNvbm5lY3QoInFlbXVkOmFkYi1kZWJ1ZyIpKTsKKyAgICBjb25zdGV4cHIgU3RyaW5nVmlldyBrTWVzc2FnZSA9ICJIZWxsbyBkZWJ1ZyB3b3JsZCEiOworICAgIEVYUEVDVF9FUShrTWVzc2FnZS5zaXplKCksIGd1ZXN0LT53cml0ZShrTWVzc2FnZS5jX3N0cigpLCBrTWVzc2FnZS5zaXplKCkpKTsKKworICAgIEVYUEVDVF9FUShrTWVzc2FnZSwgb3V0U3RyZWFtLT52aWV3KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJHdWVzdFBpcGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJHdWVzdFBpcGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTM4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkd1ZXN0UGlwZS5jcHAKQEAgLTAsMCArMSw1MDIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiR3Vlc3RQaXBlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTb2NrZXRTZXJ2ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHID49IDEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBEKC4uLikgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorI2RlZmluZSBEKC4uLikgKHZvaWQpMAorI2VuZGlmCisKKyNpZiBERUJVRyA+PSAyCisjZGVmaW5lIEREKC4uLikgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorI2RlZmluZSBERCguLi4pICh2b2lkKTAKKyNlbmRpZgorCisjZGVmaW5lIEUoLi4uKSBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiIgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKworI2RlZmluZSBESU5JVCguLi4pIGRvIHsgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSBkcHJpbnQoX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworLy8gVGVjaG5pY2FsIG5vdGU6IGZ1bGwgc3RhdGUgdHJhbnNpdGlvbiBkaWFncmFtCisvLworLy8gU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQ6CisvLyAgIG9uR3Vlc3RDbG9zZSgpIC0+IFN0YXRlOjpDbG9zZWRCeUd1ZXN0CisvLyAgIHJlY2VpdmUgYmFkIGNvbW1hbmQgYnl0ZXMgLT4gU3RhdGU6OkNsb3NlZEJ5SG9zdAorLy8gICByZWNlaXZlIGNvbXBsZXRlIGNvbW1hbmQgLT4gU3RhdGU6OldhaXRpbmdGb3JIb3N0QWRiQ29ubmVjdGlvbiBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGU6OlNlbmRpbmdBY2NlcHRSZXBseU9rCisvLyAgIG9uSG9zdENvbm5lY3Rpb24gLT4gU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQgKHNlbGYpCisvLworLy8gU3RhdGU6OldhaXRpbmdGb3JIb3N0QWRiQ29ubmVjdGlvbjoKKy8vICAgb25HdWVzdENsb3NlIC0+IFN0YXRlOjpDbG9zZWRCeUd1ZXN0CisvLyAgIG9uSG9zdENvbm5lY3Rpb24gLT4gU3RhdGU6OlNlbmRpbmdBY2NlcHRSZXBseU9rCisvLworLy8gU3RhdGU6OlNlbmRpbmdBY2NlcHRSZXBseU9rOgorLy8gICBvbkd1ZXN0Q2xvc2UgLT4gU3RhdGU6OkNsb3NlZEJ5R3Vlc3QKKy8vICAgYWxsIGJ5dGVzIHNlbnQgLT4gU3RhdGU6OldhaXRpbmdGb3JHdWVzdFN0YXJ0Q29tbWFuZAorLy8KKy8vIFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RTdGFydENvbW1hbmQ6CisvLyAgIG9uR3Vlc3RDbG9zZSAtPiBTdGF0ZTo6Q2xvc2VkQnlHdWVzdAorLy8gICByZWNlaXZlIGJhZCBjb21tYW5kIGJ5dGVzIC0+IFN0YXRlOjpDbG9zZWRCeUhvc3QKKy8vICAgcmVjZWl2ZSBjb21wbGV0ZSBjb21tYW5kIC0+IFN0YXRlOjpQcm94eWluZ0RhdGEKKy8vCisvLyBTdGF0ZTo6UHJveHlpbmdEYXRhOgorLy8gICBvbkd1ZXN0Q2xvc2UgLT4gU3RhdGU6OkNsb3NlZEJ5R3Vlc3QKKy8vICAgb24gaG9zdCBkaXNjb25uZWN0IC0+IFN0YXRlOjpDbG9zZWRCeUhvc3QKKy8vICAgZGF0YSBpbiBvciBvdXQgLT4gU3RhdGU7OlByb3h5aW5nRGF0YSAoc2VsZikKKy8vCisvLyBTdGF0ZTo6Q2xvc2VkQnlIb3N0OgorLy8gICBvbkd1ZXN0Q2xvc2UgLT4gU3RhdGU6OkNsb3NlZEJ5R3Vlc3QKKy8vCisvLyBTdGF0ZTo6Q2xvc2VkQnlHdWVzdDoKKy8vICAgY2xvc2UgaG9zdCBzb2NrZXQgLT4gIFN0YXRlOjpDbG9zZWRCeUd1ZXN0CisvLworCit1c2luZyBGZFdhdGNoID0gYW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpGZFdhdGNoOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0V2F0Y2g7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OworCisjaWYgREVCVUcgPj0gMgorc3RhdGljIGludCBidWZmZXJCeXRlcyhjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IGNvdW50KSB7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBjb3VudDsgKytuKSB7CisgICAgICAgIHJlc3VsdCArPSBidWZmZXJzW25dLnNpemU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworQW5kcm9pZFBpcGUqIEFkYkd1ZXN0UGlwZTo6U2VydmljZTo6Y3JlYXRlKHZvaWQqIG1Id1BpcGUsIGNvbnN0IGNoYXIqIGFyZ3MpIHsKKyAgICBhdXRvIHBpcGUgPSBuZXcgQWRiR3Vlc3RQaXBlKG1Id1BpcGUsIHRoaXMsIG1Ib3N0QWdlbnQpOworICAgIG9uUGlwZU9wZW4ocGlwZSk7CisgICAgREQoIiVzOiBbJXBdIGNyZWF0ZWQiLCBfX2Z1bmNfXywgcGlwZSk7CisgICAgcmV0dXJuIHBpcGU7Cit9CisKK3ZvaWQgQWRiR3Vlc3RQaXBlOjpTZXJ2aWNlOjpvbkhvc3RDb25uZWN0aW9uKFNjb3BlZFNvY2tldCYmIHNvY2tldCkgeworICAgIC8vIFRoZXJlIG11c3QgYmUgbm8gYWN0aXZlIHBpcGUgeWV0LCBidXQgYXQgbGVhc3Qgb25lIHdhaXRpbmcKKyAgICAvLyBmb3IgYWN0aXZhdGlvbiBpbiBtUGlwZXMuCisgICAgQ0hFQ0sobUFjdGl2ZVBpcGUgIT0gbnVsbHB0cik7CisgICAgLy8gV2UgaGF2ZSBvbmUgY29ubmVjdGlvbiBmcm9tIGFkYiBzZXZlciwgc3RvcCBsaXN0ZW5pbmcgZm9yIG5vdy4KKyAgICBtSG9zdEFnZW50LT5zdG9wTGlzdGVuaW5nKCk7CisgICAgbUFjdGl2ZVBpcGUtPm9uSG9zdENvbm5lY3Rpb24oc3RkOjptb3ZlKHNvY2tldCkpOworfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6U2VydmljZTo6b25QaXBlT3BlbihBZGJHdWVzdFBpcGUqIHBpcGUpIHsKKyAgICBtUGlwZXMucHVzaF9iYWNrKHBpcGUpOworfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6U2VydmljZTo6b25QaXBlQ2xvc2UoQWRiR3Vlc3RQaXBlKiBwaXBlKSB7CisgICAgbVBpcGVzLmVyYXNlKHN0ZDo6cmVtb3ZlKG1QaXBlcy5iZWdpbigpLCBtUGlwZXMuZW5kKCksIHBpcGUpLCBtUGlwZXMuZW5kKCkpOworICAgIGlmIChtQWN0aXZlUGlwZSA9PSBwaXBlKSB7CisgICAgICAgIG1BY3RpdmVQaXBlID0gbnVsbHB0cjsKKyAgICAgICAgbUhvc3RBZ2VudC0+c3RvcExpc3RlbmluZygpOworICAgICAgICBzZWFyY2hGb3JBY3RpdmVQaXBlKCk7CisgICAgfQorICAgIGRlbGV0ZSBwaXBlOworfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6U2VydmljZTo6c2VhcmNoRm9yQWN0aXZlUGlwZSgpIHsKKyAgICBpZiAoIW1BY3RpdmVQaXBlKSB7CisgICAgICAgIGZvciAoYXV0byBwaXBlIDogbVBpcGVzKSB7CisgICAgICAgICAgICBpZiAocGlwZS0+bVN0YXRlID09IFN0YXRlOjpXYWl0aW5nRm9ySG9zdEFkYkNvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlUGlwZSA9IHBpcGU7CisgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGUgYWdlbnQgdG8gc3RhcnQgbGlzdGVuaW5nIGFnYWluLgorICAgICAgICAgICAgICAgIG1Ib3N0QWdlbnQtPnN0YXJ0TGlzdGVuaW5nKCk7CisKKyAgICAgICAgICAgICAgICAvLyBBbHNvIG5vdGlmeSB0aGUgc2VydmVyIHRoYXQgYW4gZW11bGF0b3IgaW5zdGFuY2UgaXMgd2FpdGluZworICAgICAgICAgICAgICAgIC8vIGZvciBhIGNvbm5lY3Rpb24uIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIEFEQiBTZXJ2ZXIgd2FzCisgICAgICAgICAgICAgICAgLy8gcmVzdGFydGVkIG9uIHRoZSBob3N0LCBidXQgY291bGQgbm90IHNlZSB0aGUgY3VycmVudCBlbXVsYXRvcgorICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlIGJlY2F1c2UgaXQncyBsaXN0ZW5pbmcgb24gYSAnbm9uLXN0YW5kYXJkJyBBREIgcG9ydC4KKyAgICAgICAgICAgICAgICBtSG9zdEFnZW50LT5ub3RpZnlTZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworQWRiR3Vlc3RQaXBlOjp+QWRiR3Vlc3RQaXBlKCkgeworICAgIEREKCIlczogWyVwXSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7CisgICAgQ0hFQ0sobVN0YXRlID09IFN0YXRlOjpDbG9zZWRCeUd1ZXN0KTsKK30KKwordm9pZCBBZGJHdWVzdFBpcGU6Om9uR3Vlc3RDbG9zZSgpIHsKKyAgICBERCgiJXM6IFslcF0iLCBfX2Z1bmNfXywgdGhpcyk7CisgICAgbVN0YXRlID0gU3RhdGU6OkNsb3NlZEJ5R3Vlc3Q7CisgICAgRElOSVQoIiVzOiBbJXBdIEFkYiBjbG9zZWQgYnkgZ3Vlc3QiLF9fZnVuY19fLCB0aGlzKTsKKyAgICBtSG9zdFNvY2tldC5yZXNldCgpOworICAgIHNlcnZpY2UoKS0+b25QaXBlQ2xvc2UodGhpcyk7ICAvLyBUaGlzIGRlbGV0ZXMgdGhlIGluc3RhbmNlLgorfQorCit1bnNpZ25lZCBBZGJHdWVzdFBpcGU6Om9uR3Vlc3RQb2xsKCkgY29uc3QgeworICAgIEREKCIlczogWyVwXSIsIF9fZnVuY19fLCB0aGlzKTsKKyAgICB1bnNpZ25lZCByZXN1bHQgPSAwOworICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQ6CisgICAgICAgIGNhc2UgU3RhdGU6OldhaXRpbmdGb3JHdWVzdFN0YXJ0Q29tbWFuZDoKKyAgICAgICAgICAgIHJlc3VsdCA9IFBJUEVfUE9MTF9PVVQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFN0YXRlOjpTZW5kaW5nQWNjZXB0UmVwbHlPazoKKyAgICAgICAgICAgIHJlc3VsdCA9IFBJUEVfUE9MTF9JTjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU3RhdGU6OlByb3h5aW5nRGF0YTogeworICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MgPSBtSG9zdFNvY2tldC0+cG9sbCgpOworICAgICAgICAgICAgaWYgKGZsYWdzICYgRmRXYXRjaDo6a0V2ZW50UmVhZCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBQSVBFX1BPTExfSU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGZFdhdGNoOjprRXZlbnRXcml0ZSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBQSVBFX1BPTExfT1VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFN0YXRlOjpDbG9zZWRCeUhvc3Q6CisgICAgICAgICAgICByZXN1bHQgfD0gUElQRV9QT0xMX0hVUDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgQWRiR3Vlc3RQaXBlOjpvbkd1ZXN0UmVjdihBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBERCgiJXM6IFslcF0gbnVtQnVmZmVycz0lZCBieXRlcz0lZCBzdGF0ZT0lcyIsIF9fZnVuY19fLCB0aGlzLCBudW1CdWZmZXJzLAorICAgICAgIGJ1ZmZlckJ5dGVzKGJ1ZmZlcnMsIG51bUJ1ZmZlcnMpLCB0b1N0cmluZyhtU3RhdGUpKTsKKyAgICBpZiAobVN0YXRlID09IFN0YXRlOjpQcm94eWluZ0RhdGEpIHsKKyAgICAgICAgLy8gQ29tbW9uIGNhc2UsIHByb3h5LWluZyB0aGUgZGF0YSBmcm9tIHRoZSBob3N0IHRvIHRoZSBndWVzdC4KKyAgICAgICAgcmV0dXJuIG9uR3Vlc3RSZWN2RGF0YShidWZmZXJzLCBudW1CdWZmZXJzKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTdGF0ZTo6U2VuZGluZ0FjY2VwdFJlcGx5T2spIHsKKyAgICAgICAgLy8gVGhlIGd1ZXN0IGlzIHJlY2VpdmluZyB0aGUgJ29rJyByZXBseS4KKyAgICAgICAgcmV0dXJuIG9uR3Vlc3RSZWN2UmVwbHkoYnVmZmVycywgbnVtQnVmZmVycyk7CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU3RhdGU6OldhaXRpbmdGb3JIb3N0QWRiQ29ubmVjdGlvbiB8fAorICAgICAgICAgICAgICAgbVN0YXRlID09IFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RTdGFydENvbW1hbmQpIHsKKyAgICAgICAgLy8gTm90IHJlYWR5IHlldCB0byBzZW5kIGRhdGEgdG8gdGhlIGd1ZXN0LgorICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9BR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVN0YXRlICE9IFN0YXRlOjpDbG9zZWRCeUhvc3QpIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgc3RhdGUgISEhCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHN0YXRlOiAiIDw8IHRvU3RyaW5nKG1TdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfSU87CisgICAgfQorfQorCitpbnQgQWRiR3Vlc3RQaXBlOjpvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSB7CisgICAgREQoIiVzOiBbJXBdIG51bUJ1ZmZlcnM9JWQgYnl0ZXM9JWQgc3RhdGU9JXMiLCBfX2Z1bmNfXywgdGhpcywgbnVtQnVmZmVycywKKyAgICAgICBidWZmZXJCeXRlcyhidWZmZXJzLCBudW1CdWZmZXJzKSwgdG9TdHJpbmcobVN0YXRlKSk7CisgICAgaWYgKG1TdGF0ZSA9PSBTdGF0ZTo6UHJveHlpbmdEYXRhKSB7CisgICAgICAgIC8vIENvbW1vbi1jYXNlLCBwcm94eS1pbmcgdGhlIGRhdGEgZnJvbSB0aGUgZ3Vlc3QgdG8gdGhlIGhvc3QuCisgICAgICAgIHJldHVybiBvbkd1ZXN0U2VuZERhdGEoYnVmZmVycywgbnVtQnVmZmVycyk7CisgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQgfHwKKyAgICAgICAgICAgICAgIG1TdGF0ZSA9PSBTdGF0ZTo6V2FpdGluZ0Zvckd1ZXN0U3RhcnRDb21tYW5kKSB7CisgICAgICAgIC8vIFdhaXRpbmcgY29tbWFuZCBieXRlcyBmcm9tIHRoZSBndWVzdC4KKyAgICAgICAgcmV0dXJuIG9uR3Vlc3RTZW5kQ29tbWFuZChidWZmZXJzLCBudW1CdWZmZXJzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobVN0YXRlICE9IFN0YXRlOjpDbG9zZWRCeUhvc3QpIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgc3RhdGUgISEhCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHN0YXRlOiAiIDw8IHRvU3RyaW5nKG1TdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfSU87CisgICAgfQorfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6b25HdWVzdFdhbnRXYWtlT24oaW50IGZsYWdzKSB7CisgICAgaWYgKGZsYWdzICYgUElQRV9XQUtFX1JFQUQpIHsKKyAgICAgICAgaWYgKG1Ib3N0U29ja2V0LmdldCgpKSB7CisgICAgICAgICAgICBtSG9zdFNvY2tldC0+d2FudFJlYWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBQSVBFX1dBS0VfV1JJVEUpIHsKKyAgICAgICAgaWYgKG1Ib3N0U29ja2V0LmdldCgpKSB7CisgICAgICAgICAgICBtSG9zdFNvY2tldC0+d2FudFdyaXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQWRiR3Vlc3RQaXBlOjpvbkhvc3RDb25uZWN0aW9uKFNjb3BlZFNvY2tldCYmIHNvY2tldCkgeworICAgIEREKCIlczogWyVwXSBob3N0IGNvbm5lY3Rpb24iLCBfX2Z1bmNfXywgdGhpcyk7CisgICAgQ0hFQ0sobVN0YXRlIDw9IFN0YXRlOjpXYWl0aW5nRm9ySG9zdEFkYkNvbm5lY3Rpb24pOworICAgIGFuZHJvaWQ6OmJhc2U6OnNvY2tldFNldE5vbkJsb2NraW5nKHNvY2tldC5nZXQoKSk7CisgICAgLy8gc29ja2V0U2V0Tm9EZWxheSgpIHJlZHVjZXMgdGhlIGxhdGVuY3kgb2Ygc2VuZGluZyBkYXRhLCBhdCB0aGUgY29zdAorICAgIC8vIG9mIGNyZWF0aW5nIG1vcmUgVENQIHBhY2tldHMgb24gdGhlIGNvbm5lY3Rpb24uIEl0J3MgdXNlZnVsIHdoZW4KKyAgICAvLyBkb2luZyBsb3RzIG9mIHNtYWxsIHNlbmQoKSBjYWxscywgbGlrZSB0aGUgQURCIHByb3RvY29sIHJlcXVpcmVzLgorICAgIC8vIEFuZCBzaW5jZSB0aGlzIGlzIG9uIGxvY2FsaG9zdCwgdGhlIHBhY2tldCBpbmNyZWFzZSBzaG91bGQgbm90IGJlCisgICAgLy8gbm90aWNlYWJsZS4KKyAgICBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZXROb0RlbGF5KHNvY2tldC5nZXQoKSk7CisKKyAgICBtSG9zdFNvY2tldC5yZXNldChhbmRyb2lkOjpiYXNlOjpUaHJlYWRMb29wZXI6OmdldCgpLT5jcmVhdGVGZFdhdGNoKAorICAgICAgICAgICAgc29ja2V0LnJlbGVhc2UoKSwKKyAgICAgICAgICAgIFtdKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBZGJHdWVzdFBpcGUqPihvcGFxdWUpLT5vbkhvc3RTb2NrZXRFdmVudChldmVudHMpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHRoaXMpKTsKKworICAgIHdhaXRGb3JIb3N0Q29ubmVjdGlvbigpOworfQorCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIqIEFkYkd1ZXN0UGlwZTo6dG9TdHJpbmcoQWRiR3Vlc3RQaXBlOjpTdGF0ZSBzdGF0ZSkgeworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTdGF0ZTo6V2FpdGluZ0Zvckd1ZXN0QWNjZXB0Q29tbWFuZDoKKyAgICAgICAgICAgIHJldHVybiAiV2FpdGluZ0Zvckd1ZXN0QWNjZXB0Q29tbWFuZCI7CisgICAgICAgIGNhc2UgU3RhdGU6OldhaXRpbmdGb3JIb3N0QWRiQ29ubmVjdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAiV2FpdGluZ0Zvckhvc3RBZGJDb25uZWN0aW9uIjsKKyAgICAgICAgY2FzZSBTdGF0ZTo6U2VuZGluZ0FjY2VwdFJlcGx5T2s6CisgICAgICAgICAgICByZXR1cm4gIlNlbmRpbmdBY2NlcHRSZXBseU9rIjsKKyAgICAgICAgY2FzZSBTdGF0ZTo6V2FpdGluZ0Zvckd1ZXN0U3RhcnRDb21tYW5kOgorICAgICAgICAgICAgcmV0dXJuICJXYWl0aW5nRm9yR3Vlc3RTdGFydENvbW1hbmQiOworICAgICAgICBjYXNlIFN0YXRlOjpQcm94eWluZ0RhdGE6CisgICAgICAgICAgICByZXR1cm4gIlByb3h5aW5nRGF0YSI7CisgICAgICAgIGNhc2UgU3RhdGU6OkNsb3NlZEJ5R3Vlc3Q6CisgICAgICAgICAgICByZXR1cm4gIkNsb3NlZEJ5R3Vlc3QiOworICAgICAgICBjYXNlIFN0YXRlOjpDbG9zZWRCeUhvc3Q6CisgICAgICAgICAgICByZXR1cm4gIkNsb3NlZEJ5SG9zdCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIlVua25vd24iOworICAgIH0KK30KKworLy8gQ2FsbGVkIHdoZW5ldmVyIGFuIGkvbyBldmVudCBvY2N1cnMgb24gdGhlIGhvc3Qgc29ja2V0Lgordm9pZCBBZGJHdWVzdFBpcGU6Om9uSG9zdFNvY2tldEV2ZW50KHVuc2lnbmVkIGV2ZW50cykgeworICAgIGludCB3YWtlRmxhZ3MgPSAwOworICAgIGlmICgoZXZlbnRzICYgRmRXYXRjaDo6a0V2ZW50UmVhZCkgIT0gMCkgeworICAgICAgICB3YWtlRmxhZ3MgfD0gUElQRV9XQUtFX1JFQUQ7CisgICAgICAgIG1Ib3N0U29ja2V0LT5kb250V2FudFJlYWQoKTsKKyAgICB9CisgICAgaWYgKChldmVudHMgJiBGZFdhdGNoOjprRXZlbnRXcml0ZSkgIT0gMCkgeworICAgICAgICB3YWtlRmxhZ3MgfD0gUElQRV9XQUtFX1dSSVRFOworICAgICAgICBtSG9zdFNvY2tldC0+ZG9udFdhbnRXcml0ZSgpOworICAgIH0KKyAgICBpZiAod2FrZUZsYWdzKSB7CisgICAgICAgIHNpZ25hbFdha2Uod2FrZUZsYWdzKTsKKyAgICB9Cit9CisKK2ludCBBZGJHdWVzdFBpcGU6Om9uR3Vlc3RSZWN2RGF0YShBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBERCgiJXM6IFslcF0gbnVtQnVmZmVycz0lZCBieXRlcz0lZCIsIF9fZnVuY19fLCB0aGlzLCBudW1CdWZmZXJzLAorICAgICAgICBidWZmZXJCeXRlcyhidWZmZXJzLCBudW1CdWZmZXJzKSk7CisgICAgQ0hFQ0sobVN0YXRlID09IFN0YXRlOjpQcm94eWluZ0RhdGEpOworICAgIGludCByZXN1bHQgPSAwOworICAgIHdoaWxlIChudW1CdWZmZXJzID4gMCkgeworICAgICAgICB1aW50OF90KiBkYXRhID0gYnVmZmVyc1swXS5kYXRhOworICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBidWZmZXJzWzBdLnNpemU7CisgICAgICAgIEREKCIlczogWyVwXSBkYXRhU2l6ZT0lZCIsIF9fZnVuY19fLCB0aGlzLCAoaW50KWRhdGFTaXplKTsKKyAgICAgICAgd2hpbGUgKGRhdGFTaXplID4gMCkgeworICAgICAgICAgICAgc3NpemVfdCBsZW4gPSBhbmRyb2lkOjpiYXNlOjpzb2NrZXRSZWN2KG1Ib3N0U29ja2V0LT5mZCgpLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgZGF0YSArPSBsZW47CisgICAgICAgICAgICAgICAgZGF0YVNpemUgLT0gbGVuOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDxpbnQ+KGxlbik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtSG9zdFNvY2tldC0+ZG9udFdhbnRSZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0FHQUlOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRW5kIG9mIHN0cmVhbSBvciBpL28gZXJyb3IgbWVhbnMgdGhlIGd1ZXN0IGhhcyBjbG9zZWQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhvc3RTb2NrZXQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU3RhdGU6OkNsb3NlZEJ5SG9zdDsKKyAgICAgICAgICAgICAgICAgICAgRElOSVQoIiVzOiBbJXBdIEFkYiBjbG9zZWQgYnkgaG9zdCIsX19mdW5jX18sIHRoaXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTb21lIGRhdGEgd2FzIHJlY2VpdmVkIHNvIHJlcG9ydCBpdCwgdGhlIGd1ZXN0IHdpbGwgaGF2ZQorICAgICAgICAgICAgLy8gdG8gdHJ5IGFnYWluIHRvIGdldCBhbiBlcnJvci4KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVycysrOworICAgICAgICBudW1CdWZmZXJzLS07CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBBZGJHdWVzdFBpcGU6Om9uR3Vlc3RTZW5kRGF0YShjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgeworICAgIEREKCIlczogWyVwXSBudW1CdWZmZXJzPSVkIGJ5dGVzPSVkIiwgX19mdW5jX18sIHRoaXMsIG51bUJ1ZmZlcnMsCisgICAgICAgIGJ1ZmZlckJ5dGVzKGJ1ZmZlcnMsIG51bUJ1ZmZlcnMpKTsKKyAgICBDSEVDSyhtU3RhdGUgPT0gU3RhdGU6OlByb3h5aW5nRGF0YSk7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgd2hpbGUgKG51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBidWZmZXJzWzBdLmRhdGE7CisgICAgICAgIHNpemVfdCBkYXRhU2l6ZSA9IGJ1ZmZlcnNbMF0uc2l6ZTsKKyAgICAgICAgd2hpbGUgKGRhdGFTaXplID4gMCkgeworICAgICAgICAgICAgc3NpemVfdCBsZW4gPSBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZW5kKG1Ib3N0U29ja2V0LT5mZCgpLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgZGF0YSArPSBsZW47CisgICAgICAgICAgICAgICAgZGF0YVNpemUgLT0gbGVuOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdGF0aWNfY2FzdDxpbnQ+KGxlbik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtSG9zdFNvY2tldC0+ZG9udFdhbnRXcml0ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9BR0FJTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBzdHJlYW0gb3IgaS9vIGVycm9yIG1lYW5zIHRoZSBndWVzdCBoYXMgY2xvc2VkCisgICAgICAgICAgICAgICAgLy8gdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1Ib3N0U29ja2V0LnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFN0YXRlOjpDbG9zZWRCeUhvc3Q7CisgICAgICAgICAgICAgICAgICAgIERJTklUKCIlczogWyVwXSBBZGIgY2xvc2VkIGJ5IGhvc3QiLF9fZnVuY19fLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU29tZSBkYXRhIHdhcyByZWNlaXZlZCBzbyByZXBvcnQgaXQsIHRoZSBndWVzdCB3aWxsIGhhdmUKKyAgICAgICAgICAgIC8vIHRvIHRyeSBhZ2FpbiB0byBnZXQgYW4gZXJyb3IuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcnMrKzsKKyAgICAgICAgbnVtQnVmZmVycy0tOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgQWRiR3Vlc3RQaXBlOjpvbkd1ZXN0UmVjdlJlcGx5KEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgbnVtQnVmZmVycykgeworICAgIC8vIFNlbmRpbmcgcmVwbHkgdG8gdGhlIGd1ZXN0LgorICAgIENIRUNLKG1TdGF0ZSA9PSBTdGF0ZTo6U2VuZGluZ0FjY2VwdFJlcGx5T2spOworICAgIEREKCIlczogWyVwXSBudW1CdWZmZXJzPSVkIiwgX19mdW5jX18sIHRoaXMsIG51bUJ1ZmZlcnMpOworICAgIGludCByZXN1bHQgPSAwOworICAgIHdoaWxlIChudW1CdWZmZXJzID4gMCkgeworICAgICAgICB1aW50OF90KiBkYXRhID0gYnVmZmVyc1swXS5kYXRhOworICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBidWZmZXJzWzBdLnNpemU7CisgICAgICAgIHdoaWxlIChkYXRhU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKG1CdWZmZXJTaXplIC0gbUJ1ZmZlclBvcywgZGF0YVNpemUpOworICAgICAgICAgICAgbWVtY3B5KGRhdGEsIG1CdWZmZXIgKyBtQnVmZmVyUG9zLCBhdmFpbCk7CisgICAgICAgICAgICBkYXRhICs9IGF2YWlsOworICAgICAgICAgICAgZGF0YVNpemUgLT0gYXZhaWw7CisgICAgICAgICAgICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8aW50PihhdmFpbCk7CisgICAgICAgICAgICBtQnVmZmVyUG9zICs9IGF2YWlsOworICAgICAgICAgICAgaWYgKG1CdWZmZXJQb3MgPT0gbUJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICAvLyBGdWxsIHJlcGx5IHNlbnQsIG5vdyB3YWl0IGZvciB0aGUgZ3Vlc3QgJ3N0YXJ0JyBjb21tYW5kLgorICAgICAgICAgICAgICAgIHNldEV4cGVjdGVkR3Vlc3RDb21tYW5kKCJzdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGU6OldhaXRpbmdGb3JHdWVzdFN0YXJ0Q29tbWFuZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBidWZmZXJzKys7CisgICAgICAgIG51bUJ1ZmZlcnMtLTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IEFkYkd1ZXN0UGlwZTo6b25HdWVzdFNlbmRDb21tYW5kKGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSB7CisgICAgREQoIiVzOiBbJXBdIG51bUJ1ZmZlcnM9JWQiLCBfX2Z1bmNfXywgdGhpcywgbnVtQnVmZmVycyk7CisgICAgQ0hFQ0sobVN0YXRlID09IFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RBY2NlcHRDb21tYW5kIHx8CisgICAgICAgICAgbVN0YXRlID09IFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RTdGFydENvbW1hbmQpOworICAgIC8vIFdhaXRpbmcgZm9yIGEgY29tbWFuZCBmcm9tIHRoZSBndWVzdC4gSnVzdCBtYXRjaCB0aGUgYnl0ZXMKKyAgICAvLyB3aXRoIHRoZSBleHBlY3RlZCBjb21tYW5kLiBBbnkgbWlzbWF0Y2ggdHJpZ2dlcnMgYW4gSS9PIGVycm9yCisgICAgLy8gd2hpY2ggd2lsbCBmb3JjZSB0aGUgZ3Vlc3QgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgd2hpbGUgKG51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXJzWzBdLmRhdGEpOworICAgICAgICBzaXplX3QgZGF0YVNpemUgPSBidWZmZXJzWzBdLnNpemU7CisgICAgICAgIHdoaWxlIChkYXRhU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKG1CdWZmZXJTaXplIC0gbUJ1ZmZlclBvcywgZGF0YVNpemUpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkYXRhLCBtQnVmZmVyICsgbUJ1ZmZlclBvcywgYXZhaWwpICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBNaXNtYXRjaGVkLCB0aGlzIGlzIG5vdCB3aGF0IHRoZSBwaXBlIGlzIGV4cGVjdGluZy4KKyAgICAgICAgICAgICAgICAvLyBDbG9zaW5nIHRoZSBjb25uZWN0aW9uIG5vdyBpcyBlYXNpZXIgdGhhbiBzZW5kaW5nICdrbycuCisgICAgICAgICAgICAgICAgREQoIiVzOiBbJXBdIG1pc21hdGNoZWQgY29tbWFuZCIsIF9fZnVuY19fLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtSG9zdFNvY2tldC5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0lPOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSArPSBhdmFpbDsKKyAgICAgICAgICAgIGRhdGFTaXplIC09IGF2YWlsOworICAgICAgICAgICAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PGludD4oYXZhaWwpOworICAgICAgICAgICAgbUJ1ZmZlclBvcyArPSBhdmFpbDsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUG9zID09IG1CdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY29tbWFuZCB3YXMgcmVjZWl2ZWQuCisgICAgICAgICAgICAgICAgREQoIiVzOiBbJXBdIGNvbW1hbmQgdmFsaWRhdGVkIiwgX19mdW5jX18sIHRoaXMpOworICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEZvckhvc3RDb25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU3RhdGU6OldhaXRpbmdGb3JHdWVzdFN0YXJ0Q29tbWFuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm94eWluZyBkYXRhIGNhbiBzdGFydCByaWdodCBub3cuCisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFN0YXRlOjpQcm94eWluZ0RhdGE7CisgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gLXZlcmJvc2UsIHByaW50IGEgbWVzc2FnZSBpbmRpY2F0aW5nIGFkYiBpcyBjb25uZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgRElOSVQoIiVzOiBbJXBdIEFkYiBjb25uZWN0ZWQsIHN0YXJ0IHByb3hpbmcgZGF0YSIsX19mdW5jX18sIHRoaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG51bUJ1ZmZlcnMtLTsKKyAgICAgICAgYnVmZmVycysrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6c2V0UmVwbHkoU3RyaW5nVmlldyByZXBseSwgU3RhdGUgbmV3U3RhdGUpIHsKKyAgICBDSEVDSyhuZXdTdGF0ZSA9PSBTdGF0ZTo6U2VuZGluZ0FjY2VwdFJlcGx5T2spOworICAgIENIRUNLKHJlcGx5LnNpemUoKSA8PSBzaXplb2YobUJ1ZmZlcikpOworICAgIG1lbWNweShtQnVmZmVyLCByZXBseS5jX3N0cigpLCByZXBseS5zaXplKCkpOworICAgIG1CdWZmZXJTaXplID0gcmVwbHkuc2l6ZSgpOworICAgIG1CdWZmZXJQb3MgPSAwOworICAgIG1TdGF0ZSA9IG5ld1N0YXRlOworfQorCit2b2lkIEFkYkd1ZXN0UGlwZTo6c2V0RXhwZWN0ZWRHdWVzdENvbW1hbmQoU3RyaW5nVmlldyBjb21tYW5kLCBTdGF0ZSBuZXdTdGF0ZSkgeworICAgIENIRUNLKG5ld1N0YXRlID09IFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RBY2NlcHRDb21tYW5kIHx8CisgICAgICAgICAgbmV3U3RhdGUgPT0gU3RhdGU6OldhaXRpbmdGb3JHdWVzdFN0YXJ0Q29tbWFuZCk7CisgICAgQ0hFQ0soY29tbWFuZC5zaXplKCkgPD0gc2l6ZW9mKG1CdWZmZXIpKTsKKyAgICBtZW1jcHkobUJ1ZmZlciwgY29tbWFuZC5jX3N0cigpLCBjb21tYW5kLnNpemUoKSk7CisgICAgbUJ1ZmZlclNpemUgPSBjb21tYW5kLnNpemUoKTsKKyAgICBtQnVmZmVyUG9zID0gMDsKKyAgICBtU3RhdGUgPSBuZXdTdGF0ZTsKK30KKwordm9pZCBBZGJHdWVzdFBpcGU6OndhaXRGb3JIb3N0Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUhvc3RTb2NrZXQuZ2V0KCkpIHsKKyAgICAgICAgLy8gQSBob3N0IGNvbm5lY3Rpb24gYWxyZWFkeSBleGlzdHMhIFNlbmQgdGhlICdvaycgcmVwbHkgYmFjayB0bworICAgICAgICAvLyB0aGUgZ3Vlc3QuCisgICAgICAgIEREKCIlczogWyVwXSBzZW5kaW5nIHJlcGx5IiwgX19mdW5jX18sIHRoaXMpOworICAgICAgICBzZXRSZXBseSgib2siLCBTdGF0ZTo6U2VuZGluZ0FjY2VwdFJlcGx5T2spOworICAgICAgICBzaWduYWxXYWtlKFBJUEVfV0FLRV9SRUFEKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBob3N0IGNvbm5lY3Rpb24geWV0LiBUaGUgZ3Vlc3QgaXMgc3RpbGwgd2FpdGluZyBmb3IgdGhlICdvaycKKyAgICAgICAgLy8gcmVwbHkuCisgICAgICAgIEREKCIlczogWyVwXSB3YWl0aW5nIGZvciBob3N0IGNvbm5lY3Rpb24iLCBfX2Z1bmNfXywgdGhpcyk7CisgICAgICAgIG1TdGF0ZSA9IFN0YXRlOjpXYWl0aW5nRm9ySG9zdEFkYkNvbm5lY3Rpb247CisgICAgICAgIHNlcnZpY2UoKS0+c2VhcmNoRm9yQWN0aXZlUGlwZSgpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWxhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiR3Vlc3RQaXBlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkd1ZXN0UGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTlhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkd1ZXN0UGlwZS5oCkBAIC0wLDAgKzEsMTkxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1Njb3BlZFNvY2tldFdhdGNoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FkYlR5cGVzLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCisvLyBBZGJHdWVzdFBpcGUgaW1wbGVtZW50cyBhbiBBbmRyb2lkUGlwZSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBndWVzdAorLy8gY29ubmVjdGlvbnMgZnJvbSB0aGUgYWRiZCBkYWVtb24gdG8gdGhlICdxZW11ZDphZGInIHNlcnZpY2UuIEVhY2ggaW5zdGFuY2UKKy8vIGlzIHVzZWQgdG8gaW1wbGVtZW50IGEgc2luZ2xlICd0cmFuc3BvcnQnIGJldHdlZW4gYWRiZCBhbmQgdGhlIGhvc3QgQURCCisvLyBzZXJ2ZXIuCisvLworLy8gVGhlIGVtdWxhdG9yIGltcGxlbWVudHMgdHdvIGNsYXNzZXMgdG8gc3VwcG9ydCB0aGlzOiBBZGJHdWVzdFBpcGUgYW5kCisvLyBBZGJIb3N0TGlzdGVuZXIgYW5kIGV2ZXJ5dGhpbmcgaXMgbGlua2VkIGF0IHJ1bnRpbWUgbGlrZSB0aGlzOgorLy8KKy8vICAgICAgIGd1ZXN0IHNpZGUgICAgICAgICAgICB8ICAgICAgICAgICAgZW11bGF0b3IgICAgICAgICAgICAgICAgICAgfCAgICAgaG9zdAorLy8KKy8vICAgYWRiZCA8LS0+IC9kZXYvcWVtdV9waXBlIDwtLT4gQWRiR3Vlc3RQaXBlIDwtLT4gQWRiSG9zdExpc3RlbmVyIDwtLT4gQURCIFNlcnZlcgorLy8KKy8vIFRoZXJlIGlzIGEgbGl0dGxlIHByb3RvY29sIGJldHdlZW4gYWRiZCBhbmQgdGhlIGVtdWxhdG9yIHdoaWNoIGxvb2tzIGxpa2U6CisvLworLy8gICAxKSBHdWVzdCBvcGVucyAvZGV2L3FlbXVfcGlwZSBhbmQgd3JpdGVzICdwaXBlOnFlbXVkOmFkYjo8cG9ydD5cMCcgdG8KKy8vICAgICAgY29ubmVjdCB0byB0aGUgQURCIHBpcGUgc2VydmljZSwgd2hlcmUgPHBvcnQ+IGlzIGEgZGVjaW1hbCBwb3J0CisvLyAgICAgIG51bWJlciAoNTU1NSBieSBkZWZhdWx0KS4gVGhlIHBvcnQgbnVtYmVyIGlzIGd1ZXN0LXNwZWNpZmljIGFuZAorLy8gICAgICBzaG91bGQgYmUgaWdub3JlZCAoaXQgaXMgYXNzdW1lZCB0byBiZSBoZXJlIGZvciBvYnNvbGV0ZSByZWFzb25zKS4KKy8vCisvLyAgICAgIC0+IFRoaXMgZW5kcyB1cCBjYWxsaW5nIEFkYkd1ZXN0UGlwZTo6U2VydmljZTo6Y3JlYXRlKCkgdG8gY3JlYXRlIGEgbmV3CisvLyAgICAgICAgIGluc3RhbmNlLgorLy8KKy8vICAgMikgR3Vlc3Qgd3JpdGVzICdhY2NlcHQnIHRvIHRlbGwgdGhlIGVtdWxhdG9yIHRvIHN0YXJ0IGFjY2VwdGluZworLy8gICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSBBREIgc2VydmVyLgorLy8KKy8vICAgMykgT25jZSBhIGNvbm5lY3Rpb24gZnJvbSB0aGUgQURCIHNlcnZlciBpcyBlc3RhYmxpc2hlZCwgdGhlIGVtdWxhdG9yCisvLyAgICAgIHNob3VsZCBzZW5kIGJhY2sgJ29rJyAob3IgJ2tvJyAvIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24gdG8gaW5kaWNhdGUKKy8vICAgICAgYW4gZXJyb3IpLgorLy8KKy8vICAgNCkgVGhlIGd1ZXN0IHdpbGwgd3JpdGUgJ3N0YXJ0JyB0byBpbmRpY2F0ZSBpdCBpcyByZWFkeSB0byBleGNoYW5nZQorLy8gICAgICBkYXRhIHdpdGggdGhlIGhvc3QgQURCIHNlcnZlciAoYWxsIGRhdGEgb24gdGhlIHBpcGUgc2hvdWxkIGJlCisvLyAgICAgIHByb3hpZWQgYmV0d2VlbiB0aGUgdHdvIGF0IHRoaXMgcG9pbnQpLgorLy8KKy8vIElNUE9SVEFOVCBOT1RFOiBUaGUgYWRiZCBkYWVtb24gd2lsbCB0eXBpY2FsbHkgY3JlYXRlIGEgbmV3IEFkYkd1ZXN0UGlwZQorLy8gICAgICAgICAgICAgICAgIGluc3RhbmNlIGp1c3QgYWZ0ZXIgdGhhdCwgYnV0IGl0IHdpbGwgb25seSAnYWNjZXB0JworLy8gICAgICAgICAgICAgICAgIG9uZSBhdCBhIHRpbWUuIEZvciBtb3JlIGRldGFpbHMgc2VlIHFlbXVfc29ja2V0X3RocmVhZCgpCisvLyAgICAgICAgICAgICAgICAgaW4gJEFPU1Avc3lzdGVtL2NvcmUvYWRiL3RyYW5zcG9ydF9sb2NhbC5jcHAKKy8vCisvLyBVc2FnZSBpcyB0aGUgZm9sbG93aW5nOgorLy8KKy8vICAgMSkgQ3JlYXRlIGEgbmV3IEFkYkd1ZXN0UGlwZTo6U2VydmljZSBpbnN0YW5jZSwgcGFzc2luZyBhIHZhbGlkCisvLyAgICAgIEFkYkhvc3RBZ2VudCBpbnN0YW5jZSB0byBpdCAoaW4gcHJhY3RpY2UgYW4gQWRiSG9zdExpc3RlbmVyIG9uZSkuCisvLyAgICAgIFRoZW4gY2FsbCBBbmRyb2lkUGlwZTo6U2VydmljZTo6YWRkKCkgdG8gcmVnaXN0ZXIgaXQuCisvLworLy8gTk9URTogVGhpcyBtdXN0IGJlIGRvbmUgYXQgZW11bGF0aW9uIHNldHVwIHRpbWUgZnJvbSB0aGUgUUVNVSBtYWluIGxvb3AhCisvLworY2xhc3MgQWRiR3Vlc3RQaXBlIDogcHVibGljIEFuZHJvaWRQaXBlIHsKK3B1YmxpYzoKKyAgICB1c2luZyBTdHJpbmdWaWV3ID0gOjphbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OworICAgIHVzaW5nIFNjb3BlZFNvY2tldCA9IDo6YW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0OworCisgICAgLy8gQW5kcm9pZFBpcGU6OlNlcnZpY2UgY2xhc3MKKyAgICBjbGFzcyBTZXJ2aWNlIDogcHVibGljIEFuZHJvaWRQaXBlOjpTZXJ2aWNlLCBwdWJsaWMgQWRiR3Vlc3RBZ2VudCB7CisgICAgcHVibGljOgorICAgICAgICBTZXJ2aWNlKEFkYkhvc3RBZ2VudCogaG9zdEFnZW50KQorICAgICAgICAgICAgOiBBbmRyb2lkUGlwZTo6U2VydmljZSgicWVtdWQ6YWRiIiksIG1Ib3N0QWdlbnQoaG9zdEFnZW50KSB7fQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBBZGJHdWVzdFBpcGUgaW5zdGFuY2UuCisgICAgICAgIHZpcnR1YWwgQW5kcm9pZFBpcGUqIGNyZWF0ZSh2b2lkKiBtSHdQaXBlLCBjb25zdCBjaGFyKiBhcmdzKSBvdmVycmlkZTsKKworICAgICAgICAvLyBDYW4ndCBzYXZlIHRoZWlyIHN0YXRlIHRvIGRpc2suCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5Mb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAvLyBPdmVycmlkZGVuIEFkYkd1ZXN0QWdlbnQgbWV0aG9kLgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Ib3N0Q29ubmVjdGlvbihTY29wZWRTb2NrZXQmJiBzb2NrZXQpIG92ZXJyaWRlOworCisgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgbmV3IGFkYiBwaXBlIGNvbm5lY3Rpb24gaXMgb3BlbmVkIGJ5CisgICAgICAgIC8vIHRoZSBndWVzdC4gTm90ZSB0aGF0IHRoaXMgZG9lcyAqbm90KiB0cmFuc2ZlciBvd25lcnNoaXAgb2YgfHBpcGV8LgorICAgICAgICAvLyBUZWNobmljYWxseSwgQW5kcm9pZFBpcGUgaW5zdGFuY2VzIGFyZSBvd25lZCBieSB0aGUgdmlydHVhbCBkZXZpY2UuCisgICAgICAgIC8vIGV4Y2VwdCB3aGVuIG9uR3Vlc3RDbG9zZSgpIGlzIGNhbGxlZCAod2hpY2ggc2hvdWxkIGRlc3Ryb3kgaXQpLgorICAgICAgICB2b2lkIG9uUGlwZU9wZW4oQWRiR3Vlc3RQaXBlKiBwaXBlKTsKKworICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgZ3Vlc3QgY2xvc2VzIGEgcGlwZS4gVGhpcyBtdXN0IGRlbGV0ZSB0aGUgaW5zdGFuY2UuCisgICAgICAgIHZvaWQgb25QaXBlQ2xvc2UoQWRiR3Vlc3RQaXBlKiBwaXBlKTsKKworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBhY3RpdmUgcGlwZSwgc2VhcmNoIGZvciBhbiBpdGVtIGluIHxtUGlwZXN8IHRoYXQKKyAgICAgICAgLy8gaXMgaW4gdGhlIFdhaXRpbmdGb3JIb3N0QWRiQ29ubmVjdGlvbiBzdGF0ZSwgd2hlbiBmb3VuZCByZWNvcmQKKyAgICAgICAgLy8gaXQgYXMgdGhlIGFjdGl2ZSBwaXBlIGFuZCB0ZWxsIHRoZSBob3N0IGFnZW50IHRvIHN0YXJ0IGxpc3RlbmluZworICAgICAgICAvLyBmb3IgaG9zdCBjb25uZWN0aW9ucy4KKyAgICAgICAgdm9pZCBzZWFyY2hGb3JBY3RpdmVQaXBlKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBBZGJIb3N0QWdlbnQqIG1Ib3N0QWdlbnQ7CisgICAgICAgIEFkYkd1ZXN0UGlwZSogbUFjdGl2ZVBpcGUgPSBudWxscHRyOworICAgICAgICBzdGQ6OnZlY3RvcjxBZGJHdWVzdFBpcGUqPiBtUGlwZXM7CisgICAgfTsKKworICAgIHZpcnR1YWwgfkFkYkd1ZXN0UGlwZSgpOworCisgICAgLy8gT3ZlcnJpZGRlbiBBbmRyb2lkUGlwZSBtZXRob2RzLiBDYWxsZWQgZnJvbSB0aGUgZGV2aWNlIGNvbnRleHQuCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RDbG9zZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdW5zaWduZWQgb25HdWVzdFBvbGwoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0UmVjdihBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IGNvdW50KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBvbkd1ZXN0V2FudFdha2VPbihpbnQgZmxhZ3MpIG92ZXJyaWRlOworCisgICAgLy8gQ2FsbGVkIHdoZW4gYSBob3N0IGNvbm5lY3Rpb24gb2NjdXJzLiBUcmFuc2ZlcnMgb3duZXJzaGlwIG9mCisgICAgLy8gfHNvY2tldHwgdG8gdGhlIHBpcGUuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlLCBvbiBlcnJvciByZXR1cm4KKyAgICAvLyBmYWxzZSBhbmQgY2xvc2VzIHRoZSBzb2NrZXQuCisgICAgdm9pZCBvbkhvc3RDb25uZWN0aW9uKFNjb3BlZFNvY2tldCYmIHNvY2tldCk7CisKK3ByaXZhdGU6CisgICAgQWRiR3Vlc3RQaXBlKHZvaWQqIG1Id1BpcGUsIFNlcnZpY2UqIHNlcnZpY2UsIEFkYkhvc3RBZ2VudCogaG9zdEFnZW50KQorICAgICAgICA6IEFuZHJvaWRQaXBlKG1Id1BpcGUsIHNlcnZpY2UpLCBtSG9zdEFnZW50KGhvc3RBZ2VudCkgeworICAgICAgICBzZXRFeHBlY3RlZEd1ZXN0Q29tbWFuZCgiYWNjZXB0IiwgU3RhdGU6OldhaXRpbmdGb3JHdWVzdEFjY2VwdENvbW1hbmQpOworICAgIH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IHNlcnZpY2Ugd2l0aCB0aGUgcmlnaHQgdHlwZS4KKyAgICBTZXJ2aWNlKiBzZXJ2aWNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QWRiR3Vlc3RQaXBlOjpTZXJ2aWNlKj4obVNlcnZpY2UpOworICAgIH0KKworICAgIC8vIEVhY2ggcGlwZSBpbnN0YW5jZSBjYW4gYmUgaW4gb25lIG9mIHRoZXNlIHN0YXRlczoKKyAgICBlbnVtIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgV2FpdGluZ0Zvckd1ZXN0QWNjZXB0Q29tbWFuZCwKKyAgICAgICAgV2FpdGluZ0Zvckhvc3RBZGJDb25uZWN0aW9uLAorICAgICAgICBTZW5kaW5nQWNjZXB0UmVwbHlPaywKKyAgICAgICAgV2FpdGluZ0Zvckd1ZXN0U3RhcnRDb21tYW5kLAorICAgICAgICBQcm94eWluZ0RhdGEsCisgICAgICAgIENsb3NlZEJ5R3Vlc3QsCisgICAgICAgIENsb3NlZEJ5SG9zdCwKKyAgICB9OworCisgICAgLy8gVXNlZCBmb3IgZGVidWdnaW5nLgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b1N0cmluZyhTdGF0ZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBpL28gZXZlbnQgb2NjdXJzIG9uIHRoZSBob3N0IHNvY2tldC4KKyAgICAvLyB8ZXZlbnRzfCBpcyBhIG1hc2sgb2YgRmRXYXRjaDo6a0V2ZW50WFhYIGZsYWdzLgorICAgIHZvaWQgb25Ib3N0U29ja2V0RXZlbnQodW5zaWduZWQgZXZlbnRzKTsKKworICAgIC8vIEltcGxlbWVudCBvbkd1ZXN0UmVjdigpIGFuZCBvbkd1ZXN0U2VuZCgpIHdoaWxlIHByb3h5aW5nIHRoZSBkYXRhCisgICAgLy8gYmV0d2VlbiB0aGUgZ3Vlc3QgYW5kIHRoZSBob3N0LgorICAgIGludCBvbkd1ZXN0UmVjdkRhdGEoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBjb3VudCk7CisgICAgaW50IG9uR3Vlc3RTZW5kRGF0YShjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IGNvdW50KTsKKworICAgIC8vIEltcGxlbWVudCBvbkd1ZXN0UmVjdigpIHdoZW4gc2VuZGluZyBhIHJlcGx5IHRvIHRoZSBndWVzdC4KKyAgICBpbnQgb25HdWVzdFJlY3ZSZXBseShBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IGNvdW50KTsKKworICAgIC8vIEltcGxlbWVudCBvbkd1ZXN0U2VuZCgpIHdoZW4gcmVjZWl2aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBndWVzdC4KKyAgICBpbnQgb25HdWVzdFNlbmRDb21tYW5kKGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgY291bnQpOworCisgICAgLy8gU2V0IHRoZSByZXBseSB0byBzZW5kIHRvIHRoZSBndWVzdCBhcyB8cmVwbHl8LCBhbmQgY2hhbmdlIHRoZSBzdGF0ZQorICAgIC8vIHRvIHxuZXdTdGF0ZXwuCisgICAgdm9pZCBzZXRSZXBseShTdHJpbmdWaWV3IHJlcGx5LCBTdGF0ZSBuZXdTdGF0ZSk7CisKKyAgICAvLyBTZXQgdGhlIGV4cGVjdGVkIHxjb21tYW5kfCB0byB3YWl0IGZyb20gdGhlIGd1ZXN0LCBhbmQgY2hhbmdlIHRoZQorICAgIC8vIHN0YXRlIHRvIHxuZXdTdGF0ZXwuCisgICAgdm9pZCBzZXRFeHBlY3RlZEd1ZXN0Q29tbWFuZChTdHJpbmdWaWV3IGNvbW1hbmQsIFN0YXRlIG5ld1N0YXRlKTsKKworICAgIC8vIFRyeSB0byB3YWl0IGZvciBhIG5ldyBob3N0IGNvbm5lY3Rpb24uIENoYW5nZSB0aGUgc3RhdGUgYWNjb3JkaW5nIHRvCisgICAgLy8gd2hldGhlciBvbmUgYWxyZWFkeSBvY2N1cmVkIG9yIG5vdC4KKyAgICB2b2lkIHdhaXRGb3JIb3N0Q29ubmVjdGlvbigpOworCisgICAgLy8gQ29tbWFuZC9yZXBseSBidWZmZXIgYW5kIGN1cnNvci4KKyAgICBjaGFyIG1CdWZmZXJbMTZdOyAgICAgICAgLy8gdGhlIGNvbW1hbmQgYmVpbmcgYWNjZXB0ZWQgb3IgcmVwbHkgYmVpbmcgc2VudC4KKyAgICBzaXplX3QgbUJ1ZmZlclNpemUgPSAwOyAgLy8gc2l6ZSBvZiB2YWxpZCBieXRlcyBpbiBtQnVmZmVyLgorICAgIHNpemVfdCBtQnVmZmVyUG9zID0gMDsgICAvLyBudW1iZXIgb2YgbWF0Y2hlZCBjb21tYW5kIGJ5dGVzIG9uIGlucHV0L291dHB1dC4KKworICAgIFN0YXRlIG1TdGF0ZSA9IFN0YXRlOjpXYWl0aW5nRm9yR3Vlc3RBY2NlcHRDb21tYW5kOyAgLy8gY3VycmVudCBwaXBlIHN0YXRlLgorICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZFNvY2tldFdhdGNoCisgICAgICAgICAgICBtSG9zdFNvY2tldDsgIC8vIGN1cnJlbnQgaG9zdCBzb2NrZXQsIGlmIGNvbm5lY3RlZC4KKyAgICBBZGJIb3N0QWdlbnQqIG1Ib3N0QWdlbnQgPSBudWxscHRyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWxhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiR3Vlc3RQaXBlX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiR3Vlc3RQaXBlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZhYTkxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJHdWVzdFBpcGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzg0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FkYkd1ZXN0UGlwZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL1RocmVhZExvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi90ZXN0aW5nL1Rlc3RBbmRyb2lkUGlwZURldmljZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworLy8gQmVjYXVzZSBndGVzdCBpbmNsdWRlcyBXaW5kb3dzIGhlYWRlcnMgdGhhdCBkZWNsYXJlIHRoZSBFUlJPUgorLy8gbWFjcm8gdGhhdCBwcmV2ZW50cyBMT0coRVJST1IpIGZyb20gY29tcGlsaW5nISEKKyNpZmRlZiBfV0lOMzIKKyN1bmRlZiBFUlJPUgorI2VuZGlmCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKKwordXNpbmcgVGVzdEd1ZXN0ID0gVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpHdWVzdDsKKworbmFtZXNwYWNlIHsKKworLy8gQSBNb2NrIEFkYkhvc3RBZ2VudCB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcgdGVzdGluZy4gSXQgZG9lc24ndCBkZXBlbmQKKy8vIG9uIGFueSBUQ1AgcG9ydHMuCitjbGFzcyBNb2NrQWRiSG9zdEFnZW50IDogcHVibGljIEFkYkhvc3RBZ2VudCB7CitwdWJsaWM6CisgICAgTW9ja0FkYkhvc3RBZ2VudCgpIHsKKyAgICAgICAgYXV0byBzZXJ2aWNlID0gbmV3IEFkYkd1ZXN0UGlwZTo6U2VydmljZSh0aGlzKTsKKyAgICAgICAgbUd1ZXN0QWdlbnQgPSBzZXJ2aWNlOworICAgICAgICBBbmRyb2lkUGlwZTo6U2VydmljZTo6YWRkKHNlcnZpY2UpOworICAgIH0KKworICAgIH5Nb2NrQWRiSG9zdEFnZW50KCkgeworICAgICAgICBpZiAobVRocmVhZC5nZXQoKSkgeworICAgICAgICAgICAgbVRocmVhZC0+d2FpdChudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBBbmRyb2lkUGlwZTo6U2VydmljZTo6cmVzZXRBbGwoKTsKKyAgICB9CisKKyAgICAvLyBBZGJIb3N0QWdlbnQgb3ZlcnJpZGVzLgorICAgIHZvaWQgc2V0QWdlbnQoQWRiR3Vlc3RBZ2VudCogZ3Vlc3RBZ2VudCkgeyBtR3Vlc3RBZ2VudCA9IGd1ZXN0QWdlbnQ7IH0KKworICAgIHZpcnR1YWwgdm9pZCBzdGFydExpc3RlbmluZygpIG92ZXJyaWRlIHsgbUxpc3RlbmluZyA9IHRydWU7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcExpc3RlbmluZygpIG92ZXJyaWRlIHsgbUxpc3RlbmluZyA9IGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNlcnZlcigpIG92ZXJyaWRlIHsgbVNlcnZlck5vdGlmaWNhdGlvbkNvdW50Kys7IH0KKworICAgIC8vIEFjY2Vzc29ycy4KKyAgICB2aXJ0dWFsIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBtTGlzdGVuaW5nOyB9CisKKyAgICB2aXJ0dWFsIGludCBzZXJ2ZXJOb3RpZmljYXRpb25Db3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2ZXJOb3RpZmljYXRpb25Db3VudDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBzb2NrZXQgcGFpciBhbmQgYSB0aHJlYWQgdGhhdCB3aWxsIHB1c2ggfGRhdGF8IGludG8gaXQKKyAgICAvLyBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgYSBzaW5nbGUgYnl0ZSBmcm9tIG9uZSBlbmQgb2YgdGhlIHBhaXIuCisgICAgLy8gVGhlIG90aGVyIGVuZCBpcyBwYXNzZWQgdG8gYSBuZXcgYWN0aXZlIGd1ZXN0LgorICAgIHZvaWQgY3JlYXRlRmFrZUNvbm5lY3Rpb24oU3RyaW5nVmlldyBkYXRhKSB7CisgICAgICAgIENIRUNLKG1MaXN0ZW5pbmcpOworICAgICAgICBpZiAobVRocmVhZC5nZXQoKSkgeworICAgICAgICAgICAgbVRocmVhZC0+d2FpdChudWxscHRyKTsKKyAgICAgICAgfQorICAgICAgICBtVGhyZWFkLnJlc2V0KG5ldyBDb25uZWN0b3JUaHJlYWQoZGF0YSkpOworICAgICAgICBtTGlzdGVuaW5nID0gZmFsc2U7CisgICAgICAgIG1HdWVzdEFnZW50LT5vbkhvc3RDb25uZWN0aW9uKG1UaHJlYWQtPnJlbGVhc2VPdXRTb2NrZXQoKSk7CisgICAgICAgIG1UaHJlYWQtPnN0YXJ0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIEEgc21hbGwgdGhyZWFkIHRoYXQgd2lsbCBjb25uZWN0IHRvIGEgZ2l2ZW4gcG9ydCBhbmQgc2VuZCBzb21lCisgICAgLy8gZGF0YSB0aHJvdWdoIHRoZSBzb2NrZXQuIEl0IHdpbGwgdGhlbiB0cnkgdG8gcmVhZCBhIHNpbmdsZSBieXRlCisgICAgLy8gYmVmb3JlIGV4aXRpbmcuCisgICAgY2xhc3MgQ29ubmVjdG9yVGhyZWFkIDogcHVibGljIGFuZHJvaWQ6OmJhc2U6OlRocmVhZCB7CisgICAgcHVibGljOgorICAgICAgICBDb25uZWN0b3JUaHJlYWQoU3RyaW5nVmlldyBkYXRhKSA6IFRocmVhZCgpLCBtRGF0YShkYXRhKSB7CisgICAgICAgICAgICBpbnQgaW5Tb2NrZXQsIG91dFNvY2tldDsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpzb2NrZXRDcmVhdGVQYWlyKCZpblNvY2tldCwgJm91dFNvY2tldCkgPCAwKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IHBhaXIiOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE1ha2UgdGhlIHNvY2tldHMgYmxvY2tpbmcgZm9yIHRoaXMgdGVzdCB0byB3b3JrLgorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0U2V0QmxvY2tpbmcoaW5Tb2NrZXQpOworICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0U2V0QmxvY2tpbmcob3V0U29ja2V0KTsKKworICAgICAgICAgICAgbUluU29ja2V0LnJlc2V0KGluU29ja2V0KTsKKyAgICAgICAgICAgIG1PdXRTb2NrZXQucmVzZXQob3V0U29ja2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBtSW5Tb2NrZXQudmFsaWQoKSAmJiBtT3V0U29ja2V0LnZhbGlkKCk7IH0KKworICAgICAgICBpbnQgcmVsZWFzZU91dFNvY2tldCgpIHsgcmV0dXJuIG1PdXRTb2NrZXQucmVsZWFzZSgpOyB9CisKKyAgICAgICAgdmlydHVhbCBpbnRwdHJfdCBtYWluKCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKG1EYXRhLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OnNvY2tldFNlbmRBbGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluU29ja2V0LmdldCgpLCBtRGF0YS5jX3N0cigpLCBtRGF0YS5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIERQTE9HKEVSUk9SKSA8PCAiSS9PIGVycm9yIHdoZW4gc2VuZGluZyBkYXRhIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgYnVmWzFdID0ge307CisgICAgICAgICAgICBzc2l6ZV90IGxlbiA9IGFuZHJvaWQ6OmJhc2U6OnNvY2tldFJlY3YobUluU29ja2V0LmdldCgpLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICBEUExPRyhFUlJPUikgPDwgIkkvTyBlcnJvciB3aGVuIHJlY2VpdmluZyBkYXRhIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgICAgICBETE9HKEVSUk9SKSA8PCAiRGlzY29ubmVjdGVkIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JblNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFNjb3BlZFNvY2tldCBtSW5Tb2NrZXQ7CisgICAgICAgIFNjb3BlZFNvY2tldCBtT3V0U29ja2V0OworICAgICAgICBzdGQ6OnN0cmluZyBtRGF0YTsKKyAgICB9OworCisgICAgQWRiR3Vlc3RBZ2VudCogbUd1ZXN0QWdlbnQgPSBudWxscHRyOworICAgIGJvb2wgbUxpc3RlbmluZyA9IGZhbHNlOworICAgIGludCBtU2VydmVyTm90aWZpY2F0aW9uQ291bnQgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25uZWN0b3JUaHJlYWQ+IG1UaHJlYWQ7Cit9OworCisvLyBUaGUgc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB8Z3Vlc3R8IGlzIGluIG5vbi1ibG9ja2luZyBtb2RlLCB3aGljaAorLy8gbWVhbnMgdGhhdCByZWFkKCkgYXR0ZW1wdHMgd2lsbCBzb21ldGltZXMgcmV0dXJuIFBJUEVfRVJST1JfQUdBSU4uCisvLyBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlc2UgYnkgd2FpdGluZyBhIGxpdHRsZSwgZ2l2aW5nIHNvbWUgdGltZQorLy8gc2xpY2VzIGZvciB0aGUgQ29ubmVjdG9yVGhyZWFkIHRvIHdyaXRlIHByb3Blcmx5LgoraW50IGJsb2NraW5nUmVhZChUZXN0R3Vlc3QqIGd1ZXN0LCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgaW50IHJldCA9IGd1ZXN0LT5yZWFkKGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKHJldCAhPSBQSVBFX0VSUk9SX0FHQUlOKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCktPnJ1bldpdGhUaW1lb3V0TXMoMik7CisgICAgcmV0dXJuIGd1ZXN0LT5yZWFkKGJ1ZmZlciwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKEFkYkd1ZXN0UGlwZSwgY3JlYXRlU2VydmljZSkgeworICAgIEFuZHJvaWRQaXBlOjpTZXJ2aWNlOjpyZXNldEFsbCgpOworCisgICAgLy8gQ3JlYXRlIGEgaG9zdCBhZ2VudCBhbmQgYSBuZXcgc2VydmljZSBhbmQgcmVnaXN0ZXIgaXQuCisgICAgTW9ja0FkYkhvc3RBZ2VudCBhZGJIb3N0OworfQorCitURVNUKEFkYkd1ZXN0UGlwZSwgY3JlYXRlT25lR3Vlc3QpIHsKKyAgICAvLyBOT1RFOiBUaGlzIGRvZXMgU2VydmljZTo6cmVzZXRBbGwoKSBvbiBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gZm9yIHVzLgorICAgIFRlc3RBbmRyb2lkUGlwZURldmljZSB0ZXN0RGV2aWNlOworCisgICAgTW9ja0FkYkhvc3RBZ2VudCBhZGJIb3N0OworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGd1ZXN0IGNvbm5lY3Rpb24gZnJvbSB0aGUgdGVzdCBkZXZpY2UuCisgICAgYXV0byBndWVzdCA9IFRlc3RHdWVzdDo6Y3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUoZ3Vlc3QpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgicWVtdWQ6YWRiIikpOworICAgIEVYUEVDVF9FUSg2LCBndWVzdC0+d3JpdGUoImFjY2VwdCIsIDYpKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrTWVzc2FnZSA9ICJIZWxsbyBXb3JsZCEiOworICAgIGFkYkhvc3QuY3JlYXRlRmFrZUNvbm5lY3Rpb24oa01lc3NhZ2UpOworCisgICAgY2hhciByZXBseVszXSA9IHt9OworICAgIEVYUEVDVF9FUSgyLCBndWVzdC0+cmVhZChyZXBseSwgMikpOworICAgIEVYUEVDVF9TVFJFUSgib2siLCByZXBseSk7CisgICAgRVhQRUNUX0VRKDUsIGd1ZXN0LT53cml0ZSgic3RhcnQiLCA1KSk7CisKKyAgICBjaGFyIGJ1ZmZlcltrTWVzc2FnZS5zaXplKCkgKyAxXSA9IHt9OworICAgIGNvbnN0IHNzaXplX3QgZXhwZWN0ZWRTaXplID0gc3RhdGljX2Nhc3Q8c3NpemVfdD4oa01lc3NhZ2Uuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRTaXplLCBibG9ja2luZ1JlYWQoZ3Vlc3QsIGJ1ZmZlciwga01lc3NhZ2Uuc2l6ZSgpKSk7CisgICAgRVhQRUNUX1NUUkVRKGtNZXNzYWdlLmNfc3RyKCksIGJ1ZmZlcik7CisKKyAgICBFWFBFQ1RfRVEoMSwgZ3Vlc3QtPndyaXRlKCJ4IiwgMSkpOworfQorCitURVNUKEFkYkd1ZXN0UGlwZSwgY3JlYXRlR3Vlc3RXaXRoQmFkQWNjZXB0Q29tbWFuZCkgeworICAgIFRlc3RBbmRyb2lkUGlwZURldmljZSB0ZXN0RGV2aWNlOworCisgICAgTW9ja0FkYkhvc3RBZ2VudCBhZGJIb3N0OworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGd1ZXN0IGNvbm5lY3Rpb24gZnJvbSB0aGUgdGVzdCBkZXZpY2UuCisgICAgYXV0byBndWVzdCA9IFRlc3RHdWVzdDo6Y3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUoZ3Vlc3QpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgicWVtdWQ6YWRiIikpOworCisgICAgLy8gVGhpcyB3cml0ZSBzaG91bGQgZmFpbCB3aXRoIFBJUEVfRVJST1JfSU8gYmVjYXVzZSB0aGUgb3RoZXIgZW5kCisgICAgLy8gaXMgd2FpdGluZyBmb3IgYW4gJ2FjY2VwdCcuCisgICAgRVhQRUNUX0VRKFBJUEVfRVJST1JfSU8sIGd1ZXN0LT53cml0ZSgiQUNDRVBUIiwgNikpOworfQorCitURVNUKEFkYkd1ZXN0UGlwZSwgY3JlYXRlR3Vlc3RXaXRoQ2xvc2VPbkFjY2VwdCkgeworICAgIFRlc3RBbmRyb2lkUGlwZURldmljZSB0ZXN0RGV2aWNlOworCisgICAgTW9ja0FkYkhvc3RBZ2VudCBhZGJIb3N0OworCisgICAgLy8gQ3JlYXRlIGEgbmV3IGd1ZXN0IGNvbm5lY3Rpb24gZnJvbSB0aGUgdGVzdCBkZXZpY2UuCisgICAgYXV0byBndWVzdCA9IFRlc3RHdWVzdDo6Y3JlYXRlKCk7CisgICAgRVhQRUNUX1RSVUUoZ3Vlc3QpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgicWVtdWQ6YWRiIikpOworCisgICAgLy8gRm9yY2UtY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgZ3Vlc3QtPmNsb3NlKCk7Cit9CisKK1RFU1QoQWRiR3Vlc3RQaXBlLCBjcmVhdGVHdWVzdFdpdGhDbG9zZUJlZm9yZUNvbm5lY3Rpb24pIHsKKyAgICBUZXN0QW5kcm9pZFBpcGVEZXZpY2UgdGVzdERldmljZTsKKworICAgIE1vY2tBZGJIb3N0QWdlbnQgYWRiSG9zdDsKKworICAgIC8vIENyZWF0ZSBhIGd1ZXN0LCBhbmQgdmVyaWZ5IHRoYXQgdGhpcyBpbnZva2VzIHN0YXJ0TGlzdGVuaW5nIG9uIHRoZQorICAgIC8vIGd1ZXN0IGFnZW50LgorICAgIHN0ZDo6dW5pcXVlX3B0cjxUZXN0R3Vlc3Q+IGd1ZXN0KFRlc3RHdWVzdDo6Y3JlYXRlKCkpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgicWVtdWQ6YWRiIikpOworICAgIEVYUEVDVF9GQUxTRShhZGJIb3N0LmlzTGlzdGVuaW5nKCkpOworICAgIEVYUEVDVF9FUSg2LCBndWVzdC0+d3JpdGUoImFjY2VwdCIsIDYpKTsKKyAgICBFWFBFQ1RfVFJVRShhZGJIb3N0LmlzTGlzdGVuaW5nKCkpOworCisgICAgZ3Vlc3QtPmNsb3NlKCk7CisgICAgRVhQRUNUX0ZBTFNFKGFkYkhvc3QuaXNMaXN0ZW5pbmcoKSk7Cit9CisKK1RFU1QoQWRiR3Vlc3RQaXBlLCBjcmVhdGVHdWVzdFdpdGhDbG9zZU9uUmVwbHkpIHsKKyAgICBUZXN0QW5kcm9pZFBpcGVEZXZpY2UgdGVzdERldmljZTsKKworICAgIE1vY2tBZGJIb3N0QWdlbnQgYWRiSG9zdDsKKyAgICBBbmRyb2lkUGlwZTo6U2VydmljZTo6YWRkKG5ldyBBZGJHdWVzdFBpcGU6OlNlcnZpY2UoJmFkYkhvc3QpKTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBndWVzdCBjb25uZWN0aW9uIGZyb20gdGhlIHRlc3QgZGV2aWNlLgorICAgIGF1dG8gZ3Vlc3QgPSBUZXN0R3Vlc3Q6OmNyZWF0ZSgpOworICAgIEVYUEVDVF9UUlVFKGd1ZXN0KTsKKyAgICBFWFBFQ1RfRVEoMCwgZ3Vlc3QtPmNvbm5lY3QoInFlbXVkOmFkYiIpKTsKKworICAgIEVYUEVDVF9FUSg2LCBndWVzdC0+d3JpdGUoImFjY2VwdCIsIDYpKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrTWVzc2FnZSA9ICJIZWxsbyBXb3JsZCEiOworICAgIGFkYkhvc3QuY3JlYXRlRmFrZUNvbm5lY3Rpb24oa01lc3NhZ2UpOworCisgICAgLy8gRm9yY2UtY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgZ3Vlc3QtPmNsb3NlKCk7Cit9CisKK1RFU1QoQWRiR3Vlc3RQaXBlLCBjcmVhdGVHdWVzdFdpdGhCYWRTdGFydENvbW1hbmQpIHsKKyAgICBUZXN0QW5kcm9pZFBpcGVEZXZpY2UgdGVzdERldmljZTsKKworICAgIE1vY2tBZGJIb3N0QWdlbnQgYWRiSG9zdDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBndWVzdCBjb25uZWN0aW9uIGZyb20gdGhlIHRlc3QgZGV2aWNlLgorICAgIGF1dG8gZ3Vlc3QgPSBUZXN0R3Vlc3Q6OmNyZWF0ZSgpOworICAgIEVYUEVDVF9UUlVFKGd1ZXN0KTsKKyAgICBFWFBFQ1RfRVEoMCwgZ3Vlc3QtPmNvbm5lY3QoInFlbXVkOmFkYiIpKTsKKworICAgIEVYUEVDVF9FUSg2LCBndWVzdC0+d3JpdGUoImFjY2VwdCIsIDYpKTsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrTWVzc2FnZSA9ICJIZWxsbyBXb3JsZCEiOworICAgIGFkYkhvc3QuY3JlYXRlRmFrZUNvbm5lY3Rpb24oa01lc3NhZ2UpOworCisgICAgY2hhciByZXBseVszXSA9IHt9OworICAgIEVYUEVDVF9FUSgyLCBndWVzdC0+cmVhZChyZXBseSwgMikpOworICAgIEVYUEVDVF9TVFJFUSgib2siLCByZXBseSk7CisKKyAgICAvLyBUaGlzIHdyaXRlIHNob3VsZCBmYWlsIHdpdGggUElQRV9FUlJPUl9JTyBiZWNhdXNlIHRoZSBvdGhlciBlbmQKKyAgICAvLyBpcyB3YWl0aW5nIGZvciBhICdzdGFydCcuIE5PVEU6IFRoaXMgd2lsbCByZXN1bHQgaW4gYSBicm9rZW4gcGlwZQorICAgIC8vIGVycm9yIGZvciB0aGUgY29ubmVjdG9yIHRocmVhZCB3YWl0aW5nIGZvciBhIHJlcGx5LgorICAgIEVYUEVDVF9FUShQSVBFX0VSUk9SX0lPLCBndWVzdC0+d3JpdGUoIlNUQVJUIiwgNSkpOworfQorCitURVNUKEFkYkd1ZXN0UGlwZSwgY3JlYXRlR3Vlc3RXaXRoQ2xvc2VPblN0YXJ0KSB7CisgICAgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHRlc3REZXZpY2U7CisKKyAgICBNb2NrQWRiSG9zdEFnZW50IGFkYkhvc3Q7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZ3Vlc3QgY29ubmVjdGlvbiBmcm9tIHRoZSB0ZXN0IGRldmljZS4KKyAgICBhdXRvIGd1ZXN0ID0gVGVzdEd1ZXN0OjpjcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRShndWVzdCk7CisgICAgRVhQRUNUX0VRKDAsIGd1ZXN0LT5jb25uZWN0KCJxZW11ZDphZGIiKSk7CisKKyAgICBFWFBFQ1RfRVEoNiwgZ3Vlc3QtPndyaXRlKCJhY2NlcHQiLCA2KSk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga01lc3NhZ2UgPSAiSGVsbG8gV29ybGQhIjsKKyAgICBhZGJIb3N0LmNyZWF0ZUZha2VDb25uZWN0aW9uKGtNZXNzYWdlKTsKKworICAgIGNoYXIgcmVwbHlbM10gPSB7fTsKKyAgICBFWFBFQ1RfRVEoMiwgZ3Vlc3QtPnJlYWQocmVwbHksIDIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm9rIiwgcmVwbHkpOworCisgICAgLy8gRm9yY2UtY2xvc2UgdGhlIGNvbm5lY3Rpb24uCisgICAgZ3Vlc3QtPmNsb3NlKCk7Cit9CisKK1RFU1QoQWRiR3Vlc3RQaXBlLCBjcmVhdGVHdWVzdFdoaWNoQ2xvc2VzVGhlQ29ubmVjdGlvbikgeworICAgIC8vIE5PVEU6IFRoaXMgZG9lcyBTZXJ2aWNlOjpyZXNldEFsbCgpIG9uIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBmb3IgdXMuCisgICAgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHRlc3REZXZpY2U7CisKKyAgICBNb2NrQWRiSG9zdEFnZW50IGFkYkhvc3Q7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZ3Vlc3QgY29ubmVjdGlvbiBmcm9tIHRoZSB0ZXN0IGRldmljZS4KKyAgICBhdXRvIGd1ZXN0ID0gVGVzdEd1ZXN0OjpjcmVhdGUoKTsKKyAgICBFWFBFQ1RfVFJVRShndWVzdCk7CisgICAgRVhQRUNUX0VRKDAsIGd1ZXN0LT5jb25uZWN0KCJxZW11ZDphZGIiKSk7CisgICAgRVhQRUNUX0VRKDYsIGd1ZXN0LT53cml0ZSgiYWNjZXB0IiwgNikpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtNZXNzYWdlID0gIkhlbGxvIFdvcmxkISI7CisgICAgYWRiSG9zdC5jcmVhdGVGYWtlQ29ubmVjdGlvbihrTWVzc2FnZSk7CisKKyAgICBjaGFyIHJlcGx5WzNdID0ge307CisgICAgRVhQRUNUX0VRKDIsIGd1ZXN0LT5yZWFkKHJlcGx5LCAyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJvayIsIHJlcGx5KTsKKyAgICBFWFBFQ1RfRVEoNSwgZ3Vlc3QtPndyaXRlKCJzdGFydCIsIDUpKTsKKworICAgIC8vIFJlYWQgb25seSBwYXJ0aWFsIGJ5dGVzIGZyb20gdGhlIGNvbm5lY3Rpb24uCisgICAgY2hhciBidWZmZXJba01lc3NhZ2Uuc2l6ZSgpICsgMV0gPSB7fTsKKyAgICBjb25zdCBzc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IHN0YXRpY19jYXN0PHNzaXplX3Q+KGtNZXNzYWdlLnNpemUoKSkgLyAyOworICAgIEVYUEVDVF9FUShleHBlY3RlZFNpemUsIGJsb2NraW5nUmVhZChndWVzdCwgYnVmZmVyLCBleHBlY3RlZFNpemUpKTsKKworICAgIC8vIEZvcmNlLWNsb3NlIHRoZSBjb25uZWN0aW9uIG5vdy4KKyAgICBndWVzdC0+Y2xvc2UoKTsKK30KKworVEVTVChBZGJHdWVzdFBpcGUsIGNyZWF0ZU11bHRpcGxlR3Vlc3RDb25uZWN0aW9ucykgeworICAgIFRlc3RBbmRyb2lkUGlwZURldmljZSB0ZXN0RGV2aWNlOworCisgICAgTW9ja0FkYkhvc3RBZ2VudCBhZGJIb3N0OworCisgICAgY29uc3QgaW50IGtDb3VudCA9IDg7CisKKyAgICAvLyBDcmVhdGUga0NvdW50IGd1ZXN0cyB0aGF0IGFsbCBjb25uZWN0IGF0IHRoZSBzYW1lIHRpbWUuCisgICAgc3RkOjp1bmlxdWVfcHRyPFRlc3RHdWVzdD4gZ3Vlc3RzW2tDb3VudF07CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBndWVzdHNbbl0ucmVzZXQoVGVzdEd1ZXN0OjpjcmVhdGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGd1ZXN0c1tuXS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBndWVzdHNbbl0tPmNvbm5lY3QoInFlbXVkOmFkYiIpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGFkYkhvc3QuaXNMaXN0ZW5pbmcoKSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGtDb3VudCB0aHJlYWRzIHRoYXQgd2lsbCBzZW5kIGRhdGEgdG8gZWFjaCBndWVzdCBpbiBzdWNjZXNzaW9uLgorICAgIGZvciAoaW50IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgYXV0byBndWVzdCA9IGd1ZXN0c1tuXS5nZXQoKTsKKyAgICAgICAgRVhQRUNUX0VRKDYsIGd1ZXN0LT53cml0ZSgiYWNjZXB0IiwgNikpOworICAgICAgICBFWFBFQ1RfVFJVRShhZGJIb3N0LmlzTGlzdGVuaW5nKCkpOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmdGb3JtYXQoIkhlbGxvICVkIiwgbiArIDEpOworICAgICAgICBhZGJIb3N0LmNyZWF0ZUZha2VDb25uZWN0aW9uKG1lc3NhZ2UpOworCisgICAgICAgIGNoYXIgcmVwbHlbM10gPSB7fTsKKyAgICAgICAgRVhQRUNUX0VRKDIsIGd1ZXN0LT5yZWFkKHJlcGx5LCAyKSkgPDwgbiArIDE7CisgICAgICAgIEVYUEVDVF9TVFJFUSgib2siLCByZXBseSkgPDwgbiArIDE7CisgICAgICAgIEVYUEVDVF9FUSg1LCBndWVzdC0+d3JpdGUoInN0YXJ0IiwgNSkpIDw8IG4gKyAxOworICAgICAgICBFWFBFQ1RfRkFMU0UoYWRiSG9zdC5pc0xpc3RlbmluZygpKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBidWZmZXI7CisgICAgICAgIGJ1ZmZlci5yZXNpemUobWVzc2FnZS5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c3NpemVfdD4obWVzc2FnZS5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgYmxvY2tpbmdSZWFkKGd1ZXN0LCAmYnVmZmVyWzBdLCBtZXNzYWdlLnNpemUoKSkpCisgICAgICAgICAgICAgICAgPDwgbiArIDE7CisKKyAgICAgICAgRVhQRUNUX0VRKG1lc3NhZ2UsIGJ1ZmZlcik7CisgICAgICAgIEVYUEVDVF9FUSgxLCBndWVzdC0+d3JpdGUoIngiLCAxKSkgPDwgbiArIDE7CisgICAgICAgIGd1ZXN0LT5jbG9zZSgpOworICAgIH0KKworICAgIEVYUEVDVF9GQUxTRShhZGJIb3N0LmlzTGlzdGVuaW5nKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNjBkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkhvc3RMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiVHlwZXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCitzdGF0aWMgYm9vbCBzeXN0ZW1TdXBwb3J0c0lQdjQoKSB7CisgICAgaW50IHNvY2tldCA9IGJhc2U6OnNvY2tldENyZWF0ZVRjcDQoKTsKKyAgICBpZiAoc29ja2V0IDwgMCAmJiBlcnJubyA9PSBFQUZOT1NVUFBPUlQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBiYXNlOjpzb2NrZXRDbG9zZShzb2NrZXQpOworICAgIHJldHVybiB0cnVlOworfQorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpBc3luY1NvY2tldFNlcnZlcjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZFNvY2tldDsKKworYm9vbCBBZGJIb3N0TGlzdGVuZXI6OnJlc2V0KGludCBhZGJQb3J0KSB7CisgICAgaWYgKGFkYlBvcnQgPCAwKSB7CisgICAgICAgIG1TZXJ2ZXIucmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKCFtU2VydmVyIHx8IGFkYlBvcnQgIT0gbVNlcnZlci0+cG9ydCgpKSB7CisgICAgICAgIENIRUNLKGFkYlBvcnQgPCA2NTUzNik7CisgICAgICAgIEFzeW5jU29ja2V0U2VydmVyOjpMb29wYmFja01vZGUgbW9kZSA9CisgICAgICAgICAgICBBc3luY1NvY2tldFNlcnZlcjo6a0lQdjRBbmRPcHRpb25hbElQdjY7CisgICAgICAgIGlmICghc3lzdGVtU3VwcG9ydHNJUHY0KCkpIHsKKyAgICAgICAgICAgIG1vZGUgPSBBc3luY1NvY2tldFNlcnZlcjo6a0lQdjY7CisgICAgICAgIH0KKyAgICAgICAgbVNlcnZlciA9IEFzeW5jU29ja2V0U2VydmVyOjpjcmVhdGVUY3BMb29wYmFja1NlcnZlcigKKyAgICAgICAgICAgICAgICBhZGJQb3J0LAorICAgICAgICAgICAgICAgIFt0aGlzXShpbnQgcG9ydCkgeyByZXR1cm4gdGhpcy0+b25Ib3N0U2VydmVyQ29ubmVjdGlvbihwb3J0KTsgfSwKKyAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCkpOworICAgICAgICBpZiAoIW1TZXJ2ZXIpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBlbXVsYXRvciBpcyBwcm9iaW5nIGZvciBhIGZyZWUgcG9ydAorICAgICAgICAgICAgLy8gYXQgc3RhcnR1cCwgc28gZG9uJ3QgcHJpbnQgYSB3YXJuaW5nIGhlcmUuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gRG9uJ3Qgc3RhcnQgbGlzdGVuaW5nIHVudGlsIHN0YXJ0TGlzdGVuaW5nKCkgaXMgY2FsbGVkLgorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBZGJIb3N0TGlzdGVuZXI6OnN0YXJ0TGlzdGVuaW5nKCkgeworICAgIGlmIChtU2VydmVyKSB7CisgICAgICAgIG1TZXJ2ZXItPnN0YXJ0TGlzdGVuaW5nKCk7CisgICAgfQorfQorCit2b2lkIEFkYkhvc3RMaXN0ZW5lcjo6c3RvcExpc3RlbmluZygpIHsKKyAgICBpZiAobVNlcnZlcikgeworICAgICAgICBtU2VydmVyLT5zdG9wTGlzdGVuaW5nKCk7CisgICAgfQorfQorCit2b2lkIEFkYkhvc3RMaXN0ZW5lcjo6bm90aWZ5U2VydmVyKCkgeworICAgIGlmIChtU2VydmVyICYmIG1BZGJDbGllbnRQb3J0ID4gMCkgeworICAgICAgICBBZGJIb3N0U2VydmVyOjpub3RpZnkobVNlcnZlci0+cG9ydCgpLCBtQWRiQ2xpZW50UG9ydCk7CisgICAgfQorfQorCitib29sIEFkYkhvc3RMaXN0ZW5lcjo6b25Ib3N0U2VydmVyQ29ubmVjdGlvbihpbnQgc29ja2V0KSB7CisgICAgbUd1ZXN0QWdlbnQtPm9uSG9zdENvbm5lY3Rpb24oU2NvcGVkU29ja2V0KHNvY2tldCkpOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1NmJkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdExpc3RlbmVyLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Bc3luY1NvY2tldFNlcnZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FkYlR5cGVzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworLy8gQWRiSG9zdExpc3RlbmVyIGltcGxlbWVudHMgdGhlIEFkYkhvc3RBZ2VudCBpbnRlcmZhY2Ugd2l0aCBhIGNvbmNyZXRlCisvLyBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgbG9jYWxob3N0IFRDUCBwb3J0cy4gSXRzIGZ1bGwgcHVycG9zZSBpcworLy8gdGhlIGZvbGxvd2luZzoKKy8vCisvLyAtIEJpbmQgdG8gYSBsb2NhbGhvc3QgKElQdjQgYW5kIElQdjYpIFRDUCBwb3J0IHdhaXRpbmcgZm9yIGNvbm5lY3Rpb25zCisvLyAgIGZyb20gdGhlIEFEQiBTZXJ2ZXIgcnVubmluZyBvbiB0aGUgaG9zdC4KKy8vCisvLyAtIFJlY29yZCBndWVzdCBwaXBlIGNvbm5lY3Rpb25zIGZyb20gdGhlICdhZGJkJyBkYWVtb24gcnVubmluZyBpbiB0aGUKKy8vICAgZW11bGF0ZWQgc3lzdGVtLCB0aHJvdWdoIHRoZSBhZGRHdWVzdCgpIG1ldGhvZC4KKy8vCisvLyAtIFdoZW4gYSBuZXcgZ3Vlc3QgY29ubmVjdGlvbiBoYXBwZW5zLCBzdGFydCBsaXN0ZW5pbmcgZm9yIFRDUCBjb25uZWN0aW9ucy4KKy8vICAgV2hlbiBvbmUgc3VjaCBjb25uZWN0aW9uIGhhcHBlbnMsIHNlbmQgaXRzIHNvY2tldCB0byB0aGUgZ3Vlc3QgY29ubmVjdGlvbgorLy8gICB3aGljaCB3aWxsIGhhbmRsZSBuZXR3b3JrIHRyYWZmaWMgb24gaXQsIHVudGlsIGRlbGV0ZUd1ZXN0KCkgaXMgY2FsbGVkLgorLy8KKy8vIC0gTm90aWZ5IHRoZSBBREIgU2VydmVyIG9mIG5ldyBndWVzdCBjb25uZWN0aW9ucyAoaS5lLiBlbXVsYXRvciBpbnN0YW5jZXMKKy8vICAgdGhhdCBhcHBlYXIgdW5kZXIgJ2FkYiBkZXZpY2VzJyksIHRocm91Z2ggdGhlIG5vdGlmeUFkYlNlcnZlcigpCisvLyAgIG1ldGhvZCwgd2hpY2ggY2FuIGJlIGNhbGxlZCBlaXRoZXIgZXhwbGljdGx5LCBvciBhdXRvbWF0aWNhbGx5IGV2ZXJ5CisvLyAgIHRpbWUgYSBndWVzdCBjb25uZWN0aW9uIGlzIGFjdGl2YXRlZCBieSBhIFRDUCBjb25uZWN0aW9uLgorLy8KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gIC0gQ3JlYXRlIG5ldyBBZGJIb3N0TGlzdGVuZXIgaW5zdGFuY2UsIHBhc3NpbmcgYSB2YWxpZCB8YWRiQ2xpZW50UG9ydHwKKy8vICAgIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IgKGUuZy4ga0RlZmF1bHRBZGJDbGllbnRQb3J0KSB0byBlbnN1cmUKKy8vICAgIHRoYXQgaXQgd2lsbCBub3RpZnkgdGhlIGhvc3QgQURCIHNlcnZlciBvZiBuZXcgZ3Vlc3QgY29ubmVjdGlvbnMKKy8vICAgIHByb3Blcmx5ICh0aGUgZGVmYXVsdCB2YWx1ZSBvZiAwIGlzIHVzZWZ1bCBmb3IgdW5pdC10ZXN0aW5nKS4KKy8vCisvLyAgLSBDYWxsIHRoZSBpbml0KCkgbWV0aG9kIHRvIHNldHVwIGxpc3RlbmluZyBvbiBsb2NhbGhvc3QgcG9ydCB8YWRiUG9ydHwsCisvLyAgICB0aGlzIGNhbiBiZSB1bi1kb25lIHdpdGggYSBjYWxsIHRvIGRlaW5pdCgpLgorLy8KKy8vICAtIEF0IHJ1bnRpbWUsIGNhbGwgYWRkR3Vlc3QoKSBhbmQgZGVsZXRlR3Vlc3QoKSB0byBtYW5hZ2UgZ3Vlc3QKKy8vICAgIGNvbm5lY3Rpb25zLgorLy8KKy8vIE5PVEU6IEV2ZXJ5dGhpbmcgc2hvdWxkIGhhcHBlbiBpbiB0aGUgbWFpbiBsb29wIHRocmVhZC4KKy8vCitjbGFzcyBBZGJIb3N0TGlzdGVuZXIgOiBwdWJsaWMgQWRiSG9zdEFnZW50IHsKK3B1YmxpYzoKKyAgICAvLyBDb25zdHJ1Y3RvciB0YWtlcyBhbiBvcHRpb24gfGFkYkNsaWVudFBvcnR8IHBhcmFtZXRlciBzcGVjaWZ5aW5nCisgICAgLy8gdGhlIGNsaWVudCBwb3J0IHRoYXQgdGhlIEFEQiBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uIGZvciBub3RpZmljYXRpb25zCisgICAgLy8gb3IgbmV3IGVtdWxhdG9yIGluc3RhbmNlcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsbCBub3RpZnlBZGJTZXJ2ZXIoKQorICAgIC8vIHdoZW4gYSBndWVzdCA8LT4gaG9zdCBjb25uZWN0aW9uIG9jY3Vycy4gQSB2YWx1ZSBvZiAwIG1lYW5zIHRvIG5ldmVyCisgICAgLy8gbm90aWZ5IHRoZSBzZXJ2ZXIuIFNlZSBrRGVmYXVsdEFkYkNsaWVudFBvcnQgdG9vLgorICAgIGV4cGxpY2l0IEFkYkhvc3RMaXN0ZW5lcihpbnQgYWRiQ2xpZW50UG9ydCA9IDApCisgICAgICAgICAgICA6IG1BZGJDbGllbnRQb3J0KGFkYkNsaWVudFBvcnQpIHt9CisKKyAgICAvLyBSZXR1cm4gdGhlIEFEQiBjbGllbnQgcG9ydCB1c2VkIGJ5IHRoaXMgbGlzdGVuZXIuCisgICAgaW50IGNsaWVudFBvcnQoKSBjb25zdCB7IHJldHVybiBtQWRiQ2xpZW50UG9ydDsgfQorCisgICAgLy8gU2V0IHRoZSBBZGJHdWVzdEFnZW50IHRvIHVzZSBhdCBydW50aW1lLiBJdHMgb25Ib3N0Q29ubmVjdGlvbigpCisgICAgLy8gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIEFEQiBzZXJ2ZXIgY29ubmVjdHMgYWZ0ZXIgYSBjYWxsCisgICAgLy8gdG8gc3RhcnRMaXN0ZW5pbmcoKS4KKyAgICB2b2lkIHNldEd1ZXN0QWdlbnQoQWRiR3Vlc3RBZ2VudCogZ3Vlc3RBZ2VudCkgeyBtR3Vlc3RBZ2VudCA9IGd1ZXN0QWdlbnQ7IH0KKworICAgIC8vIENhbGwgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBiaW5kIHRvIFRDUCBsb2NhbGhvc3QKKyAgICAvLyBwb3J0IHxhZGJFbXVsYXRvclBvcnR8IChib3RoIElQdjQgYW5kIElQdjYpLiBBIHZhbHVlIG9mIDAgd2lsbCBiaW5kCisgICAgLy8gdG8gYW55IHJhbmRvbSBhdmFpbGFibGUgcG9ydC4gQSB2YWx1ZSBvZiAtMSB1bmJpbmRzIHRoZSBjdXJyZW50IHBvcnQsCisgICAgLy8gaWYgYW55LiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZS9lcnJubyBvbiBlcnJvci4KKyAgICBib29sIHJlc2V0KGludCBhZGJFbXVsYXRvclBvcnQpOworCisgICAgLy8gQWRiSG9zdEFnZW50IG1ldGhvZCBvdmVycmlkZXMuCisgICAgdmlydHVhbCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U2VydmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm4gcG9ydCB0aGlzIGhvc3Qgc2VydmVyIGlzIGN1cnJlbnRseSBib3VuZCB0bywgb3IgLTEgaWYgaXQgaXMgbm90LgorICAgIGludCBwb3J0KCkgY29uc3QgeyByZXR1cm4gbVNlcnZlci5nZXQoKSA/IG1TZXJ2ZXItPnBvcnQoKSA6IC0xOyB9CisKK3ByaXZhdGU6CisgICAgLy8gQ2FsbGVkIGZyb20gdGhlIEFzeW5jU29ja2V0U2VydmVyIHdoZW4gYSBuZXcgY29ubmVjdGlvbiBmcm9tIHRoZQorICAgIC8vIEFEQiBob3N0IHNlcnZlciBoYXBwZW5zLiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBvbkhvc3RTZXJ2ZXJDb25uZWN0aW9uKGludCBwb3J0KTsKKworICAgIEFkYkd1ZXN0QWdlbnQqIG1HdWVzdEFnZW50ID0gbnVsbHB0cjsKKyAgICBpbnQgbUFkYkNsaWVudFBvcnQgPSAtMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YmFzZTo6QXN5bmNTb2NrZXRTZXJ2ZXI+IG1TZXJ2ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0TGlzdGVuZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDc2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkhvc3RMaXN0ZW5lcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdExpc3RlbmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdElucHV0QnVmZmVyU29ja2V0U2VydmVyVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisvLyBCZWNhdXNlIGd0ZXN0IGluY2x1ZGVzIFdpbmRvd3MgaGVhZGVycyB0aGF0IGRlY2xhcmUgdGhlIEVSUk9SCisvLyBtYWNybyB0aGF0IHByZXZlbnRzIExPRyhFUlJPUikgZnJvbSBjb21waWxpbmchIQorI2lmZGVmIF9XSU4zMgorI3VuZGVmIEVSUk9SCisjZW5kaWYKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxlcnJuby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb2NrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGhyZWFkTG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGVzdElucHV0QnVmZmVyU29ja2V0U2VydmVyVGhyZWFkOworCituYW1lc3BhY2UgeworCisvLyBBIHRocmVhZCB0aGF0IHdpbGwgY29ubmVjdCB0byBhIGdpdmVuIFRDUDQgbG9vcGJhY2sgcG9ydCwgc2VuZCBhIDMyLWJpdCBJRAorLy8gaW50ZWdlciB0aHJvdWdoIGl0LCB0aGVuIGV4aXQuIFVzYWdlIGlzOgorLy8KKy8vICAgMSkgQ3JlYXRlIGludHNhbmNlLCBwYXNzaW5nIGEgfHBvcnR8IGFuZCB8aWR8IHZhbHVlLgorLy8gICAyKSBTdGFydCB0aGUgdGhyZWFkLgorLy8gICAzKSBKb2luL3dhaXQgZm9yIHRoZSB0aHJlYWQuCisvLworLy8gSXQncyBwb3NzaWJsZSB0byBxdWVyeSB0aGUgdGhyZWFkJ3Mgc3RhdGUgYW55IHRpbWUsIGFuZCBmcm9tIGFueSB0aHJlYWQsCisvLyBieSBjYWxsaW5nIHRoZSBzdGF0ZSgpIG1ldGhvZC4KK2NsYXNzIFRlc3RDb25uZWN0VGhyZWFkIDogcHVibGljIGFuZHJvaWQ6OmJhc2U6OlRocmVhZCB7CitwdWJsaWM6CisgICAgZW51bSBTdGF0ZSB7CisgICAgICAgIGtJbml0ID0gMCwKKyAgICAgICAga0Nvbm5lY3RlZCwKKyAgICAgICAga0Rpc2Nvbm5lY3RlZCwKKyAgICB9OworCisgICAgZXhwbGljaXQgVGVzdENvbm5lY3RUaHJlYWQoaW50IHBvcnQsIGludCBpZCkgOiBtUG9ydChwb3J0KSwgbUlkKGlkKSB7fQorCisgICAgU3RhdGUgc3RhdGUoKSBjb25zdCB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICByZXR1cm4gbVN0YXRlOworICAgIH0KKworICAgIHZpcnR1YWwgaW50cHRyX3QgbWFpbigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQ29ubmVjdAorICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSBTdHJpbmdGb3JtYXQoIlt0aHJlYWQgJWRdICIsIG1JZCk7CisgICAgICAgIFNjb3BlZFNvY2tldCBmZChhbmRyb2lkOjpiYXNlOjpzb2NrZXRUY3A0TG9vcGJhY2tDbGllbnQobVBvcnQpKTsKKyAgICAgICAgaWYgKCFmZC52YWxpZCgpKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBwcmVmaXggPDwgIkNvbm5lY3Rpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzZXRTdGF0ZShrQ29ubmVjdGVkKTsKKyAgICAgICAgdWludDMyX3QgaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUlkKTsKKyAgICAgICAgc3NpemVfdCBsZW4gPSBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZW5kKGZkLmdldCgpLCAmaWQsIHNpemVvZihpZCkpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCBwcmVmaXggPDwgIkVuZCBvZiBzdHJlYW0iOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBwcmVmaXg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzaXplb2YoaWQpKSkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8IHByZWZpeCA8PCAiSW52YWxpZCBzZW50IGJ5dGUgY291bnQ9IiA8PCBsZW47CisgICAgICAgIH0KKyAgICAgICAgc2V0U3RhdGUoa0Rpc2Nvbm5lY3RlZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHNldFN0YXRlKFN0YXRlIG5ld1N0YXRlKSB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICBtU3RhdGUgPSBuZXdTdGF0ZTsKKyAgICB9CisKKyAgICBpbnQgbVBvcnQgPSAtMTsKKyAgICBpbnQgbUlkID0gLTE7CisgICAgbXV0YWJsZSBMb2NrIG1Mb2NrOworICAgIFN0YXRlIG1TdGF0ZSA9IGtJbml0OworfTsKKworc3RydWN0IFRlc3RBZGJHdWVzdEFnZW50IDogcHVibGljIEFkYkd1ZXN0QWdlbnQgeworICAgIFRlc3RBZGJHdWVzdEFnZW50KGludCBpZCkKKyAgICAgICAgOiBtSWQoaWQpLCBtUHJlZml4KFN0cmluZ0Zvcm1hdCgiW2d1ZXN0ICVkXSAiLCBpZCkpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Ib3N0Q29ubmVjdGlvbihTY29wZWRTb2NrZXQmJiBzb2NrZXQpIG92ZXJyaWRlIHsKKyAgICAgICAgbVNvY2tldCA9IHNvY2tldDsKKworICAgICAgICB1aW50MzJfdCBpZCA9IDA7CisgICAgICAgIHNzaXplX3QgbGVuID0gYW5kcm9pZDo6YmFzZTo6c29ja2V0UmVjdihtU29ja2V0LmdldCgpLCAmaWQsIHNpemVvZihpZCkpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IG1QcmVmaXggPDwgIkVuZCBvZiBzdHJlYW0iOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8IG1QcmVmaXggPDwgIkkvTyBFcnJvciI7CisgICAgICAgIH0gZWxzZSBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNpemVvZihpZCkpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8IG1QcmVmaXggPDwgIkludmFsaWQgcmVhZCBieXRlIGNvdW50PSIgPDwgbGVuOworICAgICAgICB9CisgICAgICAgIG1JZCA9IHN0YXRpY19jYXN0PGludD4oaWQpOworICAgIH0KKworICAgIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgdm9pZCBjbG9zZSgpIHsgbVNvY2tldC5jbG9zZSgpOyB9CisKKyAgICBpbnQgc29ja2V0KCkgY29uc3QgeyByZXR1cm4gbVNvY2tldC5nZXQoKTsgfQorCitwcml2YXRlOgorICAgIGludCBtSWQgPSAtMTsKKyAgICBTY29wZWRTb2NrZXQgbVNvY2tldDsKKyAgICBzdGQ6OnN0cmluZyBtUHJlZml4OworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoQWRiSG9zdExpc3RlbmVyLCByZXNldCkgeworICAgIEFkYkhvc3RMaXN0ZW5lciB0ZXN0TGlzdGVuZXI7CisgICAgRVhQRUNUX0VRKC0xLCB0ZXN0TGlzdGVuZXIucG9ydCgpKTsKKworICAgIGNvbnN0IGludCBhZGJQb3J0ID0gMDsgIC8vIEJpbmQgdG8gcmFuZG9tIHBvcnQuCisgICAgRVhQRUNUX1RSVUUodGVzdExpc3RlbmVyLnJlc2V0KGFkYlBvcnQpKTsKKyAgICBFWFBFQ1RfTkUoYWRiUG9ydCwgdGVzdExpc3RlbmVyLnBvcnQoKSk7CisKKyAgICAvLyBTZWNvbmQgcmVzZXQgd2l0aCB0aGUgc2FtZSBwb3J0IG51bWJlciBzaG91bGQgbm90IGZhaWwuCisgICAgRVhQRUNUX1RSVUUodGVzdExpc3RlbmVyLnJlc2V0KGFkYlBvcnQpKTsKKyAgICBFWFBFQ1RfTkUoYWRiUG9ydCwgdGVzdExpc3RlbmVyLnBvcnQoKSk7CisKKyAgICB0ZXN0TGlzdGVuZXIucmVzZXQoLTEpOworICAgIEVYUEVDVF9FUSgtMSwgdGVzdExpc3RlbmVyLnBvcnQoKSk7Cit9CisKK1RFU1QoQWRiSG9zdExpc3RlbmVyLCBzdGFydExpc3RlbmluZykgeworICAgIFRlc3RBZGJHdWVzdEFnZW50IHRlc3RBZ2VudCgxKTsKKyAgICBBZGJIb3N0TGlzdGVuZXIgdGVzdExpc3RlbmVyOworCisgICAgdGVzdExpc3RlbmVyLnNldEd1ZXN0QWdlbnQoJnRlc3RBZ2VudCk7CisgICAgRVhQRUNUX1RSVUUodGVzdExpc3RlbmVyLnJlc2V0KDApKTsKKworICAgIHsKKyAgICAgICAgVGVzdENvbm5lY3RUaHJlYWQgdGVzdFRocmVhZCh0ZXN0TGlzdGVuZXIucG9ydCgpLCAyKTsKKworICAgICAgICAvLyBTdGFydCB0aGUgdGhyZWFkLCBpdCB3aWxsIGJlIHVuYWJsZSB0byBzZW5kIGRhdGEgdW50aWwKKyAgICAgICAgLy8gc3RhcnRMaXN0ZW5pbmcoKQorICAgICAgICAvLyBpcyBjYWxsZWQuIEV2ZW4gaWYgd2UgcnVuIHRoZSBjdXJyZW50IHRocmVhZCBsb29wZXIgZm9yIDEwIG1zLgorICAgICAgICB0ZXN0VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIFRocmVhZExvb3Blcjo6Z2V0KCktPnJ1bldpdGhUaW1lb3V0TXMoMTApOworICAgICAgICBFWFBFQ1RfRVEoLTEsIHRlc3RBZ2VudC5zb2NrZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxLCB0ZXN0QWdlbnQuaWQoKSk7CisKKyAgICAgICAgLy8gU3RhcnQgbGlzdGVuaW5nIGFuZCBydW4gdGhlIHRocmVhZCBsb29wZXIgYWdhaW4sIHRoaXMgdGltZSB0aGUKKyAgICAgICAgLy8gc2VuZCBzaG91bGQgd29yay4KKyAgICAgICAgdGVzdExpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nKCk7CisgICAgICAgIFRocmVhZExvb3Blcjo6Z2V0KCktPnJ1bldpdGhUaW1lb3V0TXMoMTApOworICAgICAgICBFWFBFQ1RfRVEoMiwgdGVzdEFnZW50LmlkKCkpOworICAgICAgICBFWFBFQ1RfRVEoVGVzdENvbm5lY3RUaHJlYWQ6OmtEaXNjb25uZWN0ZWQsIHRlc3RUaHJlYWQuc3RhdGUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBUZXN0Q29ubmVjdFRocmVhZCB0ZXN0VGhyZWFkKHRlc3RMaXN0ZW5lci5wb3J0KCksIDMpOworCisgICAgICAgIC8vIFN0YXJ0IGEgc2Vjb25kIHRocmVhZCwgaXQgd2lsbCBiZSB1bmFibGUgdG8gc2VuZCBkYXRhIHVudGlsCisgICAgICAgIC8vIHN0YXJ0TGlzdGVuaW5nKCkgaXMgY2FsbGVkIGFnYWluLiBFdmVuIGlmIHdlIHJ1biB0aGUgY3VycmVudAorICAgICAgICAvLyB0aHJlYWQgbG9vcGVyIGZvciAxMCBtcy4KKyAgICAgICAgdGVzdFRocmVhZC5zdGFydCgpOworICAgICAgICBUaHJlYWRMb29wZXI6OmdldCgpLT5ydW5XaXRoVGltZW91dE1zKDEwKTsKKyAgICAgICAgRVhQRUNUX0VRKDIsIHRlc3RBZ2VudC5pZCgpKTsKKworICAgICAgICAvLyBTdGFydCBsaXN0ZW5pbmcgYW5kIHJ1biB0aGUgdGhyZWFkIGxvb3BlciBhZ2FpbiwgdGhpcyB0aW1lIHRoZQorICAgICAgICAvLyBzZW5kIHNob3VsZCB3b3JrLgorICAgICAgICB0ZXN0TGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmcoKTsKKyAgICAgICAgVGhyZWFkTG9vcGVyOjpnZXQoKS0+cnVuV2l0aFRpbWVvdXRNcygxMCk7CisgICAgICAgIEVYUEVDVF9FUSgzLCB0ZXN0QWdlbnQuaWQoKSk7CisgICAgICAgIEVYUEVDVF9FUShUZXN0Q29ubmVjdFRocmVhZDo6a0Rpc2Nvbm5lY3RlZCwgdGVzdFRocmVhZC5zdGF0ZSgpKTsKKyAgICB9Cit9CisKK1RFU1QoQWRiSG9zdExpc3RlbmVyLCBzdG9wTGlzdGVuaW5nKSB7CisgICAgVGVzdEFkYkd1ZXN0QWdlbnQgdGVzdEFnZW50KDEpOworICAgIEFkYkhvc3RMaXN0ZW5lciB0ZXN0TGlzdGVuZXI7CisKKyAgICB0ZXN0TGlzdGVuZXIuc2V0R3Vlc3RBZ2VudCgmdGVzdEFnZW50KTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0TGlzdGVuZXIucmVzZXQoMCkpOworCisgICAgVGVzdENvbm5lY3RUaHJlYWQgdGVzdFRocmVhZCh0ZXN0TGlzdGVuZXIucG9ydCgpLCAyKTsKKworICAgIC8vIFN0YXJ0IHRoZSB0aHJlYWQsIGl0IHdpbGwgYmUgdW5hYmxlIHRvIHNlbmQgZGF0YSB1bnRpbCBzdGFydExpc3RlbmluZygpCisgICAgLy8gaXMgY2FsbGVkLiBFdmVuIGlmIHdlIHJ1biB0aGUgY3VycmVudCB0aHJlYWQgbG9vcGVyIGZvciAxMCBtcy4KKyAgICB0ZXN0VGhyZWFkLnN0YXJ0KCk7CisgICAgVGhyZWFkTG9vcGVyOjpnZXQoKS0+cnVuV2l0aFRpbWVvdXRNcygxMCk7CisgICAgRVhQRUNUX0VRKC0xLCB0ZXN0QWdlbnQuc29ja2V0KCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0QWdlbnQuaWQoKSk7CisKKyAgICAvLyBTdGFydCB0aGUgc3RvcCBsaXN0ZW5pbmcsIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0aHJlYWQgdG8gc2VuZCBkYXRhCisgICAgLy8gZXZlbiBpZiB0aGUgbG9vcGVyIHJ1bnMgZm9yIDEwIG1zLgorICAgIHRlc3RMaXN0ZW5lci5zdGFydExpc3RlbmluZygpOworICAgIHRlc3RMaXN0ZW5lci5zdG9wTGlzdGVuaW5nKCk7CisgICAgVGhyZWFkTG9vcGVyOjpnZXQoKS0+cnVuV2l0aFRpbWVvdXRNcygxMCk7CisgICAgRVhQRUNUX0VRKC0xLCB0ZXN0QWdlbnQuc29ja2V0KCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0QWdlbnQuaWQoKSk7Cit9CisKK1RFU1QoQWRiSG9zdExpc3RlbmVyLCBub3RpZnlTZXJ2ZXIpIHsKKyAgICBUZXN0SW5wdXRCdWZmZXJTb2NrZXRTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkOworICAgIGludCBhZGJDbGllbnRQb3J0ID0gc2VydmVyVGhyZWFkLnBvcnQoKTsKKyAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKKworICAgIEFkYkhvc3RMaXN0ZW5lciB0ZXN0TGlzdGVuZXIoYWRiQ2xpZW50UG9ydCk7CisgICAgRVhQRUNUX0VRKGFkYkNsaWVudFBvcnQsIHRlc3RMaXN0ZW5lci5jbGllbnRQb3J0KCkpOworCisgICAgdGVzdExpc3RlbmVyLnJlc2V0KDApOyAgLy8gQmluZCB0byByYW5kb20gcG9ydC4KKyAgICBpbnQgYWRiRW11bGF0b3JQb3J0ID0gdGVzdExpc3RlbmVyLnBvcnQoKTsKKworICAgIHRlc3RMaXN0ZW5lci5ub3RpZnlTZXJ2ZXIoKTsKKworICAgIGludHB0cl90IGJ1ZmZlclNpemUgPSAwOworICAgIEVYUEVDVF9UUlVFKHNlcnZlclRocmVhZC53YWl0KCZidWZmZXJTaXplKSk7CisKKyAgICAvLyBWZXJpZnkgbWVzc2FnZSBjb250ZW50LgorICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmdGb3JtYXQoImhvc3Q6ZW11bGF0b3I6JWQiLCBhZGJFbXVsYXRvclBvcnQpOworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0KKyAgICAgICAgICAgIFN0cmluZ0Zvcm1hdCgiJTA0eCVzIiwgbWVzc2FnZS5zaXplKCksIG1lc3NhZ2UuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNpemUoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNpemUoKSwgc2VydmVyVGhyZWFkLnZpZXcoKS5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZC5jX3N0cigpLCBzZXJ2ZXJUaHJlYWQudmlldygpLmNfc3RyKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYmFzZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdFNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyMmJjOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdFNlcnZlci5jcHAKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OworCitib29sIEFkYkhvc3RTZXJ2ZXI6Om5vdGlmeShpbnQgYWRiRW11bGF0b3JQb3J0LCBpbnQgYWRiQ2xpZW50UG9ydCkgeworICAgIC8vIEZpcnN0IGNvbm5lY3QgdG8gQURCIHNlcnZlci4KKyAgICBTY29wZWRTb2NrZXQgc29ja2V0KGFuZHJvaWQ6OmJhc2U6OnNvY2tldFRjcDZMb29wYmFja0NsaWVudChhZGJDbGllbnRQb3J0KSk7CisgICAgaWYgKCFzb2NrZXQudmFsaWQoKSkgeworICAgICAgICBzb2NrZXQucmVzZXQoYW5kcm9pZDo6YmFzZTo6c29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KGFkYkNsaWVudFBvcnQpKTsKKyAgICB9CisgICAgaWYgKCFzb2NrZXQudmFsaWQoKSkgeworICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZnJlcXVlbnRseSB3aGVuIHRoZXJlIGlzIG5vIEFEQiBTZXJ2ZXIgcnVubmluZworICAgICAgICAvLyBvbiB0aGUgaG9zdCwgc28gZG9uJ3QgY29tcGxhaW4gd2l0aCBhIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBTZW5kIHRoZSBzcGVjaWFsIG1lc3NhZ2UKKyAgICBhdXRvIG1lc3NhZ2UgPSBTdHJpbmdGb3JtYXQoImhvc3Q6ZW11bGF0b3I6JWQiLCBhZGJFbXVsYXRvclBvcnQpOworICAgIGF1dG8gaGFuZHNoYWtlID0gU3RyaW5nRm9ybWF0KCIlMDR4JXMiLCBtZXNzYWdlLnNpemUoKSwgbWVzc2FnZS5jX3N0cigpKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIkF0dGVtcHRpbmcgdG8gbm90aWZ5IGFkYiBob3N0IHNlcnZlciB3aXRoIHwiIDw8IGhhbmRzaGFrZQorICAgICAgICAgICAgICAgICA8PCAifCI7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OnNvY2tldFNlbmRBbGwoc29ja2V0LmdldCgpLCBoYW5kc2hha2UuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2Uuc2l6ZSgpKTsKK30KKworaW50IEFkYkhvc3RTZXJ2ZXI6OmdldENsaWVudFBvcnQoKSB7CisgICAgaW50IGNsaWVudFBvcnQgPSBrRGVmYXVsdEFkYkNsaWVudFBvcnQ7CisgICAgY29uc3QgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBrVmFyTmFtZSA9ICJBTkRST0lEX0FEQl9TRVJWRVJfUE9SVCI7CisgICAgc3RkOjpzdHJpbmcgZW52ID0gYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpnZXQoKS0+ZW52R2V0KGtWYXJOYW1lKTsKKyAgICBpZiAoIWVudi5lbXB0eSgpKSB7CisgICAgICAgIGxvbmcgcG9ydCA9IHN0cnRvbChlbnYuY19zdHIoKSwgTlVMTCwgMCk7CisgICAgICAgIGlmIChwb3J0IDw9IDAgfHwgcG9ydCA+PSA2NTUzNikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRW52LiB2YXIgIiA8PCBrVmFyTmFtZSA8PCAiIG11c3QgYmUgYSBudW1iZXIgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW4gMS4uNjU1MzUgcmFuZ2UuIEdvdCAiIDw8IHBvcnQ7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50UG9ydCA9IHN0YXRpY19jYXN0PGludD4ocG9ydCk7CisgICAgfQorICAgIHJldHVybiBjbGllbnRQb3J0OworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkhvc3RTZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAwZDBiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJIb3N0U2VydmVyLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworLy8gVXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIHN0YXRpYyBtZXRob2RzIHRvIGludGVyYWN0IHdpdGggdGhlIEFEQiBTZXJ2ZXIKKy8vIHJ1bm5pbmcgb24gdGhlICBob3N0Lgorc3RydWN0IEFkYkhvc3RTZXJ2ZXIgeworICAgIC8vIE5vdGlmeSB0aGUgaG9zdCBzZXJ2ZXIsIGlmIGFueSwgdGhhdCBhbiBlbXVsYXRvciBpbnN0YW5jZSBpcyBsaXN0ZW5pbmcKKyAgICAvLyBmb3IgY29ubmVjdGlvbnMgb24gfGFkYkVtdWxhdG9yUG9ydHwgbG9jYWxob3N0IFRDUCBwb3J0LiB8YWRiQ2xpZW50UG9ydHwKKyAgICAvLyBpcyB0aGUgbG9jYWxob3N0IFRDUCBwb3J0IHRoZSBBREIgc2VydmVyIGlzIGxpc3RlbmluZyBvbiBmb3IgY2xpZW50CisgICAgLy8gY29ubmVjdGlvbnMgd2hlcmUgdGhlIG1lc3NhZ2Ugc2hvdWxkIGJlIHNlbnQuIEV4Y2VwdCBkdXJpbmcKKyAgICAvLyB1bml0LXRlc3RpbmcsIHRoaXMgc2hvdWxkIGJlIHRoZSByZXN1bHQgb2YgZ2V0Q2xpZW50UG9ydCgpLiBSZXR1cm4gdHJ1ZQorICAgIC8vIG9uIHN1Y2Nlc3MsIGZhbHNlL2Vycm5vIG9uIGVycm9yLgorICAgIHN0YXRpYyBib29sIG5vdGlmeShpbnQgYWRiRW11bGF0b3JQb3J0LCBpbnQgYWRiQ2xpZW50UG9ydCk7CisKKyAgICAvLyBEZWZhdWx0IEFEQiBjbGllbnQgcG9ydCB2YWx1ZS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrRGVmYXVsdEFkYkNsaWVudFBvcnQgPSA1MDM3OworCisgICAgLy8gUmV0dXJuIHRoZSBBREIgY2xpZW50IHBvcnQgdG8gdXNlIGZvciB0aGlzIGVtdWxhdG9yIGluc3RhbmNlLCB0aGlzIGlzCisgICAgLy8gZWl0aGVyIHxrRGVmYXVsdEFkYkNsaWVudFBvcnR8IG9yIGFuIG92ZXItcmlkZW4gdmFsdWUgZnJvbSBhbiBlbnZpcm9ubWVudAorICAgIC8vIHZhcmlhYmxlLgorICAgIHN0YXRpYyBpbnQgZ2V0Q2xpZW50UG9ydCgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWxhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdFNlcnZlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkhvc3RTZXJ2ZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MGNjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYkhvc3RTZXJ2ZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQWRiSG9zdFNlcnZlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9TY29wZWRTb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RJbnB1dEJ1ZmZlclNvY2tldFNlcnZlclRocmVhZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZFNvY2tldDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXc7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0U3lzdGVtOworCisKK1RFU1QoQWRiSG9zdFNlcnZlciwgbm90aWZ5KSB7CisgICAgLy8gQmluZCB0byByYW5kb20gcG9ydCB0byBsaXN0ZW4gdG8KKyAgICBhbmRyb2lkOjpiYXNlOjpUZXN0SW5wdXRCdWZmZXJTb2NrZXRTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkOworICAgIEFTU0VSVF9UUlVFKHNlcnZlclRocmVhZC52YWxpZCgpKTsKKworICAgIGNvbnN0IGludCBlbXVsYXRvclBvcnQgPSA3NjQ4OyAgLy8gRG9uJ3QgdXNlIGRlZmF1bHQgKDU1NTQpIGhlcmUuCisgICAgaW50IGNsaWVudFBvcnQgPSBzZXJ2ZXJUaHJlYWQucG9ydCgpOworICAgIHNlcnZlclRocmVhZC5zdGFydCgpOworCisgICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNlcnZlciB0aHJlYWQuCisgICAgRVhQRUNUX1RSVUUoQWRiSG9zdFNlcnZlcjo6bm90aWZ5KGVtdWxhdG9yUG9ydCwgY2xpZW50UG9ydCkpOworCisgICAgaW50cHRyX3QgYnVmZmVyU2l6ZSA9IDA7CisgICAgRVhQRUNUX1RSVUUoc2VydmVyVGhyZWFkLndhaXQoJmJ1ZmZlclNpemUpKTsKKworICAgIC8vIFZlcmlmeSBtZXNzYWdlIGNvbnRlbnQuCisgICAgY29uc3RleHByIFN0cmluZ1ZpZXcga0V4cGVjdGVkID0gIjAwMTJob3N0OmVtdWxhdG9yOjc2NDgiOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWQuc2l6ZSgpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpKTsKKyAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkLnNpemUoKSwgc2VydmVyVGhyZWFkLnZpZXcoKS5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUShrRXhwZWN0ZWQuY19zdHIoKSwgc2VydmVyVGhyZWFkLnZpZXcoKS5jX3N0cigpKTsKK30KKworVEVTVChBZGJIb3N0U2VydmVyLCBnZXRDbGllbnRQb3J0RGVmYXVsdCkgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5c3RlbSgiL2JpbiIsIDMyKTsKKyAgICBjb25zdCBpbnQgZXhwZWN0ZWQgPSBBZGJIb3N0U2VydmVyOjprRGVmYXVsdEFkYkNsaWVudFBvcnQ7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBBZGJIb3N0U2VydmVyOjpnZXRDbGllbnRQb3J0KCkpOworfQorCitURVNUKEFkYkhvc3RTZXJ2ZXIsIGdldENsaWVudFBvcnRXaXRoRW52aXJvbm1lbnRPdmVycmlkZSkgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5c3RlbSgiL2JpbiIsIDMyKTsKKyAgICB0ZXN0U3lzdGVtLmVudlNldCgiQU5EUk9JRF9BREJfU0VSVkVSX1BPUlQiLCAiMTIzNCIpOworICAgIEVYUEVDVF9FUSgxMjM0LCBBZGJIb3N0U2VydmVyOjpnZXRDbGllbnRQb3J0KCkpOworfQorCitURVNUKEFkYkhvc3RTZXJ2ZXIsIGdldENsaWVudFBvcnRXaXRoSW52YWxpZEVudmlyb25tZW50T3ZlcnJpZGUpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXN0ZW0oIi9iaW4iLCAzMik7CisgICAgdGVzdFN5c3RlbS5lbnZTZXQoIkFORFJPSURfQURCX1NFUlZFUl9QT1JUIiwgIi0xMDAwIik7CisgICAgRVhQRUNUX0VRKC0xLCBBZGJIb3N0U2VydmVyOjpnZXRDbGllbnRQb3J0KCkpOworCisgICAgdGVzdFN5c3RlbS5lbnZTZXQoIkFORFJPSURfQURCX1NFUlZFUl9QT1JUIiwgIjY1NTM2Iik7CisgICAgRVhQRUNUX0VRKC0xLCBBZGJIb3N0U2VydmVyOjpnZXRDbGllbnRQb3J0KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJUeXBlcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BZGJUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTgwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FkYlR5cGVzLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCisvLyBJbnRlcmZhY2VzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgYmV0d2VlbiB0aGUKKy8vIGhvc3QgQURCIFNlcnZlciBhbmQgdGhlIGd1ZXN0IGFkYmQgZGFlbW9uLCBwcm92aWRlZCBieSB0aGUgZW11bGF0b3IuCisvLworLy8gVHdvIG9iamVjdHMgaW50ZXJhY3QgdG8gaW1wbGVtZW50IHRoZSBwcm94eToKKy8vCisvLyAtIFRoZSBBZGJIb3N0QWdlbnQgbGlzdGVucyBmb3IgY29ubmVjdGlvbnMgZnJvbSB0aGUgc2VydmVyLCBhbmQgcGFzc2VzCisvLyAgIGNvbm5lY3Rpb24gc29ja2V0cyB0byB0aGUgQWRiR3Vlc3RBZ2VudCB3aGVuIHRoZXkgaGFwcGVuLgorLy8KKy8vIC0gVGhlIEFkYkd1ZXN0QWdlbnQgaGFuZGxlcyBhbGwgZ3Vlc3QgQURCIHBpcGUgY29ubmVjdGlvbnMsIGFuZCB0ZWxscworLy8gICB0aGUgQWRiSG9zdEFnZW50IHdoZW4gdG8gYWNjZXB0LCBvciBub3QgYWNjZXB0IGNvbm5lY3Rpb25zLCBhcyB3ZWxsIGFzCisvLyAgIHdoZW4gdG8gbm90aWZ5IHRoZSBzZXJ2ZXIgdGhhdCBhIG5ldyBndWVzdCBpcyB3YWl0aW5nIGZvciBpdC4KKworLy8gQWRiR3Vlc3RBZ2VudCBpcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gYW4gb2JqZWN0IHRoYXQgbW9kZWxzCisvLyBhbGwgZ3Vlc3QgQURCIHBpcGUgY29ubmVjdGlvbnMuCitzdHJ1Y3QgQWRiR3Vlc3RBZ2VudCB7CisgICAgLy8gRW5zdXJlIGRlc3RydWN0b3IgaXMgdmlydHVhbC4KKyAgICB2aXJ0dWFsIH5BZGJHdWVzdEFnZW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGhvc3QgQURCIHNlcnZlciBjb25uZWN0cy4gVGhpcyBwYXNzZXMgb3duZXJzaGlwIG9mCisgICAgLy8gfHNvY2tldHwgdG8gdGhlIEFkYkd1ZXN0QWdlbnQgaW5zdGFuY2UuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGFmdGVyCisgICAgLy8gc3RhcnRMaXN0ZW5pbmcoKSB3YXMgY2FsbGVkIG9uIHRoZSBBZGJIb3N0QWdlbnQuCisgICAgdmlydHVhbCB2b2lkIG9uSG9zdENvbm5lY3Rpb24oYW5kcm9pZDo6YmFzZTo6U2NvcGVkU29ja2V0JiYgc29ja2V0KSA9IDA7Cit9OworCisvLyBBZGJIb3N0QWdlbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgdG8gdGhlIGNvZGUgdGhhdCBhY3R1YWxseQorLy8gbWFuYWdlcyB0aGUgaG9zdCBBREIgc2VydmVyIHBvcnQgYW5kIG11bHRpcGxlIEFEQiBwaXBlcy4KK3N0cnVjdCBBZGJIb3N0QWdlbnQgeworICAgIC8vIEVuc3VyZSBkZXN0cnVjdG9yIGlzIHZpcnR1YWwuCisgICAgdmlydHVhbCB+QWRiSG9zdEFnZW50KCkgPSBkZWZhdWx0OworCisgICAgLy8gQ2FsbGVkIHRvIHRlbGwgdGhlIEFkYkhvc3RBZ2VudCB0byBhY2NlcHQgb25lIGNvbm5lY3Rpb24gZnJvbSB0aGUKKyAgICAvLyBBREIgc2VydmVyLiBXaGVuIHRoaXMgaGFwcGVucywgb25Ib3N0Q29ubmVjdGlvbigpIHdpbGwgYmUgY2FsbGVkLAorICAgIC8vIGFuZCB0aGUgQWRiR3Vlc3RBZ2VudCB3aWxsIGhhdmUgdG8gY2FsbCBzdGFydExpc3RlbmluZygpIGFnYWluCisgICAgLy8gdG8gYWxsb3cgYW5vdGhlciBjb25uZWN0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzdGFydExpc3RlbmluZygpID0gMDsKKworICAgIC8vIFRlbGwgdGhlIEFkYkhvc3RBZ2VudCB0byBzdG9wIGFjY2VwdGluZyBjb25uZWN0aW9ucyBmcm9tIHRoZSBBREIgc2VydmVyLgorICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBhZnRlciBzdGFydExpc3RlbmluZygpIGlmIGZvciBzb21lIHJlYXNvbiB0aGUgZ3Vlc3QKKyAgICAvLyBkZXN0cm95cyB0aGUgY3VycmVudCBndWVzdCBjb25uZWN0aW9uIHRoYXQncyB3YWl0aW5nIGZvciBpdC4KKyAgICB2aXJ0dWFsIHZvaWQgc3RvcExpc3RlbmluZygpID0gMDsKKworICAgIC8vIFRlbGwgdGhlIEFEQiBzZXJ2ZXIgdGhhdCBhIG5ldyBndWVzdCBpcyB3YWl0aW5nIGZvciBjb25uZWN0aW9ucy4KKyAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgQURCIFNlcnZlciB3YXMgcmVzdGFydGVkIGFuZAorICAgIC8vIHRoZSBjdXJyZW50IGVtdWxhdG9yIGluc3RhbmNlIGlzIGxpc3RlbmluZyBvbiBvbmUgYSBwb3J0IHRoYXQgaXMgbm90CisgICAgLy8gb25lIG9mIHRoZSAxNiBhdXRvLXNjYW5uZWQgcG9ydHMgc3RhcnRpbmcgZnJvbSA1NTU1LgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTZXJ2ZXIoKSA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FuZHJvaWRQaXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGMxYTgzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5jcHAKQEAgLTAsMCArMSw1NjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQW5kcm9pZFBpcGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfZGV2aWNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2hvc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9EZXZpY2VDb250ZXh0UnVubmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHID49IDEKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBEKC4uLikgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorI2RlZmluZSBEKC4uLikgKHZvaWQpMAorI2VuZGlmCisKKyNpZiBERUJVRyA+PSAyCisjZGVmaW5lIEREKC4uLikgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorI2RlZmluZSBERCguLi4pICh2b2lkKTAKKyNlbmRpZgorCisjZGVmaW5lIEUoLi4uKSBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiIgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKworc3RhdGljIGNvbnN0IEFuZHJvaWRQaXBlSHdGdW5jcyogc1BpcGVId0Z1bmNzID0gbnVsbHB0cjsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK3VzaW5nIEFuZHJvaWRQaXBlID0gYW5kcm9pZDo6QW5kcm9pZFBpcGU7Cit1c2luZyBCYXNlU3RyZWFtID0gYW5kcm9pZDo6YmFzZTo6U3RyZWFtOwordXNpbmcgQ1N0cmVhbSA9IDo6U3RyZWFtOwordXNpbmcgT3B0aW9uYWxTdHJpbmcgPSBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDxzdGQ6OnN0cmluZz47Cit1c2luZyBTZXJ2aWNlID0gYW5kcm9pZDo6QW5kcm9pZFBpcGU6OlNlcnZpY2U7Cit1c2luZyBTZXJ2aWNlTGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPj47Cit1c2luZyBWbUxvY2sgPSBhbmRyb2lkOjpWbUxvY2s7CisKK3N0YXRpYyBCYXNlU3RyZWFtKiBhc0Jhc2VTdHJlYW0oQ1N0cmVhbSogc3RyZWFtKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QmFzZVN0cmVhbSo+KHN0cmVhbSk7Cit9CisKKy8vIFVzZSBDSEVDS19WTV9TVEFURV9MT0NLKCkgdG8gcGFuaWMgaW4gZGVidWcgYnVpbGRzIGlmIHRoZSBjdXJyZW50IHRocmVhZAorLy8gZG9lc24ndCBob2xkIHRoZSBWTSBzdGF0ZSBsb2NrLgorI2lmIChERUJVRyA+IDApIHx8ICFkZWZpbmVkKE5ERUJVRykKKyNkZWZpbmUgQ0hFQ0tfVk1fU1RBVEVfTE9DSygpICBDSEVDSyhWbUxvY2s6OmdldCgpLT5pc0xvY2tlZEJ5U2VsZigpKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0tfVk1fU1RBVEVfTE9DSygpICh2b2lkKTAKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8vIFdyaXRlIGFuIG9wdGlvbmFsIHN0cmluZyB8c3RyfCB0byB8c3RyZWFtfC4gfHN0cnwgY2FuIGJlIG51bGwuIFVzZQorLy8gcmVhZE9wdGlvbmFsU3RyaW5nKCkgdG8gcmVhZCBpdCBiYWNrIGxhdGVyLgorc3RhdGljIHZvaWQgd3JpdGVPcHRpb25hbFN0cmluZyhCYXNlU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIHN0cikgeworICAgIGlmIChzdHIpIHsKKyAgICAgICAgc3RyZWFtLT5wdXRCeXRlKDEpOworICAgICAgICBzdHJlYW0tPnB1dFN0cmluZyhzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+cHV0Qnl0ZSgwKTsKKyAgICB9Cit9CisKKy8vIFJlYWQgYW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gfHN0cmVhbXwuIElmIHRoZSByZXN1bHQgaXMgbm90IGNvbnN0cnVjdGVkCisvLyAoaS5lLiBlcXVhbHMgdG8gZmFsc2UpLCB0aGlzIG1lYW5zIHRoZSBvcmlnaW5hbCB8c3RyfCBwYXJhbWV0ZXIgd2FzIG51bGwuCitzdGF0aWMgT3B0aW9uYWxTdHJpbmcgcmVhZE9wdGlvbmFsU3RyaW5nKEJhc2VTdHJlYW0qIHN0cmVhbSkgeworICAgIGlmIChzdHJlYW0tPmdldEJ5dGUoKSkgeworICAgICAgICByZXR1cm4gT3B0aW9uYWxTdHJpbmcoc3RkOjptb3ZlKHN0cmVhbS0+Z2V0U3RyaW5nKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIE9wdGlvbmFsU3RyaW5nKCk7Cit9CisKKy8vIGZvcndhcmQKK1NlcnZpY2UqIGZpbmRTZXJ2aWNlQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBhIHNwZWNpYWwgQW5kcm9pZFBpcGUgY2xhc3MgdXNlZCB0byBtb2RlbCB0aGUgc3RhdGUKKy8vIG9mIGEgcGlwZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgc2VydmljZSBuYW1lIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlCisvLyBmaWxlIGRlc2NyaXB0b3IgYnkgdGhlIGd1ZXN0LiBUaGUgbW9zdCBpbXBvcnRhbnQgbWV0aG9kIGlzIG9uR3Vlc3RTZW5kKCkKKy8vIHdoaWNoIHdpbGwgZGV0ZWN0IHdoZW4gdGhpcyBoYXBwZW5zLgorY2xhc3MgQ29ubmVjdG9yUGlwZSA6IHB1YmxpYyBBbmRyb2lkUGlwZSB7CitwdWJsaWM6CisgICAgQ29ubmVjdG9yUGlwZSh2b2lkKiBod1BpcGUsIFNlcnZpY2UqIHNlcnZpY2UpCisgICAgICAgIDogQW5kcm9pZFBpcGUoaHdQaXBlLCBzZXJ2aWNlKSB7CisgICAgICAgIEREKCIlczogQ3JlYXRpbmcgbmV3IENvbm5lY3RvclBpcGUgaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCBtSHdQaXBlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25HdWVzdENsb3NlKCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgREQoIiVzOiBjbG9zaW5nIENvbm5lY3RvclBpcGUgaHdwaXBlPSVwIHByZW1hdHVyaWx5ISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgbUh3UGlwZSk7CisgICAgfQorCisgICAgdmlydHVhbCB1bnNpZ25lZCBvbkd1ZXN0UG9sbCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQSBjb25uZWN0b3IgYWx3YXlzIHdhbnQgdG8gcmVjZWl2ZSBkYXRhLgorICAgICAgICBERCgiJXM6IHBvbGxpbmcgaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCBtSHdQaXBlKTsKKyAgICAgICAgcmV0dXJuIFBJUEVfUE9MTF9PVVQ7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgb25HdWVzdFJlY3YoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ1ZmZlcnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVGhpcyBwaXBlIG5ldmVyIHdhbnRzIHRvIHdyaXRlIHRvIHRoZSBndWVzdCwgc28gZ2V0dGluZyB0aGVyZQorICAgICAgICAvLyBpcyBhbiBlcnJvciBzaW5jZSBQSVBFX1dBS0VfSU4gaXMgbmV2ZXIgc2lnbmFsZWQuCisgICAgICAgIEREKCIlczogdHJ5aW5nIHRvIHJlY2VpdmUgZGF0YSBmcm9tIGh3cGlwZT0lcCIsIF9fRlVOQ1RJT05fXywgbUh3UGlwZSk7CisgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0lPOworICAgIH0KKworICAgIC8vIFRFQ0hOSUNBTCBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGRhdGEgZnJvbSB0aGUgZ3Vlc3QgdW50aWwgaXQKKyAgICAvLyBmaW5kcyBhIHplcm8tdGVybWluYXRlZCBDLXN0cmluZy4gQWZ0ZXIgdGhhdCBpdCBwYXJzZXMgaXQgdG8gZmluZAorICAgIC8vIGEgcmVnaXN0ZXJlZCBzZXJ2aWNlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBhbGxvd2VkIGZvcm1hdHMKKyAgICAvLyAoc2VlIGJlbG93KS4gSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGlzIGNyZWF0ZXMgYSBuZXcgQW5kcm9pZFBpcGUKKyAgICAvLyBpbnN0YW5jZSBhbmQgY2FsbHMgQW5kcm9pZFBpcGVId0Z1bmNzOjpyZXNldFBpcGUoKSB0byBhc3NvY2lhdGUgaXQgd2l0aAorICAgIC8vIHRoZSBjdXJyZW50IGhhcmR3YXJlLXNpZGUgfG1Id1BpcGV8LCB0aGVuICpkZWxldGVzKiB0aGUgY3VycmVudAorICAgIC8vIGluc3RhbmNlISBJbiBjYXNlIG9mIGVycm9yIChlLmcuIGludmFsaWQgc2VydmljZSBuYW1lLCBvciBlcnJvciBkdXJpbmcKKyAgICAvLyBpbml0aWFsaXphdGlvbiksIFBJUEVfRVJST1JfSU5WQUwgd2lsbCBiZSByZXR1cm5lZCwgb3RoZXJ3aXNlLCB0aGUKKyAgICAvLyBudW1iZXIgb2YgYnl0ZXMgYWNjZXB0ZWQgZnJvbSB0aGUgZ3Vlc3QgaXMgcmV0dXJuZWQuCisgICAgdmlydHVhbCBpbnQgb25HdWVzdFNlbmQoY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ1ZmZlcnMpIG92ZXJyaWRlIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGtCdWZmZXJTaXplIC0gbVBvczsKKyAgICAgICAgYm9vbCBmb3VuZFplcm8gPSBmYWxzZTsKKyAgICAgICAgZm9yICg7ICFmb3VuZFplcm8gJiYgYXZhaWwgPiAwICYmIG51bUJ1ZmZlcnMgPiAwOworICAgICAgICAgICAgIGJ1ZmZlcnMrKywgbnVtQnVmZmVycy0tKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhID0gYnVmZmVyc1swXS5kYXRhOworICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gc3RkOjptaW4oYXZhaWwsIGJ1ZmZlcnNbMF0uc2l6ZSk7CisgICAgICAgICAgICAvLyBSZWFkIHVwIHRvIHxjb3VudHwgYnl0ZXMsIHN0b3BwaW5nIGFmdGVyIHRoZSBmaXJzdCB6ZXJvLgorICAgICAgICAgICAgc2l6ZV90IG4gPSAwOworICAgICAgICAgICAgd2hpbGUgKG4gPCBjb3VudCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnl0ZSA9IGRhdGFbbisrXTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyW21Qb3MrK10gPSAoY2hhcikgYnl0ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRaZXJvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PGludD4obik7CisgICAgICAgICAgICBhdmFpbCAtPSBuOworICAgICAgICB9CisgICAgICAgIEREKCIlczogcmVjZWl2aW5nICVkIGNvbm5lY3Rpb24gYnl0ZXMgZnJvbSBod3BpcGU9JXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgIHJlc3VsdCwgbUh3UGlwZSk7CisKKyAgICAgICAgaWYgKCFmb3VuZFplcm8pIHsKKyAgICAgICAgICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgREQoIiVzOiBzZXJ2aWNlIG5hbWUgYnVmZmVyIGZ1bGwsIGZvcmNlLWNsb3NpbmcgY29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9JTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN0aWxsIHdhaXRpbmcgZm9yIHRlcm1pbmF0aW5nIHplcm8uCisgICAgICAgICAgICBERCgiJXM6IHN0aWxsIHdhaXRpbmcgZm9yIHRlcm1pbmF0aW5nIHplcm8hIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBBY2NlcHRhYmxlIGZvcm1hdHMgZm9yIHRoZSBjb25uZWN0aW9uIHN0cmluZyBhcmU6CisgICAgICAgIC8vCisgICAgICAgIC8vICAgIHBpcGU6PG5hbWU+CisgICAgICAgIC8vICAgIHBpcGU6PG5hbWU+Ojxhcmd1bWVudHM+CisgICAgICAgIC8vCisgICAgICAgIGNoYXIqIHBpcGVOYW1lOworICAgICAgICBjaGFyKiBwaXBlQXJnczsKKworICAgICAgICBEKCIlczogY29ubmVjdG9yOiAnJXMnIiwgX19GVU5DVElPTl9fLCBtQnVmZmVyKTsKKyAgICAgICAgaWYgKG1lbWNtcChtQnVmZmVyLCAicGlwZToiLCA1KSAhPSAwKSB7CisgICAgICAgICAgICAvLyBOb3BlLCB3ZSBkb24ndCBoYW5kbGUgdGhlc2UgZm9yIG5vdy4KKyAgICAgICAgICAgIEQoIiVzOiBVbmtub3duIHBpcGUgY29ubmVjdGlvbjogJyVzJyIsIF9fRlVOQ1RJT05fXywgbUJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9JTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIHBpcGVOYW1lID0gbUJ1ZmZlciArIDU7CisgICAgICAgIHBpcGVBcmdzID0gc3RyY2hyKHBpcGVOYW1lLCAnOicpOworCisgICAgICAgIFNlcnZpY2UqIHN2YyA9IG51bGxwdHI7CisKKyAgICAgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGlmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgYXM6CisgICAgICAgIC8vICAgIHFlbXVkOjxuYW1lPgorICAgICAgICAvLyAgICBxZW11ZDo8bmFtZT46YXJncworICAgICAgICAvLworICAgICAgICAvLyBGaXJzdCBsb29rIGZvciBhIHJlZ2lzdGVyZWQgcGlwZSBzZXJ2aWNlIG5hbWVkICJxZW11ZDo8bmFtZT4iCisgICAgICAgIC8vIGFuZCBpZiBub3QgZm91bmQsIGZhbGxiYWNrIHRvICJxZW11ZCIgb25seS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBpcyB1c2VmdWwgdG8gc3VwcG9ydCBxZW11ZCBzZXJ2aWNlcyB0aGF0IGFyZSBub3cgc2VydmVkCisgICAgICAgIC8vIGJ5IGEgZGVkaWNhdGVkIChhbmQgZmFzdGVyKSBwaXBlIHNlcnZpY2UsIGUuZy4gJ3FlbXVkOmFkYicKKyAgICAgICAgLy8gYXMgY3VycmVudGx5IGltcGxlbWVudGVkIGJ5IFFFTVUyIChhbmQgc29vbiBieSBRRU1VMSkuCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtRZW11ZFByZWZpeFtdID0gInFlbXVkOiI7CisgICAgICAgIGNvbnN0IHNpemVfdCBrUWVtdWRQcmVmaXhTaXplID0gc2l6ZW9mKGtRZW11ZFByZWZpeCkgLSAxVTsKKworICAgICAgICBpZiAoITo6c3RybmNtcChwaXBlTmFtZSwga1FlbXVkUHJlZml4LCBrUWVtdWRQcmVmaXhTaXplKSkgeworICAgICAgICAgICAgYXNzZXJ0KHBpcGVBcmdzID09IHBpcGVOYW1lICsga1FlbXVkUHJlZml4U2l6ZSAtIDEpOworICAgICAgICAgICAgY2hhciogcGlwZUFyZ3MyID0gc3RyY2hyKHBpcGVBcmdzICsgMSwgJzonKTsKKyAgICAgICAgICAgIGlmIChwaXBlQXJnczIpIHsKKyAgICAgICAgICAgICAgICAqcGlwZUFyZ3MyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN2YyA9IGZpbmRTZXJ2aWNlQnlOYW1lKHBpcGVOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdmMpIHsKKyAgICAgICAgICAgICAgICBwaXBlQXJncyA9IHBpcGVBcmdzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGlwZUFyZ3MyKSB7CisgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjb2xvbi4KKyAgICAgICAgICAgICAgICAqcGlwZUFyZ3MyID0gJzonOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwaXBlQXJncykgeworICAgICAgICAgICAgKnBpcGVBcmdzKysgPSAnXDAnOworICAgICAgICAgICAgaWYgKCFwaXBlQXJncykgeworICAgICAgICAgICAgICAgIHBpcGVBcmdzID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3ZjKSB7CisgICAgICAgICAgICBzdmMgPSBmaW5kU2VydmljZUJ5TmFtZShwaXBlTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN2YykgeworICAgICAgICAgICAgRCgiJXM6IFVua25vd24gc2VydmVyIHdpdGggbmFtZSAlcyEiLCBfX0ZVTkNUSU9OX18sIHBpcGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0lOVkFMOworICAgICAgICB9CisKKyAgICAgICAgQW5kcm9pZFBpcGUqIG5ld1BpcGUgPSBzdmMtPmNyZWF0ZShtSHdQaXBlLCBwaXBlQXJncyk7CisgICAgICAgIGlmICghbmV3UGlwZSkgeworICAgICAgICAgICAgRCgiJXM6IEluaXRpYWxpemF0aW9uIGZhaWxlZCBmb3IgJXMgcGlwZSEiLCBfX0ZVTkNUSU9OX18sIHBpcGVOYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0lOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3dhcCB5b3VyIGhvc3Qtc2lkZSBwaXBlIGluc3RhbmNlIHdpdGggdGhpcyBvbmUgd2VpcmQgdHJpY2shCisgICAgICAgIEQoIiVzOiBzdGFydGluZyBuZXcgcGlwZSAlcCAoc3dhcHBpbmcgJXApIGZvciBzZXJ2aWNlICVzIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgbmV3UGlwZSwKKyAgICAgICAgICBtSHdQaXBlLAorICAgICAgICAgIHBpcGVOYW1lKTsKKyAgICAgICAgc1BpcGVId0Z1bmNzLT5yZXNldFBpcGUobUh3UGlwZSwgbmV3UGlwZSk7CisgICAgICAgIGRlbGV0ZSB0aGlzOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RXYW50V2FrZU9uKGludCB3YWtlRmxhZ3MpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCisgICAgICAgIEREKCIlczogc2lnbmFsaW5nIHdha2VGbGFncz0lZCBmb3IgaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCB3YWtlRmxhZ3MsCisgICAgICAgICAgIG1Id1BpcGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblNhdmUoQmFzZVN0cmVhbSogc3RyZWFtKSBvdmVycmlkZSB7CisgICAgICAgIEREKCIlczogc2F2aW5nIGNvbm5lY3RvciBzdGF0ZSBmb3IgaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCBtSHdQaXBlKTsKKyAgICAgICAgc3RyZWFtLT5wdXRCZTMyKG1Qb3MpOworICAgICAgICBzdHJlYW0tPndyaXRlKG1CdWZmZXIsIG1Qb3MpOworICAgIH0KKworICAgIGJvb2wgb25Mb2FkKEJhc2VTdHJlYW0qIHN0cmVhbSkgeworICAgICAgICBERCgiJXM6IGxvYWRpbmcgY29ubmVjdG9yIHN0YXRlIGZvciBod3BpcGU9JXAiLCBfX0ZVTkNUSU9OX18sIG1Id1BpcGUpOworICAgICAgICBpbnQzMl90IGxlbiA9IHN0cmVhbS0+Z2V0QmUzMigpOworICAgICAgICBpZiAobGVuIDwgMCB8fCBsZW4gPiBrQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgRCgiJXM6IGludmFsaWQgbGVuZ3RoICVkIChleHBlY3RlZCAwIDw9IGxlbiA8PSAlZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obGVuKSwga0J1ZmZlclNpemUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG1Qb3MgPSAoaW50KWxlbjsKKyAgICAgICAgaW50IHJldCA9IChpbnQpc3RyZWFtLT5yZWFkKG1CdWZmZXIsIG1Qb3MpOworICAgICAgICBERCgiJXM6IHJlYWQgJWQgYnl0ZXMgKCVkIGV4cGVjdGVkKSIsIF9fRlVOQ1RJT05fXywgcmV0LCBtUG9zKTsKKyAgICAgICAgcmV0dXJuIChyZXQgPT0gbVBvcyk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtCdWZmZXJTaXplID0gMTI4OworICAgIGNoYXIgbUJ1ZmZlcltrQnVmZmVyU2l6ZV07CisgICAgaW50IG1Qb3MgPSAwOworfTsKKworLy8gQXNzb2NpYXRlZCBBbmRyb2lkUGlwZTo6U2VydmljZSBjbGFzcyBmb3IgQ29ubmVjdG9yUGlwZSBpbnN0YW5jZXMuCitjbGFzcyBDb25uZWN0b3JTZXJ2aWNlIDogcHVibGljIFNlcnZpY2UgeworcHVibGljOgorICAgIENvbm5lY3RvclNlcnZpY2UoKSA6IFNlcnZpY2UoIjxjb25uZWN0b3I+Iikge30KKworICAgIHZpcnR1YWwgQW5kcm9pZFBpcGUqIGNyZWF0ZSh2b2lkKiBod1BpcGUsIGNvbnN0IGNoYXIqIGFyZ3MpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0b3JQaXBlKGh3UGlwZSwgdGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNhbkxvYWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIEFuZHJvaWRQaXBlKiBsb2FkKHZvaWQqIGh3UGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlU3RyZWFtKiBzdHJlYW0pIG92ZXJyaWRlIHsKKyAgICAgICAgQ29ubmVjdG9yUGlwZSogcGlwZSA9IG5ldyBDb25uZWN0b3JQaXBlKGh3UGlwZSwgdGhpcyk7CisgICAgICAgIGlmICghcGlwZS0+b25Mb2FkKHN0cmVhbSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwaXBlOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBpcGU7CisgICAgfQorfTsKKworLy8gQSBoZWxwZXIgY2xhc3MgdXNlZCB0byBzZW5kIHNpZ25hbFdha2UoKSBhbmQgY2xvc2VGcm9tSG9zdCgpIGNvbW1hbmRzIHRvCisvLyB0aGUgZGV2aWNlIHRocmVhZCwgZGVwZW5kaW5nIG9uIHRoZSB0aHJlYWRpbmcgbW9kZSBzZXR1cCBieSB0aGUgZW11bGF0aW9uCisvLyBlbmdpbmUuCitzdHJ1Y3QgUGlwZVdha2VDb21tYW5kIHsKKyAgICB2b2lkKiBod1BpcGU7CisgICAgaW50IHdha2VGbGFnczsKK307CisKK2NsYXNzIFBpcGVXYWtlciBmaW5hbCA6IHB1YmxpYyBEZXZpY2VDb250ZXh0UnVubmVyPFBpcGVXYWtlQ29tbWFuZD4geworcHVibGljOgorICAgIHZvaWQgc2lnbmFsV2FrZSh2b2lkKiBod1BpcGUsIGludCB3YWtlRmxhZ3MpIHsKKyAgICAgICAgcXVldWVEZXZpY2VPcGVyYXRpb24oeyBod1BpcGUsIHdha2VGbGFncyB9KTsKKyAgICB9CisgICAgdm9pZCBjbG9zZUZyb21Ib3N0KHZvaWQqIGh3UGlwZSkgeworICAgICAgICBzaWduYWxXYWtlKGh3UGlwZSwgUElQRV9XQUtFX0NMT1NFRCk7CisgICAgfQorcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybURldmljZU9wZXJhdGlvbihjb25zdCBQaXBlV2FrZUNvbW1hbmQmIHdha2VfY21kKSB7CisgICAgICAgIHZvaWQqIGh3UGlwZSA9IHdha2VfY21kLmh3UGlwZTsKKyAgICAgICAgaW50IGZsYWdzID0gd2FrZV9jbWQud2FrZUZsYWdzOworCisgICAgICAgIGlmIChmbGFncyAmIFBJUEVfV0FLRV9DTE9TRUQpIHsKKyAgICAgICAgICAgIHNQaXBlSHdGdW5jcy0+Y2xvc2VGcm9tSG9zdChod1BpcGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc1BpcGVId0Z1bmNzLT5zaWduYWxXYWtlKGh3UGlwZSwgZmxhZ3MpOworICAgICAgICB9CisgICAgfQorfTsKKworc3RydWN0IEdsb2JhbHMgeworICAgIFNlcnZpY2VMaXN0IHNlcnZpY2VzOworICAgIENvbm5lY3RvclNlcnZpY2UgY29ubmVjdG9yU2VydmljZTsKKyAgICBQaXBlV2FrZXIgcGlwZVdha2VyOworCisgICAgU2VydmljZSogZmluZFNlcnZpY2VCeU5hbWUoY29uc3QgY2hhciogbmFtZSkgY29uc3QgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNlcnZpY2UgOiBzZXJ2aWNlcykgeworICAgICAgICAgICAgaWYgKHNlcnZpY2UtPm5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgU2VydmljZSogbG9hZFNlcnZpY2VCeU5hbWUoQmFzZVN0cmVhbSogc3RyZWFtKSB7CisgICAgICAgIE9wdGlvbmFsU3RyaW5nIHNlcnZpY2VOYW1lID0gcmVhZE9wdGlvbmFsU3RyaW5nKHN0cmVhbSk7CisgICAgICAgIGlmICghc2VydmljZU5hbWUpIHsKKyAgICAgICAgICAgIEREKCIlczogbm8gbmFtZSAoYXNzdW1pbmcgY29ubmVjdG9yIHN0YXRlKSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gJmNvbm5lY3RvclNlcnZpY2U7CisgICAgICAgIH0KKyAgICAgICAgREQoIiVzOiBmb3VuZCBbJXNdIiwgX19GVU5DVElPTl9fLCBzZXJ2aWNlTmFtZS0+Y19zdHIoKSk7CisgICAgICAgIHJldHVybiB0aGlzLT5maW5kU2VydmljZUJ5TmFtZShzZXJ2aWNlTmFtZS0+Y19zdHIoKSk7CisgICAgfQorfTsKKworYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEdsb2JhbHM+IHNHbG9iYWxzID0gTEFaWV9JTlNUQU5DRV9JTklUOworCitTZXJ2aWNlKiBmaW5kU2VydmljZUJ5TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIHNHbG9iYWxzLT5maW5kU2VydmljZUJ5TmFtZShuYW1lKTsKK30KKworQW5kcm9pZFBpcGUqIGxvYWRQaXBlRnJvbVN0cmVhbUNvbW1vbihCYXNlU3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh3UGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogcEZvcmNlQ2xvc2UpIHsKKyAgICAqcEZvcmNlQ2xvc2UgPSAwOworCisgICAgT3B0aW9uYWxTdHJpbmcgYXJncyA9IHJlYWRPcHRpb25hbFN0cmluZyhzdHJlYW0pOworICAgIEFuZHJvaWRQaXBlKiBwaXBlID0gbnVsbHB0cjsKKyAgICBpZiAoc2VydmljZS0+Y2FuTG9hZCgpKSB7CisgICAgICAgIEREKCIlczogbG9hZGluZyBzdGF0ZSBmb3IgWyVzXSBod3BpcGU9JXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgIHNlcnZpY2UtPm5hbWUoKS5jX3N0cigpLCBod1BpcGUpOworICAgICAgICBwaXBlID0gc2VydmljZS0+bG9hZChod1BpcGUsIGFyZ3MgPyBhcmdzLT5jX3N0cigpIDogbnVsbHB0ciwgc3RyZWFtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBERCgiJXM6IGZvcmNlLWNsb3NpbmcgaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCBod1BpcGUpOworICAgICAgICAqcEZvcmNlQ2xvc2UgPSAxOworICAgIH0KKyAgICByZXR1cm4gcGlwZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYwordm9pZCBBbmRyb2lkUGlwZTo6aW5pdFRocmVhZGluZyhWbUxvY2sqIHZtTG9jaykgeworICAgIHNHbG9iYWxzLT5waXBlV2FrZXIuaW5pdCh2bUxvY2spOworfQorCitBbmRyb2lkUGlwZTo6fkFuZHJvaWRQaXBlKCkgeworICAgIEREKCIlczogZm9yIGh3cGlwZT0lcCAoaG9zdCAlcCAnJXMnKSIsIF9fRlVOQ1RJT05fXywgbUh3UGlwZSwgdGhpcywKKyAgICAgICBtU2VydmljZS0+bmFtZSgpLmNfc3RyKCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQW5kcm9pZFBpcGU6OlNlcnZpY2U6OmFkZChTZXJ2aWNlKiBzZXJ2aWNlKSB7CisgICAgREQoIkFkZGluZyBuZXcgcGlwZSBzZXJ2aWNlICclcycgdGhpcz0lcCIsIHNlcnZpY2UtPm5hbWUoKS5jX3N0cigpLAorICAgICAgIHNlcnZpY2UpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZXJ2aWNlPiBzdmMoc2VydmljZSk7CisgICAgc0dsb2JhbHMtPnNlcnZpY2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUoc3ZjKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBbmRyb2lkUGlwZTo6U2VydmljZTo6cmVzZXRBbGwoKSB7CisgICAgREQoIlJlc2V0dGluZyBhbGwgcGlwZSBzZXJ2aWNlcyIpOworICAgIHNHbG9iYWxzLT5zZXJ2aWNlcy5jbGVhcigpOworfQorCit2b2lkIEFuZHJvaWRQaXBlOjpzaWduYWxXYWtlKGludCB3YWtlRmxhZ3MpIHsKKyAgICBzR2xvYmFscy0+cGlwZVdha2VyLnNpZ25hbFdha2UobUh3UGlwZSwgd2FrZUZsYWdzKTsKK30KKwordm9pZCBBbmRyb2lkUGlwZTo6Y2xvc2VGcm9tSG9zdCgpIHsKKyAgICBzR2xvYmFscy0+cGlwZVdha2VyLmNsb3NlRnJvbUhvc3QobUh3UGlwZSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBBbmRyb2lkUGlwZTo6c2F2ZVRvU3RyZWFtKEJhc2VTdHJlYW0qIHN0cmVhbSkgeworICAgIC8vIEZpcnN0LCB3cml0ZSBzZXJ2aWNlIG5hbWUuCisgICAgaWYgKG1TZXJ2aWNlID09ICZzR2xvYmFscy0+Y29ubmVjdG9yU2VydmljZSkgeworICAgICAgICAvLyBBIGNvbm5lY3RvciBwaXBlCisgICAgICAgIHN0cmVhbS0+cHV0Qnl0ZSgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBIHJlZ3VsYXIgc2VydmljZSBwaXBlLgorICAgICAgICBzdHJlYW0tPnB1dEJ5dGUoMSk7CisgICAgICAgIHN0cmVhbS0+cHV0U3RyaW5nKG1TZXJ2aWNlLT5uYW1lKCkpOworICAgIH0KKyAgICB3cml0ZU9wdGlvbmFsU3RyaW5nKHN0cmVhbSwgbUFyZ3MuY19zdHIoKSk7CisKKyAgICAvLyBTYXZlIHBpcGUtc3BlY2lmaWMgc3RhdGUgbm93LgorICAgIG9uU2F2ZShzdHJlYW0pOworfQorCisvLyBzdGF0aWMKK0FuZHJvaWRQaXBlKiBBbmRyb2lkUGlwZTo6bG9hZEZyb21TdHJlYW0oQmFzZVN0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBGb3JjZUNsb3NlKSB7CisgICAgU2VydmljZSogc2VydmljZSA9IHNHbG9iYWxzLT5sb2FkU2VydmljZUJ5TmFtZShzdHJlYW0pOworICAgIGlmICghc2VydmljZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGxvYWRQaXBlRnJvbVN0cmVhbUNvbW1vbihzdHJlYW0sIGh3UGlwZSwgc2VydmljZSwgcEZvcmNlQ2xvc2UpOworfQorCisvLyBzdGF0aWMKK0FuZHJvaWRQaXBlKiBBbmRyb2lkUGlwZTo6bG9hZEZyb21TdHJlYW1MZWdhY3koQmFzZVN0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBwQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcFdha2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwQ2xvc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwRm9yY2VDbG9zZSkgeworICAgIFNlcnZpY2UqIHNlcnZpY2UgPSBzR2xvYmFscy0+bG9hZFNlcnZpY2VCeU5hbWUoc3RyZWFtKTsKKyAgICBpZiAoIXNlcnZpY2UpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgICpwQ2hhbm5lbCA9IHN0cmVhbS0+Z2V0QmU2NCgpOworICAgICpwV2FrZXMgPSBzdHJlYW0tPmdldEJ5dGUoKTsKKyAgICAqcENsb3NlZCA9IHN0cmVhbS0+Z2V0Qnl0ZSgpOworCisgICAgcmV0dXJuIGxvYWRQaXBlRnJvbVN0cmVhbUNvbW1vbihzdHJlYW0sIGh3UGlwZSwgc2VydmljZSwgcEZvcmNlQ2xvc2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyBBUEkgZm9yIHRoZSB2aXJ0dWFsIGRldmljZS4KKworY29uc3QgQW5kcm9pZFBpcGVId0Z1bmNzKiBhbmRyb2lkX3BpcGVfc2V0X2h3X2Z1bmNzKAorICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUh3RnVuY3MqIGh3RnVuY3MpIHsKKyAgICBjb25zdCBBbmRyb2lkUGlwZUh3RnVuY3MqIHJlc3VsdCA9IHNQaXBlSHdGdW5jczsKKyAgICBzUGlwZUh3RnVuY3MgPSBod0Z1bmNzOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgYW5kcm9pZF9waXBlX3Jlc2V0X3NlcnZpY2VzKCkgeworICAgIEFuZHJvaWRQaXBlOjpTZXJ2aWNlOjpyZXNldEFsbCgpOworfQorCit2b2lkKiBhbmRyb2lkX3BpcGVfZ3Vlc3Rfb3Blbih2b2lkKiBod3BpcGUpIHsKKyAgICBDSEVDS19WTV9TVEFURV9MT0NLKCk7CisgICAgREQoIiVzOiBDcmVhdGluZyBuZXcgY29ubmVjdG9yIHBpcGUgZm9yIGh3cGlwZT0lcCIsIF9fRlVOQ1RJT05fXywgaHdwaXBlKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6c0dsb2JhbHMtPmNvbm5lY3RvclNlcnZpY2UuY3JlYXRlKGh3cGlwZSwgbnVsbHB0cik7Cit9CisKK3ZvaWQgYW5kcm9pZF9waXBlX2d1ZXN0X2Nsb3NlKHZvaWQqIGludGVybmFsUGlwZSkgeworICAgIENIRUNLX1ZNX1NUQVRFX0xPQ0soKTsKKyAgICBhdXRvIHBpcGUgPSBzdGF0aWNfY2FzdDxhbmRyb2lkOjpBbmRyb2lkUGlwZSo+KGludGVybmFsUGlwZSk7CisgICAgaWYgKHBpcGUpIHsKKyAgICAgICAgRCgiJXM6IGhvc3Q9JXAgWyVzXSIsIF9fRlVOQ1RJT05fXywgcGlwZSwgcGlwZS0+bmFtZSgpKTsKKyAgICAgICAgcGlwZS0+b25HdWVzdENsb3NlKCk7CisgICAgfQorfQorCit2b2lkIGFuZHJvaWRfcGlwZV9ndWVzdF9zYXZlKHZvaWQqIGludGVybmFsUGlwZSwgQ1N0cmVhbSogc3RyZWFtKSB7CisgICAgQ0hFQ0tfVk1fU1RBVEVfTE9DSygpOworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PGFuZHJvaWQ6OkFuZHJvaWRQaXBlKj4oaW50ZXJuYWxQaXBlKTsKKyAgICBERCgiJXM6IGhvc3Q9JXAgWyVzXSIsIF9fRlVOQ1RJT05fXywgcGlwZSwgcGlwZS0+bmFtZSgpKTsKKyAgICBwaXBlLT5zYXZlVG9TdHJlYW0oYXNCYXNlU3RyZWFtKHN0cmVhbSkpOworfQorCit2b2lkKiBhbmRyb2lkX3BpcGVfZ3Vlc3RfbG9hZChDU3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwRm9yY2VDbG9zZSkgeworICAgIENIRUNLX1ZNX1NUQVRFX0xPQ0soKTsKKyAgICBERCgiJXM6IGh3cGlwZT0lcCIsIF9fRlVOQ1RJT05fXywgaHdQaXBlKTsKKyAgICByZXR1cm4gQW5kcm9pZFBpcGU6OmxvYWRGcm9tU3RyZWFtKGFzQmFzZVN0cmVhbShzdHJlYW0pLCBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9yY2VDbG9zZSk7Cit9CisKK3ZvaWQqIGFuZHJvaWRfcGlwZV9ndWVzdF9sb2FkX2xlZ2FjeShDU3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaHdQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBwQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwV2FrZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcENsb3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwRm9yY2VDbG9zZSkgeworICAgIENIRUNLX1ZNX1NUQVRFX0xPQ0soKTsKKyAgICBERCgiJXM6IGh3cGlwZT0lcCIsIF9fRlVOQ1RJT05fXywgaHdQaXBlKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6QW5kcm9pZFBpcGU6OmxvYWRGcm9tU3RyZWFtTGVnYWN5KGFzQmFzZVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdQaXBlLCBwQ2hhbm5lbCwgcFdha2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsb3NlZCwgcEZvcmNlQ2xvc2UpOworfQorCit1bnNpZ25lZCBhbmRyb2lkX3BpcGVfZ3Vlc3RfcG9sbCh2b2lkKiBpbnRlcm5hbFBpcGUpIHsKKyAgICBDSEVDS19WTV9TVEFURV9MT0NLKCk7CisgICAgYXV0byBwaXBlID0gc3RhdGljX2Nhc3Q8QW5kcm9pZFBpcGUqPihpbnRlcm5hbFBpcGUpOworICAgIEREKCIlczogaG9zdD0lcCBbJXNdIiwgX19GVU5DVElPTl9fLCBwaXBlLCBwaXBlLT5uYW1lKCkpOworICAgIHJldHVybiBwaXBlLT5vbkd1ZXN0UG9sbCgpOworfQorCitpbnQgYW5kcm9pZF9waXBlX2d1ZXN0X3JlY3Yodm9pZCogaW50ZXJuYWxQaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSB7CisgICAgQ0hFQ0tfVk1fU1RBVEVfTE9DSygpOworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PEFuZHJvaWRQaXBlKj4oaW50ZXJuYWxQaXBlKTsKKyAgICByZXR1cm4gcGlwZS0+b25HdWVzdFJlY3YoYnVmZmVycywgbnVtQnVmZmVycyk7Cit9CisKK2ludCBhbmRyb2lkX3BpcGVfZ3Vlc3Rfc2VuZCh2b2lkKiBpbnRlcm5hbFBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBDSEVDS19WTV9TVEFURV9MT0NLKCk7CisgICAgYXV0byBwaXBlID0gc3RhdGljX2Nhc3Q8QW5kcm9pZFBpcGUqPihpbnRlcm5hbFBpcGUpOworICAgIHJldHVybiBwaXBlLT5vbkd1ZXN0U2VuZChidWZmZXJzLCBudW1CdWZmZXJzKTsKK30KKwordm9pZCBhbmRyb2lkX3BpcGVfZ3Vlc3Rfd2FrZV9vbih2b2lkKiBpbnRlcm5hbFBpcGUsIHVuc2lnbmVkIHdha2VzKSB7CisgICAgQ0hFQ0tfVk1fU1RBVEVfTE9DSygpOworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PEFuZHJvaWRQaXBlKj4oaW50ZXJuYWxQaXBlKTsKKyAgICBwaXBlLT5vbkd1ZXN0V2FudFdha2VPbih3YWtlcyk7Cit9CisKKy8vIEFQSSBpbXBsZW1lbnRlZCBieSB0aGUgdmlydHVhbCBkZXZpY2UuCit2b2lkIGFuZHJvaWRfcGlwZV9ob3N0X2Nsb3NlKHZvaWQqIGh3cGlwZSkgeworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PGFuZHJvaWQ6OkFuZHJvaWRQaXBlKj4oaHdwaXBlKTsKKyAgICBEKCIlczogaG9zdD0lcCBbJXNdIiwgX19GVU5DVElPTl9fLCBwaXBlLCBwaXBlLT5uYW1lKCkpOworICAgIGFuZHJvaWQ6OnNHbG9iYWxzLT5waXBlV2FrZXIuY2xvc2VGcm9tSG9zdChwaXBlKTsKK30KKwordm9pZCBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZSh2b2lkKiBod3BpcGUsIHVuc2lnbmVkIGZsYWdzKSB7CisgICAgYW5kcm9pZDo6c0dsb2JhbHMtPnBpcGVXYWtlci5zaWduYWxXYWtlKGh3cGlwZSwgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjhhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0FuZHJvaWRQaXBlLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQW5kcm9pZFBpcGUgaXMgYSBtb3N0bHktYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgQW5kcm9pZCBwaXBlIGNvbm5lY3Rpb25zLgorLy8gSXQncyBpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCB0aGF0IG1vc3QgcGlwZSBvcGVyYXRpb25zIChvbkd1ZXN0WFhYIG1ldGhvZHMpCisvLyBhcmUgcGVyZm9ybWVkIHdpdGggdGhlIGdsb2JhbCBWTSBsb2NrIGhlbGQuCisvLworLy8gLSBRRU1VMSBydW5zIGFsbCBDUFUtcmVsYXRlZCBvcGVyYXRpb25zIGFuZCBhbGwgdGltZXJzL2lvIGV2ZW50cyBvbiBpdHMKKy8vICAgbWFpbiBsb29wLiBUaGlzIHdpbGwgYmUgcmVmZXJyZWQgYXMgdGhlICdkZXZpY2UgdGhyZWFkJyBoZXJlLgorLy8KKy8vIC0gUUVNVTIgaGFzIGRlZGljYXRlZCBDUFUgdGhyZWFkcyB0byBydW4gZ3Vlc3QgcmVhZC93cml0ZSBvcGVyYXRpb25zIGFuZAorLy8gICBhIGRpZmZlcmVudCBtYWluLWxvb3AgdGhyZWFkIHRvIHJ1biB0aW1lcnMsIGNoZWNrIGZvciBwZW5kaW5nIGhvc3QgSS9PLgorLy8gICBJdCB1c2VzIGEgZ2xvYmFsIGxvY2sgdGhhdCBpcyBoZWxkIGV2ZXJ5IHRpbWUgdmlydHVhbCBkZXZpY2Ugb3BlcmF0aW9ucworLy8gICBhcmUgcGVyZm9ybWVkLiBUaGUgJ2RldmljZSB0aHJlYWQnIGlzIHdoaWNoZXZlciBDUFUgdGhyZWFkIGlzIGhvbGRpbmcKKy8vICAgdGhlIGxvY2suCisvLworLy8gSU1QT1JUQU5UOiBNb3N0IEFuZHJvaWRQaXBlIG1ldGhvZHMgbXVzdCBiZSBjYWxsZWQgZnJvbSBhIHRocmVhZCB0aGF0IGhvbGRzCisvLyB0aGUgZ2xvYmFsIFZNIHN0YXRlIGxvY2sgKGkuZS4gd2hlcmUgVm1Mb2NrOjppc0xvY2tlZEJ5U2VsZigpIGlzIHRydWUpLgorLy8gRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBpbmNvcnJlY3QgcmVzdWx0cywgYW5kIHBhbmljcyBpbiBkZWJ1ZworLy8gYnVpbGRzLgorLy8KKy8vIEEgZmV3IG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQgdGhvdWdoLCBzZWUgc2lnbmFsV2FrZSgpIGFuZAorLy8gY2xvc2VGcm9tSG9zdCgpLgorLy8KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gMSkgQXQgZW11bGF0aW9uIHNldHVwIHRpbWUgKGkuZS4gYmVmb3JlIHRoZSBWTSBydW5zKSwgY2FsbAorLy8gICAgQW5kcm9pZFBpcGU6OmluaXRUaHJlYWRpbmcoKSBmcm9tIHRoZSBtYWluIGxvb3AgdGhyZWFkIGFuZCBwYXNzIGFuCisvLyAgICBhcHByb3ByaWF0ZSBWbUxvY2sgaW5zdGFuY2UuCisvLworLy8gMikgRm9yIGVhY2ggc3VwcG9ydGVkIHBpcGUgc2VydmljZSwgY3JlYXRlIGEgbmV3IEFuZHJvaWRQaXBlOjpTZXJ2aWNlCisvLyAgICBpbnN0YW5jZSwgYW5kIHJlZ2lzdGVyIGl0IGdsb2JhbGx5IGJ5IGNhbGxpbmcgQW5kcm9pZFBpcGU6OlNlcnZpY2U6OmFkZCgpLgorLy8gICAgVGhpcyBjYW4gaGFwcGVuIGJlZm9yZSAxKSBhbmQgaW4gZGlmZmVyZW50IHRocmVhZHMuCisvLworLy8gMykgT25jZSB0aGUgVk0gc3RhcnRzLCB3aGVuZXZlciBhIGd1ZXN0IHdhbnRzIHRvIGNvbm5lY3QgdG8gYSBzcGVjaWZpYworLy8gICAgbmFtZWQgc2VydmljZSwgaXRzIGluc3RhbmNlJ3MgJ2NyZWF0ZScgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlCisvLyAgICBkZXZpY2UgdGhyZWFkLiBBbHRlcm5hdGl2ZWx5LCB3aGVuIHJlc3VtaW5nIGZyb20gYSBzbmFwc2hvdCwgdGhlICdsb2FkJworLy8gICAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGlmZiAnY2FuTG9hZCgpJyBpcyBvdmVybG9hZGVkIHRvIHJldHVybiB0cnVlLgorLy8KKy8vIDQpIER1cmluZyBwaXBlIG9wZXJhdGlvbnMsIG9uR3Vlc3RYWFgoKSBtZXRob2RzIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlCisvLyAgICBkZXZpY2UgdGhyZWFkIHRvIG9wZXJhdGUgb24gdGhlIHBpcGUuCisvLworLy8gNSkgVGhlIHNpZ25hbFdha2UoKSBhbmQgY2xvc2VGcm9tSG9zdCgpIHBpcGUgbWV0aG9kcyBjYW4gYmUgY2FsbGVkIGZyb20KKy8vICAgIGFueSB0aHJlYWQgdG8gc2lnbmFsIGkvbyBldmVudHMsIG9yIGFzayBmb3IgdGhlIHBpcGUgY2xvc3VyZS4KKy8vCitjbGFzcyBBbmRyb2lkUGlwZSB7CitwdWJsaWM6CisgICAgLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIGluIHRoZSBtYWluIGxvb3AgdGhyZWFkIHRvIGVuc3VyZSBwcm9wZXIgdGhyZWFkaW5nCisgICAgLy8gc3VwcG9ydC4gfHZtTG9ja3wgbXVzdCBiZSBhIHZhbGlkIGFuZHJvaWQ6OlZtTG9jayBpbnN0YW5jZSB0aGF0IHdpbGwgYmUKKyAgICAvLyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjdXJyZW50IHRocmVhZCBob2xkcyB0aGUgZ2xvYmFsIFZNCisgICAgLy8gc3RhdGUgbG9jayBvciBub3QgKGlmIG5vdCwgb3BlcmF0aW9ucyBhcmUgcXVldWVkKS4KKyAgICBzdGF0aWMgdm9pZCBpbml0VGhyZWFkaW5nKFZtTG9jayogdm1Mb2NrKTsKKworICAgIC8vIEEgYmFzZSBjbGFzcyBmb3IgYWxsIEFuZHJvaWRQaXBlIHNlcnZpY2VzLCB3aGljaCBpcyBpbiBjaGFyZ2UKKyAgICAvLyBvZiBjcmVhdGluZyBuZXcgaW5zdGFuY2VzIHdoZW4gYSBndWVzdCBjbGllbnQgY29ubmVjdHMgdG8gdGhlCisgICAgLy8gc2VydmljZS4KKyAgICBjbGFzcyBTZXJ2aWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIEV4cGxpY2l0IGNvbnN0cnVjdG9yLgorICAgICAgICBleHBsaWNpdCBTZXJ2aWNlKGNvbnN0IGNoYXIqIG5hbWUpIDogbU5hbWUobmFtZSkge30KKworICAgICAgICAvLyBEZWZhdWx0IGRlc3RydWN0b3IuCisgICAgICAgIHZpcnR1YWwgflNlcnZpY2UoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gUmV0dXJuIHNlcnZpY2UgbmFtZS4KKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwaXBlIGluc3RhbmNlLiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBndWVzdAorICAgICAgICAvLyBjbGllbnQgY29ubmVjdHMgdG8gdGhlIHNlcnZpY2UgaWRlbnRpZmllZCBieSBpdHMgcmVnaXN0cmF0aW9uCisgICAgICAgIC8vIG5hbWUgKHNlZSBhZGQoKSBiZWxvdykuIHxod1BpcGV8IGlzIHRoZSBoYXJkd2FyZS1zaWRlCisgICAgICAgIC8vIHZpZXcgb2YgdGhlIHBpcGUsIGFuZCB8YXJnc3wgcG90ZW50aWFsIGFyZ3VtZW50cy4gTXVzdAorICAgICAgICAvLyByZXR1cm4gbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgICAgdmlydHVhbCBBbmRyb2lkUGlwZSogY3JlYXRlKHZvaWQqIGh3UGlwZSwgY29uc3QgY2hhciogYXJncykgPSAwOworCisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBsb2FkaW5nIHBpcGUgaW5zdGFuY2VzIGZyb20gYSBzdHJlYW0gaXMKKyAgICAgICAgLy8gc3VwcG9ydGVkLiBJZiB0cnVlLCB0aGUgbG9hZCgpIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB0byBsb2FkCisgICAgICAgIC8vIGV2ZXJ5IHBpcGUgaW5zdGFuY2Ugc3RhdGUgZnJvbSB0aGUgc3RyZWFtLCBpZiBmYWxzZSwgdGhlCisgICAgICAgIC8vIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGxvYWRlZCwgYW5kIHRoZSBndWVzdCBwaXBlIGNoYW5uZWxzIHdpbGwKKyAgICAgICAgLy8gYmUgZm9yY2UtY2xvc2VkIGluc3RlYWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMKKyAgICAgICAgLy8gZmFsc2UuCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5Mb2FkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICAvLyBMb2FkIGEgcGlwZSBpbnN0YW5jZSBmcm9tIGlucHV0IHxzdHJlYW18LiBPbmx5IGNhbGxlZCBpZgorICAgICAgICAvLyBjYW5Mb2FkKCkgcmV0dXJucyB0cnVlLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbHB0cgorICAgICAgICAvLyB0byBpbmRpY2F0ZSBhbiBlcnJvciBsb2FkaW5nIHRoZSBpbnN0YW5jZS4KKyAgICAgICAgdmlydHVhbCBBbmRyb2lkUGlwZSogbG9hZCh2b2lkKiBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdpc3RlciBhIG5ldyB8c2VydmljZXwgaW5zdGFuY2UuIEFmdGVyIHRoZSBjYWxsLCB0aGUgb2JqZWN0CisgICAgICAgIC8vIGlzIG93bmVkIGJ5IHRoZSBnbG9iYWwgc2VydmljZSBtYW5hZ2VyLCBhbmQgd2lsbCBiZSBkZXN0cm95ZWQKKyAgICAgICAgLy8gd2hlbiByZXNldEFsbCgpIGlzIGNhbGxlZC4KKyAgICAgICAgc3RhdGljIHZvaWQgYWRkKFNlcnZpY2UqIHNlcnZpY2UpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgc2VydmljZXMuIFVzZWZ1bCBhdCB0aGUgc3RhcnQgYW5kCisgICAgICAgIC8vIGVuZCBvZiBhIHVuaXQtdGVzdC4KKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXRBbGwoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gTm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgICAgU2VydmljZSgpID0gZGVsZXRlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIH07CisKKyAgICAvLyBEZWZhdWx0IGRlc3RydWN0b3IuCisgICAgdmlydHVhbCB+QW5kcm9pZFBpcGUoKTsKKworICAgIC8vIENhbGxlZCBmcm9tIHRoZSBkZXZpY2UgdGhyZWFkIHRvIGNsb3NlIHRoZSBwaXBlIGVudGlyZWx5LgorICAgIC8vIFRoZSBwaXBlIG1hbmFnZW1lbnQgY29kZSB3aWxsIG5ldmVyIGFjY2VzcyB0aGUgaW5zdGFuY2UgYWZ0ZXIgdGhpcyBjYWxsLAorICAgIC8vIHdoaWNoIG1lYW5zIHRoZSBtZXRob2QgaXMgZnJlZSB0byBkZWxldGUgaXQgYmVmb3JlIHJldHVybmluZy4KKyAgICB2aXJ0dWFsIHZvaWQgb25HdWVzdENsb3NlKCkgPSAwOworCisgICAgLy8gQ2FsbGVkIGZyb20gdGhlIGRldmljZSB0aHJlYWQgdG8gcG9sbCB0aGUgcGlwZSBzdGF0ZS4gTXVzdCByZXR1cm4gYQorICAgIC8vIGNvbWJpbmF0aW9uIG9mIFBJUEVfUE9MTF9JTiwgUElQRV9QT0xMX09VVCBhbmQgUElQRV9QT0xMX0hVUC4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIG9uR3Vlc3RQb2xsKCkgY29uc3QgPSAwOworCisgICAgLy8gQ2FsbGVkIGZyb20gdGhlIGRldmljZSB0aHJlYWQgd2hlbiB0aGUgZ3Vlc3Qgd2FudHMgdG8gcmVjZWl2ZSBkYXRhCisgICAgLy8gZnJvbSB0aGUgcGlwZS4gfGJ1ZmZlcnN8IHBvaW50cyB0byBhbiBhcnJheSBvZiB8bnVtQnVmZmVyc3wgZGVzY3JpcHRvcnMKKyAgICAvLyB0aGF0IHNwZWNpZnkgd2hlcmUgdG8gY29weSB0aGUgZGF0YSB0by4gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAgIC8vIHdlcmUgYWN0dWFsbHkgdHJhbnNmZXJyZWQsIDAgZm9yIEVPRiBzdGF0dXMsIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAgICAvLyB2YWx1ZSBvdGhlcndpc2UsIGluY2x1ZGluZyBQSVBFX0VSUk9SX0FHQUlOIHdoaWNoIGluZGljYXRlcyB0aGVyZQorICAgIC8vIGlzIG5vIGRhdGEgeWV0IHRvIHJlYWQuCisgICAgdmlydHVhbCBpbnQgb25HdWVzdFJlY3YoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgZnJvbSB0aGUgZGV2aWNlIHRocmVhZCB3aGVuIHRoZSBndWVzdCB3YW50cyB0byBzZW5kIGRhdGEgdG8KKyAgICAvLyB0aGUgcGlwZS4gfGJ1ZmZlcnN8IHBvaW50cyB0byBhbiBhcnJheSBvZiB8bnVtQnVmZmVyc3wgZGVzY3JpcHRvcnMgdGhhdAorICAgIC8vIHNwZWNpZnkgd2hlcmUgdG8gY29weSB0aGUgZGF0YSBmcm9tLiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0CisgICAgLy8gd2VyZSBhY3R1YWxseSB0cmFuc2ZlcnJlZCwgMCBmb3IgRU9GIHN0YXR1cywgb3IgYSBuZWdhdGl2ZSBlcnJvcgorICAgIC8vIHZhbHVlIG90aGVyd2lzZSwgaW5jbHVkaW5nIFBJUEVfRVJST1JfQUdBSU4gd2hpY2ggaW5kaWNhdGVzIHRoZSBwaXBlCisgICAgLy8gaXMgbm90IHJlYWR5IHRvIHJlY2VpdmUgYW55IGRhdGEgeWV0LgorICAgIHZpcnR1YWwgaW50IG9uR3Vlc3RTZW5kKGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgZnJvbSB0aGUgZGV2aWNlIHRocmVhZCB3aGVuIHRoZSBndWVzdCB3YW50cyB0byBpbmRpY2F0ZSBpdAorICAgIC8vIHdhbnRzIHRvIGJlIHdva2VuIHVwIHdoZW4gdGhlIHNldCBvZiBQSVBFX1dBS0VfWFhYIGV2ZW50IGJpdHMgaW4gfGZsYWdzfAorICAgIC8vIHdpbGwgb2NjdXIuIFRoZSBwaXBlIGltcGxlbWVudGF0aW9uIHNob3VsZCBjYWxsIHRoZSB3YWtlKCkgbWV0aG9kIHRvCisgICAgLy8gc2lnbmFsIHRoZSBndWVzdC4KKyAgICB2aXJ0dWFsIHZvaWQgb25HdWVzdFdhbnRXYWtlT24oaW50IGZsYWdzKSA9IDA7CisKKyAgICAvLyBDYWxsZWQgdG8gc2F2ZSB0aGUgcGlwZSBzdGF0ZSB0byBhIHxzdHJlYW18LCBpLmUuIHdoZW4gc2F2aW5nIHNuYXBzaG90cy4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBuZXZlciBjYWxsZWQgaWYgdGhlIHNlcnZpY2UncyBjYW5Mb2FkKCkgbWV0aG9kIHJldHVybnMKKyAgICAvLyBmYWxzZS4gVE9ETyhkaWdpdCk6IElzIHRoaXMgYWx3YXlzIGNhbGxlZCBmcm9tIHRoZSBkZXZpY2UgdGhyZWFkPworICAgIHZpcnR1YWwgdm9pZCBvblNhdmUoYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pe307CisKKyAgICAvLyBNZXRob2QgdXNlZCB0byBzaWduYWwgdGhlIGd1ZXN0IHRoYXQgdGhlIGV2ZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIC8vIFBJUEVfV0FLRV9YWFggYml0cyBpbiB8ZmxhZ3N8IG9jY3VycmVkLiBOT1RFOiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbQorICAgIC8vIGFueSB0aHJlYWQuCisgICAgdm9pZCBzaWduYWxXYWtlKGludCBmbGFncyk7CisKKyAgICAvLyBNZXRob2QgdXNlZCB0byBzaWduYWwgdGhlIGd1ZXN0IHRoYXQgdGhlIHBpcGUgaW5zdGFuY2Ugd2FudHMgdG8gY2xvc2UKKyAgICAvLyB0aGUgcGlwZS4gTk9URTogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KKyAgICB2b2lkIGNsb3NlRnJvbUhvc3QoKTsKKworICAgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQW5kcm9pZFBpcGUgc2VydmljZS4KKyAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNlcnZpY2UgPyBtU2VydmljZS0+bmFtZSgpLmNfc3RyKCkgOiAiPG51bGw+IjsKKyAgICB9CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscy4gVGhleSBhcmUgaW4gdGhlCisgICAgLy8gcHVibGljIHNjb3BlIHRvIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWRfcGlwZV9ndWVzdF9zYXZlKCkKKyAgICAvLyBhbmQgYW5kcm9pZF9waXBlX2d1ZXN0X2xvYWQoKSBlYXNpZXIuIERPIE5PVCBDQUxMIFRIRU0gRElSRUNUTFkuCisKKyAgICAvLyBTYXZlIGFuIEFuZHJvaWRQaXBlIGluc3RhbmNlIHN0YXRlIHRvIGEgZmlsZSB8c3RyZWFtfC4KKyAgICB2b2lkIHNhdmVUb1N0cmVhbShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSk7CisKKyAgICAvLyBMb2FkIGFuIEFuZHJvaWRQaXBlIGluc3RhbmNlIGZyb20gaXRzIHNhdmVkIHN0YXRlIGZyb20gfHN0cmVhbXwuCisgICAgLy8gfGh3UGlwZXwgaXMgdGhlIGhhcmR3YXJlLXNpZGUgdmlldyBvZiB0aGUgcGlwZS4gT24gc3VjY2VzcywgcmV0dXJuCisgICAgLy8gYSBuZXcgaW5zdGFuY2UgcG9pbnRlciBhbmQgc2V0cyB8KnBGb3JjZUNsb3NlfCB0byAwIG9yIDEuIEEgdmFsdWUKKyAgICAvLyBvZiAxIG1lYW5zIHRoYXQgdGhlIGd1ZXN0IHBpcGUgY29ubmVjdGlvbiBzaG91bGQgYmUgZm9yY2libHkgY2xvc2VkCisgICAgLy8gYmVjYXVzZSB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBhbGxvdyB0aGUgc3RhdGUgdG8gYmUgc2F2ZWQvbG9hZGVkCisgICAgLy8gKGUuZy4gbmV0d29yayBwaXBlcykuCisgICAgc3RhdGljIEFuZHJvaWRQaXBlKiBsb2FkRnJvbVN0cmVhbShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh3UGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHBGb3JjZUNsb3NlKTsKKworICAgIC8vIEEgdmFyaWFudCBvZiBsb2FkRnJvbVN0cmVhbSgpIHRoYXQgaXMgb25seSB1c2VkIHRvIHN1cHBvcnQgbGVnYWN5CisgICAgLy8gc25hcHNob3QgZm9ybWF0IGZvciBwaXBlcy4gT24gc3VjY2Vzcywgc2V0cyB8KnBDaGFubmVsfCwgfCpwV2FrZXN8IGFuZAorICAgIC8vIHwqcENsb3NlZHwsIGFzIHdlbGwgYXMgfCpwRm9yY2VDbG9zZXwuIE9ubHkgdXNlZCBieSB0aGUgUUVNVTEgdmlydHVhbAorICAgIC8vIHBpcGUgZGV2aWNlLCBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgICAgc3RhdGljIEFuZHJvaWRQaXBlKiBsb2FkRnJvbVN0cmVhbUxlZ2FjeShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh3UGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBwQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBXYWtlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBDbG9zZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBwRm9yY2VDbG9zZSk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBObyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIEFuZHJvaWRQaXBlKCkgPSBkZWxldGU7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB1c2VkIGJ5IGRlcml2ZWQgY2xhc3NlcyBvbmx5LgorICAgIEFuZHJvaWRQaXBlKHZvaWQqIGh3UGlwZSwgU2VydmljZSogc2VydmljZSkKKyAgICAgICAgOiBtSHdQaXBlKGh3UGlwZSksIG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICB2b2lkKiBtSHdQaXBlID0gbnVsbHB0cjsKKyAgICBTZXJ2aWNlKiBtU2VydmljZSA9IG51bGxwdHI7CisgICAgc3RkOjpzdHJpbmcgbUFyZ3M7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9DbGlwYm9hcmRQaXBlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ2xpcGJvYXJkUGlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5MTI4MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ2xpcGJvYXJkUGlwZS5jcHAKQEAgLTAsMCArMSwyMzUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ2xpcGJvYXJkUGlwZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NsaXBib2FyZC1waXBlLmgiCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworc3RhdGljIGNvbnN0IGF1dG8gZW1wdHlDYWxsYmFjayA9IFtdKGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpIHt9OworCisvLyBBIHN0b3JhZ2UgZm9yIHRoZSBjdXJyZW50IGNsaXBib2FyZCBwaXBlIGluc3RhbmNlIGRhdGEuCisvLyBTaGFyZWQgcG9pbnRlciBpcyByZXF1aXJlZCBhcyB0aGVyZSBhcmUgcG90ZW50aWFsIHJhY2VzIGJldHdlZW4gY2xpcGJvYXJkCisvLyBkYXRhIGNoYW5naW5nIGZyb20gdGhlIGhvc3QgYW5kIGd1ZXN0J3MgcmVxdWVzdCB0byBjbG9zZSB0aGUgcGlwZS4gV2UgbmVlZAorLy8gdG8ga2VlcCB0aGUgb2JqZWN0IGFsaXZlIGlmIHdlJ3ZlIHN0YXJ0ZWQgc29tZSBvcGVyYXRpb24uCitzdHJ1Y3QgQ2xpcGJvYXJkUGlwZUluc3RhbmNlIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpMb2NrIHBpcGVMb2NrOworICAgIENsaXBib2FyZFBpcGU6OlB0ciBwaXBlOworCisgICAgQ2xpcGJvYXJkUGlwZTo6R3Vlc3RDbGlwYm9hcmRDYWxsYmFjayBndWVzdENsaXBib2FyZENhbGxiYWNrID0KKyAgICAgICAgICAgIGVtcHR5Q2FsbGJhY2s7Cit9OworCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPENsaXBib2FyZFBpcGVJbnN0YW5jZT4gc0luc3RhbmNlID0ge307CisKK0NsaXBib2FyZFBpcGU6OkNsaXBib2FyZFBpcGUodm9pZCogaHdQaXBlLCBTZXJ2aWNlKiBzdmMpCisgICAgOiBBbmRyb2lkUGlwZShod1BpcGUsIHN2Yykge30KKwordm9pZCBDbGlwYm9hcmRQaXBlOjpvbkd1ZXN0Q2xvc2UoKSB7CisgICAgQ2xpcGJvYXJkUGlwZTo6U2VydmljZTo6Y2xvc2VQaXBlKCk7Cit9CisKK3Vuc2lnbmVkIENsaXBib2FyZFBpcGU6Om9uR3Vlc3RQb2xsKCkgY29uc3QgeworICAgIHVuc2lnbmVkIHJlc3VsdCA9IFBJUEVfUE9MTF9PVVQ7CisgICAgaWYgKG1Ib3N0Q2xpcGJvYXJkSGFzTmV3RGF0YSkgeworICAgICAgICByZXN1bHQgfD0gUElQRV9QT0xMX0lOOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgQ2xpcGJvYXJkUGlwZTo6cHJvY2Vzc09wZXJhdGlvbihPcGVyYXRpb25UeXBlIG9wVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRXcml0ZVN0YXRlKiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBwaXBlQnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1QaXBlQnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG9wQ29tcGxldGUpIHsKKyAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBiZSByZWFkIGZyb20gb3Igd3JpdHRlbgorICAgIC8vIHRvIHRoZSBwaXBlLgorICAgIHVpbnQzMl90IHJlcXVpcmVkQnl0ZXMgPSBzdGF0ZS0+c2l6ZVByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhdGUtPnJlcXVpcmVkQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNpemVvZihzdGF0ZS0+cmVxdWlyZWRCeXRlcyk7CisKKyAgICAvLyBUaGlzIHdpbGwgcG9pbnQgdG8gdGhlIGJ1ZmZlciB0byBiZSByZWFkIGZyb20uCisgICAgY29uc3QgdWludDhfdCogc291cmNlQnVmZmVyID0gbnVsbHB0cjsKKworICAgIC8vIFRoaXMgd2lsbCBwb2ludCB0byB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50by4KKyAgICB1aW50OF90KiB0YXJnZXRCdWZmZXIgPSBudWxscHRyOworCisgICAgY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIHBpcGVCdWZmZXIgPSBwaXBlQnVmZmVyczsKKyAgICBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogZW5kUGlwZUJ1ZmZlciA9IHBpcGVCdWZmZXIgKyBudW1QaXBlQnVmZmVyczsKKworICAgIC8vIFRoaXMgd2lsbCBjb250YWluIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIChudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyByZWFkIG9yIHdyaXR0ZW4pLgorICAgIGludCB0b3RhbEJ5dGVzUHJvY2Vzc2VkID0gMDsKKworICAgIC8vIEluZGljYXRlcyB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGlwZSBidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcKKyAgICAvLyBwcm9jZXNzZWQuCisgICAgc2l6ZV90IHBpcGVCdWZmZXJPZmZzZXQgPSAwOworCisgICAgKm9wQ29tcGxldGUgPSBmYWxzZTsKKworICAgIGlmIChvcFR5cGUgPT0gT3BlcmF0aW9uVHlwZTo6V3JpdGVUb0d1ZXN0Q2xpcGJvYXJkKSB7CisgICAgICAgIC8vIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIGd1ZXN0IGNsaXBib2FyZCwgdGhlbiB0aGUgc291cmNlCisgICAgICAgIC8vIGJ1ZmZlciBpcyBzdGF0ZS5idWZmZXIgKG9yIHN0YXRlLnJlcXVpcmVkQnl0ZXMsIGlmIHdlIGhhdmVuJ3QKKyAgICAgICAgLy8gc2VudCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgeWV0KS4KKyAgICAgICAgc291cmNlQnVmZmVyID0KKyAgICAgICAgICAgICAgICBzdGF0ZS0+c2l6ZVByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGF0ZS0+YnVmZmVyLmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmKHN0YXRlLT5yZXF1aXJlZEJ5dGVzKSk7CisgICAgfSBlbHNlIGlmIChvcFR5cGUgPT0gT3BlcmF0aW9uVHlwZTo6UmVhZEZyb21HdWVzdENsaXBib2FyZCkgeworICAgICAgICAvLyBJZiB3ZSdyZSByZWFkaW5nIGZyb20gdGhlIGd1ZXN0IGNsaXBib2FyZCwgdGhlIHRhcmdldCBidWZmZXIKKyAgICAgICAgLy8gaXMgdGhlIHN0YXRlJ3MgYnVmZmVyIChvciBzdGF0ZS5yZXF1aXJlZEJ5dGVzLCBpZiB3ZSBoYXZlbid0CisgICAgICAgIC8vIHJlYWQgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHlldCkuCisgICAgICAgIHRhcmdldEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgc3RhdGUtPnNpemVQcm9jZXNzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhdGUtPmJ1ZmZlci5kYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJihzdGF0ZS0+cmVxdWlyZWRCeXRlcykpOworICAgIH0KKworICAgIHdoaWxlIChwaXBlQnVmZmVyICE9IGVuZFBpcGVCdWZmZXIpIHsKKyAgICAgICAgLy8gRGVjaWRlIGhvdyBtYW55IGJ5dGVzIG5lZWQgdG8gYmUgcmVhZC93cml0dGVuIGR1cmluZyB0aGUgY3VycmVudAorICAgICAgICAvLyBpdGVyYXRpb24uCisgICAgICAgIGludCBieXRlc1RvUHJvY2VzcyA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgIHJlcXVpcmVkQnl0ZXMgLSBzdGF0ZS0+cHJvY2Vzc2VkQnl0ZXMsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBpcGVCdWZmZXItPnNpemUgLSBwaXBlQnVmZmVyT2Zmc2V0KSk7CisKKyAgICAgICAgaWYgKG9wVHlwZSA9PSBPcGVyYXRpb25UeXBlOjpXcml0ZVRvR3Vlc3RDbGlwYm9hcmQpIHsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgaXMgb2sgaGVyZSBzaW5jZSB0aGUgY29udGVudHMgb2YgQW5kcm9pZFBpcGVCdWZmZXIKKyAgICAgICAgICAgIC8vIHBhc3NlZCBpbnRvIHRoZSBmdW5jdGlvbiB3ZXJlIGludGVuZGVkIHRvIGJlIGNoYW5nZWQuCisgICAgICAgICAgICB0YXJnZXRCdWZmZXIgPQorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihwaXBlQnVmZmVyLT5kYXRhKSArIHBpcGVCdWZmZXJPZmZzZXQ7CisgICAgICAgICAgICBtZW1jcHkodGFyZ2V0QnVmZmVyLCBzb3VyY2VCdWZmZXIgKyBzdGF0ZS0+cHJvY2Vzc2VkQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgYnl0ZXNUb1Byb2Nlc3MpOworICAgICAgICB9IGVsc2UgaWYgKG9wVHlwZSA9PSBPcGVyYXRpb25UeXBlOjpSZWFkRnJvbUd1ZXN0Q2xpcGJvYXJkKSB7CisgICAgICAgICAgICBzb3VyY2VCdWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4ocGlwZUJ1ZmZlci0+ZGF0YSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZUJ1ZmZlck9mZnNldDsKKyAgICAgICAgICAgIG1lbWNweSh0YXJnZXRCdWZmZXIgKyBzdGF0ZS0+cHJvY2Vzc2VkQnl0ZXMsIHNvdXJjZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBieXRlc1RvUHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnByb2Nlc3NlZEJ5dGVzICs9IGJ5dGVzVG9Qcm9jZXNzOworICAgICAgICB0b3RhbEJ5dGVzUHJvY2Vzc2VkICs9IGJ5dGVzVG9Qcm9jZXNzOworICAgICAgICBwaXBlQnVmZmVyT2Zmc2V0ICs9IGJ5dGVzVG9Qcm9jZXNzOworICAgICAgICBpZiAocGlwZUJ1ZmZlck9mZnNldCA+PSBwaXBlQnVmZmVyLT5zaXplKSB7CisgICAgICAgICAgICArK3BpcGVCdWZmZXI7CisgICAgICAgICAgICBwaXBlQnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZS0+cHJvY2Vzc2VkQnl0ZXMgPT0gcmVxdWlyZWRCeXRlcyAmJiAhc3RhdGUtPnNpemVQcm9jZXNzZWQpIHsKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgZWl0aGVyIHNlbnQgb3IgcmVjZWl2ZWQgdGhlIGxlbmd0aCBvZiBjbGlwYm9hcmQgZGF0YQorICAgICAgICAgICAgLy8gaW4gYnl0ZXMuIE5vdyBpdCBpcyB0aW1lIHRvIHNlbmQvcmVjZWl2ZSB0aGUgYnVmZmVyIGl0c2VsZi4KKyAgICAgICAgICAgIHN0YXRlLT5zaXplUHJvY2Vzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0YXRlLT5wcm9jZXNzZWRCeXRlcyA9IDA7CisgICAgICAgICAgICByZXF1aXJlZEJ5dGVzID0gc3RhdGUtPnJlcXVpcmVkQnl0ZXM7CisgICAgICAgICAgICBpZiAob3BUeXBlID09IE9wZXJhdGlvblR5cGU6OlJlYWRGcm9tR3Vlc3RDbGlwYm9hcmQpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSByZWFkaW5nIGZyb20gZ3Vlc3QgY2xpcGJvYXJkLAorICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIG9uIG91ciBzaWRlIGhhcyBlbm91Z2ggc3BhY2UuCisgICAgICAgICAgICAgICAgc3RhdGUtPmJ1ZmZlci5yZXNpemUoc3RhdGUtPnJlcXVpcmVkQnl0ZXMpOworCisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5leHQgaXRlcmF0aW9ucyB3cml0ZSB0byBzdGF0ZSdzIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICB0YXJnZXRCdWZmZXIgPSBzdGF0ZS0+YnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3BUeXBlID09IE9wZXJhdGlvblR5cGU6OldyaXRlVG9HdWVzdENsaXBib2FyZCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIGd1ZXN0IGNsaXBib2FyZCwganVzdAorICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBuZXh0IGl0ZXJhdGlvbnMgcmVhZCBmcm9tIHN0YXRlJ3MgYnVmZmVyLgorICAgICAgICAgICAgICAgIHNvdXJjZUJ1ZmZlciA9IHN0YXRlLT5idWZmZXIuZGF0YSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0ZS0+cHJvY2Vzc2VkQnl0ZXMgPT0gc3RhdGUtPnJlcXVpcmVkQnl0ZXMgJiYgc3RhdGUtPnNpemVQcm9jZXNzZWQpIHsKKyAgICAgICAgKm9wQ29tcGxldGUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdG90YWxCeXRlc1Byb2Nlc3NlZDsKK30KKworaW50IENsaXBib2FyZFBpcGU6Om9uR3Vlc3RSZWN2KEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgbnVtQnVmZmVycykgeworICAgIGludCByZXN1bHQgPSBQSVBFX0VSUk9SX0FHQUlOOworICAgIGlmIChtSG9zdENsaXBib2FyZEhhc05ld0RhdGEpIHsKKyAgICAgICAgYm9vbCBvcENvbXBsZXRlID0gZmFsc2U7CisgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NPcGVyYXRpb24oT3BlcmF0aW9uVHlwZTo6V3JpdGVUb0d1ZXN0Q2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3Vlc3RDbGlwYm9hcmRXcml0ZVN0YXRlLCBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnMsICZvcENvbXBsZXRlKTsKKyAgICAgICAgaWYgKG9wQ29tcGxldGUpIHsKKyAgICAgICAgICAgIG1Ib3N0Q2xpcGJvYXJkSGFzTmV3RGF0YSA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBDbGlwYm9hcmRQaXBlOjpvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgeworICAgIGJvb2wgb3BDb21wbGV0ZSA9IGZhbHNlOworICAgIGludCByZXN1bHQgPSBwcm9jZXNzT3BlcmF0aW9uKE9wZXJhdGlvblR5cGU6OlJlYWRGcm9tR3Vlc3RDbGlwYm9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1HdWVzdENsaXBib2FyZFJlYWRTdGF0ZSwgYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJzLCAmb3BDb21wbGV0ZSk7CisgICAgaWYgKG9wQ29tcGxldGUpIHsKKyAgICAgICAgc0luc3RhbmNlLT5ndWVzdENsaXBib2FyZENhbGxiYWNrKAorICAgICAgICAgICAgICAgIG1HdWVzdENsaXBib2FyZFJlYWRTdGF0ZS5idWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgIG1HdWVzdENsaXBib2FyZFJlYWRTdGF0ZS5wcm9jZXNzZWRCeXRlcyk7CisgICAgICAgIG1HdWVzdENsaXBib2FyZFJlYWRTdGF0ZS5zaXplUHJvY2Vzc2VkID0gZmFsc2U7CisgICAgICAgIG1HdWVzdENsaXBib2FyZFJlYWRTdGF0ZS5yZXF1aXJlZEJ5dGVzID0gMDsKKyAgICAgICAgbUd1ZXN0Q2xpcGJvYXJkUmVhZFN0YXRlLnByb2Nlc3NlZEJ5dGVzID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCByZWdpc3RlckNsaXBib2FyZFBpcGVTZXJ2aWNlKCkgeworICAgIGFuZHJvaWQ6OkFuZHJvaWRQaXBlOjpTZXJ2aWNlOjphZGQobmV3IENsaXBib2FyZFBpcGU6OlNlcnZpY2UoKSk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkUGlwZTo6c2V0R3Vlc3RDbGlwYm9hcmRDYWxsYmFjaygKKyAgICAgICAgQ2xpcGJvYXJkUGlwZTo6R3Vlc3RDbGlwYm9hcmRDYWxsYmFjayBjYikgeworICAgIHNJbnN0YW5jZS0+Z3Vlc3RDbGlwYm9hcmRDYWxsYmFjayA9IGNiID8gY2IgOiBlbXB0eUNhbGxiYWNrOworfQorCit2b2lkIENsaXBib2FyZFBpcGU6OnNldEd1ZXN0Q2xpcGJvYXJkQ29udGVudHMoY29uc3QgdWludDhfdCogYnVmLCBzaXplX3QgbGVuKSB7CisgICAgbUd1ZXN0Q2xpcGJvYXJkV3JpdGVTdGF0ZS5idWZmZXIuYXNzaWduKGJ1ZiwgYnVmICsgbGVuKTsKKyAgICBtR3Vlc3RDbGlwYm9hcmRXcml0ZVN0YXRlLnNpemVQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICBtR3Vlc3RDbGlwYm9hcmRXcml0ZVN0YXRlLnJlcXVpcmVkQnl0ZXMgPSBsZW47CisgICAgbUd1ZXN0Q2xpcGJvYXJkV3JpdGVTdGF0ZS5wcm9jZXNzZWRCeXRlcyA9IDA7CisgICAgbUhvc3RDbGlwYm9hcmRIYXNOZXdEYXRhID0gdHJ1ZTsKKyAgICBpZiAobVdha2VPblJlYWQpIHsKKyAgICAgICAgc2lnbmFsV2FrZShQSVBFX1dBS0VfUkVBRCk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDbGlwYm9hcmRQaXBlOjpTZXJ2aWNlOjpTZXJ2aWNlKCkgOiBBbmRyb2lkUGlwZTo6U2VydmljZSgiY2xpcGJvYXJkIikge30KKworQW5kcm9pZFBpcGUqIENsaXBib2FyZFBpcGU6OlNlcnZpY2U6OmNyZWF0ZSh2b2lkKiBod1BpcGUsIGNvbnN0IGNoYXIqIGFyZ3MpIHsKKyAgICBjb25zdCBhdXRvIHBpcGUgPSBuZXcgQ2xpcGJvYXJkUGlwZShod1BpcGUsIHRoaXMpOworICAgIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhzSW5zdGFuY2UtPnBpcGVMb2NrKTsKKyAgICAgICAgYXNzZXJ0KCFzSW5zdGFuY2UtPnBpcGUpOworICAgICAgICBzSW5zdGFuY2UtPnBpcGUucmVzZXQocGlwZSk7CisgICAgfQorICAgIHJldHVybiBwaXBlOworfQorCitDbGlwYm9hcmRQaXBlOjpQdHIgQ2xpcGJvYXJkUGlwZTo6U2VydmljZTo6Z2V0UGlwZSgpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBsb2NrKHNJbnN0YW5jZS0+cGlwZUxvY2spOworICAgIHJldHVybiBzSW5zdGFuY2UtPnBpcGU7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkUGlwZTo6U2VydmljZTo6Y2xvc2VQaXBlKCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIGxvY2soc0luc3RhbmNlLT5waXBlTG9jayk7CisgICAgc0luc3RhbmNlLT5waXBlLnJlc2V0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVsYXRpb24KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3ZvaWQgYW5kcm9pZF9pbml0X2NsaXBib2FyZF9waXBlKHZvaWQpIHsKKyAgICBhbmRyb2lkOjplbXVsYXRpb246OnJlZ2lzdGVyQ2xpcGJvYXJkUGlwZVNlcnZpY2UoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ2xpcGJvYXJkUGlwZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9DbGlwYm9hcmRQaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyMGY3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ2xpcGJvYXJkUGlwZS5oCkBAIC0wLDAgKzEsNzggQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworLy8gVGhpcyBpcyBhIHNwZWNpYWwgcGlwZSBmb3IgdXBkYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGd1ZXN0IHN5c3RlbSdzCisvLyBjbGlwYm9hcmQuIFRoZSBvdGhlciBzaWRlIGlzIGNvbm5lY3RlZCB0byBBbmRyb2lkJ3MgY2xpcGJvYXJkIHNlcnZpY2UKKy8vIHRoYXQgaGFzIGJlZW4gcGF0Y2hlZCB0byBsaXN0ZW4gbWVzc2FnZXMgZnJvbSBpdC4KK2NsYXNzIENsaXBib2FyZFBpcGUgZmluYWwgOiBwdWJsaWMgQW5kcm9pZFBpcGUgeworcHVibGljOgorICAgIHVzaW5nIEd1ZXN0Q2xpcGJvYXJkQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgdWludDhfdCosIHNpemVfdCk+OworICAgIHVzaW5nIFB0ciA9IHN0ZDo6c2hhcmVkX3B0cjxDbGlwYm9hcmRQaXBlPjsKKworICAgIGNsYXNzIFNlcnZpY2UgZmluYWwgOiBwdWJsaWMgQW5kcm9pZFBpcGU6OlNlcnZpY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2VydmljZSgpOworICAgICAgICBBbmRyb2lkUGlwZSogY3JlYXRlKHZvaWQqIGh3UGlwZSwgY29uc3QgY2hhciogYXJncykgb3ZlcnJpZGU7CisKKyAgICAgICAgc3RhdGljIENsaXBib2FyZFBpcGU6OlB0ciBnZXRQaXBlKCk7CisgICAgICAgIHN0YXRpYyB2b2lkIGNsb3NlUGlwZSgpOworICAgIH07CisKKyAgICBDbGlwYm9hcmRQaXBlKHZvaWQqIGh3UGlwZSwgU2VydmljZSogc3ZjKTsKKworICAgIHZvaWQgb25HdWVzdENsb3NlKCkgb3ZlcnJpZGU7CisgICAgdW5zaWduZWQgb25HdWVzdFBvbGwoKSBjb25zdCBvdmVycmlkZTsKKyAgICBpbnQgb25HdWVzdFJlY3YoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzKSBvdmVycmlkZTsKKyAgICBpbnQgb25HdWVzdFNlbmQoY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uR3Vlc3RXYW50V2FrZU9uKGludCBmbGFncykgb3ZlcnJpZGUgeworICAgICAgICBtV2FrZU9uUmVhZCA9IChmbGFncyAmIFBJUEVfV0FLRV9SRUFEKSAhPSAwOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHNldEd1ZXN0Q2xpcGJvYXJkQ2FsbGJhY2soR3Vlc3RDbGlwYm9hcmRDYWxsYmFjayBjYik7CisgICAgdm9pZCBzZXRHdWVzdENsaXBib2FyZENvbnRlbnRzKGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IGxlbik7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IFJlYWRXcml0ZVN0YXRlIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyOworICAgICAgICB1aW50MzJfdCByZXF1aXJlZEJ5dGVzID0gMDsKKyAgICAgICAgdWludDMyX3QgcHJvY2Vzc2VkQnl0ZXMgPSAwOworICAgICAgICBib29sIHNpemVQcm9jZXNzZWQgPSBmYWxzZTsKKyAgICB9OworCisgICAgZW51bSBjbGFzcyBPcGVyYXRpb25UeXBlIHsgUmVhZEZyb21HdWVzdENsaXBib2FyZCwgV3JpdGVUb0d1ZXN0Q2xpcGJvYXJkIH07CisKKyAgICBpbnQgcHJvY2Vzc09wZXJhdGlvbihPcGVyYXRpb25UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFdyaXRlU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBwaXBlQnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtUGlwZUJ1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogb3BDb21wbGV0ZSk7CisKKyAgICBSZWFkV3JpdGVTdGF0ZSBtR3Vlc3RDbGlwYm9hcmRSZWFkU3RhdGU7CisgICAgUmVhZFdyaXRlU3RhdGUgbUd1ZXN0Q2xpcGJvYXJkV3JpdGVTdGF0ZTsKKyAgICBib29sIG1Ib3N0Q2xpcGJvYXJkSGFzTmV3RGF0YSA9IGZhbHNlOworICAgIGJvb2wgbVdha2VPblJlYWQgPSBmYWxzZTsKK307CisKK3ZvaWQgcmVnaXN0ZXJDbGlwYm9hcmRQaXBlU2VydmljZSgpOworCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4YmYwYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgOjphbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlNjb3BlZENQdHI7Cit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCkgeworICAgIC8vIE5hbWUgb2YgdGhlIEFuZHJvaWQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgdW5kZXIgJEhPTUUuCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0FuZHJvaWRTdWJEaXJbXSA9ICIuYW5kcm9pZCI7CisgICAgU3lzdGVtKiBzeXN0ZW0gPSBTeXN0ZW06OmdldCgpOworICAgIHN0ZDo6c3RyaW5nIGhvbWUgPSBzeXN0ZW0tPmVudkdldCgiQU5EUk9JRF9FTVVMQVRPUl9IT01FIik7CisgICAgaWYgKGhvbWUuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBob21lOworICAgIH0KKyAgICBob21lID0gc3lzdGVtLT5lbnZHZXQoIkFORFJPSURfU0RLX0hPTUUiKTsKKyAgICBpZiAoaG9tZS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIFBhdGhVdGlsczo6am9pbihob21lLCBrQW5kcm9pZFN1YkRpcik7CisgICAgfQorICAgIGhvbWUgPSBzeXN0ZW0tPmdldEhvbWVEaXJlY3RvcnkoKTsKKyAgICBpZiAoaG9tZS5lbXB0eSgpKSB7CisgICAgICAgIGhvbWUgPSBzeXN0ZW0tPmdldFRlbXBEaXIoKTsKKyAgICAgICAgaWYgKGhvbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaG9tZSA9ICIvdG1wIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUGF0aFV0aWxzOjpqb2luKGhvbWUsIGtBbmRyb2lkU3ViRGlyKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnN0cmluZyBDb25maWdEaXJzOjpnZXRBdmRSb290RGlyZWN0b3J5KCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtBdmRTdWJEaXJbXSA9ICJhdmQiOworICAgIFN5c3RlbSogc3lzdGVtID0gU3lzdGVtOjpnZXQoKTsKKyAgICBzdGQ6OnN0cmluZyBob21lID0gc3lzdGVtLT5lbnZHZXQoIkFORFJPSURfQVZEX0hPTUUiKTsKKyAgICBpZiAoaG9tZS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGhvbWU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IFBhdGhVdGlsczo6am9pbihnZXRVc2VyRGlyZWN0b3J5KCksIGtBdmRTdWJEaXIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgQ29uZmlnRGlyczo6Z2V0U2RrUm9vdERpcmVjdG9yeUJ5RW52KCkgeworICAgIGF1dG8gc3lzdGVtID0gU3lzdGVtOjpnZXQoKTsKKyAgICBzdGQ6OnN0cmluZyBzZGtSb290ID0gc3lzdGVtLT5lbnZHZXQoIkFORFJPSURfU0RLX1JPT1QiKTsKKworICAgIGlmIChzZGtSb290LnNpemUoKSkgeworICAgICAgICAvLyBVbnF1b3RlIGEgcG9zc2libHkgInF1b3RlZCIgcGF0aC4KKyAgICAgICAgaWYgKHNka1Jvb3RbMF0gPT0gJyInKSB7CisgICAgICAgICAgICBhc3NlcnQoc2RrUm9vdFtzZGtSb290LnNpemUoKSAtIDFdID09ICciJyk7CisgICAgICAgICAgICAvLyBzdGQ6OnN0cmluZyBkb2VzIG5vdCBzdXBwb3J0IGFzc2lnbmluZyBhIHBhcnQgb2YgdGhlIHN0cmluZyB0bworICAgICAgICAgICAgLy8gaXRzZWxmLgorICAgICAgICAgICAgYXV0byBjb3B5U2l6ZSA9IHNka1Jvb3Quc2l6ZSgpIC0gMjsKKyAgICAgICAgICAgIFNjb3BlZENQdHI8Y2hhcj4gYnVmKGFuZHJvaWQ6OmJhc2U6OnN0ckR1cChzZGtSb290KSk7CisgICAgICAgICAgICBzZGtSb290LmFzc2lnbihidWYuZ2V0KCkgKyAxLCBjb3B5U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN5c3RlbS0+cGF0aElzRGlyKHNka1Jvb3QpICYmIHN5c3RlbS0+cGF0aENhblJlYWQoc2RrUm9vdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZGtSb290OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCitzdGQ6OnN0cmluZyBDb25maWdEaXJzOjpnZXRTZGtSb290RGlyZWN0b3J5QnlQYXRoKCkgeworICAgIGF1dG8gc3lzdGVtID0gU3lzdGVtOjpnZXQoKTsKKworICAgIGF1dG8gcGFydHMgPSBQYXRoVXRpbHM6OmRlY29tcG9zZShzeXN0ZW0tPmdldExhdW5jaGVyRGlyZWN0b3J5KCkpOworICAgIHBhcnRzLnB1c2hfYmFjaygiLi4iKTsKKyAgICBQYXRoVXRpbHM6OnNpbXBsaWZ5Q29tcG9uZW50cygmcGFydHMpOworCisgICAgc3RkOjpzdHJpbmcgc2RrUm9vdCA9IFBhdGhVdGlsczo6cmVjb21wb3NlKHBhcnRzKTsKKyAgICBpZiAoc3lzdGVtLT5wYXRoSXNEaXIoc2RrUm9vdCkgJiYgc3lzdGVtLT5wYXRoQ2FuUmVhZChzZGtSb290KSkgeworICAgICAgICByZXR1cm4gc2RrUm9vdDsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzdHJpbmcgQ29uZmlnRGlyczo6Z2V0U2RrUm9vdERpcmVjdG9yeSgpIHsKKyAgICBzdGQ6OnN0cmluZyBzZGtSb290ID0gZ2V0U2RrUm9vdERpcmVjdG9yeUJ5RW52KCk7CisgICAgaWYgKCFzZGtSb290LmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHNka1Jvb3Q7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBpbmZlciBmcm9tIHRoZSBwYXRoIG9mIHRoZSBlbXVsYXRvcidzIGJpbmFyeS4KKyAgICByZXR1cm4gZ2V0U2RrUm9vdERpcmVjdG9yeUJ5UGF0aCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM1MTIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmgKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEhlbHBlciBzdHJ1Y3QgdG8gaG9sZCBzdGF0aWMgbWV0aG9kcyByZWxhdGVkIHRvIG1pc2MuIGNvbmZpZ3VyYXRpb24KKy8vIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGVtdWxhdG9yLgorc3RydWN0IENvbmZpZ0RpcnMgeworICAgIC8vIFJldHVybiB0aGUgdXNlci1zcGVjaWZpYyBkaXJlY3RvcnkgY29udGFpbmluZyBBbmRyb2lkLXJlbGF0ZWQKKyAgICAvLyBjb25maWd1cmF0aW9uIGZpbGVzLiBUaGUgZGVmYXVsdCBsb2NhdGlvbiBjYW4gYmUgb3ZlcnJpZGVuOgorICAgIC8vCisgICAgLy8gLSBJZiBBTkRST0lEX0VNVUxBVE9SX0hPTUUgaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQsIGl0cworICAgIC8vICAgdmFsdWUgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICAvLworICAgIC8vIC0gT3RoZXJ3aXNlLCBpZiBBTkRST0lEX1NES19IT01FIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LAorICAgIC8vICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIG9uZSBvZiBpdHMgc3ViLWRpcmVjdG9yaWVzLgorICAgIC8vCisgICAgLy8gLSBPdGhlcndpc2UsIHRoaXMgcmV0dXJucyBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgdXNlcidzIGhvbWUgZGlyLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRVc2VyRGlyZWN0b3J5KCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIHJvb3QgcGF0aCBjb250YWluaW5nIGFsbCBBVkQgc3ViLWRpcmVjdG9yaWVzLgorICAgIC8vIE1vcmUgc3BlY2lmaWNhbGx5OgorICAgIC8vCisgICAgLy8gLSBJZiBBTkRST0lEX0FWRF9IT01FIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCBpdHMgdmFsdWUgaXMKKyAgICAvLyAgIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gLSBPdGhlcndpc2UsIGEgc3ViLWRpcmVjdG9yeSBuYW1lZCAnYXZkJyBvZiBnZXRVc2VyRGlyZWN0b3J5KCkncworICAgIC8vICAgb3V0cHV0IGlzIHJldHVybmVkLgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRBdmRSb290RGlyZWN0b3J5KCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSByb290IG9mIHRoZSBhbmRyb2lkIHNkayBieSBjaGVja2luZyBpZiB0aGUKKyAgICAvLyBBTkRST0lEX1NES19ST09UIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGRlZmluZWQuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFNka1Jvb3REaXJlY3RvcnlCeUVudigpOworCisgICAgLy8gUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgYW5kcm9pZCBzZGsgYnkgaW5mZXJyaW5nIGl0IGZyb20gdGhlCisgICAgLy8gcGF0aCBvZiB0aGUgcnVubmluZyBlbXVsYXRvciBiaW5hcnkuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFNka1Jvb3REaXJlY3RvcnlCeVBhdGgoKTsKKworICAgIC8vIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIGFuZHJvaWQgc2RrLgorICAgIC8vIC0gSWYgQU5EUk9JRF9TREtfUk9PVCBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCBhbmQgdGhlIHBhdGggZXhpc3RzLAorICAgIC8vICAgaXRzIHZhbHVlIGlzIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gLSBPdGhlcndpc2UsIFNkayByb290IGlzIGluZmVycmVkIGZyb20gdGhlIHBhdGggb2YgdGhlIHJ1bm5pbmcgZW11bGF0b3IKKyAgICAvLyAgIGJpbmFyeS4KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0U2RrUm9vdERpcmVjdG9yeSgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlyc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGNkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkNvbmZpZ0RpcnM7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworVEVTVChDb25maWdEaXJzLCBnZXRVc2VyRGlyZWN0b3J5RGVmYXVsdCkgeworICAgIFRlc3RTeXN0ZW0gc3lzKCIvYmluIiwgMzIsICIvbXlob21lIik7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0V4cGVjdGVkW10gPQorI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgIi9teWhvbWVcXC5hbmRyb2lkIjsKKyNlbHNlCisgICAgICAgICAgICAiL215aG9tZS8uYW5kcm9pZCI7CisjZW5kaWYKKyAgICBFWFBFQ1RfU1RSRVEoa0V4cGVjdGVkLCBDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCkuY19zdHIoKSk7Cit9CisKK1RFU1QoQ29uZmlnRGlycywgZ2V0VXNlckRpcmVjdG9yeVdpdGhBbmRyb2lkU2RrSG9tZSkgeworICAgIFRlc3RTeXN0ZW0gc3lzKCIvYmluIiwgMzIsICIvbXlob21lIik7CisgICAgc3lzLmVudlNldCgiQU5EUk9JRF9TREtfSE9NRSIsICIvYW5kcm9pZC1zZGsiKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRbXSA9CisjaWZkZWYgX1dJTjMyCisgICAgICAgICAgICAiL2FuZHJvaWQtc2RrXFwuYW5kcm9pZCI7CisjZWxzZQorICAgICAgICAgICAgIi9hbmRyb2lkLXNkay8uYW5kcm9pZCI7CisjZW5kaWYKKyAgICBFWFBFQ1RfU1RSRVEoa0V4cGVjdGVkLCBDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCkuY19zdHIoKSk7Cit9CisKK1RFU1QoQ29uZmlnRGlycywgZ2V0VXNlckRpcmVjdG9yeVdpdGhBbmRyb2lkRW11bGF0b3JIb21lKSB7CisgICAgVGVzdFN5c3RlbSBzeXMoIi9iaW4iLCAzMiwgIi9teWhvbWUiKTsKKyAgICBzeXMuZW52U2V0KCJBTkRST0lEX0VNVUxBVE9SX0hPTUUiLCAiL2FuZHJvaWQvaG9tZSIpOworICAgIEVYUEVDVF9TVFJFUSgiL2FuZHJvaWQvaG9tZSIsIENvbmZpZ0RpcnM6OmdldFVzZXJEaXJlY3RvcnkoKS5jX3N0cigpKTsKK30KKworCitURVNUKENvbmZpZ0RpcnMsIGdldFNka1Jvb3REaXJlY3RvcnkpIHsKKyAgICBUZXN0U3lzdGVtIHN5cygiIiwgMzIsICIvbXlob21lIik7CisgICAgQVNTRVJUX1RSVUUoc3lzLmdldFRlbXBSb290KCktPm1ha2VTdWJEaXIoIlNkayIpKTsKKyAgICBBU1NFUlRfVFJVRShzeXMuZ2V0VGVtcFJvb3QoKS0+bWFrZVN1YkRpcigiU2RrL3Rvb2xzIikpOworICAgIEFTU0VSVF9UUlVFKHN5cy5wYXRoSXNEaXIoIlNkayIpKTsKKworICAgIHN5cy5lbnZTZXQoIkFORFJPSURfU0RLX1JPT1QiLCAiU2RrIik7CisgICAgRVhQRUNUX1NUUkVRKCJTZGsiLCBDb25maWdEaXJzOjpnZXRTZGtSb290RGlyZWN0b3J5KCkuY19zdHIoKSk7CisKKyAgICBzeXMuZW52U2V0KCJBTkRST0lEX1NES19ST09UIiwgIlwiU2RrXCIiKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlNkayIsIENvbmZpZ0RpcnM6OmdldFNka1Jvb3REaXJlY3RvcnkoKS5jX3N0cigpKTsKKworICAgIHN5cy5lbnZTZXQoIkFORFJPSURfU0RLX1JPT1QiLCAiIik7CisgICAgRVhQRUNUX1NUUk5FKCJTZGsiLCBDb25maWdEaXJzOjpnZXRTZGtSb290RGlyZWN0b3J5KCkuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWQyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yLmNwcApAQCAtMCwwICsxLDg0OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjZGVmaW5lIENQVV9BQ0NFTEVSQVRPUl9QUklWQVRFCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3IuaCIKKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luaW9jdGwuaD4KKyNlbHNlCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3B1X2FjY2VsZXJhdG9yLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2RhdGEuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3g4Nl9jcHVpZC5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZEZpbGVIYW5kbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjZW5kaWYKKworI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2ludGVybmFsL0NwdUFjY2VsZXJhdG9yLmgiCisjZW5kaWYKKworLy8gTk9URTogVGhpcyBzb3VyY2UgZmlsZSBtdXN0IGJlIGluZGVwZW5kZW50IG9mIHRoZSByZXN0IG9mIFFFTVUsIGFzIHN1Y2gKKy8vICAgICAgIGl0IHNob3VsZCBub3QgaW5jbHVkZSAvIHJldXNlIGFueSBRRU1VIHNvdXJjZSBmaWxlIG9yIGZ1bmN0aW9uCisvLyAgICAgICByZWxhdGVkIHRvIEtWTSBvciBIQVguCisKKyNpZmRlZiBfX2xpbnV4X18KKyMgIGRlZmluZSAgSEFWRV9LVk0gIDEKKyMgIGRlZmluZSAgSEFWRV9IQVggIDAKKyNlbGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKyMgIGRlZmluZSBIQVZFX0tWTSAwCisjICBkZWZpbmUgSEFWRV9IQVggMQorI2Vsc2UKKyMgIGVycm9yICJVbnN1cHBvcnRlZCBob3N0IHBsYXRmb3JtISIKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIGJhc2U6OlN0cmluZ0FwcGVuZEZvcm1hdDsKK3VzaW5nIGJhc2U6OlNjb3BlZEZkOworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgR2xvYmFsU3RhdGUgeworICAgIGJvb2wgcHJvYmVkOworICAgIGJvb2wgdGVzdGluZzsKKyAgICBDcHVBY2NlbGVyYXRvciBhY2NlbDsKKyAgICBjaGFyIHN0YXR1c1syNTZdOworICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gc3RhdHVzX2NvZGU7Cit9OworCitHbG9iYWxTdGF0ZSBnR2xvYmFscyA9IHtmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BVX0FDQ0VMRVJBVE9SX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICB7J1wwJ30sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fRVJST1J9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLworLy8vLy8gICBMaW51eCBLVk0gc3VwcG9ydC4KKy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZiBIQVZFX0tWTQorCisjaW5jbHVkZSA8bGludXgva3ZtLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9rdm1fZW52LmgiCisKKy8vIFJldHVybiB0cnVlIGlmZiBLVk0gaXMgaW5zdGFsbGVkIGFuZCB1c2FibGUgb24gdGhpcyBtYWNoaW5lLgorLy8gfCpzdGF0dXN8IHdpbGwgYmUgc2V0IHRvIGEgc21hbGwgc3RhdHVzIHN0cmluZyBleHBsYWluaW5nIHRoZQorLy8gc3RhdHVzIG9mIEtWTSBvbiBzdWNjZXNzIG9yIGZhaWx1cmUuCitBbmRyb2lkQ3B1QWNjZWxlcmF0aW9uIFByb2JlS1ZNKHN0ZDo6c3RyaW5nKiBzdGF0dXMpIHsKKyAgICBjb25zdCBjaGFyKiBrdm1fZGV2aWNlID0gZ2V0ZW52KEtWTV9ERVZJQ0VfTkFNRV9FTlYpOworICAgIGlmIChOVUxMID09IGt2bV9kZXZpY2UpIHsKKyAgICAgIGt2bV9kZXZpY2UgPSAiL2Rldi9rdm0iOworICAgIH0KKyAgICAvLyBDaGVjayB0aGF0IGt2bSBkZXZpY2UgZXhpc3RzLgorICAgIGlmICg6OmFjY2Vzcyhrdm1fZGV2aWNlLCBGX09LKSkgeworICAgICAgICAvLyBrdm0gZGV2aWNlIGRvZXMgbm90IGV4aXN0CisgICAgICAgIGJvb2wgY3B1X29rID0KKyAgICAgICAgICAgICAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdm14X3N1cHBvcnQoKSB8fAorICAgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9zdm1fc3VwcG9ydCgpOworICAgICAgICBpZiAoIWNwdV9vaykgeworICAgICAgICAgICAgc3RhdHVzLT5hc3NpZ24oCisgICAgICAgICAgICAgICAgIktWTSByZXF1aXJlcyBhIENQVSB0aGF0IHN1cHBvcnRzIHZteCBvciBzdm0iKTsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fTk9fQ1BVX1NVUFBPUlQ7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgZm91bmQ6IFZUIGRpc2FibGVkIGluIEJJT1Mgb3IgS1ZNIGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIG5vdCBsb2FkZWQiLCBrdm1fZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfTk9UX0ZPVU5EOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQga3ZtIGRldmljZSBjYW4gYmUgb3BlbmVkLgorICAgIGlmICg6OmFjY2Vzcyhrdm1fZGV2aWNlLCBSX09LKSkgeworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgdXNlciBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbnMgdG8gdXNlIEtWTSAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGt2bV9kZXZpY2UpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9QRVJNSVNTSU9OOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIGZpbGUuCisgICAgU2NvcGVkRmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oa3ZtX2RldmljZSwgT19SRFdSKSkpOworICAgIGlmICghZmQudmFsaWQoKSkgeworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoc3RhdHVzLCAiQ291bGQgbm90IG9wZW4gJXMgOiAlcyIsIGt2bV9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9PUEVOX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBFeHRyYWN0IEtWTSB2ZXJzaW9uIG51bWJlci4KKyAgICBpbnQgdmVyc2lvbiA9IDo6aW9jdGwoZmQuZ2V0KCksIEtWTV9HRVRfQVBJX1ZFUlNJT04sIDApOworICAgIGlmICh2ZXJzaW9uIDwgMCkgeworICAgICAgICBzdGF0dXMtPmFzc2lnbigiQ291bGQgbm90IGV4dHJhY3QgS1ZNIHZlcnNpb246ICIpOworICAgICAgICBzdGF0dXMtPmFwcGVuZChzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9JT0NUTF9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gQ29tcGFyZSB0byBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uCisgICAgc3RhdHVzLT5jbGVhcigpOworCisgICAgaWYgKHZlcnNpb24gPCBLVk1fQVBJX1ZFUlNJT04pIHsKKyAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJLVk0gdmVyc2lvbiB0b28gb2xkOiAlZCAoZXhwZWN0ZWQgYXQgbGVhc3QgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9BUElfVkVSU0lPTik7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX09CU09MRVRFOworICAgIH0KKworICAgIC8vIFByb2ZpdCEKKyAgICBTdHJpbmdBcHBlbmRGb3JtYXQoc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAiS1ZNICh2ZXJzaW9uICVkKSBpcyBpbnN0YWxsZWQgYW5kIHVzYWJsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1JFQURZOworfQorCisjZW5kaWYgIC8vIEhBVkVfS1ZNCisKKworI2lmIEhBVkVfSEFYCisKKyNkZWZpbmUgSEFYTV9JTlNUQUxMRVJfVkVSU0lPTl9NSU5JTVVNIDB4MDYwMDAwMDEKKworc3RkOjpzdHJpbmcgY3B1QWNjZWxlcmF0b3JGb3JtYXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbikgeworICAgIGlmICh2ZXJzaW9uIDwgMCkgeworICAgICAgICByZXR1cm4gIjxpbnZhbGlkPiI7CisgICAgfQorICAgIGNoYXIgYnVmWzE2XTsgIC8vIHN0cmxlbigiMTI3LjI1NS42NTUzNSIpKzEgPSAxNAorICAgIGludDMyX3QgcmV2aXNpb24gPSB2ZXJzaW9uICYgMHhmZmZmOworICAgIHZlcnNpb24gPj49IDE2OworICAgIGludDMyX3QgbWlub3IgPSB2ZXJzaW9uICYgMHhmZjsKKyAgICB2ZXJzaW9uID4+PSA4OworICAgIGludDMyX3QgbWFqb3IgPSB2ZXJzaW9uICYgMHg3ZjsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWkuJWkuJWkiLCBtYWpvciwgbWlub3IsIHJldmlzaW9uKTsKKyAgICByZXR1cm4gYnVmOworfQorCisjaWZkZWYgX19BUFBMRV9fCisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQzMl90IGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KGNvbnN0IHN0ZDo6c3RyaW5nJiB2ZXJzaW9uX3NjcmlwdCkgeworICAgIGludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBjb25zdCBjaGFyIHZlcltdID0gIlZFUlNJT049IjsKKyAgICBjb25zdCBzaXplX3QgdmVyX2xlbiA9IHNpemVvZih2ZXIpIC0gMVU7CisKKyAgICBzaXplX3Qgb2Zmc2V0ID0gdmVyc2lvbl9zY3JpcHQuZmluZCh2ZXIpOworICAgIGlmIChvZmZzZXQgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBwb3MgPSB2ZXJzaW9uX3NjcmlwdC5jX3N0cigpICsgdmVyX2xlbjsKKworICAgIGNvbnN0IGludCBrVmFsdWVDb3VudE1heCA9IDM7ICAvLyBzdXBwb3J0IDMgbnVtYmVycyBtYXggbWFqb3IubWlub3IucmV2CisgICAgY29uc3QgaW50IGJpdF9vZmZzZXRba1ZhbHVlQ291bnRNYXhdID0gezI0LCAxNiwgMH07CisgICAgY29uc3QgaW50IHZhbHVlX21heFtrVmFsdWVDb3VudE1heF0gPSB7MTI3LCAyNTUsIDY1NTM1fTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtWYWx1ZUNvdW50TWF4OyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogZW5kID0gcG9zOworICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlID0gc3RydG91bChwb3MsIChjaGFyKiopJmVuZCwgMTApOworICAgICAgICBpZiAocG9zID09IGVuZCkgeworICAgICAgICAgICAgLy8gbm8gbnVtYmVyIHdhcyBmb3VuZCwgZXJyb3IgaWYgdGhlcmUgd2FzIG5vdCBhdCBsZWFzdCBvbmUuCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2YWx1ZSA+IHZhbHVlX21heFtpXSkgeworICAgICAgICAgICAgLy8gaW52YWxpZCBudW1iZXIgd2FzIGZvdW5kCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgfD0gKHZhbHVlIDw8IGJpdF9vZmZzZXRbaV0pOworCisgICAgICAgIGlmICgqZW5kID09ICcuJykgeworICAgICAgICAgICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgICAgIGVuZCArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2UncmUgZG9uZSBwYXJzaW5nCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBhZHZhbmNlIHRvIG5leHQgbnVtYmVyCisgICAgICAgIHBvcyA9IGVuZDsKKyAgICB9CisgICAgLy8gMCBpcyBhbiBpbnZhbGlkIHZlcnNpb24gbnVtYmVyLgorICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50MzJfdCBjcHVBY2NlbGVyYXRvckdldEhheFZlcnNpb24oY29uc3QgY2hhcioga2V4dF9kaXJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrZXh0X2Rpcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZlcnNpb25fZmlsZSkgeworICAgIGJvb2wgZm91bmRfaGF4bV9rZXh0ID0gZmFsc2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleHRfZGlyX2NvdW50OyBpKyspIHsKKyAgICAgICAgc3RydWN0IHN0YXQgczsKKyAgICAgICAgaW50IGVyciA9IGFuZHJvaWRfc3RhdChrZXh0X2RpcltpXSwgJnMpOworICAgICAgICBpZiAoZXJyIDwgMCB8fCAhU19JU0RJUihzLnN0X21vZGUpKSB7CisgICAgICAgICAgICAvLyBkaXIgbm90IGZvdW5kCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSdyZSBjZXJ0YWluIHRoYXQgaGF4bSBpcyBpbnN0YWxsZWQsCisgICAgICAgIC8vIGJ1dCBtaWdodCBiZSBicm9rZW4KKyAgICAgICAgZm91bmRfaGF4bV9rZXh0ID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uX2ZpbGVfYWJzID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhrZXh0X2RpcltpXSkgKyAiLyIgKyB2ZXJzaW9uX2ZpbGU7CisgICAgICAgIEZpbGVEYXRhIGZkOworICAgICAgICBpZiAoZmlsZURhdGFfaW5pdEZyb21GaWxlKCZmZCwgdmVyc2lvbl9maWxlX2Ficy5jX3N0cigpKSA8IDApIHsKKyAgICAgICAgICAgIC8vIGxldCdzIHRyeSB0aGUgbmV4dCBkaXJlY3RvcnksIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxlIGRhdGEgY29udGFpbnMgYSBiYXNoIHZhcmlhYmxlIGFzc2lnbm1lbnQKKyAgICAgICAgLy8gZS5nLiAiVkVSU0lPTj0xLjEuNCIKKyAgICAgICAgc3RkOjpzdHJpbmcgdmVyc2lvbl9zY3JpcHQoZmQuZGF0YSwgZmQuZGF0YSArIGZkLnNpemUpOworICAgICAgICBpbnQzMl90IHJlc3VsdCA9IGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KHZlcnNpb25fc2NyaXB0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CisgICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHVzZXMgYSByZXR1cm4gdmFsdWUgb2YgemVybyB0byBpbmRpY2F0ZSAibm90CisgICAgICAgICAgICAvLyBpbnN0YWxsZWQiCisgICAgICAgICAgICAvLyBTbyBJJ20gZGVjbGFyaW5nIHZlcnNpb24gIjAuMC4wIiB0byBiZSBpbnZhbGlkCisgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0IDw9IC0xKSB7CisgICAgICAgICAgICAvLyBsZXQncyB0cnkgdGhlIG5leHQgZGlyZWN0b3J5LCBqdXN0IGluIGNhc2UKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKGZvdW5kX2hheG1fa2V4dCkgeworICAgICAgICAvLyBmb3VuZCBoYXhtIGtleHQgYnV0IGNvdWxkbid0IHBhcnNlIHZlcnNpb24gZmlsZQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIG5vdCBpbnN0YWxsZWQKKyAgICByZXR1cm4gMDsKK30KKworbmFtZXNwYWNlIHsKKworI2VuZGlmICAvLyBfX0FQUExFX18KKworLy8gVmVyc2lvbiBudW1iZXJzIGZvciB0aGUgSEFYIGtlcm5lbCBtb2R1bGUuCisvLyB8Y29tcGF0X3ZlcnNpb258IGlzIHRoZSBtaW5pbXVtIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgbW9kdWxlLgorLy8gfGN1cnJlbnRfdmVyc2lvbnwgaXMgaXRzIGN1cnJlbnQgQVBJIHZlcnNpb24uCitzdHJ1Y3QgSGF4TW9kdWxlVmVyc2lvbiB7CisgICAgdWludDMyX3QgY29tcGF0X3ZlcnNpb247CisgICAgdWludDMyX3QgY3VycmVudF92ZXJzaW9uOworfTsKKworLyoKKyAqIFByb2JlSGF4Q3B1OiByZXR1cm5zIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9SRUFEWSBpZiB0aGUgQ1BVIHN1cHBvcnRzCisgKiBIQVhNIHJlcXVpcmVtZW50cy4KKyAqCisgKiBPdGhlcndpc2UgcmV0dXJucyBzb21lIG90aGVyIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gc3RhdHVzIGFuZCBzZXRzCisgKiB8c3RhdHVzfCB0byBhIHVzZXItdW5kZXJzdGFuZGFibGUgZXJyb3Igc3RyaW5nCisgKi8KK0FuZHJvaWRDcHVBY2NlbGVyYXRpb24gUHJvYmVIYXhDcHUoc3RkOjpzdHJpbmcqIHN0YXR1cykgeworICAgIGNoYXIgdmVuZG9yX2lkWzE2XTsKKyAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkKHZlbmRvcl9pZCwgc2l6ZW9mKHZlbmRvcl9pZCkpOworCisgICAgaWYgKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfaXNfdm1ob3N0KHZlbmRvcl9pZCkpIHsKKworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZHJvaWQgRW11bGF0b3IgZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgdmlydHVhbGl6YXRpb24uICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91ciBDUFU6ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yX2lkKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ORVNURURfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBIQVhNIG9ubHkgc3VwcG9ydHMgR2VudWluZUludGVsIHByb2Nlc3NvcnMgKi8KKyAgICBpZiAoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF90eXBlKHZlbmRvcl9pZCkgIT0gVkVORE9SX0lEX0lOVEVMKSB7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kcm9pZCBFbXVsYXRvciByZXF1aXJlcyBhbiBJbnRlbCBwcm9jZXNzb3Igd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVlQteCBhbmQgTlggc3VwcG9ydC4gIFlvdXIgQ1BVOiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pZCk7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fTk9fQ1BVX1NVUFBPUlQ7CisgICAgfQorCisgICAgaWYgKCFhbmRyb2lkX2dldF94ODZfY3B1aWRfdm14X3N1cHBvcnQoKSkgeworICAgICAgICBpZiAoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX2lzX3ZjcHUoKSkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgLy8gVGhlIHZjcHUgYml0IGlzIHNldCBidXQgeW91ciB2ZW5kb3IgaWQgaXMgbm90IG9uZSBvZiB0aGUga25vd24gVk0gaWRzCisgICAgICAgICAgICAvLyBZb3UgYXJlIHByb2JhYmx5IHJ1bm5pbmcgdW5kZXIgSHlwZXItVgorICAgICAgICAgICAgc3RhdHVzLT5hc3NpZ24oIlBsZWFzZSBkaXNhYmxlIEh5cGVyLVYgYmVmb3JlIHVzaW5nIHRoZSBBbmRyb2lkIEVtdWxhdG9yLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0IGEgY29tbWFuZCBwcm9tcHQgYXMgQWRtaW5pc3RyYXRvciwgcnVuICdiY2RlZGl0IC9zZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImh5cGVydmlzb3JsYXVuY2h0eXBlIG9mZicsIHJlYm9vdC4iKTsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fSFlQRVJWX0VOQUJMRUQ7CisjZWxzZSAvLyBPU1gKKyAgICAgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZHJvaWQgRW11bGF0b3IgZG9lcyBub3Qgc3VwcG9ydCBuZXN0ZWQgdmlydHVhbGl6YXRpb24uICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdXIgQ1BVOiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JfaWQpOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ORVNURURfTk9UX1NVUFBPUlRFRDsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHN0YXR1cy0+YXNzaWduKAorICAgICAgICAgICAgIkFuZHJvaWQgRW11bGF0b3IgcmVxdWlyZXMgYW4gSW50ZWwgcHJvY2Vzc29yIHdpdGggVlQteCBhbmQgTlggc3VwcG9ydC4gICIKKyAgICAgICAgICAgICIoVlQteCBpcyBub3Qgc3VwcG9ydGVkKSIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05PX0NQVV9WVFhfU1VQUE9SVDsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9ueF9zdXBwb3J0KCkpIHsKKyAgICAgICAgc3RhdHVzLT5hc3NpZ24oCisgICAgICAgICAgICAiQW5kcm9pZCBFbXVsYXRvciByZXF1aXJlcyBhbiBJbnRlbCBwcm9jZXNzb3Igd2l0aCBWVC14IGFuZCBOWCBzdXBwb3J0LiAgIgorICAgICAgICAgICAgIihOWCBpcyBub3Qgc3VwcG9ydGVkKSIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05PX0NQVV9OWF9TVVBQT1JUOworICAgIH0KKworICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fUkVBRFk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vCisvLy8vLyAgV2luZG93cyBIQVggc3VwcG9ydC4KKy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKwordXNpbmcgYmFzZTo6U2NvcGVkRmlsZUhhbmRsZTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBXaW5kb3dzIElPQ1RMIGNvZGUgdG8gZXh0cmFjdCBIQVgga2VybmVsIG1vZHVsZSB2ZXJzaW9uLgorI2RlZmluZSBIQVhfREVWSUNFX1RZUEUgMHg0MDAwCisjZGVmaW5lIEhBWF9JT0NUTF9WRVJTSU9OICAgICAgIFwKKyAgICBDVExfQ09ERShIQVhfREVWSUNFX1RZUEUsIDB4OTAwLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykKKyNkZWZpbmUgSEFYX0lPQ1RMX0NBUEFCSUxJVFkgICAgXAorICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MTAsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorCisvLyBUaGUgbWluaW11bSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIEFuZHJvaWQgZW11bGF0b3IuCisjZGVmaW5lIEhBWF9NSU5fVkVSU0lPTiAgMyAvLyA2LjAuMAorCisvLyBJTVBPUlRBTlQ6IEtlZXAgaW4gc3luYyB3aXRoIHRhcmdldC1pMzg2L2hheC1pbnRlcmZhY2UuaAorc3RydWN0IGhheF9jYXBhYmlsaXR5aW5mbworeworICAgIC8qIGJpdCAwOiAxIC0gSEFYTSBpcyB3b3JraW5nCisgICAgICogICAgICAgIDAgLSBIQVhNIGlzIG5vdCB3b3JraW5nIHBvc3NpYmx5IGJlY2F1c2UgVlQvTlggaXMgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgIE5YIG1lYW5zIE5vbi1lWGVjdXRpb24sIGFrcy4gWEQgKGVYZWN1dGlvbiBEaXNhYmxlKQorICAgICAqIGJpdCAxOiAxIC0gSEFYTSBoYXMgaGFyZCBsaW1pdCBvbiBob3cgbWFueSBSQU0gY2FuIGJlIHVzZWQgYXMgZ3Vlc3QgUkFNCisgICAgICogICAgICAgIDAgLSBIQVhNIGhhcyBubyBtZW1vcnkgbGltaXRhdGlvbgorICAgICAqLworI2RlZmluZSBIQVhfQ0FQX1NUQVRVU19XT1JLSU5HICAweDEKKyNkZWZpbmUgSEFYX0NBUF9TVEFUVVNfTk9UV09SS0lORyAgMHgwCisjZGVmaW5lIEhBWF9DQVBfV09SS1NUQVRVU19NQVNLIDB4MQorI2RlZmluZSBIQVhfQ0FQX01FTVFVT1RBICAgICAgICAweDIKKyAgICB1aW50MTZfdCB3c3RhdHVzOworICAgIC8qCisgICAgICogdmFsaWQgd2hlbiBIQVhNIGlzIG5vdCB3b3JraW5nCisgICAgICogYml0IDA6IEhBWE0gaXMgbm90IHdvcmtpbmcgYmVjYXVzZSBWVCBpcyBub3QgZW5hYmVsZAorICAgICAqIGJpdCAxOiBIQVhNIGlzIG5vdCB3b3JraW5nIGJlY2F1c2UgTlggbm90IGVuYWJsZWQKKyAgICAgKi8KKyNkZWZpbmUgSEFYX0NBUF9GQUlMUkVBU09OX1ZUICAgMHgxCisjZGVmaW5lIEhBWF9DQVBfRkFJTFJFQVNPTl9OWCAgIDB4MgorICAgIHVpbnQxNl90IHdpbmZvOworICAgIHVpbnQzMl90IHBhZDsKKyAgICB1aW50NjRfdCBtZW1fcXVvdGE7Cit9OworCitBbmRyb2lkQ3B1QWNjZWxlcmF0aW9uIFByb2JlSEFYKHN0ZDo6c3RyaW5nKiBzdGF0dXMpIHsKKyAgICBzdGF0dXMtPmNsZWFyKCk7CisKKyAgICBBbmRyb2lkQ3B1QWNjZWxlcmF0aW9uIGNwdSA9IFByb2JlSGF4Q3B1KHN0YXR1cyk7CisgICAgaWYgKGNwdSAhPSBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fUkVBRFkpCisgICAgICAgIHJldHVybiBjcHU7CisKKyAgICBjb25zdCBjaGFyKiBwcm9kdWN0RGlzcGxheU5hbWUgPSB1OCJJbnRlbMKuIEhhcmR3YXJlIEFjY2VsZXJhdGVkIEV4ZWN1dGlvbiBNYW5hZ2VyIjsKKyAgICBpbnQzMl90IGhheG1faW5zdGFsbGVyX3ZlcnNpb24gPSBXaW5kb3dzSW5zdGFsbGVyOjpnZXRWZXJzaW9uKHByb2R1Y3REaXNwbGF5TmFtZSk7CisgICAgaWYgKGhheG1faW5zdGFsbGVyX3ZlcnNpb24gPT0gMCkgeworICAgICAgICBzdGF0dXMtPmFzc2lnbigKKyAgICAgICAgICAgICJIQVhNIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhpcyBtYWNoaW5lIik7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fQUNDRUxfTk9UX0lOU1RBTExFRDsKKyAgICB9CisKKyAgICBpZiAoaGF4bV9pbnN0YWxsZXJfdmVyc2lvbiA8IEhBWE1fSU5TVEFMTEVSX1ZFUlNJT05fTUlOSU1VTSkgeworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICAgc3RhdHVzLCAiSEFYTSBtdXN0IGJlIHVwZGF0ZWQgKHZlcnNpb24gJXMgPCAlcykuIiwKKyAgICAgICAgICAgICAgICBjcHVBY2NlbGVyYXRvckZvcm1hdFZlcnNpb24oaGF4bV9pbnN0YWxsZXJfdmVyc2lvbiksCisgICAgICAgICAgICAgICAgY3B1QWNjZWxlcmF0b3JGb3JtYXRWZXJzaW9uKEhBWE1fSU5TVEFMTEVSX1ZFUlNJT05fTUlOSU1VTSkpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0FDQ0VMX09CU09MRVRFOworICAgIH0KKworICAgIC8vIDEpIFRyeSB0byBmaW5kIHRoZSBIQVgga2VybmVsIG1vZHVsZS4KKyAgICBTY29wZWRGaWxlSGFuZGxlIGhheChDcmVhdGVGaWxlKCJcXFxcLlxcSEFYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSRUFURV9BTFdBWVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgICAgaWYgKCFoYXgudmFsaWQoKSkgeworICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9GSUxFX05PVF9GT1VORCkgeworICAgICAgICAgICAgc3RhdHVzLT5hc3NpZ24oCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvcGVuIEhBWE0gZGV2aWNlOiBFUlJPUl9GSUxFX05PVF9GT1VORCIpOworICAgICAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfTk9UX0ZPVU5EOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9BQ0NFU1NfREVOSUVEKSB7CisgICAgICAgICAgICBzdGF0dXMtPmFzc2lnbigKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIG9wZW4gSEFYTSBkZXZpY2U6IEVSUk9SX0FDQ0VTU19ERU5JRUQiKTsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX1BFUk1JU1NJT047CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcGVuaW5nIEhBWCBrZXJuZWwgbW9kdWxlIGZhaWxlZDogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfT1BFTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gMikgRXh0cmFjdCB0aGUgbW9kdWxlJ3MgdmVyc2lvbi4KKyAgICBIYXhNb2R1bGVWZXJzaW9uIGhheF92ZXJzaW9uOworCisgICAgRFdPUkQgZFNpemUgPSAwOworICAgIEJPT0wgcmV0ID0gRGV2aWNlSW9Db250cm9sKGhheC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVhfSU9DVExfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXhfdmVyc2lvbiwgc2l6ZW9mKGhheF92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBleHRyYWN0IEhBWCBtb2R1bGUgdmVyc2lvbjogJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX0lPQ1RMX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyAzKSBDaGVjayB0aGF0IGl0IGlzIHRoZSByaWdodCB2ZXJzaW9uLgorICAgIGlmIChoYXhfdmVyc2lvbi5jdXJyZW50X3ZlcnNpb24gPCBIQVhfTUlOX1ZFUlNJT04pIHsKKyAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJIQVggdmVyc2lvbiAoJWQpIGlzIHRvbyBvbGQgKG5lZWQgYXQgbGVhc3QgJWQpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXhfdmVyc2lvbi5jdXJyZW50X3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVhfTUlOX1ZFUlNJT04pOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9PQlNPTEVURTsKKyAgICB9CisKKyAgICBoYXhfY2FwYWJpbGl0eWluZm8gY2FwID0ge307CisgICAgcmV0ID0gRGV2aWNlSW9Db250cm9sKGhheC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSEFYX0lPQ1RMX0NBUEFCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXAsIHNpemVvZihjYXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgRFdPUkQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBleHRyYWN0IEhBWCBjYXBhYmlsaXR5OiAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfSU9DVExfRkFJTEVEOworICAgIH0KKworICAgIGlmICggKGNhcC53c3RhdHVzICYgSEFYX0NBUF9XT1JLU1RBVFVTX01BU0spID09IEhBWF9DQVBfU1RBVFVTX05PVFdPUktJTkcgKQorICAgIHsKKyAgICAgICAgaWYgKGNhcC53aW5mbyAmIEhBWF9DQVBfRkFJTFJFQVNPTl9WVCkgeworICAgICAgICAgICAgc3RhdHVzLT5hc3NpZ24oIlZUIGZlYXR1cmUgZGlzYWJsZWQgaW4gQklPUy9VRUZJIik7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1ZUX0RJU0FCTEVEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNhcC53aW5mbyAmIEhBWF9DQVBfRkFJTFJFQVNPTl9OWCkgeworICAgICAgICAgICAgc3RhdHVzLT5hc3NpZ24oIk5YIGZlYXR1cmUgZGlzYWJsZWQgaW4gQklPUy9VRUZJIik7CisgICAgICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05YX0RJU0FCTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gNCkgUHJvZml0IQorICAgIFN0cmluZ0FwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgIHN0YXR1cywgIkhBWE0gdmVyc2lvbiAlcyAoJWQpIGlzIGluc3RhbGxlZCBhbmQgdXNhYmxlLiIsCisgICAgICAgICAgICBjcHVBY2NlbGVyYXRvckZvcm1hdFZlcnNpb24oaGF4bV9pbnN0YWxsZXJfdmVyc2lvbiksCisgICAgICAgICAgICBoYXhfdmVyc2lvbi5jdXJyZW50X3ZlcnNpb24pOworICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fUkVBRFk7Cit9CisKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLworLy8vLy8gIERhcndpbiBIQVggc3VwcG9ydC4KKy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIEFuIElPQ1RMIGNvbW1hbmQgbnVtYmVyIHVzZWQgdG8gcmV0cmlldmUgdGhlIEhBWCBrZXJuZWwgbW9kdWxlIHZlcnNpb24uCisjZGVmaW5lIEhBWF9JT0NUTF9WRVJTSU9OIF9JT1dSKDAsIDB4MjAsIEhheE1vZHVsZVZlcnNpb24pCisKKy8vIFRoZSBtaW5pbXVtIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgQW5kcm9pZCBlbXVsYXRvci4KKyNkZWZpbmUgSEFYX01JTl9WRVJTSU9OICAzIC8vIDYuMC4wCisKK0FuZHJvaWRDcHVBY2NlbGVyYXRpb24gUHJvYmVIQVgoc3RkOjpzdHJpbmcqIHN0YXR1cykgeworICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gY3B1ID0gUHJvYmVIYXhDcHUoc3RhdHVzKTsKKyAgICBpZiAoY3B1ICE9IEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9SRUFEWSkKKyAgICAgICAgcmV0dXJuIGNwdTsKKworICAgIGNvbnN0IGNoYXIqIGtleHRfZGlyW10gPSB7CisgICAgICAgICIvTGlicmFyeS9FeHRlbnNpb25zL2ludGVsaGF4bS5rZXh0IiwgLy8gY3VycmVudAorICAgICAgICAiL1N5c3RlbS9MaWJyYXJ5L0V4dGVuc2lvbnMvaW50ZWxoYXhtLmtleHQiLCAvLyBvbGQKKyAgICB9OworICAgIHNpemVfdCBrZXh0X2Rpcl9jb3VudCA9IHNpemVvZihrZXh0X2Rpcikvc2l6ZW9mKGtleHRfZGlyWzBdKTsKKworICAgIGNvbnN0IGNoYXIqIHZlcnNpb25fZmlsZSA9ICJDb250ZW50cy9SZXNvdXJjZXMvc3VwcG9ydC50eHQiOworICAgIGludDMyX3QgdmVyc2lvbiA9IGNwdUFjY2VsZXJhdG9yR2V0SGF4VmVyc2lvbigKKyAgICAgICAga2V4dF9kaXIsCisgICAgICAgIGtleHRfZGlyX2NvdW50LAorICAgICAgICB2ZXJzaW9uX2ZpbGUKKyAgICAgICAgKTsKKyAgICBpZiAodmVyc2lvbiA9PSAwKSB7CisgICAgICAgIHN0YXR1cy0+YXNzaWduKAorICAgICAgICAgICAgIkhBWE0gaXMgbm90IGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmUiKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9BQ0NFTF9OT1RfSU5TVEFMTEVEOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uIDwgSEFYTV9JTlNUQUxMRVJfVkVSU0lPTl9NSU5JTVVNKSB7CisgICAgICAgIC8vIEhBWE0gd2FzIGZvdW5kIGJ1dCB2ZXJzaW9uIG51bWJlciB3YXMgdG9vIG9sZCBvciBtaXNzaW5nCisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICAgICBzdGF0dXMsICJIQVhNIG11c3QgYmUgdXBkYXRlZCAodmVyc2lvbiAlcyA8ICVzKS4iLAorICAgICAgICAgICAgICAgIGNwdUFjY2VsZXJhdG9yRm9ybWF0VmVyc2lvbih2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBjcHVBY2NlbGVyYXRvckZvcm1hdFZlcnNpb24oSEFYTV9JTlNUQUxMRVJfVkVSU0lPTl9NSU5JTVVNKSk7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fQUNDRUxfT0JTT0xFVEU7CisgICAgfQorCisgICAgLy8gMSkgQ2hlY2sgdGhhdCAvZGV2L0hBWCBleGlzdHMuCisgICAgaWYgKDo6YWNjZXNzKCIvZGV2L0hBWCIsIEZfT0spKSB7CisgICAgICAgIHN0YXR1cy0+YXNzaWduKAorICAgICAgICAgICAgIkhBWE0gaXMgbm90IGluc3RhbGxlZCBvbiB0aGlzIG1hY2hpbmUgKC9kZXYvSEFYIGlzIG1pc3NpbmcpLiIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLy8gMikgQ2hlY2sgdGhhdCAvZGV2L0hBWCBjYW4gYmUgb3BlbmVkLgorICAgIGlmICg6OmFjY2VzcygiL2Rldi9IQVgiLCBSX09LKSkgeworICAgICAgICBzdGF0dXMtPmFzc2lnbigKKyAgICAgICAgICAgICJUaGlzIHVzZXIgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24gdG8gdXNlIEhBWCAoL2Rldi9IQVgpLiIpOworICAgICAgICByZXR1cm4gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX0RFVl9QRVJNSVNTSU9OOworICAgIH0KKworICAgIC8vIDMpIE9wZW4gdGhlIGZpbGUuCisgICAgU2NvcGVkRmQgZmQob3BlbigiL2Rldi9IQVgiLCBPX1JEV1IpKTsKKyAgICBpZiAoIWZkLnZhbGlkKCkpIHsKKyAgICAgICAgc3RhdHVzLT5hc3NpZ24oIkNvdWxkIG5vdCBvcGVuIC9kZXYvSEFYOiAiKTsKKyAgICAgICAgc3RhdHVzLT5hcHBlbmQoc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfT1BFTl9GQUlMRUQ7CisgICAgfQorCisgICAgLy8gNCkgRXh0cmFjdCBIQVggdmVyc2lvbiBudW1iZXIuCisgICAgc3RhdHVzLT5jbGVhcigpOworCisgICAgSGF4TW9kdWxlVmVyc2lvbiBoYXhfdmVyc2lvbjsKKyAgICBpZiAoOjppb2N0bChmZC5nZXQoKSwgSEFYX0lPQ1RMX1ZFUlNJT04sICZoYXhfdmVyc2lvbikgPCAwKSB7CisgICAgICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGV4dHJhY3QgSEFYIHZlcnNpb246ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fREVWX0lPQ1RMX0ZBSUxFRDsKKyAgICB9CisKKyAgICBpZiAoaGF4X3ZlcnNpb24uY3VycmVudF92ZXJzaW9uIDwgaGF4X3ZlcnNpb24uY29tcGF0X3ZlcnNpb24pIHsKKyAgICAgICAgU3RyaW5nQXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAiTWFsZm9ybWVkIEhBWCB2ZXJzaW9uIG51bWJlcnMgKGN1cnJlbnQ9JWQsIGNvbXBhdD0lZClcbiIsCisgICAgICAgICAgICAgICAgaGF4X3ZlcnNpb24uY3VycmVudF92ZXJzaW9uLAorICAgICAgICAgICAgICAgIGhheF92ZXJzaW9uLmNvbXBhdF92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfT0JTT0xFVEU7CisgICAgfQorCisgICAgLy8gNSkgQ29tcGFyZSB0byBtaW5pbXVtIHN1cHBvcnRlZCB2ZXJzaW9uLgorCisgICAgaWYgKGhheF92ZXJzaW9uLmN1cnJlbnRfdmVyc2lvbiA8IEhBWF9NSU5fVkVSU0lPTikgeworICAgICAgICBTdHJpbmdBcHBlbmRGb3JtYXQoc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhBWCBBUEkgdmVyc2lvbiB0b28gb2xkOiAlZCAoZXhwZWN0ZWQgYXQgbGVhc3QgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF4X3ZlcnNpb24uY3VycmVudF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFYX01JTl9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9ERVZfT0JTT0xFVEU7CisgICAgfQorCisgICAgLy8gNikgUHJvZml0IQorICAgIFN0cmluZ0FwcGVuZEZvcm1hdChzdGF0dXMsICJIQVhNIHZlcnNpb24gJXMgKCVkKSBpcyBpbnN0YWxsZWQgYW5kIHVzYWJsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICBjcHVBY2NlbGVyYXRvckZvcm1hdFZlcnNpb24odmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgIGhheF92ZXJzaW9uLmN1cnJlbnRfdmVyc2lvbik7CisgICAgcmV0dXJuIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9SRUFEWTsKK30KKworI2Vsc2UgICAvLyAhX1dJTjMyICYmICFfX0FQUExFX18KKyNlcnJvciAiVW5zdXBwb3J0ZWQgSEFYIGhvc3QgcGxhdGZvcm0iCisjZW5kaWYgIC8vICFfV0lOMzIgJiYgIV9fQVBQTEVfXworCisjZW5kaWYgIC8vIEhBVkVfSEFYCisKK30gIC8vIG5hbWVzcGFjZQorCitDcHVBY2NlbGVyYXRvciBHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3IoKSB7CisgICAgR2xvYmFsU3RhdGUqIGcgPSAmZ0dsb2JhbHM7CisKKyAgICBpZiAoZy0+cHJvYmVkIHx8IGctPnRlc3RpbmcpIHsKKyAgICAgICAgcmV0dXJuIGctPmFjY2VsOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHN0YXR1czsKKyNpZiBIQVZFX0tWTQorICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gc3RhdHVzX2NvZGUgPSBQcm9iZUtWTSgmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzX2NvZGUgPT0gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1JFQURZKSB7CisgICAgICAgIGctPmFjY2VsID0gQ1BVX0FDQ0VMRVJBVE9SX0tWTTsKKyAgICB9CisjZWxpZiBIQVZFX0hBWAorICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gc3RhdHVzX2NvZGUgPSBQcm9iZUhBWCgmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzX2NvZGUgPT0gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1JFQURZKSB7CisgICAgICAgIGctPmFjY2VsID0gQ1BVX0FDQ0VMRVJBVE9SX0hBWDsKKyAgICB9CisjZWxzZQorICAgIHN0YXR1cyA9ICJUaGlzIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IENQVSBhY2NlbGVyYXRpb24uIjsKKyNlbmRpZgorCisgICAgLy8gY2FjaGUgc3RhdHVzCisgICAgZy0+cHJvYmVkID0gdHJ1ZTsKKyAgICBnLT5zdGF0dXNfY29kZSA9IHN0YXR1c19jb2RlOworICAgIDo6c25wcmludGYoZy0+c3RhdHVzLCBzaXplb2YoZy0+c3RhdHVzKSwgIiVzIiwgc3RhdHVzLmNfc3RyKCkpOworCisgICAgcmV0dXJuIGctPmFjY2VsOworfQorCitzdGQ6OnN0cmluZyBHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3JTdGF0dXMoKSB7CisgICAgR2xvYmFsU3RhdGUgKmcgPSAmZ0dsb2JhbHM7CisKKyAgICBpZiAoIWctPnByb2JlZCAmJiAhZy0+dGVzdGluZykgeworICAgICAgICAvLyBGb3JjZSBkZXRlY3Rpb24gb2YgdGhlIGN1cnJlbnQgQ1BVIGFjY2VsZXJhdG9yLgorICAgICAgICBHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3IoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoZy0+c3RhdHVzKTsKK30KKworQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3JTdGF0dXNDb2RlKCkgeworICAgIEdsb2JhbFN0YXRlICpnID0gJmdHbG9iYWxzOworCisgICAgaWYgKCFnLT5wcm9iZWQgJiYgIWctPnRlc3RpbmcpIHsKKyAgICAgICAgLy8gRm9yY2UgZGV0ZWN0aW9uIG9mIHRoZSBjdXJyZW50IENQVSBhY2NlbGVyYXRvci4KKyAgICAgICAgR2V0Q3VycmVudENwdUFjY2VsZXJhdG9yKCk7CisgICAgfQorCisgICAgcmV0dXJuIGctPnN0YXR1c19jb2RlOworfQorCit2b2lkIFNldEN1cnJlbnRDcHVBY2NlbGVyYXRvckZvclRlc3RpbmcoQ3B1QWNjZWxlcmF0b3IgYWNjZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBzdGF0dXNfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGF0dXMpIHsKKyAgICBHbG9iYWxTdGF0ZSAqZyA9ICZnR2xvYmFsczsKKworICAgIGctPnRlc3RpbmcgPSB0cnVlOworICAgIGctPmFjY2VsID0gYWNjZWw7CisgICAgZy0+c3RhdHVzX2NvZGUgPSBzdGF0dXNfY29kZTsKKyAgICA6OnNucHJpbnRmKGctPnN0YXR1cywgc2l6ZW9mKGctPnN0YXR1cyksICIlcyIsIHN0YXR1cyk7Cit9CisKK3N0ZDo6cGFpcjxBbmRyb2lkSHlwZXJWU3RhdHVzLCBzdGQ6OnN0cmluZz4gR2V0SHlwZXJWU3RhdHVzKCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICAvLyB0aGlzIHdhcyBlYXN5CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKEFORFJPSURfSFlQRVJWX0FCU0VOVCwgIkh5cGVyLVYgcnVucyBvbmx5IG9uIFdpbmRvd3MiKTsKKyNlbHNlIC8vIF9XSU4zMgorICAgIGNoYXIgdmVuZG9yX2lkWzE2XTsKKyAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdm1ob3N0X3ZlbmRvcl9pZCh2ZW5kb3JfaWQsIHNpemVvZih2ZW5kb3JfaWQpKTsKKyAgICBjb25zdCBhdXRvIHZtVHlwZSA9IGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3Jfdm1ob3N0X3R5cGUodmVuZG9yX2lkKTsKKyAgICBpZiAodm1UeXBlID09IFZFTkRPUl9WTV9IWVBFUlYpIHsKKyAgICAgICAgLy8gVGhlIHNpbXBsZSBwYXJ0OiB0aGVyZSdzIGN1cnJlbnRseSBhIEh5cGVyLVYgaHlwZXJ2aXNvciBydW5uaW5nLgorICAgICAgICAvLyBMZXQncyBmaW5kIG91dCBpZiB3ZSdyZSBpbiBhIGhvc3Qgb3IgZ3Vlc3QuCisgICAgICAgIC8vIEh5cGVyLVYgaGFzIGEgQ1BVSUQgZnVuY3Rpb24gMHg0MDAwMDAwMyB3aGljaCByZXR1cm5zIGEgc2V0IG9mCisgICAgICAgIC8vIHN1cHBvcnRlZCBmZWF0dXJlcyBpbiBlYnggcmVnaXN0ZXIuIEVieFswXSBpcyBhICdDcmVhdGVQYXJ0aXRpb25zJworICAgICAgICAvLyBmZWF0dXJlIGJpdCwgd2hpY2ggaXMgb25seSBlbmFibGVkIGluIGhvc3QgYXMgb2Ygbm93CisgICAgICAgIHVpbnQzMl90IGVieDsKKyAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkKDB4NDAwMDAwMDMsIDAsIG51bGxwdHIsICZlYngsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICBpZiAoZWJ4ICYgMHgxKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQU5EUk9JRF9IWVBFUlZfUlVOTklORywKKyAgICAgICAgICAgICAgICAgICAgIkh5cGVyLVYgaXMgZW5hYmxlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogdXBkYXRlIHRoaXMgcGFydCB3aGVuIEh5cGVyLVYgb2ZmaWNpYWxseSBpbXBsZW1lbnRzCisgICAgICAgICAgICAvLyBuZXN0aW5nIHN1cHBvcnQKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihBTkRST0lEX0hZUEVSVl9BQlNFTlQsCisgICAgICAgICAgICAgICAgICAgICJSdW5uaW5nIGluIGEgZ3Vlc3QgSHlwZXItViBWTSwgSHlwZXItViBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHZtVHlwZSAhPSBWRU5ET1JfVk1fTk9UVk0pIHsKKyAgICAgICAgLy8gc29tZSBDUFVzIG1heSByZXR1cm4gc29tZXRoaW5nIHN0cmFuZ2UgZXZlbiBpZiB3ZSdyZSBub3QgdW5kZXIgYSBWTSwKKyAgICAgICAgLy8gc28gbGV0J3MgZG91YmxlLWNoZWNrIGl0CisgICAgICAgIGlmIChhbmRyb2lkX2dldF94ODZfY3B1aWRfaXNfdmNwdSgpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQU5EUk9JRF9IWVBFUlZfQUJTRU5ULAorICAgICAgICAgICAgICAgICAgICAiUnVubmluZyBpbiBhIGd1ZXN0IFZNLCBIeXBlci1WIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZzsKKyAgICB1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7CisKKyAgICAvLyBOb3cgdGhlIGhhcmQgcGFydDogd2Uga25vdyBIeXBlci1WIGlzIG5vdCBydW5uaW5nLiBXZSBuZWVkIHRvIGZpbmQgb3V0IGlmCisgICAgLy8gaXQncyBpbnN0YWxsZWQuCisgICAgLy8gVGhlIG9ubHkgcmVsaWFibGUgd2F5IG9mIGRldGVjdGluZyBpdCBpcyB0byBxdWVyeSB0aGUgbGlzdCBvZiBvcHRpb25hbAorICAgIC8vIGZlYXR1cmVzIHRocm91Z2ggdGhlIFdNSSBhbmQgY2hlY2sgaWYgSHlwZXItViBpcyBpbnN0YWxsZWQgdGhlcmUuIEJ1dCBpdAorICAgIC8vIHJ1bnMgZm9yIHRlbnMgb2Ygc2Vjb25kcywgYW5kIGNhbiBiZSBldmVuIHNsb3dlciB1bmRlciBtZW1vcnkgcHJlc3N1cmUuCisgICAgLy8gSW5zdGVhZCwgbGV0J3MgdGFrZSBhIHNob3J0Y3V0OiBIeXBlci1WIGVuZ2luZSBmaWxlIGlzIHZtbXMuZXhlLiBJZiBpdCdzCisgICAgLy8gaW5zdGFsbGVkIGl0IGhhcyB0byBiZSBpbiBzeXN0ZW0zMiBkaXJlY3RvcnkuIFNvIHdlIGNhbiBqdXN0IGNoZWNrIGlmCisgICAgLy8gaXQncyB0aGVyZS4KKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgd2luUGF0aChNQVhfUEFUSCk7CisgICAgVUlOVCBzaXplID0gOjpHZXRXaW5kb3dzRGlyZWN0b3J5Vyh3aW5QYXRoLmRhdGEoKSwgd2luUGF0aC5zaXplKCkgKyAxKTsKKyAgICBpZiAoc2l6ZSA+IHdpblBhdGguc2l6ZSgpKSB7CisgICAgICAgIHdpblBhdGgucmVzaXplKHNpemUpOworICAgICAgICBzaXplID0gOjpHZXRXaW5kb3dzRGlyZWN0b3J5Vyh3aW5QYXRoLmRhdGEoKSwgd2luUGF0aC5zaXplKCkgKyAxKTsKKyAgICB9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvLyBMYXN0IGNoYW5jZSBjYWxsCisgICAgICAgIHdpblBhdGggPSBMIkM6XFxXaW5kb3dzIjsKKyAgICB9IGVsc2UgaWYgKHdpblBhdGguc2l6ZSgpICE9IHNpemUpIHsKKyAgICAgICAgd2luUGF0aC5yZXNpemUoc2l6ZSk7CisgICAgfQorCisjaWZkZWYgX194ODZfNjRfXworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN5c1BhdGggPSBQYXRoVXRpbHM6OmpvaW4od2luUGF0aC50b1N0cmluZygpLCAiU3lzdGVtMzIiKTsKKyNlbHNlCisgICAgLy8gRm9yIHRoZSAzMi1iaXQgYXBwbGljYXRpb24gZXZlcnl0aGluZydzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbXBsaWNhdGVkOgorICAgIC8vIHRoZSBtYWluIEh5cGVyLVYgZXhlY3V0YWJsZSBpcyA2NC1iaXQgb24gNjQtYml0IE9TOyBidXQgd2UncmUgcnVubmluZworICAgIC8vIHVuZGVyIGZpbGUgc3lzdGVtIHJlZGlyZWN0b3Igd2hpY2ggcmVkaXJlY3RzIGFjY2VzcyBpbnRvIDMyLWJpdCBTeXN0ZW0zMi4KKyAgICAvLyBldmVuIG1vcmU6IGlmIHdlJ3JlIHJ1bm5pbmcgdW5kZXIgMzItYml0IFdpbmRvd3MsIHRoZXJlJ3Mgbm8gNjQtYml0CisgICAgLy8gZGlyZWN0b3J5LiBTbyB3ZSBuZWVkIHRvIHNlbGVjdCB0aGUgcHJvcGVyIG9uZSBoZXJlLgorICAgIC8vIEZpcnN0LCB0cnkgYSBzeW1saW5rIHdoaWNoIG9ubHkgZXhpc3RzIG9uIDY0LWJpdCBXaW5kb3dzIGFuZCBsZWFkcyB0bworICAgIC8vIHRoZSBuYXRpdmUsIDY0LWJpdCBkaXJlY3RvcnkKKyAgICBzdGQ6OnN0cmluZyBzeXNQYXRoID0gUGF0aFV0aWxzOjpqb2luKHdpblBhdGgudG9TdHJpbmcoKSwgIlN5c25hdGl2ZSIpOworCisgICAgLy8gY2hlY2sgb25seSBpZiBwYXRoIGV4aXN0czogcGF0aF9pc19kaXIoKSB3b3VsZCBmYWlsIGFzIGl0J3Mgbm90IGEKKyAgICAvLyBkaXJlY3RvcnkgYnV0IGEgc3ltbGluaworICAgIGlmICghcGF0aF9leGlzdHMoc3lzUGF0aC5jX3N0cigpKSkgeworICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGV4aXN0LCB3ZSdyZSBvbiAzMi1iaXQgV2luZG93cyBhbmQgbGV0J3MganVzdCB1c2UKKyAgICAgICAgLy8gdGhlIHBsYWluIG9sZCBTeXN0ZW0zMgorICAgICAgICBzeXNQYXRoID0gUGF0aFV0aWxzOjpqb2luKHdpblBhdGgudG9TdHJpbmcoKSwgIlN5c3RlbTMyIik7CisgICAgfQorI2VuZGlmCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgaHlwZXJWRXhlID0gUGF0aFV0aWxzOjpqb2luKHN5c1BhdGgsICJ2bW1zLmV4ZSIpOworCisgICAgaWYgKHBhdGhfaXNfcmVndWxhcihoeXBlclZFeGUuY19zdHIoKSkpIHsKKyAgICAgICAgLy8gaHlwZXItdiBpcyBpbnN0YWxsZWQgYnV0IG5vdCBydW5uaW5nCisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihBTkRST0lEX0hZUEVSVl9JTlNUQUxMRUQsICJIeXBlci1WIGlzIGRpc2FibGVkIik7CisgICAgfQorCisgICAgLy8gbm90IGEgc2xpZ2h0ZXN0IHNpZ24gb2YgaXQKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQU5EUk9JRF9IWVBFUlZfQUJTRU5ULCAiSHlwZXItViBpcyBub3QgaW5zdGFsbGVkIik7CisjZW5kaWYgLy8gX1dJTjMyCit9CisKK3N0ZDo6cGFpcjxBbmRyb2lkQ3B1SW5mb0ZsYWdzLCBzdGQ6OnN0cmluZz4gR2V0Q3B1SW5mbygpIHsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIHN0ZDo6c3RyaW5nIHN0YXR1czsKKworICAgIGNoYXIgdmVuZG9yX2lkWzEzXTsKKyAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkKHZlbmRvcl9pZCwgc2l6ZW9mKHZlbmRvcl9pZCkpOworICAgIHN3aXRjaCAoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF90eXBlKHZlbmRvcl9pZCkpIHsKKyAgICBjYXNlIFZFTkRPUl9JRF9BTUQ6CisgICAgICAgIGZsYWdzIHw9IEFORFJPSURfQ1BVX0lORk9fQU1EOworICAgICAgICBzdGF0dXMgKz0gIkFNRCBDUFVcbiI7CisgICAgICAgIGlmIChhbmRyb2lkX2dldF94ODZfY3B1aWRfc3ZtX3N1cHBvcnQoKSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQU5EUk9JRF9DUFVfSU5GT19WSVJUX1NVUFBPUlRFRDsKKyAgICAgICAgICAgIHN0YXR1cyArPSAiVmlydHVhbGl6YXRpb24gaXMgc3VwcG9ydGVkXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVkVORE9SX0lEX0lOVEVMOgorICAgICAgICBmbGFncyB8PSBBTkRST0lEX0NQVV9JTkZPX0lOVEVMOworICAgICAgICBzdGF0dXMgKz0gIkludGVsIENQVVxuIjsKKyAgICAgICAgaWYgKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92bXhfc3VwcG9ydCgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBBTkRST0lEX0NQVV9JTkZPX1ZJUlRfU1VQUE9SVEVEOworICAgICAgICAgICAgc3RhdHVzICs9ICJWaXJ0dWFsaXphdGlvbiBpcyBzdXBwb3J0ZWRcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmxhZ3MgfD0gQU5EUk9JRF9DUFVfSU5GT19PVEhFUjsKKyAgICAgICAgc3RhdHVzICs9ICJPdGhlciBDUFU6ICI7CisgICAgICAgIHN0YXR1cyArPSB2ZW5kb3JfaWQ7CisgICAgICAgIHN0YXR1cyArPSAnXG4nOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX2lzX3ZjcHUoKSkgeworICAgICAgICBmbGFncyB8PSBBTkRST0lEX0NQVV9JTkZPX1ZNOworICAgICAgICBzdGF0dXMgKz0gIkluc2lkZSBhIFZNXG4iOworICAgIH0KKworICAgIGNvbnN0IGludCBvc0JpdG5lc3MgPSBiYXNlOjpTeXN0ZW06OmdldCgpLT5nZXRIb3N0Qml0bmVzcygpOworICAgIGNvbnN0IGJvb2wgaXM2NEJpdENhcGFibGUgPQorICAgICAgICAgICAgb3NCaXRuZXNzID09IDY0IHx8IGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9pc182NGJpdF9jYXBhYmxlKCk7CisgICAgaWYgKGlzNjRCaXRDYXBhYmxlKSB7CisgICAgICAgIGlmIChvc0JpdG5lc3MgPT0gMzIpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFORFJPSURfQ1BVX0lORk9fNjRfQklUXzMyX0JJVF9PUzsKKyAgICAgICAgICAgIHN0YXR1cyArPSAiNjQtYml0IENQVSwgMzItYml0IE9TXG4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxhZ3MgfD0gQU5EUk9JRF9DUFVfSU5GT182NF9CSVQ7CisgICAgICAgICAgICBzdGF0dXMgKz0gIjY0LWJpdCBDUFVcbiI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyB8PSBBTkRST0lEX0NQVV9JTkZPXzMyX0JJVDsKKyAgICAgICAgc3RhdHVzICs9ICIzMi1iaXQgQ1BVXG4iOworICAgIH0KKworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGF0aWNfY2FzdDxBbmRyb2lkQ3B1SW5mb0ZsYWdzPihmbGFncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzdGF0dXMpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3IuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODAxMWFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9DcHVBY2NlbGVyYXRvci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhlIGxpc3Qgb2YgQ1BVIGVtdWxhdGlvbiBhY2NlbGVyYXRpb24gdGVjaG5vbG9naWVzIHN1cHBvcnRlZCBieSB0aGUKKy8vIEFuZHJvaWQgZW11bGF0b3IuCisvLyAgQ1BVX0FDQ0VMRVJBVE9SX05PTkUgbWVhbnMgbm8gYWNjZWxlcmF0aW9uIGlzIHN1cHBvcnRlZCBvbiB0aGlzIG1hY2hpbmUuCisvLworLy8gIENQVV9BQ0NFTEVSQVRPUl9LVk0gbWVhbnMgTGludXggS1ZNLCB3aGljaCByZXF1aXJlcyBhIHNwZWNpZmljIGRyaXZlcgorLy8gIHRvIGJlIGluc3RhbGxlZCBhbmQgdGhhdCAvZGV2L2t2bSBpcyBwcm9wZXJseSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXJyZW50CisvLyAgdXNlci4KKy8vCisvLyAgQ1BVX0FDQ0VMRVJBVE9SX0hBWCBtZWFucyBJbnRlbCdzIEhhcmR3YXJlIEFjY2VsZXJhdGVkIGVYZWN1dGlvbiwKKy8vICB3aGljaCBjYW4gYmUgaW5zdGFsbGVkIG9uIFdpbmRvd3MgYW5kIE9TIFggbWFjaGluZXMgcnVubmluZyBvbiBhbgorLy8gIEludGVsIHByb2Nlc3Nvci4KKy8vCitlbnVtIENwdUFjY2VsZXJhdG9yIHsKKyAgICBDUFVfQUNDRUxFUkFUT1JfTk9ORSA9IDAsCisgICAgQ1BVX0FDQ0VMRVJBVE9SX0tWTSwKKyAgICBDUFVfQUNDRUxFUkFUT1JfSEFYLAorfTsKKworLy8gUmV0dXJuIHRoZSBDUFUgYWNjZWxlcmF0b3IgdGVjaG5vbG9neSB1c2FibGUgb24gdGhlIGN1cnJlbnQgbWFjaGluZS4KKy8vIFRoaXMgb25seSByZXR1cm5zIENQVV9BQ0NFTEVSQVRPUl9LVk0gb3IgQ1BVX0FDQ0VMRVJBVE9SX0hBWCBpZiB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgYWNjZWxlcmF0b3IgY2FuIGJlIHVzZWQgcHJvcGVybHkuIE90aGVyd2lzZSBpdCB3aWxsCisvLyByZXR1cm4gQ1BVX0FDQ0VMRVJBVE9SX05PTkUuCitDcHVBY2NlbGVyYXRvciAgR2V0Q3VycmVudENwdUFjY2VsZXJhdG9yKCk7CisKKy8vIFJldHVybiBhbiBBU0NJSSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgQ1BVCisvLyBhY2NlbGVyYXRpb24gb24gdGhpcyBtYWNoaW5lLiBJZiBHZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3IoKSByZXR1cm5zCisvLyBDUFVfQUNDRUxFUkFUT1JfTk9ORSB0aGlzIHdpbGwgY29udGFpbiBhIHNtYWxsIGV4cGxhbmF0aW9uIHdoeQorLy8gdGhlIGFjY2VsZXJhdG9yIGNhbm5vdCBiZSB1c2VkLgorc3RkOjpzdHJpbmcgR2V0Q3VycmVudENwdUFjY2VsZXJhdG9yU3RhdHVzKCk7CisKKy8vIFJldHVybiBhbiBzdGF0dXMgY29kZSBkZXNjcmliaW5nIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBDUFUKKy8vIGFjY2VsZXJhdGlvbiBvbiB0aGlzIG1hY2hpbmUuIElmIEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvcigpIHJldHVybnMKKy8vIENQVV9BQ0NFTEVSQVRPUl9OT05FIHRoaXMgd2lsbCBjb250YWluIGEgc21hbGwgZXhwbGFuYXRpb24gd2h5CisvLyB0aGUgYWNjZWxlcmF0b3IgY2Fubm90IGJlIHVzZWQuCitBbmRyb2lkQ3B1QWNjZWxlcmF0aW9uIEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvclN0YXR1c0NvZGUoKTsKKworLy8gRm9yIHVuaXQgdGVzdGluZy9kZWJ1Z2dpbmcgcHVycG9zZSBvbmx5LCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKy8vIEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvcigpLgordm9pZCBTZXRDdXJyZW50Q3B1QWNjZWxlcmF0b3JGb3JUZXN0aW5nKENwdUFjY2VsZXJhdG9yIGFjY2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gc3RhdHVzX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RhdHVzKTsKKworLy8gUmV0dXJucyB0aGUgSHlwZXItViBjb25maWd1cmF0aW9uIG9mIHRoZSBjdXJyZW50IHN5c3RlbQorLy8gYW5kIGEgc2hvcnQgbWVzc2FnZSBkZXNjcmliaW5nIGl0Lgorc3RkOjpwYWlyPEFuZHJvaWRIeXBlclZTdGF0dXMsIHN0ZDo6c3RyaW5nPiBHZXRIeXBlclZTdGF0dXMoKTsKKworLy8gUmV0dXJucyBhIHNldCBvZiBBbmRyb2lkQ3B1SW5mb0ZsYWdzIGRlc2NyaWJpbmcgdGhlIENQVSBjYXBhYmlsaXRpZXMKKy8vIChhbmQgYSB0ZXh0IGV4cGxhbmF0aW9uIGFzIHdlbGwpCitzdGQ6OnBhaXI8QW5kcm9pZENwdUluZm9GbGFncywgc3RkOjpzdHJpbmc+IEdldENwdUluZm8oKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9DcHVBY2NlbGVyYXRvcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4YTBjOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTE4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9DcHVBY2NlbGVyYXRvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2ludGVybmFsL0NwdUFjY2VsZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDcHVBY2NlbGVyYXRvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDcHVBY2NlbGVyYXRvclRlc3QoKSB7CisgICAgICAgIHNhdmVkX2FjY2VsXyA9IEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvcigpOworICAgICAgICBzYXZlZF9zdGF0dXNfID0gR2V0Q3VycmVudENwdUFjY2VsZXJhdG9yU3RhdHVzKCk7CisgICAgfQorCisgICAgfkNwdUFjY2VsZXJhdG9yVGVzdCgpIHsKKyAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzdGF0ZS4KKyAgICAgICAgU2V0Q3VycmVudENwdUFjY2VsZXJhdG9yRm9yVGVzdGluZyhzYXZlZF9hY2NlbF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRfc3RhdHVzX2NvZGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkX3N0YXR1c18uY19zdHIoKSk7CisgICAgfQorcHJpdmF0ZToKKyAgICBDcHVBY2NlbGVyYXRvciBzYXZlZF9hY2NlbF87CisgICAgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBzYXZlZF9zdGF0dXNfY29kZV87CisgICAgc3RkOjpzdHJpbmcgc2F2ZWRfc3RhdHVzXzsKK307CisKKy8vIE5vdCByZWFsbHkgYSB0ZXN0LCBidXQgYSBzaW1wbGUgd2F5IHRvIHByaW50IHRoZSBjdXJyZW50IGFjY2VsZXJhdG9yCisvLyB2YWx1ZSBmb3Igc2ltcGxlIHZlcmlmaWNhdGlvbi4KK1RFU1RfRihDcHVBY2NlbGVyYXRvclRlc3QsIERlZmF1bHQpIHsKKyAgICBDcHVBY2NlbGVyYXRvciBhY2NlbCA9IEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvcigpOworICAgIHN0ZDo6c3RyaW5nIHN0YXR1cyA9IEdldEN1cnJlbnRDcHVBY2NlbGVyYXRvclN0YXR1cygpOworCisgICAgc3dpdGNoIChhY2NlbCkgeworICAgIGNhc2UgQ1BVX0FDQ0VMRVJBVE9SX05PTkU6CisgICAgICAgIHByaW50ZigiTm8gYWNjZWxlcmF0aW9uIHBvc3NpYmxlIG9uIHRoaXMgbWFjaGluZSFcbiIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1BVX0FDQ0VMRVJBVE9SX0tWTToKKyAgICAgICAgcHJpbnRmKCJLVk0gYWNjZWxlcmF0aW9uIHVzYWJsZSBvbiB0aGlzIG1hY2hpbmUhXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENQVV9BQ0NFTEVSQVRPUl9IQVg6CisgICAgICAgIHByaW50ZigiSEFYIGFjY2VsZXJhdGlvbiB1c2FibGUgb24gdGhpcyBtYWNoaW5lIVxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX0ZBTFNFKDEpIDw8ICJJbnZhbGlkIGFjY2VsZXJhdG9yIHZhbHVlOiAiIDw8IGFjY2VsOworICAgIH0KKyAgICBwcmludGYoIlN0YXR1czogJXNcbiIsIHN0YXR1cy5jX3N0cigpKTsKK30KKworVEVTVChDcHVBY2NlbGVyYXRvciwgR2V0Q3B1SW5mbykgeworICAgIGF1dG8gaW5mbyA9IGFuZHJvaWQ6OkdldENwdUluZm8oKTsKKyAgICBFWFBFQ1RfTkUoaW5mby5maXJzdCwgQU5EUk9JRF9DUFVfSU5GT19GQUlMRUQpOworICAgIEVYUEVDVF9HVChpbmZvLnNlY29uZC5zaXplKCksIDApOworfQorCisjaWZkZWYgX19BUFBMRV9fCisKK1RFU1QoY3B1QWNjZWxlcmF0b3JHZXRIYXhWZXJzaW9uLCBUZXN0KSB7CisgICAgY29uc3QgY2hhcioga2V4dF9kaXJbXSA9IHsKKyAgICAgICAgInRoaXMtZGlyZWN0b3J5LWRvZXMtbm90LWV4aXN0IiwKKyAgICAgICAgImFuZHJvaWQiLCAvLyB0aGlzIGRpcmVjdG9yeSBleGlzdHMgYnV0IGRvZXNuJ3QgY29udGFpbiB0aGUgZmlsZQorICAgICAgICAiYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbiIsCisgICAgfTsKKworICAgIC8vIHRoaXMgaXMgYSByZWFsIHZlcnNpb24gZnJvbSBmcm9tIEhBWE0gMS4yLjEKKyAgICBBU1NFUlRfRVEoMHgwMTAyMDAwMSwgY3B1QWNjZWxlcmF0b3JHZXRIYXhWZXJzaW9uKGtleHRfZGlyLCAzLCAiQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuZGF0MiIpKTsKKworICAgIC8vIHRoaXMgaXMgYSByZWFsIHZlcnNpb24gZnJvbSBmcm9tIEhBWE0gMS4xLjQKKyAgICBjb25zdCBjaGFyKiB2ZXJzaW9uX2ZpbGUgPSAiQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuZGF0IjsKKworICAgIEFTU0VSVF9FUSgweDAxMDEwMDA0LCBjcHVBY2NlbGVyYXRvckdldEhheFZlcnNpb24oa2V4dF9kaXIsIDMsIHZlcnNpb25fZmlsZSkpOworCisgICAgLy8gb25seSBsb29raW5nIGluIHRoZSBmaXJzdCBkaXJlY3RvcnksIHdvbid0IGJlIGZvdW5kCisgICAgQVNTRVJUX0VRKDAsIGNwdUFjY2VsZXJhdG9yR2V0SGF4VmVyc2lvbihrZXh0X2RpciwgMSwgdmVyc2lvbl9maWxlKSk7CisKKyAgICAvLyB0aGUgc2Vjb25kIGRpcmVjdG9yeSB3aWxsIGJlIGZvdW5kIGJ1dCB0aGUgdmVyc2lvbiBmaWxlIHdpbGwgYmUgbWlzc2luZworICAgIEFTU0VSVF9FUSgtMSwgY3B1QWNjZWxlcmF0b3JHZXRIYXhWZXJzaW9uKGtleHRfZGlyLCAyLCB2ZXJzaW9uX2ZpbGUpKTsKKworICAgIC8vIHRoaXMgZmlsZSB3aWxsIGhhdmUgIlZFUlNJT049IiBidXQgbm90IGEgdmFsaWQgbnVtYmVyIGZvbGxvd2luZyBpdAorICAgIEFTU0VSVF9FUSgtMSwgY3B1QWNjZWxlcmF0b3JHZXRIYXhWZXJzaW9uKGtleHRfZGlyLCAzLCAiQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuY3BwIikpOworfQorCitURVNUKGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0LCBUZXN0KSB7CisgICAgQVNTRVJUX0VRKDB4MDEwMjAwMDQsIGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KCJWRVJTSU9OPTEuMi40IikpOworICAgIEFTU0VSVF9FUSgweDAyMDMwMDBhLCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgiVkVSU0lPTj0yLjMuMTBcciIpKTsKKyAgICBBU1NFUlRfRVEoMHgwNDAxMDAwMCwgY3B1QWNjZWxlcmF0b3JQYXJzZVZlcnNpb25TY3JpcHQoIlZFUlNJT049NC4xIikpOworICAgIEFTU0VSVF9FUSgweDAzMDAwMDAwLCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgiVkVSU0lPTj0zXG4iKSk7CisgICAgQVNTRVJUX0VRKDB4N2ZmZmZmZmYsIGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KCJWRVJTSU9OPTEyNy4yNTUuNjU1MzUiKSk7CisgICAgQVNTRVJUX0VRKC0xLCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgiVkVSU0lPTj0uMSIpKTsKKyAgICBBU1NFUlRfRVEoLTEsIGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KCJWRVJTSU9OPTEyOC4wLjAiKSk7CisgICAgQVNTRVJUX0VRKC0xLCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgiVkVSU0lPTj0wIikpOworICAgIEFTU0VSVF9FUSgtMSwgY3B1QWNjZWxlcmF0b3JQYXJzZVZlcnNpb25TY3JpcHQoIlZFUlNJT049MS4yNTYuMyIpKTsKKyAgICBBU1NFUlRfRVEoLTEsIGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KCJWRVJTSU9OPTEuMi42NTUzNiIpKTsKKyAgICBBU1NFUlRfRVEoLTEsIGNwdUFjY2VsZXJhdG9yUGFyc2VWZXJzaW9uU2NyaXB0KCJWRVJTSU9OPVxuIikpOworICAgIEFTU0VSVF9FUSgtMSwgY3B1QWNjZWxlcmF0b3JQYXJzZVZlcnNpb25TY3JpcHQoImFzZGYiKSk7CisgICAgQVNTRVJUX0VRKC0xLCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgiIikpOworfQorCisjZW5kaWYgLy8gX19BUFBMRV9fCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yX3VuaXR0ZXN0LmRhdCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZWI5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yX3VuaXR0ZXN0LmRhdApAQCAtMCwwICsxIEBACitWRVJTSU9OPTEuMS40CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yX3VuaXR0ZXN0LmRhdDIgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yX3VuaXR0ZXN0LmRhdDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjNzlkMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vQ3B1QWNjZWxlcmF0b3JfdW5pdHRlc3QuZGF0MgpAQCAtMCwwICsxIEBACitWRVJTSU9OPTEuMi4xCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0RldmljZUNvbnRleHRSdW5uZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vRGV2aWNlQ29udGV4dFJ1bm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjhmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0RldmljZUNvbnRleHRSdW5uZXIuaApAQCAtMCwwICsxLDE1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIEFsbCBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBnbG9iYWwgVk0gc3RhdGUgKGUuZy4KKy8vIHZpcnR1YWwgZGV2aWNlIG9wZXJhdGlvbnMpIHNob3VsZCBoYXBwZW4gaW4gYSB0aHJlYWQKKy8vIHRoYXQgaG9sZHMgdGhlIGdsb2JhbCBWTSBsb2NrLgorLy8KKy8vIERldmljZUNvbnRleHRSdW5uZXIgaXMgYSBoZWxwZXIgdGVtcGxhdGUgY2xhc3MgdXNlZAorLy8gdG8gZW5zdXJlIHRoYXQgYSBnaXZlbiBvcGVyYXRpb24gaXMgYWx3YXlzIHBlcmZvcm1lZAorLy8gaW4gc3VjaCBhIHRocmVhZC4gbW9yZSBzcGVjaWZpY2FsbHk6CisvLyAtIElmIHRoZSBjdXJyZW50IHRocmVhZCBhbHJlYWR5IG93bnMgdGhlIGxvY2ssCisvLyAgIHRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFzLWlzLgorLy8gLSBPdGhlcndpc2UsIGl0IGlzIHF1ZXVlZCBhbmQgd2lsbCBiZSBydW4gaW4gdGhlCisvLyAgIG1haW4tbG9vcCB0aHJlYWQgYXMgc29vbiBhcyBwb3NzaWJsZS4KKy8vCisvLyBVc2FnZSBpcyB0aGUgZm9sbG93aW5nOgorLy8KKy8vIC0gRGVmaW5lIGEgY3VzdG9tIHR5cGUgfE9QfCBjb3JyZXNwb25kaW5nIHRvCisvLyAgIHRoZSBzdGF0ZSBvZiBlYWNoIG9wZXJhdGlvbi4gSXQgbXVzdCBiZSBjb3B5LWFibGUuCisvLworLy8gLSBEZWZpbmUgYSBkZXJpdmVkIGNsYXNzIG9mCisvLyAgIHxEZXZpY2VDb250ZXh0UnVubmVyPE9QPnwgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUKKy8vICAgYWJzdHJhY3QgcGVyZm9ybURldmljZU9wZXJhdGlvbihjb25zdCBPUCYgb3ApIG1ldGhvZC4KKy8vCisvLyAtIENyZWF0ZSBhIERldmljZUNvbnRleHRSdW5uZXI8T1A+IGluc3RhbmNlLCBhbmQgY2FsbAorLy8gICBpdHMgaW5pdCgpIG1ldGhvZCwgcGFzc2luZyBhIHZhbGlkIGFuZHJvaWQ6OlZtTG9jaworLy8gICBpbnN0YW5jZSB0byBpdC4gTk9URTogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20KKy8vICAgdGhlIG1haW4gbG9vcCB0aHJlYWQsIGR1cmluZyBlbXVsYXRpb24gc2V0dXAgdGltZSEhCisvLworLy8gLSBXaGVuZXZlciB5b3Ugd2FudCB0byBwZXJmb3JtIGFuIG9wZXJhdGlvbiwgY2FsbAorLy8gICBxdWV1ZURldmljZU9wZXJhdGlvbig8b3A+KSBvbiBpdC4gSWYgdGhlIGN1cnJlbnQKKy8vICAgdGhyZWFkIGhvbGRzIHRoZSBsb2NrLCBpdCB3aWxsIGJlCisvLyAgIHBlcmZvcm1lZCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHF1ZXVlZAorLy8gICBhbmQgcnVuIGxhdGVyLiBIZW5jZSB0aGUgdm9pZCByZXR1cm4gdHlwZSBvZgorLy8gICBxdWV1ZURldmljZU9wZXJhdGlvbjsgaXQgaXMgcnVuIGFzeW5jaHJvbm91c2x5LCBzbworLy8gICB5b3UgY2Fubm90IGV4cGVjdCBhIHJldHVybiB2YWx1ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgRGV2aWNlQ29udGV4dFJ1bm5lciB7CitwdWJsaWM6CisgICAgdXNpbmcgQXV0b0xvY2sgPSBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jazsKKyAgICB1c2luZyBMb2NrID0gYW5kcm9pZDo6YmFzZTo6TG9jazsKKyAgICB1c2luZyBMb29wZXIgPSBhbmRyb2lkOjpiYXNlOjpMb29wZXI7CisgICAgdXNpbmcgVGhyZWFkTG9vcGVyID0gYW5kcm9pZDo6YmFzZTo6VGhyZWFkTG9vcGVyOworICAgIHVzaW5nIFZtTG9jayA9IGFuZHJvaWQ6OlZtTG9jazsKKyAgICB1c2luZyBQZW5kaW5nTGlzdCA9IHN0ZDo6dmVjdG9yPFQ+OworCisgICAgdm9pZCBpbml0KFZtTG9jayogdm1Mb2NrKSB7IGluaXQodm1Mb2NrLCBUaHJlYWRMb29wZXI6OmdldCgpKTsgfQorCisgICAgLy8gTG9vcGVyIHBhcmFtZXRlciBpcyBmb3IgdW5pdCB0ZXN0aW5nIHB1cnBvc2VzLgorICAgIHZvaWQgaW5pdChWbUxvY2sqIHZtTG9jaywgTG9vcGVyKiBsb29wZXIpIHsKKyAgICAgICAgbVZtTG9jayA9IHZtTG9jazsKKyAgICAgICAgLy8gVE9ETyhkaWdpdCk6IEZpbmQgYSBiZXR0ZXIgZXZlbnQgYWJzdHJhY3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE9wZXJhdGluZyBvbiBMb29wZXI6OlRpbWVyIG9iamVjdHMgaXMgbm90IHN1cHBvc2VkIHRvIGJlCisgICAgICAgIC8vIHRocmVhZC1zYWZlLCBidXQgaXQgYXBwZWFycyB0aGF0IHRoZWlyIFFFTVUxIGFuZCBRRU1VMiBzcGVjaWZpYworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiAqaXMqIChzZWUgcWVtdS10aW1lci5jOnRpbWVyX21vZCgpKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGluIHByYWN0aWNlIHRoZSBjb2RlIGJlbG93IGlzIHNhZmUgd2hlbiB1c2VkCisgICAgICAgIC8vIGluIHRoZSBjb250ZXh0IG9mIGFuIEFuZHJvaWQgZW11bGF0aW9uIGVuZ2luZS4gSG93ZXZlciwgd2UgcHJvYmFibHkKKyAgICAgICAgLy8gbmVlZCBhIGJldHRlciBhYnN0cmFjdGlvbiB0aGF0IGFsc28gd29ya3Mgd2l0aCB0aGUgZ2VuZXJpYworICAgICAgICAvLyBMb29wZXIgaW1wbGVtZW50YXRpb24gKGZvciB1bml0LXRlc3RpbmcpIG9yIGFueSBvdGhlciBraW5kIG9mCisgICAgICAgIC8vIHJ1bnRpbWUgZW52aXJvbm1lbnQsIHNob3VsZCB3ZSBvbmUgZGF5IGxpbmsgQW5kcm9pZEVtdSB0byBhCisgICAgICAgIC8vIGRpZmZlcmVudCBlbXVsYXRpb24gZW5naW5lLgorICAgICAgICBtVGltZXIucmVzZXQobG9vcGVyLT5jcmVhdGVUaW1lcigKKyAgICAgICAgICAgICAgICBbXSh2b2lkKiB0aGF0LCBMb29wZXI6OlRpbWVyKikgeworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEZXZpY2VDb250ZXh0UnVubmVyKj4odGhhdCktPm9uVGltZXJFdmVudCgpOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgdGhpcykpOworICAgICAgICBpZiAoIW1UaW1lci5nZXQoKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgbG9vcCB0aW1lciwgZmFsbGluZyBiYWNrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gcmVndWxhciBsb2NraW5nISI7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBUbyBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MgdGhhdCBkZXJpdmVzIERldmljZUNvbnRleHRSdW5uZXI6CisgICAgLy8gdGhlIG1ldGhvZCB0aGF0IGFjdHVhbGx5IHRvdWNoZXMgdGhlIHZpcnR1YWwgZGV2aWNlLgorICAgIHZpcnR1YWwgdm9pZCBwZXJmb3JtRGV2aWNlT3BlcmF0aW9uKGNvbnN0IFQmIG9wKSA9IDA7CisKKyAgICAvLyBxdWV1ZURldmljZU9wZXJhdGlvbjogSWYgdGhlIFZNIGxvY2sgaXMgY3VycmVudGx5IGhlbGQsCisgICAgLy8gd2UgYXJlIE9LIHRvIGFjdHVhbGx5IHBlcmZvcm0gZGV2aWNlIG9wZXJhdGlvbnMuCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGFkZCB0aGUgcmVxdWVzdCB0byBhIHBlbmRpbmcKKyAgICAvLyBzZXQgb2YgcmVxdWVzdHMsIHRvIGJlIGZpbmlzaGVkIGxhdGVyIHdoZW4gd2UgZG8gaGF2ZSB0aGUgVk0gbG9jay4KKyAgICB2b2lkIHF1ZXVlRGV2aWNlT3BlcmF0aW9uKGNvbnN0IFQmIG9wKSB7CisgICAgICAgIGlmIChtVm1Mb2NrLT5pc0xvY2tlZEJ5U2VsZigpKSB7CisgICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBvcGVyYXRpb24gY29ycmVjdGx5IHNpbmNlIHRoZSBjdXJyZW50IHRocmVhZAorICAgICAgICAgICAgLy8gYWxyZWFkeSBob2xkcyB0aGUgbG9jayB0aGF0IHByb3RlY3RzIHRoZSBnbG9iYWwgVk0gc3RhdGUuCisgICAgICAgICAgICBwZXJmb3JtRGV2aWNlT3BlcmF0aW9uKG9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFF1ZXVlIHRoZSBvcGVyYXRpb24gaW4gdGhlIG1QZW5kaW5nTWFwIHN0cnVjdHVyZSwgdGhlbgorICAgICAgICAgICAgLy8gcmVzdGFydCB0aGUgdGltZXIuCisgICAgICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhvcCk7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgICAgICAvLyBOT1RFOiBTZWUgVE9ETyBhYm92ZSB3aHkgdGhpcyBpcyB0aHJlYWQtc2FmZSB3aGVuIHVzZWQgd2l0aAorICAgICAgICAgICAgLy8gUUVNVTEgYW5kIFFFTVUyLgorICAgICAgICAgICAgbVRpbWVyLT5zdGFydEFic29sdXRlKDApOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgb25UaW1lckV2ZW50KCkgeworICAgICAgICAvLyBGaXJzdCwgY2xlYXIgdGhlIGN1cnJlbnQgcGVuZGluZyBzZXQgb2YgZGV2aWNlIGNvbW1hbmRzCisgICAgICAgIC8vIGFuZCBvcGVyYXRlIG9uIGVhY2ggb25lIGluIHR1cm4uCisgICAgICAgIFBlbmRpbmdMaXN0IHBlbmRpbmc7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgICAgICBwZW5kaW5nLnN3YXAobVBlbmRpbmcpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZWx0IDogcGVuZGluZykgeworICAgICAgICAgICAgcGVyZm9ybURldmljZU9wZXJhdGlvbihlbHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkbyBzd2FwKCkgYWJvdmUgc28gdGhhdCB3ZSBjYW4gY2hlY2sgaWYKKyAgICAgICAgLy8gdGhlIHRpbWVyIG5lZWRzIHRvIGJlIHJlLWFybWVkLgorICAgICAgICAvLyAoaWYgc29tZW9uZSBhZGRlZCBhbiBldmVudCBkdXJpbmcgcHJvY2Vzc2luZykKKyAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgIGlmIChtUGVuZGluZy5zaXplKCkpIHsKKyAgICAgICAgICAgIG1UaW1lci0+c3RhcnRBYnNvbHV0ZSgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZtTG9jayogbVZtTG9jayA9IG51bGxwdHI7CisKKyAgICBMb2NrIG1Mb2NrOworICAgIFBlbmRpbmdMaXN0IG1QZW5kaW5nOworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI6OlRpbWVyPiBtVGltZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9EZXZpY2VDb250ZXh0UnVubmVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vRGV2aWNlQ29udGV4dFJ1bm5lcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5ZDA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vRGV2aWNlQ29udGV4dFJ1bm5lcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxODkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vRGV2aWNlQ29udGV4dFJ1bm5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3Rlc3RpbmcvVGVzdFZtTG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL1ZtTG9jay5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8vIFRoZSBEZXZpY2VDb250ZXh0UnVubmVyIHVuaXQgdGVzdHMgdXNlOgorLy8gLSBhIGRldmljZSB0aGF0IGp1c3QgaG9sZHMgdGhlIHJlcXVlc3RzIHNlbnQgdG8gaXQsCisvLyAgIGluIG9yZGVyLgorc3RydWN0IERldmljZUNvbnRleHRSdW5uZXJUZXN0RGV2aWNlIHsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHJlcXVlc3RzOworfTsKKy8vICAgV2Uga2VlcCBqdXN0IG9uZSBpbnN0YW5jZSBvZiB0aGlzIGFyb3VuZDoKK3N0YXRpYyBMYXp5SW5zdGFuY2U8RGV2aWNlQ29udGV4dFJ1bm5lclRlc3REZXZpY2U+IHNUZXN0RGV2aWNlID0KKyAgICBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK3N0YXRpYyBEZXZpY2VDb250ZXh0UnVubmVyVGVzdERldmljZSogZ2V0VGVzdERldmljZSgpIHsKKyAgICByZXR1cm4gc1Rlc3REZXZpY2UucHRyKCk7Cit9CisvLyAgIEFuZCB3ZSBjYW4gcmVzZXQgdGhlIHJlcXVlc3RzIHVzaW5nIHRoaXMgZnVuY3Rpb246CitzdGF0aWMgdm9pZCByZXNldFRlc3REZXZpY2UoKSB7CisgICAgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0cy5jbGVhcigpOworfQorLy8gLSBBbiBvcGVyYXRpb24gdHlwZSB0aGF0IGhvbGRzIHNvbWUgcmVxdWVzdCBjb2RlCisvLyAgIHRoYXQgaXMgc2VudCB0byB0aGUgZGV2aWNlLgorc3RydWN0IERldmljZUNvbnRleHRSdW5uZXJUZXN0T3AgeworICAgIGludCByZXF1ZXN0X2NvZGU7Cit9OworLy8gLSBBIERldmljZUNvbnRleHRSdW5uZXIgZGVyaXZlZCBjbGFzcyBmb3IgdGhhdCBvcGVyYXRpb24gdHlwZSwKKy8vICAgd2l0aCBwZXJmb3JtRGV2aWNlT3BlcmF0aW9uIGFwcGVuZGluZyB0aGUgcmVxdWVzdCBjb2RlCisvLyAgIHRvIHRoZSBkZXZpY2UncyB8cmVxdWVzdHN8IGZpZWxkOgorY2xhc3MgVGVzdERldmljZUNvbnRleHRSdW5uZXIgOgorICAgIHB1YmxpYyBEZXZpY2VDb250ZXh0UnVubmVyPERldmljZUNvbnRleHRSdW5uZXJUZXN0T3A+IHsKK3B1YmxpYzoKKyAgICB2b2lkIHNpZ25hbChjb25zdCBEZXZpY2VDb250ZXh0UnVubmVyVGVzdE9wJiBvcCkgeworICAgICAgICBxdWV1ZURldmljZU9wZXJhdGlvbihvcCk7CisgICAgfQorcHJpdmF0ZToKKyAgICB2b2lkIHBlcmZvcm1EZXZpY2VPcGVyYXRpb24oY29uc3QgRGV2aWNlQ29udGV4dFJ1bm5lclRlc3RPcCYgb3ApIHsKKyAgICAgICAgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0cy5wdXNoX2JhY2sob3AucmVxdWVzdF9jb2RlKTsKKyAgICB9Cit9OworCitURVNUKERldmljZUNvbnRleHRSdW5uZXIsIGluaXQpIHsKKyAgICByZXNldFRlc3REZXZpY2UoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IHRlc3RMb29wZXIoTG9vcGVyOjpjcmVhdGUoKSk7CisgICAgVGVzdFZtTG9jayB0ZXN0TG9jazsKKyAgICBUZXN0RGV2aWNlQ29udGV4dFJ1bm5lciB0ZXN0UnVubmVyOworICAgIHRlc3RSdW5uZXIuaW5pdCgmdGVzdExvY2ssIHRlc3RMb29wZXIuZ2V0KCkpOworCisgICAgRVhQRUNUX0VRKDAsIGdldFRlc3REZXZpY2UoKS0+cmVxdWVzdHMuc2l6ZSgpKTsKKworICAgIHJlc2V0VGVzdERldmljZSgpOworfTsKKworVEVTVChEZXZpY2VDb250ZXh0UnVubmVyLCBvbmVSZXF1ZXN0KSB7CisgICAgcmVzZXRUZXN0RGV2aWNlKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyPiB0ZXN0TG9vcGVyKExvb3Blcjo6Y3JlYXRlKCkpOworCisgICAgVGVzdFZtTG9jayB0ZXN0TG9jazsKKworICAgIHRlc3RMb2NrLmxvY2soKTsKKworICAgIFRlc3REZXZpY2VDb250ZXh0UnVubmVyIHRlc3RSdW5uZXI7CisgICAgdGVzdFJ1bm5lci5pbml0KCZ0ZXN0TG9jaywgdGVzdExvb3Blci5nZXQoKSk7CisKKyAgICAvLyBXZSBoYXZlIHRoZSBsb2NrLCBzbyB0aGlzIHNob3VsZCBpbW1lZGlhdGVseQorICAgIC8vIGdvIHRvIHRoZSBkZXZpY2UuCisgICAgdGVzdFJ1bm5lci5zaWduYWwoeyAucmVxdWVzdF9jb2RlID0gMSB9KTsKKyAgICBFWFBFQ1RfRVEoMSwgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0cy5zaXplKCkpOworCisgICAgdGVzdExvY2sudW5sb2NrKCk7CisKKyAgICByZXNldFRlc3REZXZpY2UoKTsKK30KKworVEVTVChEZXZpY2VDb250ZXh0UnVubmVyLCBvbmVSZXF1ZXN0TmVlZFdhaXQpIHsKKyAgICByZXNldFRlc3REZXZpY2UoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IHRlc3RMb29wZXIoTG9vcGVyOjpjcmVhdGUoKSk7CisKKyAgICBUZXN0Vm1Mb2NrIHRlc3RMb2NrOworCisgICAgVGVzdERldmljZUNvbnRleHRSdW5uZXIgdGVzdFJ1bm5lcjsKKyAgICB0ZXN0UnVubmVyLmluaXQoJnRlc3RMb2NrLCB0ZXN0TG9vcGVyLmdldCgpKTsKKworICAgIC8vIFdlIGRvbid0IGhhdmUgdGhlIGxvY2ssIGJ1dCB0aGUgZGV2aWNlIHNob3VsZAorICAgIC8vIGdldCB0aGUgcmVxdWVzdCBhZnRlciB3ZSBkbyBoYXZlIHRoZSBsb2NrLgorICAgIHRlc3RSdW5uZXIuc2lnbmFsKHsgLnJlcXVlc3RfY29kZSA9IDEgfSk7CisKKyAgICB0ZXN0TG9jay5sb2NrKCk7CisgICAgdGVzdExvb3Blci0+cnVuKCk7CisgICAgdGVzdExvY2sudW5sb2NrKCk7CisKKyAgICBFWFBFQ1RfRVEoMSwgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0cy5zaXplKCkpOworCisgICAgcmVzZXRUZXN0RGV2aWNlKCk7Cit9CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga051bVJlcXVlc3RzID0gMTAwOworCitURVNUKERldmljZUNvbnRleHRSdW5uZXIsIG11bHRpUmVxdWVzdHMpIHsKKyAgICByZXNldFRlc3REZXZpY2UoKTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxMb29wZXI+IHRlc3RMb29wZXIoTG9vcGVyOjpjcmVhdGUoKSk7CisKKyAgICBUZXN0Vm1Mb2NrIHRlc3RMb2NrOworCisgICAgdGVzdExvY2subG9jaygpOworCisgICAgVGVzdERldmljZUNvbnRleHRSdW5uZXIgdGVzdFJ1bm5lcjsKKyAgICB0ZXN0UnVubmVyLmluaXQoJnRlc3RMb2NrLCB0ZXN0TG9vcGVyLmdldCgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgdGVzdFJ1bm5lci5zaWduYWwoeyAucmVxdWVzdF9jb2RlID0gKGludClpIH0pOworICAgIH0KKworICAgIHRlc3RMb2NrLnVubG9jaygpOworCisgICAgRVhQRUNUX0VRKGtOdW1SZXF1ZXN0cywgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0cy5zaXplKCkpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgcmVzdWx0cyA9CisgICAgICAgIGdldFRlc3REZXZpY2UoKS0+cmVxdWVzdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoaSwgcmVzdWx0c1tpXSk7CisgICAgfQorCisgICAgcmVzZXRUZXN0RGV2aWNlKCk7Cit9CisKK1RFU1QoRGV2aWNlQ29udGV4dFJ1bm5lciwgbXVsdGlSZXF1ZXN0c05lZWRXYWl0KSB7CisgICAgcmVzZXRUZXN0RGV2aWNlKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TG9vcGVyPiB0ZXN0TG9vcGVyKExvb3Blcjo6Y3JlYXRlKCkpOworCisgICAgVGVzdFZtTG9jayB0ZXN0TG9jazsKKworICAgIFRlc3REZXZpY2VDb250ZXh0UnVubmVyIHRlc3RSdW5uZXI7CisgICAgdGVzdFJ1bm5lci5pbml0KCZ0ZXN0TG9jaywgdGVzdExvb3Blci5nZXQoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHRlc3RSdW5uZXIuc2lnbmFsKHsgLnJlcXVlc3RfY29kZSA9IChpbnQpaSB9KTsKKyAgICB9CisKKyAgICB0ZXN0TG9jay5sb2NrKCk7CisgICAgdGVzdExvb3Blci0+cnVuKCk7CisgICAgdGVzdExvY2sudW5sb2NrKCk7CisKKyAgICBFWFBFQ1RfRVEoa051bVJlcXVlc3RzLCBnZXRUZXN0RGV2aWNlKCktPnJlcXVlc3RzLnNpemUoKSk7CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiByZXN1bHRzID0KKyAgICAgICAgZ2V0VGVzdERldmljZSgpLT5yZXF1ZXN0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShpLCByZXN1bHRzW2ldKTsKKyAgICB9CisKKyAgICByZXNldFRlc3REZXZpY2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9Hb2xkZmlzaFN5bmNDb21tYW5kUXVldWUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9Hb2xkZmlzaFN5bmNDb21tYW5kUXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZS5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYmFzZTo6TGF6eUluc3RhbmNlPEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZT4KK0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZTo6c0NvbW1hbmRRdWV1ZSA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworLy8gc3RhdGljCit2b2lkIEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZTo6aW5pdFRocmVhZGluZyhWbUxvY2sqIHZtTG9jaykgeworICAgIHNDb21tYW5kUXVldWUucHRyKCktPmluaXQodm1Mb2NrKTsKK30KKworLy8gc3RhdGljCit2b2lkIEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZTo6c2V0UXVldWVDb21tYW5kKHF1ZXVlX2RldmljZV9jb21tYW5kX3QgZngpIHsKKyAgICBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWUqIGNtZFF1ZXVlID0gc0NvbW1hbmRRdWV1ZS5wdHIoKTsKKyAgICBjbWRRdWV1ZS0+dGVsbFN5bmNEZXZpY2UgPSBmeDsKK30KKworLy8gc3RhdGljCit2b2lkIEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZTo6aG9zdFNpZ25hbCh1aW50MzJfdCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0aW1lX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGhvc3RjbWRfaGFuZGxlKSB7CisKKyAgICBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWUqIHF1ZXVlID0gc0NvbW1hbmRRdWV1ZS5wdHIoKTsKKworICAgIEdvbGRmaXNoU3luY1dha2VJbmZvIHN5bmNfZGF0YTsKKyAgICBzeW5jX2RhdGEuY21kID0gY21kOworICAgIHN5bmNfZGF0YS5oYW5kbGUgPSBoYW5kbGU7CisgICAgc3luY19kYXRhLnRpbWVfYXJnID0gdGltZV9hcmc7CisgICAgc3luY19kYXRhLmhvc3RjbWRfaGFuZGxlID0gaG9zdGNtZF9oYW5kbGU7CisKKyAgICBxdWV1ZS0+cXVldWVEZXZpY2VPcGVyYXRpb24oc3luY19kYXRhKTsKK30KKwordm9pZCBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWU6OnBlcmZvcm1EZXZpY2VPcGVyYXRpb24KKyAgICAoY29uc3QgR29sZGZpc2hTeW5jV2FrZUluZm8mIHdha2VJbmZvKSB7CisgICAgdGVsbFN5bmNEZXZpY2Uod2FrZUluZm8uY21kLAorICAgICAgICAgICAgICAgICAgIHdha2VJbmZvLmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICB3YWtlSW5mby50aW1lX2FyZywKKyAgICAgICAgICAgICAgICAgICB3YWtlSW5mby5ob3N0Y21kX2hhbmRsZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vR29sZGZpc2hTeW5jQ29tbWFuZFF1ZXVlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTkwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL0dvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9EZXZpY2VDb250ZXh0UnVubmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vZ29sZGZpc2hfc3luYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL1ZtTG9jay5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHCisjZGVmaW5lIERQUklOVCguLi4pIGRvIHsgXAorICAgIGlmICghVkVSQk9TRV9DSEVDSyhnb2xkZmlzaHN5bmMpKSBWRVJCT1NFX0VOQUJMRShnb2xkZmlzaHN5bmMpOyBcCisgICAgVkVSQk9TRV9USURfRlVOQ1RJT05fRFBSSU5UKGdvbGRmaXNoc3luYywgX19WQV9BUkdTX18pOyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBEUFJJTlQoLi4uKQorI2VuZGlmCisKKyNkZWZpbmUgRVJSKC4uLikgZG8geyBcCisgICAgZGVycm9yKF9fVkFfQVJHU19fKTsgXAorfSB3aGlsZSgwKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWUgZW5zdXJlcyB0aGF0IGNvbW1hbmRzIHNlbnQgdG8gdGhlIEdvbGRmaXNoIFN5bmMKKy8vIHZpcnR1YWwgZGV2aWNlIHRha2UgcGxhY2UgaW4gImRldmljZSBjb250ZXh0IjsgdGhhdCBpcywgdGhlIGNvbW1hbmRzCisvLyBhcmUgb25seSBleGVjdXRlZCB3aGlsZSB0aGUgbWFpbiBsb29wIGhhcyB0aGUgVk0gbG9jay4gTGlrZSBQaXBlV2FrZXIKKy8vIG9mIEFuZHJvaWRQaXBlLCB0aGlzIGNsYXNzIGRlcml2ZXMgZnJvbSBEZXZpY2VDb250ZXh0UnVubmVyIGZvciB0aGlzCisvLyBmdW5jdGlvbmFsaXR5LgorLy8gVGhpcyBjbGFzcyBpcyBvbmx5IHVzZWQgZm9yIGhvc3QtPmd1ZXN0IGNvbW1hbmRzIGZvciBnb2xkZmlzaCBzeW5jIGRldmljZSwKKy8vIGFuZCBtYWlubHkgdGltZWxpbmUgaW5jcmVtZW50IGF0IHRoYXQuIFRoZSB3YXkgdG8gdXNlCisvLyBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWUgaW4gZ2VuZXJhbCBpcyB0byBjYWxsIHxob3N0U2lnbmFsfCB3aXRoIHRoZQorLy8gcGFydGljdWxhciBkZXRhaWxzIG9mIHRoZSBob3N0LT5ndWVzdCBjb21tYW5kIGJlaW5nIGlzc3VlZC4KKy8vCisvLyBIb3dldmVyLCBtYWtlIHN1cmUgdGhhdCB8c2V0UXVldWVDb21tYW5kfCBoYXMgYmVlbiBjYWxsZWQgb24KKy8vIGdvbGRpZmlzaCBzeW5jIGRldmljZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggcHJvcGVybHkgaG9va3MgdXAgdGhlCisvLyBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWUgd2l0aCB0aGUgcGFydGljdWxhciB2aXJ0dWFsIGRldmljZSBmdW5jdGlvbgorLy8gdGhhdCBhY3R1YWxseSByYWlzZXMgSVJRJ3MsIGFuZCB0aGF0IHxpbml0VGhyZWFkaW5nfCBoYXMgYmVlbiBjYWxsZWQKKy8vIGluIGEgbWFpbiBsb29wIGNvbnRleHQsIHByZWZlcmFibHkgaW4gcWVtdS1zZXR1cC5jcHAuCisKK3N0cnVjdCBHb2xkZmlzaFN5bmNXYWtlSW5mbyB7CisgICAgdWludDY0X3QgaGFuZGxlOworICAgIHVpbnQ2NF90IGhvc3RjbWRfaGFuZGxlOworICAgIHVpbnQzMl90IGNtZDsKKyAgICB1aW50MzJfdCB0aW1lX2FyZzsKK307CisKK2NsYXNzIEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZSBmaW5hbCA6CisgICAgcHVibGljIERldmljZUNvbnRleHRSdW5uZXI8R29sZGZpc2hTeW5jV2FrZUluZm8+IHsKKworcHVibGljOgorICAgIC8vIExpa2Ugd2l0aCB0aGUgUGlwZVdha2VyIGZvciBBbmRyb2lkUGlwZSwKKyAgICAvLyB3ZSBuZWVkIHRvIHByb2Nlc3MgYWxsIGNvbW1hbmRzCisgICAgLy8gaW4gYSBjb250ZXh0IHdoZXJlIHdlIGhvbGQgdGhlIFZNIGxvY2suCisgICAgc3RhdGljIHZvaWQgaW5pdFRocmVhZGluZyhWbUxvY2sqIHZtTG9jayk7CisKKyAgICAvLyBHb2xkZmlzaCBzeW5jIHZpcnR1YWwgZGV2aWNlIHdpbGwgZ2l2ZSBvdXQgaXRzIG93bgorICAgIC8vIGNhbGxiYWNrIGZvciBxdWV1ZWluZyBjb21tYW5kcyB0byBpdC4KKyAgICBzdGF0aWMgdm9pZCBzZXRRdWV1ZUNvbW1hbmQocXVldWVfZGV2aWNlX2NvbW1hbmRfdCBmeCk7CisKKyAgICAvLyBNYWluIGludGVyZmFjZSBmb3IgYWxsIEdvbGRmaXNoIHN5bmMgZGV2aWNlCisgICAgLy8gY29tbXVuaWNhdGlvbnMuCisgICAgc3RhdGljIHZvaWQgaG9zdFNpZ25hbCh1aW50MzJfdCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0aW1lX2FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGhvc3RjbWRfaGFuZGxlKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZT4gc0NvbW1hbmRRdWV1ZTsKKyAgICB2aXJ0dWFsIHZvaWQgcGVyZm9ybURldmljZU9wZXJhdGlvbihjb25zdCBHb2xkZmlzaFN5bmNXYWtlSW5mbyYgY21kKSBvdmVycmlkZTsKKworICAgIHF1ZXVlX2RldmljZV9jb21tYW5kX3QgdGVsbFN5bmNEZXZpY2UgPSBudWxscHRyOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1MTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdC5jcHAKQEAgLTAsMCArMSw4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NpemVfdCBQYXJhbWV0ZXJMaXN0OjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtUGFyYW1zLnNpemUoKTsKK30KKworY2hhcioqIFBhcmFtZXRlckxpc3Q6OmFycmF5KCkgY29uc3QgeworICAgIGlmIChtQXJyYXkuZW1wdHkoKSAmJiAhbVBhcmFtcy5lbXB0eSgpKSB7CisgICAgICAgIG1BcnJheS5yZXNpemUobVBhcmFtcy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IG1QYXJhbXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgICAgIG1BcnJheVtuXSA9IGNvbnN0X2Nhc3Q8Y2hhcio+KCYobVBhcmFtc1tuXVswXSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAmbUFycmF5WzBdOworfQorCitzdGQ6OnN0cmluZyBQYXJhbWV0ZXJMaXN0Ojp0b1N0cmluZygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBtUGFyYW1zLnNpemUoKTsgKytuKSB7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgcmVzdWx0ICs9ICcgJzsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gbVBhcmFtc1tuXTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY2hhciogUGFyYW1ldGVyTGlzdDo6dG9DU3RyaW5nQ29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6c3RyRHVwKHRvU3RyaW5nKCkpOworfQorCit2b2lkIFBhcmFtZXRlckxpc3Q6OmFkZChjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0pIHsKKyAgICBtUGFyYW1zLnB1c2hfYmFjayhwYXJhbSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTGlzdDo6YWRkKHN0ZDo6c3RyaW5nJiYgcGFyYW0pIHsKKyAgICBtUGFyYW1zLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocGFyYW0pKTsKK30KKwordm9pZCBQYXJhbWV0ZXJMaXN0OjphZGRGb3JtYXRSYXcoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBhZGRGb3JtYXRXaXRoQXJncyhmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKwordm9pZCBQYXJhbWV0ZXJMaXN0OjphZGRGb3JtYXRXaXRoQXJncyhjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncykgeworICAgIGFkZChhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXRXaXRoQXJncyhmb3JtYXQsIGFyZ3MpKTsKK30KKwordm9pZCBQYXJhbWV0ZXJMaXN0OjphZGQyKGNvbnN0IGNoYXIqIHBhcmFtMSwgY29uc3QgY2hhciogcGFyYW0yKSB7CisgICAgbVBhcmFtcy5wdXNoX2JhY2socGFyYW0xKTsKKyAgICBtUGFyYW1zLnB1c2hfYmFjayhwYXJhbTIpOworfQorCit2b2lkIFBhcmFtZXRlckxpc3Q6OmFkZElmKGNvbnN0IGNoYXIqIHBhcmFtLCBib29sIGZsYWcpIHsKKyAgICBpZiAoZmxhZykgeworICAgICAgICBhZGQocGFyYW0pOworICAgIH0KK30KKwordm9pZCBQYXJhbWV0ZXJMaXN0OjphZGQySWYoY29uc3QgY2hhciogcGFyYW0xLCBjb25zdCBjaGFyKiBwYXJhbTIpIHsKKyAgICBpZiAocGFyYW0yKSB7CisgICAgICAgIGFkZDIocGFyYW0xLCBwYXJhbTIpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFkMmIxMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDb252ZW5pZW5jZSBjbGFzcyB1c2VkIHRvIGJ1aWxkIGEgc3BhY2UtYmFzZWQgcGFyYW1ldGVyIGxpc3QgaW5jcmVtZW50YWxseS4KKy8vIFVzYWdlIGV4YW1wbGU6CisvLyAgIDEvIENyZWF0ZSBuZXcgaW5zdGFuY2UuCisvLyAgIDIvIEFkZCBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgd2l0aCBhZGQoKSwgYWRkMigpLCBhZGRJZigpIG9yIGFkZDJJZigpCisvLyAgIDMvIFJldHJpZXZlIGZpbmFsIHJlc3VsdCBhcyBhIHNpbmdsZSBzdHJpbmcgd2l0aCB0b1N0cmluZygpIG9yCisvLyAgICAgIHRvQ1N0cmluZygpLgorLy8gICA0LyBBbHRlcm5hdGl2ZWx5LCByZXRyaWV2ZSB0aGUgbGlzdCdzIHNpemUgd2l0aCBzaXplKCksIGFuZCBpbmRpdmlkdWFsCisvLyAgICAgIHBhcmFtZXRlcnMgYXMgYSBjaGFyKiBhcnJheSB3aXRoIGFycmF5KCkuCitjbGFzcyBQYXJhbWV0ZXJMaXN0IHsKK3B1YmxpYzoKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIFBhcmFtZXRlckxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIGEgY2hhciogYXJyYXkgb2Ygc2l6ZSgpIGl0ZW1zIHRoYXQgcG9pbnRzIHRvIHRoZSBjb250ZW50IG9mCisgICAgLy8gaW5kaXZpZHVhbCBpdGVtcy4KKyAgICBjaGFyKiogYXJyYXkoKSBjb25zdDsKKworICAgIC8vIEFjY2VzcyB8bi10aHwgaXRlbXMgaW4gdGhlIGxpc3QuIFdBUk5JTkc6IERvZXMgbm90IGNoZWNrIGJvdW5kcy4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3BlcmF0b3JbXShzaXplX3QgbikgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtc1tuXTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGxpc3QgaW50byBhIHN0ZDo6c3RyaW5nLiBUaGlzIGpvaW5zIGFsbCBwYXJhbWV0ZXJzIHdpdGggYQorICAgIC8vIHNpbmdsZSBzcGFjZS4KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCisgICAgLy8gQSB2YXJpYW50IG9mIHRvU3RyaW5nKCkgdGhhdCByZXR1cm5zIGluc3RlYWQgYSBoZWFwLWFsbG9jYXRlZCBDIHN0cmluZworICAgIC8vIHRoYXQgbXVzdCBiZSBmcmVlLWQgYnkgdGhlIGNhbGxlci4KKyAgICBjaGFyKiB0b0NTdHJpbmdDb3B5KCkgY29uc3Q7CisKKyAgICAvLyBBZGQgbmV3IHBhcmFtZXRlciB8cGFyYW18IHRvIHRoZSBsaXN0LgorICAgIHZvaWQgYWRkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbSk7CisKKyAgICAvLyBOb3RlOiB0aGlzIHdpbGwgYWxzbyBoYW5kbGUgY29uc3QgY2hhciogcGFyYW1ldGVycyBhdXRvbWF0aWNhbGx5LgorICAgIHZvaWQgYWRkKHN0ZDo6c3RyaW5nJiYgcGFyYW0pOworCisgICAgLy8gQWRkIGEgbmV3IHBhcmFtZXRlciBmcm9tIGEgcHJpbnRmLWZvcm1hdHRlZCBzdHJpbmcuCisgICAgLy8gfGZvcm1hdHwgaXMgYSBwcmludGYtbGlrZSBmb3JtYXR0aW5nIHN0cmluZywgZm9sbG93ZWQgYnkgb3B0aW9uYWwKKyAgICAvLyBwYXJhbWV0ZXJzLiBVc2VycyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIGFkZEZvcm1hdCgpIGluc3RlYWQuCisgICAgdm9pZCBhZGRGb3JtYXRSYXcoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisgICAgLy8gVmFyaWFudCBvZiBhZGRGb3JtYXRSYXcoKSB0aGF0IHVzZXMgYSB2YV9saXN0IHRvIHBhc3MgdGhlIGZvcm1hdHRpbmcKKyAgICAvLyBhcmd1bWVudHMuCisgICAgdm9pZCBhZGRGb3JtYXRXaXRoQXJncyhjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisKKyAgICAvLyBUaGVzZSB0ZW1wbGF0ZWQgdmVyc2lvbnMgb2YgU3RyaW5nRm9ybWF0KigpIGFsbG93IG9uZSB0byBwYXNzIGFsbCBraW5kcyBvZgorICAgIC8vIHN0cmluZyBvYmplY3RzIGludG8gdGhlIGFyZ3VtZW50IGxpc3QKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgICB2b2lkIGFkZEZvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgICAgIHJldHVybiBhZGRGb3JtYXRSYXcoZm9ybWF0LCBhbmRyb2lkOjpiYXNlOjp1bnBhY2tGb3JtYXRBcmcoCisgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpKS4uLik7CisgICAgfQorCisgICAgLy8gQWRkIHR3byBuZXcgcGFyYW1ldGVycyB8cGFyYW0xfCBhbmQgfHBhcmFtMnwgdG8gdGhlIGxpc3QuCisgICAgdm9pZCBhZGQyKGNvbnN0IGNoYXIqIHBhcmFtMSwgY29uc3QgY2hhciogcGFyYW0yKTsKKworICAgIC8vIEFkZCBwYXJhbWV0ZXIgfHBhcmFtfCB0byB0aGUgbGlzdCBpZmYgfGZsYWd8IGlzIHRydWUuCisgICAgdm9pZCBhZGRJZihjb25zdCBjaGFyKiBwYXJhbSwgYm9vbCBmbGFnKTsKKworICAgIC8vIEFkZCBwYXJhbWV0ZXJzIHxwYXJhbTF8IGFuZCB8cGFyYW0yfCBpZmYgfHBhcmFtMnwgaXMgbm90IG51bGxwdHIuCisgICAgdm9pZCBhZGQySWYoY29uc3QgY2hhciogcGFyYW0xLCBjb25zdCBjaGFyKiBwYXJhbTIpOworCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGFyYW1zOworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8Y2hhciAqPiBtQXJyYXk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0X3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjZjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vUGFyYW1ldGVyTGlzdC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitURVNUKFBhcmFtZXRlckxpc3QsIENvbnN0cnVjdGlvbikgeworICAgIFBhcmFtZXRlckxpc3QgbGlzdDsKKyAgICBFWFBFQ1RfRVEoMFUsIGxpc3Quc2l6ZSgpKTsKKworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygpLCBsaXN0LnRvU3RyaW5nKCkpOworCisgICAgY2hhciogc3RyID0gbGlzdC50b0NTdHJpbmdDb3B5KCk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBzdHIpOworICAgIDo6ZnJlZShzdHIpOworfQorCitURVNUKFBhcmFtZXRlckxpc3QsIEFkZCkgeworICAgIFBhcmFtZXRlckxpc3QgbGlzdDsKKyAgICBsaXN0LmFkZCgiZm9vIik7CisgICAgbGlzdC5hZGQoc3RkOjpzdHJpbmcoImJhciIpKTsKKyAgICBsaXN0LmFkZChzdGQ6Om1vdmUoc3RkOjpzdHJpbmcoInpvbyIpKSk7CisKKyAgICBFWFBFQ1RfRVEoM1UsIGxpc3Quc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIGxpc3RbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBsaXN0WzFdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiem9vIiwgbGlzdFsyXS5jX3N0cigpKTsKK30KKworVEVTVChQYXJhbWV0ZXJMaXN0LCBBZGRGb3JtYXQpIHsKKyAgICBQYXJhbWV0ZXJMaXN0IGxpc3Q7CisgICAgbGlzdC5hZGRGb3JtYXQoIkhlbGxvIFdvcmxkIik7CisgICAgbGlzdC5hZGRGb3JtYXQoIiVzPSVzIiwgImZvbyIsICJiYXIiKTsKKyAgICBsaXN0LmFkZEZvcm1hdCgiJXMtJXMiLCBzdGQ6OnN0cmluZygiem9vIiksIHN0ZDo6c3RyaW5nKCJjcmFiIikpOworCisgICAgRVhQRUNUX0VRKDNVLCBsaXN0LnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJIZWxsbyBXb3JsZCIsIGxpc3RbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb289YmFyIiwgbGlzdFsxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInpvby1jcmFiIiwgbGlzdFsyXS5jX3N0cigpKTsKK30KKworCitURVNUKFBhcmFtZXRlckxpc3QsIEFkZDIpIHsKKyAgICBQYXJhbWV0ZXJMaXN0IGxpc3Q7CisgICAgbGlzdC5hZGQyKCJmb28iLCAiYmFyIik7CisgICAgRVhQRUNUX0VRKDJVLCBsaXN0LnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb28iLCBsaXN0WzBdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYmFyIiwgbGlzdFsxXS5jX3N0cigpKTsKK30KKworVEVTVChQYXJhbWV0ZXJMaXN0LCBBZGRJZikgeworICAgIFBhcmFtZXRlckxpc3QgbGlzdDsKKyAgICBsaXN0LmFkZElmKCJmb28iLCB0cnVlKTsKKyAgICBsaXN0LmFkZElmKCJiYXIiLCBmYWxzZSk7CisgICAgbGlzdC5hZGRJZigiem9vIiwgdHJ1ZSk7CisKKyAgICBFWFBFQ1RfRVEoMlUsIGxpc3Quc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIGxpc3RbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJ6b28iLCBsaXN0WzFdLmNfc3RyKCkpOworfQorCitURVNUKFBhcmFtZXRlckxpc3QsIEFkZDJJZikgeworICAgIFBhcmFtZXRlckxpc3QgbGlzdDsKKyAgICBsaXN0LmFkZDJJZigiZm9vIiwgImJhciIpOworICAgIGxpc3QuYWRkMklmKCJ6b28iLCBudWxscHRyKTsKKyAgICBsaXN0LmFkZDJJZigidW5kZXIiLCAib3ZlciIpOworCisgICAgRVhQRUNUX0VRKDRVLCBsaXN0LnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb28iLCBsaXN0WzBdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYmFyIiwgbGlzdFsxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInVuZGVyIiwgbGlzdFsyXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm92ZXIiLCBsaXN0WzNdLmNfc3RyKCkpOworfQorCitURVNUKFBhcmFtZXRlckxpc3QsIHRvU3RyaW5nKSB7CisgICAgUGFyYW1ldGVyTGlzdCBsaXN0OworICAgIGxpc3QuYWRkMigiZm9vIiwgImJhciIpOworICAgIGxpc3QuYWRkKCJ6b28iKTsKKyAgICBFWFBFQ1RfRVEoM1UsIGxpc3Quc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyBiYXIgem9vIiwgbGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworfQorCitURVNUKFBhcmFtZXRlckxpc3QsIHRvQ1N0cmluZ0NvcHkpIHsKKyAgICBQYXJhbWV0ZXJMaXN0IGxpc3Q7CisgICAgbGlzdC5hZGQyKCJmb28iLCAiYmFyIik7CisgICAgbGlzdC5hZGQoInpvbyIpOworICAgIEVYUEVDVF9FUSgzVSwgbGlzdC5zaXplKCkpOworICAgIGNoYXIqIHN0ciA9IGxpc3QudG9DU3RyaW5nQ29weSgpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vIGJhciB6b28iLCBzdHIpOworICAgIDo6ZnJlZShzdHIpOworfQorCitURVNUKFBhcmFtZXRlckxpc3QsIGFycmF5KSB7CisgICAgUGFyYW1ldGVyTGlzdCBsaXN0OworICAgIGxpc3QuYWRkMigiZm9vIiwgImJhciIpOworICAgIGxpc3QuYWRkKCJ6b28iKTsKKyAgICBFWFBFQ1RfRVEoM1UsIGxpc3Quc2l6ZSgpKTsKKyAgICBjaGFyKiogYXJyYXkgPSBsaXN0LmFycmF5KCk7CisgICAgRVhQRUNUX1RSVUUoYXJyYXkpOworICAgIEVYUEVDVF9TVFJFUSgiZm9vIiwgYXJyYXlbMF0pOworICAgIEVYUEVDVF9TVFJFUSgiYmFyIiwgYXJyYXlbMV0pOworICAgIEVYUEVDVF9TVFJFUSgiem9vIiwgYXJyYXlbMl0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9TZXJpYWxMaW5lLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2VyaWFsTGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNGZmNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2VyaWFsTGluZS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9TZXJpYWxMaW5lLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCB0byBlbnN1cmUgdGhlIGxpYnJhcnkgYnVpbGRzCisvLyBhcyBhIHN0YW5kLWFsb25lIHVuaXQsIGJ1dCBhbnkgdGVzdGluZyByZXF1aXJlcyBhIHNwZWNpZmljCisvLyBpbXBsZW1lbnRhdGlvbiBpbmplY3RlZCB0aHJvdWdoIFNlcmlhbExpbmU6OkZ1bmNzOjpyZXNldCgpCisKK3N0YXRpYyBTZXJpYWxMaW5lKiBudWxsT3BlbkJ1ZmZlcihTZXJpYWxMaW5lKiBzbCkgeworICAgIHJldHVybiBudWxscHRyOworfQorCitzdGF0aWMgYm9vbCBudWxsT3BlblBpcGUoU2VyaWFsTGluZSoqIHBmaXJzdCwgU2VyaWFsTGluZSoqIHBzZWNvbmQpIHsKKyAgICAqcGZpcnN0ID0gbnVsbHB0cjsKKyAgICAqcHNlY29uZCA9IG51bGxwdHI7CisgICAgcmV0dXJuIGZhbHNlOworfTsKKworc3RhdGljIGNvbnN0IFNlcmlhbExpbmU6OkZ1bmNzIGtOdWxsRnVuY3MgPSB7CisgICAgLm9wZW5CdWZmZXIgPSBudWxsT3BlbkJ1ZmZlciwKKyAgICAub3BlblBpcGUgPSBudWxsT3BlblBpcGUsCit9OworCitzdGF0aWMgY29uc3QgU2VyaWFsTGluZTo6RnVuY3MqIHNGdW5jcyA9ICZrTnVsbEZ1bmNzOworCisvLyBzdGF0aWMKK2NvbnN0IFNlcmlhbExpbmU6OkZ1bmNzKiBTZXJpYWxMaW5lOjpGdW5jczo6Z2V0KCkgeworICAgIHJldHVybiBzRnVuY3M7Cit9CisKKy8vIHN0YXRpYworY29uc3QgU2VyaWFsTGluZTo6RnVuY3MqIFNlcmlhbExpbmU6OkZ1bmNzOjpyZXNldCgKKyAgICAgICAgY29uc3QgU2VyaWFsTGluZTo6RnVuY3MqIGZ1bmNzKSB7CisgICAgY29uc3QgU2VyaWFsTGluZTo6RnVuY3MqIHJlc3VsdCA9IHNGdW5jczsKKyAgICBzRnVuY3MgPSBmdW5jcyA/IGZ1bmNzIDogJmtOdWxsRnVuY3M7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2VyaWFsTGluZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9TZXJpYWxMaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VjZjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2VyaWFsTGluZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisKKy8vIFRoaXMgaXMgYSBDKysgaW50ZXJmYWNlIGZvciBhIFNlcmlhbExpbmUgYWJzdHJhY3Rpb24sIGJhc2VkCisvLyBvbiBRRU1VJ3MgY2hhcmFjdGVyIGRldmljZSAoY2hhci5oKQorLy8gQ3VycmVudGx5IGl0IG9ubHkgcHJvdmlkZXMgYSB8d3JpdGV8IGNhbGwgdHdvIGNhbGxiYWNrcyBmb3IgcmVhZGluZworLy8gRm9yIHRoZSB1c2FnZSBkZXRhaWxzIHNlZSB8YW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaHwKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTZXJpYWxMaW5lIDogcHVibGljIENTZXJpYWxMaW5lIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5TZXJpYWxMaW5lKCkgPSBkZWZhdWx0OworCisgICAgdHlwZWRlZiBTTENhblJlYWRIYW5kbGVyKiBDYW5SZWFkRnVuYzsKKyAgICB0eXBlZGVmIFNMUmVhZEhhbmRsZXIqIFJlYWRGdW5jOworCisgICAgdmlydHVhbCB2b2lkIGFkZEhhbmRsZXJzKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuUmVhZEZ1bmMgY2FuUmVhZEZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRGdW5jIHJlYWRGdW5jKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCB3cml0ZShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKSA9IDA7CisKKyAgICAvLyBTbWFsbCBzdHJ1Y3R1cmUgcHJvdmlkaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNyZWF0ZSBTZXJpYWxMaW5lCisgICAgLy8gaW5zdGFuY2VzLiBVc2UgRnVuY3M6OmdldCgpIHRvIGdldCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gVGhlCisgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgZmFpbCB0byBjcmVhdGUgYW55dGhpbmcsIGJ1dCBhbiBlbmdpbmUKKyAgICAvLyBvciB1bml0LXRlc3Qgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGluamVjdGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBGdW5jczo6cmVzZXQoKSBhdCBydW50aW1lLgorICAgIHN0cnVjdCBGdW5jcyB7CisgICAgICAgIC8vIEdpdmVuIGFuIGV4aXN0aW5nIFNlcmlhbExpbmUgaW5zdGFuY2UgfHNsfCwgY3JlYXRlIGEgbmV3IGluc3RhbmNlCisgICAgICAgIC8vIHRoYXQgaW1wbGVtZW50cyBhIGJ1ZmZlciBmb3IgYW55IGRhdGEgc2VudCB0byB8c2x8LiBPbiB0aGUgb3RoZXIKKyAgICAgICAgLy8gaGFuZCwgYW55IENhblJlYWRGdW5jL1JlYWRGdW5jIHJlcXVlc3Qgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkKKyAgICAgICAgLy8gdG8gfHNsfCdzIGhhbmRsZXJzLgorICAgICAgICBTZXJpYWxMaW5lKiAoKm9wZW5CdWZmZXIpKFNlcmlhbExpbmUqIHNsKTsKKworICAgICAgICAvLyBDcmVhdGUgdHdvIG5ldyBTZXJpYWxMaW5lIGluc3RhbmNlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdGhyb3VnaAorICAgICAgICAvLyBidWZmZXJzIGFzIGEgcGlwZS4gT24gc3VjY2VzcywgcmV0dXJuIHRydWUgYW5kIHNldHMgfCpwZmlyc3R8CisgICAgICAgIC8vIGFuZCB8KnBzZWNvbmR8IHRvIHRoZSBpbnN0YW5jZSBwb2ludGVycy4KKyAgICAgICAgYm9vbCAoKm9wZW5QaXBlKShTZXJpYWxMaW5lKiogcGZpcnN0cywgU2VyaWFsTGluZSoqIHBzZWNvbmQpOworCisgICAgICAgIC8vIFJldHVybiBjdXJyZW50IFNlcmlhbExpbmU6OkZ1bmNzIGluc3RhbmNlLiBUaGlzIG5ldmVyIHJldHVybnMKKyAgICAgICAgLy8gbnVsbHB0ci4KKyAgICAgICAgc3RhdGljIGNvbnN0IEZ1bmNzKiBnZXQoKTsKKworICAgICAgICAvLyBSZXNldCB0aGUgY3VycmVudCBnbG9iYWwgU2VyaWFsTGluZTo6RnVuY3MgaW1wbGVtZW50YXRpb24uCisgICAgICAgIC8vIElmIHxmYWN0b3J5fCBpcyBudWxscHRyLCB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkLgorICAgICAgICAvLyBSZXR1cm5zIHRoZSBwcmV2aW91cyB2YWx1ZS4KKyAgICAgICAgc3RhdGljIGNvbnN0IEZ1bmNzKiByZXNldChjb25zdCBGdW5jcyogZmFjdG9yeSk7CisgICAgfTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL1NldHVwUGFyYW1ldGVycy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL1NldHVwUGFyYW1ldGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NjQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzLmNwcApAQCAtMCwwICsxLDE2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9TZXR1cFBhcmFtZXRlcnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgc2V0dXBWaXJ0dWFsU2VyaWFsUG9ydHMoUGFyYW1ldGVyTGlzdCoga2VybmVsUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJMaXN0KiBxZW11UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtlcm5lbFNlcmlhbFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1FlbXUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvblNob3dLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzU2hlbGxDb25zb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGVsbFNlcmlhbCkgeworICAgIGJvb2wgaXNYODZpc2ggPSAhc3RyY21wKHRhcmdldEFyY2gsICJ4ODYiKSB8fCAhc3RyY21wKHRhcmdldEFyY2gsICJ4ODZfNjQiKTsKKworICAgIGJvb2wgaXNBUk1pc2ggPSAhc3RyY21wKHRhcmdldEFyY2gsICJhcm0iKSB8fCAhc3RyY21wKHRhcmdldEFyY2gsICJhcm02NCIpOworCisgICAgLy8gRWFjaCB2aXJ0dWFsIHNlcmlhbCBwb3J0IGRldmljZSBpcyBjb25uZWN0ZWQgdG8gYSBRRU1VICdjaGFyZGV2JworICAgIC8vIGJhY2tlbmQgd2hpY2ggY2FuIGJlICdudWxsJywgJ3N0ZGlvJywgJ2NvbjonLCAnYW5kcm9pZC1rbXNnJyBvcgorICAgIC8vICdhbmRyb2lkLXFlbXVkJyBpbiBjYXNlIG9mIFFFTVUxLiBTZWUgZG9jcy9DSEFSLURFVklDRVMuVFhULgorICAgIC8vCisgICAgLy8gQ1JJVElDQUw6IFRvIHByb3Blcmx5IHN1cHBvcnQgc25hcHNob3R0aW5nLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgIC8vIHNldCBvZiB2aXJ0dWFsIGRldmljZXMgY3JlYXRlZCBmb3IgYW4gQVZEIGlzIGNvbnNpc3RlbnQgd2l0aCBpdHMKKyAgICAvLyBoYXJkd2FyZSBzZXR0aW5ncyBidXQgZG9lcyBfbm90XyBkZXBlbmQgb24gY29tbWFuZC1saW5lIG9wdGlvbnMuIFRoZQorICAgIC8vIGFzc29jaWF0ZWQgY2hhcmRldiBjYW4gYmUgZGlmZmVyZW50IGZyb20gb25lIHJ1biB0byB0aGUgb3RoZXIgdGhvdWdoLgorICAgIGlmICghaXNRZW11MikgeworICAgICAgICAvLyBUZWNobmljYWwgbm90ZTogVGhlcmUgYXJlIHNldmVyYWwgaW1wb3J0YW50IGNvbnN0cmFpbnRzIHdoZW4KKyAgICAgICAgLy8gc2V0dGluZyB1cCBRRU1VMSB2aXJ0dWFsIHR0eXM6CisgICAgICAgIC8vCisgICAgICAgIC8vIC0gVGhlIGZpcnN0IG9uZSBpZiB0aGF0IGZvciBBUEkgbGV2ZWwgPCAxNCwgdGhlIHN5c3RlbSByZXF1aXJlcworICAgICAgICAvLyAgIHRoYXQgdGhlICpzZWNvbmQqIHZpcnR1YWwgc2VyaWFsIHBvcnQgKGkuZS4gdHR5UzEpIGJlIGFzc29jaWF0ZWQKKyAgICAgICAgLy8gICB3aXRoIHRoZSBhbmRyb2lkLXFlbXVkIGNoYXJkZXYsIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBsZWdhY3kKKyAgICAgICAgLy8gICBRRU1VRCBwcm90b2NvbC4gTmV3ZXIgQVBJIGxldmVscyB1c2UgYSBwaXBlIGZvciB0aGlzIGluc3RlYWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gVGhlIHNlY29uZCBvbmUgaXMgdGhhdCB0aGUgeDg2IGFuZCB4ODZfNjQgdmlydHVhbCBib2FyZHMgaGF2ZQorICAgICAgICAvLyAgIGEgbGltaXRlZCBudW1iZXIgb2YgSVJRcyB3aGljaCBtYWtlcyBpdCB1bmFibGUgdG8gc2V0dXAgbW9yZQorICAgICAgICAvLyAgIHRoYW4gdHdvIHR0eXMgYXQgdGhlIHNhbWUgdGltZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLSBUaGlyZCwgc3BlY2lmeWluZyAtbG9nY2F0IGltcGxpZXMgLXNoZWxsIGR1ZSB0byBsaW1pdGF0aW9ucyBpbgorICAgICAgICAvLyAgIHRoZSBndWVzdCBzeXN0ZW0uIEkuZS4gdGhlIHNoZWxsIGNvbnNvbGUgd2lsbCBhbHdheXMgcmVjZWl2ZQorICAgICAgICAvLyAgIGxvZ2NhdCBvdXRwdXQsIGV2ZW4gaWYgb25lIHVzZXMgLXNoZWxsLXNlcmlhbCB0byByZWRpcmVjdCBpdHMKKyAgICAgICAgLy8gICBvdXRwdXQgdG8gYSBwdHkgb3Igc29tZXRoaW5nIHNpbWlsYXIuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHRodXMgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjYXNlczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKiBGb3IgYXBpTGV2ZWwgPj0gMTQ6CisgICAgICAgIC8vICAgICAgdHR5UzAgPSBhbmRyb2lkLWttc2cgKGtlcm5lbCBtZXNzYWdlcykKKyAgICAgICAgLy8gICAgICB0dHlTMSA9IDxzaGVsbC1zZXJpYWw+IChsb2djYXQvc2hlbGwpLgorICAgICAgICAvLworICAgICAgICAvLyAqIEZvciBhcGlMZXZlbCA8IDE0ICYmICF4ODZpc2g6CisgICAgICAgIC8vICAgICAgdHR5UzAgPSBhbmRyb2lkLWttc2cgKGtlcm5lbCBtZXNzYWdlcykKKyAgICAgICAgLy8gICAgICB0dHlTMSA9IGFuZHJvaWQtcWVtdWQKKyAgICAgICAgLy8gICAgICB0dHlTMiA9IDxzaGVsbC1zZXJpYWw+IChsb2djYXQvc2hlbGwpCisgICAgICAgIC8vCisgICAgICAgIC8vICogRm9yIGFwaUxldmVsIDwgMTQgJiYgeDg2aXNoOgorICAgICAgICAvLyAgICAgIHR0eVMwID0gPHNoZWxsLXNlcmlhbD4gKGtlcm5lbCBtZXNzYWdlcy9sb2djYXQvc2hlbGwpLgorICAgICAgICAvLyAgICAgIHR0eVMxID0gYW5kcm9pZC1xZW11ZAorICAgICAgICAvLworICAgICAgICAvLyBXaGVyZSA8c2hlbGwtc2VyaWFsPiBpcyB0aGUgdmFsdWUgb2Ygb3B0cy0+c2hlbGxfc2VyaWFsLCB3aGljaAorICAgICAgICAvLyBieSBkZWZhdWx0IHdpbGwgYmUgdGhlICdzdGRpbycgb3IgJ2NvbjonIGNoYXJkZXYgKGZvciBQb3NpeCBhbmQKKyAgICAgICAgLy8gV2luZG93cywgcmVzcGVjdGl2ZWx5KS4KKyAgICAgICAgaWYgKGtlcm5lbFBhcmFtcykgeworICAgICAgICAgICAgaWYgKG9wdGlvblNob3dLZXJuZWwpIHsKKyAgICAgICAgICAgICAgICBrZXJuZWxQYXJhbXMtPmFkZEZvcm1hdCgiY29uc29sZT0lczAiLCBrZXJuZWxTZXJpYWxQcmVmaXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGxvZ2NhdFNlcmlhbCA9IDE7CisgICAgICAgICAgICBpZiAoYXBpTGV2ZWwgPCAxNCkgeworICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtcy0+YWRkRm9ybWF0KCJhbmRyb2lkLnFlbXVkPSVzMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsU2VyaWFsUHJlZml4KTsKKyAgICAgICAgICAgICAgICBpZiAoaXNYODZpc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nY2F0U2VyaWFsID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2djYXRTZXJpYWwgPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHJpbGQgZGFlbW9uLCB1c2VkIGZvciBHU00gZW11bGF0aW9uLCBjaGVja3MgZm9yIHFlbXVkLAorICAgICAgICAgICAgICAgIC8vIGp1c3Qgc2V0IGl0IHRvIGEgZHVtbXkgdmFsdWUgaW5zdGVhZCBvZiBhIHNlcmlhbCBwb3J0LgorICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtcy0+YWRkKCJhbmRyb2lkLnFlbXVkPTEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc1NoZWxsQ29uc29sZSkgeworICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtcy0+YWRkRm9ybWF0KCJhbmRyb2lkYm9vdC5jb25zb2xlPSVzJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbFNlcmlhbFByZWZpeCwgbG9nY2F0U2VyaWFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChxZW11UGFyYW1zKSB7CisgICAgICAgICAgICAvLyBGaXJzdCB0dHkgaXMgdXNlZCBmb3Iga2VybmVsIG1lc3NhZ2VzIGluIGFsbCBjb25maWd1cmF0aW9ucywgYW5kCisgICAgICAgICAgICAvLyBhbHNvIGZvciBsb2djYXQvc2hlbGwgZm9yIChhcGlMZXZlbCA8IDE0ICYmIGlzWDg2aXNoKS4KKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtlcm5lbENoYXJkZXY7CisgICAgICAgICAgICBpZiAoYXBpTGV2ZWwgPCAxNCAmJiBpc1g4NmlzaCkgeworICAgICAgICAgICAgICAgIGtlcm5lbENoYXJkZXYgPSAoaGFzU2hlbGxDb25zb2xlIHx8IG9wdGlvblNob3dLZXJuZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzaGVsbFNlcmlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm51bGwiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBrZXJuZWxDaGFyZGV2ID0gb3B0aW9uU2hvd0tlcm5lbCA/ICJhbmRyb2lkLWttc2ciIDogIm51bGwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcWVtdVBhcmFtcy0+YWRkMigiLXNlcmlhbCIsIGtlcm5lbENoYXJkZXYpOworCisgICAgICAgICAgICAvLyBGb3IgQVBJIGxldmVsIDwgMTQsIHNlY29uZCB0dHkgaXMgdXNlZCBmb3IgUUVNVUQuCisgICAgICAgICAgICBpZiAoYXBpTGV2ZWwgPCAxNCkgeworICAgICAgICAgICAgICAgIHFlbXVQYXJhbXMtPmFkZDIoIi1zZXJpYWwiLCAiYW5kcm9pZC1xZW11ZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBIHRoaXJkIHR0eSBpcyByZXF1aXJlZCBmb3IgYXBpTGV2ZWwgPCA0ICYmICFpc1g4NmlzaC4KKyAgICAgICAgICAgIGlmIChhcGlMZXZlbCA+PSAxNCB8fCAhaXNYODZpc2gpIHsKKyAgICAgICAgICAgICAgICBxZW11UGFyYW1zLT5hZGQyKCItc2VyaWFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1NoZWxsQ29uc29sZSA/IHNoZWxsU2VyaWFsIDogIm51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsgIC8vIGlzUWVtdTIKKyAgICAgICAgLy8gQSBzaW5nbGUgdmlydHVhbCB0dHkgaXMgdXNlZCBmb3IgLXNob3cta2VybmVsLCAtc2hlbGwgYW5kIC1sb2djYXQKKyAgICAgICAgLy8gYW5kIHRoZSAtc2hlbGwtc2VyaWFsIG9wdGlvbiB3aWxsIGFmZmVjdCBhbGwgdGhyZWUgb2YgdGhlbS4KKyAgICAgICAgLy8gVE9ETyhkaWdpdCk6IEVuc3VyZSAtc2hlbGwtc2VyaWFsIG9ubHkgd29ya3Mgb24gLXNoZWxsIG91dHB1dC4KKyAgICAgICAgaWYgKGtlcm5lbFBhcmFtcykgeworICAgICAgICAgICAgaWYgKG9wdGlvblNob3dLZXJuZWwpIHsKKyAgICAgICAgICAgICAgICBrZXJuZWxQYXJhbXMtPmFkZEZvcm1hdCgiY29uc29sZT0lczAsMzg0MDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbFNlcmlhbFByZWZpeCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc0FSTWlzaCkgeworICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtcy0+YWRkKCJrZWVwX2Jvb3Rjb24iKTsKKyAgICAgICAgICAgICAgICBrZXJuZWxQYXJhbXMtPmFkZEZvcm1hdCgiZWFybHlwcmludGs9JXMwIiwga2VybmVsU2VyaWFsUHJlZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc1NoZWxsQ29uc29sZSkgeworICAgICAgICAgICAgICAgIGtlcm5lbFBhcmFtcy0+YWRkRm9ybWF0KCJhbmRyb2lkYm9vdC5jb25zb2xlPSVzMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsU2VyaWFsUHJlZml4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlIHJpbGQgZGFlbW9uLCB1c2VkIGZvciBHU00gZW11bGF0aW9uLCBjaGVja3MgZm9yIHFlbXVkLCBqdXN0CisgICAgICAgICAgICAvLyBzZXQgaXQgdG8gYSBkdW1teSB2YWx1ZSBpbnN0ZWFkIG9mIGEgc2VyaWFsIHBvcnQuCisgICAgICAgICAgICBrZXJuZWxQYXJhbXMtPmFkZCgiYW5kcm9pZC5xZW11ZD0xIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocWVtdVBhcmFtcykgeworICAgICAgICAgICAgYm9vbCB1c2VGaXJzdFNlcmlhbCA9IG9wdGlvblNob3dLZXJuZWwgfHwgaGFzU2hlbGxDb25zb2xlOworICAgICAgICAgICAgcWVtdVBhcmFtcy0+YWRkMigiLXNlcmlhbCIsIHVzZUZpcnN0U2VyaWFsID8gc2hlbGxTZXJpYWwgOiAibnVsbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGtlcm5lbFBhcmFtcyAmJiAhb3B0aW9uU2hvd0tlcm5lbCkgeworICAgICAgICAvLyBSZXF1aXJlZCB0byBwcmV2ZW50IGtlcm5lbCBtZXNzYWdlcyB0byBiZSBzZW50IHRvIGZyYW1lYnVmZmVyCisgICAgICAgIC8vICh0aHJvdWdoICd2YzAnLCBpLmUuIHZpcnR1YWwgY29uc29sZSAwKS4KKyAgICAgICAga2VybmVsUGFyYW1zLT5hZGQoImNvbnNvbGU9MCIpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL1NldHVwUGFyYW1ldGVycy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9TZXR1cFBhcmFtZXRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWU1OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9TZXR1cFBhcmFtZXRlcnMuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBzZXR1cFZpcnR1YWxTZXJpYWxQb3J0cyhQYXJhbWV0ZXJMaXN0KiBrZXJuZWxQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckxpc3QqIHFlbXVQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0QXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2VybmVsU2VyaWFsUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUWVtdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uU2hvd0tlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNTaGVsbENvbnNvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNoZWxsU2VyaWFsKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU5NzcwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9TZXR1cFBhcmFtZXRlcnNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjY2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL1NldHVwUGFyYW1ldGVycy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQXZkU2V0dGluZ3MgeworICAgIGludCBhcGlMZXZlbDsKKyAgICBjb25zdCBjaGFyKiB0YXJnZXRBcmNoOworICAgIGNvbnN0IGNoYXIqIHNlcmlhbFByZWZpeDsKKyAgICBib29sIGlzUWVtdTI7CisKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdCgiYXBpPSVkIGFyY2g9JXMgcWVtdTI9JWQiLCBhcGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRBcmNoLCBpc1FlbXUyID8gMSA6IDApOworICAgIH0KK307CisKK2NvbnN0IEF2ZFNldHRpbmdzIGtBdmRHaW5nZXJicmVhZEFybSA9IHs5LCAiYXJtIiwgInR0eVMiLCBmYWxzZX07Citjb25zdCBBdmRTZXR0aW5ncyBrQXZkR2luZ2VyYnJlYWRYODYgPSB7OSwgIng4NiIsICJ0dHlTIiwgZmFsc2V9OworY29uc3QgQXZkU2V0dGluZ3Mga0F2ZEljc0FybSA9IHsxNCwgImFybSIsICJ0dHlTIiwgZmFsc2V9OworY29uc3QgQXZkU2V0dGluZ3Mga0F2ZEljc1g4NiA9IHsxNCwgIng4NiIsICJ0dHlTIiwgZmFsc2V9OworY29uc3QgQXZkU2V0dGluZ3Mga0F2ZE1hcnNobWFsbG93QXJtID0gezIzLCAiYXJtIiwgInR0eUFNQSIsIHRydWV9OworY29uc3QgQXZkU2V0dGluZ3Mga0F2ZE1hcnNobWFsbG93QXJtNjQgPSB7MjMsICJhcm02NCIsICJ0dHlBTUEiLCB0cnVlfTsKK2NvbnN0IEF2ZFNldHRpbmdzIGtBdmRNYXJzaG1hbGxvd1g4NiA9IHsyMywgIng4NiIsICJ0dHlHRiIsIHRydWV9OworY29uc3QgQXZkU2V0dGluZ3Mga0F2ZE1hcnNobWFsbG93WDg2XzY0ID0gezIzLCAieDg2XzY0IiwgInR0eUdGIiwgdHJ1ZX07Citjb25zdCBBdmRTZXR0aW5ncyBrQXZkTWFyc2htYWxsb3dNaXBzID0gezIzLCAibWlwcyIsICJ0dHlTIiwgdHJ1ZX07CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKFNldHVwUGFyYW1ldGVycywgc2V0dXBWaXJ0dWFsU2VyaWFsUG9ydHMpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRLZXJuZWxQYXJhbXM7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkUWVtdVBhcmFtczsKKyAgICAgICAgY29uc3QgQXZkU2V0dGluZ3MqIGF2ZFNldHRpbmdzOworICAgICAgICBib29sIHNob3dLZXJuZWw7CisgICAgICAgIGJvb2wgc2hlbGxDb25zb2xlOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgICAgIC8vIEdpbmdlcmJyZWFkIEFSTQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5xZW11ZD10dHlTMSBjb25zb2xlPTAiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBudWxsIC1zZXJpYWwgYW5kcm9pZC1xZW11ZCAtc2VyaWFsIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZEdpbmdlcmJyZWFkQXJtLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29uc29sZT10dHlTMCBhbmRyb2lkLnFlbXVkPXR0eVMxIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgYW5kcm9pZC1rbXNnIC1zZXJpYWwgYW5kcm9pZC1xZW11ZCAtc2VyaWFsIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZEdpbmdlcmJyZWFkQXJtLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPXR0eVMxIGFuZHJvaWRib290LmNvbnNvbGU9dHR5UzIgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgbnVsbCAtc2VyaWFsIGFuZHJvaWQtcWVtdWQgLXNlcmlhbCBmb28tc2VyaWFsIiwKKyAgICAgICAgICAgICAgICAgICAgJmtBdmRHaW5nZXJicmVhZEFybSwgZmFsc2UsIHRydWUsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29uc29sZT10dHlTMCBhbmRyb2lkLnFlbXVkPXR0eVMxICIKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWRib290LmNvbnNvbGU9dHR5UzIiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBhbmRyb2lkLWttc2cgLXNlcmlhbCBhbmRyb2lkLXFlbXVkIC1zZXJpYWwgIgorICAgICAgICAgICAgICAgICAgICAiZm9vLXNlcmlhbCIsCisgICAgICAgICAgICAgICAgICAgICZrQXZkR2luZ2VyYnJlYWRBcm0sIHRydWUsIHRydWUsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBHaW5nZXJicmVhZCBYODYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9dHR5UzEgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgbnVsbCAtc2VyaWFsIGFuZHJvaWQtcWVtdWQiLCAma0F2ZEdpbmdlcmJyZWFkWDg2LAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29uc29sZT10dHlTMCBhbmRyb2lkLnFlbXVkPXR0eVMxIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCAtc2VyaWFsIGFuZHJvaWQtcWVtdWQiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZEdpbmdlcmJyZWFkWDg2LCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPXR0eVMxIGFuZHJvaWRib290LmNvbnNvbGU9dHR5UzAgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCAtc2VyaWFsIGFuZHJvaWQtcWVtdWQiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZEdpbmdlcmJyZWFkWDg2LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eVMwIGFuZHJvaWQucWVtdWQ9dHR5UzEgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QuY29uc29sZT10dHlTMCIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIGZvby1zZXJpYWwgLXNlcmlhbCBhbmRyb2lkLXFlbXVkIiwKKyAgICAgICAgICAgICAgICAgICAgJmtBdmRHaW5nZXJicmVhZFg4NiwgdHJ1ZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIEljZSBDcmVhbSBTYW5kd2ljaCBBUk0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9MSBjb25zb2xlPTAiLCAiLXNlcmlhbCBudWxsIC1zZXJpYWwgbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICZrQXZkSWNzQXJtLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiY29uc29sZT10dHlTMCBhbmRyb2lkLnFlbXVkPTEiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBhbmRyb2lkLWttc2cgLXNlcmlhbCBudWxsIiwgJmtBdmRJY3NBcm0sIHRydWUsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9MSBhbmRyb2lkYm9vdC5jb25zb2xlPXR0eVMxIGNvbnNvbGU9MCIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIG51bGwgLXNlcmlhbCBmb28tc2VyaWFsIiwgJmtBdmRJY3NBcm0sIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9dHR5UzAgYW5kcm9pZC5xZW11ZD0xIGFuZHJvaWRib290LmNvbnNvbGU9dHR5UzEiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBhbmRyb2lkLWttc2cgLXNlcmlhbCBmb28tc2VyaWFsIiwgJmtBdmRJY3NBcm0sCisgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBJY2UgQ3JlYW0gU2FuZHdpY2ggWDg2CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPTEgY29uc29sZT0wIiwgIi1zZXJpYWwgbnVsbCAtc2VyaWFsIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZEljc1g4NiwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9dHR5UzAgYW5kcm9pZC5xZW11ZD0xIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgYW5kcm9pZC1rbXNnIC1zZXJpYWwgbnVsbCIsICZrQXZkSWNzWDg2LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPTEgYW5kcm9pZGJvb3QuY29uc29sZT10dHlTMSBjb25zb2xlPTAiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBudWxsIC1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkSWNzWDg2LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eVMwIGFuZHJvaWQucWVtdWQ9MSBhbmRyb2lkYm9vdC5jb25zb2xlPXR0eVMxIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgYW5kcm9pZC1rbXNnIC1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkSWNzWDg2LAorICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gTWFyc2htYWxsb3cgQVJNCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJrZWVwX2Jvb3Rjb24gZWFybHlwcmludGs9dHR5QU1BMCBhbmRyb2lkLnFlbXVkPTEgIgorICAgICAgICAgICAgICAgICAgICAiY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgbnVsbCIsICZrQXZkTWFyc2htYWxsb3dBcm0sIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eUFNQTAsMzg0MDAga2VlcF9ib290Y29uIGVhcmx5cHJpbnRrPXR0eUFNQTAgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5xZW11ZD0xIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dBcm0sIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImtlZXBfYm9vdGNvbiBlYXJseXByaW50az10dHlBTUEwICIKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWRib290LmNvbnNvbGU9dHR5QU1BMCBhbmRyb2lkLnFlbXVkPTEgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dBcm0sIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9dHR5QU1BMCwzODQwMCBrZWVwX2Jvb3Rjb24gZWFybHlwcmludGs9dHR5QU1BMCAiCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkYm9vdC5jb25zb2xlPXR0eUFNQTAgYW5kcm9pZC5xZW11ZD0xIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dBcm0sIHRydWUsIHRydWUsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBNYXJzaG1hbGxvdyBBUk02NAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAia2VlcF9ib290Y29uIGVhcmx5cHJpbnRrPXR0eUFNQTAgYW5kcm9pZC5xZW11ZD0xICIKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9MCIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIG51bGwiLCAma0F2ZE1hcnNobWFsbG93QXJtNjQsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eUFNQTAsMzg0MDAga2VlcF9ib290Y29uIGVhcmx5cHJpbnRrPXR0eUFNQTAgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5xZW11ZD0xIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dBcm02NCwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAia2VlcF9ib290Y29uIGVhcmx5cHJpbnRrPXR0eUFNQTAgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QuY29uc29sZT10dHlBTUEwIGFuZHJvaWQucWVtdWQ9MSBjb25zb2xlPTAiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBmb28tc2VyaWFsIiwgJmtBdmRNYXJzaG1hbGxvd0FybTY0LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eUFNQTAsMzg0MDAga2VlcF9ib290Y29uIGVhcmx5cHJpbnRrPXR0eUFNQTAgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QuY29uc29sZT10dHlBTUEwIGFuZHJvaWQucWVtdWQ9MSIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIGZvby1zZXJpYWwiLCAma0F2ZE1hcnNobWFsbG93QXJtNjQsIHRydWUsIHRydWUsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAvLyBNYXJzaG1hbGxvdyBYODYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9MSBjb25zb2xlPTAiLCAiLXNlcmlhbCBudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgJmtBdmRNYXJzaG1hbGxvd1g4NiwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9dHR5R0YwLDM4NDAwIGFuZHJvaWQucWVtdWQ9MSIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIGZvby1zZXJpYWwiLCAma0F2ZE1hcnNobWFsbG93WDg2LCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkYm9vdC5jb25zb2xlPXR0eUdGMCBhbmRyb2lkLnFlbXVkPTEgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dYODYsIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImNvbnNvbGU9dHR5R0YwLDM4NDAwIGFuZHJvaWRib290LmNvbnNvbGU9dHR5R0YwICIKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9MSIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIGZvby1zZXJpYWwiLCAma0F2ZE1hcnNobWFsbG93WDg2LCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgLy8gTWFyc2htYWxsb3cgWDg2XzY0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPTEgY29uc29sZT0wIiwgIi1zZXJpYWwgbnVsbCIsCisgICAgICAgICAgICAgICAgICAgICZrQXZkTWFyc2htYWxsb3dYODZfNjQsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eUdGMCwzODQwMCBhbmRyb2lkLnFlbXVkPTEiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBmb28tc2VyaWFsIiwgJmtBdmRNYXJzaG1hbGxvd1g4Nl82NCwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QuY29uc29sZT10dHlHRjAgYW5kcm9pZC5xZW11ZD0xIGNvbnNvbGU9MCIsCisgICAgICAgICAgICAgICAgICAgICItc2VyaWFsIGZvby1zZXJpYWwiLCAma0F2ZE1hcnNobWFsbG93WDg2XzY0LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eUdGMCwzODQwMCBhbmRyb2lkYm9vdC5jb25zb2xlPXR0eUdGMCAiCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLnFlbXVkPTEiLAorICAgICAgICAgICAgICAgICAgICAiLXNlcmlhbCBmb28tc2VyaWFsIiwgJmtBdmRNYXJzaG1hbGxvd1g4Nl82NCwgdHJ1ZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIC8vIE1hcnNobWFsbG93IE1JUFMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQucWVtdWQ9MSBjb25zb2xlPTAiLCAiLXNlcmlhbCBudWxsIiwKKyAgICAgICAgICAgICAgICAgICAgJmtBdmRNYXJzaG1hbGxvd01pcHMsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eVMwLDM4NDAwIGFuZHJvaWQucWVtdWQ9MSIsICItc2VyaWFsIGZvby1zZXJpYWwiLAorICAgICAgICAgICAgICAgICAgICAma0F2ZE1hcnNobWFsbG93TWlwcywgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZGJvb3QuY29uc29sZT10dHlTMCBhbmRyb2lkLnFlbXVkPTEgY29uc29sZT0wIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dNaXBzLCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICJjb25zb2xlPXR0eVMwLDM4NDAwIGFuZHJvaWRib290LmNvbnNvbGU9dHR5UzAgIgorICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5xZW11ZD0xIiwKKyAgICAgICAgICAgICAgICAgICAgIi1zZXJpYWwgZm9vLXNlcmlhbCIsICZrQXZkTWFyc2htYWxsb3dNaXBzLCB0cnVlLCB0cnVlLAorICAgICAgICAgICAgfSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IGtEYXRhKSB7CisgICAgICAgIFBhcmFtZXRlckxpc3Qga2VybmVsUGFyYW1zOworICAgICAgICBQYXJhbWV0ZXJMaXN0IHFlbXVQYXJhbXM7CisKKyAgICAgICAgYW5kcm9pZDo6c2V0dXBWaXJ0dWFsU2VyaWFsUG9ydHMoCisgICAgICAgICAgICAgICAgJmtlcm5lbFBhcmFtcywgJnFlbXVQYXJhbXMsCisgICAgICAgICAgICAgICAgZGF0YS5hdmRTZXR0aW5ncy0+YXBpTGV2ZWwsIGRhdGEuYXZkU2V0dGluZ3MtPnRhcmdldEFyY2gsCisgICAgICAgICAgICAgICAgZGF0YS5hdmRTZXR0aW5ncy0+c2VyaWFsUHJlZml4LCBkYXRhLmF2ZFNldHRpbmdzLT5pc1FlbXUyLAorICAgICAgICAgICAgICAgIGRhdGEuc2hvd0tlcm5lbCwgZGF0YS5zaGVsbENvbnNvbGUsICJmb28tc2VyaWFsIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvZ1RleHQgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXQoCisgICAgICAgICAgICAgICAgIkZvciAlcyBzaG93S2VybmVsPSVkIHNoZWxsQ29uc29sZT0lZCIsCisgICAgICAgICAgICAgICAgZGF0YS5hdmRTZXR0aW5ncy0+dG9TdHJpbmcoKS5jX3N0cigpLCBkYXRhLnNob3dLZXJuZWwgPyAxIDogMCwKKyAgICAgICAgICAgICAgICBkYXRhLnNoZWxsQ29uc29sZSA/IDEgOiAwKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGRhdGEuZXhwZWN0ZWRLZXJuZWxQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICBrZXJuZWxQYXJhbXMudG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICAgICAgICAgIDw8IGxvZ1RleHQ7CisKKyAgICAgICAgRVhQRUNUX1NUUkVRKGRhdGEuZXhwZWN0ZWRRZW11UGFyYW1zLCBxZW11UGFyYW1zLnRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgICAgICAgICA8PCBsb2dUZXh0OworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjliNzdjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBWbUxvY2sqIHNJbnN0YW5jZSA9IG51bGxwdHI7CisKK1ZtTG9jayogVm1Mb2NrOjpnZXQoKSB7CisgICAgLy8gTk9UIHRocmVhZC1zYWZlLCBidXQgd2UgZG9uJ3QgZXhwZWN0IG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCB0aGlzCisgICAgLy8gY29uY3VycmVudGx5IGF0IGluaXQgdGltZSwgYW5kIHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgdG8gbGVhaworICAgIC8vIGEgc2luZ2xlIGluc3RhbmNlLgorICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBWbUxvY2soKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworVm1Mb2NrKiBWbUxvY2s6OnNldChWbUxvY2sqIHZtTG9jaykgeworICAgIFZtTG9jayogcmVzdWx0ID0gc0luc3RhbmNlOworICAgIHNJbnN0YW5jZSA9IHZtTG9jazsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL1ZtTG9jay5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJjZDYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBJbiBRRU1VMiwgZWFjaCB2aXJ0dWFsIENQVSBydW5zIG9uIGl0cyBvd24gaG9zdCB0aHJlYWRzLCBidXQgYWxsIHRoZXNlCisvLyB0aHJlYWRzIGFyZSBzeW5jaHJvbml6ZWQgdGhyb3VnaCBhIGdsb2JhbCBtdXRleCwgd2hpY2ggYWxsb3dzIHRoZSB2aXJ0dWFsCisvLyBkZXZpY2UgY29kZSB0byBub3QgY2FyZSBhYm91dCB0aGVtLgorLy8KKy8vIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIHRvIGNhbGwsIGZyb20gYW55IG90aGVyIHRocmVhZCwgYSBsb3ctbGV2ZWwgUUVNVQorLy8gZnVuY3Rpb24gdGhhdCBvcGVyYXRlIG9uIHZpcnR1YWwgZGV2aWNlcyAoZS5nLiBzb21lIEFuZHJvaWQgcGlwZS1yZWxhdGVkCisvLyBmdW5jdGlvbnMpLCB5b3UgbXVzdCBhY3F1aXJlIHRoZSBnbG9iYWwgbXV0ZXggYmVmb3JlIGRvaW5nIHNvLCBhbmQgcmVsZWFzZQorLy8gaXQgYWZ0ZXIgdGhhdC4KKworLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgYSBjb252ZW5pZW5jZSBpbnRlcmZhY2UgY2xhc3MgeW91IGNhbiB1c2UgdG8gZG8KKy8vIGp1c3QgdGhhdCwgaS5lLjoKKy8vCisvLyAxKSBUbyBvcGVyYXRlIG9uIHRoZSBsb2NrLCBjYWxsIFZtTG9jazo6Z2V0KCkgdG8gcmV0cmlldmUgdGhlCisvLyAgICBjdXJyZW50IFZtTG9jayBpbnN0YW5jZSwgdGhlbiBpbnZva2UgaXRzIGxvY2soKSBhbmQgdW5sb2NrKCkKKy8vICAgIG1ldGhvZHMuCisvLworLy8gMikgR2x1ZSBjb2RlIHNob3VsZCBjYWxsIFZtTG9jazo6c2V0KCkgdG8gaW5qZWN0IHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbgorLy8gICAgaW50byB0aGUgcHJvY2Vzcy4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBhbnl0aGluZy4KKy8vY2xlYXIKKworCitjbGFzcyBWbUxvY2sgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLgorICAgIFZtTG9jaygpID0gZGVmYXVsdDsKKworICAgIC8vIERlc3RydWN0b3IuCisgICAgdmlydHVhbCB+Vm1Mb2NrKCkgPSBkZWZhdWx0OworCisgICAgLy8gTG9jayB0aGUgVk0gZ2xvYmFsIG11dGV4LgorICAgIHZpcnR1YWwgdm9pZCBsb2NrKCkge30KKworICAgIC8vIFVubG9jayB0aGUgVk0gZ2xvYmFsIG11dGV4LgorICAgIHZpcnR1YWwgdm9pZCB1bmxvY2soKSB7fQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjdXJyZW50IHRocmVhZCwgZmFsc2UKKyAgICAvLyBvdGhlcndpc2UuIE5vdGUgdGhhdCBmb3IgYSBjb3JyZWN0IGltcGxlbWVudGF0aW9uLCB0aGF0IGRvZXNuJ3QKKyAgICAvLyBvbmx5IGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgVm1Mb2NrOjpsb2NrKCkgYW5kCisgICAgLy8gVm1Mb2NrOjp1bmxvY2soKSB3ZXJlIGNhbGxlZCwgYnV0IGFsc28gb24gb3RoZXIgUUVNVSB0aHJlYWRzIHRoYXQKKyAgICAvLyBhY3Qgb24gdGhlIGdsb2JhbCBsb2NrLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvY2tlZEJ5U2VsZigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IFZtTG9jayBpbnN0YW5jZS4gQ2Fubm90IHJldHVybiBudWxscHRyLgorICAgIHN0YXRpYyBWbUxvY2sqIGdldCgpOworCisgICAgLy8gU2V0IG5ldyBWbUxvY2sgaW5zdGFuY2UuIFJldHVybiBvbGQgdmFsdWUsIHdoaWNoIGNhbm5vdCBiZSBudWxscHRyIGFuZAorICAgIC8vIGNhbiBiZSBkZWxldGVkIGJ5IHRoZSBjYWxsZXIuIElmIHx2bUxvY2t8IGlzIG51bGxwdHIsIGEgbmV3IGRlZmF1bHQKKyAgICAvLyBpbnN0YW5jZSBpcyBjcmVhdGVkLiBOT1RFOiBub3QgdGhyZWFkLXNhZmUgd2l0aCByZWdhcmRzIHRvIGdldCgpLgorICAgIHN0YXRpYyBWbUxvY2sqIHNldChWbUxvY2sqIHZtTG9jayk7CisKKyAgICBESVNBTExPV19DT1BZX0FTU0lHTl9BTkRfTU9WRShWbUxvY2spOworfTsKKworLy8gQ29udmVuaWVuY2UgY2xhc3MgdG8gcGVyZm9ybSBzY29wZWQgVk0gbG9ja2luZy4KK2NsYXNzIFNjb3BlZFZtTG9jayB7CitwdWJsaWM6CisgICAgU2NvcGVkVm1Mb2NrKFZtTG9jayogdm1Mb2NrID0gVm1Mb2NrOjpnZXQoKSkgOiBtVm1Mb2NrKHZtTG9jaykgeworICAgICAgICBtVm1Mb2NrLT5sb2NrKCk7CisgICAgfQorCisgICAgflNjb3BlZFZtTG9jaygpIHsKKyAgICAgICAgbVZtTG9jay0+dW5sb2NrKCk7CisgICAgfQorCisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoU2NvcGVkVm1Mb2NrKTsKKworcHJpdmF0ZToKKyAgICBWbUxvY2sqIG1WbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2tfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2tfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjBjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL1ZtTG9ja191bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vVm1Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0Vm1Mb2NrLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1RFU1QoVm1Mb2NrLCBEZWZhdWx0KSB7CisgICAgVm1Mb2NrKiB2bUxvY2sgPSBWbUxvY2s6OmdldCgpOworICAgIEFTU0VSVF9UUlVFKHZtTG9jayk7CisgICAgdm1Mb2NrLT5sb2NrKCk7CisgICAgdm1Mb2NrLT51bmxvY2soKTsKK30KKworVEVTVChWbUxvY2ssIEN1c3RvbVZtTG9jaykgeworICAgIFRlc3RWbUxvY2sgbXlMb2NrOworCisgICAgRVhQRUNUX0VRKDAsIG15TG9jay5tTG9ja0NvdW50KTsKKyAgICBFWFBFQ1RfRVEoMCwgbXlMb2NrLm1VbmxvY2tDb3VudCk7CisgICAgRVhQRUNUX0ZBTFNFKG15TG9jay5pc0xvY2tlZEJ5U2VsZigpKTsKKworICAgIFZtTG9jazo6Z2V0KCktPmxvY2soKTsKKyAgICBFWFBFQ1RfRVEoMSwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgIEVYUEVDVF9FUSgwLCBteUxvY2subVVubG9ja0NvdW50KTsKKyAgICBFWFBFQ1RfVFJVRShteUxvY2suaXNMb2NrZWRCeVNlbGYoKSk7CisKKyAgICBWbUxvY2s6OmdldCgpLT51bmxvY2soKTsKKyAgICBFWFBFQ1RfRVEoMSwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgIEVYUEVDVF9FUSgxLCBteUxvY2subVVubG9ja0NvdW50KTsKKyAgICBFWFBFQ1RfRkFMU0UobXlMb2NrLmlzTG9ja2VkQnlTZWxmKCkpOworCisgICAgVm1Mb2NrOjpnZXQoKS0+bG9jaygpOworICAgIEVYUEVDVF9FUSgyLCBteUxvY2subUxvY2tDb3VudCk7CisgICAgRVhQRUNUX0VRKDEsIG15TG9jay5tVW5sb2NrQ291bnQpOworICAgIEVYUEVDVF9UUlVFKG15TG9jay5pc0xvY2tlZEJ5U2VsZigpKTsKKworICAgIFZtTG9jazo6Z2V0KCktPnVubG9jaygpOworICAgIEVYUEVDVF9FUSgyLCBteUxvY2subUxvY2tDb3VudCk7CisgICAgRVhQRUNUX0VRKDIsIG15TG9jay5tVW5sb2NrQ291bnQpOworICAgIEVYUEVDVF9GQUxTRShteUxvY2suaXNMb2NrZWRCeVNlbGYoKSk7CisKKyAgICBteUxvY2sucmVsZWFzZSgpOworCisgICAgVm1Mb2NrOjpnZXQoKS0+bG9jaygpOworICAgIEVYUEVDVF9FUSgyLCBteUxvY2subUxvY2tDb3VudCk7CisgICAgRVhQRUNUX0VRKDIsIG15TG9jay5tVW5sb2NrQ291bnQpOworICAgIEVYUEVDVF9GQUxTRShteUxvY2suaXNMb2NrZWRCeVNlbGYoKSk7CisKKyAgICBWbUxvY2s6OmdldCgpLT51bmxvY2soKTsKKyAgICBFWFBFQ1RfRVEoMiwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgIEVYUEVDVF9FUSgyLCBteUxvY2subVVubG9ja0NvdW50KTsKKyAgICBFWFBFQ1RfRkFMU0UobXlMb2NrLmlzTG9ja2VkQnlTZWxmKCkpOworfQorCitURVNUKFNjb3BlZFZtTG9jaywgRGVmYXVsdCkgeworICAgIFNjb3BlZFZtTG9jayB2bG9jazsKK30KKworVEVTVChTY29wZWRWbUxvY2ssIEN1c3RvbVZtTG9jaykgeworICAgIFRlc3RWbUxvY2sgbXlMb2NrOworCisgICAgRVhQRUNUX0VRKDAsIG15TG9jay5tTG9ja0NvdW50KTsKKyAgICBFWFBFQ1RfRVEoMCwgbXlMb2NrLm1VbmxvY2tDb3VudCk7CisKKyAgICB7CisgICAgICAgIFNjb3BlZFZtTG9jayB2bG9jazsKKyAgICAgICAgRVhQRUNUX0VRKDEsIG15TG9jay5tTG9ja0NvdW50KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG15TG9jay5tVW5sb2NrQ291bnQpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMSwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgIEVYUEVDVF9FUSgxLCBteUxvY2subVVubG9ja0NvdW50KTsKKworICAgIHsKKyAgICAgICAgU2NvcGVkVm1Mb2NrIHZsb2NrOworICAgICAgICBFWFBFQ1RfRVEoMiwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgICAgICBFWFBFQ1RfRVEoMSwgbXlMb2NrLm1VbmxvY2tDb3VudCk7CisgICAgfQorICAgIEVYUEVDVF9FUSgyLCBteUxvY2subUxvY2tDb3VudCk7CisgICAgRVhQRUNUX0VRKDIsIG15TG9jay5tVW5sb2NrQ291bnQpOworCisgICAgbXlMb2NrLnJlbGVhc2UoKTsKKyAgICB7CisgICAgICAgIFNjb3BlZFZtTG9jayB2bG9jazsKKyAgICAgICAgRVhQRUNUX0VRKDIsIG15TG9jay5tTG9ja0NvdW50KTsKKyAgICAgICAgRVhQRUNUX0VRKDIsIG15TG9jay5tVW5sb2NrQ291bnQpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMiwgbXlMb2NrLm1Mb2NrQ291bnQpOworICAgIEVYUEVDVF9FUSgyLCBteUxvY2subVVubG9ja0NvdW50KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2NvbW1vbi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTRmNjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2NvbW1vbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFNoYXJlZCB0eXBlIGFuZCBjb25zdGFudCBkZWNsYXJhdGlvbnMgYmV0d2VlbiBhbmRyb2lkX3BpcGUuaCBhbmQKKy8vIGFuZHJvaWRfcGlwZV9ob3N0LmgKKworLy8gQnVmZmVyIGRlc2NyaXB0b3IgZm9yIGFuZHJvaWRfcGlwZV9ndWVzdF9zZW5kKCkgYW5kCisvLyBhbmRyb2lkX3BpcGVfZ3Vlc3RfcmVjdigpLgordHlwZWRlZiBzdHJ1Y3QgQW5kcm9pZFBpcGVCdWZmZXIgeworICAgIHVpbnQ4X3QqIGRhdGE7CisgICAgc2l6ZV90IHNpemU7Cit9IEFuZHJvaWRQaXBlQnVmZmVyOworCisvKiBMaXN0IG9mIGJpdGZsYWdzIHJldHVybmVkIGluIHN0YXR1cyBvZiBDTURfUE9MTCBjb21tYW5kICovCitlbnVtIFBpcGVQb2xsRmxhZ3MgeworCVBJUEVfUE9MTF9JTgk9IDEgPDwgMCwKKwlQSVBFX1BPTExfT1VUCT0gMSA8PCAxLAorCVBJUEVfUE9MTF9IVVAJPSAxIDw8IDIKK307CisKKy8qIFBvc3NpYmxlIHN0YXR1cyB2YWx1ZXMgdXNlZCB0byBzaWduYWwgZXJyb3JzIC0gc2VlIGdvbGRmaXNoX3BpcGVfZXJyb3JfY29udmVydCAqLworZW51bSBQaXBlRXJyb3JzIHsKKwlQSVBFX0VSUk9SX0lOVkFMICA9IC0xLAorCVBJUEVfRVJST1JfQUdBSU4gID0gLTIsCisJUElQRV9FUlJPUl9OT01FTSAgPSAtMywKKwlQSVBFX0VSUk9SX0lPICAgICA9IC00Cit9OworCisvKiBCaXQtZmxhZ3MgdXNlZCB0byBzaWduYWwgZXZlbnRzIGZyb20gdGhlIGVtdWxhdG9yICovCitlbnVtIFBpcGVXYWtlRmxhZ3MgeworCVBJUEVfV0FLRV9DTE9TRUQgPSAxIDw8IDAsICAvKiBlbXVsYXRvciBjbG9zZWQgcGlwZSAqLworCVBJUEVfV0FLRV9SRUFEICAgPSAxIDw8IDEsICAvKiBwaXBlIGNhbiBub3cgYmUgcmVhZCBmcm9tICovCisJUElQRV9XQUtFX1dSSVRFICA9IDEgPDwgMiAgLyogcGlwZSBjYW4gbm93IGJlIHdyaXR0ZW4gdG8gKi8KK307CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfZGV2aWNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGYyMmIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfZGV2aWNlLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmVhbS5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBURUNITklDQUwgTk9URToKKy8vCisvLyBBbiBBbmRyb2lkIHBpcGUgaXMgYSB2ZXJ5IGZhc3QgY29tbXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gdGhlIGd1ZXN0CisvLyBzeXN0ZW0gYW5kIHRoZSBlbXVsYXRvciBwcm9ncmFtLgorLy8KKy8vIFRvIG9wZW4gYSBuZXcgcGlwZSB0byB0aGUgZW11bGF0b3IsIGEgZ3Vlc3QgY2xpZW50IHdpbGwgZG8gdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgICAgZmQgPSBvcGVuKCIvZGV2L3FlbXVfcGlwZSIsIE9fUkRXUik7CisvLyAgICAgcmV0ID0gd3JpdGUoZmQsIHBpcGVTZXJ2aWNlTmFtZSwgc3RybGVuKHBpcGVTZXJ2aWNlTmFtZSkgKyAxKTsKKy8vICAgICBpZiAocmV0IDwgMCkgeworLy8gICAgICAgICAvLyBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzZWUgZXJybm8KKy8vICAgICB9CisvLworLy8gV2hlcmUgJ3BpcGVTZXJ2aWNlTmFtZScgaXMgYSBzdHJpbmcgdGhhdCBsb29rZSBsaWtlICJwaXBlOjxzZXJ2aWNlPiIKKy8vIG9yICJwaXBlOjxzZXJ2aWNlPjo8YXJncz4iLCB0ZXJtaW5hdGVkIGJ5IGEgemVyby4KKy8vCisvLyAgICAgbm93IHJlYWQoKS93cml0ZSgpIHRvIGNvbW11bmljYXRlIHdpdGggPHBpcGVTZXJ2aWNlTmFtZT4gc2VydmljZSBpbiB0aGUKKy8vICAgICBlbXVsYXRvci4gc2VsZWN0KCkgYW5kIG5vbi1ibG9ja2luZyBpL28gd2lsbCBhbHNvIHdvcmsgcHJvcGVybHkuCisvLworCisvLyBUaGUgR29sZGZpc2ggcGlwZSB2aXJ0dWFsIGRldmljZSBpcyBpbiBjaGFyZ2Ugb2YgY29tbXVuaWNhdGluZyB3aXRoIHRoZQorLy8ga2VybmVsIHRvIG1hbmFnZSBwaXBlIG9wZXJhdGlvbnMuCisvLworLy8gRWFjaCBwaXBlIGNvbm5lY3Rpb24gY29ycmVzcG9uZHMgdG8gdHdvIG9iamVjdHM6CisvLworLy8gICAtIEEgaGFyZHdhcmUtc2lkZSBvcGFxdWUgb2JqZWN0IChpbXBsZW1lbnRlZCBieSB0aGUgdmlydHVhbCBwaXBlIGRldmljZSkKKy8vICAgICBpZGVudGlmaWVkIGhlcmUgYXMgYSB8aHdwaXBlfCB2YWx1ZS4KKy8vCisvLyAgLSBBIGhvc3Qtc3BlY2lmaWMgb3BhcXVlIG9iamVjdCwgaWRlbnRpZmllZCBoZXJlIGVpdGhlciBhcyB8aG9zdC1waXBlfC4KKy8vCisvLyAgICAgICAodmlydHVhbCBkZXZpY2UpIHxod3BpcGV8ICA8LS0tLS0+ICB8aG9zdC1waXBlfCAgIChlbXVsYXRvcikKKy8vCisvLyBFeHBlY3RlZCB1c2FnZSBpcyB0aGUgZm9sbG93aW5nOgorLy8KKy8vIDEvIER1cmluZyBzZXR1cCwgdGhlIHZpcnR1YWwgZGV2aWNlIHNob3VsZCBjYWxsIGFuZHJvaWRfcGlwZV9zZXRfaHdfZnVuY3MoKQorLy8gICAgdG8gcG9pbnQgdG8gY2FsbGJhY2tzIGl0IHByb3ZpZGVzIHRvIGltcGxlbWVudCBhIGZldyBmdW5jdGlvbnMgY2FsbGVkCisvLyAgICBmcm9tIHRoZSBob3N0LCBsYXRlciBhdCBydW50aW1lLgorLy8KKy8vIDIvIER1cmluZyBzZXR1cCwgdGhlIGVtdWxhdG9yIHNob3VsZCByZWdpc3RlciBob3N0IHBpcGUgc2VydmljZSBpbnN0YW5jZXMsCisvLyAgICBlYWNoIG9uZSBpZGVudGlmaWVkIGJ5IGEgbmFtZSwgYmVmb3JlIHRoZSBWTSBzdGFydHMuCisvLworLy8gMy8gQXQgcnVudGltZSwgd2hlbiBhIGd1ZXN0IG9wZW5zIC9kZXYvZ29sZGZpc2hfcGlwZSwgdGhpcyBlbmRzIHVwIGNyZWF0aW5nCisvLyAgICBhIG5ldyB8aHdwaXBlfCBvYmplY3QgaW4gdGhlIHZpcnR1YWwgZGV2aWNlLCB3aGljaCB3aWxsIHRoZW4gY2FsbAorLy8gICAgYW5kcm9pZF9waXBlX2d1ZXN0X29wZW4oKSB0byBjcmVhdGUgYSBjb3JyZXNwb25kaW5nIHxob3N0LXBpcGV8CisvLyAgICBvYmplY3QuCisvLworLy8gICAgTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQsIHRoZSB8aG9zdC1waXBlfCBjb3JyZXNwb25kcyB0byBhIHNwZWNpYWwKKy8vICAgIGhvc3Qtc2lkZSBwaXBlIHN0YXRlIHRoYXQgd2FpdHMgZm9yIHRoZSBuYW1lIG9mIHRoZSBwaXBlIHNlcnZpY2UgdG8KKy8vICAgIGNvbm5lY3QgdG8sIGFuZCBwb3RlbnRpYWwgYXJndW1lbnRzLiBUaGlzIGlzIGNhbGxlZCBhIHxjb25uZWN0LXBpcGV8CisvLyAgICBoZXJlOgorLy8KKy8vICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXBlX2d1ZXN0X29wZW4oKQorLy8gICAgICAgICB8aHdwaXBlfCAgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gIHxjb25uZWN0LXBpcGV8CisvLworLy8gNC8gV2hlbiB0aGUgcGlwZSBzZXJ2aWNlIG5hbWUgaXMgZnVsbHkgd3JpdHRlbiwgdGhlIHxjb25uZWN0LXBpcGV8IGZpbmRzIGEKKy8vICAgIHNlcnZpY2UgcmVnaXN0ZXJlZCBmb3IgaXQsIGFuZCBjYWxscyBpdHMgOjppbml0KCkgY2FsbGJhY2sgdG8gY3JlYXRlCisvLyAgICBhIG5ldyB8c2VydmljZS1waXBlfCBpbnN0YW5jZS4KKy8vCisvLyAgICAgICAgIHxod3BpcGV8ICA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgfGNvbm5lY3QtcGlwZXwKKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHNlcnZpY2UtcGlwZXwKKy8vCisvLyA1LyBJdCB0aGVuIGNhbGxzIHRoZSBBbmRyb2lkUGlwZUh3RnVuY3M6OnJlc2V0UGlwZSgpIGNhbGxiYWNrIHByb3ZpZGVkCisvLyAgICBieSB0aGUgdmlydHVhbCBkZXZpY2UgdG8gcmVhdHRhY2ggdGhlIHxod3BpcGV8IHRvIHRoZSB8c2VydmljZS1waXBlfAorLy8gICAgdGhlbiBsYXRlciBkZWxldGUgdGhlIG5vdy11c2VsZXNzIHxjb25uZWN0LXBpcGV8LgorLy8KKy8vICAgICAgICAgfGh3cGlwZXwgIDwtLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICB8Y29ubmVjdC1waXBlfAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLT58c2VydmljZS1waXBlfAorLy8KKy8vIFZFUlkgSU1QT1JUQU5UIE5PVEU6CisvLworLy8gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGhhcHBlbiBvbiB0aGUgdGhyZWFkIHRoYXQgY3VycmVudGx5IGhvbGRzIHRoZQorLy8gZ2xvYmFsIFZNIHN0YXRlIGxvY2sgKHNlZSBhbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suaCkuIEl0J3MgdXAgdG8KKy8vIHRoZSBob3N0IGltcGxlbWVudGF0aW9uIHRvIGVuc3VyZSB0aGF0IHRoaXMgaXMgYWx3YXlzIHRoZSBjYXNlLgorLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB0aGUgdmlydHVhbCBkZXZpY2Ugb25seSBhbmQgYXJlCisvLyBpbXBsZW1lbnRlZCBieSBBbmRyb2lkRW11LiBUaGV5IHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBmcm9tIHRoZSBkZXZpY2UgdGhyZWFkCisvLyBjb250ZXh0IGFzIHdlbGwuCisKKy8vIE9wZW4gYSBuZXcgQW5kcm9pZCBwaXBlLiB8aHdwaXBlfCBpcyBhIHVuaXF1ZSBwb2ludGVyIHZhbHVlIGlkZW50aWZ5aW5nIHRoZQorLy8gaGFyZHdhcmUtc2lkZSB2aWV3IG9mIHRoZSBwaXBlLCBhbmQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlICdpbml0JyBjYWxsYmFjaworLy8gZnJvbSBBbmRyb2lkUGlwZUh3RnVuY3MuIFRoaXMgcmV0dXJucyBhIG5ldyB8aW50ZXJuYWwtcGlwZXwgdmFsdWUgdGhhdCBpcworLy8gb25seSB1c2VkIGJ5IHRoZSB2aXJ0dWFsIGRldmljZSB0byBjYWxsIGFuZHJvaWRfcGlwZV94eHgoKSBmdW5jdGlvbnMgYmVsb3cuCitleHRlcm4gdm9pZCogYW5kcm9pZF9waXBlX2d1ZXN0X29wZW4odm9pZCogaHdwaXBlKTsKKworLy8gQ2xvc2UgYW5kIGZyZWUgYW4gQW5kcm9pZCBwaXBlLiB8cGlwZXwgbXVzdCBiZSB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXMKKy8vIGFuZHJvaWRfcGlwZV9ndWVzdF9vcGVuKCkgY2FsbCBvciB0aGUgc2Vjb25kIHBhcmFtZXRlciB0bworLy8gYW5kcm9pZF9waXBlX3Jlc2V0KCkuCisvLyBUaGlzIG11c3QgKm5vdCogYmUgY2FsbGVkIGZyb20gdGhlIGhvc3Qgc2lkZSwgc2VlIGFuZHJvaWRfcGlwZV9ob3N0X2Nsb3NlKCkKKy8vIGluc3RlYWQuCitleHRlcm4gdm9pZCBhbmRyb2lkX3BpcGVfZ3Vlc3RfY2xvc2Uodm9pZCogaW50ZXJuYWxfcGlwZSk7CisKKy8vIFNhdmUgdGhlIHN0YXRlIG9mIGFuIEFuZHJvaWQgcGlwZSB0byBhIHN0cmVhbS4gfGludGVybmFsX3BpcGV8IGlzIHRoZSBwaXBlCisvLyBpbnN0YW5jZSBmcm9tIGFuZHJvaWRfcGlwZV9ndWVzdF9vcGVuKCkgb3IgYW5kcm9pZF9waXBlX2d1ZXN0X2xvYWQoKSwgYW5kCisvLyB8ZmlsZXwgaXMgdGhlCisvLyBvdXRwdXQgc3RyZWFtLgorZXh0ZXJuIHZvaWQgYW5kcm9pZF9waXBlX2d1ZXN0X3NhdmUodm9pZCogaW50ZXJuYWxfcGlwZSwgU3RyZWFtKiBmaWxlKTsKKworLy8gTG9hZCB0aGUgc3RhdGUgb2YgYW4gQW5kcm9pZCBwaXBlIGZyb20gYSBzdHJlYW0uIHxmaWxlfCBpcyB0aGUgaW5wdXQgc3RyZWFtLAorLy8gfGh3cGlwZXwgaXMgdGhlIGhhcmR3YXJlLXNpZGUgcGlwZSBkZXNjcmlwdG9yLiBPbiBzdWNjZXNzLCByZXR1cm4gYSBuZXcKKy8vIGludGVybmFsIHBpcGUgaW5zdGFuY2UgKHNpbWlsYXIgdG8gb25lIHJldHVybmVkIGJ5CisvLyBhbmRyb2lkX3BpcGVfZ3Vlc3Rfb3BlbigpKSwgYW5kCisvLyBzZXRzIHwqZm9yY2VfY2xvc2V8IHRvIDEgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGlwZSBtdXN0IGJlIGZvcmNlLWNsb3NlZAorLy8ganVzdCBhZnRlciBpdHMgbG9hZC9jcmVhdGlvbiAob25seSB1c2VmdWwgZm9yIGNlcnRhaW4gc2VydmljZXMgdGhhdCBjYW4ndAorLy8gcHJlc2VydmUgc3RhdGUgaW50byBzdHJlYW1zKS4gUmV0dXJuIE5VTEwgb24gZmFpbGx1cmUuCitleHRlcm4gdm9pZCogYW5kcm9pZF9waXBlX2d1ZXN0X2xvYWQoU3RyZWFtKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh3cGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBmb3JjZV9jbG9zZSk7CisKKy8vIFNpbWlsYXIgdG8gYW5kcm9pZF9waXBlX2d1ZXN0X2xvYWQoKSwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgZnJvbQorLy8gdGhlCisvLyBRRU1VMSB2aXJ0dWFsIHBpcGUgZGV2aWNlLCB0byBzdXBwb3J0IGxlZ2FjeSBzbmFwc2hvdCBmb3JtYXRzLiBJdCBjYW4gYmUKKy8vIGlnbm9yZWQgYnkgdGhlIFFFTVUyIHZpcnR1YWwgZGV2aWNlIGltcGxlbWVudGF0aW9uLgorLy8KKy8vIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhpcyBtdXN0IGFsc28gcmVhZCB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgc3RhdGUKKy8vIGZpZWxkcywgYW5kIHN0b3JlIHRoZW0gaW50byB8KmNoYW5uZWx8LCB8Kndha2VzfCBhbmQgfCpjbG9zZWR8IG9uCisvLyBzdWNjZXNzLgorZXh0ZXJuIHZvaWQqIGFuZHJvaWRfcGlwZV9ndWVzdF9sb2FkX2xlZ2FjeShTdHJlYW0qIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh3cGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHdha2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBjbG9zZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGZvcmNlX2Nsb3NlKTsKKworLy8gQ2FsbCB0aGUgcG9sbCgpIGNhbGxiYWNrIG9mIHRoZSBjbGllbnQgYXNzb2NpYXRlZCB3aXRoIHxwaXBlfC4KK2V4dGVybiB1bnNpZ25lZCBhbmRyb2lkX3BpcGVfZ3Vlc3RfcG9sbCh2b2lkKiBpbnRlcm5hbF9waXBlKTsKKworLy8gQ2FsbCB0aGUgcmVjdkJ1ZmZlcnMoKSBjYWxsYmFjayBvZiB0aGUgY2xpZW50IGFzc29jaWF0ZWQgd2l0aCB8cGlwZXwuCitleHRlcm4gaW50IGFuZHJvaWRfcGlwZV9ndWVzdF9yZWN2KHZvaWQqIGludGVybmFsX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycyk7CisKKy8vIENhbGwgdGhlIHNlbmRCdWZmZXJzKCkgY2FsbGJhY2sgb2YgdGhlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggfHBpcGV8LgorZXh0ZXJuIGludCBhbmRyb2lkX3BpcGVfZ3Vlc3Rfc2VuZCh2b2lkKiBpbnRlcm5hbF9waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVyKTsKKworLy8gQ2FsbCB0aGUgd2FrZU9uKCkgY2FsbGJhY2sgb2YgdGhlIGNsaWVudCBhc3NvY2lhdGVkIHdpdGggfHBpcGV8LgorZXh0ZXJuIHZvaWQgYW5kcm9pZF9waXBlX2d1ZXN0X3dha2Vfb24odm9pZCogaW50ZXJuYWxfcGlwZSwgdW5zaWduZWQgd2FrZXMpOworCisvLyBBIHNldCBvZiBmdW5jdGlvbnMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSB2aXJ0dWFsIGRldmljZQorLy8gaW1wbGVtZW50YXRpb24uIFVzZWQgd2l0aCBjYWxsIGFuZHJvaWRfcGlwZV9zZXRfaHdfZnVuY3MoKS4KK3R5cGVkZWYgc3RydWN0IEFuZHJvaWRQaXBlSHdGdW5jcyB7CisgICAgLy8gQ2hhbmdlIHRoZSBpbnRlcm5hbCBwaXBlIGFzc29jaWF0ZWQgd2l0aCB8aHdwaXBlfCB0byBiZSB8aW50ZXJuYWxfcGlwZXwKKyAgICB2b2lkICgqcmVzZXRQaXBlKSh2b2lkKiBod3BpcGUsIHZvaWQqIGludGVybmFsX3BpcGUpOworICAgIHZvaWQgKCpjbG9zZUZyb21Ib3N0KSh2b2lkKiBod3BpcGUpOworICAgIHZvaWQgKCpzaWduYWxXYWtlKSh2b2lkKiBod3BpcGUsIHVuc2lnbmVkIGZsYWdzKTsKK30gQW5kcm9pZFBpcGVId0Z1bmNzOworCisvLyBDaGFuZ2UgdGhlIHNldCBvZiBBbmRyb2lkUGlwZUh3RnVuY3MgY29ycmVzcG9uZGluZyB0byB0aGUgaGFyZHdhcmUgdmlydHVhbAorLy8gZGV2aWNlLCByZXR1cm4gdGhlIG9sZCB2YWx1ZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSB2aXJ0dWFsIGRldmljZQorLy8gd2hlbiBpdCBpcyByZWFsaXplZCAvIGluaXRpYWxpemVkLgorZXh0ZXJuIGNvbnN0IEFuZHJvaWRQaXBlSHdGdW5jcyogYW5kcm9pZF9waXBlX3NldF9od19mdW5jcygKKyAgICAgICAgY29uc3QgQW5kcm9pZFBpcGVId0Z1bmNzKiBod19mdW5jcyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9ob3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVjYTgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2hvc3QuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FuZHJvaWRQaXBlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgQ1N0cmVhbSA9IDo6U3RyZWFtOwordXNpbmcgQmFzZVN0cmVhbSA9IDo6YW5kcm9pZDo6YmFzZTo6U3RyZWFtOwordXNpbmcgU2VydmljZSA9IEFuZHJvaWRQaXBlOjpTZXJ2aWNlOworCituYW1lc3BhY2UgeworCitzdGF0aWMgQ1N0cmVhbSogYXNDU3RyZWFtKEJhc2VTdHJlYW0qIHN0cmVhbSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PENTdHJlYW0qPihzdHJlYW0pOworfQorCisvLyBBbiBBbmRyb2lkUGlwZSBkZXJpdmVkIGNsYXNzIG1vZGVsZWQgYXJvdW5kIGEgbGVnYWN5IEFuZHJvaWRQaXBlRnVuY3MKKy8vIHN0cnVjdHVyZS4KK2NsYXNzIExlZ2FjeVBpcGUgOiBwdWJsaWMgQW5kcm9pZFBpcGUgeworcHVibGljOgorICAgIExlZ2FjeVBpcGUodm9pZCogaW5zdGFuY2UsIHZvaWQqIGh3UGlwZSwgU2VydmljZSogc2VydmljZSkKKyAgICAgICAgOiBBbmRyb2lkUGlwZShod1BpcGUsIHNlcnZpY2UpLCBtSW5zdGFuY2UoaW5zdGFuY2UpIHt9CisKKyAgICBjb25zdCBBbmRyb2lkUGlwZUZ1bmNzKiBnZXRGdW5jcygpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RDbG9zZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgYXV0byBmdW5jcyA9IGdldEZ1bmNzKCk7CisgICAgICAgIGlmIChmdW5jcy0+Y2xvc2UpIHsKKyAgICAgICAgICAgIGZ1bmNzLT5jbG9zZShtSW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIC8vIERlbGV0ZSB0aGUgTGVnYWN5UGlwZSBpbnN0YW5jZSwgd2hldGhlciB8bUluc3RhbmNlfCBpcyBkZWxldGVkCisgICAgICAgIC8vIGltbWVkaWF0ZWx5IG9yIG5vdCBkZXBlbmRzIG9uIHRoZSBjbG9zZSgpIGNhbGxiYWNrIGFib3ZlLgorICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIG9uR3Vlc3RQb2xsKCkgY29uc3QgeyByZXR1cm4gZ2V0RnVuY3MoKS0+cG9sbChtSW5zdGFuY2UpOyB9CisKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0UmVjdihBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZ2V0RnVuY3MoKS0+cmVjdkJ1ZmZlcnMobUluc3RhbmNlLCBidWZmZXJzLCBudW1CdWZmZXJzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBvbkd1ZXN0U2VuZChjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZ2V0RnVuY3MoKS0+c2VuZEJ1ZmZlcnMobUluc3RhbmNlLCBidWZmZXJzLCBudW1CdWZmZXJzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25HdWVzdFdhbnRXYWtlT24oaW50IGZsYWdzKSBvdmVycmlkZSB7CisgICAgICAgIGdldEZ1bmNzKCktPndha2VPbihtSW5zdGFuY2UsIGZsYWdzKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25TYXZlKEJhc2VTdHJlYW0qIHN0cmVhbSkgeworICAgICAgICBpZiAoZ2V0RnVuY3MoKS0+c2F2ZSkgeworICAgICAgICAgICAgZ2V0RnVuY3MoKS0+c2F2ZShtSW5zdGFuY2UsIGFzQ1N0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkKiBtSW5zdGFuY2U7Cit9OworCisvLyBBbiB1bi1uYW1lZCBzZXJ2aWNlIGZvciBsZWdhY3kgcGlwZXMuCitjbGFzcyBMZWdhY3lQaXBlU2VydmljZSA6IHB1YmxpYyBTZXJ2aWNlIHsKK3B1YmxpYzoKKyAgICBMZWdhY3lQaXBlU2VydmljZShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUZ1bmNzKiBmdW5jcykKKyAgICAgICAgOiBTZXJ2aWNlKG5hbWUpLCBtT3BhcXVlKG9wYXF1ZSksIG1GdW5jcyhmdW5jcykge30KKworICAgIHZpcnR1YWwgQW5kcm9pZFBpcGUqIGNyZWF0ZSh2b2lkKiBod1BpcGUsIGNvbnN0IGNoYXIqIGFyZ3MpIG92ZXJyaWRlIHsKKyAgICAgICAgdm9pZCogaG9zdFBpcGUgPSBtRnVuY3MtPmluaXQoaHdQaXBlLCBtT3BhcXVlLCBhcmdzKTsKKyAgICAgICAgaWYgKCFob3N0UGlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lQaXBlKGhvc3RQaXBlLCBod1BpcGUsIHRoaXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjYW5Mb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gKG1GdW5jcy0+bG9hZCAhPSBudWxscHRyKTsgfQorCisgICAgdmlydHVhbCBBbmRyb2lkUGlwZSogbG9hZCh2b2lkKiBod1BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZVN0cmVhbSogc3RyZWFtKSBvdmVycmlkZSB7CisgICAgICAgIHZvaWQqIGluc3RhbmNlID0gbUZ1bmNzLT5sb2FkKGh3UGlwZSwgbU9wYXF1ZSwgYXJncywgYXNDU3RyZWFtKHN0cmVhbSkpOworICAgICAgICBpZiAoIWluc3RhbmNlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTGVnYWN5UGlwZShpbnN0YW5jZSwgaHdQaXBlLCB0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkKiBtT3BhcXVlOworICAgIGNvbnN0IEFuZHJvaWRQaXBlRnVuY3MqIG1GdW5jczsKK307CisKK2NvbnN0IEFuZHJvaWRQaXBlRnVuY3MqIExlZ2FjeVBpcGU6OmdldEZ1bmNzKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IExlZ2FjeVBpcGVTZXJ2aWNlKj4obVNlcnZpY2UpLT5tRnVuY3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZShjb25zdCBjaGFyKiBwaXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBpcGVPcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUZ1bmNzKiBwaXBlRnVuY3MpIHsKKyAgICBhdXRvIHNlcnZpY2UgPQorICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OkxlZ2FjeVBpcGVTZXJ2aWNlKHBpcGVOYW1lLCBwaXBlT3BhcXVlLCBwaXBlRnVuY3MpOworICAgIGFuZHJvaWQ6OlNlcnZpY2U6OmFkZChzZXJ2aWNlKTsKK30KKwordm9pZCBhbmRyb2lkX3BpcGVfcmVzZXRfc2VydmljZSh2b2lkKSB7CisgICAgYW5kcm9pZDo6U2VydmljZTo6cmVzZXRBbGwoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2hvc3QuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJhOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5oCkBAIC0wLDAgKzEsMTM3IEBACisvKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJlYW0uaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gVGhlIHNldCBvZiBtZXRob2RzIGltcGxlbWVudGVkIGJ5IGFuIEFuZHJvaWRQaXBlIGluc3RhbmNlLgorLy8gQWxsIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBhdCBydW50aW1lIGJ5IHRoZSB2aXJ0dWFsIGRldmljZQorLy8gaW1wbGVtZW50YXRpb24uIE5vdGUgdGhhdCB0cmFuc2ZlcnMgYXJlIGFsd2F5cyBpbml0aWF0ZWQgYnkgdGhlIHZpcnR1YWwKKy8vIGRldmljZSB0aHJvdWdoIHRoZSBzZW5kQnVmZmVycygpIGFuZCByZWN2QnVmZmVycygpIGNhbGxiYWNrcy4KKy8vCisvLyBNb3JlIHNwZWNpZmljYWxseToKKy8vCisvLyAtIFdoZW4gYSBwaXBlIGhhcyBkYXRhIGZvciB0aGUgZ3Vlc3QsIGl0IHNob3VsZCBzaWduYWwgaXQgYnkgY2FsbGluZworLy8gICAnYW5kcm9pZF9waXBlX2hvc3Rfc2lnbmFsX3dha2UocGlwZSwgUElQRV9XQUtFX1JFQUQpJy4gVGhlIGd1ZXN0IGtlcm5lbAorLy8gICB3aWxsIGJlIHNpZ25hbGVkIGFuZCB3aWxsIGxhdGVyIGluaXRpYXRlIGEgcmVjdkJ1ZmZlcnMoKSBjYWxsLgorLy8KKy8vIC0gV2hlbiBhIHBpcGUgaXMgcmVhZHkgdG8gYWNjZXB0IGRhdGEgZnJvbSB0aGUgZ3Vlc3QsIGl0IHNob3VsZCBzaWduYWwKKy8vICAgaXQgYnkgY2FsbGluZyAnYW5kcm9pZF9waXBlX2hvc3Rfc2lnbmFsX3dha2UocGlwZSwgUElQRV9XQUtFX1dSSVRFKScuIFRoZQorLy8gICBndWVzdCBrZXJuZWwgd2lsbCBiZSBzaWduYWxlZCwgYW5kIHdpbGwgbGF0ZXIgaW5pdGlhdGUgYSBzZW5kQnVmZmVycygpCisvLyAgIGNhbGwgd2hlbiB0aGUgZ3Vlc3QgY2xpZW50IHdyaXRlcyBkYXRhIHRvIHRoZSBwaXBlLgorLy8KKy8vIC0gRmluYWxseSwgdGhlIGd1ZXN0IGtlcm5lbCBjYW4gc2lnbmFsIHdoZXRoZXIgaXQgd2FudHMgdG8gYmUgc2lnbmFsZWQKKy8vICAgb24gcmVhZCBvciB3cml0ZSBldmVudHMgYnkgY2FsbGluZyB0aGUgd2FrZU9uKCkgY2FsbGJhY2suCisvLworLy8gLSBXaGVuIHRoZSBlbXVsYXRvciB3YW50cyB0byBjbG9zZSBhIHBpcGUsIGl0IHNoYWxsIGNhbGwKKy8vICAgYW5kcm9pZF9waXBlX2hvc3RfY2xvc2UoKS4gVGhpcyBzaWduYWxzIHRoZSBndWVzdCBrZXJuZWwgd2hpY2ggd2lsbCBsYXRlcgorLy8gICBpbml0aWF0ZSBhIGNsb3NlKCkgY2FsbC4KKy8vCit0eXBlZGVmIHN0cnVjdCBBbmRyb2lkUGlwZUZ1bmNzIHsKKyAgICAvLyBDYWxsIHRvIG9wZW4gYSBuZXcgcGlwZSBpbnN0YW5jZS4gfGh3cGlwZXwgaXMgYSBkZXZpY2Utc2lkZSB2aWV3IG9mIHRoZQorICAgIC8vIHBpcGUgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZSgpIGFuZAorICAgIC8vIGFuZHJvaWRfcGlwZV9ob3N0X2Nsb3NlKCkKKyAgICAvLyBmdW5jdGlvbnMuIHxzZXJ2aWNlT3BhcXVlfCBpcyB0aGUgcGFyYW1ldGVyIHBhc3NlZCB0bworICAgIC8vIGFuZHJvaWRfcGlwZV9hZGRfdHlwZSgpLCBhbmQgfGFyZ3N8IGlzIGVpdGhlciBOVUxMCisgICAgLy8gb3IgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIHNlcnZpY2Ugd2hlbiBvcGVuaW5nIHRoZSBjb25uZWN0aW9uLgorICAgIC8vIFJldHVybiBhIG5ldyBzZXJ2aWNlIHBpcGUgaW5zdGFuY2UsIG9yIE5VTEwgb24gZXJyb3IuCisgICAgdm9pZCogKCppbml0KSh2b2lkKiBod3BpcGUsIHZvaWQqIHNlcnZpY2VPcGFxdWUsIGNvbnN0IGNoYXIqIGFyZ3MpOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGd1ZXN0IGtlcm5lbCBoYXMgZmluYWxseSBjbG9zZWQgYSBwaXBlIGNvbm5lY3Rpb24uCisgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSBvbmUgc2hvdWxkIHJlbGVhc2UvZnJlZSB0aGUgaW5zdGFuY2UsIGJ1dCBuZXZlcgorICAgIC8vIGNhbGwgdGhpcyBkaXJlY3RseSwgdXNlIGFuZHJvaWRfcGlwZV9ob3N0X2Nsb3NlKCkgaW5zdGVhZC4gfHBpcGV8IGlzIGEKKyAgICAvLyBjbGllbnQKKyAgICAvLyBpbnN0YW5jZSByZXR1cm5lZCBieSBpbml0KCkgb3IgbG9hZCgpLgorICAgIHZvaWQgKCpjbG9zZSkodm9pZCogc2VydmljZV9waXBlKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBndWVzdCB3YW50cyB0byB3cml0ZSBkYXRhIHRvIHRoZSB8cGlwZXwgY2xpZW50IGluc3RhbmNlLAorICAgIC8vIHxidWZmZXJzfCBwb2ludHMgdG8gYW4gYXJyYXkgb2YgfG51bUJ1ZmZlcnN8IGRlc2NyaXB0b3JzIHRoYXQgZGVzY3JpYmUKKyAgICAvLyB3aGVyZSB0byBjb3B5IHRoZSBkYXRhIGZyb20uIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZQorICAgIC8vIGFjdHVhbGx5IHRyYW5zZmVycmVkLCAwIGZvciBFT0Ygc3RhdHVzLCBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlCisgICAgLy8gb3RoZXJ3aXNlLCBpbmNsdWRpbmcgUElQRV9FUlJPUl9BR0FJTiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbXVsYXRvcgorICAgIC8vIGlzIG5vdCByZWFkeSB5ZXQgdG8gcmVjZWl2ZSBkYXRhLgorICAgIGludCAoKnNlbmRCdWZmZXJzKSh2b2lkKiBzZXJ2aWNlX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycyk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgZ3Vlc3Qgd2FudHMgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHxwaXBlfCBjbGllbnQsCisgICAgLy8gfGJ1ZmZlcnN8IHBvaW50cyB0byBhbiBhcnJheSBvZiB8bnVtQnVmZmVyc3wgZGVzY3JpcHRvcnMgdGhhdCBkZXNjcmliZQorICAgIC8vIHdoZXJlIHRvIGNvcHkgdGhlIGRhdGEgdG8uIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZQorICAgIC8vIGFjdHVhbGx5IHRyYW5zZmVycmVkLCAwIGZvciBFT0Ygc3RhdHVzLCBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlCisgICAgLy8gb3RoZXJ3aXNlLCBpbmNsdWRpbmcgUElQRV9FUlJPUl9BR0FJTiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBlbXVsYXRvcgorICAgIC8vIGRvZXNuJ3QgaGF2ZSBkYXRhIGZvciB0aGUgZ3Vlc3QgeWV0LgorICAgIGludCAoKnJlY3ZCdWZmZXJzKSh2b2lkKiBzZXJ2aWNlX3BpcGUsCisgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycyk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBndWVzdCB3YW50cyB0byBwb2xsIHRoZSByZWFkL3dyaXRlIHN0YXR1cyBmb3IgdGhlIHxwaXBlfAorICAgIC8vIGNsaWVudC4gU2hvdWxkIHJldHVybiBhIGNvbWJpbmF0aW9uIG9mIFBJUEVfUE9MTF9YWFggZmxhZ3MuCisgICAgdW5zaWduZWQgKCpwb2xsKSh2b2lkKiBzZXJ2aWNlX3BpcGUpOworCisgICAgLy8gQ2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBndWVzdCB3YW50cyB0byBiZSB3b2tlbiB3aGVuIHRoZSBzZXQgb2YKKyAgICAvLyBQSVBFX1dBS0VfWFhYIGJpdC1mbGFncyBpbiB8ZmxhZ3N8IG9jY3VyLiBXaGVuIHRoZSBjb25kaXRpb24gb2NjdXJzLAorICAgIC8vIHRoZW4gdGhlIHxzZXJ2aWNlX3BpcGV8IGNsaWVudCBzaGFsbCBjYWxsCisgICAgLy8gYW5kcm9pZF9waXBlX2hvc3Rfc2lnbmFsX3dha2UoKS4KKyAgICB2b2lkICgqd2FrZU9uKSh2b2lkKiBzZXJ2aWNlX3BpcGUsIGludCBmbGFncyk7CisKKyAgICAvLyBDYWxsZWQgdG8gc2F2ZSB0aGUgfHNlcnZpY2VfcGlwZXwgY2xpZW50J3Mgc3RhdGUgdG8gYSBTdHJlYW0sIGkuZS4gd2hlbgorICAgIC8vIHNhdmluZyBzbmFwc2hvdHMuCisgICAgdm9pZCAoKnNhdmUpKHZvaWQqIHNlcnZpY2VfcGlwZSwgU3RyZWFtKiBmaWxlKTsKKworICAgIC8vIENhbGxlZCB0byBsb2FkIHRoZSBzYXRlIG9mIGEgcGlwZSBjbGllbnQgZnJvbSBhIFN0cmVhbS4gVGhpcyB3aWxsIGFsd2F5cworICAgIC8vIGNvcnJlc3BvbmQgdG8gdGhlIHN0YXRlIG9mIHRoZSBjbGllbnQgYXMgc2F2ZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvCisgICAgLy8gdGhlICdzYXZlJyBtZXRob2QuIENhbiBiZSBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhlIHBpcGUgc3RhdGUgY2Fubm90CisgICAgLy8gYmUgbG9hZGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBlbXVsYXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgZm9yY2UtY2xvc2UKKyAgICAvLyBpdC4gUGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byBpbml0KCksIHdpdGggdGhlIGFkZGl0aW9uIG9mIHxmaWxlfAorICAgIC8vIHdoaWNoIGlzIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgdm9pZCogKCpsb2FkKSh2b2lkKiBod3BpcGUsIHZvaWQqIHNlcnZpY2VPcGFxdWUsIGNvbnN0IGNoYXIqIGFyZ3MsCisgICAgICAgICAgICAgICAgICBTdHJlYW0qIGZpbGUpOworCit9IEFuZHJvaWRQaXBlRnVuY3M7CisKKy8qIFJlZ2lzdGVyIGEgbmV3IHBpcGUgc2VydmljZSB0eXBlLiB8c2VydmljZU9wYXF1ZXwgaXMgcGFzc2VkIGRpcmVjdGx5CisgKiB0byAnaW5pdCgpIHdoZW4gYSBuZXcgcGlwZSBpcyBjb25uZWN0ZWQgdG8uCisgKi8KK2V4dGVybiB2b2lkICBhbmRyb2lkX3BpcGVfYWRkX3R5cGUoY29uc3QgY2hhciogc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHNlcnZpY2VPcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRQaXBlRnVuY3MqIHBpcGVGdW5jcyk7CisKKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBvbmx5IHVzZWQgZHVyaW5nIHVuaXQtdGVzdGluZy4KKworLy8gUmVzZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMgcmVnaXN0ZXJlZCB0aHJvdWdoIGFuZHJvaWRfcGlwZV9hZGRfdHlwZSgpLgorLy8gVXNlZnVsIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGEgdW5pdC10ZXN0LgorZXh0ZXJuIHZvaWQgYW5kcm9pZF9waXBlX3Jlc2V0X3NlcnZpY2VzKHZvaWQpOworCisvKiBUaGlzIHRlbGxzIHRoZSBndWVzdCBzeXN0ZW0gdGhhdCB3ZSB3YW50IHRvIGNsb3NlIHRoZSBwaXBlIGFuZCB0aGF0CisgKiBmdXJ0aGVyIGF0dGVtcHRzIHRvIHJlYWQgb3Igd3JpdGUgdG8gaXQgd2lsbCBmYWlsLiBUaGlzIHdpbGwgbm90CisgKiBuZWNlc3NhcmlseSBkZXN0cm95cyB0aGUgfGh3cGlwZXwgaW1tZWRpYXRlbHkuIFRoZSBsYXR0ZXIgd2lsbCBjYWxsCisgKiBhbmRyb2lkX3BpcGVfZ3Vlc3RfY2xvc2UoKSBhdCBkZXN0cnVjdGlvbiB0aW1lIHRob3VnaC4KKyAqCisgKiBUaGlzIHdpbGwgYWxzbyB3YWtlLXVwIGFueSBibG9ja2VkIGd1ZXN0IHRocmVhZHMgd2FpdGluZyBmb3IgaS9vLgorICogTk9URTogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KKyAqLworZXh0ZXJuIHZvaWQgYW5kcm9pZF9waXBlX2hvc3RfY2xvc2Uodm9pZCogaHdwaXBlKTsKKworLyogU2lnbmFsIHRoYXQgdGhlIHBpcGUgY2FuIGJlIHdva2VuIHVwLiAnZmxhZ3MnIG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZgorICogUElQRV9XQUtFX1JFQUQgYW5kIFBJUEVfV0FLRV9XUklURS4KKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIGFueSB0aHJlYWQuCisgKi8KK2V4dGVybiB2b2lkIGFuZHJvaWRfcGlwZV9ob3N0X3NpZ25hbF93YWtlKHZvaWQqIGh3cGlwZSwgdW5zaWduZWQgZmxhZ3MpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Bpbmdwb25nLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9waW5ncG9uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NTYzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9waW5ncG9uZy5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Bpbmdwb25nLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHID49IDEKKyMgIGRlZmluZSBEKC4uLikgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyksIGZwcmludGYoc3RkZXJyLCAiXG4iKQorI2Vsc2UKKyMgIGRlZmluZSBEKC4uLikgICh2b2lkKTAKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioKKyAqKioqKiAgICBQIEkgTiBHICAgUCBPIE4gRyAgIFAgSSBQIEUgUworICoqKioqCisgKioqKiovCisKKy8qIERlYnVnIHNlcnZpY2UgdGhhdCBzZW5kcyBiYWNrIGFueXRoaW5nIGl0IHJlY2VpdmVzICovCisvKiBBbGwgZGF0YSBpcyBrZXB0IGluIGEgY2lyY3VsYXIgZHluYW1pYyBidWZmZXIgKi8KKworLyogSW5pdGlhbCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBQSU5HUE9OR19TSVpFICAxMDI0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiAgICAgaHdwaXBlOworICAgIHVpbnQ4X3QqICBidWZmZXI7CisgICAgc2l6ZV90ICAgIHNpemU7CisgICAgc2l6ZV90ICAgIHBvczsKKyAgICBzaXplX3QgICAgY291bnQ7CisgICAgdW5zaWduZWQgIGZsYWdzOworfSBQaW5nUG9uZ1BpcGU7CisKK3N0YXRpYyB2b2lkCitwaW5nUG9uZ1BpcGVfaW5pdDAoIFBpbmdQb25nUGlwZSogcGlwZSwgdm9pZCogaHdwaXBlLCB2b2lkKiBzdmNPcGFxdWUgKQoreworICAgIHBpcGUtPmh3cGlwZSA9IGh3cGlwZTsKKyAgICBwaXBlLT5zaXplID0gUElOR1BPTkdfU0laRTsKKyAgICBwaXBlLT5idWZmZXIgPSBtYWxsb2MocGlwZS0+c2l6ZSk7CisgICAgcGlwZS0+cG9zID0gMDsKKyAgICBwaXBlLT5jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkKgorcGluZ1BvbmdQaXBlX2luaXQoIHZvaWQqIGh3cGlwZSwgdm9pZCogc3ZjT3BhcXVlLCBjb25zdCBjaGFyKiBhcmdzICkKK3sKKyAgICBQaW5nUG9uZ1BpcGUqICBwcGlwZTsKKworICAgIEFORVcwKHBwaXBlKTsKKyAgICBEKCIlczogcGlwZT0lcCBod3BpcGU9JXAiLCBfX0ZVTkNUSU9OX18sIHBwaXBlLCBod3BpcGUpOworICAgIHBpbmdQb25nUGlwZV9pbml0MChwcGlwZSwgaHdwaXBlLCBzdmNPcGFxdWUpOworICAgIHJldHVybiBwcGlwZTsKK30KKworc3RhdGljIHZvaWQKK3BpbmdQb25nUGlwZV9jbG9zZSggdm9pZCogb3BhcXVlICkKK3sKKyAgICBQaW5nUG9uZ1BpcGUqICBwcGlwZSA9IG9wYXF1ZTsKKworICAgIEQoIiVzOiBwaXBlPSVwIGh3cGlwZT0lcCAocG9zPSVkIGNvdW50PSVkIHNpemU9JWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgcHBpcGUsIHBwaXBlLT5od3BpcGUsIChpbnQpcHBpcGUtPnBvcywgKGludClwcGlwZS0+Y291bnQsIChpbnQpcHBpcGUtPnNpemUpOworICAgIGZyZWUocHBpcGUtPmJ1ZmZlcik7CisgICAgQUZSRUUocHBpcGUpOworfQorCitzdGF0aWMgaW50CitwaW5nUG9uZ1BpcGVfc2VuZEJ1ZmZlcnMoIHZvaWQqIG9wYXF1ZSwgY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzICkKK3sKKyAgICBQaW5nUG9uZ1BpcGUqICBwaXBlID0gb3BhcXVlOworICAgIGludCAgcmV0ID0gMDsKKyAgICBpbnQgIGNvdW50OworICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmID0gYnVmZmVyczsKKyAgICBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZkVuZCA9IGJ1ZmYgKyBudW1CdWZmZXJzOworCisgICAgY291bnQgPSAwOworICAgIGZvciAoIDsgYnVmZiA8IGJ1ZmZFbmQ7IGJ1ZmYrKyApCisgICAgICAgIGNvdW50ICs9IGJ1ZmYtPnNpemU7CisKKyAgICBEKCIlczogcGlwZT0lcCBjb3VudD0lZCBieXRlcz0lZCIsIF9fRlVOQ1RJT05fXywgcGlwZSwgbnVtQnVmZmVycywgY291bnQpOworICAgIC8qIERvIHdlIG5lZWQgdG8gZ3JvdyB0aGUgcGluZ3BvbmcgYnVmZmVyPyAqLworICAgIHdoaWxlIChjb3VudCA+IHBpcGUtPnNpemUgLSBwaXBlLT5jb3VudCkgeworICAgICAgICBzaXplX3QgICAgbmV3c2l6ZSA9IHBpcGUtPnNpemUqMjsKKyAgICAgICAgdWludDhfdCogIG5ld2J1ZmYgPSByZWFsbG9jKHBpcGUtPmJ1ZmZlciwgbmV3c2l6ZSk7CisgICAgICAgIGludCAgICAgICB3cG9zICAgID0gcGlwZS0+cG9zICsgcGlwZS0+Y291bnQ7CisgICAgICAgIGlmIChuZXdidWZmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh3cG9zID4gcGlwZS0+c2l6ZSkgeworICAgICAgICAgICAgd3BvcyAtPSBwaXBlLT5zaXplOworICAgICAgICAgICAgbWVtY3B5KG5ld2J1ZmYgKyBwaXBlLT5zaXplLCBuZXdidWZmLCB3cG9zKTsKKyAgICAgICAgfQorICAgICAgICBwaXBlLT5idWZmZXIgPSBuZXdidWZmOworICAgICAgICBwaXBlLT5zaXplICAgPSBuZXdzaXplOworICAgICAgICBEKCJwaW5ncG9uZyBidWZmZXIgaXMgbm93ICVkIGJ5dGVzIiwgbmV3c2l6ZSk7CisgICAgfQorCisgICAgZm9yICggYnVmZiA9IGJ1ZmZlcnM7IGJ1ZmYgPCBidWZmRW5kOyBidWZmKysgKSB7CisgICAgICAgIGludCBhdmFpbCA9IHBpcGUtPnNpemUgLSBwaXBlLT5jb3VudDsKKyAgICAgICAgaWYgKGF2YWlsIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBQSVBFX0VSUk9SX0FHQUlOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2YWlsID4gYnVmZi0+c2l6ZSkgeworICAgICAgICAgICAgYXZhaWwgPSBidWZmLT5zaXplOworICAgICAgICB9CisKKyAgICAgICAgaW50IHdwb3MgPSBwaXBlLT5wb3MgKyBwaXBlLT5jb3VudDsKKyAgICAgICAgaWYgKHdwb3MgPj0gcGlwZS0+c2l6ZSkgeworICAgICAgICAgICAgd3BvcyAtPSBwaXBlLT5zaXplOworICAgICAgICB9CisgICAgICAgIGlmICh3cG9zICsgYXZhaWwgPD0gcGlwZS0+c2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KHBpcGUtPmJ1ZmZlciArIHdwb3MsIGJ1ZmYtPmRhdGEsIGF2YWlsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCAgYXZhaWwyID0gcGlwZS0+c2l6ZSAtIHdwb3M7CisgICAgICAgICAgICBtZW1jcHkocGlwZS0+YnVmZmVyICsgd3BvcywgYnVmZi0+ZGF0YSwgYXZhaWwyKTsKKyAgICAgICAgICAgIG1lbWNweShwaXBlLT5idWZmZXIsIGJ1ZmYtPmRhdGEgKyBhdmFpbDIsIGF2YWlsIC0gYXZhaWwyKTsKKyAgICAgICAgfQorICAgICAgICBwaXBlLT5jb3VudCArPSBhdmFpbDsKKyAgICAgICAgcmV0ICs9IGF2YWlsOworICAgIH0KKworICAgIC8qIFdha2UgdXAgYW55IHdhaXRpbmcgcmVhZGVycyBpZiB3ZSB3cm90ZSBzb21ldGhpbmcgKi8KKyAgICBpZiAocGlwZS0+Y291bnQgPiAwICYmIChwaXBlLT5mbGFncyAmIFBJUEVfV0FLRV9SRUFEKSkgeworICAgICAgICBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZShwaXBlLT5od3BpcGUsIFBJUEVfV0FLRV9SRUFEKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitwaW5nUG9uZ1BpcGVfcmVjdkJ1ZmZlcnMoIHZvaWQqIG9wYXF1ZSwgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzICkKK3sKKyAgICBQaW5nUG9uZ1BpcGUqICBwaXBlID0gb3BhcXVlOworICAgIGludCAgcmV0ID0gMDsKKworI2lmIERFQlVHCisgICAgeworICAgICAgICBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZiA9IGJ1ZmZlcnM7CisgICAgICAgIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmRW5kID0gYnVmZiArIG51bUJ1ZmZlcnM7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIChidWZmIDwgYnVmZkVuZCkgeworICAgICAgICAgICAgY291bnQgKz0gYnVmZi0+c2l6ZTsKKyAgICAgICAgICAgIGJ1ZmYrKzsKKyAgICAgICAgfQorICAgICAgICBEKCIlczogcGlwZT0lcCBjb3VudD0lZCBieXRlcz0lZCIsIF9fRlVOQ1RJT05fXywgcGlwZSwgbnVtQnVmZmVycywgY291bnQpOworICAgIH0KKyNlbmRpZgorCisgICAgd2hpbGUgKG51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGludCBhdmFpbCA9IHBpcGUtPmNvdW50OworICAgICAgICBpZiAoYXZhaWwgPD0gMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IFBJUEVfRVJST1JfQUdBSU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZhaWwgPiBidWZmZXJzWzBdLnNpemUpIHsKKyAgICAgICAgICAgIGF2YWlsID0gYnVmZmVyc1swXS5zaXplOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJwb3MgPSBwaXBlLT5wb3M7CisKKyAgICAgICAgaWYgKHJwb3MgKyBhdmFpbCA8PSBwaXBlLT5zaXplKSB7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyc1swXS5kYXRhLCBwaXBlLT5idWZmZXIgKyBycG9zLCBhdmFpbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgIGF2YWlsMiA9IHBpcGUtPnNpemUgLSBycG9zOworICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlcnNbMF0uZGF0YSwgcGlwZS0+YnVmZmVyICsgcnBvcywgYXZhaWwyKTsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXJzWzBdLmRhdGEgKyBhdmFpbDIsIHBpcGUtPmJ1ZmZlciwgYXZhaWwgLSBhdmFpbDIpOworICAgICAgICB9CisgICAgICAgIHBpcGUtPmNvdW50IC09IGF2YWlsOworICAgICAgICBwaXBlLT5wb3MgICArPSBhdmFpbDsKKyAgICAgICAgaWYgKHBpcGUtPnBvcyA+PSBwaXBlLT5zaXplKSB7CisgICAgICAgICAgICBwaXBlLT5wb3MgLT0gcGlwZS0+c2l6ZTsKKyAgICAgICAgfQorICAgICAgICByZXQgKz0gYXZhaWw7CisgICAgICAgIG51bUJ1ZmZlcnMtLTsKKyAgICAgICAgYnVmZmVycysrOworICAgIH0KKworICAgIC8qIFdha2UgdXAgYW55IHdhaXRpbmcgcmVhZGVycyBpZiB3ZSB3cm90ZSBzb21ldGhpbmcgKi8KKyAgICBpZiAocGlwZS0+Y291bnQgPCBQSU5HUE9OR19TSVpFICYmIChwaXBlLT5mbGFncyAmIFBJUEVfV0FLRV9XUklURSkpIHsKKyAgICAgICAgYW5kcm9pZF9waXBlX2hvc3Rfc2lnbmFsX3dha2UocGlwZS0+aHdwaXBlLCBQSVBFX1dBS0VfV1JJVEUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorcGluZ1BvbmdQaXBlX3BvbGwoIHZvaWQqIG9wYXF1ZSApCit7CisgICAgUGluZ1BvbmdQaXBlKiAgcGlwZSA9IG9wYXF1ZTsKKyAgICB1bnNpZ25lZCAgICAgICByZXQgPSAwOworCisgICAgLy8gWW91IGNhbiBhbHdheXMgd3JpdGUgdG8gdGhlIHBpcGUsIHNpbmNlIHRoZSBidWZmZXIgd2lsbAorICAgIC8vIGJlIGR5bmFtaWNhbGx5IHJlc2l6ZWQuCisgICAgcmV0IHw9IFBJUEVfUE9MTF9PVVQ7CisKKyAgICBpZiAocGlwZS0+Y291bnQgPiAwKQorICAgICAgICByZXQgfD0gUElQRV9QT0xMX0lOOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3BpbmdQb25nUGlwZV93YWtlT24oIHZvaWQqIG9wYXF1ZSwgaW50IGZsYWdzICkKK3sKKyAgICBQaW5nUG9uZ1BpcGUqIHBpcGUgPSBvcGFxdWU7CisgICAgcGlwZS0+ZmxhZ3MgfD0gKHVuc2lnbmVkKWZsYWdzOworfQorCitzdGF0aWMgY29uc3QgQW5kcm9pZFBpcGVGdW5jcyAgcGluZ1BvbmdQaXBlX2Z1bmNzID0geworICAgIHBpbmdQb25nUGlwZV9pbml0LAorICAgIHBpbmdQb25nUGlwZV9jbG9zZSwKKyAgICBwaW5nUG9uZ1BpcGVfc2VuZEJ1ZmZlcnMsCisgICAgcGluZ1BvbmdQaXBlX3JlY3ZCdWZmZXJzLAorICAgIHBpbmdQb25nUGlwZV9wb2xsLAorICAgIHBpbmdQb25nUGlwZV93YWtlT24sCit9OworCit2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZV9waW5ncG9uZyh2b2lkKSB7CisgICAgYW5kcm9pZF9waXBlX2FkZF90eXBlKCJwaW5ncG9uZyIsIE5VTEwsICZwaW5nUG9uZ1BpcGVfZnVuY3MpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfcGluZ3BvbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Bpbmdwb25nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzY2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Bpbmdwb25nLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFJlZ2lzdGVyIHRoZSAncGluZ3BvbmcnIEFuZHJvaWQgcGlwZSBzZXJ2aWNlLgordm9pZCBhbmRyb2lkX3BpcGVfYWRkX3R5cGVfcGluZ3Bvbmcodm9pZCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfcGluZ3BvbmdfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfcGluZ3BvbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTYzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9waW5ncG9uZ191bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0QW5kcm9pZFBpcGVEZXZpY2UuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCit1c2luZyBHdWVzdCA9IGFuZHJvaWQ6OlRlc3RBbmRyb2lkUGlwZURldmljZTo6R3Vlc3Q7CisKKy8vIEEgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHRoYXQgcHJvdmlkZXMgdGhlICdwaW5ncG9uZycgc2VydmljZS4KK2V4dGVybiAiQyIgdm9pZCBhbmRyb2lkX3BpcGVfYWRkX3R5cGVfcGluZ3Bvbmcodm9pZCk7CisKK2NsYXNzIFBpbmdQb25nUGlwZURldmljZSA6IHB1YmxpYyBhbmRyb2lkOjpUZXN0QW5kcm9pZFBpcGVEZXZpY2UgeworcHVibGljOgorICAgIFBpbmdQb25nUGlwZURldmljZSgpIHsKKyAgICAgICAgYW5kcm9pZF9waXBlX2FkZF90eXBlX3Bpbmdwb25nKCk7CisgICAgfQorfTsKKworVEVTVChBbmRyb2lkUGlwZSwgUGluZ1BvbmdQaXBlV3JpdGVzQW5kUmVhZHNPZlRoZVNhbWVTaXplKSB7CisgICAgUGluZ1BvbmdQaXBlRGV2aWNlIGRldjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R3Vlc3Q+IGd1ZXN0KEd1ZXN0OjpjcmVhdGUoKSk7CisgICAgRVhQRUNUX0VRKDAsIGd1ZXN0LT5jb25uZWN0KCJwaW5ncG9uZyIpKTsKKyAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaXplc1tdID0geworICAgICAgICAwLCAxMDAsIDEyOCwgMjU2LCA1MTIsIDEwMDAsIDIwNDgsIDgxOTIsIDY1NTM1NiwKKyAgICB9OworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgQVJSQVlfU0laRShrU2l6ZXMpOyBuKyspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBrU2l6ZXNbbl07CisKKyAgICAgICAgLy8gQWxsb2NhdGUgYW5kIGZpbGwgYnVmZmVyIHdpdGggc2ltcGxlIHBhdHRlcm4uCisgICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihzaXplLCAneCcpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMHU7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgICAgIGJ1ZmZlcltpXSA9IChjaGFyKShpICsgc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZW5kIGJ1ZmZlciB0byBzZXJ2aWNlLgorICAgICAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisgICAgICAgIEVYUEVDVF9FUShzaXplLCBndWVzdC0+d3JpdGUoYnVmZmVyLmNfc3RyKCksIHNpemUpKTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX0lOfFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworICAgICAgICAgICAgLy8gRXJhc2UgYnVmZmVyLCB0aGVuIHJlY2VpdmUgZGF0YSBmcm9tIHNlcnZpY2UuCisgICAgICAgICAgICBtZW1zZXQoJmJ1ZmZlclswXSwgJ1x4ZmYnLCBzaXplKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShzaXplLCBndWVzdC0+cmVhZCgmYnVmZmVyWzBdLCBzaXplKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIHJldHVybmVkIHBhdHRlcm4KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgRVhQRUNUX0VRKChjaGFyKShpICsgc2l6ZSksIGJ1ZmZlcltpXSkgPDwgIiMgIiA8PCBpIDw8ICIgLyAiIDw8IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfR1QoMCwgZ3Vlc3QtPnJlYWQoJmJ1ZmZlclswXSwgc2l6ZSkpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUKEFuZHJvaWRQaXBlLCBQaW5nUG9uZ1BpcGVMYXJnZVdyaXRlV2l0aFNtYWxsUmVhZHMpIHsKKyAgIFBpbmdQb25nUGlwZURldmljZSBkZXY7CisgICAgc3RkOjp1bmlxdWVfcHRyPEd1ZXN0PiBndWVzdChHdWVzdDo6Y3JlYXRlKCkpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgicGluZ3BvbmciKSk7CisgICAgRVhQRUNUX0VRKFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworCisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAxMDAwMDA7CisgICAgc3RkOjpzdHJpbmcgYnVmZmVyKHNpemUsICd4Jyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKGNoYXIpaTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZ3Vlc3QtPndyaXRlKGJ1ZmZlci5jX3N0cigpLCBzaXplKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBjaGFyIHRtcFsxXTsKKyAgICAgICAgRVhQRUNUX0VRKFBJUEVfUE9MTF9JTnxQSVBFX1BPTExfT1VULCBndWVzdC0+cG9sbCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDEsIGd1ZXN0LT5yZWFkKHRtcCwgMSkpOworICAgICAgICBFWFBFQ1RfRVEoKGNoYXIpaSwgdG1wWzBdKSA8PCAiIyAiIDw8IGkgPDwgIiBleHBlY3RlZCAiIDw8IChjaGFyKWk7CisgICAgfQorICAgIEVYUEVDVF9FUShQSVBFX1BPTExfT1VULCBndWVzdC0+cG9sbCgpKTsKK30KKworVEVTVChBbmRyb2lkUGlwZSwgUGluZ1BvbmdTbWFsbFdyaXRlc0FuZExhcmdlUmVhZCkgeworICAgUGluZ1BvbmdQaXBlRGV2aWNlIGRldjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R3Vlc3Q+IGd1ZXN0KEd1ZXN0OjpjcmVhdGUoKSk7CisgICAgRVhQRUNUX0VRKDAsIGd1ZXN0LT5jb25uZWN0KCJwaW5ncG9uZyIpKTsKKyAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IDEwMDAwMDsKKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoc2l6ZSwgJ3gnKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBidWZmZXJbaV0gPSAoY2hhcilpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUSgxLCBndWVzdC0+d3JpdGUoJmJ1ZmZlcltpXSwgMSkpIDw8ICIjICIgPDwgaSA8PCAiIC8gIiA8PCBzaXplOworICAgICAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX0lOfFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworICAgIH0KKworICAgIG1lbXNldCgmYnVmZmVyWzBdLCAnXHhmZicsIHNpemUpOworCisgICAgRVhQRUNUX0VRKHNpemUsIGd1ZXN0LT5yZWFkKCZidWZmZXJbMF0sIHNpemUpKTsKKyAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoKGNoYXIpaSwgYnVmZmVyW2ldKSA8PCAiIyAiIDw8IGkgPDwgIiAvICIgPDwgc2l6ZTsKKyAgICB9CisgICAgRVhQRUNUX0VRKFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfdGhyb3R0bGUuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Rocm90dGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiM2RhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Rocm90dGxlLmMKQEAgLTAsMCArMSwzMjEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfdGhyb3R0bGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9ob3N0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBERUJVRyAwCisKKyNpZiBERUJVRyA+PSAxCisjICBkZWZpbmUgRCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKyNlbHNlCisjICBkZWZpbmUgRCguLi4pICAodm9pZCkwCisjZW5kaWYKKworI2lmIERFQlVHID49IDIKKyMgIGRlZmluZSBERCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKyNlbHNlCisjICBkZWZpbmUgREQoLi4uKSAgKHZvaWQpMAorI2VuZGlmCisKKyNkZWZpbmUgVElDS1NfUEVSX1NFQ09ORCAgMTAwMC4KKworc3RhdGljIGludDY0X3QgY2xvY2tfbm93KHZvaWQpIHsKKyAgICByZXR1cm4gbG9vcGVyX25vdyhsb29wZXJfZ2V0Rm9yVGhyZWFkKCkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogICAgVCBIIFIgTyBUIFQgTCBFICAgUCBJIFAgRSBTCisgKioqKioKKyAqKioqKi8KKworLyogU2ltaWxhciB0byBQaW5nUG9uZ1BpcGUsIGJ1dCB3aWxsIHRocm90dGxlIHRoZSBiYW5kd2lkdGggdG8gdGVzdAorICogYmxvY2tpbmcgSS9PLgorICovCisKKy8qIEluaXRpYWwgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgUElOR1BPTkdfU0laRSAgMTAyNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogICAgICAgICBod3BpcGU7CisgICAgdWludDhfdCogICAgICBidWZmZXI7CisgICAgc2l6ZV90ICAgICAgICBzaXplOworICAgIHNpemVfdCAgICAgICAgcG9zOworICAgIHNpemVfdCAgICAgICAgY291bnQ7CisgICAgdW5zaWduZWQgICAgICBmbGFnczsKKyAgICBkb3VibGUgICAgICAgIHNlbmRSYXRlOworICAgIGludDY0X3QgICAgICAgc2VuZEV4cGlyYXRpb247CisgICAgZG91YmxlICAgICAgICByZWN2UmF0ZTsKKyAgICBpbnQ2NF90ICAgICAgIHJlY3ZFeHBpcmF0aW9uOworICAgIExvb3BUaW1lciogICAgdGltZXI7Cit9IFRocm90dGxlUGlwZTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgdGhyb3R0bGVQaXBlX3RpbWVyRnVuYyh2b2lkKiBvcGFxdWUsIExvb3BUaW1lciogdGltZXIpOworCitzdGF0aWMgdm9pZCoKK3Rocm90dGxlUGlwZV9pbml0KCB2b2lkKiBod3BpcGUsIHZvaWQqIHN2Y09wYXF1ZSwgY29uc3QgY2hhciogYXJncyApCit7CisgICAgVGhyb3R0bGVQaXBlKiBwaXBlOworCisgICAgQU5FVzAocGlwZSk7CisgICAgcGlwZS0+aHdwaXBlID0gaHdwaXBlOworICAgIHBpcGUtPnNpemUgPSBQSU5HUE9OR19TSVpFOworICAgIHBpcGUtPmJ1ZmZlciA9IG1hbGxvYyhwaXBlLT5zaXplKTsKKyAgICBwaXBlLT5wb3MgPSAwOworICAgIHBpcGUtPmNvdW50ID0gMDsKKyAgICBwaXBlLT50aW1lciA9IGxvb3BUaW1lcl9uZXcobG9vcGVyX2dldEZvclRocmVhZCgpLCB0aHJvdHRsZVBpcGVfdGltZXJGdW5jLCBwaXBlKTsKKyAgICAvKiBGb3Igbm93LCBsaW1pdCB0byA1MDAgS0IvcyBpbiBib3RoIGRpcmVjdGlvbnMgKi8KKyAgICBwaXBlLT5zZW5kUmF0ZSA9IFRJQ0tTX1BFUl9TRUNPTkQgLyAoNTAwLiAqIDEwMjQgKiA4KTsKKyAgICBwaXBlLT5yZWN2UmF0ZSA9IHBpcGUtPnNlbmRSYXRlOworICAgIHJldHVybiBwaXBlOworfQorCitzdGF0aWMgdm9pZAordGhyb3R0bGVQaXBlX2Nsb3NlKCB2b2lkKiBvcGFxdWUgKQoreworICAgIFRocm90dGxlUGlwZSogcGlwZSA9IG9wYXF1ZTsKKworICAgIEQoIiVzOiBod3BpcGU9JXAgKHBvcz0lZCBjb3VudD0lZCBzaXplPSVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgIHBpcGUtPmh3cGlwZSwgcGlwZS0+cG9zLCBwaXBlLT5jb3VudCwgcGlwZS0+c2l6ZSk7CisKKyAgICBsb29wVGltZXJfZnJlZShwaXBlLT50aW1lcik7CisgICAgZnJlZShwaXBlLT5idWZmZXIpOworICAgIEFGUkVFKHBpcGUpOworfQorCitzdGF0aWMgdm9pZAordGhyb3R0bGVQaXBlX3JlYXJtKCBUaHJvdHRsZVBpcGUqIHBpcGUgKQoreworICAgIGludDY0X3QgIG1pbkV4cGlyYXRpb24gPSAwOworCisgICAgREQoIiVzOiBzZW5kRXhwaXJhdGlvbj0lbGxkIHJlY3ZFeHBpcmF0aW9uPSVsbGRcbiIsIF9fRlVOQ1RJT05fXywgcGlwZS0+c2VuZEV4cGlyYXRpb24sIHBpcGUtPnJlY3ZFeHBpcmF0aW9uKTsKKworICAgIGlmIChwaXBlLT5zZW5kRXhwaXJhdGlvbikgeworICAgICAgICBpZiAobWluRXhwaXJhdGlvbiA9PSAwIHx8IHBpcGUtPnNlbmRFeHBpcmF0aW9uIDwgbWluRXhwaXJhdGlvbikKKyAgICAgICAgICAgIG1pbkV4cGlyYXRpb24gPSBwaXBlLT5zZW5kRXhwaXJhdGlvbjsKKyAgICB9CisKKyAgICBpZiAocGlwZS0+cmVjdkV4cGlyYXRpb24pIHsKKyAgICAgICAgaWYgKG1pbkV4cGlyYXRpb24gPT0gMCB8fCBwaXBlLT5yZWN2RXhwaXJhdGlvbiA8IG1pbkV4cGlyYXRpb24pCisgICAgICAgICAgICBtaW5FeHBpcmF0aW9uID0gcGlwZS0+cmVjdkV4cGlyYXRpb247CisgICAgfQorCisgICAgaWYgKG1pbkV4cGlyYXRpb24gIT0gMCkgeworICAgICAgICBERCgiJXM6IEFybWluZyBmb3IgJWxsZFxuIiwgX19GVU5DVElPTl9fLCBtaW5FeHBpcmF0aW9uKTsKKyAgICAgICAgbG9vcFRpbWVyX3N0YXJ0UmVsYXRpdmUocGlwZS0+dGltZXIsIG1pbkV4cGlyYXRpb24pOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rocm90dGxlUGlwZV90aW1lckZ1bmModm9pZCogb3BhcXVlLCBMb29wVGltZXIqIHVudXNlZCkKK3sKKyAgICBUaHJvdHRsZVBpcGUqIHBpcGUgPSBvcGFxdWU7CisgICAgaW50NjRfdCAgbm93ID0gY2xvY2tfbm93KCk7CisKKyAgICBERCgiJXM6IFRJQ0shIG5vdz0lbGxkIHNlbmRFeHBpcmF0aW9uPSVsbGQgcmVjdkV4cGlyYXRpb249JWxsZFxuIiwKKyAgICAgICBfX0ZVTkNUSU9OX18sIG5vdywgcGlwZS0+c2VuZEV4cGlyYXRpb24sIHBpcGUtPnJlY3ZFeHBpcmF0aW9uKTsKKworICAgIC8qIFRpbWVyIGhhcyBleHBpcmVkLCBzaWduYWwgd2FrZSB1cCBpZiBuZWVkZWQgKi8KKyAgICBpbnQgICAgICBmbGFncyA9IDA7CisKKyAgICBpZiAocGlwZS0+c2VuZEV4cGlyYXRpb24gJiYgbm93ID4gcGlwZS0+c2VuZEV4cGlyYXRpb24pIHsKKyAgICAgICAgZmxhZ3MgfD0gUElQRV9XQUtFX1dSSVRFOworICAgICAgICBwaXBlLT5zZW5kRXhwaXJhdGlvbiA9IDA7CisgICAgfQorICAgIGlmIChwaXBlLT5yZWN2RXhwaXJhdGlvbiAmJiBub3cgPiBwaXBlLT5yZWN2RXhwaXJhdGlvbikgeworICAgICAgICBmbGFncyB8PSBQSVBFX1dBS0VfUkVBRDsKKyAgICAgICAgcGlwZS0+cmVjdkV4cGlyYXRpb24gPSAwOworICAgIH0KKyAgICBmbGFncyAmPSBwaXBlLT5mbGFnczsKKyAgICBpZiAoZmxhZ3MgIT0gMCkgeworICAgICAgICBERCgiJXM6IFdBS0UgJWRcbiIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworICAgICAgICBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZShwaXBlLT5od3BpcGUsIGZsYWdzKTsKKyAgICB9CisKKyAgICB0aHJvdHRsZVBpcGVfcmVhcm0ocGlwZSk7Cit9CisKK3N0YXRpYyBpbnQKK3Rocm90dGxlUGlwZV9zZW5kQnVmZmVycyggdm9pZCogb3BhcXVlLCBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywgaW50IG51bUJ1ZmZlcnMgKQoreworICAgIFRocm90dGxlUGlwZSogcGlwZSA9IG9wYXF1ZTsKKworICAgIGlmIChwaXBlLT5zZW5kRXhwaXJhdGlvbiA+IDApIHsKKyAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfQUdBSU47CisgICAgfQorCisgICAgaW50ICByZXQgPSAwOworICAgIGludCAgY291bnQ7CisgICAgY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmYgPSBidWZmZXJzOworICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmRW5kID0gYnVmZiArIG51bUJ1ZmZlcnM7CisKKyAgICBjb3VudCA9IDA7CisgICAgZm9yICg7IGJ1ZmYgPCBidWZmRW5kOyBidWZmKyspIHsKKyAgICAgICAgY291bnQgKz0gYnVmZi0+c2l6ZTsKKyAgICB9CisgICAgLyogRG8gd2UgbmVlZCB0byBncm93IHRoZSB0aHJvdHRsZSBidWZmZXI/ICovCisgICAgd2hpbGUgKGNvdW50ID4gcGlwZS0+c2l6ZSAtIHBpcGUtPmNvdW50KSB7CisgICAgICAgIHNpemVfdCAgICBuZXdzaXplID0gcGlwZS0+c2l6ZSAqIDI7CisgICAgICAgIHVpbnQ4X3QqICBuZXdidWZmID0gcmVhbGxvYyhwaXBlLT5idWZmZXIsIG5ld3NpemUpOworICAgICAgICBpbnQgICAgICAgd3BvcyAgICA9IHBpcGUtPnBvcyArIHBpcGUtPmNvdW50OworICAgICAgICBpZiAobmV3YnVmZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAod3BvcyA+IHBpcGUtPnNpemUpIHsKKyAgICAgICAgICAgIHdwb3MgLT0gcGlwZS0+c2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShuZXdidWZmICsgcGlwZS0+c2l6ZSwgbmV3YnVmZiwgd3Bvcyk7CisgICAgICAgIH0KKyAgICAgICAgcGlwZS0+YnVmZmVyID0gbmV3YnVmZjsKKyAgICAgICAgcGlwZS0+c2l6ZSAgID0gbmV3c2l6ZTsKKyAgICAgICAgRCgidGhyb3R0bGUgYnVmZmVyIGlzIG5vdyAlZCBieXRlcyIsIG5ld3NpemUpOworICAgIH0KKworICAgIGZvciAoYnVmZiA9IGJ1ZmZlcnM7IGJ1ZmYgPCBidWZmRW5kOyBidWZmKyspIHsKKyAgICAgICAgaW50IGF2YWlsID0gcGlwZS0+c2l6ZSAtIHBpcGUtPmNvdW50OworICAgICAgICBpZiAoYXZhaWwgPD0gMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgICAgIHJldCA9IFBJUEVfRVJST1JfQUdBSU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZhaWwgPiBidWZmLT5zaXplKSB7CisgICAgICAgICAgICBhdmFpbCA9IGJ1ZmYtPnNpemU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgd3BvcyA9IHBpcGUtPnBvcyArIHBpcGUtPmNvdW50OworICAgICAgICBpZiAod3BvcyA+PSBwaXBlLT5zaXplKSB7CisgICAgICAgICAgICB3cG9zIC09IHBpcGUtPnNpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdwb3MgKyBhdmFpbCA8PSBwaXBlLT5zaXplKSB7CisgICAgICAgICAgICBtZW1jcHkocGlwZS0+YnVmZmVyICsgd3BvcywgYnVmZi0+ZGF0YSwgYXZhaWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ICBhdmFpbDIgPSBwaXBlLT5zaXplIC0gd3BvczsKKyAgICAgICAgICAgIG1lbWNweShwaXBlLT5idWZmZXIgKyB3cG9zLCBidWZmLT5kYXRhLCBhdmFpbDIpOworICAgICAgICAgICAgbWVtY3B5KHBpcGUtPmJ1ZmZlciwgYnVmZi0+ZGF0YSArIGF2YWlsMiwgYXZhaWwgLSBhdmFpbDIpOworICAgICAgICB9CisgICAgICAgIHBpcGUtPmNvdW50ICs9IGF2YWlsOworICAgICAgICByZXQgKz0gYXZhaWw7CisgICAgfQorCisgICAgLyogV2FrZSB1cCBhbnkgd2FpdGluZyByZWFkZXJzIGlmIHdlIHdyb3RlIHNvbWV0aGluZyAqLworICAgIGlmIChwaXBlLT5jb3VudCA+IDAgJiYgKHBpcGUtPmZsYWdzICYgUElQRV9XQUtFX1JFQUQpKSB7CisgICAgICAgIGFuZHJvaWRfcGlwZV9ob3N0X3NpZ25hbF93YWtlKHBpcGUtPmh3cGlwZSwgUElQRV9XQUtFX1JFQUQpOworICAgIH0KKworICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgIC8qIENvbXB1dGUgbmV4dCBzZW5kIGV4cGlyYXRpb24gdGltZSAqLworICAgICAgICBwaXBlLT5zZW5kRXhwaXJhdGlvbiA9IGNsb2NrX25vdygpICsgcmV0ICogcGlwZS0+c2VuZFJhdGU7CisgICAgICAgIHRocm90dGxlUGlwZV9yZWFybShwaXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGhyb3R0bGVQaXBlX3JlY3ZCdWZmZXJzKCB2b2lkKiBvcGFxdWUsIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgbnVtQnVmZmVycyApCit7CisgICAgVGhyb3R0bGVQaXBlKiBwaXBlID0gb3BhcXVlOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHBpcGUtPnJlY3ZFeHBpcmF0aW9uID4gMCkgeworICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9BR0FJTjsKKyAgICB9CisKKyAgICB3aGlsZSAobnVtQnVmZmVycyA+IDApIHsKKyAgICAgICAgaW50IGF2YWlsID0gcGlwZS0+Y291bnQ7CisgICAgICAgIGlmIChhdmFpbCA8PSAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gUElQRV9FUlJPUl9BR0FJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChhdmFpbCA+IGJ1ZmZlcnNbMF0uc2l6ZSkgeworICAgICAgICAgICAgYXZhaWwgPSBidWZmZXJzWzBdLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcnBvcyA9IHBpcGUtPnBvczsKKworICAgICAgICBpZiAocnBvcyArIGF2YWlsIDw9IHBpcGUtPnNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShidWZmZXJzWzBdLmRhdGEsIHBpcGUtPmJ1ZmZlciArIHJwb3MsIGF2YWlsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCAgYXZhaWwyID0gcGlwZS0+c2l6ZSAtIHJwb3M7CisgICAgICAgICAgICBtZW1jcHkoYnVmZmVyc1swXS5kYXRhLCBwaXBlLT5idWZmZXIgKyBycG9zLCBhdmFpbDIpOworICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlcnNbMF0uZGF0YSArIGF2YWlsMiwgcGlwZS0+YnVmZmVyLCBhdmFpbCAtIGF2YWlsMik7CisgICAgICAgIH0KKyAgICAgICAgcGlwZS0+Y291bnQgLT0gYXZhaWw7CisgICAgICAgIHBpcGUtPnBvcyAgICs9IGF2YWlsOworICAgICAgICBpZiAocGlwZS0+cG9zID49IHBpcGUtPnNpemUpIHsKKyAgICAgICAgICAgIHBpcGUtPnBvcyAtPSBwaXBlLT5zaXplOworICAgICAgICB9CisgICAgICAgIHJldCArPSBhdmFpbDsKKyAgICAgICAgbnVtQnVmZmVycy0tOworICAgICAgICBidWZmZXJzKys7CisgICAgfQorCisgICAgLyogV2FrZSB1cCBhbnkgd2FpdGluZyByZWFkZXJzIGlmIHdlIHdyb3RlIHNvbWV0aGluZyAqLworICAgIGlmIChwaXBlLT5jb3VudCA8IFBJTkdQT05HX1NJWkUgJiYgKHBpcGUtPmZsYWdzICYgUElQRV9XQUtFX1dSSVRFKSkgeworICAgICAgICBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZShwaXBlLT5od3BpcGUsIFBJUEVfV0FLRV9XUklURSk7CisgICAgfQorCisgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgcGlwZS0+cmVjdkV4cGlyYXRpb24gPSBjbG9ja19ub3coKSArIHJldCAqIHBpcGUtPnJlY3ZSYXRlOworICAgICAgICB0aHJvdHRsZVBpcGVfcmVhcm0ocGlwZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAordGhyb3R0bGVQaXBlX3BvbGwoIHZvaWQqIG9wYXF1ZSApCit7CisgICAgVGhyb3R0bGVQaXBlKiAgcGlwZSA9IG9wYXF1ZTsKKyAgICB1bnNpZ25lZCAgICAgICByZXQgPSAwOworCisgICAgaWYgKHBpcGUtPmNvdW50IDwgcGlwZS0+c2l6ZSkKKyAgICAgICAgcmV0IHw9IFBJUEVfUE9MTF9PVVQ7CisKKyAgICBpZiAocGlwZS0+Y291bnQgPiAwKQorICAgICAgICByZXQgfD0gUElQRV9QT0xMX0lOOworCisgICAgaWYgKHBpcGUtPnNlbmRFeHBpcmF0aW9uID4gMCkKKyAgICAgICAgcmV0ICY9IH5QSVBFX1BPTExfT1VUOworCisgICAgaWYgKHBpcGUtPnJlY3ZFeHBpcmF0aW9uID4gMCkKKyAgICAgICAgcmV0ICY9IH5QSVBFX1BPTExfSU47CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAordGhyb3R0bGVQaXBlX3dha2VPbiggdm9pZCogb3BhcXVlLCBpbnQgZmxhZ3MgKQoreworICAgIFRocm90dGxlUGlwZSogcGlwZSA9IG9wYXF1ZTsKKyAgICBwaXBlLT5mbGFncyB8PSAodW5zaWduZWQpZmxhZ3M7Cit9CisKK3N0YXRpYyBjb25zdCBBbmRyb2lkUGlwZUZ1bmNzICB0aHJvdHRsZVBpcGVfZnVuY3MgPSB7CisgICAgdGhyb3R0bGVQaXBlX2luaXQsCisgICAgdGhyb3R0bGVQaXBlX2Nsb3NlLAorICAgIHRocm90dGxlUGlwZV9zZW5kQnVmZmVycywKKyAgICB0aHJvdHRsZVBpcGVfcmVjdkJ1ZmZlcnMsCisgICAgdGhyb3R0bGVQaXBlX3BvbGwsCisgICAgdGhyb3R0bGVQaXBlX3dha2VPbiwKK307CisKK3ZvaWQgYW5kcm9pZF9waXBlX2FkZF90eXBlX3Rocm90dGxlKHZvaWQpIHsKKyAgICBhbmRyb2lkX3BpcGVfYWRkX3R5cGUoInRocm90dGxlIiwgTlVMTCwgJnRocm90dGxlUGlwZV9mdW5jcyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV90aHJvdHRsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfdGhyb3R0bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEzZThlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfdGhyb3R0bGUuaApAQCAtMCwwICsxLDIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gUmVnaXN0ZXIgdGhlICd0aHJvdHRsZScgQW5kcm9pZCBwaXBlIHNlcnZpY2UuCit2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZV90aHJvdHRsZSh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3VuaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWZhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmNwcApAQCAtMCwwICsxLDU3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAndW5peDonIGdvbGRmaXNoIHBpcGUgdHlwZSB3aGljaCBhbGxvd3MKKyAqIGd1ZXN0IGNsaWVudHMgdG8gZGlyZWN0bHkgY29ubmVjdCB0byBhIFVuaXggZG9tYWluIHBvcnQgdGhyb3VnaAorICogL2Rldi9xZW11X3BpcGUuCisgKgorICogVGhlIGxpc3Qgb2YgYWxsb3dlZAorICovCisKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmgiCisKKy8vIFRFQ0hOSUNBTAorI2lmbmRlZiBfV0lOMzIKKworI2luY2x1ZGUgImFuZHJvaWQvYXN5bmMtdXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9ob3N0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gU29ja2V0cyBpbmNsdWRlcworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiBJbXBsZW1lbnQgdGhlIG5ldCBwaXBlcyAqLworCisvKiBTZXQgdG8gMSBvciAyIGZvciBkZWJ1ZyB0cmFjZXMgKi8KKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcgPj0gMQorI2RlZmluZSBEKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKSwgcHJpbnRmKCJcbiIpCisjZWxzZQorI2RlZmluZSBEKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIERFQlVHID49IDIKKyNkZWZpbmUgREQoLi4uKSBwcmludGYoX19WQV9BUkdTX18pLCBwcmludGYoIlxuIikKKyNlbHNlCisjZGVmaW5lIEREKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworc3RydWN0IEdsb2JhbFN0YXRlIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYWxsb3dlZFBhdGhzOworfTsKKworc3RhdGljIGFuZHJvaWQ6OmJhc2U6OkxhenlJbnN0YW5jZTxHbG9iYWxTdGF0ZT4gc0dsb2JhbCA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworc3RhdGljIGJvb2wgYW5kcm9pZF91bml4X3BpcGVfY2hlY2tfcGF0aChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgaWYgKHBhdGgpIHsKKyAgICAgICAgRCgiJXM6IENoZWNraW5nIGZvciBbJXNdIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgR2xvYmFsU3RhdGUqIGdsb2JhbCA9IHNHbG9iYWwucHRyKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBnbG9iYWwtPmFsbG93ZWRQYXRocykgeworICAgICAgICAgICAgaWYgKGl0ID09IHBhdGgpIHsKKyAgICAgICAgICAgICAgICBEKCIgICBPS1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRCgiICBVTktOT1dOXE4iKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitlbnVtIFN0YXRlIHsKKyAgICBTVEFURV9JTklULAorICAgIFNUQVRFX0NPTk5FQ1RJTkcsCisgICAgU1RBVEVfQ09OTkVDVEVELAorICAgIFNUQVRFX0NMT1NJTkdfR1VFU1QsCisgICAgU1RBVEVfQ0xPU0lOR19TT0NLRVQKK307CisKK3N0cnVjdCBTb2NrZXRQaXBlIHsKKyAgICB2b2lkKiBod3BpcGUgPSBudWxscHRyOworICAgIFN0YXRlIHN0YXRlID0gU1RBVEVfSU5JVDsKKyAgICBpbnQgd2FrZVdhbnRlZCA9IDA7CisgICAgTG9vcElvKiBpbyA9IG51bGxwdHI7CisgICAgQXN5bmNDb25uZWN0b3IgY29ubmVjdG9yWzFdID0ge307Cit9OworCitzdGF0aWMgdm9pZCBzb2NrZXRQaXBlX2ZyZWUoU29ja2V0UGlwZSogcGlwZSkgeworICAgIGludCBmZDsKKworICAgIC8qIENsb3NlIHRoZSBzb2NrZXQgKi8KKyAgICBpZiAocGlwZS0+aW8pIHsKKyAgICAgICAgZmQgPSBsb29wSW9fZmQocGlwZS0+aW8pOworICAgICAgICBsb29wSW9fZnJlZShwaXBlLT5pbyk7CisgICAgICAgIHNvY2tldF9jbG9zZShmZCk7CisgICAgfQorCisgICAgLyogUmVsZWFzZSB0aGUgcGlwZSBvYmplY3QgKi8KKyAgICBkZWxldGUgcGlwZTsKK30KKworc3RhdGljIHZvaWQgc29ja2V0UGlwZV9yZXNldFN0YXRlKFNvY2tldFBpcGUqIHBpcGUpIHsKKyAgICBpZiAoKHBpcGUtPndha2VXYW50ZWQgJiBQSVBFX1dBS0VfV1JJVEUpICE9IDApIHsKKyAgICAgICAgbG9vcElvX3dhbnRXcml0ZShwaXBlLT5pbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9vcElvX2RvbnRXYW50V3JpdGUocGlwZS0+aW8pOworICAgIH0KKworICAgIGlmIChwaXBlLT5zdGF0ZSA9PSBTVEFURV9DT05ORUNURUQgJiYKKyAgICAgICAgKHBpcGUtPndha2VXYW50ZWQgJiBQSVBFX1dBS0VfUkVBRCkgIT0gMCkgeworICAgICAgICBsb29wSW9fd2FudFJlYWQocGlwZS0+aW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3BJb19kb250V2FudFJlYWQocGlwZS0+aW8pOworICAgIH0KK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLgorICogU2VlIHNvY2tldFBpcGVfY2xvc2VGcm9tR3Vlc3QoKSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgZ3Vlc3QgcmVxdWlyZXMKKyAqIHRoZSBkaXNjb25uZWN0aW9uLiAqLworc3RhdGljIHZvaWQgc29ja2V0UGlwZV9jbG9zZUZyb21Tb2NrZXQodm9pZCogb3BhcXVlKSB7CisgICAgYXV0byBwaXBlID0gc3RhdGljX2Nhc3Q8U29ja2V0UGlwZSo+KG9wYXF1ZSk7CisKKyAgICBEKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAvKiBJZiB0aGUgZ3Vlc3QgYWxyZWFkeSBvcmRlcmVkIHRoZSBwaXBlIHRvIGJlIGNsb3NlZCwgZGVsZXRlIGltbWVkaWF0ZWx5ICovCisgICAgaWYgKHBpcGUtPnN0YXRlID09IFNUQVRFX0NMT1NJTkdfR1VFU1QpIHsKKyAgICAgICAgc29ja2V0UGlwZV9mcmVlKHBpcGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogRm9yY2UgdGhlIGNsb3N1cmUgb2YgdGhlIFFFTVVEIGNoYW5uZWwgLSBpZiBhIGd1ZXN0IGlzIGJsb2NrZWQKKyAgICAgKiB3YWl0aW5nIGZvciBhIHdha2Ugc2lnbmFsLCBpdCB3aWxsIHJlY2VpdmUgYW4gZXJyb3IuICovCisgICAgaWYgKHBpcGUtPmh3cGlwZSAhPSBOVUxMKSB7CisgICAgICAgIGFuZHJvaWRfcGlwZV9ob3N0X2Nsb3NlKHBpcGUtPmh3cGlwZSk7CisgICAgICAgIHBpcGUtPmh3cGlwZSA9IE5VTEw7CisgICAgfQorCisgICAgcGlwZS0+c3RhdGUgPSBTVEFURV9DTE9TSU5HX1NPQ0tFVDsKKyAgICBzb2NrZXRQaXBlX3Jlc2V0U3RhdGUocGlwZSk7Cit9CisKKy8qIFRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGlzIGFuIGFzeW5jaHJvbm91cworICogZXZlbnQgb24gdGhlIG5ldHdvcmsgcGlwZS4KKyAqLworc3RhdGljIHZvaWQgc29ja2V0UGlwZV9pb19mdW5jKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBhdXRvIHBpcGUgPSBzdGF0aWNfY2FzdDxTb2NrZXRQaXBlKj4ob3BhcXVlKTsKKyAgICBpbnQgd2FrZUZsYWdzID0gMDsKKworICAgIC8qIFJ1biB0aGUgY29ubmVjdG9yIGlmIHdlIGFyZSBpbiB0aGUgQ09OTkVDVElORyBzdGF0ZSAgICAgKi8KKyAgICAvKiBUT0RPOiBBZGQgc29tZSBzb3J0IG9mIHRpbWUtb3V0LCB0byBkZWFsIHdpdGggdGhlIGNhc2UgKi8KKyAgICAvKiAgICAgICAgd2hlbiB0aGUgc2VydmVyIGlzIHdlZGdlZC4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAocGlwZS0+c3RhdGUgPT0gU1RBVEVfQ09OTkVDVElORykgeworICAgICAgICBBc3luY1N0YXR1cyBzdGF0dXMgPSBhc3luY0Nvbm5lY3Rvcl9ydW4ocGlwZS0+Y29ubmVjdG9yKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19ORUVEX01PUkUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gQVNZTkNfRVJST1IpIHsKKyAgICAgICAgICAgIC8qIENvdWxkIG5vdCBjb25uZWN0LCB0ZWxsIG91ciBjbGllbnQgYnkgY2xvc2luZyB0aGUgY2hhbm5lbC4gKi8KKworICAgICAgICAgICAgc29ja2V0UGlwZV9jbG9zZUZyb21Tb2NrZXQocGlwZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGlwZS0+c3RhdGUgPSBTVEFURV9DT05ORUNURUQ7CisgICAgICAgIHNvY2tldFBpcGVfcmVzZXRTdGF0ZShwaXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIE90aGVyd2lzZSwgYWNjZXB0IGluY29taW5nIGRhdGEgKi8KKyAgICBpZiAoKGV2ZW50cyAmIExPT1BfSU9fUkVBRCkgIT0gMCkgeworICAgICAgICBpZiAoKHBpcGUtPndha2VXYW50ZWQgJiBQSVBFX1dBS0VfUkVBRCkgIT0gMCkgeworICAgICAgICAgICAgd2FrZUZsYWdzIHw9IFBJUEVfV0FLRV9SRUFEOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChldmVudHMgJiBMT09QX0lPX1dSSVRFKSAhPSAwKSB7CisgICAgICAgIGlmICgocGlwZS0+d2FrZVdhbnRlZCAmIFBJUEVfV0FLRV9XUklURSkgIT0gMCkgeworICAgICAgICAgICAgd2FrZUZsYWdzIHw9IFBJUEVfV0FLRV9XUklURTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlbmQgd2FrZSBzaWduYWwgdG8gdGhlIGd1ZXN0IGlmIG5lZWRlZCAqLworICAgIGlmICh3YWtlRmxhZ3MgIT0gMCkgeworICAgICAgICBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZShwaXBlLT5od3BpcGUsIHdha2VGbGFncyk7CisgICAgICAgIHBpcGUtPndha2VXYW50ZWQgJj0gfndha2VGbGFnczsKKyAgICB9CisKKyAgICAvKiBSZXNldCBzdGF0ZSAqLworICAgIHNvY2tldFBpcGVfcmVzZXRTdGF0ZShwaXBlKTsKK30KKworc3RhdGljIHZvaWQqIHNvY2tldFBpcGVfaW5pdEZyb21BZGRyZXNzKHZvaWQqIGh3cGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2NrQWRkcmVzcyogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIqIGxvb3BlcikgeworICAgIFNvY2tldFBpcGUqIHBpcGUgPSBuZXcgU29ja2V0UGlwZSgpOworICAgICpwaXBlID0ge307CisgICAgcGlwZS0+aHdwaXBlID0gaHdwaXBlOworICAgIHBpcGUtPnN0YXRlID0gU1RBVEVfSU5JVDsKKworICAgIHsKKyAgICAgICAgQXN5bmNTdGF0dXMgc3RhdHVzOworCisgICAgICAgIGludCBmZCA9IHNvY2tldF9jcmVhdGUoc29ja19hZGRyZXNzX2dldF9mYW1pbHkoYWRkcmVzcyksIFNPQ0tFVF9TVFJFQU0pOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICBEKCIlczogQ291bGQgY3JlYXRlIHNvY2tldCBmcm9tIGFkZHJlc3MgZmFtaWx5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBzb2NrZXRQaXBlX2ZyZWUocGlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBpcGUtPmlvID0gbG9vcElvX25ldyhsb29wZXIsIGZkLCBzb2NrZXRQaXBlX2lvX2Z1bmMsIHBpcGUpOworICAgICAgICBzdGF0dXMgPSBhc3luY0Nvbm5lY3Rvcl9pbml0KHBpcGUtPmNvbm5lY3RvciwgYWRkcmVzcywgcGlwZS0+aW8pOworICAgICAgICBwaXBlLT5zdGF0ZSA9IFNUQVRFX0NPTk5FQ1RJTkc7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBBU1lOQ19FUlJPUikgeworICAgICAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldDogJXMiLCBfX0ZVTkNUSU9OX18sIGVycm5vX3N0cik7CisgICAgICAgICAgICBzb2NrZXRQaXBlX2ZyZWUocGlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IEFTWU5DX0NPTVBMRVRFKSB7CisgICAgICAgICAgICBwaXBlLT5zdGF0ZSA9IFNUQVRFX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIHNvY2tldFBpcGVfcmVzZXRTdGF0ZShwaXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwaXBlOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgZ3Vlc3Qgd2FudHMgdG8gY2xvc2UgdGhlIGNoYW5uZWwuIFRoaXMgaXMgZGlmZmVyZW50CisgKiBmcm9tIHNvY2tldFBpcGVfY2xvc2VGcm9tU29ja2V0KCkgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHNvY2tldCBpcworICogZGlzY29ubmVjdGVkLiAqLworc3RhdGljIHZvaWQgc29ja2V0UGlwZV9jbG9zZUZyb21HdWVzdCh2b2lkKiBvcGFxdWUpIHsKKyAgICBhdXRvIHBpcGUgPSBzdGF0aWNfY2FzdDxTb2NrZXRQaXBlKj4ob3BhcXVlKTsKKyAgICBzb2NrZXRQaXBlX2ZyZWUocGlwZSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0UGlwZVJlYWR5U2VuZChTb2NrZXRQaXBlKiBwaXBlKSB7CisgICAgaWYgKHBpcGUtPnN0YXRlID09IFNUQVRFX0NPTk5FQ1RFRCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAocGlwZS0+c3RhdGUgPT0gU1RBVEVfQ09OTkVDVElORykKKyAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfQUdBSU47CisgICAgZWxzZSBpZiAocGlwZS0+aHdwaXBlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0lOVkFMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfSU87Cit9CisKKyNpZmRlZiBfV0lOMzIKK2ludCBxZW11X3dpbmRvd3Nfc2VuZChpbnQgZmQsIGNvbnN0IHZvaWQqIF9idWYsIGludCBsZW4xKSB7CisgICAgaW50IHJldCwgbGVuOworICAgIGF1dG8gYnVmID0gKGNvbnN0IGNoYXIqKV9idWY7CisKKyAgICBsZW4gPSBsZW4xOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHJldCA9IHNlbmQoZmQsIGJ1ZiwgbGVuLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGVycm5vID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gV1NBRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuMSAtIGxlbjsKK30KKworaW50IHFlbXVfd2luZG93c19yZWN2KGludCBmZCwgdm9pZCogX2J1ZiwgaW50IGxlbjEsIGJvb2wgc2luZ2xlX3JlYWQpIHsKKyAgICBpbnQgcmV0LCBsZW47CisgICAgY2hhciogYnVmID0gKGNoYXIqKV9idWY7CisKKyAgICBsZW4gPSBsZW4xOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHJldCA9IHJlY3YoZmQsIGJ1ZiwgbGVuLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGVycm5vID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gV1NBRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzaW5nbGVfcmVhZCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgKz0gcmV0OworICAgICAgICAgICAgbGVuIC09IHJldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW4xIC0gbGVuOworfQorI2VuZGlmICAvLyBfV0lOMzIKKworc3RhdGljIGludCBzb2NrZXRQaXBlX3NlbmRCdWZmZXJzKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgeworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PFNvY2tldFBpcGUqPihvcGFxdWUpOworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgc2l6ZV90IGJ1ZmZTdGFydCA9IDA7CisgICAgY29uc3QgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmYgPSBidWZmZXJzOworICAgIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmRW5kID0gYnVmZiArIG51bUJ1ZmZlcnM7CisKKyAgICByZXQgPSBuZXRQaXBlUmVhZHlTZW5kKHBpcGUpOworICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoOyBidWZmIDwgYnVmZkVuZDsgYnVmZisrKQorICAgICAgICBjb3VudCArPSBidWZmLT5zaXplOworCisgICAgYnVmZiA9IGJ1ZmZlcnM7CisgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICBpbnQgIGF2YWlsID0gYnVmZi0+c2l6ZSAtIGJ1ZmZTdGFydDsKKyAgICAgICAgLy8gTk9URToKKyAgICAgICAgLy8gUGxlYXNlIHRha2UgY2FyZSB0byBzZW5kIGRhdGEgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBjYXVzZQorICAgICAgICAvLyBwaXBlIGNvcnJ1cHRpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvciBpbnN0YW5jZToKKyAgICAgICAgLy8gT25lIG1heSB3YW50IHRvIGNhbGwgc2VuZCgpIG11bHRpcGxlIHRpbWVzIGhlcmUsIGJ1dCB0aGUgaW1wb3J0YW50CisgICAgICAgIC8vIHRoaW5nIHRvIG5vdGljZSBpcywgd2hhdCBoYXBwZW5zIHdoZW4gbXVsdGlwbGUgc2VuZCgpJ3MgYXJlIGlzc3VlZCwKKyAgICAgICAgLy8gZXNwZWNpYWxseSB3aGVuIHRoZSBsYXN0IHNlbmQoKSByZXN1bHRzIGluIGFuIGVycm9yIChlLmcuLCBFQUdBSU4pPworICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgbGFzdCBzZW5kKCkgcmVzdWx0cyBpbiBFQUdBSU4sIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgbm8KKyAgICAgICAgLy8gZGF0YSB3YXMgc2VudC4gSWYgd2UgZW5kIHVwIHNlbmRpbmcgZGF0YSBzdWNjZXNzZnVsbHkgdGhyb3VnaAorICAgICAgICAvLyBzZW5kIGFuZCB0aGVuIGdldCBFQUdBSU4gb24gdGhlIGxhc3Qgc2VuZCgpIGNhbGwsIHRoZSBwaXBlIGRyaXZlcgorICAgICAgICAvLyB3aWxsIGJlbGlldmUgdGhlcmUgaGFzIHJlYWxseSBub3QgYmVlbiBhbnkgZGF0YSBzZW50LAorICAgICAgICAvLyB3aGljaCBpbiB0dXJuIHdpbGwgY2F1c2UgcmV0cmFuc21pc3Npb24gb2YgYWN0dWFsbHktc2VudCBkYXRhLAorICAgICAgICAvLyBjb3JydXB0aW5nIHRoZSBwaXBlLgorICAgICAgICAvLworICAgICAgICAvLyBPdGhlcndpc2UsIHdlIG5lZWQgdG8gcmV0cnkgd2hlbiBnZXR0aW5nIEVBR0FJTiwKKyAgICAgICAgLy8gdW50aWwgdGhlIHRyYW5zZmVyIGNvbXBsZXRlbHkgZ29lcyB0aHJvdWdoLgorICAgICAgICAvLyBPbmx5IHRoZSBmb2xsb3dpbmcgdHdvIHNpdHVhdGlvbnMgYXJlIGNvcnJlY3Q6CisgICAgICAgIC8vCisgICAgICAgIC8vIGEpIHRyYW5zZmVyIGNvbXBsZXRlbHkgb3IgcGFydGlhbGx5IHN1Y2NlZWRzLAorICAgICAgICAvLyByZXR1cm5pbmcgIyBieXRlcyB3cml0dGVuCisgICAgICAgIC8vIGIpIG5vdGhpbmcgaXMgdHJhbnNmZXJyZWQgKyBlcnJvciBjb2RlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIGN1cnJlbnRseSBlbXBsb3kgdHdvIHNvbHV0aW9ucyBkZXBlbmRpbmcgb24gcGxhdGZvcm06CisgICAgICAgIC8vIDEuIFNwaW4gb24gRUFHQUlOLCB3aXRoIG11bHRpcGxlIHNlbmQoKSBjYWxscy4KKyAgICAgICAgLy8gMi4gT25seSBhbGxvdyBvbmUgcG9zc2libGUgc2VuZCgpIHN1Y2Nlc3MsIHdoaWNoIG1ha2VzIGl0IGVhc2llcgorICAgICAgICAvLyB0byBkZWFsIHdpdGggRUFHQUlOLgorICAgICAgICAvLworICAgICAgICAvLyBXZSBjYW5ub3QgdXNlICMxIG9uIFBPU0lYIGhvc3RzIGF0IGxlYXN0LCBiZWNhdXNlIGlmIHdlIGtlZXAKKyAgICAgICAgLy8gcmV0cnlpbmcgb24gRUFHQUlOLCBpdCdzIHBvc3NpYmxlIHRvIGxvY2sgdXAgdGhlIGVtdWxhdG9yLgorICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgY3VycmVudGx5LCB0aGVyZSBpcyBhIGdsb2JhbCBsb2NrCisgICAgICAgIC8vIGZvciBhbGwgcmVuZGVyIHRocmVhZHMuCisgICAgICAgIC8vIElmIHRoZSB3cm9uZyB0aHJlYWQgaXMgd2FpdGluZyBmb3IgdGhlIGxvY2sgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICAvLyB3ZSBhcmUgcmV0cnlpbmcgb24gdGhlIEVBR0FJTiBzaWduYWwsIG5vIHByb2dyZXNzIHdpbGwgYmUgbWFkZS4KKyAgICAgICAgLy8gU28gd2UganVzdCB1c2UgIzI6IEhBTkRMRV9FSU5UUihzZW5kKC4uLikpLCBhbGxvd2luZyBvbmx5CisgICAgICAgIC8vIG9uZSBzdWNjZXNzZnVsIHNlbmQoKSBhbmQgcmV0dXJuaW5nIEVBR0FJTiB3aXRob3V0IHRoZSBwb3NzaWJpbGl0eQorICAgICAgICAvLyBvZiBwcmV2aW91cyBzdWNjZXNzZnVsIHNlbmRzLgorICAgICAgICAvLworICAgICAgICAvLyBDdXJpb3VzbHksIG9uIFdpbmRvd3MgaG9zdHMsIHNvbHV0aW9uICMyIHdpbGwgY2F1c2UgdGhlIGVtdWxhdG9yCisgICAgICAgIC8vIHRvIG5vdCBiZSBhYmxlIHRvIGJvb3QgdXAsIHdpdGggcmVwZWF0ZWQgc3VyZmFjZWZsaW5nZXIgZmFpbHVyZXMuCisgICAgICAgIC8vIE9uIFdpbmRvd3MgaG9zdHMsIHNvbHV0aW9uICMxIChzcGluIG9uIEVBR0FJTikgbXVzdCBiZSB1c2VkLgorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgLy8gU29sdXRpb24gIzI6IEFsbG93IG9ubHkgb25lIHN1Y2Nlc3NmdWwgc2VuZCgpCisgICAgICAgIGludCAgbGVuID0gSEFORExFX0VJTlRSKHNlbmQobG9vcElvX2ZkKHBpcGUtPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmLT5kYXRhICsgYnVmZlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKyNlbHNlCisgICAgICAgIC8vIFNvbHV0aW9uICMxOiBTcGluIG9uIEVBR0FJTiAoV1NBRVdPVUxEQkxPQ0spCisgICAgICAgIGludCAgbGVuID0gcWVtdV93aW5kb3dzX3NlbmQobG9vcElvX2ZkKHBpcGUtPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmLT5kYXRhICsgYnVmZlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwpOworI2VuZGlmCisKKyAgICAgICAgLyogdGhlIHdyaXRlIHN1Y2NlZWRlZCAqLworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgYnVmZlN0YXJ0ICs9IGxlbjsKKyAgICAgICAgICAgIGlmIChidWZmU3RhcnQgPj0gYnVmZi0+c2l6ZSkgeworICAgICAgICAgICAgICAgIGJ1ZmYrKzsKKyAgICAgICAgICAgICAgICBidWZmU3RhcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnQgLT0gbGVuOworICAgICAgICAgICAgcmV0ICs9IGxlbjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHN0cmVhbT8gKi8KKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gUElQRV9FUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgd2UgYWxyZWFkeSB3cm90ZSBzb21lIHN0dWZmLCBzaW1wbHkgcmV0dXJuICovCisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5lZWQgdG8gcmV0dXJuIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSykgeworICAgICAgICAgICAgcmV0ID0gUElQRV9FUlJPUl9BR0FJTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFBJUEVfRVJST1JfSU87CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb2NrZXRQaXBlX3JlY3ZCdWZmZXJzKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnVmZmVycykgeworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PFNvY2tldFBpcGUqPihvcGFxdWUpOworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IHJldCA9IDA7CisgICAgc2l6ZV90IGJ1ZmZTdGFydCA9IDA7CisgICAgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmYgPSBidWZmZXJzOworICAgIEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmRW5kID0gYnVmZiArIG51bUJ1ZmZlcnM7CisKKyAgICBmb3IgKDsgYnVmZiA8IGJ1ZmZFbmQ7IGJ1ZmYrKykKKyAgICAgICAgY291bnQgKz0gYnVmZi0+c2l6ZTsKKworICAgIGJ1ZmYgPSBidWZmZXJzOworICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgICAgaW50ICBhdmFpbCA9IGJ1ZmYtPnNpemUgLSBidWZmU3RhcnQ7CisgICAgICAgIC8vIFNlZSBjb21tZW50IGluIHNvY2tldFBpcGVfc2VuZEJ1ZmZlcnMuCisgICAgICAgIC8vIEFsdGhvdWdoIHdlIGhhdmUgbm90IG9ic2VydmVkIGl0IHlldCwKKyAgICAgICAgLy8gcGlwZSBjb3JydXB0aW9uIGNhbiBwb3RlbnRpYWxseSBoYXBwZW4gaGVyZSB0b28uCisgICAgICAgIC8vIFdlIHVzZSB0aGUgc2FtZSBzb2x1dGlvbnMgdG8gYmUgc2FmZS4KKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIGludCAgbGVuID0gSEFORExFX0VJTlRSKHJlY3YobG9vcElvX2ZkKHBpcGUtPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZi0+ZGF0YSArIGJ1ZmZTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKyNlbHNlCisgICAgICAgIGludCAgbGVuID0gcWVtdV93aW5kb3dzX3JlY3YobG9vcElvX2ZkKHBpcGUtPmlvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmLT5kYXRhICsgYnVmZlN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworI2VuZGlmCisKKyAgICAgICAgLyogdGhlIHJlYWQgc3VjY2VlZGVkICovCisgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICBidWZmU3RhcnQgKz0gbGVuOworICAgICAgICAgICAgaWYgKGJ1ZmZTdGFydCA+PSBidWZmLT5zaXplKSB7CisgICAgICAgICAgICAgICAgYnVmZisrOworICAgICAgICAgICAgICAgIGJ1ZmZTdGFydCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCAtPSBsZW47CisgICAgICAgICAgICByZXQgKz0gbGVuOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSByZWFjaGVkIHRoZSBlbmQgb2Ygc3RyZWFtPyAqLworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBQSVBFX0VSUk9SX0lPOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3ZSBhbHJlYWR5IHJlYWQgc29tZSBzdHVmZiwgc2ltcGx5IHJldHVybiAqLworICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBuZWVkIHRvIHJldHVybiBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIHJldCA9IFBJUEVfRVJST1JfQUdBSU47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBQSVBFX0VSUk9SX0lPOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgc29ja2V0UGlwZV9wb2xsKHZvaWQqIG9wYXF1ZSkgeworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PFNvY2tldFBpcGUqPihvcGFxdWUpOworICAgIHVuc2lnbmVkIG1hc2sgPSBsb29wSW9fcG9sbChwaXBlLT5pbyk7CisgICAgdW5zaWduZWQgcmV0ID0gMDsKKworICAgIGlmIChtYXNrICYgTE9PUF9JT19SRUFEKQorICAgICAgICByZXQgfD0gUElQRV9QT0xMX0lOOworICAgIGlmIChtYXNrICYgTE9PUF9JT19XUklURSkKKyAgICAgICAgcmV0IHw9IFBJUEVfUE9MTF9PVVQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzb2NrZXRQaXBlX3dha2VPbih2b2lkKiBvcGFxdWUsIGludCBmbGFncykgeworICAgIGF1dG8gcGlwZSA9IHN0YXRpY19jYXN0PFNvY2tldFBpcGUqPihvcGFxdWUpOworCisgICAgREQoIiVzOiBmbGFncz0lZCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworCisgICAgcGlwZS0+d2FrZVdhbnRlZCB8PSBmbGFnczsKKyAgICBzb2NrZXRQaXBlX3Jlc2V0U3RhdGUocGlwZSk7Cit9CisKK3ZvaWQqIHNvY2tldFBpcGVfaW5pdFVuaXgodm9pZCogaHdwaXBlLCB2b2lkKiBfbG9vcGVyLCBjb25zdCBjaGFyKiBhcmdzKSB7CisgICAgLyogQnVpbGQgU29ja0FkZHJlc3MgZnJvbSBhcmd1bWVudHMuIEFjY2VwdGFibGUgZm9ybWF0cyBhcmU6CisgICAgICoKKyAgICAgKiAgIDxwYXRoPgorICAgICAqLworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCBhcmdzWzBdID09ICdcMCcpIHsKKyAgICAgICAgRCgiJXM6IE1pc3NpbmcgYWRkcmVzcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgRCgiJXM6IEFkZHJlc3MgaXMgJyVzJyIsIF9fRlVOQ1RJT05fXywgYXJncyk7CisKKyAgICBpZiAoIWFuZHJvaWRfdW5peF9waXBlX2NoZWNrX3BhdGgoYXJncykpIHsKKyAgICAgICAgRCgiJXM6IFJlamVjdGluZyBjb25uZWN0aW9uIHRvIHVua25vd24gcGF0aCAnJXMnIiwgX19GVU5DVElPTl9fLCBhcmdzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU29ja0FkZHJlc3MgYWRkcmVzczsKKyAgICBzb2NrX2FkZHJlc3NfaW5pdF91bml4KCZhZGRyZXNzLCBhcmdzKTsKKworICAgIHZvaWQqIHJldCA9IHNvY2tldFBpcGVfaW5pdEZyb21BZGRyZXNzKGh3cGlwZSwgJmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TG9vcGVyKj4oX2xvb3BlcikpOworCisgICAgc29ja19hZGRyZXNzX2RvbmUoJmFkZHJlc3MpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBbmRyb2lkUGlwZUZ1bmNzIHNfdW5peF9waXBlX2Z1bmNzID0geworICAgICAgICBzb2NrZXRQaXBlX2luaXRVbml4LAorICAgICAgICBzb2NrZXRQaXBlX2Nsb3NlRnJvbUd1ZXN0LAorICAgICAgICBzb2NrZXRQaXBlX3NlbmRCdWZmZXJzLAorICAgICAgICBzb2NrZXRQaXBlX3JlY3ZCdWZmZXJzLAorICAgICAgICBzb2NrZXRQaXBlX3BvbGwsCisgICAgICAgIHNvY2tldFBpcGVfd2FrZU9uLAorICAgICAgICBOVUxMLCAvKiB3ZSBjYW4ndCBzYXZlIHRoZXNlICovCisgICAgICAgIE5VTEwsIC8qIHdlIGNhbid0IGxvYWQgdGhlc2UgKi8KK307CisKK3ZvaWQgYW5kcm9pZF91bml4X3BpcGVzX2luaXQodm9pZCkgeworICAgIExvb3BlciogbG9vcGVyID0gbG9vcGVyX2dldEZvclRocmVhZCgpOworICAgIGFuZHJvaWRfcGlwZV9hZGRfdHlwZSgidW5peCIsIGxvb3BlciwgJnNfdW5peF9waXBlX2Z1bmNzKTsKK30KKwordm9pZCBhbmRyb2lkX3VuaXhfcGlwZXNfYWRkX2FsbG93ZWRfcGF0aChjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgaWYgKHBhdGggJiYgcGF0aFswXSkgeworICAgICAgICBEKCIlczogQWRkaW5nIFslc10iLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICBHbG9iYWxTdGF0ZSogZ2xvYmFsID0gc0dsb2JhbC5wdHIoKTsKKyAgICAgICAgZ2xvYmFsLT5hbGxvd2VkUGF0aHMuZW1wbGFjZV9iYWNrKHN0ZDo6c3RyaW5nKHBhdGgpKTsKKyAgICB9Cit9CisKKyNlbHNlICAvLyBfV0lOMzIKKwordm9pZCBhbmRyb2lkX3VuaXhfcGlwZXNfaW5pdCh2b2lkKSB7CisgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLgorfQorCit2b2lkIGFuZHJvaWRfdW5peF9waXBlc19hZGRfYWxsb3dlZF9wYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUuCit9CisKKyNlbmRpZiAgLy8gX1dJTjMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2Yzk0YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3VuaXguaApAQCAtMCwwICsxLDE2IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gSW5pdGlhbGl6ZSB0aGUgdW5peDogcGlwZSBmYWNpbGl0eS4gTXVzdCBiZSBjYWxsZWQgdG8gYWxsb3cgdGhlIGd1ZXN0CisvLyB0byBjb25uZWN0IHRvIHRoZSBwaXBlIHNlcnZpY2UuCit2b2lkIGFuZHJvaWRfdW5peF9waXBlc19pbml0KHZvaWQpOworCisvLyBBZGQgYSBob3N0IFVuaXggZG9tYWluIHBhdGggdG8gdGhlIHdoaXRlIGxpc3QgdGhhdCBpcyBjaGVja2VkIHdoZW4gYSBndWVzdAorLy8gY29ubmVjdHMgdG8gYSB1bml4OiBwaXBlLiBBbnkgbm9uLW1hdGNoaW5nIHBhdGggd2lsbCBiZSByZWplY3RlZCBieQorLy8gZm9yY2UtY2xvc2luZyB0aGUgZ3Vlc3QgcGlwZSBmZC4KK3ZvaWQgYW5kcm9pZF91bml4X3BpcGVzX2FkZF9hbGxvd2VkX3BhdGgoY29uc3QgY2hhciogcGF0aCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjk5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV96ZXJvLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX2hvc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSBERUJVRyAwCisKKyNpZiBERUJVRyA+PSAxCisjICBkZWZpbmUgRCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKyNlbHNlCisjICBkZWZpbmUgRCguLi4pICAodm9pZCkwCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICAgIFogRSBSIE8gICBQIEkgUCBFIFMKKyAqKioqKgorICoqKioqLworCisvKiBBIHNpbXBsZSBwaXBlIHNlcnZpY2UgdGhhdCBtaW1pY3MgL2Rldi96ZXJvLCB5b3UgY2FuIHdyaXRlIGFueXRoaW5nIHRvCisgKiBpdCwgYW5kIHlvdSBjYW4gYWx3YXlzIHJlYWQgYW55IG51bWJlciBvZiB6ZXJvcyBmcm9tIGl0LiBVc2VmdWwgZm9yIGRlYnVnZ2luZworICogdGhlIGtlcm5lbCBkcml2ZXIuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQqIGh3cGlwZTsKK30gWmVyb1BpcGU7CisKK3N0YXRpYyB2b2lkKgoremVyb1BpcGVfaW5pdCggdm9pZCogaHdwaXBlLCB2b2lkKiBzdmNPcGFxdWUsIGNvbnN0IGNoYXIqIGFyZ3MgKQoreworICAgIFplcm9QaXBlKiAgenBpcGU7CisKKyAgICBEKCIlczogaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCBod3BpcGUpOworICAgIEFORVcwKHpwaXBlKTsKKyAgICB6cGlwZS0+aHdwaXBlID0gaHdwaXBlOworICAgIHJldHVybiB6cGlwZTsKK30KKworc3RhdGljIHZvaWQKK3plcm9QaXBlX2Nsb3NlKCB2b2lkKiBvcGFxdWUgKQoreworICAgIFplcm9QaXBlKiAgenBpcGUgPSBvcGFxdWU7CisKKyAgICBEKCIlczogaHdwaXBlPSVwIiwgX19GVU5DVElPTl9fLCB6cGlwZS0+aHdwaXBlKTsKKyAgICBBRlJFRSh6cGlwZSk7Cit9CisKK3N0YXRpYyBpbnQKK3plcm9QaXBlX3NlbmRCdWZmZXJzKCB2b2lkKiBvcGFxdWUsIGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgbnVtQnVmZmVycyApCit7CisgICAgaW50ICByZXQgPSAwOworICAgIHdoaWxlIChudW1CdWZmZXJzID4gMCkgeworICAgICAgICByZXQgKz0gYnVmZmVyc1swXS5zaXplOworICAgICAgICBidWZmZXJzKys7CisgICAgICAgIG51bUJ1ZmZlcnMtLTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoremVyb1BpcGVfcmVjdkJ1ZmZlcnMoIHZvaWQqIG9wYXF1ZSwgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzICkKK3sKKyAgICBpbnQgIHJldCA9IDA7CisgICAgd2hpbGUgKG51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIHJldCArPSBidWZmZXJzWzBdLnNpemU7CisgICAgICAgIG1lbXNldChidWZmZXJzWzBdLmRhdGEsIDAsIGJ1ZmZlcnNbMF0uc2l6ZSk7CisgICAgICAgIGJ1ZmZlcnMrKzsKKyAgICAgICAgbnVtQnVmZmVycy0tOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQKK3plcm9QaXBlX3BvbGwoIHZvaWQqIG9wYXF1ZSApCit7CisgICAgcmV0dXJuIFBJUEVfUE9MTF9JTiB8IFBJUEVfUE9MTF9PVVQ7Cit9CisKK3N0YXRpYyB2b2lkCit6ZXJvUGlwZV93YWtlT24oIHZvaWQqIG9wYXF1ZSwgaW50IGZsYWdzICkKK3sKKyAgICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KK30KKworc3RhdGljIGNvbnN0IEFuZHJvaWRQaXBlRnVuY3MgIHplcm9QaXBlX2Z1bmNzID0geworICAgIHplcm9QaXBlX2luaXQsCisgICAgemVyb1BpcGVfY2xvc2UsCisgICAgemVyb1BpcGVfc2VuZEJ1ZmZlcnMsCisgICAgemVyb1BpcGVfcmVjdkJ1ZmZlcnMsCisgICAgemVyb1BpcGVfcG9sbCwKKyAgICB6ZXJvUGlwZV93YWtlT24sCit9OworCit2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZV96ZXJvKHZvaWQpIHsKKyAgICBhbmRyb2lkX3BpcGVfYWRkX3R5cGUoInplcm8iLCBOVUxMLCAmemVyb1BpcGVfZnVuY3MpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZWUwMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV96ZXJvLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFJlZ2lzdGVyIHRoZSAnemVybycgQW5kcm9pZCBwaXBlIHNlcnZpY2UuCit2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZV96ZXJvKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3plcm9fdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyb191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5N2IxOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3plcm9fdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0QW5kcm9pZFBpcGVEZXZpY2UuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCit1c2luZyBHdWVzdCA9IGFuZHJvaWQ6OlRlc3RBbmRyb2lkUGlwZURldmljZTo6R3Vlc3Q7CisKKy8vIEEgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHRoYXQgcHJvdmlkZXMgdGhlICd6ZXJvJyBzZXJ2aWNlLgorZXh0ZXJuICJDIiB2b2lkIGFuZHJvaWRfcGlwZV9hZGRfdHlwZV96ZXJvKHZvaWQpOworCitjbGFzcyBaZXJvUGlwZURldmljZSA6IHB1YmxpYyBhbmRyb2lkOjpUZXN0QW5kcm9pZFBpcGVEZXZpY2UgeworcHVibGljOgorICAgIFplcm9QaXBlRGV2aWNlKCkgeworICAgICAgICBhbmRyb2lkX3BpcGVfYWRkX3R5cGVfemVybygpOworICAgIH0KK307CisKK1RFU1QoQW5kcm9pZFBpcGUsWmVyb1BpcGVXcml0ZXMpIHsKKyAgICBaZXJvUGlwZURldmljZSBkZXY7CisgICAgc3RkOjp1bmlxdWVfcHRyPEd1ZXN0PiBndWVzdChHdWVzdDo6Y3JlYXRlKCkpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgiemVybyIpKTsKKyAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX0lOfFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZXNbXSA9IHsKKyAgICAgICAgMCwgMTAwLCAxMjgsIDI1NiwgNTEyLCAxMDAwLCAyMDQ4LCA4MTkyLCA2NTUzNTYsCisgICAgfTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZX1NJWkUoa1NpemVzKTsgbisrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcigneCcsIGtTaXplc1tuXSk7CisgICAgICAgIEVYUEVDVF9FUShQSVBFX1BPTExfSU58UElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisgICAgICAgIEVYUEVDVF9FUShidWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgZ3Vlc3QtPndyaXRlKGJ1ZmZlci5jX3N0cigpLCBidWZmZXIuc2l6ZSgpKSk7CisgICAgfQorfQorCitURVNUKEFuZHJvaWRQaXBlLFplcm9QaXBlUmVhZHMpIHsKKyAgICBaZXJvUGlwZURldmljZSBkZXY7CisgICAgc3RkOjp1bmlxdWVfcHRyPEd1ZXN0PiBndWVzdChHdWVzdDo6Y3JlYXRlKCkpOworICAgIEVYUEVDVF9FUSgwLCBndWVzdC0+Y29ubmVjdCgiemVybyIpKTsKKyAgICBFWFBFQ1RfRVEoUElQRV9QT0xMX0lOfFBJUEVfUE9MTF9PVVQsIGd1ZXN0LT5wb2xsKCkpOworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZXNbXSA9IHsKKyAgICAgICAgMCwgMTAwLCAxMjgsIDI1NiwgNTEyLCAxMDAwLCAyMDQ4LCA4MTkyLCA2NTUzNTYsCisgICAgfTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZX1NJWkUoa1NpemVzKTsgbisrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcigneCcsIGtTaXplc1tuXSk7CisgICAgICAgIEVYUEVDVF9FUShQSVBFX1BPTExfSU58UElQRV9QT0xMX09VVCwgZ3Vlc3QtPnBvbGwoKSk7CisgICAgICAgIEVYUEVDVF9FUShidWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgZ3Vlc3QtPnJlYWQoJmJ1ZmZlclswXSwgYnVmZmVyLnNpemUoKSkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlci5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKCdcMCcsIGJ1ZmZlcltpXSkgPDwgIiMgIjw8IGkgPDwgIiAvICIgPDwga1NpemVzW25dOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjYzUxOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5jcHAKQEAgLTAsMCArMSw0NjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhbmljLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY2xpZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX211bHRpcGxleGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogSW5pdGlhbGl6ZXMgUUVNVUQgc2VyaWFsIGludGVyZmFjZS4KKyAqLworc3RhdGljIHZvaWQgX2FuZHJvaWRfcWVtdWRfc2VyaWFsX2luaXQoQ1NlcmlhbExpbmUqIHNsKSB7CisgICAgLy8gZ3VhcmQgYWdhaW5zdCBkb3VibGUgaW5pdGlhbGl6YXRpb24KKyAgICBzdGF0aWMgQ1NlcmlhbExpbmUqIHFlbXVkX3NlcmlhbF9saW5lID0gTlVMTDsKKworICAgIGlmIChxZW11ZF9zZXJpYWxfbGluZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBxZW11ZF9zZXJpYWxfbGluZSA9IHNsOworICAgIHFlbXVkX211bHRpcGxleGVyX2luaXQocWVtdWRfbXVsdGlwbGV4ZXIsIHNsKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBRRU1VRCBQSVBFIHNlcnZpY2UgY2FsbGJhY2tzCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFNhdmVzIHBlbmRpbmcgcGlwZSBtZXNzYWdlIHRvIHRoZSBzbmFwc2hvdCBmaWxlLiAqLworc3RhdGljIHZvaWQgX3NhdmVfcGlwZV9tZXNzYWdlKFN0cmVhbSogZiwgUWVtdWRQaXBlTWVzc2FnZSogbXNnKSB7CisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIG1zZy0+c2l6ZSk7CisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIG1zZy0+b2Zmc2V0KTsKKyAgICBzdHJlYW1fd3JpdGUoZiwgbXNnLT5tZXNzYWdlLCBtc2ctPnNpemUpOworfQorCisvKiBMb2FkcyBwZW5kaW5nIHBpcGUgbWVzc2FnZXMgZnJvbSB0aGUgc25hcHNob3QgZmlsZS4KKyAqIFJldHVybjoKKyAqICBMaXN0IG9mIHBlbmRpbmcgcGlwZSBtZXNzYWdlcyBsb2FkZWQgZnJvbSBzbmFwc2hvdCwgb3IgTlVMTCBpZiBzbmFwc2hvdCBkaWRuJ3QKKyAqICBjb250YWluIHNhdmVkIG1lc3NhZ2VzLgorICovCitzdGF0aWMgUWVtdWRQaXBlTWVzc2FnZSogX2xvYWRfcGlwZV9tZXNzYWdlKFN0cmVhbSogZiwgUWVtdWRQaXBlTWVzc2FnZSoqIGxhc3QpIHsKKyAgICBRZW11ZFBpcGVNZXNzYWdlKiByZXQgPSBOVUxMOworICAgIFFlbXVkUGlwZU1lc3NhZ2UqKiBuZXh0ID0gJnJldDsKKyAgICAqbGFzdCA9IE5VTEw7CisKKyAgICB1aW50MzJfdCBzaXplID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgIHdoaWxlIChzaXplICE9IDApIHsKKyAgICAgICAgUWVtdWRQaXBlTWVzc2FnZSogd3JrID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxRZW11ZFBpcGVNZXNzYWdlKj4oYW5kcm9pZF9hbGxvYzAoc2l6ZW9mKCp3cmspKSk7CisgICAgICAgICpsYXN0ID0gKm5leHQgPSB3cms7CisgICAgICAgIHdyay0+c2l6ZSA9IHNpemU7CisgICAgICAgIHdyay0+b2Zmc2V0ID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgICAgICB3cmstPm1lc3NhZ2UgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4obWFsbG9jKHdyay0+c2l6ZSkpOworICAgICAgICBpZiAod3JrLT5tZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFQQU5JQygiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgcGlwZSdzIHBlbmRpbmcgbWVzc2FnZS4iKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1fcmVhZChmLCB3cmstPm1lc3NhZ2UsIHdyay0+c2l6ZSk7CisgICAgICAgIG5leHQgPSAmd3JrLT5uZXh0OworICAgICAgICAqbmV4dCA9IE5VTEw7CisgICAgICAgIHNpemUgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBpcyBhIGNhbGxiYWNrIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gZ3Vlc3QgaXMgY29ubmVjdGluZyB0byB0aGUgc2VydmljZS4KKyAqCisgKiBIZXJlIHdlIHdpbGwgY3JlYXRlIGEgbmV3IGNsaWVudCBhcyB3ZWxsIGFzIHBpcGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgbmV3CisgKiBjb25uZWN0aW9uLgorICovCitzdGF0aWMgdm9pZCoKK19xZW11ZFBpcGVfaW5pdCh2b2lkKiBod3BpcGUsIHZvaWQqIF9sb29wZXIsIGNvbnN0IGNoYXIqIGFyZ3MpIHsKKyAgICBRZW11ZE11bHRpcGxleGVyKiBtID0gcWVtdWRfbXVsdGlwbGV4ZXI7CisgICAgUWVtdWRTZXJ2aWNlKiBzdiA9IG0tPnNlcnZpY2VzOworICAgIFFlbXVkQ2xpZW50KiBjbGllbnQ7CisgICAgUWVtdWRQaXBlKiBwaXBlID0gTlVMTDsKKyAgICBjaGFyIHNlcnZpY2VfbmFtZVs1MTJdOworICAgIGNvbnN0IGNoYXIqIGNsaWVudF9hcmdzOworICAgIHNpemVfdCBzcnZfbmFtZV9sZW47CisKKyAgICAvKiAnYXJncycgcGFzc2VkIGluIHRoaXMgY2FsbGJhY2sgcmVwcmVzZW50cyBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoZSBndWVzdCBpcworICAgICAqIGNvbm5lY3RpbmcgdG8uIEl0IGNhbid0IGJlIE5VTEwuICovCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogTWlzc2luZyBhZGRyZXNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qICdhcmdzJyBjb250YWluIHNlcnZpY2UgbmFtZSwgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBjbGllbnQgdGhhdAorICAgICAqIGlzIGFib3V0IHRvIGJlIGNyZWF0ZWQgaW4gdGhpcyBjYWxsLiBUaGUgcGFyYW1ldGVycyBhcmUgc2VwYXJhdGVkIGZyb20gdGhlCisgICAgICogc2VydmljZSBuYW1lIHdpdCAnOicuIFNlcGFyYXRlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBjbGllbnQgcGFyYW0uICovCisgICAgY2xpZW50X2FyZ3MgPSBzdHJjaHIoYXJncywgJzonKTsKKyAgICBpZiAoY2xpZW50X2FyZ3MgIT0gTlVMTCkgeworICAgICAgICBzcnZfbmFtZV9sZW4gPSBtaW4oY2xpZW50X2FyZ3MgLSBhcmdzLCAoaW50cHRyX3QpIHNpemVvZihzZXJ2aWNlX25hbWUpIC0gMSk7CisgICAgICAgIGNsaWVudF9hcmdzKys7ICAvLyBQYXN0IHRoZSAnOicKKyAgICAgICAgaWYgKCpjbGllbnRfYXJncyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBObyBhY3R1YWwgcGFyYW1ldGVycy4gKi8KKyAgICAgICAgICAgIGNsaWVudF9hcmdzID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNydl9uYW1lX2xlbiA9IG1pbihzdHJsZW4oYXJncyksIHNpemVvZihzZXJ2aWNlX25hbWUpIC0gMSk7CisgICAgfQorICAgIG1lbWNweShzZXJ2aWNlX25hbWUsIGFyZ3MsIHNydl9uYW1lX2xlbik7CisgICAgc2VydmljZV9uYW1lW3Nydl9uYW1lX2xlbl0gPSAnXDAnOworCisgICAgLyogTG9va3VwIHJlZ2lzdGVyZWQgc2VydmljZSBieSBpdHMgbmFtZS4gKi8KKyAgICB3aGlsZSAoc3YgIT0gTlVMTCAmJiBzdHJjbXAoc3YtPm5hbWUsIHNlcnZpY2VfbmFtZSkpIHsKKyAgICAgICAgc3YgPSBzdi0+bmV4dDsKKyAgICB9CisgICAgaWYgKHN2ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IFNlcnZpY2UgJyVzJyBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCEiLCBfX0ZVTkNUSU9OX18sIHNlcnZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhIGNsaWVudCBmb3IgdGhpcyBjb25uZWN0aW9uLiAtMSBhcyBhIGNoYW5uZWwgSUQgc2lnbmFscyB0aGF0IHRoaXMKKyAgICAgKiBpcyBhIHBpcGUgY2xpZW50LiAqLworICAgIGNsaWVudCA9IHFlbXVkX3NlcnZpY2VfY29ubmVjdF9jbGllbnQoc3YsIC0xLCBjbGllbnRfYXJncyk7CisgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7CisgICAgICAgIHBpcGUgPSBzdGF0aWNfY2FzdDxRZW11ZFBpcGUqPihhbmRyb2lkX2FsbG9jMChzaXplb2YoKnBpcGUpKSk7CisgICAgICAgIHBpcGUtPmh3cGlwZSA9IGh3cGlwZTsKKyAgICAgICAgcGlwZS0+bG9vcGVyID0gX2xvb3BlcjsKKyAgICAgICAgcGlwZS0+c2VydmljZSA9IHN2OworICAgICAgICBwaXBlLT5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIGNsaWVudC0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLnFlbXVkX3BpcGUgPSBwaXBlOworICAgIH0KKworICAgIHJldHVybiBwaXBlOworfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgZ3Vlc3Qgd2FudHMgdG8gY2xvc2UgdGhlIGNoYW5uZWwuCisqLworc3RhdGljIHZvaWQKK19xZW11ZFBpcGVfY2xvc2VGcm9tR3Vlc3Qodm9pZCogb3BhcXVlKSB7CisgICAgUWVtdWRQaXBlKiBwaXBlID0gc3RhdGljX2Nhc3Q8UWVtdWRQaXBlKj4ob3BhcXVlKTsKKyAgICBRZW11ZENsaWVudCogY2xpZW50ID0gcGlwZS0+Y2xpZW50OworICAgIEQoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsKKyAgICAgICAgcWVtdWRfY2xpZW50X2Rpc2Nvbm5lY3QoY2xpZW50LCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEKCIlczogVW5leHBlY3RlZCBOVUxMIGNsaWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorfQorCisvKiBDYWxsZWQgd2hlbiB0aGUgZ3Vlc3QgaGFzIHNlbnQgc29tZSBkYXRhIHRvIHRoZSBjbGllbnQuCisgKi8KK3N0YXRpYyBpbnQKK19xZW11ZFBpcGVfc2VuZEJ1ZmZlcnModm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBRZW11ZFBpcGUqIHBpcGUgPSBzdGF0aWNfY2FzdDxRZW11ZFBpcGUqPihvcGFxdWUpOworICAgIFFlbXVkQ2xpZW50KiBjbGllbnQgPSBwaXBlLT5jbGllbnQ7CisgICAgc2l6ZV90IHRyYW5zZmVycmVkID0gMDsKKworICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogVW5leHBlY3RlZCBOVUxMIGNsaWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobnVtQnVmZmVycyA9PSAxKSB7CisgICAgICAgIC8qIFNpbXBsZSBjYXNlOiBhbGwgZGF0YSBhcmUgaW4gb25lIGJ1ZmZlci4gKi8KKyAgICAgICAgRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBxdW90ZV9ieXRlcygoY2hhciopIGJ1ZmZlcnMtPmRhdGEsIGJ1ZmZlcnMtPnNpemUpKTsKKyAgICAgICAgcWVtdWRfY2xpZW50X3JlY3YoY2xpZW50LCBidWZmZXJzLT5kYXRhLCBidWZmZXJzLT5zaXplKTsKKyAgICAgICAgdHJhbnNmZXJyZWQgPSBidWZmZXJzLT5zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBidWZmZXJzIGludm9sdmVkLCBjb2xsZWN0IGFsbCBkYXRhIGluIG9uZSBidWZmZXIKKyAgICAgICAgICogYmVmb3JlIGNhbGxpbmcgdGhlIGhpZ2ggbGV2ZWwgY2xpZW50LiAqLworICAgICAgICB1aW50OF90KiBtc2csICogd3JrOworICAgICAgICBpbnQgbjsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG51bUJ1ZmZlcnM7IG4rKykgeworICAgICAgICAgICAgdHJhbnNmZXJyZWQgKz0gYnVmZmVyc1tuXS5zaXplOworICAgICAgICB9CisgICAgICAgIG1zZyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihtYWxsb2ModHJhbnNmZXJyZWQpKTsKKyAgICAgICAgd3JrID0gbXNnOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbnVtQnVmZmVyczsgbisrKSB7CisgICAgICAgICAgICBtZW1jcHkod3JrLCBidWZmZXJzW25dLmRhdGEsIGJ1ZmZlcnNbbl0uc2l6ZSk7CisgICAgICAgICAgICB3cmsgKz0gYnVmZmVyc1tuXS5zaXplOworICAgICAgICB9CisgICAgICAgIEQoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgcXVvdGVfYnl0ZXMoKGNoYXIqKSBtc2csIHRyYW5zZmVycmVkKSk7CisgICAgICAgIHFlbXVkX2NsaWVudF9yZWN2KGNsaWVudCwgbXNnLCB0cmFuc2ZlcnJlZCk7CisgICAgICAgIGZyZWUobXNnKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNmZXJyZWQ7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBndWVzdCBpcyByZWFkaW5nIGRhdGEgZnJvbSB0aGUgY2xpZW50LgorICovCitzdGF0aWMgaW50CitfcWVtdWRQaXBlX3JlY3ZCdWZmZXJzKHZvaWQqIG9wYXF1ZSwgQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzKSB7CisgICAgUWVtdWRQaXBlKiBwaXBlID0gc3RhdGljX2Nhc3Q8UWVtdWRQaXBlKj4ob3BhcXVlKTsKKyAgICBRZW11ZENsaWVudCogY2xpZW50ID0gcGlwZS0+Y2xpZW50OworICAgIFFlbXVkUGlwZU1lc3NhZ2UqKiBtc2dfbGlzdDsKKyAgICBBbmRyb2lkUGlwZUJ1ZmZlciogYnVmZiA9IGJ1ZmZlcnM7CisgICAgQW5kcm9pZFBpcGVCdWZmZXIqIGVuZGJ1ZmYgPSBidWZmZXJzICsgbnVtQnVmZmVyczsKKyAgICBzaXplX3Qgc2VudF9ieXRlcyA9IDA7CisgICAgc2l6ZV90IG9mZl9pbl9idWZmID0gMDsKKworICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogVW5leHBlY3RlZCBOVUxMIGNsaWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtc2dfbGlzdCA9ICZjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5tZXNzYWdlczsKKyAgICBpZiAoKm1zZ19saXN0ID09IE5VTEwpIHsKKyAgICAgICAgLyogTm8gZGF0YSB0byBzZW5kLiBMZXQgaXQgYmxvY2sgdW50aWwgd2Ugd2FrZSBpdCB1cCB3aXRoCisgICAgICAgICAqIFBJUEVfV0FLRV9SRUFEIHdoZW4gc2VydmljZSBzZW5kcyBkYXRhIHRvIHRoZSBjbGllbnQuICovCisgICAgICAgIHJldHVybiBQSVBFX0VSUk9SX0FHQUlOOworICAgIH0KKworICAgIC8qIEZpbGwgaW4gZ29sZGZpc2ggYnVmZmVycyB3aGlsZSB0aGV5IGFyZSBzdGlsbCBhdmFpbGFibGUsIGFuZCB0aGVyZSBhcmUKKyAgICAgKiBtZXNzYWdlcyBpbiB0aGUgY2xpZW50J3MgbWVzc2FnZSBsaXN0LiAqLworICAgIHdoaWxlIChidWZmICE9IGVuZGJ1ZmYgJiYgKm1zZ19saXN0ICE9IE5VTEwpIHsKKyAgICAgICAgUWVtdWRQaXBlTWVzc2FnZSogbXNnID0gKm1zZ19saXN0OworICAgICAgICAvKiBNZXNzYWdlIGRhdGEgZml0aW5nIHRoZSBjdXJyZW50IHBpcGUncyBidWZmZXIuICovCisgICAgICAgIHNpemVfdCB0b19jb3B5ID0gbWluKG1zZy0+c2l6ZSAtIG1zZy0+b2Zmc2V0LCBidWZmLT5zaXplIC0gb2ZmX2luX2J1ZmYpOworICAgICAgICBtZW1jcHkoYnVmZi0+ZGF0YSArIG9mZl9pbl9idWZmLCBtc2ctPm1lc3NhZ2UgKyBtc2ctPm9mZnNldCwgdG9fY29weSk7CisgICAgICAgIC8qIFVwZGF0ZSBvZmZzZXRzLiAqLworICAgICAgICBvZmZfaW5fYnVmZiArPSB0b19jb3B5OworICAgICAgICBtc2ctPm9mZnNldCArPSB0b19jb3B5OworICAgICAgICBzZW50X2J5dGVzICs9IHRvX2NvcHk7CisgICAgICAgIGlmIChtc2ctPnNpemUgPT0gbXNnLT5vZmZzZXQpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgY3VycmVudCBtZXNzYWdlLiBHbyB0byB0aGUgbmV4dCBvbmUuICovCisgICAgICAgICAgICAqbXNnX2xpc3QgPSBtc2ctPm5leHQ7CisgICAgICAgICAgICBmcmVlKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZl9pbl9idWZmID09IGJ1ZmYtPnNpemUpIHsKKyAgICAgICAgICAgIC8qIEN1cnJlbnQgcGlwZSBidWZmZXIgaXMgZnVsbC4gQ29udGludWUgd2l0aCB0aGUgbmV4dCBvbmUuICovCisgICAgICAgICAgICBidWZmKys7CisgICAgICAgICAgICBvZmZfaW5fYnVmZiA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISptc2dfbGlzdCkgeworICAgICAgICBjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5sYXN0X21zZyA9IE5VTEw7CisgICAgfQorCisgICAgRCgiJXM6IC0+ICV1IChvZiAldSkiLCBfX0ZVTkNUSU9OX18sIHNlbnRfYnl0ZXMsIGJ1ZmZlcnMtPnNpemUpOworCisgICAgcmV0dXJuIHNlbnRfYnl0ZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorX3FlbXVkUGlwZV9wb2xsKHZvaWQqIG9wYXF1ZSkgeworICAgIFFlbXVkUGlwZSogcGlwZSA9IHN0YXRpY19jYXN0PFFlbXVkUGlwZSo+KG9wYXF1ZSk7CisgICAgUWVtdWRDbGllbnQqIGNsaWVudCA9IHBpcGUtPmNsaWVudDsKKyAgICB1bnNpZ25lZCByZXQgPSAwOworCisgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7CisgICAgICAgIHJldCB8PSBQSVBFX1BPTExfT1VUOworICAgICAgICBpZiAoY2xpZW50LT5Qcm90b2NvbFNlbGVjdG9yLlBpcGUubWVzc2FnZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0IHw9IFBJUEVfUE9MTF9JTjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEQoIiVzOiBVbmV4cGVjdGVkIE5VTEwgY2xpZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorX3FlbXVkUGlwZV93YWtlT24odm9pZCogb3BhcXVlLCBpbnQgZmxhZ3MpIHsKKyAgICBRZW11ZFBpcGUqIHFlbXVkX3BpcGUgPSAoUWVtdWRQaXBlKikgb3BhcXVlOworICAgIFFlbXVkQ2xpZW50KiBjID0gcWVtdWRfcGlwZS0+Y2xpZW50OworICAgIEQoIiVzOiAtPiAlWCIsIF9fRlVOQ1RJT05fXywgZmxhZ3MpOworICAgIGlmIChmbGFncyAmIFBJUEVfV0FLRV9SRUFEKSB7CisgICAgICAgIGlmIChjLT5Qcm90b2NvbFNlbGVjdG9yLlBpcGUubWVzc2FnZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgYW5kcm9pZF9waXBlX2hvc3Rfc2lnbmFsX3dha2UoCisgICAgICAgICAgICAgICAgICAgIGMtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5xZW11ZF9waXBlLT5od3BpcGUsCisgICAgICAgICAgICAgICAgICAgIFBJUEVfV0FLRV9SRUFEKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgX3FlbXVkUGlwZV9zYXZlKHZvaWQqIG9wYXF1ZSwgU3RyZWFtKiBmKSB7CisgICAgUWVtdWRQaXBlKiBxZW11ZF9waXBlID0gKFFlbXVkUGlwZSopIG9wYXF1ZTsKKyAgICBRZW11ZENsaWVudCogYyA9IHFlbXVkX3BpcGUtPmNsaWVudDsKKyAgICBRZW11ZFBpcGVNZXNzYWdlKiBtc2cgPSBjLT5Qcm90b2NvbFNlbGVjdG9yLlBpcGUubWVzc2FnZXM7CisKKyAgICAvKiBzYXZlIGdlbmVyaWMgaW5mb3JtYXRpb24gKi8KKyAgICBxZW11ZF9zZXJ2aWNlX3NhdmVfbmFtZShmLCBjLT5zZXJ2aWNlKTsKKyAgICBzdHJlYW1fcHV0X3N0cmluZyhmLCBjLT5wYXJhbSk7CisKKyAgICAvKiBTYXZlIHBlbmRpbmcgbWVzc2FnZXMuICovCisgICAgd2hpbGUgKG1zZyAhPSBOVUxMKSB7CisgICAgICAgIF9zYXZlX3BpcGVfbWVzc2FnZShmLCBtc2cpOworICAgICAgICBtc2cgPSBtc2ctPm5leHQ7CisgICAgfQorICAgIC8qIEVuZCBvZiBwZW5kaW5nIG1lc3NhZ2VzLiAqLworICAgIHN0cmVhbV9wdXRfYmUzMihmLCAwKTsKKworICAgIC8qIHNhdmUgY2xpZW50LXNwZWNpZmljIHN0YXRlICovCisgICAgaWYgKGMtPmNsaWVfc2F2ZSkKKyAgICAgICAgYy0+Y2xpZV9zYXZlKGYsIGMsIGMtPmNsaWVfb3BhcXVlKTsKKworICAgIC8qIHNhdmUgZnJhbWluZyBjb25maWd1cmF0aW9uICovCisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIGMtPmZyYW1pbmcpOworICAgIGlmIChjLT5mcmFtaW5nKSB7CisgICAgICAgIHN0cmVhbV9wdXRfYmUzMihmLCBjLT5uZWVkX2hlYWRlcik7CisgICAgICAgIC8qIGhlYWRlciBzaW5rIGFsd2F5cyBjb25uZWN0ZWQgdG8gYy0+aGVhZGVyMCwgbm8gbmVlZCB0byBzYXZlICovCisgICAgICAgIHN0cmVhbV9wdXRfYmUzMihmLCBGUkFNRV9IRUFERVJfU0laRSk7CisgICAgICAgIHN0cmVhbV93cml0ZShmLCBjLT5oZWFkZXIwLCBGUkFNRV9IRUFERVJfU0laRSk7CisgICAgICAgIC8qIHBheWxvYWQgc2luayAqLworICAgICAgICBxZW11ZF9zaW5rX3NhdmUoZiwgYy0+cGF5bG9hZCk7CisgICAgICAgIHN0cmVhbV93cml0ZShmLCBjLT5wYXlsb2FkLT5idWZmLCBjLT5wYXlsb2FkLT5zaXplKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkKiBfcWVtdWRQaXBlX2xvYWQodm9pZCogaHdwaXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwaXBlT3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0qIGYpIHsKKyAgICBRZW11ZFBpcGUqIHFlbXVkX3BpcGUgPSBOVUxMOworICAgIGNoYXIqIHBhcmFtOworICAgIGNoYXIqIHNlcnZpY2VfbmFtZSA9IHFlbXVkX3NlcnZpY2VfbG9hZF9uYW1lKGYpOworICAgIGlmIChzZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogZ2V0IHNlcnZpY2UgaW5zdGFuY2UgZm9yIHRoZSBsb2FkaW5nIGNsaWVudCovCisgICAgUWVtdWRTZXJ2aWNlKiBzdiA9IHFlbXVkX3NlcnZpY2VfZmluZChxZW11ZF9tdWx0aXBsZXhlci0+c2VydmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUpOworICAgIGlmIChzdiA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBsb2FkIGZhaWxlZDogdW5rbm93biBzZXJ2aWNlIFwiJXNcIlxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlcnZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIExvYWQgc2F2ZWQgcGFyYW1ldGVycy4gKi8KKyAgICBwYXJhbSA9IHN0cmVhbV9nZXRfc3RyaW5nKGYpOworCisgICAgLyogcmUtY29ubmVjdCBjbGllbnQgKi8KKyAgICBRZW11ZENsaWVudCogYyA9IHFlbXVkX3NlcnZpY2VfY29ubmVjdF9jbGllbnQoc3YsIC0xLCBwYXJhbSk7CisgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBMb2FkIHBlbmRpbmcgbWVzc2FnZXMuICovCisgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLm1lc3NhZ2VzID0KKyAgICAgICAgICAgIF9sb2FkX3BpcGVfbWVzc2FnZShmLCAmYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLmxhc3RfbXNnKTsKKworICAgIC8qIGxvYWQgY2xpZW50LXNwZWNpZmljIHN0YXRlICovCisgICAgaWYgKGMtPmNsaWVfbG9hZCAmJiBjLT5jbGllX2xvYWQoZiwgYywgYy0+Y2xpZV9vcGFxdWUpKSB7CisgICAgICAgIC8qIGxvYWQgZmFpbHVyZSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBsb2FkIGZyYW1pbmcgY29uZmlndXJhdGlvbiAqLworICAgIGMtPmZyYW1pbmcgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgaWYgKGMtPmZyYW1pbmcpIHsKKworICAgICAgICAvKiBoZWFkZXIgYnVmZmVyICovCisgICAgICAgIGMtPm5lZWRfaGVhZGVyID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgICAgICBpbnQgaGVhZGVyX3NpemUgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgICAgIGlmIChoZWFkZXJfc2l6ZSA+IEZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgICAgICAgICBEKCIlczogbG9hZCBmYWlsZWQ6IHBheWxvYWQgYnVmZmVyIHJlcXVpcmVzICVkIGJ5dGVzLCAlZCBhdmFpbGFibGVcbiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGVhZGVyX3NpemUsIEZSQU1FX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICgocmV0ID0gc3RyZWFtX3JlYWQoZiwgYy0+aGVhZGVyMCwgaGVhZGVyX3NpemUpKSAhPSBoZWFkZXJfc2l6ZSkgeworICAgICAgICAgICAgRCgiJXM6IGZyYW1lIGhlYWRlciBidWZmZXIgbG9hZCBmYWlsZWQ6IGV4cGVjdGVkICVkIGJ5dGVzLCBnb3QgJWRcbiIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGVhZGVyX3NpemUsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBheWxvYWQgc2luayAqLworICAgICAgICBpZiAoKHJldCA9IHFlbXVkX3NpbmtfbG9hZChmLCBjLT5wYXlsb2FkKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAvKiByZXBsYWNlIHBheWxvYWQgYnVmZmVyIGJ5IHNhdmVkIGRhdGEgKi8KKyAgICAgICAgaWYgKGMtPnBheWxvYWQtPmJ1ZmYpIHsKKyAgICAgICAgICAgIEFGUkVFKGMtPnBheWxvYWQtPmJ1ZmYpOworICAgICAgICB9CisKKyAgICAgICAgLyogKzEgZm9yIHRlcm1pbmF0aW5nIHplcm8gKi8KKyAgICAgICAgYy0+cGF5bG9hZC0+YnVmZiA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPigKKyAgICAgICAgICAgICAgICBfYW5kcm9pZF9hcnJheV9hbGxvYyhzaXplb2YoKmMtPnBheWxvYWQtPmJ1ZmYpLCBjLT5wYXlsb2FkLT5zaXplICsgMSkpOworICAgICAgICBpZiAoKHJldCA9IHN0cmVhbV9yZWFkKGYsIGMtPnBheWxvYWQtPmJ1ZmYsIGMtPnBheWxvYWQtPnNpemUpKSAhPQorICAgICAgICAgICAgYy0+cGF5bG9hZC0+c2l6ZSkgeworICAgICAgICAgICAgRCgiJXM6IGZyYW1lIHBheWxvYWQgYnVmZmVyIGxvYWQgZmFpbGVkOiBleHBlY3RlZCAlZCBieXRlcywgZ290ICVkXG4iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGMtPnBheWxvYWQtPnNpemUsIHJldCk7CisgICAgICAgICAgICBBRlJFRShjLT5wYXlsb2FkLT5idWZmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQXNzb2NpYXRlIHRoZSBjbGllbnQgd2l0aCB0aGUgcGlwZS4gKi8KKyAgICBxZW11ZF9waXBlID0gc3RhdGljX2Nhc3Q8UWVtdWRQaXBlKj4oYW5kcm9pZF9hbGxvYzAoc2l6ZW9mKCpxZW11ZF9waXBlKSkpOworICAgIHFlbXVkX3BpcGUtPmh3cGlwZSA9IGh3cGlwZTsKKyAgICBxZW11ZF9waXBlLT5sb29wZXIgPSBwaXBlT3BhcXVlOworICAgIHFlbXVkX3BpcGUtPnNlcnZpY2UgPSBzdjsKKyAgICBxZW11ZF9waXBlLT5jbGllbnQgPSBjOworICAgIGMtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5xZW11ZF9waXBlID0gcWVtdWRfcGlwZTsKKworICAgIHJldHVybiBxZW11ZF9waXBlOworfQorCisvKiBRRU1VRCBwaXBlIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGNvbnN0IEFuZHJvaWRQaXBlRnVuY3MgX3FlbXVkUGlwZV9mdW5jcyA9IHsKKyAgICAgICAgX3FlbXVkUGlwZV9pbml0LAorICAgICAgICBfcWVtdWRQaXBlX2Nsb3NlRnJvbUd1ZXN0LAorICAgICAgICBfcWVtdWRQaXBlX3NlbmRCdWZmZXJzLAorICAgICAgICBfcWVtdWRQaXBlX3JlY3ZCdWZmZXJzLAorICAgICAgICBfcWVtdWRQaXBlX3BvbGwsCisgICAgICAgIF9xZW11ZFBpcGVfd2FrZU9uLAorICAgICAgICBfcWVtdWRQaXBlX3NhdmUsCisgICAgICAgIF9xZW11ZFBpcGVfbG9hZCwKK307CisKKy8qIEluaXRpYWxpemVzIFFFTVVEIHBpcGUgaW50ZXJmYWNlLgorICovCitzdGF0aWMgdm9pZCBfYW5kcm9pZF9xZW11ZF9waXBlX2luaXQodm9pZCkgeworICAgIHN0YXRpYyBib29sIF9xZW11ZF9waXBlX2luaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBpZiAoIV9xZW11ZF9waXBlX2luaXRpYWxpemVkKSB7CisgICAgICAgIGFuZHJvaWRfcGlwZV9hZGRfdHlwZSgicWVtdWQiLCBsb29wZXJfZ2V0Rm9yVGhyZWFkKCksICZfcWVtdWRQaXBlX2Z1bmNzKTsKKyAgICAgICAgX3FlbXVkX3BpcGVfaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworc3RhdGljIGJvb2wgaXNJbml0ZWQgPSBmYWxzZTsKKwordm9pZCBhbmRyb2lkX3FlbXVkX2luaXQoQ1NlcmlhbExpbmUqIHNsKSB7CisgICAgRCgiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgIC8qIFdlIGRvbid0IGtub3cgaW4gYWR2YW5jZSB3aGV0aGVyIHRoZSBndWVzdCBzeXN0ZW0gc3VwcG9ydHMgcWVtdWQgcGlwZXMsCisgICAgICogc28gd2Ugd2lsbCBpbml0aWFsaXplIGJvdGggcWVtdWQgbWFjaGluZXJpZXMsIHRoZSBsZWdhY3kgKG92ZXIgc2VyaWFsCisgICAgICogcG9ydCksIGFuZCB0aGUgbmV3IG9uZSAob3ZlciBxZW11IHBpcGUpLiBUaGVuIHdlIGxldCB0aGUgZ3Vlc3QgdG8gY29ubmVjdAorICAgICAqIHZpYSBvbmUsIG9yIHRoZSBvdGhlci4gKi8KKyAgICBfYW5kcm9pZF9xZW11ZF9zZXJpYWxfaW5pdChzbCk7CisgICAgX2FuZHJvaWRfcWVtdWRfcGlwZV9pbml0KCk7CisgICAgaXNJbml0ZWQgPSB0cnVlOworfQorCitRZW11ZFNlcnZpY2UqIHFlbXVkX3NlcnZpY2VfcmVnaXN0ZXIoY29uc3QgY2hhciogc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY2xpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VDb25uZWN0IHNlcnZfY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VTYXZlIHNlcnZfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VMb2FkIHNlcnZfbG9hZCkgeworICAgIGFzc2VydChpc0luaXRlZCk7CisKKyAgICBRZW11ZFNlcnZpY2UqIGNvbnN0IHN2ID0KKyAgICAgICAgICAgIHFlbXVkX3NlcnZpY2VfbmV3KHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jbGllbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X3NhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWVtdWRfbXVsdGlwbGV4ZXItPnNlcnZpY2VzKTsKKyAgICBEKCJSZWdpc3RlcmVkIFFFTVVEIHNlcnZpY2UgJXMiLCBzZXJ2aWNlX25hbWUpOworICAgIHJldHVybiBzdjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3Nzk4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5oCkBAIC0wLDAgKzEsMTgzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIFN1cHBvcnQgZm9yIHRoZSBxZW11ZC1iYXNlZCAnc2VydmljZXMnIGluIHRoZSBlbXVsYXRvci4KKyAqIFBsZWFzZSByZWFkIGRvY3MvQU5EUk9JRC1RRU1VRC5UWFQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgaXMgYWJvdXQuCisgKi8KKworLyogaW5pdGlhbGl6ZSB0aGUgcWVtdWQgc3VwcG9ydCBjb2RlIGluIHRoZSBlbXVsYXRvcgorICogfHNsfCBpcyBhIHNlcmlhbCBsaW5lIHFlbXVkIHNob3VsZCB1c2Ugb24gaXRzIGVuZAorICovCitleHRlcm4gdm9pZCBhbmRyb2lkX3FlbXVkX2luaXQoQ1NlcmlhbExpbmUqIHNsKTsKKworLyogQSBRZW11ZFNlcnZpY2Ugc2VydmljZSBpcyB1c2VkIHRvIGNvbm5lY3Qgb25lIG9yIG1vcmUgY2xpZW50cyB0bworICogYSBnaXZlbiBlbXVsYXRvciBmYWNpbGl0eS4gT25seSBvbmUgY2xpZW50IGNhbiBiZSBjb25uZWN0ZWQgYXQgYW55CisgKiBnaXZlbiB0aW1lLCBidXQgdGhlIGNvbm5lY3Rpb24gY2FuIGJlIGNsb3NlZCBwZXJpb2RpY2FsbHkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUWVtdWRDbGllbnQgUWVtdWRDbGllbnQ7Cit0eXBlZGVmIHN0cnVjdCBRZW11ZFNlcnZpY2UgUWVtdWRTZXJ2aWNlOwordHlwZWRlZiBzdHJ1Y3QgUWVtdWRNdWx0aXBsZXhlciBRZW11ZE11bHRpcGxleGVyOworCitleHRlcm4gUWVtdWRNdWx0aXBsZXhlciogY29uc3QgcWVtdWRfbXVsdGlwbGV4ZXI7CisKKy8qIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcnVubmluZyBpbiB0aGUgZW11bGF0ZWQKKyAqIHN5c3RlbSBoYXMgY2xvc2VkIGl0cyBjb25uZWN0aW9uIHRvIHFlbXVkLgorICovCit0eXBlZGVmIHZvaWQgKCpRZW11ZENsaWVudENsb3NlKSh2b2lkKiBvcGFxdWUpOworCisvKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHNlbmRzIGEgbWVzc2FnZSB0byB0aGUKKyAqIHNlcnZpY2UgdGhyb3VnaCBxZW11ZC4KKyAqLwordHlwZWRlZiB2b2lkICgqUWVtdWRDbGllbnRSZWN2KSh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqIGNsaWVudCk7CisKKy8qIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgY2xpZW50IHNob3VsZCBiZQorICogc2F2ZWQgdG8gYSBzbmFwc2hvdC4KKyAqLwordHlwZWRlZiB2b2lkICgqUWVtdWRDbGllbnRTYXZlKShTdHJlYW0qIGYsIFFlbXVkQ2xpZW50KiBjbGllbnQsIHZvaWQqIG9wYXF1ZSk7CisKKy8qIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgY2xpZW50IHNob3VsZCBiZQorICogcmVzdG9yZWQgZnJvbSBhIHNuYXBzaG90LgorICovCit0eXBlZGVmIGludCAoKlFlbXVkQ2xpZW50TG9hZCkoU3RyZWFtKiBmLCBRZW11ZENsaWVudCogY2xpZW50LCB2b2lkKiBvcGFxdWUpOworCisKKy8qIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgY2xpZW50IGluIHRoZSBlbXVsYXRlZAorICogc3lzdGVtIHRyaWVzIHRvIGNvbm5lY3QgdG8gYSBnaXZlbiBxZW11ZCBzZXJ2aWNlLiBUaGlzIHNob3VsZCB0eXBpY2FsbHkKKyAqIGNhbGwgcWVtdWRfY2xpZW50X25ldygpIHRvIHJlZ2lzdGVyIGEgbmV3IGNsaWVudC4KKyAqLwordHlwZWRlZiBRZW11ZENsaWVudCogKCpRZW11ZFNlcnZpY2VDb25uZWN0KSh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSk7CisKKy8qIFJlZ2lzdGVyIGEgbmV3IGNsaWVudCBmb3IgYSBnaXZlbiBzZXJ2aWNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIGluIHRoZSBzZXJ2X2Nvbm5lY3QgY2FsbGJhY2sKKyAqIG9mIGEgZ2l2ZW4gUWVtdWRTZXJ2aWNlIG9iamVjdCAoc2VlIHFlbXVkX3NlcnZpY2VfcmVnaXN0ZXIoKQorICogYmVsb3cpLiBJdCBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgbmV3IFFlbXVkQ2xpZW50IHRvIGFja25vd2xlZGdlCisgKiBhIG5ldyBjbGllbnQgY29ubmVjdGlvbi4KKyAqCisgKiAnY2xpZV9vcGFxdWUnLCAnY2xpZV9yZWN2JyBhbmQgJ2NsaWVfY2xvc2UnIGFyZSB1c2VkIHRvCisgKiBzZW5kIGluY29taW5nIGNsaWVudCBtZXNzYWdlcyB0byB0aGUgY29ycmVzcG9uZGluZyBzZXJ2aWNlCisgKiBpbXBsZW1lbnRhdGlvbiwgb3Igbm90aWZ5IHRoZSBzZXJ2aWNlIHRoYXQgYSBjbGllbnQgaGFzCisgKiBkaXNjb25uZWN0ZWQuCisgKiAnY2xpZV9vcGFxdWUnIHdpbGwgYmUgc2VudCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gJ2NsaWVfcmVjdicgYW5kCisgKiAnY2xpZV9jbG9zZScKKyAqICdjbGllX3JlY3YnIGFuZCAnY2xpZV9jbG9zZScgYXJlIGJvdGggb3B0aW9uYWwgYW5kIG1heSBiZSBOVUxMLgorICovCitleHRlcm4gUWVtdWRDbGllbnQqIHFlbXVkX2NsaWVudF9uZXcoUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjbGllX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudFJlY3YgY2xpZV9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50Q2xvc2UgY2xpZV9jbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudFNhdmUgY2xpZV9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50TG9hZCBjbGllX2xvYWQpOworCisvKiBTZW5kIGEgbWVzc2FnZSB0byBhIGdpdmVuIHFlbXVkIGNsaWVudAorICovCitleHRlcm4gdm9pZCBxZW11ZF9jbGllbnRfc2VuZChRZW11ZENsaWVudCogY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbik7CisKKy8qIGVuYWJsZSBmcmFtaW5nIGZvciB0aGlzIGNsaWVudC4gV2hlbiBUUlVFLCB0aGlzIHdpbGwKKyAqIHVzZSBpbnRlcm5hbGx5IGEgc2ltcGxlIDQtaGV4Y2hhciBoZWFkZXIgYmVmb3JlIGVhY2gKKyAqIG1lc3NhZ2UgZXhjaGFuZ2VkIHRocm91Z2ggdGhlIHNlcmlhbCBwb3J0LgorICovCitleHRlcm4gdm9pZCBxZW11ZF9jbGllbnRfc2V0X2ZyYW1pbmcoUWVtdWRDbGllbnQqIGNsaWVudCwgaW50IGZyYW1pbmcpOworCisvKiBGb3JjZS1jbG9zZSB0aGUgY29ubmVjdGlvbiB0byBhIGdpdmVuIHFlbXVkIGNsaWVudC4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfY2xpZW50X2Nsb3NlKFFlbXVkQ2xpZW50KiBjbGllbnQpOworCisvKiBjaGVjayBpZiB0aGUgY2xpZW50IGlzIGltcGxlbWVudGVkIHdpdGggYSBwaXBlICovCitleHRlcm4gYm9vbCBxZW11ZF9pc19waXBlX2NsaWVudChRZW11ZENsaWVudCogY2xpZW50KTsKKworLyogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBzZXJ2aWNlIHNob3VsZCBiZQorICogc2F2ZWQgdG8gYSBzbmFwc2hvdC4KKyAqLwordHlwZWRlZiB2b2lkICgqUWVtdWRTZXJ2aWNlU2F2ZSkoU3RyZWFtKiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKTsKKworLyogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBzZXJ2aWNlIHNob3VsZCBiZQorICogcmVzdG9yZWQgZnJvbSBhIHNuYXBzaG90LgorICovCit0eXBlZGVmIGludCAoKlFlbXVkU2VydmljZUxvYWQpKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlLCB2b2lkKiBvcGFxdWUpOworCisvKiBSZWdpc3RlciBhIG5ldyBxZW11ZCBzZXJ2aWNlLgorICogdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgbmV3IG5hbWVkIHFlbXVkLWJhc2VkCisgKiBzZXJ2aWNlLiBZb3UgbXVzdCBwcm92aWRlICdzZXJ2X29wYXF1ZScgYW5kICdzZXJ2X2Nvbm5lY3QnCisgKiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBjbGllbnQgdHJpZXMgdG8gY29ubmVjdAorICogdG8gdGhlIHNlcnZpY2VzLgorICoKKyAqICdzZXJ2X29wYXF1ZScgaXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byAnc2Vydl9jb25uZWN0JworICoKKyAqICdzZXJ2X2Nvbm5lY3QnIHNoYWxsIHJldHVybiBOVUxMIGlmIHRoZSBjb25uZWN0aW9uIGlzIHJlZnVzZWQsCisgKiBvciBhIGhhbmRsZSB0byBhIG5ldyBRZW11ZENsaWVudCBvdGhlcndpc2UuIFRoZSBsYXR0ZXIgY2FuIGJlCisgKiBjcmVhdGVkIHRocm91Z2ggcWVtdWRfY2xpZW50X25ldygpIGRlZmluZWQgYWJvdmUuCisgKgorICogJ21heF9jbGllbnRzJyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyBhY2NlcHRlZCBieQorICogdGhlIHNlcnZpY2UgY29uY3VycmVudGx5LiBJZiB0aGlzIHZhbHVlIGlzIDAsIHRoZW4gYW55IG51bWJlcgorICogb2YgY2xpZW50cyBjYW4gY29ubmVjdC4KKyAqLworZXh0ZXJuIFFlbXVkU2VydmljZSogcWVtdWRfc2VydmljZV9yZWdpc3Rlcihjb25zdCBjaGFyKiBzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jbGllbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlQ29ubmVjdCBzZXJ2X2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZVNhdmUgc2Vydl9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VMb2FkIHNlcnZfbG9hZCk7CisKKy8qIENyZWF0ZSBhIG5ldyBRZW11ZFNlcnZpY2Ugb2JqZWN0ICovCitleHRlcm4gUWVtdWRTZXJ2aWNlKiBxZW11ZF9zZXJ2aWNlX25ldyhjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jbGllbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc2Vydl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VDb25uZWN0IHNlcnZfY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZVNhdmUgc2Vydl9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlTG9hZCBzZXJ2X2xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2UqKiBwc2VydmljZXMpOworCisvKiBicm9hZGNhc3QgYSBnaXZlbiBtZXNzYWdlIHRvIGFsbCBjbGllbnRzIG9mIGEgZ2l2ZW4gUWVtdWRTZXJ2aWNlCisgKi8KK2V4dGVybiB2b2lkIHFlbXVkX3NlcnZpY2VfYnJvYWRjYXN0KFFlbXVkU2VydmljZSogc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNnbGVuKTsKKworLyogTG9hZCBRZW11RCBzdGF0ZSBmcm9tIGEgc3RyZWFtLgorICovCitleHRlcm4gaW50IHFlbXVkX211bHRpcGxleGVyX2xvYWQoUWVtdWRNdWx0aXBsZXhlciogbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbik7CisKKy8qIFNhdmUgUWVtdUQgc3RhdGUgdG8gc25hcHNob3QuCisgKgorICogVGhlIGNvbnRyb2wgY2hhbm5lbCBoYXMgbm8gc3RhdGUgb2YgaXRzIG93biwgb3RoZXIgdGhhbiB0aGUgbG9jYWwgdmFyaWFibGVzCisgKiBpbiBxZW11ZF9tdWx0aXBsZXhlcl9jb250cm9sX3JlY3YuIFdlIGNhbiB0aGVyZWZvcmUgc2FmZWx5IHNraXAgc2F2aW5nIGl0LAorICogd2hpY2ggc3BhcmVzIHVzIGRlYWxpbmcgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGEgY2xpZW50IG5vdCBjb25uZWN0ZWQgdG8gYQorICogc2VydmljZS4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfc2F2ZShRZW11ZE11bHRpcGxleGVyKiBtLCBTdHJlYW0qIHN0cmVhbSk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2J1ZnByaW50X2NvbmZpZ19kaXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJmNTJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5jcHAKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OkNvbmZpZ0RpcnM7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIGJ1ZnByaW50Zl94eHgoKSBmdW5jdGlvbnMgdGhhdCByZWx5IG9uCisvLyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW0gdG8gbWFrZSB0aGVtIG1vY2thYmxlIGR1cmluZyB1bml0LXRlc3RpbmcuCisKK2NoYXIqIGJ1ZnByaW50X2FwcF9kaXIoY2hhciogYnVmZiwgY2hhciogZW5kKSB7CisgICAgc3RkOjpzdHJpbmcgYXBwRGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKTsKKyAgICByZXR1cm4gYnVmcHJpbnQoYnVmZiwgZW5kLCAiJXMiLCBhcHBEaXIuY19zdHIoKSk7Cit9CisKK2NoYXIqIGJ1ZnByaW50X2F2ZF9ob21lX3BhdGgoY2hhciogYnVmZiwgY2hhciogZW5kKSB7CisgICAgcmV0dXJuIGJ1ZnByaW50KGJ1ZmYsIGVuZCwgQ29uZmlnRGlyczo6Z2V0QXZkUm9vdERpcmVjdG9yeSgpLmNfc3RyKCkpOworfQorCitjaGFyKiBidWZwcmludF9jb25maWdfcGF0aChjaGFyKiBidWZmLCBjaGFyKiBlbmQpIHsKKyAgICAvLyBOYW1lIG9mIHRoZSBBbmRyb2lkIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IHVuZGVyICRIT01FLgorICAgIHJldHVybiBidWZwcmludChidWZmLCBlbmQsICIlcyIsIENvbmZpZ0RpcnM6OmdldFVzZXJEaXJlY3RvcnkoKS5jX3N0cigpKTsKK30KKworY2hhciogYnVmcHJpbnRfY29uZmlnX2ZpbGUoY2hhciogYnVmZiwgY2hhciogZW5kLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgICBjaGFyKiBwID0gYnVmcHJpbnRfY29uZmlnX3BhdGgoYnVmZiwgZW5kKTsKKyAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiJWMlcyIsIFN5c3RlbTo6a0RpclNlcGFyYXRvciwgc3VmZml4KTsKKyAgICByZXR1cm4gcDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U5ODA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQXBwZW5kIHRoZSBhcHBsaWNhdGlvbidzIGRpcmVjdG9yeSB0byBhIGJvdW5kZWQgfGJ1ZmZlcnwgdGhhdCBzdG9wcyBhdAorLy8gfGJ1ZmZlbmR8LCBhbmQgcmV0dXJuIHRoZSBuZXcgcG9zaXRpb24uCitleHRlcm4gY2hhciogYnVmcHJpbnRfYXBwX2RpcihjaGFyKiBidWZmZXIsIGNoYXIqIGJ1ZmZlbmQpOworCisvLyBBcHBlbmQgdGhlIHJvb3QgcGF0aCBjb250YWluaW5nIGFsbCBBVkQgc3ViLWRpcmVjdG9yaWVzIHRvIGEgYm91bmRlZAorLy8gfGJ1ZmZlcnwgdGhhdCBzdG9wcyBhdCB8YnVmZmVuZHwgYW5kIHJldHVybiBuZXcgcG9zaXRpb24uIFRoZSBkZWZhdWx0CisvLyBsb2NhdGlvbiBjYW4gYmUgb3ZlcnJpZGVuIGJ5IGRlZmluaW5nIEFORFJPSURfQVZEX0hPTUUgaW4gdGhlIGVudmlyb25tZW50LgorZXh0ZXJuIGNoYXIqIGJ1ZnByaW50X2F2ZF9ob21lX3BhdGgoY2hhciogYnVmZmVyLCBjaGFyKiBidWZmZW5kKTsKKworLy8gQXBwZW5kIHRoZSB1c2VyLXNwZWNpZmljIGVtdWxhdG9yIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IHRvIGEgYm91bmRlZAorLy8gfGJ1ZmZlcnwgdGhhdCBzdG9wcyBhdCB8YnVmZmVuZHwgYW5kIHJldHVybiB0aGUgbmV3IHBvc2l0aW9uLiBUaGUgZGVmYXVsdAorLy8gbG9jYXRpb24gY2FuIGJlIG92ZXJyaWRlbiBieSBkZWZpbmluZyBBTkRST0lEX0VNVUxBVE9SX0hPTUUgaW4gdGhlCisvLyBlbnZpcm9ubWVudC4gT3RoZXJ3aXNlLCBhIHN1Yi1kaXJlY3Rvcnkgb2YgJEhPTUUgaXMgdXNlZCwgdW5sZXNzCisvLyBBTkRST0lEX1NES19IT01FIGlzIGFsc28gZGVmaW5lZC4KK2V4dGVybiBjaGFyKiBidWZwcmludF9jb25maWdfcGF0aChjaGFyKiBidWZmZXIsIGNoYXIqIGJ1ZmZlbmQpOworCisvLyBBcHBlbmQgdGhlIG5hbWUgb3IgYSBmaWxlIHxzdWZmaXh8IHJlbGF0aXZlIHRvIHRoZSBjb25maWd1cmF0aW9uCisvLyBkaXJlY3RvcnkgKHNlZSBidWZwcmludF9jb25maWdfcGF0aCkgdG8gdGhlIGJvdW5kZWQgfGJ1ZmZlcnwgdGhhdCBzdG9wcworLy8gYXQgfGJ1ZmZlbmR8LCBhbmQgcmV0dXJuIHRoZSBuZXcgcG9zaXRpb24uCitleHRlcm4gY2hhciogYnVmcHJpbnRfY29uZmlnX2ZpbGUoY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2J1ZnByaW50X2NvbmZpZ19kaXJzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGZiOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2J1ZnByaW50X2NvbmZpZ19kaXJzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2J1ZnByaW50X2NvbmZpZ19kaXJzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGVtcERpci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK1RFU1QoYnVmcHJpbnQsIEFwcGxpY2F0aW9uRGlyZWN0b3J5KSB7CisgICAgVGVzdFN5c3RlbSBzeXMoIi9iaW4iLCAzMik7CisgICAgY2hhciBidWZmZXJbMzJdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IGJ1ZmZlciArIHNpemVvZihidWZmZXIpOworICAgIHAgPSBidWZwcmludF9hcHBfZGlyKGJ1ZmZlciwgZW5kKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyICsgNCwgcCk7CisgICAgRVhQRUNUX1NUUkVRKCIvYmluIiwgYnVmZmVyKTsKK30KKworVEVTVChidWZwcmludCwgQXZkSG9tZVBhdGhEZWZhdWx0KSB7CisgICAgVGVzdFN5c3RlbSBzeXMoIi9iaW4iLCAzMik7CisgICAgY2hhciBidWZmZXJbMzJdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IGJ1ZmZlciArIHNpemVvZihidWZmZXIpOworICAgIHAgPSBidWZwcmludF9hdmRfaG9tZV9wYXRoKHAsIGVuZCk7CisgICAgRVhQRUNUX0VRKGJ1ZmZlciArIDE4LCBwKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBFWFBFQ1RfU1RSRVEoIi9ob21lXFwuYW5kcm9pZFxcYXZkIiwgYnVmZmVyKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKCIvaG9tZS8uYW5kcm9pZC9hdmQiLCBidWZmZXIpOworI2VuZGlmCit9CisKK1RFU1QoYnVmcHJpbnQsIEF2ZEhvbWVQYXRoV2l0aEFuZHJvaWRBdmRIb21lKSB7CisgICAgVGVzdFN5c3RlbSBzeXMoIi9iaW4iLCAzMik7CisgICAgc3lzLmVudlNldCgiQU5EUk9JRF9BVkRfSE9NRSIsICIvbXlob21lIik7CisgICAgY2hhciBidWZmZXJbMzJdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IGJ1ZmZlciArIHNpemVvZihidWZmZXIpOworICAgIHAgPSBidWZwcmludF9hdmRfaG9tZV9wYXRoKHAsIGVuZCk7CisgICAgRVhQRUNUX0VRKGJ1ZmZlciArIDcsIHApOworICAgIEVYUEVDVF9TVFJFUSgiL215aG9tZSIsIGJ1ZmZlcik7Cit9CisKK1RFU1QoYnVmcHJpbnQsIENvbmZpZ1BhdGhEZWZhdWx0KSB7CisgICAgVGVzdFN5c3RlbSBzeXMoIi9iaW4iLCAzMik7CisgICAgY2hhciBidWZmZXJbMzJdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IGJ1ZmZlciArIHNpemVvZihidWZmZXIpOworICAgIHAgPSBidWZwcmludF9jb25maWdfcGF0aChwLCBlbmQpOworICAgIEVYUEVDVF9FUShidWZmZXIgKyAxNCwgcCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKCIvaG9tZVxcLmFuZHJvaWQiLCBidWZmZXIpOworI2Vsc2UKKyAgICBFWFBFQ1RfU1RSRVEoIi9ob21lLy5hbmRyb2lkIiwgYnVmZmVyKTsKKyNlbmRpZgorfQorCitURVNUKGJ1ZnByaW50LCBDb25maWdQYXRoV2l0aEFuZHJvaWRFbXVsYXRvckhvbWUpIHsKKyAgICBUZXN0U3lzdGVtIHN5cygiL2JpbiIsIDMyKTsKKyAgICBzeXMuZW52U2V0KCJBTkRST0lEX0VNVUxBVE9SX0hPTUUiLCAiL215aG9tZSIpOworICAgIGNoYXIgYnVmZmVyWzMyXSwgKnAgPSBidWZmZXIsICplbmQgPSBidWZmZXIgKyBzaXplb2YoYnVmZmVyKTsKKyAgICBwID0gYnVmcHJpbnRfY29uZmlnX3BhdGgocCwgZW5kKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyICsgNywgcCk7CisgICAgRVhQRUNUX1NUUkVRKCIvbXlob21lIiwgYnVmZmVyKTsKK30KKworVEVTVChidWZwcmludCwgQ29uZmlnUGF0aFdpdGhBbmRyb2lkU2RrSG9tZSkgeworICAgIFRlc3RTeXN0ZW0gc3lzKCIvYmluIiwgMzIpOworICAgIHN5cy5lbnZTZXQoIkFORFJPSURfU0RLX0hPTUUiLCAiL3Nkay1ob21lIik7CisgICAgY2hhciBidWZmZXJbMzJdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IGJ1ZmZlciArIHNpemVvZihidWZmZXIpOworICAgIHAgPSBidWZwcmludF9jb25maWdfcGF0aChwLCBlbmQpOworICAgIEVYUEVDVF9FUShidWZmZXIgKyAxOCwgcCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKCIvc2RrLWhvbWVcXC5hbmRyb2lkIiwgYnVmZmVyKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKCIvc2RrLWhvbWUvLmFuZHJvaWQiLCBidWZmZXIpOworI2VuZGlmCit9CisKK1RFU1QoYnVmcHJpbnQsIENvbmZpZ0ZpbGUpIHsKKyAgICBUZXN0U3lzdGVtIHN5cygiL2JpbiIsIDMyKTsKKyAgICBjaGFyIGJ1ZmZlclszMl0sICpwID0gYnVmZmVyLCAqZW5kID0gYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgcCA9IGJ1ZnByaW50X2NvbmZpZ19maWxlKHAsIGVuZCwgImZpbGUiKTsKKyAgICBFWFBFQ1RfRVEoYnVmZmVyICsgMTksIHApOworI2lmZGVmIF9XSU4zMgorICAgIEVYUEVDVF9TVFJFUSgiL2hvbWVcXC5hbmRyb2lkXFxmaWxlIiwgYnVmZmVyKTsKKyNlbHNlCisgICAgRVhQRUNUX1NUUkVRKCIvaG9tZS8uYW5kcm9pZC9maWxlIiwgYnVmZmVyKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0FkYkludGVyZmFjZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNWI1YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0FkYkludGVyZmFjZS5jcHAKQEAgLTAsMCArMSwyNTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9VdWlkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCitjbGFzcyBBZGJJbnRlcmZhY2VJbXBsIGZpbmFsIDogcHVibGljIEFkYkludGVyZmFjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQWRiSW50ZXJmYWNlSW1wbChhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3Blcik7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaXMgdGhlIEFEQiB2ZXJzaW9uIGlzIGZyZXNoIGVub3VnaC4KKyAgICBib29sIGlzQWRiVmVyc2lvbkN1cnJlbnQoKSBjb25zdCBvdmVycmlkZSBmaW5hbCB7IHJldHVybiBtQWRiVmVyc2lvbkN1cnJlbnQ7IH0KKworICAgIC8vIFNldHVwIGEgY3VzdG9tIGFkYiBwYXRoLgorICAgIHZvaWQgc2V0Q3VzdG9tQWRiUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgb3ZlcnJpZGUgZmluYWwgeworICAgICAgICBtQ3VzdG9tQWRiUGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBwYXRoIHRvIGFkYgorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXRlY3RlZEFkYlBhdGgoKSBjb25zdCBvdmVycmlkZSBmaW5hbCB7CisgICAgICAgIHJldHVybiBtQXV0b0FkYlBhdGg7CisgICAgfQorCisgICAgLy8gU2V0dXAgdGhlIHBvcnQgdGhpcyBpbnRlcmZhY2UgaXMgY29ubmVjdGVkIHRvCisgICAgdmlydHVhbCB2b2lkIHNldFNlcmlhbE51bWJlclBvcnQoaW50IHBvcnQpIG92ZXJyaWRlIGZpbmFsIHsKKyAgICAgICAgbVNlcmlhbFN0cmluZyA9IHN0ZDo6c3RyaW5nKCJlbXVsYXRvci0iKSArIHN0ZDo6dG9fc3RyaW5nKHBvcnQpOworICAgIH0KKworICAgIC8vIFJ1bnMgYW4gYWRiIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkuCisgICAgLy8gfGFyZ3N8IC0gdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIGFkYiwgaS5lLiAic2hlbGwgZHVtcHN5cyBiYXR0ZXJ5IgorICAgIC8vIHxyZXN1bHRfY2FsbGJhY2t8IC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIHRoZQorICAgIC8vIGNhbGxpbmcKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRocmVhZCBhZnRlciB0aGUgY29tbWFuZCBjb21wbGV0ZXMuCisgICAgLy8gfHRpbWVvdXRfbXN8IC0gaG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUsIGluCisgICAgLy8gbWlsbGlzZWNvbmRzLgorICAgIC8vIHx3YW50X291dHB1dHwgLSBpZiBzZXQgdG8gdHJ1ZSwgdGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgd2lsbAorICAgIC8vIGNvbnRhaW4gdGhlCisgICAgLy8gICAgICAgICAgICAgICAgIG91dHB1dCBvZiB0aGUgY29tbWFuZC4KKyAgICBBZGJDb21tYW5kUHRyIHJ1bkFkYkNvbW1hbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0Jik+CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9jYWxsYmFjaywKKyAgICAgICAgICAgIGJhc2U6OlN5c3RlbTo6RHVyYXRpb24gdGltZW91dF9tcywKKyAgICAgICAgICAgIGJvb2wgd2FudF9vdXRwdXQgPSB0cnVlKSBvdmVycmlkZSBmaW5hbDsKKworcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXIqIG1Mb29wZXI7CisgICAgc3RkOjpzdHJpbmcgbUF1dG9BZGJQYXRoOworICAgIHN0ZDo6c3RyaW5nIG1DdXN0b21BZGJQYXRoOworICAgIHN0ZDo6c3RyaW5nIG1TZXJpYWxTdHJpbmc7CisgICAgYm9vbCBtQWRiVmVyc2lvbkN1cnJlbnQ7Cit9OworCitzdGQ6OnVuaXF1ZV9wdHI8QWRiSW50ZXJmYWNlPiBBZGJJbnRlcmZhY2U6OmNyZWF0ZShhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlcikgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QWRiSW50ZXJmYWNlPntuZXcgQWRiSW50ZXJmYWNlSW1wbChsb29wZXIpfTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uLCBjaGVja3MgaWYgdGhlIHZlcnNpb24gb2YgYWRiIGluIHRoZSBnaXZlbiBTREsgaXMKKy8vIGZyZXNoIGVub3VnaC4KK3N0YXRpYyBib29sIGNoZWNrQWRiVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgc2RrX3Jvb3RfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGJfcGF0aCkgeworICAgIHN0YXRpYyBjb25zdCBpbnQga01pbkFkYlZlcnNpb25NYWpvciA9IDIzOworICAgIHN0YXRpYyBjb25zdCBpbnQga01pbkFkYlZlcnNpb25NaW5vciA9IDE7CisKKyAgICBpZiAoc2RrX3Jvb3RfZGlyZWN0b3J5LmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cGF0aENhbkV4ZWMoYWRiX3BhdGgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmlsZSBhdCAkKEFORFJPSURfU0RLX1JPT1QpL3BsYXRmb3JtLXRvb2xzL3NvdXJjZS5wcm9wZXJ0aWVzIHRlbGxzCisgICAgLy8gd2hhdCB2ZXJzaW9uIHRoZSBBREIgZXhlY3V0YWJsZSBpcy4gRmluZCB0aGF0IGZpbGUuCisgICAgc3RkOjpzdHJpbmcgcHJvcGVydGllc19wYXRoID0gUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgc2RrX3Jvb3RfZGlyZWN0b3J5LCAicGxhdGZvcm0tdG9vbHMiLCAic291cmNlLnByb3BlcnRpZXMiKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gcHJvcGVydGllc19maWxlKHByb3BlcnRpZXNfcGF0aC5jX3N0cigpKTsKKyAgICBpZiAocHJvcGVydGllc19maWxlKSB7CisgICAgICAgIC8vIEZpbmQgdGhlIGxpbmUgY29udGFpbmluZyAiUGtnLlJldmlzaW9uIi4KKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShwcm9wZXJ0aWVzX2ZpbGUsIGxpbmUpKSB7CisgICAgICAgICAgICBpbnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vciA9IDA7CisgICAgICAgICAgICBpZiAoc3NjYW5mKGxpbmUuY19zdHIoKSwgIiBQa2cuUmV2aXNpb24gPSAlZC4lZCIsICZ2ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAmdmVyc2lvbl9taW5vcikgPj0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX21ham9yID4ga01pbkFkYlZlcnNpb25NYWpvciB8fAorICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbl9tYWpvciA9PSBrTWluQWRiVmVyc2lvbk1ham9yICYmCisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX21pbm9yID49IGtNaW5BZGJWZXJzaW9uTWlub3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIGZpbGUgaXMgbWlzc2luZywgYXNzdW1lIHRoZSB0b29scyBkaXJlY3RvcnkgaXMgYnJva2VuIGluIHNvbWUKKyAgICAvLyB3YXksIGFuZCB1cGRhdGluZyBzaG91bGQgZml4IHRoZSBwcm9ibGVtLgorICAgIHJldHVybiBmYWxzZTsKK30KKworQWRiSW50ZXJmYWNlSW1wbDo6QWRiSW50ZXJmYWNlSW1wbChhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlcikKKyAgICA6IG1Mb29wZXIobG9vcGVyKSwgbUFkYlZlcnNpb25DdXJyZW50KGZhbHNlKSB7CisgICAgLy8gRmlyc3QgdHJ5IGZpbmRpbmcgQURCIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICBhdXRvIHNka19yb290X2J5X2VudiA9IGFuZHJvaWQ6OkNvbmZpZ0RpcnM6OmdldFNka1Jvb3REaXJlY3RvcnlCeUVudigpOworICAgIGlmICghc2RrX3Jvb3RfYnlfZW52LmVtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgQU5EUk9JRF9TREtfUk9PVCBpcyBkZWZpbmVkLCB0aGUgdXNlciBtb3N0IGxpa2VseSB3YW50ZWQgdG8gdXNlCisgICAgICAgIC8vIHRoYXQgQURCLiBTdG9yZSBpdCBmb3IgbGF0ZXIgLSBpZiB0aGUgc2Vjb25kIHBvdGVudGlhbCBBREIgcGF0aAorICAgICAgICAvLyBhbHNvIGZhaWxzLCB3ZSdsbCB3YXJuIHRoZSB1c2VyIGFib3V0IHRoaXMgb25lLgorICAgICAgICBhdXRvIGFkYl9wYXRoID0gUGF0aFV0aWxzOjpqb2luKHNka19yb290X2J5X2VudiwgInBsYXRmb3JtLXRvb2xzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoImFkYiIpKTsKKyAgICAgICAgaWYgKGNoZWNrQWRiVmVyc2lvbihzZGtfcm9vdF9ieV9lbnYsIGFkYl9wYXRoKSkgeworICAgICAgICAgICAgbUF1dG9BZGJQYXRoID0gYWRiX3BhdGg7CisgICAgICAgICAgICBtQWRiVmVyc2lvbkN1cnJlbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgdGhlIGZpcnN0IHBhdGggd2FzIG5vbi1leGlzdGVudCBvciBhIGJhZCB2ZXJzaW9uLCB0cnkgdG8gaW5mZXIgdGhlCisgICAgLy8gcGF0aCBiYXNlZCBvbiB0aGUgZW11bGF0b3IgZXhlY3V0YWJsZSBsb2NhdGlvbi4KKyAgICBhdXRvIHNka19yb290X2J5X3BhdGggPSBhbmRyb2lkOjpDb25maWdEaXJzOjpnZXRTZGtSb290RGlyZWN0b3J5QnlQYXRoKCk7CisgICAgaWYgKHNka19yb290X2J5X3BhdGggIT0gc2RrX3Jvb3RfYnlfZW52ICYmICFzZGtfcm9vdF9ieV9wYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBhZGJfcGF0aCA9IFBhdGhVdGlsczo6am9pbihzZGtfcm9vdF9ieV9wYXRoLCAicGxhdGZvcm0tdG9vbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6dG9FeGVjdXRhYmxlTmFtZSgiYWRiIikpOworICAgICAgICBpZiAoY2hlY2tBZGJWZXJzaW9uKHNka19yb290X2J5X3BhdGgsIGFkYl9wYXRoKSkgeworICAgICAgICAgICAgbUF1dG9BZGJQYXRoID0gYWRiX3BhdGg7CisgICAgICAgICAgICBtQWRiVmVyc2lvbkN1cnJlbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyh6eXkpOiBjaGVjayBpZiB0aGVyZSdzIGFuIGFkYiBiaW5hcnkgb24gJVBBVEglIGFuZCB1c2UgdGhhdCBhcyBhCisgICAgLy8gIGxhc3QgbGluZSBvZiBkZWZlbnNlLgorCisgICAgLy8gSWYgbm8gQURCIGhhcyBiZWVuIGZvdW5kIGF0IHRoaXMgcG9pbnQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCB3YXJuIHRoZQorICAgIC8vIHVzZXIgYW5kIGRpcmVjdCB0aGVtIHRvIHRoZSBjdXN0b20gYWRiIHBhdGggc2V0dGluZy4KK30KKworQWRiQ29tbWFuZFB0ciBBZGJJbnRlcmZhY2VJbXBsOjpydW5BZGJDb21tYW5kKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBPcHRpb25hbEFkYkNvbW1hbmRSZXN1bHQmKT4gcmVzdWx0X2NhbGxiYWNrLAorICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXRfbXMsCisgICAgICAgIGJvb2wgd2FudF9vdXRwdXQpIHsKKyAgICBhdXRvIGNvbW1hbmQgPSBzdGQ6OnNoYXJlZF9wdHI8QWRiQ29tbWFuZD4obmV3IEFkYkNvbW1hbmQoCisgICAgICAgICAgICBtTG9vcGVyLCBtQ3VzdG9tQWRiUGF0aC5lbXB0eSgpID8gbUF1dG9BZGJQYXRoIDogbUN1c3RvbUFkYlBhdGgsCisgICAgICAgICAgICBtU2VyaWFsU3RyaW5nLCBhcmdzLCB3YW50X291dHB1dCwgdGltZW91dF9tcywgcmVzdWx0X2NhbGxiYWNrKSk7CisgICAgY29tbWFuZC0+c3RhcnQoKTsKKyAgICByZXR1cm4gY29tbWFuZDsKK30KKworQWRiQ29tbWFuZDo6QWRiQ29tbWFuZChhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFkYl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhbnRfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIEFkYkNvbW1hbmQ6OlJlc3VsdENhbGxiYWNrIGNhbGxiYWNrKQorICAgIDogbUxvb3Blcihsb29wZXIpLAorICAgICAgbVJlc3VsdENhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1PdXRwdXRGaWxlUGF0aChQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPmdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImFkYmNvbW1hbmQiKS5hcHBlbmQoVXVpZDo6Z2VuZXJhdGUoKS50b1N0cmluZygpKSkpLAorICAgICAgbVdhbnRPdXRwdXQod2FudF9vdXRwdXQpLAorICAgICAgbVRpbWVvdXQodGltZW91dCksCisgICAgICBtRmluaXNoZWQoZmFsc2UpIHsKKyAgICBtQ29tbWFuZC5wdXNoX2JhY2soYWRiX3BhdGgpOworCisgICAgLy8gVE9ETzogd2hlbiBydW4gaGVhZGxlc3MsIHRoZSBzZXJpYWwgc3RyaW5nIHdvbid0IGJlIHByb3Blcmx5CisgICAgLy8gaW5pdGlhbGl6ZWQsIHNvIG1ha2UgYSBiZXN0IGF0dGVtcHQgYnkgdXNpbmcgLWUuIFRoaXMgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAvLyB3aGVuIHRoZSBoZWFkbGVzcyBlbXVsYXRvciBpcyBnaXZlbiBhbiBBZGJJbnRlcmZhY2UgcmVmZXJlbmNlLgorICAgIGlmIChzZXJpYWxfc3RyaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgbUNvbW1hbmQucHVzaF9iYWNrKCItZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db21tYW5kLnB1c2hfYmFjaygiLXMiKTsKKyAgICAgICAgbUNvbW1hbmQucHVzaF9iYWNrKHNlcmlhbF9zdHJpbmcpOworICAgIH0KKworICAgIG1Db21tYW5kLmluc2VydChtQ29tbWFuZC5lbmQoKSwgY29tbWFuZC5iZWdpbigpLCBjb21tYW5kLmVuZCgpKTsKK30KKwordm9pZCBBZGJDb21tYW5kOjpzdGFydChpbnQgY2hlY2tUaW1lb3V0TXMpIHsKKyAgICBpZiAoIW1UYXNrICYmICFtRmluaXNoZWQpIHsKKyAgICAgICAgYXV0byBzaGFyZWQgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgICAgIG1UYXNrLnJlc2V0KG5ldyBQYXJhbGxlbFRhc2s8T3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0PigKKyAgICAgICAgICAgICAgICBtTG9vcGVyLAorICAgICAgICAgICAgICAgIFtzaGFyZWRdKE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCogcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHNoYXJlZC0+dGFza0Z1bmN0aW9uKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBbc2hhcmVkXShjb25zdCBPcHRpb25hbEFkYkNvbW1hbmRSZXN1bHQmIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBzaGFyZWQtPnRhc2tEb25lRnVuY3Rpb24ocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGNoZWNrVGltZW91dE1zKSk7CisgICAgICAgIG1UYXNrLT5zdGFydCgpOworICAgIH0KK30KKwordm9pZCBBZGJDb21tYW5kOjp0YXNrRG9uZUZ1bmN0aW9uKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYgcmVzdWx0KSB7CisgICAgaWYgKCFtQ2FuY2VsbGVkKSB7CisgICAgICAgIG1SZXN1bHRDYWxsYmFjayhyZXN1bHQpOworICAgIH0KKyAgICBtRmluaXNoZWQgPSB0cnVlOworICAgIC8vIFRoaXMgbWF5IGludmFsaWRhdGUgdGhpcyBvYmplY3QgYW5kIGNsZWFuIGl0IHVwLgorICAgIC8vIERPIE5PVCByZWZlcmVuY2UgYW55IGludGVybmFsIHN0YXRlIGZyb20gdGhpcyBjbGFzcyBhZnRlciB0aGlzCisgICAgLy8gcG9pbnQuCisgICAgbVRhc2sucmVzZXQoKTsKK30KKwordm9pZCBBZGJDb21tYW5kOjp0YXNrRnVuY3Rpb24oT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0KiByZXN1bHQpIHsKKyAgICBpZiAobUNvbW1hbmQuZW1wdHkoKSB8fCBtQ29tbWFuZC5mcm9udCgpLmVtcHR5KCkpIHsKKyAgICAgICAgKnJlc3VsdCA9IHt9OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUnVuT3B0aW9ucyBvdXRwdXRfZmxhZyA9IG1XYW50T3V0cHV0ID8gU3lzdGVtOjpSdW5PcHRpb25zOjpEdW1wT3V0cHV0VG9GaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3lzdGVtOjpSdW5PcHRpb25zOjpIaWRlQWxsT3V0cHV0OworICAgIFJ1bk9wdGlvbnMgcnVuX2ZsYWdzID0gU3lzdGVtOjpSdW5PcHRpb25zOjpXYWl0Rm9yQ29tcGxldGlvbiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OlJ1bk9wdGlvbnM6OlRlcm1pbmF0ZU9uVGltZW91dCB8IG91dHB1dF9mbGFnOworICAgIFN5c3RlbTo6UGlkIHBpZDsKKyAgICBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OlByb2Nlc3NFeGl0Q29kZSBleGl0X2NvZGU7CisKKyAgICBib29sIGNvbW1hbmRfcmFuID0gU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZCgKKyAgICAgICAgICAgIG1Db21tYW5kLCBydW5fZmxhZ3MsIG1UaW1lb3V0LCAmZXhpdF9jb2RlLCAmcGlkLCBtT3V0cHV0RmlsZVBhdGgpOworCisgICAgaWYgKGNvbW1hbmRfcmFuKSB7CisgICAgICAgICpyZXN1bHQgPSBhbmRyb2lkOjpiYXNlOjptYWtlT3B0aW9uYWw8QWRiQ29tbWFuZFJlc3VsdD4oCisgICAgICAgICAgICAgICAge2V4aXRfY29kZSwKKyAgICAgICAgICAgICAgICAgbVdhbnRPdXRwdXQgPyBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjppZnN0cmVhbT4obmV3IHN0ZDo6aWZzdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RmlsZVBhdGguY19zdHIoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RkOjp1bmlxdWVfcHRyPHN0ZDo6aWZzdHJlYW0+KCl9KTsKKyAgICB9Cit9CisKK30KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BZGJJbnRlcmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BZGJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg1Nzc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0FkYkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9QYXJhbGxlbFRhc2suaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKK2NsYXNzIEFkYkNvbW1hbmQ7Cit1c2luZyBBZGJDb21tYW5kUHRyID0gc3RkOjpzaGFyZWRfcHRyPEFkYkNvbW1hbmQ+OworCisvLyBFbmNhcHN1bGF0ZXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGFuIEFEQiBjb21tYW5kLgorc3RydWN0IEFkYkNvbW1hbmRSZXN1bHQgeworICAgIC8vIEV4aXQgY29kZSByZXR1cm5lZCBieSBBREIuCisgICAgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdF9jb2RlOworCisgICAgLy8gVGhlIGNvbW1hbmQncyBvdXRwdXQuCisgICAgLy8gTk9URTogd2UncmUgdXNpbmcgdW5pcXVlX3B0ciBoZXJlIGJlY2F1c2UgdGhlcmUncyBhIGJ1ZyBpbiBnKysgNCBkdWUgdG8KKyAgICAvLyB3aGljaCBmaWxlIHN0cmVhbXMgYXJlIHVubW92YWJsZS4KKyAgICBtdXRhYmxlIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6Omlmc3RyZWFtPiBvdXRwdXQ7Cit9OwordXNpbmcgT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0ID0gYW5kcm9pZDo6YmFzZTo6T3B0aW9uYWw8QWRiQ29tbWFuZFJlc3VsdD47CisKKy8vIEEgdXRpbGl0eSBpbnRlcmZhY2UgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGxvY2F0ZSB0aGUgQURCIGJpbmFyeSBhbmQKKy8vIGFzeW5jaHJvbm91c2x5IHJ1biBBREIgY29tbWFuZHMuCitjbGFzcyBBZGJJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8vIFJldHVybnMgdHJ1ZSBpcyB0aGUgQURCIHZlcnNpb24gaXMgZnJlc2ggZW5vdWdoLgorICAgIHZpcnR1YWwgYm9vbCBpc0FkYlZlcnNpb25DdXJyZW50KCkgY29uc3QgPSAwOworCisgICAgLy8gU2V0dXAgYSBjdXN0b20gYWRiIHBhdGguCisgICAgdmlydHVhbCB2b2lkIHNldEN1c3RvbUFkYlBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgcGF0aCB0byBhZGIKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXRlY3RlZEFkYlBhdGgoKSBjb25zdCA9IDA7CisKKyAgICAvLyBTZXR1cCB0aGUgcG9ydCB0aGlzIGludGVyZmFjZSBpcyBjb25uZWN0ZWQgdG8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2VyaWFsTnVtYmVyUG9ydChpbnQgcG9ydCkgPSAwOworCisgICAgLy8gUnVucyBhbiBhZGIgY29tbWFuZCBhc3luY2hyb25vdXNseS4KKyAgICAvLyB8YXJnc3wgLSB0aGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gYWRiLCBpLmUuICJzaGVsbCBkdW1wc3lzIGJhdHRlcnkiCisgICAgLy8gfHJlc3VsdF9jYWxsYmFja3wgLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGludm9rZWQgb24gdGhlCisgICAgLy8gY2FsbGluZworICAgIC8vICAgICAgICAgICAgICAgICAgICAgdGhyZWFkIGFmdGVyIHRoZSBjb21tYW5kIGNvbXBsZXRlcy4KKyAgICAvLyB8dGltZW91dF9tc3wgLSBob3cgbG9uZyB0byB3YWl0IGZvciB0aGUgY29tbWFuZCB0byBjb21wbGV0ZSwgaW4KKyAgICAvLyBtaWxsaXNlY29uZHMuCisgICAgLy8gfHdhbnRfb3V0cHV0fCAtIGlmIHNldCB0byB0cnVlLCB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsCisgICAgLy8gY29udGFpbiB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICAgb3V0cHV0IG9mIHRoZSBjb21tYW5kLgorICAgIHZpcnR1YWwgQWRiQ29tbWFuZFB0ciBydW5BZGJDb21tYW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYpPgorICAgICAgICAgICAgICAgICAgICByZXN1bHRfY2FsbGJhY2ssCisgICAgICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXRfbXMsCisgICAgICAgICAgICBib29sIHdhbnRfb3V0cHV0ID0gdHJ1ZSkgPSAwOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgQWRiSW50ZXJmYWNlLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWRiSW50ZXJmYWNlPiBjcmVhdGUoYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXIpOworfTsKKworY2xhc3MgQWRiSW50ZXJmYWNlSW1wbDsKK2NsYXNzIFRlc3RBZGJJbnRlcmZhY2U7CisKKy8vIFJlcHJlc2VudGF0aW9uIG9mIGFuIGFzeW5jaHJvbm91c2x5IHJ1bm5pbmcgQURCIGNvbW1hbmQuCisvLyBUaGVzZSBzaG91bGRuJ3QgYmUgY3JlYXRlZCBkaXJlY3RseSwgdXNlIEFkYkludGVyZmFjZTo6cnVuQWRiQ29tbWFuZC4KK2NsYXNzIEFkYkNvbW1hbmQgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBZGJDb21tYW5kPiB7CisgICAgZnJpZW5kIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlSW1wbDsKKyAgICBmcmllbmQgYW5kcm9pZDo6ZW11bGF0aW9uOjpUZXN0QWRiSW50ZXJmYWNlOworCitwdWJsaWM6CisgICAgdXNpbmcgUmVzdWx0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0Jik+OworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb21tYW5kIGlzIGN1cnJlbnRseSBpbiB0aGUgcHJvY2VzcyBvZiBleGVjdXRpb24uCisgICAgYm9vbCBpbkZsaWdodCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KG1UYXNrKTsgfQorCisgICAgLy8gQ2FuY2VscyB0aGUgcnVubmluZyBjb21tYW5kIChoYXMgbm8gZWZmZWN0IGlmIHRoZSBjb21tYW5kIGlzbid0IHJ1bm5pbmcpLgorICAgIHZvaWQgY2FuY2VsKCkgeyBtQ2FuY2VsbGVkID0gdHJ1ZTsgfQorCitwcml2YXRlOgorICAgIEFkYkNvbW1hbmQoYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYWRiX3BhdGgsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsX3N0cmluZywKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29tbWFuZCwKKyAgICAgICAgICAgICAgIGJvb2wgd2FudF9vdXRwdXQsCisgICAgICAgICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXQsCisgICAgICAgICAgICAgICBSZXN1bHRDYWxsYmFjayBjYWxsYmFjayk7CisgICAgdm9pZCBzdGFydChpbnQgY2hlY2tUaW1lb3V0TXMgPSAxMDAwKTsKKyAgICB2b2lkIHRhc2tGdW5jdGlvbihPcHRpb25hbEFkYkNvbW1hbmRSZXN1bHQqIHJlc3VsdCk7CisgICAgdm9pZCB0YXNrRG9uZUZ1bmN0aW9uKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYgcmVzdWx0KTsKKworICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3BlciogbUxvb3BlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YmFzZTo6UGFyYWxsZWxUYXNrPE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdD4+CisgICAgICAgICAgICBtVGFzazsKKyAgICBSZXN1bHRDYWxsYmFjayBtUmVzdWx0Q2FsbGJhY2s7CisgICAgYm9vbCBtQ2FuY2VsbGVkID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgbU91dHB1dEZpbGVQYXRoOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtQ29tbWFuZDsKKyAgICBib29sIG1XYW50T3V0cHV0OworICAgIGludCBtVGltZW91dDsKKyAgICBib29sIG1GaW5pc2hlZDsKK307Cit9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BZGJJbnRlcmZhY2VfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZmI2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BZGJJbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9QYXRoVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhdGhVdGlsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0VGVtcERpcjsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlOworCitURVNUKEFkYkludGVyZmFjZSwgY3JlYXRlKSB7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIEFkYkludGVyZmFjZTo6Y3JlYXRlKG51bGxwdHIpLmdldCgpKTsKK30KKworVEVTVChBZGJJbnRlcmZhY2UsIGZyZXNoQWRiVmVyc2lvbikgeworICAgIFRlc3RTeXN0ZW0gc3lzdGVtKCIvcHJvZ2RpciIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICIvYXBwZGlyIik7CisgICAgVGVzdFRlbXBEaXIqIGRpciA9IHN5c3RlbS5nZXRUZW1wUm9vdCgpOworICAgIEFTU0VSVF9UUlVFKGRpci0+bWFrZVN1YkRpcigiU2RrIikpOworICAgIEFTU0VSVF9UUlVFKGRpci0+bWFrZVN1YkRpcigiU2RrL3BsYXRmb3JtLXRvb2xzIikpOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgZGlyLT5tYWtlU3ViRmlsZShQYXRoVXRpbHM6OmpvaW4oIlNkayIsICJwbGF0Zm9ybS10b29scyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoImFkYiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGUgPQorICAgICAgICAgICAgZGlyLT5tYWtlU3ViUGF0aCgiU2RrL3BsYXRmb3JtLXRvb2xzL3NvdXJjZS5wcm9wZXJ0aWVzIik7CisgICAgc3RkOjpvZnN0cmVhbSBvZnMob3V0cHV0X2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKG9mcy5pc19vcGVuKCkpOworICAgIG9mcyA8PCAiIyMjIENvbW1lbnRcbkFyY2hpdmUuSG9zdE9zPWxpbnV4XG5Qa2cuTGljZW5zZT1cXG5Ob2xpZW5zZVxuIgorICAgICAgICAgICAiUGtnLkxpY2Vuc2VSZWY9YW5kcm9pZC1zZGstbGljZW5zZVxuUGtnLlJldmlzaW9uPTIzLjEuMFxuIgorICAgICAgICAgICAiUGtnLlNvdXJjZVVybD1odHRwc1xcOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlcG9zaXRvcnkvIgorICAgICAgICAgICAicmVwb3NpdG9yeS0xMi54bWxcbiI7CisgICAgb2ZzLmNsb3NlKCk7CisgICAgc3RkOjpzdHJpbmcgc2RrUm9vdCA9IFBhdGhVdGlsczo6am9pbihkaXItPnBhdGgoKSwgIlNkayIpOworICAgIHN5c3RlbS5lbnZTZXQoIkFORFJPSURfU0RLX1JPT1QiLCBzZGtSb290KTsKKyAgICBhdXRvIGFkYiA9IEFkYkludGVyZmFjZTo6Y3JlYXRlKG51bGxwdHIpOworICAgIEVYUEVDVF9UUlVFKGFkYi0+aXNBZGJWZXJzaW9uQ3VycmVudCgpKTsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZEFkYlBhdGggPSBQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICBzZGtSb290LCAicGxhdGZvcm0tdG9vbHMiLCBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoImFkYiIpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRBZGJQYXRoLCBhZGItPmRldGVjdGVkQWRiUGF0aCgpKTsKK30KKworVEVTVChBZGJJbnRlcmZhY2UsIGZyZXNoQWRiVmVyc2lvbk5vTWlub3IpIHsKKyAgICBUZXN0U3lzdGVtIHN5c3RlbSgiL3Byb2dkaXIiLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcywgIi9ob21lZGlyIiwKKyAgICAgICAgICAgICAgICAgICAgICAiL2FwcGRpciIpOworICAgIFRlc3RUZW1wRGlyKiBkaXIgPSBzeXN0ZW0uZ2V0VGVtcFJvb3QoKTsKKyAgICBBU1NFUlRfVFJVRShkaXItPm1ha2VTdWJEaXIoIlNkayIpKTsKKyAgICBBU1NFUlRfVFJVRShkaXItPm1ha2VTdWJEaXIoIlNkay9wbGF0Zm9ybS10b29scyIpKTsKKyAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgIGRpci0+bWFrZVN1YkZpbGUoUGF0aFV0aWxzOjpqb2luKCJTZGsiLCAicGxhdGZvcm0tdG9vbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKCJhZGIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSkpOworICAgIHN0ZDo6c3RyaW5nIG91dHB1dF9maWxlID0KKyAgICAgICAgICAgIGRpci0+bWFrZVN1YlBhdGgoIlNkay9wbGF0Zm9ybS10b29scy9zb3VyY2UucHJvcGVydGllcyIpOworICAgIHN0ZDo6b2ZzdHJlYW0gb2ZzKG91dHB1dF9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShvZnMuaXNfb3BlbigpKTsKKyAgICBvZnMgPDwgIiMjIyBDb21tZW50XG5BcmNoaXZlLkhvc3RPcz1saW51eFxuUGtnLkxpY2Vuc2U9XFxuTm9saWVuc2VcbiIKKyAgICAgICAgICAgIlBrZy5MaWNlbnNlUmVmPWFuZHJvaWQtc2RrLWxpY2Vuc2VcblBrZy5SZXZpc2lvbj0yNCByYzFcbiIKKyAgICAgICAgICAgIlBrZy5Tb3VyY2VVcmw9aHR0cHNcXDovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5LyIKKyAgICAgICAgICAgInJlcG9zaXRvcnktMTIueG1sXG4iOworICAgIG9mcy5jbG9zZSgpOworICAgIHN0ZDo6c3RyaW5nIHNka1Jvb3QgPSBQYXRoVXRpbHM6OmpvaW4oZGlyLT5wYXRoKCksICJTZGsiKTsKKyAgICBzeXN0ZW0uZW52U2V0KCJBTkRST0lEX1NES19ST09UIiwgc2RrUm9vdCk7CisgICAgYXV0byBhZGIgPSBBZGJJbnRlcmZhY2U6OmNyZWF0ZShudWxscHRyKTsKKyAgICBFWFBFQ1RfVFJVRShhZGItPmlzQWRiVmVyc2lvbkN1cnJlbnQoKSk7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRBZGJQYXRoID0gUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgc2RrUm9vdCwgInBsYXRmb3JtLXRvb2xzIiwgUGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKCJhZGIiKSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkQWRiUGF0aCwgYWRiLT5kZXRlY3RlZEFkYlBhdGgoKSk7Cit9CisKK1RFU1QoQWRiSW50ZXJmYWNlLCBzdGFsZUFkYk1pbm9yVmVyc2lvbikgeworICAgIFRlc3RTeXN0ZW0gc3lzdGVtKCIvcHJvZ2RpciIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICIvYXBwZGlyIik7CisgICAgVGVzdFRlbXBEaXIqIGRpciA9IHN5c3RlbS5nZXRUZW1wUm9vdCgpOworICAgIEFTU0VSVF9UUlVFKGRpci0+bWFrZVN1YkRpcigiU2RrIikpOworICAgIEFTU0VSVF9UUlVFKGRpci0+bWFrZVN1YkRpcigiU2RrL3BsYXRmb3JtLXRvb2xzIikpOworICAgIEFTU0VSVF9UUlVFKAorICAgICAgICAgICAgZGlyLT5tYWtlU3ViRmlsZShQYXRoVXRpbHM6OmpvaW4oIlNkayIsICJwbGF0Zm9ybS10b29scyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OnRvRXhlY3V0YWJsZU5hbWUoImFkYiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKSk7CisgICAgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGUgPQorICAgICAgICAgICAgZGlyLT5tYWtlU3ViUGF0aCgiU2RrL3BsYXRmb3JtLXRvb2xzL3NvdXJjZS5wcm9wZXJ0aWVzIik7CisgICAgc3RkOjpvZnN0cmVhbSBvZnMob3V0cHV0X2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKG9mcy5pc19vcGVuKCkpOworICAgIG9mcyA8PCAiIyMjIENvbW1lbnRcbkFyY2hpdmUuSG9zdE9zPWxpbnV4XG5Qa2cuTGljZW5zZT1cXG5Ob2xpZW5zZVxuIgorICAgICAgICAgICAiUGtnLkxpY2Vuc2VSZWY9YW5kcm9pZC1zZGstbGljZW5zZVxuUGtnLlJldmlzaW9uPTIzLjAuMFxuIgorICAgICAgICAgICAiUGtnLlNvdXJjZVVybD1odHRwc1xcOi8vZGwuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlcG9zaXRvcnkvIgorICAgICAgICAgICAicmVwb3NpdG9yeS0xMi54bWxcbiI7CisgICAgb2ZzLmNsb3NlKCk7CisgICAgc3RkOjpzdHJpbmcgc2RrUm9vdCA9IFBhdGhVdGlsczo6am9pbihkaXItPnBhdGgoKSwgIlNkayIpOworICAgIHN5c3RlbS5lbnZTZXQoIkFORFJPSURfU0RLX1JPT1QiLCBzZGtSb290KTsKKyAgICBhdXRvIGFkYiA9IEFkYkludGVyZmFjZTo6Y3JlYXRlKG51bGxwdHIpOworICAgIEVYUEVDVF9GQUxTRShhZGItPmlzQWRiVmVyc2lvbkN1cnJlbnQoKSk7CisgICAgRVhQRUNUX0VRKCIiLCBhZGItPmRldGVjdGVkQWRiUGF0aCgpKTsKK30KKworVEVTVChBZGJJbnRlcmZhY2UsIHN0YWxlQWRiTWFqb3JWZXJzaW9uKSB7CisgICAgVGVzdFN5c3RlbSBzeXN0ZW0oIi9wcm9nZGlyIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MsICIvaG9tZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgIi9hcHBkaXIiKTsKKyAgICBUZXN0VGVtcERpciogZGlyID0gc3lzdGVtLmdldFRlbXBSb290KCk7CisgICAgQVNTRVJUX1RSVUUoZGlyLT5tYWtlU3ViRGlyKCJTZGsiKSk7CisgICAgQVNTRVJUX1RSVUUoZGlyLT5tYWtlU3ViRGlyKCJTZGsvcGxhdGZvcm0tdG9vbHMiKSk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICBkaXItPm1ha2VTdWJGaWxlKFBhdGhVdGlsczo6am9pbigiU2RrIiwgInBsYXRmb3JtLXRvb2xzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6dG9FeGVjdXRhYmxlTmFtZSgiYWRiIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpKTsKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZSA9CisgICAgICAgICAgICBkaXItPm1ha2VTdWJQYXRoKCJTZGsvcGxhdGZvcm0tdG9vbHMvc291cmNlLnByb3BlcnRpZXMiKTsKKyAgICBzdGQ6Om9mc3RyZWFtIG9mcyhvdXRwdXRfZmlsZSk7CisgICAgQVNTRVJUX1RSVUUob2ZzLmlzX29wZW4oKSk7CisgICAgb2ZzIDw8ICIjIyMgQ29tbWVudFxuQXJjaGl2ZS5Ib3N0T3M9bGludXhcblBrZy5MaWNlbnNlPVxcbk5vbGllbnNlXG4iCisgICAgICAgICAgICJQa2cuTGljZW5zZVJlZj1hbmRyb2lkLXNkay1saWNlbnNlXG5Qa2cuUmV2aXNpb249MjIuMS4wXG4iCisgICAgICAgICAgICJQa2cuU291cmNlVXJsPWh0dHBzXFw6Ly9kbC5nb29nbGUuY29tL2FuZHJvaWQvcmVwb3NpdG9yeS8iCisgICAgICAgICAgICJyZXBvc2l0b3J5LTEyLnhtbFxuIjsKKyAgICBvZnMuY2xvc2UoKTsKKyAgICBzdGQ6OnN0cmluZyBzZGtSb290ID0gUGF0aFV0aWxzOjpqb2luKGRpci0+cGF0aCgpLCAiU2RrIik7CisgICAgc3lzdGVtLmVudlNldCgiQU5EUk9JRF9TREtfUk9PVCIsIHNka1Jvb3QpOworICAgIGF1dG8gYWRiID0gQWRiSW50ZXJmYWNlOjpjcmVhdGUobnVsbHB0cik7CisgICAgRVhQRUNUX0ZBTFNFKGFkYi0+aXNBZGJWZXJzaW9uQ3VycmVudCgpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIGFkYi0+ZGV0ZWN0ZWRBZGJQYXRoKCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJkMzFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlci5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1V1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9Bc3luYy5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGFyYWxsZWxUYXNrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlV1aWQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvLyBzdGF0aWMKKy8vIFRPRE8oYmlyZW5iYXVtKTogd2hhdCdzIGFuIGFwcHJvcHJpYXRlIG51bWJlciBoZXJlPyBXZSBkb24ndCB3YW50IHRvIGdvCisvLyBmb3JldmVyIGJ1dCBzb21lIGFwcHMgYXJlIGdvaW5nIHRvIGJlIHN1cGVyIGJpZyBhbmQgdGFrZSBhIGxvbmcgdGltZS4KKy8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cm91Ymxpbmcgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIHJlbGlhYmxlIHdheSBvZiBraWxsaW5nCisvLyB0aGUgbmV3IHByb2Nlc3MgYmVzaWRlcyB1c2luZyB0aGUgb3V0IFBJRCBhcmd1bWVudCBhbmQga2lsbGluZyB0aGF0IHByb2Nlc3MKKy8vIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyBjYW5jZWwgKHlpa2VzKS4KK2NvbnN0IFN5c3RlbTo6RHVyYXRpb24gQXBrSW5zdGFsbGVyOjprSW5zdGFsbFRpbWVvdXRNcyA9IFN5c3RlbTo6a0luZmluaXRlOworY29uc3QgY2hhciBBcGtJbnN0YWxsZXI6OmtEZWZhdWx0RXJyb3JTdHJpbmdbXSA9ICJDb3VsZCBub3QgcGFyc2UgZXJyb3Igc3RyaW5nIjsKKworQXBrSW5zdGFsbGVyOjpBcGtJbnN0YWxsZXIoQWRiSW50ZXJmYWNlKiBhZGIpIDogbUFkYihhZGIpIHt9CitBcGtJbnN0YWxsZXI6On5BcGtJbnN0YWxsZXIoKSB7CisgICAgaWYgKG1JbnN0YWxsQ29tbWFuZCkgeworICAgICAgICBtSW5zdGFsbENvbW1hbmQtPmNhbmNlbCgpOworICAgIH0KK30KKworLy8gc3RhdGljCitib29sIEFwa0luc3RhbGxlcjo6cGFyc2VPdXRwdXRGb3JGYWlsdXJlKHN0ZDo6aWZzdHJlYW0mIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRFcnJvclN0cmluZykgeworICAgIC8vICJhZGIgaW5zdGFsbCIgZG9lcyBub3QgcmV0dXJuIGEgaGVscGZ1bCBleGl0IHN0YXR1cywgc28gaW5zdGVhZCB3ZSBwYXJzZQorICAgIC8vIHRoZSBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgbG9va2luZyBmb3I6CisgICAgLy8gLSAiYWRiOiBlcnJvcjogZmFpbGVkIHRvIGNvcHkiIGluIHRoZSBjYXNlIHRoYXQgdGhlIGFwayBjb3VsZCBub3QgYmUKKyAgICAvLyAgIGNvcGllZCBiZWNhdXNlIHRoZSBkZXZpY2UgaXMgZnVsbAorICAgIC8vIC0gIkZhaWx1cmUgWzxzb21lIGVycm9yIGNvZGU+XSIsIGluIHRoZSBjYXNlIHRoYXQgdGhlIGFwayBjb3VsZCBub3QgYmUKKyAgICAvLyAgIGluc3RhbGxlZCBiZWNhdXNlIG9mIGEgc3BlY2lmaWMgZXJyb3IKKworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgICpvdXRFcnJvclN0cmluZyA9IGtEZWZhdWx0RXJyb3JTdHJpbmc7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJpbmcgbGluZTsKKyAgICB3aGlsZSAoZ2V0bGluZShzdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlmICghbGluZS5jb21wYXJlKDAsIDcsICJGYWlsdXJlIikpIHsKKyAgICAgICAgICAgIGF1dG8gb3BlbkJyYWNlID0gbGluZS5maW5kKCJbIik7CisgICAgICAgICAgICBhdXRvIGNsb3NlQnJhY2UgPSBsaW5lLmZpbmQoIl0iLCBvcGVuQnJhY2UgKyAxKTsKKyAgICAgICAgICAgIGlmIChvcGVuQnJhY2UgIT0gc3RyaW5nOjpucG9zICYmIGNsb3NlQnJhY2UgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgKm91dEVycm9yU3RyaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyKG9wZW5CcmFjZSArIDEsIGNsb3NlQnJhY2UgLSBvcGVuQnJhY2UgLSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKm91dEVycm9yU3RyaW5nID0ga0RlZmF1bHRFcnJvclN0cmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmICghbGluZS5jb21wYXJlKDAsIDI2LCAiYWRiOiBlcnJvcjogZmFpbGVkIHRvIGNvcHkiKSkgeworICAgICAgICAgICAgKm91dEVycm9yU3RyaW5nID0gIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitBZGJDb21tYW5kUHRyIEFwa0luc3RhbGxlcjo6aW5zdGFsbCgKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBhcGtGaWxlUGF0aCwKKyAgICAgICAgQXBrSW5zdGFsbGVyOjpSZXN1bHRDYWxsYmFjayByZXN1bHRDYWxsYmFjaykgeworICAgIGlmICghYmFzZTo6U3lzdGVtOjpnZXQoKS0+cGF0aENhblJlYWQoYXBrRmlsZVBhdGgpKSB7CisgICAgICAgIHJlc3VsdENhbGxiYWNrKFJlc3VsdDo6a0Fwa1Blcm1pc3Npb25zRXJyb3IsICIiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpbnN0YWxsQ29tbWFuZHsiaW5zdGFsbCIsICItciIsIGFwa0ZpbGVQYXRofTsKKyAgICBtSW5zdGFsbENvbW1hbmQgPSBtQWRiLT5ydW5BZGJDb21tYW5kKAorICAgICAgICAgICAgaW5zdGFsbENvbW1hbmQsCisgICAgICAgICAgICBbcmVzdWx0Q2FsbGJhY2ssIHRoaXNdKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LT5leGl0X2NvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2soUmVzdWx0OjprQWRiQ29ubmVjdGlvbkZhaWxlZCwgIiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yU3RyaW5nOworICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sIHBhcnNlUmVzdWx0ID0gcGFyc2VPdXRwdXRGb3JGYWlsdXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocmVzdWx0LT5vdXRwdXQpLCAmZXJyb3JTdHJpbmcpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayhwYXJzZVJlc3VsdCA/IFJlc3VsdDo6a1N1Y2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSZXN1bHQ6OmtJbnN0YWxsRmFpbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1JbnN0YWxsQ29tbWFuZC5yZXNldCgpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGtJbnN0YWxsVGltZW91dE1zLCB0cnVlKTsKKyAgICByZXR1cm4gbUluc3RhbGxDb21tYW5kOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmVjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyLmgKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1BhcmFsbGVsVGFzay5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW11bGF0aW9uIHsKKworY2xhc3MgQXBrSW5zdGFsbGVyIHsKK3B1YmxpYzoKKyAgICBlbnVtIGNsYXNzIFJlc3VsdCB7CisgICAgICAgIGtTdWNjZXNzLAorICAgICAgICBrT3BlcmF0aW9uSW5Qcm9ncmVzcywKKyAgICAgICAga0Fwa1Blcm1pc3Npb25zRXJyb3IsCisgICAgICAgIGtBZGJDb25uZWN0aW9uRmFpbGVkLAorICAgICAgICBrSW5zdGFsbEZhaWxlZCwKKyAgICAgICAga1Vua25vd25FcnJvcgorICAgIH07CisKKyAgICB1c2luZyBSZXN1bHRDYWxsYmFjayA9CisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoUmVzdWx0IHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGVycm9yU3RyaW5nKT47CisKKyAgICBleHBsaWNpdCBBcGtJbnN0YWxsZXIoQWRiSW50ZXJmYWNlKiBhZGIpOworICAgIH5BcGtJbnN0YWxsZXIoKTsKKworICAgIC8vIEFzeW5jaHJvbm91c2x5IGluc3RhbGxzIHRoZSBhcGsgYXQgfGFwa0ZpbGVQYXRofCBvbiB0aGUgZGV2aWNlCisgICAgLy8gYW5kIGludm9rZXMgfHJlc3VsdENhbGxiYWNrfCBvbiB0aGUgY2FsbGluZyB0aHJlYWQgd2hlbiBkb25lLgorICAgIC8vIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgQWRiQ29tbWFuZCB0aGF0IGhhbmRsZXMgdGhlIGluc3RhbGwKKyAgICAvLyBwcm9jZXNzLgorICAgIEFkYkNvbW1hbmRQdHIgaW5zdGFsbChhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGFwa0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcGtJbnN0YWxsZXI6OlJlc3VsdENhbGxiYWNrIHJlc3VsdENhbGxiYWNrKTsKKworICAgIC8vIFBhcnNlcyB0aGUgY29udGVudHMgb2YgfG91dHB1dHwgc3RyZWFtIGFzIGlmIGl0IHdhcyB0aGUgb3V0cHV0IGZyb20KKyAgICAvLyBydW5uaW5nICJhZGIgaW5zdGFsbCIgdG8gc2VlIGlmIHRoZSBpbnN0YWxsIHN1Y2NlZWRlZC4gUmV0dXJucyB0cnVlCisgICAgLy8gaWYgdGhlIGluc3RhbGwgc3VjY2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuIElmIHRoZSBpbnN0YWxsIGZhaWxlZCwKKyAgICAvLyB8b3V0RXJyb3JTdHJpbmd8IGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBlcnJvciBmcm9tICJhZGIgaW5zdGFsbCIuCisgICAgc3RhdGljIGJvb2wgcGFyc2VPdXRwdXRGb3JGYWlsdXJlKHN0ZDo6aWZzdHJlYW0mIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dEVycm9yU3RyaW5nKTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtEZWZhdWx0RXJyb3JTdHJpbmdbXTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpEdXJhdGlvbiBrSW5zdGFsbFRpbWVvdXRNczsKKworcHJpdmF0ZToKKyAgICBBZGJDb21tYW5kUHRyIG1JbnN0YWxsQ29tbWFuZDsKKyAgICBBZGJJbnRlcmZhY2UqIG1BZGI7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXBrSW5zdGFsbGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbXVsYXRpb24KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzYwMzkxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0Fwa0luc3RhbGxlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQXBrSW5zdGFsbGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0VGVtcERpcjsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QXBrSW5zdGFsbGVyOworCit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RFU1QoQXBrSW5zdGFsbGVyLCBwYXJzZU91dHB1dEZvckZhaWx1cmVOb0ZpbGUpIHsKKyAgICBzdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgc3RkOjppZnN0cmVhbSBmKCJpLWRvbnQtZXhpc3QudHh0Iik7CisgICAgRVhQRUNUX0ZBTFNFKEFwa0luc3RhbGxlcjo6cGFyc2VPdXRwdXRGb3JGYWlsdXJlKGYsICZlcnJvclN0cmluZykpOworICAgIEVYUEVDVF9TVFJFUShlcnJvclN0cmluZy5jX3N0cigpLCBBcGtJbnN0YWxsZXI6OmtEZWZhdWx0RXJyb3JTdHJpbmcpOworfQorCitURVNUKEFwa0luc3RhbGxlciwgcGFyc2VPdXRwdXRGb3JGYWlsdXJlQmFkT3V0cHV0KSB7CisgICAgVGVzdFN5c3RlbSBzeXN0ZW0oIi9wcm9nZGlyIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MsICIvaG9tZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgIi9hcHBkaXIiKTsKKyAgICBUZXN0VGVtcERpciogZGlyID0gc3lzdGVtLmdldFRlbXBSb290KCk7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBkaXItPm1ha2VTdWJQYXRoKCJvdXRwdXQudHh0Iik7CisKKyAgICBvZnN0cmVhbSBvZnMob3V0cHV0RmlsZSk7CisgICAgRVhQRUNUX1RSVUUob2ZzLmlzX29wZW4oKSk7CisgICAgb2ZzIDw8ICJJJ20gaW5jb3JyZWN0bHkgZm9ybWF0dGVkIVxuIgorICAgICAgICAgICAiRmFpbHVyZS4uLi5cbiI7CisgICAgb2ZzLmNsb3NlKCk7CisKKyAgICBzdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgc3RkOjppZnN0cmVhbSBmKG91dHB1dEZpbGUuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEFwa0luc3RhbGxlcjo6cGFyc2VPdXRwdXRGb3JGYWlsdXJlKGYsICZlcnJvclN0cmluZykpOworICAgIEVYUEVDVF9TVFJFUShlcnJvclN0cmluZy5jX3N0cigpLCBBcGtJbnN0YWxsZXI6OmtEZWZhdWx0RXJyb3JTdHJpbmcpOworfQorCitURVNUKEFwa0luc3RhbGxlciwgcGFyc2VPdXRwdXRGb3JGYWlsdXJlRGV2aWNlRnVsbCkgeworICAgIFRlc3RTeXN0ZW0gc3lzdGVtKCIvcHJvZ2RpciIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICIvYXBwZGlyIik7CisgICAgVGVzdFRlbXBEaXIqIGRpciA9IHN5c3RlbS5nZXRUZW1wUm9vdCgpOworICAgIHN0cmluZyBvdXRwdXRGaWxlID0gZGlyLT5tYWtlU3ViUGF0aCgib3V0cHV0LnR4dCIpOworCisgICAgb2ZzdHJlYW0gb2ZzKG91dHB1dEZpbGUpOworICAgIEVYUEVDVF9UUlVFKG9mcy5pc19vcGVuKCkpOworICAgIG9mcyA8PCAiWyA5MiVdIC9kYXRhL2xvY2FsL3RtcC9hLWJpZy1hcGsuYXBrXG4iCisgICAgICAgICAgICJbIDkyJV0gL2RhdGEvbG9jYWwvdG1wL2EtYmlnLWFway5hcGtcbiIKKyAgICAgICAgICAgIlsgOTIlXSAvZGF0YS9sb2NhbC90bXAvYS1iaWctYXBrLmFwa1xuIgorICAgICAgICAgICAiYWRiOiBlcnJvcjogZmFpbGVkIHRvIGNvcHkgJ2EtYmlnLWFway5hcGsnIHRvICIKKyAgICAgICAgICAgIicvZGF0YS9sb2NhbC90bXAvYS1iaWctYXBrLmFwayc6IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlXG4iOworCisgICAgb2ZzLmNsb3NlKCk7CisKKyAgICBzdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgc3RkOjppZnN0cmVhbSBmKG91dHB1dEZpbGUuY19zdHIoKSk7CisgICAgRVhQRUNUX0ZBTFNFKEFwa0luc3RhbGxlcjo6cGFyc2VPdXRwdXRGb3JGYWlsdXJlKGYsICZlcnJvclN0cmluZykpOworfQorCitURVNUKEFwa0luc3RhbGxlciwgcGFyc2VPdXRwdXRGb3JGYWlsdXJlSW5zdGFsbEZhaWxlZCkgeworICAgIFRlc3RTeXN0ZW0gc3lzdGVtKCIvcHJvZ2RpciIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWVkaXIiLAorICAgICAgICAgICAgICAgICAgICAgICIvYXBwZGlyIik7CisgICAgVGVzdFRlbXBEaXIqIGRpciA9IHN5c3RlbS5nZXRUZW1wUm9vdCgpOworICAgIHN0cmluZyBvdXRwdXRGaWxlID0gZGlyLT5tYWtlU3ViUGF0aCgib3V0cHV0LnR4dCIpOworCisgICAgb2ZzdHJlYW0gb2ZzKG91dHB1dEZpbGUpOworICAgIEVYUEVDVF9UUlVFKG9mcy5pc19vcGVuKCkpOworICAgIG9mcyA8PCAiNTQyIEtCL3MgKDI1MzcwIGJ5dGVzIGluIDAuMDQ1cylcbiIKKyAgICAgICAgICAgIiAgICAgICAgcGtnOiAvZGF0YS9sb2NhbC90bXAvYW4tYXBrLXRoYXQtZmFpbGVkLmFwa1xuIgorICAgICAgICAgICAiRmFpbHVyZSBbSU5TVEFMTF9GQUlMRURfT0xERVJfU0RLXVxuIjsKKyAgICBvZnMuY2xvc2UoKTsKKworICAgIHN0cmluZyBlcnJvclN0cmluZzsKKyAgICBzdGQ6Omlmc3RyZWFtIGYob3V0cHV0RmlsZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRkFMU0UoQXBrSW5zdGFsbGVyOjpwYXJzZU91dHB1dEZvckZhaWx1cmUoZiwgJmVycm9yU3RyaW5nKSk7CisgICAgRVhQRUNUX1NUUkVRKGVycm9yU3RyaW5nLmNfc3RyKCksICJJTlNUQUxMX0ZBSUxFRF9PTERFUl9TREsiKTsKK30KKworVEVTVChBcGtJbnN0YWxsZXIsIHBhcnNlT3V0cHV0Rm9yRmFpbHVyZUluc3RhbGxTdWNjZXNzKSB7CisgICAgVGVzdFN5c3RlbSBzeXN0ZW0oIi9wcm9nZGlyIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MsICIvaG9tZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgIi9hcHBkaXIiKTsKKyAgICBUZXN0VGVtcERpciogZGlyID0gc3lzdGVtLmdldFRlbXBSb290KCk7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBkaXItPm1ha2VTdWJQYXRoKCJvdXRwdXQudHh0Iik7CisKKyAgICBvZnN0cmVhbSBvZnMob3V0cHV0RmlsZSk7CisgICAgRVhQRUNUX1RSVUUob2ZzLmlzX29wZW4oKSk7CisgICAgb2ZzIDw8ICI1MTk2IEtCL3MgKDEwOTcxOTYgYnl0ZXMgaW4gMC4yMDZzKVxuIgorICAgICAgICAgICAiICAgICAgICAgcGtnOiAvZGF0YS9sb2NhbC90bXAvYW4tYXBrLXRoYXQtaW5zdGFsbGVkLmFwa1xuIgorICAgICAgICAgICAiU3VjY2Vzc1xuIjsKKyAgICBvZnMuY2xvc2UoKTsKKworICAgIHN0cmluZyBlcnJvclN0cmluZzsKKyAgICBzdGQ6Omlmc3RyZWFtIGYob3V0cHV0RmlsZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShBcGtJbnN0YWxsZXI6OnBhcnNlT3V0cHV0Rm9yRmFpbHVyZShmLCAmZXJyb3JTdHJpbmcpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9GaWxlUHVzaGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9GaWxlUHVzaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzcyMTIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvRmlsZVB1c2hlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXJhbGxlbFRhc2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworRmlsZVB1c2hlcjo6fkZpbGVQdXNoZXIoKSB7CisgICAgY2FuY2VsKCk7Cit9CisKK3ZvaWQgRmlsZVB1c2hlcjo6Y2FuY2VsKCkgeworICAgIGlmIChtQ3VycmVudFB1c2hDb21tYW5kKSB7CisgICAgICAgIG1DdXJyZW50UHVzaENvbW1hbmQtPmNhbmNlbCgpOworICAgICAgICBtQ3VycmVudFB1c2hDb21tYW5kLnJlc2V0KCk7CisgICAgfQorICAgIG1QdXNoUXVldWUuY2xlYXIoKTsKKyAgICByZXNldFByb2dyZXNzKCk7Cit9CisKK3ZvaWQgRmlsZVB1c2hlcjo6cHVzaE5leHRJdGVtKCkgeworICAgIGlmIChtUHVzaFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0coVkVSQk9TRSkgPDwgIlB1c2hpbmcgbmV4dCBpdGVtLi4uIFtRdWV1ZSBsZW5ndGg6ICIgPDwgbVB1c2hRdWV1ZS5zaXplKCkKKyAgICAgICAgICAgICAgICAgPDwgIl0iOworICAgIG1DdXJyZW50SXRlbSA9IG1QdXNoUXVldWUuZnJvbnQoKTsKKyAgICBtUHVzaFF1ZXVlLnBvcF9mcm9udCgpOworCisgICAgaWYgKCFTeXN0ZW06OmdldCgpLT5wYXRoQ2FuUmVhZChtQ3VycmVudEl0ZW0uZmlyc3QpKSB7CisgICAgICAgIHB1c2hEb25lKFJlc3VsdDo6RmlsZVJlYWRFcnJvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUN1cnJlbnRQdXNoQ29tbWFuZCA9IG1BZGItPnJ1bkFkYkNvbW1hbmQoCisgICAgICAgIHsicHVzaCIsIG1DdXJyZW50SXRlbS5maXJzdCwgbUN1cnJlbnRJdGVtLnNlY29uZH0sCisgICAgICAgIFt0aGlzXShjb25zdCBPcHRpb25hbEFkYkNvbW1hbmRSZXN1bHQmIHJlc3VsdCkgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwdXNoRG9uZShSZXN1bHQ6OlVua25vd25FcnJvcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC0+ZXhpdF9jb2RlKSB7CisgICAgICAgICAgICAgICAgcHVzaERvbmUoUmVzdWx0OjpBZGJQdXNoRmFpbHVyZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1c2hEb25lKFJlc3VsdDo6U3VjY2Vzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFN5c3RlbTo6a0luZmluaXRlKTsKK30KKwordm9pZCBGaWxlUHVzaGVyOjpwdXNoRG9uZShjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIGJvb2wgYWxsRG9uZSA9IG1QdXNoUXVldWUuZW1wdHkoKTsKKyAgICArK21OdW1QdXNoZWQ7CisgICAgaWYgKG1SZXN1bHRDYWxsYmFjaykgeworICAgICAgICBtUmVzdWx0Q2FsbGJhY2sobUN1cnJlbnRJdGVtLmZpcnN0LCByZXN1bHQpOworICAgIH0KKyAgICBpZiAobVByb2dyZXNzQ2FsbGJhY2spIHsKKyAgICAgICAgbVByb2dyZXNzQ2FsbGJhY2soc3RhdGljX2Nhc3Q8ZG91YmxlPihtTnVtUHVzaGVkKSAvIG1OdW1RdWV1ZWQsIGFsbERvbmUpOworICAgIH0KKyAgICBpZiAoIWFsbERvbmUpIHsKKyAgICAgICAgcHVzaE5leHRJdGVtKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUN1cnJlbnRQdXNoQ29tbWFuZC5yZXNldCgpOworICAgICAgICByZXNldFByb2dyZXNzKCk7CisgICAgfQorfQorCit2b2lkIEZpbGVQdXNoZXI6OnJlc2V0UHJvZ3Jlc3MoKSB7CisgICAgbU51bVB1c2hlZCA9IDA7CisgICAgbU51bVF1ZXVlZCA9IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVsYXRpb24KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvRmlsZVB1c2hlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDBhNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9QYXJhbGxlbFRhc2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0FkYkludGVyZmFjZS5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKK2NsYXNzIEZpbGVQdXNoZXIgeworcHVibGljOgorICAgIGVudW0gY2xhc3MgUmVzdWx0IHsKKyAgICAgICAgU3VjY2VzcywKKworICAgICAgICBVbmtub3duRXJyb3IsCisgICAgICAgIFByb2Nlc3NTdGFydEZhaWx1cmUsCisgICAgICAgIE9wZXJhdGlvbkluUHJvZ3Jlc3MsCisgICAgICAgIC8vIENvdW50IG5vdCByZWFkIGZpbGUgdG8gcHVzaC4KKyAgICAgICAgRmlsZVJlYWRFcnJvciwKKyAgICAgICAgQWRiUHVzaEZhaWx1cmUsCisgICAgfTsKKworICAgIHVzaW5nIFB1c2hJdGVtID0gc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CisgICAgLy8gVGhpcyBjYWxsYmFjayByZXBvcnRzIHRoZSByZXN1bHQgb2YgZWFjaCBpbmRpdmlkdWFsIHB1c2ggb3BlcmF0aW9uLgorICAgIHVzaW5nIFJlc3VsdENhbGxiYWNrID0KKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVQdXNoZXI6OlJlc3VsdCByZXN1bHQpPjsKKyAgICAvLyBGaXJzdCBhcmd1bWVudCBoYXMgYW4gZG91YmxlIHZhbHVlIGluIFswLDFdLCByZXBvcnRpbmcgcHJvZ3Jlc3MuCisgICAgLy8gU2Vjb25kIGFyZ3VtZW50IHJlcG9ydHMgd2hldGhlciBjdXJyZW50IGJhdGNoIG9mIGZpbGUgcHVzaGluZyBoYXMgYmVlbgorICAgIC8vIGNvbXBsZXRlZC4KKyAgICAvLyB8ZW5xdWV1ZXxpbmcgbW9yZSBmaWxlcyBjYW4gY2F1c2UgdGhlIHByb2dyZXNzIHRvIGRlY3JlYXNlLgorICAgIHVzaW5nIFByb2dyZXNzQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoZG91YmxlLCBib29sKT47CisKKyAgICBleHBsaWNpdCBGaWxlUHVzaGVyKEFkYkludGVyZmFjZSogYWRiLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0Q2FsbGJhY2sgcmVzdWx0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmVzc0NhbGxiYWNrIHByb2dyZXNzQ2FsbGJhY2spIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWRiKGFkYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2dyZXNzQ2FsbGJhY2socHJvZ3Jlc3NDYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc3VsdENhbGxiYWNrKHJlc3VsdENhbGxiYWNrKSB7fQorICAgIH5GaWxlUHVzaGVyKCk7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHVzaEl0ZW1JdD4KKyAgICBib29sIHB1c2hGaWxlcyhQdXNoSXRlbUl0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgIFB1c2hJdGVtSXQgZW5kKSB7CisgICAgICAgIG1QdXNoUXVldWUuaW5zZXJ0KG1QdXNoUXVldWUuZW5kKCksIHN0YXJ0LCBlbmQpOworICAgICAgICBtTnVtUXVldWVkICs9IHN0ZDo6ZGlzdGFuY2Uoc3RhcnQsIGVuZCk7CisgICAgICAgIGlmICghbUN1cnJlbnRQdXNoQ29tbWFuZCkgeworICAgICAgICAgICAgaWYgKG1Qcm9ncmVzc0NhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgbVByb2dyZXNzQ2FsbGJhY2soMCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaE5leHRJdGVtKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FuY2VsIGFsbCBvdXRzdGFuZGluZyBwdXNoZXMuIE5vdGUgdGhhdCB3ZSBkbyBub3QgY2FuY2VsIGN1cnJlbnRseQorICAgIC8vIGFjdGl2ZSBwdXNoLgorICAgIHZvaWQgY2FuY2VsKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBwdXNoTmV4dEl0ZW0oKTsKKyAgICB2b2lkIHB1c2hEb25lKGNvbnN0IFJlc3VsdCYgcmVzdWx0KTsKKyAgICB2b2lkIHJlc2V0UHJvZ3Jlc3MoKTsKKworICAgIEFkYkludGVyZmFjZSogbUFkYjsKKyAgICBBZGJDb21tYW5kUHRyIG1DdXJyZW50UHVzaENvbW1hbmQ7CisgICAgUHJvZ3Jlc3NDYWxsYmFjayBtUHJvZ3Jlc3NDYWxsYmFjazsKKyAgICBSZXN1bHRDYWxsYmFjayBtUmVzdWx0Q2FsbGJhY2s7CisKKyAgICBzdGQ6OmRlcXVlPFB1c2hJdGVtPiBtUHVzaFF1ZXVlOworICAgIFB1c2hJdGVtIG1DdXJyZW50SXRlbTsKKyAgICBzaXplX3QgbU51bVF1ZXVlZCA9IDA7CisgICAgc2l6ZV90IG1OdW1QdXNoZWQgPSAwOworCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEZpbGVQdXNoZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWxhdGlvbgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9GaWxlUHVzaGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9GaWxlUHVzaGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njc2MmE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9UZXN0QWRiSW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6VGVzdEFkYkludGVyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6RmlsZVB1c2hlcjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK2NsYXNzIEZpbGVQdXNoZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIHVzaW5nIFJlc3VsdFBhaXIgPSBzdGQ6OnBhaXI8c3RyaW5nLCBGaWxlUHVzaGVyOjpSZXN1bHQ+OworICAgIHVzaW5nIFByb2dyZXNzUGFpciA9IHN0ZDo6cGFpcjxkb3VibGUsIGJvb2w+OworCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRlc3RTeXN0ZW0ucmVzZXQobmV3IGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW0oCisgICAgICAgICAgICAgICAgIi9wcm9nZGlyIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MsICIvaG9tZWRpciIsICIvYXBwZGlyIikpOworICAgICAgICBtTG9vcGVyID0gbmV3IGFuZHJvaWQ6OmJhc2U6OlRlc3RMb29wZXIoKTsKKyAgICAgICAgbUFkYi5yZXNldChuZXcgVGVzdEFkYkludGVyZmFjZShtTG9vcGVyLCAiYWRiIikpOworICAgICAgICBtRmlsZVB1c2hlci5yZXNldCgKKyAgICAgICAgICAgIG5ldyBGaWxlUHVzaGVyKG1BZGIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10oU3RyaW5nVmlldyBmaWxlUGF0aCwgRmlsZVB1c2hlcjo6UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXN1bHRzLnB1c2hfYmFjayh7ZmlsZVBhdGgsIHJlc3VsdH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdG9taWNOdW1Db21tYW5kcy0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKGRvdWJsZSBwcm9ncmVzcywgYm9vbCBkb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9ncmVzc2VzLnB1c2hfYmFjayh7cHJvZ3Jlc3MsIGRvbmV9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSAnYWRiIHB1c2gnIGNvbW1hbmQgd2lsbCBhbHdheXMgYmxvY2suCisgICAgICAgIG1UZXN0U3lzdGVtLT5zZXRTaGVsbENvbW1hbmQoJkZpbGVQdXNoZXJUZXN0OjpmYWtlU2hlbGxDb21tYW5kLCB0aGlzKTsKKyAgICAgICAgbUF0b21pY051bUNvbW1hbmRzID0gMDsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgeworICAgICAgICBtRmlsZVB1c2hlci5yZXNldCgpOworICAgICAgICBtQWRiLnJlc2V0KCk7CisgICAgICAgIGRlbGV0ZSBtTG9vcGVyOworICAgICAgICBtVGVzdFN5c3RlbS5yZXNldCgpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGZha2VTaGVsbENvbW1hbmQodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OkR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUqIG91dEV4aXRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJikgeworICAgICAgICBFWFBFQ1RfR0UoY29tbWFuZC5zaXplKCksIDQpOworICAgICAgICBFWFBFQ1RfRVEoImFkYiIsIGNvbW1hbmRbMF0pOworICAgICAgICBFWFBFQ1RfRVEoIi1zIiwgY29tbWFuZFsxXSk7CisgICAgICAgIEVYUEVDVF9FUSgiZW11bGF0b3ItMCIsIGNvbW1hbmRbMl0pOworICAgICAgICBFWFBFQ1RfRVEoInB1c2giLCBjb21tYW5kWzNdKTsKKworICAgICAgICBhdXRvIHRoaXNQdHIgPSBzdGF0aWNfY2FzdDxGaWxlUHVzaGVyVGVzdCo+KG9wYXF1ZSk7CisgICAgICAgIHdoaWxlKHRoaXNQdHItPm1BdG9taWNOdW1Db21tYW5kcyA8PSAwKSB7CisgICAgICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKDIpOworICAgICAgICB9CisgICAgICAgIGlmIChvdXRFeGl0Q29kZSkgeworICAgICAgICAgICAgKm91dEV4aXRDb2RlID0gdGhpc1B0ci0+bUZha2VFeGl0Q29kZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpc1B0ci0+bUZha2VSdW5Db21tYW5kUmVzdWx0OworICAgIH0KKworICAgIHZvaWQgbG9vcGVyQWR2YW5jZShpbnQgbnVtQ29tbWFuZHMpIHsKKyAgICAgICAgbUF0b21pY051bUNvbW1hbmRzID0gbnVtQ29tbWFuZHM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGF1dG8gbm93ID0gbVRlc3RTeXN0ZW0tPmdldEhpZ2hSZXNUaW1lVXMoKTsKKyAgICAgICAgICAgIG5vdyArPSAxMDAwOworICAgICAgICAgICAgbUxvb3Blci0+cnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMobm93IC8gMTAwMCk7CisgICAgICAgICAgICBtVGVzdFN5c3RlbS0+c2V0VW5peFRpbWVVcyhub3cpOworICAgICAgICB9IHdoaWxlIChtQXRvbWljTnVtQ29tbWFuZHMgPiAwKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZUFuZFB1c2hGaWxlcyhjb25zdCB2ZWN0b3I8c3RkOjpwYWlyPHN0cmluZywgYm9vbD4+JiBmaWxlcykgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPj4gcHVzaF9wYWlyczsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZmlsZXMpIHsKKyAgICAgICAgICAgIGlmIChmLnNlY29uZCkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1UZXN0U3lzdGVtLT5nZXRUZW1wUm9vdCgpLT5tYWtlU3ViRmlsZShmLmZpcnN0LmNfc3RyKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hfcGFpcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGYuZmlyc3QsICIvdG1wIikpOworICAgICAgICB9CisgICAgICAgIG1GaWxlUHVzaGVyLT5wdXNoRmlsZXMoCisgICAgICAgICAgICBwdXNoX3BhaXJzLmJlZ2luKCksCisgICAgICAgICAgICBwdXNoX3BhaXJzLmVuZCgpKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YW5kcm9pZDo6YmFzZTo6VGVzdFN5c3RlbT4gbVRlc3RTeXN0ZW07CisgICAgYW5kcm9pZDo6YmFzZTo6VGVzdExvb3BlciogbUxvb3BlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdEFkYkludGVyZmFjZT4gbUFkYjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZVB1c2hlcj4gbUZpbGVQdXNoZXI7CisKKyAgICAvLyBGYWtlIHJ1bkNvbW1hbmQgc3VwcG9ydC4KKyAgICB2ZWN0b3I8UmVzdWx0UGFpcj4gbVJlc3VsdHM7CisgICAgdmVjdG9yPFByb2dyZXNzUGFpcj4gbVByb2dyZXNzZXM7CisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgbUZha2VFeGl0Q29kZSA9IDA7CisgICAgYm9vbCBtRmFrZVJ1bkNvbW1hbmRSZXN1bHQgPSB0cnVlOworICAgIHN0ZDo6YXRvbWljX2ludCBtQXRvbWljTnVtQ29tbWFuZHM7Cit9OworCitURVNUX0YoRmlsZVB1c2hlclRlc3QsIHN1Y2Nlc3MpIHsKKyAgICBjb25zdCB2ZWN0b3I8UHJvZ3Jlc3NQYWlyPiBrRXhwZWN0ZWRQcm9ncmVzcyA9IHsKKyAgICAgICAgICAgIHswLCBmYWxzZX0sIHswLjI1LCBmYWxzZX0sIHswLjUsIGZhbHNlfSwKKyAgICAgICAgICAgIHswLjc1LCBmYWxzZX0sIHsxLjAsIHRydWV9fTsKKyAgICBjb25zdCB2ZWN0b3I8UmVzdWx0UGFpcj4ga0V4cGVjdGVkUmVzdWx0cyA9IHsKKyAgICAgICAgICAgIHsiZmlsZTEiLCBGaWxlUHVzaGVyOjpSZXN1bHQ6OlN1Y2Nlc3N9LAorICAgICAgICAgICAgeyJmaWxlMiIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc30sCisgICAgICAgICAgICB7ImZpbGUzIiwgRmlsZVB1c2hlcjo6UmVzdWx0OjpTdWNjZXNzfSwKKyAgICAgICAgICAgIHsiZmlsZTQiLCBGaWxlUHVzaGVyOjpSZXN1bHQ6OlN1Y2Nlc3N9fTsKKyAgICBjcmVhdGVBbmRQdXNoRmlsZXMoeworICAgICAgICB7ImZpbGUxIiwgdHJ1ZX0sCisgICAgICAgIHsiZmlsZTIiLCB0cnVlfSwKKyAgICAgICAgeyJmaWxlMyIsIHRydWV9LAorICAgICAgICB7ImZpbGU0IiwgdHJ1ZX19KTsKKyAgICBsb29wZXJBZHZhbmNlKDQpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRQcm9ncmVzcywgbVByb2dyZXNzZXMpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRSZXN1bHRzLCBtUmVzdWx0cyk7Cit9CisKK1RFU1RfRihGaWxlUHVzaGVyVGVzdCwgZmlsZU5vdFJlYWRhYmxlKSB7CisgICAgY29uc3QgdmVjdG9yPFByb2dyZXNzUGFpcj4ga0V4cGVjdGVkUHJvZ3Jlc3MgPSB7CisgICAgICAgICAgICB7MCwgZmFsc2V9LCB7MC41LCBmYWxzZX0sIHsxLjAsIHRydWV9fTsKKyAgICBjb25zdCB2ZWN0b3I8UmVzdWx0UGFpcj4ga0V4cGVjdGVkUmVzdWx0cyA9IHsKKyAgICAgICAgICAgIHsiZmlsZTEiLCBGaWxlUHVzaGVyOjpSZXN1bHQ6OkZpbGVSZWFkRXJyb3J9LAorICAgICAgICAgICAgeyJmaWxlMiIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc319OworICAgIGNyZWF0ZUFuZFB1c2hGaWxlcyh7CisgICAgICAgIHsiZmlsZTEiLCBmYWxzZX0sCisgICAgICAgIHsiZmlsZTIiLCB0cnVlfX0pOworCisgICAgLy8gT25seSBmaWxlMiB3aWxsIGFjdHVhbGx5IGJlIHB1c2hlZC4KKyAgICBsb29wZXJBZHZhbmNlKDEpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRQcm9ncmVzcywgbVByb2dyZXNzZXMpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRSZXN1bHRzLCBtUmVzdWx0cyk7Cit9CisKKworVEVTVF9GKEZpbGVQdXNoZXJUZXN0LCBjb21tYW5kRmFpbHVyZXMpIHsKKyAgICBjb25zdCB2ZWN0b3I8UHJvZ3Jlc3NQYWlyPiBrRXhwZWN0ZWRQcm9ncmVzcyA9IHsKKyAgICAgICAgICAgIHswLCBmYWxzZX0sIHswLjI1LCBmYWxzZX0sIHswLjUsIGZhbHNlfSwgezAuNzUsIGZhbHNlfSwgezEuMCwgdHJ1ZX19OworICAgIGNvbnN0IHZlY3RvcjxSZXN1bHRQYWlyPiBrRXhwZWN0ZWRSZXN1bHRzID0geworICAgICAgICAgICAgeyJmaWxlMSIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc30sCisgICAgICAgICAgICB7ImZpbGUyIiwgRmlsZVB1c2hlcjo6UmVzdWx0OjpVbmtub3duRXJyb3J9LAorICAgICAgICAgICAgeyJmaWxlMyIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6QWRiUHVzaEZhaWx1cmV9LAorICAgICAgICAgICAgeyJmaWxlNCIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc319OworICAgIGNyZWF0ZUFuZFB1c2hGaWxlcyh7CisgICAgICAgIHsiZmlsZTEiLCB0cnVlfSwKKyAgICAgICAgeyJmaWxlMiIsIHRydWV9LAorICAgICAgICB7ImZpbGUzIiwgdHJ1ZX0sCisgICAgICAgIHsiZmlsZTQiLCB0cnVlfX0pOworCisgICAgbG9vcGVyQWR2YW5jZSgxKTsKKyAgICBtRmFrZVJ1bkNvbW1hbmRSZXN1bHQgPSBmYWxzZTsKKyAgICBsb29wZXJBZHZhbmNlKDEpOworICAgIG1GYWtlUnVuQ29tbWFuZFJlc3VsdCA9IHRydWU7CisgICAgbUZha2VFeGl0Q29kZSA9IDk5OworICAgIGxvb3BlckFkdmFuY2UoMSk7CisgICAgbUZha2VSdW5Db21tYW5kUmVzdWx0ID0gdHJ1ZTsKKyAgICBtRmFrZUV4aXRDb2RlID0gMDsKKyAgICBsb29wZXJBZHZhbmNlKDEpOworCisgICAgRVhQRUNUX0VRKGtFeHBlY3RlZFByb2dyZXNzLCBtUHJvZ3Jlc3Nlcyk7CisgICAgRVhQRUNUX0VRKGtFeHBlY3RlZFJlc3VsdHMsIG1SZXN1bHRzKTsKK30KKworCitURVNUX0YoRmlsZVB1c2hlclRlc3QsIGVucXVldWVXaGlsZVB1c2hpbmcpIHsKKyAgICBjb25zdCB2ZWN0b3I8UHJvZ3Jlc3NQYWlyPiBrRXhwZWN0ZWRQcm9ncmVzcyA9CisgICAgICAgIHsgezAsIGZhbHNlfSwgezAuNSwgZmFsc2V9LCB7MC41LCBmYWxzZX0sIHswLjc1LCBmYWxzZX0sIHsxLCB0cnVlfSB9OworICAgIGNvbnN0IHZlY3RvcjxSZXN1bHRQYWlyPiBrRXhwZWN0ZWRSZXN1bHRzID0geworICAgICAgICAgICAgeyJmaWxlMSIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc30sCisgICAgICAgICAgICB7ImZpbGUyIiwgRmlsZVB1c2hlcjo6UmVzdWx0OjpTdWNjZXNzfSwKKyAgICAgICAgICAgIHsiZmlsZTMiLCBGaWxlUHVzaGVyOjpSZXN1bHQ6OlN1Y2Nlc3N9LAorICAgICAgICAgICAgeyJmaWxlNCIsIEZpbGVQdXNoZXI6OlJlc3VsdDo6U3VjY2Vzc319OworICAgIGNyZWF0ZUFuZFB1c2hGaWxlcyh7CisgICAgICAgIHsiZmlsZTEiLCB0cnVlfSwKKyAgICAgICAgeyJmaWxlMiIsIHRydWV9fSk7CisgICAgbG9vcGVyQWR2YW5jZSgxKTsKKworICAgIGNyZWF0ZUFuZFB1c2hGaWxlcyh7CisgICAgICAgIHsiZmlsZTMiLCB0cnVlfSwKKyAgICAgICAgeyJmaWxlNCIsIHRydWV9fSk7CisgICAgbG9vcGVyQWR2YW5jZSgzKTsKKworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRQcm9ncmVzcywgbVByb2dyZXNzZXMpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRSZXN1bHRzLCBtUmVzdWx0cyk7Cit9CisKK1RFU1RfRihGaWxlUHVzaGVyVGVzdCwgY2FuY2VsV2hpbGVQdXNoaW5nKSB7CisgICAgY29uc3QgdmVjdG9yPFByb2dyZXNzUGFpcj4ga0V4cGVjdGVkUHJvZ3Jlc3MgPSB7ezAsIGZhbHNlfSwgezEuMCAvIDMsIGZhbHNlfX07CisgICAgY29uc3QgdmVjdG9yPFJlc3VsdFBhaXI+IGtFeHBlY3RlZFJlc3VsdHMgPSB7CisgICAgICAgICAgICB7ImZpbGUxIiwgRmlsZVB1c2hlcjo6UmVzdWx0OjpTdWNjZXNzfSwKKyAgICB9OworICAgIGNyZWF0ZUFuZFB1c2hGaWxlcyh7CisgICAgICAgIHsiZmlsZTEiLCB0cnVlfSwKKyAgICAgICAgeyJmaWxlMiIsIHRydWV9LAorICAgICAgICB7ImZpbGUzIiwgdHJ1ZX19KTsKKyAgICBsb29wZXJBZHZhbmNlKDEpOworICAgIG1GaWxlUHVzaGVyLT5jYW5jZWwoKTsgLy8gVGhpcyB3aWxsIGNhbmNlbCBmaWxlMiBhbmQgZmlsZTMuCisgICAgRVhQRUNUX0VRKGtFeHBlY3RlZFByb2dyZXNzLCBtUHJvZ3Jlc3Nlcyk7CisgICAgRVhQRUNUX0VRKGtFeHBlY3RlZFJlc3VsdHMsIG1SZXN1bHRzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9MaW5lQ29uc3VtZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5MWNiYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9MaW5lQ29uc3VtZXIuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9MaW5lQ29uc3VtZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCisvLyBzdGF0aWMKK2ludCBMaW5lQ29uc3VtZXI6OkNhbGxiYWNrKHZvaWQqIG9wYXF1ZSwgY29uc3QgY2hhciogYnVmZiwgaW50IGxlbikgeworICAgIGF1dG8gbWUgPSBzdGF0aWNfY2FzdDxMaW5lQ29uc3VtZXIqPihvcGFxdWUpOworICAgIG1lLT5tTGluZXMucHVzaF9iYWNrKHN0cmluZyhidWZmLCBsZW4pKTsKKyAgICByZXR1cm4gbGVuOworfQorCit9ICAvLyBlbXVsYXRpb24KK30gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9MaW5lQ29uc3VtZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9MaW5lQ29uc3VtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzZlNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jYWxsYmFja3MuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVtdWxhdGlvbiB7CisKKy8vIEEgY2FubmVkIGNhbGxiYWNrIHRvIGJlIHVzZWQgd2l0aCBBUElzIHRoYXQgcmVxdWlyZSBhIExpbmVDb25zdW1lckNhbGxiYWNrLgorLy8gZS5nLjoKKy8vICAgRm9yIGEgZnVuY3Rpb24gd2l0aCBzaWduYXR1cmU6CisvLyAgICAgZG9fc29tZXRoaW5nX2ZhbmN5KHZvaWQqIG9wYXF1ZSwgTGluZUNvbnN1bWVyQ2FsbGJhY2sgY2FsbGJhY2spOworLy8gICBUaGlzIG9iamVjdCBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOgorLy8gICAgIC4uLgorLy8gICAgIExpbmVDb25zdW1lciBsaW5lQ29uc3VtZXI7CisvLyAgICAgZG9fc29tZXRoaW5nX2ZhbmN5KGxpbmVDb25zdW1lci5vcGFxdWUoKSwgTGluZUNvbnN1bWVyOjpDYWxsYmFjayk7CisvLyAgICAgZm9yZWFjaCAoY29uc3QgYXV0byYgbGluZSA6IGxpbmVDb25zdW1lci5saW5lcygpKSB7CisvLyAgICAgICAgIC8vIHByb2Nlc3MgZWFjaCBsaW5lIG9mIG91dHB1dC4KKy8vICAgICB9CisvLworY2xhc3MgTGluZUNvbnN1bWVyIHsKK3B1YmxpYzoKKyAgICBMaW5lQ29uc3VtZXIoKSA9IGRlZmF1bHQ7CisgICAgLy8gR2V0IGFuIG9iamVjdCB0byBiZSBwYXNzZWQgYXMgdGhlIHxvcGFxdWV8IGFyZ3VtZW50IGZvciB0aGUKKyAgICAvLyBMaW5lQ29uc3VtZXJDYWxsYmFjay4KKyAgICB2b2lkKiBvcGFxdWUoKSB7IHJldHVybiB0aGlzOyB9CisKKyAgICAvLyBQYXNzIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGNhbGxiYWNrLgorICAgIHN0YXRpYyBpbnQgQ2FsbGJhY2sodm9pZCogb3BhcXVlLCBjb25zdCBjaGFyKiBidWZmLCBpbnQgbGVuKTsKKworICAgIC8vIEFjY2VzcyB0aGUgbGluZXMgY29uc3VtZWQgYnkgdGhpcyBvYmplY3QuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsaW5lcygpIGNvbnN0IHsgcmV0dXJuIG1MaW5lczsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTGluZXM7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTGluZUNvbnN1bWVyKTsKK307CisKK30gIC8vIGVtdWxhdGlvbgorfSAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvTGluZUNvbnN1bWVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjZkOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0xpbmVDb25zdW1lci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordXNpbmcgYW5kcm9pZDo6ZW11bGF0aW9uOjpMaW5lQ29uc3VtZXI7CisKK1RFU1QoQ2FubmVkQ2FsbGJhY2tzLCBMaW5lQ29uc3VtZXJOdWxsVGVzdCkgeworICAgIExpbmVDb25zdW1lciBsaW5lQ29uc3VtZXI7CisgICAgRVhQRUNUX1RSVUUobGluZUNvbnN1bWVyLm9wYXF1ZSgpICE9IE5VTEwpOworICAgIEVYUEVDVF9UUlVFKGxpbmVDb25zdW1lci5saW5lcygpLmVtcHR5KCkpOworfQorCitURVNUKENhbm5lZENhbGxiYWNrcywgTGluZUNvbnN1bWVyTXVsdGlMaW5lKSB7CisgICAgY29uc3QgY2hhcioga0xpbmUwID0geyJhdmFzZGYzQDQlQCMlJFRcclxuIn07CisgICAgY29uc3QgY2hhcioga0xpbmUxID0geyJTb21lIGxpbmUifTsKKyAgICBjb25zdCBjaGFyKiBrTGluZTIgPSB7IlNvbWUgb3RoZXIgbGluZSJ9OworICAgIGNvbnN0IGNoYXIqIGtMaW5lMyA9IHsiIn07CisgICAgTGluZUNvbnN1bWVyIGxpbmVDb25zdW1lcjsKKyAgICBMaW5lQ29uc3VtZXI6OkNhbGxiYWNrKGxpbmVDb25zdW1lci5vcGFxdWUoKSwga0xpbmUwLCBzdHJsZW4oa0xpbmUwKSk7CisgICAgTGluZUNvbnN1bWVyOjpDYWxsYmFjayhsaW5lQ29uc3VtZXIub3BhcXVlKCksIGtMaW5lMSwgc3RybGVuKGtMaW5lMSkpOworICAgIExpbmVDb25zdW1lcjo6Q2FsbGJhY2sobGluZUNvbnN1bWVyLm9wYXF1ZSgpLCBrTGluZTIsIHN0cmxlbihrTGluZTIpKTsKKyAgICBMaW5lQ29uc3VtZXI6OkNhbGxiYWNrKGxpbmVDb25zdW1lci5vcGFxdWUoKSwga0xpbmUzLCBzdHJsZW4oa0xpbmUzKSk7CisKKyAgICBFWFBFQ1RfRVEoNCwgbGluZUNvbnN1bWVyLmxpbmVzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xpbmUwLCBsaW5lQ29uc3VtZXIubGluZXMoKVswXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xpbmUxLCBsaW5lQ29uc3VtZXIubGluZXMoKVsxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xpbmUyLCBsaW5lQ29uc3VtZXIubGluZXMoKVsyXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xpbmUzLCBsaW5lQ29uc3VtZXIubGluZXMoKVszXS5jX3N0cigpKTsKK30KKworVEVTVChDYW5uZWRDYWxsYmFja3MsIExpbmVDb25zdW1lckJhZEJ1ZmZlcnMpIHsKKyAgICAvLyBUaGlzIGJ1ZmZlciBpcyBsb25nZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGxlbmd0aC4KKyAgICBjb25zdCBjaGFyKiBrTG9uZ0xpbmUgPSB7ImFiY2RlZmdoaWprbG1uIn07CisgICAgLy8gVGhpcyBidWZmZXIgaXMgbm90IE5VTEwgdGVybWluYXRlZC4KKyAgICBjb25zdCBjaGFyIGtFbmRPZldvcmxkWzVdID0geydhJywgJ2InLCAnYycsICdkJywgJ2UnfTsKKyAgICBMaW5lQ29uc3VtZXIgbGluZUNvbnN1bWVyOworICAgIExpbmVDb25zdW1lcjo6Q2FsbGJhY2sobGluZUNvbnN1bWVyLm9wYXF1ZSgpLCBrTG9uZ0xpbmUsIDEwKTsKKyAgICBMaW5lQ29uc3VtZXI6OkNhbGxiYWNrKGxpbmVDb25zdW1lci5vcGFxdWUoKSwga0VuZE9mV29ybGQsIDUpOworCisgICAgRVhQRUNUX0VRKDIsIGxpbmVDb25zdW1lci5saW5lcygpLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhYmNkZWZnaGlqIiwgbGluZUNvbnN1bWVyLmxpbmVzKClbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhYmNkZSIsIGxpbmVDb25zdW1lci5saW5lcygpWzFdLmNfc3RyKCkpOworfQorCisvLyBUaGUgQVBJIHdpdGggd2hpY2ggd2UgdXNlIExpbmVDb25zdW1lciBpcyBvZnRlbiBDIEFQSS4KK2V4dGVybiAiQyIgeworCitzdGF0aWMgdm9pZCBjYWxsQ2FsbGJhY2sodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVDb25zdW1lckNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cikgeworICAgIGNhbGxiYWNrKG9wYXF1ZSwgc3RyLCBzdHJsZW4oc3RyKSk7Cit9Cit9CisKK1RFU1QoQ2FubmVkQ2FsbGJhY2tzLCBMaW5lQ29uc3VtZXJVc2VDYXNlKSB7CisgICAgY29uc3QgY2hhcioga0xpbmUgPSB7IlRoaXMgbGluZSJ9OworICAgIExpbmVDb25zdW1lciBsaW5lQ29uc3VtZXI7CisgICAgY2FsbENhbGxiYWNrKGxpbmVDb25zdW1lci5vcGFxdWUoKSwgJkxpbmVDb25zdW1lcjo6Q2FsbGJhY2ssIGtMaW5lKTsKKyAgICBFWFBFQ1RfRVEoMSwgbGluZUNvbnN1bWVyLmxpbmVzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa0xpbmUsIGxpbmVDb25zdW1lci5saW5lcygpWzBdLmNfc3RyKCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1NjcmVlbkNhcHR1cmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3MmMwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlci5jcHAKQEAgLTAsMCArMSw5OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXJhbGxlbFRhc2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy8gc3RhdGljCitjb25zdCBTeXN0ZW06OkR1cmF0aW9uIFNjcmVlbkNhcHR1cmVyOjprUHVsbFRpbWVvdXRNcyA9IDUwMDA7Citjb25zdCBjaGFyIFNjcmVlbkNhcHR1cmVyOjprUmVtb3RlU2NyZWVuc2hvdEZpbGVQYXRoW10gPQorICAgICAgICAiL2RhdGEvbG9jYWwvdG1wL3NjcmVlbi5wbmciOworLy8gSWYgeW91IHJ1biBzY3JlZW5jYXAgd2hpbGUgdXNpbmcgZW11bGF0b3Igb3ZlciByZW1vdGUgZGVza3RvcCwgdGhpcyBjYW4KKy8vIHRha2UuLi4gYSB3aGlsZS4KK2NvbnN0IFN5c3RlbTo6RHVyYXRpb24gU2NyZWVuQ2FwdHVyZXI6OmtTY3JlZW5DYXB0dXJlVGltZW91dE1zID0KKyAgICAgICAgU3lzdGVtOjprSW5maW5pdGU7CisKK1NjcmVlbkNhcHR1cmVyOjp+U2NyZWVuQ2FwdHVyZXIoKSB7CisgICAgaWYgKG1DYXB0dXJlQ29tbWFuZCkgeworICAgICAgICBtQ2FwdHVyZUNvbW1hbmQtPmNhbmNlbCgpOworICAgIH0KKyAgICBpZiAobVB1bGxDb21tYW5kKSB7CisgICAgICAgIG1QdWxsQ29tbWFuZC0+Y2FuY2VsKCk7CisgICAgfQorfQorCit2b2lkIFNjcmVlbkNhcHR1cmVyOjpjYXB0dXJlKGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgb3V0cHV0RGlyZWN0b3J5UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0Q2FsbGJhY2sgcmVzdWx0Q2FsbGJhY2spIHsKKyAgICBpZiAobUNhcHR1cmVDb21tYW5kIHx8IG1QdWxsQ29tbWFuZCkgeworICAgICAgICByZXN1bHRDYWxsYmFjayhSZXN1bHQ6OmtPcGVyYXRpb25JblByb2dyZXNzKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgb3V0X3BhdGggPSBvdXRwdXREaXJlY3RvcnlQYXRoOworICAgIG1DYXB0dXJlQ29tbWFuZCA9CisgICAgICAgIG1BZGItPnJ1bkFkYkNvbW1hbmQoCisgICAgICAgICAgICB7InNoZWxsIiwgInNjcmVlbmNhcCIsICItcCIsIGtSZW1vdGVTY3JlZW5zaG90RmlsZVBhdGggfSwKKyAgICAgICAgICAgIFt0aGlzLCByZXN1bHRDYWxsYmFjaywgb3V0X3BhdGhdKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQgfHwgcmVzdWx0LT5leGl0X2NvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2soUmVzdWx0OjprQ2FwdHVyZUZhaWxlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHVsbFNjcmVlbmNhcChyZXN1bHRDYWxsYmFjaywgb3V0X3BhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FwdHVyZUNvbW1hbmQucmVzZXQoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBrU2NyZWVuQ2FwdHVyZVRpbWVvdXRNcywKKyAgICAgICAgICAgIGZhbHNlKTsKK30KKwordm9pZCBTY3JlZW5DYXB0dXJlcjo6cHVsbFNjcmVlbmNhcChSZXN1bHRDYWxsYmFjayByZXN1bHRDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBvdXRwdXREaXJlY3RvcnlQYXRoKSB7CisgICAgaWYgKCFTeXN0ZW06OmdldCgpLT5wYXRoSXNEaXIob3V0cHV0RGlyZWN0b3J5UGF0aCkgfHwKKyAgICAgICAgIVN5c3RlbTo6Z2V0KCktPnBhdGhDYW5Xcml0ZShvdXRwdXREaXJlY3RvcnlQYXRoKSkgeworICAgICAgICByZXN1bHRDYWxsYmFjayhSZXN1bHQ6OmtTYXZlTG9jYXRpb25JbnZhbGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdXRvIGZpbGVOYW1lID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiU2NyZWVuc2hvdF8lbHUucG5nIiwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihTeXN0ZW06OmdldCgpLT5nZXRVbml4VGltZSgpKSk7CisgICAgICAgIGF1dG8gZmlsZVBhdGggPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOjpqb2luKG91dHB1dERpcmVjdG9yeVBhdGgsIGZpbGVOYW1lKTsKKyAgICAgICAgbVB1bGxDb21tYW5kID0KKyAgICAgICAgICAgIG1BZGItPnJ1bkFkYkNvbW1hbmQoCisgICAgICAgICAgICAgICAgeyJwdWxsIiwga1JlbW90ZVNjcmVlbnNob3RGaWxlUGF0aCwgZmlsZVBhdGh9LAorICAgICAgICAgICAgICAgIFt0aGlzLCByZXN1bHRDYWxsYmFja10oY29uc3QgT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAoIXJlc3VsdCB8fCByZXN1bHQtPmV4aXRfY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFJlc3VsdDo6a1B1bGxGYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFJlc3VsdDo6a1N1Y2Nlc3MpOworICAgICAgICAgICAgICAgICAgICBtUHVsbENvbW1hbmQucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGtQdWxsVGltZW91dE1zLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVsYXRpb24KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvU2NyZWVuQ2FwdHVyZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTY2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvU2NyZWVuQ2FwdHVyZXIuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BZGJJbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCitjbGFzcyBTY3JlZW5DYXB0dXJlciB7CitwdWJsaWM6CisgICAgZW51bSBjbGFzcyBSZXN1bHQgeworICAgICAgICBrU3VjY2VzcywKKyAgICAgICAga09wZXJhdGlvbkluUHJvZ3Jlc3MsCisgICAgICAgIGtDYXB0dXJlRmFpbGVkLAorICAgICAgICBrU2F2ZUxvY2F0aW9uSW52YWxpZCwKKyAgICAgICAga1B1bGxGYWlsZWQsCisgICAgICAgIGtVbmtub3duRXJyb3IKKyAgICB9OworCisgICAgdXNpbmcgUmVzdWx0Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoUmVzdWx0IHJlc3VsdCk+OworCisgICAgZXhwbGljaXQgU2NyZWVuQ2FwdHVyZXIoQWRiSW50ZXJmYWNlKiBhZGIpIDogbUFkYihhZGIpIHt9CisgICAgflNjcmVlbkNhcHR1cmVyKCk7CisKKyAgICAvLyBSdW5zIGFkYiBjb21tYW5kcyB0byBjYXB0dXJlIHRoZSBzY3JlZW4gYW5kIHB1bGwgdGhlIHNjcmVlbnNob3QgZnJvbQorICAgIC8vIHRoZSBkZXZpY2UuCisgICAgLy8gfG91dHB1dERpcmVjdG9yeVBhdGh8IHNob3VsZCBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkKKyAgICAvLyB0byB3aGljaCB0aGUgc2NyZWVuc2hvdCB3aWxsIGJlIHdyaXR0ZW4uIHxyZXN1bHRDYWxsYmFja3wgd2lsbAorICAgIC8vIGJlIGludm9rZWQgdXBvbiBjb21wbGV0aW9uLgorICAgIHZvaWQgY2FwdHVyZShhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IG91dHB1dERpcmVjdG9yeVBhdGgsCisgICAgICAgICAgICAgICAgIFJlc3VsdENhbGxiYWNrIHJlc3VsdENhbGxiYWNrKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHB1bGxTY3JlZW5jYXAoUmVzdWx0Q2FsbGJhY2sgcmVzdWx0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgb3V0cHV0RGlyZWN0b3J5UGF0aCk7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTo6RHVyYXRpb24ga1B1bGxUaW1lb3V0TXM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1JlbW90ZVNjcmVlbnNob3RGaWxlUGF0aFtdOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIGtTY3JlZW5DYXB0dXJlVGltZW91dE1zOworCisgICAgQWRiSW50ZXJmYWNlKiBtQWRiOworICAgIEFkYkNvbW1hbmRQdHIgbUNhcHR1cmVDb21tYW5kOworICAgIEFkYkNvbW1hbmRQdHIgbVB1bGxDb21tYW5kOworICAgIGNvbnN0IFJlc3VsdENhbGxiYWNrIG1SZXN1bHRDYWxsYmFjazsKKworICAgIHVuc2lnbmVkIG1Ob25EZWZhdWx0Q2hlY2tUaW1lb3V0Rm9yVGVzdE1zID0gMDsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY3JlZW5DYXB0dXJlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11bGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1NjcmVlbkNhcHR1cmVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4OTAwZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9TY3JlZW5DYXB0dXJlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvU2NyZWVuQ2FwdHVyZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1Rlc3RBZGJJbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjplbXVsYXRpb246OlNjcmVlbkNhcHR1cmVyOwordXNpbmcgYW5kcm9pZDo6ZW11bGF0aW9uOjpUZXN0QWRiSW50ZXJmYWNlOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworY2xhc3MgU2NyZWVuQ2FwdHVyZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgLy8gQ29udmVuaWVuY2UgdHlwZWRlZi4KKyAgICB1c2luZyBSZXN1bHQgPSBTY3JlZW5DYXB0dXJlcjo6UmVzdWx0OworCisgICAgU2NyZWVuQ2FwdHVyZXJUZXN0KCkKKyAgICAgICAgOiBtVGVzdFN5c3RlbSgiL3Byb2dkaXIiLAorICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICIvaG9tZWRpciIsCisgICAgICAgICAgICAgICAgICAgICAgIi9hcHBkaXIiKSB7fQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUludmFsaWRTaGVsbENvbW1hbmQgPSBmYWxzZTsKKyAgICAgICAgbUhhdmVSZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgbVRlc3RTeXN0ZW0uc2V0U2hlbGxDb21tYW5kKCZTY3JlZW5DYXB0dXJlclRlc3Q6OnNoZWxsQ21kSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBtTG9vcGVyID0gbmV3IGFuZHJvaWQ6OmJhc2U6OlRlc3RMb29wZXIoKTsKKyAgICAgICAgbUFkYi5yZXNldChuZXcgVGVzdEFkYkludGVyZmFjZShtTG9vcGVyLCAiYWRiIikpOworICAgICAgICBtQ2FwdHVyZXIucmVzZXQobmV3IFNjcmVlbkNhcHR1cmVyKG1BZGIuZ2V0KCkpKTsKKyAgICAgICAgbVRlc3RTeXN0ZW0uZ2V0VGVtcFJvb3QoKS0+bWFrZVN1YkRpcigiU2NyZWVuY2FwT3V0Iik7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gRW5zdXJlIHRoYXQgbm8gaGFuZ2luZyB0aHJlYWQgbWFrZXMgdGhlIG9iamVjdCB1bmRlYWQgYXQgdGhlIGVuZCBvZgorICAgICAgICAvLyB0aGUgdGVzdC4KKyAgICAgICAgbUNhcHR1cmVyLnJlc2V0KCk7CisgICAgICAgIG1BZGIucmVzZXQoKTsKKyAgICAgICAgZGVsZXRlIG1Mb29wZXI7CisgICAgfQorCisgICAgdm9pZCBsb29wZXJBZHZhbmNlKCkgeworICAgICAgICBhdXRvIG5vdyA9IG1UZXN0U3lzdGVtLmdldEhpZ2hSZXNUaW1lVXMoKTsKKyAgICAgICAgbm93ICs9IDEwMDA7CisgICAgICAgIG1Mb29wZXItPnJ1bk9uZUl0ZXJhdGlvbldpdGhEZWFkbGluZU1zKG5vdyAvIDEwMDApOworICAgICAgICBtVGVzdFN5c3RlbS5zZXRVbml4VGltZVVzKG5vdyk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgc2hlbGxDbWRIYW5kbGVyKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OkR1cmF0aW9uIHRpbWVvdXRNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUqIG91dEV4aXRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OlBpZCogb3V0Q2hpbGRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0RmlsZSkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U2NyZWVuQ2FwdHVyZXJUZXN0Kj4ob3BhcXVlKQorICAgICAgICAgICAgICAgIC0+c2hlbGxDbWRIYW5kbGVySW1wbChjb21tYW5kTGluZSwgdGltZW91dE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeGl0Q29kZSwgb3V0Q2hpbGRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUpOworICAgIH0KKworICAgIGJvb2wgc2hlbGxDbWRIYW5kbGVySW1wbChjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UHJvY2Vzc0V4aXRDb2RlKiBvdXRFeGl0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpQaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmKSB7CisgICAgICAgIGJvb2wgaXNTY3JlZW5jYXAgPQorICAgICAgICAgICAgc3RkOjpmaW5kKGNvbW1hbmRMaW5lLmJlZ2luKCksIGNvbW1hbmRMaW5lLmVuZCgpLCAic2NyZWVuY2FwIikgIT0gY29tbWFuZExpbmUuZW5kKCk7CisgICAgICAgIGJvb2wgaXNQdWxsID0KKyAgICAgICAgICAgIHN0ZDo6ZmluZChjb21tYW5kTGluZS5iZWdpbigpLCBjb21tYW5kTGluZS5lbmQoKSwgInB1bGwiKSAhPSBjb21tYW5kTGluZS5lbmQoKTsKKyAgICAgICAgLy8gQWx3YXlzIHBsYXkgbmljZSB3aXRoIHRoZSBleGl0IGNvZGUuCisgICAgICAgIGlmIChvdXRFeGl0Q29kZSkgeworICAgICAgICAgICAgKm91dEV4aXRDb2RlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNTY3JlZW5jYXAgJiYgIWlzUHVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG1DYXB0dXJlTXVzdFN1Y2NlZWQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXNQdWxsICYmICFpc1NjcmVlbmNhcCkgeworICAgICAgICAgICAgcmV0dXJuIG1QdWxsTXVzdFN1Y2NlZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW52YWxpZFNoZWxsQ29tbWFuZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlc3VsdFNhdmVyKFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgbVJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgbUhhdmVSZXN1bHQgPSB0cnVlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW0gbVRlc3RTeXN0ZW07CisgICAgYW5kcm9pZDo6YmFzZTo6VGVzdExvb3BlciogbUxvb3BlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdEFkYkludGVyZmFjZT4gbUFkYjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U2NyZWVuQ2FwdHVyZXI+IG1DYXB0dXJlcjsKKyAgICBib29sIG1DYXB0dXJlTXVzdFN1Y2NlZWQ7CisgICAgYm9vbCBtUHVsbE11c3RTdWNjZWVkOworICAgIGJvb2wgbUludmFsaWRTaGVsbENvbW1hbmQ7CisgICAgLy8gUmVzdWx0IGZyb20gdGhlIFNjcmVlbkNhcHR1cmVyIGNhbGxiYWNrIGlzIHNhdmVkIGhlcmUuCisgICAgUmVzdWx0IG1SZXN1bHQgPSBSZXN1bHQ6OmtVbmtub3duRXJyb3I7CisgICAgc3RkOjphdG9taWNfYm9vbCBtSGF2ZVJlc3VsdDsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTY3JlZW5DYXB0dXJlclRlc3QpOworfTsKKworVEVTVF9GKFNjcmVlbkNhcHR1cmVyVGVzdCwgc2NyZWVuc2hvdENhcHR1cmVGYWlsdXJlKSB7CisgICAgbUNhcHR1cmVNdXN0U3VjY2VlZCA9IGZhbHNlOworICAgIG1QdWxsTXVzdFN1Y2NlZWQgPSBmYWxzZTsKKyAgICBtQ2FwdHVyZXItPmNhcHR1cmUoIlNjcmVlbmNhcE91dCIsCisgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSAoU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdCByZXN1bHQpIHsgcmVzdWx0U2F2ZXIocmVzdWx0KTsgfSk7CisgICAgd2hpbGUgKCFtSGF2ZVJlc3VsdCkgeworICAgICAgICBsb29wZXJBZHZhbmNlKCk7CisgICAgfQorICAgIEVYUEVDVF9GQUxTRShtSW52YWxpZFNoZWxsQ29tbWFuZCk7CisgICAgRVhQRUNUX0VRKFJlc3VsdDo6a0NhcHR1cmVGYWlsZWQsIG1SZXN1bHQpOworfQorCitURVNUX0YoU2NyZWVuQ2FwdHVyZXJUZXN0LCBhZGJQdWxsRmFpbHVyZSkgeworICAgIG1DYXB0dXJlTXVzdFN1Y2NlZWQgPSB0cnVlOworICAgIG1QdWxsTXVzdFN1Y2NlZWQgPSBmYWxzZTsKKyAgICBtQ2FwdHVyZXItPmNhcHR1cmUoIlNjcmVlbmNhcE91dCIsCisgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSAoU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdCByZXN1bHQpIHsgcmVzdWx0U2F2ZXIocmVzdWx0KTsgfSk7CisgICAgd2hpbGUgKCFtSGF2ZVJlc3VsdCkgeworICAgICAgICBsb29wZXJBZHZhbmNlKCk7CisgICAgfQorICAgIEVYUEVDVF9GQUxTRShtSW52YWxpZFNoZWxsQ29tbWFuZCk7CisgICAgRVhQRUNUX0VRKFJlc3VsdDo6a1B1bGxGYWlsZWQsIG1SZXN1bHQpOworfQorCitURVNUX0YoU2NyZWVuQ2FwdHVyZXJUZXN0LCBzdWNjZXNzKSB7CisgICAgbUNhcHR1cmVNdXN0U3VjY2VlZCA9IHRydWU7CisgICAgbVB1bGxNdXN0U3VjY2VlZCA9IHRydWU7CisgICAgbUNhcHR1cmVyLT5jYXB0dXJlKCJTY3JlZW5jYXBPdXQiLAorICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10gKFNjcmVlbkNhcHR1cmVyOjpSZXN1bHQgcmVzdWx0KSB7IHJlc3VsdFNhdmVyKHJlc3VsdCk7IH0pOworICAgIHdoaWxlICghbUhhdmVSZXN1bHQpIHsKKyAgICAgICAgbG9vcGVyQWR2YW5jZSgpOworICAgIH0KKyAgICBFWFBFQ1RfRkFMU0UobUludmFsaWRTaGVsbENvbW1hbmQpOworICAgIEVYUEVDVF9FUShSZXN1bHQ6OmtTdWNjZXNzLCBtUmVzdWx0KTsKK30KKworVEVTVF9GKFNjcmVlbkNhcHR1cmVyVGVzdCwgc3luY2hyb25vdXNGYWlsdXJlcykgeworICAgIG1DYXB0dXJlci0+Y2FwdHVyZSgiU2NyZWVuY2FwT3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdIChTY3JlZW5DYXB0dXJlcjo6UmVzdWx0IHJlc3VsdCkgeyByZXN1bHRTYXZlcihyZXN1bHQpOyB9KTsKKyAgICBtQ2FwdHVyZXItPmNhcHR1cmUoIlNjcmVlbmNhcE91dCIsCisgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXSAoU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdCByZXN1bHQpIHsgcmVzdWx0U2F2ZXIocmVzdWx0KTsgfSk7CisgICAgRVhQRUNUX0VRKFJlc3VsdDo6a09wZXJhdGlvbkluUHJvZ3Jlc3MsIG1SZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1Rlc3RBZGJJbnRlcmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9UZXN0QWRiSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxNjgwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9UZXN0QWRiSW50ZXJmYWNlLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvQWRiSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbXVsYXRpb24geworCitjbGFzcyBUZXN0QWRiSW50ZXJmYWNlIGZpbmFsIDogcHVibGljIEFkYkludGVyZmFjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgVGVzdEFkYkludGVyZmFjZShhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgYWRiUGF0aCA9ICJhZGIiKQorICAgICAgICA6IG1Mb29wZXIobG9vcGVyKSwgbUFkYlBhdGgoYWRiUGF0aCkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0FkYlZlcnNpb25DdXJyZW50KCkgY29uc3Qgb3ZlcnJpZGUgZmluYWwgeworICAgICAgICByZXR1cm4gbUlzQWRiVmVyc2lvbkN1cnJlbnQ7CisgICAgfQorICAgIHZvaWQgc2V0Q3VzdG9tQWRiUGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgb3ZlcnJpZGUgZmluYWwge30KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXRlY3RlZEFkYlBhdGgoKSBjb25zdCBvdmVycmlkZSBmaW5hbCB7CisgICAgICAgIHJldHVybiBtQWRiUGF0aDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHNldFNlcmlhbE51bWJlclBvcnQoaW50IHBvcnQpIG92ZXJyaWRlIGZpbmFsIHt9CisKKyAgICB2b2lkIHNldEFkYk9wdGlvbnMoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBwYXRoLCBib29sIGlzVmVyc2lvbkN1cnJlbnQpIHsKKyAgICAgICAgbUlzQWRiVmVyc2lvbkN1cnJlbnQgPSBpc1ZlcnNpb25DdXJyZW50OworICAgICAgICBtQWRiUGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgdmlydHVhbCBBZGJDb21tYW5kUHRyIHJ1bkFkYkNvbW1hbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgT3B0aW9uYWxBZGJDb21tYW5kUmVzdWx0Jik+CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9jYWxsYmFjaywKKyAgICAgICAgICAgIGJhc2U6OlN5c3RlbTo6RHVyYXRpb24gdGltZW91dF9tcywKKyAgICAgICAgICAgIGJvb2wgd2FudF9vdXRwdXQgPSB0cnVlKSBvdmVycmlkZSBmaW5hbCB7CisgICAgICAgIGlmIChtUnVuQ29tbWFuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYWxsb3cgdGhlIHRlc3RpbmcgY29kZSB0byB2ZXJpZnkgdGhlIGFyZ3VtZW50cworICAgICAgICAgICAgbVJ1bkNvbW1hbmRDYWxsYmFjayhhcmdzLCByZXN1bHRfY2FsbGJhY2ssIHRpbWVvdXRfbXMsIHdhbnRfb3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICAvLyBKdXN0IGRvIHdoYXQgdGhlIHJlYWwgb25lIGRpZCAtIG1Mb29wZXIgaXMgdGhlIHRoaW5nIHRoYXQgY29udHJvbHMKKyAgICAgICAgLy8gdGhlIGNvbW1hbmQgZXhlY3V0aW9uLgorICAgICAgICBhdXRvIGNvbW1hbmQgPSBzdGQ6OnNoYXJlZF9wdHI8QWRiQ29tbWFuZD4oCisgICAgICAgICAgICAgICAgbmV3IEFkYkNvbW1hbmQobUxvb3BlciwgbUFkYlBhdGgsICJlbXVsYXRvci0wIiwgYXJncywgd2FudF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dF9tcywgcmVzdWx0X2NhbGxiYWNrKSk7CisgICAgICAgIGNvbW1hbmQtPnN0YXJ0KDEpOworICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICB9CisKKyAgICB1c2luZyBSdW5Db21tYW5kQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IE9wdGlvbmFsQWRiQ29tbWFuZFJlc3VsdCYpPiwKKyAgICAgICAgICAgIGJhc2U6OlN5c3RlbTo6RHVyYXRpb24sCisgICAgICAgICAgICBib29sKT47CisKKyAgICB2b2lkIHNldFJ1bkNvbW1hbmRDYWxsYmFjayhSdW5Db21tYW5kQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgbVJ1bkNvbW1hbmRDYWxsYmFjayA9IGNiOworICAgIH0KKworcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXIqIG1Mb29wZXI7CisgICAgYm9vbCBtSXNBZGJWZXJzaW9uQ3VycmVudCA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIG1BZGJQYXRoOworICAgIFJ1bkNvbW1hbmRDYWxsYmFjayBtUnVuQ29tbWFuZENhbGxiYWNrOworfTsKKworfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2JhdHRlcnlfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9iYXR0ZXJ5X2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczNTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9iYXR0ZXJ5X2FnZW50LmgKQEAgLTAsMCArMSw5OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jYWxsYmFja3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK2VudW0gQmF0dGVyeUNoYXJnZXIgeworICAgIEJBVFRFUllfQ0hBUkdFUl9OT05FLAorICAgIEJBVFRFUllfQ0hBUkdFUl9BQywKKyAgICAvLyBUT0RPOiBUaGUgVUkgb25seSBhbGxvd3MgTk9ORSBhbmQgQUMuCisgICAgLy8gICAgICAgTmVlZCB0byBhbHNvIGFsbG93IGFuZCBpbXBsZW1lbnQgVVNCIGFuZCBXSVJFTEVTUy4KKyAgICBCQVRURVJZX0NIQVJHRVJfVVNCLAorICAgIEJBVFRFUllfQ0hBUkdFUl9XSVJFTEVTUywKKyAgICBCQVRURVJZX0NIQVJHRVJfTlVNX0VOVFJJRVMKK307CisKK2VudW0gQmF0dGVyeUhlYWx0aCB7CisgICAgQkFUVEVSWV9IRUFMVEhfR09PRCwKKyAgICBCQVRURVJZX0hFQUxUSF9GQUlMRUQsCisgICAgQkFUVEVSWV9IRUFMVEhfREVBRCwKKyAgICBCQVRURVJZX0hFQUxUSF9PVkVSVk9MVEFHRSwKKyAgICBCQVRURVJZX0hFQUxUSF9PVkVSSEVBVEVELAorICAgIEJBVFRFUllfSEVBTFRIX1VOS05PV04sCisgICAgQkFUVEVSWV9IRUFMVEhfTlVNX0VOVFJJRVMKK307CisKK2VudW0gQmF0dGVyeVN0YXR1cyB7CisgICAgQkFUVEVSWV9TVEFUVVNfVU5LTk9XTiwKKyAgICBCQVRURVJZX1NUQVRVU19DSEFSR0lORywKKyAgICBCQVRURVJZX1NUQVRVU19ESVNDSEFSR0lORywKKyAgICBCQVRURVJZX1NUQVRVU19OT1RfQ0hBUkdJTkcsCisgICAgQkFUVEVSWV9TVEFUVVNfRlVMTCwKKyAgICBCQVRURVJZX1NUQVRVU19OVU1fRU5UUklFUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUUFuZHJvaWRCYXR0ZXJ5QWdlbnQgeworICAgIC8vIFNldHMgd2hldGhlciB0aGUgYmF0dGVyeSBpcyBwcmVzZW50IG9yIG5vdAorICAgIHZvaWQgKCpzZXRJc0JhdHRlcnlQcmVzZW50KShib29sIGlzUHJlc2VudCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGJhdHRlcnkgaXMgcHJlc2VudCBvciBub3QKKyAgICBib29sICgqcHJlc2VudCkoKTsKKworICAgIC8vIFNldHMgd2hldGhlciB0aGUgYmF0dGVyeSBpcyBjaGFyZ2luZyBvciBub3QKKyAgICB2b2lkICgqc2V0SXNDaGFyZ2luZykoYm9vbCBpc0NoYXJnaW5nKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciB0aGUgYmF0dGVyeSBpcyBjaGFyZ2luZyBvciBub3QKKyAgICBib29sICgqY2hhcmdpbmcpKCk7CisKKyAgICAvLyBTZXQgd2hhdCB0eXBlIG9mIGNoYXJnZXIgaXMgYmVpbmcgdXNlZAorICAgIHZvaWQgKCpzZXRDaGFyZ2VyKShlbnVtIEJhdHRlcnlDaGFyZ2VyIGNoYXJnZXIpOworCisgICAgLy8gUmV0dXJucyB3aGF0IHR5cGUgb2YgY2hhcmdlciBpcyBiZWluZyB1c2VkCisgICAgZW51bSBCYXR0ZXJ5Q2hhcmdlciAoKmNoYXJnZXIpKCk7CisKKyAgICAvLyBTZXRzIHRoZSBjdXJyZW50IGNoYXJnZSBsZXZlbAorICAgIC8vIElucHV0OiB8cGVyY2VudEZ1bGx8IGludGVnZXIgcGVyY2VudGFnZSwgMCAuLiAxMDAKKyAgICB2b2lkICgqc2V0Q2hhcmdlTGV2ZWwpKGludCBwZXJjZW50RnVsbCk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IGNoYXJnZSBsZXZlbCBhcyBhCisgICAgLy8gcGVyY2VudGFnZSwgMCAuLiAxMDAKKyAgICBpbnQgKCpjaGFyZ2VMZXZlbCkoKTsKKworICAgIC8vIFNldHMgdGhlIGJhdHRlcnkgaGVhbHRoCisgICAgLy8gSW5wdXQ6IHxoZWFsdGh8IG9uZSBvZiB0aGUgQmF0dGVyeUhlYWx0aCBlbnVtIHZhbHVlcywgYWJvdmUKKyAgICB2b2lkICgqc2V0SGVhbHRoKShlbnVtIEJhdHRlcnlIZWFsdGggaGVhbHRoKTsKKworICAgIC8vIFJldHVybnMgdGhlIGJhdHRlcnkgaGVhbHRoIGFzIG9uZSBvZiB0aGUgQmF0dGVyeUhlYWx0aAorICAgIC8vIGVudW0gdmFsdWVzLCBhYm92ZQorICAgIGVudW0gQmF0dGVyeUhlYWx0aCAoKmhlYWx0aCkoKTsKKworICAgIC8vIFNldHMgdGhlIGJhdHRlcnkgc3RhdHVzCisgICAgLy8gSW5wdXQ6IHxzdGF0dXN8IG9uZSBvZiB0aGUgQmF0dGVyeVN0YXR1cyBlbnVtIHZhbHVlcywgYWJvdmUKKyAgICB2b2lkICgqc2V0U3RhdHVzKShlbnVtIEJhdHRlcnlTdGF0dXMgc3RhdHVzKTsKKworICAgIC8vIFJldHVybnMgdGhlIGJhdHRlcnkgc3RhdHVzIGFzIG9uZSBvZiB0aGUgQmF0dGVyeVN0YXR1cworICAgIC8vIGVudW0gdmFsdWVzLCBhYm92ZQorICAgIGVudW0gQmF0dGVyeVN0YXR1cyAoKnN0YXR1cykoKTsKKworICAgIC8vIFF1ZXJ5IHRoZSBiYXR0ZXJ5IHN0YXRlCisgICAgdm9pZCAoKmJhdHRlcnlEaXNwbGF5KSh2b2lkKiBvcGFxdWUsIExpbmVDb25zdW1lckNhbGxiYWNrIG91dHB1dENhbGxiYWNrKTsKK30gUUFuZHJvaWRCYXR0ZXJ5QWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2NhbGxiYWNrcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2NhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGQyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvY2FsbGJhY2tzLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjb21tb24gY2FsbGJhY2tzIHVzZWQgYnkgdGhlIGludGVyZmFjZXMgZGVmaW5lZCBmb3IKKy8vIEFuZHJvaWRFbXUgPC0tPiBRRU1VIGludGVyYWN0aW9uLgorCisvLyBBIGNhbGxiYWNrIHRvIGNvbnN1bWUgYSBzaW5nbGUgbGluZSBvZiBvdXRwdXQgKGluY2x1ZGluZyBuZXdsaW5lKS4KKy8vIHxvcHF1ZXwgaXMgYSBoYW5kbGUgdG8gYSBjb250ZXh0IG9iamVjdC4gRnVuY3Rpb25zIHRoYXQgdXNlIHRoaXMgY2FsbGJhY2sKKy8vIHdpbGwgYWxzbyB0YWtlIGEgY29udGV4dCBoYW5kbGUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suCisvLyB8YnVmZnwgY29udGFpbnMgdGhlIGRhdGEgdG8gYmUgY29uc3VtZWQsIG9mIGxlbmd0aCB8bGVufC4KKy8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LgordHlwZWRlZiBpbnQgKCpMaW5lQ29uc3VtZXJDYWxsYmFjaykodm9pZCogb3BhcXVlLCBjb25zdCBjaGFyKiBidWZmLCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jZWxsdWxhcl9hZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2NlbGx1bGFyX2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxODFjMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jZWxsdWxhcl9hZ2VudC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworZW51bSBDZWxsdWxhclN0YXR1cyB7IENlbGx1bGFyX1N0YXRfSG9tZSwgICBDZWxsdWxhcl9TdGF0X1JvYW1pbmcsIENlbGx1bGFyX1N0YXRfU2VhcmNoaW5nLAorICAgICAgICAgICAgICAgICAgICAgIENlbGx1bGFyX1N0YXRfRGVuaWVkLCBDZWxsdWxhcl9TdGF0X1VucmVnaXN0ZXJlZCB9OworCitlbnVtIENlbGx1bGFyU3RhbmRhcmQgeyBDZWxsdWxhcl9TdGRfR1NNLCAgQ2VsbHVsYXJfU3RkX0hTQ1NELCBDZWxsdWxhcl9TdGRfR1BSUywgQ2VsbHVsYXJfU3RkX0VER0UsCisgICAgICAgICAgICAgICAgICAgICAgICBDZWxsdWxhcl9TdGRfVU1UUywgQ2VsbHVsYXJfU3RkX0hTRFBBLCBDZWxsdWxhcl9TdGRfTFRFLCBDZWxsdWxhcl9TdGRfZnVsbCB9OworCitlbnVtIENlbGx1bGFyU2lnbmFsIHsgQ2VsbHVsYXJfU2lnbmFsX05vbmUsIENlbGx1bGFyX1NpZ25hbF9Qb29yLCBDZWxsdWxhcl9TaWduYWxfTW9kZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU2lnbmFsX0dvb2QsIENlbGx1bGFyX1NpZ25hbF9HcmVhdCB9OworCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZENlbGx1bGFyQWdlbnQgeworICAgIC8vIFNldHMgdGhlIGNlbGx1bGFyIHNpZ25hbCBzdHJlbmd0aAorICAgIC8vIElucHV0OiAwKG5vbmUpIC4uIDMxKHZlcnkgc3Ryb25nKQorICAgIHZvaWQgKCpzZXRTaWduYWxTdHJlbmd0aCkoaW50IHplcm9UbzMxKTsKKworICAgIC8vIFNldHMgdGhlIGNlbGx1bGFyIHNpZ25hbCBzdHJlbmd0aAorICAgIC8vIElucHV0OiBlbnVtIENlbGx1bGFyU2lnbmFsLCBhYm92ZQorICAgIHZvaWQgKCpzZXRTaWduYWxTdHJlbmd0aFByb2ZpbGUpKGVudW0gQ2VsbHVsYXJTaWduYWwpOworCisgICAgLy8gU2V0cyB0aGUgc3RhdHVzIG9mIHRoZSB2b2ljZSBjb25uZWN0aXZpdHkKKyAgICAvLyBJbnB1dDogZW51bSBDZWxsdWxhclN0YXR1cywgYWJvdmUKKyAgICB2b2lkICgqc2V0Vm9pY2VTdGF0dXMpKGVudW0gQ2VsbHVsYXJTdGF0dXMpOworCisgICAgLy8gU2V0cyB0aGUgc3RhdHVzIG9mIHRoZSBkYXRhIGNvbm5lY3Rpdml0eQorICAgIC8vIElucHV0OiBlbnVtIENlbGx1bGFyU3RhdHVzLCBhYm92ZQorICAgIHZvaWQgKCpzZXREYXRhU3RhdHVzKShlbnVtIENlbGx1bGFyU3RhdHVzKTsKKworICAgIC8vIFNldHMgdGhlIGNlbGx1bGFyIGRhdGEgc3RhbmRhcmQgaW4gdXNlCisgICAgLy8gSW5wdXQ6IGVudW0gQ2VsbHVsYXJTdGFuZGFyZCwgYWJvdmUKKyAgICB2b2lkICgqc2V0U3RhbmRhcmQpKGVudW0gQ2VsbHVsYXJTdGFuZGFyZCk7Cit9IFFBbmRyb2lkQ2VsbHVsYXJBZ2VudDsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvY2xpcGJvYXJkX2FnZW50LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvY2xpcGJvYXJkX2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5OTg0NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jbGlwYm9hcmRfYWdlbnQuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK3R5cGVkZWYgc3RydWN0IFFBbmRyb2lkQ2xpcGJvYXJkQWdlbnQgeworICAgIC8vIFNldHMgYSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGd1ZXN0J3MgY2xpcGJvYXJkIGNvbnRlbnQgY2hhbmdlcworICAgIC8vIGFzIGEgcmVzdWx0IG9mIGFuIGFjdGlvbiBpbnNpZGUgdGhlIGd1ZXN0LgorICAgIC8vIHxjYnwgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uCisgICAgdm9pZCAoKnNldEd1ZXN0Q2xpcGJvYXJkQ2FsbGJhY2spKAorICAgICAgICB2b2lkKCpjYikoY29uc3QgdWludDhfdCosIHNpemVfdCkpOworCisgICAgLy8gU2V0cyB0aGUgY29udGVudHMgb2YgdGhlIGd1ZXN0IGNsaXBib2FyZC4KKyAgICAvLyB8YnVmfCBpcyB0aGUgY29udGVudCB0byBwYXNzLCBsZW4gaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB8YnVmfC4KKyAgICB2b2lkICgqc2V0R3Vlc3RDbGlwYm9hcmRDb250ZW50cykoCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKKyAgICAgICAgc2l6ZV90IGxlbik7Cit9IFFBbmRyb2lkQ2xpcGJvYXJkQWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2Rpc3BsYXlfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9kaXNwbGF5X2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2NjhmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9kaXNwbGF5X2FnZW50LmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGZvciBRZW11IGRpc3BsYXkgaW50ZXJhY3Rpb24KKworLy8gQ2FsbGVkIHdoZW4gZGlzcGxheSBpcyB1cGRhdGVkCisvLyB8b3BhcXVlfCAtIGEgdXNlci1zdXBwbGllZCB2YWx1ZSB0byBwYXNzIGJhY2sKKy8vIHx4fCwgfHl8LCB8d3wsIHxofCAtIGJvdW5kYXJpZXMgb2YgdGhlIHVwZGF0ZWQgYXJlYQordHlwZWRlZiB2b2lkICgqQW5kcm9pZERpc3BsYXlVcGRhdGVDYWxsYmFjaykodm9pZCogb3BhcXVlLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZERpc3BsYXlBZ2VudCB7CisgICAgLy8gRmlsbHMgaW4gZnJhbWUgYnVmZmVyIHBhcmFtZXRlcnMgaW50byB0aGUgcGFzc2VkIHZhcmlhYmxlcworICAgIC8vIHx3fCwgfGh8IC0gd2lkdGggYW5kIGhlaWdodAorICAgIC8vIHxsaW5lU2l6ZXwgLSBieXRlcyBwZXIgbGluZQorICAgIC8vIHxieXRlc1BlclBpeGVsfCAtIGJ5dGVzIHBlciBwaXhlbAorICAgIC8vIHxmcmFtZUJ1ZmZlckRhdGF8IC0gcG9pbnRlciB0byB0aGUgcmF3IGZyYW1lIGJ1ZmZlciBkYXRhCisgICAgdm9pZCAoKmdldEZyYW1lQnVmZmVyKShpbnQqIHcsIGludCogaCwgaW50KiBsaW5lU2l6ZSwgaW50KiBieXRlc1BlclBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGZyYW1lQnVmZmVyRGF0YSk7CisKKyAgICAvLyBSZWdpc3RlcnMgYSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgZXZlcnkgdGltZSBmcmFtZSBidWZmZXIgY29udGVudAorICAgIC8vIGlzIHVwZGF0ZWQKKyAgICAvLyB8Y2FsbGJhY2t8IC0gYSBjYWxsYmFjayB0byBjYWxsCisgICAgLy8gfG9wYXF1ZXwgLSB1c2VyIGRhdGEgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sKKyAgICB2b2lkICgqcmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcikoQW5kcm9pZERpc3BsYXlVcGRhdGVDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKTsKK30gUUFuZHJvaWREaXNwbGF5QWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2Zpbmdlcl9hZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2Zpbmdlcl9hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMmM2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvZmluZ2VyX2FnZW50LmgKQEAgLTAsMCArMSwyNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZEZpbmdlckFnZW50IHsKKyAgICB2b2lkICgqc2V0VG91Y2gpKGJvb2wgaXNUb3VjaGluZywgaW50IHRvdWNoSWQpOworfSBRQW5kcm9pZEZpbmdlckFnZW50OworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9sb2NhdGlvbl9hZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2xvY2F0aW9uX2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhNjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9sb2NhdGlvbl9hZ2VudC5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZExvY2F0aW9uQWdlbnQgeworICAgIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlIGRldmljZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBHUFMuCisgICAgYm9vbCAoKmdwc0lzU3VwcG9ydGVkKSh2b2lkKTsKKworICAgIC8vIFNlbmQgYSBHUFMgbG9jYXRpb24gdG8gdGhlIEFWRCB1c2luZyBhbiBOTUVBIHNlbnRlbmNlCisgICAgLy8gICB8bGF0aXR1ZGV8IGFuZCB8bG9uZ2l0dWRlfCBhcmUgaW4gZGVncmVlcworICAgIC8vICAgfG1ldGVyc0VsZXZhdGlvbnwgaXMgbWV0ZXJzIGFib3ZlIHNlYSBsZXZlbAorICAgIC8vICAgfG5TYXRlbGxpdGVzfCBpcyB0aGUgbnVtYmVyIG9mIHNhdGVsbGl0ZXMgdXNlZAorICAgIC8vICAgfHRpbWV8IGlzIFVUQywgaW4gdGhlIGZvcm1hdCBwcm92aWRlZCBieSBnZXR0aW1lb2ZkYXkoKQorICAgIHZvaWQgKCpncHNTZW5kTG9jKShkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtZXRlcnNFbGV2YXRpb24sIGludCBuU2F0ZWxsaXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRpbWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IGRldmljZSBsb2NhdGlvbgorICAgIC8vCisgICAgLy8gUmV0dXJucyAxIGlmIHRoZSBkZXZpY2UgbG9jYXRpb24gd2FzIHN1Y2Nlc3NmdWxseQorICAgIC8vICAgcmVjZWl2ZWQgZnJvbSB0aGUgZGV2aWNlLCAwIGlmIHVuc3VjY2Vzc2Z1bAorICAgIC8vIElmIHRoZSByZXR1cm4gaXMgMSwgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIHNldDoKKyAgICAvLyAgIHxvdXRMYXRpdHVkZXwgYW5kIHxvdXRMb25naXR1ZGV8IGFyZSBpbiBkZWdyZWVzCisgICAgLy8gICB8b3V0TWV0ZXJzRWxldmF0aW9ufCBpcyBtZXRlcnMgYWJvdmUgc2VhIGxldmVsCisgICAgLy8gICB8b3V0TlNhdGVsbGl0ZXN8IGlzIHRoZSBudW1iZXIgb2Ygc2F0ZWxsaXRlcyB1c2VkCisgICAgLy8gTnVsbCAnb3V0JyBwb2ludGVycyBhcmUgc2FmZWx5IGlnbm9yZWQuCisgICAgaW50ICgqZ3BzR2V0TG9jKShkb3VibGUqIG91dExhdGl0dWRlLCBkb3VibGUqIG91dExvbmdpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogb3V0TWV0ZXJzRWxldmF0aW9uLCBpbnQqIG91dE5TYXRlbGxpdGVzKTsKKworICAgIC8vIFNlbmQgYW4gTk1FQSBmaXggc2VudGVuY2UgdG8gdGhlIGRldmljZS4KKyAgICB2b2lkICgqZ3BzU2VuZE5tZWEpKGNvbnN0IGNoYXIqIHNlbnRlbmNlKTsKK30gUUFuZHJvaWRMb2NhdGlvbkFnZW50OworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9uZXRfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9uZXRfYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGViYTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL25ldF9hZ2VudC5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKwordHlwZWRlZiBzdHJ1Y3QgUUFuZHJvaWROZXRBZ2VudCB7CisgICAgYm9vbCAoKmlzU2xpcnBJbml0ZWQpKCk7CisgICAgYm9vbCAoKnNsaXJwUmVkaXIpKGJvb2wgaXNVZHAsIGludCBob3N0UG9ydCwgdWludDMyX3QgZ3Vlc3RBZGRyLCBpbnQgZ3Vlc3RQb3J0KTsKKyAgICBib29sICgqc2xpcnBVbnJlZGlyKShib29sIGlzVWRwLCBpbnQgaG9zdFBvcnQpOworfSBRQW5kcm9pZE5ldEFnZW50OworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9zZW5zb3JzX2FnZW50LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvc2Vuc29yc19hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjNiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvc2Vuc29yc19hZ2VudC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKwordHlwZWRlZiBzdHJ1Y3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQgeworICAgIC8vIFNldHMgdGhlIHZhbHVlcyBvbiBhIGdpdmVuIHNlbnNvci4KKyAgICAvLyBJbnB1dDogfHNlbnNvcklkfCBkZXRlcm1pbmVzIHdoaWNoIHNlbnNvcidzIHZhbHVlcyB0byBzZXQsIGkuZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT04sIEFORFJPSURfU0VOU09SX1BST1hJTUlUWSwKKyAgICAvLyAgICAgICAgICAgICAgICAgICBldGMuCisgICAgaW50ICgqc2V0U2Vuc29yKShpbnQgc2Vuc29ySWQsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpOworCisgICAgLy8gUmVhZHMgdGhlIHZhbHVlcyBmcm9tIGEgZ2l2ZW4gc2Vuc29yLgorICAgIC8vIElucHV0OiB8c2Vuc29ySWR8IGRldGVybWluZXMgd2hpY2ggc2Vuc29yJ3MgdmFsdWVzIHRvIHJldHJpZXZlLgorICAgIGludCAoKmdldFNlbnNvcikoaW50IHNlbnNvcklkLCBmbG9hdCAqYSwgZmxvYXQgKmIsIGZsb2F0ICpjKTsKK30gUUFuZHJvaWRTZW5zb3JzQWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3RlbGVwaG9ueV9hZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3RlbGVwaG9ueV9hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYWNiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdGVsZXBob255X2FnZW50LmgKQEAgLTAsMCArMSw0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK3R5cGVkZWYgZW51bSB7CisgICAgVGVsX09wX0luaXRfQ2FsbCwKKyAgICBUZWxfT3BfQWNjZXB0X0NhbGwsCisgICAgVGVsX09wX1JlamVjdF9DYWxsX0V4cGxpY2l0LAorICAgIFRlbF9PcF9SZWplY3RfQ2FsbF9CdXN5LAorICAgIFRlbF9PcF9EaXNjb25uZWN0X0NhbGwsCisgICAgVGVsX09wX1BsYWNlX0NhbGxfT25fSG9sZCwKKyAgICBUZWxfT3BfVGFrZV9DYWxsX09mZl9Ib2xkCit9IFRlbGVwaG9ueU9wZXJhdGlvbjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUZWxfUmVzcF9PSywKKyAgICBUZWxfUmVzcF9CYWRfT3BlcmF0aW9uLCAgLy8gRW51bSBvdXQgb2YgcmFuZ2UKKyAgICBUZWxfUmVzcF9CYWRfTnVtYmVyLCAgICAgLy8gTWFsLWZvcm1lZCB0ZWxlcGhvbmUgbnVtYmVyCisgICAgVGVsX1Jlc3BfSW52YWxpZF9BY3Rpb24sIC8vIEUuZy4sIGRpc2Nvbm5lY3Qgd2hlbiBubyBjYWxsIGlzIGluIHByb2dyZXNzCisgICAgVGVsX1Jlc3BfQWN0aW9uX0ZhaWxlZCAgIC8vIEludGVybmFsIGVycm9yCit9IFRlbGVwaG9ueVJlc3BvbnNlOworCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50IHsKKyAgICBUZWxlcGhvbnlSZXNwb25zZSAoKnRlbGVwaG9ueUNtZCkoVGVsZXBob255T3BlcmF0aW9uIG9wLCBjb25zdCBjaGFyICpwaG9uZU51bWJlcik7CisgICAgdm9pZCAoKmluaXRNb2RlbSkoaW50IGJhc2VQb3J0KTsKKyAgICBBTW9kZW0gKCpnZXRNb2RlbSkodm9pZCk7Cit9IFFBbmRyb2lkVGVsZXBob255QWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3VzZXJfZXZlbnRfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC91c2VyX2V2ZW50X2FnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyMjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC91c2VyX2V2ZW50X2FnZW50LmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBDIGludGVyZmFjZSB0byBleHBvc2UgUWVtdSBpbXBsZW1lbnRhdGlvbiBvZiB1c2VyIGV2ZW50IHBpcGluZyB0byB0aGUgVk0uCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZFVzZXJFdmVudEFnZW50IHsKKyAgICAvLyBTZW5kIHZhcmlvdXMgaW5wdXQgdXNlciBldmVudHMgdG8gdGhlIFZNLgorICAgIC8vIE5vdGUgdGhhdCBrZXljb2RlcyBhcmUgYWxsIG5vbi1uZWdhdGl2ZS4gQnV0IHRoZSB3b3JsZCBpcyBhIGRyZWFyeSBwbGFjZQorICAgIC8vIGFuZCBldmVyeW9uZSBhY2NlcHRzIGludCBmb3Iga2V5Y29kZXMsIHNvIHdlIGRvIGFzIHRoZSBSb21hbnMgZG8uCisgICAgdm9pZCAoKnNlbmRLZXkpKHVuc2lnbmVkIGtleSwgYm9vbCBkb3duKTsKKyAgICB2b2lkICgqc2VuZEtleUNvZGUpKGludCBrZXkpOworICAgIHZvaWQgKCpzZW5kS2V5Q29kZXMpKGludCoga2V5Y29kZXMsIGludCBjb3VudCk7CisKKyAgICAvLyBNb3VzZSBldmVudC4KKyAgICB2b2lkICgqc2VuZE1vdXNlRXZlbnQpKGludCBkeCwgaW50IGR5LCBpbnQgZHosIGludCBidXR0b25zU3RhdGUpOworCisgICAgLy8gU2VuZCBnZW5lcmljIGlucHV0IGV2ZW50cy4KKyAgICB2b2lkICgqc2VuZEdlbmVyaWNFdmVudCkoaW50IHR5cGUsIGludCBjb2RlLCBpbnQgdmFsdWUpOworCisgICAgLy8gbm90aWZ5IHRoZSBlbXVsYXRvciB0aGF0IG5ldyB1c2VyIGV2ZW50IGlzIGF2YWlsYWJsZQorICAgIHZvaWQgKCpvbk5ld1VzZXJFdmVudCkodm9pZCk7Cit9IFFBbmRyb2lkVXNlckV2ZW50QWdlbnQ7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3ZtX29wZXJhdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC92bV9vcGVyYXRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3ODNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC92bV9vcGVyYXRpb25zLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jYWxsYmFja3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIEMgaW50ZXJmYWNlIHRvIGV4cG9zZSBRZW11IGltcGxlbWVudGF0aW9ucyBvZiBjb21tb24gVk0gcmVsYXRlZCBvcGVyYXRpb25zLgordHlwZWRlZiBzdHJ1Y3QgUUFuZHJvaWRWbU9wZXJhdGlvbnMgeworICAgIGJvb2wgKCp2bVN0b3ApKHZvaWQpOworICAgIGJvb2wgKCp2bVN0YXJ0KSh2b2lkKTsKKyAgICBib29sICgqdm1Jc1J1bm5pbmcpKHZvaWQpOworCisgICAgLy8gU25hcHNob3QtcmVsYXRlZCBWTSBvcGVyYXRpb25zLgorICAgIC8vIHxvdXRDb25zdWVyfCBhbmQgfGVyckNvbnN1bWVyfCBhcmUgdXNlZCB0byByZXBvcnQgb3V0cHV0IC8gZXJyb3IKKyAgICAvLyByZXNwZWN0aXZlbHkuIEVhY2ggbGluZSBvZiBvdXRwdXQgaXMgbmV3bGluZSB0ZXJtaW5hdGVkIGFuZCByZXN1bHRzIGluCisgICAgLy8gb25lIGNhbGwgdG8gdGhlIGNhbGxiYWNrLiB8b3BhcXVlfCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrcyBhcyBjb250ZXh0LgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorICAgIGJvb2wgKCpzbmFwc2hvdExpc3QpKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXJDYWxsYmFjayBvdXRDb25zdW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXJDYWxsYmFjayBlcnJDb25zdW1lcik7CisgICAgYm9vbCAoKnNuYXBzaG90U2F2ZSkoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUNvbnN1bWVyQ2FsbGJhY2sgZXJyQ29uc3VtZXIpOworICAgIGJvb2wgKCpzbmFwc2hvdExvYWQpKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVDb25zdW1lckNhbGxiYWNrIGVyckNvbnN1bWVyKTsKKyAgICBib29sICgqc25hcHNob3REZWxldGUpKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXJDYWxsYmFjayBlcnJDb25zdW1lcik7Cit9IFFBbmRyb2lkVm1PcGVyYXRpb25zOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC93aW5kb3dfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC93aW5kb3dfYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTJmYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3dpbmRvd19hZ2VudC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0b3Itd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCit0eXBlZGVmIHN0cnVjdCBRQW5kcm9pZEVtdWxhdG9yV2luZG93QWdlbnQgeworICAgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGVtdWxhdG9yIHdpbmRvdyBzdHJ1Y3R1cmUuCisgICAgRW11bGF0b3JXaW5kb3cqICgqZ2V0RW11bGF0b3JXaW5kb3cpKCk7Cit9IFFBbmRyb2lkRW11bGF0b3JXaW5kb3dBZ2VudDsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2dvbGRmaXNoX3N5bmMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9nb2xkZmlzaF9zeW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjc5NTNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9nb2xkZmlzaF9zeW5jLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2dvbGRmaXNoX3N5bmMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9Hb2xkZmlzaFN5bmNDb21tYW5kUXVldWUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL0xvb2t1cC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Db25kaXRpb25WYXJpYWJsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hc3NlcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6Q29uZGl0aW9uVmFyaWFibGU7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb2NrOwordXNpbmcgYW5kcm9pZDo6R29sZGZpc2hTeW5jQ29tbWFuZFF1ZXVlOworCisvLyBDb21tYW5kcyBjYW4gYmUgdGFnZ2VkIHdpdGggd2l0aCB1bmlxdWUgaWQncywKKy8vIHNvIHRoYXQgZm9yIHRoZSBjb21tYW5kcyB0aGF0IHJlcXVpcmUgYSByZXBseQorLy8gZnJvbSB0aGUgZ3Vlc3QsIHdlIHNpZ25hbCB0aGVtIHByb3Blcmx5Lgorc3RhdGljIHVpbnQ2NF90IHNVbmlxdWVJZCA9IDA7CisvLyBXaGVuIHdlIHRyYWNrIGNvbW1hbmQgY29tcGxldGlvbiwgd2UgbmVlZCB0byBiZQorLy8gY2FyZWZ1bCBhYm91dCBjb25jdXJyZW50IGFjY2Vzcy4KKy8vIHxzQ29tbWFuZFJlcGx5TG9ja3wgcHJvdGVjdHMKKy8vIHxzVW5pcXVlSWR8IGFuZCB8d2FpdF9tYXB8LCBpbmNsdWRpbmcKKy8vIHRoZSB8Q29tbWFuZFdhaXRJbmZvfCBzdHJ1Y3R1cmVzIHdpdGhpbi4KK3N0YXRpYyBhbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U8TG9jaz4gc0NvbW1hbmRSZXBseUxvY2sgPQorICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKwordWludDY0X3QgbmV4dF91bmlxdWVfaWQoKSB7CisgICAgQXV0b0xvY2sgbG9jayhzQ29tbWFuZFJlcGx5TG9jay5nZXQoKSk7CisgICAgdWludDY0X3QgcmVzID0gc1VuaXF1ZUlkOworICAgIHNVbmlxdWVJZCArPSAxOworICAgIHJldHVybiByZXM7Cit9CisKK3N0cnVjdCBDb21tYW5kV2FpdEluZm8geworICAgIExvY2sgbG9jazsgLy8gcHJvdGVjdHMgb3RoZXIgcGFydHMgb2YgdGhpcyBzdHJ1Y3QKKyAgICBib29sIGRvbmUgPSBmYWxzZTsKKyAgICBDb25kaXRpb25WYXJpYWJsZSBjdkRvbmU7CisgICAgdWludDY0X3QgcmV0dXJuX3ZhbHVlOworfTsKKworLy8gfHdhaXRfbWFwfCBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIGNvbW1hbmRzIGluIGZsaWdodAorLy8gdGhhdCByZXF1aXJlIGEgcmVwbHkgZnJvbSB0aGUgZ3Vlc3QuCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZFdhaXRJbmZvPiA+CisgICAgd2FpdF9tYXA7CisKK3N0YXRpYyBDb21tYW5kV2FpdEluZm8qIGFsbG9jV2FpdCh1aW50NjRfdCBpZCkgeworICAgIEF1dG9Mb2NrIGxvY2soc0NvbW1hbmRSZXBseUxvY2suZ2V0KCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kV2FpdEluZm8+JiByZXMgPQorICAgICAgICB3YWl0X21hcFtpZF07CisgICAgcmVzLnJlc2V0KG5ldyBDb21tYW5kV2FpdEluZm8pOworICAgIHJldHVybiByZXMuZ2V0KCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVXYWl0KHVpbnQ2NF90IGlkKSB7CisgICAgQXV0b0xvY2sgbG9jayhzQ29tbWFuZFJlcGx5TG9jay5nZXQoKSk7CisgICAgd2FpdF9tYXAuZXJhc2UoaWQpOworfQorCitzdGF0aWMgR29sZGZpc2hTeW5jRGV2aWNlSW50ZXJmYWNlKiBzR29sZGZpc2hTeW5jSHdGdW5jcyA9IE5VTEw7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHb2xkZmlzaCBzeW5jIGRldmljZTogY29tbWFuZCBzZW5kL3JlY2VpdmUgcHJvdG9jb2wKKy8vIFRvIHNlbmQgY29tbWFuZHMgdG8gdGhlIHZpcnR1YWwgZGV2aWNlLCB0aGVyZSBhcmUgdHdvCisvLyBhbHRlcm5hdGl2ZXM6CisvLyAtIHxzZW5kQ29tbWFuZHwsIHdoaWNoIGp1c3Qgc2VuZHMgdGhlIGNvbW1hbmQgd2l0aG91dCB3YWl0aW5nCisvLyAgIGZvciBhIHJlcGx5LgorLy8gLSB8c2VuZENvbW1hbmRBbmRHZXRSZXN1bHR8LCB3aGljaCBzZW5kcyB0aGUgY29tbWFuZCBhbmQgd2FpdHMKKy8vICAgZm9yIHRoYXQgY29tbWFuZCB0byBoYXZlIGNvbXBsZXRlZCBpbiB0aGUgZ3Vlc3QuCisKKy8vIHxzZW5kQ29tbWFuZHwgaXMgdXNlZCB0byBzZW5kIEdvbGRmaXNoIHN5bmMgY29tbWFuZHMgd2hpbGUKKy8vIG5vdCBjYXJpbmcgYWJvdXQgYSByZXBseSBmcm9tIHRoZSBndWVzdC4gRHVyaW5nIG5vcm1hbCBvcGVyYXRpb24sCisvLyB3ZSB3aWxsIG9ubHkgdXNlIHxzZW5kQ29tbWFuZHwgdG8gc2VuZCBvdmVyIGEgfGdvbGRmaXNoX3N5bmNfdGltZWxpbmVfaW5jfAorLy8gY2FsbCwgdG8gc2lnbmFsIGZlbmNlIEZEJ3Mgb24gdGhlIGd1ZXN0Lgorc3RhdGljIHZvaWQgc2VuZENvbW1hbmQodWludDMyX3QgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGltZV9hcmcpIHsKKyAgICBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWU6Omhvc3RTaWduYWwKKyAgICAgICAgKGNtZCwgaGFuZGxlLCB0aW1lX2FyZywgMAorICAgICAgICAgLy8gbGFzdCBhcmcgMCBPSyBiZWNhdXNlIHdlIHdpbGwgbm90IHJlZmVyZW5jZSBpdAorICAgICAgICApOworfQorCisvLyBSZWNlaXZpbmcgY29tbWFuZHMgY2FuIGJlIGludGVyZXN0aW5nIGJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hlbgorLy8gdGhlIGtlcm5lbCB3aWxsIGdldCB0byBzZXJ2aWNpbmcgYSBjb21tYW5kIHdlIHNlbnQgZnJvbSB0aGUgaG9zdC4KKy8vCisvLyB8cmVjZWl2ZUNvbW1hbmRSZXN1bHR8IGlzIGZvciBob3N0LT5ndWVzdCBnb2xkZmlzaCBzeW5jIGNvbW1hbmRzCisvLyB0aGF0IHJlcXVpcmUgYSByZXBseSBmcm9tIHRoZSBndWVzdC4gU28gZmFyLCB0aGlzIGlzIHVzZWQgb25seQorLy8gaW4gdGhlIGZ1bmN0aW9uYWwgdGVzdHMsIGFzIHdlIG5ldmVyIGlzc3VlCisvLyB8Z29sZGZpc2hfc3luY19jcmVhdGVfdGltZWxpbmV8IC8gfGdvbGRmaXNoX3N5bmNfY3JlYXRlX2ZlbmNlfAorLy8gZnJvbSB0aGUgaG9zdCBkaXJlY3RseSBpbiBub3JtYWwgb3BlcmF0aW9uLgorLy8KKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHZpcnR1YWwgZGV2aWNlCisvLyB1cG9uIHJlY2VpdmluZyBhIHJlcGx5IGZyb20gdGhlIGd1ZXN0IGZvciB0aGUgaG9zdC0+Z3Vlc3QKKy8vIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSByZXBsaWVzLgorLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHN1Y2ggY29tbWFuZHMgd2lsbCB1c2UgYSBjb25kaXRpb24KKy8vIHZhcmlhYmxlIHRoYXQgd2FpdHMgb24gdGhlIHJlc3VsdC4KK3ZvaWQgZ29sZGZpc2hfc3luY19yZWNlaXZlX2hvc3RjbWRfcmVzdWx0KHVpbnQzMl90IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRpbWVfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaG9zdGNtZF9oYW5kbGUpIHsKKyAgICBpZiAoYXV0byBlbHQgPSBhbmRyb2lkOjpiYXNlOjpmaW5kKHdhaXRfbWFwLCBob3N0Y21kX2hhbmRsZSkpIHsKKyAgICAgICAgQ29tbWFuZFdhaXRJbmZvKiB3YWl0X2luZm8gPSBlbHQtPmdldCgpOworICAgICAgICBBdXRvTG9jayBsb2NrKHdhaXRfaW5mby0+bG9jayk7CisgICAgICAgIHdhaXRfaW5mby0+cmV0dXJuX3ZhbHVlID0gaGFuZGxlOworICAgICAgICB3YWl0X2luZm8tPmRvbmUgPSB0cnVlOworICAgICAgICB3YWl0X2luZm8tPmN2RG9uZS5icm9hZGNhc3QoKTsKKyAgICB9Cit9CisKKy8vIHxzZW5kQ29tbWFuZEFuZEdldFJlc3VsdHwgdXNlcyB8c2VuZENvbW1hbmR8IGFuZAorLy8gfGdvbGRmaXNoX3N5bmNfcmVjZWl2ZV9ob3N0Y21kX3Jlc3VsdHwgZm9yIHByb2Nlc3NpbmcKKy8vIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSByZXBsaWVzIGZyb20gdGhlIGd1ZXN0Lgorc3RhdGljIHVpbnQ2NF90IHNlbmRDb21tYW5kQW5kR2V0UmVzdWx0KHVpbnQ2NF90IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaG9zdGNtZF9oYW5kbGUpIHsKKworICAgIC8vIHF1ZXVlIGEgc2lnbmFsIHRvIHRoZSBkZXZpY2UKKyAgICBHb2xkZmlzaFN5bmNDb21tYW5kUXVldWU6Omhvc3RTaWduYWwKKyAgICAgICAgKGNtZCwgaGFuZGxlLCB0aW1lX2FyZywgaG9zdGNtZF9oYW5kbGUpOworCisgICAgQ29tbWFuZFdhaXRJbmZvKiB3YWl0SW5mbyA9IGFsbG9jV2FpdChob3N0Y21kX2hhbmRsZSk7CisKKyAgICB1aW50NjRfdCByZXM7CisKKyAgICB7CisgICAgICAgIEF1dG9Mb2NrIGxvY2sod2FpdEluZm8tPmxvY2spOworICAgICAgICB3aGlsZSAoIXdhaXRJbmZvLT5kb25lKSB7CisgICAgICAgICAgICB3YWl0SW5mby0+Y3ZEb25lLndhaXQoJndhaXRJbmZvLT5sb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IHdhaXRJbmZvLT5yZXR1cm5fdmFsdWU7CisgICAgfQorCisgICAgZnJlZVdhaXQoaG9zdGNtZF9oYW5kbGUpOworCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gR29sZGZpc2ggc3luYyBob3N0LXNpZGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordWludDY0X3QgZ29sZGZpc2hfc3luY19jcmVhdGVfdGltZWxpbmUoKSB7CisgICAgcmV0dXJuIHNlbmRDb21tYW5kQW5kR2V0UmVzdWx0KENNRF9DUkVBVEVfU1lOQ19USU1FTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbmV4dF91bmlxdWVfaWQoKSk7Cit9CisKK2ludCBnb2xkZmlzaF9zeW5jX2NyZWF0ZV9mZW5jZSh1aW50NjRfdCB0aW1lbGluZSwgdWludDMyX3QgcHQpIHsKKyAgICByZXR1cm4gKGludClzZW5kQ29tbWFuZEFuZEdldFJlc3VsdChDTURfQ1JFQVRFX1NZTkNfRkVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWxpbmUsIHB0LCBuZXh0X3VuaXF1ZV9pZCgpKTsKK30KKwordm9pZCBnb2xkZmlzaF9zeW5jX3RpbWVsaW5lX2luYyh1aW50NjRfdCB0aW1lbGluZSwgdWludDMyX3QgaG93bXVjaCkgeworICAgIHNlbmRDb21tYW5kKENNRF9TWU5DX1RJTUVMSU5FX0lOQywgdGltZWxpbmUsIGhvd211Y2gpOworfQorCit2b2lkIGdvbGRmaXNoX3N5bmNfZGVzdHJveV90aW1lbGluZSh1aW50NjRfdCB0aW1lbGluZSkgeworICAgIHNlbmRDb21tYW5kKENNRF9ERVNUUk9ZX1NZTkNfVElNRUxJTkUsIHRpbWVsaW5lLCAwKTsKK30KKwordm9pZCBnb2xkZmlzaF9zeW5jX3JlZ2lzdGVyX3RyaWdnZXJfd2FpdCh0cmlnZ2VyX3dhaXRfZm5fdCBmKSB7CisgICAgaWYgKGdvbGRmaXNoX3N5bmNfZGV2aWNlX2V4aXN0cygpKSB7CisgICAgICAgIHNHb2xkZmlzaFN5bmNId0Z1bmNzLT5yZWdpc3RlclRyaWdnZXJXYWl0KGYpOworICAgIH0KK30KKworYm9vbCBnb2xkZmlzaF9zeW5jX2RldmljZV9leGlzdHMoKSB7CisgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyB0aGF0IHRoZSB2aXJ0dWFsIGRldmljZSBzaG91bGQgc2V0CisgICAgLy8gc0dvbGRmaXNoU3luY0h3RnVuY3MuIElmIGl0IGRpZG4ndCBkbyB0aGF0LCB3ZSB0YWtlCisgICAgLy8gdGhhdCB0byBtZWFuIHRoZXJlIGlzIG5vIHZpcnR1YWwgZGV2aWNlLgorICAgIHJldHVybiBzR29sZGZpc2hTeW5jSHdGdW5jcyAhPSBOVUxMOworfQorCit2b2lkIGdvbGRmaXNoX3N5bmNfc2V0X2h3X2Z1bmNzKEdvbGRmaXNoU3luY0RldmljZUludGVyZmFjZSogaHdfZnVuY3MpIHsKKyAgICBzR29sZGZpc2hTeW5jSHdGdW5jcyA9IGh3X2Z1bmNzOworICAgIEdvbGRmaXNoU3luY0NvbW1hbmRRdWV1ZTo6c2V0UXVldWVDb21tYW5kCisgICAgICAgIChzR29sZGZpc2hTeW5jSHdGdW5jcy0+ZG9Ib3N0Q29tbWFuZCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vZ29sZGZpc2hfc3luYy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9nb2xkZmlzaF9zeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0OWE1YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vZ29sZGZpc2hfc3luYy5oCkBAIC0wLDAgKzEsMTc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBHT0xERklTSCBTWU5DIERFVklDRQorLy8gVGhlIEdvbGRmaXNoIHN5bmMgZHJpdmVyIGlzIGRlc2lnbmVkIHRvIHByb3ZpZGUgYSBpbnRlcmZhY2UKKy8vIGJldHdlZW4gdGhlIHVuZGVybHlpbmcgaG9zdCdzIHN5bmMgZGV2aWNlIGFuZCB0aGUga2VybmVsJ3MKKy8vIHN3X3N5bmMuCisvLyBUaGUgcHVycG9zZSBvZiB0aGUgZGV2aWNlL2RyaXZlciBpcyB0byBlbmFibGUgbGlnaHR3ZWlnaHQKKy8vIGNyZWF0aW9uIGFuZCBzaWduYWxpbmcgb2YgdGltZWxpbmVzIGFuZCBmZW5jZXMKKy8vIGluIG9yZGVyIHRvIHN5bmNocm9uaXplIHRoZSBndWVzdCB3aXRoIGhvc3Qtc2lkZSBncmFwaGljcyBldmVudHMuCisKKy8vIEVhY2ggdGltZSB0aGUgaW50ZXJydXB0IHRyaXBzLCB0aGUgZHJpdmVyCisvLyBtYXkgcGVyZm9ybSBhIHN3X3N5bmMgb3BlcmF0aW9uLgorCisvLyBUaGUgb3BlcmF0aW9ucyBhcmU6CisKKy8vIFJlYWR5IHNpZ25hbCAtIHVzZWQgdG8gbWFyayB3aGVuIGlycSBzaG91bGQgbG93ZXIKKyNkZWZpbmUgQ01EX1NZTkNfUkVBRFkgICAgICAgICAgICAwCisKKy8vIENyZWF0ZSBhIG5ldyB0aW1lbGluZS4gd3JpdGVzIHRpbWVsaW5lIGhhbmRsZQorI2RlZmluZSBDTURfQ1JFQVRFX1NZTkNfVElNRUxJTkUgIDEKKworLy8gQ3JlYXRlIGEgZmVuY2Ugb2JqZWN0LiByZWFkcyB0aW1lbGluZSBoYW5kbGUgYW5kIHRpbWUgYXJndW1lbnQuCisvLyBXcml0ZXMgZmVuY2UgZmQgdG8gdGhlIFNZTkNfUkVHX0hBTkRMRSByZWdpc3Rlci4KKyNkZWZpbmUgQ01EX0NSRUFURV9TWU5DX0ZFTkNFICAgICAyCisKKy8vIEluY3JlbWVudHMgdGltZWxpbmUuIHJlYWRzIHRpbWVsaW5lIGhhbmRsZSBhbmQgdGltZSBhcmd1bWVudAorI2RlZmluZSBDTURfU1lOQ19USU1FTElORV9JTkMgICAgIDMKKworLy8gRGVzdHJveXMgYSB0aW1lbGluZS4gcmVhZHMgdGltZWxpbmUgaGFuZGxlCisjZGVmaW5lIENNRF9ERVNUUk9ZX1NZTkNfVElNRUxJTkUgNAorCisvLyBTdGFydHMgYSB3YWl0IG9uIHRoZSBob3N0IHdpdGgKKy8vIHRoZSBnaXZlbiBnbHN5bmMgb2JqZWN0IGFuZCBzeW5jIHRocmVhZCBoYW5kbGUuCisjZGVmaW5lIENNRF9UUklHR0VSX0hPU1RfV0FJVCAgICAgNQorCisvLyBUaGUgcmVnaXN0ZXIgbGF5b3V0IGlzOgorCisjZGVmaW5lIFNZTkNfUkVHX0JBVENIX0NPTU1BTkQgICAgICAgICAgICAgICAgMHgwMCAvLyBob3N0LT5ndWVzdCBiYXRjaCBjb21tYW5kcworI2RlZmluZSBTWU5DX1JFR19CQVRDSF9HVUVTVENPTU1BTkQgICAgICAgICAgIDB4MDQgLy8gZ3Vlc3QtPmhvc3QgYmF0Y2ggY29tbWFuZHMKKyNkZWZpbmUgU1lOQ19SRUdfQkFUQ0hfQ09NTUFORF9BRERSICAgICAgICAgICAweDA4IC8vIGNvbW11bmljYXRlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaG9zdC0+Z3Vlc3QgYmF0Y2ggY29tbWFuZHMKKyNkZWZpbmUgU1lOQ19SRUdfQkFUQ0hfQ09NTUFORF9BRERSX0hJR0ggICAgICAweDBjIC8vIDY0LWJpdCBwYXJ0CisjZGVmaW5lIFNZTkNfUkVHX0JBVENIX0dVRVNUQ09NTUFORF9BRERSICAgICAgMHgxMCAvLyBjb21tdW5pY2F0ZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGd1ZXN0LT5ob3N0IGNvbW1hbmRzCisjZGVmaW5lIFNZTkNfUkVHX0JBVENIX0dVRVNUQ09NTUFORF9BRERSX0hJR0ggMHgxNCAvLyA2NC1iaXQgcGFydAorI2RlZmluZSBTWU5DX1JFR19JTklUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTggLy8gdG8gc2lnbmFsIHRoYXQgdGhlIGRldmljZSBoYXMgYmVlbiBkZXRlY3RlZCBieSB0aGUga2VybmVsCisKKyNkZWZpbmUgR1VFU1RfVFJJR0dFUkVEKGNtZCkgKGNtZCA9PSBDTURfU1lOQ19SRUFEWSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gQ01EX1RSSUdHRVJfSE9TVF9XQUlUKQorCit0eXBlZGVmIHZvaWQgKCp0cmlnZ2VyX3dhaXRfZm5fdCkodWludDY0X3QsIHVpbnQ2NF90LCB1aW50NjRfdCk7CisKKy8vIFRoZSBjb21tYW5kcyBiZWxvdyBvcGVyYXRlIG9uIEFuZHJvaWQgc3luYyAidGltZWxpbmVzIiBhbmQKKy8vICJmZW5jZXMiLiBUaGUgYmFzaWMgY29uY2VwdCBpcyBhcyBmb2xsb3dzLgorLy8gLSBUaW1lbGluZSBhbmQgZmVuY2VzIHdvcmsgdG9nZXRoZXIgYXMgYSBzdGF0ZSB0byBkZXRlcm1pbmUKKy8vICAgd2hpY2ggZXZlbnRzIGhhdmUgY29tcGxldGVkLiBUaGUgdGltZWxpbmUgYWJzdHJhY3Rpb24KKy8vICAgaXMgdXNlZCB0byByZXByZXNlbnQgYSBtb25vdG9uaWMgb3JkZXJpbmcgb2YgZXZlbnRzLAorLy8gICB3aGlsZSBmZW5jZXMgcmVwcmVzZW50IGxldmVscyBvZiBwcm9ncmVzcyBhbG9uZworLy8gICB0aW1lbGluZXMuIEJ5IGhhdmluZyBkaWZmZXJlbnQgdGhyZWFkcyB3YWl0IG9uIGZlbmNlcworLy8gICB1bnRpbCB0aGVpciBhc3NvY2lhdGVkIHRpbWVsaW5lcyBtYWtlIHRoZSByZXF1aXJlZCBwcm9ncmVzcywKKy8vICAgd2UgY2FuIHN5bmNocm9uaXplIG11bHRpcGxlIHRocmVhZHMgd2l0aGluIGEgcHJvY2VzcworLy8gICBhbmQgd2l0aCBiaW5kZXIsIGFjcm9zcyBwcm9jZXNzZXMuCisvLyAtIFdoYXQgZm9sbG93cyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIHRoYXQgY29uY2VwdAorLy8gICB0aGF0IGRvZXMgbm90IG1hdGNoIGltcGxlbWVudGF0aW9uIGV4YWN0bHksIGJ1dCBpcworLy8gICBzdWZmaWNpZW50IGZvciBvdXIgcHVycG9zZXM6CisvLyAtIEEgdGltZWxpbmUgaXMgYSByZXByZXNudGVkIGJ5IGEgc2luZ2xlIHVpbnQzMl90LCBrbm93biBhcworLy8gICBpdHMgInZhbHVlIi4gT3ZlciB0aW1lLCB0aGUgdmFsdWUgbWF5IGluY3JlYXNlLgorLy8gICB0aW1lbGluZSA6IHZhbHVlCisvLyAtIExldCAidGltZWxpbmUtaWQiIGJlIGEgdWludDY0X3QgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGVhY2gKKy8vICAgdGltZWxpbmUuCisvLyAgIEEgZmVuY2UgaXMgYW4gaW1tdXRhYmxlIG1hcCBmcm9tIHRpbWVsaW5lLWlkJ3MgdG8gdmFsdWVzOgorLy8gICBmZW5jZSA6IG1hcCh0aW1lbGluZS1pZCAtPiB2YWx1ZSkuIFdlIHdpbGwgcmVmZXIgdG8gdGhlCisvLyAgICJ0aW1lbGluZS1pZC12YWx1ZXMiIG9mIGEgZmVuY2UgdG8gYmUgdGhlIHNldCBvZiBhbGwgcGFpcnMKKy8vICAgKHRpbWVsaW5lLWlkLCB2YWx1ZSkgdGhhdCBjb21wcmlzZSB0aGUgbWFwcGluZy4KKy8vIC0gTGV0ICJmZW5jZS1pZCIgYmUgYW4gaW50IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBlYWNoIGZlbmNlLgorLy8gICBUaGlzIGlzIGFsc28ga25vd24gYXMgYSAiZmVuY2UgZmQiLgorLy8gICBUaGUgaW1wb3J0YW50IHN0YXRlIGlzIHJlcHJlc2VudGVkIGJ5IGEgcGFpciBvZiBtYXBzOgorLy8gICAoVCA9IG1hcCh0aW1lbGluZS1pZCAtPiB0aW1lbGluZSksIEYgPSBtYXAoZmVuY2UtaWQgLT4gZmVuY2UpKS4KKy8vICAgVGhpcyBzdGF0ZSBtYXkgY2hhbmdlIG92ZXIgdGltZSwgd2l0aCB0aW1lbGluZXMgYW5kIGZlbmNlcworLy8gICBiZWluZyBhZGRlZCBvciByZW1vdmVkLgorLy8gICBGb3IgYW55IHN0YXRlLCB3ZSBjYXJlIHByaW1hcmlseSBhYm91dCB0aGUgInNpZ25hbGVkIiBzdGF0dXMKKy8vICAgb2YgdGhlIGZlbmNlcyB3aXRoaW4uCisvLyAgIC0gRWFjaCBmZW5jZSBpbiB0aGUgbWFwIGZyb20gZmVuY2UtaWQncyB0byBmZW5jZXMgaXMKKy8vICAgICBzaWduYWxlZCBpZjoKKy8vICAgICAtIEZvciBhbGwgdGltZWxpbmUtaWQtdmFsdWVzID0gKHRpbWVsaW5lLWlkLCB2YWx1ZSkKKy8vICAgICAgIG9mIHRoYXQgZmVuY2UsIFRbdGltZWxpbmUtaWRdID49IHZhbHVlLgorLy8gICAgICAgT3IsIHRpbWVsaW5lLWlkIGRvZXMgbm90IGV4aXN0IGluIFQncyBrZXlzLgorLy8gICAgIC0gT3RoZXJ3aXNlLCBpdCBpcyBjb25zaWRlcmVkICJ1bnNpZ25hbGVkLiIKKy8vIFRoZSBmdW5jdGlvbnMgYmVsb3cgb3BlcmF0ZSB3aXRoIHRoZSBhYm92ZSBhYnN0cmFjdGlvbiBpbiBtaW5kLgorLy8gVGhleSBhbGwgbXV0YXRlIGEgcGFydGljdWxhciBjb2xsZWN0aW9uIG9mIGZlbmNlcyBhbmQgdGltZWxpbmVzLgorLy8gV2UgY2FuIHRoaW5rIG9mIHRoZW0gYXMgaW1wbGljaXRseSB0YWtpbmcgYSBzdGF0ZSAoVCwgRikKKy8vIGFzIGlucHV0IGFuZCByZXR1cm5pbmcgYSBuZXcgb25lIChUJywgRicpIHRoYXQgaXMgcG9zc2libHkgdXBkYXRlZCwKKy8vIGFjY29yZGluZyB0byB0aGUgY2hhbmdlcyBkZXNjcmliZWQuIFRoZSBuZXcgY29sbGVjdGlvbiB0aGVuCisvLyBzZXJ2ZXMgYXMgdGhlIHRydWUgYWJzdHJhY3Qgc3RhdGUgZm9yIGFsbCBmdXJ0aGVyIG9wZXJhdGlvbnMuCisKKy8vIHxnb2xkZmlzaF9zeW5jX2NyZWF0ZV90aW1lbGluZXwgY3JlYXRlcyBhIG5ldyB0aW1lbGluZQorLy8gd2l0aCB2YWx1ZSAwLiBUaGUgdGltZWxpbmUgaWQgaXMgcmV0dXJuZWQuCit1aW50NjRfdCBnb2xkZmlzaF9zeW5jX2NyZWF0ZV90aW1lbGluZSgpOworCisvLyB8Z29sZGZpc2hfc3luY19jcmVhdGVfZmVuY2V8IGNyZWF0ZXMgYSBmZW5jZQorLy8gdGhhdCBoYXMgYSBzaW5nbGUgdGltZWxpbmUtaWQtdmFsdWUgcGFpciBhcyBpdHMgbWFwLgorLy8gVGhlIGZpcnN0IHR3byBhcmd1bWVudHMgY29tcHJpc2UgdGhlIHBhaXIuCisvLyBSZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBmZW5jZS4KKy8vIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZgorLy8gZmVuY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSB0aW1lbGluZS1pZC12YWx1ZSBwYWlyLgoraW50IGdvbGRmaXNoX3N5bmNfY3JlYXRlX2ZlbmNlKHVpbnQ2NF90IHRpbWVsaW5lLCB1aW50MzJfdCBwdCk7CisKKy8vIHxnb2xkZmlzaF9zeW5jX3RpbWVsaW5lX2luY3wgYWR2YW5jZXMgdGhlIHZhbHVlIGNvbXBvbmVudAorLy8gb2YgYSBnaXZlbiB0aW1lbGluZSBieSB8aG93bXVjaHw7IHRoYXQgaXMsIGlmCisvLyAodCwgdikgaXMgdGhlIHRpbWVsaW5lLWlkIGFuZCB2YWx1ZSBvZiBhIHRpbWVsaW5lIGJlZm9yZSB0aGlzIGNhbGwsCisvLyAodCwgdiArIHxob3dtdWNofCkgaXMgdGhlIHZhbHVlIGFmdGVyLgorLy8gVGh1cywgdGhpcyBtYXkgZW5kIHVwIGNoYW5naW5nIHNvbWUgZmVuY2Ugb2JqZWN0cyB0byBzaWduYWxlZCBzdGF0ZS4KK3ZvaWQgZ29sZGZpc2hfc3luY190aW1lbGluZV9pbmModWludDY0X3QgdGltZWxpbmUsIHVpbnQzMl90IGhvd211Y2gpOworCisvLyB8Z29sZGZpc2hfc3luY19kZXN0cm95X3RpbWVsaW5lfCByZW1vdmVzIHRoZSBrZXkgfHRpbWVsaW5lfAorLy8gZnJvbSB0aGUgZ2xvYmFsIHRpbWVsaW5lIG1hcC4KKy8vIEFueSBmZW5jZSBvYmplY3RzIHdob3NlIG9ubHkgdGltZWxpbmUtaWQtdmFsdWUgKHQsIHYpIGlzIHN1Y2ggdGhhdAorLy8gdCA9PSB8dGltZWxpbmV8IHdvdWxkIGJlIGNvbnNpZGVyZWQgc2lnbmFsZWQuCisvLyBJZiB0aGVyZSBhcmUgYW55IG90aGVyIHRpbWVsaW5lLWlkLXZhbHVlcywgdGhlIGZlbmNlIG1heSBzdGlsbCBiZQorLy8gdW5zaWduYWxlZC4gV2Ugd291bGQgbmVlZCB0aGUgb3RoZXIgdGltZWxpbmVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZW5jZQorLy8gdG8gaGF2ZSByZWFjaGVkIHRoZSB0YXJnZXQgdmFsdWUgb2YgdGhpcyBmZW5jZSwgZmVuY2VbdGltZWxpbmVdLgordm9pZCBnb2xkZmlzaF9zeW5jX2Rlc3Ryb3lfdGltZWxpbmUodWludDY0X3QgdGltZWxpbmUpOworCisvLyBSZWdpc3RlcmluZyBjYWxsYmFja3MgZm9yIGdvbGRmaXNoIHN5bmMgb3BzCisvLyBDdXJyZW50bHksIG9ubHkgdHJpZ2dlcl93YWl0IGlzIHN1cHBvcnRlZC4KK3ZvaWQgZ29sZGZpc2hfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXQodHJpZ2dlcl93YWl0X2ZuX3QgdHJpZ2dlcl9mbik7CisKKy8vIElmIHRoZSB2aXJ0dWFsIGRldmljZSBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0IChlLmcuLCB3aGVuCisvLyB1c2luZyBRRU1VMSksIHF1ZXJ5IHRoYXQgdXNpbmcgdGhpcyBmdW5jdGlvbjoKK2Jvb2wgZ29sZGZpc2hfc3luY19kZXZpY2VfZXhpc3RzKCk7CisKKy8vIEZ1bmN0aW9uIHR5cGVzIGZvciBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSB2aXJ0dWFsIGRldmljZS4KK3R5cGVkZWYgdm9pZCAoKnF1ZXVlX2RldmljZV9jb21tYW5kX3QpCisgICAgKHVpbnQzMl90IGNtZCwgdWludDY0X3QgaGFuZGxlLCB1aW50MzJfdCB0aW1lX2FyZywKKyAgICAgdWludDY0X3QgaG9zdGNtZF9oYW5kbGUpOworCit0eXBlZGVmIHN0cnVjdCBHb2xkZmlzaFN5bmNEZXZpY2VJbnRlcmZhY2UgeworICAgIC8vIENhbGxiYWNrIGZvciBhbGwgY29tbXVuaWNhdGlvbnMgd2l0aCB2aXJ0dWFsIGRldmljZQorICAgIHF1ZXVlX2RldmljZV9jb21tYW5kX3QgZG9Ib3N0Q29tbWFuZDsKKworICAgIC8vIENhbGxiYWNrcyB0byByZWdpc3RlciBvdGhlciBjYWxsYmFja3MgZm9yIHRyaWdnZXJpbmcKKyAgICAvLyBPcGVuR0wgd2FpdHMgZnJvbSB0aGUgZ3Vlc3QKKyAgICB2b2lkICgqcmVnaXN0ZXJUcmlnZ2VyV2FpdCkodHJpZ2dlcl93YWl0X2ZuX3QpOworfSBHb2xkZmlzaFN5bmNEZXZpY2VJbnRlcmZhY2U7CisKKy8vIFRoZSB2aXJ0dWFsIGRldmljZSB3aWxsIGNhbGwgfGdvbGRmaXNoX3N5bmNfc2V0X2h3X2Z1bmNzfAorLy8gdG8gY29ubmVjdCB1cCB0byB0aGUgQW5kcm9pZEVtdSBwYXJ0LgorZXh0ZXJuIHZvaWQKK2dvbGRmaXNoX3N5bmNfc2V0X2h3X2Z1bmNzKEdvbGRmaXNoU3luY0RldmljZUludGVyZmFjZSogaHdfZnVuY3MpOworCisvLyBUaGUgdmlydHVhbCBkZXZpY2UgY2FsbHMgdGhpcyB8Z29sZGZpc2hfc3luY19yZWNlaXZlX2hvc3RjbWRfcmVzdWx0fAorLy8gd2hlbiBpdCByZWNlaXZlcyBhIHJlcGx5IGZvciBob3N0LT5ndWVzdCBjb21tYW5kcyB0aGF0IHN1cHBvcnQKKy8vIHRoYXQgcHJvdG9jb2wuCitleHRlcm4gdm9pZAorZ29sZGZpc2hfc3luY19yZWNlaXZlX2hvc3RjbWRfcmVzdWx0KHVpbnQzMl90IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGltZV9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaG9zdGNtZF9oYW5kbGUpOworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2ludGVybmFsL0NwdUFjY2VsZXJhdG9yLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2ludGVybmFsL0NwdUFjY2VsZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM0NGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vaW50ZXJuYWwvQ3B1QWNjZWxlcmF0b3IuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIF9fQVBQTEVfXworCisvLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQgIlZFUlNJT049MS4yLjMiIGFuZCByZXR1cm5zIGFuCisvLyBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgZG90dGVkIHZlcnNpb24gbnVtYmVyLiAgSW52YWxpZCBzdHJpbmdzIGFyZQorLy8gY29udmVydGVkIHRvIC0xLgorLy8gQW55IGNoYXJhY3RlcnMgYmVmb3JlICJWRVJTSU9OPSIgYXJlIGlnbm9yZWQuCisvLyBOb24tbnVtZXJpYyBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgYXJlIGlnbm9yZWQuCisvLworLy8gRXhhbXBsZXM6CisvLyAgICJWRVJTSU9OPTEuMi40IiAtPiAweDAxMDIwMDA0CisvLyAgICJWRVJTSU9OPTEuMiIgICAtPiAweDAxMDIwMDAwCisvLyAgICIxLjIuNCIgICAgICAgICAtPiAtMQorLy8gICAiYXNmZCIgICAgICAgICAgLT4gLTEKKworaW50MzJfdCBjcHVBY2NlbGVyYXRvclBhcnNlVmVyc2lvblNjcmlwdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZlcnNpb25fc2NyaXB0KTsKKworLy8gVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBvbmUgb3IgbW9yZSBrZXJuZWwgZXh0ZW5zaW9uIGRpcmVjdG9yaWVzIGZvciB0aGUKKy8vIHNwZWNpZmllZCB2ZXJzaW9uIGZpbGUuCisvLyBUaGUgdmVyc2lvbiBmaWxlIGlzIHJlYWQgYW5kIHBhcnNlZCBpZiBmb3VuZAorLy8gY3B1QWNjZWxlcmF0b3JQYXJzZVZlcnNpb25TY3JpcHQKKy8vIHJldHVybnMgMCAtIEhBWE0gbm90IGluc3RhbGxlZAorLy8gcmV0dXJucyAtMSAtIEhBWE0gY29ycnVwdCBvciB0b28gb2xkCisvLyByZXR1cm5zIDB4MDEwMjAwMDQgZm9yIHZlcnNpb24gdmVyc2lvbiBudW1iZXIgZS5nLiAiMS4yLjQiCitpbnQzMl90IGNwdUFjY2VsZXJhdG9yR2V0SGF4VmVyc2lvbihjb25zdCBjaGFyKiBrZXh0X2RpcltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtleHRfZGlyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmVyc2lvbl9maWxlKTsKKworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2t2bV9lbnYuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24va3ZtX2Vudi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMmE0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL2t2bV9lbnYuaApAQCAtMCwwICsxLDIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIE5hbWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGUgdXNlZCB0byBjb250cm9sIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UKKy8vIHRvIHVzZSwgd2hlbiBpdCBpcyBub3QgL2Rldi9rdm0KKyNkZWZpbmUgS1ZNX0RFVklDRV9OQU1FX0VOViAgIkFORFJPSURfRU1VTEFUT1JfS1ZNX0RFVklDRSIKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL25hbmRfbGltaXRzLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL25hbmRfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc2ZmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vbmFuZF9saW1pdHMuYwpAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0cy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgVCguLi4pIFZFUkJPU0VfUFJJTlQobmFuZF9saW1pdHMsIF9fVkFfQVJHU19fKQorCitzdGF0aWMgYm9vbCBwYXJzZV9uYW5kX3J3X2xpbWl0KGNvbnN0IGNoYXIqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiB2KSB7CisgICAgY2hhciogZW5kOworICAgIHVpbnQ2NF90IHZhbCA9IHN0cnRvdWwodmFsdWUsICZlbmQsIDApOworCisgICAgaWYgKGVuZCA9PSB2YWx1ZSkgeworICAgICAgICBkZXJyb3IoImJhZCBwYXJhbWV0ZXIgdmFsdWUgJyVzJzogZXhwZWN0aW5nIHVuc2lnbmVkIGludGVnZXIiLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuZFswXSkgeworICAgICAgICBjYXNlICdLJzoKKyAgICAgICAgICAgIHZhbCA8PD0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICB2YWwgPDw9IDIwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgdmFsIDw8PSAzMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkZXJyb3IoImJhZCByZWFkL3dyaXRlIGxpbWl0IHN1ZmZpeDogdXNlIEssIE0gb3IgRywgZ290IFslc10iLCBlbmQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqdiA9IHZhbDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhbmRyb2lkX25hbmRfbGltaXRzX3BhcnNlKGNvbnN0IGNoYXIqIGxpbWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTmFuZExpbWl0KiByZWFkX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWROYW5kTGltaXQqIHdyaXRlX2xpbWl0KSB7CisgICAgaW50IHBpZCA9IC0xLCBzaWduYWwgPSAtMTsKKyAgICB1aW50NjRfdCByZWFkcyA9IDAsIHdyaXRlcyA9IDA7CisgICAgY29uc3QgY2hhciogaXRlbSA9IGxpbWl0czsKKworI2lmZGVmIF9XSU4zMgorICAgIC8vIEN1cnJlbnRseSBub3Qgd29ya2luZyBvbiBXaW5kb3dzLgorICAgIGRlcnJvcigiLW5hbmQtbGltaXRzIGlzIG5vdCBhdmFpbGFibGUgb24gV2luZG93cyEiKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKworICAgIC8qIHBhcnNlIG92ZXIgY29tbWEtc2VwYXJhdGVkIGl0ZW1zICovCisgICAgd2hpbGUgKGl0ZW0gJiYgKml0ZW0pIHsKKyAgICAgICAgY29uc3QgY2hhciogbmV4dF9pdGVtOworICAgICAgICBjb25zdCBjaGFyKiBjb21tYSA9IHN0cmNocihpdGVtLCAnLCcpOworICAgICAgICBjaGFyKiBlbmQ7CisKKyAgICAgICAgaWYgKCFjb21tYSkgeworICAgICAgICAgICAgbmV4dF9pdGVtID0gaXRlbSArIHN0cmxlbihpdGVtKTsKKyAgICAgICAgICAgIGNvbW1hID0gbmV4dF9pdGVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV4dF9pdGVtID0gY29tbWEgKyAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGl0ZW0sICJwaWQ9IiwgNCkpIHsKKyAgICAgICAgICAgIHBpZCA9IHN0cnRvbChpdGVtICsgNCwgJmVuZCwgMTApOworICAgICAgICAgICAgaWYgKGVuZCAhPSBjb21tYSkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiYmFkIHBhcmFtZXRlciwgZXhwZWN0aW5nIHBpZD08bnVtYmVyPiwgZ290ICclcyciLCBpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGlkIDw9IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImJhZCBwYXJhbWV0ZXI6IHByb2Nlc3MgaWRlbnRpZmllciBtdXN0IGJlID4gMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChpdGVtLCAic2lnbmFsPSIsIDcpKSB7CisgICAgICAgICAgICBzaWduYWwgPSBzdHJ0b2woaXRlbSArIDcsICZlbmQsIDEwKTsKKyAgICAgICAgICAgIGlmIChlbmQgIT0gY29tbWEpIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImJhZCBwYXJhbWV0ZXI6IGV4cGVjdGluZyBzaWduYWw9PG51bWJlcj4sIGdvdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpZ25hbCA8PSAwKSB7CisgICAgICAgICAgICAgICAgZGVycm9yKCJiYWQgcGFyYW1ldGVyOiBzaWduYWwgbnVtYmVyIG11c3QgYmUgPiAwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGl0ZW0sICJyZWFkcz0iLCA2KSkgeworICAgICAgICAgICAgaWYgKCFwYXJzZV9uYW5kX3J3X2xpbWl0KGl0ZW0gKyA2LCBuZXh0X2l0ZW0sICZyZWFkcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoaXRlbSwgIndyaXRlcz0iLCA3KSkgeworICAgICAgICAgICAgaWYgKCFwYXJzZV9uYW5kX3J3X2xpbWl0KGl0ZW0gKyA3LCBuZXh0X2l0ZW0sICZ3cml0ZXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVycm9yKCJiYWQgcGFyYW1ldGVyICclcycgKHNlZSAtaGVscC1uYW5kLWxpbWl0cykiLCBpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpdGVtID0gbmV4dF9pdGVtOworICAgIH0KKyAgICBpZiAocGlkIDwgMCkgeworICAgICAgICBkZXJyb3IoImJhZCBwYXJhbWF0ZXI6IG1pc3NpbmcgcGlkPTxudW1iZXI+Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHNpZ25hbCA8IDApIHsKKyAgICAgICAgZGVycm9yKCJiYWQgcGFyYW1ldGVyOiBtaXNzaW5nIHNpZ25hbD08bnVtYmVyPiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZWFkcyA9PSAwICYmIHdyaXRlcyA9PSAwKSB7CisgICAgICAgIGR3YXJuaW5nKCJubyByZWFkIG9yIHdyaXRlIGxpbWl0IHNwZWNpZmllZC4gaWdub3JpbmcgLW5hbmQtbGltaXRzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVhZF9saW1pdC0+cGlkID0gcGlkOworICAgIHJlYWRfbGltaXQtPnNpZ25hbCA9IHNpZ25hbDsKKyAgICByZWFkX2xpbWl0LT5jb3VudGVyID0gMDsKKyAgICByZWFkX2xpbWl0LT5saW1pdCA9IHJlYWRzOworCisgICAgd3JpdGVfbGltaXQtPnBpZCA9IHBpZDsKKyAgICB3cml0ZV9saW1pdC0+c2lnbmFsID0gc2lnbmFsOworICAgIHdyaXRlX2xpbWl0LT5jb3VudGVyID0gMDsKKyAgICB3cml0ZV9saW1pdC0+bGltaXQgPSB3cml0ZXM7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBhbmRyb2lkX25hbmRfbGltaXRfdXBkYXRlKEFuZHJvaWROYW5kTGltaXQqIGwsIHVpbnQzMl90IGNvdW50KSB7CisgICAgaWYgKGwtPmNvdW50ZXIgPj0gbC0+bGltaXQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50NjRfdCBhdmFpbCA9IGwtPmxpbWl0IC0gbC0+Y291bnRlcjsKKyAgICBpZiAoYXZhaWwgPiBjb3VudCkgeworICAgICAgICBhdmFpbCA9IGNvdW50OworICAgIH0KKworICAgIGlmIChsLT5jb3VudGVyID09IDApIHsKKyAgICAgICAgVCgiJXM6IHN0YXJ0aW5nIHRocmVzaG9sZCBjb3VudGluZyB0byAlbGxkIiwgX19GVU5DVElPTl9fLCBsLT5saW1pdCk7CisgICAgfQorICAgIGwtPmNvdW50ZXIgKz0gYXZhaWw7CisgICAgaWYgKGwtPmNvdW50ZXIgPj0gbC0+bGltaXQpIHsKKyAgICAgICAgLyogdGhyZXNob2xkIHJlYWNoLCBzZW5kIGEgc2lnbmFsIHRvIGFuIGV4dGVybmFsIHByb2Nlc3MgKi8KKyAgICAgICAgVCgiJXM6IHNlbmRpbmcgc2lnbmFsICVkIHRvIHBpZCAlZCAhIiwgX19GVU5DVElPTl9fLCBsLT5zaWduYWwsIGwtPnBpZCk7CisjaWZuZGVmIF9XSU4zMgorICAgICAgICAvLyBDdXJyZW50bHkgbm90IHdvcmtpbmcgb24gV2luZG93cy4KKyAgICAgICAga2lsbChsLT5waWQsIGwtPnNpZ25hbCk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL25hbmRfbGltaXRzLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIG9wdGlvbiBsaW1pdCB0aHJlc2hvbGQgdG8gYmUgdXNlZCBhdCBydW50aW1lCisvLyBkdXJpbmcgTkFORCBlbXVsYXRpb24uIFRoaXMgaXMgdXNlZCB0byBtb25pdG9yIE5BTkQgYWN0aXZpdHkgYnkgc2VuZGluZworLy8gYSB8c2lnbmFsfCB0byBhbiBleHRlcm5hbCBwcm9jZXNzIHxwaWR8IG9uY2UgfGxpbWl0fCBieXRlcyBoYXZlIGJlZW4KKy8vIHJlYWQgKG9yIHdyaXR0ZW4pLiB8Y291bnRlcnwgaXMganVzdCBhIHJ1bnRpbWUgY291bnRlciB0aGF0IG11c3QgYmUKKy8vIGluaXRpYWxpemVkIHRvIDAuCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgbGltaXQ7CisgICAgdWludDY0X3QgY291bnRlcjsKKyAgICBpbnQgcGlkOworICAgIGludCBzaWduYWw7Cit9IEFuZHJvaWROYW5kTGltaXQ7CisKKy8vIFN0YXRpYyBpbml0aWFsaXplciBmb3IgYW4gQW5kcm9pZE5hbmRMaW1pdCBzdHJ1Y3R1cmUuCisjZGVmaW5lIEFORFJPSURfTkFORF9MSU1JVF9JTklUIFwKKyAgICB7IDBVTEwsIDBVTEwsIC0xLCAtMSB9CisKKy8vIFBhcnNlIGEgLW5hbmQtbGltaXQ9PGFyZ3M+IGNvbW1hbmQtbGluZSBvcHRpb24sIGFuZCB3cml0ZSB0aGUgcmVzdWx0cworLy8gdG8gfCpyZWFkX2xpbWl0fCBhbmQgfCp3cml0ZV9saW1pdHwuIHxhcmdzfCBpcyB0aGUgYXJndW1lbnQgc3RyaW5nLAorLy8gd2hpY2ggbXVzdCBiZSBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIDxrZXk+PTx2YWx1ZT4gYXNzaWdtZW50cywKKy8vIHdpdGggdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQga2V5czoKKy8vCisvLyAgIHBpZD08bnVtYmVyPgorLy8gICAgICBSZXF1aXJlZCwgcHJvY2VzcyBJRCB3aGVyZSB0byBzZW5kIGEgc2lnbmFsIHdoZW4gZWl0aGVyIG9uZSBvZiB0aGUKKy8vICAgICAgbGltaXRzIGlzIHJlYWNoZWQuCisvLworLy8gICBzaWduYWw9PG51bWJlcj4KKy8vICAgICAgUmVxdWlyZWQsIHNpZ25hbCBudW1iZXIgdG8gc2VuZCB0byA8cGlkPiB3aGVuIGVpdGhlIG9uZSBvZiB0aGUgbGltaXRzCisvLyAgICAgIGlzIHJlYWNoZWQuCisvLworLy8gICByZWFkcz08c2l6ZT4KKy8vICAgd3JpdGVzPTxzaXplPgorLy8gICAgICBPcHRpb25hbCByZWFkIGFuZCB3cml0ZSBsaW1pdCB0aHJlc2hvbGRzLiA8c2l6ZT4gY2FuIGJlIGEgbnVtYmVyIG9mCisvLyAgICAgIGJ5dGVzLCBvZiBhIGRlY2ltYWwgbnVtYmVyIGZvbGxvd2VkIGJ5IGEgc2l6ZSBzdWZmaXggbGlrZSBLLCBNIG9yIEcKKy8vICAgICAgZm9yIGtpbG9ieXRlcyAoS2lCKSwgbWVnYWJ5dGVzIChNaUIpIGFuZCBnaWdhYnl0ZXMgKEdpQiksIHJlc3BlY3RpdmVseS4KKy8vCisvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBvciBmYWxzZSBvbiBmYWlsdXJlLgorYm9vbCBhbmRyb2lkX25hbmRfbGltaXRzX3BhcnNlKGNvbnN0IGNoYXIqIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE5hbmRMaW1pdCogcmVhZF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkTmFuZExpbWl0KiB3cml0ZV9saW1pdCk7CisKKy8vIENhbGwgdGhpcyB0byB1cGRhdGUgdGhlIHxjb3VudGVyfCBvZiBhbiBBbmRyb2lkTmFuZExpbWl0IGluc3RhbmNlIHxsaW1pdHwuCisvLyBJZiBpdCByZWFjaGVzIHRoZSBsaW1pdCB0aHJlc2hvbGQsIGEgc2lnbmFsIHdpbGwgYmUgc2VudCB0byBhIHJlZ2lzdGVyZWQKKy8vIHBpZCwgdW5sZXNzIG5vbmUgd2FzIGNvbmZpZ3VyZWQgYnkgYW5kcm9pZF9uYW5kX2xpbWl0c19wYXJzZS4KK3ZvaWQgYW5kcm9pZF9uYW5kX2xpbWl0X3VwZGF0ZShBbmRyb2lkTmFuZExpbWl0KiBsaW1pdCwgdWludDMyX3QgY291bnQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vbmFuZF9saW1pdHNfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9uYW5kX2xpbWl0c191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyYmE4MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vbmFuZF9saW1pdHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vbmFuZF9saW1pdHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSBBUlJBWV9TSVpFKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworVEVTVChOYW5kTGltaXRzLFBhcnNlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBEYXRhIHsKKyAgICAgICAgY29uc3QgY2hhciogYXJnczsKKyAgICAgICAgYm9vbCByZXN1bHQ7CisgICAgICAgIHVpbnQ2NF90IHJlYWRfbGltaXQ7CisgICAgICAgIHVpbnQ2NF90IHdyaXRlX2xpbWl0OworICAgICAgICBpbnQgcGlkOworICAgICAgICBpbnQgc2lnbmFsOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyAicGlkPTEyOCxzaWduYWw9NjcscmVhZHM9NDU2NzgzIiwgdHJ1ZSwgNDU2NzgzVUxMLCAwVUxMLCAxMjgsIDY3IH0sCisgICAgICAgIHsgInNpZ25hbD02NSxwaWQ9MTI5LHJlYWRzPTEyOEsiLCB0cnVlLCAxMzEwNzJVTEwsIDBVTEwsIDEyOSwgNjUgfSwKKyAgICAgICAgeyAicmVhZHM9Nk0scGlkPTEzMCxzaWduYWw9NjQiLCB0cnVlLCA2MjkxNDU2VUxMLCAwVUxMLCAxMzAsIDY0IH0sCisgICAgICAgIHsgInBpZD0xMzAwMCxzaWduYWw9NSxyZWFkcz0xMkciLCB0cnVlLCAxMjg4NDkwMTg4OFVMTCwgMFVMTCwgMTMwMDAsIDUgfSwKKyAgICAgICAgeyAicGlkPTEyOCxzaWduYWw9Njcsd3JpdGVzPTQ1Njc4MyIsIHRydWUsIDBVTEwsIDQ1Njc4M1VMTCwgMTI4LCA2NyB9LAorICAgICAgICB7ICJzaWduYWw9NjUscGlkPTEyOSx3cml0ZXM9MTI4SyIsIHRydWUsIDBVTEwsIDEzMTA3MlVMTCwgMTI5LCA2NSB9LAorICAgICAgICB7ICJ3cml0ZXM9Nk0scGlkPTEzMCxzaWduYWw9NjQiLCB0cnVlLCAwVUxMLCA2MjkxNDU2VUxMLCAxMzAsIDY0IH0sCisgICAgICAgIHsgInBpZD0xMzAwMCxzaWduYWw9NSx3cml0ZXM9MTJHIiwgdHJ1ZSwgMFVMTCwgMTI4ODQ5MDE4ODhVTEwsIDEzMDAwLCA1IH0sCisgICAgICAgIHsgInBpZD0xLHNpZ25hbD0yLHJlYWRzPTEyMyx3cml0ZXM9MTZLIiwgdHJ1ZSwgMTIzVUxMLCAxNjM4NFVMTCwgMSwgMiB9LAorCisgICAgICAgIC8vIEVtcHR5IHN0cmluZ3MgcmV0dXJucyBhbiBlcnJvci4KKyAgICAgICAgeyAiIiwgZmFsc2UsIDBVTEwsIDBVTEwsIDAsIDAgfSwKKyAgICAgICAgeyAiICAgICAiLCBmYWxzZSwgMFVMTCwgMFVMTCwgMCwgMCB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IEFSUkFZX1NJWkUoa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFTaXplOyArK24pIHsKKyAgICAgICAgY29uc3QgRGF0YSYgZXhwZWN0ZWQgPSBrRGF0YVtuXTsKKyAgICAgICAgQW5kcm9pZE5hbmRMaW1pdCByLCB3OworICAgICAgICBib29sIHJlc3VsdCA9IGFuZHJvaWRfbmFuZF9saW1pdHNfcGFyc2UoZXhwZWN0ZWQuYXJncywgJnIsICZ3KTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnJlc3VsdCwgcmVzdWx0KSA8PCAiIyIgPDwgbjsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBpZCwgci5waWQpIDw8ICIjIiA8PCBuOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNpZ25hbCwgci5zaWduYWwpIDw8ICIjIiA8PCBuOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnJlYWRfbGltaXQsIHIubGltaXQpIDw8ICIjIiA8PCBuOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBpZCwgdy5waWQpIDw8ICIjIiA8PCBuOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnNpZ25hbCwgdy5zaWduYWwpIDw8ICIjIiA8PCBuOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLndyaXRlX2xpbWl0LCB3LmxpbWl0KSA8PCAiIyIgPDwgbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jbGllbnQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyNWIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jbGllbnQuY3BwCkBAIC0wLDAgKzEsNDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY2xpZW50LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfaG9zdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9tdWx0aXBsZXhlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworUWVtdWRDbGllbnQqIHFlbXVkX2NsaWVudF9uZXcoUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnRSZWN2IGNsaWVfcmVjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50Q2xvc2UgY2xpZV9jbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50U2F2ZSBjbGllX3NhdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudExvYWQgY2xpZV9sb2FkKSB7CisgICAgUWVtdWRNdWx0aXBsZXhlciogbSA9IHFlbXVkX211bHRpcGxleGVyOworICAgIFFlbXVkQ2xpZW50KiBjID0gcWVtdWRfY2xpZW50X2FsbG9jKGNoYW5uZWxJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZV9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZV9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVfY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZV9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5zZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm0tPmNsaWVudHMpOworCisgICAgcWVtdWRfc2VydmljZV9hZGRfY2xpZW50KHNlcnZpY2UsIGMpOworICAgIHJldHVybiBjOworfQorCitzdGF0aWMgUWVtdWRQaXBlTWVzc2FnZSogX3FlbXVkX3BpcGVfYWxsb2NfbXNnKGludCBtc2dsZW4pIHsKKyAgICBhdXRvIGJ1ZiA9IChRZW11ZFBpcGVNZXNzYWdlKikgbWFsbG9jKG1zZ2xlbiArIHNpemVvZihRZW11ZFBpcGVNZXNzYWdlKSk7CisgICAgaWYgKCFidWYpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLyogTWVzc2FnZSBzdGFydHMgcmlnaHQgYWZ0ZXIgdGhlIGRlc2NyaXB0b3IuICovCisgICAgYnVmLT5tZXNzYWdlID0gKHVpbnQ4X3QqKSBidWYgKyBzaXplb2YoUWVtdWRQaXBlTWVzc2FnZSk7CisgICAgYnVmLT5zaXplID0gbXNnbGVuOworICAgIGJ1Zi0+b2Zmc2V0ID0gMDsKKyAgICBidWYtPm5leHQgPSBOVUxMOworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyB2b2lkIF9xZW11ZF9waXBlX2FwcGVuZF9tc2coUWVtdWRDbGllbnQqIGNsaWVudCwgUWVtdWRQaXBlTWVzc2FnZSogYnVmKSB7CisgICAgaWYgKGNsaWVudC0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLmxhc3RfbXNnKSB7CisgICAgICAgIGNsaWVudC0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLmxhc3RfbXNnLT5uZXh0ID0gYnVmOworICAgICAgICBjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5sYXN0X21zZyA9IGJ1ZjsKKyAgICB9IGVsc2UgeworICAgICAgICBjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5sYXN0X21zZyA9CisgICAgICAgICAgICBjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5tZXNzYWdlcyA9IGJ1ZjsKKyAgICB9Cit9CisKK3ZvaWQgX3FlbXVkX3BpcGVfc2VuZChRZW11ZENsaWVudCogY2xpZW50LCBjb25zdCB1aW50OF90KiBtc2csIGludCBtc2dsZW4pIHsKKyAgICBpbnQgYXZhaWwsIGxlbiA9IG1zZ2xlbjsKKyAgICBpbnQgZnJhbWluZyA9IGNsaWVudC0+ZnJhbWluZzsKKworICAgIGlmIChtc2dsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRCgiJXM6IGxlbj0lM2QgJyVzJyIsCisgICAgICBfX0ZVTkNUSU9OX18sIG1zZ2xlbiwgcXVvdGVfYnl0ZXMoKGNvbnN0IGNoYXIqKSBtc2csIG1zZ2xlbikpOworCisgICAgaWYgKGZyYW1pbmcpIHsKKyAgICAgICAgbGVuICs9IEZSQU1FX0hFQURFUl9TSVpFOworICAgIH0KKworICAgIC8qIHBhY2tldGl6ZSB0aGUgcGF5bG9hZCBmb3IgdGhlIHNlcmlhbCBNVFUgKi8KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBhdmFpbCA9IGxlbjsKKyAgICAgICAgaWYgKGF2YWlsID4gTUFYX1NFUklBTF9QQVlMT0FEKQorICAgICAgICAgICAgYXZhaWwgPSBNQVhfU0VSSUFMX1BBWUxPQUQ7CisKKyAgICAgICAgLyogaW5zZXJ0IGZyYW1lIGhlYWRlciB3aGVuIG5lZWRlZCAqLworICAgICAgICBRZW11ZFBpcGVNZXNzYWdlKiBmcmFtZV9tc2c7CisgICAgICAgIFFlbXVkUGlwZU1lc3NhZ2UqIHBpcGVfbXNnOworICAgICAgICBpZiAoZnJhbWluZykgeworICAgICAgICAgICAgZnJhbWVfbXNnID0gX3FlbXVkX3BpcGVfYWxsb2NfbXNnKEZSQU1FX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIGludDJoZXgoZnJhbWVfbXNnLT5tZXNzYWdlLCBGUkFNRV9IRUFERVJfU0laRSwgbXNnbGVuKTsKKyAgICAgICAgICAgIF9xZW11ZF9waXBlX2FwcGVuZF9tc2coY2xpZW50LCBmcmFtZV9tc2cpOworCisgICAgICAgICAgICBhdmFpbCAtPSBGUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgIGxlbiAtPSBGUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgIGZyYW1pbmcgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcGlwZV9tc2cgPSBfcWVtdWRfcGlwZV9hbGxvY19tc2coYXZhaWwpOworCisgICAgICAgIGFzc2VydChwaXBlX21zZyk7CisgICAgICAgIG1lbWNweShwaXBlX21zZy0+bWVzc2FnZSwgbXNnLCBhdmFpbCk7CisKKyAgICAgICAgVCgiJXM6ICclLipzJyIsIF9fZnVuY19fLCBhdmFpbCwgbXNnKTsKKworICAgICAgICBfcWVtdWRfcGlwZV9hcHBlbmRfbXNnKGNsaWVudCwgcGlwZV9tc2cpOworICAgICAgICBhbmRyb2lkX3BpcGVfaG9zdF9zaWduYWxfd2FrZSgKKyAgICAgICAgICAgICAgICBjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5xZW11ZF9waXBlLT5od3BpcGUsCisgICAgICAgICAgICAgICAgUElQRV9XQUtFX1JFQUQpOworICAgICAgICBtc2cgKz0gYXZhaWw7CisgICAgICAgIGxlbiAtPSBhdmFpbDsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdWRfY2xpZW50X3NlbmQoUWVtdWRDbGllbnQqIGNsaWVudCwgY29uc3QgdWludDhfdCogbXNnLCBpbnQgbXNnbGVuKSB7CisgICAgaWYgKHFlbXVkX2lzX3BpcGVfY2xpZW50KGNsaWVudCkpIHsKKyAgICAgICAgX3FlbXVkX3BpcGVfc2VuZChjbGllbnQsIG1zZywgbXNnbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBxZW11ZF9zZXJpYWxfc2VuZChjbGllbnQtPlByb3RvY29sU2VsZWN0b3IuU2VyaWFsLnNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5jaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmZyYW1pbmcgIT0gMCwgbXNnLCBtc2dsZW4pOworICAgIH0KK30KKwordm9pZCBxZW11ZF9jbGllbnRfc2V0X2ZyYW1pbmcoUWVtdWRDbGllbnQqIGNsaWVudCwgaW50IGZyYW1pbmcpIHsKKyAgICAvKiByZWxlYXNlIGR5bmFtaWMgYnVmZmVyIGlmIHdlJ3JlIGRpc2FibGluZyBmcmFtaW5nICovCisgICAgaWYgKGNsaWVudC0+ZnJhbWluZykgeworICAgICAgICBpZiAoIWNsaWVudC0+bmVlZF9oZWFkZXIpIHsKKyAgICAgICAgICAgIEFGUkVFKGNsaWVudC0+cGF5bG9hZC0+YnVmZik7CisgICAgICAgICAgICBjbGllbnQtPm5lZWRfaGVhZGVyID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbGllbnQtPmZyYW1pbmcgPSAhIWZyYW1pbmc7Cit9CisKKy8qIHRoaXMgY2FuIGJlIHVzZWQgYnkgYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uIHRvIGNsb3NlIGEKKyAqIHNwZWNpZmljIGNsaWVudCBjb25uZWN0aW9uLgorICovCit2b2lkIHFlbXVkX2NsaWVudF9jbG9zZShRZW11ZENsaWVudCogY2xpZW50KSB7CisgICAgcWVtdWRfY2xpZW50X2Rpc2Nvbm5lY3QoY2xpZW50LCAwKTsKK30KKworYm9vbCBxZW11ZF9pc19waXBlX2NsaWVudChRZW11ZENsaWVudCogY2xpZW50KSB7CisgICAgcmV0dXJuIGNsaWVudC0+cHJvdG9jb2wgPT0gUUVNVURfUFJPVE9DT0xfUElQRTsKK30KKworLyogcmVtb3ZlIGEgUWVtdWRDbGllbnQgZnJvbSBnbG9iYWwgbGlzdCAqLwordm9pZCBxZW11ZF9jbGllbnRfcmVtb3ZlKFFlbXVkQ2xpZW50KiBjKSB7CisgICAgYy0+cHJlZlswXSA9IGMtPm5leHQ7CisgICAgaWYgKGMtPm5leHQpCisgICAgICAgIGMtPm5leHQtPnByZWYgPSBjLT5wcmVmOworCisgICAgYy0+bmV4dCA9IE5VTEw7CisgICAgYy0+cHJlZiA9ICZjLT5uZXh0OworfQorCisvKiBhZGQgYSBRZW11ZENsaWVudCB0byBnbG9iYWwgbGlzdCAqLwordm9pZCBxZW11ZF9jbGllbnRfcHJlcGVuZChRZW11ZENsaWVudCogYywgUWVtdWRDbGllbnQqKiBwbGlzdCkgeworICAgIGMtPm5leHQgPSAqcGxpc3Q7CisgICAgYy0+cHJlZiA9IHBsaXN0OworICAgICpwbGlzdCA9IGM7CisgICAgaWYgKGMtPm5leHQpCisgICAgICAgIGMtPm5leHQtPnByZWYgPSAmYy0+bmV4dDsKK30KKworLyogcmVjZWl2ZSBhIG5ldyBtZXNzYWdlIGZyb20gYSBjbGllbnQsIGFuZCBkaXNwYXRjaCBpdCB0bworICogdGhlIHJlYWwgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKyAqLwordm9pZCBxZW11ZF9jbGllbnRfcmVjdih2b2lkKiBvcGFxdWUsIHVpbnQ4X3QqIG1zZywgaW50IG1zZ2xlbikgeworICAgIFFlbXVkQ2xpZW50KiBjID0gc3RhdGljX2Nhc3Q8UWVtdWRDbGllbnQqPihvcGFxdWUpOworCisgICAgLyogbm8gZnJhbWluZywgdGhpbmdzIGFyZSBzaW1wbGUgKi8KKyAgICBpZiAoIWMtPmZyYW1pbmcpIHsKKyAgICAgICAgaWYgKGMtPmNsaWVfcmVjdikKKyAgICAgICAgICAgIGMtPmNsaWVfcmVjdihjLT5jbGllX29wYXF1ZSwgbXNnLCBtc2dsZW4sIGMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZnJhbWluZyAqLworCisjaWYgMQorICAgIC8qIHNwZWNpYWwgY2FzZSwgaW4gOTklIG9mIGNhc2VzLCBldmVyeXRoaW5nIGlzIGluCisgICAgICogdGhlIGluY29taW5nIG1lc3NhZ2UsIGFuZCB3ZSBjYW4gZG8gYWxsIHdlIG5lZWQKKyAgICAgKiBkaXJlY3RseSB3aXRob3V0IGR5bmFtaWMgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBpZiAobXNnbGVuID4gRlJBTUVfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgYy0+bmVlZF9oZWFkZXIgPT0gMSAmJgorICAgICAgICBxZW11ZF9zaW5rX25lZWRlZChjLT5oZWFkZXIpID09IDApIHsKKyAgICAgICAgaW50IGxlbiA9IGhleDJpbnQobXNnLCBGUkFNRV9IRUFERVJfU0laRSk7CisKKyAgICAgICAgaWYgKGxlbiA+PSAwICYmIG1zZ2xlbiA9PSBsZW4gKyBGUkFNRV9IRUFERVJfU0laRSkgeworICAgICAgICAgICAgaWYgKGMtPmNsaWVfcmVjdikKKyAgICAgICAgICAgICAgICBjLT5jbGllX3JlY3YoYy0+Y2xpZV9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArIEZSQU1FX0hFQURFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dsZW4gLSBGUkFNRV9IRUFERVJfU0laRSwgYyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHdoaWxlIChtc2dsZW4gPiAwKSB7CisgICAgICAgIHVpbnQ4X3QqIGRhdGE7CisKKyAgICAgICAgLyogcmVhZCB0aGUgaGVhZGVyICovCisgICAgICAgIGlmIChjLT5uZWVkX2hlYWRlcikgeworICAgICAgICAgICAgaW50IGZyYW1lX3NpemU7CisgICAgICAgICAgICB1aW50OF90KiBkYXRhOworCisgICAgICAgICAgICBpZiAoIXFlbXVkX3NpbmtfZmlsbChjLT5oZWFkZXIsIChjb25zdCB1aW50OF90KiopICZtc2csICZtc2dsZW4pKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBmcmFtZV9zaXplID0gaGV4MmludChjLT5oZWFkZXIwLCA0KTsKKyAgICAgICAgICAgIGlmIChmcmFtZV9zaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBEKCIlczogaWdub3JpbmcgZW1wdHkgZnJhbWUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZyYW1lX3NpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IGlnbm9yaW5nIGNvcnJ1cHRlZCBmcmFtZSBoZWFkZXIgJy4qcyciLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBGUkFNRV9IRUFERVJfU0laRSwgYy0+aGVhZGVyMCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qICsxIGZvciB0ZXJtaW5hdGluZyB6ZXJvICovCisgICAgICAgICAgICBkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KAorICAgICAgICAgICAgICAgICAgICBfYW5kcm9pZF9hcnJheV9hbGxvYyhzaXplb2YoKmRhdGEpLCBmcmFtZV9zaXplICsgMSkpOworICAgICAgICAgICAgcWVtdWRfc2lua19yZXNldChjLT5wYXlsb2FkLCBmcmFtZV9zaXplLCBkYXRhKTsKKyAgICAgICAgICAgIGMtPm5lZWRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgIGMtPmhlYWRlci0+dXNlZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIHRoZSBwYXlsb2FkICovCisgICAgICAgIGlmICghcWVtdWRfc2lua19maWxsKGMtPnBheWxvYWQsIChjb25zdCB1aW50OF90KiopICZtc2csICZtc2dsZW4pKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYy0+cGF5bG9hZC0+YnVmZltjLT5wYXlsb2FkLT5zaXplXSA9IDA7CisgICAgICAgIGMtPm5lZWRfaGVhZGVyID0gMTsKKyAgICAgICAgZGF0YSA9IGMtPnBheWxvYWQtPmJ1ZmY7CisKKyAgICAgICAgLyogVGVjaG5pY2FsbHksIGNhbGxpbmcgJ2NsaWVfcmVjdicgY2FuIGRlc3Ryb3kgY2xpZW50IG9iamVjdCAnYycKKyAgICAgICAgICogaWYgaXQgZGVjaWRlcyB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiwgc28gZW5zdXJlIHdlIGRvbid0CisgICAgICAgICAqIHVzZS9kZXJlZmVyZW5jZSBpdCBhZnRlciB0aGUgY2FsbC4gKi8KKyAgICAgICAgaWYgKGMtPmNsaWVfcmVjdikKKyAgICAgICAgICAgIGMtPmNsaWVfcmVjdihjLT5jbGllX29wYXF1ZSwgYy0+cGF5bG9hZC0+YnVmZiwgYy0+cGF5bG9hZC0+c2l6ZSwgYyk7CisKKyAgICAgICAgQUZSRUUoZGF0YSk7CisgICAgfQorfQorCisvKiBGcmVlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgcWVtdWQgY2xpZW50LgorICovCit2b2lkIF9xZW11ZF9jbGllbnRfZnJlZShRZW11ZENsaWVudCogYykgeworICAgIGlmIChjICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHFlbXVkX2lzX3BpcGVfY2xpZW50KGMpKSB7CisgICAgICAgICAgICAvKiBGcmVlIG91dHN0YW5kaW5nIG1lc3NhZ2VzLiAqLworICAgICAgICAgICAgUWVtdWRQaXBlTWVzc2FnZSoqIG1zZ19saXN0ID0gJmMtPlByb3RvY29sU2VsZWN0b3IuUGlwZS5tZXNzYWdlczsKKyAgICAgICAgICAgIHdoaWxlICgqbXNnX2xpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFFlbXVkUGlwZU1lc3NhZ2UqIHRvX2ZyZWUgPSAqbXNnX2xpc3Q7CisgICAgICAgICAgICAgICAgKm1zZ19saXN0ID0gdG9fZnJlZS0+bmV4dDsKKyAgICAgICAgICAgICAgICBmcmVlKHRvX2ZyZWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLmxhc3RfbXNnID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy0+cGFyYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShjLT5wYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgQUZSRUUoYyk7CisgICAgfQorfQorCisvKiBkaXNjb25uZWN0IGEgY2xpZW50LiB0aGlzIGF1dG9tYXRpY2FsbHkgZnJlZXMgdGhlIFFlbXVkQ2xpZW50LgorICogbm90ZSB0aGF0IHRoaXMgYWxzbyByZW1vdmVzIHRoZSBjbGllbnQgZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKyAqIGFuZCBmcm9tIGl0cyBzZXJ2aWNlJ3MgbGlzdCwgaWYgYW55LgorICogUGFyYW06CisgKiAgb3BhcXVlIC0gUWVtdUNsaWVudCBpbnN0YW5jZQorICogIGd1ZXN0X2Nsb3NlIC0gRm9yIHBpcGUgY2xpZW50cyBjb250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBkaXNjb25uZWN0IGlzCisgKiAgICAgIGNhdXNlZCBieSBndWVzdCBjbG9zaW5nIHRoZSBwaXBlIGhhbmRsZSAoaW4gd2hpY2ggY2FzZSAxIGlzIHBhc3NlZCBpbgorICogICAgICB0aGlzIHBhcmFtZXRlcikuIEZvciBzZXJpYWwgY2xpZW50cyB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICovCit2b2lkIHFlbXVkX2NsaWVudF9kaXNjb25uZWN0KHZvaWQqIG9wYXF1ZSwgaW50IGd1ZXN0X2Nsb3NlKSB7CisgICAgUWVtdWRDbGllbnQqIGMgPSBzdGF0aWNfY2FzdDxRZW11ZENsaWVudCo+KG9wYXF1ZSk7CisKKyAgICBpZiAoYy0+Y2xvc2luZykgeyAgLyogcmVjdXJzaXZlIGNhbGwsIGV4aXQgaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChxZW11ZF9pc19waXBlX2NsaWVudChjKSAmJiAhZ3Vlc3RfY2xvc2UpIHsKKyAgICAgICAgYW5kcm9pZF9waXBlX2hvc3RfY2xvc2UoYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLnFlbXVkX3BpcGUtPmh3cGlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5jbG9zaW5nID0gMTsKKworICAgIC8qIHJlbW92ZSBmcm9tIGN1cnJlbnQgbGlzdCAqLworICAgIHFlbXVkX2NsaWVudF9yZW1vdmUoYyk7CisKKyAgICBpZiAocWVtdWRfaXNfcGlwZV9jbGllbnQoYykpIHsKKyAgICAgICAgLyogV2UgbXVzdCBOVUxMIHRoZSBjbGllbnQgcmVmZXJlbmNlIGluIHRoZSBRZW11UGlwZSBmb3IgdGhpcyBjb25uZWN0aW9uLAorICAgICAgICAgKiBzbyBpZiBhIHN1ZGRlbiByZWNlaXZlIHJlcXVlc3QgY29tZXMgYWZ0ZXIgY2xpZW50IGhhcyBiZWVuIGNsb3NlZCwgd2UKKyAgICAgICAgICogZG9uJ3QgYmxvdyB1cC4gKi8KKyAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLnFlbXVkX3BpcGUtPmNsaWVudCA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChjLT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5jaGFubmVsID4gMCkgeworICAgICAgICAvKiBzZW5kIGEgZGlzY29ubmVjdCBjb21tYW5kIHRvIHRoZSBkYWVtb24gKi8KKyAgICAgICAgY2hhciB0bXBbMTI4XSwgKiBwID0gdG1wLCAqIGVuZCA9IHAgKyBzaXplb2YodG1wKTsKKyAgICAgICAgcCA9IGJ1ZnByaW50KHRtcCwgZW5kLCAiZGlzY29ubmVjdDolMDJ4IiwKKyAgICAgICAgICAgICAgICAgICAgIGMtPlByb3RvY29sU2VsZWN0b3IuU2VyaWFsLmNoYW5uZWwpOworICAgICAgICBxZW11ZF9zZXJpYWxfc2VuZChjLT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5zZXJpYWwsIDAsIDAsICh1aW50OF90KikgdG1wLCBwIC0gdG1wKTsKKyAgICB9CisKKyAgICAvKiBjYWxsIHRoZSBjbGllbnQgY2xvc2UgY2FsbGJhY2sgKi8KKyAgICBpZiAoYy0+Y2xpZV9jbG9zZSkgeworICAgICAgICBjLT5jbGllX2Nsb3NlKGMtPmNsaWVfb3BhcXVlKTsKKyAgICAgICAgYy0+Y2xpZV9jbG9zZSA9IE5VTEw7CisgICAgfQorICAgIGMtPmNsaWVfcmVjdiA9IE5VTEw7CisKKyAgICAvKiByZW1vdmUgZnJvbSBzZXJ2aWNlIGxpc3QsIGlmIGFueSAqLworICAgIGlmIChjLT5zZXJ2aWNlKSB7CisgICAgICAgIHFlbXVkX3NlcnZpY2VfcmVtb3ZlX2NsaWVudChjLT5zZXJ2aWNlLCBjKTsKKyAgICAgICAgYy0+c2VydmljZSA9IE5VTEw7CisgICAgfQorCisgICAgX3FlbXVkX2NsaWVudF9mcmVlKGMpOworfQorCisvKiBhbGxvY2F0ZSBhIG5ldyBRZW11ZENsaWVudCBvYmplY3QKKyAqIE5PVEU6IGNoYW5uZWxfaWQgdmFsaWUgaXMgdXNlZCBhcyBhIHNlbGVjdG9yIGJldHdlZW4gc2VyaWFsIGFuZCBwaXBlIGNsaWVudHMuCisgKiBTaW5jZSBjaGFubmVsX2lkIDwgMCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciBhIHNlcmlhbCBjbGllbnQsIGl0IHdvdWxkCisgKiBpbmRpY2F0ZSB0aGF0IGNyZWF0aW5nIGNsaWVudCBpcyBhIHBpcGUgY2xpZW50LiAqLworUWVtdWRDbGllbnQqIHFlbXVkX2NsaWVudF9hbGxvYyhpbnQgY2hhbm5lbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xpZW50X3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjbGllX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnRSZWN2IGNsaWVfcmVjdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnRDbG9zZSBjbGllX2Nsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudFNhdmUgY2xpZV9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudExvYWQgY2xpZV9sb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcmlhbCogc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudCoqIHBjbGllbnRzKSB7CisgICAgUWVtdWRDbGllbnQqIGMgPSBzdGF0aWNfY2FzdDxRZW11ZENsaWVudCo+KGFuZHJvaWRfYWxsb2MwKHNpemVvZigqYykpKTsKKworICAgIGlmIChjaGFubmVsX2lkIDwgMCkgeworICAgICAgICAvKiBBbGxvY2F0aW5nIGEgcGlwZSBjbGllbnQuICovCisgICAgICAgIGMtPnByb3RvY29sID0gUUVNVURfUFJPVE9DT0xfUElQRTsKKyAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLm1lc3NhZ2VzID0gTlVMTDsKKyAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLmxhc3RfbXNnID0gTlVMTDsKKyAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5QaXBlLnFlbXVkX3BpcGUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFsbG9jYXRpbmcgYSBzZXJpYWwgY2xpZW50LiAqLworICAgICAgICBjLT5wcm90b2NvbCA9IFFFTVVEX1BST1RPQ09MX1NFUklBTDsKKyAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuc2VyaWFsID0gc2VyaWFsOworICAgICAgICBjLT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5jaGFubmVsID0gY2hhbm5lbF9pZDsKKyAgICB9CisgICAgYy0+cGFyYW0gPSBjbGllbnRfcGFyYW0gPyBBU1RSRFVQKGNsaWVudF9wYXJhbSkgOiBOVUxMOworICAgIGMtPmNsaWVfb3BhcXVlID0gY2xpZV9vcGFxdWU7CisgICAgYy0+Y2xpZV9yZWN2ID0gY2xpZV9yZWN2OworICAgIGMtPmNsaWVfY2xvc2UgPSBjbGllX2Nsb3NlOworICAgIGMtPmNsaWVfc2F2ZSA9IGNsaWVfc2F2ZTsKKyAgICBjLT5jbGllX2xvYWQgPSBjbGllX2xvYWQ7CisgICAgYy0+c2VydmljZSA9IE5VTEw7CisgICAgYy0+bmV4dF9zZXJ2ID0gTlVMTDsKKyAgICBjLT5uZXh0ID0gTlVMTDsKKyAgICBjLT5mcmFtaW5nID0gMDsKKyAgICBjLT5uZWVkX2hlYWRlciA9IDE7CisgICAgcWVtdWRfc2lua19yZXNldChjLT5oZWFkZXIsIEZSQU1FX0hFQURFUl9TSVpFLCBjLT5oZWFkZXIwKTsKKworICAgIHFlbXVkX2NsaWVudF9wcmVwZW5kKGMsIHBjbGllbnRzKTsKKworICAgIHJldHVybiBjOworfQorCisvKiBTYXZlcyB0aGUgY2xpZW50IHN0YXRlIG5lZWRlZCB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvbnMgb24gbG9hZC4KKyAqIE5vdGUgdGhhdCB3ZSBzYXZlIG9ubHkgc2VyaWFsIGNsaWVudHMgaGVyZS4gVGhlIHBpcGUgY2xpZW50cyB3aWxsIGJlCisgKiBzYXZlZCBhbG9uZyB3aXRoIHRoZSBwaXBlIHRvIHdoaWNoIHRoZXkgYXJlIGF0dGFjaGVkLgorICovCit2b2lkIHFlbXVkX3NlcmlhbF9jbGllbnRfc2F2ZShTdHJlYW0qIGYsIFFlbXVkQ2xpZW50KiBjKSB7CisgICAgLyogc2F2ZSBnZW5lcmljIGluZm9ybWF0aW9uICovCisgICAgcWVtdWRfc2VydmljZV9zYXZlX25hbWUoZiwgYy0+c2VydmljZSk7CisgICAgc3RyZWFtX3B1dF9zdHJpbmcoZiwgYy0+cGFyYW0pOworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBjLT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5jaGFubmVsKTsKKworICAgIC8qIHNhdmUgY2xpZW50LXNwZWNpZmljIHN0YXRlICovCisgICAgaWYgKGMtPmNsaWVfc2F2ZSkKKyAgICAgICAgYy0+Y2xpZV9zYXZlKGYsIGMsIGMtPmNsaWVfb3BhcXVlKTsKKworICAgIC8qIHNhdmUgZnJhbWluZyBjb25maWd1cmF0aW9uICovCisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIGMtPmZyYW1pbmcpOworICAgIGlmIChjLT5mcmFtaW5nKSB7CisgICAgICAgIHN0cmVhbV9wdXRfYmUzMihmLCBjLT5uZWVkX2hlYWRlcik7CisgICAgICAgIC8qIGhlYWRlciBzaW5rIGFsd2F5cyBjb25uZWN0ZWQgdG8gYy0+aGVhZGVyMCwgbm8gbmVlZCB0byBzYXZlICovCisgICAgICAgIHN0cmVhbV9wdXRfYmUzMihmLCBGUkFNRV9IRUFERVJfU0laRSk7CisgICAgICAgIHN0cmVhbV93cml0ZShmLCBjLT5oZWFkZXIwLCBGUkFNRV9IRUFERVJfU0laRSk7CisgICAgICAgIC8qIHBheWxvYWQgc2luayAqLworICAgICAgICBxZW11ZF9zaW5rX3NhdmUoZiwgYy0+cGF5bG9hZCk7CisgICAgICAgIHN0cmVhbV93cml0ZShmLCBjLT5wYXlsb2FkLT5idWZmLCBjLT5wYXlsb2FkLT5zaXplKTsKKyAgICB9Cit9CisKKy8qIExvYWRzIGNsaWVudCBzdGF0ZSBmcm9tIGZpbGUsIHRoZW4gc3RhcnRzIGEgbmV3IGNsaWVudCBjb25uZWN0ZWQgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHNlcnZpY2UuCisgKiBOb3RlIHRoYXQgd2UgbG9hZCBvbmx5IHNlcmlhbCBjbGllbnRzIGhlcmUuIFRoZSBwaXBlIGNsaWVudHMgd2lsbCBiZQorICogbG9hZGVkIGFsb25nIHdpdGggdGhlIHBpcGUgdG8gd2hpY2ggdGhleSB3ZXJlIGF0dGFjaGVkLgorICovCitpbnQgcWVtdWRfc2VyaWFsX2NsaWVudF9sb2FkKFN0cmVhbSogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlKiBjdXJyZW50X3NlcnZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgeworICAgIGNoYXIqIHNlcnZpY2VfbmFtZSA9IHFlbXVkX3NlcnZpY2VfbG9hZF9uYW1lKGYpOworICAgIGlmIChzZXJ2aWNlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgY2hhciogcGFyYW0gPSBzdHJlYW1fZ2V0X3N0cmluZyhmKTsKKyAgICAvKiBnZXQgY3VycmVudCBzZXJ2aWNlIGluc3RhbmNlICovCisgICAgUWVtdWRTZXJ2aWNlKiBzdiA9IHFlbXVkX3NlcnZpY2VfZmluZChjdXJyZW50X3NlcnZpY2VzLCBzZXJ2aWNlX25hbWUpOworICAgIGlmIChzdiA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBsb2FkIGZhaWxlZDogdW5rbm93biBzZXJ2aWNlIFwiJXNcIlxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlcnZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIGludCBjaGFubmVsID0gc3RyZWFtX2dldF9iZTMyKGYpOworCisgICAgaWYgKGNoYW5uZWwgPT0gMCkgeworICAgICAgICBEKCIlczogaWxsZWdhbCBzbmFwc2hvdDogY2xpZW50IGZvciBjb250cm9sIGNoYW5uZWwgbXVzdCBubyBiZSBzYXZlZFxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICAvKiByZS1jb25uZWN0IGNsaWVudCAqLworICAgIFFlbXVkQ2xpZW50KiBjID0gcWVtdWRfc2VydmljZV9jb25uZWN0X2NsaWVudChzdiwgY2hhbm5lbCwgcGFyYW0pOworICAgIGlmIChjID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUlPOworCisgICAgLyogbG9hZCBjbGllbnQtc3BlY2lmaWMgc3RhdGUgKi8KKyAgICBpbnQgcmV0OworICAgIGlmIChjLT5jbGllX2xvYWQpIGlmICgocmV0ID0gYy0+Y2xpZV9sb2FkKGYsIGMsIGMtPmNsaWVfb3BhcXVlKSkpCisgICAgICAgIHJldHVybiByZXQ7ICAvKiBsb2FkIGZhaWx1cmUgKi8KKworICAgIC8qIGxvYWQgZnJhbWluZyBjb25maWd1cmF0aW9uICovCisgICAgYy0+ZnJhbWluZyA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBpZiAoYy0+ZnJhbWluZykgeworCisgICAgICAgIC8qIGhlYWRlciBidWZmZXIgKi8KKyAgICAgICAgYy0+bmVlZF9oZWFkZXIgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgICAgIGludCBoZWFkZXJfc2l6ZSA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICAgICAgaWYgKGhlYWRlcl9zaXplID4gRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgICAgIEQoIiVzOiBsb2FkIGZhaWxlZDogcGF5bG9hZCBidWZmZXIgcmVxdWlyZXMgJWQgYnl0ZXMsICVkIGF2YWlsYWJsZVxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoZWFkZXJfc2l6ZSwgRlJBTUVfSEVBREVSX1NJWkUpOworICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBzdHJlYW1fcmVhZChmLCBjLT5oZWFkZXIwLCBoZWFkZXJfc2l6ZSkpICE9IGhlYWRlcl9zaXplKSB7CisgICAgICAgICAgICBEKCIlczogZnJhbWUgaGVhZGVyIGJ1ZmZlciBsb2FkIGZhaWxlZDogZXhwZWN0ZWQgJWQgYnl0ZXMsIGdvdCAlZFxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoZWFkZXJfc2l6ZSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgLyogcGF5bG9hZCBzaW5rICovCisgICAgICAgIGlmICgocmV0ID0gcWVtdWRfc2lua19sb2FkKGYsIGMtPnBheWxvYWQpKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogcmVwbGFjZSBwYXlsb2FkIGJ1ZmZlciBieSBzYXZlZCBkYXRhICovCisgICAgICAgIGlmIChjLT5wYXlsb2FkLT5idWZmKSB7CisgICAgICAgICAgICBBRlJFRShjLT5wYXlsb2FkLT5idWZmKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qICsxIGZvciB0ZXJtaW5hdGluZyB6ZXJvICovCisgICAgICAgIGMtPnBheWxvYWQtPmJ1ZmYgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oCisgICAgICAgICAgICAgICAgX2FuZHJvaWRfYXJyYXlfYWxsb2Moc2l6ZW9mKCpjLT5wYXlsb2FkLT5idWZmKSwgYy0+cGF5bG9hZC0+c2l6ZSArIDEpKTsKKyAgICAgICAgaWYgKChyZXQgPSBzdHJlYW1fcmVhZChmLCBjLT5wYXlsb2FkLT5idWZmLCBjLT5wYXlsb2FkLT5zaXplKSkgIT0KKyAgICAgICAgICAgIGMtPnBheWxvYWQtPnNpemUpIHsKKyAgICAgICAgICAgIEQoIiVzOiBmcmFtZSBwYXlsb2FkIGJ1ZmZlciBsb2FkIGZhaWxlZDogZXhwZWN0ZWQgJWQgYnl0ZXMsIGdvdCAlZFxuIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjLT5wYXlsb2FkLT5zaXplLCByZXQpOworICAgICAgICAgICAgQUZSRUUoYy0+cGF5bG9hZC0+YnVmZik7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NsaWVudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmN2E2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY2xpZW50LmgKQEAgLTAsMCArMSwxOTAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcWVtdWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2luay5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisKKy8qIERlc2NyaXB0b3IgZm9yIGEgZGF0YSBidWZmZXIgcGVuZGluZyB0byBiZSBzZW50IHRvIGEgcWVtdWQgcGlwZSBjbGllbnQuCisgKgorICogV2hlbiBhIHNlcnZpY2UgZGVjaWRlcyB0byBzZW5kIGRhdGEgdG8gdGhlIGNsaWVudCwgdGhlcmUgY291bGQgYmUgY2FzZXMgd2hlbgorICogY2xpZW50IGlzIG5vdCByZWFkeSB0byByZWFkIHRoZW0uIEluIHRoaXMgY2FzZSB0aGVyZSBpcyBubyBBbmRyb2lkUGlwZUJ1ZmZlcgorICogYXZhaWxhYmxlIHRvIHdyaXRlIHNlcnZpY2UncyBkYXRhIHRvLCBTbywgd2UgbmVlZCB0byBjYWNoZSB0aGF0IGRhdGEgaW50byB0aGUKKyAqIGNsaWVudCBkZXNjcmlwdG9yLCBhbmQgInNlbmQiIHRoZW0gb3ZlciB0byB0aGUgY2xpZW50IGluIF9xZW11ZFBpcGVfcmVjdkJ1ZmZlcnMKKyAqIGNhbGxiYWNrLiBQZW5kaW5nIHNlcnZpY2UgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNsaWVudCBkZXNjcmlwdG9yIGFzIGEgbGlzdAorICogb2YgUWVtdWRQaXBlTWVzc2FnZSBpbnN0YW5jZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IFFlbXVkUGlwZU1lc3NhZ2UgUWVtdWRQaXBlTWVzc2FnZTsKK3N0cnVjdCBRZW11ZFBpcGVNZXNzYWdlIHsKKyAgICAvKiBNZXNzYWdlIHRvIHNlbmQuICovCisgICAgdWludDhfdCogbWVzc2FnZTsKKyAgICAvKiBNZXNzYWdlIHNpemUuICovCisgICAgc2l6ZV90IHNpemU7CisgICAgLyogT2Zmc2V0IGluIHRoZSBtZXNzYWdlIGJ1ZmZlciBvZiB0aGUgY2h1bmssIHRoYXQgaGFzIG5vdCBiZWVuIHNlbnQKKyAgICAgKiB0byB0aGUgcGlwZSB5ZXQuICovCisgICAgc2l6ZV90IG9mZnNldDsKKyAgICAvKiBMaW5rcyBuZXh0IG1lc3NhZ2UgaW4gdGhlIGNsaWVudC4gKi8KKyAgICBRZW11ZFBpcGVNZXNzYWdlKiBuZXh0OworfTsKKworCisvKiBBIFFlbXVkQ2xpZW50IG1vZGVscyBhIHNpbmdsZSBjbGllbnQgYXMgc2VlbiBieSB0aGUgZW11bGF0b3IuCisgKiBFYWNoIGNsaWVudCBoYXMgaXRzIG93biBjaGFubmVsIGlkIChmb3IgdGhlIHNlcmlhbCBxZW11ZCksIG9yIHBpcGUgZGVzY3JpcHRvcgorICogKGZvciB0aGUgcGlwZSBiYXNlZCBxZW11ZCksIGFuZCBiZWxvbmdzIHRvIGEgZ2l2ZW4gUWVtdWRTZXJ2aWNlIChzZWUgYmVsb3cpLgorICoKKyAqIFRoZXJlIGlzIGEgZ2xvYmFsIGxpc3Qgb2Ygc2VyaWFsIGNsaWVudHMgdXNlZCB0byBtdWx0aXBsZXggaW5jb21pbmcKKyAqIG1lc3NhZ2VzIGZyb20gdGhlIGNoYW5uZWwgaWQgKHNlZSBxZW11ZF9tdWx0aXBsZXhlcl9zZXJpYWxfcmVjdigpKS4gUGlwZQorICogY2xpZW50cyBkb24ndCBuZWVkIG11bHRpcGxleGluZywgYmVjYXVzZSB0aGV5IGFyZSBjb21tdW5pY2F0ZWQgdmlhIHFlbXVkIHBpcGVzCisgKiB0aGF0IGFyZSB1bmlxdWUgZm9yIGVhY2ggY2xpZW50LgorICoKKyAqLworCisvKiBEZWZpbmVzIHR5cGUgb2YgdGhlIGNsaWVudDogcGlwZSwgb3Igc2VyaWFsLgorICovCit0eXBlZGVmIGVudW0gUWVtdWRQcm90b2NvbCB7CisgICAgLyogQ2xpZW50IGlzIGNvbW11bmljYXRpbmcgdmlhIHBpcGUuICovCisgICAgUUVNVURfUFJPVE9DT0xfUElQRSwKKyAgICAvKiBDbGllbnQgaXMgY29tbXVuaWNhdGluZyB2aWEgc2VyaWFsIHBvcnQuICovCisgICAgUUVNVURfUFJPVE9DT0xfU0VSSUFMCit9IFFlbXVkUHJvdG9jb2w7CisKKy8qIERlc2NyaXB0b3IgZm9yIGEgUUVNVUQgcGlwZSBjb25uZWN0aW9uLgorICoKKyAqIEV2ZXJ5IHRpbWUgYSBjbGllbnQgY29ubmVjdHMgdG8gdGhlIFFFTVVEIHZpYSBwaXBlLCBhbiBpbnN0YW5jZSBvZiB0aGlzCisgKiBzdHJ1Y3R1cmUgaXMgY3JlYXRlZCB0byByZXByZXNlbnQgYSBjb25uZWN0aW9uIHVzZWQgYnkgbmV3IHBpcGUgY2xpZW50LgorICovCit0eXBlZGVmIHN0cnVjdCBRZW11ZFBpcGUgeworICAgIC8qIFBpcGUgZGVzY3JpcHRvci4gKi8KKyAgICB2b2lkKiBod3BpcGU7CisgICAgLyogTG9vcGVyIHVzZWQgZm9yIEkvTyAqLworICAgIHZvaWQqIGxvb3BlcjsKKyAgICAvKiBTZXJ2aWNlIGZvciB0aGlzIHBpcGUuICovCisgICAgUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlOworICAgIC8qIENsaWVudCBmb3IgdGhpcyBwaXBlLiAqLworICAgIFFlbXVkQ2xpZW50KiBjbGllbnQ7Cit9IFFlbXVkUGlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgUWVtdWRTZXJpYWwgUWVtdWRTZXJpYWw7CisKK3N0cnVjdCBRZW11ZENsaWVudCB7CisgICAgLyogRGVmaW5lcyBwcm90b2NvbCwgdXNlZCBieSB0aGUgY2xpZW50LiAqLworICAgIFFlbXVkUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgICAvKiBGaWVsZHMgdGhhdCBhcmUgY29tbW9uIGZvciBhbGwgcHJvdG9jb2xzLiAqLworICAgIGNoYXIqIHBhcmFtOworICAgIHZvaWQqIGNsaWVfb3BhcXVlOworICAgIFFlbXVkQ2xpZW50UmVjdiBjbGllX3JlY3Y7CisgICAgUWVtdWRDbGllbnRDbG9zZSBjbGllX2Nsb3NlOworICAgIFFlbXVkQ2xpZW50U2F2ZSBjbGllX3NhdmU7CisgICAgUWVtdWRDbGllbnRMb2FkIGNsaWVfbG9hZDsKKyAgICBRZW11ZFNlcnZpY2UqIHNlcnZpY2U7CisgICAgUWVtdWRDbGllbnQqIG5leHRfc2VydjsKKyAgICAvKiBuZXh0IGluIHNhbWUgc2VydmljZSAqLworICAgIFFlbXVkQ2xpZW50KiBuZXh0OworICAgIFFlbXVkQ2xpZW50KiogcHJlZjsKKworICAgIC8qIGZyYW1pbmcgc3VwcG9ydCAqLworICAgIGludCBmcmFtaW5nOworICAgIEFCb29sIG5lZWRfaGVhZGVyOworICAgIEFCb29sIGNsb3Npbmc7CisgICAgUWVtdWRTaW5rIGhlYWRlclsxXTsKKyAgICB1aW50OF90IGhlYWRlcjBbRlJBTUVfSEVBREVSX1NJWkVdOworICAgIFFlbXVkU2luayBwYXlsb2FkWzFdOworCisgICAgLyogRmllbGRzIHRoYXQgYXJlIHByb3RvY29sLXNwZWNpZmljLiAqLworICAgIHVuaW9uIHsKKyAgICAgICAgLyogU2VyaWFsLXNwZWNpZmljIGZpZWxkcy4gKi8KKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGludCBjaGFubmVsOworICAgICAgICAgICAgUWVtdWRTZXJpYWwqIHNlcmlhbDsKKyAgICAgICAgfSBTZXJpYWw7CisgICAgICAgIC8qIFBpcGUtc3BlY2lmaWMgZmllbGRzLiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgUWVtdWRQaXBlKiBxZW11ZF9waXBlOworICAgICAgICAgICAgUWVtdWRQaXBlTWVzc2FnZSogbWVzc2FnZXM7CisgICAgICAgICAgICBRZW11ZFBpcGVNZXNzYWdlKiBsYXN0X21zZzsKKyAgICAgICAgfSBQaXBlOworICAgIH0gUHJvdG9jb2xTZWxlY3RvcjsKK307CisKKy8qKiBISUdILUxFVkVMIEFQSQorICoqLworCisvKiByZW1vdmUgYSBRZW11ZENsaWVudCBmcm9tIGdsb2JhbCBsaXN0ICovCitleHRlcm4gdm9pZCBxZW11ZF9jbGllbnRfcmVtb3ZlKFFlbXVkQ2xpZW50KiBjKTsKKworLyogYWRkIGEgUWVtdWRDbGllbnQgdG8gZ2xvYmFsIGxpc3QgKi8KK2V4dGVybiB2b2lkIHFlbXVkX2NsaWVudF9wcmVwZW5kKFFlbXVkQ2xpZW50KiBjLCBRZW11ZENsaWVudCoqIHBsaXN0KTsKKworLyogcmVjZWl2ZSBhIG5ldyBtZXNzYWdlIGZyb20gYSBjbGllbnQsIGFuZCBkaXNwYXRjaCBpdCB0bworICogdGhlIHJlYWwgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfY2xpZW50X3JlY3Yodm9pZCogb3BhcXVlLCB1aW50OF90KiBtc2csIGludCBtc2dsZW4pOworCisvKiBTZW5kcyBkYXRhIHRvIGEgcGlwZS1iYXNlZCBjbGllbnQuCisgKi8KK2V4dGVybiB2b2lkIF9xZW11ZF9waXBlX3NlbmQoUWVtdWRDbGllbnQqIGNsaWVudCwgY29uc3QgdWludDhfdCogbXNnLCBpbnQgbXNnbGVuKTsKKworLyogRnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIHFlbXVkIGNsaWVudC4KKyAqLworZXh0ZXJuIHZvaWQgX3FlbXVkX2NsaWVudF9mcmVlKFFlbXVkQ2xpZW50KiBjKTsKKworLyogZGlzY29ubmVjdCBhIGNsaWVudC4gdGhpcyBhdXRvbWF0aWNhbGx5IGZyZWVzIHRoZSBRZW11ZENsaWVudC4KKyAqIG5vdGUgdGhhdCB0aGlzIGFsc28gcmVtb3ZlcyB0aGUgY2xpZW50IGZyb20gdGhlIGdsb2JhbCBsaXN0CisgKiBhbmQgZnJvbSBpdHMgc2VydmljZSdzIGxpc3QsIGlmIGFueS4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIFFlbXVDbGllbnQgaW5zdGFuY2UKKyAqICBndWVzdF9jbG9zZSAtIEZvciBwaXBlIGNsaWVudHMgY29udHJvbCB3aGV0aGVyIG9yIG5vdCB0aGUgZGlzY29ubmVjdCBpcworICogICAgICBjYXVzZWQgYnkgZ3Vlc3QgY2xvc2luZyB0aGUgcGlwZSBoYW5kbGUgKGluIHdoaWNoIGNhc2UgMSBpcyBwYXNzZWQgaW4KKyAqICAgICAgdGhpcyBwYXJhbWV0ZXIpLiBGb3Igc2VyaWFsIGNsaWVudHMgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfY2xpZW50X2Rpc2Nvbm5lY3Qodm9pZCogb3BhcXVlLCBpbnQgZ3Vlc3RfY2xvc2UpOworCisvKiBhbGxvY2F0ZSBhIG5ldyBRZW11ZENsaWVudCBvYmplY3QKKyAqIE5PVEU6IGNoYW5uZWxfaWQgdmFsaWUgaXMgdXNlZCBhcyBhIHNlbGVjdG9yIGJldHdlZW4gc2VyaWFsIGFuZCBwaXBlIGNsaWVudHMuCisgKiBTaW5jZSBjaGFubmVsX2lkIDwgMCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciBhIHNlcmlhbCBjbGllbnQsIGl0IHdvdWxkCisgKiBpbmRpY2F0ZSB0aGF0IGNyZWF0aW5nIGNsaWVudCBpcyBhIHBpcGUgY2xpZW50LiAqLworZXh0ZXJuIFFlbXVkQ2xpZW50KiBxZW11ZF9jbGllbnRfYWxsb2MoaW50IGNoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xpZW50X3BhcmFtLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsaWVfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50UmVjdiBjbGllX3JlY3YsCisgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnRDbG9zZSBjbGllX2Nsb3NlLAorICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50U2F2ZSBjbGllX3NhdmUsCisgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnRMb2FkIGNsaWVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICBRZW11ZFNlcmlhbCogc2VyaWFsLAorICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50KiogcGNsaWVudHMpOworCisKKy8qIFNhdmVzIHRoZSBjbGllbnQgc3RhdGUgbmVlZGVkIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9ucyBvbiBsb2FkLgorICogTm90ZSB0aGF0IHdlIHNhdmUgb25seSBzZXJpYWwgY2xpZW50cyBoZXJlLiBUaGUgcGlwZSBjbGllbnRzIHdpbGwgYmUKKyAqIHNhdmVkIGFsb25nIHdpdGggdGhlIHBpcGUgdG8gd2hpY2ggdGhleSBhcmUgYXR0YWNoZWQuCisgKi8KK2V4dGVybiB2b2lkIHFlbXVkX3NlcmlhbF9jbGllbnRfc2F2ZShTdHJlYW0qIGYsIFFlbXVkQ2xpZW50KiBjKTsKKworLyogTG9hZHMgY2xpZW50IHN0YXRlIGZyb20gZmlsZSwgdGhlbiBzdGFydHMgYSBuZXcgY2xpZW50IGNvbm5lY3RlZCB0byB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgc2VydmljZS4KKyAqIE5vdGUgdGhhdCB3ZSBsb2FkIG9ubHkgc2VyaWFsIGNsaWVudHMgaGVyZS4gVGhlIHBpcGUgY2xpZW50cyB3aWxsIGJlCisgKiBsb2FkZWQgYWxvbmcgd2l0aCB0aGUgcGlwZSB0byB3aGljaCB0aGV5IHdlcmUgYXR0YWNoZWQuCisgKi8KK2V4dGVybiBpbnQgcWVtdWRfc2VyaWFsX2NsaWVudF9sb2FkKFN0cmVhbSogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZSogY3VycmVudF9zZXJ2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY29tbW9uLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlYzEwMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jb21tb24uaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9taXNjLmgiCisKKy8qIGxlbmd0aCBvZiB0aGUgZnJhbWVkIGhlYWRlciAqLworI2RlZmluZSAgRlJBTUVfSEVBREVSX1NJWkUgIDQKKworI2RlZmluZSAgRCguLi4pICAgIFZFUkJPU0VfUFJJTlQocWVtdWQsX19WQV9BUkdTX18pCisjZGVmaW5lICBEX0FDVElWRSAgVkVSQk9TRV9DSEVDSyhxZW11ZCkKKworLyogdGhlIFQoLi4uKSBtYWNybyBpcyB1c2VkIHRvIGR1bXAgdHJhZmZpYyAqLworI2RlZmluZSAgVF9BQ1RJVkUgICAwCisKKyNpZiBUX0FDVElWRQorI2RlZmluZSAgVCguLi4pICAgIFZFUkJPU0VfUFJJTlQocWVtdWQsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgVCguLi4pICAgICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworLyogZGVmaW5lIFNVUFBPUlRfTEVHQUNZX1FFTVVEIHRvIDEgaWYgeW91IHdhbnQgdG8gc3VwcG9ydAorICogdGFsa2luZyB0byBhIGxlZ2FjeSBxZW11ZCBkYWVtb24uIFNlZSBkb2NzL0FORFJPSUQtUUVNVUQuVFhUCisgKiBmb3IgZGV0YWlscy4KKyAqLworI2lmZGVmIFRBUkdFVF9BUk0KKyNkZWZpbmUgIFNVUFBPUlRfTEVHQUNZX1FFTVVEICAxCisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfSTM4NgorI2RlZmluZSAgU1VQUE9SVF9MRUdBQ1lfUUVNVUQgIDAgLyogbm8gbGVnYWN5IHN1cHBvcnQgKi8KKyNlbmRpZgorCisjaWYgU1VQUE9SVF9MRUdBQ1lfUUVNVUQKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L21vZGVtX2RyaXZlci5oIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfbXVsdGlwbGV4ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX211bHRpcGxleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjQ0YjhiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX211bHRpcGxleGVyLmNwcApAQCAtMCwwICsxLDM4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX211bHRpcGxleGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKworLyogdGhlIGdsb2JhbCBtdWx0aXBsZXhlciBzdGF0ZSAqLworc3RhdGljIFFlbXVkTXVsdGlwbGV4ZXIgbXV0bGlwbGV4ZXJfaW5zdGFuY2U7CitRZW11ZE11bHRpcGxleGVyKiBjb25zdCBxZW11ZF9tdWx0aXBsZXhlciA9ICZtdXRsaXBsZXhlcl9pbnN0YW5jZTsKKworLyogdGhpcyBpcyB0aGUgc2VyaWFsX3JlY3YgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQKKyAqIHdoZW5ldmVyIGFuIGluY29taW5nIG1lc3NhZ2UgYXJyaXZlcyB0aHJvdWdoIHRoZSBzZXJpYWwgcG9ydAorICovCit2b2lkIHFlbXVkX211bHRpcGxleGVyX3NlcmlhbF9yZWN2KHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbikgeworICAgIFFlbXVkTXVsdGlwbGV4ZXIqIG0gPSAoUWVtdWRNdWx0aXBsZXhlciopIG9wYXF1ZTsKKyAgICAvLyBOb3RlOiBBIGxvY2sgaXMgbm90IG5lZWRlZCBoZXJlLgorICAgIFFlbXVkQ2xpZW50KiBjID0gbS0+Y2xpZW50czsKKworICAgIC8qIGRpc3BhdGNoIHRvIGFuIGV4aXN0aW5nIGNsaWVudCBpZiBwb3NzaWJsZQorICAgICAqIG5vdGUgdGhhdCBjaGFubmVsIDAgaXMgaGFuZGxlZCBieSBhIHNwZWNpYWwKKyAgICAgKiBRZW11ZENsaWVudCB0aGF0IGlzIHNldHVwIGluIHFlbXVkX211bHRpcGxleGVyX2luaXQoKQorICAgICAqLworICAgIGZvciAoOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0KSB7CisgICAgICAgIGlmICghcWVtdWRfaXNfcGlwZV9jbGllbnQoYykgJiYgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuY2hhbm5lbCA9PSBjaGFubmVsKSB7CisgICAgICAgICAgICBxZW11ZF9jbGllbnRfcmVjdihjLCBtc2csIG1zZ2xlbik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEKCIlczogaWdub3JpbmcgJWQgYnl0ZXMgZm9yIHVua25vd24gY2hhbm5lbCAlZCIsCisgICAgICBfX0ZVTkNUSU9OX18sIG1zZ2xlbiwgY2hhbm5lbCk7Cit9CisKKy8qIGhhbmRsZSBhIG5ldyBjb25uZWN0aW9uIGF0dGVtcHQuIFRoaXMgcmV0dXJucyAwIG9uCisgKiBzdWNjZXNzLCAtMSBpZiB0aGUgc2VydmljZSBuYW1lIGlzIHVua25vd24sIG9yIC0yCisgKiBpZiB0aGUgc2VydmljZSdzIG1heGltdW0gbnVtYmVyIG9mIGNsaWVudHMgaGFzIGJlZW4KKyAqIHJlYWNoZWQuCisgKi8KK2ludCBxZW11ZF9tdWx0aXBsZXhlcl9jb25uZWN0KFFlbXVkTXVsdGlwbGV4ZXIqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9pZCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIF9sb2NrKG0tPmxvY2spOworCisgICAgLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlcmVkIHNlcnZpY2UgYnkgbmFtZSAqLworICAgIFFlbXVkU2VydmljZSogc3YgPSBxZW11ZF9zZXJ2aWNlX2ZpbmQobS0+c2VydmljZXMsIHNlcnZpY2VfbmFtZSk7CisgICAgaWYgKHN2ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IG5vIHJlZ2lzdGVyZWQgJyVzJyBzZXJ2aWNlIiwgX19GVU5DVElPTl9fLCBzZXJ2aWNlX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2hlY2sgc2VydmljZSdzIGNsaWVudCBjb3VudCAqLworICAgIGlmIChzdi0+bWF4X2NsaWVudHMgPiAwICYmIHN2LT5udW1fY2xpZW50cyA+PSBzdi0+bWF4X2NsaWVudHMpIHsKKyAgICAgICAgRCgiJXM6IHJlZ2lzdHJhdGlvbiBmYWlsZWQgZm9yICclcycgc2VydmljZTogdG9vIG1hbnkgY2xpZW50cyAoJWQpIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlcnZpY2VfbmFtZSwgc3YtPm51bV9jbGllbnRzKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIC8qIGNvbm5lY3QgYSBuZXcgY2xpZW50IHRvIHRoZSBzZXJ2aWNlIG9uIHRoZSBnaXZlbiBjaGFubmVsICovCisgICAgaWYgKHFlbXVkX3NlcnZpY2VfY29ubmVjdF9jbGllbnQoc3YsIGNoYW5uZWxfaWQsIE5VTEwpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBkaXNjb25uZWN0IGEgZ2l2ZW4gY2xpZW50IGZyb20gaXRzIGNoYW5uZWwgaWQgKi8KK3ZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfZGlzY29ubmVjdChRZW11ZE11bHRpcGxleGVyKiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsKSB7CisgICAgUWVtdWRDbGllbnQqIGM7CisKKyAgICAvKiBmaW5kIHRoZSBjbGllbnQgYnkgaXRzIGNoYW5uZWwgaWQsIHRoZW4gZGlzY29ubmVjdCBpdCAqLworICAgIGZvciAoYyA9IG0tPmNsaWVudHM7IGM7IGMgPSBjLT5uZXh0KSB7CisgICAgICAgIGlmICghcWVtdWRfaXNfcGlwZV9jbGllbnQoYykgJiYgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuY2hhbm5lbCA9PSBjaGFubmVsKSB7CisgICAgICAgICAgICBEKCIlczogZGlzY29ubmVjdGluZyBjbGllbnQgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNoYW5uZWwpOworICAgICAgICAgICAgLyogbm90ZSB0aGF0dCB0aGlzIHJlbW92ZXMgdGhlIGNsaWVudCBmcm9tCisgICAgICAgICAgICAgKiBtLT5jbGllbnRzIGF1dG9tYXRpY2FsbHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGMtPlByb3RvY29sU2VsZWN0b3IuU2VyaWFsLmNoYW5uZWwgPSAtMTsgLyogbm8gbmVlZCB0byBzZW5kIGRpc2Nvbm5lY3Q6PGlkPiAqLworICAgICAgICAgICAgcWVtdWRfY2xpZW50X2Rpc2Nvbm5lY3QoYywgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgRCgiJXM6IGRpc2Nvbm5lY3RpbmcgdW5rbm93biBjaGFubmVsICVkIiwKKyAgICAgIF9fRlVOQ1RJT05fXywgY2hhbm5lbCk7Cit9CisKKy8qIGRpc2Nvbm5lY3RzIGFsbCBjaGFubmVscywgZXhjZXB0IGZvciB0aGUgY29udHJvbCBjaGFubmVsLCB3aXRob3V0IGluZm9ybWluZworICogdGhlIGRhZW1vbiBpbiB0aGUgZ3Vlc3QgdGhhdCBkaXNjb25uZWN0aW9uIGhhcyBvY2N1cnJlZC4KKyAqCisgKiBVc2VkIHRvIHNpbGVudGx5IGtpbGwgY2xpZW50cyB3aGVuIHJlc3RvcmluZyBlbXVsYXRvciBzdGF0ZSBzbmFwc2hvdHMuCisgKi8KK3ZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfZGlzY29ubmVjdF9ub25jb250cm9sKFFlbXVkTXVsdGlwbGV4ZXIqIG0pIHsKKyAgICBRZW11ZENsaWVudCogYzsKKyAgICBRZW11ZENsaWVudCogbmV4dCA9IG0tPmNsaWVudHM7CisKKyAgICB3aGlsZSAobmV4dCkgeworICAgICAgICBjID0gbmV4dDsKKyAgICAgICAgbmV4dCA9IGMtPm5leHQ7ICAvKiBkaXNjb25uZWN0IGZyZWVzIGMsIHJlbWVtYmVyIG5leHQgaW4gYWR2YW5jZSAqLworCisgICAgICAgIGlmICghcWVtdWRfaXNfcGlwZV9jbGllbnQoYykgJiYgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuY2hhbm5lbCA+IDApIHsKKyAgICAgICAgICAgIC8qIHNraXAgY29udHJvbCBjaGFubmVsICovCisgICAgICAgICAgICBEKCIlczogZGlzY29ubmVjdGluZyBjbGllbnQgJWQiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGMtPlByb3RvY29sU2VsZWN0b3IuU2VyaWFsLmNoYW5uZWwpOworICAgICAgICAgICAgRCgiJXM6IGRpc2Nvbm5lY3RpbmcgY2xpZW50ICVkXG4iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGMtPlByb3RvY29sU2VsZWN0b3IuU2VyaWFsLmNoYW5uZWwpOworICAgICAgICAgICAgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuY2hhbm5lbCA9IC0xOyAvKiBkbyBub3Qgc2VuZCBkaXNjb25uZWN0OjxpZD4gKi8KKyAgICAgICAgICAgIHFlbXVkX2NsaWVudF9kaXNjb25uZWN0KGMsIDApOworICAgICAgICB9CisgICAgfQorfQorCisvKiBoYW5kbGUgY29udHJvbCBtZXNzYWdlcy4gVGhpcyBpcyB1c2VkIGFzIHRoZSByZWNlaXZlCisgKiBjYWxsYmFjayBmb3IgdGhlIHNwZWNpYWwgUWVtdWRDbGllbnQgc2V0dXAgdG8gbWFuYWdlCisgKiBjaGFubmVsIDAuCisgKgorICogbm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIHplcm8tdGVybWluYXRlZCBmb3IgY29udmVuaWVuY2UKKyAqIChpLmUuIG1zZ1ttc2dsZW5dIGlzIGEgdmFsaWQgbWVtb3J5IHJlYWQgdGhhdCByZXR1cm5zICdcMCcpCisgKi8KK3ZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfY29udHJvbF9yZWN2KHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZENsaWVudCogY2xpZW50KSB7CisgICAgUWVtdWRNdWx0aXBsZXhlciogbXVsdCA9IChRZW11ZE11bHRpcGxleGVyKikgb3BhcXVlOworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrKG11bHQtPmxvY2spOworICAgIHVpbnQ4X3QqIG1zZ2VuZCA9IG1zZyArIG1zZ2xlbjsKKyAgICBjaGFyIHRtcFs2NF0sICogcCA9IHRtcCwgKiBlbmQgPSBwICsgc2l6ZW9mKHRtcCk7CisKKyAgICAvKiBoYW5kbGUgY29ubmVjdGlvbiBhdHRlbXB0cy4KKyAgICAgKiB0aGUgY2xpZW50IG1lc3NhZ2UgbXVzdCBiZSAiY29ubmVjdDo8c2VydmljZS1uYW1lPjo8aWQ+IgorICAgICAqIHdoZXJlIDxpZD4gaXMgYSAyLWNoYXIgaGV4YWRlY2ltYWwgc3RyaW5nLCB3aGljaCBtdXN0IGJlID4gMAorICAgICAqLworICAgIGlmIChtc2dsZW4gPiA4ICYmICFtZW1jbXAobXNnLCAiY29ubmVjdDoiLCA4KSkgeworICAgICAgICBjaGFyKiBzZXJ2aWNlX25hbWUgPSAoY2hhciopIG1zZyArIDg7CisgICAgICAgIGludCBjaGFubmVsLCByZXQ7CisgICAgICAgIGNoYXIqIHEgPSBzdHJjaHIoc2VydmljZV9uYW1lLCAnOicpOworICAgICAgICBpZiAocSA9PSBOVUxMIHx8IHEgKyAzICE9IChjaGFyKikgbXNnZW5kKSB7CisgICAgICAgICAgICBEKCIlczogbWFsZm9ybWVkIGNvbm5lY3QgbWVzc2FnZTogJyUuKnMnIChvZmZzZXQ9JWQpIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtc2dsZW4sIChjb25zdCBjaGFyKikgbXNnLCBxID8gcSAtIChjaGFyKikgbXNnIDogLTEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICpxKysgPSAwOyAgLyogemVyby10ZXJtaW5hdGUgc2VydmljZSBuYW1lICovCisgICAgICAgIGNoYW5uZWwgPSBoZXgyaW50KCh1aW50OF90KikgcSwgMik7CisgICAgICAgIGlmIChjaGFubmVsIDw9IDApIHsKKyAgICAgICAgICAgIEQoIiVzOiBtYWxmb3JtZWQgY2hhbm5lbCBpZCAnJS4qcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgMiwgcSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBxZW11ZF9tdWx0aXBsZXhlcl9jb25uZWN0KG11bHQsIHNlcnZpY2VfbmFtZSwgY2hhbm5lbCk7CisgICAgICAgIC8qIHRoZSBhbnN3ZXIgY2FuIGJlIG9uZSBvZjoKKyAgICAgICAgICogICAgb2s6Y29ubmVjdDo8aWQ+CisgICAgICAgICAqICAgIGtvOmNvbm5lY3Q6PGlkPjo8cmVhc29uLWZvci1mYWlsdXJlPgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAvKiBjb3VsZCBub3QgY29ubmVjdCAqLworICAgICAgICAgICAgICAgIHAgPSBidWZwcmludCh0bXAsIGVuZCwgImtvOmNvbm5lY3Q6JTAyeDp1bmtub3duIHNlcnZpY2UiLCBjaGFubmVsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHRtcCwgZW5kLCAia286Y29ubmVjdDolMDJ4OnNlcnZpY2UgYnVzeSIsIGNoYW5uZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHRtcCwgZW5kLCAib2s6Y29ubmVjdDolMDJ4IiwgY2hhbm5lbCk7CisgICAgICAgIH0KKyAgICAgICAgcWVtdWRfc2VyaWFsX3NlbmQobXVsdC0+c2VyaWFsLCAwLCAwLCAodWludDhfdCopIHRtcCwgcCAtIHRtcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBoYW5kbGUgY2xpZW50IGRpc2Nvbm5lY3Rpb25zLAorICAgICAqIHRoaXMgbWVzc2FnZSBhcnJpdmVzIHdoZW4gdGhlIGNsaWVudCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uLgorICAgICAqIGZvcm1hdDogImRpc2Nvbm5lY3Q6PGlkPiIgd2hlcmUgPGlkPiBpcyBhIDItaGV4IGNoYW5uZWwgaWQgPiAwCisgICAgICovCisgICAgaWYgKG1zZ2xlbiA9PSAxMyAmJiAhbWVtY21wKG1zZywgImRpc2Nvbm5lY3Q6IiwgMTEpKSB7CisgICAgICAgIGludCBjaGFubmVsX2lkID0gaGV4MmludChtc2cgKyAxMSwgMik7CisgICAgICAgIGlmIChjaGFubmVsX2lkIDw9IDApIHsKKyAgICAgICAgICAgIEQoIiVzOiBtYWxmb3JtZWQgZGlzY29ubmVjdCBjaGFubmVsIGlkOiAnJS4qcyciLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIDIsIG1zZyArIDExKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBxZW11ZF9tdWx0aXBsZXhlcl9kaXNjb25uZWN0KG11bHQsIGNoYW5uZWxfaWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgU1VQUE9SVF9MRUdBQ1lfUUVNVUQKKyAgICAvKiBhbiBvazpjb25uZWN0OjxzZXJ2aWNlPjo8aWQ+IG1lc3NhZ2UgY2FuIGJlIHJlY2VpdmVkIGlmIHdlJ3JlCisgICAgICogdGFsa2luZyB0byBhIGxlZ2FjeSBxZW11ZCBkYWVtb24sIGkuZS4gb25lIHJ1bm5pbmcgaW4gYSAxLjAgb3IKKyAgICAgKiAxLjEgc3lzdGVtIGltYWdlLgorICAgICAqCisgICAgICogd2Ugc2hvdWxkIHRyZWF0IGlzIGFzIGEgbm9ybWFsICJjb25uZWN0OiIgYXR0ZW1wdCwgZXhjZXB0IHRoYXQKKyAgICAgKiB3ZSBtdXN0IG5vdCBzZW5kIGJhY2sgYW55IGFja25vd2xlZGdtZW50LgorICAgICAqLworICAgIGlmIChtc2dsZW4gPiAxMSAmJiAhbWVtY21wKG1zZywgIm9rOmNvbm5lY3Q6IiwgMTEpKSB7CisgICAgICAgIGNoYXIqICBzZXJ2aWNlX25hbWUgPSAoY2hhciopbXNnICsgMTE7CisgICAgICAgIGNoYXIqICAgICAgICBxICAgICAgICAgICAgPSBzdHJjaHIoc2VydmljZV9uYW1lLCAnOicpOworICAgICAgICBpbnQgICAgICAgICAgY2hhbm5lbDsKKworICAgICAgICBpZiAocSA9PSBOVUxMIHx8IHErMyAhPSAoY2hhciopbXNnZW5kKSB7CisgICAgICAgICAgICBEKCIlczogbWFsZm9ybWVkIGxlZ2FjeSBjb25uZWN0IG1lc3NhZ2U6ICclLipzJyAob2Zmc2V0PSVkKSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnbGVuLCAoY29uc3QgY2hhciopbXNnLCBxID8gcS0oY2hhciopbXNnIDogLTEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICpxKysgPSAwOyAgLyogemVyby10ZXJtaW5hdGUgc2VydmljZSBuYW1lICovCisgICAgICAgIGNoYW5uZWwgPSBoZXgyaW50KCh1aW50OF90KilxLCAyKTsKKyAgICAgICAgaWYgKGNoYW5uZWwgPD0gMCkgeworICAgICAgICAgICAgRCgiJXM6IG1hbGZvcm1lZCBsZWdhY3kgY2hhbm5lbCBpZCAnJS4qcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgMiwgcSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG11bHQtPnNlcmlhbC0+dmVyc2lvbikgeworICAgICAgICBjYXNlIFFFTVVEX1ZFUlNJT05fVU5LTk9XTjoKKyAgICAgICAgICAgIG11bHQtPnNlcmlhbC0+dmVyc2lvbiA9IFFFTVVEX1ZFUlNJT05fTEVHQUNZOworICAgICAgICAgICAgRCgiJXM6IGxlZ2FjeSBxZW11ZCBkYWVtb24gZGV0ZWN0ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUUVNVURfVkVSU0lPTl9MRUdBQ1k6CisgICAgICAgICAgICAvKiBub3RoaW5nIHVudXN1YWwgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBEKCIlczogd2VpcmQsIGlnbm9yaW5nIGxlZ2FjeSBxZW11ZCBjb250cm9sIG1lc3NhZ2U6ICclLipzJyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbXNnbGVuLCBtc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyogImh3LWNvbnRyb2wiIHdhcyBjYWxsZWQgImNvbnRyb2wiIGluIDEuMC8xLjEgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAoc2VydmljZV9uYW1lLCJjb250cm9sIikpIHsKKyAgICAgICAgICAgIC8vIGl0J3Mgc2FmZSBoZXJlOiBubyBvbmUgd2lsbCBtb2RpZnkgdGhlIHN0cmluZworICAgICAgICAgICAgc2VydmljZV9uYW1lID0gY29uc3RfY2FzdDxjaGFyKj4oImh3LWNvbnRyb2wiKTsKKyAgICAgICAgfQorCisgICAgICAgIHFlbXVkX211bHRpcGxleGVyX2Nvbm5lY3QobXVsdCwgc2VydmljZV9uYW1lLCBjaGFubmVsKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGFueXRoaW5nIGVsc2UsIGRvbid0IGFuc3dlciBmb3IgbGVnYWN5ICovCisgICAgaWYgKG11bHQtPnNlcmlhbC0+dmVyc2lvbiA9PSBRRU1VRF9WRVJTSU9OX0xFR0FDWSkgeworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8qIFNVUFBPUlRfTEVHQUNZX1FFTVVEICovCisKKyAgICAvKiBhbnl0aGluZyBlbHNlIGlzIGEgcHJvYmxlbSAqLworICAgIHAgPSBidWZwcmludCh0bXAsIGVuZCwgImtvOnVua25vd24gY29tbWFuZCIpOworICAgIHFlbXVkX3NlcmlhbF9zZW5kKG11bHQtPnNlcmlhbCwgMCwgMCwgKHVpbnQ4X3QqKSB0bXAsIHAgLSB0bXApOworfQorCisvKiBpbml0aWFsaXplIHRoZSBnbG9iYWwgUWVtdWRNdWx0aXBsZXhlci4KKyAqLwordm9pZCBxZW11ZF9tdWx0aXBsZXhlcl9pbml0KFFlbXVkTXVsdGlwbGV4ZXIqIG11bHQsIENTZXJpYWxMaW5lKiBzZXJpYWxfbGluZSkgeworICAgIC8qIGluaXRpYWxpemUgc2VyaWFsIGhhbmRsZXIgKi8KKyAgICBxZW11ZF9zZXJpYWxfaW5pdChtdWx0LT5zZXJpYWwsIHNlcmlhbF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgIHFlbXVkX211bHRpcGxleGVyX3NlcmlhbF9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgIG11bHQpOworCisgICAgLyogc2V0dXAgbGlzdGVuZXIgZm9yIGNoYW5uZWwgMCAqLworICAgIHFlbXVkX2NsaWVudF9hbGxvYygwLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBtdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBxZW11ZF9tdWx0aXBsZXhlcl9jb250cm9sX3JlY3YsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIG11bHQtPnNlcmlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm11bHQtPmNsaWVudHMpOworfQorCisvKiogU05BUFNIT1QgU1VQUE9SVAorICoqLworCisvKiBTYXZlcyB0aGUgbnVtYmVyIG9mIGNsaWVudHMuCisgKi8KK3N0YXRpYyB2b2lkIHFlbXVkX2NsaWVudF9zYXZlX2NvdW50KFN0cmVhbSogZiwgUWVtdWRDbGllbnQqIGMpIHsKKyAgICB1bnNpZ25lZCBpbnQgY2xpZW50X2NvdW50ID0gMDsKKyAgICBmb3IgKDsgYzsgYyA9IGMtPm5leHQpICAgLy8gd2FsayBvdmVyIGxpbmtlZCBsaXN0CisgICAgICAgIC8qIHNraXAgY29udHJvbCBjaGFubmVsLCB3aGljaCBpcyBub3Qgc2F2ZWQsIGFuZCBwaXBlIGNoYW5uZWxzIHRoYXQKKyAgICAgICAgICogYXJlIHNhdmVkIGFsb25nIHdpdGggdGhlIHBpcGUuICovCisgICAgICAgIGlmICghcWVtdWRfaXNfcGlwZV9jbGllbnQoYykgJiYgYy0+UHJvdG9jb2xTZWxlY3Rvci5TZXJpYWwuY2hhbm5lbCA+IDApCisgICAgICAgICAgICBjbGllbnRfY291bnQrKzsKKworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBjbGllbnRfY291bnQpOworfQorCisvKiBTYXZlcyB0aGUgbnVtYmVyIG9mIHNlcnZpY2VzIGN1cnJlbnRseSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyB2b2lkIHFlbXVkX3NlcnZpY2Vfc2F2ZV9jb3VudChTdHJlYW0qIGYsIFFlbXVkU2VydmljZSogcykgeworICAgIHVuc2lnbmVkIGludCBzZXJ2aWNlX2NvdW50ID0gMDsKKyAgICBmb3IgKDsgczsgcyA9IHMtPm5leHQpICAvLyB3YWxrIG92ZXIgbGlua2VkIGxpc3QKKyAgICAgICAgc2VydmljZV9jb3VudCsrOworCisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHNlcnZpY2VfY291bnQpOworfQorCisvKiBSZW1vdmVzIGFsbCBhY3RpdmUgbm9uLWNvbnRyb2wgY2xpZW50cywgdGhlbiBjcmVhdGVzIG5ldyBvbmVzIHdpdGggc3RhdGUKKyAqIHRha2VuIGZyb20gdGhlIHNuYXBzaG90LgorICoKKyAqIFdlIGRvIG5vdCBzZW5kICJkaXNjb25uZWN0IiBjb21tYW5kcywgb3ZlciB0aGUgY2hhbm5lbC4gSWYgd2UgZGlkLCB3ZSBtaWdodAorICogc3RvcCBjbGllbnRzIGluIHRoZSByZXN0b3JlZCBndWVzdCwgcmVzdWx0aW5nIGluIGFuIGluY29ycmVjdCByZXN0b3JlLgorICoKKyAqIEluc3RlYWQsIHdlIHNpbGVudGx5IHJlcGxhY2UgdGhlIGNsaWVudHMgdGhhdCB3ZXJlIHJ1bm5pbmcgYmVmb3JlIHRoZQorICogcmVzdG9yZSB3aXRoIG5ldyBjbGllbnRzLCB3aG9zZSBzdGF0ZSB3ZSBjb3B5IGZyb20gdGhlIHNuYXBzaG90LiBTaW5jZQorICogZXZlcnl0aGluZyBpcyBtdWx0aXBsZXhlZCBvdmVyIG9uZSBsaW5rLCBvbmx5IHRoZSBtdWx0aXBsZXhlciBub3RpY2VzIHRoZQorICogY2hhbmdlcywgdGhlcmUgaXMgbm8gY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBndWVzdC4KKyAqLworc3RhdGljIGludCBxZW11ZF9sb2FkX2NsaWVudHMoU3RyZWFtKiBmLCBRZW11ZE11bHRpcGxleGVyKiBtLCBpbnQgdmVyc2lvbikgeworCisgICAgLyogUmVtb3ZlIGFsbCBjbGllbnRzLCBleGNlcHQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbC4qLworICAgIHFlbXVkX211bHRpcGxleGVyX2Rpc2Nvbm5lY3Rfbm9uY29udHJvbChtKTsKKworICAgIC8qIExvYWQgY2xpZW50cyBmcm9tIHNuYXBzaG90ICovCisgICAgaW50IGNsaWVudF9jb3VudCA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBpbnQgaSwgcmV0OworICAgIGZvciAoaSA9IDA7IGkgPCBjbGllbnRfY291bnQ7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IHFlbXVkX3NlcmlhbF9jbGllbnRfbG9hZChmLCBtLT5zZXJ2aWNlcywgdmVyc2lvbikpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrcyB3aGV0aGVyIHRoZSBzYW1lIHNlcnZpY2VzIGFyZSBhdmFpbGFibGUgYXQgdGhpcyBwb2ludCBhcyB3aGVuIHRoZQorICogc25hcHNob3Qgd2FzIG1hZGUuCisgKi8KK3N0YXRpYyBpbnQgcWVtdWRfbG9hZF9zZXJ2aWNlcyhTdHJlYW0qIGYsIFFlbXVkU2VydmljZSogY3VycmVudF9zZXJ2aWNlcykgeworICAgIGludCBpLCByZXQgPSAwOworICAgIGludCBzZXJ2aWNlX2NvdW50ID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBzZXJ2aWNlX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBxZW11ZF9zZXJ2aWNlX2xvYWQoZiwgY3VycmVudF9zZXJ2aWNlcykpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgcWVtdWRfbXVsdGlwbGV4ZXJfbG9hZChRZW11ZE11bHRpcGxleGVyKiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgeworICAgIGludCByZXQgPSAwOworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrKG0tPmxvY2spOworCisgICAgcmV0ID0gcWVtdWRfc2VyaWFsX2xvYWQoc3RyZWFtLCBtLT5zZXJpYWwpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIHJldCA9IHFlbXVkX2xvYWRfc2VydmljZXMoc3RyZWFtLCBtLT5zZXJ2aWNlcyk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICByZXQgPSBxZW11ZF9sb2FkX2NsaWVudHMoc3RyZWFtLCBtLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHFlbXVkX211bHRpcGxleGVyX3NhdmUoUWVtdWRNdWx0aXBsZXhlciogbSwgU3RyZWFtKiBzdHJlYW0pIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayhtLT5sb2NrKTsKKworICAgIC8qIHNhdmUgc2VyaWFsIHN0YXRlIGlmIGFueSAqLworICAgIHFlbXVkX3NlcmlhbF9zYXZlKHN0cmVhbSwgbS0+c2VyaWFsKTsKKworICAgIC8qIHNhdmUgc2VydmljZSBzdGF0ZXMgKi8KKyAgICBxZW11ZF9zZXJ2aWNlX3NhdmVfY291bnQoc3RyZWFtLCBtLT5zZXJ2aWNlcyk7CisgICAgUWVtdWRTZXJ2aWNlKiBzOworICAgIGZvciAocyA9IG0tPnNlcnZpY2VzOyBzOyBzID0gcy0+bmV4dCkKKyAgICAgICAgcWVtdWRfc2VydmljZV9zYXZlKHN0cmVhbSwgcyk7CisKKyAgICAvKiBzYXZlIGNsaWVudCBjaGFubmVscyAqLworICAgIHFlbXVkX2NsaWVudF9zYXZlX2NvdW50KHN0cmVhbSwgbS0+Y2xpZW50cyk7CisgICAgUWVtdWRDbGllbnQqIGM7CisgICAgZm9yIChjID0gbS0+Y2xpZW50czsgYzsgYyA9IGMtPm5leHQpIHsKKyAgICAgICAgLyogc2tpcCBjb250cm9sIGNoYW5uZWwsIGFuZCBwaXBlIGNsaWVudHMgKi8KKyAgICAgICAgaWYgKCFxZW11ZF9pc19waXBlX2NsaWVudChjKSAmJiBjLT5Qcm90b2NvbFNlbGVjdG9yLlNlcmlhbC5jaGFubmVsID4gMCkgeworICAgICAgICAgICAgcWVtdWRfc2VyaWFsX2NsaWVudF9zYXZlKHN0cmVhbSwgYyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfbXVsdGlwbGV4ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9tdWx0aXBsZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2U4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfbXVsdGlwbGV4ZXIuaApAQCAtMCwwICsxLDk0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jbGllbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NlcmlhbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VydmljZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBBIFFlbXVkTXVsdGlwbGV4ZXIgb2JqZWN0IG1haW50YWlucyB0aGUgZ2xvYmFsIHN0YXRlIG9mIHRoZQorICogcWVtdWQgc2VydmljZSBmYWNpbGl0eS4gSXQgaG9sZHMgYSBRZW11ZFNlcmlhbCBvYmplY3QgdG8KKyAqIG1haW50YWluIHRoZSBzdGF0ZSBvZiB0aGUgc2VyaWFsIHBvcnQgY29ubmVjdGlvbi4KKyAqCisgKiBUaGUgUWVtdWRNdWx0aXBsZXhlciByZWNlaXZlcyBhbGwgaW5jb21pbmcgbWVzc2FnZXMgZnJvbQorICogdGhlIHNlcmlhbCBwb3J0LCBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSBhcHByb3ByaWF0ZQorICogUWVtdWRDbGllbnQuCisgKgorICogSXQgYWxzbyBoYXMgYSBnbG9iYWwgbGlzdCBvZiBjbGllbnRzLCBhbmQgYSBnbG9iYWwgbGlzdCBvZgorICogc2VydmljZXMuCisgKgorICogRmluYWxseSwgdGhlIFFlbXVkTXVsdGlwbGV4ZXIgaGFzIGEgc3BlY2lhbCBRZW11ZENsaWVudCB1c2VkCisgKiB0byBoYW5kbGUgY2hhbm5lbCAwLCBpLmUuIHRoZSBjb250cm9sIGNoYW5uZWwgdXNlZCB0byBoYW5kbGUKKyAqIGNvbm5lY3Rpb25zIGFuZCBkaXNjb25uZWN0aW9ucyBvZiBjbGllbnRzLgorICovCit0eXBlZGVmIHN0cnVjdCBRZW11ZE11bHRpcGxleGVyIHsKKyAgICAvLyBUT0RPOiBIaWRlIFFlbXVkTXVsdGlwbGV4ZXIgc3RydWN0CisgICAgLy8gZnJvbSB0aGUgaGVhZGVyL2NsaWVudC4KKyAgICBRZW11ZFNlcmlhbCBzZXJpYWxbMV07CisgICAgUWVtdWRDbGllbnQqIGNsaWVudHM7CisgICAgUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlczsKKyAgICBhbmRyb2lkOjpiYXNlOjpMb2NrIGxvY2s7Cit9IFFlbXVkTXVsdGlwbGV4ZXI7CisKKy8qIHRoaXMgaXMgdGhlIHNlcmlhbF9yZWN2IGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkCisgKiB3aGVuZXZlciBhbiBpbmNvbWluZyBtZXNzYWdlIGFycml2ZXMgdGhyb3VnaCB0aGUgc2VyaWFsIHBvcnQKKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfc2VyaWFsX3JlY3Yodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNnbGVuKTsKKworLyogaGFuZGxlIGEgbmV3IGNvbm5lY3Rpb24gYXR0ZW1wdC4gVGhpcyByZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIC0xIGlmIHRoZSBzZXJ2aWNlIG5hbWUgaXMgdW5rbm93biwgb3IgLTIKKyAqIGlmIHRoZSBzZXJ2aWNlJ3MgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50cyBoYXMgYmVlbgorICogcmVhY2hlZC4KKyAqLworZXh0ZXJuIGludCBxZW11ZF9tdWx0aXBsZXhlcl9jb25uZWN0KFFlbXVkTXVsdGlwbGV4ZXIqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2lkKTsKKworLyogZGlzY29ubmVjdCBhIGdpdmVuIGNsaWVudCBmcm9tIGl0cyBjaGFubmVsIGlkICovCitleHRlcm4gdm9pZCBxZW11ZF9tdWx0aXBsZXhlcl9kaXNjb25uZWN0KFFlbXVkTXVsdGlwbGV4ZXIqIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsKTsKKworLyogZGlzY29ubmVjdHMgYWxsIGNoYW5uZWxzLCBleGNlcHQgZm9yIHRoZSBjb250cm9sIGNoYW5uZWwsIHdpdGhvdXQgaW5mb3JtaW5nCisgKiB0aGUgZGFlbW9uIGluIHRoZSBndWVzdCB0aGF0IGRpc2Nvbm5lY3Rpb24gaGFzIG9jY3VycmVkLgorICoKKyAqIFVzZWQgdG8gc2lsZW50bHkga2lsbCBjbGllbnRzIHdoZW4gcmVzdG9yaW5nIGVtdWxhdG9yIHN0YXRlIHNuYXBzaG90cy4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfbXVsdGlwbGV4ZXJfZGlzY29ubmVjdF9ub25jb250cm9sKFFlbXVkTXVsdGlwbGV4ZXIqIG0pOworCisvKiBoYW5kbGUgY29udHJvbCBtZXNzYWdlcy4gVGhpcyBpcyB1c2VkIGFzIHRoZSByZWNlaXZlCisgKiBjYWxsYmFjayBmb3IgdGhlIHNwZWNpYWwgUWVtdWRDbGllbnQgc2V0dXAgdG8gbWFuYWdlCisgKiBjaGFubmVsIDAuCisgKgorICogbm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIHplcm8tdGVybWluYXRlZCBmb3IgY29udmVuaWVuY2UKKyAqIChpLmUuIG1zZ1ttc2dsZW5dIGlzIGEgdmFsaWQgbWVtb3J5IHJlYWQgdGhhdCByZXR1cm5zICdcMCcpCisgKi8KK2V4dGVybiB2b2lkIHFlbXVkX211bHRpcGxleGVyX2NvbnRyb2xfcmVjdih2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqIGNsaWVudCk7CisKKy8qIGluaXRpYWxpemUgdGhlIGdsb2JhbCBRZW11ZE11bHRpcGxleGVyLgorICovCitleHRlcm4gdm9pZCBxZW11ZF9tdWx0aXBsZXhlcl9pbml0KFFlbXVkTXVsdGlwbGV4ZXIqIG11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTZXJpYWxMaW5lKiBzZXJpYWxfbGluZSk7CisKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VyaWFsLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJpYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGQ3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VyaWFsLmNwcApAQCAtMCwwICsxLDMzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NlcmlhbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jb21tb24uaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgIEhFQURFUl9TSVpFICAgIDYKKworI2RlZmluZSAgTEVOR1RIX09GRlNFVCAgMgorI2RlZmluZSAgTEVOR1RIX1NJWkUgICAgNAorCisjZGVmaW5lICBDSEFOTkVMX09GRlNFVCAwCisjZGVmaW5lICBDSEFOTkVMX1NJWkUgICAyCisKK3ZvaWQgcWVtdWRfc2VyaWFsX3NhdmUoU3RyZWFtKiBmLCBRZW11ZFNlcmlhbCogcykgeworICAgIC8qIHNsLCByZWN2X2Z1bmMgYW5kIHJlY3Zfb3BhcXVlIGFyZSBub3Qgc2F2ZWQsIGFzIHRoZXNlIGFyZSBhc3NpZ25lZCBvbmx5CisgICAgICogZHVyaW5nIGVtdWxhdG9yIGluaXQuIEEgbG9hZCB3aXRoaW4gYSBzZXNzaW9uIGNhbiByZS11c2UgdGhlIHZhbHVlcworICAgICAqIGFscmVhZHkgYXNzaWduZWQsIGEgbmV3bHkgbGF1bmNoZWQgZW11bGF0b3IgaGFzIGZyZXNobHkgYXNzaWduZWQgdmFsdWVzLgorICAgICAqLworCisgICAgLyogc3RhdGUgb2YgaW5jb21pbmcgcGFja2V0cyBmcm9tIHRoZSBzZXJpYWwgcG9ydCAqLworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBzLT5uZWVkX2hlYWRlcik7CisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHMtPm92ZXJmbG93KTsKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgcy0+aW5fc2l6ZSk7CisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHMtPmluX2NoYW5uZWwpOworI2lmIFNVUFBPUlRfTEVHQUNZX1FFTVVECisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHMtPnZlcnNpb24pOworI2VuZGlmCisgICAgcWVtdWRfc2lua19zYXZlKGYsIHMtPmhlYWRlcik7CisgICAgcWVtdWRfc2lua19zYXZlKGYsIHMtPnBheWxvYWQpOworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBNQVhfU0VSSUFMX1BBWUxPQUQgKyAxKTsKKyAgICBzdHJlYW1fd3JpdGUoZiwgcy0+ZGF0YTAsIE1BWF9TRVJJQUxfUEFZTE9BRCArIDEpOworfQorCitpbnQgcWVtdWRfc2VyaWFsX2xvYWQoU3RyZWFtKiBmLCBRZW11ZFNlcmlhbCogcykgeworICAgIC8qIHN0YXRlIG9mIGluY29taW5nIHBhY2tldHMgZnJvbSB0aGUgc2VyaWFsIHBvcnQgKi8KKyAgICBzLT5uZWVkX2hlYWRlciA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBzLT5vdmVyZmxvdyA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBzLT5pbl9zaXplID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgIHMtPmluX2NoYW5uZWwgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisjaWYgU1VQUE9SVF9MRUdBQ1lfUUVNVUQKKyAgICBzLT52ZXJzaW9uID0gc3RhdGljX2Nhc3Q8UWVtdWRWZXJzaW9uPihzdHJlYW1fZ2V0X2JlMzIoZikpOworI2VuZGlmCisgICAgcWVtdWRfc2lua19sb2FkKGYsIHMtPmhlYWRlcik7CisgICAgcWVtdWRfc2lua19sb2FkKGYsIHMtPnBheWxvYWQpOworCisgICAgLyogcy0+aGVhZGVyIGFuZCBzLT5wYXlsb2FkIGFyZSBvbmx5IGV2ZXIgY29ubmVjdGVkIHRvIHMtPmRhdGEwICovCisgICAgcy0+aGVhZGVyLT5idWZmID0gcy0+cGF5bG9hZC0+YnVmZiA9IHMtPmRhdGEwOworCisgICAgaW50IGxlbiA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBpZiAobGVuIC0gMSA+IE1BWF9TRVJJQUxfUEFZTE9BRCkgeworICAgICAgICBEKCIlczogbG9hZCBmYWlsZWQ6IHNpemUgb2Ygc2F2ZWQgcGF5bG9hZCBidWZmZXIgKCVkKSBleGNlZWRzICIKKyAgICAgICAgICAgICAgICAgICJjdXJyZW50IG1heGltdW0gKCVkKVxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxlbiAtIDEsIE1BWF9TRVJJQUxfUEFZTE9BRCk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKyAgICBpbnQgcmV0OworICAgIGlmICgocmV0ID0gc3RyZWFtX3JlYWQoZiwgcy0+ZGF0YTAsIGxlbikpICE9IGxlbikgeworICAgICAgICBEKCIlczogZmFpbGVkIHRvIGxvYWQgc2VyaWFsIGJ1ZmZlciBjb250ZW50cyAodHJpZWQgcmVhZGluZyAlZCBieXRlcywgZ290ICVkKVxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxlbiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBTVVBQT1JUX0xFR0FDWV9RRU1VRAordm9pZCBxZW11ZF9zZXJpYWxfc2VuZF9sZWdhY3lfcHJvYmUoIFFlbXVkU2VyaWFsKiAgcyApCit7CisgICAgLyogd2UncmUgZ29pbmcgdG8gc2VuZCBhIHNwZWNpYWxseSBjcmFmdGVkIHBhY2tldCB0byB0aGUgcWVtdWQKKyAgICAgKiBkYWVtb24sIHRoaXMgd2lsbCBoZWxwIHVzIGRldGVybWluZSB3aGV0aGVyIHdlJ3JlIHRhbGtpbmcKKyAgICAgKiB0byBhIGxlZ2FjeSBvciBhIG5vcm1hbCBkYWVtb24uCisgICAgICoKKyAgICAgKiB0aGUgdHJpY2sgaXMgdG8ga25vd24gdGhhdCBhIGxlZ2FjeSBkYWVtb24gdXNlcyB0aGUgZm9sbG93aW5nCisgICAgICogaGVhZGVyOgorICAgICAqCisgICAgICogICAgPGxlbmd0aD48Y2hhbm5lbD48cGF5bG9hZD4KKyAgICAgKgorICAgICAqIHdoaWxlIHRoZSBub3JtYWwgb25lIHVzZXM6CisgICAgICoKKyAgICAgKiAgICA8Y2hhbm5lbD48bGVuZ3RoPjxwYXlsb2FkPgorICAgICAqCisgICAgICogd2hlcmUgPGNoYW5uZWw+IGlzIGEgMi1oZXhjaGFyIHN0cmluZywgYW5kIDxsZW5ndGg+IGEgNC1oZXhjaGFyCisgICAgICogc3RyaW5nLgorICAgICAqCisgICAgICogaWYgd2Ugc2VuZCBhIGhlYWRlciBvZiAiMDAwMTAwIiwgaXQgaXMgaW50ZXJwcmV0ZWQ6CisgICAgICoKKyAgICAgKiAtIGFzIHRoZSBoZWFkZXIgb2YgYSAxLWJ5dGUgcGF5bG9hZCBieSB0aGUgbGVnYWN5IGRhZW1vbgorICAgICAqIC0gYXMgdGhlIGhlYWRlciBvZiBhIDI1Ni1ieXRlIHBheWxvYWQgYnkgdGhlIG5vcm1hbCBvbmUuCisgICAgICoKKyAgICAgKiB3ZSdyZSBnb2luZyB0byBzZW5kIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2U6CisgICAgICoKKyAgICAgKiAgICIwMDAxMDAiICsgIlgiICsKKyAgICAgKiAgICIwMDBiMDAiICsgImNvbm5lY3Q6Z3NtIiArCisgICAgICogICAiMDAwYjAwIiArICJjb25uZWN0OmdwcyIgKworICAgICAqICAgIjAwMGYwMCIgKyAiY29ubmVjdDpjb250cm9sIiArCisgICAgICogICAiMDBjMjEwIiArICIwIioxOTQKKyAgICAgKgorICAgICAqIHRoZSBub3JtYWwgZGFlbW9uIHdpbGwgaW50ZXJwcmV0IHRoaXMgYXMgYSAyNTYtYnl0ZSBwYXlsb2FkCisgICAgICogZm9yIGNoYW5uZWwgMCwgd2l0aCBnYXJiYWdlIGNvbnRlbnQgKCJYMDAwYjAwY29ubi4uLiIpIHdoaWNoCisgICAgICogd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAqCisgICAgICogb24gdGhlIG90aGVyIGhhbmQsIHRoZSBsZWdhY3kgZGFlbW9uIHdpbGwgc2VlIGl0IGFzIGEKKyAgICAgKiBzZXJpZXMgb2YgcGFja2V0czoKKyAgICAgKgorICAgICAqICAgb25lIG1lc3NhZ2UgIlgiIG9uIGNoYW5uZWwgMCwgd2hpY2ggd2lsbCBmb3JjZSB0aGUgZGFlbW9uCisgICAgICogICB0byBzZW5kIGJhY2sgIjAwMTIwMGtvOnVua25vd24gY29tbWFuZCIgYXMgaXRzIGZpcnN0IGFuc3dlci4KKyAgICAgKgorICAgICAqICAgdGhyZWUgImNvbm5lY3Q6PHh4eD4iIG1lc3NhZ2VzIHVzZWQgdG8gcmVjZWl2ZSB0aGUgY2hhbm5lbAorICAgICAqICAgbnVtYmVycyBvZiB0aGUgdGhyZWUgbGVnYWN5IHNlcnZpY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBkYWVtb24uCisgICAgICoKKyAgICAgKiAgIGEgZ2FyYmFnZSBwYWNrZXQgb2YgMTk0IHplcm9lcyBmb3IgY2hhbm5lbCAxNiwgd2hpY2ggd2lsbCBiZQorICAgICAqICAgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICB0YWJbMTk0XTsKKworICAgIG1lbXNldCh0YWIsIDAsIHNpemVvZih0YWIpKTsKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUocy0+c2wsICh1aW50OF90KikiMDAwMTAwWCIsIDcpOworICAgIGFuZHJvaWRfc2VyaWFsbGluZV93cml0ZShzLT5zbCwgKHVpbnQ4X3QqKSIwMDBiMDBjb25uZWN0OmdzbSIsIDE3KTsKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUocy0+c2wsICh1aW50OF90KikiMDAwYjAwY29ubmVjdDpncHMiLCAxNyk7CisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKHMtPnNsLCAodWludDhfdCopIjAwMGYwMGNvbm5lY3Q6Y29udHJvbCIsIDIxKTsKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUocy0+c2wsICh1aW50OF90KikiMDBjMjEwIiwgNik7CisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKHMtPnNsLCB0YWIsIHNpemVvZih0YWIpKTsKK30KKyNlbmRpZiAvKiBTVVBQT1JUX0xFR0FDWV9RRU1VRCAqLworCisvKiBjYWxsZWQgYnkgdGhlIGNoYXJwaXBlIHRvIHNlZSBob3cgbXVjaCBieXRlcyBjYW4gYmUKKyAqIHJlYWQgZnJvbSB0aGUgc2VyaWFsIHBvcnQuCisgKi8KKworc3RhdGljIGludCBfcWVtdWRfc2VyaWFsX2Nhbl9yZWFkKHZvaWQqIG9wYXF1ZSkgeworICAgIFFlbXVkU2VyaWFsKiBzID0gc3RhdGljX2Nhc3Q8UWVtdWRTZXJpYWwqPihvcGFxdWUpOworCisgICAgaWYgKHMtPm92ZXJmbG93ID4gMCkgeworICAgICAgICByZXR1cm4gcy0+b3ZlcmZsb3c7CisgICAgfQorCisgICAgLyogaWYgaW5fc2l6ZSBpcyAwLCB3ZSdyZSByZWFkaW5nIHRoZSBoZWFkZXIgKi8KKyAgICBpZiAocy0+bmVlZF9oZWFkZXIpCisgICAgICAgIHJldHVybiBxZW11ZF9zaW5rX25lZWRlZChzLT5oZWFkZXIpOworCisgICAgLyogb3RoZXJ3aXNlLCB3ZSdyZSByZWFkaW5nIHRoZSBwYXlsb2FkICovCisgICAgcmV0dXJuIHFlbXVkX3NpbmtfbmVlZGVkKHMtPnBheWxvYWQpOworfQorCisvKiBjYWxsZWQgYnkgdGhlIGNoYXJwaXBlIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBzZXJpYWwKKyAqIHBvcnQuICdsZW4nIGNhbm5vdCBiZSBtb3JlIHRoYW4gdGhlIHZhbHVlIHJldHVybmVkCisgKiBieSAncWVtdWRfc2VyaWFsX2Nhbl9yZWFkJy4KKyAqLworc3RhdGljIHZvaWQgX3FlbXVkX3NlcmlhbF9yZWFkKHZvaWQqIG9wYXF1ZSwgY29uc3QgdWludDhfdCogZnJvbSwgaW50IGxlbikgeworICAgIFFlbXVkU2VyaWFsKiBzID0gc3RhdGljX2Nhc3Q8UWVtdWRTZXJpYWwqPihvcGFxdWUpOworCisgICAgVCgiJXM6IHJlY2VpdmVkICUzZCBieXRlczogJyVzJyIsIF9fRlVOQ1RJT05fXywgbGVuLCBxdW90ZV9ieXRlcygoY29uc3Qgdm9pZCopIGZyb20sIGxlbikpOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50IGF2YWlsOworCisgICAgICAgIC8qIHNraXAgb3ZlcmZsb3cgYnl0ZXMgKi8KKyAgICAgICAgaWYgKHMtPm92ZXJmbG93ID4gMCkgeworICAgICAgICAgICAgYXZhaWwgPSBzLT5vdmVyZmxvdzsKKyAgICAgICAgICAgIGlmIChhdmFpbCA+IGxlbikKKyAgICAgICAgICAgICAgICBhdmFpbCA9IGxlbjsKKworICAgICAgICAgICAgZnJvbSArPSBhdmFpbDsKKyAgICAgICAgICAgIGxlbiAtPSBhdmFpbDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBoZWFkZXIgaWYgbmVlZGVkICovCisgICAgICAgIGlmIChzLT5uZWVkX2hlYWRlcikgeworICAgICAgICAgICAgaWYgKCFxZW11ZF9zaW5rX2ZpbGwocy0+aGVhZGVyLCAoY29uc3QgdWludDhfdCoqKSAmZnJvbSwgJmxlbikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZiBTVVBQT1JUX0xFR0FDWV9RRU1VRAorICAgICAgICAgICAgaWYgKHMtPnZlcnNpb24gPT0gUUVNVURfVkVSU0lPTl9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgLyogaWYgd2UgcmVjZWl2ZSAiMDAxMjAwIiBhcyB0aGUgZmlyc3QgaGVhZGVyLCB0aGVuIHdlCisgICAgICAgICAgICAgICAgICogZGV0ZWN0ZWQgYSBsZWdhY3kgcWVtdWQgZGFlbW9uLiBTZWUgdGhlIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgICogaW4gcWVtdWRfc2VyaWFsX3NlbmRfbGVnYWN5X3Byb2JlKCkgZm9yIGRldGFpbHMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKHMtPmRhdGEwLCAiMDAxMjAwIiwgNikgKSB7CisgICAgICAgICAgICAgICAgICAgIEQoIiVzOiBsZWdhY3kgcWVtdWQgZGV0ZWN0ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+dmVyc2lvbiA9IFFFTVVEX1ZFUlNJT05fTEVHQUNZOworICAgICAgICAgICAgICAgICAgICAvKiB0ZWxsIHRoZSBtb2RlbSB0byB1c2UgbGVnYWN5IGVtdWxhdGlvbiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIGFtb2RlbV9zZXRfbGVnYWN5KGFuZHJvaWRfbW9kZW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEQoIiVzOiBub3JtYWwgcWVtdWQgZGV0ZWN0ZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+dmVyc2lvbiA9IFFFTVVEX1ZFUlNJT05fTk9STUFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnZlcnNpb24gPT0gUUVNVURfVkVSU0lPTl9MRUdBQ1kpIHsKKyAgICAgICAgICAgICAgICBzLT5pbl9zaXplICAgICA9IGhleDJpbnQoIHMtPmRhdGEwICsgTEVHQUNZX0xFTkdUSF9PRkZTRVQsICBMRU5HVEhfU0laRSApOworICAgICAgICAgICAgICAgIHMtPmluX2NoYW5uZWwgID0gaGV4MmludCggcy0+ZGF0YTAgKyBMRUdBQ1lfQ0hBTk5FTF9PRkZTRVQsIENIQU5ORUxfU0laRSApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5pbl9zaXplICAgICA9IGhleDJpbnQoIHMtPmRhdGEwICsgTEVOR1RIX09GRlNFVCwgIExFTkdUSF9TSVpFICk7CisgICAgICAgICAgICAgICAgcy0+aW5fY2hhbm5lbCAgPSBoZXgyaW50KCBzLT5kYXRhMCArIENIQU5ORUxfT0ZGU0VULCBDSEFOTkVMX1NJWkUgKTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAvKiBleHRyYWN0IHBheWxvYWQgbGVuZ3RoICsgY2hhbm5lbCBpZCAqLworICAgICAgICAgICAgcy0+aW5fc2l6ZSA9IGhleDJpbnQocy0+ZGF0YTAgKyBMRU5HVEhfT0ZGU0VULCBMRU5HVEhfU0laRSk7CisgICAgICAgICAgICBzLT5pbl9jaGFubmVsID0gaGV4MmludChzLT5kYXRhMCArIENIQU5ORUxfT0ZGU0VULCBDSEFOTkVMX1NJWkUpOworI2VuZGlmCisgICAgICAgICAgICBzLT5oZWFkZXItPnVzZWQgPSAwOworCisgICAgICAgICAgICBpZiAocy0+aW5fc2l6ZSA8PSAwIHx8IHMtPmluX2NoYW5uZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IGJhZCBoZWFkZXI6ICclLipzJyIsIF9fRlVOQ1RJT05fXywgSEVBREVSX1NJWkUsIHMtPmRhdGEwKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmluX3NpemUgPiBNQVhfU0VSSUFMX1BBWUxPQUQpIHsKKyAgICAgICAgICAgICAgICBEKCIlczogaWdub3JpbmcgaHVnZSBzZXJpYWwgcGFja2V0OiBsZW5ndGg9JWQgY2hhbm5lbD0lMSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHMtPmluX3NpemUsIHMtPmluX2NoYW5uZWwpOworICAgICAgICAgICAgICAgIHMtPm92ZXJmbG93ID0gcy0+aW5fc2l6ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcHJlcGFyZSAnaW5fZGF0YScgZm9yIHBheWxvYWQgKi8KKyAgICAgICAgICAgIHMtPm5lZWRfaGVhZGVyID0gMDsKKyAgICAgICAgICAgIHFlbXVkX3NpbmtfcmVzZXQocy0+cGF5bG9hZCwgcy0+aW5fc2l6ZSwgcy0+ZGF0YTApOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBwYXlsb2FkIGJ5dGVzICovCisgICAgICAgIGlmICghcWVtdWRfc2lua19maWxsKHMtPnBheWxvYWQsICZmcm9tLCAmbGVuKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHplcm8tdGVybWluYXRlIHBheWxvYWQsIHRoZW4gc2VuZCBpdCB0byByZWNlaXZlciAqLworICAgICAgICBzLT5wYXlsb2FkLT5idWZmW3MtPnBheWxvYWQtPnNpemVdID0gMDsKKyAgICAgICAgRCgiJXM6IGNoYW5uZWw9JTJkIGxlbj0lM2QgJyVzJyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBzLT5pbl9jaGFubmVsLCBzLT5wYXlsb2FkLT5zaXplLAorICAgICAgICAgIHF1b3RlX2J5dGVzKChjb25zdCBjaGFyKikgcy0+cGF5bG9hZC0+YnVmZiwgcy0+cGF5bG9hZC0+c2l6ZSkpOworCisgICAgICAgIHMtPnJlY3ZfZnVuYyhzLT5yZWN2X29wYXF1ZSwgcy0+aW5fY2hhbm5lbCwgcy0+cGF5bG9hZC0+YnVmZiwgcy0+cGF5bG9hZC0+c2l6ZSk7CisKKyAgICAgICAgLyogcHJlcGFyZSBmb3IgbmV3IGhlYWRlciAqLworICAgICAgICBzLT5uZWVkX2hlYWRlciA9IDE7CisgICAgfQorfQorCit2b2lkIHFlbXVkX3NlcmlhbF9pbml0KFFlbXVkU2VyaWFsKiBzLAorICAgICAgICAgICAgICAgICAgICAgICBDU2VyaWFsTGluZSogc2wsCisgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VyaWFsUmVjZWl2ZSByZWN2X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlY3Zfb3BhcXVlKSB7CisgICAgcy0+c2wgPSBzbDsKKyAgICBzLT5yZWN2X2Z1bmMgPSByZWN2X2Z1bmM7CisgICAgcy0+cmVjdl9vcGFxdWUgPSByZWN2X29wYXF1ZTsKKyAgICBzLT5uZWVkX2hlYWRlciA9IDE7CisgICAgcy0+b3ZlcmZsb3cgPSAwOworCisgICAgcWVtdWRfc2lua19yZXNldChzLT5oZWFkZXIsIEhFQURFUl9TSVpFLCBzLT5kYXRhMCk7CisgICAgcy0+aW5fc2l6ZSA9IDA7CisgICAgcy0+aW5fY2hhbm5lbCA9IC0xOworCisjaWYgU1VQUE9SVF9MRUdBQ1lfUUVNVUQKKyAgICBzLT52ZXJzaW9uID0gUUVNVURfVkVSU0lPTl9VTktOT1dOOworICAgIHFlbXVkX3NlcmlhbF9zZW5kX2xlZ2FjeV9wcm9iZShzKTsKKyNlbmRpZgorCisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX2FkZGhhbmRsZXJzKHNsLCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcWVtdWRfc2VyaWFsX2Nhbl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcWVtdWRfc2VyaWFsX3JlYWQpOworfQorCit2b2lkIHFlbXVkX3NlcmlhbF9zZW5kKFFlbXVkU2VyaWFsKiBzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgQUJvb2wgZnJhbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNnbGVuKSB7CisgICAgdWludDhfdCBoZWFkZXJbSEVBREVSX1NJWkVdOworICAgIHVpbnQ4X3QgZnJhbWVbRlJBTUVfSEVBREVSX1NJWkVdOworICAgIGludCBhdmFpbCwgbGVuID0gbXNnbGVuOworCisgICAgaWYgKG1zZ2xlbiA8PSAwIHx8IGNoYW5uZWwgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICBEKCIlczogY2hhbm5lbD0lMmQgbGVuPSUzZCAnJXMnIiwKKyAgICAgIF9fRlVOQ1RJT05fXywgY2hhbm5lbCwgbXNnbGVuLAorICAgICAgcXVvdGVfYnl0ZXMoKGNvbnN0IGNoYXIqKSBtc2csIG1zZ2xlbikpOworCisgICAgaWYgKGZyYW1pbmcpIHsKKyAgICAgICAgbGVuICs9IEZSQU1FX0hFQURFUl9TSVpFOworICAgIH0KKworICAgIC8qIHBhY2tldGl6ZSB0aGUgcGF5bG9hZCBmb3IgdGhlIHNlcmlhbCBNVFUgKi8KKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBhdmFpbCA9IGxlbjsKKyAgICAgICAgaWYgKGF2YWlsID4gTUFYX1NFUklBTF9QQVlMT0FEKQorICAgICAgICAgICAgYXZhaWwgPSBNQVhfU0VSSUFMX1BBWUxPQUQ7CisKKyAgICAgICAgLyogd3JpdGUgdGhpcyBwYWNrZXQncyBoZWFkZXIgKi8KKyNpZiBTVVBQT1JUX0xFR0FDWV9RRU1VRAorICAgICAgICBpZiAocy0+dmVyc2lvbiA9PSBRRU1VRF9WRVJTSU9OX0xFR0FDWSkgeworICAgICAgICAgICAgaW50MmhleChoZWFkZXIgKyBMRUdBQ1lfTEVOR1RIX09GRlNFVCwgIExFTkdUSF9TSVpFLCAgYXZhaWwpOworICAgICAgICAgICAgaW50MmhleChoZWFkZXIgKyBMRUdBQ1lfQ0hBTk5FTF9PRkZTRVQsIENIQU5ORUxfU0laRSwgY2hhbm5lbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQyaGV4KGhlYWRlciArIExFTkdUSF9PRkZTRVQsICBMRU5HVEhfU0laRSwgIGF2YWlsKTsKKyAgICAgICAgICAgIGludDJoZXgoaGVhZGVyICsgQ0hBTk5FTF9PRkZTRVQsIENIQU5ORUxfU0laRSwgY2hhbm5lbCk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGludDJoZXgoaGVhZGVyICsgTEVOR1RIX09GRlNFVCwgTEVOR1RIX1NJWkUsIGF2YWlsKTsKKyAgICAgICAgaW50MmhleChoZWFkZXIgKyBDSEFOTkVMX09GRlNFVCwgQ0hBTk5FTF9TSVpFLCBjaGFubmVsKTsKKyNlbmRpZgorICAgICAgICBUKCIlczogJyUuKnMnIiwgX19GVU5DVElPTl9fLCBIRUFERVJfU0laRSwgaGVhZGVyKTsKKyAgICAgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKHMtPnNsLCBoZWFkZXIsIEhFQURFUl9TSVpFKTsKKworICAgICAgICAvKiBpbnNlcnQgZnJhbWUgaGVhZGVyIHdoZW4gbmVlZGVkICovCisgICAgICAgIGlmIChmcmFtaW5nKSB7CisgICAgICAgICAgICBpbnQyaGV4KGZyYW1lLCBGUkFNRV9IRUFERVJfU0laRSwgbXNnbGVuKTsKKyAgICAgICAgICAgIFQoIiVzOiAnJS4qcyciLCBfX0ZVTkNUSU9OX18sIEZSQU1FX0hFQURFUl9TSVpFLCBmcmFtZSk7CisgICAgICAgICAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUocy0+c2wsIGZyYW1lLCBGUkFNRV9IRUFERVJfU0laRSk7CisgICAgICAgICAgICBhdmFpbCAtPSBGUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgIGxlbiAtPSBGUkFNRV9IRUFERVJfU0laRTsKKyAgICAgICAgICAgIGZyYW1pbmcgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyogd3JpdGUgbWVzc2FnZSBjb250ZW50ICovCisgICAgICAgIFQoIiVzOiAnJS4qcyciLCBfX0ZVTkNUSU9OX18sIGF2YWlsLCBtc2cpOworICAgICAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUocy0+c2wsIG1zZywgYXZhaWwpOworICAgICAgICBtc2cgKz0gYXZhaWw7CisgICAgICAgIGxlbiAtPSBhdmFpbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VyaWFsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxZmM3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJpYWwuaApAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NpbmsuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiogSEFORExJTkcgU0VSSUFMIFBPUlQgQ09OTkVDVElPTgorICoqLworCisvKiBUaGUgUWVtdWRTZXJpYWwgb2JqZWN0IHJlY2VpdmVzIGRhdGEgZnJvbSB0aGUgc2VyaWFsIHBvcnQgaW50ZXJmYWNlLgorICogSXQgcGFyc2VzIHRoZSBoZWFkZXIgdG8gZXh0cmFjdCB0aGUgY2hhbm5lbCBpZCBhbmQgcGF5bG9hZCBsZW5ndGgsCisgKiB0aGVuIHRoZSBtZXNzYWdlIGl0c2VsZi4KKyAqCisgKiBJbmNvbWluZyBtZXNzYWdlcyBhcmUgc2VudCB0byBhIGdlbmVyaWMgcmVjZWl2ZXIgaWRlbnRpZmllZCBieQorICogdGhlICdyZWN2X29wYXF1ZScgYW5kICdyZWN2X2Z1bmMnIHBhcmFtZXRlcnMgdG8gcWVtdWRfc2VyaWFsX2luaXQoKQorICoKKyAqIEl0IGFsc28gcHJvdmlkZXMgcWVtdWRfc2VyaWFsX3NlbmQoKSB3aGljaCBjYW4gYmUgdXNlZCB0byBzZW5kCisgKiBtZXNzYWdlcyBiYWNrIHRocm91Z2ggdGhlIHNlcmlhbCBwb3J0LgorICovCisKKy8qIG1heCBzZXJpYWwgTVRVLiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IG1vZGlmeWluZworICogZGV2ZWxvcG1lbnQvZW11bGF0b3IvcWVtdWQvcWVtdWQuYyBhcyB3ZWxsLgorICovCisjZGVmaW5lICBNQVhfU0VSSUFMX1BBWUxPQUQgICAgICAgIDQwMDAKKworI2lmIFNVUFBPUlRfTEVHQUNZX1FFTVVECit0eXBlZGVmIGVudW0geworICAgIFFFTVVEX1ZFUlNJT05fVU5LTk9XTiwKKyAgICBRRU1VRF9WRVJTSU9OX0xFR0FDWSwKKyAgICBRRU1VRF9WRVJTSU9OX05PUk1BTAorfSBRZW11ZFZlcnNpb247CisKKyMgIGRlZmluZSAgTEVHQUNZX0xFTkdUSF9PRkZTRVQgICAwCisjICBkZWZpbmUgIExFR0FDWV9DSEFOTkVMX09GRlNFVCAgNAorI2VuZGlmCisKKy8qIG91dCBvZiBjb252ZW5pZW5jZSwgdGhlIGluY29taW5nIG1lc3NhZ2UgaXMgemVyby10ZXJtaW5hdGVkCisgKiBhbmQgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSByZWNlaXZlciAoZS5nLiBmb3IgdG9rZW5pemF0aW9uKS4KKyAqLwordHlwZWRlZiB2b2lkICgqIFFlbXVkU2VyaWFsUmVjZWl2ZSkodm9pZCogb3BhcXVlLCBpbnQgY2hhbm5lbCwgdWludDhfdCogbXNnLCBpbnQgbXNnbGVuKTsKKwordHlwZWRlZiBzdHJ1Y3QgUWVtdWRTZXJpYWwgeworICAgIENTZXJpYWxMaW5lKiBzbDsgIC8qIHNlcmlhbCBsaW5lIGVuZHBvaW50ICovCisKKyAgICAvKiBtYW5hZ2luZyBpbmNvbWluZyBwYWNrZXRzIGZyb20gdGhlIHNlcmlhbCBwb3J0ICovCisgICAgQUJvb2wgbmVlZF9oZWFkZXI7CisgICAgaW50IG92ZXJmbG93OworICAgIGludCBpbl9zaXplOworICAgIGludCBpbl9jaGFubmVsOworI2lmIFNVUFBPUlRfTEVHQUNZX1FFTVVECisgICAgUWVtdWRWZXJzaW9uICB2ZXJzaW9uOworI2VuZGlmCisgICAgUWVtdWRTaW5rIGhlYWRlclsxXTsKKyAgICBRZW11ZFNpbmsgcGF5bG9hZFsxXTsKKyAgICB1aW50OF90IGRhdGEwW01BWF9TRVJJQUxfUEFZTE9BRCArIDFdOworCisgICAgLyogcmVjZWl2ZXIgKi8KKyAgICBRZW11ZFNlcmlhbFJlY2VpdmUgcmVjdl9mdW5jOworICAgIC8qIHJlY2VpdmVyIGNhbGxiYWNrICovCisgICAgdm9pZCogcmVjdl9vcGFxdWU7ICAvKiByZWNlaXZlciB1c2VyLXNwZWNpZmljIGRhdGEgKi8KK30gUWVtdWRTZXJpYWw7CisKKy8qIFNhdmUgdGhlIHN0YXRlIG9mIGEgUWVtdWRTZXJpYWwgdG8gYSBzbmFwc2hvdCBmaWxlLgorICovCitleHRlcm4gdm9pZCBxZW11ZF9zZXJpYWxfc2F2ZShTdHJlYW0qIGYsIFFlbXVkU2VyaWFsKiBzKTsKKworLyogTG9hZCB0aGUgc3RhdGUgb2YgYSBRZW11ZFNlcmlhbCBmcm9tIGEgc25hcHNob3QgZmlsZS4KKyAqLworZXh0ZXJuIGludCBxZW11ZF9zZXJpYWxfbG9hZChTdHJlYW0qIGYsIFFlbXVkU2VyaWFsKiBzKTsKKworLyogY2FsbGVkIGJ5IHRoZSBjaGFycGlwZSB0byBzZWUgaG93IG11Y2ggYnl0ZXMgY2FuIGJlCisgKiByZWFkIGZyb20gdGhlIHNlcmlhbCBwb3J0LgorICovCisjaWYgU1VQUE9SVF9MRUdBQ1lfUUVNVUQKK2V4dGVybiB2b2lkIHFlbXVkX3NlcmlhbF9zZW5kX2xlZ2FjeV9wcm9iZSggUWVtdWRTZXJpYWwqICBzICk7CisjZW5kaWYgLyogU1VQUE9SVF9MRUdBQ1lfUUVNVUQgKi8KKworLyogaW50aWFsaXplIGEgUWVtdWRTZXJpYWwgb2JqZWN0IHdpdGggYSBjaGFycGlwZSBlbmRwb2ludAorICogYW5kIGEgcmVjZWl2ZXIuCisgKi8KK2V4dGVybiB2b2lkIHFlbXVkX3NlcmlhbF9pbml0KFFlbXVkU2VyaWFsKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NlcmlhbExpbmUqIHNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJpYWxSZWNlaXZlIHJlY3ZfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlY3Zfb3BhcXVlKTsKKworLyogc2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHNlcmlhbCBwb3J0LiBUaGlzIHdpbGwgYWRkIHRoZSBuZWNlc3NhcnkKKyAqIGhlYWRlci4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfc2VyaWFsX3NlbmQoUWVtdWRTZXJpYWwqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCb29sIGZyYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNnbGVuKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VydmljZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3YjM1OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJ2aWNlLmNwcApAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NlcnZpY2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfY29tbW9uLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCitRZW11ZFNlcnZpY2UqIHFlbXVkX3NlcnZpY2VfbmV3KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NsaWVudHMsCisgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZUNvbm5lY3Qgc2Vydl9jb25uZWN0LAorICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlU2F2ZSBzZXJ2X3NhdmUsCisgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2VMb2FkIHNlcnZfbG9hZCwKKyAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZSoqIHBzZXJ2aWNlcykgeworICAgIFFlbXVkU2VydmljZSogcyA9IHN0YXRpY19jYXN0PFFlbXVkU2VydmljZSo+KGFuZHJvaWRfYWxsb2MwKHNpemVvZigqcykpKTsKKworICAgIHMtPm5hbWUgPSBBU1RSRFVQKG5hbWUpOworICAgIHMtPm1heF9jbGllbnRzID0gbWF4X2NsaWVudHM7CisgICAgcy0+bnVtX2NsaWVudHMgPSAwOworICAgIHMtPmNsaWVudHMgPSBOVUxMOworCisgICAgcy0+c2Vydl9vcGFxdWUgPSBzZXJ2X29wYXF1ZTsKKyAgICBzLT5zZXJ2X2Nvbm5lY3QgPSBzZXJ2X2Nvbm5lY3Q7CisgICAgcy0+c2Vydl9zYXZlID0gc2Vydl9zYXZlOworICAgIHMtPnNlcnZfbG9hZCA9IHNlcnZfbG9hZDsKKworICAgIHMtPm5leHQgPSAqcHNlcnZpY2VzOworICAgICpwc2VydmljZXMgPSBzOworCisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgcWVtdWRfc2VydmljZV9hZGRfY2xpZW50KFFlbXVkU2VydmljZSogcywgUWVtdWRDbGllbnQqIGMpIHsKKyAgICBjLT5zZXJ2aWNlID0gczsKKyAgICBjLT5uZXh0X3NlcnYgPSBzLT5jbGllbnRzOworICAgIHMtPmNsaWVudHMgPSBjOworICAgIHMtPm51bV9jbGllbnRzICs9IDE7Cit9CisKK3ZvaWQgcWVtdWRfc2VydmljZV9yZW1vdmVfY2xpZW50KFFlbXVkU2VydmljZSogcywgUWVtdWRDbGllbnQqIGMpIHsKKyAgICBRZW11ZENsaWVudCoqIHBub2RlID0gJnMtPmNsaWVudHM7CisgICAgUWVtdWRDbGllbnQqIG5vZGU7CisKKyAgICAvKiByZW1vdmUgZnJvbSBjbGllbnRzIGxpbmtlZC1saXN0ICovCisgICAgZm9yICg7IDspIHsKKyAgICAgICAgbm9kZSA9ICpwbm9kZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IGNvdWxkIG5vdCBmaW5kIGNsaWVudCBmb3Igc2VydmljZSAnJXMnIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9kZSA9PSBjKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBub2RlID0gJm5vZGUtPm5leHRfc2VydjsKKyAgICB9CisKKyAgICAqcG5vZGUgPSBub2RlLT5uZXh0X3NlcnY7CisgICAgcy0+bnVtX2NsaWVudHMgLT0gMTsKK30KKworUWVtdWRDbGllbnQqIHFlbXVkX3NlcnZpY2VfY29ubmVjdF9jbGllbnQoUWVtdWRTZXJ2aWNlKiBzdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSkgeworICAgIFFlbXVkQ2xpZW50KiBjbGllbnQgPQorICAgICAgICAgICAgc3YtPnNlcnZfY29ubmVjdChzdi0+c2Vydl9vcGFxdWUsIHN2LCBjaGFubmVsX2lkLCBjbGllbnRfcGFyYW0pOworICAgIGlmIChjbGllbnQgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogcmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgJyVzJyBzZXJ2aWNlIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN2LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEQoIiVzOiByZWdpc3RlcmVkIGNsaWVudCBjaGFubmVsICVkIGZvciAnJXMnIHNlcnZpY2UiLAorICAgICAgX19GVU5DVElPTl9fLCBjaGFubmVsX2lkLCBzdi0+bmFtZSk7CisgICAgcmV0dXJuIGNsaWVudDsKK30KKworUWVtdWRTZXJ2aWNlKiBxZW11ZF9zZXJ2aWNlX2ZpbmQoUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlX2xpc3QsIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZSkgeworICAgIFFlbXVkU2VydmljZSogc3YgPSBOVUxMOworICAgIGZvciAoc3YgPSBzZXJ2aWNlX2xpc3Q7IHN2ICE9IE5VTEw7IHN2ID0gc3YtPm5leHQpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3YtPm5hbWUsIHNlcnZpY2VfbmFtZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdjsKK30KKwordm9pZCBxZW11ZF9zZXJ2aWNlX3NhdmVfbmFtZShTdHJlYW0qIGYsIFFlbXVkU2VydmljZSogcykgeworICAgIGludCBsZW4gPSBzdHJsZW4ocy0+bmFtZSkgKyAxOyAgLy8gaW5jbHVkZSAnXDAnIHRlcm1pbmF0b3IKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgbGVuKTsKKyAgICBzdHJlYW1fd3JpdGUoZiwgKGNvbnN0IHVpbnQ4X3QqKSBzLT5uYW1lLCBsZW4pOworfQorCitjaGFyKiBxZW11ZF9zZXJ2aWNlX2xvYWRfbmFtZShTdHJlYW0qIGYpIHsKKyAgICBpbnQgcmV0OworICAgIGludCBuYW1lX2xlbiA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBjaGFyKiBzZXJ2aWNlX25hbWUgPSAoY2hhciopYW5kcm9pZF9hbGxvYyhuYW1lX2xlbik7CisgICAgaWYgKChyZXQgPSBzdHJlYW1fcmVhZChmLCAodWludDhfdCopIHNlcnZpY2VfbmFtZSwgbmFtZV9sZW4pICE9IG5hbWVfbGVuKSkgeworICAgICAgICBEKCIlczogc2VydmljZSBuYW1lIGxvYWQgZmFpbGVkOiBleHBlY3RlZCAlZCBieXRlcywgZ290ICVkXG4iLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmFtZV9sZW4sIHJldCk7CisgICAgICAgIEFGUkVFKHNlcnZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2VydmljZV9uYW1lW25hbWVfbGVuIC0gMV0gIT0gJ1wwJykgeworICAgICAgICBjaGFyIGxhc3QgPSBzZXJ2aWNlX25hbWVbbmFtZV9sZW4gLSAxXTsKKyAgICAgICAgc2VydmljZV9uYW1lW25hbWVfbGVuIC0gMV0gPSAnXDAnOyAgLyogbWFrZSBidWZmZXIgY29udGVudHMgcHJpbnRhYmxlICovCisgICAgICAgIEQoIiVzOiBzZXJ2aWNlIG5hbWUgbG9hZCBmYWlsZWQ6IGV4cGVjdGluZyBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nLCBidXQgIgorICAgICAgICAgICAgICAgICAgImxhc3QgY2hhciBpcyAnJWMnIChidWZmZXIgY29udGVudHM6ICclcyVjJylcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBuYW1lX2xlbiwgbGFzdCwgc2VydmljZV9uYW1lLCBsYXN0KTsKKyAgICAgICAgQUZSRUUoc2VydmljZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNlcnZpY2VfbmFtZTsKK30KKwordm9pZCBxZW11ZF9zZXJ2aWNlX3NhdmUoU3RyZWFtKiBmLCBRZW11ZFNlcnZpY2UqIHMpIHsKKyAgICBxZW11ZF9zZXJ2aWNlX3NhdmVfbmFtZShmLCBzKTsKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgcy0+bWF4X2NsaWVudHMpOworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBzLT5udW1fY2xpZW50cyk7CisKKyAgICBpZiAocy0+c2Vydl9zYXZlKQorICAgICAgICBzLT5zZXJ2X3NhdmUoZiwgcywgcy0+c2Vydl9vcGFxdWUpOworfQorCitpbnQgcWVtdWRfc2VydmljZV9sb2FkKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBjdXJyZW50X3NlcnZpY2VzKSB7CisgICAgY2hhciogc2VydmljZV9uYW1lID0gcWVtdWRfc2VydmljZV9sb2FkX25hbWUoZik7CisgICAgaWYgKHNlcnZpY2VfbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIC8qIGdldCBjdXJyZW50IHNlcnZpY2UgaW5zdGFuY2UgKi8KKyAgICBRZW11ZFNlcnZpY2UqIHN2ID0gcWVtdWRfc2VydmljZV9maW5kKGN1cnJlbnRfc2VydmljZXMsIHNlcnZpY2VfbmFtZSk7CisgICAgaWYgKHN2ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IGxvYWRpbmcgZmFpbGVkOiBzZXJ2aWNlIFwiJXNcIiBub3QgYXZhaWxhYmxlXG4iLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VydmljZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgLyogcmVjb25maWd1cmUgc2VydmljZSBhcyByZXF1aXJlZCAqLworICAgIHN2LT5tYXhfY2xpZW50cyA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBzdi0+bnVtX2NsaWVudHMgPSAwOworCisgICAgLy8gTk9URTogVGhlIG51bWJlciBvZiBjbGllbnRzIHNhdmVkIGNhbm5vdCBiZSB2ZXJpZmllZCBub3cuCisgICAgKHZvaWQpIHN0cmVhbV9nZXRfYmUzMihmKTsKKworICAgIC8qIGxvYWQgc2VydmljZSBzcGVjaWZpYyBkYXRhICovCisgICAgaW50IHJldDsKKyAgICBpZiAoc3YtPnNlcnZfbG9hZCkgeworICAgICAgICBpZiAoKHJldCA9IHN2LT5zZXJ2X2xvYWQoZiwgc3YsIHN2LT5zZXJ2X29wYXF1ZSkpKSB7CisgICAgICAgICAgICAvKiBsb2FkIGZhaWx1cmUgKi8KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBxZW11ZF9zZXJ2aWNlX2Jyb2FkY2FzdChRZW11ZFNlcnZpY2UqIHN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbikgeworICAgIFFlbXVkQ2xpZW50KiBjOworCisgICAgZm9yIChjID0gc3YtPmNsaWVudHM7IGM7IGMgPSBjLT5uZXh0X3NlcnYpCisgICAgICAgIHFlbXVkX2NsaWVudF9zZW5kKGMsIG1zZywgbXNnbGVuKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zZXJ2aWNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYzQ2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2VydmljZS5oCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcWVtdWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX2NsaWVudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogQSBRZW11ZFNlcnZpY2UgbW9kZWxzIGEgX25hbWVkXyBzZXJ2aWNlIGZhY2lsaXR5IGltcGxlbWVudGVkCisgKiBieSB0aGUgZW11bGF0b3IsIHRoYXQgY2xpZW50cyBpbiB0aGUgZW11bGF0ZWQgc3lzdGVtIGNhbiBjb25uZWN0CisgKiB0by4KKyAqCisgKiBFYWNoIHNlcnZpY2UgY2FuIGhhdmUgYSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNsaWVudHMgdGhleQorICogYWNjZXB0ICh0aGlzIG51bWJlciBpZiB1bmxpbWl0ZWQgaWYgJ21heF9jbGllbnRzJyBpcyAwKS4KKyAqCisgKiBFYWNoIHNlcnZpY2UgbWFpbnRhaW5zIGEgbGlzdCBvZiBhY3RpdmUgUWVtdWRDbGllbnRzIGFuZAorICogY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgbmV3IFFlbXVkQ2xpZW50IG9iamVjdHMgdGhyb3VnaAorICogaXRzICdzZXJ2X29wYXF1ZScgYW5kICdzZXJ2X2Nvbm5lY3QnIGZpZWxkcy4KKyAqLworCitzdHJ1Y3QgUWVtdWRTZXJ2aWNlIHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIGludCBtYXhfY2xpZW50czsKKyAgICBpbnQgbnVtX2NsaWVudHM7CisgICAgUWVtdWRDbGllbnQqIGNsaWVudHM7CisgICAgUWVtdWRTZXJ2aWNlQ29ubmVjdCBzZXJ2X2Nvbm5lY3Q7CisgICAgUWVtdWRTZXJ2aWNlU2F2ZSBzZXJ2X3NhdmU7CisgICAgUWVtdWRTZXJ2aWNlTG9hZCBzZXJ2X2xvYWQ7CisgICAgdm9pZCogc2Vydl9vcGFxdWU7CisgICAgUWVtdWRTZXJ2aWNlKiBuZXh0OworfTsKKworLyogdXNlZCBpbnRlcm5hbGx5IHRvIHBvcHVsYXRlIGEgUWVtdWRTZXJ2aWNlIG9iamVjdCB3aXRoIGEKKyAqIG5ldyBRZW11ZENsaWVudCAqLworZXh0ZXJuIHZvaWQgcWVtdWRfc2VydmljZV9hZGRfY2xpZW50KFFlbXVkU2VydmljZSogcywgUWVtdWRDbGllbnQqIGMpOworCisvKiB1c2VkIGludGVybmFsbHkgdG8gcmVtb3ZlIGEgUWVtdWRDbGllbnQgZnJvbSBhIFFlbXVkU2VydmljZSAqLworZXh0ZXJuIHZvaWQgcWVtdWRfc2VydmljZV9yZW1vdmVfY2xpZW50KFFlbXVkU2VydmljZSogcywgUWVtdWRDbGllbnQqIGMpOworCisvKiBhc2sgdGhlIHNlcnZpY2UgdG8gY3JlYXRlIGEgbmV3IFFlbXVkQ2xpZW50LiBOb3RlIHRoYXQgd2UKKyAqIGFzc3VtZSB0aGF0IHRoaXMgY2FsbHMgcWVtdWRfY2xpZW50X25ldygpIHdoaWNoIHdpbGwgYWRkCisgKiB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlJ3MgbGlzdCBhdXRvbWF0aWNhbGx5LgorICoKKyAqIHJldHVybnMgdGhlIGNsaWVudCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2V4dGVybiBRZW11ZENsaWVudCogcWVtdWRfc2VydmljZV9jb25uZWN0X2NsaWVudChRZW11ZFNlcnZpY2UqIHN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xpZW50X3BhcmFtKTsKKworLyogZmluZCBhIHJlZ2lzdGVyZWQgc2VydmljZSBieSBuYW1lLgorICovCitleHRlcm4gUWVtdWRTZXJ2aWNlKiBxZW11ZF9zZXJ2aWNlX2ZpbmQoUWVtdWRTZXJ2aWNlKiBzZXJ2aWNlX2xpc3QsIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZSk7CisKKy8qIFNhdmUgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIHNlcnZpY2UuCisgKi8KK2V4dGVybiB2b2lkIHFlbXVkX3NlcnZpY2Vfc2F2ZV9uYW1lKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzKTsKKworLyogTG9hZCB0aGUgbmFtZSBvZiBhIHNlcnZpY2UuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZWQgbmFtZSwgb3IgTlVMTAorICogb24gZmFpbHVyZS4KKyAqLworZXh0ZXJuIGNoYXIqIHFlbXVkX3NlcnZpY2VfbG9hZF9uYW1lKFN0cmVhbSogZik7CisKKy8qIFNhdmVzIHN0YXRlIG9mIGEgc2VydmljZS4KKyAqLworZXh0ZXJuIHZvaWQgcWVtdWRfc2VydmljZV9zYXZlKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzKTsKKworLyogTG9hZHMgc2VydmljZSBzdGF0ZSBmcm9tIGZpbGUsIHRoZW4gdXBkYXRlcyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgaW5zdGFuY2UKKyAqIG9mIHRoYXQgc2VydmljZSB0byBtaXJyb3IgdGhlIGxvYWRlZCBzdGF0ZS4gSWYgdGhlIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcsCisgKiB0aGUgbG9hZCBwcm9jZXNzIGlzIGFib3J0ZWQuCisgKgorICogUGFyYW1ldGVyICdjdXJyZW50X3NlcnZpY2VzJyBzaG91bGQgYmUgdGhlIGxpc3Qgb2YgYWN0aXZlIHNlcnZpY2VzLgorICovCitleHRlcm4gaW50IHFlbXVkX3NlcnZpY2VfbG9hZChTdHJlYW0qIGYsIFFlbXVkU2VydmljZSogY3VycmVudF9zZXJ2aWNlcyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NpbmsuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NpbmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDUzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2luay5jcHAKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9xZW11ZC9hbmRyb2lkX3FlbXVkX3NpbmsuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCit2b2lkIHFlbXVkX3Npbmtfc2F2ZShTdHJlYW0qIGYsIGNvbnN0IFFlbXVkU2luayogcykgeworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBzLT51c2VkKTsKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgcy0+c2l6ZSk7Cit9CisKK2ludCBxZW11ZF9zaW5rX2xvYWQoU3RyZWFtKiBmLCBRZW11ZFNpbmsqIHMpIHsKKyAgICBzLT51c2VkID0gc3RyZWFtX2dldF9iZTMyKGYpOworICAgIHMtPnNpemUgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcWVtdWRfc2lua19yZXNldChRZW11ZFNpbmsqIHNzLCBpbnQgc2l6ZSwgdWludDhfdCogYnVmZmVyKSB7CisgICAgc3MtPnVzZWQgPSAwOworICAgIHNzLT5zaXplID0gc2l6ZTsKKyAgICBzcy0+YnVmZiA9IGJ1ZmZlcjsKK30KKworaW50IHFlbXVkX3NpbmtfZmlsbChRZW11ZFNpbmsqIHNzLCBjb25zdCB1aW50OF90KiogcG1zZywgaW50KiBwbGVuKSB7CisgICAgaW50IGF2YWlsID0gc3MtPnNpemUgLSBzcy0+dXNlZDsKKworICAgIGlmIChhdmFpbCA8PSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmIChhdmFpbCA+ICpwbGVuKQorICAgICAgICBhdmFpbCA9ICpwbGVuOworCisgICAgbWVtY3B5KHNzLT5idWZmICsgc3MtPnVzZWQsICpwbXNnLCBhdmFpbCk7CisgICAgKnBtc2cgKz0gYXZhaWw7CisgICAgKnBsZW4gLT0gYXZhaWw7CisgICAgc3MtPnVzZWQgKz0gYXZhaWw7CisKKyAgICByZXR1cm4gKHNzLT51c2VkID09IHNzLT5zaXplKTsKK30KKworaW50IHFlbXVkX3NpbmtfbmVlZGVkKGNvbnN0IFFlbXVkU2luayogc3MpIHsKKyAgICByZXR1cm4gc3MtPnNpemUgLSBzcy0+dXNlZDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vcWVtdWQvYW5kcm9pZF9xZW11ZF9zaW5rLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjlmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3FlbXVkL2FuZHJvaWRfcWVtdWRfc2luay5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmVhbS5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBBIFFlbXVkU2luayBpcyBqdXN0IGEgaGFuZHkgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpcyB1c2VkIHRvCisgKiByZWFkIGEgZml4ZWQgYW1vdW50IG9mIGJ5dGVzIGludG8gYSBidWZmZXIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUWVtdWRTaW5rIHsKKyAgICBpbnQgdXNlZDsKKyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSB1c2VkICovCisgICAgaW50IHNpemU7CisgICAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmYgKi8KKyAgICB1aW50OF90KiBidWZmOworfSBRZW11ZFNpbms7CisKKworLyogc2F2ZSB0aGUgc3RhdGUgb2YgYSBRZW11ZFNpbmsgdG8gYSBzbmFwc2hvdC4KKyAqCisgKiBUaGUgYnVmZmVyIHBvaW50ZXIgaXMgbm90IHNhdmVkLCBzaW5jZSBpdCB1c3VhbGx5IHBvaW50cyB0byBidWZmZXIKKyAqIGZpZWxkcyBpbiBvdGhlciBzdHJ1Y3RzLCB3aGljaCBoYXZlIHNhdmUgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuIEl0CisgKiBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGNvcnJlY3RseSBzYXZlZCBhbmQKKyAqIHJlc3RvcmVkLgorICovCitleHRlcm4gdm9pZCBxZW11ZF9zaW5rX3NhdmUoU3RyZWFtKiBmLCBjb25zdCBRZW11ZFNpbmsqIHMpOworCisvKiBsb2FkIHRoZSBzdGF0ZSBvZiBhIFFlbXVkU2luayBmcm9tIGEgc25hcHNob3QuCisgKi8KK2V4dGVybiBpbnQgcWVtdWRfc2lua19sb2FkKFN0cmVhbSogZiwgUWVtdWRTaW5rKiBzKTsKKworLyogcmVzZXQgYSBRZW11ZFNpbmssIGkuZS4gcHJvdmlkZSBhIG5ldyBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcmVzcworICogYW5kIGl0cyBzaXplIGluIGJ5dGVzLgorICovCitleHRlcm4gdm9pZCBxZW11ZF9zaW5rX3Jlc2V0KFFlbXVkU2luayogc3MsIGludCBzaXplLCB1aW50OF90KiBidWZmZXIpOworCisvKiB0cnkgdG8gZmlsbCB0aGUgc2luayBieSByZWFkaW5nIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBidWZmZXIKKyAqICcqcG1zZycgd2hpY2ggY29udGFpbnMgJypwbGVuJyBieXRlcworICoKKyAqIHRoaXMgZnVuY3Rpb25zIHVwZGF0ZXMgJypwbXNnJyBhbmQgJypwbGVuJywgYW5kIHJldHVybnMKKyAqIDEgaWYgdGhlIHNpbmsncyBkZXN0aW5hdGlvbiBidWZmZXIgaXMgZnVsbCwgb3IgMCBvdGhlcndpc2UuCisgKi8KK2V4dGVybiBpbnQgcWVtdWRfc2lua19maWxsKFFlbXVkU2luayogc3MsIGNvbnN0IHVpbnQ4X3QqKiBwbXNnLCBpbnQqIHBsZW4pOworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGZpbGwgYSBzaW5rJ3MgZGVzdGluYXRpb24KKyAqIGJ1ZmZlci4KKyAqLworZXh0ZXJuIGludCBxZW11ZF9zaW5rX25lZWRlZChjb25zdCBRZW11ZFNpbmsqIHNzKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkY2E3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9TZXJpYWxMaW5lLmgiCisKK3VzaW5nIGFuZHJvaWQ6OlNlcmlhbExpbmU7CisKK3N0YXRpYyBTZXJpYWxMaW5lKiBhc0NsYXNzKENTZXJpYWxMaW5lKiBzbCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTZXJpYWxMaW5lKj4oc2wpOworfQorCitpbnQgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKENTZXJpYWxMaW5lKiBzbCwgY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbikgeworICAgIHJldHVybiBhc0NsYXNzKHNsKS0+d3JpdGUoZGF0YSwgbGVuKTsKK30KKwordm9pZCBhbmRyb2lkX3NlcmlhbGxpbmVfYWRkaGFuZGxlcnMoQ1NlcmlhbExpbmUqIHNsLCB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTENhblJlYWRIYW5kbGVyKiBjYW5SZWFkQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTFJlYWRIYW5kbGVyKiByZWFkQ2FsbGJhY2spIHsKKyAgICBhc0NsYXNzKHNsKS0+YWRkSGFuZGxlcnMob3BhcXVlLCBjYW5SZWFkQ2FsbGJhY2ssIHJlYWRDYWxsYmFjayk7Cit9CisKK0NTZXJpYWxMaW5lKiBhbmRyb2lkX3NlcmlhbGxpbmVfYnVmZmVyX29wZW4oQ1NlcmlhbExpbmUqIHNsKSB7CisgICAgcmV0dXJuIFNlcmlhbExpbmU6OkZ1bmNzOjpnZXQoKS0+b3BlbkJ1ZmZlcihhc0NsYXNzKHNsKSk7Cit9CisKK2ludCBhbmRyb2lkX3NlcmlhbGxpbmVfcGlwZV9vcGVuKENTZXJpYWxMaW5lKiogcDEsIENTZXJpYWxMaW5lKiogcDIpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6U2VyaWFsTGluZTo6RnVuY3M6OmdldCgpLT5vcGVuUGlwZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2VyaWFsTGluZSoqPihwMSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNlcmlhbExpbmUqKj4ocDIpKSA/IDAgOiAtMTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjVkMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBUaGlzIGlzIGEgQyB3cmFwcGVyIGZvciBhIHNlcmlhbCBsaW5lIGFic3RyYWN0aW9uLCBiYXNlZAorLy8gb24gUUVNVSdzIGNoYXJhY3RlciBkZXZpY2UgKGNoYXIuaCkKKy8vCisvLyBDU2VyaWFsTGluZSBhbGxvd3Mgb25lIHRvIHdyaXRlIGRhdGEgaW50byB0aGUgY29ubmVjdGlvbiBhbmQgc3VwcGx5IGEKKy8vIGNhbGxiYWNrIGZvciByZWFkaW5nLiBUbyBzZW5kIHNvbWUgZGF0YSwgY2FsbCBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUoKQorLy8gd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdyaXRlcyBhY2NlcHRlZCBieSB0aGUgc2VyaWFsIGxpbmUgKHdoaWNoIG1heQorLy8gYmUgbGVzcyB0aGFuIHdoYXQgaXMgYmVpbmcgc2VudCBpZiB0aGUgbGluZSBpcyBub3QgcmVhZHkpLiBJdCBpcyBwb3NzaWJsZQorLy8gdG8gY3JlYXRlIGEgYnVmZmVyZWQgc2VyaWFsIGxpbmUgd3JhcHBlciBieSBjYWxsaW5nCisvLyBhbmRyb2lkX3NlcmlhbGxpbmVfYnVmZmVyX29wZW4oKS4KKy8vCisvLyBXaGVuIHRoZXJlJ3Mgc29tZSBkYXRhIHRvIHJlYWQsIHRoZSBjYWxsYmFja3Mgc3VwcGxpZWQgaW4KKy8vIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycygpIHdpbGwgYmUgY2FsbGVkIGluIHRoaXMgb3JkZXI6CisvLyAgICBTTENhblJlYWRIYW5kbGVyKG9wYXF1ZSkKKy8vICAgIFNMUmVhZEhhbmRsZXIob3BhcXVlLCBkYXRhLCBsZW4pCisvLyB8b3BhcXVlfCBpcyB0aGUgdmFsdWUgcGFzc2VkIGluIHNlY29uZCBhcmd1bWVudCBvZgorLy8gYW5kcm9pZF9zZXJpYWxsaW5lX2FkZGhhbmRsZXJzKCkgLSBzb21lIHVzZXIgc3RhdGUgZm9yIHRoZSBjYWxsYmFja3MKKworLy8gTm90ZSB0aGF0IENTZXJpYWxMaW5lIGluc3RhbmNlcyBjYW4gb25seSBiZSBjcmVhdGVkL2Rlc3Ryb3llZCBmcm9tIFFFTVUKKy8vIGdsdWUgY29kZS4gRHVyaW5nIHVuaXQtdGVzdGluZywgYSBzcGVjaWFsIFRlc3RTZXJpYWxMaW5lIGltcGxlbWVudGF0aW9uCisvLyB3aWxsIGJlIHByb3ZpZGVkIGluc3RlYWQsIGJ1dCBpc24ndCBwYXJ0IG9mIEFuZHJvaWRFbXUgaXRzZWxmLgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBBIGhhbmRsZSB0byB0aGUgc2VyaWFsIGxpbmUgb2JqZWN0Cit0eXBlZGVmIHN0cnVjdCBDU2VyaWFsTGluZSB7fSBDU2VyaWFsTGluZTsKKworLy8gUmVhZCBjYWxsYmFja3MgZm9yIHRoZSBzZXJpYWwgbGluZQorCisvLyByZXR1cm4gYSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBoYW5kbGVyIGNhbiBjb25zdW1lIG5vdy4KK3R5cGVkZWYgaW50IFNMQ2FuUmVhZEhhbmRsZXIodm9pZCogb3BhcXVlKTsKKy8vIHJlYWQgdGhlIGRhdGEgLSB8c2l6ZXwgYnl0ZXMgZnJvbSBtZW1vcnkgYXQgfGJ1ZnwKK3R5cGVkZWYgdm9pZCBTTFJlYWRIYW5kbGVyKHZvaWQqIG9wYXF1ZSwgY29uc3QgdWludDhfdCogYnVmLCBpbnQgc2l6ZSk7CisKKy8vIHNldHMgcmVhZCBjYWxsYmFja3Mgb24gYSBzcGVjaWZpYyBzZXJpYWwgbGluZSBvYmplY3QuCisvLyB8b3BhcXVlfCBpcyBzb21lIHVzZXIgc3RhdGUgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MKK2V4dGVybiB2b2lkIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycyhDU2VyaWFsTGluZSogc2wsIHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTENhblJlYWRIYW5kbGVyKiBjYW5SZWFkQ2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xSZWFkSGFuZGxlciogcmVhZENhbGxiYWNrKTsKKworLy8gdHJ5IHRvIHNlbmQgfGxlbnwgYnl0ZXMgb2YgfGRhdGF8IHRocm91Z2ggdGhlIHNlcmlhbCBsaW5lLAorLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VudCB0aHJvdWdoLCBvciBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IKK2V4dGVybiBpbnQgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKENTZXJpYWxMaW5lKiBzbCwgY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbik7CisKKy8vIEdpdmVuIGFuIGV4aXN0aW5nIENTZXJpYWxMaW5lIGluc3RhbmNlIHxzbHwsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSB0aGF0CisvLyBpbXBsZW1lbnRzIGEgYnVmZmVyIGZvciBhbnkgZGF0YSBzZW50IHRvIHxzbHwuIE9uIHRoZSBvdGhlciBoYW5kLAorLy8gYW55IGNhbl9yZWFkKCkgLyByZWFkKCkgcmVxdWVzdCBwZXJmb3JtZWQgYnkgaXQgd2lsbCBiZSBwYXNzZWQKKy8vIGRpcmVjdGx5IHRvIHxzbHwncyBoYW5kbGVycy4KKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGJ5IEFuZHJvaWRFbXUgYW5kIG11c3QgYmUgcHJvdmlkZWQKKy8vIGJ5IHRoZSBRRU1VIGdsdWUgY29kZSwgb3IgdW5pdC10ZXN0IHJ1bnRpbWUuCitDU2VyaWFsTGluZSogYW5kcm9pZF9zZXJpYWxsaW5lX2J1ZmZlcl9vcGVuKENTZXJpYWxMaW5lKiBzbCk7CisKKy8vIENyZWF0ZSB0d28gbmV3IFNlcmlhbExpbmUgaW5zdGFuY2VzIHRoYXQgYXJlIGNvbm5lY3RlZCB0aHJvdWdoIGJ1ZmZlcnMKKy8vIGFzIGEgcGlwZS4gT24gc3VjY2VzcywgcmV0dXJuIDAgYW5kIHNldHMgfCpwZmlyc3R8IGFuZCB8KnBzZWNvbmR8IHRvCisvLyB0aGUgaW5zdGFuY2UgcG9pbnRlcnMuIE9uIGZhaWx1cmUsIHJldHVybiAtMSBhbmQgc2V0cyB8KnBmaXJzdHwgYW5kCisvLyB8KnBzZWNvbmR8IHRvIE5VTEwuCisvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBieSBBbmRyb2lkRW11IGFuZCBtdXN0IGJlIHByb3ZpZGVkCisvLyBieSB0aGUgUUVNVSBnbHVlIGNvZGUsIG9yIHVuaXQtdGVzdCBydW50aW1lLgoraW50IGFuZHJvaWRfc2VyaWFsbGluZV9waXBlX29wZW4oQ1NlcmlhbExpbmUqKiBwZmlyc3QsIENTZXJpYWxMaW5lKiogcHNlY29uZCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2I5ZmQyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL1NlcmlhbExpbmUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OlNlcmlhbExpbmU7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFRlc3RTZXJpYWxMaW5lIDogcHVibGljIFNlcmlhbExpbmUgeworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBhZGRIYW5kbGVycyh2b2lkKiBvcGFxdWUsIENhblJlYWRGdW5jIGNhblJlYWRGdW5jLCBSZWFkRnVuYyByZWFkRnVuYykgeworICAgICAgICArK2FkZEhhbmRsZXJzQ2FsbENvdW50OworCisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZE9wYXF1ZSwgb3BhcXVlKTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkQ2FuUmVhZEZ1bmMsIGNhblJlYWRGdW5jKTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkUmVhZEZ1bmMsIHJlYWRGdW5jKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCB3cml0ZShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CisgICAgICAgICsrd3JpdGVDYWxsQ291bnQ7CisKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkRGF0YSwgZGF0YSk7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZExlbiwgbGVuKTsKKworICAgICAgICByZXR1cm4gd3JpdGVSZXR1cm47CisgICAgfQorCisgICAgaW50IGFkZEhhbmRsZXJzQ2FsbENvdW50ID0gMDsKKyAgICBpbnQgd3JpdGVDYWxsQ291bnQgPSAwOworCisgICAgdm9pZCogZXhwZWN0ZWRPcGFxdWUgPSBudWxscHRyOworICAgIENhblJlYWRGdW5jIGV4cGVjdGVkQ2FuUmVhZEZ1bmMgPSBudWxscHRyOworICAgIFJlYWRGdW5jIGV4cGVjdGVkUmVhZEZ1bmMgPSBudWxscHRyOworCisgICAgY29uc3QgdWludDhfdCogZXhwZWN0ZWREYXRhID0gbnVsbHB0cjsKKyAgICBpbnQgZXhwZWN0ZWRMZW4gPSAwOworICAgIGludCB3cml0ZVJldHVybiA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChTZXJpYWxMaW5lLCB3cml0ZSkgeworICAgIFRlc3RTZXJpYWxMaW5lIHNsOworICAgIHNsLmV4cGVjdGVkTGVuID0gMTsKKyAgICB1aW50OF90IGRhdGE7CisgICAgc2wuZXhwZWN0ZWREYXRhID0gJmRhdGE7CisgICAgc2wud3JpdGVSZXR1cm4gPSAyOworCisgICAgY29uc3QgaW50IHJlcyA9IGFuZHJvaWRfc2VyaWFsbGluZV93cml0ZSgmc2wsICZkYXRhLCAxKTsKKworICAgIEVYUEVDVF9FUSgyLCByZXMpOworCisgICAgRVhQRUNUX0VRKDEsIHNsLndyaXRlQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMCwgc2wuYWRkSGFuZGxlcnNDYWxsQ291bnQpOworfQorCisvLyBzb21lIHRlc3QgY2FsbGJhY2tzCitzdGF0aWMgaW50IHRlc3RDYW5SZWFkKHZvaWQqKSB7CisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCB0ZXN0UmVhZCh2b2lkKiwgY29uc3QgdWludDhfdCosIGludCkgeworfQorCitURVNUKFNlcmlhbExpbmUsIGFkZEhhbmRsZXJzKSB7CisgICAgVGVzdFNlcmlhbExpbmUgc2w7CisgICAgaW50IGR1bW15OworICAgIHNsLmV4cGVjdGVkT3BhcXVlID0gJmR1bW15OworICAgIHNsLmV4cGVjdGVkQ2FuUmVhZEZ1bmMgPSAmdGVzdENhblJlYWQ7CisgICAgc2wuZXhwZWN0ZWRSZWFkRnVuYyA9ICZ0ZXN0UmVhZDsKKworICAgIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycygmc2wsICZkdW1teSwgdGVzdENhblJlYWQsIHRlc3RSZWFkKTsKKworICAgIEVYUEVDVF9FUSgxLCBzbC5hZGRIYW5kbGVyc0NhbGxDb3VudCk7CisgICAgRVhQRUNUX0VRKDAsIHNsLndyaXRlQ2FsbENvdW50KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0QW5kcm9pZFBpcGVEZXZpY2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi90ZXN0aW5nL1Rlc3RBbmRyb2lkUGlwZURldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ZDE2YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0QW5kcm9pZFBpcGVEZXZpY2UuY3BwCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3Rlc3RpbmcvVGVzdEFuZHJvaWRQaXBlRGV2aWNlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9BbmRyb2lkUGlwZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgVGVzdEd1ZXN0IDogcHVibGljIFRlc3RBbmRyb2lkUGlwZURldmljZTo6R3Vlc3QgeworcHVibGljOgorICAgIFRlc3RHdWVzdCgpIDogbUNsb3NlZCh0cnVlKSwgbVdha2VzKDB1KSwgbVBpcGUobnVsbHB0cikgeworICAgICAgICBtUGlwZSA9IGFuZHJvaWRfcGlwZV9ndWVzdF9vcGVuKHRoaXMpOworICAgICAgICBpZiAoIW1QaXBlKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgY3JlYXRlIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0QW5kcm9pZFBpcGVEZXZpY2U6Okd1ZXN0IGluc3RhbmNlISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5UZXN0R3Vlc3QoKSB7IGNsb3NlKCk7IH0KKworICAgIHZpcnR1YWwgaW50IGNvbm5lY3QoY29uc3QgY2hhciogbmFtZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnN0cmluZyBoYW5kc2hha2UoInBpcGU6Iik7CisgICAgICAgIGhhbmRzaGFrZSArPSBuYW1lOworICAgICAgICBpbnQgbGVuID0gc3RhdGljX2Nhc3Q8aW50PihoYW5kc2hha2Uuc2l6ZSgpKSArIDE7CisgICAgICAgIG1DbG9zZWQgPSBmYWxzZTsKKyAgICAgICAgaW50IHJldCA9IHdyaXRlKGhhbmRzaGFrZS5jX3N0cigpLCBsZW4pOworICAgICAgICBpZiAocmV0ICE9IGxlbikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IGNvbm5lY3QgdG8gc2VydmljZSAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiByZXQ9IiA8PCByZXQgPDwgIiBleHBlY3RlZCBsZW49IiA8PCBsZW47CisgICAgICAgICAgICBtQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgQW5kcm9pZFBpcGVCdWZmZXIgYnVmID0geyBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgbGVuIH07CisgICAgICAgIHJldHVybiBhbmRyb2lkX3BpcGVfZ3Vlc3RfcmVjdihtUGlwZSwgJmJ1ZiwgMSk7CisgICAgfQorCisgICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgQW5kcm9pZFBpcGVCdWZmZXIgYnVmID0geworICAgICAgICAgICAgICAgICh1aW50OF90KilidWZmZXIsIGxlbiB9OworICAgICAgICByZXR1cm4gYW5kcm9pZF9waXBlX2d1ZXN0X3NlbmQobVBpcGUsICZidWYsIDEpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKCFtQ2xvc2VkKSB7CisgICAgICAgICAgICBtQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGFuZHJvaWRfcGlwZV9ndWVzdF9jbG9zZShtUGlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIHBvbGwoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ2xvc2VkKSB7CisgICAgICAgICAgICByZXR1cm4gUElQRV9QT0xMX0hVUDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5kcm9pZF9waXBlX2d1ZXN0X3BvbGwobVBpcGUpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCogZ2V0UGlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1QaXBlOyB9CisKKyAgICB2b2lkIHJlc2V0UGlwZSh2b2lkKiBpbnRlcm5hbF9waXBlKSB7CisgICAgICAgIG1QaXBlID0gaW50ZXJuYWxfcGlwZTsKKyAgICB9CisKKyAgICB2b2lkIGNsb3NlRnJvbUhvc3QoKSB7CisgICAgICAgIG1DbG9zZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQgc2lnbmFsV2FrZShpbnQgd2FrZXMpIHsKKyAgICAgICAgLy8gTk9URTogVXBkYXRlIHRoZSBmbGFncywgYnV0IGZvciBub3cgZG9uJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgLy8gICAgICAgYWJvdXQgdGhlbS4KKyAgICAgICAgbVdha2VzIHw9IHdha2VzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1DbG9zZWQ7CisgICAgdW5zaWduZWQgbVdha2VzOworICAgIHZvaWQqIG1QaXBlOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1Rlc3RBbmRyb2lkUGlwZURldmljZTo6VGVzdEFuZHJvaWRQaXBlRGV2aWNlKCkKKyAgICAgICAgOiBtT2xkSHdGdW5jcyhhbmRyb2lkX3BpcGVfc2V0X2h3X2Z1bmNzKCZzSHdGdW5jcykpIHsKKyAgICBBbmRyb2lkUGlwZTo6U2VydmljZTo6cmVzZXRBbGwoKTsKKyAgICBBbmRyb2lkUGlwZTo6aW5pdFRocmVhZGluZygmbVZtTG9jayk7CisgICAgbVZtTG9jay5sb2NrKCk7Cit9CisKK1Rlc3RBbmRyb2lkUGlwZURldmljZTo6flRlc3RBbmRyb2lkUGlwZURldmljZSgpIHsKKyAgICBhbmRyb2lkX3BpcGVfc2V0X2h3X2Z1bmNzKG1PbGRId0Z1bmNzKTsKKyAgICBBbmRyb2lkUGlwZTo6U2VydmljZTo6cmVzZXRBbGwoKTsKKyAgICBtVm1Mb2NrLnVubG9jaygpOworfQorCisvLyBzdGF0aWMKK2NvbnN0IEFuZHJvaWRQaXBlSHdGdW5jcyBUZXN0QW5kcm9pZFBpcGVEZXZpY2U6OnNId0Z1bmNzID0geworICAgICZUZXN0QW5kcm9pZFBpcGVEZXZpY2U6OnJlc2V0UGlwZSwKKyAgICAmVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpjbG9zZUZyb21Ib3N0LAorICAgICZUZXN0QW5kcm9pZFBpcGVEZXZpY2U6OnNpZ25hbFdha2UsCit9OworCisvLyBzdGF0aWMKK3ZvaWQgVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpyZXNldFBpcGUodm9pZCogaHdwaXBlLCB2b2lkKiBpbnRlcm5hbF9waXBlKSB7CisgICAgc3RhdGljX2Nhc3Q8VGVzdEd1ZXN0Kj4oaHdwaXBlKS0+cmVzZXRQaXBlKGludGVybmFsX3BpcGUpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpjbG9zZUZyb21Ib3N0KHZvaWQqIGh3cGlwZSkgeworICAgIHN0YXRpY19jYXN0PFRlc3RHdWVzdCo+KGh3cGlwZSktPmNsb3NlRnJvbUhvc3QoKTsKK30KKworLy8gc3RhdGljCit2b2lkIFRlc3RBbmRyb2lkUGlwZURldmljZTo6c2lnbmFsV2FrZSh2b2lkKiBod3BpcGUsIHVuc2lnbmVkIHdha2VzKSB7CisgICAgc3RhdGljX2Nhc3Q8VGVzdEd1ZXN0Kj4oaHdwaXBlKS0+c2lnbmFsV2FrZSh3YWtlcyk7Cit9CisKKy8vIHN0YXRpYworVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpHdWVzdCogVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpHdWVzdDo6Y3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgVGVzdEd1ZXN0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3Rlc3RpbmcvVGVzdEFuZHJvaWRQaXBlRGV2aWNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0aW9uL3Rlc3RpbmcvVGVzdEFuZHJvaWRQaXBlRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4NTY5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0QW5kcm9pZFBpcGVEZXZpY2UuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfZGV2aWNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0Vm1Mb2NrLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBhIHRlc3QgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBwaXBlIHZpcnR1YWwgZGV2aWNlLAorLy8gaW4gb3JkZXIgdG8gdGVzdCB0aGUgY29kZSBpbiBhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGUuYy4KKy8vIFVzYWdlIGlzOgorLy8gIDEpIENyZWF0ZSBhIG5ldyBUZXN0QW5kcm9pZFBpcGVEZXZpY2UgaW5zdGFuY2UuCisvLworLy8gIDIpIEZvciBlYWNoIGd1ZXN0IGNsaWVudCB5b3Ugd2FudCB0byBzaW11bGF0ZSwgY3JlYXRlIGEgbmV3CisvLyAgICAgVGVzdEFuZHJvaWRQaXBlRGV2aWNlOjpHdWVzdCBpbnN0YW5jZSwgdGhlbiBjYWxsIGl0cyBjb25uZWN0KCkKKy8vICAgICB0byB0cnkgdG8gY29ubmVjdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGhvc3Qgc2VydmljZS4gSW4gY2FzZQorLy8gICAgIG9mIHN1Y2Nlc3MsIHVzZSBpdHMgcmVhZCgpIGFuZCB3cml0ZSgpIG1ldGhvZHMuCisvLworY2xhc3MgVGVzdEFuZHJvaWRQaXBlRGV2aWNlIHsKK3B1YmxpYzoKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLCB0aGlzIHJlZ2lzdGVycyB0aGUgZGV2aWNlIGJ5IGNhbGxpbmcKKyAgICAvLyBhbmRyb2lkX3BpcGVfc2V0X2h3X2Z1bmNzKCkKKyAgICBUZXN0QW5kcm9pZFBpcGVEZXZpY2UoKTsKKworICAgIC8vIERlc3RydWN0b3IsIHRoaXMgY2FsbHMgYW5kcm9pZF9waXBlX3NldF9od19mdW5jcygpIHRvIHJlc2V0CisgICAgLy8gYW5kcm9pZF9waXBlLmMgdG8gaXRzIHByZXZpb3VzIHN0YXRlLgorICAgIH5UZXN0QW5kcm9pZFBpcGVEZXZpY2UoKTsKKworICAgIGNsYXNzIEd1ZXN0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8vIENyZWF0ZSBuZXcgR3Vlc3QgaW5zdGFuY2UuCisgICAgICAgIHN0YXRpYyBHdWVzdCogY3JlYXRlKCk7CisKKyAgICAgICAgLy8gRGVzdHJ1Y3RvciwgY2xvc2VzIHRoZSBjb25uZWN0aW9uLCBpZiBhbnkuCisgICAgICAgIHZpcnR1YWwgfkd1ZXN0KCkge30KKworICAgICAgICAvLyBUcnkgdG8gY29ubmVjdCB0byBhIG5hbWVkIHNlcnZpY2UuIHxuYW1lfCBjYW4gYmUKKyAgICAgICAgLy8gZWl0aGVyIDxzZXJ2aWNlPiBvciA8c2VydmljZT46PGFyZ3M+LiBSZXR1cm5zIDAgb24KKyAgICAgICAgLy8gc3VjY2Vzcywgb3IgLWVycm5vIG9uIGZhaWx1cmUuCisgICAgICAgIHZpcnR1YWwgaW50IGNvbm5lY3QoY29uc3QgY2hhciogbmFtZSkgPSAwOworCisgICAgICAgIC8vIFRyeSB0byByZWFkIGRhdGEgZnJvbSB0aGUgaG9zdCBzZXJ2aWNlLiBSZXR1cm4gdGhlCisgICAgICAgIC8vIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcmVkLiAwIGZvciBFT0YsIGFuZCAtZXJybm8gZm9yCisgICAgICAgIC8vIGkvbyBlcnJvci4KKyAgICAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuKSA9IDA7CisKKyAgICAgICAgLy8gVHJ5IHRvIHdyaXRlIGRhdGEgdG8gdGhlIGhvc3Qgc2VydmljZS4gUmV0dXJuIHRoZQorICAgICAgICAvLyBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJlZC4gMCBmb3IgRU9GLCBhbmQgLWVycm5vCisgICAgICAgIC8vIGZvciBpL28gZXJyb3IuCisgICAgICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pID0gMDsKKworICAgICAgICAvLyBGb3JjZS1jbG9zZSB0aGUgY29ubmVjdGlvbiBmcm9tIHRoZSBndWVzdC4KKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOworCisgICAgICAgIC8vIFBvbGwgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGd1ZXN0IGNvbm5lY3Rpb24uCisgICAgICAgIC8vIFJldHVybnMgYSBjb21iaW5hdGlvbiBvZiBQSVBFX1BPTExfSU4gYW5kIFBJUEVfUE9MTF9PVVQKKyAgICAgICAgLy8gZmxhZ3MuCisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgcG9sbCgpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIEFuZHJvaWRQaXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGd1ZXN0LgorICAgICAgICB2aXJ0dWFsIHZvaWQqIGdldFBpcGUoKSBjb25zdCA9IDA7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgICAgIEd1ZXN0KCkge30KKyAgICB9OworCitwcml2YXRlOgorICAgIC8vIEFuZHJvaWRQaXBlSHdGdW5jcyBjYWxsYmFja3MuCisgICAgc3RhdGljIHZvaWQgY2xvc2VGcm9tSG9zdCh2b2lkKiBod3BpcGUpOworICAgIHN0YXRpYyB2b2lkIHNpZ25hbFdha2Uodm9pZCogaHdwaXBlLCB1bnNpZ25lZCB3YWtlcyk7CisgICAgc3RhdGljIHZvaWQgcmVzZXRQaXBlKHZvaWQqIGh3cGlwZSwgdm9pZCogaW50ZXJuYWxfcGlwZSk7CisKKyAgICBzdGF0aWMgY29uc3QgQW5kcm9pZFBpcGVId0Z1bmNzIHNId0Z1bmNzOworCisgICAgVGVzdFZtTG9jayBtVm1Mb2NrOworICAgIGNvbnN0IEFuZHJvaWRQaXBlSHdGdW5jcyogbU9sZEh3RnVuY3M7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdGlvbi90ZXN0aW5nL1Rlc3RWbUxvY2suaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0Vm1Mb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlZjJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRpb24vdGVzdGluZy9UZXN0Vm1Mb2NrLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9WbUxvY2suaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBUZXN0Vm1Mb2NrIDogcHVibGljIFZtTG9jayB7CitwdWJsaWM6CisgICAgVGVzdFZtTG9jaygpIDogbU9sZFZtTG9jayhWbUxvY2s6OnNldCh0aGlzKSksIG1JbnN0YWxsZWQodHJ1ZSkge30KKworICAgIH5UZXN0Vm1Mb2NrKCkgeyByZWxlYXNlKCk7IH0KKworICAgIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1JbnN0YWxsZWQpIHsKKyAgICAgICAgICAgIC8vIE5PVEU6IEEgdmFsdWUgb2YgbnVsbHB0ciBmb3IgbU9sZFZtTG9jayBpcyB2YWxpZC4KKyAgICAgICAgICAgIFZtTG9jazo6c2V0KG1PbGRWbUxvY2spOworICAgICAgICAgICAgbUluc3RhbGxlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGxvY2soKSBvdmVycmlkZSB7IG1Mb2NrQ291bnQrKzsgfQorICAgIHZpcnR1YWwgdm9pZCB1bmxvY2soKSBvdmVycmlkZSB7IG1VbmxvY2tDb3VudCsrOyB9CisgICAgdmlydHVhbCBib29sIGlzTG9ja2VkQnlTZWxmKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2tDb3VudCA+IG1VbmxvY2tDb3VudDsKKyAgICB9CisKKyAgICBpbnQgbUxvY2tDb3VudCA9IDA7CisgICAgaW50IG1VbmxvY2tDb3VudCA9IDA7CisgICAgVm1Mb2NrKiBtT2xkVm1Mb2NrID0gbnVsbHB0cjsKKyAgICBib29sIG1JbnN0YWxsZWQgPSBmYWxzZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRvci13aW5kb3cuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lbXVsYXRvci13aW5kb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjFkNWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5jCkBAIC0wLDAgKzEsNDQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9hbmRyb2lkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC91c2VyX2V2ZW50X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ3B1X2ZyYW1lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ody1jb250cm9sLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ody1zZW5zb3JzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvc2V0LXVpLWVtdS1hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi93aW5zeXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VpLWVtdS1hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L21vZGVtX2RyaXZlci5oIgorCisKKyNkZWZpbmUgIEQoLi4uKSAgZG8geyAgaWYgKFZFUkJPU0VfQ0hFQ0soaW5pdCkpIGRwcmludChfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisKKy8qIEVtdWxhdG9yV2luZG93IHN0cnVjdHVyZSBpbnN0YW5jZS4gKi8KK3N0YXRpYyBFbXVsYXRvcldpbmRvdyAgIHFlbXVsYXRvclsxXTsKKworLy8gT3VyIHZlcnkgb3duIHN0YXNoIG9mIGEgcG9pbnRlciB0byBhIGRldmljZSB0aGF0IGhhbmRsZXMgdXNlciBldmVudHMuCitjb25zdCBRQW5kcm9pZFVzZXJFdmVudEFnZW50KiB1c2VyX2V2ZW50X2FnZW50OworCisvLyBTZXQgdG8gMSB0byB1c2UgYW4gRW11R0wgc3ViLXdpbmRvdyB0byBkaXNwbGF5IEdwVSBjb250ZW50LCBvciAwIHRvIHVzZQorLy8gdGhlIGZyYW1lIHBvc3QgY2FsbGJhY2sgdG8gcmV0cmlldmUgZXZlcnkgZnJhbWUgZnJvbSB0aGUgR1BVLCB3aGljaCB3aWxsCisvLyBiZSBzbG93ZXIsIGV4Y2VwdCBmb3Igc29mdHdhcmUtYmFzZWQgcmVuZGVyZXJzLgorc3RhdGljIGJvb2wgc191c2VfZW11Z2xfc3Vid2luZG93ID0gMTsKKworc3RhdGljIHZvaWQgZW11bGF0b3Jfd2luZG93X3JlZnJlc2goRW11bGF0b3JXaW5kb3cqIGVtdWxhdG9yKTsKK2V4dGVybiB2b2lkIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3Qodm9pZCk7CisKK3N0YXRpYyB2b2lkIHdyaXRlX3dpbmRvd19uYW1lKGNoYXIqIGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXZkX25hbWUpIHsKKyAgICBzbnByaW50ZihidWZmLCBidWZmX2xlbiwgIkFuZHJvaWQgRW11bGF0b3IgLSAlczolZCIsIGF2ZF9uYW1lLCBiYXNlX3BvcnQpOworfQorCisKK3N0YXRpYyB2b2lkCitlbXVsYXRvcl93aW5kb3dfbGlnaHRfYnJpZ2h0bmVzcyh2b2lkKiBvcGFxdWUsIGNvbnN0IGNoYXIqICBsaWdodCwgaW50ICB2YWx1ZSkKK3sKKyAgICBFbXVsYXRvcldpbmRvdyogIGVtdWxhdG9yID0gb3BhcXVlOworCisgICAgVkVSQk9TRV9QUklOVChod19jb250cm9sLCIlczogbGlnaHQ9JyVzJyB2YWx1ZT0lZCB1aT0lcCIsIF9fRlVOQ1RJT05fXywgbGlnaHQsIHZhbHVlLCBlbXVsYXRvci0+dWkpOworCisgICAgaWYgKCFzdHJjbXAobGlnaHQsICJsY2RfYmFja2xpZ2h0IikpIHsKKyAgICAgICAgc2tpbl91aV9zZXRfbGNkX2JyaWdodG5lc3MoZW11bGF0b3ItPnVpLCB2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdG9yX3dpbmRvd190cmFja2JhbGxfZXZlbnQoaW50IGR4LCBpbnQgZHkpIHsKKyAgICB1c2VyX2V2ZW50X2FnZW50LT5zZW5kTW91c2VFdmVudChkeCwgZHksIDEsIDApOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRvcl93aW5kb3dfd2luZG93X2tleV9ldmVudCh1bnNpZ25lZCBrZXljb2RlLCBpbnQgZG93bikgeworICAgIHVzZXJfZXZlbnRfYWdlbnQtPnNlbmRLZXkoa2V5Y29kZSwgZG93bik7Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdG9yX3dpbmRvd19rZXljb2Rlc19ldmVudChpbnQqIGtleWNvZGVzLCBpbnQgY291bnQpIHsKKyAgICB1c2VyX2V2ZW50X2FnZW50LT5zZW5kS2V5Q29kZXMoa2V5Y29kZXMsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgZW11bGF0b3Jfd2luZG93X3dpbmRvd19tb3VzZV9ldmVudCh1bnNpZ25lZCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdGF0ZSkgeworICAgIC8qIE5PVEU6IHRoZSAwIGlzIHVzZWQgaW4gaHcvYW5kcm9pZC9nb2xkZmlzaC9ldmVudHNfZGV2aWNlLmMgdG8KKyAgICAgKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSB0b3VjaC1zY3JlZW4gYW5kIGEgdHJhY2tiYWxsIGV2ZW50CisgICAgICovCisgICAgdXNlcl9ldmVudF9hZ2VudC0+c2VuZE1vdXNlRXZlbnQoeCwgeSwgMCwgc3RhdGUpOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRvcl93aW5kb3dfc2V0X2RldmljZV9vcmllbnRhdGlvbihTa2luUm90YXRpb24gcm90YXRpb24pIHsKKyAgICBhbmRyb2lkX3NlbnNvcnNfc2V0X2NvYXJzZV9vcmllbnRhdGlvbigoQW5kcm9pZENvYXJzZU9yaWVudGF0aW9uKSByb3RhdGlvbik7Cit9CisKK3N0YXRpYyBib29sIGVtdWxhdG9yX3dpbmRvd19uZXR3b3JrX3RvZ2dsZSh2b2lkKSB7CisgICAgYW5kcm9pZF9uZXRfZGlzYWJsZSA9ICFhbmRyb2lkX25ldF9kaXNhYmxlOworICAgIGlmIChhbmRyb2lkX21vZGVtKSB7CisgICAgICAgIGFtb2RlbV9zZXRfZGF0YV9yZWdpc3RyYXRpb24oCisgICAgICAgICAgICAgICAgYW5kcm9pZF9tb2RlbSwKKyAgICAgICAgYW5kcm9pZF9uZXRfZGlzYWJsZSA/IEFfUkVHSVNUUkFUSU9OX1VOUkVHSVNURVJFRAorICAgICAgICAgICAgOiBBX1JFR0lTVFJBVElPTl9IT01FKTsKKyAgICB9CisgICAgcmV0dXJuICFhbmRyb2lkX25ldF9kaXNhYmxlOworfQorCitzdGF0aWMgdm9pZCBlbXVsYXRvcl93aW5kb3dfZnJhbWVidWZmZXJfaW52YWxpZGF0ZSh2b2lkKSB7CisgICAgcWZyYW1lYnVmZmVyX2ludmFsaWRhdGVfYWxsKCk7CisgICAgcWZyYW1lYnVmZmVyX2NoZWNrX3VwZGF0ZXMoKTsKK30KKworc3RhdGljIHZvaWQgZW11bGF0b3Jfd2luZG93X2tleWJvYXJkX2V2ZW50KHZvaWQqIG9wYXF1ZSwgU2tpbktleUNvZGUga2V5Y29kZSwgaW50IGRvd24pIHsKKyAgICAodm9pZClvcGFxdWU7CisgICAgdXNlcl9ldmVudF9hZ2VudC0+c2VuZEtleShrZXljb2RlLCBkb3duKTsKK30KKworc3RhdGljIGludCBlbXVsYXRvcl93aW5kb3dfb3BlbmdsZXNfc2hvd193aW5kb3coCisgICAgdm9pZCogd2luZG93LCBpbnQgeCwgaW50IHksIGludCB2dywgaW50IHZoLCBpbnQgdywgaW50IGgsIGZsb2F0IGRwciwgZmxvYXQgcm90YXRpb24pIHsKKyAgICBpZiAoc191c2VfZW11Z2xfc3Vid2luZG93KSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkX3Nob3dPcGVuZ2xlc1dpbmRvdyh3aW5kb3csIHgsIHksIHZ3LCB2aCwgdywgaCwgZHByLCByb3RhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGVtdWxhdG9yX3dpbmRvd19vcGVuZ2xlc19oaWRlX3dpbmRvdyh2b2lkKSB7CisgICAgaWYgKHNfdXNlX2VtdWdsX3N1YndpbmRvdykgeworICAgICAgICByZXR1cm4gYW5kcm9pZF9oaWRlT3BlbmdsZXNXaW5kb3coKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdG9yX3dpbmRvd19vcGVuZ2xlc19zZXRfdHJhbnNsYXRpb24oZmxvYXQgZHgsIGZsb2F0IGR5KSB7CisgICAgaWYgKHNfdXNlX2VtdWdsX3N1YndpbmRvdykgeworICAgICAgICBhbmRyb2lkX3NldE9wZW5nbGVzVHJhbnNsYXRpb24oZHgsIGR5KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdG9yX3dpbmRvd19vcGVuZ2xlc19yZWRyYXdfd2luZG93KHZvaWQpIHsKKyAgICBpZiAoc191c2VfZW11Z2xfc3Vid2luZG93KSB7CisgICAgICAgIGFuZHJvaWRfcmVkcmF3T3BlbmdsZXNXaW5kb3coKTsKKyAgICB9Cit9CisKKy8vIFVzZWQgYXMgYW4gZW11Z2wgY2FsbGJhY2sgdG8gZ2V0IGVhY2ggZnJhbWUgb2YgR1BVIGRpc3BsYXkuCitzdGF0aWMgdm9pZCBfZW11bGF0b3Jfd2luZG93X29uX2dwdV9mcmFtZSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBpeGVscykgeworICAgIEVtdWxhdG9yV2luZG93KiBlbXVsYXRvciA9IChFbXVsYXRvcldpbmRvdyopY29udGV4dDsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFuIEVtdUdMIHRocmVhZCwgd2hpY2ggY2Fubm90CisgICAgLy8gY2FsbCB0aGUgc2tpbl91aV91cGRhdGVfZ3B1X2ZyYW1lKCkgZnVuY3Rpb24uIENyZWF0ZSBhIEdwdUZyYW1lCisgICAgLy8gaW5zdGFuY2UsIGFuZCBzZW5kIGl0cyBhZGRyZXNzIGludG8gdGhlIHBpcGUuCisgICAgc2tpbl91aV91cGRhdGVfZ3B1X2ZyYW1lKGVtdWxhdG9yLT51aSwgd2lkdGgsIGhlaWdodCwgcGl4ZWxzKTsKK30KKworc3RhdGljIHZvaWQKK2VtdWxhdG9yX3dpbmRvd19zZXR1cCggRW11bGF0b3JXaW5kb3cqICBlbXVsYXRvciApCit7CisgICAgdXNlcl9ldmVudF9hZ2VudCA9IGVtdWxhdG9yLT51aUVtdUFnZW50LT51c2VyRXZlbnRzOworCisgICAgc3RhdGljIGNvbnN0IFNraW5XaW5kb3dGdW5jcyBteV93aW5kb3dfZnVuY3MgPSB7CisgICAgICAgIC5rZXlfZXZlbnQgPSAmZW11bGF0b3Jfd2luZG93X3dpbmRvd19rZXlfZXZlbnQsCisgICAgICAgIC5tb3VzZV9ldmVudCA9ICZlbXVsYXRvcl93aW5kb3dfd2luZG93X21vdXNlX2V2ZW50LAorICAgICAgICAuc2V0X2RldmljZV9vcmllbnRhdGlvbiA9ICZlbXVsYXRvcl93aW5kb3dfc2V0X2RldmljZV9vcmllbnRhdGlvbiwKKyAgICAgICAgLm9wZW5nbGVzX3Nob3cgPSAmZW11bGF0b3Jfd2luZG93X29wZW5nbGVzX3Nob3dfd2luZG93LAorICAgICAgICAub3BlbmdsZXNfaGlkZSA9ICZlbXVsYXRvcl93aW5kb3dfb3BlbmdsZXNfaGlkZV93aW5kb3csCisgICAgICAgIC5vcGVuZ2xlc19zZXRUcmFuc2xhdGlvbiA9ICZlbXVsYXRvcl93aW5kb3dfb3BlbmdsZXNfc2V0X3RyYW5zbGF0aW9uLAorICAgICAgICAub3BlbmdsZXNfcmVkcmF3ID0gJmVtdWxhdG9yX3dpbmRvd19vcGVuZ2xlc19yZWRyYXdfd2luZG93LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgU2tpblRyYWNrQmFsbFBhcmFtZXRlcnMgbXlfdHJhY2tiYWxsX3BhcmFtcyA9IHsKKyAgICAgICAgLmRpYW1ldGVyID0gNjAsCisgICAgICAgIC5yaW5nID0gNCwKKyAgICAgICAgLmJhbGxfY29sb3IgPSAweGZmZTBlMGUwLAorICAgICAgICAuZG90X2NvbG9yID0gMHhmZjIwMjAyMCwKKyAgICAgICAgLnJpbmdfY29sb3IgPSAweGZmMDAwMDAwLAorICAgICAgICAuZXZlbnRfZnVuYyA9ICZlbXVsYXRvcl93aW5kb3dfdHJhY2tiYWxsX2V2ZW50LAorICAgIH07CisKKyAgICBpZiAoZW11bGF0b3ItPm9wdHMtPm5vX3dpbmRvdyB8fCBlbXVsYXRvci0+dWkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChlbXVsYXRvci0+b3B0cy0+c2NhbGUpIHsKKyAgICAgICAgZHdhcm5pbmcoIlRoZSAtc2NhbGUgZmxhZyBpcyBvYnNvbGV0ZSBhbmQgd2lsbCBiZSBpZ25vcmVkLiIpOworICAgIH0KKworICAgIGlmIChlbXVsYXRvci0+b3B0cy0+ZHBpX2RldmljZSkgeworICAgICAgICBkd2FybmluZygiVGhlIC1kcGktZGV2aWNlIGZsYWcgaXMgb2Jzb2xldGUgYW5kIHdpbGwgYmUgaWdub3JlZC4iKTsKKyAgICB9CisKKyAgICBTa2luVUlQYXJhbXMgbXlfdWlfcGFyYW1zID0geworICAgICAgICAuZW5hYmxlX3RvdWNoID0gIWFuZHJvaWRId0NvbmZpZ19pc1NjcmVlbk5vVG91Y2goYW5kcm9pZF9odyksCisgICAgICAgIC5lbmFibGVfZHBhZCA9IGFuZHJvaWRfaHctPmh3X2RQYWQgIT0gMCwKKyAgICAgICAgLmVuYWJsZV9rZXlib2FyZCA9IGFuZHJvaWRfaHctPmh3X2tleWJvYXJkICE9IDAsCisgICAgICAgIC5lbmFibGVfdHJhY2tiYWxsID0gYW5kcm9pZF9ody0+aHdfdHJhY2tCYWxsICE9IDAsCisgICAgICAgIC5lbmFibGVfc2NhbGUgPSAhZW11bGF0b3ItPm9wdHMtPmZpeGVkX3NjYWxlLAorCisgICAgICAgIC53aW5kb3dfeCA9IGVtdWxhdG9yLT53aW5feCwKKyAgICAgICAgLndpbmRvd195ID0gZW11bGF0b3ItPndpbl95LAorCisgICAgICAgIC5rZXlib2FyZF9jaGFybWFwID0gZW11bGF0b3ItPm9wdHMtPmNoYXJtYXAKKyAgICB9OworCisgICAgd3JpdGVfd2luZG93X25hbWUobXlfdWlfcGFyYW1zLndpbmRvd19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihteV91aV9wYXJhbXMud2luZG93X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfYmFzZV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGF2ZEluZm9fZ2V0TmFtZShhbmRyb2lkX2F2ZEluZm8pKTsKKworICAgIHN0YXRpYyBjb25zdCBTa2luVUlGdW5jcyBteV91aV9mdW5jcyA9IHsKKyAgICAgICAgICAgIC53aW5kb3dfZnVuY3MgPSAmbXlfd2luZG93X2Z1bmNzLAorICAgICAgICAgICAgLnRyYWNrYmFsbF9wYXJhbXMgPSAmbXlfdHJhY2tiYWxsX3BhcmFtcywKKyAgICAgICAgICAgIC5rZXlib2FyZF9ldmVudCA9ICZlbXVsYXRvcl93aW5kb3dfa2V5Ym9hcmRfZXZlbnQsCisgICAgICAgICAgICAua2V5Ym9hcmRfZmx1c2ggPSAmZW11bGF0b3Jfd2luZG93X2tleWNvZGVzX2V2ZW50LAorICAgICAgICAgICAgLm5ldHdvcmtfdG9nZ2xlID0gJmVtdWxhdG9yX3dpbmRvd19uZXR3b3JrX3RvZ2dsZSwKKyAgICAgICAgICAgIC5mcmFtZWJ1ZmZlcl9pbnZhbGlkYXRlID0gJmVtdWxhdG9yX3dpbmRvd19mcmFtZWJ1ZmZlcl9pbnZhbGlkYXRlLAorICAgIH07CisKKyAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0byB1c2UgYW4gRW11R0wgc3ViLXdpbmRvdyBvciBub3QuCisgICAgY29uc3QgY2hhciogZW52ID0gZ2V0ZW52KCJBTkRST0lEX0dMX1NPRlRXQVJFX1JFTkRFUkVSIik7CisgICAgc191c2VfZW11Z2xfc3Vid2luZG93ID0gIWVudiB8fCAhZW52WzBdIHx8IGVudlswXSA9PSAnMCc7CisgICAgLy8gZm9yIGdwdSBvZmYgb3IgZ3B1IGd1ZXN0LCB3ZSBkb24ndCB1c2UgdGhlIHN1YndpbmRvdworICAgIGlmICghYW5kcm9pZF9ody0+aHdfZ3B1X2VuYWJsZWQgfHwgIXN0cmNtcChhbmRyb2lkX2h3LT5od19ncHVfbW9kZSwgImd1ZXN0IikpIHsKKyAgICAgICAgc191c2VfZW11Z2xfc3Vid2luZG93ID0gMDsKKyAgICB9CisKKworICAgIGlmIChzX3VzZV9lbXVnbF9zdWJ3aW5kb3cpIHsKKyAgICAgICAgVkVSQk9TRV9QUklOVChnbGVzLCAiVXNpbmcgRW11R0wgc3ViLXdpbmRvdyBmb3IgR1BVIGRpc3BsYXkiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBWRVJCT1NFX1BSSU5UKGdsZXMsICJVc2luZyBnbFJlYWRQaXhlbHMoKSBmb3IgR1BVIGRpc3BsYXkiKTsKKyAgICB9CisKKyAgICBlbXVsYXRvci0+dWkgPSBza2luX3VpX2NyZWF0ZSgKKyAgICAgICAgICAgIGVtdWxhdG9yLT5sYXlvdXRfZmlsZSwgYW5kcm9pZF9ody0+aHdfaW5pdGlhbE9yaWVudGF0aW9uLAorICAgICAgICAgICAgJm15X3VpX2Z1bmNzLCAmbXlfdWlfcGFyYW1zLCBzX3VzZV9lbXVnbF9zdWJ3aW5kb3cpOworICAgIGlmICghZW11bGF0b3ItPnVpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZW11bGF0b3ItPm9uaW9uKSB7CisgICAgICAgIHNraW5fdWlfc2V0X29uaW9uKGVtdWxhdG9yLT51aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3ItPm9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvci0+b25pb25fcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yLT5vbmlvbl9hbHBoYSk7CisgICAgfQorCisgICAgc2V0VWlFbXVBZ2VudChlbXVsYXRvci0+dWlFbXVBZ2VudCk7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB0byB1c2UgYW4gRW11R0wgc3ViLXdpbmRvdyBvciBub3QuCisgICAgaWYgKCFzX3VzZV9lbXVnbF9zdWJ3aW5kb3cpIHsKKyAgICAgICAgZ3B1X2ZyYW1lX3NldF9wb3N0X2NhbGxiYWNrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VtdWxhdG9yX3dpbmRvd19vbl9ncHVfZnJhbWUpOworICAgIH0KKworICAgIHNraW5fdWlfcmVzZXRfdGl0bGUoZW11bGF0b3ItPnVpKTsKK30KKworc3RhdGljIHZvaWQKK2VtdWxhdG9yX3dpbmRvd19mYl91cGRhdGUoIHZvaWQqICAgX2VtdWxhdG9yLCBpbnQgIHgsIGludCAgeSwgaW50ICB3LCBpbnQgIGggKQoreworICAgIEVtdWxhdG9yV2luZG93KiAgZW11bGF0b3IgPSBfZW11bGF0b3I7CisKKyAgICBpZiAoZW11bGF0b3ItPm9wdHMtPm5vX3dpbmRvdykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFlbXVsYXRvci0+dWkpIHsKKyAgICAgICAgZW11bGF0b3Jfd2luZG93X3NldHVwKGVtdWxhdG9yKTsKKyAgICB9CisKKyAgICBpZiAoIXNfdXNlX2VtdWdsX3N1YndpbmRvdykgeworICAgICAgICBza2luX3VpX3VwZGF0ZV9kaXNwbGF5KGVtdWxhdG9yLT51aSwgeCwgeSwgdywgaCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZW11bGF0b3Jfd2luZG93X2ZiX3JvdGF0ZSggdm9pZCogIF9lbXVsYXRvciwgaW50ICByb3RhdGlvbiApCit7CisgICAgRW11bGF0b3JXaW5kb3cqICBlbXVsYXRvciA9IF9lbXVsYXRvcjsKKworICAgIGVtdWxhdG9yX3dpbmRvd19zZXR1cCggZW11bGF0b3IgKTsKK30KKworc3RhdGljIHZvaWQKK2VtdWxhdG9yX3dpbmRvd19mYl9wb2xsKCB2b2lkKiBfZW11bGF0b3IgKQoreworICAgIEVtdWxhdG9yV2luZG93KiBlbXVsYXRvciA9IF9lbXVsYXRvcjsKKyAgICBlbXVsYXRvcl93aW5kb3dfcmVmcmVzaChlbXVsYXRvcik7Cit9CisKK0VtdWxhdG9yV2luZG93KgorZW11bGF0b3Jfd2luZG93X2dldCh2b2lkKQoreworICAgIHJldHVybiBxZW11bGF0b3I7Cit9CisKK3N0YXRpYyB2b2lkIGVtdWxhdG9yX3dpbmRvd19mcmFtZWJ1ZmZlcl9mcmVlKHZvaWQqIG9wYXF1ZSkgeworICAgIFFGcmFtZUJ1ZmZlciogZmIgPSBvcGFxdWU7CisKKyAgICBxZnJhbWVidWZmZXJfZG9uZShmYik7CisgICAgZnJlZShmYik7Cit9CisKK3N0YXRpYyB2b2lkKiBlbXVsYXRvcl93aW5kb3dfZnJhbWVidWZmZXJfY3JlYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCkgeworICAgIFFGcmFtZUJ1ZmZlciogZmIgPSBjYWxsb2MoMSwgc2l6ZW9mKCpmYikpOworCisgICAgcWZyYW1lYnVmZmVyX2luaXQoZmIsIHdpZHRoLCBoZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgYnBwID09IDMyID8gUUZSQU1FX0JVRkZFUl9SR0JYXzg4ODgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBRRlJBTUVfQlVGRkVSX1JHQjU2NSApOworCisgICAgcWZyYW1lYnVmZmVyX2ZpZm9fYWRkKGZiKTsKKyAgICByZXR1cm4gZmI7Cit9CisKK3N0YXRpYyB2b2lkKiBlbXVsYXRvcl93aW5kb3dfZnJhbWVidWZmZXJfZ2V0X3BpeGVscyh2b2lkKiBvcGFxdWUpIHsKKyAgICBRRnJhbWVCdWZmZXIqIGZiID0gb3BhcXVlOworICAgIHJldHVybiBmYi0+cGl4ZWxzOworfQorCitzdGF0aWMgaW50IGVtdWxhdG9yX3dpbmRvd19mcmFtZWJ1ZmZlcl9nZXRfZGVwdGgodm9pZCogb3BhcXVlKSB7CisgICAgUUZyYW1lQnVmZmVyKiBmYiA9IG9wYXF1ZTsKKyAgICByZXR1cm4gZmItPmJpdHNfcGVyX3BpeGVsOworfQorCitpbnQgZW11bGF0b3Jfd2luZG93X2luaXQoRW11bGF0b3JXaW5kb3cqIGVtdWxhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDb25maWcqIGFjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5kcm9pZE9wdGlvbnMqIG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVWlFbXVBZ2VudCogdWlFbXVBZ2VudCkgeworICAgIHN0YXRpYyBjb25zdCBTa2luRnJhbWVidWZmZXJGdW5jcyBza2luX2ZiX2Z1bmNzID0geworICAgICAgICAuY3JlYXRlX2ZyYW1lYnVmZmVyID0gJmVtdWxhdG9yX3dpbmRvd19mcmFtZWJ1ZmZlcl9jcmVhdGUsCisgICAgICAgIC5mcmVlX2ZyYW1lYnVmZmVyID0gJmVtdWxhdG9yX3dpbmRvd19mcmFtZWJ1ZmZlcl9mcmVlLAorICAgICAgICAuZ2V0X3BpeGVscyA9ICZlbXVsYXRvcl93aW5kb3dfZnJhbWVidWZmZXJfZ2V0X3BpeGVscywKKyAgICAgICAgLmdldF9kZXB0aCA9ICZlbXVsYXRvcl93aW5kb3dfZnJhbWVidWZmZXJfZ2V0X2RlcHRoLAorICAgIH07CisKKyAgICBlbXVsYXRvci0+YWNvbmZpZyA9IGFjb25maWc7CisKKyAgICAvLyBpZiBub3QgYnVpbGRpbmcgZm9yIGEgZ3VpLWxlc3Mgd2luZG93LCBjcmVhdGUgYSBza2luIGxheW91dCBmaWxlLAorICAgIC8vIGVsc2Ugc2tpcCBhcyBubyBza2luIHdpbGwgYmUgZGlzcGxheWVkCisgICAgaWYgKCFvcHRzLT5ub193aW5kb3cpIHsKKyAgICAgICAgZW11bGF0b3ItPmxheW91dF9maWxlID0gc2tpbl9maWxlX2NyZWF0ZV9mcm9tX2Fjb25maWcoYWNvbmZpZywgYmFzZXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZza2luX2ZiX2Z1bmNzKTsKKyAgICB9CisKKyAgICBlbXVsYXRvci0+dWkgPSBOVUxMOworICAgIGVtdWxhdG9yLT53aW5feCA9IHg7CisgICAgZW11bGF0b3ItPndpbl95ID0geTsKKyAgICAqKGVtdWxhdG9yLT5vcHRzKSA9ICpvcHRzOworICAgICooZW11bGF0b3ItPnVpRW11QWdlbnQpID0gKnVpRW11QWdlbnQ7CisKKyAgICAvKiByZWdpc3RlciBhcyBhIGZyYW1lYnVmZmVyIGNsaWVudHMgZm9yIGFsbCBkaXNwbGF5cyBkZWZpbmVkIGluIHRoZSBza2luIGZpbGUgKi8KKyAgICBpZiAoZW11bGF0b3ItPmxheW91dF9maWxlKSB7CisgICAgICAgIFNLSU5fRklMRV9MT09QX1BBUlRTKGVtdWxhdG9yLT5sYXlvdXRfZmlsZSwgcGFydCkKKyAgICAgICAgU2tpbkRpc3BsYXkqICBkaXNwID0gcGFydC0+ZGlzcGxheTsKKyAgICAgICAgaWYgKGRpc3AtPnZhbGlkKSB7CisgICAgICAgICAgICBxZnJhbWVidWZmZXJfYWRkX2NsaWVudCggZGlzcC0+ZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yX3dpbmRvd19mYl91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvcl93aW5kb3dfZmJfcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3Jfd2luZG93X2ZiX3BvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7CisgICAgICAgIH0KKyAgICBTS0lOX0ZJTEVfTE9PUF9FTkRfUEFSVFMKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGhhcmR3YXJlIGNvbnRyb2wgc3VwcG9ydCAqLworICAgIEFuZHJvaWRId0NvbnRyb2xGdW5jcyBmdW5jczsKKyAgICBmdW5jcy5saWdodF9icmlnaHRuZXNzID0gZW11bGF0b3Jfd2luZG93X2xpZ2h0X2JyaWdodG5lc3M7CisgICAgYW5kcm9pZF9od19jb250cm9sX3NldChlbXVsYXRvciwgJmZ1bmNzKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkCitlbXVsYXRvcl93aW5kb3dfZG9uZShFbXVsYXRvcldpbmRvdyogZW11bGF0b3IpCit7CisgICAgaWYgKGVtdWxhdG9yLT51aSkgeworICAgICAgICBza2luX3VpX2ZyZWUoZW11bGF0b3ItPnVpKTsKKyAgICAgICAgZW11bGF0b3ItPnVpID0gTlVMTDsKKyAgICB9CisgICAgaWYgKGVtdWxhdG9yLT5sYXlvdXRfZmlsZSkgeworICAgICAgICBza2luX2ZpbGVfZnJlZShlbXVsYXRvci0+bGF5b3V0X2ZpbGUpOworICAgICAgICBlbXVsYXRvci0+bGF5b3V0X2ZpbGUgPSBOVUxMOworICAgIH0KK30KKworLyogY2FsbGVkIHBlcmlvZGljYWxseSB0byBwb2xsIGZvciB1c2VyIGlucHV0IGV2ZW50cyAqLworc3RhdGljIHZvaWQgZW11bGF0b3Jfd2luZG93X3JlZnJlc2goRW11bGF0b3JXaW5kb3cqIGVtdWxhdG9yKQoreworICAgLyogdGhpcyB3aWxsIGV2ZW50dWFsbHkgY2FsbCBzZGxfdXBkYXRlIGlmIHRoZSBjb250ZW50IG9mIHRoZSBWR0EgZnJhbWVidWZmZXIKKyAgICAqIGhhcyBjaGFuZ2VkICovCisgICAgcWZyYW1lYnVmZmVyX2NoZWNrX3VwZGF0ZXMoKTsKKworICAgIGlmIChlbXVsYXRvci0+dWkpIHsKKyAgICAgICAgaWYgKHNraW5fdWlfcHJvY2Vzc19ldmVudHMoZW11bGF0b3ItPnVpKSkgeworICAgICAgICAgICAgLy8gUXVpdCBwcm9ncmFtLgorICAgICAgICAgICAgc2tpbl91aV9mcmVlKGVtdWxhdG9yLT51aSk7CisgICAgICAgICAgICBlbXVsYXRvci0+dWkgPSBOVUxMOworICAgICAgICAgICAgcWVtdV9zeXN0ZW1fc2h1dGRvd25fcmVxdWVzdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkCithbmRyb2lkX2VtdWxhdG9yX3NldF9iYXNlX3BvcnQoIGludCAgcG9ydCApCit7CisgICAgaWYgKHFlbXVsYXRvci0+dWkpIHsKKyAgICAgICAgLyogQmFzZSBwb3J0IGlzIGFscmVhZHkgc2V0IGluIHRoZSBlbXVsYXRvcidzIGNvcmUuICovCisgICAgICAgIGNoYXIgYnVmZlsyNTZdOworICAgICAgICB3cml0ZV93aW5kb3dfbmFtZShidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9iYXNlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2dldE5hbWUoYW5kcm9pZF9hdmRJbmZvKSk7CisKKyAgICAgICAgc2tpbl91aV9zZXRfbmFtZShxZW11bGF0b3ItPnVpLCBidWZmKTsKKyAgICB9Cit9CisKK1NraW5MYXlvdXQqCitlbXVsYXRvcl93aW5kb3dfZ2V0X2xheW91dChFbXVsYXRvcldpbmRvdyogZW11bGF0b3IpCit7CisgICAgaWYgKGVtdWxhdG9yLT51aSkgeworICAgICAgICByZXR1cm4gc2tpbl91aV9nZXRfY3VycmVudF9sYXlvdXQoZW11bGF0b3ItPnVpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihlbXVsYXRvci0+b3B0cy0+bm9fd2luZG93KSB7CisgICAgICAgICAgICAvLyBpbiBuby13aW5kb3cgbW9kZSB0aGVyZSBpcyBubyBza2luIGxheW91dAorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW11bGF0b3ItPmxheW91dF9maWxlLT5sYXlvdXRzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTVmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZW11bGF0b3Itd2luZG93LmgKQEAgLTAsMCArMSw2MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvY21kbGluZS1vcHRpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZyYW1lYnVmZmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2ZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Ym9hcmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi91aS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdWktZW11LWFnZW50LmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBQ29uZmlnKiBhY29uZmlnOworICAgIFNraW5GaWxlKiAgICAgIGxheW91dF9maWxlOworICAgIGludCAgICAgICAgICAgIHdpbl94OworICAgIGludCAgICAgICAgICAgIHdpbl95OworICAgIFNraW5VSSogICAgICAgIHVpOworICAgIFNraW5JbWFnZSogICAgIG9uaW9uOworICAgIFNraW5Sb3RhdGlvbiAgIG9uaW9uX3JvdGF0aW9uOworICAgIGludCAgICAgICAgICAgIG9uaW9uX2FscGhhOworCisgICAgQW5kcm9pZE9wdGlvbnMgb3B0c1sxXTsgIC8qIGNvcHkgb2Ygb3B0aW9ucyAqLworICAgIFVpRW11QWdlbnQgICAgIHVpRW11QWdlbnRbMV07Cit9IEVtdWxhdG9yV2luZG93OworCisvKiBHZXRzIGEgcG9pbnRlciB0byBhIEVtdWxhdG9yV2luZG93IHN0cnVjdHVyZSBpbnN0YW5jZS4gKi8KK0VtdWxhdG9yV2luZG93KgorZW11bGF0b3Jfd2luZG93X2dldCh2b2lkKTsKKworLyogSW5pdGlhbGl6ZXMgRW11bGF0b3JXaW5kb3cgc3RydWN0dXJlIGluc3RhbmNlLiAqLworaW50IGVtdWxhdG9yX3dpbmRvd19pbml0KEVtdWxhdG9yV2luZG93KiBlbXVsYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQ29uZmlnKiBhY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRPcHRpb25zKiBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVpRW11QWdlbnQqIHVpRW11QWdlbnQpOworCisvKiBVbmluaXRpYWxpemVzIEVtdWxhdG9yV2luZG93IHN0cnVjdHVyZSBpbnN0YW5jZSBvbiBleGl0LiAqLwordm9pZAorZW11bGF0b3Jfd2luZG93X2RvbmUoRW11bGF0b3JXaW5kb3cqIGVtdWxhdG9yKTsKKworLyogR2V0cyBlbXVsYXRvcidzIGxheW91dC4gKi8KK1NraW5MYXlvdXQqCitlbXVsYXRvcl93aW5kb3dfZ2V0X2xheW91dChFbXVsYXRvcldpbmRvdyogZW11bGF0b3IpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lcnJvci1tZXNzYWdlcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZXJyb3ItbWVzc2FnZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDRmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZXJyb3ItbWVzc2FnZXMuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZXJyb3ItbWVzc2FnZXMuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworZXh0ZXJuICJDIiB7CisKKy8vIEtlZXAgdHJhY2sgb2YgaWYgYW4gZXJyb3Igd2FzIGFjdHVhbGx5IHNldCwgdGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBlbmNvZGUKKy8vIHRoaXMgc3RhdGUgdXNpbmcgYSBtYWdpYyBudW1iZXIgaW4gdGhlIGFjdHVhbCBlcnJvciBjb2RlLgorc3RhdGljIGJvb2wgaW5pdF9lcnJvcl9vY2N1cnJlZCA9IGZhbHNlOworc3RhdGljIGludCBpbml0X2Vycm9yX2NvZGUgPSAwOworc3RhdGljIHN0ZDo6c3RyaW5nIGluaXRfZXJyb3JfbWVzc2FnZTsKKworLy8gU2VsZWN0IGFuIGVycm9yIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuIElmIHRoZSBwcm92aWRlZCBtZXNzYWdlIGlzIGEKKy8vIG51bGxwdHIgb3IgYW4gZW1wdHkgc3RyaW5nIHdlIHVzZSBhIGRlZmF1bHQgc3RyaW5nIGluc3RlYWQgdG8gZW5zdXJlIHRoYXQgdGhlCisvLyB1c2VyIGdldHMgc29tZSBraW5kIG9mIHZhbHVhYmxlIGluZm9ybWF0aW9uIGluc3RlYWQgb2YganVzdCBhbiBlbXB0eSBlcnJvci4KK3N0YXRpYyBjb25zdCBjaGFyKiBzZWxlY3RFcnJvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlID09IG51bGxwdHIgfHwgbWVzc2FnZVswXSA9PSAnXDAnKSB7CisgICAgICAgIHJldHVybiBrVW5rbm93bkluaXRFcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG1lc3NhZ2U7Cit9CisKK3ZvaWQgYW5kcm9pZF9pbml0X2Vycm9yX3NldChpbnQgZXJyb3JfY29kZSwgY29uc3QgY2hhciogZXJyb3JfbWVzc2FnZSkgeworICAgIGluaXRfZXJyb3Jfb2NjdXJyZWQgPSB0cnVlOworICAgIGluaXRfZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisgICAgaW5pdF9lcnJvcl9tZXNzYWdlID0gc2VsZWN0RXJyb3JNZXNzYWdlKGVycm9yX21lc3NhZ2UpOworfQorCisvLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBkZWNsYXJlZCBpbiB0aGUgaGVhZGVyIGZpbGUgYmVjYXVzZSB5b3UgYXJlIG5vdAorLy8gc3VwcG9zZWQgdG8gdXNlIGl0LiBPbmNlIGFuIGluaXQgZXJyb3Igb2NjdXJyZWQgdGhlbiB0aGF0J3MgdGhlIGVuZCBvZiB0aGUKKy8vIGxpbmUuIFRoaXMgb25seSBleGlzdHMgc28gdGhhdCB1bml0IHRlc3RzIGNhbiBzdGFydCBvdXQgd2l0aCBhIGNsZWFuIHNsYXRlLgordm9pZCBhbmRyb2lkX2luaXRfZXJyb3JfY2xlYXIoKSB7CisgICAgaW5pdF9lcnJvcl9vY2N1cnJlZCA9IGZhbHNlOworICAgIGluaXRfZXJyb3JfY29kZSA9IDA7CisgICAgaW5pdF9lcnJvcl9tZXNzYWdlLmNsZWFyKCk7Cit9CisKK2Jvb2wgYW5kcm9pZF9pbml0X2Vycm9yX29jY3VycmVkKHZvaWQpIHsKKyAgICByZXR1cm4gaW5pdF9lcnJvcl9vY2N1cnJlZDsKK30KKworaW50IGFuZHJvaWRfaW5pdF9lcnJvcl9nZXRfZXJyb3JfY29kZSh2b2lkKSB7CisgICAgcmV0dXJuIGluaXRfZXJyb3JfY29kZTsKK30KKworY29uc3QgY2hhciogYW5kcm9pZF9pbml0X2Vycm9yX2dldF9tZXNzYWdlKHZvaWQpIHsKKyAgICBpZiAoYW5kcm9pZF9pbml0X2Vycm9yX29jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGluaXRfZXJyb3JfbWVzc2FnZS5jX3N0cigpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgY2hhciogY29uc3Qga0hheFZjcHVTeW5jRmFpbGVkID0KKyAgICAgICAgIlVuZm9ydHVuYXRlbHksIHRoZXJlJ3MgYW4gaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gSEFYTSBoeXBlcnZpc29yIGFuZCAiCisgICAgICAgICJWaXJ0dWFsQm94IDQuMy4zMCsgd2hpY2ggZG9lc24ndCBhbGxvdyBtdWx0aXBsZSBoeXBlcnZpc29ycyAiCisgICAgICAgICJ0byBjby1leGlzdC4gIEl0IGlzIGJlaW5nIGFjdGl2ZWx5IHdvcmtlZCBvbjsgeW91IGNhbiBmaW5kIG91dCBtb3JlICIKKyAgICAgICAgImFib3V0IHRoZSBpc3N1ZSBhdCBodHRwOi8vYi5hbmRyb2lkLmNvbS8xOTc5MTUgKEFuZHJvaWQpIGFuZCAiCisgICAgICAgICJodHRwczovL3d3dy52aXJ0dWFsYm94Lm9yZy90aWNrZXQvMTQyOTQgKFZpcnR1YWxCb3gpIjsKKworY29uc3QgY2hhciogY29uc3Qga1Vua25vd25Jbml0RXJyb3IgPQorICAgICAgICAiQW4gdW5rbm93biBlcnJvciBvY2N1cmVkIHdoZW4gc3RhcnRpbmcgQW5kcm9pZCBFbXVsYXRvci4gUGxlYXNlICIKKyAgICAgICAgImNvbnNpZGVyIGZpbGluZyBhIGJ1ZyByZXBvcnQgZGVzY3JpYmluZyB3aGF0IGhhcHBlbmVkIjsKKworY29uc3QgY2hhciogY29uc3Qga05vdEVub3VnaE1lbUZvckd1ZXN0RXJyb3IgPQorICAgICAgICAiQW5kcm9pZCBFbXVsYXRvciBjb3VsZCBub3QgYWxsb2NhdGUgJS4xZiBHQiAiCisgICAgICAgICJvZiBtZW1vcnkgZm9yIHRoZSBjdXJyZW50IEFWRCBjb25maWd1cmF0aW9uLiAiCisgICAgICAgICJDb25zaWRlciBhZGp1c3RpbmcgdGhlIFJBTSBzaXplIG9mIHlvdXIgQVZEICIKKyAgICAgICAgImluIHRoZSBBVkQgTWFuYWdlci5cblxuIgorICAgICAgICAiRXJyb3IgZGV0YWlsOiBRRU1VICclcyciOworCit9ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZXJyb3ItbWVzc2FnZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9lcnJvci1tZXNzYWdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjZiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZXJyb3ItbWVzc2FnZXMuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBTZXQgYW4gZXJyb3IgY29kZSBhbmQgbWVzc2FnZSBmb3IgYW4gZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcKKy8vIGluaXRpYWxpemF0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBtYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nIGluCisvLyB8ZXJyb3JfbWVzc2FnZXwuIElmIHxlcnJvcl9tZXNzYWdlfCBpcyBOVUxMIHRoZW4gdGhlIHN0cmluZyBrVW5rbm93bkluaXRFcnJvcgorLy8gd2lsbCBiZSB1c2VkIGluc3RlYWQuCit2b2lkIGFuZHJvaWRfaW5pdF9lcnJvcl9zZXQoaW50IGVycm9yX2NvZGUsIGNvbnN0IGNoYXIqIGVycm9yX21lc3NhZ2UpOworCisvLyBJbmRpY2F0ZSBpZiBhbiBpbml0IGVycm9yIG9jY3VycmVkIG9yIG5vdAorYm9vbCBhbmRyb2lkX2luaXRfZXJyb3Jfb2NjdXJyZWQodm9pZCk7CisKKy8vIEdldCB0aGUgZXJyb3IgY29kZSBzZXQgYnkgYW5kcm9pZF9zZXRfaW5pdF9lcnJvcgoraW50IGFuZHJvaWRfaW5pdF9lcnJvcl9nZXRfZXJyb3JfY29kZSh2b2lkKTsKKworLy8gR2V0IHRoZSBlcnJvciBtZXNzYWdlIHNldCBieSBhbmRyb2lkX3NldF9pbml0X2Vycm9yLiBJZgorLy8gYW5kcm9pZF9pbml0X2Vycm9yX3NldCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgdGhpcyB3aWxsIHJldHVybiBOVUxMLgorY29uc3QgY2hhciogYW5kcm9pZF9pbml0X2Vycm9yX2dldF9tZXNzYWdlKHZvaWQpOworCisKKy8qKiogRXJyb3IgbWVzc2FnZSAqKiovCisKKy8vIEVycm9yIG1lc3NhZ2UgdG8gZXhwbGFpbiB3aHkgaGF4bSdzIHZjcHUgc3luYyBmYWlsZWQKK2V4dGVybiBjb25zdCBjaGFyKiBjb25zdCBrSGF4VmNwdVN5bmNGYWlsZWQ7CisKKy8vIEVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHNvbWUgdW5rbm93biBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RhcnR1cAorZXh0ZXJuIGNvbnN0IGNoYXIqIGNvbnN0IGtVbmtub3duSW5pdEVycm9yOworCisvLyBGb3JtYXQgc3RyaW5nIGZvciBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgbm90IGVub3VnaCBSQU0gZm9yIFFFTVUgZ3Vlc3QKK2V4dGVybiBjb25zdCBjaGFyKiBjb25zdCBrTm90RW5vdWdoTWVtRm9yR3Vlc3RFcnJvcjsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZXJyb3ItbWVzc2FnZXNfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Vycm9yLW1lc3NhZ2VzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBmZTQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2Vycm9yLW1lc3NhZ2VzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Vycm9yLW1lc3NhZ2VzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGluIHRoZSBhcHBsaWNhdGlvbiBpdHNlbGYgYnV0IGl0IGRvZXMKKy8vIGV4aXN0LiBXZSdyZSBqdXN0IGdvaW5nIHRvIGRlY2xhcmUgaXQgaGVyZSB0byBtYWtlIHVuaXQgdGVzdHMgbW9yZQorLy8gcmVwZWF0YWJsZSBhbmQgcmVsaWFibGUKK2V4dGVybiAiQyIgdm9pZCBhbmRyb2lkX2luaXRfZXJyb3JfY2xlYXIoKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgZXJyb3JDb2RlOworICAgIGNvbnN0IGNoYXIqIGVycm9yTWVzc2FnZTsKKyAgICBjb25zdCBjaGFyKiBleHBlY3RlZE1lc3NhZ2U7Cit9IGtUZXN0Q2FzZXNbXSA9IHsKKyAgICB7IDQyLCAiSXMgdGhhdCBpdD8iLCAiSXMgdGhhdCBpdD8iIH0sCisgICAgeyAwLCAiWmVybyIsICJaZXJvIiB9LAorICAgIHsgMTMsICIiLCBrVW5rbm93bkluaXRFcnJvciB9LAorICAgIHsgLTcsICJOZWdhdGl2ZSB2YWx1ZXMgdG9vISIsICJOZWdhdGl2ZSB2YWx1ZXMgdG9vISIgfSwKKyAgICB7IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCksICJBIGxhcmdlIG51bWJlciIsICJBIGxhcmdlIG51bWJlciIgfSwKKyAgICB7IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCksICJBbmQgYSBzbWFsbCBvbmUiLCAiQW5kIGEgc21hbGwgb25lIiB9LAorICAgIHsgLTEwMDAsIG51bGxwdHIsIGtVbmtub3duSW5pdEVycm9yIH0sCit9OworCitURVNUKEVycm9yTWVzc2FnZXMsIG5vRXJyb3JPY2N1cnJlZFlldCkgeworICAgIGFuZHJvaWRfaW5pdF9lcnJvcl9jbGVhcigpOworICAgIEVYUEVDVF9GQUxTRShhbmRyb2lkX2luaXRfZXJyb3Jfb2NjdXJyZWQoKSk7CisgICAgRVhQRUNUX0VRKG51bGxwdHIsIGFuZHJvaWRfaW5pdF9lcnJvcl9nZXRfbWVzc2FnZSgpKTsKK30KKworVEVTVChFcnJvck1lc3NhZ2VzLCBpbml0RXJyb3JDbGVhcmVkQW5kT2NjdXJyZWQpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRlc3QgOiBrVGVzdENhc2VzKSB7CisgICAgICAgIGFuZHJvaWRfaW5pdF9lcnJvcl9jbGVhcigpOworICAgICAgICBhbmRyb2lkX2luaXRfZXJyb3Jfc2V0KHRlc3QuZXJyb3JDb2RlLCB0ZXN0LmVycm9yTWVzc2FnZSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfaW5pdF9lcnJvcl9vY2N1cnJlZCgpKTsKKyAgICB9Cit9CisKK1RFU1QoRXJyb3JNZXNzYWdlcywgZ2V0SW5pdEVycm9yQ29kZSkgeworICAgIGZvciAoY29uc3QgYXV0byYgdGVzdCA6IGtUZXN0Q2FzZXMpIHsKKyAgICAgICAgYW5kcm9pZF9pbml0X2Vycm9yX2NsZWFyKCk7CisgICAgICAgIGFuZHJvaWRfaW5pdF9lcnJvcl9zZXQodGVzdC5lcnJvckNvZGUsIHRlc3QuZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgRVhQRUNUX0VRKHRlc3QuZXJyb3JDb2RlLCBhbmRyb2lkX2luaXRfZXJyb3JfZ2V0X2Vycm9yX2NvZGUoKSk7CisgICAgfQorfQorCitURVNUKEVycm9yTWVzc2FnZXMsIGdldEluaXRFcnJvck1lc3NhZ2UpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRlc3QgOiBrVGVzdENhc2VzKSB7CisgICAgICAgIGFuZHJvaWRfaW5pdF9lcnJvcl9jbGVhcigpOworICAgICAgICBhbmRyb2lkX2luaXRfZXJyb3Jfc2V0KHRlc3QuZXJyb3JDb2RlLCB0ZXN0LmVycm9yTWVzc2FnZSk7CisgICAgICAgIEVYUEVDVF9TVFJFUSh0ZXN0LmV4cGVjdGVkTWVzc2FnZSwgYW5kcm9pZF9pbml0X2Vycm9yX2dldF9tZXNzYWdlKCkpOworICAgICAgICAvLyBFeHBlY3QgdGhhdCB0aGUgc3RyaW5nIHBvaW50ZXJzIGFyZSBub3QgdGhlIHNhbWUsIHRoZSBtZXNzYWdlIHNob3VsZAorICAgICAgICAvLyBoYXZlIGJlZW4gY29waWVkIHdoZW4gc2V0dGluZyBpdC4KKyAgICAgICAgRVhQRUNUX05FKHRlc3QuZXJyb3JNZXNzYWdlLCBhbmRyb2lkX2luaXRfZXJyb3JfZ2V0X21lc3NhZ2UoKSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlNjE3YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbEltcGwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZlYXR1cmVjb250cm9sIHsKKworYm9vbCBpc0VuYWJsZWQoRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgcmV0dXJuIEZlYXR1cmVDb250cm9sSW1wbDo6Z2V0KCkuaXNFbmFibGVkKGZlYXR1cmUpOworfQorCit2b2lkIHNldEVuYWJsZWRPdmVycmlkZShGZWF0dXJlIGZlYXR1cmUsIGJvb2wgaXNFbmFibGVkKSB7CisgICAgRmVhdHVyZUNvbnRyb2xJbXBsOjpnZXQoKS5zZXRFbmFibGVkT3ZlcnJpZGUoZmVhdHVyZSwgaXNFbmFibGVkKTsKK30KKwordm9pZCByZXNldEVuYWJsZWRUb0RlZmF1bHQoRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgRmVhdHVyZUNvbnRyb2xJbXBsOjpnZXQoKS5yZXNldEVuYWJsZWRUb0RlZmF1bHQoZmVhdHVyZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmZWF0dXJlY29udHJvbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExYzRiNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZlYXR1cmVjb250cm9sIHsKKworLy8gZmVhdHVyZWNvbnRyb2wgaXMgdXNlZCB0byBzd2l0Y2ggb24vb2ZmIGFkdmFuY2VkIGZlYXR1cmVzCisvLyBJdCBsb2FkcyBzZGsvdG9vbHMvYWR2YW5jZWRGZWF0dXJlcy5pbmkgZm9yIGRlZmF1bHQgdmFsdWVzIGFuZAorLy8gLmFuZHJvaWQvYWR2YW5jZWRGZWF0dXJlcy5pbmkgZm9yIHVzZXIgb3ZlcnJpZGVuIHZhbHVlcy4KKy8vIEl0IGlzIGV4cGVjdGVkIHRvIGJlIGluaXRpYWxpemVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVtdWxhdG9yLgorLy8gRm9yIGVhc2llciB0ZXN0aW5nLCBvbmUgbWF5IGFsc28gd2FudCB0byBwYXNzIHRoZSBvdmVycmlkZSB2YWx1ZSB0aHJvdWdoCisvLyBjb21tYW5kIGxpbmUgYW5kIGNhbGwgc2V0RW5hYmxlZE92ZXJyaWRlLiAoQ29tbWFuZCBsaW5lIG92ZXJyaWRlIG5vdAorLy8gaW1wbGVtZW50ZWQgeWV0KQorLy8KKy8vIGZlYXR1cmVjb250cm9sOjppc0VuYWJsZWQgaXMgdGhyZWFkIHNhZmUsIGFsbCBvdGhlciBtZXRob2RzIGFyZSBub3QuCisvLworLy8gVG8gYWRkIG5ldyBmZWF0dXJlcywgcGxlYXNlICgxKSBhZGQgaXQgdG8gYW5kcm9pZC9kYXRhL2FkdmFuY2VkRmVhdHVyZXMuaW5pCisvLyAoMikgYWRkIGEgbmV3IGxpbmUgdG8gRmVhdHVyZUNvbnRyb2xEZWYuaCwgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisvLyBGRUFUVVJFX0NPTlRST0xfSVRFTShZT1VSX0ZFQVRVUkVfTkFNRSkKK2Jvb2wgaXNFbmFibGVkKEZlYXR1cmUgZmVhdHVyZSk7Cit2b2lkIHNldEVuYWJsZWRPdmVycmlkZShGZWF0dXJlIGZlYXR1cmUsIGJvb2wgaXNFbmFibGVkKTsKK3ZvaWQgcmVzZXRFbmFibGVkVG9EZWZhdWx0KEZlYXR1cmUgZmVhdHVyZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGZlYXR1cmVjb250cm9sCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xEZWZHdWVzdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlYjBhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVGhpcyBmaWxlIG1haW50YWluIGEgbGlzdCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0aGF0IGNhbiBiZSBzd2l0Y2hlZCBvbi9vZmYKKy8vIHdpdGggZmVhdHVyZSBjb250cm9sLgorLy8KKy8vIFRoZSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgZGVwZW5kIG9uIHN5c3RlbSBpbWFnZSBidWlsZHMuIEl0IG5lZWRzIHRvIGJlCisvLyBlbmFibGVkIGluIEJPVEggc3lzdGVtIGltYWdlcyBhbmQgZW11bGF0b3IgdG8gYmUgYWN0dWFsbHkgZW5hYmxlZC4KKy8vIFRvIGFkZCBzeXN0ZW0gaW1hZ2UgaW5kZXBlbmRlbnQgZmVhdHVyZXMsIHBsZWFzZSBhZGQgdGhlbSB0bworLy8gRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmgKKy8vCisvLyBUbyBhZGQgYSBuZXcgaXRlbSwgcGxlYXNlIGFkZCBhIG5ldyBsaW5lIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorLy8gRkVBVFVSRV9DT05UUk9MX0lURU0oWU9VUl9GRUFUVVJFX05BTUUpCisvLyBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZWRpdCBpdHMgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgZm9sbG93aW5nIHR3byBwbGFjZXM6CisvLyBhbmRyb2lkL2RhdGEvYWR2YW5jZWRGZWF0dXJlcy5pbmkKKy8vICQoc3lzdGVtX2ltYWdlKS9kZXZlbG9wbWVudC9zeXMtaW1nL2FkdmFuY2VkRmVhdHVyZXMuaW5pCisKKy8vIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSBpbmNsdWRlZCBtdWx0aXBsZSB0aW1lcy4gSXQgc2hvdWxkIG5vdCBoYXZlCisvLyAjcHJhZ21hIG9uY2UgaGVyZS4KKworRkVBVFVSRV9DT05UUk9MX0lURU0oR3JhbGxvY1N5bmMpCitGRUFUVVJFX0NPTlRST0xfSVRFTShFbmNyeXB0VXNlckRhdGEpCitGRUFUVVJFX0NPTlRST0xfSVRFTShJbnRlbFBlcmZvcm1hbmNlTW9uaXRvcmluZ1VuaXQpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmYWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbERlZkhvc3QuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gVGhpcyBmaWxlIG1haW50YWluIGEgbGlzdCBvZiBhZHZhbmNlZCBmZWF0dXJlcyB0aGF0IGNhbiBiZSBzd2l0Y2hlZCBvbi9vZmYKKy8vIHdpdGggZmVhdHVyZSBjb250cm9sLgorLy8KKy8vIFRoZSBmZWF0dXJlcyBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGluZGVwZW5kZW50IGZyb20gc3lzdGVtIGltYWdlIGJ1aWxkcy4KKy8vIFRvIGFkZCBzeXN0ZW0gaW1hZ2UgZGVwZW5kZW50IGZlYXR1cmVzLCBwbGVhc2UgYWRkIHRoZW0gdG8KKy8vIEZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaAorLy8KKy8vIFRvIGFkZCBhIG5ldyBpdGVtLCBwbGVhc2UgYWRkIGEgbmV3IGxpbmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisvLyBGRUFUVVJFX0NPTlRST0xfSVRFTShZT1VSX0ZFQVRVUkVfTkFNRSkKKy8vIFlvdSB3aWxsIGFsc28gbmVlZCB0byBlZGl0IGFuZHJvaWQvZGF0YS9hZHZhbmNlZEZlYXR1cmVzLmluaSB0byBzZXQgaXRzCisvLyBkZWZhdWx0IHZhbHVlLgorCisvLyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMuIEl0IHNob3VsZCBub3QgaGF2ZQorLy8gI3ByYWdtYSBvbmNlIGhlcmUuCisKK0ZFQVRVUkVfQ09OVFJPTF9JVEVNKEdMUGlwZUNoZWNrc3VtKQorRkVBVFVSRV9DT05UUk9MX0lURU0oR0xBc3luY1N3YXApCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xJbXBsLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbEltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MzlkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xJbXBsLmNwcApAQCAtMCwwICsxLDIyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbEltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIHsKK2VudW0gSW5pU2V0dGluZyB7IE9OLCBPRkYsIERFRkFVTFQsIEVSUiB9OworfQorCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPGFuZHJvaWQ6OmZlYXR1cmVjb250cm9sOjpGZWF0dXJlQ29udHJvbEltcGw+CisgICAgICAgIHNfZmVhdHVyZUNvbnRyb2wgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK3N0YXRpYyBJbmlTZXR0aW5nIFBhcnNlSW5pU3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBpZiAoc3RyY2FzZWNtcChzdHIuY19zdHIoKSwgIm9uIikgPT0gMCkgeworICAgICAgICByZXR1cm4gT047CisgICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKHN0ci5jX3N0cigpLCAib2ZmIikgPT0gMCkgeworICAgICAgICByZXR1cm4gT0ZGOworICAgIH0gZWxzZSBpZiAoc3RyY2FzZWNtcChzdHIuY19zdHIoKSwgImRlZmF1bHQiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBERUZBVUxUOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBFUlI7CisgICAgfQorfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZmVhdHVyZWNvbnRyb2wgeworCit2b2lkIEZlYXR1cmVDb250cm9sSW1wbDo6aW5pdEhvc3RGZWF0dXJlQW5kUGFyc2VEZWZhdWx0KAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlJiBkZWZhdWx0SW5pSG9zdCwKKyAgICAgICAgYW5kcm9pZDo6ZmVhdHVyZWNvbnRyb2w6OkZlYXR1cmUgZmVhdHVyZU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIGZlYXR1cmVOYW1lU3RyKSB7CisgICAgc3RkOjpzdHJpbmcgc3RySG9zdCA9IGRlZmF1bHRJbmlIb3N0LmdldFN0cmluZyhmZWF0dXJlTmFtZVN0ciwgIm51bGwiKTsKKworICAgIGluaXRFbmFibGVkRGVmYXVsdChmZWF0dXJlTmFtZSwgZmFsc2UpOworICAgIHN3aXRjaCAoUGFyc2VJbmlTdHIoc3RySG9zdCkpIHsKKyAgICAgICAgY2FzZSBPTjoKKyAgICAgICAgICAgIGluaXRFbmFibGVkRGVmYXVsdChmZWF0dXJlTmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPRkY6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTG9hZGluZyBhZHZhbmNlZCBmZWF0dXJlIGhvc3QgZGVmYXVsdCBzZXR0aW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmVhdHVyZU5hbWVTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3Qgb24vb2ZmLCBnZXQ6ICIgPDwgc3RySG9zdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBGZWF0dXJlQ29udHJvbEltcGw6OmluaXRHdWVzdEZlYXR1cmVBbmRQYXJzZURlZmF1bHQoCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkluaUZpbGUmIGRlZmF1bHRJbmlIb3N0LAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlJiBkZWZhdWx0SW5pR3Vlc3QsCisgICAgICAgIGFuZHJvaWQ6OmZlYXR1cmVjb250cm9sOjpGZWF0dXJlIGZlYXR1cmVOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBmZWF0dXJlTmFtZVN0cikgeworICAgIHN0ZDo6c3RyaW5nIHN0ckhvc3QgPSBkZWZhdWx0SW5pSG9zdC5nZXRTdHJpbmcoZmVhdHVyZU5hbWVTdHIsICJudWxsIik7CisgICAgSW5pU2V0dGluZyB2YWxIb3N0ID0gUGFyc2VJbmlTdHIoc3RySG9zdCk7CisgICAgSW5pU2V0dGluZyB2YWxHdWVzdCA9IFBhcnNlSW5pU3RyKAorICAgICAgICAgICAgZGVmYXVsdEluaUd1ZXN0LmdldFN0cmluZyhmZWF0dXJlTmFtZVN0ciwgIm51bGwiKSk7CisgICAgaW5pdEVuYWJsZWREZWZhdWx0KGZlYXR1cmVOYW1lLCBmYWxzZSk7CisgICAgc3dpdGNoICh2YWxIb3N0KSB7CisgICAgICAgIGNhc2UgT046CisgICAgICAgICAgICBpZiAodmFsR3Vlc3QgPT0gT04pIHsKKyAgICAgICAgICAgICAgICBpbml0RW5hYmxlZERlZmF1bHQoZmVhdHVyZU5hbWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0ZGOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkxvYWRpbmcgYWR2YW5jZWQgZmVhdHVyZSBob3N0IGRlZmF1bHQgc2V0dGluZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZlYXR1cmVOYW1lU3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZXhwZWN0IG9uL29mZiwgZ2V0OiAiIDw8IHN0ckhvc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgRmVhdHVyZUNvbnRyb2xJbXBsOjpsb2FkVXNlck92ZXJyaWRlRmVhdHVyZSgKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6SW5pRmlsZSYgdXNlckluaSwKKyAgICAgICAgYW5kcm9pZDo6ZmVhdHVyZWNvbnRyb2w6OkZlYXR1cmUgZmVhdHVyZU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIGZlYXR1cmVOYW1lU3RyKSB7CisgICAgc3RkOjpzdHJpbmcgdmFsID0gdXNlckluaS5nZXRTdHJpbmcoZmVhdHVyZU5hbWVTdHIsICJkZWZhdWx0Iik7CisgICAgc3dpdGNoIChQYXJzZUluaVN0cih2YWwpKSB7CisgICAgICAgIGNhc2UgT046CisgICAgICAgICAgICBzZXRFbmFibGVkT3ZlcnJpZGUoZmVhdHVyZU5hbWUsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0ZGOgorICAgICAgICAgICAgc2V0RW5hYmxlZE92ZXJyaWRlKGZlYXR1cmVOYW1lLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERUZBVUxUOgorICAgICAgICAgICAgcmVzZXRFbmFibGVkVG9EZWZhdWx0KGZlYXR1cmVOYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJMb2FkaW5nIGFkdmFuY2VkIGZlYXR1cmUgdXNlciBzZXR0aW5nOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwgZmVhdHVyZU5hbWVTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBleHBlY3Qgb24vb2ZmL2RlZmF1bHQsIGdldDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBGZWF0dXJlQ29udHJvbEltcGw6OmluaXQoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBkZWZhdWx0SW5pSG9zdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGRlZmF1bHRJbmlHdWVzdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IHVzZXJJbmlIb3N0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgdXNlckluaUd1ZXN0UGF0aCkgeworICAgIGJhc2U6OkluaUZpbGUgZGVmYXVsdEluaUhvc3QoZGVmYXVsdEluaUhvc3RQYXRoKTsKKyAgICBpZiAoZGVmYXVsdEluaUhvc3QucmVhZCgpKSB7CisgICAgICAgIC8vIEluaXRpYWxpemUgaG9zdCBvbmx5IGZlYXR1cmVzCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pIFwKKyAgICBpbml0SG9zdEZlYXR1cmVBbmRQYXJzZURlZmF1bHQoZGVmYXVsdEluaUhvc3QsIGl0ZW0sICNpdGVtKTsKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkhvc3QuaCIKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorCisgICAgICAgIC8vIEluaXRpYWxpemUgZ3Vlc3QgZmVhdHVyZXMKKyAgICAgICAgLy8gR3Vlc3QgaW5pIHJlYWQgZmFpbHVyZSBpcyBPSyBhbmQgd2lsbCBkaXNhYmxlIGFsbCBndWVzdCBmZWF0dXJlcworICAgICAgICBpZiAoYmFzZTo6U3lzdGVtOjpnZXQoKS0+cGF0aENhblJlYWQoZGVmYXVsdEluaUd1ZXN0UGF0aCkpIHsKKyAgICAgICAgICAgIGJhc2U6OkluaUZpbGUgZGVmYXVsdEluaUd1ZXN0KGRlZmF1bHRJbmlHdWVzdFBhdGgpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRJbmlHdWVzdC5yZWFkKCkpIHsKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX0lURU0oaXRlbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbml0R3Vlc3RGZWF0dXJlQW5kUGFyc2VEZWZhdWx0KGRlZmF1bHRJbmlIb3N0LCBkZWZhdWx0SW5pR3Vlc3QsIGl0ZW0sICNpdGVtKTsKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisjdW5kZWYgRkVBVFVSRV9DT05UUk9MX0lURU0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX0lURU0oaXRlbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGluaXRFbmFibGVkRGVmYXVsdChpdGVtLCBmYWxzZSk7CisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZHdWVzdC5oIgorI3VuZGVmIEZFQVRVUkVfQ09OVFJPTF9JVEVNCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfSVRFTShpdGVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbml0RW5hYmxlZERlZmF1bHQoaXRlbSwgZmFsc2UpOworI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmSG9zdC5oIgorI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaCIKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorICAgICAgICBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBsb2FkIGFkdmFuY2VkIGZlYXR1cmUgZGVmYXVsdCBzZXR0aW5nOiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGRlZmF1bHRJbmlIb3N0UGF0aDsKKyAgICB9CisgICAgaWYgKGJhc2U6OlN5c3RlbTo6Z2V0KCktPnBhdGhDYW5SZWFkKHVzZXJJbmlIb3N0UGF0aCkpIHsKKyAgICAgICAgYmFzZTo6SW5pRmlsZSB1c2VySW5pKHVzZXJJbmlIb3N0UGF0aCk7CisgICAgICAgIGlmICh1c2VySW5pLnJlYWQoKSkgeworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfSVRFTShpdGVtKSBcCisgICAgICAgICAgICBsb2FkVXNlck92ZXJyaWRlRmVhdHVyZSh1c2VySW5pLCBpdGVtLCAjaXRlbSk7CisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmgiCisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZHdWVzdC5oIgorI3VuZGVmIEZFQVRVUkVfQ09OVFJPTF9JVEVNCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJhc2U6OlN5c3RlbTo6Z2V0KCktPnBhdGhDYW5SZWFkKHVzZXJJbmlHdWVzdFBhdGgpKSB7CisgICAgICAgIGJhc2U6OkluaUZpbGUgdXNlckluaSh1c2VySW5pR3Vlc3RQYXRoKTsKKyAgICAgICAgaWYgKHVzZXJJbmkucmVhZCgpKSB7CisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pIFwKKyAgICAgICAgICAgIGxvYWRVc2VyT3ZlcnJpZGVGZWF0dXJlKHVzZXJJbmksIGl0ZW0sICNpdGVtKTsKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisjdW5kZWYgRkVBVFVSRV9DT05UUk9MX0lURU0KKyAgICAgICAgfQorICAgIH0KK30KKworRmVhdHVyZUNvbnRyb2xJbXBsOjpGZWF0dXJlQ29udHJvbEltcGwoKSB7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdEluaUhvc3ROYW1lID0gYmFzZTo6UGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgYmFzZTo6U3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKSwgImxpYiIsCisgICAgICAgICAgICAiYWR2YW5jZWRGZWF0dXJlcy5pbmkiLCBiYXNlOjpQYXRoVXRpbHM6OkhPU1RfVFlQRSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gZGVmYXVsdEluaUd1ZXN0TmFtZTsKKyAgICBpZiAoYW5kcm9pZF9hdmRJbmZvKQorICAgICAgICBkZWZhdWx0SW5pR3Vlc3ROYW1lLnJlc2V0KAorICAgICAgICAgICAgYXZkSW5mb19nZXREZWZhdWx0U3lzdGVtRmVhdHVyZUNvbnRyb2xQYXRoKGFuZHJvaWRfYXZkSW5mbykpOworICAgIHN0ZDo6c3RyaW5nIHVzZXJJbmlIb3N0TmFtZSA9IGJhc2U6OlBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgIENvbmZpZ0RpcnM6OmdldFVzZXJEaXJlY3RvcnkoKSwgImFkdmFuY2VkRmVhdHVyZXMuaW5pIiwKKyAgICAgICAgICAgIGJhc2U6OlBhdGhVdGlsczo6SE9TVF9UWVBFKTsKKyAgICAvLyBXZSBkb24ndCBhbGxvdyBmb3IgdXNlciBndWVzdCBvdmVycmlkZSB1bnRpbCB3ZSBmaW5kIGEgdXNlIGNhc2UgZm9yIGl0CisgICAgc3RkOjpzdHJpbmcgdXNlckluaUd1ZXN0TmFtZSA9IHt9OworICAgIGluaXQoZGVmYXVsdEluaUhvc3ROYW1lLCBkZWZhdWx0SW5pR3Vlc3ROYW1lLmdldCgpLCB1c2VySW5pSG9zdE5hbWUsCisgICAgICAgICB1c2VySW5pR3Vlc3ROYW1lKTsKK30KKworRmVhdHVyZUNvbnRyb2xJbXBsJiBGZWF0dXJlQ29udHJvbEltcGw6OmdldCgpIHsKKyAgICByZXR1cm4gc19mZWF0dXJlQ29udHJvbC5nZXQoKTsKK30KKworYm9vbCBGZWF0dXJlQ29udHJvbEltcGw6OmlzRW5hYmxlZChGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICByZXR1cm4gbUZlYXR1cmVzW2ZlYXR1cmVdLmN1cnJlbnRWYWw7Cit9CisKK3ZvaWQgRmVhdHVyZUNvbnRyb2xJbXBsOjpzZXRFbmFibGVkT3ZlcnJpZGUoRmVhdHVyZSBmZWF0dXJlLCBib29sIGlzRW5hYmxlZCkgeworICAgIEZlYXR1cmVPcHRpb24mIGN1cnJGZWF0dXJlID0gbUZlYXR1cmVzW2ZlYXR1cmVdOworICAgIGN1cnJGZWF0dXJlLmN1cnJlbnRWYWwgPSBpc0VuYWJsZWQ7CisgICAgY3VyckZlYXR1cmUuaXNPdmVycmlkZGVuID0gdHJ1ZTsKK30KKwordm9pZCBGZWF0dXJlQ29udHJvbEltcGw6OnJlc2V0RW5hYmxlZFRvRGVmYXVsdChGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICBGZWF0dXJlT3B0aW9uJiBjdXJyRmVhdHVyZSA9IG1GZWF0dXJlc1tmZWF0dXJlXTsKKyAgICBjdXJyRmVhdHVyZS5jdXJyZW50VmFsID0gY3VyckZlYXR1cmUuZGVmYXVsdFZhbDsKKyAgICBjdXJyRmVhdHVyZS5pc092ZXJyaWRkZW4gPSBmYWxzZTsKK30KKwordm9pZCBGZWF0dXJlQ29udHJvbEltcGw6OmluaXRFbmFibGVkRGVmYXVsdChGZWF0dXJlIGZlYXR1cmUsIGJvb2wgaXNFbmFibGVkKSB7CisgICAgRmVhdHVyZU9wdGlvbiYgY3VyckZlYXR1cmUgPSBtRmVhdHVyZXNbZmVhdHVyZV07CisgICAgY3VyckZlYXR1cmUubmFtZSA9IGZlYXR1cmU7CisgICAgY3VyckZlYXR1cmUuZGVmYXVsdFZhbCA9IGlzRW5hYmxlZDsKKyAgICBjdXJyRmVhdHVyZS5jdXJyZW50VmFsID0gaXNFbmFibGVkOworICAgIGN1cnJGZWF0dXJlLmlzT3ZlcnJpZGRlbiA9IGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgZmVhdHVyZWNvbnRyb2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xJbXBsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhNzljZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbEltcGwuaApAQCAtMCwwICsxLDEwNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGJhc2UgeyBjbGFzcyBJbmlGaWxlOyB9CisKK25hbWVzcGFjZSBmZWF0dXJlY29udHJvbCB7CisKKy8vIEZlYXR1cmVDb250cm9sSW1wbCBpcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZmVhdHVyZSBjb250cm9sLgorLy8gUGxlYXNlIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBBUEkgaW4gYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oCisKKy8vIEZlYXR1cmVzIGFyZSBjb250cm9sbGVkIHRocm91Z2ggaW5pIGZpbGVzLgorLy8gVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgZmVhdHVyZXM6IGhvc3Qtb25seSBmZWF0dXJlcyB0aGF0CisvLyBvbmx5IG5lZWQgdG8gYmUgZW5hYmxlZCBpbiB0aGUgZW11bGF0b3IgdG8gdGFrZSBlZmZlY3QsIGFuZCBndWVzdAorLy8gZmVhdHVyZXMgdGhhdCBuZWVkcyB0byBzaW11bHRhbmVvdXNseSBlbmFibGVkIGluIHRoZSBob3N0IGFuZCB0aGUKKy8vIGd1ZXN0LiBIb3N0LW9ubHkgZmVhdHVyZXMgYXJlIGRlZmluZWQgaW4gRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmguCisvLyBHdWVzdCBmZWF0dXJlcyBhcmUgZGVmaW5lZCBpbiBGZWF0dXJlQ29udHJvbERlZkd1ZXN0LgorCisvLyBVc2VyIGNhbiBvdmVycmlkZSBhbnkgZmVhdHVyZSBvcHRpb25zIGJ5IHByb3ZpZGluZyBhIHVzZXIgaW5pLgorCisvLyBUaGVyZSBhcmUgdXAgdG8gMyBpbmkgZmlsZXMgdGhhdCB3b3VsZCBiZSBsb2FkZWQgZHVyaW5nCisvLyBpbml0aWFsaXphdGlvbjogZGVmYXVsdEluaUhvc3QsIGRlZmF1bHRJbmlHdWVzdCBhbmQKKy8vIFtvcHRpb25hbF0gdXNlckluaUhvc3QuIEVhY2ggb2YgdGhlbSBkbyB0aGUgZm9sbG93aW5nOgorLy8KKy8vIGRlZmF1bHRJbmlIb3N0IHNwZWNpZmllcyBib3RoIGhvc3QgYW5kIGd1ZXN0IGZlYXR1cmVzLCB0aGUKKy8vIGVtdWxhdG9yIHNoaXBzIHdpdGggdGhpcyBmaWxlLgorCisvLyBkZWZhdWx0SW5pR3Vlc3Qgc3BlY2lmaWVzIGd1ZXN0IGZlYXR1cmVzIG9ubHksIHRoZSBzeXN0ZW0gaW1hZ2UKKy8vIHNoaXBzIHdpdGggdGhpcyBmaWxlLiBHdWVzdCBmZWF0dXJlcyB3aWxsIG9ubHkgYmUgZGVmYXVsdCB0byBPTgorLy8gd2hlbiBib3RoIGRlZmF1bHRJbmlIb3N0IGFuZCBkZWZhdWx0SW5pR3Vlc3Qgc2V0IGl0IG9uLgorLy8gSWYgZGVmYXVsdEluaUd1ZXN0IGRvZXMgbm90IGV4aXN0LCBhbGwgZ3Vlc3QgZmVhdHVyZXMgd2lsbCBiZQorLy8gZGVmYXVsdCB0byBPRkYuIElmIGl0IGRvZXMgbm90IHNwZWNpZnkgYSBndWVzdCBmZWF0dXJlIGRlZmluZWQgaW4KKy8vIGRlZmF1bHRJbmlIb3N0LCBpdCB3aWxsIGFsc28gYmUgZGVmYXVsdCB0byBPRkYuIEl0IHNob3VsZCBub3QKKy8vIGNvbnRhaW4gYW55IGhvc3Qtb25seSBmZWF0dXJlcy4gSWYgaXQgZG9lcywgdGhlcmUgaXMgbm8gZWZmZWN0LgorCisvLyB1c2VySW5pSG9zdCBzcGVjaWZpZXMgdXNlciBvdmVycmlkZSB2YWx1ZXMuIEl0IGNhbiBiZSBtYW51YWxseQorLy8gY3JlYXRlZCB1bmRlciB0aGUgdXNlcidzIC5hbmRyb2lkIGZvbGRlci4gSXQgY2FuIG92ZXJyaWRlIGFueQorLy8gZmVhdHVyZXMuIFRoaXMgZmlsZSBpcyBvcHRpb25hbCwgYW5kIGlmIGEgZmVhdHVyZSBpcyBub3Qgc3BlY2lmaWVkCisvLyBpbiB1c2VySW5pSG9zdCwgaXQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSBkZWZhdWx0SW5pSG9zdAorLy8gYW5kIGRlZmF1bHRJbmlHdWVzdC4KKworLy8gVGhlcmUgaXMgYSBwbGFuIGZvciBhIGZvcnRoIGluaSBmaWxlIHdoaWNoIHNwZWNpZmllcyBwZXItYXZkCisvLyBvdmVycmlkZSB2YWx1ZXMuIEl0IGlzIGRpc2FibGVkIGR1ZSB0byBsYWNraW5nIG9mIHVzZSBjYXNlcy4KKworLy8gVGhlIGluaSBmaWxlIHBhdGhzIGFyZSBwYXNzZWQgdGhyb3VnaCBjYWxsaW5nCisvLyBGZWF0dXJlQ29udHJvbEltcGw6OmluaXQoKS4gQ2FsbGluZyBGZWF0dXJlQ29udHJvbEltcGw6OmdldCgpCisvLyB3aWxsIHRyaWdnZXIgRmVhdHVyZUNvbnRyb2xJbXBsOjppbml0KCkgd2l0aCBkZWZhdWx0IHBhdGhzLiBZb3UKKy8vIGNhbiByZWluaXRpYWxpemUgaXQgd2l0aCBkaWZmZXJlbnQgZmlsZSBwYXRocyBieSBjYWxsaW5nCisvLyBGZWF0dXJlQ29udHJvbEltcGw6OmluaXQoKSBhZ2Fpbi4KKworLy8gUGxlYXNlIHJlYWQgRmVhdHVyZUNvbnRyb2xfdW5pdHRlc3QuY3BwIGZvciBleGFtcGxlcy4KKworY2xhc3MgRmVhdHVyZUNvbnRyb2xJbXBsIHsKK3B1YmxpYzoKKyAgICBib29sIGlzRW5hYmxlZChGZWF0dXJlIGZlYXR1cmUpOworICAgIHZvaWQgc2V0RW5hYmxlZE92ZXJyaWRlKEZlYXR1cmUgZmVhdHVyZSwgYm9vbCBpc0VuYWJsZWQpOworICAgIHZvaWQgcmVzZXRFbmFibGVkVG9EZWZhdWx0KEZlYXR1cmUgZmVhdHVyZSk7CisgICAgdm9pZCBpbml0KGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGVmYXVsdEluaUhvc3RQYXRoLAorICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGRlZmF1bHRJbmlHdWVzdFBhdGgsCisgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgdXNlckluaUhvc3RQYXRoLAorICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IHVzZXJJbmlHdWVzdFBhdGgpOworICAgIHN0YXRpYyBGZWF0dXJlQ29udHJvbEltcGwmIGdldCgpOworICAgIEZlYXR1cmVDb250cm9sSW1wbCgpOworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRmVhdHVyZU9wdGlvbiB7CisgICAgICAgIEZlYXR1cmUgbmFtZSA9IHN0YXRpY19jYXN0PEZlYXR1cmU+KDApOworICAgICAgICBib29sIGRlZmF1bHRWYWwgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBjdXJyZW50VmFsID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNPdmVycmlkZGVuID0gZmFsc2U7CisgICAgfTsKKyAgICBGZWF0dXJlT3B0aW9uIG1GZWF0dXJlc1tGZWF0dXJlX25faXRlbXNdID0ge307CisgICAgdm9pZCBpbml0RW5hYmxlZERlZmF1bHQoRmVhdHVyZSBmZWF0dXJlLCBib29sIGlzRW5hYmxlZCk7CisKKyAgICB2b2lkIGluaXRIb3N0RmVhdHVyZUFuZFBhcnNlRGVmYXVsdCgKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6SW5pRmlsZSYgZGVmYXVsdEluaUhvc3QsCisgICAgICAgIEZlYXR1cmUgZmVhdHVyZU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIGZlYXR1cmVOYW1lU3RyKTsKKyAgICB2b2lkIGluaXRHdWVzdEZlYXR1cmVBbmRQYXJzZURlZmF1bHQoCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkluaUZpbGUmIGRlZmF1bHRJbmlIb3N0LAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlJiBkZWZhdWx0SW5pR3Vlc3QsCisgICAgICAgIEZlYXR1cmUgZmVhdHVyZU5hbWUsCisgICAgICAgIGNvbnN0IGNoYXIqIGZlYXR1cmVOYW1lU3RyKTsKKyAgICB2b2lkIGxvYWRVc2VyT3ZlcnJpZGVGZWF0dXJlKAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlJiBkZWZhdWx0SW5pLAorICAgICAgICBGZWF0dXJlIGZlYXR1cmVOYW1lLAorICAgICAgICBjb25zdCBjaGFyKiBmZWF0dXJlTmFtZVN0cik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZmVhdHVyZWNvbnRyb2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZUNvbnRyb2xfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk2OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZlYXR1cmVjb250cm9sL0ZlYXR1cmVDb250cm9sLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbEltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmZWF0dXJlY29udHJvbCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEZlYXR1cmVDb250cm9sVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1UZW1wRGlyLnJlc2V0KG5ldyBiYXNlOjpUZXN0VGVtcERpcigiZmVhdHVyZWNvbnRyb2x0ZXN0IikpOworICAgICAgICBtRGVmYXVsdEluaUhvc3RGaWxlUGF0aCA9CisgICAgICAgICAgICAgICAgbVRlbXBEaXItPm1ha2VTdWJQYXRoKCJkZWZhdWx0U2V0dGluZ3NIb3N0LmluaSIpLmNfc3RyKCk7CisgICAgICAgIG1EZWZhdWx0SW5pR3Vlc3RGaWxlUGF0aCA9CisgICAgICAgICAgICAgICAgbVRlbXBEaXItPm1ha2VTdWJQYXRoKCJkZWZhdWx0U2V0dGluZ3NHdWVzdC5pbmkiKS5jX3N0cigpOworICAgICAgICBtVXNlckluaUhvc3RGaWxlUGF0aCA9CisgICAgICAgICAgICAgICAgbVRlbXBEaXItPm1ha2VTdWJQYXRoKCJ1c2VyU2V0dGluZ3NIb3N0LmluaSIpLmNfc3RyKCk7CisgICAgICAgIG1Vc2VySW5pR3Vlc3RGaWxlUGF0aCA9CisgICAgICAgICAgICAgICAgbVRlbXBEaXItPm1ha2VTdWJQYXRoKCJ1c2VyU2V0dGluZ3NHdWVzdC5pbmkiKS5jX3N0cigpOworCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pIFwKKyAgICAgICAgI2l0ZW0gIiA9IG9uXG4iCisgICAgICAgIG1BbGxPbkluaSA9CisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZIb3N0LmgiCisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZHdWVzdC5oIgorICAgICAgICA7CisjdW5kZWYgRkVBVFVSRV9DT05UUk9MX0lURU0KKworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfSVRFTShpdGVtKSAjaXRlbSAiID0gb25cbiIKKyAgICAgICAgbUFsbE9uSW5pR3Vlc3RPbmx5ID0KKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisgICAgICAgICAgICAgICAgOworI3VuZGVmIEZFQVRVUkVfQ09OVFJPTF9JVEVNCisKKyNkZWZpbmUgRkVBVFVSRV9DT05UUk9MX0lURU0oaXRlbSkgI2l0ZW0gIiA9IG9mZlxuIgorICAgICAgICBtQWxsT2ZmSW5pID0KKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkhvc3QuaCIKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisgICAgICAgIDsKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pICNpdGVtICIgPSBvZmZcbiIKKyAgICAgICAgbUFsbE9mZkluaUd1ZXN0T25seSA9CisjaW5jbHVkZSAiRmVhdHVyZUNvbnRyb2xEZWZHdWVzdC5oIgorICAgICAgICAgICAgICAgIDsKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pICNpdGVtICIgPSBkZWZhdWx0XG4iCisgICAgICAgIG1BbGxEZWZhdWx0SW5pID0KKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkhvc3QuaCIKKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisgICAgICAgIDsKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pICNpdGVtICIgPSBkZWZhdWx0XG4iCisgICAgICAgIG1BbGxEZWZhdWx0SW5pR3Vlc3RPbmx5ID0KKyNpbmNsdWRlICJGZWF0dXJlQ29udHJvbERlZkd1ZXN0LmgiCisgICAgICAgICAgICAgICAgOworI3VuZGVmIEZFQVRVUkVfQ09OVFJPTF9JVEVNCisgICAgfQorcHJvdGVjdGVkOgorICAgIHZvaWQgd3JpdGVEZWZhdWx0SW5pSG9zdChhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGRhdGEpIHsKKyAgICAgICAgd3JpdGVJbmkobURlZmF1bHRJbmlIb3N0RmlsZVBhdGgsIGRhdGEpOworICAgIH0KKyAgICB2b2lkIHdyaXRlRGVmYXVsdEluaUd1ZXN0KGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGF0YSkgeworICAgICAgICB3cml0ZUluaShtRGVmYXVsdEluaUd1ZXN0RmlsZVBhdGgsIGRhdGEpOworICAgIH0KKyAgICB2b2lkIHdyaXRlVXNlckluaUhvc3QoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBkYXRhKSB7CisgICAgICAgIHdyaXRlSW5pKG1Vc2VySW5pSG9zdEZpbGVQYXRoLCBkYXRhKTsKKyAgICB9CisgICAgdm9pZCB3cml0ZVVzZXJJbmlHdWVzdChhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGRhdGEpIHsKKyAgICAgICAgd3JpdGVJbmkobVVzZXJJbmlHdWVzdEZpbGVQYXRoLCBkYXRhKTsKKyAgICB9CisgICAgdm9pZCBsb2FkQWxsSW5pKCkgeworICAgICAgICBGZWF0dXJlQ29udHJvbEltcGw6OmdldCgpLmluaXQoCisgICAgICAgICAgICAgICAgbURlZmF1bHRJbmlIb3N0RmlsZVBhdGgsIG1EZWZhdWx0SW5pR3Vlc3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICBtVXNlckluaUhvc3RGaWxlUGF0aCwgbVVzZXJJbmlHdWVzdEZpbGVQYXRoKTsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGJhc2U6OlRlc3RUZW1wRGlyPiBtVGVtcERpcjsKKyAgICBzdGQ6OnN0cmluZyBtRGVmYXVsdEluaUhvc3RGaWxlUGF0aDsKKyAgICBzdGQ6OnN0cmluZyBtRGVmYXVsdEluaUd1ZXN0RmlsZVBhdGg7CisgICAgc3RkOjpzdHJpbmcgbVVzZXJJbmlIb3N0RmlsZVBhdGg7CisgICAgc3RkOjpzdHJpbmcgbVVzZXJJbmlHdWVzdEZpbGVQYXRoOworICAgIHN0ZDo6c3RyaW5nIG1BbGxPbkluaTsKKyAgICBzdGQ6OnN0cmluZyBtQWxsT25JbmlHdWVzdE9ubHk7CisgICAgc3RkOjpzdHJpbmcgbUFsbE9mZkluaTsKKyAgICBzdGQ6OnN0cmluZyBtQWxsT2ZmSW5pR3Vlc3RPbmx5OworICAgIHN0ZDo6c3RyaW5nIG1BbGxEZWZhdWx0SW5pOworICAgIHN0ZDo6c3RyaW5nIG1BbGxEZWZhdWx0SW5pR3Vlc3RPbmx5OworCitwcml2YXRlOgorICAgIHZvaWQgd3JpdGVJbmkoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGF0YSkgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIG91dEZpbGUoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjpvdXQgfCBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKG91dEZpbGUuZ29vZCgpKTsKKyAgICAgICAgb3V0RmlsZS53cml0ZShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUX0YoRmVhdHVyZUNvbnRyb2xUZXN0LCBvdmVycmlkZVNldHRpbmcpIHsKKyAgICB3cml0ZURlZmF1bHRJbmlIb3N0KG1BbGxPZmZJbmkpOworICAgIHdyaXRlRGVmYXVsdEluaUd1ZXN0KG1BbGxPZmZJbmlHdWVzdE9ubHkpOworICAgIHdyaXRlVXNlckluaUhvc3QobUFsbERlZmF1bHRJbmkpOworICAgIHdyaXRlVXNlckluaUd1ZXN0KG1BbGxEZWZhdWx0SW5pR3Vlc3RPbmx5KTsKKyAgICBsb2FkQWxsSW5pKCk7CisgICAgdXNpbmcgbmFtZXNwYWNlIGZlYXR1cmVjb250cm9sOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZV9uX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgRmVhdHVyZSBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8RmVhdHVyZT4oaSk7CisgICAgICAgIHNldEVuYWJsZWRPdmVycmlkZShmZWF0dXJlLCB0cnVlKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFbmFibGVkKGZlYXR1cmUpKTsKKyAgICAgICAgc2V0RW5hYmxlZE92ZXJyaWRlKGZlYXR1cmUsIGZhbHNlKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgfQorfQorCitURVNUX0YoRmVhdHVyZUNvbnRyb2xUZXN0LCByZXNldFRvRGVmYXVsdCkgeworICAgIHdyaXRlRGVmYXVsdEluaUhvc3QobUFsbE9mZkluaSk7CisgICAgd3JpdGVEZWZhdWx0SW5pR3Vlc3QobUFsbE9mZkluaUd1ZXN0T25seSk7CisgICAgd3JpdGVVc2VySW5pSG9zdChtQWxsRGVmYXVsdEluaSk7CisgICAgd3JpdGVVc2VySW5pR3Vlc3QobUFsbERlZmF1bHRJbmlHdWVzdE9ubHkpOworICAgIGxvYWRBbGxJbmkoKTsKKyAgICB1c2luZyBuYW1lc3BhY2UgZmVhdHVyZWNvbnRyb2w7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGZWF0dXJlX25faXRlbXM7IGkrKykgeworICAgICAgICBGZWF0dXJlIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGZWF0dXJlPihpKTsKKyAgICAgICAgYm9vbCBkZWZhdWx0VmFsID0gaXNFbmFibGVkKGZlYXR1cmUpOworICAgICAgICBzZXRFbmFibGVkT3ZlcnJpZGUoZmVhdHVyZSwgdHJ1ZSk7CisgICAgICAgIHJlc2V0RW5hYmxlZFRvRGVmYXVsdChmZWF0dXJlKTsKKyAgICAgICAgRVhQRUNUX0VRKGRlZmF1bHRWYWwsIGlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgICAgIHNldEVuYWJsZWRPdmVycmlkZShmZWF0dXJlLCBmYWxzZSk7CisgICAgICAgIHJlc2V0RW5hYmxlZFRvRGVmYXVsdChmZWF0dXJlKTsKKyAgICAgICAgRVhQRUNUX0VRKGRlZmF1bHRWYWwsIGlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgfQorfQorCitURVNUX0YoRmVhdHVyZUNvbnRyb2xUZXN0LCByZWFkRGVmYXVsdFNldHRpbmdzKSB7CisgICAgd3JpdGVVc2VySW5pSG9zdChtQWxsRGVmYXVsdEluaSk7CisgICAgd3JpdGVVc2VySW5pR3Vlc3QobUFsbERlZmF1bHRJbmlHdWVzdE9ubHkpOworCisgICAgd3JpdGVEZWZhdWx0SW5pSG9zdChtQWxsT25JbmkpOworICAgIHdyaXRlRGVmYXVsdEluaUd1ZXN0KG1BbGxPbkluaUd1ZXN0T25seSk7CisgICAgbG9hZEFsbEluaSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZV9uX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgRmVhdHVyZSBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8RmVhdHVyZT4oaSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgfQorCisgICAgd3JpdGVEZWZhdWx0SW5pSG9zdChtQWxsT2ZmSW5pKTsKKyAgICB3cml0ZURlZmF1bHRJbmlHdWVzdChtQWxsT2ZmSW5pR3Vlc3RPbmx5KTsKKyAgICBsb2FkQWxsSW5pKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGZWF0dXJlX25faXRlbXM7IGkrKykgeworICAgICAgICBGZWF0dXJlIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGZWF0dXJlPihpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGlzRW5hYmxlZChmZWF0dXJlKSk7CisgICAgfQorfQorCitURVNUX0YoRmVhdHVyZUNvbnRyb2xUZXN0LCByZWFkRGVmYXVsdFNldHRpbmdzV2l0aE5vVXNlclNldHRpbmdzKSB7CisgICAgd3JpdGVEZWZhdWx0SW5pSG9zdChtQWxsT25JbmkpOworICAgIHdyaXRlRGVmYXVsdEluaUd1ZXN0KG1BbGxPbkluaUd1ZXN0T25seSk7CisgICAgRmVhdHVyZUNvbnRyb2xJbXBsOjpnZXQoKS5pbml0KG1EZWZhdWx0SW5pSG9zdEZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdEluaUd1ZXN0RmlsZVBhdGgsICIiLCAiIik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGZWF0dXJlX25faXRlbXM7IGkrKykgeworICAgICAgICBGZWF0dXJlIGZlYXR1cmUgPSBzdGF0aWNfY2FzdDxGZWF0dXJlPihpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFbmFibGVkKGZlYXR1cmUpKTsKKyAgICB9CisKKyAgICB3cml0ZURlZmF1bHRJbmlIb3N0KG1BbGxPZmZJbmkpOworICAgIHdyaXRlRGVmYXVsdEluaUd1ZXN0KG1BbGxPZmZJbmlHdWVzdE9ubHkpOworICAgIEZlYXR1cmVDb250cm9sSW1wbDo6Z2V0KCkuaW5pdChtRGVmYXVsdEluaUhvc3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRJbmlHdWVzdEZpbGVQYXRoLCAiIiwgIiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZV9uX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgRmVhdHVyZSBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8RmVhdHVyZT4oaSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpc0VuYWJsZWQoZmVhdHVyZSkpOworICAgIH0KK30KKworVEVTVF9GKEZlYXR1cmVDb250cm9sVGVzdCwgcmVhZERlZmF1bHRTZXR0aW5nc0hvc3RHdWVzdERpZmZlcmVudCkgeworICAgIHdyaXRlRGVmYXVsdEluaUhvc3QobUFsbE9uSW5pKTsKKyAgICB3cml0ZURlZmF1bHRJbmlHdWVzdChtQWxsT2ZmSW5pKTsKKyAgICBGZWF0dXJlQ29udHJvbEltcGw6OmdldCgpLmluaXQobURlZmF1bHRJbmlIb3N0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0SW5pR3Vlc3RGaWxlUGF0aCwgIiIsICIiKTsKKworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfSVRFTShpdGVtKSBFWFBFQ1RfVFJVRShpc0VuYWJsZWQoaXRlbSkpOworI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmSG9zdC5oIgorICAgIDsKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorCisjZGVmaW5lIEZFQVRVUkVfQ09OVFJPTF9JVEVNKGl0ZW0pIEVYUEVDVF9GQUxTRShpc0VuYWJsZWQoaXRlbSkpOworI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaCIKKyAgICA7CisjdW5kZWYgRkVBVFVSRV9DT05UUk9MX0lURU0KKworICAgIHdyaXRlRGVmYXVsdEluaUhvc3QobUFsbE9mZkluaSk7CisgICAgd3JpdGVEZWZhdWx0SW5pR3Vlc3QobUFsbE9uSW5pKTsKKyAgICBGZWF0dXJlQ29udHJvbEltcGw6OmdldCgpLmluaXQobURlZmF1bHRJbmlIb3N0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0SW5pR3Vlc3RGaWxlUGF0aCwgIiIsICIiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZlYXR1cmVfbl9pdGVtczsgaSsrKSB7CisgICAgICAgIEZlYXR1cmUgZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZlYXR1cmU+KGkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaXNFbmFibGVkKGZlYXR1cmUpKTsKKyAgICB9Cit9CisKK1RFU1RfRihGZWF0dXJlQ29udHJvbFRlc3QsIHJlYWRVc2VyU2V0dGluZ3MpIHsKKyAgICB3cml0ZURlZmF1bHRJbmlIb3N0KG1BbGxPbkluaSk7CisgICAgd3JpdGVEZWZhdWx0SW5pR3Vlc3QobUFsbE9uSW5pR3Vlc3RPbmx5KTsKKworICAgIHdyaXRlVXNlckluaUhvc3QobUFsbE9uSW5pKTsKKyAgICB3cml0ZVVzZXJJbmlHdWVzdChtQWxsT25JbmlHdWVzdE9ubHkpOworICAgIGxvYWRBbGxJbmkoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEZlYXR1cmVfbl9pdGVtczsgaSsrKSB7CisgICAgICAgIEZlYXR1cmUgZmVhdHVyZSA9IHN0YXRpY19jYXN0PEZlYXR1cmU+KGkpOworICAgICAgICBFWFBFQ1RfVFJVRShpc0VuYWJsZWQoZmVhdHVyZSkpOworICAgIH0KKworICAgIHdyaXRlVXNlckluaUhvc3QobUFsbE9mZkluaSk7CisgICAgd3JpdGVVc2VySW5pR3Vlc3QobUFsbE9mZkluaUd1ZXN0T25seSk7CisgICAgbG9hZEFsbEluaSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRmVhdHVyZV9uX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgRmVhdHVyZSBmZWF0dXJlID0gc3RhdGljX2Nhc3Q8RmVhdHVyZT4oaSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpc0VuYWJsZWQoZmVhdHVyZSkpOworICAgIH0KK30KKworfSAvLyBmZWF0dXJlY29udHJvbAorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTNhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmVhdHVyZWNvbnRyb2wvRmVhdHVyZXMuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmZWF0dXJlY29udHJvbCB7CitlbnVtIEZlYXR1cmUgeworI2RlZmluZSBGRUFUVVJFX0NPTlRST0xfSVRFTShpdGVtKSBpdGVtLAorI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmSG9zdC5oIgorI2luY2x1ZGUgIkZlYXR1cmVDb250cm9sRGVmR3Vlc3QuaCIKKyN1bmRlZiBGRUFUVVJFX0NPTlRST0xfSVRFTQorICAgIEZlYXR1cmVfbl9pdGVtcworfTsKK30KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3Jlc2l6ZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzZkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemUuY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfcmVzaXplLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OldpbjMyVXRpbHM7CisjZWxzZQorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UnVuT3B0aW9uczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXc7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07CisKK3N0YXRpYyB1bnNpZ25lZCBjb252ZXJ0Qnl0ZXNUb01CKHVpbnQ2NF90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplID0gKHNpemUgKyAoMVVMTCA8PCAyMCkgLSAxVUxMKSA+PiAyMDsKKyAgICBpZiAoc2l6ZSA+IFVJTlRfTUFYKSB7CisgICAgICAgIHNpemUgPSBVSU5UX01BWDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplKTsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGZvcm1hdHRpbmcgYW5kIHByaW50aW5nIHN5c3RlbSBjYWxsL2xpYnJhcnkKKy8vIGZ1bmN0aW9uIGVycm9ycyB0aGF0IHNob3cgdXAgcmVnYXJkbGVzcyBvZiBob3N0IHBsYXRmb3JtLiBFcXVpdmFsZW50CisvLyB0byBwcmludGluZyB0aGUgc3RyaW5naWZpZWQgZXJyb3IgY29kZSBmcm9tIGVycm5vIG9yIEdldExhc3RFcnJvcigpCisvLyAoZm9yIHdpbmRvd3MpLgordm9pZCBleHBsYWluU3lzdGVtRXJyb3JzKGNvbnN0IGNoYXIqIG1zZykgeworI2lmZGVmIF9XSU4zMgorICAgIGNoYXIqIHBzdHIgPSBOVUxMOworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICBOVUxMLCBHZXRMYXN0RXJyb3IoKSwgMCwgKExQVFNUUikmcHN0ciwgMiwgTlVMTCk7CisgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXMgLSAlc1xuIiwgbXNnLCBwc3RyKTsKKyAgICBMb2NhbEZyZWUocHN0cik7CisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICVzIC0gJXNcbiIsIG1zZywgc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHJ1bkV4dDRQcm9ncmFtKFN0cmluZ1ZpZXcgcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6c3RyaW5nPiBwYXJhbXMpIHsKKyAgICBzdGQ6OnN0cmluZyBleGVjdXRhYmxlID0gU3lzdGVtOjpnZXQoKS0+ZmluZEJ1bmRsZWRFeGVjdXRhYmxlKHByb2dyYW0pOworICAgIGlmIChleGVjdXRhYmxlLmVtcHR5KCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGRuJ3QgZ2V0IHBhdGggdG8gJXMgYmluYXJ5XG4iLAorICAgICAgICAgICAgICAgIHByb2dyYW0uY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29tbWFuZExpbmV7ZXhlY3V0YWJsZX07CisgICAgY29tbWFuZExpbmUuaW5zZXJ0KGNvbW1hbmRMaW5lLmVuZCgpLCBwYXJhbXMpOworCisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdENvZGUgPSAxOworICAgIGF1dG8gc3VjY2VzcyA9IFN5c3RlbTo6Z2V0KCktPnJ1bkNvbW1hbmQoY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5PcHRpb25zOjpXYWl0Rm9yQ29tcGxldGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6a0luZmluaXRlLCAmZXhpdENvZGUpOworCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHJlc2l6aW5nIHBhcnRpdGlvbiBmYWlsZWQgdG8gbGF1bmNoICVzXG4iLAorICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkVSUk9SOiByZXNpemluZyBwYXJ0aXRpb24gJXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgIHByb2dyYW0uY19zdHIoKSwgKGludClleGl0Q29kZSk7CisgICAgICAgIHJldHVybiBleGl0Q29kZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZXNpemVFeHQ0UGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvblBhdGgsIGludDY0X3QgbmV3Qnl0ZVNpemUpIHsKKyAgICAvLyBzYW5pdHkgY2hlY2tzCisgICAgaWYgKHBhcnRpdGlvblBhdGggPT0gTlVMTCB8fCAhY2hlY2tFeHQ0UGFydGl0aW9uU2l6ZShuZXdCeXRlU2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIHJlc2l6ZTJmcyByZXF1aXJlcyB0aGF0IHdlIHJ1biBlMmZzY2sgZmlyc3QgaW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAvLyB0aGUgZmlsZXN5c3RlbSBpcyBpbiBnb29kIHNoYXBlLiBJZiB3ZSByZXNpemUgd2l0aG91dCBmaXJzdCBydW5uaW5nIHRoaXMKKyAgICAvLyB0aGUgZ3Vlc3Qga2VybmVsIGNvdWxkIGRlY2lkZSB0byByZXBsYXkgdGhlIGpvdXJuYWwgYW5kIGVuZCB1cCBpbiBhIHN0YXRlCisgICAgLy8gYmVmb3JlIHRoZSByZXNpemUgdG9vayBwbGFjZS4gVGhpcyBpcyBzb21ldGhpbmcgdGhhdCBmcmVxdWVudGx5IGhhcHBlbmVkCisgICAgLy8gYW5kIGNhdXNlZCB0aGUgcmVzaXplIHRvIG5vdCBiZSB2aXNpYmxlIGluIHRoZSBndWVzdCBzeXN0ZW0uCisgICAgaW50IGZzY2tSZXR1cm5Db2RlID0gcnVuRXh0NFByb2dyYW0oImUyZnNjayIsIHsiLXkiLCBwYXJ0aXRpb25QYXRofSk7CisgICAgaWYgKGZzY2tSZXR1cm5Db2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGZzY2tSZXR1cm5Db2RlOworICAgIH0KKworICAgIGNoYXIgc2l6ZV9pbl9NQls1MF07CisgICAgaW50IGNvcGllZCA9IHNucHJpbnRmKHNpemVfaW5fTUIsIHNpemVvZihzaXplX2luX01CKSwgIiV1TSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRCeXRlc1RvTUIobmV3Qnl0ZVNpemUpKTsKKyAgICBzaXplX2luX01CW3NpemVvZihzaXplX2luX01CKSAtIDFdID0gJ1wwJzsKKyAgICBpZiAoY29waWVkIDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvcGllZCkgPj0gc2l6ZW9mKHNpemVfaW5fTUIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGZhaWxlZCB0byBmb3JtYXQgc2l6ZSBpbiByZXNpemUyZnMgY29tbWFuZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcnVuRXh0NFByb2dyYW0oInJlc2l6ZTJmcyIsIHsiLWYiLCBwYXJ0aXRpb25QYXRoLCBzaXplX2luX01CfSk7Cit9CisKK2Jvb2wgY2hlY2tFeHQ0UGFydGl0aW9uU2l6ZShpbnQ2NF90IGJ5dGVTaXplKSB7CisgICAgdWludDY0X3QgbWF4U2l6ZU1CID0KKyAgICAgICAgICAgIDE2ICogMTAyNCAqIDEwMjQ7ICAvLyAoMTYgVGlCKSAqICgxMDI0IEdpQiAvIFRpQikgKiAoMTAyNCBNaUIgLyBHaUIpCisgICAgdWludDY0X3QgbWluU2l6ZU1CID0gMTI4OworICAgIHVpbnQ2NF90IHNpemVNQiA9IGNvbnZlcnRCeXRlc1RvTUIoYnl0ZVNpemUpOworCisgICAgLy8gY29tcGlsZXIgY29udmVydHMgc2lnbmVkIHRvIHVuc2lnbmVkCisgICAgcmV0dXJuIChzaXplTUIgPj0gbWluU2l6ZU1CKSAmJiAoc2l6ZU1CIDw9IG1heFNpemVNQik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3Jlc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGZkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemUuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBSZXNpemUgdGhlIHBhcnRpdGlvbiBpbiB8cGFydGl0aW9uUGF0aHwgdG8gYmUgbmV3U2l6ZS4KKy8vCisvLyB8cGFydGl0aW9uUGF0aHwgc2hvdWxkIGhvbGQgdGhlIGZ1bGwsIG51bGwtdGVybWluYXRlZCBwYXRoIHRvIHRoZQorLy8gZGVzaXJlZCBwYXJ0aXRpb24uCisvLyB8bmV3Qnl0ZVNpemV8IHNob3VsZCBiZSB0aGUgZGVzaXJlZCBuZXcgc2l6ZSBvZiB0aGUgcGFydGl0aW9uIGluIGJ5dGVzLAorLy8gbm8gc21hbGxlciB0aGFuIDEyOCBNaUIgYW5kIG5vIGdyZWF0ZXIgdGhhbiAxNiBUaUIuIElmIHRoZSB8bmV3Qnl0ZVNpemV8CisvLyBpcyBiZWxvdyB0aGUgbWluaW11bSBhbGxvd2VkIGZvciB0aGUgc3BlY2lmaWVkIHBhcnRpdGlvbiwgcmVzaXplMmZzIHdpbGwKKy8vIHN0aWxsIGZhaWwgYW5kIHRoZSBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIKKy8vCisvLyBSZXR1cm5zOgorLy8gICAgIDAgLSBpbmRpY2F0aW5nIHRoZSByZXNpemUgd2FzIHN1Y2Nlc3NmdWwKKy8vICAgIC0xIC0gaW5kaWNhdGluZyB0aGF0IGZvcm1hdHRpbmcgdGhlIGFyZ3VtZW50cyBmYWlsZWQKKy8vICAgIC0yIC0gaW5kaWNhdGluZyBhIHN5c3RlbSBjYWxsIHdlbnQgd3JvbmcKKy8vICAgIE90aGVyd2lzZSB0aGUgZXhpdCBjb2RlIG9mIHRoZSByZXNpemUyZnMgcHJvY2VzcyBpcyByZXR1cm5lZC4KK2ludCByZXNpemVFeHQ0UGFydGl0aW9uKGNvbnN0IGNoYXIqIHBhcnRpdGlvblBhdGgsIGludDY0X3QgbmV3Qnl0ZVNpemUpOworCisvLyBSZXR1cm5zIHRydWUgaWYgfGJ5dGVTaXplfCBpcyBhIHZhbGlkIGV4dDQgcGFydGl0aW9uIHNpemU7IGkuZS4gd2l0aGluIHRoZQorLy8gcmFuZ2Ugb2YgMTI4IE1pQiBhbmQgMTYgVGlCIGluY2x1c2l2ZSwgZmFsc2Ugb3RoZXJ3aXNlLgorLy8KKy8vIGV4dDQgcGFydGl0aW9ucyBoYXZlIGEgdGhlb3JldGljYWwgbGltaXQgb2YgMSBFaUIsIGFsdGhvdWdoIG9uIDMyLWJpdAorLy8gc3lzdGVtcyB0aGUgcGFydGl0aW9uIGxpbWl0IGlzIHJlZHVjZWQgdG8gMTYgVGlCIGR1ZSB0byB0aGUgZGF0YSByYW5nZQorLy8gb2YgMzItYml0cywgc28gZW5mb3JjZSAxNiBUaUIgdG8gbWluaW1pemUgZGlmZmVyZW5jZXMgYmV0d2VlbiBzeXN0ZW1zIG9mCisvLyBkaWZmZXJlbnQgYml0bmVzcy4gIFRoZSBtaW5pbXVtIHNpemUgb2YgYW4gZXh0NCBwYXJ0aXRpb24gaXMgMTI4IE1pQi4KK2Jvb2wgY2hlY2tFeHQ0UGFydGl0aW9uU2l6ZShpbnQ2NF90IGJ5dGVTaXplKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfcmVzaXplX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWI5YjYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfcmVzaXplX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF9yZXNpemUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9VdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF91dGlscy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RUZW1wRGlyOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7CisKKy8vIEluaXRpYWwgaW1hZ2Ugc2l6ZSBuZWVkcyB0byBiZSA+IDIwME1CCitzdGF0aWMgY29uc3QgaW50NjRfdCBrSW5pdGlhbEltYWdlU2l6ZSA9IDIxMCAqIDEwMjQgKiAxMDI0OworCitjbGFzcyBFeHQ0UmVzaXplVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEV4dDRSZXNpemVUZXN0KCkgOiBtU3lzKFN5c3RlbTo6Z2V0KCkpIHt9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTS0lQX1RFU1RfT05fV0lORSgpOworCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtTdWJQYXRoW10gPSAidGVzdEltYWdlLmltZyI7CisgICAgICAgIG1UZW1wRGlyLnJlc2V0KG5ldyBUZXN0VGVtcERpcigiZXh0NHJlc2l6ZXRlc3QiKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKG1UZW1wRGlyLT5wYXRoKCkpOworICAgICAgICBtRmlsZVBhdGggPSBtVGVtcERpci0+bWFrZVN1YlBhdGgoa1N1YlBhdGgpOworICAgICAgICBBU1NFUlRfRVEoMCwKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRW1wdHlFeHQ0SW1hZ2UobUZpbGVQYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbml0aWFsSW1hZ2VTaXplLCAib29nYWJvb2dhIikpOworICAgICAgICAvLyBQcmVjb25kaXRpb24KKyAgICAgICAgZXhwZWN0VmFsaWRJbWFnZShrSW5pdGlhbEltYWdlU2l6ZSk7CisgICAgfQorCisgICAgdm9pZCBleHBlY3RWYWxpZEltYWdlKFN5c3RlbTo6RmlsZVNpemUgZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfcGF0aElzRXh0NFBhcnRpdGlvbkltYWdlKG1GaWxlUGF0aC5jX3N0cigpKSk7CisgICAgICAgIFN5c3RlbTo6RmlsZVNpemUgc2l6ZTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVN5cy0+cGF0aEZpbGVTaXplKG1GaWxlUGF0aCwgJnNpemUpKTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkU2l6ZSwgc2l6ZSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdW5pcXVlX3B0cjxUZXN0VGVtcERpcj4gbVRlbXBEaXI7CisgICAgc3RyaW5nIG1GaWxlUGF0aDsKKyAgICBTeXN0ZW0qIG1TeXM7Cit9OworCisvLyBUaGlzIHRlc3QgY3Jhc2hlcyBkZWVwIGluIGEgd2luZSdzIGtlcm5lbCBzdGFjay4KK1RFU1RfRihFeHQ0UmVzaXplVGVzdCwgZW5sYXJnZSkgeworICAgIFNLSVBfVEVTVF9PTl9XSU5FKCk7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0xhcmdlclNpemUgPSAxMDI0ICogMTAyNCAqIDEwMjQ7CisgICAgRVhQRUNUX0VRKDAsIHJlc2l6ZUV4dDRQYXJ0aXRpb24obUZpbGVQYXRoLmNfc3RyKCksIGtMYXJnZXJTaXplKSk7CisgICAgZXhwZWN0VmFsaWRJbWFnZShrTGFyZ2VyU2l6ZSk7Cit9CisKKy8vIFRoaXMgdGVzdCBjcmFzaGVzIGRlZXAgaW4gYSB3aW5lJ3Mga2VybmVsIHN0YWNrLgorVEVTVF9GKEV4dDRSZXNpemVUZXN0LCBjb250cmFjdCkgeworICAgIFNLSVBfVEVTVF9PTl9XSU5FKCk7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NtYWxsZXJTaXplID0gMjAxICogMTAyNCAqIDEwMjQ7CisgICAgRVhQRUNUX0VRKDAsIHJlc2l6ZUV4dDRQYXJ0aXRpb24obUZpbGVQYXRoLmNfc3RyKCksIGtTbWFsbGVyU2l6ZSkpOworICAgIGV4cGVjdFZhbGlkSW1hZ2Uoa1NtYWxsZXJTaXplKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3V0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHMuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3V0aWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oIgorCisjaW5jbHVkZSAibWFrZV9leHQ0ZnMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBERUJVR19FWFQ0ICAwCisKKyNkZWZpbmUgRVhUNF9MT0cgICAgIExPR19JRihJTkZPLCBERUJVR19FWFQ0KQorI2RlZmluZSBFWFQ0X1BMT0cgICAgUExPR19JRihJTkZPLCBERUJVR19FWFQ0KQorI2RlZmluZSBFWFQ0X0VSUk9SICAgTE9HX0lGKEVSUk9SLCBERUJVR19FWFQ0KQorI2RlZmluZSBFWFQ0X1BFUlJPUiAgUExPR19JRihFUlJPUiwgREVCVUdfRVhUNCkKKworc3RydWN0IEV4dDRNYWdpYyB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrT2Zmc2V0ID0gMHg0MzhVOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NpemUgPSAyVTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRba1NpemVdOworfTsKKworY29uc3QgdWludDhfdCBFeHQ0TWFnaWM6OmtFeHBlY3RlZFtrU2l6ZV0gPSB7IDB4NTMsIDB4ZWYgfTsKKworYm9vbCBhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgaWYgKCFwYXRoKSB7CisgICAgICAgIEVYVDRfRVJST1IgPDwgIk5VTEwgcGF0aCBwYXJhbWV0ZXIiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU3RkaW9GaWxlIGZpbGUoOjpmb3BlbihwYXRoLCAicmIiKSk7CisgICAgaWYgKCFmaWxlLmdldCgpKSB7CisgICAgICAgIEVYVDRfUEVSUk9SIDw8ICJDb3VsZCBub3Qgb3BlbiBmaWxlOiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoOjpmc2VlayhmaWxlLmdldCgpLCBFeHQ0TWFnaWM6OmtPZmZzZXQsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgIEVYVDRfTE9HIDw8ICJDYW4ndCBzZWVrIHRvIGJ5dGUgIiA8PCBFeHQ0TWFnaWM6OmtPZmZzZXQKKyAgICAgICAgICAgICAgICAgPDwgIiBvZiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjaGFyIG1hZ2ljW0V4dDRNYWdpYzo6a1NpemVdOworICAgIGlmICg6OmZyZWFkKG1hZ2ljLCBzaXplb2YobWFnaWMpLCAxLCBmaWxlLmdldCgpKSAhPSAxKSB7CisgICAgICAgIEVYVDRfUExPRyA8PCAiQ291bGQgbm90IHJlYWQgIiA8PCBzaXplb2YobWFnaWMpCisgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGVzIGZyb20gIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCE6Om1lbWNtcChtYWdpYywgRXh0NE1hZ2ljOjprRXhwZWN0ZWQsIHNpemVvZihtYWdpYykpKSB7CisgICAgICAgIEVYVDRfTE9HIDw8ICJGaWxlIGlzIEV4dDQgcGFydGl0aW9uIGltYWdlOiAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEVYVDRfTE9HIDw8ICJOb3QgYW4gRXh0NCBwYXJ0aXRpb24gaW1hZ2U6ICIgPDwgcGF0aDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBhbmRyb2lkX2NyZWF0ZUVtcHR5RXh0NEltYWdlKGNvbnN0IGNoYXIgKmZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vdW50cG9pbnQpIHsKKyAgICByZXR1cm4gYW5kcm9pZF9jcmVhdGVFeHQ0SW1hZ2VGcm9tRGlyKGZpbGVQYXRoLCBOVUxMLCBzaXplLCBtb3VudHBvaW50KTsKK30KKworaW50IGFuZHJvaWRfY3JlYXRlRXh0NEltYWdlRnJvbURpcihjb25zdCBjaGFyICpkc3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb3VudHBvaW50KSB7CisgICAgaW50IHJldCA9IDo6bWFrZV9leHQ0ZnNfZnJvbV9kaXIoZHN0RmlsZVBhdGgsIHNyY0RpcmVjdG9yeSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudHBvaW50LCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgRVhUNF9FUlJPUiA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHQ0IGltYWdlIGF0OiAiIDw8IGRzdEZpbGVQYXRoOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF91dGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM3MjRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHMuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQ3JlYXRlIGEgbmV3IGVtcHR5IEVYVDQgcGFydGl0aW9uIGltYWdlIGZpbGUgYXQgfGZpbGVQYXRofAorLy8gb2YgfHNpemV8IGJ5dGVzLiB8bW91bnRQb2ludHwgaXMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKy8vIG1vdW50IHBvaW50LCBlLmcuICdjYWNoZScgZm9yIHRoZSBjYWNoZSBwYXJ0aXRpb24uCisvLyBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLWVycm5vIG9uIGZhaWx1cmUuCitpbnQgYW5kcm9pZF9jcmVhdGVFbXB0eUV4dDRJbWFnZShjb25zdCBjaGFyICpmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb3VudHBvaW50KTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgZmlsZSBhdCB8ZmlsZVBhdGh8IGlzIGFuIGFjdHVhbCBFWFQ0IHBhcnRpdGlvbiBpbWFnZS4KK2Jvb2wgYW5kcm9pZF9wYXRoSXNFeHQ0UGFydGl0aW9uSW1hZ2UoY29uc3QgY2hhciogZmlsZVBhdGgpOworCisvLyBSZXR1cm5zIDAgd2hlbiBzdWNjZWVkcy4gT3RoZXJ3aXNlIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgoraW50IGFuZHJvaWRfY3JlYXRlRXh0NEltYWdlRnJvbURpcihjb25zdCBjaGFyICpkc3RGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3JjRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb3VudHBvaW50KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF91dGlsc191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZXh0NF91dGlsc191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjYzRhNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3V0aWxzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0RXh0NEltYWdlSGVhZGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTY29wZWRTdGRpb0ZpbGU7Cit1c2luZyBhbmRyb2lkOjp0ZXN0aW5nOjpDcmVhdGVUZW1wRmlsZVBhdGg7CisKK2NsYXNzIEV4dDRVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBFeHQ0VXRpbHNUZXN0KCkgOiBtVGVtcEZpbGVQYXRoKCkgeworICAgICAgICA6Om1lbXNldChtSW1hZ2UsIDAsIHNpemVvZiBtSW1hZ2UpOworICAgICAgICA6Om1lbWNweShtSW1hZ2UsIGtUZXN0RXh0NEltYWdlSGVhZGVyLCBrVGVzdEV4dDRJbWFnZUhlYWRlclNpemUpOworICAgIH0KKworICAgIH5FeHQ0VXRpbHNUZXN0KCkgeworICAgICAgICBpZiAoIW1UZW1wRmlsZVBhdGguZW1wdHkoKSkgeworICAgICAgICAgICAgSEFORExFX0VJTlRSKHVubGluayhtVGVtcEZpbGVQYXRoLmNfc3RyKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHdpdGggdXAgdG8gfG1heEJ5dGVzfCBieXRlcyBvZiB8bUltYWdlfAorICAgIC8vIGluIGl0LCBhbmQgcmV0dXJuIGl0cyBwYXRoLiBUaGUgZmlsZSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlCisgICAgLy8gZGVzdHJ1Y3Rvci4KKyAgICBjb25zdCBjaGFyKiBjcmVhdGVUZW1wRmlsZShzaXplX3QgbWF4Qnl0ZXMpIHsKKyAgICAgICAgQ0hFQ0sobWF4Qnl0ZXMgPD0gc2l6ZW9mIG1JbWFnZSk7CisgICAgICAgIC8vIFRPRE8oZGlnaXQpOiBSZXBsYWNlIHdpdGggc29tZXRoaW5nIGVsc2UuCisgICAgICAgIG1UZW1wRmlsZVBhdGggPSBDcmVhdGVUZW1wRmlsZVBhdGgoKTsKKyAgICAgICAgU2NvcGVkU3RkaW9GaWxlIGZpbGUoZm9wZW4obVRlbXBGaWxlUGF0aC5jX3N0cigpLCAid2IiKSk7CisgICAgICAgIFBDSEVDSyhmaWxlLmdldCgpKSA8PCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSEiOworICAgICAgICBQQ0hFQ0soOjpmd3JpdGUobUltYWdlLCBtYXhCeXRlcywgMSwgZmlsZS5nZXQoKSkgPT0gMSkKKyAgICAgICAgICAgICAgICA8PCAiQ291bGQgbm90IHdyaXRlICIgPDwgbWF4Qnl0ZXMgPDwgIiBieXRlcyB0byAiCisgICAgICAgICAgICAgICAgPDwgInRlbXBvcmFyeSBmaWxlIjsKKyAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICByZXR1cm4gbVRlbXBGaWxlUGF0aC5jX3N0cigpOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0aGUgcGF0aCBvZiBhIHRlbXBvcmFyeSBmaWxlLCBidXQgZG8gbm90IGNyZWF0ZSBvcgorICAgIC8vIHBvcHVsYXRlIGl0LiBUaGUgZmlsZSBpcyByZW1vdmVkIGluIHRoZSBkZXN0cnVjdG9yLgorICAgIGNvbnN0IGNoYXIqIGNyZWF0ZVRlbXBQYXRoKCkgeworICAgICAgICBtVGVtcEZpbGVQYXRoID0gQ3JlYXRlVGVtcEZpbGVQYXRoKCk7CisgICAgICAgIHJldHVybiBtVGVtcEZpbGVQYXRoLmNfc3RyKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgbVRlbXBGaWxlUGF0aDsKKyAgICBjaGFyIG1JbWFnZVtrVGVzdEV4dDRJbWFnZUhlYWRlclNpemUgKiAyVV07Cit9OworCitURVNUX0YoRXh0NFV0aWxzVGVzdCwgYW5kcm9pZF9wYXRoSXNFeHQ0UGFydGl0aW9uSW1hZ2UpIHsKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gY3JlYXRlVGVtcEZpbGUoa1Rlc3RFeHQ0SW1hZ2VIZWFkZXJTaXplKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZShwYXRoKSk7Cit9CisKK1RFU1RfRihFeHQ0VXRpbHNUZXN0LCBhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZVRydW5jYXRlZCkgeworICAgIGNvbnN0IGNoYXIqIHBhdGggPSBjcmVhdGVUZW1wRmlsZShrVGVzdEV4dDRJbWFnZUhlYWRlclNpemUgLSAyVSk7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRfcGF0aElzRXh0NFBhcnRpdGlvbkltYWdlKHBhdGgpKTsKK30KKworVEVTVF9GKEV4dDRVdGlsc1Rlc3QsIGFuZHJvaWRfcGF0aElzRXh0NFBhcnRpdGlvbkltYWdlQ29ycnVwdGVkKSB7CisgICAgbWVtc2V0KG1JbWFnZSwgMHg1NSwgc2l6ZW9mIG1JbWFnZSk7CisgICAgY29uc3QgY2hhciogcGF0aCA9IGNyZWF0ZVRlbXBGaWxlKHNpemVvZiBtSW1hZ2UpOworICAgIEVYUEVDVF9GQUxTRShhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZShwYXRoKSk7Cit9CisKK1RFU1RfRihFeHQ0VXRpbHNUZXN0LCBhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZUJhZE1hZ2ljMSkgeworICAgIG1JbWFnZVtrVGVzdEV4dDRJbWFnZUhlYWRlclNpemUgLSAxXSA9IDA7CisgICAgY29uc3QgY2hhciogcGF0aCA9IGNyZWF0ZVRlbXBGaWxlKHNpemVvZiBtSW1hZ2UpOworICAgIEVYUEVDVF9GQUxTRShhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZShwYXRoKSk7Cit9CisKK1RFU1RfRihFeHQ0VXRpbHNUZXN0LCBhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZUJhZE1hZ2ljMikgeworICAgIG1JbWFnZVtrVGVzdEV4dDRJbWFnZUhlYWRlclNpemUgLSAyXSA9IDA7CisgICAgY29uc3QgY2hhciogcGF0aCA9IGNyZWF0ZVRlbXBGaWxlKHNpemVvZiBtSW1hZ2UpOworICAgIEVYUEVDVF9GQUxTRShhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZShwYXRoKSk7Cit9CisKK1RFU1RfRihFeHQ0VXRpbHNUZXN0LCBhbmRyb2lkX2NyZWF0ZUVtcHR5RXh0NFBhcnRpdGlvbikgeworICAgIGNvbnN0IGNoYXIqIHRlbXBQYXRoID0gY3JlYXRlVGVtcFBhdGgoKTsKKyAgICB1aW50NjRfdCBrU2l6ZSA9IDMyICogMTAyNCAqIDEwMjQ7CisgICAgaW50IHJldCA9IGFuZHJvaWRfY3JlYXRlRW1wdHlFeHQ0SW1hZ2UodGVtcFBhdGgsIGtTaXplLCAiY2FjaGUiKTsKKyAgICBFWFBFQ1RfRVEoMCwgcmV0KTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX3BhdGhJc0V4dDRQYXJ0aXRpb25JbWFnZSh0ZW1wUGF0aCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ZzdGFiX3BhcnNlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZnN0YWJfcGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTY2ZmUyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ZzdGFiX3BhcnNlci5jcHAKQEAgLTAsMCArMSwxMDQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXIuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIHNraXBXaGl0ZXNwYWNlKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGVuZCkgeworICAgIHdoaWxlIChwIDwgZW5kICYmIGlzc3BhY2UoKnApKSB7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIHA7Cit9CisKK2NvbnN0IGNoYXIqIHNraXBOb25XaGl0ZXNwYWNlKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGVuZCkgeworICAgIHdoaWxlIChwIDwgZW5kICYmICFpc3NwYWNlKCpwKSkgeworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiBwOworfQorCitjb25zdCBjaGFyKiBza2lwRXhwZWN0ZWRUb2tlbihjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpIHsKKyAgICBwID0gc2tpcFdoaXRlc3BhY2UocCwgZW5kKTsKKyAgICBpZiAocCA9PSBlbmQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBza2lwTm9uV2hpdGVzcGFjZShwLCBlbmQpOworfQorCitzaXplX3QgZ2V0VG9rZW5MZW4oY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogZW5kKSB7CisgICAgY29uc3QgY2hhciogcSA9IHNraXBOb25XaGl0ZXNwYWNlKHAsIGVuZCk7CisgICAgcmV0dXJuIChzaXplX3QpKHEgLSBwKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgYW5kcm9pZF9wYXJzZUZzdGFiUGFydGl0aW9uRm9ybWF0KGNvbnN0IGNoYXIqIGZzdGFiRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmc3RhYlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIG91dCkgeworICAgIGNvbnN0IGNoYXIqIHAgPSBmc3RhYkRhdGE7CisgICAgY29uc3QgY2hhciogZW5kID0gcCArIGZzdGFiU2l6ZTsKKworICAgIHNpemVfdCBwYXJ0aXRpb25OYW1lTGVuID0gc3RybGVuKHBhcnRpdGlvbk5hbWUpOworCisgICAgd2hpbGUgKHAgPCBlbmQpIHsKKyAgICAgICAgLy8gRmluZCBlbmQgb2YgY3VycmVudCBsaW5lLCBhbmQgc3RhcnQgb2YgbmV4dCBvbmUuCisgICAgICAgIGNvbnN0IGNoYXIqIGxpbmUgPSBwOworICAgICAgICBjb25zdCBjaGFyKiBsaW5lX2VuZCA9IDo6c3RyY2hyKHAsICdcbicpOworICAgICAgICBpZiAoIWxpbmVfZW5kKSB7CisgICAgICAgICAgICBsaW5lX2VuZCA9IGVuZDsKKyAgICAgICAgICAgIHAgPSBlbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gbGluZV9lbmQgKyAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2tpcCBlbXB0eSBvciBjb21tZW50IGxpbmVzLgorICAgICAgICBsaW5lID0gc2tpcFdoaXRlc3BhY2UobGluZSwgbGluZV9lbmQpOworICAgICAgICBpZiAobGluZSA9PSBsaW5lX2VuZCB8fCBsaW5lWzBdID09ICcjJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBlY3RlZCBmb3JtYXQ6IDxkZXZpY2U+PHdzPjxwYXJ0aXRpb24+PHdzPjxmb3JtYXQ+PHdzPjxvcHRpb25zPgorCisgICAgICAgIC8vIHNraXAgb3ZlciBkZXZpY2UgbmFtZS4KKyAgICAgICAgbGluZSA9IHNraXBFeHBlY3RlZFRva2VuKGxpbmUsIGxpbmVfZW5kKTsKKyAgICAgICAgaWYgKCFsaW5lKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUgPSBza2lwV2hpdGVzcGFjZShsaW5lLCBsaW5lX2VuZCk7CisgICAgICAgIHNpemVfdCB0b2tlbkxlbiA9IGdldFRva2VuTGVuKGxpbmUsIGxpbmVfZW5kKTsKKyAgICAgICAgaWYgKHRva2VuTGVuICE9IHBhcnRpdGlvbk5hbWVMZW4gfHwKKyAgICAgICAgICAgIG1lbWNtcChsaW5lLCBwYXJ0aXRpb25OYW1lLCB0b2tlbkxlbikgIT0gMCkgeworICAgICAgICAgICAgLy8gTm90IHRoZSByaWdodCBwYXJ0aXRpb24uCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUgPSBza2lwV2hpdGVzcGFjZShsaW5lICsgdG9rZW5MZW4sIGxpbmVfZW5kKTsKKyAgICAgICAgc2l6ZV90IGZvcm1hdExlbiA9IGdldFRva2VuTGVuKGxpbmUsIGxpbmVfZW5kKTsKKyAgICAgICAgaWYgKGZvcm1hdExlbiA9PSAwKSB7CisgICAgICAgICAgICAvLyBNYWxmb3JtZWQgZGF0YS4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKGZvcm1hdExlbiArIDFVKSk7CisgICAgICAgIG1lbWNweSgqb3V0LCBsaW5lLCBmb3JtYXRMZW4pOworICAgICAgICAoKm91dClbZm9ybWF0TGVuXSA9ICdcMCc7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZnN0YWJfcGFyc2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvZnN0YWJfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1MDc2MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXIuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gUGFyc2UgdGhlIExpbnV4IGZzdGFiIGZpbGUgYXQgfGZzdGFiRGF0YXwgb2YgfGZzdGFiU2l6ZXwgYnl0ZXMKKy8vIGFuZCBleHRyYWN0IHRoZSBmb3JtYXQgb2YgdGhlIHBhcnRpdGlvbiBuYW1lZCB8cGFydGl0aW9uTmFtZXwuCisvLyBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cyB8Km91dEZvcm1hdHwgdG8gYSBoZWFwLWFsbG9jYXRlZAorLy8gc3RyaW5nIHRoYXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiBPbiBmYWlsdXJlLCByZXR1cm4gZmFsc2UuCitib29sIGFuZHJvaWRfcGFyc2VGc3RhYlBhcnRpdGlvbkZvcm1hdChjb25zdCBjaGFyKiBmc3RhYkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnN0YWJEaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBvdXRGb3JtYXQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ZzdGFiX3BhcnNlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2YWJiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9mc3RhYl9wYXJzZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK1RFU1QoRnN0YWJQYXJzZXIsIFBhcnNlUGFydGl0aW9uRm9ybWF0KSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ZzdGFiW10gPQorICAgICAgICAiIyBBbmRyb2lkIGZzdGFiIGZpbGUuXG4iCisgICAgICAgICIjPHNyYz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbnRfcG9pbnQ+ICAgICAgICAgPHR5cGU+ICAgIDxtbnRfZmxhZ3MgYW5kIG9wdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZzX21ncl9mbGFncz5cbiIKKyAgICAgICAgIiMgVGhlIGZpbGVzeXN0ZW0gdGhhdCBjb250YWlucyB0aGUgZmlsZXN5c3RlbSBjaGVja2VyIGJpbmFyeSAodHlwaWNhbGx5IC9zeXN0ZW0pIGNhbm5vdFxuIgorICAgICAgICAiIyBzcGVjaWZ5IE1GX0NIRUNLLCBhbmQgbXVzdCBjb21lIGJlZm9yZSBhbnkgZmlsZXN5c3RlbXMgdGhhdCBkbyBzcGVjaWZ5IE1GX0NIRUNLXG4iCisgICAgICAgICIvZGV2L2Jsb2NrL210ZGJsb2NrMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXN0ZW0gICAgICAgICAgICAgZXh0NCAgICAgIHJvLGJhcnJpZXI9MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFxuIgorICAgICAgICAiL2Rldi9ibG9jay9tdGRibG9jazFcdCAgICAgIFx0ICAgICAgICAgICAgICAgICAgICAgICAgICAvZGF0YVx0ICAgICAgICAgICAgIHlhZmZzMiAgICBub2F0aW1lLG5vc3VpZCxub2RldixiYXJyaWVyPTEsbm9tYmxrX2lvX3N1Ym1pdCAgICAgIHdhaXQsY2hlY2tcbiIKKyAgICAgICAgIi9kZXYvYmxvY2svbXRkYmxvY2syXHQvY2FjaGVcdG50ZnNcdG5vYXRpbWUsbm9zdWlkLG5vZGV2ICB3YWl0LGNoZWNrXG4iCisgICAgICAgICIvZGV2aWNlcy9wbGF0Zm9ybS9nb2xkZmlzaF9tbWMuMFx0XHRcdGF1dG9cdHZmYXQgICAgICBkZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbGRtYW5hZ2VkPXNkY2FyZDphdXRvXG4iCisgICAgICAgIDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtGc3RhYlNpemUgPSBzaXplb2Yoa0ZzdGFiKTsKKworICAgIGNoYXIqIG91dCA9IE5VTEw7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZF9wYXJzZUZzdGFiUGFydGl0aW9uRm9ybWF0KGtGc3RhYiwga0ZzdGFiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9zeXN0ZW0iLCAmb3V0KSk7CisgICAgRVhQRUNUX1NUUkVRKCJleHQ0Iiwgb3V0KTsKKyAgICBmcmVlKG91dCk7CisKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX3BhcnNlRnN0YWJQYXJ0aXRpb25Gb3JtYXQoa0ZzdGFiLCBrRnN0YWJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2RhdGEiLCAmb3V0KSk7CisgICAgRVhQRUNUX1NUUkVRKCJ5YWZmczIiLCBvdXQpOworICAgIGZyZWUob3V0KTsKKworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfcGFyc2VGc3RhYlBhcnRpdGlvbkZvcm1hdChrRnN0YWIsIGtGc3RhYlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvY2FjaGUiLCAmb3V0KSk7CisgICAgRVhQRUNUX1NUUkVRKCJudGZzIiwgb3V0KTsKKyAgICBmcmVlKG91dCk7CisKKyAgICBFWFBFQ1RfRkFMU0UoYW5kcm9pZF9wYXJzZUZzdGFiUGFydGl0aW9uRm9ybWF0KGtGc3RhYiwga0ZzdGFiU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvdW5rbm93biIsICZvdXQpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9pbnRlcm5hbC9QYXJ0aXRpb25Db25maWdCYWNrZW5kLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9pbnRlcm5hbC9QYXJ0aXRpb25Db25maWdCYWNrZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRmNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ludGVybmFsL1BhcnRpdGlvbkNvbmZpZ0JhY2tlbmQuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvaW50ZXJuYWwvUGFydGl0aW9uQ29uZmlnQmFja2VuZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3Jlc2l6ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvZnN0YWJfcGFyc2VyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9yYW1kaXNrX2V4dHJhY3Rvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZWxvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RlbXBmaWxlLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCitjbGFzcyBEZWZhdWx0UGFydGl0aW9uQ29uZmlnQmFja2VuZCA6IHB1YmxpYyBQYXJ0aXRpb25Db25maWdCYWNrZW5kIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aEV4aXN0cyhjb25zdCBjaGFyKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoX2V4aXN0cyhwYXRoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aEVtcHR5RmlsZShjb25zdCBjaGFyKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoX2VtcHR5X2ZpbGUocGF0aCkgPT0gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENvcHlGaWxlKGNvbnN0IGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBwYXRoX2NvcHlfZmlsZShkc3QsIHNyYykgPT0gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aExvY2tGaWxlKGNvbnN0IGNoYXIqIHBhdGgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZpbGVsb2NrX2NyZWF0ZShwYXRoKSAhPSBOVUxMOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoQ3JlYXRlVGVtcEZpbGUoc3RkOjpzdHJpbmcqIHBhdGgpIG92ZXJyaWRlIHsKKyAgICAgICAgVGVtcEZpbGUqIHRlbXBfZmlsZSA9IHRlbXBmaWxlX2NyZWF0ZSgpOworICAgICAgICBpZiAoIXRlbXBfZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICpwYXRoID0gdGVtcGZpbGVfcGF0aCh0ZW1wX2ZpbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEFuZHJvaWRQYXJ0aXRpb25UeXBlIHByb2JlUGFydGl0aW9uRmlsZVR5cGUoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBhbmRyb2lkUGFydGl0aW9uVHlwZV9wcm9iZUZpbGUocGF0aCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGV4dHJhY3RSYW1kaXNrRmlsZShjb25zdCBjaGFyKiByYW1kaXNrX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0KSBvdmVycmlkZSB7CisgICAgICAgIGNoYXIqIG91dF9kYXRhID0gTlVMTDsKKyAgICAgICAgc2l6ZV90IG91dF9zaXplID0gMFU7CisgICAgICAgIGlmICghYW5kcm9pZF9leHRyYWN0UmFtZGlza0ZpbGUocmFtZGlza19wYXRoLCBmaWxlX3BhdGgsICZvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X3NpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3V0LT5hc3NpZ24ob3V0X2RhdGEsIG91dF9zaXplKTsKKyAgICAgICAgZnJlZShvdXRfZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZVBhcnRpdGlvbkZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgZnN0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vdW50UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHBhcnRpdGlvbkZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICBjaGFyKiBvdXRfZm9ybWF0ID0gTlVMTDsKKyAgICAgICAgaWYgKCFhbmRyb2lkX3BhcnNlRnN0YWJQYXJ0aXRpb25Gb3JtYXQoZnN0YWIuY19zdHIoKSwgZnN0YWIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudFBhdGgsICZvdXRfZm9ybWF0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBhcnRpdGlvbkZvcm1hdC0+YXNzaWduKG91dF9mb3JtYXQpOworICAgICAgICBmcmVlKG91dF9mb3JtYXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFrZUVtcHR5UGFydGl0aW9uKEFuZHJvaWRQYXJ0aXRpb25UeXBlIHBhcnRpdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwYXJ0aXRpb25TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uRmlsZSkgb3ZlcnJpZGUgeworICAgICAgICBpbnQgcmV0ID0gYW5kcm9pZFBhcnRpdGlvblR5cGVfbWFrZUVtcHR5RmlsZSgKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25UeXBlLCBwYXJ0aXRpb25TaXplLCBwYXJ0aXRpb25GaWxlKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGVycm5vID0gLXJldDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXh0NFBhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0aXRpb25QYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcnRpdGlvblNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpOjpyZXNpemVFeHQ0UGFydGl0aW9uKHBhcnRpdGlvblBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihwYXJ0aXRpb25TaXplKSk7CisgICAgfQorfTsKKworLy8gc3RhdGljCitQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBQYXJ0aXRpb25Db25maWdCYWNrZW5kOjpzSW5zdGFuY2UgPSBudWxscHRyOworCisvLyBzdGF0aWMKK1BhcnRpdGlvbkNvbmZpZ0JhY2tlbmQqIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQ6OmdldCgpIHsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgRGVmYXVsdFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworLy8gc3RhdGljCitQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBQYXJ0aXRpb25Db25maWdCYWNrZW5kOjpzZXRGb3JUZXN0aW5nKAorICAgICAgICBQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBuZXdCYWNrZW5kKSB7CisgICAgUGFydGl0aW9uQ29uZmlnQmFja2VuZCogb2xkQmFja2VuZCA9IHNJbnN0YW5jZTsKKyAgICBzSW5zdGFuY2UgPSBuZXdCYWNrZW5kOworICAgIHJldHVybiBvbGRCYWNrZW5kOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvaW50ZXJuYWwvUGFydGl0aW9uQ29uZmlnQmFja2VuZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ludGVybmFsL1BhcnRpdGlvbkNvbmZpZ0JhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MyNDkyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL2ludGVybmFsL1BhcnRpdGlvbkNvbmZpZ0JhY2tlbmQuaApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fdHlwZXMuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworLy8gVGVzdGluZyB0aGUgbG9naWMgb2YgdGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uIHNldHVwIGNvZGUgZm9yIGFsbAorLy8gZGlmZmVyZW50IGNhc2VzIGlzIGNvbXBsZXguIFRoaXMgY2xhc3MgaXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlIHVzZWQKKy8vIHRvIHNpbXBsaWZ5IHVuaXQtdGVzdGluZy4gSXRzIG1ldGhvZHMgYXJlIGNhbGxlZCBmcm9tCisvLyBhbmRyb2lkX3BhcnRpdGlvbl9jb25maWd1cmF0aW9uX3NldHVwKCkgdG8gYWNjZXNzIHRoZSBob3N0IHN5c3RlbS4KKy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisvLyBQYXJ0aXRpb25Db25maWdCYWNrZW5kOjpnZXQoKSwgdGhvdWdoIGEgdW5pdC10ZXN0IHdvdWxkIHByb3ZpZGUgaXRzCisvLyBvd24gc3ViLWNsYXNzLCBhbmQgdXNlCisvLyBhbmRyb2lkX3BhcnRpdGlvbl9jb25maWd1cmF0aW9uX3NldF9iYWNrZW5kX2Zvcl90ZXN0aW5nKCkKKy8vIHRvIGluamVjdCBpdC4KK2NsYXNzIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLgorICAgIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQoKSB7fQorCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsIH5QYXJ0aXRpb25Db25maWdCYWNrZW5kKCkge30KKworICAgIC8vIFJldHJpZXZlIGN1cnJlbnQgcHJvY2Vzcy13aWRlIGluc3RhbmNlLgorICAgIHN0YXRpYyBQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBnZXQoKTsKKworICAgIC8vIENoYW5nZSBwcm9jZXNzLXdpZGUgaW5zdGFuY2UgdG8gbmV3IG9uZSBkdXJpbmcgdW5pdC10ZXN0aW5nLgorICAgIC8vIFJldHVybiBwcmV2aW91cyBpbnN0YW5jZSB2YWx1ZSwgdG8gYmUgcmVzdG9yZWQgd2hlbiB0aGUgdGVzdCBjb21wbGV0ZXMuCisgICAgc3RhdGljIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQqIHNldEZvclRlc3RpbmcoCisgICAgICAgICAgICBQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBuZXdCYWNrZW5kKTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiBob3N0IHxwYXRofCBleGlzdHMuCisgICAgdmlydHVhbCBib29sIHBhdGhFeGlzdHMoY29uc3QgY2hhciogcGF0aCkgPSAwOworCisgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGZpbGUgYXQgYSBnaXZlbiBsb2NhdGlvbi4gSWYgdGhlIGZpbGUgYWxyZWFkeQorICAgIC8vIGV4aXN0cywgaXQgaXMgdHJ1bmNhdGVkIHdpdGhvdXQgd2FybmluZy4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywKKyAgICAvLyBmYWxzZS9lcnJubyBvbiBmYWlsdXJlLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoRW1wdHlGaWxlKGNvbnN0IGNoYXIqIHBhdGgpID0gMDsKKworICAgIC8vIENvcHkgaG9zdCBmaWxlIHxzb3VyY2VQYXRofCBpbnRvIHxkZXN0UGF0aHwuIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsCisgICAgLy8gZmFsc2UvZXJybm8gb24gZmFpbHVyZS4KKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENvcHlGaWxlKGNvbnN0IGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIHNvdXJjZSkgPSAwOworCisgICAgLy8gVHJ5IHRvIGxvY2sgaG9zdCBmaWxlIGF0IHxwYXRofC4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UKKyAgICAvLyBvbiBmYWlsdXJlLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoTG9ja0ZpbGUoY29uc3QgY2hhciogcGF0aCkgPSAwOworCisgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHRlbXBvcmFyeSBmaWxlLiBPbiBzdWNjZXNzIHJldHVybiB0cnVlIGFuZAorICAgIC8vIHNldHMgfCpwYXRofCB0byBpdHMgcGF0aC4gT24gZXJyb3IgcmV0dXJuIGZhbHNlL2Vycm5vLgorICAgIHZpcnR1YWwgYm9vbCBwYXRoQ3JlYXRlVGVtcEZpbGUoc3RkOjpzdHJpbmcqIHBhdGgpID0gMDsKKworICAgIC8vIFByb2JlIHRoZSBmaWxlIGF0IHxwYXRofCBhbmQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IHBhcnRpdGlvbiB0eXBlLgorICAgIC8vIE9uIGZhaWx1cmUsIHJldHVybiBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04uCisgICAgdmlydHVhbCBBbmRyb2lkUGFydGl0aW9uVHlwZSBwcm9iZVBhcnRpdGlvbkZpbGVUeXBlKGNvbnN0IGNoYXIqIHBhdGgpID0gMDsKKworICAgIC8vIEV4dHJhY3QgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGZyb20gYSByYW1kaXNrLmltZyBwYXJ0aXRpb24uCisgICAgLy8gfHJhbWRpc2tfcGF0aHwgaXMgdGhlIGltYWdlJ3MgaG9zdCBmaWxlIHBhdGguCisgICAgLy8gfGZpbGVfcGF0aHwgaXMgdGhlIGZpbGUncyBwYXRoIHdpdGhpbiB0aGUgcmFtZGlzayBpbWFnZS4KKyAgICAvLyBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cyB8Km91dHwgdG8gdGhlIGZpbGUncyBjb250ZW50LgorICAgIHZpcnR1YWwgYm9vbCBleHRyYWN0UmFtZGlza0ZpbGUoY29uc3QgY2hhciogcmFtZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dCkgPSAwOworCisgICAgLy8gUGFyc2UgYW4gJ2ZzdGFiJyBmaWxlIGFuZCBleHRyYWN0IHRoZSB0eXBlIG9mIGEgZ2l2ZW4gcGFydGl0aW9uLgorICAgIC8vIHxmc3RhYnwgcG9pbnRzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmc3RhYiBmaWxlIGluIG1lbW9yeSwgfG1vdW50UGF0aHwKKyAgICAvLyBpcyB0aGUgcGFydGl0aW9uJ3MgbW91bnQgcG9pbnQgYXMgaXQgYXBwZWFycyBpbiB0aGUgZnN0YWIuIE9uIHN1Y2Nlc3MsCisgICAgLy8gcmV0dXJuIHRydWUgYW5kIHNldHMgfCpwYXJ0aXRpb25Gb3JtYXR8IHRvIHRoZSBjb3JyZXNwb25kaW5nIHBhcnRpdGlvbgorICAgIC8vIGZvcm1hdCAoZS5nLiAnZXh0NCcpLiBPbiBmYWlsdXJlLCByZXR1cm4gZmFsc2UuCisgICAgdmlydHVhbCBib29sIHBhcnNlUGFydGl0aW9uRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmc3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbW91bnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogcGFydGl0aW9uRm9ybWF0KSA9IDA7CisKKyAgICAvLyBDcmVhdGUgYW4gZW1wdHkgcGFydGl0aW9uIGZpbGUgb24gdGhlIGhvc3QuCisgICAgLy8gfHBhcnRpdGlvblR5cGV8IGlzIHRoZSBwYXJ0aXRpb24gZm9ybWF0LCB8cGFydGl0aW9uU2l6ZXwgaXMgdGhlCisgICAgLy8gc2l6ZSBvZiB0aGUgdmlydHVhbCBwYXJ0aXRpb24gKHRoZSBhY3R1YWwgZmlsZSBjYW4gYmUgc21hbGxlciksCisgICAgLy8gYW5kIHxwYXJ0aXRpb25QYXRofCBpcyB0aGUgaG9zdCBwYXRoIG9mIHRoZSBwYXJ0aXRpb24gZmlsZS4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZS9lcnJubyBvbiBmYWlsdXJlLgorICAgIHZpcnR1YWwgYm9vbCBtYWtlRW1wdHlQYXJ0aXRpb24oQW5kcm9pZFBhcnRpdGlvblR5cGUgcGFydGl0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcnRpdGlvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25QYXRoKSA9IDA7CisKKyAgICAvLyBSZXNpemUgYW4gZXhpc3RpbmcgZXh0NCBwYXJ0aXRpb24gYXQgfHBhcnRpdGlvblBhdGh8IHRvIGEgbmV3CisgICAgLy8gc2l6ZSBpbiBieXRlcyBnaXZlbiBieSB8cGFydGl0aW9uU2l6ZXwuCisgICAgdmlydHVhbCB2b2lkIHJlc2l6ZUV4dDRQYXJ0aXRpb24oY29uc3QgY2hhciogcGFydGl0aW9uUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwYXJ0aXRpb25TaXplKSA9IDA7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQqIHNJbnN0YW5jZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NDQ0OWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl9jb25maWcuY3BwCkBAIC0wLDAgKzEsNDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL2ludGVybmFsL1BhcnRpdGlvbkNvbmZpZ0JhY2tlbmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmludGVybmFsOjpQYXJ0aXRpb25Db25maWdCYWNrZW5kOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCisvLyBTdGF0ZSBzdHJ1Y3R1cmUgc2hhcmVkIGJ5IHNldmVyYWwgZnVuY3Rpb25zLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIqKiBlcnJvcl9tZXNzYWdlOworICAgIEFuZHJvaWRQYXJ0aXRpb25TZXR1cEZ1bmN0aW9uIHNldHVwX2Z1bmM7CisgICAgdm9pZCogc2V0dXBfb3BhcXVlOworICAgIFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQqIGJhY2tlbmQ7Cit9IFBhcnRpdGlvbkNvbmZpZ1N0YXRlOworCisvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byByZWNvcmQgYW4gZXJyb3IgbWVzc2FnZSBpbnRvIHRoZSB8c3RhdGV8LAorLy8gdGhlbiByZXR1cm4gZmFsc2UuIHxmb3JtYXR8IGlzIGEgdHlwaWNhbCBwcmludGYoKS1saWtlIGZvcm1hdHRpbmcKKy8vIHN0cmluZyBmb2xsb3dlZCBieSBvcHRpb25hbCBhcmd1bWVudHMuIEFsd2F5cyByZXR1cm4gZmFsc2UgdG8KKy8vIGluZGljYXRlIGFuIGVycm9yLgorc3RhdGljIGJvb2wgcGFydGl0aW9uX2NvbmZpZ19lcnJvcihQYXJ0aXRpb25Db25maWdTdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKSB7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgdmFzcHJpbnRmKHN0YXRlLT5lcnJvcl9tZXNzYWdlLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEV4dHJhY3QgdGhlIHBhcnRpdGlvbiB0eXBlL2Zvcm1hdCBvZiBhIGdpdmVuIHBhcnRpdGlvbiBpbWFnZQorLy8gZnJvbSB0aGUgY29udGVudCBvZiBmc3RhYi5nb2xkZmlzaC4KKy8vIHxmc3RhYnwgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZzdGFiLmdvbGRmaXNoIGRhdGEgaW4gbWVtb3J5LgorLy8gfGZzdGFiU2l6ZXwgaXMgaXRzIHNpemUgaW4gYnl0ZXMuCisvLyB8cGFydGl0aW9uTmFtZXwgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBmb3IgZGVidWdnaW5nCisvLyBwdXJwb3NlcyAoZS5nLiAndXNlcmRhdGEnKS4KKy8vIHxwYXJ0aXRpb25QYXRofCBpcyB0aGUgcGFydGl0aW9uIHBhdGggYXMgaXQgYXBwZWFycyBpbiB0aGUKKy8vIGZzdGFiIGZpbGUgKGUuZy4gJy9kYXRhJykuCisvLyBPbiBzdWNjZXNzLCBzZXRzIHwqcGFydGl0aW9uVHlwZXwgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUsCisvLyBvbiBmYWlsdXJlIChpLmUuIHxwYXJ0aXRpb25QYXRofCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGZzdGFiCisvLyBmaWxlKSwgbGVhdmUgdGhlIHZhbHVlIHVudG91Y2hlZC4KK3N0YXRpYyB2b2lkIGV4dHJhY3RQYXJ0aXRpb25Gb3JtYXQoUGFydGl0aW9uQ29uZmlnU3RhdGUqIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnN0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnRpdGlvblBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlKiBwYXJ0aXRpb25UeXBlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFydEZvcm1hdDsKKyAgICBpZiAoIXN0YXRlLT5iYWNrZW5kLT5wYXJzZVBhcnRpdGlvbkZvcm1hdChmc3RhYiwgcGFydGl0aW9uUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydEZvcm1hdCkpIHsKKyAgICAgICAgVkVSQk9TRV9QUklOVChpbml0LCAiQ291bGQgbm90IGV4dHJhY3QgZm9ybWF0IG9mICVzIHBhcnRpdGlvbiEiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbk5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIkZvdW5kIGZvcm1hdCBvZiAlcyBwYXJ0aXRpb246ICclcyciLCBwYXJ0aXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgcGFydEZvcm1hdC5jX3N0cigpKTsKKyAgICAqcGFydGl0aW9uVHlwZSA9IGFuZHJvaWRQYXJ0aXRpb25UeXBlX2Zyb21TdHJpbmcocGFydEZvcm1hdC5jX3N0cigpKTsKK30KKworLy8gTGlzdCBvZiB2YWx1ZSBkZXNjcmliaW5nIGhvdyB0byBoYW5kbGUgcGFydGl0aW9uIGltYWdlcyBpbgorLy8gYWRkTmFuZEltYWdlKCkgYmVsb3csIHdoZW4gbm8gaW5pdGlhbCBwYXJ0aXRpb24gaW1hZ2UKKy8vIGZpbGUgaXMgcHJvdmlkZWQuCisvLworLy8gTVVTVF9FWElTVCBtZWFucyB0aGF0IHRoZSBwYXJ0aXRpb24gaW1hZ2UgbXVzdCBleGlzdCwgb3RoZXJ3aXNlCisvLyBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQuCisvLworLy8gQ1JFQVRFX0lGX05FRURFRCBtZWFucyB0aGF0IGlmIHRoZSBwYXJ0aXRpb24gaW1hZ2UgZG9lc24ndCBleGlzdCwgYW4KKy8vIGVtcHR5IHBhcnRpdGlvbiBmaWxlIHNob3VsZCBiZSBjcmVhdGVkIG9uIGRlbWFuZC4KKy8vCisvLyBNVVNUX1dJUEUgbWVhbnMgdGhhdCB0aGUgcGFydGl0aW9uIGltYWdlIHNob3VsZCBiZSB3aXBlZCBjbGVhbmVkLAorLy8gZXZlbiBpZiBpdCBleGlzdHMuIFRoaXMgaXMgdXNlZnVsIHRvIGltcGxlbWVudCB0aGUgLXdpcGUtZGF0YSBvcHRpb24uCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfUEFSVElUSU9OX09QRU5fTU9ERV9NVVNUX0VYSVNULAorICAgIEFORFJPSURfUEFSVElUSU9OX09QRU5fTU9ERV9DUkVBVEVfSUZfTkVFREVELAorICAgIEFORFJPSURfUEFSVElUSU9OX09QRU5fTU9ERV9NVVNUX1dJUEUsCit9IEFuZHJvaWRQYXJ0aXRpb25PcGVuTW9kZTsKKworLy8gQWRkIGEgTkFORCBwYXJ0aXRpb24gaW1hZ2UgdG8gdGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uCisvLworLy8gfHBhcnRfbmFtZXwgaXMgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBwYXJ0aXRpb24sIGkuZS4gInN5c3RlbSIsCisvLyAidXNlcmRhdGEiIG9yICJjYWNoZSIuCisvLyB8cGFydF90eXBlfCBpcyBhbiBlbnVtIGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgcGFydGl0aW9uLiBJZiBpdCBpcworLy8gRElTS19QQVJUSVRJT05fVFlQRV9QUk9CRSwgdGhlbiB0cnkgdG8gYXV0by1kZXRlY3QgdGhlIHR5cGUgZGlyZWN0bHkKKy8vIGZyb20gdGhlIGNvbnRlbnQgb2YgfHBhcnRfZmlsZXwgb3IgfHBhcnRfaW5pdF9maWxlfC4KKy8vIHxwYXJ0X21vZGV8IGlzIGFuIGVudW0gZGVzY3JpYmluZyBob3cgdG8gaGFuZGxlIHRoZSBwYXJ0aXRpb24gaW1hZ2UsCisvLyBzZWUgQW5kcm9pZFBhcnRpdGlvbk9wZW5Nb2RlIGZvciBkZXRhaWxzLgorLy8gfHBhcnRfc2l6ZXwgaXMgdGhlIHBhcnRpdGlvbiBzaXplIGluIGJ5dGVzLgorLy8gfHBhcnRfZmlsZXwgaXMgdGhlIHBhcnRpdGlvbiBmaWxlIHBhdGgsIGNhbiBiZSBOVUxMIGlmIHxwYXRoX2luaXRfZmlsZXwKKy8vIGlzIG5vdCBOVUxMLgorLy8gfHBhcnRfaW5pdF9maWxlfCBpcyBhbiBvcHRpb25hbCBwYXRoIHRvIHRoZSBpbml0aWFsaXphdGlvbiBwYXJ0aXRpb24gZmlsZS4KKy8vCisvLyBUaGUgTkFORCBwYXJ0aXRpb24gd2lsbCBiZSBiYWNrZWQgYnkgfHBhcnRfZmlsZXwsIGV4Y2VwdCBpbiB0aGUgZm9sbG93aW5nCisvLyBjYXNlczoKKy8vICAgIC0gfHBhcnRfZmlsZXwgaXMgTlVMTCwgb3IgaXRzIHZhbHVlIGlzICI8dGVtcD4iLCBpbmRpY2F0aW5nIHRoYXQgYQorLy8gICAgICBuZXcgdGVtcG9yYXJ5IGltYWdlIGZpbGUgbXVzdCBiZSB1c2VkIGluc3RlYWQuCisvLworLy8gICAgLSB8cGFydF9maWxlfCBpcyBub3QgTlVMTCwgYnV0IHRoZSBmdW5jdGlvbiBmYWlscyB0byBsb2NrIHRoZSBmaWxlLAorLy8gICAgICBpbmRpY2F0aW5nIGl0J3MgYWxyZWFkeSB1c2VkIGJ5IGFub3RoZXIgaW5zdGFuY2UuIEEgd2FybmluZyBzaG91bGQKKy8vICAgICAgYmUgcHJpbnRlZCB0byB3YXJuIHRoZSB1c2VyLCBhbmQgYSBuZXcgdGVtcG9yYXJ5IGltYWdlIHNob3VsZCBiZQorLy8gICAgICB1c2VkLgorLy8KKy8vIElmIHxwYXJ0X2ZpbGV8IGlzIG5vdCBOVUxMIGFuZCBjYW4gYmUgbG9ja2VkLCBpZiB0aGUgcGFydGl0aW9uIGltYWdlIGRvZXMKKy8vIG5vdCBleGl0LCB0aGVuIHRoZSBmaWxlIG11c3QgYmUgY3JlYXRlZCBhcyBhbiBlbXB0eSBwYXJ0aXRpb24uCisvLworLy8gSWYgfHBhcnRfaW5pdF9maWxlfCBpcyBub3QgTlVMTCwgaXRzIGNvbnRlbnQgd2lsbCBiZSB1c2VkIHRvIGVyYXNlCisvLyB0aGUgY29udGVudCBvZiB0aGUgbWFpbiBwYXJ0aXRpb24gaW1hZ2UuIFRoaXMgaXMgYXV0b21hdGljYWxseSBoYW5kbGVkCisvLyBieSB0aGUgTkFORCBjb2RlIHRob3VnaC4KKy8vCisvLyBJZiB8cmVhZG9ubHl8IGlzIHRydWUsIHRoZW4gZWl0aGVyIHRoZSB8cGFydF9maWxlfCBvciB8cGFydF9pbml0X2ZpbGV8IHdpbGwKKy8vIGJlIG1vdW50ZWQgYXMgcmVhZC1vbmx5IGRldmljZXMuIFRoaXMgYWxzbyBwcmV2ZW50cyBsb2NraW5nIHRoZSBwYXJ0aXRpb24KKy8vIGltYWdlIGFuZCBjcmVhdGlvbiBvZiB0ZW1wb3JhcnkgY29waWVzLgorLy8KK3N0YXRpYyBib29sIGFkZE5hbmRJbWFnZShQYXJ0aXRpb25Db25maWdTdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlIHBhcnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkUGFydGl0aW9uT3Blbk1vZGUgcGFydF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydF9pbml0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkb25seSkgeworICAgIC8vIFNhbml0aXplIHBhcmFtZXRlcnMsIGFuIGVtcHR5IHN0cmluZyBtdXN0IGJlIHRoZSBzYW1lIGFzIE5VTEwuCisgICAgaWYgKHBhcnRfZmlsZSAmJiAhKnBhcnRfZmlsZSkgeworICAgICAgICBwYXJ0X2ZpbGUgPSBOVUxMOworICAgIH0KKyAgICBpZiAocGFydF9pbml0X2ZpbGUgJiYgISpwYXJ0X2luaXRfZmlsZSkgeworICAgICAgICBwYXJ0X2luaXRfZmlsZSA9IE5VTEw7CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgICBpZiAocGFydF9zaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbl9jb25maWdfZXJyb3IoCisgICAgICAgICAgICAgICAgc3RhdGUsICJJbnZhbGlkICVzIHBhcnRpdGlvbiBzaXplIDB4JSIgUFJJeDY0LAorICAgICAgICAgICAgICAgIHBhcnRfbmFtZSwgcGFydF9zaXplKTsKKyAgICB9CisKKyAgICBpZiAocGFydF9pbml0X2ZpbGUgJiYgIXN0YXRlLT5iYWNrZW5kLT5wYXRoRXhpc3RzKHBhcnRfaW5pdF9maWxlKSkgeworICAgICAgICByZXR1cm4gcGFydGl0aW9uX2NvbmZpZ19lcnJvcihzdGF0ZSwgIk1pc3NpbmcgaW5pdGlhbCAlcyBpbWFnZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUsIHBhcnRfaW5pdF9maWxlKTsKKyAgICB9CisKKyAgICAvLyBJbiByZWFkLW9ubHkgbW9kZSwgdGhlIGluaXRpYWwgcGFydGl0aW9uIGltYWdlIGNhbiBiZSB0cmVhdGVkIGFzCisgICAgLy8gdGhlIG1haW4gb25lLgorICAgIGlmIChyZWFkb25seSAmJiAhcGFydF9maWxlICYmIHBhcnRfaW5pdF9maWxlKSB7CisgICAgICAgIHBhcnRfZmlsZSA9IHBhcnRfaW5pdF9maWxlOworICAgICAgICBwYXJ0X2luaXRfZmlsZSA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UsIGEgfHBhcnRfZmlsZXwgb2YgJzx0ZW1wPicgbWVhbnMgYSB0ZW1wb3JhcnkKKyAgICAvLyBwYXJ0aXRpb24gaXMgbmVlZGVkLgorICAgIGlmIChwYXJ0X2ZpbGUgJiYgIXN0cmNtcChwYXJ0X2ZpbGUsICI8dGVtcD4iKSkgeworICAgICAgICBwYXJ0X2ZpbGUgPSBOVUxMOworICAgIH0KKworICAgIC8vIFZlcmlmeSBwYXJ0aXRpb24gdHlwZSwgb3IgcHJvYmUgaXQgaWYgbmVlZGVkLgorICAgIHsKKyAgICAgICAgLy8gRmlyc3QgZGV0ZXJtaW5lIHdoaWNoIGltYWdlIGZpbGUgdG8gcHJvYmUuCisgICAgICAgIGNvbnN0IGNoYXIqIGltYWdlX2ZpbGUgPSBOVUxMOworICAgICAgICBpZiAocGFydF9maWxlICYmIHN0YXRlLT5iYWNrZW5kLT5wYXRoRXhpc3RzKHBhcnRfZmlsZSkpIHsKKyAgICAgICAgICAgIGltYWdlX2ZpbGUgPSBwYXJ0X2ZpbGU7CisgICAgICAgIH0gZWxzZSBpZiAocGFydF9pbml0X2ZpbGUpIHsKKyAgICAgICAgICAgIGltYWdlX2ZpbGUgPSBwYXJ0X2luaXRfZmlsZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJ0X3R5cGUgPT0gQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uX2NvbmZpZ19lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIHR5cGUgb2YgJXMgcGFydGl0aW9uOiBubyBpbWFnZSBmaWxlcyEiLAorICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcnRfdHlwZSA9PSBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIlByb2JpbmcgJXMgaW1hZ2UgZmlsZSBmb3IgcGFydGl0aW9uIHR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLCBpbWFnZV9maWxlKTsKKworICAgICAgICAgICAgcGFydF90eXBlID0gc3RhdGUtPmJhY2tlbmQtPnByb2JlUGFydGl0aW9uRmlsZVR5cGUoaW1hZ2VfZmlsZSk7CisgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2VfZmlsZSkgeworICAgICAgICAgICAgLy8gUHJvYmUgdGhlIGN1cnJlbnQgaW1hZ2UgZmlsZSB0byBjaGVjayB0aGF0IGl0IGlzIG9mIHRoZQorICAgICAgICAgICAgLy8gcmlnaHQgcGFydGl0aW9uIGZvcm1hdC4KKyAgICAgICAgICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlIGltYWdlX3R5cGUgPQorICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+YmFja2VuZC0+cHJvYmVQYXJ0aXRpb25GaWxlVHlwZShpbWFnZV9maWxlKTsKKyAgICAgICAgICAgIGlmIChpbWFnZV90eXBlID09IEFORFJPSURfUEFSVElUSU9OX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25fY29uZmlnX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICJDYW5ub3QgZGV0ZXJtaW5lICVzIHBhcnRpdGlvbiB0eXBlIG9mOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUsIGltYWdlX2ZpbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW1hZ2VfdHlwZSAhPSBwYXJ0X3R5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaW1hZ2UgZmlsZSBleGlzdHMsIGJ1dCBpcyBub3QgaW4gdGhlIHByb3BlciBmb3JtYXQhCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGluIGNlcnRhaW4gY2FzZXMsIGUuZy4gYSBLaXRLYXQveDg2IEFWRAorICAgICAgICAgICAgICAgIC8vIGNyZWF0ZWQgd2l0aCBTREsgMjMuMC4yIGFuZCBzdGFydGVkIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyBlbXVsYXRvciB3aWxsIGNyZWF0ZSBhIGNhY2hlLmltZyBpbiAneWFmZnMyJworICAgICAgICAgICAgICAgIC8vIGZvcm1hdCwgd2hpbGUgdGhlIHN5c3RlbSByZWFsbHkgZXhwZWN0IGl0IHRvIGJlICdleHQ0JywKKyAgICAgICAgICAgICAgICAvLyBhcyBsaXN0ZWQgaW4gdGhlIHJhbWRpc2suaW1nLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVG8gd29yay1hcm91bmQgdGhlIHByb2JsZW0sIHNpbXBseSByZS1jcmVhdGUgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAvLyBieSB3aXBpbmcgaXQgd2hlbiBhbGxvd2VkLgorCisgICAgICAgICAgICAgICAgaWYgKHBhcnRfbW9kZSA9PSBBTkRST0lEX1BBUlRJVElPTl9PUEVOX01PREVfTVVTVF9FWElTVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uX2NvbmZpZ19lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAlcyBwYXJ0aXRpb24gaW1hZ2UgdHlwZTogJXMgKGV4cGVjdGVkICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKGltYWdlX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKHBhcnRfdHlwZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBWRVJCT1NFX1BSSU5UKGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1hZ2UgdHlwZSBtaXNtYXRjaCBmb3IgJXMgcGFydGl0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgKGV4cGVjdGVkICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkUGFydGl0aW9uVHlwZV90b1N0cmluZyhpbWFnZV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKHBhcnRfdHlwZSkpOworCisgICAgICAgICAgICAgICAgcGFydF9tb2RlID0gQU5EUk9JRF9QQVJUSVRJT05fT1BFTl9NT0RFX01VU1RfV0lQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIiVzIHBhcnRpdGlvbiBmb3JtYXQ6ICVzIiwgcGFydF9uYW1lLAorICAgICAgICAgICAgICAgICAgYW5kcm9pZFBhcnRpdGlvblR5cGVfdG9TdHJpbmcocGFydF90eXBlKSk7CisKKyAgICBib29sIG5lZWRfbWFrZV9lbXB0eSA9IChwYXJ0X21vZGUgPT0gQU5EUk9JRF9QQVJUSVRJT05fT1BFTl9NT0RFX01VU1RfV0lQRSk7CisKKyAgICAvLyBNdXN0IGJlIGhlcmUgdG8gYXZvaWQgZnJlZWluZyB0aGUgc3RyaW5nIHRvbyBlYXJseS4KKyAgICBzdGQ6OnN0cmluZyB0ZW1wRmlsZTsKKworICAgIGlmIChyZWFkb25seSkgeworICAgICAgICBpZiAoIXN0YXRlLT5iYWNrZW5kLT5wYXRoRXhpc3RzKHBhcnRfZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25fY29uZmlnX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIk1pc3NpbmcgcmVhZC1vbmx5ICVzIHBhcnRpdGlvbiBpbWFnZTogJXMiLAorICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUsIHBhcnRfZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgbmVlZF9tYWtlX2VtcHR5ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBuZWVkX3RlbXBfcGFydGl0aW9uID0gdHJ1ZTsKKworICAgICAgICBpZiAocGFydF9pbml0X2ZpbGUpIHsKKyAgICAgICAgICAgIG5lZWRfbWFrZV9lbXB0eSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFydF9maWxlKSB7CisgICAgICAgICAgICBpZiAoIXN0YXRlLT5iYWNrZW5kLT5wYXRoTG9ja0ZpbGUocGFydF9maWxlKSkgeworICAgICAgICAgICAgICAgIGR3YXJuaW5nKCIlcyBpbWFnZSBhbHJlYWR5IGluIHVzZSwgY2hhbmdlcyB3aWxsIG5vdCBwZXJzaXN0IVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZWVkX3RlbXBfcGFydGl0aW9uID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcGFydGl0aW9uIGltYWdlIGlzIG1pc3NpbmcsIGNyZWF0ZSBpdC4KKyAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLT5iYWNrZW5kLT5wYXRoRXhpc3RzKHBhcnRfZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRfbW9kZSA9PSBBTkRST0lEX1BBUlRJVElPTl9PUEVOX01PREVfTVVTVF9FWElTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbl9jb25maWdfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAiTWlzc2luZyAlcyBwYXJ0aXRpb24gaW1hZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLCBwYXJ0X2ZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGUtPmJhY2tlbmQtPnBhdGhFbXB0eUZpbGUocGFydF9maWxlKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25fY29uZmlnX2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIkNhbm5vdCBjcmVhdGUgJXMgaW1hZ2UgZmlsZSBhdCAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X25hbWUsIHBhcnRfZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZWVkX21ha2VfZW1wdHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERvIHdlIG5lZWQgYSB0ZW1wb3JhcnkgcGFydGl0aW9uIGltYWdlID8KKyAgICAgICAgaWYgKG5lZWRfdGVtcF9wYXJ0aXRpb24pIHsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmJhY2tlbmQtPnBhdGhDcmVhdGVUZW1wRmlsZSgmdGVtcEZpbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbl9jb25maWdfZXJyb3Ioc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcCBmaWxlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHBhcnRpdGlvbiBpbWFnZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFydF9maWxlID0gdGVtcEZpbGUuY19zdHIoKTsKKyAgICAgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIk1hcHBpbmcgJyVzJyBwYXJ0aXRpb24gaW1hZ2UgdG8gJXMiLCBwYXJ0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRfZmlsZSk7CisKKyAgICAgICAgICAgIG5lZWRfbWFrZV9lbXB0eSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIGluaXRpYWwgcGFydGl0aW9uIGZpbGUgaW50byB0aGUgcmVhbCBvbmU/CisgICAgICAgIGlmIChwYXJ0X2luaXRfZmlsZSkgeworICAgICAgICAgICAgaWYgKCFzdGF0ZS0+YmFja2VuZC0+cGF0aENvcHlGaWxlKHBhcnRfZmlsZSwgcGFydF9pbml0X2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbl9jb25maWdfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY29weSBpbml0aWFsICVzIHBhcnRpdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1hZ2UgdG8gcmVhbCBvbmU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmVlZF9tYWtlX2VtcHR5ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEbyB3ZSBuZWVkIHRvIG1ha2UgdGhlIHBhcnRpdGlvbiBpbWFnZSBlbXB0eT8KKyAgICBpZiAobmVlZF9tYWtlX2VtcHR5KSB7CisgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIkNyZWF0aW5nIGVtcHR5ICVzIHBhcnRpdGlvbiBpbWFnZSBhdDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcnRfbmFtZSwgcGFydF9maWxlKTsKKyAgICAgICAgaW50IHJldCA9IHN0YXRlLT5iYWNrZW5kLT5tYWtlRW1wdHlQYXJ0aXRpb24ocGFydF90eXBlLCBwYXJ0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRfZmlsZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uX2NvbmZpZ19lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUsICJDb3VsZCBub3QgY3JlYXRlICVzIGltYWdlIGZpbGUgYXQgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcGFydF9uYW1lLCBwYXJ0X2ZpbGUsIHN0cmVycm9yKC1yZXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICgqc3RhdGUtPnNldHVwX2Z1bmMpKHN0YXRlLT5zZXR1cF9vcGFxdWUsIHBhcnRfbmFtZSwgcGFydF9zaXplLCBwYXJ0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF90eXBlLCByZWFkb25seSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhbmRyb2lkX3BhcnRpdGlvbl9jb25maWd1cmF0aW9uX3NldHVwKAorICAgICAgICBjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICBBbmRyb2lkUGFydGl0aW9uU2V0dXBGdW5jdGlvbiBzZXR1cF9mdW5jLAorICAgICAgICB2b2lkKiBzZXR1cF9vcGFxdWUsCisgICAgICAgIGNoYXIqKiBlcnJvcl9tZXNzYWdlKSB7CisgICAgLy8gU2V0dXAgc2hhcmVkIHN0YXRlLgorICAgIFBhcnRpdGlvbkNvbmZpZ1N0YXRlIHN0YXRlWzFdID0ge3sKKyAgICAgICAgICAgIC5lcnJvcl9tZXNzYWdlID0gZXJyb3JfbWVzc2FnZSwKKyAgICAgICAgICAgIC5zZXR1cF9mdW5jID0gc2V0dXBfZnVuYywKKyAgICAgICAgICAgIC5zZXR1cF9vcGFxdWUgPSBzZXR1cF9vcGFxdWUsCisgICAgICAgICAgICAuYmFja2VuZCA9IFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQ6OmdldCgpLAorICAgIH19OworCisgICAgLy8gRGV0ZXJtaW5lIGZvcm1hdCBvZiBhbGwgcGFydGl0aW9uIGltYWdlcywgaWYgcG9zc2libGUuCisgICAgLy8gTm90ZSB0aGF0IF9VTktOT1dOIG1lYW5zIHRoZSBmaWxlLCBpZiBpdCBleGlzdHMsIHdpbGwgYmUgcHJvYmVkLgorICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlIHN5c3RlbV9wYXJ0aXRpb25fdHlwZSA9IEFORFJPSURfUEFSVElUSU9OX1RZUEVfVU5LTk9XTjsKKyAgICBBbmRyb2lkUGFydGl0aW9uVHlwZSB1c2VyZGF0YV9wYXJ0aXRpb25fdHlwZSA9CisgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV047CisgICAgQW5kcm9pZFBhcnRpdGlvblR5cGUgY2FjaGVfcGFydGl0aW9uX3R5cGUgPSBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV047CisKKyAgICB7CisgICAgICAgIC8vIFN0YXJ0aW5nIHdpdGggQW5kcm9pZCA0LjQueCwgdGhlIHJhbWRpc2suaW1nIGNvbnRhaW5zCisgICAgICAgIC8vIGFuIGZzdGFiLmdvbGRmaXNoIGZpbGUgdGhhdCBsaXN0cyB0aGUgZm9ybWF0IG9mIGVhY2ggcGFydGl0aW9uLgorICAgICAgICAvLyBJZiB0aGUgZmlsZSBleGlzdHMsIHBhcnNlIGl0IHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLgorICAgICAgICBzdGQ6OnN0cmluZyBmc3RhYjsKKworICAgICAgICBpZiAoc3RhdGUtPmJhY2tlbmQtPmV4dHJhY3RSYW1kaXNrRmlsZShjb25maWctPnJhbWRpc2tfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mc3RhYl9uYW1lLCAmZnN0YWIpKSB7CisgICAgICAgICAgICBWRVJCT1NFX1BSSU5UKGluaXQsICJSYW1kaXNrIGltYWdlIGNvbnRhaW5zICVzIGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZzdGFiX25hbWUpOworCisgICAgICAgICAgICBleHRyYWN0UGFydGl0aW9uRm9ybWF0KHN0YXRlLCBmc3RhYiwgInN5c3RlbSIsICIvc3lzdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5c3RlbV9wYXJ0aXRpb25fdHlwZSk7CisKKyAgICAgICAgICAgIGV4dHJhY3RQYXJ0aXRpb25Gb3JtYXQoc3RhdGUsIGZzdGFiLCAidXNlcmRhdGEiLCAiL2RhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlcmRhdGFfcGFydGl0aW9uX3R5cGUpOworCisgICAgICAgICAgICBleHRyYWN0UGFydGl0aW9uRm9ybWF0KHN0YXRlLCBmc3RhYiwgImNhY2hlIiwgIi9jYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZV9wYXJ0aXRpb25fdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWRVJCT1NFX1BSSU5UKGluaXQsICJObyAlcyBmaWxlIGluIHJhbWRpc2sgaW1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZzdGFiX25hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBzeXN0ZW0gcGFydGl0aW9uIGltYWdlLgorICAgIGlmICghYWRkTmFuZEltYWdlKAorICAgICAgICAgICAgICAgIHN0YXRlLCAic3lzdGVtIiwgc3lzdGVtX3BhcnRpdGlvbl90eXBlLAorICAgICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX09QRU5fTU9ERV9NVVNUX0VYSVNULAorICAgICAgICAgICAgICAgIGNvbmZpZy0+c3lzdGVtX3BhcnRpdGlvbi5zaXplLCBjb25maWctPnN5c3RlbV9wYXJ0aXRpb24ucGF0aCwKKyAgICAgICAgICAgICAgICBjb25maWctPnN5c3RlbV9wYXJ0aXRpb24uaW5pdF9wYXRoLCAhY29uZmlnLT53cml0YWJsZV9zeXN0ZW0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGRhdGEgcGFydGl0aW9uIGltYWdlLgorICAgIEFuZHJvaWRQYXJ0aXRpb25PcGVuTW9kZSB1c2VyZGF0YV9wYXJ0aXRpb25fbW9kZSA9IGNvbmZpZy0+d2lwZV9kYXRhID8KKyAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX09QRU5fTU9ERV9NVVNUX1dJUEUgOgorICAgICAgICAgICAgQU5EUk9JRF9QQVJUSVRJT05fT1BFTl9NT0RFX0NSRUFURV9JRl9ORUVERUQ7CisKKyAgICBpZiAoIWFkZE5hbmRJbWFnZShzdGF0ZSwgInVzZXJkYXRhIiwgdXNlcmRhdGFfcGFydGl0aW9uX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcmRhdGFfcGFydGl0aW9uX21vZGUsIGNvbmZpZy0+ZGF0YV9wYXJ0aXRpb24uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmRhdGFfcGFydGl0aW9uLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kYXRhX3BhcnRpdGlvbi5pbml0X3BhdGgsIGZhbHNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRXh0ZW5kIHRoZSB1c2VyZGF0YS1xZW11LmltZyB0byB0aGUgZGVzaXJlZCBzaXplIC0gcmVzaXplMmZzIGNhbiBvbmx5CisgICAgLy8gZXh0ZW5kIHBhcnRpdGlvbnMgdG8gZmlsbCBhdmFpbGFibGUgc3BhY2UuCisgICAgLy8gUmVzaXplIHVzZXJkYXRhLXFlbXUuaW1nIGlmIHRoZSBzaXplIGlzIHNtYWxsZXIgdGhhbiB3aGF0IGNvbmZpZy5pbmkKKyAgICAvLyBzYXlzLgorICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBhcyB1c2VyIHdhbnRzIGEgbGFyZ2VyIGRhdGEgcGFydGl0aW9uIHdpdGhvdXQgd2lwaW5nIGl0LgorICAgIC8vIGIuYW5kcm9pZC5jb20vMTk2OTI2CisgICAgU3lzdGVtOjpGaWxlU2l6ZSBjdXJyZW50X2RhdGFfc2l6ZShjb25maWctPmRhdGFfcGFydGl0aW9uLnNpemUpOworICAgIFN5c3RlbTo6Z2V0KCktPnBhdGhGaWxlU2l6ZShjb25maWctPmRhdGFfcGFydGl0aW9uLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X2RhdGFfc2l6ZSk7CisgICAgaWYgKChjb25maWctPndpcGVfZGF0YSB8fAorICAgICAgICAgY3VycmVudF9kYXRhX3NpemUgPCBjb25maWctPmRhdGFfcGFydGl0aW9uLnNpemUpICYmCisgICAgICAgIHVzZXJkYXRhX3BhcnRpdGlvbl90eXBlID09IEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCkgeworICAgICAgICBpZiAoY3VycmVudF9kYXRhX3NpemUgPCBjb25maWctPmRhdGFfcGFydGl0aW9uLnNpemUpIHsKKyAgICAgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJkYXRhIHBhcnRpdGlvbiBpcyByZXNpemVkIGZyb20gJWQgTSB0byAlZCBNXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2RhdGFfc2l6ZSAvICgxMDI0ICogMTAyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZGF0YV9wYXJ0aXRpb24uc2l6ZSAvICgxMDI0ICogMTAyNCkpOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5iYWNrZW5kLT5yZXNpemVFeHQ0UGFydGl0aW9uKGNvbmZpZy0+ZGF0YV9wYXJ0aXRpb24ucGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kYXRhX3BhcnRpdGlvbi5zaXplKTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGNhY2hlIHBhcnRpdGlvbiBpbWFnZSwgaWYgYW55LiBJdHMgdHlwZSBkZXBlbmRzIG9uIHRoZQorICAgIC8vIGtlcm5lbCB2ZXJzaW9uLiBGb3IgYW55dGhpbmcgPj0gMy4xMCwgaXQgbXVzdCBiZSBFWFQ0LCBvcgorICAgIC8vIFlBRkZTMiBvdGhlcndpc2UuCisgICAgaWYgKGNvbmZpZy0+Y2FjaGVfcGFydGl0aW9uLnBhdGgpIHsKKyAgICAgICAgaWYgKGNhY2hlX3BhcnRpdGlvbl90eXBlID09IEFORFJPSURfUEFSVElUSU9OX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgY2FjaGVfcGFydGl0aW9uX3R5cGUgPSBjb25maWctPmtlcm5lbF9zdXBwb3J0c195YWZmczIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQ7CisgICAgICAgIH0KKworICAgICAgICBBbmRyb2lkUGFydGl0aW9uT3Blbk1vZGUgY2FjaGVfcGFydGl0aW9uX21vZGUgPQorICAgICAgICAgICAgICAgIChjb25maWctPndpcGVfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgID8gQU5EUk9JRF9QQVJUSVRJT05fT1BFTl9NT0RFX01VU1RfV0lQRQorICAgICAgICAgICAgICAgICAgICAgICAgIDogQU5EUk9JRF9QQVJUSVRJT05fT1BFTl9NT0RFX0NSRUFURV9JRl9ORUVERUQpOworCisgICAgICAgIGlmICghYWRkTmFuZEltYWdlKHN0YXRlLCAiY2FjaGUiLCBjYWNoZV9wYXJ0aXRpb25fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfcGFydGl0aW9uX21vZGUsIGNvbmZpZy0+Y2FjaGVfcGFydGl0aW9uLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2FjaGVfcGFydGl0aW9uLnBhdGgsIE5VTEwsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX2NvbmZpZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWU3MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl9jb25maWcuaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gUG9pbnRlciB0byBhIGZ1bmN0aW9uIHVzZWQgdG8gc2V0dXAgYW4gZW11bGF0ZWQgTkFORCBwYXJ0aXRpb24gYXQgcnVudGltZS4KKy8vIFRoaXMgaXMgY2FsbGVkIGZyb20gd2l0aGluIGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZygpIGJlbG93LgorLy8gfG9wYXF1ZXwgaXMgdGhlIHxzZXR1cF9vcGFxdWV8IHBhcmFtZXRlciBmcm9tIGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZygpLgorLy8gfG5hbWV8IGlzIHRoZSBwYXJ0aXRpb24ncyBuYW1lIChlLmcuICdzeXN0ZW0nLCAndXNlcmRhdGEnIG9yICdjYWNoZScpCisvLyB8c2l6ZXwgaXMgaXRzIHNpemUgaW4gYnl0ZXMuCisvLyB8cGF0aHwgaXMgdGhlIGZpbGUgcGF0aCBmb3IgdGhlIHBhcnRpdGlvbiBpbWFnZS4KKy8vIHxmb3JtYXR8IGlzIHRoZSBwYXJ0aXRpb24ncyB0eXBlLgorLy8gfHJlYWRvbmx5fCBpcyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGltYWdlIGlzIHJlYWQtb25seS4KK3R5cGVkZWYgdm9pZCAoKkFuZHJvaWRQYXJ0aXRpb25TZXR1cEZ1bmN0aW9uKSh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFBhcnRpdGlvblR5cGUgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZG9ubHkpOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGEgZ2l2ZW4gcGFydGl0aW9uCisvLyBpbWFnZSBmaWxlIHRoYXQgd2lsbCBoYXZlIHRvIGJlIG1vdW50ZWQgYXQgcnVudGltZSBhcyBhIHZpcnR1YWwgTkFORAorLy8gZGV2aWNlIChRRU1VMSkgb3IgYSB2aXJ0aW8tYmxvY2sgb25lIChRRU1VMikuCisvLyB8c2l6ZXwgaXMgdGhlIHBhcnRpdGlvbiBzaXplIGluIGJ5dGVzLgorLy8gfHBhdGh8IGlzIHRoZSBwYXRoIHRvIHRoZSBmaWxlIGJhY2tpbmcgdGhlIHBhcnRpdGlvbiBpbWFnZSBkYXRhLgorLy8gfGluaXRfcGF0aHwgY2FuIGJlIE5VTEwsIG9yIHRoZSBwYXRoIHRvIHRoZSBpbml0aWFsaXphdGlvbiBjb250ZW50IGZvcgorLy8gdGhlIHBhcnRpdGlvbiBpbWFnZS4gSW4gb3RoZXIgd29yZHMsIGl0cyBjb250ZW50IHdpbGwgYmUgY29waWVkIGludG8gfHBhdGh8CisvLyBhdCBlbXVsYXRvciBzdGFydHVwLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IHNpemU7CisgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICBjb25zdCBjaGFyKiBpbml0X3BhdGg7Cit9IEFuZHJvaWRQYXJ0aXRpb25JbmZvOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGFsbCBwYXJ0aXRpb24gaW1hZ2UKKy8vIGZpbGVzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIG1vdW50ZWQgYXQgcnVudGltZS4KKy8vIHxyYW1kaXNrX3BhdGh8IGlzIHRoZSBwYXRoIHRvIHRoZSBBVkQncyByYW1kaXNrLmltZyBmaWxlLCB3aGljaCBpcyB1c2VkIHRvCisvLyBwYXJzZSBpdHMgJ2ZzdGFiJyBmaWxlIGFuZCBkZXRlcm1pbmUgZWFjaCBwYXJ0aXRpb24gZXhhY3QgdHlwZS4KKy8vIHxmc3RhYl9uYW1lfCBpcyB0aGUgbmFtZSBvZiB0aGUgJ2ZzdGFiJyBwYXRoIGluIHRoZSByYW1kaXNrLCB3aGljaAorLy8gaXMgYm9hcmQtZGVwZW5kZW50IChlLmcuICdmc3RhYi5nb2xkZmlzaCcgZm9yIFFFTVUxKS4KKy8vIHxzeXN0ZW1fcGFydGl0aW9ufCwgfHVzZXJkYXRhX3BhcnRpdGlvbnwgYW5kIHxjYWNoZV9wYXJ0aXRpb258IGFyZQorLy8gZGVzY3JpcHRvcnMgb2YgZWFjaCBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJ0aXRpb24uCisvLyB8a2VybmVsX3N1cHBvcnRzX3lhZmZzMnwgaXMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBrZXJuZWwgc3VwcG9ydHMgdGhlCisvLyBZQUZGUzIgZmlsZSBzeXN0ZW0uCisvLyB8d2lwZV9kYXRhfCBjYW4gYmUgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyZGF0YSBwYXJ0aXRpb24gbmVlZHMgdG8KKy8vIGJlIHdpcGVkLgorLy8gfHdyaXRhYmxlX3N5c3RlbXwgY2FuIGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdCBhIHdyaXRhYmxlIHN5c3RlbSBwYXJ0aXRpb24KKy8vIGlzIGRlc2lyZWQuIFRoaXMgbWF5IGNyZWF0ZSBhIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBzeXN0ZW0gcGFydGl0aW9uIGltYWdlLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHJhbWRpc2tfcGF0aDsKKyAgICBjb25zdCBjaGFyKiBmc3RhYl9uYW1lOworICAgIEFuZHJvaWRQYXJ0aXRpb25JbmZvIHN5c3RlbV9wYXJ0aXRpb247CisgICAgQW5kcm9pZFBhcnRpdGlvbkluZm8gZGF0YV9wYXJ0aXRpb247CisgICAgQW5kcm9pZFBhcnRpdGlvbkluZm8gY2FjaGVfcGFydGl0aW9uOworICAgIGJvb2wga2VybmVsX3N1cHBvcnRzX3lhZmZzMjsKKyAgICBib29sIHdpcGVfZGF0YTsKKyAgICBib29sIHdyaXRhYmxlX3N5c3RlbTsKK30gQW5kcm9pZFBhcnRpdGlvbkNvbmZpZ3VyYXRpb247CisKKy8vIFNldHVwIGVtdWxhdGVkIE5BTkQgcGFydGl0aW9uIGFjY29yZGluZyB0byBtaXNjIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKKy8vIHxjb25maWd1cmF0aW9ufCBpcyBhbiBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nCisvLyB0aGUgZW11bGF0ZWQgTkFORCBwYXJ0aXRpb25zLgorLy8gfHNldHVwX2Z1bmN8IGlzIGEgdXNlci1wcm92aWRlZCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisvLyBpbmZvcm1hdGlvbiByZWxldmFudCB0byBpbml0aWFsaXplIGVhY2ggdmlydHVhbCBOQU5EIGRpc2sgLyB2aXJ0aW8gYmxvY2suCisvLyB8c2V0dXBfb3BhcXVlfCBpcyBhIHVzZXItcHJvdmlkZWQgdmFsdWUgcGFzc2VkIGFzIHRoZSAxc3QgcGFyYW1ldGVyIGluCisvLyB8c2V0dXBfZnVuY3wgY2FsbHMuCisvLyBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZS4gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZCBzZXRzIHwqZXJyb3JfbWVzc2FnZXwKKy8vIHRvIGEgaHVtYW4tZnJpZW5kbHkgdXNlciBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIGVycm9yLiBmcmVlKCkgbXVzdCBiZSBjYWxsZWQKKy8vIGJ5IHRoZSB1c2VyIHRvIHJlbGVhc2UgaXQuCitib29sIGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZ3VyYXRpb25fc2V0dXAoCisgICAgICAgIGNvbnN0IEFuZHJvaWRQYXJ0aXRpb25Db25maWd1cmF0aW9uKiBjb25maWcsCisgICAgICAgIEFuZHJvaWRQYXJ0aXRpb25TZXR1cEZ1bmN0aW9uIHNldHVwX2Z1bmMsCisgICAgICAgIHZvaWQqIHNldHVwX29wYXF1ZSwKKyAgICAgICAgY2hhcioqIGVycm9yX21lc3NhZ2UpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fY29uZmlnX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI1ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl9jb25maWdfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzU5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9pbnRlcm5hbC9QYXJ0aXRpb25Db25maWdCYWNrZW5kLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZih4WzBdKSkKKworLy8gQSBzcGVjaWFsIGZpbGUgcGF0aCB1c2VkIGR1cmluZyB1bml0LXRlc3RpbmcgdGhhdCBjb3JyZXNwb25kcyB0bworLy8gYSBub24tZXhpc3RpbmcgZmlsZS4gU2VlIFRlc3RQYXJ0aXRpb25Db25maWdCYWNrZW5kOjpwYXRoRXhpc3RzKCkgYmVsb3cuCisjZGVmaW5lIERPRVNOVF9FWElTVF9QUkVGSVggIi9ET0VTX05PVF9FWElTVFMiCisKKy8vIEEgc3BlY2lhbCBmaWxlIHBhdGggdG8gaW5kaWNhdGUgYSBiYWQgcmFtZGlzay5pbWcgcGF0aC4KKy8vIFVzaW5nIHRoaXMgd2l0aCBleHRyYWN0UmFtZGlza0ZpbGUoKSBiZWxvdyB3aWxsIHJldHVybiBmYWxzZS4KK3N0YXRpYyBjb25zdCBjaGFyIGtCYWRSYW1kaXNrRmlsZVtdID0gIi9CQURfUkFNRElTSy5JTUciOworCisvLyBBIHNwZWNpYWwgZmlsZSBwYXRoIHRvIGluZGljYXRlIGEgcmFtZGlzay5pbWcgdGhhdCBjb250YWlucyBhbiBmc3RhYgorLy8gZmlsZSB0aGF0IHdpbGwKK3N0YXRpYyBjb25zdCBjaGFyIGtZYWZmc0ZzdGFiRmlsZVtdID0gImZzdGFiLnlhZmZzMiI7CisKKy8vIEZha2UgZnN0YWIgY29udGVudCBjb3JyZXNwb25kaW5nIHRvIHlhZmZzMiBwYXJ0aXRpb25zLgorc3RhdGljIGNvbnN0IGNoYXIga1lhZmZzRnN0YWJDb250ZW50W10gPSAieWFmZnMyIjsKKworLy8gQSBzcGVjaWFsIGZpbGUgcGF0aCBwcmVmaXggdGhhdCBjYW5ub3QgYmUgbG9ja2VkLgorLy8gVGhpcyBpcyBhIG1hY3JvIHRvIHVzZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBhdCBjb21waWxlIHRpbWUsCisvLyBlLmcuIENBTk5PVF9MT0NLX1BSRUZJWCAiMiIKKyNkZWZpbmUgQ0FOTk9UX0xPQ0tfUFJFRklYICIvQ0FOTk9UX0xPQ0tfRklMRSIKKworI2RlZmluZSBDQU5OT1RfQ09QWV9QUkVGSVggIi9DQU5OT1RfQ09QWSIKKworLy8gQSBzcGVjaWFsIGZpbGUgcGF0aCBwcmVmaXggY29ycmVzcG9uZGluZyB0byBhbiBZQUZGUzIgcGFydGl0aW9uLgorI2RlZmluZSBZQUZGU19QQVRIX1BSRUZJWCAiL1lBRkZTX0ZJTEUiCisKK3N0YXRpYyBib29sIHN0clN0YXJ0c1dpdGgoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgcmV0dXJuICFzdHJuY21wKHBhdGgsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpOworfQorCisvLyBCYXNlIHVuaXR0ZXN0IHZlcnNpb24gb2YgUGFydGl0aW9uQ29uZmlnQmFja2VuZCBpbnRlcmZhY2UuCisvLyBBbGwgbWV0aG9kcyByZXR1cm4gc3VjY2VzcywgYW5kIGV4dDQgYXMgdGhlIGRlZmF1bHQgcGFydGl0aW9uIHR5cGUuCitjbGFzcyBUZXN0UGFydGl0aW9uQ29uZmlnQmFja2VuZAorICAgICAgICA6IHB1YmxpYyBhbmRyb2lkOjppbnRlcm5hbDo6UGFydGl0aW9uQ29uZmlnQmFja2VuZCB7CitwdWJsaWM6CisgICAgVGVzdFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQoKQorICAgICAgICA6IG1QcmV2QmFja2VuZChudWxscHRyKSwgbUNvbW1hbmRzKCksIG1UZW1wQ291bnRlcigwKSB7CisgICAgICAgIC8vIFNhdmUgcHJldmlvdXMgYmFja2VuZCB0aGVuIGluamVjdCBzZWxmIGludG8gdGhlIHByb2Nlc3MuCisgICAgICAgIG1QcmV2QmFja2VuZCA9IFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQ6OnNldEZvclRlc3RpbmcodGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB+VGVzdFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQoKSB7CisgICAgICAgIC8vIFJlc3RvcmUgcHJldmlvdXMgYmFja2VuZC4KKyAgICAgICAgUGFydGl0aW9uQ29uZmlnQmFja2VuZDo6c2V0Rm9yVGVzdGluZyhtUHJldkJhY2tlbmQpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXRoRXhpc3RzKGNvbnN0IGNoYXIqIHBhdGgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKHN0clN0YXJ0c1dpdGgocGF0aCwgRE9FU05UX0VYSVNUX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aEVtcHR5RmlsZShjb25zdCBjaGFyKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIGFkZENvbW1hbmQoIkVNUFRZIFslc10iLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHBhdGhDb3B5RmlsZShjb25zdCBjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYykgb3ZlcnJpZGUgeworICAgICAgICBpZiAoc3RyU3RhcnRzV2l0aChzcmMsIENBTk5PVF9DT1BZX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhZGRDb21tYW5kKCJDT1BZIFslc10gPC0gWyVzXSIsIGRzdCwgc3JjKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHBhdGhMb2NrRmlsZShjb25zdCBjaGFyKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChzdHJTdGFydHNXaXRoKHBhdGgsIENBTk5PVF9MT0NLX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGFkZENvbW1hbmQoIkxPQ0sgWyVzXSIsIHBhdGgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGF0aENyZWF0ZVRlbXBGaWxlKHN0ZDo6c3RyaW5nKiBwYXRoKSBvdmVycmlkZSB7CisgICAgICAgIGNoYXIgdG1wWzIwMF07CisgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIvdG1wL3RlbXBmaWxlJWQiLCArK21UZW1wQ291bnRlcik7CisgICAgICAgICpwYXRoID0gdG1wOworICAgICAgICBhZGRDb21tYW5kKCJURU1QRklMRSBbJXNdIiwgdG1wKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBBbmRyb2lkUGFydGl0aW9uVHlwZSBwcm9iZVBhcnRpdGlvbkZpbGVUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoc3RyU3RhcnRzV2l0aChwYXRoLCBZQUZGU19QQVRIX1BSRUZJWCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0OworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBleHRyYWN0UmFtZGlza0ZpbGUoY29uc3QgY2hhciogcmFtZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoIXN0cmNtcChyYW1kaXNrX3BhdGgsIGtCYWRSYW1kaXNrRmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcChmaWxlX3BhdGgsIGtZYWZmc0ZzdGFiRmlsZSkpIHsKKyAgICAgICAgICAgICpvdXQgPSBrWWFmZnNGc3RhYkNvbnRlbnQ7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gIiI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBwYXJzZVBhcnRpdGlvbkZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgZnN0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vdW50UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHBhcnRpdGlvbkZvcm1hdCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoZnN0YWIgPT0ga1lhZmZzRnN0YWJDb250ZW50KSB7CisgICAgICAgICAgICAqcGFydGl0aW9uRm9ybWF0ID0gInlhZmZzMiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcGFydGl0aW9uRm9ybWF0ID0gImV4dDQiOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYWtlRW1wdHlQYXJ0aXRpb24oQW5kcm9pZFBhcnRpdGlvblR5cGUgcGFydGl0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcnRpdGlvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25QYXRoKSBvdmVycmlkZSB7CisgICAgICAgIGFkZENvbW1hbmQoIkVNUFRZX1BBUlRJVElPTiBmb3JtYXQ9JXMgc2l6ZT0lbGxkIFslc10iLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKHBhcnRpdGlvblR5cGUpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4ocGFydGl0aW9uU2l6ZSksCisgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uUGF0aCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFJlc2l6ZSBhbiBleGlzdGluZyBleHQ0IHBhcnRpdGlvbiBhdCB8cGFydGl0aW9uUGF0aHwgdG8gYSBuZXcKKyAgICAvLyBzaXplIGluIGJ5dGVzIGdpdmVuIGJ5IHxwYXJ0aXRpb25TaXplfC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXh0NFBhcnRpdGlvbihjb25zdCBjaGFyKiBwYXJ0aXRpb25QYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBhcnRpdGlvblNpemUpIG92ZXJyaWRlIHsKKyAgICAgICAgYWRkQ29tbWFuZCgiRVhUNF9SRVNJWkUgc2l6ZT0lbGxkIFslc10iLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4ocGFydGl0aW9uU2l6ZSksCisgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uUGF0aCk7CisgICAgfQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1hbmRzKCkgY29uc3QgeyByZXR1cm4gbUNvbW1hbmRzOyB9CisKK3ByaXZhdGU6CisgICAgdm9pZCBhZGRDb21tYW5kKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICAgICAgIGNoYXIqIHN0ciA9IE5VTEw7CisgICAgICAgIHZhX2xpc3QgYXJnczsKKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICAgICAgdmFzcHJpbnRmKCZzdHIsIGZtdCwgYXJncyk7CisgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgICAgbUNvbW1hbmRzICs9IHN0cjsKKyAgICAgICAgbUNvbW1hbmRzICs9ICJcbiI7CisgICAgICAgIGZyZWUoc3RyKTsKKyAgICB9CisKKyAgICBQYXJ0aXRpb25Db25maWdCYWNrZW5kKiBtUHJldkJhY2tlbmQ7CisgICAgc3RkOjpzdHJpbmcgbUNvbW1hbmRzOworICAgIGludCBtVGVtcENvdW50ZXI7Cit9OworCisvLyBBIGhlbHBlciBjbGFzcyB1c2VkIHRvIGNvbGxlY3QgdGhlIHZpcnR1YWwgTkFORCBwYXJ0aXRpb24gc2V0dXAKKy8vIHRoYXQgaXMgcGVyZm9ybWVkIGJ5IGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZ3VyYXRpb25fc2V0dXAoKS4KKy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSwgYW5kIHVzZSBpdHMgfHNldHVwUGFydGl0aW9ufCBtZXRob2QgYWRkcmVzcworLy8gYXMgdGhlIHxzZXR1cF9mdW5jfCBwYXJhbWV0ZXIsIGFuZCB8dGhpc3wgYXMgfHNldHVwX29wYXF1ZXwuCitjbGFzcyBQYXJ0aXRpb25Db2xsZWN0b3IgeworcHVibGljOgorICAgIC8vIFZpcnR1YWwgcGFydGl0aW9uIGluZm9ybWF0aW9uIGFmdGVyIHNldHVwLgorICAgIHN0cnVjdCBQYXJ0aXRpb24geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICB1aW50NjRfdCBzaXplOworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgICAgICBBbmRyb2lkUGFydGl0aW9uVHlwZSBmb3JtYXQ7CisgICAgICAgIGJvb2wgcmVhZG9ubHk7CisgICAgfTsKKworICAgIC8vIEFsbCB2aXJ0dWFsIHBhcnRpdGlvbnMsIGFzIGEgc2ltcGxlIHB1YmxpYyB2ZWN0b3IuCisgICAgc3RkOjp2ZWN0b3I8UGFydGl0aW9uPiBwYXJ0aXRpb25zOworCisgICAgLy8gQSBjYWxsYmFjayB1c2VkIGFzIGEgfHNldHVwX2Z1bmN8IHBhcmFtZXRlciB3aGVuIGNhbGxpbmcKKyAgICAvLyBhbmRyb2lkX3BhcnRpdGlvbl9jb25maWd1cmF0aW9uX3NldHVwKCkuIFVzZSB0aGUgaW5zdGFuY2UncyB8dGhpc3wKKyAgICAvLyB2YWx1ZSBhcyB8c2V0dXBfb3BhcXVlfC4KKyAgICBzdGF0aWMgdm9pZCBzZXR1cFBhcnRpdGlvbih2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZFBhcnRpdGlvblR5cGUgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZG9ubHkpIHsKKyAgICAgICAgYXV0byBjb2xsZWN0b3IgPSBzdGF0aWNfY2FzdDxQYXJ0aXRpb25Db2xsZWN0b3IqPihvcGFxdWUpOworCisgICAgICAgIFBhcnRpdGlvbiBwYXJ0OworICAgICAgICBwYXJ0Lm5hbWUgPSBuYW1lOworICAgICAgICBwYXJ0LnNpemUgPSBzaXplOworICAgICAgICBwYXJ0LnBhdGggPSBwYXRoOworICAgICAgICBwYXJ0LmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgcGFydC5yZWFkb25seSA9IHJlYWRvbmx5OworCisgICAgICAgIGNvbGxlY3Rvci0+cGFydGl0aW9ucy5wdXNoX2JhY2socGFydCk7CisgICAgfQorfTsKKworLy8gU2F2ZSBhIGxvdCBvZiB0eXBpbmcuCit0eXBlZGVmIFBhcnRpdGlvbkNvbGxlY3Rvcjo6UGFydGl0aW9uIFBhcnRpdGlvbjsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSByZXN1bHRzIG9mIGEgZ2l2ZW4gcGFydGl0aW9uIGNvbmZpZ3VyYXRpb24uCisvLyB8Y29uZmlnfCBpcyB0aGUgaW5wdXQgQW5kcm9pZFBhcnRpdGlvbkNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisvLyB8ZXhwZWN0ZWRDb21tYW5kc3wgaXMgdGhlIGV4cGVjdGVkIGNvbW1hbmRzIHN0cmluZy4KKy8vIHxleHBlY3RlZFBhcnRpdGlvbnN8IGlzIGFuIGFycmF5IG9mIGV4cGVjdGVkIFBhcnRpdGlvbiBkZXNjcmlwdG9ycy4KKy8vIHxleHBlY3RlZFBhcnRpdGlvbnNDb3VudHwgaXMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYXJyYXkuCitzdGF0aWMgdm9pZCBjaGVja0NvbmZpZyhjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRDb21tYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpdGlvbiogZXhwZWN0ZWRQYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGV4cGVjdGVkUGFydGl0aW9uc0NvdW50KSB7CisgICAgVGVzdFBhcnRpdGlvbkNvbmZpZ0JhY2tlbmQgdGVzdEJhY2tlbmQ7CisgICAgUGFydGl0aW9uQ29sbGVjdG9yIGNvbGxlY3RvcjsKKworICAgIGNoYXIqIGVycm9yX21lc3NhZ2UgPSBOVUxMOworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZ3VyYXRpb25fc2V0dXAoCisgICAgICAgICAgICBjb25maWcsIFBhcnRpdGlvbkNvbGxlY3Rvcjo6c2V0dXBQYXJ0aXRpb24sICZjb2xsZWN0b3IsCisgICAgICAgICAgICAmZXJyb3JfbWVzc2FnZSkpOworCisgICAgaWYgKGVycm9yX21lc3NhZ2UpIHsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCIiLCBlcnJvcl9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJ0aXRpb24+JiBwYXJ0aXRpb25zID0gY29sbGVjdG9yLnBhcnRpdGlvbnM7CisKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkUGFydGl0aW9uc0NvdW50LCBwYXJ0aXRpb25zLnNpemUoKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBleHBlY3RlZFBhcnRpdGlvbnNDb3VudDsgKytuKSB7CisgICAgICAgICAgICBjb25zdCBQYXJ0aXRpb24mIGV4cGVjdGVkID0gZXhwZWN0ZWRQYXJ0aXRpb25zW25dOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQubmFtZSwgcGFydGl0aW9uc1tuXS5uYW1lKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZC5zaXplLCBwYXJ0aXRpb25zW25dLnNpemUpOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBhdGgsIHBhcnRpdGlvbnNbbl0ucGF0aCkgPDwgIiMiIDw8IG47CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuZm9ybWF0LCBwYXJ0aXRpb25zW25dLmZvcm1hdCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucmVhZG9ubHksIHBhcnRpdGlvbnNbbl0ucmVhZG9ubHkpOworICAgICAgICB9CisgICAgfQorCisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkQ29tbWFuZHMsIHRlc3RCYWNrZW5kLmNvbW1hbmRzKCkuY19zdHIoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrRXJyb3JDb25maWcoY29uc3QgQW5kcm9pZFBhcnRpdGlvbkNvbmZpZ3VyYXRpb24qIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRDb21tYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRFcnJvcikgeworICAgIFRlc3RQYXJ0aXRpb25Db25maWdCYWNrZW5kIHRlc3RCYWNrZW5kOworICAgIFBhcnRpdGlvbkNvbGxlY3RvciBjb2xsZWN0b3I7CisKKyAgICBjaGFyKiBlcnJvcl9tZXNzYWdlID0gTlVMTDsKKyAgICBFWFBFQ1RfRkFMU0UoYW5kcm9pZF9wYXJ0aXRpb25fY29uZmlndXJhdGlvbl9zZXR1cCgKKyAgICAgICAgICAgIGNvbmZpZywgUGFydGl0aW9uQ29sbGVjdG9yOjpzZXR1cFBhcnRpdGlvbiwgJmNvbGxlY3RvciwKKyAgICAgICAgICAgICZlcnJvcl9tZXNzYWdlKSk7CisgICAgaWYgKCFlcnJvcl9tZXNzYWdlKSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGVycm9yX21lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIEVYUEVDVF9TVFJFUShleHBlY3RlZEVycm9yLCBlcnJvcl9tZXNzYWdlKTsKKyAgICAgICAgZnJlZShlcnJvcl9tZXNzYWdlKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWRDb21tYW5kcywgdGVzdEJhY2tlbmQuY29tbWFuZHMoKS5jX3N0cigpKTsKK30KKworVEVTVChQYXJ0aXRpb25Db25maWcsIG5vcm1hbFNldHVwKSB7CisgICAgc3RhdGljIGNvbnN0IEFuZHJvaWRQYXJ0aXRpb25Db25maWd1cmF0aW9uIGNvbmZpZyA9IHsKKyAgICAgICAgICAgIC5yYW1kaXNrX3BhdGggPSAiL2Zvby9yYW1kaXNrLmltZyIsCisgICAgICAgICAgICAuZnN0YWJfbmFtZSA9ICJmc3RhYi51bml0dGVzdCIsCisgICAgICAgICAgICAuc3lzdGVtX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDEyMzQ1NlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9ICIvaW1hZ2VzL3N5c3RlbS5pbWciLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmRhdGFfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gNDAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gIi9hdmQvdXNlcmRhdGEtcWVtdS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmNhY2hlX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDEwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL2NhY2hlLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAua2VybmVsX3N1cHBvcnRzX3lhZmZzMiA9IGZhbHNlLAorICAgICAgICAgICAgLndpcGVfZGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgLndyaXRhYmxlX3N5c3RlbSA9IGZhbHNlLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRDb21tYW5kc1tdID0KKyAgICAgICAgICAgICJMT0NLIFsvYXZkL3VzZXJkYXRhLXFlbXUuaW1nXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvY2FjaGUuaW1nXVxuIjsKKworICAgIHN0YXRpYyBjb25zdCBQYXJ0aXRpb25Db2xsZWN0b3I6OlBhcnRpdGlvbiBrRXhwZWN0ZWRQYXJ0aXRpb25zW10gPSB7CisgICAgICAgICAgICB7InN5c3RlbSIsIDEyMzQ1NlVMTCwgIi9pbWFnZXMvc3lzdGVtLmltZyIsCisgICAgICAgICAgICAgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LCB0cnVlfSwKKyAgICAgICAgICAgIHsidXNlcmRhdGEiLCA0MDAwMDBVTEwsICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiY2FjaGUiLCAxMDAwMDBVTEwsICIvYXZkL2NhY2hlLmltZyIsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCB3aXBlRGF0YSkgeworICAgIEFuZHJvaWRQYXJ0aXRpb25Db25maWd1cmF0aW9uIGNvbmZpZyA9IHsKKyAgICAgICAgICAgIC5yYW1kaXNrX3BhdGggPSAiL2Zvby9yYW1kaXNrLmltZyIsCisgICAgICAgICAgICAuZnN0YWJfbmFtZSA9ICJmc3RhYi51bml0dGVzdCIsCisgICAgICAgICAgICAuc3lzdGVtX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDEyMzQ1NlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL3N5c3RlbS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmRhdGFfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gNDAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gIi9hdmQvdXNlcmRhdGEtcWVtdS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSAiL2ltYWdlcy91c2VyZGF0YS5pbWciLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmNhY2hlX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDEwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL2NhY2hlLmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAua2VybmVsX3N1cHBvcnRzX3lhZmZzMiA9IGZhbHNlLAorICAgICAgICAgICAgLndpcGVfZGF0YSA9IHRydWUsCisgICAgICAgICAgICAud3JpdGFibGVfc3lzdGVtID0gZmFsc2UsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPQorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvdXNlcmRhdGEtcWVtdS5pbWddXG4iCisgICAgICAgICAgICAiQ09QWSBbL2F2ZC91c2VyZGF0YS1xZW11LmltZ10gPC0gWy9pbWFnZXMvdXNlcmRhdGEuaW1nXVxuIgorICAgICAgICAgICAgIkVYVDRfUkVTSVpFIHNpemU9NDAwMDAwIFsvYXZkL3VzZXJkYXRhLXFlbXUuaW1nXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvY2FjaGUuaW1nXVxuIgorICAgICAgICAgICAgIkVNUFRZX1BBUlRJVElPTiBmb3JtYXQ9ZXh0NCBzaXplPTEwMDAwMCBbL2F2ZC9jYWNoZS5pbWddXG4iOworCisgICAgc3RhdGljIGNvbnN0IFBhcnRpdGlvbiBrRXhwZWN0ZWRQYXJ0aXRpb25zWzNdID0geworICAgICAgICAgICAgeyJzeXN0ZW0iLCAxMjM0NTZVTEwsICIvYXZkL3N5c3RlbS5pbWciLAorICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwgdHJ1ZX0sCisgICAgICAgICAgICB7InVzZXJkYXRhIiwgNDAwMDAwVUxMLCAiL2F2ZC91c2VyZGF0YS1xZW11LmltZyIsCisgICAgICAgICAgICAgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LCBmYWxzZX0sCisgICAgICAgICAgICB7ImNhY2hlIiwgMTAwMDAwVUxMLCAiL2F2ZC9jYWNoZS5pbWciLCBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsCisgICAgICAgICAgICAgZmFsc2V9LAorICAgIH07CisKKyAgICBjb25zdCBzaXplX3Qga0V4cGVjdGVkUGFydGl0aW9uc1NpemUgPSBBUlJBWV9TSVpFKGtFeHBlY3RlZFBhcnRpdGlvbnMpOworCisgICAgY2hlY2tDb25maWcoJmNvbmZpZywga0V4cGVjdGVkQ29tbWFuZHMsIGtFeHBlY3RlZFBhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAga0V4cGVjdGVkUGFydGl0aW9uc1NpemUpOworfQorCitURVNUKFBhcnRpdGlvbkNvbmZpZywgd3JpdGFibGVTeXN0ZW0pIHsKKyAgICBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSAiL2ltYWdlcy9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kYXRhX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDQwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5jYWNoZV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC9jYWNoZS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmtlcm5lbF9zdXBwb3J0c195YWZmczIgPSBmYWxzZSwKKyAgICAgICAgICAgIC53aXBlX2RhdGEgPSBmYWxzZSwKKyAgICAgICAgICAgIC53cml0YWJsZV9zeXN0ZW0gPSB0cnVlLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRDb21tYW5kc1tdID0KKyAgICAgICAgICAgICJURU1QRklMRSBbL3RtcC90ZW1wZmlsZTFdXG4iCisgICAgICAgICAgICAiQ09QWSBbL3RtcC90ZW1wZmlsZTFdIDwtIFsvaW1hZ2VzL3N5c3RlbS5pbWddXG4iCisgICAgICAgICAgICAiTE9DSyBbL2F2ZC91c2VyZGF0YS1xZW11LmltZ11cbiIKKyAgICAgICAgICAgICJMT0NLIFsvYXZkL2NhY2hlLmltZ11cbiI7CisKKyAgICBzdGF0aWMgY29uc3QgUGFydGl0aW9uIGtFeHBlY3RlZFBhcnRpdGlvbnNbM10gPSB7CisgICAgICAgICAgICB7InN5c3RlbSIsIDEyMzQ1NlVMTCwgIi90bXAvdGVtcGZpbGUxIiwgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICAgICAgICAgIHsidXNlcmRhdGEiLCA0MDAwMDBVTEwsICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiY2FjaGUiLCAxMDAwMDBVTEwsICIvYXZkL2NhY2hlLmltZyIsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCBwZXJzaXN0ZW50V3JpdGFibGVTeXN0ZW0pIHsKKyAgICBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kYXRhX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDQwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gIi9pbWFnZXMvdXNlcmRhdGEuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5jYWNoZV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC9jYWNoZS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmtlcm5lbF9zdXBwb3J0c195YWZmczIgPSBmYWxzZSwKKyAgICAgICAgICAgIC53aXBlX2RhdGEgPSB0cnVlLAorICAgICAgICAgICAgLndyaXRhYmxlX3N5c3RlbSA9IHRydWUsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPQorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvc3lzdGVtLmltZ11cbiIKKyAgICAgICAgICAgICJMT0NLIFsvYXZkL3VzZXJkYXRhLXFlbXUuaW1nXVxuIgorICAgICAgICAgICAgIkNPUFkgWy9hdmQvdXNlcmRhdGEtcWVtdS5pbWddIDwtIFsvaW1hZ2VzL3VzZXJkYXRhLmltZ11cbiIKKyAgICAgICAgICAgICJFWFQ0X1JFU0laRSBzaXplPTQwMDAwMCBbL2F2ZC91c2VyZGF0YS1xZW11LmltZ11cbiIKKyAgICAgICAgICAgICJMT0NLIFsvYXZkL2NhY2hlLmltZ11cbiIKKyAgICAgICAgICAgICJFTVBUWV9QQVJUSVRJT04gZm9ybWF0PWV4dDQgc2l6ZT0xMDAwMDAgWy9hdmQvY2FjaGUuaW1nXVxuIjsKKworICAgIHN0YXRpYyBjb25zdCBQYXJ0aXRpb24ga0V4cGVjdGVkUGFydGl0aW9uc1szXSA9IHsKKyAgICAgICAgICAgIHsic3lzdGVtIiwgMTIzNDU2VUxMLCAiL2F2ZC9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsidXNlcmRhdGEiLCA0MDAwMDBVTEwsICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiY2FjaGUiLCAxMDAwMDBVTEwsICIvYXZkL2NhY2hlLmltZyIsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCBwZXJzaXN0ZW50V3JpdGFibGVTeXN0ZW1XaXRoV2lwZURhdGEpIHsKKyAgICBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gIi9pbWFnZXMvc3lzdGVtLmltZyIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZGF0YV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSA0MDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC91c2VyZGF0YS1xZW11LmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9ICIvaW1hZ2VzL3VzZXJkYXRhLmltZyIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuY2FjaGVfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gMTAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gIi9hdmQvY2FjaGUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5rZXJuZWxfc3VwcG9ydHNfeWFmZnMyID0gZmFsc2UsCisgICAgICAgICAgICAud2lwZV9kYXRhID0gdHJ1ZSwKKyAgICAgICAgICAgIC53cml0YWJsZV9zeXN0ZW0gPSB0cnVlLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRDb21tYW5kc1tdID0KKyAgICAgICAgICAgICJMT0NLIFsvYXZkL3N5c3RlbS5pbWddXG4iCisgICAgICAgICAgICAiQ09QWSBbL2F2ZC9zeXN0ZW0uaW1nXSA8LSBbL2ltYWdlcy9zeXN0ZW0uaW1nXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvdXNlcmRhdGEtcWVtdS5pbWddXG4iCisgICAgICAgICAgICAiQ09QWSBbL2F2ZC91c2VyZGF0YS1xZW11LmltZ10gPC0gWy9pbWFnZXMvdXNlcmRhdGEuaW1nXVxuIgorICAgICAgICAgICAgIkVYVDRfUkVTSVpFIHNpemU9NDAwMDAwIFsvYXZkL3VzZXJkYXRhLXFlbXUuaW1nXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvY2FjaGUuaW1nXVxuIgorICAgICAgICAgICAgIkVNUFRZX1BBUlRJVElPTiBmb3JtYXQ9ZXh0NCBzaXplPTEwMDAwMCBbL2F2ZC9jYWNoZS5pbWddXG4iOworCisgICAgc3RhdGljIGNvbnN0IFBhcnRpdGlvbiBrRXhwZWN0ZWRQYXJ0aXRpb25zWzNdID0geworICAgICAgICAgICAgeyJzeXN0ZW0iLCAxMjM0NTZVTEwsICIvYXZkL3N5c3RlbS5pbWciLAorICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwgZmFsc2V9LAorICAgICAgICAgICAgeyJ1c2VyZGF0YSIsIDQwMDAwMFVMTCwgIi9hdmQvdXNlcmRhdGEtcWVtdS5pbWciLAorICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwgZmFsc2V9LAorICAgICAgICAgICAgeyJjYWNoZSIsIDEwMDAwMFVMTCwgIi9hdmQvY2FjaGUuaW1nIiwgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LAorICAgICAgICAgICAgIGZhbHNlfSwKKyAgICB9OworCisgICAgY29uc3Qgc2l6ZV90IGtFeHBlY3RlZFBhcnRpdGlvbnNTaXplID0gQVJSQVlfU0laRShrRXhwZWN0ZWRQYXJ0aXRpb25zKTsKKworICAgIGNoZWNrQ29uZmlnKCZjb25maWcsIGtFeHBlY3RlZENvbW1hbmRzLCBrRXhwZWN0ZWRQYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgIGtFeHBlY3RlZFBhcnRpdGlvbnNTaXplKTsKK30KKworVEVTVChQYXJ0aXRpb25Db25maWcsIExvY2tlZEZpbGVzKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0xvY2tlZERhdGFGaWxlW10gPSBDQU5OT1RfTE9DS19QUkVGSVggIl9kYXRhIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrTG9ja2VkU3lzdGVtRmlsZVtdID0gQ0FOTk9UX0xPQ0tfUFJFRklYICJfc3lzdGVtIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrTG9ja2VkQ2FjaGVGaWxlW10gPSBDQU5OT1RfTE9DS19QUkVGSVggIl9jYWNoZSI7CisKKyAgICBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBrTG9ja2VkU3lzdGVtRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gIi9pbWFnZXMvc3lzdGVtLmltZyIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZGF0YV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSA0MDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBrTG9ja2VkRGF0YUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuY2FjaGVfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gMTAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0ga0xvY2tlZENhY2hlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5rZXJuZWxfc3VwcG9ydHNfeWFmZnMyID0gZmFsc2UsCisgICAgICAgICAgICAud2lwZV9kYXRhID0gZmFsc2UsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPQorICAgICAgICAgICAgIlRFTVBGSUxFIFsvdG1wL3RlbXBmaWxlMV1cbiIKKyAgICAgICAgICAgICJFTVBUWV9QQVJUSVRJT04gZm9ybWF0PWV4dDQgc2l6ZT00MDAwMDAgWy90bXAvdGVtcGZpbGUxXVxuIgorICAgICAgICAgICAgIlRFTVBGSUxFIFsvdG1wL3RlbXBmaWxlMl1cbiIKKyAgICAgICAgICAgICJFTVBUWV9QQVJUSVRJT04gZm9ybWF0PWV4dDQgc2l6ZT0xMDAwMDAgWy90bXAvdGVtcGZpbGUyXVxuIjsKKworICAgIHN0YXRpYyBjb25zdCBQYXJ0aXRpb24ga0V4cGVjdGVkUGFydGl0aW9uc1szXSA9IHsKKyAgICAgICAgICAgIHsic3lzdGVtIiwgMTIzNDU2VUxMLCBrTG9ja2VkU3lzdGVtRmlsZSwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIHRydWV9LAorICAgICAgICAgICAgeyJ1c2VyZGF0YSIsIDQwMDAwMFVMTCwgIi90bXAvdGVtcGZpbGUxIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiY2FjaGUiLCAxMDAwMDBVTEwsICIvdG1wL3RlbXBmaWxlMiIsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCBNaXNzaW5nRGF0YVBhcnRpdGlvbikgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtNaXNzaW5nRGF0YUZpbGVbXSA9IERPRVNOVF9FWElTVF9QUkVGSVggIl9kYXRhIjsKKworICAgIHN0YXRpYyBjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSAiL2ltYWdlcy9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kYXRhX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDQwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9IGtNaXNzaW5nRGF0YUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuY2FjaGVfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gMTAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gIi9hdmQvY2FjaGUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5rZXJuZWxfc3VwcG9ydHNfeWFmZnMyID0gZmFsc2UsCisgICAgICAgICAgICAud2lwZV9kYXRhID0gZmFsc2UsCisgICAgICAgICAgICAud3JpdGFibGVfc3lzdGVtID0gZmFsc2UsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPQorICAgICAgICAgICAgIkxPQ0sgWy9ET0VTX05PVF9FWElTVFNfZGF0YV1cbiIKKyAgICAgICAgICAgICJFTVBUWSBbL0RPRVNfTk9UX0VYSVNUU19kYXRhXVxuIgorICAgICAgICAgICAgIkVNUFRZX1BBUlRJVElPTiBmb3JtYXQ9ZXh0NCBzaXplPTQwMDAwMCBbL0RPRVNfTk9UX0VYSVNUU19kYXRhXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvY2FjaGUuaW1nXVxuIjsKKworICAgIHN0YXRpYyBjb25zdCBQYXJ0aXRpb24ga0V4cGVjdGVkUGFydGl0aW9uc1szXSA9IHsKKyAgICAgICAgICAgIHsic3lzdGVtIiwgMTIzNDU2VUxMLCAiL2ltYWdlcy9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIHRydWV9LAorICAgICAgICAgICAgeyJ1c2VyZGF0YSIsIDQwMDAwMFVMTCwga01pc3NpbmdEYXRhRmlsZSwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIGZhbHNlfSwKKyAgICAgICAgICAgIHsiY2FjaGUiLCAxMDAwMDBVTEwsICIvYXZkL2NhY2hlLmltZyIsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCBNaXNzaW5nU3lzdGVtUGFydGl0aW9uKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga01pc3NpbmdTeXN0ZW1GaWxlW10gPSBET0VTTlRfRVhJU1RfUFJFRklYICJfc3lzdGVtIjsKKworICAgIHN0YXRpYyBjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBrTWlzc2luZ1N5c3RlbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuZGF0YV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSA0MDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC91c2VyZGF0YS1xZW11LmltZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluaXRfcGF0aCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAuY2FjaGVfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplID0gMTAwMDAwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gIi9hdmQvY2FjaGUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5rZXJuZWxfc3VwcG9ydHNfeWFmZnMyID0gZmFsc2UsCisgICAgICAgICAgICAud2lwZV9kYXRhID0gZmFsc2UsCisgICAgICAgICAgICAud3JpdGFibGVfc3lzdGVtID0gZmFsc2UsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPSAiIjsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZEVycm9yW10gPQorICAgICAgICAgICAgIk1pc3NpbmcgcmVhZC1vbmx5IHN5c3RlbSBwYXJ0aXRpb24gaW1hZ2U6IC9ET0VTX05PVF9FWElTVFNfc3lzdGVtIjsKKworICAgIGNoZWNrRXJyb3JDb25maWcoJmNvbmZpZywga0V4cGVjdGVkQ29tbWFuZHMsIGtFeHBlY3RlZEVycm9yKTsKK30KKworVEVTVChQYXJ0aXRpb25Db25maWcsIE1pc3NpbmdDYWNoZUZpbGUpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrTWlzc2luZ0NhY2hlRmlsZVtdID0gRE9FU05UX0VYSVNUX1BSRUZJWCAiX2NhY2hlIjsKKworICAgIHN0YXRpYyBjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBjb25maWcgPSB7CisgICAgICAgICAgICAucmFtZGlza19wYXRoID0gIi9mb28vcmFtZGlzay5pbWciLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIudW5pdHRlc3QiLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSAiL2ltYWdlcy9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kYXRhX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDQwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9ICIvYXZkL3VzZXJkYXRhLXFlbXUuaW1nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5jYWNoZV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBrTWlzc2luZ0NhY2hlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5rZXJuZWxfc3VwcG9ydHNfeWFmZnMyID0gZmFsc2UsCisgICAgICAgICAgICAud2lwZV9kYXRhID0gZmFsc2UsCisgICAgICAgICAgICAud3JpdGFibGVfc3lzdGVtID0gZmFsc2UsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZENvbW1hbmRzW10gPQorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvdXNlcmRhdGEtcWVtdS5pbWddXG4iCisgICAgICAgICAgICAiTE9DSyBbL0RPRVNfTk9UX0VYSVNUU19jYWNoZV1cbiIKKyAgICAgICAgICAgICJFTVBUWSBbL0RPRVNfTk9UX0VYSVNUU19jYWNoZV1cbiIKKyAgICAgICAgICAgICJFTVBUWV9QQVJUSVRJT04gZm9ybWF0PWV4dDQgc2l6ZT0xMDAwMDAgIgorICAgICAgICAgICAgIlsvRE9FU19OT1RfRVhJU1RTX2NhY2hlXVxuIjsKKworICAgIHN0YXRpYyBjb25zdCBQYXJ0aXRpb24ga0V4cGVjdGVkUGFydGl0aW9uc1szXSA9IHsKKyAgICAgICAgICAgIHsic3lzdGVtIiwgMTIzNDU2VUxMLCAiL2ltYWdlcy9zeXN0ZW0uaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQsIHRydWV9LAorICAgICAgICAgICAgeyJ1c2VyZGF0YSIsIDQwMDAwMFVMTCwgIi9hdmQvdXNlcmRhdGEtcWVtdS5pbWciLAorICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwgZmFsc2V9LAorICAgICAgICAgICAgeyJjYWNoZSIsIDEwMDAwMFVMTCwga01pc3NpbmdDYWNoZUZpbGUsIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICBmYWxzZX0sCisgICAgfTsKKworICAgIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSA9IEFSUkFZX1NJWkUoa0V4cGVjdGVkUGFydGl0aW9ucyk7CisKKyAgICBjaGVja0NvbmZpZygmY29uZmlnLCBrRXhwZWN0ZWRDb21tYW5kcywga0V4cGVjdGVkUGFydGl0aW9ucywKKyAgICAgICAgICAgICAgICBrRXhwZWN0ZWRQYXJ0aXRpb25zU2l6ZSk7Cit9CisKK1RFU1QoUGFydGl0aW9uQ29uZmlnLCBZYWZmczJQYXJ0aXRpb25zKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1lhZmZzU3lzdGVtSW1hZ2VbXSA9IFlBRkZTX1BBVEhfUFJFRklYICJfc3lzdGVtIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrWWFmZnNEYXRhSW1hZ2VbXSA9IFlBRkZTX1BBVEhfUFJFRklYICJfZGF0YSI7CisKKyAgICBzdGF0aWMgY29uc3QgQW5kcm9pZFBhcnRpdGlvbkNvbmZpZ3VyYXRpb24gY29uZmlnID0geworICAgICAgICAgICAgLnJhbWRpc2tfcGF0aCA9ICIvZm9vL3JhbWRpc2suaW1nIiwKKyAgICAgICAgICAgIC5mc3RhYl9uYW1lID0ga1lhZmZzRnN0YWJGaWxlLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMjM0NTZVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSBrWWFmZnNTeXN0ZW1JbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5kYXRhX3BhcnRpdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2l6ZSA9IDQwMDAwMFVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aCA9IGtZYWZmc0RhdGFJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5pdF9wYXRoID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5jYWNoZV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUgPSAxMDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhdGggPSAiL2F2ZC9jYWNoZS5pbWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmtlcm5lbF9zdXBwb3J0c195YWZmczIgPSB0cnVlLAorICAgICAgICAgICAgLndpcGVfZGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgLndyaXRhYmxlX3N5c3RlbSA9IGZhbHNlLAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRDb21tYW5kc1tdID0KKyAgICAgICAgICAgICJMT0NLIFsvWUFGRlNfRklMRV9kYXRhXVxuIgorICAgICAgICAgICAgIkxPQ0sgWy9hdmQvY2FjaGUuaW1nXVxuIgorICAgICAgICAgICAgIkVNUFRZX1BBUlRJVElPTiBmb3JtYXQ9eWFmZnMyIHNpemU9MTAwMDAwIFsvYXZkL2NhY2hlLmltZ11cbiI7CisKKyAgICBzdGF0aWMgY29uc3QgUGFydGl0aW9uQ29sbGVjdG9yOjpQYXJ0aXRpb24ga0V4cGVjdGVkUGFydGl0aW9uc1tdID0geworICAgICAgICAgICAgeyJzeXN0ZW0iLCAxMjM0NTZVTEwsIGtZYWZmc1N5c3RlbUltYWdlLAorICAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyLCB0cnVlfSwKKyAgICAgICAgICAgIHsidXNlcmRhdGEiLCA0MDAwMDBVTEwsIGtZYWZmc0RhdGFJbWFnZSwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMiwgZmFsc2V9LAorICAgICAgICAgICAgeyJjYWNoZSIsIDEwMDAwMFVMTCwgIi9hdmQvY2FjaGUuaW1nIiwKKyAgICAgICAgICAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMiwgZmFsc2V9LAorICAgIH07CisKKyAgICBjb25zdCBzaXplX3Qga0V4cGVjdGVkUGFydGl0aW9uc1NpemUgPSBBUlJBWV9TSVpFKGtFeHBlY3RlZFBhcnRpdGlvbnMpOworCisgICAgY2hlY2tDb25maWcoJmNvbmZpZywga0V4cGVjdGVkQ29tbWFuZHMsIGtFeHBlY3RlZFBhcnRpdGlvbnMsCisgICAgICAgICAgICAgICAga0V4cGVjdGVkUGFydGl0aW9uc1NpemUpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ1OWNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5jcHAKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy9leHQ0X3V0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYW5pYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKworbmFtZXNwYWNlIHsKKworY29uc3Qgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlIHZhbHVlOworfSBrUGFydGl0aW9uVHlwZU1hcFtdID0geworICAgIHsgInVua25vd24iLCBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04gfSwKKyAgICB7ICJ5YWZmczIiLCBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMiB9LAorICAgIHsgImV4dDQiLCBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQgfSwKK307CisKK2NvbnN0IHNpemVfdCBrUGFydGl0aW9uVHlwZU1hcFNpemUgPQorICAgICAgICBzaXplb2Yoa1BhcnRpdGlvblR5cGVNYXApIC8gc2l6ZW9mKGtQYXJ0aXRpb25UeXBlTWFwWzBdKTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IGNoYXIqIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKEFuZHJvaWRQYXJ0aXRpb25UeXBlIHBhcnRfdHlwZSkgeworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga1BhcnRpdGlvblR5cGVNYXBTaXplOyArK24pIHsKKyAgICAgICAgaWYgKGtQYXJ0aXRpb25UeXBlTWFwW25dLnZhbHVlID09IHBhcnRfdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGtQYXJ0aXRpb25UeXBlTWFwW25dLm5hbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQVBBTklDKCJJbnZhbGlkIHBhcnRpdGlvbiB0eXBlIHZhbHVlICVkIiwgcGFydF90eXBlKTsKKyAgICByZXR1cm4gInVua25vd24iOworfQorCitBbmRyb2lkUGFydGl0aW9uVHlwZSBhbmRyb2lkUGFydGl0aW9uVHlwZV9mcm9tU3RyaW5nKGNvbnN0IGNoYXIqIHBhcnRfdHlwZSkgeworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga1BhcnRpdGlvblR5cGVNYXBTaXplOyArK24pIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoa1BhcnRpdGlvblR5cGVNYXBbbl0ubmFtZSwgcGFydF90eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGtQYXJ0aXRpb25UeXBlTWFwW25dLnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV047Cit9CisKK0FuZHJvaWRQYXJ0aXRpb25UeXBlIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3Byb2JlRmlsZShjb25zdCBjaGFyKiBpbWFnZV9maWxlKSB7CisgICAgaWYgKCFwYXRoX2V4aXN0cyhpbWFnZV9maWxlKSkgeworICAgICAgICByZXR1cm4gQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9VTktOT1dOOworICAgIH0KKyAgICBpZiAoYW5kcm9pZF9wYXRoSXNFeHQ0UGFydGl0aW9uSW1hZ2UoaW1hZ2VfZmlsZSkpIHsKKyAgICAgICAgcmV0dXJuIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNDsKKyAgICB9CisgICAgLy8gQXNzdW1lIFlBRkZTMiwgc2luY2UgdGhlcmUgaXMgbGl0dGxlIHdheSB0byBiZSBzdXJlIGZvciBub3cuCisgICAgLy8gTk9URTogQW4gZW1wdHkgZmlsZSBpcyBhIHZhbGlkIFlhZmZzMiBmaWxlIQorICAgIHJldHVybiBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMjsKK30KKworCitpbnQgYW5kcm9pZFBhcnRpdGlvblR5cGVfbWFrZUVtcHR5RmlsZShBbmRyb2lkUGFydGl0aW9uVHlwZSBwYXJ0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwYXJ0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0X2ZpbGUpIHsKKyAgICBzd2l0Y2ggKHBhcnRfdHlwZSkgeworICAgICAgICBjYXNlIEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyOgorICAgICAgICAgICAgLy8gQW55IGVtcHR5IGZpbGUgaXMgYSB2YWxpZCBZQUZGUzIgcGFydGl0aW9uLCB8cGFydF9zaXplfAorICAgICAgICAgICAgLy8gY2FuIGJlIGlnbm9yZWQgaGVyZS4KKyAgICAgICAgICAgIGlmIChwYXRoX2VtcHR5X2ZpbGUocGFydF9maWxlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQ6CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZF9jcmVhdGVFbXB0eUV4dDRJbWFnZShwYXJ0X2ZpbGUsIHBhcnRfc2l6ZSwgTlVMTCk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fdHlwZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmEyZGMyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIExpc3Qgb2Ygc3VwcG9ydGVkIEFuZHJvaWQgcGFydGl0aW9uIGltYWdlIHR5cGVzLgordHlwZWRlZiBlbnVtIHsKKyAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04gPSAwLAorICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyID0gMSwKKyAgICBBTkRST0lEX1BBUlRJVElPTl9UWVBFX0VYVDQgPSAyLAorfSBBbmRyb2lkUGFydGl0aW9uVHlwZTsKKworLy8gUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHBhcnRpdGlvbiB0eXBlIHRvIHRoZSBjYWxsZXIuCisvLyBOb3RlOiB0aGlzIHdpbGwgcGFuaWMgaWYgfHBhcnRfdHlwZXwgaXMgYW4gaW52YWxpZCB2YWx1ZS4KK2NvbnN0IGNoYXIqIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKEFuZHJvaWRQYXJ0aXRpb25UeXBlIHBhcnRfdHlwZSk7CisKKy8vIFJldHVybiBhbiBBbmRyb2lkUGFydGl0aW9uVHlwZSBmcm9tIGEgc3RyaW5nIGRlc2NyaXB0aW9uLgorQW5kcm9pZFBhcnRpdGlvblR5cGUgYW5kcm9pZFBhcnRpdGlvblR5cGVfZnJvbVN0cmluZyhjb25zdCBjaGFyKiBwYXJ0X3R5cGUpOworCisvLyBQcm9iZSBhIGdpdmVuIGltYWdlIGZpbGUgYW5kIHJldHVybiBpdHMgcGFydGl0aW9uIGltYWdlIHR5cGUuCisvLyBOb3RlOiB0aGlzIHJldHVybnMgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9VTktOT1dOIGlmIHRoZSBmaWxlIGRvZXMKKy8vIG5vdCBleGlzdCBvciBjYW5ub3QgYmUgcmVhZC4KK0FuZHJvaWRQYXJ0aXRpb25UeXBlIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3Byb2JlRmlsZShjb25zdCBjaGFyKiBpbWFnZV9maWxlKTsKKworLy8gQ3JlYXRlIG9yIHJlc2V0IHRoZSBmaWxlIGF0IHxpbWFnZV9maWxlfCB0byBiZSBhbiBlbXB0eSBwYXJ0aXRpb24gb2YgdHlwZQorLy8gfHBhcnRfdHlwZXwgYW5kIHNpemUgfHBhcnRfc2l6ZXwuIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtZXJybm8gb24KKy8vIGZhaWx1cmUuCitpbnQgYW5kcm9pZFBhcnRpdGlvblR5cGVfbWFrZUVtcHR5RmlsZShBbmRyb2lkUGFydGl0aW9uVHlwZSBwYXJ0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwYXJ0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBpbWFnZV9maWxlKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX3R5cGVzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9wYXJ0aXRpb25fdHlwZXNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MWEzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX3R5cGVzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3BhcnRpdGlvbl90eXBlcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0VpbnRyV3JhcHBlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TY29wZWRTdGRpb0ZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL2V4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3Rlc3RpbmcvVGVzdEV4dDRJbWFnZUhlYWRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0U3VwcG9ydC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZFN0ZGlvRmlsZTsKKworY2xhc3MgVGVtcFBhcnRpdGlvbiB7CitwdWJsaWM6CisgICAgVGVtcFBhcnRpdGlvbigpIHsKKyAgICAgICAgbVBhdGggPSBhbmRyb2lkOjp0ZXN0aW5nOjpDcmVhdGVUZW1wRmlsZVBhdGgoKTsKKyAgICB9CisKKyAgICB+VGVtcFBhcnRpdGlvbigpIHsKKyAgICAgICAgaWYgKCFtUGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgICBIQU5ETEVfRUlOVFIoOjp1bmxpbmsobVBhdGguY19zdHIoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgY2hhciogR2V0UGF0aCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QYXRoLmNfc3RyKCk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgbVBhdGg7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChBbmRyb2lkUGFydGl0aW9uVHlwZSwgVG9TdHJpbmcpIHsKKyAgICBFWFBFQ1RfU1RSRVEoCisgICAgICAgICAgICAidW5rbm93biIsCisgICAgICAgICAgICBhbmRyb2lkUGFydGl0aW9uVHlwZV90b1N0cmluZyhBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04pKTsKKyAgICBFWFBFQ1RfU1RSRVEoCisgICAgICAgICAgICAieWFmZnMyIiwKKyAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX3RvU3RyaW5nKEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyKSk7CisgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAgICAgImV4dDQiLAorICAgICAgICAgICAgYW5kcm9pZFBhcnRpdGlvblR5cGVfdG9TdHJpbmcoQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0KSk7Cit9CisKK1RFU1QoQW5kcm9pZFBhcnRpdGlvblR5cGUsIEZyb21TdHJpbmcpIHsKKyAgICBFWFBFQ1RfRVEoQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9ZQUZGUzIsCisgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX2Zyb21TdHJpbmcoInlhZmZzMiIpKTsKKyAgICBFWFBFQ1RfRVEoQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LAorICAgICAgICAgICAgICBhbmRyb2lkUGFydGl0aW9uVHlwZV9mcm9tU3RyaW5nKCJleHQ0IikpOworICAgIEVYUEVDVF9FUShBTkRST0lEX1BBUlRJVElPTl9UWVBFX1VOS05PV04sCisgICAgICAgICAgICAgIGFuZHJvaWRQYXJ0aXRpb25UeXBlX2Zyb21TdHJpbmcoInVua25vd24iKSk7CisgICAgRVhQRUNUX0VRKEFORFJPSURfUEFSVElUSU9OX1RZUEVfVU5LTk9XTiwKKyAgICAgICAgICAgICAgYW5kcm9pZFBhcnRpdGlvblR5cGVfZnJvbVN0cmluZygiZm9vYmFyIikpOworfQorCitURVNUKEFuZHJvaWRQYXJ0aXRpb25UeXBlLCBQcm9iZUZpbGVZYWZmczIpIHsKKyAgICBUZW1wUGFydGl0aW9uIHBhcnQ7CisKKyAgICAvLyBBbiBlbXB0eSBwYXJ0aXRpb24gaXMgYSB2YWxpZCBZQUZGUzIgb25lLgorICAgIDo6cGF0aF9lbXB0eV9maWxlKHBhcnQuR2V0UGF0aCgpKTsKKworICAgIEVYUEVDVF9FUShBTkRST0lEX1BBUlRJVElPTl9UWVBFX1lBRkZTMiwKKyAgICAgICAgICAgICAgYW5kcm9pZFBhcnRpdGlvblR5cGVfcHJvYmVGaWxlKHBhcnQuR2V0UGF0aCgpKSk7Cit9CisKKworVEVTVChBbmRyb2lkUGFydGl0aW9uVHlwZSwgUHJvYmVGaWxlRXh0NCkgeworICAgIFRlbXBQYXJ0aXRpb24gcGFydDsKKworICAgIGFuZHJvaWRfY3JlYXRlRW1wdHlFeHQ0SW1hZ2UocGFydC5HZXRQYXRoKCksIDE2KjEwMjQqMTAyNCwgImNhY2hlIik7CisKKyAgICBFWFBFQ1RfRVEoQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9FWFQ0LAorICAgICAgICAgICAgICBhbmRyb2lkUGFydGl0aW9uVHlwZV9wcm9iZUZpbGUocGFydC5HZXRQYXRoKCkpKTsKK30KKworVEVTVChBbmRyb2lkUGFydGl0aW9uVHlwZSwgTWFrZUVtcHR5RmlsZVlhZmZzMikgeworICAgIFRlbXBQYXJ0aXRpb24gcGFydDsKKworICAgIEVYUEVDVF9FUSgwLCBhbmRyb2lkUGFydGl0aW9uVHlwZV9tYWtlRW1wdHlGaWxlKAorICAgICAgICAgICAgQU5EUk9JRF9QQVJUSVRJT05fVFlQRV9ZQUZGUzIsCisgICAgICAgICAgICA4ICogMTAyNCAqIDEwMjQsCisgICAgICAgICAgICBwYXJ0LkdldFBhdGgoKSkpIDw8ICJDb3VsZCBub3QgY3JlYXRlIFlhZmZzMiBwYXJ0aXRpb24gaW1hZ2UiOworCisgICAgRVhQRUNUX0VRKEFORFJPSURfUEFSVElUSU9OX1RZUEVfWUFGRlMyLAorICAgICAgICAgICAgICBhbmRyb2lkUGFydGl0aW9uVHlwZV9wcm9iZUZpbGUocGFydC5HZXRQYXRoKCkpKTsKK30KKworVEVTVChBbmRyb2lkUGFydGl0aW9uVHlwZSwgTWFrZUVtcHR5RmlsZUV4dDQpIHsKKyAgICBUZW1wUGFydGl0aW9uIHBhcnQ7CisKKyAgICBFWFBFQ1RfRVEoMCwgYW5kcm9pZFBhcnRpdGlvblR5cGVfbWFrZUVtcHR5RmlsZSgKKyAgICAgICAgICAgIEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgIDggKiAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgIHBhcnQuR2V0UGF0aCgpKSkgPDwgIkNvdWxkIG5vdCBjcmVhdGUgRVhUNCBwYXJ0aXRpb24gaW1hZ2UiOworCisgICAgRVhQRUNUX0VRKEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCwKKyAgICAgICAgICAgICAgYW5kcm9pZFBhcnRpdGlvblR5cGVfcHJvYmVGaWxlKHBhcnQuR2V0UGF0aCgpKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3JhbWRpc2tfZXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTI3NGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3JhbWRpc2tfZXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDMxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3JhbWRpc2tfZXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHCisjICBkZWZpbmUgRCguLi4pICAgcHJpbnRmKF9fVkFfQVJHU19fKSwgZmZsdXNoKHN0ZG91dCkKKyNlbHNlCisjICBkZWZpbmUgRCguLi4pICAgKCh2b2lkKTApCisjZW5kaWYKKworLy8gUmFtZGlzayBpbWFnZXMgYXJlIGd6aXBwZWQgY3BpbyBhcmNoaXZlcyB1c2luZyB0aGUgbmV3IEFTQ0lJCisvLyBmb3JtYXQgYXMgZGVzY3JpYmVkIGF0IFsxXS4gSGVuY2UgdGhpcyBzb3VyY2UgZmlsZSBmaXJzdCBpbXBsZW1lbnRzCisvLyBhIGd6aXAtYmFzZWQgaW5wdXQgc3RyZWFtIGNsYXNzLCB0aGVuIAorLy8KKy8vIFsxXSBodHRwOi8vcGVvcGxlLmZyZWVic2Qub3JnL35raWVudHpsZS9saWJhcmNoaXZlL21hbi9jcGlvLjUudHh0CisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIGltcGxlbWVudCBhIGd6aXAtYmFzZWQgaW5wdXQgc3RyZWFtLgorLy8gVXNhZ2UgaXMgYXMgZm9sbG93czoKKy8vCisvLyAgICAgR1ppcElucHV0U3RyZWFtIGlucHV0KGZpbGVQYXRoKTsKKy8vICAgICBpZiAoaW5wdXQuZXJyb3IoKSkgeworLy8gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gZmlsZTogJXNcbiIsCisvLyAgICAgICAgICAgICAgICBmaWxlUGF0aCwgc3RyZXJyb3IoaW5wdXQuZXJyb3IoKSkpOworLy8gICAgIH0gZWxzZSB7CisvLyAgICAgICAgdWludDhfdCBoZWFkZXJbMzJdOworLy8gICAgICAgIGlmICghZG9SZWFkKCZpbnB1dCwgaGVhZGVyLCBzaXplb2YgaGVhZGVyKSkgeworLy8gICAgICAgICAgIC4uLiBlcnJvciwgY291bGQgbm90IHJlYWQgaGVhZGVyLgorLy8gICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgIC4uIHN0cmVhbSBpcyBjbG9zZWQgYXV0b21hdGljYWxseSBvbiBzY29wZSBleGl0LgorY2xhc3MgR1ppcElucHV0U3RyZWFtIHsKK3B1YmxpYzoKKyAgICAvLyBPcGVuIGEgbmV3IGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20gZmlsZSB8ZmlsZVBhdGh8LgorICAgIC8vIFRoZSBjb25zdHJ1Y3RvciBjYW4gbmV2ZXIgZmFpbCwgc28gY2FsbCBlcnJvcigpIGFmdGVyCisgICAgLy8gdGhpcyB0byBzZWUgaWYgYW4gZXJyb3Igb2NjdXJlZC4KKyAgICBleHBsaWNpdCBHWmlwSW5wdXRTdHJlYW0oY29uc3QgY2hhciogZmlsZVBhdGgpIHsKKyAgICAgICAgbUZpbGUgPSBnem9wZW4oZmlsZVBhdGgsICJyYiIpOworICAgICAgICBpZiAobUZpbGUgPT0gWl9OVUxMKSB7CisgICAgICAgICAgICBtRmlsZSA9IE5VTEw7CisgICAgICAgICAgICBtRXJyb3IgPSBlcnJubzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1FcnJvciA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxhc3QgZXJyb3IgdGhhdCBvY2N1cmVkIG9uIHRoaXMgc3RyZWFtLAorICAgIC8vIG9yIDAgaWYgZXZlcnl0aGluZydzIHdlbGwuIE5vdGUgdGhhdCBhcyBzb29uIGFzIGFuCisgICAgLy8gZXJyb3Igb2NjdXJzLCB0aGUgc3RyZWFtIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuCisgICAgaW50IGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisKKyAgICAvLyBDbG9zZSB0aGUgc3RyZWFtLCBub3RlIHRoYXQgdGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseQorICAgIC8vIGZyb20gdGhlIGRlc3RydWN0b3IsIGJ1dCBjbGllbnRzIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcworICAgIC8vIGJlZm9yZS4KKyAgICB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAobUZpbGUpIHsKKyAgICAgICAgICAgIGd6Y2xvc2UobUZpbGUpOworICAgICAgICAgICAgbUZpbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgfkdaaXBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcmVhZCB1cCB0byB8bGVufCBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0CisgICAgLy8gc3RyZWFtIGludG8gfGJ1ZmZlcnwuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlIGFuZCBzZXRzCisgICAgLy8gfCpyZWFkQnl0ZXN8IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQuCisgICAgLy8gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZCBzZXQgZXJyb3IoKS4KKyAgICBib29sIHRyeVJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuLCBzaXplX3QqIHJlYWRCeXRlcykgeworICAgICAgICAqcmVhZEJ5dGVzID0gMDsKKworICAgICAgICBpZiAobUVycm9yKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FybmluZywgZ3pyZWFkKCkgdGFrZXMgYW4gdW5zaWduZWQgaW50IHBhcmFtZXRlciBmb3IKKyAgICAgICAgLy8gdGhlIGxlbmd0aCwgYnV0IHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIGl0cyB2YWx1ZQorICAgICAgICAvLyBleGNlZWRzIElOVF9NQVggYW55d2F5LgorICAgICAgICBjaGFyKiBidWZmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyKTsKKworICAgICAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICAgICAgc2l6ZV90IGF2YWlsID0gbGVuOworICAgICAgICAgICAgaWYgKGF2YWlsID4gSU5UX01BWCkKKyAgICAgICAgICAgICAgICBhdmFpbCA9IElOVF9NQVg7CisKKyAgICAgICAgICAgIGludCByZXQgPSBnenJlYWQobUZpbGUsIGJ1ZmYsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oYXZhaWwpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZ3plcnJvcihtRmlsZSwgJm1FcnJvcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ3plb2YobUZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnemVycm9yKG1GaWxlLCAmbUVycm9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICBidWZmICs9IHJldDsKKyAgICAgICAgICAgICpyZWFkQnl0ZXMgKz0gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICghbUVycm9yICYmICpyZWFkQnl0ZXMgPiAwKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGV4YWN0bHkgfGxlbnwgYnl0ZXMgb2YgZGF0YSBpbnRvIHxidWZmZXJ8LiBPbiBzdWNjZXNzLAorICAgIC8vIHJldHVybiB0cnVlLCBvbiBmYWlsdXJlLCByZXR1cm4gZmFsc2UgYW5kIHNldCBlcnJvcigpLgorICAgIGJvb2wgZG9SZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgeworICAgICAgICBzaXplX3QgcmVhZENvdW50ID0gMDsKKyAgICAgICAgaWYgKCF0cnlSZWFkKGJ1ZmZlciwgbGVuLCAmcmVhZENvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkQ291bnQgPCBsZW4pIHsKKyAgICAgICAgICAgIG1FcnJvciA9IEVJTzsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGRvU2tpcChzaXplX3QgbGVuKSB7CisgICAgICAgIGlmIChtRXJyb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ3pzZWVrKG1GaWxlLCBsZW4sIFNFRUtfQ1VSKSA8IDApIHsKKyAgICAgICAgICAgIGd6ZXJyb3IobUZpbGUsICZtRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oR1ppcElucHV0U3RyZWFtKTsKKworICAgIGd6RmlsZSBtRmlsZTsKKyAgICBpbnQgbUVycm9yOworfTsKKworLy8gUGFyc2UgYW4gaGV4YWRlY2ltYWwgc3RyaW5nIG9mIDggY2hhcmFjdGVycy4gT24gc3VjY2VzcywKKy8vIHJldHVybiB0cnVlIGFuZCBzZXRzIHwqdmFsdWV8IHRvIGl0cyB2YWx1ZS4gT24gZmFpbHVyZSwKKy8vIHJldHVybiBmYWxzZS4KK2Jvb2wgcGFyc2VfaGV4OChjb25zdCBjaGFyKiBpbnB1dCwgdWludDMyX3QqIHZhbHVlKSB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IDg7ICsrbikgeworICAgICAgICBpbnQgYyA9IGlucHV0W25dOworICAgICAgICB1bnNpZ25lZCBkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMgLSAnMCcpOworICAgICAgICBpZiAoZCA+PSAxMCkgeworICAgICAgICAgICAgZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjIC0gJ2EnKTsKKyAgICAgICAgICAgIGlmIChkID49IDYpIHsKKyAgICAgICAgICAgICAgICBkID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGMgLSAnQScpOworICAgICAgICAgICAgICAgIGlmIChkID49IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQgKz0gMTA7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA0KSB8IGQ7CisgICAgfQorICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgYW5kcm9pZF9leHRyYWN0UmFtZGlza0ZpbGUoY29uc3QgY2hhciogcmFtZGlza1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dFNpemUpIHsKKyAgICAqb3V0ID0gTlVMTDsKKyAgICAqb3V0U2l6ZSA9IDA7CisKKyAgICBHWmlwSW5wdXRTdHJlYW0gaW5wdXQocmFtZGlza1BhdGgpOworICAgIGlmIChpbnB1dC5lcnJvcigpKSB7CisgICAgICAgIGVycm5vID0gaW5wdXQuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFR5cGUgb2YgY3BpbyBuZXcgQVNDSUkgaGVhZGVyLgorICAgIHN0cnVjdCBjcGlvX25ld2NfaGVhZGVyIHsKKyAgICAgICAgY2hhciBjX21hZ2ljWzZdOworICAgICAgICBjaGFyIGNfaW5vWzhdOworICAgICAgICBjaGFyIGNfbW9kZVs4XTsKKyAgICAgICAgY2hhciBjX3VpZFs4XTsKKyAgICAgICAgY2hhciBjX2dpZFs4XTsKKyAgICAgICAgY2hhciBjX25saW5rWzhdOworICAgICAgICBjaGFyIGNfbXRpbWVbOF07CisgICAgICAgIGNoYXIgY19maWxlc2l6ZVs4XTsKKyAgICAgICAgY2hhciBjX2Rldm1ham9yWzhdOworICAgICAgICBjaGFyIGNfZGV2bWlub3JbOF07CisgICAgICAgIGNoYXIgY19yZGV2bWFqb3JbOF07CisgICAgICAgIGNoYXIgY19yZGV2bWlub3JbOF07CisgICAgICAgIGNoYXIgY19uYW1lc2l6ZVs4XTsKKyAgICAgICAgY2hhciBjX2NoZWNrWzhdOworICAgIH07CisKKyAgICBzaXplX3QgZmlsZU5hbWVMZW4gPSBzdHJsZW4oZmlsZU5hbWUpOworCisgICAgZm9yICg7OykgeworICAgICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgdGhlbiBjaGVjayBpdC4KKyAgICAgICAgY3Bpb19uZXdjX2hlYWRlciBoZWFkZXI7CisgICAgICAgIGlmICghaW5wdXQuZG9SZWFkKCZoZWFkZXIsIHNpemVvZiBoZWFkZXIpKSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgZW5kIG9mIGlucHV0IGhlcmUuCisgICAgICAgICAgICBEKCJDb3VsZCBub3QgZmluZCAlcyBpbiByYW1kaXNrIGltYWdlIGF0ICVzXG4iLAorICAgICAgICAgICAgICBmaWxlTmFtZSwgcmFtZGlza1BhdGgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgRCgiSEVBREVSICUuNnNcbiIsIGhlYWRlci5jX21hZ2ljKTsKKyAgICAgICAgaWYgKG1lbWNtcChoZWFkZXIuY19tYWdpYywgIjA3MDcwMSIsIDYpICE9IDApIHsKKyAgICAgICAgICAgIEQoIk5vdCBhIHZhbGlkIHJhbWRpc2sgaW1hZ2UgZmlsZTogJXNcbiIsIHJhbWRpc2tQYXRoKTsKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcGFyZSBmaWxlIG5hbWVzLCBub3RlIHRoYXQgZmlsZXMgd2l0aCBhIHNpemUgb2YgMCBhcmUKKyAgICAgICAgLy8gaGFyZCBsaW5rcyBhbmQgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICAgIHVpbnQzMl90IG5hbWVTaXplOworICAgICAgICB1aW50MzJfdCBlbnRyeVNpemU7CisgICAgICAgIGlmICghcGFyc2VfaGV4OChoZWFkZXIuY19uYW1lc2l6ZSwgJm5hbWVTaXplKSB8fAorICAgICAgICAgICAgIXBhcnNlX2hleDgoaGVhZGVyLmNfZmlsZXNpemUsICZlbnRyeVNpemUpKSB7CisgICAgICAgICAgICBEKCJDb3VsZCBub3QgcGFyc2UgcmFtZGlzayBmaWxlIGVudHJ5IGhlYWRlciEiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgRCgiLS0tLSAlZCBuYW1lU2l6ZT0lZCBlbnRyeVNpemU9JWRcbiIsIF9fTElORV9fLCBuYW1lU2l6ZSwgZW50cnlTaXplKTsKKworICAgICAgICAvLyBUaGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IHRoZSBuYW1lLCBmb2xsb3dlZCBieSA0LWJ5dGUgcGFkZGluZworICAgICAgICAvLyB3aXRoIE5VTCBieXRlcy4gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgb3ZlciB0aGUKKyAgICAgICAgLy8gbmFtZS4KKyAgICAgICAgc2l6ZV90IHNraXBOYW1lID0KKyAgICAgICAgICAgICAgICAoKHNpemVvZiBoZWFkZXIgKyBuYW1lU2l6ZSArIDMpICYgfjMpIC0gc2l6ZW9mIGhlYWRlcjsKKworICAgICAgICAvLyBUaGUgZmlsZSBkYXRhIGlzIDQtYnl0ZSBwYWRkZWQgd2l0aCBOVUwgYnl0ZXMgdG9vLgorICAgICAgICBzaXplX3Qgc2tpcEZpbGUgPSAoZW50cnlTaXplICsgMykgJiB+MzsKKyAgICAgICAgc2l6ZV90IHNraXBDb3VudCA9IHNraXBOYW1lICsgc2tpcEZpbGU7CisKKyAgICAgICAgLy8gTGFzdCByZWNvcmQgaXMgbmFtZWQgJ1RSQUlMRVIhISEnIGFuZCBpbmRpY2F0ZXMgZW5kIG9mIGFyY2hpdmUuCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtUcmFpbGVyW10gPSAiVFJBSUxFUiEhISI7CisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RyYWlsZXJTaXplID0gc2l6ZW9mKGtUcmFpbGVyKSAtIDFVOworCisgICAgICAgIGlmICgoZW50cnlTaXplID09IDAgfHwgbmFtZVNpemUgIT0gZmlsZU5hbWVMZW4gKyAxVSkgJiYKKyAgICAgICAgICAgIG5hbWVTaXplICE9IGtUcmFpbGVyU2l6ZSArIDFVKSB7CisgICAgICAgICAgICBEKCItLS0tICVkIFNraXBwaW5nXG4iLCBfX0xJTkVfXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZWFkIHRoZSBuYW1lIGFuZCBjb21wYXJlIGl0LgorICAgICAgICAgICAgbmFtZVNpemUgLT0gMVU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbnRyeU5hbWU7CisgICAgICAgICAgICBlbnRyeU5hbWUucmVzaXplKG5hbWVTaXplKTsKKyAgICAgICAgICAgIGlmICghaW5wdXQuZG9SZWFkKCZlbnRyeU5hbWVbMF0sIG5hbWVTaXplKSkgeworICAgICAgICAgICAgICAgIEQoIkNvdWxkIG5vdCByZWFkIHJhbWRpc2sgZmlsZSBlbnRyeSBuYW1lISIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRCgiLS0tLSAlZCBOYW1lPVslc11cbiIsIF9fTElORV9fLCBlbnRyeU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBza2lwQ291bnQgLT0gbmFtZVNpemU7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBsYXN0IGVudHJ5LgorICAgICAgICAgICAgaWYgKG5hbWVTaXplID09IGtUcmFpbGVyU2l6ZSAmJgorICAgICAgICAgICAgICAgICFzdHJjbXAoZW50cnlOYW1lLmNfc3RyKCksIGtUcmFpbGVyKSkgeworICAgICAgICAgICAgICAgIEQoIkVuZCBvZiBhcmNoaXZlIHJlYWNoZWQuIENvdWxkIG5vdCBmaW5kICVzIGluIHJhbWRpc2sgaW1hZ2UgYXQgJXMiLAorICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsIHJhbWRpc2tQYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc2VhcmNoIGZpbGUgbmFtZS4KKyAgICAgICAgICAgIGlmIChuYW1lU2l6ZSA9PSBlbnRyeU5hbWUuc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgIXN0cmNtcChlbnRyeU5hbWUuY19zdHIoKSwgZmlsZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQgISEgU2tpcCBvdmVyIHBhZGRpbmcuCisgICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kb1NraXAoc2tpcE5hbWUgLSBuYW1lU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRCgiQ291bGQgbm90IHNraXAgcmFtZGlzayBuYW1lIGVudHJ5ISIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGVuIHJlYWQgZGF0YSBpbnRvIGhlYWQtYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAqb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obWFsbG9jKGVudHJ5U2l6ZSkpOworICAgICAgICAgICAgICAgICpvdXRTaXplID0gZW50cnlTaXplOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LmRvUmVhZCgqb3V0LCBlbnRyeVNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaW5wdXQuZG9Ta2lwKHNraXBDb3VudCkpIHsKKyAgICAgICAgICAgIEQoIkNvdWxkIG5vdCBza2lwIHJhbWRpc2sgZW50cnkhIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVycm5vID0gaW5wdXQuZXJyb3IoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3IuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9yYW1kaXNrX2V4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZWIyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3IuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBFeHRyYWN0IHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gZmlsZSBmcm9tIGEgcmFtZGlzayBpbWFnZS4KKy8vIHxyYW1kaXNrX3BhdGh8IGlzIHRoZSBwYXRoIHRvIHRoZSByYW1kaXNrLmltZyBmaWxlLgorLy8gfGZpbGVfcGF0aHwgaXMgdGhlIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIHRoZSByYW1kaXNrLgorLy8gT24gc3VjY2VzcywgcmV0dXJucyB0cnVlIGFuZCBzZXRzIHwqb3V0fCB0byBwb2ludCB0byBhIGhlYXAgYWxsb2NhdGVkCisvLyBibG9jayBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgY29udGVudCwgb2Ygc2l6ZSB8Km91dF9zaXplfCBieXRlcy4KKy8vIE9uIGZhaWx1cmUsIHJldHVybiBmYWxzZS4KK2Jvb2wgYW5kcm9pZF9leHRyYWN0UmFtZGlza0ZpbGUoY29uc3QgY2hhciogcmFtZGlza19wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3V0X3NpemUpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy9yYW1kaXNrX2V4dHJhY3Rvcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3JfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4N2Y4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3JfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvcmFtZGlza19leHRyYWN0b3IuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FaW50cldyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2ZpbGVzeXN0ZW1zL3Rlc3RpbmcvVGVzdFN1cHBvcnQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgeworCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RSYW1kaXNrSW1hZ2UuaCIKKworY2xhc3MgUmFtZGlza0V4dHJhY3RvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBSYW1kaXNrRXh0cmFjdG9yVGVzdCgpIDoKKyAgICAgICAgbVRlbXBGaWxlUGF0aChhbmRyb2lkOjp0ZXN0aW5nOjpDcmVhdGVUZW1wRmlsZVBhdGgoKSkge30KKworICAgIGJvb2wgZmlsbERhdGEoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGRhdGFTaXplKSB7CisgICAgICAgIEZJTEUqIGZpbGUgPSA6OmZvcGVuKG1UZW1wRmlsZVBhdGguY19zdHIoKSwgIndiIik7CisgICAgICAgIGlmICghZmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCByZXN1bHQgPSAoZndyaXRlKGRhdGEsIGRhdGFTaXplLCAxLCBmaWxlKSA9PSAxKTsKKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIH5SYW1kaXNrRXh0cmFjdG9yVGVzdCgpIHsKKyAgICAgICAgaWYgKCFtVGVtcEZpbGVQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEhBTkRMRV9FSU5UUih1bmxpbmsobVRlbXBGaWxlUGF0aC5jX3N0cigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBwYXRoKCkgY29uc3QgeyByZXR1cm4gbVRlbXBGaWxlUGF0aC5jX3N0cigpOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbVRlbXBGaWxlUGF0aDsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUX0YoUmFtZGlza0V4dHJhY3RvclRlc3QsIEZpbmRGb28pIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRbXSA9ICJIZWxsbyBXb3JsZCFcbiI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRTaXplID0gc2l6ZW9mKGtFeHBlY3RlZCkgLSAxVTsKKyAgICBjaGFyKiBvdXQgPSBOVUxMOworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIEVYUEVDVF9UUlVFKGZpbGxEYXRhKGtUZXN0UmFtZGlza0ltYWdlLCBrVGVzdFJhbWRpc2tJbWFnZVNpemUpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX2V4dHJhY3RSYW1kaXNrRmlsZShwYXRoKCksICJmb28iLCAmb3V0LCAmb3V0U2l6ZSkpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRTaXplLCBvdXRTaXplKTsKKyAgICBFWFBFQ1RfVFJVRShvdXQpOworICAgIEVYUEVDVF9UUlVFKCFtZW1jbXAob3V0LCBrRXhwZWN0ZWQsIG91dFNpemUpKTsKKyAgICBmcmVlKG91dCk7Cit9CisKK1RFU1RfRihSYW1kaXNrRXh0cmFjdG9yVGVzdCwgRmluZEJhcjIpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRbXSA9ICJMYSB2aWUgZXN0IHVuIGxvbmcgZmxldXZlIHRyYW5xdWlsbGVcbiI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRTaXplID0gc2l6ZW9mKGtFeHBlY3RlZCkgLSAxVTsKKyAgICBjaGFyKiBvdXQgPSBOVUxMOworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIEVYUEVDVF9UUlVFKGZpbGxEYXRhKGtUZXN0UmFtZGlza0ltYWdlLCBrVGVzdFJhbWRpc2tJbWFnZVNpemUpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX2V4dHJhY3RSYW1kaXNrRmlsZShwYXRoKCksICJiYXIyIiwgJm91dCwgJm91dFNpemUpKTsKKyAgICBFWFBFQ1RfRVEoa0V4cGVjdGVkU2l6ZSwgb3V0U2l6ZSk7CisgICAgRVhQRUNUX1RSVUUob3V0KTsKKyAgICBFWFBFQ1RfVFJVRSghbWVtY21wKG91dCwga0V4cGVjdGVkLCBvdXRTaXplKSk7CisgICAgZnJlZShvdXQpOworfQorCitURVNUX0YoUmFtZGlza0V4dHJhY3RvclRlc3QsIEZpbmRab28pIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRXhwZWN0ZWRbXSA9ICJNZW93ISFcbiI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrRXhwZWN0ZWRTaXplID0gc2l6ZW9mKGtFeHBlY3RlZCkgLSAxVTsKKyAgICBjaGFyKiBvdXQgPSBOVUxMOworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIEVYUEVDVF9UUlVFKGZpbGxEYXRhKGtUZXN0UmFtZGlza0ltYWdlLCBrVGVzdFJhbWRpc2tJbWFnZVNpemUpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX2V4dHJhY3RSYW1kaXNrRmlsZShwYXRoKCksICJ6b28iLCAmb3V0LCAmb3V0U2l6ZSkpOworICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRTaXplLCBvdXRTaXplKTsKKyAgICBFWFBFQ1RfVFJVRShvdXQpOworICAgIEVYUEVDVF9UUlVFKCFtZW1jbXAob3V0LCBrRXhwZWN0ZWQsIG91dFNpemUpKTsKKyAgICBmcmVlKG91dCk7Cit9CisKK1RFU1RfRihSYW1kaXNrRXh0cmFjdG9yVGVzdCwgTWlzc2luZ0ZpbGUpIHsKKyAgICBjaGFyKiBvdXQgPSBOVUxMOworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKyAgICBFWFBFQ1RfVFJVRShmaWxsRGF0YShrVGVzdFJhbWRpc2tJbWFnZSwga1Rlc3RSYW1kaXNrSW1hZ2VTaXplKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRfZXh0cmFjdFJhbWRpc2tGaWxlKHBhdGgoKSwgInpvb2xhbmRlciIsICZvdXQsICZvdXRTaXplKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0RXh0NEltYWdlSGVhZGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0RXh0NEltYWdlSGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0MGEwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RFeHQ0SW1hZ2VIZWFkZXIuaApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisvLyBUaGVzZSBhcmUgdGhlIGZpcnN0IDEwODIgYnl0ZXMgb2YgYW4gRVhUNCBzeXN0ZW0uaW1nIGZpbGUKKy8vIEl0IHdhcyBnZW5lcmF0ZWQgd2l0aDoKKy8vCisvLyAgICBkZCAtaWY9JFNESy9zeXN0ZW0taW1hZ2VzL2FuZHJvaWQtMTkvYXJtZWFiaS12N2Evc3lzdGVtLmltZworLy8gICAgICAgLW9mPS90bXAvZXh0NC1zeXN0ZW0uaW1nCisvLyAgICAgICAtYnM9MTA4MiAtY291bnQ9MQorLy8KKy8vICAgIHh4ZCAtaSAvdG1wL2V4dDQtc3lzdGVtLmltZworLy8KKy8vIFRoZSB0d28gbGFzdCBieXRlcyBtdXN0IGJlIDB4NTMgLyAweGVmLCBpLmUuIHRoZSBFWFQ0IG1hZ2ljIGJ5dGVzLgorLy8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUZXN0RXh0NEltYWdlSGVhZGVyW10gPSB7CisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjYsIDB4MDIsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUsIDB4MTksIDB4MDEsIDB4MDAsIDB4ZDYsIDB4ODUsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MWIsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsCisgIDB4NTMsIDB4ZWYKK307CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RFeHQ0SW1hZ2VIZWFkZXJTaXplID0gc2l6ZW9mKGtUZXN0RXh0NEltYWdlSGVhZGVyKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RSYW1kaXNrSW1hZ2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RSYW1kaXNrSW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY2MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3Rlc3RpbmcvVGVzdFJhbWRpc2tJbWFnZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworLyogQXV0by1nZW5lcmF0ZWQgYnkgY3JlYXRlX3JhbWRpc2tfdGVzdF9kYXRhLnNoIG9uIDIwMTQtMDctMTUgLSBETyBOT1QgRURJVCEhICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtUZXN0UmFtZGlza0ltYWdlW10gPSB7CisgIDB4MWYsIDB4OGIsIDB4MDgsIDB4MDAsIDB4YTcsIDB4ZTAsIDB4YzQsIDB4NTMsIDB4MDIsIDB4MDMsIDB4ZWQsIDB4OGYsCisgIDB4Y2QsIDB4MGEsIDB4ODIsIDB4NDAsIDB4MTQsIDB4ODUsIDB4NjcsIDB4ZWQsIDB4NTMsIDB4Y2MsIDB4YmMsIDB4YzEsCisgIDB4YmQsIDB4ZmUsIDB4OGQsIDB4ZGIsIDB4ZDEsIDB4NDYsIDB4MGEsIDB4NmMsIDB4MjMsIDB4NDEsIDB4NmIsIDB4YTMsCisgIDB4MzEsIDB4ODQsIDB4NjEsIDB4ODYsIDB4NGMsIDB4MGQsIDB4N2EsIDB4ZmEsIDB4MzQsIDB4OTEsIDB4YTQsIDB4NDUsCisgIDB4ZTgsIDB4YmEsIDB4YmUsIDB4Y2QsIDB4MzksIDB4MDMsIDB4MDMsIDB4ZGYsIDB4YjksIDB4YzAsIDB4ODEsIDB4MDMsCisgIDB4MDIsIDB4YTAsIDB4ZjQsIDB4NTAsIDB4NGEsIDB4ZTgsIDB4ODksIDB4NTAsIDB4MGMsIDB4MDEsIDB4NjEsIDB4MmEsCisgIDB4ZTIsIDB4MjEsIDB4ZDEsIDB4OGIsIDB4MjIsIDB4MTgsIDB4YzEsIDB4YzAsIDB4NGIsIDB4N2MsIDB4MDksIDB4ODIsCisgIDB4OGYsIDB4NGYsIDB4MzcsIDB4MTgsIDB4MzMsIDB4NGQsIDB4ZTAsIDB4M2IsIDB4YzEsIDB4NTQsIDB4NGUsIDB4NDUsCisgIDB4ZWQsIDB4MTIsIDB4OTIsIDB4MTUsIDB4YjQsIDB4YWIsIDB4MTQsIDB4NTUsIDB4YjcsIDB4ODYsIDB4YjYsIDB4ODYsCisgIDB4NmEsIDB4NmIsIDB4MmUsIDB4YjQsIDB4ZDQsIDB4YWEsIDB4ZWQsIDB4MTQsIDB4NmQsIDB4ZWEsIDB4YzIsIDB4NWMsCisgIDB4ZGIsIDB4NGEsIDB4NmIsIDB4ZTUsIDB4MTAsIDB4NDIsIDB4ZTAsIDB4YmQsIDB4Y2QsIDB4ODUsIDB4NzAsIDB4ZGQsCisgIDB4MzYsIDB4ZTAsIDB4MGIsIDB4YjcsIDB4ZjksIDB4NTMsIDB4NzksIDB4NTgsIDB4ZGIsIDB4M2IsIDB4ZjcsIDB4Y2EsCisgIDB4ZGUsIDB4MTksIDB4NzMsIDB4ZTYsIDB4NmUsIDB4OTQsIDB4NjIsIDB4YTUsIDB4N2IsIDB4YjMsIDB4ZDYsIDB4NWQsCisgIDB4YmUsIDB4ZGMsIDB4NWIsIDB4YTUsIDB4YjUsIDB4YTUsIDB4NDcsIDB4NWIsIDB4ZWIsIDB4MzMsIDB4OWIsIDB4ZGYsCisgIDB4YmYsIDB4ODgsIDB4YTUsIDB4ZmYsIDB4M2UsIDB4ODksIDB4YTcsIDB4NzIsIDB4YzgsIDB4YzUsIDB4MmUsIDB4OTMsCisgIDB4MzksIDB4NjMsIDB4OGMsIDB4ZmMsIDB4ZjksIDB4MTksIDB4OWUsIDB4MDUsIDB4NTcsIDB4ZjMsIDB4NmMsIDB4MDAsCisgIDB4MDQsIDB4MDAsIDB4MDAKK307CisKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RSYW1kaXNrSW1hZ2VTaXplID0gc2l6ZW9mKGtUZXN0UmFtZGlza0ltYWdlKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY1N2EwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZpbGVzeXN0ZW1zL3Rlc3RpbmcvVGVzdFN1cHBvcnQuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvRWludHJXcmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworc3RkOjpzdHJpbmcgQ3JlYXRlVGVtcEZpbGVQYXRoKCkgeworI2lmZGVmIF9XSU4zMgorICAgIGNoYXIgdGVtcERpcltNQVhfUEFUSF07CisgICAgRFdPUkQgcmV0ID0gR2V0VGVtcFBhdGgoTUFYX1BBVEgsIHRlbXBEaXIpOworICAgIENIRUNLKHJldCA+IDAgJiYgcmV0IDwgTUFYX1BBVEgpCisgICAgICAgICAgICA8PCAiQ291bGQgbm90IGdldCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHBhdGgiOworCisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHJlc3VsdC5yZXNpemUoTUFYX1BBVEgpOworICAgIFVJTlQgcmV0MiA9IEdldFRlbXBGaWxlTmFtZSh0ZW1wRGlyLCAiZW11bGF0b3ItdGVzdC0iLCAwLCAgJnJlc3VsdFswXSk7CisgICAgQ0hFQ0socmV0MiAhPSBFUlJPUl9CVUZGRVJfT1ZFUkZMT1cpIDw8ICJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIG5hbWUiOworICAgIHJlc3VsdC5yZXNpemUoOjpzdHJsZW4ocmVzdWx0LmNfc3RyKCkpKTsKKyAgICByZXR1cm4gcmVzdWx0OworI2Vsc2UKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQoIi90bXAvZW11bGF0b3ItdGVzdC5YWFhYWFgiKTsKKyAgICBpbnQgcmV0ID0gSEFORExFX0VJTlRSKG1rc3RlbXAoJnJlc3VsdFswXSkpOworICAgIFBDSEVDSyhyZXQgPj0gMCkgPDwgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVwYXRoIjsKKyAgICA6OmNsb3NlKHJldCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL1Rlc3RTdXBwb3J0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0U3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NWIzMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9UZXN0U3VwcG9ydC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitzdGQ6OnN0cmluZyBDcmVhdGVUZW1wRmlsZVBhdGgoKTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9jcmVhdGVfcmFtZGlza190ZXN0X2RhdGEuc2ggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZmlsZXN5c3RlbXMvdGVzdGluZy9jcmVhdGVfcmFtZGlza190ZXN0X2RhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzljZTNkZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9maWxlc3lzdGVtcy90ZXN0aW5nL2NyZWF0ZV9yYW1kaXNrX3Rlc3RfZGF0YS5zaApAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHNvdWNlIGZpbGVzIGNvbnRhaW5pbmcgdGVzdAorIyBkYXRhIGZvciB0aGUgcmFtZGlza19leHRyYWN0b3IgdW5pdCB0ZXN0cy4KKworc2V0IC1lCisKK2V4cG9ydCBMQU5HPUMKK2V4cG9ydCBMQ19BTEw9QworCitQUk9HTkFNRT0kKGJhc2VuYW1lICIkMCIpCitEQVRFPSQoZGF0ZSArJVktJW0tJWQpCisKKyMgJDE6IFJvb3QgZGlyZWN0b3J5CitjcmVhdGVfcmFtZGlza19oZWFkZXJfZnJvbSAoKSB7CisgICAgbG9jYWwgRklMRV9MSVNUCisgICAgRklMRV9MSVNUPSQoY2QgJDIgJiYgZmluZCAuIC10eXBlIGYgMj4vZGV2L251bGwgfCBzZWQgLWUgJ3N8Xi4vfHxnJykKKyAgICBlY2hvICIkRklMRV9MSVNUIiB8IGNwaW8gLS1jcmVhdGUgLS1mb3JtYXQ9bmV3YyAtLXF1aWV0IHwgZ3ppcCAtOWMgfCB4eGQgLWkgLQorfQorCitUTVBESVI9L3RtcC8kVVNFUi1yYW1kaXNrLXRlc3QtZGF0YQorcm0gLXJmICRUTVBESVIvZGlyMSAmJiBta2RpciAtcCAkVE1QRElSL2RpcjEKK2NkICRUTVBESVIvZGlyMQorY2F0ID4gZm9vIDw8RU9GCitIZWxsbyBXb3JsZCEKK0VPRgorY2F0ID4gYmFyMiA8PEVPRgorTGEgdmllIGVzdCB1biBsb25nIGZsZXV2ZSB0cmFucXVpbGxlCitFT0YKK2NhdCA+IHpvbyA8PEVPRgorTWVvdyEhCitFT0YKK2VjaG8gIi8qIEF1dG8tZ2VuZXJhdGVkIGJ5ICRQUk9HTkFNRSBvbiAkREFURSAtIERPIE5PVCBFRElUISEgKi8iCitlY2hvICIiCitlY2hvICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVGVzdFJhbWRpc2tJbWFnZVtdID0geyIKK2NyZWF0ZV9yYW1kaXNrX2hlYWRlcl9mcm9tICRUTVBESVIvcmFtZGlzazEuaW1nLmggJFRNUERJUi9kaXIxCitlY2hvICJ9OyIKK2VjaG8gIiIKK2VjaG8gInN0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RSYW1kaXNrSW1hZ2VTaXplID0gc2l6ZW9mKGtUZXN0UmFtZGlza0ltYWdlKTsiCitlY2hvICIiCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mcmFtZWJ1ZmZlci5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZyYW1lYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjliOTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mcmFtZWJ1ZmZlci5jCkBAIC0wLDAgKzEsMzAzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9mcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogY2xpZW50IGZpZWxkcywgdGhlc2UgY29ycmVzcG9uZCB0byBjb2RlIHRoYXQgd2FpdHMgZm9yIHVwZGF0ZXMgYmVmb3JlIGRpc3BsYXlpbmcgdGhlbSAqLworICAgIC8qIGF0IHRoZSBtb21lbnQsIG9ubHkgb25lIGNsaWVudCBpcyBzdXBwb3J0ZWQgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIGZiX29wYXF1ZTsKKyAgICBRRnJhbWVCdWZmZXJVcGRhdGVGdW5jICAgICAgIGZiX3VwZGF0ZTsKKyAgICBRRnJhbWVCdWZmZXJSb3RhdGVGdW5jICAgICAgIGZiX3JvdGF0ZTsKKyAgICBRRnJhbWVCdWZmZXJQb2xsRnVuYyAgICAgICAgIGZiX3BvbGw7CisgICAgUUZyYW1lQnVmZmVyRG9uZUZ1bmMgICAgICAgICBmYl9kb25lOworCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBwcl9vcGFxdWU7CisgICAgUUZyYW1lQnVmZmVyQ2hlY2tVcGRhdGVGdW5jICBwcl9jaGVjazsKKyAgICBRRnJhbWVCdWZmZXJJbnZhbGlkYXRlRnVuYyAgIHByX2ludmFsaWRhdGU7CisgICAgUUZyYW1lQnVmZmVyRGV0YWNoRnVuYyAgICAgICBwcl9kZXRhY2g7CisKK30gUUZyYW1lQnVmZmVyRXh0cmE7CisKKworc3RhdGljIGludAorX2dldF9waXRjaCggaW50ICB3aWR0aCwgUUZyYW1lQnVmZmVyRm9ybWF0ICBmb3JtYXQgKQoreworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBRRlJBTUVfQlVGRkVSX1JHQjU2NToKKyAgICAgICAgICAgIHJldHVybiB3aWR0aCoyOworICAgICAgICBjYXNlIFFGUkFNRV9CVUZGRVJfUkdCWF84ODg4OgorICAgICAgICAgICAgcmV0dXJuIHdpZHRoKjQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfZ2V0X2JpdHNfcGVyX3BpeGVsKFFGcmFtZUJ1ZmZlckZvcm1hdCAgZm9ybWF0KQoreworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBRRlJBTUVfQlVGRkVSX1JHQjU2NToKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgY2FzZSBRRlJBTUVfQlVGRkVSX1JHQlhfODg4ODoKKyAgICAgICAgICAgIHJldHVybiAzMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19nZXRfYnl0ZXNfcGVyX3BpeGVsKFFGcmFtZUJ1ZmZlckZvcm1hdCAgZm9ybWF0KQoreworCisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBRRlJBTUVfQlVGRkVSX1JHQjU2NToKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIFFGUkFNRV9CVUZGRVJfUkdCWF84ODg4OgorICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQKK3FmcmFtZWJ1ZmZlcl9pbml0KCBRRnJhbWVCdWZmZXIqICAgICAgIHFmYnVmZiwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyRm9ybWF0ICBmb3JtYXQgKQoreworICAgIGludCAgIHBpdGNoLCBieXRlc19wZXJfcGl4ZWwsIGJpdHNfcGVyX3BpeGVsOworCisgICAgcm90YXRpb24gJj0gMzsKKworICAgIGlmICghcWZidWZmIHx8IHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBwaXRjaCA9IF9nZXRfcGl0Y2goIHdpZHRoLCBmb3JtYXQgKTsKKyAgICBpZiAocGl0Y2ggPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBiaXRzX3Blcl9waXhlbCA9IF9nZXRfYml0c19wZXJfcGl4ZWwoZm9ybWF0KTsKKyAgICBpZiAoYml0c19wZXJfcGl4ZWwgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBieXRlc19wZXJfcGl4ZWwgPSBfZ2V0X2J5dGVzX3Blcl9waXhlbChmb3JtYXQpOworICAgIGlmIChieXRlc19wZXJfcGl4ZWwgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBtZW1zZXQoIHFmYnVmZiwgMCwgc2l6ZW9mKCpxZmJ1ZmYpICk7CisKKyAgICBxZmJ1ZmYtPmV4dHJhID0gY2FsbG9jKCAxLCBzaXplb2YoUUZyYW1lQnVmZmVyRXh0cmEpICk7CisgICAgaWYgKHFmYnVmZi0+ZXh0cmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcWZidWZmLT5waXhlbHMgPSBjYWxsb2MoIHBpdGNoLCBoZWlnaHQgKTsKKyAgICBpZiAocWZidWZmLT5waXhlbHMgPT0gTlVMTCAmJiAoaGVpZ2h0ID4gMCAmJiBwaXRjaCA+IDApKSB7CisgICAgICAgIGZyZWUoIHFmYnVmZi0+ZXh0cmEgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHFmYnVmZi0+d2lkdGggID0gd2lkdGg7CisgICAgcWZidWZmLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgcWZidWZmLT5waXRjaCAgPSBwaXRjaDsKKyAgICBxZmJ1ZmYtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICBxZmJ1ZmYtPmJpdHNfcGVyX3BpeGVsID0gYml0c19wZXJfcGl4ZWw7CisgICAgcWZidWZmLT5ieXRlc19wZXJfcGl4ZWwgPSBieXRlc19wZXJfcGl4ZWw7CisKKyAgICBxZnJhbWVidWZmZXJfc2V0X2RwaSggcWZidWZmLCBERUZBVUxUX0ZSQU1FQlVGRkVSX0RQSSwgREVGQVVMVF9GUkFNRUJVRkZFUl9EUEkgKTsKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkCitxZnJhbWVidWZmZXJfc2V0X2RwaSggUUZyYW1lQnVmZmVyKiAgIHFmYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgeF9kcGksCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHlfZHBpICkKK3sKKyAgICAvKiBkcGkgPSBkb3RzIC8gaW5jaAorICAgICoqIGluY2ggPSBkb3RzIC8gZHBpCisgICAgKiogbW0gLyAyNS40ID0gZG90cyAvIGRwaQorICAgICoqIG1tID0gKGRvdHMgKiAyNS40KS9kcGkKKyAgICAqLworICAgIHFmYnVmZi0+cGh5c193aWR0aF9tbSAgPSAoaW50KSgwLjUgKyAyNS40ICogcWZidWZmLT53aWR0aCAgLyB4X2RwaSk7CisgICAgcWZidWZmLT5waHlzX2hlaWdodF9tbSA9IChpbnQpKDAuNSArIDI1LjQgKiBxZmJ1ZmYtPmhlaWdodCAvIHlfZHBpKTsKK30KKworLyogYWx0ZXJuYXRpdmUgdG8gcWZyYW1lYnVmZmVyX3NldF9kcGkgd2hlcmUgb25lIGNhbiBzZXQgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbnMgZGlyZWN0bHkgKi8KKy8qIGluIG1pbGxpbWV0ZXJzLiBmb3IgdGhlIHJlY29yZCAxIGluY2ggPSAyNS40IG1tICovCit2b2lkCitxZnJhbWVidWZmZXJfc2V0X21tKCBRRnJhbWVCdWZmZXIqICAgcWZidWZmLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHdpZHRoX21tLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhlaWdodF9tbSApCit7CisgICAgcWZidWZmLT5waHlzX3dpZHRoX21tICA9IHdpZHRoX21tOworICAgIHFmYnVmZi0+cGh5c19oZWlnaHRfbW0gPSBoZWlnaHRfbW07Cit9CisKK3ZvaWQKK3FmcmFtZWJ1ZmZlcl91cGRhdGUoIFFGcmFtZUJ1ZmZlciogIHFmYnVmZiwgaW50ICB4LCBpbnQgIHksIGludCAgdywgaW50ICBoICkKK3sKKyAgICBRRnJhbWVCdWZmZXJFeHRyYSogIGV4dHJhID0gcWZidWZmLT5leHRyYTsKKworICAgIGlmIChleHRyYS0+ZmJfdXBkYXRlKQorICAgICAgICBleHRyYS0+ZmJfdXBkYXRlKCBleHRyYS0+ZmJfb3BhcXVlLCB4LCB5LCB3LCBoICk7Cit9CisKKwordm9pZAorcWZyYW1lYnVmZmVyX2FkZF9jbGllbnQoIFFGcmFtZUJ1ZmZlciogICAgICAgICAgIHFmYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBmYl9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyVXBkYXRlRnVuYyAgZmJfdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlclJvdGF0ZUZ1bmMgIGZiX3JvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRRnJhbWVCdWZmZXJQb2xsRnVuYyAgICBmYl9wb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlckRvbmVGdW5jICAgIGZiX2RvbmUgKQoreworICAgIFFGcmFtZUJ1ZmZlckV4dHJhKiAgZXh0cmEgPSBxZmJ1ZmYtPmV4dHJhOworCisgICAgZXh0cmEtPmZiX29wYXF1ZSA9IGZiX29wYXF1ZTsKKyAgICBleHRyYS0+ZmJfdXBkYXRlID0gZmJfdXBkYXRlOworICAgIGV4dHJhLT5mYl9yb3RhdGUgPSBmYl9yb3RhdGU7CisgICAgZXh0cmEtPmZiX3BvbGwgICA9IGZiX3BvbGw7CisgICAgZXh0cmEtPmZiX2RvbmUgICA9IGZiX2RvbmU7Cit9CisKK3ZvaWQKK3FmcmFtZWJ1ZmZlcl9zZXRfcHJvZHVjZXIoIFFGcmFtZUJ1ZmZlciogICAgICAgICAgICAgICAgcWZidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBRRnJhbWVCdWZmZXJDaGVja1VwZGF0ZUZ1bmMgIHByX2NoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVySW52YWxpZGF0ZUZ1bmMgICBwcl9pbnZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyRGV0YWNoRnVuYyAgICAgICBwcl9kZXRhY2ggKQoreworICAgIFFGcmFtZUJ1ZmZlckV4dHJhKiAgZXh0cmEgPSBxZmJ1ZmYtPmV4dHJhOworCisgICAgZXh0cmEtPnByX29wYXF1ZSAgICAgPSBvcGFxdWU7CisgICAgZXh0cmEtPnByX2NoZWNrICAgICAgPSBwcl9jaGVjazsKKyAgICBleHRyYS0+cHJfaW52YWxpZGF0ZSA9IHByX2ludmFsaWRhdGU7CisgICAgZXh0cmEtPnByX2RldGFjaCAgICAgPSBwcl9kZXRhY2g7Cit9CisKKwordm9pZAorcWZyYW1lYnVmZmVyX3JvdGF0ZSggUUZyYW1lQnVmZmVyKiAgcWZidWZmLCBpbnQgIHJvdGF0aW9uICkKK3sKKyAgICBRRnJhbWVCdWZmZXJFeHRyYSogIGV4dHJhID0gcWZidWZmLT5leHRyYTsKKworICAgIGlmICgocm90YXRpb24gXiBxZmJ1ZmYtPnJvdGF0aW9uKSAmIDEpIHsKKyAgICAgICAgLyogc3dhcCB3aWR0aCBhbmQgaGVpZ2h0IGlmIG5ldyByb3RhdGlvbiByZXF1aXJlcyBpdCAqLworICAgICAgICBpbnQgIHRlbXAgPSBxZmJ1ZmYtPndpZHRoOworICAgICAgICBxZmJ1ZmYtPndpZHRoICA9IHFmYnVmZi0+aGVpZ2h0OworICAgICAgICBxZmJ1ZmYtPmhlaWdodCA9IHRlbXA7CisgICAgICAgIHFmYnVmZi0+cGl0Y2ggID0gX2dldF9waXRjaCggcWZidWZmLT53aWR0aCwgcWZidWZmLT5mb3JtYXQgKTsKKworICAgICAgICB0ZW1wID0gcWZidWZmLT5waHlzX3dpZHRoX21tOworICAgICAgICBxZmJ1ZmYtPnBoeXNfd2lkdGhfbW0gID0gcWZidWZmLT5waHlzX2hlaWdodF9tbTsKKyAgICAgICAgcWZidWZmLT5waHlzX2hlaWdodF9tbSA9IHRlbXA7CisgICAgfQorICAgIHFmYnVmZi0+cm90YXRpb24gPSByb3RhdGlvbjsKKworICAgIGlmIChleHRyYS0+ZmJfcm90YXRlKQorICAgICAgICBleHRyYS0+ZmJfcm90YXRlKCBleHRyYS0+ZmJfb3BhcXVlLCByb3RhdGlvbiApOworfQorCit2b2lkCitxZnJhbWVidWZmZXJfcG9sbCggUUZyYW1lQnVmZmVyKiBxZmJ1ZmYgKQoreworICAgIFFGcmFtZUJ1ZmZlckV4dHJhKiAgZXh0cmEgPSBxZmJ1ZmYtPmV4dHJhOworCisgICAgaWYgKGV4dHJhICYmIGV4dHJhLT5mYl9wb2xsKQorICAgICAgICBleHRyYS0+ZmJfcG9sbCggZXh0cmEtPmZiX29wYXF1ZSApOworfQorCisKK2V4dGVybiB2b2lkCitxZnJhbWVidWZmZXJfZG9uZSggUUZyYW1lQnVmZmVyKiAgIHFmYnVmZiApCit7CisgICAgUUZyYW1lQnVmZmVyRXh0cmEqICBleHRyYSA9IHFmYnVmZi0+ZXh0cmE7CisKKyAgICBpZiAoZXh0cmEpIHsKKyAgICAgICAgaWYgKGV4dHJhLT5wcl9kZXRhY2gpCisgICAgICAgICAgICBleHRyYS0+cHJfZGV0YWNoKCBleHRyYS0+cHJfb3BhcXVlICk7CisKKyAgICAgICAgaWYgKGV4dHJhLT5mYl9kb25lKQorICAgICAgICAgICAgZXh0cmEtPmZiX2RvbmUoIGV4dHJhLT5mYl9vcGFxdWUgKTsKKyAgICB9CisKKyAgICBmcmVlKCBxZmJ1ZmYtPnBpeGVscyApOworICAgIGZyZWUoIHFmYnVmZi0+ZXh0cmEgKTsKKyAgICBtZW1zZXQoIHFmYnVmZiwgMCwgc2l6ZW9mKCpxZmJ1ZmYpICk7Cit9CisKKworI2RlZmluZSAgTUFYX0ZSQU1FX0JVRkZFUlMgIDgKKworc3RhdGljIFFGcmFtZUJ1ZmZlciogZnJhbWVidWZmZXJfZmlmb1sgTUFYX0ZSQU1FX0JVRkZFUlMgXTsKK3N0YXRpYyBpbnQgICAgICAgICAgIGZyYW1lYnVmZmVyX2ZpZm9fcnBvczsKK3N0YXRpYyBpbnQgICAgICAgICAgIGZyYW1lYnVmZmVyX2ZpZm9fY291bnQ7CisKK3ZvaWQKK3FmcmFtZWJ1ZmZlcl9maWZvX2FkZCggUUZyYW1lQnVmZmVyKiAgcWZidWZmICkKK3sKKyAgICBpZiAoZnJhbWVidWZmZXJfZmlmb19jb3VudCA+PSBNQVhfRlJBTUVfQlVGRkVSUykKKyAgICAgICAgcmV0dXJuOworCisgICAgZnJhbWVidWZmZXJfZmlmb1sgZnJhbWVidWZmZXJfZmlmb19jb3VudCsrIF0gPSBxZmJ1ZmY7Cit9CisKKworUUZyYW1lQnVmZmVyKgorcWZyYW1lYnVmZmVyX2ZpZm9fZ2V0KCB2b2lkICkKK3sKKyAgICBpZiAoZnJhbWVidWZmZXJfZmlmb19ycG9zID49IGZyYW1lYnVmZmVyX2ZpZm9fY291bnQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGZyYW1lYnVmZmVyX2ZpZm9bIGZyYW1lYnVmZmVyX2ZpZm9fcnBvcysrIF07Cit9CisKKwordm9pZAorcWZyYW1lYnVmZmVyX2NoZWNrX3VwZGF0ZXMoIHZvaWQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgZnJhbWVidWZmZXJfZmlmb19jb3VudDsgbm4rKykgeworICAgICAgICBRRnJhbWVCdWZmZXIqICAgICAgIHEgICAgID0gZnJhbWVidWZmZXJfZmlmb1tubl07CisgICAgICAgIFFGcmFtZUJ1ZmZlckV4dHJhKiAgZXh0cmEgPSBxLT5leHRyYTsKKworICAgICAgICBpZiAoZXh0cmEtPnByX2NoZWNrKQorICAgICAgICAgICAgZXh0cmEtPnByX2NoZWNrKCBleHRyYS0+cHJfb3BhcXVlICk7CisgICAgfQorfQorCit2b2lkCitxZnJhbWVidWZmZXJfcHVsc2UoIHZvaWQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgZnJhbWVidWZmZXJfZmlmb19jb3VudDsgbm4rKykgeworICAgICAgICBxZnJhbWVidWZmZXJfcG9sbChmcmFtZWJ1ZmZlcl9maWZvW25uXSk7CisgICAgfQorfQorCit2b2lkCitxZnJhbWVidWZmZXJfaW52YWxpZGF0ZV9hbGwoIHZvaWQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgZnJhbWVidWZmZXJfZmlmb19jb3VudDsgbm4rKykgeworICAgICAgICBRRnJhbWVCdWZmZXIqICAgICAgIHEgICAgID0gZnJhbWVidWZmZXJfZmlmb1tubl07CisgICAgICAgIFFGcmFtZUJ1ZmZlckV4dHJhKiAgZXh0cmEgPSBxLT5leHRyYTsKKworICAgICAgICBpZiAoZXh0cmEtPnByX2ludmFsaWRhdGUpCisgICAgICAgICAgICBleHRyYS0+cHJfaW52YWxpZGF0ZSggZXh0cmEtPnByX29wYXF1ZSApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mcmFtZWJ1ZmZlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ZyYW1lYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwZTU2MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9mcmFtZWJ1ZmZlci5oCkBAIC0wLDAgKzEsMjI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvKiBBIHNpbXBsZSBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gZnJhbWVidWZmZXIgZGlzcGxheXMuIHRoaXMgaXMgdXNlZCB0bworICogZGUtY291cGxlIGhhcmR3YXJlIGVtdWxhdGlvbiBmcm9tIGZpbmFsIGRpc3BsYXkuCisgKgorICogRWFjaCBRRnJhbWVCdWZmZXIgb2JqZWN0IGhvbGRzIGEgcGl4ZWwgYnVmZmVyIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4KKyAqIG9uZSAnUHJvZHVjZXInIGFuZCBvbmUgb3IgbW9yZSAnQ2xpZW50cycKKyAqCisgKiBUaGUgUHJvZHVjZXIgaXMgaW4gY2hhcmdlIG9mIHVwZGF0aW5nIHRoZSBwaXhlbCBidWZmZXIgZnJvbSB0aGUgc3RhdGUKKyAqIG9mIHRoZSBlbXVsYXRlZCBWUkFNLiBBIENsaWVudCBsaXN0ZW5zIHRvIHVwZGF0ZXMgdG8gdGhlIHBpeGVsIGJ1ZmZlciwKKyAqIHNlbnQgZnJvbSB0aGUgcHJvZHVjZXIgdGhyb3VnaCBxZnJhbWVidWZmZXJfdXBkYXRlKCkvX3JvdGF0ZSgpIGFuZAorICogZGlzcGxheXMgdGhlbS4KKyAqCisgKiBub3RlIHRoZSAncm90YXRpb24nIGZpZWxkOiBpdCBjYW4gdGFrZSB2YWx1ZXMgMCwgMSwgMiBvciAzIGFuZCBjb3JyZXNwb25kcworICogdG8gYSByb3RhdGlvbiB0aGF0IG11c3QgYmUgcGVyZm9ybWVkIHRvIHRoZSBwaXhlbHMgc3RvcmVkIGluIHRoZSBmcmFtZWJ1ZmZlcgorICogKmJlZm9yZSogZGlzcGxheWluZyB0aGVtIGEgdmFsdWUgb2YgMSBjb3JyZXNwb25kcyB0byBhIHJvdGF0aW9uIG9mCisgKiA5MCBjbG9ja3dpc2UtZGVncmVlcywgd2hlbiB0aGUgZnJhbWVidWZmZXIgaXMgcm90YXRlZCA5MCBvciAyNzAgZGVncmVlcywKKyAqIGl0cyB3aWR0aC9oZWlnaHQgYXJlIHN3YXBwZWQgYXV0b21hdGljYWxseQorICoKKyAqIHBoeXNfd2lkdGhfbW0gYW5kIHBoeXNfaGVpZ2h0X21tIGFyZSBwaHlzaWNhbCBkaW1lbnNpb25zIGV4cHJlc3NlZAorICogaW4gbWlsbGltZXRlcnMKKyAqCisgKiBNb3JlIGFib3V0IHRoZSBjbGllbnQvcHJvZHVjZXIgcmVsYXRpb25zaGlwcyBiZWxvdy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUUZyYW1lQnVmZmVyICAgUUZyYW1lQnVmZmVyOworCisKK3R5cGVkZWYgZW51bSB7CisgICAgUUZSQU1FX0JVRkZFUl9OT05FICAgPSAwLAorICAgIFFGUkFNRV9CVUZGRVJfUkdCNTY1ID0gMSwKKyAgICBRRlJBTUVfQlVGRkVSX1JHQlhfODg4OCA9IDIsCisgICAgUUZSQU1FX0JVRkZFUl9NQVggICAgICAgICAgLyogZG8gbm90IHJlbW92ZSAqLworfSBRRnJhbWVCdWZmZXJGb3JtYXQ7CisKK3N0cnVjdCBRRnJhbWVCdWZmZXIgeworICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGg7ICAgICAgICAvKiB3aWR0aCBpbiBwaXhlbHMgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodDsgICAgICAgLyogaGVpZ2h0IGluIHBpeGVscyAqLworICAgIGludCAgICAgICAgICAgICAgICAgcGl0Y2g7ICAgICAgICAvKiBieXRlcyBwZXIgbGluZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgYml0c19wZXJfcGl4ZWw7IC8qIGJpdHMgcGVyIHBpeGVsICovCisgICAgaW50ICAgICAgICAgICAgICAgICBieXRlc19wZXJfcGl4ZWw7ICAgIC8qIGJ5dGVzIHBlciBwaXhlbCAqLworICAgIGludCAgICAgICAgICAgICAgICAgcm90YXRpb247ICAgICAvKiByb3RhdGlvbiB0byBiZSBhcHBsaWVkIHdoZW4gZGlzcGxheWluZyAqLworICAgIFFGcmFtZUJ1ZmZlckZvcm1hdCAgZm9ybWF0OworICAgIHZvaWQqICAgICAgICAgICAgICAgcGl4ZWxzOyAgICAgICAvKiBwaXhlbCBidWZmZXIgKi8KKworICAgIGludCAgICAgICAgICAgICAgICAgcGh5c193aWR0aF9tbTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBoeXNfaGVpZ2h0X21tOworCisgICAgLyogZXh0cmEgZGF0YSB0aGF0IGlzIGhhbmRsZWQgYnkgdGhlIGZyYW1lYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisgICAgdm9pZCogICAgICAgICAgICAgICBleHRyYTsKKworfTsKKworLyogdGhlIGRlZmF1bHQgZHBpIHJlc29sdXRpb24gb2YgYSB0eXBpY2FsIGZyYW1lYnVmZmVyLiB0aGlzIGlzIGFuIGF2ZXJhZ2UKKyAqIGJldHdlZW4gdmFyaW91cyBwcm90b3R5cGVzIGJlaW5nIHVzZWQgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUKKyAqIEFuZHJvaWQgc3lzdGVtLi4uCisgKi8KKyNkZWZpbmUgIERFRkFVTFRfRlJBTUVCVUZGRVJfRFBJICAgMTY1CisKKworLyogaW5pdGlhbGl6ZSBhIGZyYW1lYnVmZmVyIG9iamVjdCBhbmQgYWxsb2NhdGUgaXRzIHBpeGVsIGJ1ZmZlciAqLworLyogdGhpcyBjb21wdXRlcyBwaHlzX3dpZHRoX21tIGFuZCBwaHlzX2hlaWdodF9tbSBhc3N1bWluZyBhIDE2NSBkcGkgc2NyZWVuICovCisvKiByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IsIDAgb3RoZXJ3aXNlICovCitleHRlcm4gaW50CitxZnJhbWVidWZmZXJfaW5pdCggUUZyYW1lQnVmZmVyKiAgICAgICBxZmJ1ZmYsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlckZvcm1hdCAgZm9ybWF0ICk7CisKKy8qIHJlY29tcHV0ZSBwaHlzX3dpZHRoX21tIGFuZCBwaHlzX2hlaWdodF9tbSBhY2NvcmRpbmcgdG8gdGhlIGVtdWxhdGVkCisgKiBzY3JlZW4gRFBJIHNldHRpbmdzICovCitleHRlcm4gdm9pZAorcWZyYW1lYnVmZmVyX3NldF9kcGkoIFFGcmFtZUJ1ZmZlciogICBxZmJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHhfZHBpLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICB5X2RwaSApOworCisvKiBhbHRlcm5hdGl2ZSB0byBxZnJhbWVidWZmZXJfc2V0X2RwaSB3aGVyZSBvbmUgY2FuIHNldCB0aGUgcGh5c2ljYWwKKyAqIGRpbWVuc2lvbnMgZGlyZWN0bHkgaW4gbWlsbGltZXRlcnMuIGZvciB0aGUgcmVjb3JkIDEgaW5jaCA9IDI1LjQgbW0gKi8KK2V4dGVybiB2b2lkCitxZnJhbWVidWZmZXJfc2V0X21tKCBRRnJhbWVCdWZmZXIqICAgcWZidWZmLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHdpZHRoX21tLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhlaWdodF9tbSApOworCisvKiB0aGUgQ2xpZW50OjpVcGRhdGUgbWV0aG9kIGlzIGNhbGxlZCB0byBpbnN0cnVjdCBhIGNsaWVudCB0aGF0IGEgZ2l2ZW4KKyAqIHJlY3RhbmdsZSBvZiB0aGUgZnJhbWVidWZmZXIgcGl4ZWxzIHdhcyB1cGRhdGVkIGFuZCBuZWVkcyB0byBiZQorICogcmVkcmF3bi4KKyAqLwordHlwZWRlZiB2b2lkICgqUUZyYW1lQnVmZmVyVXBkYXRlRnVuYykoIHZvaWQqICBvcGFxdWUsIGludCAgeCwgaW50ICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgdywgaW50ICBoICk7CisKKy8qIHRoZSBDbGllbnQ6OlJvdGF0ZSBtZXRob2QgaXMgY2FsbGVkIHRvIGluc3RydWN0IHRoZSBjbGllbnQgdGhhdCBhCisgKiBmcmFtZWJ1ZmZlcidzIGludGVybmFsIHJvdGF0aW9uIGhhcyBjaGFuZ2VkLiBUaGlzIGlzIHRoZSByb3RhdGlvbgorICogdGhhdCBtdXN0IGJlIGFwcGxpZWQgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIHBpeGVscy4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbCBmcmFtZWJ1ZmZlciBwaXhlbHMgaGF2ZSBjaGFuZ2VkIHRvbworICogc28gdGhlIGNsaWVudCBzaG91bGQgY2FsbCBpdHMgVXBkYXRlIG1ldGhvZCBhcyB3ZWxsLgorICovCit0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJSb3RhdGVGdW5jKSggdm9pZCogIG9wYXF1ZSwgaW50ICByb3RhdGlvbiApOworCisvKiB0aGUgQ2xpZW50OjpQb2xsIG1ldGhvZCBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHBvbGwgZm9yIGlucHV0CisgKiBldmVudHMgYW5kIGFjdCBvbiB0aGVtLiBQdXR0aW5nIHRoaXMgaGVyZSBpcyBub3QgMTAwJSBwdXJlIGJ1dAorICogbWFrZSB0aGluZ3Mgc2ltcGxlciBkdWUgdG8gUUVNVSdzIHdlaXJkIGFyY2hpdGVjdHVyZSB3aGVyZSB0aGUKKyAqIEdVSSB0aW1lciBkcml2ZXJzIGV2ZW50IHBvbGxpbmcuCisgKi8KK3R5cGVkZWYgdm9pZCAoKlFGcmFtZUJ1ZmZlclBvbGxGdW5jKSggdm9pZCogb3BhcXVlICk7CisKKy8qIHRoZSBDbGllbnQ6OkRvbmUgZnVuYyB0ZWxscyBhIGNsaWVudCB0aGF0IGEgZnJhbWVidWZmZXIgb2JqZWN0IHdhcyBmcmVlZC4KKyAqIG5vIG1vcmUgcmVmZXJlbmNlIHRvIGl0cyBwaXhlbHMgc2hvdWxkIGJlIGRvbmUuCisgKi8KK3R5cGVkZWYgdm9pZCAoKlFGcmFtZUJ1ZmZlckRvbmVGdW5jKSAgKCB2b2lkKiAgb3BhcXVlICk7CisKKy8qIGFkZCBvbmUgY2xpZW50IHRvIGEgZ2l2ZW4gZnJhbWVidWZmZXIuCisgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGFsbG93cyBvbmUgY2xpZW50IHBlciBmcmFtZS1idWZmZXIsCisgKiBidXQgd2UgY291bGQgYWxsb3cgbW9yZSBmb3IgdmFyaW91cyByZWFzb25zIChlLmcuIGRpc3BsYXlpbmcgdGhlCisgKiBmcmFtZWJ1ZmZlciArIGRpc3BhdGNoaW5nIGl0IHRocm91Z2ggVk5DIGF0IHRoZSBzYW1lIHRpbWUpCisgKi8KK2V4dGVybiB2b2lkCitxZnJhbWVidWZmZXJfYWRkX2NsaWVudCggUUZyYW1lQnVmZmVyKiAgICAgICAgICAgcWZidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIGZiX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRRnJhbWVCdWZmZXJVcGRhdGVGdW5jICBmYl91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyUm90YXRlRnVuYyAgZmJfcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlclBvbGxGdW5jICAgIGZiX3BvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyRG9uZUZ1bmMgICAgZmJfZG9uZSApOworCisvKiBQcm9kdWNlcjo6Q2hlY2tVcGRhdGUgaXMgY2FsbGVkIHRvIGxldCB0aGUgcHJvZHVjZXIgY2hlY2sgdGhlCisgKiBWUkFNIHN0YXRlIChlLmcuIFZSQU0gZGlydHkgcGFnZXMpIHRvIHNlZSBpZiBhbnl0aGluZyBjaGFuZ2VkIHNpbmNlIHRoZQorICogbGFzdCBjYWxsIHRvIHRoZSBtZXRob2QuIFdoZW4gdHJ1ZSwgdGhlIG1ldGhvZCBzaG91bGQgY2FsbCBlaXRoZXIKKyAqIHFmcmFtZWJ1ZmZlcl91cGRhdGUoKSBvciBxZnJhbWVidWZmZXJfcm90YXRlKCkgd2l0aCB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzLgorICovCit0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJDaGVja1VwZGF0ZUZ1bmMpKCB2b2lkKiAgb3BhcXVlICk7CisKKy8qIFByb2R1Y2VyOjpJbnZhbGlkYXRlIHRlbGxzIHRoZSBwcm9kdWNlciB0aGF0IHRoZSBuZXh0IGNhbGwgdG8KKyAqIENoZWNrVXBkYXRlIHNob3VsZCBhY3QgYXMgaWYgdGhlIHdob2xlIGNvbnRlbnQgb2YgVlJBTSBoYWQgY2hhbmdlZC4KKyAqIHRoaXMgaXMgbm9ybWFsbHkgZG9uZSB0byBmb3JjZSBjbGllbnQgaW5pdGlhbGl6YXRpb24vcmVmcmVzaGVzLgorICovCit0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJJbnZhbGlkYXRlRnVuYykgKCB2b2lkKiAgb3BhcXVlICk7CisKKy8qIHRoZSBQcm9kdWNlcjo6RGV0YWNoIG1ldGhvZCBpcyB1c2VkIHRvIHRlbGwgdGhlIHByb2R1Y2VyIHRoYXQgdGhlCisgKiB1bmRlcmx5aW5nIFFGcmFtZUJ1ZmZlciBvYmplY3QgaXMgYWJvdXQgdG8gYmUgZGUtYWxsb2NhdGVkLgorICovCit0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJEZXRhY2hGdW5jKSAgICAgKCB2b2lkKiAgb3BhcXVlICk7CisKKy8qIHNldCB0aGUgcHJvZHVjZXIgb2YgYSBnaXZlbiBmcmFtZWJ1ZmZlciAqLworZXh0ZXJuIHZvaWQKK3FmcmFtZWJ1ZmZlcl9zZXRfcHJvZHVjZXIoIFFGcmFtZUJ1ZmZlciogICAgICAgICAgICAgICAgcWZidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBRRnJhbWVCdWZmZXJDaGVja1VwZGF0ZUZ1bmMgIGZiX2NoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVySW52YWxpZGF0ZUZ1bmMgICBmYl9pbnZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyRGV0YWNoRnVuYyAgICAgICBmYl9kZXRhY2ggKTsKKworLyogdGVsbCBhIGNsaWVudCB0aGF0IGEgcmVjdGFuZ2xlIHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBmcmFtZWJ1ZmZlcgorICogcGl4ZWwgYnVmZmVyIHRoaXMgaXMgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIGEgUHJvZHVjZXI6OkNoZWNrVXBkYXRlIG1ldGhvZAorICovCitleHRlcm4gdm9pZAorcWZyYW1lYnVmZmVyX3VwZGF0ZSggUUZyYW1lQnVmZmVyKiAgcWZidWZmLCBpbnQgIHgsIGludCAgeSwgaW50ICB3LCBpbnQgIGggKTsKKworLyogcm90YXRlIHRoZSBmcmFtZWJ1ZmZlciAobWF5IHN3YXAgd2lkdGgvaGVpZ2h0KSwgYW5kIHRlbGwgYWxsIGNsaWVudHMuCisgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gYSBQcm9kdWNlcjo6Q2hlY2tVcGRhdGUgbWV0aG9kCisgKi8KK2V4dGVybiB2b2lkCitxZnJhbWVidWZmZXJfcm90YXRlKCBRRnJhbWVCdWZmZXIqICBxZmJ1ZmYsIGludCAgcm90YXRpb24gKTsKKworLyogdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBvbGwgYSBmcmFtZWJ1ZmZlcidzIGNsaWVudCBmb3IgaW5wdXQKKyAqIGV2ZW50cy4gU2hvdWxkIGJlIGNhbGxlZCBlaXRoZXIgZXhwbGljaXRlbHksIG9yIHRocm91Z2ggcWZyYW1lYnVmZmVyX3B1bHNlKCkKKyAqIHBlcmlvZGljYWxseS4KKyAqLworZXh0ZXJuIHZvaWQKK3FmcmFtZWJ1ZmZlcl9wb2xsKCBRRnJhbWVCdWZmZXIqIHFmYnVmZiApOworCisvKiBmaW5hbGl6ZSBhIGZyYW1lYnVmZmVyLCByZWxlYXNlIGl0cyBwaXhlbCBidWZmZXIuIFNob3VsZCBiZSBjYWxsZWQKKyAqIGZyb20gdGhlIGZyYW1lYnVmZmVyIG9iamVjdCdzIG93bmVyCisgKi8KK2V4dGVybiB2b2lkCitxZnJhbWVidWZmZXJfZG9uZSggUUZyYW1lQnVmZmVyKiAgIHFmYnVmZiApOworCisKKy8qIHRoaXMgaXMgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIGVtdWxhdG9yLiBmb3IgZWFjaCByZWdpc3RlcmVkIGZyYW1lYnVmZmVyLAorICogY2FsbCBpdHMgcHJvZHVjZXIncyBDaGVja1VwZGF0ZSBtZXRob2QsIGlmIGFueS4KKyAqLworZXh0ZXJuIHZvaWQKK3FmcmFtZWJ1ZmZlcl9jaGVja191cGRhdGVzKCB2b2lkICk7CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiBwZXJpb2RpY2FsbHkgdG8gZm9yY2UgYSBwb2xsIG9uIGFsbCBmcmFuZWJ1ZmZlcnMKKyAqLworZXh0ZXJuIHZvaWQKK3FmcmFtZWJ1ZmZlcl9wdWxzZSggdm9pZCApOworCisvKiB0aGlzIGlzIGNhbGxlZCBieSB0aGUgZW11bGF0b3IuIGZvciBlYWNoIHJlZ2lzdGVyZWQgZnJhbWVidWZmZXIsIGNhbGwKKyAqIGl0cyBwcm9kdWNlcidzIEludmFsaWRhdGUgbWV0aG9kLCBpZiBhbnkKKyAqLworZXh0ZXJuIHZvaWQKK3FmcmFtZWJ1ZmZlcl9pbnZhbGlkYXRlX2FsbCggdm9pZCApOworCisvKgorICogdG8gY29tcGxldGVseSBzZXBhcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xpZW50cywgcHJvZHVjZXJzLCBhbmQgc2tpbnMsCisgKiB3ZSB1c2UgYSBzaW1wbGUgZ2xvYmFsIEZJRk8gbGlzdCBvZiBRRnJhbWVCdWZmZXIgb2JqZWN0cy4KKyAqCisgKiBxZnJhbWVidWZmZXJfZmlmb19hZGQoKSBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBlbXVsYXRvciBpbml0aWFsaXphdGlvbgorICogZGVwZW5kaW5nIG9uIHRoZSBlbXVsYXRlZCBkZXZpY2UncyBjb25maWd1cmF0aW9uCisgKgorICogcWZyYW1lYnVmZmVyX2ZpZm9fZ2V0KCkgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSBhIGhhcmR3YXJlIGZyYW1lYnVmZmVyCisgKiBlbXVsYXRpb24uCisgKi8KKworLyogYWRkIGEgbmV3IGNvbnN0cnVjdGVkIGZyYW1lIGJ1ZmZlciBvYmplY3QgdG8gb3VyIGdsb2JhbCBsaXN0ICovCitleHRlcm4gdm9pZAorcWZyYW1lYnVmZmVyX2ZpZm9fYWRkKCBRRnJhbWVCdWZmZXIqICBxZmJ1ZmYgKTsKKworLyogcmV0cmlldmUgYSBmcmFtZSBidWZmZXIgb2JqZWN0IGZyb20gdGhlIGdsb2JhbCBGSUZPIGxpc3QgKi8KK2V4dGVybiBRRnJhbWVCdWZmZXIqCitxZnJhbWVidWZmZXJfZmlmb19nZXQoIHZvaWQgKTsKKworLyogKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9nbG9iYWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmY2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ2xvYmFscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYXZkL2luZm8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9ody1jb25maWcuaCIKKworLyogdGhpcyBzdHJ1Y3R1cmUgaXMgc2V0dXAgd2hlbiBsb2FkaW5nIHRoZSB2aXJ0dWFsIGRldmljZQorICogYWZ0ZXIgdGhhdCwgeW91IGNhbiByZWFkIHRoZSAnZmxhZ3MnIGZpZWxkIHRvIGRldGVybWluZQorICogd2V0aGVyIGEgZGF0YSBvciBjYWNoZSB3aXBlIGhhcyBiZWVuIGluIGVmZmVjdC4KKyAqLworZXh0ZXJuIEF2ZEluZm9QYXJhbXMgICAgIGFuZHJvaWRfYXZkUGFyYW1zWzFdOworCisvKiBhIHBvaW50ZXIgdG8gdGhlIGFuZHJvaWQgdmlydHVhbCBkZXZpY2UgaW5mb3JtYXRpb24KKyAqIG9iamVjdCwgd2hpY2ggY2FuIGJlIHF1ZXJpZWQgZm9yIHRoZSBwYXRocyBvZiB2YXJpb3VzCisgKiBpbWFnZSBmaWxlcyBvciB0aGUgc2tpbgorICovCitleHRlcm4gQXZkSW5mbyogICAgICAgICAgYW5kcm9pZF9hdmRJbmZvOworCisvKiB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzcGVjaWZpYyB2aXJ0dWFsIGRldmljZSAqLworZXh0ZXJuIEFuZHJvaWRId0NvbmZpZyAgIGFuZHJvaWRfaHdbMV07CisKKy8qIHRoaXMgaXMgdG8gc3VwcG9ydCBzbmFwc2hvdCAoY3VycmVudGx5IG9ubHkgcWVtdTErc29mdHdhcmUtcmVuZGVyZXIpICovCitleHRlcm4gY29uc3QgY2hhciogc2F2ZXZtX29uX2V4aXQ7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5OTU1OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMuYwpAQCAtMCwwICsxLDE0NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvZ3BzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyYWxsb2MuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCitDU2VyaWFsTGluZSogYW5kcm9pZF9ncHNfc2VyaWFsX2xpbmU7CisKKyNkZWZpbmUgIEQoLi4uKSAgVkVSQk9TRV9QUklOVChncHMsX19WQV9BUkdTX18pCisKK3ZvaWQKK2FuZHJvaWRfZ3BzX3NlbmRfbm1lYSggY29uc3QgY2hhciogIHNlbnRlbmNlICkKK3sKKyAgICBpZiAoc2VudGVuY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgRCgic2VuZGluZyAnJXMnIiwgc2VudGVuY2UpOworCisgICAgaWYgKGFuZHJvaWRfZ3BzX3NlcmlhbF9saW5lID09IE5VTEwpIHsKKyAgICAgICAgRCgibWlzc2luZyBHUFMgY2hhbm5lbCwgaWdub3JlZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKCBhbmRyb2lkX2dwc19zZXJpYWxfbGluZSwgKGNvbnN0IHZvaWQqKXNlbnRlbmNlLCBzdHJsZW4oc2VudGVuY2UpICk7CisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKCBhbmRyb2lkX2dwc19zZXJpYWxfbGluZSwgKGNvbnN0IHZvaWQqKSJcbiIsIDEgKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gYW5kcm9pZF9ncHNfc2VuZF9sb2NhdGlvbgorLy8KKy8vIFNlbmQgYSBHUFMgbG9jYXRpb24gdG8gdGhlIEFWRCB1c2luZyBhbiBOTUVBIHNlbnRlbmNlCisvLworLy8gSW5wdXRzOiBsYXRpdHVkZTogICAgICAgIERlZ3JlZXMKKy8vICAgICAgICAgbG9uZ2l0dWRlOiAgICAgICBEZWdyZWVzCisvLyAgICAgICAgIG1ldGVyc0VsZXZhdGlvbjogTWV0ZXJzIGFib3ZlIHNlYSBsZXZlbAorLy8gICAgICAgICBuU2F0ZWxsaXRlczogICAgIE51bWJlciBvZiBzYXRlbGxpdGVzIHVzZWQKKy8vICAgICAgICAgdGltZTogICAgICAgICAgICBVVEMsIGluIHRoZSBmb3JtYXQgcHJvdmlkZWQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBieSBnZXR0aW1lb2ZkYXkoKQorCit2b2lkCithbmRyb2lkX2dwc19zZW5kX2xvY2F0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1ldGVyc0VsZXZhdGlvbiwgaW50IG5TYXRlbGxpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdGltZSkKK3sKKyAgICBTVFJBTExPQ19ERUZJTkUobXNnU3RyKTsKKyAgICBTVFJBTExPQ19ERUZJTkUoZWxldmF0aW9uU3RyKTsKKyAgICBjaGFyKiBlbGV2U3RyUHRyOworCisgICAgaW50ICAgICAgZGVnLCBtaW47CisgICAgY2hhciAgICAgaGVtaTsKKyAgICBpbnQgICAgICBoaCA9IDAsIG1tID0gMCwgc3MgPSAwOworCisgICAgLy8gRm9ybWF0IG92ZXJ2aWV3OgorICAgIC8vICAgIHRpbWUgb2YgZml4ICAgICAgMTIzNTE5ICAgICAxMjozNToxOSBVVEMKKyAgICAvLyAgICBsYXRpdHVkZSAgICAgICAgIDQ4MDcuMDM4ICAgNDggZGVncmVlcywgMDcuMDM4IG1pbnV0ZXMKKyAgICAvLyAgICBub3J0aC9zb3V0aCAgICAgIE4gb3IgUworICAgIC8vICAgIGxvbmdpdHVkZSAgICAgICAgMDExMzEuMDAwICAxMSBkZWdyZWVzLCAzMS4gbWludXRlcworICAgIC8vICAgIGVhc3Qvd2VzdCAgICAgICAgRSBvciBXCisgICAgLy8gICAgZml4IHF1YWxpdHkgICAgICAxICAgICAgICAgIHN0YW5kYXJkIEdQUyBmaXgKKyAgICAvLyAgICBzYXRlbGxpdGVzICAgICAgIDEgdG8gMTIgICAgbnVtYmVyIG9mIHNhdGVsbGl0ZXMgYmVpbmcgdHJhY2tlZAorICAgIC8vICAgIEhET1AgICAgICAgICAgICAgPGRvbnRjYXJlPiBob3Jpem9udGFsIGRpbHV0aW9uCisgICAgLy8gICAgYWx0aXR1ZGUgICAgICAgICA1NDYuICAgICAgIGFsdGl0dWRlIGFib3ZlIHNlYS1sZXZlbAorICAgIC8vICAgIGFsdGl0dWRlIHVuaXRzICAgTSAgICAgICAgICB0byBpbmRpY2F0ZSBtZXRlcnMKKyAgICAvLyAgICBkaWZmICAgICAgICAgICAgIDxkb250Y2FyZT4gaGVpZ2h0IG9mIHNlYS1sZXZlbCBhYm92ZSBlbGxpcHNvaWQKKyAgICAvLyAgICBkaWZmIHVuaXRzICAgICAgIE0gICAgICAgICAgdG8gaW5kaWNhdGUgbWV0ZXJzIChzaG91bGQgYmUgPGRvbnRjYXJlPikKKyAgICAvLyAgICBkZ3BzIGFnZSAgICAgICAgIDxkb250Y2FyZT4gdGltZSBpbiBzZWNvbmRzIHNpbmNlIGxhc3QgREdQUyBmaXgKKyAgICAvLyAgICBkZ3BzIHNpZCAgICAgICAgIDxkb250Y2FyZT4gREdQUyBzdGF0aW9uIGlkCisKKyAgICAvLyB0aW1lLT50dl9zZWMgaXMgZWxhcHNlZCBzZWNvbmRzIHNpbmNlIGVwb2NoLCBVVEMKKyAgICBoaCA9IChpbnQpICh0aW1lLT50dl9zZWMgLyAoNjAgKiA2MCkpICUgMjQ7CisgICAgbW0gPSAoaW50KSAodGltZS0+dHZfc2VjIC8gIDYwICAgICAgKSAlIDYwOworICAgIHNzID0gKGludCkgKHRpbWUtPnR2X3NlYyAgICAgICAgICAgICkgJSA2MDsKKworICAgIHN0cmFsbG9jX2FkZF9mb3JtYXQoIG1zZ1N0ciwgIiRHUEdHQSwlMDJkJTAyZCUwMmQiLCBoaCwgbW0sIHNzKTsKKworICAgIC8vIHRoZW4gdGhlIGxhdGl0dWRlCisgICAgaGVtaSA9ICdOJzsKKyAgICBpZiAobGF0aXR1ZGUgPCAwKSB7CisgICAgICAgIGhlbWkgPSAnUyc7CisgICAgICAgIGxhdGl0dWRlID0gLWxhdGl0dWRlOworICAgIH0KKyAgICBkZWcgPSAoaW50KSBsYXRpdHVkZTsKKyAgICBsYXRpdHVkZSA9IDYwKihsYXRpdHVkZSAtIGRlZyk7CisgICAgbWluID0gKGludCkgbGF0aXR1ZGU7CisgICAgbGF0aXR1ZGUgPSAxMDAwMCoobGF0aXR1ZGUgLSBtaW4pOworICAgIHN0cmFsbG9jX2FkZF9mb3JtYXQoIG1zZ1N0ciwgIiwlMDJkJTAyZC4lMDRkLCVjIiwgZGVnLCBtaW4sIChpbnQpbGF0aXR1ZGUsIGhlbWkgKTsKKworICAgIC8vIFRoZSBsb25naXR1ZGUKKyAgICBoZW1pID0gJ0UnOworICAgIGlmIChsb25naXR1ZGUgPCAwKSB7CisgICAgICAgIGhlbWkgPSAnVyc7CisgICAgICAgIGxvbmdpdHVkZSAgPSAtbG9uZ2l0dWRlOworICAgIH0KKyAgICBkZWcgPSAoaW50KSBsb25naXR1ZGU7CisgICAgbG9uZ2l0dWRlID0gNjAqKGxvbmdpdHVkZSAtIGRlZyk7CisgICAgbWluID0gKGludCkgbG9uZ2l0dWRlOworICAgIGxvbmdpdHVkZSA9IDEwMDAwKihsb25naXR1ZGUgLSBtaW4pOworICAgIHN0cmFsbG9jX2FkZF9mb3JtYXQoIG1zZ1N0ciwgIiwlMDJkJTAyZC4lMDRkLCVjIiwgZGVnLCBtaW4sIChpbnQpbG9uZ2l0dWRlLCBoZW1pICk7CisKKyAgICAvLyBCb2d1cyBmaXggcXVhbGl0eSAoMSksIHNhdGVsbGl0ZSBjb3VudCwgYW5kIGJvZ3VzIGRpbHV0aW9uCisgICAgc3RyYWxsb2NfYWRkX2Zvcm1hdCggbXNnU3RyLCAiLDEsNiwiKTsKKworICAgIC8vIEFsdGl0dWRlICh0byAwLjEgbWV0ZXIgcHJlY2lzaW9uKSArIGJvZ3VzIGRpZmYKKyAgICAvLyBNYWtlIHN1cmUgZWxldmF0aW9uIGlzIGZvcm1hdHRlZCB3aXRoIGEgZGVjaW1hbCBwb2ludCBpbnN0ZWFkIG9mIGNvbW1hLgorICAgIC8vIHNldGxvY2FsZSBpc24ndCB1c2VkIGJlY2F1c2Ugb2YgdGhyZWFkIHNhZmV0eSBjb25jZXJucy4KKyAgICBzdHJhbGxvY19hZGRfZm9ybWF0KCBlbGV2YXRpb25TdHIsICIlLjFmIiwgbWV0ZXJzRWxldmF0aW9uICk7CisgICAgZm9yIChlbGV2U3RyUHRyID0gc3RyYWxsb2NfY3N0cihlbGV2YXRpb25TdHIpOyAqZWxldlN0clB0cjsgKytlbGV2U3RyUHRyKSB7CisgICAgICAgIGlmICgqZWxldlN0clB0ciA9PSAnLCcpIHsKKyAgICAgICAgICAgICplbGV2U3RyUHRyID0gJy4nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RyYWxsb2NfYWRkX2Zvcm1hdCggbXNnU3RyLCAiLCVzLE0sMC4sTSIsIHN0cmFsbG9jX2NzdHIoZWxldmF0aW9uU3RyKSApOworICAgIHN0cmFsbG9jX3Jlc2V0KGVsZXZhdGlvblN0cik7CisKKyAgICAvLyBCb2d1cyByZXN0IGFuZCBjaGVja3N1bQorICAgIHN0cmFsbG9jX2FkZF9zdHIoIG1zZ1N0ciwgIiwsLCo0NyIgKTsKKworICAgIC8vIFNlbmQgaXQKKyAgICBhbmRyb2lkX2dwc19zZW5kX25tZWEoIHN0cmFsbG9jX2NzdHIobXNnU3RyKSApOworCisgICAgLy8gRnJlZSBpdAorICAgIHN0cmFsbG9jX3Jlc2V0KG1zZ1N0cik7Cit9CisKK2ludAorYW5kcm9pZF9ncHNfZ2V0X2xvY2F0aW9uKGRvdWJsZSogb3V0TGF0aXR1ZGUsIGRvdWJsZSogb3V0TG9uZ2l0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogb3V0TWV0ZXJzRWxldmF0aW9uLCBpbnQqIG91dE5TYXRlbGxpdGVzKQoreworICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIHVzZSAnYWRiIHNoZWxsIGR1bXBzeXMgbG9jYXRpb24nIGFuZCBwYXJzZSB0aGUgcmVzdWx0LgorICAgIC8vICAgICAgIEl0IG11c3QgaWdub3JlIHBhcmFtZXRlcnMgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IChudWxsIHBvaW50ZXJzKS4KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTBlOTJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oIgorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworLyogdGhpcyBpcyB0aGUgaW50ZXJuYWwgY2hhcmFjdGVyIGRyaXZlciB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlCisgKiBlbXVsYXRlZCBHUFMgdW5pdC4gc2VlIHFlbXVfY2hyX29wZW4oKSBpbiB2bC5jICovCitleHRlcm4gQ1NlcmlhbExpbmUqIGFuZHJvaWRfZ3BzX3NlcmlhbF9saW5lOworCitleHRlcm4gdm9pZCAgYW5kcm9pZF9ncHNfc2VuZF9ubWVhKCBjb25zdCBjaGFyKiAgc2VudGVuY2UgKTsKKworLy8gU2VuZCBhIEdQUyBsb2NhdGlvbiB0byB0aGUgQVZEIHVzaW5nIGFuIE5NRUEgc2VudGVuY2UKKy8vCisvLyBJbnB1dHM6IGxhdGl0dWRlOiAgICAgICAgRGVncmVlcworLy8gICAgICAgICBsb25naXR1ZGU6ICAgICAgIERlZ3JlZXMKKy8vICAgICAgICAgbWV0ZXJzRWxldmF0aW9uOiBNZXRlcnMgYWJvdmUgc2VhIGxldmVsCisvLyAgICAgICAgIG5TYXRlbGxpdGVzOiAgICAgTnVtYmVyIG9mIHNhdGVsbGl0ZXMgdXNlZAorLy8gICAgICAgICB0aW1lOiAgICAgICAgICAgIFVUQywgaW4gdGhlIGZvcm1hdCBwcm92aWRlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGdldHRpbWVvZmRheSgpCitleHRlcm4gdm9pZCAgYW5kcm9pZF9ncHNfc2VuZF9sb2NhdGlvbihkb3VibGUgbGF0aXR1ZGUsIGRvdWJsZSBsb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWV0ZXJzRWxldmF0aW9uLCBpbnQgblNhdGVsbGl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdGltZSk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIGFuZHJvaWRfZ3BzX2dldF9sb2NhdGlvbgorLy8KKy8vIEdldCB0aGUgZGV2aWNlcycgY3VycmVudCBHUFMgbG9jYXRpb24uCisvLworLy8gT3V0cHV0czoKKy8vICAgIFJldHVybiB2YWx1ZTogICAgIDEgb24gc3VjY2VzcywgMCBpZiBmYWlsZWQKKy8vCisvLyAgICBWYWxpZCBvbmx5IGlmIHRoZSByZXR1cm4gaXMgMToKKy8vICAgICpvdXRMYXRpdHVkZTogICAgICAgIERlZ3JlZXMKKy8vICAgICpvdXRMb25naXR1ZGU6ICAgICAgIERlZ3JlZXMKKy8vICAgICpvdXRNZXRlcnNFbGV2YXRpb246IE1ldGVycyBhYm92ZSBzZWEgbGV2ZWwKKy8vICAgICpvdXROU2F0ZWxsaXRlczogICAgIE51bWJlciBvZiBzYXRlbGxpdGVzIHVzZWQKKy8vIE51bGwgJ291dCcgcG9pbnRlcnMgYXJlIGlnbm9yZWQuCitleHRlcm4gaW50IGFuZHJvaWRfZ3BzX2dldF9sb2NhdGlvbihkb3VibGUqIG91dExhdGl0dWRlLCBkb3VibGUqIG91dExvbmdpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogb3V0TWV0ZXJzRWxldmF0aW9uLCBpbnQqIG91dE5TYXRlbGxpdGVzKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMvR3BzRml4LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0dwc0ZpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjUwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0dwc0ZpeC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBBIHN0cnVjdCByZXByZXNlbnRpbmcgYSBsb2NhdGlvbiBvbiBhIG1hcAorc3RydWN0IEdwc0ZpeCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBmbG9hdCBsYXRpdHVkZSA9IDAuMDsKKyAgICBmbG9hdCBsb25naXR1ZGUgPSAwLjA7CisgICAgZmxvYXQgZWxldmF0aW9uID0gMC4wOworICAgIHRpbWVfdCB0aW1lID0gMDsKKworICAgIGJvb2wgb3BlcmF0b3IgPChjb25zdCBHcHNGaXggJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiB0aW1lIDwgb3RoZXIudGltZTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEdwc0ZpeD4gR3BzRml4QXJyYXk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0dweFBhcnNlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0dweFBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzYjU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMvR3B4UGFyc2VyLmNwcApAQCAtMCwwICsxLDIyMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMvR3B4UGFyc2VyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nUGFyc2UuaCIKKworI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCisvLyBmb3JtYXQgYW4gZXJyb3IgbWVzc2FnZQordGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CitzdGF0aWMgc3RyaW5nIGZvcm1hdEVycm9yKGNvbnN0IGNoYXIqIGZvcm1hdCwgQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBjaGFyIGJ1ZlsxMDBdID0ge307CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsIGZvcm1hdCwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICByZXR1cm4gYnVmOworfQorCisKK3N0YXRpYyB2b2lkIGNsZWFudXBYbWxEb2MoeG1sRG9jICpkb2MpCit7CisgICAgeG1sRnJlZURvYyhkb2MpOworICAgIHhtbENsZWFudXBQYXJzZXIoKTsKK30KKworc3RhdGljIGJvb2wgcGFyc2VMb2NhdGlvbih4bWxOb2RlICpwdE5vZGUsIHhtbERvYyAqZG9jLCBHcHNGaXggKnJlc3VsdCwgc3RyaW5nICplcnJvcikKK3sKKyAgICBmbG9hdCBsYXRpdHVkZTsKKyAgICBmbG9hdCBsb25naXR1ZGU7CisKKyAgICB4bWxBdHRyUHRyIGF0dHI7CisgICAgeG1sQ2hhciAqdG1wU3RyOworCisgICAgLy8gQ2hlY2sgZm9yIGFuZCBnZXQgdGhlIGxhdGl0dWRlIGF0dHJpYnV0ZQorICAgIGF0dHIgPSB4bWxIYXNQcm9wKHB0Tm9kZSwgKGNvbnN0IHhtbENoYXIgKikgImxhdCIpOworICAgIGlmICghYXR0ciB8fCAhKHRtcFN0ciA9IHhtbEdldFByb3AocHROb2RlLCAoY29uc3QgeG1sQ2hhciAqKSAibGF0IikpKSB7CisgICAgICAgICplcnJvciA9IGZvcm1hdEVycm9yKCJQb2ludCBtaXNzaW5nIGEgbGF0aXR1ZGUgb24gbGluZSAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdE5vZGUtPmxpbmUpOworICAgICAgICByZXR1cm4gZmFsc2U7IC8vIFJldHVybiBlcnJvciBzaW5jZSBhIHBvaW50ICptdXN0KiBoYXZlIGEgbGF0aXR1ZGUKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmVhZCA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTc2NhbmZXaXRoQ0xvY2FsZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0bXBTdHIpLCAiJWYiLCAmbGF0aXR1ZGUpOworICAgICAgICB4bWxGcmVlKHRtcFN0cik7IC8vIENhbGxlci1mcmVlZAorICAgICAgICBpZiAocmVhZCAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3IgYW5kIGdldCB0aGUgbG9uZ2l0dWRlIGF0dHJpYnV0ZQorICAgIGF0dHIgPSB4bWxIYXNQcm9wKHB0Tm9kZSwgKGNvbnN0IHhtbENoYXIgKikgImxvbiIpOworICAgIGlmICghYXR0ciB8fCAhKHRtcFN0ciA9IHhtbEdldFByb3AocHROb2RlLCAoY29uc3QgeG1sQ2hhciAqKSAibG9uIikpKSB7CisgICAgICAgICplcnJvciA9IGZvcm1hdEVycm9yKCJQb2ludCBtaXNzaW5nIGEgbG9uZ2l0dWRlIG9uIGxpbmUgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHROb2RlLT5saW5lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBSZXR1cm4gZXJyb3Igc2luY2UgYSBwb2ludCAqbXVzdCogaGF2ZSBhIGxvbmdpdHVkZQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZWFkID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNzY2FuZldpdGhDTG9jYWxlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRtcFN0ciksICIlZiIsICZsb25naXR1ZGUpOworICAgICAgICB4bWxGcmVlKHRtcFN0cik7IC8vIENhbGxlci1mcmVlZAorICAgICAgICBpZiAocmVhZCAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgcmVzdWx0IHdpbGwgYmUgdmFsaWQgaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkCisgICAgcmVzdWx0LT5sYXRpdHVkZSA9IGxhdGl0dWRlOworICAgIHJlc3VsdC0+bG9uZ2l0dWRlID0gbG9uZ2l0dWRlOworCisgICAgLy8gQ2hlY2sgZm9yIHBvdGVudGlhbCBjaGlsZHJlbiBub2RlcyAoaW5jbHVkaW5nIHRpbWUsIGVsZXZhdGlvbiwgbmFtZSwgYW5kIGRlc2NyaXB0aW9uKQorICAgIC8vIE5vdGUgdGhhdCBub25lIGFyZSBhY3R1YWxseSByZXF1aXJlZCBhY2NvcmRpbmcgdG8gdGhlIEdQWCBmb3JtYXQuCisgICAgaW50IGNoaWxkQ291bnQgPSAwOworICAgIGZvciAoeG1sTm9kZSAqZmllbGQgPSBwdE5vZGUtPmNoaWxkcmVuOyBmaWVsZDsgZmllbGQgPSBmaWVsZC0+bmV4dCkgeworICAgICAgICB0bXBTdHIgPSBudWxscHRyOworCisgICAgICAgIGlmICggIXN0cmNtcCgoY29uc3QgY2hhciAqKSBmaWVsZC0+bmFtZSwgInRpbWUiKSApIHsKKyAgICAgICAgICAgIGlmICgodG1wU3RyID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBmaWVsZC0+Y2hpbGRyZW4sIDEpKSkgeworICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYSBudW1iZXIKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdG0gdGltZTsKKyAgICAgICAgICAgICAgICBpbnQgcmVzdWx0cyA9IHNzY2FuZigoY29uc3QgY2hhciAqKXRtcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXUtJXUtJXVUJXU6JXU6JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLnRtX3llYXIsICZ0aW1lLnRtX21vbiwgJnRpbWUudG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZS50bV9ob3VyLCAmdGltZS50bV9taW4sICZ0aW1lLnRtX3NlYyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMgIT0gNikgeworICAgICAgICAgICAgICAgICAgICAqZXJyb3IgPSBmb3JtYXRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXByb3Blcmx5IGZvcm1hdHRlZCB0aW1lIG9uIGxpbmUgJWQuPGJyLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZXMgbXVzdCBiZSBpbiBJU08gZm9ybWF0LiIsIHB0Tm9kZS0+bGluZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IGFjY29yZGluZyB0byB0aGUgc3RydWN0IHRtIHNwZWNpZmljYXRpb24KKyAgICAgICAgICAgICAgICB0aW1lLnRtX3llYXIgLT0gMTkwMDsgLy8gWWVhcnMgc2luY2UgMTkwMAorICAgICAgICAgICAgICAgIHRpbWUudG1fbW9uIC09IDE7IC8vIE1vbnRocyBzaW5jZSBKYW51YXJ5LCAwLTExCisKKyAgICAgICAgICAgICAgICByZXN1bHQtPnRpbWUgPSBta3RpbWUoJnRpbWUpOworCisgICAgICAgICAgICAgICAgeG1sRnJlZSh0bXBTdHIpOyAvLyBDYWxsZXItZnJlZWQKKyAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICFzdHJjbXAoKGNvbnN0IGNoYXIgKikgZmllbGQtPm5hbWUsICJlbGUiKSApIHsKKyAgICAgICAgICAgIGlmICgodG1wU3RyID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBmaWVsZC0+Y2hpbGRyZW4sIDEpKSkgeworICAgICAgICAgICAgICAgIGludCByZWFkID0KKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3NjYW5mV2l0aENMb2NhbGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odG1wU3RyKSwgIiVmIiwgJnJlc3VsdC0+ZWxldmF0aW9uKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKHRtcFN0cik7IC8vIENhbGxlci1mcmVlZAorICAgICAgICAgICAgICAgIGlmIChyZWFkICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICFzdHJjbXAoKGNvbnN0IGNoYXIgKikgZmllbGQtPm5hbWUsICJuYW1lIikgKSB7CisgICAgICAgICAgICBpZiAoKHRtcFN0ciA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgZmllbGQtPmNoaWxkcmVuLCAxKSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQtPm5hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih0bXBTdHIpOworICAgICAgICAgICAgICAgIHhtbEZyZWUodG1wU3RyKTsgLy8gQ2FsbGVyLWZyZWVkCisgICAgICAgICAgICAgICAgY2hpbGRDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIGZpZWxkLT5uYW1lLCAiZGVzYyIpICkgeworICAgICAgICAgICAgaWYgKCh0bXBTdHIgPSB4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGZpZWxkLT5jaGlsZHJlbiwgMSkpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5kZXNjcmlwdGlvbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRtcFN0cik7CisgICAgICAgICAgICAgICAgeG1sRnJlZSh0bXBTdHIpOyAvLyBDYWxsZXItZnJlZWQKKyAgICAgICAgICAgICAgICBjaGlsZENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgNCBwb3RlbnRpYWwgY2hpbGQgZmllbGRzLCBzbyBxdWl0IGFmdGVyIGZpbmRpbmcgdGhvc2UKKyAgICAgICAgaWYgKGNoaWxkQ291bnQgPT0gNCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcGFyc2UoeG1sRG9jICpkb2MsIEdwc0ZpeEFycmF5ICpmaXhlcywgc3RyaW5nICplcnJvcikKK3sKKyAgICB4bWxOb2RlICpyb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBHcHNGaXggbG9jYXRpb247CisgICAgYm9vbCBpc09rOworCisgICAgZm9yICh4bWxOb2RlICpjaGlsZCA9IHJvb3QtPmNoaWxkcmVuOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCisgICAgICAgIC8vIEluZGl2aWR1YWwgPHdwdD4gZWxlbWVudHMgYXJlIHBhcnNlZCBvbiB0aGVpciBvd24KKyAgICAgICAgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIGNoaWxkLT5uYW1lLCAid3B0IikgKSB7CisgICAgICAgICAgICBpc09rID0gcGFyc2VMb2NhdGlvbihjaGlsZCwgZG9jLCAmbG9jYXRpb24sIGVycm9yKTsKKyAgICAgICAgICAgIGlmICghaXNPaykgeworICAgICAgICAgICAgICAgIGNsZWFudXBYbWxEb2MoZG9jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXhlcy0+cHVzaF9iYWNrKGxvY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIDxydGU+IGVsZW1lbnRzIHJlcXVpcmUgYW4gYWRkaXRpb25hbCBkZXB0aCBvZiBwYXJzaW5nCisgICAgICAgIGVsc2UgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIGNoaWxkLT5uYW1lLCAicnRlIikgKSB7CisgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKnJ0ZXB0ID0gY2hpbGQtPmNoaWxkcmVuOyBydGVwdDsgcnRlcHQgPSBydGVwdC0+bmV4dCkgeworCisgICAgICAgICAgICAgICAgLy8gPHJ0ZXB0PiBlbGVtZW50cyBhcmUgcGFyc2VkIGp1c3QgbGlrZSA8d3B0PiBlbGVtZW50cworICAgICAgICAgICAgICAgIGlmICggIXN0cmNtcCgoY29uc3QgY2hhciAqKSBydGVwdC0+bmFtZSwgInJ0ZXB0IikgKSB7CisgICAgICAgICAgICAgICAgICAgIGlzT2sgPSBwYXJzZUxvY2F0aW9uKHJ0ZXB0LCBkb2MsICZsb2NhdGlvbiwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzT2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBYbWxEb2MoZG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaXhlcy0+cHVzaF9iYWNrKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyA8dHJrPiBlbGVtZW50cyByZXF1aXJlIHR3byBhZGRpdGlvbmFsIGRlcHRocyBvZiBwYXJzaW5nCisgICAgICAgIGVsc2UgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIGNoaWxkLT5uYW1lLCAidHJrIikgKSB7CisgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKnRya3NlZyA9IGNoaWxkLT5jaGlsZHJlbjsgdHJrc2VnOyB0cmtzZWcgPSB0cmtzZWctPm5leHQpIHsKKworICAgICAgICAgICAgICAgIC8vIFNraXAgbm9uIDx0cmtzZWc+IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIHRya3NlZy0+bmFtZSwgInRya3NlZyIpICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIDx0cmtzZWc+IGVsZW1lbnRzIGFuIGFkZGl0aW9uYWwgZGVwdGggb2YgcGFyc2luZworICAgICAgICAgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKnRya3B0ID0gdHJrc2VnLT5jaGlsZHJlbjsgdHJrcHQ7IHRya3B0ID0gdHJrcHQtPm5leHQpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gPHRya3B0PiBlbGVtZW50cyBhcmUgcGFyc2VkIGp1c3QgbGlrZSA8d3B0PiBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhc3RyY21wKChjb25zdCBjaGFyICopIHRya3B0LT5uYW1lLCAidHJrcHQiKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09rID0gcGFyc2VMb2NhdGlvbih0cmtwdCwgZG9jLCAmbG9jYXRpb24sIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzT2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cFhtbERvYyhkb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVzLT5wdXNoX2JhY2sobG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU29ydCB0aGUgdmFsdWVzIGJ5IHRpbWVzdGFtcAorICAgIHN0ZDo6c29ydChmaXhlcy0+YmVnaW4oKSwgZml4ZXMtPmVuZCgpKTsKKworICAgIGNsZWFudXBYbWxEb2MoZG9jKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHcHhQYXJzZXI6OnBhcnNlRmlsZShjb25zdCBjaGFyICpmaWxlUGF0aCwgR3BzRml4QXJyYXkgKmZpeGVzLCBzdHJpbmcgKmVycm9yKQoreworICAgIHhtbERvY1B0ciBkb2MgPSB4bWxSZWFkRmlsZShmaWxlUGF0aCwgbnVsbHB0ciwgMCk7CisgICAgaWYgKGRvYyA9PSBudWxscHRyKSB7CisgICAgICAgIGNsZWFudXBYbWxEb2MoZG9jKTsKKyAgICAgICAgKmVycm9yID0gIkdQWCBkb2N1bWVudCBub3QgcGFyc2VkIHN1Y2Nlc3NmdWxseS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBwYXJzZShkb2MsIGZpeGVzLCBlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0dweFBhcnNlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9HcHhQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg4MDAzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9HcHhQYXJzZXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMvR3BzRml4LmgiCisKK2NsYXNzIEdweFBhcnNlciB7CitwdWJsaWM6CisKKyAgICAvKiBQYXJzZXMgYSBnaXZlbiAuZ3B4IGZpbGUgYXQgfGZpbGVQYXRofCBhbmQgZXh0cmFjdHMgYWxsIGNvbnRhaW5lZCBHUFMKKyAgICAgKiBmaXhlcyBpbnRvIHwqZml4ZXN8LgorICAgICAqCisgICAgICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4gSWYgZmFsc2UgaXMgcmV0dXJuZWQsIHwqZXJyb3J8CisgICAgICogaXMgc2V0IHRvIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICAgICAqLworICAgIHN0YXRpYyBib29sIHBhcnNlRmlsZShjb25zdCBjaGFyICpmaWxlUGF0aCwgR3BzRml4QXJyYXkgKmZpeGVzLCBzdGQ6OnN0cmluZyAqZXJyb3IpOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMvR3B4UGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMvR3B4UGFyc2VyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIzMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9HcHhQYXJzZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzUzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGVtcERpci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1V0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMvR3B4UGFyc2VyLmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RUZW1wRGlyOworCituYW1lc3BhY2UgYW5kcm9pZF9ncHMgeworCitURVNUKEdweFBhcnNlciwgUGFyc2VGaWxlTm90Rm91bmQpIHsKKyAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgYm9vbCBpc09rID0gR3B4UGFyc2VyOjpwYXJzZUZpbGUoImlfZG9udF9leGlzdC5ncHgiLCAmbG9jYXRpb25zLCAmZXJyb3IpOworICAgIEVYUEVDVF9GQUxTRShpc09rKTsKK30KKworVEVTVChHcHhQYXJzZXIsIFBhcnNlRmlsZUVtcHR5KSB7CisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgorICAgICAgICAgICAgIjxncHg+IgorICAgICAgICAgICAgIjwvZ3B4PiI7CisKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3QuZ3B4Iik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCB0ZXh0OworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIGJvb2wgaXNPayA9IEdweFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKTsKKyAgICBFWFBFQ1RfVFJVRShpc09rKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYXRpb25zLnNpemUoKSk7Cit9CisKK1RFU1QoR3B4UGFyc2VyLCBQYXJzZUZpbGVFbXB0eVJ0ZVRyaykgeworICAgIGNoYXIgdGV4dFtdID0KKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIKKyAgICAgICAgICAgICI8Z3B4PiIKKyAgICAgICAgICAgICI8cnRlPiIKKyAgICAgICAgICAgICI8L3J0ZT4iCisgICAgICAgICAgICAiPHRyaz4iCisgICAgICAgICAgICAiPHRya3NlZz4iCisgICAgICAgICAgICAiPC90cmtzZWc+IgorICAgICAgICAgICAgIjwvdHJrPiIKKyAgICAgICAgICAgICI8L2dweD4iOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX1RSVUUoaXNPayk7CisgICAgRVhQRUNUX0VRKDAsIGxvY2F0aW9ucy5zaXplKCkpOworfQorCitURVNUKEdweFBhcnNlciwgUGFyc2VGaWxlVmFsaWQpIHsKKyAgICBjaGFyIHRleHRbXSA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iCisgICAgICAgICAgICAiPGdweD4iCisgICAgICAgICAgICAgICAgIjx3cHQgbG9uPVwiMFwiIGxhdD1cIjBcIj4iCisgICAgICAgICAgICAgICAgIjxuYW1lPldwdCAxPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC93cHQ+IgorICAgICAgICAgICAgICAgICI8d3B0IGxvbj1cIjBcIiBsYXQ9XCIwXCI+IgorICAgICAgICAgICAgICAgICI8bmFtZT5XcHQgMjwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvd3B0PiIKKyAgICAgICAgICAgICI8cnRlPiIKKyAgICAgICAgICAgICAgICAiPHJ0ZXB0IGxvbj1cIjBcIiBsYXQ9XCIwXCI+IgorICAgICAgICAgICAgICAgICI8bmFtZT5SdGVwdCAxPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC9ydGVwdD4iCisgICAgICAgICAgICAgICAgIjxydGVwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+UnRlcHQgMjwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvcnRlcHQ+IgorICAgICAgICAgICAgIjwvcnRlPiIKKyAgICAgICAgICAgICI8dHJrPiIKKyAgICAgICAgICAgICI8dHJrc2VnPiIKKyAgICAgICAgICAgICAgICAiPHRya3B0IGxvbj1cIjBcIiBsYXQ9XCIwXCI+IgorICAgICAgICAgICAgICAgICI8bmFtZT5UcmtwdCAxLTE8L25hbWU+IgorICAgICAgICAgICAgICAgICI8L3Rya3B0PiIKKyAgICAgICAgICAgICAgICAiPHRya3B0IGxvbj1cIjBcIiBsYXQ9XCIwXCI+IgorICAgICAgICAgICAgICAgICI8bmFtZT5UcmtwdCAxLTI8L25hbWU+IgorICAgICAgICAgICAgICAgICI8L3Rya3B0PiIKKyAgICAgICAgICAgICI8L3Rya3NlZz4iCisgICAgICAgICAgICAiPHRya3NlZz4iCisgICAgICAgICAgICAgICAgIjx0cmtwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+VHJrcHQgMi0xPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC90cmtwdD4iCisgICAgICAgICAgICAgICAgIjx0cmtwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+VHJrcHQgMi0yPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC90cmtwdD4iCisgICAgICAgICAgICAiPC90cmtzZWc+IgorICAgICAgICAgICAgIjwvdHJrPiIKKyAgICAgICAgICAgICI8L2dweD4iOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX1RSVUUoaXNPayk7CisgICAgQVNTRVJUX0VRKDgsIGxvY2F0aW9ucy5zaXplKCkpOworCisgICAgRVhQRUNUX0VRKCJXcHQgMSIsIGxvY2F0aW9uc1swXS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIldwdCAyIiwgbG9jYXRpb25zWzFdLm5hbWUpOworICAgIEVYUEVDVF9FUSgiUnRlcHQgMSIsIGxvY2F0aW9uc1syXS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIlJ0ZXB0IDIiLCBsb2NhdGlvbnNbM10ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJUcmtwdCAxLTEiLCBsb2NhdGlvbnNbNF0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJUcmtwdCAxLTIiLCBsb2NhdGlvbnNbNV0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJUcmtwdCAyLTEiLCBsb2NhdGlvbnNbNl0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJUcmtwdCAyLTIiLCBsb2NhdGlvbnNbN10ubmFtZSk7Cit9CisKKworVEVTVChHcHhQYXJzZXIsIFBhcnNlRmlsZU51bGxBdHRyaWJ1dGUpIHsKKyAgICBjaGFyIHRleHRbXSA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iCisgICAgICAgICAgICAiPGdweD4iCisgICAgICAgICAgICAgICAgIjx3cHQgbG9uPVwiMFwiIGxhdD1cIjBcIj4iCisgICAgICAgICAgICAgICAgICAgICI8bmFtZS8+IgorICAgICAgICAgICAgICAgICI8L3dwdD4iCisgICAgICAgICAgICAiPC9ncHg+IjsKKworICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBteURpci5tYWtlU3ViUGF0aCgidGVzdC5ncHgiKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlKHBhdGguY19zdHIoKSk7CisgICAgbXlmaWxlIDw8IHRleHQ7CisgICAgbXlmaWxlLmNsb3NlKCk7CisKKyAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisKKyAgICAvLyBUaGlzIHRlc3Qgb25seSBjaGVja3MgaWYgR3B4UGFyc2VyIGRvZXNuJ3QgY3Jhc2ggb24gbnVsbCBhdHRyaWJ1dGVzCisgICAgLy8gU28gaWYgd2UncmUgaGVyZSBpdCdzIGFscmVhZHkgT2sgLSB0aGVzZSB0ZXN0cyBhcmVuJ3QgdGhhdCByZWxldmFudC4KKyAgICBFWFBFQ1RfVFJVRShpc09rKTsKKyAgICBFWFBFQ1RfRVEoMSwgbG9jYXRpb25zLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBsb2NhdGlvbnNbMF0ubmFtZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShlcnJvci5lbXB0eSgpKTsKK30KKworCitURVNUKEdweFBhcnNlciwgUGFyc2VMb2NhdGlvbk1pc3NpbmdMYXRpdHVkZSkgeworICAgIGNoYXIgdGV4dFtdID0KKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIKKyAgICAgICAgICAgICI8Z3B4PiIKKyAgICAgICAgICAgICI8d3B0IGxvbj1cIjkuODFcIj4iCisgICAgICAgICAgICAiPGVsZT42LjAyPC9lbGU+IgorICAgICAgICAgICAgIjxuYW1lPk5hbWU8L25hbWU+IgorICAgICAgICAgICAgIjxkZXNjPkRlc2M8L2Rlc2M+IgorICAgICAgICAgICAgIjwvd3B0PiIKKyAgICAgICAgICAgICI8L2dweD4iOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGUocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX0ZBTFNFKGlzT2spOworfQorCitURVNUKEdweFBhcnNlciwgUGFyc2VMb2NhdGlvbk1pc3NpbmdMb25naXR1ZGUpIHsKKyAgICBjaGFyIHRleHRbXSA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iCisgICAgICAgICAgICAiPGdweD4iCisgICAgICAgICAgICAiPHdwdCBsYXQ9XCIzLjE0MTVcIj4iCisgICAgICAgICAgICAiPGVsZT42LjAyPC9lbGU+IgorICAgICAgICAgICAgIjxuYW1lPk5hbWU8L25hbWU+IgorICAgICAgICAgICAgIjxkZXNjPkRlc2M8L2Rlc2M+IgorICAgICAgICAgICAgIjwvd3B0PiIKKyAgICAgICAgICAgICI8L2dweD4iOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGUocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX0ZBTFNFKGlzT2spOworfQorCitURVNUKEdweFBhcnNlciwgUGFyc2VWYWxpZExvY2F0aW9uKSB7CisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgorICAgICAgICAgICAgIjxncHg+IgorICAgICAgICAgICAgIjx3cHQgbG9uPVwiOS44MVwiIGxhdD1cIjMuMTQxNVwiPiIKKyAgICAgICAgICAgICI8ZWxlPjYuMDI8L2VsZT4iCisgICAgICAgICAgICAiPG5hbWU+TmFtZTwvbmFtZT4iCisgICAgICAgICAgICAiPGRlc2M+RGVzYzwvZGVzYz4iCisgICAgICAgICAgICAiPC93cHQ+IgorICAgICAgICAgICAgIjwvZ3B4PiI7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGUocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX1RSVUUoaXNPayk7CisgICAgRVhQRUNUX0VRKDEsIGxvY2F0aW9ucy5zaXplKCkpOworICAgIGNvbnN0IEdwc0ZpeCYgd3B0ID0gbG9jYXRpb25zWzBdOworCisgICAgRVhQRUNUX0VRKCJEZXNjIiwgd3B0LmRlc2NyaXB0aW9uKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoNi4wMiwgd3B0LmVsZXZhdGlvbik7CisgICAgRVhQRUNUX0ZMT0FUX0VRKDMuMTQxNSwgd3B0LmxhdGl0dWRlKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoOS44MSwgd3B0LmxvbmdpdHVkZSk7CisgICAgRVhQRUNUX0VRKCJOYW1lIiwgd3B0Lm5hbWUpOworfQorCisKK1RFU1QoR3B4UGFyc2VyLCBQYXJzZVZhbGlkTG9jYXRpb25Db21tYUxvY2FsZSkgeworICAgIGF1dG8gc2NvcGVkQ29tbWFMb2NhbGUgPSBzZXRTY29wZWRDb21tYUxvY2FsZSgpOworCisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgorICAgICAgICAgICAgIjxncHg+IgorICAgICAgICAgICAgIjx3cHQgbG9uPVwiOS44MVwiIGxhdD1cIjMuMTQxNVwiPiIKKyAgICAgICAgICAgICI8ZWxlPjYuMDI8L2VsZT4iCisgICAgICAgICAgICAiPG5hbWU+TmFtZTwvbmFtZT4iCisgICAgICAgICAgICAiPGRlc2M+RGVzYzwvZGVzYz4iCisgICAgICAgICAgICAiPC93cHQ+IgorICAgICAgICAgICAgIjwvZ3B4PiI7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmdweCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGUocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgdGV4dDsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIGlzT2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcik7CisgICAgRVhQRUNUX1RSVUUoaXNPayk7CisgICAgRVhQRUNUX0VRKDEsIGxvY2F0aW9ucy5zaXplKCkpOworICAgIGNvbnN0IEdwc0ZpeCYgd3B0ID0gbG9jYXRpb25zWzBdOworCisgICAgRVhQRUNUX0VRKCJEZXNjIiwgd3B0LmRlc2NyaXB0aW9uKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoNi4wMiwgd3B0LmVsZXZhdGlvbik7CisgICAgRVhQRUNUX0ZMT0FUX0VRKDMuMTQxNSwgd3B0LmxhdGl0dWRlKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEoOS44MSwgd3B0LmxvbmdpdHVkZSk7CisgICAgRVhQRUNUX0VRKCJOYW1lIiwgd3B0Lm5hbWUpOworfQorCitURVNUKEdweFBhcnNlciwgUGFyc2VWYWxpZERvY3VtZW50KSB7CisgICAgY2hhciB0ZXh0W10gPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgorICAgICAgICAgICAgIjxncHg+IgorICAgICAgICAgICAgICAgICI8d3B0IGxvbj1cIjBcIiBsYXQ9XCIwXCI+IgorICAgICAgICAgICAgICAgICI8bmFtZT5XcHQgMTwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvd3B0PiIKKyAgICAgICAgICAgICAgICAiPHdwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+V3B0IDI8L25hbWU+IgorICAgICAgICAgICAgICAgICI8L3dwdD4iCisgICAgICAgICAgICAiPHJ0ZT4iCisgICAgICAgICAgICAgICAgIjxydGVwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+UnRlcHQgMTwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvcnRlcHQ+IgorICAgICAgICAgICAgICAgICI8cnRlcHQgbG9uPVwiMFwiIGxhdD1cIjBcIj4iCisgICAgICAgICAgICAgICAgIjxuYW1lPlJ0ZXB0IDI8L25hbWU+IgorICAgICAgICAgICAgICAgICI8L3J0ZXB0PiIKKyAgICAgICAgICAgICI8L3J0ZT4iCisgICAgICAgICAgICAiPHRyaz4iCisgICAgICAgICAgICAiPHRya3NlZz4iCisgICAgICAgICAgICAgICAgIjx0cmtwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+VHJrcHQgMS0xPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC90cmtwdD4iCisgICAgICAgICAgICAgICAgIjx0cmtwdCBsb249XCIwXCIgbGF0PVwiMFwiPiIKKyAgICAgICAgICAgICAgICAiPG5hbWU+VHJrcHQgMS0yPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAiPC90cmtwdD4iCisgICAgICAgICAgICAiPC90cmtzZWc+IgorICAgICAgICAgICAgIjx0cmtzZWc+IgorICAgICAgICAgICAgICAgICI8dHJrcHQgbG9uPVwiMFwiIGxhdD1cIjBcIj4iCisgICAgICAgICAgICAgICAgIjxuYW1lPlRya3B0IDItMTwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvdHJrcHQ+IgorICAgICAgICAgICAgICAgICI8dHJrcHQgbG9uPVwiMFwiIGxhdD1cIjBcIj4iCisgICAgICAgICAgICAgICAgIjxuYW1lPlRya3B0IDItMjwvbmFtZT4iCisgICAgICAgICAgICAgICAgIjwvdHJrcHQ+IgorICAgICAgICAgICAgIjwvdHJrc2VnPiIKKyAgICAgICAgICAgICI8L3Ryaz4iCisgICAgICAgICAgICAiPC9ncHg+IjsKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3QuZ3B4Iik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZShwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCB0ZXh0OworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIGJvb2wgaXNPayA9IEdweFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKTsKKyAgICBFWFBFQ1RfVFJVRShpc09rKTsKKyAgICBFWFBFQ1RfRVEoOCwgbG9jYXRpb25zLnNpemUoKSk7CisKKyAgICBFWFBFQ1RfRVEoIldwdCAxIiwgbG9jYXRpb25zWzBdLm5hbWUpOworICAgIEVYUEVDVF9FUSgiV3B0IDIiLCBsb2NhdGlvbnNbMV0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJSdGVwdCAxIiwgbG9jYXRpb25zWzJdLm5hbWUpOworICAgIEVYUEVDVF9FUSgiUnRlcHQgMiIsIGxvY2F0aW9uc1szXS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIlRya3B0IDEtMSIsIGxvY2F0aW9uc1s0XS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIlRya3B0IDEtMiIsIGxvY2F0aW9uc1s1XS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIlRya3B0IDItMSIsIGxvY2F0aW9uc1s2XS5uYW1lKTsKKyAgICBFWFBFQ1RfRVEoIlRya3B0IDItMiIsIGxvY2F0aW9uc1s3XS5uYW1lKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9LbWxQYXJzZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9LbWxQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTNkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0ttbFBhcnNlci5jcHAKQEAgLTAsMCArMSwxOTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgLy8KKyAvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorIC8vCisgLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMvS21sUGFyc2VyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nUGFyc2UuaCIKKworI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCisvLyBDb29yZGluYXRlcyBjYW4gYmUgbmVzdGVkIGFyYml0cmFyaWx5IGRlZXAgd2l0aGluIGEgUGxhY2VtYXJrLCBkZXBlbmRpbmcKKy8vIG9uIHRoZSB0eXBlIG9mIG9iamVjdCAoUG9pbnQsIExpbmVTdHJpbmcsIFBvbHlnb24pIHRoZSBQbGFjZW1hcmsgY29udGFpbnMKK3N0YXRpYyB4bWxOb2RlKiBmaW5kQ29vcmRpbmF0ZXMoeG1sTm9kZSogY3VycmVudCkgeworICAgIGZvciAoOyBjdXJyZW50ICE9IG51bGxwdHI7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKChjb25zdCBjaGFyICopIGN1cnJlbnQtPm5hbWUsICJjb29yZGluYXRlcyIpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgfQorICAgICAgICB4bWxOb2RlICogY2hpbGRyZW4gPSBmaW5kQ29vcmRpbmF0ZXMoY3VycmVudC0+eG1sQ2hpbGRyZW5Ob2RlKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gQ29vcmRpbmF0ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKy8vICAgICAgICA8Y29vcmRpbmF0ZXM+IC0xMTIuMjY1NjU0OTI4NjAyLDM2LjA5NDQ3NjcyNjAyNTQ2LDIzNTcKKy8vICAgICAgICAgICAgICAgIC4uLgorLy8gICAgICAgICAgICAgICAgLTExMi4yNjU3Mzc0NTg3MzIxLDM2LjA4NjQ2MzEyMzAxMzAzLDIzNTcKKy8vICAgICAgICA8L2Nvb3JkaW5hdGVzPgorLy8gb2Z0ZW4gZW50aXJlbHkgY29udGFpbmVkIGluIGEgc2luZ2xlIHN0cmluZywgbmVjZXNzaXRhdGluZyByZWdleAorc3RhdGljIGJvb2wgcGFyc2VDb29yZGluYXRlcyh4bWxOb2RlKiBjdXJyZW50LCBHcHNGaXhBcnJheSogZml4ZXMpIHsKKyAgICB4bWxOb2RlKiBjb29yZGluYXRlc19ub2RlID0gZmluZENvb3JkaW5hdGVzKGN1cnJlbnQpOworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICBpZiAoY29vcmRpbmF0ZXNfbm9kZSA9PSBudWxscHRyIHx8CisgICAgICAgIGNvb3JkaW5hdGVzX25vZGUtPnhtbENoaWxkcmVuTm9kZSA9PSBudWxscHRyIHx8CisgICAgICAgIGNvb3JkaW5hdGVzX25vZGUtPnhtbENoaWxkcmVuTm9kZS0+Y29udGVudCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBjb29yZGluYXRlcyA9IChjb25zdCBjaGFyKikoY29vcmRpbmF0ZXNfbm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLT5jb250ZW50KTsKKyAgICBpbnQgY29vcmRpbmF0ZXNfbGVuID0gc3RybGVuKGNvb3JkaW5hdGVzKTsKKyAgICBpbnQgb2Zmc2V0ID0gMCwgbiA9IDA7CisgICAgR3BzRml4IG5ld19maXg7CisgICAgd2hpbGUoMyA9PSBhbmRyb2lkOjpiYXNlOjpTc2NhbmZXaXRoQ0xvY2FsZSgKKyAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAiJWYgLCAlZiAsICVmJW4iLAorICAgICAgICAgICAgICAgICAgICAgICZuZXdfZml4LmxvbmdpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAmbmV3X2ZpeC5sYXRpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAmbmV3X2ZpeC5lbGV2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgJm4pKSB7CisgICAgICAgIGZpeGVzLT5wdXNoX2JhY2sobmV3X2ZpeCk7CisgICAgICAgIG9mZnNldCArPSBuOworICAgIH0KKworICAgIC8vIE9ubHkgYWxsb3cgd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgdG8gcmVtYWluIHVuY29uc3VtZWQuCisgICAgZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGNvb3JkaW5hdGVzX2xlbiAmJiByZXN1bHQ7ICsraSkgeworICAgICAgICByZXN1bHQgPSBpc3NwYWNlKGNvb3JkaW5hdGVzW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYm9vbCBwYXJzZUd4VHJhY2soeG1sTm9kZSogY2hpbGRyZW4sIEdwc0ZpeEFycmF5KiBmaXhlcykgeworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICBmb3IgKHhtbE5vZGUqIGN1cnJlbnQgPSBjaGlsZHJlbjsgcmVzdWx0ICYmIGN1cnJlbnQgIT0gbnVsbHB0cjsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpIHsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgY3VycmVudC0+bnMgJiYKKyAgICAgICAgICAgIGN1cnJlbnQtPm5zLT5wcmVmaXggJiYKKyAgICAgICAgICAgICFzdHJjbXAoKGNvbnN0IGNoYXIqKWN1cnJlbnQtPm5zLT5wcmVmaXgsICJneCIpICYmCisgICAgICAgICAgICAhc3RyY21wKChjb25zdCBjaGFyICopY3VycmVudC0+bmFtZSwgImNvb3JkIikpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvb3JkaW5hdGVzeyhjb25zdCBjaGFyKiljdXJyZW50LT54bWxDaGlsZHJlbk5vZGUtPmNvbnRlbnR9OworICAgICAgICAgICAgR3BzRml4IG5ld19maXg7CisgICAgICAgICAgICByZXN1bHQgPSAoMyA9PSBhbmRyb2lkOjpiYXNlOjpTc2NhbmZXaXRoQ0xvY2FsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZiAlZiAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19maXgubG9uZ2l0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfZml4LmxhdGl0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfZml4LmVsZXZhdGlvbikpOworICAgICAgICAgICAgZml4ZXMtPnB1c2hfYmFjayhuZXdfZml4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgYm9vbCBwYXJzZVBsYWNlbWFyayh4bWxOb2RlKiBjdXJyZW50LCBHcHNGaXhBcnJheSogZml4ZXMpIHsKKyAgICBzdHJpbmcgZGVzY3JpcHRpb247CisgICAgc3RyaW5nIG5hbWU7CisgICAgc2l6ZV90IGluZCA9IHN0cmluZzo6bnBvczsKKyAgICAvLyBub3Qgd29ycmllZCBhYm91dCBjYXNlLXNlbnNpdGl2aXR5IHNpbmNlIC5rbWwgZmlsZXMKKyAgICAvLyBhcmUgZXhwZWN0ZWQgdG8gYmUgbWFjaGluZS1nZW5lcmF0ZWQKKyAgICBmb3IgKDsgY3VycmVudCAhPSBudWxscHRyOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgeworICAgICAgICBjb25zdCBib29sIGhhc0NvbnRlbnQgPQorICAgICAgICAgICAgICAgIGN1cnJlbnQtPnhtbENoaWxkcmVuTm9kZSAmJiBjdXJyZW50LT54bWxDaGlsZHJlbk5vZGUtPmNvbnRlbnQ7CisKKyAgICAgICAgaWYgKGhhc0NvbnRlbnQgJiYgIXN0cmNtcCgoY29uc3QgY2hhciopY3VycmVudC0+bmFtZSwgImRlc2NyaXB0aW9uIikpIHsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gKGNvbnN0IGNoYXIqKWN1cnJlbnQtPnhtbENoaWxkcmVuTm9kZS0+Y29udGVudDsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNDb250ZW50ICYmICFzdHJjbXAoKGNvbnN0IGNoYXIqKWN1cnJlbnQtPm5hbWUsICJuYW1lIikpIHsKKyAgICAgICAgICAgIG5hbWUgPSAoY29uc3QgY2hhciAqKSBjdXJyZW50LT54bWxDaGlsZHJlbk5vZGUtPmNvbnRlbnQ7CisgICAgICAgIH0gZWxzZSBpZiAoCisgICAgICAgICAgICAgICAgIXN0cmNtcCgoY29uc3QgY2hhciAqKSBjdXJyZW50LT5uYW1lLCAiUG9pbnQiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoKGNvbnN0IGNoYXIgKikgY3VycmVudC0+bmFtZSwgIkxpbmVTdHJpbmciKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoKGNvbnN0IGNoYXIgKikgY3VycmVudC0+bmFtZSwgIlBvbHlnb24iKSkgeworICAgICAgICAgICAgaW5kID0gKGluZCAhPSBzdHJpbmc6Om5wb3MgPyBpbmQgOmZpeGVzLT5zaXplKCkpOworICAgICAgICAgICAgaWYgKCFwYXJzZUNvb3JkaW5hdGVzKGN1cnJlbnQtPnhtbENoaWxkcmVuTm9kZSwgZml4ZXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKAorICAgICAgICAgICAgY3VycmVudC0+bnMgJiYKKyAgICAgICAgICAgIGN1cnJlbnQtPm5zLT5wcmVmaXggJiYKKyAgICAgICAgICAgICFzdHJjbXAoKGNvbnN0IGNoYXIqKWN1cnJlbnQtPm5zLT5wcmVmaXgsICJneCIpICYmCisgICAgICAgICAgICAhc3RyY21wKChjb25zdCBjaGFyKiljdXJyZW50LT5uYW1lLCAiVHJhY2siKSkgeworICAgICAgICAgICAgaW5kID0gKGluZCAhPSBzdHJpbmc6Om5wb3MgPyBpbmQgOmZpeGVzLT5zaXplKCkpOworICAgICAgICAgICAgaWYgKCFwYXJzZUd4VHJhY2soY3VycmVudC0+eG1sQ2hpbGRyZW5Ob2RlLCBmaXhlcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5kID09IHN0cmluZzo6bnBvcyB8fCBpbmQgPj0gZml4ZXMtPnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gb25seSBhc3NpZ24gbmFtZSBhbmQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IG9mIHRoZQorICAgIC8vIHBvaW50cyB0byBhdm9pZCBuZWVkbGVzcyByZXBldGl0aW9uCisgICAgKCpmaXhlcylbaW5kXS5kZXNjcmlwdGlvbiA9IHN0ZDo6bW92ZShkZXNjcmlwdGlvbik7CisgICAgKCpmaXhlcylbaW5kXS5uYW1lID0gc3RkOjptb3ZlKG5hbWUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBsYWNlbWFya3MgKGFrYSBsb2NhdGlvbnMpIGNhbiBiZSBuZXN0ZWQgYXJiaXRyYXJpbHkgZGVlcAorc3RhdGljIGJvb2wgdHJhdmVyc2VTdWJ0cmVlKHhtbE5vZGUqIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BzRml4QXJyYXkqIGZpeGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIHsKKyAgICBmb3IgKDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQtPm5hbWUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICFzdHJjbXAoKGNvbnN0IGNoYXIgKikgY3VycmVudC0+bmFtZSwgIlBsYWNlbWFyayIpKSB7CisKKyAgICAgICAgICAgIGlmICghcGFyc2VQbGFjZW1hcmsoY3VycmVudC0+eG1sQ2hpbGRyZW5Ob2RlLCBmaXhlcykpIHsKKyAgICAgICAgICAgICAgICAqZXJyb3IgPSAiTG9jYXRpb24gZm91bmQgd2l0aCBtaXNzaW5nIG9yIG1hbGZvcm1lZCBjb29yZGluYXRlcyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQtPm5hbWUgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgIHN0cmNtcCgoY29uc3QgY2hhciAqKSBjdXJyZW50LT5uYW1lLCAidGV4dCIpKSB7CisKKyAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGEgUGxhY2VtYXJrIHdlIG11c3QgZ28gZGVlcGVyCisgICAgICAgICAgICBpZiAoIXRyYXZlcnNlU3VidHJlZShjdXJyZW50LT54bWxDaGlsZHJlbk5vZGUsIGZpeGVzLCBlcnJvcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZXJyb3ItPmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgS21sUGFyc2VyOjpwYXJzZUZpbGUoY29uc3QgY2hhciAqIGZpbGVQYXRoLCBHcHNGaXhBcnJheSAqIGZpeGVzLCBzdHJpbmcgKiBlcnJvcikgeworICAgIC8vIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgYW5kIGNoZWNrcyBwb3RlbnRpYWwgQUJJIG1pc21hdGNoZXMgYmV0d2VlbgorICAgIC8vIHRoZSB2ZXJzaW9uIGl0IHdhcyBjb21waWxlZCBmb3IgYW5kIHRoZSBhY3R1YWwgc2hhcmVkIGxpYnJhcnkgdXNlZC4KKyAgICBMSUJYTUxfVEVTVF9WRVJTSU9OCisKKyAgICB4bWxEb2NQdHIgZG9jID0geG1sUmVhZEZpbGUoZmlsZVBhdGgsIG51bGxwdHIsIDApOworICAgIGlmIChkb2MgPT0gbnVsbHB0cikgeworICAgICAgICAqZXJyb3IgPSAiS01MIGRvY3VtZW50IG5vdCBwYXJzZWQgc3VjY2Vzc2Z1bGx5LiI7CisgICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IG51bGxwdHIpIHsKKyAgICAgICAgKmVycm9yID0gIkNvdWxkIG5vdCBnZXQgcm9vdCBlbGVtZW50IG9mIHBhcnNlZCBLTUwgZmlsZS4iOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHhtbENsZWFudXBQYXJzZXIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIGlzV2VsbEZvcm1lZCA9IHRyYXZlcnNlU3VidHJlZShjdXIsIGZpeGVzLCBlcnJvcik7CisKKyAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sQ2xlYW51cFBhcnNlcigpOworCisgICAgcmV0dXJuIGlzV2VsbEZvcm1lZDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHMvS21sUGFyc2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0ttbFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzc4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0ttbFBhcnNlci5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2dwcy9HcHNGaXguaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgS21sUGFyc2VyIHsKK3B1YmxpYzoKKyAgICAvLyBQYXJzZXMgYSBnaXZlbiAua21sIGZpbGUgYXQgfGZpbGVQYXRofCBhbmQgZXh0cmFjdHMgYWxsIGNvbnRhaW5lZCBHUFMKKyAgICAvLyBmaXhlcyBpbnRvIHwqZml4ZXN8LgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuIGlmIGZhbHNlIGlzIHJldHVybmVkLCB8KmVycm9yfAorICAgIC8vIGlzIHNldCB0byBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuCisgICAgc3RhdGljIGJvb2wgcGFyc2VGaWxlKGNvbnN0IGNoYXIgKiBmaWxlUGF0aCwgR3BzRml4QXJyYXkgKiBmaXhlcywgc3RkOjpzdHJpbmcgKiBlcnJvcik7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9LbWxQYXJzZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwcy9LbWxQYXJzZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjU2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvZ3BzL0ttbFBhcnNlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw1ODMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZ3BzL0ttbFBhcnNlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9VdGlscy5oIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0VGVtcERpcjsKKworbmFtZXNwYWNlIGFuZHJvaWRfZ3BzIHsKKworVEVTVChLbWxQYXJzZXIsIFBhcnNlTm9uZXhpc3RlbnRGaWxlKSB7CisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIEFTU0VSVF9GQUxTRShLbWxQYXJzZXI6OnBhcnNlRmlsZSgiIiwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgQVNTRVJUX0VRKDAsIGxvY2F0aW9ucy5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiS01MIGRvY3VtZW50IG5vdCBwYXJzZWQgc3VjY2Vzc2Z1bGx5LiIpLCBlcnJvcik7Cit9CisKK1RFU1QoS21sUGFyc2VyLCBQYXJzZUVtcHR5RmlsZSkgeworICAgIHsKKyAgICAgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgICAgIG15ZmlsZS5vcGVuKHBhdGguY19zdHIoKSk7CisgICAgICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgICI8a21sIHhtbG5zPVwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIueFwiPiIKKyAgICAgICAgICAgICAiPC9rbWw+IjsKKyAgICAgICAgbXlmaWxlLmNsb3NlKCk7CisKKyAgICAgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICAgICAgQVNTRVJUX1RSVUUoS21sUGFyc2VyOjpwYXJzZUZpbGUocGF0aC5jX3N0cigpLCAmbG9jYXRpb25zLCAmZXJyb3IpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGxvY2F0aW9ucy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoIiIsIGVycm9yKTsKKyAgICAgfSAgIC8vIGRlc3RydWN0b3IgcmVtb3ZlcyB0ZW1wIGRpcmVjdG9yeSBhbmQgYWxsIGZpbGVzIHVuZGVyIGl0LgorfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VWYWxpZEZpbGUpIHsKKyAgICB7CisgICAgICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgICAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmttbCIpOworCisgICAgICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlOworICAgICAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgICAgICBteWZpbGUgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAgICAgICI8a21sIHhtbG5zPVwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIueFwiPiIKKyAgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICI8bmFtZT5TaW1wbGUgcGxhY2VtYXJrPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5BdHRhY2hlZCB0byB0aGUgZ3JvdW5kLjwvZGVzY3JpcHRpb24+IgorICAgICAgICAgICAgICAgICAiPFBvaW50PiIKKyAgICAgICAgICAgICAgICAgIjxjb29yZGluYXRlcz4tMTIyLjA4MjIwMzU0MjU2ODMsMzcuNDIyMjg5OTAxNDAyNTEsMDwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgICAgICAiPC9Qb2ludD4iCisgICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICI8L2ttbD4iOworICAgICAgICBteWZpbGUuY2xvc2UoKTsKKworICAgICAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgICAgICBBU1NFUlRfVFJVRShLbWxQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcikpOworICAgICAgICBFWFBFQ1RfRVEoMSwgbG9jYXRpb25zLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgiIiwgZXJyb3IpOworICAgICB9ICAgLy8gZGVzdHJ1Y3RvciByZW1vdmVzIHRlbXAgZGlyZWN0b3J5IGFuZCBhbGwgZmlsZXMgdW5kZXIgaXQuCit9CisKK1RFU1QoS21sUGFyc2VyLCBQYXJzZVZhbGlkQ29tcGxleEZpbGUpIHsKKyAgICB7CisgICAgICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgICAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmttbCIpOworCisgICAgICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlOworICAgICAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgICAgICBteWZpbGUgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAgICAgICI8a21sIHhtbG5zPVwiaHR0cDovL2VhcnRoLmdvb2dsZS5jb20va21sLzIueFwiPiIKKyAgICAgICAgICI8RG9jdW1lbnQ+IgorICAgICAgICAgICAgICI8bmFtZT5LTUwgU2FtcGxlczwvbmFtZT4iCisgICAgICAgICAgICAgIjxTdHlsZSBpZD1cImdsb2JlSWNvblwiPiIKKyAgICAgICAgICAgICAiPEljb25TdHlsZT48L0ljb25TdHlsZT48TGluZVN0eWxlPjx3aWR0aD4yPC93aWR0aD48L0xpbmVTdHlsZT4iCisgICAgICAgICAgICAgIjwvU3R5bGU+IgorICAgICAgICAgICAgICI8Rm9sZGVyPiIKKyAgICAgICAgICAgICAgICAgIjxuYW1lPlBsYWNlbWFya3M8L25hbWU+IgorICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPlRoZXNlIGFyZSBqdXN0IHNvbWU8L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgIjxMb29rQXQ+IgorICAgICAgICAgICAgICAgICAiPHRpbHQ+NDAuNTU3NTA3MzM5NTUwNjwvdGlsdD48cmFuZ2U+NTAwLjY1NjY2NDEwNzIyNDU8L3JhbmdlPiIKKyAgICAgICAgICAgICAgICAgIjwvTG9va0F0PiIKKyAgICAgICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAgIjxuYW1lPlRlc3NlbGxhdGVkPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgICAgICI8dmlzaWJpbGl0eT4wPC92aXNpYmlsaXR5PiIKKyAgICAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+QmxhY2sgbGluZSAoMTAgcGl4ZWxzIHdpZGUpLCBoZWlnaHQgdHJhY2tzIHRlcnJhaW48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgICAgICI8TG9va0F0Pjxsb25naXR1ZGU+LTEyMi4wODM5NTk3MTQ1NzY2PC9sb25naXR1ZGU+PC9Mb29rQXQ+IgorICAgICAgICAgICAgICAgICAgICAgIjxzdHlsZVVybD4jZG93bkFycm93SWNvbjwvc3R5bGVVcmw+IgorICAgICAgICAgICAgICAgICAgICAgIjxQb2ludD4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxhbHRpdHVkZU1vZGU+cmVsYXRpdmVUb0dyb3VuZDwvYWx0aXR1ZGVNb2RlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPi0xMjIuMDg0MDc1LDM3LjQyMjAwMzM2MTIxNDEsNTA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgICI8L1BvaW50PiIKKyAgICAgICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAgIjxuYW1lPlRyYW5zcGFyZW50PC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgICAgICI8dmlzaWJpbGl0eT4wPC92aXNpYmlsaXR5PiIKKyAgICAgICAgICAgICAgICAgICAgICI8c3R5bGVVcmw+I3RyYW5zUmVkUG9seTwvc3R5bGVVcmw+IgorICAgICAgICAgICAgICAgICAgICAgIjxQb2x5Z29uPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPGV4dHJ1ZGU+MTwvZXh0cnVkZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxhbHRpdHVkZU1vZGU+cmVsYXRpdmVUb0dyb3VuZDwvYWx0aXR1ZGVNb2RlPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPG91dGVyQm91bmRhcnlJcz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxMaW5lYXJSaW5nPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPiAtMTIyLjA4NDA3NSwzNy40MjIwMDMzNjEyMTQxLDUwPC9jb29yZGluYXRlcz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjwvTGluZWFyUmluZz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIjwvb3V0ZXJCb3VuZGFyeUlzPiIKKyAgICAgICAgICAgICAgICAgICAgICI8L1BvbHlnb24+IgorICAgICAgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgICI8L0ZvbGRlcj4iCisgICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAiPG5hbWU+RnJ1aXR5PC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgIjx2aXNpYmlsaXR5PjA8L3Zpc2liaWxpdHk+IgorICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPjwhW0NEQVRBW0lmIHRoZSA8dGVzc2VsbGF0ZT4gdGFnIGhhcyBhIHZhbHVlIG9mIG5dXT48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgIjxMb29rQXQ+PGxvbmdpdHVkZT4tMTEyLjA4MjI2ODAwMTMxMzk8L2xvbmdpdHVkZT48L0xvb2tBdD4iCisgICAgICAgICAgICAgICAgICI8TGluZVN0cmluZz4iCisgICAgICAgICAgICAgICAgICAgICAiPHRlc3NlbGxhdGU+MTwvdGVzc2VsbGF0ZT4iCisgICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPiAtMTIyLjA4NDA3NSwzNy40MjIwMDMzNjEyMTQxLDUwIDwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgICAgICAiPC9MaW5lU3RyaW5nPiIKKyAgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgIjwvRG9jdW1lbnQ+IgorICAgICAgICAgIjwva21sPiI7CisgICAgICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgICAgIEFTU0VSVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgICAgIEVYUEVDVF9FUSgiIiwgZXJyb3IpOworICAgICAgICBFWFBFQ1RfRVEoMywgbG9jYXRpb25zLnNpemUoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKCJUZXNzZWxsYXRlZCIsIGxvY2F0aW9uc1swXS5uYW1lKTsKKyAgICAgICAgRVhQRUNUX0VRKCJCbGFjayBsaW5lICgxMCBwaXhlbHMgd2lkZSksIGhlaWdodCB0cmFja3MgdGVycmFpbiIsIGxvY2F0aW9uc1swXS5kZXNjcmlwdGlvbik7CisgICAgICAgIEVYUEVDVF9FUSgiVHJhbnNwYXJlbnQiLCBsb2NhdGlvbnNbMV0ubmFtZSk7CisgICAgICAgIEVYUEVDVF9FUSgiIiwgbG9jYXRpb25zWzFdLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgRVhQRUNUX0VRKCJGcnVpdHkiLCBsb2NhdGlvbnNbMl0ubmFtZSk7CisgICAgICAgIEVYUEVDVF9FUSgiSWYgdGhlIDx0ZXNzZWxsYXRlPiB0YWcgaGFzIGEgdmFsdWUgb2YgbiIsIGxvY2F0aW9uc1syXS5kZXNjcmlwdGlvbik7CisKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKC0xMjIuMDg0MDc1LCBsb2NhdGlvbnNbaV0ubG9uZ2l0dWRlKTsKKyAgICAgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgzNy40MjIwMDMzNjEyMTQxLCBsb2NhdGlvbnNbaV0ubGF0aXR1ZGUpOworICAgICAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDUwLCBsb2NhdGlvbnNbaV0uZWxldmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0gICAvLyBkZXN0cnVjdG9yIHJlbW92ZXMgdGVtcCBkaXJlY3RvcnkgYW5kIGFsbCBmaWxlcyB1bmRlciBpdC4KK30KKworVEVTVChLbWxQYXJzZXIsIFBhcnNlT25lQ29vcmRpbmF0ZSkgeworICAgICAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBteURpci5tYWtlU3ViUGF0aCgidGVzdC5rbWwiKTsKKworICAgICAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICAgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICAgICAgbXlmaWxlIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICAgICI8UG9pbnQ+IgorICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPi0xMjIuMDgyMjAzNTQyNTY4MywzNy40MjIyODk5MDE0MDI1MSwwPC9jb29yZGluYXRlcz4iCisgICAgICAgICAgICAgICAgICAgICI8L1BvaW50PiIKKyAgICAgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgIjwva21sPiI7CisgICAgICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisKKyAgICAgICAgQVNTRVJUX1RSVUUoS21sUGFyc2VyOjpwYXJzZUZpbGUocGF0aC5jX3N0cigpLCAmbG9jYXRpb25zLCAmZXJyb3IpKTsKKyAgICAgICAgRVhQRUNUX0VRKCIiLCBlcnJvcik7CisgICAgICAgIEVYUEVDVF9FUSgxLCBsb2NhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKC0xMjIuMDgyMjAzNTQyNTY4MywgbG9jYXRpb25zWzBdLmxvbmdpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgzNy40MjIyODk5MDE0MDI1MSwgbG9jYXRpb25zWzBdLmxhdGl0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDAuMCwgbG9jYXRpb25zWzBdLmVsZXZhdGlvbik7Cit9CisKK1RFU1QoS21sUGFyc2VyLCBQYXJzZU11bHRpcGxlQ29vcmRpbmF0ZXMpIHsKKyAgICAgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgICAgIG15ZmlsZS5vcGVuKHBhdGguY19zdHIoKSk7CisgICAgICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAiPExpbmVTdHJpbmc+IgorICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPi0xMjIuMDgyMjAzNTQyNTY4MywzNy40MjIyODk5MDE0MDI1MSwwIFwKKyAgICAgICAgICAgICAgICAgICAgMTAuNCwzOS4sMjBcdFx0MCwyMS40LDEiCisgICAgICAgICAgICAgICAgICAgICI8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgIjwvTGluZVN0cmluZz4iCisgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgIjwva21sPiI7OworICAgICAgICBteWZpbGUuY2xvc2UoKTsKKworICAgICAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOworCisgICAgICAgIEFTU0VSVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgICAgIEVYUEVDVF9FUSgiIiwgZXJyb3IpOworICAgICAgICBBU1NFUlRfRVEoMywgbG9jYXRpb25zLnNpemUoKSk7CisKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKC0xMjIuMDgyMjAzNTQyNTY4MywgbG9jYXRpb25zWzBdLmxvbmdpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgzNy40MjIyODk5MDE0MDI1MSwgbG9jYXRpb25zWzBdLmxhdGl0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDAsIGxvY2F0aW9uc1swXS5lbGV2YXRpb24pOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMTAuNCwgbG9jYXRpb25zWzFdLmxvbmdpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgzOS4sIGxvY2F0aW9uc1sxXS5sYXRpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgyMCwgbG9jYXRpb25zWzFdLmVsZXZhdGlvbik7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgwLCBsb2NhdGlvbnNbMl0ubG9uZ2l0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDIxLjQsIGxvY2F0aW9uc1syXS5sYXRpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgxLCBsb2NhdGlvbnNbMl0uZWxldmF0aW9uKTsKK30KKworVEVTVChLbWxQYXJzZXIsIFBhcnNlQmFkQ29vcmRpbmF0ZXMpIHsKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIC8vIEludmFsaWQgYmVjYXVzZSBvZiBpbnRlcm5hbCBzcGFjZXMuCisgICAgbXlmaWxlIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICAgICI8TGluZVN0cmluZz4iCisgICAgICAgICAgICAgICAgICAgICI8Y29vcmRpbmF0ZXM+LTEyMi4wODIyMDM1NDI1NjgzLCAzNy40MjIyODk5MDE0MDI1MSwgMCBcCisgICAgICAgICAgICAgICAgICAgIDEwLjQsMzkuMjBcdDAyMS40MSIKKyAgICAgICAgICAgICAgICAgICAgIjwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgICAgICAgICAiPC9MaW5lU3RyaW5nPiIKKyAgICAgICAgICAgICI8L1BsYWNlbWFyaz4iCisgICAgICAgICAgICAiPC9rbWw+IjsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKworICAgIEFTU0VSVF9GQUxTRShLbWxQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcikpOworfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VMb2NhdGlvbk5vcm1hbCkgeworICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBteURpci5tYWtlU3ViUGF0aCgidGVzdC5rbWwiKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlOworICAgIG15ZmlsZS5vcGVuKHBhdGguY19zdHIoKSk7CisgICAgbXlmaWxlIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICAgICI8bmFtZT5TaW1wbGUgcGxhY2VtYXJrPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5BdHRhY2hlZCB0byB0aGUgZ3JvdW5kLjwvZGVzY3JpcHRpb24+IgorICAgICAgICAgICAgICAgICAgICAiPFBvaW50PiIKKyAgICAgICAgICAgICAgICAgICAgIjxjb29yZGluYXRlcz4tMTIyLjA4MjIwMzU0MjU2ODMsMzcuNDIyMjg5OTAxNDAyNTEsMDwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgICAgICAgICAiPC9Qb2ludD4iCisgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgIjwva21sPiI7CisgICAgbXlmaWxlLmNsb3NlKCk7CisKKyAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisKKyAgICBBU1NFUlRfVFJVRShLbWxQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcikpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoIlNpbXBsZSBwbGFjZW1hcmsiLCBsb2NhdGlvbnNbaV0ubmFtZSk7CisgICAgICAgIEVYUEVDVF9FUSgiQXR0YWNoZWQgdG8gdGhlIGdyb3VuZC4iLCBsb2NhdGlvbnNbaV0uZGVzY3JpcHRpb24pOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoLTEyMi4wODIyMDM1NDI1NjgzLCBsb2NhdGlvbnNbaV0ubG9uZ2l0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDM3LjQyMjI4OTkwMTQwMjUxLCBsb2NhdGlvbnNbaV0ubGF0aXR1ZGUpOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMCwgbG9jYXRpb25zW2ldLmVsZXZhdGlvbik7CisgICAgfQorfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VMb2NhdGlvbk5vcm1hbE1pc3NpbmdPcHRpb25hbEZpZWxkcykgeworICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBteURpci5tYWtlU3ViUGF0aCgidGVzdC5rbWwiKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlOworICAgIG15ZmlsZS5vcGVuKHBhdGguY19zdHIoKSk7CisgICAgbXlmaWxlIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICAgICI8UG9pbnQ+IgorICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPi0xMjIuMDgyMjAzNTQyNTY4MywzNy40MjIyODk5MDE0MDI1MSwwPC9jb29yZGluYXRlcz4iCisgICAgICAgICAgICAgICAgICAgICI8L1BvaW50PiIKKyAgICAgICAgICAgICI8L1BsYWNlbWFyaz4iCisgICAgICAgICAgICAiPC9rbWw+IjsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKworICAgIEFTU0VSVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgRVhQRUNUX0VRKCIiLCBlcnJvcik7CisgICAgQVNTRVJUX0VRKDEsIGxvY2F0aW9ucy5zaXplKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRVEoIiIsIGxvY2F0aW9uc1tpXS5uYW1lKTsKKyAgICAgICAgRVhQRUNUX0VRKCIiLCBsb2NhdGlvbnNbaV0uZGVzY3JpcHRpb24pOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoLTEyMi4wODIyMDM1NDI1NjgzLCBsb2NhdGlvbnNbaV0ubG9uZ2l0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDM3LjQyMjI4OTkwMTQwMjUxLCBsb2NhdGlvbnNbaV0ubGF0aXR1ZGUpOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMCwgbG9jYXRpb25zW2ldLmVsZXZhdGlvbik7CisgICAgfQorfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VMb2NhdGlvbk1pc3NpbmdSZXF1aXJlZEZpZWxkcykgeworICAgIFRlc3RUZW1wRGlyIG15RGlyKCJwYXJzZV9sb2NhdGlvbl90ZXN0cyIpOworICAgIEFTU0VSVF9UUlVFKG15RGlyLnBhdGgoKSk7IC8vIE5VTEwgaWYgZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBteURpci5tYWtlU3ViUGF0aCgidGVzdC5rbWwiKTsKKworICAgIHN0ZDo6b2ZzdHJlYW0gbXlmaWxlOworICAgIG15ZmlsZS5vcGVuKHBhdGguY19zdHIoKSk7CisgICAgbXlmaWxlIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAgICAgICAgICI8bmFtZT5TaW1wbGUgcGxhY2VtYXJrPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5BdHRhY2hlZCB0byB0aGUgZ3JvdW5kLjwvZGVzY3JpcHRpb24+IgorICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICI8L2ttbD4iOworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworCisgICAgQVNTRVJUX0ZBTFNFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgRVhQRUNUX0VRKCJMb2NhdGlvbiBmb3VuZCB3aXRoIG1pc3Npbmcgb3IgbWFsZm9ybWVkIGNvb3JkaW5hdGVzIiwgZXJyb3IpOworfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VMb2NhdGlvbk5hbWVPbmx5Rmlyc3QpIHsKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAiPG5hbWU+U2ltcGxlIHBsYWNlbWFyazwvbmFtZT4iCisgICAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+QXR0YWNoZWQgdG8gdGhlIGdyb3VuZC48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgICAgIjxMaW5lU3RyaW5nPiIKKyAgICAgICAgICAgICAgICAgICAgIjxjb29yZGluYXRlcz4tMTIyLjA4MjIwMzU0MjU2ODMsMzcuNDIyMjg5OTAxNDAyNTEsMFwKKyAgICAgICAgICAgICAgICAgICAgLTEyMi4wODIyMDM1NDI1NjgzLDM3LjQyMjI4OTkwMTQwMjUxLDA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgIjwvTGluZVN0cmluZz4iCisgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgIjwva21sPiI7CisgICAgbXlmaWxlLmNsb3NlKCk7CisKKyAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgRVhQRUNUX1RSVUUoS21sUGFyc2VyOjpwYXJzZUZpbGUocGF0aC5jX3N0cigpLCAmbG9jYXRpb25zLCAmZXJyb3IpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIGVycm9yKTsKKyAgICBBU1NFUlRfRVEoMiwgbG9jYXRpb25zLnNpemUoKSk7CisKKyAgICBFWFBFQ1RfRVEoIlNpbXBsZSBwbGFjZW1hcmsiLCBsb2NhdGlvbnNbMF0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJBdHRhY2hlZCB0byB0aGUgZ3JvdW5kLiIsIGxvY2F0aW9uc1swXS5kZXNjcmlwdGlvbik7CisgICAgRVhQRUNUX0VRKCIiLCBsb2NhdGlvbnNbMV0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCIiLCBsb2NhdGlvbnNbMV0uZGVzY3JpcHRpb24pOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoLTEyMi4wODIyMDM1NDI1NjgzLCBsb2NhdGlvbnNbaV0ubG9uZ2l0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDM3LjQyMjI4OTkwMTQwMjUxLCBsb2NhdGlvbnNbaV0ubGF0aXR1ZGUpOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMCwgbG9jYXRpb25zW2ldLmVsZXZhdGlvbik7CisgICAgfQorfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VNdWx0aXBsZUxvY2F0aW9ucykgeworICAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAiPG5hbWU+U2ltcGxlIHBsYWNlbWFyazwvbmFtZT4iCisgICAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+QXR0YWNoZWQgdG8gdGhlIGdyb3VuZC48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgICAgIjxQb2ludD4iCisgICAgICAgICAgICAgICAgICAgICI8Y29vcmRpbmF0ZXM+LTEyMi4wODIyMDM1NDI1NjgzLDM3LjQyMjI4OTkwMTQwMjUxLDA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgIjwvUG9pbnQ+IgorICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICI8UGxhY2VtYXJrPiIKKyAgICAgICAgICAgICAgICAgICAgIjxuYW1lPlNpbXBsZSBwbGFjZW1hcms8L25hbWU+IgorICAgICAgICAgICAgICAgICAgICAiPGRlc2NyaXB0aW9uPkF0dGFjaGVkIHRvIHRoZSBncm91bmQuPC9kZXNjcmlwdGlvbj4iCisgICAgICAgICAgICAgICAgICAgICI8UG9pbnQ+IgorICAgICAgICAgICAgICAgICAgICAiPGNvb3JkaW5hdGVzPi0xMjIuMDgyMjAzNTQyNTY4MywzNy40MjIyODk5MDE0MDI1MSwwXAorICAgICAgICAgICAgICAgICAgICAtMTIyLjA4MjIwMzU0MjU2ODMsMzcuNDIyMjg5OTAxNDAyNTEsMDwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgICAgICAgICAiPC9Qb2ludD4iCisgICAgICAgICAgICAiPC9QbGFjZW1hcms+IgorICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAiPG5hbWU+U2ltcGxlIHBsYWNlbWFyazwvbmFtZT4iCisgICAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+QXR0YWNoZWQgdG8gdGhlIGdyb3VuZC48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgICAgIjxQb2ludD4iCisgICAgICAgICAgICAgICAgICAgICI8Y29vcmRpbmF0ZXM+LTEyMi4wODIyMDM1NDI1NjgzLDM3LjQyMjI4OTkwMTQwMjUxLDA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgIjwvUG9pbnQ+IgorICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICI8L2ttbD4iOworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIEVYUEVDVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgRVhQRUNUX0VRKCIiLCBlcnJvcik7CisgICAgQVNTRVJUX0VRKDQsIGxvY2F0aW9ucy5zaXplKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxvY2F0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaSAhPSAyKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoIlNpbXBsZSBwbGFjZW1hcmsiLCBsb2NhdGlvbnNbaV0ubmFtZSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoIkF0dGFjaGVkIHRvIHRoZSBncm91bmQuIiwgbG9jYXRpb25zW2ldLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgiIiwgbG9jYXRpb25zW2ldLm5hbWUpOworICAgICAgICAgICAgRVhQRUNUX0VRKCIiLCBsb2NhdGlvbnNbaV0uZGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgtMTIyLjA4MjIwMzU0MjU2ODMsIGxvY2F0aW9uc1tpXS5sb25naXR1ZGUpOworICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMzcuNDIyMjg5OTAxNDAyNTEsIGxvY2F0aW9uc1tpXS5sYXRpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgwLCBsb2NhdGlvbnNbaV0uZWxldmF0aW9uKTsKKyAgICB9Cit9CisKK1RFU1QoS21sUGFyc2VyLCBUcmF2ZXJzZUVtcHR5RG9jKSB7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmttbCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+PC9rbWw+IjsKKyAgICBteWZpbGUuY2xvc2UoKTsKKworICAgIEdwc0ZpeEFycmF5IGxvY2F0aW9uczsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBFWFBFQ1RfVFJVRShLbWxQYXJzZXI6OnBhcnNlRmlsZShwYXRoLmNfc3RyKCksICZsb2NhdGlvbnMsICZlcnJvcikpOworICAgIEVYUEVDVF9FUSgiIiwgZXJyb3IpOworICAgIEVYUEVDVF9FUSgwLCBsb2NhdGlvbnMuc2l6ZSgpKTsKK30KKworVEVTVChLbWxQYXJzZXIsIFRyYXZlcnNlRG9jTm9QbGFjZW1hcmtzKSB7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmttbCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIKKyAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAiPExpbmVTdHJpbmc+PC9MaW5lU3RyaW5nPiIKKyAgICAgICAgIjxuYW1lPjwvbmFtZT4iCisgICAgICAgICI8L2ttbD4iOworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIEVYUEVDVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgRVhQRUNUX0VRKCIiLCBlcnJvcik7CisgICAgRVhQRUNUX0VRKDAsIGxvY2F0aW9ucy5zaXplKCkpOworfQorCitURVNUKEttbFBhcnNlciwgVHJhdmVyc2VOZXN0ZWREb2MpIHsKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAgICAgIjxEb2N1bWVudD4iCisgICAgICAgICAgICAiPEZvbGRlcj4iCisgICAgICAgICAgICAgICAgICAgICI8bmFtZT5QbGFjZW1hcmtzPC9uYW1lPiIKKyAgICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5UaGVzZSBhcmUganVzdCBzb21lIG9mIHRoZSBkaWZmZXJlbnQga2luZHMgb2YgcGxhY2VtYXJrcyB3aXRoIgorICAgICAgICAgICAgICAgICAgICAid2hpY2ggeW91IGNhbiBtYXJrIHlvdXIgZmF2b3JpdGUgcGxhY2VzPC9kZXNjcmlwdGlvbj4iCisgICAgICAgICAgICAgICAgICAgICI8TG9va0F0PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGxvbmdpdHVkZT4tMTIyLjA4Mzk1OTcxNDU3NjY8L2xvbmdpdHVkZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxsYXRpdHVkZT4zNy40MjIyMjkwNDUyNTIzMjwvbGF0aXR1ZGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YWx0aXR1ZGU+MDwvYWx0aXR1ZGU+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8aGVhZGluZz4tMTQ4LjQxMjI5MjI2MjgwNDQ8L2hlYWRpbmc+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8dGlsdD40MC41NTc1MDczMzk1NTA2PC90aWx0PiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHJhbmdlPjUwMC42NTY2NjQxMDcyMjQ1PC9yYW5nZT4iCisgICAgICAgICAgICAgICAgICAgICI8L0xvb2tBdD4iCisgICAgICAgICAgICAgICAgICAgICI8UGxhY2VtYXJrPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPG5hbWU+U2ltcGxlIHBsYWNlbWFyazwvbmFtZT4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxkZXNjcmlwdGlvbj5BdHRhY2hlZCB0byB0aGUgZ3JvdW5kLjwvZGVzY3JpcHRpb24+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8UG9pbnQ+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8Y29vcmRpbmF0ZXM+LTEyMi4wODIyMDM1NDI1NjgzLDM3LjQyMjI4OTkwMTQwMjUxLDA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9Qb2ludD4iCisgICAgICAgICAgICAgICAgICAgICI8L1BsYWNlbWFyaz4iCisgICAgICAgICAgICAiPC9Gb2xkZXI+IgorICAgICAgICAgICAgIjwvRG9jdW1lbnQ+IgorICAgICAgICAgICAgIjwva21sPiI7CisgICAgbXlmaWxlLmNsb3NlKCk7CisKKyAgICBHcHNGaXhBcnJheSBsb2NhdGlvbnM7CisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgRVhQRUNUX1RSVUUoS21sUGFyc2VyOjpwYXJzZUZpbGUocGF0aC5jX3N0cigpLCAmbG9jYXRpb25zLCAmZXJyb3IpKTsKKyAgICBFWFBFQ1RfRVEoIiIsIGVycm9yKTsKKyAgICBBU1NFUlRfRVEoMSwgbG9jYXRpb25zLnNpemUoKSk7CisKKyAgICBFWFBFQ1RfRVEoIlNpbXBsZSBwbGFjZW1hcmsiLCBsb2NhdGlvbnNbMF0ubmFtZSk7CisgICAgRVhQRUNUX0VRKCJBdHRhY2hlZCB0byB0aGUgZ3JvdW5kLiIsIGxvY2F0aW9uc1swXS5kZXNjcmlwdGlvbik7CisgICAgRVhQRUNUX0ZMT0FUX0VRKC0xMjIuMDgyMjAzNTQyNTY4MywgbG9jYXRpb25zWzBdLmxvbmdpdHVkZSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKDM3LjQyMjI4OTkwMTQwMjUxLCBsb2NhdGlvbnNbMF0ubGF0aXR1ZGUpOworICAgIEVYUEVDVF9GTE9BVF9FUSgwLCBsb2NhdGlvbnNbMF0uZWxldmF0aW9uKTsKK30KKworVEVTVChLbWxQYXJzZXIsIFBhcnNlUGxhY2VtYXJrTnVsbE5hbWVOb0NyYXNoKSB7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoInBhcnNlX2xvY2F0aW9uX3Rlc3RzIik7CisgICAgQVNTRVJUX1RSVUUobXlEaXIucGF0aCgpKTsgLy8gTlVMTCBpZiBlcnJvciBkdXJpbmcgY3JlYXRpb24uCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IG15RGlyLm1ha2VTdWJQYXRoKCJ0ZXN0LmttbCIpOworCisgICAgc3RkOjpvZnN0cmVhbSBteWZpbGU7CisgICAgbXlmaWxlLm9wZW4ocGF0aC5jX3N0cigpKTsKKyAgICBteWZpbGUgPDwKKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iCisgICAgICAgICAgICAiPGttbCB4bWxucz1cImh0dHA6Ly9lYXJ0aC5nb29nbGUuY29tL2ttbC8yLnhcIj4iCisgICAgICAgICAgICAiPFBsYWNlbWFyaz4iCisgICAgICAgICAgICAiPG5hbWUvPiIKKyAgICAgICAgICAgICI8ZGVzY3JpcHRpb24vPiIKKyAgICAgICAgICAgICI8UG9pbnQ+IgorICAgICAgICAgICAgIjxjb29yZGluYXRlcz4tMTIyLjA4MjIwMzU0MjU2ODMsMzcuNDIyMjg5OTAxNDAyNTEsMDwvY29vcmRpbmF0ZXM+IgorICAgICAgICAgICAgIjwvUG9pbnQ+IgorICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICI8L2ttbD4iOworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgIEVYUEVDVF9UUlVFKEttbFBhcnNlcjo6cGFyc2VGaWxlKHBhdGguY19zdHIoKSwgJmxvY2F0aW9ucywgJmVycm9yKSk7CisgICAgQVNTRVJUX0VRKDEsIGxvY2F0aW9ucy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgbG9jYXRpb25zLmZyb250KCkubmFtZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIGxvY2F0aW9ucy5mcm9udCgpLmRlc2NyaXB0aW9uLmNfc3RyKCkpOworfQorCitURVNUKEttbFBhcnNlciwgUGFyc2VMb2NhdGlvbk5vcm1hbENvbW1hTG9jYWxlKSB7CisgICAgYXV0byBzY29wZWRDb21tYUxvY2FsZSA9IHNldFNjb3BlZENvbW1hTG9jYWxlKCk7CisKKyAgICBUZXN0VGVtcERpciBteURpcigicGFyc2VfbG9jYXRpb25fdGVzdHMiKTsKKyAgICBBU1NFUlRfVFJVRShteURpci5wYXRoKCkpOyAvLyBOVUxMIGlmIGVycm9yIGR1cmluZyBjcmVhdGlvbi4KKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbXlEaXIubWFrZVN1YlBhdGgoInRlc3Qua21sIik7CisKKyAgICBzdGQ6Om9mc3RyZWFtIG15ZmlsZTsKKyAgICBteWZpbGUub3BlbihwYXRoLmNfc3RyKCkpOworICAgIG15ZmlsZSA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgorICAgICAgICAgICAgIjxrbWwgeG1sbnM9XCJodHRwOi8vZWFydGguZ29vZ2xlLmNvbS9rbWwvMi54XCI+IgorICAgICAgICAgICAgIjxQbGFjZW1hcms+IgorICAgICAgICAgICAgICAgICAgICAiPG5hbWU+U2ltcGxlIHBsYWNlbWFyazwvbmFtZT4iCisgICAgICAgICAgICAgICAgICAgICI8ZGVzY3JpcHRpb24+QXR0YWNoZWQgdG8gdGhlIGdyb3VuZC48L2Rlc2NyaXB0aW9uPiIKKyAgICAgICAgICAgICAgICAgICAgIjxQb2ludD4iCisgICAgICAgICAgICAgICAgICAgICI8Y29vcmRpbmF0ZXM+LTEyMi4wODIyMDM1NDI1NjgzLDM3LjQyMjI4OTkwMTQwMjUxLDA8L2Nvb3JkaW5hdGVzPiIKKyAgICAgICAgICAgICAgICAgICAgIjwvUG9pbnQ+IgorICAgICAgICAgICAgIjwvUGxhY2VtYXJrPiIKKyAgICAgICAgICAgICI8L2ttbD4iOworICAgIG15ZmlsZS5jbG9zZSgpOworCisgICAgR3BzRml4QXJyYXkgbG9jYXRpb25zOworICAgIHN0ZDo6c3RyaW5nIGVycm9yOworCisgICAgQVNTRVJUX1RSVUUoS21sUGFyc2VyOjpwYXJzZUZpbGUocGF0aC5jX3N0cigpLCAmbG9jYXRpb25zLCAmZXJyb3IpKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsb2NhdGlvbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKCJTaW1wbGUgcGxhY2VtYXJrIiwgbG9jYXRpb25zW2ldLm5hbWUpOworICAgICAgICBFWFBFQ1RfRVEoIkF0dGFjaGVkIHRvIHRoZSBncm91bmQuIiwgbG9jYXRpb25zW2ldLmRlc2NyaXB0aW9uKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKC0xMjIuMDgyMjAzNTQyNTY4MywgbG9jYXRpb25zW2ldLmxvbmdpdHVkZSk7CisgICAgICAgIEVYUEVDVF9GTE9BVF9FUSgzNy40MjIyODk5MDE0MDI1MSwgbG9jYXRpb25zW2ldLmxhdGl0dWRlKTsKKyAgICAgICAgRVhQRUNUX0ZMT0FUX0VRKDAsIGxvY2F0aW9uc1tpXS5lbGV2YXRpb24pOworICAgIH0KK30KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHVfZnJhbWUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwdV9mcmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZDJlNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHVfZnJhbWUuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0dwdUZyYW1lQnJpZGdlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ncHVfZnJhbWUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0dwdUZyYW1lQnJpZGdlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2xlcy5oIgorCisvLyBTdGFuZGFyZCB2YWx1ZXMgZnJvbSBLaHJvbm9zLgorI2RlZmluZSBHTF9SR0JBIDB4MTkwOAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFIDB4MTQwMQorCit1c2luZyBhbmRyb2lkOjpvcGVuZ2w6OkdwdUZyYW1lQnJpZGdlOworCitzdGF0aWMgR3B1RnJhbWVCcmlkZ2UqIHNCcmlkZ2UgPSBOVUxMOworCisvLyBDYWxsZWQgZnJvbSBhbiBFbXVHTCB0aHJlYWQgdG8gdHJhbnNmZXIgYSBuZXcgZnJhbWUgb2YgdGhlIEdQVSBkaXNwbGF5CisvLyB0byB0aGUgbWFpbiBsb29wLgorc3RhdGljIHZvaWQgb25OZXdHcHVGcmFtZSh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbHMpIHsKKyAgICBEQ0hFQ0soeWRpciA9PSAtMSk7CisgICAgRENIRUNLKGZvcm1hdCA9PSBHTF9SR0JBKTsKKyAgICBEQ0hFQ0sodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKTsKKworICAgIEdwdUZyYW1lQnJpZGdlKiBicmlkZ2UgPSByZWludGVycHJldF9jYXN0PEdwdUZyYW1lQnJpZGdlKj4ob3BhcXVlKTsKKyAgICBicmlkZ2UtPnBvc3RGcmFtZSh3aWR0aCwgaGVpZ2h0LCBwaXhlbHMpOworfQorCit2b2lkIGdwdV9mcmFtZV9zZXRfcG9zdF9jYWxsYmFjaygKKyAgICAgICAgTG9vcGVyKiBsb29wZXIsCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCosIGludCwgaW50LCBjb25zdCB2b2lkKikpIHsKKyAgICBEQ0hFQ0soIXNCcmlkZ2UpOworCisgICAgc0JyaWRnZSA9IGFuZHJvaWQ6Om9wZW5nbDo6R3B1RnJhbWVCcmlkZ2U6OmNyZWF0ZSgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZDo6YmFzZTo6TG9vcGVyKj4obG9vcGVyKSwKKyAgICAgICAgICAgIGNhbGxiYWNrLAorICAgICAgICAgICAgY29udGV4dCk7CisgICAgQ0hFQ0soc0JyaWRnZSk7CisKKyAgICBhbmRyb2lkX3NldFBvc3RDYWxsYmFjayhvbk5ld0dwdUZyYW1lLCBzQnJpZGdlKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHVfZnJhbWUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ncHVfZnJhbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGMyOGJiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2dwdV9mcmFtZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gSW5pdGlhbGl6ZSBzdGF0ZSB0byBlbnN1cmUgdGhhdCBuZXcgR1BVIGZyYW1lIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjYWxsZXIKKy8vIGluIHRoZSBhcHByb3ByaWF0ZSB0aHJlYWQuIHxsb29wZXJ8IGlzIGEgTG9vcGVyIGluc3RhbmNlLCB8Y29udGV4dHwgaXMgYW4KKy8vIG9wYXF1ZSBoYW5kbGUgcGFzc2VkIHRvIHxjYWxsYmFja3wgYXQgcnVudGltZSwgd2hpY2ggaXMgYSBmdW5jdGlvbiBjYWxsZWQKKy8vIGZyb20gdGhlIGxvb3BlcidzIHRocmVhZCB3aGVuZXZlciBhIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuCit2b2lkIGdwdV9mcmFtZV9zZXRfcG9zdF9jYWxsYmFjaygKKyAgICAgICAgTG9vcGVyKiBsb29wZXIsCisgICAgICAgIHZvaWQqIGNvbnRleHQsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwaXhlbHMpKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaGVscC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg3MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2hlbHAuYwpAQCAtMCwwICsxLDE1ODYgQEAKKyNpbmNsdWRlICJhbmRyb2lkL2hlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpZm5kZWYgTk9fU0tJTgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9rZXljb2RlLmgiCisjZW5kaWYKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogWFhYOiBUT0RPOiBwdXQgbW9zdCBvZiB0aGUgaGVscCBzdHVmZiBpbiBhdXRvLWdlbmVyYXRlZCBmaWxlcyAqLworCisjZGVmaW5lICBQUklOVEYoLi4uKSAgc3RyYWxsb2NfYWRkX2Zvcm1hdChvdXQsX19WQV9BUkdTX18pCisKK3N0YXRpYyB2b2lkCitoZWxwX2xpc3RfYXZkcyggc3RyYWxsb2NfdCogb3V0ICkgeworICAgIFBSSU5URigKKyAgICAiICBMaXN0IGFsbCBhdmFpbGFibGUgQVZEc1xuXG4iCisKKyAgICAiICBXaGVuIHRoaXMgZmxhZyBpcyB1c2VkLCB0aGUgZW11bGF0b3Igd2lsbCBub3Qgc3RhcnQsIGJ1dCBpbnN0ZWFkXG4iCisgICAgIiAgcHJvYmUgdGhlIEFuZHJvaWQgJ2hvbWUnIGRpcmVjdG9yeSBhbmQgcHJpbnQgdGhlIG5hbWVzIG9mIGFsbCBBVkRzXG4iCisgICAgIiAgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgdGhlIHVzZXIsIGFuZCB3aGljaCBjYW4gYmUgc3RhcnRlZCB3aXRoXG4iCisgICAgIiAgJ0A8bmFtZT4nLCBvciB0aGUgZXF1aXZhbGVudCAnLW5hbWUgPGF2ZD4nLlxuXG4iCisKKyAgICAiICBOb3RlIHRoYXQgdGhlIGhvbWUgZGlyZWN0b3J5IGNhbiBiZSBvdmVycmlkZW4gYnkgZGVmaW5pbmcgdGhlXG4iCisgICAgIiAgQU5EUk9JRF9TREtfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZS5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3ZpcnR1YWxfZGV2aWNlKCBzdHJhbGxvY190KiAgb3V0ICkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgQW4gQW5kcm9pZCBWaXJ0dWFsIERldmljZSAoQVZEKSBtb2RlbHMgYSBzaW5nbGUgdmlydHVhbFxuIgorICAgICIgIGRldmljZSBydW5uaW5nIHRoZSBBbmRyb2lkIHBsYXRmb3JtIHRoYXQgaGFzLCBhdCBsZWFzdCwgaXRzIG93blxuIgorICAgICIgIGtlcm5lbCwgc3lzdGVtIGltYWdlIGFuZCBkYXRhIHBhcnRpdGlvbi5cblxuIgorCisgICAgIiAgT25seSBvbmUgZW11bGF0b3IgcHJvY2VzcyBjYW4gcnVuIGEgZ2l2ZW4gQVZEIGF0IGEgdGltZSwgYnV0XG4iCisgICAgIiAgeW91IGNhbiBjcmVhdGUgc2V2ZXJhbCBBVkRzIGFuZCBydW4gdGhlbSBjb25jdXJyZW50bHkuXG5cbiIKKworICAgICIgIFlvdSBjYW4gaW52b2tlIGEgZ2l2ZW4gQVZEIGF0IHN0YXJ0dXAgdXNpbmcgZWl0aGVyICctYXZkIDxuYW1lPidcbiIKKyAgICAiICBvciAnQDxuYW1lPicsIGJvdGggZm9ybXMgYmVpbmcgZXF1aXZhbGVudC4gRm9yIGV4YW1wbGUsIHRvIGxhdW5jaFxuIgorICAgICIgIHRoZSBBVkQgbmFtZWQgJ2ZvbycsIHR5cGU6XG5cbiIKKworICAgICIgICAgICBlbXVsYXRvciBAZm9vXG5cbiIKKworICAgICIgIFRoZSAnYW5kcm9pZCcgaGVscGVyIHRvb2wgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHZpcnR1YWwgZGV2aWNlcy5cbiIKKyAgICAiICBGb3IgZXhhbXBsZTpcblxuIgorCisgICAgIiAgICBhbmRyb2lkIGNyZWF0ZSBhdmQgLW4gPG5hbWU+IC10IDEgICMgY3JlYXRlcyBhIG5ldyB2aXJ0dWFsIGRldmljZS5cbiIKKyAgICAiICAgIGFuZHJvaWQgbGlzdCBhdmQgICAgICAgICAgICAgICAgICAgIyBsaXN0IGFsbCB2aXJ0dWFsIGRldmljZXMgYXZhaWxhYmxlLlxuXG4iCisKKyAgICAiICBUcnkgJ2FuZHJvaWQgLS1oZWxwJyBmb3IgbW9yZSBjb21tYW5kcy5cblxuIgorCisgICAgIiAgRWFjaCBBVkQgcmVhbGx5IGNvcnJlc3BvbmRzIHRvIGEgY29udGVudCBkaXJlY3Rvcnkgd2hpY2ggc3RvcmVzXG4iCisgICAgIiAgcGVyc2lzdGVudCBhbmQgd3JpdGFibGUgZGlzayBpbWFnZXMgYXMgd2VsbCBhcyBjb25maWd1cmF0aW9uIGZpbGVzLlxuIgorCisgICAgIiAgRWFjaCBBVkQgbXVzdCBiZSBjcmVhdGVkIGFnYWluc3QgYW4gZXhpc3RpbmcgU0RLIHBsYXRmb3JtIG9yIGFkZC1vbi5cbiIKKyAgICAiICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljLCBzZWUgLWhlbHAtc2RrLWltYWdlcy5cblxuIgorCisgICAgIiAgU1BFQ0lBTCBOT1RFOiBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgYXJlICpub3QqIHVzaW5nIHRoZSBlbXVsYXRvclxuIgorICAgICIgIHdpdGggdGhlIEFuZHJvaWQgU0RLLCBidXQgd2l0aCB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0sIHlvdSB3aWxsXG4iCisgICAgIiAgbmVlZCB0byBkZWZpbmUgdGhlIEFORFJPSURfUFJPRFVDVF9PVVQgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudC5cbiIKKyAgICAiICBTZWUgLWhlbHAtYnVpbGQtaW1hZ2VzIGZvciB0aGUgZGV0YWlscy5cbiIKKyAgICApOworfQorCisKK3N0YXRpYyB2b2lkCitoZWxwX3Nka19pbWFnZXMoIHN0cmFsbG9jX3QqICBvdXQgKQoreworICAgIFBSSU5URigKKyAgICAiICBUaGUgQW5kcm9pZCBTREsgbm93IHN1cHBvcnRzIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtLlxuIgorICAgICIgIEVhY2ggU0RLICdwbGF0Zm9ybScgY29ycmVzcG9uZHMgdG86XG5cbiIKKworICAgICIgICAgLSBhIGdpdmVuIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgQVBJLlxuIgorICAgICIgICAgLSBhIHNldCBvZiBjb3JyZXNwb25kaW5nIHN5c3RlbSBpbWFnZSBmaWxlcy5cbiIKKyAgICAiICAgIC0gYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy5cbiIKKyAgICAiICAgIC0gYW4gYW5kcm9pZC5qYXIgZmlsZSB1c2VkIHdoZW4gYnVpbGRpbmcgeW91ciBhcHBsaWNhdGlvbi5cbiIKKyAgICAiICAgIC0gc2tpbnMuXG5cbiIKKworICAgICIgIFRoZSBBbmRyb2lkIFNESyBhbHNvIHN1cHBvcnRzIHRoZSBjb25jZXB0IG9mICdhZGQtb25zJy4gRWFjaCBhZGQtb24gaXNcbiIKKyAgICAiICBiYXNlZCBvbiBhbiBleGlzdGluZyBwbGF0Zm9ybSwgYW5kIHByb3ZpZGVzIHJlcGxhY2VtZW50IG9yIGFkZGl0aW9uYWxcbiIKKyAgICAiICBpbWFnZSBmaWxlcywgYW5kcm9pZC5qYXIsIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQvb3Igc2tpbnMuXG5cbiIKKworICAgICIgIFRoZSBwdXJwb3NlIG9mIGFkZC1vbnMgaXMgdG8gYWxsb3cgdmVuZG9ycyB0byBwcm92aWRlIHRoZWlyIG93biBjdXN0b21pemVkXG4iCisgICAgIiAgc3lzdGVtIGltYWdlcyBhbmQgQVBJcyB3aXRob3V0IG5lZWRpbmcgdG8gcGFja2FnZSBhIGNvbXBsZXRlIFNESy5cblxuIgorCisgICAgIiAgQmVmb3JlIHVzaW5nIHRoZSBTREssIHlvdSBuZWVkIHRvIGNyZWF0ZSBhbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIChBVkQpXG4iCisgICAgIiAgKHNlZSAtaGVscC12aXJ0dWFsLWRldmljZSBmb3IgZGV0YWlscykuIEVhY2ggQVZEIGlzIGNyZWF0ZWQgaW4gcmVmZXJlbmNlXG4iCisgICAgIiAgdG8gYSBnaXZlbiBTREsgcGxhdGZvcm0gKm9yKiBhZGQtb24sIGFuZCB3aWxsIHNlYXJjaCB0aGUgY29ycmVzcG9uZGluZ1xuIgorICAgICIgIGRpcmVjdG9yaWVzIGZvciBzeXN0ZW0gaW1hZ2UgZmlsZXMsIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6XG5cbiIKKworICAgICIgICAgLSBpbiB0aGUgQVZEJ3MgY29udGVudCBkaXJlY3RvcnkuXG4iCisgICAgIiAgICAtIGluIHRoZSBBVkQncyBTREsgYWRkLW9uIGRpcmVjdG9yeSwgaWYgYW55LlxuIgorICAgICIgICAgLSBpbiB0aGUgQVZEJ3MgU0RLIHBsYXRmb3JtIGRpcmVjdG9yeSwgaWYgYW55LlxuXG4iCisKKyAgICAiICBUaGUgaW1hZ2UgZmlsZXMgYXJlIGRvY3VtZW50ZWQgaW4gLWhlbHAtZGlzay1pbWFnZXMuIEJ5IGRlZmF1bHQsIGFuIEFWRFxuIgorICAgICIgIGNvbnRlbnQgZGlyZWN0b3J5IHdpbGwgY29udGFpbiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgaW1hZ2UgZmlsZXM6XG5cbiIKKworICAgICIgICAgIHVzZXJkYXRhLXFlbXUuaW1nICAgICAtIHRoZSAvZGF0YSBwYXJ0aXRpb24gaW1hZ2UgZmlsZVxuIgorICAgICIgICAgIGNhY2hlLmltZyAgICAgICAgICAgICAtIHRoZSAvY2FjaGUgcGFydGl0aW9uIGltYWdlIGZpbGVcblxuIgorCisgICAgIiAgWW91IGNhbiB1c2UgLXdpcGUtZGF0YSB0byByZS1pbml0aWFsaXplIHRoZSAvZGF0YSBwYXJ0aXRpb24gdG8gaXRzIGZhY3RvcnlcbiIKKyAgICAiICBkZWZhdWx0cy4gVGhpcyB3aWxsIGVyYXNlIGFsbCB1c2VyIHNldHRpbmdzIGZvciB0aGUgdmlydHVhbCBkZXZpY2UuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9idWlsZF9pbWFnZXMoIHN0cmFsbG9jX3QqICBvdXQgKQoreworICAgIFBSSU5URigKKyAgICAiICBUaGUgZW11bGF0b3IgZGV0ZWN0cyB0aGF0IHlvdSBhcmUgd29ya2luZyBmcm9tIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbVxuIgorICAgICIgIGJ5IGxvb2tpbmcgYXQgdGhlIEFORFJPSURfUFJPRFVDVF9PVVQgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudC5cblxuIgorCisgICAgIiAgSWYgaXQgaXMgZGVmaW5lZCwgaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBwcm9kdWN0LXNwZWNpZmljIGRpcmVjdG9yeSB0aGF0XG4iCisgICAgIiAgY29udGFpbnMgdGhlIGdlbmVyYXRlZCBzeXN0ZW0gaW1hZ2VzLlxuIgorCisgICAgIiAgSW4gdGhpcyBjYXNlLCB0aGUgZW11bGF0b3Igd2lsbCBsb29rIGJ5IGRlZmF1bHQgZm9yIHRoZSBmb2xsb3dpbmcgaW1hZ2VcbiIKKyAgICAiICBmaWxlcyB0aGVyZTpcblxuIgorCisgICAgIiAgICAtIHN5c3RlbS5pbWcgICA6IHRoZSAqaW5pdGlhbCogc3lzdGVtIGltYWdlLlxuIgorICAgICIgICAgLSByYW1kaXNrLmltZyAgOiB0aGUgcmFtZGlzayBpbWFnZSB1c2VkIHRvIGJvb3QgdGhlIHN5c3RlbS5cbiIKKyAgICAiICAgIC0gdXNlcmRhdGEuaW1nIDogdGhlICppbml0aWFsKiB1c2VyIGRhdGEgaW1hZ2UgKHNlZSBiZWxvdykuXG4iCisgICAgIiAgICAtIGtlcm5lbC1xZW11ICA6IHRoZSBlbXVsYXRvci1zcGVjaWZpYyBMaW51eCBrZXJuZWwgaW1hZ2UuXG5cbiIKKworICAgICIgIElmIHRoZSBrZXJuZWwgaW1hZ2UgaXMgbm90IGZvdW5kIGluIHRoZSBvdXQgZGlyZWN0b3J5LCB0aGVuIGl0IGlzIHNlYXJjaGVkXG4iCisgICAgIiAgaW4gPGJ1aWxkLXJvb3Q+L3ByZWJ1aWx0cy9xZW11LWtlcm5lbC8uXG5cbiIKKworICAgICIgIFlvdSBjYW4gdXNlIHRoZSAtc3lzZGlyLCAtc3lzdGVtLCAta2VybmVsLCAtcmFtZGlzaywgLWRhdGFkaXIsIC1kYXRhIG9wdGlvbnNcbiIKKyAgICAiICB0byBzcGVjaWZ5IGRpZmZlcmVudCBzZWFyY2ggZGlyZWN0b3JpZXMgb3Igc3BlY2lmaWMgaW1hZ2UgZmlsZXMuIFlvdSBjYW5cbiIKKyAgICAiICBhbHNvIHVzZSB0aGUgLWNhY2hlIGFuZCAtc2RjYXJkIG9wdGlvbnMgdG8gaW5kaWNhdGUgc3BlY2lmaWMgY2FjaGUgcGFydGl0aW9uXG4iCisgICAgIiAgYW5kIFNEIENhcmQgaW1hZ2UgZmlsZXMuXG5cbiIKKworICAgICIgIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgY29ycmVzcG9uZGluZyAtaGVscC08b3B0aW9uPiBzZWN0aW9uLlxuXG4iCisKKyAgICAiICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXIgaXMgc3BlY2lmaWMgdG8gJ2J1aWxkIG1vZGUnOlxuXG4iCisKKyAgICAiICAtIHRoZSAqaW5pdGlhbCogc3lzdGVtIGltYWdlIGlzIGNvcGllZCB0byBhIHRlbXBvcmFyeSBmaWxlIHdoaWNoIGlzXG4iCisgICAgIiAgICBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgZW11bGF0b3IgZXhpdHMuIFRoZXJlIGlzIHRodXMgbm8gd2F5IHRvXG4iCisgICAgIiAgICBtYWtlIHBlcnNpc3RlbnQgY2hhbmdlcyB0byB0aGlzIGltYWdlIHRocm91Z2ggdGhlIGVtdWxhdG9yLCBldmVuIGlmXG4iCisgICAgIiAgICB5b3UgdXNlIHRoZSAnLWltYWdlIDxmaWxlPicgb3B0aW9uLlxuXG4iCisKKyAgICAiICAtIHVubGVzcyB5b3UgdXNlIHRoZSAnLWNhY2hlIDxmaWxlPicgb3B0aW9uLCB0aGUgY2FjaGUgcGFydGl0aW9uIGltYWdlXG4iCisgICAgIiAgICBpcyBiYWNrZWQgYnkgYSB0ZW1wb3JhcnkgZmlsZSB0aGF0IGlzIGluaXRpYWxseSBlbXB0eSBhbmQgZGVzdHJveWVkIG9uXG4iCisgICAgIiAgICBwcm9ncmFtIGV4aXQuXG5cbiIKKworICAgICIgIFNQRUNJQUwgTk9URTogSWYgeW91IGFyZSB1c2luZyB0aGUgZW11bGF0b3Igd2l0aCB0aGUgQW5kcm9pZCBTREssIHRoZVxuIgorICAgICIgIGluZm9ybWF0aW9uIGFib3ZlIGRvZXNuJ3QgYXBwbHkuIFNlZSAtaGVscC1zZGstaW1hZ2VzIGZvciBtb3JlIGRldGFpbHMuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfZGlza19pbWFnZXMoIHN0cmFsbG9jX3QqICBvdXQgKQoreworICAgIGNoYXIgIGRhdGFkaXJbMjU2XTsKKworICAgIGJ1ZnByaW50X2NvbmZpZ19wYXRoKCBkYXRhZGlyLCBkYXRhZGlyICsgc2l6ZW9mKGRhdGFkaXIpICk7CisKKyAgICBQUklOVEYoCisgICAgIiAgVGhlIGVtdWxhdG9yIG5lZWRzIHNldmVyYWwga2V5IGltYWdlIGZpbGVzIHRvIHJ1biBhcHByb3ByaWF0ZWx5LlxuIgorICAgICIgIFRoZWlyIGV4YWN0IGxvY2F0aW9uIGRlcGVuZHMgb24gd2hldGhlciB5b3UncmUgdXNpbmcgdGhlIGVtdWxhdG9yXG4iCisgICAgIiAgZnJvbSB0aGUgQW5kcm9pZCBTREssIG9yIG5vdCAobW9yZSBkZXRhaWxzIGJlbG93KS5cblxuIgorCisgICAgIiAgVGhlIG1pbmltYWwgcmVxdWlyZWQgaW1hZ2UgZmlsZXMgYXJlIHRoZSBmb2xsb3dpbmc6XG5cbiIKKworICAgICIgICAga2VybmVsLXFlbXUgICAgICB0aGUgZW11bGF0b3Itc3BlY2lmaWMgTGludXgga2VybmVsIGltYWdlXG4iCisgICAgIiAgICByYW1kaXNrLmltZyAgICAgIHRoZSByYW1kaXNrIGltYWdlIHVzZWQgdG8gYm9vdCB0aGUgc3lzdGVtXG4iCisgICAgIiAgICBzeXN0ZW0uaW1nICAgICAgIHRoZSAqaW5pdGlhbCogc3lzdGVtIGltYWdlXG4iCisgICAgIiAgICB1c2VyZGF0YS5pbWcgICAgIHRoZSAqaW5pdGlhbCogZGF0YSBwYXJ0aXRpb24gaW1hZ2VcblxuIgorCisgICAgIiAgSXQgd2lsbCBhbHNvIHVzZSB0aGUgZm9sbG93aW5nIHdyaXRhYmxlIGltYWdlIGZpbGVzOlxuXG4iCisKKyAgICAiICAgIHVzZXJkYXRhLXFlbXUuaW1nICB0aGUgcGVyc2lzdGVudCBkYXRhIHBhcnRpdGlvbiBpbWFnZVxuIgorICAgICIgICAgc3lzdGVtLXFlbXUuaW1nICAgIGFuICpvcHRpb25hbCogcGVyc2lzdGVudCBzeXN0ZW0gaW1hZ2VcbiIKKyAgICAiICAgIGNhY2hlLmltZyAgICAgICAgICBhbiAqb3B0aW9uYWwqIGNhY2hlIHBhcnRpdGlvbiBpbWFnZVxuIgorICAgICIgICAgc2RjYXJkLmltZyAgICAgICAgIGFuICpvcHRpb25hbCogU0QgQ2FyZCBwYXJ0aXRpb24gaW1hZ2VcblxuIgorICAgICIgICAgc25hcHNob3RzLmltZyAgICAgIGFuICpvcHRpb25hbCogc3RhdGUgc25hcHNob3RzIGltYWdlXG5cbiIKKworICAgICIgIElmIHlvdSB1c2UgYSB2aXJ0dWFsIGRldmljZSwgaXRzIGNvbnRlbnQgZGlyZWN0b3J5IHNob3VsZCBzdG9yZVxuIgorICAgICIgIGFsbCB3cml0YWJsZSBpbWFnZXMsIGFuZCByZWFkLW9ubHkgb25lcyB3aWxsIGJlIGZvdW5kIGZyb20gdGhlXG4iCisgICAgIiAgY29ycmVzcG9uZGluZyBwbGF0Zm9ybS9hZGQtb24gZGlyZWN0b3JpZXMuIFNlZSAtaGVscC1zZGstaW1hZ2VzXG4iCisgICAgIiAgZm9yIG1vcmUgZGV0YWlscy5cblxuIgorCisgICAgIiAgSWYgeW91IGFyZSBidWlsZGluZyBmcm9tIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSwgeW91IHNob3VsZFxuIgorICAgICIgIGhhdmUgQU5EUk9JRF9QUk9EVUNUX09VVCBkZWZpbmVkIGluIHlvdXIgZW52aXJvbm1lbnQsIGFuZCB0aGVcbiIKKyAgICAiICBlbXVsYXRvciBzaGFsbCBiZSBhYmxlIHRvIHBpY2stdXAgdGhlIHJpZ2h0IGltYWdlIGZpbGVzIGF1dG9tYXRpY2FsbHkuXG4iCisgICAgIiAgU2VlIC1oZWxwLWJ1aWxkLWltYWdlcyBmb3IgbW9yZSBkZXRhaWxzLlxuXG4iCisKKyAgICAiICBJZiB5b3UncmUgbmVpdGhlciB1c2luZyB0aGUgU0RLIG9yIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSwgeW91XG4iCisgICAgIiAgY2FuIHN0aWxsIHJ1biB0aGUgZW11bGF0b3IgYnkgZXhwbGljaXRlbHkgcHJvdmlkaW5nIHRoZSBwYXRocyB0b1xuIgorICAgICIgICphbGwqIHJlcXVpcmVkIGRpc2sgaW1hZ2VzIHRocm91Z2ggYSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nXG4iCisgICAgIiAgb3B0aW9uczogLXN5c2RpciwgLWRhdGFkaXIsIC1rZXJuZWwsIC1yYW1kaXNrLCAtc3lzdGVtLCAtZGF0YSwgLWNhY2hlXG4iCisgICAgIiAgLXNkY2FyZCBhbmQgLXNuYXBzdG9yYWdlLlxuXG4iCisKKyAgICAiICBUaGUgYWN0dWFsIGxvZ2ljIGJlaW5nIHRoYXQgdGhlIGVtdWxhdG9yIHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgYWxsXG4iCisgICAgIiAgaW1hZ2VzIGZyb20gdGhlIG9wdGlvbnMgeW91IGdpdmUgaXQuXG5cbiIKKworICAgICIgIEZvciBtb3JlIGRldGFpbCwgc2VlIHRoZSBjb3JyZXNwb25kaW5nIC1oZWxwLTxvcHRpb24+IGVudHJ5LlxuXG4iCisKKyAgICAiICBPdGhlciByZWxhdGVkIG9wdGlvbnMgYXJlOlxuXG4iCisKKyAgICAiICAgICAgLWluaXQtZGF0YSAgICAgICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlICppbml0aWFsKiB1c2VyIGRhdGEgaW1hZ2VcblxuIgorCisgICAgIiAgICAgIC13aXBlLWRhdGEgICAgICAgQ29weSB0aGUgY29udGVudCBvZiB0aGUgKmluaXRpYWwqIHVzZXIgZGF0YSBpbWFnZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2VyZGF0YS5pbWcpIGludG8gdGhlIHdyaXRhYmxlIG9uZSAodXNlcmRhdGEtcWVtdS5pbWcpXG5cbiIKKworICAgICIgICAgICAtbm8tY2FjaGUgICAgICAgIGRvIG5vdCB1c2UgYSBjYWNoZSBwYXJ0aXRpb24sIGV2ZW4gaWYgb25lIGlzXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLlxuXG4iCisKKyAgICAiICAgICAgLW5vLXNuYXBzdG9yYWdlICBkbyBub3QgdXNlIGEgc3RhdGUgc25hcHNob3QgaW1hZ2UsIGV2ZW4gaWYgb25lIGlzXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLlxuXG4iCisgICAgLAorICAgIGRhdGFkaXIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfZW52aXJvbm1lbnQoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgVGhlIEFuZHJvaWQgZW11bGF0b3IgbG9va3MgYXQgdmFyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2hlbiBpdCBzdGFydHM6XG5cbiIKKworICAgICIgIElmIEFORFJPSURfTE9HX1RBR1MgaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSB1c2VkIGFzIGluICctbG9nY2F0IDx0YWdzPicuXG5cbiIKKworICAgICIgIElmICdodHRwX3Byb3h5JyBpcyBkZWZpbmVkLCBpdCB3aWxsIGJlIHVzZWQgYXMgaW4gJy1odHRwLXByb3h5IDxwcm94eT4nLlxuXG4iCisKKyAgICAiICBJZiBBTkRST0lEX1ZFUkJPU0UgaXMgZGVmaW5lZCwgaXQgY2FuIGNvbnRhaW4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZlxuIgorICAgICIgIHZlcmJvc2UgaXRlbXMuIGZvciBleGFtcGxlOlxuXG4iCisKKyAgICAiICAgICAgQU5EUk9JRF9WRVJCT1NFPXNvY2tldCxyYWRpb1xuXG4iCisKKyAgICAiICBpcyBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSAnLXZlcmJvc2UgLXZlcmJvc2Utc29ja2V0IC12ZXJib3NlLXJhZGlvJ1xuIgorICAgICIgIG9wdGlvbnMgdG9nZXRoZXIuIHVuc3VwcG9ydGVkIGl0ZW1zIHdpbGwgYmUgaWdub3JlZC5cblxuIgorCisgICAgIiAgSWYgQU5EUk9JRF9MT0dfVEFHUyBpcyBkZWZpbmVkLCBpdCB3aWxsIGJlIHVzZWQgYXMgaW4gJy1sb2djYXQgPHRhZ3M+Jy5cblxuIgorCisgICAgIiAgSWYgQU5EUk9JRF9FTVVMQVRPUl9IT01FIGlzIGRlZmluZWQsIGl0IHJlcGxhY2VzIHRoZSBwYXRoIG9mIHRoZSAnJEhPTUUvLmFuZHJvaWQnXG4iCisgICAgIiAgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBlbXVsYXRvciBjb25maWcgZGF0YSAoa2V5IHN0b3JlcywgZXRjLikuXG5cbiIKKworICAgICIgIElmIEFORFJPSURfU0RLX1JPT1QgaXMgZGVmaW5lZCwgaXQgaW5kaWNhdGVzIHRoZSBwYXRoIG9mIHRoZSBTREtcbiIKKyAgICAiICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LlxuXG4iCisKKyAgICApOworfQorCisKK3N0YXRpYyB2b2lkCitoZWxwX2RlYnVnX3RhZ3Moc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBpbnQgIG47CisKKyNkZWZpbmUgIF9WRVJCT1NFX1RBRyh4LHkpICAgeyAjeCwgVkVSQk9TRV8jI3gsIHkgfSwKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgY29uc3QgY2hhciogIG5hbWU7IGludCAgZmxhZzsgY29uc3QgY2hhciogIHRleHQ7IH0KKyAgICB2ZXJib3NlX29wdGlvbnNbXSA9IHsKKyAgICAgICAgVkVSQk9TRV9UQUdfTElTVAorICAgICAgICB7IDAsIDAsIDAgfQorICAgIH07CisjdW5kZWYgX1ZFUkJPU0VfVEFHCisKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctZGVidWcgPHRhZ3M+JyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVidWdcbiIKKyAgICAiICBtZXNzYWdlcyBmcm9tIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBlbXVsYXRvci4gPHRhZ3M+IG11c3QgYmUgYSBsaXN0XG4iCisgICAgIiAgKHNlcGFyYXRlZCBieSBzcGFjZS9jb21tYS9jb2x1bW4pIG9mIDxjb21wb25lbnQ+IG5hbWVzLCB3aGljaCBjYW4gYmUgb25lIG9mOlxuXG4iCisgICAgKTsKKworICAgIGZvciAobiA9IDA7IG4gPCBWRVJCT1NFX01BWDsgbisrKQorICAgICAgICBQUklOVEYoICIgICAgJS0xMnMgICAgJXNcbiIsIHZlcmJvc2Vfb3B0aW9uc1tuXS5uYW1lLCB2ZXJib3NlX29wdGlvbnNbbl0udGV4dCApOworICAgIFBSSU5URiggIiAgICAlLTEycyAgICAlc1xuIiwgImFsbCIsICJhbGwgY29tcG9uZW50cyB0b2dldGhlclxuIiApOworCisgICAgUFJJTlRGKAorICAgICJcbiIKKyAgICAiICBlYWNoIDxjb21wb25lbnQ+IGNhbiBiZSBwcmVmaXhlZCB3aXRoIGEgc2luZ2xlICctJyB0byBpbmRpY2F0ZSB0aGUgZGlzYWJsaW5nXG4iCisgICAgIiAgb2YgaXRzIGRlYnVnIG1lc3NhZ2VzLiBmb3IgZXhhbXBsZTpcblxuIgorCisgICAgIiAgICAtZGVidWcgYWxsLC1zb2NrZXQsLWtleXNcblxuIgorCisgICAgIiAgZW5hYmxlcyBhbGwgZGVidWcgbWVzc2FnZXMsIGV4Y2VwdCB0aGUgb25lcyByZWxhdGVkIHRvIG5ldHdvcmsgc29ja2V0c1xuIgorICAgICIgIGFuZCBrZXkgYmluZGluZ3MvcHJlc3Nlc1xuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfY2hhcl9kZXZpY2VzKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHZhcmlvdXMgZW11bGF0aW9uIG9wdGlvbnMgdGFrZSBhIDxkZXZpY2U+IHNwZWNpZmljYXRpb24gdGhhdCBjYW4gYmUgdXNlZCB0b1xuIgorICAgICIgIHNwZWNpZnkgc29tZXRoaW5nIHRvIGhvb2sgdG8gYW4gZW11bGF0ZWQgZGV2aWNlIG9yIGNvbW11bmljYXRpb24gY2hhbm5lbC5cbiIKKyAgICAiICBoZXJlIGlzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCA8ZGV2aWNlPiBzcGVjaWZpY2F0aW9uczpcblxuIgorCisgICAgIiAgICAgIHN0ZGlvXG4iCisgICAgIiAgICAgICAgICBzdGFuZGFyZCBpbnB1dC9vdXRwdXQuIHRoaXMgbWF5IGJlIHN1YmplY3QgdG8gY2hhcmFjdGVyXG4iCisgICAgIiAgICAgICAgICB0cmFuc2xhdGlvbiAoZS5nLiBMTiA8PT4gQ1IvTEYpXG5cbiIKKworICAgICIgICAgICBDT008bj4gICBbV2luZG93cyBvbmx5XVxuIgorICAgICIgICAgICAgICAgd2hlcmUgPG4+IGlzIGEgZGlnaXQuIGhvc3Qgc2VyaWFsIGNvbW11bmljYXRpb24gcG9ydC5cblxuIgorCisgICAgIiAgICAgIHBpcGU6PGZpbGVuYW1lPlxuIgorICAgICIgICAgICAgICAgbmFtZWQgcGlwZSA8ZmlsZW5hbWU+XG5cbiIKKworICAgICIgICAgICBmaWxlOjxmaWxlbmFtZT5cbiIKKyAgICAiICAgICAgICAgIHdyaXRlIG91dHB1dCB0byA8ZmlsZW5hbWU+LCBubyBpbnB1dCBjYW4gYmUgcmVhZFxuXG4iCisKKyAgICAiICAgICAgcHR5ICBbTGludXggb25seV1cbiIKKyAgICAiICAgICAgICAgIHBzZXVkbyBUVFkgKGEgbmV3IFBUWSBpcyBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZClcblxuIgorCisgICAgIiAgICAgIC9kZXYvPGZpbGU+ICBbVW5peCBvbmx5XVxuIgorICAgICIgICAgICAgICAgaG9zdCBjaGFyIGRldmljZSBmaWxlLCBlLmcuIC9kZXYvdHR5UzAuIG1heSByZXF1aXJlIHJvb3QgYWNjZXNzXG5cbiIKKworICAgICIgICAgICAvZGV2L3BhcnBvcnQ8Tj4gIFtMaW51eCBvbmx5XVxuIgorICAgICIgICAgICAgICAgdXNlIGhvc3QgcGFyYWxsZWwgcG9ydC4gbWF5IHJlcXVpcmUgcm9vdCBhY2Nlc3NcblxuIgorCisgICAgIiAgICAgIHVuaXg6PHBhdGg+WyxzZXJ2ZXJdWyxub3dhaXRdXSAgICAgW1VuaXggb25seV1cbiIKKyAgICAiICAgICAgICAgIHVzZSBhIFVuaXggZG9tYWluIHNvY2tldC4gaWYgeW91IHVzZSB0aGUgJ3NlcnZlcicgb3B0aW9uLCB0aGVuXG4iCisgICAgIiAgICAgICAgICB0aGUgZW11bGF0b3Igd2lsbCBjcmVhdGUgdGhlIHNvY2tldCBhbmQgd2FpdCBmb3IgYSBjbGllbnQgdG9cbiIKKyAgICAiICAgICAgICAgIGNvbm5lY3QgYmVmb3JlIGNvbnRpbnVpbmcsIHVubGVzcyB5b3UgYWxzbyB1c2UgJ25vd2FpdCdcblxuIgorCisgICAgIiAgICAgIHRjcDpbPGhvc3Q+XTo8cG9ydD5bLHNlcnZlcl1bLG5vd2FpdF1bLG5vZGVsYXldXG4iCisgICAgIiAgICAgICAgICB1c2UgYSBUQ1Agc29ja2V0LiAnaG9zdCcgaXMgc2V0IHRvIGxvY2FsaG9zdCBieSBkZWZhdWx0LiBpZiB5b3VcbiIKKyAgICAiICAgICAgICAgIHVzZSB0aGUgJ3NlcnZlcicgb3B0aW9uIHdpbGwgYmluZCB0aGUgcG9ydCBhbmQgd2FpdCBmb3IgYSBjbGllbnRcbiIKKyAgICAiICAgICAgICAgIHRvIGNvbm5lY3QgYmVmb3JlIGNvbnRpbnVpbmcsIHVubGVzcyB5b3UgYWxzbyB1c2UgJ25vd2FpdCcuIHRoZVxuIgorICAgICIgICAgICAgICAgJ25vZGVsYXknIG9wdGlvbiBkaXNhYmxlcyB0aGUgVENQIE5hZ2xlIGFsZ29yaXRobVxuXG4iCisKKyAgICAiICAgICAgdGVsbmV0Ols8aG9zdD5dOjxwb3J0Plssc2VydmVyXVssbm93YWl0XVssbm9kZWxheV1cbiIKKyAgICAiICAgICAgICAgIHNpbWlsYXIgdG8gJ3RjcDonIGJ1dCB1c2VzIHRoZSB0ZWxuZXQgcHJvdG9jb2wgaW5zdGVhZCBvZiByYXcgVENQXG5cbiIKKworICAgICIgICAgICB1ZHA6WzxyZW1vdGVfaG9zdD5dOjxyZW1vdGVfcG9ydD5bQFs8c3JjX2lwPl06PHNyY19wb3J0Pl1cbiIKKyAgICAiICAgICAgICAgIHNlbmQgb3V0cHV0IHRvIGEgcmVtb3RlIFVEUCBzZXJ2ZXIuIGlmICdyZW1vdGVfaG9zdCcgaXMgbm9cbiIKKyAgICAiICAgICAgICAgIHNwZWNpZmllZCBpdCB3aWxsIGRlZmF1bHQgdG8gJzAuMC4wLjAnLiB5b3UgY2FuIGFsc28gcmVjZWl2ZSBpbnB1dFxuIgorICAgICIgICAgICAgICAgdGhyb3VnaCBVRFAgYnkgc3BlY2lmeWluZyBhIHNvdXJjZSBhZGRyZXNzIGFmdGVyIHRoZSBvcHRpb25hbCAnQCcuXG5cbiIKKworICAgICIgICAgICBmZHBhaXI6PGZkMT4sPGZkMj4gIFtVbml4IG9ubHldXG4iCisgICAgIiAgICAgICAgICByZWRpcmVjdGlvbiBpbnB1dCBhbmQgb3V0cHV0IHRvIGEgcGFpciBvZiBwcmUtb3BlbmVkIGZpbGVcbiIKKyAgICAiICAgICAgICAgIGRlc2NyaXB0b3JzLiB0aGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIHNjcmlwdHMgYW5kIG90aGVyXG4iCisgICAgIiAgICAgICAgICBwcm9ncmFtbWF0aWMgbGF1bmNoZXMgb2YgdGhlIGVtdWxhdG9yLlxuXG4iCisKKyAgICAiICAgICAgbm9uZVxuIgorICAgICIgICAgICAgICAgbm8gZGV2aWNlIGNvbm5lY3RlZFxuXG4iCisKKyAgICAiICAgICAgbnVsbFxuIgorICAgICIgICAgICAgICAgdGhlIG51bGwgZGV2aWNlIChhLmsuYSAvZGV2L251bGwgb24gVW5peCwgb3IgTlVMIG9uIFdpbjMyKVxuXG4iCisKKyAgICAiICBOT1RFOiB0aGVzZSBjb3JyZXNwb25kIHRvIHRoZSA8ZGV2aWNlPiBwYXJhbWV0ZXIgb2YgdGhlIFFFTVUgLXNlcmlhbCBvcHRpb25cbiIKKyAgICAiICAgICAgICBhcyBkZXNjcmliZWQgb24gaHR0cDovL2JlbGxhcmQub3JnL3FlbXUvcWVtdS1kb2MuaHRtbCNTRUMxMFxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfYXZkKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLWF2ZCA8bmFtZT4nIHRvIHN0YXJ0IHRoZSBlbXVsYXRvciBwcm9ncmFtIHdpdGggYSBnaXZlbiBBbmRyb2lkXG4iCisgICAgIiAgVmlydHVhbCBEZXZpY2UgKGEuay5hLiBBVkQpLCB3aGVyZSA8bmFtZT4gbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBuYW1lXG4iCisgICAgIiAgb2Ygb25lIG9mIHRoZSBleGlzdGluZyBBVkRzIGF2YWlsYWJsZSBvbiB5b3VyIGhvc3QgbWFjaGluZS5cblxuIgorCisgICAgICAiU2VlIC1oZWxwLXZpcnR1YWwtZGV2aWNlIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUvbGlzdC9tYW5hZ2UgQVZEcy5cblxuIgorCisgICAgIiAgQXMgYSBzcGVjaWFsIGNvbnZlbmllbmNlLCB1c2luZyAnQDxuYW1lPicgaXMgZXF1aXZhbGVudCB0byB1c2luZ1xuIgorICAgICIgICctYXZkIDxuYW1lPicuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9zeXNkaXIoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBjaGFyICAgc3lzdGVtZGlyW01BWF9QQVRIXTsKKyAgICBjaGFyICAgKnAgPSBzeXN0ZW1kaXIsICplbmQgPSBwICsgc2l6ZW9mKHN5c3RlbWRpcik7CisKKyAgICBwID0gYnVmcHJpbnRfYXBwX2RpciggcCwgZW5kICk7CisgICAgcCA9IGJ1ZnByaW50KCBwLCBlbmQsIFBBVEhfU0VQICJsaWIiIFBBVEhfU0VQICJpbWFnZXMiICk7CisKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctc3lzZGlyIDxkaXI+JyB0byBzcGVjaWZ5IGEgZGlyZWN0b3J5IHdoZXJlIHN5c3RlbSByZWFkLW9ubHlcbiIKKyAgICAiICBpbWFnZSBmaWxlcyB3aWxsIGJlIHNlYXJjaGVkLiBvbiB0aGlzIHN5c3RlbSwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOlxuXG4iCisgICAgIiAgICAgICVzXG5cbiIsIHN5c3RlbWRpciApOworCisgICAgUFJJTlRGKAorICAgICIgIHNlZSAnLWhlbHAtZGlzay1pbWFnZXMnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc2sgaW1hZ2UgZmlsZXNcblxuIiApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9kYXRhZGlyKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgY2hhciAgZGF0YWRpcltNQVhfUEFUSF07CisKKyAgICBidWZwcmludF9jb25maWdfcGF0aChkYXRhZGlyLCBkYXRhZGlyICsgc2l6ZW9mKGRhdGFkaXIpKTsKKworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1kYXRhZGlyIDxkaXI+JyB0byBzcGVjaWZ5IGEgZGlyZWN0b3J5IHdoZXJlIHdyaXRhYmxlIGltYWdlIGZpbGVzXG4iCisgICAgIiAgd2lsbCBiZSBzZWFyY2hlZC4gb24gdGhpcyBzeXN0ZW0sIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczpcblxuIgorICAgICIgICAgICAlc1xuXG4iLCBkYXRhZGlyICk7CisKKyAgICBQUklOVEYoCisgICAgIiAgc2VlICctaGVscC1kaXNrLWltYWdlcycgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGlzayBpbWFnZSBmaWxlc1xuXG4iICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX2tlcm5lbChzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1rZXJuZWwgPGZpbGU+JyB0byBzcGVjaWZ5IGEgTGludXgga2VybmVsIGltYWdlIHRvIGJlIHJ1bi5cbiIKKyAgICAiICB0aGUgZGVmYXVsdCBpbWFnZSBpcyAna2VybmVsLXFlbXUnIGZyb20gdGhlIHN5c3RlbSBkaXJlY3RvcnkuXG5cbiIKKworICAgICIgIHlvdSBjYW4gdXNlICctZGVidWcta2VybmVsJyB0byBzZWUgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUga2VybmVsXG4iCisgICAgIiAgdG8gdGhlIHRlcm1pbmFsXG5cbiIKKworICAgICIgIHNlZSAnLWhlbHAtZGlzay1pbWFnZXMnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc2sgaW1hZ2UgZmlsZXNcblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3JhbWRpc2soc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctcmFtZGlzayA8ZmlsZT4nIHRvIHNwZWNpZnkgYSBMaW51eCByYW1kaXNrIGJvb3QgaW1hZ2UgdG8gYmUgcnVuIGluXG4iCisgICAgIiAgdGhlIGVtdWxhdG9yLiB0aGUgZGVmYXVsdCBpbWFnZSBpcyAncmFtZGlzay5pbWcnIGZyb20gdGhlIHN5c3RlbSBkaXJlY3RvcnkuXG5cbiIKKworICAgICIgIHNlZSAnLWhlbHAtZGlzay1pbWFnZXMnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGRpc2sgaW1hZ2UgZmlsZXNcblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3N5c3RlbShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1zeXN0ZW0gPGZpbGU+JyB0byBzcGVjaWZ5IHRoZSBpbnRpYWwgc3lzdGVtIGltYWdlIHRoYXQgd2lsbCBiZSBsb2FkZWQuXG4iCisgICAgIiAgdGhlIGRlZmF1bHQgaW1hZ2UgaXMgJ3N5c3RlbS5pbWcnIGZyb20gdGhlIHN5c3RlbSBkaXJlY3RvcnkuXG5cbiIKKworICAgICIgIE5PVEU6IEluIHByZXZpb3VzIHJlbGVhc2VzIG9mIHRoZSBBbmRyb2lkIFNESywgdGhpcyBvcHRpb24gd2FzIG5hbWVkICctaW1hZ2UnLlxuIgorICAgICIgICAgICAgIEFuZCB1c2luZyAnLXN5c3RlbSA8cGF0aD4nIHdhcyBlcXVpdmFsZW50IHRvIHVzaW5nICctc3lzZGlyIDxwYXRoPicgbm93LlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9pbWFnZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBUaGlzIG9wdGlvbiBpcyBvYnNvbGV0ZSwgeW91IHNob3VsZCB1c2UgJy1zeXN0ZW0gPGZpbGU+JyBpbnN0ZWFkIHRvIHBvaW50XG4iCisgICAgIiAgdG8gdGhlIGluaXRpYWwgc3lzdGVtIGltYWdlLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9kYXRhKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLWRhdGEgPGZpbGU+JyB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IC9kYXRhIHBhcnRpdGlvbiBpbWFnZSBmaWxlLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF93aXBlX2RhdGEoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctd2lwZS1kYXRhJyB0byByZXNldCB5b3VyIC9kYXRhIHBhcnRpdGlvbiBpbWFnZSB0byBpdHMgZmFjdG9yeVxuIgorICAgICIgIGRlZmF1bHRzLiB0aGlzIHJlbW92ZXMgYWxsIGluc3RhbGxlZCBhcHBsaWNhdGlvbnMgYW5kIHNldHRpbmdzLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF93cml0YWJsZV9zeXN0ZW0oc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgLXdyaXRhYmxlLXN5c3RlbSB0byBoYXZlIGEgd3JpdGFibGUgc3lzdGVtIGltYWdlIGR1cmluZyB5b3VyXG4iCisgICAgIiAgZW11bGF0aW9uIHNlc3Npb24uIE1vcmUgc3BlY2lmaWNhbGx5LCBvbmUgc2hvdWxkOlxuXG4iCisKKyAgICAiICAtIFN0YXJ0IHRoZSBBVkQgd2l0aCB0aGUgJy13cml0YWJsZS1zeXN0ZW0nIGZsYWcuXG4iCisgICAgIiAgLSBVc2UgJ2FkYiByZW1vdW50JyBmcm9tIGEgaG9zdCB0ZXJtaW5hbCB0byB0ZWxsIHRoZSBndWVzdCBzeXN0ZW0gdG9cbiIKKyAgICAiICAgIHJlbW91bnQgL3N5c3RlbSBhcyByZWFkL3dyaXRlIChpdCBpcyBtb3VudGVkIGFzIHJlYWRvbmx5IGJ5IGRlZmF1bHQpLlxuIgorICAgICJcbiIKKyAgICAiICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBmbGFnIHdpbGwgY3JlYXRlIGEgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIHN5c3RlbVxuIgorICAgICIgIGltYWdlIHRoYXQgY2FuIGJlIHZlcnkgbGFyZ2UgKHNldmVyYWwgaHVuZHJlZHMgb2YgTUJzKSwgYnV0IHdpbGwgYmVcbiIKKyAgICAiICBkZXN0cm95ZWQgYXQgZW11bGF0b3IgZXhpdC5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9jYWNoZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1jYWNoZSA8ZmlsZT4nIHRvIHNwZWNpZnkgYSAvY2FjaGUgcGFydGl0aW9uIGltYWdlLiBpZiA8ZmlsZT4gZG9lc1xuIgorICAgICIgIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkIGVtcHR5LiBieSBkZWZhdWx0LCB0aGUgY2FjaGUgcGFydGl0aW9uIGlzXG4iCisgICAgIiAgYmFja2VkIGJ5IGEgdGVtcG9yYXJ5IGZpbGUgdGhhdCBpcyBkZWxldGVkIHdoZW4gdGhlIGVtdWxhdG9yIGV4aXRzLlxuIgorICAgICIgIHVzaW5nIHRoZSAtY2FjaGUgb3B0aW9uIGFsbG93cyBpdCB0byBiZSBwZXJzaXN0ZW50LlxuXG4iCisKKyAgICAiICB0aGUgJy1uby1jYWNoZScgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhlIGNhY2hlIHBhcnRpdGlvbi5cblxuIgorCisgICAgIiAgc2VlICctaGVscC1kaXNrLWltYWdlcycgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGlzayBpbWFnZSBmaWxlc1xuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfY2FjaGVfc2l6ZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1jYWNoZSA8c2l6ZT4nIHRvIHNwZWNpZnkgYSAvY2FjaGUgcGFydGl0aW9uIHNpemUgaW4gTUIuIEJ5IGRlZmF1bHQsXG4iCisgICAgIiAgdGhlIGNhY2hlIHBhcnRpdGlvbiBzaXplIGlzIHNldCB0byA2Nk1CXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9ub19jYWNoZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1uby1jYWNoZScgdG8gZGlzYWJsZSB0aGUgY2FjaGUgcGFydGl0aW9uIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0uXG4iCisgICAgIiAgdGhlIGNhY2hlIHBhcnRpdGlvbiBpcyBvcHRpb25hbCwgYnV0IHdoZW4gYXZhaWxhYmxlLCBpcyB1c2VkIGJ5IHRoZSBicm93c2VyXG4iCisgICAgIiAgdG8gY2FjaGUgd2ViIHBhZ2VzIGFuZCBpbWFnZXNcblxuIgorCisgICAgIiAgc2VlICctaGVscC1kaXNrLWltYWdlcycgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZGlzayBpbWFnZSBmaWxlc1xuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfc2RjYXJkKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXNkY2FyZCA8ZmlsZT4nIHRvIHNwZWNpZnkgYSBTRCBDYXJkIGltYWdlIGZpbGUgdGhhdCB3aWxsIGJlIGF0dGFjaGVkXG4iCisgICAgIiAgdG8gdGhlIGVtdWxhdG9yLiBCeSBkZWZhdWx0LCB0aGUgJ3NkY2FyZC5pbWcnIGZpbGUgaXMgc2VhcmNoZWQgaW4gdGhlIGRhdGFcbiIKKyAgICAiICBkaXJlY3RvcnkuXG5cbiIKKworICAgICIgIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUgZW11bGF0b3Igd2lsbCBzdGlsbCBzdGFydCwgYnV0IHdpdGhvdXQgYW5cbiIKKyAgICAiICBhdHRhY2hlZCBTRCBDYXJkLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9zbmFwc3RvcmFnZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgJy1zbmFwc3RvcmFnZSA8ZmlsZT4nIHRvIHNwZWNpZnkgYSByZXBvc2l0b3J5IGZpbGUgZm9yIHNuYXBzaG90cy5cbiIKKyAgICAiICBBbGwgc25hcHNob3RzIG1hZGUgZHVyaW5nIGV4ZWN1dGlvbiB3aWxsIGJlIHNhdmVkIGluIHRoaXMgZmlsZSwgYW5kIG9ubHlcbiIKKyAgICAiICBzbmFwc2hvdHMgaW4gdGhpcyBmaWxlIGNhbiBiZSByZXN0b3JlZCBkdXJpbmcgdGhlIGVtdWxhdG9yIHJ1bi5cblxuIgorCisgICAgIiAgSWYgdGhlIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byAnc25hcHNob3RzLmltZycgaW4gdGhlXG4iCisgICAgIiAgZGF0YSBkaXJlY3RvcnkuIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIGVtdWxhdG9yIHdpbGxcbiIKKyAgICAiICBzdGFydCwgYnV0IHdpdGhvdXQgc3VwcG9ydCBmb3Igc2F2aW5nIG9yIGxvYWRpbmcgc3RhdGUgc25hcHNob3RzLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWRpc2staW1hZ2VzJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBkaXNrIGltYWdlIGZpbGVzXG4iCisgICAgIiAgc2VlICctaGVscC1zbmFwc2hvdCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc25hcHNob3RzXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9ub19zbmFwc3RvcmFnZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBUaGlzIHN0YXJ0cyB0aGUgZW11bGF0b3Igd2l0aG91dCBtb3VudGluZyBhIGZpbGUgdG8gc3RvcmUgb3IgbG9hZCBzdGF0ZVxuIgorICAgICIgIHNuYXBzaG90cywgZm9yY2luZyBhIGZ1bGwgYm9vdCBhbmQgZGlzYWJsaW5nIHN0YXRlIHNuYXBzaG90IGZ1bmN0aW9uYWxpdHkuXG5cbiIKKyAgICAiIgorICAgICIgIFRoaXMgY29tbWFuZCBvdmVycmlkZXMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbWV0ZXJzXG4iCisgICAgIiAgJy1zbmFwc3RvcmFnZScgYW5kICctc25hcHNob3QnLiBBIHdhcm5pbmcgd2lsbCBiZSByYWlzZWQgaWYgZWl0aGVyXG4iCisgICAgIiAgb2YgdGhvc2UgcGFyYW1ldGVycyB3YXMgc3BlY2lmaWVkIGFueXdheS5cblxuIgorICAgICApOworIH0KKworc3RhdGljIHZvaWQKK2hlbHBfc25hcHNob3Qoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgUmF0aGVyIHRoYW4gZXhlY3V0aW5nIGEgZnVsbCBib290IHNlcXVlbmNlLCB0aGUgQW5kcm9pZCBlbXVsYXRvciBjYW5cbiIKKyAgICAiICByZXN1bWUgZXhlY3V0aW9uIGZyb20gYW4gZWFybGllciBzdGF0ZSBzbmFwc2hvdCAod2hpY2ggaXMgdXN1YWxseVxuIgorICAgICIgIHNpZ25pZmljYW50bHkgZmFzdGVyKS4gV2hlbiB0aGUgcGFyYW1ldGVyICctc25hcHNob3QgPG5hbWU+JyBpcyBnaXZlbixcbiIKKyAgICAiICB0aGUgZW11bGF0b3IgbG9hZHMgdGhlIHNuYXBzaG90IG9mIHRoYXQgbmFtZSBmcm9tIHRoZSBzbmFwc2hvdCBpbWFnZSxcbiIKKyAgICAiICBhbmQgc2F2ZXMgaXQgYmFjayB1bmRlciB0aGUgc2FtZSBuYW1lIG9uIGV4aXQuXG5cbiIKKworICAgICIgIElmIHRoZSBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gJ2RlZmF1bHQtYm9vdCcuIElmIHRoZVxuIgorICAgICIgIHNwZWNpZmllZCBzbmFwc2hvdCBkb2VzIG5vdCBleGlzdCwgdGhlIGVtdWxhdG9yIHdpbGwgcGVyZm9ybSBhIGZ1bGwgYm9vdFxuIgorICAgICIgIHNlcXVlbmNlIGluc3RlYWQsIGJ1dCB3aWxsIHN0aWxsIHNhdmUuXG5cbiIKKworICAgICIgIFdBUk5JTkc6IEluIHRoZSBwcm9jZXNzIG9mIGxvYWRpbmcsIGFsbCBjb250ZW50cyBvZiB0aGUgc3lzdGVtLCB1c2VyZGF0YVxuIgorICAgICIgICAgICAgICAgIGFuZCBTRCBjYXJkIGltYWdlcyB3aWxsIGJlIE9WRVJXUklUVEVOIHdpdGggdGhlIGNvbnRlbnRzIHRoZXlcbiIKKyAgICAiICAgICAgICAgICBoZWxkIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBtYWRlLiBVbmxlc3Mgc2F2ZWQgaW4gYSBkaWZmZXJlbnRcbiIKKyAgICAiICAgICAgICAgICBzbmFwc2hvdCwgYW55IGNoYW5nZXMgc2luY2Ugd2lsbCBiZSBsb3N0IVxuXG4iCisKKyAgICAiICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzbmFwc2hvdCBtYW51YWxseSwgY29ubmVjdCB0byB0aGUgZW11bGF0b3IgY29uc29sZTpcblxuIgorCisgICAgIiAgICAgIHRlbG5ldCBsb2NhbGhvc3QgPHBvcnQ+XG5cbiIKKworICAgICIgIFRoZW4gZXhlY3V0ZSB0aGUgY29tbWFuZCAnYXZkIHNuYXBzaG90IHNhdmUgPG5hbWU+Jy4gU2VlICctaGVscC1wb3J0JyBmb3JcbiIKKyAgICAiICBpbmZvcm1hdGlvbiBvbiBvYnRhaW5pbmcgPHBvcnQ+LlxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfbm9fc25hcHNob3Qoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgVGhpcyBpbmhpYml0cyBib3RoIHRoZSBhdXRvbG9hZCBhbmQgYXV0b3NhdmUgb3BlcmF0aW9ucywgZm9yY2luZ1xuIgorICAgICIgIGVtdWxhdG9yIHRvIHBlcmZvcm0gYSBmdWxsIGJvb3Qgc2VxdWVuY2UgYW5kIGxvc2luZyBzdGF0ZSBvbiBjbG9zZS5cbiIKKyAgICAiICBJdCBvdmVycmlkZXMgdGhlICctc25hcHNob3QnIHBhcmFtZXRlci5cbiIKKyAgICAiICBJZiAnLXNuYXBzaG90JyB3YXMgc3BlY2lmaWVkIGFueXdheSwgYSB3YXJuaW5nIGlzIHJhaXNlZC5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX25vX3NuYXBzaG90X2xvYWQoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgUHJldmVudHMgdGhlIGVtdWxhdG9yIGZyb20gbG9hZGluZyB0aGUgQVZEJ3Mgc3RhdGUgZnJvbSB0aGUgc25hcHNob3RcbiIKKyAgICAiICBzdG9yYWdlIG9uIHN0YXJ0LlxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfbm9fc25hcHNob3Rfc2F2ZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBQcmV2ZW50cyB0aGUgZW11bGF0b3IgZnJvbSBzYXZpbmcgdGhlIEFWRCdzIHN0YXRlIHRvIHRoZSBzbmFwc2hvdFxuIgorICAgICIgIHN0b3JhZ2Ugb24gZXhpdCwgbWVhbmluZyB0aGF0IGFsbCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX25vX3NuYXBzaG90X3VwZGF0ZV90aW1lKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIFByZXZlbnQgdGhlIGVtdWxhdG9yIGZyb20gc2VuZGluZyBhbiB1bnNvbGljaXRlZCB0aW1lIHVwZGF0ZVxuIgorICAgICIgIGluIHJlc3BvbnNlIHRvIHRoZSBmaXJzdCBzaWduYWwgc3RyZW5ndGggcXVlcnkgYWZ0ZXIgbG9hZHZtLFxuIgorICAgICIgIHRvIGF2b2lkIGEgc3VkZGVuIHRpbWUganVtcCB0aGF0IG1pZ2h0IHVwc2V0IHRlc3RpbmcuIChTaWduYWxcbiIKKyAgICAiICBzdHJlbmd0aCBpcyBxdWVyaWVkIGFwcHJveGltYXRlbHkgZXZlcnkgMTUgc2Vjb25kcylcblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3NuYXBzaG90X2xpc3Qoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgVGhpcyBwcmludHMgYSB0YWJsZSBvZiBzbmFwc2hvdHMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBzbmFwc2hvdCBzdG9yYWdlXG4iCisgICAgIiAgZmlsZSB0aGF0IHRoZSBlbXVsYXRvciB3YXMgc3RhcnRlZCB3aXRoLCB0aGVuIGV4aXRzLiBWYWx1ZXMgZnJvbSB0aGUgJ0lEJ1xuIgorICAgICIgIGFuZCAnVEFHJyBjb2x1bW5zIGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgdGhlICctc25hcHNob3QnIHBhcmFtZXRlci5cblxuIgorCisgICAgIiAgSWYgJy1zbmFwc3RvcmFnZSA8ZmlsZT4nIHdhcyBzcGVjaWZpZWQgYXMgd2VsbCwgdGhpcyBjb21tYW5kIHByaW50cyBhICIKKyAgICAiICB0YWJsZSBvZiB0aGUgc25hcHNob3RzIHN0b3JlZCBpbiA8ZmlsZT4uXG5cbiIKKworICAgICIgIFNlZSAnLWhlbHAtc25hcHNob3QnIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNuYXBzaG90cy5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX2FjY2VsKHN0cmFsbG9jX3QgKm91dCkKK3sKKyAgICBQUklOVEYoCisgICAgICAgICIgIFVzZSAnLWFjY2VsIDxtb2RlPicgdG8gY29udHJvbCBob3cgQ1BVIGVtdWxhdGlvbiBjYW4gYmUgYWNjZWxlcmF0ZWRcbiIKKyAgICAgICAgIiAgd2hlbiBsYXVuY2hpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IuIEFjY2VsZXJhdGVkIGVtdWxhdGlvbiBvbmx5IHdvcmtzXG4iCisgICAgICAgICIgIGZvciB4ODYgYW5kIHg4Nl82NCBzeXN0ZW0gaW1hZ2VzLiBPbiBMaW51eCwgaXQgcmVsaWVzIG9uIEtWTSBiZWluZ1xuIgorICAgICAgICAiICBpbnN0YWxsZWQuIE9uIFdpbmRvd3MgYW5kIE9TIFgsIGl0IHJlbGllcyBvbiBhbiBJbnRlbCBDUFUgYW5kIHRoZVxuIgorICAgICAgICAiICBJbnRlbCBIQVhNIGRyaXZlciBiZWluZyBpbnN0YWxsZWQgb24geW91ciBkZXZlbG9wbWVudCBtYWNoaW5lLlxuIgorICAgICAgICAiICBWYWxpZCB2YWx1ZXMgZm9yIDxtb2RlPiBhcmU6XG5cbiIKKworICAgICAgICAiICAgICBhdXRvICAgVGhlIGRlZmF1bHQsIGRldGVybWluZXMgYXV0b21hdGljYWxseSBpZiBhY2NlbGVyYXRpb25cbiIKKyAgICAgICAgIiAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHVzZXMgaXQgd2hlbiBwb3NzaWJsZS5cblxuIgorCisgICAgICAgICIgICAgIG9mZiAgICBEaXNhYmxlcyBhY2NlbGVyYXRpb24gZW50aXJlbHkuIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cblxuIgorCisgICAgICAgICIgICAgIG9uICAgICBGb3JjZSBhY2NlbGVyYXRpb24uIElmIEtWTS9IQVhNIGlzIG5vdCBpbnN0YWxsZWQgb3IgdXNhYmxlLFxuIgorICAgICAgICAiICAgICAgICAgICAgdGhlIGVtdWxhdG9yIHdpbGwgcmVmdXNlIHRvIHN0YXJ0IGFuZCBwcmludCBhbiBlcnJvciBtZXNzYWdlLlxuXG4iCisKKyAgICAgICAgIiAgTm90ZSB0aGF0IHRoaXMgZmxhZyBpcyBpZ25vcmVkIGlmIHlvdSdyZSBub3QgZW11bGF0aW5nIGFuIHg4NiBvciB4ODZfNjRcbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9ub19hY2NlbChzdHJhbGxvY190KiBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICAgICAiICBVc2UgJy1uby1hY2NlbCcgYXMgYSBzaG9ydGN1dCB0byAnLWFjY2VsIG9mZicsIGkuZS4gdG8gZGlzYWJsZSBhY2NlbGVyYXRlZFxuIgorICAgICAgICAiICBDUFUgZW11bGF0aW9uLCB3aGVuIGVtdWxhdGluZyBhbiB4ODYgb3IgeDg2XzY0IHN5c3RlbSBpbWFnZS4gT25seSB1c2VmdWxcbiIKKyAgICAgICAgIiAgZm9yIGRlYnVnZ2luZy5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9yYW5jaHUoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAgICAgIiAgREVQUkVDQVRFRDogUHJldmlvdXNseSB1c2VkIHRvIHVzZSB0aGUgbmV3IGVtdWxhdG9yIGVuZ2luZSBhcyB0aGVcbiIKKyAgICAgICAgIiAgcHJlZmVycmVkIGJhY2tlbmQuIE5vdyB0aGlzIG9wdGlvbiBpcyBzaW1wbHkgaWdub3JlZCBhbmQgdGhlICdlbXVsYXRvcidcbiIKKyAgICAgICAgIiAgbGF1bmNoZXIgd2lsbCBhdXRvLWRldGVjdCB0aGUgZW5naW5lLCBmYXZvcmluZyBRRU1VMiBvdmVyIHRoZSBjbGFzc2ljIG9uZVxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX2VuZ2luZShzdHJhbGxvY190KiBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICAgICAiICBTZWxlY3QgdGhlIGVtdWxhdGlvbiBlbmdpbmUgdG8gdXNlLiBWYWxpZCB2YWx1ZXMgYXJlXG5cbiIKKyAgICAgICAgIiAgICAgIGF1dG8gICAgLT4gcGVyZm9ybSBhdXRvLWRldGVjdGlvbiAoZGVmYXVsdClcbiIKKyAgICAgICAgIiAgICAgIGNsYXNzaWMgLT4gdXNlIHRoZSBjbGFzc2ljIGVtdWxhdG9yIGVuZ2luZVxuIgorICAgICAgICAiICAgICAgcWVtdTIgICAtPiB1c2UgdGhlIG5ld2VyIGVtdWxhdG9yIGVuZ2luZVxuXG4iCisKKyAgICAgICAgIiAgQXV0by1kZXRlY3Rpb24gc2hvdWxkIHByb3ZpZGUgdGhlIHZhbHVlIHRoYXQgcHJvdmlkZXMgdGhlIGJlc3RcbiIKKyAgICAgICAgIiAgcGVyZm9ybWFuY2Ugd2hlbiBlbXVsYXRpbmcgYSBnaXZlbiBBVkQuIE9ubHkgdXNlIHRoaXMgb3B0aW9uXG4iCisgICAgICAgICIgIGZvciBkZWJ1Z2dpbmcgLyBjb21wYXJpc29uIHB1cnBvc2VzLlxuXG4iCisgICAgKTsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF9za2luZGlyKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXNraW5kaXIgPGRpcj4nIHRvIHNwZWNpZnkgYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VhcmNoXG4iCisgICAgIiAgZm9yIGVtdWxhdG9yIHNraW5zLiBlYWNoIHNraW4gbXVzdCBiZSBhIHN1YmRpcmVjdG9yeSBvZiA8ZGlyPi4gYnkgZGVmYXVsdFxuIgorICAgICIgIHRoZSBlbXVsYXRvciB3aWxsIGxvb2sgaW4gdGhlICdza2lucycgc3ViLWRpcmVjdG9yeSBvZiB0aGUgc3lzdGVtIGRpcmVjdG9yeVxuXG4iCisKKyAgICAiICB0aGUgJy1za2luIDxuYW1lPicgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gLXNraW5kaXIgaXMgdXNlZC5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9za2luKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXNraW4gPHNraW4+JyB0byBzcGVjaWZ5IGFuIGVtdWxhdG9yIHNraW4sIGVhY2ggc2tpbiBjb3JyZXNwb25kcyB0b1xuIgorICAgICIgIHRoZSB2aXN1YWwgYXBwZWFyYW5jZSBvZiBhIGdpdmVuIGRldmljZSwgaW5jbHVkaW5nIGJ1dHRvbnMgYW5kIGtleWJvYXJkcyxcbiIKKyAgICAiICBhbmQgaXMgc3RvcmVkIGFzIHN1YmRpcmVjdG9yeSA8c2tpbj4gb2YgdGhlIHNraW4gcm9vdCBkaXJlY3RvcnlcbiIKKyAgICAiICAoc2VlICctaGVscC1za2luZGlyJylcblxuIiApOworCisgICAgUFJJTlRGKAorICAgICIgIG5vdGUgdGhhdCA8c2tpbj4gY2FuIGFsc28gYmUgJzx3aWR0aD54PGhlaWdodD4nIChlLmcuICczMjB4NDgwJykgdG9cbiIKKyAgICAiICBzcGVjaWZ5IGFuIGV4YWN0IGZyYW1lYnVmZmVyIHNpemUsIHdpdGhvdXQgYW55IHZpc3VhbCBvcm5hbWVudHMuXG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfc2hhcGVyKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgaW50ICBuOworICAgIFBSSU5URigKKyAgICAiICB0aGUgQW5kcm9pZCBlbXVsYXRvciBzdXBwb3J0cyBuZXR3b3JrIHRocm90dGxpbmcsIGkuZS4gc2xvd2VyIG5ldHdvcmtcbiIKKyAgICAiICBiYW5kd2lkdGggYXMgd2VsbCBhcyBoaWdoZXIgY29ubmVjdGlvbiBsYXRlbmNpZXMuIHRoaXMgaXMgZG9uZSBlaXRoZXIgdGhyb3VnaFxuIgorICAgICIgIHNraW4gY29uZmlndXJhdGlvbiwgb3Igd2l0aCAnLW5ldHNwZWVkIDxzcGVlZD4nIGFuZCAnLW5ldGRlbGF5IDxkZWxheT4nLlxuXG4iCisKKyAgICAiICB0aGUgZm9ybWF0IG9mIC1uZXRzcGVlZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAobnVtYmVycyBhcmUga2JpdHMvcyk6XG5cbiIgKTsKKworICAgIGZvciAobiA9IDA7IG4gPCBhbmRyb2lkX25ldHdvcmtfc3BlZWRzX2NvdW50OyArK24pIHsKKyAgICAgICAgY29uc3QgQW5kcm9pZE5ldHdvcmtTcGVlZCogYW5kcm9pZF9uZXRzcGVlZCA9CisgICAgICAgICAgICAgICAgJmFuZHJvaWRfbmV0d29ya19zcGVlZHNbbl07CisgICAgICAgIFBSSU5URiggIiAgICAtbmV0c3BlZWQgJS0xMnMgJS0xNXMgICh1cDogJS4xZiBLaUIvcywgZG93bjogJS4xZiBLaUIvcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX25ldHNwZWVkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uZXRzcGVlZC0+ZGlzcGxheV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uZXRzcGVlZC0+dXBsb2FkX2JhdWRzLzgxOTIuLAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uZXRzcGVlZC0+ZG93bmxvYWRfYmF1ZHMvODE5Mi4gKTsKKyAgICB9CisgICAgUFJJTlRGKCAiXG4iICk7CisgICAgUFJJTlRGKCAiICAgIC1uZXRzcGVlZCAlLTEycyAlcyIsICI8bnVtPiIsICJzZWxlY3QgYm90aCB1cGxvYWQgYW5kIGRvd25sb2FkIHNwZWVkXG4iKTsKKyAgICBQUklOVEYoICIgICAgLW5ldHNwZWVkICUtMTJzICVzIiwgIjx1cD46PGRvd24+IiwgInNlbGVjdCBpbmRpdmlkdWFsIHVwIGFuZCBkb3duIHNwZWVkXG4iKTsKKworICAgIFBSSU5URiggIlxuICBUaGUgZm9ybWF0IG9mIC1uZXRkZWxheSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAobnVtYmVycyBhcmUgbXNlYyk6XG5cbiIgKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgYW5kcm9pZF9uZXR3b3JrX2xhdGVuY2llc19jb3VudDsgKytuKSB7CisgICAgICAgIGNvbnN0IEFuZHJvaWROZXR3b3JrTGF0ZW5jeSogYW5kcm9pZF9uZXRkZWxheSA9CisgICAgICAgICAgICAgICAgJmFuZHJvaWRfbmV0d29ya19sYXRlbmNpZXNbbl07CisgICAgICAgIFBSSU5URiggIiAgICAtbmV0ZGVsYXkgJS0xMHMgICAlLTE1cyAgKG1pbiAlZCwgbWF4ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmV0ZGVsYXktPm5hbWUsIGFuZHJvaWRfbmV0ZGVsYXktPmRpc3BsYXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbmV0ZGVsYXktPm1pbl9tcywgYW5kcm9pZF9uZXRkZWxheS0+bWF4X21zICk7CisgICAgfQorICAgIFBSSU5URiggIiAgICAtbmV0ZGVsYXkgJS0xMHMgICAlcyIsICI8bnVtPiIsICJzZWxlY3QgZXhhY3QgbGF0ZW5jeVxuIik7CisgICAgUFJJTlRGKCAiICAgIC1uZXRkZWxheSAlLTEwcyAgICVzIiwgIjxtaW4+OjxtYXg+IiwgInNlbGVjdCBtaW4gYW5kIG1heCBsYXRlbmNpZXNcblxuIik7CisKKyAgICBQUklOVEYoICIgIHRoZSBlbXVsYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZGVmYXVsdHM6XG5cbiIgKTsKKyAgICBQUklOVEYoICIgICAgRGVmYXVsdCBuZXR3b3JrIHNwZWVkICAgaXMgJyVzJ1xuIiwgICBrQW5kcm9pZE5ldHdvcmtEZWZhdWx0U3BlZWQpOworICAgIFBSSU5URiggIiAgICBEZWZhdWx0IG5ldHdvcmsgbGF0ZW5jeSBpcyAnJXMnXG5cbiIsIGtBbmRyb2lkTmV0d29ya0RlZmF1bHRMYXRlbmN5KTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfaHR0cF9wcm94eShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB0aGUgQW5kcm9pZCBlbXVsYXRvciBhbGxvd3MgeW91IHRvIHJlZGlyZWN0IGFsbCBUQ1AgY29ubmVjdGlvbnMgdGhyb3VnaFxuIgorICAgICIgIGEgSFRUUC9IVFRQUyBwcm94eS4gdGhpcyBjYW4gYmUgZW5hYmxlZCBieSB1c2luZyB0aGUgJy1odHRwLXByb3h5IDxwcm94eT4nXG4iCisgICAgIiAgb3B0aW9uLCBvciBieSBkZWZpbmluZyB0aGUgJ2h0dHBfcHJveHknIGVudmlyb25tZW50IHZhcmlhYmxlLlxuXG4iCisKKyAgICAiICA8cHJveHk+IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcblxuIgorICAgICIgICAgaHR0cDovLzxzZXJ2ZXI+Ojxwb3J0PlxuIgorICAgICIgICAgaHR0cDovLzx1c2VybmFtZT46PHBhc3N3b3JkPkA8c2VydmVyPjo8cG9ydD5cblxuIgorCisgICAgIiAgdGhlICdodHRwOi8vJyBwcmVmaXggY2FuIGJlIG9taXR0ZWQuIElmICctaHR0cC1wcm94eSA8cHJveHk+JyBpcyBub3QgdXNlZCxcbiIKKyAgICAiICB0aGUgJ2h0dHBfcHJveHknIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGxvb2tlZCB1cCBhbmQgYW55IHZhbHVlIG1hdGNoaW5nXG4iCisgICAgIiAgdGhlIDxwcm94eT4gZm9ybWF0IHdpbGwgYmUgdXNlZCBhdXRvbWF0aWNhbGx5XG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfcmVwb3J0X2NvbnNvbGUoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctcmVwb3J0LWNvbnNvbGUgPHNvY2tldD4nIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZXBvcnQgdGhlXG4iCisgICAgIiAgYXV0b21hdGljYWxseS1hc3NpZ25lZCBjb25zb2xlIHBvcnQgbnVtYmVyIHRvIGEgcmVtb3RlIHRoaXJkLXBhcnR5XG4iCisgICAgIiAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBlbXVsYXRpb24uIDxzb2NrZXQ+IG11c3QgYmUgaW4gb25lIG9mIHRoZXNlXG4iCisgICAgIiAgZm9ybWF0czpcblxuIgorCisgICAgIiAgICAgIHRjcDo8cG9ydD5bLHNlcnZlcl1bLG1heD08c2Vjb25kcz5dWyxpcHY2XVxuIgorICAgICIgICAgICB1bml4OjxwYXRoPlssc2VydmVyXVssbWF4PTxzZWNvbmRzPl1bLGlwdjZdXG4iCisgICAgIlxuIgorICAgICIgIGlmIHRoZSAnc2VydmVyJyBvcHRpb24gaXMgdXNlZCwgdGhlIGVtdWxhdG9yIG9wZW5zIGEgc2VydmVyIHNvY2tldFxuIgorICAgICIgIGFuZCB3YWl0cyBmb3IgYW4gaW5jb21pbmcgY29ubmVjdGlvbiB0byBpdC4gYnkgZGVmYXVsdCwgaXQgd2lsbCBpbnN0ZWFkXG4iCisgICAgIiAgdHJ5IHRvIG1ha2UgYSBub3JtYWwgY2xpZW50IGNvbm5lY3Rpb24gdG8gdGhlIHNvY2tldCwgYW5kLCBpbiBjYXNlIG9mXG4iCisgICAgIiAgZmFpbHVyZSwgd2lsbCByZXBlYXQgdGhpcyBvcGVyYXRpb24gZXZlcnkgc2Vjb25kIGZvciAxMCBzZWNvbmRzLlxuIgorICAgICIgIHRoZSAnbWF4PTxzZWNvbmRzPicgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgdGltZW91dFxuXG4iCisKKyAgICAiICBpZiB0aGUgJ2lwdjYnIG9wdGlvbiBpcyB1c2VkLCB0aGUgaW50ZXJmYWNlIHVzZWQgd2lsbCBiZSA6OjEsIG90aGVyd2lzZVxuIgorICAgICIgIGl0IHdpbGwgYmUgMTI3LjAuMC4xXG5cbiIKKworICAgICIgIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIHRoZSBlbXVsYXRvciBzZW5kcyBpdHMgY29uc29sZSBwb3J0XG4iCisgICAgIiAgbnVtYmVyIGFzIHRleHQgdG8gdGhlIHJlbW90ZSB0aGlyZC1wYXJ0eSwgdGhlbiBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gYW5kXG4iCisgICAgIiAgc3RhcnRzIHRoZSBlbXVsYXRpb24gYXMgdXN1YWwuICphbnkqIGZhaWx1cmUgaW4gdGhlIHByb2Nlc3MgZGVzY3JpYmVkIGhlcmVcbiIKKyAgICAiICB3aWxsIHJlc3VsdCBpbiB0aGUgZW11bGF0b3IgYWJvcnRpbmcgaW1tZWRpYXRlbHlcblxuIgorCisgICAgIiAgYXMgYW4gZXhhbXBsZSwgaGVyZSdzIGEgc21hbGwgVW5peCBzaGVsbCBzY3JpcHQgdGhhdCBzdGFydHMgdGhlIGVtdWxhdG9yIGluXG4iCisgICAgIiAgdGhlIGJhY2tncm91bmQgYW5kIHdhaXRzIGZvciBpdHMgcG9ydCBudW1iZXIgd2l0aCB0aGUgaGVscCBvZiB0aGUgJ25ldGNhdCdcbiIKKyAgICAiICB1dGlsaXR5OlxuXG4iCisKKyAgICAiICAgICAgTVlQT1JUPTUwMDBcbiIKKyAgICAiICAgICAgZW11bGF0b3IgLW5vLXdpbmRvdyAtcmVwb3J0LWNvbnNvbGUgdGNwOiRNWVBPUlQgJlxuIgorICAgICIgICAgICBDT05TT0xFUE9SVD1gbmMgLWwgbG9jYWxob3N0ICRNWVBPUlRgXG4iCisgICAgIlxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX2RwaV9kZXZpY2Uoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctZHBpLWRldmljZSA8ZHBpPicgb3B0aW9uIGlzIG9ic29sZXRlIGFzIG9mIEVtdWxhdG9yIDIuMCBhbmQgd2lsbCBiZSBpZ25vcmVkXG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfYXVkaW8oc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctYXVkaW8gPGJhY2tlbmQ+JyBvcHRpb24gYWxsb3dzIHlvdSB0byBzZWxlY3QgYSBzcGVjaWZpYyBiYWNrZW5kXG4iCisgICAgIiAgdG8gYmUgdXNlZCB0byBib3RoIHBsYXkgYW5kIHJlY29yZCBhdWRpbyBpbiB0aGUgQW5kcm9pZCBlbXVsYXRvci5cblxuIgorCisgICAgIiAgdXNlICctYXVkaW8gbm9uZScgdG8gZGlzYWJsZSBhdWRpbyBjb21wbGV0ZWx5LlxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfc2NhbGUoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctc2NhbGUgPHNjYWxlPicgb3B0aW9uIGlzIG9ic29sZXRlIGFzIG9mIEVtdWxhdG9yIDIuMCBhbmQgd2lsbCBiZSBpZ25vcmVkXG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfY29kZV9wcm9maWxlKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLWNvZGVfcHJvZmlsZSA8bmFtZT4nIHRvIHN0YXJ0IHRoZSBlbXVsYXRvciB3aXRoIHJ1bnRpbWUgY29kZSBwcm9maWxpbmcgc3VwcG9ydC5cblxuIgorICAgICIgIFByb2ZpbGVzIGFyZSBzdG9yZWQgaW4gZGlyZWN0b3J5IDxuYW1lPiwgZWFjaCBleGVjdXRhYmxlIHdpbGwgaGF2ZSBpdHMgb3duIHByb2ZpbGUuXG4iCisgICAgIiAgVGhlIHByb2ZpbGUgY2FuIGJlIGZ1cnRoZXIgcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGFuIEF1dG9GRE8gcHJvZmlsZSwgd2hpY2ggY2FuIGJlIFxuIgorICAgICIgIHVzZWQgdG8gZHJpdmUgZmVlZGJhY2sgZGlyZWN0ZWQgb3B0aW1pemF0aW9ucy5cbiIKKyAgICAiICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGZyb20gaHR0cHM6Ly9nY2MuZ251Lm9yZy93aWtpL0F1dG9GRE8uXG5cbiIKKyAgICAiICBJTVBPUlRBTlQ6IFRoaXMgZmVhdHVyZSBpcyAqZXhwZXJpbWVudGFsKiBhbmQgcmVxdWlyZXMgYSBwYXRjaGVkIGtlcm5lbC5cbiIKKyAgICAiICBhcyBzdWNoLCBpdCB3aWxsIG5vdCB3b3JrIG9uIHJlZ3VsYXIgU0RLIHN5c3RlbSBpbWFnZXMuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9zaG93X2tlcm5lbChzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1zaG93LWtlcm5lbCcgdG8gcmVkaXJlY3QgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUga2VybmVsIHRvIHRoZSBjdXJyZW50XG4iCisgICAgIiAgdGVybWluYWwuIHRoaXMgaXMgdXNlZnVsIHRvIGNoZWNrIHRoYXQgdGhlIGJvb3QgcHJvY2VzcyB3b3JrcyBjb3JyZWN0bHkuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9zaGVsbChzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1zaGVsbCcgdG8gY3JlYXRlIGEgcm9vdCBzaGVsbCBjb25zb2xlIG9uIHRoZSBjdXJyZW50IHRlcm1pbmFsLlxuIgorICAgICIgIHRoaXMgaXMgdW5saWtlIHRoZSAnYWRiIHNoZWxsJyBjb21tYW5kIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XG5cbiIKKworICAgICIgICogdGhpcyBpcyBhICpyb290KiBzaGVsbCB0aGF0IGFsbG93cyB5b3UgdG8gbW9kaWZ5IG1hbnkgcGFydHMgb2YgdGhlIHN5c3RlbVxuIgorICAgICIgICogdGhpcyB3b3JrcyBldmVuIGlmIHRoZSBBREIgZGFlbW9uIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0gaXMgYnJva2VuXG4iCisgICAgIiAgKiBwcmVzc2luZyBDdHJsLUMgd2lsbCBzdG9wIHRoZSBlbXVsYXRvciwgaW5zdGVhZCBvZiB0aGUgc2hlbGwuXG5cbiIKKyAgICAiICBTZWUgYWxzbyAnLXNoZWxsLXNlcmlhbCcuXG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfc2hlbGxfc2VyaWFsKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXNoZWxsLXNlcmlhbCA8ZGV2aWNlPicgaW5zdGVhZCBvZiAnLXNoZWxsJyB0byBvcGVuIGEgcm9vdCBzaGVsbFxuIgorICAgICIgIHRvIHRoZSBlbXVsYXRlZCBzeXN0ZW0sIHdoaWxlIHNwZWNpZnlpbmcgYW4gZXh0ZXJuYWwgY29tbXVuaWNhdGlvblxuIgorICAgICIgIGNoYW5uZWwgLyBob3N0IGRldmljZS5cblxuIgorCisgICAgIiAgJy1zaGVsbC1zZXJpYWwgc3RkaW8nIGlzIGlkZW50aWNhbCB0byAnLXNoZWxsJywgd2hpbGUgeW91IGNhbiB1c2VcbiIKKyAgICAiICAnLXNoZWxsLXNlcmlhbCB0Y3A6OjQ0NDQsc2VydmVyLG5vd2FpdCcgdG8gdGFsayB0byB0aGUgc2hlbGwgb3ZlciBsb2NhbFxuIgorICAgICIgIFRDUCBwb3J0IDQ0NDQuICAnLXNoZWxsLXNlcmlhbCBmZHBhaXI6Mzo2JyB3b3VsZCBsZXQgYSBwYXJlbnQgcHJvY2Vzc1xuIgorICAgICIgIHRhbGsgdG8gdGhlIHNoZWxsIHVzaW5nIGZkcyAzIGFuZCA2LlxuXG4iCisKKyAgICAiICBzZWUgLWhlbHAtY2hhci1kZXZpY2VzIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlIDxkZXZpY2U+IHNwZWNpZmljYXRpb25zLlxuXG4iCisgICAgIiAgTk9URTogeW91IGNhbiBoYXZlIG9ubHkgb25lIHNoZWxsIHBlciBlbXVsYXRvciBpbnN0YW5jZSBhdCB0aGUgbW9tZW50XG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9sb2djYXQoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctbG9nY2F0IDx0YWdzPicgdG8gcmVkaXJlY3QgbG9nIG1lc3NhZ2VzIGZyb20gdGhlIGVtdWxhdGVkIHN5c3RlbSB0b1xuIgorICAgICIgIHRoZSBjdXJyZW50IHRlcm1pbmFsLiA8dGFncz4gaXMgYSBsaXN0IG9mIHNwYWNlL2NvbW1hLXNlcGFyYXRlZCBsb2cgZmlsdGVyc1xuIgorICAgICIgIHdoZXJlIGVhY2ggZmlsdGVyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcblxuIgorCisgICAgIiAgICAgPGNvbXBvbmVudE5hbWU+Ojxsb2dMZXZlbD5cblxuIgorCisgICAgIiAgd2hlcmUgPGNvbXBvbmVudE5hbWU+IGlzIGVpdGhlciAnKicgb3IgdGhlIG5hbWUgb2YgYSBnaXZlbiBjb21wb25lbnQsXG4iCisgICAgIiAgYW5kIDxsb2dMZXZlbD4gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGV0dGVyczpcblxuIgorCisgICAgIiAgICAgIHYgICAgICAgICAgdmVyYm9zZSBsZXZlbFxuIgorICAgICIgICAgICBkICAgICAgICAgIGRlYnVnIGxldmVsXG4iCisgICAgIiAgICAgIGkgICAgICAgICAgaW5mb3JtYXRpdmUgbG9nIGxldmVsXG4iCisgICAgIiAgICAgIHcgICAgICAgICAgd2FybmluZyBsb2cgbGV2ZWxcbiIKKyAgICAiICAgICAgZSAgICAgICAgICBlcnJvciBsb2cgbGV2ZWxcbiIKKyAgICAiICAgICAgcyAgICAgICAgICBzaWxlbnQgbG9nIGxldmVsXG5cbiIKKworICAgICIgIGZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIG9ubHkgZGlzcGxheXMgbWVzc2FnZXMgZnJvbSB0aGUgJ0dTTScgY29tcG9uZW50XG4iCisgICAgIiAgdGhhdCBhcmUgYXQgbGVhc3QgYXQgdGhlIGluZm9ybWF0aXZlIGxldmVsOlxuXG4iCisKKyAgICAiICAgIC1sb2djYXQgJyo6cyBHU006aSdcblxuIgorCisgICAgIiAgaWYgJy1sb2djYXQgPHRhZ3M+JyBpcyBub3QgdXNlZCwgdGhlIGVtdWxhdG9yIGxvb2tzIGZvciBBTkRST0lEX0xPR19UQUdTXG4iCisgICAgIiAgaW4gdGhlIGVudmlyb25tZW50LiBpZiBpdCBpcyBkZWZpbmVkLCBpdHMgdmFsdWUgbXVzdCBtYXRjaCB0aGUgPHRhZ3M+XG4iCisgICAgIiAgZm9ybWF0IGFuZCB3aWxsIGJlIHVzZWQgdG8gcmVkaXJlY3QgbG9nIG1lc3NhZ2VzIHRvIHRoZSB0ZXJtaW5hbC5cblxuIgorCisgICAgIiAgbm90ZSB0aGF0IHRoaXMgZG9lc24ndCBwcmV2ZW50IHlvdSBmcm9tIHJlZGlyZWN0aW5nIHRoZSBzYW1lLCBvciBvdGhlcixcbiIKKyAgICAiICBsb2cgbWVzc2FnZXMgdGhyb3VnaCB0aGUgQURCIHRvby5cblxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX25vX2F1ZGlvKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLW5vLWF1ZGlvJyB0byBkaXNhYmxlIGFsbCBhdWRpbyBzdXBwb3J0IGluIHRoZSBlbXVsYXRvci4gdGhpcyBtYXkgYmVcbiIKKyAgICAiICB1bmZvcnR1bmF0ZWx5IGJlIG5lY2Vzc2FyeSBpbiBzb21lIGNhc2VzOlxuXG4iCisKKyAgICAiICAqIGF0IGxlYXN0IHR3byB1c2VycyBoYXZlIHJlcG9ydGVkIHRoYXQgdGhlaXIgV2luZG93cyBtYWNoaW5lIHJlYm9vdGVkXG4iCisgICAgIiAgICBpbnN0YW50bHkgdW5sZXNzIHRoZXkgdXNlZCB0aGlzIG9wdGlvbiB3aGVuIHN0YXJ0aW5nIHRoZSBlbXVsYXRvci5cbiIKKyAgICAiICAgIGl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhlIHByb2JsZW0gY29tZXMgZnJvbSBidWdneSBhdWRpbyBkcml2ZXJzLlxuXG4iCisKKyAgICAiICAqIG9uIHNvbWUgTGludXggbWFjaGluZXMsIHRoZSBlbXVsYXRvciBtaWdodCBnZXQgc3R1Y2sgYXQgc3RhcnR1cCB3aXRoXG4iCisgICAgIiAgICBhdWRpbyBzdXBwb3J0IGVuYWJsZWQuIHRoaXMgcHJvYmxlbSBpcyBoYXJkIHRvIHJlcHJvZHVjZSwgYnV0IHNlZW1zIHRvXG4iCisgICAgIiAgICBiZSByZWxhdGVkIHRvbyB0byBmbGFreSBBTFNBIC8gYXVkaW8gZHJpdmVyIHN1cHBvcnQuXG5cbiIKKworICAgICIgIG9uIExpbnV4LCBhbm90aGVyIG9wdGlvbiBpcyB0byB0cnkgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1ZGlvIGJhY2tlbmRcbiIKKyAgICAiICB1c2VkIGJ5IHRoZSBlbXVsYXRvci4geW91IGNhbiBkbyB0aGF0IGJ5IHNldHRpbmcgdGhlIFFFTVVfQVVESU9fRFJWXG4iCisgICAgIiAgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczpcblxuIgorCisgICAgIiAgICBhbHNhICAgICAgICAodXNlIHRoZSBBTFNBIGJhY2tlbmQpXG4iCisgICAgIiAgICBlc2QgICAgICAgICAodXNlIHRoZSBFc291bkQgYmFja2VuZClcbiIKKyAgICAiICAgIHNkbCAgICAgICAgICh1c2UgdGhlIFNETCBhdWRpbyBiYWNrZW5kLCBubyBhdWRpbyBpbnB1dCBzdXBwb3J0ZWQpXG4iCisgICAgIiAgICBvc3MgICAgICAgICAodXNlIHRoZSBPU1MgYmFja2VuZClcbiIKKyAgICAiICAgIG5vbmUgICAgICAgIChkbyBub3Qgc3VwcG9ydCBhdWRpbylcbiIKKyAgICAiXG4iCisgICAgIiAgdGhlIHZlcnkgYnJhdmUgY2FuIGFsc28gdHJ5IHRvIHVzZSBkaXN0aW5jdCBiYWNrZW5kcyBmb3IgYXVkaW8gaW5wdXRcbiIKKyAgICAiICBhbmQgYXVkaW8gb3V0cHV0cywgdGhpcyBpcyBwb3NzaWJsZSBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBhYm92ZSB2YWx1ZXNcbiIKKyAgICAiICBpbnRvIHRoZSBRRU1VX0FVRElPX09VVF9EUlYgYW5kIFFFTVVfQVVESU9fSU5fRFJWIGVudmlyb25tZW50IHZhcmlhYmxlcy5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3JhZGlvKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXJhZGlvIDxkZXZpY2U+JyB0byByZWRpcmVjdCB0aGUgR1NNIG1vZGVtIGVtdWxhdGlvbiB0byBhbiBleHRlcm5hbFxuIgorICAgICIgIGNoYXJhY3RlciBkZXZpY2Ugb3IgcHJvZ3JhbS4gdGhpcyBieXBhc3NlcyB0aGUgZW11bGF0b3IncyBpbnRlcm5hbCBtb2RlbVxuIgorICAgICIgIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nLlxuXG4iCisKKyAgICAiICBzZWUgJy1oZWxwLWNoYXItZGV2aWNlcycgZm9yIHRoZSBmb3JtYXQgb2YgPGRldmljZT5cblxuIgorCisgICAgIiAgdGhlIGRhdGEgZXhjaGFuZ2VkIHdpdGggdGhlIGV4dGVybmFsIGRldmljZS9wcm9ncmFtIGFyZSBHU00gQVQgY29tbWFuZHNcblxuIgorCisgICAgIiAgbm90ZSB0aGF0LCB3aGVuIHJ1bm5pbmcgaW4gdGhlIGVtdWxhdG9yLCB0aGUgQW5kcm9pZCBHU00gc3RhY2sgb25seSBzdXBwb3J0c1xuIgorICAgICIgIGEgKnZlcnkqIGJhc2ljIHN1YnNldCBvZiB0aGUgR1NNIHByb3RvY29sLiB0cnlpbmcgdG8gbGluayB0aGUgZW11bGF0b3IgdG9cbiIKKyAgICAiICBhIHJlYWwgR1NNIG1vZGVtIGlzIHZlcnkgbGlrZWx5IHRvIG5vdCB3b3JrIHByb3Blcmx5LlxuXG4iCisgICAgKTsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF9wb3J0KHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIGF0IHN0YXJ0dXAsIHRoZSBlbXVsYXRvciB0cmllcyB0byBiaW5kIGl0cyBjb250cm9sIGNvbnNvbGUgYXQgYSBmcmVlIHBvcnRcbiIKKyAgICAiICBzdGFydGluZyBmcm9tIDU1NTQsIGluIGluY3JlbWVudHMgb2YgdHdvIChpLmUuIDU1NTQsIHRoZW4gNTU1NiwgNTU1OCwgZXRjLi4pXG4iCisgICAgIiAgdGhpcyBhbGxvd3Mgc2V2ZXJhbCBlbXVsYXRvciBpbnN0YW5jZXMgdG8gcnVuIGNvbmN1cnJlbnRseSBvbiB0aGUgc2FtZVxuIgorICAgICIgIG1hY2hpbmUsIGVhY2ggb25lIHVzaW5nIGEgZGlmZmVyZW50IGNvbnNvbGUgcG9ydCBudW1iZXIuXG5cbiIKKworICAgICIgIHVzZSAnLXBvcnQgPHBvcnQ+JyB0byBmb3JjZSBhbiBlbXVsYXRvciBpbnN0YW5jZSB0byB1c2UgYSBnaXZlbiBjb25zb2xlIHBvcnRcblxuIgorCisgICAgIiAgbm90ZSB0aGF0IDxwb3J0PiBtdXN0IGJlIGFuICpldmVuKiBpbnRlZ2VyIGJldHdlZW4gNTU1NCBhbmQgNTU4NCBpbmNsdWRlZC5cbiIKKyAgICAiICA8cG9ydD4rMSBtdXN0IGFsc28gYmUgZnJlZSBhbmQgd2lsbCBiZSByZXNlcnZlZCBmb3IgQURCLiBpZiBhbnkgb2YgdGhlc2VcbiIKKyAgICAiICBwb3J0cyBpcyBhbHJlYWR5IHVzZWQsIHRoZSBlbXVsYXRvciB3aWxsIGZhaWwgdG8gc3RhcnQuXG5cbiIgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfcG9ydHMoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhlICctcG9ydHMgPGNvbnNvbGVwb3J0Piw8YWRicG9ydD4nIG9wdGlvbiBhbGxvd3MgeW91IHRvIGV4cGxpY2l0ZWx5IHNldFxuIgorICAgICIgIHRoZSBUQ1AgcG9ydHMgdXNlZCBieSB0aGUgZW11bGF0b3IgdG8gaW1wbGVtZW50IGl0cyBjb250cm9sIGNvbnNvbGUgYW5kXG4iCisgICAgIiAgY29tbXVuaWNhdGUgd2l0aCB0aGUgQURCIHRvb2wuXG5cbiIKKworICAgICIgIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgb3B0aW9uIHRoYXQgc2hvdWxkIHByb2JhYmx5ICpub3QqIGJlIHVzZWQgYnkgdHlwaWNhbFxuIgorICAgICIgIGRldmVsb3BlcnMgdXNpbmcgdGhlIEFuZHJvaWQgU0RLICh1c2UgJy1wb3J0IDxwb3J0PicgaW5zdGVhZCksIGJlY2F1c2UgdGhlXG4iCisgICAgIiAgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBpcyBwcm9iYWJseSBub3QgZ29pbmcgdG8gYmUgc2VlbiBmcm9tIGFkYi4gSXRzXG4iCisgICAgIiAgcHVycG9zZSBpcyB0byB1c2UgdGhlIGVtdWxhdG9yIGluIHZlcnkgc3BlY2lmaWMgbmV0d29yayBjb25maWd1cmF0aW9ucy5cblxuIgorCisgICAgIiAgICA8Y29uc29sZXBvcnQ+IGlzIHRoZSBUQ1AgcG9ydCB1c2VkIHRvIGJpbmQgdGhlIGNvbnRyb2wgY29uc29sZVxuIgorICAgICIgICAgPGFkYnBvcnQ+IGlzIHRoZSBUQ1AgcG9ydCB1c2VkIHRvIGJpbmQgdGhlIEFEQiBsb2NhbCB0cmFuc3BvcnQvdHVubmVsLlxuXG4iCisKKyAgICAiICBJZiBib3RoIHBvcnRzIGFyZW4ndCBhdmFpbGFibGUgb24gc3RhcnR1cCwgdGhlIGVtdWxhdG9yIHdpbGwgZXhpdC5cblxuIik7Cit9CisKKworc3RhdGljIHZvaWQKK2hlbHBfb25pb24oc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctb25pb24gPGZpbGU+JyB0byBzcGVjaWZ5IGEgUE5HIGltYWdlIGZpbGUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBvblxuIgorICAgICIgIHRvcCBvZiB0aGUgZW11bGF0ZWQgZnJhbWVidWZmZXIgd2l0aCB0cmFuc2x1Y2VuY3kuIHRoaXMgY2FuIGJlIHVzZWZ1bCB0b1xuIgorICAgICIgIGNoZWNrIHRoYXQgVUkgZWxlbWVudHMgYXJlIGNvcnJlY3RseSBwb3NpdGlvbmVkIHdpdGggcmVnYXJkcyB0byBhIHJlZmVyZW5jZVxuIgorICAgICIgIGdyYXBoaWNzIHNwZWNpZmljYXRpb24uXG5cbiIKKworICAgICIgIHRoZSBkZWZhdWx0IHRyYW5zbHVjZW5jeSBpcyA1MCUlLCBidXQgeW91IGNhbiB1c2UgJy1vbmlvbi1hbHBoYSA8JSVhZ2U+JyB0b1xuIgorICAgICIgIHNlbGVjdCBhIGRpZmZlcmVudCBvbmUsIG9yIGV2ZW4gdXNlIGtleXByZXNzZXMgYXQgcnVudGltZSB0byBhbHRlciBpdFxuIgorICAgICIgIChzZWUgLWhlbHAta2V5cyBmb3IgZGV0YWlscylcblxuIgorCisgICAgIiAgZmluYWxseSwgdGhlIG9uaW9uIGltYWdlIGNhbiBiZSByb3RhdGVkIChzZWUgLWhlbHAtb25pb24tcm90YXRlKVxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfb25pb25fYWxwaGEoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctb25pb24tYWxwaGEgPHBlcmNlbnQ+JyB0byBjaGFuZ2UgdGhlIHRyYW5zbHVjZW5jeSBsZXZlbCBvZiB0aGUgb25pb25cbiIKKyAgICAiICBpbWFnZSB0aGF0IGlzIGdvaW5nIHRvIGJlIGRpc3BsYXllZCBvbiB0b3Agb2YgdGhlIGZyYW1lYnVmZmVyIChzZWUgYWxzb1xuIgorICAgICIgIC1oZWxwLW9uaW9uKS4gdGhlIGRlZmF1bHQgaXMgNTAlJS5cblxuIgorCisgICAgIiAgPHBlcmNlbnQ+IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMC5cblxuIgorCisgICAgIiAgeW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgdHJhbnNsdWNlbmN5IGR5bmFtaWNhbGx5IChzZWUgLWhlbHAta2V5cylcblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX29uaW9uX3JvdGF0aW9uKHN0cmFsbG9jX3QqICBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLW9uaW9uLXJvdGF0aW9uIDxyb3RhdGlvbj4nIHRvIGNoYW5nZSB0aGUgcm90YXRpb24gb2YgdGhlIG9uaW9uXG4iCisgICAgIiAgaW1hZ2UgbG9hZGVkIHRocm91Z2ggJy1vbmlvbiA8ZmlsZT4nLiB2YWxpZCB2YWx1ZXMgZm9yIDxyb3RhdGlvbj4gYXJlOlxuXG4iCisKKyAgICAiICAgMCAgICAgICAgbm8gcm90YXRpb25cbiIKKyAgICAiICAgMSAgICAgICAgOTAgIGRlZ3JlZXMgY2xvY2t3aXNlXG4iCisgICAgIiAgIDIgICAgICAgIDE4MCBkZWdyZWVzXG4iCisgICAgIiAgIDMgICAgICAgIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZVxuXG4iCisgICAgKTsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF90aW1lem9uZShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBieSBkZWZhdWx0LCB0aGUgZW11bGF0b3IgdHJpZXMgdG8gZGV0ZWN0IHlvdXIgY3VycmVudCB0aW1lem9uZSB0byByZXBvcnRcbiIKKyAgICAiICBpdCB0byB0aGUgZW11bGF0ZWQgc3lzdGVtLiB1c2UgdGhlICctdGltZXpvbmUgPHRpbWV6b25lPicgb3B0aW9uIHRvIGNob29zZVxuIgorICAgICIgIGEgZGlmZmVyZW50IHRpbWV6b25lLCBvciBpZiB0aGUgYXV0b21hdGljIGRldGVjdGlvbiBkb2Vzbid0IHdvcmsgY29ycmVjdGx5LlxuXG4iCisKKyAgICAiICBWRVJZIElNUE9SVEFOVCBOT1RFOlxuXG4iCisgICAgIiAgdGhlIDx0aW1lem9uZT4gdmFsdWUgbXVzdCBiZSBpbiB6b25laW5mbyBmb3JtYXQsIGkuZS4gaXQgc2hvdWxkIGxvb2sgbGlrZVxuIgorICAgICIgIEFyZWEvTG9jYXRpb24gb3IgZXZlbiBBcmVhL1N1YkFyZWEvTG9jYXRpb24uIHZhbGlkIGV4YW1wbGVzIGFyZTpcblxuIgorCisgICAgIiAgICBBbWVyaWNhL0xvc19BbmdlbGVzXG4iCisgICAgIiAgICBFdXJvcGUvUGFyaXNcblxuIgorCisgICAgIiAgdXNpbmcgYSBodW1hbi1mcmllbmRseSBhYmJyZXZpYXRpb24gbGlrZSAnUFNUJyBvciAnQ0VUJyB3aWxsIG5vdCB3b3JrLCBhc1xuIgorICAgICIgIHdlbGwgYXMgdXNpbmcgdmFsdWVzIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoZSB6b25laW5mbyBkYXRhYmFzZS5cblxuIgorCisgICAgIiAgTk9URTogdW5mb3J0dW5hdGVseSwgdGhpcyB3aWxsIG5vdCB3b3JrIG9uIE01IGFuZCBvbGRlciBTREsgcmVsZWFzZXNcblxuIgorICAgICk7Cit9CisKKworc3RhdGljIHZvaWQKK2hlbHBfZG5zX3NlcnZlcihzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBieSBkZWZhdWx0LCB0aGUgZW11bGF0b3IgdHJpZXMgdG8gZGV0ZWN0IHRoZSBETlMgc2VydmVycyB5b3UncmUgdXNpbmcgYW5kXG4iCisgICAgIiAgd2lsbCBzZXR1cCBzcGVjaWFsIGFsaWFzZXMgaW4gdGhlIGVtdWxhdGVkIGZpcmV3YWxsIG5ldHdvcmsgdG8gYWxsb3cgdGhlXG4iCisgICAgIiAgQW5kcm9pZCBzeXN0ZW0gdG8gY29ubmVjdCBkaXJlY3RseSB0byB0aGVtLiB1c2UgJy1kbnMtc2VydmVyIDxzZXJ2ZXJzPicgdG9cbiIKKyAgICAiICBzZWxlY3QgYSBkaWZmZXJlbnQgbGlzdCBvZiBETlMgc2VydmVycyB0byBiZSB1c2VkLlxuXG4iCisKKyAgICAiICA8c2VydmVycz4gbXVzdCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVwIHRvIDQgRE5TIHNlcnZlciBuYW1lcyBvclxuIgorICAgICIgIElQIGFkZHJlc3Nlcy5cblxuIgorCisgICAgIiAgTk9URTogb24gTTUgYW5kIG9sZGVyIFNESyByZWxlYXNlcywgb25seSB0aGUgZmlyc3Qgc2VydmVyIGluIHRoZSBsaXN0IHdpbGxcbiIKKyAgICAiICAgICAgICBiZSB1c2VkLlxuXG4iCisgICAgKTsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF9jcHVfZGVsYXkoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdGhpcyBvcHRpb24gaXMgcHVyZWx5IGV4cGVyaW1lbnRhbCwgcHJvYmFibHkgZG9lc24ndCB3b3JrIGFzIHlvdSB3b3VsZFxuIgorICAgICIgIGV4cGVjdCwgYW5kIG1heSBldmVuIGRpc2FwcGVhciBpbiBhIGxhdGVyIGVtdWxhdG9yIHJlbGVhc2UuXG5cbiIKKworICAgICIgIHVzZSAnLWNwdS1kZWxheSA8ZGVsYXk+JyB0byB0aHJvdHRsZSBDUFUgZW11bGF0aW9uLiB0aGlzIG1heSBiZSB1c2VmdWxcbiIKKyAgICAiICB0byBkZXRlY3Qgd2VpcmQgcmFjZSBjb25kaXRpb25zIHRoYXQgb25seSBoYXBwZW4gb24gJ2xvd2VyJyBDUFVzLiBub3RlXG4iCisgICAgIiAgdGhhdCA8ZGVsYXk+IGlzIGEgdW5pdC1sZXNzIGludGVnZXIgdGhhdCBkb2Vzbid0IGV2ZW4gc2NhbGUgbGluZWFybHlcbiIKKyAgICAiICB0byBvYnNlcnZhYmxlIHNsb3dkb3ducy4gdXNlIHRyaWFsIGFuZCBlcnJvciB0byBmaW5kIHNvbWV0aGluZyB0aGF0XG4iCisgICAgIiAgc3VpdHMgeW91LCB0aGUgJ2NvcnJlY3QnIG1hY2hpbmUgaXMgdmVyeSBwcm9iYWJseSBkZXBlbmRlbnQgb24geW91clxuIgorICAgICIgIGhvc3QgQ1BVIGFuZCBtZW1vcnkgYW55d2F5Li4uXG5cbiIKKyAgICApOworfQorCisKK3N0YXRpYyB2b2lkCitoZWxwX25vX2Jvb3RfYW5pbShzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1uby1ib290LWFuaW0nIHRvIGRpc2FibGUgdGhlIGJvb3QgYW5pbWF0aW9uIChyZWQgYm91bmNpbmcgYmFsbCkgd2hlblxuIgorICAgICIgIHN0YXJ0aW5nIHRoZSBlbXVsYXRvci4gb24gc2xvdyBtYWNoaW5lcywgdGhpcyBjYW4gc3VycHJpc2luZ2x5IHNwZWVkIHVwIHRoZVxuIgorICAgICIgIGJvb3Qgc2VxdWVuY2UgaW4gdHJlbWVuZG91cyB3YXlzLlxuXG4iCisKKyAgICAiICBOT1RFOiB1bmZvcnR1bmF0ZWx5LCB0aGlzIHdpbGwgbm90IHdvcmsgb24gTTUgYW5kIG9sZGVyIFNESyByZWxlYXNlc1xuXG4iCisgICAgKTsKK30KKworCitzdGF0aWMgdm9pZAoraGVscF9ncHMoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctZ3BzIDxkZXZpY2U+JyB0byBlbXVsYXRlIGFuIE5NRUEtY29tcGF0aWJsZSBHUFMgdW5pdCBjb25uZWN0ZWQgdG9cbiIKKyAgICAiICBhbiBleHRlcm5hbCBjaGFyYWN0ZXIgZGV2aWNlIG9yIHNvY2tldC4gdGhlIGZvcm1hdCBvZiA8ZGV2aWNlPiBpcyB0aGUgc2FtZVxuIgorICAgICIgIHRoYW4gdGhlIG9uZSB1c2VkIGZvciAnLXJhZGlvIDxkZXZpY2U+JyAoc2VlIC1oZWxwLWNoYXItZGV2aWNlcyBmb3IgZGV0YWlscylcblxuIgorICAgICk7Cit9CisKKworI2lmZGVmIENPTkZJR19OQU5EX0xJTUlUUworc3RhdGljIHZvaWQKK2hlbHBfbmFuZF9saW1pdHMoc3RyYWxsb2NfdCogIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgdXNlICctbmFuZC1saW1pdHMgPGxpbWl0cz4nIHRvIGVuYWJsZSBhIGRlYnVnZ2luZyBmZWF0dXJlIHRoYXQgc2VuZHMgYVxuIgorICAgICIgIHNpZ25hbCB0byBhbiBleHRlcm5hbCBwcm9jZXNzIG9uY2UgYSByZWFkIGFuZC9vciB3cml0ZSBsaW1pdCBpcyBhY2hpZXZlZFxuIgorICAgICIgIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0uIHRoZSBmb3JtYXQgb2YgPGxpbWl0cz4gaXMgdGhlIGZvbGxvd2luZzpcblxuIgorCisgICAgIiAgICAgcGlkPTxudW1iZXI+LHNpZ25hbD08bnVtYmVyPixbcmVhZHM9PHRocmVzaG9sZD5dWyx3cml0ZXM9PHRocmVzaG9sZD5dXG5cbiIKKworICAgICIgIHdoZXJlICdwaWQnIGlzIHRoZSB0YXJnZXQgcHJvY2VzcyBpZGVudGlmaWVyLCAnc2lnbmFsJyB0aGUgbnVtYmVyIG9mIHRoZVxuIgorICAgICIgIHRhcmdldCBzaWduYWwuIHRoZSByZWFkIGFuZC9vciB3cml0ZSB0aHJlc2hvbGQncmVhZHMnIGFyZSBhIG51bWJlciBvcHRpb25hbGx5XG4iCisgICAgIiAgZm9sbG93ZWQgYnkgYSBLLCBNIG9yIEcgc3VmZml4LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmVcbiIKKyAgICAiICByZWFkIG9yIHdyaXR0ZW4gYmVmb3JlIHRoZSBzaWduYWwgaXMgc2VudC5cblxuIgorICAgICk7Cit9CisjZW5kaWYgLyogQ09ORklHX05BTkRfTElNSVRTICovCisKK3N0YXRpYyB2b2lkCitoZWxwX2Jvb3RjaGFydChzdHJhbGxvY190ICAqb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBzb21lIEFuZHJvaWQgc3lzdGVtIGltYWdlcyBoYXZlIGEgbW9kaWZpZWQgJ2luaXQnIHN5c3RlbSB0aGF0ICBpbnRlZ3JhdGVzXG4iCisgICAgIiAgYSBib290Y2hhcnRpbmcgZmFjaWxpdHkgKHNlZSBodHRwOi8vd3d3LmJvb3RjaGFydC5vcmcvKS4gWW91IGNhbiBwYXNzIGFcbiIKKyAgICAiICBib290Y2hhcnRpbmcgcGVyaW9kIHRvIHRoZSBzeXN0ZW0gd2l0aCB0aGUgZm9sbG93aW5nOlxuXG4iCisKKyAgICAiICAgIC1ib290Y2hhcnQgPHRpbWVvdXQ+XG5cbiIKKworICAgICIgIHdoZXJlICd0aW1lb3V0JyBpcyBhIHBlcmlvZCBleHByZXNzZWQgaW4gc2Vjb25kcy4gTm90ZSB0aGF0IHRoaXMgd29uJ3QgZG9cbiIKKyAgICAiICBhbnl0aGluZyBpZiB5b3VyIGluaXQgZG9lc24ndCBoYXZlIGJvb3RjaGFydGluZyBhY3RpdmF0ZWQuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF90Y3BkdW1wKHN0cmFsbG9jX3QgICpvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSB0aGUgLXRjcGR1bXAgPGZpbGU+IG9wdGlvbiB0byBzdGFydCBjYXB0dXJpbmcgYWxsIG5ldHdvcmsgcGFja2V0c1xuIgorICAgICIgIHRoYXQgYXJlIHNlbnQgdGhyb3VnaCB0aGUgZW11bGF0b3IncyB2aXJ0dWFsIEV0aGVybmV0IExBTi4gWW91IGNhbiBsYXRlclxuIgorICAgICIgIHVzZSB0b29scyBsaWtlIFdpcmVTaGFyayB0byBhbmFseXplIHRoZSB0cmFmZmljIGFuZCB1bmRlcnN0YW5kIHdoYXRcbiIKKyAgICAiICByZWFsbHkgaGFwcGVucy5cblxuIgorCisgICAgIiAgbm90ZSB0aGF0IHRoaXMgY2FwdHVyZXMgYWxsIEV0aGVybmV0IHBhY2tldHMsIGFuZCBpcyBub3QgbGltaXRlZCB0byBUQ1BcbiIKKyAgICAiICBjb25uZWN0aW9ucy5cblxuIgorCisgICAgIiAgeW91IGNhbiBhbHNvIHN0YXJ0L3N0b3AgdGhlIHBhY2tldCBjYXB0dXJlIGR5bmFtaWNhbGx5IHRocm91Z2ggdGhlIGNvbnNvbGU7XG4iCisgICAgIiAgc2VlIHRoZSAnbmV0d29yayBjYXB0dXJlIHN0YXJ0JyBhbmQgJ25ldHdvcmsgY2FwdHVyZSBzdG9wJyBjb21tYW5kcyBmb3JcbiIKKyAgICAiICBkZXRhaWxzLlxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfY2hhcm1hcChzdHJhbGxvY190ICAqb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICB1c2UgJy1jaGFybWFwIDxmaWxlPicgdG8gdXNlIGtleSBjaGFyYWN0ZXIgbWFwIHNwZWNpZmllZCBpbiB0aGF0IGZpbGUuXG4iCisgICAgIiAgPGZpbGU+IG11c3QgYmUgYSBmdWxsIHBhdGggdG8gYSBrY20gZmlsZSwgY29udGFpbmluZyBkZXNpcmVkIGNoYXJhY3RlciBtYXAuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9wcm9wKHN0cmFsbG9jX3QgICpvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIHVzZSAnLXByb3AgPG5hbWU+PTx2YWx1ZT4nIHRvIHNldCBhIGJvb3QtdGltZSBzeXN0ZW0gcHJvcGVydHkuXG4iCisgICAgIiAgPG5hbWU+IG11c3QgYmUgYSBwcm9wZXJ0eSBuYW1lIG9mIGF0IG1vc3QgJWQgY2hhcmFjdGVycywgd2l0aG91dCBhbnlcbiIKKyAgICAiICBzcGFjZSBpbiBpdCwgYW5kIDx2YWx1ZT4gbXVzdCBiZSBhIHN0cmluZyBvZiBhdCBtb3N0ICVkIGNoYXJhY3RlcnMuXG5cbiIsCisgICAgQk9PVF9QUk9QRVJUWV9NQVhfTkFNRSwgQk9PVF9QUk9QRVJUWV9NQVhfVkFMVUUgKTsKKworICAgIFBSSU5URigKKyAgICAiICB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0gcHJvcGVydHkgd2lsbCBiZSBzZXQgYXQgYm9vdCB0aW1lIGluIHRoZVxuIgorICAgICIgIGVtdWxhdGVkIHN5c3RlbS4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG5cbiIKKworICAgICIgIG5vdGUgdGhhdCB5b3UgY2FuIHVzZSBzZXZlcmFsIC1wcm9wIG9wdGlvbnMgdG8gZGVmaW5lIG1vcmUgdGhhbiBvbmVcbiIKKyAgICAiICBib290IHByb3BlcnR5LlxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfc2hhcmVkX25ldF9pZChzdHJhbGxvY190KiAgb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBOb3JtYWxseSwgQW5kcm9pZCBpbnN0YW5jZXMgcnVubmluZyBpbiB0aGUgZW11bGF0b3IgY2Fubm90IHRhbGsgdG8gZWFjaCBvdGhlclxuIgorICAgICIgIGRpcmVjdGx5LCBiZWNhdXNlIGVhY2ggaW5zdGFuY2UgaXMgYmVoaW5kIGEgdmlydHVhbCByb3V0ZXIuIEhvd2V2ZXIsIHNvbWV0aW1lc1xuIgorICAgICIgIGl0IGlzIG5lY2Vzc2FyeSB0byB0ZXN0IHRoZSBiZWhhdmlvdXIgb2YgYXBwbGljYXRpb25zIGlmIHRoZXkgYXJlIGRpcmVjdGx5XG4iCisgICAgIiAgZXhwb3NlZCB0byB0aGUgbmV0d29yay5cblxuIgorCisgICAgIiAgVGhpcyBvcHRpb24gaW5zdHJ1Y3RzIHRoZSBlbXVsYXRvciB0byBqb2luIGEgdmlydHVhbCBuZXR3b3JrIHNoYXJlZCB3aXRoXG4iCisgICAgIiAgZW11bGF0b3JzIGFsc28gdXNpbmcgdGhpcyBvcHRpb24uIFRoZSBudW1iZXIgZ2l2ZW4gaXMgdXNlZCB0byBjb25zdHJ1Y3RcbiIKKyAgICAiICB0aGUgSVAgYWRkcmVzcyAxMC4xLjIuPG51bWJlcj4sIHdoaWNoIGlzIGJvdW5kIHRvIGEgc2Vjb25kIGludGVyZmFjZSBvblxuIgorICAgICIgIHRoZSBlbXVsYXRvci4gRWFjaCBlbXVsYXRvciBtdXN0IHVzZSBhIGRpZmZlcmVudCBudW1iZXIuXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9ncHUoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLWdwdSA8bW9kZT4gdG8gb3ZlcnJpZGUgdGhlIG1vZGUgb2YgaGFyZHdhcmUgT3BlbkdMIEVTIGVtdWxhdGlvblxuIgorICAgICIgIGluZGljYXRlZCBieSB0aGUgQVZELiBWYWxpZCB2YWx1ZXMgZm9yIDxtb2RlPiBhcmU6XG5cbiIKKworICAgICIgICAgIG9uICAgICAgIC0+IGVuYWJsZSBHUFUgZW11bGF0aW9uXG4iCisgICAgIiAgICAgb2ZmICAgICAgLT4gZGlzYWJsZSBHUFUgZW11bGF0aW9uXG4iCisgICAgIiAgICAgYXV0byAgICAgLT4gdXNlIHRoZSBzZXR0aW5nIGZyb20gdGhlIEFWRCAoZGVmYXVsdClcbiIKKyAgICAiICAgICBlbmFibGVkICAtPiBzYW1lIGFzICdvbidcbiIKKyAgICAiICAgICBkaXNhYmxlZCAtPiBzYW1lIGFzICdvZmYnXG4iCisgICAgIiAgICAgZ3Vlc3QgICAgLT4gdXNlIGd1ZXN0LXNpZGUgT3BlbkdMIEVTIGltcGxlbWVudGF0aW9uXG5cbiIKKworICAgICIgIE5vdGUgdGhhdCBlbmFibGluZyBHUFUgZW11bGF0aW9uIGlmIHRoZSBzeXN0ZW0gaW1hZ2UgZG9lcyBub3Qgc3VwcG9ydCBpdFxuIgorICAgICIgIHdpbGwgcHJldmVudCB0aGUgcHJvcGVyIGRpc3BsYXkgb2YgdGhlIGVtdWxhdGVkIGZyYW1lYnVmZmVyLlxuXG4iCisKKyAgICAiICBZb3UgY2FuIGFsd2F5cyBkaXNhYmxlIEdQVSBlbXVsYXRpb24gKGkuZS4gJy1ncHUgb2ZmJyksIGFuZCB0aGlzIHdpbGxcbiIKKyAgICAiICBmb3JjZSB0aGUgdmlydHVhbCBkZXZpY2UgdG8gdXNlIHRoZSBzbG93IHNvZnR3YXJlIHJlbmRlcmVyIGluc3RlYWQuXG4iCisgICAgIiAgTm90ZSB0aGF0IE9wZW5HTEVTIDIuMCBpcyBfbm90XyBzdXBwb3J0ZWQgYnkgaXQuXG5cbiIKKworICAgICIgIFRoZSAnYXV0bycgbW9kZSBpcyB0aGUgZGVmYXVsdC4gSW4gdGhpcyBtb2RlLCB0aGUgaHcuZ3B1LmVuYWJsZWQgc2V0dGluZ1xuIgorICAgICIgIGluIHRoZSBBVkQncyAiIENPUkVfSEFSRFdBUkVfSU5JICIgZmlsZSB3aWxsIGRldGVybWluZSB3aGV0aGVyIEdQVSBlbXVsYXRpb25cbiIKKyAgICAiICBpcyBlbmFibGVkLlxuXG4iCisKKyAgICAiICBFdmVuIGlmIGhhcmR3YXJlIEdQVSBlbXVsYXRpb24gaXMgZW5hYmxlZCwgaWYgdGhlIGhvc3Qtc2lkZSBPcGVuR0wgRVNcbiIKKyAgICAiICBlbXVsYXRpb24gbGlicmFyeSBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQsIHRoZSBlbXVsYXRvciB3aWxsIHJ1biB3aXRoIEdQVVxuIgorICAgICIgIGVtdWxhdGlvbiBkaXNhYmxlZCByYXRoZXIgdGhhbiBmYWlsaW5nIHRvIHN0YXJ0LlxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX2NhbWVyYV9iYWNrKHN0cmFsbG9jX3QqIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgVXNlIC1jYW1lcmEtYmFjayA8bW9kZT4gdG8gY29udHJvbCBlbXVsYXRpb24gb2YgYSBjYW1lcmEgZmFjaW5nIGJhY2suXG4iCisgICAgIiAgVmFsaWQgdmFsdWVzIGZvciA8bW9kZT4gYXJlOlxuXG4iCisKKyAgICAiICAgICBlbXVsYXRlZCAgLT4gY2FtZXJhIHdpbGwgYmUgZW11bGF0ZWQgdXNpbmcgc29mdHdhcmUgKCdmYWtlJykgY2FtZXJhIGVtdWxhdGlvblxuIgorICAgICIgICAgIHdlYmNhbTxOPiAtPiBjYW1lcmEgd2lsbCBiZSBlbXVsYXRlZCB1c2luZyBhIHdlYmNhbWVyYSBjb25uZWN0ZWQgdG8gdGhlIGhvc3RcbiIKKyAgICAiICAgICBub25lICAgICAgLT4gY2FtZXJhIGVtdWxhdGlvbiB3aWxsIGJlIGRpc2FibGVkXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9jYW1lcmFfZnJvbnQoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLWNhbWVyYS1mcm9udCA8bW9kZT4gdG8gY29udHJvbCBlbXVsYXRpb24gb2YgYSBjYW1lcmEgZmFjaW5nIGZyb250LlxuIgorICAgICIgIFZhbGlkIHZhbHVlcyBmb3IgPG1vZGU+IGFyZTpcblxuIgorCisgICAgIiAgICAgZW11bGF0ZWQgIC0+IGNhbWVyYSB3aWxsIGJlIGVtdWxhdGVkIHVzaW5nIHNvZnR3YXJlICgnZmFrZScpIGNhbWVyYSBlbXVsYXRpb25cbiIKKyAgICAiICAgICB3ZWJjYW08Tj4gLT4gY2FtZXJhIHdpbGwgYmUgZW11bGF0ZWQgdXNpbmcgYSB3ZWJjYW1lcmEgY29ubmVjdGVkIHRvIHRoZSBob3N0XG4iCisgICAgIiAgICAgbm9uZSAgICAgIC0+IGNhbWVyYSBlbXVsYXRpb24gd2lsbCBiZSBkaXNhYmxlZFxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfd2ViY2FtX2xpc3Qoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLXdlYmNhbS1saXN0IHRvIGxpc3Qgd2ViIGNhbWVyYXMgYXZhaWxhYmxlIGZvciBlbXVsYXRpb24uXG5cbiIKKyAgICApOworfQorCitzdGF0aWMgdm9pZAoraGVscF9zY3JlZW4oc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLXNjcmVlbiA8bW9kZT4gdG8gc2V0IHRoZSBlbXVsYXRlZCBzY3JlZW4gbW9kZS5cbiIKKyAgICAiICBWYWxpZCB2YWx1ZXMgZm9yIDxtb2RlPiBhcmU6XG5cbiIKKworICAgICIgICAgIHRvdWNoICAgICAgIC0+IGVtdWxhdGUgYSB0b3VjaCBzY3JlZW5cbiIKKyAgICAiICAgICBtdWx0aS10b3VjaCAtPiBlbXVsYXRlIGEgbXVsdGktdG91Y2ggc2NyZWVuXG4iCisgICAgIiAgICAgbm8tdG91Y2ggICAgLT4gZGlzYWJsZSB0b3VjaCBhbmQgbXVsdGktdG91Y2ggc2NyZWVuIGVtdWxhdGlvblxuXG4iCisKKyAgICAiICBEZWZhdWx0IG1vZGUgZm9yIHNjcmVlbiBlbXVsYXRpb24gaXMgJ3RvdWNoJy5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3NlbGludXgoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLXNlbGludXggdG8gY29udHJvbCB0aGUgU0VMaW51eCBlbmZvcmNlbWVudCBtb2RlLlxuIgorICAgICIgIEJ5IGRlZmF1bHQsIFNFTGludXggaXMgaW4gZW5mb3JjaW5nIG1vZGUuIE90aGVyIG1vZGVzIGF2YWlsYWJsZSBhcmU6XG4iCisgICAgIiAgICAgLXNlbGludXggcGVybWlzc2l2ZSAgIC0+IExvYWQgdGhlIFNFTGludXggcG9saWN5LCBidXQgZG8gbm90IGVuZm9yY2UgaXQuXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvbGljeSB2aW9sYXRpb25zIGFyZSBsb2dnZWQsIGJ1dCBub3QgcmVqZWN0ZWQuXG4iCisgICAgIiAgICAgLXNlbGludXggZGlzYWJsZWQgICAgIC0+IERpc2FibGUga2VybmVsIHN1cHBvcnQgZm9yIFNFTGludXguXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfZm9yY2VfMzJiaXQoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLWZvcmNlLTMyYml0IHRvIHVzZSAzMi1iaXQgZW11bGF0b3Igb24gNjQtYml0IHBsYXRmb3Jtc1xuXG4iCisKKyAgICApOworfQorCisjaWZkZWYgX19saW51eF9fCitzdGF0aWMgdm9pZAoraGVscF91c2Vfc3lzdGVtX2xpYnMoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBVc2UgLXVzZS1zeXN0ZW0tbGlicyB0byB1c2UgdGhlIHN5c3RlbSdzIGxpYnN0ZGMrKyBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdFxuIgorICAgICIgIGNvbWVzIGJ1bmRsZWQgd2l0aCB0aGUgZW11bGF0b3IuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgZW11bGF0b3JcbiIKKyAgICAiICBkb2Vzbid0IG5vcm1hbGx5IHN0YXJ0IG9uIHlvdXIgc3lzdGVtIGZvciBzb21lIHJlYXNvbiAoZS5nLiBzb21lIExpbnV4IFJhZGVvblxuIgorICAgICIgIEdMIGRyaXZlciBsaWJyYXJpZXMgcmVxdWlyZSBhIG1vcmUgcmVjZW50IGxpYnN0ZGMrKy5zbykuXG5cbiIKKworICAgICIgIE9uZSBjYW4gYWxzbyBkZWZpbmUgQU5EUk9JRF9FTVVMQVRPUl9VU0VfU1lTVEVNX0xJQlMgdG8gMSBpbiB0aGUgZW52aXJvbm1lbnRcbiIKKyAgICAiICB0byBhcHBseSB0aGlzIG9wdGlvbi5cblxuIgorCisgICAgIiAgTk9URTogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdXNpbmcgdGhpcyBmbGFnIG1ha2VzIHRoZSBlbXVsYXRvciBydW5uYWJsZVxuIgorICAgICIgIGl0J3MgYSB3b3JrLWFyb3VuZCBmb3IgcG90ZW50aWFsIGNvbmZ1c2luZyBzeXN0ZW0gbGlicmFyeSBpc3N1ZXMsIHRoYXQgc2hvdWxkXG4iCisgICAgIiAgb25seSBhZmZlY3QgYSBzbWFsbCBhbW91bnQgb2YgdXNlcnMuXG5cbiIKKworICAgICIgIE5PVEUyOiBGb3Igbm93LCBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2Ugc3lzdGVtIFF0IGxpYnJhcmllcyBmb3IgcmVhc29uc1xuIgorICAgICIgIHRoYXQgYXJlIGN1cnJlbnRseSBkaWZmaWN1bHQgdG8gZGVidWcuIFRoaXMgb3B0aW9uIG1heSBob3dldmVyIGFsbG93IHRvIHVzZVxuIgorICAgICIgIHRoZW0gdG9vIGluIHRoZSBmdXR1cmUuXG5cbiIKKworICAgICIgIEZvciBkZXRhaWxzLCBzZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTE5NzI1NFxuXG4iCisKKyAgICAiXG4iCisgICAgKTsKK30KKyNlbmRpZiAgLy8gX19saW51eF9fCisKK3N0YXRpYyB2b2lkCitoZWxwX3VuaXhfcGlwZShzdHJhbGxvY190KiBvdXQpCit7CisgICAgUFJJTlRGKAorICAgICIgIEd1ZXN0IHN5c3RlbXMgY2FuIGRpcmVjdGx5IGNvbm5lY3QgdG8gaG9zdCBVbml4IGRvbWFpbiBzb2NrZXRzIHVzaW5nXG4iCisgICAgIiAgdGhlICd1bml4OicgUUVNVSBwaXBlIHByb3RvY29sLiBBcyBhIHNlY3VyaXR5IG1lYXN1cmUsIG9ubHkgaG9zdCBwYXRoXG4iCisgICAgIiAgdmFsdWVzIGxpc3RlZCB0aHJvdWdoIHRoZSAnLXVuaXgtcGlwZSA8cGF0aD4nIG9wdGlvbiBjYW4gYmUgdXNlZFxuXG4iCisKKyAgICAiICBPbmUgY2FuIHVzZSB0aGUgb3B0aW9uIHNldmVyYWwgdGltZXMsIGVhY2ggdXNlIGFkZHMgYSBuZXcgcGF0aCB0byB0aGVcbiIKKyAgICAiICB3aGl0ZWxpc3QgdGhhdCB3aWxsIGJlIGNoZWNrZWQgYXQgcnVudGltZVxuXG4iCisgICAgKTsKK30KKworc3RhdGljIHZvaWQKK2hlbHBfZml4ZWRfc2NhbGUoc3RyYWxsb2NfdCogb3V0KQoreworICAgIFBSSU5URigKKyAgICAiICBCeSBkZWZhdWx0LCB3ZSBhdXRvbWF0aWNhbGx5IHNjYWxlIHRoZSBpbml0aWFsIGVtdWxhdG9yIHdpbmRvdyBpZiBpdFxuIgorICAgICIgIGRvZXNuJ3QgZml0IGludG8gdGhlIHNjcmVlbi4gVXNlICctZml4ZWQtc2NhbGUnIHRvIGRpc2FibGUgdGhpcy5cblxuIgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkCitoZWxwX3dhaXRfZm9yX2RlYnVnZ2VyKHN0cmFsbG9jX3QqIG91dCkKK3sKKyAgICBQUklOVEYoCisgICAgIiAgUmVxdWVzdCBlbXVsYXRvciBwcm9jZXNzIHRvIHBhdXNlIGF0IGxhdW5jaCBhbmQgd2FpdCBmb3IgYSBkZWJ1Z2dlci5cbiIKKyAgICAiICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBpdCBoYXZpbmcgYSBjdXN0b20gZW52aXJvbm1lbnQuXG5cbiIKKyAgICApOworfQorCisjZGVmaW5lICBoZWxwX25vX3NraW4gICBOVUxMCisjZGVmaW5lICBoZWxwX25ldHNwZWVkICBoZWxwX3NoYXBlcgorI2RlZmluZSAgaGVscF9uZXRkZWxheSAgaGVscF9zaGFwZXIKKyNkZWZpbmUgIGhlbHBfbmV0ZmFzdCAgIGhlbHBfc2hhcGVyCisKKyNkZWZpbmUgIGhlbHBfbm9hdWRpbyAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbm9za2luICAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbm9jYWNoZSAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbm9fam5pICAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbm9qbmkgICAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfaW5pdGRhdGEgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbm9fd2luZG93ICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfdmVyc2lvbiAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfbWVtb3J5ICAgICAgIE5VTEwKKyNkZWZpbmUgIGhlbHBfcGFydGl0aW9uX3NpemUgTlVMTAorCisjZGVmaW5lIGhlbHBfc2tpcF9hZGJfYXV0aCBOVUxMCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgbmFtZTsKKyAgICBjb25zdCBjaGFyKiAgdGVtcGxhdGU7CisgICAgY29uc3QgY2hhciogIGRlc2NyOworICAgIHZvaWQgKCpmdW5jKShzdHJhbGxvY190Kik7Cit9IE9wdGlvbkhlbHA7CisKK3N0YXRpYyBjb25zdCBPcHRpb25IZWxwICAgIG9wdGlvbl9oZWxwW10gPSB7CisjZGVmaW5lICBPUFRfRkxBRyhfbmFtZSxfZGVzY3IpICAgICAgICAgICAgIHsgU1RSSU5HSUZZKF9uYW1lKSwgTlVMTCwgX2Rlc2NyLCBoZWxwXyMjX25hbWUgfSwKKyNkZWZpbmUgIE9QVF9QQVJBTShfbmFtZSxfdGVtcGxhdGUsX2Rlc2NyKSAgeyBTVFJJTkdJRlkoX25hbWUpLCBfdGVtcGxhdGUsIF9kZXNjciwgaGVscF8jI19uYW1lIH0sCisjZGVmaW5lICBPUFRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9QQVJBTQorI2luY2x1ZGUgImFuZHJvaWQvY21kbGluZS1vcHRpb25zLmgiCisgICAgeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgbmFtZTsKKyAgICBjb25zdCBjaGFyKiAgZGVzYzsKKyAgICB2b2lkICgqZnVuYykoc3RyYWxsb2NfdCopOworfSBUb3BpY0hlbHA7CisKKworc3RhdGljIGNvbnN0IFRvcGljSGVscCAgICB0b3BpY19oZWxwW10gPSB7CisgICAgeyAiZGlzay1pbWFnZXMiLCAgImFib3V0IGRpc2sgaW1hZ2VzIiwgICAgICBoZWxwX2Rpc2tfaW1hZ2VzIH0sCisgICAgeyAiZGVidWctdGFncyIsICAgImRlYnVnIHRhZ3MgZm9yIC1kZWJ1ZyA8dGFncz4iLCBoZWxwX2RlYnVnX3RhZ3MgfSwKKyAgICB7ICJjaGFyLWRldmljZXMiLCAiY2hhcmFjdGVyIDxkZXZpY2U+IHNwZWNpZmljYXRpb24iLCBoZWxwX2NoYXJfZGV2aWNlcyB9LAorICAgIHsgImVudmlyb25tZW50IiwgICJlbnZpcm9ubWVudCB2YXJpYWJsZXMiLCAgaGVscF9lbnZpcm9ubWVudCB9LAorICAgIHsgInZpcnR1YWwtZGV2aWNlIiwgInZpcnR1YWwgZGV2aWNlIG1hbmFnZW1lbnQiLCBoZWxwX3ZpcnR1YWxfZGV2aWNlIH0sCisgICAgeyAic2RrLWltYWdlcyIsICAgImFib3V0IGRpc2sgaW1hZ2VzIHdoZW4gdXNpbmcgdGhlIFNESyIsIGhlbHBfc2RrX2ltYWdlcyB9LAorICAgIHsgImJ1aWxkLWltYWdlcyIsICJhYm91dCBkaXNrIGltYWdlcyB3aGVuIGJ1aWxkaW5nIEFuZHJvaWQiLCBoZWxwX2J1aWxkX2ltYWdlcyB9LAorICAgIHsgTlVMTCwgTlVMTCwgTlVMTCB9Cit9OworCitpbnQKK2FuZHJvaWRfaGVscF9mb3Jfb3B0aW9uKCBjb25zdCBjaGFyKiAgb3B0aW9uLCBzdHJhbGxvY190KiAgb3V0ICkKK3sKKyAgICBPcHRpb25IZWxwIGNvbnN0KiAgb287CisgICAgY2hhciAgICAgICAgICAgICAgIHRlbXBbMzJdOworCisgICAgLyogdGhlIG5hbWVzIGluIHRoZSBvcHRpb25faGVscCB0YWJsZSB1c2UgdW5kZXJzY29yZSBpbnN0ZWFkCisgICAgICogb2YgZGFzaGVzLCBzbyBjcmVhdGUgYSB0cmFubGF0ZWQgY29weSBvZiB0aGUgb3B0aW9uIG5hbWUKKyAgICAgKiBiZWZvcmUgc2Nhbm5pbmcgdGhlIHRhYmxlIGZvciBtYXRjaGVzCisgICAgICovCisgICAgYnVmZmVyX3RyYW5zbGF0ZV9jaGFyKCB0ZW1wLCBzaXplb2YgdGVtcCwgb3B0aW9uLCAnLScsICdfJyApOworCisgICAgZm9yICggb28gPSBvcHRpb25faGVscDsgb28tPm5hbWUgIT0gTlVMTDsgb28rKyApIHsKKyAgICAgICAgaWYgKCAhc3RyY21wKG9vLT5uYW1lLCB0ZW1wKSApIHsKKyAgICAgICAgICAgIGlmIChvby0+ZnVuYykKKyAgICAgICAgICAgICAgICBvby0+ZnVuYyhvdXQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cmFsbG9jX2FkZF9zdHIob3V0LCBvby0+ZGVzY3IpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK2ludAorYW5kcm9pZF9oZWxwX2Zvcl90b3BpYyggY29uc3QgY2hhciogIHRvcGljLCBzdHJhbGxvY190KiAgb3V0ICkKK3sKKyAgICBjb25zdCBUb3BpY0hlbHAqICB0dDsKKworICAgIGZvciAoIHR0ID0gdG9waWNfaGVscDsgdHQtPm5hbWUgIT0gTlVMTDsgdHQrKyApIHsKKyAgICAgICAgaWYgKCAhc3RyY21wKHR0LT5uYW1lLCB0b3BpYykgKSB7CisgICAgICAgICAgICB0dC0+ZnVuYyhvdXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisKK2V4dGVybiB2b2lkCithbmRyb2lkX2hlbHBfbGlzdF9vcHRpb25zKCBzdHJhbGxvY190KiAgb3V0ICkKK3sKKyAgICBjb25zdCBPcHRpb25IZWxwKiAgb287CisgICAgY29uc3QgVG9waWNIZWxwKiAgIHR0OworICAgIGludCAgICAgICAgICAgICAgICBtYXh3aWR0aCA9IDA7CisKKyAgICBmb3IgKCBvbyA9IG9wdGlvbl9oZWxwOyBvby0+bmFtZSAhPSBOVUxMOyBvbysrICkgeworICAgICAgICBpbnQgIHdpZHRoID0gc3RybGVuKG9vLT5uYW1lKTsKKyAgICAgICAgaWYgKG9vLT50ZW1wbGF0ZSAhPSBOVUxMKQorICAgICAgICAgICAgd2lkdGggKz0gc3RybGVuKG9vLT50ZW1wbGF0ZSk7CisgICAgICAgIGlmICh3aWR0aCA+IG1heHdpZHRoKQorICAgICAgICAgICAgbWF4d2lkdGggPSB3aWR0aDsKKyAgICB9CisKKyAgICBmb3IgKG9vID0gb3B0aW9uX2hlbHA7IG9vLT5uYW1lICE9IE5VTEw7IG9vKyspIHsKKyAgICAgICAgY2hhciAgdGVtcFszMl07CisgICAgICAgIC8qIHRoZSBuYW1lcyBpbiB0aGUgb3B0aW9uX2hlbHAgdGFibGUgdXNlIHVuZGVyc2NvcmVzIGluc3RlYWQKKyAgICAgICAgICogb2YgZGFzaGVzLCBzbyBjcmVhdGUgYSB0cmFuc2xhdGVkIGNvcHkgb2YgdGhlIG9wdGlvbidzIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIGJ1ZmZlcl90cmFuc2xhdGVfY2hhcih0ZW1wLCBzaXplb2YgdGVtcCwgb28tPm5hbWUsICdfJywgJy0nKTsKKworICAgICAgICBzdHJhbGxvY19hZGRfZm9ybWF0KCBvdXQsICIgICAgLSVzICUtKnMgJXNcbiIsCisgICAgICAgICAgICB0ZW1wLAorICAgICAgICAgICAgKGludCkobWF4d2lkdGggLSBzdHJsZW4ob28tPm5hbWUpKSwKKyAgICAgICAgICAgIG9vLT50ZW1wbGF0ZSA/IG9vLT50ZW1wbGF0ZSA6ICIiLAorICAgICAgICAgICAgb28tPmRlc2NyICk7CisgICAgfQorCisgICAgUFJJTlRGKCAiXG4iICk7CisgICAgUFJJTlRGKCAiICAgICAlLSpzICAlc1xuIiwgbWF4d2lkdGgsICItcWVtdSBhcmdzLi4uIiwgICAgInBhc3MgYXJndW1lbnRzIHRvIHFlbXUiKTsKKyAgICBQUklOVEYoICIgICAgICUtKnMgICVzXG4iLCBtYXh3aWR0aCwgIi1xZW11IC1oIiwgImRpc3BsYXkgcWVtdSBoZWxwIik7CisgICAgUFJJTlRGKCAiXG4iICk7CisgICAgUFJJTlRGKCAiICAgICAlLSpzICAlc1xuIiwgbWF4d2lkdGgsICItdmVyYm9zZSIsICAgICAgICJzYW1lIGFzICctZGVidWctaW5pdCciKTsKKyAgICBQUklOVEYoICIgICAgICUtKnMgICVzXG4iLCBtYXh3aWR0aCwgIi1kZWJ1ZyA8dGFncz4iLCAgImVuYWJsZS9kaXNhYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisgICAgUFJJTlRGKCAiICAgICAlLSpzICAlc1xuIiwgbWF4d2lkdGgsICItZGVidWctPHRhZz4iLCAgICJlbmFibGUgc3BlY2lmaWMgZGVidWcgbWVzc2FnZXMiKTsKKyAgICBQUklOVEYoICIgICAgICUtKnMgICVzXG4iLCBtYXh3aWR0aCwgIi1kZWJ1Zy1uby08dGFnPiIsImRpc2FibGUgc3BlY2lmaWMgZGVidWcgbWVzc2FnZXMiKTsKKyAgICBQUklOVEYoICJcbiIgKTsKKyAgICBQUklOVEYoICIgICAgICUtKnMgICVzXG4iLCBtYXh3aWR0aCwgIi1oZWxwIiwgICAgInByaW50IHRoaXMgaGVscCIpOworICAgIFBSSU5URiggIiAgICAgJS0qcyAgJXNcbiIsIG1heHdpZHRoLCAiLWhlbHAtPG9wdGlvbj4iLCAicHJpbnQgb3B0aW9uLXNwZWNpZmljIGhlbHAiKTsKKyAgICBQUklOVEYoICJcbiIgKTsKKworICAgIGZvciAodHQgPSB0b3BpY19oZWxwOyB0dC0+bmFtZSAhPSBOVUxMOyB0dCArPSAxKSB7CisgICAgICAgIGNoYXIgICAgaGVscFszMl07CisgICAgICAgIHNucHJpbnRmKGhlbHAsIHNpemVvZihoZWxwKSwgIi1oZWxwLSVzIiwgdHQtPm5hbWUpOworICAgICAgICBQUklOVEYoICIgICAgICUtKnMgICVzXG4iLCBtYXh3aWR0aCwgaGVscCwgdHQtPmRlc2MgKTsKKyAgICB9CisgICAgUFJJTlRGKCAiICAgICAlLSpzICAlc1xuIiwgbWF4d2lkdGgsICItaGVscC1hbGwiLCAicHJpbnRzIGFsbCBoZWxwIGNvbnRlbnQiKTsKKyAgICBQUklOVEYoICJcbiIpOworfQorCisKK3ZvaWQKK2FuZHJvaWRfaGVscF9tYWluKCBzdHJhbGxvY190KiAgb3V0ICkKK3sKKyAgICBzdHJhbGxvY19hZGRfc3RyKG91dCwgIkFuZHJvaWQgRW11bGF0b3IgdXNhZ2U6IGVtdWxhdG9yIFtvcHRpb25zXSBbLXFlbXUgYXJnc11cbiIpOworICAgIHN0cmFsbG9jX2FkZF9zdHIob3V0LCAiICBvcHRpb25zOlxuIiApOworCisgICAgYW5kcm9pZF9oZWxwX2xpc3Rfb3B0aW9ucyhvdXQpOworCisgICAgLypwcmludGYoICIlLipzIiwgb3V0LT5uLCBvdXQtPnMgKTsqLworfQorCisKK3ZvaWQKK2FuZHJvaWRfaGVscF9hbGwoIHN0cmFsbG9jX3QqICBvdXQgKQoreworICAgIGNvbnN0IE9wdGlvbkhlbHAqICBvbzsKKyAgICBjb25zdCBUb3BpY0hlbHAqICAgdHQ7CisKKyAgICBmb3IgKG9vID0gb3B0aW9uX2hlbHA7IG9vLT5uYW1lICE9IE5VTEw7IG9vKyspIHsKKyAgICAgICAgUFJJTlRGKCAiPT09PT09PT09IGhlbHAgZm9yIG9wdGlvbiAtJXM6XG5cbiIsIG9vLT5uYW1lICk7CisgICAgICAgIGFuZHJvaWRfaGVscF9mb3Jfb3B0aW9uKCBvby0+bmFtZSwgb3V0ICk7CisgICAgfQorCisgICAgZm9yICh0dCA9IHRvcGljX2hlbHA7IHR0LT5uYW1lICE9IE5VTEw7IHR0KyspIHsKKyAgICAgICAgUFJJTlRGKCAiPT09PT09PT09IGhlbHAgZm9yIC1oZWxwLSVzXG5cbiIsIHR0LT5uYW1lICk7CisgICAgICAgIGFuZHJvaWRfaGVscF9mb3JfdG9waWMoIHR0LT5uYW1lLCBvdXQgKTsKKyAgICB9CisgICAgUFJJTlRGKCAiPT09PT09PT09IHRvcC1sZXZlbCBoZWxwXG5cbiIgKTsKKyAgICBhbmRyb2lkX2hlbHBfbWFpbihvdXQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2hlbHAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9oZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNTAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9oZWxwLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJhbGxvYy5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiB0aGVzZSB2YWx1ZXMgZ2l2ZSB0aGUgbWF4aW11bSBsZW5ndGggb2Ygc3lzdGVtIHByb3BlcnR5CisgKiBuYW1lcyBhbmQgdmFsdWVzLiBUaGV5IG11c3QgbWF0Y2ggdGhlIGRlZmluaXRpb25zIGZvciBQUk9QRVJUWV9NQVhfTkFNRSBhbmQKKyAqIFBST1BFUlRZX01BWF9WQUxVRSBpbiB0aGUgQW5kcm9pZCBzb3VyY2UgdHJlZQorICogKGluIHN5c3RlbS9jb3JlL2luY2x1ZGUvY3V0aWxzL3Byb3BlcnRpZXMuaCkKKyAqLworI2RlZmluZSAgQk9PVF9QUk9QRVJUWV9NQVhfTkFNRSAgICAzMgorI2RlZmluZSAgQk9PVF9QUk9QRVJUWV9NQVhfVkFMVUUgICA5MgorCisvKiBhcHBlbmRzIHRoZSBsaXN0IG9mIG9wdGlvbnMgd2l0aCBhIHNtYWxsIGRlc2NyaXB0aW9uIHRvIGEgZHluYW1pYyBzdHJpbmcgKi8KK2V4dGVybiB2b2lkICBhbmRyb2lkX2hlbHBfbGlzdF9vcHRpb25zKCBzdHJhbGxvY190KiAgb3V0ICk7CisKKy8qIG91dHB1dCBtYWluIGhlbHAgc2NyZWVuIGludG8gYSBzaW5nbGUgZHluYW1pYyBzdHJpbmcgKi8KK2V4dGVybiB2b2lkICBhbmRyb2lkX2hlbHBfbWFpbiggc3RyYWxsb2NfdCogIG91dCApOworCisvKiBvdXRwdXQgYWxsIGhlbHAgaW50byBhIHNpbmdsZSBkeW5hbWljIHN0cmluZyAqLworZXh0ZXJuIHZvaWQgIGFuZHJvaWRfaGVscF9hbGwoIHN0cmFsbG9jX3QqICBvdXQgKTsKKworLyogYXBwZW5kcyB0aGUgaGVscCBmb3IgYSBnaXZlbiBjb21tYW5kLWxpbmUgb3B0aW9uIGludG8gYSBkeW5hbWljIHN0cmluZworICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGVycm9yIChpLmUuIHVua25vd24gb3B0aW9uKQorICovCitleHRlcm4gaW50ICBhbmRyb2lkX2hlbHBfZm9yX29wdGlvbiggY29uc3QgY2hhciogIG9wdGlvbiwgc3RyYWxsb2NfdCogIG91dCApOworCisvKiBhcHBlbmRzIHRoZSBoZWxwIGZvciBhIGdpdmVuIGhlbHAgdG9waWMgaW50byBhIGR5bmFtaWMgc3RyaW5nCisgKiByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IgKGkuZS4gdW5rbm93biB0b3BpYykKKyAqLworZXh0ZXJuIGludCAgYW5kcm9pZF9oZWxwX2Zvcl90b3BpYyggY29uc3QgY2hhciogIHRvcGljLCBzdHJhbGxvY190KiAgb3V0ICk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWNvbnRyb2wuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YxYzI0YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1jb250cm9sLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworLyogdGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHN1cHBvcnQgb2YgdGhlIG5ldyAnaGFyZHdhcmUgY29udHJvbCcKKyAqIHFlbXVkIGNvbW11bmljYXRpb24gY2hhbm5lbCwgd2hpY2ggaXMgdXNlZCBieSBsaWJzL2hhcmR3YXJlIG9uCisgKiB0aGUgc3lzdGVtIGltYWdlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGVtdWxhdG9yIHByb2dyYW0gZm9yCisgKiBlbXVsYXRpbmcgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgIC0gcG93ZXIgbWFuYWdlbWVudAorICogICAtIGxlZChzKSBicmlnaHRuZXNzCisgKiAgIC0gdmlicmF0b3IKKyAqICAgLSBmbGFzaGxpZ2h0CisgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2h3LWNvbnRyb2wuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcWVtdWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NidWZmZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9taXNjLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSAgRCguLi4pICBWRVJCT1NFX1BSSU5UKGh3X2NvbnRyb2wsX19WQV9BUkdTX18pCisKKy8qIGRlZmluZSBUX0FDVElWRSB0byAxIHRvIGRlYnVnIHRyYW5zcG9ydCBjb21tdW5pY2F0aW9ucyAqLworI2RlZmluZSAgVF9BQ1RJVkUgIDAKKworI2lmIFRfQUNUSVZFCisjZGVmaW5lICBUKC4uLikgIFZFUkJPU0VfUFJJTlQoaHdfY29udHJvbCxfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBUKC4uLikgICAoKHZvaWQpMCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICBjbGllbnQ7CisgICAgQW5kcm9pZEh3Q29udHJvbEZ1bmNzICBjbGllbnRfZnVuY3M7CisgICAgUWVtdWRTZXJ2aWNlKiAgICAgICAgICBzZXJ2aWNlOworfSBId0NvbnRyb2w7CisKKy8qIGhhbmRsZSBxdWVyeSAqLworc3RhdGljIHZvaWQgIGh3X2NvbnRyb2xfZG9fcXVlcnkoIEh3Q29udHJvbCogIGgsIHVpbnQ4X3QqICBxdWVyeSwgaW50ICBxdWVyeWxlbiApOworCisvKiBjYWxsZWQgd2hlbiBhIHFlbXVkIGNsaWVudCBzZW5kcyBhIGNvbW1hbmQgKi8KK3N0YXRpYyB2b2lkCitfaHdfY29udHJvbF9xZW11ZF9jbGllbnRfcmVjdiggdm9pZCogICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgICBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqICBjbGllbnQgKQoreworICAgIGh3X2NvbnRyb2xfZG9fcXVlcnkob3BhcXVlLCBtc2csIG1zZ2xlbik7Cit9CisKKy8qIGNhbGxlZCB3aGVuIGEgcWVtdWQgY2xpZW50IGNvbm5lY3RzIHRvIHRoZSBzZXJ2aWNlICovCitzdGF0aWMgUWVtdWRDbGllbnQqCitfaHdfY29udHJvbF9xZW11ZF9jb25uZWN0KCB2b2lkKiAgb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUWVtdWRTZXJ2aWNlKiAgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSApCit7CisgICAgUWVtdWRDbGllbnQqICBjbGllbnQ7CisKKyAgICBjbGllbnQgPSBxZW11ZF9jbGllbnRfbmV3KCBzZXJ2aWNlLCBjaGFubmVsLCBjbGllbnRfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9od19jb250cm9sX3FlbXVkX2NsaWVudF9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwgKTsKKworICAgIHFlbXVkX2NsaWVudF9zZXRfZnJhbWluZyhjbGllbnQsIDEpOworICAgIHJldHVybiBjbGllbnQ7Cit9CisKKworc3RhdGljIHVpbnQ4X3QqCitpZl9zdGFydHNfd2l0aCggdWludDhfdCogIGJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciogIHByZWZpeCApCit7CisgICAgaW50ICBwcmVmaXhsZW4gPSBzdHJsZW4ocHJlZml4KTsKKworICAgIGlmIChidWZsZW4gPCBwcmVmaXhsZW4gfHwgbWVtY21wKGJ1ZiwgcHJlZml4LCBwcmVmaXhsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiAodWludDhfdCopYnVmICsgcHJlZml4bGVuOworfQorCisKK3N0YXRpYyB2b2lkCitod19jb250cm9sX2RvX3F1ZXJ5KCBId0NvbnRyb2wqICBoLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogICAgcXVlcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBxdWVyeWxlbiApCit7CisgICAgdWludDhfdCogICBxOworCisgICAgVCgiJXM6IHF1ZXJ5ICU0ZCAnJS4qcyciLCBfX0ZVTkNUSU9OX18sIHF1ZXJ5bGVuLCBxdWVyeWxlbiwgcXVlcnkgKTsKKworICAgIHEgPSBpZl9zdGFydHNfd2l0aCggcXVlcnksIHF1ZXJ5bGVuLCAicG93ZXI6bGlnaHQ6YnJpZ2h0bmVzczoiICk7CisgICAgaWYgKHEgIT0gTlVMTCkgeworICAgICAgICBpZiAoaC0+Y2xpZW50X2Z1bmNzLmxpZ2h0X2JyaWdodG5lc3MgJiYgYW5kcm9pZF9ody0+aHdfbGNkX2JhY2tsaWdodCkgeworICAgICAgICAgICAgY2hhciogIHFxID0gc3RyY2hyKChjb25zdCBjaGFyKilxLCAnOicpOworICAgICAgICAgICAgaW50ICAgIHZhbHVlOworICAgICAgICAgICAgaWYgKHFxID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBEKCIlczogYmFkbHkgZm9ybWF0dGVkIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnFxKysgPSAwOworICAgICAgICAgICAgdmFsdWUgPSBhdG9pKHFxKTsKKyAgICAgICAgICAgIGgtPmNsaWVudF9mdW5jcy5saWdodF9icmlnaHRuZXNzKCBoLT5jbGllbnQsIChjaGFyKilxLCB2YWx1ZSApOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2h3X2NvbnRyb2xfaW5pdCggSHdDb250cm9sKiAgICAgICAgICAgICAgICAgICAgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkSHdDb250cm9sRnVuY3MqICBjbGllbnRfZnVuY3MgKQoreworICAgIGNvbnRyb2wtPmNsaWVudCAgICAgICA9IGNsaWVudDsKKyAgICBjb250cm9sLT5jbGllbnRfZnVuY3MgPSBjbGllbnRfZnVuY3NbMF07CisgICAgY29udHJvbC0+c2VydmljZSAgICAgID0gcWVtdWRfc2VydmljZV9yZWdpc3RlciggImh3LWNvbnRyb2wiLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2h3X2NvbnRyb2xfcWVtdWRfY29ubmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKK30KKworY29uc3QgQW5kcm9pZEh3Q29udHJvbEZ1bmNzICBkZWZhdWx0Q29udHJvbHMgPSB7CisgICAgTlVMTCwKK307CisKK3N0YXRpYyBId0NvbnRyb2wgICBod3N0YXRlWzFdOworCit2b2lkCithbmRyb2lkX2h3X2NvbnRyb2xfaW5pdCggdm9pZCApCit7CisgICAgaHdfY29udHJvbF9pbml0KGh3c3RhdGUsIE5VTEwsICZkZWZhdWx0Q29udHJvbHMpOworICAgIEQoIiVzOiBody1jb250cm9sIHFlbXVkIGhhbmRsZXIgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkCithbmRyb2lkX2h3X2NvbnRyb2xfc2V0KCB2b2lkKiAgb3BhcXVlLCBjb25zdCBBbmRyb2lkSHdDb250cm9sRnVuY3MqICBmdW5jcyApCit7CisgICAgaHdzdGF0ZS0+Y2xpZW50ICAgICAgID0gb3BhcXVlOworICAgIGh3c3RhdGUtPmNsaWVudF9mdW5jcyA9IGZ1bmNzWzBdOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctY29udHJvbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWNvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRjMjhiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWNvbnRyb2wuaApAQCAtMCwwICsxLDM3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvKiBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gd2FudHMgdG8gY2hhbmdlIHRoZSBicmlnaHRuZXNzCisgKiBvZiBhIGdpdmVuIGxpZ2h0LiAnbGlnaHQnIGlzIGEgc3RyaW5nIHdoaWNoIGNhbiBiZSBvbmUgb2Y6CisgKiAnbGNkX2JhY2tsaWdodCcsICdidXR0b25fYmFja2xpZ2h0JyBvciAnS2V5Ym9hcmRfYmFja2xpZ2h0JworICoKKyAqIGJyaWdodG5lc3MgaXMgYW4gaW50ZWdlciAoYWNjZXB0YWJsZSByYW5nZSBhcmUgMC4uMjU1KSwgaG93ZXZlciB0aGUKKyAqIGRlZmF1bHQgaXMgYXJvdW5kIDEwNSwgYW5kIHdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gZGltIHRoZSBlbXVsYXRvcidzCisgKiBvdXRwdXQgYXQgdGhhdCBsZXZlbC4KKyAqLwordHlwZWRlZiB2b2lkICAoKkFuZHJvaWRId0xpZ2h0QnJpZ2h0bmVzc0Z1bmMpKCB2b2lkKiAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBicmlnaHRuZXNzICk7CisKKy8qIHVzZWQgdG8gcmVjb3JkIGEgaHcgY29udHJvbCAnY2xpZW50JyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFuZHJvaWRId0xpZ2h0QnJpZ2h0bmVzc0Z1bmMgIGxpZ2h0X2JyaWdodG5lc3M7Cit9IEFuZHJvaWRId0NvbnRyb2xGdW5jczsKKworLyogdXNlZCB0byBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBjb250cm9sIHN1cHBvcnQgKi8KK2V4dGVybiB2b2lkICBhbmRyb2lkX2h3X2NvbnRyb2xfaW5pdCggdm9pZCApOworCisvKiB1c2VkIHRvIHJlZ2lzdGVyIGEgbmV3IGh3LWNvbnRyb2wgYmFjay1lbmQgKi8KK2V4dGVybiB2b2lkICBhbmRyb2lkX2h3X2NvbnRyb2xfc2V0KCB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5kcm9pZEh3Q29udHJvbEZ1bmNzKiAgZnVuY3MgKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1ldmVudHMuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzE4ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWV2ZW50cy5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9ody1ldmVudHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgbmFtZTsKKyAgICBpbnQgICAgICAgICAgdmFsdWU7Cit9IEV2ZW50SW5mbzsKKworI2RlZmluZSAgRVZfVFlQRShuLHYpICAgeyAiRVZfIiBTVFJJTkdJRlkobiksICh2KSB9LAorCisjZGVmaW5lICBCVE5fQ09ERShuLHYpICB7ICJCVE5fIiBTVFJJTkdJRlkobiksICh2KSB9LAorI2RlZmluZSAgS0VZX0NPREUobix2KSAgeyAiS0VZXyIgU1RSSU5HSUZZKG4pLCAodikgfSwKKyNkZWZpbmUgIFJFTF9DT0RFKG4sdikgIHsgIlJFTF8iIFNUUklOR0lGWShuKSwgKHYpIH0sCisjZGVmaW5lICBBQlNfQ09ERShuLHYpICB7ICJBQlNfIiBTVFJJTkdJRlkobiksICh2KSB9LAorI2RlZmluZSAgRU5EX0NPREUgICAgICAgeyBOVUxMLCAwIH0KKworc3RhdGljIGNvbnN0IEV2ZW50SW5mbyAgX2V2X3R5cGVzX3RhYltdID0KK3sKKyAgICBFVkVOVF9UWVBFX0xJU1QKKyAgICBFTkRfQ09ERQorfTsKKworc3RhdGljIGNvbnN0IEV2ZW50SW5mbyBfa2V5X2NvZGVzX2xpc3RbXSA9Cit7CisgICAgRVZFTlRfS0VZX0xJU1QKKyAgICBFVkVOVF9CVE5fTElTVAorICAgIEVORF9DT0RFCit9OworCitzdGF0aWMgY29uc3QgRXZlbnRJbmZvIF9yZWxfY29kZXNfbGlzdFtdID0KK3sKKyAgICBFVkVOVF9SRUxfTElTVAorICAgIEVORF9DT0RFCit9Oworc3RhdGljIGNvbnN0IEV2ZW50SW5mbyBfYWJzX2NvZGVzX2xpc3RbXSA9Cit7CisgICAgRVZFTlRfQUJTX0xJU1QKKyAgICBFTkRfQ09ERQorfTsKKworI3VuZGVmIEVWX1RZUEUKKyN1bmRlZiBCVE5fQ09ERQorI3VuZGVmIEtFWV9DT0RFCisjdW5kZWYgUkVMX0NPREUKKyN1bmRlZiBBQlNfQ09ERQorCit0eXBlZGVmIGNvbnN0IEV2ZW50SW5mbyogIEV2ZW50TGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgICAgICAgIHR5cGU7CisgICAgY29uc3QgRXZlbnRJbmZvKiAgdGFibGU7Cit9IEV2ZW50Q29kZUxpc3Q7CisKKworc3RhdGljIGNvbnN0IEV2ZW50Q29kZUxpc3QgIF9jb2Rlc1tdID0geworICAgIHsgRVZfS0VZLCBfa2V5X2NvZGVzX2xpc3QgfSwKKyAgICB7IEVWX1JFTCwgX3JlbF9jb2Rlc19saXN0IH0sCisgICAgeyBFVl9BQlMsIF9hYnNfY29kZXNfbGlzdCB9LAorICAgIHsgLTEsIE5VTEwgfQorfTsKKworc3RhdGljIEV2ZW50TGlzdAorZXZlbnRMaXN0X2ZpbmRCeVR5cGUoIGludCAgdHlwZSApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBfY29kZXNbbm5dLnR5cGUgPj0gMDsgbm4rKykgeworICAgICAgICBpZiAoX2NvZGVzW25uXS50eXBlID09IHR5cGUpCisgICAgICAgICAgICByZXR1cm4gX2NvZGVzW25uXS50YWJsZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK2V2ZW50TGlzdF9nZXRDb3VudCggRXZlbnRMaXN0ICBsaXN0ICkKK3sKKyAgICBpbnQgIG5uOworCisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKG5uID0gMDsgbGlzdFtubl0ubmFtZSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgIC8qIG5vdGhpbmcgKi8KKyAgICB9CisgICAgcmV0dXJuIG5uOworfQorCitzdGF0aWMgaW50CitldmVudExpc3RfZmluZENvZGVCeU5hbWUoIEV2ZW50TGlzdCAgICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIG5hbWVsZW4gKQoreworICAgIGlmIChuYW1lbGVuIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoIDsgbGlzdC0+bmFtZSAhPSBOVUxMOyBsaXN0ICs9IDEgKSB7CisgICAgICAgIGlmICggIW1lbWNtcChuYW1lLCBsaXN0LT5uYW1lLCBuYW1lbGVuKSAmJgorICAgICAgICAgICAgIGxpc3QtPm5hbWVbbmFtZWxlbl0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0LT52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjaGFyKgorZXZlbnRMaXN0X2J1ZnByaW50Q29kZSggRXZlbnRMaXN0ICBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICBidWZlbmQgKQoreworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBidWY7CisKKyAgICByZXR1cm4gYnVmcHJpbnQoYnVmLCBidWZlbmQsICIlcyIsIGxpc3RbaW5kZXhdLm5hbWUpOworfQorCisKK2ludAorYW5kcm9pZF9ldmVudF9mcm9tX3N0ciggY29uc3QgY2hhciogIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAqcHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAqcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAqcHZhbHVlICkKK3sKKyAgICBjb25zdCBjaGFyKiAgcDsKKyAgICBjb25zdCBjaGFyKiAgcGVuZDsKKyAgICBjb25zdCBjaGFyKiAgcTsKKyAgICBFdmVudExpc3QgICAgbGlzdDsKKyAgICBjaGFyKiAgICAgICAgZW5kOworCisgICAgKnB0eXBlICA9IDA7CisgICAgKnBjb2RlICA9IDA7CisgICAgKnB2YWx1ZSA9IDA7CisKKyAgICBwICAgID0gbmFtZTsKKyAgICBwZW5kID0gcCArIHN0cmNzcG4ocCwgIiBcdCIpOworICAgIHEgICAgPSBzdHJjaHIocCwgJzonKTsKKyAgICBpZiAocSA9PSBOVUxMIHx8IHEgPiBwZW5kKQorICAgICAgICBxID0gcGVuZDsKKworICAgICpwdHlwZSA9IGV2ZW50TGlzdF9maW5kQ29kZUJ5TmFtZSggX2V2X3R5cGVzX3RhYiwgcCwgcS1wICk7CisgICAgaWYgKCpwdHlwZSA8IDApIHsKKyAgICAgICAgKnB0eXBlID0gKGludCkgc3RydG9sKCBwLCAmZW5kLCAwICk7CisgICAgICAgIGlmIChlbmQgIT0gcSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKnEgIT0gJzonKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHAgPSBxICsgMTsKKyAgICBxID0gc3RyY2hyKHAsICc6Jyk7CisgICAgaWYgKHEgPT0gTlVMTCB8fCBxID4gcGVuZCkKKyAgICAgICAgcSA9IHBlbmQ7CisKKyAgICBsaXN0ICAgPSBldmVudExpc3RfZmluZEJ5VHlwZSggKnB0eXBlICk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICAqcGNvZGUgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICAqcGNvZGUgPSBldmVudExpc3RfZmluZENvZGVCeU5hbWUoIGxpc3QsIHAsIHEtcCApOworICAgIH0KKyAgICBpZiAoKnBjb2RlIDwgMCkgeworICAgICAgICAqcGNvZGUgPSAoaW50KSBzdHJ0b2woIHAsICZlbmQsIDAgKTsKKyAgICAgICAgaWYgKGVuZCAhPSBxKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIGlmICgqcSAhPSAnOicpCisgICAgICAgIHJldHVybiAwOworCisgICAgcCA9IHEgKyAxOworICAgIHEgPSBzdHJjaHIocCwgJzonKTsKKyAgICBpZiAocSA9PSBOVUxMIHx8IHEgPiBwZW5kKQorICAgICAgICBxID0gcGVuZDsKKworICAgICpwdmFsdWUgPSAoaW50KXN0cnRvbCggcCwgJmVuZCwgMCApOworICAgIGlmIChlbmQgIT0gcSkKKyAgICAgICAgcmV0dXJuIC0zOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorYW5kcm9pZF9ldmVudF9nZXRfdHlwZV9jb3VudCggdm9pZCApCit7CisgICAgcmV0dXJuIGV2ZW50TGlzdF9nZXRDb3VudCggX2V2X3R5cGVzX3RhYiApOworfQorCitjaGFyKgorYW5kcm9pZF9ldmVudF9idWZwcmludF90eXBlX3N0ciggY2hhciogIGJ1ZmYsIGNoYXIqICBlbmQsIGludCAgdHlwZV9pbmRleCApCit7CisgICAgcmV0dXJuIGV2ZW50TGlzdF9idWZwcmludENvZGUoIF9ldl90eXBlc190YWIsIHR5cGVfaW5kZXgsIGJ1ZmYsIGVuZCApOworfQorCisvKiByZXR1cm5zIHRoZSBsaXN0IG9mIHZhbGlkIGV2ZW50IGNvZGUgc3RyaW5nIGFsaWFzZXMgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZSAqLworaW50CithbmRyb2lkX2V2ZW50X2dldF9jb2RlX2NvdW50KCBpbnQgIHR5cGUgKQoreworICAgIEV2ZW50TGlzdCAgbGlzdCA9IGV2ZW50TGlzdF9maW5kQnlUeXBlKHR5cGUpOworCisgICAgcmV0dXJuIGV2ZW50TGlzdF9nZXRDb3VudChsaXN0KTsKK30KKworY2hhcioKK2FuZHJvaWRfZXZlbnRfYnVmcHJpbnRfY29kZV9zdHIoIGNoYXIqICBidWZmLCBjaGFyKiAgZW5kLCBpbnQgIHR5cGUsIGludCAgY29kZV9pbmRleCApCit7CisgICAgRXZlbnRMaXN0ICBsaXN0ID0gZXZlbnRMaXN0X2ZpbmRCeVR5cGUodHlwZSk7CisKKyAgICByZXR1cm4gZXZlbnRMaXN0X2J1ZnByaW50Q29kZShsaXN0LCBjb2RlX2luZGV4LCBidWZmLCBlbmQpOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctZXZlbnRzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctZXZlbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmNjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1ldmVudHMuaApAQCAtMCwwICsxLDU0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKy8qIGZyb20gdGhlIExpbnV4IGtlcm5lbCAqLworCisjZGVmaW5lICBFVkVOVF9UWVBFX0xJU1QgIFwKKyAgRVZfVFlQRShTWU4sMHgwMCkgICBcCisgIEVWX1RZUEUoS0VZLDB4MDEpICAgXAorICBFVl9UWVBFKFJFTCwweDAyKSAgIFwKKyAgRVZfVFlQRShBQlMsMHgwMykgICBcCisgIEVWX1RZUEUoTVNDLDB4MDQpICAgXAorICBFVl9UWVBFKFNXLCAweDA1KSAgIFwKKyAgRVZfVFlQRShMRUQsMHgxMSkgICBcCisgIEVWX1RZUEUoU05ELDB4MTIpICAgXAorICBFVl9UWVBFKFJFUCwweDE0KSAgIFwKKyAgRVZfVFlQRShGRiwgMHgxNSkgICBcCisgIEVWX1RZUEUoUFdSLDB4MTYpICAgXAorICBFVl9UWVBFKEZGX1NUQVRVUywweDE3KSAgXAorICBFVl9UWVBFKE1BWCwweDFmKQorCisjdW5kZWYgIEVWX1RZUEUKKyNkZWZpbmUgRVZfVFlQRShuLHYpICAgIEdMVUUoRVZfLG4pID0gdiwKK3R5cGVkZWYgZW51bSB7CisgICAgRVZFTlRfVFlQRV9MSVNUCit9IEV2ZW50VHlwZTsKKyN1bmRlZiAgRVZfVFlQRQorCisvKiBCRVdBUkU6IFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlIGRlZmluZWQgYnkgdGhlIExpbnV4IGtlcm5lbCBoZWFkZXJzLgorICogICAgICAgICBUaGUgQW5kcm9pZCAiTWVudSIga2V5IGlzIEtFWV9TT0ZUMSwgKm5vdCogS0VZX01FTlUKKyAqLworLyogTk9URTogbWluZ3cncyB3aW5udC5oIGRlZmluZSBERUxFVEUgdG8gY29uc3RhbnQKKyAgIGk1ODYtbWluZ3czMm1zdmM6ICAgICAgICNkZWZpbmUgREVMRVRFICAweDAwMDEwMDAwTAorICAgeDg2XzY0LXc2NC1taW5ndzMyLWdjYzogI2RlZmluZSBERUxFVEUgICgweDAwMDEwMDAwTCkKKworICAgS0VZX0NPREUgYmVsb3dzIGdsdWVzICJLRVlfIiBhbmQgIkRFTEVURSIuCisgICBXaGlsZSBLRVlfMHgwMDAxMDAwMEwgbWF5IG5vdCBtZWFuIGFueXRoaW5nLAorICAgS0VZXygweDAwMDEwMDAwTCkgaXMgYWJzb2x1dGVseSBoYXJtZnVsIHRvIGNvbXBpbGVyLgorICAgVW5kZWZpbmUgREVMRVRFIGJlbG93CisgKi8KKyN1bmRlZiBERUxFVEUKKworI2RlZmluZSAgRVZFTlRfS0VZX0xJU1QgXAorICAgS0VZX0NPREUoRVNDICAgICAgICAgLDEpICAgICBcCisgICBLRVlfQ09ERSgxICAgICAgICAgICAsMikgICAgIFwKKyAgIEtFWV9DT0RFKDIgICAgICAgICAgICwzKSAgICAgXAorICAgS0VZX0NPREUoMyAgICAgICAgICAgLDQpICAgICBcCisgICBLRVlfQ09ERSg0ICAgICAgICAgICAsNSkgICAgIFwKKyAgIEtFWV9DT0RFKDUgICAgICAgICAgICw2KSAgICAgXAorICAgS0VZX0NPREUoNiAgICAgICAgICAgLDcpICAgICBcCisgICBLRVlfQ09ERSg3ICAgICAgICAgICAsOCkgICAgIFwKKyAgIEtFWV9DT0RFKDggICAgICAgICAgICw5KSAgICAgXAorICAgS0VZX0NPREUoOSAgICAgICAgICAgLDEwKSAgICBcCisgICBLRVlfQ09ERSgwICAgICAgICAgICAsMTEpICAgIFwKKyAgIEtFWV9DT0RFKE1JTlVTICAgICAgICwxMikgICAgXAorICAgS0VZX0NPREUoRVFVQUwgICAgICAgLDEzKSAgICBcCisgICBLRVlfQ09ERShCQUNLU1BBQ0UgICAsMTQpICAgIFwKKyAgIEtFWV9DT0RFKFRBQiAgICAgICAgICwxNSkgICAgXAorICAgS0VZX0NPREUoUSAgICAgICAgICAgLDE2KSAgICBcCisgICBLRVlfQ09ERShXICAgICAgICAgICAsMTcpICAgIFwKKyAgIEtFWV9DT0RFKEUgICAgICAgICAgICwxOCkgICAgXAorICAgS0VZX0NPREUoUiAgICAgICAgICAgLDE5KSAgICBcCisgICBLRVlfQ09ERShUICAgICAgICAgICAsMjApICAgIFwKKyAgIEtFWV9DT0RFKFkgICAgICAgICAgICwyMSkgICAgXAorICAgS0VZX0NPREUoVSAgICAgICAgICAgLDIyKSAgICBcCisgICBLRVlfQ09ERShJICAgICAgICAgICAsMjMpICAgIFwKKyAgIEtFWV9DT0RFKE8gICAgICAgICAgICwyNCkgICAgXAorICAgS0VZX0NPREUoUCAgICAgICAgICAgLDI1KSAgICBcCisgICBLRVlfQ09ERShMRUZUQlJBQ0UgICAsMjYpICAgIFwKKyAgIEtFWV9DT0RFKFJJR0hUQlJBQ0UgICwyNykgICAgXAorICAgS0VZX0NPREUoRU5URVIgICAgICAgLDI4KSAgICBcCisgICBLRVlfQ09ERShMRUZUQ1RSTCAgICAsMjkpICAgIFwKKyAgIEtFWV9DT0RFKEEgICAgICAgICAgICwzMCkgICAgXAorICAgS0VZX0NPREUoUyAgICAgICAgICAgLDMxKSAgICBcCisgICBLRVlfQ09ERShEICAgICAgICAgICAsMzIpICAgIFwKKyAgIEtFWV9DT0RFKEYgICAgICAgICAgICwzMykgICAgXAorICAgS0VZX0NPREUoRyAgICAgICAgICAgLDM0KSAgICBcCisgICBLRVlfQ09ERShIICAgICAgICAgICAsMzUpICAgIFwKKyAgIEtFWV9DT0RFKEogICAgICAgICAgICwzNikgICAgXAorICAgS0VZX0NPREUoSyAgICAgICAgICAgLDM3KSAgICBcCisgICBLRVlfQ09ERShMICAgICAgICAgICAsMzgpICAgIFwKKyAgIEtFWV9DT0RFKFNFTUlDT0xPTiAgICwzOSkgICAgXAorICAgS0VZX0NPREUoQVBPU1RST1BIRSAgLDQwKSAgICBcCisgICBLRVlfQ09ERShHUkFWRSAgICAgICAsNDEpICAgIFwKKyAgIEtFWV9DT0RFKExFRlRTSElGVCAgICw0MikgICAgXAorICAgS0VZX0NPREUoQkFDS1NMQVNIICAgLDQzKSAgICBcCisgICBLRVlfQ09ERShaICAgICAgICAgICAsNDQpICAgIFwKKyAgIEtFWV9DT0RFKFggICAgICAgICAgICw0NSkgICAgXAorICAgS0VZX0NPREUoQyAgICAgICAgICAgLDQ2KSAgICBcCisgICBLRVlfQ09ERShWICAgICAgICAgICAsNDcpICAgIFwKKyAgIEtFWV9DT0RFKEIgICAgICAgICAgICw0OCkgICAgXAorICAgS0VZX0NPREUoTiAgICAgICAgICAgLDQ5KSAgICBcCisgICBLRVlfQ09ERShNICAgICAgICAgICAsNTApICAgIFwKKyAgIEtFWV9DT0RFKENPTU1BICAgICAgICw1MSkgICAgXAorICAgS0VZX0NPREUoRE9UICAgICAgICAgLDUyKSAgICBcCisgICBLRVlfQ09ERShTTEFTSCAgICAgICAsNTMpICAgIFwKKyAgIEtFWV9DT0RFKFJJR0hUU0hJRlQgICw1NCkgICAgXAorICAgS0VZX0NPREUoS1BBU1RFUklTSyAgLDU1KSAgICBcCisgICBLRVlfQ09ERShMRUZUQUxUICAgICAsNTYpICAgIFwKKyAgIEtFWV9DT0RFKFNQQUNFICAgICAgICw1NykgICAgXAorICAgS0VZX0NPREUoQ0FQU0xPQ0sgICAgLDU4KSAgICBcCisgICBLRVlfQ09ERShGMSAgICAgICAgICAsNTkpICAgIFwKKyAgIEtFWV9DT0RFKEYyICAgICAgICAgICw2MCkgICAgXAorICAgS0VZX0NPREUoRjMgICAgICAgICAgLDYxKSAgICBcCisgICBLRVlfQ09ERShGNCAgICAgICAgICAsNjIpICAgIFwKKyAgIEtFWV9DT0RFKEY1ICAgICAgICAgICw2MykgICAgXAorICAgS0VZX0NPREUoRjYgICAgICAgICAgLDY0KSAgICBcCisgICBLRVlfQ09ERShGNyAgICAgICAgICAsNjUpICAgIFwKKyAgIEtFWV9DT0RFKEY4ICAgICAgICAgICw2NikgICAgXAorICAgS0VZX0NPREUoRjkgICAgICAgICAgLDY3KSAgICBcCisgICBLRVlfQ09ERShGMTAgICAgICAgICAsNjgpICAgIFwKKyAgIEtFWV9DT0RFKE5VTUxPQ0sgICAgICw2OSkgICAgXAorICAgS0VZX0NPREUoU0NST0xMTE9DSyAgLDcwKSAgICBcCisgICBLRVlfQ09ERShLUDcgICAgICAgICAsNzEpICAgIFwKKyAgIEtFWV9DT0RFKEtQOCAgICAgICAgICw3MikgICAgXAorICAgS0VZX0NPREUoS1A5ICAgICAgICAgLDczKSAgICBcCisgICBLRVlfQ09ERShLUE1JTlVTICAgICAsNzQpICAgIFwKKyAgIEtFWV9DT0RFKEtQNCAgICAgICAgICw3NSkgICAgXAorICAgS0VZX0NPREUoS1A1ICAgICAgICAgLDc2KSAgICBcCisgICBLRVlfQ09ERShLUDYgICAgICAgICAsNzcpICAgIFwKKyAgIEtFWV9DT0RFKEtQUExVUyAgICAgICw3OCkgICAgXAorICAgS0VZX0NPREUoS1AxICAgICAgICAgLDc5KSAgICBcCisgICBLRVlfQ09ERShLUDIgICAgICAgICAsODApICAgIFwKKyAgIEtFWV9DT0RFKEtQMyAgICAgICAgICw4MSkgICAgXAorICAgS0VZX0NPREUoS1AwICAgICAgICAgLDgyKSAgICBcCisgICBLRVlfQ09ERShLUERPVCAgICAgICAsODMpICAgIFwKKyAgIEtFWV9DT0RFKFpFTktBS1VIQU5LQUtVLDg1KSAgICBcCisgICBLRVlfQ09ERSgxMDJORCAgICAgICAsODYpICAgIFwKKyAgIEtFWV9DT0RFKEYxMSAgICAgICAgICw4NykgICAgXAorICAgS0VZX0NPREUoRjEyICAgICAgICAgLDg4KSAgICBcCisgICBLRVlfQ09ERShSTyAgICAgICAgICAsODkpICAgIFwKKyAgIEtFWV9DT0RFKEtBVEFLQU5BICAgICw5MCkgICAgXAorICAgS0VZX0NPREUoSElSQUdBTkEgICAgLDkxKSAgICBcCisgICBLRVlfQ09ERShIRU5LQU4gICAgICAsOTIpICAgIFwKKyAgIEtFWV9DT0RFKEtBVEFLQU5BSElSQUdBTkEsOTMpICAgIFwKKyAgIEtFWV9DT0RFKE1VSEVOS0FOICAgICw5NCkgICAgXAorICAgS0VZX0NPREUoS1BKUENPTU1BICAgLDk1KSAgICBcCisgICBLRVlfQ09ERShLUEVOVEVSICAgICAsOTYpICAgIFwKKyAgIEtFWV9DT0RFKFJJR0hUQ1RSTCAgICw5NykgICAgXAorICAgS0VZX0NPREUoS1BTTEFTSCAgICAgLDk4KSAgICBcCisgICBLRVlfQ09ERShTWVNSUSAgICAgICAsOTkpICAgIFwKKyAgIEtFWV9DT0RFKFJJR0hUQUxUICAgICwxMDApICAgXAorICAgS0VZX0NPREUoTElORUZFRUQgICAgLDEwMSkgICBcCisgICBLRVlfQ09ERShIT01FICAgICAgICAsMTAyKSAgIFwKKyAgIEtFWV9DT0RFKFVQICAgICAgICAgICwxMDMpICAgXAorICAgS0VZX0NPREUoUEFHRVVQICAgICAgLDEwNCkgICBcCisgICBLRVlfQ09ERShMRUZUICAgICAgICAsMTA1KSAgIFwKKyAgIEtFWV9DT0RFKFJJR0hUICAgICAgICwxMDYpICAgXAorICAgS0VZX0NPREUoRU5EICAgICAgICAgLDEwNykgICBcCisgICBLRVlfQ09ERShET1dOICAgICAgICAsMTA4KSAgIFwKKyAgIEtFWV9DT0RFKFBBR0VET1dOICAgICwxMDkpICAgXAorICAgS0VZX0NPREUoSU5TRVJUICAgICAgLDExMCkgICBcCisgICBLRVlfQ09ERShERUxFVEUgICAgICAsMTExKSAgIFwKKyAgIEtFWV9DT0RFKE1BQ1JPICAgICAgICwxMTIpICAgXAorICAgS0VZX0NPREUoTVVURSAgICAgICAgLDExMykgICBcCisgICBLRVlfQ09ERShWT0xVTUVET1dOICAsMTE0KSAgIFwKKyAgIEtFWV9DT0RFKFZPTFVNRVVQICAgICwxMTUpICAgXAorICAgS0VZX0NPREUoUE9XRVIgICAgICAgLDExNikgICBcCisgICBLRVlfQ09ERShLUEVRVUFMICAgICAsMTE3KSAgIFwKKyAgIEtFWV9DT0RFKEtQUExVU01JTlVTICwxMTgpICAgXAorICAgS0VZX0NPREUoUEFVU0UgICAgICAgLDExOSkgICBcCisgICBLRVlfQ09ERShLUENPTU1BICAgICAsMTIxKSAgIFwKKyAgIEtFWV9DT0RFKEhBTkdFVUwgICAgICwxMjIpICAgXAorICAgS0VZX0NPREUoSEFOSkEgICAgICAgLDEyMykgICBcCisgICBLRVlfQ09ERShZRU4gICAgICAgICAsMTI0KSAgIFwKKyAgIEtFWV9DT0RFKExFRlRNRVRBICAgICwxMjUpICAgXAorICAgS0VZX0NPREUoUklHSFRNRVRBICAgLDEyNikgICBcCisgICBLRVlfQ09ERShDT01QT1NFICAgICAsMTI3KSAgIFwKKyAgIEtFWV9DT0RFKFNUT1AgICAgICAgICwxMjgpICAgXAorICAgS0VZX0NPREUoQUdBSU4gICAgICAgLDEyOSkgICBcCisgICBLRVlfQ09ERShQUk9QUyAgICAgICAsMTMwKSAgIFwKKyAgIEtFWV9DT0RFKFVORE8gICAgICAgICwxMzEpICAgXAorICAgS0VZX0NPREUoRlJPTlQgICAgICAgLDEzMikgICBcCisgICBLRVlfQ09ERShDT1BZICAgICAgICAsMTMzKSAgIFwKKyAgIEtFWV9DT0RFKE9QRU4gICAgICAgICwxMzQpICAgXAorICAgS0VZX0NPREUoUEFTVEUgICAgICAgLDEzNSkgICBcCisgICBLRVlfQ09ERShGSU5EICAgICAgICAsMTM2KSAgIFwKKyAgIEtFWV9DT0RFKENVVCAgICAgICAgICwxMzcpICAgXAorICAgS0VZX0NPREUoSEVMUCAgICAgICAgLDEzOCkgICBcCisgICBLRVlfQ09ERShNRU5VICAgICAgICAsMTM5KSAgIFwKKyAgIEtFWV9DT0RFKENBTEMgICAgICAgICwxNDApICAgXAorICAgS0VZX0NPREUoU0VUVVAgICAgICAgLDE0MSkgICBcCisgICBLRVlfQ09ERShTTEVFUCAgICAgICAsMTQyKSAgIFwKKyAgIEtFWV9DT0RFKFdBS0VVUCAgICAgICwxNDMpICAgXAorICAgS0VZX0NPREUoRklMRSAgICAgICAgLDE0NCkgICBcCisgICBLRVlfQ09ERShTRU5ERklMRSAgICAsMTQ1KSAgIFwKKyAgIEtFWV9DT0RFKERFTEVURUZJTEUgICwxNDYpICAgXAorICAgS0VZX0NPREUoWEZFUiAgICAgICAgLDE0NykgICBcCisgICBLRVlfQ09ERShQUk9HMSAgICAgICAsMTQ4KSAgIFwKKyAgIEtFWV9DT0RFKFBST0cyICAgICAgICwxNDkpICAgXAorICAgS0VZX0NPREUoV1dXICAgICAgICAgLDE1MCkgICBcCisgICBLRVlfQ09ERShNU0RPUyAgICAgICAsMTUxKSAgIFwKKyAgIEtFWV9DT0RFKENPRkZFRSAgICAgICwxNTIpICAgXAorICAgS0VZX0NPREUoRElSRUNUSU9OICAgLDE1MykgICBcCisgICBLRVlfQ09ERShDWUNMRVdJTkRPV1MsMTU0KSAgIFwKKyAgIEtFWV9DT0RFKE1BSUwgICAgICAgICwxNTUpICAgXAorICAgS0VZX0NPREUoQk9PS01BUktTICAgLDE1NikgICBcCisgICBLRVlfQ09ERShDT01QVVRFUiAgICAsMTU3KSAgIFwKKyAgIEtFWV9DT0RFKEJBQ0sgICAgICAgICwxNTgpICAgXAorICAgS0VZX0NPREUoRk9SV0FSRCAgICAgLDE1OSkgICBcCisgICBLRVlfQ09ERShDTE9TRUNEICAgICAsMTYwKSAgIFwKKyAgIEtFWV9DT0RFKEVKRUNUQ0QgICAgICwxNjEpICAgXAorICAgS0VZX0NPREUoRUpFQ1RDTE9TRUNELDE2MikgICBcCisgICBLRVlfQ09ERShORVhUU09ORyAgICAsMTYzKSAgIFwKKyAgIEtFWV9DT0RFKFBMQVlQQVVTRSAgICwxNjQpICAgXAorICAgS0VZX0NPREUoUFJFVklPVVNTT05HLDE2NSkgICBcCisgICBLRVlfQ09ERShTVE9QQ0QgICAgICAsMTY2KSAgIFwKKyAgIEtFWV9DT0RFKFJFQ09SRCAgICAgICwxNjcpICAgXAorICAgS0VZX0NPREUoUkVXSU5EICAgICAgLDE2OCkgICBcCisgICBLRVlfQ09ERShQSE9ORSAgICAgICAsMTY5KSAgIFwKKyAgIEtFWV9DT0RFKElTTyAgICAgICAgICwxNzApICAgXAorICAgS0VZX0NPREUoQ09ORklHICAgICAgLDE3MSkgICBcCisgICBLRVlfQ09ERShIT01FUEFHRSAgICAsMTcyKSAgIFwKKyAgIEtFWV9DT0RFKFJFRlJFU0ggICAgICwxNzMpICAgXAorICAgS0VZX0NPREUoRVhJVCAgICAgICAgLDE3NCkgICBcCisgICBLRVlfQ09ERShNT1ZFICAgICAgICAsMTc1KSAgIFwKKyAgIEtFWV9DT0RFKEVESVQgICAgICAgICwxNzYpICAgXAorICAgS0VZX0NPREUoU0NST0xMVVAgICAgLDE3NykgICBcCisgICBLRVlfQ09ERShTQ1JPTExET1dOICAsMTc4KSAgIFwKKyAgIEtFWV9DT0RFKEtQTEVGVFBBUkVOICwxNzkpICAgXAorICAgS0VZX0NPREUoS1BSSUdIVFBBUkVOLDE4MCkgICBcCisgICBLRVlfQ09ERShORVcgICAgICAgICAsMTgxKSAgIFwKKyAgIEtFWV9DT0RFKFJFRE8gICAgICAgICwxODIpICAgXAorICAgS0VZX0NPREUoRjEzICAgICAgICAgLDE4MykgICBcCisgICBLRVlfQ09ERShGMTQgICAgICAgICAsMTg0KSAgIFwKKyAgIEtFWV9DT0RFKEYxNSAgICAgICAgICwxODUpICAgXAorICAgS0VZX0NPREUoRjE2ICAgICAgICAgLDE4NikgICBcCisgICBLRVlfQ09ERShGMTcgICAgICAgICAsMTg3KSAgIFwKKyAgIEtFWV9DT0RFKEYxOCAgICAgICAgICwxODgpICAgXAorICAgS0VZX0NPREUoRjE5ICAgICAgICAgLDE4OSkgICBcCisgICBLRVlfQ09ERShGMjAgICAgICAgICAsMTkwKSAgIFwKKyAgIEtFWV9DT0RFKEYyMSAgICAgICAgICwxOTEpICAgXAorICAgS0VZX0NPREUoRjIyICAgICAgICAgLDE5MikgICBcCisgICBLRVlfQ09ERShGMjMgICAgICAgICAsMTkzKSAgIFwKKyAgIEtFWV9DT0RFKEYyNCAgICAgICAgICwxOTQpICAgXAorICAgS0VZX0NPREUoUExBWUNEICAgICAgLDIwMCkgICBcCisgICBLRVlfQ09ERShQQVVTRUNEICAgICAsMjAxKSAgIFwKKyAgIEtFWV9DT0RFKFBST0czICAgICAgICwyMDIpICAgXAorICAgS0VZX0NPREUoUFJPRzQgICAgICAgLDIwMykgICBcCisgICBLRVlfQ09ERShTVVNQRU5EICAgICAsMjA1KSAgIFwKKyAgIEtFWV9DT0RFKENMT1NFICAgICAgICwyMDYpICAgXAorICAgS0VZX0NPREUoUExBWSAgICAgICAgLDIwNykgICBcCisgICBLRVlfQ09ERShGQVNURk9SV0FSRCAsMjA4KSAgIFwKKyAgIEtFWV9DT0RFKEJBU1NCT09TVCAgICwyMDkpICAgXAorICAgS0VZX0NPREUoUFJJTlQgICAgICAgLDIxMCkgICBcCisgICBLRVlfQ09ERShIUCAgICAgICAgICAsMjExKSAgIFwKKyAgIEtFWV9DT0RFKENBTUVSQSAgICAgICwyMTIpICAgXAorICAgS0VZX0NPREUoU09VTkQgICAgICAgLDIxMykgICBcCisgICBLRVlfQ09ERShRVUVTVElPTiAgICAsMjE0KSAgIFwKKyAgIEtFWV9DT0RFKEVNQUlMICAgICAgICwyMTUpICAgXAorICAgS0VZX0NPREUoQ0hBVCAgICAgICAgLDIxNikgICBcCisgICBLRVlfQ09ERShTRUFSQ0ggICAgICAsMjE3KSAgIFwKKyAgIEtFWV9DT0RFKENPTk5FQ1QgICAgICwyMTgpICAgXAorICAgS0VZX0NPREUoRklOQU5DRSAgICAgLDIxOSkgICBcCisgICBLRVlfQ09ERShTUE9SVCAgICAgICAsMjIwKSAgIFwKKyAgIEtFWV9DT0RFKFNIT1AgICAgICAgICwyMjEpICAgXAorICAgS0VZX0NPREUoQUxURVJBU0UgICAgLDIyMikgICBcCisgICBLRVlfQ09ERShDQU5DRUwgICAgICAsMjIzKSAgIFwKKyAgIEtFWV9DT0RFKEJSSUdIVE5FU1NET1dOLDIyNCkgICBcCisgICBLRVlfQ09ERShCUklHSFRORVNTVVAsMjI1KSAgIFwKKyAgIEtFWV9DT0RFKE1FRElBICAgICAgICwyMjYpICAgXAorICAgS0VZX0NPREUoU1RBUiAgICAgICAgLDIyNykgICBcCisgICBLRVlfQ09ERShTSEFSUCAgICAgICAsMjI4KSAgIFwKKyAgIEtFWV9DT0RFKFNPRlQxICAgICAgICwyMjkpICAgXAorICAgS0VZX0NPREUoU09GVDIgICAgICAgLDIzMCkgICBcCisgICBLRVlfQ09ERShTRU5EICAgICAgICAsMjMxKSAgIFwKKyAgIEtFWV9DT0RFKENFTlRFUiAgICAgICwyMzIpICAgXAorICAgS0VZX0NPREUoSEVBRFNFVEhPT0sgLDIzMykgICBcCisgICBLRVlfQ09ERSgwXzUgICAgICAgICAsMjM0KSAgIFwKKyAgIEtFWV9DT0RFKDJfNSAgICAgICAgICwyMzUpICAgXAorICAgS0VZX0NPREUoU1dJVENIVklERU9NT0RFLDIzNikgICBcCisgICBLRVlfQ09ERShLQkRJTExVTVRPR0dMRSwyMzcpICAgXAorICAgS0VZX0NPREUoS0JESUxMVU1ET1dOLDIzOCkgICBcCisgICBLRVlfQ09ERShLQkRJTExVTVVQICAsMjM5KSAgIFwKKyAgIEtFWV9DT0RFKFJFUExZICAgICAgICwyMzIpICAgXAorICAgS0VZX0NPREUoRk9SV0FSRE1BSUwgLDIzMykgICBcCisgICBLRVlfQ09ERShTQVZFICAgICAgICAsMjM0KSAgIFwKKyAgIEtFWV9DT0RFKERPQ1VNRU5UUyAgICwyMzUpICAgXAorICAgS0VZX0NPREUoQkFUVEVSWSAgICAgLDIzNikgICBcCisgICBLRVlfQ09ERShVTktOT1dOICAgICAsMjQwKSAgIFwKKyAgIEtFWV9DT0RFKE5VTSAgICAgICAgICwyNDEpICAgXAorICAgS0VZX0NPREUoRk9DVVMgICAgICAgLDI0MikgICBcCisgICBLRVlfQ09ERShQTFVTICAgICAgICAsMjQzKSAgIFwKKyAgIEtFWV9DT0RFKE5PVElGSUNBVElPTiwyNDQpICAgXAorICAgS0VZX0NPREUoT0sgICAgICAgICAgLDB4MTYwKSAgXAorICAgS0VZX0NPREUoU0VMRUNUICAgICAgLDB4MTYxKSAgXAorICAgS0VZX0NPREUoR09UTyAgICAgICAgLDB4MTYyKSAgXAorICAgS0VZX0NPREUoQ0xFQVIgICAgICAgLDB4MTYzKSAgXAorICAgS0VZX0NPREUoUE9XRVIyICAgICAgLDB4MTY0KSAgXAorICAgS0VZX0NPREUoT1BUSU9OICAgICAgLDB4MTY1KSAgXAorICAgS0VZX0NPREUoSU5GTyAgICAgICAgLDB4MTY2KSAgXAorICAgS0VZX0NPREUoVElNRSAgICAgICAgLDB4MTY3KSAgXAorICAgS0VZX0NPREUoVkVORE9SICAgICAgLDB4MTY4KSAgXAorICAgS0VZX0NPREUoQVJDSElWRSAgICAgLDB4MTY5KSAgXAorICAgS0VZX0NPREUoUFJPR1JBTSAgICAgLDB4MTZhKSAgXAorICAgS0VZX0NPREUoQ0hBTk5FTCAgICAgLDB4MTZiKSAgXAorICAgS0VZX0NPREUoRkFWT1JJVEVTICAgLDB4MTZjKSAgXAorICAgS0VZX0NPREUoRVBHICAgICAgICAgLDB4MTZkKSAgXAorICAgS0VZX0NPREUoUFZSICAgICAgICAgLDB4MTZlKSAgXAorICAgS0VZX0NPREUoTUhQICAgICAgICAgLDB4MTZmKSAgXAorICAgS0VZX0NPREUoTEFOR1VBR0UgICAgLDB4MTcwKSAgXAorICAgS0VZX0NPREUoVElUTEUgICAgICAgLDB4MTcxKSAgXAorICAgS0VZX0NPREUoU1VCVElUTEUgICAgLDB4MTcyKSAgXAorICAgS0VZX0NPREUoQU5HTEUgICAgICAgLDB4MTczKSAgXAorICAgS0VZX0NPREUoWk9PTSAgICAgICAgLDB4MTc0KSAgXAorICAgS0VZX0NPREUoTU9ERSAgICAgICAgLDB4MTc1KSAgXAorICAgS0VZX0NPREUoS0VZQk9BUkQgICAgLDB4MTc2KSAgXAorICAgS0VZX0NPREUoU0NSRUVOICAgICAgLDB4MTc3KSAgXAorICAgS0VZX0NPREUoUEMgICAgICAgICAgLDB4MTc4KSAgXAorICAgS0VZX0NPREUoVFYgICAgICAgICAgLDB4MTc5KSAgXAorICAgS0VZX0NPREUoVFYyICAgICAgICAgLDB4MTdhKSAgXAorICAgS0VZX0NPREUoVkNSICAgICAgICAgLDB4MTdiKSAgXAorICAgS0VZX0NPREUoVkNSMiAgICAgICAgLDB4MTdjKSAgXAorICAgS0VZX0NPREUoU0FUICAgICAgICAgLDB4MTdkKSAgXAorICAgS0VZX0NPREUoU0FUMiAgICAgICAgLDB4MTdlKSAgXAorICAgS0VZX0NPREUoQ0QgICAgICAgICAgLDB4MTdmKSAgXAorICAgS0VZX0NPREUoVEFQRSAgICAgICAgLDB4MTgwKSAgXAorICAgS0VZX0NPREUoUkFESU8gICAgICAgLDB4MTgxKSAgXAorICAgS0VZX0NPREUoVFVORVIgICAgICAgLDB4MTgyKSAgXAorICAgS0VZX0NPREUoUExBWUVSICAgICAgLDB4MTgzKSAgXAorICAgS0VZX0NPREUoVEVYVCAgICAgICAgLDB4MTg0KSAgXAorICAgS0VZX0NPREUoRFZEICAgICAgICAgLDB4MTg1KSAgXAorICAgS0VZX0NPREUoQVVYICAgICAgICAgLDB4MTg2KSAgXAorICAgS0VZX0NPREUoTVAzICAgICAgICAgLDB4MTg3KSAgXAorICAgS0VZX0NPREUoQVVESU8gICAgICAgLDB4MTg4KSAgXAorICAgS0VZX0NPREUoVklERU8gICAgICAgLDB4MTg5KSAgXAorICAgS0VZX0NPREUoRElSRUNUT1JZICAgLDB4MThhKSAgXAorICAgS0VZX0NPREUoTElTVCAgICAgICAgLDB4MThiKSAgXAorICAgS0VZX0NPREUoTUVNTyAgICAgICAgLDB4MThjKSAgXAorICAgS0VZX0NPREUoQ0FMRU5EQVIgICAgLDB4MThkKSAgXAorICAgS0VZX0NPREUoUkVEICAgICAgICAgLDB4MThlKSAgXAorICAgS0VZX0NPREUoR1JFRU4gICAgICAgLDB4MThmKSAgXAorICAgS0VZX0NPREUoWUVMTE9XICAgICAgLDB4MTkwKSAgXAorICAgS0VZX0NPREUoQkxVRSAgICAgICAgLDB4MTkxKSAgXAorICAgS0VZX0NPREUoQ0hBTk5FTFVQICAgLDB4MTkyKSAgXAorICAgS0VZX0NPREUoQ0hBTk5FTERPV04gLDB4MTkzKSAgXAorICAgS0VZX0NPREUoRklSU1QgICAgICAgLDB4MTk0KSAgXAorICAgS0VZX0NPREUoTEFTVCAgICAgICAgLDB4MTk1KSAgXAorICAgS0VZX0NPREUoQUIgICAgICAgICAgLDB4MTk2KSAgXAorICAgS0VZX0NPREUoTkVYVCAgICAgICAgLDB4MTk3KSAgXAorICAgS0VZX0NPREUoUkVTVEFSVCAgICAgLDB4MTk4KSAgXAorICAgS0VZX0NPREUoU0xPVyAgICAgICAgLDB4MTk5KSAgXAorICAgS0VZX0NPREUoU0hVRkZMRSAgICAgLDB4MTlhKSAgXAorICAgS0VZX0NPREUoQlJFQUsgICAgICAgLDB4MTliKSAgXAorICAgS0VZX0NPREUoUFJFVklPVVMgICAgLDB4MTljKSAgXAorICAgS0VZX0NPREUoRElHSVRTICAgICAgLDB4MTlkKSAgXAorICAgS0VZX0NPREUoVEVFTiAgICAgICAgLDB4MTllKSAgXAorICAgS0VZX0NPREUoVFdFTiAgICAgICAgLDB4MTlmKSAgXAorICAgS0VZX0NPREUoREVMX0VPTCAgICAgLDB4MWMwKSAgXAorICAgS0VZX0NPREUoREVMX0VPUyAgICAgLDB4MWMxKSAgXAorICAgS0VZX0NPREUoSU5TX0xJTkUgICAgLDB4MWMyKSAgXAorICAgS0VZX0NPREUoREVMX0xJTkUgICAgLDB4MWMzKSAgXAorICAgS0VZX0NPREUoRk4gICAgICAgICAgLDB4MWQwKSAgXAorICAgS0VZX0NPREUoRk5fRVNDICAgICAgLDB4MWQxKSAgXAorICAgS0VZX0NPREUoRk5fRjEgICAgICAgLDB4MWQyKSAgXAorICAgS0VZX0NPREUoRk5fRjIgICAgICAgLDB4MWQzKSAgXAorICAgS0VZX0NPREUoRk5fRjMgICAgICAgLDB4MWQ0KSAgXAorICAgS0VZX0NPREUoRk5fRjQgICAgICAgLDB4MWQ1KSAgXAorICAgS0VZX0NPREUoRk5fRjUgICAgICAgLDB4MWQ2KSAgXAorICAgS0VZX0NPREUoRk5fRjYgICAgICAgLDB4MWQ3KSAgXAorICAgS0VZX0NPREUoRk5fRjcgICAgICAgLDB4MWQ4KSAgXAorICAgS0VZX0NPREUoRk5fRjggICAgICAgLDB4MWQ5KSAgXAorICAgS0VZX0NPREUoRk5fRjkgICAgICAgLDB4MWRhKSAgXAorICAgS0VZX0NPREUoRk5fRjEwICAgICAgLDB4MWRiKSAgXAorICAgS0VZX0NPREUoRk5fRjExICAgICAgLDB4MWRjKSAgXAorICAgS0VZX0NPREUoRk5fRjEyICAgICAgLDB4MWRkKSAgXAorICAgS0VZX0NPREUoRk5fMSAgICAgICAgLDB4MWRlKSAgXAorICAgS0VZX0NPREUoRk5fMiAgICAgICAgLDB4MWRmKSAgXAorICAgS0VZX0NPREUoRk5fRCAgICAgICAgLDB4MWUwKSAgXAorICAgS0VZX0NPREUoRk5fRSAgICAgICAgLDB4MWUxKSAgXAorICAgS0VZX0NPREUoRk5fRiAgICAgICAgLDB4MWUyKSAgXAorICAgS0VZX0NPREUoRk5fUyAgICAgICAgLDB4MWUzKSAgXAorICAgS0VZX0NPREUoRk5fQiAgICAgICAgLDB4MWU0KSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDEgICAgLDB4MWYxKSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDIgICAgLDB4MWYyKSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDMgICAgLDB4MWYzKSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDQgICAgLDB4MWY0KSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDUgICAgLDB4MWY1KSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDYgICAgLDB4MWY2KSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDcgICAgLDB4MWY3KSAgXAorICAgS0VZX0NPREUoQlJMX0RPVDggICAgLDB4MWY4KSAgXAorCisjdW5kZWYgIEtFWV9DT0RFCisjZGVmaW5lIEtFWV9DT0RFKG4sdikgICBHTFVFKEtFWV8sbikgPSB2LAordHlwZWRlZiBlbnVtIHsKKyAgICBFVkVOVF9LRVlfTElTVAorfSBFdmVudEtleUNvZGU7CisjdW5kZWYgIEtFWV9DT0RFCisKKworI2RlZmluZSAgRVZFTlRfQlROX0xJU1QgIFwKKyAgICBCVE5fQ09ERShNSVNDLDB4MTAwKSAgXAorICAgIEJUTl9DT0RFKDAsMHgxMDApICAgICBcCisgICAgQlROX0NPREUoMSwweDEwMSkgICAgIFwKKyAgICBCVE5fQ09ERSgyLDB4MTAyKSAgICAgXAorICAgIEJUTl9DT0RFKDMsMHgxMDMpICAgICBcCisgICAgQlROX0NPREUoNCwweDEwNCkgICAgIFwKKyAgICBCVE5fQ09ERSg1LDB4MTA1KSAgICAgXAorICAgIEJUTl9DT0RFKDYsMHgxMDYpICAgICBcCisgICAgQlROX0NPREUoNywweDEwNykgICAgIFwKKyAgICBCVE5fQ09ERSg4LDB4MTA4KSAgICAgXAorICAgIEJUTl9DT0RFKDksMHgxMDkpICAgICBcCisgICAgXAorICAgIEJUTl9DT0RFKE1PVVNFLCAgMHgxMTApICBcCisgICAgQlROX0NPREUoTEVGVCwgICAweDExMCkgIFwKKyAgICBCVE5fQ09ERShSSUdIVCwgIDB4MTExKSAgXAorICAgIEJUTl9DT0RFKE1JRERMRSwgMHgxMTIpICBcCisgICAgQlROX0NPREUoU0lERSwgICAweDExMykgIFwKKyAgICBCVE5fQ09ERShFWFRSQSwgIDB4MTE0KSAgXAorICAgIEJUTl9DT0RFKEZPUldBUkQsMHgxMTUpICBcCisgICAgQlROX0NPREUoQkFDSywgICAweDExNikgIFwKKyAgICBCVE5fQ09ERShUQVNLLCAgIDB4MTE3KSAgXAorICAgIFwKKyAgICBCVE5fQ09ERShKT1lTVElDSywweDEyMCkgIFwKKyAgICBCVE5fQ09ERShUUklHR0VSLCAweDEyMCkgIFwKKyAgICBCVE5fQ09ERShUSFVNQiwgICAweDEyMSkgIFwKKyAgICBCVE5fQ09ERShUSFVNQjIsICAweDEyMikgIFwKKyAgICBCVE5fQ09ERShUT1AsICAgICAweDEyMykgIFwKKyAgICBCVE5fQ09ERShUT1AyLCAgICAweDEyNCkgIFwKKyAgICBCVE5fQ09ERShQSU5LSUUsICAweDEyNSkgIFwKKyAgICBCVE5fQ09ERShCQVNFLCAgICAweDEyNikgIFwKKyAgICBCVE5fQ09ERShCQVNFMiwgICAweDEyNykgIFwKKyAgICBCVE5fQ09ERShCQVNFMywgICAweDEyOCkgIFwKKyAgICBCVE5fQ09ERShCQVNFNCwgICAweDEyOSkgIFwKKyAgICBCVE5fQ09ERShCQVNFNSwgICAweDEyYSkgIFwKKyAgICBCVE5fQ09ERShCQVNFNiwgICAweDEyYikgIFwKKyAgICBCVE5fQ09ERShERUFELCAgICAweDEyZikgIFwKKyAgICBcCisgICAgQlROX0NPREUoR0FNRVBBRCwgIDB4MTMwKSAgXAorICAgIEJUTl9DT0RFKEEsICAgICAgICAweDEzMCkgIFwKKyAgICBCVE5fQ09ERShCLCAgICAgICAgMHgxMzEpICBcCisgICAgQlROX0NPREUoQywgICAgICAgIDB4MTMyKSAgXAorICAgIEJUTl9DT0RFKFgsICAgICAgICAweDEzMykgIFwKKyAgICBCVE5fQ09ERShZLCAgICAgICAgMHgxMzQpICBcCisgICAgQlROX0NPREUoWiwgICAgICAgIDB4MTM1KSAgXAorICAgIEJUTl9DT0RFKFRMLCAgICAgICAweDEzNikgIFwKKyAgICBCVE5fQ09ERShUUiwgICAgICAgMHgxMzcpICBcCisgICAgQlROX0NPREUoVEwyLCAgICAgIDB4MTM4KSAgXAorICAgIEJUTl9DT0RFKFRSMiwgICAgICAweDEzOSkgIFwKKyAgICBCVE5fQ09ERShTRUxFQ1QsICAgMHgxM2EpICBcCisgICAgQlROX0NPREUoU1RBUlQsICAgIDB4MTNiKSAgXAorICAgIEJUTl9DT0RFKE1PREUsICAgICAweDEzYykgIFwKKyAgICBCVE5fQ09ERShUSFVNQkwsICAgMHgxM2QpICBcCisgICAgQlROX0NPREUoVEhVTUJSLCAgIDB4MTNlKSAgXAorICAgIFwKKyAgICBCVE5fQ09ERShESUdJLCAgICAgICAgICAgIDB4MTQwKSAgXAorICAgIEJUTl9DT0RFKFRPT0xfUEVOLCAgICAgICAgMHgxNDApICBcCisgICAgQlROX0NPREUoVE9PTF9SVUJCRVIsICAgICAweDE0MSkgIFwKKyAgICBCVE5fQ09ERShUT09MX0JSVVNILCAgICAgIDB4MTQyKSAgXAorICAgIEJUTl9DT0RFKFRPT0xfUEVOQ0lMLCAgICAgMHgxNDMpICBcCisgICAgQlROX0NPREUoVE9PTF9BSVJCUlVTSCwgICAweDE0NCkgIFwKKyAgICBCVE5fQ09ERShUT09MX0ZJTkdFUiwgICAgIDB4MTQ1KSAgXAorICAgIEJUTl9DT0RFKFRPT0xfTU9VU0UsICAgICAgMHgxNDYpICBcCisgICAgQlROX0NPREUoVE9PTF9MRU5TLCAgICAgICAweDE0NykgIFwKKyAgICBCVE5fQ09ERShUT1VDSCwgICAgICAgICAgIDB4MTRhKSAgXAorICAgIEJUTl9DT0RFKFNUWUxVUywgICAgICAgICAgMHgxNGIpICBcCisgICAgQlROX0NPREUoU1RZTFVTMiwgICAgICAgICAweDE0YykgIFwKKyAgICBCVE5fQ09ERShUT09MX0RPVUJMRVRBUCwgIDB4MTRkKSAgXAorICAgIEJUTl9DT0RFKFRPT0xfVFJJUExFVEFQLCAgMHgxNGUpICBcCisgICAgXAorICAgIEJUTl9DT0RFKFdIRUVMLCAgMHgxNTApICAgICAgXAorICAgIEJUTl9DT0RFKEdFQVJfRE9XTiwgIDB4MTUwKSAgXAorICAgIEJUTl9DT0RFKEdFQVJfVVAsICAgIDB4MTUwKQorCisjdW5kZWYgIEJUTl9DT0RFCisjZGVmaW5lIEJUTl9DT0RFKG4sdikgICBHTFVFKEJUTl8sbikgPSB2LAordHlwZWRlZiBlbnVtIHsKKyAgICBFVkVOVF9CVE5fTElTVAorfSBFdmVudEJ0bkNvZGU7CisjdW5kZWYgIEJUTl9DT0RFCisKKyNkZWZpbmUgIEVWRU5UX1JFTF9MSVNUIFwKKyAgICBSRUxfQ09ERShYLCAgMHgwMCkgIFwKKyAgICBSRUxfQ09ERShZLCAgMHgwMSkKKworI2RlZmluZSAgUkVMX0NPREUobix2KSAgR0xVRShSRUxfLG4pID0gdiwKK3R5cGVkZWYgZW51bSB7CisgICAgRVZFTlRfUkVMX0xJU1QKK30gRXZlbnRSZWxDb2RlOworI3VuZGVmICBSRUxfQ09ERQorCisjZGVmaW5lICBFVkVOVF9BQlNfTElTVCAgXAorICAgIEFCU19DT0RFKFgsICAgICAgICAweDAwKSAgXAorICAgIEFCU19DT0RFKFksICAgICAgICAweDAxKSAgXAorICAgIEFCU19DT0RFKFosICAgICAgICAweDAyKSAgXAorICAgIEFCU19DT0RFKFJYLCAgICAgICAweDAzKSAgXAorICAgIEFCU19DT0RFKFJZLCAgICAgICAweDA0KSAgXAorICAgIEFCU19DT0RFKFJaLCAgICAgICAweDA1KSAgXAorICAgIEFCU19DT0RFKFRIUk9UVExFLCAweDA2KSAgXAorICAgIEFCU19DT0RFKFJVRERFUiwgICAweDA3KSAgXAorICAgIEFCU19DT0RFKFdIRUVMLCAgICAweDA4KSAgXAorICAgIEFCU19DT0RFKEdBUywgICAgICAweDA5KSAgXAorICAgIEFCU19DT0RFKEJSQUtFLCAgICAweDBhKSAgXAorICAgIEFCU19DT0RFKEhBVDBYLCAgICAweDEwKSAgXAorICAgIEFCU19DT0RFKEhBVDBZLCAgICAweDExKSAgXAorICAgIEFCU19DT0RFKEhBVDFYLCAgICAweDEyKSAgXAorICAgIEFCU19DT0RFKEhBVDFZLCAgICAweDEzKSAgXAorICAgIEFCU19DT0RFKEhBVDJYLCAgICAweDE0KSAgXAorICAgIEFCU19DT0RFKEhBVDJZLCAgICAweDE1KSAgXAorICAgIEFCU19DT0RFKEhBVDNYLCAgICAweDE2KSAgXAorICAgIEFCU19DT0RFKEhBVDNZLCAgICAweDE3KSAgXAorICAgIEFCU19DT0RFKFBSRVNTVVJFLCAweDE4KSAgXAorICAgIEFCU19DT0RFKERJU1RBTkNFLCAweDE5KSAgXAorICAgIEFCU19DT0RFKFRJTFRfWCwgICAweDFhKSAgXAorICAgIEFCU19DT0RFKFRJTFRfWSwgICAweDFiKSAgXAorICAgIEFCU19DT0RFKFRPT0xfV0lEVEgsIDB4MWMpICBcCisgICAgQUJTX0NPREUoVk9MVU1FLCAgICAgMHgyMCkgIFwKKyAgICBBQlNfQ09ERShNSVNDLCAgICAgICAweDI4KSAgXAorICAgIEFCU19DT0RFKE1BWCwgICAgICAgIDB4M2YpCisKKyNkZWZpbmUgIEFCU19DT0RFKG4sdikgIEdMVUUoQUJTXyxuKSA9IHYsCisKK3R5cGVkZWYgZW51bSB7CisgICAgRVZFTlRfQUJTX0xJU1QKK30gRXZlbnRBYnNDb2RlOworI3VuZGVmICBBQlNfQ09ERQorCisvKiBjb252ZXJ0IGFuIGV2ZW50IHN0cmluZyBzcGVjaWZpY2F0aW9uIGxpa2UgPHR5cGU+Ojxjb2RlPjo8dmFsdWU+CisgKiBpbnRvIHRocmVlIGludGVnZXJzLiByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorICovCitleHRlcm4gaW50ICAgYW5kcm9pZF9ldmVudF9mcm9tX3N0ciggY29uc3QgY2hhciogIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgKnB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICpwY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAqcHZhbHVlICk7CisKKy8qIHJldHVybnMgdGhlIGxpc3Qgb2YgdmFsaWQgZXZlbnQgdHlwZSBzdHJpbmcgYWxpYXNlcyAqLworZXh0ZXJuIGludCAgICBhbmRyb2lkX2V2ZW50X2dldF90eXBlX2NvdW50KCB2b2lkICk7CitleHRlcm4gY2hhciogIGFuZHJvaWRfZXZlbnRfYnVmcHJpbnRfdHlwZV9zdHIoIGNoYXIqICBidWZmLCBjaGFyKiAgZW5kLCBpbnQgIHR5cGVfaW5kZXggKTsKKworLyogcmV0dXJucyB0aGUgbGlzdCBvZiB2YWxpZCBldmVudCBjb2RlIHN0cmluZyBhbGlhc2VzIGZvciBhIGdpdmVuIGV2ZW50IHR5cGUgKi8KK2V4dGVybiBpbnQgICAgYW5kcm9pZF9ldmVudF9nZXRfY29kZV9jb3VudCggaW50ICB0eXBlICk7CitleHRlcm4gY2hhciogIGFuZHJvaWRfZXZlbnRfYnVmcHJpbnRfY29kZV9zdHIoIGNoYXIqICBidWZmLCBjaGFyKiAgZW5kLCBpbnQgIHR5cGUsIGludCAgY29kZV9pbmRleCApOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWZpbmdlcnByaW50LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctZmluZ2VycHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI5OWNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWZpbmdlcnByaW50LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWZpbmdlcnByaW50LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lICBFKC4uLikgICAgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSAgVyguLi4pICAgIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSAgRCguLi4pICBWRVJCT1NFX1BSSU5UKGluaXQsX19WQV9BUkdTX18pCisjZGVmaW5lICBWKC4uLikgIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgICAgICAgIEFsbCB0aGUgZGVjbGFyYXRpb25zCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBId0ZpbmdlcnByaW50Q2xpZW50ICAgSHdGaW5nZXJwcmludENsaWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFFlbXVkU2VydmljZSogICAgICAgICAgIHFlbXVfbGlzdGVuX3NlcnZpY2U7CisgICAgSHdGaW5nZXJwcmludENsaWVudCogICAgZnBfY2xpZW50czsKKyAgICBpbnQzMl90ICAgICBmaW5nZXJpZDsKKyAgICBpbnQzMl90ICAgICBmaW5nZXJfaXNfb25fc2Vuc29yOworfSBId0ZpbmdlcnByaW50U2VydmljZTsKKworc3RydWN0IEh3RmluZ2VycHJpbnRDbGllbnQgeworICAgIEh3RmluZ2VycHJpbnRDbGllbnQqICAgIG5leHQ7CisgICAgSHdGaW5nZXJwcmludFNlcnZpY2UqICAgICAgICAgIGZwOworICAgIFFlbXVkQ2xpZW50KiAgICAgICAgICAgIHFlbXVfY2xpZW50OworfTsKKworc3RhdGljIHZvaWQKK19od0ZpbmdlcnByaW50Q2xpZW50X3JlY3Yodm9pZCogb3BhcXVlLCB1aW50OF90KiBtc2csIGludCBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqICBjbGllbnQgKTsKKworc3RhdGljIHZvaWQKK19od0ZpbmdlcnByaW50Q2xpZW50X2Nsb3NlKHZvaWQqIG9wYXF1ZSk7CisKK3N0YXRpYyBId0ZpbmdlcnByaW50Q2xpZW50KgorX2h3RmluZ2VycHJpbnRDbGllbnRfbmV3KCBId0ZpbmdlcnByaW50U2VydmljZSogIGZwKTsKKworLyogdGhlIG9ubHkgc3RhdGljIHZhcmlhYmxlICovCitzdGF0aWMgSHdGaW5nZXJwcmludFNlcnZpY2UgX2ZpbmdlcnByaW50U3RhdGVbMV07CisKK3N0YXRpYyB2b2lkIF9od0ZpbmdlcnByaW50X3NlbmQoKTsKKworc3RhdGljIFFlbXVkQ2xpZW50KgorX2h3RmluZ2VycHJpbnRfY29ubmVjdCh2b2lkKiAgb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2UqICBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudF9wYXJhbSk7CitzdGF0aWMgdm9pZAorX2h3RmluZ2VycHJpbnRDbGllbnRfcmVtb3ZlRnJvbUxpc3QoSHdGaW5nZXJwcmludENsaWVudCoqIHBoZWFkLAorICAgICAgICBId0ZpbmdlcnByaW50Q2xpZW50KiB0YXJnZXQpOworCitzdGF0aWMgdm9pZCBfaHdGaW5nZXJwcmludF9zYXZlKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzdiwgdm9pZCogb3BhcXVlKTsKKworc3RhdGljIGludCBfaHdGaW5nZXJwcmludF9sb2FkKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzdiwgdm9pZCogb3BhcXVlKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICAgICBBbGwgdGhlIHB1YmxpYyBtZXRob2RzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCithbmRyb2lkX2h3X2ZpbmdlcnByaW50X2luaXQoIHZvaWQgKQoreworICAgIEh3RmluZ2VycHJpbnRTZXJ2aWNlKiAgZnAgPSBfZmluZ2VycHJpbnRTdGF0ZTsKKworICAgIGlmIChmcC0+cWVtdV9saXN0ZW5fc2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIGZwLT5xZW11X2xpc3Rlbl9zZXJ2aWNlID0gcWVtdWRfc2VydmljZV9yZWdpc3RlcigiZmluZ2VycHJpbnRsaXN0ZW4iLCAwLCBmcCwKKyAgICAgICAgICAgICAgICBfaHdGaW5nZXJwcmludF9jb25uZWN0LCBfaHdGaW5nZXJwcmludF9zYXZlLCBfaHdGaW5nZXJwcmludF9sb2FkKTsKKyAgICAgICAgRCgiJXM6IGZpbmdlcnByaW50IHFlbXVkIGxpc3RlbiBzZXJ2aWNlIGluaXRpYWxpemVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKwordm9pZAorYW5kcm9pZF9od19maW5nZXJwcmludF90b3VjaChpbnQgZmluZ2VyaWQpCit7CisgICAgSHdGaW5nZXJwcmludFNlcnZpY2UqICBmcCA9IF9maW5nZXJwcmludFN0YXRlOworICAgIEQoInRvdWNoZWQgZmluZ2VycHJpbnQgc2Vuc29yIHdpdGggZmluZ2VyIGlkICVkXG4iLCBmaW5nZXJpZCk7CisgICAgZnAtPmZpbmdlcmlkID0gZmluZ2VyaWQ7CisgICAgZnAtPmZpbmdlcl9pc19vbl9zZW5zb3IgPSAxOworICAgIF9od0ZpbmdlcnByaW50X3NlbmQoKTsKK30KKwordm9pZAorYW5kcm9pZF9od19maW5nZXJwcmludF9yZW1vdmUoKQoreworICAgIEh3RmluZ2VycHJpbnRTZXJ2aWNlKiAgZnAgPSBfZmluZ2VycHJpbnRTdGF0ZTsKKyAgICBEKCJmaW5nZXIgcmVtb3ZlZCBmcm9tIHRoZSBmaW5nZXJwcmludCBzZW5zb3JcbiIpOworICAgIGZwLT5maW5nZXJfaXNfb25fc2Vuc29yID0gMDsKKyAgICBfaHdGaW5nZXJwcmludF9zZW5kKCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgICAgICAgICBBbGwgdGhlIHN0YXRpYyBtZXRob2RzCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBfaHdGaW5nZXJwcmludF9zYXZlKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzdiwgdm9pZCogb3BhcXVlKSB7CisgICAgSHdGaW5nZXJwcmludFNlcnZpY2UqIGZwID0gb3BhcXVlOworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBmcC0+ZmluZ2VyaWQpOworICAgIHN0cmVhbV9wdXRfYmUzMihmLCBmcC0+ZmluZ2VyX2lzX29uX3NlbnNvcik7Cit9CisKK3N0YXRpYyBpbnQgX2h3RmluZ2VycHJpbnRfbG9hZChTdHJlYW0qIGYsIFFlbXVkU2VydmljZSogc3YsIHZvaWQqIG9wYXF1ZSkgeworICAgIEh3RmluZ2VycHJpbnRTZXJ2aWNlKiBmcCA9IG9wYXF1ZTsKKyAgICBmcC0+ZmluZ2VyaWQgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgZnAtPmZpbmdlcl9pc19vbl9zZW5zb3IgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitfaHdGaW5nZXJwcmludF9zZW5kKCkKK3sKKyAgICBId0ZpbmdlcnByaW50U2VydmljZSogIGZwID0gX2ZpbmdlcnByaW50U3RhdGU7CisgICAgSHdGaW5nZXJwcmludENsaWVudCogICAgZnBfY2xpZW50ID0gZnAtPmZwX2NsaWVudHM7CisgICAgaWYgKCFmcF9jbGllbnQpCisgICAgICAgIHJldHVybjsKKworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgaWYgKGZwLT5maW5nZXJfaXNfb25fc2Vuc29yKSB7CisgICAgICAgIC8qIHNlbmQgYmFjayB0aGUgZmluZ2VyIGlkIHRoYXQgaXMgb24gdGhlIGZpbmdlciBwcmludCBzZW5zb3IgKi8KKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAtIDEsICJvbjolZCIsIGZwX2NsaWVudC0+ZnAtPmZpbmdlcmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpIC0gMSwgIm9mZiIpOworICAgIH0KKyAgICBxZW11ZF9jbGllbnRfc2VuZChmcF9jbGllbnQtPnFlbXVfY2xpZW50LCAoY29uc3QgdWludDhfdCopYnVmZmVyLAorICAgICAgICAgICAgc3RybGVuKGJ1ZmZlcikrMSAvKmFkZCAxIGZvciAnXDAnKi8pOworfQorCitzdGF0aWMgUWVtdWRDbGllbnQqCitfaHdGaW5nZXJwcmludF9jb25uZWN0KHZvaWQqICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZSogIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgIGludCAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xpZW50X3BhcmFtKQoreworICAgIEh3RmluZ2VycHJpbnRTZXJ2aWNlKiAgZnAgPSBvcGFxdWU7CisgICAgSHdGaW5nZXJwcmludENsaWVudCogICAgZnBfY2xpZW50ID0gX2h3RmluZ2VycHJpbnRDbGllbnRfbmV3KGZwKTsKKyAgICBRZW11ZENsaWVudCogICAgY2xpZW50ICA9IHFlbXVkX2NsaWVudF9uZXcoc2VydmljZSwgY2hhbm5lbCwgY2xpZW50X3BhcmFtLCBmcF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaHdGaW5nZXJwcmludENsaWVudF9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2h3RmluZ2VycHJpbnRDbGllbnRfY2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBubyBzYXZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIG5vIGxvYWQgKi8gKTsKKyAgICBxZW11ZF9jbGllbnRfc2V0X2ZyYW1pbmcoY2xpZW50LCAxKTsKKyAgICBmcF9jbGllbnQtPnFlbXVfY2xpZW50ID0gY2xpZW50OworCisgICAgRCgiJXM6IGNvbm5lY3QgZmluZ2VyIHByaW50IGxpc3RlbiBpcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIGNsaWVudDsKK30KKworc3RhdGljIHZvaWQKK19od0ZpbmdlcnByaW50Q2xpZW50X3JlY3Yodm9pZCogb3BhcXVlLCB1aW50OF90KiBtc2csIGludCBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgUWVtdWRDbGllbnQqICBjbGllbnQgKQoreworICAgIC8qIEh3RmluZ2VycHJpbnRDbGllbnQqICAgICAgIGZwX2NsaWVudCA9IG9wYXF1ZTsgKi8KKyAgICBEKCJnb3QgbWVzc2FnZSBmcm9tIGd1ZXN0IHN5c3RlbSBmaW5nZXJwcmludCBIQUxcbiIpOworfQorCitzdGF0aWMgSHdGaW5nZXJwcmludENsaWVudCoKK19od0ZpbmdlcnByaW50Q2xpZW50X25ldyggSHdGaW5nZXJwcmludFNlcnZpY2UqICBmcCkKK3sKKyAgICBId0ZpbmdlcnByaW50Q2xpZW50KiAgZnBfY2xpZW50OworICAgIEFORVcwKGZwX2NsaWVudCk7CisgICAgZnBfY2xpZW50LT5mcCA9IGZwOworICAgIGZwX2NsaWVudC0+bmV4dCA9IGZwLT5mcF9jbGllbnRzOworICAgIGZwLT5mcF9jbGllbnRzID0gZnBfY2xpZW50OworICAgIHJldHVybiBmcF9jbGllbnQ7Cit9CisKK3N0YXRpYyB2b2lkCitfaHdGaW5nZXJwcmludENsaWVudF9jbG9zZSh2b2lkKiBvcGFxdWUpCit7CisgICAgSHdGaW5nZXJwcmludENsaWVudCogICAgICAgZnBfY2xpZW50ID0gb3BhcXVlOworICAgIGlmIChmcF9jbGllbnQtPmZwKSB7CisgICAgICAgIEh3RmluZ2VycHJpbnRDbGllbnQqKiBwbm9kZSA9ICZmcF9jbGllbnQtPmZwLT5mcF9jbGllbnRzOworICAgICAgICBfaHdGaW5nZXJwcmludENsaWVudF9yZW1vdmVGcm9tTGlzdChwbm9kZSwgZnBfY2xpZW50KTsKKyAgICAgICAgZnBfY2xpZW50LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgZnBfY2xpZW50LT5mcCA9IE5VTEw7CisgICAgfQorICAgIEFGUkVFKGZwX2NsaWVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitfaHdGaW5nZXJwcmludENsaWVudF9yZW1vdmVGcm9tTGlzdChId0ZpbmdlcnByaW50Q2xpZW50KiogcGhlYWQsIEh3RmluZ2VycHJpbnRDbGllbnQqIHRhcmdldCkKK3sKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEh3RmluZ2VycHJpbnRDbGllbnQqIG5vZGUgPSAqcGhlYWQ7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG5vZGUgPT0gdGFyZ2V0KSB7CisgICAgICAgICAgICAqcGhlYWQgPSB0YXJnZXQtPm5leHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwaGVhZCA9ICZub2RlLT5uZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1maW5nZXJwcmludC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWZpbmdlcnByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyYTBjNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1maW5nZXJwcmludC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvKiBpbml0aWFsaXplICovCitleHRlcm4gdm9pZCAgYW5kcm9pZF9od19maW5nZXJwcmludF9pbml0KCB2b2lkICk7CisKKy8qIHRvdWNoIGZpbmdlcnByaW50IHNlbnNvciB3aXRoIGZpbmdlcmlkKi8KK3ZvaWQgYW5kcm9pZF9od19maW5nZXJwcmludF90b3VjaChpbnQgZmluZ2VyaWQpOworCisvKiB0YWtlIGZpbmdlciBvZmYgdGhlIGZpbmdlcnByaW50IHNlbnNvciAqLwordm9pZCBhbmRyb2lkX2h3X2ZpbmdlcnByaW50X3JlbW92ZSgpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWttc2cuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1rbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MDQxMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1rbXNnLmMKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvaHcta21zZy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitzdGF0aWMgQ1NlcmlhbExpbmUqIGFuZHJvaWRfa21zZ19zZXJpYWxfbGluZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIENTZXJpYWxMaW5lKiBzZXJpYWxfbGluZTsKKyAgICBBbmRyb2lkS21zZ0ZsYWdzIGZsYWdzOworfSBLZXJuZWxMb2c7CisKK3N0YXRpYyBpbnQga2VybmVsX2xvZ19jYW5fcmVhZCh2b2lkKiBvcGFxdWUpIHsKKyAgICByZXR1cm4gMTAyNDsKK30KKworc3RhdGljIHZvaWQga2VybmVsX2xvZ19yZWFkKHZvaWQqIG9wYXF1ZSwgY29uc3QgdWludDhfdCogZnJvbSwgaW50IGxlbikgeworICAgIEtlcm5lbExvZyogayA9IG9wYXF1ZTsKKworICAgIGlmIChrLT5mbGFncyAmIEFORFJPSURfS01TR19QUklOVF9NRVNTQUdFUykgeworICAgICAgICBwcmludGYoIiUuKnMiLCBsZW4sIChjb25zdCBjaGFyKilmcm9tKTsKKyAgICB9CisKKyAgICAvKiBYWFhYOiBUT0RPOiBzYXZlIG1lc3NhZ2VzIGludG8gaW4tbWVtb3J5IGJ1ZmZlciBmb3IgbGF0ZXIgcmV0cmlldmFsICovCit9CisKK3N0YXRpYyBib29sIGtlcm5lbF9sb2dfaW5pdChLZXJuZWxMb2cqIGssIEFuZHJvaWRLbXNnRmxhZ3MgZmxhZ3MpIHsKKyAgICBpZiAoYW5kcm9pZF9zZXJpYWxsaW5lX3BpcGVfb3Blbigmay0+c2VyaWFsX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZHJvaWRfa21zZ19zZXJpYWxfbGluZSkgPCAwKSB7CisgICAgICAgIGRlcnJvciggImNvdWxkIG5vdCBjcmVhdGUga2VybmVsIGxvZyBjaGFycGlwZSIgKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycyhrLT5zZXJpYWxfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2xvZ19jYW5fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2xvZ19yZWFkKTsKKyAgICBrLT5mbGFncyA9IGZsYWdzOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgS2VybmVsTG9nICBfa2VybmVsX2xvZ1sxXTsKKworYm9vbAorYW5kcm9pZF9rbXNnX2luaXQoQW5kcm9pZEttc2dGbGFncyBmbGFncykgeworICAgIGlmIChfa2VybmVsX2xvZy0+c2VyaWFsX2xpbmUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4ga2VybmVsX2xvZ19pbml0KF9rZXJuZWxfbG9nLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKK0NTZXJpYWxMaW5lKiBhbmRyb2lkX2ttc2dfZ2V0X3NlcmlhbF9saW5lKHZvaWQpIHsKKyAgICBpZiAoYW5kcm9pZF9rbXNnX3NlcmlhbF9saW5lID09IE5VTEwpIHsKKyAgICAgICAgYW5kcm9pZF9rbXNnX2luaXQoMCk7CisgICAgfQorICAgIHJldHVybiBhbmRyb2lkX2ttc2dfc2VyaWFsX2xpbmU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHcta21zZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWttc2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzcyYmYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWttc2cuaApAQCAtMCwwICsxLDMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLyogdGhpcyBjaGFyZHJpdmVyIGlzIHVzZWQgdG8gcmVhZCB0aGUga2VybmVsIG1lc3NhZ2VzIGNvbWluZworICogZnJvbSB0aGUgZmlyc3Qgc2VyaWFsIHBvcnQgKGkuZS4gL2Rldi90dHlTMCkgYW5kIHN0b3JlIHRoZW0KKyAqIGluIG1lbW9yeSBmb3IgbGF0ZXIuLi4KKyAqLworCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfS01TR19TQVZFX01FU1NBR0VTICA9ICgxIDw8IDApLAorICAgIEFORFJPSURfS01TR19QUklOVF9NRVNTQUdFUyA9ICgxIDw8IDEpLAorfSBBbmRyb2lkS21zZ0ZsYWdzOworCitleHRlcm4gYm9vbCAgYW5kcm9pZF9rbXNnX2luaXQoQW5kcm9pZEttc2dGbGFncyBmbGFncyk7CisKK2V4dGVybiBDU2VyaWFsTGluZSogYW5kcm9pZF9rbXNnX2dldF9zZXJpYWxfbGluZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1sY2QuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1sY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMzYjk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWxjZC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9ody1sY2QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jvb3QtcHJvcGVydGllcy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQKK2h3TGNkX21hcERlbnNpdHkoaW50IGRlbnNpdHkpIHsKKyAgICAvKiBNYXAgZGVuc2l0eSB0byBvbmUgb2Ygb3VyIGJ1Y2tldCB2YWx1ZXMuCisgICAgICAgVGhlIFRWIGRlbnNpdHkgaXMgYSBiaXQgcGFydGljdWxhciAoYW5kIG5vdCBhY3R1YWxseSBhIGJ1Y2tldAorICAgICAgIHZhbHVlKSBzbyB3ZSBkbyBvbmx5IGV4YWN0IG1hdGNoIG9uIGl0LgorICAgICovCisgICAgaWYgKGRlbnNpdHkgIT0gTENEX0RFTlNJVFlfVFZEUEkpIHsKKyAgICAgICAgaWYgKGRlbnNpdHkgPCAoTENEX0RFTlNJVFlfTERQSSArIExDRF9ERU5TSVRZX01EUEkpLzIpCisgICAgICAgICAgICBkZW5zaXR5ID0gTENEX0RFTlNJVFlfTERQSTsKKyAgICAgICAgZWxzZSBpZiAoZGVuc2l0eSA8IChMQ0RfREVOU0lUWV9NRFBJICsgTENEX0RFTlNJVFlfSERQSSkvMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV9NRFBJOworICAgICAgICBlbHNlIGlmIChkZW5zaXR5IDwgKExDRF9ERU5TSVRZX0hEUEkgKyBMQ0RfREVOU0lUWV8yNjBEUEkpLzIpCisgICAgICAgICAgICBkZW5zaXR5ID0gTENEX0RFTlNJVFlfSERQSTsKKyAgICAgICAgZWxzZSBpZiAoZGVuc2l0eSA8IChMQ0RfREVOU0lUWV8yNjBEUEkgKyBMQ0RfREVOU0lUWV8yODBEUEkpLzIpCisgICAgICAgICAgICBkZW5zaXR5ID0gTENEX0RFTlNJVFlfMjYwRFBJOworICAgICAgICBlbHNlIGlmIChkZW5zaXR5IDwgKExDRF9ERU5TSVRZXzI4MERQSSArIExDRF9ERU5TSVRZXzMwMERQSSkvMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV8yODBEUEk7CisgICAgICAgIGVsc2UgaWYgKGRlbnNpdHkgPCAoTENEX0RFTlNJVFlfMzAwRFBJICsgTENEX0RFTlNJVFlfWEhEUEkpLzIpCisgICAgICAgICAgICBkZW5zaXR5ID0gTENEX0RFTlNJVFlfMzAwRFBJOworICAgICAgICBlbHNlIGlmIChkZW5zaXR5IDwgKExDRF9ERU5TSVRZX1hIRFBJICsgTENEX0RFTlNJVFlfMzQwRFBJKS8yKQorICAgICAgICAgICAgZGVuc2l0eSA9IExDRF9ERU5TSVRZX1hIRFBJOworICAgICAgICBlbHNlIGlmIChkZW5zaXR5IDwgKExDRF9ERU5TSVRZXzM0MERQSSArIExDRF9ERU5TSVRZXzM2MERQSSkvMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV8zNDBEUEk7CisgICAgICAgIGVsc2UgaWYgKGRlbnNpdHkgPCAoTENEX0RFTlNJVFlfMzYwRFBJICsgTENEX0RFTlNJVFlfNDAwRFBJKS8yKQorICAgICAgICAgICAgZGVuc2l0eSA9IExDRF9ERU5TSVRZXzM2MERQSTsKKyAgICAgICAgZWxzZSBpZiAoZGVuc2l0eSA8IChMQ0RfREVOU0lUWV80MDBEUEkgKyBMQ0RfREVOU0lUWV80MjBEUEkpIC8gMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV80MDBEUEk7CisgICAgICAgIGVsc2UgaWYgKGRlbnNpdHkgPCAoTENEX0RFTlNJVFlfNDIwRFBJICsgTENEX0RFTlNJVFlfWFhIRFBJKSAvIDIpCisgICAgICAgICAgICBkZW5zaXR5ID0gTENEX0RFTlNJVFlfNDIwRFBJOworICAgICAgICBlbHNlIGlmIChkZW5zaXR5IDwgKExDRF9ERU5TSVRZX1hYSERQSSArIExDRF9ERU5TSVRZXzU2MERQSSkvMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV9YWEhEUEk7CisgICAgICAgIGVsc2UgaWYgKGRlbnNpdHkgPCAoTENEX0RFTlNJVFlfNTYwRFBJICsgTENEX0RFTlNJVFlfWFhYSERQSSkvMikKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV81NjBEUEk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbnNpdHkgPSBMQ0RfREVOU0lUWV9YWFhIRFBJOworICAgIH0KKyAgICByZXR1cm4gZGVuc2l0eTsKK30KKworCit2b2lkCitod0xjZF9zZXRCb290UHJvcGVydHkoaW50IGRlbnNpdHkpCit7CisgICAgY2hhciAgdGVtcFs4XTsKKyAgICBpbnQgbWFwcGVkX2RlbnNpdHk7CisKKyAgICBtYXBwZWRfZGVuc2l0eSA9IGh3TGNkX21hcERlbnNpdHkoZGVuc2l0eSk7CisKKworICAgIHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiJWQiLCBtYXBwZWRfZGVuc2l0eSk7CisgICAgYm9vdF9wcm9wZXJ0eV9hZGQoInFlbXUuc2YubGNkX2RlbnNpdHkiLCB0ZW1wKTsKK30KKworaHdMY2Rfc2NyZWVuU2l6ZV90IGh3TGNkX2dldFNjcmVlblNpemUoaW50IGhlaWdodFB4LCBpbnQgd2lkdGhQeCwgaW50IGRlbnNpdHkpIHsKKyAgICBkb3VibGUgc2NyZWVuX2luY2hlcyA9IHNxcnQocG93KChkb3VibGUpaGVpZ2h0UHggLyBkZW5zaXR5LCAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93KChkb3VibGUpd2lkdGhQeCAvIGRlbnNpdHksIDIpKTsKKworICAgIGlmIChzY3JlZW5faW5jaGVzID49IDcuNSkgeworICAgICAgICByZXR1cm4gTENEX1NJWkVfWExBUkdFOworICAgIH0KKyAgICBpZiAoc2NyZWVuX2luY2hlcyA+PSA1KSB7CisgICAgICAgIHJldHVybiBMQ0RfU0laRV9MQVJHRTsKKyAgICB9CisgICAgaWYgKHNjcmVlbl9pbmNoZXMgPj0gMy42KSB7CisgICAgICAgIHJldHVybiBMQ0RfU0laRV9OT1JNQUw7CisgICAgfQorICAgIHJldHVybiBMQ0RfU0laRV9TTUFMTDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1sY2QuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1sY2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGUyYWUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LWxjZC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjZGVmaW5lICBMQ0RfREVOU0lUWV9MRFBJICAgICAgMTIwCisjZGVmaW5lICBMQ0RfREVOU0lUWV9NRFBJICAgICAgMTYwCisjZGVmaW5lICBMQ0RfREVOU0lUWV9UVkRQSSAgICAgMjEzCisjZGVmaW5lICBMQ0RfREVOU0lUWV9IRFBJICAgICAgMjQwCisjZGVmaW5lICBMQ0RfREVOU0lUWV8yNjBEUEkgICAgMjYwCisjZGVmaW5lICBMQ0RfREVOU0lUWV8yODBEUEkgICAgMjgwCisjZGVmaW5lICBMQ0RfREVOU0lUWV8zMDBEUEkgICAgMzAwCisjZGVmaW5lICBMQ0RfREVOU0lUWV9YSERQSSAgICAgMzIwCisjZGVmaW5lICBMQ0RfREVOU0lUWV8zNDBEUEkgICAgMzQwCisjZGVmaW5lICBMQ0RfREVOU0lUWV8zNjBEUEkgICAgMzYwCisjZGVmaW5lICBMQ0RfREVOU0lUWV80MDBEUEkgICAgNDAwCisjZGVmaW5lICBMQ0RfREVOU0lUWV80MjBEUEkgICAgNDIwCisjZGVmaW5lICBMQ0RfREVOU0lUWV9YWEhEUEkgICAgNDgwCisjZGVmaW5lICBMQ0RfREVOU0lUWV81NjBEUEkgICAgNTYwCisjZGVmaW5lICBMQ0RfREVOU0lUWV9YWFhIRFBJICAgNjQwCisKK3R5cGVkZWYgZW51bSBod0xjZF9zY3JlZW5TaXplIHsKKyAgICBMQ0RfU0laRV9TTUFMTCwKKyAgICBMQ0RfU0laRV9OT1JNQUwsCisgICAgTENEX1NJWkVfTEFSR0UsCisgICAgTENEX1NJWkVfWExBUkdFCit9IGh3TGNkX3NjcmVlblNpemVfdDsKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogU2V0cyB0aGUgYm9vdCBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbXVsYXRlZCBhYnN0cmFjdCBMQ0QgZGVuc2l0eSAqLworZXh0ZXJuIHZvaWQgaHdMY2Rfc2V0Qm9vdFByb3BlcnR5KGludCBkZW5zaXR5KTsKKworZXh0ZXJuIGh3TGNkX3NjcmVlblNpemVfdCBod0xjZF9nZXRTY3JlZW5TaXplKGludCBoZWlnaHRQeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGhQeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVuc2l0eSk7CisKKy8qIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseS4KKyAqIEl0IGlzIHB1YmxpYyBvbmx5IHRvIGFsbG93IHVuaXQgdGVzdGluZy4KKyAqLworZXh0ZXJuIGludCBod0xjZF9tYXBEZW5zaXR5KGludCBkZW5zaXR5KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctbGNkX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1sY2RfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzVhMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctbGNkX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC9ody1sY2QuaCIKKworbmFtZXNwYWNlIGxjZF9kZW5zaXR5IHsKKworVEVTVChId19sY2QsIE1hcERlbnNpdHkpIHsKKworICAgIEVYUEVDVF9FUShMQ0RfREVOU0lUWV9UVkRQSSwgICBod0xjZF9tYXBEZW5zaXR5KExDRF9ERU5TSVRZX1RWRFBJKSk7CisKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfTERQSSwgICAgaHdMY2RfbWFwRGVuc2l0eSgxMTApKTsKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfMjYwRFBJLCAgaHdMY2RfbWFwRGVuc2l0eSgyNjYpKTsKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfMjgwRFBJLCAgaHdMY2RfbWFwRGVuc2l0eSgyNzIpKTsKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfNTYwRFBJLCAgaHdMY2RfbWFwRGVuc2l0eSg1OTApKTsKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfWFhYSERQSSwgaHdMY2RfbWFwRGVuc2l0eSg2MTApKTsKKyAgICBFWFBFQ1RfRVEoTENEX0RFTlNJVFlfWFhYSERQSSwgaHdMY2RfbWFwRGVuc2l0eSg5OTkpKTsKK30KKworVEVTVChId19sY2QsIEdldFNjcmVlblNpemUpIHsKKworICAgIC8vIE1hZGUtdXAgZGV2aWNlICgzLjQgaW5jaGVzKQorICAgIEVYUEVDVF9FUShMQ0RfU0laRV9TTUFMTCwgIGh3TGNkX2dldFNjcmVlblNpemUoIDI0MCwgIDQ4MCwgTENEX0RFTlNJVFlfTURQSSkpOworCisgICAgLy8gTmV4dXMgNSAoNC45NSBpbmNoZXMpCisgICAgRVhQRUNUX0VRKExDRF9TSVpFX05PUk1BTCwgaHdMY2RfZ2V0U2NyZWVuU2l6ZSgxMDgwLCAxOTIwLCBMQ0RfREVOU0lUWV9YWEhEUEkpKTsKKworICAgIC8vIE5leHVzIDV4ICg1LjIgaW5jaGVzKQorICAgIEVYUEVDVF9FUShMQ0RfU0laRV9MQVJHRSwgIGh3TGNkX2dldFNjcmVlblNpemUoMTA4MCwgMTkyMCwgTENEX0RFTlNJVFlfNDIwRFBJKSk7CisKKyAgICAvLyBOZXh1cyA5ICg4Ljg2IGluY2hlcykKKyAgICBFWFBFQ1RfRVEoTENEX1NJWkVfWExBUkdFLCBod0xjZF9nZXRTY3JlZW5TaXplKDIwNDgsIDE1MzYsIExDRF9ERU5TSVRZX1hIRFBJKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBkZW5zaXR5CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctcWVtdWQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXFlbXVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDZhZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXFlbXVkLmNwcApAQCAtMCwwICsxLDIwOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC9ody1xZW11ZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9xZW11ZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lICBEKC4uLikgICAgVkVSQk9TRV9QUklOVChxZW11ZCxfX1ZBX0FSR1NfXykKKworLyoKKyAqICBUaGlzIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlICdxZW11ZCcgbXVsdGlwbGV4aW5nIGNvbW11bmljYXRpb24KKyAqICBjaGFubmVsIGJldHdlZW4gY2xpZW50cyBydW5uaW5nIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0gYW5kICdzZXJ2aWNlcycKKyAqICBwcm92aWRlZCBieSB0aGUgZW11bGF0b3IuCisgKgorICogIEZvciBhZGRpdGlvbmFsIGRldGFpbHMsIHBsZWFzZSByZWFkIGRvY3MvQU5EUk9JRC1RRU1VRC5UWFQKKyAqCisgKi8KKworLyoKKyAqIElNUExFTUVOVEFUSU9OIERFVEFJTFM6CisgKgorICogV2UgdXNlIG9uZSBjaGFycGlwZSB0byBjb25uZWN0IHRoZSBlbXVsYXRlZCBzZXJpYWwgcG9ydCB0byB0aGUgJ1FlbXVkU2VyaWFsJworICogb2JqZWN0LiBUaGlzIG9iamVjdCBpcyB1c2VkIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBzZXJpYWwgcG9ydCwgYW5kCisgKiB1bmZyYW1lIG1lc3NhZ2VzIChpLmUuIGV4dHJhY3QgcGF5bG9hZCBsZW5ndGggKyBjaGFubmVsIGlkIGZyb20gaGVhZGVyLAorICogdGhlbiB0aGUgcGF5bG9hZCBpdHNlbGYpLCBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIGEgZ2VuZXJpYyByZWNlaXZlci4KKyAqCisgKiBUaGUgUWVtdWRTZXJpYWwgb2JqZWN0IGNhbiBhbHNvIGJlIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0byB0aGUgZGFlbW9uCisgKiB0aHJvdWdoIHRoZSBzZXJpYWwgcG9ydCAoc2VlIHFlbXVkX3NlcmlhbF9zZW5kKCkpCisgKgorICogVGhlIG11bHRpcGxleGVyIGlzIGNvbm5lY3RlZCB0byBvbmUgb3IgbW9yZSAnc2VydmljZScgb2JqZWN0cy4KKyAqIGFyZSB0aGVtc2VsdmVzIGNvbm5lY3RlZCB0aHJvdWdoIGEgY2hhcnBpcGUgdG8gYW4gZW11bGF0ZWQgZGV2aWNlIG9yCisgKiBjb250cm9sIHN1Yi1tb2R1bGUgaW4gdGhlIGVtdWxhdG9yLgorICoKKyAqICB0dHkgPD09Y2hhcnBpcGU9PT4gUWVtdWRTZXJpYWwgLS0tPiBRZW11ZE11bHRpcGxleGVyIC0tLS0+IFFlbXVkQ2xpZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICovCisKKy8qIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgc2VyaWFsIGNoYXJwaXBlIHRoYXQgbXVzdCBiZSBwYXNzZWQKKyAqIHRvIHRoZSBlbXVsYXRlZCB0dHkgaW1wbGVtZW50YXRpb24uIFRoZSBvdGhlciBlbmQgb2YgdGhlCisgKiBjaGFycGlwZSBtdXN0IGJlIHBhc3NlZCB0byBxZW11ZF9tdWx0aXBsZXhlcl9pbml0KCkuCisgKi8KK3N0YXRpYyBDU2VyaWFsTGluZSogYW5kcm9pZF9xZW11ZF9zZXJpYWxfbGluZSA9IE5VTEw7CisKK0NTZXJpYWxMaW5lKiBhbmRyb2lkX3FlbXVkX2dldF9zZXJpYWxfbGluZSh2b2lkKSB7CisgICAgaWYgKCFhbmRyb2lkX3FlbXVkX3NlcmlhbF9saW5lKSB7CisgICAgICAgIENTZXJpYWxMaW5lKiBzbEluOworICAgICAgICBDU2VyaWFsTGluZSogc2xPdXQ7CisgICAgICAgIGlmIChhbmRyb2lkX3NlcmlhbGxpbmVfcGlwZV9vcGVuKCZzbEluLCAmc2xPdXQpIDwgMCkgeworICAgICAgICAgICAgZGVycm9yKCAiJXM6IGNhbid0IGNyZWF0ZSBjaGFycGlwZSB0byBzZXJpYWwgcG9ydCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyApOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGFuZHJvaWRfcWVtdWRfaW5pdChzbE91dCk7CisgICAgICAgIGFuZHJvaWRfcWVtdWRfc2VyaWFsX2xpbmUgPSBzbEluOworICAgIH0KKworICAgIHJldHVybiBhbmRyb2lkX3FlbXVkX3NlcmlhbF9saW5lOworfQorCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KKyAqIEl0IGFsbG93cyB5b3UgdG8gaW1wbGVtZW50IGEgZ2l2ZW4gcWVtdWQtYmFzZWQgc2VydmljZSB0aHJvdWdoCisgKiBhIGNoYXJwaXBlLgorICoKKyAqIEluIG90aGVyIHdvcmRzLCB0aGlzIGltcGxlbWVudHMgYSBRZW11ZFNlcnZpY2UgYW5kIGNvcnJlc3BvbmRpbmcKKyAqIFFlbXVkQ2xpZW50IHRoYXQgY29ubmVjdHMgYSBxZW11ZCBjbGllbnQgcnVubmluZyBpbiB0aGUgZW11bGF0ZWQKKyAqIHN5c3RlbSwgdG8gYSBDaGFyRHJpdmVyU3RhdGUgb2JqZWN0IGltcGxlbWVudGVkIHRocm91Z2ggYSBjaGFycGlwZS4KKyAqCisgKiAgIFFlbXVkQ2hhckNsaWVudCA8PT09Y2hhcnBpcGU9PT09PiAoY2hhciBkcml2ZXIgdXNlcikKKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgImdzbSIgc2VydmljZSB3aGVuIHRoZQorICogbW9kZW0gZW11bGF0aW9uIGlzIHByb3ZpZGVkIHRocm91Z2ggYW4gZXh0ZXJuYWwgc2VyaWFsIGRldmljZS4KKyAqCisgKiBBIFFlbXVkQ2hhclNlcnZpY2UgY2FuIGhhdmUgb25seSBvbmUgY2xpZW50IGJ5IGRlZmluaXRpb24uCisgKiBUaGVyZSBpcyBubyBRZW11ZENoYXJDbGllbnQgb2JqZWN0IGJlY2F1c2Ugd2UgY2FuIHN0b3JlIGEgc2luZ2xlCisgKiBDaGFyRHJpdmVyU3RhdGUgaGFuZGxlIGluIHRoZSAnb3BhcXVlJyBmaWVsZCBmb3Igc2ltcGxpY2l0eS4KKyAqLworCisvLyBBIHNpbXBsZSBzdHJ1Y3QgdG8gcGFzcyBzb21lIGRhdGEgdG8gcWVtdWQgY2xpZW50IGNhbGxiYWNrcworc3RydWN0IHFlbXVkX2NoYXJfY2xpZW50IHsKKyAgICBDU2VyaWFsTGluZSogc2w7CisgICAgUWVtdWRDbGllbnQqIGNsaWVudDsKK307CisKKy8qIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBtZXNzYWdlIGFycml2ZXMgZnJvbSBhIHFlbXVkIGNsaWVudC4KKyAqIHRoaXMgc2ltcGx5IHNlbmRzIHRoZSBtZXNzYWdlIHRocm91Z2ggdGhlIGNoYXJwaXBlIHRvIHRoZSB1c2VyLgorICovCitzdGF0aWMgdm9pZCBfcWVtdWRfY2hhcl9jbGllbnRfcmVjdih2b2lkKiBvcGFxdWUsIHVpbnQ4X3QqIG1zZywgaW50IG1zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50KiBjbGllbnQpIHsKKyAgICBxZW11ZF9jaGFyX2NsaWVudCogY29uc3QgZGF0YSA9IHN0YXRpY19jYXN0PHFlbXVkX2NoYXJfY2xpZW50Kj4ob3BhcXVlKTsKKyAgICBDU2VyaWFsTGluZSogc2wgPSBkYXRhLT5zbDsKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUoc2wsIG1zZywgbXNnbGVuKTsKK30KKworLyogd2UgZG9uJ3QgZXhwZWN0IGNsaWVudHMgb2YgY2hhci4gc2VydmljZXMgdG8gZXhpdC4gSnVzdAorICogcHJpbnQgYW4gZXJyb3IgdG8gc2lnbmFsIGFuIHVuZXhwZWN0ZWQgc2l0dWF0aW9uLiBXZSBzaG91bGQKKyAqIGJlIGFibGUgdG8gcmVjb3ZlciBmcm9tIHRoZXNlIHRob3VnaCwgc28gZG9uJ3QgcGFuaWMuCisgKi8KK3N0YXRpYyB2b2lkIF9xZW11ZF9jaGFyX2NsaWVudF9jbG9zZSh2b2lkKiBvcGFxdWUpIHsKKyAgICBxZW11ZF9jaGFyX2NsaWVudCogY29uc3QgZGF0YSA9IHN0YXRpY19jYXN0PHFlbXVkX2NoYXJfY2xpZW50Kj4ob3BhcXVlKTsKKyAgICBRZW11ZENsaWVudCogY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCisgICAgLyogQXQgdGhpcyBwb2ludCBtb2RlbSBkcml2ZXIgc3RpbGwgdXNlcyBjaGFyIHBpcGUgdG8gY29tbXVuaWNhdGUgd2l0aAorICAgICAqIGh3LXFlbXVkLCB3aGlsZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGd1ZXN0IGlzIGRvbmUgb3ZlciBxZW11IHBpcGUuCisgICAgICogU28sIHdoZW4gZ3Vlc3QgZGlzY29ubmVjdHMgZnJvbSB0aGUgcWVtdSBwaXBlLCBhbmQgZW11bGF0b3Itc2lkZSBjbGllbnQKKyAgICAgKiBnb2VzIHRocm91Z2ggdGhlIGRpc2Nvbm5lY3Rpb24gcHJvY2VzcywgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCwgc2luY2UgaXQKKyAgICAgKiBoYXMgYmVlbiBzZXQgdG8gY2FsbGVkIGR1cmluZyBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVW5sZXNzIG1vZGVtIGRyaXZlcgorICAgICAqIGlzIGNoYW5nZWQgdG8gZHJvcCBjaGFyIHBpcGUgY29tbXVuaWNhdGlvbiwgdGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkCisgICAgICogZHVlIHRvIGd1ZXN0IGRpc2Nvbm5lY3Rpb24uIEFzIGxvbmcgYXMgdGhlIGNsaWVudCB3YXMgYSBxZW11IHBpcGUgLSBiYXNlZAorICAgICAqIGNsaWVudCwgaXQncyBmaW5lLCBzaW5jZSB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byBkbyBhbnl0aGluZyBpbiB0aGlzIGNhc2UuCisgICAgICovCisgICAgaWYgKCFxZW11ZF9pc19waXBlX2NsaWVudChjbGllbnQpKSB7CisgICAgICAgIGRlcnJvcigidW5leHBlY3RlZCBxZW11ZCBjaGFyLiBjaGFubmVsIGNsb3NlIik7CisgICAgfQorfQorCisvKiBjYWxsZWQgYnkgdGhlIGNoYXJwaXBlIHRvIGtub3cgaG93IG11Y2ggZGF0YSBjYW4gYmUgcmVhZCBmcm9tCisgKiB0aGUgdXNlci4gU2luY2Ugd2Ugc2VuZCBldmVyeXRoaW5nIGRpcmVjdGx5IHRvIHRoZSBzZXJpYWwgcG9ydAorICogd2UgY2FuIHJldHVybiBhbiBhcmJpdHJhcnkgbnVtYmVyLgorICovCitzdGF0aWMgaW50IF9xZW11ZF9jaGFyX3NlcnZpY2VfY2FuX3JlYWQodm9pZCogb3BhcXVlKSB7CisgICAgcmV0dXJuIDgxOTI7ICAvKiB3aGF0ZXZlciAqLworfQorCisvKiBjYWxsZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGNoYXJwaXBlIGFuZCBzZW5kIGl0IHRvIHRoZSBjbGllbnQuCisgKiB1c2VkIHFlbXVkX3NlcnZpY2VfYnJvYWRjYXN0KCkgZXZlbiBpZiB0aGVyZSBpcyBhIHNpbmdsZSBjbGllbnQKKyAqIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBhIFFlbXVkQ2hhckNsaWVudCBvYmplY3QgdGhpcyB3YXkuCisgKi8KK3N0YXRpYyB2b2lkIF9xZW11ZF9jaGFyX3NlcnZpY2VfcmVhZCh2b2lkKiBvcGFxdWUsIGNvbnN0IHVpbnQ4X3QqIGZyb20sIGludCBsZW4pIHsKKyAgICBRZW11ZFNlcnZpY2UqIHN2ID0gc3RhdGljX2Nhc3Q8UWVtdWRTZXJ2aWNlKj4ob3BhcXVlKTsKKyAgICBxZW11ZF9zZXJ2aWNlX2Jyb2FkY2FzdChzdiwgZnJvbSwgbGVuKTsKK30KKworLyogY2FsbGVkIHdoZW4gYSBxZW11ZCBjbGllbnQgdHJpZXMgdG8gY29ubmVjdCB0byBhIGNoYXIuIHNlcnZpY2UuCisgKiB3ZSBzaW1wbHkgY3JlYXRlIGEgbmV3IGNsaWVudCBhbmQgb3BlbiB0aGUgY2hhcnBpcGUgdG8gcmVjZWl2ZQorICogZGF0YSBmcm9tIGl0LgorICovCitzdGF0aWMgUWVtdWRDbGllbnQqIF9xZW11ZF9jaGFyX3NlcnZpY2VfY29ubmVjdCh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZW11ZFNlcnZpY2UqIHN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGllbnRfcGFyYW0pIHsKKyAgICBDU2VyaWFsTGluZSogc2wgPSBzdGF0aWNfY2FzdDxDU2VyaWFsTGluZSo+KG9wYXF1ZSk7CisKKyAgICBxZW11ZF9jaGFyX2NsaWVudCogY29uc3QgZGF0YSA9IG5ldyBxZW11ZF9jaGFyX2NsaWVudCgpOworICAgIGRhdGEtPnNsID0gc2w7CisgICAgZGF0YS0+Y2xpZW50ID0gcWVtdWRfY2xpZW50X25ldyhzdiwgY2hhbm5lbCwgY2xpZW50X3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9xZW11ZF9jaGFyX2NsaWVudF9yZWN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3FlbXVkX2NoYXJfY2xpZW50X2Nsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisKKyAgICAvKiBub3cgd2UgY2FuIG9wZW4gdGhlIGdhdGVzIDotKSAqLworICAgIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycyhzbCwgc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9xZW11ZF9jaGFyX3NlcnZpY2VfY2FuX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9xZW11ZF9jaGFyX3NlcnZpY2VfcmVhZCk7CisKKyAgICByZXR1cm4gZGF0YS0+Y2xpZW50OworfQorCitzdGF0aWMgaW50IGFuZHJvaWRfcWVtdWRfY2hhbm5lbF9jb25uZWN0KGNvbnN0IGNoYXIqIG5hbWUsIENTZXJpYWxMaW5lKiBzbCkgeworICAgIHFlbXVkX3NlcnZpY2VfcmVnaXN0ZXIobmFtZSwgMSwgc2wsIF9xZW11ZF9jaGFyX3NlcnZpY2VfY29ubmVjdCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgYSBjaGFycGlwZSBlbmRwb2ludCB0aGF0IGNhbiBiZSB1c2VkIGJ5IGFuIGVtdWxhdGVkCisgKiBkZXZpY2Ugb3IgZXh0ZXJuYWwgc2VyaWFsIHBvcnQgdG8gaW1wbGVtZW50IGEgY2hhci4gc2VydmljZQorICovCitpbnQgYW5kcm9pZF9xZW11ZF9nZXRfY2hhbm5lbChjb25zdCBjaGFyKiBuYW1lLCBDU2VyaWFsTGluZSoqIHBzbCkgeworICAgIENTZXJpYWxMaW5lKiBzbDsKKworICAgIGlmIChhbmRyb2lkX3NlcmlhbGxpbmVfcGlwZV9vcGVuKCZzbCwgcHNsKSA8IDApIHsKKyAgICAgICAgZGVycm9yKCJjYW4ndCBvcGVuIGNoYXJwaXBlIGZvciAnJXMnIHFlbXVkIHNlcnZpY2UiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBhbmRyb2lkX3FlbXVkX2NoYW5uZWxfY29ubmVjdChuYW1lLCBzbCk7Cit9CisKKy8qIHNldCB0aGUgY2hhcmFjdGVyIGRyaXZlciBzdGF0ZSBmb3IgYSBnaXZlbiBxZW11ZCBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIHRoaXMKKyAqIGlzIHVzZWQgdG8gYXR0YWNoIHRoZSBjaGFubmVsIHRvIGFuIGV4dGVybmFsIGNoYXIgZHJpdmVyIGRldmljZSBkaXJlY3RseS4KKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgorICovCitpbnQgYW5kcm9pZF9xZW11ZF9zZXRfY2hhbm5lbChjb25zdCBjaGFyKiBuYW1lLCBDU2VyaWFsTGluZSogcGVlcl9zbCkgeworICAgIENTZXJpYWxMaW5lKiBidWZmZXIgPSBhbmRyb2lkX3NlcmlhbGxpbmVfYnVmZmVyX29wZW4ocGVlcl9zbCk7CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBhbmRyb2lkX3FlbXVkX2NoYW5uZWxfY29ubmVjdChuYW1lLCBidWZmZXIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXFlbXVkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaHctcWVtdWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODhiYWMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXFlbXVkLmgKQEAgLTAsMCArMSw1MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiByZXR1cm4gdGhlIGNoYXJhY3RlciBkcml2ZXIgc3RhdGUgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgY29ubmVjdGVkIHRvIHRoZQorICogZW11bGF0ZWQgc2VyaWFsIHBvcnQgd2hlcmUgYWxsIG11bHRpcGxleGVkIGNoYW5uZWxzIGdvIHRocm91Z2guCisgKi8KK2V4dGVybiBDU2VyaWFsTGluZSogYW5kcm9pZF9xZW11ZF9nZXRfc2VyaWFsX2xpbmUodm9pZCk7CisKKy8qIFJldHVybiBpbiB8KnBzbHwgYSBDU2VyaWFsTGluZSBvYmplY3QgdGhhdCB3aWxsIGJlIGNvbm5lY3RlZCB0bworICogYSBzaW5nbGUgY2xpZW50IGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0gZm9yIGEgZ2l2ZW4gbmFtZWQgc2VydmljZS4KKyAqCisgKiB0aGlzIGlzIG9ubHkgdXNlZCB0byBjb25uZWN0IEdQUyBhbmQgR1NNIHNlcnZpY2UgY2xpZW50cyB0byB0aGUKKyAqIGltcGxlbWVudGF0aW9uIHRoYXQgcmVxdWlyZXMgYSBDU2VyaWFsTGluZSBvYmplY3QgZm9yIGxlZ2FjeQorICogcmVhc29ucy4KKyAqCisgKiByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorICovCitleHRlcm4gaW50IGFuZHJvaWRfcWVtdWRfZ2V0X2NoYW5uZWwoY29uc3QgY2hhciogbmFtZSwgQ1NlcmlhbExpbmUqKiBwc2wpOworCisvKiBTZXQgYW4gZXhwbGljaXQgQ1NlcmlhbExpbmUgb2JqZWN0IGZvciBhIGdpdmVuIHFlbXVkIGNvbW11bmljYXRpb24gY2hhbm5lbC4gdGhpcworICogaXMgdXNlZCB0byBhdHRhY2ggdGhlIGNoYW5uZWwgdG8gYW4gZXh0ZXJuYWwgY2hhciBkcml2ZXIgZGV2aWNlIChlLmcuIG9uZQorICogY3JlYXRlZCB3aXRoICItc2VyaWFsIDxkZXZpY2U+IikgZGlyZWN0bHkuCisgKgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCisgKi8KK2V4dGVybiBpbnQgYW5kcm9pZF9xZW11ZF9zZXRfY2hhbm5lbChjb25zdCBjaGFyKiBuYW1lLCBDU2VyaWFsTGluZSogcGVlcl9zbCk7CisKKy8qIGxpc3Qgb2Yga25vd24gcWVtdWQgY2hhbm5lbCBuYW1lcyAqLworI2RlZmluZSAgQU5EUk9JRF9RRU1VRF9HU00gICAgICAiZ3NtIgorI2RlZmluZSAgQU5EUk9JRF9RRU1VRF9HUFMgICAgICAiZ3BzIgorI2RlZmluZSAgQU5EUk9JRF9RRU1VRF9DT05UUk9MICAiY29udHJvbCIKKyNkZWZpbmUgIEFORFJPSURfUUVNVURfU0VOU09SUyAgInNlbnNvcnMiCisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXNlbnNvcnMuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1zZW5zb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwNTc4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1zZW5zb3JzLmMKQEAgLTAsMCArMSw5MzMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2h3LXNlbnNvcnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcWVtdWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NlbnNvcnMtcG9ydC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjZGVmaW5lIEUoLi4uKSBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lIFcoLi4uKSBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgRCguLi4pIFZFUkJPU0VfUFJJTlQoc2Vuc29ycywgX19WQV9BUkdTX18pCisjZGVmaW5lIFYoLi4uKSBWRVJCT1NFX1BSSU5UKGluaXQsIF9fVkFfQVJHU19fKQorCisvKiBkZWZpbmUgVF9BQ1RJVkUgdG8gMSB0byBkZWJ1ZyB0cmFuc3BvcnQgY29tbXVuaWNhdGlvbnMgKi8KKyNkZWZpbmUgVF9BQ1RJVkUgMAorCisjaWYgVF9BQ1RJVkUKKyNkZWZpbmUgVCguLi4pIFZFUkJPU0VfUFJJTlQoc2Vuc29ycywgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBUKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLyogdGhpcyBjb2RlIHN1cHBvcnRzIGVtdWxhdGVkIHNlbnNvciBoYXJkd2FyZQorICoKKyAqIE5vdGUgdGhhdCBjdXJyZW50bHksIG9ubHkgdGhlIGFjY2VsZXJvbWV0ZXIgaXMgcmVhbGx5IGVtdWxhdGVkLCBhbmQgb25seQorICogZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIGF1dG8tcm90YXRpbmcgdGhlIHNjcmVlbiBpbiBrZXlib2FyZC1sZXNzCisgKiBjb25maWd1cmF0aW9ucy4KKyAqCisgKgorICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgaW50IGlkOworfSBfc1NlbnNvcnNbTUFYX1NFTlNPUlNdID0geworI2RlZmluZSBTRU5TT1JfKHgsIHkpIHt5LCBBTkRST0lEX1NFTlNPUl8jI3h9LAorICAgICAgICBTRU5TT1JTX0xJU1QKKyN1bmRlZiBTRU5TT1JfCit9OworCitzdGF0aWMgaW50IF9zZW5zb3JJZEZyb21OYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpbnQgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX1NFTlNPUlM7IG5uKyspCisgICAgICAgIGlmICghc3RyY21wKF9zU2Vuc29yc1tubl0ubmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gX3NTZW5zb3JzW25uXS5pZDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBfc2Vuc29yTmFtZUZyb21JZChpbnQgaWQpIHsKKyAgICBpbnQgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX1NFTlNPUlM7IG5uKyspCisgICAgICAgIGlmIChpZCA9PSBfc1NlbnNvcnNbbm5dLmlkKQorICAgICAgICAgICAgcmV0dXJuIF9zU2Vuc29yc1tubl0ubmFtZTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogRm9yIGNvbW1vbiBTZW5zb3IgVmFsdWUgc3RydWN0ICovCit0eXBlZGVmIHN0cnVjdCB7IGZsb2F0IGEsIGIsIGM7IH0gU2Vuc29yVmFsdWVzOworCit0eXBlZGVmIHN0cnVjdCB7IGZsb2F0IHgsIHksIHo7IH0gQWNjZWxlcmF0aW9uOworCit0eXBlZGVmIHN0cnVjdCB7IGZsb2F0IHgsIHksIHo7IH0gTWFnbmV0aWNGaWVsZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IGF6aW11dGg7CisgICAgZmxvYXQgcGl0Y2g7CisgICAgZmxvYXQgcm9sbDsKK30gT3JpZW50YXRpb247CisKK3R5cGVkZWYgc3RydWN0IHsgZmxvYXQgY2Vsc2l1czsgfSBUZW1wZXJhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgeyBmbG9hdCB2YWx1ZTsgfSBQcm94aW1pdHk7CisKK3R5cGVkZWYgc3RydWN0IHsgZmxvYXQgdmFsdWU7IH0gTGlnaHQ7CisKK3R5cGVkZWYgc3RydWN0IHsgZmxvYXQgdmFsdWU7IH0gUHJlc3N1cmU7CisKK3R5cGVkZWYgc3RydWN0IHsgZmxvYXQgdmFsdWU7IH0gSHVtaWRpdHk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBib29sIHZhbGlkOworICAgIGludCBsZW5ndGg7CisgICAgY2hhciB2YWx1ZVsxMjhdOworfSBTZXJpYWxpemVkU2Vuc29yOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYm9vbCBlbmFibGVkOworICAgIHVuaW9uIHsKKyAgICAgICAgU2Vuc29yVmFsdWVzIHZhbHVlOworICAgICAgICBBY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgICAgICBNYWduZXRpY0ZpZWxkIG1hZ25ldGljOworICAgICAgICBPcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKKyAgICAgICAgVGVtcGVyYXR1cmUgdGVtcGVyYXR1cmU7CisgICAgICAgIFByb3hpbWl0eSBwcm94aW1pdHk7CisgICAgICAgIExpZ2h0IGxpZ2h0OworICAgICAgICBQcmVzc3VyZSBwcmVzc3VyZTsKKyAgICAgICAgSHVtaWRpdHkgaHVtaWRpdHk7CisgICAgfSB1OworICAgIFNlcmlhbGl6ZWRTZW5zb3Igc2VyaWFsaXplZDsKK30gU2Vuc29yOworCisvKgorICogLSB3aGVuIHRoZSBxZW11LXNwZWNpZmljIHNlbnNvcnMgSEFMIG1vZHVsZSBzdGFydHMsIGl0IHNlbmRzCisgKiAgICJsaXN0LXNlbnNvcnMiCisgKgorICogLSB0aGlzIGNvZGUgcmVwbGllcyB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gaW50ZWdlciBjb3JyZXNwb25kaW5nCisgKiAgIHRvIGEgYml0bWFwIG9mIGF2YWlsYWJsZSBoYXJkd2FyZSBzZW5zb3JzIGluIHRoZSBjdXJyZW50IEFWRAorICogICBjb25maWd1cmF0aW9uIChlLmcuICIxIiBhLmsuYSAoMSA8PCBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT04pKQorICoKKyAqIC0gdGhlIEhBTCBtb2R1bGUgc2VuZHMgInNldDo8c2Vuc29yPjo8ZmxhZz4iIHRvIGVuYWJsZSBvciBkaXNhYmxlCisgKiAgIHRoZSByZXBvcnQgb2YgYSBnaXZlbiBzZW5zb3Igc3RhdGUuIDxzZW5zb3I+IG11c3QgYmUgdGhlIG5hbWUgb2YKKyAqICAgYSBnaXZlbiBzZW5zb3IgKGUuZy4gImFjY2VsZXJvbWV0ZXIiKSwgYW5kIDxmbGFnPiBtdXN0IGJlIGVpdGhlcgorICogICAiMSIgKHRvIGVuYWJsZSkgb3IgIjAiICh0byBkaXNhYmxlKS4KKyAqCisgKiAtIE9uY2UgYXQgbGVhc3Qgb25lIHNlbnNvciBpcyAiZW5hYmxlZCIsIHRoaXMgY29kZSBzaG91bGQgcGVyaW9kaWNhbGx5CisgKiAgIHNlbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvcnJlc3BvbmRpbmcgZW5hYmxlZCBzZW5zb3JzLiBUaGUgZGVmYXVsdAorICogICBwZXJpb2QgaXMgMjAwbXMuCisgKgorICogLSB0aGUgSEFMIG1vZHVsZSBzZW5kcyAic2V0LWRlbGF5OjxkZWxheT4iLCB3aGVyZSA8ZGVsYXk+IGlzIGFuIGludGVnZXIKKyAqICAgY29ycmVzcG9uZGluZyB0byBhIHRpbWUgZGVsYXkgaW4gbWlsbGktc2Vjb25kcy4gVGhpcyBjb3JyZXNwb25kcyB0bworICogICBhIG5ldyBpbnRlcnZhbCBiZXR3ZWVuIHNlbnNvciBldmVudHMgc2VudCBieSB0aGlzIGNvZGUgdG8gdGhlIEhBTAorICogICBtb2R1bGUuCisgKgorICogLSB0aGUgSEFMIG1vZHVsZSBjYW4gYWxzbyBzZW5kIGEgIndha2UiIGNvbW1hbmQuIFRoaXMgY29kZSBzaG91bGQgc2ltcGx5CisgKiAgIHNlbmQgdGhlICJ3YWtlIiBiYWNrIHRvIHRoZSBtb2R1bGUuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHdha2UgYQorICogICBibG9ja2luZyByZWFkIHRoYXQgaGFwcGVucyBpbiBhIGRpZmZlcmVudCB0aHJlYWQuIFRoaXMgcGluZy1wb25nIG1ha2VzCisgKiAgIHRoZSBjb2RlIGluIHRoZSBIQUwgbW9kdWxlIHZlcnkgc2ltcGxlLgorICoKKyAqIC0gZWFjaCB0aW1lciB0aWNrLCB0aGlzIGNvZGUgc2VuZHMgc2Vuc29yIHJlcG9ydHMgaW4gdGhlIGZvbGxvd2luZworICogICBmb3JtYXQgKGVhY2ggbGluZSBjb3JyZXNwb25kcyB0byBhIGRpZmZlcmVudCBsaW5lIHNlbnQgdG8gdGhlIG1vZHVsZSk6CisgKgorICogICAgICBhY2NlbGVyYXRpb246PHg+Ojx5Pjo8ej4KKyAqICAgICAgbWFnbmV0aWMtZmllbGQ6PHg+Ojx5Pjo8ej4KKyAqICAgICAgb3JpZW50YXRpb246PGF6aW11dGg+OjxwaXRjaD46PHJvbGw+CisgKiAgICAgIHRlbXBlcmF0dXJlOjxjZWxzaXVzPgorICogICAgICBsaWdodDo8bHV4PgorICogICAgICBwcmVzc3VyZTo8aHBhPgorICogICAgICBodW1pZGl0eTo8cGVyY2VudD4KKyAqICAgICAgc3luYzo8dGltZV91cz4KKyAqCisgKiAgIFdoZXJlIGVhY2ggbGluZSBiZWZvcmUgdGhlIHN5bmM6PHRpbWVfdXM+IGlzIG9wdGlvbmFsIGFuZCB3aWxsIG9ubHkKKyAqICAgYXBwZWFyIGlmIHRoZSBjb3JyZXNwb25kaW5nIHNlbnNvciBoYXMgYmVlbiBlbmFibGVkIGJ5IHRoZSBIQUwgbW9kdWxlLgorICoKKyAqICAgTm90ZSB0aGF0IDx0aW1lX3VzPiBpcyB0aGUgVk0gdGltZSBpbiBtaWNyby1zZWNvbmRzIHdoZW4gdGhlIHJlcG9ydAorICogICB3YXMgInRha2VuIiBieSB0aGlzIGNvZGUuIFRoaXMgaXMgYWRqdXN0ZWQgYnkgdGhlIEhBTCBtb2R1bGUgdG8KKyAqICAgZW11bGF0ZWQgc3lzdGVtIHRpbWUgKHVzaW5nIHRoZSBmaXJzdCBzeW5jOiB0byBjb21wdXRlIGFuIGFkanVzdG1lbnQKKyAqICAgb2Zmc2V0KS4KKyAqLworI2RlZmluZSBIRUFERVJfU0laRSA0CisjZGVmaW5lIEJVRkZFUl9TSVpFIDUxMgorCit0eXBlZGVmIHN0cnVjdCBId1NlbnNvckNsaWVudCBId1NlbnNvckNsaWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFFlbXVkU2VydmljZSogc2VydmljZTsKKyAgICBTZW5zb3Igc2Vuc29yc1tNQVhfU0VOU09SU107CisgICAgSHdTZW5zb3JDbGllbnQqIGNsaWVudHM7CisgICAgQW5kcm9pZFNlbnNvcnNQb3J0KiBzZW5zb3JzX3BvcnQ7Cit9IEh3U2Vuc29yczsKKworc3RydWN0IEh3U2Vuc29yQ2xpZW50IHsKKyAgICBId1NlbnNvckNsaWVudCogbmV4dDsKKyAgICBId1NlbnNvcnMqIHNlbnNvcnM7CisgICAgUWVtdWRDbGllbnQqIGNsaWVudDsKKyAgICBMb29wVGltZXIqIHRpbWVyOworICAgIHVpbnQzMl90IGVuYWJsZWRNYXNrOworICAgIGludDMyX3QgZGVsYXlfbXM7Cit9OworCitzdGF0aWMgdm9pZCBfaHdTZW5zb3JDbGllbnRfZnJlZShId1NlbnNvckNsaWVudCogY2wpIHsKKyAgICAvKiByZW1vdmUgZnJvbSBzZW5zb3JzJ3MgbGlzdCAqLworICAgIGlmIChjbC0+c2Vuc29ycykgeworICAgICAgICBId1NlbnNvckNsaWVudCoqIHBub2RlID0gJmNsLT5zZW5zb3JzLT5jbGllbnRzOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBId1NlbnNvckNsaWVudCogbm9kZSA9ICpwbm9kZTsKKyAgICAgICAgICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAobm9kZSA9PSBjbCkgeworICAgICAgICAgICAgICAgICpwbm9kZSA9IGNsLT5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG5vZGUgPSAmbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CisgICAgICAgIGNsLT5zZW5zb3JzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiBjbG9zZSBRRU1VRCBjbGllbnQsIGlmIGFueSAqLworICAgIGlmIChjbC0+Y2xpZW50KSB7CisgICAgICAgIHFlbXVkX2NsaWVudF9jbG9zZShjbC0+Y2xpZW50KTsKKyAgICAgICAgY2wtPmNsaWVudCA9IE5VTEw7CisgICAgfQorICAgIC8qIHJlbW92ZSB0aW1lciwgaWYgYW55ICovCisgICAgaWYgKGNsLT50aW1lcikgeworICAgICAgICBsb29wVGltZXJfc3RvcChjbC0+dGltZXIpOworICAgICAgICBsb29wVGltZXJfZnJlZShjbC0+dGltZXIpOworICAgICAgICBjbC0+dGltZXIgPSBOVUxMOworICAgIH0KKyAgICBBRlJFRShjbCk7Cit9CisKKy8qIGZvcndhcmQgKi8KK3N0YXRpYyB2b2lkIF9od1NlbnNvckNsaWVudF90aWNrKHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB0aW1lcik7CisKK3N0YXRpYyBId1NlbnNvckNsaWVudCogX2h3U2Vuc29yQ2xpZW50X25ldyhId1NlbnNvcnMqIHNlbnNvcnMpIHsKKyAgICBId1NlbnNvckNsaWVudCogY2w7CisKKyAgICBBTkVXMChjbCk7CisKKyAgICBjbC0+c2Vuc29ycyA9IHNlbnNvcnM7CisgICAgY2wtPmVuYWJsZWRNYXNrID0gMDsKKyAgICBjbC0+ZGVsYXlfbXMgPSA4MDA7CisgICAgY2wtPnRpbWVyID0KKyAgICAgICAgICAgIGxvb3BUaW1lcl9uZXdXaXRoQ2xvY2sobG9vcGVyX2dldEZvclRocmVhZCgpLCBfaHdTZW5zb3JDbGllbnRfdGljaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wsIExPT1BFUl9DTE9DS19WSVJUVUFMKTsKKworICAgIGNsLT5uZXh0ID0gc2Vuc29ycy0+Y2xpZW50czsKKyAgICBzZW5zb3JzLT5jbGllbnRzID0gY2w7CisKKyAgICByZXR1cm4gY2w7Cit9CisKKy8qIGZvcndhcmQgKi8KKworc3RhdGljIHZvaWQgX2h3U2Vuc29yQ2xpZW50X3JlY2VpdmUoSHdTZW5zb3JDbGllbnQqIGNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVlcnlsZW4pOworCisvKiBRZW11ZCBzZXJ2aWNlIG1hbmFnZW1lbnQgKi8KKworc3RhdGljIHZvaWQgX2h3U2Vuc29yQ2xpZW50X3JlY3Yodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkQ2xpZW50KiBjbGllbnQpIHsKKyAgICBId1NlbnNvckNsaWVudCogY2wgPSBvcGFxdWU7CisKKyAgICBfaHdTZW5zb3JDbGllbnRfcmVjZWl2ZShjbCwgbXNnLCBtc2dsZW4pOworfQorCitzdGF0aWMgdm9pZCBfaHdTZW5zb3JDbGllbnRfY2xvc2Uodm9pZCogb3BhcXVlKSB7CisgICAgSHdTZW5zb3JDbGllbnQqIGNsID0gb3BhcXVlOworCisgICAgLyogdGhlIGNsaWVudCBpcyBhbHJlYWR5IGNsb3NlZCBoZXJlICovCisgICAgY2wtPmNsaWVudCA9IE5VTEw7CisgICAgX2h3U2Vuc29yQ2xpZW50X2ZyZWUoY2wpOworfQorCisvKiBzZW5kIGEgb25lLWxpbmUgbWVzc2FnZSB0byB0aGUgSEFMIG1vZHVsZSB0aHJvdWdoIGEgcWVtdWQgY2hhbm5lbCAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yQ2xpZW50X3NlbmQoSHdTZW5zb3JDbGllbnQqIGNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ2xlbikgeworICAgIEQoIiVzOiAnJXMnIiwgX19GVU5DVElPTl9fLCBxdW90ZV9ieXRlcygoY29uc3Qgdm9pZCopbXNnLCBtc2dsZW4pKTsKKyAgICBxZW11ZF9jbGllbnRfc2VuZChjbC0+Y2xpZW50LCBtc2csIG1zZ2xlbik7Cit9CisKK3N0YXRpYyBpbnQgX2h3U2Vuc29yQ2xpZW50X2VuYWJsZWQoSHdTZW5zb3JDbGllbnQqIGNsLCBpbnQgc2Vuc29ySWQpIHsKKyAgICByZXR1cm4gKGNsLT5lbmFibGVkTWFzayAmICgxIDw8IHNlbnNvcklkKSkgIT0gMDsKK30KKworLyogYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXBsYWNlcyBjb21tYXMgKCwpIHdpdGggcG9pbnRzICguKS4KKyAqIEVhY2ggc2Vuc29yIHN0cmluZyBtdXN0IGJlIHByb2Nlc3NlZCB0aGlzIHdheSBiZWZvcmUgYmVpbmcKKyAqIHNlbnQgaW50byB0aGUgZ3Vlc3QuIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3lzdGVtIGxvY2FsZSBtYXkKKyAqIGNhdXNlIGRlY2ltYWwgdmFsdWVzIHRvIGJlIGZvcm1hdHRlZCB3aXRoIGEgY29tbWEgaW5zdGVhZCBvZgorICogYSBkZWNpbWFsIHBvaW50LCBidXQgdGhhdCB3b3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseQorICogd2l0aGluIHRoZSBndWVzdC4KKyAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yQ2xpZW50X3Nhbml0aXplU2Vuc29yU3RyaW5nKGNoYXIqIHN0cmluZywgaW50IG1heGxlbikgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhsZW4gJiYgc3RyaW5nW2ldICE9ICdcMCc7IGkrKykgeworICAgICAgICBpZiAoc3RyaW5nW2ldID09ICcsJykgeworICAgICAgICAgICAgc3RyaW5nW2ldID0gJy4nOworICAgICAgICB9CisgICAgfQorfQorCisvLyBhIGZ1bmN0aW9uIHRvIHNlcmlhbGl6ZSB0aGUgc2Vuc29yIHZhbHVlIGJhc2VkIG9uIGl0cyBJRAorc3RhdGljIHZvaWQgc2VyaWFsaXplU2Vuc29yVmFsdWUoU2Vuc29yKiBzZW5zb3IsIEFuZHJvaWRTZW5zb3Igc2Vuc29yX2lkKSB7CisgICAgc3dpdGNoIChzZW5zb3JfaWQpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT046IHsKKyAgICAgICAgICAgIHNlbnNvci0+c2VyaWFsaXplZC5sZW5ndGggPSBzbnByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlLCBzaXplb2Yoc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgImFjY2VsZXJhdGlvbjolZzolZzolZyIsIHNlbnNvci0+dS5hY2NlbGVyYXRpb24ueCwKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT51LmFjY2VsZXJhdGlvbi55LCBzZW5zb3ItPnUuYWNjZWxlcmF0aW9uLnopOworCisgICAgICAgICAgICAvLyBUT0RPKGdyaWdvcnlqKTogZGVidWcgb3V0cHV0IGZvciBpbnZlc3RpZ2F0aW5nIHJvdGF0aW9uIGJ1ZworICAgICAgICAgICAgc3RhdGljIGZsb2F0IHByZXZfYWNjZWxlcmF0aW9uW10gPSB7MC4wZiwgMC4wZiwgMC4wZn07CisgICAgICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhyb3RhdGlvbikgJiYKKyAgICAgICAgICAgICAgICAocHJldl9hY2NlbGVyYXRpb25bMF0gIT0gc2Vuc29yLT51LmFjY2VsZXJhdGlvbi54IHx8CisgICAgICAgICAgICAgICAgIHByZXZfYWNjZWxlcmF0aW9uWzFdICE9IHNlbnNvci0+dS5hY2NlbGVyYXRpb24ueSB8fAorICAgICAgICAgICAgICAgICBwcmV2X2FjY2VsZXJhdGlvblsyXSAhPSBzZW5zb3ItPnUuYWNjZWxlcmF0aW9uLnopKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTZW50ICVzIHRvIHNlbnNvcnMgSEFMXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlKTsKKyAgICAgICAgICAgICAgICBwcmV2X2FjY2VsZXJhdGlvblswXSA9IHNlbnNvci0+dS5hY2NlbGVyYXRpb24ueDsKKyAgICAgICAgICAgICAgICBwcmV2X2FjY2VsZXJhdGlvblsxXSA9IHNlbnNvci0+dS5hY2NlbGVyYXRpb24ueTsKKyAgICAgICAgICAgICAgICBwcmV2X2FjY2VsZXJhdGlvblsyXSA9IHNlbnNvci0+dS5hY2NlbGVyYXRpb24uejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICAvKiBOT1RFOiBzZW5zb3JzIEhBTCBleHBlY3RzICJtYWduZXRpYyIsIG5vdCAqICJtYWduZXRpYy1maWVsZCIKKyAgICAgICAgICAgICAqIG5hbWUgaGVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLmxlbmd0aCA9IHNucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUsIHNpemVvZihzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAibWFnbmV0aWM6JWc6JWc6JWciLCBzZW5zb3ItPnUubWFnbmV0aWMueCwKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT51Lm1hZ25ldGljLnksIHNlbnNvci0+dS5tYWduZXRpYy56KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLmxlbmd0aCA9IHNucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUsIHNpemVvZihzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAib3JpZW50YXRpb246JWc6JWc6JWciLCBzZW5zb3ItPnUub3JpZW50YXRpb24uYXppbXV0aCwKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT51Lm9yaWVudGF0aW9uLnBpdGNoLCBzZW5zb3ItPnUub3JpZW50YXRpb24ucm9sbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9URU1QRVJBVFVSRToKKyAgICAgICAgICAgIHNlbnNvci0+c2VyaWFsaXplZC5sZW5ndGggPSBzbnByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlLCBzaXplb2Yoc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgInRlbXBlcmF0dXJlOiVnIiwgc2Vuc29yLT51LnRlbXBlcmF0dXJlLmNlbHNpdXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfUFJPWElNSVRZOgorICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLmxlbmd0aCA9IHNucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUsIHNpemVvZihzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAicHJveGltaXR5OiVnIiwgc2Vuc29yLT51LnByb3hpbWl0eS52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9MSUdIVDoKKyAgICAgICAgICAgIHNlbnNvci0+c2VyaWFsaXplZC5sZW5ndGggPSBzbnByaW50ZigKKyAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlLCBzaXplb2Yoc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgImxpZ2h0OiVnIiwgc2Vuc29yLT51LmxpZ2h0LnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX1BSRVNTVVJFOgorICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLmxlbmd0aCA9IHNucHJpbnRmKAorICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUsIHNpemVvZihzZW5zb3ItPnNlcmlhbGl6ZWQudmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAicHJlc3N1cmU6JWciLCBzZW5zb3ItPnUucHJlc3N1cmUudmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfSFVNSURJVFk6CisgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQubGVuZ3RoID0gc25wcmludGYoCisgICAgICAgICAgICAgICAgICAgIHNlbnNvci0+c2VyaWFsaXplZC52YWx1ZSwgc2l6ZW9mKHNlbnNvci0+c2VyaWFsaXplZC52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICJodW1pZGl0eTolZyIsIHNlbnNvci0+dS5odW1pZGl0eS52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydChmYWxzZSk7ICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChzZW5zb3ItPnNlcmlhbGl6ZWQubGVuZ3RoIDwgc2l6ZW9mKHNlbnNvci0+c2VyaWFsaXplZC52YWx1ZSkpOworICAgIHNlbnNvci0+c2VyaWFsaXplZC52YWxpZCA9IHRydWU7CisKKyAgICBfaHdTZW5zb3JDbGllbnRfc2FuaXRpemVTZW5zb3JTdHJpbmcoc2Vuc29yLT5zZXJpYWxpemVkLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5zb3ItPnNlcmlhbGl6ZWQubGVuZ3RoKTsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgcGVyaW9kaWNhbGx5IHRvIHNlbmQgc2Vuc29yIHJlcG9ydHMKKyAqIHRvIHRoZSBIQUwgbW9kdWxlLCBhbmQgcmUtYXJtIHRoZSB0aW1lciBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yQ2xpZW50X3RpY2sodm9pZCogb3BhcXVlLCBMb29wVGltZXIqIHVudXNlZCkgeworICAgIEh3U2Vuc29yQ2xpZW50KiBjbCA9IG9wYXF1ZTsKKyAgICBpbnQ2NF90IGRlbGF5X21zID0gY2wtPmRlbGF5X21zOworICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSBjbC0+ZW5hYmxlZE1hc2s7CisKKyAgICAvLyBHcmFiIHRoZSBndWVzdCB0aW1lIGJlZm9yZSBzZW5kaW5nIGFueSBzZW5zb3IgZGF0YToKKyAgICAvLyB0aGUgYW5kcm9pZC5oYXJkd2FyZSBDVFMgcmVxdWlyZXMgc3luYyB0aW1lcyB0byBiZSBubyBncmVhdGVyIHRoYW4gdGhlCisgICAgLy8gdGltZSBvZiB0aGUgc2Vuc29yIGV2ZW50IGFycml2YWwuIFNpbmNlIHRoZSBDVFMgZW5mb3JjZXMgdGhpcyBwcm9wZXJ0eSwKKyAgICAvLyBvdGhlciBjb2RlIG1heSBhbHNvIHJlbHkgb24gaXQuCisgICAgY29uc3QgRHVyYXRpb25OcyBub3dfbnMgPQorICAgICAgICAgICAgbG9vcGVyX25vd05zV2l0aENsb2NrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgTE9PUEVSX0NMT0NLX1ZJUlRVQUwpOworCisgICAgQW5kcm9pZFNlbnNvciBzZW5zb3JfaWQ7CisgICAgZm9yIChzZW5zb3JfaWQgPSAwOyBzZW5zb3JfaWQgPCBNQVhfU0VOU09SUzsgKytzZW5zb3JfaWQpIHsKKyAgICAgICAgaWYgKCFfaHdTZW5zb3JDbGllbnRfZW5hYmxlZChjbCwgc2Vuc29yX2lkKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgU2Vuc29yKiBzZW5zb3IgPSAmY2wtPnNlbnNvcnMtPnNlbnNvcnNbc2Vuc29yX2lkXTsKKyAgICAgICAgaWYgKCFzZW5zb3ItPnNlcmlhbGl6ZWQudmFsaWQpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZVNlbnNvclZhbHVlKHNlbnNvciwgc2Vuc29yX2lkKTsKKyAgICAgICAgfQorICAgICAgICBfaHdTZW5zb3JDbGllbnRfc2VuZChjbCwgKHVpbnQ4X3QqKXNlbnNvci0+c2VyaWFsaXplZC52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc29yLT5zZXJpYWxpemVkLmxlbmd0aCk7CisgICAgfQorCisgICAgY2hhciBidWZmZXJbNjRdOworICAgIGludCBidWZmZXJfbGVuID0KKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJzeW5jOiUiIFBSSWQ2NCwgbm93X25zIC8gMTAwMCk7CisgICAgYXNzZXJ0KGJ1ZmZlcl9sZW4gPCBzaXplb2YoYnVmZmVyKSk7CisgICAgX2h3U2Vuc29yQ2xpZW50X3NlbmQoY2wsICh1aW50OF90KilidWZmZXIsIGJ1ZmZlcl9sZW4pOworCisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gUmVhcm0gdGhlIHRpbWVyIHRvIGZpcmUgYSBsaXR0bGUgYml0IGVhcmx5LCBzbyB3ZSBjYW4gc3VzdGFpbiB0aGUKKyAgICAvLyByZXF1ZXN0ZWQgZnJlcXVlbmN5LiBBbHNvIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IGEgbWluaW1hbCBkZWxheSwKKyAgICAvLyBvdGhlcndpc2UgdGhpcyB0aW1lciB3b3VsZCBoaWphY2sgdGhlIG1haW4gbG9vcCB0aHJlYWQgYW5kIHdvbid0IGFsbG93CisgICAgLy8gZ3Vlc3QgdG8gZXZlciBydW4uCisgICAgLy8gTm90ZTogKC0xKSBpcyBuZWVkZWQgdG8gYWNjb3VudCBmb3IgYW4gb3ZlcmhlYWQgb2YgdGhlIHRpbWVyIGZpcmluZyBvbgorICAgIC8vICB0aGUgaG9zdCBhbmQgZXhlY3V0aW9uIG9mIHRoZSB0aWNrIGZ1bmN0aW9uLiAxbXMgaXMgZW5vdWdoLCBhcyB0aGUKKyAgICAvLyAgb3ZlcmhlYWQgaXMgdmVyeSBzbWFsbDsgb24gdGhlIG90aGVyIGhhbmQsIGl0J3MgYWx3YXlzIHByZXNlbnQgLSB0aGF0J3MKKyAgICAvLyAgd2h5IHdlIGNhbid0IGp1c3QgaGF2ZSAoZGVsYXlfbXMpIGhlcmUuCisgICAgLy8gTm90ZTI6IExldCdzIGNhcCB0aGUgbWluaW1hbCB0aWNrIGludGVydmFsIHRvIDVtcywgdG8gbWFrZSBzdXJlIHdlIG5ldmVyCisgICAgLy8gIG92ZXJsb2FkIHRoZSBtYWluIFFFTVUgbG9vcC4gVXBwZXIgbGltaXQgaXMganVzdCBzb21lIHJlYXNvbmFibGUgdmFsdWUuCisgICAgaWYgKGRlbGF5X21zIDwgNSkgeworICAgICAgICBkZWxheV9tcyA9IDU7CisgICAgfSBlbHNlIGlmIChkZWxheV9tcyA+IDYwICogNjAgKiAxMDAwKSB7CisgICAgICAgIGRlbGF5X21zID0gNjAgKiA2MCAqIDEwMDA7CisgICAgfQorICAgIGxvb3BUaW1lcl9zdGFydFJlbGF0aXZlKGNsLT50aW1lciwgZGVsYXlfbXMgLSAxKTsKK30KKworLyogaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzIGZyb20gdGhlIEhBTCBtb2R1bGUgKi8KK3N0YXRpYyB2b2lkIF9od1NlbnNvckNsaWVudF9yZWNlaXZlKEh3U2Vuc29yQ2xpZW50KiBjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2dsZW4pIHsKKyAgICBId1NlbnNvcnMqIGh3ID0gY2wtPnNlbnNvcnM7CisKKyAgICBEKCIlczogJyUuKnMnIiwgX19GVU5DVElPTl9fLCBtc2dsZW4sIG1zZyk7CisKKyAgICAvKiAibGlzdC1zZW5zb3JzIiBpcyB1c2VkIHRvIGdldCBhbiBpbnRlZ2VyIGJpdCBtYXAgb2YKKyAgICAgKiBhdmFpbGFibGUgZW11bGF0ZWQgc2Vuc29ycy4gV2UgY29tcHV0ZSB0aGUgbWFzayBmcm9tIHRoZQorICAgICAqIGN1cnJlbnQgaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBpZiAobXNnbGVuID09IDEyICYmICFtZW1jbXAobXNnLCAibGlzdC1zZW5zb3JzIiwgMTIpKSB7CisgICAgICAgIGNoYXIgYnVmZlsxMl07CisgICAgICAgIGludCBtYXNrID0gMDsKKyAgICAgICAgaW50IG5uOworCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IE1BWF9TRU5TT1JTOyBubisrKSB7CisgICAgICAgICAgICBpZiAoaHctPnNlbnNvcnNbbm5dLmVuYWJsZWQpCisgICAgICAgICAgICAgICAgbWFzayB8PSAoMSA8PCBubik7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgbGVuID0gc25wcmludGYoYnVmZiwgc2l6ZW9mIGJ1ZmYsICIlZCIsIG1hc2spOworICAgICAgICBhc3NlcnQobGVuIDwgc2l6ZW9mKGJ1ZmYpKTsKKyAgICAgICAgX2h3U2Vuc29yQ2xpZW50X3NlbmQoY2wsIChjb25zdCB1aW50OF90KilidWZmLCBsZW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogIndha2UiIGlzIGEgc3BlY2lhbCBtZXNzYWdlIHRoYXQgbXVzdCBiZSBzZW50IGJhY2sgdGhyb3VnaAorICAgICAqIHRoZSBjaGFubmVsLiBJdCBpcyB1c2VkIHRvIGV4aXQgYSBibG9ja2luZyByZWFkLgorICAgICAqLworICAgIGlmIChtc2dsZW4gPT0gNCAmJiAhbWVtY21wKG1zZywgIndha2UiLCA0KSkgeworICAgICAgICBfaHdTZW5zb3JDbGllbnRfc2VuZChjbCwgKGNvbnN0IHVpbnQ4X3QqKSJ3YWtlIiwgNCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiAic2V0LWRlbGF5OjxkZWxheT4iIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMKKyAgICAgKiBiZXR3ZWVuIHNlbnNvciBldmVudHMKKyAgICAgKi8KKyAgICBpZiAobXNnbGVuID4gMTAgJiYgIW1lbWNtcChtc2csICJzZXQtZGVsYXk6IiwgMTApKSB7CisgICAgICAgIGNsLT5kZWxheV9tcyA9IGF0b2koKGNvbnN0IGNoYXIqKW1zZyArIDEwKTsKKyAgICAgICAgaWYgKGNsLT5lbmFibGVkTWFzayAhPSAwKQorICAgICAgICAgICAgX2h3U2Vuc29yQ2xpZW50X3RpY2soY2wsIGNsLT50aW1lcik7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qICJzZXQ6PG5hbWU+OjxzdGF0ZT4iIGlzIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgYSBnaXZlbgorICAgICAqIHNlbnNvci4gPHN0YXRlPiBtdXN0IGJlIDAgb3IgMQorICAgICAqLworICAgIGlmIChtc2dsZW4gPiA0ICYmICFtZW1jbXAobXNnLCAic2V0OiIsIDQpKSB7CisgICAgICAgIGNoYXIqIHE7CisgICAgICAgIGludCBpZCwgZW5hYmxlZCwgb2xkRW5hYmxlZE1hc2sgPSBjbC0+ZW5hYmxlZE1hc2s7CisgICAgICAgIG1zZyArPSA0OworICAgICAgICBxID0gc3RyY2hyKChjaGFyKiltc2csICc6Jyk7CisgICAgICAgIGlmIChxID09IE5VTEwpIHsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKyAgICAgICAgICAgIEQoIiVzOiBpZ25vcmUgYmFkICdzZXQnIGNvbW1hbmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICpxKysgPSAwOworCisgICAgICAgIGlkID0gX3NlbnNvcklkRnJvbU5hbWUoKGNvbnN0IGNoYXIqKW1zZyk7CisgICAgICAgIGlmIChpZCA8IDAgfHwgaWQgPj0gTUFYX1NFTlNPUlMpIHsKKyAgICAgICAgICAgIEQoIiVzOiBpZ25vcmUgdW5rbm93biBzZW5zb3IgbmFtZSAnJXMnIiwgX19GVU5DVElPTl9fLCBtc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFody0+c2Vuc29yc1tpZF0uZW5hYmxlZCkgeworICAgICAgICAgICAgRCgiJXM6IHRyeWluZyB0byBzZXQgZGlzYWJsZWQgJXMgc2Vuc29yIiwgX19GVU5DVElPTl9fLCBtc2cpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGVuYWJsZWQgPSAocVswXSA9PSAnMScpOworCisgICAgICAgIGlmIChlbmFibGVkKQorICAgICAgICAgICAgY2wtPmVuYWJsZWRNYXNrIHw9ICgxIDw8IGlkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2wtPmVuYWJsZWRNYXNrICY9IH4oMSA8PCBpZCk7CisKKyAgICAgICAgaWYgKGNsLT5lbmFibGVkTWFzayAhPSAodWludDMyX3Qpb2xkRW5hYmxlZE1hc2spIHsKKyAgICAgICAgICAgIEQoIiVzOiAlcyAlcyBzZW5zb3IiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIChjbC0+ZW5hYmxlZE1hc2sgJiAoMSA8PCBpZCkpID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciLCBtc2cpOworICAgICAgICB9CisKKyAgICAgICAgLyogSWYgZW11bGF0aW5nIGRldmljZSBpcyBjb25uZWN0ZWQgdXBkYXRlIHNlbnNvciBzdGF0ZSB0aGVyZSB0b28uICovCisgICAgICAgIGlmIChody0+c2Vuc29yc19wb3J0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2Vuc29yc19wb3J0X2VuYWJsZV9zZW5zb3IoaHctPnNlbnNvcnNfcG9ydCwgKGNvbnN0IGNoYXIqKW1zZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbnNvcnNfcG9ydF9kaXNhYmxlX3NlbnNvcihody0+c2Vuc29yc19wb3J0LCAoY29uc3QgY2hhciopbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9od1NlbnNvckNsaWVudF90aWNrKGNsLCBjbC0+dGltZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRCgiJXM6IGlnbm9yaW5nIHVua25vd24gcXVlcnkiLCBfX0ZVTkNUSU9OX18pOworfQorCisvKiBTYXZlcyBzZW5zb3Itc3BlY2lmaWMgY2xpZW50IGRhdGEgdG8gc25hcHNob3QgKi8KK3N0YXRpYyB2b2lkIF9od1NlbnNvckNsaWVudF9zYXZlKFN0cmVhbSogZiwgUWVtdWRDbGllbnQqIGNsaWVudCwgdm9pZCogb3BhcXVlKSB7CisgICAgSHdTZW5zb3JDbGllbnQqIHNjID0gb3BhcXVlOworCisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHNjLT5kZWxheV9tcyk7CisgICAgc3RyZWFtX3B1dF9iZTMyKGYsIHNjLT5lbmFibGVkTWFzayk7CisgICAgc3RyZWFtX3B1dF90aW1lcihmLCBzYy0+dGltZXIpOworfQorCisvKiBMb2FkcyBzZW5zb3Itc3BlY2lmaWMgY2xpZW50IGRhdGEgZnJvbSBzbmFwc2hvdCAqLworc3RhdGljIGludCBfaHdTZW5zb3JDbGllbnRfbG9hZChTdHJlYW0qIGYsIFFlbXVkQ2xpZW50KiBjbGllbnQsIHZvaWQqIG9wYXF1ZSkgeworICAgIEh3U2Vuc29yQ2xpZW50KiBzYyA9IG9wYXF1ZTsKKworICAgIHNjLT5kZWxheV9tcyA9IHN0cmVhbV9nZXRfYmUzMihmKTsKKyAgICBzYy0+ZW5hYmxlZE1hc2sgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgc3RyZWFtX2dldF90aW1lcihmLCBzYy0+dGltZXIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBRZW11ZENsaWVudCogX2h3U2Vuc29yc19jb25uZWN0KHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFlbXVkU2VydmljZSogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xpZW50X3BhcmFtKSB7CisgICAgSHdTZW5zb3JzKiBzZW5zb3JzID0gb3BhcXVlOworICAgIEh3U2Vuc29yQ2xpZW50KiBjbCA9IF9od1NlbnNvckNsaWVudF9uZXcoc2Vuc29ycyk7CisgICAgUWVtdWRDbGllbnQqIGNsaWVudCA9IHFlbXVkX2NsaWVudF9uZXcoCisgICAgICAgICAgICBzZXJ2aWNlLCBjaGFubmVsLCBjbGllbnRfcGFyYW0sIGNsLCBfaHdTZW5zb3JDbGllbnRfcmVjdiwKKyAgICAgICAgICAgIF9od1NlbnNvckNsaWVudF9jbG9zZSwgX2h3U2Vuc29yQ2xpZW50X3NhdmUsIF9od1NlbnNvckNsaWVudF9sb2FkKTsKKyAgICBxZW11ZF9jbGllbnRfc2V0X2ZyYW1pbmcoY2xpZW50LCAxKTsKKyAgICBjbC0+Y2xpZW50ID0gY2xpZW50OworCisgICAgcmV0dXJuIGNsaWVudDsKK30KKworLyogY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgZW11bGF0ZWQgc2Vuc29yIHZlY3RvciAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yc19zZXRTZW5zb3JWYWx1ZShId1NlbnNvcnMqIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5zb3JfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGMpIHsKKyAgICBTZW5zb3IqIHMgPSAmaC0+c2Vuc29yc1tzZW5zb3JfaWRdOworCisgICAgaWYgKHMtPnUudmFsdWUuYSAhPSBhIHx8IHMtPnUudmFsdWUuYiAhPSBiIHx8IHMtPnUudmFsdWUuYyAhPSBjKSB7CisgICAgICAgIHMtPnUudmFsdWUuYSA9IGE7CisgICAgICAgIHMtPnUudmFsdWUuYiA9IGI7CisgICAgICAgIHMtPnUudmFsdWUuYyA9IGM7CisgICAgICAgIHMtPnNlcmlhbGl6ZWQudmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKKy8qIFNhdmVzIGF2YWlsYWJsZSBzZW5zb3JzIHRvIGFsbG93IGNoZWNraW5nIGF2YWlsYWJpbGl0eSB3aGVuIGxvYWRlZC4KKyAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yc19zYXZlKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzdiwgdm9pZCogb3BhcXVlKSB7CisgICAgSHdTZW5zb3JzKiBoID0gb3BhcXVlOworCisgICAgLy8gbnVtYmVyIG9mIHNlbnNvcnMKKyAgICBzdHJlYW1fcHV0X2JlMzIoZiwgTUFYX1NFTlNPUlMpOworICAgIEFuZHJvaWRTZW5zb3Igc2Vuc29yX2lkOworICAgIGZvciAoc2Vuc29yX2lkID0gMDsgc2Vuc29yX2lkIDwgTUFYX1NFTlNPUlM7IHNlbnNvcl9pZCsrKSB7CisgICAgICAgIFNlbnNvciogcyA9ICZoLT5zZW5zb3JzW3NlbnNvcl9pZF07CisgICAgICAgIHN0cmVhbV9wdXRfYmUzMihmLCBzLT5lbmFibGVkKTsKKworICAgICAgICAvKiB0aGlzIHN3aXRjaCBlbnN1cmVzIHRoYXQgYSB3YXJuaW5nIGlzIHJhaXNlZCB3aGVuIGEgbmV3IHNlbnNvciBpcworICAgICAgICAgKiBhZGRlZCBhbmQgaXMgbm90IGFkZGVkIGhlcmUgYXMgd2VsbC4KKyAgICAgICAgICovCisgICAgICAgIHN3aXRjaCAoc2Vuc29yX2lkKSB7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX0FDQ0VMRVJBVElPTjoKKyAgICAgICAgICAgICAgICBzdHJlYW1fcHV0X2Zsb2F0KGYsIHMtPnUuYWNjZWxlcmF0aW9uLngpOworICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5hY2NlbGVyYXRpb24ueSk7CisgICAgICAgICAgICAgICAgc3RyZWFtX3B1dF9mbG9hdChmLCBzLT51LmFjY2VsZXJhdGlvbi56KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfTUFHTkVUSUNfRklFTEQ6CisgICAgICAgICAgICAgICAgc3RyZWFtX3B1dF9mbG9hdChmLCBzLT51Lm1hZ25ldGljLngpOworICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5tYWduZXRpYy55KTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fcHV0X2Zsb2F0KGYsIHMtPnUubWFnbmV0aWMueik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5vcmllbnRhdGlvbi5hemltdXRoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fcHV0X2Zsb2F0KGYsIHMtPnUub3JpZW50YXRpb24ucGl0Y2gpOworICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5vcmllbnRhdGlvbi5yb2xsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfVEVNUEVSQVRVUkU6CisgICAgICAgICAgICAgICAgc3RyZWFtX3B1dF9mbG9hdChmLCBzLT51LnRlbXBlcmF0dXJlLmNlbHNpdXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9QUk9YSU1JVFk6CisgICAgICAgICAgICAgICAgc3RyZWFtX3B1dF9mbG9hdChmLCBzLT51LnByb3hpbWl0eS52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX0xJR0hUOgorICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5saWdodC52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX1BSRVNTVVJFOgorICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5wcmVzc3VyZS52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX0hVTUlESVRZOgorICAgICAgICAgICAgICAgIHN0cmVhbV9wdXRfZmxvYXQoZiwgcy0+dS5odW1pZGl0eS52YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUFYX1NFTlNPUlM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgX2h3U2Vuc29yc19sb2FkKFN0cmVhbSogZiwgUWVtdWRTZXJ2aWNlKiBzLCB2b2lkKiBvcGFxdWUpIHsKKyAgICBId1NlbnNvcnMqIGggPSBvcGFxdWU7CisKKyAgICAvKiBjaGVjayBudW1iZXIgb2Ygc2Vuc29ycyAqLworICAgIGludDMyX3QgbnVtX3NlbnNvcnMgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisgICAgaWYgKG51bV9zZW5zb3JzID4gTUFYX1NFTlNPUlMpIHsKKyAgICAgICAgRCgiJXM6IGNhbm5vdCBsb2FkOiBzbmFwc2hvdCByZXF1aXJlcyAlZCBzZW5zb3JzLCAlZCBhdmFpbGFibGVcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1fc2Vuc29ycywgTUFYX1NFTlNPUlMpOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICAvKiBsb2FkIHNlbnNvciBzdGF0ZSAqLworICAgIEFuZHJvaWRTZW5zb3Igc2Vuc29yX2lkOworICAgIGZvciAoc2Vuc29yX2lkID0gMDsgc2Vuc29yX2lkIDwgKEFuZHJvaWRTZW5zb3IpbnVtX3NlbnNvcnM7IHNlbnNvcl9pZCsrKSB7CisgICAgICAgIFNlbnNvciogcyA9ICZoLT5zZW5zb3JzW3NlbnNvcl9pZF07CisgICAgICAgIHMtPmVuYWJsZWQgPSBzdHJlYW1fZ2V0X2JlMzIoZik7CisKKyAgICAgICAgLyogdGhpcyBzd2l0Y2ggZW5zdXJlcyB0aGF0IGEgd2FybmluZyBpcyByYWlzZWQgd2hlbiBhIG5ldyBzZW5zb3IgaXMKKyAgICAgICAgICogYWRkZWQgYW5kIGlzIG5vdCBhZGRlZCBoZXJlIGFzIHdlbGwuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKHNlbnNvcl9pZCkgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT046CisgICAgICAgICAgICAgICAgcy0+dS5hY2NlbGVyYXRpb24ueCA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgcy0+dS5hY2NlbGVyYXRpb24ueSA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgcy0+dS5hY2NlbGVyYXRpb24ueiA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX01BR05FVElDX0ZJRUxEOgorICAgICAgICAgICAgICAgIHMtPnUubWFnbmV0aWMueCA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgcy0+dS5tYWduZXRpYy55ID0gc3RyZWFtX2dldF9mbG9hdChmKTsKKyAgICAgICAgICAgICAgICBzLT51Lm1hZ25ldGljLnogPSBzdHJlYW1fZ2V0X2Zsb2F0KGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTjoKKyAgICAgICAgICAgICAgICBzLT51Lm9yaWVudGF0aW9uLmF6aW11dGggPSBzdHJlYW1fZ2V0X2Zsb2F0KGYpOworICAgICAgICAgICAgICAgIHMtPnUub3JpZW50YXRpb24ucGl0Y2ggPSBzdHJlYW1fZ2V0X2Zsb2F0KGYpOworICAgICAgICAgICAgICAgIHMtPnUub3JpZW50YXRpb24ucm9sbCA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX1RFTVBFUkFUVVJFOgorICAgICAgICAgICAgICAgIHMtPnUudGVtcGVyYXR1cmUuY2Vsc2l1cyA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX1BST1hJTUlUWToKKyAgICAgICAgICAgICAgICBzLT51LnByb3hpbWl0eS52YWx1ZSA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfU0VOU09SX0xJR0hUOgorICAgICAgICAgICAgICAgIHMtPnUubGlnaHQudmFsdWUgPSBzdHJlYW1fZ2V0X2Zsb2F0KGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NFTlNPUl9QUkVTU1VSRToKKyAgICAgICAgICAgICAgICBzLT51LnByZXNzdXJlLnZhbHVlID0gc3RyZWFtX2dldF9mbG9hdChmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TRU5TT1JfSFVNSURJVFk6CisgICAgICAgICAgICAgICAgcy0+dS5odW1pZGl0eS52YWx1ZSA9IHN0cmVhbV9nZXRfZmxvYXQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1BWF9TRU5TT1JTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlLXNlcmlhbGl6ZSBpdCBvbiB0aGUgbmV4dCB0aWNrLgorICAgICAgICBzLT5zZXJpYWxpemVkLnZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgLyogVGhlIGZvbGxvd2luZyBpcyBuZWNlc3Nhcnkgd2hlbiB3ZSByZXN1bWUgYSBzbmFwaG9zdAorICAgICAqIGNyZWF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiB0aGUgZW11bGF0b3IgdGhhdCBwcm92aWRlZAorICAgICAqIGxlc3MgaGFyZHdhcmUgc2Vuc29ycy4KKyAgICAgKi8KKyAgICBmb3IgKDsgc2Vuc29yX2lkIDwgTUFYX1NFTlNPUlM7IHNlbnNvcl9pZCsrKSB7CisgICAgICAgIGgtPnNlbnNvcnNbc2Vuc29yX2lkXS5lbmFibGVkID0gZmFsc2U7CisgICAgICAgIGgtPnNlbnNvcnNbc2Vuc29yX2lkXS5zZXJpYWxpemVkLnZhbGlkID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGNoYW5nZSB0aGUgZW11bGF0ZWQgcHJveGltaXR5ICovCitzdGF0aWMgdm9pZCBfaHdTZW5zb3JzX3NldFByb3hpbWl0eShId1NlbnNvcnMqIGgsIGZsb2F0IHZhbHVlKSB7CisgICAgU2Vuc29yKiBzID0gJmgtPnNlbnNvcnNbQU5EUk9JRF9TRU5TT1JfUFJPWElNSVRZXTsKKyAgICBpZiAocy0+dS5wcm94aW1pdHkudmFsdWUgIT0gdmFsdWUpIHsKKyAgICAgICAgcy0+dS5wcm94aW1pdHkudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgcy0+c2VyaWFsaXplZC52YWxpZCA9IGZhbHNlOworICAgIH0KK30KKworLyogY2hhbmdlIHRoZSBjb2Fyc2Ugb3JpZW50YXRpb24gKGxhbmRzY2FwZS9wb3J0cmFpdCkgb2YgdGhlIGVtdWxhdGVkIGRldmljZSAqLworc3RhdGljIHZvaWQgX2h3U2Vuc29yc19zZXRDb2Fyc2VPcmllbnRhdGlvbihId1NlbnNvcnMqIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRDb2Fyc2VPcmllbnRhdGlvbiBvcmllbnQpIHsKKyAgICAvKiBUaGUgQW5kcm9pZCBmcmFtZXdvcmsgY29tcHV0ZXMgdGhlIG9yaWVudGF0aW9uIGJ5IGxvb2tpbmcgYXQKKyAgICAgKiB0aGUgYWNjZWxlcm9tZXRlciBzZW5zb3IgKCpub3QqIHRoZSBvcmllbnRhdGlvbiBzZW5zb3IgISkKKyAgICAgKgorICAgICAqIFRoYXQncyBiZWNhdXNlIHRoZSBncmF2aXR5IGlzIGEgY29uc3RhbnQgOS44MSB2ZWN0b3IgdGhhdAorICAgICAqIGNhbiBiZSBkZXRlcm1pbmVkIHF1aXRlIGVhc2lseS4KKyAgICAgKgorICAgICAqIEFsc28sIGZvciBzb21lIHJlYXNvbiwgdGhlIGZyYW1ld29yayBjb2RlIGNvbnNpZGVycyB0aGF0IHRoZSBwaG9uZSBzaG91bGQKKyAgICAgKiBiZSBpbmNsaW5lZCBieSAzMCBkZWdyZWVzIGFsb25nIHRoZSBwaG9uZSdzIFggYXhpcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogaW4gaXRzIGlkZWFsICJ2ZXJ0aWNhbCIgcG9zaXRpb24KKyAgICAgKgorICAgICAqIElmIHRoZSBwaG9uZSBpcyBjb21wbGV0ZWx5IHZlcnRpY2FsLCByb3RhdGluZyBpdCB3aWxsIG5vdCBkbyBhbnl0aGluZyAhCisgICAgICovCisgICAgY29uc3QgZG91YmxlIGcgPSA5LjgxOworICAgIGNvbnN0IGRvdWJsZSBhbmdsZSA9IDIwLjA7CisgICAgY29uc3QgZG91YmxlIGNvc19hbmdsZSA9IGNvcyhhbmdsZSAvIE1fUEkpOworICAgIGNvbnN0IGRvdWJsZSBzaW5fYW5nbGUgPSBzaW4oYW5nbGUgLyBNX1BJKTsKKworICAgIGlmIChWRVJCT1NFX0NIRUNLKHJvdGF0aW9uKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNldENvYXJzZU9yaWVudGF0aW9uIC0gSHdTZW5zb3JzICVwXG4iLCBoKTsKKyAgICB9CisgICAgc3dpdGNoIChvcmllbnQpIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX0NPQVJTRV9QT1JUUkFJVDoKKyAgICAgICAgICAgIGlmIChWRVJCT1NFX0NIRUNLKHJvdGF0aW9uKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2V0dGluZyBjb2Fyc2Ugb3JpZW50YXRpb24gdG8gcG9ydHJhaXRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2h3U2Vuc29yc19zZXRTZW5zb3JWYWx1ZShoLCBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT04sIDAuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICogY29zX2FuZ2xlLCBnICogc2luX2FuZ2xlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQU5EUk9JRF9DT0FSU0VfUkVWRVJTRV9MQU5EU0NBUEU6CisgICAgICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhyb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIGNvYXJzZSBvcmllbnRhdGlvbiB0byByZXZlcnNlIGxhbmRzY2FwZVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaHdTZW5zb3JzX3NldFNlbnNvclZhbHVlKGgsIEFORFJPSURfU0VOU09SX0FDQ0VMRVJBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWcgKiBjb3NfYW5nbGUsIDAuLCAtZyAqIHNpbl9hbmdsZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFORFJPSURfQ09BUlNFX1JFVkVSU0VfUE9SVFJBSVQ6CisgICAgICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhyb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nIGNvYXJzZSBvcmllbnRhdGlvbiB0byByZXZlcnNlIHBvcnRyYWl0XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9od1NlbnNvcnNfc2V0U2Vuc29yVmFsdWUoaCwgQU5EUk9JRF9TRU5TT1JfQUNDRUxFUkFUSU9OLCAwLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWcgKiBjb3NfYW5nbGUsIC1nICogc2luX2FuZ2xlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQU5EUk9JRF9DT0FSU0VfTEFORFNDQVBFOgorICAgICAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0socm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTZXR0aW5nIGNvYXJzZSBvcmllbnRhdGlvbiB0byBsYW5kc2NhcGVcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2h3U2Vuc29yc19zZXRTZW5zb3JWYWx1ZShoLCBBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgKiBjb3NfYW5nbGUsIDAuLCBnICogc2luX2FuZ2xlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0socm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9yaWVudGF0aW9uXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIHNlbnNvcnMgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIF9od1NlbnNvcnNfaW5pdChId1NlbnNvcnMqIGgpIHsKKyAgICBoLT5zZW5zb3JzX3BvcnQgPSBOVUxMOworCisgICAgaC0+c2VydmljZSA9IHFlbXVkX3NlcnZpY2VfcmVnaXN0ZXIoInNlbnNvcnMiLCAwLCBoLCBfaHdTZW5zb3JzX2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2h3U2Vuc29yc19zYXZlLCBfaHdTZW5zb3JzX2xvYWQpOworCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X2FjY2VsZXJvbWV0ZXIpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9BQ0NFTEVSQVRJT05dLmVuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIGlmIChhbmRyb2lkX2h3LT5od19zZW5zb3JzX3Byb3hpbWl0eSkgeworICAgICAgICBoLT5zZW5zb3JzW0FORFJPSURfU0VOU09SX1BST1hJTUlUWV0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfbWFnbmV0aWNfZmllbGQpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9NQUdORVRJQ19GSUVMRF0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfb3JpZW50YXRpb24pIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTl0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfdGVtcGVyYXR1cmUpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9URU1QRVJBVFVSRV0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfbGlnaHQpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9MSUdIVF0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfcHJlc3N1cmUpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9QUkVTU1VSRV0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X3NlbnNvcnNfaHVtaWRpdHkpIHsKKyAgICAgICAgaC0+c2Vuc29yc1tBTkRST0lEX1NFTlNPUl9IVU1JRElUWV0uZW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLyogWFhYOiBUT0RPOiBBZGQgb3RoZXIgdGVzdHMgd2hlbiB3ZSBhZGQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgKiBwcm9wZXJ0aWVzIHRvIGhhcmR3YXJlLXByb3BlcnRpZXMuaW5pIGV0IGFsLiAqLworCisgICAgX2h3U2Vuc29yc19zZXRDb2Fyc2VPcmllbnRhdGlvbihoLCBBTkRST0lEX0NPQVJTRV9QT1JUUkFJVCk7CisgICAgX2h3U2Vuc29yc19zZXRQcm94aW1pdHkoaCwgMSk7Cit9CisKK3N0YXRpYyBId1NlbnNvcnMgX3NlbnNvcnNTdGF0ZVsxXSA9IHt9OworCit2b2lkIGFuZHJvaWRfaHdfc2Vuc29yc19pbml0KHZvaWQpIHsKKyAgICBId1NlbnNvcnMqIGh3ID0gX3NlbnNvcnNTdGF0ZTsKKworICAgIGlmIChody0+c2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIF9od1NlbnNvcnNfaW5pdChodyk7CisgICAgICAgIEQoIiVzOiBzZW5zb3JzIHFlbXVkIHNlcnZpY2UgaW5pdGlhbGl6ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKwordm9pZCBhbmRyb2lkX2h3X3NlbnNvcnNfaW5pdF9yZW1vdGVfY29udHJvbGxlcih2b2lkKSB7CisgICAgSHdTZW5zb3JzKiBodyA9IF9zZW5zb3JzU3RhdGU7CisKKyAgICBpZiAoIWh3LT5zZW5zb3JzX3BvcnQpIHsKKyAgICAgICAgLyogVHJ5IHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRldmljZSBhdHRhY2hlZCB0aGF0IGNhbiBiZSB1c2VkIGZvcgorICAgICAgICAqIHNlbnNvciBlbXVsYXRpb24uICovCisgICAgICAgIGh3LT5zZW5zb3JzX3BvcnQgPSBzZW5zb3JzX3BvcnRfY3JlYXRlKGh3KTsKKyAgICAgICAgaWYgKGh3LT5zZW5zb3JzX3BvcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgVigiUmVhbGlzdGljIHNlbnNvciBlbXVsYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgc2luY2UgdGhlIHJlbW90ZSAiCisgICAgICAgICAgICAgICJjb250cm9sbGVyIGlzIG5vdCBhY2Nlc3NpYmxlOlxuICVzIiwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogY2hhbmdlIHRoZSBjb2Fyc2Ugb3JpZW50YXRpb24gdmFsdWUgKi8KK2V4dGVybiB2b2lkIGFuZHJvaWRfc2Vuc29yc19zZXRfY29hcnNlX29yaWVudGF0aW9uKAorICAgICAgICBBbmRyb2lkQ29hcnNlT3JpZW50YXRpb24gb3JpZW50KSB7CisgICAgYW5kcm9pZF9od19zZW5zb3JzX2luaXQoKTsKKyAgICBfaHdTZW5zb3JzX3NldENvYXJzZU9yaWVudGF0aW9uKF9zZW5zb3JzU3RhdGUsIG9yaWVudCk7Cit9CisKKy8qIEdldCBzZW5zb3IgbmFtZSBmcm9tIHNlbnNvciBpZCAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIGFuZHJvaWRfc2Vuc29yc19nZXRfbmFtZV9mcm9tX2lkKGludCBzZW5zb3JfaWQpIHsKKyAgICBpZiAoc2Vuc29yX2lkIDwgMCB8fCBzZW5zb3JfaWQgPj0gTUFYX1NFTlNPUlMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIF9zZW5zb3JOYW1lRnJvbUlkKHNlbnNvcl9pZCk7Cit9CisKKy8qIEdldCBzZW5zb3IgaWQgZnJvbSBzZW5zb3IgbmFtZSAqLworZXh0ZXJuIGludCBhbmRyb2lkX3NlbnNvcnNfZ2V0X2lkX2Zyb21fbmFtZShjaGFyKiBzZW5zb3JuYW1lKSB7CisgICAgSHdTZW5zb3JzKiBodyA9IF9zZW5zb3JzU3RhdGU7CisKKyAgICBpZiAoc2Vuc29ybmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gU0VOU09SX1NUQVRVU19VTktOT1dOOworCisgICAgaW50IGlkID0gX3NlbnNvcklkRnJvbU5hbWUoc2Vuc29ybmFtZSk7CisKKyAgICBpZiAoaWQgPCAwIHx8IGlkID49IE1BWF9TRU5TT1JTKQorICAgICAgICByZXR1cm4gU0VOU09SX1NUQVRVU19VTktOT1dOOworCisgICAgaWYgKGh3LT5zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFody0+c2Vuc29yc1tpZF0uZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybiBTRU5TT1JfU1RBVFVTX0RJU0FCTEVEOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gU0VOU09SX1NUQVRVU19OT19TRVJWSUNFOworCisgICAgcmV0dXJuIGlkOworfQorCisvKiBJbnRlcmZhY2Ugb2YgcmVhZGluZyB0aGUgZGF0YSBmb3IgYWxsIHNlbnNvcnMgKi8KK2V4dGVybiBpbnQgYW5kcm9pZF9zZW5zb3JzX2dldChpbnQgc2Vuc29yX2lkLCBmbG9hdCogYSwgZmxvYXQqIGIsIGZsb2F0KiBjKSB7CisgICAgSHdTZW5zb3JzKiBodyA9IF9zZW5zb3JzU3RhdGU7CisKKyAgICAqYSA9IDA7CisgICAgKmIgPSAwOworICAgICpjID0gMDsKKworICAgIGlmIChzZW5zb3JfaWQgPCAwIHx8IHNlbnNvcl9pZCA+PSBNQVhfU0VOU09SUykKKyAgICAgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfVU5LTk9XTjsKKworICAgIFNlbnNvciogc2Vuc29yID0gJmh3LT5zZW5zb3JzW3NlbnNvcl9pZF07CisgICAgaWYgKGh3LT5zZXJ2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzZW5zb3ItPmVuYWJsZWQpCisgICAgICAgICAgICByZXR1cm4gU0VOU09SX1NUQVRVU19ESVNBQkxFRDsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfTk9fU0VSVklDRTsKKworICAgICphID0gc2Vuc29yLT51LnZhbHVlLmE7CisgICAgKmIgPSBzZW5zb3ItPnUudmFsdWUuYjsKKyAgICAqYyA9IHNlbnNvci0+dS52YWx1ZS5jOworCisgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfT0s7Cit9CisKKy8qIEludGVyZmFjZSBvZiBzZXR0aW5nIHRoZSBkYXRhIGZvciBhbGwgc2Vuc29ycyAqLworZXh0ZXJuIGludCBhbmRyb2lkX3NlbnNvcnNfc2V0KGludCBzZW5zb3JfaWQsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKKyAgICBId1NlbnNvcnMqIGh3ID0gX3NlbnNvcnNTdGF0ZTsKKworICAgIGlmIChzZW5zb3JfaWQgPCAwIHx8IHNlbnNvcl9pZCA+PSBNQVhfU0VOU09SUykKKyAgICAgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfVU5LTk9XTjsKKworICAgIGlmIChody0+c2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaHctPnNlbnNvcnNbc2Vuc29yX2lkXS5lbmFibGVkKQorICAgICAgICAgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfRElTQUJMRUQ7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBTRU5TT1JfU1RBVFVTX05PX1NFUlZJQ0U7CisKKyAgICBfaHdTZW5zb3JzX3NldFNlbnNvclZhbHVlKGh3LCBzZW5zb3JfaWQsIGEsIGIsIGMpOworCisgICAgcmV0dXJuIFNFTlNPUl9TVEFUVVNfT0s7Cit9CisKKy8qIEdldCBTZW5zb3IgZnJvbSBzZW5zb3IgaWQgKi8KK2V4dGVybiB1aW50OF90IGFuZHJvaWRfc2Vuc29yc19nZXRfc2Vuc29yX3N0YXR1cyhpbnQgc2Vuc29yX2lkKSB7CisgICAgSHdTZW5zb3JzKiBodyA9IF9zZW5zb3JzU3RhdGU7CisKKyAgICBpZiAoc2Vuc29yX2lkIDwgMCB8fCBzZW5zb3JfaWQgPj0gTUFYX1NFTlNPUlMpCisgICAgICAgIHJldHVybiBTRU5TT1JfU1RBVFVTX1VOS05PV047CisKKyAgICByZXR1cm4gaHctPnNlbnNvcnNbc2Vuc29yX2lkXS5lbmFibGVkOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2h3LXNlbnNvcnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1zZW5zb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhYzBlNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9ody1zZW5zb3JzLmgKQEAgLTAsMCArMSw4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyogaW5pdGlhbGl6ZSBzZW5zb3IgZW11bGF0aW9uICovCitleHRlcm4gdm9pZCAgYW5kcm9pZF9od19zZW5zb3JzX2luaXQoIHZvaWQgKTsKKworLyogaW5pdGlhbGl6ZSByZW1vdGUgY29udHJvbGxlciBmb3IgSFcgc2Vuc29ycy4gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlcgorICogaW5pdF9jbG9ja3MoKSwgaS5lLiBsYXRlciB0aGFuIGFuZHJvaWRfaHdfc2Vuc29yc19pbml0KCkuICovCitleHRlcm4gdm9pZCBhbmRyb2lkX2h3X3NlbnNvcnNfaW5pdF9yZW1vdGVfY29udHJvbGxlciggdm9pZCApOworCisvKiBOT1RFOiBTZW5zb3Igc3RhdHVzIEVycm9yIGRlZmluaXRpb24sIEl0IHdpbGwgYmUgdXNlZCBpbiB0aGUgU2Vuc29ycyBDb21tYW5kCisgKiAgICAgICBwYXJ0IGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9jb25zb2xlLmMuIERldGFpbHM6CisgKiAgICAgICBTRU5TT1JfU1RBVFVTX05PX1NFUlZJQ0U6ICJzZW5zb3JzIiBxZW11ZCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUvaW5pdGlhdGVkLgorICogICAgICAgU0VOU09SX1NUQVRVU19ESVNBQkxFRDogc2Vuc29yIGlzIGRpc2FibGVkLgorICogICAgICAgU0VOU09SX1NUQVRVU19VTktOT1dOOiB3cm9uZyBzZW5zb3IgbmFtZS4KKyAqICAgICAgIFNFTlNPUl9TVEFUVVNfT0s6IEV2ZXJ5dGhpbmcgaXMgT0sgdG8gdGhlIGN1cnJlbnQgc2Vuc29yLgorICogKi8KK3R5cGVkZWYgZW51bXsKKyAgICBTRU5TT1JfU1RBVFVTX05PX1NFUlZJQ0UgPSAtMywKKyAgICBTRU5TT1JfU1RBVFVTX0RJU0FCTEVEICAgPSAtMiwKKyAgICBTRU5TT1JfU1RBVFVTX1VOS05PV04gICAgPSAtMSwKKyAgICBTRU5TT1JfU1RBVFVTX09LICAgICAgICAgPSAwLAorfSBTZW5zb3JTdGF0dXM7CisKKy8qIE5PVEU6IHRoaXMgbGlzdCBtdXN0IGJlIHRoZSBzYW1lIHRoYXQgdGhlIG9uZSBkZWZpbmVkIGluCisgKiAgICAgICB0aGUgc2Vuc29yc19xZW11LmMgc291cmNlIG9mIHRoZSBsaWJzZW5zb3JzLmdvbGRmaXNoLnNvCisgKiAgICAgICBsaWJyYXJ5LgorICoKKyAqICAgICAgIERPIE5PVCBDSEFOR0UgVEhFIE9SREVSIElOIFRISVMgTElTVCwgVU5MRVNTIFlPVSBJTlRFTkQKKyAqICAgICAgIFRPIEJSRUFLIFNOQVBTSE9UUyEKKyAqLworI2RlZmluZSAgU0VOU09SU19MSVNUICBcCisgICAgU0VOU09SXyhBQ0NFTEVSQVRJT04sImFjY2VsZXJhdGlvbiIpIFwKKyAgICBTRU5TT1JfKE1BR05FVElDX0ZJRUxELCJtYWduZXRpYy1maWVsZCIpIFwKKyAgICBTRU5TT1JfKE9SSUVOVEFUSU9OLCJvcmllbnRhdGlvbiIpIFwKKyAgICBTRU5TT1JfKFRFTVBFUkFUVVJFLCJ0ZW1wZXJhdHVyZSIpIFwKKyAgICBTRU5TT1JfKFBST1hJTUlUWSwicHJveGltaXR5IikgXAorICAgIFNFTlNPUl8oTElHSFQsImxpZ2h0IikgXAorICAgIFNFTlNPUl8oUFJFU1NVUkUsInByZXNzdXJlIikgXAorICAgIFNFTlNPUl8oSFVNSURJVFksImh1bWlkaXR5IikKKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgIFNFTlNPUl8oeCx5KSAgQU5EUk9JRF9TRU5TT1JfIyN4LAorICAgIFNFTlNPUlNfTElTVAorI3VuZGVmICAgU0VOU09SXworICAgIE1BWF9TRU5TT1JTICAvKiBkbyBub3QgcmVtb3ZlICovCit9IEFuZHJvaWRTZW5zb3I7CisKK2V4dGVybiB2b2lkICBhbmRyb2lkX2h3X3NlbnNvcl9lbmFibGUoIEFuZHJvaWRTZW5zb3IgIHNlbnNvciApOworCisvKiBDT0FSU0UgT1JJRU5UQVRJT04gVkFMVUVTICovCit0eXBlZGVmIGVudW0geworICAgIEFORFJPSURfQ09BUlNFX1BPUlRSQUlULCAgICAgICAgICAgIC8vIDAgZGVncmVlcworICAgIEFORFJPSURfQ09BUlNFX1JFVkVSU0VfTEFORFNDQVBFLCAgIC8vIDkwIGRlZ3JlZXMKKyAgICBBTkRST0lEX0NPQVJTRV9SRVZFUlNFX1BPUlRSQUlULCAgICAvLyAxODAgZGVncmVlcworICAgIEFORFJPSURfQ09BUlNFX0xBTkRTQ0FQRSwgICAgICAgICAgIC8vIDI3MCBkZWdyZWVzCit9IEFuZHJvaWRDb2Fyc2VPcmllbnRhdGlvbjsKKworLyogY2hhbmdlIHRoZSBjb2Fyc2Ugb3JpZW50YXRpb24gdmFsdWUgKi8KK2V4dGVybiB2b2lkIGFuZHJvaWRfc2Vuc29yc19zZXRfY29hcnNlX29yaWVudGF0aW9uKCBBbmRyb2lkQ29hcnNlT3JpZW50YXRpb24gIG9yaWVudCApOworCisvKiBnZXQgc2Vuc29yIHZhbHVlcyAqLworZXh0ZXJuIGludCBhbmRyb2lkX3NlbnNvcnNfZ2V0KCBpbnQgc2Vuc29yX2lkLCBmbG9hdCogYSwgZmxvYXQqIGIsIGZsb2F0KiBjICk7CisKKy8qIHNldCBzZW5zb3IgdmFsdWVzICovCitleHRlcm4gaW50IGFuZHJvaWRfc2Vuc29yc19zZXQoIGludCBzZW5zb3JfaWQsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMgKTsKKworLyogR2V0IHNlbnNvciBpZCBmcm9tIHNlbnNvciBuYW1lICovCitleHRlcm4gaW50IGFuZHJvaWRfc2Vuc29yc19nZXRfaWRfZnJvbV9uYW1lKCBjaGFyKiBzZW5zb3JuYW1lICk7CisKKy8qIEdldCBzZW5zb3IgbmFtZSBmcm9tIHNlbnNvciBpZCAqLworZXh0ZXJuIGNvbnN0IGNoYXIqIGFuZHJvaWRfc2Vuc29yc19nZXRfbmFtZV9mcm9tX2lkKCBpbnQgc2Vuc29yX2lkICk7CisKKy8qIEdldCBzZW5zb3IgZnJvbSBzZW5zb3IgaWQgKi8KK2V4dGVybiB1aW50OF90IGFuZHJvaWRfc2Vuc29yc19nZXRfc2Vuc29yX3N0YXR1cyggaW50IHNlbnNvcl9pZCApOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ljb25zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvaWNvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjhlNmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2ljb25zLmgKQEAgLTAsMCArMSw1OTMgQEAKKy8qIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworLy8gRE8gTk9UIEVESVQKKworLy8gQXV0by1nZW5lcmF0ZWQgb24gMjAxNS0xMC0yMSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKy8vICAgICBhbmRyb2lkL3NjcmlwdHMvZ2VuZXJhdGUtYW5kcm9pZC1pY29ucy5zaCBpbWFnZXMvZW11bGF0b3JfaWNvbl8xMjgucG5nIGltYWdlcy9lbXVsYXRvcl9pY29uXzI1Ni5wbmcKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW1hZ2VzX2VtdWxhdG9yX2ljb25fMTI4X3BuZ1tdID0geworICAweDg5LCAweDUwLCAweDRlLCAweDQ3LCAweDBkLCAweDBhLCAweDFhLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDBkLAorICAweDQ5LCAweDQ4LCAweDQ0LCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLAorICAweDA4LCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDNlLCAweDYxLCAweGNiLCAweDAwLCAweDAwLCAweDAwLAorICAweDA5LCAweDcwLCAweDQ4LCAweDU5LCAweDczLCAweDAwLCAweDAwLCAweDBiLCAweDEzLCAweDAwLCAweDAwLCAweDBiLAorICAweDEzLCAweDAxLCAweDAwLCAweDlhLCAweDljLCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDE5LCAweDc0LCAweDQ1LAorICAweDU4LCAweDc0LCAweDUzLCAweDZmLCAweDY2LCAweDc0LCAweDc3LCAweDYxLCAweDcyLCAweDY1LCAweDAwLCAweDQxLAorICAweDY0LCAweDZmLCAweDYyLCAweDY1LCAweDIwLCAweDQ5LCAweDZkLCAweDYxLCAweDY3LCAweDY1LCAweDUyLCAweDY1LAorICAweDYxLCAweDY0LCAweDc5LCAweDcxLCAweGM5LCAweDY1LCAweDNjLCAweDAwLCAweDAwLCAweDA4LCAweDNjLCAweDQ5LAorICAweDQ0LCAweDQxLCAweDU0LCAweDc4LCAweGRhLCAweGVjLCAweDlkLCAweDNmLCAweDZmLCAweGRiLCAweDQ2LCAweDE4LAorICAweGM2LCAweGRmLCAweDIzLCAweDI5LCAweGM5LCAweDRhLCAweDljLCAweGM2LCAweDgxLCAweDEzLCAweDIwLCAweDQwLAorICAweDUzLCAweGMwLCAweDQ1LCAweDVhLCAweDc0LCAweDA4LCAweDBhLCAweDE0LCAweDk5LCAweDMyLCAweDE1LCAweGYxLAorICAweDI3LCAweDQ4LCAweDA2LCAweGFmLCAweDA1LCAweGUyLCAweGFkLCAweGU4LCAweGQyLCAweDBlLCAweGZkLCAweDE4LAorICAweDQ1LCAweGQxLCAweDJlLCAweDQ1LCAweDM3LCAweDA3LCAweGU4LCAweGVhLCAweDAyLCAweGNlLCAweDI3LCAweDg4LAorICAweGRiLCAweDI5LCAweDQzLCAweDg3LCAweDBjLCAweDlkLCAweDBhLCAweDA0LCAweDc1LCAweGZhLCAweDI3LCAweDcxLAorICAweDVjLCAweDJiLCAweDkxLCAweDZkLCAweDQ5LCAweGE2LCAweGY4LCAweGVmLCAweDdhLCAweDQ3LCAweDUxLCAweDMyLAorICAweDY1LCAweDkzLCAweDMyLCAweGVkLCAweDg4LCAweGJjLCAweDIzLCAweGY1LCAweDNjLCAweDAxLCAweDcxLCAweGEyLAorICAweDRjLCAweDM5LCAweGJjLCAweDdiLCAweDdlLCAweGY3LCAweGRlLCAweGZiLCAweGQyLCAweDk0LCAweDY0LCAweDEyLAorICAweDM0LCAweGQzLCAweDMyLCAweDMxLCAweDA0LCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDgwLAorICAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDQwLAorICAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDIwLAorICAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDEwLAorICAweDAwLCAweDgwLCAweDJhLCAweDIxLCAweDJiLCAweGViLCAweDgxLCAweDNmLCAweGZjLCAweGZhLCAweGY5LCAweDdkLAorICAweGQxLCAweGRjLCAweDEzLCAweGRiLCAweDEyLCAweDg2LCAweDRkLCAweDZiLCAweDZkLCAweDg5LCAweGVkLCAweGQxLAorICAweDE3LCAweDlmLCAweGZlLCAweGI4LCAweDkxLCAweGU1LCAweDYwLCAweDk2LCAweGMxLCAweGY4LCAweGJiLCAweGEyLAorICAweDU5LCAweGIzLCAweGRkLCAweGNlLCAweDkyLCAweGVkLCAweDc1LCAweGM4LCAweDBmLCAweDNjLCAweGYyLCAweDAyLAorICAweDU3LCAweGI0LCAweDJlLCAweDg2LCAweDVhLCAweGE3LCAweDUwLCAweDZlLCAweGQ0LCAweGM4LCAweDEyLCAweDliLAorICAweDY5LCAweDU4LCAweDM0LCAweDY3LCAweGNkLCAweGQzLCAweDVjLCAweDZkLCAweDVlLCAweDgyLCAweGIwLCAweDJhLAorICAweDQwLCAweGQ4LCAweDNjLCAweDM3LCAweDAwLCAweGMyLCAweGZjLCAweDA3LCAweGFlLCAweGRmLCAweDVmLCAweDZiLAorICAweDFmLCAweDZlLCAweDkzLCAweDY4LCAweDMxLCAweGNhLCAweDI1LCAweDUyLCAweGNkLCAweDZjLCAweGQwLCAweDQyLAorICAweGYzLCAweGJhLCAweDZjLCAweDI1LCAweDA0LCAweDBmLCAweGNmLCAweDBjLCAweDgwLCAweDljLCAweGY5LCAweGMyLAorICAweGY0LCAweGM3LCAweGFkLCAweGVlLCAweGRmLCAweDE0LCAweGYwLCAweDAwLCAweDIzLCAweDVhLCAweDQyLCAweDE5LAorICAweGNjLCAweGEwLCAweGM1LCAweDhiLCAweGVmLCAweDQ5LCAweDA4LCAweDk2LCAweGQzLCAweDIyLCAweDgxLCAweDkxLAorICAweGY2LCAweDYyLCAweDExLCAweGU2LCAweGQ3LCAweDYwLCAweDdlLCAweGI5LCAweDI1LCAweGJkLCAweDkzLCAweDFlLAorICAweDRhLCAweDJmLCAweDUzLCAweDIxLCAweDQ5LCAweDRiLCAweGY4LCAweDNhLCAweGZkLCAweGQ2LCAweDEyLCAweGNjLAorICAweGFmLCAweDA2LCAweDA0LCAweGQyLCAweGNiLCAweDI4LCAweDg5LCAweGNmLCAweDA2LCAweDgwLCAweGViLCAweGRiLAorICAweGY3LCAweDdhLCAweGNlLCAweDNlLCAweDQ2LCAweGFmLCAweDIyLCAweDkyLCAweDVlLCAweDRhLCAweDRmLCAweDMzLAorICAweDAzLCAweDYwLCAweDdiLCAweDVkLCAweDk0LCAweDdhLCAweDE1LCAweDUzLCAweDlhLCAweGE3LCAweDg5LCAweDAwLAorICAweDc4LCAweGJlLCAweDgzLCAweDExLCAweGFiLCAweDk4LCAweGQyLCAweDNjLCAweDRkLCAweDA0LCAweGUwLCAweGQwLAorICAweDNkLCAweGMwLCAweDg4LCAweDU1LCAweDRjLCAweDY5LCAweDllLCAweDVhLCAweGE1LCAweGVkLCAweDExLCAweDNmLAorICAweDRiLCAweDUxLCAweDNiLCAweDgzLCAweGU3LCAweDkzLCAweDUxLCAweDU2LCAweDU5LCAweDBkLCAweGU3LCAweDU5LAorICAweDRkLCAweDUwLCAweDdjLCAweGNlLCAweDRjLCAweDczLCAweDIwLCAweGFjLCAweGIyLCAweDE4LCAweGNmLCAweDEzLAorICAweGY2LCAweDg3LCAweGUzLCAweGM5LCAweGI5LCAweDI2LCAweDgzLCAweDJiLCAweDBkLCAweDY3LCAweDI5LCAweDJjLAorICAweDhhLCAweGU3LCAweDE5LCAweGQ3LCAweDBmLCAweDA0LCAweGFiLCAweDM0LCAweGU2LCAweGNiLCAweGMxLCAweDNkLAorICAweDU4LCAweDIwLCAweGEzLCAweGJiLCAweDEwLCAweDNlLCAweGU2LCAweDI3LCAweDMwLCAweGQwLCAweGE0LCAweGVlLAorICAweGJlLCAweGQ4LCAweGE2LCAweDYwLCAweGJlLCAweDlkLCAweDNlLCAweGViLCAweDM1LCAweDAzLCAweGMxLCAweGQyLAorICAweGQ5LCAweGZjLCAweDcwLCAweDljLCAweDNjLCAweDhiLCAweGNjLCAweGZmLCAweDZlLCAweDg4LCAweGVkLCAweDVkLAorICAweGVhLCAweDFkLCAweDM4LCAweGU0LCAweDM4LCAweDdhLCAweDU3LCAweDI4LCAweGY1LCAweGZhLCAweDM1LCAweDZhLAorICAweDVlLCAweGFhLCAweDkzLCAweGJmLCAweGY4LCAweDBmLCAweDc5LCAweDYyLCAweDBiLCAweDRjLCAweDNmLCAweDhjLAorICAweDBhLCAweDcyLCAweGUzLCAweDZjLCAweGUwLCAweGY5LCAweGIwLCAweGQ1LCAweDgxLCAweDVmLCAweDRiLCAweDY3LAorICAweGYzLCAweDU5LCAweDZmLCAweDllLCAweGFjLCAweDNmLCAweDZmLCAweGQxLCAweGRlLCAweDhlLCAweDRkLCAweGZiLAorICAweGZiLCAweDJmLCAweDI4LCAweDA4LCAweGNhLCAweDcxLCAweDY1LCAweGQyLCAweGQ4LCAweDM1LCAweGU4LCAweDlkLAorICAweGQ2LCAweDAyLCAweDVkLCAweGJlLCAweDc2LCAweDlkLCAweGVjLCAweDFiLCAweGJmLCAweDUzLCAweGQwLCAweGVjLAorICAweDEwLCAweDMzLCAweDI0LCAweDA0LCAweDZjLCAweDYwLCAweDdlLCAweDU0LCAweDdiLCAweDg1LCAweGNiLCAweDg1LAorICAweDYyLCAweDA4LCAweDJjLCAweDFkLCAweGNkLCAweGE3LCAweGUxLCAweGNjLCAweGZmLCAweGUzLCAweDYzLCAweDdhLAorICAweGY5LCAweGVmLCAweGFlLCAweGY2LCAweGIzLCAweGZlLCAweGM0LCAweDMyLCAweDIwLCAweDQwLCAweDZkLCAweGI3LAorICAweGRiLCAweGQ0LCAweGViLCAweGQ1LCAweDY5LCAweGQxLCAweGJlLCAweDQ1LCAweGZkLCAweDBmLCAweDdlLCAweDIzLAorICAweDczLCAweDRlLCAweDQ0LCAweDAyLCAweDgzLCAweDhiLCAweDRkLCAweGI4LCAweDFkLCAweDFjLCAweDE1LCAweGUwLAorICAweGFhLCAweDU3LCAweDAxLCAweDQzLCAweGQ3LCAweGE1LCAweGRmLCAweGZhLCAweGViLCAweDIzLCAweGRhLCAweDJlLAorICAweGExLCAweGY5LCAweDcxLCAweGM5LCAweDczLCAweDZmLCAweGJkLCAweDdhLCAweDQzLCAweGVjLCAweGY5LCAweDg3LAorICAweGU0LCAweGY2LCAweDQ1LCAweGJmLCAweDdjLCAweGIxLCAweDA1LCAweDUxLCAweDc4LCAweGUzLCAweDgzLCAweGU0LAorICAweDk1LCAweDJiLCAweGFlLCAweDVlLCAweDBjLCAweGRkLCAweDljLCAweDBmLCAweGM3LCAweDQyLCAweDg0LCAweGZlLAorICAweGZkLCAweGU3LCAweDU2LCAweGE5LCAweGNkLCAweDhmLCAweDQzLCAweGUwLCAweGI1LCAweDFhLCAweDY0LCAweGJmLAorICAweDZhLCAweDkyLCAweGViLCAweDFjLCAweDQxLCAweDEwLCAweGZlLCAweDlkLCAweDhkLCAweGFiLCAweDJmLCAweDVkLAorICAweGI1LCAweDhjLCAweDAwLCAweGU2LCAweGRlLCAweDU1LCAweGIxLCAweGU2LCAweDU3LCAweGU3LCAweDhmLCAweDUxLAorICAweDA3LCAweDA3LCAweDA3LCAweDU0LCAweGVmLCAweDVmLCAweGE1LCAweDRlLCAweDJiLCAweDA4LCAweDIxLCAweDkwLAorICAweGE5LCAweDBjLCAweDhmLCAweGE2LCAweDNmLCAweDI3LCAweGI1LCAweDUxLCAweDQwLCAweDNmLCAweDAwLCAweGM0LAorICAweDQwLCAweDFjLCAweGVlLCAweGQ0LCAweDRhLCAweDkzLCAweGYwLCAweDY1LCAweGNkLCAweDA5LCAweGZjLCAweGZkLAorICAweDQ2LCAweDY4LCAweDdjLCAweGY3LCAweDRkLCAweDQwLCAweDllLCAweDFiLCAweDg1LCAweDdmLCAweDQ0LCAweDgwLAorICAweDg0LCAweGYwLCAweDFmLCAweDg1LCAweGNkLCAweGFhLCAweGM5LCAweDBkLCAweGUzLCAweDNmLCAweDg1LCAweGExLAorICAweGJmLCAweDI3LCAweDIwLCAweGYwLCAweGRkLCAweDkzLCAweDE3LCAweGI3LCAweDEwLCAweDAxLCAweDY4LCAweDMwLAorICAweDJiLCAweDNjLCAweGQ3LCAweGFiLCAweDFjLCAweDAwLCAweGIyLCAweDRmLCAweGMzLCAweGE0LCAweDRmLCAweDQ2LAorICAweDgyLCAweDVlLCAweDliLCAweDBiLCAweDA4LCAweDM4LCAweDIyLCAweDQwLCAweDUyLCAweDA5LCAweGU4LCAweDc5LAorICAweDE1LCAweDA0LCAweDYwLCAweGQ4LCAweGE3LCAweDYwLCAweDUwLCAweGZjLCAweDBkLCAweDIxLCAweDA4LCAweDNjLAorICAweGI1LCAweGI5LCAweGEwLCAweGJlLCAweGQ3LCAweDAxLCAweDI2LCAweGU4LCAweGNlLCAweDlkLCAweDNiLCAweGI0LAorICAweGI4LCAweGI4LCAweGE4LCAweGQ1LCAweDY5LCAweGI3LCAweDVhLCAweDJkLCAweDdhLCAweGYyLCAweGU0LCAweGM5LAorICAweGU5LCAweGRkLCAweDYyLCAweGQxLCAweGUzLCAweGU4LCAweDAyLCAweDQwLCAweDc3LCAweDJmLCAweGEwLCAweDhiLAorICAweDU3LCAweDBjLCAweDMyLCAweDZiLCAweGE0LCAweGU0LCAweGEyLCAweDkwLCAweDU1LCAweDIyLCAweGRmLCAweDQ3LAorICAweGJhLCAweDdkLCAweGZiLCAweDM2LCAweGRkLCAweGJjLCAweDc5LCAweDUzLCAweDJiLCAweDAwLCAweDllLCAweDNkLAorICAweDdiLCAweDM2LCAweDExLCAweDgwLCAweGI4LCAweGE0LCAweGM3LCAweDJjLCAweDU2LCAweDAxLCAweDFjLCAweGVlLAorICAweDczLCAweGJhLCAweDcwLCAweDk5LCAweDkxLCAweGE5LCAweGMwLCAweDBkLCAweDQzLCAweDI3LCAweGY3LCAweDM1LAorICAweDQ4LCAweDhhLCAweGYzLCAweDEzLCAweDRiLCAweDAxLCAweDQxLCAweGZjLCAweDkzLCAweGI5LCAweDgxLCAweDg0LAorICAweDIwLCAweGYwLCAweDY3LCAweDNjLCAweDA3LCAweDYwLCAweDU0LCAweDVkLCAweGIxLCAweDkxLCAweGUzLCAweDJjLAorICAweGVlLCAweGZlLCAweDU4LCAweGYyLCAweGFiLCAweDAyLCAweDAyLCAweDJkLCAweGFmLCAweDAzLCAweDU0LCAweDNlLAorICAweDA4LCAweGIwLCAweDYzLCAweDdkLCAweDhkLCAweDYwLCAweDA4LCAweDIxLCAweDM4LCAweDI4LCAweDE2LCAweDAyLAorICAweGFkLCAweDAwLCAweGUwLCAweGJjLCAweGUyLCAweDYxLCAweDIwLCAweDBjLCAweGY4LCAweDA5LCAweDIwLCAweDBjLAorICAweDc3LCAweDhkLCAweDAxLCAweDE0LCAweDc2LCAweDgxLCAweDEwLCAweDE4LCAweGRhLCAweDRkLCAweDExLCAweDRlLAorICAweGIzLCAweDIxLCAweDM2LCAweGZlLCAweDk4LCAweDFkLCAweDViLCAweDBlLCAweGVjLCAweDRlLCAweDMxLCAweDEwLAorICAweDE4LCAweGRhLCAweDBkLCAweGM2LCAweGFjLCAweDk4LCAweDFlLCAweGE1LCAweDAzLCAweDhjLCAweDI1LCAweDc0LAorICAweDNmLCAweDVhLCAweDBlLCAweGZhLCAweDA1LCAweDQwLCAweDYwLCAweDEwLCAweGE0LCAweDE3LCAweGVjLCAweDZjLAorICAweDNjLCAweDE4LCAweGY2LCAweGJiLCAweGY5LCAweDQyLCAweDAwLCAweDAwLCAweDU0LCAweDI1LCAweDgxLCAweGYxLAorICAweDY0LCAweDgwLCAweDlkLCAweDM0LCAweDdmLCAweGY4LCAweDM4LCAweDhjLCAweDA0LCAweDM5LCAweDQyLCAweDAwLAorICAweDAwLCAweDE0LCAweDQwLCAweDkwLCAweDk4LCAweDA4LCAweDI2LCAweDk4LCAweDFmLCAweDk3LCAweGQzLCAweGNiLAorICAweDA3LCAweDAyLCAweDAwLCAweGEwLCAweGQwLCAweDdkLCAweDk2LCAweDc2LCAweGFkLCAweGUwLCAweDU4LCAweDllLAorICAweDMwLCAweDhjLCAweDA0LCAweDIxLCAweDA0LCAweDAxLCAweDAwLCAweGE4LCAweGQ0LCAweDdhLCAweGMwLCAweDMyLAorICAweDk4LCAweDNmLCAweDRhLCAweDBjLCAweGEzLCAweDQ4LCAweDMwLCAweGNkLCAweDc3LCAweGVkLCAweDAzLCAweDgwLAorICAweGEyLCAweDY3LCAweDdmLCAweDEyLCAweDA0LCAweGVjLCAweDc0LCAweGYzLCAweDQ3LCAweDhkLCAweDhjLCAweDA0LAorICAweDg3LCAweGQzLCAweDgzLCAweDAwLCAweDAwLCAweGE4LCAweDQ4LCAweDAwLCAweDRmLCAweGE5LCAweDBhLCAweDUyLAorICAweGNkLCAweDhmLCAweDk1LCAweDg4LCAweGQzLCAweDgyLCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAweGMxLCAweDE5LAorICAweGNjLCAweDFmLCAweDZhLCAweDVhLCAweDEwLCAweDAwLCAweDAwLCAweDQ1LCAweDEwLCAweGIwLCAweDg0LCAweDMyLAorICAweDMwLCAweGFiLCAweGY5LCAweGYxLCAweDYzLCAweDFkLCAweGZiLCAweGVkLCAweDIwLCAweDAwLCAweDAwLCAweDJhLAorICAweDIzLCAweDQxLCAweGNjLCAweGM4LCAweGYzLCAweDk4LCAweDRmLCAweGMzLCAweDljLCAweGUwLCAweDJkLCAweDIwLAorICAweDQ4LCAweGJjLCAweDA1LCAweDIxLCAweDdjLCAweGYzLCAweDQyLCAweGMxLCAweDFhLCAweGRlLCAweDI1LCAweDNiLAorICAweGJhLCAweDViLCAweGI2LCAweDZhLCAweGUyLCAweDgzLCAweDViLCAweGMxLCAweDQ3LCAweDdkLCAweDBjLCAweGEyLAorICAweDRkLCAweDlhLCAweDM5LCAweDZjLCAweDhkLCAweGEzLCAweDYzLCAweGM3LCAweDhjLCAweGNmLCAweGIwLCAweGRmLAorICAweDE3LCAweGNiLCAweDQxLCAweGFkLCAweGMxLCAweGM4LCAweDMwLCAweGE2LCAweDAwLCAweGMwLCAweDk1LCAweDJiLAorICAweGVmLCAweDE0LCAweDNkLCAweDM2LCAweGEzLCAweDNiLCAweDY2LCAweDI1LCAweDdjLCAweGZiLCAweDk2LCAweDQ5LAorICAweDU1LCAweGZiLCAweDFjLCAweDUyLCAweGQzLCAweDM0LCAweGU5LCAweGQyLCAweGE1LCAweDBiLCAweGExLCAweDQxLAorICAweDY2LCAweDhkLCAweDg5LCAweDdkLCAweGUxLCAweGI3LCAweDI1LCAweDViLCAweDM2LCAweDc4LCAweGRmLCAweGEwLAorICAweDExLCAweGI1LCAweDY5LCAweDU1LCAweDQyLCAweDVhLCAweDA0LCAweDg4LCAweDNkLCAweDI5LCAweDlmLCAweGFmLAorICAweGNmLCAweGIxLCAweGQxLCAweDdiLCAweDBmLCAweGNmLCAweDFmLCAweDAxLCAweDk4LCAweDViLCAweDNjLCAweDAwLAorICAweDM0LCAweDk4LCAweDA1LCAweDVjLCAweGRlLCAweDJiLCAweGM1LCAweDJhLCAweDE4LCAweDAyLCAweDQ0LCAweDlmLAorICAweDM4LCAweGYzLCAweDA2LCAweDU5LCAweDdjLCAweGY0LCAweDI2LCAweDUxLCAweDEyLCAweGE2LCAweGYzLCAweGM4LAorICAweDdjLCAweDM5LCAweGZiLCAweDc5LCAweDRhLCAweDM5LCAweGM4LCAweGM3LCAweGY2LCAweGQ5LCAweGQ4LCAweDNkLAorICAweDg1LCAweGM3LCAweGQ3LCAweDk2LCAweGJlLCAweDIzLCAweDIwLCAweDY4LCAweDY0LCAweDg3LCAweDAwLCAweDM5LAorICAweDgwLCAweGIyLCAweDJjLCAweDMwLCAweGQ2LCAweGIwLCAweDBjLCAweDZiLCAweDdkLCAweDY0LCAweGZlLCAweGE5LAorICAweGE1LCAweGEzLCAweGEwLCAweGMzLCAweGVkLCAweDY3LCAweGNmLCAweDA5LCAweDAwLCAweDgwLCAweGYyLCAweDJjLAorICAweDcwLCAweDhhLCAweGU2LCAweGM3LCAweGU0LCAweDNhLCAweGQ5LCAweDIwLCAweDAwLCAweDAwLCAweGJhLCAweDgwLAorICAweDcwLCAweGJjLCAweDQ0LCAweDNjLCAweGE3LCAweGY5LCAweDYzLCAweDkxLCAweDIwLCAweDAzLCAweDA0LCAweDAwLAorICAweGEwLCAweDQ4LCAweGJmLCAweGUzLCAweGY3LCAweDgzLCAweGU2LCAweDY5LCAweDNlLCAweDFkLCAweDgzLCAweDgwLAorICAweDAzLCAweDAwLCAweGJkLCAweDIwLCAweDYwLCAweDI5LCAweGQ3LCAweDAwLCAweGE2LCAweDY5LCAweDdlLCAweGVjLAorICAweDc1LCAweDkzLCAweDIyLCAweDAxLCAweDAwLCAweGQwLCAweDI0LCAweDJhLCAweGU0LCAweDY1LCAweGZlLCAweGYwLAorICAweGExLCAweGU3LCAweDcyLCAweDAwLCAweGEwLCAweDdjLCAweGJkLCAweDY3LCAweDU5LCAweGExLCAweDk4LCAweGEyLAorICAweGY5LCAweDBjLCAweDM5LCAweDgwLCAweDVlLCAweGY5LCAweDFlLCAweDliLCAweDc0LCAweDM3LCAweDQ4LCAweGIxLAorICAweGU2LCAweDAzLCAweDgwLCAweGMyLCAweDIxLCAweDYwLCAweGM5LCAweDYxLCAweDVmLCAweDkxLCAweGY5LCAweDAwLAorICAweDQwLCAweDYxLCAweDI0LCAweDM4LCAweDgyLCAweDgxLCAweDhkLCAweGVkLCAweDE3LCAweDY5LCAweDNlLCAweDAwLAorICAweDUwLCAweGI3LCAweDBlLCAweDhjLCAweDQzLCAweDUwLCAweDgwLCAweGY5LCAweDY5LCAweGNmLCAweDAzLCAweDAwLAorICAweDc1LCAweDIxLCAweDIwLCAweGQ1LCAweGM0LCAweGEyLCAweGNjLCAweDA3LCAweDAwLCAweGJhLCAweDQwLCAweGEwLAorICAweGM4LCAweDdjLCAweDAwLCAweGEwLCAweGQ1LCAweGIyLCAweDMwLCAweGU5LCAweDZhLCAweDYwLCAweDNlLCAweGU2LAorICAweDAzLCAweDgwLCAweGEyLCAweGJkLCAweDY2LCAweGU5LCAweDEzLCAweDVmLCAweDg1LCAweGY5LCAweDAwLCAweDQwLAorICAweDI1LCAweDA0LCAweDJjLCAweDM1LCAweDM3LCAweDJjLCAweGNjLCAweDdjLCAweDAwLCAweGEwLCAweDQzLCAweGQ4LAorICAweDY3LCAweGVhLCAweGNjLCAweDA3LCAweDAwLCAweDlhLCAweDU2LCAweDA0LCAweGI5LCAweDk4LCAweDhmLCAweDMyLAorICAweDUwLCAweDAzLCAweGI3LCAweDMzLCAweGNjLCAweGNlLCAweDIyLCAweGNkLCAweDA3LCAweDAwLCAweDhhLCAweGMyLAorICAweDdlLCAweGRhLCAweGNmLCAweDhhLCAweDM2LCAweDFmLCAweDAwLCAweGU4LCAweDkwLCAweDA0LCAweDJhLCAweDM0LAorICAweDFmLCAweDAwLCAweGE4LCAweDVhLCAweGYyLCAweDU5LCAweDcyLCAweDU5LCAweDk4LCAweGE3LCAweGY5LCAweDBjLAorICAweDAwLCAweGU4LCAweGI5LCAweDAyLCAweGE4LCAweDM0LCAweDFmLCAweDAwLCAweDY4LCAweDVlLCAweDExLCAweGU0LAorICAweDZkLCAweDNlLCAweDAwLCAweGQwLCAweGE1LCAweGY0LCAweDRiLCAweGJhLCAweDM4LCAweDU0LCAweDgwLCAweGY5LAorICAweDAwLCAweDQwLCAweDI3LCAweGYzLCAweDI5LCAweDY3LCAweGYzLCAweDUzLCAweDVlLCAweDBjLCAweDAwLCAweDU0LAorICAweGU2LCAweDAyLCAweDhhLCAweGNkLCAweDA3LCAweDAwLCAweDBhLCAweGNkLCAweDY3LCAweDEzLCAweDgwLCAweDI4LAorICAweGNhLCAweDdjLCAweDAwLCAweGEwLCAweGQxLCAweDRhLCAweGEwLCAweGMyLCAweDdjLCAweDAwLCAweGEwLCAweDU5LAorICAweDFlLCAweDUwLCAweGI0LCAweGY5LCAweDAwLCAweDYwLCAweDg2LCAweGNjLCAweGM3LCAweDNkLCAweDgxLCAweGRhLAorICAweDY3LCAweDg0LCAweGM1LCAweDliLCAweDlmLCAweDBhLCAweDgwLCAweGRkLCAweDM1LCAweDYxLCAweDhlLCAweDJhLAorICAweDI2LCAweDcyLCAweDMyLCAweDNmLCAweGNkLCAweGQzLCAweDQ0LCAweDAwLCAweDdjLCAweDE3LCAweDgxLCAweGExLAorICAweGE4LCAweGQ5LCAweDVlLCAweGQ0LCAweGNjLCAweDRmLCAweGYzLCAweDM0LCAweGYxLCAweGQ5LCAweDdlLCAweGNmLAorICAweGRjLCAweDgyLCAweDYzLCAweGY5LCAweGNmLCAweDcwLCAweGM2LCAweDhhLCAweDMxLCAweDdmLCAweGUwLCAweGE5LAorICAweGIxLCAweDk1LCAweDE5LCAweDAwLCAweGQ3LCAweDMxLCAweDFlLCAweDFkLCAweDc2LCAweDJjLCAweGI4LCAweDU1LAorICAweDExLCAweGYzLCAweDBmLCAweDNiLCAweDY2LCAweGU4LCAweDY5LCAweDY2LCAweDAwLCAweGJlLCAweGY5LCAweDZjLAorICAweDdkLCAweGEzLCAweGJiLCAweDU3LCAweGRiLCAweGUyLCAweDAxLCAweDgzLCAweDZiLCAweDA1LCAweDgyLCAweDkwLAorICAweDg3LCAweGY5LCAweGQyLCAweDQzLCAweGU5LCAweGU1LCAweGI3LCAweDBmLCAweDdlLCAweGRlLCAweDM4LCAweDUzLAorICAweDE1LCAweGUwLCAweGJiLCAweDZjLCAweGY1LCAweGY1LCAweDc2LCAweDgzLCAweDAwLCAweDgxLCAweDFlLCAweDM5LAorICAweGMzLCAweDc5LCAweGNkLCAweDdmLCAweGJkLCAweDVkLCAweDBmLCAweGJkLCAweDNjLCAweGYzLCAweDc1LCAweDAwLAorICAweDExLCAweDA1LCAweDM2LCAweDNkLCAweGM3LCAweDA4LCAweDIxLCAweDEwLCAweDJkLCAweDBjLCAweDI5LCAweDk5LAorICAweGY5LCAweGQyLCAweDMzLCAweDY5LCAweGJlLCAweGY0LCAweDUwLCAweGNjLCAweGZlLCAweGNkLCAweDMzLCAweDAzLAorICAweDEwLCAweDQxLCAweGYwLCAweDUwLCAweGZjLCAweDgyLCAweGU1LCAweGQ2LCAweDhiLCAweGI5LCAweGFkLCAweGY2LAorICAweDRlLCAweDgzLCAweDY0LCAweDVlLCAweGUwLCAweGQ4LCAweDI2LCAweGY5LCAweDVlLCAweDdlLCAweDUxLCAweDgxLAorICAweGNmLCAweGI4LCAweGQ5LCAweGU3LCAweDM1LCAweDVmLCAweDdhLCAweGUyLCAweGQ4LCAweDQ2LCAweGI4LCAweGRlLAorICAweGI3LCAweDc3LCAweGVhLCAweGQ0LCAweDdhLCAweGQxLCAweGQ4LCAweDkyLCAweGRlLCAweDA5LCAweGYzLCAweDFmLAorICAweDRlLCAweGZhLCAweGVmLCAweDRmLCAweGNkLCAweGY0LCAweDY0LCAweDI0LCAweDEwLCAweGNkLCAweGZiLCAweDVmLAorICAweGZmLCAweGI0LCAweDcyLCAweDVmLCAweDU0LCAweDA3LCAweGY3LCAweGM0LCAweGUzLCAweGE1LCAweDNjLCAweDVjLAorICAweDBmLCAweGJmLCAweDM2LCAweDk2LCAweDBmLCAweDNlLCAweGNiLCAweGM2LCAweGU5LCAweDlhLCAweDlmLCAweDg4LAorICAweGRkLCAweDg1LCAweGI0LCAweGMzLCAweDc3LCAweDc3LCAweDc3LCAweGE5LCAweGQ5LCAweDZjLCAweDZhLCAweGU1LAorICAweGEzLCAweDNjLCAweGE3LCAweDQ5LCAweGYyLCAweDZjLCAweGIzLCAweGZkLCAweGZhLCAweDY1LCAweGYzLCAweGE5LAorICAweDIxLCAweDNmLCAweDIxLCAweGQ0LCAweDY0LCAweDc0LCAweGQ0LCAweDQ2LCAweDlmLCAweDEwLCAweDFhLCAweDdkLAorICAweGQyLCAweGU3LCAweDY0LCAweGYzLCAweDMzLCAweDlkLCAweDhhLCAweGNjLCAweGY2LCAweDFmLCAweGE1LCAweGFkLAorICAweGY5LCAweGU3LCAweGZiLCAweDk1LCAweDA1LCAweDZiLCAweDc1LCAweDc1LCAweGY1LCAweGIxLCAweDY4LCAweGVlLAorICAweGE2LCAweGZkLCAweDdjLCAweDdlLCAweDdlLCAweDllLCAweDJjLCAweDRiLCAweGFmLCAweDJhLCAweDQ1LCAweDdlLAorICAweDNkLCAweDdjLCAweGE3LCAweGQzLCAweDk5LCAweDc0LCAweGM4LCAweGU2LCAweGRhLCAweGRhLCAweGRhLCAweGIyLAorICAweDZlLCAweDYzLCAweGFkLCAweDY1LCAweGFkLCAweDE3LCAweDA0LCAweDAxLCAweDE5LCAweDEzLCAweDNlLCAweGY1LAorICAweGY4LCAweDk0LCAweDgxLCAweDI2LCAweDVkLCAweGZiLCAweGE0LCAweGEzLCAweDBjLCAweDBjLCAweDE2LCAweDAwLAorICAweGQwLCAweDRlLCAweDMyLCAweDljLCAweDU2LCAweDRkLCAweGJhLCAweGY2LCAweDQ5LCAweDRiLCAweDAwLCAweDVjLAorICAweGQ3LCAweGZkLCAweDg1LCAweDU3LCAweGU4LCAweDRiLCAweDAzLCAweDY0LCAweDVmLCAweDY0LCAweDlmLCAweDAwLAorICAweDQwLCAweDc2LCAweDZkLCAweDg4LCAweDAxLCAweGFiLCAweDBjLCAweDAwLCAweDUxLCAweDVmLCAweDM2LCAweDAwLAorICAweDQwLCAweDQ2LCAweGFkLCAweGFmLCAweGFmLCAweDNmLCAweGVkLCAweGY3LCAweGZiLCAweDFiLCAweDU1LCAweGM4LAorICAweDA1LCAweDY0LCAweDFmLCAweDY0LCAweDVmLCAweDY0LCAweDlmLCAweDAwLCAweGMwLCAweDE5LCAweGFiLCAweGMxLAorICAweDVlLCAweGFmLCAweGQ3LCAweDJlLCAweDMzLCAweDA0LCAweGYyLCAweGRjLCAweDY1LCAweDFmLCAweDY0LCAweDVmLAorICAweDc0LCAweDNkLCAweDQ3LCAweDZkLCAweDAxLCAweDEwLCAweDMzLCAweGE2LCAweDJkLCAweGQ2LCAweGNlLCAweGU1LAorICAweDZlLCAweGI3LCAweGJiLCAweGU1LCAweDM4LCAweDBlLCAweDk1LCAweDI5LCAweDI3LCAweDkwLCAweGU3LCAweDJhLAorICAweGNmLCAweDU5LCAweDllLCAweGJiLCAweGVjLCAweDgzLCAweGVjLCAweDhiLCAweGFlLCAweGU3LCAweGFhLCAweGZkLAorICAweDVmLCAweDdhLCAweDU2LCAweDU2LCAweDU2LCAweGU0LCAweDE1LCAweGMxLCAweGFmLCAweGM0LCAweGY2LCAweGE1LAorICAweDY1LCAweDU5LCAweDBiLCAweGYyLCAweGJiLCAweDc3LCAweDc0LCAweDk2LCAweGVmLCAweGZiLCAweDMyLCAweGUzLAorICAweDk3LCAweDg2LCAweDdmLCAweDJmLCAweGI2LCAweGVmLCAweDc0LCAweDM2LCAweGJmLCAweDE0LCAweDAwLCAweDFjLAorICAweDgzLCAweGUxLCAweDJlLCAweDRkLCAweGI4LCAweDQyLCAweGE4LCAweDg5LCAweDM2LCAweDg1LCAweGU5LCAweDliLAorICAweDA0LCAweDQxLCAweDY1LCAweDEwLCAweGVlLCAweGZlLCAweDA0LCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLAorICAweDAwLCAweDA0LCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweDQwLCAweDAwLAorICAweDAwLCAweDlhLCAweDExLCAweGZkLCAweDJmLCAweGMwLCAweDAwLCAweDcwLCAweDNkLCAweDU3LCAweGFiLCAweDMyLAorICAweGJlLCAweGU4LCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ5LCAweDQ1LCAweDRlLCAweDQ0LCAweGFlLAorICAweDQyLCAweDYwLCAweDgyCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbWFnZXNfZW11bGF0b3JfaWNvbl8yNTZfcG5nW10gPSB7CisgIDB4ODksIDB4NTAsIDB4NGUsIDB4NDcsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGQsCisgIDB4NDksIDB4NDgsIDB4NDQsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisgIDB4MDgsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NWMsIDB4NzIsIDB4YTgsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDksIDB4NzAsIDB4NDgsIDB4NTksIDB4NzMsIDB4MDAsIDB4MDAsIDB4MGIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MGIsCisgIDB4MTMsIDB4MDEsIDB4MDAsIDB4OWEsIDB4OWMsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTksIDB4NzQsIDB4NDUsCisgIDB4NTgsIDB4NzQsIDB4NTMsIDB4NmYsIDB4NjYsIDB4NzQsIDB4NzcsIDB4NjEsIDB4NzIsIDB4NjUsIDB4MDAsIDB4NDEsCisgIDB4NjQsIDB4NmYsIDB4NjIsIDB4NjUsIDB4MjAsIDB4NDksIDB4NmQsIDB4NjEsIDB4NjcsIDB4NjUsIDB4NTIsIDB4NjUsCisgIDB4NjEsIDB4NjQsIDB4NzksIDB4NzEsIDB4YzksIDB4NjUsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MTAsIDB4ZjgsIDB4NDksCisgIDB4NDQsIDB4NDEsIDB4NTQsIDB4NzgsIDB4ZGEsIDB4ZWMsIDB4OWQsIDB4NGQsIDB4OGYsIDB4ZGIsIDB4YzYsIDB4MWQsCisgIDB4ODcsIDB4NjcsIDB4MjgsIDB4YWQsIDB4NTYsIDB4NmIsIDB4YWYsIDB4ZDMsIDB4OGQsIDB4YmQsIDB4NmUsIDB4OWQsCisgIDB4MTYsIDB4NGUsIDB4MWMsIDB4ZjQsIDB4OTAsIDB4MjYsIDB4MGUsIDB4NTAsIDB4MjcsIDB4MWYsIDB4YTAsIDB4NzUsCisgIDB4YmUsIDB4ODEsIDB4MDMsIDB4ZjgsIDB4OTAsIDB4NGIsIDB4NjEsIDB4ZmIsIDB4NTYsIDB4ZjQsIDB4NjYsIDB4YTAsCisgIDB4ZjcsIDB4YTYsIDB4YzcsIDB4MDIsIDB4NDUsIDB4NzMsIDB4MmIsIDB4N2EsIDB4YjMsIDB4OGQsIDB4NWUsIDB4NzIsCisgIDB4NzAsIDB4OTEsIDB4MWMsIDB4N2IsIDB4Y2IsIDB4YjYsIDB4MWYsIDB4MjAsIDB4NzUsIDB4MDEsIDB4YzcsIDB4ZTgsCisgIDB4YTEsIDB4NjgsIDB4YjYsIDB4NzUsIDB4MGEsIDB4MmYsIDB4ZGMsIDB4YjUsIDB4MjMsIDB4YWYsIDB4YjUsIDB4YWIsCisgIDB4MzcsIDB4OGEsIDB4ZDMsIDB4MTksIDB4OGEsIDB4NWMsIDB4NTEsIDB4NWEsIDB4YmQsIDB4OTAsIDB4ZDQsIDB4MWIsCisgIDB4YzksIDB4NzksIDB4OWUsIDB4OTYsIDB4ZDEsIDB4ZWIsIDB4NmEsIDB4YmQsIDB4MjQsIDB4N2YsIDB4Y2YsIDB4ZmMsCisgIDB4ZmYsIDB4NDMsIDB4NGEsIDB4MTIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTAsIDB4YzgsIDB4YzgsIDB4NDUsIDB4YmUsIDB4ZjgsIDB4ZWYsIDB4ZmYsIDB4ZmEsCisgIDB4ZjMsIDB4MmIsIDB4ZmEsIDB4NjIsIDB4NGIsIDB4MmYsIDB4NTcsIDB4NTksIDB4ZDUsIDB4MDAsIDB4ODksIDB4ZDksCisgIDB4ZDEsIDB4NGIsIDB4ZWQsIDB4MTcsIDB4M2YsIDB4ZjksIDB4YzMsIDB4ODMsIDB4ZGMsIDB4MDgsIDB4NDAsIDB4ODcsCisgIDB4ZGUsIDB4ODQsIDB4ZmQsIDB4ODYsIDB4NWUsIDB4YWUsIDB4MDUsIDB4ZTEsIDB4MDcsIDB4ODAsIDB4ZDksIDB4YTgsCisgIDB4ZTksIDB4ZTUsIDB4NzMsIDB4YmQsIDB4ZGMsIDB4ZDMsIDB4MzIsIDB4ZDgsIDB4YzksIDB4YTQsIDB4MDAsIDB4ODIsCisgIDB4ZTAsIDB4N2YsIDB4YTIsIDB4MTcsIDB4MzMsIDB4ZWEsIDB4OGIsIDB4NjYsIDB4YTcsIDB4MmUsIDB4M2EsIDB4NWUsCisgIDB4NGIsIDB4YjQsIDB4ZGQsIDB4ODYsIDB4ZmYsIDB4YjgsIDB4YTcsIDB4YmEsIDB4YTIsIDB4ZDMsIDB4NmQsIDB4YjEsCisgIDB4MjksIDB4MDEsIDB4YTYsIDB4YjAsIDB4NTYsIDB4NWEsIDB4MTcsIDB4OGUsIDB4MmMsIDB4ZjksIDB4ZDcsIDB4MmIsCisgIDB4ZTUsIDB4MGQsIDB4YjEsIDB4ZTYsIDB4YWMsIDB4OGIsIDB4ZWEsIDB4ZGEsIDB4NjYsIDB4ZjgsIDB4ZjAsIDB4YWUsCisgIDB4NWUsIDB4NmUsIDB4Y2QsIDB4NGIsIDB4MDQsIDB4NzIsIDB4MGUsIDB4YzEsIDB4ZGYsIDB4MGEsIDB4ODIsIDB4N2YsCisgIDB4YjMsIDB4ZWIsIDB4NzUsIDB4YzQsIDB4Y2IsIDB4ZDYsIDB4MzMsIDB4M2YsIDB4ZmMsIDB4OWUsIDB4ZjIsIDB4ZDgsCisgIDB4OTIsIDB4MDAsIDB4NzMsIDB4YzIsIDB4OTEsIDB4OGUsIDB4MmYsIDB4ODEsIDB4MzMsIDB4ZWIsIDB4ZTcsIDB4NDQsCisgIDB4YzksIDB4NTksIDB4MzMsIDB4NzcsIDB4ZGQsIDB4ZDUsIDB4Y2IsIDB4NmQsIDB4MmQsIDB4ODIsIDB4ZGEsIDB4Y2EsCisgIDB4MDQsIDB4YTAsIDB4YzMsIDB4N2YsIDB4NDksIDB4NWYsIDB4N2MsIDB4YTYsIDB4YzMsIDB4N2UsIDB4ZTUsIDB4YjAsCisgIDB4ZmQsIDB4YWQsIDB4NzgsIDB4ZDksIDB4N2MsIDB4YzYsIDB4OTYsIDB4MDIsIDB4NTgsIDB4MzAsIDB4NjcsIDB4YWEsCisgIDB4ZTcsIDB4YzQsIDB4ZTksIDB4Y2EsIDB4YWIsIDB4NDYsIDB4MGEsIDB4NjYsIDB4NmUsIDB4ZTAsIDB4NDMsIDB4MmQsCisgIDB4ODEsIDB4ZGQsIDB4YTUsIDB4MGIsIDB4MjAsIDB4MDgsIDB4ZmYsIDB4ZGYsIDB4NzQsIDB4NTksIDB4YmYsIDB4NTUsCisgIDB4NmIsIDB4ZWMsIDB4NTEsIDB4ZGUsIDB4MDMsIDB4MmMsIDB4YjksIDB4NGQsIDB4ZDgsIDB4ZGEsIDB4YjgsIDB4NjAsCisgIDB4MmUsIDB4NGQsIDB4MDUsIDB4ZjAsIDB4NWUsIDB4NWEsIDB4MDksIDB4YzgsIDB4OTQsIDB4ZTEsIDB4MzcsIDB4NjUsCisgIDB4ZmYsIDB4MTcsIDB4M2EsIDB4ZjQsIDB4NTcsIDB4OWUsIDB4MWQsIDB4M2UsIDB4YTYsIDB4ZGMsIDB4MDcsIDB4NTgsCisgIDB4NTEsIDB4NWIsIDB4NzAsIDB4ZWUsIDB4ZjQsIDB4NDUsIDB4MjMsIDB4MDEsIDB4NTMsIDB4MDksIDB4N2MsIDB4OTAsCisgIDB4YTYsIDB4MWQsIDB4NzAsIDB4NTIsIDB4ZmUsIDB4ZWUsIDB4NGYsIDB4MDgsIDB4M2YsIDB4YzAsIDB4NmEsIDB4MzEsCisgIDB4ZDksIDB4MzMsIDB4MTksIDB4MzQsIDB4NTksIDB4MTQsIDB4YmQsIDB4NzksIDB4YjgsIDB4YzUsIDB4NTcsIDB4MDAsCisgIDB4NjYsIDB4YjYsIDB4NWYsIDB4ZmYsIDB4ZTIsIDB4MmYsIDB4OWUsIDB4YmUsIDB4ZmMsIDB4MTcsIDB4ZTEsIDB4MDcsCisgIDB4YzgsIDB4MDAsIDB4NjYsIDB4NTIsIDB4ZjAsIDB4ZmMsIDB4ZTYsIDB4MWIsIDB4YTYsIDB4MjIsIDB4ZjgsIDB4MjAsCisgIDB4ZTksIDB4ZDEsIDB4ODEsIDB4MzQsIDB4MTUsIDB4YzAsIDB4MWQsIDB4ZDMsIDB4ZjMsIDB4MTMsIDB4N2UsIDB4ODAsCisgIDB4NmMsIDB4NjAsIDB4OGUsIDB4YmUsIDB4OTksIDB4NGMsIDB4YTYsIDB4YTksIDB4MDIsIDB4MTIsIDB4NTUsIDB4MDAsCisgIDB4NjYsIDB4ZjQsIDB4NmYsIDB4YmIsIDB4OGQsIDB4MmYsIDB4ZjYsIDB4NzUsIDB4ZDksIDB4MDEsIDB4MDAsIDB4ZDksCisgIDB4NjIsIDB4ZmIsIDB4ZjQsIDB4NDUsIDB4NzMsIDB4ZGUsIDB4NDAsIDB4YTIsIDB4MmEsIDB4MjAsIDB4NjksIDB4MDUsCisgIDB4NzAsIDB4YzMsIDB4MWMsIDB4ZTcsIDB4MDcsIDB4ODAsIDB4ZWMsIDB4MTEsIDB4NjQsIDB4ZjMsIDB4YzYsIDB4YzIsCisgIDB4NWEsIDB4ODAsIDB4NGUsIDB4YjcsIDB4NzksIDB4YWQsIDB4ZTUsIDB4MWUsIDB4YjEsIDB4YTYsIDB4MDEsIDB4MzIsCisgIDB4ODgsIDB4YzksIDB4YTYsIDB4YzksIDB4ZTgsIDB4NDIsIDB4MDQsIDB4NjAsIDB4ZGUsIDB4ZDgsIDB4NzMsIDB4ZDQsCisgIDB4NzksIDB4YzksIDB4YjksIDB4ZmQsIDB4MDAsIDB4MTksIDB4YzYsIDB4NjQsIDB4MzQsIDB4NzgsIDB4MTMsIDB4ZGUsCisgIDB4ZGMsIDB4MmIsIDB4ODAsIDB4MmQsIDB4OTcsIDB4OTMsIDB4N2QsIDB4MDAsIDB4MzIsIDB4NGQsIDB4OTAsIDB4ZDEsCisgIDB4YWQsIDB4NDUsIDB4MDgsIDB4ZTAsIDB4MmEsIDB4ZTUsIDB4M2YsIDB4NDAsIDB4ZjYsIDB4ZGIsIDB4MDAsIDB4OTEsCisgIDB4ZTAsIDB4ZWQsIDB4ZjcsIDB4YjEsIDB4MDUsIDB4MTAsIDB4YmUsIDB4YWIsIDB4MGYsIDB4MDAsIDB4YjIsIDB4NGQsCisgIDB4OTIsIDB4YWMsIDB4YzYsIDB4MTYsIDB4NDAsIDB4YWIsIDB4Y2IsIDB4ZTgsIDB4MGYsIDB4OTAsIDB4OGIsIDB4MmEsCisgIDB4MjAsIDB4NDEsIDB4NTYsIDB4NjMsIDB4MGIsIDB4ODAsIDB4NzcsIDB4ZmEsIDB4MDEsIDB4ZTQsIDB4ODMsIDB4MjQsCisgIDB4NTksIDB4NzUsIDB4NTgsIDB4NWQsIDB4MDAsIDB4ZjYsIDB4ODIsIDB4MDAsIDB4NTYsIDB4ODUsIDB4MGEsIDB4MTYsCisgIDB4NjAsIDB4N2QsIDB4YWQsIDB4OTAsIDB4MzIsIDB4YWIsIDB4NjAsIDB4NDksIDB4M2IsIDB4NmYsIDB4OWEsIDB4YzcsCisgIDB4NjAsIDB4ZjIsIDB4ZmEsIDB4OTIsIDB4OTEsIDB4ZGIsIDB4OTIsIDB4NTUsIDB4ODMsIDB4MDAsIDB4ZjIsIDB4MTIsCisgIDB4N2EsIDB4YjIsIDB4OWYsIDB4MGEsIDB4MzksIDB4NjksIDB4MDUsIDB4YWEsIDB4ODgsIDB4MTAsIDB4OTAsIDB4MDEsCisgIDB4MDIsIDB4NTgsIDB4NTksIDB4ZTgsIDB4ZTUsIDB4YzksIDB4NjQsIDB4YWIsIDB4MzQsIDB4YWYsIDB4NDMsIDB4ZDIsCisgIDB4NGYsIDB4YWMsIDB4NTcsIDB4MzUsIDB4ZWQsIDB4ZTksIDB4NmEsIDB4ZTgsIDB4MTIsIDB4MTEsIDB4MjAsIDB4ODAsCisgIDB4YTUsIDB4MDYsIDB4M2YsIDB4YjIsIDB4ZjMsIDB4MjksIDB4NDIsIDB4M2QsIDB4ZGYsIDB4ZWEsIDB4NjksIDB4NDIsCisgIDB4ZmEsIDB4ZDUsIDB4MzgsIDB4NzcsIDB4MjAsIDB4MDIsIDB4MDQsIDB4YjAsIDB4YjQsIDB4OWQsIDB4MzUsIDB4NDEsCisgIDB4ZjAsIDB4MTUsIDB4NDIsIDB4OTgsIDB4YWQsIDB4NDAsIDB4OTAsIDB4ZTMsIDB4ZTcsIDB4MDQsIDB4MTQsIDB4MjIsCisgIDB4NDAsIDB4MDAsIDB4MmIsIDB4MWYsIDB4YjQsIDB4ODYsIDB4NWIsIDB4ODAsIDB4MDksIDB4MjMsIDB4ZGEsIDB4OTgsCisgIDB4YWUsIDB4MDEsIDB4MjIsIDB4OTksIDB4MWQsIDB4NmUsIDB4ZWIsIDB4ZDUsIDB4MzgsIDB4MjEsIDB4NDQsIDB4MWUsCisgIDB4NTAsIDB4NzIsIDB4OGMsIDB4MDgsIDB4OTAsIDB4MDAsIDB4MDIsIDB4OTgsIDB4NzcsIDB4ODksIDB4M2EsIDB4MmEsCisgIDB4ZmMsIDB4NGUsIDB4N2QsIDB4NGIsIDB4NDgsIDB4YjMsIDB4MzQsIDB4NGUsIDB4MGIsIDB4ZDEsIDB4MmQsIDB4ZDMsCisgIDB4MGUsIDB4YTQsIDB4YTEsIDB4ZTQsIDB4MGEsIDB4NmYsIDB4ZTMsIDB4NTAsIDB4NzgsIDB4YTcsIDB4NmIsIDB4ZmUsCisgIDB4MzIsIDB4YWUsIDB4ZjcsIDB4NTcsIDB4MTMsIDB4NjQsIDB4MzAsIDB4NTIsIDB4MDQsIDB4ODAsIDB4MDAsIDB4ZTYsCisgIDB4MWUsIDB4N2UsIDB4N2QsIDB4NDUsIDB4YjYsIDB4YWIsIDB4YTIsIDB4YjQsIDB4ZjcsIDB4ODYsIDB4NzAsIDB4NWUsCisgIDB4NmMsIDB4MGYsIDB4ODQsIDB4YmUsIDB4ZGQsIDB4NmUsIDB4MGIsIDB4Y2YsIDB4ZTMsIDB4MjMsIDB4ZDQsIDB4OTIsCisgIDB4ZTAsIDB4MzgsIDB4OGUsIDB4YTgsIDB4NTQsIDB4MmEsIDB4YzIsIDB4MzksIDB4ZDAsIDB4ZWIsIDB4NTIsIDB4YmMsCisgIDB4MjEsIDB4OTQsIDB4OTEsIDB4YzEsIDB4MmIsIDB4ZmIsIDB4YTIsIDB4ZjMsIDB4ZGQsIDB4NWQsIDB4YTEsIDB4ZDYsCisgIDB4NWEsIDB4N2UsIDB4ZDAsIDB4ZDUsIDB4MDQsIDB4MTksIDB4MGMsIDB4ODgsIDB4NDAsIDB4NDYsIDB4MDYsIDB4N2YsCisgIDB4ZGEsIDB4MDEsIDB4MDQsIDB4MzAsIDB4ZDcsIDB4ZjAsIDB4OWIsIDB4ZmYsIDB4ZTgsIDB4YjAsIDB4OTcsIDB4ZmYsCisgIDB4ZmIsIDB4NDMsIDB4ZTEsIDB4M2MsIDB4YmYsIDB4ZTAsIDB4ZGYsIDB4N2YsIDB4NzQsIDB4NzQsIDB4YTQsIDB4OTcsCisgIDB4OWEsIDB4NjgsIDB4MzYsIDB4OWIsIDB4YzIsIDB4NzUsIDB4NWQsIDB4ZDYsIDB4ZGIsIDB4MmMsIDB4M2IsIDB4NjgsCisgIDB4YjksIDB4MmMsIDB4YWEsIDB4ZDUsIDB4YWEsIDB4MzgsIDB4NzUsIDB4ZWEsIDB4OTQsIDB4MzgsIDB4ZDUsIDB4YmQsCisgIDB4MjAsIDB4NGEsIDB4ZGYsIDB4NWUsIDB4MTAsIDB4ZWUsIDB4ZDYsIDB4OWUsIDB4NzAsIDB4MmYsIDB4ZmMsIDB4NTMsCisgIDB4YTgsIDB4YjIsIDB4MWIsIDB4NjQsIDB4NTksIDB4ZjYsIDB4YjYsIDB4ODUsIDB4MGUsIDB4YjUsIDB4MGMsIDB4MDMsCisgIDB4MWYsIDB4NWMsIDB4Y2EsIDB4NTEsIDB4MTIsIDB4YTAsIDB4MWQsIDB4NDAsIDB4MDAsIDB4YjMsIDB4ODQsIDB4M2YsCisgIDB4ZWEsIDB4MDEsIDB4NTMsIDB4ZWEsIDB4OTcsIDB4YmYsIDB4YmUsIDB4ZWMsIDB4NGIsIDB4YTAsIDB4NTYsIDB4YWIsCisgIDB4ODksIDB4N2EsIDB4YmQsIDB4NGUsIDB4ZTgsIDB4ZTcsIDB4ODgsIDB4NTksIDB4OTcsIDB4NjYsIDB4OWQsIDB4OWEsCisgIDB4YzUsIDB4YzgsIDB4NjAsIDB4NzMsIDB4NzMsIDB4NTMsIDB4NmMsIDB4MDksIDB4MmQsIDB4ODIsIDB4OTcsIDB4ZGIsCisgIDB4YTIsIDB4N2QsIDB4ZjEsIDB4YTEsIDB4ZTgsIDB4OWEsIDB4ZDYsIDB4YzAsIDB4YTQsIDB4NWQsIDB4MDYsIDB4ZjUsCisgIDB4YmUsIDB4MWMsIDB4MzEsIDB4N2YsIDB4MjAsIDB4MDcsIDB4NWIsIDB4MDIsIDB4NzIsIDB4OGYsIDB4MDAsIDB4ZTYsCisgIDB4MjIsIDB4MDQsIDB4MzMsIDB4ZTIsIDB4OTcsIDB4ZmYsIDB4ZjMsIDB4OTYsIDB4M2YsIDB4ZDIsIDB4ZWYsIDB4ZWYsCisgIDB4ZWYsIDB4MTEsIDB4ZmMsIDB4MjUsIDB4YzgsIDB4MjAsIDB4OTQsIDB4ZWMsIDB4ZjYsIDB4ZjYsIDB4YjYsIDB4YTgsCisgIDB4ZWUsIDB4NWUsIDB4MTEsIDB4YWQsIDB4ZWYsIDB4ZmYsIDB4NDMsIDB4NzQsIDB4NzUsIDB4NDUsIDB4ZTAsIDB4YjcsCisgIDB4NjAsIDB4ZjIsIDB4ZTQsIDB4MTEsIDB4NTksIDB4MTksIDB4NTQsIDB4MDMsIDB4ZDEsIDB4OTYsIDB4NDAsIDB4MGQsCisgIDB4NTUsIDB4MDYsIDB4MDgsIDB4MDAsIDB4MTIsIDB4OGYsIDB4ZmUsIDB4NjEsIDB4ZjgsIDB4MGYsIDB4MGUsIDB4MGUsCisgIDB4YzQsIDB4ZjMsIDB4ZTcsIDB4Y2YsIDB4NTksIDB4NDcsIDB4NGIsIDB4MTYsIDB4YzEsIDB4ZGUsIDB4ZGUsIDB4OWUsCisgIDB4MzgsIDB4N2IsIDB4ZjYsIDB4YWMsIDB4MzgsIDB4YTMsIDB4ZGUsIDB4MTIsIDB4OGQsIDB4YWUsIDB4MjcsIDB4ZDQsCisgIDB4ZDksIDB4YTcsIDB4NjIsIDB4ZjAsIDB4ZDAsIDB4OGEsIDB4MWMsIDB4MzgsIDB4ODIsIDB4YTAsIDB4YzQsIDB4MDQsCisgIDB4MDksIDB4NTgsIDB4M2MsIDB4MjcsIDB4ODAsIDB4MDAsIDB4OTIsIDB4ODYsIDB4ZGYsIDB4OGMsIDB4MjYsIDB4OGQsCisgIDB4NGQsIDB4M2YsIDB4ZmMsIDB4ZmIsIDB4ZmIsIDB4ZmIsIDB4ZmUsIDB4NjgsIDB4MDQsIDB4YWIsIDB4YzEsIDB4ODgsCisgIDB4ZDcsIDB4NGMsIDB4YjAsIDB4YmUsIDB4YWEsIDB4N2UsIDB4MjQsIDB4MGUsIDB4NGIsIDB4NzUsIDB4NTEsIDB4N2EsCisgIDB4ZTUsIDB4YTgsIDB4MTcsIDB4NjQsIDB4MzksIDB4NzgsIDB4ZjgsIDB4NTAsIDB4MDUsIDB4NzMsIDB4MDMsIDB4MDMsCisgIDB4MTIsIDB4MTAsIDB4Y2MsIDB4MDksIDB4ZjgsIDB4MDMsIDB4MTksIDB4YmIsIDB4NTEsIDB4NjIsIDB4MGYsIDB4ZjgsCisgIDB4M2QsIDB4YmYsIDB4MTksIDB4ZjksIDB4MDksIDB4ZmYsIDB4ZWEsIDB4MzEsIDB4ZGIsIDB4ZTAsIDB4NTAsIDB4MmYsCisgIDB4OTUsIDB4NmYsIDB4MmUsIDB4OGIsIDB4ZTYsIDB4OTEsIDB4ZjIsIDB4Y2IsIDB4ZmQsIDB4ZGUsIDB4YTIsIDB4ODIsCisgIDB4MjUsIDB4MTgsIDB4ZjEsIDB4YzMsIDB4OTEsIDB4N2YsIDB4ZGMsIDB4ODksIDB4NWIsIDB4OTYsIDB4NTYsIDB4MDAsCisgIDB4MDgsIDB4MjAsIDB4NmUsIDB4ZWEsIDB4ODMsIDB4ZGIsIDB4YTUsIDB4YmQsIDB4NGIsIDB4YTIsIDB4NzUsIDB4MjAsCisgIDB4MjgsIDB4ZmIsIDB4MzMsIDB4NTYsIDB4MDksIDB4YTgsIDB4NzYsIDB4NDksIDB4MzgsIDB4NGYsIDB4MmUsIDB4OGEsCisgIDB4OTYsIDB4OTEsIDB4ODAsIDB4MjcsIDB4ZmEsIDB4YzEsIDB4MWYsIDB4OTYsIDB4ODAsIDB4OTgsIDB4NzAsIDB4NjIsCisgIDB4OTYsIDB4NDIsIDB4MDAsIDB4MzAsIDB4YzksIDB4MDMsIDB4ZGQsIDB4YjIsIDB4MjgsIDB4ZmQsIDB4ZWYsIDB4MDcsCisgIDB4N2UsIDB4ZTksIDB4MGYsIDB4ZDksIDB4ZTIsIDB4OTksIDB4ZGUsIDB4MjYsIDB4OWIsIDB4YWQsIDB4ZDcsIDB4NDUsCisgIDB4YjMsIDB4NTYsIDB4MTIsIDB4YWQsIDB4NDYsIDB4MjAsIDB4MDEsIDB4MmYsIDB4MmEsIDB4MDEsIDB4NzUsIDB4MzIsCisgIDB4ZTQsIDB4NTQsIDB4MDEsIDB4MDgsIDB4MjAsIDB4YzksIDB4ZTgsIDB4NmYsIDB4NGUsIDB4ZjAsIDB4YTksIDB4M2QsCisgIDB4ZTMsIDB4MzAsIDB4NWYsIDB4MTYsIDB4MzEsIDB4ZGIsIDB4ZTQsIDB4ZjAsIDB4ZTAsIDB4NDgsIDB4NTQsIDB4OWEsCisgIDB4ZTcsIDB4NDQsIDB4ZTMsIDB4ODUsIDB4MTIsIDB4ZWQsIDB4NDYsIDB4YmYsIDB4MWQsIDB4MTAsIDB4YWEsIDB4NWYsCisgIDB4ZmUsIDB4MmIsIDB4MzUsIDB4YmEsIDB4MTUsIDB4MTgsIDB4YjksIDB4Y2QsIDB4MTEsIDB4ODAsIDB4YzUsIDB4YzgsCisgIDB4OTMsIDB4ZmIsIDB4ODQsIDB4ZjMsIDB4ZmMsIDB4N2IsIDB4ZjQsIDB4ZmQsIDB4MTksIDB4OWYsIDB4MGYsIDB4MzgsCisgIDB4ZGQsIDB4YjksIDB4ZTAsIDB4ODcsIDB4ZmIsIDB4ZTgsIDB4NjAsIDB4NTAsIDB4MDIsIDB4MmEsIDB4ZjIsIDB4MGUsCisgIDB4YWMsIDB4ODksIDB4NmYsIDB4MzYsIDB4NTQsIDB4MDgsIDB4MDAsIDB4YzYsIDB4OGMsIDB4MGMsIDB4Y2QsIDB4YTcsCisgIDB4MTUsIDB4NDYsIDB4ZmYsIDB4OGMsIDB4NTcsIDB4MDEsIDB4ZGQsIDB4OTcsIDB4ZWIsIDB4YzcsIDB4MjMsIDB4YmMsCisgIDB4OTEsIDB4NDAsIDB4YTcsIDB4YTEsIDB4OGUsIDB4ZmIsIDB4ZmYsIDB4NTEsIDB4MTUsIDB4ODEsIDB4ZWQsIDB4MjAsCisgIDB4ODAsIDB4MDksIDB4ZTEsIDB4MWYsIDB4MzgsIDB4ZDcsIDB4YmMsIDB4YmUsIDB4ZTUsIDB4OWYsIDB4ZTIsIDB4MGIsCisgIDB4ZDksIDB4YzYsIDB4OWMsIDB4OTQsIDB4NTUsIDB4ZWUsIDB4N2MsIDB4ZTcsIDB4MzgsIDB4ZTQsIDB4NjEsIDB4MjUsCisgIDB4ZDAsIDB4YmIsIDB4MmQsIDB4NDcsIDB4NTcsIDB4ZmIsIDB4MGEsIDB4MDEsIDB4YzAsIDB4ODgsIDB4ZjIsIDB4N2YsCisgIDB4ZTAsIDB4YWUsIDB4NTYsIDB4ZDUsIDB4ZGYsIDB4YjksIDB4MjAsIDB4ZGIsIDB4YjQsIDB4ZjQsIDB4MzYsIDB4MmEsCisgIDB4NzUsIDB4YWIsIDB4ZmQsIDB4MTEsIDB4NWYsIDB4NDQsIDB4ZGEsIDB4ODEsIDB4YTAsIDB4MTQsIDB4ODgsIDB4OGUsCisgIDB4ZmMsIDB4NGEsIDB4ZDksIDB4ZGQsIDB4MDYsIDB4MjAsIDB4ODAsIDB4OTgsIDB4ZTUsIDB4YmYsIDB4ZWMsIDB4NTQsCisgIDB4MjksIDB4ZmYsIDB4NzMsIDB4ZDIsIDB4MDYsIDB4OTQsIDB4ZDUsIDB4YzYsIDB4YzAsIDB4MDcsIDB4YjUsIDB4OTgsCisgIDB4OTMsIDB4N2YsIDB4MWEsIDB4MmYsIDB4N2IsIDB4ZWQsIDB4ODAsIDB4NTIsIDB4OTEsIDB4ZjIsIDB4Y2UsIDB4ZjIsCisgIDB4MDksIDB4NDAsIDB4MDQsIDB4MzAsIDB4MmQsIDB4ZmMsIDB4OTEsIDB4YmIsIDB4Y2MsIDB4MTksIDB4NjcsIDB4OTAsCisgIDB4MGYsIDB4ZmMsIDB4NmQsIDB4MTUsIDB4MTEsIDB4NDAsIDB4OTgsIDB4ZjksIDB4YTYsIDB4OTEsIDB4NDAsIDB4NGIsCisgIDB4MDksIDB4YTUsIDB4YWMsIDB4YWYsIDB4ZmMsIDB4MTEsIDB4NDAsIDB4MjIsIDB4MGYsIDB4ZTgsIDB4MWIsIDB4NmUsCisgIDB4ODcsIDB4ZDEsIDB4M2YsIDB4M2YsIDB4NTUsIDB4NDAsIDB4ZTcsIDB4NjQsIDB4OGYsIDB4MWYsIDB4YjQsIDB4MDMsCisgIDB4YTYsIDB4MTIsIDB4NzAsIDB4MjMsIDB4MTIsIDB4NDAsIDB4MDAsIDB4MzAsIDB4YjUsIDB4ZmYsIDB4MTcsIDB4NTQsCisgIDB4MDAsIDB4ZjksIDB4YWEsIDB4MDAsIDB4NWEsIDB4ZWQsIDB4ZTMsIDB4ZmUsIDB4NWUsIDB4NDUsIDB4YjcsIDB4NjksCisgIDB4MzAsIDB4MTEsIDB4ZDgsIDB4MDgsIDB4MmEsIDB4MDEsIDB4NDEsIDB4MjUsIDB4ODAsIDB4MDAsIDB4ZTIsIDB4ZjQsCisgIDB4ZmYsIDB4OTQsIDB4OGIsIDB4MzksIDB4ZGYsIDB4YTQsIDB4NjEsIDB4MWIsIDB4MTAsIDB4NzksIDB4MjcsIDB4NTAsCisgIDB4MzMsIDB4MmEsIDB4ODEsIDB4MjQsIDB4OWYsIDB4NDIsIDB4OGMsIDB4MDAsIDB4MDAsIDB4ZjIsIDB4MjEsIDB4ZjIsCisgIDB4YzEsIDB4YjcsIDB4ZmIsIDB4Y2EsIDB4YzEsIDB4NmEsIDB4MjAsIDB4MmEsIDB4MDEsIDB4ZmIsIDB4NzIsIDB4N2YsCisgIDB4MGMsIDB4NmYsIDB4MDcsIDB4NGUsIDB4MzIsIDB4MTcsIDB4MzAsIDB4MDMsIDB4YWYsIDB4YmQsIDB4ZjYsIDB4OWEsCisgIDB4YmYsIDB4YzAsIDB4NzQsIDB4OWUsIDB4M2MsIDB4NzksIDB4ZTIsIDB4MmYsIDB4MzMsIDB4NzUsIDB4NzIsIDB4ZjIsCisgIDB4NjQsIDB4NWYsIDB4NzcsIDB4ZTIsIDB4NDMsIDB4NDAsIDB4ODIsIDB4YTMsIDB4MDMsIDB4ZTYsIDB4YjIsIDB4NTIsCisgIDB4OTUsIDB4YjEsIDB4NWEsIDB4NDEsIDB4MDQsIDB4NjAsIDB4YTMsIDB4MDEsIDB4ZDQsIDB4N2MsIDB4MDQsIDB4ZjAsCisgIDB4ZmUsIDB4ZmIsIDB4ZWYsIDB4YjMsIDB4M2UsIDB4NjMsIDB4ZjAsIDB4ZTUsIDB4OTcsIDB4NWYsIDB4Y2UsIDB4MjYsCisgIDB4MDAsIDB4ZDksIDB4MmYsIDB4ZmQsIDB4YTUsIDB4ZDMsIDB4MGYsIDB4N2YsIDB4ZjQsIDB4NzMsIDB4MDIsIDB4NDMsCisgIDB4MGYsIDB4OTgsIDB4YTUsIDB4NTksIDB4NTcsIDB4YmUsIDB4MzAsIDB4ZDYsIDB4YWEsIDB4ZjYsIDB4YmQsIDB4MWIsCisgIDB4MDgsIDB4MDEsIDB4OGMsIDB4MTgsIDB4ZWUsIDB4MTcsIDB4NTEsIDB4MDYsIDB4OWUsIDB4M2YsIDB4N2YsIDB4NWUsCisgIDB4YmMsIDB4ZmQsIDB4ZjYsIDB4ZGIsIDB4YWMsIDB4ZTMsIDB4MTgsIDB4M2MsIDB4N2UsIDB4ZmMsIDB4NzgsIDB4M2UsCisgIDB4NjUsIDB4NWIsIDB4NTAsIDB4MDYsIDB4NDgsIDB4NzksIDB4NzIsIDB4NjAsIDB4M2YsIDB4OWUsIDB4MTcsIDB4OTQsCisgIDB4N2QsIDB4MDksIDB4OTgsIDB4MjcsIDB4YWUsIDB4YWQsIDB4ZGIsIDB4YjUsIDB4YWUsIDB4OTksIDB4MDMsIDB4NTgsCisgIDB4NjIsIDB4MWIsIDB4MDAsIDB4Y2IsIDB4ZGQsIDB4NjYsIDB4MzIsIDB4M2EsIDB4ZjIsIDB4YzcsIDB4MjgsIDB4MWIsCisgIDB4OGMsIDB4MDQsIDB4M2EsIDB4MmQsIDB4MDQsIDB4NjAsIDB4MmYsIDB4NjMsIDB4YmUsIDB4N2UsIDB4ODYsIDB4NGYsCisgIDB4OTEsIDB4Y2QsIDB4ZjcsIDB4YTYsIDB4MWMsIDB4M2QsIDB4MmYsIDB4MTAsIDB4ZGQsIDB4YzQsIDB4ZmQsIDB4MDcsCisgIDB4NWEsIDB4NzUsIDB4NzMsIDB4OWUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NTIsIDB4NWYsIDB4ZjgsIDB4Y2EsIDB4YWQsCisgIDB4NTcsIDB4MjEsIDB4YzgsIDB4MTMsIDB4OWIsIDB4YmMsIDB4NjksIDB4OTEsIDB4MDQsIDB4MTAsIDB4MDAsIDB4MmQsCisgIDB4NDAsIDB4ZTEsIDB4YjcsIDB4OTksIDB4MWMsIDB4MjMsIDB4NzYsIDB4MTksIDB4MjksIDB4MDksIDB4MDYsIDB4YWEsCisgIDB4MDMsIDB4N2QsIDB4YmQsIDB4NzksIDB4NjgsIDB4ODcsIDB4MDQsIDB4MTAsIDB4MDAsIDB4NTgsIDB4NTksIDB4YmQsCisgIDB4MGQsIDB4NGMsIDB4MGMsIDB4Y2EsIDB4ZDEsIDB4M2YsIDB4NmIsIDB4ODMsIDB4MDQsIDB4MTAsIDB4MDAsIDB4YzMsCisgIDB4N2UsIDB4NzEsIDB4M2QsIDB4MjAsIDB4ZDUsIDB4MDQsIDB4NDEsIDB4YzQsIDB4ZmIsIDB4ZDYsIDB4NTAsIDB4NWYsCisgIDB4MDIsIDB4NmQsIDB4MDQsIDB4MDAsIDB4OTAsIDB4YjMsIDB4MjIsIDB4NDAsIDB4MDYsIDB4MWUsIDB4NTcsIDB4MzMsCisgIDB4Y2QsIDB4ZTcsIDB4OTgsIDB4ZWEsIDB4YTAsIDB4NTUsIDB4NjAsIDB4MDksIDB4MjAsIDB4MDAsIDB4MjgsIDB4NzQsCisgIDB4MGYsIDB4MjAsIDB4MTMsIDB4YjYsIDB4MDYsIDB4ZTMsIDB4ZGEsIDB4ODQsIDB4YTIsIDB4NGEsIDB4MDAsIDB4MDEsCisgIDB4ODAsIDB4MjUsIDB4ZWQsIDB4YzAsIDB4ZWMsIDB4Y2YsIDB4MmYsIDB4YTIsIDB4MDQsIDB4MTAsIDB4MDAsIDB4NTgsCisgIDB4NTQsIDB4MGYsIDB4NGMsIDB4MTEsIDB4ODEsIDB4OWMsIDB4ZmUsIDB4MWMsIDB4ZjMsIDB4YzUsIDB4MjMsIDB4NDUsCisgIDB4OTIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MmIsIDB4NDUsIDB4NzAsIDB4YTIsIDB4MWQsIDB4ODgsIDB4MTEsIDB4ZmUsCisgIDB4ZjAsIDB4MzksIDB4NDUsIDB4OTIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NGIsIDB4MTIsIDB4M2YsIDB4YTEsIDB4MGEsCisgIDB4ODgsIDB4NzMsIDB4NDAsIDB4NjAsIDB4ZTgsIDB4ZmQsIDB4MDQsIDB4ZWQsIDB4ODIsIDB4NDgsIDB4MDAsIDB4MDEsCisgIDB4ODAsIDB4MDUsIDB4NzUsIDB4ZmYsIDB4ZjQsIDB4NWUsIDB4M2YsIDB4NDksIDB4ZjgsIDB4NDMsIDB4OGEsIDB4MjAsCisgIDB4MDEsIDB4MDQsIDB4MDAsIDB4NTYsIDB4NTYsIDB4MDEsIDB4YjMsIDB4ODYsIDB4M2YsIDB4YmMsIDB4YzMsIDB4N2MsCisgIDB4ZGMsIDB4NzgsIDB4OWUsIDB4MjUsIDB4ODAsIDB4MDAsIDB4YzAsIDB4NGEsIDB4MTEsIDB4YzgsIDB4ODQsIDB4M2YsCisgIDB4MjMsIDB4MjcsIDB4M2MsIDB4OTYsIDB4NjcsIDB4MDksIDB4MjAsIDB4MDAsIDB4YjAsIDB4NmQsIDB4ZTAsIDB4NGYsCisgIDB4ZGMsIDB4MzYsIDB4YzgsIDB4MTgsIDB4MmYsIDB4OWUsIDB4NTcsIDB4MDksIDB4MjAsIDB4MDAsIDB4YjAsIDB4YWIsCisgIDB4ZmQsIDB4OTcsIDB4NjMsIDB4MWUsIDB4OTgsIDB4MjEsIDB4ZmMsIDB4MjEsIDB4OWQsIDB4YTYsIDB4MTIsIDB4ZGQsCisgIDB4MGUsIDB4MDIsIDB4MDAsIDB4YzgsIDB4NjYsIDB4MTUsIDB4YjAsIDB4YzAsIDB4ZjAsIDB4ODcsIDB4ZjMsIDB4MDksCisgIDB4YTYsIDB4MTIsIDB4YzgsIDB4OTMsIDB4MDQsIDB4MTAsIDB4MDAsIDB4ZDgsIDB4ZGQsIDB4MDMsIDB4YzgsIDB4ODQsCisgIDB4ZjIsIDB4OTgsIDB4MTAsIDB4ZmUsIDB4NjgsIDB4M2IsIDB4OTAsIDB4MTcsIDB4MDksIDB4MjAsIDB4MDAsIDB4MjgsCisgIDB4N2MsIDB4ZjgsIDB4NjUsIDB4YzIsIDB4NTAsIDB4Y2YsIDB4MTIsIDB4ZmUsIDB4YmMsIDB4NDksIDB4MDAsIDB4MDEsCisgIDB4ODAsIDB4MTUsIDB4MzIsIDB4ODgsIDB4ZmIsIDB4NWUsIDB4ODAsIDB4NzksIDB4ODQsIDB4M2YsIDB4ZmMsIDB4YjksCisgIDB4NzYsIDB4MGUsIDB4ZTYsIDB4MDQsIDB4MTAsIDB4MDAsIDB4MTQsIDB4YmYsIDB4MTIsIDB4OTAsIDB4YjEsIDB4NWEsCisgIDB4ZmUsIDB4YjEsIDB4NjcsIDB4MDgsIDB4YTYsIDB4MDksIDB4ZmYsIDB4NzEsIDB4MjUsIDB4OTAsIDB4NzEsIDB4MDksCisgIDB4MjAsIDB4MDAsIDB4YjAsIDB4Y2IsIDB4MDksIDB4NzIsIDB4NzksIDB4ZTEsIDB4MGYsIDB4NmYsIDB4NjYsIDB4ZjksCisgIDB4ZTgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MmIsIDB4ZTcsIDB4MDYsIDB4YzYsIDB4N2UsIDB4MjQsIDB4ZDgsIDB4OWMsCisgIDB4YzMsIDB4MWYsIDB4NjIsIDB4YmUsIDB4ODIsIDB4YWMsIDB4ZWIsIDB4MjIsIDB4MDAsIDB4ODAsIDB4YTUsIDB4ODcsCisgIDB4N2QsIDB4ZTIsIDB4NjMsIDB4NGIsIDB4MDgsIDB4N2YsIDB4NzgsIDB4YzMsIDB4YWYsIDB4MDQsIDB4NWMsIDB4MDQsCisgIDB4MDAsIDB4YjAsIDB4YjQsIDB4MzIsIDB4M2YsIDB4YjUsIDB4MjQsIDB4ZTYsIDB4MWMsIDB4ZmUsIDB4ZTMsIDB4NGEsCisgIDB4MjAsIDB4NjMsIDB4MTIsIDB4NDAsIDB4MDAsIDB4NjAsIDB4NmYsIDB4MjUsIDB4YjAsIDB4ZTQsIDB4ZjAsIDB4NjcsCisgIDB4NTEsIDB4MDIsIDB4MDgsIDB4MDAsIDB4ZWMsIDB4YTgsIDB4MDQsIDB4NjQsIDB4MzYsIDB4YzIsIDB4OWYsIDB4MzUsCisgIDB4MDksIDB4MjAsIDB4MDAsIDB4MjgsIDB4ZmUsIDB4YzAsIDB4MWYsIDB4NTcsIDB4MDQsIDB4NzIsIDB4MzksIDB4ZTEsCisgIDB4MGYsIDB4NWYsIDB4ZGIsIDB4Y2QsIDB4YzAsIDB4YzQsIDB4MjAsIDB4MDIsIDB4MDAsIDB4NmIsIDB4NDQsIDB4MjAsCisgIDB4MzMsIDB4MTQsIDB4ZmUsIDB4OTAsIDB4NTUsIDB4NGIsIDB4MDAsIDB4MDEsIDB4ODAsIDB4OWQsIDB4NTMsIDB4MDEsCisgIDB4NzIsIDB4ZjUsIDB4ZTEsIDB4Y2YsIDB4ODIsIDB4MDQsIDB4MTAsIDB4MDAsIDB4NTgsIDB4MTcsIDB4ZmUsIDB4NDksCisgIDB4ZTcsIDB4MDAsIDB4MmMsIDB4M2IsIDB4ZmMsIDB4YWIsIDB4OTYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4YWIsIDB4ZDIsCisgIDB4M2YsIDB4YTksIDB4MjUsIDB4OTAsIDB4NjIsIDB4MzUsIDB4ZTEsIDB4MGYsIDB4NWYsIDB4YzMsIDB4NmQsIDB4MmYsCisgIDB4NWYsIDB4MDIsIDB4ZTUsIDB4YjgsIDB4NGYsIDB4NTQsIDB4YjYsIDB4N2MsIDB4NTcsIDB4OWUsIDB4MGEsIDB4YmUsCisgIDB4MTYsIDB4NTAsIDB4ZjUsIDB4ZmYsIDB4NmUsIDB4ZmYsIDB4NmYsIDB4NTcsIDB4N2MsIDB4NTksIDB4NjAsIDB4Y2UsCisgIDB4MzYsIDB4NjMsIDB4ZWYsIDB4M2YsIDB4NjYsIDB4ZmIsIDB4YzksIDB4ZmUsIDB4NzUsIDB4ZmYsIDB4OWIsIDB4YzIsCisgIDB4ZDQsIDB4ZTAsIDB4M2UsIDB4MmQsIDB4YTMsIDB4M2YsIDB4MTMsIDB4ZDMsIDB4MjksIDB4NDksIDB4ZjYsIDB4ODYsCisgIDB4MjQsIDB4Y2YsIDB4MzcsIDB4NjcsIDB4MGMsIDB4OWEsIDB4MjcsIDB4M2IsIDB4NjUsIDB4OTksIDB4MzEsIDB4MDEsCisgIDB4NzgsIDB4ZjYsIDB4MDQsIDB4NDAsIDB4YTksIDB4OTMsIDB4MDIsIDB4MjAsIDB4ZmYsIDB4NzksIDB4ZGEsIDB4N2UsCisgIDB4Y2EsIDB4NWYsIDB4OGUsIDB4ODUsIDB4YWUsIDB4NTQsIDB4M2YsIDB4ODUsIDB4NWUsIDB4NDQsIDB4MDgsIDB4NjEsCisgIDB4M2EsIDB4YTUsIDB4MTgsIDB4N2MsIDB4ZTMsIDB4OTAsIDB4MzMsIDB4MjIsIDB4YjEsIDB4YWEsIDB4M2YsIDB4OTIsCisgIDB4MmIsIDB4MzEsIDB4ZmEsIDB4YjEsIDB4NzEsIDB4OTUsIDB4NDIsIDB4NzQsIDB4NDAsIDB4MTksIDB4NWIsIDB4MmQsCisgIDB4NDQsIDB4NWUsIDB4YmYsIDB4ZDMsIDB4ZDIsIDB4YzEsIDB4MzQsIDB4MTIsIDB4MjgsIDB4NjUsIDB4NDgsIDB4MDAsCisgIDB4ZGIsIDB4NjcsIDB4YjcsIDB4YWMsIDB4MTgsIDB4MzUsIDB4NjQsIDB4YTQsIDB4MDIsIDB4NTAsIDB4YzEsIDB4Y2UsCisgIDB4NjQsIDB4YWUsIDB4NzgsIDB4MWIsIDB4NTUsIDB4NzEsIDB4NDgsIDB4YjYsIDB4NzIsIDB4YzEsIDB4ZmEsIDB4N2EsCisgIDB4NDUsIDB4NmMsIDB4OWUsIDB4ZDksIDB4ZjQsIDB4ODMsIDB4MmMsIDB4ZjUsIDB4ZTIsIDB4MzgsIDB4NTIsIDB4ZTgsCisgIDB4ZmYsIDB4ZWIsIDB4ZWIsIDB4ZDIsIDB4MGYsIDB4OTUsIDB4NzQsIDB4N2EsIDB4ZDcsIDB4NGQsIDB4ZDgsIDB4OWMsCisgIDB4MzAsIDB4ZjAsIDB4YjIsIDB4ZjcsIDB4ODUsIDB4YTIsIDB4NTIsIDB4MDYsIDB4YTEsIDB4OTUsIDB4MzEsIDB4NWEsCisgIDB4MDQsIDB4OTksIDB4YTAsIDB4NGQsIDB4ODgsIDB4ZjMsIDB4ZjgsIDB4NTAsIDB4YWYsIDB4YjAsIDB4NTYsIDB4OTEsCisgIDB4YTIsIDB4NTQsIDB4Y2UsIDB4ODgsIDB4MDAsIDB4NDQsIDB4YzksIDB4YjMsIDB4YTgsIDB4NzYsIDB4ZWMsIDB4NmIsCisgIDB4ZGIsIDB4MTcsIDB4ODIsIDB4NjcsIDB4YjYsIDB4OGIsIDB4NDcsIDB4YjIsIDB4NzIsIDB4ZDMsIDB4ZjYsIDB4OWIsCisgIDB4ZTEsIDB4ZDMsIDB4MGIsIDB4ODIsIDB4ZGUsIDB4MGIsIDB4YmIsIDB4MmYsIDB4MDMsIDB4M2YsIDB4ZWMsIDB4YjIsCisgIDB4N2YsIDB4YmYsIDB4ZWMsIDB4MDUsIDB4NGUsIDB4ODYsIDB4MDIsIDB4MTgsIDB4OWEsIDB4MWMsIDB4NGMsIDB4NzYsCisgIDB4ZDgsIDB4NTAsIDB4NGUsIDB4OWYsIDB4OGEsIDB4ODgsIDB4MzEsIDB4MGYsIDB4MTAsIDB4YzUsIDB4ZWQsIDB4OWEsCisgIDB4ZGMsIDB4MTksIDB4MDksIDB4YzgsIDB4ZDUsIDB4MGIsIDB4YTAsIDB4ZWIsIDB4NzUsIDB4YWMsIDB4YzgsIDB4ZmUsCisgIDB4NzAsIDB4MDUsIDB4MjAsIDB4MDIsIDB4MDEsIDB4NzgsIDB4MGEsIDB4MDEsIDB4ZTQsIDB4NjcsIDB4M2IsIDB4MmEsCisgIDB4YmQsIDB4YmQsIDB4NWMsIDB4N2YsIDB4NWIsIDB4NGEsIDB4NGYsIDB4MGUsIDB4MGUsIDB4YWMsIDB4N2EsIDB4NjgsCisgIDB4NTcsIDB4YzEsIDB4M2MsIDB4NDAsIDB4YWYsIDB4ZjIsIDB4ZDcsIDB4ZmYsIDB4ZjMsIDB4N2EsIDB4NDIsIDB4ZTgsCisgIDB4ZWQsIDB4MDAsIDB4ZmQsIDB4MGUsIDB4NDAsIDB4NGUsIDB4MmEsIDB4ZGIsIDB4ZDUsIDB4ZDAsIDB4YTAsIDB4M2QsCisgIDB4YTEsIDB4NDUsIDB4M2MsIDB4OTYsIDB4NDMsIDB4Y2MsIDB4MzYsIDB4MjAsIDB4ZmEsIDB4OWEsIDB4ZGQsIDB4YTYsCisgIDB4MGUsIDB4ZTksIDB4MDIsIDB4MmIsIDB4MDEsIDB4OGUsIDB4MDIsIDB4NDAsIDB4NTEsIDB4Y2IsIDB4ODAsIDB4ZDgsCisgIDB4YTUsIDB4YjcsIDB4NGMsIDB4ZjksIDB4NDEsIDB4YTAsIDB4YzMsIDB4M2YsIDB4M2IsIDB4MzEsIDB4ZmMsIDB4MzEsCisgIDB4NWYsIDB4NmYsIDB4ZDQsIDB4NmIsIDB4MmUsIDB4ZjIsIDB4ZTgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2IsIDB4NDQsCisgIDB4MjAsIDB4NjIsIDB4N2YsIDB4MjAsIDB4NzAsIDB4NjYsIDB4YzIsIDB4YmYsIDB4NjgsIDB4MDksIDB4MjAsIDB4MDAsCisgIDB4NDAsIDB4MDYsIDB4MzEsIDB4OWUsIDB4YmIsIDB4Y2EsIDB4ZjAsIDB4NDcsIDB4MjUsIDB4ZTAsIDB4NzUsIDB4MTEsCisgIDB4MDAsIDB4YzAsIDB4N2MsIDB4YzMsIDB4MmYsIDB4YjMsIDB4MWYsIDB4ZmUsIDB4ZjAsIDB4MzksIDB4ZjMsIDB4OTYsCisgIDB4MDAsIDB4MDIsIDB4MDAsIDB4ZTYsIDB4MDcsIDB4NzIsIDB4MTIsIDB4ZmUsIDB4NDUsIDB4NTQsIDB4MDIsIDB4MDgsCisgIDB4MDAsIDB4MDgsIDB4ZmYsIDB4ODgsIDB4ZGIsIDB4MzIsIDB4YTMsIDB4ZTEsIDB4OWYsIDB4YjcsIDB4MDQsIDB4MTAsCisgIDB4MDAsIDB4ZDgsIDB4NTIsIDB4ZjUsIDB4NGYsIDB4N2UsIDB4MzAsIDB4MDcsIDB4MjMsIDB4ZmYsIDB4MjIsIDB4MjQsCisgIDB4ODAsIDB4MDAsIDB4YTAsIDB4OTgsIDB4ZTEsIDB4NGYsIDB4ZmIsIDB4MDksIDB4NDAsIDB4MzksIDB4MDksIDB4ZmYsCisgIDB4YmMsIDB4MjQsIDB4ODAsIDB4MDAsIDB4YTAsIDB4ZjAsIDB4NDMsIDB4YmYsIDB4OTQsIDB4ZjEsIDB4YjIsIDB4MzksCisgIDB4MmEsIDB4NzAsIDB4NTksIDB4MGUsIDB4N2YsIDB4ZjgsIDB4ZmIsIDB4ZGMsIDB4NGUsIDB4N2EsIDB4MDksIDB4MjAsCisgIDB4MDAsIDB4MjgsIDB4NzYsIDB4OWIsIDB4MmYsIDB4ZTMsIDB4ODUsIDB4MmEsIDB4YWYsIDB4ZTEsIDB4M2YsIDB4YWUsCisgIDB4MDQsIDB4NTIsIDB4NGEsIDB4MDAsIDB4MDEsIDB4ODAsIDB4MTUsIDB4MjYsIDB4OTAsIDB4MDksIDB4M2UsIDB4MTcsCisgIDB4MjAsIDB4ZGUsIDB4OWMsIDB4NDAsIDB4NzYsIDB4YzIsIDB4M2YsIDB4OGIsIDB4MDQsIDB4Y2EsIDB4ZWMsIDB4MjUsCisgIDB4NjAsIDB4ZjMsIDB4ZmMsIDB4YzAsIDB4YjgsIDB4OTEsIDB4NWYsIDB4ZTUsIDB4MmMsIDB4ZmMsIDB4ZTEsIDB4Y2YsCisgIDB4NzcsIDB4NWQsIDB4OTUsIDB4ZTgsIDB4YWQsIDB4ZWIsIDB4NTQsIDB4MDAsIDB4NDAsIDB4NTUsIDB4OTAsIDB4ZjMsCisgIDB4OTEsIDB4N2YsIDB4ZjgsIDB4ZTcsIDB4OTMsIDB4NTQsIDB4MDEsIDB4MDgsIDB4MDAsIDB4OTgsIDB4MjgsIDB4ODgsCisgIDB4NWQsIDB4MzksIDB4NjQsIDB4M2YsIDB4ZmMsIDB4Y2MsIDB4MDEsIDB4MDAsIDB4YTQsIDB4MGMsIDB4YjgsIDB4NmQsCisgIDB4ZTEsIDB4NDcsIDB4MDAsIDB4ODAsIDB4MGMsIDB4NjIsIDB4M2MsIDB4YmYsIDB4YTgsIDB4ZTEsIDB4NDcsIDB4MDAsCisgIDB4NjAsIDB4NTcsIDB4ZjgsIDB4MjUsIDB4ZTEsIDB4NDcsIDB4MDAsIDB4NjAsIDB4NGYsIDB4ZjYsIDB4MjMsIDB4MjksCisgIDB4OTEsIDB4ODQsIDB4MWYsIDB4MDEsIDB4ODAsIDB4NGQsIDB4MDMsIDB4YmYsIDB4OWMsIDB4OWMsIDB4MjMsIDB4NDksCisgIDB4ZjgsIDB4MTEsIDB4MDAsIDB4MTQsIDB4YmUsIDB4ZWUsIDB4NGYsIDB4MTUsIDB4N2UsIDB4NjEsIDB4NDcsIDB4ZjgsCisgIDB4MTEsIDB4MDAsIDB4NTgsIDB4ZDgsIDB4MTYsIDB4NGMsIDB4YjksIDB4NmQsIDB4NTEsIDB4ZjgsIDB4MGQsIDB4OWMsCisgIDB4MDksIDB4MDgsIDB4NDUsIDB4MmYsIDB4MDIsIDB4YzYsIDB4ODYsIDB4N2IsIDB4YjgsIDB4Y2MsIDB4MmYsIDB4NDIsCisgIDB4ZjgsIDB4OTMsIDB4OGEsIDB4ODIsIDB4MGEsIDB4MDAsIDB4YWMsIDB4MDgsIDB4ZmYsIDB4ZjAsIDB4OWQsIDB4NTIsCisgIDB4MTAsIDB4N2UsIDB4MDQsIDB4MDAsIDB4NTYsIDB4ZDYsIDB4ZmQsIDB4ODQsIDB4MWYsIDB4MDEsIDB4ODAsIDB4YWQsCisgIDB4NGQsIDB4N2YsIDB4ZTIsIDB4ZWYsIDB4ZjMsIDB4MmEsIDB4NmUsIDB4ZjgsIDB4MTEsIDB4MDAsIDB4ZDgsIDB4ZDUsCisgIDB4MGEsIDB4MjQsIDB4YmQsIDB4NWQsIDB4ZjAsIDB4ZjAsIDB4MjMsIDB4MDAsIDB4NDAsIDB4MDYsIDB4MDksIDB4MGEsCisgIDB4ODEsIDB4YTIsIDB4ODUsIDB4MWYsIDB4MDEsIDB4MDAsIDB4MzIsIDB4YjAsIDB4NzQsIDB4ZTQsIDB4NDcsIDB4MDAsCisgIDB4NDAsIDB4ZjgsIDB4MmQsIDB4MWUsIDB4ZjksIDB4MTEsIDB4MDAsIDB4NTgsIDB4OTcsIDB4ZjUsIDB4MzQsIDB4Y2YsCisgIDB4MmYsIDB4NzIsIDB4ZjgsIDB4MTEsIDB4MDAsIDB4NTAsIDB4ZTUsIDB4NWIsIDB4MWMsIDB4N2UsIDB4MDQsIDB4MDAsCisgIDB4YzUsIDB4MGMsIDB4ZmYsIDB4ZDQsIDB4ZDMsIDB4N2QsIDB4NjMsIDB4NjQsIDB4ZDMsIDB4ODIsIDB4ZjAsIDB4MjMsCisgIDB4MDAsIDB4YjAsIDB4NGYsIDB4MDYsIDB4MzEsIDB4ODIsIDB4MjUsIDB4MmQsIDB4MDksIDB4M2YsIDB4MDIsIDB4MDAsCisgIDB4YWIsIDB4ZmEsIDB4ODAsIDB4NjksIDB4OTUsIDB4ODEsIDB4NGQsIDB4MjMsIDB4M2YsIDB4MDIsIDB4MDAsIDB4YWIsCisgIDB4MjcsIDB4MDEsIDB4MGEsIDB4MWQsIDB4N2UsIDB4ODksIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDUsIDB4YzQsIDB4YzIsCisgIDB4ZjAsIDB4MjMsIDB4MDAsIDB4MjAsIDB4ZmMsIDB4MTYsIDB4ODcsIDB4MWYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4N2IsCisgIDB4YzMsIDB4OGYsIDB4MDAsIDB4MDAsIDB4MmMsIDB4MGUsIDB4M2YsIDB4MDIsIDB4MDAsIDB4N2IsIDB4Y2IsIDB4N2UsCisgIDB4YzIsIDB4OGYsIDB4MDAsIDB4ODAsIDB4MTEsIDB4ZGMsIDB4ZTYsIDB4ZjAsIDB4MjMsIDB4MDAsIDB4YjAsIDB4MmYsCisgIDB4ZmMsIDB4MzEsIDB4ZWUsIDB4YjMsIDB4MjUsIDB4ZmMsIDB4MDYsIDB4M2UsIDB4MTQsIDB4MTQsIDB4YWMsIDB4MDksCisgIDB4YmYsIDB4YjQsIDB4MjAsIDB4ZmMsIDB4NDksIDB4NWYsIDB4OTIsIDB4MGEsIDB4MDAsIDB4MTAsIDB4ODIsIDB4YTUsCisgIDB4ZTEsIDB4NDcsIDB4MDAsIDB4NTAsIDB4Y2MsIDB4YjAsIDB4YzcsIDB4YTksIDB4ZmEsIDB4MDksIDB4M2YsIDB4MDIsCisgIDB4MDAsIDB4YWEsIDB4ODEsIDB4NDQsIDB4ZTEsIDB4MjksIDB4NTgsIDB4ZjgsIDB4MTEsIDB4MDAsIDB4NTAsIDB4MWQsCisgIDB4YzQsIDB4NGQsIDB4NTQsIDB4MDEsIDB4YzMsIDB4OGYsIDB4MDAsIDB4MDAsIDB4MmMsIDB4MGUsIDB4M2YsIDB4MDIsCisgIDB4MDAsIDB4N2IsIDB4NDIsIDB4NGMsIDB4ZjgsIDB4MTEsIDB4MDAsIDB4MjAsIDB4MDQsIDB4YzIsIDB4OGYsIDB4MDAsCisgIDB4ODAsIDB4YTYsIDB4N2YsIDB4ZWEsIDB4N2QsIDB4MzIsIDB4Y2YsIDB4ZTEsIDB4NGYsIDB4ZjAsIDB4OGIsIDB4MTEsCisgIDB4MDAsIDB4MTAsIDB4ZmUsIDB4MDUsIDB4MDQsIDB4M2EsIDB4MGYsIDB4ZTEsIDB4NDcsIDB4MDAsIDB4NDAsIDB4ZjgsCisgIDB4NjMsIDB4ODYsIDB4YWMsIDB4ODgsIDB4ZTEsIDB4NDcsIDB4MDAsIDB4ODAsIDB4MjAsIDB4MmMsIDB4MGUsIDB4M2YsCisgIDB4MDIsIDB4MDAsIDB4MWIsIDB4NzMsIDB4NGUsIDB4ZjgsIDB4MTEsIDB4MDAsIDB4ZDgsIDB4MWEsIDB4ZmUsIDB4MjQsCisgIDB4ZDMsIDB4MDAsIDB4NDUsIDB4MGYsIDB4M2YsIDB4MDIsIDB4MDAsIDB4YzIsIDB4M2YsIDB4NTMsIDB4ZmEsIDB4ZjIsCisgIDB4MWQsIDB4N2UsIDB4MDQsIDB4MDAsIDB4MDgsIDB4YzEsIDB4ZDIsIDB4OTEsIDB4MWYsIDB4MDEsIDB4ODAsIDB4M2QsCisgIDB4ZTEsIDB4NGYsIDB4ZDAsIDB4ZjMsIDB4MGIsIDB4OGIsIDB4YzIsIDB4OGYsIDB4MDAsIDB4YzAsIDB4Y2EsIDB4YTEsCisgIDB4N2YsIDB4NmMsIDB4N2UsIDB4MmMsIDB4MGIsIDB4M2YsIDB4MDIsIDB4MDAsIDB4ZWEsIDB4N2UsIDB4OGIsIDB4YzMsCisgIDB4OGYsIDB4MDAsIDB4ODAsIDB4ZjAsIDB4MTcsIDB4MzAsIDB4ZmMsIDB4OTIsIDB4YWYsIDB4MDYsIDB4MDMsIDB4MjAsCisgIDB4ZmMsIDB4MDgsIDB4MDAsIDB4MjAsIDB4NjUsIDB4MzAsIDB4NmQsIDB4MDgsIDB4M2YsIDB4MDIsIDB4MDAsIDB4YzIsCisgIDB4NmYsIDB4NzEsIDB4ZjgsIDB4MTMsIDB4MDksIDB4ZTAsIDB4YjAsIDB4YjYsIDB4YzYsIDB4NGUsIDB4MDMsIDB4ZjYsCisgIDB4NzksIDB4MjIsIDB4ODcsIDB4ZTEsIDB4NGYsIDB4OTIsIDB4ZDUsIDB4ZDgsIDB4MDIsIDB4NjgsIDB4MzcsIDB4NGIsCisgIDB4ZWMsIDB4MGQsIDB4NDAsIDB4ZjgsIDB4NzMsIDB4MzAsIDB4ZjIsIDB4YjcsIDB4OWIsIDB4Y2UsIDB4MjIsIDB4MDQsCisgIDB4NDAsIDB4YjcsIDB4MDAsIDB4ODQsIDB4M2YsIDB4MGYsIDB4NjUsIDB4ZmYsIDB4NDIsIDB4MDQsIDB4YTAsIDB4ZDksCisgIDB4YTEsIDB4MGEsIDB4MDAsIDB4YzIsIDB4OWYsIDB4OGIsIDB4ZjAsIDB4ZWYsIDB4MmMsIDB4NDIsIDB4MDAsIDB4MzUsCisgIDB4YjcsIDB4MmQsIDB4ZDksIDB4M2IsIDB4MjAsIDB4ODcsIDB4ODksIDB4YjYsIDB4MjMsIDB4ZmMsIDB4MDYsIDB4YjcsCisgIDB4ZWQsIDB4NDcsIDB4YmEsIDB4MzYsIDB4NzcsIDB4MDEsIDB4ZmMsIDB4ZjYsIDB4NjcsIDB4ZjcsIDB4MWYsIDB4MzQsCisgIDB4ZWIsIDB4ZTUsIDB4MWEsIDB4N2IsIDB4MTMsIDB4MTQsIDB4NjIsIDB4MzQsIDB4OTcsIDB4YzUsIDB4MGIsIDB4YmYsCisgIDB4YTEsIDB4NTksIDB4MmYsIDB4ZDUsIDB4N2UsIDB4NzcsIDB4ZjMsIDB4NGYsIDB4MGYsIDB4MTYsIDB4NTEsIDB4MDEsCisgIDB4ODgsIDB4NGUsIDB4ZGIsIDB4ZjksIDB4OWMsIDB4MzYsIDB4MDAsIDB4ZjIsIDB4MWUsIDB4N2UsIDB4NTksIDB4ZDAsCisgIDB4ZjAsIDB4OWIsIDB4ZjIsIDB4ZGYsIDB4NjQsIDB4MzQsIDB4YzksIDB4M2YsIDB4M2YsIDB4ZTksIDB4Y2MsIDB4ZGUsCisgIDB4M2QsIDB4MGUsIDB4MDcsIDB4NDIsIDB4MWUsIDB4ODIsIDB4NmYsIDB4NWIsIDB4ZjgsIDB4MGQsIDB4NDEsIDB4MzYsCisgIDB4ZWYsIDB4MmQsIDB4NGMsIDB4MDAsIDB4YmEsIDB4MGQsIDB4ZDgsIDB4ZDEsIDB4OTYsIDB4NzksIDB4ZDAsIDB4M2EsCisgIDB4YTIsIDB4MGEsIDB4ODAsIDB4NjIsIDB4NTQsIDB4MDQsIDB4NDUsIDB4MDksIDB4YmYsIDB4YzksIDB4NjQsIDB4YjcsCisgIDB4MmIsIDB4NzcsIDB4NzUsIDB4ZjksIDB4YmYsIDB4YjMsIDB4YzgsIDB4MGEsIDB4YzAsIDB4NzAsIDB4ZmIsIDB4YzUsCisgIDB4N2UsIDB4NDUsIDB4NzQsIDB4NWQsIDB4MjYsIDB4MDQsIDB4ODEsIDB4ZjAsIDB4NjcsIDB4MjEsIDB4ZmMsIDB4MjYsCisgIDB4OGIsIDB4MmYsIDB4ZjYsIDB4ZDcsIDB4NDQsIDB4YjcsIDB4MjMsIDB4NmYsIDB4MjUsIDB4ZmQsIDB4NTMsIDB4MTIsCisgIDB4MGIsIDB4YzAsIDB4NTQsIDB4MDEsIDB4Y2EsIDB4OTMsIDB4NzcsIDB4NmIsIDB4NGYsIDB4ZDcsIDB4ODUsIDB4YmUsCisgIDB4NjQsIDB4Y2YsIDB4ODIsIDB4ZWMsIDB4ODcsIDB4M2YsIDB4NmQsIDB4NTAsIDB4NzMsIDB4MTAsIDB4N2UsIDB4OTMsCisgIDB4YzEsIDB4ZGEsIDB4ZDMsIDB4OGEsIDB4YjksIDB4YmMsIDB4OWIsIDB4NzQsIDB4ZjQsIDB4NGYsIDB4NWIsIDB4MDEsCisgIDB4ZjgsIDB4NTUsIDB4ODAsIDB4ZGIsIDB4NzYsIDB4MWUsIDB4M2MsIDB4ZGYsIDB4NDMsIDB4MDIsIDB4NjAsIDB4YjksCisgIDB4NDksIDB4NTYsIDB4MWMsIDB4ZmUsIDB4ZTcsIDB4N2IsIDB4MTUsIDB4NzMsIDB4ZTgsIDB4Y2YsIDB4Y2MsIDB4ZmEsCisgIDB4ZGYsIDB4NGUsIDB4ZjMsIDB4MjcsIDB4YTUsIDB4MTIsIDB4ODAsIDB4YWUsIDB4MDIsIDB4Y2MsIDB4ZTEsIDB4YzAsCisgIDB4MGYsIDB4ZjUsIDB4MmYsIDB4YWUsIDB4MTksIDB4MDksIDB4MDQsIDB4YzcsIDB4MWUsIDB4MDEsIDB4MDgsIDB4ZmYsCisgIDB4OTIsIDB4YzIsIDB4NmYsIDB4MzIsIDB4MTcsIDB4ODQsIDB4ZGYsIDB4Y2YsIDB4YTIsIDB4MWUsIDB4ZmQsIDB4NmIsCisgIDB4NGIsIDB4MTMsIDB4NDAsIDB4MjAsIDB4ODEsIDB4NWQsIDB4N2QsIDB4ZjEsIDB4NWUsIDB4NTgsIDB4MDksIDB4NzAsCisgIDB4NzQsIDB4MDAsIDB4MDgsIDB4ZmYsIDB4NzIsIDB4YzIsIDB4NmYsIDB4YjIsIDB4MTYsIDB4MTksIDB4ZjksIDB4ZGYsCisgIDB4ZDMsIDB4ZTEsIDB4ZGYsIDB4NGQsIDB4ZmIsIDB4YTcsIDB4Y2QsIDB4MzQsIDB4NzQsIDB4MDcsIDB4MTIsIDB4ZjgsCisgIDB4YzAsIDB4ZjQsIDB4MWYsIDB4NzUsIDB4ZmQsIDB4OGYsIDB4ZGEsIDB4ZmYsIDB4NjYsIDB4NDMsIDB4MzQsIDB4ZWEsCisgIDB4NjUsIDB4ZGEsIDB4MDIsIDB4MjgsIDB4NDQsIDB4YjgsIDB4YjMsIDB4MTQsIDB4N2UsIDB4OTMsIDB4YTksIDB4NDYsCisgIDB4YmQsIDB4YTQsIDB4MzMsIDB4NTYsIDB4MTUsIDB4ZjUsIDB4OWEsIDB4OWYsIDB4YjEsIDB4YmIsIDB4MjYsIDB4N2IsCisgIDB4YjMsIDB4ODQsIDB4ZGYsIDB4NTAsIDB4OWUsIDB4NzUsIDB4ZmQsIDB4MDUsIDB4ZWQsIDB4YzAsIDB4YWQsIDB4NWYsCisgIDB4ZmUsIDB4ZjEsIDB4ZmEsIDB4M2QsIDB4ZTUsIDB4ODksIDB4M2IsIDB4MDcsIDB4ZmIsIDB4OTUsIDB4NGIsIDB4MDcsCisgIDB4ZmEsIDB4OGUsIDB4ZjUsIDB4NTMsIDB4NWQsIDB4YjEsIDB4NTYsIDB4ZjEsIDB4YzQsIDB4NWEsIDB4ZDUsIDB4ZWIsCisgIDB4OTksIDB4YzYsIDB4NTEsIDB4YTIsIDB4NWMsIDB4ZjEsIDB4ZDgsIDB4ZTEsIDB4MjAsIDB4M2IsIDB4MjEsIDB4Y2YsCisgIDB4NjgsIDB4ZjgsIDB4NGQsIDB4NzksIDB4ZWYsIDB4MDUsIDB4NTEsIDB4ZTksIDB4MzQsIDB4NGIsIDB4YTIsIDB4ZDMsCisgIDB4OTYsIDB4MjIsIDB4NzIsIDB4ZTgsIDB4ZGQsIDB4ZWYsIDB4ZjcsIDB4ZDMsIDB4NGMsIDB4ZjgsIDB4MmQsIDB4NDQsCisgIDB4MDAsIDB4MTEsIDB4MTEsIDB4OTgsIDB4N2YsIDB4ZDAsIDB4OWIsIDB4NWEsIDB4MDQsIDB4NTcsIDB4ZjUsIDB4ZTUsCisgIDB4MGQsIDB4ZmQsIDB4MGYsIDB4YmUsIDB4YTYsIDB4OTcsIDB4YWQsIDB4M2MsIDB4ZWUsIDB4MmYsIDB4NGEsIDB4ZjUsCisgIDB4YWYsIDB4ZjgsIDB4ZDcsIDB4ZjUsIDB4ZDIsIDB4NzgsIDB4NDEsIDB4OGIsIDB4OTMsIDB4MTcsIDB4NGMsIDB4MTUsCisgIDB4ZGEsIDB4N2EsIDB4YjIsIDB4ZTEsIDB4ODcsIDB4NTQsIDB4M2EsIDB4NjYsIDB4ZjAsIDB4OTEsIDB4ZmUsIDB4YTUsCisgIDB4N2YsIDB4ODIsIDB4OTAsIDB4YjksIDB4MWUsIDB4NWUsIDB4M2EsIDB4NDEsIDB4OTAsIDB4YzMsIDB4MTMsIDB4ODcsCisgIDB4ODIsIDB4MTQsIDB4NGUsIDB4Y2IsIDB4YWQsIDB4OWMsIDB4NDUsIDB4M2EsIDB4ZTksIDB4MzAsIDB4ODMsIDB4YWMsCisgIDB4MzksIDB4YzMsIDB4ZWYsIDB4ZGUsIDB4YmMsIDB4ODIsIDB4YmYsIDB4OTgsIDB4N2YsIDB4ZTYsIDB4MTAsIDB4NWEsCisgIDB4MDYsIDB4NTcsIDB4ZjQsIDB4ODUsIDB4OTEsIDB4YzAsIDB4ZDUsIDB4YmMsIDB4MGIsIDB4YTAsIDB4ZmUsIDB4NjgsCisgIDB4ZTMsIDB4YTcsIDB4OWQsIDB4ZmQsIDB4YjUsIDB4ZDQsIDB4N2YsIDB4YzcsIDB4YmIsIDB4ZWYsIDB4YmUsIDB4MmIsCisgIDB4MmUsIDB4NWYsIDB4YmUsIDB4NGMsIDB4M2EsIDB4NjMsIDB4ZjAsIDB4ZDUsIDB4NTcsIDB4NWYsIDB4ODksIDB4ODcsCisgIDB4MGYsIDB4MWYsIDB4YTYsIDB4ZGYsIDB4YTksIDB4NWYsIDB4NjksIDB4ZWQsIDB4MzgsIDB4YWYsIDB4MWYsIDB4ZmUsCisgIDB4NjUsIDB4YWMsIDB4MDAsIDB4ZmMsIDB4ZWIsIDB4MGIsIDB4MTQsIDB4YzAsIDB4ZmMsIDB4NTIsIDB4NjUsIDB4YzIsCisgIDB4OWUsIDB4ZTgsIDB4ZGMsIDB4ZmUsIDB4NGMsIDB4MDksIDB4YTAsIDB4NDgsIDB4ZGMsIDB4YmEsIDB4NzUsIDB4ZWIsCisgIDB4NjMsIDB4N2QsIDB4ZjEsIDB4YWIsIDB4YjQsIDB4M2YsIDB4YmYsIDB4YjksIDB4YjksIDB4ZTksIDB4MmYsIDB4MzAsCisgIDB4OWQsIDB4N2EsIDB4YmQsIDB4ZWUsIDB4MmYsIDB4MzMsIDB4ZjAsIDB4ZWIsIDB4M2IsIDB4NzcsIDB4ZWUsIDB4N2MsCisgIDB4Y2MsIDB4OWEsIDB4NWMsIDB4NjIsIDB4MGIsIDB4MDAsIDB4MGIsIDB4ZGYsIDB4YTksIDB4MDEsIDB4ZTYsIDB4MGUsCisgIDB4MDcsIDB4ZjAsIDB4MDEsIDB4MTAsIDB4MDAsIDB4NGMsIDB4YTMsIDB4ZDMsIDB4ZTksIDB4YjAsIDB4MTIsIDB4ZDgsCisgIDB4NTYsIDB4MDgsIDB4YzAsIDB4NTYsIDB4YmEsIDB4ZGQsIDB4MmUsIDB4MmIsIDB4ODEsIDB4NmQsIDB4ODUsIDB4MDAsCisgIDB4MTgsIDB4NTUsIDB4ODAsIDB4NmQsIDB4ODUsIDB4MDAsIDB4NmMsIDB4NjQsIDB4ZDcsIDB4ZjMsIDB4MzgsIDB4OTEsCisgIDB4MjksIDB4ZWIsIDB4MDQsIDB4ZGIsIDB4NjgsIDB4OTcsIDB4MzUsIDB4ODEsIDB4MDAsIDB4ZTYsIDB4MmUsIDB4MDAsCisgIDB4NGEsIDB4Y2IsIDB4ZGMsIDB4OTQsIDB4ZmYsIDB4MDgsIDB4MjAsIDB4MjYsIDB4OWMsIDB4MDcsIDB4OTAsIDB4ODAsCisgIDB4OGYsIDB4M2UsIDB4ZmEsIDB4NDgsIDB4NmQsIDB4NmMsIDB4NmMsIDB4YjAsIDB4MjIsIDB4MzIsIDB4NGMsIDB4YTMsCisgIDB4ZDEsIDB4MTAsIDB4OWYsIDB4N2UsIDB4ZmEsIDB4MjksIDB4ZmIsIDB4MzUsIDB4MTUsIDB4YzAsIDB4ZmMsIDB4NzEsCisgIDB4NWQsIDB4NzcsIDB4ODcsIDB4MzYsIDB4MjAsIDB4ZGIsIDB4ZTUsIDB4YmYsIDB4ZDksIDB4NDYsIDB4YWMsIDB4MDksCisgIDB4MDQsIDB4YjAsIDB4MjgsIDB4ZWUsIDB4ZTksIDB4MWQsIDB4OGMsIDB4YjUsIDB4OTAsIDB4NWQsIDB4NDEsIDB4ZmIsCisgIDB4ZGIsIDB4ODgsIDB4MzUsIDB4ODEsIDB4MDAsIDB4MTYsIDB4YzUsIDB4ZTcsIDB4YWQsIDB4NTYsIDB4YWIsIDB4NDYsCisgIDB4MTUsIDB4OTAsIDB4Y2QsIDB4ZDEsIDB4ZGYsIDB4NmMsIDB4MWIsIDB4ZDEsIDB4N2IsIDB4ZDMsIDB4MGMsIDB4YzQsCisgIDB4ODQsIDB4OGYsIDB4ZjcsIDB4NGQsIDB4YzAsIDB4YTMsIDB4NDcsIDB4OGYsIDB4OWEsIDB4ZWYsIDB4YmMsIDB4ZjMsCisgIDB4Y2UsIDB4ODYsIDB4ZGUsIDB4ZDksIDB4YWUsIDB4YWUsIDB4YWQsIDB4ZjEsIDB4ZWUsIDB4YzAsIDB4YWMsIDB4ZjUsCisgIDB4ZmUsIDB4NGEsIDB4YTksIDB4ZGYsIDB4ZGMsIDB4YmYsIDB4N2YsIDB4ZmYsIDB4Y2YsIDB4YWMsIDB4OGQsIDB4ZjgsCisgIDB4MzAsIDB4NTksIDB4OTIsIDB4ODIsIDB4ZWIsIDB4ZDcsIDB4YWYsIDB4N2YsIDB4NWQsIDB4YTksIDB4NTQsIDB4MmUsCisgIDB4YWQsIDB4YWYsIDB4YWYsIDB4YjMsIDB4MzIsIDB4MzIsIDB4ODAsIDB4MWUsIDB4ZjksIDB4NDUsIDB4YmIsIDB4ZGQsCisgIDB4ZGUsIDB4ZDUsIDB4ZTEsIDB4N2YsIDB4OTMsIDB4YjUsIDB4NDEsIDB4MGIsIDB4YjAsIDB4MGMsIDB4M2UsIDB4ZDQsCisgIDB4M2IsIDB4MWMsIDB4MjcsIDB4OWMsIDB4NjQsIDB4MDAsIDB4YjMsIDB4MGQsIDB4Y2MsIDB4YjYsIDB4MzAsIDB4ZGIsCisgIDB4ODQsIDB4YjUsIDB4NDEsIDB4MGIsIDB4YjAsIDB4YWMsIDB4NTYsIDB4NjAsIDB4NGYsIDB4YjcsIDB4MDIsIDB4ZmYsCisgIDB4NzYsIDB4NWQsIDB4ZjcsIDB4OWEsIDB4YjksIDB4NWQsIDB4MmUsIDB4ZjMsIDB4YTYsIDB4Y2EsIDB4NTUsIDB4OGQsCisgIDB4ZmMsIDB4NjYsIDB4ZDEsIDB4ZGMsIDB4YTIsIDB4ZjQsIDB4YTcsIDB4MDUsIDB4NTgsIDB4NDUsIDB4MmIsIDB4NzAsCisgIDB4NTMsIDB4NWYsIDB4ZGMsIDB4MjksIDB4OTUsIDB4NGEsIDB4YTIsIDB4NWEsIDB4YWQsIDB4MGEsIDB4YzcsIDB4YTEsCisgIDB4YTAsIDB4NWEsIDB4MDYsIDB4NjYsIDB4YzIsIDB4YWYsIDB4ZDksIDB4NmMsIDB4ODYsIDB4MjcsIDB4ZmQsIDB4OTgsCisgIDB4ZjAsIDB4ZGYsIDB4NjUsIDB4YWQsIDB4MjAsIDB4ODAsIDB4NTUsIDB4NDksIDB4ZTAsIDB4YWEsIDB4YmUsIDB4ZjgsCisgIDB4NGMsIDB4MmYsIDB4NWIsIDB4NjYsIDB4NGUsIDB4YzAsIDB4NTQsIDB4MDMsIDB4ODgsIDB4NjAsIDB4NzEsIDB4YzEsCisgIDB4MzcsIDB4ODcsIDB4ZmEsIDB4ODIsIDB4NTEsIDB4ZGYsIDB4ZmYsIDB4MzgsIDB4NmMsIDB4MWQsIDB4ZmUsIDB4MWQsCisgIDB4ZDYsIDB4MGMsIDB4MDIsIDB4NTgsIDB4YjUsIDB4MDQsIDB4Y2MsIDB4YzcsIDB4OWUsIDB4N2QsIDB4YTIsIDB4OTcsCisgIDB4OWIsIDB4NjEsIDB4NGIsIDB4NjAsIDB4MTYsIDB4NTMsIDB4MTksIDB4MjAsIDB4ODMsIDB4ZDksIDB4NDMsIDB4NmYsCisgIDB4NDYsIDB4N2EsIDB4MTMsIDB4ZmMsIDB4YzgsIDB4MzksIDB4MTgsIDB4NjYsIDB4YzQsIDB4YmYsIDB4YWQsIDB4YzMsCisgIDB4Y2YsIDB4ZDcsIDB4ZDUsIDB4MjMsIDB4ODAsIDB4NGMsIDB4ODksIDB4ZTAsIDB4OTIsIDB4ZTgsIDB4N2QsIDB4NmMsCisgIDB4OTgsIDB4OTksIDB4MWIsIDB4MzgsIDB4ZmUsIDB4NDAsIDB4NTQsIDB4MjMsIDB4MDEsIDB4MjksIDB4NTksIDB4ZDUsCisgIDB4NDksIDB4NTAsIDB4NGEsIDB4ODksIDB4YTEsIDB4ZjMsIDB4MmQsIDB4YzIsIDB4NjMsIDB4ZmMsIDB4YmYsIDB4ZDYsCisgIDB4YzEsIDB4ZGYsIDB4NjUsIDB4MGQsIDB4MjEsIDB4ODAsIDB4M2MsIDB4YjQsIDB4MDYsIDB4NjYsIDB4ZjksIDB4NzEsCisgIDB4NTQsIDB4MDYsIDB4OTAsIDB4MDgsIDB4MTMsIDB4ZmEsIDB4YmYsIDB4ZWIsIDB4NjUsIDB4ODcsIDB4NTIsIDB4MWYsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGEsIDB4YzEsIDB4ZmYsIDB4MDUsIDB4MTgsIDB4MDAsIDB4NjYsCisgIDB4YmUsIDB4OTMsIDB4NWIsIDB4YTcsIDB4ZmUsIDB4YmUsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDksCisgIDB4NDUsIDB4NGUsIDB4NDQsIDB4YWUsIDB4NDIsIDB4NjAsIDB4ODIKK307CisKK3N0YXRpYyBjb25zdCBGaWxlRW50cnkgIF9maWxlX2VudHJpZXNbXSA9IHsKKyAgICB7CisgICAgICAgICJlbXVsYXRvcl9pY29uXzEyOC5wbmciLAorICAgICAgICBpbWFnZXNfZW11bGF0b3JfaWNvbl8xMjhfcG5nLAorICAgICAgICBzaXplb2YoaW1hZ2VzX2VtdWxhdG9yX2ljb25fMTI4X3BuZykKKyAgICB9LAorICAgIHsKKyAgICAgICAgImVtdWxhdG9yX2ljb25fMjU2LnBuZyIsCisgICAgICAgIGltYWdlc19lbXVsYXRvcl9pY29uXzI1Nl9wbmcsCisgICAgICAgIHNpemVvZihpbWFnZXNfZW11bGF0b3JfaWNvbl8yNTZfcG5nKQorICAgIH0sCit9OyAgLy8gIF9maWxlX2VudHJpZXNbXQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2pwZWctY29tcHJlc3MuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9qcGVnLWNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1ZGQzMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9qcGVnLWNvbXByZXNzLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2pwZWctY29tcHJlc3MuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisvKiBJbXBsZW1lbnRzIEpQRUcgZGVzdGluYXRpb24gbWFuYWdlcidzIGluaXRfZGVzdGluYXRpb24gcm91dGluZS4gKi8KK3N0YXRpYyB2b2lkIF9vbl9pbml0X2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKy8qIEltcGxlbWVudHMgSlBFRyBkZXN0aW5hdGlvbiBtYW5hZ2VyJ3MgZW1wdHlfb3V0cHV0X2J1ZmZlciByb3V0aW5lLiAqLworc3RhdGljIGJvb2xlYW4gX29uX2VtcHR5X291dHB1dF9idWZmZXIoal9jb21wcmVzc19wdHIgY2luZm8pOworLyogSW1wbGVtZW50cyBKUEVHIGRlc3RpbmF0aW9uIG1hbmFnZXIncyB0ZXJtX2Rlc3RpbmF0aW9uIHJvdXRpbmUuICovCitzdGF0aWMgdm9pZCBfb25fdGVybV9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisKKy8qIEpQRUcgY29tcHJlc3Npb24gZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBBSlBFR0Rlc2MgeworICAgIC8qIENvbW1vbiBKUEVHIGNvbXByZXNzaW9uIGRlc3RpbmF0aW9uIG1hbmFnZXIgaGVhZGVyLiAqLworICAgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAgICAgY29tbW9uOworICAgIC8qIEJ1ZmZlciB3aGVyZSB0byBzYXZlIGNvbXByZXNzZWQgb3V0cHV0LiAqLworICAgIHVpbnQ4X3QqICAgICAgICAgICAgICAgICAgICAgICAganBlZ19idWY7CisgICAgLyogQnl0ZSBzaXplIG9mIHRoZSAnanBlZ19idWYnICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOworICAgIC8qIENodW5rIHNpemUgdG8gaW5jcmVtZW50IHRoZSAnanBlZ19idWYnIHdpdGggb24gZWFjaCBhbGxvY2F0aW9uIHJlcXVlc3QuICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19zaXplOworICAgIC8qIFNpemUgb2YgdGhlIGhlYWRlciB0byBwdXQgaW4gZnJvbnQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBqcGVnbGliIGNhbGxiYWNrcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbXBsZW1lbnRzIEpQRUcgZGVzdGluYXRpb24gbWFuYWdlcidzIGluaXRfZGVzdGluYXRpb24gcm91dGluZS4gKi8KK3N0YXRpYyB2b2lkCitfb25faW5pdF9kZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgICBBSlBFR0Rlc2MqIGNvbnN0IGRzdCA9IChBSlBFR0Rlc2MqKWNpbmZvLT5kZXN0OworICAgIGlmIChkc3QtPmpwZWdfYnVmID09IE5VTEwpIHsKKyAgICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSBvdXIgZGVzdGluYXRpb24gbWFuYWdlciBpcyBpbml0aWFsaXplZC4KKyAgICAgICAgICogQWxsb2NhdGUgbWluaW1hbCBidWZmZXIuICovCisgICAgICAgIGRzdC0+c2l6ZSA9IGRzdC0+Y2h1bmtfc2l6ZTsKKyAgICAgICAgZHN0LT5qcGVnX2J1ZiA9IG1hbGxvYyhkc3QtPnNpemUpOworICAgICAgICBpZiAoZHN0LT5qcGVnX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBUEFOSUMoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgSlBFRyBjb21wcmVzc2lvbiIsIGRzdC0+c2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBjb21tb24gaGVhZGVyIHdpdGggZW50aXJlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KKyAgICBkc3QtPmNvbW1vbi5uZXh0X291dHB1dF9ieXRlID0gZHN0LT5qcGVnX2J1ZiArIGRzdC0+aGVhZGVyX3NpemU7CisgICAgZHN0LT5jb21tb24uZnJlZV9pbl9idWZmZXIgPSBkc3QtPnNpemUgLSBkc3QtPmhlYWRlcl9zaXplOworfQorCisvKiBJbXBsZW1lbnRzIEpQRUcgZGVzdGluYXRpb24gbWFuYWdlcidzIGVtcHR5X291dHB1dF9idWZmZXIgcm91dGluZS4KKyAqIE5hbWUgaXMgYSBiaXQgbWlzbGVhZGluZyBoZXJlLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBjb21wcmVzc29yIHdoZW4KKyAqIG91dHB1dCBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCBmcmVlIHNwYWNlIHRvIGNvbnRhaW4gdGhlIG5leHQgY2h1bmsgb2YgdGhlCisgKiBjb21wcmVzc2VkIGRhdGEuIFNvLCBoZXJlIHdlIHNob3VsZCByZWFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyLCByYXRoZXIgdGhhbgorICogImVtcHR5IiBpdC4KKyAqLworc3RhdGljIGJvb2xlYW4KK19vbl9lbXB0eV9vdXRwdXRfYnVmZmVyKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAgIEFKUEVHRGVzYyogY29uc3QgZHN0ID0gKEFKUEVHRGVzYyopY2luZm8tPmRlc3Q7CisgICAgLyogU2F2ZSBhbHJlYWR5IGNvbXByZXNzZWQgZGF0YSBzaXplLiAqLworICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZCA9IGpwZWdfY29tcHJlc3Nvcl9nZXRfanBlZ19zaXplKGRzdCk7CisKKyAgICAvKiBSZWFsbG9jYXRlIG91dHB1dCBidWZmZXIuICovCisgICAgZHN0LT5zaXplICs9IGRzdC0+Y2h1bmtfc2l6ZTsKKyAgICBkc3QtPmpwZWdfYnVmID0gcmVhbGxvYyhkc3QtPmpwZWdfYnVmLCBkc3QtPnNpemUpOworICAgIGlmIChkc3QtPmpwZWdfYnVmID09IE5VTEwpIHsKKyAgICAgICAgQVBBTklDKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIEpQRUcgY29tcHJlc3Npb24iLCBkc3QtPnNpemUpOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBjb21tb24gaGVhZGVyLiAqLworICAgIGRzdC0+Y29tbW9uLm5leHRfb3V0cHV0X2J5dGUgPSBkc3QtPmpwZWdfYnVmICsgYWNjdW11bGF0ZWQgKyBkc3QtPmhlYWRlcl9zaXplOworICAgIGRzdC0+Y29tbW9uLmZyZWVfaW5fYnVmZmVyID0gZHN0LT5zaXplIC0gYWNjdW11bGF0ZWQgLSBkc3QtPmhlYWRlcl9zaXplOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIEltcGxlbWVudHMgSlBFRyBkZXN0aW5hdGlvbiBtYW5hZ2VyJ3MgdGVybV9kZXN0aW5hdGlvbiByb3V0aW5lLgorICogV2UgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4gQWxsIHRoZSBjbGVhbnVwIHdpbGwgYmUgcGVyZm9ybWVkIHdoZW4gdGhlIHVzZXIKKyAqIGNhbGxzIGpwZWdfY29tcHJlc3Nvcl9kZXN0cm95LiAqLworc3RhdGljIHZvaWQKK19vbl90ZXJtX2Rlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIEpQRUcgY29tcHJlc3NvciBBUEkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQUpQRUdEZXNjKgoranBlZ19jb21wcmVzc29yX2NyZWF0ZShpbnQgaGVhZGVyX3NpemUsIGludCBjaHVua19zaXplKQoreworICAgIEFKUEVHRGVzYyogZHNjID0gKEFKUEVHRGVzYyopbWFsbG9jKHNpemVvZihBSlBFR0Rlc2MpKTsKKyAgICBpZiAoZHNjID09IE5VTEwpIHsKKyAgICAgICAgQVBBTklDKCJVbmFibGUgdG8gYWxsb2NhdGUgSlBFRyBjb21wcmVzc2lvbiBkZXNjcmlwdG9yLiIpOworICAgIH0KKworICAgIGRzYy0+Y29tbW9uLm5leHRfb3V0cHV0X2J5dGUgICAgPSBOVUxMOworICAgIGRzYy0+Y29tbW9uLmZyZWVfaW5fYnVmZmVyICAgICAgPSAwOworICAgIGRzYy0+Y29tbW9uLmluaXRfZGVzdGluYXRpb24gICAgPSBfb25faW5pdF9kZXN0aW5hdGlvbjsKKyAgICBkc2MtPmNvbW1vbi5lbXB0eV9vdXRwdXRfYnVmZmVyID0gX29uX2VtcHR5X291dHB1dF9idWZmZXI7CisgICAgZHNjLT5jb21tb24udGVybV9kZXN0aW5hdGlvbiAgICA9IF9vbl90ZXJtX2Rlc3RpbmF0aW9uOworICAgIGRzYy0+anBlZ19idWYgICAgICAgICAgICAgICAgICAgPSBOVUxMOworICAgIGRzYy0+c2l6ZSAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGRzYy0+Y2h1bmtfc2l6ZSAgICAgICAgICAgICAgICAgPSBjaHVua19zaXplOworICAgIGRzYy0+aGVhZGVyX3NpemUgICAgICAgICAgICAgICAgPSBoZWFkZXJfc2l6ZTsKKyAgICByZXR1cm4gZHNjOworfQorCit2b2lkCitqcGVnX2NvbXByZXNzb3JfZGVzdHJveShBSlBFR0Rlc2MqIGRzYykKK3sKKyAgICBpZiAoZHNjICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRzYy0+anBlZ19idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShkc2MtPmpwZWdfYnVmKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGRzYyk7CisgICAgfQorfQorCitpbnQKK2pwZWdfY29tcHJlc3Nvcl9nZXRfanBlZ19zaXplKGNvbnN0IEFKUEVHRGVzYyogZHNjKQoreworICAgIHJldHVybiAoZHNjLT5qcGVnX2J1ZiA9PSBOVUxMKSA/IDAgOgorICAgICAgICAodWludDhfdCopZHNjLT5jb21tb24ubmV4dF9vdXRwdXRfYnl0ZSAtIGRzYy0+anBlZ19idWYgLSBkc2MtPmhlYWRlcl9zaXplOworfQorCit2b2lkKgoranBlZ19jb21wcmVzc29yX2dldF9idWZmZXIoY29uc3QgQUpQRUdEZXNjKiBkc2MpCit7CisgICAgIHJldHVybiBkc2MtPmpwZWdfYnVmOworfQorCitpbnQKK2pwZWdfY29tcHJlc3Nvcl9nZXRfaGVhZGVyX3NpemUoY29uc3QgQUpQRUdEZXNjKiBkc2MpCit7CisgICAgIHJldHVybiBkc2MtPmhlYWRlcl9zaXplOworfQorCit2b2lkCitqcGVnX2NvbXByZXNzb3JfY29tcHJlc3NfZmIoQUpQRUdEZXNjKiBkc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBudW1fbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwgaW50IGJwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBmYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQganBlZ19xdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZGlyKXsKKyAgICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm8gPSB7MH07CisgICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGVycl9tZ3I7CisgICAgY29uc3QgaW50IHhfc2hpZnQgPSB4ICogYnBwOworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXplIGNvbXByZXNzaW4gaW5mb3JtYXRpb24gc3RydWN0dXJlLCBhbmQgc3RhcnQgY29tcHJlc3Npb24KKyAgICAgKi8KKworICAgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZlcnJfbWdyKTsKKyAgICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworICAgIGNpbmZvLmRlc3QgPSAmZHNjLT5jb21tb247CisgICAgY2luZm8uaW1hZ2Vfd2lkdGggPSB3OworICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IGg7CisKKyAgICAvKiBEZWNvZGUgZnJhbWVidWZmZXIncyBwaXhlbCBmb3JtYXQuIFRoZXJlIGNhbiBiZSBvbmx5IHRocmVlOgorICAgICAqIC0gUkdCNTY1LAorICAgICAqIC0gUkdCQTg4ODgsCisgICAgICogLSBSR0JYODg4OCAqLworICAgIGlmIChicHAgPT0gMikgeworICAgICAgICAvKiBUaGlzIGlzIFJHQjU2NSAtIG1vc3QgY29tbW9ubHkgdXNlZCBwaXhlbCBmb3JtYXQgZm9yIGZyYW1lYnVmZmVyLiAqLworICAgICAgICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMjsKKyAgICAgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCXzU2NTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSR0JBODg4OCwgb3IgUkdCWDg4ODggLSBtYWtlcyBubyBkaWZmZXJlbmNlIGhlcmUuICovCisgICAgICAgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSA0OworICAgICAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0JBXzg4ODg7CisgICAgfQorICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisgICAganBlZ19zZXRfcXVhbGl0eSgmY2luZm8sIGpwZWdfcXVhbGl0eSwgVFJVRSk7CisgICAganBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIFRSVUUpOworCisgICAgLyogTGluZSBieSBsaW5lIGNvbXByZXNzIHRoZSByZWdpb24uICovCisgICAgaWYgKHlkaXIgPj0gMCkgeworICAgICAgICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgICAgICAgICAgSlNBTVBST1cgcmdiID0gKEpTQU1QUk9XKShmYiArIChjaW5mby5uZXh0X3NjYW5saW5lICsgeSkgKiBicGwgKyB4X3NoaWZ0KTsKKyAgICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgKEpTQU1QQVJSQVkpJnJnYiwgMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgeV9zaGlmdCA9IG51bV9saW5lcyAtIHkgLSAxOworICAgICAgICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgICAgICAgICAgSlNBTVBST1cgcmdiID0gKEpTQU1QUk9XKShmYiArICh5X3NoaWZ0IC0gY2luZm8ubmV4dF9zY2FubGluZSkgKiBicGwgKyB4X3NoaWZ0KTsKKyAgICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgKEpTQU1QQVJSQVkpJnJnYiwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZSB0aGUgY29tcHJlc3Npb24uICovCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKyAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9qcGVnLWNvbXByZXNzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvanBlZy1jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTJjMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvanBlZy1jb21wcmVzcy5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKgorICogQ29udGFpbnMgZGVjbGFyYXRpb24gb2YgdXRpbGl0eSByb3V0aW5lcyB0aGF0IGNvbXByZXNzIGFuIFJHQiBiaXRtYXAgaW50bworICogYSBKUEVHIGltYWdlLgorICoKKyAqIE5PVEU6IFRoaXMgY29kZSB1c2VzIGEganBlZ2xpYiBsaWJyYXJ5IGxvY2F0ZWQgaW4gYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiLiBJdCdzIGEKKyAqIDMtcmQgcGFydHkgbGlicmFyeSB0aGF0IHVzZXMgaXRzIG93biB0eXBlIGRlZmluaXRpb25zIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tCisgKiB0aGUgb25lcyB0aGF0IGFyZSB1c2UgZWxzZXdoZXJlIGluIHRoZSBlbXVsYXRvciBjb2RlLiBGb3IgaW5zdGFuY2UsIGluIHRoZQorICogZW11bGF0b3IgYnVpbHQgZm9yIFdpbmRvd3MsIHNpemVvZihib29sKSA9IDEsIHdoaWxlIGluIHRoZSBqcGVnbGliIHNpemVvZihib29sKSA9IDQuCisgKiBTbywgdG8gc2ltcGxpZnkgZGVhbGluZyB3aXRoIHRoZXNlIGlzc3VlcywgYWxsIHRoZSBjb2RlIHRoYXQgdXNlcyBqcGVnbGliIHNob3VsZAorICogYmUgY29tcGlsZWQgc2VwYXJhdGVseSwgYW5kIHNob3VsZCBpbmNsdWRlIG9ubHkgaGVhZGVycyB0aGF0IGFyZSB1c2VkIHRvIGNvbXBpbGUKKyAqIGpwZWdsaWIuCisgKi8KKworCisvKiBEZWNsYXJlcyBkZXNjcmlwdG9yIGZvciBhIEpQRUcgY29tcHJlc3Npb24uICovCit0eXBlZGVmIHN0cnVjdCBBSlBFR0Rlc2MgQUpQRUdEZXNjOworCisvKiBDcmVhdGVzIGEgZGVzY3JpcHRvciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgY29tcHJlc3Npb24uCisgKiBQYXJhbToKKyAqICBoZWFkZXJfc2l6ZSAtIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmb3IgYSBjdXN0b20gaGVhZGVyIHRoYXQgc2hvdWxkCisgKiAgICAgIHByZWNlZWQgdGhlIGFjdHVhbCBKUEVHIGJ1ZmZlci4gVGhpcyBpcyB1c2VmdWwgd2hlbiBzZW5kaW5nIEpQRUcKKyAqICAgICAgc29tZXdoZXJlIGVsc2UgYWxvbmcgd2l0aCBzb21lIGV4dHJhIGRhdGEgYWJvdXQgdGhlIGNvbXByZXNzZWQgaW1hZ2UuCisgKiAgY3Vua19zaXplIC0gTnVtYmVyIG9mIGJ5dGVzIHRvIGluY3JlbWVudCB0aGUgY29tcHJlc3NlZCBidWZmZXIgd2l0aCBlYWNoIHRpbWUKKyAqICAgICAgY29tcHJlc3NvciByZXF1ZXN0cyBtb3JlIG1lbW9yeS4KKyAqIFJldHVybjoKKyAqICBJbml0aWFsaXplZCBjb21wcmVzc2lvbiBkZXNjcmlwdG9yLgorICovCitleHRlcm4gQUpQRUdEZXNjKiBqcGVnX2NvbXByZXNzb3JfY3JlYXRlKGludCBoZWFkZXJfc2l6ZSwgaW50IGNodW5rX3NpemUpOworCisvKiBEZXN0cm95cyBjb21wcmVzc29yIGRlc2NyaXB0b3IuCisgKiBQYXJhbToKKyAqICBkc2MgLSBDb21wcmVzc2luIGRlc2NyaXB0b3IsIG9idGFpbmVkIHdpdGgganBlZ19jb21wcmVzc29yX2NyZWF0ZS4KKyAqLworZXh0ZXJuIHZvaWQganBlZ19jb21wcmVzc29yX2Rlc3Ryb3koQUpQRUdEZXNjKiBkc2MpOworCisvKiBSZXR1cm5zIGNvbXByZXNzZWQgZGF0YSBzaXplLgorICogUGFyYW06CisgKiAgZHNjIC0gQ29tcHJlc3Npb24gZGVzY3JpcHRvciwgb2J0YWluZWQgd2l0aCBqcGVnX2NvbXByZXNzb3JfY3JlYXRlLgorICogUmV0dXJuOgorICogIENvbXByZXNzZWQgZGF0YSBzaXplLgorICovCitleHRlcm4gaW50IGpwZWdfY29tcHJlc3Nvcl9nZXRfanBlZ19zaXplKGNvbnN0IEFKUEVHRGVzYyogZHNjKTsKKworLyogUmV0dXJucyBjb21wcmVzc2VkIGJ1ZmZlci4KKyAqIFBhcmFtOgorICogIGRzYyAtIENvbXByZXNzaW9uIGRlc2NyaXB0b3IsIG9idGFpbmVkIHdpdGgganBlZ19jb21wcmVzc29yX2NyZWF0ZS4KKyAqIFJldHVybjoKKyAqICBDb21wcmVzc2VkIGJ1ZmZlci4gTk9URTogaWYgJ2hlYWRlcl9zaXplJyBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBqcGVnX2NvbXByZXNzb3JfY3JlYXRlCisgKiAgZm9yIHRoaXMgZGVzY3JpcHRvciB3YXMgbm90IHplcm8sIHRoaXMgcm91dGluZSByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3VzdG9tCisgKiAgaGVhZGVyLiBDb21wcmVzc2VkIGRhdGEgZm9sbG93cyBpbW1lZGlhdGVseSBhZnRlciB0aGF0IGhlYWRlci4KKyAqLworZXh0ZXJuIHZvaWQqIGpwZWdfY29tcHJlc3Nvcl9nZXRfYnVmZmVyKGNvbnN0IEFKUEVHRGVzYyogZHNjKTsKKworLyogUmV0dXJucyBzaXplIG9mIHRoZSBjdXN0b20gaGVhZGVyIHBsYWNlZCBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAqIFBhcmFtOgorICogIGRzYyAtIENvbXByZXNzaW9uIGRlc2NyaXB0b3IsIG9idGFpbmVkIHdpdGgganBlZ19jb21wcmVzc29yX2NyZWF0ZS4KKyAqIFJldHVybjoKKyAqICBTaXplIG9mIHRoZSBjdXN0b20gaGVhZGVyIHBsYWNlZCBiZWZvcmUgdGhlIGNvbXByZXNzZWQgZGF0YS4KKyAqLworZXh0ZXJuIGludCBqcGVnX2NvbXByZXNzb3JfZ2V0X2hlYWRlcl9zaXplKGNvbnN0IEFKUEVHRGVzYyogZHNjKTsKKworLyogQ29tcHJlc3NlcyBhIGZyYW1lYnVmZmVyIHJlZ2lvbiBpbnRvIEpQRUcgaW1hZ2UuCisgKiBQYXJhbToKKyAqICBkc2MgLSBDb21wcmVzc2lvbiBkZXNjcmlwdG9yLCBvYnRhaW5lZCB3aXRoIGpwZWdfY29tcHJlc3Nvcl9jcmVhdGUuCisgKiAgeCwgeSwgdywgaCAtIENvb3JkaW5hdGVzIGFuZCBzaXplcyBvZiBmcmFtZWJ1ZmZlciByZWdpb24gdG8gY29tcHJlc3MuCisgKiAgbnVtX2xpbmVzIC0gTnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmcmFtZWJ1ZmZlciAodHJ1ZSBoZWlnaHQpLgorICogIGJwcCAtIE51bWJlciBvZiBieXRlcyBwZXIgcGl4ZWwgaW4gdGhlIGZyYW1lYnVmZmVyLgorICogIGJwbCAtIE51bWJlciBvZiBieXRlcyBwZXIgbGluZSBpbiB0aGUgZnJhbWVidWZmZXIuCisgKiAgZmIgLSBCZWdpbm5pbmcgb2YgdGhlIGZyYW1lYnVmZmVyLgorICogIGpwZWdfcXVhbGl0eSBKUEVHIGNvbXByZXNzaW9uIHF1YWxpdHkuIEEgbnVtYmVyIGZyb20gMSB0byAxMDAuIE5vdGUgdGhhdAorICogICAgICB2YWx1ZSAxMCBwcm92aWRlcyBwcmV0dHkgZGVjZW50IGltYWdlIGZvciB0aGUgcHVycG9zZSBvZiBtdWx0aS10b3VjaAorICogICAgICBlbXVsYXRpb24uCisgKiAgeWRpciAtIEluZGljYXRlcyBkaXJlY3Rpb24gaW4gd2hpY2ggbGluZXMgYXJlIGFycmFuZ2VkIGluIHRoZSBmcmFtZWJ1ZmZlci4gSWYKKyAqICAgICAgdGhpcyB2YWx1ZSBpcyBuZWdhdGl2ZSwgbGluZXMgYXJlIGFycmFuZ2VkIGluIGJvdHRvbS11cCBmb3JtYXQgKGkuZS4gdGhlCisgKiAgICAgIGJvdHRvbSBsaW5lIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcikuCisgKi8KK2V4dGVybiB2b2lkIGpwZWdfY29tcHJlc3Nvcl9jb21wcmVzc19mYihBSlBFR0Rlc2MqIGRzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsIGludCBicGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpwZWdfcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeWRpcik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODRmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQva2VybmVsL2tlcm5lbF91dGlscy5jcHAKQEAgLTAsMCArMSwxODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHNfdGVzdGluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJpbmcuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorCisjZGVmaW5lIERFQlVHX0tFUk5FTCAgMAorCisjZGVmaW5lIEtFUk5FTF9MT0cgICAgIExPR19JRihJTkZPLCBERUJVR19LRVJORUwpCisjZGVmaW5lIEtFUk5FTF9QTE9HICAgIFBMT0dfSUYoSU5GTywgREVCVUdfS0VSTkVMKQorI2RlZmluZSBLRVJORUxfRVJST1IgICBMT0dfSUYoRVJST1IsIERFQlVHX0tFUk5FTCkKKyNkZWZpbmUgS0VSTkVMX1BFUlJPUiAgUExPR19JRihFUlJPUiwgREVCVUdfS0VSTkVMKQorCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyIGtMaW51eFZlcnNpb25TdHJpbmdQcmVmaXhbXSA9ICJMaW51eCB2ZXJzaW9uICI7Citjb25zdCBzaXplX3Qga0xpbnV4VmVyc2lvblN0cmluZ1ByZWZpeExlbiA9CisgICAgICAgIHNpemVvZihrTGludXhWZXJzaW9uU3RyaW5nUHJlZml4KSAtIDFVOworCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBhbmRyb2lkX3BhcnNlTGludXhWZXJzaW9uU3RyaW5nKGNvbnN0IGNoYXIqIHZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VybmVsVmVyc2lvbioga2VybmVsVmVyc2lvbikgeworICAgIGlmIChzdHJuY21wKHZlcnNpb25TdHJpbmcsIGtMaW51eFZlcnNpb25TdHJpbmdQcmVmaXgsCisgICAgICAgICAgICBrTGludXhWZXJzaW9uU3RyaW5nUHJlZml4TGVuKSkgeworICAgICAgICBLRVJORUxfRVJST1IgPDwgInVuc3VwcG9ydGVkIGtlcm5lbCB2ZXJzaW9uIHN0cmluZzoiIDw8IHZlcnNpb25TdHJpbmc7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2tpcCBwYXN0IHRoZSBwcmVmaXggdG8gdGhlIHZlcnNpb24gbnVtYmVyCisgICAgdmVyc2lvblN0cmluZyArPSBrTGludXhWZXJzaW9uU3RyaW5nUHJlZml4TGVuOworCisgICAgdWludDMyX3QgdGVtcCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgLy8gc2tpcCAnLicgZGVsaW1ldGVycworICAgICAgICB3aGlsZSAoaSA+IDAgJiYgKnZlcnNpb25TdHJpbmcgPT0gJy4nKSB7CisgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nKys7CisgICAgICAgIH0KKworICAgICAgICBjaGFyKiBlbmQ7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyID0gOjpzdHJ0b3VsKHZlcnNpb25TdHJpbmcsICZlbmQsIDEwKTsKKyAgICAgICAgaWYgKGVuZCA9PSB2ZXJzaW9uU3RyaW5nIHx8IG51bWJlciA+IDB4ZmYpIHsKKyAgICAgICAgICAgIEtFUk5FTF9FUlJPUiA8PCAidW5zdXBwb3J0ZWQga2VybmVsIHZlcnNpb24gc3RyaW5nOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2ZXJzaW9uU3RyaW5nOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRlbXAgPDw9IDg7CisgICAgICAgIHRlbXAgfD0gbnVtYmVyOworICAgICAgICB2ZXJzaW9uU3RyaW5nID0gZW5kOworICAgIH0KKyAgICAqa2VybmVsVmVyc2lvbiA9IChLZXJuZWxWZXJzaW9uKXRlbXA7CisKKyAgICBLRVJORUxfTE9HIDw8IGFuZHJvaWQ6OmJhc2U6OkxvZ1N0cmluZygiS2VybmVsIHZlcnNpb24gaGV4IDB4JTA2eCIsIHRlbXApOworICAgIHJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyKiBhbmRyb2lkX2tlcm5lbFNlcmlhbERldmljZVByZWZpeChLZXJuZWxWZXJzaW9uIGtlcm5lbFZlcnNpb24pIHsKKyAgICBpZiAoa2VybmVsVmVyc2lvbiA+PSBLRVJORUxfVkVSU0lPTl8zXzEwXzApIHsKKyAgICAgICAgcmV0dXJuICJ0dHlHRiI7CisgICAgfQorICAgIHJldHVybiAidHR5UyI7Cit9CisKK2Jvb2wgYW5kcm9pZF9pbWFnZVByb2JlS2VybmVsVmVyc2lvblN0cmluZyhjb25zdCB1aW50OF90KiBrZXJuZWxGaWxlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qga2VybmVsRmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZHN0LypbZHN0TGVuXSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RMZW4pIHsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB1bmNvbXByZXNzZWQ7CisKKyAgICBjb25zdCB1aW50OF90KiB1bmNvbXByZXNzZWRLZXJuZWwgPSBOVUxMOworICAgIHNpemVfdCB1bmNvbXByZXNzZWRLZXJuZWxMZW4gPSAwOworCisgICAgY29uc3QgY2hhciBrRWxmSGVhZGVyW10gPSB7IDB4N2YsICdFJywgJ0wnLCAnRicgfTsKKworICAgIGlmIChrZXJuZWxGaWxlU2l6ZSA8IHNpemVvZihrRWxmSGVhZGVyKSkgeworICAgICAgICBLRVJORUxfRVJST1IgPDwgIktlcm5lbCBpbWFnZSB0b28gc2hvcnQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdmVyc2lvblN0cmluZ1N0YXJ0ID0gTlVMTDsKKworICAgIGlmICgwID09IG1lbWNtcChrRWxmSGVhZGVyLCBrZXJuZWxGaWxlRGF0YSwgc2l6ZW9mKGtFbGZIZWFkZXIpKSkgeworICAgICAgICAvLyB0aGlzIGlzIGFuIHVuY29tcHJlc3NlZCBFTEYgZmlsZSAocHJvYmFibHkgbWlwcykKKyAgICAgICAgdW5jb21wcmVzc2VkS2VybmVsID0ga2VybmVsRmlsZURhdGE7CisgICAgICAgIHVuY29tcHJlc3NlZEtlcm5lbExlbiA9IGtlcm5lbEZpbGVTaXplOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQga2VybmVscyBoZXJlCisgICAgICAgIGNvbnN0IHVpbnQ4X3Qga0daaXBNYWdpY1s0XSA9IHsgMHgxZiwgMHg4YiwgMHgwOCwgMHgwMCB9OworICAgICAgICBjb25zdCB1aW50OF90KiBjb21wcmVzc2VkS2VybmVsID0gKGNvbnN0IHVpbnQ4X3QqKW1lbW1lbShrZXJuZWxGaWxlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsRmlsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHWmlwTWFnaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrR1ppcE1hZ2ljKSk7CisgICAgICAgIGlmICghY29tcHJlc3NlZEtlcm5lbCkgeworICAgICAgICAgICAgS0VSTkVMX0VSUk9SIDw8ICJDb3VsZCBub3QgZmluZCBnemlwIGhlYWRlciBpbiBrZXJuZWwgZmlsZSEiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3BlY2lhbCBjYXNlOiBjZXJ0YWluIGltYWdlcywgbGlrZSB0aGUgQVJNNjQgb25lLCBjb250YWluIGEgR1ppcAorICAgICAgICAvLyBoZWFkZXIgX2FmdGVyXyB0aGUgYWN0dWFsIExpbnV4IHZlcnNpb24gc3RyaW5nLiBTbyBmaXJzdCB0cnkgdG8KKyAgICAgICAgLy8gc2VlIGlmIHRoZXJlIGlzIHNvbWV0aGluZyBiZWZvcmUgdGhlIGhlYWRlci4KKyAgICAgICAgdmVyc2lvblN0cmluZ1N0YXJ0ID0gKGNvbnN0IGNoYXIqKW1lbW1lbSgKKyAgICAgICAgICAgICAgICBrZXJuZWxGaWxlRGF0YSwKKyAgICAgICAgICAgICAgICAoY29tcHJlc3NlZEtlcm5lbCAtIGtlcm5lbEZpbGVEYXRhKSwKKyAgICAgICAgICAgICAgICBrTGludXhWZXJzaW9uU3RyaW5nUHJlZml4LAorICAgICAgICAgICAgICAgIGtMaW51eFZlcnNpb25TdHJpbmdQcmVmaXhMZW4pOworCisgICAgICAgIGlmICghdmVyc2lvblN0cmluZ1N0YXJ0KSB7CisgICAgICAgICAgICBzaXplX3QgY29tcHJlc3NlZEtlcm5lbExlbiA9IGtlcm5lbEZpbGVTaXplIC0KKyAgICAgICAgICAgICAgICAoY29tcHJlc3NlZEtlcm5lbCAtIGtlcm5lbEZpbGVEYXRhKTsKKworICAgICAgICAgICAgLy8gaW5mbGF0ZSByYXRpb3MgZm9yIGFsbCBwcmVidWlsdCBrZXJuZWxzIG9uIDIwMTQtMDctMTQgaXMgMS45OjEgfgorICAgICAgICAgICAgLy8gMy40MzoxIG5vdCBzdXJlIGhvdyBiaWcgdGhlIHVuY29tcHJlc3NlZCBzaXplIGlzLCBzbyBtYWtlIGFuCisgICAgICAgICAgICAvLyBhYnN1cmRseSBsYXJnZSBidWZmZXIKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZEtlcm5lbExlbiA9IGNvbXByZXNzZWRLZXJuZWxMZW4gKiAxMDsKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZC5yZXNpemUodW5jb21wcmVzc2VkS2VybmVsTGVuKTsKKyAgICAgICAgICAgIHVuY29tcHJlc3NlZEtlcm5lbCA9IHVuY29tcHJlc3NlZC5kYXRhKCk7CisKKyAgICAgICAgICAgIGJvb2wgek9rID0gdW5jb21wcmVzc19nemlwU3RyZWFtKHVuY29tcHJlc3NlZC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmNvbXByZXNzZWRLZXJuZWxMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRLZXJuZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRLZXJuZWxMZW4pOworICAgICAgICAgICAgaWYgKCF6T2spIHsKKyAgICAgICAgICAgICAgICBLRVJORUxfRVJST1IgPDwgIktlcm5lbCBkZWNvbXByZXNzaW9uIGVycm9yIjsKKyAgICAgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseSBkZWNvbXByZXNzZWQsIHNvIHdlJ3JlIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgdGhlIHZlcnNpb24gc3RyaW5nIGFueXdheQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2ZXJzaW9uU3RyaW5nU3RhcnQpIHsKKyAgICAgICAgdmVyc2lvblN0cmluZ1N0YXJ0ID0gKGNvbnN0IGNoYXIqKW1lbW1lbSgKKyAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRLZXJuZWwsCisgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkS2VybmVsTGVuLAorICAgICAgICAgICAgICAgIGtMaW51eFZlcnNpb25TdHJpbmdQcmVmaXgsCisgICAgICAgICAgICAgICAga0xpbnV4VmVyc2lvblN0cmluZ1ByZWZpeExlbik7CisKKyAgICAgICAgaWYgKCF2ZXJzaW9uU3RyaW5nU3RhcnQpIHsKKyAgICAgICAgICAgIEtFUk5FTF9FUlJPUiA8PCAiQ291bGQgbm90IGZpbmQgJ0xpbnV4IHZlcnNpb24gJyBpbiBrZXJuZWwhIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cmxjcHkoZHN0LCB2ZXJzaW9uU3RyaW5nU3RhcnQsIGRzdExlbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhbmRyb2lkX3BhdGhQcm9iZUtlcm5lbFZlcnNpb25TdHJpbmcoY29uc3QgY2hhcioga2VybmVsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRzdC8qW2RzdExlbl0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RMZW4pIHsKKyAgICBGaWxlRGF0YSBrZXJuZWxGaWxlRGF0YTsKKyAgICBpZiAoZmlsZURhdGFfaW5pdEZyb21GaWxlKCZrZXJuZWxGaWxlRGF0YSwga2VybmVsUGF0aCkgPCAwKSB7CisgICAgICAgIEtFUk5FTF9FUlJPUiA8PCAiQ291bGQgbm90IG9wZW4ga2VybmVsIGZpbGUhIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IGF1dG8ga2VybmVsRmlsZURlbGV0ZXIgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6bWFrZUN1c3RvbVNjb3BlZFB0cigma2VybmVsRmlsZURhdGEsIGZpbGVEYXRhX2RvbmUpOworCisgICAgcmV0dXJuIGFuZHJvaWRfaW1hZ2VQcm9iZUtlcm5lbFZlcnNpb25TdHJpbmcoa2VybmVsRmlsZURhdGEuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxGaWxlRGF0YS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RMZW4pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YjM3MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIEFuIGVudW0gdXNlZCB0byBsaXN0IG9mIHRoZSB0eXBlcyBvZiBMaW51eCBrZXJuZWwgaW1hZ2VzIHdlIG5lZWQgdG8KKy8vIGhhbmRsZS4gVW5mb3J0dW5hdGVseSwgdGhpcyBhZmZlY3RzIGhvdyB3ZSBzZXR1cCB0aGUga2VybmVsIGNvbW1hbmQtbGluZQorLy8gd2hlbiBsYXVuY2hpbmcgdGhlIHN5c3RlbS4KK3R5cGVkZWYgZW51bSB7CisgICAgS0VSTkVMX1ZFUlNJT05fMl82XzI5ID0gMHgwMjA2MWQsCisgICAgS0VSTkVMX1ZFUlNJT05fM180XzAgID0gMHgwMzA0MDAsCisgICAgS0VSTkVMX1ZFUlNJT05fM180XzY3ID0gMHgwMzA0NDMsCisgICAgS0VSTkVMX1ZFUlNJT05fM18xMF8wID0gMHgwMzBhMDAsCit9IEtlcm5lbFZlcnNpb247CisKKy8vIENvbnZlcnRzIGEgc3RyaW5nIGF0IHx2ZXJzaW9uU3RyaW5nfCBpbiB0aGUgZm9ybWF0ICJMaW51eCB2ZXJzaW9uIE1NLm1tLnJyLi4uIgorLy8gaW50byBhIGhleCB2YWx1ZSAweDAwTU1tbXJyLiAgT24gc3VjY2VzcywgcmV0dXJucyB0cnVlIGFuZCBzZXRzIHwqa2VybmVsVmVyc2lvbnwKKy8vIGFwcHJvcHJpYXRlbHkKKy8vIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgdG91Y2ggfCprZXJuZWxWZXJzaW9ufC4KK2Jvb2wgYW5kcm9pZF9wYXJzZUxpbnV4VmVyc2lvblN0cmluZyhjb25zdCBjaGFyKiB2ZXJzaW9uU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlcm5lbFZlcnNpb24qIGtlcm5lbFZlcnNpb24pOworCisvLyBQcm9iZSB0aGUga2VybmVsIGltYWdlIGF0IHxrZXJuZWxQYXRofCBhbmQgY29weSB0aGUgY29ycmVzcG9uZGluZworLy8gJ0xpbnV4IHZlcnNpb24gJyBzdHJpbmcgaW50byB0aGUgfGRzdHwgYnVmZmVyLiAgT24gc3VjY2VzcywgcmV0dXJucyB0cnVlCisvLyBhbmQgY29waWVzIHVwIHRvIHxkc3RMZW4tMXwgY2hhcmFjdGVycyBpbnRvIGRzdC4gIGRzdCB3aWxsIGFsd2F5cyBiZSBOVUwKKy8vIHRlcm1pbmF0ZWQgaWYgfGRzdExlbnwgPj0gMQorLy8KKy8vIE9uIGZhaWx1cmUgKGUuZy4gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBvciBjYW5ub3QgYmUgcHJvYmVkKSwgcmV0dXJuCisvLyBmYWxzZSBhbmQgZG9lc24ndCB0b3VjaCB8ZHN0fCBidWZmZXIuCitib29sIGFuZHJvaWRfcGF0aFByb2JlS2VybmVsVmVyc2lvblN0cmluZyhjb25zdCBjaGFyKiBrZXJuZWxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdExlbik7CisKKy8vIFJldHVybiB0aGUgc2VyaWFsIGRldmljZSBuYW1lIHByZWZpeCBtYXRjaGluZyBhIGdpdmVuIGtlcm5lbCB0eXBlCisvLyB8a2VybmVsVmVyc2lvbnwuICBJLmUuIHRoaXMgc2hvdWxkIGJlICIvZGV2L3R0eVMiIGZvciBiZWZvcmUgMy4xMC4wIGFuZAorLy8gIi9kZXYvdHR5R0YiIGZvciAzLjEwLjAgYW5kIGxhdGVyLgorY29uc3QgY2hhciogYW5kcm9pZF9rZXJuZWxTZXJpYWxEZXZpY2VQcmVmaXgoS2VybmVsVmVyc2lvbiBrZXJuZWxWZXJzaW9uKTsKKworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3Rlc3RpbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3Rlc3RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJhMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHNfdGVzdGluZy5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworLy8gUHJvYmUgdGhlIGtlcm5lbCBpbWFnZSBhdCB8a2VybmVsUGF0aHwgYW5kIGNvcHkgdGhlIGNvcnJlc3BvbmRpbmcKKy8vICdMaW51eCB2ZXJzaW9uICcgc3RyaW5nIGludG8gdGhlIHxkc3R8IGJ1ZmZlci4gIE9uIHN1Y2Nlc3MsIHJldHVybnMgdHJ1ZQorLy8gYW5kIGNvcGllcyB1cCB0byB8ZHN0TGVuLTF8IGNoYXJhY3RlcnMgaW50byBkc3QuICBkc3Qgd2lsbCBhbHdheXMgYmUgTlVMCisvLyB0ZXJtaW5hdGVkIGlmIHxkc3RMZW58ID49IDEKKy8vCisvLyBPbiBmYWlsdXJlIChlLmcuIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2Fubm90IGJlIHByb2JlZCksIHJldHVybgorLy8gZmFsc2UgYW5kIGRvZXNuJ3QgdG91Y2ggfGRzdHwgYnVmZmVyLgorYm9vbCBhbmRyb2lkX2ltYWdlUHJvYmVLZXJuZWxWZXJzaW9uU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIGtlcm5lbEZpbGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXJuZWxGaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdExlbik7CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQ4NDVhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQva2VybmVsL2tlcm5lbF91dGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9rZXJuZWwva2VybmVsX3V0aWxzX3Rlc3RpbmcuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBrZXJuZWwgeworCitURVNUKEtlcm5lbFV0aWxzLCBHZXRLZXJuZWxTZXJpYWxEZXZpY2VQcmVmaXgpIHsKKyAgICBFWFBFQ1RfU1RSRVEoInR0eVMiLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2tlcm5lbFNlcmlhbERldmljZVByZWZpeChLRVJORUxfVkVSU0lPTl8yXzZfMjkpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInR0eVMiLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2tlcm5lbFNlcmlhbERldmljZVByZWZpeChLRVJORUxfVkVSU0lPTl8zXzRfMCkpOworICAgIEVYUEVDVF9TVFJFUSgidHR5UyIsCisgICAgICAgICAgICAgICAgIGFuZHJvaWRfa2VybmVsU2VyaWFsRGV2aWNlUHJlZml4KEtFUk5FTF9WRVJTSU9OXzNfNF82NykpOworICAgIEVYUEVDVF9TVFJFUSgidHR5R0YiLAorICAgICAgICAgICAgICAgICBhbmRyb2lkX2tlcm5lbFNlcmlhbERldmljZVByZWZpeChLRVJORUxfVkVSU0lPTl8zXzEwXzApKTsKK30KKworVEVTVChLZXJuZWxVdGlscywgUHJvYmVLZXJuZWxWZXJzaW9uU3RyaW5nKSB7CisgICAgLy8geW91IGNhbiByZWdlbmVyYXRlIHRoZXNlIHRhYmxlcyB1c2luZyAKKyAgICAvLyBhbmRyb2lkL2tlcm5lbC90ZXN0aW5nL3ByaW50X21vY2tfa2VybmVsX2RhdGEuc2gKKworICAgIGNvbnN0IGNoYXIga01vY2tLZXJuZWxWZXJzaW9uW10gPQorICAgICAgICAiTGludXggdmVyc2lvbiAzLjEwLjArICh2aGFycm9uQHRpZmEubXR2LmNvcnAuZ29vZ2xlLmNvbSkgIgorICAgICAgICAiKGdjYyB2ZXJzaW9uIDQuNyAoR0NDKSApICMxIFBSRUVNUFQgU2F0IEphbiA1IDI6NDU6MjQgUERUIDIwMDhcbiI7CisKKyAgICAvLyBhIG1vY2sgdW5jb21wcmVzc2VkIGtlcm5lbAorICAgIC8vIEVMRiBoZWFkZXIsIGZvbGxvd2VkIGJ5IGFuIHVuc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcworICAgIC8vIGZvbGxvd2VkIGJ5IGEgJ0xpbnV4IHZlcnNpb24gJyBzdHJpbmcKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTW9ja0tlcm5lbEVsZltdID0geworICAgICAgICAweDdmLCAweDQ1LCAweDRjLCAweDQ2LCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorICAgICAgICAweDM4LCAweDM5LCAweDRjLCAweDY5LCAweDZlLCAweDc1LCAweDc4LCAweDIwLCAweDc2LCAweDY1LCAweDcyLCAweDczLAorICAgICAgICAweDY5LCAweDZmLCAweDZlLCAweDIwLCAweDMzLCAweDJlLCAweDMxLCAweDMwLCAweDJlLCAweDMwLCAweDJiLCAweDIwLAorICAgICAgICAweDI4LCAweDc2LCAweDY4LCAweDYxLCAweDcyLCAweDcyLCAweDZmLCAweDZlLCAweDQwLCAweDc0LCAweDY5LCAweDY2LAorICAgICAgICAweDYxLCAweDJlLCAweDZkLCAweDc0LCAweDc2LCAweDJlLCAweDYzLCAweDZmLCAweDcyLCAweDcwLCAweDJlLCAweDY3LAorICAgICAgICAweDZmLCAweDZmLCAweDY3LCAweDZjLCAweDY1LCAweDJlLCAweDYzLCAweDZmLCAweDZkLCAweDI5LCAweDIwLCAweDI4LAorICAgICAgICAweDY3LCAweDYzLCAweDYzLCAweDIwLCAweDc2LCAweDY1LCAweDcyLCAweDczLCAweDY5LCAweDZmLCAweDZlLCAweDIwLAorICAgICAgICAweDM0LCAweDJlLCAweDM3LCAweDIwLCAweDI4LCAweDQ3LCAweDQzLCAweDQzLCAweDI5LCAweDIwLCAweDI5LCAweDIwLAorICAgICAgICAweDIzLCAweDMxLCAweDIwLCAweDUwLCAweDUyLCAweDQ1LCAweDQ1LCAweDRkLCAweDUwLCAweDU0LCAweDIwLCAweDUzLAorICAgICAgICAweDYxLCAweDc0LCAweDIwLCAweDRhLCAweDYxLCAweDZlLCAweDIwLCAweDM1LCAweDIwLCAweDMyLCAweDNhLCAweDM0LAorICAgICAgICAweDM1LCAweDNhLCAweDMyLCAweDM0LCAweDIwLCAweDUwLCAweDQ0LCAweDU0LCAweDIwLCAweDMyLCAweDMwLCAweDMwLAorICAgICAgICAweDM4LCAweDBhLCAweDAwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5CisgICAgfTsKKworICAgIC8vIGEgbW9jayB1bmNvbXByZXNzZWQga2VybmVsIHdpdGhvdXQgdmVyc2lvbiBzdHJpbmcKKyAgICAvLyBFTEYgaGVhZGVyLCBmb2xsb3dlZCBieSBhbiB1bnNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTW9ja0tlcm5lbEVsZk5vU3RyaW5nW10gPSB7CisgICAgICAgIDB4N2YsIDB4NDUsIDB4NGMsIDB4NDYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsCisgICAgICAgIDB4MzgsIDB4MzksIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4MzAsIDB4MzEsCisgICAgICAgIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzkKKyAgICB9OworCisgICAgLy8gYSBtb2NrIGNvbXByZXNzZWQga2VybmVsCisgICAgLy8gYW4gdW5zcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzLCBmb2xsb3dlZCBieSBhIGd6aXAgaGVhZGVyCisgICAgLy8gZ3ppcCBzdHJlYW0gc3RhcnRzIDEwIGJ5dGVzIGFmdGVyIGd6aXAgaGVhZGVyLCB1bmNvbXByZXNzZWQgZ3ppcCBzdHJlYW0KKyAgICAvLyBiZWdpbnMgd2l0aCBhbiBFTEYgaGVhZGVyIGFzIGFib3ZlCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga01vY2tLZXJuZWxHemlwW10gPSB7CisgICAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4MWYsIDB4OGIsCisgICAgICAgIDB4MDgsIDB4MDAsIDB4MjQsIDB4YzcsIDB4YzYsIDB4NTMsIDB4MDAsIDB4MDMsIDB4YWIsIDB4NzcsIDB4ZjUsIDB4NzEsCisgICAgICAgIDB4MzMsIDB4MzAsIDB4MzQsIDB4MzIsIDB4MzYsIDB4MzEsIDB4MzUsIDB4MzMsIDB4YjcsIDB4YjAsIDB4ZjQsIDB4YzksCisgICAgICAgIDB4Y2MsIDB4MmIsIDB4YWQsIDB4NTAsIDB4MjgsIDB4NGIsIDB4MmQsIDB4MmEsIDB4Y2UsIDB4Y2MsIDB4Y2YsIDB4NTMsCisgICAgICAgIDB4MzAsIDB4ZDYsIDB4MzMsIDB4MzQsIDB4ZDAsIDB4MzMsIDB4ZDAsIDB4NTYsIDB4ZDAsIDB4MjgsIDB4Y2IsIDB4NDgsCisgICAgICAgIDB4MmMsIDB4MmEsIDB4Y2EsIDB4Y2YsIDB4NzMsIDB4MjgsIDB4YzksIDB4NGMsIDB4NGIsIDB4ZDQsIDB4Y2IsIDB4MmQsCisgICAgICAgIDB4MjksIDB4ZDMsIDB4NGIsIDB4Y2UsIDB4MmYsIDB4MmEsIDB4ZDAsIDB4NGIsIDB4Y2YsIDB4Y2YsIDB4NGYsIDB4Y2YsCisgICAgICAgIDB4NDksIDB4MDUsIDB4YjIsIDB4NzMsIDB4MzUsIDB4MTUsIDB4MzQsIDB4ZDIsIDB4OTMsIDB4OTMsIDB4ZTEsIDB4ZmEsCisgICAgICAgIDB4NGMsIDB4ZjQsIDB4Y2MsIDB4MTUsIDB4MzQsIDB4ZGMsIDB4OWQsIDB4OWQsIDB4MzUsIDB4MTUsIDB4MzQsIDB4MTUsCisgICAgICAgIDB4OTQsIDB4MGQsIDB4MTUsIDB4MDIsIDB4ODIsIDB4NWMsIDB4NWQsIDB4N2QsIDB4MDMsIDB4NDIsIDB4MTQsIDB4ODIsCisgICAgICAgIDB4MTMsIDB4NGIsIDB4MTQsIDB4YmMsIDB4MTIsIDB4ZjMsIDB4MTQsIDB4NGMsIDB4MTUsIDB4OGMsIDB4YWMsIDB4NGMsCisgICAgICAgIDB4NGMsIDB4YWQsIDB4OGMsIDB4NGMsIDB4MTQsIDB4MDIsIDB4NWMsIDB4NDIsIDB4MTQsIDB4OGMsIDB4MGMsIDB4MGMsCisgICAgICAgIDB4MmMsIDB4YjgsIDB4MTgsIDB4ZTAsIDB4MmUsIDB4MDAsIDB4MDAsIDB4ZDMsIDB4NmUsIDB4NjgsIDB4YTYsIDB4OTAsCisgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAKKyAgICB9OworCisgICAgLy8gYSBtb2NrIHNlbWktY29tcHJlc3NlZCBrZXJuZWwKKyAgICAvLyBhbiB1bnNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMsIGZvbGxvd2VkIGJ5IGEgdmVyc2lvbiBzdHJpbmcsCisgICAgLy8gZm9sbG93ZWQgYnkgYSBnemlwIGhlYWRlcgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtNb2NrS2VybmVsU2VtaUNvbXByZXNzZWRbXSA9IHsKKyAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDM5LCAweDYxLAorICAgIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NGMsIDB4NjksIDB4NmUsIDB4NzUsIDB4NzgsIDB4MjAsIDB4NzYsCisgICAgMHg2NSwgMHg3MiwgMHg3MywgMHg2OSwgMHg2ZiwgMHg2ZSwgMHgyMCwgMHgzMywgMHgyZSwgMHgzMSwgMHgzMCwgMHgyZSwKKyAgICAweDMwLCAweDJiLCAweDIwLCAweDI4LCAweDc2LCAweDY4LCAweDYxLCAweDcyLCAweDcyLCAweDZmLCAweDZlLCAweDQwLAorICAgIDB4NzQsIDB4NjksIDB4NjYsIDB4NjEsIDB4MmUsIDB4NmQsIDB4NzQsIDB4NzYsIDB4MmUsIDB4NjMsIDB4NmYsIDB4NzIsCisgICAgMHg3MCwgMHgyZSwgMHg2NywgMHg2ZiwgMHg2ZiwgMHg2NywgMHg2YywgMHg2NSwgMHgyZSwgMHg2MywgMHg2ZiwgMHg2ZCwKKyAgICAweDI5LCAweDIwLCAweDI4LCAweDY3LCAweDYzLCAweDYzLCAweDIwLCAweDc2LCAweDY1LCAweDcyLCAweDczLCAweDY5LAorICAgIDB4NmYsIDB4NmUsIDB4MjAsIDB4MzQsIDB4MmUsIDB4MzcsIDB4MjAsIDB4MjgsIDB4NDcsIDB4NDMsIDB4NDMsIDB4MjksCisgICAgMHgyMCwgMHgyOSwgMHgyMCwgMHgyMywgMHgzMSwgMHgyMCwgMHg1MCwgMHg1MiwgMHg0NSwgMHg0NSwgMHg0ZCwgMHg1MCwKKyAgICAweDU0LCAweDIwLCAweDUzLCAweDYxLCAweDc0LCAweDIwLCAweDRhLCAweDYxLCAweDZlLCAweDIwLCAweDM1LCAweDIwLAorICAgIDB4MzIsIDB4M2EsIDB4MzQsIDB4MzUsIDB4M2EsIDB4MzIsIDB4MzQsIDB4MjAsIDB4NTAsIDB4NDQsIDB4NTQsIDB4MjAsCisgICAgMHgzMiwgMHgzMCwgMHgzMCwgMHgzOCwgMHgwYSwgMHgwMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNSwKKyAgICAweDM3LCAweDM4LCAweDM5LCAweDFmLCAweDhiLCAweDA4LCAweDAwLCAweDNlLCAweGE5LCAweGM3LCAweDUzLCAweDAwLAorICAgIDB4MDMsIDB4MGIsIDB4ZjcsIDB4NzAsIDB4MGMsIDB4NzEsIDB4MGQsIDB4NzMsIDB4MGQsIDB4MDIsIDB4MDAsIDB4ZmYsCisgICAgMHhkZiwgMHgyMiwgMHg4OCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMAorICAgIH07CisKKyAgICBjaGFyIGtlcm5lbFZlcnNpb25TdHJpbmdbMjU2XTsKKworICAgIGtlcm5lbFZlcnNpb25TdHJpbmdbMF0gPSAwOworICAgIEVYUEVDVF9FUSh0cnVlLCBhbmRyb2lkX2ltYWdlUHJvYmVLZXJuZWxWZXJzaW9uU3RyaW5nKAorICAgICAgICBrTW9ja0tlcm5lbEVsZiwKKyAgICAgICAgc2l6ZW9mKGtNb2NrS2VybmVsRWxmKSwKKyAgICAgICAga2VybmVsVmVyc2lvblN0cmluZywKKyAgICAgICAgc2l6ZW9mKGtlcm5lbFZlcnNpb25TdHJpbmcpKSk7CisgICAgRVhQRUNUX1NUUkVRKGtNb2NrS2VybmVsVmVyc2lvbiwga2VybmVsVmVyc2lvblN0cmluZyk7CisKKyAgICBrZXJuZWxWZXJzaW9uU3RyaW5nWzBdID0gMDsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYW5kcm9pZF9pbWFnZVByb2JlS2VybmVsVmVyc2lvblN0cmluZygKKyAgICAgICAga01vY2tLZXJuZWxHemlwLAorICAgICAgICBzaXplb2Yoa01vY2tLZXJuZWxHemlwKSwKKyAgICAgICAga2VybmVsVmVyc2lvblN0cmluZywKKyAgICAgICAgc2l6ZW9mKGtlcm5lbFZlcnNpb25TdHJpbmcpKSk7CisgICAgRVhQRUNUX1NUUkVRKGtNb2NrS2VybmVsVmVyc2lvbiwga2VybmVsVmVyc2lvblN0cmluZyk7CisKKyAgICBrZXJuZWxWZXJzaW9uU3RyaW5nWzBdID0gMDsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYW5kcm9pZF9pbWFnZVByb2JlS2VybmVsVmVyc2lvblN0cmluZygKKyAgICAgICAga01vY2tLZXJuZWxTZW1pQ29tcHJlc3NlZCwKKyAgICAgICAgc2l6ZW9mKGtNb2NrS2VybmVsU2VtaUNvbXByZXNzZWQpLAorICAgICAgICBrZXJuZWxWZXJzaW9uU3RyaW5nLAorICAgICAgICBzaXplb2Yoa2VybmVsVmVyc2lvblN0cmluZykpKTsKKyAgICBFWFBFQ1RfU1RSRVEoa01vY2tLZXJuZWxWZXJzaW9uLCBrZXJuZWxWZXJzaW9uU3RyaW5nKTsKKworICAgIGtlcm5lbFZlcnNpb25TdHJpbmdbMF0gPSAxMjc7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRfaW1hZ2VQcm9iZUtlcm5lbFZlcnNpb25TdHJpbmcoCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIGtlcm5lbFZlcnNpb25TdHJpbmcsCisgICAgICAgIHNpemVvZihrZXJuZWxWZXJzaW9uU3RyaW5nKSkpOworICAgIEVYUEVDVF9FUSgxMjcsIGtlcm5lbFZlcnNpb25TdHJpbmdbMF0pOworCisgICAga2VybmVsVmVyc2lvblN0cmluZ1swXSA9IDEyNzsKKyAgICBFWFBFQ1RfRkFMU0UoYW5kcm9pZF9pbWFnZVByb2JlS2VybmVsVmVyc2lvblN0cmluZygKKyAgICAgICAga01vY2tLZXJuZWxFbGZOb1N0cmluZywKKyAgICAgICAgc2l6ZW9mKGtNb2NrS2VybmVsRWxmTm9TdHJpbmcpLAorICAgICAgICBrZXJuZWxWZXJzaW9uU3RyaW5nLAorICAgICAgICBzaXplb2Yoa2VybmVsVmVyc2lvblN0cmluZykpKTsKKyAgICBFWFBFQ1RfRVEoMTI3LCBrZXJuZWxWZXJzaW9uU3RyaW5nWzBdKTsKK30KKwordm9pZCBQYXJzZUtlcm5lbFZlcnNpb25TdHJpbmcoY29uc3QgY2hhciogdmVyc2lvblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtlcm5lbFZlcnNpb24gZXhwZWN0ZWRWZXJzaW9uKSB7CisgICAgS2VybmVsVmVyc2lvbiBhY3R1YWxWZXJzaW9uOworICAgIEVYUEVDVF9FUSh0cnVlLCBhbmRyb2lkX3BhcnNlTGludXhWZXJzaW9uU3RyaW5nKHZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbFZlcnNpb24pKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKTsKK30KKworVEVTVChLZXJuZWxVdGlscywgUGFyc2VLZXJuZWxWZXJzaW9uU3RyaW5nKSB7CisgICAgUGFyc2VLZXJuZWxWZXJzaW9uU3RyaW5nKCJMaW51eCB2ZXJzaW9uIDIuNi4yOS1nZWE0NzdiYiAoa3Jvby4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VSTkVMX1ZFUlNJT05fMl82XzI5KTsKKworICAgIFBhcnNlS2VybmVsVmVyc2lvblN0cmluZygiTGludXggdmVyc2lvbiAyLjYuMjkgKHZjaHQuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFUk5FTF9WRVJTSU9OXzJfNl8yOSk7CisKKyAgICBQYXJzZUtlcm5lbFZlcnNpb25TdHJpbmcoIkxpbnV4IHZlcnNpb24gMy40LjAtNjY5ODUtZ2IwNDk0NmIgKGRpZ2kuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFUk5FTF9WRVJTSU9OXzNfNF8wKTsKKworICAgIFBhcnNlS2VybmVsVmVyc2lvblN0cmluZygiTGludXggdmVyc2lvbiAzLjQuNjcrIChnaGFjLi4uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVJORUxfVkVSU0lPTl8zXzRfNjcgKTsKKworICAgIFBhcnNlS2VybmVsVmVyc2lvblN0cmluZygiTGludXggdmVyc2lvbiAzLjQuNjctMDE0MTMtZzlhYzQ5N2YgKGdoYWMuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFUk5FTF9WRVJTSU9OXzNfNF82Nyk7CisKKyAgICBQYXJzZUtlcm5lbFZlcnNpb25TdHJpbmcoIkxpbnV4IHZlcnNpb24gMy4xMC4wKyAoZ2hhYy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VSTkVMX1ZFUlNJT05fM18xMF8wKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGtlcm5lbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwvdGVzdGluZy9wcmludF9tb2NrX2tlcm5lbF9kYXRhLnNoIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2tlcm5lbC90ZXN0aW5nL3ByaW50X21vY2tfa2VybmVsX2RhdGEuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzZjZTExMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9rZXJuZWwvdGVzdGluZy9wcmludF9tb2NrX2tlcm5lbF9kYXRhLnNoCkBAIC0wLDAgKzEsNDAgQEAKKyMhL2Jpbi9iYXNoIC1lCisKK0xJTlVYX1ZFUlNJT049IkxpbnV4IHZlcnNpb24gMy4xMC4wKyAodmhhcnJvbkB0aWZhLm10di5jb3JwLmdvb2dsZS5jb20pIChnY2MgdmVyc2lvbiA0LjcgKEdDQykgKSAjMSBQUkVFTVBUIFNhdCBKYW4gNSAyOjQ1OjI0IFBEVCAyMDA4XHhBXHgwIgorVE1QX0ZJTEU9L3RtcC9wcmludF9tb2NrX2tlcm5lbF90bXAKKworcHJpbnRmICIvLyBhIG1vY2sgdW5jb21wcmVzc2VkIGtlcm5lbFxuIgorcHJpbnRmICIvLyBFTEYgaGVhZGVyLCBmb2xsb3dlZCBieSBhbiB1bnNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXNcbiIKK3ByaW50ZiAiLy8gZm9sbG93ZWQgYnkgYSAnTGludXggdmVyc2lvbiAnIHN0cmluZ1xuIgorcHJpbnRmICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTW9ja0tlcm5lbEVsZltdID0ge1xuIgorcHJpbnRmICdceDdmJ0VMRjAxMjM0NTY3ODkiJHtMSU5VWF9WRVJTSU9OfSIwMTIzNDU2Nzg5IHwgeHhkIC1pCitwcmludGYgIn07XG5cbiIKKworcHJpbnRmICIvLyBhIG1vY2sgdW5jb21wcmVzc2VkIGtlcm5lbCB3aXRob3V0IHZlcnNpb24gc3RyaW5nXG4iCitwcmludGYgIi8vIEVMRiBoZWFkZXIsIGZvbGxvd2VkIGJ5IGFuIHVuc3BlY2lmaWVkIG51bWJlciBvZiBieXRlc1xuIgorcHJpbnRmICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTW9ja0tlcm5lbEVsZk5vU3RyaW5nW10gPSB7XG4iCitwcmludGYgJ1x4N2YnRUxGMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSB8IHh4ZCAtaQorcHJpbnRmICJ9O1xuXG4iCisKK3ByaW50ZiAiLy8gYSBtb2NrIGNvbXByZXNzZWQga2VybmVsXG4iCitwcmludGYgIi8vIGFuIHVuc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcywgZm9sbG93ZWQgYnkgYSBnemlwIGhlYWRlclxuIgorcHJpbnRmICIvLyBnemlwIHN0cmVhbSBzdGFydHMgMTAgYnl0ZXMgYWZ0ZXIgZ3ppcCBoZWFkZXIsIHVuY29tcHJlc3NlZCBnemlwIHN0cmVhbVxuIgorcHJpbnRmICIvLyBiZWdpbnMgd2l0aCBhbiBFTEYgaGVhZGVyIGFzIGFib3ZlXG4iCitwcmludGYgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtNb2NrS2VybmVsR3ppcFtdID0ge1xuIgorcHJpbnRmICIwMTIzNDU2Nzg5IiA+ICRUTVBfRklMRQorcHJpbnRmICdceDdmJ0VMRjAxMjM0NTY3ODkiJHtMSU5VWF9WRVJTSU9OfSIwMTIzNDU2Nzg5IHwgZ3ppcCA+PiAkVE1QX0ZJTEUKK2NhdCAkVE1QX0ZJTEUgfCB4eGQgLWkKK3ByaW50ZiAifTtcblxuIgorCitwcmludGYgIi8vIGEgbW9jayBzZW1pLWNvbXByZXNzZWQga2VybmVsXG4iCitwcmludGYgIi8vIGFuIHVuc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcywgZm9sbG93ZWQgYnkgYSB2ZXJzaW9uIHN0cmluZyxcbiIKK3ByaW50ZiAiLy8gZm9sbG93ZWQgYnkgYSBnemlwIGhlYWRlclxuIgorcHJpbnRmICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrTW9ja0tlcm5lbFNlbWlDb21wcmVzc2VkW10gPSB7XG4iCitwcmludGYgIjAxMjM0NTY3ODk5YWJjZGVmJHtMSU5VWF9WRVJTSU9OfTAxMjM0NTU3ODkiID4gJFRNUF9GSUxFCitwcmludGYgIldIQVRFVkVSIiB8IGd6aXAgPj4gJFRNUF9GSUxFCitjYXQgJFRNUF9GSUxFIHwgeHhkIC1pCitwcmludGYgIn07XG5cbiIKKworcm0gJFRNUF9GSUxFCisKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2xvYWRwbmcuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9sb2FkcG5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhODU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9sb2FkcG5nLmMKQEAgLTAsMCArMSwyNzYgQEAKKyNpbmNsdWRlIDxwbmcuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiAwCisjZGVmaW5lIExPRyh4Li4uKSBmcHJpbnRmKHN0ZGVyciwiZXJyb3I6ICIgeCkKKyNlbHNlCisjZGVmaW5lIExPRyh4Li4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCit2b2lkICpsb2FkcG5nKGNvbnN0IGNoYXIgKmZuLCB1bnNpZ25lZCAqX3dpZHRoLCB1bnNpZ25lZCAqX2hlaWdodCkKK3sKKyAgICBGSUxFICpmcCA9IDA7CisgICAgdW5zaWduZWQgY2hhciBoZWFkZXJbOF07CisgICAgdW5zaWduZWQgY2hhciAqZGF0YSA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqKnJvd3B0cnMgPSAwOworICAgIHBuZ19zdHJ1Y3RwIHAgPSAwOworICAgIHBuZ19pbmZvcCBwaSA9IDA7CisKKyAgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgIGludCBiaXRkZXB0aCwgY29sb3J0eXBlLCBpbWV0aG9kLCBjbWV0aG9kLCBmbWV0aG9kLCBpOworCisgICAgcCA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwKTsKKyAgICBpZihwID09IDApIHsKKyAgICAgICAgTE9HKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIHBuZyByZWFkIHN0cnVjdFxuIiwgZm4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwaSA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocCk7CisgICAgaWYocGkgPT0gMCkgeworICAgICAgICBMT0coIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgcG5nIGluZm8gc3RydWN0XG4iLCBmbik7CisgICAgICAgIGdvdG8gb29wczsKKyAgICB9CisKKyAgICBmcCA9IGZvcGVuKGZuLCAicmIiKTsKKyAgICBpZihmcCA9PSAwKSB7CisgICAgICAgIExPRygiJXM6IGZhaWxlZCB0byBvcGVuIGZpbGVcbiIsIGZuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYoZnJlYWQoaGVhZGVyLCA4LCAxLCBmcCkgIT0gMSkgeworICAgICAgICBMT0coIiVzOiBmYWlsZWQgdG8gcmVhZCBoZWFkZXJcbiIsIGZuKTsKKyAgICAgICAgZ290byBvb3BzOworICAgIH0KKworICAgIGlmKHBuZ19zaWdfY21wKGhlYWRlciwgMCwgOCkpIHsKKyAgICAgICAgTE9HKCIlczogaGVhZGVyIGlzIG5vdCBhIFBORyBoZWFkZXJcbiIsIGZuKTsKKyAgICAgICAgZ290byBvb3BzOworICAgIH0KKworICAgIGlmKHNldGptcChwbmdfam1wYnVmKHApKSkgeworICAgICAgICBMT0coIiVzOiBwbmcgbGlicmFyeSBlcnJvclxuIiwgZm4pOworICAgIG9vcHM6CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwLCAmcGksIDApOworICAgICAgICBpZihmcCAhPSAwKSBmY2xvc2UoZnApOworICAgICAgICBpZihkYXRhICE9IDApIGZyZWUoZGF0YSk7CisgICAgICAgIGlmKHJvd3B0cnMgIT0gMCkgZnJlZShyb3dwdHJzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcG5nX2luaXRfaW8ocCwgZnApOworICAgIHBuZ19zZXRfc2lnX2J5dGVzKHAsIDgpOworCisgICAgcG5nX3JlYWRfaW5mbyhwLCBwaSk7CisKKyAgICBwbmdfZ2V0X0lIRFIocCwgcGksICZ3aWR0aCwgJmhlaWdodCwgJmJpdGRlcHRoLCAmY29sb3J0eXBlLAorICAgICAgICAgICAgICAgICAmaW1ldGhvZCwgJmNtZXRob2QsICZmbWV0aG9kKTsKKy8vICAgIHByaW50ZigiUE5HOiAlZCB4ICVkIChkPSVkLCBjPSVkKVxuIiwKKy8vICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBiaXRkZXB0aCwgY29sb3J0eXBlKTsKKworICAgIHN3aXRjaChjb2xvcnR5cGUpeworICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKKyAgICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYihwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKKyAgICAgICAgaWYocG5nX2dldF92YWxpZChwLCBwaSwgUE5HX0lORk9fdFJOUykpIHsKKyAgICAgICAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBuZ19zZXRfZmlsbGVyKHAsIDB4ZmYsIFBOR19GSUxMRVJfQUZURVIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9HUkFZOgorICAgICAgICBpZihiaXRkZXB0aCA8IDgpIHsKKyAgICAgICAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwKTsKKyAgICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKCIlczogdW5zdXBwb3J0ZWQgKGdyYXlzY2FsZT8pIGNvbG9yIHR5cGVcbiIpOworICAgICAgICBnb3RvIG9vcHM7CisgICAgfQorCisgICAgaWYoYml0ZGVwdGggPT0gMTYpIHsKKyAgICAgICAgcG5nX3NldF9zdHJpcF8xNihwKTsKKyAgICB9CisKKyAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIqKSBtYWxsb2MoKHdpZHRoICogNCkgKiBoZWlnaHQpOworICAgIHJvd3B0cnMgPSAodW5zaWduZWQgY2hhciAqKikgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBjaGFyKikgKiBoZWlnaHQpOworCisgICAgaWYoKGRhdGEgPT0gMCkgfHwgKHJvd3B0cnMgPT0gMCkpeworICAgICAgICBMT0coImNvdWxkIG5vdCBhbGxvY2F0ZSBkYXRhIGJ1ZmZlclxuIik7CisgICAgICAgIGdvdG8gb29wczsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICByb3dwdHJzW2ldID0gZGF0YSArICgod2lkdGggKiA0KSAqIGkpOworICAgIH0KKworICAgIHBuZ19yZWFkX2ltYWdlKHAsIHJvd3B0cnMpOworCisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJnAsICZwaSwgMCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZihyb3dwdHJzICE9IDApIGZyZWUocm93cHRycyk7CisKKyAgICAqX3dpZHRoID0gd2lkdGg7CisgICAgKl9oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gKHZvaWQqKSBkYXRhOworfQorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogIGJhc2U7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogIGVuZDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgY3Vyc29yOworCit9IFBuZ1JlYWRlcjsKKworc3RhdGljIHZvaWQKK3BuZ19yZWFkZXJfcmVhZF9kYXRhKCBwbmdfc3RydWN0cCAgcG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHBuZ19zaXplX3QgIGxlbmd0aCApCit7CisgIFBuZ1JlYWRlciogcmVhZGVyID0gcG5nX2dldF9pb19wdHIocG5nX3B0cik7CisgIHBuZ19zaXplX3QgYXZhaWwgID0gKHBuZ19zaXplX3QpKHJlYWRlci0+ZW5kIC0gcmVhZGVyLT5jdXJzb3IpOworCisgIGlmIChhdmFpbCA+IGxlbmd0aCkKKyAgICAgIGF2YWlsID0gbGVuZ3RoOworCisgIG1lbWNweSggZGF0YSwgcmVhZGVyLT5jdXJzb3IsIGF2YWlsICk7CisgIHJlYWRlci0+Y3Vyc29yICs9IGF2YWlsOworfQorCisKK3ZvaWQgKnJlYWRwbmcoY29uc3QgdW5zaWduZWQgY2hhciAqYmFzZSwgc2l6ZV90ICAgc2l6ZSwgdW5zaWduZWQgKl93aWR0aCwgdW5zaWduZWQgKl9oZWlnaHQpCit7CisgICAgUG5nUmVhZGVyICByZWFkZXI7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YSA9IDA7CisgICAgdW5zaWduZWQgY2hhciAqKnJvd3B0cnMgPSAwOworICAgIHBuZ19zdHJ1Y3RwIHAgPSAwOworICAgIHBuZ19pbmZvcCBwaSA9IDA7CisKKyAgICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0OworICAgIGludCBiaXRkZXB0aCwgY29sb3J0eXBlLCBpbWV0aG9kLCBjbWV0aG9kLCBmbWV0aG9kLCBpOworCisgICAgcCA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwKTsKKyAgICBpZihwID09IDApIHsKKyAgICAgICAgTE9HKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIHBuZyByZWFkIHN0cnVjdFxuIiwgZm4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwaSA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocCk7CisgICAgaWYocGkgPT0gMCkgeworICAgICAgICBMT0coIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgcG5nIGluZm8gc3RydWN0XG4iLCBmbik7CisgICAgICAgIGdvdG8gb29wczsKKyAgICB9CisKKyAgICByZWFkZXIuYmFzZSAgID0gYmFzZTsKKyAgICByZWFkZXIuZW5kICAgID0gYmFzZSArIHNpemU7CisgICAgcmVhZGVyLmN1cnNvciA9IGJhc2U7CisKKyAgICBpZihzaXplIDwgOCB8fCBwbmdfc2lnX2NtcCgodW5zaWduZWQgY2hhciopYmFzZSwgMCwgOCkpIHsKKyAgICAgICAgTE9HKCIlczogaGVhZGVyIGlzIG5vdCBhIFBORyBoZWFkZXJcbiIsIGZuKTsKKyAgICAgICAgZ290byBvb3BzOworICAgIH0KKworICAgIHJlYWRlci5jdXJzb3IgKz0gODsKKworICAgIGlmKHNldGptcChwbmdfam1wYnVmKHApKSkgeworICAgICAgICBMT0coIiVzOiBwbmcgbGlicmFyeSBlcnJvclxuIiwgZm4pOworICAgIG9vcHM6CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCZwLCAmcGksIDApOworICAgICAgICBpZihkYXRhICE9IDApIGZyZWUoZGF0YSk7CisgICAgICAgIGlmKHJvd3B0cnMgIT0gMCkgZnJlZShyb3dwdHJzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcG5nX3NldF9yZWFkX2ZuIChwLCAmcmVhZGVyLCBwbmdfcmVhZGVyX3JlYWRfZGF0YSk7CisgICAgcG5nX3NldF9zaWdfYnl0ZXMocCwgOCk7CisKKyAgICBwbmdfcmVhZF9pbmZvKHAsIHBpKTsKKworICAgIHBuZ19nZXRfSUhEUihwLCBwaSwgJndpZHRoLCAmaGVpZ2h0LCAmYml0ZGVwdGgsICZjb2xvcnR5cGUsCisgICAgICAgICAgICAgICAgICZpbWV0aG9kLCAmY21ldGhvZCwgJmZtZXRob2QpOworLy8gICAgcHJpbnRmKCJQTkc6ICVkIHggJWQgKGQ9JWQsIGM9JWQpXG4iLAorLy8gICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJpdGRlcHRoLCBjb2xvcnR5cGUpOworCisgICAgc3dpdGNoKGNvbG9ydHlwZSl7CisgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFOgorICAgICAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUkdCOgorICAgICAgICBpZihwbmdfZ2V0X3ZhbGlkKHAsIHBpLCBQTkdfSU5GT190Uk5TKSkgeworICAgICAgICAgICAgcG5nX3NldF90Uk5TX3RvX2FscGhhKHApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG5nX3NldF9maWxsZXIocCwgMHhmZiwgUE5HX0ZJTExFUl9BRlRFUik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQToKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CisgICAgICAgIGlmKGJpdGRlcHRoIDwgOCkgeworICAgICAgICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KHApOworICAgICAgICB9CisKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coIiVzOiB1bnN1cHBvcnRlZCAoZ3JheXNjYWxlPykgY29sb3IgdHlwZVxuIik7CisgICAgICAgIGdvdG8gb29wczsKKyAgICB9CisKKyAgICBpZihiaXRkZXB0aCA9PSAxNikgeworICAgICAgICBwbmdfc2V0X3N0cmlwXzE2KHApOworICAgIH0KKworICAgIGRhdGEgICAgPSAodW5zaWduZWQgY2hhciopIG1hbGxvYygod2lkdGggKiA0KSAqIGhlaWdodCk7CisgICAgcm93cHRycyA9ICh1bnNpZ25lZCBjaGFyICoqKSBtYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGNoYXIqKSAqIGhlaWdodCk7CisKKyAgICBpZigoZGF0YSA9PSAwKSB8fCAocm93cHRycyA9PSAwKSl7CisgICAgICAgIExPRygiY291bGQgbm90IGFsbG9jYXRlIGRhdGEgYnVmZmVyXG4iKTsKKyAgICAgICAgZ290byBvb3BzOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIHJvd3B0cnNbaV0gPSBkYXRhICsgKCh3aWR0aCAqIDQpICogaSk7CisgICAgfQorCisgICAgcG5nX3JlYWRfaW1hZ2UocCwgcm93cHRycyk7CisKKyAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdCgmcCwgJnBpLCAwKTsKKyAgICBpZihyb3dwdHJzICE9IDApIGZyZWUocm93cHRycyk7CisKKyAgICAqX3dpZHRoID0gd2lkdGg7CisgICAgKl9oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gKHZvaWQqKSBkYXRhOworfQorCisKKyNpZiAwCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgdW5zaWduZWQgdyxoOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7CisKKyAgICBpZihhcmdjIDwgMikgcmV0dXJuIDA7CisKKworICAgIGRhdGEgPSBsb2FkcG5nKGFyZ3ZbMV0sICZ3LCAmaCk7CisKKyAgICBpZihkYXRhICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJ3OiAlZCAgaDogJWRcbiIsIHcsIGgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1jb21tb24tdWkuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWNvbW1vbi11aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzFkYmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1jb21tb24tdWkuYwpAQCAtMCwwICsxLDQyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1jb21tb24tdWkuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL3V0aWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0b3Itd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mcmFtZWJ1ZmZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Jlc291cmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2ZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vaW1hZ2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Ym9hcmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vdHJhY2tiYWxsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3dpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi93aW5zeXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VzZXItY29uZmlnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmluZy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgIEQoLi4uKSAgZG8geyAgaWYgKFZFUkJPU0VfQ0hFQ0soaW5pdCkpIGRwcmludChfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisKKy8qKiogIENPTkZJR1VSQVRJT04KKyAqKiovCisKK3N0YXRpYyBBVXNlckNvbmZpZyogIHVzZXJDb25maWc7CisKK2Jvb2wKK3VzZXJfY29uZmlnX2luaXQoIHZvaWQgKQoreworICAgIHVzZXJDb25maWcgPSBhdXNlckNvbmZpZ19uZXcoIGFuZHJvaWRfYXZkSW5mbyApOworICAgIHJldHVybiB1c2VyQ29uZmlnICE9IE5VTEw7Cit9CisKKy8qIG9ubHkgY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIG5vcm1hbCBleGl0cywgc28gdGhhdCBeQyBkb2Vzbid0IHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gKi8KK3ZvaWQKK3VzZXJfY29uZmlnX2RvbmUoIHZvaWQgKQoreworICAgIGludCAgd2luX3gsIHdpbl95OworCisgICAgaWYgKCF1c2VyQ29uZmlnKSB7CisgICAgICAgIEQoIm5vIHVzZXIgY29uZmlndXJhdGlvbj8iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNraW5fd2luc3lzX2dldF93aW5kb3dfcG9zKCZ3aW5feCwgJndpbl95KTsKKyAgICBhdXNlckNvbmZpZ19zZXRXaW5kb3dQb3ModXNlckNvbmZpZywgd2luX3gsIHdpbl95KTsKKyAgICBhdXNlckNvbmZpZ19zYXZlKHVzZXJDb25maWcpOworICAgIGF1c2VyQ29uZmlnX2ZyZWUodXNlckNvbmZpZyk7CisgICAgdXNlckNvbmZpZyA9IE5VTEw7Cit9CisKK3ZvaWQKK3VzZXJfY29uZmlnX2dldF93aW5kb3dfcG9zKCBpbnQgKndpbmRvd194LCBpbnQgKndpbmRvd195ICkKK3sKKyAgICAqd2luZG93X3ggPSAqd2luZG93X3kgPSAxMDsKKworICAgIGlmICh1c2VyQ29uZmlnKQorICAgICAgICBhdXNlckNvbmZpZ19nZXRXaW5kb3dQb3ModXNlckNvbmZpZywgd2luZG93X3gsIHdpbmRvd195KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgICAgICAgUyBLIEkgTiAgIFMgVSBQIFAgTyBSIFQgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQUNvbmZpZyogc19za2luQ29uZmlnID0gTlVMTDsKK3N0YXRpYyBjaGFyKiBzX3NraW5QYXRoID0gTlVMTDsKKworLyogbGlzdCBvZiBza2luIGFsaWFzZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICBuYW1lOworICAgIGNvbnN0IGNoYXIqICBhbGlhczsKK30gc2tpbl9hbGlhc2VzW10gPSB7CisgICAgeyAiUVZHQS1MIiwgIjMyMHgyNDAiIH0sCisgICAgeyAiUVZHQS1QIiwgIjI0MHgzMjAiIH0sCisgICAgeyAiSFZHQS1MIiwgIjQ4MHgzMjAiIH0sCisgICAgeyAiSFZHQS1QIiwgIjMyMHg0ODAiIH0sCisgICAgeyAiUVZHQSIsICIzMjB4MjQwIiB9LAorICAgIHsgIkhWR0EiLCAiMzIweDQ4MCIgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQorfTsKKwordm9pZAorcGFyc2Vfc2tpbl9maWxlcyhjb25zdCBjaGFyKiAgICAgIHNraW5EaXJQYXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgIHNraW5OYW1lLAorICAgICAgICAgICAgICAgICBBbmRyb2lkT3B0aW9ucyogIG9wdHMsCisgICAgICAgICAgICAgICAgIEFuZHJvaWRId0NvbmZpZyogaHdDb25maWcsCisgICAgICAgICAgICAgICAgIEFDb25maWcqICAgICAgICAqc2tpbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICAgICpza2luUGF0aCkKK3sKKyAgICBjaGFyICAgICAgdG1wWzEwMjRdOworICAgIEFDb25maWcqICByb290OworICAgIGNvbnN0IGNoYXIqIHBhdGggPSBOVUxMOworICAgIEFDb25maWcqICBuOworCisgICAgcm9vdCA9IGFjb25maWdfbm9kZSgiIiwgIiIpOworCisgICAgaWYgKHNraW5OYW1lID09IE5VTEwpCisgICAgICAgIGdvdG8gREVGQVVMVF9TS0lOOworCisgICAgLyogU3VwcG9ydCBza2luIGFsaWFzZXMgbGlrZSBRVkdBLUggUVZHQS1QLCBldGMuLi4KKyAgICAgICBCdXQgZmlyc3Qgd2UgY2hlY2sgaWYgaXQncyBhIGRpcmVjdG9yeSB0aGF0IGV4aXN0IGJlZm9yZSBhcHBseWluZworICAgICAgIHRoZSBhbGlhcyAqLworICAgIGludCAgY2hlY2tBbGlhcyA9IDE7CisKKyAgICBpZiAoc2tpbkRpclBhdGggIT0gTlVMTCkgeworICAgICAgICBidWZwcmludCh0bXAsIHRtcCtzaXplb2YodG1wKSwgIiVzLyVzIiwgc2tpbkRpclBhdGgsIHNraW5OYW1lKTsKKyAgICAgICAgaWYgKHBhdGhfZXhpc3RzKHRtcCkpIHsKKyAgICAgICAgICAgIGNoZWNrQWxpYXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgidGhlcmUgaXMgbm8gJyVzJyBza2luIGluICclcyciLCBza2luTmFtZSwgc2tpbkRpclBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNoZWNrQWxpYXMpIHsKKyAgICAgICAgaW50ICBubjsKKworICAgICAgICBmb3IgKG5uID0gMDsgOyBubisrICkgeworICAgICAgICAgICAgY29uc3QgY2hhciogIHNraW5fbmFtZSAgPSBza2luX2FsaWFzZXNbbm5dLm5hbWU7CisgICAgICAgICAgICBjb25zdCBjaGFyKiAgc2tpbl9hbGlhcyA9IHNraW5fYWxpYXNlc1tubl0uYWxpYXM7CisKKyAgICAgICAgICAgIGlmICghc2tpbl9uYW1lKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoIHNraW5fbmFtZSwgc2tpbk5hbWUgKSkgeworICAgICAgICAgICAgICAgIEQoInNraW4gbmFtZSAnJXMnIGFsaWFzZWQgdG8gJyVzJyIsIHNraW5OYW1lLCBza2luX2FsaWFzKTsKKyAgICAgICAgICAgICAgICBza2luTmFtZSA9IHNraW5fYWxpYXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYWdpY2FsbHkgc3VwcG9ydCBza2lucyBsaWtlICIzMjB4MjQwIiBvciAiMzIweDI0MHgxNiIgKi8KKyAgICBpZihpc2RpZ2l0KHNraW5OYW1lWzBdKSkgeworICAgICAgICBjaGFyICp4ID0gc3RyY2hyKHNraW5OYW1lLCAneCcpOworICAgICAgICBpZih4ICYmIGlzZGlnaXQoeFsxXSkpIHsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IGF0b2koc2tpbk5hbWUpOworICAgICAgICAgICAgaW50IGhlaWdodCA9IGF0b2koeCsxKTsKKyAgICAgICAgICAgIGludCBicHAgICA9IGh3Q29uZmlnLT5od19sY2RfZGVwdGg7IC8vIHJlc3BlY3QgdGhlIGRlcHRoIHNldHRpbmcgaW4gdGhlIGNvbmZpZy5pbmkKKyAgICAgICAgICAgIGNoYXIqIHkgPSBzdHJjaHIoeCsxLCAneCcpOworICAgICAgICAgICAgaWYgKHkgJiYgaXNkaWdpdCh5WzFdKSkgeworICAgICAgICAgICAgICAgIGJwcCA9IGF0b2koeSsxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YgdG1wLAorICAgICAgICAgICAgICAgICAgICAiZGlzcGxheSB7XG4gIHdpZHRoICVkXG4gIGhlaWdodCAlZFxuIGJwcCAlZH1cbiIsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsYnBwKTsKKyAgICAgICAgICAgIGFjb25maWdfbG9hZChyb290LCBzdHJkdXAodG1wKSk7CisgICAgICAgICAgICBwYXRoID0gIjoiOworICAgICAgICAgICAgRCgiZm91bmQgbWFnaWMgc2tpbiB3aWR0aD0lZCBoZWlnaHQ9JWQgYnBwPSVkXG4iLCB3aWR0aCwgaGVpZ2h0LCBicHApOworICAgICAgICAgICAgZ290byBGT1VORF9TS0lOOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNraW5EaXJQYXRoID09IE5VTEwpIHsKKyAgICAgICAgZGVycm9yKCJ1bmtub3duIHNraW4gbmFtZSAnJXMnIiwgc2tpbk5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mIHRtcCwgIiVzLyVzL2xheW91dCIsIHNraW5EaXJQYXRoLCBza2luTmFtZSk7CisgICAgRCgidHJ5aW5nIHRvIGxvYWQgc2tpbiBmaWxlICclcyciLCB0bXApOworCisgICAgaWYoYWNvbmZpZ19sb2FkX2ZpbGUocm9vdCwgdG1wKSA8IDApIHsKKyAgICAgICAgZHdhcm5pbmcoImNvdWxkIG5vdCBsb2FkIHNraW4gZmlsZSAnJXMnLCB1c2luZyBidWlsdC1pbiBvbmVcbiIsCisgICAgICAgICAgICAgICAgIHRtcCk7CisgICAgICAgIGdvdG8gREVGQVVMVF9TS0lOOworICAgIH0KKworICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mIHRtcCwgIiVzLyVzLyIsIHNraW5EaXJQYXRoLCBza2luTmFtZSk7CisgICAgcGF0aCA9IHRtcDsKKyAgICBnb3RvIEZPVU5EX1NLSU47CisKK0ZPVU5EX1NLSU46CisgICAgLyogdGhlIGRlZmF1bHQgbmV0d29yayBzcGVlZCBhbmQgbGF0ZW5jeSBjYW4gbm93IGJlIHNwZWNpZmllZCBieSB0aGUgZGV2aWNlIHNraW4gKi8KKyAgICBuID0gYWNvbmZpZ19maW5kKHJvb3QsICJuZXR3b3JrIik7CisgICAgaWYgKG4gIT0gTlVMTCkgeworICAgICAgICBhbmRyb2lkX3NraW5fbmV0X3NwZWVkID0gYWNvbmZpZ19zdHIobiwgInNwZWVkIiwgMCk7CisgICAgICAgIGFuZHJvaWRfc2tpbl9uZXRfZGVsYXkgPSBhY29uZmlnX3N0cihuLCAiZGVsYXkiLCAwKTsKKyAgICB9CisKKyAgICAvKiBleHRyYWN0IGZyYW1lYnVmZmVyIGluZm9ybWF0aW9uIGZyb20gdGhlIHNraW4uCisgICAgICoKKyAgICAgKiBmb3IgdmVyc2lvbiAxIG9mIHRoZSBza2luIGZvcm1hdCwgdGhleSBhcmUgaW4gdGhlIHRvcC1sZXZlbAorICAgICAqICdkaXNwbGF5JyBlbGVtZW50LgorICAgICAqCisgICAgICogZm9yIHZlcnNpb24gMiBvZiB0aGUgc2tpbiBmb3JtYXQsIHRoZXkgYXJlIHVuZGVyIHBhcnRzLmRldmljZS5kaXNwbGF5CisgICAgICovCisgICAgbiA9IGFjb25maWdfZmluZChyb290LCAiZGlzcGxheSIpOworICAgIGlmIChuID09IE5VTEwpIHsKKyAgICAgICAgbiA9IGFjb25maWdfZmluZChyb290LCAicGFydHMiKTsKKyAgICAgICAgaWYgKG4gIT0gTlVMTCkgeworICAgICAgICAgICAgbiA9IGFjb25maWdfZmluZChuLCAiZGV2aWNlIik7CisgICAgICAgICAgICBpZiAobiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbiA9IGFjb25maWdfZmluZChuLCAiZGlzcGxheSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG4gIT0gTlVMTCkgeworICAgICAgICBpbnQgIHdpZHRoICA9IGFjb25maWdfaW50KG4sICJ3aWR0aCIsIGh3Q29uZmlnLT5od19sY2Rfd2lkdGgpOworICAgICAgICBpbnQgIGhlaWdodCA9IGFjb25maWdfaW50KG4sICJoZWlnaHQiLCBod0NvbmZpZy0+aHdfbGNkX2hlaWdodCk7CisgICAgICAgIGludCAgZGVwdGggID0gYWNvbmZpZ19pbnQobiwgImJwcCIsIGh3Q29uZmlnLT5od19sY2RfZGVwdGgpOworCisgICAgICAgIGlmICh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCkgeworICAgICAgICAgICAgLyogVGhlIGVtdWxhdGVkIGZyYW1lYnVmZmVyIHdhbnRzIGEgd2lkdGggdGhhdCBpcyBhIG11bHRpcGxlIG9mIDIgKi8KKyAgICAgICAgICAgIGlmICgod2lkdGggJiAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgd2lkdGggID0gKHdpZHRoICsgMSkgJiB+MTsKKyAgICAgICAgICAgICAgICBEKCJhZGp1c3RpbmcgTENEIGRpbWVuc2lvbnMgdG8gKCVkeCVkeCkiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogb25seSBkZXB0aCB2YWx1ZXMgb2YgMTYgYW5kIDMyIGFyZSBjb3JyZWN0LiAxNiBpcyB0aGUgZGVmYXVsdC4gKi8KKyAgICAgICAgICAgIGlmIChkZXB0aCAhPSAzMiAmJiBkZXB0aCAhPSAxNikgeworICAgICAgICAgICAgICAgIGRlcHRoID0gMTY7CisgICAgICAgICAgICAgICAgRCgiYWRqdXN0aW5nIExDRCBiaXQgZGVwdGggdG8gJWQiLCBkZXB0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh3Q29uZmlnLT5od19sY2Rfd2lkdGggID0gd2lkdGg7CisgICAgICAgICAgICBod0NvbmZpZy0+aHdfbGNkX2hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIGh3Q29uZmlnLT5od19sY2RfZGVwdGggID0gZGVwdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBEKCJpZ25vcmluZyBpbnZhbGlkIHNraW4gTENEIGRpbWVuc2lvbnMgKCVkeCVkeCVkKSIsCisgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpza2luQ29uZmlnID0gcm9vdDsKKyAgICAqc2tpblBhdGggICA9IHN0cmR1cChwYXRoKTsKKyAgICByZXR1cm47CisKK0RFRkFVTFRfU0tJTjoKKyAgICB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBsYXlvdXRfYmFzZTsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIGxheW91dF9zaXplOworICAgICAgICBjaGFyKiAgICAgICAgICAgICAgICAgYmFzZTsKKworICAgICAgICBza2luTmFtZSA9ICI8YnVpbHRpbj4iOworCisgICAgICAgIGxheW91dF9iYXNlID0gc2tpbl9yZXNvdXJjZV9maW5kKCAibGF5b3V0IiwgJmxheW91dF9zaXplICk7CisgICAgICAgIGlmIChsYXlvdXRfYmFzZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IGxvYWQgYnVpbHRpbiBza2luXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgYmFzZSA9IG1hbGxvYyggbGF5b3V0X3NpemUrMSApOworICAgICAgICBtZW1jcHkoIGJhc2UsIGxheW91dF9iYXNlLCBsYXlvdXRfc2l6ZSApOworICAgICAgICBiYXNlW2xheW91dF9zaXplXSA9IDA7CisKKyAgICAgICAgRCgicGFyc2luZyBidWlsdC1pbiBza2luIGxheW91dCBmaWxlICglZCBieXRlcykiLCAoaW50KWxheW91dF9zaXplKTsKKyAgICAgICAgYWNvbmZpZ19sb2FkKHJvb3QsIGJhc2UpOworICAgICAgICBwYXRoID0gIjoiOworICAgIH0KKyAgICBnb3RvIEZPVU5EX1NLSU47Cit9CisKKworYm9vbCBlbXVsYXRvcl9wYXJzZVVpQ29tbWFuZExpbmVPcHRpb25zKEFuZHJvaWRPcHRpb25zKiBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm8qIGF2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkSHdDb25maWcqIGh3KSB7CisgICAgaWYgKHNraW5fY2hhcm1hcF9zZXR1cChvcHRzLT5jaGFybWFwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdXNlcl9jb25maWdfaW5pdCgpOworICAgIHBhcnNlX3NraW5fZmlsZXMob3B0cy0+c2tpbmRpciwgb3B0cy0+c2tpbiwgb3B0cywgaHcsCisgICAgICAgICAgICAgICAgICAgICAmc19za2luQ29uZmlnLCAmc19za2luUGF0aCk7CisKKyAgICBpZiAoIW9wdHMtPmNoYXJtYXApIHsKKyAgICAgICAgLyogVHJ5IHRvIGZpbmQgYSB2YWxpZCBjaGFybWFwIG5hbWUgKi8KKyAgICAgICAgY2hhciogY2hhcm1hcCA9IGF2ZEluZm9fZ2V0Q2hhcm1hcEZpbGUoYXZkLCBody0+aHdfa2V5Ym9hcmRfY2hhcm1hcCk7CisgICAgICAgIGlmIChjaGFybWFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEQoImF1dG9jb25maWc6IC1jaGFybWFwICVzIiwgY2hhcm1hcCk7CisgICAgICAgICAgICBzdHJfcmVzZXRfbm9jb3B5KCZvcHRzLT5jaGFybWFwLCBjaGFybWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRzLT5jaGFybWFwKSB7CisgICAgICAgIGNoYXIgY2hhcm1hcF9uYW1lW1NLSU5fQ0hBUk1BUF9OQU1FX1NJWkVdOworCisgICAgICAgIGlmICghcGF0aF9leGlzdHMob3B0cy0+Y2hhcm1hcCkpIHsKKyAgICAgICAgICAgIGRlcnJvcigiQ2hhcm1hcCBmaWxlIGRvZXMgbm90IGV4aXN0OiAlcyIsIG9wdHMtPmNoYXJtYXApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogV2UgbmVlZCB0byBzdG9yZSB0aGUgY2hhcm1hcCBuYW1lIGluIHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgKiBIb3dldmVyLCB0aGUgY2hhcm1hcCBmaWxlIGl0c2VsZiBpcyBvbmx5IHVzZWQgYnkgdGhlIFVJIGNvbXBvbmVudAorICAgICAgICAgKiBhbmQgZG9lc24ndCBuZWVkIHRvIGJlIHNldCB0byB0aGUgZW11bGF0aW9uIGVuZ2luZS4KKyAgICAgICAgICovCisgICAgICAgIGtjbV9leHRyYWN0X2NoYXJtYXBfbmFtZShvcHRzLT5jaGFybWFwLCBjaGFybWFwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcm1hcF9uYW1lKSk7CisgICAgICAgIHN0cl9yZXNldCgmaHctPmh3X2tleWJvYXJkX2NoYXJtYXAsIGNoYXJtYXBfbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZW11bGF0b3JfaW5pdFVzZXJJbnRlcmZhY2UoY29uc3QgQW5kcm9pZE9wdGlvbnMqIG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVpRW11QWdlbnQqIHVpRW11QWdlbnQpIHsKKyAgICB1c2VyX2NvbmZpZ19pbml0KCk7CisKKyAgICBhc3NlcnQoc19za2luQ29uZmlnICE9IE5VTEwpOworICAgIGFzc2VydChzX3NraW5QYXRoICE9IE5VTEwpOworCisgICAgcmV0dXJuIHVpX2luaXQoc19za2luQ29uZmlnLCBzX3NraW5QYXRoLCBvcHRzLCB1aUVtdUFnZW50KTsKK30KKworLy8gVE9ETyhkaWdpdCk6IFJlbW92ZSBvbmNlIFFFTVUyIHVzZXMgZW11bGF0b3JfaW5pdFVzZXJJbnRlcmZhY2UoKS4KK2Jvb2wKK3VpX2luaXQoY29uc3QgQUNvbmZpZyogc2tpbkNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciogICAgICAgc2tpblBhdGgsCisgICAgICAgIGNvbnN0IEFuZHJvaWRPcHRpb25zKiAgIG9wdHMsCisgICAgICAgIGNvbnN0IFVpRW11QWdlbnQqIHVpRW11QWdlbnQpCit7CisgICAgaW50ICB3aW5feCwgd2luX3k7CisKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyNpZm5kZWYgX1dJTjMyCisgICAgc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworI2VuZGlmCisKKyAgICBza2luX3dpbnN5c19zdGFydChvcHRzLT5ub193aW5kb3cpOworCisgICAgaWYgKG9wdHMtPm5vX3dpbmRvdykgeworI2lmbmRlZiBfV0lOMzIKKyAgICAgICAvKiBwcmV2ZW50IFNJR1RUSU4gYW5kIFNJR1RUT1VUIGZyb20gc3RvcHBpbmcgdXMuIHRoaXMgaXMgbmVjZXNzYXJ5IHRvIGJlCisgICAgICAgICogYWJsZSB0byBydW4gdGhlIGVtdWxhdG9yIGluIHRoZSBiYWNrZ3JvdW5kIChlLmcuICJlbXVsYXRvciAmIikuCisgICAgICAgICogZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZSBlbXVsYXRvciBzaG91bGQgbm90IGdyYWIgaW5wdXQgb3IgdHJ5IHRvCisgICAgICAgICogd3JpdGUgdG8gdGhlIG91dHB1dCBpbiBub3JtYWwgY2FzZXMsIHdlJ3JlIHN0b3BwZWQgb24gc29tZSBzeXN0ZW1zCisgICAgICAgICogKGUuZy4gT1MgWCkKKyAgICAgICAgKi8KKyAgICAgICAgc2lnbmFsKFNJR1RUSU4sIFNJR19JR04pOworICAgICAgICBzaWduYWwoU0lHVFRPVSwgU0lHX0lHTik7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOT1RFOiBPbiBXaW5kb3dzLCB0aGUgcHJvZ3JhbSBpY29uIGlzIGVtYmVkZGVkIGFzIGEgcmVzb3VyY2UgaW5zaWRlCisgICAgICAgIC8vICAgICAgIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCB0aGlzIG9ubHkgY2hhbmdlcyB0aGUgaWNvbiB0aGF0IGFwcGVhcnMKKyAgICAgICAgLy8gICAgICAgd2l0aCB0aGUgZXhlY3V0YWJsZSBpbiBhIGZpbGUgYnJvd3Nlci4gVG8gY2hhbmdlIHRoZSBpY29uIHRoYXQKKyAgICAgICAgLy8gICAgICAgYXBwZWFycyBib3RoIGluIHRoZSBhcHBsaWNhdGlvbiB0aXRsZSBiYXIgYW5kIHRoZSB0YXNrYmFyLCB0aGUKKyAgICAgICAgLy8gICAgICAgd2luZG93IGljb24gc3RpbGwgbXVzdCBiZSBzZXQuCisjICBpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfV0lOMzIpCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtJY29uRmlsZVtdID0gImVtdWxhdG9yX2ljb25fMjU2LnBuZyI7CisjICBlbHNlCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtJY29uRmlsZVtdID0gImVtdWxhdG9yX2ljb25fMTI4LnBuZyI7CisjICBlbmRpZgorICAgICAgICBzaXplX3QgaWNvbl9zaXplOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpY29uX2RhdGEgPQorICAgICAgICAgICAgICAgIGFuZHJvaWRfZW11bGF0b3JfaWNvbl9maW5kKGtJY29uRmlsZSwgJmljb25fc2l6ZSk7CisKKyAgICAgICAgaWYgKGljb25fZGF0YSkgeworICAgICAgICAgICAgc2tpbl93aW5zeXNfc2V0X3dpbmRvd19pY29uKGljb25fZGF0YSwgaWNvbl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlcnJvcigiQ291bGQgbm90IGZpbmQgZW11bGF0b3IgaWNvbiByZXNvdXJjZTogJXMiLCBrSWNvbkZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgdXNlcl9jb25maWdfZ2V0X3dpbmRvd19wb3MoJndpbl94LCAmd2luX3kpOworCisgICAgaWYgKGVtdWxhdG9yX3dpbmRvd19pbml0KGVtdWxhdG9yX3dpbmRvd19nZXQoKSwgc2tpbkNvbmZpZywgc2tpblBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl94LCB3aW5feSwgb3B0cywgdWlFbXVBZ2VudCkgPCAwKSB7CisgICAgICAgIGRlcnJvcigiQ291bGQgbm90IGxvYWQgZW11bGF0b3Igc2tpbiBmcm9tICclcyciLCBza2luUGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBhZGQgYW4gb25pb24gb3ZlcmxheSBpbWFnZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAob3B0cy0+b25pb24pIHsKKyAgICAgICAgU2tpbkltYWdlKiAgb25pb24gPSBza2luX2ltYWdlX2ZpbmRfc2ltcGxlKCBvcHRzLT5vbmlvbiApOworICAgICAgICBpbnQgICAgICAgICBhbHBoYSwgcm90YXRlOworCisgICAgICAgIGlmICggb3B0cy0+b25pb25fYWxwaGEgJiYgMSA9PSBzc2NhbmYoIG9wdHMtPm9uaW9uX2FscGhhLCAiJWQiLCAmYWxwaGEgKSApIHsKKyAgICAgICAgICAgIGFscGhhID0gKDI1NiphbHBoYSkvMTAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGFscGhhID0gMTI4OworCisgICAgICAgIGlmICggb3B0cy0+b25pb25fcm90YXRpb24gJiYgMSA9PSBzc2NhbmYoIG9wdHMtPm9uaW9uX3JvdGF0aW9uLCAiJWQiLCAmcm90YXRlICkgKSB7CisgICAgICAgICAgICByb3RhdGUgJj0gMzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByb3RhdGUgPSBTS0lOX1JPVEFUSU9OXzA7CisKKyAgICAgICAgZW11bGF0b3Jfd2luZG93X2dldCgpLT5vbmlvbiAgICAgICAgICA9IG9uaW9uOworICAgICAgICBlbXVsYXRvcl93aW5kb3dfZ2V0KCktPm9uaW9uX2FscGhhICAgID0gYWxwaGE7CisgICAgICAgIGVtdWxhdG9yX3dpbmRvd19nZXQoKS0+b25pb25fcm90YXRpb24gPSByb3RhdGU7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZW11bGF0b3JfZmluaVVzZXJJbnRlcmZhY2Uodm9pZCkgeworICAgIGlmIChzX3NraW5Db25maWcpIHsKKyAgICAgICAgYWNvbmZpZ19ub2RlX2ZyZWUoc19za2luQ29uZmlnKTsKKyAgICAgICAgZnJlZShzX3NraW5QYXRoKTsKKyAgICAgICAgc19za2luQ29uZmlnID0gTlVMTDsKKyAgICAgICAgc19za2luUGF0aCA9IE5VTEw7CisgICAgfQorCisgICAgdWlfZG9uZSgpOworfQorCisvLyBUT0RPKGRpZ2l0KTogUmVtb3ZlIG9uY2UgUUVNVTIgdXNlcyBlbXVsYXRvcl9maW5pVXNlckludGVyZmFjZSgpLgordm9pZCB1aV9kb25lKHZvaWQpCit7CisgICAgdXNlcl9jb25maWdfZG9uZSgpOworICAgIGVtdWxhdG9yX3dpbmRvd19kb25lKGVtdWxhdG9yX3dpbmRvd19nZXQoKSk7CisgICAgc2tpbl93aW5zeXNfZGVzdHJveSgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tY29tbW9uLXVpLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1jb21tb24tdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYxOTFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tY29tbW9uLXVpLmgKQEAgLTAsMCArMSw3MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9ody1jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC9pbmZvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jbWRsaW5lLW9wdGlvbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvdWktZW11LWFnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gSGFuZGxlIFVJLXJlbGF0ZWQgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIEFWRCBjb25maWd1cmF0aW9uLgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHVwZGF0ZSB0aGUgY29udGVudCBvZiB8aHd8IGJhc2VkIG9uIHRoZSB2YWx1ZXMKKy8vIGZvdW5kIGluIHxvcHRzfCBhbmQgfGF2ZHwsIHNvIGNhbGwgdGhpcyBiZWZvcmUgd3JpdGluZyBoYXJkd2FyZS1xZW11LmltZworLy8gdG8gZGlzay4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBlbXVsYXRvcl9wYXJzZVVpQ29tbWFuZExpbmVPcHRpb25zKEFuZHJvaWRPcHRpb25zKiBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm8qIGF2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkSHdDb25maWcqIGh3KTsKKworLy8gSW5pdGlhbGl6ZSB1c2VyIGludGVyZmFjZS4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KK2Jvb2wgZW11bGF0b3JfaW5pdFVzZXJJbnRlcmZhY2UoY29uc3QgQW5kcm9pZE9wdGlvbnMqIG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVpRW11QWdlbnQqIHVpRW11QWdlbnQpOworCisvLyBGaW5hbGl6ZSB0aGUgdXNlciBpbnRlcmZhY2UuIENhbGwgdGhpcyBvbiBleGl0Lgordm9pZCBlbXVsYXRvcl9maW5pVXNlckludGVyZmFjZSh2b2lkKTsKKworLy8gVE9ETyhkaWdpdCk6IFJlbW92ZSB0aGUgZGVwcmVjYXRlZCBkZWNsYXJhdGlvbnMgYmVsb3cgb25jZSBRRU1VMiBoYXMgYmVlbgorLy8gICAgICAgICAgICAgIHBvcnRlZCB0byB1c2UgZW11bGF0b3JfcGFyc2VVaUNvbW1hbmRMaW5lT3B0aW9ucygpIGFuZAorLy8gICAgICAgICAgICAgIGVtdWxhdG9yX2luaXRVc2VySW50ZXJmYWNlKCkKKworLyoqIEVtdWxhdG9yIHVzZXIgY29uZmlndXJhdGlvbiAoZS5nLiBsYXN0IHdpbmRvdyBwb3NpdGlvbikKKyAqKi8KKworYm9vbCB1c2VyX2NvbmZpZ19pbml0KCB2b2lkICk7Cit2b2lkIHVzZXJfY29uZmlnX2RvbmUoIHZvaWQgKTsKKwordm9pZCB1c2VyX2NvbmZpZ19nZXRfd2luZG93X3BvcyggaW50ICp3aW5kb3dfeCwgaW50ICp3aW5kb3dfeSApOworCisvKiBGaW5kIHRoZSBza2luIGNvcnJlc3BvbmRpbmcgdG8gb3VyIG9wdGlvbnMsIGFuZCByZXR1cm4gYW4gQUNvbmZpZyBwb2ludGVyCisgKiBhbmQgdGhlIGJhc2UgcGF0aCB0byBsb2FkIHNraW4gZGF0YSBmcm9tCisgKi8KK3ZvaWQgcGFyc2Vfc2tpbl9maWxlcyhjb25zdCBjaGFyKiAgICAgIHNraW5EaXJQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgc2tpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE9wdGlvbnMqICBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRId0NvbmZpZyogaHdDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgQUNvbmZpZyogICAgICAgICpza2luQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgICAqc2tpblBhdGgpOworCitib29sIHVpX2luaXQoY29uc3QgQUNvbmZpZyogICAgc2tpbkNvbmZpZywKKyAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBza2luUGF0aCwKKyAgICAgICAgICAgICBjb25zdCBBbmRyb2lkT3B0aW9ucyogb3B0cywKKyAgICAgICAgICAgICBjb25zdCBVaUVtdUFnZW50KiB1aUVtdUFnZW50KTsKKwordm9pZCB1aV9kb25lKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWNvbW1vbi5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjY2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWNvbW1vbi5jCkBAIC0wLDAgKzEsMTc3MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1jb21tb24uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2luZm8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC91dGlsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLWxpc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV91bml4LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2tlcm5lbC9rZXJuZWxfdXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2hlbHAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21haW4tZW11Z2wuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21haW4taGVscC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9jb250cm9sLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9yZXNvdXJjZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc25hcHNob3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VzZXItY29uZmlnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Rucy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJhbGxvYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy94ODZfY3B1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3ZlcnNpb24uaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK2NvbnN0IGNoYXIqICBhbmRyb2lkX3NraW5fbmV0X3NwZWVkID0gTlVMTDsKK2NvbnN0IGNoYXIqICBhbmRyb2lkX3NraW5fbmV0X2RlbGF5ID0gTlVMTDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgICAgICAgVSBUIEkgTCBJIFQgWSAgIFIgTyBVIFQgSSBOIEUgUyAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lICBEKC4uLikgIGRvIHsgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSBkcHJpbnQoX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCisvLyBUT0RPKGRpZ2l0KTogUmVtb3ZlIHRoaXMhCisvLyBUaGUgcGxhbiBpcyB0byBtb3ZlIHRoZSAtd2lwZS1kYXRhIGFuZCAtd3JpdGFibGUtc3lzdGVtIGZlYXR1cmUgdG8gdGhlCisvLyB0b3AtbGV2ZWwgJ2VtdWxhdG9yJyBsYXVuY2hlciBwcm9ncmFtLCBzbyB0aGF0IHRoZSBlbmdpbmVzIGRvbid0IGhhdmUKKy8vIHRvIG1lZGRsZSB3aXRoIHBhcnRpdGlvbiBpbWFnZXMsIGV4Y2VwdCBmb3IgbW91bnRpbmcgdGhlbS4gVGhlIGFsdGVybmF0aXZlCisvLyBpcyB0byBhZGQgbmV3IFFFTVUxIGFuZCBRRU1VMiBvcHRpb25zIHRvIHBhc3MgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZ3MsCisvLyB3aGljaCBpcyBvdmVya2lsbCwgZ2l2ZW4gdGhpcyBwbGFuLgorYm9vbCBhbmRyb2lkX29wX3dpcGVfZGF0YSA9IGZhbHNlOworYm9vbCBhbmRyb2lkX29wX3dyaXRhYmxlX3N5c3RlbSA9IGZhbHNlOworY29uc3QgY2hhciAqc2F2ZXZtX29uX2V4aXQgPSBOVUxMOworCitib29sIGVtdWxhdG9yX2hhc19uZXR3b3JrX29wdGlvbiA9IGZhbHNlOworCisjZGVmaW5lIE9ORV9NQiAoMTAyNCAqIDEwMjQpCisKK3Vuc2lnbmVkIGNvbnZlcnRCeXRlc1RvTUIoIHVpbnQ2NF90ICBzaXplICkKK3sKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNpemUgPSAoc2l6ZSArIE9ORV9NQi0xKSA+PiAyMDsKKyAgICBpZiAoc2l6ZSA+IFVJTlRfTUFYKQorICAgICAgICBzaXplID0gVUlOVF9NQVg7CisKKyAgICByZXR1cm4gKHVuc2lnbmVkKSBzaXplOworfQorCit1aW50NjRfdCBjb252ZXJ0TUJUb0J5dGVzKCB1bnNpZ25lZCAgbWVnYUJ5dGVzICkKK3sKKyAgICByZXR1cm4gKCh1aW50NjRfdCltZWdhQnl0ZXMgPDwgMjApOworfQorCisvKiBSZXR1cm4gdGhlIGZ1bGwgZmlsZSBwYXRoIG9mIHxmaWxlTmFtZXwgcmVsYXRpdmUgdG8gfHJvb3RQYXRofC4KKyAqIFJldHVybiBhIG5ldyBoZWFwLWFsbG9jYXRlZCBzdHJpbmcgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gTm90ZSB0aGF0CisgKiBpZiB8ZmlsZU5hbWV8IGlzIGFuIGFic29sdXRlIHBhdGgsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgY29weSBhbmQgaWdub3JlcworICogfHJvb3RQYXRofC4KKyAqLworc3RhdGljIGNoYXIqCitfZ2V0RnVsbEZpbGVQYXRoKGNvbnN0IGNoYXIqIHJvb3RQYXRoLCBjb25zdCBjaGFyKiBmaWxlTmFtZSkgeworICAgIGlmIChwYXRoX2lzX2Fic29sdXRlKGZpbGVOYW1lKSkgeworICAgICAgICByZXR1cm4gQVNUUkRVUChmaWxlTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKworICAgICAgICBwID0gYnVmcHJpbnQodGVtcCwgZW5kLCAiJXMvJXMiLCByb290UGF0aCwgZmlsZU5hbWUpOworICAgICAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBU1RSRFVQKHRlbXApOworICAgIH0KK30KKworc3RhdGljIHVpbnQ2NF90CitfYWRqdXN0UGFydGl0aW9uU2l6ZSggY29uc3QgY2hhciogIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgICBpbWFnZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgICBkZWZhdWx0Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGluQW5kcm9pZEJ1aWxkICkKK3sKKyAgICBjaGFyICAgICAgdGVtcFs2NF07CisgICAgdW5zaWduZWQgIGltYWdlTUI7CisgICAgdW5zaWduZWQgIGRlZmF1bHRNQjsKKworICAgIGlmIChpbWFnZUJ5dGVzIDw9IGRlZmF1bHRCeXRlcykKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRCeXRlczsKKworICAgIGltYWdlTUIgICA9IGNvbnZlcnRCeXRlc1RvTUIoaW1hZ2VCeXRlcyk7CisgICAgZGVmYXVsdE1CID0gY29udmVydEJ5dGVzVG9NQihkZWZhdWx0Qnl0ZXMpOworCisgICAgaWYgKGltYWdlTUIgPiBkZWZhdWx0TUIpIHsKKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIoJWQgTUIgPiAlZCBNQikiLCBpbWFnZU1CLCBkZWZhdWx0TUIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiKCUiIFBSSXU2NCAiICBieXRlcyA+ICUiIFBSSXU2NCAiIGJ5dGVzKSIsIGltYWdlQnl0ZXMsIGRlZmF1bHRCeXRlcyk7CisgICAgfQorCisgICAgaWYgKGluQW5kcm9pZEJ1aWxkKSB7CisgICAgICAgIGR3YXJuaW5nKCIlcyBwYXJ0aXRpb24gc2l6ZSBhZGp1c3RlZCB0byBtYXRjaCBpbWFnZSBmaWxlICVzXG4iLCBkZXNjcmlwdGlvbiwgdGVtcCk7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnZlcnRNQlRvQnl0ZXMoaW1hZ2VNQik7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBwZXJmb3JtIGF1dG8tZGV0ZWN0aW9uIG9mIHRoZQorICogc3lzdGVtIGRpcmVjdG9yeSBpbiB0aGUgY2FzZSBvZiBhIFNESyBpbnN0YWxsYXRpb24uCisgKgorICogd2Ugd2FudCB0byBkZWFsIHdpdGggc2V2ZXJhbCBoaXN0b3JpY2FsIHVzYWdlcywgaGVuY2UKKyAqIHRoZSBzbGlnaHRseSBjb21wbGljYXRlZCBsb2dpYy4KKyAqCisgKiBOT1RFOiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5CisgKiAgICAgICBjb250YWluaW5nICdmaWxlTmFtZScuIHRoaXMgaXMgKm5vdCogdGhlIGZ1bGwKKyAqICAgICAgIHBhdGggdG8gJ2ZpbGVOYW1lJy4KKyAqLworc3RhdGljIGNoYXIqCitfZ2V0U2RrSW1hZ2VQYXRoKCBjb25zdCBjaGFyKiAgZmlsZU5hbWUgKQoreworICAgIGNoYXIgICB0ZW1wW01BWF9QQVRIXTsKKyAgICBjaGFyKiAgcCAgID0gdGVtcDsKKyAgICBjaGFyKiAgZW5kID0gcCArIHNpemVvZih0ZW1wKTsKKyAgICBjaGFyKiAgcTsKKyAgICBjaGFyKiAgYXBwOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0ICBzZWFyY2hQYXRoc1tdID0geworICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJvZ3JhbSdzIGRpcmVjdG9yeSAqLworICAgICAgICAiL2xpYi9pbWFnZXMiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBmb3IgU0RLIDEuMCAqLworICAgICAgICAiLy4uL3BsYXRmb3Jtcy9hbmRyb2lkLTEuMS9pbWFnZXMiLCAgLyogdGhpcyBpcyBmb3IgU0RLIDEuMSAqLworICAgICAgICBOVUxMCisgICAgfTsKKworICAgIGFwcCA9IGJ1ZnByaW50X2FwcF9kaXIodGVtcCwgZW5kKTsKKyAgICBpZiAoYXBwID49IGVuZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBkbyB7CisgICAgICAgIGludCAgbm47CisKKyAgICAgICAgLyogZmlyc3Qgc2VhcmNoIGEgZmV3IHdlbGwta25vd24gcGF0aHMgKi8KKyAgICAgICAgZm9yIChubiA9IDA7IHNlYXJjaFBhdGhzW25uXSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgICAgICBwID0gYnVmcHJpbnQoYXBwLCBlbmQsICIlcyIsIHNlYXJjaFBhdGhzW25uXSk7CisgICAgICAgICAgICBxID0gYnVmcHJpbnQocCwgZW5kLCAiLyVzIiwgZmlsZU5hbWUpOworICAgICAgICAgICAgaWYgKHEgPCBlbmQgJiYgcGF0aF9leGlzdHModGVtcCkpIHsKKyAgICAgICAgICAgICAgICAqcCA9IDA7CisgICAgICAgICAgICAgICAgZ290byBGT1VORF9JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGhtbW0uIGxldCdzIGFzc3VtZSB0aGF0IHdlIGFyZSBpbiBhIHBvc3QtMS4xIFNESworICAgICAgICAgKiBzY2FuIC4uL3BsYXRmb3JtcyBpZiBpdCBleGlzdHMKKyAgICAgICAgICovCisgICAgICAgIHAgPSBidWZwcmludChhcHAsIGVuZCwgIi8uLi9wbGF0Zm9ybXMiKTsKKyAgICAgICAgaWYgKHAgPCBlbmQpIHsKKyAgICAgICAgICAgIERpclNjYW5uZXIqICBzY2FubmVyID0gZGlyU2Nhbm5lcl9uZXcodGVtcCk7CisgICAgICAgICAgICBpZiAoc2Nhbm5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIGZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3ViZGlyOworCisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBzdWJkaXIgPSBkaXJTY2FubmVyX25leHQoc2Nhbm5lcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3ViZGlyKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBxID0gYnVmcHJpbnQocCwgZW5kLCAiLyVzL2ltYWdlcy8lcyIsIHN1YmRpciwgZmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocSA+PSBlbmQgfHwgIXBhdGhfZXhpc3RzKHRlbXApKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiLyVzL2ltYWdlcyIsIHN1YmRpcik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkaXJTY2FubmVyX2ZyZWUoc2Nhbm5lcik7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEknbSBvdXQgb2YgaWRlYXMgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB9IHdoaWxlICgwKTsKKworRk9VTkRfSVQ6CisgICAgLy9EKCJpbWFnZSBhdXRvLWRldGVjdGlvbjogJXMvJXMiLCB0ZW1wLCBmaWxlTmFtZSk7CisgICAgcmV0dXJuIGFuZHJvaWRfc3RyZHVwKHRlbXApOworfQorCitzdGF0aWMgY2hhcioKK19nZXRTZGtJbWFnZSggY29uc3QgY2hhciogIHBhdGgsIGNvbnN0IGNoYXIqICBmaWxlICkKK3sKKyAgICBjaGFyICB0ZW1wW01BWF9QQVRIXTsKKyAgICBjaGFyICAqcCA9IHRlbXAsICplbmQgPSBwICsgc2l6ZW9mKHRlbXApOworCisgICAgcCA9IGJ1ZnByaW50KHRlbXAsIGVuZCwgIiVzLyVzIiwgcGF0aCwgZmlsZSk7CisgICAgaWYgKHAgPj0gZW5kIHx8ICFwYXRoX2V4aXN0cyh0ZW1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gYW5kcm9pZF9zdHJkdXAodGVtcCk7Cit9CisKK3N0YXRpYyBjaGFyKgorX2dldFNka1N5c3RlbUltYWdlKCBjb25zdCBjaGFyKiAgcGF0aCwgY29uc3QgY2hhciogIG9wdGlvbk5hbWUsIGNvbnN0IGNoYXIqICBmaWxlICkKK3sKKyAgICBjaGFyKiAgaW1hZ2UgPSBfZ2V0U2RrSW1hZ2UocGF0aCwgZmlsZSk7CisKKyAgICBpZiAoaW1hZ2UgPT0gTlVMTCkgeworICAgICAgICBkZXJyb3IoIllvdXIgc3lzdGVtIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHRoZSAnJXMnIGltYWdlIGZpbGUuXG4iCisgICAgICAgICAgICAgICAiUGxlYXNlIHNwZWNpZnkgb25lIHdpdGggdGhlICclcyA8ZmlsZXBhdGg+JyBvcHRpb24iLAorICAgICAgICAgICAgICAgZmlsZSwgb3B0aW9uTmFtZSk7CisgICAgICAgIGV4aXQoMik7CisgICAgfQorICAgIHJldHVybiBpbWFnZTsKK30KKworc3RhdGljIHZvaWQgc2FuaXRpemVPcHRpb25zKEFuZHJvaWRPcHRpb25zKiBvcHRzKSB7CisgICAgLyogbGVnYWN5IHN1cHBvcnQ6IHdlIHVzZWQgdG8gdXNlIC1zeXN0ZW0gPGRpcj4gYW5kIC1pbWFnZSA8ZmlsZT4KKyAgICAgKiBpbnN0ZWFkIG9mIC1zeXNkaXIgPGRpcj4gYW5kIC1zeXN0ZW0gPGZpbGU+LCBzbyBoYW5kbGUgdGhpcyBieSBjaGVja2luZworICAgICAqIHdoZXRoZXIgdGhlIG9wdGlvbnMgcG9pbnQgdG8gZGlyZWN0b3JpZXMgb3IgZmlsZXMuCisgICAgICovCisgICAgaWYgKG9wdHMtPmltYWdlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG9wdHMtPnN5c3RlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAob3B0cy0+c3lzZGlyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoICJZb3UgY2FuJ3QgdXNlIC1zeXNkaXIsIC1zeXN0ZW0gYW5kIC1pbWFnZSBhdCB0aGUgc2FtZSB0aW1lLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIllvdSBzaG91bGQgcHJvYmFibHkgdXNlICctc3lzZGlyIDxwYXRoPiAtc3lzdGVtIDxmaWxlPicuXG4iICk7CisgICAgICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkd2FybmluZyggIlBsZWFzZSBub3RlIHRoYXQgLWltYWdlIGlzIG9ic29sZXRlIGFuZCB0aGF0IC1zeXN0ZW0gaXMgbm93IHVzZWQgdG8gcG9pbnRcbiIKKyAgICAgICAgICAgICAgICAgICJ0byB0aGUgc3lzdGVtIGltYWdlLiBOZXh0IHRpbWUsIHRyeSB1c2luZyAnLXN5c2RpciA8cGF0aD4gLXN5c3RlbSA8ZmlsZT4nIGluc3RlYWQuXG4iICk7CisgICAgICAgIHN0cl9yZXNldCgmb3B0cy0+c3lzZGlyLCBvcHRzLT5zeXN0ZW0pOworICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnN5c3RlbSwgb3B0cy0+aW1hZ2UpOworICAgICAgICBzdHJfcmVzZXRfbnVsbCgmb3B0cy0+aW1hZ2UpOworICAgIH0KKyAgICBlbHNlIGlmIChvcHRzLT5zeXN0ZW0gIT0gTlVMTCAmJiBwYXRoX2lzX2RpcihvcHRzLT5zeXN0ZW0pKSB7CisgICAgICAgIGlmIChvcHRzLT5zeXNkaXIgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVycm9yKCAiT3B0aW9uIC1zeXN0ZW0gc2hvdWxkIG5vdyBiZSBmb2xsb3dlZCBieSBhIGZpbGUgcGF0aCwgbm90IGEgZGlyZWN0b3J5IG9uZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgJy1zeXNkaXIgPHBhdGg+JyB0byBwb2ludCB0byB0aGUgc3lzdGVtIGRpcmVjdG9yeS5cbiIgKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgZHdhcm5pbmcoICJQbGVhc2Ugbm90ZSB0aGF0IHRoZSAtc3lzdGVtIG9wdGlvbiBzaG91bGQgbm93IGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGluaXRpYWxcbiIKKyAgICAgICAgICAgICAgICAgICJzeXN0ZW0gaW1hZ2UgKGxpa2UgdGhlIG9ic29sZXRlIC1pbWFnZSBvcHRpb24pLiBUbyBwb2ludCB0byB0aGUgc3lzdGVtIGRpcmVjdG9yeVxuIgorICAgICAgICAgICAgICAgICAgInBsZWFzZSBub3cgdXNlICctc3lzZGlyIDxwYXRoPicgaW5zdGVhZC5cbiIgKTsKKworICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnN5c2Rpciwgb3B0cy0+c3lzdGVtKTsKKyAgICAgICAgc3RyX3Jlc2V0X251bGwoJm9wdHMtPnN5c3RlbSk7CisgICAgfQorCisgICAgaWYgKG9wdHMtPm5vam5pKSB7CisgICAgICAgIG9wdHMtPm5vX2puaSA9IG9wdHMtPm5vam5pOworICAgICAgICBvcHRzLT5ub2puaSAgPSAwOworICAgIH0KKworICAgIGlmIChvcHRzLT5ub2NhY2hlKSB7CisgICAgICAgIG9wdHMtPm5vX2NhY2hlID0gb3B0cy0+bm9jYWNoZTsKKyAgICAgICAgb3B0cy0+bm9jYWNoZSAgPSAwOworICAgIH0KKworICAgIGlmIChvcHRzLT5ub2F1ZGlvKSB7CisgICAgICAgIG9wdHMtPm5vX2F1ZGlvID0gb3B0cy0+bm9hdWRpbzsKKyAgICAgICAgb3B0cy0+bm9hdWRpbyAgPSAwOworICAgIH0KKworICAgIGlmIChvcHRzLT5ub3NraW4pIHsKKyAgICAgICAgb3B0cy0+bm9fc2tpbiA9IG9wdHMtPm5vc2tpbjsKKyAgICAgICAgb3B0cy0+bm9za2luICA9IDA7CisgICAgfQorCisgICAgLyogSWYgLW5vLWNhY2hlIGlzIHVzZWQsIGlnbm9yZSBhbnkgLWNhY2hlIGFyZ3VtZW50ICovCisgICAgaWYgKG9wdHMtPm5vX2NhY2hlKSB7CisgICAgICAgIHN0cl9yZXNldF9udWxsKCZvcHRzLT5jYWNoZSk7CisgICAgfQorCisgICAgLyogdGhlIHB1cnBvc2Ugb2YgLW5vLWF1ZGlvIGlzIHRvIGRpc2FibGUgc291bmQgb3V0cHV0IGZyb20gdGhlIGVtdWxhdG9yLAorICAgICAqIG5vdCB0byBkaXNhYmxlIEF1ZGlvIGVtdWxhdGlvbi4gU28gc2ltcGx5IGZvcmNlIHRoZSAnbm9uZScgYmFja2VuZHMgKi8KKyAgICBpZiAob3B0cy0+bm9fYXVkaW8pIHsKKyAgICAgICAgc3RyX3Jlc2V0KCZvcHRzLT5hdWRpbywgIm5vbmUiKTsKKyAgICB9CisKKyAgICAvKiB3aXRob3V0IGEgc2tpbiwgdGhlIGVtdWxhdG9yIGNhbm5vdCBrbm93IHdoYXQgc2NyZWVuIGRpbWVuc2lvbnMgYXJlCisgICAgICogYXBwcm9yaWF0ZSBmb3IgdGhlIHZpcnR1YWwgZGV2aWNlLCB3aGljaCBjYW4gcmVzdWx0IGluIGltcHJvcGVyCisgICAgICogcmVuZGVyaW5nLiB3aGVuIGNyZWF0aW5nIGEgZGV2aWNlIHRocm91Z2ggdGhlIEFWRCBtYW5hZ2VyLCBhICJtYWdpYyIKKyAgICAgKiBza2luIHdpbGwgYmUgY3JlYXRlZCB0aGF0IHdpbGwgaW5kaWNhdGUgd2hhdCB0aGUgYXBwcm9wcmlhdGUgc2NyZWVuCisgICAgICogZGltZW5zaW9ucyBhcmUuIHNraW5zIGxpa2UgdGhpcyBoYXZlIGEgbmFtZSA8d2lkdGg+eDxoZWlnaHQ+LCBpbmRpY2F0aW5nCisgICAgICogdGhlIGFwcHJvcHJpYXRlIGZyYW1lYnVmZmVyIHNpemUgZm9yIHRoZSBkZXZpY2UuCisgICAgICovCisgICAgaWYgKG9wdHMtPm5vX3NraW4pIHsKKyAgICAgICAgZHdhcm5pbmcoCisgICAgICAgICAgICAgICAgInRoZSAtbm8tc2tpbiBmbGFnIGlzIG9ic29sZXRlLiB0byBoYXZlIGEgbm9uLXNraW5uZWQgdmlydHVhbCAiCisgICAgICAgICAgICAgICAgImRldmljZSwgY3JlYXRlIG9uZSB0aHJvdWdoIHRoZSBBVkQgbWFuYWdlciIpOworICAgIH0KKworICAgIC8qIHdlIGRvbid0IGFjY2VwdCAtc2tpbmRpciB3aXRob3V0IC1za2luIG5vdworICAgICAqIHRvIHNpbXBsaWZ5IHRoZSBhdXRvY29uZmlnIHN0dWZmIHdpdGggdmlydHVhbCBkZXZpY2VzCisgICAgICovCisgICAgaWYgKG9wdHMtPnNraW5kaXIpIHsKKyAgICAgICAgaWYgKCFvcHRzLT5za2luKSB7CisgICAgICAgICAgICBkZXJyb3IoICJ0aGUgLXNraW5kaXIgPHBhdGg+IG9wdGlvbiByZXF1aXJlcyBhIC1za2luIDxuYW1lPiBvcHRpb24iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0cy0+Ym9vdGNoYXJ0KSB7CisgICAgICAgIGNoYXIqICBlbmQ7CisgICAgICAgIGludCB0aW1lb3V0ID0gc3RydG9sKG9wdHMtPmJvb3RjaGFydCwgJmVuZCwgMTApOworICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7CisgICAgICAgICAgICBzdHJfcmVzZXRfbnVsbCgmb3B0cy0+Ym9vdGNoYXJ0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1lb3V0IDwgMCB8fCB0aW1lb3V0ID4gMTUgKiA2MCkgeworICAgICAgICAgICAgZGVycm9yKCAidGltZW91dCBzcGVjaWZpZWQgZm9yIC1ib290Y2hhcnQgb3B0aW9uIGlzIGludmFsaWQuXG4iCisgICAgICAgICAgICAgICAgICAgICJwbGVhc2UgdXNlIGludGVnZXJzIGJldHdlZW4gMSBhbmQgOTAwXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBBdmRJbmZvKiBjcmVhdGVBVkQoQW5kcm9pZE9wdGlvbnMqIG9wdHMsIGludCogaW5BbmRyb2lkQnVpbGQpIHsKKyAgICBBdmRJbmZvKiByZXQgPSBOVUxMOworICAgIGNoYXIgICB0bXBbTUFYX1BBVEhdOworICAgIGNoYXIqICB0bXBlbmQgPSB0bXAgKyBzaXplb2YodG1wKTsKKyAgICBjaGFyKiAgYW5kcm9pZF9idWlsZF9yb290ID0gTlVMTDsKKyAgICBjaGFyKiAgYW5kcm9pZF9idWlsZF9vdXQgID0gTlVMTDsKKworICAgIC8qIElmIG5vIEFWRCBuYW1lIHdhcyBnaXZlbiwgdHJ5IHRvIGZpbmQgdGhlIHRvcCBvZiB0aGUKKyAgICAgKiBBbmRyb2lkIGJ1aWxkIHRyZWUKKyAgICAgKi8KKyAgICBpZiAob3B0cy0+YXZkID09IE5VTEwpIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgY2hhciogIG91dCA9IGdldGVudigiQU5EUk9JRF9QUk9EVUNUX09VVCIpOworCisgICAgICAgICAgICBpZiAob3V0ID09IE5VTEwgfHwgb3V0WzBdID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmICghcGF0aF9leGlzdHMob3V0KSkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiQ2FuJ3QgYWNjZXNzIEFORFJPSURfUFJPRFVDVF9PVVQgYXMgJyVzJ1xuIgorICAgICAgICAgICAgICAgICAgICAiWW91IG5lZWQgdG8gYnVpbGQgdGhlIEFuZHJvaWQgc3lzdGVtIGJlZm9yZSBsYXVuY2hpbmcgdGhlIGVtdWxhdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgb3V0KTsKKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhbmRyb2lkX2J1aWxkX3Jvb3QgPSBnZXRlbnYoIkFORFJPSURfQlVJTERfVE9QIik7CisgICAgICAgICAgICBpZiAoYW5kcm9pZF9idWlsZF9yb290ID09IE5VTEwgfHwgYW5kcm9pZF9idWlsZF9yb290WzBdID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmICghcGF0aF9leGlzdHMoYW5kcm9pZF9idWlsZF9yb290KSkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiQ2FuJ3QgZmluZCB0aGUgQW5kcm9pZCBidWlsZCByb290ICclcydcbiIKKyAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgQU5EUk9JRF9CVUlMRF9UT1AgdmFyaWFibGUuXG4iCisgICAgICAgICAgICAgICAgICAgICJJdCBzaG91bGQgcG9pbnQgdG8gdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgdHJlZS5cbiIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfYnVpbGRfcm9vdCApOworICAgICAgICAgICAgICAgIGV4aXQoMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbmRyb2lkX2J1aWxkX291dCA9IG91dDsKKyAgICAgICAgICAgIEQoICJmb3VuZCBBbmRyb2lkIGJ1aWxkIHJvb3Q6ICVzIiwgYW5kcm9pZF9idWlsZF9yb290ICk7CisgICAgICAgICAgICBEKCAiZm91bmQgQW5kcm9pZCBidWlsZCBvdXQ6ICAlcyIsIGFuZHJvaWRfYnVpbGRfb3V0ICk7CisgICAgICAgIH0gd2hpbGUgKDApOworICAgIH0KKyAgICAvKiBpZiBubyB2aXJ0dWFsIGRldmljZSBuYW1lIGlzIGdpdmVuLCBhbmQgd2UncmUgbm90IGluIHRoZQorICAgICAqIEFuZHJvaWQgYnVpbGQgc3lzdGVtLCB3ZSdsbCBuZWVkIHRvIHBlcmZvcm0gc29tZSBhdXRvLWRldGVjdGlvbgorICAgICAqIG1hZ2ljIDotKQorICAgICAqLworICAgIGlmIChvcHRzLT5hdmQgPT0gTlVMTCAmJiAhYW5kcm9pZF9idWlsZF9vdXQpCisgICAgeworICAgICAgICBpZiAoIW9wdHMtPnN5c2RpcikgeworICAgICAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmb3B0cy0+c3lzZGlyLCBfZ2V0U2RrSW1hZ2VQYXRoKCJzeXN0ZW0uaW1nIikpOworICAgICAgICAgICAgaWYgKCFvcHRzLT5zeXNkaXIpIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoCisgICAgICAgICAgICAgICAgIllvdSBkaWQgbm90IHNwZWNpZnkgYSB2aXJ0dWFsIGRldmljZSBuYW1lLCBhbmQgdGhlIHN5c3RlbVxuIgorICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgY291bGQgbm90IGJlIGZvdW5kLlxuXG4iCisgICAgICAgICAgICAgICAgIklmIHlvdSBhcmUgYW4gQW5kcm9pZCBTREsgdXNlciwgcGxlYXNlIHVzZSAnQDxuYW1lPicgb3IgJy1hdmQgPG5hbWU+J1xuIgorICAgICAgICAgICAgICAgICJ0byBzdGFydCBhIGdpdmVuIHZpcnR1YWwgZGV2aWNlICh1c2UgLWxpc3QtYXZkcyB0byBwcmludCBhdmFpbGFibGUgb25lcykuXG5cbiIKKworICAgICAgICAgICAgICAgICJPdGhlcndpc2UsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIC1oZWxwLWRpc2staW1hZ2VzIHRvIHN0YXJ0IHRoZSBlbXVsYXRvclxuIgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEQoImF1dG9jb25maWc6IC1zeXNkaXIgJXMiLCBvcHRzLT5zeXNkaXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcHRzLT5zeXN0ZW0pIHsKKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoCisgICAgICAgICAgICAgICAgICAgICZvcHRzLT5zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgIF9nZXRTZGtTeXN0ZW1JbWFnZShvcHRzLT5zeXNkaXIsICItaW1hZ2UiLCAic3lzdGVtLmltZyIpKTsKKyAgICAgICAgICAgIEQoImF1dG9jb25maWc6IC1zeXN0ZW0gJXMiLCBvcHRzLT5zeXN0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcHRzLT5rZXJuZWwpIHsKKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoCisgICAgICAgICAgICAgICAgICAgICZvcHRzLT5rZXJuZWwsCisgICAgICAgICAgICAgICAgICAgIF9nZXRTZGtTeXN0ZW1JbWFnZShvcHRzLT5zeXNkaXIsICIta2VybmVsIiwgImtlcm5lbC1xZW11IikpOworICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLWtlcm5lbCAlcyIsIG9wdHMtPmtlcm5lbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9wdHMtPnJhbWRpc2spIHsKKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoJm9wdHMtPnJhbWRpc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRTZGtTeXN0ZW1JbWFnZShvcHRzLT5zeXNkaXIsICItcmFtZGlzayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFtZGlzay5pbWciKSk7CisgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtcmFtZGlzayAlcyIsIG9wdHMtPnJhbWRpc2spOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgbm8gZGF0YSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCB1c2UgdGhlIHN5c3RlbSBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKCFvcHRzLT5kYXRhZGlyKSB7CisgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPmRhdGFkaXIsIG9wdHMtPnN5c2Rpcik7CisgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtZGF0YWRpciAlcyIsIG9wdHMtPnN5c2Rpcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9wdHMtPmRhdGEpIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciB1c2VyZGF0YS1xZW11LmltZyBpbiB0aGUgZGF0YSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGJ1ZnByaW50KHRtcCwgdG1wZW5kLCAiJXMvdXNlcmRhdGEtcWVtdS5pbWciLCBvcHRzLT5kYXRhZGlyKTsKKyAgICAgICAgICAgIGlmICghcGF0aF9leGlzdHModG1wKSkgeworICAgICAgICAgICAgICAgIGRlcnJvcigKKyAgICAgICAgICAgICAgICAiWW91IGRpZCBub3QgcHJvdmlkZSB0aGUgbmFtZSBvZiBhbiBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlXG4iCisgICAgICAgICAgICAgICAgIndpdGggdGhlICctYXZkIDxuYW1lPicgb3B0aW9uLiBSZWFkIC1oZWxwLWF2ZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuIgorCisgICAgICAgICAgICAgICAgIklmIHlvdSAqcmVhbGx5KiB3YW50IHRvICpOT1QqIHJ1biBhbiBBVkQsIGNvbnNpZGVyIHVzaW5nICctZGF0YSA8ZmlsZT4nXG4iCisgICAgICAgICAgICAgICAgInRvIHNwZWNpZnkgYSBkYXRhIHBhcnRpdGlvbiBpbWFnZSBmaWxlIChJIGhvcGUgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcpLlxuIgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZXhpdCgyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyX3Jlc2V0KCZvcHRzLT5kYXRhLCB0bXApOworICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLWRhdGEgJXMiLCBvcHRzLT5kYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb3B0cy0+c25hcHN0b3JhZ2UgJiYgb3B0cy0+ZGF0YWRpcikgeworICAgICAgICAgICAgYnVmcHJpbnQodG1wLCB0bXBlbmQsICIlcy9zbmFwc2hvdHMuaW1nIiwgb3B0cy0+ZGF0YWRpcik7CisgICAgICAgICAgICBpZiAocGF0aF9leGlzdHModG1wKSkgeworICAgICAgICAgICAgICAgIHN0cl9yZXNldCgmb3B0cy0+c25hcHN0b3JhZ2UsIHRtcCk7CisgICAgICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLXNuYXBzdG9yYWdlICVzIiwgb3B0cy0+c25hcHN0b3JhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc2V0dXAgdGhlIHZpcnR1YWwgZGV2aWNlIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyCisgICAgICogd2UgYXJlIGluIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSBvciBub3QKKyAgICAgKi8KKyAgICBpZiAob3B0cy0+YXZkICE9IE5VTEwpCisgICAgeworICAgICAgICByZXQgPSBhdmRJbmZvX25ldyggb3B0cy0+YXZkLCBhbmRyb2lkX2F2ZFBhcmFtcyApOworICAgICAgICBpZiAocmV0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIGFuIGVycm9yIG1lc3NhZ2UgaGFzIGFscmVhZHkgYmVlbiBwcmludGVkICovCisgICAgICAgICAgICBkcHJpbnQoImNvdWxkIG5vdCBmaW5kIHZpcnR1YWwgZGV2aWNlIG5hbWVkICclcyciLCBvcHRzLT5hdmQpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIWFuZHJvaWRfYnVpbGRfb3V0KSB7CisgICAgICAgICAgICBhbmRyb2lkX2J1aWxkX291dCA9IGFuZHJvaWRfYnVpbGRfcm9vdCA9IG9wdHMtPnN5c2RpcjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdmRJbmZvX25ld0ZvckFuZHJvaWRCdWlsZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2J1aWxkX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9idWlsZF9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9hdmRQYXJhbXMgKTsKKworICAgICAgICBpZihyZXQgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiY291bGQgbm90IHN0YXJ0IHZpcnR1YWwgZGV2aWNlXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYW5kcm9pZF9idWlsZF9vdXQpIHsKKyAgICAgICAgKmluQW5kcm9pZEJ1aWxkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5BbmRyb2lkQnVpbGQgPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoYW5kbGVDb21tb25FbXVsYXRvck9wdGlvbnMKKyAqCisgKiBzZXRzIHZhbHVlcyBpbiB8aHd8IGJhc2VkIG9uIG9wdGlvbnMgc2V0IGluIHxvcHRzfAorICoKKyAqIFNvbWUgdmFsdWVzIHRoYXQgbWF5IGJlIHNldDoKKyAqCisgKiBrZXJuZWxfcGF0aAorICogaHdfY3B1X21vZGVsCisgKiBrZXJuZWxfbmV3RGV2aWNlTmFtaW5nCisgKiBrZXJuZWxfc3VwcG9ydHNZYWZmczIKKyAqIGRpc2tfcmFtZGlza19wYXRoCisgKiBkaXNrX3N5c3RlbVBhcnRpdGlvbl9wYXRoCisgKiBkaXNrX3N5c3RlbVBhcnRpdGlvbl9pbml0UGF0aAorICogZGlza19kYXRhUGFydGl0aW9uX3NpemUKKyAqIGRpc2tfY2FjaGVQYXJ0aXRpb24KKyAqIGRpc2tfY2FjaGVQYXJ0aXRpb25fcGF0aAorICogZGlza19jYWNoZVBhcnRpdGlvbl9zaXplCisgKiBod19zZENhcmQKKyAqIGh3X3NkQ2FyZF9wYXRoCisgKiBod19yYW1TaXplCisgKi8KK3N0YXRpYyBib29sIGVtdWxhdG9yX2hhbmRsZUNvbW1vbkVtdWxhdG9yT3B0aW9ucyhBbmRyb2lkT3B0aW9ucyogb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkSHdDb25maWcqIGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm8qIGF2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3FlbXUyKSB7CisgICAgaW50IGZvcmNlQXJtdjcgPSAwOworCisgICAgLy8gS2VybmVsIG9wdGlvbnMKKyAgICB7CisgICAgICAgIGNoYXIqICBrZXJuZWxGaWxlICAgID0gb3B0cy0+a2VybmVsOworICAgICAgICBpbnQgICAga2VybmVsRmlsZUxlbjsKKworICAgICAgICBpZiAoa2VybmVsRmlsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBrZXJuZWxGaWxlID0gaXNfcWVtdTIgPworICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2dldFJhbmNodUtlcm5lbFBhdGgoYXZkKSA6CisgICAgICAgICAgICAgICAgICAgIGF2ZEluZm9fZ2V0S2VybmVsUGF0aChhdmQpOworICAgICAgICAgICAgaWYgKGtlcm5lbEZpbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiVGhpcyBBVkQncyBjb25maWd1cmF0aW9uIGlzIG1pc3NpbmcgYSBrZXJuZWwgZmlsZSEgIgorICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGVuc3VyZSB0aGUgZmlsZSBcIiVzXCIgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAiYXMgeW91ciBzeXN0ZW0gaW1hZ2UuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNfcWVtdTIgPyAia2VybmVsLXJhbmNodSIgOiAia2VybmVsLXFlbXUiKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZGtSb290RGlyID0gZ2V0ZW52KCJBTkRST0lEX1NES19ST09UIik7CisgICAgICAgICAgICAgICAgaWYgKHNka1Jvb3REaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVycm9yKCAiQU5EUk9JRF9TREtfUk9PVCBpcyBkZWZpbmVkICglcykgYnV0IGNhbm5vdCBmaW5kIGtlcm5lbCBmaWxlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiIFBBVEhfU0VQICJzeXN0ZW0taW1hZ2VzIiBQQVRIX1NFUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3ViIGRpcmVjdG9yaWVzIiwgc2RrUm9vdERpciwgc2RrUm9vdERpcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVycm9yKCAiQU5EUk9JRF9TREtfUk9PVCBpcyB1bmRlZmluZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLWtlcm5lbCAlcyIsIGtlcm5lbEZpbGUpOworICAgICAgICB9CisgICAgICAgIGlmICghcGF0aF9leGlzdHMoa2VybmVsRmlsZSkpIHsKKyAgICAgICAgICAgIGRlcnJvciggIkludmFsaWQgb3IgbWlzc2luZyBrZXJuZWwgaW1hZ2UgZmlsZTogJXMiLCBrZXJuZWxGaWxlICk7CisgICAgICAgICAgICBmcmVlKGtlcm5lbEZpbGUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmaHctPmtlcm5lbF9wYXRoLCBrZXJuZWxGaWxlKTsKKworICAgICAgICAvKiBJZiB0aGUga2VybmVsIGltYWdlIG5hbWUgZW5kcyBpbiAiLWFybXY3IiwgdGhlbiBjaGFuZ2UgdGhlIGNwdQorICAgICAgICAgKiB0eXBlIGF1dG9tYXRpY2FsbHkuIFRoaXMgaXMgYSBwb29yIG1hbidzIGFwcHJvYWNoIHRvIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogbWFuYWdlbWVudCwgYnV0IHNob3VsZCBhbGxvdyB1cyB0byBnZXQgcGFzdCBidWlsZGluZyBBUk12NworICAgICAgICAgKiBzeXN0ZW0gaW1hZ2VzIHdpdGggZGV4IHByZW9wdCBwYXNzIHdpdGhvdXQgaW50cm9kdWNpbmcgdG9vIG1hbnkKKyAgICAgICAgICogY2hhbmdlcyB0byB0aGUgZW11bGF0b3Igc291cmNlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogWFhYOgorICAgICAgICAgKiBBICdwcm9wZXInIGNoYW5nZSB3b3VsZCByZXF1aXJlIGFkZGluZyBzb21lIHNvcnQgb2YgaGFyZHdhcmUtcHJvcGVydHkKKyAgICAgICAgICogdG8gZWFjaCBBVkQgY29uZmlnIGZpbGUsIHRoZW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgaXRzIHZhbHVlIGZvcgorICAgICAgICAgKiBmdWxsIEFuZHJvaWQgYnVpbGRzIChkZXBlbmRpbmcgb24gc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZSksIHBsdXMKKyAgICAgICAgICogc29tZSBidWlsZCBzeXN0ZW0gY2hhbmdlcy4gSSBwcmVmZXIgbm90IHRvIGRvIHRoYXQgZm9yIG5vdyBmb3IgcmVhc29ucworICAgICAgICAgKiBvZiBzaW1wbGljaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgIGtlcm5lbEZpbGVMZW4gPSBzdHJsZW4oa2VybmVsRmlsZSk7CisgICAgICAgICBpZiAoa2VybmVsRmlsZUxlbiA+IDYgJiYgIW1lbWNtcChrZXJuZWxGaWxlICsga2VybmVsRmlsZUxlbiAtIDYsICItYXJtdjciLCA2KSkgeworICAgICAgICAgICAgIGZvcmNlQXJtdjcgPSAxOworICAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIHRoZSB0YXJnZXQgQUJJIGlzIGFybWVhYmktdjdhLCB3ZSBjYW4gYXV0by1kZXRlY3QgdGhlIGNwdSBtb2RlbAorICAgICAqIGFzIGEgY29ydGV4LWE4LCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IChhcm05MjYpIHdoaWNoIG9ubHkgZW11bGF0ZXMKKyAgICAgKiBhbiBBUk12NVRFIENQVS4KKyAgICAgKi8KKyAgICBpZiAoIWZvcmNlQXJtdjcgJiYgaHctPmh3X2NwdV9tb2RlbFswXSA9PSAnXDAnKQorICAgIHsKKyAgICAgICAgY2hhciogYWJpID0gYXZkSW5mb19nZXRUYXJnZXRBYmkoYXZkKTsKKyAgICAgICAgaWYgKGFiaSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhYmksICJhcm1lYWJpLXY3YSIpKSB7CisgICAgICAgICAgICAgICAgZm9yY2VBcm12NyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBRlJFRShhYmkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgJ3g4NicsIGVuc3VyZSB0aGF0IHRoZSAncWVtdTMyJworICAgICAqIENQVSBtb2RlbCBpcyB1c2VkLiBPdGhlcndpc2UsIHRoZSBkZWZhdWx0ICh3aGljaCBpcyBub3cgJ3FlbXU2NCcpCisgICAgICogd2lsbCByZXN1bHQgaW4gYSBmYWlsdXJlIHRvIGJvb3Qgd2l0aCBzb21lIGtlcm5lbHMgdW5kZXIKKyAgICAgKiB1bi1hY2NlbGVyYXRlZCBlbXVsYXRpb24uCisgICAgICovCisgICAgaWYgKGh3LT5od19jcHVfbW9kZWxbMF0gPT0gJ1wwJykgeworICAgICAgICBjaGFyKiBhcmNoID0gYXZkSW5mb19nZXRUYXJnZXRDcHVBcmNoKGF2ZCk7CisgICAgICAgIEQoIlRhcmdldCBhcmNoID0gJyVzJyIsIGFyY2ggPyBhcmNoIDogIk5VTEwiKTsKKyAgICAgICAgaWYgKGFyY2ggIT0gTlVMTCAmJiAhc3RyY21wKGFyY2gsICJ4ODYiKSkgeworICAgICAgICAgICAgc3RyX3Jlc2V0KCZody0+aHdfY3B1X21vZGVsLCAicWVtdTMyIik7CisgICAgICAgICAgICBEKCJBdXRvLWNvbmZpZzogLXFlbXUgLWNwdSAlcyIsIGh3LT5od19jcHVfbW9kZWwpOworICAgICAgICB9CisgICAgICAgIEFGUkVFKGFyY2gpOworICAgIH0KKworICAgIGlmIChmb3JjZUFybXY3ICE9IDApIHsKKyAgICAgICAgc3RyX3Jlc2V0KCZody0+aHdfY3B1X21vZGVsLCAiY29ydGV4LWE4Iik7CisgICAgICAgIEQoIkF1dG8tY29uZmlnOiAtcWVtdSAtY3B1ICVzIiwgaHctPmh3X2NwdV9tb2RlbCk7CisgICAgfQorCisgICAgY2hhciB2ZXJzaW9uU3RyaW5nWzI1Nl07CisgICAgaWYgKCFhbmRyb2lkX3BhdGhQcm9iZUtlcm5lbFZlcnNpb25TdHJpbmcoaHctPmtlcm5lbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZlcnNpb25TdHJpbmcpKSkgeworICAgICAgICBkZXJyb3IoIkNhbid0IGZpbmQgJ0xpbnV4IHZlcnNpb24gJyBzdHJpbmcgaW4ga2VybmVsIGltYWdlIGZpbGU6ICVzIiwKKyAgICAgICAgICAgICAgIGh3LT5rZXJuZWxfcGF0aCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBLZXJuZWxWZXJzaW9uIGtlcm5lbFZlcnNpb24gPSAwOworICAgIGlmICghYW5kcm9pZF9wYXJzZUxpbnV4VmVyc2lvblN0cmluZyh2ZXJzaW9uU3RyaW5nLCAma2VybmVsVmVyc2lvbikpIHsKKyAgICAgICAgZGVycm9yKCJDYW4ndCBwYXJzZSAnTGludXggdmVyc2lvbiAnIHN0cmluZyBpbiBrZXJuZWwgaW1hZ2UgZmlsZTogJyVzJyIsCisgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcHJvcGVyIGVuZ2luZSAocWVtdTEvcWVtdTIpIGZvciB0aGUga2VybmVsCisgICAgaWYgKGlzX3FlbXUyICYmIGtlcm5lbFZlcnNpb24gPCBLRVJORUxfVkVSU0lPTl8zXzEwXzApIHsKKyAgICAgICAgZGVycm9yKCJOZXcgZW11bGF0b3IgYmFja2VuZCByZXF1aXJlcyBtaW5pbXVtIGtlcm5lbCB2ZXJzaW9uIDMuMTArIChjdXJyZW50bHkgZ290IGxvd2VyKVxuIgorICAgICAgICAgICAgICAgIlBsZWFzZSBtYWtlIHN1cmUgeW91J3ZlIGdvdCB1cGRhdGVkIHN5c3RlbSBpbWFnZXMgYW5kIGRvIG5vdCBmb3JjZSB0aGUgc3BlY2lmaWMgIgorICAgICAgICAgICAgICAgImtlcm5lbCBpbWFnZSB0b2dldGhlciB3aXRoIHRoZSBlbmdpbmUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICghaXNfcWVtdTIgJiYga2VybmVsVmVyc2lvbiA+PSBLRVJORUxfVkVSU0lPTl8zXzEwXzApIHsKKyAgICAgICAgY2hhcioga2VybmVsX2ZpbGUgPSBwYXRoX2Jhc2VuYW1lKGh3LT5rZXJuZWxfcGF0aCk7CisgICAgICAgIGlmIChrZXJuZWxfZmlsZSAmJiAhc3RyY21wKGtlcm5lbF9maWxlLCAia2VybmVsLXJhbmNodSIpKSB7CisgICAgICAgICAgICBkZXJyb3IoIlRoaXMga2VybmVsIHJlcXVpcmVzIHRoZSBuZXcgZW11bGF0aW9uIGVuZ2luZVxuIgorICAgICAgICAgICAgICAgICAgICJQbGVhc2UgZG8gbm90IGZvcmNlIHRoZSBzcGVjaWZpYyBrZXJuZWwgaW1hZ2UgdG9nZXRoZXIgd2l0aCB0aGUgZW5naW5lIHZlcnNpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGtlcm5lbF9maWxlKTsKKyAgICB9CisKKyAgICAvLyBBdXRvLWRldGVjdCBrZXJuZWwgZGV2aWNlIG5hbWluZyBzY2hlbWUgaWYgbmVlZGVkLgorICAgIGlmIChhbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsRGV2aWNlTmFtaW5nKGh3KSA8IDApIHsKKyAgICAgICAgY29uc3QgY2hhciogbmV3RGV2aWNlTmFtaW5nID0gIm5vIjsKKyAgICAgICAgaWYgKGtlcm5lbFZlcnNpb24gPj0gS0VSTkVMX1ZFUlNJT05fM18xMF8wKSB7CisgICAgICAgICAgICBEKCJBdXRvLWRldGVjdDogS2VybmVsIGltYWdlIHJlcXVpcmVzIG5ldyBkZXZpY2UgbmFtaW5nIHNjaGVtZS4iKTsKKyAgICAgICAgICAgIG5ld0RldmljZU5hbWluZyA9ICJ5ZXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgiQXV0by1kZXRlY3Q6IEtlcm5lbCBpbWFnZSByZXF1aXJlcyBsZWdhY3kgZGV2aWNlIG5hbWluZyBzY2hlbWUuIik7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZody0+a2VybmVsX25ld0RldmljZU5hbWluZywgbmV3RGV2aWNlTmFtaW5nKTsKKyAgICB9CisKKyAgICAvLyBBdXRvLWRldGVjdCBZQUZGUzIgcGFydGl0aW9uIHN1cHBvcnQgaWYgbmVlZGVkLgorICAgIGlmIChhbmRyb2lkSHdDb25maWdfZ2V0S2VybmVsWWFmZnMyU3VwcG9ydChodykgPCAwKSB7CisgICAgICAgIC8vIEVzc2VudGlhbGx5LCBhbnl0aGluZyBiZWZvcmUgQVBJIGxldmVsIDIwIHN1cHBvcnRzIFlhZmZzMgorICAgICAgICBjb25zdCBjaGFyKiBuZXdZYWZmczJTdXBwb3J0ID0gIm5vIjsKKyAgICAgICAgaWYgKGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYXZkKSA8IDIwKSB7CisgICAgICAgICAgICBuZXdZYWZmczJTdXBwb3J0ID0gInllcyI7CisgICAgICAgICAgICBEKCJBdXRvLWRldGVjdDogS2VybmVsIGRvZXMgc3VwcG9ydCBZQUZGUzIgcGFydGl0aW9ucy4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEQoIkF1dG8tZGV0ZWN0OiBLZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBZQUZGUzIgcGFydGl0aW9ucy4iKTsKKyAgICAgICAgfQorICAgICAgICBzdHJfcmVzZXQoJmh3LT5rZXJuZWxfc3VwcG9ydHNZYWZmczIsIG5ld1lhZmZzMlN1cHBvcnQpOworICAgIH0KKworICAgIC8qIG9wdHMtPnJhbWRpc2sgaXMgbmV2ZXIgTlVMTCAoc2VlIGNyZWF0ZUFWRCkgaGVyZSAqLworICAgIGlmIChvcHRzLT5yYW1kaXNrKSB7CisgICAgICAgIHN0cl9yZXNldCgmaHctPmRpc2tfcmFtZGlza19wYXRoLCBvcHRzLT5yYW1kaXNrKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIWh3LT5kaXNrX3JhbWRpc2tfcGF0aFswXSkgeworICAgICAgICBzdHJfcmVzZXRfbm9jb3B5KCZody0+ZGlza19yYW1kaXNrX3BhdGgsIGF2ZEluZm9fZ2V0UmFtZGlza1BhdGgoYXZkKSk7CisgICAgICAgIEQoImF1dG9jb25maWc6IC1yYW1kaXNrICVzIiwgaHctPmRpc2tfcmFtZGlza19wYXRoKTsKKyAgICB9CisKKyAgICAvKiAtcGFydGl0aW9uLXNpemUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBtYXggc2l6ZSBvZiBib3RoIHRoZSBzeXN0ZW0KKyAgICAgKiBhbmQgZGF0YSBwYXJ0aXRpb24gc2l6ZXMuCisgICAgICovCisgICAgdWludDY0X3QgZGVmYXVsdFBhcnRpdGlvblNpemUgPSBjb252ZXJ0TUJUb0J5dGVzKDIwMCk7CisKKyAgICBpZiAob3B0cy0+cGFydGl0aW9uX3NpemUpIHsKKyAgICAgICAgY2hhciogIGVuZDsKKyAgICAgICAgbG9uZyAgIHNpemVNQiA9IHN0cnRvbChvcHRzLT5wYXJ0aXRpb25fc2l6ZSwgJmVuZCwgMCk7CisgICAgICAgIGxvbmcgICBtaW5TaXplTUIgPSAxMDsKKyAgICAgICAgbG9uZyAgIG1heFNpemVNQiA9IExPTkdfTUFYIC8gT05FX01COworCisgICAgICAgIGlmIChzaXplTUIgPCAwIHx8ICplbmQgIT0gMCkgeworICAgICAgICAgICAgZGVycm9yKCAiLXBhcnRpdGlvbi1zaXplIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIiApOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZU1CIDwgbWluU2l6ZU1CIHx8IHNpemVNQiA+IG1heFNpemVNQikgeworICAgICAgICAgICAgZGVycm9yKCAicGFydGl0aW9uLXNpemUgKCVkKSBtdXN0IGJlIGJldHdlZW4gJWRNQiBhbmQgJWRNQiIsCisgICAgICAgICAgICAgICAgICAgIHNpemVNQiwgbWluU2l6ZU1CLCBtYXhTaXplTUIgKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdFBhcnRpdGlvblNpemUgPSAodWludDY0X3QpIHNpemVNQiAqIE9ORV9NQjsKKyAgICB9CisKKworICAgIC8qKiBTWVNURU0gUEFSVElUSU9OICoqLworCisgICAgaWYgKG9wdHMtPnN5c2RpciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChhdmRJbmZvX2luQW5kcm9pZEJ1aWxkKGF2ZCkpIHsKKyAgICAgICAgICAgIHN0cl9yZXNldCgmb3B0cy0+c3lzZGlyLCBhdmRJbmZvX2dldENvbnRlbnRQYXRoKGF2ZCkpOworICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLXN5c2RpciAlcyIsIG9wdHMtPnN5c2Rpcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0cy0+c3lzZGlyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFwYXRoX2V4aXN0cyhvcHRzLT5zeXNkaXIpKSB7CisgICAgICAgICAgICBkZXJyb3IoIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJXMiLCBvcHRzLT5zeXNkaXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyKiAgcndJbWFnZSAgID0gTlVMTDsKKyAgICAgICAgY2hhciogIGluaXRJbWFnZSA9IE5VTEw7CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKG9wdHMtPnN5c3RlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogSWYgLXN5c3RlbSBpcyBub3QgdXNlZCwgdHJ5IHRvIGZpbmQgYSBydW50aW1lIHN5c3RlbSBpbWFnZQorICAgICAgICAgICAgICAgICogKGkuZS4gc3lzdGVtLXFlbXUuaW1nKSBpbiB0aGUgY29udGVudCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByd0ltYWdlID0gYXZkSW5mb19nZXRTeXN0ZW1JbWFnZVBhdGgoYXZkKTsKKyAgICAgICAgICAgICAgICBpZiAocndJbWFnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIHRyeSB0byBmaW5kIHRoZSBpbml0aWFsIHN5c3RlbSBpbWFnZSAqLworICAgICAgICAgICAgICAgIGluaXRJbWFnZSA9IGF2ZEluZm9fZ2V0U3lzdGVtSW5pdEltYWdlUGF0aChhdmQpOworICAgICAgICAgICAgICAgIGlmIChpbml0SW1hZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkZXJyb3IoIk5vIGluaXRpYWwgc3lzdGVtIGltYWdlIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24hIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiAtc3lzdGVtIDxuYW1lPiBpcyB1c2VkLCB1c2UgaXQgdG8gZmluZCB0aGUgaW5pdGlhbCBpbWFnZSAqLworICAgICAgICAgICAgaWYgKG9wdHMtPnN5c2RpciAhPSBOVUxMICYmICFwYXRoX2V4aXN0cyhvcHRzLT5zeXN0ZW0pKSB7CisgICAgICAgICAgICAgICAgaW5pdEltYWdlID0gX2dldEZ1bGxGaWxlUGF0aChvcHRzLT5zeXNkaXIsIG9wdHMtPnN5c3RlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluaXRJbWFnZSA9IEFTVFJEVVAob3B0cy0+c3lzdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcGF0aF9leGlzdHMoaW5pdEltYWdlKSkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiU3lzdGVtIGltYWdlIGZpbGUgZG9lc24ndCBleGlzdDogJXMiLCBpbml0SW1hZ2UpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAoMCk7CisKKyAgICAgICAgaWYgKHJ3SW1hZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogVXNlIHRoZSByZWFkL3dyaXRlIGltYWdlIGZpbGUgZGlyZWN0bHkgKi8KKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoJmh3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9wYXRoLCByd0ltYWdlKTsKKyAgICAgICAgICAgIHN0cl9yZXNldF9udWxsKCZody0+ZGlza19zeXN0ZW1QYXJ0aXRpb25faW5pdFBhdGgpOworICAgICAgICAgICAgRCgiVXNpbmcgZGlyZWN0IHN5c3RlbSBpbWFnZTogJXMiLCByd0ltYWdlKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbml0SW1hZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyX3Jlc2V0X251bGwoJmh3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9wYXRoKTsKKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoJmh3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9pbml0UGF0aCwgaW5pdEltYWdlKTsKKyAgICAgICAgICAgIEQoIlVzaW5nIGluaXRpYWwgc3lzdGVtIGltYWdlOiAlcyIsIGluaXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUgc3lzdGVtIHBhcnRpdGlvbiBpbWFnZS4KKyAgICAgICAgKiBJZiB3ZSBoYXZlIGFuIEFWRCwgaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4KKyAgICAgICAgKiB0aGUgZGlzay5zeXN0ZW1QYXJ0aXRpb24uc2l6ZSBoYXJkd2FyZSBwcm9wZXJ0eS4KKyAgICAgICAgKgorICAgICAgICAqIE90aGVyd2lzZSwgd2UgbmVlZCB0byBhZGp1c3QgdGhlIHN5c3RlbVBhcnRpdGlvblNpemUKKyAgICAgICAgKiBhdXRvbWF0aWNhbGx5LCBhbmQgcHJpbnQgYSB3YXJuaW5nLgorICAgICAgICAqCisgICAgICAgICovCisgICAgICAgIGNvbnN0IGNoYXIqIHN5c3RlbUltYWdlID0gaHctPmRpc2tfc3lzdGVtUGFydGl0aW9uX3BhdGg7CisgICAgICAgIHVpbnQ2NF90ICAgIHN5c3RlbUJ5dGVzOworCisgICAgICAgIGlmIChzeXN0ZW1JbWFnZSA9PSBOVUxMKQorICAgICAgICAgICAgc3lzdGVtSW1hZ2UgPSBody0+ZGlza19zeXN0ZW1QYXJ0aXRpb25faW5pdFBhdGg7CisKKyAgICAgICAgaWYgKHBhdGhfZ2V0X3NpemUoc3lzdGVtSW1hZ2UsICZzeXN0ZW1CeXRlcykgPCAwKSB7CisgICAgICAgICAgICBkZXJyb3IoIk1pc3Npbmcgc3lzdGVtIGltYWdlOiAlcyIsIHN5c3RlbUltYWdlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGh3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgIF9hZGp1c3RQYXJ0aXRpb25TaXplKCJzeXN0ZW0iLCBzeXN0ZW1CeXRlcywgZGVmYXVsdFBhcnRpdGlvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2luQW5kcm9pZEJ1aWxkKGF2ZCkpOworICAgIH0KKworICAgIC8qKiBEQVRBIFBBUlRJVElPTiAqKi8KKworICAgIGlmIChvcHRzLT5kYXRhZGlyKSB7CisgICAgICAgIGlmICghcGF0aF9leGlzdHMob3B0cy0+ZGF0YWRpcikpIHsKKyAgICAgICAgICAgIGRlcnJvcigiSW52YWxpZCAtZGF0YWRpciBkaXJlY3Rvcnk6ICVzIiwgb3B0cy0+ZGF0YWRpcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIqICBkYXRhSW1hZ2UgPSBOVUxMOworICAgICAgICBjaGFyKiAgaW5pdEltYWdlID0gTlVMTDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoIW9wdHMtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICBkYXRhSW1hZ2UgPSBhdmRJbmZvX2dldERhdGFJbWFnZVBhdGgoYXZkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YUltYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLWRhdGEgJXMiLCBkYXRhSW1hZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YUltYWdlID0gYXZkSW5mb19nZXREZWZhdWx0RGF0YUltYWdlUGF0aChhdmQpOworICAgICAgICAgICAgICAgIGlmIChkYXRhSW1hZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkZXJyb3IoIk5vIGRhdGEgaW1hZ2UgcGF0aCBmb3IgdGhpcyBjb25maWd1cmF0aW9uISIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wdHMtPndpcGVfZGF0YSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcHRzLT5kYXRhZGlyKSB7CisgICAgICAgICAgICAgICAgZGF0YUltYWdlID0gX2dldEZ1bGxGaWxlUGF0aChvcHRzLT5kYXRhZGlyLCBvcHRzLT5kYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YUltYWdlID0gQVNUUkRVUChvcHRzLT5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoMCk7CisKKyAgICAgICAgaWYgKG9wdHMtPmluaXRkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluaXRJbWFnZSA9IEFTVFJEVVAob3B0cy0+aW5pdGRhdGEpOworICAgICAgICAgICAgaWYgKCFwYXRoX2V4aXN0cyhpbml0SW1hZ2UpKSB7CisgICAgICAgICAgICAgICAgZGVycm9yKCJJbnZhbGlkIGluaXRpYWwgZGF0YSBpbWFnZSBwYXRoOiAlcyIsIGluaXRJbWFnZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5pdEltYWdlID0gYXZkSW5mb19nZXREYXRhSW5pdEltYWdlUGF0aChhdmQpOworICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLWluaXRkYXRhICVzIiwgaW5pdEltYWdlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cl9yZXNldCgmaHctPmRpc2tfZGF0YVBhcnRpdGlvbl9wYXRoLCBkYXRhSW1hZ2UpOworICAgICAgICBpZiAob3B0cy0+d2lwZV9kYXRhKSB7CisgICAgICAgICAgICBzdHJfcmVzZXQoJmh3LT5kaXNrX2RhdGFQYXJ0aXRpb25faW5pdFBhdGgsIGluaXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJfcmVzZXRfbnVsbCgmaHctPmRpc2tfZGF0YVBhcnRpdGlvbl9pbml0UGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZF9vcF93aXBlX2RhdGEgPSBvcHRzLT53aXBlX2RhdGE7CisgICAgICAgIGFuZHJvaWRfb3Bfd3JpdGFibGVfc3lzdGVtID0gb3B0cy0+d3JpdGFibGVfc3lzdGVtOworCisgICAgICAgIHVpbnQ2NF90IGRlZmF1bHRCeXRlcyA9IGh3LT5kaXNrX2RhdGFQYXJ0aXRpb25fc2l6ZTsKKyAgICAgICAgaWYgKGRlZmF1bHRCeXRlcyA9PSAwIHx8IG9wdHMtPnBhcnRpdGlvbl9zaXplKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgLXBhcnRpdGlvbi1zaXplIG9wdGlvbiBpcyBnaXZlbiB0aGF0IHNob3VsZCBvdmVycmlkZQorICAgICAgICAgICAgLy8gd2hhdGV2ZXIgc2V0dGluZyB3YXMgaW4gdGhlIGNvbmZpZyBmaWxlLgorICAgICAgICAgICAgZGVmYXVsdEJ5dGVzID0gZGVmYXVsdFBhcnRpdGlvblNpemU7CisgICAgICAgIH0KKworICAgICAgICB1aW50NjRfdCAgICAgZGF0YUJ5dGVzOworICAgICAgICBjb25zdCBjaGFyKiAgZGF0YVBhdGggPSBody0+ZGlza19kYXRhUGFydGl0aW9uX2luaXRQYXRoOworCisgICAgICAgIGlmIChkYXRhUGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgZGF0YVBhdGggPSBody0+ZGlza19kYXRhUGFydGl0aW9uX3BhdGg7CisKKyAgICAgICAgcGF0aF9nZXRfc2l6ZShkYXRhUGF0aCwgJmRhdGFCeXRlcyk7CisKKyAgICAgICAgaHctPmRpc2tfZGF0YVBhcnRpdGlvbl9zaXplID0KKyAgICAgICAgICAgIF9hZGp1c3RQYXJ0aXRpb25TaXplKCJkYXRhIiwgZGF0YUJ5dGVzLCBkZWZhdWx0Qnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2luQW5kcm9pZEJ1aWxkKGF2ZCkpOworICAgIH0KKworICAgIC8qKiBDQUNIRSBQQVJUSVRJT04gKiovCisKKyAgICBpZiAob3B0cy0+bm9fY2FjaGUpIHsKKyAgICAgICAgLyogTm8gY2FjaGUgcGFydGl0aW9uIGF0IGFsbCAqLworICAgICAgICBody0+ZGlza19jYWNoZVBhcnRpdGlvbiA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCFody0+ZGlza19jYWNoZVBhcnRpdGlvbikgeworICAgICAgICBpZiAob3B0cy0+Y2FjaGUpIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCAiRW11bGF0ZWQgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IGEgY2FjaGUgcGFydGl0aW9uLiAtY2FjaGUgb3B0aW9uIGlnbm9yZWQhIiApOworICAgICAgICAgICAgc3RyX3Jlc2V0X251bGwoJm9wdHMtPmNhY2hlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoIW9wdHMtPmNhY2hlKSB7CisgICAgICAgICAgICAvKiBGaW5kIHRoZSBjdXJyZW50IGNhY2hlIHBhcnRpdGlvbiBmaWxlICovCisgICAgICAgICAgICBzdHJfcmVzZXRfbm9jb3B5KCZvcHRzLT5jYWNoZSwgYXZkSW5mb19nZXRDYWNoZVBhdGgoYXZkKSk7CisgICAgICAgICAgICBpZiAoIW9wdHMtPmNhY2hlKSB7CisgICAgICAgICAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmb3B0cy0+Y2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2dldERlZmF1bHRDYWNoZVBhdGgoYXZkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3B0cy0+Y2FjaGUpIHsKKyAgICAgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtY2FjaGUgJXMiLCBvcHRzLT5jYWNoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0cy0+Y2FjaGUpIHsKKyAgICAgICAgICAgIHN0cl9yZXNldCgmaHctPmRpc2tfY2FjaGVQYXJ0aXRpb25fcGF0aCwgb3B0cy0+Y2FjaGUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyX3Jlc2V0KCZody0+ZGlza19lbmNyeXB0aW9uS2V5UGFydGl0aW9uX3BhdGgsIGF2ZEluZm9fZ2V0RW5jcnlwdGlvbktleUltYWdlUGF0aChhdmQpKTsKKworICAgIGlmIChody0+ZGlza19jYWNoZVBhcnRpdGlvbl9wYXRoICYmIG9wdHMtPmNhY2hlX3NpemUpIHsKKyAgICAgICAgLyogU2V0IGNhY2hlIHBhcnRpdGlvbiBzaXplIHBlciB1c2VyIG9wdGlvbnMuICovCisgICAgICAgIGNoYXIqICBlbmQ7CisgICAgICAgIGxvbmcgICBzaXplTUIgPSBzdHJ0b2wob3B0cy0+Y2FjaGVfc2l6ZSwgJmVuZCwgMCk7CisKKyAgICAgICAgaWYgKHNpemVNQiA8IDAgfHwgKmVuZCAhPSAwKSB7CisgICAgICAgICAgICBkZXJyb3IoICItY2FjaGUtc2l6ZSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgaW50ZWdlciIgKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBody0+ZGlza19jYWNoZVBhcnRpdGlvbl9zaXplID0gKHVpbnQ2NF90KSBzaXplTUIgKiBPTkVfTUI7CisgICAgfQorCisgICAgLyoqIFNEIENBUkQgUEFSVElUSU9OICovCisKKyAgICBpZiAoIWh3LT5od19zZENhcmQpIHsKKyAgICAgICAgLyogTm8gU0QgQ2FyZCBlbXVsYXRpb24sIHNvIC1zZGNhcmQgd2lsbCBiZSBpZ25vcmVkICovCisgICAgICAgIGlmIChvcHRzLT5zZGNhcmQpIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCAiRW11bGF0ZWQgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IFNEIENhcmRzLiAtc2RjYXJkIG9wdGlvbiBpZ25vcmVkLiIgKTsKKyAgICAgICAgICAgIHN0cl9yZXNldF9udWxsKCZvcHRzLT5zZGNhcmQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQXV0by1jb25maWd1cmUgLXNkY2FyZCBpZiBpdCBpcyBub3QgYXZhaWxhYmxlICovCisgICAgICAgIGlmICghb3B0cy0+c2RjYXJkKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgLyogSWYgLWRhdGFkaXIgPHBhdGg+IGlzIHVzZWQsIGxvb2sgZm9yIGEgc2RjYXJkLmltZyBmaWxlIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBpZiAob3B0cy0+ZGF0YWRpcikgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHRtcFtQQVRIX01BWF0sICp0bXBlbmQgPSB0bXAgKyBzaXplb2YodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmcHJpbnQodG1wLCB0bXBlbmQsICIlcy8lcyIsIG9wdHMtPmRhdGFkaXIsICJzeXN0ZW0uaW1nIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoX2V4aXN0cyh0bXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnNkY2FyZCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlLCBsb29rIGF0IHRoZSBBVkQncyBjb250ZW50ICovCisgICAgICAgICAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmb3B0cy0+c2RjYXJkLCBhdmRJbmZvX2dldFNkQ2FyZFBhdGgoYXZkKSk7CisgICAgICAgICAgICAgICAgaWYgKG9wdHMtPnNkY2FyZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgKi8KKyAgICAgICAgICAgIH0gd2hpbGUgKDApOworCisgICAgICAgICAgICBpZiAob3B0cy0+c2RjYXJkKSB7CisgICAgICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLXNkY2FyZCAlcyIsIG9wdHMtPnNkY2FyZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihvcHRzLT5zZGNhcmQpIHsKKyAgICAgICAgdWludDY0X3QgIHNpemU7CisgICAgICAgIGlmIChwYXRoX2dldF9zaXplKG9wdHMtPnNkY2FyZCwgJnNpemUpID09IDApIHsKKyAgICAgICAgICAgIC8qIHNlZSBpZiB3ZSBoYXZlIGFuIHNkY2FyZCBpbWFnZS4gIGdldCBpdHMgc2l6ZSBpZiBpdCBleGlzdHMgKi8KKyAgICAgICAgICAgIC8qIGR1ZSB0byB3aGF0IGxvb2tzIGxpa2UgbGltaXRhdGlvbnMgb2YgdGhlIE1NQyBwcm90b2NvbCwgb25lIGhhcworICAgICAgICAgICAgICogdG8gdXNlIGFuIFNEIENhcmQgaW1hZ2UgdGhhdCBpcyBlcXVhbCBvciBsYXJnZXIgdGhhbiA5IE1CCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzaXplIDwgOSoxMDI0KjEwMjRVTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiMjIyBXQVJOSU5HOiBTRCBDYXJkIGZpbGVzIG11c3QgYmUgYXQgbGVhc3QgOU1CLCBpZ25vcmluZyAnJXMnXG4iLCBvcHRzLT5zZGNhcmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJfcmVzZXQoJmh3LT5od19zZENhcmRfcGF0aCwgb3B0cy0+c2RjYXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCJubyBTRCBDYXJkIGltYWdlIGF0ICclcyciLCBvcHRzLT5zZGNhcmQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdHMtPnNlbGludXgpIHsKKyAgICAgICAgaWYgKChzdHJjbXAob3B0cy0+c2VsaW51eCwgInBlcm1pc3NpdmUiKSAhPSAwKQorICAgICAgICAgICAgICAgICYmIChzdHJjbXAob3B0cy0+c2VsaW51eCwgImRpc2FibGVkIikgIT0gMCkpIHsKKyAgICAgICAgICAgIGRlcnJvcigiLXNlbGludXggbXVzdCBiZSBcImRpc2FibGVkXCIgb3IgXCJwZXJtaXNzaXZlXCIiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNFTGludXggJ2Rpc2FibGVkJyBtb2RlIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgc3RhcnRpbmcgd2l0aCBNLgorICAgICAgICAvLyBTZWUgaHR0cHM6Ly9hbmRyb2lkLXJldmlldy5nb29nbGVzb3VyY2UuY29tLyMvYy8xNDg1MzgvCisgICAgICAgIGNvbnN0IGludCBrU0VMaW51eFdpdGhvdXREaXNhYmxlZEFwaUxldmVsID0gMjM7CisgICAgICAgIGlmICghc3RyY21wKG9wdHMtPnNlbGludXgsICJkaXNhYmxlZCIpICYmCisgICAgICAgICAgICAgICAgYXZkSW5mb19nZXRBcGlMZXZlbChhdmQpID49IGtTRUxpbnV4V2l0aG91dERpc2FibGVkQXBpTGV2ZWwpIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCJTRUxpbnV4ICdkaXNhYmxlZCcgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBzdGFydGluZyAiCisgICAgICAgICAgICAgICAgICAgICAid2l0aCBBUEkgbGV2ZWwgJWQsIHN3aXRjaGluZyB0byAncGVybWlzc2l2ZSciLAorICAgICAgICAgICAgICAgICAgICAga1NFTGludXhXaXRob3V0RGlzYWJsZWRBcGlMZXZlbCk7CisgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnNlbGludXgsICJwZXJtaXNzaXZlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0cy0+bWVtb3J5KSB7CisgICAgICAgIC8vIG92ZXJyaWRlIGF2ZCBtZW1vcnkgc2V0dGluZworICAgICAgICBjaGFyKiAgZW5kOworICAgICAgICBsb25nICAgcmFtU2l6ZSA9IHN0cnRvbChvcHRzLT5tZW1vcnksICZlbmQsIDApOworICAgICAgICBpZiAocmFtU2l6ZSA8IDAgfHwgKmVuZCAhPSAwKSB7CisgICAgICAgICAgICBkZXJyb3IoICItbWVtb3J5IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIiApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGh3LT5od19yYW1TaXplID0gcmFtU2l6ZTsKKyAgICB9CisKKyAgICBpZiAoaHctPmh3X3JhbVNpemUgPD0gMCkgeworICAgICAgICAvKiBDb21wdXRlIHRoZSBkZWZhdWx0IFJBTSBzaXplIGJhc2VkIG9uIHRoZSBzaXplIG9mIHNjcmVlbi4KKyAgICAgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgc2tpbiBkb2Vzbid0IHByb3ZpZGUgdGhlIHJhbQorICAgICAgICAgKiBzaXplIHRocm91Z2ggaXRzIGhhcmR3YXJlLmluaSAoaS5lLiBsZWdhY3kgb25lcykgb3Igd2hlbgorICAgICAgICAgKiBpbiB0aGUgZnVsbCBBbmRyb2lkIGJ1aWxkIHN5c3RlbS4KKyAgICAgICAgICovCisgICAgICAgIGludDY0X3QgcGl4ZWxzICA9IGh3LT5od19sY2Rfd2lkdGggKiBody0+aHdfbGNkX2hlaWdodDsKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyB0aHJlc2hvbGRzIGFyZSBhIGJpdCBsaWJlcmFsLCBidXQgd2UKKyAgICAgICAgICogZXNzZW50aWFsbHkgd2FudCB0byBlbnN1cmUgdGhlIGZvbGxvd2luZyBtYXBwaW5nczoKKyAgICAgICAgICoKKyAgICAgICAgICogICAzMjB4NDgwIC0+IDk2CisgICAgICAgICAqICAgODAweDYwMCAtPiAxMjgKKyAgICAgICAgICogIDEwMjR4NzY4IC0+IDI1NgorICAgICAgICAgKgorICAgICAgICAgKiBUaGVzZSBhcmUganVzdCBzaW1wbGUgaGV1cmlzdGljcywgdGhleSBjb3VsZCBjaGFuZ2UgaW4KKyAgICAgICAgICogdGhlIGZ1dHVyZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwaXhlbHMgPD0gMjUwMDAwKQorICAgICAgICAgICAgaHctPmh3X3JhbVNpemUgPSA5NjsKKyAgICAgICAgZWxzZSBpZiAocGl4ZWxzIDw9IDUwMDAwMCkKKyAgICAgICAgICAgIGh3LT5od19yYW1TaXplID0gMTI4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBody0+aHdfcmFtU2l6ZSA9IDI1NjsKKyAgICB9CisKKyAgICAvLyBhbGwgNjQgYml0IGFyY2hzIHdlIHN1cHBvcnQgaW5jbHVkZSAiNjQiCisgICAgYm9vbCBndWVzdF9pc18zMl9iaXQgPSBzdHJzdHIoaHctPmh3X2NwdV9hcmNoLCAiNjQiKSA9PSAwOworICAgIGJvb2wgaG9zdF9pc18zMl9iaXQgPSBzaXplb2Yodm9pZCopID09IDQ7CisgICAgYm9vbCBsaW1pdF9pc180Z2IgPSAoZ3Vlc3RfaXNfMzJfYml0IHx8IGhvc3RfaXNfMzJfYml0KTsKKworICAgIC8vIGVuZm9yY2UgQ0REIG1pbmltdW1zCisgICAgaW50IG1pblJhbSA9IDMyOworICAgIGlmIChhdmRJbmZvX2dldEFwaUxldmVsKGF2ZCkgPj0gMjEpIHsKKyAgICAgICAgaWYgKGd1ZXN0X2lzXzMyX2JpdCkgeworICAgICAgICAgICAgLy8gVE9ETzogYWRqdXN0IG1pbiBiYXNlZCBvbiBzY3JlZW4gc2l6ZSwgd2VhciwgMjMrCisgICAgICAgICAgICAvLyBhbmRyb2lkIHdlYXIgbWluIGlzIGFjdHVhbGx5IDQxNiBidXQgbW9zdCBwZW9wbGUgYm9vdCBwaG9uZXMKKyAgICAgICAgICAgIG1pblJhbSA9IDUxMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1pblJhbSA9IDgzMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhvc3RfaXNfMzJfYml0KSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGEgQ0REIG1pbmltdW0gYnV0IHdhcyBwcmVzZW50IGluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIGVtdWxhdG9yCisgICAgICAgICAgICAvLyBGb3IgcmVjZW50IHN5c3RlbSB2ZXJzaW9ucywgZW5zdXJlIGEgbWluaW11bSBvZiAxR0Igb3IgbWVtb3J5LCBhbnl0aGluZworICAgICAgICAgICAgLy8gbG93ZXIgaXMgdmVyeSBwYWluZnVsIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzIGFuZCBhZnRlciB0aGF0LgorICAgICAgICAgICAgbWluUmFtID0gMTAyNDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChhdmRJbmZvX2dldEFwaUxldmVsKGF2ZCkgPj0gMTQpIHsKKyAgICAgICAgbWluUmFtID0gMzQwOworICAgIH0KKyAgICBlbHNlIGlmIChhdmRJbmZvX2dldEFwaUxldmVsKGF2ZCkgPj0gOSkgeworICAgICAgICBtaW5SYW0gPSAxMjg7CisgICAgfQorICAgIGVsc2UgaWYgKGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYXZkKSA+PSA3KSB7CisgICAgICAgIG1pblJhbSA9IDkyOworICAgIH0KKworICAgIGlmIChody0+aHdfcmFtU2l6ZSA8IG1pblJhbSkgeworICAgICAgICBEKCJJbmNyZWFzaW5nIFJBTSBzaXplIHRvICVpTUIiLCBtaW5SYW0pOworICAgICAgICBody0+aHdfcmFtU2l6ZSA9IG1pblJhbTsKKyAgICB9CisgICAgZWxzZSBpZiAobGltaXRfaXNfNGdiICYmIGh3LT5od19yYW1TaXplID4gNDA5NikgeworICAgICAgICBEKCJEZWNyZWFzaW5nIFJBTSBzaXplIHRvIDQwOTZNQiIpOworICAgICAgICBody0+aHdfcmFtU2l6ZSA9IDQwOTY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBEKCJQaHlzaWNhbCBSQU0gc2l6ZTogJWRNQlxuIiwgaHctPmh3X3JhbVNpemUpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgVk0gaGVhcCBzaXplIHRvIG1pbiB2bSBoZWFwIHBlciBhcGkgbGV2ZWwsIGJ1dCBtYWtlIHN1cmUgd2UgZG9uJ3QKKyAgICAvLyBvdmVyY29uc3RyYWluIGl0IC0gc28gaW5jcmVhc2UgaXQgdG8gUkFNIHNpemUgLyA0IHVwIHRvIDU3NiBNQi4KKyAgICAvLyBMYXJnZXIgVk0gaGVhcHMgdXN1YWxseSBkb24ndCBhZGQgYW55IGdvb2QsIGJ1dCBvbmx5IHNsb3cgZG93biB0aGUgR0MuCisgICAgLy8gQWxzbywgd2Ugd29uJ3QgYmUgYWJsZSB0byBhbGxvY2F0ZSB0b28gaHVnZSBzaW5nbGUgY2h1bmsgb3IgbWVtb3J5IGZvciBhCisgICAgLy8gaGVhcCBhbnl3YXkuCisgICAgY29uc3QgaW50IG1pbkFwaUxldmVsVm1IZWFwU2l6ZSA9CisgICAgICAgICAgICBhbmRyb2lkSHdDb25maWdfZ2V0TWluVm1IZWFwU2l6ZShodywgYXZkSW5mb19nZXRBcGlMZXZlbChhdmQpKTsKKyAgICBjb25zdCBpbnQgbWluUmFtVm1IZWFwU2l6ZSA9IGh3LT5od19yYW1TaXplIC8gNDsKKyAgICBpbnQgdm1IZWFwU2l6ZSA9IG1pblJhbVZtSGVhcFNpemUgPiBtaW5BcGlMZXZlbFZtSGVhcFNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtaW5SYW1WbUhlYXBTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWluQXBpTGV2ZWxWbUhlYXBTaXplOworCisgICAgY29uc3QgaW50IG1heFZtSGVhcFNpemUgPQorICAgICAgICAgICAgNCAqIG1pbkFwaUxldmVsVm1IZWFwU2l6ZSA+IDU3NiA/IDU3NiA6IDQgKiBtaW5BcGlMZXZlbFZtSGVhcFNpemU7CisgICAgaWYgKHZtSGVhcFNpemUgPiBtYXhWbUhlYXBTaXplKSB7CisgICAgICAgIHZtSGVhcFNpemUgPSBtYXhWbUhlYXBTaXplOworICAgIH0KKyAgICBpZiAoaHctPnZtX2hlYXBTaXplIDwgdm1IZWFwU2l6ZSkgeworICAgICAgICBEKCJWTSBoZWFwIHNpemUgJWlNQiBpcyBiZWxvdyBoYXJkd2FyZSBzcGVjaWZpZWQgbWluaW11bSBvZiAlaU1CLCIKKyAgICAgICAgICAic2V0dGluZyBpdCB0byB0aGF0IHZhbHVlIiwKKyAgICAgICAgICBody0+dm1faGVhcFNpemUsIHZtSGVhcFNpemUpOworCisgICAgICAgIGh3LT52bV9oZWFwU2l6ZSA9IHZtSGVhcFNpemU7CisKKyAgICAgICAgY29uc3QgaW50IG1pblJhbVNpemUgPSB2bUhlYXBTaXplICogMjsKKyAgICAgICAgaWYgKGh3LT5od19yYW1TaXplIDwgbWluUmFtU2l6ZSkgeworICAgICAgICAgICAgaHctPmh3X3JhbVNpemUgPSBtaW5SYW1TaXplOworICAgICAgICAgICAgRCgiSW5jcmVhc2luZyBSQU0gdG8gJWlNQiB0byBhY2NvbW9kYXRlIG1pbiBWTSBoZWFwIiwgbWluUmFtU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBib29sIGlzX3FlbXUxID0gIWlzX3FlbXUyOworICAgIGlmIChpc19xZW11MSAmJiBhdmRJbmZvX2dldFNuYXBzaG90UHJlc2VudChhdmQpKSB7CisgICAgICAgIGNvbnN0IGJvb2wgbG9hZF9wcmV2aW91c19zbmFwc2hvdCA9ICFvcHRzLT5ub19zbmFwc2hvdF9sb2FkOworICAgICAgICBjb25zdCBib29sIHNhdmVfc25hcHNob3Rfb25fZXhpdCA9ICFvcHRzLT5ub19zbmFwc2hvdF9zYXZlOworICAgICAgICBpZiAobG9hZF9wcmV2aW91c19zbmFwc2hvdCB8fCBzYXZlX3NuYXBzaG90X29uX2V4aXQpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfb3Bfd3JpdGFibGVfc3lzdGVtID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYW5kcm9pZF9vcF93cml0YWJsZV9zeXN0ZW0pIHsKKyAgICAgICAgRCgiU3lzdGVtIGltYWdlIGlzIHJlYWQgb25seSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGR3YXJuaW5nKCJTeXN0ZW0gaW1hZ2UgaXMgd3JpdGFibGUiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIGhhbmRsZUNwdUFjY2VsZXJhdGlvbihBbmRyb2lkT3B0aW9ucyogb3B0cywgY29uc3QgQXZkSW5mbyogYXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3B1QWNjZWxNb2RlKiBhY2NlbF9tb2RlLCBjaGFyKiogYWNjZWxfc3RhdHVzKSB7CisgICAgYXNzZXJ0KGFjY2VsX3N0YXR1cyAhPSBOVUxMKTsKKworICAgIC8qIEhhbmRsZSBDUFUgYWNjZWxlcmF0aW9uIG9wdGlvbnMuICovCisgICAgaWYgKG9wdHMtPm5vX2FjY2VsKSB7CisgICAgICAgIGlmIChvcHRzLT5hY2NlbCkgeworICAgICAgICAgICAgaWYgKHN0cmNtcChvcHRzLT5hY2NlbCwgIm9mZiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoIllvdSBjYW5ub3QgdXNlIC1uby1hY2NlbCBhbmQgJy1hY2NlbCAlcycgYXQgdGhlIHNhbWUgdGltZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG9wdHMtPmFjY2VsKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyX3Jlc2V0KCZvcHRzLT5hY2NlbCwgIm9mZiIpOworICAgICAgICB9CisgICAgfQorCisgICAgKmFjY2VsX21vZGUgPSBBQ0NFTF9BVVRPOworICAgIGlmIChvcHRzLT5hY2NlbCkgeworICAgICAgICBpZiAoIXN0cmNtcChvcHRzLT5hY2NlbCwgIm9mZiIpKSB7CisgICAgICAgICAgICAqYWNjZWxfbW9kZSA9IEFDQ0VMX09GRjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdHMtPmFjY2VsLCAib24iKSkgeworICAgICAgICAgICAgKmFjY2VsX21vZGUgPSBBQ0NFTF9PTjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdHMtPmFjY2VsLCAiYXV0byIpKSB7CisgICAgICAgICAgICAqYWNjZWxfbW9kZSA9IEFDQ0VMX0FVVE87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXJyb3IoIkludmFsaWQgJy1hY2NlbCAlcycgcGFyYW1ldGVyLCB2YWxpZCB2YWx1ZXMgYXJlOiBvbiBvZmYgYXV0b1xuIiwKKyAgICAgICAgICAgICAgICAgICBvcHRzLT5hY2NlbCk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBhY2NlbF9jYXBhYmlsaXR5ID0gYW5kcm9pZENwdUFjY2VsZXJhdGlvbl9nZXRTdGF0dXMoYWNjZWxfc3RhdHVzKTsKKyAgICBib29sIGFjY2VsX29rID0gKGFjY2VsX2NhcGFiaWxpdHkgPT0gQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX1JFQURZKTsKKyAgICAvLyBEdW1wIENQVSBhY2NlbGVyYXRpb24gc3RhdHVzLgorICAgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGFjY2VsX3N0ciA9ICJESVNBQkxFRCI7CisgICAgICAgIGlmIChhY2NlbF9vaykgeworICAgICAgICAgICAgaWYgKCphY2NlbF9tb2RlID09IEFDQ0VMX09GRikgeworICAgICAgICAgICAgICAgIGFjY2VsX3N0ciA9ICJ3b3JraW5nLCBidXQgZGlzYWJsZWQgYnkgdXNlciI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFjY2VsX3N0ciA9ICJ3b3JraW5nIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkcHJpbnQoIkNQVSBBY2NlbGVyYXRpb246ICVzIiwgYWNjZWxfc3RyKTsKKyAgICAgICAgZHByaW50KCJDUFUgQWNjZWxlcmF0aW9uIHN0YXR1czogJXMiLCAqYWNjZWxfc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IHg4Ni94ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZQorICAgIC8vIGFjY2VsZXJhdGlvbiwgc28gcmVmdXNlIHRvIHN0YXJ0IGluICdhdXRvJyBtb2RlIGlmIGl0IGlzIG5vdAorICAgIC8vIGF2YWlsYWJsZS4KKyAgICB7CisgICAgICAgIGNoYXIqIGFiaSA9IGF2ZEluZm9fZ2V0VGFyZ2V0QWJpKGF2ZCk7CisgICAgICAgIGlmICghc3RybmNtcChhYmksICJ4ODYiLCAzKSkgeworICAgICAgICAgICAgaWYgKCFhY2NlbF9vayAmJiAqYWNjZWxfbW9kZSAhPSBBQ0NFTF9PRkYpIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoIiVzIGVtdWxhdGlvbiBjdXJyZW50bHkgcmVxdWlyZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIVxuIgorICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGVuc3VyZSAlcyBpcyBwcm9wZXJseSBpbnN0YWxsZWQgYW5kIHVzYWJsZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgIkNQVSBhY2NlbGVyYXRpb24gc3RhdHVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGFiaSwga0FjY2VsZXJhdG9yLCAqYWNjZWxfc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKmFjY2VsX21vZGUgPT0gQUNDRUxfT0ZGKSB7CisgICAgICAgICAgICAgICAgLy8gJy1uby1hY2NlbCcgb2YgJy1hY2NlbCBvZmYnIHdhcyB1c2VkIGV4cGxpY2l0bHkuIFdhcm4gYWJvdXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgaXNzdWUgYnV0IGRvIG5vdCBleGl0LgorICAgICAgICAgICAgICAgIGR3YXJuaW5nKCIlcyBlbXVsYXRpb24gbWF5IG5vdCB3b3JrIHdpdGhvdXQgaGFyZHdhcmUgYWNjZWxlcmF0aW9uISIsIGFiaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBDUFUgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQgYW5kIHdvcmtpbmcsIGJ1dCBpZiB0aGUgaG9zdCBDUFUKKyAgICAgICAgICAgICAgICAgKiBkb2VzIG5vdCBzdXBwb3J0IGFsbCBpbnN0cnVjdGlvbiBzZXRzIHNwZWNpZmllZCBpbiB0aGUgeDg2LworICAgICAgICAgICAgICAgICAqIHg4Nl82NCBBQkksIGVtdWxhdGlvbiBtYXkgZmFpbCBvbiB1bnN1cHBvcnRlZCBpbnN0cnVjdGlvbnMuCisgICAgICAgICAgICAgICAgICogVGhlcmVmb3JlLCBjaGVjayB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBob3N0IENQVSBhbmQgd2FybgorICAgICAgICAgICAgICAgICAqIHRoZSB1c2VyIGlmIGFueSByZXF1aXJlZCBmZWF0dXJlcyBhcmUgbWlzc2luZy4gKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBlY3ggPSAwOworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzY0XSwgKnAgPSBidWYsICogY29uc3QgZW5kID0gcCArIHNpemVvZihidWYpOworCisgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBDUFVJRCBpbnN0cnVjdGlvbiB3aXRoIEVBWD0xIGFuZCBFQ1g9MCB0byBnZXQgQ1BVCisgICAgICAgICAgICAgICAgICogZmVhdHVyZSBiaXRzIChzdG9yZWQgaW4gRURYLCBFQ1ggYW5kIEVCWCkuICovCisgICAgICAgICAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkKDEsIDAsIE5VTEwsIE5VTEwsICZlY3gsIE5VTEwpOworCisgICAgICAgICAgICAgICAgLyogVGhlb3JldGljYWxseSwgTU1YIGFuZCBTU0UvMi8zIHNob3VsZCBiZSBjaGVja2VkIGFzIHdlbGwsIGJ1dAorICAgICAgICAgICAgICAgICAqIENQVSBtb2RlbHMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVtIGFyZSBwcm9iYWJseSB0b28gb2xkIHRvCisgICAgICAgICAgICAgICAgICogcnVuIEFuZHJvaWQgZW11bGF0b3IuICovCisgICAgICAgICAgICAgICAgaWYgKCEoZWN4ICYgQ1BVSURfRUNYX1NTU0UzKSkgeworICAgICAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiIFNTU0UzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGFiaSwgIng4Nl82NCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGVjeCAmIENQVUlEX0VDWF9TU0U0MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICIgU1NFNC4xIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoZWN4ICYgQ1BVSURfRUNYX1NTRTQyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiBTU0U0LjIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIShlY3ggJiBDUFVJRF9FQ1hfUE9QQ05UKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiBQT1BDTlQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwID4gYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVzaW5nIGR3YXJuaW5nKC4uKSB3b3VsZCBjYXVzZSB0aGlzIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgKiB0byBzdGRvdXQgYW5kIGZpbHRlcmVkIG91dCBieSBBVkQgTWFuYWdlci4gQnV0IHdlIHdhbnQKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIEFWRCBNYW5hZ2VyIHVzZXIgdG8gc2VlIHRoaXMgd2FybmluZywgc28gd2UgcmVzb3J0IHRvCisgICAgICAgICAgICAgICAgICAgICAqIGZwcmludGYoLi4pLiAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVtdWxhdG9yOiBXQVJOSU5HOiBIb3N0IENQVSBpcyBtaXNzaW5nIHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZvbGxvd2luZyBmZWF0dXJlKHMpIHJlcXVpcmVkIGZvciAlcyBlbXVsYXRpb246JXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuSGFyZHdhcmUtYWNjZWxlcmF0ZWQgZW11bGF0aW9uIG1heSBub3Qgd29yayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHByb3Blcmx5IVxuIiwgYWJpLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBRlJFRShhYmkpOworICAgIH0KKyAgICByZXR1cm4gYWNjZWxfb2s7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBzb2Z0d2FyZSBHUFUgaXMgdXNlZCBhbmQgQVZEIHNjcmVlbiBpcyB0b28gbGFyZ2UgZm9yIGl0LgorICogU29mdHdhcmUgR1BVIGNhbiBib290IDgwMCBYIDEyODAgKGZpcnN0IGdlbiBOZXh1cyA3KSBvciBzbWFsbGVyIGR1ZSB0bworICogc29mdHdhcmUgYnVmZmVyIHNpemUuIChJdCBtYXkgYWN0dWFsbHkgYm9vdCBhIHNsaWdodGx5IGxhcmdlciBzY3JlZW4sCisgKiBidXQgd2Ugc2V0IGxpbWl0IHRvIHRoaXMgY29tbW9ubHkgc2VlbiByZXNvbHV0aW9uLikKKyAqLworc3RhdGljIGJvb2wgdXNlX3NvZnR3YXJlX2dwdV9hbmRfc2NyZWVuX3Rvb19sYXJnZShBbmRyb2lkSHdDb25maWcqIGh3KSB7CisgICAgY29uc3QgaW50IGtNYXhXaWR0aCA9IDEyODA7CisgICAgY29uc3QgaW50IGtNYXhIZWlnaHQgPSA4MDA7CisKKyAgICBpZiAoIWh3LT5od19ncHVfZW5hYmxlZCAmJgorICAgICAgICAgICAgKGh3LT5od19sY2Rfd2lkdGggKiBody0+aHdfbGNkX2hlaWdodCA+IGtNYXhXaWR0aCAqIGtNYXhIZWlnaHQpKSB7CisgICAgICAgIGRlcnJvcigiR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiT25seSBzY3JlZW4gc2l6ZSBvZiA4MDAgWCAxMjgwIG9yIHNtYWxsZXIgaXMgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAid2hlbiBHUFUgZW11bGF0aW9uIGlzIGRpc2FibGVkLiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBfZmluZFFlbXVJbmZvcm1hdGlvbmFsT3B0aW9uOiBzZWFyY2ggZm9yIGluZm9ybWF0aW9uYWwgUUVNVSBvcHRpb25zCisvLworLy8gU2NhbnMgdGhlIGdpdmVuIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBhbnkgaW5mb3JtYXRpb25hbCBRRU1VIG9wdGlvbiAoc2VlCisvLyB8cWVtdV9pbmZvX29wdHN8IGZvciB0aGUgbGlzdCBvZiBpbmZvcm1hdGlvbmFsIFFFTVUgb3B0aW9ucykuIFJldHVybnMgdGhlCisvLyBmaXJzdCBtYXRjaGluZyBvcHRpb24sIG9yIE5VTEwgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCisvLworLy8gfHFlbXVfYXJnY3wgaXMgdGhlIG51bWJlciBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBpbiB8cWVtdV9hcmd2fC4KKy8vIHxxZW11X2FyZ3Z8IGlzIHRoZSBhcnJheSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBiZSBzZWFyY2hlZC4gSXQgaXMgdGhlCisvLyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCBhbGwgdGhlc2Ugb3B0aW9ucyBhcmUgaW50ZW5kZWQgZm9yCisvLyBRRU1VLgorc3RhdGljIGNoYXIqIF9maW5kUWVtdUluZm9ybWF0aW9uYWxPcHRpb24oaW50IHFlbXVfYXJnYywgY2hhcioqIHFlbXVfYXJndikgeworICAgIC8qIEluZm9ybWF0aW9uYWwgUUVNVSBvcHRpb25zLCB3aGljaCBtYWtlIFFFTVUgcHJpbnQgc29tZSBpbmZvcm1hdGlvbiB0bworICAgICAqIHRoZSBjb25zb2xlIGFuZCBleGl0LiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBxZW11X2luZm9fb3B0c1tdID0geworICAgICAgICAiLWgiLAorICAgICAgICAiLWhlbHAiLAorICAgICAgICAiLXZlcnNpb24iLAorICAgICAgICAiLWF1ZGlvLWhlbHAiLAorICAgICAgICAiPyIsICAgICAgICAgICAvKiBlLmcuICctY3B1ID8nIGZvciBsaXN0aW5nIGF2YWlsYWJsZSBDUFUgbW9kZWxzICovCisgICAgICAgIE5VTEwgICAgICAgICAgIC8qIGRlbm90ZXMgdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworICAgIH07CisgICAgaW50IGkgPSAwOworCisgICAgZm9yICg7IGkgPCBxZW11X2FyZ2M7IGkrKykgeworICAgICAgICBjaGFyKiBhcmcgPSBxZW11X2FyZ3ZbaV07CisgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBvbyA9IHFlbXVfaW5mb19vcHRzOworCisgICAgICAgIGZvciAoOyAqb287IG9vKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKCpvbywgYXJnKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhcmc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgZW11bGF0b3JfcGFyc2VDb21tb25Db21tYW5kTGluZU9wdGlvbnMoaW50KiBwX2FyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiogcF9hcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0YXJnZXRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3FlbXUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyb2lkT3B0aW9ucyogb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZEh3Q29uZmlnKiBodywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZkSW5mbyoqIHRoZV9hdmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZXhpdF9zdGF0dXMpIHsKKworICAgICpleGl0X3N0YXR1cyA9IDE7CisKKyAgICBpZiAoYW5kcm9pZF9wYXJzZV9vcHRpb25zKHBfYXJnYywgcF9hcmd2LCBvcHRzKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9wdHMtPnJhbmNodSA9IGlzX3FlbXUyOworCisgICAgd2hpbGUgKCgqcF9hcmdjKS0tID4gMSkgeworICAgICAgICBjb25zdCBjaGFyKiBvcHQgPSAoKysqcF9hcmd2KVswXTsKKworICAgICAgICBpZighc3RyY21wKG9wdCwgIi1xZW11IikpIHsKKyAgICAgICAgICAgIC0tKCpwX2FyZ2MpOworICAgICAgICAgICAgKysoKnBfYXJndik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludCBoZWxwU3RhdHVzID0gZW11bGF0b3JfcGFyc2VIZWxwT3B0aW9uKG9wdCk7CisgICAgICAgIGlmIChoZWxwU3RhdHVzID49IDApIHsKKyAgICAgICAgICAgICpleGl0X3N0YXR1cyA9IGhlbHBTdGF0dXM7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3B0WzBdID09ICctJykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbjogJXNcbiIsIG9wdCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBsZWFzZSB1c2UgLWhlbHAgZm9yIGEgbGlzdCBvZiB2YWxpZCBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBjb21tYW5kLWxpbmUgcGFyYW1ldGVyOiAlcy5cbiIsIG9wdCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSGludDogdXNlICdAZm9vJyB0byBsYXVuY2ggYSB2aXJ0dWFsIGRldmljZSBuYW1lZCAnZm9vJy5cbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBsZWFzZSB1c2UgLWhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG9wdHMtPnZlcnNpb24pIHsKKyAgICAgIHByaW50ZigiQW5kcm9pZCBlbXVsYXRvciB2ZXJzaW9uICVzXG4iCisgICAgICAgICAgICAgIkNvcHlyaWdodCAoQykgMjAwNi0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgYW5kIG1hbnkgIgorICAgICAgICAgICAgICJvdGhlcnMuXG4iCisgICAgICAgICAgICAgIlRoaXMgcHJvZ3JhbSBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIFFFTVUgQ1BVIGVtdWxhdG9yICIKKyAgICAgICAgICAgICAiKHd3dy5xZW11Lm9yZykuXG5cbiIsCisjaWYgZGVmaW5lZCBBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIKKyAgICAgICAgICAgICBFTVVMQVRPUl9WRVJTSU9OX1NUUklORyAiIChidWlsZF9pZCAiIFNUUklOR0lGWShBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIpICIpIik7CisjZWxzZQorICAgICAgICAgICAgIEVNVUxBVE9SX1ZFUlNJT05fU1RSSU5HKTsKKyNlbmRpZgorICAgICAgICBwcmludGYoIiAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpY1xuIgorICAgICAgICAgICAgICAgIiAgTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmRcbiIKKyAgICAgICAgICAgICAgICIgIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuXG5cbiIKKyAgICAgICAgICAgICAgICIgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIgorICAgICAgICAgICAgICAgIiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiIKKyAgICAgICAgICAgICAgICIgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiIKKyAgICAgICAgICAgICAgICIgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG5cbiIpOworCisgICAgICAgICpleGl0X3N0YXR1cyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+d2ViY2FtX2xpc3QpIHsKKyAgICAgICAgYW5kcm9pZF9jYW1lcmFfbGlzdF93ZWJjYW1zKCk7CisgICAgICAgICpleGl0X3N0YXR1cyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+c25hcHNob3RfbGlzdCkgeworICAgICAgICBpZiAob3B0cy0+c25hcHN0b3JhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTmVlZCB0byBmaW5kIHRoZSBkZWZhdWx0IHNuYXBzdG9yYWdlICovCisgICAgICAgICAgICBpbnQgaW5BbmRyb2lkQnVpbGQgPSAwOworICAgICAgICAgICAgQXZkSW5mbyogYXZkID0gY3JlYXRlQVZEKG9wdHMsICZpbkFuZHJvaWRCdWlsZCk7CisgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnNuYXBzdG9yYWdlLCBhdmRJbmZvX2dldFNuYXBTdG9yYWdlUGF0aChhdmQpKTsKKyAgICAgICAgICAgIGF2ZEluZm9fZnJlZShhdmQpOworICAgICAgICAgICAgaWYgKG9wdHMtPnNuYXBzdG9yYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtc25hcHN0b3JhZ2UgJXMiLCBvcHRzLT5zbmFwc3RvcmFnZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpbkFuZHJvaWRCdWlsZCkgeworICAgICAgICAgICAgICAgICAgICBkZXJyb3IoIllvdSBtdXN0IHVzZSB0aGUgLXNuYXBzdG9yYWdlIDxmaWxlPiBvcHRpb24gdG8gc3BlY2lmeSBhIHNuYXBzaG90IHN0b3JhZ2UgZmlsZSFcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRlcnJvcigiVGhpcyBBVkQgZG9lc24ndCBoYXZlIHNuYXBzaG90dGluZyBlbmFibGVkIVxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzbmFwc2hvdF9wcmludChvcHRzLT5zbmFwc3RvcmFnZSk7CisgICAgICAgICpleGl0X3N0YXR1cyA9IDA7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBCb3RoIHxhcmdjfCBhbmQgfGFyZ3Z8IGhhdmUgYmVlbiBtb2RpZmllZCBieSB0aGUgYmlnIHdoaWxlIGxvb3AgYWJvdmU6CisgICAgLy8gfGFyZ2N8IHNob3VsZCBub3cgYmUgdGhlIG51bWJlciBvZiBvcHRpb25zIGFmdGVyICctcWVtdScsIGFuZCBpZiB0aGF0IGlzCisgICAgLy8gcG9zaXRpdmUsIHxhcmd2fCBzaG91bGQgcG9pbnQgdG8gdGhlIGZpcnN0IG9wdGlvbiBmb2xsb3dpbmcgJy1xZW11Jy4KKyAgICAvLyBOb3cgd2UgY2hlY2sgaWYgYW55IG9mIHRoZXNlIFFFTVUgb3B0aW9ucyBpcyBhbiAnaW5mb3JtYXRpb25hbCcgb3B0aW9uLAorICAgIC8vIGUuZy4gJy1oJywgJy12ZXJzaW9uJywgZXRjLgorICAgIC8vIFRoZSBleHRyYSBwYWlyIG9mIHBhcmVudGhlc2VzIGlzIHRvIGtlZXAgZ2NjIGhhcHB5LgorICAgIGNoYXIqIHFlbXVfaW5mb19vcHQgPSBfZmluZFFlbXVJbmZvcm1hdGlvbmFsT3B0aW9uKCpwX2FyZ2MsICpwX2FyZ3YpOworICAgIGlmICggcWVtdV9pbmZvX29wdCkgeworICAgICAgICBEKCJGb3VuZCBpbmZvcm1hdGlvbmFsIG9wdGlvbiAnJXMnIGFmdGVyICctcWVtdScuXG4iCisgICAgICAgICAgIkFsbCBvcHRpb25zIGJlZm9yZSAnLXFlbXUnIHdpbGwgYmUgaWdub3JlZCEiLCBxZW11X2luZm9fb3B0KTsKKyAgICAgICAgKmV4aXRfc3RhdHVzID0gRU1VTEFUT1JfRVhJVF9TVEFUVVNfUE9TSVRJT05BTF9RRU1VX1BBUkFNRVRFUjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNhbml0aXplT3B0aW9ucyhvcHRzKTsKKworICAgIGlmIChvcHRzLT5zZWxpbnV4KSB7CisgICAgICAgIGlmICgoc3RyY21wKG9wdHMtPnNlbGludXgsICJwZXJtaXNzaXZlIikgIT0gMCkKKyAgICAgICAgICAgICAgICAmJiAoc3RyY21wKG9wdHMtPnNlbGludXgsICJkaXNhYmxlZCIpICE9IDApKSB7CisgICAgICAgICAgICBkZXJyb3IoIi1zZWxpbnV4IG11c3QgYmUgXCJkaXNhYmxlZFwiIG9yIFwicGVybWlzc2l2ZVwiIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQYXJzZXMgb3B0aW9ucyBhbmQgYnVpbGRzIGFuIGFwcHJvcHJpYXRlIEFWRC4gKi8KKyAgICBpbnQgaW5BbmRyb2lkQnVpbGQgPSAwOworICAgIEF2ZEluZm8qIGF2ZCA9ICp0aGVfYXZkID0gY3JlYXRlQVZEKG9wdHMsICZpbkFuZHJvaWRCdWlsZCk7CisKKyAgICAvKiBnZXQgdGhlIHNraW4gZnJvbSB0aGUgdmlydHVhbCBkZXZpY2UgY29uZmlndXJhdGlvbiAqLworICAgIGlmIChvcHRzLT5za2luZGlyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG9wdHMtPnNraW4gPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTk9URTogTm9ybWFsbHkgaGFuZGxlZCBieSBzYW5pdGl6ZU9wdGlvbnMoKSwganVzdCBiZSBzYWZlICovCisgICAgICAgICAgICBkZXJyb3IoIlRoZSAtc2tpbmRpciA8cGF0aD4gb3B0aW9uIHJlcXVpcmVzIGEgLXNraW4gPG5hbWU+IG9wdGlvbiIpOworICAgICAgICAgICAgKmV4aXRfc3RhdHVzID0gMjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIqIHNraW5OYW1lOworICAgICAgICBjaGFyKiBza2luRGlyOworCisgICAgICAgIGF2ZEluZm9fZ2V0U2tpbkluZm8oYXZkLCAmc2tpbk5hbWUsICZza2luRGlyKTsKKworICAgICAgICBpZiAob3B0cy0+c2tpbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdHJfcmVzZXRfbm9jb3B5KCZvcHRzLT5za2luLCBza2luTmFtZSk7CisgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtc2tpbiAlcyIsIG9wdHMtPnNraW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUZSRUUoc2tpbk5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmb3B0cy0+c2tpbmRpciwgc2tpbkRpcik7CisgICAgICAgIEQoImF1dG9jb25maWc6IC1za2luZGlyICVzIiwgb3B0cy0+c2tpbmRpcik7CisgICAgfQorICAgIC8qIHVwZGF0ZSB0aGUgYXZkIGh3IGNvbmZpZyBmcm9tIHRoaXMgbmV3IHNraW4gKi8KKyAgICBhdmRJbmZvX2dldFNraW5IYXJkd2FyZUluaShhdmQsIG9wdHMtPnNraW4sIG9wdHMtPnNraW5kaXIpOworCisgICAgaWYgKGF2ZEluZm9faW5pdEh3Q29uZmlnKGF2ZCwgaHcsIGlzX3FlbXUyKSA8IDApIHsKKyAgICAgICAgZGVycm9yKCJjb3VsZCBub3QgcmVhZCBoYXJkd2FyZSBjb25maWd1cmF0aW9uID8iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGVtdWxhdG9yX2hhc19uZXR3b3JrX29wdGlvbiA9CisgICAgICAgICAgICAob3B0cy0+bmV0c3BlZWQgJiYgKG9wdHMtPm5ldHNwZWVkWzBdICE9ICdcMCcpKSB8fAorICAgICAgICAgICAgKG9wdHMtPm5ldGRlbGF5ICYmIChvcHRzLT5uZXRkZWxheVswXSAhPSAnXDAnKSkgfHwKKyAgICAgICAgICAgIG9wdHMtPm5ldGZhc3Q7CisKKyAgICBpZiAoIW9wdHMtPm5ldHNwZWVkICYmIGFuZHJvaWRfc2tpbl9uZXRfc3BlZWQpIHsKKyAgICAgICAgRCgic2tpbiBuZXR3b3JrIHNwZWVkOiAnJXMnIiwgYW5kcm9pZF9za2luX25ldF9zcGVlZCk7CisgICAgICAgIGlmIChzdHJjbXAoYW5kcm9pZF9za2luX25ldF9zcGVlZCwgTkVUV09SS19TUEVFRF9ERUZBVUxUKSAhPSAwKSB7CisgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPm5ldHNwZWVkLCBhbmRyb2lkX3NraW5fbmV0X3NwZWVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghb3B0cy0+bmV0ZGVsYXkgJiYgYW5kcm9pZF9za2luX25ldF9kZWxheSkgeworICAgICAgICBEKCJza2luIG5ldHdvcmsgZGVsYXk6ICclcyciLCBhbmRyb2lkX3NraW5fbmV0X2RlbGF5KTsKKyAgICAgICAgaWYgKHN0cmNtcChhbmRyb2lkX3NraW5fbmV0X2RlbGF5LCBORVRXT1JLX0RFTEFZX0RFRkFVTFQpICE9IDApIHsKKyAgICAgICAgICAgIHN0cl9yZXNldCgmb3B0cy0+bmV0ZGVsYXksIGFuZHJvaWRfc2tpbl9uZXRfZGVsYXkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBuZXQgc3BlZWQgYW5kIGRlbGF5cyBzdHVmZi4gKi8KKyAgICBpZiAoIWFuZHJvaWRfbmV0d29ya19zZXRfc3BlZWQob3B0cy0+bmV0c3BlZWQpKSB7CisgICAgICAgIGRlcnJvcigiaW52YWxpZCAtbmV0c3BlZWQgcGFyYW1ldGVyICclcyciLCBvcHRzLT5uZXRzcGVlZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWRfbmV0d29ya19zZXRfbGF0ZW5jeShvcHRzLT5uZXRkZWxheSkpIHsKKyAgICAgICAgZGVycm9yKCJpbnZhbGlkIC1uZXRkZWxheSBwYXJhbWV0ZXIgJyVzJyIsIG9wdHMtPm5ldGRlbGF5KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChvcHRzLT5uZXRmYXN0KSB7CisgICAgICAgIGFuZHJvaWRfbmV0d29ya19zZXRfc3BlZWQoImZ1bGwiKTsKKyAgICAgICAgYW5kcm9pZF9uZXR3b3JrX3NldF9sYXRlbmN5KCJub25lIik7CisgICAgfQorCisgICAgaWYgKG9wdHMtPmNvZGVfcHJvZmlsZSkgeworICAgICAgICBjaGFyKiBwcm9maWxlUGF0aCA9CisgICAgICAgICAgICAgICAgYXZkSW5mb19nZXRDb2RlUHJvZmlsZVBhdGgoYXZkLCBvcHRzLT5jb2RlX3Byb2ZpbGUpOworICAgICAgICBpZiAocHJvZmlsZVBhdGggPT0gTlVMTCkgeworICAgICAgICAgICAgZGVycm9yKCAiYmFkIC1jb2RlLXByb2ZpbGUgcGFyYW1ldGVyIiApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCByZXQgPSBwYXRoX21rZGlyX2lmX25lZWRlZChwcm9maWxlUGF0aCwgMDc1NSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBkZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICclcydcbiIsIHByb2ZpbGVQYXRoKTsKKyAgICAgICAgICAgICpleGl0X3N0YXR1cyA9IDI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0X25vY29weSgmb3B0cy0+Y29kZV9wcm9maWxlLCBwcm9maWxlUGF0aCk7CisgICAgfQorCisgICAgaWYgKG9wdHMtPnVuaXhfcGlwZSkgeworICAgIH0KKworICAgIC8vIFVwZGF0ZSBDUFUgYXJjaGl0ZWN0dXJlIGZvciBIVyBjb25maWdzIGNyZWF0ZWQgZnJvbSBidWlsZCBkaXJlY3RvcnkuCisgICAgaWYgKGluQW5kcm9pZEJ1aWxkKSB7CisgICAgICAgIHN0cl9yZXNldCgmaHctPmh3X2NwdV9hcmNoLCB0YXJnZXRBcmNoKTsKKyAgICB9CisKKyAgICBpZiAoIWVtdWxhdG9yX2hhbmRsZUNvbW1vbkVtdWxhdG9yT3B0aW9ucyhvcHRzLCBodywgYXZkLCBpc19xZW11MikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKiBTTkFQU0hPVCBTVE9SQUdFIEhBTkRMSU5HICovCisKKyAgICAvKiBEZXRlcm1pbmUgc25hcHN0b3JhZ2UgcGF0aC4gLW5vLXNuYXBzdG9yYWdlIGRpc2FibGVzIGFsbCBzbmFwc2hvdHRpbmcKKyAgICAgKiBzdXBwb3J0LiBUaGlzIG1lYW5zIHlvdSBjYW4ndCByZXN1bWUgYSBzbmFwc2hvdCBhdCBsb2FkLCBzYXZlIGl0IGF0CisgICAgICogZXhpdCwgb3IgZXZlbiBsb2FkL3NhdmUgdGhlbSBkeW5hbWljYWxseSBhdCBydW50aW1lIHdpdGggdGhlIGNvbnNvbGUuCisgICAgICovCisgICAgaWYgKG9wdHMtPm5vX3NuYXBzdG9yYWdlKSB7CisgICAgICAgIGlmIChvcHRzLT5zbmFwc2hvdCkgeworICAgICAgICAgICAgZHdhcm5pbmcoImlnbm9yaW5nIC1zbmFwc2hvdCBvcHRpb24gZHVlIHRvIHRoZSB1c2Ugb2YgLW5vLXNuYXBzdG9yYWdlIik7CisgICAgICAgICAgICBzdHJfcmVzZXRfbnVsbCgmb3B0cy0+c25hcHNob3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdHMtPnNuYXBzdG9yYWdlKSB7CisgICAgICAgICAgICBkd2FybmluZygiaWdub3JpbmcgLXNuYXBzdG9yYWdlIG9wdGlvbiBkdWUgdG8gdGhlIHVzZSBvZiAtbm8tc25hcHN0b3JhZ2UiKTsKKyAgICAgICAgICAgIHN0cl9yZXNldF9udWxsKCZvcHRzLT5zbmFwc3RvcmFnZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW9wdHMtPnNuYXBzdG9yYWdlICYmIGF2ZEluZm9fZ2V0U25hcHNob3RQcmVzZW50KGF2ZCkpIHsKKyAgICAgICAgICAgIHN0cl9yZXNldF9ub2NvcHkoJm9wdHMtPnNuYXBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRJbmZvX2dldFNuYXBTdG9yYWdlUGF0aChhdmQpKTsKKyAgICAgICAgICAgIGlmIChvcHRzLT5zbmFwc3RvcmFnZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgRCgiYXV0b2NvbmZpZzogLXNuYXBzdG9yYWdlICVzIiwgb3B0cy0+c25hcHN0b3JhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdHMtPnNuYXBzdG9yYWdlICYmICFwYXRoX2V4aXN0cyhvcHRzLT5zbmFwc3RvcmFnZSkpIHsKKyAgICAgICAgICAgIEQoIm5vIGltYWdlIGF0ICclcycsIHN0YXRlIHNuYXBzaG90cyBkaXNhYmxlZCIsIG9wdHMtPnNuYXBzdG9yYWdlKTsKKyAgICAgICAgICAgIHN0cl9yZXNldF9udWxsKCZvcHRzLT5zbmFwc3RvcmFnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiB3ZSBoYXZlIGEgdmFsaWQgc25hcHNob3Qgc3RvcmFnZSBwYXRoICovCisKKyAgICBpZiAob3B0cy0+c25hcHN0b3JhZ2UpIHsKKyAgICAgICAgaWYgKGlzX3FlbXUyKSB7CisgICAgICAgICAgICBkd2FybmluZygiUUVNVTIgZG9lcyBub3Qgc3VwcG9ydCBzbmFwc2hvdHMgLSBvcHRpb24gd2lsbCBiZSBpZ25vcmVkLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUUVNVTIgZG9lcyBub3Qgc3VwcG9ydCBzb21lIG9mIHRoZSBmbGFncyBiZWxvdywgYW5kIHRoZSBlbXVsYXRvciB3aWxsCisgICAgICAgICAgICAvLyBmYWlsIHRvIHN0YXJ0IGlmIHRoZXkgYXJlIHBhc3NlZCBpbiwgc28gZm9yIG5vdywgaWdub3JlIHRoZW0uCisgICAgICAgICAgICBzdHJfcmVzZXQoJmh3LT5kaXNrX3NuYXBTdG9yYWdlX3BhdGgsIG9wdHMtPnNuYXBzdG9yYWdlKTsKKworICAgICAgICAgICAgLyogLW5vLXNuYXBzaG90IGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgYm90aCAtbm8tc25hcHNob3QtbG9hZAorICAgICAgICAgICAgKiBhbmQgLW5vLXNuYXBzaG90LXNhdmUuIFlvdSBjYW4gc3RpbGwgbG9hZC9zYXZlIHNuYXBzaG90cyBkeW5hbWljYWxseQorICAgICAgICAgICAgKiBmcm9tIHRoZSBjb25zb2xlIHRob3VnaC4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAob3B0cy0+bm9fc25hcHNob3QpIHsKKyAgICAgICAgICAgICAgICBvcHRzLT5ub19zbmFwc2hvdF9sb2FkID0gMTsKKyAgICAgICAgICAgICAgICBvcHRzLT5ub19zbmFwc2hvdF9zYXZlID0gMTsKKyAgICAgICAgICAgICAgICBpZiAob3B0cy0+c25hcHNob3QpIHsKKyAgICAgICAgICAgICAgICAgICAgZHdhcm5pbmcoImlnbm9yaW5nIC1zbmFwc2hvdCBvcHRpb24gZHVlIHRvIHRoZSB1c2Ugb2YgLW5vLXNuYXBzaG90LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvcHRzLT5ub19zbmFwc2hvdF9sb2FkIHx8ICFvcHRzLT5ub19zbmFwc2hvdF9zYXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdHMtPnNuYXBzaG90ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyX3Jlc2V0KCZvcHRzLT5zbmFwc2hvdCwgImRlZmF1bHQtYm9vdCIpOworICAgICAgICAgICAgICAgICAgICBEKCJhdXRvY29uZmlnOiAtc25hcHNob3QgJXMiLCBvcHRzLT5zbmFwc2hvdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFvcHRzLT5sb2djYXQgfHwgb3B0cy0+bG9nY2F0WzBdID09IDApIHsKKyAgICAgICAgY29uc3QgY2hhciogZW52ID0gZ2V0ZW52KCJBTkRST0lEX0xPR19UQUdTIik7CisgICAgICAgIGlmIChlbnYgJiYgZW52WzBdKSB7CisgICAgICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPmxvZ2NhdCwgZW52KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cl9yZXNldF9udWxsKCZvcHRzLT5sb2djYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogWFhYWDogVE9ETzogaW1wbGVtZW50IC1zaGVsbCBhbmQgLWxvZ2NhdCB0aHJvdWdoIHFlbXVkIGluc3RlYWQgKi8KKyAgICBpZiAoIW9wdHMtPnNoZWxsX3NlcmlhbCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBzdHJfcmVzZXQoJm9wdHMtPnNoZWxsX3NlcmlhbCwgImNvbjoiKTsKKyNlbHNlCisgICAgICAgIHN0cl9yZXNldCgmb3B0cy0+c2hlbGxfc2VyaWFsLCAic3RkaW8iKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIG9wdHMtPnNoZWxsID0gMTsKKyAgICB9CisKKyAgICBpZiAoaHctPnZtX2hlYXBTaXplID09IDApIHsKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgZGVmYXVsdCBoZWFwIHNpemUgYmFzZWQgb24gdGhlIFJBTSBzaXplLgorICAgICAgICAgKiBFc3NlbnRpYWxseSwgd2Ugd2FudCB0byBlbnN1cmUgdGhlIGZvbGxvd2luZyBsaWJlcmFsIG1hcHBpbmdzOgorICAgICAgICAgKgorICAgICAgICAgKiAgIDk2TUIgUkFNIC0+IDE2TUIgaGVhcAorICAgICAgICAgKiAgMTI4TUIgUkFNIC0+IDI0TUIgaGVhcAorICAgICAgICAgKiAgMjU2TUIgUkFNIC0+IDQ4TUIgaGVhcAorICAgICAgICAgKi8KKyAgICAgICAgaW50ICByYW1TaXplID0gaHctPmh3X3JhbVNpemU7CisgICAgICAgIGludCAgaGVhcFNpemU7CisKKyAgICAgICAgaWYgKHJhbVNpemUgPCAxMDApCisgICAgICAgICAgICBoZWFwU2l6ZSA9IDE2OworICAgICAgICBlbHNlIGlmIChyYW1TaXplIDwgMTkyKQorICAgICAgICAgICAgaGVhcFNpemUgPSAyNDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGVhcFNpemUgPSA0ODsKKworICAgICAgICBody0+dm1faGVhcFNpemUgPSBoZWFwU2l6ZTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKworICAgICAgICBpbnQgYXBpX2xldmVsID0gYXZkSW5mb19nZXRBcGlMZXZlbChhdmQpOworICAgICAgICBjaGFyKiBhcGlfYXJjaCA9IGF2ZEluZm9fZ2V0VGFyZ2V0QWJpKGF2ZCk7CisgICAgICAgIGJvb2wgaXNHb29nbGUgPSBhdmRJbmZvX2lzR29vZ2xlQXBpcyhhdmQpOworCisgICAgICAgIGlmICghYW5kcm9pZEVtdWdsQ29uZmlnSW5pdCgmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy0+YXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpX2FyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dvb2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMtPmdwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLT5ub193aW5kb3cpKSB7CisgICAgICAgICAgICBkZXJyb3IoIiVzIiwgY29uZmlnLnN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgdXNlciBpcyB1c2luZyAtZ3B1IG9mZiAobm90IC1ncHUgZ3Vlc3QpLAorICAgICAgICAvLyBvciBpZiB0aGUgQVBJIGxldmVsIGlzIGxvd2VyIHRoYW4gMTQgKEljZSBDcmVhbSBTYW5kd2ljaCkKKyAgICAgICAgLy8gZm9yY2UgMTYtYml0IGNvbG9yIGRlcHRoLgorCisgICAgICAgIGlmIChhcGlfbGV2ZWwgPCAxNCB8fCAob3B0cy0+Z3B1ICYmICFzdHJjbXAob3B0cy0+Z3B1LCAib2ZmIikpKSB7CisgICAgICAgICAgICBody0+aHdfbGNkX2RlcHRoID0gMTY7CisgICAgICAgIH0KKworICAgICAgICBody0+aHdfZ3B1X2VuYWJsZWQgPSBjb25maWcuZW5hYmxlZDsKKyAgICAgICAgaWYgKHVzZV9zb2Z0d2FyZV9ncHVfYW5kX3NjcmVlbl90b29fbGFyZ2UoaHcpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgaHdfZ3B1X21vZGUgd2l0aCB0aGUgY2Fub25pY2FsIHJlbmRlcmVyIG5hbWUgZGV0ZXJtaW5lZCBieQorICAgICAgICAgKiBlbXVnbENvbmZpZ19pbml0IChob3N0L2d1ZXN0L29mZi9zd2lmdHNoYWRlciBldGMpCisgICAgICAgICAqLworICAgICAgICBzdHJfcmVzZXQoJmh3LT5od19ncHVfbW9kZSwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBEKCIlcyIsIGNvbmZpZy5zdGF0dXMpOworCisjaWZkZWYgX1dJTjMyCisgICAgICAgIC8vIEJVRzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MTk5NDI3CisgICAgICAgIC8vIEJvb3Rpbmcgd2lsbCBiZSBzZXZlcmVseSBzbG93ZWQgZG93biwgaWYgbm90IGRpc2FibGVkIG91dHJpZ2h0LCB3aGVuCisgICAgICAgIC8vIDEuIE9uIFdpbmRvd3MKKyAgICAgICAgLy8gMi4gVXNpbmcgYW4gQVZEIHJlc29sdXRpb24gb2YgPj0gMTA4MHAgKGNhbiB2YXJ5IGFjcm9zcyBob3N0IHNldHVwcykKKyAgICAgICAgLy8gMy4gLWdwdSBtZXNhCisgICAgICAgIC8vIFdoYXQgaGFwcGVucyBpcyB0aGF0IE1lc2Egd2lsbCBob2cgdGhlIENQVSwgd2hpbGUgZGlzYWxsb3dpbmcKKyAgICAgICAgLy8gY3JpdGljYWwgYm9vdCBzZXJ2aWNlcyBmcm9tIG1ha2luZyBwcm9ncmVzcywgY2F1c2luZworICAgICAgICAvLyB0aGUgc2VydmljZXMgdG8gZ2l2ZSB1cCBhbmQgcHV0IHRoZSBlbXVsYXRvciBpbiBhIHJlYm9vdCBsb29wCisgICAgICAgIC8vIHVudGlsIGl0IGVpdGhlciBmYWlscyB0byBib290IGFsdG9nZXRoZXIgb3IgZ2V0cyBsdWNreSBhbmQKKyAgICAgICAgLy8gc3VjY2Vzc2Z1bGx5IGJvb3RzLgorICAgICAgICAvLyBUaGlzIHdvcmthcm91bmQgZGlzYWJsZXMgdGhlIGJvb3QgYW5pbWF0aW9uIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zLAorICAgICAgICAvLyB3aGljaCBmcmVlcyB1cCB0aGUgQ1BVIGVub3VnaCBmb3IgdGhlIGRldmljZSB0byBib290LgorICAgICAgICAvLyBBTkdMRTogQU5HTEUgZG9lc24ndCBoYXZlIEdMRVN2MSBzdXBwb3J0IChmb3Igbm93KSwKKyAgICAgICAgLy8gc28gbGV0J3MgYWxzbyBkaXNhYmxlIHRoZSBib290IGFuaW1hdGlvbi4KKyAgICAgICAgY29uc3QgY2hhciogZ3B1X21vZGUgPSBvcHRzLT5ncHUgPyBvcHRzLT5ncHUgOiBody0+aHdfZ3B1X21vZGU7CisgICAgICAgIGlmIChncHVfbW9kZSAmJiAoIXN0cmNtcChncHVfbW9kZSwgIm1lc2EiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZ3B1X21vZGUsICJhbmdsZSIpKSkgeworICAgICAgICAgICAgb3B0cy0+bm9fYm9vdF9hbmltID0gMTsKKyAgICAgICAgICAgIEQoIlN0YXJ0aW5nIEFWRCB3aXRob3V0IGJvb3QgYW5pbWF0aW9uLlxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIC8qIFF1aXQgZW11bGF0b3Igb24gY29uZGl0aW9uIHRoYXQgYm90aCwgZ3B1IGFuZCBzbmFwc3RvcmFnZSBhcmUgb24uIFRoaXMgaXMKKyAgICAgKiBhIHRlbXBvcmFyeSBzb2x1dGlvbiBwcmV2ZW50aW5nIHRoZSBlbXVsYXRvciBmcm9tIGNyYXNoaW5nIHVudGlsIEdQVSBzdGF0ZQorICAgICAqIGNhbiBiZSBwcm9wZXJseSBzYXZlZCAvIHJlc29yZWQgaW4gc25hcHNob3QgZmlsZS4gKi8KKyAgICBpZiAoaHctPmh3X2dwdV9lbmFibGVkICYmIG9wdHMtPnNuYXBzdG9yYWdlICYmICghb3B0cy0+bm9fc25hcHNob3RfbG9hZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcHRzLT5ub19zbmFwc2hvdF9zYXZlKSkgeworICAgICAgICBkZXJyb3IoIlNuYXBzaG90cyBhbmQgZ3B1IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYXQgdGhpcyBwb2ludC4gUGxlYXNlIHR1cm4gb25lIG9mIHRoZW0gb2ZmLCBhbmQgcmVzdGFydCB0aGUgZW11bGF0b3IuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+Y2FtZXJhX2JhY2spIHsKKyAgICAgICAgLyogVmFsaWRhdGUgcGFyYW1ldGVyLiAqLworICAgICAgICBpZiAobWVtY21wKG9wdHMtPmNhbWVyYV9iYWNrLCAid2ViY2FtIiwgNikgJiYKKyAgICAgICAgICAgIHN0cmNtcChvcHRzLT5jYW1lcmFfYmFjaywgImVtdWxhdGVkIikgJiYKKyAgICAgICAgICAgIHN0cmNtcChvcHRzLT5jYW1lcmFfYmFjaywgIm5vbmUiKSkgeworICAgICAgICAgICAgZGVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciAtY2FtZXJhLWJhY2sgPG1vZGU+IHBhcmFtZXRlcjogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiVmFsaWQgdmFsdWVzIGFyZTogJ2VtdWxhdGVkJywgJ3dlYmNhbTxOPicsIG9yICdub25lJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBvcHRzLT5jYW1lcmFfYmFjayk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZody0+aHdfY2FtZXJhX2JhY2ssIG9wdHMtPmNhbWVyYV9iYWNrKTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+Y2FtZXJhX2Zyb250KSB7CisgICAgICAgIC8qIFZhbGlkYXRlIHBhcmFtZXRlci4gKi8KKyAgICAgICAgaWYgKG1lbWNtcChvcHRzLT5jYW1lcmFfZnJvbnQsICJ3ZWJjYW0iLCA2KSAmJgorICAgICAgICAgICAgc3RyY21wKG9wdHMtPmNhbWVyYV9mcm9udCwgImVtdWxhdGVkIikgJiYKKyAgICAgICAgICAgIHN0cmNtcChvcHRzLT5jYW1lcmFfZnJvbnQsICJub25lIikpIHsKKyAgICAgICAgICAgIGRlcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgLWNhbWVyYS1mcm9udCA8bW9kZT4gcGFyYW1ldGVyOiAlc1xuIgorICAgICAgICAgICAgICAgICAgICJWYWxpZCB2YWx1ZXMgYXJlOiAnZW11bGF0ZWQnLCAnd2ViY2FtPE4+Jywgb3IgJ25vbmUnXG4iLAorICAgICAgICAgICAgICAgICAgIG9wdHMtPmNhbWVyYV9mcm9udCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZody0+aHdfY2FtZXJhX2Zyb250LCBvcHRzLT5jYW1lcmFfZnJvbnQpOworICAgIH0KKworICAgIHN0cl9yZXNldCgmaHctPmF2ZF9uYW1lLCBhdmRJbmZvX2dldE5hbWUoYXZkKSk7CisKKyAgICAvKiBTZXR1cCBzY3JlZW4gZW11bGF0aW9uICovCisgICAgaWYgKG9wdHMtPnNjcmVlbikgeworICAgICAgICBpZiAoc3RyY21wKG9wdHMtPnNjcmVlbiwgInRvdWNoIikgJiYKKyAgICAgICAgICAgIHN0cmNtcChvcHRzLT5zY3JlZW4sICJtdWx0aS10b3VjaCIpICYmCisgICAgICAgICAgICBzdHJjbXAob3B0cy0+c2NyZWVuLCAibm8tdG91Y2giKSkgeworCisgICAgICAgICAgICBkZXJyb3IoIkludmFsaWQgdmFsdWUgZm9yIC1zY3JlZW4gPG1vZGU+IHBhcmFtZXRlcjogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiVmFsaWQgdmFsdWVzIGFyZTogdG91Y2gsIG11bHRpLXRvdWNoLCBvciBuby10b3VjaFxuIiwKKyAgICAgICAgICAgICAgICAgICBvcHRzLT5zY3JlZW4pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0cl9yZXNldCgmaHctPmh3X3NjcmVlbiwgb3B0cy0+c2NyZWVuKTsKKyAgICB9CisKKyAgICAvLyBETlMgc2VydmVyIHN1cHBvcnQuIFZhbGlkYXRlIHRoZSBvcHRpb24gaWYgYW55LCBmaW5kIHRoZSBETlMKKyAgICAvLyBzZXJ2ZXIgSVAgYWRkcmVzc2VzLCB0aGVuIHJld3JpdGUgdGhlIG9wdGlvbiB2YWx1ZSB3aXRoIHRoZQorICAgIC8vIHJlc3VsdHMuCisgICAgaWYgKGlzX3FlbXUyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZSwgZXZlcnl0aGluZyB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIGdsdWUKKyAgICAgICAgLy8gY29kZSAoc2VlIGFuZHJvaWQtcWVtdTItZ2x1ZS9xZW11LXNldHVwLWRucy1zZXJ2ZXJzLmNwcCkuCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUUVNVTEgb25seSBzdXBwb3J0cyBJUHY0IEROUyBzZXJ2ZXJzLCBzbyB1c2UKKyAgICAgICAgLy8gYW5kcm9pZF9kbnNfZ2V0X3NlcnZlcnMoKSB0aGF0IGZpbHRlcnMgb3V0IGFueSBJUHY2IHNlcnZlcgorICAgICAgICAvLyBmcm9tIHRoZSAtZG5zLXNlcnZlciBsaXN0LgorICAgICAgICB1aW50MzJfdCBkbnNTZXJ2ZXJzW0FORFJPSURfTUFYX0ROU19TRVJWRVJTXSA9IHt9OworICAgICAgICBpbnQgZG5zQ291bnQgPSBhbmRyb2lkX2Ruc19nZXRfc2VydmVycyhvcHRzLT5kbnNfc2VydmVyLCBkbnNTZXJ2ZXJzKTsKKyAgICAgICAgaWYgKGRuc0NvdW50IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFJld3JpdGUgdGhlIG9wdGlvbiB3aXRoIEROUyBzZXJ2ZXIgSVBzLgorICAgICAgICBTVFJBTExPQ19ERUZJTkUobmV3T3B0aW9uKTsKKyAgICAgICAgaW50IG47CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBkbnNDb3VudDsgKytuKSB7CisgICAgICAgICAgICB1aW50MzJfdCBpcCA9IGRuc1NlcnZlcnNbbl07CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfZm9ybWF0KG5ld09wdGlvbiwgIiVzJWQuJWQuJWQuJWQiLCAobiA+IDApID8gIiwiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KShpcCA+PiAyNCksICh1aW50OF90KShpcCA+PiAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KShpcCA+PiA4KSwgKHVpbnQ4X3QpKGlwKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RyX3Jlc2V0KCZvcHRzLT5kbnNfc2VydmVyLCBzdHJhbGxvY19jc3RyKG5ld09wdGlvbikpOworICAgICAgICBzdHJhbGxvY19yZXNldChuZXdPcHRpb24pOworICAgIH0KKworICAgIC8vIFVuaXggcGlwZSBwYXRocworICAgIHsKKyAgICAgICAgUGFyYW1MaXN0KiBvcHQgPSBvcHRzLT51bml4X3BpcGU7CisgICAgICAgIHdoaWxlIChvcHQpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfdW5peF9waXBlc19hZGRfYWxsb3dlZF9wYXRoKG9wdC0+cGFyYW0pOworICAgICAgICAgICAgb3B0ID0gb3B0LT5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgKmV4aXRfc3RhdHVzID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWNvbW1vbi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NDI5MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTA2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2h3LWNvbmZpZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYXZkL2luZm8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gTk9URTogVGhpcyBpbmNsdWRlIGlzIG9ubHkgaGVyZSB0byBwcmV2ZW50IFFFTVUyIGZyb20gZmFpbGluZyB0byBjb21waWxlCisvLyAgICAgICBjYWxscyB0byBzdHJfcmVzZXQsIHdob3NlIGRlY2xhcmF0aW9uIGhhcyBiZWVuIG1vdmVkIHRvCisvLyAgICAgICBhbmRyb2lkL3V0aWxzL3N0cmluZy5oLgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5nLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFNwZWNpYWwgdmFsdWUgcmV0dXJuCisjZGVmaW5lIEVNVUxBVE9SX0VYSVRfU1RBVFVTX1BPU0lUSU9OQUxfUUVNVV9QQVJBTUVURVIgICgtMSkKKworLy8gUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIHNldHVwcyB8b3B0fCBhbmQgfGh3fCBzdHJ1Y3R1cmVzLgorLy8gfHBfYXJnY3wgYW5kIHxwX2FyZ3Z8IGFyZSBwb2ludGVycyB0byB0aGUgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMKKy8vIHJlY2VpdmVkIGZyb20gbWFpbigpLiB8dGFyZ2V0QXJjaHwgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgZm9yCisvLyBwbGF0Zm9ybSBidWlsZHMuIHxpc19xZW11MnwgaXMgdHJ1ZSBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIFFFTVUyLAorLy8gZmFsc2UgaWYgY2FsbGVkIGZyb20gdGhlIGNsYXNzaWMgZW11bGF0b3IuIHxvcHR8IGFuZCB8aHd8IGFyZQorLy8gY2FsbGVyLXByb3ZpZGVkIHN0cnVjdHVyZXMgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBmdW5jdGlvbi4KKy8vCisvLyBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cyB8KnRoZV9hdmR8IHRvIHRoZSBhZGRyZXNzIG9mIGEgbmV3CisvLyBBdmRJbmZvIGluc3RhbmNlLiBPbiBmYWlsdXJlLCByZXR1cm4gZmFsc2UgYW5kIHNldHMgfCpleGl0X3N0YXR1c3wKKy8vIHRvIGEgcHJvY2VzcyBleGl0IHN0YXR1cy4KKy8vCisvLyBOT1RFOiBBcyBhIHNwZWNpYWwgY2FzZSB8KmV4aXRfc3RhdHVzfCB3aWxsIGJlIHNldCB0bworLy8gRU1MQVRPUl9FWElUX1NUQVRVU19QT1NJVElPTkFMX1FFTVVfUEFSQU1FVEVSIG9uIGZhaWx1cmUgdG8gaW5kaWNhdGUgdGhhdAorLy8gYSBRRU1VIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHdhcyBkZXRlY3RlZC4gVGhlIGNhbGxlciBzaG91bGQgY29weSBhbGwKKy8vIGFyZ3VtZW50cyBmcm9tIHwqcF9hcmdjfCBhbmQgfCpwX2FyZ3Z8IGFuZCBjYWxsIHRoZSBRRU1VIG1haW4gZnVuY3Rpb24KKy8vIHdpdGggdGhlbSwgdGhlbiBleGl0LgorYm9vbCBlbXVsYXRvcl9wYXJzZUNvbW1vbkNvbW1hbmRMaW5lT3B0aW9ucyhpbnQqIHBfYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqKiBwX2FyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRhcmdldEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcWVtdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRPcHRpb25zKiBvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRId0NvbmZpZyogaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF2ZEluZm8qKiB0aGVfYXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGV4aXRfc3RhdHVzKTsKKworLy8gSEFDSzogVmFsdWUgd2lsbCBiZSB0cnVlIGlmIGVtdWxhdG9yX3BhcnNlQ29tbW9uQ29tbWFuZExpbmVPcHRpb25zKCkKKy8vICAgICAgIGhhcyBzZWVuIGEgbmV0d29yay1yZWxhdGVkIG9wdGlvbiAoZS5nLiAtbmV0c3BlZWQpLiBUaGlzIGlzCisvLyAgICAgICB1bmZvcnR1bmF0ZWx5IHVzZWQgYnkgdGhlIFF0IFVJIGNvZGUuCisvLworLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gZGVhbCB3aXRoIHRoaXMuCitleHRlcm4gYm9vbCBlbXVsYXRvcl9oYXNfbmV0d29ya19vcHRpb247CisKKy8qIENvbW1vbiByb3V0aW5lcyB1c2VkIGJ5IGJvdGggYW5kcm9pZC1xZW11MS1nbHVlL21haW4uYyBhbmQgYW5kcm9pZC9tYWluLXVpLmMgKi8KKworLy8gRm9yIFFFTVUyIG9ubHkKKyNkZWZpbmUgcmVhc3NpZ25fc3RyaW5nKHBzdHIsIHZhbHVlKSBzdHJfcmVzZXQocHN0ciwgdmFsdWUpCisKK3Vuc2lnbmVkIGNvbnZlcnRCeXRlc1RvTUIoIHVpbnQ2NF90ICBzaXplICk7Cit1aW50NjRfdCBjb252ZXJ0TUJUb0J5dGVzKCB1bnNpZ25lZCAgbWVnYUJ5dGVzICk7CisKKyNkZWZpbmUgTkVUV09SS19TUEVFRF9ERUZBVUxUICAiZnVsbCIKKyNkZWZpbmUgTkVUV09SS19ERUxBWV9ERUZBVUxUICAibm9uZSIKKworZXh0ZXJuIGNvbnN0IGNoYXIqICBhbmRyb2lkX3NraW5fbmV0X3NwZWVkOworZXh0ZXJuIGNvbnN0IGNoYXIqICBhbmRyb2lkX3NraW5fbmV0X2RlbGF5OworCit0eXBlZGVmIGVudW0geworICAgIEFDQ0VMX09GRiA9IDAsCisgICAgQUNDRUxfT04gPSAxLAorICAgIEFDQ0VMX0FVVE8gPSAyLAorfSBDcHVBY2NlbE1vZGU7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzdGF0aWMgY29uc3QgY2hhciBrQWNjZWxlcmF0b3JbXSA9ICJLVk0iOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFbmFibGVBY2NlbGVyYXRvcltdID0gIi1lbmFibGUta3ZtIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRGlzYWJsZUFjY2VsZXJhdG9yW10gPSAiLWRpc2FibGUta3ZtIjsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0FjY2VsZXJhdG9yW10gPSAiSW50ZWwgSEFYTSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0VuYWJsZUFjY2VsZXJhdG9yW10gPSAiLWVuYWJsZS1oYXgiOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtEaXNhYmxlQWNjZWxlcmF0b3JbXSA9ICItZGlzYWJsZS1oYXgiOworI2VuZGlmCisKKy8qCisgKiBQYXJhbToKKyAqICBvcHRzIC0gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIG1haW4oKQorICogIGF2ZCAtIEFWRCBpbmZvIGNvbnRhaW5pZyBwYXRocyBmb3IgdGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uCisgKiAgYWNjZWxfbW9kZSAtIGluZGljYXRlcyBhY2NlbGVyYXRpb24gbW9kZSBiYXNlZCBvbiBjb21tYW5kIGxpbmUKKyAqICBzdGF0dXMgLSBhIHN0cmluZyBhYm91dCBjcHUgYWNjZWxlcmF0aW9uIHN0YXR1cywgbXVzdCBiZSBub3QgbnVsbC4KKyAqIFJldHVybjogaWYgY3B1IGFjY2VsZXJhdGlvbiBpcyBhdmFpbGFibGUKKyAqLworYm9vbCBoYW5kbGVDcHVBY2NlbGVyYXRpb24oQW5kcm9pZE9wdGlvbnMqIG9wdHMsIGNvbnN0IEF2ZEluZm8qIGF2ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENwdUFjY2VsTW9kZSogYWNjZWxfbW9kZSwgY2hhcioqIGFjY2VsX3N0YXR1cyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tZW11Z2wuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tZW11Z2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODM0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1lbXVnbC5jcHAKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL21haW4tZW11Z2wuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvdXRpbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmluZy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZENQdHI7CisKK2Jvb2wgYW5kcm9pZEVtdWdsQ29uZmlnSW5pdChFbXVnbENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF2ZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXZkQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNHb29nbGVBcGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdwdU9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2FudGVkQml0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vV2luZG93KSB7CisgICAgYm9vbCBncHVFbmFibGVkID0gZmFsc2U7CisgICAgU2NvcGVkQ1B0cjxjaGFyPiBncHVNb2RlOworCisgICAgaWYgKGF2ZE5hbWUpIHsKKyAgICAgICAgZ3B1TW9kZS5yZXNldChwYXRoX2dldEF2ZEdwdU1vZGUoYXZkTmFtZSkpOworICAgICAgICBncHVFbmFibGVkID0gKGdwdU1vZGUuZ2V0KCkgIT0gbnVsbHB0cik7CisgICAgfSBlbHNlIGlmICghZ3B1T3B0aW9uKSB7CisgICAgICAgIC8vIEluIHRoZSBjYXNlIG9mIGEgcGxhdGZvcm0gYnVpbGQsIHVzZSB0aGUgJ2F1dG8nIG1vZGUgYnkgZGVmYXVsdC4KKyAgICAgICAgZ3B1TW9kZS5yZXNldCg6OnN0cmR1cCgiYXV0byIpKTsKKyAgICAgICAgZ3B1RW5hYmxlZCA9IHRydWU7CisgICAgfQorCisgICAgLy8gRGV0ZWN0IGlmIHRoaXMgaXMgZ29vZ2xlIEFQSSdzCisKKyAgICBib29sIGhhc0d1ZXN0UmVuZGVyZXIgPSAoIXN0cmNtcChhdmRBcmNoLCAieDg2IikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChhdmRBcmNoLCAieDg2XzY0IikpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcGlMZXZlbCA+PSAyMykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzR29vZ2xlQXBpczsKKworICAgIGJvb2wgYmxhY2tsaXN0ZWQgPSBmYWxzZTsKKyAgICBib29sIG9uQmxhY2tsaXN0ID0gZmFsc2U7CisKKyAgICBjb25zdCBjaGFyKiBncHVDaG9pY2UgPSBncHVPcHRpb24gPyBncHVPcHRpb24gOiBncHVNb2RlLmdldCgpOworCisgICAgLy8gSWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIHJlbmRlcmVyCisgICAgLy8gdGhhdCBpcyBuZWl0aGVyICJhdXRvIiBub3IgImhvc3QiLAorICAgIC8vIGRvbid0IGNoZWNrIHRoZSBibGFja2xpc3QuCisgICAgLy8gT25seSBjaGVjayB0aGUgYmxhY2tsaXN0IGZvciAnYXV0bycgb3IgJ2hvc3QnIG1vZGUuCisgICAgaWYgKGdwdUNob2ljZSAmJiAoIXN0cmNtcChncHVDaG9pY2UsICJhdXRvIikgfHwKKyAgICAgICAgICAgICFzdHJjbXAoZ3B1Q2hvaWNlLCAiaG9zdCIpKSkgeworICAgICAgICAgb25CbGFja2xpc3QgPSBpc0hvc3RHcHVCbGFja2xpc3RlZCgpOworICAgIH0KKworICAgIGlmIChhdmROYW1lKSB7CisgICAgICAgIC8vIFRoaXMgaXMgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS4KKyAgICAgICAgU2NvcGVkQ1B0cjxjb25zdCBjaGFyPiB0ZXN0R3B1QmxhY2tsaXN0KAorICAgICAgICAgICAgICAgIHBhdGhfZ2V0QXZkR3B1QmxhY2tsaXN0ZWQoYXZkTmFtZSkpOworICAgICAgICBpZiAodGVzdEdwdUJsYWNrbGlzdC5nZXQoKSkgeworICAgICAgICAgICAgb25CbGFja2xpc3QgPSAhc3RyY21wKHRlc3RHcHVCbGFja2xpc3QuZ2V0KCksICJ5ZXMiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChncHVDaG9pY2UgJiYgIXN0cmNtcChncHVDaG9pY2UsICJhdXRvIikpIHsKKyAgICAgICAgaWYgKG9uQmxhY2tsaXN0KSB7CisgICAgICAgICAgICBkd2FybmluZygiWW91ciBHUFUgZHJpdmVycyBtYXkgaGF2ZSBhIGJ1Zy4gIgorICAgICAgICAgICAgICAgICAgICAgIlN3aXRjaGluZyB0byBzb2Z0d2FyZSByZW5kZXJpbmcuIik7CisgICAgICAgIH0KKyAgICAgICAgYmxhY2tsaXN0ZWQgPSBvbkJsYWNrbGlzdDsKKyAgICAgICAgc2V0R3B1QmxhY2tsaXN0U3RhdHVzKGJsYWNrbGlzdGVkKTsKKyAgICB9IGVsc2UgaWYgKG9uQmxhY2tsaXN0ICYmIGdwdUNob2ljZSAmJgorICAgICAgICAgICAgKCFzdHJjbXAoZ3B1Q2hvaWNlLCAiaG9zdCIpIHx8ICFzdHJjbXAoZ3B1Q2hvaWNlLCAib24iKSkpIHsKKyAgICAgICAgZHdhcm5pbmcoIllvdXIgR1BVIGRyaXZlcnMgbWF5IGhhdmUgYSBidWcuICIKKyAgICAgICAgICAgICAgICAgIklmIHlvdSBleHBlcmllbmNlIGdyYXBoaWNhbCBpc3N1ZXMsICIKKyAgICAgICAgICAgICAgICAgInBsZWFzZSBjb25zaWRlciBzd2l0Y2hpbmcgdG8gc29mdHdhcmUgcmVuZGVyaW5nLiIpOworICAgIH0KKworICAgIGJvb2wgcmVzdWx0ID0gZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgIGNvbmZpZywgZ3B1RW5hYmxlZCwgZ3B1TW9kZS5nZXQoKSwgZ3B1T3B0aW9uLCB3YW50ZWRCaXRuZXNzLAorICAgICAgICAgICAgbm9XaW5kb3csIGJsYWNrbGlzdGVkLCBoYXNHdWVzdFJlbmRlcmVyKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1lbXVnbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tZW11Z2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2IwYTdjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tZW11Z2wuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBFbXVnbENvbmZpZyBpbnN0YW5jZSB8Y29uZmlnfAorLy8gd2l0aCBhcHByb3ByaWF0ZSBzZXR0aW5ncyBjb3JyZXNwb25kaW5nIHRvIGFuIEFWRCBzdGFydHVwIGNvbmZpZ3VyYXRpb24uCisvLyB8YXZkTmFtZXwgaXMgdGhlIEFWRCBuYW1lLCBvciBudWxscHRyIHRvIGluZGljYXRlIGEgcGxhdGZvcm0gYnVpbGQuCisvLyB8YXZkQXJjaHwgaXMgdGhlIEFWRCBhcmNoaXRlY3R1cmUgKGUuZy4gJ2FybTY0JykKKy8vIHxhcGlMZXZlbHwgaXMgdGhlIEFWRCBBUEkgbGV2ZWwuCisvLyB8aGFzR29vZ2xlQXBpc3wgc2hvdWxkIGJlIHRydWUgaWZmIHRoZSBzeXN0ZW0gaW1hZ2UgcHJvdmlkZXMgR29vZ2xlIEFQSXMuCisvLyB8Z3B1T3B0aW9ufCBpcyB0aGUgdmFsdWUgb2YgdGhlICctZ3B1JyBvcHRpb24sIGlmIGFueS4KKy8vIHx3YW50ZWRCaXRuZXNzfCBpcyB0aGUgd2FudGVkIGJpdG5lc3Mgb2YgdGhlIGVtdWxhdGlvbiBlbmdpbmUuIEEgdmFsdWUKKy8vIG9mIDAgbWVhbnMgdXNlIHRoZSBjdXJyZW50IHByb2dyYW0ncyBiaXRuZXNzLgorLy8gfG5vV2luZG93fCBpcyB0cnVlIGlmZiB0aGUgLW5vLXdpbmRvdyBvcHRpb24gd2FzIHVzZWQuCisvLyBPbiBzdWNjZXNzLCBpbml0aWFsaXplcyB8Y29uZmlnfCBhbmQgcmV0dXJucyB0cnVlLiBSZXR1cm4gZmFsc2Ugb24gZmFpbHVyZS4KK2Jvb2wgYW5kcm9pZEVtdWdsQ29uZmlnSW5pdChFbXVnbENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF2ZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXZkQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNHb29nbGVBcGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdwdU9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2FudGVkQml0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5vV2luZG93KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1oZWxwLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWhlbHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzM1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1oZWxwLmNwcApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1oZWxwLmgiCisKKy8vIFRPRE86IFJlLWltcGxlbWVudCBhbmRyb2lkL2hlbHAuYyBpbiBDKysgdG8gZ2V0IHJpZCBvZiBzdHJhbGxvYy5oCisjaW5jbHVkZSAiYW5kcm9pZC9oZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJhbGxvYy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IGVtdWxhdG9yX3BhcnNlSGVscE9wdGlvbihjb25zdCBjaGFyKiBvcHQpIHsKKyAgICBpZiAoIXN0cmNtcChvcHQsICItaGVscCIpKSB7CisgICAgICAgIFNUUkFMTE9DX0RFRklORShvdXQpOworICAgICAgICBhbmRyb2lkX2hlbHBfbWFpbihvdXQpOworICAgICAgICBwcmludGYoIiUuKnMiLCBvdXQtPm4sIG91dC0+cyk7CisgICAgICAgIHN0cmFsbG9jX3Jlc2V0KG91dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghc3RybmNtcChvcHQsICItaGVscC0iLDYpKSB7CisgICAgICAgIFNUUkFMTE9DX0RFRklORShvdXQpOworICAgICAgICBvcHQgKz0gNjsKKworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICJhbGwiKSkgeworICAgICAgICAgICAgYW5kcm9pZF9oZWxwX2FsbChvdXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFuZHJvaWRfaGVscF9mb3Jfb3B0aW9uKG9wdCwgb3V0KSA9PSAwKSB7CisgICAgICAgICAgICAvKiBvayAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFuZHJvaWRfaGVscF9mb3JfdG9waWMob3B0LCBvdXQpID09IDApIHsKKyAgICAgICAgICAgIC8qIG9rICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dC0+biA+IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4lLipzIiwgb3V0LT5uLCBvdXQtPnMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uOiAtaGVscC0lc1xuIiwgb3B0KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJwbGVhc2UgdXNlIC1oZWxwIGZvciBhIGxpc3Qgb2YgdmFsaWQgdG9waWNzXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWhlbHAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWhlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzUwNTIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4taGVscC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gVHJ5IHRvIHBhcnNlIHxvcHRpb258IGFzIGEgY29tbWFuZC1saW5lIGhlbHAgb3B0aW9uLCB3aGljaCBjYW4gYmUgIi1oZWxwIgorLy8gb3IgIi1oZWxwLTxvcHRpb24+IiBvciAiLWhlbHAtPHRvcGljPiIuIFRoZSBmb2xsb3dpbmcgY2FzZXMgYXJlIHBvc3NpYmxlOgorLy8gLSB8b3B0aW9ufCBpcyBub3QgJy1oZWxwJyBub3Igc3RhcnRzIHdpdGggJy1oZWxwLScsIHRoZSBmdW5jdGlvbiByZXR1cm5zIC0xLgorLy8gLSB8b3B0aW9ufCBpcyAnLWhlbHAtPHVua25vd24+JyB3aGVyZSA8dW5rbm93bj4gaXMgYW4gdW5rbm93biBvcHRpb24gb3IKKy8vICAgaGVscCB0b3BpYy4gVGhlIGZ1bmN0aW9uIHByaW50cyBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgcmV0dXJucworLy8gICBhbiBleGl0IHN0YXR1cyBvZiAxLgorLy8gLSBvdGhlcndpc2UsIGl0IHByaW50cyB0aGUgaGVscCB0byBzdGRvdXQgYW5kIHJldHVybnMgYW4gZXhpdCBzdGF0dXMgb2YgMC4KK2ludCBlbXVsYXRvcl9wYXJzZUhlbHBPcHRpb24oY29uc3QgY2hhciogb3B0aW9uKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1rZXJuZWwtcGFyYW1ldGVycy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1rZXJuZWwtcGFyYW1ldGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2YWZiMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLWtlcm5lbC1wYXJhbWV0ZXJzLmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL21haW4ta2VybmVsLXBhcmFtZXRlcnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Rucy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdDsKKworY2hhciogZW11bGF0b3JfZ2V0S2VybmVsUGFyYW1ldGVycyhjb25zdCBBbmRyb2lkT3B0aW9ucyogb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0QXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXJuZWxTZXJpYWxQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF2ZEtlcm5lbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRHbGVzRW11bGF0aW9uTW9kZSBnbGVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZ2xlc0ZyYW1lYnVmZmVyQ01BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUWVtdTIpIHsKKyAgICBhbmRyb2lkOjpQYXJhbWV0ZXJMaXN0IHBhcmFtczsKKyAgICBib29sIGlzWDg2aXNoID0gIXN0cmNtcCh0YXJnZXRBcmNoLCAieDg2IikgfHwgIXN0cmNtcCh0YXJnZXRBcmNoLCAieDg2XzY0Iik7CisKKyAgICAvLyBXZSBhbHdheXMgZm9yY2UgcWVtdT0xIHdoZW4gcnVubmluZyBpbnNpZGUgUUVNVS4KKyAgICBwYXJhbXMuYWRkKCJxZW11PTEiKTsKKworICAgIHBhcmFtcy5hZGRGb3JtYXQoImFuZHJvaWRib290LmhhcmR3YXJlPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGlzUWVtdTIgPyAicmFuY2h1IiA6ICJnb2xkZmlzaCIpOworCisgICAgaWYgKGlzWDg2aXNoKSB7CisgICAgICAgIHBhcmFtcy5hZGQoImNsb2Nrc291cmNlPXBpdCIpOworICAgIH0KKworICAgIGFuZHJvaWQ6OnNldHVwVmlydHVhbFNlcmlhbFBvcnRzKAorICAgICAgICAgICAgJnBhcmFtcywgbnVsbHB0ciwgYXBpTGV2ZWwsIHRhcmdldEFyY2gsIGtlcm5lbFNlcmlhbFByZWZpeCwgaXNRZW11MiwKKyAgICAgICAgICAgIG9wdHMtPnNob3dfa2VybmVsLCBvcHRzLT5sb2djYXQgfHwgb3B0cy0+c2hlbGwsIG9wdHMtPnNoZWxsX3NlcmlhbCk7CisKKyAgICBpZiAoIW9wdHMtPnNob3dfa2VybmVsKSB7CisgICAgICAgIC8vIFJlcXVpcmVkIHRvIHByZXZlbnQga2VybmVsIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gZnJhbWVidWZmZXIKKyAgICAgICAgLy8gKHRocm91Z2ggJ3ZjMCcsIGkuZS4gdmlydHVhbCBjb25zb2xlIDApLgorICAgICAgICBwYXJhbXMuYWRkKCJjb25zb2xlPTAiKTsKKyAgICB9CisKKyAgICBwYXJhbXMuYWRkSWYoImFuZHJvaWQuY2hlY2tqbmk9MSIsICFvcHRzLT5ub19qbmkpOworICAgIHBhcmFtcy5hZGRJZigiYW5kcm9pZC5ib290YW5pbT0wIiwgb3B0cy0+bm9fYm9vdF9hbmltKTsKKworICAgIC8vIHFlbXUuZ2xlcyBpcyB1c2VkIHRvIHBhc3MgdGhlIEdQVSBlbXVsYXRpb24gbW9kZSB0byB0aGUgZ3Vlc3QKKyAgICAvLyB0aHJvdWdoIGtlcm5lbCBwYXJhbWV0ZXJzLiBOb3RlIHRoYXQgdGhlIHJvLm9wZW5nbGVzLnZlcnNpb24KKyAgICAvLyBib290IHByb3BlcnR5IG11c3QgYWxzbyBiZSBkZWZpbmVkIGZvciB8Z2xlcyA+IDB8LCBidXQgdGhpcworICAgIC8vIGlzIG5vdCBoYW5kbGVkIGhlcmUgKHNlZSB2bC1hbmRyb2lkLmMgZm9yIFFFTVUxKS4KKyAgICB7CisgICAgICAgIGludCBnbGVzOworICAgICAgICBzd2l0Y2ggKGdsZXNNb2RlKSB7CisgICAgICAgICAgICBjYXNlIGtBbmRyb2lkR2xlc0VtdWxhdGlvbkhvc3Q6IGdsZXMgPSAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga0FuZHJvaWRHbGVzRW11bGF0aW9uR3Vlc3Q6IGdsZXMgPSAyOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGdsZXMgPSAwOworICAgICAgICB9CisgICAgICAgIHBhcmFtcy5hZGRGb3JtYXQoInFlbXUuZ2xlcz0lZCIsIGdsZXMpOworICAgIH0KKworICAgIGlmIChpc1FlbXUyICYmIGFuZHJvaWQ6OmZlYXR1cmVjb250cm9sOjppc0VuYWJsZWQoYW5kcm9pZDo6ZmVhdHVyZWNvbnRyb2w6OkVuY3J5cHRVc2VyRGF0YSkpIHsKKyAgICAgICAgcGFyYW1zLmFkZCgicWVtdS5lbmNyeXB0PTEiKTsKKyAgICB9CisKKyAgICAvLyBBZGRpdGlvbmFsIG1lbW9yeSBmb3Igc29mdHdhcmUgcmVuZGVyZXJzIChlLmcuLCBTd2lmdFNoYWRlcikKKyAgICBpZiAoZ2xlc0ZyYW1lYnVmZmVyQ01BID4gMCkgeworICAgICAgICBwYXJhbXMuYWRkRm9ybWF0KCJjbWE9JSIgUFJJdTY0ICJNIiwgZ2xlc0ZyYW1lYnVmZmVyQ01BKTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+bG9nY2F0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhcmFtID0gb3B0cy0+bG9nY2F0OworICAgICAgICAvLyBSZXBsYWNlIGFueSBzcGFjZSB3aXRoIGEgY29tbWEuCisgICAgICAgIHN0ZDo6cmVwbGFjZShwYXJhbS5iZWdpbigpLCBwYXJhbS5lbmQoKSwgJyAnLCAnLCcpOworICAgICAgICBzdGQ6OnJlcGxhY2UocGFyYW0uYmVnaW4oKSwgcGFyYW0uZW5kKCksICdcdCcsICcsJyk7CisgICAgICAgIHBhcmFtcy5hZGRGb3JtYXQoImFuZHJvaWRib290LmxvZ2NhdD0lcyIsIHBhcmFtKTsKKyAgICB9CisKKyAgICBpZiAob3B0cy0+Ym9vdGNoYXJ0KSB7CisgICAgICAgIHBhcmFtcy5hZGRGb3JtYXQoImFuZHJvaWRib290LmJvb3RjaGFydD0lcyIsIG9wdHMtPmJvb3RjaGFydCk7CisgICAgfQorCisgICAgaWYgKG9wdHMtPnNlbGludXgpIHsKKyAgICAgICAgcGFyYW1zLmFkZEZvcm1hdCgiYW5kcm9pZGJvb3Quc2VsaW51eD0lcyIsIG9wdHMtPnNlbGludXgpOworICAgIH0KKworICAgIGlmIChvcHRzLT5kbnNfc2VydmVyKSB7CisgICAgICAgIHVpbnQzMl90IGlwc1tBTkRST0lEX01BWF9ETlNfU0VSVkVSU107CisgICAgICAgIGludCBkbnNDb3VudCA9IGFuZHJvaWRfZG5zX2dldF9zZXJ2ZXJzKG9wdHMtPmRuc19zZXJ2ZXIsIGlwcyk7CisgICAgICAgIGlmIChkbnNDb3VudCA+IDEpIHsKKyAgICAgICAgICAgIHBhcmFtcy5hZGRGb3JtYXQoIm5kbnM9JWQiLCBkbnNDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZkS2VybmVsUGFyYW1ldGVycyAmJiBhdmRLZXJuZWxQYXJhbWV0ZXJzWzBdKSB7CisgICAgICAgIHBhcmFtcy5hZGQoYXZkS2VybmVsUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtcy50b0NTdHJpbmdDb3B5KCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1rZXJuZWwtcGFyYW1ldGVycy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4ta2VybmVsLXBhcmFtZXRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGMzMzhkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4ta2VybmVsLXBhcmFtZXRlcnMuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIExpc3Qgb2YgdmFsdWVzIGRlc2NyaWJpbmcgaG93IEVHTC9HTEVTIGVtdWxhdGlvbiBzaG91bGQgd29yayBpbiBhIGdpdmVuCisvLyBBbmRyb2lkIHZpcnR1YWwgZGV2aWNlLgorLy8KKy8vIGtBbmRyb2lkR2xlc0VtdWxhdGlvbk9mZgorLy8gICAgTWVhbnMgdGhlcmUgaXMgbm8gR1BVIGVtdWxhdGlvbiwgZXF1aXZhbGVudCB0byAiLWdwdSBvZmYiIGFuZCBpbnN0cnVjdHMKKy8vICAgIHRoZSBndWVzdCBzeXN0ZW0gdG8gdXNlIGl0cyBvbGQgR0xFUyAxLnggc29mdHdhcmUgcmVuZGVyZXIuCisvLworLy8ga0FuZHJvaWRHbGVzRW11bGF0aW9uSG9zdAorLy8gICAgTWVhbnMgSG9zdCBHUFUgZW11bGF0aW9uIGlzIGJlaW5nIHVzZWQuIEFsbCBFR0wvR0xFUyBjb21tYW5kcyBhcmUKKy8vICAgIHNlbnQgdG8gdGhlIGhvc3QgR1BVIG9yIENQVSB0aHJvdWdoIGEgc2ltcGxlIHdpcmUgcHJvdG9jb2wuIFRoaXMKKy8vICAgIGNvcnJlc3BvbmRzIHRvICItZ3B1IGhvc3QiIGFuZCAiLWdwdSBtZXNhIi4KKy8vCisvLyBrQW5kcm9pZEdsZXNFbXVsYXRpb25HdWVzdAorLy8gICAgTWVhbnMgYSBndWVzdCBHTEVTIDIueCBsaWJyYXJ5IChlLmcuIFN3aWZ0U2hhZGVyKSBpcyBiZWluZyB1c2VkIGluCisvLyAgICB0aGUgZ3Vlc3QuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIGFjY2VsZXJhdGVkIGVtdWxhdGlvbiwgb3IKKy8vICAgIHJlc3VsdHMgd2lsbCBiZSB2ZXJ5IHZlcnkgc2xvdy4KK3R5cGVkZWYgZW51bSB7CisgICAga0FuZHJvaWRHbGVzRW11bGF0aW9uT2ZmID0gMCwKKyAgICBrQW5kcm9pZEdsZXNFbXVsYXRpb25Ib3N0LAorICAgIGtBbmRyb2lkR2xlc0VtdWxhdGlvbkd1ZXN0LAorfSBBbmRyb2lkR2xlc0VtdWxhdGlvbk1vZGU7CisKKy8vIFJldHVybiBhIGhlYXAtYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBrZXJuZWwgcGFyYW1ldGVyLgorLy8gfG9wdHN8IGNvcnJlc3BvbmRzIHRvIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhZnRlciB0aGV5IGhhdmUgYmVlbgorLy8gcHJvY2Vzc2VkIGJ5IGVtdWxhdG9yX3BhcnNlQ29tbW9uQ29tbWFuZExpbmVPcHRpb25zKCkuCisvLyB8dGFyZ2V0QXJjaHwgaXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIChlLmcuICdhcm02NCcpCisvLyB8YXBpTGV2ZWx8IGlzIHRoZSBBVkQncyBBUEkgbGV2ZWwuCisvLyB8a2VybmVsU2VyaWFsUHJlZml4fCBpcyB0aGUgZ3Vlc3QgdHR5IGRldmljZSBwcmVmaXggKGUuZy4gJ3R0eVMnKQorLy8gfGF2ZEtlcm5lbFBhcmFtZXRlcnN8IGFyZSB0aGUgb3B0aW9uYWwgZXh0cmEga2VybmVsIHBhcmFtZXRlcnMgc3RvcmVkCisvLyBpbiB0aGUgQVZEJ3Mga2VybmVsLnBhcmFtZXRlcnMgaGFyZHdhcmUgcHJvcGVydHksIGlmIGFueS4gVGhleSB3aWxsCisvLyBiZSBhcHBlbmRlZCB0byB0aGUgcmVzdWx0LgorLy8gfGdsZXNNb2RlfCBpcyB0aGUgRUdML0dMRVMgZW11bGF0aW9uIG1vZGUuCisvLyB8Z2xlc0d1ZXN0Q21hTUJ8IGlzIHRoZSBzaXplIGluIG1lZ2FieXRlcyBvZiB0aGUgY29udGlndW91cyBtZW1vcnkKKy8vIGFsbG9jYXRpb24gdG8gYmUgdXNlZCB3aGVuIHxnbGVzTW9kZXwgaXMga0FuZHJvaWRHbGVzRW11bGF0aW9uR3Vlc3QuCisvLyBBIHZhbHVlIG9mIDAgYWxzbyBpbmRpY2F0ZXMgdG8gaWdub3JlIHRoaXMgc2V0dGluZy4KKy8vIHxpc1FlbXUyfCBpcyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBjYWxsZWQgZnJvbSBRRU1VMiwgb3RoZXJ3aXNlCisvLyBRRU1VMSBpcyBhc3N1bWVkLgorY2hhciogZW11bGF0b3JfZ2V0S2VybmVsUGFyYW1ldGVycyhjb25zdCBBbmRyb2lkT3B0aW9ucyogb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0QXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXJuZWxTZXJpYWxQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF2ZEtlcm5lbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRHbGVzRW11bGF0aW9uTW9kZSBnbGVzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZ2xlc0d1ZXN0Q21hTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNRZW11Mik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tcWVtdS1wYXJhbWV0ZXJzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLXFlbXUtcGFyYW1ldGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmZWNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tYWluLXFlbXUtcGFyYW1ldGVycy5jcHAKQEAgLTAsMCArMSwyMzYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9tYWluLWNvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1xZW11LXBhcmFtZXRlcnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9QYXJhbWV0ZXJMaXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vU2V0dXBQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0cnVjdCBRZW11UGFyYW1ldGVycyB7CisgICAgYW5kcm9pZDo6UGFyYW1ldGVyTGlzdCBwYXJhbXM7Cit9OworCitzaXplX3QgcWVtdV9wYXJhbWV0ZXJzX3NpemUoY29uc3QgUWVtdVBhcmFtZXRlcnMqIHBhcmFtcykgeworICAgIHJldHVybiBwYXJhbXMtPnBhcmFtcy5zaXplKCk7Cit9CisKK2NoYXIqKiBxZW11X3BhcmFtZXRlcnNfYXJyYXkoY29uc3QgUWVtdVBhcmFtZXRlcnMqIHBhcmFtcykgeworICAgIHJldHVybiBwYXJhbXMtPnBhcmFtcy5hcnJheSgpOworfQorCit2b2lkIHFlbXVfcGFyYW1ldGVyc19mcmVlKFFlbXVQYXJhbWV0ZXJzKiBwYXJhbXMpIHsKKyAgICBkZWxldGUgcGFyYW1zOworfQorCitRZW11UGFyYW1ldGVycyogcWVtdV9wYXJhbWV0ZXJzX2NyZWF0ZShjb25zdCBjaGFyKiBhcmd2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxZW11QXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBxZW11QXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRPcHRpb25zKiBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXZkSW5mbyogYXZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaW5pdGlhbEtlcm5lbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhbmRyb2lkSHdJbmlQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1FlbXUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGFyZ2V0QXJjaCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxRZW11UGFyYW1ldGVycz4gcmVzdWx0KG5ldyBRZW11UGFyYW1ldGVycyk7CisgICAgYW5kcm9pZDo6UGFyYW1ldGVyTGlzdCYgcGFyYW1zID0gcmVzdWx0LT5wYXJhbXM7CisKKyAgICBwYXJhbXMuYWRkKGFyZ3YwKTsKKworICAgIC8vIG5ldC5zaGFyZWRfbmV0X2lwIGJvb3QgcHJvcGVydHkgdmFsdWUuCisgICAgY2hhciBib290X3Byb3BfaXBbNjRdID0ge307CisgICAgaWYgKG9wdHMtPnNoYXJlZF9uZXRfaWQpIHsKKyAgICAgICAgY2hhciogZW5kOworICAgICAgICBsb25nIHNoYXJlZF9uZXRfaWQgPSBzdHJ0b2wob3B0cy0+c2hhcmVkX25ldF9pZCwgJmVuZCwgMCk7CisgICAgICAgIGlmIChlbmQgPT0gTlVMTCB8fCAqZW5kIHx8IHNoYXJlZF9uZXRfaWQgPCAxIHx8IHNoYXJlZF9uZXRfaWQgPiAyNTUpIHsKKyAgICAgICAgICAgIGRlcnJvcigib3B0aW9uIC1zaGFyZWQtbmV0LWlkIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDI1NVxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50Zihib290X3Byb3BfaXAsIHNpemVvZihib290X3Byb3BfaXApLAorICAgICAgICAgICAgICAgICAibmV0LnNoYXJlZF9uZXRfaXA9MTAuMS4yLiVsZCIsIHNoYXJlZF9uZXRfaWQpOworCisgICAgICAgIHBhcmFtcy5hZGQySWYoIi1ib290LXByb3BlcnR5IiwgYm9vdF9wcm9wX2lwKTsKKyAgICB9CisKKyAgICBwYXJhbXMuYWRkMklmKCItdGNwZHVtcCIsIG9wdHMtPnRjcGR1bXApOworCisjaWZkZWYgQ09ORklHX05BTkRfTElNSVRTCisgICAgcGFyYW1zLmFkZDJJZigiLW5hbmQtbGltaXRzIiwgb3B0cy0+bmFuZF9saW1pdHMpOworI2VuZGlmCisKKyAgICBwYXJhbXMuYWRkMklmKCItdGltZXpvbmUiLCBvcHRzLT50aW1lem9uZSk7CisgICAgcGFyYW1zLmFkZDJJZiggIi1hdWRpbyIsIG9wdHMtPmF1ZGlvKTsKKyAgICBwYXJhbXMuYWRkMklmKCItY3B1LWRlbGF5Iiwgb3B0cy0+Y3B1X2RlbGF5KTsKKyAgICBwYXJhbXMuYWRkMklmKCItZG5zLXNlcnZlciIsIG9wdHMtPmRuc19zZXJ2ZXIpOworICAgIHBhcmFtcy5hZGRJZigiLXNraXAtYWRiLWF1dGgiLCBvcHRzLT5za2lwX2FkYl9hdXRoKTsKKworICAgIGlmIChvcHRzLT5zbmFwc3RvcmFnZSkgeworICAgICAgICAvLyBXZSBzdGlsbCB1c2UgUUVNVSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBzaW5jZQorICAgICAgICAvLyB0aGV5IGNhbiBjaGFuZ2UgZnJvbSBvbmUgaW52b2thdGlvbiB0byB0aGUgbmV4dCBhbmQgZG9uJ3QgcmVhbGx5CisgICAgICAgIC8vIGNvcnJlc3BvbmQgdG8gdGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gaXRzZWxmLgorICAgICAgICBpZiAoIW9wdHMtPm5vX3NuYXBzaG90X2xvYWQpIHsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQyKCItbG9hZHZtIiwgb3B0cy0+c25hcHNob3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcHRzLT5ub19zbmFwc2hvdF9zYXZlKSB7CisgICAgICAgICAgICBwYXJhbXMuYWRkMigiLXNhdmV2bS1vbi1leGl0Iiwgb3B0cy0+c25hcHNob3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdHMtPm5vX3NuYXBzaG90X3VwZGF0ZV90aW1lKSB7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCItc25hcHNob3Qtbm8tdGltZS11cGRhdGUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZpcnR1YWwgdHR5IHNldHVwLiBOb3RlOiB0aGlzIG11c3QgYmUgc3luY2VkIHdpdGggdGhlIGNvZGUgaW4KKyAgICAvLyBhbmRyb2lkL21haW4ta2VybmVsLXBhcmFtZXRlcnMuY3BwLiBTZWUgdGVjaG5pY2FsIG5vdGUgaW4gdGhpcyBmaWxlLgorICAgIGludCBhcGlMZXZlbCA9IGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYXZkKTsKKyAgICBhbmRyb2lkOjpzZXR1cFZpcnR1YWxTZXJpYWxQb3J0cyhudWxscHRyLCAmcGFyYW1zLCBhcGlMZXZlbCwgdGFyZ2V0QXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgIC8vIGtlcm5lbFNlcmlhbFByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUWVtdTIsIG9wdHMtPnNob3dfa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHMtPmxvZ2NhdCB8fCBvcHRzLT5zaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLT5zaGVsbF9zZXJpYWwpOworCisgICAgcGFyYW1zLmFkZDJJZigiLXJhZGlvIiwgb3B0cy0+cmFkaW8pOworICAgIHBhcmFtcy5hZGQySWYoIi1ncHMiLCBvcHRzLT5ncHMpOworICAgIHBhcmFtcy5hZGQySWYoIi1jb2RlLXByb2ZpbGUiLCBvcHRzLT5jb2RlX3Byb2ZpbGUpOworCisgICAgLyogUGFzcyBib290IHByb3BlcnRpZXMgdG8gdGhlIGNvcmUuIEZpcnN0LCB0aG9zZSBmcm9tIGJvb3QucHJvcCwKKyAgICAgKiB0aGVuIHRob3NlIGZyb20gdGhlIGNvbW1hbmQtbGluZSAqLworICAgIGNvbnN0IEZpbGVEYXRhKiBib290UHJvcGVydGllcyA9IGF2ZEluZm9fZ2V0Qm9vdFByb3BlcnRpZXMoYXZkKTsKKyAgICBpZiAoIWZpbGVEYXRhX2lzRW1wdHkoYm9vdFByb3BlcnRpZXMpKSB7CisgICAgICAgIFByb3BlcnR5RmlsZUl0ZXJhdG9yIGl0ZXJbMV07CisgICAgICAgIHByb3BlcnR5RmlsZUl0ZXJhdG9yX2luaXQoaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290UHJvcGVydGllcy0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib290UHJvcGVydGllcy0+c2l6ZSk7CisgICAgICAgIHdoaWxlIChwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KGl0ZXIpKSB7CisgICAgICAgICAgICBjaGFyIHRlbXBbTUFYX1BST1BFUlRZX05BTUVfTEVOICsgTUFYX1BST1BFUlRZX1ZBTFVFX0xFTiArIDJdOworICAgICAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIlcz0lcyIsIGl0ZXItPm5hbWUsIGl0ZXItPnZhbHVlKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQyKCItYm9vdC1wcm9wZXJ0eSIsIHRlbXApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdHMtPnByb3AgIT0gTlVMTCkgeworICAgICAgICBQYXJhbUxpc3QqICBwbCA9IG9wdHMtPnByb3A7CisgICAgICAgIGZvciAoIDsgcGwgIT0gTlVMTDsgcGwgPSBwbC0+bmV4dCApIHsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQyKCItYm9vdC1wcm9wZXJ0eSIsIHBsLT5wYXJhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGRpZ2l0KTogQWRkIGtlcm5lbCBwYXJhbWV0ZXJzIGhlcmUuCisKKyAgICBwYXJhbXMuYWRkMklmKCItYW5kcm9pZC1wb3J0cyIsIG9wdHMtPnBvcnRzKTsKKyAgICBwYXJhbXMuYWRkMklmKCItYW5kcm9pZC1wb3J0Iiwgb3B0cy0+cG9ydCk7CisgICAgcGFyYW1zLmFkZDJJZigiLWFuZHJvaWQtcmVwb3J0LWNvbnNvbGUiLCBvcHRzLT5yZXBvcnRfY29uc29sZSk7CisgICAgcGFyYW1zLmFkZDJJZigiLWh0dHAtcHJveHkiLCBvcHRzLT5odHRwX3Byb3h5KTsKKworICAgIC8qIFNldCB1cCB0aGUgaW50ZXJmYWNlcyBmb3IgaW50ZXItZW11bGF0b3IgbmV0d29ya2luZyAqLworICAgIGlmIChvcHRzLT5zaGFyZWRfbmV0X2lkKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzaGFyZWRfbmV0X2lkID0gYXRvaShvcHRzLT5zaGFyZWRfbmV0X2lkKTsKKyAgICAgICAgY2hhciBuaWNbMzddOworCisgICAgICAgIHBhcmFtcy5hZGQyKCItbmV0IiwgIm5pYyx2bGFuPTAiKTsKKyAgICAgICAgcGFyYW1zLmFkZDIoIi1uZXQiLCAidXNlcix2bGFuPTAiKTsKKworICAgICAgICBzbnByaW50ZihuaWMsIHNpemVvZiBuaWMsICJuaWMsdmxhbj0xLG1hY2FkZHI9NTI6NTQ6MDA6MTI6MzQ6JTAyeCIsIHNoYXJlZF9uZXRfaWQpOworICAgICAgICBwYXJhbXMuYWRkMigiLW5ldCIsIG5pYyk7CisKKyAgICAgICAgcGFyYW1zLmFkZDIoIi1uZXQiLCAic29ja2V0LHZsYW49MSxtY2FzdD0yMzAuMC4wLjEwOjEyMzQiKTsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0QXJjaCAmJgorICAgICAgICAoIXN0cmNtcCh0YXJnZXRBcmNoLCAieDg2IikgfHwKKyAgICAgICAgICFzdHJjbXAodGFyZ2V0QXJjaCwgIng4Nl82NCIpKSkgeworICAgICAgICBjaGFyKiBhY2NlbF9zdGF0dXMgPSBOVUxMOworICAgICAgICBDcHVBY2NlbE1vZGUgYWNjZWxfbW9kZSA9IEFDQ0VMX0FVVE87CisgICAgICAgIGJvb2wgYWNjZWxfb2sgPSBoYW5kbGVDcHVBY2NlbGVyYXRpb24ob3B0cywgYXZkLCAmYWNjZWxfbW9kZSwgJmFjY2VsX3N0YXR1cyk7CisKKyAgICAgICAgLy8gQ1BVIGFjY2VsZXJhdGlvbiBvbmx5IHdvcmtzIGZvciB4ODYgYW5kIHg4Nl82NCBzeXN0ZW0gaW1hZ2VzLgorICAgICAgICBpZiAoYWNjZWxfbW9kZSA9PSBBQ0NFTF9PRkYgJiYgYWNjZWxfb2spIHsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoa0Rpc2FibGVBY2NlbGVyYXRvcik7CisgICAgICAgIH0gZWxzZSBpZiAoYWNjZWxfbW9kZSA9PSBBQ0NFTF9PTikgeworICAgICAgICAgICAgaWYgKCFhY2NlbF9vaykgeworICAgICAgICAgICAgICAgIGRlcnJvcigiQ1BVIGFjY2VsZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgbWFjaGluZSEiKTsKKyAgICAgICAgICAgICAgICBkZXJyb3IoIlJlYXNvbjogJXMiLCBhY2NlbF9zdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyYW1zLmFkZChrRW5hYmxlQWNjZWxlcmF0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1zLmFkZChhY2NlbF9vayA/IGtFbmFibGVBY2NlbGVyYXRvciA6IGtEaXNhYmxlQWNjZWxlcmF0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQUZSRUUoYWNjZWxfc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhpbml0KSkgeworICAgICAgICAgICAgZHdhcm5pbmcoIkNQVSBhY2NlbGVyYXRpb24gb25seSB3b3JrcyB3aXRoIHg4Ni94ODZfNjQgIgorICAgICAgICAgICAgICAgICAgICAic3lzdGVtIGltYWdlcy4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhcmFtcy5hZGQyKCItYW5kcm9pZC1odyIsIGFuZHJvaWRId0luaVBhdGgpOworCisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBxZW11QXJnYzsgKytuKSB7CisgICAgICAgIHBhcmFtcy5hZGQocWVtdUFyZ3Zbbl0pOworICAgIH0KKworICAgIC8vIEhhbmRsaW5nIGtlcm5lbCBwYXJhbWV0ZXJzLiBUaGV5IGFyZSBwYXNzZWQgdG8gUUVNVSB0aHJvdWdoIHRoZQorICAgIC8vIC1hcHBlbmQgZmxhZy4KKyAgICB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGtlcm5lbFBhcmFtczsKKyAgICAgICAgaWYgKGluaXRpYWxLZXJuZWxQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBrZXJuZWxQYXJhbXMgKz0gaW5pdGlhbEtlcm5lbFBhcmFtZXRlcnM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBxZW11QXJnYzsgKytuKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChxZW11QXJndltuXSwgIi1hcHBlbmQiKSAmJiBuICsgMSA8IHFlbXVBcmdjKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nQXBwZW5kRm9ybWF0KCZrZXJuZWxQYXJhbXMsICIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11QXJndltuICsgMV0pOworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWtlcm5lbFBhcmFtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBwYXJhbXMuYWRkKCItYXBwZW5kIik7CisgICAgICAgICAgICBwYXJhbXMuYWRkKHN0ZDo6bW92ZShrZXJuZWxQYXJhbXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKFZFUkJPU0VfQ0hFQ0soaW5pdCkpIHsKKyAgICAgICAgcHJpbnRmKCJRRU1VIG9wdGlvbnMgbGlzdDpcbiIpOworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBwcmludGYoImVtdWxhdG9yOiBhcmd2WyUwMmRdID0gXCIlc1wiXG4iLCBzdGF0aWNfY2FzdDxpbnQ+KGkpLAorICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICAvKiBEdW1wIGZpbmFsIGNvbW1hbmQtbGluZSBvcHRpb24gdG8gbWFrZSBkZWJ1Z2dpbmcgdGhlIGNvcmUgZWFzaWVyICovCisgICAgICAgIHByaW50ZigiQ29uY2F0ZW5hdGVkIFFFTVUgb3B0aW9uczpcbiIpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgLyogVG8gbWFrZSBpdCBlYXNpZXIgdG8gY29weS1wYXN0ZSB0aGUgb3V0cHV0IHRvIGEgY29tbWFuZC1saW5lLAorICAgICAgICAgICAgICogcXVvdGUgYW55dGhpbmcgdGhhdCBjb250YWlucyBzcGFjZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICg6OnN0cmNocihwYXJhbXNbaV0uY19zdHIoKSwgJyAnKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJyVzJyIsIHBhcmFtc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBwYXJhbXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tcWVtdS1wYXJhbWV0ZXJzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWFpbi1xZW11LXBhcmFtZXRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjgyYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21haW4tcWVtdS1wYXJhbWV0ZXJzLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9hdmQvaW5mby5oIgorI2luY2x1ZGUgImFuZHJvaWQvYXZkL3V0aWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NtZGxpbmUtb3B0aW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCit0eXBlZGVmIHN0cnVjdCBRZW11UGFyYW1ldGVycyBRZW11UGFyYW1ldGVyczsKKworLy8gR2VuZXJhdGUgdGhlIGxpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSB1bmRlcmx5aW5nIFFFTVUgZW5naW5lLgorLy8gfGFyZ3YwfCBpcyB0aGUgaW5pdGlhbCBwcm9ncmFtIG5hbWUvcGF0aC4KKy8vIHxhcmdjfCBhbmQgfGFyZ3Z8IGFyZSB0aGUgUUVNVS1zcGVjaWZpYyBjb21tYW5kLWxpbmUgb3B0aW9ucywgaWYgYW55LgorLy8gfG9wdHN8IGlzIHRoZSBjdXJyZW50IHNldCBvZiBvcHRpb25zLCB8YXZkfCB0aGUgQVZEIGluZm9ybWF0aW9uIGluc3RhbmNlLAorLy8gfGtlcm5lbFBhcmFtZXRlcnN8IGEgb3B0aW9uYWwgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGtlcm5lbCBwYXJhbWV0ZXJzLAorLy8gYW5kIHxhbmRyb2lkSHdJbml0UGF0aHwgdGhlIHBhdGggdG8gdGhlIGZpbmFsIGdlbmVyYXRlZCBoYXJ3YXJlLmluaSBmaWxlCisvLyBnZW5lcmF0ZWQgYnkgdGhpcyBmdW5jdGlvbi4KKy8vIHxpc1FlbXUyfCBzaG91bGQgYmUgdHJ1ZSBpZmYgdGhlIGVuZ2luZSBpcyBRRU1VMiAob3RoZXJ3aXNlIFFFTVUxIGlzCisvLyBhc3N1bWVkKS4gRmluYWxseSB8dGFyZ2V0QXJjaHwgaXMgdGhlIHRhcmdldCBDUFUgYXJjaGl0ZWN0dXJlLgorLy8gUmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KK1FlbXVQYXJhbWV0ZXJzKiBxZW11X3BhcmFtZXRlcnNfY3JlYXRlKGNvbnN0IGNoYXIqIGFyZ3YwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFlbXVBcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHFlbXVBcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5kcm9pZE9wdGlvbnMqIG9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdmRJbmZvKiBhdmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXJuZWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYW5kcm9pZEh3SW5pdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUWVtdTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0YXJnZXRBcmNoKTsKKworc2l6ZV90IHFlbXVfcGFyYW1ldGVyc19zaXplKGNvbnN0IFFlbXVQYXJhbWV0ZXJzKiBwYXJhbXMpOworY2hhcioqIHFlbXVfcGFyYW1ldGVyc19hcnJheShjb25zdCBRZW11UGFyYW1ldGVycyogcGFyYW1zKTsKKwordm9pZCBxZW11X3BhcmFtZXRlcnNfZnJlZShRZW11UGFyYW1ldGVycyogcGFyYW1zKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9BZGJMaXZlbmVzc0NoZWNrZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQWRiTGl2ZW5lc3NDaGVja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDMwOGFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQWRiTGl2ZW5lc3NDaGVja2VyLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL0FkYkxpdmVuZXNzQ2hlY2tlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL1BhcmFsbGVsVGFzay5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjpDb25maWdEaXJzOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitzdGF0aWMgY29uc3QgY2hhciBrQWRiRXhlY3V0YWJsZUJhc2VOYW1lW10gPSAiYWRiIjsKK3N0YXRpYyBjb25zdCBjaGFyIGtBZGJMaXZlbmVzc0tleVtdID0gImFkYl9saXZlbmVzcyI7CitzdGF0aWMgY29uc3QgaW50IGtNYXhBdHRlbXB0cyA9IDM7CitzdGF0aWMgY29uc3QgY2hhciBrUGxhdGZvcm1Ub29sc1N1YmRpcltdID0gInBsYXRmb3JtLXRvb2xzIjsKKworLy8gc3RhdGljCitBZGJMaXZlbmVzc0NoZWNrZXI6OlB0ciBBZGJMaXZlbmVzc0NoZWNrZXI6OmNyZWF0ZSgKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXIsCisgICAgICAgIE1ldHJpY3NSZXBvcnRlciogcmVwb3J0ZXIsCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JOYW1lLAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkR1cmF0aW9uIGNoZWNrSW50ZXJ2YWxNcykgeworICAgIGF1dG8gaW5zdCA9IFB0cihuZXcgQWRiTGl2ZW5lc3NDaGVja2VyKGxvb3BlciwgcmVwb3J0ZXIsIGVtdWxhdG9yTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVydmFsTXMpKTsKKyAgICByZXR1cm4gaW5zdDsKK30KKworQWRiTGl2ZW5lc3NDaGVja2VyOjpBZGJMaXZlbmVzc0NoZWNrZXIoCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3BlciogbG9vcGVyLAorICAgICAgICBNZXRyaWNzUmVwb3J0ZXIqIHJlcG9ydGVyLAorICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yTmFtZSwKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpEdXJhdGlvbiBjaGVja0ludGVydmFsTXMpCisgICAgOiBtQWRiUGF0aChQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICAgIENvbmZpZ0RpcnM6OmdldFNka1Jvb3REaXJlY3RvcnkoKSwKKyAgICAgICAgICAgICAgUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgICAgICAgICAgIGtQbGF0Zm9ybVRvb2xzU3ViZGlyLAorICAgICAgICAgICAgICAgICAgICAgIFBhdGhVdGlsczo6dG9FeGVjdXRhYmxlTmFtZShrQWRiRXhlY3V0YWJsZUJhc2VOYW1lKSkpKSwKKyAgICAgIG1Mb29wZXIobG9vcGVyKSwKKyAgICAgIG1SZXBvcnRlcihyZXBvcnRlciksCisgICAgICBtRW11bGF0b3JOYW1lKGVtdWxhdG9yTmFtZSksCisgICAgICBtQ2hlY2tJbnRlcnZhbE1zKGNoZWNrSW50ZXJ2YWxNcyksCisgICAgICAvLyBXZSB1c2UgcmF3IHBvaW50ZXIgdG8gfHRoaXN8IGluc3RlYWQgb2YgYSBzaGFyZWRfcHRyIHRvIGF2b2lkIGNpY3J1bGFyCisgICAgICAvLyBvd25lcnNoaXAuIG1SZWN1cnJlbnRUYXNrIHByb21pc2VzIHRvIGNhbmNlbCBhbnkgb3V0c3RhbmRpbmcgdGFza3Mgd2hlbgorICAgICAgLy8gaXQncyBkZXN0cnVjdGVkLgorICAgICAgbVJlY3VycmVudFRhc2sobG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKCkgeyByZXR1cm4gYWRiQ2hlY2tSZXF1ZXN0KCk7IH0sCisgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tJbnRlcnZhbE1zKSwKKyAgICAgIG1SZW1haW5pbmdBdHRlbXB0cyhrTWF4QXR0ZW1wdHMpIHsKKyAgICAvLyBEb24ndCBjYWxsIHN0YXJ0KCkgaGVyZTogc3RhcnQoKSBsYXVuY2hlcyBhIHBhcmFsbGVsIHRhc2sgdGhhdCBjYWxscworICAgIC8vIHNoYXJlZF9mcm9tX3RoaXMoKSwgd2hpY2ggbmVlZHMgYXQgbGVhc3Qgb25lIHNoYXJlZCBwb2ludGVyIG93bmluZworICAgIC8vIHx0aGlzfC4gV2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgdW50aWwgdGhlIGNvbnN0cnVjdG9yIGNhbGwgcmV0dXJucy4KK30KKworQWRiTGl2ZW5lc3NDaGVja2VyOjp+QWRiTGl2ZW5lc3NDaGVja2VyKCkgeworICAgIHN0b3AoKTsKK30KKwordm9pZCBBZGJMaXZlbmVzc0NoZWNrZXI6OnN0YXJ0KCkgeworICAgIG1SZWN1cnJlbnRUYXNrLnN0YXJ0KCk7Cit9CisKK3ZvaWQgQWRiTGl2ZW5lc3NDaGVja2VyOjpzdG9wKCkgeworICAgIG1SZWN1cnJlbnRUYXNrLnN0b3AoKTsKK30KKworYm9vbCBBZGJMaXZlbmVzc0NoZWNrZXI6OmFkYkNoZWNrUmVxdWVzdCgpIHsKKyAgICBpZiAoIW1SZW1haW5pbmdBdHRlbXB0cykgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIlF1aXR0aW5nIGFkYiBsaXZlbmVzcyBjaGVjayI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlzQ2hlY2tSdW5uaW5nKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBtSXNDaGVja1J1bm5pbmcgPSB0cnVlOworCisgICAgLy8gTk9URTogQ2FwdHVyZSBhIHNoYXJlZF9wdHIgdG8gfHRoaXN8IHRvIGd1YXJhbnRlZSBvYmplY3QgbGlmZXRpbWUgd2hpbGUKKyAgICAvLyB0aGUgcGFyYWxsZWwgdGFzayBpcyBydW5uaW5nLgorICAgIGF1dG8gc2hhcmVkX3RoaXMgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYXV0byB0YXNrRnVuY3Rpb24gPSBbc2hhcmVkX3RoaXNdKENoZWNrUmVzdWx0KiBvdXRSZXN1bHQpIHsKKyAgICAgICAgc2hhcmVkX3RoaXMtPnJ1bkNoZWNrQmxvY2tpbmcob3V0UmVzdWx0KTsKKyAgICB9OworICAgIGF1dG8gdGFza0RvbmVGdW5jdGlvbiA9IFtzaGFyZWRfdGhpc10oY29uc3QgQ2hlY2tSZXN1bHQmIHJlc3VsdCkgeworICAgICAgICBzaGFyZWRfdGhpcy0+cmVwb3J0Q2hlY2tSZXN1bHQocmVzdWx0KTsKKyAgICB9OworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6cnVuUGFyYWxsZWxUYXNrPENoZWNrUmVzdWx0PihtTG9vcGVyLCB0YXNrRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEb25lRnVuY3Rpb24pKSB7CisgICAgICAgIG1Jc0NoZWNrUnVubmluZyA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEFkYkxpdmVuZXNzQ2hlY2tlcjo6cnVuQ2hlY2tCbG9ja2luZyhDaGVja1Jlc3VsdCogb3V0UmVzdWx0KSBjb25zdCB7CisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdENvZGU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFkYlNlcnZlckFsaXZlQ21kID0ge21BZGJQYXRoLCAiZGV2aWNlcyJ9OworICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBhZGJTZXJ2ZXJBbGl2ZUNtZCwKKyAgICAgICAgICAgICAgICBTeXN0ZW06OlJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6UnVuT3B0aW9uczo6VGVybWluYXRlT25UaW1lb3V0LAorICAgICAgICAgICAgICAgIG1DaGVja0ludGVydmFsTXMgLyAzLCAmZXhpdENvZGUpIHx8CisgICAgICAgIGV4aXRDb2RlICE9IDApIHsKKyAgICAgICAgKm91dFJlc3VsdCA9IENoZWNrUmVzdWx0OjprRmFpbHVyZUFkYlNlcnZlckRlYWQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW11bGF0b3JBbGl2ZUNtZCA9IHsKKyAgICAgICAgICAgIG1BZGJQYXRoLCAiLXMiLCBtRW11bGF0b3JOYW1lLCAic2hlbGwiLCAiZXhpdCJ9OworICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cnVuQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBlbXVsYXRvckFsaXZlQ21kLAorICAgICAgICAgICAgICAgIFN5c3RlbTo6UnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpSdW5PcHRpb25zOjpUZXJtaW5hdGVPblRpbWVvdXQsCisgICAgICAgICAgICAgICAgbUNoZWNrSW50ZXJ2YWxNcyAvIDMsICZleGl0Q29kZSkgfHwKKyAgICAgICAgZXhpdENvZGUgIT0gMCkgeworICAgICAgICAqb3V0UmVzdWx0ID0gQ2hlY2tSZXN1bHQ6OmtGYWlsdXJlRW11bGF0b3JEZWFkOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKm91dFJlc3VsdCA9IEFkYkxpdmVuZXNzQ2hlY2tlcjo6Q2hlY2tSZXN1bHQ6OmtPbmxpbmU7Cit9CisKK3ZvaWQgQWRiTGl2ZW5lc3NDaGVja2VyOjpyZXBvcnRDaGVja1Jlc3VsdChjb25zdCBDaGVja1Jlc3VsdCYgcmVzdWx0KSB7CisgICAgbUlzQ2hlY2tSdW5uaW5nID0gZmFsc2U7CisKKyAgICAvLyB8bUlzT25saW5lfCBzdGFydHMgb2ZmIHNldCB0byBmYWxzZS4gV2Ugc2V0IGl0IHRvIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5CisgICAgLy8gdGFsayB0byB0aGUgZW11bGF0b3IgYXQgbGVhc3Qgb25jZS4gVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3Vpc2ggdGhlCisgICAgLy8gY2FzZXMgd2hlcmUgYWRiIGlzIG1pc3Npbmcgb3IgZW11bGF0b3IgZG9lc24ndCBib290IGF0IGFsbCBmcm9tIGNhc2VzCisgICAgLy8gd2hlcmUgZW11bGF0b3IgYm9vdHMgYW5kIHRoZW4gZGlzYXBwZWFycyBmcm9tIGFkYi4KKyAgICBpZiAoIW1Jc09ubGluZSkgeworICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICAgICAgY2FzZSBDaGVja1Jlc3VsdDo6a0ZhaWx1cmVBZGJTZXJ2ZXJEZWFkOgorICAgICAgICAgICAgICAgIGRyb3BNZXRyaWNzKENoZWNrUmVzdWx0OjprRmFpbHVyZU5vQWRiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2hlY2tSZXN1bHQ6OmtPbmxpbmU6CisgICAgICAgICAgICAgICAgZHJvcE1ldHJpY3MocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBtSXNPbmxpbmUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBkcm9wTWV0cmljcyhDaGVja1Jlc3VsdDo6a05vUmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBDaGVja1Jlc3VsdDo6a09ubGluZSkgeworICAgICAgICBtUmVtYWluaW5nQXR0ZW1wdHMgPSBrTWF4QXR0ZW1wdHM7CisgICAgICAgIGRyb3BNZXRyaWNzKHJlc3VsdCk7CisgICAgfSBlbHNlIGlmICgtLW1SZW1haW5pbmdBdHRlbXB0cyA9PSAwKSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiUmVwb3J0aW5nIGVycm9yOiAiIDw8IHN0YXRpY19jYXN0PGludD4ocmVzdWx0KTsKKyAgICAgICAgZHJvcE1ldHJpY3MocmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkVuY291bnRlcmVkICBlcnJvci4gbVJlbWFpbmluZ0F0dGVtcHRzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBtUmVtYWluaW5nQXR0ZW1wdHM7CisgICAgfQorfQorCit2b2lkIEFkYkxpdmVuZXNzQ2hlY2tlcjo6ZHJvcE1ldHJpY3MoY29uc3QgQ2hlY2tSZXN1bHQmIHJlc3VsdCkgeworICAgIC8vIE9ubHkgcmVwb3J0IHN0YXRlIGlmIGl0IGNoYW5nZXMuIFdlIHN0YXJ0IHdpdGgga05vUmVzdWx0LCBhbmQgd2Ugb25seQorICAgIC8vIHJlcG9ydCBrTm9SZXN1bHQgb3Iga0ZhaWx1cmVOb0FkYiB1bnRpbCBlbXVsYXRvciBzdGFydHMuCisgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gcmVzdWx0KSB7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSByZXN1bHQ7CisgICAgICAgIG1SZXBvcnRlci0+cmVwb3J0KFtyZXN1bHRdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9hZGJfbGl2ZW5lc3MoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfc3R1ZGlvOjpFbXVsYXRvckRldGFpbHM6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtdWxhdG9yQWRiTGl2ZW5lc3M+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocmVzdWx0KSkpOworICAgICAgICB9KTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQWRiTGl2ZW5lc3NDaGVja2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9BZGJMaXZlbmVzc0NoZWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmQ2MWVmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQWRiTGl2ZW5lc3NDaGVja2VyLmgKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvUmVjdXJyZW50VGFzay5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvUGFyYWxsZWxUYXNrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLyBBZGJMaXZlbmVzc0NoZWNrZXIgaXMgYW4gb2JqZWN0IHRoYXQgcnVucyByZXBlYXRlZCBiYWNrZ3JvdW5kIGNoZWNrcyB0byBtYWtlCisvLyBzdXJlIHRoYXQgYWRiIGNhbiB0YWxrIHRvIG91ciBlbXVsYXRvciBwcm9jZXNzLgorLy8gSW4gY2FzZSB0aGUgbGluayBmYWlscyBhdCBzb21lIHBvaW50LCBhIG1ldHJpYyBpcyBkcm9wcGVkIGluIHRoZSB1c3VhbCB3YXkuCitjbGFzcyBBZGJMaXZlbmVzc0NoZWNrZXIgZmluYWwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBZGJMaXZlbmVzc0NoZWNrZXI+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8QWRiTGl2ZW5lc3NDaGVja2VyPjsKKworICAgIC8vIEVudHJ5IHBvaW50IHRvIGNyZWF0ZSBhbiBBZGJMaXZlbmVzc0NoZWNrZXIuCisgICAgLy8gT2JqZWN0cyBvZiB0aGlzIHR5cGUgYXJlIG1hbmFnZWQgdmlhIHNoYXJlZF9wdHIuCisgICAgc3RhdGljIFB0ciBjcmVhdGUoCisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgIE1ldHJpY3NSZXBvcnRlciogcmVwb3J0ZXIsCisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yTmFtZSwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6RHVyYXRpb24gY2hlY2tJbnRlcnZhbE1zKTsKKworICAgIHZvaWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKworICAgIH5BZGJMaXZlbmVzc0NoZWNrZXIoKTsKKworcHJvdGVjdGVkOgorICAgIC8vIFVzZSB8Y3JlYXRlfCB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSB0aGUgc2hhcmVkX3B0ciBjb3VudC4KKyAgICBBZGJMaXZlbmVzc0NoZWNrZXIoYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY3NSZXBvcnRlciogcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkR1cmF0aW9uIGNoZWNrSW50ZXJ2YWxNcyk7CisKK3Byb3RlY3RlZDoKKyAgICBlbnVtIGNsYXNzIENoZWNrUmVzdWx0IHsKKyAgICAgICAga05vUmVzdWx0ID0gMCwKKyAgICAgICAga0ZhaWx1cmVOb0FkYiA9IDEsCisgICAgICAgIGtPbmxpbmUgPSAyLAorICAgICAgICBrRmFpbHVyZUFkYlNlcnZlckRlYWQgPSAzLAorICAgICAgICBrRmFpbHVyZUVtdWxhdG9yRGVhZCA9IDQKKyAgICB9OworCisgICAgLy8gQ2FsbGVkIGJ5IHRoZSBSZWN1cnJlbnRUYXNrLgorICAgIGJvb2wgYWRiQ2hlY2tSZXF1ZXN0KCk7CisKKyAgICAvLyBDYWxsZWQgYnkgdGhlIFBhcmFsbGVsVGFzay4KKyAgICB2b2lkIHJ1bkNoZWNrQmxvY2tpbmcoQ2hlY2tSZXN1bHQqIHJlc3VsdCkgY29uc3Q7CisgICAgdm9pZCByZXBvcnRDaGVja1Jlc3VsdChjb25zdCBDaGVja1Jlc3VsdCYgcmVzdWx0KTsKKworICAgIHZvaWQgZHJvcE1ldHJpY3MoY29uc3QgQ2hlY2tSZXN1bHQmIHJlc3VsdCk7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUFkYlBhdGg7CisgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBjb25zdCBtTG9vcGVyOworICAgIE1ldHJpY3NSZXBvcnRlciogY29uc3QgbVJlcG9ydGVyOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1FbXVsYXRvck5hbWU7CisgICAgY29uc3QgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpEdXJhdGlvbiBtQ2hlY2tJbnRlcnZhbE1zOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlY3VycmVudFRhc2sgbVJlY3VycmVudFRhc2s7CisgICAgaW50IG1SZW1haW5pbmdBdHRlbXB0czsKKyAgICBib29sIG1Jc09ubGluZSA9IGZhbHNlOworICAgIGJvb2wgbUlzQ2hlY2tSdW5uaW5nID0gZmFsc2U7CisgICAgQ2hlY2tSZXN1bHQgbUN1cnJlbnRTdGF0ZSA9IENoZWNrUmVzdWx0OjprTm9SZXN1bHQ7CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oQWRiTGl2ZW5lc3NDaGVja2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWQ3N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9Bc3luY01ldHJpY3NSZXBvcnRlci5jcHAKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzTG9nZ2luZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitBc3luY01ldHJpY3NSZXBvcnRlcjo6QXN5bmNNZXRyaWNzUmVwb3J0ZXIoCisgICAgICAgIE1ldHJpY3NXcml0ZXI6OlB0ciB3cml0ZXIsCisgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JWZXJzaW9uLAorICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yRnVsbFZlcnNpb24sCisgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgcWVtdVZlcnNpb24pCisgICAgOiBNZXRyaWNzUmVwb3J0ZXIodHJ1ZSwgc3RkOjptb3ZlKHdyaXRlciksCisgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3JWZXJzaW9uLCBlbXVsYXRvckZ1bGxWZXJzaW9uLCBxZW11VmVyc2lvbiksCisgICAgICBtV29ya2VyVGhyZWFkKFt0aGlzXSgpIHsgd29ya2VyKCk7IH0pIHsKKyAgICBEKCJjcmVhdGVkIik7CisgICAgbVdvcmtlclRocmVhZC5zdGFydCgpOworfQorCitBc3luY01ldHJpY3NSZXBvcnRlcjo6fkFzeW5jTWV0cmljc1JlcG9ydGVyKCkgeworICAgIC8vIFNlbmQgYW4gZW1wdHkgY2FsbGJhY2sgYXMgYSBzdG9wIHJlcXVlc3QuCisgICAgRCgic2VuZGluZyBhIHN0b3AgcmVxdWVzdCB0byB3b3JrZXIiKTsKKyAgICBtQ2FsbGJhY2tRdWV1ZS5zZW5kKHt9KTsKKyAgICBtV29ya2VyVGhyZWFkLndhaXQoKTsKK30KKwordm9pZCBBc3luY01ldHJpY3NSZXBvcnRlcjo6cmVwb3J0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmIChjYWxsYmFjaykgeworICAgICAgICBEKCJzZW5kaW5nIGEgY2FsbGJhY2sgZm9yIHJlcG9ydGluZyB0byB3b3JrZXIiKTsKKyAgICAgICAgbUNhbGxiYWNrUXVldWUuc2VuZChzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgICB9Cit9CisKK3ZvaWQgQXN5bmNNZXRyaWNzUmVwb3J0ZXI6OndvcmtlcigpIHsKKyAgICB3aGlsZSAoYXV0byBjYiA9IG1DYWxsYmFja1F1ZXVlLnJlY2VpdmUoKSkgeworICAgICAgICBpZiAoISpjYikgeworICAgICAgICAgICAgRCgicmVjZWl2ZWQgYSBzdG9wIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgZXZlbnQ7CisgICAgICAgIGlmICgoKmNiKSgmZXZlbnQpKSB7CisgICAgICAgICAgICBzZW5kVG9Xcml0ZXIoJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9Bc3luY01ldHJpY3NSZXBvcnRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY2ODhlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvRnVuY3RvclRocmVhZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLworLy8gQXN5bmNNZXRyaWNzUmVwb3J0ZXIgLSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBNZXRyaWNzUmVwb3J0ZXIgdGhhdCBzZW5kcworLy8gbWV0cmljcyBtZXNzYWdlcyBhc3luY2hyb25vdXNseSBpbiBhIGRlZGljYXRlZCB0aHJlYWQuCisvLworLy8gTm90ZTogaXQgaXMgc2FmZSB0byBoYXZlIGEgc2VwYXJhdGUgd29ya2VyIHRocmVhZCB0aGF0IG1vZGlmaWVkIHByb3RvYnVmCisvLyAgbWVzc2FnZSBvYmplY3Q6IHRoaXMgaXMgYWN0dWFsbHkgdGhlIG9ubHkgdGhyZWFkIHRoYXQgbW9kaWZpZXMgaXQuIFdlIGNyZWF0ZQorLy8gIGFuIG9iamVjdCBpbiBhIHdvcmtlciB0aHJlYWQsIGludm9rZSB0aGUgY2FsbGJhY2sgdG8gZmlsbCBpdHMgZmllbGRzIG9uIHRoZQorLy8gIHNhbWUgdGhyZWFkLCBhbmQgcGFzcyBpdCB0byB0aGUgd3JpdGVyIGhlcmUgYXMgd2VsbC4gVGhpcyBtZWFucyB0aGVyZSBhcmUKKy8vICBubyBtdWx0aXRocmVhZGluZyBpc3N1ZXMgdG8gZGVhbCB3aXRoLgorLy8KKworY2xhc3MgQXN5bmNNZXRyaWNzUmVwb3J0ZXIgZmluYWwgOiBwdWJsaWMgTWV0cmljc1JlcG9ydGVyCit7CitwdWJsaWM6CisgICAgQXN5bmNNZXRyaWNzUmVwb3J0ZXIoTWV0cmljc1dyaXRlcjo6UHRyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yRnVsbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBxZW11VmVyc2lvbik7CisgICAgfkFzeW5jTWV0cmljc1JlcG9ydGVyKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlcG9ydENvbmRpdGlvbmFsKENvbmRpdGlvbmFsQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHZvaWQgd29ya2VyKCk7CisKKyAgICBhbmRyb2lkOjpiYXNlOjpGdW5jdG9yVGhyZWFkIG1Xb3JrZXJUaHJlYWQ7CisKKyAgICAvLyBBIG1lc3NhZ2UgY2hhbm5lbCBmb3IgdGhlIHBlbmRpbmcgY2FsbGJhY2tzLiBFbXB0eSBjYWxsYmFjaworICAgIC8vIChDb25kaXRpb25hbENhbGxiYWNre30pIGlzIGEgc3RvcCBzaWduYWwuCisgICAgLy8gTm90ZTogcmVzZXJ2ZWQgc2l6ZSBvZiAxMDAgc2hvdWxkIGJlIGVub3VnaCwgaWYgd2UgZXZlciBnZXQgYmxvY2tlZCBvbgorICAgIC8vIGEgZnVsbCBtZXNzYWdlIGNoYW5uZWwgdGhlbiBpdCdzIHdheSB0b28gbWFueSBtZXNzYWdlcyBiZWluZyByZXBvcnRlZAorICAgIC8vIGZvciBhIG5vcm1hbCBlbXVsYXRvciBzdGF0ZS4KKyAgICBhbmRyb2lkOjpiYXNlOjpNZXNzYWdlQ2hhbm5lbDxDb25kaXRpb25hbENhbGxiYWNrLCAxMDA+IG1DYWxsYmFja1F1ZXVlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQ3Jhc2hNZXRyaWNzUmVwb3J0aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjU5YmQyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvQ3Jhc2hNZXRyaWNzUmVwb3J0aW5nLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCit2b2lkIHJlcG9ydENyYXNoTWV0cmljcyhNZXRyaWNzUmVwb3J0ZXImIHJlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0cmljc1dyaXRlcjo6QWJhbmRvbmVkU2Vzc2lvbnMmIHNlc3Npb25zKSB7CisgICAgLy8gV3JpdGUgZG93biB0aGUgY3Jhc2hlZCBzZXNzaW9ucyBhcyBzZXBhcmF0ZSBtZXNzYWdlcy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uSWQgOiBzZXNzaW9ucykgeworICAgICAgICByZXBvcnRlci5yZXBvcnQoW3Nlc3Npb25JZF0oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgIGV2ZW50LT5zZXRfc3R1ZGlvX3Nlc3Npb25faWQoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX2RldGFpbHMoKS0+c2V0X2NyYXNoZXMoMSk7CisgICAgICAgIH0pOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL0NyYXNoTWV0cmljc1JlcG9ydGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMGM1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NXcml0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLworLy8gVGhpcyBmdW5jdGlvbiBzZW5kcyBhIGJ1bmNoIG9mIG1ldHJpY3MgbWVzc2FnZXMgdG8gcmVwb3J0IGNyYXNoZWQgc2Vzc2lvbnMKKy8vIHBhc3NlZCBpbiB8c2Vzc2lvbnN8IHBhcmFtZXRlciB1c2luZyB8cmVwb3J0ZXJ8LgorLy8KK3ZvaWQgcmVwb3J0Q3Jhc2hNZXRyaWNzKE1ldHJpY3NSZXBvcnRlciYgcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRyaWNzV3JpdGVyOjpBYmFuZG9uZWRTZXNzaW9ucyYgc2Vzc2lvbnMpOworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL0ZpbGVNZXRyaWNzV3JpdGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL0ZpbGVNZXRyaWNzV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI1NDAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMzM2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9GaWxlTWV0cmljc1dyaXRlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1V1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc0xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9jbGllbnRhbmFseXRpY3MucGIuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjptYWtlQ3VzdG9tU2NvcGVkUHRyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlV1aWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworLy8gT25seSBXaW5kb3dzIGhhcyBhIE5vLWluaGVyaXQgb3BlbigpIGZsYWcsIGFuZCBvbmx5IFdpbmRvd3MgY2FyZXMgYWJvdXQKKy8vIGRpZmZlcmVuY2UgYmV0d2VlbiBiaW5hcnkvdGV4dCBmaWxlcy4KKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDb21tb25PcGVuRmxhZ3MgPSBPX0JJTkFSWSB8IE9fTk9JTkhFUklUOworI2Vsc2UKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDb21tb25PcGVuRmxhZ3MgPSAwOworI2VuZGlmCisKKy8vIEV4dGVuc2lvbnMgZm9yIGFuIGFjdGl2ZSB0ZW1wb3JhcnkgbG9nZ2luZyBmaWxlIGFuZCBmb3IgdGhlIGZpbmFsaXplZCBvbmUuCitzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1RlbXBFeHRlbnNpb24gPSAiLm9wZW4iOworc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtGaW5hbEV4dGVuc2lvbiA9ICIudHJ4IjsKKworLy8gQSBsaW1pdCBmb3IgYSBjb3VudGVyIGFwcGVuZGVkIHRvIHRoZSBsb2cgZmlsZW5hbWUgdG8gZW5hYmxlIG11bHRpcGxlIGZpbGVzCisvLyB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQuCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4RmlsZW5hbWVDb3VudGVyID0gMTAwMDAwMDsKKy8vIE51bWJlciBvZiByZXRyaWVzIGZvciBhIGZhaWxlZCBmaWxlIG9wZXJhdGlvbiwgZS5nLiBvcGVuKCksIHJlbmFtZSgpLCBldGMuCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4RmlsZU9wZXJhdGlvblRyaWVzID0gMTAwMDsKKworLy8gQ3JlYXRlIGEgbG9nIGZpbGVuYW1lIHdpdGggdGhlIHBhc3NlZCB8c2Vzc2lvbklkfCwgfGNvdW50ZXJ8IGFuZCB8ZXh0ZW5zaW9ufC4KK3N0YXRpYyBzdGQ6OnN0cmluZyBmb3JtYXRGaWxlbmFtZShTdHJpbmdWaWV3IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IGV4dGVuc2lvbikgeworICAgIHJldHVybiBTdHJpbmdGb3JtYXQoImVtdWxhdG9yLW1ldHJpY3MtJXMtJWQtJWQlcyIsIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpU3lzdGVtOjpnZXQoKS0+Z2V0Q3VycmVudFByb2Nlc3NJZCgpLCBjb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKK30KKworLy8gQSBjcm9zcy1wbGF0Zm9ybSBmdW5jdGlvbiB0byByZW5hbWUgYW4gfGZyb218IGZpbGUgdG8gfHRvfCBuYW1lIG9ubHkgaWYgfHRvfAorLy8gZG9lc24ndCBleGlzdC4KKy8vIE9uIFBPU0lYIG9uZSBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIHx0b3wgZG9lc24ndCBleGlzdCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKy8vIG93ZXJ3cml0dGVuLiBPbiBXaW5kb3dzIHJlbmFtZSgpIG5ldmVyIG92ZXJ3cml0ZXMgdGFyZ2V0Lgorc3RhdGljIGJvb2wgcmVuYW1lSWZOb3RFeGlzdHMoU3RyaW5nVmlldyBmcm9tLCBTdHJpbmdWaWV3IHRvKSB7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIHJlbmFtZShmcm9tLmNfc3RyKCksIHRvLmNfc3RyKCkpID09IDA7CisjZWxzZQorICAgIGlmIChTeXN0ZW06OmdldCgpLT5wYXRoRXhpc3RzKHRvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFRoZXJlJ3MgYSBzbWFsbCBjaGFuY2Ugb2YgcmFjZSBjb25kaXRpb24gaGVyZSwgYnV0IHdlIGRvbid0IGFjdHVhbGx5CisgICAgLy8gcmVuYW1lIGZpbGVzIGluIHNldmVyYWwgdGhyZWFkcywgc28gaXQncyBPSy4KKyAgICAvLyBUT0RPKHp5eSk6IHVzZSByZW5hbWVhdDIoKSBvbiBMaW51eCB0byBtYWtlIGl0IGF0b21pYy4KKyAgICBpZiAoSEFORExFX0VJTlRSKHJlbmFtZShmcm9tLmNfc3RyKCksIHRvLmNfc3RyKCkpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworRmlsZU1ldHJpY3NXcml0ZXI6OkZpbGVNZXRyaWNzV3JpdGVyKFN0cmluZ1ZpZXcgc3Bvb2xEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb3JkQ291bnRMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW06OkR1cmF0aW9uIHRpbWVMaW1pdE1zKQorICAgIDogTWV0cmljc1dyaXRlcihzZXNzaW9uSWQpLAorICAgICAgbVNwb29sRGlyKHNwb29sRGlyKSwKKyAgICAgIG1UaW1lTGltaXRNcyh0aW1lTGltaXRNcyksCisgICAgICBtUmVjb3JkQ291bnRMaW1pdChyZWNvcmRDb3VudExpbWl0KSwKKyAgICAgIG1Mb29wZXIobG9vcGVyKSwKKyAgICAgIG1BY3RpdmVGaWxlTG9jaygKKyAgICAgICAgICBtYWtlQ3VzdG9tU2NvcGVkUHRyPEZpbGVMb2NrKj4obnVsbHB0ciwgZmlsZWxvY2tfcmVsZWFzZSkpIHsKKyAgICBEKCJjcmVhdGVkIGEgRmlsZU1ldHJpY3NXcml0ZXIiKTsKKyAgICBhc3NlcnQoc3RybGVuKHNwb29sRGlyLmRhdGEoKSkgPT0gc3Bvb2xEaXIuc2l6ZSgpKTsKKyAgICBwYXRoX21rZGlyX2lmX25lZWRlZChzcG9vbERpci5kYXRhKCksIDA3NDQpOworICAgIGFzc2VydChTeXN0ZW06OmdldCgpLT5wYXRoSXNEaXIoc3Bvb2xEaXIpKTsKKworICAgIC8vIEl0J3MgT0sgdG8gY2FsbCB0aGlzIHdpdGhvdXQgYSBsb2NrIGluIGN0b3IgLSB0aGVyZSdzIG5vIGV4dGVybmFsCisgICAgLy8gcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IHlldC4KKyAgICBvcGVuTmV3RmlsZU5vTG9jaygpOworfQorCitGaWxlTWV0cmljc1dyaXRlcjo6UHRyIEZpbGVNZXRyaWNzV3JpdGVyOjpjcmVhdGUoU3RyaW5nVmlldyBzcG9vbERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNvcmRDb3VudExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6RHVyYXRpb24gdGltZUxpbWl0TXMpIHsKKyAgICByZXR1cm4gUHRyKG5ldyBGaWxlTWV0cmljc1dyaXRlcihzcG9vbERpciwgc2Vzc2lvbklkLCByZWNvcmRDb3VudExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BlciwgdGltZUxpbWl0TXMpKTsKK30KKworTWV0cmljc1dyaXRlcjo6QWJhbmRvbmVkU2Vzc2lvbnMKK0ZpbGVNZXRyaWNzV3JpdGVyOjpmaW5hbGl6ZUFiYW5kb25lZFNlc3Npb25GaWxlcyhTdHJpbmdWaWV3IHNwb29sRGlyKSB7CisgICAgQWJhbmRvbmVkU2Vzc2lvbnMgYWJhbmRvbmVkU2Vzc2lvbnM7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzID0KKyAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPnNjYW5EaXJFbnRyaWVzKHNwb29sRGlyKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlIDogZmlsZXMpIHsKKyAgICAgICAgaWYgKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGUpICE9IGtUZW1wRXh0ZW5zaW9uKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyeSB0byBsb2NrIHRoZSBmaWxlIHRvIGZpbmQgb3V0IGlmIGl0J3MgYWJhbmRvbmVkCisgICAgICAgIGNvbnN0IGF1dG8gbG9jayA9IG1ha2VDdXN0b21TY29wZWRQdHIoCisgICAgICAgICAgICAgICAgZmlsZWxvY2tfY3JlYXRlKFBhdGhVdGlsczo6am9pbihzcG9vbERpciwgZmlsZSkuY19zdHIoKSksCisgICAgICAgICAgICAgICAgZmlsZWxvY2tfcmVsZWFzZSk7CisgICAgICAgIGlmICghbG9jaykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJzZSB0aGUgZmlsZSBuYW1lIHRvIGdldCBzZXNzaW9uIElEIGFuZCB0aGUgZmlsZW5hbWUgY291bnRlcgorICAgICAgICBpbnQgZmlsZW5hbWVDb3VudGVyID0gMDsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2Vzc2lvbklkID0gVXVpZDo6bnVsbFV1aWRTdHI7CisgICAgICAgIGFzc2VydChzZXNzaW9uSWQuc2l6ZSgpID49IDM2KTsKKyAgICAgICAgaW50IHNjYW5uZWQgPSBzc2NhbmYoZmlsZS5jX3N0cigpLCAiZW11bGF0b3ItbWV0cmljcy0lMzZzLSUqZC0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWRbMF0sICZmaWxlbmFtZUNvdW50ZXIpOworICAgICAgICBhc3NlcnQoc2Nhbm5lZCA9PSAyKTsKKyAgICAgICAgKHZvaWQpc2Nhbm5lZDsKKworICAgICAgICAvLyBub3cgcmVuYW1lIGl0CisgICAgICAgIGlmICghcnVuRmlsZU9wZXJhdGlvbldpdGhSZXRyaWVzKCZmaWxlbmFtZUNvdW50ZXIsIFtzcG9vbERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWVDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVdKCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmluYWxOYW1lID0gUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgc3Bvb2xEaXIsIGZvcm1hdEZpbGVuYW1lKHNlc3Npb25JZCwgZmlsZW5hbWVDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtGaW5hbEV4dGVuc2lvbikpOworICAgICAgICAgICAgICAgIHJldHVybiByZW5hbWVJZk5vdEV4aXN0cyhQYXRoVXRpbHM6OmpvaW4oc3Bvb2xEaXIsIGZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbE5hbWUpOworICAgICAgICAgICAgfSkpIHsKKyAgICAgICAgICAgIFcoImZhaWxlZCB0byByZW5hbWUgYW4gYWJhbmRvbmVkIGxvZyBmaWxlICclcyciLCBmaWxlLmNfc3RyKCkpOworICAgICAgICB9CisKKyAgICAgICAgYWJhbmRvbmVkU2Vzc2lvbnMuaW5zZXJ0KHN0ZDo6bW92ZShzZXNzaW9uSWQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYWJhbmRvbmVkU2Vzc2lvbnM7Cit9CisKK0ZpbGVNZXRyaWNzV3JpdGVyOjp+RmlsZU1ldHJpY3NXcml0ZXIoKSB7CisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1UaW1lcikgeworICAgICAgICBtVGltZXItPnN0b3AoKTsKKyAgICAgICAgbVRpbWVyLnJlc2V0KCk7CisgICAgfQorICAgIGZpbmFsaXplQWN0aXZlRmlsZU5vTG9jaygpOworfQorCit2b2lkIEZpbGVNZXRyaWNzV3JpdGVyOjpmaW5hbGl6ZUFjdGl2ZUZpbGVOb0xvY2soKSB7CisgICAgaWYgKCFtQWN0aXZlRmlsZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUFjdGl2ZUZpbGUucmVzZXQoKTsKKyAgICBpZiAoIXJ1bkZpbGVPcGVyYXRpb25XaXRoUmV0cmllcygmbUZpbGVuYW1lQ291bnRlciwgW3RoaXNdKCkgLT4gYm9vbCB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaW5hbE5hbWUgPSBQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICAgICAgICAgIG1TcG9vbERpciwgZm9ybWF0RmlsZW5hbWUoc2Vzc2lvbklkKCksIG1GaWxlbmFtZUNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZpbmFsRXh0ZW5zaW9uKSk7CisgICAgICAgICAgICByZXR1cm4gcmVuYW1lSWZOb3RFeGlzdHMobUFjdGl2ZUZpbGVOYW1lLCBmaW5hbE5hbWUpOworICAgICAgICB9KSkgeworICAgICAgICBXKCJmYWlsZWQgdG8gcmVuYW1lIGFuIGFjdGl2ZSBsb2cgZmlsZSAnJXMnIiwgbUFjdGl2ZUZpbGVOYW1lLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoImZpbmFsaXplZCBhY3RpdmUgbG9nIGZpbGUgJyVzJyIsIG1BY3RpdmVGaWxlTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgbUFjdGl2ZUZpbGVMb2NrLnJlc2V0KCk7CisgICAgbUFjdGl2ZUZpbGVOYW1lLmNsZWFyKCk7CisgICAgbVJlY29yZENvdW50ID0gMDsKKyAgICAvLyBXZSd2ZSBkb25lIHdpdGggdGhlIGN1cnJlbnQgZmlsZSBubywgbWFrZSBzdXJlIHRoZSBuZXh0IG9uZSBnZXRzIGEKKyAgICAvLyBuZXcgY291bnRlciB2YWx1ZS4KKyAgICBhZHZhbmNlRmlsZW5hbWVDb3VudGVyKCZtRmlsZW5hbWVDb3VudGVyKTsKK30KKwordm9pZCBGaWxlTWV0cmljc1dyaXRlcjo6b3Blbk5ld0ZpbGVOb0xvY2soKSB7CisgICAgc3RkOjpzdHJpbmcgbmV3TmFtZTsKKyAgICBpbnQgZmQgPSAtMTsKKyAgICBpZiAoIXJ1bkZpbGVPcGVyYXRpb25XaXRoUmV0cmllcygmbUZpbGVuYW1lQ291bnRlciwgW3RoaXMsICZuZXdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZkXSgpIC0+IGJvb2wgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICAgICAgICAgIG1TcG9vbERpciwgZm9ybWF0RmlsZW5hbWUoc2Vzc2lvbklkKCksIG1GaWxlbmFtZUNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RlbXBFeHRlbnNpb24pKTsKKworICAgICAgICAgICAgbUFjdGl2ZUZpbGVMb2NrLnJlc2V0KGZpbGVsb2NrX2NyZWF0ZSh0ZXN0TmFtZS5jX3N0cigpKSk7CisgICAgICAgICAgICBpZiAoIW1BY3RpdmVGaWxlTG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGludCB0ZXN0RmQgPSBIQU5ETEVfRUlOVFIoCisgICAgICAgICAgICAgICAgICAgIG9wZW4odGVzdE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBrQ29tbW9uT3BlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNfSVJFQUQgfCBTX0lXUklURSkpOworICAgICAgICAgICAgaWYgKHRlc3RGZCA8IDApIHsKKyAgICAgICAgICAgICAgICBtQWN0aXZlRmlsZUxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdOYW1lID0gc3RkOjptb3ZlKHRlc3ROYW1lKTsKKyAgICAgICAgICAgIGZkID0gdGVzdEZkOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0pKSB7CisgICAgICAgIFcoImZhaWxlZCB0byBvcGVuIGEgbmV3IGxvZyBmaWxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhc3NlcnQoZmQgPj0gMCk7CisgICAgYXNzZXJ0KCFuZXdOYW1lLmVtcHR5KCkpOworCisgICAgbUFjdGl2ZUZpbGUucmVzZXQobmV3IGdvb2dsZTo6cHJvdG9idWY6OmlvOjpGaWxlT3V0cHV0U3RyZWFtKGZkKSk7CisgICAgaWYgKCFtQWN0aXZlRmlsZSkgeworICAgICAgICBFKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBIQU5ETEVfRUlOVFIodW5saW5rKG5ld05hbWUuY19zdHIoKSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1BY3RpdmVGaWxlLT5TZXRDbG9zZU9uRGVsZXRlKHRydWUpOworICAgIG1BY3RpdmVGaWxlTmFtZSA9IHN0ZDo6bW92ZShuZXdOYW1lKTsKKyAgICBtUmVjb3JkQ291bnQgPSAwOworCisgICAgRCgib3BlbmVkIG5ldyBtZXRyaWNzIGZpbGUgJXMiLCBtQWN0aXZlRmlsZU5hbWUuY19zdHIoKSk7Cit9CisKK2Jvb2wgRmlsZU1ldHJpY3NXcml0ZXI6OmNvdW50TGltaXRSZWFjaGVkKCkgY29uc3QgeworICAgIC8vIE9ubHkgY2hlY2sgdGhlIGNvdW50IGxpbWl0IGlmIHRoZXJlIGlzIG9uZS4KKyAgICByZXR1cm4gbVJlY29yZENvdW50TGltaXQgPiAwICYmIG1SZWNvcmRDb3VudCA+PSBtUmVjb3JkQ291bnRMaW1pdDsKK30KKwordm9pZCBGaWxlTWV0cmljc1dyaXRlcjo6YWR2YW5jZUZpbGVuYW1lQ291bnRlcihpbnQqIGNvdW50ZXIpIHsKKyAgICAqY291bnRlciA9ICgqY291bnRlciArIDEpICUga01heEZpbGVuYW1lQ291bnRlcjsKK30KKwordm9pZCBGaWxlTWV0cmljc1dyaXRlcjo6ZW5zdXJlVGltZXJTdGFydGVkKCkgeworICAgIGlmIChtVGltZXIgfHwgbVRpbWVMaW1pdE1zIDw9IDAgfHwgIW1Mb29wZXIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1UaW1lci5yZXNldChtTG9vcGVyLT5jcmVhdGVUaW1lcigKKyAgICAgICAgICAgIFtdKHZvaWQqIHdlYWtTZWxmLCBMb29wZXI6OlRpbWVyKiB0aW1lcikgeworICAgICAgICAgICAgICAgIGF1dG8gd2Vha1B0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGaWxlTWV0cmljc1dyaXRlcjo6V1B0cio+KHdlYWtTZWxmKTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0byBwdHIgPSB3ZWFrUHRyLT5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyLT5vblRpbWVyKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdlYWtQdHI7ICAvLyB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIG5ldyBXUHRyKHNoYXJlZF9mcm9tX3RoaXMoKSkpKTsKKyAgICBpZiAobVRpbWVyKSB7CisgICAgICAgIG1UaW1lci0+c3RhcnRSZWxhdGl2ZShtVGltZUxpbWl0TXMpOworCisgICAgICAgIEQoInN0YXJ0ZWQgbWV0cmljcyB0aW1lciB3aXRoIGEgcGVyaW9kIG9mICVkIG1zIiwKKyAgICAgICAgICBtVGltZUxpbWl0TXMpOworICAgIH0KK30KKwordm9pZCBGaWxlTWV0cmljc1dyaXRlcjo6b25UaW1lcigpIHsKKyAgICBEKCJ0aW1lciB0aWNrIik7CisKKyAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVJlY29yZENvdW50ID4gMCkgeworICAgICAgICBmaW5hbGl6ZUFjdGl2ZUZpbGVOb0xvY2soKTsKKyAgICAgICAgb3Blbk5ld0ZpbGVOb0xvY2soKTsKKyAgICB9CisKKyAgICBtVGltZXItPnN0YXJ0UmVsYXRpdmUobVRpbWVMaW1pdE1zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIE9wZXJhdGlvbj4KK2Jvb2wgRmlsZU1ldHJpY3NXcml0ZXI6OnJ1bkZpbGVPcGVyYXRpb25XaXRoUmV0cmllcyhpbnQqIGZpbGVuYW1lQ291bnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3ApIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhGaWxlT3BlcmF0aW9uVHJpZXM7CisgICAgICAgICArK2ksIGFkdmFuY2VGaWxlbmFtZUNvdW50ZXIoZmlsZW5hbWVDb3VudGVyKSkgeworICAgICAgICBpZiAob3AoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRmlsZU1ldHJpY3NXcml0ZXI6OndyaXRlKAorICAgICAgICBjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmIGV2ZW50KSB7CisgICAgRCgid3JpdGluZyBhIGxvZyBldmVudCB3aXRoIHVwdGltZSAlbGQgbXMiLCBldmVudC5ldmVudF91cHRpbWVfbXMoKSk7CisKKyAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmICghbUFjdGl2ZUZpbGUpIHsKKyAgICAgICAgb3Blbk5ld0ZpbGVOb0xvY2soKTsKKyAgICB9CisgICAgaWYgKCFtQWN0aXZlRmlsZSkgeworICAgICAgICBXKCJObyBhY3RpdmUgbG9nIGZpbGUgZHVyaW5nIHdyaXRlKCksIGV2ZW50IGxvc3Q6XG4lcyIsCisgICAgICAgICAgZXZlbnQuRGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbnN1cmVUaW1lclN0YXJ0ZWQoKTsKKworICAgIHByb3RvYnVmOjp3cml0ZU9uZURlbGltaXRlZChldmVudCwgbUFjdGl2ZUZpbGUuZ2V0KCkpOworICAgIC8vIEZpbGVPdXRwdXRTdHJlYW0gYnVmZmVycyBldmVyeXRoaW5nIGl0IGNhbiwgYnV0IGl0IG1lYW5zIHdlIG1heSBsb3NlCisgICAgLy8gYSBtZXNzYWdlIG9uIGEgY3Jhc2gsIHNvIGxldCdzIGp1c3QgZmx1c2ggaXQgZXZlcnkgdGltZS4KKyAgICAvLyBTaG91bGRuJ3QgYWZmZWN0IHBlcmZvcm1hbmNlIGFzIGl0J3MgZXhwZWN0ZWQgdGhhdCBvbmx5IGFzeW5jaHJvbm91cworICAgIC8vIG1ldHJpY3MgcmVwb3J0ZXIgaXMgdXNlZCBpbiB0aGUgZW11bGF0b3IgcHJvY2Vzcy4KKyAgICBtQWN0aXZlRmlsZS0+Rmx1c2goKTsKKyAgICArK21SZWNvcmRDb3VudDsKKworICAgIGlmIChjb3VudExpbWl0UmVhY2hlZCgpKSB7CisgICAgICAgIGZpbmFsaXplQWN0aXZlRmlsZU5vTG9jaygpOworICAgICAgICBvcGVuTmV3RmlsZU5vTG9jaygpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9GaWxlTWV0cmljc1dyaXRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2UzMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuaApAQCAtMCwwICsxLDE1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1dyaXRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZWxvY2suaCIKKworI2luY2x1ZGUgImdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLworLy8gRmlsZU1ldHJpY3NXcml0ZXIgLSBhIE1ldHJpY3NXcml0ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBzZXJpYWxpemVzIGluY29taW5nCisvLyBtZXNzYWdlcyBpbnRvIGEgYmluYXJ5IGZpbGUsIHVzaW5nIHByb3RvYnVmJ3Mgd3JpdGVEZWxpbWl0ZWQoKSBjYWxsLgorLy8gVGhpcyBpcyB0aGUgd2F5IEFuZHJvaWQgU3R1ZGlvIHNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2VzIGFuZCBob3cgaXRzIG1ldHJpY3MKKy8vIHNlbmRlciBleHBlY3RzIHRoZW0gdG8gYmUgc3RvcmVkLgorLy8KKy8vIENsYXNzIGFsc28gbWFuYWdlcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGZpbGVzLCByb3RhdGluZyB0aGVtIGV2ZXJ5CisvLyB8cmVjb3JkQ291bnRMaW1pdHwgbWVzc2FnZXMgb3IgfHRpbWVMaW1pdE1zfCBtaWxsaXNlY29uZHMgKGlmIHRoZXJlIHdhcyBhdAorLy8gbGVhc3Qgb25lIG1lc3NhZ2UgZHVyaW5nIHRoYXQgdGltZSkuCisvLworLy8gQW5kcm9pZCBTdHVkaW8ncyBtZXRyaWNzIHNlbmRlciBtb25pdG9ycyB0aGUgc3Bvb2wgZGlyZWN0b3J5IGZvciAudHJ4IGZpbGVzCisvLyBhbmQgc2VuZHMgdGhlbSBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgYXJlbid0IGxvY2tlZCB3aXRoIEphdmEncyBGaWxlTG9jay4KKy8vIEphdmEgaW1wbGVtZW50cyBGaWxlTG9jayBpbiBzb21lIHVuc3BlY2lmaWVkICdwbGF0Zm9ybS1uYXRpdmUnIHdheSwgc28KKy8vIGluc3RlYWQgb2YgdHJ5aW5nIHRvIG1pbWljIHRoYXQsIEZpbGVNZXRyaWNzV3JpdGVyIHVzZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2g6CisvLworLy8gICAxLiBDcmVhdGUgYSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgZXh0ZW5zaW9uLCAub3BlbgorLy8gICAyLiBMb2NrIHRoYXQgZmlsZSB3aXRoIGVtdWxhdG9yJ3MgRmlsZUxvY2sgaW5zdGVhZCBvZiB0aGUgSmF2YSdzIG9uZS4KKy8vICAgMy4gV2hlbiBmaW5hbGl6aW5nIHRoZSBmaWxlIChlLmcuIG9wZW5pbmcgYSBuZXcgb25lIG9yIHN0b3BwaW5nIHRoZSB3cml0ZXIpCisvLyAgICAgIHJlbmFtZSBpdCAub3BlbiAtPiAudHJ4IGFuZCB1bmxvY2sgYWZ0ZXIgdGhhdC4KKy8vICAgNC4gUHJvdmlkZSBhIG1ldGhvZCB0byBjb2xsZWN0IGFsbCAnYWJhbmRvbmVkJyBmaWxlcyB0aGF0IGFyZSBub3QgbG9ja2VkCisvLyAgICAgIGJ1dCBhcmVudCAudHJ4IHlldC4gVGhpcyBpcyB0byBkZXRlY3QgY3Jhc2hlZCBlbXVsYXRvciBpbnN0YW5jZXMgYW5kCisvLyAgICAgIG1ha2Ugc3VyZSB0aGVpciBsb2dzIGFyZSBzZW50LgorLy8gICA1LiBJbmNsdWRlIHRoZSBzZXNzaW9uIElEIGludG8gdGhlIGxvZyBmaWxlIG5hbWUgdG8gYmUgYWJsZSB0byByZXBvcnQgdGhlCisvLyAgICAgIGNyYXNoZWQgZW11bGF0b3IncyBzZXNzaW9uSUQgd2l0aG91dCBwYXJzaW5nIHRoZSBmaWxlIChvciBpZiBpdCBjcmFzaGVkCisvLyAgICAgIGJlZm9yZSB3cml0aW5nIGEgc2luZ2xlIG1lc3NhZ2UpLgorLy8KKy8vIFRoaXMgYXBwcm9hY2ggYWxsb3dzIGVtdWxhdG9yIHRvIHJldXNlIEFuZHJvaWQgU3R1ZGlvJ3MgbWV0cmljcyBzZW5kZXIKKy8vIHdpdGhvdXQgcmVseWluZyBvbiBpdHMgSmF2YS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KKy8vCisKK2NsYXNzIEZpbGVNZXRyaWNzV3JpdGVyIGZpbmFsCisgICAgICAgIDogcHVibGljIE1ldHJpY3NXcml0ZXIsCisgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8RmlsZU1ldHJpY3NXcml0ZXI+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8RmlsZU1ldHJpY3NXcml0ZXI+OworICAgIHVzaW5nIFdQdHIgPSBzdGQ6OndlYWtfcHRyPEZpbGVNZXRyaWNzV3JpdGVyPjsKKworICAgIC8vIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgRmlsZU1ldHJpY3NXcml0ZXIuCisgICAgLy8gIHxzcG9vbERpcnwgLSBhIGRpcmVjdG9yeSB0byBwdXQgZmlsZXMgaW50by4KKyAgICAvLyAgfHNlc3Npb25JZHwgLSBlbXVsYXRvciBzZXNzaW9uIChydW4pIElEIGZvciBtZXRyaWNzIGxvZ2dpbmcuCisgICAgLy8gIHxyZWNvcmRDb3VudExpbWl0fCAtIGNyZWF0ZSBuZXcgZmlsZSBhZnRlciBsb2dnaW5nIHRoaXMgbWFueSBldmVudHMuCisgICAgLy8gICAgICBEaXNhYmxlZCBpZiA8PTAuCisgICAgLy8gIHxsb29wZXJ8IC0gYW4gaW5zdGFuY2Ugb2YgYSB8TG9vcGVyfCBvYmplY3QgdG8gY3JlYXRlIHRpbWVkIGV2ZW50cy4KKyAgICAvLyAgfHRpbWVMaW1pdE1zfCAtIGNyZWF0ZSBuZXcgZmlsZSBhZnRlciB0aGlzIG1hbnkgbWlsbGlzZWNvbmRzLCBpZiB0aGVyZQorICAgIC8vICAgICAgd2FzIGF0IGxlYXN0IG9uZSBldmVudCBsb2dnZWQuIERpc2FibGVkIGlmIDw9MCBvciB8bG9nZ2VyfCBpcyBOVUxMLgorICAgIHN0YXRpYyBQdHIgY3JlYXRlKGJhc2U6OlN0cmluZ1ZpZXcgc3Bvb2xEaXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb3JkQ291bnRMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVMaW1pdE1zKTsKKworICAgIC8vIFNjYW5zIHRoZSB8c3Bvb2xEaXJ8IGRpcmVjdG9yeSBmb3IgdW5sb2NrZWQgbm9uLWZpbmFsemVkIGxvZyBmaWxlcworICAgIC8vICgqLm9wZW4pLCByZW5hbWVzIHRob3NlIHRvIHRoZSBjb3JyZWN0IC50cnggZmlsZXMgYW5kIHJldHVybnMgYSBzZXQgb2YKKyAgICAvLyBzZXNzaW9ucyB0aGF0IGhhZCBzdWNoIGZpbGVzLiBVc2VmdWwgZm9yIGEgY2xlYW51cCBvciBjcmFzaCByZXBvcnRpbmcKKyAgICAvLyBwcm9jZXNzLgorICAgIHN0YXRpYyBBYmFuZG9uZWRTZXNzaW9ucyBmaW5hbGl6ZUFiYW5kb25lZFNlc3Npb25GaWxlcygKKyAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgc3Bvb2xEaXIpOworCisgICAgfkZpbGVNZXRyaWNzV3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRyaWNzV3JpdGVyOjp3cml0ZSgpIGltcGxlbWVudGF0aW9uIHRoYXQgd3JpdGVzIGludG8gdGhlIGN1cnJlbnQgbG9nCisgICAgLy8gZmlsZS4KKyAgICB2b2lkIHdyaXRlKGNvbnN0IHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCYgZXZlbnQpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIC8vIEEgcHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBlbmZvcmNlIHRoZSB1c2Ugb2Ygc2hhcmVkX3B0cjw+LgorICAgIEZpbGVNZXRyaWNzV3JpdGVyKGJhc2U6OlN0cmluZ1ZpZXcgc3Bvb2xEaXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjb3JkQ291bnRMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHRpbWVMaW1pdE1zKTsKKyAgICB2b2lkIGZpbmFsaXplQWN0aXZlRmlsZU5vTG9jaygpOworICAgIHZvaWQgb3Blbk5ld0ZpbGVOb0xvY2soKTsKKyAgICBib29sIGNvdW50TGltaXRSZWFjaGVkKCkgY29uc3Q7CisKKyAgICAvLyBUaW1lciBjcmVhdGlvbiBuZWVkcyBzaGFyZWRfZnJvbV90aGlzKCksIGJ1dCBpdCBpc24ndCBhdmFpbGFibGUgaW4gY2xhc3MKKyAgICAvLyBjdG9yOyB0aGF0J3Mgd2h5IHdlIGhhdmUgdGhpcyBmdW5jdGlvbiBmb3IgYSBsYXp5IHRpbWVyIGNyZWF0aW9uLgorICAgIHZvaWQgZW5zdXJlVGltZXJTdGFydGVkKCk7CisgICAgdm9pZCBvblRpbWVyKCk7CisKKyAgICAvLyBSdW5zIGEgcmVxdWVzdGVkIGZpbGUgb3BlcmF0aW9uIHVudGlsIGl0IHN1Y2NlZWRzIG9yIHVwIHRvIGEgcHJlZGVmaW5lZAorICAgIC8vIG51bWJlciBvZiB0cmllcy4KKyAgICAvLyB8ZmlsZW5hbWVDb3VudGVyfCAtIGEgcG9pbnRlciB0byBhIGNvdW50ZXIgdG8gaW5jcmVtZW50IG9uIGVhY2ggdHJ5LgorICAgIC8vIHxvcHwgLSBvcGVyYXRpb24gdG8gcnVuLCBzaG91bGQgYmUgY2FsbGFibGUgd2l0aCBubyBhcmd1bWVudHMgYW5kCisgICAgLy8gICAgICAgIHJldHVybiB8dHJ1ZXwgd2hlbiBpdCBzdWNjZWVkcy4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgT3BlcmF0aW9uPgorICAgIHN0YXRpYyBib29sIHJ1bkZpbGVPcGVyYXRpb25XaXRoUmV0cmllcyhpbnQqIGZpbGVuYW1lQ291bnRlciwgT3BlcmF0aW9uIG9wKTsKKworICAgIC8vIEluY3JlbWVudHMgYSBwYXNzZWQgKnxjb3VudGVyfCwgd3JhcHBpbmcgaXQgYXQgYSBwcmVkZWZpbmVkIGxpbWl0LgorICAgIHN0YXRpYyB2b2lkIGFkdmFuY2VGaWxlbmFtZUNvdW50ZXIoaW50KiBjb3VudGVyKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtU3Bvb2xEaXI7CisgICAgY29uc3QgYmFzZTo6U3lzdGVtOjpEdXJhdGlvbiBtVGltZUxpbWl0TXM7CisgICAgY29uc3QgaW50IG1SZWNvcmRDb3VudExpbWl0OworICAgIGJhc2U6Okxvb3BlciogY29uc3QgbUxvb3BlcjsKKworICAgIC8vIFRoaXMgbG9jayBwcm90ZWN0cyBhbGwgbXV0YWJsZSBtZW1iZXJzLiBJdCdzIE9LIHRvIGhhdmUgYSBzaW5nbGUgbG9jayBmb3IKKyAgICAvLyBldmVyeXRoaW5nIGFzIHdlIGRvbid0IHJlYWxseSBleHBlY3QgYW55IGNvbnRlbnRpb24gLSB0aGUgaWRlYSBpcyB0aGF0CisgICAgLy8gbW9zdCBvZiB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkIGZyb20gYSBzaW5nbGUgd29ya2VyIHRocmVhZCBvZgorICAgIC8vIEFzeW5jTWV0cmljc1JlcG9ydGVyLgorICAgIGJhc2U6OkxvY2sgbUxvY2s7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YmFzZTo6TG9vcGVyOjpUaW1lcj4gbVRpbWVyOworICAgIHN0ZDo6c3RyaW5nIG1BY3RpdmVGaWxlTmFtZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkZpbGVPdXRwdXRTdHJlYW0+IG1BY3RpdmVGaWxlOworICAgIGJhc2U6OlNjb3BlZEN1c3RvbVB0cjxGaWxlTG9jaywgZGVjbHR5cGUoJmZpbGVsb2NrX3JlbGVhc2UpPgorICAgICAgICAgICAgbUFjdGl2ZUZpbGVMb2NrOworICAgIC8vIE51bWJlciBvZiByZWNvcmRzIGxvZ2dlZCBpbnRvIHRoZSBjdXJyZW50IGFjdGl2ZSBmaWxlLgorICAgIGludCBtUmVjb3JkQ291bnQgPSAwOworCisgICAgLy8gQSBjb3VudGVyIHZhcmlhYmxlIHRoYXQncyBhcHBlbmRlZCB0byB0aGUgZmlsZSBuYW1lIHRvIG1ha2UgaXQgdW5pcXVlLgorICAgIC8vIFdlIHByZXNlcnZlIGl0IGFzIGFuIG9iamVjdCBzdGF0ZSB0byBtYWtlIHN1cmUgd2Ugc3RhcnQgZnJvbSB0aGUgbmV4dAorICAgIC8vIGNvdW50ZXIgdmFsdWUgZXZlcnkgdGltZSB3ZSBwZXJmb3JtIGFuIG9wZW4oKSBvciByZW5hbWUoKSAtIHRoaXMgd2F5CisgICAgLy8gd2UgaGF2ZSB0aGUgbGVhc3QgbnVtYmVyIG9mIG5hbWUgY2xhc2hlcywgY29tcGFyZWQgdG8gYWx3YXlzIHN0YXJ0aW5nCisgICAgLy8gZnJvbSAwLgorICAgIGludCBtRmlsZW5hbWVDb3VudGVyID0gMDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc0xvZ2dpbmcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NMb2dnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyOTRkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NMb2dnaW5nLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5naWZ5LmgiCisKKy8vCisvLyBBIHNldCBvZiB1c2VmdWwgZGVidWcgbG9nZ2luZyBtYWNyb3MgZm9yIHRoZSB3aG9sZSBtZXRyaWNzLyBzdWJkaXJlY3RvcnkuCisvLworCisjZGVmaW5lIEQoZm9ybWF0LCAuLi4pIFwKKyAgICAgICAgVkVSQk9TRV9QUklOVChtZXRyaWNzLCBcCisgICAgICAgICAgICAiKG1ldHJpY3M6OiVzKSAiIGZvcm1hdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgVyhmb3JtYXQsIC4uLikgXAorICAgIGRvIHsgXAorICAgICAgICBkd2FybmluZygiKG1ldHJpY3MpICIgZm9ybWF0LCAjI19fVkFfQVJHU19fKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRShmb3JtYXQsIC4uLikgXAorICAgIGRvIHsgXAorICAgICAgICBkZXJyb3IoIihtZXRyaWNzKSAiIGZvcm1hdCwgIyNfX1ZBX0FSR1NfXyk7IFwKKyAgICB9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NQYXRocy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmYWRlNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NQYXRocy5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpDb25maWdEaXJzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKK3N0ZDo6c3RyaW5nIGdldFNldHRpbmdzRmlsZVBhdGgoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgICAgICBDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCksICJhbmFseXRpY3Muc2V0dGluZ3MiKTsKK30KKworc3RkOjpzdHJpbmcgZ2V0U3Bvb2xEaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIFBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgICAgICBDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCksICJtZXRyaWNzIiwgInNwb29sIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9NZXRyaWNzUGF0aHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTNkMmFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vIFJldHVybnMgYSBwYXRoIG9mIHRoZSBtZXRyaWNzIHNldHRpbmdzIGZpbGUuCitzdGQ6OnN0cmluZyBnZXRTZXR0aW5nc0ZpbGVQYXRoKCk7CisKKy8vIFJldHVybnMgdGhlIG1ldHJpY3Mgc3Bvb2wgZGlyZWN0b3J5LCB0aGUgb25lIHRoYXQncyBtb25pdG9yZWQgYnkgdGhlIEFuZHJvaWQKKy8vIFN0dWRpbyBtZXRyaWNzIHNlbmRlci4KK3N0ZDo6c3RyaW5nIGdldFNwb29sRGlyZWN0b3J5KCk7CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1MzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvQXN5bmMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVXVpZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9Bc3luY01ldHJpY3NSZXBvcnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9DcmFzaE1ldHJpY3NSZXBvcnRpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnBiLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCituYW1lc3BhY2UgeworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE51bGxNZXRyaWNzUmVwb3J0ZXI+IHNOdWxsSW5zdGFuY2UgPSB7fTsKKworLy8gQSBzbWFsbCBjbGFzcyB0aGF0IGVuc3VyZXMgdGhlcmUncyBhbHdheXMgYW4gaW5zdGFuY2Ugb2YgbWV0cmljcyByZXBvcnRlcgorLy8gcmVhZHkgdG8gcHJvY2VzcyBhIG1ldHJpY3Mgd3JpdGUgcmVxdWVzdC4KKy8vIEJ5IGRlZmF1bHQgaXQncyBhbiBpbnN0YW5jZSBvZiBOdWxsTWV0cmljc1JlcG9ydGVyKCkgd2hpY2ggZGlzY2FyZHMgYWxsCisvLyByZXF1ZXN0cywgYnV0IGl0IGNhbiBiZSByZXNldCB0byBhbnl0aGluZyB0aGF0IGltcGxlbWVudHMgTWV0cmljc1JlcG9ydGVyCisvLyBpbnRlcmZhY2UuCitjbGFzcyBSZXBvcnRlckhvbGRlciBmaW5hbCB7CitwdWJsaWM6CisgICAgUmVwb3J0ZXJIb2xkZXIoKSA6IG1QdHIoc051bGxJbnN0YW5jZS5wdHIoKSkge30KKworICAgIHZvaWQgcmVzZXQoTWV0cmljc1JlcG9ydGVyOjpQdHIgbmV3UHRyKSB7CisgICAgICAgIGlmIChuZXdQdHIpIHsKKyAgICAgICAgICAgIG1QdHIgPSBuZXdQdHIucmVsZWFzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGEgbnVsbCBvbmUgYW5kIGRlbGV0ZSB0aGUgb2xkCisgICAgICAgICAgICAvLyByZXBvcnRlciAoaWYgaXQgd2Fzbid0IGFscmVhZHkgYSBudWxsIHJlcG9ydGVyLgorICAgICAgICAgICAgTWV0cmljc1JlcG9ydGVyKiBvdGhlciA9IHNOdWxsSW5zdGFuY2UucHRyKCk7CisgICAgICAgICAgICBzdGQ6OnN3YXAobVB0ciwgb3RoZXIpOworICAgICAgICAgICAgaWYgKG90aGVyICE9IHNOdWxsSW5zdGFuY2UucHRyKCkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgb3RoZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBNZXRyaWNzUmVwb3J0ZXImIHJlcG9ydGVyKCkgY29uc3QgeyByZXR1cm4gKm1QdHI7IH0KKworcHJpdmF0ZToKKyAgICBNZXRyaWNzUmVwb3J0ZXIqIG1QdHI7Cit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPFJlcG9ydGVySG9sZGVyPiBzSW5zdGFuY2UgPSB7fTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgTWV0cmljc1JlcG9ydGVyOjpzdGFydChjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JGdWxsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IHFlbXVWZXJzaW9uKSB7CisgICAgY29uc3QgYm9vbCBvcHRJbiA9IHN0dWRpbzo6Z2V0VXNlck1ldHJpY3NPcHRJbigpOworICAgIGlmICghb3B0SW4pIHsKKyAgICAgICAgc0luc3RhbmNlLT5yZXNldCh7fSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byB3cml0ZXIgPSBGaWxlTWV0cmljc1dyaXRlcjo6Y3JlYXRlKAorICAgICAgICAgICAgICAgIGdldFNwb29sRGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIDEwMDAsICAgICAgICAgICAgLy8gcmVjb3JkIGxpbWl0IHBlciBzaW5nbGUgZmlsZQorICAgICAgICAgICAgICAgIGJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCksCisgICAgICAgICAgICAgICAgMTAgKiA2MCAqIDEwMDApOyAvLyB0aW1lIGxpbWl0IGZvciBhIHNpbmdsZSBmaWxlLCBtcworICAgICAgICBzSW5zdGFuY2UtPnJlc2V0KAorICAgICAgICAgICAgICAgICAgICBQdHIobmV3IEFzeW5jTWV0cmljc1JlcG9ydGVyKHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3JGdWxsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11VmVyc2lvbikpKTsKKworICAgICAgICAvLyBSdW4gdGhlIGFzeW5jaHJvbm91cyBjbGVhbnVwL3JlcG9ydGluZyBqb2Igbm93LgorICAgICAgICBiYXNlOjphc3luYyhbXSB7CisgICAgICAgICAgICBjb25zdCBhdXRvIHNlc3Npb25zID0KKyAgICAgICAgICAgICAgICAgICAgRmlsZU1ldHJpY3NXcml0ZXI6OmZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3Bvb2xEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICByZXBvcnRDcmFzaE1ldHJpY3MoZ2V0KCksIHNlc3Npb25zKTsKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2b2lkIE1ldHJpY3NSZXBvcnRlcjo6c3RvcCgpIHsKKyAgICAvLyBGaW5hbGl6ZSB0aGUgbWV0cmljcyB3aXRoIGEgImRpZG4ndCBjcmFzaCIgbWVzc2FnZS4KKyAgICBzSW5zdGFuY2UtPnJlcG9ydGVyKCkucmVwb3J0KAorICAgICAgICAgICAgICAgIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX2RldGFpbHMoKS0+c2V0X2NyYXNoZXMoMCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgc0luc3RhbmNlLT5yZXNldCh7fSk7Cit9CisKK01ldHJpY3NSZXBvcnRlciYgTWV0cmljc1JlcG9ydGVyOjpnZXQoKSB7CisgICAgcmV0dXJuIHNJbnN0YW5jZS0+cmVwb3J0ZXIoKTsKK30KKwordm9pZCBNZXRyaWNzUmVwb3J0ZXI6OnJlcG9ydChDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXBvcnRDb25kaXRpb25hbChbY2FsbGJhY2tdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgIGNhbGxiYWNrKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSk7Cit9CisKK01ldHJpY3NSZXBvcnRlcjo6TWV0cmljc1JlcG9ydGVyKGJvb2wgZW5hYmxlZCwgTWV0cmljc1dyaXRlcjo6UHRyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvckZ1bGxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBxZW11VmVyc2lvbikKKyAgICA6IG1Xcml0ZXIoc3RkOjptb3ZlKHdyaXRlcikpLAorICAgICAgbUVuYWJsZWQoZW5hYmxlZCksCisgICAgICBtU3RhcnRUaW1lTXMoU3lzdGVtOjpnZXQoKS0+Z2V0VW5peFRpbWVVcygpIC8gMTAwMCksCisgICAgICBtRW11bGF0b3JWZXJzaW9uKGVtdWxhdG9yVmVyc2lvbiksCisgICAgICBtRW11bGF0b3JGdWxsVmVyc2lvbihlbXVsYXRvckZ1bGxWZXJzaW9uKSwKKyAgICAgIG1RZW11VmVyc2lvbihxZW11VmVyc2lvbikgeworICAgIGFzc2VydChtV3JpdGVyKTsKK30KKworTWV0cmljc1JlcG9ydGVyOjp+TWV0cmljc1JlcG9ydGVyKCkgPSBkZWZhdWx0OworCitib29sIE1ldHJpY3NSZXBvcnRlcjo6aXNSZXBvcnRpbmdFbmFibGVkKCkgY29uc3QgeworICAgIHJldHVybiBtRW5hYmxlZDsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcmIE1ldHJpY3NSZXBvcnRlcjo6c2Vzc2lvbklkKCkgY29uc3QgeworICAgIC8vIFByb3RlY3QgdGhpcyBmcm9tIHVuZXhwZWN0ZWQgY2hhbmdlcyBpbiB0aGUgTWV0cmljc1dyaXRlciBpbnRlcmZhY2UuCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3JlZmVyZW5jZTxkZWNsdHlwZShtV3JpdGVyLT5zZXNzaW9uSWQoKSk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNZXRyaWNzV3JpdGVyOjpzZXNzaW9uSWQoKSBtdXN0IHJldHVybiBhIHJlZmVyZW5jZSIpOworICAgIHJldHVybiBtV3JpdGVyLT5zZXNzaW9uSWQoKTsKK30KKwordm9pZCBNZXRyaWNzUmVwb3J0ZXI6OnNlbmRUb1dyaXRlcigKKyAgICAgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQgbG9nRXZlbnQ7CisKKyAgICBjb25zdCBhdXRvIHRpbWVNcyA9IFN5c3RlbTo6Z2V0KCktPmdldFVuaXhUaW1lVXMoKSAvIDEwMDA7CisgICAgbG9nRXZlbnQuc2V0X2V2ZW50X3RpbWVfbXModGltZU1zKTsKKyAgICBsb2dFdmVudC5zZXRfZXZlbnRfdXB0aW1lX21zKHRpbWVNcyAtIG1TdGFydFRpbWVNcyk7CisKKyAgICBpZiAoIWV2ZW50LT5oYXNfa2luZCgpKSB7CisgICAgICAgIGV2ZW50LT5zZXRfa2luZChhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50OjpFTVVMQVRPUl9QSU5HKTsKKyAgICB9CisKKyAgICBldmVudC0+bXV0YWJsZV9wcm9kdWN0X2RldGFpbHMoKS0+c2V0X3Byb2R1Y3QoCisgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6UHJvZHVjdERldGFpbHM6OkVNVUxBVE9SKTsKKyAgICBpZiAoIW1FbXVsYXRvclZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBldmVudC0+bXV0YWJsZV9wcm9kdWN0X2RldGFpbHMoKS0+c2V0X3ZlcnNpb24obUVtdWxhdG9yVmVyc2lvbik7CisgICAgfQorICAgIGlmICghbUVtdWxhdG9yRnVsbFZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBldmVudC0+bXV0YWJsZV9wcm9kdWN0X2RldGFpbHMoKS0+c2V0X2J1aWxkKG1FbXVsYXRvckZ1bGxWZXJzaW9uKTsKKyAgICB9CisgICAgaWYgKCFtUWVtdVZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9jb3JlX3ZlcnNpb24obVFlbXVWZXJzaW9uKTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHRpbWVzID0gU3lzdGVtOjpnZXQoKS0+Z2V0UHJvY2Vzc1RpbWVzKCk7CisgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpLT5zZXRfc3lzdGVtX3RpbWUodGltZXMuc3lzdGVtTXMpOworICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX2RldGFpbHMoKS0+c2V0X3VzZXJfdGltZSh0aW1lcy51c2VyTXMpOworICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX2RldGFpbHMoKS0+c2V0X3dhbGxfdGltZSh0aW1lcy53YWxsQ2xvY2tNcyk7CisKKyAgICAvLyBPbmx5IHNldCB0aGUgc2Vzc2lvbiBJRCBpZiBpdCBpc24ndCBzZXQ6IHNvbWUgbWVzc2FnZXMgbWlnaHQgYmUgcmVwb3J0ZWQKKyAgICAvLyBvbiBiZWhhbGYgb2YgYSBkaWZmZXJlbnQgKGUuZy4gY3Jhc2hlZCkgc2Vzc2lvbi4KKyAgICBpZiAoIWV2ZW50LT5oYXNfc3R1ZGlvX3Nlc3Npb25faWQoKSkgeworICAgICAgICBldmVudC0+c2V0X3N0dWRpb19zZXNzaW9uX2lkKHNlc3Npb25JZCgpKTsKKyAgICB9CisgICAgZXZlbnQtPlNlcmlhbGl6ZVRvU3RyaW5nKGxvZ0V2ZW50Lm11dGFibGVfc291cmNlX2V4dGVuc2lvbigpKTsKKyAgICBtV3JpdGVyLT53cml0ZShsb2dFdmVudCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRmZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1dyaXRlci5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZF9zdHVkaW8geyBjbGFzcyBBbmRyb2lkU3R1ZGlvRXZlbnQ7IH0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLworLy8gTWV0cmljc1JlcG9ydGVyIC0gdGhlIG1haW4gaW50ZXJmYWNlIGZvciBtZXRyaWNzIHJlcG9yaW5nIGluIHRoZSBlbXVsYXRvci4KKy8vCisvLyBUbyByZXBvcnQgYSBtZXRyaWMsIGNhbGwgdGhlIHJlcG9ydCgpIG1ldGhvZCB3aXRoIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpbGwKKy8vIHRoZSBwYXNzZWQgfGV2ZW50fCBvYmplY3Qgd2l0aCB0aGUgbWV0cmljIHZhbHVlcy4gRS5nLgorLy8KKy8vICBTY3JlZW4gc2NyZWVuID0gLi4uOworLy8gIHNjcmVlbi5EcmF3QUZyYW1lKCk7CisvLyAgaW50IGZyYW1lVGltZSA9IHNjcmVlbi5HZXRGcmFtZURyYXdpbmdUaW1lKCk7CisvLyAgTWV0cmljc1JlcG9ydGVyOjpnZXQoKS5yZXBvcnQoW2ZyYW1lVGltZV0oQW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworLy8gICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9mcmFtZV90aW1lKGZyYW1lVGltZSk7CisvLyAgfSk7CisvLworLy8gVGhpcyBjYWxsYmFjayBtaWdodCBiZSBpbnZva2VkIGVpdGhlciBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5IG9uIGEKKy8vIGRpZmZlcmVudCB0aHJlYWQsIHNvIGl0IHNob3VsZCBjYXB0dXJlIGFsbCBwaWVjZXMgb2YgZGF0YSBpdCBtaWdodCBuZWVkLgorLy8gSXQgbWlnaHQgZXZlbiBiZSBuZXZlciBjYWxsZWQgYXQgYWxsIC0gaWYgbWV0cmljcyByZXBvcnRpbmcgaXMgZGlzYWJsZWQgLQorLy8gc28gbWFrZSBzdXJlIHlvdXIgY29kZSBkb2Vzbid0IHJlbHkgb24gdGhhdCBpbiBhbnkgd2F5LgorLy8KKy8vIFRoZXJlIGlzIG9uZSBhZHZhbmNlZCBtZXRob2QsIHJlcG9ydENvbmRpdGlvbmFsKCk6IGl0IGV4cGVjdHMgYSBkaWZmZXJlbnQKKy8vIHR5cGUgb2YgY2FsbGJhY2ssIG9uZSB0aGF0IHJldHVybnMgfHRydWV8IGlmIGl0IGxvZ2dlZCBhbnl0aGluZyBvciB8ZmFsc2V8IGlmCisvLyBpdCBkaWRuJ3QgYW5kIHRoZSBtZXRyaWMgbWVzc2FnZSBzaG91bGQgYmUgZGlzY2FyZGVkLiBUaGlzIGlzIHVzZWZ1bCB3aGVuCisvLyBtZXRyaWMgcmVwb3J0aW5nIHJlcXVpcmVzIHNvbWUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYW5kIG9uZSBkb2Vzbid0IHdhbnQKKy8vIHRvIHJ1biBpdCBvbiB0aGUgc2FtZSB0aHJlYWQgb3IgdG8gcnVuIGl0IGF0IGFsbCBpZiBtZXRyaWNzIGFyZSBkaXNhYmxlZCwKKy8vIGJ1dCBiYXNlZCBvbiB0aGUgb3V0Y29tZSBvbmUgbWlnaHQgZGVjaWRlIG5vdCB0byByZXBvcnQgaXQgYXQgYWxsLgorLy8KKy8vIEFueXdheSwgaWYgZXZlbiByZXBvcnRDb25kaXRpb25hbCgpIGlzIG5vdCBmb3IgeW91LCB5b3UgY2FuIGNhbGwKKy8vIGlzUmVwb3J0aW5nRW5hYmxlZCgpIHRvIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSBhdCBhbGwgdG8gcmVwb3J0IHRoZSBtZXRyaWNzLgorLy8KKworY2xhc3MgTWV0cmljc1JlcG9ydGVyIHsKKyAgICBESVNBTExPV19DT1BZX0FTU0lHTl9BTkRfTU9WRShNZXRyaWNzUmVwb3J0ZXIpOworCitwdWJsaWM6CisgICAgdXNpbmcgUHRyID0gc3RkOjp1bmlxdWVfcHRyPE1ldHJpY3NSZXBvcnRlcj47CisgICAgdXNpbmcgQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQgKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKT47CisgICAgdXNpbmcgQ29uZGl0aW9uYWxDYWxsYmFjayA9CisgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbCAoYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCopPjsKKworICAgIHN0YXRpYyB2b2lkIHN0YXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvckZ1bGxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgcWVtdVZlcnNpb24pOworICAgIHN0YXRpYyB2b2lkIHN0b3AoKTsKKyAgICBzdGF0aWMgTWV0cmljc1JlcG9ydGVyJiBnZXQoKTsKKworICAgIHZpcnR1YWwgfk1ldHJpY3NSZXBvcnRlcigpOworICAgIHZpcnR1YWwgdm9pZCByZXBvcnRDb25kaXRpb25hbChDb25kaXRpb25hbENhbGxiYWNrIGNhbGxiYWNrKSA9IDA7CisKKyAgICB2b2lkIHJlcG9ydChDYWxsYmFjayBjYWxsYmFjayk7CisgICAgLy8gQ2hlY2tzIGlmIHRoZSBtZXRyaWNzIHJlcG9ydGluZyBpcyBlbmFibGVkIGZvciB0aGUgY3VycmVudCByZXBvcnRlcgorICAgIC8vIGluc3RhbmNlLgorICAgIGJvb2wgaXNSZXBvcnRpbmdFbmFibGVkKCkgY29uc3Q7CisgICAgLy8gUmV0dXJucyBhIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjdXJyZW50IGVtdWxhdG9yIHJ1biAob3Igc2Vzc2lvbiBpbgorICAgIC8vIEFuZHJvaWQgU3R1ZGlvIHRlcm1zKS4KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbklkKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBNZXRyaWNzUmVwb3J0ZXIoYm9vbCBlbmFibGVkLCBNZXRyaWNzV3JpdGVyOjpQdHIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IGVtdWxhdG9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvckZ1bGxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBiYXNlOjpTdHJpbmdWaWV3IHFlbXVWZXJzaW9uKTsKKyAgICB2b2lkIHNlbmRUb1dyaXRlcihhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgTWV0cmljc1dyaXRlcjo6UHRyIG1Xcml0ZXI7CisgICAgY29uc3QgYm9vbCBtRW5hYmxlZCA9IGZhbHNlOworICAgIGNvbnN0IGJhc2U6OlN5c3RlbTo6RHVyYXRpb24gbVN0YXJ0VGltZU1zOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1FbXVsYXRvclZlcnNpb247CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUVtdWxhdG9yRnVsbFZlcnNpb247CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVFlbXVWZXJzaW9uOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9NZXRyaWNzV3JpdGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjlhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9NZXRyaWNzV3JpdGVyLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzV3JpdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworTWV0cmljc1dyaXRlcjo6fk1ldHJpY3NXcml0ZXIoKSA9IGRlZmF1bHQ7CisKK01ldHJpY3NXcml0ZXI6Ok1ldHJpY3NXcml0ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25JZCkKKyAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NXcml0ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZhYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTWV0cmljc1dyaXRlci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKK25hbWVzcGFjZSB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZyB7CitjbGFzcyBMb2dFdmVudDsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLworLy8gTWV0cmljc1dyaXRlciAtIGFuIGludGVyZmFjZSBmb3Igd3JpdGluZyBtZXRyaWNzIF9zb21ld2hlcmVfLgorLy8KKy8vIFRoaXMgY2xhc3MgYWJzdHJhY3RzIG91dCB0aGUgbWV0cmljcyBzdG9yYWdlIGZyb20gdGhlIGdlbmVyaWMgY29kZSB0aGF0CisvLyBmaWxscyBpbiB0aGUgbWVzc2FnZSBhbmQgbWFuYWdlcyB0aGUgcmVwb3J0aW5nIGxvZ2ljLgorLy8KKy8vIFRvIHdyaXRlIGEgbWVzc2FnZSwgY2FsbCB3cml0ZSgpIHdpdGggYSBwcmUtZmlsbGVkIHByb3RvYnVmLiBUaGlzIGNsYXNzCisvLyBkb2Vzbid0IG1vZGlmeSB0aGUgcGFzc2VkIHxldmVudHwsIGJ1dCBqdXN0IHN0b3JlcyBpdCBpbiBhbiBpbXBsZW1lbnRhdGlvbi0KKy8vIGRlZmluZWQgZm9ybWF0LgorLy8KKworY2xhc3MgTWV0cmljc1dyaXRlciB7CisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoTWV0cmljc1dyaXRlcik7CisKK3B1YmxpYzoKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8TWV0cmljc1dyaXRlcj47CisgICAgdXNpbmcgQWJhbmRvbmVkU2Vzc2lvbnMgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+OworCisgICAgdmlydHVhbCB+TWV0cmljc1dyaXRlcigpOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZSgKKyAgICAgICAgICAgIGNvbnN0IHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCYgZXZlbnQpID0gMDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uSWQoKSBjb25zdCB7IHJldHVybiBtU2Vzc2lvbklkOyB9CisKK3Byb3RlY3RlZDoKKyAgICBNZXRyaWNzV3JpdGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uSWQpOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1TZXNzaW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzUmVwb3J0ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NSZXBvcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkNzI2OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzUmVwb3J0ZXIuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzTG9nZ2luZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9OdWxsTWV0cmljc1dyaXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKK051bGxNZXRyaWNzUmVwb3J0ZXI6Ok51bGxNZXRyaWNzUmVwb3J0ZXIoTWV0cmljc1dyaXRlcjo6UHRyIHdyaXRlcikKKyAgICA6IE1ldHJpY3NSZXBvcnRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIgPyBzdGQ6Om1vdmUod3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1ldHJpY3NXcml0ZXI6OlB0cihuZXcgTnVsbE1ldHJpY3NXcml0ZXIoKSksCisgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAge30pIHsKKyAgICBEKCJjcmVhdGVkIik7Cit9CisKK3ZvaWQgTnVsbE1ldHJpY3NSZXBvcnRlcjo6cmVwb3J0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDYWxsYmFjayBjYWxsYmFjaykgeworICAgIEQoImlnbm9yaW5nIik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZXRyaWNzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NSZXBvcnRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NSZXBvcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNWU1YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9OdWxsTWV0cmljc1JlcG9ydGVyLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL01ldHJpY3NSZXBvcnRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vCisvLyBOdWxsTWV0cmljc1JlcG9ydGVyIC0gYSBtZXRyaWNzIHJlcG9ydGVyIHRoYXQgaWdub3JlcyBhbGwgcmVxdWVzdHMgd2l0aG91dAorLy8gcmVwb3J0aW5nIHRoZW0gYW55d2hlcmUuCisvLworCitjbGFzcyBOdWxsTWV0cmljc1JlcG9ydGVyIGZpbmFsIDogcHVibGljIE1ldHJpY3NSZXBvcnRlciB7CitwdWJsaWM6CisgICAgTnVsbE1ldHJpY3NSZXBvcnRlcihNZXRyaWNzV3JpdGVyOjpQdHIgd3JpdGVyID0ge30pOworICAgIHZvaWQgcmVwb3J0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzV3JpdGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg5NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzV3JpdGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc0xvZ2dpbmcuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitOdWxsTWV0cmljc1dyaXRlcjo6TnVsbE1ldHJpY3NXcml0ZXIoKSA6IE1ldHJpY3NXcml0ZXIoe30pIHsKKyAgICBEKCJjcmVhdGVkIik7Cit9CisKK3ZvaWQgTnVsbE1ldHJpY3NXcml0ZXI6OndyaXRlKAorICAgICAgICBjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmIGV2ZW50KSB7CisgICAgRCgiaWdub3JpbmcgYW4gZXZlbnQgd3JpdGUiKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9OdWxsTWV0cmljc1dyaXRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM1YjJmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NXcml0ZXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1dyaXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vCisvLyBOdWxsTWV0cmljc1dyaXRlciAtIGEgbm9vcCBtZXRyaWNzIHdyaXRlciBpbXBsZW1lbnRhdGlvbi4gSXQgZG9lc24ndCBkbyBhbnkKKy8vIGFjdGlvbiBvbiB3cml0ZSgpIGNhbGxzLgorLy8KKworY2xhc3MgTnVsbE1ldHJpY3NXcml0ZXIgZmluYWwgOiBwdWJsaWMgTWV0cmljc1dyaXRlciB7CitwdWJsaWM6CisgICAgTnVsbE1ldHJpY3NXcml0ZXIoKTsKKyAgICB2b2lkIHdyaXRlKGNvbnN0IHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCYgZXZlbnQpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL1BlcmlvZGljUmVwb3J0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MWUyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvUGVyaW9kaWNSZXBvcnRlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKKy8vIEFuIGluc3RhbmNlIGhvbGRlciBvYmplY3Q6IGl0IG1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIHRoZSBkZWZhdWx0IHJlcG9ydGVyCisvLyBpbnN0YW5jZS4KK3N0cnVjdCBQZXJpb2RpY1JlcG9ydGVyOjpJbnN0YW5jZUhvbGRlciB7CisgICAgUGVyaW9kaWNSZXBvcnRlcjo6UHRyIHJlcG9ydGVyOworCisgICAgSW5zdGFuY2VIb2xkZXIoKSA6IHJlcG9ydGVyKG5ldyBQZXJpb2RpY1JlcG9ydGVyKCkpIHt9Cit9OworCitzdGF0aWMgTGF6eUluc3RhbmNlPFBlcmlvZGljUmVwb3J0ZXI6Okluc3RhbmNlSG9sZGVyPiBzUmVwb3J0ZXIgPSB7fTsKKwordm9pZCBQZXJpb2RpY1JlcG9ydGVyOjpzdGFydChNZXRyaWNzUmVwb3J0ZXIqIG1ldHJpY3NSZXBvcnRlciwgTG9vcGVyKiBsb29wZXIpIHsKKyAgICBzUmVwb3J0ZXItPnJlcG9ydGVyLT5zdGFydEltcGwobWV0cmljc1JlcG9ydGVyLCBsb29wZXIpOworfQorCit2b2lkIFBlcmlvZGljUmVwb3J0ZXI6OnN0b3AoKSB7CisgICAgLy8gTWFrZSBzdXJlIHdlIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBwZXJpb2RpYyByZXBvcnRlciBoZXJlOgorICAgIC8vIHRoaXMgd2F5IHdlIGV4cGlyZSBhbGwgd2VhayBwb2ludGVycyBpbiBUYXNrR3VhcmRzIGFuZCB0aGV5IHdvbid0CisgICAgLy8gdHJ5IGVyYXNpbmcgZnJvbSBhIGxpc3QgdXNpbmcgaW52YWxpZCBzdGFsZSBpdGVyYXRvcnMuCisgICAgc1JlcG9ydGVyLT5yZXBvcnRlci5yZXNldChuZXcgUGVyaW9kaWNSZXBvcnRlcigpKTsKK30KKworUGVyaW9kaWNSZXBvcnRlciYgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkgeworICAgIGFzc2VydChzUmVwb3J0ZXItPnJlcG9ydGVyLmdldCgpKTsKKyAgICByZXR1cm4gKnNSZXBvcnRlci0+cmVwb3J0ZXI7Cit9CisKK1BlcmlvZGljUmVwb3J0ZXI6OlBlcmlvZGljUmVwb3J0ZXIoKSA9IGRlZmF1bHQ7CisKK1BlcmlvZGljUmVwb3J0ZXI6On5QZXJpb2RpY1JlcG9ydGVyKCkgeworICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgIG1QZXJpb2REYXRhQnlQZXJpb2QuY2xlYXIoKTsKK30KKwordm9pZCBQZXJpb2RpY1JlcG9ydGVyOjphZGRUYXNrKFN5c3RlbTo6RHVyYXRpb24gcGVyaW9kTXMsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgYWRkVGFza0ludGVybmFsTm9Mb2NrKHBlcmlvZE1zLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKK30KKworUGVyaW9kaWNSZXBvcnRlcjo6VGFza1Rva2VuIFBlcmlvZGljUmVwb3J0ZXI6OmFkZENhbmNlbGFibGVUYXNrKAorICAgICAgICBTeXN0ZW06OkR1cmF0aW9uIHBlcmlvZE1zLAorICAgICAgICBQZXJpb2RpY1JlcG9ydGVyOjpDYWxsYmFjayBjYWxsYmFjaykgeworICAgIC8vIENhcHR1cmUgYSB3ZWFrIHBvaW50ZXIgdG8gfHRoaXN8IGludG8gdGhlIHRhc2sgZ3VhcmQgdG8gbWFrZSBzdXJlIGl0IGNhbgorICAgIC8vIG91dGxpdmUgfHRoaXN8IGFuZCB3b24ndCB0cnkgdG8gY2FsbCBpbnRvIGEgZGFuZ2xpbmcgcG9pbnRlci4KKyAgICBjb25zdCBhdXRvIHdlYWtUaGlzID0gV2Vha1B0cihzaGFyZWRfZnJvbV90aGlzKCkpOworCisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgY29uc3QgYXV0byBpdGVyID0gYWRkVGFza0ludGVybmFsTm9Mb2NrKHBlcmlvZE1zLCBzdGQ6Om1vdmUoY2FsbGJhY2spKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VGFza0d1YXJkPihbcGVyaW9kTXMsIGl0ZXIsIHdlYWtUaGlzXSgpIHsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gc2hhcmVkVGhpcyA9IHdlYWtUaGlzLmxvY2soKSkgeworICAgICAgICAgICAgc2hhcmVkVGhpcy0+cmVtb3ZlVGFzayhwZXJpb2RNcywgaXRlcik7CisgICAgICAgIH0KKyAgICB9KTsKK30KKwordm9pZCBQZXJpb2RpY1JlcG9ydGVyOjpzdGFydEltcGwoTWV0cmljc1JlcG9ydGVyKiBtZXRyaWNzUmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXIqIGxvb3BlcikgeworICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworCisgICAgYXNzZXJ0KCFtTWV0cmljc1JlcG9ydGVyKTsKKyAgICBhc3NlcnQoIW1Mb29wZXIpOworCisgICAgYXNzZXJ0KG1ldHJpY3NSZXBvcnRlcik7CisgICAgYXNzZXJ0KGxvb3Blcik7CisKKyAgICBtTWV0cmljc1JlcG9ydGVyID0gbWV0cmljc1JlcG9ydGVyOworICAgIG1Mb29wZXIgPSBsb29wZXI7CisKKyAgICBmb3IgKGF1dG8mIHBlcmlvZEFuZERhdGEgOiBtUGVyaW9kRGF0YUJ5UGVyaW9kKSB7CisgICAgICAgIGFzc2VydCghcGVyaW9kQW5kRGF0YS5zZWNvbmQudGFzayk7CisKKyAgICAgICAgY3JlYXRlUGVyUGVyaW9kVGltZXJOb0xvY2soJnBlcmlvZEFuZERhdGEuc2Vjb25kLCBwZXJpb2RBbmREYXRhLmZpcnN0KTsKKyAgICB9Cit9CisKK3ZvaWQgUGVyaW9kaWNSZXBvcnRlcjo6Y3JlYXRlUGVyUGVyaW9kVGltZXJOb0xvY2soUGVyUGVyaW9kRGF0YSogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpEdXJhdGlvbiBwZXJpb2RNcykgeworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcmVmZXJlbmNlPGRlY2x0eXBlKGRhdGEpPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAifGRhdGF8IG11c3Qgbm90IGJlIGEgcmVmZXJlbmNlOiBnY2MgNC42IHVzZWQgdG8gaGF2ZSBhIGJ1ZyAiCisgICAgICAgICAgICAgICAgICAid2hlcmUgY2FwdHVyaW5nIGEgcmVmZXJlbmNlIGJ5IHZhbHVlIHJlc3VsdGVkIGluIHNpbGVudCBiYWQgIgorICAgICAgICAgICAgICAgICAgImNvZGUgZ2VuZXJhdGlvbiIpOworCisgICAgYXNzZXJ0KG1Mb29wZXIpOworCisgICAgYXV0byB0aW1lckZ1bmMgPSBbdGhpcywgZGF0YV0oKSB7CisgICAgICAgIG1NZXRyaWNzUmVwb3J0ZXItPnJlcG9ydENvbmRpdGlvbmFsKAorICAgICAgICAgICAgICAgIFt0aGlzLCBkYXRhXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbGJhY2sgbWF5IGVyYXNlIGl0c2VsZiBmcm9tIHRoZSBsaXN0LCBkZWFsIHdpdGggdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyBieSB1c2luZyByYXcgaXRlcmF0b3JzIGluIHRoZSBsb29wLgorICAgICAgICAgICAgICAgICAgICBhdXRvIGl0Q2FsbGJhY2sgPSBkYXRhLT5jYWxsYmFja3MuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0Q2FsbGJhY2sgIT0gZGF0YS0+Y2FsbGJhY2tzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvIGl0Q3VycmVudENhbGxiYWNrID0gaXRDYWxsYmFjaysrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXMgdGFzayBtYXkgdHJ5IHJlbW92aW5nIGl0c2VsZiwgdW5sb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb2JqZWN0IHRlbXBvcmFyaWx5IGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICgqaXRDdXJyZW50Q2FsbGJhY2spKGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH07CisKKyAgICBkYXRhLT50YXNrLmVtcGxhY2UobUxvb3Blciwgc3RkOjptb3ZlKHRpbWVyRnVuYyksIHBlcmlvZE1zKTsKKyAgICBkYXRhLT50YXNrLT5zdGFydCgpOworfQorCitQZXJpb2RpY1JlcG9ydGVyOjpDYWxsYmFja0xpc3Q6Oml0ZXJhdG9yCitQZXJpb2RpY1JlcG9ydGVyOjphZGRUYXNrSW50ZXJuYWxOb0xvY2soU3lzdGVtOjpEdXJhdGlvbiBwZXJpb2RNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2RpY1JlcG9ydGVyOjpDYWxsYmFjayBjYWxsYmFjaykgeworICAgIFBlclBlcmlvZERhdGEmIGRhdGEgPSBtUGVyaW9kRGF0YUJ5UGVyaW9kW3BlcmlvZE1zXTsKKyAgICBkYXRhLmNhbGxiYWNrcy5wdXNoX2JhY2soc3RkOjptb3ZlKGNhbGxiYWNrKSk7CisgICAgaWYgKG1Mb29wZXIgJiYgIWRhdGEudGFzaykgeworICAgICAgICBjcmVhdGVQZXJQZXJpb2RUaW1lck5vTG9jaygmZGF0YSwgcGVyaW9kTXMpOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gbXlJdCA9IHN0ZDo6cHJldihkYXRhLmNhbGxiYWNrcy5lbmQoKSk7CisgICAgcmV0dXJuIG15SXQ7Cit9CisKK3ZvaWQgUGVyaW9kaWNSZXBvcnRlcjo6cmVtb3ZlVGFzayhTeXN0ZW06OkR1cmF0aW9uIHBlcmlvZE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrTGlzdDo6aXRlcmF0b3IgaXRlcikgeworICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworCisgICAgUGVyUGVyaW9kRGF0YSYgZGF0YSA9IG1QZXJpb2REYXRhQnlQZXJpb2RbcGVyaW9kTXNdOworICAgIGRhdGEuY2FsbGJhY2tzLmVyYXNlKGl0ZXIpOworICAgIGlmIChkYXRhLmNhbGxiYWNrcy5lbXB0eSgpKSB7CisgICAgICAgIGRhdGEudGFzay5jbGVhcigpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNzI4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL1BlcmlvZGljUmVwb3J0ZXIuaApAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9SZWN1cnJlbnRUYXNrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCisvLyBQZXJpb2RpY1JlcG9ydGVyIC0gYSBjbGFzcyB0aGF0IGhlbHBzIG9uZSB0byBpbXBsZW1lbnQgbWV0cmljcyByZXBvcnRpbmcKKy8vIHRhc2sgdGhhdCBuZWVkcyB0byBydW4gcmVjdXJyZW50bHksIHdpdGggYSBzcGVjaWZpYyB0aW1lb3V0IGJldHdlZW4gdGhlIHJ1bnMuCisvLworLy8gVGhpcyBjbGFzcyBvcHRpbWl6ZXMgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBzZW50IGJ5IGNvbWJpbmluZyBhbGwgdGFza3MgYWRkZWQKKy8vIHdpdGggdGhlIHNhbWUgcmVwb3J0aW5nIHBlcm9pZCBpbnRvIGEgc2luZ2xlIG1ldHJpY3MgbWVzc2FnZS4KKy8vCisvLyBUbyBjcmVhdGUgc3VjaCB0YXNrLCBjYWxsIHRoZSBhZGRUYXNrKCkgbWV0aG9kLCBzdXBwbHlpbmcgdGhlIHJ1biBwZXJpb2QgYW5kCisvLyB0aGUgdGFzayBjYWxsYmFjay4KKy8vIFRhc2sgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBhIHJlZ3VsYXIgTWV0cmljc1JlcG9ydGVyIGNhbGxiYWNrOyBpdCBtYXkgcmV0dXJuCisvLyB8ZmFsc2V8IGlmIHRoZXJlJ3Mgbm8gbmVlZCB0byBsb2cgYW55dGhpbmcgYXQgdGhlIGN1cnJlbnQgaW52b2NhdGlvbi4KKy8vCisvLyBJZiB5b3VyIHRhc2sgbmVlZHMgdG8gYmUgYWJsZSB0byBzdG9wIHJlcG9ydGluZyBtZXRyaWNzIGF0IHNvbWUgcG9pbnQsIHVzZQorLy8gYWRkQ2FuY2VsYWJsZVRhc2soKSBhbmQgZGVzdHJveSB0aGUgcmV0dXJuZWQgdG9rZW4gd2hlbiB0aGUgdGFzayBpc24ndCBuZWVkZWQKKy8vIGFueW1vcmUuCisvLworLy8gVG8gYWN0dWFsbHkgc3RhcnQgcnVubmluZyB0aGUgdGFza3MsIGNhbGwgc3RhcnQoKSBtZXRob2QgcGFzc2luZyB0aGUgbWV0cmljcworLy8gcmVwb3J0ZXIgaW5zdGFuY2UgYW5kIGEgbG9vcGVyIHRvIHVzZSBmb3IgdGhlIHJlY3VycmluZyB0YXNrcy4gQmVmb3JlIHRoYXQsCisvLyBQZXJpb2RpY1JlcG9ydGVyIHdvdWxkIGJlIGluIGEgJ2NvbGxlY3Qtb25seScgbW9kZSB3aGVyZSBpdCBjb2xsZWN0cyBhbGwKKy8vIHRhc2tzIGFkZGVkIGluIGFkZFRhc2soKS9hZGRDYW5jZWxhYmxlVGFzaygpLCBidXQgbmV2ZXIgcnVucyB0aG9zZS4KKy8vIHN0b3AoKSBjYWxsIHN0b3BzIGFuZCBkZWxldGVzIGFsbCByZWNydXJyaW5nIHRhc2tzIGFuZCBzd2l0Y2hlcyB0aGUKKy8vIFBlcmlvZGljUmVwb3J0ZXIgYmFjayB0byAnY29sbGVjdC1vbmx5JyBtb2RlLgorLy8KKworY2xhc3MgUGVyaW9kaWNSZXBvcnRlciBmaW5hbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFBlcmlvZGljUmVwb3J0ZXI+IHsKKyAgICBESVNBTExPV19DT1BZX0FTU0lHTl9BTkRfTU9WRShQZXJpb2RpY1JlcG9ydGVyKTsKKworICAgIHVzaW5nIFdlYWtQdHIgPSBzdGQ6OndlYWtfcHRyPFBlcmlvZGljUmVwb3J0ZXI+OworICAgIHVzaW5nIEludGVybmFsQ2FsbGJhY2sgPSBNZXRyaWNzUmVwb3J0ZXI6OkNvbmRpdGlvbmFsQ2FsbGJhY2s7CisgICAgLy8gVGhlIGNvbnRhaW5lciBjaG9pY2UgLSBsaXN0PD4gLSBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGUgaXRlcmF0b3JzIGFyZQorICAgIC8vIHByZXNlcnZlZCBvbiBhbGwgaW5zZXJ0cyBvciBlcmFzZXMgb2Ygb3RoZXIgZWxlbWVudHMuIFdlIHN0b3JlIHRoZQorICAgIC8vIGl0ZXJhdG9yIHRvIHRoZSBpbnNlcnRlZCBlbGVtZW50IHRvIGJlIGFibGUgdG8gcmVtb3ZlIGl0IGxhdGVyLgorICAgIHVzaW5nIENhbGxiYWNrTGlzdCA9IHN0ZDo6bGlzdDxJbnRlcm5hbENhbGxiYWNrPjsKKworICAgIC8vIEEgcHJpdmF0ZSBndWFyZCBjbGFzcyB0aGF0IHJlbW92ZXMgdGhlIHRhc2sgd2hlbiBkZXN0cm95ZWQuCisgICAgY2xhc3MgVGFza0d1YXJkIGZpbmFsIHsKKyAgICAgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoVGFza0d1YXJkKTsKKyAgICBwdWJsaWM6CisgICAgICAgIHVzaW5nIFJlbW92ZXJGdW5jID0gc3RkOjpmdW5jdGlvbjx2b2lkKCk+OworCisgICAgICAgIFRhc2tHdWFyZChSZW1vdmVyRnVuYyBmdW5jKSA6IHRhc2tSZW1vdmVyKHN0ZDo6bW92ZShmdW5jKSkge30KKyAgICAgICAgflRhc2tHdWFyZCgpIHsgdGFza1JlbW92ZXIoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUmVtb3ZlckZ1bmMgdGFza1JlbW92ZXI7CisgICAgfTsKKworcHVibGljOgorICAgIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIGhvbGRlcjogdGhpcyBhbGxvd3MgaXQgdG8gY2FsbAorICAgIC8vIHRoZSBwcml2YXRlIGNvbnN0cnVjdG9yLgorICAgIHN0cnVjdCBJbnN0YW5jZUhvbGRlcjsKKworICAgIHVzaW5nIFRhc2tUb2tlbiA9IHN0ZDo6c2hhcmVkX3B0cjxUYXNrR3VhcmQ+OworICAgIHVzaW5nIENhbGxiYWNrID0gSW50ZXJuYWxDYWxsYmFjazsKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8UGVyaW9kaWNSZXBvcnRlcj47CisKKyAgICAvLyBTdGFydCBQZXJpb2RpY1JlcG9ydGVyIHVzaW5nIHRoZSBzdXBwbGllZCB8bWV0cmljc1JlcG9ydGVyfCBmb3IgcmVwb3J0aW5nCisgICAgLy8gYW5kIHxsb29wZXJ8IHRvIHJ1biBwZXJpb2RpYyB0YXNrcy4KKyAgICAvLyBZb3UgY2FuIGFkZCB0YXNrcyBldmVuIGJlZm9yZSB0aGlzIGNhbGw7IHRoZXkganVzdCB3b24ndCBydW4gdW50aWwgdGhlCisgICAgLy8gcmVwb3J0ZXIgaXMgc3RhcnRlZC4KKyAgICBzdGF0aWMgdm9pZCBzdGFydChNZXRyaWNzUmVwb3J0ZXIqIG1ldHJpY3NSZXBvcnRlciwgYmFzZTo6TG9vcGVyKiBsb29wZXIpOworICAgIC8vIFN0b3AgdGhlIGN1cnJlbnRseSBydW5uaW5nIFBlcmlvZGljUmVwb3J0ZXIgaW5zdGFuY2UuIFRoaXMgZmluYWxpemVzIGFuZAorICAgIC8vIGRlbGV0ZXMgYWxsIGN1cnJlbnRseSBydW5uaW5nIHRhc2tzIGFuZCByZXZlcnRzIGJhY2sgdG8gYSBtb2RlIHdoZXJlIHRoZQorICAgIC8vIHJlcG9ydGVyIGNvbGxlY3RzIGFsbCB0YXNrcyBidXQgbmV2ZXIgcnVucyB0aGVtLgorICAgIHN0YXRpYyB2b2lkIHN0b3AoKTsKKyAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgaW5zdGFuY2UuCisgICAgc3RhdGljIFBlcmlvZGljUmVwb3J0ZXImIGdldCgpOworCisgICAgflBlcmlvZGljUmVwb3J0ZXIoKTsKKworICAgIC8vIEFkZCBhIG5ldyBwZXJpb2RpYyByZXBvcnRpbmcgdGFzayB0aGF0IHJ1bnMgZXZlcnkgfHBlcmlvZE1zfCBtaWxsaXNlY29uZHMKKyAgICB2b2lkIGFkZFRhc2soYmFzZTo6U3lzdGVtOjpEdXJhdGlvbiBwZXJpb2RNcywgQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIC8vIFNhbWUgYXMgYWRkVGFzaygpLCBidXQgdGhlIHRhc2sgY2FuIGJlIGNhbmNlbGVkIGJ5IGRlc3Ryb3lpbmcgdGhlCisgICAgLy8gcmV0dXJuZWQgVGFza1Rva2VuLgorICAgIFRhc2tUb2tlbiBhZGRDYW5jZWxhYmxlVGFzayhiYXNlOjpTeXN0ZW06OkR1cmF0aW9uIHBlcmlvZE1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBjYWxsYmFjayk7CisKK3ByaXZhdGU6CisgICAgLy8gQSBzZXQgb2YgY2FsbGJhY2tzIGFkZGVkIHdpdGggdGhlIHNhbWUgcGVyaW9kLCBhbmQgYSByZWN1cnJlbnQgdGFzayB0aGF0CisgICAgLy8gaW52b2tlcyB0aGVtLgorICAgIHN0cnVjdCBQZXJQZXJpb2REYXRhIHsKKyAgICAgICAgYmFzZTo6T3B0aW9uYWw8YmFzZTo6UmVjdXJyZW50VGFzaz4gdGFzazsKKyAgICAgICAgQ2FsbGJhY2tMaXN0IGNhbGxiYWNrczsKKyAgICB9OworCisgICAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBtYWtlIHN1cmUgd2Ugb25seSBjcmVhdGUgYSBzaGFyZWRfcHRyPD4tb3duZWVkCisgICAgLy8gaW5zdGFuY2VzIChuZWVkZWQgZm9yIHRoZSBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczw+IGJhc2UgY2xhc3MpLgorICAgIFBlcmlvZGljUmVwb3J0ZXIoKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgaW50ZXJuYWwgTWV0cmljc1JlcG9ydGVyIGFuZCBMb29wZXIgYW5kIHN0YXJ0IHByb2Nlc3NpbmcuCisgICAgdm9pZCBzdGFydEltcGwoTWV0cmljc1JlcG9ydGVyKiBtZXRyaWNzUmVwb3J0ZXIsIGJhc2U6Okxvb3BlciogbG9vcGVyKTsKKworICAgIHZvaWQgY3JlYXRlUGVyUGVyaW9kVGltZXJOb0xvY2soUGVyUGVyaW9kRGF0YSogZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN5c3RlbTo6RHVyYXRpb24gcGVyaW9kTXMpOworCisgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRhc2sgYWRkaW5nLgorICAgIC8vIHxtTG9ja3wgaGFzIHRvIGJlIGhlbHAgZHVyaW5nIHRoZSBjYWxsLgorICAgIENhbGxiYWNrTGlzdDo6aXRlcmF0b3IgYWRkVGFza0ludGVybmFsTm9Mb2NrKAorICAgICAgICAgICAgYmFzZTo6U3lzdGVtOjpEdXJhdGlvbiBwZXJpb2RNcywKKyAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICB2b2lkIHJlbW92ZVRhc2soYmFzZTo6U3lzdGVtOjpEdXJhdGlvbiBwZXJpb2RNcywKKyAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tMaXN0OjppdGVyYXRvciBpdGVyKTsKKworICAgIE1ldHJpY3NSZXBvcnRlciogbU1ldHJpY3NSZXBvcnRlciA9IG51bGxwdHI7CisgICAgYmFzZTo6TG9vcGVyKiBtTG9vcGVyID0gbnVsbHB0cjsKKworICAgIGJhc2U6OkxvY2sgbUxvY2s7CisKKyAgICAvLyBBIGNvbGxlY3Rpb24gb2YgdGFza3MgZ3JvdXBlZCBieSB0aGVpciBydW4gcGVyaW9kLgorICAgIC8vIE5vdGU6IHN0ZDo6bWFwPD4gaXMgcmVxdWlyZWQgaGVyZSBhcyBpdCBkb2Vzbid0IGludmFsaWRhdGUgaXRzIGl0ZXJhdG9ycworICAgIC8vICBvbiBhbGwgb3BlcmF0aW9ucyBvdGhlciB0aGFuIGVyYXNpbmcgdGhlIHNwZWNpZmljIGVsZW1lbnQgZm9yIHRoYXQKKyAgICAvLyAgaXRlcmF0b3IuIFdlIHN0b3JlIHRoZSBpdGVyYXRvcnMgKGFuZCwgYWN0dWFsbHksIGFkZHJlc3NlcyBvZiBzdG9yZWQKKyAgICAvLyAgUGVyUGVyaW9kRGF0YSBvYmplY3RzKSBhbmQgbGF0ZXIgdXNlIHRoZW0sIHNvIHRoZXkgKm11c3QqIGJlIHN0YWJsZS4KKyAgICBzdGQ6Om1hcDxiYXNlOjpTeXN0ZW06OkR1cmF0aW9uLCBQZXJQZXJpb2REYXRhPiBtUGVyaW9kRGF0YUJ5UGVyaW9kOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWcuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRhODBhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmNwcApAQCAtMCwwICsxLDQ3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQXJyYXlTaXplLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWlzYy9TdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVmVyc2lvbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1BhdGhzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorCisjaW5jbHVkZSA8bGlieG1sL3RyZWUuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxhenlJbnN0YW5jZTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsOwordXNpbmcgc3RkOjpzdHJpbmc7CisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVyguLi4pIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LCBfX1ZBX0FSR1NfXykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRoZXNlIGNvbnN0cyBhcmUgcmVwbGljYXRlZCBhcyBtYWNyb3MgaW4gU3R1ZGlvSGVscGVyX3VuaXR0ZXN0LmNwcAorLy8gY2hhbmdlcyB0byB0aGVzZSB3aWxsIHJlcXVpcmUgZXF1aXZhbGVudCBjaGFuZ2VzIHRvIHRoZSB1bml0dGVzdHMKKy8vCisjaWZkZWYgX19BUFBMRV9fCitzdGF0aWMgY29uc3QgY2hhciBrQW5kcm9pZFN0dWRpb0RpcltdID0gIkFuZHJvaWRTdHVkaW8iOworI2Vsc2UgICAvLyAhIF9fX0FQUExFX18KK3N0YXRpYyBjb25zdCBjaGFyIGtBbmRyb2lkU3R1ZGlvRGlyW10gPSAiLkFuZHJvaWRTdHVkaW8iOworc3RhdGljIGNvbnN0IGNoYXIga0FuZHJvaWRTdHVkaW9EaXJJbmZpeFtdID0gImNvbmZpZyI7CisjZW5kaWYgIC8vIF9fQVBQTEVfXworCitzdGF0aWMgY29uc3QgY2hhciBrQW5kcm9pZFN0dWRpb0RpclN1ZmZpeFtdID0gIm9wdGlvbnMiOworc3RhdGljIGNvbnN0IGNoYXIga0FuZHJvaWRTdHVkaW9EaXJQcmV2aWV3W10gPSAiUHJldmlldyI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK25hbWVzcGFjZSB7CisvLyBTdHVkaW9YTUwgZGVzY3JpYmVzIHRoZSBYTUwgcGFyYW1ldGVycyB3ZSBhcmUgc2Vla2luZyBmb3IgaW4gYQorLy8gU3R1ZGlvIHByZWZlcmVuY2VzIGZpbGUuIFN0dWRpb1htbCBzdHJ1Y3RzIGFyZSBkZWZpbmVkIHN0YXRpY2FsbHkKKy8vIGluIGZ1bmN0aW9ucyB0aGF0IGNhbGwgcGFyc2VTdHVkaW9YTUwoKS4KK3N0cnVjdCBTdHVkaW9YbWwgeworICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lOworICAgIGNvbnN0IGNoYXIqIG5vZGVuYW1lOworICAgIGNvbnN0IGNoYXIqIHByb3BuYW1lOworICAgIGNvbnN0IGNoYXIqIHByb3B2YWx1ZTsKKyAgICBjb25zdCBjaGFyKiBrZXluYW1lOworfTsKK30gIC8vIG5hbWVzcGFjZQorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpzdHJEdXA7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VmVyc2lvbjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnN0cmluZ0xpdGVyYWxMZW5ndGg7Cit1c2luZyBhbmRyb2lkOjpDb25maWdEaXJzOwordXNpbmcgYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugc3R1ZGlvIHsKKworLy8gRmluZCBsYXRlc3Qgc3R1ZGlvIHByZWZlcmVuY2VzIGRpcmVjdG9yeSBhbmQgcmV0dXJuIHRoZQorLy8gdmFsdWUgb2YgdGhlIHhtbCBlbnRyeSBkZXNjcmliZWQgaW4gfG1hdGNofC4KK3N0YXRpYyBPcHRpb25hbDxzdHJpbmc+IHBhcnNlU3R1ZGlvWE1MKGNvbnN0IFN0dWRpb1htbCogY29uc3QgbWF0Y2gpOworCitWZXJzaW9uIGV4dHJhY3RBbmRyb2lkU3R1ZGlvVmVyc2lvbihjb25zdCBjaGFyKiBjb25zdCBkaXJOYW1lKSB7CisgICAgaWYgKGRpck5hbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVmVyc2lvbjo6aW52YWxpZCgpOworICAgIH0KKworICAgIC8vIGdldCByaWQgb2Yga0FuZHJvaWRTdHVkaW9EaXIgcHJlZml4IHRvIGdldCB0byB2ZXJzaW9uCisgICAgaWYgKHN0cm5jbXAoZGlyTmFtZSwga0FuZHJvaWRTdHVkaW9EaXIsCisgICAgICAgICAgICAgICAgc3RyaW5nTGl0ZXJhbExlbmd0aChrQW5kcm9pZFN0dWRpb0RpcikpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIFZlcnNpb246OmludmFsaWQoKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBjVmVyc2lvbiA9IGRpck5hbWUgKyBzdHJpbmdMaXRlcmFsTGVuZ3RoKGtBbmRyb2lkU3R1ZGlvRGlyKTsKKworICAgIC8vIGlmIHRoaXMgaXMgYSBwcmV2aWV3LCBnZXQgcmlkIG9mIGtBbmRyb2lkU3R1ZGlvRGlyUHJldmlldworICAgIC8vIHByZWZpeCB0b28gYW5kIG1hcmsgcHJldmlldyBhcyBidWlsZCAjMQorICAgIC8vIChhc3N1bWUgYnVpbGQgIzIgZm9yIHJlbGVhc2VzKQorICAgIGF1dG8gYnVpbGQgPSAyOworICAgIGlmIChzdHJuY21wKGNWZXJzaW9uLCBrQW5kcm9pZFN0dWRpb0RpclByZXZpZXcsCisgICAgICAgICAgICAgICAgc3RyaW5nTGl0ZXJhbExlbmd0aChrQW5kcm9pZFN0dWRpb0RpclByZXZpZXcpKSA9PSAwKSB7CisgICAgICAgIGNWZXJzaW9uICs9IHN0cmluZ0xpdGVyYWxMZW5ndGgoa0FuZHJvaWRTdHVkaW9EaXJQcmV2aWV3KTsKKyAgICAgICAgYnVpbGQgPSAxOworICAgIH0KKworICAgIC8vIGNWZXJzaW9uIHNob3VsZCBub3cgY29udGFpbiBhdCBsZWFzdCBhIG51bWJlcjsgaWYgbm90LAorICAgIC8vIHRoaXMgaXMgYSB2ZXJ5IGVhcmx5IEFuZHJvaWRTdHVkaW8gaW5zdGFsbGF0aW9uLCBsZXQncworICAgIC8vIGNhbGwgaXQgdmVyc2lvbiAwCisgICAgaWYgKGNWZXJzaW9uWzBdID09ICdcMCcpIHsKKyAgICAgICAgY1ZlcnNpb24gPSAiMCI7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbWFqb3IubWljcm8ubWlub3IgdmVyc2lvbiBzdHJpbmcgYW5kIGFwcGVuZAorICAgIC8vIGEgIjIiIGZvciByZWxlYXNlIGFuZCBhICIxIiBmb3IgcHJldmlld3M7IHRoaXMgd2lsbAorICAgIC8vIGFsbG93IHByb3BlciBzb3J0aW5nCisgICAgVmVyc2lvbiByYXdWZXJzaW9uKGNWZXJzaW9uKTsKKyAgICBpZiAocmF3VmVyc2lvbiA9PSBWZXJzaW9uOjppbnZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFZlcnNpb246OmludmFsaWQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gVmVyc2lvbihyYXdWZXJzaW9uLmNvbXBvbmVudDxWZXJzaW9uOjprTWFqb3I+KCksCisgICAgICAgICAgICAgICAgICAgcmF3VmVyc2lvbi5jb21wb25lbnQ8VmVyc2lvbjo6a01pbm9yPigpLAorICAgICAgICAgICAgICAgICAgIHJhd1ZlcnNpb24uY29tcG9uZW50PFZlcnNpb246OmtNaWNybz4oKSwgYnVpbGQpOworfQorCitzdGQ6OnN0cmluZyBsYXRlc3RBbmRyb2lkU3R1ZGlvRGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzY2FuUGF0aCkgeworICAgIGlmIChzY2FuUGF0aC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHNjYW5uZXIgPSBhbmRyb2lkOjpiYXNlOjptYWtlQ3VzdG9tU2NvcGVkUHRyKAorICAgICAgICAgICAgZGlyU2Nhbm5lcl9uZXcoc2NhblBhdGguY19zdHIoKSksIGRpclNjYW5uZXJfZnJlZSk7CisgICAgaWYgKCFzY2FubmVyKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBsYXRlc3RfcGF0aDsKKyAgICBTeXN0ZW0qIHN5c3RlbSA9IFN5c3RlbTo6Z2V0KCk7CisgICAgVmVyc2lvbiBsYXRlc3RfdmVyc2lvbigwLCAwLCAwKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3QgY2hhciogZnVsbF9wYXRoID0gZGlyU2Nhbm5lcl9uZXh0RnVsbChzY2FubmVyLmdldCgpKTsKKyAgICAgICAgaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBFbmQgb2YgZW51bWVyYXRpb24uCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBpZ25vcmUgZmlsZXMsIG9ubHkgaW50ZXJlc3RlZCBpbiBzdWJEaXJzCisgICAgICAgIGlmICghc3lzdGVtLT5wYXRoSXNEaXIoZnVsbF9wYXRoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjaGFyKiBuYW1lID0gcGF0aF9iYXNlbmFtZShmdWxsX3BhdGgpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBWZXJzaW9uIHYgPSBleHRyYWN0QW5kcm9pZFN0dWRpb1ZlcnNpb24obmFtZSk7CisgICAgICAgIGZyZWUobmFtZSk7CisgICAgICAgIGlmICh2LmlzVmFsaWQoKSAmJiBsYXRlc3RfdmVyc2lvbiA8IHYpIHsKKyAgICAgICAgICAgIGxhdGVzdF92ZXJzaW9uID0gdjsKKyAgICAgICAgICAgIGxhdGVzdF9wYXRoID0gZnVsbF9wYXRoOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGxhdGVzdF9wYXRoOworfQorCitzdGQ6OnN0cmluZyBwYXRoVG9TdHVkaW9YTUwoY29uc3Qgc3RkOjpzdHJpbmcmIHN0dWRpb1BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgaWYgKHN0dWRpb1BhdGguZW1wdHkoKSB8fCBmaWxlbmFtZS5lbXB0eSgpKQorICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICAgIC8vIGJ1aWxkIC9wYXRoL3RvLy5BbmRyb2lkU3R1ZGlvL3N1YnBhdGgvdG8vZmlsZS54bWwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdnBhdGg7CisgICAgdnBhdGgucHVzaF9iYWNrKHN0dWRpb1BhdGgpOworI2lmbmRlZiBfX0FQUExFX18KKyAgICB2cGF0aC5wdXNoX2JhY2soc3RkOjpzdHJpbmcoa0FuZHJvaWRTdHVkaW9EaXJJbmZpeCkpOworI2VuZGlmICAvLyAhX19BUFBMRV9fCisgICAgdnBhdGgucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGtBbmRyb2lkU3R1ZGlvRGlyU3VmZml4KSk7CisgICAgdnBhdGgucHVzaF9iYWNrKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gUGF0aFV0aWxzOjpyZWNvbXBvc2UodnBhdGgpOworfQorCitVcGRhdGVDaGFubmVsIHVwZGF0ZUNoYW5uZWwoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0dWRpb1htbCBjaGFubmVsSW5mbyA9IHsKKyAgICAgICAgICAgIC5maWxlbmFtZSA9ICJ1cGRhdGVzLnhtbCIsCisgICAgICAgICAgICAubm9kZW5hbWUgPSAib3B0aW9uIiwKKyAgICAgICAgICAgIC5wcm9wbmFtZSA9ICJuYW1lIiwKKyAgICAgICAgICAgIC5wcm9wdmFsdWUgPSAiVVBEQVRFX0NIQU5ORUxfVFlQRSIsCisgICAgICAgICAgICAua2V5bmFtZSA9ICJ2YWx1ZSIsCisgICAgfTsKKyAgICBjb25zdCBhdXRvIGNoYW5uZWxTdHIgPSBwYXJzZVN0dWRpb1hNTCgmY2hhbm5lbEluZm8pOworICAgIGlmICghY2hhbm5lbFN0cikgeworICAgICAgICByZXR1cm4gVXBkYXRlQ2hhbm5lbDo6VW5rbm93bjsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IE5hbWVkQ2hhbm5lbCB7CisgICAgICAgIFN0cmluZ1ZpZXcgbmFtZTsKKyAgICAgICAgVXBkYXRlQ2hhbm5lbCBjaGFubmVsOworICAgIH0gY2hhbm5lbE5hbWVzW10gPSB7CisgICAgICAgICAgICB7IiIsIFVwZGF0ZUNoYW5uZWw6OkNhbmFyeX0sICAvLyB0aGlzIGlzIHRoZSBjdXJyZW50IGRlZmF1bHQKKyAgICAgICAgICAgIHsiZWFwIiwgVXBkYXRlQ2hhbm5lbDo6Q2FuYXJ5fSwKKyAgICAgICAgICAgIHsicmVsZWFzZSIsIFVwZGF0ZUNoYW5uZWw6OlN0YWJsZX0sCisgICAgICAgICAgICB7ImJldGEiLCBVcGRhdGVDaGFubmVsOjpCZXRhfSwKKyAgICAgICAgICAgIHsibWlsZXN0b25lIiwgVXBkYXRlQ2hhbm5lbDo6RGV2fX07CisKKyAgICBjb25zdCBhdXRvIGNoYW5uZWxJdCA9CisgICAgICAgICAgICBzdGQ6OmZpbmRfaWYoc3RkOjpiZWdpbihjaGFubmVsTmFtZXMpLCBzdGQ6OmVuZChjaGFubmVsTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsmY2hhbm5lbFN0cl0oY29uc3QgTmFtZWRDaGFubmVsJiBjaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFubmVsLm5hbWUgPT0gKmNoYW5uZWxTdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKGNoYW5uZWxJdCAhPSBzdGQ6OmVuZChjaGFubmVsTmFtZXMpKSB7CisgICAgICAgIHJldHVybiBjaGFubmVsSXQtPmNoYW5uZWw7CisgICAgfQorICAgIHJldHVybiBVcGRhdGVDaGFubmVsOjpVbmtub3duOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFJlY3Vyc2UgdGhyb3VnaCBzdHVkaW8geG1sIGRvYyBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBkZXNjcmliZWQgaW4gbWF0Y2gKKy8vIGFzIGEgc3RyaW5nLCBpZiBvbmUgaXMgc2V0LiBPdGhlcndpc2UsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKy8vCitzdGF0aWMgc3RkOjpzdHJpbmcgZXZhbF9zdHVkaW9fY29uZmlnX3htbCh4bWxEb2NQdHIgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3R1ZGlvWG1sKiBjb25zdCBtYXRjaCkgeworICAgIHhtbE5vZGVQdHIgY3VycmVudCA9IE5VTEw7CisgICAgeG1sQ2hhciogeG1sdmFsID0gTlVMTDsKKyAgICBzdGQ6OnN0cmluZyByZXRWYWw7CisKKyAgICBmb3IgKGN1cnJlbnQgPSByb290OyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkgeworICAgICAgICBpZiAoY3VycmVudC0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFKSB7CisgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VycmVudC0+bmFtZSwgQkFEX0NBU1QgbWF0Y2gtPm5vZGVuYW1lKSkpIHsKKyAgICAgICAgICAgICAgICB4bWxDaGFyKiBwcm9wdmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgeG1sR2V0UHJvcChjdXJyZW50LCBCQURfQ0FTVCBtYXRjaC0+cHJvcG5hbWUpOworICAgICAgICAgICAgICAgIGludCBub21hdGNoID0geG1sU3RyY21wKHByb3B2YWx1ZSwgQkFEX0NBU1QgbWF0Y2gtPnByb3B2YWx1ZSk7CisgICAgICAgICAgICAgICAgeG1sRnJlZShwcm9wdmFsdWUpOworICAgICAgICAgICAgICAgIGlmICghbm9tYXRjaCkgeworICAgICAgICAgICAgICAgICAgICB4bWx2YWwgPSB4bWxHZXRQcm9wKGN1cnJlbnQsIEJBRF9DQVNUIG1hdGNoLT5rZXluYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhtbHZhbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB4bWxDaGFyKiBpcyBkZWZpbmVkIGFzIHVuc2lnbmVkIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBzaW1wbHkgcmVhZGluZyB0aGUgcmVzdWx0IGFuZCBkb24ndAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0ZSBvbiBpdCwgc29lIHNpbXBseSByZWludGVycHJldCBhcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgY2hhciAqIGFycmF5CisgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNoYXIqPih4bWx2YWwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoeG1sdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldFZhbCA9IGV2YWxfc3R1ZGlvX2NvbmZpZ194bWwoZG9jLCBjdXJyZW50LT5jaGlsZHJlbiwgbWF0Y2gpOworICAgICAgICBpZiAoIXJldFZhbC5lbXB0eSgpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8vIFJldHVybnM6CisvLyAgIC0gQW4gZW1wdHkgT3B0aW9uYWwgdG8gaW5kaWNhdGUgdGhhdCBwYXJzaW5nIGZhaWxlZC4KKy8vICAgLSBPcHRpb25hbCgiIikgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgYnV0IHxtYXRjaHwgZmFpbGVkLgorLy8gICAtIE9wdGlvbmFsKG1hdGNoZWRfdmF1bGUpIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KK3N0YXRpYyBPcHRpb25hbDxzdHJpbmc+IHBhcnNlU3R1ZGlvWE1MKGNvbnN0IFN0dWRpb1htbCogY29uc3QgbWF0Y2gpIHsKKyAgICBPcHRpb25hbDxzdHJpbmc+IHJldHZhbDsKKworICAgIFN5c3RlbSogc3lzID0gU3lzdGVtOjpnZXQoKTsKKyAgICAvLyBHZXQgcGF0aCB0byAuQW5kcm9pZFN0dWRpbworICAgIHN0ZDo6c3RyaW5nIGFwcERhdGFQYXRoOworICAgIHN0ZDo6c3RyaW5nIHN0dWRpbyA9IHN5cy0+ZW52R2V0KCJBTkRST0lEX1NUVURJT19QUkVGRVJFTkNFUyIpOworICAgIGlmIChzdHVkaW8uZW1wdHkoKSkgeworI2lmZGVmIF9fQVBQTEVfXworICAgICAgICBhcHBEYXRhUGF0aCA9IHN5cy0+Z2V0QXBwRGF0YURpcmVjdG9yeSgpOworI2Vsc2UKKyAgICAgICAgYXBwRGF0YVBhdGggPSBzeXMtPmdldEhvbWVEaXJlY3RvcnkoKTsKKyNlbmRpZiAgLy8gX19BUFBMRV9fCisgICAgICAgIGlmIChhcHBEYXRhUGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIHN0dWRpbyA9IGxhdGVzdEFuZHJvaWRTdHVkaW9EaXIoYXBwRGF0YVBhdGgpOworICAgIH0KKyAgICBpZiAoc3R1ZGlvLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICAvLyBGaW5kIG1hdGNoLT5maWxlbmFtZSB4bWwgZmlsZSB1bmRlciAuQW5kcm9pZFN0dWRpbworICAgIHN0ZDo6c3RyaW5nIHhtbF9wYXRoID0gcGF0aFRvU3R1ZGlvWE1MKHN0dWRpbywgbWF0Y2gtPmZpbGVuYW1lKTsKKyAgICBpZiAoeG1sX3BhdGguZW1wdHkoKSkgeworICAgICAgICBEKCJGYWlsZWQgdG8gZmluZCAlcyBpbiAlcyIsIG1hdGNoLT5maWxlbmFtZSwgc3R1ZGlvLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIHhtbERvY1B0ciBkb2MgPSB4bWxSZWFkRmlsZSh4bWxfcGF0aC5jX3N0cigpLCBOVUxMLCAwKTsKKyAgICBpZiAoZG9jID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXR2YWw7CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IHhtbCBmaWxlLgorICAgIC8vIElmIHdlIGZhaWwgdG8gbWF0Y2ggd2l0aGluIHRoaXMgZmlsZSwgd2UnbGwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZworICAgIC8vIGluZGljYXRpbmcgdGhhdCBub3RoaW5nIG1hdGNoZXMuCisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICByZXR2YWwgPSBldmFsX3N0dWRpb19jb25maWdfeG1sKGRvYywgcm9vdCwgbWF0Y2gpOworICAgIHhtbEZyZWVEb2MoZG9jKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vCisvLyBUaGlzIGlzIGEgc2ltcGxlIGFkLWhvYyBKU09OIHBhcnNlciBmb3IgdGhlIGN1cnJlbnRseSBwcmVzZW50IHZhbHVlcyBvZiB0aGUKKy8vIEFuZHJvaWQgU3R1ZGlvIG1ldHJpY3MgY29uZmlndXJhdGlvbiBmaWxlLgorLy8gRnVuY3Rpb24gZG9lc24ndCB0cnkgdG8gYmUgZm9ybWF0LWNvbXBsaWFudCBvciBldmVuIGltcGxlbWVudCBtb3JlIHRoYW4gd2UKKy8vIGN1cnJlbnRseSBuZWVkLCBpdCBqdXN0IGFsbG93cyBvbmUgdG8gcGFyc2UgYmFzaWMgbmFtZTp2YWx1ZSBwYWlycyBhbmQgcGFzcworLy8gYSBjYWxsYmFjayB0byBoYW5kbGUgdGhlICJ2YWx1ZSIgcGFydAorLy8gfG5hbWV8IC0gdGhlIGtleSB0byBleHRyYWN0IHZhbHVlIGZvciwgd2l0aG91dCBxdW90ZXMKKy8vIHxleHRyYWN0VmFsdWV8IC0gYSBmdW5jdG9yIHRoYXQncyBjYWxsZWQgd2l0aCBhIHdob2xlIHJlc3Qgb2YgdGhlIGN1cnJlbnQKKy8vICBsaW5lIGFzIGFuIGFyZ3VtZW50LCBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgYWZ0ZXIKKy8vICAnOicuIEUuZy46CisvLworLy8gICAgICAia2V5IiA6ICAgInZhbHVlIiwib3RoZXJrZXkiOjExCisvLyAgICAgICAgICAgICAgICBeLS0tLS0tLS0tLS0tLS0tLS0tLV4KKy8vICAgICAgICAgICAgICAgICAgfGxpbmVQYXJ0fCwgaW5jbHVzaXZlLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZVR5cGUsIGNsYXNzIFZhbHVlRXh0cmFjdG9yPgorc3RhdGljIE9wdGlvbmFsPFZhbHVlVHlwZT4gZ2V0U3R1ZGlvQ29uZmlnSnNvblZhbHVlKAorICAgICAgICBTdHJpbmdWaWV3IG5hbWUsCisgICAgICAgIFZhbHVlRXh0cmFjdG9yIGV4dHJhY3RWYWx1ZSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbmZpZ1BhdGggPSBhbmRyb2lkOjptZXRyaWNzOjpnZXRTZXR0aW5nc0ZpbGVQYXRoKCk7CisgICAgc3RkOjppZnN0cmVhbSBpbihjb25maWdQYXRoLmNfc3RyKCkpOworICAgIGlmICghaW4pIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIC8vIFBhcnNlIEpTT04gdG8gZXh0cmFjdCB0aGUgbmVlZGVkIG9wdGlvbgorICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgd2hpbGUgKHN0ZDo6Z2V0bGluZShpbiwgbGluZSkpIHsKKyAgICAgICAgLy8gQWxsIG5hbWVzIHN0YXJ0IGZyb20gYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyLCBzbyBzdGFydCB3aXRoIGZpbmRpbmcKKyAgICAgICAgLy8gb25lLgorICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdGQ6OmZpbmQobGluZS5iZWdpbigpLCBsaW5lLmVuZCgpLCAnXCInKTsKKyAgICAgICAgICAgICBpdCAhPSBsaW5lLmVuZCgpOworICAgICAgICAgICAgIGl0ID0gc3RkOjpmaW5kKGl0ICsgMSwgbGluZS5lbmQoKSwgJ1wiJykpIHsKKyAgICAgICAgICAgIGF1dG8gaXROYW1lID0gaXQgKyAxOworICAgICAgICAgICAgaWYgKGl0TmFtZSA9PSBsaW5lLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIHRoZSByaWdodCBrZXkuLi4KKyAgICAgICAgICAgIGlmIChzdHJuY21wKCYqaXROYW1lLCBuYW1lLmRhdGEoKSwgbmFtZS5zaXplKCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXROYW1lRW5kID0gaXROYW1lICsgbmFtZS5zaXplKCk7CisgICAgICAgICAgICBpZiAoaXROYW1lRW5kID09IGxpbmUuZW5kKCkgfHwgKml0TmFtZUVuZCAhPSAnXCInKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gaXROZXh0ID0gaXROYW1lRW5kICsgMTsKKyAgICAgICAgICAgIC8vIFNraXAgdGhlIHNwYWNlcyBiZWZvcmUgdGhlIGNvbG9uLi4uCisgICAgICAgICAgICB3aGlsZSAoaXROZXh0IDwgbGluZS5lbmQoKSAmJiBpc3NwYWNlKCppdE5leHQpKSB7CisgICAgICAgICAgICAgICAgKytpdE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi4gdGhlIGNvbG9uIGl0c2VsZi4uLgorICAgICAgICAgICAgaWYgKGl0TmV4dCA9PSBsaW5lLmVuZCgpIHx8ICppdE5leHQgIT0gJzonKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0TmV4dDsKKyAgICAgICAgICAgIC8vIC4uLiBhbmQgc3BhY2VzIGFmdGVyIGl0LgorICAgICAgICAgICAgd2hpbGUgKGl0TmV4dCA8IGxpbmUuZW5kKCkgJiYgaXNzcGFjZSgqaXROZXh0KSkgeworICAgICAgICAgICAgICAgICsraXROZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0TmV4dCA9PSBsaW5lLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgdmFsdWUgaGFzIHRvIGJlIHNvbWV3aGVyZSBpbiB0aGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGxpbmUsCisgICAgICAgICAgICAvLyBwYXNzIGl0IHRvIHNvbWVvbmUgd2hvIGtub3dzIGhvdyB0byBleHRyYWN0IGl0LgorICAgICAgICAgICAgYXV0byB2YWwgPSBleHRyYWN0VmFsdWUoU3RyaW5nVmlldygmKml0TmV4dCwgbGluZS5lbmQoKSAtIGl0TmV4dCkpOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge307Cit9CisKK2Jvb2wgZ2V0VXNlck1ldHJpY3NPcHRJbigpIHsKKyAgICByZXR1cm4gZ2V0U3R1ZGlvQ29uZmlnSnNvblZhbHVlPGJvb2w+KAorICAgICAgICAgICAgICAgICAgICJoYXNPcHRlZEluIiwKKyAgICAgICAgICAgICAgICAgICBbXShTdHJpbmdWaWV3IGxpbmVQYXJ0KSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IHRydWVWYWx1ZXNbXSA9IHsidHJ1ZSIsICIxIn07CisgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBsaW5lUGFydC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRydWVWYWwgOiB0cnVlVmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcCh0cnVlVmFsLmRhdGEoKSwgJippdCwgdHJ1ZVZhbC5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCArPSB0cnVlVmFsLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdmFsdWUgZW5kcyBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gbGluZVBhcnQuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdCA8IGxpbmVQYXJ0LmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzc3BhY2UoKml0KSB8fCBpc3B1bmN0KCppdCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAudmFsdWVPcihmYWxzZSk7Cit9CisKKy8vIEZvcndhcmQtZGVjbGFyZSBhIGZ1bmN0aW9uIHRvIHVzZSBoZXJlIGFuZCBpbiB0aGUgdW5pdCB0ZXN0Lgorc3RkOjpzdHJpbmcgZXh0cmFjdEluc3RhbGxhdGlvbklkKCk7CisKK25hbWVzcGFjZSB7CisKKy8vIEEgY29sbGVjdGlvbiBvZiBjYWNoZWQgY29uZmlndXJhdGlvbiB2YWx1ZXMgLSB0aGVzZSBhcmVuJ3Qgc3VwcG9zZWQgdG8gY2hhbmdlCisvLyBkdXJpbmcgdGhlIGVtdWxhdG9yIHJ1biB0aW1lLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHJlLXBhcnNlIHRoZW0gb24gZXZlcnkKKy8vIGNhbGwuCitzdHJ1Y3QgU3RhdGljVmFsdWVzIHsKKyAgICBzdGQ6OnN0cmluZyBpbnN0YWxsYXRpb25JZDsKKworICAgIFN0YXRpY1ZhbHVlcygpIHsKKyAgICAgICAgaW5zdGFsbGF0aW9uSWQgPSBleHRyYWN0SW5zdGFsbGF0aW9uSWQoKTsKKyAgICB9Cit9OworCitzdGF0aWMgTGF6eUluc3RhbmNlPFN0YXRpY1ZhbHVlcz4gc1N0YXRpY1ZhbHVlcyA9IHt9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVGhpcyBpcyB0byBiZSBhYmxlIHRvIHVuaXQtdGVzdCB0aGUgaW1wbGVtZW50YXRpb24gd2l0aG91dCBoYWNraW5nIGludG8gdGhlCisvLyBMYXp5SW5zdGFuY2U8PiBjb2RlLgorc3RkOjpzdHJpbmcgZXh0cmFjdEluc3RhbGxhdGlvbklkKCkgeworICAgIGF1dG8gb3B0aW9uYWxJZCA9IGdldFN0dWRpb0NvbmZpZ0pzb25WYWx1ZTxzdGQ6OnN0cmluZz4oCisgICAgICAgICAgICAidXNlcklkIiwgW10oU3RyaW5nVmlldyBsaW5lUGFydCkgLT4gc3RkOjpzdHJpbmcgeworICAgICAgICAgICAgICAgIGlmIChsaW5lUGFydC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXV0byBpdCA9IGxpbmVQYXJ0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaWYgKCppdCA9PSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBxdW90ZWQgc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBCVFcsIGl0IGRvZXNuJ3Qgc3VwcG9ydCBlc2NhcGluZyBhcyB0aGVyZSB3YXMgbm8gbmVlZAorICAgICAgICAgICAgICAgICAgICAvLyB5ZXQuCisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXRFbmQgPSBpdDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0RW5kICE9IGxpbmVQYXJ0LmVuZCgpICYmICppdEVuZCAhPSAnXCInKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0RW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhpdCwgaXRFbmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIHF1b3RlcywganVzdCBwYXJzZSB0aWxsIHRoZSBlbmQgb2YgdGhlIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICBhdXRvIGl0RW5kID0gaXQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdEVuZCAhPSBsaW5lUGFydC5lbmQoKSAmJiAhaXNzcGFjZSgqaXRFbmQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXRFbmQgIT0gJywnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0RW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhpdCwgaXRFbmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBvcHRpb25hbElkLnZhbHVlT3Ioe30pOworfQorCitjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SW5zdGFsbGF0aW9uSWQoKSB7CisgICAgcmV0dXJuIHNTdGF0aWNWYWx1ZXMtPmluc3RhbGxhdGlvbklkOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3R1ZGlvCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjRmZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmgKQEAgLTAsMCArMSw3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1ZlcnNpb24uaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBzdHVkaW8geworCisvLyBUaGUgc2V0IG9mIGV4aXN0aW5nIHVwZGF0ZSBjaGFubmVscywgb3JkZXJlZCBmcm9tIG1vc3QgdG8gbGVhc3Qgc3RhYmxlLgorZW51bSBjbGFzcyBVcGRhdGVDaGFubmVsIHsgU3RhYmxlLCBCZXRhLCBEZXYsIENhbmFyeSwgVW5rbm93biB9OworCisvLyBFeHRyYWN0IHRoZSBBbmRyb2lkIFN0dWRpbyB2ZXJzaW9uIGZyb20gZGlyZWN0b3J5IG5hbWUgfGRpck5hbWV8LgorLy8gZGlyTmFtZSBpcyBleHBlY3RlZCB0byBtYXRjaCB0aGUgZm9sbG93aW5nIHBhdHRlcm4KKy8vICAgICAgICAgICAgWy5dQW5kcm9pZFN0dWRpb1tQcmV2aWV3XVguWQorLy8gd2hlcmUgWCxZIHJlcHJlc2VudCBhIG1ham9yL21pbm9yIHJldmlzaW9uIG51bWJlci4KKy8vIElmIHxkaXJOYW1lfCBpcyBub3QgZm9ybWF0dGVkIGZvbGxvd2luZyB0aGUgQW5kcm9pZFN0dWRpbworLy8gcHJlZmVyZW5jZXMvY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgbmFtZSBwYXR0ZXJuLCBhbiBpbnZhbGlkCisvLyBWZXJzaW9uIHdpbGwgYmUgcmV0dXJuZWQuCisvLworYW5kcm9pZDo6YmFzZTo6VmVyc2lvbiBleHRyYWN0QW5kcm9pZFN0dWRpb1ZlcnNpb24oY29uc3QgY2hhciogY29uc3QgZGlyTmFtZSk7CisKKy8vIFNjYW4gcGF0aCB8c2NhblBhdGh8IGZvciBBbmRyb2lkU3R1ZGlvIHByZWZlcmVuY2VzL2NvbmZpZ3VyYXRpb24KKy8vIGRpcmVjdHJpZXMgYW5kIHJldHVybiB0aGUgcGF0aCB0byB0aGUgbGF0ZXN0IG9uZSwgb3IgTlVMTAorLy8gaWYgbm9uZSBjYW4gYmUgZm91bmQuIFJldHVybmVkIHZhbHVlIGlzIGEgU3RyaW5nCisvLworc3RkOjpzdHJpbmcgbGF0ZXN0QW5kcm9pZFN0dWRpb0Rpcihjb25zdCBzdGQ6OnN0cmluZyYgc2NhblBhdGgpOworCisvLyBDb25zdHJ1Y3QgYW5kIHJldHVybiB0aGUgY29tcGxldGUgcGF0aCB0byBBbmRyb2lkIFN0dWRpbyBYTUwKKy8vIHByZWZlcmVuY2VzIHxmaWxlbmFtZXwgdW5kZXIgcGF0aCB8c3R1ZGlvUGF0aHwuCisvLyBSZXR1cm5lZCB2YWx1ZSBpcyBhIFN0cmluZworc3RkOjpzdHJpbmcgcGF0aFRvU3R1ZGlvWE1MKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHVkaW9QYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB1cGRhdGUgY2hhbm5lbCBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uCisvLyBvZiBBbmRyb2lkIFN0dWRpbworVXBkYXRlQ2hhbm5lbCB1cGRhdGVDaGFubmVsKCk7CisKKy8vIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgb3B0ZWQgaW4gZm9yIG1ldHJpY3MgcmVwb3J0aW5nLgorYm9vbCBnZXRVc2VyTWV0cmljc09wdEluKCk7CisKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgQW5kcm9pZAorLy8gU3R1ZGlvIGluc3RhbGxhdGlvbiBJRC4gSWYgdGhpcyBpbnN0YWxsYXRpb24gSUQgY2Fubm90IGJlCisvLyByZXRyaWV2ZWQsIGEgcmFuZG9tIHN0cmluZyBmb2xsb3dpbmcgdGhlIEFuZHJvaWQgU3R1ZGlvCisvLyBwYXR0ZXJuIG9mIGluc3RhbGxhdGlvbiBJRHMKKy8vICgwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApIHdpbGwgYmUgcmV0dXJuZWQuCitjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SW5zdGFsbGF0aW9uSWQoKTsKKworfSAgLy8gbmFtZXNwYWNlIHN0dWRpbworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gbWFrZSBzdXJlIHRoZSBVcGRhdGVDaGFubmVsIGVudW0gaXMgaGFzaGFibGUKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGhhc2g8YW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsPiB7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsIGNoKSBjb25zdCB7CisgICAgICAgIHVzaW5nIEludFR5cGUgPQorICAgICAgICAgICAgICAgIHN0ZDo6dW5kZXJseWluZ190eXBlPGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbD46OnR5cGU7CisgICAgICAgIHJldHVybiBzdGQ6Omhhc2g8SW50VHlwZT4oKShzdGF0aWNfY2FzdDxJbnRUeXBlPihjaCkpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL1N0dWRpb0NvbmZpZ191bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzA5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWdfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjkzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWcuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGVtcERpci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9WZXJzaW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFRoZXNlIG1hY3JvcyBhcmUgcmVwbGljYXRlZCBhcyBjb25zdHMgaW4gU3R1ZGlvQ29uZmlnLmNwcAorLy8gY2hhbmdlcyB0byB0aGVzZSB3aWxsIHJlcXVpcmUgZXF1aXZhbGVudCBjaGFuZ2VzIHRvIHRoZSB1bml0dGVzdHMKKy8vCisKKyNpZmRlZiBfX0FQUExFX18KKyNkZWZpbmUgQU5EUk9JRF9TVFVESU9fRElSICJBbmRyb2lkU3R1ZGlvIgorI2Vsc2UgIC8vICEgX19fQVBQTEVfXworI2RlZmluZSBBTkRST0lEX1NUVURJT19ESVIgIi5BbmRyb2lkU3R1ZGlvIgorI2RlZmluZSBBTkRST0lEX1NUVURJT19ESVJfSU5GSVggImNvbmZpZyIKKyNlbmRpZiAgLy8gX19BUFBMRV9fCisKKyNkZWZpbmUgQU5EUk9JRF9TVFVESU9fRElSX1NVRkZJWCAib3B0aW9ucyIKKyNkZWZpbmUgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVcgIlByZXZpZXciCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6c3R1ZGlvOwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKKworVEVTVChTdHVkaW9Db25maWdUZXN0LCBhbmRyb2lkU3R1ZGlvVmVyc2lvbmluZykgeworICAgIGNvbnN0IGNoYXIqIHN0ciA9IE5VTEw7CisKKyAgICBzdHIgPSBBTkRST0lEX1NUVURJT19ESVI7CisgICAgVmVyc2lvbiB2MXN0dWRpbyhleHRyYWN0QW5kcm9pZFN0dWRpb1ZlcnNpb24oc3RyKSk7CisgICAgVmVyc2lvbiB2MSA9IFZlcnNpb24oMCwgMCwgMCwgMik7CisgICAgRVhQRUNUX0VRKHYxc3R1ZGlvLCB2MSk7CisKKyAgICBzdHIgPSBBTkRST0lEX1NUVURJT19ESVIgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVc7CisgICAgVmVyc2lvbiB2MnN0dWRpbyhleHRyYWN0QW5kcm9pZFN0dWRpb1ZlcnNpb24oc3RyKSk7CisgICAgVmVyc2lvbiB2MiA9IFZlcnNpb24oMCwgMCwgMCwgMSk7CisgICAgRVhQRUNUX0VRKHYyc3R1ZGlvLCB2Mik7CisKKyAgICBzdHIgPSAicHJlZml4XyIgQU5EUk9JRF9TVFVESU9fRElSOworICAgIFZlcnNpb24gdjNzdHVkaW8oZXh0cmFjdEFuZHJvaWRTdHVkaW9WZXJzaW9uKHN0cikpOworICAgIFZlcnNpb24gdjMgPSBWZXJzaW9uOjppbnZhbGlkKCk7CisgICAgRVhQRUNUX0VRKHYzc3R1ZGlvLCB2Myk7CisKKyAgICBzdHIgPSBBTkRST0lEX1NUVURJT19ESVIgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVcgIl9zdWZmaXgiOworICAgIFZlcnNpb24gdjRzdHVkaW8oZXh0cmFjdEFuZHJvaWRTdHVkaW9WZXJzaW9uKHN0cikpOworICAgIFZlcnNpb24gdjQgPSBWZXJzaW9uOjppbnZhbGlkKCk7CisgICAgRVhQRUNUX0VRKHY0c3R1ZGlvLCB2NCk7CisKKyAgICBzdHIgPSBBTkRST0lEX1NUVURJT19ESVIgIjEiOworICAgIFZlcnNpb24gdjVzdHVkaW8oZXh0cmFjdEFuZHJvaWRTdHVkaW9WZXJzaW9uKHN0cikpOworICAgIFZlcnNpb24gdjUgPSBWZXJzaW9uKDEsIDAsIDAsIDIpOworICAgIEVYUEVDVF9FUSh2NXN0dWRpbywgdjUpOworCisgICAgc3RyID0gQU5EUk9JRF9TVFVESU9fRElSIEFORFJPSURfU1RVRElPX0RJUl9QUkVWSUVXICIxLjMiOworICAgIFZlcnNpb24gdjZzdHVkaW8oZXh0cmFjdEFuZHJvaWRTdHVkaW9WZXJzaW9uKHN0cikpOworICAgIFZlcnNpb24gdjYgPSBWZXJzaW9uKDEsIDMsIDAsIDEpOworICAgIEVYUEVDVF9FUSh2NnN0dWRpbywgdjYpOworCisgICAgc3RyID0gQU5EUk9JRF9TVFVESU9fRElSICIxLjIwLjMiOworICAgIFZlcnNpb24gdjdzdHVkaW8oZXh0cmFjdEFuZHJvaWRTdHVkaW9WZXJzaW9uKHN0cikpOworICAgIFZlcnNpb24gdjcgPSBWZXJzaW9uKDEsIDIwLCAzLCAyKTsKKyAgICBFWFBFQ1RfRVEodjdzdHVkaW8sIHY3KTsKK30KKworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBGUyAiXFwiCisjZWxzZQorI2RlZmluZSBGUyAiLyIKKyNlbmRpZgorCitURVNUKFN0dWRpb0NvbmZpZ1Rlc3QsIGFuZHJvaWRTdHVkaW9TY2FubmVyKSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCIvcm9vdCIsIDMyLCAiL3Jvb3QvaG9tZSIpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworCisgICAgc3RkOjpzdHJpbmcgc3R1ZGlvUGF0aDsKKyAgICBzdGQ6OnN0cmluZyBmb3VuZFN0dWRpb1BhdGg7CisKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290Iik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9ob21lIik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9hZGlyIik7CisgICAgdGVzdERpci0+bWFrZVN1YkZpbGUoInJvb3QvYWZpbGUiKTsKKworICAgIGZvdW5kU3R1ZGlvUGF0aCA9IGxhdGVzdEFuZHJvaWRTdHVkaW9EaXIoIi9yb290Iik7CisgICAgRVhQRUNUX1NUUkVRKGZvdW5kU3R1ZGlvUGF0aC5jX3N0cigpLCBzdHVkaW9QYXRoLmNfc3RyKCkpOworCisgICAgdGVzdERpci0+bWFrZVN1YkZpbGUoInJvb3QvaG9tZS9hZmlsZSIpOworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiLWludmFsaWQiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIpOworCisgICAgc3R1ZGlvUGF0aCA9ICIvcm9vdC9ob21lIiBGUyBBTkRST0lEX1NUVURJT19ESVI7CisgICAgZm91bmRTdHVkaW9QYXRoID0gbGF0ZXN0QW5kcm9pZFN0dWRpb0RpcigiL3Jvb3QvaG9tZSIpOworICAgIEVYUEVDVF9TVFJFUShmb3VuZFN0dWRpb1BhdGguY19zdHIoKSwgc3R1ZGlvUGF0aC5jX3N0cigpKTsKKworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiMCIpOworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiMC4xIik7CisKKyAgICBzdHVkaW9QYXRoID0gIi9yb290L2hvbWUiIEZTIEFORFJPSURfU1RVRElPX0RJUiAiMC4xIjsKKyAgICBmb3VuZFN0dWRpb1BhdGggPSBsYXRlc3RBbmRyb2lkU3R1ZGlvRGlyKCIvcm9vdC9ob21lIik7CisgICAgRVhQRUNUX1NUUkVRKGZvdW5kU3R1ZGlvUGF0aC5jX3N0cigpLCBzdHVkaW9QYXRoLmNfc3RyKCkpOworCisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9ob21lLyIgQU5EUk9JRF9TVFVESU9fRElSICIxIik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigKKyAgICAgICAgICAgICJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVcgIjEiKTsKKworICAgIHN0dWRpb1BhdGggPSAiL3Jvb3QvaG9tZSIgRlMgQU5EUk9JRF9TVFVESU9fRElSICIxIjsKKyAgICBmb3VuZFN0dWRpb1BhdGggPSBsYXRlc3RBbmRyb2lkU3R1ZGlvRGlyKCIvcm9vdC9ob21lIik7CisgICAgRVhQRUNUX1NUUkVRKGZvdW5kU3R1ZGlvUGF0aC5jX3N0cigpLCBzdHVkaW9QYXRoLmNfc3RyKCkpOworCisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9ob21lLyIgQU5EUk9JRF9TVFVESU9fRElSICIxLjIiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKAorICAgICAgICAgICAgInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiBBTkRST0lEX1NUVURJT19ESVJfUFJFVklFVyAiMS4yIik7CisgICAgdGVzdERpci0+bWFrZVN1YkZpbGUoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiMS4zIik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9ob21lL3ByZWZpeCIgQU5EUk9JRF9TVFVESU9fRElSICIxLjQiKTsKKworICAgIC8vIDEuMyBpcyBhIGZpbGUsIG5vdCB2YWxpZAorICAgIHN0dWRpb1BhdGggPSAiL3Jvb3QvaG9tZSIgRlMgQU5EUk9JRF9TVFVESU9fRElSICIxLjIiOworICAgIGZvdW5kU3R1ZGlvUGF0aCA9IGxhdGVzdEFuZHJvaWRTdHVkaW9EaXIoIi9yb290L2hvbWUiKTsKKyAgICBFWFBFQ1RfU1RSRVEoZm91bmRTdHVkaW9QYXRoLmNfc3RyKCksIHN0dWRpb1BhdGguY19zdHIoKSk7CisKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIgIjEuMi4zIik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigKKyAgICAgICAgICAgICJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVcgIjEuMi4zIik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigicm9vdC9ob21lLyIgQU5EUk9JRF9TVFVESU9fRElSICIxMC4yMC4zMCIpOworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiUHJldmlldzEwLjIwLjMwIik7CisKKyAgICBzdHVkaW9QYXRoID0gIi9yb290L2hvbWUiIEZTIEFORFJPSURfU1RVRElPX0RJUiAiMTAuMjAuMzAiOworICAgIGZvdW5kU3R1ZGlvUGF0aCA9IGxhdGVzdEFuZHJvaWRTdHVkaW9EaXIoIi9yb290L2hvbWUiKTsKKyAgICBFWFBFQ1RfU1RSRVEoZm91bmRTdHVkaW9QYXRoLmNfc3RyKCksIHN0dWRpb1BhdGguY19zdHIoKSk7Cit9CisKK1RFU1QoU3R1ZGlvQ29uZmlnVGVzdCwgYW5kcm9pZFN0dWRpb1hNTFBhdGhCdWlsZGVyKSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCIvcm9vdCIsIDMyLCAiL3Jvb3QvaG9tZSIsICJyb290L2hvbWUiKTsKKyAgICBUZXN0VGVtcERpciogdGVzdERpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIpOworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QvaG9tZS8iIEFORFJPSURfU1RVRElPX0RJUiAiMS40Iik7CisgICAgdGVzdERpci0+bWFrZVN1YkRpcigKKyAgICAgICAgICAgICJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIgQU5EUk9JRF9TVFVESU9fRElSX1BSRVZJRVcgIjEuNCIpOworICAgIHRlc3REaXItPm1ha2VTdWJGaWxlKCJyb290L2hvbWUvIiBBTkRST0lEX1NUVURJT19ESVIgIjEwLjQwIik7CisKKyAgICBzdGQ6OnN0cmluZyBmb3VuZFN0dWRpb1BhdGggPQorICAgICAgICAgICAgbGF0ZXN0QW5kcm9pZFN0dWRpb0RpcigiL3Jvb3QvaG9tZSIpOworICAgIHN0ZDo6c3RyaW5nIGZvdW5kU3R1ZGlvWE1MUGF0aCA9IHBhdGhUb1N0dWRpb1hNTCgKKyAgICAgICAgICAgIGZvdW5kU3R1ZGlvUGF0aCwgc3RkOjpzdHJpbmcoInVzYWdlLnN0YXRpc3RpY3MueG1sIikpOworCisjaWZkZWYgX19BUFBMRV9fCisgICAgLy8gTm9ybWFsbHksIHBhdGggdG8gLkFuZHJvaWRTdHVkaW8gaW4gTWFjT1NYIHdvdWxkIGluY2x1ZGUKKyAgICAvLyAvcGF0aC90by9ob21lL0xpYnJhcnkvUHJlZmVyZW5jZXMgKGVxdWl2YWxlbnQgb2YgQVBQREFUQSkuCisgICAgLy8gV2Ugc2ltcGxpZnkgdGhpcyB0ZXN0IGJ5IHNldHRpbmcgQVBQREFUQT1IT01FCisgICAgY29uc3QgY2hhciogc3R1ZGlvWE1MUGF0aCA9CisgICAgICAgICAgICAiL3Jvb3QvaG9tZSIgRlMgQU5EUk9JRF9TVFVESU9fRElSCisgICAgICAgICAgICAiMS40IiBGUyBBTkRST0lEX1NUVURJT19ESVJfU1VGRklYIEZTICJ1c2FnZS5zdGF0aXN0aWNzLnhtbCI7CisjZWxzZQorICAgIGNvbnN0IGNoYXIqIHN0dWRpb1hNTFBhdGggPQorICAgICAgICAgICAgIi9yb290L2hvbWUiIEZTIEFORFJPSURfU1RVRElPX0RJUgorICAgICAgICAgICAgIjEuNCIgRlMgQU5EUk9JRF9TVFVESU9fRElSX0lORklYIEZTIEFORFJPSURfU1RVRElPX0RJUl9TVUZGSVggRlMKKyAgICAgICAgICAgICJ1c2FnZS5zdGF0aXN0aWNzLnhtbCI7CisjZW5kaWYKKworICAgIEVYUEVDVF9TVFJFUShmb3VuZFN0dWRpb1hNTFBhdGguY19zdHIoKSwgc3R1ZGlvWE1MUGF0aCk7Cit9CisKKy8vIEZvcndhcmQtZGVjbGFyZSB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBjYWxjdWxhdGVzIHRoZSBpbnN0YWxsYXRpb24gSUQsCisvLyB3aXRob3V0IHVzaW5nIHRoZSBjYWNoZWQgdmFsdWUuCituYW1lc3BhY2UgYW5kcm9pZCB7IG5hbWVzcGFjZSBzdHVkaW8geyBzdGQ6OnN0cmluZyBleHRyYWN0SW5zdGFsbGF0aW9uSWQoKTsgfX0KKworVEVTVChTdHVkaW9Db25maWdUZXN0LCBhbmRyb2lkU3R1ZGlvSW5zdGFsbGF0aW9uSWQpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoIi9yb290IiwgMzIpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIHRlc3RTeXMuc2V0SG9tZURpcmVjdG9yeShzdGQ6OnN0cmluZyh0ZXN0RGlyLT5wYXRoKCkpLmFwcGVuZCgiL3Jvb3QvaG9tZSIpKTsKKyAgICB0ZXN0U3lzLnNldEFwcERhdGFEaXJlY3RvcnkoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyh0ZXN0RGlyLT5wYXRoKCkpLmFwcGVuZCgiL3Jvb3QvYXBwZGF0YSIpKTsKKworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUvLmFuZHJvaWQiKTsKKworICAgIGF1dG8gbm9VdWlkID0gZXh0cmFjdEluc3RhbGxhdGlvbklkKCk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCBub1V1aWQuY19zdHIoKSk7CisKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRmlsZSgicm9vdC9ob21lLy5hbmRyb2lkL2FuYWx5dGljcy5zZXR0aW5ncyIpOworCisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncyA8PCBSIigidXNlcklkIjoiMSAyIDMiKSI7CisgICAgICAgIHNldHRpbmdzLmNsb3NlKCk7CisgICAgICAgIGF1dG8gc2V0dGluZ3NJZCA9IGV4dHJhY3RJbnN0YWxsYXRpb25JZCgpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIjEgMiAzIiwgc2V0dGluZ3NJZC5jX3N0cigpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncyA8PCBSIigidXNlcklkIjoxMjMpIjsKKyAgICAgICAgc2V0dGluZ3MuY2xvc2UoKTsKKyAgICAgICAgYXV0byBzZXR0aW5nc0lkID0gZXh0cmFjdEluc3RhbGxhdGlvbklkKCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiMTIzIiwgc2V0dGluZ3NJZC5jX3N0cigpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncyA8PCBSIigidXNlcklkIjoxMjM0LHNvbWV0aGluZzplbHNlKSI7CisgICAgICAgIHNldHRpbmdzLmNsb3NlKCk7CisgICAgICAgIGF1dG8gc2V0dGluZ3NJZCA9IGV4dHJhY3RJbnN0YWxsYXRpb25JZCgpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIjEyMzQiLCBzZXR0aW5nc0lkLmNfc3RyKCkpOworICAgIH0KK30KKworVEVTVChTdHVkaW9Db25maWdUZXN0LCBtZXRyaWNzT3B0SW4pIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoIi9yb290IiwgMzIpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIHRlc3RTeXMuc2V0SG9tZURpcmVjdG9yeShzdGQ6OnN0cmluZyh0ZXN0RGlyLT5wYXRoKCkpLmFwcGVuZCgiL3Jvb3QvaG9tZSIpKTsKKyAgICB0ZXN0U3lzLnNldEFwcERhdGFEaXJlY3RvcnkoCisgICAgICAgICAgICBzdGQ6OnN0cmluZyh0ZXN0RGlyLT5wYXRoKCkpLmFwcGVuZCgiL3Jvb3QvYXBwZGF0YSIpKTsKKworICAgIHRlc3REaXItPm1ha2VTdWJEaXIoInJvb3QiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRGlyKCJyb290L2hvbWUvLmFuZHJvaWQiKTsKKyAgICB0ZXN0RGlyLT5tYWtlU3ViRmlsZSgicm9vdC9ob21lLy5hbmRyb2lkL2FuYWx5dGljcy5zZXR0aW5ncyIpOworICAgIHsKKyAgICAgICAgc3RkOjpvZnN0cmVhbSBzZXR0aW5ncyh0ZXN0RGlyLT5wYXRoU3RyaW5nKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvcm9vdC9ob21lLy5hbmRyb2lkL2FuYWx5dGljcy5zZXR0aW5ncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppb3NfYmFzZTo6dHJ1bmMpOworICAgICAgICBBU1NFUlRfVFJVRSghIXNldHRpbmdzKTsKKyAgICAgICAgc2V0dGluZ3MgPDwgUiIoImhhc09wdGVkSW4iOnRydWUpIjsKKyAgICAgICAgc2V0dGluZ3MuY2xvc2UoKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZ2V0VXNlck1ldHJpY3NPcHRJbigpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncy5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoZ2V0VXNlck1ldHJpY3NPcHRJbigpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncyA8PCBSIigiaGFzT3B0ZWRJbiI6MSkiOworICAgICAgICBzZXR0aW5ncy5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfVFJVRShnZXRVc2VyTWV0cmljc09wdEluKCkpOworICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6b2ZzdHJlYW0gc2V0dGluZ3ModGVzdERpci0+cGF0aFN0cmluZygpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3Jvb3QvaG9tZS8uYW5kcm9pZC9hbmFseXRpY3Muc2V0dGluZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OnRydW5jKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoISFzZXR0aW5ncyk7CisgICAgICAgIHNldHRpbmdzIDw8IFIiKCJoYXNPcHRlZEluIjpmYWxzZSkiOworICAgICAgICBzZXR0aW5ncy5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoZ2V0VXNlck1ldHJpY3NPcHRJbigpKTsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6Om9mc3RyZWFtIHNldHRpbmdzKHRlc3REaXItPnBhdGhTdHJpbmcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9yb290L2hvbWUvLmFuZHJvaWQvYW5hbHl0aWNzLnNldHRpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omlvc19iYXNlOjp0cnVuYyk7CisgICAgICAgIEFTU0VSVF9UUlVFKCEhc2V0dGluZ3MpOworICAgICAgICBzZXR0aW5ncyA8PCBSIigiaGFzT3B0ZWRJbiI6YmxhaCkiOworICAgICAgICBzZXR0aW5ncy5jbG9zZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoZ2V0VXNlck1ldHJpY3NPcHRJbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL1N5bmNNZXRyaWNzUmVwb3J0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTUyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc0xvZ2dpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vc3R1ZGlvX3N0YXRzLnBiLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworU3luY01ldHJpY3NSZXBvcnRlcjo6U3luY01ldHJpY3NSZXBvcnRlcihNZXRyaWNzV3JpdGVyOjpQdHIgd3JpdGVyKQorICAgIDogTWV0cmljc1JlcG9ydGVyKHRydWUsIHN0ZDo6bW92ZSh3cml0ZXIpLCB7fSwge30sIHt9KSB7CisgICAgRCgiY3JlYXRlZCIpOworfQorCit2b2lkIFN5bmNNZXRyaWNzUmVwb3J0ZXI6OnJlcG9ydENvbmRpdGlvbmFsKENvbmRpdGlvbmFsQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgRCgiZXhlY3V0aW5nIGEgcmVwb3J0aW5nIGNhbGxiYWNrIik7CisgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgZXZlbnQ7CisgICAgICAgIGlmIChjYWxsYmFjaygmZXZlbnQpKSB7CisgICAgICAgICAgICBzZW5kVG9Xcml0ZXIoJmV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NTA3MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL1N5bmNNZXRyaWNzUmVwb3J0ZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworY2xhc3MgU3luY01ldHJpY3NSZXBvcnRlciBmaW5hbCA6IHB1YmxpYyBNZXRyaWNzUmVwb3J0ZXIKK3sKK3B1YmxpYzoKKyAgICBTeW5jTWV0cmljc1JlcG9ydGVyKE1ldHJpY3NXcml0ZXI6OlB0ciB3cml0ZXIpOworICAgIHZvaWQgcmVwb3J0Q29uZGl0aW9uYWwoQ29uZGl0aW9uYWxDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL21ldHJpY3MuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvbWV0cmljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZWJjMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL21ldHJpY3MuY3BwCkBAIC0wLDAgKzEsMjEyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgIm1ldHJpY3MuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1V1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9ncHVpbmZvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2xlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9BZGJMaXZlbmVzc0NoZWNrZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL1BlcmlvZGljUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvU3R1ZGlvQ29uZmlnLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vc3R1ZGlvX3N0YXRzLnBiLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6bWV0cmljczo6TWV0cmljc1JlcG9ydGVyOwordXNpbmcgYW5kcm9pZDo6bWV0cmljczo6UGVyaW9kaWNSZXBvcnRlcjsKKworbmFtZXNwYWNlIHsKKworLy8gQSBzdHJ1Y3QgdG8gY29udGFpbiBhbGwgbWV0cmljcyByZXBvcnRlcnMgd2UgbmVlZCB0byBiZSBydW5uaW5nIGZvciB0aGUKKy8vIHdob2xlIGVtdWxhdG9yIGxpdmVjeWNsZS4KKy8vIEZvciBub3cgaXQncyBhIHNpbmdsZSBtZW1iZXIsIGJ1dCBzb29uIHRvIGJlIG1vcmUuCitzdHJ1Y3QgSW5zdGFuY2VEYXRhIHsKKyAgICBhbmRyb2lkOjptZXRyaWNzOjpBZGJMaXZlbmVzc0NoZWNrZXI6OlB0ciBsaXZlbmVzc0NoZWNrZXI7CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBsaXZlbmVzc0NoZWNrZXIucmVzZXQoKTsKKyAgICB9Cit9OworCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEluc3RhbmNlRGF0YT4gc0dsb2JhbERhdGEgPSB7fTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2Jvb2wgYW5kcm9pZF9tZXRyaWNzX3N0YXJ0KGNvbnN0IGNoYXIqIGVtdWxhdG9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVtdWxhdG9yRnVsbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBxZW11VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250cm9sQ29uc29sZVBvcnQpIHsKKyAgICBNZXRyaWNzUmVwb3J0ZXI6OnN0YXJ0KGFuZHJvaWQ6OmJhc2U6OlV1aWQ6OmdlbmVyYXRlKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yVmVyc2lvbiwgZW11bGF0b3JGdWxsVmVyc2lvbiwgcWVtdVZlcnNpb24pOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OnN0YXJ0KCZNZXRyaWNzUmVwb3J0ZXI6OmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCkpOworCisgICAgLy8gU3RhcnQgdGhlIEFEQiBsaXZlbmVzcyBtb25pdG9yLgorICAgIGNvbnN0IGF1dG8gZW11bGF0b3JOYW1lID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdCgiZW11bGF0b3ItJWQiLCBjb250cm9sQ29uc29sZVBvcnQpOworICAgIHNHbG9iYWxEYXRhLT5saXZlbmVzc0NoZWNrZXIgPSBhbmRyb2lkOjptZXRyaWNzOjpBZGJMaXZlbmVzc0NoZWNrZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCksICZNZXRyaWNzUmVwb3J0ZXI6OmdldCgpLAorICAgICAgICAgICAgZW11bGF0b3JOYW1lLCAyMCAqIDEwMDApOworICAgIHNHbG9iYWxEYXRhLT5saXZlbmVzc0NoZWNrZXItPnN0YXJ0KCk7CisKKyAgICAvLyBBZGQgYSB0YXNrIHRoYXQgcmVwb3J0cyBlbXVsYXRvcidzIHVwdGltZSAoanVzdCBpbiBjYXNlIHRoYXQgd2UgZG9uJ3QKKyAgICAvLyBoYXZlIGVub3VnaCBvZiBvdGhlciBtZXNzYWdlcyByZXBvcnRlZCkuCisgICAgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkVGFzaygKKyAgICAgICAgICAgIDUgKiA2MCAqIDEwMDAsICAvLyByZXBvcnRpbmcgcGVyaW9kCisgICAgICAgICAgICBbXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgIC8vIHVwdGltZSBmaWVsZHMgYXJlIGFsd2F5cyBmaWxsZWQgZm9yIGFsbCBldmVudHMsIHNvIHRoZXJlJ3MKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGFuZHJvaWRfbWV0cmljc19zdG9wKCkgeworICAgIHNHbG9iYWxEYXRhLT5yZXNldCgpOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OnN0b3AoKTsKKyAgICBNZXRyaWNzUmVwb3J0ZXI6OnN0b3AoKTsKK30KKworc3RhdGljIGFuZHJvaWRfc3R1ZGlvOjpFbXVsYXRvckRldGFpbHM6Okd1ZXN0Q3B1QXJjaGl0ZWN0dXJlCit0b0NsZWFyY3V0TG9nR3Vlc3RBcmNoKGNvbnN0IGNoYXIqIGh3X2NwdV9hcmNoKSB7CisgICAgdXNpbmcgYW5kcm9pZF9zdHVkaW86OkVtdWxhdG9yRGV0YWlsczsKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc3RkOjpwYWlyPFN0cmluZ1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW11bGF0b3JEZXRhaWxzOjpHdWVzdENwdUFyY2hpdGVjdHVyZT4KKyAgICAgICAgICAgIG1hcFtdID0geworICAgICAgICAgICAgICAgICAgICB7Ing4NiIsIEVtdWxhdG9yRGV0YWlsczo6WDg2fSwKKyAgICAgICAgICAgICAgICAgICAgeyJ4ODZfNjQiLCBFbXVsYXRvckRldGFpbHM6Olg4Nl82NH0sCisgICAgICAgICAgICAgICAgICAgIHsiYXJtIiwgRW11bGF0b3JEZXRhaWxzOjpBUk19LAorICAgICAgICAgICAgICAgICAgICB7ImFybTY0IiwgRW11bGF0b3JEZXRhaWxzOjpBUk1fNjR9LAorICAgICAgICAgICAgICAgICAgICB7Im1pcHMiLCBFbXVsYXRvckRldGFpbHM6Ok1JUFN9LAorICAgICAgICAgICAgICAgICAgICB7Im1pcHM2NCIsIEVtdWxhdG9yRGV0YWlsczo6TUlQU182NH0sCisgICAgICAgICAgICB9OworCisgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbWFwKSB7CisgICAgICAgIGlmIChwYWlyLmZpcnN0ID09IGh3X2NwdV9hcmNoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFpci5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVtdWxhdG9yRGV0YWlsczo6VU5LTk9XTl9HVUVTVF9DUFVfQVJDSElURUNUVVJFOworfQorCitzdGF0aWMgYW5kcm9pZF9zdHVkaW86OlByb2R1Y3REZXRhaWxzOjpDcHVBcmNoaXRlY3R1cmUKK3RvQ2xlYXJjdXRMb2dDcHVBcmNoaXRlY3R1cmUoaW50IGJpdG5lc3MpIHsKKyAgICB1c2luZyBhbmRyb2lkX3N0dWRpbzo6UHJvZHVjdERldGFpbHM7CisgICAgc3dpdGNoIChiaXRuZXNzKSB7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdERldGFpbHM6Olg4NjsKKyAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgIHJldHVybiBQcm9kdWN0RGV0YWlsczo6WDg2XzY0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFByb2R1Y3REZXRhaWxzOjpVTktOT1dOX0NQVV9BUkNISVRFQ1RVUkU7CisgICAgfQorfQorCitzdGF0aWMgYW5kcm9pZF9zdHVkaW86OlByb2R1Y3REZXRhaWxzOjpTb2Z0d2FyZUxpZmVDeWNsZUNoYW5uZWwKK3RvQ2xlYXJjdXRMb2dVcGRhdGVDaGFubmVsKGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbCBjaGFubmVsKSB7CisgICAgdXNpbmcgYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsOworICAgIHVzaW5nIGFuZHJvaWRfc3R1ZGlvOjpQcm9kdWN0RGV0YWlsczsKKyAgICBzd2l0Y2ggKGNoYW5uZWwpIHsKKyAgICAgICAgY2FzZSBVcGRhdGVDaGFubmVsOjpTdGFibGU6CisgICAgICAgICAgICByZXR1cm4gUHJvZHVjdERldGFpbHM6OlNUQUJMRTsKKyAgICAgICAgY2FzZSBVcGRhdGVDaGFubmVsOjpCZXRhOgorICAgICAgICAgICAgcmV0dXJuIFByb2R1Y3REZXRhaWxzOjpCRVRBOworICAgICAgICBjYXNlIFVwZGF0ZUNoYW5uZWw6OkRldjoKKyAgICAgICAgICAgIHJldHVybiBQcm9kdWN0RGV0YWlsczo6REVWOworICAgICAgICBjYXNlIFVwZGF0ZUNoYW5uZWw6OkNhbmFyeToKKyAgICAgICAgICAgIHJldHVybiBQcm9kdWN0RGV0YWlsczo6Q0FOQVJZOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFByb2R1Y3REZXRhaWxzOjpVTktOT1dOX0xJRkVfQ1lDTEVfQ0hBTk5FTDsKKyAgICB9Cit9CisKK3N0YXRpYyBhbmRyb2lkX3N0dWRpbzo6RW11bGF0b3JEZXRhaWxzOjpFbXVsYXRvclJlbmRlcmVyCit0b0NsZWFyY3V0TG9nRW11bGF0b3JSZW5kZXJlcihTZWxlY3RlZFJlbmRlcmVyIHJlbmRlcmVyKSB7CisgICAgLy8gQXMgb2Ygbm93LCB0aGUgZW51bSB2YWx1ZXMgYXJlIGV4YWN0bHkgdGhlIHNhbWUuIFdhdGNoIG91dCBmb3IgY2hhbmdlcyEKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YW5kcm9pZF9zdHVkaW86OkVtdWxhdG9yRGV0YWlsczo6RW11bGF0b3JSZW5kZXJlcj4oCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihyZW5kZXJlcikpOworfQorCit2b2lkIGFuZHJvaWRfbWV0cmljc19yZXBvcnRfY29tbW9uX2luZm8oYm9vbCBvcGVuZ2xBbGl2ZSkgeworICAgIE1ldHJpY3NSZXBvcnRlcjo6Z2V0KCkucmVwb3J0KFtvcGVuZ2xBbGl2ZV0oCisgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICBldmVudC0+bXV0YWJsZV9wcm9kdWN0X2RldGFpbHMoKS0+c2V0X2NoYW5uZWwoCisgICAgICAgICAgICAgICAgdG9DbGVhcmN1dExvZ1VwZGF0ZUNoYW5uZWwoYW5kcm9pZDo6c3R1ZGlvOjp1cGRhdGVDaGFubmVsKCkpKTsKKyAgICAgICAgZXZlbnQtPm11dGFibGVfcHJvZHVjdF9kZXRhaWxzKCktPnNldF9vc19hcmNoaXRlY3R1cmUoCisgICAgICAgICAgICAgICAgdG9DbGVhcmN1dExvZ0NwdUFyY2hpdGVjdHVyZShTeXN0ZW06OmdldCgpLT5nZXRIb3N0Qml0bmVzcygpKSk7CisKKyAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpLT5zZXRfc2Vzc2lvbl9waGFzZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6RW11bGF0b3JEZXRhaWxzOjpSVU5OSU5HX0dFTkVSQUwpOworICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9pc19vcGVuZ2xfYWxpdmUob3BlbmdsQWxpdmUpOworICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPnNldF9ndWVzdF9hcmNoKAorICAgICAgICAgICAgICAgIHRvQ2xlYXJjdXRMb2dHdWVzdEFyY2goYW5kcm9pZF9ody0+aHdfY3B1X2FyY2gpKTsKKyAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpLT5zZXRfZ3Vlc3RfYXBpX2xldmVsKAorICAgICAgICAgICAgICAgIGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYW5kcm9pZF9hdmRJbmZvKSk7CisKKyAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpLT5zZXRfcmVuZGVyZXIoCisgICAgICAgICAgICAgICAgICAgIHRvQ2xlYXJjdXRMb2dFbXVsYXRvclJlbmRlcmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgZW11Z2xDb25maWdfZ2V0X3JlbmRlcmVyKGFuZHJvaWRfaHctPmh3X2dwdV9tb2RlKSkpOworCisgICAgICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX2RldGFpbHMoKS0+c2V0X2d1ZXN0X2dwdV9lbmFibGVkKAorICAgICAgICAgICAgICAgIGFuZHJvaWRfaHctPmh3X2dwdV9lbmFibGVkKTsKKyAgICAgICAgaWYgKGFuZHJvaWRfaHctPmh3X2dwdV9lbmFibGVkKSB7CisgICAgICAgICAgICBjaGFyKiBnbFZlbmRvciA9IG51bGxwdHI7CisgICAgICAgICAgICBjaGFyKiBnbFJlbmRlcmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNoYXIqIGdsVmVyc2lvbiA9IG51bGxwdHI7CisgICAgICAgICAgICAvLyBUaGlzIGNhbGwgaXMgb25seSBzZW5zaWJsZSBhZnRlciBhbmRyb2lkX3N0YXJ0T3BlbmdsZXNSZW5kZXJlcigpCisgICAgICAgICAgICAvLyBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICBhbmRyb2lkX2dldE9wZW5nbGVzSGFyZHdhcmVTdHJpbmdzKCZnbFZlbmRvciwgJmdsUmVuZGVyZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbFZlcnNpb24pOworICAgICAgICAgICAgaWYgKGdsVmVuZG9yKSB7CisgICAgICAgICAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpCisgICAgICAgICAgICAgICAgICAgICAgICAtPm11dGFibGVfZ3Vlc3RfZ2woKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfdmVuZG9yKGdsVmVuZG9yKTsKKyAgICAgICAgICAgICAgICBmcmVlKGdsVmVuZG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnbFJlbmRlcmVyKSB7CisgICAgICAgICAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpCisgICAgICAgICAgICAgICAgICAgICAgICAtPm11dGFibGVfZ3Vlc3RfZ2woKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfcmVuZGVyZXIoZ2xSZW5kZXJlcik7CisgICAgICAgICAgICAgICAgZnJlZShnbFJlbmRlcmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnbFZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+bXV0YWJsZV9ndWVzdF9nbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAtPnNldF92ZXJzaW9uKGdsVmVyc2lvbik7CisgICAgICAgICAgICAgICAgZnJlZShnbFZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChjb25zdCBHcHVJbmZvJiBncHUgOiBHcHVJbmZvTGlzdDo6Z2V0KCktPmluZm9zKSB7CisgICAgICAgICAgICBhdXRvIGhvc3RHcHUgPSBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCktPmFkZF9ob3N0X2dwdSgpOworICAgICAgICAgICAgaG9zdEdwdS0+c2V0X2RldmljZV9pZChncHUuZGV2aWNlX2lkKTsKKyAgICAgICAgICAgIGhvc3RHcHUtPnNldF9tYWtlKGdwdS5tYWtlKTsKKyAgICAgICAgICAgIGhvc3RHcHUtPnNldF9tb2RlbChncHUubW9kZWwpOworICAgICAgICAgICAgaG9zdEdwdS0+c2V0X3JlbmRlcmVyKGdwdS5yZW5kZXJlcik7CisgICAgICAgICAgICBob3N0R3B1LT5zZXRfcmV2aXNpb25faWQoZ3B1LnJldmlzaW9uX2lkKTsKKyAgICAgICAgICAgIGhvc3RHcHUtPnNldF92ZXJzaW9uKGdwdS52ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvbWV0cmljcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvbWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGRlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9tZXRyaWNzLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBDIGludGVyZmFjZSBmb3IgbWV0cmljcyByZXBvcnRpbmcgaW5pdGlhbGl6YXRpb24vdGVybWluYXRpb24uCisvLworLy8gV2UgZG9uJ3QgcHJvdmlkZSBhbiBpbnRlcmZhY2UgZm9yIGV2ZW50IGxvZ2dpbmcgb3RoZXIgdGhhbiBhIHByZWRlZmluZWQKKy8vICdjb21tb24gaW5mbycgLSBsb2dnZWQgZXZlbnQgaXMgYSBDKysgY2xhc3MgKGdlbmVyYXRlZCBmcm9tIGEgcHJvdG9idWYKKy8vIGRlZmluaXRpb24pLCBhbmQgdGhlIG9ubHkgd2F5IHRvIG1ha2UgaXQgaW50byBhIEMgaW50ZXJmYWNlIGlzIHRvIGR1cGxpY2F0ZQorLy8gdGhlIGZpZWxkcyBpbnRvIHNvbWUgQyBzdHJ1Y3Qgb3Igc2V0IG9mIGZ1bmN0aW9ucy4gV2F5IHRvbyBtdWNoIHdvcmsgZm9yIG5vCisvLyByZWFsIGdhaW5zLgorCitib29sIGFuZHJvaWRfbWV0cmljc19zdGFydChjb25zdCBjaGFyKiBlbXVsYXRvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlbXVsYXRvckZ1bGxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcWVtdVZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJvbENvbnNvbGVQb3J0KTsKK3ZvaWQgYW5kcm9pZF9tZXRyaWNzX3N0b3AoKTsKKwordm9pZCBhbmRyb2lkX21ldHJpY3NfcmVwb3J0X2NvbW1vbl9pbmZvKGJvb2wgb3BlbmdsQWxpdmUpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Byb3RvL01ldHJpY3NQcm90by5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Byb3RvL01ldHJpY3NQcm90by5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM4YzVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvcHJvdG8vTWV0cmljc1Byb3RvLm1rCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQSBzdGF0aWMgbGlicmFyeSBjb250YWluaW5nIHRoZSBtZXRyaWNzIHByb3RvYnVmIGdlbmVyYXRlZCBjb2RlCisjCisKKyMgQ29tcHV0ZSBNRVRSSUNTX0RJUiByZWxhdGl2ZSB0byBMT0NBTF9QQVRICitNRVRSSUNTX0RJUiA6PSAkKGNhbGwgbXktZGlyKQorTUVUUklDU19ESVIgOj0gJChNRVRSSUNTX0RJUjokKExPQ0FMX1BBVEgpLyU9JSkKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLWxpYnJhcnksbGlibWV0cmljc19wcm90bykKKworTE9DQUxfQ0ZMQUdTIDo9ICQoRU1VTEFUT1JfQ09NTU9OX0NGTEFHUykKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChQUk9UT0JVRl9JTkNMVURFUykgXAorCitMT0NBTF9QUk9UT19TT1VSQ0VTIDo9IFwKKyAgICAkKE1FVFJJQ1NfRElSKS9jbGllbnRhbmFseXRpY3MucHJvdG8gXAorICAgICQoTUVUUklDU19ESVIpL3N0dWRpb19zdGF0cy5wcm90byBcCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworTUVUUklDU19QUk9UT19JTkNMVURFUyA6PSAkKFBST1RPQlVGX0lOQ0xVREVTKQorTUVUUklDU19QUk9UT19TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZXRyaWNzX3Byb3RvIFwKKyAgICAkKFBST1RPQlVGX1NUQVRJQ19MSUJSQVJJRVMpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9wcm90by9SRUFETUUudHh0IGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvcHJvdG8vUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTk3YWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvcHJvdG8vUkVBRE1FLnR4dApAQCAtMCwwICsxLDEwIEBACitUaGlzIGRpcmVjdG9yeSwgcWVtdS9hbmRyb2lkL21ldHJpY3MvcHJvdG8sIGNvbnRhaW5zIGEgZ2VuZXJhdGVkIHByb3RvY29sCitkZWZpbml0aW9uIGZvciB0aGUgQW5kcm9pZCBTdHVkaW8gbWV0cmljcy4KKworSWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBwcm90byBkZWZpbml0aW9uLCB1cGRhdGUgaXQgaGVyZToKKyAgICAvL2RlcG90L2dvb2dsZTMvbG9ncy9wcm90by93aXJlbGVzcy9hbmRyb2lkL3Nkay9zdGF0cy9zdHVkaW9fc3RhdHMucHJvdG8KKworLi4uIGFuZCB0aGVuIHJ1bjoKKyAgICAvL2RlcG90L2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9zZGsvc3RhdHMvbG9ncy91cGRhdGVfZW11bGF0b3JfcHJvdG8uc2gKKworLi4uIGluc3RlYWQgb2YgZWRpdGluZyB0aGUgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBkaXJlY3RseS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Byb3RvL2NsaWVudGFuYWx5dGljcy5wcm90byBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Byb3RvL2NsaWVudGFuYWx5dGljcy5wcm90bwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMDA5MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnByb3RvCkBAIC0wLDAgKzEsMTQyNCBAQAorLy8gVEhJUyBJUyBBIEdFTkVSQVRFRCBGSUxFLiBETyBOT1QgRURJVCBESVJFQ1RMWS4KKy8vIEdlbmVyYXRlZCBieSAvL3dpcmVsZXNzL2FuZHJvaWQvcGxheS9wbGF5bG9nL3Rvb2xzOnN0cmlwX3Byb3RvX2ZpbGUKKy8vIGZyb20gd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnByb3RvCisvLyBSZWdlbmVyYXRlIGJ5IHJ1bm5pbmcKKy8vICAgYmxhemUgYnVpbGQgLy93aXJlbGVzcy9hbmRyb2lkL3BsYXkvcGxheWxvZy9wcm90bzpjbGllbnRhbmFseXRpY3Nfc3RyaXBwZWQKKworLy8gUHJvdG9zIGRlZmluaW5nIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGJldHdlZW4gQ2xlYXJjdXQgY2xpZW50IGxpYnJhcmllcworLy8gYW5kIHRoZSBDbGVhcmN1dCBzZXJ2ZXIuCisvLworLy8gTG9nUmVxdWVzdCBpcyB3aGF0IGEgY2xpZW50IGxpYnJhcnkgc2VuZHMgdG8gdGhlIHNlcnZlci4KKy8vIExvZ1Jlc3BvbnNlIGlzIHdoYXQgdGhlIHNlcnZlciBzZW5kcyBiYWNrLgorLy8KKy8vIFRoZSBMb2dSZXF1ZXN0LkxvZ1NvdXJjZSBlbnVtIGRlZmluZXMgdGhlIGxpc3Qgb2YgZGF0YXR5cGVzIHVuZGVyc3Rvb2QgYnkKKy8vIENsZWFyY3V0LgorLy8KKy8vIFBsYXkgT2R5c3NleSBzaGFyZXMgc29tZSBvZiB0aGVzZSBwcm90b3MuCisKK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOworCitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUud2lyZWxlc3MuYW5kcm9pZC5wbGF5LnBsYXlsb2cucHJvdG8iOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkNsaWVudEFuYWx5dGljcyI7CisKKy8vIFNlbWktYXJiaXRyYXJ5IGtleS12YWx1ZSBwYWlycyBkZXNjcmliaW5nIHRoZSBldmVudC4gQ29tbW9uIGVudHJpZXMKKy8vIHdpbGwgYmUgZXh0cmFjdGVkIGludG8gc3Ryb25nbHkgdHlwZWQgZmllbGRzIGluIHRoZSBHV1MgbG9nIHJlY29yZHMuCittZXNzYWdlIExvZ0V2ZW50S2V5VmFsdWVzIHsKKyAgb3B0aW9uYWwgc3RyaW5nIGtleSA9IDE7CisgIG9wdGlvbmFsIHN0cmluZyB2YWx1ZSA9IDI7Cit9CisKKy8vIE5leHQgdGFnOiAyNQorbWVzc2FnZSBMb2dFdmVudCB7CisgIGVudW0gSW50ZXJuYWxFdmVudCB7CisgICAgTk9ORSA9IDA7CisgICAgV0FMTF9DTE9DS19TRVQgPSAxOworICAgIERFVklDRV9CT09UID0gMjsKKyAgfQorICAvLyBFcG9jaCB0aW1lIGluIG1pbGxpc2Vjb25kcywgYWNjb3JkaW5nIHRvIHRoZSB3YWxsIGNsb2NrLgorICAvLyBTZWUgaHR0cDovL2dvL2NsZWFyY3V0LXRpbWVzdGFtcHMgZm9yIGRldGFpbHMgb24gaG93IHRoaXMgdmFsdWUgaXMgdXNlZC4KKyAgLy8gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBmb3IgT2R5c3NleS4gT3RoZXJ3aXNlLCBldmVudHMgd2lsbCBiZSBzaWxlbnRseQorICAvLyBkcm9wcGVkLgorICBvcHRpb25hbCBpbnQ2NCBldmVudF90aW1lX21zID0gMTsKKyAgLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIGRldmljZSB3YXMgYm9vdGVkLiAgKE9uIEFuZHJvaWQgdGhpcworICAvLyBpcyB0aGUgcmVzdWx0IG9mIFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpLCBub3QKKyAgLy8gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgd2hpY2ggZG9lcyBub3QgaW5jcmVtZW50IHdoZW4gdGhlIGRldmljZSBpcyBpbgorICAvLyBkZWVwIHNsZWVwLikKKyAgLy8KKyAgLy8gU2VlIGh0dHA6Ly9nby9jbGVhcmN1dC10aW1lc3RhbXBzIGZvciBkZXRhaWxzIG9uIGhvdyB0aGlzIHZhbHVlIGlzIHVzZWQgZm9yCisgIC8vIHRpbWVzdGFtcCBjb3JyZWN0aW9ucy4gIEl0IGlzIGFsc28gY29waWVkIHRvCisgIC8vIFBsYXlFeHRlbnNpb24uY2xpZW50X2VsYXBzZWRfcmVhbHRpbWVfbWlsbGlzIGlmIHRoZSByb3V0aW5nIG9wdGlvbgorICAvLyAiaW5jbHVkZV9jbGllbnRfZWxhcHNlZF9yZWFsdGltZV9taWxsaXMiIGlzIHNldCB0byB0cnVlLgorICBvcHRpb25hbCBpbnQ2NCBldmVudF91cHRpbWVfbXMgPSAxNzsKKyAgLy8gQ2xpZW50IGdlbmVyYXRlZCBzZXF1ZW5jZSBwb3NpdGlvbiBmb3IgdGhpcyBldmVudCAtIGRlZmluZXMgYSB0b3RhbCBvcmRlcgorICAvLyBmb3IgZXZlbnRzIGZyb20gYSBnaXZlbiBkZXZpY2UuIElmIGV2ZW50IEEncyBzZXF1ZW5jZSBwb3NpdGlvbiBpcyBsZXNzIHRoYW4KKyAgLy8gZXZlbnQgQidzIHNlcXVlbmNlIHBvc2l0aW9uLCB0aGVuIGV2ZW50IEEgaGFwcGVuZWQgYmVmb3JlIGV2ZW50IEIuCisgIG9wdGlvbmFsIGludDY0IHNlcXVlbmNlX3Bvc2l0aW9uID0gMjE7CisgIC8vIFR5cGUgb2YgZXZlbnQsIGNvdWxkIGJlICJDTElDSyIgb3IgIlBBR0VfVklFVyIgb3IgIkRPV05MT0FEX1NUQVRVUyIuCisgIC8vIFRoZXJlIHdpbGwgYmUgYSBjb21tb24gcmVwb3NpdG9yeSBvZiBjcm9zcy12ZXJ0aWNhbCBldmVudHMgdGhhdCBzaG91bGQgYmUKKyAgLy8gdXNlZCwgYnV0IGFueSBpbmRpdmlkdWFsIGFwcCB3b3VsZCBiZSBmcmVlIHRvIGRlZmluZSB0aGVpciBvd24gdGFncy4KKyAgLy8KKyAgLy8gU1RST05HTFkgRElTQ09VUkFHRUQ6IHVzZSBldmVudF9jb2RlIGluc3RlYWQuCisgIG9wdGlvbmFsIHN0cmluZyB0YWcgPSAyOworICAvLyBUeXBlIG9mIGV2ZW50LiBEaWZmZXJlbnQga2luZHMgb2YgZXZlbnRzIGluc2lkZSBhIGNsaWVudCBhcHAgc2hvdWxkIGhhdmUKKyAgLy8gZGlmZmVyZW50IHZhbHVlcyBvZiAnZXZlbnRfY29kZScuIERpZmZlcmVudCBjbGllbnQgYXBwcyBtYXkgaGF2ZQorICAvLyBvdmVybGFwcGluZyBzZXRzIG9mICdldmVudF9jb2RlJyB2YWx1ZXM7IHRoZXNlIHZhbHVlcyBhcmUgb25seSBtZWFudCB0bworICAvLyBtYWtlIHNlbnNlIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHNpbmdsZSBjbGllbnQgYXBwLCBhcyBpZGVudGlmaWVkIGJ5CisgIC8vIHRoZSAnbG9nX3NvdXJjZScgZmllbGQgb2YgTG9nUmVxdWVzdC4KKyAgLy8KKyAgLy8gQSB0eXBpY2FsIHdheSB0byB1c2UgJ2V2ZW50X2NvZGUnIGlzIHRvIGRlZmluZSB0aGUgZW51bSBvZiBwb3NzaWJsZSB2YWx1ZXMKKyAgLy8gaW5zaWRlIG9mIHRoZSBjdXN0b20gbG9nZ2luZyBleHRlbnNpb24gcHJvdG8uCisgIC8vIFRPRE8oYWJlZG5lZ28pOiBhZGQgYW4gZXhhbXBsZSBDTC4KKyAgLy8KKyAgLy8gVGhpcyBlbnVtIHR5cGUgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIGEgTG9nRXZlbnRSb3V0aW5nQ29uZmlnIHByb3RvLgorICBvcHRpb25hbCBpbnQzMiBldmVudF9jb2RlID0gMTE7CisgIC8vIElkZW50aWZpZXMgYSBncm91cCBvZiBldmVudHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgZmxvdyBvciBzZXNzaW9uIG9mCisgIC8vIHVzZXIgaW50ZXJhY3Rpb24sIHdoaWNoIGlzIGEgY2xpZW50LXNwZWNpZmljIGNvbmNlcHQuCisgIC8vCisgIC8vIFRoZXNlIElEcyBhcmUgdXNlZCBpbiB0aGUgQ2xlYXJjdXQvVU1BIHBpcGVsaW5lIGZvciBjb21wdXRpbmcgbGF0ZW5jaWVzCisgIC8vIGJldHdlZW4gcGFpcnMgb2YgZXZlbnRzLCB3aGVyZSBpdCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgYm90aCBldmVudHMKKyAgLy8gYmVsb25nIHRvIHRoZSBzYW1lIGZsb3cuCisgIC8vCisgIC8vIEZvciBleGFtcGxlLCB0aGUgR29vZ2xlIFBsYXkgdGVhbSBtYXkgd2FudCB0byBnaXZlIGEgdW5pcXVlIElEIHRvIGVhY2gKKyAgLy8gcHVyY2hhc2Ugc2Vzc2lvbiwgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZXZlbnRzIHN0YXJ0aW5nIGZyb20gdGhlIGluaXRpYWwKKyAgLy8gc2VhcmNoIGZvciBhbiBhcHAgdG8gdGhlIGV2ZW50dWFsIHB1cmNoYXNlIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGFwcC4KKyAgLy8gQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHRoZSBTZWFyY2ggYXBwIHdhbnRpbmcgdG8gdGllIHRvZ2V0aGVyIHNlYXJjaAorICAvLyBxdWVyeSBldmVudHMgYW5kIGNsaWNrcyBvbiBzZWFyY2ggcmVzdWx0cywgZXNwZWNpYWxseSBpZiBzZXZlcmFsIGluc3RhbmNlcworICAvLyBvZiB0aGUgYXBwIG1heSBiZSBhY3RpdmUgYXQgdGhlIHNhbWUgdGltZS4KKyAgb3B0aW9uYWwgaW50MzIgZXZlbnRfZmxvd19pZCA9IDEyOworICAvLyBXaGV0aGVyIHRoaXMgZXZlbnQgd2FzIGluaXRpYXRlZCBieSB0aGUgdXNlciBhdCB0aGUgdGltZSBvZiB0aGUgZXZlbnQgb3IKKyAgLy8gc2hvcnRseSBiZWZvcmUgKHZzLiBhIGJhY2tncm91bmQgZXZlbnQgbGlrZSB1cGdyYWRpbmcgYSBkYXRhYmFzZSBhZnRlciB0aGUKKyAgLy8gYXBwIHdhcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQpLgorICBvcHRpb25hbCBib29sIGlzX3VzZXJfaW5pdGlhdGVkID0gMTA7CisgIC8vIFRoZXNlIG1pZ2h0IGNvbnRhaW4gUElJIGFuZCB3aWxsIG5vdCBiZSBzdG9yZWQgZm9yIG1vcmUgdGhhbiA4IGRheXMuCisgIC8vIElmIHBvc3NpYmxlLCBwbGVhc2UgY3JlYXRlIGEgbmFtZWQgZmllbGQgaW4gdGhlIHByb3RvcyBiZWxvdyBpbnN0ZWFkLgorICByZXBlYXRlZCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuTG9nRXZlbnRLZXlWYWx1ZXMgdmFsdWUgPSAzOworICAvLyBUT0RPKGpzdyk6IFJlbW92ZS4gV2UgY2FuJ3QgZG8gdGhhdCBhcyBvZiAyMDE1LzA4LzEzIGJlY2F1c2Ugd2Ugc3RpbGwgZ2V0CisgIC8vIHNldmVyYWwgdGhvdXNhbmQgUVBTIGZyb20gYW5jaWVudCBQbGF5IFN0b3JlIGNsaWVudHMgd2hvIHVzZSB0aGlzIGZpZWxkLgorICAvLworICAvLyBFeHRlbnNpb24gZm9yIFBsYXkgU3RvcmUgYXBwIGxvZ3MuIFJlYWwgdHlwZSBpcyBQbGF5U3RvcmVMb2dFdmVudC4gVGhpcworICAvLyBleGlzdHMgdG8gc3VwcG9ydCBsZWdhY3kgY2xpZW50cy4gVXNlIHNvdXJjZV9leHRlbnNpb24gaW5zdGVhZC4KKyAgb3B0aW9uYWwgYnl0ZXMgc3RvcmUgPSA0OworICAvLyBXQVMgb3B0aW9uYWwgUGxheWxvZ0dhbWVzRXh0ZW5zaW9uIGdhbWVzID0gNTsKKworICAvLyBGaXJzdC1wYXJ0eSBhcHAgdXNhZ2UgdHJhY2tpbmcuIFVzZWQgb25seSB3aGVuIGxvZ19zb3VyY2UgPSBBUFBfVVNBR0VfMVAuCisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5BcHBVc2FnZTFwTG9nRXZlbnQgYXBwX3VzYWdlXzFwID0gOTsKKyAgLy8gQSBzb3VyY2Ugc3BlY2lmaWMgZXh0ZW5zaW9uICh0eXBpY2FsbHkgYSBzZXJpYWxpemVkIHByb3RvKS4gVGhlIHR5cGUgb2YKKyAgLy8gdGhpcyBkYXRhIGlzIGRldGVybWluZWQgYnkgdGhlIGxvZ19zb3VyY2Ugb2YgdGhlIGVuY2xvc2luZyBMb2dSZXF1ZXN0LgorICAvLyBUaGUgcHJvdG8gaXMgZGVyaXZlZCBieSBjYWxsaW5nIFBhcnNlRnJvbVN0cmluZyBtZXRob2QgaW4KKyAgLy8gbmV0L3Byb3RvMi9wdWJsaWMvbWVzc2FnZV9saXRlLmguCisgIG9wdGlvbmFsIGJ5dGVzIHNvdXJjZV9leHRlbnNpb24gPSA2OworICAvLyBBIGpzcGIgdmVyc2lvbiBvZiBzb3VyY2VfZXh0ZW5zaW9uLCB1c2luZyBhcnJheSBzZXJpYWxpemF0aW9uIGZvcm1hdC4KKyAgLy8gTW9yZSBpbmZvIG9uIEpTUEIgYXQgZ28vanNwYi4KKyAgb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9leHRlbnNpb25fanMgPSA4OworICAvLyBBIHN0cmluZ2lmaWVkIGpzb24gcHJvdG8gdmVyc2lvbiBvZiBzb3VyY2VfZXh0ZW5zaW9uLiAgVGhlIGpzb24gc3RyaW5nIGlzCisgIC8vIGNvbnZlcnRlZCBiYWNrIHRvIHByb3RvIHVzaW5nIHRoZSBqc29uX2Zvcm1hdCB1dGlsaXR5IGF0CisgIC8vIG5ldC9wcm90bzIvdXRpbC9wdWJsaWMvanNvbl9mb3JtYXQuaCwgd2l0aG91dCBhbnkgZmxhZ3MuCisgIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZXh0ZW5zaW9uX2pzb24gPSAxMzsKKyAgLy8gQSBzdHJpbmcgZm9yIGlkZW50aWZ5aW5nIGEgdGVzdCBydW4uICBZb3UgbWF5IHVzZSB0aGlzIHN0cmluZyB0byBncm91cCBsb2cKKyAgLy8gZGF0YSBjb21pbmcgZnJvbSBhIHRlc3QgcnVuLiAgVXN1YWxseSBsb2dzIGZyb20gdGVzdCBhcHBzIG9yIGZyb20gbm9ybWFsCisgIC8vIGFwcHMgcnVubmluZyBvbiB0ZXN0IGRldmljZXMgd2lsbCBoYXZlIHRoaXMgZmllbGQgc2V0LgorICBvcHRpb25hbCBzdHJpbmcgdGVzdF9pZCA9IDE0OworICAvLyBVc2VyJ3MgdGltZXpvbmUgb2Zmc2V0IGZyb20gVVRDIGluIHNlY29uZHMuIElmIHRoZSB1c2VyJ3MgVVRDIHRpbWUKKyAgLy8gaXMgWCBtaWxsaXMgdGhlbiB0aGUgb24tZGV2aWNlIGNsb2NrIHRpbWUgd291bGQgYmUKKyAgLy8gWCArIHRpbWV6b25lX29mZnNldF9zZWNvbmRzICogMTAwMC4KKyAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaXMgbm9uLXNlbnNpY2FsLCBtYWlubHkgc28gdGhhdCAwIGNhbiBiZSBkaXN0aW5ndWlzaGVkCisgIC8vIGZyb20gIm5vdCBzcGVjaWZpZWQiIHVzaW5nIHByb3RvIG5hbm8gKGFuZCB3aXRob3V0IGNoYW5naW5nIG91ciBidWlsZAorICAvLyBvcHRpb25zIHRvIHVzZSByZWZlcmVuY2UgdHlwZXMgZm9yIHByaW1pdGl2ZXMpLgorICBvcHRpb25hbCBzaW50NjQgdGltZXpvbmVfb2Zmc2V0X3NlY29uZHMgPSAxNSBbZGVmYXVsdCA9IDE4MDAwMF07CisgIC8vIHNlcmlhbGl6ZWQgRGV2aWNlRXhwZXJpbWVudElkczsgdGhlIGV4cGVyaW1lbnQgaWRzIGFyZSBwcm9wYWdhdGVkCisgIC8vIHRvIEdXU0xvZyBleHBlcmltZW50IGlkcworICBvcHRpb25hbCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuRXhwZXJpbWVudElkcyBleHBlcmltZW50X2lkcyA9IDE2OworICAvLyBTZXJpYWxpemVkIHByb3RvIG1lc3NhZ2Ugb2YgQ2xpZW50VmlzdWFsRWxlbWVudHNQcm90byBhcyBkZWZpbmVkIGluCisgIC8vIGxvZ3MvcHJvdG8vdmlzdWFsX2VsZW1lbnQvY2xpZW50X3Zpc3VhbF9lbGVtZW50cy5wcm90by4gVGhlIGNsaWVudCBjYW4KKyAgLy8gb3B0aW9uYWxseSBzZW5kIGEgbG9nIGV2ZW50IHdpdGggdGhpcyBmaWVsZCBzZXQuIEluIHRoaXMgY2FzZSwgY2xlYXJjdXQKKyAgLy8gc2VydmVyIG5lZWRzIHRvIGRlc2VyaWFsaXplIHRoZSBieXRlcyBhcyBhIENsaWVudFZpc3VhbEVsZW1lbnRzUHJvdG8gYW5kCisgIC8vIHNldHMgYXBwcm9wcmlhdGUgZmllbGRzIGluIHRoZSBvdXRwdXQgR1dTTG9nRW50cnlQcm90by4KKyAgLy8KKyAgLy8gU2VlIGh0dHA6Ly9nby9OYXRpdmVWZUxvZ2dpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIG9wdGlvbmFsIGJ5dGVzIGNsaWVudF92ZSA9IDE4OworICAvLyBBbHRlcm5hdGl2ZSBzZXJpYWxpemVkIGZpZWxkIGZvciB0aGUgY2xpZW50X3ZlIGZpZWxkIGRlZmluZWQgaW4gMTguCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBhcnJheSBzZXJpYWxpemF0aW9uIGZvcm1hdC4gTW9yZSBpbmZvIGF0IGdvL2pzcGIuCisgIG9wdGlvbmFsIHN0cmluZyBjbGllbnRfdmVfanMgPSAyNDsKKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkxvZ0V2ZW50LkludGVybmFsRXZlbnQgaW50ZXJuYWxfZXZlbnQgPSAxOTsKKyAgLy8gSW5kaWNhdGVzIHRoYXQgYW4gaW50ZXJlc3RpbmcgdGhpbmcgaGFzIG9jY3VycmVkLiBVc2VkIHRvIG5hcnJvdyB0aGUgc2V0CisgIC8vIG9mIHNhbXBsZXMgdG8gY29uc2lkZXIgaW4gYW5hbHlzaXMuIFRlc3QgY29kZXMgYXJlIGNvcGllZCB0bworICAvLyBHd3NMb2dFbnRyeVByb3RvLlRlc3RDb2RlLgorICAvLworICAvLyBTZWUgZ29vZ2xlMy9hZHMvYmFzZS90ZXN0X2NvZGVzL3Rlc3RfY29kZXMucHJvdG8KKyAgLy8gZm9yIEFkcycgdXNlIG9mIHRlc3QgY29kZXMuCisgIHJlcGVhdGVkIGludDMyIHRlc3RfY29kZSA9IDIwOworICAvLyBOdW1iZXIgb2YgdGltZXMgdGhlIGRldmljZSBpcyBrbm93biB0byBoYXZlIGJvb3RlZC4gVGFrZW4gdG9nZXRoZXIsCisgIC8vIHtib290LWNvdW50LCB1cHRpbWV9IHBhaXJzIGFyZSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBjb3VudGVyIHdoaWNoCisgIC8vIGNhbiBiZSB1c2VkIHRvIG9yZGVyIGV2ZW50cyBhY2Nyb3NzIGxvZyBzb3VyY2VzLgorICBvcHRpb25hbCBpbnQ2NCBib290X2NvdW50ID0gMjI7CisgIC8vIFRoZSBjdXJyZW50IG5ldHdvcmsgY29ubmVjdGl2aXR5IGluZm8gd2hlbiB0aGUgZXZlbnQgd2FzIGxvZ2dlZCBpbiB0aGUKKyAgLy8gY2xpZW50CisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5OZXR3b3JrQ29ubmVjdGlvbkluZm8gbmV0d29ya19jb25uZWN0aW9uX2luZm8gPSAyMzsKKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIDUzNjg3MDkxMTsKK30KKworLy8gVG8gZGVzY3JpYmUgdGhlIG5ldHdvcmsgY29ubmVjdGl2aXR5IG9mIHRoZSBjbGllbnQuCisvLyBOZXh0IHRhZzogMworbWVzc2FnZSBOZXR3b3JrQ29ubmVjdGlvbkluZm8geworICAvLyBGcm9tIGFuZHJvaWQvZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Db25uZWN0aXZpdHlNYW5hZ2VyLmphdmEKKyAgLy8gTm90ZTogZGF0YSB3aWxsIG9ubHkgYmUgcmVjb3JkZWQgZm9yIGludGVybmV0IGNvbm5lY3Rpb25zLiBUaGlzIG1lYW5zCisgIC8vIEJMVUVUT09USCBjb3JyZXNwb25kcyB0byB3aGVuIGJsdWV0b290aCB3YXMgdXNlZCBmb3IgcmV2ZXJzZSB0ZXRoZXJpbmcKKyAgLy8gKGkuZS4gdXNpbmcgYSBjb21wdXRlcidzIGludGVybmV0IGNvbm5lY3Rpb24gb24gdGhlIHBob25lKSBhbmQgTk9UIGZvcgorICAvLyBnZW5lcmFsIGRldmljZSBwYWlyaW5nIHZpYSBibHVldG9vdGgsIHN1Y2ggYXMgY2xvY2t3b3JrLgorICBlbnVtIE5ldHdvcmtUeXBlIHsKKyAgICBOT05FID0gLTE7CisgICAgTU9CSUxFID0gMDsKKyAgICBXSUZJID0gMTsKKyAgICBNT0JJTEVfTU1TID0gMjsKKyAgICBNT0JJTEVfU1VQTCA9IDM7CisgICAgTU9CSUxFX0RVTiA9IDQ7CisgICAgTU9CSUxFX0hJUFJJID0gNTsKKyAgICBXSU1BWCA9IDY7CisgICAgQkxVRVRPT1RIID0gNzsKKyAgICBEVU1NWSA9IDg7CisgICAgRVRIRVJORVQgPSA5OworICAgIE1PQklMRV9GT1RBID0gMTA7CisgICAgTU9CSUxFX0lNUyA9IDExOworICAgIE1PQklMRV9DQlMgPSAxMjsKKyAgICBXSUZJX1AyUCA9IDEzOworICAgIE1PQklMRV9JQSA9IDE0OworICAgIE1PQklMRV9FTUVSR0VOQ1kgPSAxNTsKKyAgICBQUk9YWSA9IDE2OworICAgIFZQTiA9IDE3OworICB9CisgIC8vIEZyb20gYW5kcm9pZC9mcmFtZXdvcmtzL2Jhc2UvdGVsZXBob255L2phdmEvYW5kcm9pZC90ZWxlcGhvbnkvVGVsZXBob255TWFuYWdlci5qYXZhCisgIGVudW0gTW9iaWxlU3VidHlwZSB7CisgICAgVU5LTk9XTl9NT0JJTEVfU1VCVFlQRSA9IDA7CisgICAgR1BSUyA9IDE7CisgICAgRURHRSA9IDI7CisgICAgVU1UUyA9IDM7CisgICAgQ0RNQSA9IDQ7CisgICAgRVZET18wID0gNTsKKyAgICBFVkRPX0EgPSA2OworICAgIFJUVCA9IDc7CisgICAgSFNEUEEgPSA4OworICAgIEhTVVBBID0gOTsKKyAgICBIU1BBID0gMTA7CisgICAgSURFTiA9IDExOworICAgIEVWRE9fQiA9IDEyOworICAgIExURSA9IDEzOworICAgIEVIUlBEID0gMTQ7CisgICAgSFNQQVAgPSAxNTsKKyAgICBHU00gPSAxNjsKKyAgICAvLyBDT01CSU5FRCBoYXMgdmFsdWUgLTEgaW4gTmV0d29ya0lkZW50aXR5LmphdmEsIGJ1dCBpcyBnaXZlbiB0aGUgdmFsdWUKKyAgICAvLyAxMDAgaGVyZSB0byBzYXZlIChkaXNrKSBzcGFjZS4gVGhlIHZhbHVlIC0xIHRha2VzIHVwIHRoZSBmdWxsIDEwIGJ5dGVzIGluCisgICAgLy8gYSB2YXJpbnQgZm9yIGVudW1zLCBidXQgdGhlIHZhbHVlIDEwMCBvbmx5IHRha2VzIHVwIDEgYnl0ZS4KKyAgICBDT01CSU5FRCA9IDEwMDsKKyAgfQorICAvLyBUaGUgY3VycmVudCBuZXR3b3JrIGNvbm5lY3Rpdml0eSB0eXBlIHdoZW4gdGhlIGV2ZW50IHdhcyBsb2dnZWQgaW4gdGhlCisgIC8vIGNsaWVudAorICBvcHRpb25hbCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuTmV0d29ya0Nvbm5lY3Rpb25JbmZvLk5ldHdvcmtUeXBlIG5ldHdvcmtfdHlwZSA9IDEgW2RlZmF1bHQgPSBOT05FXTsKKyAgLy8gVGhlIGN1cnJlbnQgbW9iaWxlIGNvbm5lY3Rpdml0eSBzdWJ0eXBlIHdoZW4gdGhlIGV2ZW50IHdhcyBsb2dnZWQgaW4gdGhlCisgIC8vIGNsaWVudAorICBvcHRpb25hbCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuTmV0d29ya0Nvbm5lY3Rpb25JbmZvLk1vYmlsZVN1YnR5cGUgbW9iaWxlX3N1YnR5cGUgPSAyIFtkZWZhdWx0ID0gVU5LTk9XTl9NT0JJTEVfU1VCVFlQRV07Cit9CisKKy8vIFRoZSBleHBlcmltZW50IGlkcywgYm90aCBpbiB0aGUgY2xlYXIgYW5kIGVuY3J5cHRlZC4KK21lc3NhZ2UgRXhwZXJpbWVudElkcyB7CisgIC8vIFRoZSBjbGllbnQgc2VsZWN0ZWQgZXhwZXJpbWVudCBpZHMgaW4gdGhlIGNsZWFyIChlLmcuIGZyb20gQ2hyb21lKS4KKyAgLy8gc2VyaWFsaXplZCBleHBlcmltZW50cy5oZXRlcm9keW5lLkRldmljZUV4cGVyaW1lbnRJZHMKKyAgb3B0aW9uYWwgYnl0ZXMgY2xlYXJfYmxvYiA9IDE7CisgIC8vIEEganNwYiB2ZXJzaW9uIG9mIGNsZWFyX2Jsb2IsIHVzaW5nIGFycmF5IHNlcmlhbGl6YXRpb24gZm9ybWF0LgorICAvLyBNb3JlIGluZm8gb24gSlNQQiBhdCBnby9qc3BiLgorICBvcHRpb25hbCBzdHJpbmcgY2xlYXJfYmxvYl9qcyA9IDQ7CisgIC8vIGVuY3J5cHRlZCBzZXJpYWxpemVkIGV4cGVyaW1lbnRzLmhldGVyb2R5bmUuRGV2aWNlRXhwZXJpbWVudElkcworICByZXBlYXRlZCBieXRlcyBlbmNyeXB0ZWRfYmxvYiA9IDI7CisgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBQaGVub3R5cGUgY29tbWl0dGVkIHVzZXIgbWF0Y2hlcyB0aGUgdXBsb2FkIGFjY291bnQKKyAgb3B0aW9uYWwgYm9vbCB1c2Vyc19tYXRjaCA9IDM7Cit9CisKKy8vIEF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gQW5kcm9pZCBjbGllbnRzLgorLy8KKy8vIE5leHQgdGFnOiAyMworbWVzc2FnZSBBbmRyb2lkQ2xpZW50SW5mbyB7CisgIC8vICJHc2VydmljZXMiIGFuZHJvaWQgSUQuICBDb25zaWRlcmVkIFBJSS4gIE5ldmVyIGxvZ2dlZCBpbiBhcmNoaXZhbCBsb2dzLgorICBvcHRpb25hbCBpbnQ2NCBhbmRyb2lkX2lkID0gMTsKKyAgLy8gUHNldWRvbnltb3VzLCByYW5kb20gaWQgKHN0aWNreSkgcGVyIGRldmljZS4gIE1heSBvbmx5IGJlIGxvZ2dlZCBpbiB0ZW1wCisgIC8vIGxvZ3MgaWYgR1dTTG9nRW50cnlQcm90by5Vc2VySW5mby5Vc2VySWQgaXMgbm90IHNldC4KKyAgb3B0aW9uYWwgc3RyaW5nIGxvZ2dpbmdfaWQgPSAyOworICAvLyBEZXZpY2UgSUQgcmVmZXJlbmNlZCBieSBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlNlY3VyZS5BTkRST0lEX0lELgorICAvLyBDb25zaWRlcmVkIFBJSS4gTmV2ZXIgbG9nZ2VkIGluIGFyY2hpdmFsIGxvZ3MuCisgIG9wdGlvbmFsIGludDY0IGRldmljZV9pZCA9IDE4OworICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQuCisgIG9wdGlvbmFsIGludDMyIHNka192ZXJzaW9uID0gMzsKKyAgLy8gVGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgY2xpZW50IHBsYXRmb3JtLiAgZS5nLiwgIk5leHVzIDQiLgorICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5NT0RFTC4KKyAgb3B0aW9uYWwgc3RyaW5nIG1vZGVsID0gNDsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIG92ZXJhbGwgcHJvZHVjdC4gZS5nLiwgIm9jY2FtIi4KKyAgLy8gVGhpcyBjb21lcyBmcm9tIGFuZHJvaWQub3MuQnVpbGQuUHJvZHVjdC4KKyAgb3B0aW9uYWwgc3RyaW5nIHByb2R1Y3QgPSA1OworICAvLyBUaGUgbmFtZSBvZiB0aGUgaGFyZHdhcmUgKGZyb20gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgb3IgL3Byb2MpLgorICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5IYXJkd2FyZS4gIGUuZy4sICJtYWtvIi4KKyAgb3B0aW9uYWwgc3RyaW5nIGhhcmR3YXJlID0gODsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGluZHVzdHJpYWwgZGVzaWduLiAgZS5nLiwgIm1ha28iLgorICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5EZXZpY2UuCisgIG9wdGlvbmFsIHN0cmluZyBkZXZpY2UgPSA5OworICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5JRC4gIGUuZy4sIHNvbWV0aGluZyBsaWtlICJKUk41NEYiLgorICBvcHRpb25hbCBzdHJpbmcgb3NfYnVpbGQgPSA2OworICAvLyBUaGUgY2xpZW50IGFwcGxpY2F0aW9uIHZlcnNpb24uIFRoZSBqYXZhIGludCB2ZXJzaW9uIGluIHRoZSBhbmRyb2lkIHBhY2thZ2UKKyAgLy8gY29udmVydGVkIHRvIHN0cmluZy4KKyAgb3B0aW9uYWwgc3RyaW5nIGFwcGxpY2F0aW9uX2J1aWxkID0gNzsKKyAgLy8gVGhlIG1vYmlsZSBjb3VudHJ5IGNvZGUgLyBtb2JpbGUgbmV0d29yayBjb2RlIChNQ0MvTU5DKS4KKyAgLy8gZS5nLiwgMzEwMDA0IGZvciBWZXJpem9uIFVTQS4KKyAgb3B0aW9uYWwgc3RyaW5nIG1jY19tbmMgPSAxMDsKKyAgLy8gVGhlIGNob3NlbiBsb2NhbGUgZnJvbSB0aGUgY2xpZW50LiBlLmcuLCAiZW5fVVMiLCAia29fS1IiLCAiZW5fR0IiLgorICBvcHRpb25hbCBzdHJpbmcgbG9jYWxlID0gMTE7CisgIC8vIFRoZSBjaG9zZW4gY291bnRyeSBmcm9tIHRoZSBjbGllbnQuIGUuZy4sICJVUyIsICJLUiIsICJKUCIuCisgIG9wdGlvbmFsIHN0cmluZyBjb3VudHJ5ID0gMTI7CisgIC8vIFRoZSBtYW51ZmFjdHVyZXIgb2YgdGhlIGhhcmR3YXJlLgorICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5NQU5VRkFDVFVSRVIKKyAgb3B0aW9uYWwgc3RyaW5nIG1hbnVmYWN0dXJlciA9IDEzOworICAvLyBUaGUgYnJhbmQgdGhlIHNvZnR3YXJlIGlzIGN1c3RvbWl6ZWQgZm9yLCBpZiBhbnkuICBPZnRlbiBhIGNhcnJpZXIgbmFtZS4KKyAgLy8gZS5nLiAiZ29vZ2xlIgorICAvLyBmcm9tIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvQnVpbGQuaHRtbCNCUkFORAorICBvcHRpb25hbCBzdHJpbmcgYnJhbmQgPSAxNDsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIHVuZGVybHlpbmcgYm9hcmQKKyAgLy8gZS5nLiAidHVuYSIKKyAgLy8gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwjQk9BUkQKKyAgb3B0aW9uYWwgc3RyaW5nIGJvYXJkID0gMTU7CisgIC8vIFJhZGlvIHZlcnNpb24gYXMgcmVwb3J0ZWQgYnkgZGV2aWNlLCBpZiBhdmFpbGFibGUgYXQgcmVwb3J0aW5nIHRpbWUKKyAgLy8gZS5nLiAiSTkyNTBYWExKMSIKKyAgLy8gZnJvbSBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwjZ2V0UmFkaW9WZXJzaW9uKCkKKyAgb3B0aW9uYWwgc3RyaW5nIHJhZGlvX3ZlcnNpb24gPSAxNjsKKyAgLy8gRGV2aWNlIG1vZGVsL2J1aWxkIGZpbmdlcnByaW50LgorICAvLyBUaGlzIGNvbWVzIGZyb20gYW5kcm9pZC5vcy5CdWlsZC5GSU5HRVJQUklOVC4KKyAgb3B0aW9uYWwgc3RyaW5nIGZpbmdlcnByaW50ID0gMTc7CisgIC8vIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlSW5mby52ZXJzaW9uQ29kZSBvZiBjb20uZ29vZ2xlLmFuZHJvaWQuZ21zLgorICAvLyBlLmcuLCA2MDMxMDMwCisgIG9wdGlvbmFsIGludDMyIGdtc19jb3JlX3ZlcnNpb25fY29kZSA9IDE5OworICAvLyBXaGV0aGVyIHRoZSBkZXZpY2UgaXMgYSBTaWRld2luZGVyIGRldmljZS4gU2VlIGdvL3NpZGV3aW5kZXItc3VtbWFyeS4KKyAgb3B0aW9uYWwgYm9vbCBpc19zaWRld2luZGVyX2RldmljZSA9IDIwOworICAvLyBUaGUgQ2hpbWVyYSBtb2R1bGUgY29uZmlnIGluZm8gZGVzY3JpYmluZyB0aGUgbW9kdWxlIHNldHMgb24gdGhlIGRldmljZQorICAvLyB3aGVuIHRoZSBldmVudCBpcyBsb2dnZWQgaW4gdGhlIGNsaWVudC4KKyAgLy8gVGhpcyBpcyBhIHByb3RvIG9mIENoaW1lcmFDb25maWdJbmZvIHJlc2lkaW5nIGluCisgIC8vIGdvb2dsZTMvbG9ncy9wcm90by93aXJlbGVzcy9hbmRyb2lkL3BsYXkvcGxheWxvZy9jaGltZXJhX21vZHVsZXMucHJvdG8uCisgIG9wdGlvbmFsIGJ5dGVzIGNoaW1lcmFfY29uZmlnX2luZm8gPSAyMTsKKyAgLy8gSW5kaWNhdGVzIGlmIHRoZSBkZXZpY2UgaXMgcGFzc2luZyBpbiB0aGUgTG9nUmVxdWVzdC5Mb2dTb3VyY2UgaW50ZWdlcgorICAvLyB2YWx1ZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaW4gYSBzdHJpbmcgZm9yIGxvZ19zb3VyY2VfbmFtZS4KKyAgLy8gVGhpcyBmaWVsZCBpcyBub3Qgc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBieSB0aGUgc2VydmVyIGFmdGVyIHBhcnNpbmcgdGhlCisgIC8vIHJlcXVlc3QuCisgIG9wdGlvbmFsIGJvb2wgdXNpbmdfbG9nX3NvdXJjZV9pbnQgPSAyMjsKK30KKworLy8gTmV4dCB0YWc6IDEyCittZXNzYWdlIENsaWVudEluZm8geworICAvLyBUaGUgdHlwZSBvZiBjbGllbnQgdGhhdCBtYWRlIHRoaXMgcmVxdWVzdC4KKyAgLy8gTmV4dCBlbnVtIHRhZzogMTEKKyAgZW51bSBDbGllbnRUeXBlIHsKKyAgICAvLyBDbGllbnQgdHlwZSBpcyB1bmtub3duLgorICAgIFVOS05PV04gPSAwOworICAgIC8vIENsaWVudCB0eXBlIGlzIEphdmFzY3JpcHQuCisgICAgSlMgPSAxOworICAgIC8vIERlc2t0b3AgY2xpZW50IHR5cGUuCisgICAgREVTS1RPUCA9IDI7CisgICAgLy8gaU9TIGNsaWVudCB0eXBlLgorICAgIElPUyA9IDM7CisgICAgLy8gaU9TIGNsaWVudCB0eXBlIGZvciBuZXcgaU9TIENsZWFyY3V0IENsaWVudCBMaWJyYXJ5IChDQ1RDbGVhcmN1dExvZ2VyKS4KKyAgICAvLyBTZWUgZ28vY2xlYXJjdXQtaW9zLWRlc2lnbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAvLyBGb3IgZWFzZSBvZiBtaWdyYXRpb24sIHRoZSBjbGllbnRfdHlwZSBmaWVsZCB3aWxsIGJlIHNldCB0byBJT1MgYmVmb3JlCisgICAgLy8gc2VuZGluZyBsb2dzIHRvIFNhd21pbGwuIFRoaXMgc2VwYXJhdGUgZW51bSAoSU9TX1YyKSBpcyBqdXN0IGZvcgorICAgIC8vIENsZWFyY3V0IFNlcnZlciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gbGlicmFyaWVzLgorICAgIElPU19WMiA9IDEwOworICAgIC8vIEFuZHJvaWQgY2xpZW50IHR5cGUuCisgICAgQU5EUk9JRCA9IDQ7CisgICAgLy8gVGhpcyBpcyB0byBiZSB1c2VkIGJ5IHRoaXJkIHBhcnR5IGNvbnN1bWVyIGVsZWN0cm9uaWNzIGRldmljZXMKKyAgICAvLyB3aXRoIEdvb2dsZVBsYXkgYXBwcywgZS5nLjogUm9rdSwgU21hcnQgVFZzIGV0Yy4KKyAgICBQTEFZX0NFID0gNTsKKyAgICAvLyBQeXRob24gY2xpZW50IHR5cGUuCisgICAgUFlUSE9OID0gNjsKKyAgICAvLyBWUiBjbGllbnQgdHlwZS4KKyAgICBWUiA9IDc7CisgICAgLy8gUGFuY2V0dGEgY2xpZW50IHR5cGUuIGdvL3BhbmNldHRhCisgICAgUEFOQ0VUVEEgPSA4OworICAgIC8vIERyaXZlRlMgY2xpZW50IHR5cGUuIGdvL2RyaXZlLWZzCisgICAgRFJJVkVfRlMgPSA5OworICB9CisgIC8vIFRoZSBjbGllbnQgdHlwZSBmb3IgdGhpcyBjbGllbnQuIE9uZSBvZiB0aGUgZW51bSB2YWx1ZXMgZGVmaW5lZCBhYm92ZS4KKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkNsaWVudEluZm8uQ2xpZW50VHlwZSBjbGllbnRfdHlwZSA9IDE7CisgIC8vIElkZW50aWNhbCB0byBHV1NMb2dFbnRyeVByb3RvLlJlbW90ZUhvc3QuCisgIC8vIFNldCBieSB0aGUgQ2xlYXJjdXQgc2VydmVyIHdoZW4gQ2xpZW50SW5mbyBpcyB3cml0dGVuIHRvIEZvb3RwcmludHMuCisgIC8vIERvIG5vdCBzZXQgdGhpcyB2YWx1ZSBpbiBjbGllbnQgY29kZTsgdGhlIHNlcnZlciB3aWxsIGlnbm9yZSBpdC4KKyAgb3B0aW9uYWwgc3RyaW5nIHJlbW90ZV9ob3N0ID0gNjsKKyAgLy8gSWRlbnRpY2FsIHRvIEdXU0xvZ0VudHJ5UHJvdG8uUmVtb3RlSG9zdDYuCisgIC8vIFNldCBieSB0aGUgQ2xlYXJjdXQgc2VydmVyIHdoZW4gQ2xpZW50SW5mbyBpcyB3cml0dGVuIHRvIEZvb3RwcmludHMuCisgIC8vIERvIG5vdCBzZXQgdGhpcyB2YWx1ZSBpbiBjbGllbnQgY29kZTsgdGhlIHNlcnZlciB3aWxsIGlnbm9yZSBpdC4KKyAgb3B0aW9uYWwgc3RyaW5nIHJlbW90ZV9ob3N0NiA9IDc7CisgIC8vIE9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgKl9jbGllbnRfaW5mbyBmaWVsZHMgd2lsbCBleGlzdCBpbiBhbnkgcmVxdWVzdC4KKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkFuZHJvaWRDbGllbnRJbmZvIGFuZHJvaWRfY2xpZW50X2luZm8gPSAyOworfQorCisvLyBGaXJzdCBwYXJ0eSBhcHAgdXNhZ2UgbG9nIGV2ZW50IGV4dGVuc2lvbi4KKy8vIFVzZWQgb25seSB3aGVuIGxvZ19zb3VyY2UgPSBBUFBfVVNBR0VfMVAuCisvLworLy8gVE9ETyhqc3cpOiBJbnZlc3RpZ2F0ZSB3aGV0aGVyIGFueW9uZSBpcyBhY3R1YWxseSB1c2luZyB0aGlzLCBhbmQgaWYgbm90LAorLy8gcmVtb3ZlIGl0LgorLy8KKy8vIE5leHQgdGFnOiA0CittZXNzYWdlIEFwcFVzYWdlMXBMb2dFdmVudCB7CisgIC8vIEEgd2lyZWxlc3MuYW5kcm9pZC5zdGF0cy5wbGF5bG9nLmFjdGl2ZXVzZXJzLkFwcFR5cGUuSWQgdmFsdWUuIFNlZQorICAvLyBnb29nbGUzL3dpcmVsZXNzL2FuZHJvaWQvc3RhdHMvcGxheWxvZy9hY3RpdmV1c2Vycy9hcHB0eXBlLnByb3RvLgorICBvcHRpb25hbCBpbnQzMiBhcHBfdHlwZSA9IDE7CisgIC8vIFBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwIChvbiBBbmRyb2lkKS4KKyAgb3B0aW9uYWwgc3RyaW5nIGFuZHJvaWRfcGFja2FnZV9uYW1lID0gMjsKKyAgLy8gVmVyc2lvbiBvZiB0aGUgYXBwLgorICBvcHRpb25hbCBzdHJpbmcgdmVyc2lvbiA9IDM7Cit9CisKKy8vIEEgQmF0Y2hlZExvZ1JlcXVlc3QgcmVwcmVzZW50cyBhIGJhdGNoZWQgY29sbGVjdGlvbiBvZiBsb2cgcmVxdWVzdHMuCisvLworLy8gTmV4dCB0YWc6IDIKK21lc3NhZ2UgQmF0Y2hlZExvZ1JlcXVlc3QgeworICByZXBlYXRlZCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuTG9nUmVxdWVzdCBsb2dfcmVxdWVzdCA9IDE7Cit9CisKKy8vIEEgTG9nUmVxdWVzdCByZXByZXNlbnRzIGEgYmF0Y2hlZCBjb2xsZWN0aW9uIG9mIGxvZ2dhYmxlIGV2ZW50cywgZWFjaCBldmVudAorLy8gdG8gYmUgcHJvY2Vzc2VkIGFuZCBzZW50IHRvIHplcm8gb3IgbW9yZSBkZXN0aW5hdGlvbnMgKGUuZy4gU2F3bWlsbCBsb2cgdHlwZXMKKy8vIG9yIEZvb3RwcmludHMpIGJ5IHRoZSBDbGVhcmN1dCBzZXJ2ZXIuCisvLworLy8gTmV4dCB0YWc6IDE0CittZXNzYWdlIExvZ1JlcXVlc3QgeworICBlbnVtIExvZ1NvdXJjZSB7CisgICAgb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsKKyAgICBVTktOT1dOID0gLTE7CisgICAgLy8gTG9nIHNvdXJjZSBmb3IgQ2xlYXJjdXQncyBiYXRjaGVkIGxvZyByZXF1ZXN0IGVuZHBvaW50LiBUaGlzIGlzIG5vdCBhCisgICAgLy8gcmVhbCBsb2cgc291cmNlLCBidXQgaXMgYSBwbGFjZWhvbGRlciBmb3Igc29tZSBsZWdhY3kgc3RyZWFteiB0aGF0IGhhdmUKKyAgICAvLyBsb2dfc291cmNlIGZpZWxkcy4KKyAgICBCQVRDSEVEX0xPR19SRVFVRVNUID0gMzU3OworICAgIFNUT1JFID0gMDsKKyAgICAvLyBHb29nbGUgUGxheSBTdG9yZSBBbmRyb2lkIEFwcAorICAgIFdFQl9TVE9SRSA9IDY1OworICAgIC8vIEdvb2dsZSBQbGF5IFdlYiBTdG9yZSAoaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUpCisgICAgV09SS19TVE9SRSA9IDEzMjsKKyAgICAvLyBQbGF5IGZvciBXb3JrIG9uIHRoZSB3ZWIgY2xpZW50IChXb3Jrc2t5KQorICAgIFdPUktfU1RPUkVfQVBQID0gMjYxOworICAgIC8vIFBsYXkgZm9yIFdvcmsgb24gdGhlIEdvb2dsZSBQbGF5IFN0b3JlIEFuZHJvaWQgQXBwCisgICAgRURVX1NUT1JFID0gMTU7CisgICAgLy8gZm9yIGNvbGxlY3Rpbmcgc3RhdHMgb24gUGxheSBmb3IgRWR1Y2F0aW9uCisgICAgTVVTSUMgPSAxOworICAgIEJPT0tTID0gMjsKKyAgICBWSURFTyA9IDM7CisgICAgLy8gQW5kcm9pZCBWaWRlbyAoZ28vYXZpLCBhbmRyb2lkLXZpZGVvLW9uY2FsbEApCisgICAgTU9WSUVTID0gNzQ7CisgICAgTUFHQVpJTkVTID0gNDsKKyAgICBHQU1FUyA9IDU7CisgICAgTEJfQSA9IDY7CisgICAgLy8gZm9yIGNvbGxlY3RpbmcgYXBwIHVzYWdlIHN0YXRzIChMb2NrYm94IHByb2plY3QpCisgICAgQU5EUk9JRF9JREUgPSA3OworICAgIC8vIEFuZHJvaWQgSURFIChkZXByZWNhdGVkLCBzZWUgQU5EUk9JRF9TVFVESU8gYmVsb3cpCisgICAgTEJfUCA9IDg7CisgICAgLy8gZm9yIGNvbGxlY3RpbmcgcGhvbmUgY2FsbCBldmVudHMgYW5kIHN0YXRzIChMb2NrYm94IHByb2plY3QpCisgICAgTEJfUyA9IDk7CisgICAgLy8gZm9yIGNvbGxlY3RpbmcgU01TIGV2ZW50cyBhbmQgc3RhdHMgKExvY2tib3ggcHJvamVjdCkKKyAgICBHTVNfQ09SRSA9IDEwOworICAgIC8vIFVzYWdlIG9mIEdNUyBDb3JlIGl0c2VsZiBhbmQgaXRzIGludGVybmFsIHN0YXRzCisgICAgQVBQX1VTQUdFXzFQID0gMTE7CisgICAgLy8gRmlyc3QtcGFydHkgYXBwIHVzYWdlIHRyYWNraW5nLgorICAgIElDSU5HID0gMTI7CisgICAgLy8gSWNpbmcgc3RhdHMgKEFwcERhdGFTZWFyY2ggZ28vaWNpbmcpCisgICAgSEVSUkVWQUQgPSAxMzsKKyAgICAvLyBmb3IgY29sbGVjdGluZyBOb3ZhIE5ldHdvcmsgcXVhbGl0eSBkYXRhCisgICAgR09PR0xFX1RWID0gMTQ7CisgICAgLy8gR29vZ2xlIFRWLCBub3QgRXVyZWthLgorICAgIEdNU19DT1JFX1BFT1BMRSA9IDE2OworICAgIC8vIEdNUyBjb3JlIHBlb3BsZSAoYWthIG1lbmFnZXJpZSwgemhlbmdmdUAsIGFuZHJvaWQtY29udGFjdHNAKQorICAgIExFID0gMTc7CisgICAgLy8gTG9jYXRpb24gRW5naW5lIHN0YXRpc3RpY3MKKyAgICBHT09HTEVfQU5BTFlUSUNTID0gMTg7CisgICAgLy8gR29vZ2xlIEFuYWx5dGljcyBTREsgaGVhbHRoIG1vbml0b3JpbmcKKyAgICBMQl9EID0gMTk7CisgICAgLy8gZm9yIGNvbGxlY3RpbmcgZGV2aWNlIHN0YXRlIGNoYW5nZXMgKExvY2tib3ggcHJvamVjdCkKKyAgICBBTkRST0lEX0dTQSA9IDIwOworICAgIC8vIEFuZHJvaWQgR1NBIChHb29nbGUgU2VhcmNoIEFwcCkgc3RhdHMKKyAgICBMQl9UID0gMjE7CisgICAgLy8gZm9yIGNvbGxlY3RpbmcgQW5kcm9pZCBSdW5uaW5nVGFza0luZm8gKExvY2tib3ggcHJvamVjdCkKKyAgICBQRVJTT05BTF9MT0dHRVIgPSAyMjsKKyAgICAvLyBQaXhlbFBlcmZlY3QgYWN0aXZpdHkgbG9nZ2VyCisgICAgUEVSU09OQUxfQlJPV1NFUl9MT0dHRVIgPSAzNzsKKyAgICAvLyBQaXhlbFBlcmZlY3QgQ2hyb21lIGV4dGVuc2lvbiBsb2dnZXIKKyAgICBHTVNfQ09SRV9XQUxMRVRfTUVSQ0hBTlRfRVJST1IgPSAyMzsKKyAgICAvLyBHTVMgY29yZSB3YWxsZXQgbWVyY2hhbnQgZXJyb3JzCisgICAgTEJfQyA9IDI0OworICAgIC8vIEFuZHJvaWQgY29udGFjdHMgZ29pbmcgZnJvbSBOb3cgdG8gSGFwcHlIb3VyLmxvZ19ldmVudF9leHRlbnNpb25fdGVzdAorICAgIExCX0lBID0gNTI7CisgICAgLy8gQW5kcm9pZCBpbnN0YWxsZWQgYXBwcyBnb2luZyBmcm9tIE5vdyB0byBIYXBweUhvdXIuCisgICAgTEJfQ0IgPSAyMzc7CisgICAgLy8gQW5kcm9pZCBjb250YWN0cyBmb3IgYmFja3VwL3Jlc3RvcmUgcHVycG9zZS4KKyAgICBMQl9ETSA9IDI2ODsKKyAgICAvLyBBbmRyb2lkIGRldmljZSBtZXRhZGF0YSB1c2VkIGZvciBjb250YWN0cyBiYWNrdXAvcmVzdG9yZSBwdXJwb3NlLgorICAgIEFORFJPSURfQVVUSCA9IDI1OworICAgIC8vIGZvciBjb2xsZWN0aW5nIEdNUyBjb3JlIGFuZHJvaWQgYXV0aCBkYXRhCisgICAgQU5EUk9JRF9DQU1FUkEgPSAyNjsKKyAgICAvLyBBbmRyb2lkIGNhbWVyYSB1c2FnZSBzdGF0aXN0aWNzCisgICAgQ1cgPSAyNzsKKyAgICAvLyBDbG9ja3dvcmsgaW50ZXJhY3Rpb24gbG9ncworICAgIENXX0NPVU5URVJTID0gMjQzOworICAgIC8vIENsb2Nrd29yayBjb3VudGVycworICAgIEdFTCA9IDI4OworICAgIC8vIEdvb2dsZSBleHBlcmllbmNlIGxhdW5jaGVyIGxvZ3MgKGh0dHA6Ly9nby9zaWduYWMpLgorICAgIEROQV9QUk9CRVIgPSAyOTsKKyAgICAvLyBETkEgbG9nZ2VyIChmb3IgaW50ZXJuYWwgcmVzZWFyY2gpLCBnby9kbmEyMDE0LgorICAgIFVEUiA9IDMwOworICAgIC8vIEZvciBjb2xsZWN0aW5nIEFuZHJvaWQgYXBwIHVzYWdlIGRhdGEuCisgICAgR01TX0NPUkVfV0FMTEVUID0gMzE7CisgICAgLy8gR01TIGNvcmUgd2FsbGV0IGFuYWx5dGljcworICAgIFNPQ0lBTCA9IDMyOworICAgIC8vIFRyYWZmaWMgZnJvbSBTb2NpYWwgY2xpZW50czogZ3BsdXMtbG9nLXF1YWxpdHlACisgICAgSU5TVE9SRV9XQUxMRVQgPSAzMzsKKyAgICAvLyBJbnN0b3JlIHBsYXkgcGF5bWVudHMKKyAgICBOT1ZBID0gMzQ7CisgICAgLy8gTm92YSBjbGllbnQgbG9ncy4KKyAgICBMQl9DQSA9IDM1OworICAgIC8vIEFuZHJvaWQgY29udGFjdCBhY2NvdW50IGRhdGEgZ29pbmcgZnJvbSBOb3cgdG8gRm9vdHByaW50cy4KKyAgICBMQVRJTl9JTUUgPSAzNjsKKyAgICAvLyBHb29nbGUgS2V5Ym9hcmQgKGh0dHA6Ly9nby9nb29nbGUta2V5Ym9hcmQpCisgICAgTkVXU19XRUFUSEVSID0gMzg7CisgICAgLy8gTmV3cyAmIFdlYXRoZXIgQW5kcm9pZC9pT1MgYXBwcworICAgIEhBTkdPVVQgPSAzOTsKKyAgICAvLyBEZXByZWNhdGVkIHNvdXJjZSBmb3IgSGFuZ291dExvZ0VudHJ5IChydGMtYW5hbHl0aWNzLWVuZ0ApCisgICAgSEFOR09VVF9MT0dfUkVRVUVTVCA9IDUwOworICAgIC8vIEhhbmdvdXRzIGRhdGEgdXNpbmcgSGFuZ291dExvZ1JlcXVlc3QgKHJ0Yy1hbmFseXRpY3MtZW5nQCkKKyAgICBDT1BSRVNFTkNFID0gNDA7CisgICAgLy8gQ29wcmVzZW5jZSAoaHR0cDovL2dvL3doaXNwZXIpCisgICAgU09DSUFMX0FGRklOSVRZID0gNDE7CisgICAgLy8gU29jaWFsIEFmZmluaXR5IGxvZ3MgKGdvL2Rpc2NvLWxvZ2dpbmctdjIpLgorICAgIFBIT1RPUyA9IDQyOworICAgIC8vIEdvb2dsZSBQaG90b3MgKGdvL3Bob3RvcykuCisgICAgR0NNID0gNDM7CisgICAgLy8gR29vZ2xlIENsb3VkIE1lc3NhZ2luZyBsb2dzIChnby9nY20pLgorICAgIEdPS0FSVCA9IDQ0OworICAgIC8vIEdvS2FydCAoZ28vZ29rYXJ0LCBEcml2ZSBBbmRyb2lkIEFQSSkKKyAgICBGSU5EUiA9IDQ1OworICAgIC8vIEZpbmRyIGFwcCAoZ28vZmluZHIpLgorICAgIEFORFJPSURfTUVTU0FHSU5HID0gNDY7CisgICAgLy8gQW5kcm9pZCBtZXNzZW5nZXIoQnVnbGUpIChnby9idWdsZWRldikuCisgICAgQlVHTEVfQ09VTlRFUlMgPSAzMjM7CisgICAgLy8gQnVnbGUgY291bnRlcnMgKGdvL2J1Z2xlZGV2KQorICAgIFNPQ0lBTF9XRUIgPSA0NzsKKyAgICAvLyBUcmFmZmljIGZyb20gU29jaWFsIGNsaWVudHM6IGdwbHVzLWxvZy1xdWFsaXR5QC4KKyAgICBCQUNLRFJPUCA9IDQ4OworICAgIC8vIEJhY2tkcm9wIGRldmljZSBsb2dzIChnby90di1pbWF4KS4KKyAgICBURUxFTUFUSUNTID0gNDk7CisgICAgLy8gVGVsZW1hdGljcyBhcHAgKGdvL3RlbGVtYXRpY3MpLgorICAgIEdWQ19IQVJWRVNURVIgPSA1MTsKKyAgICAvLyBHVkMgSGFydmVzdGVyIChnby9oYXJ2ZXN0ZXJkZXNpZ25kb2MpCisgICAgQ0FSID0gNTM7CisgICAgLy8gQW5kcm9pZCBBdXRvbW90aXZlIChnby9nZWFyaGVhZCkuCisgICAgUElYRUxfUEVSRkVDVCA9IDU0OworICAgIC8vIFBpeGVsUGVyZmVjdCBhcHAgY2xpZW50IGxvZyAoZ28vcGl4ZWxwZXJmZWN0LWFuYWx5dGljcykKKyAgICBEUklWRSA9IDU1OworICAgIC8vIEdvb2dsZSBEcml2ZSAoZ28vY2FrZW1peCwgbmlja3JlYWRALCBjYWtlbWl4LWRyaXZlQCkKKyAgICBET0NTID0gNTY7CisgICAgLy8gR29vZ2xlIERvY3MgKGdvL2Nha2VtaXgsIGhhbHVrQCwgYnVsYWNoQCwgdHN0cmF1c3NAKQorICAgIFNIRUVUUyA9IDU3OworICAgIC8vIEdvb2dsZSBTaGVldHMgKGdvL2Nha2VtaXgsIHRnbGVhc29uQCwgYnVsYWNoQCwgdHN0cmF1c3NAKQorICAgIFNMSURFUyA9IDU4OworICAgIC8vIEdvb2dsZSBTbGlkZXMgKGdvL2Nha2VtaXgsIHl1Z2Fjb2hsZXJALCBidWxhY2hALCB0c3RyYXVzc0ApCisgICAgSU1FID0gNTk7CisgICAgLy8gR29vZ2xlIEFuZHJvaWQgSU1FIGxvZ3MgKGdvL2dvb3B5KS4KKyAgICBXQVJQID0gNjA7CisgICAgLy8gV2FycCAoZ28vd2FycC1wcm9qZWN0KQorICAgIE5GQ19QUk9HUkFNTUVSID0gNjE7CisgICAgLy8gTmZjUHJvZ3JhbW1lciAoZ28vYWVkdS1wbGF0Zm9ybS1vdmVydmlldykKKyAgICBORVRTVEFUUyA9IDYyOworICAgIC8vIENvbGxlY3Rpb24gb2YgTmV0d29yayBTdGF0aXN0aWNzIChnby9uLXMpLgorICAgIE5FV1NTVEFORCA9IDYzOworICAgIC8vIEdvb2dsZSBQbGF5IE5ld3NzdGFuZC4KKyAgICBLSURTX0NPTU1VTklDQVRPUiA9IDY0OworICAgIC8vIEtpZHMgQ29tbXVuaWNhdG9yIChodHRwOi8vZ290by9raWRzY29tbXVuaWNhdG9yX2RkKQorICAgIFdJRklfQVNTSVNUQU5UID0gNjY7CisgICAgLy8gV2lGaSBBc3Npc3RhbnQgY2xpZW50IGxvZ3MuCisgICAgV0lGSV9BU1NJU1RBTlRfUFJJTUVTID0gMzI2OworICAgIC8vIFdpRmkgQXNzaXN0YW50IGNsaWVudCBsb2dzLCBwcmltZXMuCisgICAgQ0FTVF9TRU5ERVJfU0RLID0gNjc7CisgICAgLy8gQ2FzdCBTZW5kZXIgU0RLIChnby9kb25nbGUpCisgICAgQ1JPTkVUX1NPQ0lBTCA9IDY4OworICAgIC8vIFNvY2lhbCBjcm9uZXQgbWV0cmljcy4KKyAgICBQSEVOT1RZUEUgPSA2OTsKKyAgICAvLyBUaGUgY2xpZW50IHNpZGUgb2YgZXhwZXJpbWVudCBmcmFtZXdvcmsgKGdvL3BoLCBwZWlsaW5nQCwgcGhlbm90eXBlLWVuZ0ApLgorICAgIFBIRU5PVFlQRV9DT1VOVEVSUyA9IDcwOworICAgIC8vIFRoZSBjb3VudGVycyBmb3IgUGhlbm90eXBlIChnby9waCwgcGVpbGluZ0AsIHBoZW5vdHlwZS1lbmdAKS4KKyAgICBDSFJPTUVfSU5GUkEgPSA3MTsKKyAgICAvLyBDaHJvbWUgSW5mcmFzdHJ1Y3R1cmUgZXZlbnRzCisgICAgSlVTVFNQRUFLID0gNzI7CisgICAgLy8gSnVzdFNwZWFrIChnby9qdXN0c3BlYWspCisgICAgUEVSRl9QUk9GSUxFID0gNzM7CisgICAgLy8gQW5kcm9pZCBXaWRlIFByb2ZpbGluZyAoZ28vYW5kcm9pZC13aWRlLXByb2ZpbGluZykKKyAgICBLQVROSVNTID0gNzU7CisgICAgLy8gQW5kcm9pZCBUViBzZWFyY2ggKGdvL2F0di1zZWFyY2gpCisgICAgU09DSUFMX0FQUElOVklURSA9IDc2OworICAgIC8vIEdvb2dsZSBQbHVzIFBsYXRmb3JtIEFwcCBJbnZpdGUgKGdvL2FwcGludml0ZSkKKyAgICBHTU1fQ09VTlRFUlMgPSA3NzsKKyAgICAvLyBHb29nbGUgTWFwcyBNb2JpbGUgKGdvL2dtbSkuCisgICAgQk9ORF9PTkVHT09HTEUgPSA3ODsKKyAgICAvLyBCb25kIE9uZUdvb2dsZUJhciBpbnRlZ3JhdGlvbiAoZ28vYm9uZC1vZ2IpCisgICAgTUFQU19BUEkgPSA3OTsKKyAgICAvLyBBbmRyb2lkIGFuZCBpT1MgTWFwcyBBUEkgKGdvL21hcHZpZXcgJiBnby9tZXJpZGlhbikKKyAgICBDUk9ORVRfQU5EUk9JRF9ZVCA9IDE5NjsKKyAgICAvLyBDcm9uZXQgVU1BIGxvZ3MgZnJvbSBBbmRyb2lkIFlUIChnby9jcm9uZXQtdW1hKQorICAgIENST05FVF9BTkRST0lEX0dTQSA9IDgwOworICAgIC8vIENyb25ldCBVTUEgbG9ncyBmcm9tIEFuZHJvaWQgR1NBIChnby9jcm9uZXQtdW1hKQorICAgIEdPT0dMRV9GSVRfV0VBUkFCTEUgPSA4MTsKKyAgICAvLyBHb29nbGUgRml0IFdlYXJhYmxlIEFwcCAoZ28vaGVhcnQpCisgICAgRklUTkVTU19BTkRST0lEID0gMTY5OworICAgIC8vIEdvb2dsZSBGaXQgQW5kcm9pZCBBcHAgKGdvL2hlYXJ0KQorICAgIEZJVE5FU1NfR01TX0NPUkUgPSAxNzA7CisgICAgLy8gR29vZ2xlIEZpdCBHTVNDb3JlIChnby9oZWFydCkKKyAgICBHT09HTEVfRVhQUkVTUyA9IDgyOworICAgIC8vIEdvb2dsZSBFeHByZXNzIChnby9nc3gpCisgICAgR09PR0xFX0VYUFJFU1NfREVWID0gMjE1OworICAgIC8vIEdvb2dsZSBFeHByZXNzIChnby9nc3gpIEZvciBERVYgbWFsbCBzZXJ2ZXIKKyAgICBHT09HTEVfRVhQUkVTU19DT1VSSUVSX0FORFJPSURfUFJJTUVTID0gMjI4OworICAgIC8vIEdvb2dsZSBFeHByZXNzIChnby9nc3gpIENvdXJpZXIgQXBwIG1ldHJpYyBsb2dnaW5nIChnby9wcmltZXMpCisgICAgR09PR0xFX0VYUFJFU1NfQU5EUk9JRF9QUklNRVMgPSAyMjk7CisgICAgLy8gR29vZ2xlIEV4cHJlc3MgKGdvL2dzeCkgQXBwIG1ldHJpYyBsb2dnaW5nIChnby9wcmltZXMpCisgICAgR09PR0xFX0VYUFJFU1NfSU9TX1BSSU1FUyA9IDM3NDsKKyAgICAvLyBHb29nbGUgRXhwcmVzcyAoZ28vZ3N4KSBBcHAgbWV0cmljIGxvZ2dpbmcgKGdvL3ByaW1lcy1pb3MpCisgICAgR09PR0xFX0VYUFJFU1NfU1RPUkVPTVNfQU5EUk9JRF9QUklNRVMgPSAyNDA7CisgICAgLy8gR29vZ2xlIEV4cHJlc3MgKGdvL2dzeCkgU3RvcmUgT01TIEFwcCBtZXRyaWMgbG9nZ2luZyAoZ28vcHJpbWVzKQorICAgIFNFTlNFID0gODM7CisgICAgLy8gU2Vuc2UgKGdvL3NlbnNlKQorICAgIEFORFJPSURfQkFDS1VQID0gODQ7CisgICAgLy8gQW5kcm9pZCBCYWNrdXAgU2VydmljZS4KKyAgICBWUiA9IDg1OworICAgIC8vIFZpcnR1YWwgUmVhbGl0eSBhbmQgR29vZ2xlIENhcmRib2FyZCAoZ28vdnItdGVhbSkKKyAgICBJTUVfQ09VTlRFUlMgPSA4NjsKKyAgICAvLyBUaGUgY291bnRlcnMgZm9yIEdvb2dsZSBBbmRyb2lkIElNRSAoZ28vZ29vcHkpLgorICAgIFNFVFVQX1dJWkFSRCA9IDg3OworICAgIC8vIFNldHVwIFdpemFyZCAoZ28vc3V3KQorICAgIEVNRVJHRU5DWV9BU1NJU1QgPSA4ODsKKyAgICAvLyBCYXJ0b24gKGdvL2JhcnRvbi1kZXByZWNhdGlvbikKKyAgICBUUk9OID0gODk7CisgICAgLy8gVGhlIGV2ZW50IGxvZ3MgZm9yIEFuZHJvaWQgRnJhbWV3b3JrIChnby90cm9uLCBjd3JlbkAsIGtoaWdha2lALCB0cm9uLWVuZ0ApLgorICAgIFRST05fQ09VTlRFUlMgPSA5MDsKKyAgICAvLyBUaGUgY291bnRlcnMgZm9yIEFuZHJvaWQgRnJhbWV3b3JrIChnby90cm9uLCBjd3JlbkAsIGtoaWdha2lALCB0cm9uLWVuZ0ApLgorICAgIEJBVFRFUllfU1RBVFMgPSA5MTsKKyAgICAvLyBGb3IgY29sbGVjdGluZyBiYXR0ZXJ5IHBlcmZvcm1hbmNlIGRhdGEgZnJvbSBBbmRyb2lkIGNsaWVudHMuIChnby9hbmRyb2lkcGxhdGZvcm1zdGF0cywgYmVsbGFuZEAsIGNsZWFyY3V0LWVuZ0ApCisgICAgRElTS19TVEFUUyA9IDkyOworICAgIC8vIEZvciBjb2xsZWN0aW5nIGRpc2sgdXRpbGl6YXRpb24gc3RhdHMgZnJvbSBBbmRyb2lkIGNsaWVudHMuIChnby9hbmRyb2lkcGxhdGZvcm1zdGF0cywgYmVsbGFuZEAsIGNsZWFyY3V0LWVuZ0ApCisgICAgR1JBUEhJQ1NfU1RBVFMgPSAxMDc7CisgICAgLy8gRm9yIGNvbGxlY3RpbmcgcmVuZGVyaW5nIHBlcmZvcm1hbmNlIHN0YXRzIGZyb20gQW5kcm9pZCBjbGllbnRzLiAoZ28vYW5kcm9pZHBsYXRmb3Jtc3RhdHMsIGJlbGxhbmRALCBjbGVhcmN1dC1lbmdAKQorICAgIFBST0NfU1RBVFMgPSA5MzsKKyAgICAvLyBGb3IgY29sbGVjdGluZyBtZW1vcnkgdXRpbGl6YXRpb24gc3RhdHMgZnJvbSBBbmRyb2lkIGNsaWVudHMuIChnby9hbmRyb2lkcGxhdGZvcm1zdGF0cywgYmVsbGFuZEAsIGNsZWFyY3V0LWVuZ0ApCisgICAgRFJPUF9CT1ggPSAxMzE7CisgICAgLy8gRm9yIGNvbGxlY3RpbmcgRHJvcEJveCBsb2dzIGZyb20gQW5kcm9pZCBjbGllbnRzLgorICAgIEZJTkdFUlBSSU5UX1NUQVRTID0gMTgxOworICAgIC8vIEZvciBjb2xsZWN0aW5nIGZpbmdlcnByaW50IHN0YXRzIGZyb20gQW5kcm9pZCBjbGllbnRzLiAoZ28vYW5kcm9pZC1maW5nZXJwcmludHN0YXRzKQorICAgIE5PVElGSUNBVElPTl9TVEFUUyA9IDE4MjsKKyAgICAvLyBGb3IgY29sbGVjdGluZyBub3RpZmljYXRpb24gc3RhdHMgZnJvbSBBbmRyb2lkIGNsaWVudHMuIChnby9hbmRyb2lkLW5vdGlmaWNhdGlvbnN0YXRzKQorICAgIFNFVFRJTkdTX1NUQVRTID0gMzkwOworICAgIC8vIEZvciBjb2xsZWN0aW5nIHNldHRpbmdzIHN0YXRzIGZyb20gQW5kcm9pZCBjbGllbnRzLiAoZ28vYW5kcm9pZC1zZXR0aW5nc3N0YXRzKQorICAgIFRBUF9BTkRfUEFZX0dDT1JFID0gOTQ7CisgICAgLy8gVGFwIGFuZCBQYXkgY2xpZW50IHNlcnZpY2UgbGF5ZXIgKGdvL3RwMi1lbmcpCisgICAgQTExWUxPR0dFUiA9IDk1OworICAgIC8vIEFjY2Vzc2liaWxpdHkgU2V0dGluZ3MgTG9nZ2VyIChnby9hMTF5bG9nZ2VyKQorICAgIEdDTV9DT1VOVEVSUyA9IDk2OworICAgIC8vIEdvb2dsZSBDbG91ZCBNZXNzYWdpbmcgY291bnRlcnMgKGdvL2djbSkuCisgICAgUExBQ0VTX05PX0dMU19DT05TRU5UID0gOTc7CisgICAgLy8gTW9iaWxlIFBsYWNlcyBBUEkgbG9ncyB3aXRob3V0IEdMUyBjb25zZW50IChnby9pb3MtcGxhY2VzLWFwaSkuCisgICAgVEFDSFlPTl9MT0dfUkVRVUVTVCA9IDk4OworICAgIC8vIFdlYlJUQyBUYWNoeW9uIChnby90YWNoeW9uKQorICAgIFRBQ0hZT05fQ09VTlRFUlMgPSA5OTsKKyAgICAvLyBXZWJSVEMgVGFjaHlvbiAoZ28vdGFjaHlvbikKKyAgICBEVU9fQ1JPTkVUID0gMzk2OworICAgIC8vIER1byAoZ28vdGFjaHlvbikKKyAgICBWSVNJT04gPSAxMDA7CisgICAgLy8gVmlzaW9uIChnby9tb2JpbGUtdmlzaW9uKQorICAgIFNPQ0lBTF9VU0VSX0xPQ0FUSU9OID0gMTAxOworICAgIC8vIExvY2F0aW9uIFNoYXJpbmcgKGdvL2xvY2F0aW9uLXNoYXJpbmcpCisgICAgTEFVTkNIUEFEX1RPWVMgPSAxMDI7CisgICAgLy8gTGF1bmNocGFkIFRveXMgKGdvL2xhdW5jaHBhZHRveXMpCisgICAgTUVUQUxPR19DT1VOVEVSUyA9IDEwMzsKKyAgICAvLyBDb3VudGVycyBmb3IgbWV0YWxvZyAoZ28vY2xlYXJjdXQtbWV0YWxvZywgaWFtYXdvbmdALCBjbGVhcmN1dC1lbmdAKQorICAgIE1PQklMRVNES19DTElFTlQgPSAxMDQ7CisgICAgLy8gZ28vZ3JlZW5ob3VzZQorICAgIEFORFJPSURfVkVSSUZZX0FQUFMgPSAxMDU7CisgICAgLy8gZ28vc2FmZXR5LW5ldAorICAgIEFEU0hJRUxEID0gMTA2OworICAgIC8vIGdvL2Fkc2hpZWxkCisgICAgU0hFUkxPRyA9IDEwODsKKyAgICAvLyBTaGVybG9nIGRhdGEgKGdvL3NoZXJsb2cpCisgICAgTEVfVUxSX0NPVU5URVJTID0gMTA5OworICAgIC8vIENvdW50ZXJzIGZvciBVTFIgKGdvL2djb3JlLXVscikuIExvY2F0aW9uIGN1c3RvbSBldmVudHMgdXNlIExFLgorICAgIEdNTV9VRTMgPSAxMTA7CisgICAgLy8gTG9ncyBmb3IgR01NIGFuYWx5dGljcyBhbmQgc2Vzc2lvbnMgKGdvL2djYS1hbmFseXRpY3MpCisgICAgQ0FMRU5EQVIgPSAxMTE7CisgICAgLy8gR29vZ2xlIEFuZHJvaWQgQ2FsZW5kYXIKKyAgICBFTkRFUiA9IDExMjsKKyAgICAvLyBMb2dzIGZvciBFbmRlciAoZ28vZW5kZXIpCisgICAgRkFNSUxZX0NPTVBBU1MgPSAxMTM7CisgICAgLy8gZ28vZmFtaWx5Y29tcGFzcworICAgIFRSQU5TT00gPSAxMTQ7CisgICAgLy8gVHJhbnNvbSBjbGllbnQtc2lkZSBtZXRyaWNzIChnby90cmFuc29tKQorICAgIFRSQU5TT01fQ09VTlRFUlMgPSAxMTU7CisgICAgLy8gQ291bnRlcnMgZm9yIHRyYW5zb20gbWV0cmljcworICAgIExCX0FTID0gMTE2OworICAgIC8vIEFwcCB1c2FnZSBjb2xsZWN0ZWQgYnkgdGhlIG5ldyBVc2FnZVN0YXRzIEFQSSAoTG9ja2JveCBwcm9qZWN0KS4KKyAgICBMQl9DRkcgPSAxMTc7CisgICAgLy8gRGV2aWNlIGNvbmZpZyBjb2xsZWN0ZWQgYnkgdGhlIG5ldyBVc2FnZVN0YXRzIEFQSSAoTG9ja2JveCBwcm9qZWN0KS4KKyAgICBJT1NfR1NBID0gMTE4OworICAgIC8vIGlPUyBHU0EgKEdvb2dsZSBTZWFyY2ggQXBwKSBzdGF0cworICAgIFRBUF9BTkRfUEFZX0FQUCA9IDExOTsKKyAgICAvLyBUYXAgYW5kIFBheSBhbmRyb2lkIGFwcCwgYWthIEFuZHJvaWQgcGF5IGFwcCAoZ28vdHAyKQorICAgIFRBUF9BTkRfUEFZX0FQUF9DT1VOVEVSUyA9IDI2NTsKKyAgICAvLyBUYXAgYW5kIFBheSBhbmRyb2lkIGFwcCBjb3VudGVycworICAgIEZMWURST0lEID0gMTIwOworICAgIC8vIExvZ3MgZm9yIEZseWRyb2lkIChnby9mbHlkcm9pZCkuCisgICAgQ1BBTkVMX0FQUCA9IDEyMTsKKyAgICAvLyBDUGFuZWwgbGF0ZW5jeSBvbiBtb2JpbGUuCisgICAgQU5EUk9JRF9TTkVUX0dDT1JFID0gMTIyOworICAgIC8vIGdvL3NhZmV0eS1uZXQKKyAgICBBTkRST0lEX1NORVRfSURMRSA9IDEyMzsKKyAgICAvLyBnby9zYWZldHktbmV0CisgICAgQU5EUk9JRF9TTkVUX0pBUiA9IDEyNDsKKyAgICAvLyBnby9zYWZldHktbmV0CisgICAgQ09OVEVYVF9NQU5BR0VSID0gMTI1OworICAgIC8vIExvZ3MgZm9yIENvbnRleHQgTWFuYWdlciAoZ28vY29udGV4dC1tYW5hZ2VyKQorICAgIENMQVNTUk9PTSA9IDEyNjsKKyAgICAvLyBBcHAgdXNhZ2Ugb2YgdGhlIGdvL2NsYXNzcm9vbSBhcHAuCisgICAgVEFJTE9STUFERSA9IDEyNzsKKyAgICAvLyBMb2dzIGZvciBUYWlsb3JtYWRlIGFwcCAoZ28vYTEtdG0pCisgICAgS0VFUCA9IDEyODsKKyAgICAvLyBMb2dzIGZvciBLZWVwIChnby9rZWVwKS4KKyAgICBHTU1fQlJJSU1fQ09VTlRFUlMgPSAxMjk7CisgICAgLy8gR01NIEJSSUlNIGNvdW50ZXJzIChnby9nbW0tYnJpaW0pCisgICAgQ0hST01FQ0FTVF9BUFBfTE9HID0gMTMwOworICAgIC8vIExvZ3MgZm9yIGNocm9tZWNhc3QgYXBwIChnby9jaHJvbWVjYXN0YXBwbG9ncykKKyAgICBBRFdPUkRTX01PQklMRSA9IDEzMzsKKyAgICAvLyBMb2dzIGZvciBBZFdvcmRzIG1vYmlsZSBhcHAgKGdvL2F3bSkKKyAgICBMRUFOQkFDS19FVkVOVCA9IDEzNDsKKyAgICAvLyBMb2dzIGZvciBBbmRyb2lkIFRWIExlYW5iYWNrIExhdW5jaGVyIChnby9hbmRyb2lkLXR2KQorICAgIEFORFJPSURfR01BSUwgPSAxMzU7CisgICAgLy8gTG9ncyBmb3IgR21haWwgKGdvL2FuZHJvaWQtZ21haWwtY2xlYXJjdXQsIHNoYWhya0AsIGFuZHJvaWQtbWFpbC10ZWFtQCkKKyAgICBTQU1QTEVfU0hNID0gMTM2OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGFuZCBtZW1vcnkgbWV0cmljIHNhbXBsZSBhcHAgKGdvL3ByaW1lcykKKyAgICBHUExVU19BTkRST0lEX1BSSU1FUyA9IDE0MDsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgR3BsdXMgKGdvL3ByaW1lcykKKyAgICBHUExVU19BTkRST0lEX1NZU1RFTV9IRUFMVEggPSAxNDA7CisgICAgR01BSUxfQU5EUk9JRF9QUklNRVMgPSAxNTA7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEdNYWlsIChnby9wcmltZXMpCisgICAgR01BSUxfQU5EUk9JRF9TWVNURU1fSEVBTFRIID0gMTUwOworICAgIENBTEVOREFSX0FORFJPSURfUFJJTUVTID0gMTUxOworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBDYWxlbmRhciBBbmRyb2lkIChnby9wcmltZXMpCisgICAgQ0FMRU5EQVJfQU5EUk9JRF9TWVNURU1fSEVBTFRIID0gMTUxOworICAgIERPQ1NfQU5EUk9JRF9QUklNRVMgPSAxNTI7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIERvY3MgKGdvL3ByaW1lcykKKyAgICBET0NTX0FORFJPSURfU1lTVEVNX0hFQUxUSCA9IDE1MjsKKyAgICBZVF9NQUlOX0FQUF9BTkRST0lEX1BSSU1FUyA9IDE1NDsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgdGhlIFlvdVR1YmUgbWFpbiBhcHAgKGdvL3ByaW1lcykKKyAgICBZVF9LSURTX0FORFJPSURfUFJJTUVTID0gMTU1OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciB0aGUgWW91VHViZSBraWRzIGFwcCAoZ28vcHJpbWVzKQorICAgIFlUX0dBTUlOR19BTkRST0lEX1BSSU1FUyA9IDE1NjsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgdGhlIFlvdVR1YmUgZ2FtaW5nIGFwcCAoZ28vcHJpbWVzKQorICAgIFlUX01VU0lDX0FORFJPSURfUFJJTUVTID0gMTU3OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciB0aGUgWW91VHViZSBtdXNpYyBhcHAgKGdvL3ByaW1lcykKKyAgICBZVF9MSVRFX0FORFJPSURfUFJJTUVTID0gMTU4OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciB0aGUgWW91VHViZSBsaXRlIGFwcCAoZ28vcHJpbWVzKQorICAgIFlUX0NSRUFUT1JfQU5EUk9JRF9QUklNRVMgPSAxNzE7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIHRoZSBZb3VUdWJlIENyZWF0b3IgU3R1ZGlvIGFwcCAoZ28vcHJpbWVzKQorICAgIEpBTV9BTkRST0lEX1BSSU1FUyA9IDE1OTsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgSmFtIChnby9qYW0sIGdvL3ByaW1lcykKKyAgICBKQU1fS0lPU0tfQU5EUk9JRF9QUklNRVMgPSAxNjA7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEphbSBLaW9zayAoZ28vamFtLCBnby9wcmltZXMpCisgICAgUEhPVE9TX0FORFJPSURfUFJJTUVTID0gMTY1OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBQaG90b3MgKGdvL3ByaW1lcykKKyAgICBEUklWRV9BTkRST0lEX1BSSU1FUyA9IDE2NjsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgRHJpdmUgKGdvL3ByaW1lcykKKyAgICBTSEVFVFNfQU5EUk9JRF9QUklNRVMgPSAxNjc7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFNoZWV0cyAoZ28vcHJpbWVzKQorICAgIFNMSURFU19BTkRST0lEX1BSSU1FUyA9IDE2ODsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgU2xpZGVzIChnby9wcmltZXMpCisgICAgU05BUFNFRURfQU5EUk9JRF9QUklNRVMgPSAxNzg7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFNuYXBzZWVkIChnby9wcmltZXMsIGdvL3NuYXBzZWVkKS4KKyAgICBIQU5HT1VUU19BTkRST0lEX1BSSU1FUyA9IDE3OTsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgU2hlbSAoZ28vcHJpbWVzLCBnby9ydGMtc2hlbSkuCisgICAgSU5CT1hfQU5EUk9JRF9QUklNRVMgPSAxODA7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEluYm94IChnby9wcmltZXMsIGdvL2J0LXNwZWVkKQorICAgIElOQk9YX0lPU19QUklNRVMgPSAyNjI7CisgICAgLy8gTG9ncyBmb3IgaW9zIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBJbmJveCAoZ28vcHJpbWVzLWlvcywgZ28vYnQtc3BlZWQpCisgICAgU0RQX0lPU19QUklNRVMgPSAyODc7CisgICAgLy8gTG9ncyBmb3IgaW9zIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBzZHAgKGdvL3ByaW1lcy1pb3MsIGdvL2J0LXNwZWVkKQorICAgIEdNU0NPUkVfQU5EUk9JRF9QUklNRVMgPSAxOTM7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEdtc0NvcmUgKGdvL3ByaW1lcykKKyAgICBQTEFZX01VU0lDX0FORFJPSURfV0VBUl9QUklNRVMgPSAyMDA7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFBsYXkgTXVzaWMgZm9yIEFuZHJvaWQgV2VhciAobXVzaWMtYW5kcm9pZC13ZWFyQCwgZ28vd2Vhci1wbGF5LW11c2ljLCBnby9wcmltZXMpCisgICAgUExBWV9NVVNJQ19BTkRST0lEX1dFQVJfU1RBTkRBTE9ORV9QUklNRVMgPSA0MTk7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFBsYXkgTXVzaWMgZm9yIEFuZHJvaWQgV2VhciBTdGFuZGFsb25lIChtdXNpYy1hbmRyb2lkLXdlYXJALCBnby9tdXNpYy13ZWFyLXN0YW5kYWxvbmUtcHJkLCBnby9wcmltZXMpCisgICAgR0VBUkhFQURfQU5EUk9JRF9QUklNRVMgPSAyMDE7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIHRoZSBBbmRyb2lkIEF1dG8gKEdlYXJIZWFkKSBhcHAgKGdvL3ByaW1lcywgZ28vZ2VhcmhlYWQpCisgICAgSU5TVE9SRV9DT05TVU1FUl9QUklNRVMgPSAyMDc7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEhhbmRzIEZyZWUgKGdvL3ByaW1lcywgZ28vaW5zdG9yZS13YWxsZXQpCisgICAgU0FNUExFX0lPU19QUklNRVMgPSAyMDI7CisgICAgLy8gTG9ncyBmb3IgaW9zIHN5c3RlbSBoZWFsdGggbWV0cmljIGFuZCBtZW1vcnkgbWV0cmljIHNhbXBsZSBhcHAgKGdvL3ByaW1lcy1pb3MpCisgICAgQ1BBTkVMX0FORFJPSURfUFJJTUVTID0gMjEzOworICAgIC8vIExvZ3MgZm9yIGFuZHJvaWQgc3lzdGVtIGhlYWx0aCBtZXRyaWMgKGdvL2NwYW5lbC1tb2JpbGUpCisgICAgSFVERExFX0FORFJPSURfUFJJTUVTID0gMjE0OworICAgIC8vIFByaW1lcyBmb3IgSHVkZGxlIChnby9odWRkbGUpCisgICAgQVdYX0FORFJPSURfUFJJTUVTID0gMjIyOworICAgIC8vIFByaW1lcyBmb3IgR29vZ2xlIEFkV29yZHMgRXhwcmVzcyBhbmRyb2lkIGFwcCAoZ28vcHJpbWVzLCBnby9hd3gtYW5kcm9pZCkKKyAgICBHSFNfQU5EUk9JRF9QUklNRVMgPSAyMjM7CisgICAgLy8gUHJpbWVzIGZvciBHb29nbGUgSG9tZSBTZXJ2aWNlcyBhbmRyb2lkIGFwcCAoZ28vcHJpbWVzLCBnby9zYWItYXd4LWFuZHJvaWQpCisgICAgQURXT1JEU19NT0JJTEVfQU5EUk9JRF9QUklNRVMgPSAyMjQ7CisgICAgLy8gQWRXb3JkcyBzeXN0ZW0gaGVhbHRoIChnby9hd20sIGdvL3ByaW1lcykKKyAgICBUQVBfQU5EX1BBWV9BTkRST0lEX1BSSU1FUyA9IDIyNzsKKyAgICAvLyBQcmltZXMgZm9yIFRhcCBhbmQgUGF5IGFuZHJvaWQgYXBwLCBha2EgQW5kcm9pZCBwYXkgYXBwIChnby90cDIpCisgICAgV0FMTEVUX0FQUF9BTkRST0lEX1BSSU1FUyA9IDIzMjsKKyAgICAvLyBQcmltZXMgZm9yIFdhbGxldCBhbmRyb2lkIGFwcCAoZ28vZ21vbmV5KQorICAgIFdBTExFVF9BUFBfSU9TX1BSSU1FUyA9IDIzMzsKKyAgICAvLyBQcmltZXMgZm9yIFdhbGxldCBpT1MgYXBwIChnby9nbW9uZXkpCisgICAgQU5BTFlUSUNTX0FORFJPSURfUFJJTUVTID0gMjM1OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBBbmFseXRpY3MgQW5kcm9pZCBhcHAgKGdvL3ByaW1lcykKKyAgICBTUEFDRVNfQU5EUk9JRF9QUklNRVMgPSAyMzY7CisgICAgLy8gTG9ncyBmb3IgdGhlIFNwYWNlcyBBbmRyb2lkIEFwcCAoZ28vc3BhY2VzKQorICAgIFNQQUNFU19JT1NfUFJJTUVTID0gMjc2OworICAgIC8vIExvZ3MgZm9yIHRoZSBTcGFjZXMgaU9TIEFwcCAoZ28vc3BhY2VzKQorICAgIFNPQ0lFVFlfQU5EUk9JRF9QUklNRVMgPSAyMzg7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFNvY2lldHkgKGdvL3ByaW1lcywgZ28vc29jaWV0eSkKKyAgICBHTU1fQlJJSU1fUFJJTUVTID0gMjM5OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBHTU0gQlJJSU0gKGdvL2dtbS1icmlpbSkKKyAgICBDV19QUklNRVMgPSAyNDI7CisgICAgLy8gQ2xvY2t3b3JrIGdvL3ByaW1lcyBsb2dzCisgICAgRkFNSUxZTElOS19BTkRST0lEX1BSSU1FUyA9IDI0NDsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgRmFtaWx5TGluayAoZ28vcHJpbWVzKQorICAgIEZBTUlMWUxJTktfSU9TX1BSSU1FUyA9IDI5MTsKKyAgICAvLyBMb2dzIGZvciBpb3Mgc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEZhbWlseUxpbmsgKGdvL3ByaW1lcy1pb3MsIGdvL2ZhbWlseWxpbmstaW9zLWFwcCkKKyAgICBXSF9QUklNRVMgPSAyNDg7CisgICAgLy8gUHJpbWVzIGZvciBXZXN0aW5naG91c2UgKGdvL3dlc3Rpbmdob3VzZSwgZ28vcHJpbWVzKQorICAgIE5PVkFfQU5EUk9JRF9QUklNRVMgPSAyNDk7CisgICAgLy8gTm92YSBjbGllbnQgYXBwIHN5c3RlbSBoZWFsdGggbWV0cmljcyAoZ28vcHJpbWVzKQorICAgIFBIT1RPU19EUkFQRVJfQU5EUk9JRF9QUklNRVMgPSAyNTM7CisgICAgLy8gTG9ncyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIFBob3RvcyBEcmFwZXIgKGdvL3ByaW1lcywgZ28vcGhvdG9zLWRyYXBlcikKKyAgICBHTU1fUFJJTUVTID0gMjU0OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBhR01NIChnby9nbW0pCisgICAgVFJBTlNMQVRFX0FORFJPSURfUFJJTUVTID0gMjU1OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBUcmFuc2xhdGUgb24gQW5kcm9pZCAoZ28vcHJpbWVzKQorICAgIFRSQU5TTEFURV9JT1NfUFJJTUVTID0gMjU2OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBUcmFuc2xhdGUgb24gaU9TIChnby9wcmltZXMpCisgICAgRlJFSUdIVEVSX0FORFJPSURfUFJJTUVTID0gMjU5OworICAgIC8vIExvZyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIEZyZWlnaHRlciAoZ28vZnJlaWdodGVyKQorICAgIEZMWURST0lEX0FORFJPSURfUFJJTUVTID0gMjU5OworICAgIENPTlNVTUVSSVFfUFJJTUVTID0gMjYwOworICAgIC8vIExvZyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWMgZm9yIENvbnN1bWVyIElRIChnby9wcmltZXMpCisgICAgR01CX0FORFJPSURfUFJJTUVTID0gMjYzOworICAgIC8vIFByaW1lcyBmb3IgR29vZ2xlIE15IEJ1c2luZXNzIGFuZHJvaWQgYXBwIChnby9nbWItYW5kcm9pZCwgZ28vcHJpbWVzKS4KKyAgICBDTE9VRERQQ19QUklNRVMgPSAzMDQ7CisgICAgLy8gUHJpbWVzIGZvciBDbG91ZERwYyAoZ28vY2xvdWRkcGMpCisgICAgQ0xPVUREUENfQVJDX1BSSU1FUyA9IDMwNTsKKyAgICAvLyBQcmltZXMgZm9yIENsb3VkRHBjIGZvciBBUkMgKGdvL2Nsb3VkZHBjKQorICAgIElDT1JFID0gMTM3OworICAgIC8vIGlPUyBsb2dnaW5nIChnby9pb3MtbG9nZ2luZykKKyAgICBQQU5DRVRUQV9NT0JJTEVfSE9TVCA9IDEzODsKKyAgICAvLyBMb2dzIGZvciBQYW5jZXR0YSBtb2JpbGUgaG9zdHMgKGdvL3BhbmNldHRhKQorICAgIFBBTkNFVFRBX01PQklMRV9IT1NUX0NPVU5URVJTID0gMTM5OworICAgIC8vIENvdW50ZXJzIGZvciBQYW5jZXR0YSBtb2JpbGUgaG9zdHMgKGdvL3BhbmNldHRhKQorICAgIENST1NTREVWSUNFTk9USUZJQ0FUSU9OID0gMTQxOworICAgIC8vIExvZ3MgZm9yIGNyb3NzIGRldmljZSBub3RpZmljYXRpb24gc2VydmljZSAoZ28vaG90cG9ja2V0KQorICAgIENST1NTREVWSUNFTk9USUZJQ0FUSU9OX0RFViA9IDE0MjsKKyAgICAvLyBEZXYgbG9ncyBmb3IgY3Jvc3MgZGV2aWNlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlIChnby9ob3Rwb2NrZXQpCisgICAgTUFQU19BUElfQ09VTlRFUlMgPSAxNDM7CisgICAgLy8gQW5kcm9pZCBhbmQgaU9TIE1hcHMgQVBJIChnby9tYXB2aWV3ICYgZ28vbWVyaWRpYW4pCisgICAgR1BVID0gMTQ0OworICAgIC8vTG9ncyBmb3IgR2VvIFBob3RvIFVwbG9hZGVyIChnby9ncHUtc2l0ZSkKKyAgICBPTl9USEVfR08gPSAxNDU7CisgICAgLy8gTG9ncyBmb3IgT25UaGVHbyAoZ28vb250aGVnbykKKyAgICBPTl9USEVfR09fQ09VTlRFUlMgPSAxNDY7CisgICAgLy8gQ291bnRlcnMgZm9yIE9uVGhlR28gKGdvL29udGhlZ28pCisgICAgT05fVEhFX0dPX0FORFJPSURfUFJJTUVTID0gMzMwOworICAgIC8vIE9uVGhlR28gKGdvL29udGhlZ28pIEFuZHJvaWQgYXBwIG1ldHJpYyBsb2dnaW5nIChnby9wcmltZXMpCisgICAgT05fVEhFX0dPX0lPU19QUklNRVMgPSAzNjg7CisgICAgLy8gT25UaGVHbyAoZ28vb250aGVnbykgaU9TIGFwcCBtZXRyaWMgbG9nZ2luZyAoZ28vcHJpbWVzKQorICAgIEdNU19DT1JFX1BFT1BMRV9BVVRPQ09NUExFVEUgPSAxNDc7CisgICAgLy8gTG9ncyBmb3IgR2NvcmUgUGVvcGxlIEF1dG9jb21wbGV0ZSAoZ28veWVudGEpCisgICAgRkxZRFJPSURfQ09VTlRFUlMgPSAxNDg7CisgICAgLy8gTG9ncyBmb3IgRmx5ZHJvaWQgKGdvL2ZseWRyb2lkKS4KKyAgICBGSVJFQkFMTCA9IDE0OTsKKyAgICAvLyBMb2dzIGZvciBGaXJlYmFsbCAoZ28vZmlyZWJhbGxkZXYpCisgICAgRklSRUJBTExfQ09VTlRFUlMgPSAyNTc7CisgICAgLy8gRmlyZWJhbGwgY291bnRlcnMgKGdvL2ZpcmViYWxsZGV2KQorICAgIENST05FVF9GSVJFQkFMTCA9IDMwMzsKKyAgICAvLyBGaXJlYmFsbCBjcm9uZXQgKGdvL2ZpcmViYWxsZGV2KQorICAgIEZJUkVCQUxMX1BSSU1FUyA9IDI2NjsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIGZvciBGaXJlYmFsbCAoZ28vZmlyZWJhbGwtc3lzdGVtaGVhbHRoLXBsYW4pCisgICAgRklSRUJBTExfSU9TX1BSSU1FUyA9IDMxMzsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIGZvciBGaXJlYmFsbCBpT1MgKGdvL2ZpcmViYWxsLXN5c3RlbWhlYWx0aC1wbGFuKQorICAgIEdPT0dMRV9IQU5EV1JJVElOR19JTlBVVF9BTkRST0lEX1BSSU1FUyA9IDMxNDsKKyAgICAvLyBQcmltZXMgZm9yIEdvb2dsZSBIYW5kd3JpdGluZyBJbnB1dCAoZ28vaHdyaW1lKQorICAgIFBZUk9DTEFTTSA9IDE1MzsKKyAgICAvLyBMb2dzIGZvciBQeXJvY2xhc20gKGdvL3B5cm9jbGFzbSkKKyAgICBBTkRST0lEX0dTQV9DT1VOVEVSUyA9IDE2MTsKKyAgICAvLyBMb2dzIGZvciBBR1NBIGNvdW50ZXJzLgorICAgIEpBTV9JTVBSRVNTSU9OUyA9IDE2MjsKKyAgICAvLyBJbXByZXNzaW9ucyBsb2dzIGZvciBKYW0gKGdvL2phbSkuCisgICAgSkFNX0tJT1NLX0lNUFJFU1NJT05TID0gMTYzOworICAgIC8vIEltcHJlc3Npb25zIGxvZ3MgZm9yIEphbSBLaW9zayAoZ28vamFtKS4KKyAgICBQQVlNRU5UU19PQ1IgPSAxNjQ7CisgICAgLy8gTG9ncyBmb3IgcGF5bWVudHMgb2NyIChnby9jYy1vY3ItbWV0cmljcykuCisgICAgVU5JQ09STl9GQU1JTFlfTUFOQUdFTUVOVCA9IDE3MjsKKyAgICAvLyBMb2dzIGZvciBGYW1pbHkgbWFuYWdlbWVudCAoYW5kIG9uYm9hcmRpbmcpIGdvL2ZhbWlseW1hbmFnZW1lbnQKKyAgICBBVURJVE9SID0gMTczOworICAgIC8vIExvZ3MgZm9yIEFjY2Vzc3NpYmlsaXR5IEF1ZGl0b3IgKGdvL2ExMXktY2hlY2tlcikKKyAgICBOUUxPT0tVUCA9IDE3NDsKKyAgICAvLyBMb2dzIGZvciBOUUxvb2t1cCAoZ28vbnFsb29rdXAsIGNvbnRhY3QgaGVycmV2YWRAZ29vZ2xlLmNvbSkKKyAgICBBTkRST0lEX0dTQV9ISUdIX1BSSU9SSVRZX0VWRU5UUyA9IDE3NTsKKyAgICAvLyBMb2dzIGZvciBoaWdoIHByaW9yaXR5IGV2ZW50cyBpbiBBR1NBIChnby9jbGljay10cmFja2luZy1hZ3NhKS4KKyAgICBBTkRST0lEX0RJQUxFUiA9IDE3NjsKKyAgICAvLyBMb2dzIGZvciBBbmRyb2lkIERpYWxlciAoZ28vYW5kcm9pZC1kaWFsZXIpCisgICAgQ0xFQVJDVVRfREVNTyA9IDE3NzsKKyAgICAvLyBMb2dzIGZvciBDbGVhcmN1dCdzIGRlbW8gYXBwbGljYXRpb24KKyAgICBBUFBNQU5BR0VSID0gMTgzOworICAgIC8vIExvZ3MgZm9yIEZpcmViYXNlIEFwcCBNYW5hZ2VyIChnby9hcHBtYW5hZ2VyKQorICAgIFNNQVJUTE9DS19DT1VOVEVSUyA9IDE4NDsKKyAgICAvLyBDb3VudGVycyBmb3IgU21hcnQgTG9jayAoZ28vc21hcnRsb2NrKQorICAgIEVYUEVESVRJT05TX0dVSURFID0gMTg1OworICAgIC8vIEd1aWRlLWFnZ3JlZ2F0ZWQgbG9ncyBmb3IgZ28vZXhwZWRpdGlvbnMgLgorICAgIEZVU0UgPSAxODY7CisgICAgLy8gTG9ncyBmb3IgRnVzZSAoZ28vZnVzZSkuCisgICAgUElYRUxfUEVSRkVDVF9DTElFTlRfU1RBVEVfTE9HR0VSID0gMTg3OworICAgIC8vIExvZ3MgZm9yIFBpeGVsUGVyZmVjdCBjbGllbnQgYXBwIChnby9weHAtY2xpZW50KQorICAgIFBMQVRGT1JNX1NUQVRTX0NPVU5URVJTID0gMTg4OworICAgIC8vIENvdW50ZXJzIGZvciBwbGF0Zm9ybSBzdGF0cy4oZ28vYW5kcm9pZHBsYXRmb3Jtc3RhdHMsIGNsZWFyY3V0LWVuZ0ApCisgICAgRFJJVkVfVklFV0VSID0gMTg5OworICAgIC8vIEdvb2dsZSBEcml2ZSBWaWV3ZXIgQW5kcm9pZCBhbmQgaU9TIGFwcHMgKGdvL3BpY29wcm9qZWN0b3IpCisgICAgUERGX1ZJRVdFUiA9IDE5MDsKKyAgICAvLyBHb29nbGUgUERGIFZpZXdlciBBbmRyb2lkIGFwcCAoZ28vcGljb3Byb2plY3RvcikKKyAgICBCSUdUT1AgPSAxOTE7CisgICAgLy8gTG9ncyBmb3IgQmlndG9wIChleHRlcm5hbGx5IGtub3duIGFzIEluYm94LCBnby9iaWd0b3ApLgorICAgIFZPSUNFID0gMTkyOworICAgIC8vIExvZ3MgZm9yIEdvb2dsZSBWb2ljZSAoZ28vZ29vZ2xldm9pY2UpLgorICAgIE1ZRklCRVIgPSAxOTQ7CisgICAgLy8gTG9ncyBmb3IgTXkgRmliZXIgbW9iaWxlIGFwcGxpY2F0aW9ucyAoZ28vbXlmaWJlcm5hdGl2ZSkKKyAgICBSRUNPUkRFRF9QQUdFUyA9IDE5NTsKKyAgICAvLyBMb2dzIGZvciBSZWNvcmRlZFBhZ2VzIChnby9yZWNvcmRlZC1wYWdlcykKKyAgICBNT0JfRE9HID0gMTk3OworICAgIC8vIExvZ3MgZm9yIE1vYkRvZyAoZ28vbW9iZG9nKQorICAgIFdBTExFVF9BUFAgPSAxOTg7CisgICAgLy8gTG9ncyBmb3IgdGhlIFdhbGxldCBhcHAgKGdvL2dtb25leSkKKyAgICBHQk9BUkQgPSAxOTk7CisgICAgLy8gTG9ncyBmb3IgR0JvYXJkIChnby9nYm9hcmQpCisgICAgQ1JPTkVUX0dNTSA9IDIwMzsKKyAgICAvLyBDcm9uZXQgVU1BIGxvZ3MgZnJvbSBHTU0gKGdvL2Nyb25ldC11bWEpCisgICAgVFJVU1RFRF9GQUNFID0gMjA0OworICAgIC8vIExvZ3MgZm9yIFRydXN0ZWQgRmFjZSAoZ28vc21hcnRsb2NrKQorICAgIE1BVENIU1RJQ0sgPSAyMDU7CisgICAgLy8gTG9ncyBmb3IgTWF0Y2hzdGljayBsaWJyYXJ5IChnby9tYXRjaHN0aWNrKQorICAgIE1BVENIU1RJQ0tfQ09VTlRFUlMgPSAzNzI7CisgICAgLy8gTG9ncyBmb3IgTWF0Y2hzdGljayBjb3VudGVycyAoZ28vbWF0Y2hzdGljaykKKyAgICBBUFBfQ0FUQUxPRyA9IDIwNjsKKyAgICAvLyBMb2dzIGZvciBBcHBDYXRhbG9nIGFrYSAiR2V0IE15IEdvb2dsZSBBcHBzIiAoZ28vZ3Jvd3RoKQorICAgIEJMVUVUT09USCA9IDIwODsKKyAgICAvLyBMb2dzIGZvciBCbHVldG9vdGggKGdvL2ZsdW9yaWRlKQorICAgIFdJRkkgPSAyMDk7CisgICAgLy8gTG9ncyBmb3IgV2lGaSAoZ28vY29ubmVjdGl2aXR5LXNpdGUpCisgICAgVEVMRUNPTSA9IDIxMDsKKyAgICAvLyBMb2dzIGZvciBUZWxjb20gKGdvL2Nvbm5lY3Rpdml0eS1zaXRlKQorICAgIFRFTEVQSE9OWSA9IDIxMTsKKyAgICAvLyBMb2dzIGZvciBUZWxlcGhvbnkgKGdvL2Nvbm5lY3Rpdml0eS1zaXRlKQorICAgIElERU5USVRZX0ZST05URU5EID0gMjEyOworICAgIC8vIExvZ3MgZm9yIHRoZSBJZGVudGl0eSBmcm9udGVuZCAoZ28vaWZ1cy1yZWFkbWUpCisgICAgU0VTQU1FID0gMjE2OworICAgIC8vIExvZ3MgZm9yIFNlc2FtZSAoZ28vc2VzYW1lLWxvZ2dpbmcpCisgICAgR09PR0xFX0tFWUJPQVJEX0NPTlRFTlQgPSAyMTc7CisgICAgLy8gR29vZ2xlIEtleWJvYXJkJ3MgTGF0aW4gSU1FIGNvbnRlbnQgbG9ncyAoZ28vZ29vZ2xlLWtleWJvYXJkKQorICAgIE1BRERFTiA9IDIxODsKKyAgICAvLyBMb2dzIGZvciBNYWRkZW4gKGdvL21hZGRlbikKKyAgICBJTksgPSAyMTk7CisgICAgLy8gTG9ncyBmb3IgSW5rIChnby9pbmspCisgICAgQU5EUk9JRF9DT05UQUNUUyA9IDIyMDsKKyAgICAvLyBMb2dzIGZvciBBbmRyb2lkIENvbnRhY3RzIChnby9hbmRyb2lkLWNvbnRhY3RzKQorICAgIEdPT0dMRV9LRVlCT0FSRF9DT1VOVEVSUyA9IDIyMTsKKyAgICAvLyBHb29nbGUgS2V5Ym9hcmQgaGlzdG9ncmFtIGNvdW50ZXJzIChnby9nb29nbGUta2V5Ym9hcmQpCisgICAgQ0xFQVJDVVRfUFJPQkVSID0gMjI1OworICAgIC8vIENsZWFyY3V0IHByb2JlciAoZ28vY2xlYXJjdXQtcHJvYmVyKQorICAgIFBMQVlfQ09OU09MRV9BUFAgPSAyMjY7CisgICAgLy8gTG9ncyBmb3IgdGhlIEdvb2dsZSBQbGF5IERldmVsb3BlciBDb25zb2xlIGFwcAorICAgIFBMQVlfQ09OU09MRV9BUFBfUFJJTUVTID0gMjY0OworICAgIC8vIExvZyBmb3Igc3lzdGVtIGhlYWx0aCBtZXRyaWNzIGZvciB0aGUgR29vZ2xlIFBsYXkgRGV2ZWxvcGVyIENvbnNvbGUgYXBwCisgICAgU1BFQ1RSVU0gPSAyMzA7CisgICAgLy8gU3BlY3RydW0gKGdvL3NwZWN0cnVtLXNpdGUpCisgICAgU1BFQ1RSVU1fQ09VTlRFUlMgPSAyMzE7CisgICAgLy8gU3BlY3RydW0gKGdvL3NwZWN0cnVtLXNpdGUpCisgICAgU1BFQ1RSVU1fQU5EUk9JRF9QUklNRVMgPSAyNjc7CisgICAgLy8gU3BlY3RydW0gKGdvL3NwZWN0cnVtLXNpdGUpCisgICAgSU9TX1NQT1RMSUdIVF9TRUFSQ0hfTElCUkFSWSA9IDIzNDsKKyAgICAvLyBMb2dzIGZvciB0aGUgaU9TIFNwb3RsaWdodCBTZWFyY2ggTGlicmFyeSAoZ28vdGVtcGVoLWRkKQorICAgIEJPUV9XRUIgPSAyNDE7CisgICAgLy8gTG9ncyBmb3IgY2xpZW50LXNpZGUgYW5hbHl0aWNzIG9mIEJvcSBXZWIgKGdvL2JvcS13ZWIpCisgICAgT1JDSEVTVFJBVElPTl9DTElFTlQgPSAyNDU7CisgICAgLy8gT3JjaGVzdHJhdGlvbiBjbGllbnQgbG9ncyBmb3IgcHJvZCBlbnZpcm9ubWVudCAoZ28vbWVnYWxvZ3MtZGVzaWduKQorICAgIE9SQ0hFU1RSQVRJT05fQ0xJRU5UX0RFViA9IDI0NjsKKyAgICAvLyBPcmNoZXN0cmF0aW9uIGNsaWVudCBsb2dzIGZvciBkZXYgZW52aXJvbm1lbnQgKGdvL21lZ2Fsb2dzLWRlc2lnbikKKyAgICBHT09HTEVfTk9XX0xBVU5DSEVSID0gMjQ3OworICAgIC8vIExvZ3MgZm9yIEdvb2dsZSBOb3cgTGF1bmNoZXIgKGdvL2dubC1sb2dnaW5nKQorICAgIFNDT09CWV9TUEFNX1JFUE9SVF9MT0cgPSAyNTA7CisgICAgLy8gTG9ncyBvZiBzcGFtIHJlcG9ydHMgYnkgc2Nvb2J5IGNsaWVudHMuIChnby9zY29vYnkpCisgICAgSU9TX0dST1dUSCA9IDI1MTsKKyAgICAvLyBnby9ncm93dGhraXQtbWV0cmljcworICAgIEFQUFNfTk9USUZZID0gMjUyOworICAgIC8vIERyaXZlIHdlYiBwdXNoIG5vdGlmaWNhdGlvbnMgKGdvL2FwcHMtbm90aWZ5KQorICAgIFNNQVJUS0VZX0FQUCA9IDI2OTsKKyAgICAvLyBTbWFydCBLZXkgQXBwIGZvciBwcm9qZWN0IEJvbHQgKGdvL3NtYXJ0bG9jaykKKyAgICBDTElOSUNBTF9TVFVESUVTID0gMjcwOworICAgIC8vIExpZmVzY2llbmNlIENsaW5pY2FsIFN0dWRpZXMgbG9ncyAoZ28vYXBvbGxveCkKKyAgICBGSVRORVNTX0FORFJPSURfUFJJTUVTID0gMjcxOworICAgIC8vIFN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBHb29nbGUgRml0IEFuZHJvaWQgQXBwIChnby9oZWFydCwgZ28vcHJpbWVzKQorICAgIElNUFJPVl9BUFBTID0gMjcyOworICAgIC8vIERlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgSU1QUk9WX1BPU1RJVCBhbmQgSU1QUk9WX1NIQVJQSUUuCisgICAgRkFNSUxZTElOSyA9IDI3MzsKKyAgICAvLyBGYW1pbHkgTGluayAoZ28vZmFtaWx5bGluay1kZCkKKyAgICBGQU1JTFlMSU5LX0NPVU5URVJTID0gMjc0OworICAgIC8vIEZhbWlseSBMaW5rIGNvdW50ZXJzIChnby9mYW1pbHlsaW5rLWRkKQorICAgIFNPQ0lFVFkgPSAyNzU7CisgICAgLy8gTkJVIFNvY2lldHkgYXBwIChnby9zb2NpZXR5KQorICAgIERJQUxFUl9BTkRST0lEX1BSSU1FUyA9IDI3NzsKKyAgICAvLyBBbmRyb2lkIERpYWxlciBQcmltZXMgKGdvL2RpYWxlcikKKyAgICBZT1VUVUJFX0RJUkVDVE9SX0FQUCA9IDI3ODsKKyAgICAvLyBZb3VUdWJlIERpcmVjdG9yIEFwcCAoZ28veW91dHViZS1kaXJlY3RvcikKKyAgICBUQUNIWU9OX0FORFJPSURfUFJJTUVTID0gMjc5OworICAgIC8vIEFuZHJvaWQgVGFjaHlvbiBDbGllbnQKKyAgICBEUklWRV9GUyA9IDI4MDsKKyAgICAvLyBEcml2ZUZTIChnby9kcml2ZS1mcykKKyAgICBZVF9NQUlOID0gMjgxOworICAgIC8vIExvZ3MgZm9yIFlUJ3MgbWFpbiBhcHBsaWNhdGlvbgorICAgIFdJTkdfTUFSS0VUUExBQ0VfQU5EUk9JRF9QUklNRVMgPSAyODI7CisgICAgLy8gUHJpbWVzIGZvciBXaW5nIE1hcmtldHBsYWNlIEFuZHJvaWQgYXBwIChnby93aW5nLW1hcmtldHBsYWNlLWFuZHJvaWQsIGdvL3ByaW1lcykKKyAgICBEWU5BTUlURSA9IDI4MzsKKyAgICAvLyBMb2dzIGZvciBEeW5hbWl0ZSBXZWIgYXBwIChnby9keW5hbWl0ZSkKKyAgICBDT1JQX0FORFJPSURfRk9PRCA9IDI4NDsKKyAgICAvLyBMb2dzIGZvciB0aGUgaW50ZXJuYWwgQW5kcm9pZCBGb29kIGFwcCAoZzNkb2MvamF2YS9jb20vZ29vZ2xlL2NvcnAvYml6YXBwcy9yZXdzL2Zvb2QvYW5kcm9pZCkKKyAgICBBTkRST0lEX01FU1NBR0lOR19QUklNRVMgPSAyODU7CisgICAgLy8gUHJpbWVzIGZvciBBbmRyb2lkIE1lc3NlbmdlciAoZ28vYnVnbGVkZXYsIGdvL3ByaW1lcykKKyAgICBHUExVU19JT1NfUFJJTUVTID0gMjg2OworICAgIC8vIFByaW1lcyBmb3IgR29vZ2xlKyBpT1MgYXBwIChnby9ncGx1cy1pb3MsIGdvL3ByaW1lcykKKyAgICBDSFJPTUVDQVNUX0FORFJPSURfQVBQX1BSSU1FUyA9IDI4ODsKKyAgICAvLyBQcmltZXMgZm9yIENocm9tZWNhc3QgQW5kcm9pZCBhcHAgKGdvL2Nhc3QtYXBwcykKKyAgICBDQVNUX0lPU19QUklNRVMgPSAzNDQ7CisgICAgLy8gUHJpbWVzIGZvciBDYXN0IGlPUyBhcHAgKGdvL2Nhc3QtYXBwcykKKyAgICBBUFBTVFJFQU1JTkcgPSAyODk7CisgICAgLy8gTG9ncyBmb3IgQXBwU3RyZWFtaW5nIENsaWVudCBGcmFtZXdvcmsgU2lkZSAoZ28vcGljY2FyZCkKKyAgICBHTUJfQU5EUk9JRCA9IDI5MDsKKyAgICAvLyBMb2dzIGZvciBHTUIgQW5kcm9pZCBhcHAgKGdvL2dtYi1hbmRyb2lkKS4KKyAgICBWT0lDRV9JT1NfUFJJTUVTID0gMjkyOworICAgIC8vIFByaW1lcyBmb3IgaU9TIEdvb2dsZSBWb2ljZSAoZ28vZ29vZ2xldm9pY2UpLgorICAgIFZPSUNFX0FORFJPSURfUFJJTUVTID0gMjkzOworICAgIC8vIFByaW1lcyBmb3IgQW5kcm9pZCBHb29nbGUgVm9pY2UgKGdvL2dvb2dsZXZvaWNlKS4KKyAgICBQQUlTQSA9IDI5NDsKKyAgICAvLyBOQlUgUGFpc2EgYXBwIChnby9wYWlzYSkKKyAgICBOQVpERUVLX1VTRVJfQU5EUk9JRF9QUklNRVMgPSAzMTU7CisgICAgLy8gUHJpbWVzIGZvciBOYXpkZWVrIFVzZXIgKGdvL25hemRlZWspLgorICAgIE5BWkRFRUtfQ0FCX0FORFJPSURfUFJJTUVTID0gMzE2OworICAgIC8vIFByaW1lcyBmb3IgTmF6ZGVlayBDYWIgKGdvL25hemRlZWspLgorICAgIE5BWkRFRUtfQ0FGRV9BTkRST0lEX1BSSU1FUyA9IDMxNzsKKyAgICAvLyBQcmltZXMgZm9yIE5hemRlZWsgQ2FmZSAoZ28vbmF6ZGVlaykuCisgICAgR01CX0lPUyA9IDI5NTsKKyAgICAvLyBMb2dzIGZvciBHTUIgaU9TIEFwcCAoZ28vZ21iLWlvcykuCisgICAgR01CX0lPU19QUklNRVMgPSAzMjU7CisgICAgLy8gUHJpbWVzIGZvciBHTUIgaU9TIEFwcCAoZ28vZ21iLWlvcykuCisgICAgU0NPT0JZX0VWRU5UUyA9IDI5NjsKKyAgICAvLyBDYWxsIGxvZ3MgZXZlbnRzIGJ5IHNjb29ieSBjbGllbnRzLiAoZ28vc2Nvb2J5KQorICAgIFNOQVBTRUVEX0lPU19QUklNRVMgPSAyOTc7CisgICAgLy8gUHJpbWVzIGZvciBTbmFwc2VlZCBJT1MgKGdvL1NuYXBzZWVkKQorICAgIFlPVVRVQkVfRElSRUNUT1JfSU9TX1BSSU1FUyA9IDI5ODsKKyAgICAvLyBZb3VUdWJlIERpcmVjdG9yIEFwcCAoZ28veW91dHViZS1kaXJlY3RvcikKKyAgICBXQUxMUEFQRVJfUElDS0VSID0gMjk5OworICAgIC8vIEV2ZW50IGxvZ3MgZm9yIEFuZHJvaWQgd2FsbHBhcGVyIHBpY2tlciAoZ28vbWFnaWMtd2FsbHBhcGVycykKKyAgICBDSElNRSA9IDMwMDsKKyAgICAvLyBDaGltZSAoZ28vY2hpbWUpCisgICAgQkVBQ09OX0dDT1JFID0gMzAxOworICAgIC8vIExvZ3MgZm9yIGRlYnVnZ2luZyBiZWFjb24gbW9kdWxlIChnby9iZWFjb25zKQorICAgIEFORFJPSURfU1RVRElPID0gMzAyOworICAgIC8vIEFuZHJvaWQgU3R1ZGlvIChnby9hbmRyb2lkLXN0dWRpbykKKyAgICBET0NTX09GRkxJTkUgPSAzMDY7CisgICAgLy8gTG9ncyBmb3IgRG9jcyBPZmZsaW5lIG9uIERlc2t0b3AgIChnby9qZXRwYXgpCisgICAgRlJFSUdIVEVSID0gMzA3OworICAgIC8vIExvZ3MgZm9yIEZyZWlnaHRlciAoaHR0cDovL2dvL2ZyZWlnaHRlcikKKyAgICBET0NTX0lPU19QUklNRVMgPSAzMDg7CisgICAgLy8gTG9ncyBmb3IgdGhlIEdvb2dsZSBEb2NzIGlPUyBhcHBsaWNhdGlvbgorICAgIFNMSURFU19JT1NfUFJJTUVTID0gMzA5OworICAgIC8vIExvZ3MgZm9yIHRoZSBHb29nbGUgRG9jcyBpT1MgYXBwbGljYXRpb24KKyAgICBTSEVFVFNfSU9TX1BSSU1FUyA9IDMxMDsKKyAgICAvLyBMb2dzIGZvciB0aGUgR29vZ2xlIERvY3MgaU9TIGFwcGxpY2F0aW9uCisgICAgSVBDT05ORUNUSVZJVFkgPSAzMTE7CisgICAgLy8gTG9ncyBmb3IgTmV0d29ya2luZyAoZ28vY29ubmVjdGl2aXR5LXNpdGUpCisgICAgQ1VSQVRPUiA9IDMxMjsKKyAgICAvLyBMb2dzIGZvciBjdXJhdG9yIGFwcCAoZ28vY3VyYXRvcikKKyAgICBDVVJBVE9SX0FORFJPSURfUFJJTUVTID0gMzE4OworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBDdXJhdG9yIChnby9wcmltZXMsIGdvL2N1cmF0b3IpCisgICAgRklUTkVTU19BTkRST0lEX1dFQVJfUFJJTUVTID0gMzE5OworICAgIC8vIFN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBHb29nbGUgRml0IFdlYXIgQXBwIChnby9oZWFydCwgZ28vcHJpbWVzKQorICAgIEFORFJPSURfTUlHUkFURSA9IDMyMDsKKyAgICAvLyBMb2dzIGZvciBBbmRyb2lkIERldmljZSBNaWdyYXRpb24gKGdvL2FuZHJvaWQtbWlncmF0aW9uKS4KKyAgICBQQUlTQV9VU0VSX0FORFJPSURfUFJJTUVTID0gMzIxOworICAgIC8vIFBSSU1FUyBsb2dzIGZvciBQYWlzYSBVc2VyIEFwcCAoZ28vcGFpc2EtdXNlciwgZ28vcHJpbWVzKS4KKyAgICBQQUlTQV9NRVJDSEFOVF9BTkRST0lEX1BSSU1FUyA9IDMyMjsKKyAgICAvLyBQUklNRVMgbG9ncyBmb3IgUGFpc2EgTWVyY2hhbnQgQXBwIChnby9wYWlzYS1tZXJjaGFudCwgZ28vcHJpbWVzKS4KKyAgICBDTElFTlRfTE9HR0lOR19QUk9EID0gMzI3OworICAgIC8vIGdvL2NsaWVudC1sb2dnaW5nLXdnCisgICAgQ0xJRU5UX0xPR0dJTkdfREVNTyA9IDMyNzsKKyAgICAvLyBhbGlhcyBmb3IgQ0xJRU5UX0xPR0dJTkdfUFJPRCwgZm9yIHRoZSBjbGllbnRzIGluIHRoZSB3aWxkLgorICAgIExJVkVfQ0hBTk5FTFNfQU5EUk9JRF9QUklNRVMgPSAzMjg7CisgICAgLy8gUFJJTUVTIGxvZ3MgZm9yIExpdmUgQ2hhbm5lbHMgQXBwIChnby9saXZlLWNoYW5uZWxzLCBnby9wcmltZXMpLgorICAgIFBBSVNBX1VTRVJfSU9TX1BSSU1FUyA9IDMyOTsKKyAgICAvLyBQUklNRVMgbG9ncyBmb3IgUGFpc2EgVXNlciBpT1MgQXBwIChnby9wYWlzYS11c2VyLCBnby9wcmltZXMsIGdvL3BhaXNhLWlvcykuCisgICAgVkVTUEFfSU9TX1BSSU1FUyA9IDMzMTsKKyAgICAvLyBQUklNRVMgbG9ncyBmb3IgVmVzcGEgaU9TIEFwcCAoZ28vdmVzcGEpCisgICAgUExBWV9HQU1FU19QUklNRVMgPSAzMzI7CisgICAgLy8gUFJJTUVTIGxvZ3MgZm9yIFBsYXkgR2FtZXMgKGdvL2dnLWVuZykKKyAgICBHTVNDT1JFX0FQSV9DT1VOVEVSUyA9IDMzMzsKKyAgICAvLyBHbXNDb3JlIEFQSSBjb3VudGVycyAoZ21zY29yZS1mcmFtZXdvcmtAKQorICAgIEVBUlRIID0gMzM0OworICAgIC8vIExvZ3MgZm9yIEdvb2dsZSBFYXJ0aCAoZ28vZWFydGhkZXYpCisgICAgRUFSVEhfQ09VTlRFUlMgPSA0MDU7CisgICAgLy8gVGhlIGNvdW50ZXJzIGZvciBHb29nbGUgRWFydGggKGdvL2VhcnRoZGV2LCBlYXJ0aC1kZXZAKS4KKyAgICBDQUxFTkRBUl9DTElFTlQgPSAzMzU7CisgICAgLy8gTG9ncyBmb3IgQ2FsZW5kYXIgY2xpZW50IGV2ZW50cworICAgIFNWX0FORFJPSURfUFJJTUVTID0gMzM2OworICAgIC8vIFByaW1lcyBmb3IgU3RyZWV0IFZpZXcgYW5kcm9pZCBhcHAgKGdvL3N2YXBwLCBnby9wcmltZXMpLgorICAgIFBIT1RPU19JT1NfUFJJTUVTID0gMzM3OworICAgIC8vIExvZ3MgZm9yIFBob3RvcyBpT1MgQXBwIChnby9waG90b3Npb3MsIGdvL3ByaW1lcykKKyAgICBHQVJBR0VfQU5EUk9JRF9QUklNRVMgPSAzMzg7CisgICAgLy8gTG9ncyBmb3IgR2FyYWdlIEFuZHJvaWQgQXBwIChnby9nYXJhZ2UsIGdvL3ByaW1lcykKKyAgICBHQVJBR0VfSU9TX1BSSU1FUyA9IDMzOTsKKyAgICAvLyBMb2dzIGZvciBHYXJhZ2UgaU9TIEFwcCAoZ28vZ2FyYWdlLCBnby9wcmltZXMpCisgICAgU09DSUFMX0dPT0RfRE9OQVRJT05fV0lER0VUID0gMzQwOworICAgIC8vIExvZ3MgZm9yIFNvY2lhbCBHb29kIGRvbmF0aW9uIHdpZGdldCAoZ28vb25ldG9kYXkpCisgICAgU0FORENMT0NLID0gMzQxOworICAgIC8vIExvZ3MgZm9yIFNhbmRDbG9jayBhcHAgKGdvL3NhbmRjbG9jaykuCisgICAgSU1BR0VSWV9WSUVXRVIgPSAzNDI7CisgICAgLy8gTG9ncyBmb3IgSW1hZ2VyeSBWaWV3ZXIgKGdvL2ltYWdlcnktdmlld2VyKQorICAgIEFEV09SRFNfRVhQUkVTU19BTkRST0lEX1BSSU1FUyA9IDM0MzsKKyAgICAvLyBQUklNRVMgbG9ncyBmb3IgQWR3b3JkcyBFeHByZXNzIEFuZHJvaWQgYXBwLgorICAgIElNUFJPVl9QT1NUSVQgPSAzNDU7CisgICAgLy8gTG9ncyBmb3IgSW1wcm92IFBvc3RpdCAoZ28vaW1wcm92bG9nZ2luZykKKyAgICBJTVBST1ZfU0hBUlBJRSA9IDM0NjsKKyAgICAvLyBMb2dzIGZvciBJbXByb3YgU2hhcnBpZSAoZ28vaW1wcm92bG9nZ2luZykKKyAgICBEUkFQRVJfSU9TX1BSSU1FUyA9IDM0NzsKKyAgICAvLyBMb2dzIGZvciBEcmFwZXIgaU9TIEFwcCAoZ28vZHJhcGVyLWlvcywgZ28vcHJpbWVzKQorICAgIFNNQVJUQ0FNID0gMzQ4OworICAgIC8vIFNtYXJ0Q2FtIGFwcCBldmVudCAoZ28vc21hcnRjYW0pCisgICAgREFTSEVSX1VTRVJIVUIgPSAzNDk7CisgICAgLy8gQ2xpZW50IHNpZGUgbG9ncyBmb3IgRGFzaGVyIFVzZXJodWIgKGdvL3VzZXJodWItb24tYm9xKS4KKyAgICBBTkRST0lEX0NPTlRBQ1RTX1BSSU1FUyA9IDM1MDsKKyAgICAvLyBQUklNRVMgTG9ncyBmb3IgQW5kcm9pZCBDb250YWN0cyAoZ28vYW5kcm9pZC1jb250YWN0cykKKyAgICBaQUdBVF9CVVJHVU5EWV9JT1NfUFJJTUVTID0gMzUxOworICAgIC8vIExvZ3MgZm9yIFphZ2F0IEJ1cmd1bmR5IGlPUyBBcHAgKGdvL3phZ2F0LWlvcykKKyAgICBaQUdBVF9CVVJHVU5EWV9BTkRST0lEX1BSSU1FUyA9IDM1MjsKKyAgICAvLyBMb2dzIGZvciBaYWdhdCBCdXJndW5keSBBbmRyb2lkIEFwcCAoZ28vemFnYXQtYW5kcm9pZCkKKyAgICBDQUxFTkRBUl9JT1NfUFJJTUVTID0gMzUzOworICAgIC8vIExvZ3MgZm9yIHN5c3RlbSBoZWFsdGggbWV0cmljIGZvciBDYWxlbmRhciBpT1MgKGdvL3ByaW1lcy1pb3MpCisgICAgU1ZfSU9TX1BSSU1FUyA9IDM1NDsKKyAgICAvLyBQcmltZXMgZm9yIFN0cmVldCBWaWV3IGFuZHJvaWQgYXBwIChnby9zdmFwcCwgZ28vcHJpbWVzKS4KKyAgICBTTUFSVF9TRVRVUCA9IDM1NTsKKyAgICAvLyBMb2dzIGZvciBzbWFydCBzZXR1cCAoZ28vc21hcnQtc2V0dXApLgorICAgIEJPT05EX0FORFJPSURfUFJJTUVTID0gMzU2OworICAgIC8vIExvZ3MgZm9yIGJvb25kIG1vYmlsZSBhcHAgKGdvL3ZpbGxhZ2UtbW9iaWxlKQorICAgIEtPTkdfQU5EUk9JRF9QUklNRVMgPSAzNTg7CisgICAgLy8gUFJJTUVTIGxvZ3MgZm9yIEtvbmcgQW5kcm9pZCBhcHAgKGdvL2tvbmcpLgorICAgIENMQVNTUk9PTV9JT1NfUFJJTUVTID0gMzU5OworICAgIC8vIFByaW1lcyBmb3IgQ2xhc3Nyb29tIGlPUyBhcHAgKGdvL2NsYXNzcm9vbS1pb3MsIGdvL3ByaW1lcykuCisgICAgV0VTVElOR0hPVVNFX0NPVU5URVJTID0gMzYwOworICAgIC8vIENvdW50ZXJzIGZvciBXZXN0aW5naG91c2UgKGdvL3dlc3Rpbmdob3VzZSkKKyAgICBXQUxMRVRfU0RLX0dDT1JFID0gMzYxOworICAgIC8vIFByaW1lcyBmb3IgR01TQ29yZSBXYWxsZXQgU0RLIChnby9hcGktZzNkb2MpLgorICAgIEFORFJPSURfSU1FX0FORFJPSURfUFJJTUVTID0gMzYyOworICAgIC8vIFByaW1lcyBmb3IgQW5kcm9pZCBJTUUgYXBwIChnby9hbmRyb2lkLWltZSwgZ28vcHJpbWVzKS4KKyAgICBNRUVUSU5HU19BTkRST0lEX1BSSU1FUyA9IDM2MzsKKyAgICAvLyBQcmltZXMgZm9yIEdvb2dsZSBNZWV0IEFuZHJvaWQgKGdvL3Rob3ItYW5kcm9pZCkuCisgICAgTUVFVElOR1NfSU9TX1BSSU1FUyA9IDM2NDsKKyAgICAvLyBQcmltZXMgZm9yIEdvb2dsZSBNZWV0IGlPUyAoZ28vdGhvci1pb3MpLgorICAgIFdFQl9DT05UQUNUUyA9IDM2NTsKKyAgICAvLyBMb2dzIGZvciBXZWIgQ29udGFjdHMgKGdvL3dlYmNvbnRhY3RzLWxvZ2dpbmcpLgorICAgIEFEU19JTlRFR1JJVFlfT1BTID0gMzY2OworICAgIC8vIExvZ3MgZm9yIEFkcyBJbnRlZ3JpdHkgT3BzIFRvb2xzIChnby9oaWRvYykuCisgICAgVE9QQVogPSAzNjc7CisgICAgLy8gTG9ncyBmb3IgVG9wYXogKGdvL3RvcGF6KS4KKyAgICBDTEFTU1JPT01fQU5EUk9JRF9QUklNRVMgPSAzNjk7CisgICAgLy8gUHJpbWVzIGZvciBDbGFzc3Jvb20gQW5kcm9pZCBhcHAgKGdvL2NsYXNzcm9vbS1hbmRyb2lkLCBnby9wcmltZXMpLgorICAgIFRIVU5ERVJCSVJEID0gMzcwOworICAgIC8vIExvZ3MgZm9yIFRodW5kZXJiaXJkIChnby90aHVuZGVyYmlyZCkuCisgICAgUFVMUEZJQ1RJT04gPSAzNzE7CisgICAgLy8gTG9ncyBmb3IgUHVscGZpY3Rpb24gVG95cyAoZ28vcHVscGZpY3Rpb24pLgorICAgIE9ORUdPT0dMRSA9IDM3MzsKKyAgICAvLyBMb2dzIGZvciBPbmVHb29nbGUgVUkgZXZlbnQgKGdvL29ncy1jbGVhcmN1dCkuCisgICAgVFJBTlNMQVRFID0gMzc1OworICAgIC8vIExvZ3MgZm9yIEdvb2dsZSBUcmFuc2xhdGUgKGdvL3RyYW5zbGF0ZSkuCisgICAgTElGRVNDSUVOQ0VfRlJPTlRFTkRTID0gMzc2OworICAgIC8vIExvZ3MgZm9yIExpZmVzY2llbmNlIEZyb250ZW5kcyAoZ28vY3NwLWVuZykuCisgICAgV0FMTFBBUEVSX1BJQ0tFUl9DT1VOVEVSUyA9IDM3NzsKKyAgICAvLyBDb3VudGVycy9oaXN0b2dyYW1zIGZvciBBbmRyb2lkIHdhbGxwYXBlciBwaWNrZXIgKGdvL21hZ2ljLXdhbGxwYXBlcnMpCisgICAgTUFHSUNURVRIRVJfQ09VTlRFUlMgPSAzNzg7CisgICAgLy8gQ291bnRlcnMgZm9yIE1hZ2ljIFRldGhlciAoZ28vbWFnaWMtdGV0aGVyKS4KKyAgICBTT0NJRVRZX0NPVU5URVJTID0gMzc5OworICAgIC8vIE5CVSBTb2NpZXR5IGFwcCAoZ28vc29jaWV0eSkuCisgICAgVU5JQ09NTV9QID0gMzgwOworICAgIC8vIExvZ3MgZm9yIHBob25lIGNhbGxzIG1ldGFkYXRhIChVbmljb3JuIHByb2plY3Q7IHNlZSBnby91bmljb21tLXNtcy1jYWxscy1kZCkKKyAgICBVTklDT01NX1MgPSAzODE7CisgICAgLy8gTG9ncyBmb3IgU01TIG1ldGFkYXRhIChVbmljb3JuIHByb2plY3Q7IHNlZSBnby91bmljb21tLXNtcy1jYWxscy1kZCkKKyAgICBIQUxMV0FZID0gMzgyOworICAgIC8vIExvZ3MgZm9yIFdobydzIERvd24gKGdvL2hhbGx3YXkpLgorICAgIFNQQUNFUyA9IDM4MzsKKyAgICAvLyBMb2dzIGZvciBTcGFjZXMgKGdvL3NwYWNlcykuCisgICAgVE9PTEtJVF9RVUlDS1NUQVJUID0gMzg0OworICAgIC8vIExvZ3MgZm9yIFRvb2xraXQgKGdvL3Rvb2xraXQpLgorICAgIENIQVVGRkVVUl9BTkRST0lEX1BSSU1FUyA9IDM4NTsKKyAgICAvLyBQcmltZXMgZm9yIENoYXVmZmV1ciBDYXJBcHAgZm9yIEFuZHJvaWQgKGdvL2NoYXVmZmV1cikKKyAgICBDSEFVRkZFVVJfSU9TX1BSSU1FUyA9IDM4NjsKKyAgICAvLyBQcmltZXMgZm9yIENoYXVmZmV1ciBDYXJBcHAgZm9yIGlPUyAoZ28vY2hhdWZmZXVyKQorICAgIEZJRE8gPSAzODc7CisgICAgLy8gTG9ncyBmb3IgRklETyBjbGllbnQgZXZlbnRzIChnby9maWRvLWxvZ2dpbmcpLgorICAgIE1PQkRPR19BTkRST0lEX1BSSU1FUyA9IDM4ODsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgTW9iRG9nIEFuZHJvaWQgKGdvL3ByaW1lcykKKyAgICBNT0JET0dfSU9TX1BSSU1FUyA9IDM4OTsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgTW9iRG9nIGlPUyAoZ28vcHJpbWVzKQorICAgIEFXWF9JT1NfUFJJTUVTID0gMzkxOworICAgIC8vIFByaW1lcyBmb3IgR29vZ2xlIEFkV29yZHMgRXhwcmVzcyBpb3MgYXBwIChnby9wcmltZXMtaW9zLCBnby9hd3gtaW9zLWRlc2lnbi1kb2MpCisgICAgR0hTX0lPU19QUklNRVMgPSAzOTI7CisgICAgLy8gUHJpbWVzIGZvciBHb29nbGUgSG9tZSBTZXJ2aWNlcyBpb3MgYXBwIChnby9wcmltZXMtaW9zLCBnby9oYXMtaW9zLWRlc2lnbikKKyAgICBCT09LU19JT1NfUFJJTUVTID0gMzkzOworICAgIC8vIFByaW1lcyBmb3IgUGxheSBCb29rcyBmb3IgaU9TIChnby9pb3MtcGxheS1ib29rcykKKyAgICBMSU5LUyA9IDM5NDsKKyAgICAvLyBMb2dzIGZvciBMaW5rcyAoZ28vbGlua3MpLgorICAgIEtBVE5JUF9JT1NfUFJJTUVTID0gMzk1OworICAgIC8vIFByaW1lcyBmb3IgWW91VHViZSBDcmVhdG9yIFN0dWRpbyBpT1MgKGdvL2thdG5pcCkKKyAgICBCT09LU19BTkRST0lEX1BSSU1FUyA9IDM5NzsKKyAgICAvLyBQcmltZXMgZm9yIEFuZHJvaWQgUGxheSBCb29rcyAoZ28vYW5kcm9pZC1ib29rcykKKyAgICBEWU5BTUlURV9BTkRST0lEX1BSSU1FUyA9IDM5ODsKKyAgICAvLyBQcmltZXMgZm9yIER5bmFtaXRlIEFuZHJvaWQgYXBwIChnby9keW5hbWl0ZSkKKyAgICBEWU5BTUlURV9JT1NfUFJJTUVTID0gMzk5OworICAgIC8vIFByaW1lcyBmb3IgRHluYW1pdGUgaU9TIGFwcCAoZ28vZHluYW1pdGUpCisgICAgU0lERUxPQURFRF9NVVNJQyA9IDQwMDsKKyAgICAvLyBTaWRlbG9hZGVkIG11c2ljIG9uIEFuZHJvaWQgZGV2aWNlcyAoZ28vc2lkZWxvYWRlZC1hc3Npc3RhbnQtc2tldGNoKQorICAgIENPUlBfQU5EUk9JRF9ET1JZID0gNDAxOworICAgIC8vIExvZ3MgZm9yIHRoZSBpbnRlcm5hbCBEb3J5IGFwcCAoZ28vZG9yeSkKKyAgICBDT1JQX0FORFJPSURfSkVUU0VUID0gNDAyOworICAgIC8vIExvZ3MgZm9yIHRoZSBpbnRlcm5hbCBKZXRzZXQgYXBwIChnby9qZXRzZXQpCisgICAgVlJfU0RLX0lPU19QUklNRVMgPSA0MDM7CisgICAgLy8gTG9ncyBmb3IgdGhlIGNhcmRib2FyZCBpb3Mgc2RrIGFwcCAoaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vdnIvaW9zLykKKyAgICBWUl9TREtfQU5EUk9JRF9QUklNRVMgPSA0MDQ7CisgICAgLy8gTG9ncyBmb3IgdGhlIGNhcmRib2FyZCBhbmRyb2lkIHNkayBhcHAgKGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3ZyL2FuZHJvaWQvKQorICAgIFBIT1RPU19TQ0FOTkVSID0gNDA2OworICAgIC8vIFBob3RvcyBTY2FubmVyIHByb2plY3QgKGdvL3Bob3Rvcy1kcmFwZXIpCisgICAgQkdfSU5fT0dCID0gNDA3OworICAgIC8vIExvZ3MgZm9yIEJvdGd1YXJkIGluIE9HQiAoZ28vYm90Z3VhcmQtaW4tb2diLWRkKQorICAgIEJMT0dHRVIgPSA0MDg7CisgICAgLy8gTG9ncyBmb3IgQmxvZ2dlciBCb3EgVVggKGdvL2Jsb2dnZXItYm9xKQorICAgIENPUlBfSU9TX0ZPT0QgPSA0MDk7CisgICAgLy8gTG9ncyBmb3IgdGhlIGludGVybmFsIGlPUyBGb29kIGFwcCAoZ28vZm9vZC1pb3MpCisgICAgQkVBQ09OX0dDT1JFX1RFU1QgPSA0MTA7CisgICAgLy8gTG9ncyBmb3IgOTA5MDEwIGRldmljZXMgKGdvLzkwOTAxMCkKKyAgICBMSU5LU19JT1NfUFJJTUVTID0gNDExOworICAgIC8vIExvZ3MgZm9yIHRoZSBMaW5rcyBpT1MgYXBwIChnby9saW5rcykKKyAgICBDSEFVRkZFVVIgPSA0MTI7CisgICAgLy8gQ2xlYXJjdXQgbG9ncyBmb3IgQ2hhdWZmZXVyIChnby9jaGF1ZmZldXIpCisgICAgU05BUFNFRUQgPSA0MTM7CisgICAgLy8gTG9ncyBmb3IgU25hcHNlZWQgKGdvL3NuYXBzZWVkKS4KKyAgICBFQVJUSF9BTkRST0lEX1BSSU1FUyA9IDQxNDsKKyAgICAvLyBMb2dzIGZvciBzeXN0ZW0gaGVhbHRoIG1ldHJpYyBmb3IgR29vZ2xlIEVhcnRoIEFuZHJvaWQgYXBwIChnby9lYXJ0aGRldiwgZ28vcHJpbWVzKQorICAgIENPUlBfQU5EUk9JRF9BSVVUTyA9IDQxNTsKKyAgICAvLyBMb2dzIGZvciB0aGUgaW50ZXJuYWwgRml4aXQgYXBwIChnby9haXV0bykuCisgICAgR0ZUVl9NT0JJTEVfUFJJTUVTID0gNDE2OworICAgIC8vIExvZ3MgZm9yIEdvb2dsZSBGaWJlciBUViBNb2JpbGUgQXBwIChnby9nZmliZXItbW9iaWxlKQorICAgIEdNQUlMX0lPUyA9IDQxNzsKKyAgICAvLyBMb2dzIGZvciBHbWFpbCBpT1MgKGdvL3N1cGVyZHVwZXJwdWR1KS4KKyAgICBUT1BBWl9BTkRST0lEX1BSSU1FUyA9IDQxODsKKyAgICAvLyBQcmltZXMgZm9yIFRvcGF6IEFuZHJvaWQgKGdvL3RvcGF6KQorICAgIFNPQ0lBTF9DT1VOVEVSUyA9IDQyMDsKKyAgICAvLyBDb3VudGVycyBmb3Igc29jaWFsIGNsaWVudHM6IGdwbHVzLWxvZy1xdWFsaXR5QAorICAgIENPUlBfQU5EUk9JRF9NT01BID0gNDIxOworICAgIC8vIExvZ3MgZm9yIHRoZSBpbnRlcm5hbCBNb21hIGFwcCAoZ28vbW9tYS1tb2JpbGUpCisgICAgTUVFVElOR1NfTE9HX1JFUVVFU1QgPSA0MjI7CisgICAgLy8gTG9ncyBmb3IgR29vZ2xlIE1lZXQgQW5kcm9pZCBhbmQgaU9TIChnby90aG9yLWFuZHJvaWQgYW5kIGdvL3Rob3ItaW9zKQorICAgIEdERUFMID0gNDIzOworICAgIC8vIExvZ3MgZm9yIHRoZSBnRGVhbCBhcHAgKGh0dHBzOi8vZzNkb2MuY29ycC5nb29nbGUuY29tL2phdmEvY29tL2dvb2dsZS9jb3JwL3hhbmFkdS9nM2RvYy9pbmRleC5tZD9jbD1oZWFkKQorICAgIEdPT0dMRVRUUyA9IDQyNDsKKyAgICAvLyBMb2dzIGZvciB0aGUgVGV4dC10by1TcGVlY2ggQW5kcm9pZCBhcHAgKGdvL3R0cykKKyAgICBTRUFSQ0hMSVRFX0FORFJPSURfUFJJTUVTID0gNDI1OworICAgIC8vIExvZ3MgZm9yIEFuZHJvaWQgR29vZ2xlTGl0ZSBhcHAgKGdvL2dvb2dsZWxpdGUpCisgICAgTkVBUkJZX0FVVEggPSA0MjY7CisgICAgLy8gTG9ncyBmb3IgTmVhcmJ5IEF1dGggKGdvL25lYXJieS1hdXRoKQorICAgIENPUlBfQU5EUk9JRF9BU1NJU1RBTlQgPSA0Mjc7CisgICAgLy8gTG9ncyBmb3IgdGhlIGludGVybmFsIEFzc2lzdGFudCBhcHAgKGdvL2Fzc2lzdGFudC1hcHApLgorICAgIERNQUdFTlRfQU5EUk9JRF9QUklNRVMgPSA0Mjg7CisgICAgLy8gUHJpbWVzIGZvciBEZXZpY2UgUG9saWN5IGFuZHJvaWQgYXBwIChnby9kZXZpY2VzLXNpdGUpCisgICAgQ09SUF9BTkRST0lEX0dCVVMgPSA0Mjk7CisgICAgLy8gTG9ncyBmb3IgdGhlIGludGVybmFsIEdCdXMgYXBwIChnby9nYnVzKS4KKyAgICBZT1VUVUJFX1VOUExVR0dFRF9JT1NfUFJJTUVTID0gNDMwOworICAgIC8vIFlvdVR1YmUgVW5wbHVnZ2VkIGlPUyAoZ28veXQtdW5wbHVnZ2VkKQorICAgIExFQU5CQUNLX0xBVU5DSEVSX1BSSU1FUyA9IDQzMTsKKyAgICAvLyBQcmltZXMgZm9yIExlYW5iYWNrIExhdW5jaGVyIG9uIEFuZHJvaWQgVFYgKGdvL2F0di1lbmcpCisgICAgRFJPSURHVUFSRCA9IDQzMjsKKyAgICAvLyBOZXh0IGVudW0gdGFnOiA0MzMKKyAgfQorICAvLyBEaWZmZXJlbnQgdHlwZXMgc2NoZWR1bGVycyBmb3IgbG9nIHVwbG9hZC4KKyAgZW51bSBTY2hlZHVsZXJUeXBlIHsKKyAgICBVTktOT1dOX1NDSEVEVUxFUiA9IDA7CisgICAgQVNBUCA9IDE7CisgICAgLy8gQXMgc29vbiBhcyBwb3NzaWJsZSB1c2VkIHdoZW4gbG9nIHN0b3JlIGlzIGZ1bGwuCisgICAgREVGQVVMVF9QRVJJT0RJQyA9IDI7CisgICAgUU9TX0ZBU1RfT05FT0ZGID0gMzsKKyAgICBRT1NfREVGQVVMVF9QRVJJT0RJQyA9IDQ7CisgICAgUU9TX1VOTUVURVJFRF9QRVJJT0RJQyA9IDU7CisgIH0KKyAgLy8gIk5vdyIsIGluIG1pbGxpc2Vjb25kcywgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGNsb2NrIGFzIHRoZSBvbmUgdXNlZCB0byBzZXQKKyAgLy8gdGhlICdldmVudF90aW1lX21zJyB2YWx1ZXMgaW4gdGhlIExvZ0V2ZW50IHByb3RvcyBhYm92ZS4KKyAgb3B0aW9uYWwgaW50NjQgcmVxdWVzdF90aW1lX21zID0gNDsKKyAgLy8gQ3VycmVudCB0aW1lIHNpbmNlIGJvb3QgaW4gbWlsbGlzZWNvbmRzLCBpbmNsdWRpbmcgdGltZSBzcGVudCBpbiBzbGVlcCwKKyAgLy8gYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGNsb2NrIGFzIHRoZSBvbmUgdXNlZCB0byBzZXQKKyAgLy8gdGhlICdldmVudF91cHRpbWVfbXMnIHZhbHVlcyBpbiB0aGUgTG9nRXZlbnQgcHJvdG9zIGFib3ZlLgorICBvcHRpb25hbCBpbnQ2NCByZXF1ZXN0X3VwdGltZV9tcyA9IDg7CisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5DbGllbnRJbmZvIGNsaWVudF9pbmZvID0gMTsKKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkxvZ1JlcXVlc3QuTG9nU291cmNlIGxvZ19zb3VyY2UgPSAyIFtkZWZhdWx0ID0gVU5LTk9XTl07CisgIC8vIElmIGxvZ19zb3VyY2UgaXMgbm90IHByZXNlbnQgYW5kIGxvZ19zb3VyY2VfbmFtZSBpcyBwcmVzZW50LCB0aGUgdmFsdWUgb2YKKyAgLy8gbG9nX3NvdXJjZV9uYW1lIGlzIHBhcnNlZCBhcyBhIExvZ1NvdXJjZSB2YWx1ZSBhbmQgc2V0IHRvIGxvZ19zb3VyY2UuCisgIG9wdGlvbmFsIHN0cmluZyBsb2dfc291cmNlX25hbWUgPSA2OworICAvLyBjb29raWUgZnJvbSBwc2V1ZG9ueW1vdXMgaWQgc2VydmljZSBhdCB0aGUgdGltZSB0aGUgZXZlbnQgd2FzIHBvc3RlZAorICBvcHRpb25hbCBzdHJpbmcgendpZWJhY2tfY29va2llID0gNzsKKyAgcmVwZWF0ZWQgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkxvZ0V2ZW50IGxvZ19ldmVudCA9IDM7CisgIC8vIENhbiBiZSB1c2VkIGluc3RlYWQgb2YgJ2xvZ19ldmVudCcgaW4gb3JkZXIgdG8gc2F2ZSBiYXR0ZXJ5IGluIGNhc2VzIHdoZXJlCisgIC8vIExvZ0V2ZW50IHByb3RvcyBhcmUgYWxyZWFkeSBzZXJpYWxpemVkLCBhbmQgZGVzZXJpYWxpemluZyBpcyB1bmRlc2lyYWJsZS4KKyAgLy8gSWYgdXNlZCwgdGhpcyBpcyBhIGNvbGxlY3Rpb24gb2YgYnl0ZSBzdHJlYW1zIGVhY2ggcHJvZHVjZWQgdXNpbmcgYQorICAvLyBDb2RlZE91dHB1dFN0cmVhbS4KKyAgcmVwZWF0ZWQgYnl0ZXMgc2VyaWFsaXplZF9sb2dfZXZlbnRzID0gNTsKKyAgLy8gUXVhbGl0eSBvZiBTZXJ2aWNlIHRpZXIgZm9yIGxvZyB1cGxvYWQuCisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5Rb3NUaWVyQ29uZmlndXJhdGlvbi5Rb3NUaWVyIHFvc190aWVyID0gOSBbZGVmYXVsdCA9IERFRkFVTFRdOworICAvLyBUaGUgdHlwZSBvZiBsb2cgdXBsb2FkIHNjaGVkdWxlci4KKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkxvZ1JlcXVlc3QuU2NoZWR1bGVyVHlwZSBzY2hlZHVsZXIgPSAxMDsKKyAgLy8gRGV2aWNlIHN0YXR1cy4KKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkRldmljZVN0YXR1cyBkZXZpY2Vfc3RhdHVzID0gMTE7CisgIC8vIEEgdGltZXN0YW1wIHRha2VuIGZyb20gYSBzb3VyY2UgZXh0ZXJuYWwgdG8gdGhlIGRldmljZS4gRm9yIGV4YW1wbGUsIGEgR1BTCisgIC8vIHRpbWVzdGFtcC4gVGhpcyBjYW4gYmUgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBkZXZpY2Ugd2FsbCBjbG9jaywgYnV0IGlzIG5vdAorICAvLyBndWFyYW50ZWVkIHRvIGJlLiBUaGF0IHdpbGwgZGVwZW5kIG9uIHRoZSBzb3VyY2UsIGFuZCBvbiB0aGUgZGV2aWNlCisgIC8vIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSB0aGF0IG9idGFpbnMgdGhlIHRpbWVzdGFtcC4KKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkV4dGVybmFsVGltZXN0YW1wIGV4dGVybmFsX3RpbWVzdGFtcCA9IDEyOworICAvLyBBZHZpc29yeSB0byBmb3JrIGFsbCBsb2cgZXZlbnRzIGluIHRoaXMgcmVxdWVzdCB0byBkZWJ1ZyBzdG9yYWdlIGFuZAorICAvLyBjb25zb2xlLiBUaGlzIGZpZWxkIG1heSBiZSBzZXQgb25seSBieSBlbmQgdXNlciBhY3Rpb24uCisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5Db2xsZWN0Rm9yRGVidWcgY29sbGVjdF9mb3JfZGVidWcgPSAxMzsKKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIDUzNjg3MDkxMTsKK30KKworLy8gRGV2aWNlU3RhdHVzIGNhcHR1cmVzIGRldmljZSBzdGF0dXMgaW5jbHVkaW5nIG5ldHdvcmsgY29ubmVjdGlvbiBzdGF0dXMsCisvLyBiYXR0ZXJ5IHN0YXR1cywgYW5kIGV0Yy4KKy8vIE5leHQgdGFnOiA1CittZXNzYWdlIERldmljZVN0YXR1cyB7CisgIC8vIFN0YXR1cyBvZiBhdXRvbWF0aWMgZGF0ZSBhbmQgdGltZSBzZXR0aW5nLgorICBlbnVtIEF1dG9tYXRpY1RpbWUgeworICAgIC8vIERldmljZSBpcyB1c2luZyBhbiBvbGRlciB2ZXJzaW9uIG9mIEdtc0NvcmUgKGJlZm9yZSBVKSwgb3IgdGhlcmUgd2FzIGEKKyAgICAvLyBwcm9ibGVtIGdldHRpbmcgdGhlIHNldHRpbmcuCisgICAgVU5LTk9XTiA9IDA7CisgICAgLy8gQXV0b21hdGljIGRhdGUgYW5kIHRpbWUgd2FzIG5vdCBlbmFibGVkLgorICAgIEFVVE9fVElNRV9PRkYgPSAxOworICAgIC8vIEF1dG9tYXRpYyBkYXRlIGFuZCB0aW1lIHdhcyBlbmFibGVkLgorICAgIEFVVE9fVElNRV9PTiA9IDI7CisgIH0KKyAgLy8gV2hldGhlciBkZXZpY2UgbmV0d29yayBjb25uZWN0aW9uIGlzIHVubWV0ZXJlZC4KKyAgb3B0aW9uYWwgYm9vbCBpc191bm1ldGVyZWQgPSAxOworICAvLyBXaGV0aGVyIGRldmljZSBpcyB1bmRlciBjaGFyZ2UuIFNlZSBsaW5rCisgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvbW9uaXRvcmluZy1kZXZpY2Utc3RhdGUvYmF0dGVyeS1tb25pdG9yaW5nLmh0bWwKKyAgLy8gVGhpcyBib29sZWFuIHJldHVybnMgdHJ1ZSB3aGVuIHN0YXR1cyBlcXVhbHMgdG8KKyAgLy8gQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfQ0hBUkdJTkcgfHwgQmF0dGVyeU1hbmFnZXIuQkFUVEVSWV9TVEFUVVNfRlVMTAorICBvcHRpb25hbCBib29sIGlzX2NoYXJnaW5nID0gMjsKKyAgLy8gV2hldGhlciBhdXRvbWF0aWMgZGF0ZSBhbmQgdGltZSBpcyBlbmFibGVkIG9uIHRoZSBkZXZpY2UuIFNlZSBsaW5rCisgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuR2xvYmFsLmh0bWwjQVVUT19USU1FCisgIC8vIE5vdGUsIHRoaXMgZG9lcyBub3QgZ3VhcmFudGVlIGNvcnJlY3QgZGV2aWNlIGNsb2NrIGlmIE5UUCBjbG9jayBzeW5jIGhhcworICAvLyBub3Qgb2NjdXJyZWQuCisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5EZXZpY2VTdGF0dXMuQXV0b21hdGljVGltZSBhdXRvX3RpbWVfc3RhdHVzID0gMzsKKyAgLy8gSXMgdHJ1ZSBpZiB0aGUgZGV2aWNlIGNvbnRhaW5zIGFuIGFjY291bnQgdGhhdCBoYXMgdGhlIEBnb29nbGUuY29tIGRvbWFpbi4KKyAgb3B0aW9uYWwgYm9vbCBpc19nb29nbGVyX2RldmljZSA9IDQ7Cit9CisKKy8vIEV4dGVybmFsVGltZXN0YW1wIGNhcHR1cmVzIGEgdGltZXN0YW1wIG9idGFpbmVkIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4gVGhpcworLy8gY2FuIGJlIEdQUyBvciBjbG9jayBzeW5jIG92ZXIgdGhlIG5ldHdvcmsuIFRoZSB0aW1lc3RhbXAgaXMgdHlwaWNhbGx5IG9sZCwgc28KKy8vIHRoZSBkZXZpY2UgdXB0aW1lIHdoZW4gdGhlIHRpbWVzdGFtcCB3YXMgb2J0YWluZWQgaXMgYWxzbyBpbmNsdWRlZC4gVGhlCisvLyBzb3VyY2Ugb2YgdGhpcyB0aW1lc3RhbXAgbXVzdCBndWFyYW50ZWUgdGhhdCB0aGUgdGltZXN0YW1wIGlzIG5vdCBvbGRlciB0aGFuCisvLyB0aGUgbW9zdCByZWNlbnQgZGV2aWNlIGJvb3QuCisvLyBOZXh0IHRhZzogNAorbWVzc2FnZSBFeHRlcm5hbFRpbWVzdGFtcCB7CisgIC8vIEEgdGltZXN0YW1wIGdpdmVuIGJ5IGFuIGV4dGVybmFsIHNvdXJjZS4KKyAgb3B0aW9uYWwgaW50NjQgdGltZV9tcyA9IDE7CisgIC8vIFRoZSBkZXZpY2UgdXB0aW1lIHdoZW4gdGhlIHRpbWVzdGFtcCB3YXMgcmVjb3JkZWQuCisgIG9wdGlvbmFsIGludDY0IHVwdGltZV9tcyA9IDI7CisgIC8vIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgdGhhdCBwcm92aWRlZCB0aGUgdGltZXN0YW1wLgorICBvcHRpb25hbCBzdHJpbmcgc291cmNlID0gMzsKK30KKworLy8gQ29sbGVjdEZvckRlYnVnIGluZGljYXRlcyB0aGF0IGxvZyBldmVudHMgaW4gdGhlIGNvbnRhaW5pbmcgTG9nUmVxdWVzdCBtYXkgYmUKKy8vIGZvcmtlZCB0byBhbHRlcm5hdGUgc2hvcnQgdGVybSBzdG9yYWdlIGZvciBkZWJ1ZyBhbmFseXNpcy4KK21lc3NhZ2UgQ29sbGVjdEZvckRlYnVnIHsKKyAgLy8gQ3V0LW9mZiB0aW1lIGZvciBkaXZlcnRpbmcgbG9nIGV2ZW50cyB0byBkZWJ1ZyBzdG9yYWdlIGFuZCBjb25zb2xlLiBUaGlzIGlzCisgIC8vIGEgY2xpZW50IHRpbWUgZnJvbSB0aGUgc2FtZSBjbG9jayB1c2VkIHRvIHNldCBldmVudF90aW1lX21zLiBXaGVuIGFkanVzdGVkCisgIC8vIHRvIHNlcnZlciB0aW1lLCB0aGlzIGRlZmluZXMgdGhlIGxhdGVzdCB0aW1lIGF0IHdoaWNoIGxvZ3Mgd2lsbCBiZSBmb3JrZWQKKyAgLy8gdG8gYSBkZWJ1ZyBzdG9yZSBhbmQgY29uc29sZS4gRXhwZWN0ZWQgdmFsdWVzIGFyZSBhIGZldyBkYXlzIGluIHRoZSBmdXR1cmUKKyAgLy8gdG8gYW55IHRpbWUgaW4gdGhlIHBhc3QgKHRoYXQgaXMsIGNvbGxlY3Rpb24gaGFzIHN0b3BwZWQpLgorICBvcHRpb25hbCBpbnQ2NCBjb2xsZWN0X3VudGlsX21zID0gMTsKK30KKworLy8gUW9zVGllckNvbmZpZ3VyYXRpb24gY29uZmlndXJlcyB3aGF0IFF1YWxpdHkgb2YgU2VydmljZSB0aWVyIHNob3VsZCBiZQorLy8gYXBwbGllZCB0byBhIGdpdmVuIGxvZyBzb3VyY2UuCisvLworLy8gTmV4dCB0YWc6IDMKK21lc3NhZ2UgUW9zVGllckNvbmZpZ3VyYXRpb24geworICAvLyBRdWFsaXR5IG9mIFNlcnZpY2UgdGllcnMgZm9yIENsZWFyY3V0IGxvZyB1cGxvYWQuCisgIGVudW0gUW9zVGllciB7CisgICAgLy8gVXNlIEdjbU5ldHdvcmtNYW5hZ2VyIHRvIHNjaGVkdWxlIGxvZ3MgdXBsb2FkIGV2ZXJ5IGhvdXIuCisgICAgREVGQVVMVCA9IDA7CisgICAgLy8gTG9nIHdpbGwgYmUgdXBsb2FkZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG9uIGFuIHVubWV0ZXJlZCBuZXR3b3JrLgorICAgIC8vIE5vdGUgdGhhdCBkZXZpY2VzIHRoYXQgcmFyZWx5IG9yIG5ldmVyIGNvbm5lY3QgdG8gdW5tZXRlcmVkIG5ldHdvcmtzCisgICAgLy8gd2lsbCBlbmQgdXAgbG9zaW5nIG1hbnkgb3IgYWxsIG9mIHRoZXNlIG1lc3NhZ2VzLgorICAgIFVOTUVURVJFRF9PTkxZID0gMTsKKyAgICAvLyBTaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBvbmUsIGJ1dCBpZiBhbiB1cGxvYWQgb3Bwb3J0dW5pdHkgZG9lcyBub3QgYXJpc2UKKyAgICAvLyBuZWFyIHRvIHRoZSBlbmQgb2YgdGhlIGRheSwgQ2xlYXJjdXQgd2lsbCB1cGxvYWQgdGhlIGRhdGEgYXMgc29vbiBhcworICAgIC8vIHRoZSBkZXZpY2UgaXMgb25saW5lIChldmVuIGlmIG9uIGEgbWV0ZXJlZCBuZXR3b3JrKS4KKyAgICBVTk1FVEVSRURfT1JfREFJTFkgPSAyOworICAgIC8vIExvZyB3aWxsIGJlIHVwbG9hZGVkIGFzIHNvb24gYXMgdGhlIGRldmljZSBpcyB1c2luZyB0aGUgcmFkaW8uCisgICAgLy8gSWYgbm90LCBsb2cgd2lsbCBiZSB1cGxvYWRlZCBhdCB0aGUgbmV4dCBERUZBVUxULXRpZXIgdXBsb2FkIHRpbWUuCisgICAgRkFTVF9JRl9SQURJT19BV0FLRSA9IDM7CisgICAgLy8gVGhpcyBpcyBmb3Igc2VydmVyIHRvIG92ZXJyaWRlIGNsaWVudCBRb3NUaWVyIHNldHRpbmcuCisgICAgLy8gSWYgYSBjZXJ0YWluIGxvZyBzb3VyY2UncyBRb3NUaWVyIGlzIHNldCB0byBORVZFUiwgdGhlbiBDbGVhcmN1dCB3aWxsCisgICAgLy8gZHJvcCBsb2cgZXZlbnRzIG9mIHRoYXQgbG9nIHNvdXJjZSBpbW1lZGlhdGVseSBhbmQgd29uJ3Qgc2F2ZSB0aGVtIGluCisgICAgLy8gbG9nIHN0b3JlLgorICAgIE5FVkVSID0gNDsKKyAgfQorICBvcHRpb25hbCBzdHJpbmcgbG9nX3NvdXJjZV9uYW1lID0gMTsKKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLlFvc1RpZXJDb25maWd1cmF0aW9uLlFvc1RpZXIgcW9zX3RpZXIgPSAyOworfQorCisvLyBOZXh0IHRhZzogMworbWVzc2FnZSBRb3NUaWVyc092ZXJyaWRlIHsKKyAgLy8gUXVhbGl0eSBvZiBTZXJ2aWNlIHRpZXJzIGVuZm9yY2VkIGJ5IHNlcnZlciBmb3Igb3ZlcnJpZGluZyBjbGllbnQKKyAgLy8gcW9zX3RpZXIgc2V0dGluZyBpbiBldmVudCBsb2dnaW5nLgorICAvLyBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIHNlcnZlciBpcyBidXJkZW5lZCB3aXRoIGZhc3QgcW9zIHRpZXJzLgorICByZXBlYXRlZCAud2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2cuUW9zVGllckNvbmZpZ3VyYXRpb24gcW9zX3RpZXJfY29uZmlndXJhdGlvbiA9IDE7CisgIC8vIFRoZSBmaW5nZXJwcmludCBvZiB0aGUgcW9zX3RpZXJfY29uZmlndXJhdGlvbiBmaWVsZC4KKyAgb3B0aW9uYWwgaW50NjQgcW9zX3RpZXJfZmluZ2VycHJpbnQgPSAyOworfQorCisvLyBOZXh0IHRhZzogMgorbWVzc2FnZSBMb2dTb3VyY2VCYXRjaGluZ0JsYWNrbGlzdCB7CisgIHJlcGVhdGVkIHN0cmluZyBsb2dfc291cmNlX25hbWUgPSAxOworfQorCisvLyBOZXh0IHRhZzogNQorbWVzc2FnZSBMb2dSZXNwb25zZSB7CisgIC8vIENsaWVudCBzaG91bGQgd2FpdCBmb3IgbmV4dF9yZXF1ZXN0X3dhaXRfbWlsbGlzIGJlZm9yZSBzZW5kaW5nIHRoZSBuZXh0CisgIC8vIGxvZyByZXF1ZXN0LgorICBvcHRpb25hbCBpbnQ2NCBuZXh0X3JlcXVlc3Rfd2FpdF9taWxsaXMgPSAxIFtkZWZhdWx0ID0gLTFdOworICAvLyBRdWFsaXR5IG9mIFNlcnZpY2UgdGllcnMgZW5mb3JjZWQgYnkgc2VydmVyIGZvciBvdmVycmlkaW5nIGNsaWVudAorICAvLyBxb3NfdGllciBzZXR0aW5nIGluIGV2ZW50IGxvZ2dpbmcuCisgIG9wdGlvbmFsIC53aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZy5Rb3NUaWVyc092ZXJyaWRlIHFvc190aWVyID0gMzsKKyAgLy8gRW5mb3JjZWQgYnkgc2VydmVyIGZvciB0ZWxsaW5nIENsZWFyY3V0IHVwbG9hZGVyIG5vdCB0byBncm91cCBsb2cgZXZlbnRzCisgIC8vIGZyb20gY2VydGFpbiBsb2cgc291cmNlcy4gSWYgaXQgaXMgbm90IHNldCwgY2xpZW50IHdpbGwgdHJ5IHRvIGdyb3VwIGxvZworICAvLyBldmVudHMgdG9nZXRoZXIgd2l0aCB0aGUgc2FtZSB1cGxvYWQgY29udGV4dCB3aXRob3V0IGNvbnNpZGVyaW5nIGxvZworICAvLyBzb3VyY2VzIHJlc3RyaWN0aW9ucy4gVXBsb2FkIGNvbnRleHQgaW5jbHVkZXMgZm9sbG93aW5nIGluZm8uCisgIC8vIDEuIFBsYXlMb2dnZXJDb250ZXh0LmlzQW5vbnltb3VzCisgIC8vIDIuIFBsYXlMb2dnZXJDb250ZXh0LnVwbG9hZEFjY291bnROYW1lCisgIC8vIDMuIFBsYXlMb2dnZXJDb250ZXh0Lnp3aWViYWNrQ29va2llCisgIC8vIDQuIFBsYXlMb2dnZXJDb250ZXh0LnFvc1RpZXIKKyAgb3B0aW9uYWwgLndpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nLkxvZ1NvdXJjZUJhdGNoaW5nQmxhY2tsaXN0IGxvZ19zb3VyY2VfYmF0Y2hpbmdfYmxhY2tsaXN0ID0gNDsKK30KKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucHJvdG8gYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2QwMTI0NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wcm90bwpAQCAtMCwwICsxLDE2NzMgQEAKKy8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRS4gRE8gTk9UIEVESVQgRElSRUNUTFkuCisvLyBHZW5lcmF0ZWQgYnkgLy93aXJlbGVzcy9hbmRyb2lkL3BsYXkvcGxheWxvZy90b29sczpzdHJpcF9wcm90b19maWxlCisvLyBmcm9tIGxvZ3MvcHJvdG8vd2lyZWxlc3MvYW5kcm9pZC9zZGsvc3RhdHMvc3R1ZGlvX3N0YXRzLnByb3RvCisvLyBSZWdlbmVyYXRlIGJ5IHJ1bm5pbmcKKy8vICAgYmxhemUgYnVpbGQgLy9sb2dzL3Byb3RvL3dpcmVsZXNzL2FuZHJvaWQvc2RrL3N0YXRzOnN0dWRpb19zdGF0c19zdHJpcHBlZAorCisvLyBOT1RFOiBEbyBub3QgdXNlIG9uZW9mIGluIHRoaXMgcHJvdG8gYXMgd2UgbmVlZCB0byBjb21waWxlIGl0IHdpdGggdGhlCisvLyBvcGVuIHNvdXJjZSAyLjUgdmVyc2lvbiBvZiB0aGUgcHJvdG9idWYgY29tcGlsZXIgZm9yIEFuZHJvaWQgU3R1ZGlvIHdoaWNoCisvLyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvbmVvZiBmZWF0dXJlLgorc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZF9zdHVkaW87CisKK29wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS53aXJlbGVzcy5hbmRyb2lkLnNkay5zdGF0cyI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiQW5kcm9pZFN0dWRpb1N0YXRzIjsKKworbWVzc2FnZSBBbmRyb2lkU3R1ZGlvRXZlbnQgeworICAvLyBEZXNjcmliZXMgYSBncm91cCBvZiBldmVudCBraW5kcyByZWxhdGVkIHRvIGVhY2ggb3RoZXIuCisgIC8vIFRoaXMgaXMgcmVkdW5kYW50IGluIHRoZSBwcmVzZW5jZSBvZiBFdmVudEtpbmQgKyBldmVudCBzcGVjaWZpYyBtZXNzYWdlLAorICAvLyBhbmQgaXMgb25seSBuZWNlc3NhcnkgZm9yIGV2ZW50cyBvcmlnaW5hbGx5IHNlbnQgdG8gR0EuCisgIGVudW0gRXZlbnRDYXRlZ29yeSB7CisgICAgLy8gVGhlIGV2ZW50IHdhcyBub3QgZ3JvdXBlZCBpbnRvIGFueSBzcGVjaWZpYyBjYXRlZ29yeSAoZGVmYXVsdCkuCisgICAgTk9fRVZFTlRfQ0FURUdPUlkgPSAwOworICAgIC8vIFRoZSBldmVudCBpcyByZWxhdGVkIHRvIGRlcGxveW1lbnQgdG8gYSBkZXZpY2Ugb3IgZW11bGF0b3IuCisgICAgREVQTE9ZTUVOVCA9IDE7CisgICAgLy8gU3RhdHMgb24gYnVpbGRzIGZyb20gU3R1ZGlvLgorICAgIFNUVURJT19CVUlMRCA9IDI7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gdXNhZ2Ugb2YgJ0dvb2dsZSBEZXZlbG9wZXIgU2VydmljZXMnCisgICAgLy8gaW5zaWRlIEFuZHJvaWQgU3R1ZGlvLgorICAgIERFVkVMT1BFUl9TRVJWSUNFUyA9IDM7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gaW50ZXJhY3Rpb24gYmV0d2VlbiBBbmRyb2lkIFN0dWRpbyBhbmQgR3JhZGxlLgorICAgIEdSQURMRV9TWU5DID0gNDsKKyAgICAvLyBUaGUgZXZlbnQgaXMgcmVsYXRlZCB0byBQZXJmb3JtYW5jZSBQcm9maWxpbmcuCisgICAgUFJPRklMSU5HID0gNTsKKyAgICAvLyBUaGUgZXZlbnQgaXMgcmVsYXRlZCB0byBQZXJmb3JtYW5jZSBNb25pdG9yaW5nLgorICAgIE1PTklUT1IgPSA2OworICAgIC8vIFRoZSBldmVudCBpcyByZWxhdGVkIHRvIHRoZSBTREsgTWFuYWdlci4KKyAgICBTREtfTUFOQUdFUiA9IDc7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gcHJvamVjdC9maWxlIHRlbXBsYXRlcy4KKyAgICBURU1QTEFURSA9IDg7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gVGhlbWUgRWRpdG9yLgorICAgIFRIRU1FX0VESVRPUiA9IDk7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gQXBwIEluZGV4aW5nIGludGVncmF0aW9uLgorICAgIC8vIChodHRwOi8vZ28vc3R1ZGlvLWFwcC1pbmRleGluZykKKyAgICBBUFBfSU5ERVhJTkcgPSAxMDsKKyAgICAvLyBUaGUgZXZlbnQgaXMgcmVsYXRlZCB0byBDKysgZGVidWdnaW5nLgorICAgIExMREIgPSAxMTsKKyAgICAvLyBUaGUgZXZlbnQgaXMgcmVsYXRlZCB0byBHb29nbGUgQ2xvdWQgVGVzdCBMYWIgaW50ZWdyYXRpb24uCisgICAgQ0xPVURfVEVTVElORyA9IDEyOworICAgIC8vIFRoZSBldmVudCBpcyBhIHJlZ3VsYXIgcGluZyBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KKyAgICBQSU5HID0gMTM7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gcnVubmluZyB0ZXN0cy4KKyAgICBURVNUUyA9IDE0OworICAgIC8vIFRoZSBldmVudCBpcyBhIG1ldGEgZXZlbnQgcmVwb3J0aW5nIG1ldHJpY3Mgb24gbWV0cmljcy4KKyAgICBNRVRBID0gMTU7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gdGhlIEVtdWxhdG9yIFVJCisgICAgRU1VTEFUT1JfVUkgPSAxNjsKKyAgICAvLyBUaGUgZXZlbnQgZGVzY3JpYmVzIFN5c3RlbSBJbmZvCisgICAgU1lTVEVNID0gMTc7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gdGhlIFByb2plY3QgU3RydWN0dXJlIERpYWxvZy4KKyAgICBQUk9KRUNUX1NUUlVDVFVSRV9ESUFMT0cgPSAxODsKKyAgICAvLyBUaGUgZXZlbnQgaXMgZnJvbSB0aGUgQW5kcm9pZCBHcmFkbGUgcGx1Z2luLgorICAgIEdSQURMRSA9IDE5OworICAgIC8vIFRoZSBldmVudCBpcyByZWxhdGVkIHRvIHRoZSBGaXJlYmFzZSBhc3Npc3RhbnQuCisgICAgRklSRUJBU0VfQVNTSVNUQU5UID0gMjA7CisgICAgLy8gVGhlIGV2ZW50IGlzIHJlbGF0ZWQgdG8gdGhlIEdQVSBQcm9maWxlci4KKyAgICBHUFVfUFJPRklMRVIgPSAyMTsKKyAgICAvLyB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byB0aGUgdGVzdCByZWNvcmRlciAoQ2Fzc2V0dGUpCisgICAgVEVTVF9SRUNPUkRFUiA9IDIyOworICAgIC8vIHRoZSBldmVudCBpcyByZWxhdGVkIHRvIHRoZSBBbmRyb2lkIFN0dWRpbyBVSS4KKyAgICBTVFVESU9fVUkgPSAyMzsKKyAgfQorICAvLyBTcGVjaWZpYyBraW5kIG9mIGV2ZW50LCBwcmltYXJ5IHNlcGFyYXRpb24ga2V5IG9mIGFsbCBBbmRyb2lkIFN0dWRpbworICAvLyByZWxhdGVkIGV2ZW50cy4KKyAgZW51bSBFdmVudEtpbmQgeworICAgIFVOS05PV05fRVZFTlRfS0lORCA9IDA7CisgICAgLy8gQW4gQVBLIChhbmRyb2lkIGFwcGxpY2F0aW9uKSBpcyBkZXBsb3llZC4KKyAgICBERVBMT1lNRU5UX0FQSyA9IDE7CisgICAgLy8gQSBkZXBsb3ltZW50IHRvIHRoZSBlbXVsYXRvci4KKyAgICBERVBMT1lNRU5UX1RPX0VNVUxBVE9SID0gMjsKKyAgICAvLyBUaGUgZGV2ZWxvcGVyIGFkZGVkIGEgR29vZ2xlIERldmVsb3BlciBTZXJ2aWNlIHRvIHRoZWlyIGFwcC4KKyAgICBERVZFTE9QRVJfU0VSVklDRVNfSU5TVEFMTEVEID0gMzsKKyAgICAvLyBUaGUgZGV2ZWxvcGVyIHJlbW92ZWQgIGEgR29vZ2xlIERldmVsb3BlciBTZXJ2aWNlIGZyb20gdGhlaXIgYXBwLgorICAgIERFVkVMT1BFUl9TRVJWSUNFU19SRU1PVkVEID0gNDsKKyAgICAvLyBBIHN5bmMgYmV0d2VlbiBBbmRyb2lkIFN0dWRpbyBhbmQgR3JhZGxlIHN0YXJ0ZWQuCisgICAgR1JBRExFX1NZTkNfU1RBUlRFRCA9IDU7CisgICAgLy8gQSBzeW5jIGJldHdlZW4gQW5kcm9pZCBTdHVkaW8gYW5kIEdyYWRsZSBlbmRlZC4KKyAgICBHUkFETEVfU1lOQ19FTkRFRCA9IDY7CisgICAgLy8gQSBzeW5jIGJldHdlZW4gQW5kcm9pZCBTdHVkaW8gYW5kIEdyYWRsZSB3YXMgc2tpcHBlZC4KKyAgICBHUkFETEVfU1lOQ19TS0lQUEVEID0gNzsKKyAgICAvLyBBIHN5bmMgYmV0d2VlbiBBbmRyb2lkIFN0dWRpbyBhbmQgR3JhZGxlIGZhaWxlZC4KKyAgICBHUkFETEVfU1lOQ19GQUlMVVJFID0gODsKKyAgICAvLyBBIHN5bmMgYmV0d2VlbiBBbmRyb2lkIFN0dWRpbyBhbmQgR3JhZGxlIEMrKyBzdXBwb3J0IGNvbXBsZXRlZC4KKyAgICBHUkFETEVfQ1BQX1NZTkNfQ09NUExFVEVEID0gOTsKKyAgICAvLyBQZXJmb3JtYW5jZSBwcm9maWxpbmcgY2FwdHVyZSBzdGFydGVkLgorICAgIFBST0ZJTElOR19DQVBUVVJFID0gMTA7CisgICAgLy8gUGVyZm9ybWFuY2UgcHJvZmlsaW5nIGNhcHR1cmUgb3BlbmVkIGluIHRoZSBJREUuCisgICAgUFJPRklMSU5HX09QRU4gPSAxMTsKKyAgICAvLyBDb252ZXJzaW9uIG9mIGhwcm9mIHByb2ZpbGluZyBkYXRhIGluIHByb2dyZXNzLgorICAgIFBST0ZJTElOR19DT05WRVJUX0hQUk9GID0gMTI7CisgICAgLy8gQW5hbHlzaXMgb2YgdGhlIHByb2ZpbGluZyBkYXRhIGluIHByb2dyZXNzLgorICAgIFBST0ZJTElOR19BTkFMWVNJU19SVU4gPSAxMzsKKyAgICAvLyBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGhhcyBiZWVuIGFjdGl2YXRlZC4KKyAgICBNT05JVE9SX0FDVElWQVRFRCA9IDE0OworICAgIC8vIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgaXMgcnVubmluZy4KKyAgICBNT05JVE9SX1JVTk5JTkcgPSAxNTsKKyAgICAvLyBUaGUgdXNlciBzZWxlY3RlZCBhbiBhY3Rpb24gZnJvbSB0aGUgU0RLIE1hbmFnZXIgVG9vbGJhci4KKyAgICBTREtfTUFOQUdFUl9UT09MQkFSX0NMSUNLRUQgPSAxNjsKKyAgICAvLyBUaGUgc3RhbmRhbG9uZSBTREsgTWFuYWdlciB3YXMgbGF1bmNoZWQuCisgICAgU0RLX01BTkFHRVJfU1RBTkRBTE9ORV9MQVVOQ0hFRCA9IDE3OworICAgIC8vIFRoZSBidWlsdC1pbiBTREsgTWFuYWdlciB3YXMgbGF1bmNoZWQuCisgICAgU0RLX01BTkFHRVJfTE9BREVEID0gMTg7CisgICAgLy8gQSBuZXcgZmlsZS9wcm9qZWN0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSB0ZW1wbGF0ZS4KKyAgICBURU1QTEFURV9SRU5ERVIgPSAxOTsKKyAgICAvLyBVc2VyIG9wZW5lZCB0aGUgVGhlbWUgRWRpdG9yLgorICAgIFRIRU1FX0VESVRPUl9PUEVOID0gMjA7CisgICAgLy8gQSBkZWVwIGxpbmsgd2FzIGNyZWF0ZWQgZm9yIGFwcCBpbmRleGluZy4KKyAgICBBUFBfSU5ERVhJTkdfREVFUF9MSU5LX0NSRUFURUQgPSAyMTsKKyAgICAvLyBBbiBhcGkgY29kZSB3YXMgY3JlYXRlZCBmb3IgYXBwIGluZGV4aW5nLgorICAgIEFQUF9JTkRFWElOR19BUElfQ09ERV9DUkVBVEVEID0gMjI7CisgICAgLy8gQW4gYXBwIGluZGV4aW5nIGRlZXAgbGluayB3YXMgbGF1bmNoZWQuCisgICAgQVBQX0lOREVYSU5HX0RFRVBfTElOS19MQVVOQ0hFRCA9IDIzOworICAgIC8vIEFuIGFwcCBpbmRleGluZyBxdWljayBmaXggd2FzIGFwcGxpZWQuCisgICAgQVBQX0lOREVYSU5HX1RSSUdHRVJfUVVJQ0tGSVggPSAyNDsKKyAgICAvLyBBcHAgSW5kZXhpbmcgRmV0Y2ggQXMgR29vZ2xlIGRpYWxvZyBpcyBzaG93bi4KKyAgICBBUFBfSU5ERVhJTkdfU0hPV19GRUFHX0RJQUxPRyA9IDI1OworICAgIC8vIEFwcCBJbmRleGluZyBGZXRjaCBBcyBHb29nbGUgdGFzayBoYXMgc3RhcnRlZC4KKyAgICBBUFBfSU5ERVhJTkdfU1RBUlRfRkVBR19UQVNLID0gMjY7CisgICAgLy8gTmF0aXZlIGRlYnVnZ2VyIGlzIGxhdW5jaGVkLgorICAgIExMREJfTEFVTkNIRUQgPSAyNzsKKyAgICAvLyBOYXRpdmUgZGVidWdnZXIgc2Vzc2lvbiBoYXMgc3RhcnRlZC4KKyAgICBMTERCX1NFU1NJT05fU1RBUlRFRCA9IDI4OworICAgIC8vIE5hdGl2ZSBkZWJ1Z2dlciBzZXNzaW9uIGhhcyBmYWlsZWQuCisgICAgTExEQl9TRVNTSU9OX0ZBSUxFRCA9IDI5OworICAgIC8vIE5hdGl2ZSBkZWJ1Z2dlciBzZXNzaW9uIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIExMREJfU0VTU0lPTl9DT01QTEVURUQgPSAzMDsKKyAgICAvLyBTREsgTWFuYWdlciBRdWlja0ZpeCBXaXphcmQgaXMgaW52b2tlZCB0byBpbnN0YWxsIExMREIgcGFja2FnZS4KKyAgICBMTERCX0lOU1RBTExfU1RBUlRFRCA9IDMxOworICAgIC8vIFNESyBNYW5hZ2VyIFF1aWNrRml4IFdpemFyZCBpbnZvY2F0aW9uIHRvIGluc3RhbGwgTExEQiBwYWNrYWdlIGZhaWxlZC4KKyAgICBMTERCX0lOU1RBTExfRkFJTEVEID0gMzI7CisgICAgLy8gU0RLIE1hbmFnZXIgUXVpY2tGaXggV2l6YXJkIGludm9jYXRpb24gdG8gaW5zdGFsbCBMTERCIHBhY2thZ2UgY29tcGxldGVkCisgICAgLy8gc3VjY2Vzc2Z1bGx5LgorICAgIExMREJfSU5TVEFMTF9DT01QTEVURUQgPSAzMzsKKyAgICAvLyBBIHdhdGNocG9pbnQgd2FzIGFkZGVkIHRvIG5hdGl2ZSBjb2RlLgorICAgIExMREJfU0VTU0lPTl9VU0VEX1dBVENIUE9JTlRTID0gMzQ7CisgICAgLy8gQSBDbG91ZCBEZXZpY2Ugd2FzIGNvbmZpZ3VyZWQgZm9yIENsb3VkIFRlc3RpbmcuCisgICAgQ0xPVURfVEVTVElOR19DT05GSUdVUkVfQ0xPVURfREVWSUNFID0gMzU7CisgICAgLy8gQSBNYXRyaXggb2YgQ2xvdWQgRGV2aWNlcyB3YXMgY29uZmlndXJlZCBmb3IgQ2xvdWQgVGVzdGluZy4KKyAgICBDTE9VRF9URVNUSU5HX0NPTkZJR1VSRV9NQVRSSVggPSAzNjsKKyAgICAvLyBBIENsb3VkIERldmljZXMgd2FzIGxhdW5jaGVkIGZvciBDbG91ZCBUZXN0aW5nLgorICAgIENMT1VEX1RFU1RJTkdfTEFVTkNIX0NMT1VEX0RFVklDRSA9IDM3OworICAgIC8vIEEgTWF0cml4IG9mIENsb3VkIERldmljZXMgd2FzIHJ1biBmb3IgQ2xvdWQgVGVzdGluZy4KKyAgICBDTE9VRF9URVNUSU5HX1JVTl9URVNUX01BVFJJWCA9IDM4OworICAgIC8vIENsb3VkIFRlc3RpbmcgcmVwb3J0ZWQgYSBiYWNrZW5kIGVycm9yLgorICAgIENMT1VEX1RFU1RJTkdfQkFDS0VORF9FUlJPUiA9IDM5OworICAgIC8vIEEgRGVidWcgc2Vzc2lvbiB3YXMgbGF1bmNoZWQgZnJvbSBDbG91ZCBUZXN0aW5nIHJlc3VsdHMuCisgICAgQ0xPVURfVEVTVElOR19ERUJVR19GUk9NX1JFU1VMVFMgPSA0MDsKKyAgICAvLyBUaGUgY29tcGFyZSBzY3JlZW5zaG90cyB3aW5kb3cgd2FzIG9wZW5lZCBmcm9tIGEgQ2xvdWQgVGVzdGluZyBydW4uCisgICAgQ0xPVURfVEVTVElOR19DT01QQVJFX1NDUkVFTlNIT1RTX09QRU5FRCA9IDQxOworICAgIC8vIFN0dWRpbyBjcmFzaCBzdGF0aXN0aWNzIHdlcmUgc2VudC4KKyAgICBTVFVESU9fQ1JBU0ggPSA0MjsKKyAgICAvLyBBIEdyYWRsZSBCdWlsZCB3YXMgcnVuIGFuZCBzdGF0aXN0aWNzIGFyZSBhdmFpbGFibGUuCisgICAgR1JBRExFX0JVSUxEX0RFVEFJTFMgPSA0NDsKKyAgICAvLyBTdGF0cyBvbiBJbnN0YW50IFJ1bi4KKyAgICBJTlNUQU5UX1JVTiA9IDQ1OworICAgIC8vIERhaWx5IEFuZHJvaWQgU3R1ZGlvIHBpbmcgd2l0aCB2ZXJzaW9uICYgb3MgZGV0YWlscy4KKyAgICBTVFVESU9fUElORyA9IDQ2OworICAgIC8vIERhaWx5IGVtdWxhdG9yIHBpbmcgd2l0aCB2ZXJzaW9uICYgb3MgZGV0YWlscy4KKyAgICBFTVVMQVRPUl9QSU5HID0gNDc7CisgICAgLy8gTWV0cmljcyBvbiBNZXRyaWNzLgorICAgIE1FVEFfTUVUUklDUyA9IDQ4OworICAgIC8vIFVzZXIgcmFuIHRlc3RzLgorICAgIFRFU1RfUlVOID0gNTA7CisgICAgLy8gVXNlciBjbGlja2VkIHNvbWV0aGluZyBpbiB0aGUgRW11bGF0b3IgVUkuCisgICAgRU1VTEFUT1JfVUlfRVZFTlQgPSA1MTsKKyAgICAvLyBJbmZvcm1hdGlvbiBvbiB0aGUgaG9zdCBPUydzIGh5cGVydmlzb3Igc3VwcG9ydC4KKyAgICBIWVBFUlZJU09SID0gNTI7CisgICAgLy8gUHJvdmlkZXMgaW5mbyBvbiB0aGUgRW11bGF0b3IgSG9zdAorICAgIEVNVUxBVE9SX0hPU1QgPSA1MzsKKyAgICAvLyBWYXJpb3VzIFVJIGV2ZW50cyBpbiB0aGUgUHJvamVjdCBTdHJ1Y3R1cmUgRGlhbG9nLgorICAgIFBST0pFQ1RfU1RSVUNUVVJFX0RJQUxPR19PUEVOID0gNTQ7CisgICAgUFJPSkVDVF9TVFJVQ1RVUkVfRElBTE9HX1NBVkUgPSA1NTsKKyAgICBQUk9KRUNUX1NUUlVDVFVSRV9ESUFMT0dfVE9QX1RBQl9DTElDSyA9IDU2OworICAgIFBST0pFQ1RfU1RSVUNUVVJFX0RJQUxPR19UT1BfVEFCX1NBVkUgPSA1NzsKKyAgICBQUk9KRUNUX1NUUlVDVFVSRV9ESUFMT0dfTEVGVF9OQVZfQ0xJQ0sgPSA1ODsKKyAgICBQUk9KRUNUX1NUUlVDVFVSRV9ESUFMT0dfTEVGVF9OQVZfU0FWRSA9IDU5OworICAgIC8vIEEgZ3JhZGxlIGJ1aWxkIHByb2ZpbGUKKyAgICBHUkFETEVfQlVJTERfUFJPRklMRSA9IDYwOworICAgIC8vIFRoZSBMTERCIEZyb250ZW5kIGhhcyB1bmV4cGVjdGVkbHkgZXhpdGVkCisgICAgTExEQl9GUk9OVEVORF9FWElURUQgPSA2MTsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IGNyZWF0ZWQgYSBwcm9qZWN0LgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9QUk9KRUNUX0NSRUFURUQgPSA2MjsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IGZhaWxlZCB0byBjcmVhdGUgYSBwcm9qZWN0LgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9QUk9KRUNUX0NSRUFURV9GQUlMRUQgPSA2MzsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IHVwZ3JhZGVkIGEgcHJvamVjdC4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfUFJPSkVDVF9VUEdSQURFRCA9IDY0OworICAgIC8vIFRoZSBGaXJlYmFzZSBhc3Npc3RhbnQgZmFpbGVkIHRvIHVwZ3JhZGUgYSBwcm9qZWN0LgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9QUk9KRUNUX1VQR1JBREVfRkFJTEVEID0gNjY7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCBmYWlsZWQgdG8gY3JlYXRlIGEgY29uZmlnLgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9QUk9KRUNUX0NPTkZJR19DUkVBVEVfRkFJTEVEID0gNjc7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCB1cGRhdGVkIGEgcHJvamVjdC4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfUFJPSkVDVF9VUERBVEVEID0gNjg7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCBmYWlsZWQgdG8gdXBkYXRlIGEgcHJvamVjdC4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfUFJPSkVDVF9VUERBVEVfRkFJTEVEID0gNjk7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCBmYWlsZWQgdG8gd3JpdGUgdGhlIHByb2plY3QgY29uZmlnLgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9QUk9KRUNUX0NPTkZJR19XUklURV9GQUlMRUQgPSA3MDsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IGZhaWxlZCBhcyB0aGUgdXNlciBkaWQgbm90IGFjY2VwdCB0aGUgVE9TLgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9UT1NfRkFJTEVEID0gNzE7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCBpcyB0cnlpbmcgdG8gbG9naW4uCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX0FUVEVNUFRfTE9HSU4gPSA3MjsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IHN1Y2Nlc3NmdWxseSBsb2dnZWQgaW4uCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX0xPR0lOX1NVQ0NFU1MgPSA3MzsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IHNob3dlZCB0aGUgZGlhbG9nIHRvIG9mZmVyIHRvIHJlY29ubmVjdC4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfUkVDT05ORUNUX0RJQUxPR19TWU5DID0gNzQ7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCB3YXMgcmVxdWVzdGVkIHRvIGNvbm5lY3QgdG8gdGhlIHNlcnZlci4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfQ09OTkVDVF9SRVFVRVNURUQgPSA3NTsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IHBhbmVsIHdhcyBvcGVuZWQuCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX09QRU4gPSA3NjsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IGNvbm5lY3QgZGlhbG9nIHdhcyBvcGVuZWQuCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX0NPTk5FQ1RfRElBTE9HX09QRU5FRCA9IDc3OworICAgIC8vIFRoZSBGaXJlYmFzZSBhc3Npc3RhbnQgY29ubmVjdCBkaWFsb2cgd2FzIGFza2VkIHRvIGNvbm5lY3QuCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX0NPTk5FQ1RfRElBTE9HX1NZTkMgPSA3ODsKKyAgICAvLyBUaGUgRmlyZWJhc2UgYXNzaXN0YW50IHByZXNlbnRlZCBhbiBlcnJvciB0byB0aGUgdXNlci4KKyAgICBGSVJFQkFTRV9BU1NJU1RBTlRfRVJST1JfUFJFU0VOVEVEID0gNzk7CisgICAgLy8gVGhlIEZpcmViYXNlIGFzc2lzdGFudCBlbmNvdW50ZWQgYW4gZXJyb3IgYnV0IGRpZG4ndCBpbmZvcm0gdGhlIHVzZXIuCisgICAgRklSRUJBU0VfQVNTSVNUQU5UX1NJTEVOVF9FUlJPUiA9IDgwOworICAgIC8vIFRoZSBGaXJlYmFzZSBhc3Npc3RhbnQgcmVjb25uZWN0IGRpYWxvZyB3YXMgb3BlbmVkLgorICAgIEZJUkVCQVNFX0FTU0lTVEFOVF9SRUNPTk5FQ1RfRElBTE9HX09QRU5FRCA9IDgxOworICAgIC8vIFRoZSBHUFUgRGVidWdnZXIgdHJhY2luZyBoYWQgYW4gaW5pdGlhbGl6YXRpb24gZmFpbHVyZS4KKyAgICBHRlhfVFJBQ0VfSU5JVF9FUlJPUiA9IDgyOworICAgIC8vIFRoZSBHUFUgRGVidWdnZXIgdHJhY2luZyB3YXMgY2xvc2VkLgorICAgIEdGWF9UUkFDRV9DTE9TRUQgPSA4MzsKKyAgICAvLyBUaGUgR1BVIERlYnVnZ2VyIHRyYWNpbmcgaGFkIGEgcGFyYW1ldGVyIGVkaXRlZC4KKyAgICBHRlhfVFJBQ0VfUEFSQU1FVEVSX0VESVRFRCA9IDg0OworICAgIC8vIFRoZSBHUFUgRGVidWdnZXIgdHJhY2luZyB3YXMgc3RhcnRlZC4KKyAgICBHRlhfVFJBQ0VfVFJBQ0VfU1RBUlRFRCA9IDg1OworICAgIC8vIFRoZSBHUFUgRGVidWdnZXIgdHJhY2luZyB3YXMgc3RvcHBlZC4KKyAgICBHRlhfVFJBQ0VfVFJBQ0VfU1RPUFBFRCA9IDg2OworICAgIC8vIEEgVUkgY29tbWFuZCBpbmZsdWVuY2luZyB0aGUgdGhlIEdQVSBEZWJ1Z2dlciB3YXMgc2VsZWN0ZWQuCisgICAgR0ZYX1RSQUNFX0NPTU1BTkRfU0VMRUNURUQgPSA4NzsKKyAgICAvLyBBIGxpbmsgZnJvbSAgdGhlIEdQVSBEZWJ1Z2dlciB0cmFjaW5nIHJlc3VsdHMgd2FzIGNsaWNrZWQuCisgICAgR0ZYX1RSQUNFX0xJTktfQ0xJQ0tFRCA9IDg4OworICAgIC8vIEEgbWVtb3J5IHNuYXBzaG90IGZyb20gIHRoZSBHUFUgRGVidWdnZXIgdHJhY2luZyByZXN1bHRzIHdhcyBjbGlja2VkLgorICAgIEdGWF9UUkFDRV9NRU1PUllfVklFV0VEID0gODk7CisgICAgLy8gQSB0ZXh0dXJlIGZyb20gdGhlIEdQVSBEZWJ1Z2dlciB0cmFjaW5nIHJlc3VsdHMgd2FzIHZpZXdlZC4KKyAgICBHRlhfVFJBQ0VfVEVYVFVSRV9WSUVXRUQgPSA5MDsKKyAgICAvLyBBICJsZWdhY3kiIEludGVsbGlKIHN0eWxlIHByb2plY3Qgd2FzIGxvYWRlZC4KKyAgICBMRUdBQ1lfSURFQV9BTkRST0lEX1BST0pFQ1QgPSA5MTsKKyAgICAvLyBUaGUgdXNlciByZXF1ZXN0ZWQgdGhlIHRlc3QgcmVjb3JkZXIgdG8gZ2VuZXJhdGUgYSB0ZXN0IGNsYXNzLgorICAgIFRFU1RfUkVDT1JERVJfR0VORVJBVEVfVEVTVF9DTEFTUyA9IDkyOworICAgIC8vIFRoZSB0ZXN0IHJlY29yZGVyIGZhaWxlZCBhcyB0aGUgcHJvamVjdCBpcyBtaXNzaW5nIGVzcHJlc3NvIGRlcGVuZGVuY2llcy4KKyAgICBURVNUX1JFQ09SREVSX01JU1NJTkdfRVNQUkVTU09fREVQRU5ERU5DSUVTID0gOTM7CisgICAgLy8gVGhlIHRlc3QgcmVjb3JkZXIgZmFpbGVkIGFzIHRoZSBpbnN0cnVtZW50YXRpb24gdGVzdCBmb2xkZXIgaXMgbWlzc2luZy4KKyAgICBURVNUX1JFQ09SREVSX01JU1NJTkdfSU5TVFJVTUVOVEFUSU9OX1RFU1RfRk9MREVSID0gOTQ7CisgICAgLy8gVGhlIHRlc3QgcmVjb3JkZXIgd2FzIGxhdW5jaGVkLgorICAgIFRFU1RfUkVDT1JERVJfTEFVTkNIID0gOTU7CisgICAgLy8gQSBHUFUgRGVidWdnZXIgVHJhY2Ugc2Vzc2lvbiB3YXMgb3BlbmVkIGJ1dCBub3Qgc3RhcnRlZCB5ZXQuCisgICAgR0ZYX1RSQUNFX09QRU4gPSA5NjsKKyAgICAvLyBTdGF0aXN0aWNzIG9uIHVzZXIgYWN0aW9ucyBpbiB0aGUgQW5kcm9pZCBTdHVkaW8gVUkuCisgICAgU1RVRElPX1VJX0FDVElPTl9TVEFUUyA9IDk3OworICAgIC8vIFN0YXRzIG9uIHRoZSBjdXJyZW50IHJ1bm5pbmcgQW5kcm9pZCBTdHVkaW8gcHJvY2Vzcy4KKyAgICBTVFVESU9fUFJPQ0VTU19TVEFUUyA9IDk4OworICAgIC8vIFN0YXRzIG9uIFN0dWRpbydzIHBlcmZvcm1hbmNlCisgICAgU1RVRElPX1BFUkZPUk1BTkNFX1NUQVRTID0gOTk7CisgIH0KKyAgLy8gUmVwcmVzZW50cyBkaWZmZXJlbnQgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyB0eXBlcy4KKyAgZW51bSBNb25pdG9yVHlwZSB7CisgICAgVU5LTk9XTl9NT05JVE9SX1RZUEUgPSAwOworICAgIENQVSA9IDE7CisgICAgR1BVID0gMjsKKyAgICBNRU1PUlkgPSAzOworICAgIE5FVFdPUksgPSA0OworICB9CisgIC8vIFJlcHJlc2VudHMgZGlmZmVyZW50IFBlcmZvcm1hbmNlIFByb2ZpbGVyIENhcHR1cmUgdHlwZXMuCisgIGVudW0gUHJvZmlsZXJDYXB0dXJlVHlwZSB7CisgICAgVU5LTk9XTl9QUk9GSUxFUl9DQVBUVVJFX1RZUEUgPSAwOworICAgIEFMTE9DQVRJT04gPSAxOworICAgIEZJTEUgPSAyOworICAgIEdGWF9UUkFDRSA9IDM7CisgICAgSEVBUCA9IDQ7CisgICAgU1lTVEVNX0lORk8gPSA1OworICAgIFZNX1RSQUNFID0gNjsKKyAgICBNRVRIT0RfVFJBQ0lORyA9IDc7CisgICAgTEFZT1VUX0lOU1BFQ1RPUl9TTkFQU0hPVCA9IDg7CisgICAgSElFUkFSQ0hZX1ZJRVcgPSA5OworICB9CisgIC8vIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBSdW4gQ29uZmlndXJhdGlvbnMgdGhlIGRlYnVnZ2VyIHN1cHBvcnRzLgorICBlbnVtIFJ1bkNvbmZpZ3VyYXRpb25UeXBlIHsKKyAgICBVTktOT1dOX1JVTl9DT05GSUdVUkFUSU9OX1RZUEUgPSAwOworICAgIEFORFJPSUQgPSAxOworICAgIEFORFJPSURfTkFUSVZFID0gMjsKKyAgICBBTkRST0lEX1RFU1QgPSAzOworICB9CisgIC8vIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBkZWJ1Z2dlciB0eXBlcyBzdXBwb3J0ZWQuCisgIGVudW0gRGVidWdnZXJUeXBlIHsKKyAgICBVTktOT1dOX0RFQlVHR0VSX1RZUEUgPSAwOworICAgIEpBVkEgPSAxOworICAgIEhZQlJJRCA9IDI7CisgICAgTkFUSVZFID0gMzsKKyAgfQorICAvLyBSZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgR29vZ2xlIERldmVsb3BlciBTZXJ2aWNlcyB0aGF0IGNhbiBiZQorICAvLyAoc2VtaS0pYXV0b21hdGljYWxseSBpbnRlZ3JhdGVkIGludG8gQW5kcm9pZCBBcHBsaWNhdGlvbnMuCisgIGVudW0gRGV2ZWxvcGVyU2VydmljZUtpbmQgeworICAgIFVOS05PV05fREVWRUxPUEVSX1NFUlZJQ0VfS0lORCA9IDA7CisgICAgR09PR0xFX0NMT1VEX01FU1NBR0lORyA9IDE7CisgICAgQURfTU9CID0gMjsKKyAgICBHT09HTEVfU0lHTl9JTiA9IDM7CisgICAgR09PR0xFX0FOQUxZVElDUyA9IDQ7CisgICAgRklSRUJBU0UgPSA1OworICAgIFJFQUxUSU1FX0RBVEFCQVNFID0gNjsKKyAgICBBVVRIRU5USUNBVElPTiA9IDc7CisgICAgQ1JBU0hfUkVQT1JUSU5HID0gODsKKyAgICBOT1RJRklDQVRJT05TID0gOTsKKyAgICBSRU1PVEVfQ09ORklHID0gMTA7CisgICAgU1RPUkFHRSA9IDExOworICAgIEFQUF9JTlZJVEVTID0gMTI7CisgICAgRFlOQU1JQ19MSU5LUyA9IDEzOworICB9CisgIC8vIFRoZSB2YXJpb3VzIHRlbXBsYXRlcyB0aGUgdGVtcGxhdGUgZW5naW5lIGNvdWxkIGJlIGFza2VkIHRvIHJlbmRlci4KKyAgZW51bSBUZW1wbGF0ZVJlbmRlcmVyIHsKKyAgICBVTktOT1dOX1RFTVBMQVRFX1JFTkRFUkVSID0gMDsKKyAgICBDVVNUT01fVEVNUExBVEVfUkVOREVSRVIgPSAxOworICAgIEFORFJPSURfTU9EVUxFID0gMjsKKyAgICBBTkRST0lEX1BST0pFQ1QgPSAzOworICAgIEVNUFRZX0FDVElWSVRZID0gNDsKKyAgICBCTEFOS19BQ1RJVklUWSA9IDU7CisgICAgTEFZT1VUX1hNTF9GSUxFID0gNjsKKyAgICBGUkFHTUVOVF9CTEFOSyA9IDc7CisgICAgTkFWSUdBVElPTl9EUkFXRVJfQUNUSVZJVFkgPSA4OworICAgIFZBTFVFU19YTUxfRklMRSA9IDk7CisgICAgR09PR0xFX01BUFNfQUNUSVZJVFkgPSAxMDsKKyAgICBMT0dJTl9BQ1RJVklUWSA9IDExOworICAgIEFTU0VUU19GT0xERVIgPSAxMjsKKyAgICBUQUJCRURfQUNUSVZJVFkgPSAxMzsKKyAgICBTQ1JPTExJTkdfQUNUSVZJVFkgPSAxNDsKKyAgICBGVUxMU0NSRUVOX0FDVElWSVRZID0gMTU7CisgICAgU0VSVklDRSA9IDE2OworICAgIEpBVkFfTElCUkFSWSA9IDE3OworICAgIFNFVFRJTkdTX0FDVElWSVRZID0gMTg7CisgICAgRlJBR01FTlRfTElTVCA9IDE5OworICAgIE1BU1RFUl9ERVRBSUxfRkxPVyA9IDIwOworICAgIEFORFJPSURfV0VBUl9NT0RVTEUgPSAyMTsKKyAgICBCUk9BRENBU1RfUkVDRUlWRVIgPSAyMjsKKyAgICBBSURMX0ZJTEUgPSAyMzsKKyAgICBJTlRFTlRfU0VSVklDRSA9IDI0OworICAgIEpOSV9GT0xERVIgPSAyNTsKKyAgICBKQVZBX0ZPTERFUiA9IDI2OworICAgIENVU1RPTV9WSUVXID0gMjc7CisgICAgQU5EUk9JRF9UVl9NT0RVTEUgPSAyODsKKyAgICBHT09HTEVfQURNT0JTX0FEU19BQ1RJVklUWSA9IDI5OworICAgIEFMV0FZU19PTl9XRUFSX0FDVElWSVRZID0gMzA7CisgICAgUkVTX0ZPTERFUiA9IDMxOworICAgIEFORFJPSURfVFZfQUNUSVZJVFkgPSAzMjsKKyAgICBCTEFOS19XRUFSX0FDVElWSVRZID0gMzM7CisgICAgQkFTSUNfQUNUSVZJVElZID0gMzQ7CisgICAgQVBQX1dJREdFVCA9IDM1OworICB9CisgIC8vIFJlYXNvbnMgR3JhZGxlIHN5bmMgZmFpbGVkLgorICBlbnVtIEdyYWRsZVN5bmNGYWlsdXJlIHsKKyAgICBVTktOT1dOX0dSQURMRV9GQUlMVVJFID0gMDsKKyAgICBDT05ORUNUSU9OX0RFTklFRCA9IDE7CisgICAgQ0xBU1NfTk9UX0ZPVU5EID0gMjsKKyAgICBEU0xfTUVUSE9EX05PVF9GT1VORCA9IDM7CisgICAgRkFJTEVEX1RPX1BBUlNFX1NESyA9IDQ7CisgICAgTUVUSE9EX05PVF9GT1VORCA9IDU7CisgICAgTUlTU0lOR19BTkRST0lEX1BMQVRGT1JNID0gNjsKKyAgICBNSVNTSU5HX0FORFJPSURfU1VQUE9SVF9SRVBPID0gNzsKKyAgICBNSVNTSU5HX0JVSUxEX1RPT0xTID0gODsKKyAgICBPVVRfT0ZfTUVNT1JZID0gOTsKKyAgICBTREtfTk9UX0ZPVU5EID0gMTA7CisgICAgVU5LTk9XTl9IT1NUID0gMTE7CisgICAgVU5TVVBQT1JURURfQU5EUk9JRF9NT0RFTF9WRVJTSU9OID0gMTI7CisgICAgVU5TVVBQT1JURURfR1JBRExFX1ZFUlNJT04gPSAxMzsKKyAgfQorICAvLyBEZXNjcmliZXMgYSBncm91cCBvZiBldmVudCBraW5kcyByZWxhdGVkIHRvIGVhY2ggb3RoZXIuCisgIC8vIE5lY2Vzc2FyeSBvbmx5IGZvciBldmVudHMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgYmVpbmcgcmVwb3J0ZWQgdG8gR29vZ2xlCisgIC8vIEFuYWx5dGljcyAoR0EpLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uQW5kcm9pZFN0dWRpb0V2ZW50LkV2ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAxOworICAvLyBTcGVjaWZpYyBraW5kIG9mIGV2ZW50LCBwcmltYXJ5IHNlcGFyYXRpb24ga2V5IG9mIGFsbCBBbmRyb2lkIFN0dWRpbworICAvLyByZWxhdGVkIGV2ZW50cy4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkFuZHJvaWRTdHVkaW9FdmVudC5FdmVudEtpbmQga2luZCA9IDI7CisgIC8vIFRoZSBzZXNzaW9uIGlkIGlzIGEgVVVJRCB0cmFja2luZyBhIHNpbmdsZSBpbnN0YW5jZSBvZiBBbmRyb2lkIFN0dWRpbworICAvLyB0byBhc3NvY2lhdGUgZXZlbnRzIHRvZ2V0aGVyIHN1Y2ggYXMga2luZCA9IFRFU1RfUlVOCisgIG9wdGlvbmFsIHN0cmluZyBzdHVkaW9fc2Vzc2lvbl9pZCA9IDM7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBTVFVESU9fUElORworICAvLyBvciBraW5kID0gRU1VTEFUT1JfUElORworICAvLyBvciBBTkRST0lEX1NUVURJT19URVNUCisgIC8vIG9yIEFORFJPSURfU1RVRElPX1RIUk9VR0hfR1JBRExFCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5Qcm9kdWN0RGV0YWlscyBwcm9kdWN0X2RldGFpbHMgPSA0OworICAvLyBzZXQgd2hlbiBraW5kID0gTU9OSVRPUl9BQ1RJVkFURUQgb3Iga2luZCA9IE1PTklUT1JfUlVOTklORworICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uQW5kcm9pZFN0dWRpb0V2ZW50Lk1vbml0b3JUeXBlIG1vbml0b3JfdHlwZSA9IDU7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBNT05JVE9SX1JVTk5JTkcKKyAgb3B0aW9uYWwgYm9vbCBtb25pdG9yX3BhdXNlZCA9IDY7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBQUk9GSUxJTkdfT1BFTiBvciBQUk9GSUxJTkdfQ0FQVFVSRQorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uQW5kcm9pZFN0dWRpb0V2ZW50LlByb2ZpbGVyQ2FwdHVyZVR5cGUgcHJvZmlsZXJfY2FwdHVyZV90eXBlID0gNzsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IENMT1VEX1RFU1RJTkdfQkFDS0VORF9FUlJPUgorICBvcHRpb25hbCBzdHJpbmcgY2xvdWRfdGVzdGluZ19lcnJvcl9tZXNzYWdlID0gODsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IENMT1VEX1RFU1RJTkdfQ09NUEFSRV9TQ1JFRU5TSE9UU19PUEVORUQKKyAgb3B0aW9uYWwgaW50MzIgY2xvdWRfdGVzdGluZ19sb2FkZWRfc2NyZWVuc2hvdHNfY291bnQgPSA5OworICAvLyBzZXQgd2hlbiBraW5kID0gTExEQl9TRVNTSU9OX1NUQVJURUQKKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkFuZHJvaWRTdHVkaW9FdmVudC5SdW5Db25maWd1cmF0aW9uVHlwZSBydW5fY29uZmlndXJhdGlvbl90eXBlID0gMTA7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBMTERCX1NFU1NJT05fU1RBUlRFRAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uQW5kcm9pZFN0dWRpb0V2ZW50LkRlYnVnZ2VyVHlwZSBkZWJ1Z2dlcl90eXBlID0gMTE7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBMTERCX0xBVU5DSEVECisgIC8vIG9yIGtpbmQgPSBERVBMT1lNRU5UX0FQSworICAvLyBvciBraW5kID0gREVQTE9ZTUVOVF9FTVVMQVRPUgorICAvLyBvciBraW5kID0gQ0xPVURfVEVTVElOR19DT05GSUdVUkVfQ0xPVURfREVWSUNFCisgIC8vIG9yIGtpbmQgPSBDTE9VRF9URVNUSU5HX0xBVU5DSF9DTE9VRF9ERVZJQ0UKKyAgLy8gb3Iga2luZCA9IENMT1VEX1RFU1RJTkdfREVCVUdfRlJPTV9SRVNVTFRTCisgIC8vIG9yIGtpbmQgPSBURVNUX1JVTgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRGV2aWNlSW5mbyBkZXZpY2VfaW5mbyA9IDEyOworICAvLyBzZXQgd2hlbiBraW5kID0gTExEQl9TRVNTSU9OX0ZBSUxFRCBvciBraW5kID0gTExEQl9JTlNUQUxMX0ZBSUxFRAorICAvLyBlLmcuICdmYWlsZWQgdG8gZ2V0IHJlcGx5IHRvIGhhbmRzaGFrZSBwYWNrZXQnCisgIG9wdGlvbmFsIHN0cmluZyBsbGRiX3Nlc3Npb25fZmFpbHVyZV9tZXNzYWdlID0gMTM7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBERVZFTE9QRVJfU0VSVklDRVNfSU5TVEFMTEVECisgIC8vIG9yIGtpbmQgPSBERVZFTE9QRVJfU0VSVklDRVNfUkVNT1ZFRAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uQW5kcm9pZFN0dWRpb0V2ZW50LkRldmVsb3BlclNlcnZpY2VLaW5kIGRldmVsb3Blcl9zZXJ2aWNlX2tpbmQgPSAxNDsKKyAgLy8gc2V0IHdoZW4gY2F0ZWdvcnkgPSBHUkFETEVfU1lOQworICBvcHRpb25hbCBzdHJpbmcgZ3JhZGxlX3ZlcnNpb24gPSAxNTsKKyAgLy8gZS5nLiAnMi4xMCcKKyAgLy8gc2V0IHdoZW4ga2luZCA9IEdSQURMRV9TWU5DX0ZBSUxVUkUKKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkFuZHJvaWRTdHVkaW9FdmVudC5HcmFkbGVTeW5jRmFpbHVyZSBncmFkbGVfc3luY19mYWlsdXJlID0gMTY7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBHUkFETEVfU1lOQ19GQUlMVVJFIGFuZCBncmFkbGVfc3luY19mYWlsdXJlID0gKl9OT1RfRk9VTkQKKyAgLy8gZS5nLiAnb3JnLmdyYWRsZS5hcGkuaW50ZXJuYWwuRGVtb0NsYXNzLmRlbW9NZXRob2QnCisgIG9wdGlvbmFsIHN0cmluZyBncmFkbGVfbWlzc2luZ19zaWduYXR1cmUgPSAxNzsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IFRFTVBMQVRFX1JFTkRFUkVSCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5BbmRyb2lkU3R1ZGlvRXZlbnQuVGVtcGxhdGVSZW5kZXJlciB0ZW1wbGF0ZV9yZW5kZXJlciA9IDE4OworICAvLyBzZXQgd2hlbiBraW5kID0gU1RVRElPX0NSQVNICisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5TdHVkaW9DcmFzaCBzdHVkaW9fY3Jhc2ggPSAxOTsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IEdSQURMRV9CVUlMRF9ERVRBSUxTCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVCdWlsZERldGFpbHMgZ3JhZGxlX2J1aWxkX2RldGFpbHMgPSAyMDsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IElOU1RBTlRfUlVOCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5JbnN0YW50UnVuIGluc3RhbnRfcnVuID0gMjE7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBNRVRBX01FVFJJQ1MKKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLk1ldGFNZXRyaWNzIG1ldGFfbWV0cmljcyA9IDIyOworICAvLyBzZXQgd2hlbiBraW5kID0gRU1VTEFUT1JfUElORworICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JEZXRhaWxzIGVtdWxhdG9yX2RldGFpbHMgPSAyMzsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IFRFU1RfUlVOCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5UZXN0UnVuIHRlc3RfcnVuID0gMjQ7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBFTVVMQVRPUl9VSV9FVkVOVAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JVaUV2ZW50IGVtdWxhdG9yX3VpX2V2ZW50ID0gMjU7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBIWVBFUlZJU09SCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5IeXBlcnZpc29yIGh5cGVydmlzb3IgPSAyNjsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IEVNVUxBVE9SX0hPU1QKKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkVtdWxhdG9ySG9zdCBlbXVsYXRvcl9ob3N0ID0gMjc7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBHUkFETEVfQlVJTERfUFJPRklMRQorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlQnVpbGRQcm9maWxlIGdyYWRsZV9idWlsZF9wcm9maWxlID0gMjg7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBMTERCX0ZST05URU5EX0VYSVRFRAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uTExEQkZyb250ZW5kRGV0YWlscyBsbGRiX2Zyb250ZW5kX2RldGFpbHMgPSAyOTsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IEZJUkVCQVNFX0FTU0lTVEFOVF9FUlJPUl9QUkVTRU5URUQgb3IKKyAgLy8ga2luZCBGSVJFQkFTRV9BU1NJU1RBTlRfU0lMRU5UX0VSUk9SCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5GaXJlYmFzZUVycm9yRGV0YWlscyBmaXJlYmFzZV9lcnJvcl9kZXRhaWxzID0gMzA7CisgIC8vIENsaWVudC1zaWRlIHNhbHRlZCAocm90YXRpbmcgZXZlcnkgMjggZGF5cyksIHNoYTI1NiBvZiB0aGUgcHJvamVjdCBpZC4KKyAgLy8gc2V0IHdoZW4ga2luZCA9IFBST0pFQ1RfU1RSVUNUVVJFXyouCisgIG9wdGlvbmFsIHN0cmluZyBwcm9qZWN0X2lkID0gMzE7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBHRlhfVFJBQ0VfKgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uR2Z4VHJhY2luZ0RldGFpbHMgZ2Z4X3RyYWNpbmdfZGV0YWlscyA9IDMyOworICAvLyBzZXQgd2hlbiBraW5kID0gVEVTVF9SRUNPUkRFUl9HRU5FUkFURV9URVNUX0NMQVNTCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5UZXN0UmVjb3JkZXJEZXRhaWxzIHRlc3RfcmVjb3JkZXJfZGV0YWlscyA9IDMzOworICAvLyBzZXQgd2hlbiBraW5kID0gU1RVRElPX1VJX0FDVElPTl9TVEFUUworICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uVUlBY3Rpb25TdGF0cyB1aV9hY3Rpb25fc3RhdHMgPSAzNDsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IFNUVURJT19QSU5HCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5NYWNoaW5lRGV0YWlscyBtYWNoaW5lX2RldGFpbHMgPSAzNTsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IFNUVURJT19QSU5HCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5Kdm1EZXRhaWxzIGp2bV9kZXRhaWxzID0gMzY7CisgIC8vIHNldCB3aGVuIGtpbmQgPSBTVFVESU9fUFJPQ0VTU19TVEFUUworICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uSmF2YVByb2Nlc3NTdGF0cyBqYXZhX3Byb2Nlc3Nfc3RhdHMgPSAzNzsKKyAgLy8gc2V0IHdoZW4ga2luZCA9IFNUVURJT19QRVJGT1JNQU5DRV9TVEFUUworICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uU3R1ZGlvUGVyZm9ybWFuY2VTdGF0cyBzdHVkaW9fcGVyZm9ybWFuY2Vfc3RhdHMgPSAzODsKK30KKworLy8gRGVzY3JpYmVzIGEgcHJvZHVjdCwgZS5nLiBBbmRyb2lkIFN0dWRpbyBvciBFbXVsYXRvci4KK21lc3NhZ2UgUHJvZHVjdERldGFpbHMgeworICAvLyBWYXJpb3VzIHN0YXRlcyBpbiB0aGUgc29mdHdhcmUgbGlmZSBjeWNsZSB0aGlzIHNvZnR3YXJlIGNvdWxkIGJlIGluLgorICBlbnVtIFNvZnR3YXJlTGlmZUN5Y2xlQ2hhbm5lbCB7CisgICAgVU5LTk9XTl9MSUZFX0NZQ0xFX0NIQU5ORUwgPSAwOworICAgIENBTkFSWSA9IDE7CisgICAgREVWID0gMjsKKyAgICBCRVRBID0gMzsKKyAgICBTVEFCTEUgPSA0OworICB9CisgIC8vIERlc2NyaWJlcyB0aGUgdmFyaW91cyBQcm9kdWN0cyByZWxhdGVkIHRvIEFuZHJvaWQgU3R1ZGlvLgorICBlbnVtIFByb2R1Y3RLaW5kIHsKKyAgICBVTktOT1dOX1BST0RVQ1QgPSAwOworICAgIFNUVURJTyA9IDE7CisgICAgRU1VTEFUT1IgPSAyOworICAgIEdSQURMRSA9IDM7CisgICAgRERNUyA9IDQ7CisgIH0KKyAgLy8gRGVzY3JpYmVzIHRoZSB2YXJpb3VzIE9TIHBsYXRmb3JtcyBvdXIgcHJvZHVjdHMgcnVuIG9uLgorICBlbnVtIE9TS2luZCB7CisgICAgVU5LTk9XTl9PU19LSU5EID0gMDsKKyAgICBPVEhFUl9PUyA9IDE7CisgICAgLy8gS25vd24gYnV0IG5vdCBpbiBvdXIgbGlzdC4KKyAgICBXSU5ET1dTID0gMjsKKyAgICBNQUNfT1NYID0gMzsKKyAgICBMSU5VWCA9IDQ7CisgICAgRlJFRV9CU0QgPSA1OworICB9CisgIC8vIENoaXAgdGhlIHNvZnR3YXJlIGlzIHJ1bm5pbmcgb24uCisgIGVudW0gQ3B1QXJjaGl0ZWN0dXJlIHsKKyAgICBVTktOT1dOX0NQVV9BUkNISVRFQ1RVUkUgPSAwOworICAgIFg4NiA9IDE7CisgICAgWDg2XzY0ID0gMjsKKyAgfQorICAvLyBUaGUgcHJvZHVjdCB0aGlzIGV2ZW50IHJlbGF0ZXMgdG8uCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5Qcm9kdWN0RGV0YWlscy5Qcm9kdWN0S2luZCBwcm9kdWN0ID0gMTsKKyAgLy8gVGhlIGJ1aWxkIElEIG9mIEFuZHJvaWQgU3R1ZGlvLgorICBvcHRpb25hbCBzdHJpbmcgYnVpbGQgPSAyOworICAvLyBlLmcuIEFJLTE0MS4yMTc4MTgzCisgIC8vIFRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9kdWN0LgorICBvcHRpb25hbCBzdHJpbmcgdmVyc2lvbiA9IDM7CisgIC8vIGUuZy4gMi4wLjAuMTEKKyAgLy8gSGlzdG9yaWNhbDogbmV2ZXIgdXNlZCBhcyBpdCB3YXMgbm90IHByb3ZpZGluZyBlbm91Z2ggaW5mby4gVXNlIGNoYW5uZWwKKyAgLy8gaW5zdGVhZCBhcyBpdCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gZGlmZmVyZW50IGtpbmRzIG9mIHByZXZpZXcgcmVsZWFzZXMuCisgIG9wdGlvbmFsIGJvb2wgcHJldmlldyA9IDQ7CisgIC8vIFRoZSBDUFUgYXJjaHRlY3R1cmUgdGhlIHByb2R1Y3QgaXMgcnVubmluZyBvbi4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLlByb2R1Y3REZXRhaWxzLkNwdUFyY2hpdGVjdHVyZSBvc19hcmNoaXRlY3R1cmUgPSA1OworICAvLyBUaGUgc3RhdGUgaW4gdGhlIHNvZnR3YXJlIGxpZmVjeWNsZSBvZiB0aGlzIHByb2R1Y3QuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5Qcm9kdWN0RGV0YWlscy5Tb2Z0d2FyZUxpZmVDeWNsZUNoYW5uZWwgY2hhbm5lbCA9IDY7Cit9CisKKy8vIERlc2NyaWJlcyBhIGVtdWxhdG9yIG9yIHBoeXNpY2FsIEFuZHJvaWQgRGV2aWNlLgorbWVzc2FnZSBEZXZpY2VJbmZvIHsKKyAgLy8gRGVzY3JpYmVzIHR0aGUgQUJJIG9mIHRoZSBkZXZpY2UvZW11bGF0b3IuCisgIGVudW0gQXBwbGljYXRpb25CaW5hcnlJbnRlcmZhY2UgeworICAgIFVOS05PV05fQUJJID0gMDsKKyAgICBBUk1FX0FCSV9WN0EgPSAxOworICAgIFg4Nl9BQkkgPSAyOworICAgIEFSTTY0X1Y4QV9BQkkgPSAzOworICAgIFg4Nl82NF9BQkkgPSA0OworICAgIEFSTUVfQUJJID0gNTsKKyAgICBNSVBTX0FCSSA9IDY7CisgICAgTUlQU19SMl9BQkkgPSA3OworICAgIEFSTUVfQUJJX1Y2TCA9IDg7CisgICAgQVJNRV9BQklfVjZKID0gOTsKKyAgfQorICAvLyBEZXNjcmliZXMgdGhlIGtpbmQgb2YgZGV2aWNlIGJlaW5nIGRlcGxveWVkL3Rlc3RlZCBvbi4KKyAgZW51bSBEZXZpY2VUeXBlIHsKKyAgICBVTktOT1dOX0RFVklDRV9UWVBFID0gMDsKKyAgICBMT0NBTF9QSFlTSUNBTCA9IDE7CisgICAgTE9DQUxfRU1VTEFUT1IgPSAyOworICAgIENMT1VEX0VNVUxBVE9SID0gMzsKKyAgICBDTE9VRF9QSFlTSUNBTCA9IDQ7CisgIH0KKyAgLy8gc2VyaWFsIG51bWJlciBvZiB0aGUgZGV2aWNlLCBzYWx0ZWQgJiBzaGEyNTZlZCBvbiB0aGUgY2xpZW50LgorICBvcHRpb25hbCBzdHJpbmcgYW5vbnltaXplZF9zZXJpYWxfbnVtYmVyID0gMTsKKyAgLy8gVGFncyB1c2VkIHRvIGJ1aWxkIHRoZSBhbmRyb2lkIHZlcnNpb24gb24gdGhpcyBkZXZpY2UuCisgIC8vIGUuZy4gJ3JlbGVhc2Uta2V5cycgb3IgJ3Rlc3Qta2V5cycgb3IgJ0ExMDBfVjAwMScKKyAgLy8gVE9ETyhqdmcpOiBhc2sgbG9nbGF1bmNoIGZvbGtzOiBTVF9TT0ZUV0FSRV9JRCBkYXRhcG9sPworICBvcHRpb25hbCBzdHJpbmcgYnVpbGRfdGFncyA9IDI7CisgIC8vIFR5cGUgb2YgYnVpbGQgdGhpcyBkZXZpY2UgaXMgcnVubmluZy4KKyAgLy8gZS5nLiAndXNlcicgb3IgJ3VzZXJkZWJ1Zycgb3IgJ2VuZycgb3IgJ2FscGhhYnVpbGQnCisgIC8vIFRPRE8oanZnKTogYXNrIGxvZ2xhdW5jaCBmb2xrczogU1RfU09GVFdBUkVfSUQgZGF0YXBvbD8KKyAgb3B0aW9uYWwgc3RyaW5nIGJ1aWxkX3R5cGUgPSAzOworICAvLyBBbmRyb2lkIHZlcnNpb24gZS5nLiAnNS4xLjEnCisgIG9wdGlvbmFsIHN0cmluZyBidWlsZF92ZXJzaW9uX3JlbGVhc2UgPSA0OworICAvLyBIaXN0b3JpYzogZG9lc24ndCBzdXBwb3J0IGFwaSBsZXZlbHMgZm9yIGNvZGUgbmFtZXMgc3VjaCBhcyAnTicuCisgIG9wdGlvbmFsIGludDMyIGJ1aWxkX2FwaV9sZXZlbCA9IDU7CisgIC8vIEFCSSBvZiB0aGUgZGV2aWNlLCBlLmcuICdhcm1lYWJpLXY3YScgb3IgJ3g4NicKKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkRldmljZUluZm8uQXBwbGljYXRpb25CaW5hcnlJbnRlcmZhY2UgY3B1X2FiaSA9IDY7CisgIC8vIERldmljZSBtYW51ZmFjdHVyZXIsIGUuZy4gJ01vdG9yb2xhJyBvciAnU2Ftc3VuZycKKyAgb3B0aW9uYWwgc3RyaW5nIG1hbnVmYWN0dXJlciA9IDc7CisgIC8vIERldmljZSBtb2RlbCwgZS5nLiAnTmV4dXMgNScgb3IgJ0dULUk5NTAwJy4KKyAgb3B0aW9uYWwgc3RyaW5nIG1vZGVsID0gODsKKyAgLy8gV2hhdCBraW5kIG9mIGRldmljZSBpcyB0aGlzPyBQaHlzaWNpYWwvRW11bGF0b3IvQ2xvdWQgZXRjLi4uCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5EZXZpY2VJbmZvLkRldmljZVR5cGUgZGV2aWNlX3R5cGUgPSA5OworICAvLyBhbmRyb2lkIGFwaSBsZXZlbCAgZS5nLiAnMjMnIG9yICdOJworICBvcHRpb25hbCBzdHJpbmcgYnVpbGRfYXBpX2xldmVsX2Z1bGwgPSAxMDsKK30KKworLy8gTWV0cmljcyBvbiBjcmFzaGVzIGluIEFuZHJvaWQgU3R1ZGlvLgorbWVzc2FnZSBTdHVkaW9DcmFzaCB7CisgIC8vIG51bWJlciBvZiBhY3Rpb25zIHNpbmNlIGxhc3QgY3Jhc2ggcmVwb3J0LgorICBvcHRpb25hbCBpbnQ2NCBhY3Rpb25zID0gMTsKKyAgLy8gbnVtYmVyIG9mIGV4Y2VwdGlvbnMgc2luY2UgbGFzdCBjcmFzaCByZXBvcnQuCisgIG9wdGlvbmFsIGludDY0IGV4Y2VwdGlvbnMgPSAyOworICAvLyBudW1iZXIgb2YgY3Jhc2hlcyBzaW5jZSBsYXN0IGNyYXNoIHJlcG9ydC4KKyAgb3B0aW9uYWwgaW50NjQgY3Jhc2hlcyA9IDM7CisgIC8vIG51bWJlciBvZiBleGNlcHRpb25zIGZyb20gcGx1Z2lucyBidW5kbGVkIHdpdGggQW5kcm9pZCBTdHVkaW8uCisgIG9wdGlvbmFsIGludDY0IGJ1bmRsZWRfcGx1Z2luX2V4Y2VwdGlvbnMgPSA0OworICAvLyBudW1iZXIgb2YgZXhjZXB0aW9ucyBmcm9tIHBsdWdpbnMgbm90IGJ1bmRsZWQgd2l0aCBBbmRyb2lkIFN0dWRpby4KKyAgb3B0aW9uYWwgaW50NjQgbm9uX2J1bmRsZWRfcGx1Z2luX2V4Y2VwdGlvbnMgPSA1OworfQorCisvLyBFbXVsYXRvciBndWVzdCBpbWFnZSdzIEdMIGluZm8uCittZXNzYWdlIEVtdWxhdG9yR3Vlc3RHbEluZm8geworICAvLyBHTCBEcml2ZXIgdmVuZG9yLgorICBvcHRpb25hbCBzdHJpbmcgdmVuZG9yID0gMTsKKyAgLy8gR0wgRHJpdmVyIG5hbWUuCisgIG9wdGlvbmFsIHN0cmluZyByZW5kZXJlciA9IDI7CisgIC8vIEdMIERyaXZlciB2ZXJzaW9uIG51bWJlci4KKyAgb3B0aW9uYWwgc3RyaW5nIHZlcnNpb24gPSAzOworfQorCisvLyBFbXVsYXRvcjogSG9zdCBHUFUgaW5mby4KK21lc3NhZ2UgRW11bGF0b3JHcHVJbmZvIHsKKyAgLy8gTWFrZSBvZiB0aGUgR3JhcGhpY3MgY2FyZC4KKyAgb3B0aW9uYWwgc3RyaW5nIG1ha2UgPSAxOworICAvLyBNb2RlbCBvZiB0aGUgR3JhcGhpY3MgY2FyZC4KKyAgb3B0aW9uYWwgc3RyaW5nIG1vZGVsID0gMjsKKyAgLy8gRGV2aWNlIGlkIG9mIHRoZSBHcmFwaGljcyBjYXJkLgorICBvcHRpb25hbCBzdHJpbmcgZGV2aWNlX2lkID0gMzsKKyAgLy8gUmV2aXNpb24gb2YgdGhlIGdyYXBoaWNzIGNhcmQuCisgIG9wdGlvbmFsIHN0cmluZyByZXZpc2lvbl9pZCA9IDQ7CisgIC8vIFZlcnNpb24gb2YgdGhlIGdyYXBoaWNzIGNhcmQgZHJpdmVyLgorICBvcHRpb25hbCBzdHJpbmcgdmVyc2lvbiA9IDU7CisgIC8vIE5hbWUgb2YgdGhlIGdyYXBoaWNzIGNhcmQgZHJpdmVyLgorICBvcHRpb25hbCBzdHJpbmcgcmVuZGVyZXIgPSA2OworfQorCisvLyBTZXQgb2YgZW11bGF0b3IgZmVhdHVyZSBmbGFncyB0byByZXBvcnQgb25lcyB1c2VkIGR1cmluZyBjdXJyZW50IHNlc3Npb24uCittZXNzYWdlIEVtdWxhdG9yRmVhdHVyZXMgeworICBvcHRpb25hbCBib29sIGdwcyA9IDE7CisgIG9wdGlvbmFsIGJvb2wgc2Vuc29ycyA9IDI7Cit9CisKKy8vIE1ldHJpY3MgcmVsYXRlZCB0byB0aGUgRW11bGF0b3IuCittZXNzYWdlIEVtdWxhdG9yRGV0YWlscyB7CisgIC8vIEVtdWxhdG9yIGluc3RhbmNlIGxpdmVuZXNzIGFzIGRldGVybWluZWQgdmlhIGFkYiBjb25uZWN0aXZpdHkuCisgIGVudW0gRW11bGF0b3JBZGJMaXZlbmVzcyB7CisgICAgVU5LTk9XTl9FTVVMQVRPUl9BREJfTElWRU5FU1MgPSAwOworICAgIEZBSUxVUkVfTk9fQURCID0gMTsKKyAgICBBREJfT05MSU5FID0gMjsKKyAgICBGQUlMVVJFX0FEQl9TRVJWRVJfREVBRCA9IDM7CisgICAgRkFJTFVSRV9FTVVMQVRPUl9ERUFEID0gNDsKKyAgfQorICAvLyBJbiBXaGF0IHBoYXNlIG9mIHRoZSBsaWZldGltZSBvZiB0aGUgRW11bGF0b3Igd2VyZSB0aGUgbWV0cmljcyByZXBvcnRlZC4KKyAgZW51bSBFbXVsYXRvclNlc3Npb25QaGFzZSB7CisgICAgVU5LTk9XTl9FTVVMQVRPUl9TRVNTSU9OX1BIQVNFID0gMDsKKyAgICAvLyBUaGUgY3VzdG9tIGVtdWxhdG9yIGxhdW5jaGVyIGlzIHJ1bm5pbmcuCisgICAgTEFVTkNIRVIgPSAxOworICAgIC8vIEZpbmFsIGVtdWxhdG9yIHRhcmdldCBpcyBwYXJzaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgUEFSU0VfT1BUSU9OUyA9IDI7CisgICAgLy8gSW5pdGlhbGl6YXRpb24gLSBnZW5lcmFsLgorICAgIElOSVRfR0VORVJBTCA9IDM7CisgICAgLy8gSW5pdGlhbGl6aW5nIEdQVQorICAgIElOSVRfR1BVID0gNDsKKyAgICAvLyBJbml0aWFsaXppbmcgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorICAgIElOSVRfQUNDRUwgPSA1OworICAgIC8vIE1haW4gdXNlIGNhc2UgLS0gaW5pdCBkb25lLCBlbXVsYXRvciBpcyB1cC4KKyAgICBSVU5OSU5HX0dFTkVSQUwgPSA2OworICAgIC8vIEV4aXRpbmcKKyAgICBFWElUX0dFTkVSQUwgPSA3OworICB9CisgIC8vIENoaXAgdGhlIGVtdWxhdG9yIGlzIGVtdWxhdGluZyBmb3IuCisgIGVudW0gR3Vlc3RDcHVBcmNoaXRlY3R1cmUgeworICAgIFVOS05PV05fR1VFU1RfQ1BVX0FSQ0hJVEVDVFVSRSA9IDA7CisgICAgWDg2ID0gMTsKKyAgICBYODZfNjQgPSAyOworICAgIEFSTSA9IDM7CisgICAgQVJNXzY0ID0gNDsKKyAgICBNSVBTID0gNTsKKyAgICBNSVBTXzY0ID0gNjsKKyAgfQorICAvLyBSZW5kZXJpbmcgbWV0aG9kIGVtdWxhdG9yIHVzZXMgZm9yIHRoZSByZXBvcnRlciBzZXNzaW9uLgorICBlbnVtIEVtdWxhdG9yUmVuZGVyZXIgeworICAgIFVOS05PV05fRU1VTEFUT1JfUkVOREVSRVIgPSAwOworICAgIEhPU1QgPSAxOworICAgIE9GRiA9IDI7CisgICAgR1VFU1QgPSAzOworICAgIE1FU0EgPSA0OworICAgIFNXSUZUU0hBREVSID0gNTsKKyAgICBBTkdMRSA9IDY7CisgICAgRVJST1JfSU5fRU1VTEFUT1JfUkVOREVSRVIgPSAyNTU7CisgIH0KKyAgLy8gQ3B1IGFyY2hpdGVjdHVyZSBvZiB0aGUgZ3Vlc3QuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5FbXVsYXRvckRldGFpbHMuR3Vlc3RDcHVBcmNoaXRlY3R1cmUgZ3Vlc3RfYXJjaCA9IDE7CisgIC8vIGNwdSB0aW1lIHNwZW50IGluIGtlcm5lbCBtb2RlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBsYXN0IG1ldHJpY3MgcmVwb3J0LgorICBvcHRpb25hbCBpbnQ2NCBzeXN0ZW1fdGltZSA9IDI7CisgIC8vIGNwdSB0aW1lIHNwZW50IGluIHVzZXIgbW9kZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbGFzdCBtZXRyaWNzIHJlcG9ydC4KKyAgb3B0aW9uYWwgaW50NjQgdXNlcl90aW1lID0gMzsKKyAgLy8gbnVtYmVyIG9mIGNyYXNoZXMgc2luY2UgbGFzdCBtZXRyaWNzIHJlcG9ydC4KKyAgb3B0aW9uYWwgaW50NjQgY3Jhc2hlcyA9IDQ7CisgIC8vIHJlYWwgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbGFzdCBtZXRyaWNzIHJlcG9ydC4KKyAgb3B0aW9uYWwgaW50NjQgd2FsbF90aW1lID0gNTsKKyAgLy8gVHJ1ZSBpZmYgYSBjcmFzaCBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzIHN0YXJ0ZWQgaXRzIGV4aXQgcm91dGluZXMuCisgIG9wdGlvbmFsIGJvb2wgZXhpdF9zdGFydGVkID0gNjsKKyAgLy8gVGhlIEFQSSBsZXZlbCBvZiB0aGUgcnVubmluZyBndWVzdCBpbWFnZS4KKyAgb3B0aW9uYWwgaW50NjQgZ3Vlc3RfYXBpX2xldmVsID0gNzsKKyAgLy8gVGhlIHZhbHVlIG9mIGd1ZXN0IGdwdSBvcHRpb24gKHJvLmtlcm5lbC5xZW11LmdsZXMpCisgIG9wdGlvbmFsIGJvb2wgZ3Vlc3RfZ3B1X2VuYWJsZWQgPSA4OworICAvLyBUcnVlIGlmIHdlIHdlcmUgYWJsZSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSBvcGVuZ2wgb24gdGhlIGhvc3QuCisgIG9wdGlvbmFsIGJvb2wgaXNfb3BlbmdsX2FsaXZlID0gMTA7CisgIC8vIENvbm5lY3Rpdml0eSBmcm9tIGFkYiBvZiB0aGUgcnVubmluZyBlbXVsYXRvciBpbnN0YW5jZS4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkVtdWxhdG9yRGV0YWlscy5FbXVsYXRvckFkYkxpdmVuZXNzIGFkYl9saXZlbmVzcyA9IDExOworICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZ2wgaW1wbGVtZW50YXRpb24gaW4gdGhlIGd1ZXN0IGltYWdlLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JHdWVzdEdsSW5mbyBndWVzdF9nbCA9IDEyOworICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaG9zdCBHUFVzIChvbmUgcGVyIEdQVSkuCisgIHJlcGVhdGVkIC5hbmRyb2lkX3N0dWRpby5FbXVsYXRvckdwdUluZm8gaG9zdF9ncHUgPSAxMzsKKyAgLy8gVGhlICJwaGFzZSIgb2YgYW4gZW11bGF0b3Igc2Vzc2lvbiB3aGVyZSBjcmFzaCBoYXBwZW5lZC4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkVtdWxhdG9yRGV0YWlscy5FbXVsYXRvclNlc3Npb25QaGFzZSBzZXNzaW9uX3BoYXNlID0gMTQ7CisgIC8vIFRoZSBlbXVsYXRvciBjb3JlIHZlcnNpb24gKGUuZy4gUUVNVSBlbmdpbmUncyB2ZXJzaW9uKS4KKyAgb3B0aW9uYWwgc3RyaW5nIGNvcmVfdmVyc2lvbiA9IDE1OworICAvLyBSZW5kZXJlciBvZiB0aGUgY3VycmVudCBlbXVsYXRvciBzZXNzaW9uLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JEZXRhaWxzLkVtdWxhdG9yUmVuZGVyZXIgcmVuZGVyZXIgPSAxNjsKKyAgLy8gRmxhZ3MgZm9yIHRoZSB1c2VkIGZlYXR1cnMuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5FbXVsYXRvckZlYXR1cmVzIHVzZWRfZmVhdHVyZXMgPSAxNzsKK30KKworLy8gRGVzY3JpYmVzIGEgdXNlciBjbGlja2luZyBvbiBzb21lIHBhcnQgb2YgdGhlIEVtdWxhdG9yIFVJLgorbWVzc2FnZSBFbXVsYXRvclVpRXZlbnQgeworICAvLyBUcmFja3MgdGhlIHR5cGUgb2YgdGhlIGVtdWxhdG9yIFVJIEV2ZW50LgorICBlbnVtIEVtdWxhdG9yVWlFdmVudFR5cGUgeworICAgIFVOS09OV05fRU1VTEFUT1JfVUlfRVZFTlRfVFlQRSA9IDA7CisgICAgQlVUVE9OX1BSRVNTID0gMTsKKyAgICAvLyBHZW5lcmF0ZWQgd2hlbiBhIHVzZXIgYWN0aW9uIGNoYW5nZXMgdGhlIHZhbHVlIG9mIGNlcnRhaW4gZmllbGQgZnJvbQorICAgIC8vIGl0cyBkZWZhdWx0IHZhbHVlLgorICAgIE9QVElPTl9TRVRfVE9fTk9OX0RFRkFVTFQgPSAyOworICAgIC8vIEdlbmVyYXRlZCB0byByZXBvcnQgdGhlIGluZGV4IG9mIGFuIG9wdGlvbiBzZWxlY3RlZCBieSB0aGUgdXNlciBpbiBhCisgICAgLy8gZHJvcC1kb3duIG1lbnUgLyByYWRpbyBidXR0b24gZXRjLgorICAgIE9QVElPTl9TRUxFQ1RFRCA9IDM7CisgIH0KKyAgLy8gVHJhY2tzIHRoZSBjb250ZXh0IG9mIHRoZSBFbXVsYXRvciBVSS4KKyAgZW51bSBFbXVsYXRvclVpRXZlbnRDb250ZXh0IHsKKyAgICBVTktOT1dOX0VNVUxBVE9SX1VJX0VWRU5UX0NPTlRFWFQgPSAwOworICAgIEVYVEVOREVEX1dJTkRPV19PUEVOID0gMTsKKyAgfQorICAvLyBJZCBvZiB0aGUgVUkgZWxlbWVudCwgYmFrZWQgaW4gdGhlIGVtdWxhdG9yIGJpbmFyeS4KKyAgLy8gVE9ETyhqdmcpOiBhc2sgbG9ncyB0aWNrZXQgZm9sa3Mgd2hhdCBraW5kIG9mIGRhdGFwb2wgYW5ub3RhdGlvbgorICAvLyBpdCBpcyBub3QgZnJlZWZvcm0sIGJ1dCB3ZSBjYW5ub3QgbWFrZSB0aGlzIGFuIGVudW0KKyAgb3B0aW9uYWwgc3RyaW5nIGVsZW1lbnRfaWQgPSAxOworICAvLyBUaGUgdHlwZSBvZiBVSSBldmVudAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JVaUV2ZW50LkVtdWxhdG9yVWlFdmVudFR5cGUgdHlwZSA9IDI7CisgIC8vIFRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIGV2ZW50LgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uRW11bGF0b3JVaUV2ZW50LkVtdWxhdG9yVWlFdmVudENvbnRleHQgY29udGV4dCA9IDM7CisgIC8vIFRoaXMgdmFsdWUgaXMgYW4gb3BhcXVlIG51bWVyaWMgdHlwZS4gVGhlIGV4YWN0IHNjaGVtYSBvZiB0aGUgVUkgbWV0cmljcworICAvLyBpcyBub3Qgc3BlY2lmaWMgaGVyZS4gZS5nLiwgfHZhbHVlfCBtYXkgcmVwcmVzZW50IGEgYm9vbGVhbiwgYSAiY291bnQiLCBvcgorICAvLyBhbiBpbmRleCBpbnRvIHRoZSBsaXN0IG9mIGl0ZW1zIGluIGEgZHJvcCBkb3duIG1lbnUuCisgIG9wdGlvbmFsIGludDY0IHZhbHVlID0gNDsKK30KKworLy8gRGV0YWlscyBhYm91dCBhIHNpbmdsZSBHcmFkbGUgcnVuLgorbWVzc2FnZSBHcmFkbGVCdWlsZERldGFpbHMgeworICAvLyBWZXJzaW9uIG9mIG91ciBHcmFkbGUgcGx1Z2luIHN1cHBvcnRpbmcgYW5kcm9pZCBidWlsZHMuIGUuZy4gJzIuMC1iZXRhMScKKyAgb3B0aW9uYWwgc3RyaW5nIGFuZHJvaWRfcGx1Z2luX3ZlcnNpb24gPSAxOworICAvLyBWZXJzaW9uIG9mIHRoZSBvcGVuIHNvdXJjZSBHcmFkbGUgYXBwbGljYXRpb24gdXNlZC4KKyAgb3B0aW9uYWwgc3RyaW5nIGdyYWRsZV92ZXJzaW9uID0gMjsKKyAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGluc3RhbnQgcnVuIGVuYWJsZWQgaW4gc2V0dGluZ3MKKyAgb3B0aW9uYWwgYm9vbCB1c2VyX2VuYWJsZWRfaXIgPSAzOworICAvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgSURFIHRoaW5rcyB3aGV0aGVyIHRoaXMgcGx1Z2luIHZlcnNpb24gc3VwcG9ydHMgSVIKKyAgb3B0aW9uYWwgYm9vbCBtb2RlbF9zdXBwb3J0c19pciA9IDQ7CisgIC8vIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhcmlhbnQgc3VwcG9ydHMgSVIsIGJ1dCB0aGlzIGNhbiBiZSBjaGFuZ2VkCisgIC8vIHdpdGhvdXQgYSBub3RpZmljYXRpb24KKyAgb3B0aW9uYWwgYm9vbCB2YXJpYW50X3N1cHBvcnRzX2lyID0gNTsKKyAgLy8gcGVyIGxpYnJhcnkgbWV0cmljcy4KKyAgcmVwZWF0ZWQgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUxpYnJhcnkgbGlicmFyaWVzID0gNjsKKyAgLy8gcGVyIG1vZHVsZSBtZXRyaWNzLgorICByZXBlYXRlZCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlTW9kdWxlIG1vZHVsZXMgPSA3OworICAvLyBwZXIgYW5kcm9pZCBtb2R1bGUgbWV0cmljcy4KKyAgcmVwZWF0ZWQgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUFuZHJvaWRNb2R1bGUgYW5kcm9pZF9tb2R1bGVzID0gODsKKyAgLy8gcGVyIG5hdGl2ZSBhbmRyb2lkIG1vZHVsZSBtZXRyaWNzCisgIHJlcGVhdGVkIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVOYXRpdmVBbmRyb2lkTW9kdWxlIG5hdGl2ZV9hbmRyb2lkX21vZHVsZXMgPSA5OworfQorCisvLyBQZXIgbGlicmFyeSBHcmFkbGUgbWV0cmljcy4KK21lc3NhZ2UgR3JhZGxlTGlicmFyeSB7CisgIC8vIE51bWJlciBvZiBqYXIgZGVwZW5kZW5jaWVzIGluIHRoaXMgbGlicmFyeS4KKyAgb3B0aW9uYWwgaW50NjQgamFyX2RlcGVuZGVuY3lfY291bnQgPSAxOworICAvLyBOdW1iZXIgb2YgYWFyIGRlcGVuZGVuY2llcyBpbiB0aGlzIGxpYnJhcnkuCisgIG9wdGlvbmFsIGludDY0IGFhcl9kZXBlbmRlbmN5X2NvdW50ID0gMjsKK30KKworLy8gUGVyIG1vZHVsZSBHcmFkbGUgbWV0cmljcy4KK21lc3NhZ2UgR3JhZGxlTW9kdWxlIHsKKyAgLy8gVG90YWwgbnVtYmVyIG9mIG1vZHVsZXMgaW4gdGhpcyBhcHAuCisgIG9wdGlvbmFsIGludDY0IHRvdGFsX21vZHVsZV9jb3VudCA9IDE7CisgIC8vIE51bWJlciBvZiBhYXIgbW9kdWxlcyBpbiAgdGhpcyBhcHAuCisgIG9wdGlvbmFsIGludDY0IGFwcF9tb2R1bGVfY291bnQgPSAyOworICAvLyBOdW1iZXIgb2YgbGlicmFyeSBtb2R1bGVzIGluIHRoaXMgYXBwLi4KKyAgb3B0aW9uYWwgaW50NjQgbGliX21vZHVsZV9jb3VudCA9IDM7Cit9CisKKy8vIFBlciBBbmRyb2lkIG1vZHVsZSBHcmFkbGUgbWV0cmljcy4KK21lc3NhZ2UgR3JhZGxlQW5kcm9pZE1vZHVsZSB7CisgIC8vIENsaWVudC1zaWRlIHNhbHRlZCwgc2hhMjU2IG9mIHRoZSBhcHBsaWNhdGlvbiBpZAorICAvLyB0aGUgYXBwX2lkIGlzIHRoZSBpZCBmb3IgdGhlIHVzZXIncyBhbmRyb2lkIGFwcAorICAvLyB3aGljaCB3ZSBzYWx0IHdpdGggYSBjbGllbnQgdW5pcXVlIHNhbHQgYW5kIHRoZW4gc2hhMjU2CisgIC8vIHNvIGl0IGlzIGFub255bWl6ZWQgYW5kIGlzIHVuaXF1ZSBwZXIgdXNlciwgYnV0IGhhcyBhIDEtTiByZWxhdGlvbi4KKyAgb3B0aW9uYWwgc3RyaW5nIGFwcF9pZCA9IDE7CisgIC8vIENsaWVudC1zaWRlIHNhbHRlZCwgc2hhMjU2IG9mIHRoZSBtb2R1bGUgbmFtZS4KKyAgb3B0aW9uYWwgc3RyaW5nIG1vZHVsZV9uYW1lID0gMjsKKyAgLy8gVHJ1ZSBpZiB0aGlzIG1vZHVsZSBpcyBhIGxpYnJhcnkuCisgIG9wdGlvbmFsIGJvb2wgaXNfbGlicmFyeSA9IDM7CisgIC8vIE51bWJlciBvZiBkaWZmZXJlbnQgYnVpbGQgdHlwZXMgZm9yIHRoaXMgbW9kdWxlLgorICBvcHRpb25hbCBpbnQ2NCBidWlsZF90eXBlX2NvdW50ID0gNDsKKyAgLy8gTnVtYmVyIG9mIGRpZmZlcmVudCBmbGF2b3IgdHlwZXMgZm9yIHRoaXMgbW9kdWxlLgorICBvcHRpb25hbCBpbnQ2NCBmbGF2b3JfY291bnQgPSA1OworICAvLyBOdW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvciBkaW1lbnNpb25zIGZvciB0aGlzIG1vZHVsZS4KKyAgb3B0aW9uYWwgaW50NjQgZmxhdm9yX2RpbWVuc2lvbiA9IDY7CisgIC8vIE51bWJlciBvZiBzaWduaW5nIGNvbmZpZ3VyYXRpb25zIGZvciB0aGlzIG1vZHVsZS4KKyAgb3B0aW9uYWwgaW50NjQgc2lnbmluZ19jb25maWdfY291bnQgPSA3OworfQorCisvLyBwZXIgIm5hdGl2ZSIgKEMrKykgYW5kcm9pZCBtb2R1bGUgR3JhZGxlIG1ldHJpY3MuCittZXNzYWdlIEdyYWRsZU5hdGl2ZUFuZHJvaWRNb2R1bGUgeworICAvLyBUaGUgdmFyaW91cyBuYXRpdmUgYnVpbGQgc3lzdGVtcyB3ZSBzdXBwb3J0IHRvIGJlIHVzZWQgZnJvbSBHcmFkbGUuCisgIGVudW0gTmF0aXZlQnVpbGRTeXN0ZW1UeXBlIHsKKyAgICBVTktOT1dOX05BVElWRV9CVUlMRF9TWVNURU1fVFlQRSA9IDA7CisgICAgLy8gVGhlIEdyYWRsZSBlcHhlcmltZW50YWwgcGx1Z2luCisgICAgR1JBRExFX0VYUEVSSU1FTlRBTCA9IDE7CisgICAgLy8gVGhlIGNvbXBpbGF0aW9uIHBhcnQgb2YgTkRLIGJ1aWxkcyAoQW5kcm9pZCdzIG5hdGl2ZSBidWlsZCBzeXN0ZW0pLgorICAgIE5ES19DT01QSUxFID0gMjsKKyAgICAvLyBmdWxsIE5ESyBidWlsZHMgKEFuZHJvaWQncyBuYXRpdmUgYnVpbGQgc3lzdGVtKS4KKyAgICBOREtfQlVJTEQgPSAzOworICAgIC8vIENNYWtlIGlzIGEgdmVyeSBjb21tb24gQysrIGJ1aWxkIHN5c3RlbS4KKyAgICBDTUFLRSA9IDQ7CisgIH0KKyAgLy8gQ2xpZW50LXNpZGUgc2FsdGVkLCBzaGEyNTYgb2YgdGhlIGFwcGxpY2F0aW9uIGlkCisgIC8vIHRoZSBhcHBfaWQgaXMgdGhlIGlkIGZvciB0aGUgdXNlcidzIGFuZHJvaWQgYXBwCisgIC8vIHdoaWNoIHdlIHNhbHQgd2l0aCBhIGNsaWVudCB1bmlxdWUgc2FsdCBhbmQgdGhlbiBzaGEyNTYKKyAgLy8gc28gaXQgaXMgYW5vbnltaXplZCBhbmQgaXMgdW5pcXVlIHBlciB1c2VyLCBidXQgaGFzIGEgMS1OIHJlbGF0aW9uLgorICBvcHRpb25hbCBzdHJpbmcgYXBwX2lkID0gMTsKKyAgLy8gQ2xpZW50LXNpZGUgc2FsdGVkLCBzaGEyNTYgb2YgdGhlIG1vZHVsZSBuYW1lLgorICBvcHRpb25hbCBzdHJpbmcgbW9kdWxlX25hbWUgPSAyOworICAvLyBUcnVlIGlmIHRoaXMgbW9kdWxlIGlzIGEgbGlicmFyeS4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZU5hdGl2ZUFuZHJvaWRNb2R1bGUuTmF0aXZlQnVpbGRTeXN0ZW1UeXBlIGJ1aWxkX3N5c3RlbV90eXBlID0gMzsKK30KKworLy8gTWV0cmljcyBvbiBJbnN0YW50UnVuIHVzYWdlLgorbWVzc2FnZSBJbnN0YW50UnVuIHsKKyAgLy8gV2hhdCBJbnN0YW50IFJ1biBEZXBsb3ltZW50IHdhcyB1c2VkCisgIGVudW0gSW5zdGFudFJ1bkRlcGxveW1lbnRLaW5kIHsKKyAgICBVTktOT1dOX0lOU1RBTlRfUlVOX0RFUExPWU1FTlRfS0lORCA9IDA7CisgICAgTEVHQUNZID0gMTsKKyAgICBGVUxMX0FQSyA9IDI7CisgICAgU1BMSVRfQVBLID0gMzsKKyAgICBERVggPSA0OworICAgIEhPVF9TV0FQID0gNTsKKyAgICBXQVJNX1NXQVAgPSA2OworICAgIE5PX0NIQU5HRVMgPSA3OworICB9CisgIC8vIFRoZSBkaWZmZXJlbnQgcmVhc29ucyBJbnN0YW50IFJ1biBoYWQgdG8gZG8gYSBmdWxsIGJ1aWxkLgorICBlbnVtIEluc3RhbnRSdW5CdWlsZENhdXNlIHsKKyAgICBVTktOT1dOX0lOU1RBTlRfUlVOX0JVSUxEX0NBVVNFID0gMDsKKyAgICBDT01QQVRJQkxFID0gMTsKKyAgICBNQU5JRkVTVF9DSEFOR0UgPSAyOworICAgIEZJRUxEX1RZUEVfQ0hBTkdFID0gMzsKKyAgICBGSUVMRF9SRU1PVkVEID0gNDsKKyAgICBGSUVMRF9BRERFRCA9IDU7CisgICAgTUVUSE9EX0RFTEVURUQgPSA2OworICAgIE1FVEhPRF9BRERFRCA9IDc7CisgICAgQ0xBU1NfQURERUQgPSA4OworICAgIFNUQVRJQ19JTklUSUFMSVpFUl9DSEFOR0UgPSA5OworICAgIENMQVNTX0FOTk9UQVRJT05fQ0hBTkdFID0gMTA7CisgICAgUkVTT1VSQ0VfQ0hBTkdFID0gMTE7CisgICAgSU1QTEVNRU5UU19JTlRFUkZBQ0VfQ0hBTkdFID0gMTI7CisgICAgUl9DTEFTU19DSEFOR0UgPSAxMzsKKyAgICBQQVJFTlRfQ0xBU1NfQ0hBTkdFID0gMTQ7CisgICAgTUVUSE9EX0FOTk9UQVRJT05fQ0hBTkdFID0gMTU7CisgICAgQVBJX0xFVkVMX1VOU1VQUE9SVEVEID0gMTY7CisgICAgUkVGTEVDVElPTl9VU0VEID0gMTc7CisgIH0KKyAgLy8gVGhlIGRpZmZlcmVudCByZWFzb25zIEluc3RhbnRSdW4gY2hvc2UgdGhlIGJ1aWxkIG1vZGUgaXQgZGlkIGZyb20gdGhlIElERSdzCisgIC8vIHBlcnNwZWN0aXZlLgorICBlbnVtIEluc3RhbnRSdW5JZGVCdWlsZENhdXNlIHsKKyAgICAvLyByZWFzb25zIGZvciBjbGVhbiBidWlsZAorICAgIFVOS05PV05fSU5TVEFOVF9SVU5fSURFX0JVSUxEX0NBVVNFID0gMDsKKyAgICBOT19ERVZJQ0UgPSAxOworICAgIEFQUF9OT1RfSU5TVEFMTEVEID0gMjsKKyAgICBNSVNNQVRDSElOR19USU1FU1RBTVBTID0gMzsKKyAgICBVU0VSX1JFUVVFU1RFRF9DTEVBTl9CVUlMRCA9IDQ7CisgICAgLy8gcmVhc29ucyBmb3IgZnVsbCBidWlsZAorICAgIEFQSV9UT09fTE9XX0ZPUl9JTlNUQU5UX1JVTiA9IDU7CisgICAgLy8gZmlyc3QgaW5zdGFsbGF0aW9uIGluIHRoaXMgQW5kcm9pZCBTdHVkaW8gc2Vzc2lvbgorICAgIEZJUlNUX0lOU1RBTExBVElPTl9UT19ERVZJQ0UgPSA2OworICAgIE1BTklGRVNUX1JFU09VUkNFX0NIQU5HRUQgPSA3OworICAgIEZSRUVaRV9TV0FQX1JFUVVJUkVTX0FQSTIxID0gODsKKyAgICBGUkVFWkVfU1dBUF9SRVFVSVJFU19XT1JLSU5HX1JVTl9BUyA9IDk7CisgICAgLy8gcmVhc29ucyBmb3IgZm9yY2VkIGNvbGQgc3dhcCBidWlsZAorICAgIEFQUF9OT1RfUlVOTklORyA9IDEwOworICAgIEFQUF9VU0VTX01VTFRJUExFX1BST0NFU1NFUyA9IDExOworICAgIElOQ1JFTUVOVEFMX0JVSUxEID0gMTI7CisgICAgTk9fSU5TVEFOVF9SVU4gPSAxMzsKKyAgfQorICAvLyBXaGF0IGtpbmQgb2YgSW5zdGFudCBSdW4gZGVwbG95bWVudCB3YXMgY2hvc2VuLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uSW5zdGFudFJ1bi5JbnN0YW50UnVuRGVwbG95bWVudEtpbmQgZGVwbG95bWVudF9raW5kID0gMTsKKyAgLy8gd2hhdCB3YXMgdGhlIHJlYXNvbiBmb3IgY2hvc2luZyB0aGF0IGtpbmQgb2YgZGVwbG95bWVudCBmcm9tIHRoZSBncmFkbGUKKyAgLy8gc2lkZS4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkluc3RhbnRSdW4uSW5zdGFudFJ1bkJ1aWxkQ2F1c2UgaW5zdGFudF9ydW5fYnVpbGRfY2F1c2UgPSAzOworICAvLyB0aW1lIHRoZSBJbnN0YW50UnVuIGVuYWJsZWQgdG9vayBpbiBtaWxsaXNlY29uZHMuCisgIG9wdGlvbmFsIGludDY0IGJ1aWxkX3RpbWUgPSA0OworICAvLyBUaGUgc2Vzc2lvbiBpZCBpcyBhIFVVSUQgd2l0aGluIGEgc2luZ2xlIHJ1biBvZiBBbmRyb2lkIFN0dWRpbworICAvLyB0cmFja2luZyBtdWx0aXBsZSBIT1RfU1dBUCAmIERFWCBidWlsZHMgaW4gdGhlIHNhbWUKKyAgLy8gSVIgc2Vzc2lvbiAoc3RhcnRpbmcgYXQgRlVMTF9BUEsgYW5kIGVuZGluZyBiZWZvcmUgRlVMTF9BUEspLgorICBvcHRpb25hbCBzdHJpbmcgc2Vzc2lvbl9pZCA9IDU7CisgIC8vIHdoYXQgd2FzIHRoZSByZWFzb24gZm9yIGNob3NpbmcgdGhhdCBraW5kIG9mIGRlcGxveW1lbnQgZnJvbSB0aGUgSURFCisgIC8vIHNpZGUuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5JbnN0YW50UnVuLkluc3RhbnRSdW5JZGVCdWlsZENhdXNlIGlkZV9idWlsZF9jYXVzZSA9IDY7Cit9CisKKy8vIGRlc2NyaWJlcyBNZXRyaWNzIG9uIE1ldHJpY3MuCittZXNzYWdlIE1ldGFNZXRyaWNzIHsKKyAgLy8gbnVtYmVyIG9mIHRpbWVzIGNvbm5lY3RpbmcgdG8gdGhlIGNsZWFyY3V0IHNlcnZlciBmYWlsZWQgc2luY2UKKyAgLy8gdGhlIGxhc3Qgc3VjY2Vzc2Z1bCB1cGxvYWQuCisgIG9wdGlvbmFsIGludDMyIGZhaWxlZF9jb25uZWN0aW9ucyA9IDE7CisgIC8vIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIHNlbmQgbWV0cmljcyBpbiB0aGUgbGFzdCB1cGxvYWQuCisgIG9wdGlvbmFsIGludDY0IGJ5dGVzX3NlbnRfaW5fbGFzdF91cGxvYWQgPSAyOworICAvLyBudW1iZXIgb2YgdGltZXMgdGhlIGNsZWFyY3V0IHNlcnZlciBmYWlsZWQgd2l0aCBhbiBodHRwIGVycm9yIHNpbmNlCisgIC8vIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgdXBsb2FkLgorICBvcHRpb25hbCBpbnQzMiBmYWlsZWRfc2VydmVyX3JlcGxpZXMgPSAzOworfQorCisvLyBEZXNjcmliZXMgYSBzZXQgb2YgdGVzdHMgcnVuLgorbWVzc2FnZSBUZXN0UnVuIHsKKyAgLy8gRGVzY3JpYmVzIGhvdyB0ZXN0cyB3aGVyZSBpbnZva2VkLgorICBlbnVtIFRlc3RJbnZvY2F0aW9uVHlwZSB7CisgICAgVU5LTk9XTl9URVNUX0lOVk9DQVRJT05fVFlQRSA9IDA7CisgICAgLy8gVGVzdHMgd2VyZSBydW4gZnJvbSB0aGUgY29tbWFuZC1saW5lLgorICAgIEdSQURMRV9URVNUID0gMTsKKyAgICAvLyBUZXN0cyB3ZXJlIHJ1biBieSBBbmRyb2lkIFN0dWRpbyBydW4gY29uZmlndXJhdGlvbnMgbG9naWMuCisgICAgQU5EUk9JRF9TVFVESU9fVEVTVCA9IDI7CisgICAgLy8gVGVzdHMgd2VyZSBydW4gYnkgR3JhZGxlLCBidXQgaW52b2tlZCB0aHJvdWdoIEFTIFVJLgorICAgIEFORFJPSURfU1RVRElPX1RIUk9VR0hfR1JBRExFX1RFU1QgPSAzOworICB9CisgIC8vIFdoYXQga2luZCBvZiB0ZXN0IGlzIHJ1bi4KKyAgZW51bSBUZXN0S2luZCB7CisgICAgVU5LTk9XTl9URVNUX0tJTkQgPSAwOworICAgIFVOSVRfVEVTVCA9IDE7CisgICAgSU5TVFJVTUVOVEFUSU9OX1RFU1QgPSAyOworICB9CisgIC8vIERlc2NyaWJlcyBob3cgdGVzdHMgd2hlcmUgaW52b2tlZC4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLlRlc3RSdW4uVGVzdEludm9jYXRpb25UeXBlIHRlc3RfaW52b2NhdGlvbl90eXBlID0gMTsKKyAgLy8gVG90YWwgbnVtYmVyIG9mIHRlc3RzIHRoYXQgcmFuLgorICBvcHRpb25hbCBpbnQzMiBudW1iZXJfb2ZfdGVzdHNfZXhlY3V0ZWQgPSAyOworICAvLyBXaGF0IGtpbmQgb2YgdGVzdCBpcyBydW4uCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5UZXN0UnVuLlRlc3RLaW5kIHRlc3Rfa2luZCA9IDM7CisgIC8vIFdoZXRoZXIgdGhlIHRlc3QgcnVuIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSAocmVnYXJkbGVzcyBvZiByZXN1bHRzKSBvcgorICAvLyB0b29saW5nIGVycm9yIGhhcHBlbmVkLgorICBvcHRpb25hbCBib29sIGNyYXNoZWQgPSA0OworICAvLyBTZXQgd2hlbiB0ZXN0X2ludm9jYXRpb25fdHlwZSA9IEdSQURMRSBvciBBTkRST0lEX1NUVURJT19USFJPVUdIX0dSQURMRQorICBvcHRpb25hbCBzdHJpbmcgZ3JhZGxlX3ZlcnNpb24gPSA1OworICAvLyBlLmcuICcyLjEwJworICAvLyBEaWQgdGhlIHVzZXIvcHJvamVjdCBlbmFibGUgY29kZSBjb3ZlcmFnZSBvbiB0aGlzIHRlc3QgcnVuPworICBvcHRpb25hbCBib29sIGNvZGVfY292ZXJhZ2VfZW5hYmxlZCA9IDY7CisgIC8vIFByb3ZpZGVzIGRldGFpbHMgb24gY29tbW9ubHkgdXNlZCB0ZXN0IGxpYnJhcmllcy4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLlRlc3RMaWJyYXJpZXMgdGVzdF9saWJyYXJpZXMgPSA3OworfQorCisvLyBQcm92aWRlcyBkZXRhaWxzIG9uIGNvbW1vbmx5IHVzZWQgdGVzdCBsaWJyYXJpZXMuCittZXNzYWdlIFRlc3RMaWJyYXJpZXMgeworICAvLyBUaGUgZXhhY3QgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gbGlicmFyeSB0aGF0IHRoaXMgcHJvamVjdCB1c2VzLgorICAvLyBOb3QgcHJlc2VudCBpZiBwcm9qZWN0IGRvZXNuJ3QgdXNlIGEgZ2l2ZW4gbGlicmFyeS4KKyAgb3B0aW9uYWwgc3RyaW5nIHRlc3Rfc3VwcG9ydF9saWJyYXJ5X3ZlcnNpb24gPSAxOworICAvLyBlLmcuICcwLjUnCisgIG9wdGlvbmFsIHN0cmluZyBlc3ByZXNzb192ZXJzaW9uID0gMjsKKyAgLy8gZS5nLiAnMi4yLjInCisgIG9wdGlvbmFsIHN0cmluZyByb2JvbGVjdHJpY192ZXJzaW9uID0gMzsKKyAgLy8gZS5nLiAnMy4wJworICBvcHRpb25hbCBzdHJpbmcgbW9ja2l0b192ZXJzaW9uID0gNDsKKyAgLy8gZS5nLiAnMS4xMC4xOScKK30KKworLy8gRGVzY3JpYmVzIHRoZSBzdGF0dXMgb2YgdmFyaW91cyBIeXBlcnZpc29ycworbWVzc2FnZSBIeXBlcnZpc29yIHsKKyAgLy8gU3RhdHVzIG9mIHRoZSBIeXBlci1WIGh5cGVydmlzb3IuCisgIGVudW0gSHlwZXJWU3RhdGUgeworICAgIFVOS05PV05fSFlQRVJWX1NUQVRFID0gMDsKKyAgICAvLyBIYXZlIG5vIGlkZWEKKyAgICBIWVBFUlZfQUJTRU5UID0gMTsKKyAgICAvLyBObyBoeXBlci1WIGZvdW5kCisgICAgSFlQRVJWX0lOU1RBTExFRCA9IDI7CisgICAgLy8gSHlwZXItViBpcyBpbnN0YWxsZWQgYnV0IG5vdCBydW5uaW5nCisgICAgSFlQRVJWX1JVTk5JTkcgPSAzOworICAgIC8vIEh5cGVyLVYgaXMgdXAgYW5kIHJ1bm5pbmcKKyAgICBIWVBFUlZfQ0hFQ0tfRVJST1IgPSA0OworICAgIC8vIEZhaWxlZCB0byBkZXRlY3Qgc3RhdHVzIChlbXVsYXRvci1jaGVjayBlcnJvcikKKyAgfQorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uSHlwZXJ2aXNvci5IeXBlclZTdGF0ZSBoeXBlcl92X3N0YXRlID0gMTsKK30KKworLy8gRGVzY3JpYmVzIHRoZSBzdGF0dXMgb2YgdGhlIG1hY2hpbmUgcnVubmluZyB0aGUgZW11bGF0b3IuCittZXNzYWdlIEVtdWxhdG9ySG9zdCB7CisgIC8vIENQVSBtYW51ZmFjdHVyZXIgb2YgdGhlIGhvc3QsIHVzZWQgYXMgY2VydGFpbiBoeXBlcnZpc29ycyBhcmUgbGltaXRlZAorICAvLyB0byBhIGNlcnRhaW4gbWFudWZhY3R1cmVyLgorICBvcHRpb25hbCBzdHJpbmcgY3B1X21hbnVmYWN0dXJlciA9IDE7CisgIC8vIEFNRCwgSU5URUwsIC4uLgorICAvLyBEb2VzIHRoZSBob3N0IHN1cHBvcnQgdmlydHVhbGl6YXRpb24gdGVjaG5vbG9neQorICBvcHRpb25hbCBib29sIHZpcnRfc3VwcG9ydCA9IDI7CisgIC8vIElzIHRoZSBob3N0IGl0c2VsZiBydW5uaW5nIGluc2lkZSBhIHZpcnR1YWwgbWFjaGluZS4KKyAgb3B0aW9uYWwgYm9vbCBydW5uaW5nX2luX3ZtID0gMzsKKyAgLy8gTWF5IGRpZmZlciBmcm9tIG9zX2FyY2hpdGVjdHVyZSBmaWVsZCBhcyBpdCBpcyBjYWxjdWxhdGVkIGRpZmZlcmVudGx5LAorICAvLyB0cnlpbmcgdG8gY29tcGVuc2F0ZSB0aGUgSlZNIGJpdHRuZXNzLgorICBvcHRpb25hbCBpbnQ2NCBvc19iaXRfY291bnQgPSA0OworfQorCisvLyBEZXRhaWxlZCBwcm9maWxpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBncmFkbGUgYnVpbGQuCittZXNzYWdlIEdyYWRsZUJ1aWxkUHJvZmlsZSB7CisgIC8vIFZlcnNpb24gb2YgdGhlIG9wZW4gc291cmNlIEdyYWRsZSBhcHBsaWNhdGlvbiB1c2VkLgorICAvLyBlLmcuICIyLjE0IiBvciAiMy4wLTIwMTYwNjE3MDAwMDI1KzAwMDAiCisgIG9wdGlvbmFsIHN0cmluZyBncmFkbGVfdmVyc2lvbiA9IDI7CisgIC8vIFRoZSB2YWx1ZSBvZiB0aGUgIm9zLm5hbWUiIHN5c3RlbSBwcm9wZXJ0eS4KKyAgLy8gZS5nLiAiTGludXgiCisgIG9wdGlvbmFsIHN0cmluZyBvc19uYW1lID0gNjsKKyAgLy8gVGhlIHZhbHVlIG9mIHRoZSAib3MudmVyc2lvbiIgc3lzdGVtIHByb3BlcnR5LgorICAvLyBlLmcuICIzLjEzLjAtODYtZ2VuZXJpYyIKKyAgb3B0aW9uYWwgc3RyaW5nIG9zX3ZlcnNpb24gPSA3OworICAvLyBUaGUgdmFsdWUgb2YgdGhlICJqYXZhLnZlcnNpb24iIHN5c3RlbSBwcm9wZXJ0eS4KKyAgLy8gZS5nLiAiMS44LjBfNDAtZWEiCisgIG9wdGlvbmFsIHN0cmluZyBqYXZhX3ZlcnNpb24gPSA4OworICAvLyBUaGUgdmFsdWUgb2YgdGhlICJqYXZhLnZtLnZlcnNpb24iIHN5c3RlbSBwcm9wZXJ0eS4KKyAgLy8gZS5nLiAiMjUuNDAtYjI1IgorICBvcHRpb25hbCBzdHJpbmcgamF2YV92bV92ZXJzaW9uID0gOTsKKyAgLy8gVGhlIHZhbHVlIG9mIFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpCisgIG9wdGlvbmFsIGludDY0IG1heF9tZW1vcnkgPSAxMDsKKyAgLy8gVGhlIHRvdGFsIHRpbWUgdGFrZW4gZm9yIHRoaXMgYnVpbGQgaW4gbWlsbGlzZWNvbmRzLgorICAvLyBUaGlzIGRvZXMgbm90IGluY2x1ZGUgR3JhZGxlJ3Mgc3RhcnR1cCAoYmVmb3JlIHBsdWdpbiBhcHBseSkgb3Igc2h1dGRvd24KKyAgLy8gKGFmdGVyIEJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChCdWlsZFJlc3VsdCkgY2FsbGVkLgorICBvcHRpb25hbCBpbnQ2NCBidWlsZF90aW1lID0gMTE7CisgIC8vIFRoZSBudW1iZXIgb2YgZ2FyYmFnZSBjb2xsZWN0aW9ucyBkdXJpbmcgdGhpcyBidWlsZAorICBvcHRpb25hbCBpbnQ2NCBnY19jb3VudCA9IDEyOworICAvLyBUaGUgdGltZSBzcGVudCBnYXJiYWdlIGNvbGxlY3RpbmcgZHVyaW5nIHRoaXMgYnVpbGQuCisgIG9wdGlvbmFsIGludDY0IGdjX3RpbWUgPSAxMzsKKyAgLy8gVGhlIHByb2plY3RzIHRoYXQgbWFrZSB1cCB0aGlzIG11bHRpLXByb2plY3QgYnVpbGQuCisgIHJlcGVhdGVkIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVCdWlsZFByb2plY3QgcHJvamVjdCA9IDE0OworICAvLyBTYW1wbGVzIG9mIHRoZSBtZW1vcnkgc3RhdGUgb2YgdGhlIGRhZW1vbiBkdXJpbmcgdGhlIGJ1aWxkLgorICByZXBlYXRlZCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlQnVpbGRNZW1vcnlTYW1wbGUgbWVtb3J5X3NhbXBsZSA9IDE1OworICAvLyBUaGUgZmluZS1ncmFpbmVkIGV4ZWN1dGlvbiBzcGFucyB3aGljaCByZWNvcmQgZ3JhbnVsYXIgdGltaW5ncy4KKyAgcmVwZWF0ZWQgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUJ1aWxkUHJvZmlsZVNwYW4gc3BhbiA9IDE2OworICAvLyBGb3IgaW5zdGFudCBydW4gYnVpbGRzOiB0aGUgcmVzdWx0aW5nIGluc3RhbnQgcnVuIGJ1aWxkIGluZm8uCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5JbnN0YW50UnVuU3RhdHVzIGluc3RhbnRfcnVuX3N0YXR1cyA9IDE3OworICAvLyBDbGllbnQtc2lkZSBzYWx0ZWQsIHNoYTI1NiBvZiB0aGUgcm9vdCBwcm9qZWN0IHBhdGguCisgIC8vIFRoaXMgZXhpc3RzIHRvIGFsbG93IG11bHRpcGxlIGluc3RhbnQgcnVuIGJ1aWxkcyBpbiBvbmUgcHJvamVjdCBieSBvbmUKKyAgLy8gdXNlciB0byBiZSBjb3JyZWxhdGVkLgorICAvLworICAvLyBUaGUgc2FsdCBpcyByb3RhdGVkIGV2ZXJ5IDI4IGRheXMsIHNvIGl0IGlzIG5vdCBhIHBlcm1lbmFudCBwc2V1ZG9ueW1vdXMKKyAgLy8gaWRlbnRpZmllci4gSXQgaXMgYW5vbnltaXplZCBhbmQgaXMgdW5pcXVlIHBlciB1c2VyLCBidXQgaGFzIGEgMS1OCisgIC8vIHJlbGF0aW9uLgorICBvcHRpb25hbCBzdHJpbmcgcHJvamVjdF9pZCA9IDE4OworfQorCittZXNzYWdlIEdyYWRsZUJ1aWxkUHJvamVjdCB7CisgIGVudW0gUGx1Z2luVHlwZSB7CisgICAgVU5LTk9XTl9QTFVHSU5fVFlQRSA9IDA7CisgICAgLy8gVGhlICdjb20uYW5kcm9pZC5hcHBsaWNhdGlvbicgb3IgJ2NvbS5hbmRyb2lkLm1vZGVsLmFwcGxpY2F0aW9uJyBwbHVnaW5zLgorICAgIEFQUExJQ0FUSU9OID0gMTsKKyAgICAvLyBUaGUgJ2NvbS5hbmRyb2lkLmxpYnJhcnknIG9yICdjb20uYW5kcm9pZC5tb2RlbC5saWJyYXJ5JyBwbHVnaW5zLgorICAgIExJQlJBUlkgPSAyOworICAgIC8vIFRoZSAnY29tLmFuZHJvaWQudGVzdCcgcGx1Z2luLgorICAgIFRFU1QgPSAzOworICAgIC8vIFRoZSAnY29tLmFuZHJvaWQuYXRvbScgcGx1Z2luLgorICAgIEFUT00gPSA0OworICAgIC8vIFRoZSAnY29tLmFuZHJvaWQuaW5zdGFudGFwcCcgcGx1Z2luLgorICAgIElOU1RBTlRBUFAgPSA1OworICB9CisgIGVudW0gUGx1Z2luR2VuZXJhdGlvbiB7CisgICAgVU5LTk9XTl9QTFVHSU5fR0VORVJBVElPTiA9IDA7CisgICAgLy8gVGhlICdjb20uYW5kcm9pZC5bYXBwbGljYXRpb24sbGlicmFyeSx0ZXN0LGF0b20saW5zdGFudGFwcF0gcGx1Z2lucy4KKyAgICBGSVJTVCA9IDE7CisgICAgLy8gVGhlICdjb20uYW5kcm9pZC5tb2RlbC5bYXBwbGljYXRpb24sbGlicmFyeV0nIHBsdWdpbnMKKyAgICBDT01QT05FTlRfTU9ERUwgPSAyOworICB9CisgIC8vIElkZW50aWZpZXIsIGxvY2FsIHRvIHRoZSBjb250YWluaW5nIEFuZHJvaWRTdHVkaW9FdmVudCwgZm9yIHRoZSBwcm9qZWN0LgorICAvLyBDYW4gYmUgdXNlZCB0byBjb3JyZWxhdGUgc3BhbnMgKEdyYWRsZUJ1aWxkUHJvZmlsZVNwYW4pIHdpdGggdGhpcworICAvLyBwcm9qZWN0IGZvciB0aGlzIGJ1aWxkIG9ubHkuIElzIGNyZWF0ZWQgYnkgc2VxdWVudGlhbGx5CisgIC8vIG51bWJlcmluZyBwcm9qZWN0cyBhcyB0aGV5IGFyZSBlbmNvdW50ZXJlZC4KKyAgLy8gSXMgbm90IHN0YWJsZSBhY3Jvc3MgYnVpbGQgaW52b2NhdGlvbnMuCisgIG9wdGlvbmFsIGludDY0IGlkID0gMTsKKyAgLy8gVmVyc2lvbiBvZiBvdXIgQW5kcm9pZCBHcmFkbGUgcGx1Z2luIHN1cHBvcnRpbmcgYW5kcm9pZCBidWlsZHMuCisgIC8vIGUuZy4gJzIuMC1iZXRhMScKKyAgLy8gRm9yIHRoZSBleHBlcmltZW50YWwgcGx1Z2luIHRoaXMgaXMgdGhlIGdyYWRsZS1jb3JlIHZlcnNpb24uCisgIG9wdGlvbmFsIHN0cmluZyBhbmRyb2lkX3BsdWdpbl92ZXJzaW9uID0gMjsKKyAgLy8gV2hpY2ggQW5kcm9pZCBHcmFkbGUgcGx1Z2luIGlzIHVzZWQuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVCdWlsZFByb2plY3QuUGx1Z2luVHlwZSBhbmRyb2lkX3BsdWdpbiA9IDM7CisgIC8vIFdoaWNoIHBsdWdpbiBnZW5lcmF0aW9uIGlzIHVzZWQuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVCdWlsZFByb2plY3QuUGx1Z2luR2VuZXJhdGlvbiBwbHVnaW5fZ2VuZXJhdGlvbiA9IDQ7CisgIC8vIFRoZSBidWlsZCB0b29scyB2ZXJzaW9uIHVzZWQsIGUuZy4gJzI0LjAuMCByYzInCisgIG9wdGlvbmFsIHN0cmluZyBidWlsZF90b29sc192ZXJzaW9uID0gNTsKKyAgLy8gU3RhdGlzdGljcyBhYm91dCB0aGUgcHJvamVjdCBidWlsZC4KKyAgLy8gV2lsbCBiZSB1c2VkIHRvIGNoYXJhY3Rlcml6ZSBhbmQgYnVja2V0IHByb2plY3RzIGZvciBzdWJncm91cCBhbmFseXNpcy4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUJ1aWxkUHJvamVjdE1ldHJpY3MgbWV0cmljcyA9IDY7CisgIC8vIFRoZSB2YXJpYW50cyBpbiB0aGlzIHByb2plY3QKKyAgcmVwZWF0ZWQgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUJ1aWxkVmFyaWFudCB2YXJpYW50ID0gNzsKKyAgLy8gRm9yIGluc3RhbnRBcHBzLCB0aGUgbnVtYmVyIG9mIGRlcGVuZGVudCBhdG9tcy4KKyAgb3B0aW9uYWwgaW50NjQgYXRvbXMgPSA4OworfQorCittZXNzYWdlIEdyYWRsZUJ1aWxkUHJvamVjdE1ldHJpY3MgeworICAvLyBUaGUgdGltZSB0YWtlbiB0byBjb2xsZWN0IHRoZXNlIG1ldHJpY3MKKyAgb3B0aW9uYWwgaW50NjQgbWV0cmljc190aW1lX25zID0gMTsKKyAgLy8gVGhlIHNpemUgb2YgdGhlIEFQSyBidWlsdCwgaWYgcmVsZXZhbnQuCisgIG9wdGlvbmFsIGludDY0IGFwa19zaXplID0gMjsKKyAgLy8gVGhlIHNpemUgb2YgdGhlIHJlc291cmNlc19hcCBpbmNsdWRlZCBpbiB0aGF0IGFway4KKyAgb3B0aW9uYWwgaW50NjQgcmVzb3VyY2VzX2FwX3NpemUgPSAzOworfQorCittZXNzYWdlIEdyYWRsZUJ1aWxkVmFyaWFudCB7CisgIC8vIFRoZSBuYXR1cmUgb2YgdGhpcyB2YXJpYW50LgorICAvLyBUaGUgdGVzdCB2YXJpYW50cyBoYXZlIGFuIGFzc29jaWF0ZWQgdGVzdGVkIHZhcmlhbnQuCisgIC8vIFNlZSBjb20uYW5kcm9pZC5idWlsZGVyLmNvcmUuVmFyaWFudFR5cGUKKyAgZW51bSBWYXJpYW50VHlwZSB7CisgICAgLy8gRm9yIGJ1aWxkaW5nIGFuIEFQSy4KKyAgICBBUFBMSUNBVElPTiA9IDA7CisgICAgLy8gRm9yIGJ1aWxkaW5nIGFuIEFBUi4KKyAgICBMSUJSQVJZID0gMTsKKyAgICAvLyBGb3IgYnVpbGRpbmcgYSB0ZXN0IEFQSy4KKyAgICBBTkRST0lEX1RFU1QgPSAyOworICAgIC8vIEZvciBidWlsZGluZyB1bml0IHRlc3RzIHRvIHJ1biBsb2NhbGx5LgorICAgIFVOSVRfVEVTVCA9IDM7CisgICAgLy8gRm9yIGJ1aWxkaW5nIGFuIGF0b21idW5kbGUuCisgICAgQVRPTSA9IDQ7CisgICAgLy8gRm9yIGJ1aWxkaW5nIGFuIElBUEsuCisgICAgSU5TVEFOVEFQUCA9IDU7CisgIH0KKyAgLy8gSWRlbnRpZmllciwgbG9jYWwgdG8gdGhpcyBBbmRyb2lkU3R1ZGlvRXZlbnQsIGZvciB0aGUgdmFyaWFudC4KKyAgLy8gQ2FuIGJlIHVzZWQgdG8gY29ycmVsYXRlIHNwYW5zIChHcmFkbGVCdWlsZFByb2ZpbGVTcGFuKSB3aXRoIHRoaXMKKyAgLy8gcHJvamVjdCBmb3IgdGhpcyBidWlsZCBvbmx5LiBJcyBjcmVhdGVkIGJ5IHNlcXVlbnRpYWxseQorICAvLyBudW1iZXJpbmcgdmFyaWFudHMgYXMgdGhleSBhcmUgY3JlYXRlZC4KKyAgLy8gSXMgbm90IHN0YWJsZSBhY3Jvc3MgYnVpbGQgaW52b2NhdGlvbnMuCisgIG9wdGlvbmFsIGludDY0IGlkID0gMTsKKyAgLy8gV2hldGhlciB0aGUgdmFyaWFudCBpcyBkZWJ1Z2dhYmxlLgorICBvcHRpb25hbCBib29sIGlzX2RlYnVnID0gMjsKKyAgLy8gV2hldGhlciB0aGUgdmFyaWFudCBpcyBjb21waWxlZCB1c2luZyBqYWNrCisgIG9wdGlvbmFsIGJvb2wgdXNlX2phY2sgPSAzOworICAvLyBXaGV0aGVyIHRoZSB2YXJpYW50IGlzIG1pbmlmaWVkCisgIG9wdGlvbmFsIGJvb2wgbWluaWZ5X2VuYWJsZWQgPSA0OworICAvLyBJcyBtdWx0aWRleCBlbmFibGVkIGZvciB0aGUgdmFyaWFudAorICBvcHRpb25hbCBib29sIHVzZV9tdWx0aWRleCA9IDU7CisgIC8vIElzIGxlZ2FjeSAocHJlLWFwaSAxOSkgbXVsdGlkZXggZW5hYmxlZCBmb3IgdGhlIHZhcmlhbnQuCisgIC8vIE9ubHkgY2FuIHRydWUgaWYgdXNlX211bHRpZGV4IGlzIGFsc28gdHJ1ZS4KKyAgb3B0aW9uYWwgYm9vbCB1c2VfbGVnYWN5X211bHRpZGV4ID0gNjsKKyAgLy8gVGhlIHR5cGUgb2YgdmFyaWFudC4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZUJ1aWxkVmFyaWFudC5WYXJpYW50VHlwZSB2YXJpYW50X3R5cGUgPSA3OworICAvLyBGb3IgdGVzdCB2YXJpYW50cywgdGhlIHRlc3RlZCB2YXJpYW50IGlkLiAoU2VlIEdyYWRsZUJ1aWxkVmFyaWFudC5pZCkKKyAgb3B0aW9uYWwgaW50NjQgdGVzdGVkX2lkID0gODsKK30KKworbWVzc2FnZSBHcmFkbGVCdWlsZE1lbW9yeVNhbXBsZSB7CisgIC8vIEdhcmJhZ2UgY29sbGVjdGlvbiB0aW1lIHNpbmNlIHRoZSBjdXJyZW50IGRhZW1vbiBzdGFydGVkLgorICBvcHRpb25hbCBpbnQ2NCBnY190aW1lX21zID0gMTsKKyAgLy8gR2FyYmFnZSBjb2xsZWN0aW9uIGNvdW50IHNpbmNlIHRoZSBjdXJyZW50IGRhZW1vbiBzdGFydGVkLgorICBvcHRpb25hbCBpbnQ2NCBnY19jb3VudCA9IDI7CisgIC8vIFRpbWUgdGhhdCB0aGUgbWVtb3J5IHN0YXRzIHdlcmUgY29sbGVjdGVkLgorICBvcHRpb25hbCBpbnQ2NCB0aW1lc3RhbXAgPSAzOworfQorCisvLyBBIHNpbmdsZSBleGVjdXRpb24gc3BhbiBmcm9tIGEgYnVpbGQuCisvLyBGb3IgZXhhbXBsZSwgYSB0YXNrIGV4ZWN1dGlvbiBvciBjcmVhdGlvbiBvZiBzb21lIHRhc2tzIGZvciBhIHZhcmlhbnQuCittZXNzYWdlIEdyYWRsZUJ1aWxkUHJvZmlsZVNwYW4geworICAvLyBUaGUgdHlwZSBvZiBleGVjdXRpb24uCisgIC8vIFRoaXMgd2FzIG9yaWdpbmFsbHkgY29tLmFuZHJvaWQuYnVpbGRlci5wcm9maWxlLkV4ZWN1dGlvblR5cGUuCisgIGVudW0gRXhlY3V0aW9uVHlwZSB7CisgICAgU09NRV9SQU5ET01fUFJPQ0VTU0lORyA9IDE7CisgICAgQkFTRV9QTFVHSU5fUFJPSkVDVF9DT05GSUdVUkUgPSAyOworICAgIEJBU0VfUExVR0lOX1BST0pFQ1RfQkFTRV9FWFRFTlNJT05fQ1JFQVRJT04gPSAzOworICAgIEJBU0VfUExVR0lOX1BST0pFQ1RfVEFTS1NfQ1JFQVRJT04gPSA0OworICAgIEJBU0VfUExVR0lOX0JVSUxEX0ZJTklTSEVEID0gNTsKKyAgICBUQVNLX01BTkFHRVJfQ1JFQVRFX1RBU0tTID0gNjsKKyAgICBCQVNFX1BMVUdJTl9DUkVBVEVfQU5EUk9JRF9UQVNLUyA9IDc7CisgICAgVkFSSUFOVF9NQU5BR0VSX0NSRUFURV9BTkRST0lEX1RBU0tTID0gODsKKyAgICBWQVJJQU5UX01BTkFHRVJfQ1JFQVRFX1RBU0tTX0ZPUl9WQVJJQU5UID0gOTsKKyAgICBWQVJJQU5UX01BTkFHRVJfQ1JFQVRFX0xJTlRfVEFTS1MgPSAxMDsKKyAgICBWQVJJQU5UX01BTkFHRVJfQ1JFQVRFX1RFU1RTX1RBU0tTID0gMTE7CisgICAgVkFSSUFOVF9NQU5BR0VSX0NSRUFURV9WQVJJQU5UUyA9IDEyOworICAgIFJFU09MVkVfREVQRU5ERU5DSUVTID0gMTM7CisgICAgVEFTS19FWEVDVVRJT04gPSAxNDsKKyAgICBJTklUSUFMX01FVEFEQVRBID0gMTAwOworICAgIEZJTkFMX01FVEFEQVRBID0gMTAxOworICAgIEdFTkVSQUxfQ09ORklHID0gMTAyOworICAgIFZBUklBTlRfQ09ORklHID0gMTAzOworICAgIFZBUklBTlRfTUFOQUdFUl9FWFRFUk5BTF9OQVRJVkVfQ09ORklHX1ZBTFVFUyA9IDEwNDsKKyAgICBBUEtfTUVUUklDUyA9IDEwNTsKKyAgICAvLyBBcHBsaWNhdGlvblRhc2tNYW5hZ2VyIHBlciB2YXJpYW50IHRhc2tzLgorICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX01BTklGRVNUX1RBU0sgPSAxMDAwOworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX0dFTkVSQVRFX1JFU19WQUxVRVNfVEFTSyA9IDEwMDE7CisgICAgQVBQX1RBU0tfTUFOQUdFUl9DUkVBVEVfQ1JFQVRFX1JFTkRFUlNDUklQVF9UQVNLID0gMTAwMjsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9NRVJHRV9SRVNPVVJDRVNfVEFTSyA9IDEwMDM7CisgICAgQVBQX1RBU0tfTUFOQUdFUl9DUkVBVEVfTUVSR0VfQVNTRVRTX1RBU0sgPSAxMDA0OworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX0JVSUxEX0NPTkZJR19UQVNLID0gMTAwNTsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9QUk9DRVNTX1JFU19UQVNLID0gMTAwNjsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9BSURMX1RBU0sgPSAxMDA3OworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX0NPTVBJTEVfVEFTSyA9IDEwMDg7CisgICAgQVBQX1RBU0tfTUFOQUdFUl9DUkVBVEVfTkRLX1RBU0sgPSAxMDA5OworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX1NQTElUX1RBU0sgPSAxMDEwOworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX1BBQ0tBR0lOR19UQVNLID0gMTAxMTsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9QUkVQUk9DRVNTX1JFU09VUkNFU19UQVNLID0gMTAxMjsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9CQUNLUE9SVF9SRVNPVVJDRVNfVEFTSyA9IDEwMTM7CisgICAgQVBQX1RBU0tfTUFOQUdFUl9DUkVBVEVfTElOVF9UQVNLID0gMTAxNDsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9NRVJHRV9KTklMSUJTX0ZPTERFUlNfVEFTSyA9IDEwMTU7CisgICAgQVBQX1RBU0tfTUFOQUdFUl9DUkVBVEVfU0hBREVSX1RBU0sgPSAxMDE2OworICAgIEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX0VYVEVSTkFMX05BVElWRV9CVUlMRF9UQVNLID0gMTAxNzsKKyAgICBBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9TVFJJUF9OQVRJVkVfTElCUkFSWV9UQVNLID0gMTAxODsKKyAgICAvLyBMaWJyYXJ5VGFza01hbmFnZXIgcGVyIHZhcmlhbnQgdGFza3MuCisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfTUVSR0VfTUFOSUZFU1RfVEFTSyA9IDIwMDA7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfR0VORVJBVEVfUkVTX1ZBTFVFU19UQVNLID0gMjAwMTsKKyAgICBMSUJfVEFTS19NQU5BR0VSX0NSRUFURV9DUkVBVEVfUkVOREVSU0NSSVBUX1RBU0sgPSAyMDAyOworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX1JFU09VUkNFU19UQVNLID0gMjAwMzsKKyAgICBMSUJfVEFTS19NQU5BR0VSX0NSRUFURV9NRVJHRV9BU1NFVFNfVEFTSyA9IDIwMDQ7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfQlVJTERfQ09ORklHX1RBU0sgPSAyMDA1OworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX1BST0NFU1NfUkVTX1RBU0sgPSAyMDA2OworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX0FJRExfVEFTSyA9IDIwMDc7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfQ09NUElMRV9UQVNLID0gMjAwODsKKyAgICBMSUJfVEFTS19NQU5BR0VSX0NSRUFURV9OREtfVEFTSyA9IDIwMDk7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfU1BMSVRfVEFTSyA9IDIwMTA7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfUEFDS0FHSU5HX1RBU0sgPSAyMDExOworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX1BST0dVQVJEX0ZJTEVfVEFTSyA9IDIwMTI7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfUE9TVF9DT01QSUxBVElPTl9UQVNLID0gMjAxMzsKKyAgICBMSUJfVEFTS19NQU5BR0VSX0NSRUFURV9QUk9HVUFSRF9UQVNLID0gMjAxNDsKKyAgICBMSUJfVEFTS19NQU5BR0VSX0NSRUFURV9QQUNLQUdFX0xPQ0FMX0pBUiA9IDIwMTU7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfQkFDS1BPUlRfUkVTT1VSQ0VTX1RBU0sgPSAyMDE2OworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX0xJTlRfVEFTSyA9IDIwMTc7CisgICAgTElCX1RBU0tfTUFOQUdFUl9DUkVBVEVfU0hBREVSX1RBU0sgPSAyMDE4OworICAgIExJQl9UQVNLX01BTkFHRVJfQ1JFQVRFX0VYVEVSTkFMX05BVElWRV9CVUlMRF9UQVNLID0gMjAxOTsKKyAgICAvLyBUYXNrIGV4ZWN1dGlvbjogRGVwcmVjYXRlZCwgdXNlIFRBU0tfRVhFQ1VUSU9OIGFuZAorICAgIC8vIEdyYWRsZVRhc2tFeGVjdXRpb24jVHlwZSBpbnN0ZWFkLgorICAgIC8vIERlcHJlY2F0ZWQgSnVseSAyMDE2LgorICAgIEdFTkVSSUNfVEFTS19FWEVDVVRJT04gPSAzMDAwOworICAgIFRBU0tfQUlETF9DT01QSUxFID0gMzAwMTsKKyAgICBUQVNLX0RFTEVURSA9IDMwMDI7CisgICAgVEFTS19DSEVDS19NQU5JRkVTVCA9IDMwMDM7CisgICAgVEFTS19QUkVQQVJFX0RFUEVOREVOQ0lFU19UQVNLID0gMzAwNDsKKyAgICBUQVNLX1JFTkRFUlNDUklQVF9DT01QSUxFID0gMzAwNTsKKyAgICBUQVNLX0dFTkVSQVRFX0JVSUxEX0NPTkZJRyA9IDMwMDY7CisgICAgVEFTS19NRVJHRV9BU1NFVFMgPSAzMDA3OworICAgIFRBU0tfR0VORVJBVEVfUkVTX1ZBTFVFUyA9IDMwMDg7CisgICAgVEFTS19NRVJHRV9SRVNPVVJDRVMgPSAzMDA5OworICAgIFRBU0tfTUVSR0VfTUFOSUZFU1RTID0gMzAxMDsKKyAgICBUQVNLX1BST0NFU1NfQU5EUk9JRF9SRVNPVVJDRVMgPSAzMDExOworICAgIFRBU0tfSkFWQV9DT01QSUxFID0gMzAxMjsKKyAgICBUQVNLX05ES19DT01QSUxFID0gMzAxMzsKKyAgICBUQVNLX1BSRV9ERVggPSAzMDE0OworICAgIFRBU0tfREVYID0gMzAxNTsKKyAgICBUQVNLX1BBQ0tBR0VfU1BMSVRfUkVTID0gMzAxNjsKKyAgICBUQVNLX1BST0NFU1NfUkVTT1VSQ0VTID0gMzAxNzsKKyAgICBUQVNLX1ZBTElEQVRFX1NJR05JTkdfVEFTSyA9IDMwMTg7CisgICAgVEFTS19QQUNLQUdFX0FQUExJQ0FUSU9OID0gMzAxOTsKKyAgICBUQVNLX1NQTElUX1pJUF9BTElHTiA9IDMwMjA7CisgICAgVEFTS19aSVBfQUxJR04gPSAzMDIxOworICAgIFRBU0tfQ09QWSA9IDMwMjI7CisgICAgVEFTS19MSU5UID0gMzAyMzsKKyAgICBUQVNLX0ZJTEVfVkVSSUZJQ0FUSU9OID0gMzAyNjsKKyAgICBUQVNLX0VYVEVSTkFMX05BVElWRV9CVUlMRF9HRU5FUkFURV9KU09OX1BST0NFU1NfUEVSX0FCSSA9IDMwMjc7CisgICAgVEFTS19FWFRFUk5BTF9OQVRJVkVfQlVJTERfR0VORVJBVEVfSlNPTl9QUk9DRVNTID0gMzAyODsKKyAgICAvLyBUcmFuc2Zvcm0gZXhlY3V0aW9uCisgICAgVEFTS19UUkFOU0ZPUk1fUFJFUEFSQVRJT04gPSAzMDI0OworICAgIFRBU0tfVFJBTlNGT1JNID0gMzAyNTsKKyAgICAvLyBBdG9tVGFza01hbmFnZXIgcGVyIHZhcmlhbnQgdGFza3MuCisgICAgQVRPTV9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX01BTklGRVNUX1RBU0sgPSA0MDAwOworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9HRU5FUkFURV9SRVNfVkFMVUVTX1RBU0sgPSA0MDAxOworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9DUkVBVEVfUkVOREVSU0NSSVBUX1RBU0sgPSA0MDAyOworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9NRVJHRV9SRVNPVVJDRVNfVEFTSyA9IDQwMDM7CisgICAgQVRPTV9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX0FTU0VUU19UQVNLID0gNDAwNDsKKyAgICBBVE9NX1RBU0tfTUFOQUdFUl9DUkVBVEVfQlVJTERfQ09ORklHX1RBU0sgPSA0MDA1OworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9QUk9DRVNTX1JFU19UQVNLID0gNDAwNjsKKyAgICBBVE9NX1RBU0tfTUFOQUdFUl9DUkVBVEVfQUlETF9UQVNLID0gNDAwNzsKKyAgICBBVE9NX1RBU0tfTUFOQUdFUl9DUkVBVEVfU0hBREVSX1RBU0sgPSA0MDA4OworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9OREtfVEFTSyA9IDQwMDk7CisgICAgQVRPTV9UQVNLX01BTkFHRVJfQ1JFQVRFX0VYVEVSTkFMX05BVElWRV9CVUlMRF9UQVNLID0gNDAxMDsKKyAgICBBVE9NX1RBU0tfTUFOQUdFUl9DUkVBVEVfTUVSR0VfSk5JTElCU19GT0xERVJTX1RBU0sgPSA0MDExOworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9DT01QSUxFX1RBU0sgPSA0MDEyOworICAgIEFUT01fVEFTS19NQU5BR0VSX0NSRUFURV9CVU5ETElOR19UQVNLID0gNDAxMzsKKyAgICBBVE9NX1RBU0tfTUFOQUdFUl9DUkVBVEVfTElOVF9UQVNLID0gNDAxNDsKKyAgICAvLyBJbnN0YW50QXBwVGFza01hbmFnZXIgcGVyIHZhcmlhbnQgdGFza3MuCisgICAgSU5TVEFOVEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX01FUkdFX01BTklGRVNUX1RBU0sgPSA1MDAwOworICAgIElOU1RBTlRBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9BVE9NX1BBQ0tBR0lOR19UQVNLUyA9IDUwMDE7CisgICAgSU5TVEFOVEFQUF9UQVNLX01BTkFHRVJfQ1JFQVRFX1BST0NFU1NfUkVTX1RBU0sgPSA1MDAyOworICAgIElOU1RBTlRBUFBfVEFTS19NQU5BR0VSX0NSRUFURV9QQUNLQUdJTkdfVEFTSyA9IDUwMDM7CisgIH0KKyAgLy8gSWRlbnRpZmllciBmb3IgdGhpcyBzcGFuLCBjcmVhdGVkIGJ5IHNlcXVlbnRpYWxseSBhbGxvY2F0aW5nIElEcyB0byBzcGFucworICAvLyBhcyB0aGV5IHN0YXJ0LiBVc2VkIG9ubHkgZm9yIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHNwYW5zLCB0bworICAvLyBzaG93IGV4ZWN1dGlvbiB0aGF0IGlzIHBhcnQgb2YgYW5vdGhlciBzcGFuLgorICAvLyBOb3Qgc3RhYmxlIG9yIG1lYW5pbmdmdWwgYWNyb3NzIGJ1aWxkcy4KKyAgb3B0aW9uYWwgaW50NjQgaWQgPSAxOworICAvLyBGb3IgbmVzdGVkIHNwYW5zOiB0aGUgaWQgZm9yIGNvbnRhaW5pbmcgc3Bhbi4KKyAgLy8gU2VlIEdyYWRsZUJ1aWxkUHJvZmlsZVNwYW4uaWQuCisgIG9wdGlvbmFsIGludDY0IHBhcmVudF9pZCA9IDI7CisgIC8vIFRoZSBzdGFydCB0aW1lIG9mIHRoaXMgZXZlbnQKKyAgb3B0aW9uYWwgaW50NjQgc3RhcnRfdGltZV9pbl9tcyA9IDM7CisgIC8vIFRoZSBkdXJhdGlvbiBvZiB0aGlzIGV2ZW50LiBNYXkgYmUgemVyby4KKyAgb3B0aW9uYWwgaW50NjQgZHVyYXRpb25faW5fbXMgPSA0OworICAvLyBUaGUgdHlwZSBvZiBldmVudCByZWNvcmRlZAorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlQnVpbGRQcm9maWxlU3Bhbi5FeGVjdXRpb25UeXBlIHR5cGUgPSA1OworICAvLyBNb3JlIGluZm9ybWF0aW9ucyBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIFRyYW5zZm9ybVRhc2tzLgorICAvLyBPbmx5IHVzZWQgd2hlbiBleGVjdXRpb25UeXBlIGlzIFRBU0tfVFJBTlNGT1JNX1BSRVBBUkFUSU9OIG9yCisgIC8vIFRBU0tfVFJBTlNGT1JNLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlVHJhbnNmb3JtRXhlY3V0aW9uIHRyYW5zZm9ybSA9IDY7CisgIC8vIE1vcmUgaW5mb3JtYXRpb25zIGFib3V0IHRoZSBleGVjdXRpb24gb2YgVGFza3MuCisgIC8vIE9ubHkgdXNlZCB3aGVuIGV4ZWN1dGlvblR5cGUgaXMgVEFTS19FWEVDVVRJT04KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkdyYWRsZVRhc2tFeGVjdXRpb24gdGFzayA9IDk7CisgIC8vIFNlc3Npb24gaWQgb2YgdGhlIEdyYWRsZUJ1aWxkUHJvamVjdCB0aGF0IHRoaXMgc3BhbiBpcyBwYXJ0IG9mLgorICAvLyBUaGUgSUQgaXMgbm90IHN0YWJsZSBub3IgbWVhbmluZ2Z1bCBvdmVyIG11bHRpcGxlIEdyYWRsZUJ1aWxkUHJvZmlsZS4KKyAgLy8gU2VlIEdyYWRsZUJ1aWxkUHJvZmlsZS5pZAorICBvcHRpb25hbCBpbnQ2NCBwcm9qZWN0ID0gNzsKKyAgLy8gU2Vzc2lvbiBpZCBvZiB0aGUgR3JhZGxlQnVpbGRWYXJpYW50IHRoYXQgdGhpcyBzcGFuIGlzIHBhcnQgb2YuCisgIC8vIFRoZSBJRCBpcyBub3Qgc3RhYmxlIG5vciBtZWFuaW5nZnVsIG92ZXIgbXVsdGlwbGUgR3JhZGxlQnVpbGRQcm9maWxlLgorICAvLyBTZWUgR3JhZGxlQnVpbGRWYXJpYW50LmlkCisgIG9wdGlvbmFsIGludDY0IHZhcmlhbnQgPSA4OworfQorCittZXNzYWdlIEdyYWRsZVRhc2tFeGVjdXRpb24geworICBlbnVtIFR5cGUgeworICAgIFVOS05PV05fVEFTS19UWVBFID0gMDsKKyAgICBBSURMX0NPTVBJTEUgPSAxOworICAgIEFORFJPSURfSkFSID0gMjsKKyAgICBBTkRST0lEX0pBVkFfQ09NUElMRSA9IDM7CisgICAgQU5EUk9JRF9SRVBPUlQgPSA0OworICAgIEFORFJPSURfVU5JVF9URVNUID0gNTsKKyAgICBCVUlMRF9FTVVMQVRPUiA9IDY7CisgICAgQlVJTERfSU5GT19MT0FERVIgPSA3OworICAgIENIRUNLX01BTklGRVNUID0gODsKKyAgICBDT01QQVRJQkxFX1NDUkVFTlNfTUFOSUZFU1QgPSA5OworICAgIENSRUFURV9NQU5JRkVTVF9LRUVQX0xJU1QgPSAxMDsKKyAgICBEQVRBX0JJTkRJTkdfRVhQT1JUX0JVSUxEX0lORk8gPSAxMTsKKyAgICBEQVRBX0JJTkRJTkdfUFJPQ0VTU19MQVlPVVRTID0gMTI7CisgICAgREVQRU5ERU5DWV9SRVBPUlQgPSAxMzsKKyAgICBERVZJQ0VfUFJPVklERVJfSU5TVFJVTUVOVF9URVNUID0gMTQ7CisgICAgRVhURVJOQUxfQlVJTERfQU5DSE9SID0gMTU7CisgICAgRVhURVJOQUxfTkFUSVZFX0JVSUxEX0pTT04gPSAxNjsKKyAgICBFWFRFUk5BTF9OQVRJVkVfQlVJTEQgPSAxNzsKKyAgICBFWFRSQUNUX0FOTk9UQVRJT05TID0gMTg7CisgICAgRVhUUkFDVF9KQVZBX1JFU09VUkNFUyA9IDE5OworICAgIEVYVFJBQ1RfUFJPR1VBUkRfRklMRVMgPSAyMDsKKyAgICBGQVNUX0RFUExPWV9SVU5USU1FX0VYVFJBQ1RPUiA9IDIxOworICAgIEZJTFRFUkVEX0pBUl9DT1BZID0gMjI7CisgICAgR0VORVJBVEVfQVBLX0RBVEEgPSAyMzsKKyAgICBHRU5FUkFURV9CVUlMRF9DT05GSUcgPSAyNDsKKyAgICBHRU5FUkFURV9JTlNUQU5UX1JVTl9BUFBfSU5GTyA9IDI1OworICAgIEdFTkVSQVRFX1JFU19WQUxVRVMgPSAyNjsKKyAgICBHRU5FUkFURV9TUExJVF9BQklfUkVTID0gMjc7CisgICAgR09PR0xFX1NFUlZJQ0VTID0gMjg7CisgICAgSU5DUkVNRU5UQUxfU0FGRUdVQVJEID0gMjk7CisgICAgSU5TVEFMTF9WQVJJQU5UID0gMzA7CisgICAgSU5TVEFOVF9SVU5fU1BMSVRfQVBLX0JVSUxERVIgPSAzMTsKKyAgICBJTlNUQU5UX1JVTl9XUkFQUEVSID0gMzI7CisgICAgSU5WT0tFX01BTklGRVNUX01FUkdFUiA9IDMzOworICAgIEpBQ0tfSkFDT0NPX1JFUE9SVCA9IDM0OworICAgIEpBQ09DT19SRVBPUlQgPSAzNTsKKyAgICBMSU5UID0gMzY7CisgICAgTElOVF9DT01QSUxFID0gMzc7CisgICAgTUVSR0VfRklMRSA9IDM4OworICAgIE1FUkdFX01BTklGRVNUUyA9IDM5OworICAgIE1FUkdFX1JFU09VUkNFUyA9IDQwOworICAgIE1FUkdFX1NPVVJDRV9TRVRfRk9MREVSUyA9IDQxOworICAgIE1PQ0tBQkxFX0FORFJPSURfSkFSID0gNDI7CisgICAgTkRLX0NPTVBJTEUgPSA0MzsKKyAgICBOREsgPSA0NDsKKyAgICBQQUNLQUdFX0FQUExJQ0FUSU9OID0gNDU7CisgICAgUEFDS0FHRV9TUExJVF9BQkkgPSA0NjsKKyAgICBQQUNLQUdFX1NQTElUX1JFUyA9IDQ3OworICAgIFBSRV9DT0xEX1NXQVAgPSA0ODsKKyAgICBQUkVQQVJFX0RFUEVOREVOQ0lFUyA9IDQ5OworICAgIFBSRVBBUkVfTElCUkFSWSA9IDUwOworICAgIFBST0NFU1NfQU5EUk9JRF9SRVNPVVJDRVMgPSA1MTsKKyAgICBQUk9DRVNTX01BTklGRVNUID0gNTI7CisgICAgUFJPQ0VTU19URVNUX01BTklGRVNUID0gNTM7CisgICAgUkVOREVSU0NSSVBUX0NPTVBJTEUgPSA1NDsKKyAgICBTSEFERVJfQ09NUElMRSA9IDU1OworICAgIFNJR05JTkdfUkVQT1JUID0gNTY7CisgICAgU0lOR0xFX0ZJTEVfQ09QWSA9IDU3OworICAgIFNPVVJDRV9TRVRTID0gNTg7CisgICAgU1BMSVRfWklQX0FMSUdOID0gNTk7CisgICAgU1RSRUFNX0JBU0VEID0gNjA7CisgICAgU1RSSVBfREVCVUdfU1lNQk9MID0gNjE7CisgICAgU1RSSVBfREVQRU5ERU5DSUVTID0gNjI7CisgICAgVEVTVF9NT0RVTEVfUFJPX0dVQVJEID0gNjM7CisgICAgVEVTVF9TRVJWRVIgPSA2NDsKKyAgICBUUkFOU0ZPUk0gPSA2NTsKKyAgICBVTklOU1RBTEwgPSA2NjsKKyAgICBWQUxJREFURV9TSUdOSU5HID0gNjc7CisgICAgWklQX0FMSUdOID0gNjg7CisgICAgSkFWQV9DT01QSUxFID0gNjk7CisgICAgQlVJTERfSU5GT19XUklURVIgPSA3MDsKKyAgICBCVU5ETEVfQVRPTSA9IDcxOworICAgIENIRUNLX01BTklGRVNUX0lOX0lOU1RBTlRfUlVOX01PREUgPSA3MjsKKyAgICBFWFRFUk5BTF9OQVRJVkVfQ0xFQU4gPSA3MzsKKyAgICBHRU5FUkFURV9BVE9NX01FVEFEQVRBID0gNzQ7CisgICAgR0VORVJBVEVfSU5TVEFOVF9BUFBfTUVUQURBVEEgPSA3NTsKKyAgICBKQVZBX1BSRV9DT01QSUxFID0gNzY7CisgICAgTUVSR0VfREVYX0FUT01fUkVTX0NMQVNTID0gNzc7CisgICAgUEFDS0FHRV9BVE9NID0gNzg7CisgICAgUEFDS0FHRV9JTlNUQU5UX0FQUCA9IDc5OworICAgIFBSRVBBUkVfQVRPTSA9IDgwOworICAgIFBST0NFU1NfSU5TVEFOVF9BUFBfUkVTT1VSQ0VTID0gODE7CisgIH0KKyAgLy8gVGhlIHRhc2sgaW1wbGVtZW50aW5nIGNsYXNzLgorICAvLyBDdXN0b20gdGFza3MgYXJlIHJlY29yZGVkIGFzIFVOS05PV05fVEFTS19UWVBFLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uR3JhZGxlVGFza0V4ZWN1dGlvbi5UeXBlIHR5cGUgPSAxOworICAvLyBXaGV0aGVyIHRoZSB0YXNrIGRpZCB3b3JrIChUYXNrU3RhdGUjZ2V0RGlkV29yaygpKQorICAvLyBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgaW52ZXJzZSBvZiB1cF90b19kYXRlOiBzZWUKKyAgLy8gaHR0cHM6Ly9kb2NzLmdyYWRsZS5vcmcvY3VycmVudC9qYXZhZG9jL29yZy9ncmFkbGUvYXBpL3Rhc2tzL1Rhc2tTdGF0ZS5odG1sI2dldERpZFdvcmsoKQorICBvcHRpb25hbCBib29sIGRpZF93b3JrID0gMjsKKyAgLy8gV2hldGhlciB0aGUgdGFzayB3YXMgc2tpcHBlZCAoVGFza1N0YXRlI2dldFNraXBwZWQoKSkKKyAgb3B0aW9uYWwgYm9vbCBza2lwcGVkID0gMzsKKyAgLy8gV2hldGhlciB0aGUgdGFzayB3YXMgdXAgdG8gZGF0ZSAoVGFza1N0YXRlI2dldFVwVG9EYXRlKCkpCisgIG9wdGlvbmFsIGJvb2wgdXBfdG9fZGF0ZSA9IDQ7CisgIC8vIFdoZXRoZXIgdGhlIHRhc2sgZmFpbGVkCisgIG9wdGlvbmFsIGJvb2wgZmFpbGVkID0gNTsKK30KKworbWVzc2FnZSBHcmFkbGVUcmFuc2Zvcm1FeGVjdXRpb24geworICAvLyBUaGUgdHJhbnNmb3JtIGNsYXNzLgorICBlbnVtIFR5cGUgeworICAgIFVOS05PV05fVFJBTlNGT1JNX1RZUEUgPSAwOworICAgIERFWCA9IDE7CisgICAgRVhUUkFDVF9KQVJTID0gMjsKKyAgICBJTlNUQU5UX1JVTl9ERVggPSAzOworICAgIElOU1RBTlRfUlVOX1NMSUNFUiA9IDQ7CisgICAgSU5TVEFOVF9SVU4gPSA1OworICAgIElOU1RBTlRfUlVOX1ZFUklGRVIgPSA2OworICAgIEpBQ0tfUFJFX0RFWCA9IDc7CisgICAgSkFDSyA9IDg7CisgICAgSkFDT0NPID0gOTsKKyAgICBKQVJfTUVSR0lORyA9IDEwOworICAgIExJQlJBUllfSkFSID0gMTE7CisgICAgTElCUkFSWV9KTklfTElCUyA9IDEyOworICAgIE1FUkdFX0pBVkFfUkVTT1VSQ0VTID0gMTM7CisgICAgTVVMVElfREVYID0gMTQ7CisgICAgTkVXX1NIUklOS0VSID0gMTU7CisgICAgTk9fQ0hBTkdFU19WRVJJRklFUiA9IDE2OworICAgIFBST19HVUFSRCA9IDE3OworICAgIFNIUklOS19SRVNPVVJDRVMgPSAxODsKKyAgICBEQVRBX0JJTkRJTkdfTUVSR0VfQVJUSUZBQ1RTID0gMTk7CisgICAgSU5TVEFOVF9SVU5fVkVSSUZJRVIgPSAyMDsKKyAgICBTVFJJUF9ERUJVR19TWU1CT0wgPSAyMTsKKyAgfQorICAvLyBUaGUgdHJhbnNmb3JtIGltcGxlbWVudGluZyBjbGFzcy4KKyAgLy8gQ3VzdG9tIHRyYW5zZm9ybXMgYXJlIHJlY29yZGVkIGFzIFVOS05PV05fVFJBTlNGT1JNX1RZUEUuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5HcmFkbGVUcmFuc2Zvcm1FeGVjdXRpb24uVHlwZSB0eXBlID0gMTsKKyAgLy8gV2hldGhlciB0aGUgdHJhbnNmb3JtIGNvdWxkIGJlIChpbiB0aGUgY2FzZSBvZiBUQVNLX1RSQU5TRk9STV9QUkVQQVJBVElPTikKKyAgLy8gb3Igd2FzIChpbiB0aGUgY2FzZSBvZiBUQVNLX1RSQU5TRk9STSkgaW5jcmVtZW50YWwuCisgIG9wdGlvbmFsIGJvb2wgaXNfaW5jcmVtZW50YWwgPSAyOworfQorCittZXNzYWdlIEluc3RhbnRSdW5TdGF0dXMgeworICBlbnVtIEJ1aWxkTW9kZSB7CisgICAgVU5LTk9XTl9CVUlMRF9NT0RFID0gMDsKKyAgICBIT1RfV0FSTSA9IDE7CisgICAgQ09MRCA9IDI7CisgICAgRlVMTCA9IDM7CisgIH0KKyAgZW51bSBQYXRjaGluZ1BvbGljeSB7CisgICAgVU5LTk9XTl9QQVRDSElOR19QT0xJQ1kgPSAwOworICAgIC8vIE5vIENvbGQgc3dhcCBpcyBwb3NzaWJsZQorICAgIFBSRV9MT0xMSVBPUCA9IDE7CisgICAgLy8gQ29sZCBzd2FwIGRvbmUgYnkgc2hpcHBpbmcgZGV4IGNsYXNzZXMgdG8gdGhlIEluc3RhbnQgUnVuIHJ1bnRpbWUKKyAgICBNVUxUSV9ERVggPSAyOworICAgIC8vIENvbGQgc3dhcCBkb25lIGJ5IHJlaW5zdGFsbGluZyBBUEsgc3BsaXRzLgorICAgIE1VTFRJX0FQSyA9IDM7CisgIH0KKyAgZW51bSBWZXJpZmllclN0YXR1cyB7CisgICAgVU5LTk9XTl9WRVJJRklFUl9TVEFUVVMgPSAwOworICAgIENPTVBBVElCTEUgPSAxOworICAgIC8vIHRoZSB2ZXJpZmllciBkaWQgbm90IHJ1biBzdWNjZXNzZnVsbHkuCisgICAgTk9UX1JVTiA9IDI7CisgICAgLy8gSW5zdGFudFJ1biBkaXNhYmxlZCBvbiBlbGVtZW50IGxpa2UgYSBtZXRob2QsIGNsYXNzIG9yIHBhY2thZ2UuCisgICAgSU5TVEFOVF9SVU5fRElTQUJMRUQgPSAzOworICAgIC8vIEFueSBpbmFiaWxpdHkgdG8gcnVuIHRoZSB2ZXJpZmllciBvbiBhIGZpbGUgd2lsbCBiZSB0YWdnZWQgYXMgc3VjaAorICAgIElOU1RBTlRfUlVOX0ZBSUxVUkUgPSA0OworICAgIC8vIEEgbmV3IGNsYXNzIHdhcyBhZGRlZC4KKyAgICBDTEFTU19BRERFRCA9IDU7CisgICAgLy8gY2hhbmdlcyBpbiB0aGUgaGllcmFyY2h5CisgICAgUEFSRU5UX0NMQVNTX0NIQU5HRUQgPSA2OworICAgIElNUExFTUVOVEVEX0lOVEVSRkFDRVNfQ0hBTkdFID0gNzsKKyAgICAvLyBjbGFzcyByZWxhdGVkIGNoYW5nZXMuCisgICAgQ0xBU1NfQU5OT1RBVElPTl9DSEFOR0UgPSA4OworICAgIFNUQVRJQ19JTklUSUFMSVpFUl9DSEFOR0UgPSA5OworICAgIC8vIGNoYW5nZXMgaW4gY29uc3RydWN0b3JzLAorICAgIENPTlNUUlVDVE9SX1NJR05BVFVSRV9DSEFOR0UgPSAxMDsKKyAgICAvLyBjaGFuZ2VzIGluIG1ldGhvZAorICAgIE1FVEhPRF9TSUdOQVRVUkVfQ0hBTkdFID0gMTE7CisgICAgTUVUSE9EX0FOTk9UQVRJT05fQ0hBTkdFID0gMTI7CisgICAgTUVUSE9EX0RFTEVURUQgPSAxMzsKKyAgICBNRVRIT0RfQURERUQgPSAxNDsKKyAgICAvLyBjaGFuZ2VzIGluIGZpZWxkcy4KKyAgICBGSUVMRF9BRERFRCA9IDE1OworICAgIEZJRUxEX1JFTU9WRUQgPSAxNjsKKyAgICAvLyBjaGFuZ2Ugb2YgZmllbGQgdHlwZSBvciBraW5kIChzdGF0aWMgfCBpbnN0YW5jZSkKKyAgICBGSUVMRF9UWVBFX0NIQU5HRSA9IDE3OworICAgIFJfQ0xBU1NfQ0hBTkdFID0gMTg7CisgICAgLy8gcmVmbGVjdGlvbiB1c2UKKyAgICBSRUZMRUNUSU9OX1VTRUQgPSAxOTsKKyAgICBKQVZBX1JFU09VUkNFU19DSEFOR0VEID0gMjA7CisgICAgREVQRU5ERU5DWV9DSEFOR0VEID0gMjE7CisgICAgTUFOSUZFU1RfRklMRV9DSEFOR0UgPSAyMjsKKyAgICAvLyB0aGUgYmluYXJ5IG1hbmlmZXN0IGZpbGUgY2hhbmdlZCwgcHJvYmFibHkgZHVlIHRvIHJlZmVyZW5jZXMgdG8gcmVzb3VyY2VzIHdoaWNoIElEIGNoYW5nZWQKKyAgICAvLyBzaW5jZSBsYXN0IGJ1aWxkLgorICAgIEJJTkFSWV9NQU5JRkVTVF9GSUxFX0NIQU5HRSA9IDIzOworICAgIENPTERfU1dBUF9SRVFVRVNURUQgPSAyNDsKKyAgICBGVUxMX0JVSUxEX1JFUVVFU1RFRCA9IDI1OworICAgIElOSVRJQUxfQlVJTEQgPSAyNjsKKyAgICBOT19DSEFOR0VTID0gMjc7CisgICAgQ0hBTkdFX0lOX1NFUklBTElaQUJMRV9DTEFTU19XSVRIT1VUX1ZFUlNJT05fVUlEID0gMjg7CisgIH0KKyAgLy8gVGhlIHR5cGUgb2YgYXJ0aWZhY3RzIGJ1aWx0IGluIHRoaXMgaW52b2NhdGlvbi4KKyAgLy8gZS5nLiBDT0xEIGZvciB3aGVuIHRoZSBjaGFuZ2VzIGNhbm5vdCBiZSBob3Qtc3dhcHBlZCwgZWl0aGVyIGR1ZSB0byB0aGUKKyAgLy8gYXBwIG5vdCBydW5uaW5nIG9uIHRoZSB1c2VycyBkZXZpY2Ugb3IgdGhlIGNoYW5nZXMgY2Fubm90IGJlIGhvdCBzd2FwcGVkLgorICBvcHRpb25hbCAuYW5kcm9pZF9zdHVkaW8uSW5zdGFudFJ1blN0YXR1cy5CdWlsZE1vZGUgYnVpbGRfbW9kZSA9IDE7CisgIC8vIFRoZSB0eXBlIG9mIGRlcGxveSB0aGF0IHRoZSBidWlsZCBjYW4gZ2VuZXJhdGUgYXJ0aWZhY3RzIGZvci4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkluc3RhbnRSdW5TdGF0dXMuUGF0Y2hpbmdQb2xpY3kgcGF0Y2hpbmdfcG9saWN5ID0gMjsKKyAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgdmVyaWZpZXIgcnVuLCB3aGV0aGVyIHRoZSB1c2VycyBjaGFuZ2UgY2FuIGJlIGhvdC1zd2FwcGVkCisgIC8vIG9yIHJlcXVpcmVzIGEgY29sZCBzd2FwIG9yIGZ1bGwgYnVpbGQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdmVyaWZpZXIuCisgIG9wdGlvbmFsIC5hbmRyb2lkX3N0dWRpby5JbnN0YW50UnVuU3RhdHVzLlZlcmlmaWVyU3RhdHVzIHZlcmlmaWVyX3N0YXR1cyA9IDM7CisgIC8vIFRoZSBidWlsdCBhcnRpZmFjdHMgc3RvcmVkIGluIHRoZSBidWlsZCBpbmZvLgorICAvLyBBcnRpZmFjdHMgdGhhdCB3ZXJlIGJ1aWx0LCBidXQgc3VwZXJzZWVkZWQgKGUuZy4gYSBtYWluIEFQSyBjb250YWlucworICAvLyByZXNvdXJjZXMsIHNvIHRoZSByZXNvdXJjZXMgZG8gbm90IG5lZWQgdG8gYmUgcmVwb3J0ZWQgc2VwYXJhdGVseSkgYXJlCisgIC8vIG5vdCBpbmNsdWRlZC4KKyAgcmVwZWF0ZWQgLmFuZHJvaWRfc3R1ZGlvLkluc3RhbnRSdW5BcnRpZmFjdCBhcnRpZmFjdCA9IDQ7Cit9CisKK21lc3NhZ2UgSW5zdGFudFJ1bkFydGlmYWN0IHsKKyAgZW51bSBUeXBlIHsKKyAgICAvLyBNYWluIEFQSyBmaWxlIGZvciAxOSwgYW5kIDIxIHBsYXRmb3JtcyB3aGVuIHVzaW5nCisgICAgLy8gUGF0Y2hpbmdQb2xpY3kuTVVMVElfREVYLgorICAgIE1BSU4gPSAxOworICAgIC8vIE1haW4gQVBLIGZpbGUgd2hlbiBhcHBsaWNhdGlvbiBpcyB1c2luZyBQYXRjaGluZ1BvbGljeS5NVUxUSV9ERVguCisgICAgU1BMSVRfTUFJTiA9IDI7CisgICAgLy8gUmVsb2FkIGRleCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGF0Y2ggYXBwbGljYXRpb24gbGl2ZS4KKyAgICBSRUxPQURfREVYID0gMzsKKyAgICAvLyBSZXN0YXJ0LmRleCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIERhbHZpayB0byByZXN0YXJ0IGFwcGxpY2F0aW9ucworICAgIC8vIHdpdGggbWluaW11bSBzZXQgb2YgY2hhbmdlcyBkZWxpdmVyZWQuCisgICAgUkVTVEFSVF9ERVggPSA0OworICAgIC8vIFNoYXJkIGRleCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBvcmlnaW5hbGx5IGluc3RhbGxlZAorICAgIC8vIG11bHRpLWRleCBzaGFyZC4KKyAgICBERVggPSA1OworICAgIC8vIFB1cmUgc3BsaXQgKGNvZGUgb25seSkgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIGluZGl2aWR1YWxseSBvbiBNKyBkZXZpY2VzLgorICAgIFNQTElUID0gNjsKKyAgICAvLyBSZXNvdXJjZXM6IHJlcy5hcF8gZmlsZQorICAgIFJFU09VUkNFUyA9IDc7CisgIH0KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkluc3RhbnRSdW5BcnRpZmFjdC5UeXBlIHR5cGUgPSAxOworfQorCisvLyBEZXRhaWxzIGFib3V0IHRoZSBMTERCIEZyb250ZW5kIHByb2Nlc3MKK21lc3NhZ2UgTExEQkZyb250ZW5kRGV0YWlscyB7CisgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCB3aGVuIHRoZSBMTERCIEZyb250ZW5kIHByb2Nlc3MgZXhpdGVkLgorICBvcHRpb25hbCBpbnQzMiBleGl0X2NvZGUgPSAxOworfQorCisvLyBFcnJvciBkZXRhaWxzIGZyb20gdGhlIEZpcmViYXNlIEFzc2lzdGFudC4KK21lc3NhZ2UgRmlyZWJhc2VFcnJvckRldGFpbHMgeworICAvLyBUaGUgZXJyb3IgbWVzc2FnZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgdXBvbiBGaXJlYmFzZSBlcnJvcnMuCisgIG9wdGlvbmFsIHN0cmluZyBlcnJvcl9tZXNzYWdlID0gMTsKK30KKworLy8gRGV0YWlscyBvbiB0aGUgR1BVIERlYnVnZ2VyIHRyYWNpbmcgcnVuCittZXNzYWdlIEdmeFRyYWNpbmdEZXRhaWxzIHsKKyAgLy8gdG90YWwgdGltZSB0aGUgdHJhY2UgdG9vaworICBvcHRpb25hbCBpbnQ2NCB0b3RhbF90aW1lID0gMTsKKyAgLy8gY2xhc3MgbmFtZSBvZiB0aGUgVUkgY29tbWFuZCBzZWxlY3RlZCB0byBhZmZlY3QgdGhlIHRyYWNpbmcuCisgIG9wdGlvbmFsIHN0cmluZyBjb21tYW5kID0gMjsKKyAgLy8gRXJyb3IgbWVzc2FnZSB3aGVuIHRyYWNpbmcgZmFpbHMuCisgIG9wdGlvbmFsIHN0cmluZyBlcnJvcl9tZXNzYWdlID0gMzsKKyAgLy8gQSBwYXRoIGRlc2NyaWJpbmcgdGhlIGtpbmQgb2YgZGV0YWlscyBmcm9tIHRoZSB0cmFjZS4gVGhpcyBpcyBhIG1peAorICAvLyBvZiBjbGFzcyBuYW1lcyAob2Ygb3VyIGNvZGUpIGFuZCByYW5kb20gaWRzIGdlbmVyYXRlZCBmb3IgdGhlIHRyYWNlLgorICAvLyBlLmcuICdDYXB0dXJlKDdjNmU3MmVlYmUyZTZkNzY3NTFiMDMyODk3MWU3ZmIyOWNlZWQ4MmIpLkF0b21zWzYzMDddLicgKworICAvLyAgICAgICdSZXNvdXJjZTxlMWIyYTAyOGNlNjJhOTdiMjM1MTcyOTYzZGRlZTM1ZjM4NmM2OTQwPi4nICsKKyAgLy8gICAgICAnVGh1bWJuYWlsPFJHQkEsMTAweDEwMD4uQXM8UkdCQT4nCisgIG9wdGlvbmFsIHN0cmluZyB0cmFjZV9wYXRoID0gNDsKKyAgLy8gdGhlIGltYWdlIGZvcm1hdCBvZiB0aGUgZ3B1IGltYWdlIGJlaW5nIHRyYWNlZC4gZS5nLiAnaW1hZ2UvcG5nJworICBvcHRpb25hbCBzdHJpbmcgaW1hZ2VfZm9ybWF0ID0gNTsKKyAgLy8gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBiZWluZyB0cmFjZWQuCisgIG9wdGlvbmFsIGludDY0IGltYWdlX3dpZHRoID0gNjsKKyAgLy8gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgYmVpbmcgdHJhY2VkLgorICBvcHRpb25hbCBpbnQ2NCBpbWFnZV9oZWlnaHQgPSA3OworfQorCisvLyBEZXRhaWxzIG9mIGFuIGludm9jYXRpb24gb2YgdGhlIFRlc3RSZWNvcmRlciB0byBnZW5lcmF0ZSB0ZXN0cy4KK21lc3NhZ2UgVGVzdFJlY29yZGVyRGV0YWlscyB7CisgIC8vIFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSB0ZXN0IGdlbmVyYXRlZCBieSB0aGUgdGVzdCByZWNvcmRlci4KKyAgb3B0aW9uYWwgaW50NjQgZXZlbnRfY291bnQgPSAxOworICAvLyBUaGUgbnVtYmVyIG9mIGFzc2VydGlvbnMgaW4gdGhlIHRlc3QgZ2VuZXJhdGVkIGJ5IHRoZSB0ZXN0IHJlY29yZGVyLgorICBvcHRpb25hbCBpbnQ2NCBhc3NlcnRpb25fY291bnQgPSAyOworfQorCisvLyBSZXBvcnRzIGFnZ3JlZ2F0ZWQgaW5mb3JtYXRpb24gYWJvdXQgaG93IHVzZXJzIGludm9rZSBhdmFpbGFibGUgVUkgYWN0aW9ucy4KK21lc3NhZ2UgVUlBY3Rpb25TdGF0cyB7CisgIC8vIFRoZSB3YXkgYW4gVUkgYWN0aW9uIHdhcyBpbnZvY2F0ZWQgYnkgdGhlIHVzZXIuCisgIGVudW0gSW52b2NhdGlvbktpbmQgeworICAgIFVOS05PV05fSU5WT0NBVElPTl9LSU5EID0gMDsKKyAgICBUT09MQkFSID0gMTsKKyAgICBNRU5VID0gMjsKKyAgICBLRVlCT0FSRF9TSE9SVENVVCA9IDM7CisgICAgTUFDUk8gPSA0OworICAgIE1PVVNFID0gNTsKKyAgfQorICAvLyBqYXZhIGNsYXNzIG5hbWUgKG91ciBjb2RlLCBub3QgY3VzdG9tZXIpIG9mIHRoZSBVSSBBY3Rpb24gcmVwb3J0ZWQgb24KKyAgLy8gZS5nLiAnY29tLmFuZHJvaWQuYnVpbGQuaW5zdGFudF9ydW4uSG90U3dhcEJ1aWxkQWN0aW9uJworICBvcHRpb25hbCBzdHJpbmcgYWN0aW9uX2NsYXNzX25hbWUgPSAxOworICAvLyBIb3cgb2Z0ZW4gc2luY2UgdGhlIGxhc3QgcmVwb3J0IHRoaXMgYWN0aW9uIHdhcyBpbnZva2VkLgorICBvcHRpb25hbCBpbnQ2NCBpbnZvY2F0aW9ucyA9IDI7CisgIC8vIFRoZSB3YXkgdGhpcyBhY3Rpb24gd2FzIGludm9jYXRlZCBieSB0aGUgdXNlci4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLlVJQWN0aW9uU3RhdHMuSW52b2NhdGlvbktpbmQgaW52b2NhdGlvbl9raW5kID0gMzsKK30KKworLy8gRGV0YWlscyBhYm91dCB0aGUgbWFjaGluZSB0aGlzIHByb2Nlc3MgaXMgcnVubmluZyBvbi4KK21lc3NhZ2UgTWFjaGluZURldGFpbHMgeworICAvLyBBbW91bnQgb2YgdG90YWwgbWVtb3J5IGF2YWlsYWJsZSBpbiBtZWdhYnl0ZXMuCisgIG9wdGlvbmFsIGludDY0IHRvdGFsX3JhbSA9IDE7CisgIC8vIEFtb3VudCBvZiB0b3RhbCBkaXNrIGF2YWlsYWJsZSBpbiBtZWdhYnl0ZXMuCisgIG9wdGlvbmFsIGludDY0IHRvdGFsX2Rpc2sgPSAyOworICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzcGxheSBzY3JlZW5zIG9uIHRoZSBtYWNoaW5lIChyZXNvbHV0aW9uIGV0Yy4uKQorICByZXBlYXRlZCAuYW5kcm9pZF9zdHVkaW8uRGlzcGxheURldGFpbHMgZGlzcGxheSA9IDM7CisgIC8vIE51bWJlciBvZiBwcm9jZXNzb3JzIG9uIHRoZSBtYWNoaW5lLgorICBvcHRpb25hbCBpbnQzMiBhdmFpbGFibGVfcHJvY2Vzc29ycyA9IDQ7Cit9CisKKy8vIERldGFpbHMgb2YgYSBkaXNwbGF5IHNjcmVlbi4KK21lc3NhZ2UgRGlzcGxheURldGFpbHMgeworICAvLyBXaWR0aCBvZiB0aGUgZGlzcGxheSBzY3JlZW4gaW4gcGl4ZWxzLgorICBvcHRpb25hbCBpbnQ2NCB3aWR0aCA9IDE7CisgIC8vIEhlaWdodCBvZiB0aGUgZGlzcGxheSBzY3JlZW4gaW4gcGl4ZWxzLgorICBvcHRpb25hbCBpbnQ2NCBoZWlnaHQgPSAyOworICAvLyBEZW5zaXRpeSBvZiB0aGUgcGl4ZWxzIG9uIHRoZSBzY3JlZW4gaG9yaXppb250YWxseS4KKyAgb3B0aW9uYWwgaW50MzIgZG90c19wZXJfaW5jaF9ob3Jpem9udGFsID0gMzsKKyAgLy8gRGVuc2l0aXkgb2YgdGhlIHBpeGVscyBvbiB0aGUgc2NyZWVuIHZlcnRpY2FsbHkuCisgIG9wdGlvbmFsIGludDMyIGRvdHNfcGVyX2luY2hfdmVydGljYWwgPSA0OworfQorCisvLyBTdGF0cyBvbiB0aGUgY3VycmVudCBydW5uaW5nIGphdmEgcHJvY2Vzcy4KK21lc3NhZ2UgSmF2YVByb2Nlc3NTdGF0cyB7CisgIC8vIE51bWJlciBvZiBieXRlcyBvZiBtZW1vcnkgaW4gdXNlIGFzIGhlYXAgbWVtb3J5LgorICBvcHRpb25hbCBpbnQ2NCBoZWFwX21lbW9yeV91c2FnZSA9IDE7CisgIC8vIE51bWJlciBvZiBieXRlcyBvZiBtZW1vcnkgaW4gdXNlIGFzIG5vbiBoZWFwIG1lbW9yeS4KKyAgb3B0aW9uYWwgaW50NjQgbm9uX2hlYXBfbWVtb3J5X3VzYWdlID0gMjsKKyAgLy8gQ3VycmVudCBhbW91bnQgb2YgamF2YSBjbGFzc2VzIGxvYWRlZC4KKyAgb3B0aW9uYWwgaW50MzIgbG9hZGVkX2NsYXNzX2NvdW50ID0gMzsKKyAgLy8gQ3VycmVudCBhbW91bnQgb2YgdGhyZWFkcy4KKyAgb3B0aW9uYWwgaW50MzIgdGhyZWFkX2NvdW50ID0gNDsKKyAgLy8gU3RhdGlzdGljcyBhYm91dCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3JzIHVzZWQgaW4gdGhpcyBwcm9jZXNzLgorICByZXBlYXRlZCAuYW5kcm9pZF9zdHVkaW8uR2FyYmFnZUNvbGxlY3Rpb25TdGF0cyBnYXJiYWdlX2NvbGxlY3Rpb25fc3RhdHMgPSA1OworfQorCisvLyBTdGF0aXN0aWNzIGFib3V0IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4KK21lc3NhZ2UgR2FyYmFnZUNvbGxlY3Rpb25TdGF0cyB7CisgIC8vIE5hbWUgb2YgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIChlLmcuICdDb25jdXJyZW50TWFya1N3ZWVwJykKKyAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICAvLyBOdW1iZXIgb2YgZ2FyYmFnZSBjb2xsZWN0b3IgaW52b2NhdGlvbnMgc2luY2UgbGFzdCByZXBvcnQuCisgIG9wdGlvbmFsIGludDY0IGdjX2NvbGxlY3Rpb25zID0gMjsKKyAgLy8gVGltZSBzcGVudCBnYXJiYWdlIGNvbGxlY3Rpbmcgc2luY2UgbGFzdCByZXBvcnQgaW4gbWlsbGlzZWNvbmRzLgorICBvcHRpb25hbCBpbnQ2NCBnY190aW1lID0gMzsKK30KKworLy8gRGV0YWlscyBhYm91dCB0aGUgSlZNIHVzZWQgaW4gdGhpcyBwcm9jZXNzLgorbWVzc2FnZSBKdm1EZXRhaWxzIHsKKyAgLy8gVmFyaW91cyBnYXJiYWdlIGNvbGxlY3RvcnMgdGhhdCBjb3VsZCBiZSBjaG9zZW4gdGhyb3VnaCBWTSBPcHRpb25zLgorICBlbnVtIEdhcmJhZ2VDb2xsZWN0b3IgeworICAgIFVOU1BFQ0lGSUVEX0dDID0gMDsKKyAgICBDT05DVVJSRU5UX01BUktfU1dFRVBfR0MgPSAxOworICAgIEdBUkJBR0VfRklSU1RfR0MgPSAyOworICAgIFBBUkFMTEVMX0dDID0gMzsKKyAgICBQQVJBTExFTF9PTERfR0MgPSA0OworICAgIFNFUklBTF9HQyA9IDU7CisgIH0KKyAgLy8gTmFtZSBvZiB0aGUgSlZNIChlLmcuICJPcGVuSkRLIDY0LUJpdCBTZXJ2ZXIgYnkgSmV0QnJhaW5zIHMuci5vIikuCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgLy8gVmVyc2lvbiBvZiB0aGUgSlZNIChlLmcuICIxLjguMF83Ni1yZWxlYXNlLWIxOTggYW1kIikKKyAgb3B0aW9uYWwgc3RyaW5nIHZlcnNpb24gPSAyOworICAvLyBWZW5kb3Igb2YgdGhlIEpWTSAoZS5nLiAiSmV0QnJhaW5zIHMuci5vLiIpCisgIG9wdGlvbmFsIHN0cmluZyB2ZW5kb3IgPSAzOworICAvLyBWTSBPcHRpb24gc3BlY2lmaWVkIHRvIHNldCBtaW5pbXVtIGhlYXBfc2l6ZSBpbiBieXRlcyAoIi1YbXMiIGZsYWcpLgorICBvcHRpb25hbCBpbnQ2NCBtaW5pbXVtX2hlYXBfc2l6ZSA9IDQ7CisgIC8vIFZNIE9wdGlvbiBzcGVjaWZpZWQgdG8gc2V0IG1heGltdW0gaGVhcF9zaXplIGluIGJ5dGVzICgiLVhteCIgZmxhZykuCisgIG9wdGlvbmFsIGludDY0IG1heGltdW1faGVhcF9zaXplID0gNTsKKyAgLy8gVk0gT3B0aW9uIHNwZWNpZmllZCB0byBzZXQgbWF4aW11bSBwZXJtYW5lbnQgc3BhY2Ugc2l6ZSBpbiBieXRlcy4KKyAgLy8gKCItWFg6TWF4UGVybVNpemUiIGZsYWcpCisgIG9wdGlvbmFsIGludDY0IG1heGltdW1fcGVybWFuZW50X3NwYWNlX3NpemUgPSA2OworICAvLyBWTSBPcHRpb24gc3BlY2lmaWVkIHRvIHNldCBtYXhpbXVtIHBlcm1hbmVudCBzcGFjZSBzaXplIGluIGJ5dGVzLgorICAvLyAoIi1YWDpSZXNlcnZlZENvZGVDYWNoZVNpemUiIGZsYWcpCisgIG9wdGlvbmFsIGludDY0IG1heGltdW1fY29kZV9jYWNoZV9zaXplID0gNzsKKyAgLy8gVk0gT3B0aW9uIHNwZWNpZmllZCB0byBzZXQgdGltZSBzb2Z0IHJlZmVyZW5jZWQgb2JqZWN0cyByZW1haW4gYWxpdmUgaW4gbXMuCisgIC8vICgiLVhYOlNvZnRSZWZMUlVQb2xpY3lNU1Blck1CIiBmbGFnKQorICBvcHRpb25hbCBpbnQ2NCBzb2Z0X3JlZmVyZW5jZV9scnVfcG9saWN5ID0gODsKKyAgLy8gVHlwZSBvZiBHYXJiYWdlIENvbGxlY3RvciB0byB1c2UgKHZhcmlvdXMgVk0gT3B0aW9uIGZsYWdzKS4KKyAgb3B0aW9uYWwgLmFuZHJvaWRfc3R1ZGlvLkp2bURldGFpbHMuR2FyYmFnZUNvbGxlY3RvciBnYXJiYWdlX2NvbGxlY3RvciA9IDk7Cit9CisKKy8vIFN0YXRzIG9uIFN0dWRpbydzIHBlcmZvcm1hbmNlCittZXNzYWdlIFN0dWRpb1BlcmZvcm1hbmNlU3RhdHMgeworICAvLyBUaW1lIGZvciB3aGljaCB0aGUgVUkgd2FzIGJsb2NrZWQgaW4gbWlsbGlzZWNvbmRzCisgIG9wdGlvbmFsIGludDMyIHVpX2ZyZWV6ZV90aW1lX21zID0gMTsKK30KKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Bc3luY01ldHJpY3NSZXBvcnRlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Bc3luY01ldHJpY3NSZXBvcnRlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjYmNjOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL0FzeW5jTWV0cmljc1JlcG9ydGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvQXN5bmNNZXRyaWNzUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL2NsaWVudGFuYWx5dGljcy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvdGVzdHMvTW9ja01ldHJpY3NXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWV0cmljczsKKworc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtWZXJzaW9uID0gInZlcnNpb24iOworc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtGdWxsVmVyc2lvbiA9ICJmdWxsVmVyc2lvbiI7CitzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1FlbXVWZXJzaW9uID0gInFlbXVWZXJzaW9uIjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQXN5bmNNZXRyaWNzUmVwb3J0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RkOjpzaGFyZWRfcHRyPE1vY2tNZXRyaWNzV3JpdGVyPiBtV3JpdGVyeworICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxNb2NrTWV0cmljc1dyaXRlcj4oKX07CisgICAgT3B0aW9uYWw8QXN5bmNNZXRyaWNzUmVwb3J0ZXI+IG1SZXBvcnRlcjsKKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIGNyZWF0ZVJlcG9ydGVyKCk7CisgICAgICAgIEFTU0VSVF9UUlVFKChib29sKW1SZXBvcnRlcik7CisgICAgfQorCisgICAgdm9pZCBjcmVhdGVSZXBvcnRlcigpIHsKKyAgICAgICAgbVJlcG9ydGVyLmVtcGxhY2UobVdyaXRlciwga1ZlcnNpb24sIGtGdWxsVmVyc2lvbiwga1FlbXVWZXJzaW9uKTsKKyAgICB9CisKKyAgICB2b2lkIGZsdXNoRXZlbnRzKCkgeworICAgICAgICBtUmVwb3J0ZXIuY2xlYXIoKTsKKyAgICAgICAgY3JlYXRlUmVwb3J0ZXIoKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKEFzeW5jTWV0cmljc1JlcG9ydGVyVGVzdCwgaXNFbmFibGVkKSB7CisgICAgRVhQRUNUX1RSVUUobVJlcG9ydGVyLT5pc1JlcG9ydGluZ0VuYWJsZWQoKSk7Cit9CisKK1RFU1RfRihBc3luY01ldHJpY3NSZXBvcnRlclRlc3QsIHJlcG9ydENvbmRpdGlvbmFsKSB7CisgICAgY29uc3QgYXV0byB0aHJlYWRJZCA9IGFuZHJvaWRfZ2V0X3RocmVhZF9pZCgpOworICAgIG1Xcml0ZXItPm1PbldyaXRlID0gW3RocmVhZElkXSgKKyAgICAgICAgICAgIGNvbnN0IHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgRVhQRUNUX05FKHRocmVhZElkLCBhbmRyb2lkX2dldF90aHJlYWRfaWQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50Lmhhc19zb3VyY2VfZXh0ZW5zaW9uKCkpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgZmllbGRzIEFzeW5jTWV0cmljc1JlcG9ydGVyIGlzIHN1cHBvc2VkIHRvIGZpbGwgaW4uCisgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgc3R1ZGlvRXZlbnQ7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0dWRpb0V2ZW50LlBhcnNlRnJvbVN0cmluZyhldmVudC5zb3VyY2VfZXh0ZW5zaW9uKCkpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3R1ZGlvRXZlbnQuaGFzX3Byb2R1Y3RfZGV0YWlscygpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtWZXJzaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICBzdHVkaW9FdmVudC5wcm9kdWN0X2RldGFpbHMoKS52ZXJzaW9uKCkuY19zdHIoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRnVsbFZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0dWRpb0V2ZW50LnByb2R1Y3RfZGV0YWlscygpLmJ1aWxkKCkuY19zdHIoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoc3R1ZGlvRXZlbnQuaGFzX2VtdWxhdG9yX2RldGFpbHMoKSk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrUWVtdVZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0dWRpb0V2ZW50LmVtdWxhdG9yX2RldGFpbHMoKS5jb3JlX3ZlcnNpb24oKS5jX3N0cigpKTsKKyAgICB9OworCisgICAgaW50IHJlcG9ydENhbGxiYWNrQ2FsbHMgPSAwOworICAgIG1SZXBvcnRlci0+cmVwb3J0Q29uZGl0aW9uYWwoW3RocmVhZElkLCAmcmVwb3J0Q2FsbGJhY2tDYWxsc10oCisgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICBFWFBFQ1RfVFJVRShldmVudCAhPSBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX05FKHRocmVhZElkLCBhbmRyb2lkX2dldF90aHJlYWRfaWQoKSk7CisgICAgICAgICsrcmVwb3J0Q2FsbGJhY2tDYWxsczsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworCisgICAgZmx1c2hFdmVudHMoKTsKKyAgICBFWFBFQ1RfRVEoMSwgcmVwb3J0Q2FsbGJhY2tDYWxscyk7CisgICAgRVhQRUNUX0VRKDAsIG1Xcml0ZXItPm1Xcml0ZUNhbGxzQ291bnQpOworCisgICAgbVJlcG9ydGVyLT5yZXBvcnRDb25kaXRpb25hbChbdGhyZWFkSWQsICZyZXBvcnRDYWxsYmFja0NhbGxzXSgKKyAgICAgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50ICE9IG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfTkUodGhyZWFkSWQsIGFuZHJvaWRfZ2V0X3RocmVhZF9pZCgpKTsKKyAgICAgICAgKytyZXBvcnRDYWxsYmFja0NhbGxzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KTsKKworICAgIGZsdXNoRXZlbnRzKCk7CisgICAgRVhQRUNUX0VRKDIsIHJlcG9ydENhbGxiYWNrQ2FsbHMpOworICAgIEVYUEVDVF9FUSgxLCBtV3JpdGVyLT5tV3JpdGVDYWxsc0NvdW50KTsKKworICAgIC8vIE1ha2Ugc3VyZSBub3RoaW5nIGJyZWFrcyBvbiBhIG51bGwgY2FsbGJhY2suCisgICAgbVJlcG9ydGVyLT5yZXBvcnRDb25kaXRpb25hbCh7fSk7CisgICAgZmx1c2hFdmVudHMoKTsKKyAgICBFWFBFQ1RfRVEoMSwgbVdyaXRlci0+bVdyaXRlQ2FsbHNDb3VudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9GaWxlTWV0cmljc1dyaXRlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9GaWxlTWV0cmljc1dyaXRlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0YjA5MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL0ZpbGVNZXRyaWNzV3JpdGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvRmlsZU1ldHJpY3NXcml0ZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdExvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGVtcERpci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9VdWlkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL2NsaWVudGFuYWx5dGljcy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPG51bWVyaWM+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1ldHJpY3M7CisKK3N0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrU3Bvb2xEaXIgPSAiLmFuZHJvaWQvbWV0cmljcy9zcG9vbCI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEZpbGVNZXRyaWNzV3JpdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFRlc3RTeXN0ZW0gbVN5c3RlbXsiLyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWUifTsKKyAgICBUZXN0VGVtcERpciogbVJvb3QgPSBtU3lzdGVtLmdldFRlbXBSb290KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRlc3RMb29wZXI+IG1Mb29wZXJ7bmV3IFRlc3RMb29wZXIoKX07CisKKyAgICBGaWxlTWV0cmljc1dyaXRlcjo6UHRyIG1Xcml0ZXI7CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBBU1NFUlRfVFJVRShtUm9vdCAhPSBudWxscHRyKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxvb3BlciAhPSBudWxscHRyKTsKKyAgICAgICAgbVN5c3RlbS5lbnZTZXQoIkFORFJPSURfU0RLX0hPTUUiLCBtUm9vdC0+cGF0aFN0cmluZygpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzcG9vbERpcigpIHsgcmV0dXJuIG1Sb290LT5tYWtlU3ViUGF0aChrU3Bvb2xEaXIuY19zdHIoKSk7IH0KKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2Vzc2lvbklkKCkgeyByZXR1cm4gVXVpZDo6bnVsbFV1aWRTdHI7IH0KKworICAgIHZvaWQgbWFrZVNwb29sRGlyKCkgeyBwYXRoX21rZGlyX2lmX25lZWRlZChzcG9vbERpcigpLmNfc3RyKCksIDA3MDApOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKEZpbGVNZXRyaWNzV3JpdGVyVGVzdCwgY3JlYXRlRGVzdHJveSkgeworICAgIEVYUEVDVF9GQUxTRShtU3lzdGVtLnBhdGhJc0RpcihzcG9vbERpcigpKSk7CisgICAgbVdyaXRlciA9IEZpbGVNZXRyaWNzV3JpdGVyOjpjcmVhdGUoc3Bvb2xEaXIoKSwgc2Vzc2lvbklkKCksIDAsIG51bGxwdHIsIDApOworICAgIEVYUEVDVF9UUlVFKG1Xcml0ZXIgIT0gbnVsbHB0cik7CisgICAgRVhQRUNUX1RSVUUobVN5c3RlbS5wYXRoSXNEaXIoc3Bvb2xEaXIoKSkpOworICAgIGF1dG8gZmlsZXMgPSBtU3lzdGVtLnNjYW5EaXJFbnRyaWVzKHNwb29sRGlyKCkpOworICAgIEFTU0VSVF9FUSgyLCAoaW50KWZpbGVzLnNpemUoKSk7CisKKyAgICAvLyBvbmUgb2YgdGhlIGZpbGVzIGlzIHRoZSBvcGVuIG1ldHJpY3MgZmlsZSwgYW5vdGhlciBvbmUgaXMgdGhlIGxvY2suCisgICAgRVhQRUNUX1RSVUUoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMF0pID09ICIubG9jayIgfHwKKyAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmV4dGVuc2lvbihmaWxlc1sxXSkgPT0gIi5sb2NrIik7CisgICAgRVhQRUNUX1RSVUUoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMF0pID09ICIub3BlbiIgfHwKKyAgICAgICAgICAgICAgICBQYXRoVXRpbHM6OmV4dGVuc2lvbihmaWxlc1sxXSkgPT0gIi5vcGVuIik7CisKKyAgICBtV3JpdGVyLnJlc2V0KCk7CisKKyAgICAvLyBvbiBkZXN0cnVjdGlvbiBpdCBmaW5hbGl6ZXMgYW5kIHVubG9ja3MgdGhlIG1ldHJpY3MgZmlsZS4KKyAgICBmaWxlcyA9IG1TeXN0ZW0uc2NhbkRpckVudHJpZXMoc3Bvb2xEaXIoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGZpbGVzLmVtcHR5KCkpOworICAgIEFTU0VSVF9FUSgxLCAoaW50KWZpbGVzLnNpemUoKSk7CisgICAgRVhQRUNUX1RSVUUoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMF0pID09ICIudHJ4Iik7Cit9CisKK1RFU1RfRihGaWxlTWV0cmljc1dyaXRlclRlc3QsIGNyZWF0ZURlc3Ryb3lXaXRoVGltZXIpIHsKKyAgICBFWFBFQ1RfRkFMU0UobVN5c3RlbS5wYXRoSXNEaXIoc3Bvb2xEaXIoKSkpOworICAgIG1Xcml0ZXIgPSBGaWxlTWV0cmljc1dyaXRlcjo6Y3JlYXRlKHNwb29sRGlyKCksIHNlc3Npb25JZCgpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wZXIuZ2V0KCksIDEwKTsKKyAgICBFWFBFQ1RfVFJVRShtV3JpdGVyICE9IG51bGxwdHIpOworICAgIEVYUEVDVF9UUlVFKG1TeXN0ZW0ucGF0aElzRGlyKHNwb29sRGlyKCkpKTsKKyAgICBhdXRvIGZpbGVzID0gbVN5c3RlbS5zY2FuRGlyRW50cmllcyhzcG9vbERpcigpKTsKKyAgICBBU1NFUlRfRVEoMiwgKGludClmaWxlcy5zaXplKCkpOworCisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgbm8gdGltZXIsIGFzIGl0IGlzIG9ubHkgY3JlYXRlZCBvbiB0aGUgZmlyc3QgbWVzc2FnZQorICAgIC8vIHdyaXRlLgorICAgIEVYUEVDVF9FUSgwLCBtTG9vcGVyLT50aW1lcnMoKS5zaXplKCkpOworCisgICAgLy8gb25lIG9mIHRoZSBmaWxlcyBpcyB0aGUgb3BlbiBtZXRyaWNzIGZpbGUsIGFub3RoZXIgb25lIGlzIHRoZSBsb2NrLgorICAgIEVYUEVDVF9UUlVFKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGVzWzBdKSA9PSAiLmxvY2siIHx8CisgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMV0pID09ICIubG9jayIpOworICAgIEVYUEVDVF9UUlVFKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGVzWzBdKSA9PSAiLm9wZW4iIHx8CisgICAgICAgICAgICAgICAgUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMV0pID09ICIub3BlbiIpOworCisgICAgbVdyaXRlci5yZXNldCgpOworCisgICAgLy8gb24gZGVzdHJ1Y3Rpb24gaXQgZmluYWxpemVzIGFuZCB1bmxvY2tzIHRoZSBtZXRyaWNzIGZpbGUuCisgICAgZmlsZXMgPSBtU3lzdGVtLnNjYW5EaXJFbnRyaWVzKHNwb29sRGlyKCkpOworICAgIEFTU0VSVF9GQUxTRShmaWxlcy5lbXB0eSgpKTsKKyAgICBBU1NFUlRfRVEoMSwgKGludClmaWxlcy5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGVzWzBdKSA9PSAiLnRyeCIpOworCisgICAgLy8gd2Ugc2hvdWxkIHN0aWxsIGhhdmUgbm8gdGltZXJzCisgICAgRVhQRUNUX0VRKDAsIG1Mb29wZXItPnRpbWVycygpLnNpemUoKSk7Cit9CisKK1RFU1RfRihGaWxlTWV0cmljc1dyaXRlclRlc3QsIGZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzTm9EaXIpIHsKKyAgICAvLyBubyBzcG9vbCBkaXJlY3RvcnkgLSBubyBzZXNzaW9ucworICAgIGF1dG8gc2Vzc2lvbnMgPQorICAgICAgICAgICAgRmlsZU1ldHJpY3NXcml0ZXI6OmZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzKHNwb29sRGlyKCkpOworICAgIEVYUEVDVF9UUlVFKHNlc3Npb25zLmVtcHR5KCkpOworfQorCitURVNUX0YoRmlsZU1ldHJpY3NXcml0ZXJUZXN0LCBmaW5hbGl6ZUFiYW5kb25lZFNlc3Npb25GaWxlc0VtcHR5RGlyKSB7CisgICAgbWFrZVNwb29sRGlyKCk7CisgICAgLy8gZW1wdHkgc3Bvb2wgZGlyZWN0b3J5IC0gbm8gc2Vzc2lvbnMKKyAgICBhdXRvIHNlc3Npb25zID0KKyAgICAgICAgICAgIEZpbGVNZXRyaWNzV3JpdGVyOjpmaW5hbGl6ZUFiYW5kb25lZFNlc3Npb25GaWxlcyhzcG9vbERpcigpKTsKKyAgICBFWFBFQ1RfVFJVRShzZXNzaW9ucy5lbXB0eSgpKTsKK30KKworVEVTVF9GKEZpbGVNZXRyaWNzV3JpdGVyVGVzdCwgZmluYWxpemVBYmFuZG9uZWRTZXNzaW9uRmlsZXNNYW55RmlsZXMpIHsKKyAgICAvLyBjcmVhdGUgc2V2ZXJhbCBzZXNzaW9uLWxpa2UgZmlsZXMgbm93IGluIHRoZSBzcG9vbCBkaXJlY3RvcnkKKyAgICBtYWtlU3Bvb2xEaXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0U2Vzc2lvbnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgICAgIHRlc3RTZXNzaW9ucy5wdXNoX2JhY2soVXVpZDo6Z2VuZXJhdGVGYXN0KCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKG1Sb290LT5tYWtlU3ViRmlsZShQYXRoVXRpbHM6OmpvaW4oCisgICAgICAgICAgICAgICAga1Nwb29sRGlyLCBTdHJpbmdGb3JtYXQoImVtdWxhdG9yLW1ldHJpY3MtJXMtMS0xLm9wZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTZXNzaW9ucy5iYWNrKCkpKSkpOworICAgICAgICBBU1NFUlRfVFJVRShtUm9vdC0+bWFrZVN1YkZpbGUoUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAgICAgIGtTcG9vbERpciwgU3RyaW5nRm9ybWF0KCJlbXVsYXRvci1tZXRyaWNzLSVzLTItMS5vcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0U2Vzc2lvbnMuYmFjaygpKSkpKTsKKyAgICB9CisKKyAgICAvLyBub3cgZmluYWxpemUgdGhlbQorICAgIGF1dG8gc2Vzc2lvbnMgPQorICAgICAgICAgICAgRmlsZU1ldHJpY3NXcml0ZXI6OmZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzKHNwb29sRGlyKCkpOworCisgICAgLy8gYWxsIHRlc3Qgc2Vzc2lvbnMgc2hvdWxkIGJlIHByZXNlbnQgaW4gfHNlc3Npb25zfAorICAgIEVYUEVDVF9FUShzZXNzaW9ucy5zaXplKCksIHRlc3RTZXNzaW9ucy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgc2Vzc2lvbiA6IHRlc3RTZXNzaW9ucykgeworICAgICAgICBFWFBFQ1RfTkUoc2Vzc2lvbnMuZW5kKCksIHNlc3Npb25zLmZpbmQoc2Vzc2lvbikpOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSB0aGUgb3BlbiBmaWxlcyBhcmUgcmVuYW1lZCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIGZpbGVzCisgICAgYXV0byBmaWxlcyA9IG1TeXN0ZW0uc2NhbkRpckVudHJpZXMoc3Bvb2xEaXIoKSk7CisgICAgLy8gdGhlcmUgd2VyZSB0d2ljZSBhcyBtYW55IGZpbGVzIGFzIHNlc3Npb25zCisgICAgRVhQRUNUX0VRKDIgKiBzZXNzaW9ucy5zaXplKCksIGZpbGVzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZpbGUgOiBmaWxlcykgeworICAgICAgICBFWFBFQ1RfU1RSRVEoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZSkuY19zdHIoKSwgIi50cngiKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIGZpbGVzIGhhdmUgYSBrbm93biBzZXNzaW9uIElEIGluIHRoZSBuYW1lCisgICAgICAgIEVYUEVDVF9ORShzZXNzaW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6ZmluZF9pZihzZXNzaW9ucy5iZWdpbigpLCBzZXNzaW9ucy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmZpbGVdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmZpbmQoc2Vzc2lvbikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9Cit9CisKK1RFU1RfRihGaWxlTWV0cmljc1dyaXRlclRlc3QsIGZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzV3JvbmdOYW1lcykgeworICAgIG1ha2VTcG9vbERpcigpOworCisgICAgLy8gY3JlYXRlIHNvbWUgbm9uLW9wZW4tbGlrZSBmaWxlcworICAgIEFTU0VSVF9UUlVFKG1Sb290LT5tYWtlU3ViRmlsZSgKKyAgICAgICAgICAgIFBhdGhVdGlsczo6am9pbihrU3Bvb2xEaXIsICJlbXVsYXRvci1tZXRyaWNzLnRyeCIpKSk7CisgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICBtUm9vdC0+bWFrZVN1YkZpbGUoUGF0aFV0aWxzOjpqb2luKGtTcG9vbERpciwgImVtdWxhdG9yLW1ldHJpY3MiKSkpOworICAgIEFTU0VSVF9UUlVFKG1Sb290LT5tYWtlU3ViRmlsZSgKKyAgICAgICAgICAgIFBhdGhVdGlsczo6am9pbihrU3Bvb2xEaXIsICJlbXVsYXRvci1tZXRyaWNzLm9wZW4uY2xvc2VkIikpKTsKKyAgICBBU1NFUlRfVFJVRShtUm9vdC0+bWFrZVN1YkZpbGUoCisgICAgICAgICAgICBQYXRoVXRpbHM6OmpvaW4oa1Nwb29sRGlyLCAiZW11bGF0b3ItbWV0cmljcy5sb2NrIikpKTsKKworICAgIC8vIG5vIHNlc3Npb25zCisgICAgYXV0byBzZXNzaW9ucyA9CisgICAgICAgICAgICBGaWxlTWV0cmljc1dyaXRlcjo6ZmluYWxpemVBYmFuZG9uZWRTZXNzaW9uRmlsZXMoc3Bvb2xEaXIoKSk7CisgICAgRVhQRUNUX1RSVUUoc2Vzc2lvbnMuZW1wdHkoKSk7Cit9CisKK1RFU1RfRihGaWxlTWV0cmljc1dyaXRlclRlc3QsIGZpbmFsaXplQWJhbmRvbmVkU2Vzc2lvbkZpbGVzTG9ja2VkU2Vzc2lvbikgeworICAgIG1ha2VTcG9vbERpcigpOworCisgICAgLy8gY3JlYXRlIGEgbG9ja2VkIG9wZW4gc2Vzc2lvbiBmaWxlIGFuZCBtYWtlIHN1cmUgaXQgaXMgbm90IGZpbmFsaXplZAorICAgIGF1dG8gb3BlblNlc3Npb25OYW1lID0gUGF0aFV0aWxzOjpqb2luKAorICAgICAgICAgICAga1Nwb29sRGlyLAorICAgICAgICAgICAgU3RyaW5nRm9ybWF0KCJlbXVsYXRvci1tZXRyaWNzLSVzLTEtMS5vcGVuIiwgc2Vzc2lvbklkKCkpKTsKKyAgICBBU1NFUlRfVFJVRShtUm9vdC0+bWFrZVN1YkZpbGUob3BlblNlc3Npb25OYW1lKSk7CisKKyAgICB7CisgICAgICAgIC8vIGxvY2sgdGhlIGZpbGUgYW5kIHRyeSBmaW5hbGl6aW5nCisgICAgICAgIGF1dG8gc2NvcGVkTG9jayA9IG1ha2VDdXN0b21TY29wZWRQdHIoCisgICAgICAgICAgICAgICAgZmlsZWxvY2tfY3JlYXRlKG1Sb290LT5tYWtlU3ViUGF0aChvcGVuU2Vzc2lvbk5hbWUpLmNfc3RyKCkpLAorICAgICAgICAgICAgICAgIGZpbGVsb2NrX3JlbGVhc2UpOworICAgICAgICBBU1NFUlRfVFJVRShzY29wZWRMb2NrKTsKKworICAgICAgICBhdXRvIHNlc3Npb25zID0KKyAgICAgICAgICAgICAgICBGaWxlTWV0cmljc1dyaXRlcjo6ZmluYWxpemVBYmFuZG9uZWRTZXNzaW9uRmlsZXMoc3Bvb2xEaXIoKSk7CisgICAgICAgIC8vIG5vIHNlc3Npb25zCisgICAgICAgIEVYUEVDVF9UUlVFKHNlc3Npb25zLmVtcHR5KCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIHRoYXQgbm93LCB3aGVuIHRoZXJlJ3Mgbm8gbG9jaywgdGhlIG9ubHkgZmlsZSBsZWZ0IGluIHRoZSBkaXJlY3RvcnkKKyAgICAvLyBpcyB0aGUgb3BlbiBzZXNzaW9uIGZpbGUKKyAgICBhdXRvIGZpbGVzID0gbVN5c3RlbS5zY2FuRGlyRW50cmllcyhzcG9vbERpcigpKTsKKyAgICBBU1NFUlRfRVEoMSwgZmlsZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShvcGVuU2Vzc2lvbk5hbWUuZmluZChmaWxlc1swXSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgZmlsZSBuYW1lICciIDw8IGZpbGVzWzBdIDw8ICInIHRvIGJlIGEgZmlsZSBuYW1lIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2Vzc2lvbiBmaWxlIHBhdGggJyIKKyAgICAgICAgICAgIDw8IG9wZW5TZXNzaW9uTmFtZSA8PCAnXCcnOworfQorCitURVNUX0YoRmlsZU1ldHJpY3NXcml0ZXJUZXN0LCB3cml0ZVNpbXBsZSkgeworICAgIG1Xcml0ZXIgPSBGaWxlTWV0cmljc1dyaXRlcjo6Y3JlYXRlKHNwb29sRGlyKCksIHNlc3Npb25JZCgpLCAwLCBudWxscHRyLCAwKTsKKworICAgIC8vIGNyZWF0ZSBhbmQgd3JpdGUgc29tZSBldmVudAorICAgIHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCBldmVudDsKKyAgICBldmVudC5zZXRfaXNfdXNlcl9pbml0aWF0ZWQodHJ1ZSk7CisgICAgZXZlbnQuc2V0X3RhZygidGFnIik7CisgICAgZXZlbnQuc2V0X3NvdXJjZV9leHRlbnNpb24oInNlIik7CisgICAgbVdyaXRlci0+d3JpdGUoZXZlbnQpOworCisgICAgbVdyaXRlci5yZXNldCgpOworCisgICAgLy8gcmVhZCB0aGUgZXZlbnQgYmFjay4KKyAgICBhdXRvIGZpbGVzID0gbVN5c3RlbS5zY2FuRGlyRW50cmllcyhzcG9vbERpcigpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEoMSwgZmlsZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMF0pLmNfc3RyKCksICIudHJ4Iik7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGluKGZpbGVzWzBdLCBzdGQ6Omlvc19iYXNlOjpiaW5hcnkpOworICAgIEVYUEVDVF9UUlVFKGluKTsKKyAgICB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQgcmVhZEV2ZW50OworICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gaW5TdHJlYW0oJmluKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpwcm90b2J1Zjo6cmVhZE9uZURlbGltaXRlZCgmcmVhZEV2ZW50LCAmaW5TdHJlYW0pKTsKKworICAgIC8vIG1ha2Ugc3VyZSBpdCdzIHRoZSBzYW1lIGV2ZW50LgorICAgIEFTU0VSVF9UUlVFKGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRFdmVudCkpOworCisgICAgLy8gYW5kIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzCisgICAgQVNTRVJUX0ZBTFNFKGFuZHJvaWQ6OnByb3RvYnVmOjpyZWFkT25lRGVsaW1pdGVkKCZyZWFkRXZlbnQsICZpblN0cmVhbSkpOworfQorCitURVNUX0YoRmlsZU1ldHJpY3NXcml0ZXJUZXN0LCB3cml0ZU11bHRpcGxlKSB7CisgICAgbVdyaXRlciA9IEZpbGVNZXRyaWNzV3JpdGVyOjpjcmVhdGUoc3Bvb2xEaXIoKSwgc2Vzc2lvbklkKCksIDAsIG51bGxwdHIsIDApOworCisgICAgLy8gY3JlYXRlIGFuZCB3cml0ZSBzb21lIGV2ZW50cworICAgIHN0ZDo6dmVjdG9yPHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudD4gZXZlbnRzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgd2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2c6OkxvZ0V2ZW50IGV2ZW50OworICAgICAgICBldmVudC5zZXRfaXNfdXNlcl9pbml0aWF0ZWQodHJ1ZSk7CisgICAgICAgIGV2ZW50LnNldF90YWcoInRhZyIpOworICAgICAgICBldmVudC5zZXRfc291cmNlX2V4dGVuc2lvbigic2UiKTsKKyAgICAgICAgZXZlbnQuc2V0X2V2ZW50X2NvZGUoaSk7CisgICAgICAgIG1Xcml0ZXItPndyaXRlKGV2ZW50KTsKKyAgICAgICAgZXZlbnRzLnB1c2hfYmFjayhldmVudCk7CisgICAgfQorCisgICAgbVdyaXRlci5yZXNldCgpOworCisgICAgLy8gcmVhZCB0aGUgZXZlbnQgYmFjay4KKyAgICBhdXRvIGZpbGVzID0gbVN5c3RlbS5zY2FuRGlyRW50cmllcyhzcG9vbERpcigpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEoMSwgZmlsZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXNbMF0pLmNfc3RyKCksICIudHJ4Iik7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGluKGZpbGVzWzBdLCBzdGQ6Omlvc19iYXNlOjpiaW5hcnkpOworICAgIEVYUEVDVF9UUlVFKGluKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6SXN0cmVhbUlucHV0U3RyZWFtIGluU3RyZWFtKCZpbik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGV2ZW50IDogZXZlbnRzKSB7CisgICAgICAgIHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCByZWFkRXZlbnQ7CisgICAgICAgIEFTU0VSVF9UUlVFKGFuZHJvaWQ6OnByb3RvYnVmOjpyZWFkT25lRGVsaW1pdGVkKCZyZWFkRXZlbnQsICZpblN0cmVhbSkpOworICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyB0aGUgc2FtZSBldmVudC4KKyAgICAgICAgQVNTRVJUX1RSVUUoZ29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6TWVzc2FnZURpZmZlcmVuY2VyOjpFcXVhbHMoZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRFdmVudCkpOworICAgIH0KKworICAgIC8vIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cworICAgIHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCByZWFkRXZlbnQ7CisgICAgQVNTRVJUX0ZBTFNFKGFuZHJvaWQ6OnByb3RvYnVmOjpyZWFkT25lRGVsaW1pdGVkKCZyZWFkRXZlbnQsICZpblN0cmVhbSkpOworfQorCitURVNUX0YoRmlsZU1ldHJpY3NXcml0ZXJUZXN0LCB3cml0ZUxpbWl0ZWQpIHsKKyAgICBtV3JpdGVyID0gRmlsZU1ldHJpY3NXcml0ZXI6OmNyZWF0ZShzcG9vbERpcigpLCBzZXNzaW9uSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgLy8gcmVjb3JkcyBwZXIgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDApOworCisgICAgLy8gY3JlYXRlIGFuZCB3cml0ZSBzb21lIGV2ZW50CisgICAgc3RkOjphcnJheTx3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQsIDI+IGV2ZW50OworICAgIGV2ZW50WzBdLnNldF9pc191c2VyX2luaXRpYXRlZCh0cnVlKTsKKyAgICBldmVudFswXS5zZXRfdGFnKCJ0YWciKTsKKyAgICBldmVudFswXS5zZXRfc291cmNlX2V4dGVuc2lvbigic2UiKTsKKyAgICBtV3JpdGVyLT53cml0ZShldmVudFswXSk7CisKKyAgICB7CisgICAgICAgIGF1dG8gZmlsZXMgPSBtU3lzdGVtLnNjYW5EaXJFbnRyaWVzKHNwb29sRGlyKCkpOworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBvbmUgb3BlbiBhbmQgb25lIGZpbmFsaXplZCBmaWxlIGFzIG9mIG5vdworICAgICAgICBBU1NFUlRfRVEoMSwgc3RkOjpjb3VudF9pZihmaWxlcy5iZWdpbigpLCBmaWxlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXRoVXRpbHM6OmV4dGVuc2lvbihuYW1lKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3BlbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnRfaWYoZmlsZXMuYmVnaW4oKSwgZmlsZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGF0aFV0aWxzOjpleHRlbnNpb24obmFtZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnRyeCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisKKyAgICBldmVudFsxXS5zZXRfZXZlbnRfdXB0aW1lX21zKDEwMCk7CisgICAgZXZlbnRbMV0uYWRkX3Rlc3RfY29kZSgxMDApOworICAgIGV2ZW50WzFdLnNldF9zdG9yZSgic3RvcmUiKTsKKyAgICBtV3JpdGVyLT53cml0ZShldmVudFsxXSk7CisKKyAgICBtV3JpdGVyLnJlc2V0KCk7CisKKyAgICAvLyByZWFkIHRoZSBldmVudHMgYmFjayBhbmQgbWFrZSBzdXJlIHRoZXkncmUgY29ycmVjdC4KKyAgICBhdXRvIGZpbGVzID0gbVN5c3RlbS5zY2FuRGlyRW50cmllcyhzcG9vbERpcigpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEoMywgZmlsZXMuc2l6ZSgpKSA8PCBzdGQ6OmFjY3VtdWxhdGUoZmlsZXMuYmVnaW4oKSwgZmlsZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCkpOworICAgIC8vIHRoZSBsYXN0IGZpbGUgaXMgYW4gZW1wdHkgb25lOiBpdCdzIHRoZSBmaWxlIGNyZWF0ZWQgZm9yIHRoZSBmb2xsb3dpbmcKKyAgICAvLyBldmVudC4KKyAgICBTeXN0ZW06OkZpbGVTaXplIHNpemU7CisgICAgQVNTRVJUX1RSVUUobVN5c3RlbS5wYXRoRmlsZVNpemUoZmlsZXMuYmFjaygpLCAmc2l6ZSkpOworICAgIEFTU0VSVF9FUSgwLCBzaXplKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZXZlbnQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX1NUUkVRKFBhdGhVdGlsczo6ZXh0ZW5zaW9uKGZpbGVzW2ldKS5jX3N0cigpLCAiLnRyeCIpOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGluKGZpbGVzW2ldLCBzdGQ6Omlvc19iYXNlOjpiaW5hcnkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbik7CisgICAgICAgIHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCByZWFkRXZlbnQ7CisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gaW5TdHJlYW0oJmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoYW5kcm9pZDo6cHJvdG9idWY6OnJlYWRPbmVEZWxpbWl0ZWQoJnJlYWRFdmVudCwgJmluU3RyZWFtKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIGl0J3MgdGhlIHNhbWUgZXZlbnQuCisgICAgICAgIEFTU0VSVF9UUlVFKGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKAorICAgICAgICAgICAgICAgIGV2ZW50W2ldLCByZWFkRXZlbnQpKTsKKworICAgICAgICAvLyBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMKKyAgICAgICAgQVNTRVJUX0ZBTFNFKAorICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnByb3RvYnVmOjpyZWFkT25lRGVsaW1pdGVkKCZyZWFkRXZlbnQsICZpblN0cmVhbSkpOworICAgIH0KK30KKworVEVTVF9GKEZpbGVNZXRyaWNzV3JpdGVyVGVzdCwgd3JpdGVUaW1lcmVkKSB7CisgICAgbVdyaXRlciA9IEZpbGVNZXRyaWNzV3JpdGVyOjpjcmVhdGUoc3Bvb2xEaXIoKSwgc2Vzc2lvbklkKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvb3Blci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKTsgIC8vIDEgc2VjIHBlciBmaWxlLgorCisgICAgRVhQRUNUX0VRKDAsIG1Mb29wZXItPnRpbWVycygpLnNpemUoKSk7CisKKyAgICAvLyBjcmVhdGUgYW5kIHdyaXRlIHNvbWUgZXZlbnQKKyAgICB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQgZXZlbnQ7CisgICAgZXZlbnQuc2V0X2lzX3VzZXJfaW5pdGlhdGVkKHRydWUpOworICAgIGV2ZW50LnNldF90YWcoInRhZyIpOworICAgIGV2ZW50LnNldF9zb3VyY2VfZXh0ZW5zaW9uKCJzZSIpOworICAgIG1Xcml0ZXItPndyaXRlKGV2ZW50KTsKKworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLT50aW1lcnMoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLT5hY3RpdmVUaW1lcnMoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtTG9vcGVyLT5wZW5kaW5nVGltZXJzKCkuc2l6ZSgpKTsKKworICAgIHsKKyAgICAgICAgYXV0byBmaWxlcyA9IG1TeXN0ZW0uc2NhbkRpckVudHJpZXMoc3Bvb2xEaXIoKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIG9uZSBvcGVuIGFuZCBubyBmaW5hbGl6ZWQgZmlsZXMgYXMgb2Ygbm93CisgICAgICAgIEFTU0VSVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGZpbGVzLmJlZ2luKCksIGZpbGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhdGhVdGlsczo6ZXh0ZW5zaW9uKG5hbWUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcGVuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfRVEoMCwgc3RkOjpjb3VudF9pZihmaWxlcy5iZWdpbigpLCBmaWxlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXRoVXRpbHM6OmV4dGVuc2lvbihuYW1lKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIudHJ4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworICAgIH0KKworICAgIC8vIG5vdyB1cGRhdGUgdGhlIHRpbWVzdGFtcCBhbmQgcnVuIHRoZSBsb29wZXIgdG8gdHJpZ2dlciB0aGUgdGltZXIKKyAgICBtU3lzdGVtLnNldFVuaXhUaW1lVXMoMjAwMDAwMCk7CisgICAgbUxvb3Blci0+cnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMjAwMCk7CisKKyAgICAvLyB0aGVyZSdzIHN0aWxsIG9uZSBhY3RpdmUgdGltZXIuLgorICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLT50aW1lcnMoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLT5hY3RpdmVUaW1lcnMoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtTG9vcGVyLT5wZW5kaW5nVGltZXJzKCkuc2l6ZSgpKTsKKworICAgIC8vIG5vdyB3ZSBzaG91bGQgaGF2ZSBvbmUgb3BlbiBhbmQgb25lIGZpbmFsaXplZCBmaWxlIGFzCisgICAgYXV0byBmaWxlcyA9IG1TeXN0ZW0uc2NhbkRpckVudHJpZXMoc3Bvb2xEaXIoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKDEsIHN0ZDo6Y291bnRfaWYoZmlsZXMuYmVnaW4oKSwgZmlsZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhdGhVdGlsczo6ZXh0ZW5zaW9uKG5hbWUpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLm9wZW4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICBBU1NFUlRfRVEoMSwgc3RkOjpjb3VudF9pZihmaWxlcy5iZWdpbigpLCBmaWxlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGF0aFV0aWxzOjpleHRlbnNpb24obmFtZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIudHJ4IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoUGF0aFV0aWxzOjpleHRlbnNpb24oZmlsZXMuZnJvbnQoKSkuY19zdHIoKSwgIi50cngiKTsKKworICAgIC8vIHJlYWQgdGhlIGV2ZW50IGJhY2sgYW5kIG1ha2Ugc3VyZSB0aGV5J3JlIGNvcnJlY3QuCisgICAgc3RkOjppZnN0cmVhbSBpbihmaWxlcy5mcm9udCgpLCBzdGQ6Omlvc19iYXNlOjpiaW5hcnkpOworICAgIEVYUEVDVF9UUlVFKGluKTsKKyAgICB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQgcmVhZEV2ZW50OworICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gaW5TdHJlYW0oJmluKTsKKyAgICBBU1NFUlRfVFJVRShhbmRyb2lkOjpwcm90b2J1Zjo6cmVhZE9uZURlbGltaXRlZCgmcmVhZEV2ZW50LCAmaW5TdHJlYW0pKTsKKworICAgIEFTU0VSVF9UUlVFKGdvb2dsZTo6cHJvdG9idWY6OnV0aWw6Ok1lc3NhZ2VEaWZmZXJlbmNlcjo6RXF1YWxzKAorICAgICAgICAgICAgZXZlbnQsIHJlYWRFdmVudCkpOworICAgIEFTU0VSVF9GQUxTRSgKKyAgICAgICAgICAgIGFuZHJvaWQ6OnByb3RvYnVmOjpyZWFkT25lRGVsaW1pdGVkKCZyZWFkRXZlbnQsICZpblN0cmVhbSkpOworCisgICAgbVdyaXRlci5yZXNldCgpOworCisgICAgLy8gbm8gdGltZXJzIGFueW1vcmUKKyAgICBFWFBFQ1RfRVEoMCwgbUxvb3Blci0+dGltZXJzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbUxvb3Blci0+YWN0aXZlVGltZXJzKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbUxvb3Blci0+cGVuZGluZ1RpbWVycygpLnNpemUoKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9NZXRyaWNzUmVwb3J0ZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvdGVzdHMvTWV0cmljc1JlcG9ydGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiNWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvdGVzdHMvTWV0cmljc1JlcG9ydGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE4MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9jbGllbnRhbmFseXRpY3MucGIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vc3R1ZGlvX3N0YXRzLnBiLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvdGVzdHMvTW9ja01ldHJpY3NXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6bWV0cmljczsKKworc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtWZXJzaW9uID0gInZlcnNpb24iOworc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdWaWV3IGtGdWxsVmVyc2lvbiA9ICJmdWxsVmVyc2lvbiI7CitzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1FlbXVWZXJzaW9uID0gInFlbXVWZXJzaW9uIjsKK3N0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrU2Vzc2lvbklkID0gInNlc3Npb24iOworCituYW1lc3BhY2UgeworCitjbGFzcyBNZXRyaWNzUmVwb3J0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RkOjpzaGFyZWRfcHRyPE1vY2tNZXRyaWNzV3JpdGVyPiBtV3JpdGVyeworICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxNb2NrTWV0cmljc1dyaXRlcj4oa1Nlc3Npb25JZCl9OworICAgIE9wdGlvbmFsPE1vY2tNZXRyaWNzUmVwb3J0ZXI+IG1SZXBvcnRlcjsKKworICAgIHZvaWQgY3JlYXRlUmVwb3J0ZXIoYm9vbCBlbmFibGVkID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZpZXcgdmVyID0ga1ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IGZ1bGxWZXIgPSBrRnVsbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IHFlbXVWZXIgPSBrUWVtdVZlcnNpb24pIHsKKyAgICAgICAgbVJlcG9ydGVyLmVtcGxhY2UoZW5hYmxlZCwgbVdyaXRlciwgdmVyLCBmdWxsVmVyLCBxZW11VmVyKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKE1ldHJpY3NSZXBvcnRlclRlc3QsIGlzRW5hYmxlZCkgeworICAgIGNyZWF0ZVJlcG9ydGVyKHRydWUpOworICAgIEVYUEVDVF9UUlVFKG1SZXBvcnRlci0+aXNSZXBvcnRpbmdFbmFibGVkKCkpOworCisgICAgY3JlYXRlUmVwb3J0ZXIoZmFsc2UpOworICAgIEVYUEVDVF9GQUxTRShtUmVwb3J0ZXItPmlzUmVwb3J0aW5nRW5hYmxlZCgpKTsKK30KKworVEVTVF9GKE1ldHJpY3NSZXBvcnRlclRlc3QsIHNlc3Npb25JZCkgeworICAgIGNyZWF0ZVJlcG9ydGVyKCk7CisgICAgRVhQRUNUX1NUUkVRKGtTZXNzaW9uSWQuY19zdHIoKSwgbVJlcG9ydGVyLT5zZXNzaW9uSWQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKE1ldHJpY3NSZXBvcnRlclRlc3QsIGdldCkgeworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCByZXBvcnRlciBoYXMgcmVwb3J0aW5nIGRpc2FibGVkLgorICAgIEVYUEVDVF9GQUxTRShNZXRyaWNzUmVwb3J0ZXI6OmdldCgpLmlzUmVwb3J0aW5nRW5hYmxlZCgpKTsKK30KKworVEVTVF9GKE1ldHJpY3NSZXBvcnRlclRlc3QsIHNlbmRUb1dyaXRlcikgeworICAgIHN0ZDo6c3RyaW5nIHNlc3Npb25JZCA9IGtTZXNzaW9uSWQ7CisgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudDo6RXZlbnRLaW5kIGtpbmQgPQorICAgICAgICAgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudDo6RU1VTEFUT1JfUElORzsKKyAgICBib29sIGV4cGVjdFZlcnNpb25zID0gdHJ1ZTsKKyAgICBtV3JpdGVyLT5tT25Xcml0ZSA9IFsma2luZCwgJnNlc3Npb25JZCwgJmV4cGVjdFZlcnNpb25zXSgKKyAgICAgICAgICAgIGNvbnN0IHdpcmVsZXNzX2FuZHJvaWRfcGxheV9wbGF5bG9nOjpMb2dFdmVudCYgZXZlbnQpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoZXZlbnQuaGFzX2V2ZW50X3RpbWVfbXMoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50Lmhhc19ldmVudF91cHRpbWVfbXMoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50Lmhhc19zb3VyY2VfZXh0ZW5zaW9uKCkpOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgZmllbGRzIEFzeW5jTWV0cmljc1JlcG9ydGVyIGlzIHN1cHBvc2VkIHRvIGZpbGwgaW4uCisgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgc3R1ZGlvRXZlbnQ7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0dWRpb0V2ZW50LlBhcnNlRnJvbVN0cmluZyhldmVudC5zb3VyY2VfZXh0ZW5zaW9uKCkpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3R1ZGlvRXZlbnQuaGFzX3N0dWRpb19zZXNzaW9uX2lkKCkpOworICAgICAgICBFWFBFQ1RfU1RSRVEoc2Vzc2lvbklkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICBzdHVkaW9FdmVudC5zdHVkaW9fc2Vzc2lvbl9pZCgpLmNfc3RyKCkpOworICAgICAgICBFWFBFQ1RfRVEoa2luZCwgc3R1ZGlvRXZlbnQua2luZCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShzdHVkaW9FdmVudC5oYXNfcHJvZHVjdF9kZXRhaWxzKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShzdHVkaW9FdmVudC5oYXNfZW11bGF0b3JfZGV0YWlscygpKTsKKworICAgICAgICBFWFBFQ1RfRVEoYW5kcm9pZF9zdHVkaW86OlByb2R1Y3REZXRhaWxzOjpFTVVMQVRPUiwKKyAgICAgICAgICAgICAgICAgIHN0dWRpb0V2ZW50LnByb2R1Y3RfZGV0YWlscygpLnByb2R1Y3QoKSk7CisKKyAgICAgICAgaWYgKGV4cGVjdFZlcnNpb25zKSB7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa1ZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHVkaW9FdmVudC5wcm9kdWN0X2RldGFpbHMoKS52ZXJzaW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0Z1bGxWZXJzaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3R1ZGlvRXZlbnQucHJvZHVjdF9kZXRhaWxzKCkuYnVpbGQoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrUWVtdVZlcnNpb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHVkaW9FdmVudC5lbXVsYXRvcl9kZXRhaWxzKCkuY29yZV92ZXJzaW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3R1ZGlvRXZlbnQucHJvZHVjdF9kZXRhaWxzKCkuaGFzX3ZlcnNpb24oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3R1ZGlvRXZlbnQucHJvZHVjdF9kZXRhaWxzKCkuaGFzX2J1aWxkKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHN0dWRpb0V2ZW50LmVtdWxhdG9yX2RldGFpbHMoKS5oYXNfY29yZV92ZXJzaW9uKCkpOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9UUlVFKHN0dWRpb0V2ZW50LmVtdWxhdG9yX2RldGFpbHMoKS5oYXNfc3lzdGVtX3RpbWUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHN0dWRpb0V2ZW50LmVtdWxhdG9yX2RldGFpbHMoKS5oYXNfdXNlcl90aW1lKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShzdHVkaW9FdmVudC5lbXVsYXRvcl9kZXRhaWxzKCkuaGFzX3dhbGxfdGltZSgpKTsKKyAgICB9OworCisgICAgY3JlYXRlUmVwb3J0ZXIoKTsKKworICAgIHsKKyAgICAgICAgLy8gdHJ5IGFuIGVtcHR5IGV2ZW50CisgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgZXZlbnQ7CisKKyAgICAgICAgbVJlcG9ydGVyLT5zZW5kVG9Xcml0ZXIoJmV2ZW50KTsKKworICAgICAgICBFWFBFQ1RfRVEoMSwgbVdyaXRlci0+bVdyaXRlQ2FsbHNDb3VudCk7CisgICAgfQorICAgIHsKKyAgICAgICAgLy8gbm93IHByZS1maWxsIGV2ZW50IGtpbmQKKyAgICAgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCBldmVudDsKKyAgICAgICAga2luZCA9IGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQ6OkVNVUxBVE9SX0hPU1Q7CisgICAgICAgIGV2ZW50LnNldF9raW5kKGtpbmQpOworCisgICAgICAgIG1SZXBvcnRlci0+c2VuZFRvV3JpdGVyKCZldmVudCk7CisKKyAgICAgICAgRVhQRUNUX0VRKDIsIG1Xcml0ZXItPm1Xcml0ZUNhbGxzQ291bnQpOworCisgICAgICAgIC8vIHJlc2V0IHxraW5kfCBiYWNrCisgICAgICAgIGtpbmQgPSBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50OjpFTVVMQVRPUl9QSU5HOworICAgIH0KKyAgICB7CisgICAgICAgIC8vIHByZS1maWxsIHNlc3Npb24gSUQKKyAgICAgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCBldmVudDsKKyAgICAgICAgc2Vzc2lvbklkID0gIm90aGVyIHNlc3Npb24gaWQiOworICAgICAgICBldmVudC5zZXRfc3R1ZGlvX3Nlc3Npb25faWQoc2Vzc2lvbklkKTsKKworICAgICAgICBtUmVwb3J0ZXItPnNlbmRUb1dyaXRlcigmZXZlbnQpOworCisgICAgICAgIEVYUEVDVF9FUSgzLCBtV3JpdGVyLT5tV3JpdGVDYWxsc0NvdW50KTsKKyAgICAgICAgLy8gcmVzZXQgfHNlc3Npb25JZHwgYmFjaworICAgICAgICBzZXNzaW9uSWQgPSBrU2Vzc2lvbklkOworICAgIH0KKyAgICB7CisgICAgICAgIC8vIG5vdyBjcmVhdGUgdGhlIHJlcG9ydGVyIHdpdGhvdXQgdmVyc2lvbnMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZW4ndAorICAgICAgICAvLyBzZXQgaW4gdGhhdCBjYXNlCisgICAgICAgIGNyZWF0ZVJlcG9ydGVyKHRydWUsIHt9LCB7fSwge30pOworICAgICAgICBleHBlY3RWZXJzaW9ucyA9IGZhbHNlOworICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50IGV2ZW50OworCisgICAgICAgIG1SZXBvcnRlci0+c2VuZFRvV3JpdGVyKCZldmVudCk7CisKKyAgICAgICAgRVhQRUNUX0VRKDQsIG1Xcml0ZXItPm1Xcml0ZUNhbGxzQ291bnQpOworICAgICAgICBleHBlY3RWZXJzaW9ucyA9IHRydWU7CisgICAgfQorfQorCitURVNUX0YoTWV0cmljc1JlcG9ydGVyVGVzdCwgcmVwb3J0KSB7CisgICAgY3JlYXRlUmVwb3J0ZXIoKTsKKworICAgIG1SZXBvcnRlci0+bU9uUmVwb3J0Q29uZGl0aW9uYWwgPSBbXShNZXRyaWNzUmVwb3J0ZXI6OkNvbmRpdGlvbmFsQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUoYm9vbChjYikpOworICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50IGV2ZW50OworICAgICAgICBFWFBFQ1RfVFJVRShjYigmZXZlbnQpKTsKKyAgICB9OworCisgICAgbVJlcG9ydGVyLT5yZXBvcnQoW10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHt9KTsKKyAgICBFWFBFQ1RfRVEoMSwgbVJlcG9ydGVyLT5tUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50KTsKKyAgICBtUmVwb3J0ZXItPnJlcG9ydChbXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkge30pOworICAgIEVYUEVDVF9FUSgyLCBtUmVwb3J0ZXItPm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworCisgICAgLy8gZW1wdHkgY2FsbGJhY2tzIGRvbid0IGV2ZW4gcmVhY2ggdGhlIHJlcG9ydENvbmRpdGlvbmFsKCkgb3ZlcnJpZGUKKyAgICBtUmVwb3J0ZXItPnJlcG9ydCh7fSk7CisgICAgRVhQRUNUX0VRKDIsIG1SZXBvcnRlci0+bVJlcG9ydENvbmRpdGlvbmFsQ2FsbHNDb3VudCk7CisKKyAgICAvLyByZXBvcnRlciBzaG91bGQgbmV2ZXIgY2FsbCB3cml0ZXIgZnJvbSByZXBvcnQoKSBkaXJlY3RseS4KKyAgICBFWFBFQ1RfRVEoMCwgbVdyaXRlci0+bVdyaXRlQ2FsbHNDb3VudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1JlcG9ydGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzUmVwb3J0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYjE4NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1JlcG9ydGVyLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTnVsbE1ldHJpY3NXcml0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitNb2NrTWV0cmljc1JlcG9ydGVyOjpNb2NrTWV0cmljc1JlcG9ydGVyKCkKKyAgICA6IE1ldHJpY3NSZXBvcnRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNzV3JpdGVyOjpQdHIobmV3IE51bGxNZXRyaWNzV3JpdGVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgIHt9KSB7fQorCitNb2NrTWV0cmljc1JlcG9ydGVyOjpNb2NrTWV0cmljc1JlcG9ydGVyKGJvb2wgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljc1dyaXRlcjo6UHRyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JGdWxsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBxZW11VmVyc2lvbikKKyAgICA6IE1ldHJpY3NSZXBvcnRlcihlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3JGdWxsVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBxZW11VmVyc2lvbikge30KKwordm9pZCBNb2NrTWV0cmljc1JlcG9ydGVyOjpyZXBvcnRDb25kaXRpb25hbCgKKyAgICAgICAgTWV0cmljc1JlcG9ydGVyOjpDb25kaXRpb25hbENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgKyttUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50OworICAgIGlmIChtT25SZXBvcnRDb25kaXRpb25hbCkgeworICAgICAgICBtT25SZXBvcnRDb25kaXRpb25hbChjYWxsYmFjayk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzUmVwb3J0ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzUmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWYwZTFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvdGVzdHMvTW9ja01ldHJpY3NSZXBvcnRlci5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzUmVwb3J0ZXIuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBtZXRyaWNzIHsKKworY2xhc3MgTW9ja01ldHJpY3NSZXBvcnRlciBmaW5hbCA6IHB1YmxpYyBNZXRyaWNzUmVwb3J0ZXIgeworcHVibGljOgorICAgIHVzaW5nIE9uUmVwb3J0Q29uZGl0aW9uYWwgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoQ29uZGl0aW9uYWxDYWxsYmFjayk+OworCisgICAgTW9ja01ldHJpY3NSZXBvcnRlcigpOworICAgIE1vY2tNZXRyaWNzUmVwb3J0ZXIoYm9vbCBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljc1dyaXRlcjo6UHRyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlN0cmluZ1ZpZXcgZW11bGF0b3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBlbXVsYXRvckZ1bGxWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6U3RyaW5nVmlldyBxZW11VmVyc2lvbik7CisKKyAgICB2b2lkIHJlcG9ydENvbmRpdGlvbmFsKENvbmRpdGlvbmFsQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworICAgIGludCBtUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50ID0gMDsKKyAgICBPblJlcG9ydENvbmRpdGlvbmFsIG1PblJlcG9ydENvbmRpdGlvbmFsOworCisgICAgLy8gQWxsb3cgVVRzIGFjY2VzcyB0byB0aGlzIG9uZSBhcyB3ZWxsLgorICAgIHVzaW5nIE1ldHJpY3NSZXBvcnRlcjo6c2VuZFRvV3JpdGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhYjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzV3JpdGVyLmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgbWV0cmljcyB7CisKK01vY2tNZXRyaWNzV3JpdGVyOjpNb2NrTWV0cmljc1dyaXRlcihjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbklkKQorICAgIDogTWV0cmljc1dyaXRlcihzZXNzaW9uSWQpIHt9CisKK3ZvaWQgTW9ja01ldHJpY3NXcml0ZXI6OndyaXRlKAorICAgICAgICBjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmIGV2ZW50KSB7CisgICAgKyttV3JpdGVDYWxsc0NvdW50OworICAgIGlmIChtT25Xcml0ZSkgeworICAgICAgICBtT25Xcml0ZShldmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbWV0cmljcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzV3JpdGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NTMyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9NZXRyaWNzV3JpdGVyLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG1ldHJpY3MgeworCitjbGFzcyBNb2NrTWV0cmljc1dyaXRlciBmaW5hbCA6IHB1YmxpYyBNZXRyaWNzV3JpdGVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBPbldyaXRlID0KKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmKT47CisKKyAgICBNb2NrTWV0cmljc1dyaXRlcihjb25zdCBzdGQ6OnN0cmluZyYgc2Vzc2lvbklkID0ge30pOworCisgICAgdm9pZCB3cml0ZShjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmIGV2ZW50KSBvdmVycmlkZTsKKworICAgIGludCBtV3JpdGVDYWxsc0NvdW50ID0gMDsKKyAgICBPbldyaXRlIG1PbldyaXRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1ldHJpY3MKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9OdWxsTWV0cmljc0NsYXNzZXNfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvdGVzdHMvTnVsbE1ldHJpY3NDbGFzc2VzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNmMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21ldHJpY3MvdGVzdHMvTnVsbE1ldHJpY3NDbGFzc2VzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9OdWxsTWV0cmljc1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL051bGxNZXRyaWNzV3JpdGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnBiLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1dyaXRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZXRyaWNzOworCitURVNUKE51bGxNZXRyaWNzQ2xhc3Nlc1Rlc3QsIHdyaXRlcikgeworICAgIE51bGxNZXRyaWNzV3JpdGVyIHdyaXRlcjsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIHdyaXRlci5zZXNzaW9uSWQoKS5jX3N0cigpKTsKKyAgICB3cml0ZXIud3JpdGUoe30pOyAgLy8gZG9lcyBub3RoaW5nLCBhbmQgdGhlcmUncyBubyB3YXkgdG8gY2hlY2sgaXQgOigKK30KKworVEVTVChOdWxsTWV0cmljc0NsYXNzZXNUZXN0LCByZXBvcnRlcikgeworICAgIGF1dG8gd3JpdGVyID0gc3RkOjptYWtlX3NoYXJlZDxNb2NrTWV0cmljc1dyaXRlcj4oKTsKKyAgICB3cml0ZXItPm1PbldyaXRlID0gW10oCisgICAgICAgICAgICBjb25zdCB3aXJlbGVzc19hbmRyb2lkX3BsYXlfcGxheWxvZzo6TG9nRXZlbnQmIGV2ZW50KSB7IEZBSUwoKTsgfTsKKworICAgIE51bGxNZXRyaWNzUmVwb3J0ZXIgcmVwb3J0ZXIod3JpdGVyKTsKKworICAgIC8vIE1ha2Ugc3VyZSBub3RoaW5nIGJyZWFrcyBvbiBhIG51bGwgY2FsbGJhY2suCisgICAgcmVwb3J0ZXIucmVwb3J0Q29uZGl0aW9uYWwoe30pOworCisgICAgcmVwb3J0ZXIucmVwb3J0Q29uZGl0aW9uYWwoW10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgQUREX0ZBSUxVUkUoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworICAgIHJlcG9ydGVyLnJlcG9ydENvbmRpdGlvbmFsKFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgIEFERF9GQUlMVVJFKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0pOworCisgICAgRVhQRUNUX0VRKDAsIHdyaXRlci0+bVdyaXRlQ2FsbHNDb3VudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9QZXJpb2RpY1JlcG9ydGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL1BlcmlvZGljUmVwb3J0ZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGI5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9QZXJpb2RpY1JlcG9ydGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvUGVyaW9kaWNSZXBvcnRlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0TG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1V1aWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnBiLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy90ZXN0cy9Nb2NrTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjptZXRyaWNzOworCitzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcga1Nwb29sRGlyID0gIi5hbmRyb2lkL21ldHJpY3Mvc3Bvb2wiOworCituYW1lc3BhY2UgeworCitjbGFzcyBQZXJpb2RpY1JlcG9ydGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFRlc3RTeXN0ZW0gbVN5c3RlbXsiLyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzLCAiL2hvbWUifTsKKyAgICBUZXN0VGVtcERpciogbVJvb3QgPSBtU3lzdGVtLmdldFRlbXBSb290KCk7CisgICAgVGVzdExvb3BlciBtTG9vcGVyOworICAgIE1vY2tNZXRyaWNzUmVwb3J0ZXIgbVJlcG9ydGVyOworCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobVJvb3QgIT0gbnVsbHB0cik7CisgICAgICAgIG1TeXN0ZW0uZW52U2V0KCJBTkRST0lEX1NES19IT01FIiwgbVJvb3QtPnBhdGhTdHJpbmcoKSk7CisKKyAgICAgICAgUGVyaW9kaWNSZXBvcnRlcjo6c3RhcnQoJm1SZXBvcnRlciwgJm1Mb29wZXIpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSB7IFBlcmlvZGljUmVwb3J0ZXI6OnN0b3AoKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihQZXJpb2RpY1JlcG9ydGVyVGVzdCwgc3RhcnRTdG9wKSB7CisgICAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBjcmFzaCBpZiBjYWxsZWQgbXVsdGlwbGUgdGltZXMKKyAgICBQZXJpb2RpY1JlcG9ydGVyOjpnZXQoKTsKKyAgICBQZXJpb2RpY1JlcG9ydGVyOjpzdG9wKCk7CisgICAgUGVyaW9kaWNSZXBvcnRlcjo6c3RvcCgpOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OnN0YXJ0KCZtUmVwb3J0ZXIsICZtTG9vcGVyKTsKK30KKworVEVTVF9GKFBlcmlvZGljUmVwb3J0ZXJUZXN0LCBhZGRUYXNrKSB7CisgICAgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkVGFzaygKKyAgICAgICAgICAgIDEwMCwgW10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCopIHsgcmV0dXJuIHRydWU7IH0pOworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLnRpbWVycygpLnNpemUoKSk7CisgICAgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkVGFzaygKKyAgICAgICAgICAgIDEwMDAsIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgICBFWFBFQ1RfRVEoMiwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZFRhc2soCisgICAgICAgICAgICAxMDAwLCBbXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KikgeyByZXR1cm4gdHJ1ZTsgfSk7CisgICAgRVhQRUNUX0VRKDIsIG1Mb29wZXIudGltZXJzKCkuc2l6ZSgpKTsKKworICAgIEVYUEVDVF9FUSgyLCBtTG9vcGVyLmFjdGl2ZVRpbWVycygpLnNpemUoKSk7Cit9CisKK1RFU1RfRihQZXJpb2RpY1JlcG9ydGVyVGVzdCwgYWRkQ2FuY2VsYWJsZVRhc2spIHsKKyAgICBhdXRvIHRhc2sxID0gUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkQ2FuY2VsYWJsZVRhc2soCisgICAgICAgICAgICAxMDAsIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgICBFWFBFQ1RfRVEoMSwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworICAgIGF1dG8gdGFzazIgPSBQZXJpb2RpY1JlcG9ydGVyOjpnZXQoKS5hZGRDYW5jZWxhYmxlVGFzaygKKyAgICAgICAgICAgIDEwMDAsIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgICBFWFBFQ1RfRVEoMiwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworICAgIGF1dG8gdGFzazMgPSBQZXJpb2RpY1JlcG9ydGVyOjpnZXQoKS5hZGRDYW5jZWxhYmxlVGFzaygKKyAgICAgICAgICAgIDEwMDAsIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgICBFWFBFQ1RfRVEoMiwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworCisgICAgRVhQRUNUX0VRKDIsIG1Mb29wZXIuYWN0aXZlVGltZXJzKCkuc2l6ZSgpKTsKKworICAgIHRhc2sxLnJlc2V0KCk7CisgICAgRVhQRUNUX0VRKDEsIG1Mb29wZXIudGltZXJzKCkuc2l6ZSgpKTsKKyAgICB0YXNrMi5yZXNldCgpOworICAgIEVYUEVDVF9FUSgxLCBtTG9vcGVyLnRpbWVycygpLnNpemUoKSk7CisgICAgdGFzazMucmVzZXQoKTsKKyAgICBFWFBFQ1RfRVEoMCwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworfQorCitURVNUX0YoUGVyaW9kaWNSZXBvcnRlclRlc3QsIGFkZFRhc2tNaXhlZCkgeworICAgIFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZFRhc2soCisgICAgICAgICAgICAxMDAsIFtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqKSB7IHJldHVybiB0cnVlOyB9KTsKKyAgICBFWFBFQ1RfRVEoMSwgbUxvb3Blci50aW1lcnMoKS5zaXplKCkpOworICAgIGF1dG8gdGFzayA9IFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZENhbmNlbGFibGVUYXNrKAorICAgICAgICAgICAgMTAwLCBbXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KikgeyByZXR1cm4gdHJ1ZTsgfSk7CisgICAgRVhQRUNUX0VRKDEsIG1Mb29wZXIudGltZXJzKCkuc2l6ZSgpKTsKKyAgICB0YXNrLnJlc2V0KCk7CisgICAgRVhQRUNUX0VRKDEsIG1Mb29wZXIudGltZXJzKCkuc2l6ZSgpKTsKK30KKworVEVTVF9GKFBlcmlvZGljUmVwb3J0ZXJUZXN0LCBydW5UYXNrKSB7CisgICAgbVJlcG9ydGVyLm1PblJlcG9ydENvbmRpdGlvbmFsID0KKyAgICAgICAgICAgIFtdKE1ldHJpY3NSZXBvcnRlcjo6Q29uZGl0aW9uYWxDYWxsYmFjayBjYikgeworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGNiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50IGV2ZW50OworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNiKCZldmVudCkpOworICAgICAgICAgICAgICAgIEVYUEVDVF9TVFJFUSgic2Vzc2lvbiIsIGV2ZW50LnN0dWRpb19zZXNzaW9uX2lkKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9OworCisgICAgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkVGFzaygKKyAgICAgICAgICAgIDEwMCwgW10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBldmVudC0+c2V0X3N0dWRpb19zZXNzaW9uX2lkKCJzZXNzaW9uIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKworICAgIG1Mb29wZXIucnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMTAwKTsKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHRhc2sgZGlkbid0IHJ1bgorICAgIEVYUEVDVF9FUSgwLCBtUmVwb3J0ZXIubVJlcG9ydENvbmRpdGlvbmFsQ2FsbHNDb3VudCk7CisKKyAgICBtU3lzdGVtLnNldFVuaXhUaW1lVXMoMTAwMDAwKTsKKyAgICBtTG9vcGVyLnJ1bk9uZUl0ZXJhdGlvbldpdGhEZWFkbGluZU1zKDEwMCk7CisgICAgLy8gbm93IGl0IGlzIHNob3VsZCd2ZSBiZWVuIGV4ZWN1dGVkCisgICAgRVhQRUNUX0VRKDEsIG1SZXBvcnRlci5tUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50KTsKKworICAgIG1TeXN0ZW0uc2V0VW5peFRpbWVVcygxOTkwMDApOworICAgIG1Mb29wZXIucnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMTk5KTsKKyAgICAvLyBub3QgZXhlY3V0ZWQgZm9yIHRoZSBzZWNvbmQgdGltZSB5ZXQKKyAgICBFWFBFQ1RfRVEoMSwgbVJlcG9ydGVyLm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworCisgICAgbVN5c3RlbS5zZXRVbml4VGltZVVzKDIwMDAwMCk7CisgICAgbUxvb3Blci5ydW5PbmVJdGVyYXRpb25XaXRoRGVhZGxpbmVNcygyMDApOworICAgIC8vIHNlY29uZCBydW4KKyAgICBFWFBFQ1RfRVEoMiwgbVJlcG9ydGVyLm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworfQorCitURVNUX0YoUGVyaW9kaWNSZXBvcnRlclRlc3QsIHJ1blRhc2tOb1JlcG9ydGluZykgeworICAgIGJvb2wgc2hvdWxkUmVwb3J0MSA9IGZhbHNlOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZFRhc2soCisgICAgICAgICAgICAxMDAsIFsmc2hvdWxkUmVwb3J0MV0oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkUmVwb3J0MTsKKyAgICAgICAgICAgIH0pOworICAgIGJvb2wgc2hvdWxkUmVwb3J0MiA9IGZhbHNlOworICAgIFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZFRhc2soCisgICAgICAgICAgICAxMDAsIFsmc2hvdWxkUmVwb3J0Ml0oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkUmVwb3J0MjsKKyAgICAgICAgICAgIH0pOworCisgICAgYm9vbCBleHBlY3RSZXBvcnQgPSBmYWxzZTsKKyAgICBtUmVwb3J0ZXIubU9uUmVwb3J0Q29uZGl0aW9uYWwgPQorICAgICAgICAgICAgWyZleHBlY3RSZXBvcnRdKE1ldHJpY3NSZXBvcnRlcjo6Q29uZGl0aW9uYWxDYWxsYmFjayBjYikgeworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGNiKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50IGV2ZW50OworICAgICAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RSZXBvcnQsIGNiKCZldmVudCkpOworICAgICAgICAgICAgfTsKKworICAgIG1TeXN0ZW0uc2V0VW5peFRpbWVVcygxMDAwMDApOworICAgIHNob3VsZFJlcG9ydDEgPSBmYWxzZTsKKyAgICBzaG91bGRSZXBvcnQyID0gZmFsc2U7CisgICAgZXhwZWN0UmVwb3J0ID0gZmFsc2U7CisgICAgbUxvb3Blci5ydW5PbmVJdGVyYXRpb25XaXRoRGVhZGxpbmVNcygxMDApOworICAgIEVYUEVDVF9FUSgxLCBtUmVwb3J0ZXIubVJlcG9ydENvbmRpdGlvbmFsQ2FsbHNDb3VudCk7CisKKyAgICBtU3lzdGVtLnNldFVuaXhUaW1lVXMoMjAwMDAwKTsKKyAgICBzaG91bGRSZXBvcnQxID0gdHJ1ZTsKKyAgICBzaG91bGRSZXBvcnQyID0gZmFsc2U7CisgICAgZXhwZWN0UmVwb3J0ID0gdHJ1ZTsKKyAgICBtTG9vcGVyLnJ1bk9uZUl0ZXJhdGlvbldpdGhEZWFkbGluZU1zKDIwMCk7CisgICAgRVhQRUNUX0VRKDIsIG1SZXBvcnRlci5tUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50KTsKKworICAgIG1TeXN0ZW0uc2V0VW5peFRpbWVVcygzMDAwMDApOworICAgIHNob3VsZFJlcG9ydDEgPSBmYWxzZTsKKyAgICBzaG91bGRSZXBvcnQyID0gdHJ1ZTsKKyAgICBleHBlY3RSZXBvcnQgPSB0cnVlOworICAgIG1Mb29wZXIucnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMzAwKTsKKyAgICBFWFBFQ1RfRVEoMywgbVJlcG9ydGVyLm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworCisgICAgbVN5c3RlbS5zZXRVbml4VGltZVVzKDQwMDAwMCk7CisgICAgc2hvdWxkUmVwb3J0MSA9IHRydWU7CisgICAgc2hvdWxkUmVwb3J0MiA9IHRydWU7CisgICAgZXhwZWN0UmVwb3J0ID0gdHJ1ZTsKKyAgICBtTG9vcGVyLnJ1bk9uZUl0ZXJhdGlvbldpdGhEZWFkbGluZU1zKDQwMCk7CisgICAgRVhQRUNUX0VRKDQsIG1SZXBvcnRlci5tUmVwb3J0Q29uZGl0aW9uYWxDYWxsc0NvdW50KTsKK30KKworVEVTVF9GKFBlcmlvZGljUmVwb3J0ZXJUZXN0LCBydW5UYXNrV2l0aENhbmNlbGxhdGlvbikgeworICAgIG1SZXBvcnRlci5tT25SZXBvcnRDb25kaXRpb25hbCA9CisgICAgICAgICAgICBbXShNZXRyaWNzUmVwb3J0ZXI6OkNvbmRpdGlvbmFsQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShjYik7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCBldmVudDsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfVFJVRShjYigmZXZlbnQpKTsKKyAgICAgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoImlkIiwgZXZlbnQuc3R1ZGlvX3Nlc3Npb25faWQoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAvLyBDYXB0dXJlIHRoZSB0YXNrJ3MgdG9rZW4gaW50byB0aGUgdGFzayBpdHNlbGYgYW5kIHJlc2V0IGl0IGluIHRoZSBtaWRkbGUKKyAgICAvLyBvZiByZXBvcnRpbmcuCisgICAgUGVyaW9kaWNSZXBvcnRlcjo6VGFza1Rva2VuIHRhc2sgPQorICAgICAgICAgICAgUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkQ2FuY2VsYWJsZVRhc2soCisgICAgICAgICAgICAgICAgICAgIDEwMCwgWyZ0YXNrXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPnNldF9zdHVkaW9fc2Vzc2lvbl9pZCgiaWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIG1TeXN0ZW0uc2V0VW5peFRpbWVVcygxMDAwMDApOworICAgIG1Mb29wZXIucnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMTAwKTsKKyAgICAvLyBjaGVjayB0aGF0IHdlIHJhbiB0aGUgdGFzayBhdCBmaXJzdC4uLgorICAgIEVYUEVDVF9FUSgxLCBtUmVwb3J0ZXIubVJlcG9ydENvbmRpdGlvbmFsQ2FsbHNDb3VudCk7CisKKyAgICAvLyAuLi5idXQgdGhlcmUncyBubyB0YXNrIHRvIHJ1biBhbnltb3JlCisgICAgRVhQRUNUX0ZBTFNFKHRhc2spOworICAgIG1TeXN0ZW0uc2V0VW5peFRpbWVVcygyMDAwMDApOworICAgIG1Mb29wZXIucnVuT25lSXRlcmF0aW9uV2l0aERlYWRsaW5lTXMoMjAwKTsKKyAgICBFWFBFQ1RfRVEoMSwgbVJlcG9ydGVyLm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworfQorCitURVNUX0YoUGVyaW9kaWNSZXBvcnRlclRlc3QsIHRhc2tUb2tlbk91dGxpdmVzUmVwb3J0ZXIpIHsKKyAgICBtUmVwb3J0ZXIubU9uUmVwb3J0Q29uZGl0aW9uYWwgPQorICAgICAgICAgICAgW10oTWV0cmljc1JlcG9ydGVyOjpDb25kaXRpb25hbENhbGxiYWNrIGNiKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoY2IpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQgZXZlbnQ7CisgICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2IoJmV2ZW50KSk7CisgICAgICAgICAgICB9OworCisgICAgYXV0byB0YXNrID0gUGVyaW9kaWNSZXBvcnRlcjo6Z2V0KCkuYWRkQ2FuY2VsYWJsZVRhc2soCisgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICBbXShhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeyByZXR1cm4gdHJ1ZTsgfSk7CisKKyAgICBtU3lzdGVtLnNldFVuaXhUaW1lVXMoMTAwMDAwKTsKKyAgICBtTG9vcGVyLnJ1bk9uZUl0ZXJhdGlvbldpdGhEZWFkbGluZU1zKDEwMCk7CisgICAgLy8gY2hlY2sgdGhhdCB3ZSByYW4gdGhlIHRhc2sgYXQgZmlyc3QuLi4KKyAgICBFWFBFQ1RfRVEoMSwgbVJlcG9ydGVyLm1SZXBvcnRDb25kaXRpb25hbENhbGxzQ291bnQpOworCisgICAgLy8gbm93IHN0b3AgdGhlIHJlcG9ydGVyIGFuZCBtYWtlIHN1cmUgaXQgZG9lc24ndCBjcmFzaCBuZWl0aGVyIGR1cmluZyB0aGUKKyAgICAvLyByZXNldCBub3Igd2hlbiB3ZSB0cnkgcnVubmluZyB0YXNrcyBhZ2FpbiBvciByZXNldHRpbmcgdGhlIHRva2VuCisgICAgUGVyaW9kaWNSZXBvcnRlcjo6c3RvcCgpOworICAgIEVYUEVDVF9UUlVFKHRhc2spOworCisgICAgbVN5c3RlbS5zZXRVbml4VGltZVVzKDIwMDAwMCk7CisgICAgbUxvb3Blci5ydW5PbmVJdGVyYXRpb25XaXRoRGVhZGxpbmVNcygyMDApOworICAgIEVYUEVDVF9FUSgxLCBtUmVwb3J0ZXIubVJlcG9ydENvbmRpdGlvbmFsQ2FsbHNDb3VudCk7CisKKyAgICB0YXNrLnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9TeW5jTWV0cmljc1JlcG9ydGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL1N5bmNNZXRyaWNzUmVwb3J0ZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5N2UxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWV0cmljcy90ZXN0cy9TeW5jTWV0cmljc1JlcG9ydGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9TeW5jTWV0cmljc1JlcG9ydGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvcHJvdG8vY2xpZW50YW5hbHl0aWNzLnBiLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Rlc3RzL01vY2tNZXRyaWNzV3JpdGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6Om1ldHJpY3M7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIFN5bmNNZXRyaWNzUmVwb3J0ZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgc3RkOjpzaGFyZWRfcHRyPE1vY2tNZXRyaWNzV3JpdGVyPiBtV3JpdGVyeworICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxNb2NrTWV0cmljc1dyaXRlcj4oKX07CisgICAgU3luY01ldHJpY3NSZXBvcnRlciBtUmVwb3J0ZXJ7bVdyaXRlcn07Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9GKFN5bmNNZXRyaWNzUmVwb3J0ZXJUZXN0LCBpc0VuYWJsZWQpIHsKKyAgICBFWFBFQ1RfVFJVRShtUmVwb3J0ZXIuaXNSZXBvcnRpbmdFbmFibGVkKCkpOworfQorCitURVNUX0YoU3luY01ldHJpY3NSZXBvcnRlclRlc3QsIHJlcG9ydENvbmRpdGlvbmFsKSB7CisgICAgY29uc3QgYXV0byB0aHJlYWRJZCA9IGFuZHJvaWRfZ2V0X3RocmVhZF9pZCgpOworICAgIG1Xcml0ZXItPm1PbldyaXRlID0KKyAgICAgICAgICAgIFt0aHJlYWRJZF0oY29uc3Qgd2lyZWxlc3NfYW5kcm9pZF9wbGF5X3BsYXlsb2c6OkxvZ0V2ZW50JiBldmVudCkgeworICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0aHJlYWRJZCwgYW5kcm9pZF9nZXRfdGhyZWFkX2lkKCkpOworICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50Lmhhc19zb3VyY2VfZXh0ZW5zaW9uKCkpOworICAgICAgICAgICAgfTsKKworICAgIGludCByZXBvcnRDYWxsYmFja0NhbGxzID0gMDsKKyAgICBtUmVwb3J0ZXIucmVwb3J0Q29uZGl0aW9uYWwoW3RocmVhZElkLCAmcmVwb3J0Q2FsbGJhY2tDYWxsc10oCisgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6QW5kcm9pZFN0dWRpb0V2ZW50KiBldmVudCkgeworICAgICAgICBFWFBFQ1RfVFJVRShldmVudCAhPSBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKHRocmVhZElkLCBhbmRyb2lkX2dldF90aHJlYWRfaWQoKSk7CisgICAgICAgICsrcmVwb3J0Q2FsbGJhY2tDYWxsczsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0pOworCisgICAgRVhQRUNUX0VRKDEsIHJlcG9ydENhbGxiYWNrQ2FsbHMpOworICAgIEVYUEVDVF9FUSgwLCBtV3JpdGVyLT5tV3JpdGVDYWxsc0NvdW50KTsKKworICAgIG1SZXBvcnRlci5yZXBvcnRDb25kaXRpb25hbChbdGhyZWFkSWQsICZyZXBvcnRDYWxsYmFja0NhbGxzXSgKKyAgICAgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgIEVYUEVDVF9UUlVFKGV2ZW50ICE9IG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEodGhyZWFkSWQsIGFuZHJvaWRfZ2V0X3RocmVhZF9pZCgpKTsKKyAgICAgICAgKytyZXBvcnRDYWxsYmFja0NhbGxzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KTsKKworICAgIEVYUEVDVF9FUSgyLCByZXBvcnRDYWxsYmFja0NhbGxzKTsKKyAgICBFWFBFQ1RfRVEoMSwgbVdyaXRlci0+bVdyaXRlQ2FsbHNDb3VudCk7CisKKyAgICAvLyBNYWtlIHN1cmUgbm90aGluZyBicmVha3Mgb24gYSBudWxsIGNhbGxiYWNrLgorICAgIG1SZXBvcnRlci5yZXBvcnRDb25kaXRpb25hbCh7fSk7CisgICAgRVhQRUNUX0VRKDEsIG1Xcml0ZXItPm1Xcml0ZUNhbGxzQ291bnQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21pc2MvUmFuZG9tLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9taXNjL1JhbmRvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlYTZjMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9taXNjL1JhbmRvbS5jcHAKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9taXNjL1JhbmRvbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFN0ZGlvRmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorI2VuZGlmCisKKyNkZWZpbmUgRSguLi4pIGRlcnJvcihfX1ZBX0FSR1NfXykKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkU3RkaW9GaWxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgZ2VuZXJhdGVSYW5kb21CeXRlcyhjaGFyKiBidWYsIHNpemVfdCBidWZfbGVuKSB7CisjaWZkZWYgX1dJTjMyCisgICAgSENSWVBUUFJPViBoQ3J5cHRQcm92OworICAgIERXT1JEIGR3RmxhZ3MgPSBDUllQVF9WRVJJRllDT05URVhUIHwgQ1JZUFRfU0lMRU5UOworICAgIGlmICghQ3J5cHRBY3F1aXJlQ29udGV4dCgmaENyeXB0UHJvdiwgTlVMTCwgTlVMTCwgUFJPVl9SU0FfRlVMTCwgZHdGbGFncykpIHsKKyAgICAgICAgaWYgKEdldExhc3RFcnJvcigpID09IChEV09SRClOVEVfQkFEX0tFWVNFVCkgeworICAgICAgICAgICAgaWYgKCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MgfCBDUllQVF9ORVdLRVlTRVQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQk9PTCBvayA9IENyeXB0R2VuUmFuZG9tKGhDcnlwdFByb3YsIGJ1Zl9sZW4sIChCWVRFKilidWYpOworCisgICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCAwKTsKKworICAgIGlmICghb2spIHsKKyAgICAgICAgRSgiQ2FuJ3QgcmVhZCBmcm9tIENyeXB0R2VuUmFuZG9tIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIFNjb3BlZFN0ZGlvRmlsZSBmcChmb3BlbigiL2Rldi91cmFuZG9tIiwgInJiIikpOworICAgIGlmIChmcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEUoIkNhbid0IG9wZW4gL2Rldi91cmFuZG9tIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2l6ZV90IGVyciA9IGZyZWFkKGJ1ZiwgMSwgYnVmX2xlbiwgZnAuZ2V0KCkpOworICAgIGlmIChlcnIgIT0gYnVmX2xlbikgeworICAgICAgICBFKCJDYW4ndCByZWFkIGZyb20gL2Rldi91cmFuZG9tIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9taXNjL1JhbmRvbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL21pc2MvUmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxNDRmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9taXNjL1JhbmRvbS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gR2VuZXJhdGVzIHxidWZfbGVufCBjcnlwdG8gcmFuZG9tIGJ5dGVzIGludG8gfGJ1ZnwKKy8vIFJldHVybnMgZmFsc2UgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKK2Jvb2wgZ2VuZXJhdGVSYW5kb21CeXRlcyhjaGFyKiBidWYsIHNpemVfdCBidWZfbGVuKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9taXNjL1JhbmRvbV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWlzYy9SYW5kb21fdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDRkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbWlzYy9SYW5kb21fdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvbWlzYy9SYW5kb20uaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworVEVTVChSYW5kb20sIGdlbmVyYXRlUmFuZG9tQnl0ZXMpIHsKKyAgICBjaGFyIGJ1ZlsyMF07CisgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisgICAgLy8gdGVzdCB3aGF0IHdlIGNhbgorICAgIEVYUEVDVF9UUlVFKGdlbmVyYXRlUmFuZG9tQnl0ZXMoYnVmLCAxMikpOworCisgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmVuJ3Qgb3ZlcmZsb3dlZAorICAgIEVYUEVDVF9FUSgwLCBidWZbMTJdKTsKKworICAgIC8vIGNvbmZpcm0gdGhhdCBhbGwgb2YgdGhlIGJ5dGVzIGhhdmUgYmVlbiBlZmZlY3RlZAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgMCwgaXQgbWlnaHQgYmUgYSBsZWdpdCByYW5kb20gMCwgbGV0J3MgYmUgc3VyZQorICAgICAgICB3aGlsZSAoYnVmW2ldID09IDApIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKGdlbmVyYXRlUmFuZG9tQnl0ZXMoYnVmLCAxMikpOworICAgICAgICB9CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtcG9ydC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGMzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbXVsdGl0b3VjaC1wb3J0LmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9tdWx0aXRvdWNoLXBvcnQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIiAgLyogZm9yIGFuZHJvaWRfaHcgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2h3LWV2ZW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvanBlZy1jb21wcmVzcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbXVsdGl0b3VjaC1zY3JlZW4uaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9zZGstY29udHJvbGxlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vY2hhcm1hcC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhbmljLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSAgRSguLi4pICAgIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFcoLi4uKSAgICBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKG10cG9ydCxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKG10cG9ydCkKKworI2RlZmluZSBUUkFDRV9PTiAgICAxCisKKyNpZiBUUkFDRV9PTgorI2RlZmluZSAgVCguLi4pICAgIFZFUkJPU0VfUFJJTlQobXRwb3J0LF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgIFQoLi4uKQorI2VuZGlmCisKKy8qIFRpbWVvdXQgKG1pbGxpc2VjKSB0byB1c2Ugd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggU0RLIGNvbnRyb2xsZXIuICovCisjZGVmaW5lIFNES0NUTF9NVF9USU1FT1VUICAgICAgMzAwMAorCisvKgorICogTWVzc2FnZSB0eXBlcyB1c2VkIGluIG11bHRpLXRvdWNoIGVtdWxhdGlvbi4KKyAqLworCisvKiBQb2ludGVyIG1vdmUgbWVzc2FnZS4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX01PVkUgICAgICAgICAgICAgICAgICAxCisvKiBGaXJzdCBwb2ludGVyIGRvd24gbWVzc2FnZS4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX0ZJU1JUX0RPV04gICAgICAgICAgICAyCisvKiBMYXN0IHBvaW50ZXIgdXAgbWVzc2FnZS4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX0xBU1RfVVAgICAgICAgICAgICAgICAzCisvKiBQb2ludGVyIGRvd24gbWVzc2FnZS4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX1BPSU5URVJfRE9XTiAgICAgICAgICA0CisvKiBQb2ludGVyIHVwIG1lc3NhZ2UuICovCisjZGVmaW5lIFNES0NUTF9NVF9QT0lOVEVSX1VQICAgICAgICAgICAgNQorLyogU2VuZHMgZnJhbWVidWZmZXIgdXBkYXRlLiAqLworI2RlZmluZSBTREtDVExfTVRfRkJfVVBEQVRFICAgICAgICAgICAgIDYKKy8qIEZyYW1lYnVmZmVyIHVwZGF0ZSBoYXMgYmVlbiByZWNlaXZlZC4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX0ZCX1VQREFURV9SRUNFSVZFRCAgICA3CisvKiBGcmFtZWJ1ZmZlciB1cGRhdGUgaGFzIGJlZW4gaGFuZGxlZC4gKi8KKyNkZWZpbmUgU0RLQ1RMX01UX0ZCX1VQREFURV9IQU5ETEVEICAgICA4CisKKy8qIE11bHRpLXRvdWNoIHBvcnQgZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBBbmRyb2lkTVRTUG9ydCB7CisgICAgLyogQ2FsbGVyIGlkZW50aWZpZXIuICovCisgICAgdm9pZCogICAgICAgICAgICAgICBvcGFxdWU7CisgICAgLyogQ29tbXVuaWNhdGlvbiBzb2NrZXQuICovCisgICAgU0RLQ3RsU29ja2V0KiAgICAgICBzZGtjdGw7CisgICAgLyogSW5pdGlhbGl6ZWQgSlBFRyBjb21wcmVzc29yIGluc3RhbmNlLiAqLworICAgIEFKUEVHRGVzYyogICAgICAgICAganBlZ19jb21wcmVzc29yOworICAgIC8qIERpcmVjdCBwYWNrZXQgZGVzY3JpcHRvciBmb3IgZnJhbWVidWZmZXIgdXBkYXRlcy4gKi8KKyAgICBTREtDdGxEaXJlY3RQYWNrZXQqIGZiX3BhY2tldDsKK307CisKKy8qIERhdGEgc2VudCB3aXRoIFNES0NUTF9NVF9RVUVSWV9TVEFSVCAqLwordHlwZWRlZiBzdHJ1Y3QgUXVlcnlEaXNwRGF0YSB7CisgICAgLyogV2lkdGggb2YgdGhlIGVtdWxhdG9yIGRpc3BsYXkuICovCisgICAgaW50ICAgICB3aWR0aDsKKyAgICAvKiBIZWlnaHQgb2YgdGhlIGVtdWxhdG9yIGRpc3BsYXkuICovCisgICAgaW50ICAgICBoZWlnaHQ7Cit9IFF1ZXJ5RGlzcERhdGE7CisKKy8qIE11bHRpLXRvdWNoIGV2ZW50IHN0cnVjdHVyZSByZWNlaXZlZCBmcm9tIFNESyBjb250cm9sbGVyIHBvcnQuICovCit0eXBlZGVmIHN0cnVjdCBBbmRyb2lkTVRFdmVudCB7CisgICAgLyogUG9pbnRlciBpZGVudGlmaWVyLiAqLworICAgIGludCAgICAgcGlkOworICAgIC8qIFBvaW50ZXIgJ3gnIGNvb3JkaW5hdGUuICovCisgICAgaW50ICAgICB4OworICAgIC8qIFBvaW50ZXIgJ3knIGNvb3JkaW5hdGUuICovCisgICAgaW50ICAgICB5OworICAgIC8qIFBvaW50ZXIgcHJlc3N1cmUuICovCisgICAgaW50ICAgICBwcmVzc3VyZTsKK30gQW5kcm9pZE1URXZlbnQ7CisKKy8qIE11bHRpLXRvdWNoIHBvaW50ZXIgZGVzY3JpcHRvciByZWNlaXZlZCBmcm9tIFNESyBjb250cm9sbGVyIHBvcnQuICovCit0eXBlZGVmIHN0cnVjdCBBbmRyb2lkTVRQdHIgeworICAgIC8qIFBvaW50ZXIgaWRlbnRpZmllci4gKi8KKyAgICBpbnQgICAgIHBpZDsKK30gQW5kcm9pZE1UUHRyOworCisvKiBEZXN0cm95cyBhbmQgZnJlZXMgdGhlIGRlc2NyaXB0b3IuICovCitzdGF0aWMgdm9pZAorX210c19wb3J0X2ZyZWUoQW5kcm9pZE1UU1BvcnQqIG10c3ApCit7CisgICAgaWYgKG10c3AgIT0gTlVMTCkgeworICAgICAgICBpZiAobXRzcC0+ZmJfcGFja2V0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNka2N0bF9kaXJlY3RfcGFja2V0X3JlbGVhc2UobXRzcC0+ZmJfcGFja2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobXRzcC0+anBlZ19jb21wcmVzc29yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGpwZWdfY29tcHJlc3Nvcl9kZXN0cm95KG10c3AtPmpwZWdfY29tcHJlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG10c3AtPnNka2N0bCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZGtjdGxfc29ja2V0X3JlbGVhc2UobXRzcC0+c2RrY3RsKTsKKyAgICAgICAgfQorICAgICAgICBBRlJFRShtdHNwKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpLXRvdWNoIGFjdGlvbiBoYW5kbGVycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBBbHRob3VnaCB0aGVyZSBhcmUgYSBsb3Qgb2Ygc2ltaWxhcml0aWVzIGluIHRoZSB3YXkgdGhlIGhhbmRsZXJzIGJlbG93IGFyZQorICogaW1wbGVtZW50ZWQsIGZvciB0aGUgc2FrZSBvZiB0cmFjaW5nIC8gZGVidWdnaW5nIGl0J3MgYmV0dGVyIHRvIGhhdmUgYQorICogc2VwYXJhdGUgaGFuZGxlciBmb3IgZWFjaCBkaXN0aW5jdGl2ZSBhY3Rpb24uCisgKi8KKworLyogRmlyc3QgcG9pbnRlciBkb3duIGV2ZW50IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZAorX29uX2FjdGlvbl9kb3duKGludCB0cmFja2luZ19pZCwgaW50IHgsIGludCB5LCBpbnQgcHJlc3N1cmUpCit7CisgICAgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcihNVEVTX0RFVklDRSwgdHJhY2tpbmdfaWQsIHgsIHksIHByZXNzdXJlLCAwKTsKK30KKworLyogTGFzdCBwb2ludGVyIHVwIGV2ZW50IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZAorX29uX2FjdGlvbl91cChpbnQgdHJhY2tpbmdfaWQpCit7CisgICAgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcihNVEVTX0RFVklDRSwgdHJhY2tpbmdfaWQsIDAsIDAsIDAsIDApOworfQorCisvKiBQb2ludGVyIGRvd24gZXZlbnQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkCitfb25fYWN0aW9uX3BvaW50ZXJfZG93bihpbnQgdHJhY2tpbmdfaWQsIGludCB4LCBpbnQgeSwgaW50IHByZXNzdXJlKQoreworICAgIG11bHRpdG91Y2hfdXBkYXRlX3BvaW50ZXIoTVRFU19ERVZJQ0UsIHRyYWNraW5nX2lkLCB4LCB5LCBwcmVzc3VyZSwgMCk7Cit9CisKKy8qIFBvaW50ZXIgdXAgZXZlbnQgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2lkCitfb25fYWN0aW9uX3BvaW50ZXJfdXAoaW50IHRyYWNraW5nX2lkKQoreworICAgIG11bHRpdG91Y2hfdXBkYXRlX3BvaW50ZXIoTVRFU19ERVZJQ0UsIHRyYWNraW5nX2lkLCAwLCAwLCAwLCAwKTsKK30KKworLyogUG9pbnRlciBtb3ZlIGV2ZW50IGhhbmRsZXIuICovCitzdGF0aWMgdm9pZAorX29uX2FjdGlvbl9tb3ZlKGludCB0cmFja2luZ19pZCwgaW50IHgsIGludCB5LCBpbnQgcHJlc3N1cmUpCit7CisgICAgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcihNVEVTX0RFVklDRSwgdHJhY2tpbmdfaWQsIHgsIHksIHByZXNzdXJlLCAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGktdG91Y2ggZXZlbnQgaGFuZGxlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIYW5kbGVzICJwb2ludGVyIG1vdmUiIGV2ZW50LgorICogUGFyYW06CisgKiAgcGFyYW0gLSBBcnJheSBvZiBtb3ZpbmcgcG9pbnRlcnMuCisgKiAgcG9pbnRlcnNfY291bnQgLSBOdW1iZXIgb2YgcG9pbnRlcnMgaW4gdGhlIGFycmF5LgorICovCitzdGF0aWMgdm9pZAorX29uX21vdmUoY29uc3QgQW5kcm9pZE1URXZlbnQqIHBhcmFtLCBpbnQgcG9pbnRlcnNfY291bnQpCit7CisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IHBvaW50ZXJzX2NvdW50OyBuKyssIHBhcmFtKyspIHsKKyAgICAgICAgVCgiTXVsdGktdG91Y2g6IE1PVkUoJWQpOiAlZC0+ICVkOiVkOiVkIiwKKyAgICAgICAgICBuLCBwYXJhbS0+cGlkLCBwYXJhbS0+eCwgcGFyYW0tPnksIHBhcmFtLT5wcmVzc3VyZSk7CisgICAgICAgICBfb25fYWN0aW9uX21vdmUocGFyYW0tPnBpZCwgcGFyYW0tPngsIHBhcmFtLT55LCBwYXJhbS0+cHJlc3N1cmUpOworICAgIH0KK30KKworLyogSGFuZGxlcyAiZmlyc3QgcG9pbnRlciBkb3duIiBldmVudC4gKi8KK3N0YXRpYyB2b2lkCitfb25fZG93bihjb25zdCBBbmRyb2lkTVRFdmVudCogcGFyYW0pCit7CisgICAgVCgiTXVsdGktdG91Y2g6IDEtU1QgRE9XTjogJWQtPiAlZDolZDolZCIsCisgICAgICBwYXJhbS0+cGlkLCBwYXJhbS0+eCwgcGFyYW0tPnksIHBhcmFtLT5wcmVzc3VyZSk7CisgICAgX29uX2FjdGlvbl9kb3duKHBhcmFtLT5waWQsIHBhcmFtLT54LCBwYXJhbS0+eSwgcGFyYW0tPnByZXNzdXJlKTsKK30KKworLyogSGFuZGxlcyAibGFzdCBwb2ludGVyIHVwIiBldmVudC4gKi8KK3N0YXRpYyB2b2lkCitfb25fdXAoY29uc3QgQW5kcm9pZE1UUHRyKiBwYXJhbSkKK3sKKyAgICBUKCJNdWx0aS10b3VjaDogTEFTVCBVUDogJWQiLCBwYXJhbS0+cGlkKTsKKyAgICBfb25fYWN0aW9uX3VwKHBhcmFtLT5waWQpOworfQorCisvKiBIYW5kbGVzICJuZXh0IHBvaW50ZXIgZG93biIgZXZlbnQuICovCitzdGF0aWMgdm9pZAorX29uX3Bkb3duKGNvbnN0IEFuZHJvaWRNVEV2ZW50KiBwYXJhbSkKK3sKKyAgICBUKCJNdWx0aS10b3VjaDogRE9XTjogJWQtPiAlZDolZDolZCIsCisgICAgICBwYXJhbS0+cGlkLCBwYXJhbS0+eCwgcGFyYW0tPnksIHBhcmFtLT5wcmVzc3VyZSk7CisgICAgX29uX2FjdGlvbl9wb2ludGVyX2Rvd24ocGFyYW0tPnBpZCwgcGFyYW0tPngsIHBhcmFtLT55LCBwYXJhbS0+cHJlc3N1cmUpOworfQorCisvKiBIYW5kbGVzICJuZXh0IHBvaW50ZXIgdXAiIGV2ZW50LiAqLworc3RhdGljIHZvaWQKK19vbl9wdXAoY29uc3QgQW5kcm9pZE1UUHRyKiBwYXJhbSkKK3sKKyAgICBUKCJNdWx0aS10b3VjaDogVVA6ICVkIiwgcGFyYW0tPnBpZCk7CisgICAgX29uX2FjdGlvbl9wb2ludGVyX3VwKHBhcmFtLT5waWQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIERldmljZSBjb21tdW5pY2F0aW9uIGNhbGxiYWNrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIG9uIFNESyBjb250cm9sbGVyIHNvY2tldCBjb25uZWN0aW9uIGV2ZW50cy4gKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25fbXVsdGl0b3VjaF9zb2NrZXRfY29ubmVjdGlvbih2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpCit7CisgICAgaWYgKHN0YXR1cyA9PSBBU0lPX1NUQVRFX0ZBSUxFRCkgeworICAgICAgICAvKiBSZWNvbm5lY3QgKGFmdGVyIHRpbWVvdXQgZGVsYXkpIG9uIGZhaWx1cmVzICovCisgICAgICAgIGlmIChzZGtjdGxfc29ja2V0X2lzX2hhbmRzaGFrZV9vayhzZGtjdGwpKSB7CisgICAgICAgICAgICBzZGtjdGxfc29ja2V0X3JlY29ubmVjdChzZGtjdGwsIFNES0NUTF9ERUZBVUxUX1RDUF9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ1RMX01UX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBvbiBTREsgY29udHJvbGxlciBwb3J0IGNvbm5lY3Rpb24gZXZlbnRzLiAqLworc3RhdGljIHZvaWQKK19vbl9tdWx0aXRvdWNoX3BvcnRfY29ubmVjdGlvbih2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ3RsUG9ydFN0YXR1cyBzdGF0dXMpCit7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBTREtDVExfUE9SVF9DT05ORUNURUQ6CisgICAgICAgICAgICBEKCJNdWx0aS10b3VjaDogU0RLIENvbnRyb2xsZXIgaXMgY29ubmVjdGVkIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9QT1JUX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIEQoIk11bHRpLXRvdWNoOiBTREsgQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIC8vIERpc2FibGUgT3BlbkdMRVMgZnJhbWVidWZmZXIgdXBkYXRlcy4KKyAgICAgICAgICAgIGlmIChhbmRyb2lkX2h3LT5od19ncHVfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfc2V0UG9zdENhbGxiYWNrKE5VTEwsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfUE9SVF9FTkFCTEVEOgorICAgICAgICAgICAgRCgiTXVsdGktdG91Y2g6IFNESyBDb250cm9sbGVyIHBvcnQgaXMgZW5hYmxlZC4iKTsKKyAgICAgICAgICAgIC8vIEVuYWJsZSBPcGVuR0xFUyBmcmFtZWJ1ZmZlciB1cGRhdGVzLgorICAgICAgICAgICAgaWYgKGFuZHJvaWRfaHctPmh3X2dwdV9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9zZXRQb3N0Q2FsbGJhY2sobXVsdGl0b3VjaF9vcGVuZ2xlc19mYl91cGRhdGUsIE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUmVmcmVzaCAocG9zc2libHkgc3RhbGUpIGRldmljZSBzY3JlZW4uICovCisgICAgICAgICAgICBtdWx0aXRvdWNoX3JlZnJlc2hfc2NyZWVuKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9QT1JUX0RJU0FCTEVEOgorICAgICAgICAgICAgRCgiTXVsdGktdG91Y2g6IFNESyBDb250cm9sbGVyIHBvcnQgaXMgZGlzYWJsZWQuIik7CisgICAgICAgICAgICAvLyBEaXNhYmxlIE9wZW5HTEVTIGZyYW1lYnVmZmVyIHVwZGF0ZXMuCisgICAgICAgICAgICBpZiAoYW5kcm9pZF9ody0+aHdfZ3B1X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX3NldFBvc3RDYWxsYmFjayhOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0RLQ1RMX0hBTkRTSEFLRV9DT05ORUNURUQ6CisgICAgICAgICAgICBEKCJNdWx0aS10b3VjaDogSGFuZHNoYWtlIHN1Y2NlZWRlZCB3aXRoIGNvbm5lY3RlZCBwb3J0LiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX05PX1BPUlQ6CisgICAgICAgICAgICBEKCJNdWx0aS10b3VjaDogSGFuZHNoYWtlIHN1Y2NlZWRlZCB3aXRoIGRpc2Nvbm5lY3RlZCBwb3J0LiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX0RVUDoKKyAgICAgICAgICAgIFcoIk11bHRpLXRvdWNoOiBIYW5kc2hha2UgZmFpbGVkIGR1ZSB0byBwb3J0IGR1cGxpY2F0aW9uLiIpOworICAgICAgICAgICAgc2RrY3RsX3NvY2tldF9kaXNjb25uZWN0KHNka2N0bCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfVU5LTk9XTl9RVUVSWToKKyAgICAgICAgICAgIFcoIk11bHRpLXRvdWNoOiBIYW5kc2hha2UgZmFpbGVkIGR1ZSB0byB1bmtub3duIHF1ZXJ5LiIpOworICAgICAgICAgICAgc2RrY3RsX3NvY2tldF9kaXNjb25uZWN0KHNka2N0bCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfVU5LTk9XTl9SRVNQT05TRToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFcoIk11bHRpLXRvdWNoOiBIYW5kc2hha2UgZmFpbGVkIGR1ZSB0byB1bmtub3duIHJlYXNvbi4iKTsKKyAgICAgICAgICAgIHNka2N0bF9zb2NrZXRfZGlzY29ubmVjdChzZGtjdGwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBkZXZpY2UuICovCitzdGF0aWMgdm9pZAorX29uX211bHRpdG91Y2hfbWVzc2FnZSh2b2lkKiBjbGllbnRfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBtc2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1zZ19zaXplKQoreworICAgIHN3aXRjaCAobXNnX3R5cGUpIHsKKyAgICAgICAgY2FzZSBTREtDVExfTVRfTU9WRTogeworICAgICAgICAgICAgYXNzZXJ0KChtc2dfc2l6ZSAvIHNpemVvZihBbmRyb2lkTVRFdmVudCkpICYmICEobXNnX3NpemUgJSBzaXplb2YoQW5kcm9pZE1URXZlbnQpKSk7CisgICAgICAgICAgICBfb25fbW92ZSgoY29uc3QgQW5kcm9pZE1URXZlbnQqKW1zZ19kYXRhLCBtc2dfc2l6ZSAvIHNpemVvZihBbmRyb2lkTVRFdmVudCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNES0NUTF9NVF9GSVNSVF9ET1dOOgorICAgICAgICAgICAgYXNzZXJ0KG1zZ19zaXplIC8gc2l6ZW9mKEFuZHJvaWRNVEV2ZW50KSAmJiAhKG1zZ19zaXplICUgc2l6ZW9mKEFuZHJvaWRNVEV2ZW50KSkpOworICAgICAgICAgICAgX29uX2Rvd24oKGNvbnN0IEFuZHJvaWRNVEV2ZW50Kiltc2dfZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9NVF9MQVNUX1VQOgorICAgICAgICAgICAgX29uX3VwKChjb25zdCBBbmRyb2lkTVRQdHIqKW1zZ19kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0RLQ1RMX01UX1BPSU5URVJfRE9XTjoKKyAgICAgICAgICAgIGFzc2VydChtc2dfc2l6ZSAvIHNpemVvZihBbmRyb2lkTVRFdmVudCkgJiYgIShtc2dfc2l6ZSAlIHNpemVvZihBbmRyb2lkTVRFdmVudCkpKTsKKyAgICAgICAgICAgIF9vbl9wZG93bigoY29uc3QgQW5kcm9pZE1URXZlbnQqKW1zZ19kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0RLQ1RMX01UX1BPSU5URVJfVVA6CisgICAgICAgICAgICBfb25fcHVwKChjb25zdCBBbmRyb2lkTVRQdHIqKW1zZ19kYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0RLQ1RMX01UX0ZCX1VQREFURV9SRUNFSVZFRDoKKyAgICAgICAgICAgIEQoIkZyYW1lYnVmZmVyIHVwZGF0ZSBBQ0suIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9NVF9GQl9VUERBVEVfSEFORExFRDoKKyAgICAgICAgICAgIEQoIkZyYW1lYnVmZmVyIHVwZGF0ZSBoYW5kbGVkLiIpOworICAgICAgICAgICAgbXVsdGl0b3VjaF9mYl91cGRhdGVkKCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgVygiTXVsdGktdG91Y2g6IFVua25vd24gbWVzc2FnZSAlZCIsIG1zZ190eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgTVRTIHBvcnQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQW5kcm9pZE1UU1BvcnQqIG10c19wb3J0X2NyZWF0ZSgKKyAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICBjb25zdCBRQW5kcm9pZFVzZXJFdmVudEFnZW50KiB1c2VyX2V2ZW50X2FnZW50LAorICAgICAgICBjb25zdCBRQW5kcm9pZERpc3BsYXlBZ2VudCogZGlzcGxheV9hZ2VudCkgeworICAgIEFuZHJvaWRNVFNQb3J0KiBtdHNwOworCisgICAgQU5FVzAobXRzcCk7CisgICAgbXRzcC0+b3BhcXVlICAgICAgICAgICAgICAgID0gb3BhcXVlOworCisgICAgLyogSW5pdGlhbGl6ZSBkZWZhdWx0IE1UUyBkZXNjcmlwdG9yLiAqLworICAgIG11bHRpdG91Y2hfaW5pdChtdHNwLCB1c2VyX2V2ZW50X2FnZW50LCBkaXNwbGF5X2FnZW50KTsKKworICAgIC8qIENyZWF0ZSBKUEVHIGNvbXByZXNzb3IuIFB1dCBtZXNzYWdlIGhlYWRlciArIE1URnJhbWVIZWFkZXIgaW4gZnJvbnQgb2YgdGhlCisgICAgICogY29tcHJlc3NlZCBkYXRhLiB0aGlzIHdheSB3ZSB3aWxsIGhhdmUgZW50aXJlIHF1ZXJ5IHJlYWR5IHRvIGJlCisgICAgICogdHJhbnNtaXR0ZWQgdG8gdGhlIGRldmljZS4gKi8KKyAgICBtdHNwLT5qcGVnX2NvbXByZXNzb3IgPQorICAgICAgICBqcGVnX2NvbXByZXNzb3JfY3JlYXRlKHNka2N0bF9tZXNzYWdlX2dldF9oZWFkZXJfc2l6ZSgpICsgc2l6ZW9mKE1URnJhbWVIZWFkZXIpLCA0MDk2KTsKKworICAgIG10c3AtPnNka2N0bCA9IHNka2N0bF9zb2NrZXRfbmV3KFNES0NUTF9NVF9USU1FT1VULCAibXVsdGktdG91Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9tdWx0aXRvdWNoX3NvY2tldF9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9tdWx0aXRvdWNoX3BvcnRfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fbXVsdGl0b3VjaF9tZXNzYWdlLCBtdHNwKTsKKyAgICBzZGtjdGxfaW5pdF9yZWN5Y2xlcihtdHNwLT5zZGtjdGwsIDY0LCA4KTsKKworICAgIC8qIENyZWF0ZSBhIGRpcmVjdCBwYWNrZXQgdGhhdCB3aWxsIHdyYXAgdXAgZnJhbWVidWZmZXIgdXBkYXRlcy4gTm90ZSB0aGF0CisgICAgICogd2UgbmVlZCB0byBkbyB0aGlzIGFmdGVyIHdlIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIHJlY3ljbGVyISAqLworICAgIG10c3AtPmZiX3BhY2tldCA9IHNka2N0bF9kaXJlY3RfcGFja2V0X25ldyhtdHNwLT5zZGtjdGwpOworCisgICAgLyogTm93IHdlIGNhbiBpbml0aWF0ZSBjb25uZWN0aW9uIHdpdG0gTVQgcG9ydCBvbiB0aGUgZGV2aWNlLiAqLworICAgIHNka2N0bF9zb2NrZXRfY29ubmVjdChtdHNwLT5zZGtjdGwsIFNES0NUTF9ERUZBVUxUX1RDUF9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDVExfTVRfVElNRU9VVCk7CisKKyAgICByZXR1cm4gbXRzcDsKK30KKwordm9pZAorbXRzX3BvcnRfZGVzdHJveShBbmRyb2lkTVRTUG9ydCogbXRzcCkKK3sKKyAgICBfbXRzX3BvcnRfZnJlZShtdHNwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgZnJhbWVidWZmZXIgdXBkYXRlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXByZXNzZXMgYSBmcmFtZWJ1ZmZlciByZWdpb24gaW50byBKUEVHIGltYWdlLgorICogUGFyYW06CisgKiAgbXRzcCAtIE11bHRpLXRvdWNoIHBvcnQgZGVzY3JpcHRvciB3aXRoIGluaXRpYWxpemVkIEpQRUcgY29tcHJlc3Nvci4KKyAqICBmbXQgRGVzY3JpcHRvciBmb3IgZnJhbWVidWZmZXIgcmVnaW9uIHRvIGNvbXByZXNzLgorICogIGZiIEJlZ2lubmluZyBvZiB0aGUgZnJhbWVidWZmZXIuCisgKiAganBlZ19xdWFsaXR5IEpQRUcgY29tcHJlc3Npb24gcXVhbGl0eS4gQSBudW1iZXIgZnJvbSAxIHRvIDEwMC4gTm90ZSB0aGF0CisgKiAgICAgIHZhbHVlIDEwIHByb3ZpZGVzIHByZXR0eSBkZWNlbnQgaW1hZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIG11bHRpLXRvdWNoCisgKiAgICAgIGVtdWxhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK19mYl9jb21wcmVzcyhjb25zdCBBbmRyb2lkTVRTUG9ydCogbXRzcCwKKyAgICAgICAgICAgICBjb25zdCBNVEZyYW1lSGVhZGVyKiBmbXQsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZmIsCisgICAgICAgICAgICAgaW50IGpwZWdfcXVhbGl0eSwKKyAgICAgICAgICAgICBpbnQgeWRpcikKK3sKKyAgICBUKCJNdWx0aS10b3VjaDogY29tcHJlc3NpbmcgJWQgYnl0ZXMgZnJhbWUgYnVmZmVyIiwgZm10LT53ICogZm10LT5oICogZm10LT5icHApOworCisgICAganBlZ19jb21wcmVzc29yX2NvbXByZXNzX2ZiKG10c3AtPmpwZWdfY29tcHJlc3NvciwgZm10LT54LCBmbXQtPnksIGZtdC0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10LT5oLCBmbXQtPmRpc3BfaGVpZ2h0LCBmbXQtPmJwcCwgZm10LT5icGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLCBqcGVnX3F1YWxpdHksIHlkaXIpOworfQorCitpbnQKK210c19wb3J0X3NlbmRfZnJhbWUoQW5kcm9pZE1UU1BvcnQqIG10c3AsCisgICAgICAgICAgICAgICAgICAgIE1URnJhbWVIZWFkZXIqIGZtdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZmIsCisgICAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9kaXJlY3RfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNiX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHlkaXIpCit7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgcG9ydCBpcyBjb25uZWN0ZWQuICovCisgICAgaWYgKCFzZGtjdGxfc29ja2V0X2lzX3BvcnRfcmVhZHkobXRzcC0+c2RrY3RsKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQ29tcHJlc3MgZnJhbWVidWZmZXIgcmVnaW9uLiAxMCUgcXVhbGl0eSBzZWVtcyB0byBiZSBzdWZmaWNpZW50LiAqLworICAgIGZtdC0+Zm9ybWF0ID0gTVRGQl9KUEVHOworICAgIF9mYl9jb21wcmVzcyhtdHNwLCBmbXQsIGZiLCAxMCwgeWRpcik7CisKKyAgICAvKiBUb3RhbCBzaXplIG9mIHRoZSB1cGRhdGUgZGF0YTogaGVhZGVyICsgSlBFRyBpbWFnZS4gKi8KKyAgICBjb25zdCBpbnQgdXBkYXRlX3NpemUgPQorICAgICAgICBzaXplb2YoTVRGcmFtZUhlYWRlcikgKyBqcGVnX2NvbXByZXNzb3JfZ2V0X2pwZWdfc2l6ZShtdHNwLT5qcGVnX2NvbXByZXNzb3IpOworCisgICAgLyogVXBkYXRlIG1lc3NhZ2Ugc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlCisgICAgICogY29tcHJlc3NvcidzIGRlc3RpbmF0aW9uIG1hbmFnZXIuICovCisgICAgdWludDhfdCogY29uc3QgbXNnID0gKHVpbnQ4X3QqKWpwZWdfY29tcHJlc3Nvcl9nZXRfYnVmZmVyKG10c3AtPmpwZWdfY29tcHJlc3Nvcik7CisKKyAgICAvKiBJbml0aWFsaXplIG1lc3NhZ2UgaGVhZGVyLiAqLworICAgIHNka2N0bF9pbml0X21lc3NhZ2VfaGVhZGVyKG1zZywgU0RLQ1RMX01UX0ZCX1VQREFURSwgdXBkYXRlX3NpemUpOworCisgICAgLyogQ29weSBmcmFtZWJ1ZmZlciB1cGRhdGUgaGVhZGVyIHRvIHRoZSBtZXNzYWdlLiAqLworICAgIG1lbWNweShtc2cgKyBzZGtjdGxfbWVzc2FnZV9nZXRfaGVhZGVyX3NpemUoKSwgZm10LCBzaXplb2YoTVRGcmFtZUhlYWRlcikpOworCisgICAgLyogQ29tcHJlc3Npb24gcmF0ZS4uLiAqLworICAgIGNvbnN0IGZsb2F0IGNvbXBfcmF0ZSA9ICgoZmxvYXQpanBlZ19jb21wcmVzc29yX2dldF9qcGVnX3NpemUobXRzcC0+anBlZ19jb21wcmVzc29yKSAvIChmbXQtPncgKiBmbXQtPmggKiBmbXQtPmJwcCkpICogMTAwOworCisgICAgLyogWmVyb2luZyB0aGUgcmVjdGFuZ2xlIGluIHRoZSB1cGRhdGUgaGVhZGVyIHdlIGluZGljYXRlIHRoYXQgaXQgY29udGFpbnMKKyAgICAgKiBubyB1cGRhdGVzLiAqLworICAgIGZtdC0+eCA9IGZtdC0+eSA9IGZtdC0+dyA9IGZtdC0+aCA9IDA7CisKKyAgICAvKiBTZW5kIHVwZGF0ZSB0byB0aGUgZGV2aWNlLiAqLworICAgIHNka2N0bF9kaXJlY3RfcGFja2V0X3NlbmQobXRzcC0+ZmJfcGFja2V0LCBtc2csIGNiLCBjYl9vcGFxdWUpOworCisgICAgVCgiTXVsdGktdG91Y2g6IFNlbnQgJWQgYnl0ZXMgaW4gZnJhbWVidWZmZXIgdXBkYXRlLiBDb21wcmVzc2lvbiByYXRlIGlzICUuMmYlJSIsCisgICAgICB1cGRhdGVfc2l6ZSwgY29tcF9yYXRlKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtcG9ydC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MDNkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbXVsdGl0b3VjaC1wb3J0LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvZGlzcGxheV9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdXNlcl9ldmVudF9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2RrLWNvbnRyb2xsZXItc29ja2V0LmgiCisKKy8qCisgKiBFbmNhcHN1bGF0ZXMgZXhjaGFuZ2UgcHJvdG9jb2wgYmV0d2VlbiB0aGUgbXVsdGktdG91Y2ggc2NyZWVuIGVtdWxhdG9yLCBhbmQgYW4KKyAqIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gYW4gQW5kcm9pZCBkZXZpY2UgdGhhdCBwcm92aWRlcyB0b3VjaCBldmVudHMsIGFuZCBpcworICogY29ubmVjdGVkIHRvIHRoZSBob3N0IHZpYSBVU0IuCisgKi8KKworLyoKKyAqIENvZGVzIHRoYXQgZGVmaW5lIHRyYW5zbWl0dGVkIGZyYW1lYnVmZmVyIGZvcm1hdDoKKyAqCisgKiBOT1RFOiBBcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlIHNpZGUgZGVwZW5kcyBvbiB0aGVzZSB2YWx1ZXMuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGhlcmUgbXVzdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGFwcCB0b28uIEFwcGxpY2F0aW9uIGxvY2F0aW9uIGlzIGF0CisgKiAnc2RrL2FwcHMvU2RrQ29udHJvbGxlci9TZGtDb250cm9sbGVyTXVsdGl0b3VjaCcgcm9vdC4KKyAqLworCisvKiBGcmFtZWJ1ZmZlciBpcyB0cmFuc21pdHRlZCBhcyBKUEVHLiAqLworI2RlZmluZSBNVEZCX0pQRUcgICAgICAgMQorLyogRnJhbWVidWZmZXIgaXMgdHJhbnNtaXR0ZWQgYXMgcmF3IFJHQjU2NSBiaXRtYXAuICovCisjZGVmaW5lIE1URkJfUkdCNTY1ICAgICAyCisvKiBGcmFtZWJ1ZmZlciBpcyB0cmFuc21pdHRlZCBhcyByYXcgUkdCODg4IGJpdG1hcC4gKi8KKyNkZWZpbmUgTVRGQl9SR0I4ODggICAgIDMKKworLyogRnJhbWVidWZmZXIgdXBkYXRlIGRlc2NyaXB0b3IuCisgKiBUaGlzIGRlc2NyaXB0b3IgaXMgdXNlZCB0byBjb2xsZWN0IHByb3BlcnRpZXMgb2YgdGhlIHVwZGF0ZWQgZnJhbWVidWZmZXIKKyAqIHJlZ2lvbi4gVGhpcyBkZXNjcmlwdG9yIGlzIGFsc28gc2VudCB0byB0aGUgTVQgZW11bGF0aW9uIGFwcGxpY2F0aW9uIG9uIHRoZQorICogZGV2aWNlLCBzbyBpdCBjYW4gcHJvcGVybHkgcmVkcmF3IGl0cyBzY3JlZW4uCisgKgorICogTk9URTogQXBwbGljYXRpb24gb24gdGhlIGRldmljZSBzaWRlIGRlcGVuZHMgb24gdGhhdCBzdHJ1Y3R1cmUuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGhlcmUgbXVzdCBiZSByZWZsZWN0ZWQgaW4gdGhlIGFwcCB0b28uIEFwcGxpY2F0aW9uIGxvY2F0aW9uIGlzIGF0CisgKiAnc2RrL2FwcHMvU2RrQ29udHJvbGxlci9TZGtDb250cm9sbGVyTXVsdGl0b3VjaCcgcm9vdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTVRGcmFtZUhlYWRlciB7CisgICAgLyogU2l6ZSBvZiB0aGUgaGVhZGVyLiBNdXN0IGJlIGFsd2F5cyBzaXplb2YoTVRGcmFtZUhlYWRlcikuICovCisgICAgaW50ICAgICAgICAgaGVhZGVyX3NpemU7CisgICAgLyogRGlzcGxheSB3aWR0aCAqLworICAgIGludCAgICAgICAgIGRpc3Bfd2lkdGg7CisgICAgLyogRGlzcGxheSBoZWlnaHQgKi8KKyAgICBpbnQgICAgICAgICBkaXNwX2hlaWdodDsKKyAgICAvKiB4LCB5LCB3LCBhbmQgaCBkZWZpbmUgZnJhbWVidWZmZXIgcmVnaW9uIHRoYXQgaGFzIGJlZW4gdXBkYXRlZC4gKi8KKyAgICBpbnQgICAgICAgICB4OworICAgIGludCAgICAgICAgIHk7CisgICAgaW50ICAgICAgICAgdzsKKyAgICBpbnQgICAgICAgICBoOworICAgIC8qIEJ5dGVzIHBlciBsaW5lIGluIHRoZSBmcmFtZWJ1ZmVyLiAqLworICAgIGludCAgICAgICAgIGJwbDsKKyAgICAvKiBCeXRlcyBwZXIgcGl4ZWwgaW4gdGhlIGZyYW1lYnVmZXIuICovCisgICAgaW50ICAgICAgICAgYnBwOworICAgIC8qIERlZmluZXMgZm9ybWF0IGluIHdoaWNoIGZyYW1lYnVmZmVyIGlzIHRyYW5zbWl0dGVkIHRvIHRoZSBkZXZpY2UuICovCisgICAgaW50ICAgICAgICAgZm9ybWF0OworfSBNVEZyYW1lSGVhZGVyOworCisvKiBEZWNsYXJlcyBtdWx0aS10b3VjaCBwb3J0IGRlc2NyaXB0b3IuICovCit0eXBlZGVmIHN0cnVjdCBBbmRyb2lkTVRTUG9ydCBBbmRyb2lkTVRTUG9ydDsKKworLyogQ3JlYXRlcyBtdWx0aS10b3VjaCBwb3J0LCBhbmQgY29ubmVjdHMgaXQgdG8gdGhlIGRldmljZS4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIEFuIG9wYXF1ZSBwb2ludGVyIHRoYXQgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmVzLgorICogIHVzZXJfZXZlbnRfYWdlbnQsIGRpc3BsYXlfYWdlbnQgLSBpbnRlcmZhY2VzIHRvIHRoZSBRZW11IGRpc3BsYXkgYW5kCisgKiAgICAgIHVzZXIgZXZlbnQgcGlwaW5nIHRvIHRoZSBWTQorICogUmV0dXJuOgorICogIEluaXRpYWxpemVkIGRldmljZSBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gSWYgZmFpbHVyZSBpcworICogIHJldHVybmVkIGZyb20gdGhpcyByb3V0aW5lLCAnZXJybm8nIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciBmYWlsdXJlLiBJZiB0aGlzCisgKiAgcm91dGluZSBzdWNjZXNzZWRzLCBhIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgd2l0aCB0aGUgc2Vuc29yIHJlYWRpbmcKKyAqICBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlLgorICovCitleHRlcm4gQW5kcm9pZE1UU1BvcnQqIG10c19wb3J0X2NyZWF0ZSgKKyAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICBjb25zdCBRQW5kcm9pZFVzZXJFdmVudEFnZW50KiB1c2VyX2V2ZW50X2FnZW50LAorICAgICAgICBjb25zdCBRQW5kcm9pZERpc3BsYXlBZ2VudCogZGlzcGxheV9hZ2VudCk7CisKKy8qIERpc2Nvbm5lY3RzIGZyb20gdGhlIG11bHRpLXRvdWNoIHBvcnQsIGFuZCBkZXN0cm95cyB0aGUgZGVzY3JpcHRvci4gKi8KK2V4dGVybiB2b2lkIG10c19wb3J0X2Rlc3Ryb3koQW5kcm9pZE1UU1BvcnQqIGFtdHApOworCisvKiBTZW5kcyBmcmFtZWJ1ZmZlciB1cGRhdGUgdG8gdGhlIG11bHRpLXRvdWNoIGVtdWxhdGlvbiBhcHBsaWNhdGlvbiwgcnVubmluZyBvbgorICogdGhlIGFuZHJvaWQgZGV2aWNlLgorICogUGFyYW06CisgKiAgbXRzcCAtIEFuZHJvaWQgbXVsdGktdG91Y2ggcG9ydCBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIG10c19wb3J0X2NyZWF0ZS4KKyAqICBmbXQgLSBGcmFtZWJ1ZmZlciB1cGRhdGUgZGVzY3JpcHRvci4KKyAqICBmYiAtIEJlZ2lubmluZyBvZiB0aGUgZnJhbWVidWZmZXIuCisgKiAgY2IgLSBDYWxsYmFjayB0byBpbnZva2Ugd2hlbiB1cGRhdGUgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIE1ULWVtdWxhdGluZworICogICAgICBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlLgorICogIGNiX29wYXF1ZSAtIEFuIG9wYXF1ZSBwYXJhbWV0ZXIgdG8gcGFzcyBiYWNrIHRvIHRoZSAnY2InIGNhbGxiYWNrLgorICogIHlkaXIgLSBJbmRpY2F0ZXMgZGlyZWN0aW9uIGluIHdoaWNoIGxpbmVzIGFyZSBhcnJhbmdlZCBpbiB0aGUgZnJhbWVidWZmZXIuIElmCisgKiAgICAgIHRoaXMgdmFsdWUgaXMgbmVnYXRpdmUsIGxpbmVzIGFyZSBhcnJhbmdlZCBpbiBib3R0b20tdXAgZm9ybWF0IChpLmUuIHRoZQorICogICAgICBib3R0b20gbGluZSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIpLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2Vzcywgb3IgIT0gMCBvbiBmYWlsdXJlLgorICovCitleHRlcm4gaW50IG10c19wb3J0X3NlbmRfZnJhbWUoQW5kcm9pZE1UU1BvcnQqIG10c3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRGcmFtZUhlYWRlciogZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9kaXJlY3RfY2IgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2Jfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZGlyKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tdWx0aXRvdWNoLXNjcmVlbi5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtc2NyZWVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdmMmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9tdWx0aXRvdWNoLXNjcmVlbi5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvbXVsdGl0b3VjaC1zY3JlZW4uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIiAgLyogZm9yIGFuZHJvaWRfaHcgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2h3LWV2ZW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9jaGFybWFwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWlzYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgIEUoLi4uKSAgICBkZXJyb3IoX19WQV9BUkdTX18pCisjZGVmaW5lICBXKC4uLikgICAgZHdhcm5pbmcoX19WQV9BUkdTX18pCisjZGVmaW5lICBEKC4uLikgICAgVkVSQk9TRV9QUklOVChtdHNjcmVlbixfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKG10c2NyZWVuKQorCisjZGVmaW5lIFRSQUNFX09OICAgIDEKKworI2lmIFRSQUNFX09OCisjZGVmaW5lICBUKC4uLikgICAgVkVSQk9TRV9QUklOVChtdHNjcmVlbixfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBUKC4uLikKKyNlbmRpZgorCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHBvaW50ZXJzLCBzdXBwb3J0ZWQgYnkgbXVsdGktdG91Y2ggZW11bGF0aW9uLiAqLworI2RlZmluZSBNVFNfUE9JTlRFUlNfTlVNICAgIDEwCisvKiBTaWduYWxzIHRoYXQgcG9pbnRlciBpcyBub3QgdHJhY2tlZCAob3IgaXMgInVwIikuICovCisjZGVmaW5lIE1UU19QT0lOVEVSX1VQICAgICAgLTEKKy8qIFNwZWNpYWwgdHJhY2tpbmcgSUQgZm9yIGEgbW91c2UgcG9pbnRlci4gKi8KKyNkZWZpbmUgTVRTX1BPSU5URVJfTU9VU0UgICAtMgorCisvKiBEZXNjcmliZXMgc3RhdGUgb2YgYSBtdWx0aS10b3VjaCBwb2ludGVyICAqLwordHlwZWRlZiBzdHJ1Y3QgTVRTUG9pbnRlclN0YXRlIHsKKyAgICAvKiBUcmFja2luZyBJRCBhc3NpZ25lZCB0byB0aGUgcG9pbnRlciBieSBhbiBhcHAgZW11bGF0aW5nIG11bHRpLXRvdWNoLiAqLworICAgIGludCB0cmFja2luZ19pZDsKKyAgICAvKiBYIC0gY29vcmRpbmF0ZSBvZiB0aGUgdHJhY2tlZCBwb2ludGVyLiAqLworICAgIGludCB4OworICAgIC8qIFkgLSBjb29yZGluYXRlIG9mIHRoZSB0cmFja2VkIHBvaW50ZXIuICovCisgICAgaW50IHk7CisgICAgLyogQ3VycmVudCBwcmVzc3VyZSB2YWx1ZS4gKi8KKyAgICBpbnQgcHJlc3N1cmU7Cit9IE1UU1BvaW50ZXJTdGF0ZTsKKworLyogRGVzY3JpYmVzIHN0YXRlIG9mIGFuIGVtdWxhdGVkIG11bHRpLXRvdWNoIHNjcmVlbi4gKi8KK3R5cGVkZWYgc3RydWN0IE1UU1N0YXRlIHsKKyAgICAvKiBBbmRyb2lkIGRpc3BsYXkgaW50ZXJmYWNlICovCisgICAgUUFuZHJvaWREaXNwbGF5QWdlbnQgZGlzcGxheV9hZ2VudDsKKyAgICAvKiBNdWx0aS10b3VjaCBwb3J0IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLiAqLworICAgIEFuZHJvaWRNVFNQb3J0KiBtdHNwOworICAgIC8qIE51bWJlciBvZiB0cmFja2VkIHBvaW50ZXJzLiAqLworICAgIGludCAgICAgICAgICAgICB0cmFja2VkX3B0cl9udW07CisgICAgLyogSW5kZXggaW4gdGhlICd0cmFja2VkX3BvaW50ZXJzJyBhcnJheSBvZiB0aGUgbGFzdCBwb2ludGVyIGZvciB3aGljaAorICAgICAqIEFCU19NVF9TTE9UIHdhcyBzZW50LiAtMSBpbmRpY2F0ZXMgdGhhdCBubyBzbG90IHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlCisgICAgICogeWV0LiAqLworICAgIGludCAgICAgICAgICAgICBjdXJyZW50X3Nsb3Q7CisgICAgLyogQWNjdW11bGF0b3IgZm9yIEFCU19UT1VDSF9NQUpPUiB2YWx1ZS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgdG91Y2hfbWFqb3I7CisgICAgLyogQXJyYXkgb2YgbXVsdGktdG91Y2ggcG9pbnRlcnMuICovCisgICAgTVRTUG9pbnRlclN0YXRlIHRyYWNrZWRfcG9pbnRlcnNbTVRTX1BPSU5URVJTX05VTV07CisgICAgLyogSGVhZGVyIGNvbGxlY3RpbmcgZnJhbWVidWZmZXIgaW5mb3JtYXRpb24gYW5kIHVwZGF0ZXMuICovCisgICAgTVRGcmFtZUhlYWRlciAgIGZiX2hlYWRlcjsKKyAgICAvKiBCb29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgZnJhbWVidWZmZXIgdXBkYXRlcyBhcmUgY3VycmVudGx5IGJlaW5nCisgICAgICogdHJhbnNmZXJyZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gdGhlIGRldmljZS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgZmJfdHJhbnNmZXJfaW5fcHJvZ3Jlc3M7CisgICAgLyogSW5kaWNhdGVzIGRpcmVjdGlvbiBpbiB3aGljaCBsaW5lcyBhcmUgYXJyYW5nZWQgaW4gdGhlIGZyYW1lYnVmZmVyLiBJZgorICAgICAqIHRoaXMgdmFsdWUgaXMgbmVnYXRpdmUsIGxpbmVzIGFyZSBhcnJhbmdlZCBpbiBib3R0b20tdXAgZm9ybWF0IChpLmUuIHRoZQorICAgICAqIGJvdHRvbSBsaW5lIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcikuICovCisgICAgaW50ICAgICAgICAgICAgIHlkaXI7CisgICAgLyogQ3VycmVudCBmcmFtZWJ1ZmZlciBwb2ludGVyLiAqLworICAgIHVpbnQ4X3QqICAgICAgICBjdXJyZW50X2ZiOworfSBNVFNTdGF0ZTsKKworLyogRGVmYXVsdCBtdWx0aS10b3VjaCBzY3JlZW4gZGVzY3JpcHRvciAqLworc3RhdGljIE1UU1N0YXRlIF9NVFNTdGF0ZSA9IHsgfTsKKworLyogT3VyIHZlcnkgb3duIHN0YXNoIG9mIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHRoYXQgaGFuZGxlcyB1c2VyIGV2ZW50cy4gKi8KK3N0YXRpYyBjb25zdCBRQW5kcm9pZFVzZXJFdmVudEFnZW50KiBfVXNlckV2ZW50QWdlbnQ7CisKKy8qIFB1c2hlcyBldmVudCB0byB0aGUgZXZlbnQgZGV2aWNlLiAqLworc3RhdGljIHZvaWQKK19wdXNoX2V2ZW50KGludCB0eXBlLCBpbnQgY29kZSwgaW50IHZhbHVlKQoreworICAgIF9Vc2VyRXZlbnRBZ2VudC0+c2VuZEdlbmVyaWNFdmVudCh0eXBlLCBjb2RlLCB2YWx1ZSk7Cit9CisKKy8qIEdldHMgYW4gaW5kZXggaW4gdGhlIE1UUydzIHRyYWNraW5nIHBvaW50ZXJzIGFycmF5IE1UUyBmb3IgdGhlIGdpdmVuCisgKiB0cmFja2luZyBpZC4KKyAqIFJldHVybjoKKyAqICBJbmRleCBvZiBhIG1hdGNoaW5nIGVudHJ5IGluIHRoZSBNVFMncyB0cmFja2luZyBwb2ludGVycyBhcnJheSwgb3IgLTEgaWYKKyAqICBtYXRjaGluZyBlbnRyeSB3YXMgbm90IGZvdW5kLgorICovCitzdGF0aWMgaW50CitfbXRzc3RhdGVfZ2V0X3BvaW50ZXJfaW5kZXgoY29uc3QgTVRTU3RhdGUqIG10c19zdGF0ZSwgaW50IHRyYWNraW5nX2lkKQoreworICAgIGludCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNVFNfUE9JTlRFUlNfTlVNOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtdHNfc3RhdGUtPnRyYWNrZWRfcG9pbnRlcnNbaW5kZXhdLnRyYWNraW5nX2lkID09IHRyYWNraW5nX2lkKSB7CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKiBHZXRzIGFuIGluZGV4IG9mIHRoZSBmaXJzdCB1bnRyYWNraW5nIHBvaW50ZXIgaW4gdGhlIE1UUydzIHRyYWNraW5nIHBvaW50ZXJzCisgKiBhcnJheS4KKyAqIFJldHVybjoKKyAqICBBbiBpbmRleCBvZiB0aGUgZmlyc3QgdW50cmFja2luZyBwb2ludGVyLCBvciAtMSBpZiBhbGwgcG9pbnRlcnMgYXJlIHRyYWNrZWQuCisgKi8KK3N0YXRpYyBpbnQKK19tdHNzdGF0ZV9nZXRfYXZhaWxhYmxlX3BvaW50ZXJfaW5kZXgoY29uc3QgTVRTU3RhdGUqIG10c19zdGF0ZSkKK3sKKyAgICByZXR1cm4gX210c3N0YXRlX2dldF9wb2ludGVyX2luZGV4KG10c19zdGF0ZSwgTVRTX1BPSU5URVJfVVApOworfQorCisvKiBIYW5kbGVzIGEgInBvaW50ZXIgZG93biIgZXZlbnQKKyAqIFBhcmFtOgorICogIG10c19zdGF0ZSAtIE1UUyBzdGF0ZSBkZXNjcmlwdG9yLgorICogIHRyYWNraW5nX2lkIC0gVHJhY2tpbmcgSUQgb2YgdGhlICJkb3duZWQiIHBvaW50ZXIuCisgKiAgeCwgeSAtICJEb3duZWQiIHBvaW50ZXIgY29vcmRpbmF0ZXMsCisgKiAgcHJlc3N1cmUgLSBQcmVzc3VyZSB2YWx1ZSBmb3IgdGhlIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitfbXRzX3BvaW50ZXJfZG93bihNVFNTdGF0ZSogbXRzX3N0YXRlLCBpbnQgdHJhY2tpbmdfaWQsIGludCB4LCBpbnQgeSwgaW50IHByZXNzdXJlKQoreworICAgIC8qIEdldCBmaXJzdCBhdmFpbGFibGUgc2xvdCBmb3IgdGhlIG5ldyBwb2ludGVyLiAqLworICAgIGNvbnN0IGludCBzbG90X2luZGV4ID0gX210c3N0YXRlX2dldF9hdmFpbGFibGVfcG9pbnRlcl9pbmRleChtdHNfc3RhdGUpOworCisgICAgLyogTWFrZSBzdXJlIHRoZXJlIGlzIGEgcGxhY2UgZm9yIHRoZSBwb2ludGVyLiAqLworICAgIGlmIChzbG90X2luZGV4ID49IDApIHsKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBwb2ludGVyJ3MgZW50cnkuICovCisgICAgICAgIG10c19zdGF0ZS0+dHJhY2tlZF9wdHJfbnVtKys7CisgICAgICAgIG10c19zdGF0ZS0+dHJhY2tlZF9wb2ludGVyc1tzbG90X2luZGV4XS50cmFja2luZ19pZCA9IHRyYWNraW5nX2lkOworICAgICAgICBtdHNfc3RhdGUtPnRyYWNrZWRfcG9pbnRlcnNbc2xvdF9pbmRleF0ueCA9IHg7CisgICAgICAgIG10c19zdGF0ZS0+dHJhY2tlZF9wb2ludGVyc1tzbG90X2luZGV4XS55ID0geTsKKyAgICAgICAgbXRzX3N0YXRlLT50cmFja2VkX3BvaW50ZXJzW3Nsb3RfaW5kZXhdLnByZXNzdXJlID0gcHJlc3N1cmU7CisKKyAgICAgICAgLyogU2VuZCBldmVudHMgaW5kaWNhdGluZyBhICJwb2ludGVyIGRvd24iIHRvIHRoZSBFdmVudEh1YiAqLworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBjb3JyZWN0IHNsb3QgaXMgc2VsZWN0ZWQuICovCisgICAgICAgIGlmIChzbG90X2luZGV4ICE9IG10c19zdGF0ZS0+Y3VycmVudF9zbG90KSB7CisgICAgICAgICAgICBfcHVzaF9ldmVudChFVl9BQlMsIEFCU19NVF9TTE9ULCBzbG90X2luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBfcHVzaF9ldmVudChFVl9BQlMsIEFCU19NVF9UUkFDS0lOR19JRCwgc2xvdF9pbmRleCk7CisgICAgICAgIF9wdXNoX2V2ZW50KEVWX0FCUywgQUJTX01UX1RPVUNIX01BSk9SLCArK210c19zdGF0ZS0+dG91Y2hfbWFqb3IpOworICAgICAgICBfcHVzaF9ldmVudChFVl9BQlMsIEFCU19NVF9QUkVTU1VSRSwgcHJlc3N1cmUpOworICAgICAgICBfcHVzaF9ldmVudChFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9YLCB4KTsKKyAgICAgICAgX3B1c2hfZXZlbnQoRVZfQUJTLCBBQlNfTVRfUE9TSVRJT05fWSwgeSk7CisgICAgICAgIG10c19zdGF0ZS0+Y3VycmVudF9zbG90ID0gc2xvdF9pbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBEKCJNVFMgcG9pbnRlciBjb3VudCBpcyBleGNlZWRlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworLyogSGFuZGxlcyBhICJwb2ludGVyIHVwIiBldmVudAorICogUGFyYW06CisgKiAgbXRzX3N0YXRlIC0gTVRTIHN0YXRlIGRlc2NyaXB0b3IuCisgKiAgc2xvdF9pbmRleCAtIFBvaW50ZXIncyBpbmRleCBpbiB0aGUgTVRTJ3MgYXJyYXkgb2YgdHJhY2tlZCBwb2ludGVycy4KKyAqLworc3RhdGljIHZvaWQKK19tdHNfcG9pbnRlcl91cChNVFNTdGF0ZSogbXRzX3N0YXRlLCBpbnQgc2xvdF9pbmRleCkKK3sKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCBjb3JyZWN0IHNsb3QgaXMgc2VsZWN0ZWQuICovCisgICAgaWYgKHNsb3RfaW5kZXggIT0gbXRzX3N0YXRlLT5jdXJyZW50X3Nsb3QpIHsKKyAgICAgICAgX3B1c2hfZXZlbnQoRVZfQUJTLCBBQlNfTVRfU0xPVCwgc2xvdF9pbmRleCk7CisgICAgfQorCisgICAgLyogU2VuZCBldmVudCBpbmRpY2F0aW5nICJwb2ludGVyIHVwIiB0byB0aGUgRXZlbnRIdWIuICovCisgICAgX3B1c2hfZXZlbnQoRVZfQUJTLCBBQlNfTVRfUFJFU1NVUkUsIDApOworCisgICAgX3B1c2hfZXZlbnQoRVZfQUJTLCBBQlNfTVRfVFJBQ0tJTkdfSUQsIC0xKTsKKworICAgIC8qIFVwZGF0ZSBNVFMgZGVzY3JpcHRvciwgcmVtb3ZpbmcgdGhlIHRyYWNrZWQgcG9pbnRlci4gKi8KKyAgICBtdHNfc3RhdGUtPnRyYWNrZWRfcG9pbnRlcnNbc2xvdF9pbmRleF0udHJhY2tpbmdfaWQgPSBNVFNfUE9JTlRFUl9VUDsKKyAgICBtdHNfc3RhdGUtPnRyYWNrZWRfcG9pbnRlcnNbc2xvdF9pbmRleF0ueCA9IDA7CisgICAgbXRzX3N0YXRlLT50cmFja2VkX3BvaW50ZXJzW3Nsb3RfaW5kZXhdLnkgPSAwOworICAgIG10c19zdGF0ZS0+dHJhY2tlZF9wb2ludGVyc1tzbG90X2luZGV4XS5wcmVzc3VyZSA9IDA7CisKKyAgICAvKiBTaW5jZSBjdXJyZW50IHNsb3QgaXMgbm8gbG9uZ2VyIHRyYWNrZWQsIG1ha2Ugc3VyZSB3ZSB3aWxsIGRvIGEgInNlbGVjdCIKKyAgICAgKiBuZXh0IHRpbWUgd2Ugc2VuZCBldmVudHMgdG8gdGhlIEV2ZW50SHViLiAqLworICAgIG10c19zdGF0ZS0+Y3VycmVudF9zbG90ID0gLTE7CisgICAgbXRzX3N0YXRlLT50cmFja2VkX3B0cl9udW0tLTsKKyAgICBhc3NlcnQobXRzX3N0YXRlLT50cmFja2VkX3B0cl9udW0gPj0gMCk7Cit9CisKKy8qIEhhbmRsZXMgYSAicG9pbnRlciBtb3ZlIiBldmVudAorICogUGFyYW06CisgKiAgbXRzX3N0YXRlIC0gTVRTIHN0YXRlIGRlc2NyaXB0b3IuCisgKiAgc2xvdF9pbmRleCAtIFBvaW50ZXIncyBpbmRleCBpbiB0aGUgTVRTJ3MgYXJyYXkgb2YgdHJhY2tlZCBwb2ludGVycy4KKyAqICB4LCB5IC0gTmV3IHBvaW50ZXIgY29vcmRpbmF0ZXMsCisgKiAgcHJlc3N1cmUgLSBQcmVzc3VyZSB2YWx1ZSBmb3IgdGhlIHBvaW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitfbXRzX3BvaW50ZXJfbW92ZShNVFNTdGF0ZSogbXRzX3N0YXRlLCBpbnQgc2xvdF9pbmRleCwgaW50IHgsIGludCB5LCBpbnQgcHJlc3N1cmUpCit7CisgICAgTVRTUG9pbnRlclN0YXRlKiBwdHJfc3RhdGUgPSAmbXRzX3N0YXRlLT50cmFja2VkX3BvaW50ZXJzW3Nsb3RfaW5kZXhdOworCisgICAgLyogTWFrZSBzdXJlIHRoYXQgY29vcmRpbmF0ZXMgaGF2ZSByZWFsbHkgY2hhbmdlZC4gKi8KKyAgICBpZiAocHRyX3N0YXRlLT54ID09IHggJiYgcHRyX3N0YXRlLT55ID09IHkpIHsKKyAgICAgICAgLyogQ29vcmRpbmF0ZXMgZGlkbid0IGNoYW5nZS4gQmFpbCBvdXQuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgc2xvdCBpcyBzZWxlY3RlZC4gKi8KKyAgICBpZiAoc2xvdF9pbmRleCAhPSBtdHNfc3RhdGUtPmN1cnJlbnRfc2xvdCkgeworICAgICAgICBfcHVzaF9ldmVudChFVl9BQlMsIEFCU19NVF9TTE9ULCBzbG90X2luZGV4KTsKKyAgICAgICAgbXRzX3N0YXRlLT5jdXJyZW50X3Nsb3QgPSBzbG90X2luZGV4OworICAgIH0KKworICAgIC8qIFB1c2ggdGhlIGNoYW5nZXMgZG93bi4gKi8KKyAgICBpZiAocHRyX3N0YXRlLT5wcmVzc3VyZSAhPSBwcmVzc3VyZSAmJiBwcmVzc3VyZSAhPSAwKSB7CisgICAgICAgIF9wdXNoX2V2ZW50KEVWX0FCUywgQUJTX01UX1BSRVNTVVJFLCBwcmVzc3VyZSk7CisgICAgICAgIHB0cl9zdGF0ZS0+cHJlc3N1cmUgPSBwcmVzc3VyZTsKKyAgICB9CisgICAgaWYgKHB0cl9zdGF0ZS0+eCAhPSB4KSB7CisgICAgICAgIF9wdXNoX2V2ZW50KEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1gsIHgpOworICAgICAgICBwdHJfc3RhdGUtPnggPSB4OworICAgIH0KKyAgICBpZiAocHRyX3N0YXRlLT55ICE9IHkpIHsKKyAgICAgICAgX3B1c2hfZXZlbnQoRVZfQUJTLCBBQlNfTVRfUE9TSVRJT05fWSwgeSk7CisgICAgICAgIHB0cl9zdGF0ZS0+eSA9IHk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICBNdWx0aS10b3VjaCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNdWx0aS10b3VjaCBzZXJ2aWNlIGluaXRpYWxpemF0aW9uIGZsYWcuICovCitzdGF0aWMgaW50IF9pc19tdF9pbml0aWFsaXplZCA9IDA7CisKKy8qIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIGZyYW1lYnVmZmVyIHVwZGF0ZSBoYXMgYmVlbiB0cmFuc21pdHRlZCB0byB0aGUKKyAqIGRldmljZS4gKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25fZmJfc2VudCh2b2lkKiBvcGFxdWUsIFNES0N0bERpcmVjdFBhY2tldCogcGFja2V0LCBBc3luY0lPU3RhdGUgc3RhdHVzKQoreworICAgIE1UU1N0YXRlKiBjb25zdCBtdHNfc3RhdGUgPSAoTVRTU3RhdGUqKW9wYXF1ZTsKKworICAgIGlmIChzdGF0dXMgPT0gQVNJT19TVEFURV9TVUNDRUVERUQpIHsKKyAgICAgICAgLyogTGV0cyBzZWUgaWYgd2UgaGF2ZSBhY2N1bXVsYXRlZCBtb3JlIGNoYW5nZXMgd2hpbGUgdHJhbnNtaXNzaW9uIGhhcyBiZWVuCisgICAgICAgICAqIGluIHByb2dyZXNzLiAqLworICAgICAgICBpZiAobXRzX3N0YXRlLT5mYl9oZWFkZXIudyAmJiBtdHNfc3RhdGUtPmZiX2hlYWRlci5oICYmCisgICAgICAgICAgICAhbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcykgeworICAgICAgICAgICAgbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICAgICAgICAvKiBTZW5kIGFjY3VtdWxhdGVkIHVwZGF0ZXMuICovCisgICAgICAgICAgICBpZiAobXRzX3BvcnRfc2VuZF9mcmFtZShtdHNfc3RhdGUtPm10c3AsICZtdHNfc3RhdGUtPmZiX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10c19zdGF0ZS0+Y3VycmVudF9mYiwgX29uX2ZiX3NlbnQsIG10c19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10c19zdGF0ZS0+eWRpcikpIHsKKyAgICAgICAgICAgICAgICBtdHNfc3RhdGUtPmZiX3RyYW5zZmVyX2luX3Byb2dyZXNzID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCisvKiBDb21tb24gaGFuZGxlciBmb3IgZnJhbWVidWZmZXIgdXBkYXRlcyBpbnZva2VkIGJ5IGJvdGgsIHNvZnR3YXJlLCBhbmQgT3BlbkdMRVMKKyAqIHJlbmRlcmVycy4KKyAqLworc3RhdGljIHZvaWQKK19tdF9mYl9jb21tb25fdXBkYXRlKE1UU1N0YXRlKiBtdHNfc3RhdGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGlmIChtdHNfc3RhdGUtPmZiX2hlYWRlci53ID09IDAgJiYgbXRzX3N0YXRlLT5mYl9oZWFkZXIuaCA9PSAwKSB7CisgICAgICAgIC8qIEZpcnN0IHVwZGF0ZSBhZnRlciBwcmV2aW91cyBvbmUgaGFzIGJlZW4gdHJhbnNtaXR0ZWQgdG8gdGhlIGRldmljZS4gKi8KKyAgICAgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIueCA9IHg7CisgICAgICAgIG10c19zdGF0ZS0+ZmJfaGVhZGVyLnkgPSB5OworICAgICAgICBtdHNfc3RhdGUtPmZiX2hlYWRlci53ID0gdzsKKyAgICAgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIuaCA9IGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQWNjdW11bGF0ZSBmcmFtZWJ1ZmZlciBjaGFuZ2VzIGluIHRoZSBoZWFkZXIuCisgICAgICAgICAqLworCisgICAgICAgIC8qICJyaWdodCIgYW5kICJib3R0b20iIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50IHVwZGF0ZS4gKi8KKyAgICAgICAgaW50IHJpZ2h0ID0gbXRzX3N0YXRlLT5mYl9oZWFkZXIueCArIG10c19zdGF0ZS0+ZmJfaGVhZGVyLnc7CisgICAgICAgIGludCBib3R0b20gPSBtdHNfc3RhdGUtPmZiX2hlYWRlci55ICsgbXRzX3N0YXRlLT5mYl9oZWFkZXIuaDsKKworICAgICAgICAvKiAicmlnaHQiIGFuZCAiYm90dG9tIiBjb29yZGluYXRlcyBvZiB0aGUgbmV3IHVwZGF0ZS4gKi8KKyAgICAgICAgY29uc3QgaW50IG5ld19yaWdodCA9IHggKyB3OworICAgICAgICBjb25zdCBpbnQgbmV3X2JvdHRvbSA9IHkgKyBoOworCisgICAgICAgIC8qIEFjY3VtdWxhdGUgY2hhbmdlZCByZWN0YW5nbGUgY29vcmRpbmF0ZXMgaW4gdGhlIGhlYWRlci4gKi8KKyAgICAgICAgaWYgKG10c19zdGF0ZS0+ZmJfaGVhZGVyLnggPiB4KSB7CisgICAgICAgICAgICBtdHNfc3RhdGUtPmZiX2hlYWRlci54ID0geDsKKyAgICAgICAgfQorICAgICAgICBpZiAobXRzX3N0YXRlLT5mYl9oZWFkZXIueSA+IHkpIHsKKyAgICAgICAgICAgIG10c19zdGF0ZS0+ZmJfaGVhZGVyLnkgPSB5OworICAgICAgICB9CisgICAgICAgIGlmIChyaWdodCA8IG5ld19yaWdodCkgeworICAgICAgICAgICAgcmlnaHQgPSBuZXdfcmlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvdHRvbSA8IG5ld19ib3R0b20pIHsKKyAgICAgICAgICAgIGJvdHRvbSA9IG5ld19ib3R0b207CisgICAgICAgIH0KKyAgICAgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIudyA9IHJpZ2h0IC0gbXRzX3N0YXRlLT5mYl9oZWFkZXIueDsKKyAgICAgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIuaCA9IGJvdHRvbSAtIG10c19zdGF0ZS0+ZmJfaGVhZGVyLnk7CisgICAgfQorCisgICAgLyogV2Ugd2lsbCBzZW5kIHVwZGF0ZXMgdG8gdGhlIGRldmljZSBvbmx5IGFmdGVyIHByZXZpb3VzIHRyYW5zbWlzc2lvbiBpcworICAgICAqIGNvbXBsZXRlZC4gKi8KKyAgICBpZiAoIW10c19zdGF0ZS0+ZmJfdHJhbnNmZXJfaW5fcHJvZ3Jlc3MpIHsKKyAgICAgICAgbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICAgIGlmIChtdHNfcG9ydF9zZW5kX2ZyYW1lKG10c19zdGF0ZS0+bXRzcCwgJm10c19zdGF0ZS0+ZmJfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdHNfc3RhdGUtPmN1cnJlbnRfZmIsIF9vbl9mYl9zZW50LCBtdHNfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10c19zdGF0ZS0+eWRpcikpIHsKKyAgICAgICAgICAgIG10c19zdGF0ZS0+ZmJfdHJhbnNmZXJfaW5fcHJvZ3Jlc3MgPSAwOworICAgICAgICB9CisgICAgfQorfQorCisvKiBBIGNhbGxiYWNrIGludm9rZWQgb24gZnJhbWVidWZmZXIgdXBkYXRlcyBieSBzb2Z0d2FyZSByZW5kZXJlci4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIE1UU1N0YXRlIGluc3RhbmNlLgorICogIHgsIHksIHcsIGggLSBEZWZpbmVzIGFuIHVwZGF0ZWQgcmVjdGFuZ2xlIGluc2lkZSB0aGUgZnJhbWVidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitfbXRfZmJfdXBkYXRlKHZvaWQqIG9wYXF1ZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgTVRTU3RhdGUqIGNvbnN0IG10c19zdGF0ZSA9IChNVFNTdGF0ZSopb3BhcXVlOworCisgICAgVCgiTXVsdGktdG91Y2g6IFNvZnR3YXJlIHJlbmRlcmVyIGZyYW1lYnVmZmVyIHVwZGF0ZTogJWQ6JWQgLT4gJWR4JWQiLAorICAgICAgeCwgeSwgdywgaCk7CisKKyAgICAvKiBUT0RPOiBGb3Igc29md2FyZSByZW5kZXJlciBnZW5lcmFsIGZyYW1lYnVmZmVyIHByb3BlcnRpZXMgY2FuIGNoYW5nZSBvbgorICAgICAqIHRoZSBmbHkuIEZpbmQgYSBjYWxsYmFjayB0aGF0IGNhbiBjYXRjaCB0aGF0LiBGb3Igbm93LCBqdXN0IGNvcHkgRkIKKyAgICAgKiBwcm9wZXJ0aWVzIG92ZXIgaW4gZXZlcnkgRkIgdXBkYXRlLiAqLworICAgIG10c19zdGF0ZS0+ZGlzcGxheV9hZ2VudC5nZXRGcmFtZUJ1ZmZlcigKKyAgICAgICAgICAgICZtdHNfc3RhdGUtPmZiX2hlYWRlci5kaXNwX3dpZHRoLAorICAgICAgICAgICAgJm10c19zdGF0ZS0+ZmJfaGVhZGVyLmRpc3BfaGVpZ2h0LAorICAgICAgICAgICAgJm10c19zdGF0ZS0+ZmJfaGVhZGVyLmJwbCwKKyAgICAgICAgICAgICZtdHNfc3RhdGUtPmZiX2hlYWRlci5icHAsCisgICAgICAgICAgICAmbXRzX3N0YXRlLT5jdXJyZW50X2ZiKTsKKyAgICBtdHNfc3RhdGUtPnlkaXIgPSAxOworCisgICAgX210X2ZiX2NvbW1vbl91cGRhdGUobXRzX3N0YXRlLCB4LCB5LCB3LCBoKTsKK30KKwordm9pZAorbXVsdGl0b3VjaF9vcGVuZ2xlc19mYl91cGRhdGUodm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHlkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVscykKK3sKKyAgICBNVFNTdGF0ZSogY29uc3QgbXRzX3N0YXRlID0gJl9NVFNTdGF0ZTsKKworICAgIC8qIE1ha2Ugc3VyZSBNVCBwb3J0IGlzIGluaXRpYWxpemVkLiAqLworICAgIGlmICghX2lzX210X2luaXRpYWxpemVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBUKCJNdWx0aS10b3VjaDogb3BlbkdMRVMgZnJhbWVidWZmZXIgdXBkYXRlOiAwOjAgLT4gJWR4JWQiLCB3LCBoKTsKKworICAgIC8qIEdMRVMgZm9ybWF0IGlzIGFsd2F5cyBSR0JBODg4OCAqLworICAgIG10c19zdGF0ZS0+ZmJfaGVhZGVyLmJwcCA9IDQ7CisgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIuYnBsID0gNCAqIHc7CisgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIuZGlzcF93aWR0aCA9IHc7CisgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIuZGlzcF9oZWlnaHQgPSBoOworICAgIG10c19zdGF0ZS0+Y3VycmVudF9mYiA9IHBpeGVsczsKKyAgICBtdHNfc3RhdGUtPnlkaXIgPSB5ZGlyOworCisgICAgLyogR0xFUyBlbXVsYXRvciBhbHdhcyB1cGRhdGUgdGhlIGVudGlyZSBmcmFtZWJ1ZmZlci4gKi8KKyAgICBfbXRfZmJfY29tbW9uX3VwZGF0ZShtdHNfc3RhdGUsIDAsIDAsIHcsIGgpOworfQorCit2b2lkCittdWx0aXRvdWNoX3JlZnJlc2hfc2NyZWVuKHZvaWQpCit7CisgICAgTVRTU3RhdGUqIGNvbnN0IG10c19zdGF0ZSA9ICZfTVRTU3RhdGU7CisKKyAgICAvKiBNYWtlIHN1cmUgTVQgcG9ydCBpcyBpbml0aWFsaXplZC4gKi8KKyAgICBpZiAoIV9pc19tdF9pbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogTGV0cyBzZWUgaWYgYW55IHVwZGF0ZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHNvIGZhci4gKi8KKyAgICBpZiAoTlVMTCAhPSBtdHNfc3RhdGUtPmN1cnJlbnRfZmIpIHsKKyAgICAgICAgX210X2ZiX2NvbW1vbl91cGRhdGUobXRzX3N0YXRlLCAwLCAwLCBtdHNfc3RhdGUtPmZiX2hlYWRlci5kaXNwX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdHNfc3RhdGUtPmZiX2hlYWRlci5kaXNwX2hlaWdodCk7CisgICAgfQorfQorCit2b2lkCittdWx0aXRvdWNoX2ZiX3VwZGF0ZWQodm9pZCkKK3sKKyAgICBNVFNTdGF0ZSogY29uc3QgbXRzX3N0YXRlID0gJl9NVFNTdGF0ZTsKKworICAgIC8qIFRoaXMgY29uY2x1ZGVzIGZyYW1lYnVmZmVyIHVwZGF0ZS4gKi8KKyAgICBtdHNfc3RhdGUtPmZiX3RyYW5zZmVyX2luX3Byb2dyZXNzID0gMDsKKworICAgIC8qIExldHMgc2VlIGlmIHdlIGhhdmUgYWNjdW11bGF0ZWQgbW9yZSBjaGFuZ2VzIHdoaWxlIHRyYW5zbWlzc2lvbiBoYXMgYmVlbgorICAgICAqIGluIHByb2dyZXNzLiAqLworICAgIGlmIChtdHNfc3RhdGUtPmZiX2hlYWRlci53ICYmIG10c19zdGF0ZS0+ZmJfaGVhZGVyLmgpIHsKKyAgICAgICAgbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcyA9IDE7CisgICAgICAgIC8qIFNlbmQgYWNjdW11bGF0ZWQgdXBkYXRlcy4gKi8KKyAgICAgICAgaWYgKG10c19wb3J0X3NlbmRfZnJhbWUobXRzX3N0YXRlLT5tdHNwLCAmbXRzX3N0YXRlLT5mYl9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10c19zdGF0ZS0+Y3VycmVudF9mYiwgX29uX2ZiX3NlbnQsIG10c19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRzX3N0YXRlLT55ZGlyKSkgeworICAgICAgICAgICAgbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcyA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgbXVsdGl0b3VjaF9pbml0KEFuZHJvaWRNVFNQb3J0KiBtdHNwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUFuZHJvaWRVc2VyRXZlbnRBZ2VudCogdXNlcl9ldmVudF9hZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFBbmRyb2lkRGlzcGxheUFnZW50KiBkaXNwbGF5X2FnZW50KSB7CisgICAgaWYgKCFfaXNfbXRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgTVRTU3RhdGUqIGNvbnN0IG10c19zdGF0ZSA9ICZfTVRTU3RhdGU7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICAvKiBTdGFzaCBhd2F5IGludGVyZmFjZSBvYmplY3RzLiAqLworICAgICAgICBfVXNlckV2ZW50QWdlbnQgPSB1c2VyX2V2ZW50X2FnZW50OworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IuCisgICAgICAgICAqLworCisgICAgICAgIG1lbXNldChtdHNfc3RhdGUsIDAsIHNpemVvZihNVFNTdGF0ZSkpOworICAgICAgICBtdHNfc3RhdGUtPnRyYWNrZWRfcHRyX251bSA9IDA7CisgICAgICAgIG10c19zdGF0ZS0+Y3VycmVudF9zbG90ID0gLTE7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1UU19QT0lOVEVSU19OVU07IGluZGV4KyspIHsKKyAgICAgICAgICAgIG10c19zdGF0ZS0+dHJhY2tlZF9wb2ludGVyc1tpbmRleF0udHJhY2tpbmdfaWQgPSBNVFNfUE9JTlRFUl9VUDsKKyAgICAgICAgfQorICAgICAgICBtdHNfc3RhdGUtPm10c3AgPSBtdHNwOworICAgICAgICBtdHNfc3RhdGUtPmZiX2hlYWRlci5oZWFkZXJfc2l6ZSA9IHNpemVvZihNVEZyYW1lSGVhZGVyKTsKKyAgICAgICAgbXRzX3N0YXRlLT5mYl90cmFuc2Zlcl9pbl9wcm9ncmVzcyA9IDA7CisKKyAgICAgICAgbXRzX3N0YXRlLT5kaXNwbGF5X2FnZW50ID0gKmRpc3BsYXlfYWdlbnQ7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBmcmFtZWJ1ZmZlciBpbmZvcm1hdGlvbiBpbiB0aGUgc2NyZWVuIGRlc2NyaXB0b3IuICovCisKKyAgICAgICAgbXRzX3N0YXRlLT5mYl9oZWFkZXIueCA9IG10c19zdGF0ZS0+ZmJfaGVhZGVyLnkgPSAwOworICAgICAgICBtdHNfc3RhdGUtPmZiX2hlYWRlci53ID0gbXRzX3N0YXRlLT5mYl9oZWFkZXIuaCA9IDA7CisgICAgICAgIG10c19zdGF0ZS0+ZmJfdHJhbnNmZXJfaW5fcHJvZ3Jlc3MgPSAwOworCisgICAgICAgIG10c19zdGF0ZS0+ZGlzcGxheV9hZ2VudC5nZXRGcmFtZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAmbXRzX3N0YXRlLT5mYl9oZWFkZXIuZGlzcF93aWR0aCwKKyAgICAgICAgICAgICAgICAmbXRzX3N0YXRlLT5mYl9oZWFkZXIuZGlzcF9oZWlnaHQsCisgICAgICAgICAgICAgICAgJm10c19zdGF0ZS0+ZmJfaGVhZGVyLmJwbCwKKyAgICAgICAgICAgICAgICAmbXRzX3N0YXRlLT5mYl9oZWFkZXIuYnBwLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBmcmFtZWJ1ZmZlciB1cGRhdGUgbGlzdGVuZXIuCisgICAgICAgICAqLworCisgICAgICAgIG10c19zdGF0ZS0+ZGlzcGxheV9hZ2VudC5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCZfbXRfZmJfdXBkYXRlLCBtdHNfc3RhdGUpOworCisgICAgICAgIF9pc19tdF9pbml0aWFsaXplZCA9IDE7CisgICAgfQorfQorCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gc2V0IGFuZCBnZXQgdGhlIGJ1dHRvbiBzdGF0ZSBiaXQgbWFzayAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBrU2hpZnRJc1RvdWNoRG93biA9IDEsCisgICAga1NoaWZ0U2hvdWxkU2tpcFN5bmMgPSAxIDw8IDEsCisgICAga1NoaWZ0U2Vjb25kYXJ5VG91Y2ggPSAxIDw8IDIsCit9IEJ1dHRvblN0YXRlU2hpZnRNYXNrOworCitpbnQgbXVsdGl0b3VjaF9jcmVhdGVfYnV0dG9uc19zdGF0ZShib29sIGlzX2Rvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2Vjb25kYXJ5X2ZpbmdlcikgeworICAgIGludCBzdGF0ZSA9IDA7CisgICAgaWYgKGlzX2Rvd24pCisgICAgICAgIHN0YXRlIHw9IGtTaGlmdElzVG91Y2hEb3duOworICAgIGlmIChza2lwX3N5bmMpCisgICAgICAgIHN0YXRlIHw9IGtTaGlmdFNob3VsZFNraXBTeW5jOworICAgIGlmIChzZWNvbmRhcnlfZmluZ2VyKQorICAgICAgICBzdGF0ZSB8PSBrU2hpZnRTZWNvbmRhcnlUb3VjaDsKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKK2Jvb2wgbXVsdGl0b3VjaF9pc190b3VjaF9kb3duKGludCBidXR0b25zX3N0YXRlKSB7CisgICAgcmV0dXJuIGJ1dHRvbnNfc3RhdGUgJiBrU2hpZnRJc1RvdWNoRG93bjsKK30KKworYm9vbCBtdWx0aXRvdWNoX3Nob3VsZF9za2lwX3N5bmMoaW50IGJ1dHRvbnNfc3RhdGUpIHsKKyAgICByZXR1cm4gYnV0dG9uc19zdGF0ZSAmIGtTaGlmdFNob3VsZFNraXBTeW5jOworfQorCitib29sIG11bHRpdG91Y2hfaXNfc2Vjb25kX2ZpbmdlcihpbnQgYnV0dG9uc19zdGF0ZSkgeworICAgIHJldHVybiBidXR0b25zX3N0YXRlICYga1NoaWZ0U2Vjb25kYXJ5VG91Y2g7Cit9CisKK3ZvaWQgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcihNVEVTb3VyY2Ugc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFja2luZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc3N1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX3N5bmMpIHsKKyAgICBNVFNTdGF0ZSogY29uc3QgbXRzX3N0YXRlID0gJl9NVFNTdGF0ZTsKKworICAgIC8qIEFzc2lnbiBhIGZpeGVkIHRyYWNraW5nIElEIHRvIHRoZSBtb3VzZSBwb2ludGVyLiAqLworICAgIGlmIChzb3VyY2UgPT0gTVRFU19NT1VTRSkgeworICAgICAgICB0cmFja2luZ19pZCA9IE1UU19QT0lOVEVSX01PVVNFOworICAgIH0KKworICAgIC8qIEZpbmQgdGhlIHRyYWNrZWQgcG9pbnRlciBmb3IgdGhlIHRyYWNraW5nIElELiAqLworICAgIGNvbnN0IGludCBzbG90X2luZGV4ID0gX210c3N0YXRlX2dldF9wb2ludGVyX2luZGV4KG10c19zdGF0ZSwgdHJhY2tpbmdfaWQpOworICAgIGlmIChzbG90X2luZGV4IDwgMCkgeworICAgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSBwb2ludGVyIGlzIHNlZW4uIE11c3QgYmUgInByZXNzZWQiLAorICAgICAgICAgKiBvdGhlcndpc2UgaXQncyAiaG9vdmVyaW5nIiwgd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCB5ZXQuICovCisgICAgICAgIGlmIChwcmVzc3VyZSA9PSAwKSB7CisgICAgICAgICAgICBpZiAodHJhY2tpbmdfaWQgIT0gTVRTX1BPSU5URVJfTU9VU0UpIHsKKyAgICAgICAgICAgICAgICBEKCJVbmV4cGVjdGVkIE1UUyBwb2ludGVyIHVwZGF0ZSBmb3IgdHJhY2tpbmcgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICB0cmFja2luZ19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGlzIGlzIGEgInBvaW50ZXIgZG93biIgZXZlbnQgKi8KKyAgICAgICAgX210c19wb2ludGVyX2Rvd24obXRzX3N0YXRlLCB0cmFja2luZ19pZCwgeCwgeSwgcHJlc3N1cmUpOworICAgIH0gZWxzZSBpZiAocHJlc3N1cmUgPT0gMCkgeworICAgICAgICAvKiBUaGlzIGlzIGEgInBvaW50ZXIgdXAiIGV2ZW50ICovCisgICAgICAgIF9tdHNfcG9pbnRlcl91cChtdHNfc3RhdGUsIHNsb3RfaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgaXMgYSAicG9pbnRlciBtb3ZlIiBldmVudCAqLworICAgICAgICBfbXRzX3BvaW50ZXJfbW92ZShtdHNfc3RhdGUsIHNsb3RfaW5kZXgsIHgsIHksIHByZXNzdXJlKTsKKyAgICB9CisKKyAgICAvKiBUaGUgRVZfU1lOIGNhbiBiZSBza2lwcGVkIGlmIG11bHRpdG91Y2ggZXZlbnRzIHdlcmUgaW50ZW5kZWQgdG8gYmUKKyAgICAgKiBkZWxpdmVyZWQgYXQgdGhlIHNhbWUgdGltZSwgd2hpY2ggaXMgaG93IHJlYWwgZGV2aWNlcyByZXBvcnQgZXZlbnRzCisgICAgICogdGhhdCBvY2N1ciBzaW11bHRhbmVvdXNseS4gKi8KKyAgICBpZiAoIXNraXBfc3luYykgeworICAgICAgICBfcHVzaF9ldmVudChFVl9TWU4sIFNZTl9SRVBPUlQsIDApOworICAgIH0KK30KKworaW50CittdWx0aXRvdWNoX2dldF9tYXhfc2xvdCgpCit7CisgICAgcmV0dXJuIE1UU19QT0lOVEVSU19OVU0gLSAxOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtc2NyZWVuLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbXVsdGl0b3VjaC1zY3JlZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWY2NmRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL211bHRpdG91Y2gtc2NyZWVuLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdXNlcl9ldmVudF9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvZGlzcGxheV9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2RrLWNvbnRyb2xsZXItc29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tdWx0aXRvdWNoLXBvcnQuaCIKKworLyoKKyAqIEVuY2Fwc3VsYXRlcyBmdW5jdGlvbmFsaXR5IG9mIG11bHRpLXRvdWNoIHNjcmVlbi4gTWFpbiB0YXNrIG9mIHRoaXMgY29tcG9uZW50CisgKiBpcyB0byByZXBvcnQgdG91Y2ggZXZlbnRzIHRvIHRoZSBlbXVsYXRlZCBzeXN0ZW0gdmlhIGV2ZW50IGRldmljZSAoc2VlCisgKiBody9hbmRyb2lkL2dvbGRmaXNoL2V2ZW50c19kZXZpY2UuYykgVGhlIHNvdXJjZSBvZiB0b3VjaCBldmVudHMgY2FuIGJlIGEKKyAqIG1vdXNlLCBvciBhbiBhY3R1YWwgYW5kcm9pZCBkZXZpY2UgdGhhdCBpcyB1c2VkIGZvciBtdWx0aS10b3VjaCBlbXVsYXRpb24uCisgKiBOb3RlIHRoYXQgc2luY2Ugd2UgbmVlZCB0byBzaW11bHRhbmVvdXNlbHkgc3VwcG9ydCBhIG1vdXNlIGFuZCBhIGRldmljZSBhcworICogZXZlbnQgc291cmNlLCB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggb25lIGhhcyBzZW50IHVzIGEgdG91Y2ggZXZlbnQuIFRoaXMgaXMKKyAqIGltcG9ydGFudCBmb3IgcHJvcGVyIHRyYWNraW5nIG9mIHBvaW50ZXIgSURzIHdoZW4gbXVsdGl0b3VjaCBpcyBpbiBwbGF5LgorICovCisKKy8qIERlZmluZXMgYSBzb3VyY2Ugb2YgbXVsdGktdG91Y2ggZXZlbnQuIFRoaXMgaXMgdXNlZCB0byBwcm9wZXJseSB0cmFjaworICogcG9pbnRlciBJRHMuCisgKi8KK3R5cGVkZWYgZW51bSBNVEVTb3VyY2UgeworICAgIC8qIFRoZSBldmVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBtb3VzZS4gKi8KKyAgICBNVEVTX01PVVNFLAorICAgIC8qIFRoZSBldmVudCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYWN0dWFsIGFuZHJvaWQgZGV2aWNlLiAqLworICAgIE1URVNfREVWSUNFLAorfSBNVEVTb3VyY2U7CisKKy8qIEluaXRpYWxpemVzIE1UU1N0YXRlIGluc3RhbmNlLgorICogUGFyYW06CisgKiAgbXRzcCAtIEluc3RhbmNlIG9mIHRoZSBtdWx0aS10b3VjaCBwb3J0IGNvbm5lY3RlZCB0byB0aGUgZGV2aWNlLgorICogIHVzZXJfZXZlbnRfYWdlbnQgLSBJbnN0YW5jZSBvZiBRQW5kcm9pZFVzZXJFdmVudEFnZW50IHRvIHBpcGUgZXZlbnRzIHRvIFZNLgorICogIGRpc3BsYXlfYWdlbnQgLSBJbnN0YW5jZSBvZiBRQW5kcm9pZERpc3BsYXlBZ2VudCB0byBpbnRlcmFjdCB3aXRoIHRoZSBkaXNwbGF5LgorICovCitleHRlcm4gdm9pZCBtdWx0aXRvdWNoX2luaXQoQW5kcm9pZE1UU1BvcnQqIG10c3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUFuZHJvaWRVc2VyRXZlbnRBZ2VudCogdXNlcl9ldmVudF9hZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQW5kcm9pZERpc3BsYXlBZ2VudCogZGlzcGxheV9hZ2VudCk7CisKKy8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzZXQgYW5kIGdldCB0aGUgYnV0dG9uIHN0YXRlIGJpdCBtYXNrICovCitleHRlcm4gaW50IG11bHRpdG91Y2hfY3JlYXRlX2J1dHRvbnNfc3RhdGUoYm9vbCBpc19kb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9zeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2Vjb25kYXJ5X2Zpbmdlcik7CisKK2V4dGVybiBib29sIG11bHRpdG91Y2hfaXNfdG91Y2hfZG93bihpbnQgYnV0dG9uc19zdGF0ZSk7CitleHRlcm4gYm9vbCBtdWx0aXRvdWNoX3Nob3VsZF9za2lwX3N5bmMoaW50IGJ1dHRvbnNfc3RhdGUpOworZXh0ZXJuIGJvb2wgbXVsdGl0b3VjaF9pc19zZWNvbmRfZmluZ2VyKGludCBidXR0b25zX3N0YXRlKTsKKworLyogSGFuZGxlcyBhIE1UIHBvaW50ZXIgZXZlbnQuCisgKiBQYXJhbToKKyAqICBzb3VyY2UgLSBJZGVudGlmaWVzIHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50IChtb3VzZSBvciBhIGRldmljZSkuCisgKiAgdHJhY2tpbmdfaWQgLSBUcmFja2luZyBJRCBvZiB0aGUgcG9pbnRlci4KKyAqICB4LCB5IC0gUG9pbnRlciBjb29yZGluYXRlcywKKyAqICBwcmVzc3VyZSAtIFByZXNzdXJlIHZhbHVlIGZvciB0aGUgcG9pbnRlci4KKyAqLworZXh0ZXJuIHZvaWQgbXVsdGl0b3VjaF91cGRhdGVfcG9pbnRlcihNVEVTb3VyY2Ugc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhY2tpbmdfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfc3luYyk7CisKKy8qIEdldHMgbWF4aW11bSBzbG90IGluZGV4IGF2YWlsYWJsZSBmb3IgdGhlIG11bHRpLXRvdWNoIGVtdWxhdGlvbi4gKi8KK2V4dGVybiBpbnQgbXVsdGl0b3VjaF9nZXRfbWF4X3Nsb3QoKTsKKworLyogQSBjYWxsYmFjayBzZXQgdG8gbW9uaXRvciBPcGVuR0xFUyBmcmFtZWJ1ZmZlciB1cGRhdGVzLgorICogVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIGp1c3QgYmVmb3JlIGVhY2ggbmV3IGZyYW1lIGlzCisgKiBkaXNwbGF5ZWQsIHByb3ZpZGluZyBhIGNvcHkgb2YgdGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLgorICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZyb20gb25lIG9mIHRoZSByZW5kZXJlcidzIHRocmVhZHMsIHNvIGl0IG1heQorICogcmVxdWlyZSBzeW5jaHJvbml6YXRpb24gb24gYW55IGRhdGEgc3RydWN0dXJlcyBpdCBtb2RpZmllcy4gVGhlIHBpeGVscyBidWZmZXIKKyAqIG1heSBiZSBvdmVyd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBjYWxsYmFjayByZXR1cm5zLgorICogVGhlIHBpeGVscyBidWZmZXIgaXMgaW50ZW50aW9uYWxseSBub3QgY29uc3Q6IHRoZSBjYWxsYmFjayBtYXkgbW9kaWZ5IHRoZSBkYXRhCisgKiB3aXRob3V0IGNvcHlpbmcgdG8gYW5vdGhlciBidWZmZXIgaWYgaXQgd2FudHMsIGUuZy4gaW4tcGxhY2UgUkdCQSB0byBSR0IKKyAqIGNvbnZlcnNpb24sIG9yIGluLXBsYWNlIHktaW52ZXJzaW9uLgorICogUGFyYW06CisgKiAgIGNvbnRleHQgICAgICAgIFRoZSBwb2ludGVyIG9wdGlvbmFsbHkgcHJvdmlkZWQgd2hlbiB0aGUgY2FsbGJhY2sgd2FzCisgKiAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQuIFRoZSBjbGllbnQgY2FuIHVzZSB0aGlzIHRvIHBhc3Mgd2hhdGV2ZXIKKyAqICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaXQgd2FudHMgdG8gdGhlIGNhbGxiYWNrLgorICogICB3aWR0aCwgaGVpZ2h0ICBEaW1lbnNpb25zIG9mIHRoZSBpbWFnZSwgaW4gcGl4ZWxzLiBSb3dzIGFyZSB0aWdodGx5IHBhY2tlZDsKKyAqICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgbm8gaW50ZXItcm93IHBhZGRpbmcuCisgKiAgIHlkaXIgICAgICAgICAgIEluZGljYXRlcyByb3cgb3JkZXI6IDEgbWVhbnMgdG9wLXRvLWJvdHRvbSBvcmRlciwgLTEgbWVhbnMKKyAqICAgICAgICAgICAgICAgICAgYm90dG9tLXRvLXRvcCBvcmRlci4KKyAqICAgZm9ybWF0LCB0eXBlICAgRm9ybWF0IGFuZCB0eXBlIEdMIGVudW1zLCBhcyB1c2VkIGluIGdsVGV4SW1hZ2UyRCgpIG9yCisgKiAgICAgICAgICAgICAgICAgIGdsUmVhZFBpeGVscygpLCBkZXNjcmliaW5nIHRoZSBwaXhlbCBmb3JtYXQuCisgKiAgIHBpeGVscyAgICAgICAgIFRoZSBmcmFtZWJ1ZmZlciBpbWFnZS4KKyAqCisgKiBJbiB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24sIHlkaXIgaXMgYWx3YXlzIC0xIChib3R0b20gdG8gdG9wKSwgZm9ybWF0IGFuZAorICogdHlwZSBhcmUgYWx3YXlzIEdMX1JHQkEgYW5kIEdMX1VOU0lHTkVEX0JZVEUsIGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodCB3aWxsCisgKiBhbHdheXMgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgcGFzc2VkIHRvIGluaXRPcGVuR0xSZW5kZXJlcigpLgorICovCitleHRlcm4gdm9pZCBtdWx0aXRvdWNoX29wZW5nbGVzX2ZiX3VwZGF0ZSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcGl4ZWxzKTsKKworLyogUHVzaGVzIHRoZSBlbnRpcmUgZnJhbWVidWZmZXIgdG8gdGhlIGRldmljZS4gVGhpcyB3aWxsIGZvcmNlIHRoZSBkZXZpY2UgdG8KKyAqIHJlZnJlc2ggdGhlIGVudGlyZSBzY3JlZW4uCisgKi8KK2V4dGVybiB2b2lkIG11bHRpdG91Y2hfcmVmcmVzaF9zY3JlZW4odm9pZCk7CisKKy8qIEZyYW1lYnVmZmVyIHVwZGF0ZSBoYXMgYmVlbiBoYW5kbGVkIGJ5IHRoZSBkZXZpY2UuICovCitleHRlcm4gdm9pZCBtdWx0aXRvdWNoX2ZiX3VwZGF0ZWQodm9pZCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb25zdGFudHMuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2NvbnN0YW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZDg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb25zdGFudHMuYwpAQCAtMCwwICsxLDExNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBBUlJBWUxFTih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKKy8qIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfZGV2aWNlX2JhbmR3aWR0aHMgb3IgYSBjb21wbGV0ZSBsaXN0ICovCitjb25zdCBBbmRyb2lkTmV0d29ya1NwZWVkICBhbmRyb2lkX25ldHdvcmtfc3BlZWRzW10gPSB7CisjZGVmaW5lIERFRklORV9ORVRfU1BFRUQobmFtZSwgZGlzcGxheV9uYW1lLCB1cGxvYWQsIGRvd25sb2FkLCBtaW5fbGF0ZW5jeSwgbWF4X2xhdGVuY3kpIFwKKyAgICB7ICNuYW1lLCBkaXNwbGF5X25hbWUsICh1cGxvYWQpKjEwMDAsIChkb3dubG9hZCkqMTAwMCB9LAorICAgIEFORFJPSURfTkVUV09SS19MSVNUX01PREVTKERFRklORV9ORVRfU1BFRUQpCisgICAgeyAiZnVsbCIsICJubyBsaW1pdCIsIDAsIDAgfSwKK307Citjb25zdCBzaXplX3QgYW5kcm9pZF9uZXR3b3JrX3NwZWVkc19jb3VudCA9IEFSUkFZTEVOKGFuZHJvaWRfbmV0d29ya19zcGVlZHMpOworCitjb25zdCBjaGFyIGtBbmRyb2lkTmV0d29ya0RlZmF1bHRTcGVlZFtdID0gImZ1bGwiOworCitib29sIGFuZHJvaWRfbmV0d29ya19zcGVlZF9wYXJzZShjb25zdCBjaGFyKiBzcGVlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdXBsb2FkX2JhdWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkb3dubG9hZF9iYXVkcykgeworICAgIGlmICghc3BlZWQgfHwgIXNwZWVkWzBdKSB7CisgICAgICAgIHNwZWVkID0ga0FuZHJvaWROZXR3b3JrRGVmYXVsdFNwZWVkOworICAgIH0KKworICAgIC8vIEZpcnN0LCBjaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHdlbGwta25vd24gbmFtZQorICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCBhbmRyb2lkX25ldHdvcmtfc3BlZWRzX2NvdW50OyArK24pIHsKKyAgICAgICAgY29uc3QgQW5kcm9pZE5ldHdvcmtTcGVlZCogZW50cnkgPSAmYW5kcm9pZF9uZXR3b3JrX3NwZWVkc1tuXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoc3BlZWQsIGVudHJ5LT5uYW1lKSkgeworICAgICAgICAgICAgKnVwbG9hZF9iYXVkcyA9IGVudHJ5LT51cGxvYWRfYmF1ZHM7CisgICAgICAgICAgICAqZG93bmxvYWRfYmF1ZHMgPSBlbnRyeS0+ZG93bmxvYWRfYmF1ZHM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNlY29uZCBjaGVjayBmb3IgYSBudW1iZXIuCisgICAgY2hhciogZW5kID0gTlVMTDsKKyAgICBkb3VibGUgc3AgPSBzdHJ0b2Qoc3BlZWQsICZlbmQpOworICAgIGlmIChlbmQgPT0gc3BlZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpkb3dubG9hZF9iYXVkcyA9ICp1cGxvYWRfYmF1ZHMgPSBzcCAqIDEwMDAuOyAgLy8gVE9ETyhkaWdpdCk6IFdoeSAxMDAwLiA/CisgICAgaWYgKCplbmQgPT0gJzonKSB7CisgICAgICAgIHNwZWVkID0gZW5kICsgMTsKKyAgICAgICAgc3AgPSBzdHJ0b2Qoc3BlZWQsICZlbmQpOworICAgICAgICBpZiAoZW5kID4gc3BlZWQpIHsKKyAgICAgICAgICAgICpkb3dubG9hZF9iYXVkcyA9IHNwICogMTAwMC47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgQW5kcm9pZE5ldHdvcmtMYXRlbmN5ICBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzW10gPSB7CisjZGVmaW5lIERFRklORV9ORVRfTEFURU5DWShuYW1lLCBkaXNwbGF5X25hbWUsIHVwbG9hZCwgZG93bmxvYWQsIG1pbl9sYXRlbmN5LCBtYXhfbGF0ZW5jeSkgXAorICAgIHsgI25hbWUsIGRpc3BsYXlfbmFtZSwgbWluX2xhdGVuY3ksIG1heF9sYXRlbmN5IH0sCisgICAgQU5EUk9JRF9ORVRXT1JLX0xJU1RfTU9ERVMoREVGSU5FX05FVF9MQVRFTkNZKQorICAgIHsgIm5vbmUiLCAibm8gbGF0ZW5jeSIsIDAsIDAgfSwKK307Citjb25zdCBzaXplX3QgYW5kcm9pZF9uZXR3b3JrX2xhdGVuY2llc19jb3VudCA9CisgICAgICAgIEFSUkFZTEVOKGFuZHJvaWRfbmV0d29ya19sYXRlbmNpZXMpOworCitjb25zdCBjaGFyIGtBbmRyb2lkTmV0d29ya0RlZmF1bHRMYXRlbmN5W10gPSAibm9uZSI7CisKK2Jvb2wgYW5kcm9pZF9uZXR3b3JrX2xhdGVuY3lfcGFyc2UoY29uc3QgY2hhciogZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWluX2RlbGF5X21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG1heF9kZWxheV9tcykgeworICAgIGlmICghZGVsYXkgfHwgIWRlbGF5WzBdKSB7CisgICAgICAgIGRlbGF5ID0ga0FuZHJvaWROZXR3b3JrRGVmYXVsdExhdGVuY3k7CisgICAgfQorCisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IGFuZHJvaWRfbmV0d29ya19sYXRlbmNpZXNfY291bnQ7ICsrbikgeworICAgICAgICBjb25zdCBBbmRyb2lkTmV0d29ya0xhdGVuY3kqIGVudHJ5ID0gJmFuZHJvaWRfbmV0d29ya19sYXRlbmNpZXNbbl07CisgICAgICAgIGlmICghc3RyY21wKGVudHJ5LT5uYW1lLCBkZWxheSkpIHsKKyAgICAgICAgICAgICptaW5fZGVsYXlfbXMgPSBlbnRyeS0+bWluX21zOworICAgICAgICAgICAgKm1heF9kZWxheV9tcyA9IGVudHJ5LT5tYXhfbXM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNoYXIqIGVuZCA9IE5VTEw7CisgICAgZG91YmxlIHNwID0gc3RydG9kKGRlbGF5LCAmZW5kKTsKKyAgICBpZiAoZW5kID09IGRlbGF5KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqbWluX2RlbGF5X21zID0gKm1heF9kZWxheV9tcyA9IHNwOworICAgIGlmICgqZW5kID09ICc6JykgeworICAgICAgICBkZWxheSA9IGVuZCArIDE7CisgICAgICAgIHNwID0gc3RydG9kKGRlbGF5LCAmZW5kKTsKKyAgICAgICAgaWYgKGVuZCA+IGRlbGF5KSB7CisgICAgICAgICAgICAqbWF4X2RlbGF5X21zID0gc3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2NvbnN0YW50cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5ZDBlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIEEgY29udmVuaWVuY2UgbWFjcm8gdXNlZCB0byBsaXN0IGFsbCBrbm93biBuZXR3b3JrIHRlbGVwaG9uZSBpbnRlcmZhY2UuCisvLyBYKCkgbXVzdCBiZSBhIG1hY3JvIHRoYXQgdGFrZXMgNiBwYXJhbWV0ZXJzIHdoaWNoIGFyZToKKy8vIC0gdW5pcXVlIG5hbWUgKGFzIHVzZWQgaW4gdGhlIEFuZHJvaWQgY29uc29sZSkuCisvLyAtIGRpc3BsYXkgbmFtZS4KKy8vIC0gdXBsb2FkIHJhdGUgaW4ga0IvcyAoKm5vdCogYml0cy9zIG5vciBraUIvcykuCisvLyAtIGRvd25sb2FkIHJhdGUgaW4ga0Ivcy4KKy8vIC0gbWluaW11bSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKy8vIC0gbWF4aW11bSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKy8vIE5PVEU6IE1vc3Qgb2YgdGhlIGxhdGVuY3kgbnVtYmVycyBhcmUgY29tcGxldGVseSBtYWRlIHVwIGFuZCB0aGUKKy8vIHVwbG9hZC9kb3dubG9hZCByYXRlIGNvbWUgZnJvbSB0aGUgZm9sbG93aW5nIHdpa2lwZWRpYSBwYWdlOgorLy8gIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9kZXZpY2VfYmFuZHdpZHRocworI2RlZmluZSBBTkRST0lEX05FVFdPUktfTElTVF9NT0RFUyhYKSBcCisgICAgWChnc20sICAgIkdTTS9DRCIsICAgICAgICAxNC40LCAgICAgMTQuNCwgMTUwLCA1NTApIFwKKyAgICBYKGhzY3NkLCAiSFNDU0QiLCAgICAgICAgIDE0LjQsICAgICA1Ny42LCAgODAsIDQwMCkgXAorICAgIFgoZ3BycywgICJHUFJTIiwgICAgICAgICAgMjguOCwgICAgIDU3LjYsICAzNSwgMjAwKSBcCisgICAgWCh1bXRzLCAgIlVNVFMvM0ciLCAgICAgIDM4NC4wLCAgICAzODQuMCwgIDM1LCAyMDApIFwKKyAgICBYKGVkZ2UsICAiRURHRS9FR1BSUyIsICAgNDczLjYsICAgIDQ3My42LCAgODAsIDQwMCkgXAorICAgIFgoaHNkcGEsICJIU0RQQSIsICAgICAgIDU3NjAuMCwgIDEzOTgwLjAsICAgMCwgICAwKSBcCisgICAgWChsdGUsICAgIkxURSIsICAgICAgICA1ODAwMC4wLCAxNzMwMDAuMCwgICAwLCAgIDApIFwKKyAgICBYKGV2ZG8sICAiRVZETyIsICAgICAgIDc1MDAwLjAsIDI4MDAwMC4wLCAgIDAsICAgMCkgXAorCisvLyBEZXNjcmliZXMgb25lIG9mIHRoZSBzdXBwb3J0ZWQgZW11bGF0ZWQgbmV0d29yayBiYW5kd2l0aCBsaW1pdHMuCisvLyB8bmFtZXwgaXMgdGhlIG5hbWUgYXMgdXNlZCBpbiB0aGUgQW5kcm9pZCBjb25zb2xlIChlLmcuICdnc20nKQorLy8gfGRpc3BsYXlfbmFtZXwgaXMgdGhlIGNvcnJlc3BvbmRpbmcgZGlzcGxheSBuYW1lIChlLmcuICdHU00vQ0QnKQorLy8gfHVwbG9hZF9iYXVkc3wgaXMgdGhlIG1heCB1cGxvYWQgc3BlZWQgaW4gYml0cy9zLiAwIGZvciB1bmxpbWl0ZWQuCisvLyB8ZG93bmxvYWRfYmF1ZHN8IGlzIHRoZSBtYXggZG93bmxvYWQgc3BlZWQgaW4gYml0cy9zLiAwIGZvciB1bmxpbWl0ZWQuCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogIG5hbWU7CisgICAgY29uc3QgY2hhciogIGRpc3BsYXlfbmFtZTsKKyAgICBkb3VibGUgICAgICAgdXBsb2FkX2JhdWRzOworICAgIGRvdWJsZSAgICAgICBkb3dubG9hZF9iYXVkczsKK30gQW5kcm9pZE5ldHdvcmtTcGVlZDsKKworLy8gQXJyYXkgb2YgQW5kcm9pZE5ldHdvcmtTcGVlZCBpbnN0YW5jZXMgc3VwcG9ydGVkIGJ5IEFuZHJvaWRFbXUuCisvLyBUaGVyZSBhcmUgfGFuZHJvaWRfbmV0d29ya19zcGVlZHNfY291bnR8IGl0ZW1zIGluIHRoZSBhcnJheS4KK2V4dGVybiBjb25zdCBBbmRyb2lkTmV0d29ya1NwZWVkIGFuZHJvaWRfbmV0d29ya19zcGVlZHNbXTsKKworLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHxhbmRyb2lkX25ldHdvcmtfc3BlZWRzfC4KK2V4dGVybiBjb25zdCBzaXplX3QgYW5kcm9pZF9uZXR3b3JrX3NwZWVkc19jb3VudDsKKworLy8gRGVmYXVsdCBuZXR3b3JrIHNwZWVkIHNldHRpbmcsIGFzIGEgc3RyaW5nLiBVc2VkIGJ5IGNvbnNvbGUgY29kZS4KK2V4dGVybiBjb25zdCBjaGFyIGtBbmRyb2lkTmV0d29ya0RlZmF1bHRTcGVlZFtdOworCisvLyBFeHRyYWN0IG5ldHdvcmsgYmFuZHdpZHRoIGxpbWl0cyBmcm9tIGEgc3RyaW5nLiB8c3BlZWR8IGlzIGEgdGV4dHVhbAorLy8gZGVzY3JpcHRpb24gb2YgdGhlIHNwZWVkLiBUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIGFjY2VwdGVkOgorLy8KKy8vICAgLSBudWxscHRyIG9yIDxlbXB0eT4gZm9yIHRoZSBkZWZhdWx0IHNwZWVkIChrQW5kcm9pZE5ldHdvcmtEZWZhdWx0U3BlZWQpLgorLy8gICAtIDxuYW1lPiwgd2hlcmUgPG5hbWU+IGlzIGxpc3RlZCBpbiBhbmRyb2lkX25ldHdvcmtfc3BlZWRzW10uCisvLyAgIC0gPGRlY2ltYWw+LCBmb3IgYm90aCB1cGxvYWQgYW5kIGRvd25sb2FkIHNwZWVkIGluIEtCL3MgKCpub3QqIEtpQi9zKS4KKy8vICAgLSA8dXBsb2FkLWRlY2ltYWw+Ojxkb3dubG9hZC1kZWNpbWFsPiBmb3IgZGlzdGluY3QgdXBsb2FkL2Rvd25sb2FkIHNwZWVkcy4KKy8vCisvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UgKGJhZCBmb3JtYXQpLgorZXh0ZXJuIGJvb2wgYW5kcm9pZF9uZXR3b3JrX3NwZWVkX3BhcnNlKGNvbnN0IGNoYXIqIHNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdXBsb2FkX2JhdWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZG93bmxvYWRfYmF1ZHMpOworCisvLyBEZXNjcmliZXMgb25lIG9mIHRoZSBzdXBwb3J0ZWQgbmV0d29yayBsYXRlbmN5IGxpbWl0cy4KKy8vIHxkaXNwbGF5fCBpcyB0aGUgbmFtZSBhcyB1c2VkIGluIHRoZSBBbmRyb2lkIGNvbnNvbGUgKGUuZy4gJ2VkZ2UnKS4KKy8vIHxkaXNwbGF5X25hbWV8IGlzIHRoZSBjb3JyZXNwb25kaW5nIGRpc3BsYXkgbmFtZSAoZS5nLiAnRURHRS9FR1BSUycpLgorLy8gfG1pbl9tc3wgaXMgdGhlIG1pbmltYWwgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisvLyB8bWF4X21zfCBpcyB0aGUgbWF4aW1hbCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4gMCBmb3IgdW5saW1pdGVkLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICBuYW1lOworICAgIGNvbnN0IGNoYXIqICBkaXNwbGF5X25hbWU7CisgICAgaW50ICAgICAgICAgIG1pbl9tczsKKyAgICBpbnQgICAgICAgICAgbWF4X21zOworfSBBbmRyb2lkTmV0d29ya0xhdGVuY3k7CisKKy8vIEFycmF5IG9mIHN1cHBvcnRlZCBBbmRyb2lkTmV0d29ya0xhdGVuY3kgZW50cmllcy4KK2V4dGVybiBjb25zdCBBbmRyb2lkTmV0d29ya0xhdGVuY3kgYW5kcm9pZF9uZXR3b3JrX2xhdGVuY2llc1tdOworCisvLyBOdW1iZXIgb2YgZW50cmllcyBpbiBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzLgorZXh0ZXJuIGNvbnN0IHNpemVfdCBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzX2NvdW50OworCisvLyBEZWZhdWx0IG5ldHdvcmsgbGF0ZW5jeSBzZXR0aW5nLCBhcyBhIHN0cmluZy4gVXNlZCBieSBjb25zb2xlIGNvZGUuCitleHRlcm4gY29uc3QgY2hhciBrQW5kcm9pZE5ldHdvcmtEZWZhdWx0TGF0ZW5jeVtdOworCisvLyBFeHRyYWN0IG5ldHdvcmsgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMgZnJvbSBhIHN0cmluZy4gfGRlbGF5fCBpcworLy8gdGhlIGxhdGVuY3kgZGVzY3JpcHRpb24sIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisvLworLy8gLSBudWxscHRyIG9yIGVtcHR5IGZvciB0aGUgZGVmYXVsdCBsYXRlbmN5IChrQW5kcm9pZE5ldHdvcmtEZWZhdWx0TGF0ZW5jeSkuCisvLyAtIDxuYW1lPiwgd2hlcmUgPG5hbWU+IGlzIGxpc3RlZCBpbiBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzW10uCisvLyAtIDxkZWNpbWFsPiBmb3IgYm90aCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxhdGVuY2llcyBpbiBtaWxsaXNlY29uZHMuCisvLyAtIDxtaW4tZGVjaW1hbD46PG1heC1kZWNpbWFsPiBmb3IgZGlzdGluY3QgbGF0ZW5jeSBsaW1pdHMuCisvLworLy8gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVscmUgKGJhZCBmb3JtYXQpLgorZXh0ZXJuIGJvb2wgYW5kcm9pZF9uZXR3b3JrX2xhdGVuY3lfcGFyc2UoY29uc3QgY2hhciogZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG1pbl9kZWxheV9tcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWF4X2RlbGF5X21zKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb25zdGFudHNfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRlNDJjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIEFSUkFZTEVOKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworVEVTVChBbmRyb2lkTmV0d29ya0NvbnN0YW50cywgUGFyc2VTcGVlZCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICAgICAgYm9vbCBleHBlY3RlZF9yZXN1bHQ7CisgICAgICAgIGRvdWJsZSBleHBlY3RlZF91cGxvYWQ7CisgICAgICAgIGRvdWJsZSBleHBlY3RlZF9kb3dubG9hZDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgbnVsbHB0ciwgdHJ1ZSwgMC4sIDAuIH0sCisgICAgICAgIHsgIiIsIHRydWUsIDAuLCAwLiB9LAorICAgICAgICB7ICJ1bmtub3duLXNwZWVkIiwgZmFsc2UsIDAuLCAwLiB9LAorICAgICAgICB7ICJhYmNkMTIzNDUiLCBmYWxzZSwgMC4sIDAuIH0sCisgICAgICAgIHsgIjEwMDAiLCB0cnVlLCAxZTYsIDFlNiB9LAorICAgICAgICB7ICIxMDAwOjIwMDAwIiwgdHJ1ZSwgMWU2LCAyZTcgfSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWUxFTihrRGF0YSk7ICsrbikgeworICAgICAgICBkb3VibGUgdXBsb2FkID0gMC47CisgICAgICAgIGRvdWJsZSBkb3dubG9hZCA9IDAuOworICAgICAgICBib29sIHJlc3VsdCA9IGFuZHJvaWRfbmV0d29ya19zcGVlZF9wYXJzZShrRGF0YVtuXS5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwbG9hZCwgJmRvd25sb2FkKTsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkX3Jlc3VsdCwgcmVzdWx0KSA8PCAiIyAiIDw8IG47CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfZG93bmxvYWQsIGRvd25sb2FkKSA8PCAiIyAiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZF91cGxvYWQsIHVwbG9hZCkgPDwgIiMgIiA8PCBuOworICAgIH0KK30KKworVEVTVChBbmRyb2lkTmV0d29ya0NvbnN0YW50cywgUGFyc2VTcGVlZFdpdGhOYW1lKSB7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBhbmRyb2lkX25ldHdvcmtfc3BlZWRzX2NvdW50OyArK24pIHsKKyAgICAgICAgY29uc3QgQW5kcm9pZE5ldHdvcmtTcGVlZCogZW50cnkgPSAmYW5kcm9pZF9uZXR3b3JrX3NwZWVkc1tuXTsKKyAgICAgICAgZG91YmxlIHVwbG9hZCA9IDAuOworICAgICAgICBkb3VibGUgZG93bmxvYWQgPSAwLjsKKyAgICAgICAgRVhQRUNUX1RSVUUoYW5kcm9pZF9uZXR3b3JrX3NwZWVkX3BhcnNlKGVudHJ5LT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb3dubG9hZCkpOworICAgICAgICBFWFBFQ1RfRVEoZW50cnktPnVwbG9hZF9iYXVkcywgdXBsb2FkKSA8PCAiIyAiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUShlbnRyeS0+ZG93bmxvYWRfYmF1ZHMsIGRvd25sb2FkKSA8PCAiIyAiIDw8IG47CisgICAgfQorfQorCitURVNUKEFuZHJvaWROZXR3b3JrQ29uc3RhbnRzLCBQYXJzZUxhdGVuY3kpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRfcmVzdWx0OworICAgICAgICBkb3VibGUgZXhwZWN0ZWRfbWluX21zOworICAgICAgICBkb3VibGUgZXhwZWN0ZWRfbWF4X21zOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyBudWxscHRyLCB0cnVlLCAwLiwgMC4gfSwKKyAgICAgICAgeyAiIiwgdHJ1ZSwgMC4sIDAuIH0sCisgICAgICAgIHsgInVua25vd24tc3BlZWQiLCBmYWxzZSwgMC4sIDAuIH0sCisgICAgICAgIHsgImFiY2QxMjM0NSIsIGZhbHNlLCAwLiwgMC4gfSwKKyAgICAgICAgeyAiMTAwMCIsIHRydWUsIDFlMywgMWUzIH0sCisgICAgICAgIHsgIjEwMDA6MjAwMDAiLCB0cnVlLCAxZTMsIDJlNCB9LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IEFSUkFZTEVOKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGRvdWJsZSBtaW5fbXMgPSAwLjsKKyAgICAgICAgZG91YmxlIG1heF9tcyA9IDAuOworICAgICAgICBib29sIHJlc3VsdCA9IGFuZHJvaWRfbmV0d29ya19sYXRlbmN5X3BhcnNlKGtEYXRhW25dLmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5fbXMsICZtYXhfbXMpOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfcmVzdWx0LCByZXN1bHQpIDw8ICIjICIgPDwgbjsKKyAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZF9tYXhfbXMsIG1heF9tcykgPDwgIiMgIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWRfbWluX21zLCBtaW5fbXMpIDw8ICIjICIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoQW5kcm9pZE5ldHdvcmtDb25zdGFudHMsIFBhcnNlTGF0ZW5jeVdpdGhOYW1lKSB7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzX2NvdW50OyArK24pIHsKKyAgICAgICAgY29uc3QgQW5kcm9pZE5ldHdvcmtMYXRlbmN5KiBlbnRyeSA9ICZhbmRyb2lkX25ldHdvcmtfbGF0ZW5jaWVzW25dOworICAgICAgICBkb3VibGUgbWluX21zID0gMC47CisgICAgICAgIGRvdWJsZSBtYXhfbXMgPSAwLjsKKyAgICAgICAgRVhQRUNUX1RSVUUoYW5kcm9pZF9uZXR3b3JrX2xhdGVuY3lfcGFyc2UoZW50cnktPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5fbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhfbXMpKTsKKyAgICAgICAgRVhQRUNUX0VRKGVudHJ5LT5taW5fbXMsIG1pbl9tcykgPDwgIiMgIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoZW50cnktPm1heF9tcywgbWF4X21zKSA8PCAiIyAiIDw8IG47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29udHJvbC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWVhNDk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29udHJvbC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29udHJvbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9nbG9iYWxzLmgiCisKK2Jvb2wgYW5kcm9pZF9uZXR3b3JrX3NldF9zcGVlZChjb25zdCBjaGFyKiBzcGVlZCkgeworICAgIGRvdWJsZSB1cGxvYWQgPSAwLiwgZG93bmxvYWQgPSAwLjsKKyAgICBpZiAoIWFuZHJvaWRfbmV0d29ya19zcGVlZF9wYXJzZShzcGVlZCwgJnVwbG9hZCwgJmRvd25sb2FkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYW5kcm9pZF9uZXRfdXBsb2FkX3NwZWVkID0gdXBsb2FkOworICAgIGFuZHJvaWRfbmV0X2Rvd25sb2FkX3NwZWVkID0gZG93bmxvYWQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhbmRyb2lkX25ldHdvcmtfc2V0X2xhdGVuY3koY29uc3QgY2hhciogbGF0ZW5jeSkgeworICAgIGRvdWJsZSBtaW5fZGVsYXlfbXMgPSAwLiwgbWF4X2RlbGF5X21zID0gMC47CisgICAgaWYgKCFhbmRyb2lkX25ldHdvcmtfbGF0ZW5jeV9wYXJzZShsYXRlbmN5LCAmbWluX2RlbGF5X21zLCAmbWF4X2RlbGF5X21zKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGFuZHJvaWRfbmV0X21pbl9sYXRlbmN5ID0gKGludCltaW5fZGVsYXlfbXM7CisgICAgYW5kcm9pZF9uZXRfbWF4X2xhdGVuY3kgPSAoaW50KW1heF9kZWxheV9tczsKKworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29udHJvbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL25ldHdvcmsvY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb250cm9sLmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBDaGFuZ2UgdGhlIGdsb2JhbCBlbXVsYXRlZCBuZXR3b3JrIHNwZWVkLiB8c3BlZWR8IGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlCisvLyByZWNvZ25pemVkIGJ5IGFuZHJvaWRfbmV0d29ya19zcGVlZF9wYXJzZSgpLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IKKy8vIGZhbHNlIG90aGVyd2lzZSAoZS5nLiBpbnZhbGlkIGZvcm1hdCkuCitib29sIGFuZHJvaWRfbmV0d29ya19zZXRfc3BlZWQoY29uc3QgY2hhciogc3BlZWQpOworCisvLyBDaGFuZ2UgdGhlIGdsb2JhbCBlbXVsYXRvciBuZXR3b3JrIGxhdGVuY3kuIHxsYXRlbmN5fCBpcyBhIHN0cmluZyB0aGF0IGNhbgorLy8gYmUgcmVjb2duaXplZCBieSBhbmRyb2lkX25ldHdvcmtfbGF0ZW5jeV9wYXJzZSgpLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywKKy8vIG9yIGZhbHNlIG90aGVyd2lzZSAoZS5nLiBpbnZhbGlkIGZvcm1hdCkuCitib29sIGFuZHJvaWRfbmV0d29ya19zZXRfbGF0ZW5jeShjb25zdCBjaGFyKiBsYXRlbmN5KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb250cm9sX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2NvbnRyb2xfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZWU3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9jb250cm9sX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9jb250cm9sLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2dsb2JhbHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIE5PVEU6IFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgQVBJLCBhY2Nlc3MgdGhlIGdsb2JhbCB2YXJpYWJsZXMgZGlyZWN0bHkKKy8vICAgICAgIHRvIGVuc3VyZSB0aGV5IHdlcmUgdXBkYXRlZCBhY2NvcmRpbmdseS4KKworVEVTVChBbmRyb2lkTmV0d29ya0NvbnRyb2wsIFNldFNwZWVkKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNwZWVkOworICAgICAgICBib29sIHJlc3VsdDsKKyAgICAgICAgZG91YmxlIGV4cGVjdGVkX3VwbG9hZDsKKyAgICAgICAgZG91YmxlIGV4cGVjdGVkX2Rvd25sb2FkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyAiIiwgdHJ1ZSwgMC4sIDAuIH0sCisgICAgICAgIHsgIjEwMDAiLCB0cnVlLCAxZTYsIDFlNiB9LAorICAgICAgICB7ICIxMDAwOjIwMDAwIiwgdHJ1ZSwgMWU2LCAyZTcgfSwKKyAgICAgICAgeyAidW5rbm93bi1zcGVlZCIsIGZhbHNlLCAwLiwgMC4gfSwKKyAgICB9OworICAgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGtEYXRhKSB7CisgICAgICAgIC8vIFNldCBpbnZhbGlkIHZhbHVlcyBiZWZvcmUgdGhlIGNhbGwuCisgICAgICAgIGFuZHJvaWRfbmV0X3VwbG9hZF9zcGVlZCA9IC0xMDAuMDsKKyAgICAgICAgYW5kcm9pZF9uZXRfZG93bmxvYWRfc3BlZWQgPSAtMjAwLjA7CisKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0ucmVzdWx0LAorICAgICAgICAgICAgICAgICAgYW5kcm9pZF9uZXR3b3JrX3NldF9zcGVlZChpdGVtLnNwZWVkKSkKKyAgICAgICAgICAgICAgICA8PCAiWyIgPDwgaXRlbS5zcGVlZCA8PCAiXSI7CisgICAgICAgIGlmIChpdGVtLnJlc3VsdCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGl0ZW0uZXhwZWN0ZWRfdXBsb2FkLCBhbmRyb2lkX25ldF91cGxvYWRfc3BlZWQpIDw8IGl0ZW0uc3BlZWQ7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaXRlbS5leHBlY3RlZF9kb3dubG9hZCwgYW5kcm9pZF9uZXRfZG93bmxvYWRfc3BlZWQpIDw8IGl0ZW0uc3BlZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoLTEwMCwgYW5kcm9pZF9uZXRfdXBsb2FkX3NwZWVkKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgtMjAwLCBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoQW5kcm9pZE5ldHdvcmtDb250cm9sLCBTZXRMYXRlbmN5KSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGRlbGF5OworICAgICAgICBib29sIHJlc3VsdDsKKyAgICAgICAgaW50IGV4cGVjdGVkX21pbl9tczsKKyAgICAgICAgaW50IGV4cGVjdGVkX21heF9tczsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgIiIsIHRydWUsIDAsIDAgfSwKKyAgICAgICAgeyAiMTAwMCIsIHRydWUsIDEwMDAsIDEwMDAgfSwKKyAgICAgICAgeyAiMTAwMDoyMDAwMCIsIHRydWUsIDEwMDAsIDIwMDAwIH0sCisgICAgICAgIHsgInVua25vd24tbGF0ZW5jeSIsIGZhbHNlLCAwLCAwIH0sCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBrRGF0YSkgeworICAgICAgICBhbmRyb2lkX25ldF9taW5fbGF0ZW5jeSA9IC0xMDA7CisgICAgICAgIGFuZHJvaWRfbmV0X21heF9sYXRlbmN5ID0gLTIwMDsKKworICAgICAgICBFWFBFQ1RfRVEoaXRlbS5yZXN1bHQsCisgICAgICAgICAgICAgICAgICBhbmRyb2lkX25ldHdvcmtfc2V0X2xhdGVuY3koaXRlbS5kZWxheSkpCisgICAgICAgICAgICA8PCAiWyIgPDwgaXRlbS5kZWxheSA8PCAiXSI7CisKKyAgICAgICAgaWYgKGl0ZW0ucmVzdWx0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaXRlbS5leHBlY3RlZF9taW5fbXMsIGFuZHJvaWRfbmV0X21pbl9sYXRlbmN5KTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkX21heF9tcywgYW5kcm9pZF9uZXRfbWF4X2xhdGVuY3kpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRVhQRUNUX0VRKC0xMDAsIGFuZHJvaWRfbmV0X21pbl9sYXRlbmN5KTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgtMjAwLCBhbmRyb2lkX25ldF9tYXhfbGF0ZW5jeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9nbG9iYWxzLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9nbG9iYWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxNGE5NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2dsb2JhbHMuYwpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9nbG9iYWxzLmgiCisKK2RvdWJsZSBhbmRyb2lkX25ldF91cGxvYWRfc3BlZWQgPSAwLjsKK2RvdWJsZSBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZCA9IDAuOworaW50IGFuZHJvaWRfbmV0X21pbl9sYXRlbmN5ID0gMDsKK2ludCBhbmRyb2lkX25ldF9tYXhfbGF0ZW5jeSA9IDA7CitpbnQgYW5kcm9pZF9uZXRfZGlzYWJsZSA9IDA7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9nbG9iYWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvbmV0d29yay9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ZWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9uZXR3b3JrL2dsb2JhbHMuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIEEgY29sbGVjdGlvbiBvZiBuZXR3b3JrLXJlbGF0ZWQgZ2xvYmFsIHZhcmlhYmxlcy4KKworLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gcmVhbCBmdW5jdGlvbiBmb3IgcHJvcGVyIG1vY2sgc3VwcG9ydCBkdXJpbmcKKy8vICAgICAgIHVuaXQtdGVzdGluZyBvZiBjbGllbnQtY29kZSB0aGF0IHVzZSB0aGVzZS4gRm9yIG5vdywgdGhpcyBpcworLy8gICAgICAgcmVhbGx5IFFFTVUtb25seSwgc28gdGhhdCdzIGxvdyBwcmlvcml0eS4KKworLy8gRW11bGF0ZWQgbmV0d29yayB1cC9kb3duIHNwZWVkcywgZXhwcmVzc2VkIGluIGJpdHMvc2Vjb25kcy4KK2V4dGVybiBkb3VibGUgYW5kcm9pZF9uZXRfdXBsb2FkX3NwZWVkOworZXh0ZXJuIGRvdWJsZSBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZDsKKworLy8gRW11bGF0ZWQgbmV0d29yayBtaW4tbWF4IGxhdGVuY3ksIGV4cHJlc3NlZCBpbiBtcy4KK2V4dGVybiBpbnQgYW5kcm9pZF9uZXRfbWluX2xhdGVuY3k7CitleHRlcm4gaW50IGFuZHJvaWRfbmV0X21heF9sYXRlbmN5OworCisvLyBHbG9iYWwgZmxhZywgd2hlbiB0cnVlLCBuZXR3b3JrIGlzIGRpc2FibGVkLgorZXh0ZXJuIGludCBhbmRyb2lkX25ldF9kaXNhYmxlOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kTGlzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDBlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nRm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyLmgiCisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBkZWZpbmUgRCguLi4pICBwcmludGYoX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lIEQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG9wZW5nbCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworRW11Z2xCYWNrZW5kTGlzdDo6RW11Z2xCYWNrZW5kTGlzdChjb25zdCBjaGFyKiBleGVjRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZ3JhbUJpdG5lc3MpIDoKKyAgICAgICAgbURlZmF1bHROYW1lKCJhdXRvIiksIG1OYW1lcygpLCBtUHJvZ3JhbUJpdG5lc3MoMCksIG1FeGVjRGlyKGV4ZWNEaXIpIHsKKyAgICAvLyBGaXggaG9zdCBiaXRuZXNzIGlmIG5lZWRlZC4KKyAgICBpZiAoIXByb2dyYW1CaXRuZXNzKSB7CisgICAgICAgIHByb2dyYW1CaXRuZXNzID0gU3lzdGVtOjpnZXQoKS0+Z2V0UHJvZ3JhbUJpdG5lc3MoKTsKKyAgICB9CisgICAgbVByb2dyYW1CaXRuZXNzID0gcHJvZ3JhbUJpdG5lc3M7CisKKyAgICBtTmFtZXMgPSBFbXVnbEJhY2tlbmRTY2FubmVyOjpzY2FuRGlyKGV4ZWNEaXIsIHByb2dyYW1CaXRuZXNzKTsKK30KKworYm9vbCBFbXVnbEJhY2tlbmRMaXN0Ojpjb250YWlucyhjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBtTmFtZXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgaWYgKG1OYW1lc1tuXSA9PSBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6c3RyaW5nIEVtdWdsQmFja2VuZExpc3Q6OmdldExpYkRpclBhdGgoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdGb3JtYXQoCisgICAgICAgICAgICAiJXMvJXMvZ2xlc18lcyIsCisgICAgICAgICAgICBtRXhlY0RpciwKKyAgICAgICAgICAgIG1Qcm9ncmFtQml0bmVzcyA9PSA2NCA/ICJsaWI2NCIgOiAibGliIiwKKyAgICAgICAgICAgIG5hbWUpOworfQorCitzdGF0aWMgY29uc3QgY2hhciBrTGliUHJlZml4W10gPSAibGliIjsKKworI2lmZGVmIF9XSU4zMgorc3RhdGljIGNvbnN0IGNoYXIga0xpYlN1ZmZpeFtdID0gIi5kbGwiOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCitzdGF0aWMgY29uc3QgY2hhciBrTGliU3VmZml4W10gPSAiLmR5bGliIjsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciBrTGliU3VmZml4W10gPSAiLnNvIjsKKyNlbmRpZgorCitzdGQ6OnN0cmluZyBFbXVnbEJhY2tlbmRMaXN0OjpnZXRHTEVTMTJUcmFuc2xhdG9yTGliTmFtZSgpIHsKKworICAgIHN0ZDo6c3RyaW5nIHJlcyhrTGliUHJlZml4KTsKKworICAgIGlmIChtUHJvZ3JhbUJpdG5lc3MgPT0gNjQpIHsKKyAgICAgICAgcmVzICs9ICI2NCI7CisgICAgfQorCisgICAgcmVzICs9IGtHTEVTMTJUcmFuc2xhdG9yTmFtZTsKKworICAgIHJlcyArPSBrTGliU3VmZml4OworICAgIHJldHVybiByZXM7Cit9CisKK2Jvb2wgRW11Z2xCYWNrZW5kTGlzdDo6Z2V0QmFja2VuZExpYlBhdGgoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlicmFyeSBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogbGliUGF0aCkgeworCisgICAgY29uc3QgY2hhciogbGlicmFyeU5hbWUgPSBOVUxMOworICAgIGlmIChsaWJyYXJ5ID09IExJQlJBUllfRUdMKSB7CisgICAgICAgIGxpYnJhcnlOYW1lID0gIkVHTCI7CisgICAgfSBlbHNlIGlmIChsaWJyYXJ5ID09IExJQlJBUllfR0xFU3YxKSB7CisgICAgICAgIGxpYnJhcnlOYW1lID0gIkdMRVNfQ00iOworICAgIH0gZWxzZSBpZiAobGlicmFyeSA9PSBMSUJSQVJZX0dMRVN2MikgeworICAgICAgICBsaWJyYXJ5TmFtZSA9ICJHTEVTdjIiOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICBEKCIlczogSW52YWxpZCBsaWJyYXJ5IHR5cGU6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGxpYnJhcnkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdCgKKyAgICAgICAgICAgICIlcy8lcyVzJXMiLAorICAgICAgICAgICAgZ2V0TGliRGlyUGF0aChuYW1lKSwKKyAgICAgICAgICAgIGtMaWJQcmVmaXgsCisgICAgICAgICAgICBsaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgIGtMaWJTdWZmaXgpOworCisgICAgaWYgKCFTeXN0ZW06OmdldCgpLT5wYXRoSXNGaWxlKHBhdGgpKSB7CisgICAgICAgIEQoIiVzKG5hbWU9JXMgbGliPSVzKTogRmlsZSBkb2VzIG5vdCBleGlzdDogJXNcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCBuYW1lLCBsaWJyYXJ5TmFtZSwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqbGliUGF0aCA9IHBhdGg7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvcGVuZ2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzhjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugb3BlbmdsIHsKKworY29uc3QgY2hhciBrR0xFUzEyVHJhbnNsYXRvck5hbWVbXSA9ICJHTEVTMTJUcmFuc2xhdG9yIjsKKworY2xhc3MgRW11Z2xCYWNrZW5kTGlzdCB7CitwdWJsaWM6CisgICAgLy8gUGFyc2UgdGhlIGNvbnRlbnQgb2YgfGV4ZWNEaXJ8LzxsaWI+LyBmb3IgRW11Z2wgYmFja2VuZHMuCisgICAgLy8gfHByb2dyYW1CaXRuZXNzfCBjYW4gYmUgMCAoYXV0b2RldGVjdCksIDMyIG9yIDY0LCBhbmQgZGV0ZXJtaW5lcworICAgIC8vIHRoZSB2YWx1ZSBvZiA8bGliPiB3aGljaCB3aWxsIGJlICdsaWInIGZvciAzMi1iaXQgc3lzdGVtcywKKyAgICAvLyBhbmQgJ2xpYjY0JyBmb3IgNjQtYml0IG9uZXMuCisgICAgRW11Z2xCYWNrZW5kTGlzdChjb25zdCBjaGFyKiBleGVjRGlyLCBpbnQgcHJvZ3JhbUJpdG5lc3MpOworCisgICAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IEVtdWdsIGJhY2tlbmQuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRlZmF1bHROYW1lKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHROYW1lOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIEVtdWdsIGJhY2tlbmRzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbmFtZXMoKSBjb25zdCB7IHJldHVybiBtTmFtZXM7IH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8bmFtZXwgaXMgcGFydCBvZiBuYW1lcygpLgorICAgIGJvb2wgY29udGFpbnMoY29uc3QgY2hhciogbmFtZSkgY29uc3Q7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBuYW1lIG9mIGFuIEVtdWdsIGJhY2tlbmQgaW50byB0aGUgcGF0aCBvZiB0aGUKKyAgICAvLyBjb3JyZXNwb25kaW5nIHN1Yi1kaXJlY3RvcnksIGlmIGl0IGV4aXRzLCBvciBOVUxMIG90aGVyd2lzZS4KKyAgICBzdGQ6OnN0cmluZyBnZXRMaWJEaXJQYXRoKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgc3RkOjpzdHJpbmcgZ2V0R0xFUzEyVHJhbnNsYXRvckxpYk5hbWUoKTsKKworICAgIC8vIExpc3Qgb2Ygc3VwcG9ydGVkIEVtdWdsIHNoYXJlZCBsaWJyYXJpZXMuCisgICAgZW51bSBMaWJyYXJ5IHsKKyAgICAgICAgTElCUkFSWV9OT05FLAorICAgICAgICBMSUJSQVJZX0VHTCwKKyAgICAgICAgTElCUkFSWV9HTEVTdjEsCisgICAgICAgIExJQlJBUllfR0xFU3YyLAorICAgICAgICBMSUJSQVJZX0dMRVMxMlRSCisgICAgfTsKKworICAgIC8vIFByb2JlIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSBmb3IgRW11Z2wgYmFja2VuZCB8bmFtZXwgYW5kIHJldHVybgorICAgIC8vIHRoZSBwYXRoIG9mIG9uZSBvZiB0aGUgRW11R0wgc2hhcmVkIGxpYnJhcmllcyBmb3IgaXQuIFRoZSByZXN1bHQKKyAgICAvLyB3aWxsIGJlIGVtcHR5IGlmIHRoZXJlIGlzIG5vIHN1Y2ggbGlicmFyeS4KKyAgICAvLyB8bGlicmFyeXwgaXMgYSBsaWJyYXJ5IHR5cGUuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlIGFuZCBzZXRzCisgICAgLy8gfCpsaWJQYXRofCB0byB0aGUgbGlicmFyeSdzIHBhdGggdmFsdWUuIE9uIGZhaWx1cmUsIHJldHVybiBmYWxzZS4KKyAgICBib29sIGdldEJhY2tlbmRMaWJQYXRoKGNvbnN0IGNoYXIqIG5hbWUsIExpYnJhcnkgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBsaWJQYXRoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtRGVmYXVsdE5hbWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1OYW1lczsKKyAgICBpbnQgbVByb2dyYW1CaXRuZXNzOworICAgIHN0ZDo6c3RyaW5nIG1FeGVjRGlyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG9wZW5nbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kTGlzdF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3RfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjRkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3RfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTMyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBvcGVuZ2wgeworCisjZGVmaW5lIEFSUkFZTEVOKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGVzdFRlbXBEaXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0U3lzdGVtOworCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUxpYlN1YlBhdGgoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBTdHJpbmdGb3JtYXQoImZvby8lcy8lcyIsIFN5c3RlbTo6a0xpYlN1YkRpciwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VMaWJTdWJEaXIoVGVzdFRlbXBEaXIqIGRpciwgY29uc3QgY2hhciogbmFtZSkgeworICAgIGRpci0+bWFrZVN1YkRpcihtYWtlTGliU3ViUGF0aChuYW1lKS5jX3N0cigpKTsKK30KKworc3RhdGljIHZvaWQgbWFrZUxpYlN1YkZpbGUoVGVzdFRlbXBEaXIqIGRpciwgY29uc3QgY2hhciogbmFtZSkgeworICAgIGRpci0+bWFrZVN1YkZpbGUobWFrZUxpYlN1YlBhdGgobmFtZSkuY19zdHIoKSk7Cit9CisKK1RFU1QoRW11Z2xCYWNrZW5kTGlzdCwgaW5pdCkgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIFRlc3RUZW1wRGlyKiBteURpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28iKTsKKworICAgIG1ha2VMaWJTdWJEaXIobXlEaXIsICIiKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19maXJzdCIpOworICAgIG1ha2VMaWJTdWJGaWxlKG15RGlyLCAiZ2xlc19zZWNvbmQiKTsgIC8vIHNob3VsZCBiZSBpZ25vcmVkIChmaWxlKS4KKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc18iKTsgIC8vIHNob3VsZCBiZSBpZ25vcmVkIChubyBuYW1lKS4KKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19mb3VydGgiKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19maWZ0aCIpOworCisgICAgRW11Z2xCYWNrZW5kTGlzdCBsaXN0KCJmb28iLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcyk7CisKKyAgICAvLyBOT1RFOiBNdXN0IGFwcGVhciBpbiBhbHBoYWJldGljYWwgb3JkZXIKKyAgICBjb25zdCBjaGFyKiBjb25zdCBrRXhwZWN0ZWRbXSA9IHsKKyAgICAgICAgImZpZnRoIiwgImZpcnN0IiwgImZvdXJ0aCIsCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0V4cGVjdGVkTGVuID0gQVJSQVlMRU4oa0V4cGVjdGVkKTsKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbmFtZXMgPSBsaXN0Lm5hbWVzKCk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oa0V4cGVjdGVkTGVuKSwgbmFtZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtFeHBlY3RlZExlbjsgKytuKSB7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRXhwZWN0ZWRbbl0sIG5hbWVzW25dLmNfc3RyKCkpIDw8ICIjIiA8PCBuOworICAgICAgICBFWFBFQ1RfVFJVRShsaXN0LmNvbnRhaW5zKGtFeHBlY3RlZFtuXSkpOworICAgIH0KK30KKworVEVTVChFbXVnbEJhY2tlbmRMaXN0LCBnZXRCYWNrZW5kTGliUGF0aCkgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIFRlc3RUZW1wRGlyKiBteURpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28iKTsKKworICAgIG1ha2VMaWJTdWJEaXIobXlEaXIsICIiKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19iYXIiKTsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBFbXVnbEJhY2tlbmRMaXN0OjpMaWJyYXJ5IGxpYnJhcnk7CisgICAgICAgIGNvbnN0IGNoYXIqIGxpYk5hbWU7CisgICAgfSBrRGF0YVtdID0geworI2lmZGVmIF9XSU4zMgorICAgICAgICB7IEVtdWdsQmFja2VuZExpc3Q6OkxJQlJBUllfRUdMLCAibGliRUdMLmRsbCIgfSwKKyAgICAgICAgeyBFbXVnbEJhY2tlbmRMaXN0OjpMSUJSQVJZX0dMRVN2MSwgImxpYkdMRVNfQ00uZGxsIiB9LAorICAgICAgICB7IEVtdWdsQmFja2VuZExpc3Q6OkxJQlJBUllfR0xFU3YyLCAibGliR0xFU3YyLmRsbCIgfSwKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICB7IEVtdWdsQmFja2VuZExpc3Q6OkxJQlJBUllfRUdMLCAibGliRUdMLmR5bGliIiB9LAorICAgICAgICB7IEVtdWdsQmFja2VuZExpc3Q6OkxJQlJBUllfR0xFU3YxLCAibGliR0xFU19DTS5keWxpYiIgfSwKKyAgICAgICAgeyBFbXVnbEJhY2tlbmRMaXN0OjpMSUJSQVJZX0dMRVN2MiwgImxpYkdMRVN2Mi5keWxpYiIgfSwKKyNlbHNlCisgICAgICAgIHsgRW11Z2xCYWNrZW5kTGlzdDo6TElCUkFSWV9FR0wsICJsaWJFR0wuc28iIH0sCisgICAgICAgIHsgRW11Z2xCYWNrZW5kTGlzdDo6TElCUkFSWV9HTEVTdjEsICJsaWJHTEVTX0NNLnNvIiB9LAorICAgICAgICB7IEVtdWdsQmFja2VuZExpc3Q6OkxJQlJBUllfR0xFU3YyLCAibGliR0xFU3YyLnNvIiB9LAorI2VuZGlmCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBBUlJBWUxFTihrRGF0YSk7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhTGVuOyArK24pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZmlsZSA9ICJnbGVzX2Jhci8iOworICAgICAgICBmaWxlICs9IGtEYXRhW25dLmxpYk5hbWU7CisgICAgICAgIG1ha2VMaWJTdWJGaWxlKG15RGlyLCBmaWxlLmNfc3RyKCkpOworICAgIH0KKworICAgIEVtdWdsQmFja2VuZExpc3QgbGlzdCgiZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbmFtZXMgPSBsaXN0Lm5hbWVzKCk7CisKKyAgICBFWFBFQ1RfRVEoMVUsIG5hbWVzLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBuYW1lc1swXS5jX3N0cigpKTsKKworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFMZW47ICsrbikgeworICAgICAgICBzdGQ6OnN0cmluZyBleHBlY3RlZCA9IFN0cmluZ0Zvcm1hdCgiZm9vLyVzL2dsZXNfYmFyLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjprTGliU3ViRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS5saWJOYW1lKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGliZGlyOworICAgICAgICBFWFBFQ1RfVFJVRShsaXN0LmdldEJhY2tlbmRMaWJQYXRoKCJiYXIiLCBrRGF0YVtuXS5saWJyYXJ5LCAmbGliZGlyKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGxpc3QuY29udGFpbnMoImJhciIpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGxpc3QuY29udGFpbnMoImZvbyIpKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmNfc3RyKCksIGxpYmRpci5jX3N0cigpKTsKKyAgICB9Cit9CisKK1RFU1QoRW11Z2xCYWNrZW5kLCBkZWZhdWx0TmFtZSkgeworICAgIEVtdWdsQmFja2VuZExpc3QgbGlzdCgiZm9vIiwgMCk7CisgICAgRVhQRUNUX1NUUkVRKCJhdXRvIiwgbGlzdC5kZWZhdWx0TmFtZSgpLmNfc3RyKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugb3BlbmdsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kU2Nhbm5lci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZFNjYW5uZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTg2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZFNjYW5uZXIuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kU2Nhbm5lci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugb3BlbmdsIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nRm9ybWF0OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCisvLyBzdGF0aWMKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBFbXVnbEJhY2tlbmRTY2FubmVyOjpzY2FuRGlyKGNvbnN0IGNoYXIqIGV4ZWNEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZ3JhbUJpdG5lc3MpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXM7CisKKyAgICBpZiAoIWV4ZWNEaXIgfHwgIVN5c3RlbTo6Z2V0KCktPnBhdGhFeGlzdHMoZXhlY0RpcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBleGVjdXRhYmxlIGRpcmVjdG9yeTogIiA8PCBleGVjRGlyOworICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgfQorICAgIGlmICghcHJvZ3JhbUJpdG5lc3MpIHsKKyAgICAgICAgcHJvZ3JhbUJpdG5lc3MgPSBTeXN0ZW06OmdldCgpLT5nZXRQcm9ncmFtQml0bmVzcygpOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBzdWJkaXIgPSAocHJvZ3JhbUJpdG5lc3MgPT0gNjQpID8gImxpYjY0IiA6ICJsaWIiOworICAgIHN0ZDo6c3RyaW5nIHN1YkRpciA9IFN0cmluZ0Zvcm1hdCgiJXMvJXMvIiwgZXhlY0Rpciwgc3ViZGlyKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlbnRyaWVzID0gU3lzdGVtOjpnZXQoKS0+c2NhbkRpckVudHJpZXMoc3ViRGlyKTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtCYWNrZW5kUHJlZml4W10gPSAiZ2xlc18iOworICAgIGNvbnN0IHNpemVfdCBrQmFja2VuZFByZWZpeFNpemUgPSBzaXplb2Yoa0JhY2tlbmRQcmVmaXgpIC0gMVU7CisKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGVudHJpZXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVudHJ5ID0gZW50cmllc1tuXTsKKyAgICAgICAgaWYgKGVudHJ5LnNpemUoKSA8PSBrQmFja2VuZFByZWZpeFNpemUgfHwKKyAgICAgICAgICAgIG1lbWNtcChlbnRyeS5jX3N0cigpLCBrQmFja2VuZFByZWZpeCwga0JhY2tlbmRQcmVmaXhTaXplKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGF0IGl0IGlzIGEgZGlyZWN0b3J5LgorICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2RpciA9IFN0cmluZ0Zvcm1hdCgiJXMvJXMiLCBzdWJEaXIuY19zdHIoKSwgZW50cnkuY19zdHIoKSk7CisgICAgICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cGF0aElzRGlyKGZ1bGxfZGlyKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbmFtZXMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKGVudHJ5LmNfc3RyKCkgKyBrQmFja2VuZFByZWZpeFNpemUpKTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIHNvcnQgdGhlIGJhY2tlbmRzIGluIGNvbnNpc3RlbnQgb3JkZXIuCisgICAgc3RkOjpzb3J0KG5hbWVzLmJlZ2luKCksIG5hbWVzLmVuZCgpKTsKKworICAgIHJldHVybiBuYW1lczsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9wZW5nbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kU2Nhbm5lci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwODI1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvRW11Z2xCYWNrZW5kU2Nhbm5lci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBvcGVuZ2wgeworCitjbGFzcyBFbXVnbEJhY2tlbmRTY2FubmVyIHsKK3B1YmxpYzoKKy8vIFNjYW4gfGV4ZWNEaXJ8IGZvciBzdWItZGlyZWN0b3JpZXMgbmFtZWQgbGlrZSA8bGliPi9nbGVzXzxuYW1lPiB3aGVyZQorLy8gPGxpYj4gaXMgZWl0aGVyICdsaWInIG9yICdsaWI2NCcgZGVwZW5kaW5nIG9uIGN1cnJlbnQgaG9zdCBiaXRuZXNzLAorLy8gYW5kIDxuYW1lPiBpcyBhbiBhcmJpdHJhcnkgbmFtZXMuIFJldHVybnMgYSB2ZWN0b3Igb2YgbWF0Y2hpbmcgPG5hbWU+CisvLyBzdHJpbmdzLCB3aGljaCB3aWxsIGJlIGVtcHR5IG9uIGVycm9yLgorLy8gSWYgfHByb2dyYW1CaXRuZXNzfCBpcyAwLCB0aGUgdGhpcyB3aWxsIHVzZSB0aGUgY3VycmVudCBwcm9ncmFtCisvLyBiaXRuZXNzLCBvdGhlcndpc2UgdGhlIHZhbHVlIG11c3QgYmUgZWl0aGVyIDMyIG9yIDY0LgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2NhbkRpcihjb25zdCBjaGFyKiBleGVjRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZ3JhbUJpdG5lc3MgPSAwKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBvcGVuZ2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZFNjYW5uZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU3NjExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9FbXVnbEJhY2tlbmRTY2FubmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0VGVtcERpci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpUZXN0U3lzdGVtOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGVzdFRlbXBEaXI7CisKK3N0YXRpYyB2b2lkIG1ha2VfZGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX0VRKDAsIDo6bWtkaXIocGF0aC5jX3N0cigpKSk7CisjZWxzZQorICAgIEVYUEVDVF9FUSgwLCA6Om1rZGlyKHBhdGguY19zdHIoKSwgMDc1NSkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIG1ha2Vfc3ViZGlyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBjaGFyKiBzdWJkaXIpIHsKKyAgICBzdGQ6OnN0cmluZyBkaXIgPSBwYXRoOworICAgIGRpci5hcHBlbmQoIi8iKTsKKyAgICBkaXIuYXBwZW5kKHN1YmRpcik7CisgICAgbWFrZV9kaXIoZGlyKTsKK30KKworc3RhdGljIHZvaWQgbWFrZV9zdWJmaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIsIGNvbnN0IGNoYXIqIGZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gZGlyOworICAgIHBhdGguYXBwZW5kKCIvIik7CisgICAgcGF0aC5hcHBlbmQoZmlsZSk7CisgICAgaW50IGZkID0gOjpvcGVuKHBhdGguY19zdHIoKSwgT19XUk9OTFl8T19DUkVBVCwgMDc1NSk7CisgICAgRVhQRUNUX0dFKGZkLCAwKTsKKyAgICA6OmNsb3NlKGZkKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG9wZW5nbCB7CisKK1RFU1QoRW11Z2xCYWNrZW5kU2Nhbm5lciwgbm9MaWJEaXIpIHsKKyAgICBUZXN0VGVtcERpciBteURpcigiZW11Z2xfYmFja2VuZF9zY2FubmVyIik7CisgICAgLy8gRG9uJ3QgY3JlYXRlIGFueSBmaWxlcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lcyA9IEVtdWdsQmFja2VuZFNjYW5uZXI6OnNjYW5EaXIobXlEaXIucGF0aCgpKTsKKyAgICBFWFBFQ1RfVFJVRShuYW1lcy5lbXB0eSgpKTsKK30KKworVEVTVChFbXVnbEJhY2tlbmRTY2FubmVyLCBub0JhY2tlbmRzKSB7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoImVtdWdsX2JhY2tlbmRfc2Nhbm5lciIpOworICAgIC8vIENyZWF0ZSBsaWIgZGlyZWN0b3J5LgorICAgIHN0ZDo6c3RyaW5nIGxpYkRpcihteURpci5wYXRoKCkpOworICAgIGxpYkRpciArPSAiLyI7CisgICAgbGliRGlyICs9IFN5c3RlbTo6a0xpYlN1YkRpcjsKKyAgICBtYWtlX2RpcihsaWJEaXIpOworCisgICAgLy8gRG9uJ3QgY3JlYXRlIGFueSBmaWxlcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lcyA9IEVtdWdsQmFja2VuZFNjYW5uZXI6OnNjYW5EaXIobXlEaXIucGF0aCgpKTsKKyAgICBFWFBFQ1RfVFJVRShuYW1lcy5lbXB0eSgpKTsKK30KKworVEVTVChFbXVnbEJhY2tlbmRTY2FubmVyLCBsaXN0QmFja2VuZHMpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoImZvbyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICBUZXN0VGVtcERpciogbXlEaXIgPSB0ZXN0U3lzLmdldFRlbXBSb290KCk7CisKKyAgICAvLyBDcmVhdGUgbGliIGRpcmVjdG9yeS4KKyAgICBzdGQ6OnN0cmluZyBsaWJEaXIobXlEaXItPnBhdGgoKSk7CisgICAgbGliRGlyICs9ICIvZm9vLyI7CisgICAgbWFrZV9kaXIobGliRGlyKTsKKyAgICBsaWJEaXIgKz0gU3lzdGVtOjprTGliU3ViRGlyOworICAgIG1ha2VfZGlyKGxpYkRpcik7CisKKyAgICAvLyBDcmVhdGUgZmlyc3QgYmFja2VuZCBzdWItZGlyZWN0b3J5LgorCisgICAgLy8gdG8gYmUgaWdub3JlZCwgZG9lc24ndCBiZWdpbiB3aXRoICdnbGVzXycKKyAgICBtYWtlX3N1YmRpcihsaWJEaXIsICJmaXJzdCIpOworCisgICAgLy8gc2Vjb25kIGVudHJ5IGZvciB0aGUgYmFja2VuZCBuYW1lZCAnc2Vjb25kJworICAgIG1ha2Vfc3ViZGlyKGxpYkRpciwgImdsZXNfc2Vjb25kIik7CisKKyAgICAvLyBzaG91bGQgYmUgaWdub3JlZCwgbXVzdCBoYXZlIHNvbWV0aGluZyBhZnRlciAnZ2xlc18nIHByZWZpeC4KKyAgICBtYWtlX3N1YmRpcihsaWJEaXIsICJnbGVzXyIpOworCisgICAgLy8gc2hvdWxkIGJlIGlnbm9yZWQ6IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5LgorICAgIG1ha2Vfc3ViZmlsZShsaWJEaXIsICJnbGVzX2ZvdXJ0aCIpOworCisgICAgLy8gc2hvdWxkIGJlIHRoZSBmaXJzdCByZXR1cm5lZCBiYWNrZW5kLCBkdWUgdG8gYWxwaGFiZXRpY2FsIG9yZGVyLgorICAgIG1ha2Vfc3ViZGlyKGxpYkRpciwgImdsZXNfZmlmdGgiKTsKKworICAgIC8vIHNob3VsZCBiZSByZXR1cm5lZCBhcyB0aGUgdGhpcmQgYmFja2VuZCwgZHVlIHRvIGFscGhhYmV0aWNhbCBvcmRlci4KKyAgICBtYWtlX3N1YmRpcihsaWJEaXIsICJnbGVzX3NpeHRoIik7CisKKyAgICAvLyBOb3cgY2hlY2sgdGhlIHNjYW5uZXIKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXMgPSBFbXVnbEJhY2tlbmRTY2FubmVyOjpzY2FuRGlyKCJmb28iKTsKKyAgICBBU1NFUlRfRVEoM1UsIG5hbWVzLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmaWZ0aCIsIG5hbWVzWzBdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgic2Vjb25kIiwgbmFtZXNbMV0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJzaXh0aCIsIG5hbWVzWzJdLmNfc3RyKCkpOworfQorCitURVNUKEVtdWdsQmFja2VuZFNjYW5uZXIsIGxpc3RCYWNrZW5kc1dpdGhQcm9ncmFtQml0bmVzcykgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiZm9vIiwgMzIpOworICAgIFRlc3RUZW1wRGlyKiBteURpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28iKTsKKyAgICBteURpci0+bWFrZVN1YkRpcigiZm9vL2xpYiIpOworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28vbGliL2dsZXNfZmlyc3QiKTsKKyAgICBteURpci0+bWFrZVN1YkRpcigiZm9vL2xpYi9nbGVzX3NlY29uZCIpOworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28vbGliL2dsZXNfdGhpcmQiKTsKKworICAgIG15RGlyLT5tYWtlU3ViRGlyKCJmb28vbGliNjQiKTsKKyAgICBteURpci0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L2dsZXNfZm91cnRoIik7CisgICAgbXlEaXItPm1ha2VTdWJEaXIoImZvby9saWI2NC9nbGVzX2ZpZnRoIik7CisgICAgbXlEaXItPm1ha2VTdWJEaXIoImZvby9saWI2NC9nbGVzX3NpeHRoIik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZXMgPSBFbXVnbEJhY2tlbmRTY2FubmVyOjpzY2FuRGlyKCJmb28iLCAzMik7CisgICAgQVNTRVJUX0VRKDNVLCBuYW1lcy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiZmlyc3QiLCBuYW1lc1swXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInNlY29uZCIsIG5hbWVzWzFdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgidGhpcmQiLCBuYW1lc1syXS5jX3N0cigpKTsKKworICAgIG5hbWVzID0gRW11Z2xCYWNrZW5kU2Nhbm5lcjo6c2NhbkRpcigiZm9vIiwgNjQpOworICAgIEFTU0VSVF9FUSgzVSwgbmFtZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZpZnRoIiwgbmFtZXNbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb3VydGgiLCBuYW1lc1sxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoInNpeHRoIiwgbmFtZXNbMl0uY19zdHIoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvcGVuZ2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0dMUHJvY2Vzc1BpcGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HTFByb2Nlc3NQaXBlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ0ODU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HTFByb2Nlc3NQaXBlLmNwcApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0FuZHJvaWRQaXBlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbGVzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG9wZW5nbCB7CisKK25hbWVzcGFjZSB7CisKKy8vIEdMUHJvY2Vzc1BpcGUgaXMgYSBwaXBlIHNlcnZpY2UgdGhhdCBpcyB1c2VkIGZvciByZWxlYXNpbmcgZ3JhcGhpY3MgcmVzb3VyY2VzCisvLyBwZXIgZ3Vlc3QgcHJvY2Vzcy4gQXQgdGhlIHRpbWUgYmVpbmcsIGd1ZXN0IHByb2Nlc3NlcyBjYW4gYWNxdWlyZXMgaG9zdCBjb2xvcgorLy8gYnVmZmVyIGhhbmRsZXMgLyBFR0xJbWFnZSBoYW5kbGVzIGFuZCB0aGV5IG5lZWQgdG8gYmUgcHJvcGVybHkgcmVsZWFzZWQgd2hlbgorLy8gZ3Vlc3QgcHJvY2VzcyBleGl0cyB1bmV4cGVjdGVkbHkuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBkZXRlY3QgaWYgZ3Vlc3QKKy8vIHByb2Nlc3MgZXhpdHMsIHNvIHRoYXQgYSBwcm9wZXIgY2xlYW51cCBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkLgorCisvLyBJdCBpcyBkb25lIGJ5IHNldHRpbmcgdXAgYSBwaXBlIHBlciBndWVzdCBwcm9jZXNzIGJlZm9yZSBhY3F1aXJpbmcgY29sb3IKKy8vIGJ1ZmZlciBoYW5kbGVzLiBXaGVuIGd1ZXN0IHByb2Nlc3MgZXhpdHMsIHRoZSBwaXBlIHdpbGwgYmUgY2xvc2VkLCBhbmQKKy8vIG9uR3Vlc3RDbG9zZSgpIHdpbGwgdHJpZ2dlciB0aGUgY2xlYW51cCBwYXRoLgorCitjbGFzcyBHTFByb2Nlc3NQaXBlIDogcHVibGljIEFuZHJvaWRQaXBlIHsKK3B1YmxpYzoKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFRoZSBwaXBlIHNlcnZpY2UgY2xhc3MgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgY2xhc3MgU2VydmljZSA6IHB1YmxpYyBBbmRyb2lkUGlwZTo6U2VydmljZSB7CisgICAgcHVibGljOgorICAgICAgICBTZXJ2aWNlKCkgOiBBbmRyb2lkUGlwZTo6U2VydmljZSgiR0xQcm9jZXNzUGlwZSIpIHt9CisKKyAgICAgICAgdmlydHVhbCBBbmRyb2lkUGlwZSogY3JlYXRlKHZvaWQqIG1Id1BpcGUsIGNvbnN0IGNoYXIqIGFyZ3MpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR0xQcm9jZXNzUGlwZShtSHdQaXBlLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBHTFByb2Nlc3NQaXBlKHZvaWQqIGh3UGlwZSwgU2VydmljZSogc2VydmljZSkgOiBBbmRyb2lkUGlwZShod1BpcGUsIHNlcnZpY2UpIHsKKyAgICAgICAgbV91bmlxdWVJZCA9ICsrc19oZWFkSWQ7CisgICAgfQorCisgICAgdm9pZCBvbkd1ZXN0Q2xvc2UoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIHByb2Nlc3MgZGllZCBvbiB0aGUgZ3Vlc3QsIGNsZWFudXAgZ3JhbGxvYyBtZW1vcnkgb24gdGhlIGhvc3QKKyAgICAgICAgYW5kcm9pZF9jbGVhbnVwUHJvY0dMT2JqZWN0cyhtX3VuaXF1ZUlkKTsKKyAgICB9CisgICAgdW5zaWduZWQgb25HdWVzdFBvbGwoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBQSVBFX1BPTExfSU4gfCBQSVBFX1BPTExfT1VUOworICAgIH0KKyAgICBpbnQgb25HdWVzdFJlY3YoQW5kcm9pZFBpcGVCdWZmZXIqIGJ1ZmZlcnMsIGludCBudW1CdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIGFzc2VydChidWZmZXJzWzBdLnNpemUgPj0gOCk7CisgICAgICAgIG1lbWNweShidWZmZXJzWzBdLmRhdGEsIChjb25zdCBjaGFyKikmbV91bmlxdWVJZCwgc2l6ZW9mKG1fdW5pcXVlSWQpKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZihtX3VuaXF1ZUlkKTsKKyAgICB9CisgICAgaW50IG9uR3Vlc3RTZW5kKGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRoZSBndWVzdCBpcyBzdXBwb3NlZCB0byBzZW5kIHVzIGEgY29uZmlybSBjb2RlIGZpcnN0LiBUaGUgY29kZSBpcworICAgICAgICAvLyAxMDAgKDQgYnl0ZSBpbnRlZ2VyKS4KKyAgICAgICAgYXNzZXJ0KGJ1ZmZlcnNbMF0uc2l6ZSA+PSA0KTsKKyAgICAgICAgaW50MzJfdCBjb25maXJtSW50ID0gKigoaW50MzJfdCopYnVmZmVyc1swXS5kYXRhKTsKKyAgICAgICAgYXNzZXJ0KGNvbmZpcm1JbnQgPT0gMTAwKTsKKyAgICAgICAgKHZvaWQpY29uZmlybUludDsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbMF0uc2l6ZTsKKyAgICB9CisgICAgdm9pZCBvbkd1ZXN0V2FudFdha2VPbihpbnQgZmxhZ3MpIG92ZXJyaWRlIHt9Citwcml2YXRlOgorICAgIC8vIEFuIGlkZW50aWZpZXIgZm9yIHRoZSBndWVzdCBwcm9jZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwaXBlLgorICAgIC8vIFdpdGggdmVyeSBoaWdoIHByb2JhYmlsaXR5LCBhbGwgY3VycmVudGx5LWFjdGl2ZSBwcm9jZXNzZXMgaGF2ZSB1bmlxdWUKKyAgICAvLyBpZGVudGlmaWVycywgc2luY2UgdGhlIElEcyBhcmUgYXNzaWduZWQgc2VxdWVudGlhbGx5IGZyb20gYSA2NC1iaXQgSUQKKyAgICAvLyBzcGFjZS4KKyAgICAvLyBQbGVhc2UgY2hhbmdlIGl0IGlmIHlvdSBldmVyIGhhdmUgYSB1c2UgY2FzZSB0aGF0IGV4aGF1c3RzIHRoZW0KKyAgICB1aW50NjRfdCBtX3VuaXF1ZUlkOworICAgIHN0YXRpYyBzdGQ6OmF0b21pY191bGxvbmcgc19oZWFkSWQ7Cit9OworCitzdGQ6OmF0b21pY191bGxvbmcgR0xQcm9jZXNzUGlwZTo6c19oZWFkSWQoMCk7CisKK30KKwordm9pZCByZWdpc3RlckdMUHJvY2Vzc1BpcGVTZXJ2aWNlKCkgeworICAgIGFuZHJvaWQ6OkFuZHJvaWRQaXBlOjpTZXJ2aWNlOjphZGQobmV3IEdMUHJvY2Vzc1BpcGU6OlNlcnZpY2UoKSk7Cit9CisKK30KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR0xQcm9jZXNzUGlwZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HTFByb2Nlc3NQaXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzZDgxZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR0xQcm9jZXNzUGlwZS5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBvcGVuZ2wgeworCisvLyByZWdpc3RlckdMUHJvY2Vzc1BpcGVTZXJ2aWNlKCkgcmVnaXN0ZXJzIGEgIkdMUHJvY2Vzc1BpcGUiIHBpcGUgc2VydmljZSB0aGF0IGlzCisvLyB1c2VkIHRvIGRldGVjdCBHTCBwcm9jZXNzIGV4aXRzLgordm9pZCByZWdpc3RlckdMUHJvY2Vzc1BpcGVTZXJ2aWNlKCk7CisKK30gIC8vIG5hbWVzcGFjZSBvcGVuZ2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR3B1RnJhbWVCcmlkZ2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MjNiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR3B1RnJhbWVCcmlkZ2UuY3BwCkBAIC0wLDAgKzEsMTU5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCisjdW5kZWYgRVJST1IKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugb3BlbmdsIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TG9vcGVyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6TWVzc2FnZUNoYW5uZWw7CisKK25hbWVzcGFjZSB7CisKKy8vIEEgc21hbGwgc3RydWN0dXJlIHRvIG1vZGVsIGEgc2luZ2xlIGZyYW1lIG9mIHRoZSBHUFUgZGlzcGxheSwKKy8vIGFzIHBhc3NlZCBiZXR3ZWVuIHRoZSBFbXVHTCBhbmQgbWFpbiBsb29wIHRocmVhZC4KK3N0cnVjdCBGcmFtZSB7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgdm9pZCogcGl4ZWxzOworCisgICAgRnJhbWUoaW50IHcsIGludCBoLCBjb25zdCB2b2lkKiBwaXhlbHMpIDoKKyAgICAgICAgICAgIHdpZHRoKHcpLCBoZWlnaHQoaCksIHBpeGVscyhOVUxMKSB7CisgICAgICAgIHRoaXMtPnBpeGVscyA9IDo6Y2FsbG9jKHcgKiA0LCBoKTsKKyAgICAgICAgOjptZW1jcHkodGhpcy0+cGl4ZWxzLCBwaXhlbHMsIHcgKiA0ICogaCk7CisgICAgfQorCisgICAgfkZyYW1lKCkgeworICAgICAgICA6OmZyZWUocGl4ZWxzKTsKKyAgICB9Cit9OworCisvLyBSZWFsIGltcGxlbWVudGF0aW9uIG9mIEdwdUZyYW1lQnJpZGdlIGludGVyZmFjZS4KK2NsYXNzIEJyaWRnZSA6IHB1YmxpYyBHcHVGcmFtZUJyaWRnZSB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgQnJpZGdlKExvb3BlciogbG9vcGVyLCBDYWxsYmFjayogY2FsbGJhY2ssIHZvaWQqIGNhbGxiYWNrT3BhcXVlKSA6CisgICAgICAgICAgICBHcHVGcmFtZUJyaWRnZSgpLAorICAgICAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICAgICAgbUluU29ja2V0KC0xKSwKKyAgICAgICAgICAgIG1PdXRTb2NrZXQoLTEpLAorICAgICAgICAgICAgbUZkV2F0Y2goTlVMTCksCisgICAgICAgICAgICBtRnJhbWVzKCksCisgICAgICAgICAgICBtQ2FsbGJhY2soY2FsbGJhY2spLAorICAgICAgICAgICAgbUNhbGxiYWNrT3BhcXVlKGNhbGxiYWNrT3BhcXVlKSB7CisgICAgICAgIGlmICg6OmFuZHJvaWQ6OmJhc2U6OnNvY2tldENyZWF0ZVBhaXIoJm1JblNvY2tldCwgJm1PdXRTb2NrZXQpIDwgMCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IHBhaXIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbUZkV2F0Y2ggPSBsb29wZXItPmNyZWF0ZUZkV2F0Y2gobU91dFNvY2tldCwgb25Tb2NrZXRFdmVudCwgdGhpcyk7CisgICAgICAgIGlmICghbUZkV2F0Y2gpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCBjcmVhdGUgRmRXYXRjaCI7CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpzb2NrZXRDbG9zZShtSW5Tb2NrZXQpOworICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0Q2xvc2UobU91dFNvY2tldCk7CisgICAgICAgICAgICBtSW5Tb2NrZXQgPSAtMTsKKyAgICAgICAgICAgIG1PdXRTb2NrZXQgPSAtMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1GZFdhdGNoLT53YW50UmVhZCgpOworICAgIH0KKworICAgIC8vIERlc3RydWN0b3IKKyAgICB2aXJ0dWFsIH5CcmlkZ2UoKSB7CisgICAgICAgIGRlbGV0ZSBtRmRXYXRjaDsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6c29ja2V0Q2xvc2UobU91dFNvY2tldCk7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnNvY2tldENsb3NlKG1JblNvY2tldCk7CisgICAgfQorCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEdwdUZyYW1lQnJpZGdlOjpwb3N0RnJhbWUoKSBtZXRob2QsIG11c3QgYmUKKyAgICAvLyBjYWxsZWQgZnJvbSB0aGUgRW11R0wgdGhyZWFkLgorICAgIHZpcnR1YWwgdm9pZCBwb3N0RnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB2b2lkKiBwaXhlbHMpIHsKKyAgICAgICAgaWYgKG1JblNvY2tldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGcmFtZSogZnJhbWUgPSBuZXcgRnJhbWUod2lkdGgsIGhlaWdodCwgcGl4ZWxzKTsKKyAgICAgICAgOjptZW1jcHkoZnJhbWUtPnBpeGVscywgcGl4ZWxzLCB3aWR0aCAqIDQgKiBoZWlnaHQpOworICAgICAgICBtRnJhbWVzLnNlbmQoZnJhbWUpOworICAgICAgICBjaGFyIGMgPSAxOworICAgICAgICBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZW5kKG1JblNvY2tldCwgJmMsIDEpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heEZyYW1lcyA9IDE2CisgICAgfTsKKworICAgIC8vIENhbGxlZCBmcm9tIHRoZSBsb29wZXIgdGhyZWFkIHdoZW4gYSBuZXcgRnJhbWUgaW5zdGFuY2UgaXMgYXZhaWxhYmxlLgorICAgIHN0YXRpYyB2b2lkIG9uU29ja2V0RXZlbnQodm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cykgeworICAgICAgICBCcmlkZ2UqIGJyaWRnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8QnJpZGdlKj4ob3BhcXVlKTsKKyAgICAgICAgaWYgKGV2ZW50cyAmIExvb3Blcjo6RmRXYXRjaDo6a0V2ZW50UmVhZCkgeworICAgICAgICAgICAgY2hhciBjID0gMDsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnNvY2tldFJlY3YoYnJpZGdlLT5tT3V0U29ja2V0LCAmYywgMSk7CisgICAgICAgICAgICAvLyBjaGFyIGM7IGlzIHRoZSAiY29uZmlybWF0aW9uIiBiaXQKKyAgICAgICAgICAgIC8vIHRoYXQgYWN0dWFsIGRhdGEgd2FzIGdyYWJiZWQgYnkgdGhlIHNvY2tldC4KKyAgICAgICAgICAgIC8vIEluIGEgbW9yZSBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbiwKKyAgICAgICAgICAgIC8vIHdlIGFyZW4ndCBndWFyYW50ZWVkIDE6MQorICAgICAgICAgICAgLy8gb25Tb2NrZXRFdmVudCBhbmQgcG9zdEZyYW1lIGNhbGxzLgorICAgICAgICAgICAgLy8gSWYgd2Ugc2ltcGx5IHF1aXQgaWYgdGhlIGNvbmZpcm0gYml0IGlzIG5vdCBzZXQsCisgICAgICAgICAgICAvLyB3ZSBjYW4gYXZvaWQgYSBkZWFkbG9jay4KKyAgICAgICAgICAgIGlmICghYykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZyYW1lKiBmcmFtZSA9IE5VTEw7CisgICAgICAgICAgICBicmlkZ2UtPm1GcmFtZXMucmVjZWl2ZSgmZnJhbWUpOworICAgICAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICAgICAgYnJpZGdlLT5tQ2FsbGJhY2soYnJpZGdlLT5tQ2FsbGJhY2tPcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBpeGVscyk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgTG9vcGVyKiBtTG9vcGVyOworICAgIGludCBtSW5Tb2NrZXQ7CisgICAgaW50IG1PdXRTb2NrZXQ7CisgICAgTG9vcGVyOjpGZFdhdGNoKiBtRmRXYXRjaDsKKyAgICBNZXNzYWdlQ2hhbm5lbDxGcmFtZSosIGtNYXhGcmFtZXM+IG1GcmFtZXM7CisgICAgQ2FsbGJhY2sqIG1DYWxsYmFjazsKKyAgICB2b2lkKiBtQ2FsbGJhY2tPcGFxdWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitHcHVGcmFtZUJyaWRnZSogR3B1RnJhbWVCcmlkZ2U6OmNyZWF0ZShhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxiYWNrT3BhcXVlKSB7CisgICAgcmV0dXJuIG5ldyBCcmlkZ2UobG9vcGVyLCBjYWxsYmFjaywgY2FsbGJhY2tPcGFxdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugb3BlbmdsCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNGE4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL0dwdUZyYW1lQnJpZGdlLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBMb29wZXI7Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorCituYW1lc3BhY2Ugb3BlbmdsIHsKKworLy8gRW11R0wgcHJvdmlkZXMgYSB3YXkgdG8gc2VuZCBHUFUgZnJhbWUgZGF0YSB0byBpdHMgY2xpZW50LCBidXQgd2lsbCBkbworLy8gc28gYnkgY2FsbGluZyBhIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgaW4gYW4gRW11R0wtY3JlYXRlZCB0aHJlYWQuIFRoZQorLy8gY29ycmVzcG9uZGluZyBkYXRhIGNhbm5vdCBiZSBlYXNpbHkgc2VuZCB0byB0aGUgVUksIHdoaWNoIGV4cGVjdHMgdG8gcnVuCisvLyBvbiB0aGUgcHJvY2VzcycgbWFpbiBsb29wLgorLy8KKy8vIEdwdUZyYW1lQnJpZGdlIGlzIGEgaGVscGVyIGNsYXNzIHRoYXQgd29ya3MtYXJvdW5kIHRoaXMgc2l0dWF0aW9uLiBVc2FnZQorLy8gaXMgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgMSkgQ3JlYXRlIGEgbmV3IEdwdUZyYW1lQnJpZGdlIGluc3RhbmNlIGluIHRoZSBtYWluIGxvb3AgdGhyZWFkLCBwYXNzaW5nCisvLyAgICAgYSBoYW5kbGUgdG8gdGhlIG1haW4gbG9vcCdzIExvb3BlciBpbnN0YW5jZSwgYW5kIHRoZSBhZGRyZXNzIG9mIGEKKy8vICAgICBjYWxsYmFjayB0byByZXRyaWV2ZSBmcmFtZSBkYXRhLgorLy8KKy8vICAyKSBJbiB0aGUgRW11R0wgY2FsbGJhY2ssIHdoaWNoIHJ1bnMgaW4gaXRzIG93biBFbXVHTCB0aHJlYWQsIGNhbGwgdGhlCisvLyAgICAgcG9zdEZyYW1lKCkgbWV0aG9kLgorLy8KK2NsYXNzIEdwdUZyYW1lQnJpZGdlIHsKK3B1YmxpYzoKKyAgICAvLyBUeXBlIG9mIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHRvIHRyYW5zZmVyIHRoZSBjb250ZW50IG9mIGEgbmV3CisgICAgLy8gR1BVIGZyYW1lIHRvIHRoZSBtYWluIHRocmVhZC4gfG9wYXF1ZXwgaXMgYSB1c2VyLXByb3ZpZGVkIHBvaW50ZXIsCisgICAgLy8gfHdpZHRofCBhbmQgfGhlaWdodHwgYXJlIGRpbWVuc2lvbnMgaW4gcGl4ZWxzLCBhbmQgfHBpeGVsc3wgaXMKKyAgICAvLyB0aGUgbWVtb3J5IGJ1ZmZlciBvZiAzMi1iaXQgUkdCQSBpbWFnZSBkYXRhLiBUaGlzIGJ1ZmZlciBpcyBmcmVlZAorICAgIC8vIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuCisgICAgdHlwZWRlZiB2b2lkIChDYWxsYmFjaykodm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBpeGVscyk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgR3B1RnJhbWVCcmlkZ2UgaW5zdGFuY2UuIHxsb29wZXJ8IGlzIGEgaGFuZGxlIHRvIHRoZSBtYWluCisgICAgLy8gbG9vcCdzIExvb3BlciBpbnN0YW5jZSwgYW5kIHxjYWxsYmFja3wgaXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUKKyAgICAvLyBjYWxsZWQsIGZyb20gdGhlIGxvb3BlciB0aHJlYWQsIHRvIHNlbmQgdGhlIGZyYW1lIGRhdGEgdG8gdGhlIGNsaWVudC4KKyAgICBzdGF0aWMgR3B1RnJhbWVCcmlkZ2UqIGNyZWF0ZShhbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayogY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbGJhY2tPcGFxdWUpOworCisgICAgLy8gRGVzdHJ1Y3RvcgorICAgIHZpcnR1YWwgfkdwdUZyYW1lQnJpZGdlKCkge30KKworICAgIC8vIFBvc3QgYSBuZXcgZnJhbWUgZnJvbSB0aGUgRW11R0wgdGhyZWFkLgorICAgIHZpcnR1YWwgdm9pZCBwb3N0RnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB2b2lkKiBwaXhlbHMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEdwdUZyYW1lQnJpZGdlKCkge30KKyAgICBHcHVGcmFtZUJyaWRnZShjb25zdCBHcHVGcmFtZUJyaWRnZSYgb3RoZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG9wZW5nbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR3B1RnJhbWVCcmlkZ2VfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcyOWI0YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvR3B1RnJhbWVCcmlkZ2VfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9HcHVGcmFtZUJyaWRnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBvcGVuZ2wgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTY29wZWRQdHI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBGcmFtZSB7CisgICAgRnJhbWUoaW50IHcsIGludCBoLCBjb25zdCB2b2lkKiBwaXhlbHMpIHsKKyAgICAgICAgdGhpcy0+d2lkdGggPSB3OworICAgICAgICB0aGlzLT5oZWlnaHQgPSBoOworICAgICAgICB0aGlzLT5waXhlbHMgPSA6Om1hbGxvYyh3ICogNCAqIGgpOworICAgICAgICA6Om1lbWNweSh0aGlzLT5waXhlbHMsIHBpeGVscywgdyAqIGggKiA0KTsKKyAgICB9CisKKyAgICB+RnJhbWUoKSB7CisgICAgICAgIDo6ZnJlZSh0aGlzLT5waXhlbHMpOworICAgIH0KKworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIHZvaWQqIHBpeGVsczsKK307CisKK2NsYXNzIEZyYW1lTGlzdCB7CitwdWJsaWM6CisgICAgRnJhbWVMaXN0KCkgOiBtQ291bnQoMCkge30KKworICAgIH5GcmFtZUxpc3QoKSB7CisgICAgICAgIGZvciAoaW50IG4gPSBtQ291bnQ7IG4gPiAwOyAtLW4pIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtRnJhbWVzW24gLSAxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1Db3VudDsgfQorCisgICAgRnJhbWUqIHBvcEZyb250KCkgeworICAgICAgICBpZiAobUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEZyYW1lKiByZXN1bHQgPSBtRnJhbWVzWzBdOworICAgICAgICBtQ291bnQtLTsKKyAgICAgICAgOjptZW1tb3ZlKCZtRnJhbWVzWzBdLCAmbUZyYW1lc1sxXSwgbUNvdW50ICogc2l6ZW9mKEZyYW1lKikpOworICAgICAgICBtRnJhbWVzW21Db3VudF0gPSBOVUxMOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGNvbnN0IEZyYW1lKiBnZXQoaW50IGluZGV4KSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbUNvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gbUZyYW1lc1tpbmRleF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFkZCh2b2lkKiBjb250ZXh0LCBpbnQgdywgaW50IGgsIGNvbnN0IHZvaWQqIHBpeGVscykgeworICAgICAgICBGcmFtZUxpc3QqIGxpc3QgPSByZWludGVycHJldF9jYXN0PEZyYW1lTGlzdCo+KGNvbnRleHQpOworICAgICAgICBDSEVDSyhsaXN0LT5tQ291bnQgPCBrTWF4RnJhbWVzKTsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gbmV3IEZyYW1lKHcsIGgsIHBpeGVscyk7CisgICAgICAgIGxpc3QtPm1GcmFtZXNbbGlzdC0+bUNvdW50KytdID0gZnJhbWU7CisgICAgfQorCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4RnJhbWVzID0gMTI4CisgICAgfTsKKworICAgIGludCBtQ291bnQ7CisgICAgRnJhbWUqIG1GcmFtZXNba01heEZyYW1lc107Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChHcHVGcmFtZUJyaWRnZSwgcG9zdEZyYW1lV2l0aGluU2luZ2xlVGhyZWFkKSB7CisgICAgU2NvcGVkUHRyPExvb3Blcj4gbG9vcGVyKExvb3Blcjo6Y3JlYXRlKCkpOworICAgIEFTU0VSVF9UUlVFKGxvb3Blci5nZXQoKSk7CisKKyAgICBGcmFtZUxpc3QgbGlzdDsKKyAgICBHcHVGcmFtZUJyaWRnZSogYnJpZGdlID0KKyAgICAgICAgICAgIEdwdUZyYW1lQnJpZGdlOjpjcmVhdGUobG9vcGVyLmdldCgpLCBGcmFtZUxpc3Q6OmFkZCwgJmxpc3QpOworICAgIEVYUEVDVF9UUlVFKGJyaWRnZSk7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrRnJhbWUwWzRdID0geworICAgICAgICAweGZmLCAweDgwLCAweDQwLCAweGZmLAorICAgIH07CisKKyAgICBicmlkZ2UtPnBvc3RGcmFtZSgxLCAxLCBrRnJhbWUwKTsKKworICAgIEVYUEVDVF9FUShFVElNRURPVVQsIGxvb3Blci0+cnVuV2l0aFRpbWVvdXRNcygxMDApKTsKKworICAgIEVYUEVDVF9FUSgxLCBsaXN0LmNvdW50KCkpOworICAgIFNjb3BlZFB0cjxGcmFtZT4gZnJhbWUobGlzdC5wb3BGcm9udCgpKTsKKyAgICBFWFBFQ1RfVFJVRShmcmFtZS5nZXQoKSk7CisgICAgRVhQRUNUX0VRKDEsIGZyYW1lLT53aWR0aCk7CisgICAgRVhQRUNUX0VRKDEsIGZyYW1lLT5oZWlnaHQpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgc2l6ZW9mKGtGcmFtZTApOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKGtGcmFtZTBbbl0sIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGZyYW1lLT5waXhlbHMpW25dKQorICAgICAgICAgICAgICAgIDw8ICIjICIgPDwgbjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBvcGVuZ2wKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL09wZW5nbEVzUGlwZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL09wZW5nbEVzUGlwZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwNDkxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvT3BlbmdsRXNQaXBlLmNwcApAQCAtMCwwICsxLDMyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2wvT3BlbmdsRXNQaXBlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2xlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsZXMtcGlwZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0dMUHJvY2Vzc1BpcGUuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBTZXQgdG8gMSBvciAyIGZvciBkZWJ1ZyB0cmFjZXMKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcgPj0gMQorI2RlZmluZSBEKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKSwgcHJpbnRmKCJcbiIpLCBmZmx1c2goc3Rkb3V0KQorI2Vsc2UKKyNkZWZpbmUgRCguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBERUJVRyA+PSAyCisjZGVmaW5lIEREKC4uLikgcHJpbnRmKF9fVkFfQVJHU19fKSwgcHJpbnRmKCJcbiIpLCBmZmx1c2goc3Rkb3V0KQorI2Vsc2UKKyNkZWZpbmUgREQoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCit1c2luZyBDaGFubmVsQnVmZmVyID0gZW11Z2w6OlJlbmRlckNoYW5uZWw6OkJ1ZmZlcjsKK3VzaW5nIGVtdWdsOjpSZW5kZXJDaGFubmVsOwordXNpbmcgZW11Z2w6OlJlbmRlckNoYW5uZWxQdHI7Cit1c2luZyBDaGFubmVsU3RhdGUgPSBlbXVnbDo6UmVuZGVyQ2hhbm5lbDo6U3RhdGU7Cit1c2luZyBJb1Jlc3VsdCA9IGVtdWdsOjpSZW5kZXJDaGFubmVsOjpJb1Jlc3VsdDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIG9wZW5nbCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEVtdWdsUGlwZSA6IHB1YmxpYyBBbmRyb2lkUGlwZSB7CitwdWJsaWM6CisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBUaGUgcGlwZSBzZXJ2aWNlIGNsYXNzIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgIGNsYXNzIFNlcnZpY2UgOiBwdWJsaWMgQW5kcm9pZFBpcGU6OlNlcnZpY2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2VydmljZSgpIDogQW5kcm9pZFBpcGU6OlNlcnZpY2UoIm9wZW5nbGVzIikge30KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRW11Z2xQaXBlIGluc3RhbmNlLgorICAgICAgICB2aXJ0dWFsIEFuZHJvaWRQaXBlKiBjcmVhdGUodm9pZCogbUh3UGlwZSwgY29uc3QgY2hhciogYXJncykgb3ZlcnJpZGUgeworICAgICAgICAgICAgYXV0byByZW5kZXJlciA9IGFuZHJvaWRfZ2V0T3BlbmdsZXNSZW5kZXJlcigpOworICAgICAgICAgICAgaWYgKCFyZW5kZXJlcikgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgdW5sZXNzIHRoZXJlIGlzIGEgYnVnIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIGVtdWxhdG9yJ3MgaW5pdGlhbGl6YXRpb24sIG9yIHRoZSBzeXN0ZW0gaW1hZ2UuCisgICAgICAgICAgICAgICAgRCgiVHJ5aW5nIHRvIG9wZW4gdGhlIE9wZW5HTEVTIHBpcGUgd2l0aG91dCBHUFUgZW11bGF0aW9uISIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbXVnbFBpcGUqIHBpcGUgPSBuZXcgRW11Z2xQaXBlKG1Id1BpcGUsIHRoaXMsIHJlbmRlcmVyKTsKKyAgICAgICAgICAgIGlmICghcGlwZS0+bUlzV29ya2luZykgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwaXBlOworICAgICAgICAgICAgICAgIHBpcGUgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBpcGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWFsbHkgY2Fubm90IHNhdmUvbG9hZCB0aGVzZSBwaXBlcycgc3RhdGUuCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5Mb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIENvbnN0cnVjdG9yLCBjaGVjayB0aGF0IHxtSXNXb3JraW5nfCBpcyB0cnVlIGFmdGVyIHRoaXMgY2FsbCB0byB2ZXJpZnkKKyAgICAvLyB0aGF0IGV2ZXJ5dGhpbmcgd2VudCB3ZWxsLgorICAgIEVtdWdsUGlwZSh2b2lkKiBod1BpcGUsIFNlcnZpY2UqIHNlcnZpY2UsCisgICAgICAgICAgICAgIGNvbnN0IGVtdWdsOjpSZW5kZXJlclB0ciYgcmVuZGVyZXIpCisgICAgICAgIDogQW5kcm9pZFBpcGUoaHdQaXBlLCBzZXJ2aWNlKSB7CisgICAgICAgIG1DaGFubmVsID0gcmVuZGVyZXItPmNyZWF0ZVJlbmRlckNoYW5uZWwoKTsKKyAgICAgICAgaWYgKCFtQ2hhbm5lbCkgeworICAgICAgICAgICAgRCgiRmFpbGVkIHRvIGNyZWF0ZSBhbiBPcGVuR0xFUyBwaXBlIGNoYW5uZWwhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtSXNXb3JraW5nID0gdHJ1ZTsKKyAgICAgICAgbUNoYW5uZWwtPnNldEV2ZW50Q2FsbGJhY2soCisgICAgICAgICAgICAgICAgW3RoaXNdKFJlbmRlckNoYW5uZWw6OlN0YXRlIGV2ZW50cykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLT5vbkNoYW5uZWxIb3N0RXZlbnQoZXZlbnRzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIE92ZXJyaWRlbiBBbmRyb2lkUGlwZSBtZXRob2RzCisKKyAgICB2aXJ0dWFsIHZvaWQgb25HdWVzdENsb3NlKCkgb3ZlcnJpZGUgeworICAgICAgICBEKCIlcyIsIF9fZnVuY19fKTsKKyAgICAgICAgbUlzV29ya2luZyA9IGZhbHNlOworICAgICAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVuc2lnbmVkIG9uR3Vlc3RQb2xsKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBERCgiJXMiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgdW5zaWduZWQgcmV0ID0gMDsKKyAgICAgICAgaWYgKG1EYXRhRm9yUmVhZGluZ0xlZnQgPiAwKSB7CisgICAgICAgICAgICByZXQgfD0gUElQRV9QT0xMX0lOOworICAgICAgICB9CisgICAgICAgIENoYW5uZWxTdGF0ZSBzdGF0ZSA9IG1DaGFubmVsLT5zdGF0ZSgpOworICAgICAgICBpZiAoKHN0YXRlICYgQ2hhbm5lbFN0YXRlOjpDYW5SZWFkKSAhPSAwKSB7CisgICAgICAgICAgICByZXQgfD0gUElQRV9QT0xMX0lOOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RhdGUgJiBDaGFubmVsU3RhdGU6OkNhbldyaXRlKSAhPSAwKSB7CisgICAgICAgICAgICByZXQgfD0gUElQRV9QT0xMX09VVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHN0YXRlICYgQ2hhbm5lbFN0YXRlOjpTdG9wcGVkKSAhPSAwKSB7CisgICAgICAgICAgICByZXQgfD0gUElQRV9QT0xMX0hVUDsKKyAgICAgICAgfQorICAgICAgICBERCgiJXM6IHJldHVybmluZyAlZCIsIF9fZnVuY19fLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHZpcnR1YWwgaW50IG9uR3Vlc3RSZWN2KEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLCBpbnQgbnVtQnVmZmVycykKKyAgICAgICAgICAgIG92ZXJyaWRlIHsKKyAgICAgICAgREQoIiVzIiwgX19mdW5jX18pOworCisgICAgICAgIC8vIENvbnN1bWUgdGhlIHBpcGUncyBkYXRhRm9yUmVhZGluZywgdGhlbiBwdXQgdGhlIG5leHQgcmVjZWl2ZWQgZGF0YQorICAgICAgICAvLyBwaWVjZSB0aGVyZS4gUmVwZWF0IHVudGlsIHRoZSBidWZmZXJzIGFyZSBmdWxsIG9yIHdlJ3JlIG91dCBvZiBkYXRhCisgICAgICAgIC8vIGluIHRoZSBjaGFubmVsLgorICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZPZmZzZXQgPSAwOworCisgICAgICAgIGF1dG8gYnVmZiA9IGJ1ZmZlcnM7CisgICAgICAgIGNvbnN0IGF1dG8gYnVmZkVuZCA9IGJ1ZmYgKyBudW1CdWZmZXJzOworICAgICAgICB3aGlsZSAoYnVmZiAhPSBidWZmRW5kKSB7CisgICAgICAgICAgICBpZiAobURhdGFGb3JSZWFkaW5nTGVmdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gZGF0YSBsZWZ0LCByZWFkIGEgbmV3IGNodW5rIGZyb20gdGhlIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgaW50IHNwaW5Db3VudCA9IDIwOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2hhbm5lbC0+dHJ5UmVhZCgmbURhdGFGb3JSZWFkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBJb1Jlc3VsdDo6T2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhRm9yUmVhZGluZ0xlZnQgPSBtRGF0YUZvclJlYWRpbmcuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgREQoIiVzOiB0cnlSZWFkKCkgZmFpbGVkIHdpdGggJWQiLCBfX2Z1bmNfXywgKGludClyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZhaWxlZCBlaXRoZXIgYmVjYXVzZSB0aGUgY2hhbm5lbCB3YXMgc3RvcHBlZAorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBob3N0LCBvciBpZiB0aGVyZSB3YXMgbm8gZGF0YSB5ZXQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBERCgiJXM6IHJldHVybmluZyAlZCBieXRlcyIsIF9fZnVuY19fLCAoaW50KWxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gSW9SZXN1bHQ6OkVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTcGluIGEgbGl0dGxlIGJlZm9yZSBkZWNsYXJpbmcgdGhlcmUgaXMgbm90aGluZworICAgICAgICAgICAgICAgICAgICAvLyB0byByZWFkLiBNYW55IEdMIGNhbGxzIGFyZSBtdWNoIGZhc3RlciB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB3aG9sZSBob3N0LXRvLWd1ZXN0LXRvLWhvc3QgdHJhbnNpdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgaWYgKC0tc3BpbkNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgREQoIiVzOiByZXR1cm5pbmcgUElQRV9FUlJPUl9BR0FJTiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBJUEVfRVJST1JfQUdBSU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBzaXplX3QgY3VyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGJ1ZmYtPnNpemUgLSBidWZmT2Zmc2V0LCBtRGF0YUZvclJlYWRpbmdMZWZ0KTsKKyAgICAgICAgICAgIG1lbWNweShidWZmLT5kYXRhICsgYnVmZk9mZnNldCwKKyAgICAgICAgICAgICAgICBtRGF0YUZvclJlYWRpbmcuZGF0YSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtRGF0YUZvclJlYWRpbmcuc2l6ZSgpIC0gbURhdGFGb3JSZWFkaW5nTGVmdCksCisgICAgICAgICAgICAgICAgY3VyU2l6ZSk7CisKKyAgICAgICAgICAgIGxlbiArPSBjdXJTaXplOworICAgICAgICAgICAgbURhdGFGb3JSZWFkaW5nTGVmdCAtPSBjdXJTaXplOworICAgICAgICAgICAgYnVmZk9mZnNldCArPSBjdXJTaXplOworICAgICAgICAgICAgaWYgKGJ1ZmZPZmZzZXQgPT0gYnVmZi0+c2l6ZSkgeworICAgICAgICAgICAgICAgICsrYnVmZjsKKyAgICAgICAgICAgICAgICBidWZmT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEREKCIlczogcmVjZWl2ZWQgJWQgYnl0ZXMiLCBfX2Z1bmNfXywgKGludClsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IG9uR3Vlc3RTZW5kKGNvbnN0IEFuZHJvaWRQaXBlQnVmZmVyKiBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1CdWZmZXJzKSBvdmVycmlkZSB7CisgICAgICAgIEREKCIlcyIsIF9fZnVuY19fKTsKKworICAgICAgICBpZiAoIW1Jc1dvcmtpbmcpIHsKKyAgICAgICAgICAgIEREKCIlczogcGlwZSBhbHJlYWR5IGNsb3NlZCEiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gUElQRV9FUlJPUl9JTzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHRoZSB0b3RhbCBieXRlcyB0byBzZW5kLgorICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUJ1ZmZlcnM7ICsrbikgeworICAgICAgICAgICAgY291bnQgKz0gYnVmZmVyc1tuXS5zaXplOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBldmVyeXRoaW5nIGludG8gYSBzaW5nbGUgQ2hhbm5lbEJ1ZmZlci4KKyAgICAgICAgQ2hhbm5lbEJ1ZmZlciBvdXRCdWZmZXI7CisgICAgICAgIG91dEJ1ZmZlci5yZXNpemVfbm9pbml0KGNvdW50KTsKKyAgICAgICAgYXV0byBwdHIgPSBvdXRCdWZmZXIuZGF0YSgpOworICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUJ1ZmZlcnM7ICsrbikgeworICAgICAgICAgICAgbWVtY3B5KHB0ciwgYnVmZmVyc1tuXS5kYXRhLCBidWZmZXJzW25dLnNpemUpOworICAgICAgICAgICAgcHRyICs9IGJ1ZmZlcnNbbl0uc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEQoIiVzOiBzZW5kaW5nICVkIGJ5dGVzIHRvIGhvc3QiLCBfX2Z1bmNfXywgY291bnQpOworICAgICAgICAvLyBTZW5kIGl0IHRocm91Z2ggdGhlIGNoYW5uZWwuCisgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNoYW5uZWwtPnRyeVdyaXRlKHN0ZDo6bW92ZShvdXRCdWZmZXIpKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBJb1Jlc3VsdDo6T2spIHsKKyAgICAgICAgICAgIEQoIiVzOiB0cnlXcml0ZSgpIGZhaWxlZCB3aXRoICVkIiwgX19mdW5jX18sIChpbnQpcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gSW9SZXN1bHQ6OkVycm9yID8gUElQRV9FUlJPUl9JTyA6IFBJUEVfRVJST1JfQUdBSU47CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uR3Vlc3RXYW50V2FrZU9uKGludCBmbGFncykgb3ZlcnJpZGUgeworICAgICAgICBERCgiJXM6IGZsYWdzPSVkIiwgX19mdW5jX18sIGZsYWdzKTsKKworICAgICAgICAvLyBUcmFuc2xhdGUgfGZsYWdzfCBpbnRvIENoYW5uZWxTdGF0ZSBmbGFncy4KKyAgICAgICAgQ2hhbm5lbFN0YXRlIHdhbnRlZCA9IENoYW5uZWxTdGF0ZTo6RW1wdHk7CisgICAgICAgIGlmIChmbGFncyAmIFBJUEVfV0FLRV9SRUFEKSB7CisgICAgICAgICAgICB3YW50ZWQgfD0gQ2hhbm5lbFN0YXRlOjpDYW5SZWFkOworICAgICAgICB9CisgICAgICAgIGlmIChmbGFncyAmIFBJUEVfV0FLRV9XUklURSkgeworICAgICAgICAgICAgd2FudGVkIHw9IENoYW5uZWxTdGF0ZTo6Q2FuV3JpdGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTaWduYWwgZXZlbnRzIHRoYXQgYXJlIGFscmVhZHkgYXZhaWxhYmxlIG5vdy4KKyAgICAgICAgQ2hhbm5lbFN0YXRlIHN0YXRlID0gbUNoYW5uZWwtPnN0YXRlKCk7CisgICAgICAgIENoYW5uZWxTdGF0ZSBhdmFpbGFibGUgPSBzdGF0ZSAmIHdhbnRlZDsKKyAgICAgICAgREQoIiVzOiBzdGF0ZT0lZCB3YW50ZWQ9JWQgYXZhaWxhYmxlPSVkIiwgX19mdW5jX18sIChpbnQpc3RhdGUsCisgICAgICAgICAgIChpbnQpd2FudGVkLCAoaW50KWF2YWlsYWJsZSk7CisgICAgICAgIGlmIChhdmFpbGFibGUgIT0gQ2hhbm5lbFN0YXRlOjpFbXB0eSkgeworICAgICAgICAgICAgREQoIiVzOiBzaWduYWxpbmcgZXZlbnRzICVkIiwgX19mdW5jX18sIChpbnQpYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIHNpZ25hbFN0YXRlKGF2YWlsYWJsZSk7CisgICAgICAgICAgICB3YW50ZWQgJj0gfmF2YWlsYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzayB0aGUgY2hhbm5lbCB0byBiZSBub3RpZmllZCBvZiByZW1haW5pbmcgZXZlbnRzLgorICAgICAgICBpZiAod2FudGVkICE9IENoYW5uZWxTdGF0ZTo6RW1wdHkpIHsKKyAgICAgICAgICAgIEREKCIlczogd2FpdGluZyBmb3IgZXZlbnRzICVkIiwgX19mdW5jX18sIChpbnQpd2FudGVkKTsKKyAgICAgICAgICAgIG1DaGFubmVsLT5zZXRXYW50ZWRFdmVudHMod2FudGVkKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDYWxsZWQgdG8gc2lnbmFsIHRoZSBndWVzdCB0aGF0IHJlYWQvd3JpdGUgd2FrZSBldmVudHMgb2NjdXJlZC4KKyAgICAvLyBOb3RlOiB0aGlzIGNhbiBiZSBjYWxsZWQgZnJvbSBlaXRoZXIgdGhlIGd1ZXN0IG9yIGhvc3QgcmVuZGVyCisgICAgLy8gdGhyZWFkLgorICAgIHZvaWQgc2lnbmFsU3RhdGUoQ2hhbm5lbFN0YXRlIHN0YXRlKSB7CisgICAgICAgIGludCB3YWtlRmxhZ3MgPSAwOworICAgICAgICBpZiAoKHN0YXRlICYgQ2hhbm5lbFN0YXRlOjpDYW5SZWFkKSAhPSAwKSB7CisgICAgICAgICAgICB3YWtlRmxhZ3MgfD0gUElQRV9XQUtFX1JFQUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGF0ZSAmIENoYW5uZWxTdGF0ZTo6Q2FuV3JpdGUpICE9IDApIHsKKyAgICAgICAgICAgIHdha2VGbGFncyB8PSBQSVBFX1dBS0VfV1JJVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdha2VGbGFncyAhPSAwKSB7CisgICAgICAgICAgICB0aGlzLT5zaWduYWxXYWtlKHdha2VGbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBpL28gZXZlbnQgb2NjdXJzIG9uIHRoZSByZW5kZXIgY2hhbm5lbAorICAgIHZvaWQgb25DaGFubmVsSG9zdEV2ZW50KENoYW5uZWxTdGF0ZSBzdGF0ZSkgeworICAgICAgICBEKCIlczogZXZlbnRzICVkIiwgX19mdW5jX18sIChpbnQpc3RhdGUpOworICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBob3N0LXNpZGUgcmVuZGVyIHRocmVhZC4KKyAgICAgICAgLy8gYnV0IGNsb3NlRnJvbUhvc3QoKSBhbmQgc2lnbmFsV2FrZSgpIGNhbiBiZSBjYWxsZWQgZnJvbQorICAgICAgICAvLyBhbnkgdGhyZWFkLgorICAgICAgICBpZiAoKHN0YXRlICYgQ2hhbm5lbFN0YXRlOjpTdG9wcGVkKSAhPSAwKSB7CisgICAgICAgICAgICB0aGlzLT5jbG9zZUZyb21Ib3N0KCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2lnbmFsU3RhdGUoc3RhdGUpOworICAgIH0KKworICAgIC8vIEEgUmVuZGVyQ2hhbm5lbCBwb2ludGVyIHVzZWQgZm9yIGNvbW11bmljYXRpb24uCisgICAgUmVuZGVyQ2hhbm5lbFB0ciBtQ2hhbm5lbDsKKworICAgIC8vIFNldCB0byB8dHJ1ZXwgaWYgdGhlIHBpcGUgaXMgaW4gd29ya2luZyBzdGF0ZSwgfGZhbHNlfCBtZWFucyB3ZSdyZSBub3QKKyAgICAvLyBpbml0aWFsaXplZCBvciB0aGUgcGlwZSBpcyBjbG9zZWQuCisgICAgYm9vbCBtSXNXb3JraW5nID0gZmFsc2U7CisKKyAgICAvLyBUaGVzZSB0d28gdmFyaWFibGVzIHNlcnZlIGFzIGEgcmVhZGluZyBidWZmZXIgZm9yIHRoZSBndWVzdC4KKyAgICAvLyBFYWNoIHRpbWUgd2UgZ2V0IGEgcmVhZCByZXF1ZXN0LCBmaXJzdCB3ZSBleHRyYWN0IGEgc2luZ2xlIGNodW5rIGZyb20KKyAgICAvLyB0aGUgfG1DaGFubmVsfCBpbnRvIGhlcmUsIGFuZCB0aGVuIGNvcHkgaXRzIGNvbnRlbnQgaW50byB0aGUKKyAgICAvLyBndWVzdC1zdXBwbGllZCBtZW1vcnkuCisgICAgLy8gSWYgZ3Vlc3QgZGlkbid0IGhhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSB3aG9sZSBidWZmZXIsIHdlIHRyYWNrIHRoZQorICAgIC8vIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgaW4gfG1EYXRhRm9yUmVhZGluZ0xlZnR8IGZvciB0aGUgbmV4dCByZWFkKCkuCisgICAgQ2hhbm5lbEJ1ZmZlciBtRGF0YUZvclJlYWRpbmc7CisgICAgc2l6ZV90IG1EYXRhRm9yUmVhZGluZ0xlZnQgPSAwOworCisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoRW11Z2xQaXBlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIHJlZ2lzdGVyUGlwZVNlcnZpY2UoKSB7CisgICAgYW5kcm9pZDo6QW5kcm9pZFBpcGU6OlNlcnZpY2U6OmFkZChuZXcgRW11Z2xQaXBlOjpTZXJ2aWNlKCkpOworICAgIHJlZ2lzdGVyR0xQcm9jZXNzUGlwZVNlcnZpY2UoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG9wZW5nbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gRGVjbGFyZWQgaW4gYW5kcm9pZC9vcGVuZ2xlcy1waXBlLmgKK3ZvaWQgYW5kcm9pZF9pbml0X29wZW5nbGVzX3BpcGUoKSB7CisgICAgYW5kcm9pZDo6b3BlbmdsOjpyZWdpc3RlclBpcGVTZXJ2aWNlKCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL09wZW5nbEVzUGlwZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9PcGVuZ2xFc1BpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGNjOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9PcGVuZ2xFc1BpcGUuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQW5kcm9pZFBpcGUuaCIKKworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9SZW5kZXJDaGFubmVsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBvcGVuZ2wgeworCit2b2lkIHJlZ2lzdGVyUGlwZVNlcnZpY2UoKTsKKworfSAgLy8gbmFtZXNwYWNlIG9wZW5nbAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y5M2JiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWcuY3BwCkBAIC0wLDAgKzEsMzQxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL2VtdWdsX2NvbmZpZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL2dwdWluZm8uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBERUJVRyAwCisKKyNpZiBERUJVRworI2RlZmluZSBEKC4uLikgIHByaW50ZihfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UnVuT3B0aW9uczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ0Zvcm1hdDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKK3VzaW5nIGFuZHJvaWQ6Om9wZW5nbDo6RW11Z2xCYWNrZW5kTGlzdDsKKworc3RhdGljIEVtdWdsQmFja2VuZExpc3QqIHNCYWNrZW5kTGlzdCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHJlc2V0QmFja2VuZExpc3QoaW50IGJpdG5lc3MpIHsKKyAgICBkZWxldGUgc0JhY2tlbmRMaXN0OworICAgIHNCYWNrZW5kTGlzdCA9IG5ldyBFbXVnbEJhY2tlbmRMaXN0KAorICAgICAgICAgICAgU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKS5jX3N0cigpLCBiaXRuZXNzKTsKK30KKworc3RhdGljIGJvb2wgc3RyaW5nVmVjdG9yQ29udGFpbnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGxpc3Quc2l6ZSgpOyArK24pIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobGlzdFtuXS5jX3N0cigpLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpc0hvc3RHcHVCbGFja2xpc3RlZCgpIHsKKyAgICByZXR1cm4gYXN5bmNfcXVlcnlfaG9zdF9ncHVfYmxhY2tsaXN0ZWQoKTsKK30KKwordm9pZCBzZXRHcHVCbGFja2xpc3RTdGF0dXMoYm9vbCBzd2l0Y2hlZFNvZnR3YXJlKSB7CisgICAgR3B1SW5mb0xpc3Q6OmdldCgpLT5ibGFja2xpc3Rfc3RhdHVzID0KKyAgICAgICAgc3dpdGNoZWRTb2Z0d2FyZTsKK30KKworLy8gR2V0IGEgZGVzY3JpcHRpb24gb2YgaG9zdCBHUFUgcHJvcGVydGllcy4KKy8vIE5lZWQgdG8gZnJlZSBhZnRlciB1c2UuCitlbXVnbF9ob3N0X2dwdV9wcm9wX2xpc3QgZW11Z2xDb25maWdfZ2V0X2hvc3RfZ3B1X3Byb3BzKCkgeworICAgIEdwdUluZm9MaXN0KiBncHVsaXN0ID0gR3B1SW5mb0xpc3Q6OmdldCgpOworICAgIGVtdWdsX2hvc3RfZ3B1X3Byb3BfbGlzdCByZXM7CisgICAgcmVzLm51bV9ncHVzID0gZ3B1bGlzdC0+aW5mb3Muc2l6ZSgpOworICAgIHJlcy5wcm9wcyA9IG5ldyBlbXVnbF9ob3N0X2dwdV9wcm9wc1tyZXMubnVtX2dwdXNdOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8R3B1SW5mbz4mIGluZm9zID0gZ3B1bGlzdC0+aW5mb3M7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXMubnVtX2dwdXM7IGkrKykgeworICAgICAgICByZXMucHJvcHNbaV0ubWFrZSA9IHN0cmR1cChpbmZvc1tpXS5tYWtlLmNfc3RyKCkpOworICAgICAgICByZXMucHJvcHNbaV0ubW9kZWwgPSBzdHJkdXAoaW5mb3NbaV0ubW9kZWwuY19zdHIoKSk7CisgICAgICAgIHJlcy5wcm9wc1tpXS5kZXZpY2VfaWQgPSBzdHJkdXAoaW5mb3NbaV0uZGV2aWNlX2lkLmNfc3RyKCkpOworICAgICAgICByZXMucHJvcHNbaV0ucmV2aXNpb25faWQgPSBzdHJkdXAoaW5mb3NbaV0ucmV2aXNpb25faWQuY19zdHIoKSk7CisgICAgICAgIHJlcy5wcm9wc1tpXS52ZXJzaW9uID0gc3RyZHVwKGluZm9zW2ldLnZlcnNpb24uY19zdHIoKSk7CisgICAgICAgIHJlcy5wcm9wc1tpXS5yZW5kZXJlciA9IHN0cmR1cChpbmZvc1tpXS5yZW5kZXJlci5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworU2VsZWN0ZWRSZW5kZXJlciBlbXVnbENvbmZpZ19nZXRfcmVuZGVyZXIoY29uc3QgY2hhciogZ3B1X21vZGUpIHsKKyAgICBpZiAoIWdwdV9tb2RlKSB7CisgICAgICAgIHJldHVybiBTRUxFQ1RFRF9SRU5ERVJFUl9VTktOT1dOOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChncHVfbW9kZSwgImhvc3QiKSB8fAorICAgICAgICAhc3RyY21wKGdwdV9tb2RlLCAib24iKSkgeworICAgICAgICByZXR1cm4gU0VMRUNURURfUkVOREVSRVJfSE9TVDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZ3B1X21vZGUsICJvZmYiKSkgeworICAgICAgICByZXR1cm4gU0VMRUNURURfUkVOREVSRVJfT0ZGOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChncHVfbW9kZSwgImd1ZXN0IikpIHsKKyAgICAgICAgcmV0dXJuIFNFTEVDVEVEX1JFTkRFUkVSX0dVRVNUOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChncHVfbW9kZSwgIm1lc2EiKSkgeworICAgICAgICByZXR1cm4gU0VMRUNURURfUkVOREVSRVJfTUVTQTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZ3B1X21vZGUsICJzd2lmdHNoYWRlciIpKSB7CisgICAgICAgIHJldHVybiBTRUxFQ1RFRF9SRU5ERVJFUl9TV0lGVFNIQURFUjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZ3B1X21vZGUsICJhbmdsZSIpKSB7CisgICAgICAgIHJldHVybiBTRUxFQ1RFRF9SRU5ERVJFUl9BTkdMRTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZ3B1X21vZGUsICJlcnJvciIpKSB7CisgICAgICAgIHJldHVybiBTRUxFQ1RFRF9SRU5ERVJFUl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gU0VMRUNURURfUkVOREVSRVJfVU5LTk9XTjsKKyAgICB9Cit9CisKK3ZvaWQgZnJlZV9lbXVnbF9ob3N0X2dwdV9wcm9wcyhlbXVnbF9ob3N0X2dwdV9wcm9wX2xpc3QgcHJvcGxpc3QpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BsaXN0Lm51bV9ncHVzOyBpKyspIHsKKyAgICAgICAgZnJlZShwcm9wbGlzdC5wcm9wc1tpXS5tYWtlKTsKKyAgICAgICAgZnJlZShwcm9wbGlzdC5wcm9wc1tpXS5tb2RlbCk7CisgICAgICAgIGZyZWUocHJvcGxpc3QucHJvcHNbaV0uZGV2aWNlX2lkKTsKKyAgICAgICAgZnJlZShwcm9wbGlzdC5wcm9wc1tpXS5yZXZpc2lvbl9pZCk7CisgICAgICAgIGZyZWUocHJvcGxpc3QucHJvcHNbaV0udmVyc2lvbik7CisgICAgICAgIGZyZWUocHJvcGxpc3QucHJvcHNbaV0ucmVuZGVyZXIpOworICAgIH0KKyAgICBkZWxldGUgW10gcHJvcGxpc3QucHJvcHM7Cit9CisKK2Jvb2wgZW11Z2xDb25maWdfaW5pdChFbXVnbENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ3B1X2VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ3B1X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ3B1X29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIG5vX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJsYWNrbGlzdGVkLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2d1ZXN0X3JlbmRlcmVyKSB7CisgICAgRCgiJXM6IGJsYWNrbGlzdGVkPSVkIGhhc19ndWVzdF9yZW5kZXJlcj0lZFxuIiwKKyAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgIGJsYWNrbGlzdGVkLAorICAgICAgaGFzX2d1ZXN0X3JlbmRlcmVyKTsKKworICAgIC8vIHplcm8gYWxsIGZpZWxkcyBmaXJzdC4KKyAgICBtZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoKmNvbmZpZykpOworCisgICAgLy8gVGhlIHZhbHVlIG9mICctZ3B1IDxtb2RlPicgb3ZlcnJpZGVzIHRoZSBoYXJkd2FyZSBwcm9wZXJ0aWVzLAorICAgIC8vIGV4Y2VwdCBpZiA8bW9kZT4gaXMgJ2F1dG8nLgorICAgIGlmIChncHVfb3B0aW9uKSB7CisgICAgICAgIGlmICghc3RyY21wKGdwdV9vcHRpb24sICJvbiIpIHx8ICFzdHJjbXAoZ3B1X29wdGlvbiwgImVuYWJsZSIpKSB7CisgICAgICAgICAgICBncHVfZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIWdwdV9tb2RlIHx8ICFzdHJjbXAoZ3B1X21vZGUsICJhdXRvIikpIHsKKyAgICAgICAgICAgICAgICBncHVfbW9kZSA9ICJob3N0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGdwdV9vcHRpb24sICJvZmYiKSB8fAorICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZ3B1X29wdGlvbiwgImRpc2FibGUiKSB8fAorICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZ3B1X29wdGlvbiwgImd1ZXN0IikpIHsKKyAgICAgICAgICAgIGdwdV9tb2RlID0gZ3B1X29wdGlvbjsKKyAgICAgICAgICAgIGdwdV9lbmFibGVkID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChncHVfb3B0aW9uLCAiYXV0byIpKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvLCB1c2UgZ3B1X21vZGUgc2V0IGZyb20KKyAgICAgICAgICAgIC8vIGhhcmR3YXJlIHByb3BlcnRpZXMgaW5zdGVhZC4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdwdV9lbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGdwdV9tb2RlID0gZ3B1X29wdGlvbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFN1cHBvcnQgImh3LmdwdS5tb2RlPW9uIiBpbiBjb25maWcuaW5pCisgICAgICAgIGlmIChncHVfbW9kZSAmJiAoIXN0cmNtcChncHVfbW9kZSwgIm9uIikgfHwgIXN0cmNtcChncHVfbW9kZSwgImVuYWJsZSIpKSkgeworICAgICAgICAgICAgZ3B1X2VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgZ3B1X21vZGUgPSAiaG9zdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ3B1X21vZGUgJiYKKyAgICAgICAgKCFzdHJjbXAoZ3B1X21vZGUsICJndWVzdCIpIHx8CisgICAgICAgICAhc3RyY21wKGdwdV9tb2RlLCAib2ZmIikpKSB7CisgICAgICAgIGdwdV9lbmFibGVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFncHVfZW5hYmxlZCkgeworICAgICAgICBjb25maWctPmVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgc25wcmludGYoY29uZmlnLT5iYWNrZW5kLCBzaXplb2YoY29uZmlnLT5iYWNrZW5kKSwgIiVzIiwgZ3B1X21vZGUpOworICAgICAgICBzbnByaW50Zihjb25maWctPnN0YXR1cywgc2l6ZW9mKGNvbmZpZy0+c3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgIkdQVSBlbXVsYXRpb24gaXMgZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCFiaXRuZXNzKSB7CisgICAgICAgIGJpdG5lc3MgPSBTeXN0ZW06OmdldCgpLT5nZXRQcm9ncmFtQml0bmVzcygpOworICAgIH0KKyAgICBjb25maWctPmJpdG5lc3MgPSBiaXRuZXNzOworICAgIHJlc2V0QmFja2VuZExpc3QoYml0bmVzcyk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBHUFUgbW9kZSBpcyBhIHZhbGlkIHZhbHVlLiAnYXV0bycgbWVhbnMgZGV0ZXJtaW5lCisgICAgLy8gdGhlIGJlc3QgbW9kZSBkZXBlbmRpbmcgb24gdGhlIGVudmlyb25tZW50LiBJdHMgcHVycG9zZSBpcyB0bworICAgIC8vIGVuYWJsZSAnc3dpZnRzaGFkZXInIG1vZGUgYXV0b21hdGljYWxseSB3aGVuIE5YIG9yIENocm9tZSBSZW1vdGUgRGVza3RvcAorICAgIC8vIGlzIGRldGVjdGVkLgorICAgIGlmICghc3RyY21wKGdwdV9tb2RlLCAiYXV0byIpKSB7CisgICAgICAgIC8vIFRoZSBkZWZhdWx0IHdpbGwgYmUgJ2hvc3QnIHVubGVzczoKKyAgICAgICAgLy8gMS4gTlggb3IgQ2hyb21lIFJlbW90ZSBEZXNrdG9wIGlzIGRldGVjdGVkLCBvciB8bm9fd2luZG93fCBpcyB0cnVlLgorICAgICAgICAvLyAyLiBUaGUgdXNlcidzIGhvc3QgR1BVIGlzIG9uIHRoZSBibGFja2xpc3QuCisgICAgICAgIHN0ZDo6c3RyaW5nIHNlc3Npb25UeXBlOworICAgICAgICBpZiAoU3lzdGVtOjpnZXQoKS0+aXNSZW1vdGVTZXNzaW9uKCZzZXNzaW9uVHlwZSkpIHsKKyAgICAgICAgICAgIEQoIiVzOiAlcyBzZXNzaW9uIGRldGVjdGVkXG4iLCBfX0ZVTkNUSU9OX18sIHNlc3Npb25UeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKCFzQmFja2VuZExpc3QtPmNvbnRhaW5zKCJzd2lmdHNoYWRlciIpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5lbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZ3B1X21vZGUgPSAib2ZmIjsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihjb25maWctPmJhY2tlbmQsIHNpemVvZihjb25maWctPmJhY2tlbmQpLCAiJXMiLCBncHVfbW9kZSk7CisgICAgICAgICAgICAgICAgc25wcmludGYoY29uZmlnLT5zdGF0dXMsIHNpemVvZihjb25maWctPnN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAiR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZCB1bmRlciAlcyB3aXRob3V0IFN3aWZ0c2hhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25UeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRCgiJXM6ICdzd2lmdHNoYWRlcicgbW9kZSBhdXRvLXNlbGVjdGVkXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgZ3B1X21vZGUgPSAic3dpZnRzaGFkZXIiOworICAgICAgICB9IGVsc2UgaWYgKG5vX3dpbmRvdyB8fCBibGFja2xpc3RlZCkgeworICAgICAgICAgICAgaWYgKHN0cmluZ1ZlY3RvckNvbnRhaW5zKHNCYWNrZW5kTGlzdC0+bmFtZXMoKSwgInN3aWZ0c2hhZGVyIikpIHsKKyAgICAgICAgICAgICAgICBEKCIlczogSGVhZGxlc3MgKC1uby13aW5kb3cpIG1vZGUgKG9yIGJsYWNrbGlzdGVkIEdQVSBkcml2ZXIpIgorICAgICAgICAgICAgICAgICAgIiwgdXNpbmcgU3dpZnRzaGFkZXIgYmFja2VuZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZ3B1X21vZGUgPSAic3dpZnRzaGFkZXIiOworICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzX2d1ZXN0X3JlbmRlcmVyKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IEhlYWRsZXNzICgtbm8td2luZG93KSBtb2RlIChvciBibGFja2xpc3RlZCBHUFUgZHJpdmVyKSIKKyAgICAgICAgICAgICAgICAgICIgd2l0aG91dCBTd2lmdHNoYWRlciwgZm9yY2luZyAnLWdwdSBvZmYnXG4iLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBjb25maWctPmVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBncHVfbW9kZSA9ICJvZmYiOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGNvbmZpZy0+YmFja2VuZCwgc2l6ZW9mKGNvbmZpZy0+YmFja2VuZCksICIlcyIsIGdwdV9tb2RlKTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihjb25maWctPnN0YXR1cywgc2l6ZW9mKGNvbmZpZy0+c3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHUFUgZW11bGF0aW9uIGlzIGRpc2FibGVkICgtbm8td2luZG93IHdpdGhvdXQgU3dpZnRzaGFkZXIpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEQoIiVzOiBIZWFkbGVzcyAoLW5vLXdpbmRvdykgbW9kZSAob3IgYmxhY2tsaXN0ZWQgR1BVIGRyaXZlcikiCisgICAgICAgICAgICAgICAgICAiLCB1c2luZyBndWVzdCBHUFUgYmFja2VuZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgY29uZmlnLT5lbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZ3B1X21vZGUgPSAib2ZmIjsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihjb25maWctPmJhY2tlbmQsIHNpemVvZihjb25maWctPmJhY2tlbmQpLCAiJXMiLCBncHVfbW9kZSk7CisgICAgICAgICAgICAgICAgc25wcmludGYoY29uZmlnLT5zdGF0dXMsIHNpemVvZihjb25maWctPnN0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAiR1BVIGVtdWxhdGlvbiBpcyBpbiB0aGUgZ3Vlc3QiKTsKKyAgICAgICAgICAgICAgICBncHVfbW9kZSA9ICJndWVzdCI7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEKCIlczogJ2hvc3QnIG1vZGUgYXV0by1zZWxlY3RlZFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGdwdV9tb2RlID0gImhvc3QiOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gJ2hvc3QnIGlzIGEgc3BlY2lhbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZWZhdWx0IHRyYW5zbGF0aW9uCisgICAgLy8gdG8gZGVza3RvcCBHTCwgJ2d1ZXN0JyBkb2VzIG5vdCB1c2UgaG9zdC1zaWRlIGVtdWxhdGlvbiwKKyAgICAvLyBhbnl0aGluZyBlbHNlIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGV4aXN0aW5nIGhvc3Qtc2lkZSBiYWNrZW5kcy4KKyAgICBpZiAoc3RyY21wKGdwdV9tb2RlLCAiaG9zdCIpICE9IDAgJiYgc3RyY21wKGdwdV9tb2RlLCAiZ3Vlc3QiKSAhPSAwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYmFja2VuZHMgPSBzQmFja2VuZExpc3QtPm5hbWVzKCk7CisgICAgICAgIGlmICghc3RyaW5nVmVjdG9yQ29udGFpbnMoYmFja2VuZHMsIGdwdV9tb2RlKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3IgPSBTdHJpbmdGb3JtYXQoCisgICAgICAgICAgICAgICAgIkludmFsaWQgR1BVIG1vZGUgJyVzJywgdXNlIG9uZSBvZjogb24gb2ZmIGhvc3QgZ3Vlc3QiLCBncHVfbW9kZSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGJhY2tlbmRzLnNpemUoKTsgKytuKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgKz0gIiAiOworICAgICAgICAgICAgICAgIGVycm9yICs9IGJhY2tlbmRzW25dOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlnLT5lbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBncHVfbW9kZSA9ICJlcnJvciI7CisgICAgICAgICAgICBzbnByaW50Zihjb25maWctPmJhY2tlbmQsIHNpemVvZihjb25maWctPmJhY2tlbmQpLCAiJXMiLCBncHVfbW9kZSk7CisgICAgICAgICAgICBzbnByaW50Zihjb25maWctPnN0YXR1cywgc2l6ZW9mKGNvbmZpZy0+c3RhdHVzKSwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0cmNtcChncHVfbW9kZSwgImd1ZXN0IikpIHsKKyAgICAgICAgY29uZmlnLT5lbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzbnByaW50Zihjb25maWctPmJhY2tlbmQsIHNpemVvZihjb25maWctPmJhY2tlbmQpLCAiJXMiLCBncHVfbW9kZSk7CisgICAgc25wcmludGYoY29uZmlnLT5zdGF0dXMsIHNpemVvZihjb25maWctPnN0YXR1cyksCisgICAgICAgICAgICAgIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnJXMnIG1vZGUiLCBncHVfbW9kZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZW11Z2xDb25maWdfc2V0dXBFbnYoY29uc3QgRW11Z2xDb25maWcqIGNvbmZpZykgeworICAgIFN5c3RlbSogc3lzdGVtID0gU3lzdGVtOjpnZXQoKTsKKworICAgIGlmICghY29uZmlnLT5lbmFibGVkKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHJlYWwgR1BVIGVtdWxhdGlvbi4gQXMgYSBzcGVjaWFsIGNhc2UsIGRlZmluZQorICAgICAgICAvLyBTRExfUkVOREVSX0RSSVZFUiB0byAnc29mdHdhcmUnIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAvLyBzb2Z0d2FyZSBTREwgcmVuZGVyZXIgaXMgYmVpbmcgdXNlZC4gVGhpcyBhbGxvd3Mgb25lCisgICAgICAgIC8vIHRvIHJ1biB3aXRoICctZ3B1IG9mZicgdW5kZXIgTlggYW5kIENocm9tZSBSZW1vdGUgRGVza3RvcAorICAgICAgICAvLyBwcm9wZXJseS4KKyAgICAgICAgc3lzdGVtLT5lbnZTZXQoIlNETF9SRU5ERVJfRFJJVkVSIiwgInNvZnR3YXJlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyAkRVhFQ19ESVIvPGxpYj4vIGlzIGFscmVhZHkgYWRkZWQgdG8gdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggYnkgZGVmYXVsdCwKKyAgICAvLyBzaW5jZSBnZW5lcmljIGxpYnJhcmllcyBhcmUgYnVuZGxlZCB0aGVyZS4gV2UgbWF5IG5lZWQgbW9yZSB0aG91Z2g6CisgICAgcmVzZXRCYWNrZW5kTGlzdChjb25maWctPmJpdG5lc3MpOworICAgIGlmIChzdHJjbXAoY29uZmlnLT5iYWNrZW5kLCAiaG9zdCIpICE9IDApIHsKKyAgICAgICAgLy8gSWYgdGhlIGJhY2tlbmQgaXMgbm90ICdob3N0Jywgd2UgYWxzbyBuZWVkIHRvIGFkZCB0aGUKKyAgICAgICAgLy8gYmFja2VuZCBkaXJlY3RvcnkuCisgICAgICAgIHN0ZDo6c3RyaW5nIGRpciA9IHNCYWNrZW5kTGlzdC0+Z2V0TGliRGlyUGF0aChjb25maWctPmJhY2tlbmQpOworICAgICAgICBpZiAoZGlyLnNpemUoKSkgeworICAgICAgICAgICAgRCgiQWRkaW5nIHRvIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoOiAlc1xuIiwgZGlyLmNfc3RyKCkpOworICAgICAgICAgICAgc3lzdGVtLT5hZGRMaWJyYXJ5U2VhcmNoRGlyKGRpcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChjb25maWctPmJhY2tlbmQsICJob3N0IikpIHsKKyAgICAgICAgLy8gTm90aGluZyBtb3JlIHRvIGRvIGZvciB0aGUgJ2hvc3QnIGJhY2tlbmQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3Igbm93LCBFbXVHTCBzZWxlY3RzIGl0cyBvd24gdHJhbnNsYXRpb24gbGlicmFyaWVzIGZvcgorICAgIC8vIEVHTC9HTEVTIGxpYnJhcmllcywgdW5sZXNzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQKKyAgICAvLyB2YXJpYWJsZXMgYXJlIGRlZmluZWQ6CisgICAgLy8gICAgQU5EUk9JRF9FR0xfTElCCisgICAgLy8gICAgQU5EUk9JRF9HTEVTdjFfTElCCisgICAgLy8gICAgQU5EUk9JRF9HTEVTdjJfTElCCisgICAgLy8KKyAgICAvLyBJZiBhIGJhY2tlbmQgcHJvdmlkZXMgb25lIG9mIHRoZXNlIGxpYnJhcmllcywgdXNlIGl0LgorICAgIHN0ZDo6c3RyaW5nIGxpYjsKKyAgICBpZiAoc0JhY2tlbmRMaXN0LT5nZXRCYWNrZW5kTGliUGF0aCgKKyAgICAgICAgICAgIGNvbmZpZy0+YmFja2VuZCwgRW11Z2xCYWNrZW5kTGlzdDo6TElCUkFSWV9FR0wsICZsaWIpKSB7CisgICAgICAgIHN5c3RlbS0+ZW52U2V0KCJBTkRST0lEX0VHTF9MSUIiLCBsaWIpOworICAgIH0KKyAgICBpZiAoc0JhY2tlbmRMaXN0LT5nZXRCYWNrZW5kTGliUGF0aCgKKyAgICAgICAgICAgIGNvbmZpZy0+YmFja2VuZCwgRW11Z2xCYWNrZW5kTGlzdDo6TElCUkFSWV9HTEVTdjEsICZsaWIpKSB7CisgICAgICAgIHN5c3RlbS0+ZW52U2V0KCJBTkRST0lEX0dMRVN2MV9MSUIiLCBsaWIpOworICAgIH0gZWxzZSBpZiAoc3RyY21wKGNvbmZpZy0+YmFja2VuZCwgIm1lc2EiKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9wZW5HTCBiYWNrZW5kICclcycgd2l0aG91dCBPcGVuR0wgRVMgMS54IGxpYnJhcnkgZGV0ZWN0ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJVc2luZyBHTEVTdjIgb25seS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmJhY2tlbmQpOworICAgICAgICAvLyBBIEdMRVN2MSBsaWIgaXMgb3B0aW9uYWwtLS13ZSBjYW4gZGVhbCB3aXRoIGEgR0xFU3YyIG9ubHkKKyAgICAgICAgLy8gYmFja2VuZCBieSB1c2luZyBhIEdMRVN2MS0+R0xFU3YyIGVtdWxhdGlvbiBsaWJyYXJ5LgorICAgICAgICBzeXN0ZW0tPmVudlNldCgiQU5EUk9JRF9HTEVTdjFfTElCIiwgc0JhY2tlbmRMaXN0LT5nZXRHTEVTMTJUcmFuc2xhdG9yTGliTmFtZSgpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChzQmFja2VuZExpc3QtPmdldEJhY2tlbmRMaWJQYXRoKAorICAgICAgICAgICAgY29uZmlnLT5iYWNrZW5kLCBFbXVnbEJhY2tlbmRMaXN0OjpMSUJSQVJZX0dMRVN2MiwgJmxpYikpIHsKKyAgICAgICAgc3lzdGVtLT5lbnZTZXQoIkFORFJPSURfR0xFU3YyX0xJQiIsIGxpYik7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoY29uZmlnLT5iYWNrZW5kLCAibWVzYSIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogVGhlIE1lc2Egc29mdHdhcmUgcmVuZGVyZXIgaXMgZGVwcmVjYXRlZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBTd2lmdHNoYWRlciAoLWdwdSBzd2lmdHNoYWRlcikgZm9yIHNvZnR3YXJlIHJlbmRlcmluZy5cbiIpOworICAgICAgICBzeXN0ZW0tPmVudlNldCgiQU5EUk9JRF9HTF9MSUIiLCAibWVzYSIpOworICAgICAgICBzeXN0ZW0tPmVudlNldCgiQU5EUk9JRF9HTF9TT0ZUV0FSRV9SRU5ERVJFUiIsICIxIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzODRlZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQSBzbWFsbCBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgRW11R0wgY29uZmlndXJhdGlvbgorLy8gdG8gdXNlLgorLy8gfGVuYWJsZWR8IGlzIHRydWUgaWYgR1BVIGVtdWxhdGlvbiBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuCisvLyB8YmFja2VuZHwgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGJhY2tlbmQgdG8gdXNlLCBpZiB8ZW5hYmxlZHwKKy8vIGlzIHRydWUuCisvLyB8c3RhdHVzfCBpcyBhIHN0cmluZyB1c2VkIHRvIHJlcG9ydCBlcnJvciBvciB0aGUgY3VycmVudCBzdGF0dXMKKy8vIG9mIEVtdUdMIGVtdWxhdGlvbi4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBib29sIGVuYWJsZWQ7CisgICAgYm9vbCB1c2VfYmFja2VuZDsKKyAgICBpbnQgYml0bmVzczsKKyAgICBjaGFyIGJhY2tlbmRbNjRdOworICAgIGNoYXIgc3RhdHVzWzI1Nl07Cit9IEVtdWdsQ29uZmlnOworCisvLyBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGUgaG9zdCBHUFUgaXMgYmxhY2tsaXN0ZWQuIElmIHNvLCBmYWxsIGJhY2sKKy8vIHRvIHNvZnR3YXJlIHJlbmRlcmluZy4KK2Jvb2wgaXNIb3N0R3B1QmxhY2tsaXN0ZWQoKTsKKy8vIElmIHdlIGFjdHVhbGx5IHN3aXRjaGVkIHRvIHNvZnR3YXJlLCBjYWxsIHRoaXMuCit2b2lkIHNldEdwdUJsYWNrbGlzdFN0YXR1cyhib29sIHN3aXRjaGVkU29mdHdhcmUpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciogbWFrZTsKKyAgICBjaGFyKiBtb2RlbDsKKyAgICBjaGFyKiBkZXZpY2VfaWQ7CisgICAgY2hhciogcmV2aXNpb25faWQ7CisgICAgY2hhciogdmVyc2lvbjsKKyAgICBjaGFyKiByZW5kZXJlcjsKK30gZW11Z2xfaG9zdF9ncHVfcHJvcHM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbnVtX2dwdXM7CisgICAgZW11Z2xfaG9zdF9ncHVfcHJvcHMqIHByb3BzOworfSBlbXVnbF9ob3N0X2dwdV9wcm9wX2xpc3Q7CisKKy8vIEdldCBhIGRlc2NyaXB0aW9uIG9mIGhvc3QgR1BVIHByb3BlcnRpZXMuCisvLyBOZWVkIHRvIGZyZWUgYWZ0ZXIgdXNlLgorZW11Z2xfaG9zdF9ncHVfcHJvcF9saXN0IGVtdWdsQ29uZmlnX2dldF9ob3N0X2dwdV9wcm9wcygpOworCisvLyBFbnVtIHRyYWNraW5nIGFsbCBjdXJyZW50IGF2YWlsYWJsZSByZW5kZXJlciBiYWNrZW5kcworLy8gZm9yIHRoZSBlbXVsYXRvci4KK3R5cGVkZWYgZW51bSBTZWxlY3RlZFJlbmRlcmVyIHsKKyAgICBTRUxFQ1RFRF9SRU5ERVJFUl9VTktOT1dOID0gMCwKKyAgICBTRUxFQ1RFRF9SRU5ERVJFUl9IT1NUID0gMSwKKyAgICBTRUxFQ1RFRF9SRU5ERVJFUl9PRkYgPSAyLAorICAgIFNFTEVDVEVEX1JFTkRFUkVSX0dVRVNUID0gMywKKyAgICBTRUxFQ1RFRF9SRU5ERVJFUl9NRVNBID0gNCwKKyAgICBTRUxFQ1RFRF9SRU5ERVJFUl9TV0lGVFNIQURFUiA9IDUsCisgICAgU0VMRUNURURfUkVOREVSRVJfQU5HTEUgPSA2LAorICAgIFNFTEVDVEVEX1JFTkRFUkVSX0VSUk9SID0gMjU1LAorfSBTZWxlY3RlZFJlbmRlcmVyOworCisvLyBSZXR1cm5zIFNlbGVjdGVkUmVuZGVyZXIgdmFsdWUgdGhlIHNlbGVjdGVkIGdwdSBtb2RlLgorLy8gQXNzdW1lcyB0aGF0IHRoZSAtZ3B1IGNvbW1hbmQgbGluZSBvcHRpb24KKy8vIGhhcyBiZWVuIHRha2VuIGludG8gYWNjb3VudCBhbHJlYWR5LgorU2VsZWN0ZWRSZW5kZXJlciBlbXVnbENvbmZpZ19nZXRfcmVuZGVyZXIoY29uc3QgY2hhciogZ3B1X21vZGUpOworCit2b2lkIGZyZWVfZW11Z2xfaG9zdF9ncHVfcHJvcHMoZW11Z2xfaG9zdF9ncHVfcHJvcF9saXN0IHByb3BzKTsKKworLy8gSW5pdGlhbGl6ZSBhbiBFbXVnbENvbmZpZyBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgQVZEJ3MgaGFyZHdhcmUgcHJvcGVydGllcworLy8gYW5kIHRoZSBjb21tYW5kLWxpbmUgLWdwdSBvcHRpb24sIGlmIGFueS4KKy8vCisvLyB8Y29uZmlnfCBpcyB0aGUgaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS4KKy8vIHxncHVfZW5hYmxlZHwgaXMgdGhlIHZhbHVlIG9mIHRoZSBody5ncHUuZW5hYmxlZCBoYXJkd2FyZSBwcm9wZXJ0eS4KKy8vIHxncHVfbW9kZXwgaXMgdGhlIHZhbHVlIG9mIHRoZSBody5ncHUubW9kZSBoYXJkd2FyZSBwcm9wZXJ0eS4KKy8vIHxncHVfb3B0aW9ufCBpcyB0aGUgdmFsdWUgb2YgdGhlICctZ3B1IDxtb2RlPicgb3B0aW9uLCBvciBOVUxMLgorLy8gfGJpdG5lc3N8IGlzIHRoZSBob3N0IGJpdG5lc3MgKDAsIDMyIG9yIDY0KS4KKy8vIHxub193aW5kb3d8IGlzIHRydWUgaWYgdGhlICctbm8td2luZG93JyBlbXVsYXRvciBmbGFnIHdhcyB1c2VkLgorLy8gfGJsYWNrbGlzdGVkfCBpcyB0cnVlIGlmIHRoZSBHUFUgZHJpdmVyIGlzIG9uIHRoZSBsaXN0IG9mCisvLyBjcmFzaHkgR1BVIGRyaXZlcnMuCisvLworLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAoZS5nLiBiYWQKKy8vIG1vZGUgb3Igb3B0aW9uIHZhbHVlKSwgaW4gd2hpY2ggY2FzZSB0aGUgfHN0YXR1c3wgZmllbGQgd2lsbCBjb250YWluCisvLyBhIHNtYWxsIGVycm9yIG1lc3NhZ2UuCitib29sIGVtdWdsQ29uZmlnX2luaXQoRW11Z2xDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGdwdV9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdwdV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGdwdV9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub193aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBibGFja2xpc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGdvb2dsZV9hcGlzKTsKKworLy8gU2V0dXAgR1BVIGVtdWxhdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiB8YmFja2VuZHwuCisvLyB8Yml0bmVzc3wgaXMgdGhlIGhvc3QgYml0bmVzcywgYW5kIGNhbiBiZSAwIChhdXRvZGV0ZWN0KSwgMzIgb3IgNjQuCit2b2lkIGVtdWdsQ29uZmlnX3NldHVwRW52KGNvbnN0IEVtdWdsQ29uZmlnKiBjb25maWcpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE2YzE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWdfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL2VtdWdsX2NvbmZpZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL0VtdWdsQmFja2VuZExpc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9ncHVpbmZvLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBiYXNlIHsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorIyAgZGVmaW5lIExJQl9OQU1FKHgpICB4ICIuZGxsIgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBkZWZpbmUgTElCX05BTUUoeCkgICJsaWIiIHggIi5keWxpYiIKKyNlbHNlCisjICBkZWZpbmUgTElCX05BTUUoeCkgICJsaWIiIHggIi5zbyIKKyNlbmRpZgorCitzdGF0aWMgc3RkOjpzdHJpbmcgbWFrZUxpYlN1YlBhdGgoY29uc3QgY2hhciogbmFtZSkgeworICAgIHJldHVybiBTdHJpbmdGb3JtYXQoIiVzLyVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6a0xpYlN1YkRpciwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1ha2VMaWJTdWJEaXIoVGVzdFRlbXBEaXIqIGRpciwgY29uc3QgY2hhciogbmFtZSkgeworICAgIGRpci0+bWFrZVN1YkRpcihtYWtlTGliU3ViUGF0aChuYW1lKS5jX3N0cigpKTsKK30KKworc3RhdGljIHZvaWQgbWFrZUxpYlN1YkZpbGUoVGVzdFRlbXBEaXIqIGRpciwgY29uc3QgY2hhciogbmFtZSkgeworICAgIGRpci0+bWFrZVN1YkZpbGUobWFrZUxpYlN1YlBhdGgobmFtZSkuY19zdHIoKSk7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIGluaXQpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoImZvbyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICBUZXN0VGVtcERpciogbXlEaXIgPSB0ZXN0U3lzLmdldFRlbXBSb290KCk7CisgICAgbXlEaXItPm1ha2VTdWJEaXIoU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKS5jX3N0cigpKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiIik7CisKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19tZXNhIik7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX21lc2EvbGliR0xFUy5zbyIpOworCisgICAgbWFrZUxpYlN1YkRpcihteURpciwgImdsZXNfdmVuZG9yIik7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX3ZlbmRvci8iIExJQl9OQU1FKCJFR0wiKSk7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX3ZlbmRvci8iIExJQl9OQU1FKCJHTEVTdjIiKSk7CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgZmFsc2UsICJob3N0IiwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gaXMgZGlzYWJsZWQiLCBjb25maWcuc3RhdHVzKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgdHJ1ZSwgImhvc3QiLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGNvbmZpZy5lbmFibGVkKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJob3N0IiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnaG9zdCcgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAibWVzYSIsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIm1lc2EiLCBjb25maWcuYmFja2VuZCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBlbmFibGVkIHVzaW5nICdtZXNhJyBtb2RlIiwgY29uZmlnLnN0YXR1cyk7CisgICAgfQorCisgICAgeworICAgICAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgICAgICZjb25maWcsIHRydWUsICJob3N0IiwgIm9mZiIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNvbmZpZy5lbmFibGVkKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJHUFUgZW11bGF0aW9uIGlzIGRpc2FibGVkIiwgY29uZmlnLnN0YXR1cyk7CisgICAgfQorCisgICAgeworICAgICAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgJmNvbmZpZywgdHJ1ZSwgImhvc3QiLCAiZGlzYWJsZSIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGNvbmZpZy5lbmFibGVkKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJHUFUgZW11bGF0aW9uIGlzIGRpc2FibGVkIiwgY29uZmlnLnN0YXR1cyk7CisgICAgfQorCisgICAgeworICAgICAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgICAgICZjb25maWcsIGZhbHNlLCAiaG9zdCIsICJvbiIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoImhvc3QiLCBjb25maWcuYmFja2VuZCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBlbmFibGVkIHVzaW5nICdob3N0JyBtb2RlIiwgY29uZmlnLnN0YXR1cyk7CisgICAgfQorCisgICAgeworICAgICAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgICAgICZjb25maWcsIGZhbHNlLCBOVUxMLCAib24iLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGNvbmZpZy5lbmFibGVkKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJob3N0IiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnaG9zdCcgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIGZhbHNlLCAibWVzYSIsICJlbmFibGUiLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGNvbmZpZy5lbmFibGVkKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJtZXNhIiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnbWVzYScgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworCisgICAgeworICAgICAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgJmNvbmZpZywgdHJ1ZSwgInZlbmRvciIsICJhdXRvIiwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBFWFBFQ1RfVFJVRShjb25maWcuZW5hYmxlZCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgidmVuZG9yIiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAndmVuZG9yJyBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zdGF0dXMpOworICAgICAgICBlbXVnbENvbmZpZ19zZXR1cEVudigmY29uZmlnKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoCisgICAgICAgICAgICAgICAgc3Ryc3RyKFN5c3RlbTo6Z2V0KCktPmVudkdldCgiQU5EUk9JRF9HTEVTdjFfTElCIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6b3BlbmdsOjprR0xFUzEyVHJhbnNsYXRvck5hbWUpICE9IE5VTEwpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIGZhbHNlLCAidmVuZG9yIiwgImF1dG8iLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShjb25maWcuZW5hYmxlZCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZCIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIHRydWUsICJob3N0IiwgInZlbmRvciIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoInZlbmRvciIsIGNvbmZpZy5iYWNrZW5kKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKCJHUFUgZW11bGF0aW9uIGVuYWJsZWQgdXNpbmcgJ3ZlbmRvcicgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIHRydWUsICJndWVzdCIsICJhdXRvIiwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gaXMgZGlzYWJsZWQiLCBjb25maWcuc3RhdHVzKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCBmYWxzZSwgImd1ZXN0IiwgImF1dG8iLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShjb25maWcuZW5hYmxlZCk7CisgICAgICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZCIsIGNvbmZpZy5zdGF0dXMpOworICAgIH0KKworICAgIHsKKyAgICAgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgICAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIHRydWUsICJob3N0IiwgImd1ZXN0IiwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoY29uZmlnLmVuYWJsZWQpOworICAgIH0KK30KKworVEVTVChFbXVnbENvbmZpZywgaW5pdEdMRVN2Mk9ubHkpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoImZvbyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICBUZXN0VGVtcERpciogbXlEaXIgPSB0ZXN0U3lzLmdldFRlbXBSb290KCk7CisgICAgbXlEaXItPm1ha2VTdWJEaXIoU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKS5jX3N0cigpKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiIik7CisKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiZ2xlc19hbmdsZSIpOworCisjaWZkZWYgX1dJTjMyCisgICAgY29uc3QgY2hhcioga0VnbExpYk5hbWUgPSAibGliRUdMLmRsbCI7CisgICAgY29uc3QgY2hhcioga0dMRVN2MUxpYk5hbWUgPSAibGliR0xFU19DTS5kbGwiOworICAgIGNvbnN0IGNoYXIqIGtHTEVTdjJMaWJOYW1lID0gImxpYkdMRVN2Mi5kbGwiOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgY29uc3QgY2hhcioga0VnbExpYk5hbWUgPSAibGliRUdMLmR5bGliIjsKKyAgICBjb25zdCBjaGFyKiBrR0xFU3YxTGliTmFtZSA9ICJsaWJHTEVTX0NNLmR5bGliIjsKKyAgICBjb25zdCBjaGFyKiBrR0xFU3YyTGliTmFtZSA9ICJsaWJHTEVTdjIuZHlsaWIiOworI2Vsc2UKKyAgICBjb25zdCBjaGFyKiBrRWdsTGliTmFtZSA9ICJsaWJFR0wuc28iOworICAgIGNvbnN0IGNoYXIqIGtHTEVTdjFMaWJOYW1lID0gImxpYkdMRVNfQ00uc28iOworICAgIGNvbnN0IGNoYXIqIGtHTEVTdjJMaWJOYW1lID0gImxpYkdMRVN2Mi5zbyI7CisjZW5kaWYKKworICAgIHN0ZDo6c3RyaW5nIGVnbExpYlBhdGggPSBTdHJpbmdGb3JtYXQoImdsZXNfYW5nbGUvJXMiLCBrRWdsTGliTmFtZSk7CisgICAgc3RkOjpzdHJpbmcgR0xFU3YxTGliUGF0aCA9IFN0cmluZ0Zvcm1hdCgiZ2xlc19hbmdsZS8lcyIsIGtHTEVTdjFMaWJOYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBHTEVTdjJMaWJQYXRoID0gU3RyaW5nRm9ybWF0KCJnbGVzX2FuZ2xlLyVzIiwga0dMRVN2MkxpYk5hbWUpOworCisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsIGVnbExpYlBhdGguY19zdHIoKSk7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsIEdMRVN2MkxpYlBhdGguY19zdHIoKSk7CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAiYW5nbGUiLCAiYXV0byIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoImFuZ2xlIiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnYW5nbGUnIG1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyk7CisgICAgICAgIGVtdWdsQ29uZmlnX3NldHVwRW52KCZjb25maWcpOworICAgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAgICAgICBzdHJzdHIoU3lzdGVtOjpnZXQoKS0+ZW52R2V0KCJBTkRST0lEX0dMRVN2MV9MSUIiKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpvcGVuZ2w6OmtHTEVTMTJUcmFuc2xhdG9yTmFtZSkgIT0gTlVMTCk7CisgICAgfQorCisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsIEdMRVN2MUxpYlBhdGguY19zdHIoKSk7CisKKyAgICB7CisgICAgICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAiYW5nbGUiLCAiYXV0byIsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoImFuZ2xlIiwgY29uZmlnLmJhY2tlbmQpOworICAgICAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gZW5hYmxlZCB1c2luZyAnYW5nbGUnIG1vZGUiLAorICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyk7CisgICAgICAgIGVtdWdsQ29uZmlnX3NldHVwRW52KCZjb25maWcpOworICAgICAgICBFWFBFQ1RfRkFMU0UoCisgICAgICAgICAgICAgICAgc3Ryc3RyKFN5c3RlbTo6Z2V0KCktPmVudkdldCgiQU5EUk9JRF9HTEVTdjFfTElCIikuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6b3BlbmdsOjprR0xFUzEyVHJhbnNsYXRvck5hbWUpICE9IE5VTEwpOworICAgIH0KK30KKworVEVTVChFbXVnbENvbmZpZywgaW5pdE54V2l0aFN3aWZ0c2hhZGVyKSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCJmb28iLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcyk7CisgICAgVGVzdFRlbXBEaXIqIG15RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIG15RGlyLT5tYWtlU3ViRGlyKFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCkuY19zdHIoKSk7CisgICAgbWFrZUxpYlN1YkRpcihteURpciwgIiIpOworCisgICAgbWFrZUxpYlN1YkRpcihteURpciwgImdsZXNfc3dpZnRzaGFkZXIiKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliRUdMLnNvIik7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX3N3aWZ0c2hhZGVyL2xpYkdMRVNfQ00uc28iKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliR0xFU3YyLnNvIik7CisKKyAgICB0ZXN0U3lzLnNldFJlbW90ZVNlc3Npb25UeXBlKCJOWCIpOworCisgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgJmNvbmZpZywgdHJ1ZSwgImF1dG8iLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgRVhQRUNUX1RSVUUoY29uZmlnLmVuYWJsZWQpOworICAgIEVYUEVDVF9TVFJFUSgic3dpZnRzaGFkZXIiLCBjb25maWcuYmFja2VuZCk7CisgICAgRVhQRUNUX1NUUkVRKCJHUFUgZW11bGF0aW9uIGVuYWJsZWQgdXNpbmcgJ3N3aWZ0c2hhZGVyJyBtb2RlIiwgY29uZmlnLnN0YXR1cyk7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIGluaXROeFdpdGhvdXRTd2lmdHNoYWRlcikgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIFRlc3RUZW1wRGlyKiBteURpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKyAgICBteURpci0+bWFrZVN1YkRpcihTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpLmNfc3RyKCkpOworICAgIG1ha2VMaWJTdWJEaXIobXlEaXIsICIiKTsKKworICAgIHRlc3RTeXMuc2V0UmVtb3RlU2Vzc2lvblR5cGUoIk5YIik7CisKKyAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAiYXV0byIsIE5VTEwsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICBFWFBFQ1RfRkFMU0UoY29uZmlnLmVuYWJsZWQpOworICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZCB1bmRlciBOWCB3aXRob3V0IFN3aWZ0c2hhZGVyIiwgY29uZmlnLnN0YXR1cyk7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIGluaXRDaHJvbWVSZW1vdGVEZXNrdG9wV2l0aFN3aWZ0c2hhZGVyKSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCJmb28iLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcyk7CisgICAgVGVzdFRlbXBEaXIqIG15RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIG15RGlyLT5tYWtlU3ViRGlyKFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCkuY19zdHIoKSk7CisgICAgbWFrZUxpYlN1YkRpcihteURpciwgIiIpOworCisgICAgbWFrZUxpYlN1YkRpcihteURpciwgImdsZXNfc3dpZnRzaGFkZXIiKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliRUdMLnNvIik7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX3N3aWZ0c2hhZGVyL2xpYkdMRVNfQ00uc28iKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliR0xFU3YyLnNvIik7CisKKyAgICB0ZXN0U3lzLnNldFJlbW90ZVNlc3Npb25UeXBlKCJDaHJvbWUgUmVtb3RlIERlc2t0b3AiKTsKKworICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKyAgICBFWFBFQ1RfVFJVRShlbXVnbENvbmZpZ19pbml0KAorICAgICAgICAgICAgICAgICZjb25maWcsIHRydWUsICJhdXRvIiwgTlVMTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgIEVYUEVDVF9UUlVFKGNvbmZpZy5lbmFibGVkKTsKKyAgICBFWFBFQ1RfU1RSRVEoInN3aWZ0c2hhZGVyIiwgY29uZmlnLmJhY2tlbmQpOworICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBlbmFibGVkIHVzaW5nICdzd2lmdHNoYWRlcicgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworfQorCitURVNUKEVtdWdsQ29uZmlnLCBpbml0Q2hyb21lUmVtb3RlRGVza3RvcFdpdGhvdXRTd2lmdHNoYWRlcikgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiZm9vIiwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworICAgIFRlc3RUZW1wRGlyKiBteURpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKyAgICBteURpci0+bWFrZVN1YkRpcihTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpLmNfc3RyKCkpOworICAgIG1ha2VMaWJTdWJEaXIobXlEaXIsICIiKTsKKworICAgIHRlc3RTeXMuc2V0UmVtb3RlU2Vzc2lvblR5cGUoIkNocm9tZSBSZW1vdGUgRGVza3RvcCIpOworCisgICAgRW11Z2xDb25maWcgY29uZmlnOworICAgIEVYUEVDVF9UUlVFKGVtdWdsQ29uZmlnX2luaXQoCisgICAgICAgICAgICAgICAgJmNvbmZpZywgdHJ1ZSwgImF1dG8iLCBOVUxMLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSk7CisgICAgRVhQRUNUX0ZBTFNFKGNvbmZpZy5lbmFibGVkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkdQVSBlbXVsYXRpb24gaXMgZGlzYWJsZWQgdW5kZXIgQ2hyb21lIFJlbW90ZSBEZXNrdG9wIHdpdGhvdXQgU3dpZnRzaGFkZXIiLCBjb25maWcuc3RhdHVzKTsKK30KKworVEVTVChFbXVnbENvbmZpZywgaW5pdE5vV2luZG93V2l0aFN3aWZ0c2hhZGVyKSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKCJmb28iLCBTeXN0ZW06OmtQcm9ncmFtQml0bmVzcyk7CisgICAgVGVzdFRlbXBEaXIqIG15RGlyID0gdGVzdFN5cy5nZXRUZW1wUm9vdCgpOworICAgIG15RGlyLT5tYWtlU3ViRGlyKFN5c3RlbTo6Z2V0KCktPmdldExhdW5jaGVyRGlyZWN0b3J5KCkuY19zdHIoKSk7CisgICAgbWFrZUxpYlN1YkRpcihteURpciwgIiIpOworCisgICAgbWFrZUxpYlN1YkRpcihteURpciwgImdsZXNfc3dpZnRzaGFkZXIiKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliRUdMLnNvIik7CisgICAgbWFrZUxpYlN1YkZpbGUobXlEaXIsICJnbGVzX3N3aWZ0c2hhZGVyL2xpYkdMRVNfQ00uc28iKTsKKyAgICBtYWtlTGliU3ViRmlsZShteURpciwgImdsZXNfc3dpZnRzaGFkZXIvbGliR0xFU3YyLnNvIik7CisKKyAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAiYXV0byIsIE5VTEwsIDAsIHRydWUsIGZhbHNlLCBmYWxzZSkpOworICAgIEVYUEVDVF9UUlVFKGNvbmZpZy5lbmFibGVkKTsKKyAgICBFWFBFQ1RfU1RSRVEoInN3aWZ0c2hhZGVyIiwgY29uZmlnLmJhY2tlbmQpOworICAgIEVYUEVDVF9TVFJFUSgiR1BVIGVtdWxhdGlvbiBlbmFibGVkIHVzaW5nICdzd2lmdHNoYWRlcicgbW9kZSIsIGNvbmZpZy5zdGF0dXMpOworfQorCitURVNUKEVtdWdsQ29uZmlnLCBpbml0Tm9XaW5kb3dXaXRob3V0U3dpZnRzaGFkZXIpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoImZvbyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICBUZXN0VGVtcERpciogbXlEaXIgPSB0ZXN0U3lzLmdldFRlbXBSb290KCk7CisgICAgbXlEaXItPm1ha2VTdWJEaXIoU3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKS5jX3N0cigpKTsKKyAgICBtYWtlTGliU3ViRGlyKG15RGlyLCAiIik7CisKKyAgICBFbXVnbENvbmZpZyBjb25maWc7CisgICAgRVhQRUNUX1RSVUUoZW11Z2xDb25maWdfaW5pdCgKKyAgICAgICAgICAgICAgICAmY29uZmlnLCB0cnVlLCAiYXV0byIsIE5VTEwsIDAsIHRydWUsIGZhbHNlLCBmYWxzZSkpOworICAgIEVYUEVDVF9GQUxTRShjb25maWcuZW5hYmxlZCk7CisgICAgRVhQRUNUX1NUUkVRKCJHUFUgZW11bGF0aW9uIGlzIGRpc2FibGVkICgtbm8td2luZG93IHdpdGhvdXQgU3dpZnRzaGFkZXIpIiwKKyAgICAgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyk7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIHNldHVwRW52KSB7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIGhvc3RHcHVQcm9wcykgeworICAgIEdwdUluZm9MaXN0KiBncHVsaXN0ID0gR3B1SW5mb0xpc3Q6OmdldCgpOworICAgIGdwdWxpc3QtPmNsZWFyKCk7CisgICAgRVhQRUNUX1RSVUUoZ3B1bGlzdC0+aW5mb3Muc2l6ZSgpID09IDApOworICAgIGdwdWxpc3QtPmFkZEdwdSgpOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tYWtlID0gIlRFU1QgR1BVMCBNQUtFIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkubW9kZWwgPSAiVEVTVCBHUFUwIE1PREVMIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkuZGV2aWNlX2lkID0gIlRFU1QgR1BVMCBERVZJQ0VJRCI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnJldmlzaW9uX2lkID0gIlRFU1QgR1BVMCBSRVZJU0lPTklEIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkudmVyc2lvbiA9ICJURVNUIEdQVTAgVkVSU0lPTiI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnJlbmRlcmVyID0gIlRFU1QgR1BVMCBSRU5ERVJFUiI7CisgICAgZ3B1bGlzdC0+YWRkR3B1KCk7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLm1ha2UgPSAiVEVTVCBHUFUxIE1BS0UiOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tb2RlbCA9ICJURVNUIEdQVTEgTU9ERUwiOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5kZXZpY2VfaWQgPSAiVEVTVCBHUFUxIERFVklDRUlEIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkucmV2aXNpb25faWQgPSAiVEVTVCBHUFUxIFJFVklTSU9OSUQiOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS52ZXJzaW9uID0gIlRFU1QgR1BVMSBWRVJTSU9OIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkucmVuZGVyZXIgPSAiVEVTVCBHUFUxIFJFTkRFUkVSIjsKKyAgICBncHVsaXN0LT5hZGRHcHUoKTsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkubWFrZSA9ICJURVNUIEdQVTIgTUFLRSI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLm1vZGVsID0gIlRFU1QgR1BVMiBNT0RFTCI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLmRldmljZV9pZCA9ICJURVNUIEdQVTIgREVWSUNFSUQiOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5yZXZpc2lvbl9pZCA9ICJURVNUIEdQVTIgUkVWSVNJT05JRCI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnZlcnNpb24gPSAiVEVTVCBHUFUyIFZFUlNJT04iOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5yZW5kZXJlciA9ICJURVNUIEdQVTIgUkVOREVSRVIiOworICAgIGdwdWxpc3QtPmFkZEdwdSgpOworICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tYWtlID0gIlRFU1QgR1BVMyBNQUtFIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkubW9kZWwgPSAiVEVTVCBHUFUzIE1PREVMIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkuZGV2aWNlX2lkID0gIlRFU1QgR1BVMyBERVZJQ0VJRCI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnJldmlzaW9uX2lkID0gIlRFU1QgR1BVMyBSRVZJU0lPTklEIjsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkudmVyc2lvbiA9ICJURVNUIEdQVTMgVkVSU0lPTiI7CisgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnJlbmRlcmVyID0gIlRFU1QgR1BVMyBSRU5ERVJFUiI7CisKKyAgICBlbXVnbF9ob3N0X2dwdV9wcm9wX2xpc3QgZ3B1X3Byb3BzID0gZW11Z2xDb25maWdfZ2V0X2hvc3RfZ3B1X3Byb3BzKCk7CisgICAgRVhQRUNUX1RSVUUoZ3B1X3Byb3BzLm51bV9ncHVzID09IDQpOworCisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTAgTUFLRSIsIGdwdV9wcm9wcy5wcm9wc1swXS5tYWtlKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMSBNQUtFIiwgZ3B1X3Byb3BzLnByb3BzWzFdLm1ha2UpOworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUyIE1BS0UiLCBncHVfcHJvcHMucHJvcHNbMl0ubWFrZSk7CisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTMgTUFLRSIsIGdwdV9wcm9wcy5wcm9wc1szXS5tYWtlKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUwIE1PREVMIiwgZ3B1X3Byb3BzLnByb3BzWzBdLm1vZGVsKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMSBNT0RFTCIsIGdwdV9wcm9wcy5wcm9wc1sxXS5tb2RlbCk7CisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTIgTU9ERUwiLCBncHVfcHJvcHMucHJvcHNbMl0ubW9kZWwpOworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUzIE1PREVMIiwgZ3B1X3Byb3BzLnByb3BzWzNdLm1vZGVsKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUwIERFVklDRUlEIiwgZ3B1X3Byb3BzLnByb3BzWzBdLmRldmljZV9pZCk7CisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTEgREVWSUNFSUQiLCBncHVfcHJvcHMucHJvcHNbMV0uZGV2aWNlX2lkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMiBERVZJQ0VJRCIsIGdwdV9wcm9wcy5wcm9wc1syXS5kZXZpY2VfaWQpOworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUzIERFVklDRUlEIiwgZ3B1X3Byb3BzLnByb3BzWzNdLmRldmljZV9pZCk7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMCBSRVZJU0lPTklEIiwgZ3B1X3Byb3BzLnByb3BzWzBdLnJldmlzaW9uX2lkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMSBSRVZJU0lPTklEIiwgZ3B1X3Byb3BzLnByb3BzWzFdLnJldmlzaW9uX2lkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMiBSRVZJU0lPTklEIiwgZ3B1X3Byb3BzLnByb3BzWzJdLnJldmlzaW9uX2lkKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMyBSRVZJU0lPTklEIiwgZ3B1X3Byb3BzLnByb3BzWzNdLnJldmlzaW9uX2lkKTsKKworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUwIFZFUlNJT04iLCBncHVfcHJvcHMucHJvcHNbMF0udmVyc2lvbik7CisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTEgVkVSU0lPTiIsIGdwdV9wcm9wcy5wcm9wc1sxXS52ZXJzaW9uKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMiBWRVJTSU9OIiwgZ3B1X3Byb3BzLnByb3BzWzJdLnZlcnNpb24pOworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUzIFZFUlNJT04iLCBncHVfcHJvcHMucHJvcHNbM10udmVyc2lvbik7CisKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMCBSRU5ERVJFUiIsIGdwdV9wcm9wcy5wcm9wc1swXS5yZW5kZXJlcik7CisgICAgRVhQRUNUX1NUUkVRKCJURVNUIEdQVTEgUkVOREVSRVIiLCBncHVfcHJvcHMucHJvcHNbMV0ucmVuZGVyZXIpOworICAgIEVYUEVDVF9TVFJFUSgiVEVTVCBHUFUyIFJFTkRFUkVSIiwgZ3B1X3Byb3BzLnByb3BzWzJdLnJlbmRlcmVyKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRFU1QgR1BVMyBSRU5ERVJFUiIsIGdwdV9wcm9wcy5wcm9wc1szXS5yZW5kZXJlcik7CisKKyAgICBmcmVlX2VtdWdsX2hvc3RfZ3B1X3Byb3BzKGdwdV9wcm9wcyk7Cit9CisKK1RFU1QoRW11Z2xDb25maWcsIGhvc3RHcHVQcm9wc19lbXB0eSkgeworICAgIEdwdUluZm9MaXN0KiBncHVsaXN0ID0gR3B1SW5mb0xpc3Q6OmdldCgpOworICAgIGdwdWxpc3QtPmNsZWFyKCk7CisgICAgRVhQRUNUX1RSVUUoZ3B1bGlzdC0+aW5mb3Muc2l6ZSgpID09IDApOworCisgICAgZW11Z2xfaG9zdF9ncHVfcHJvcF9saXN0IGdwdV9wcm9wcyA9IGVtdWdsQ29uZmlnX2dldF9ob3N0X2dwdV9wcm9wcygpOworICAgIEVYUEVDVF9UUlVFKGdwdV9wcm9wcy5udW1fZ3B1cyA9PSAwKTsKKyAgICBmcmVlX2VtdWdsX2hvc3RfZ3B1X3Byb3BzKGdwdV9wcm9wcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9ncHVpbmZvLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZ3B1aW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjYWMwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZ3B1aW5mby5jcHAKQEAgLTAsMCArMSw1MTcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9QYXJhbGxlbFRhc2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9UaHJlYWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9ncHVpbmZvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2lvLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb29wZXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXJhbGxlbFRhc2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpSdW5PcHRpb25zOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworI2lmZGVmIF9XSU4zMgordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBTeXN0ZW06OkR1cmF0aW9uIGtHUFVJbmZvUXVlcnlUaW1lb3V0TXMgPSA1MDAwOworc3RhdGljIGNvbnN0IFN5c3RlbTo6RHVyYXRpb24ga1F1ZXJ5Q2hlY2tJbnRlcnZhbE1zID0gNjY7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtGaWVsZExlbiA9IDIwNDg7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgTk9URk9VTkQgPSBzdGQ6OnN0cmluZzo6bnBvczsKKworc3RhdGljIDo6YW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEdwdUluZm9MaXN0PiBzR3B1SW5mb0xpc3QgPQorICAgICAgICBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK0dwdUluZm9MaXN0KiBHcHVJbmZvTGlzdDo6Z2V0KCkgeworICAgIHJldHVybiBzR3B1SW5mb0xpc3QucHRyKCk7Cit9CisKK3ZvaWQgR3B1SW5mbzo6YWRkRGxsKHN0ZDo6c3RyaW5nIGRsbF9zdHIpIHsKKyAgICBkbGxzLnB1c2hfYmFjayhkbGxfc3RyKTsKK30KKwordm9pZCBHcHVJbmZvTGlzdDo6YWRkR3B1KCkgeworICAgIGluZm9zLnB1c2hfYmFjayhHcHVJbmZvKCkpOworfQorR3B1SW5mbyYgR3B1SW5mb0xpc3Q6OmN1cnJHcHUoKSB7CisgICAgaWYgKGluZm9zLmVtcHR5KCkpIHsgYWRkR3B1KCk7IH0KKyAgICByZXR1cm4gaW5mb3MuYmFjaygpOworfQorCitzdGQ6OnN0cmluZyBHcHVJbmZvTGlzdDo6ZHVtcCgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNzIDw8ICJHUFUgIyIgPDwgaSArIDEgPDwgc3RkOjplbmRsOworCisgICAgICAgIGlmICghaW5mb3NbaV0ubWFrZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBzcyA8PCAiICBNYWtlOiAiIDw8IGluZm9zW2ldLm1ha2UgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGlmICghaW5mb3NbaV0ubW9kZWwuZW1wdHkoKSkgeworICAgICAgICAgICAgc3MgPDwgIiAgTW9kZWw6ICIgPDwgaW5mb3NbaV0ubW9kZWwgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGlmICghaW5mb3NbaV0uZGV2aWNlX2lkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNzIDw8ICIgIERldmljZSBJRDogIiA8PCBpbmZvc1tpXS5kZXZpY2VfaWQgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGlmICghaW5mb3NbaV0ucmV2aXNpb25faWQuZW1wdHkoKSkgeworICAgICAgICAgICAgc3MgPDwgIiAgUmV2aXNpb24gSUQ6ICIgPDwgaW5mb3NbaV0ucmV2aXNpb25faWQgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIGlmICghaW5mb3NbaV0udmVyc2lvbi5lbXB0eSgpKSB7CisgICAgICAgICAgICBzcyA8PCAiICBEcml2ZXIgdmVyc2lvbjogIiA8PCBpbmZvc1tpXS52ZXJzaW9uIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWluZm9zW2ldLnJlbmRlcmVyLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHNzIDw8ICIgIFJlbmRlcmVyOiAiIDw8IGluZm9zW2ldLnJlbmRlcmVyIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgR3B1SW5mb0xpc3Q6OmNsZWFyKCkgeworICAgIGJsYWNrbGlzdF9zdGF0dXMgPSBmYWxzZTsKKyAgICBpbmZvcy5jbGVhcigpOworfQorCisvLyBBY3R1YWwgYmxhY2tsaXN0IHN0YXJ0cyBoZXJlLgorLy8gTW9zdCBlbnRyaWVzIGltcG9ydGVkIGZyb20gQ2hyb21lIGJsYWNrbGlzdC4KK3N0YXRpYyBjb25zdCBCbGFja2xpc3RFbnRyeSBzR3B1QmxhY2tsaXN0W10gPSB7CisKKyAgICAgICAgLy8gTWFrZSB8IE1vZGVsIHwgRGV2aWNlSUQgfCBSZXZpc2lvbklEIHwgRHJpdmVyVmVyc2lvbiB8IFJlbmRlcmVyCisgICAgICAgIHtudWxscHRyLCBudWxscHRyLCAiMHg3MjQ5IiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHJ9LCAgLy8gQVRJIFJhZGVvbiBYMTkwMCBvbiBNYWMKKyAgICAgICAgeyI4MDg2IiwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICJNZXNhIn0sICAvLyBMaW51eCwgSW50ZWwsIE1lc2EKKyAgICAgICAgeyI4MDg2IiwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICJtZXNhIn0sICAvLyBMaW51eCwgSW50ZWwsIE1lc2EKKworICAgICAgICB7IjgwODYiLCBudWxscHRyLCAiMjdhZSIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICBudWxscHRyfSwgIC8vIEludGVsIDk0NSBDaGlwc2V0CisgICAgICAgIHsiMTAwMiIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9LCAgLy8gTGludXgsIEFUSQorCisgICAgICAgIHtudWxscHRyLCBudWxscHRyLCAiMHg5NTgzIiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHJ9LCAgLy8gQVRJIFJhZGVvbiBIRDI2MDAgb24gTWFjCisgICAgICAgIHtudWxscHRyLCBudWxscHRyLCAiMHg5NGM4IiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHJ9LCAgLy8gQVRJIFJhZGVvbiBIRDI0MDAgb24gTWFjCisKKyAgICAgICAgeyJOVklESUEgKDB4MTBkZSkiLCBudWxscHRyLCAiMHgwMzI0IiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHJ9LCAgLy8gTlZJRElBIEdlRm9yY2UgRlggR281MjAwIChNYWMpCisgICAgICAgIHsiTlZJRElBIiwgIk5WSURJQSBHZUZvcmNlIEZYIEdvNTIwMCIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICBudWxscHRyfSwgIC8vIE5WSURJQSBHZUZvcmNlIEZYIEdvNTIwMCAoV2luKQorICAgICAgICB7IjEwZGUiLCBudWxscHRyLCAiMDMyNCIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICBudWxscHRyfSwgIC8vIE5WSURJQSBHZUZvcmNlIEZYIEdvNTIwMCAoTGludXgpCisKKyAgICAgICAgeyIxMGRlIiwgbnVsbHB0ciwgIjAyOWUiLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgbnVsbHB0cn0sICAvLyBOVklESUEgUXVhZHJvIEZYIDE1MDAgKExpbnV4KQorCisgICAgICAgIC8vIFZhcmlvdXMgUXVhZHJvIEZYIGNhcmRzIG9uIExpbnV4CisgICAgICAgIHsiMTBkZSIsIG51bGxwdHIsICIwMGNkIiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICIxOTUuMzYuMjQifSwKKyAgICAgICAgeyIxMGRlIiwgbnVsbHB0ciwgIjAwY2UiLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgIjE5NS4zNi4yNCJ9LAorICAgICAgICAvLyBEcml2ZXIgdmVyc2lvbiAyNjAuMTkuNiBvbiBMaW51eAorICAgICAgICB7IjEwZGUiLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgIjI2MC4xOS42In0sCisKKyAgICAgICAgeyJOVklESUEgKDB4MTBkZSkiLCBudWxscHRyLCAiMHgwMzkzIiwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgIG51bGxwdHJ9LCAgLy8gTlZJRElBIEdlRm9yY2UgNzMwMCBHVCAoTWFjKQorfTsKKworc3RhdGljIGNvbnN0IGludCBzQmxhY2tsaXN0U2l6ZSA9CisgICAgc2l6ZW9mKHNHcHVCbGFja2xpc3QpIC8gc2l6ZW9mKEJsYWNrbGlzdEVudHJ5KTsKKworLy8gSWYgYW55IGJsYWNrbGlzdCBlbnRyeSBtYXRjaGVzIGFueSBncHUsIHJldHVybiB0cnVlLgorYm9vbCBncHVpbmZvX3F1ZXJ5X2JsYWNrbGlzdChHcHVJbmZvTGlzdCogZ3B1bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxhY2tsaXN0RW50cnkqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgICAgZm9yIChhdXRvIGdwdWluZm8gOiBncHVsaXN0LT5pbmZvcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgYXV0byBibF9lbnRyeSA9IGxpc3RbaV07CisgICAgICAgICAgICBjb25zdCBjaGFyKiBibF9tYWtlID0gYmxfZW50cnkubWFrZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJsX21vZGVsID0gYmxfZW50cnkubW9kZWw7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBibF9kZXZpY2VfaWQgPSBibF9lbnRyeS5kZXZpY2VfaWQ7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBibF9yZXZpc2lvbl9pZCA9IGJsX2VudHJ5LnJldmlzaW9uX2lkOworICAgICAgICAgICAgY29uc3QgY2hhciogYmxfdmVyc2lvbiA9IGJsX2VudHJ5LnZlcnNpb247CisgICAgICAgICAgICBjb25zdCBjaGFyKiBibF9yZW5kZXJlciA9IGJsX2VudHJ5LnJlbmRlcmVyOworCisgICAgICAgICAgICBpZiAoYmxfbWFrZSAmJiAoZ3B1aW5mby5tYWtlICE9IGJsX21ha2UpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJsX21vZGVsICYmIChncHVpbmZvLm1vZGVsICE9IGJsX21vZGVsKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChibF9kZXZpY2VfaWQgJiYgKGdwdWluZm8uZGV2aWNlX2lkICE9IGJsX2RldmljZV9pZCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmxfcmV2aXNpb25faWQgJiYgKGdwdWluZm8ucmV2aXNpb25faWQgIT0gYmxfcmV2aXNpb25faWQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGJsX3ZlcnNpb24gJiYgKGdwdWluZm8ucmV2aXNpb25faWQgIT0gYmxfdmVyc2lvbikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmxfcmVuZGVyZXIgJiYgKGdwdWluZm8ucmVuZGVyZXIuZmluZChibF9yZW5kZXJlcikgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9URk9VTkQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnN0cmluZyBsb2FkX2dwdV9pbmZvKCkgeworICAgIGF1dG8mIHN5cyA9ICpTeXN0ZW06OmdldCgpOworICAgIHN0ZDo6c3RyaW5nIHRtcF9kaXIoc3lzLmdldFRlbXBEaXIoKS5jX3N0cigpKTsKKworLy8gR2V0IHRlbXBvcmFyeSBmaWxlIHBhdGgKKyNpZm5kZWYgX1dJTjMyCisgICAgaWYgKHRtcF9kaXIuYmFjaygpICE9ICcvJykgeworICAgICAgICB0bXBfZGlyICs9ICIvIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdGVtcF9maWxlbmFtZV9wYXR0ZXJuID0gImdwdWluZm9fWFhYWFhYIjsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wX2ZpbGVfcGF0aF90ZW1wbGF0ZSA9ICh0bXBfZGlyICsgdGVtcF9maWxlbmFtZV9wYXR0ZXJuKTsKKworICAgIGludCB0bXBmZCA9IG1rc3RlbXAoKGNoYXIqKXRlbXBfZmlsZV9wYXRoX3RlbXBsYXRlLmRhdGEoKSk7CisKKyAgICBpZiAodG1wZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdGVtcF9maWxlX3BhdGggPSB0ZW1wX2ZpbGVfcGF0aF90ZW1wbGF0ZS5jX3N0cigpOworCisjZWxzZQorICAgIGNoYXIgdG1wX2ZpbGVuYW1lX2J1ZmZlcltrRmllbGRMZW5dID0ge307CisgICAgRFdPUkQgdGVtcF9maWxlX3JldCA9CisgICAgICAgICAgICBHZXRUZW1wRmlsZU5hbWUodG1wX2Rpci5jX3N0cigpLCAiZ3B1IiwgMCwgdG1wX2ZpbGVuYW1lX2J1ZmZlcik7CisKKyAgICBpZiAoIXRlbXBfZmlsZV9yZXQpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogdGVtcF9maWxlX3BhdGggPSB0bXBfZmlsZW5hbWVfYnVmZmVyOworCisjZW5kaWYKKworLy8gRXhlY3V0ZSB0aGUgY29tbWFuZCB0byBnZXQgR1BVIGluZm8uCisjaWZkZWYgX19BUFBMRV9fCisgICAgY2hhciBjb21tYW5kW2tGaWVsZExlbl0gPSB7fTsKKyAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksCisgICAgICAgICAgICAgInN5c3RlbV9wcm9maWxlciBTUERpc3BsYXlzRGF0YVR5cGUgPiAlcyIsIHRlbXBfZmlsZV9wYXRoKTsKKyAgICBzeXN0ZW0oY29tbWFuZCk7CisjZWxpZiAhZGVmaW5lZChfV0lOMzIpCisgICAgY2hhciBjb21tYW5kW2tGaWVsZExlbl0gPSB7fTsKKworICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgImxzcGNpIC1tdm5uID4gJXMiLCB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgc3lzdGVtKGNvbW1hbmQpOworICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgImdseGluZm8gPj4gJXMiLCB0ZW1wX2ZpbGVfcGF0aCk7CisgICAgc3lzdGVtKGNvbW1hbmQpOworI2Vsc2UKKyAgICBjaGFyIHRlbXBfcGF0aF9hcmdba0ZpZWxkTGVuXSA9IHt9OworICAgIHNucHJpbnRmKHRlbXBfcGF0aF9hcmcsIHNpemVvZih0ZW1wX3BhdGhfYXJnKSwgIi9PVVRQVVQ6JXMiLAorICAgICAgICAgICAgIHRlbXBfZmlsZV9wYXRoKTsKKyAgICBpbnQgd21pY19ydW5fcmVzID0gc3lzLnJ1bkNvbW1hbmQoeyJ3bWljIiwgdGVtcF9wYXRoX2FyZywgInBhdGgiLCAiV2luMzJfVmlkZW9Db250cm9sbGVyIiwgImdldCIsICIvdmFsdWUifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW5PcHRpb25zOjpUZXJtaW5hdGVPblRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHUFVJbmZvUXVlcnlUaW1lb3V0TXMpOworICAgIGlmICghd21pY19ydW5fcmVzKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICAgIH0KKyNlbmRpZgorCisgICAgc3RkOjppZnN0cmVhbSBmaCh0ZW1wX2ZpbGVfcGF0aCwgc3RkOjppb3M6OmJpbmFyeSk7CisgICAgaWYgKCFmaCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBTbGVlcCgxMDApOworI2VuZGlmCisgICAgICAgIGZoLm9wZW4odGVtcF9maWxlX3BhdGgsIHN0ZDo6aW9zOjpiaW5hcnkpOworICAgICAgICBpZiAoIWZoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IGZoLnJkYnVmKCk7CisgICAgc3RkOjpzdHJpbmcgY29udGVudHMgPSBzcy5zdHIoKTsKKyAgICBmaC5jbG9zZSgpOworCisjaWZuZGVmIF9XSU4zMgorICAgIHJlbW92ZSh0ZW1wX2ZpbGVfcGF0aCk7CisjZWxzZQorICAgIERXT1JEIGRlbF9yZXQgPSBEZWxldGVGaWxlKHRlbXBfZmlsZV9wYXRoKTsKKyAgICBpZiAoIWRlbF9yZXQpIHsKKyAgICAgICAgU2xlZXAoMTAwKTsKKyAgICAgICAgZGVsX3JldCA9IERlbGV0ZUZpbGUodGVtcF9maWxlX3BhdGgpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgaW50IG51bV9jaGFycyA9IGNvbnRlbnRzLnNpemUoKSAvIHNpemVvZih3Y2hhcl90KTsKKyAgICBzdGQ6OnN0cmluZyB1dGY4U3RyaW5nID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4oY29udGVudHMuY19zdHIoKSksIG51bV9jaGFycyk7CisgICAgcmV0dXJuIHV0ZjhTdHJpbmc7CisjZWxzZQorICAgIHJldHVybiBjb250ZW50czsKKyNlbmRpZgorfQorCitzdGQ6OnN0cmluZyBwYXJzZV9sYXN0X2hleGJyYWNrZXRzKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBzaXplX3QgY2xvc2VicmFjZV9wID0gc3RyLnJmaW5kKCJdIik7CisgICAgc2l6ZV90IG9wZW5icmFjZV9wID0gc3RyLnJmaW5kKCJbIiwgY2xvc2VicmFjZV9wIC0gMSk7CisgICAgcmV0dXJuIHN0ci5zdWJzdHIob3BlbmJyYWNlX3AgKyAxLCBjbG9zZWJyYWNlX3AgLSBvcGVuYnJhY2VfcCAtIDEpOworfQorCitzdGQ6OnN0cmluZyBwYXJzZV9yZW5kZXJlcl9wYXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgICBzaXplX3QgbGFzdHNwYWNlX3AgPSBzdHIucmZpbmQoIiAiKTsKKyAgICBzaXplX3QgcHJldnNwYWNlX3AgPSBzdHIucmZpbmQoIiAiLCBsYXN0c3BhY2VfcCAtIDEpOworICAgIHJldHVybiBzdHIuc3Vic3RyKHByZXZzcGFjZV9wICsgMSwgbGFzdHNwYWNlX3AgLSBwcmV2c3BhY2VfcCAtIDEpOworfQorCit2b2lkIHBhcnNlX2dwdV9pbmZvX2xpc3Rfb3N4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3B1SW5mb0xpc3QqIGdwdWxpc3QpIHsKKyAgICBzaXplX3QgbGluZV9sb2MgPSBjb250ZW50cy5maW5kKCJcbiIpOworICAgIGlmIChsaW5lX2xvYyA9PSBOT1RGT1VORCkgeworICAgICAgICBsaW5lX2xvYyA9IGNvbnRlbnRzLnNpemUoKTsKKyAgICB9CisgICAgc2l6ZV90IHAgPSAwOworICAgIHNpemVfdCBrdnNlcF9sb2M7CisgICAgc3RkOjpzdHJpbmcga2V5OworICAgIHN0ZDo6c3RyaW5nIHZhbDsKKworICAgIC8vIE9TIFg6IFdlIGV4cGVjdCBhIHNlcXVlbmNlIG9mIGxpbmVzIGZyb20gc3lzdGVtX3Byb2ZpbGVyCisgICAgLy8gdGhhdCBkZXNjcmliZSBhbGwgR1BVJ3MgY29ubmVjdGVkIHRvIHRoZSBzeXN0ZW0uCisgICAgLy8gV2hlbiBhIGxpbmUgY29udGFpbmluZworICAgIC8vICAgICBDaGlwc2V0IE1vZGVsOiA8Z3B1IG1vZGVsIG5hbWU+CisgICAgLy8gdGhhdCdzIHRoZSBlYXJsaWVzdCByZWxpYWJsZSBpbmRpY2F0aW9uIG9mIGluZm9ybWF0aW9uCisgICAgLy8gYWJvdXQgYW4gYWRkaXRpb25hbCBHUFUuIEFmdGVyIHRoYXQsCisgICAgLy8gaXQncyBhIHNpbXBsZSBtYXR0ZXIgdG8gZmluZCB0aGUgdmVuZG9yL2RldmljZSBJRCBsaW5lcy4KKyAgICB3aGlsZSAobGluZV9sb2MgIT0gTk9URk9VTkQpIHsKKyAgICAgICAga3ZzZXBfbG9jID0gY29udGVudHMuZmluZCgiOiAiLCBwKTsKKyAgICAgICAgaWYgKChrdnNlcF9sb2MgIT0gTk9URk9VTkQpICYmIChrdnNlcF9sb2MgPCBsaW5lX2xvYykpIHsKKyAgICAgICAgICAgIGtleSA9IGNvbnRlbnRzLnN1YnN0cihwLCBrdnNlcF9sb2MgLSBwKTsKKyAgICAgICAgICAgIHNpemVfdCB2YWxiZWdpbiA9IChrdnNlcF9sb2MgKyAyKTsKKyAgICAgICAgICAgIHZhbCA9IGNvbnRlbnRzLnN1YnN0cih2YWxiZWdpbiwgbGluZV9sb2MgLSB2YWxiZWdpbik7CisgICAgICAgICAgICBpZiAoa2V5LmZpbmQoIkNoaXBzZXQgTW9kZWwiKSAhPSBOT1RGT1VORCkgeworICAgICAgICAgICAgICAgIGdwdWxpc3QtPmFkZEdwdSgpOworICAgICAgICAgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tb2RlbCA9IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmZpbmQoIlZlbmRvciIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICAgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLm1ha2UgPSB2YWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5maW5kKCJEZXZpY2UgSUQiKSAhPSBOT1RGT1VORCkgeworICAgICAgICAgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5kZXZpY2VfaWQgPSB2YWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5maW5kKCJSZXZpc2lvbiBJRCIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICAgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnJldmlzaW9uX2lkID0gdmFsOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZmluZCgiRGlzcGxheSBUeXBlIikgIT0gTk9URk9VTkQpIHsKKyAgICAgICAgICAgICAgICBncHVsaXN0LT5jdXJyR3B1KCkuY3VycmVudF9ncHUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobGluZV9sb2MgPT0gY29udGVudHMuc2l6ZSgpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwID0gbGluZV9sb2MgKyAxOworICAgICAgICBsaW5lX2xvYyA9IGNvbnRlbnRzLmZpbmQoIlxuIiwgcCk7CisgICAgICAgIGlmIChsaW5lX2xvYyA9PSBOT1RGT1VORCkgeworICAgICAgICAgICAgbGluZV9sb2MgPSBjb250ZW50cy5zaXplKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgcGFyc2VfZ3B1X2luZm9fbGlzdF9saW51eChjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3B1SW5mb0xpc3QqIGdwdWxpc3QpIHsKKyAgICBzaXplX3QgbGluZV9sb2MgPSBjb250ZW50cy5maW5kKCJcbiIpOworICAgIGlmIChsaW5lX2xvYyA9PSBOT1RGT1VORCkgeworICAgICAgICBsaW5lX2xvYyA9IGNvbnRlbnRzLnNpemUoKTsKKyAgICB9CisgICAgc2l6ZV90IHAgPSAwOworICAgIHN0ZDo6c3RyaW5nIGtleTsKKyAgICBzdGQ6OnN0cmluZyB2YWw7CisgICAgYm9vbCBsb29rZm9yID0gZmFsc2U7CisKKyAgICAvLyBMaW51eCAtIE9ubHkgc3VwcG9ydCBvbmUgR1BVIGZvciBub3cuCisgICAgLy8gT24gTGludXgsIHRoZSBvbmx5IGNvbW1hbmQgdGhhdCBzZWVtcyBub3QgdG8gdGFrZQorICAgIC8vIGZvcmV2ZXIgaXMgbHNwY2kuCisgICAgLy8gV2UganVzdCBsb29rIGZvciAiVkdBIiBpbiBsc3BjaSwgdGhlbgorICAgIC8vIGF0dGVtcHQgdG8gZ3JhYiB2ZW5kb3IgYW5kIGRldmljZSBpbmZvcm1hdGlvbi4KKyAgICAvLyBTZWNvbmQsIHdlIGlzc3VlIGdseGluZm8gYW5kIGxvb2sgZm9yIHRoZSB2ZXJzaW9uIHN0cmluZywKKyAgICAvLyBpbiBjYXNlIHRoZXJlIGlzIGEgcmVuZGVyZXIgc3VjaCBhcyBNZXNhCisgICAgLy8gdG8gbG9vayBvdXQgZm9yLgorICAgIHdoaWxlIChsaW5lX2xvYyAhPSBOT1RGT1VORCkgeworICAgICAgICBrZXkgPSBjb250ZW50cy5zdWJzdHIocCwgbGluZV9sb2MgLSBwKTsKKyAgICAgICAgaWYgKCFsb29rZm9yICYmIChrZXkuZmluZCgiVkdBIikgIT0gTk9URk9VTkQpKSB7CisgICAgICAgICAgICBsb29rZm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGdwdWxpc3QtPmFkZEdwdSgpOworICAgICAgICB9IGVsc2UgaWYgKGxvb2tmb3IgJiYgKGtleS5maW5kKCJWZW5kb3IiKSAhPSBOT1RGT1VORCkpIHsKKyAgICAgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tYWtlID0gcGFyc2VfbGFzdF9oZXhicmFja2V0cyhrZXkpOworICAgICAgICB9IGVsc2UgaWYgKGxvb2tmb3IgJiYgKGtleS5maW5kKCJEZXZpY2UiKSAhPSBOT1RGT1VORCkpIHsKKyAgICAgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5kZXZpY2VfaWQgPSBwYXJzZV9sYXN0X2hleGJyYWNrZXRzKGtleSk7CisgICAgICAgICAgICBsb29rZm9yID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmZpbmQoIk9wZW5HTCB2ZXJzaW9uIHN0cmluZyIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICBncHVsaXN0LT5jdXJyR3B1KCkucmVuZGVyZXIgPSBrZXk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmVfbG9jID09IGNvbnRlbnRzLnNpemUoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGxpbmVfbG9jICsgMTsKKyAgICAgICAgbGluZV9sb2MgPSBjb250ZW50cy5maW5kKCJcbiIsIHApOworICAgICAgICBpZiAobGluZV9sb2MgPT0gTk9URk9VTkQpIHsKKyAgICAgICAgICAgIGxpbmVfbG9jID0gY29udGVudHMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV93aW5kb3dzX2dwdV9kbGxzKGludCBsaW5lX2xvYywgaW50IHZhbF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwdUluZm9MaXN0KiBncHVsaXN0KSB7CisgICAgaWYgKGxpbmVfbG9jIC0gdmFsX3BvcyA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGxsX3N0ciA9CisgICAgICAgIGNvbnRlbnRzLnN1YnN0cih2YWxfcG9zLCBsaW5lX2xvYyAtIHZhbF9wb3MpOworCisgICAgc2l6ZV90IHZwID0gMDsKKyAgICBzaXplX3QgZGxsX3NlcF9sb2MgPSBkbGxfc3RyLmZpbmQoIiwiLCB2cCk7CisgICAgc2l6ZV90IGRsbF9lbmQgPQorICAgICAgICAoZGxsX3NlcF9sb2MgIT0gTk9URk9VTkQpID8gIGRsbF9zZXBfbG9jIDogZGxsX3N0ci5zaXplKCkgLSB2cDsKKyAgICBncHVsaXN0LT5jdXJyR3B1KCkuYWRkRGxsKGRsbF9zdHIuc3Vic3RyKHZwLCBkbGxfZW5kIC0gdnApKTsKKworICAgIHdoaWxlIChkbGxfc2VwX2xvYyAhPSBOT1RGT1VORCkgeworICAgICAgICB2cCA9IGRsbF9zZXBfbG9jICsgMTsKKyAgICAgICAgZGxsX3NlcF9sb2MgPSBkbGxfc3RyLmZpbmQoIiwiLCB2cCk7CisgICAgICAgIGRsbF9lbmQgPQorICAgICAgICAgICAgKGRsbF9zZXBfbG9jICE9IE5PVEZPVU5EKSA/ICBkbGxfc2VwX2xvYyA6IGRsbF9zdHIuc2l6ZSgpIC0gdnA7CisgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5hZGREbGwoCisgICAgICAgICAgICAgICAgZGxsX3N0ci5zdWJzdHIodnAsIGRsbF9lbmQgLSB2cCkpOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjdXJyX21ha2UgPSBncHVsaXN0LT5jdXJyR3B1KCkubWFrZTsKKyAgICBpZiAoY3Vycl9tYWtlID09ICJOVklESUEiKSB7CisgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5hZGREbGwoIm52b2dsdjMyLmRsbCIpOworICAgICAgICBncHVsaXN0LT5jdXJyR3B1KCkuYWRkRGxsKCJudm9nbHY2NC5kbGwiKTsKKyAgICB9IGVsc2UgaWYgKGN1cnJfbWFrZSA9PSAiQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLiIpIHsKKyAgICAgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLmFkZERsbCgiYXRpb2dseHguZGxsIik7CisgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5hZGREbGwoImF0aWc2dHh4LmRsbCIpOworICAgIH0KK30KKwordm9pZCBwYXJzZV9ncHVfaW5mb19saXN0X3dpbmRvd3MoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3B1SW5mb0xpc3QqIGdwdWxpc3QpIHsKKyAgICBzaXplX3QgbGluZV9sb2MgPSBjb250ZW50cy5maW5kKCJcclxuIik7CisgICAgaWYgKGxpbmVfbG9jID09IE5PVEZPVU5EKSB7CisgICAgICAgIGxpbmVfbG9jID0gY29udGVudHMuc2l6ZSgpOworICAgIH0KKyAgICBzaXplX3QgcCA9IDA7CisgICAgc2l6ZV90IGVxdWFsc19wb3MgPSAwOworICAgIHNpemVfdCB2YWxfcG9zID0gMDsKKyAgICBzdGQ6OnN0cmluZyBrZXk7CisgICAgc3RkOjpzdHJpbmcgdmFsOworCisgICAgLy8gV2luZG93czogV2UgdXNlIGB3bWljIHBhdGggV2luMzJfVmlkZW9Db250cm9sbGVyIGdldCAvdmFsdWVgCisgICAgLy8gdG8gZ2V0IGEgcmVhc29uYWJseSBkZXRhaWxlZCBsaXN0IG9mICc8a2V5Pj08dmFsPicKKyAgICAvLyBwYWlycy4gRnJvbSB0aGVzZSwgd2UgY2FuIGdldCB0aGUgbWFrZS9tb2RlbAorICAgIC8vIG9mIHRoZSBHUFUsIHRoZSBkcml2ZXIgdmVyc2lvbiwgYW5kIGFsbCBETExzIGludm9sdmVkLgorICAgIHdoaWxlIChsaW5lX2xvYyAhPSBOT1RGT1VORCkgeworICAgICAgICBlcXVhbHNfcG9zID0gY29udGVudHMuZmluZCgiPSIsIHApOworICAgICAgICBpZiAoKGVxdWFsc19wb3MgIT0gTk9URk9VTkQpICYmIChlcXVhbHNfcG9zIDwgbGluZV9sb2MpKSB7CisgICAgICAgICAgICBrZXkgPSBjb250ZW50cy5zdWJzdHIocCwgZXF1YWxzX3BvcyAtIHApOworICAgICAgICAgICAgdmFsX3BvcyA9IGVxdWFsc19wb3MgKyAxOworICAgICAgICAgICAgdmFsID0gY29udGVudHMuc3Vic3RyKHZhbF9wb3MsIGxpbmVfbG9jIC0gdmFsX3Bvcyk7CisKKyAgICAgICAgICAgIGlmIChrZXkuZmluZCgiQWRhcHRlckNvbXBhdGliaWxpdHkiKSAhPSBOT1RGT1VORCkgeworICAgICAgICAgICAgICAgIGdwdWxpc3QtPmFkZEdwdSgpOworICAgICAgICAgICAgICAgIGdwdWxpc3QtPmN1cnJHcHUoKS5tYWtlID0gdmFsOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZmluZCgiQ2FwdGlvbiIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICAgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLm1vZGVsID0gdmFsOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZmluZCgiRHJpdmVyVmVyc2lvbiIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICAgICAgZ3B1bGlzdC0+Y3VyckdwdSgpLnZlcnNpb24gPSB2YWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5maW5kKCJJbnN0YWxsZWREaXNwbGF5RHJpdmVycyIpICE9IE5PVEZPVU5EKSB7CisgICAgICAgICAgICAgICAgcGFyc2Vfd2luZG93c19ncHVfZGxscyhsaW5lX2xvYywgdmFsX3BvcywgY29udGVudHMsIGdwdWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsaW5lX2xvYyA9PSBjb250ZW50cy5zaXplKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHAgPSBsaW5lX2xvYyArIDI7CisgICAgICAgIGxpbmVfbG9jID0gY29udGVudHMuZmluZCgiXHJcbiIsIHApOworICAgICAgICBpZiAobGluZV9sb2MgPT0gTk9URk9VTkQpIHsKKyAgICAgICAgICAgIGxpbmVfbG9jID0gY29udGVudHMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHBhcnNlX2dwdV9pbmZvX2xpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLCBHcHVJbmZvTGlzdCogZ3B1bGlzdCkgeworI2lmZGVmIF9fQVBQTEVfXworICAgIHBhcnNlX2dwdV9pbmZvX2xpc3Rfb3N4KGNvbnRlbnRzLCBncHVsaXN0KTsKKyNlbGlmICFkZWZpbmVkKF9XSU4zMikKKyAgICBwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4KGNvbnRlbnRzLCBncHVsaXN0KTsKKyNlbHNlCisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF93aW5kb3dzKGNvbnRlbnRzLCBncHVsaXN0KTsKKyNlbmRpZgorfQorCitib29sIHBhcnNlX2FuZF9xdWVyeV9ibGFja2xpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzKSB7CisgICAgR3B1SW5mb0xpc3QqIGdwdWxpc3QgPSBHcHVJbmZvTGlzdDo6Z2V0KCk7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdChjb250ZW50cywgZ3B1bGlzdCk7CisgICAgcmV0dXJuIGdwdWluZm9fcXVlcnlfYmxhY2tsaXN0KGdwdWxpc3QsIHNHcHVCbGFja2xpc3QsIHNCbGFja2xpc3RTaXplKTsKK30KKwordm9pZCBxdWVyeV9ibGFja2xpc3RfZm4oYm9vbCogcmVzKSB7CisgICAgc3RkOjpzdHJpbmcgZ3B1X2luZm8gPSBsb2FkX2dwdV9pbmZvKCk7CisgICAgKnJlcyA9IHBhcnNlX2FuZF9xdWVyeV9ibGFja2xpc3QoZ3B1X2luZm8pOworfQorCit2b2lkIHF1ZXJ5X2JsYWNrbGlzdF9kb25lX2ZuKGNvbnN0IGJvb2wmIHJlcykgeyB9CisKKy8vIFNlcGFyYXRlIHRocmVhZCBmb3IgR1BVIGluZm8gcXVlcnlpbmc6CisvLworLy8gT3VyIGdvYWwgaXMgdG8gYWNjb3VudCBmb3IgY2lyY3Vtc3RhbmNlcyB3aGVyZSBvYnRhaW5pbmcgR1BVIGluZm8gZWl0aGVyCisvLyB0YWtlcyB0b28gbG9uZyBvciB0aWVzIHVwIHRoZSBob3N0IHN5c3RlbSBpbiBhIHNwZWNpYWwgd2F5IHdoZXJlIHRoZSBzeXN0ZW0KKy8vIGVuZHMgdXAgaGFuZ2luZy4gVGhpcyBpcyBiYWQsIHNpbmNlIG5vIHByb2dyZXNzIHdpbGwgaGFwcGVuIGZvciBlbXVsYXRvcgorLy8gc3RhcnR1cCwgd2hpY2ggaXMgbW9yZSBjcml0aWNhbC4KKy8vCisvLyBXZSB0aGVyZWZvcmUgdXNlIGEgUGFyYWxsZWxUYXNrIGFuZCBhIGxvb3BlciB3aXRoIHRpbWVvdXQgdG8gdGFrZSBjYXJlIG9mCisvLyB0aGlzIGNhc2UuCisvLworLy8gTm90ZSB0aGF0IHdlIHVzZSBhIHNlcGFyYXRlIHRocmVhZCAocmF0aGVyIHRoYW4gdGhlIG1haW4gdGhyZWFkKSBiZWNhdXNlCisvLyBsYXRlciBvbiB3aGVuIHNraW5fd2luc3lzX2VudGVyX21haW5fbG9vcCBpcyBjYWxsZWQsIGl0IHdpbGwgc2V0IHRoZSBsb29wZXIKKy8vIG9mIHRoZSBtYWluIHRocmVhZCB0byBhIGN1c3RvbSBMb29wZXIgdGhhdCB3b3JrcyB3aXRoIFF0CisvLyAoYW5kcm9pZDo6cXQ6OmNyZWF0ZUxvb3BlcigpKS4gIE90aGVyd2lzZSwgY3JlYXRpbmcgYSBsb29wZXIgb24gdGhlIG1haW4KKy8vIHRocmVhZCBhdCB0aGlzIHBvaW50IHdpbGwgcHJldmVudCB0aGUgY3VzdG9tIGxvb3BlciBmcm9tIGJlaW5nIHVzZWQsIHdoaWNoCisvLyBhYm9ydHMgdGhlIHByb2dyYW0uCitjbGFzcyBHUFVJbmZvUXVlcnlUaHJlYWQgOiBwdWJsaWMgYW5kcm9pZDo6YmFzZTo6VGhyZWFkIHsKK3B1YmxpYzoKKyAgICBHUFVJbmZvUXVlcnlUaHJlYWQoKSB7CisgICAgICAgIHRoaXMtPnN0YXJ0KCk7CisgICAgfQorICAgIHZpcnR1YWwgaW50cHRyX3QgbWFpbigpIG92ZXJyaWRlIHsKKyAgICAgICAgTG9vcGVyKiBsb29wZXIgPSBhbmRyb2lkOjpiYXNlOjpUaHJlYWRMb29wZXI6OmdldCgpOworICAgICAgICBhbmRyb2lkOjpiYXNlOjpydW5QYXJhbGxlbFRhc2s8Ym9vbD4KKyAgICAgICAgICAgIChsb29wZXIsICZxdWVyeV9ibGFja2xpc3RfZm4sICZxdWVyeV9ibGFja2xpc3RfZG9uZV9mbiwKKyAgICAgICAgICAgICBrUXVlcnlDaGVja0ludGVydmFsTXMpOworICAgICAgICBsb29wZXItPnJ1bldpdGhUaW1lb3V0TXMoa0dQVUluZm9RdWVyeVRpbWVvdXRNcyk7CisgICAgICAgIGxvb3Blci0+Zm9yY2VRdWl0KCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0YXRpYyBhbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U8R1BVSW5mb1F1ZXJ5VGhyZWFkPiBzR1BVSW5mb1F1ZXJ5VGhyZWFkID0KKyAgICAgICAgTEFaWV9JTlNUQU5DRV9JTklUOworCitib29sIGFzeW5jX3F1ZXJ5X2hvc3RfZ3B1X2JsYWNrbGlzdGVkKCkgeworICAgIHNHUFVJbmZvUXVlcnlUaHJlYWQucHRyKCk7CisgICAgc0dQVUluZm9RdWVyeVRocmVhZC0+d2FpdCgpOworICAgIHJldHVybiBHcHVJbmZvTGlzdDo6Z2V0KCktPmJsYWNrbGlzdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL2dwdWluZm8uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvZ3B1aW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjcyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL2dwdWluZm8uaApAQCAtMCwwICsxLDExNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIGdwdWluZm8gaXMgZGVzaWduZWQgdG8gY29sbGVjdCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgR1BVcworLy8gaW5zdGFsbGVkIG9uIHRoZSBob3N0IHN5c3RlbSBmb3IgdGhlIHB1cnBvc2VzIG9mCisvLyBhdXRvbWF0aWNhbGx5IGRldGVybWluaW5nIHdoaWNoIHJlbmRlcmVyIHRvIHNlbGVjdCwKKy8vIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgR1BVIGRyaXZlcnMgYXJlIGtub3duIHRvIGhhdmUgaXNzdWVzCisvLyBydW5uaW5nIHRoZSBlbXVsYXRvci4KKworLy8gVGhlIG1haW4gZW50cnkgcG9pbnRzOgorCisvLyBsb2FkX2dwdV9pbmZvKCkgcXVlcmllcyB0aGUgaG9zdCBzeXN0ZW0KKy8vIGFuZCByZXR1cm5zIGEgcGxhdGZvcm0tc3BlY2lmaWMgc3RyaW5nCisvLyBkZXNjcmliaW5nIGFsbCBHUFUncyBvbiB0aGUgc3lzdGVtLgorc3RkOjpzdHJpbmcgbG9hZF9ncHVfaW5mbygpOworCisvLyBwYXJzZV9hbmRfcXVlcnlfYmxhY2tsaXN0KCkgdGFrZXMgdGhlIHN0cmluZworLy8gZGVzY3JpYmluZyBHUFUgaW5mb3JtYXRpb24sIGF0dGVtcHRzIHRvIHBhcnNlIGl0LAorLy8gYW5kIHJldHVybnMgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24KKy8vIHdoZXRoZXIgdGhlIEdQVSBpbmZvcm1hdGlvbiBwcm92aWRlZAorLy8gbWF0Y2hlcyBhIGtub3duIHVucmVsaWFibGUgR1BVL0dQVSBkcml2ZXIuCitib29sIHBhcnNlX2FuZF9xdWVyeV9ibGFja2xpc3QoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzKTsKKworLy8gaG9zdF9ncHVfYmxhY2tsaXN0ZWRfYXN5bmMoKSBkb2VzIHRoZSB0d28gc3RlcHMgYWJvdmUsCisvLyBidXQgb24gYSBkaWZmZXJlbnQgdGhyZWFkLCB3aXRoIGEgdGltZW91dCBpbiBjYXNlCisvLyB0aGUgc3RhcnRlZCBwcm9jZXNzZXMgaGFuZyBvciB3aGF0IG5vdC4KK2Jvb2wgYXN5bmNfcXVlcnlfaG9zdF9ncHVfYmxhY2tsaXN0ZWQoKTsKKworLy8gQmVsb3cgaXMgdGhlIGltcGxlbWVudGF0aW9uLgorCisvLyBXZSBrZWVwIGEgYmxhY2tsaXN0IG9mIGtub3duIGNyYXNoeSBHUFUgZHJpdmVycworLy8gYXMgYSBzdGF0aWMgY29uc3QgbGlzdCB3aXRoIGl0ZW1zIG9mIHRoaXMgdHlwZToKK3N0cnVjdCBCbGFja2xpc3RFbnRyeSB7CisgICAgY29uc3QgY2hhciogbWFrZTsKKyAgICBjb25zdCBjaGFyKiBtb2RlbDsKKyAgICBjb25zdCBjaGFyKiBkZXZpY2VfaWQ7CisgICAgY29uc3QgY2hhciogcmV2aXNpb25faWQ7CisgICAgY29uc3QgY2hhciogdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiByZW5kZXJlcjsKK307CisKKy8vIEdwdUluZm8vR3B1SW5mb0xpc3QgYXJlIHRoZSByZXByZXNlbnRhdGlvbiBvZiBwYXJzZWQgaW5mb3JtYXRpb24KKy8vIGFib3V0IHRoZSBzeXN0ZW0ncyBHUFUucworY2xhc3MgR3B1SW5mbyB7CitwdWJsaWM6CisgICAgR3B1SW5mbygpIDogY3VycmVudF9ncHUoZmFsc2UpIHsgfQorCisgICAgYm9vbCBjdXJyZW50X2dwdTsKKworICAgIHZvaWQgYWRkRGxsKHN0ZDo6c3RyaW5nIGRsbF9zdHIpOworCisgICAgc3RkOjpzdHJpbmcgbWFrZTsKKyAgICBzdGQ6OnN0cmluZyBtb2RlbDsKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VfaWQ7CisgICAgc3RkOjpzdHJpbmcgcmV2aXNpb25faWQ7CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbjsKKyAgICBzdGQ6OnN0cmluZyByZW5kZXJlcjsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkbGxzOworfTsKKworY2xhc3MgR3B1SW5mb0xpc3QgeworcHVibGljOgorICAgIEdwdUluZm9MaXN0KCkgOiBibGFja2xpc3Rfc3RhdHVzKGZhbHNlKSB7IH0KKyAgICB2b2lkIGFkZEdwdSgpOworICAgIEdwdUluZm8mIGN1cnJHcHUoKTsKKyAgICBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CisgICAgdm9pZCBjbGVhcigpOworCisgICAgc3RhdGljIEdwdUluZm9MaXN0KiBnZXQoKTsgLy8gRm9yIHRoZSBnbG9iYWwgR3B1SW5mb0xpc3QKKyAgICBzdGQ6OnZlY3RvcjxHcHVJbmZvPiBpbmZvczsKKyAgICBib29sIGJsYWNrbGlzdF9zdGF0dXM7CisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoR3B1SW5mb0xpc3QpOworfTsKKworLy8gQmVsb3cgYXJlIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZnVsIGluIHZhcmlvdXMKKy8vIGNvbnRleHRzIChlLmcuLCB1bml0IHRlc3RpbmcpLgorCisvLyBncHVpbmZvX3F1ZXJ5X2JsYWNrbGlzdCgpOgorLy8gRnVuY3Rpb24gdG8gcXVlcnkgYSBnaXZlbiBibGFja2xpc3Qgb2YgR1BVJ3MuCisvLyBUaGUgYmxhY2tsaXN0IHxsaXN0fCAob2YgbGVuZ3RoIHxzaXplfCkgYXR0ZW1wdHMKKy8vIHRvIG1hdGNoIGFsbCBub24tTlVMTCBlbnRyeSBmaWVsZHMgZXhhY3RseSBhZ2FpbnN0CisvLyBpbmZvIG9mIGFsbCBHUFUncyBpbiB8Z3B1bGlzdHwuIElmIHRoZXJlIGlzIGFueSBtYXRjaCwKKy8vIHRoZSBob3N0IHN5c3RlbSBpcyBjb25zaWRlcmVkIG9uIHRoZSBibGFja2xpc3QuCisvLyAoTnVsbCBibGFja2xpc3QgZW50cnkgZmllbGRzIGFyZSBpZ25vcmVkIGFuZAorLy8gZXNzZW50aWFsbHkgYWN0IGFzIHdpbGRjYXJkcykuCitib29sIGdwdWluZm9fcXVlcnlfYmxhY2tsaXN0KEdwdUluZm9MaXN0KiBncHVsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbGFja2xpc3RFbnRyeSogbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworCisvLyBNYWluIGZ1bmN0aW9uIHRvIHBhcnNlIEdQVSBpbmZvcm1hdGlvbi4KK3ZvaWQgcGFyc2VfZ3B1X2luZm9fbGlzdChjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsIEdwdUluZm9MaXN0KiBncHVsaXN0KTsKKworLy8gUGxhdGZvcm0tc3BlY2lmaWMgaW5mb3JtYXRpb24gcGFyc2luZyBmdW5jdGlvbnMuCit2b2lkIHBhcnNlX2dwdV9pbmZvX2xpc3Rfb3N4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywgR3B1SW5mb0xpc3QqIGdwdWxpc3QpOwordm9pZCBwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4KGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50cywgR3B1SW5mb0xpc3QqIGdwdWxpc3QpOwordm9pZCBwYXJzZV9ncHVfaW5mb19saXN0X3dpbmRvd3MoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLCBHcHVJbmZvTGlzdCogZ3B1bGlzdCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL2dwdWluZm9fdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9ncHVpbmZvX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjZiYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9ncHVpbmZvX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDY5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9ncHVpbmZvLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3N0YXRpYyBjb25zdCBjaGFyIG9zeF9zaW5nbGVfZ3B1W10gPQorIkdyYXBoaWNzL0Rpc3BsYXlzOlxuIgorIlxuIgorIiAgICBJbnRlbCBJcmlzIFBybzpcbiIKKyJcbiIKKyIgICAgICBDaGlwc2V0IE1vZGVsOiBJbnRlbCBJcmlzIFByb1xuIgorIiAgICAgIFR5cGU6IEdQVVxuIgorIiAgICAgIEJ1czogQnVpbHQtSW5cbiIKKyIgICAgICBWUkFNIChEeW5hbWljLCBNYXgpOiAxNTM2IE1CXG4iCisiICAgICAgVmVuZG9yOiBJbnRlbCAoMHg4MDg2KVxuIgorIiAgICAgIERldmljZSBJRDogMHgwZDI2XG4iCisiICAgICAgUmV2aXNpb24gSUQ6IDB4MDAwOFxuIgorIiAgICAgIERpc3BsYXlzOlxuIgorIiAgICAgICAgQ29sb3IgTENEOlxuIgorIiAgICAgICAgICBEaXNwbGF5IFR5cGU6IFJldGluYSBMQ0RcbiIKKyIgICAgICAgICAgUmVzb2x1dGlvbjogMjg4MCB4IDE4MDAgUmV0aW5hXG4iCisiICAgICAgICAgIFJldGluYTogWWVzXG4iCisiICAgICAgICAgIFBpeGVsIERlcHRoOiAzMi1CaXQgQ29sb3IgKEFSR0I4ODg4KVxuIgorIiAgICAgICAgICBNYWluIERpc3BsYXk6IFllc1xuIgorIiAgICAgICAgICBNaXJyb3I6IE9mZlxuIgorIiAgICAgICAgICBPbmxpbmU6IFllc1xuIgorIiAgICAgICAgICBCdWlsdC1JbjogWWVzXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBvc3hfZHVhbF9ncHVbXSA9CisiSW50ZWwgSEQgR3JhcGhpY3MgNDAwMDpcbiIKKyJcbiIKKyIgICAgIENoaXBzZXQgTW9kZWw6IEludGVsIEhEIEdyYXBoaWNzIDQwMDBcbiIKKyIgICAgIFR5cGU6IEdQVVxuIgorIiAgICAgQnVzOiBCdWlsdC1JblxuIgorIiAgICAgVlJBTSAoVG90YWwpOiA1MTIgTUJcbiIKKyIgICAgIFZlbmRvcjogSW50ZWwgKDB4ODA4NilcbiIKKyIgICAgIERldmljZSBJRDogMHgwMTY2XG4iCisiICAgICBSZXZpc2lvbiBJRDogMHgwMDA5XG4iCisiICAgICBnTXV4IFZlcnNpb246IDMuMi4xOSBbMy4yLjhdXG4iCisiICAgICBEaXNwbGF5czpcbiIKKyIgICAgICAgQ29sb3IgTENEOlxuIgorIiAgICAgICAgIERpc3BsYXkgVHlwZTogTENEXG4iCisiICAgICAgICAgUmVzb2x1dGlvbjogMjg4MCBYIDE4MDBcbiIKKyIgICAgICAgICBSZXRpbmE6IFllc1xuIgorIiAgICAgICAgIFBpeGVsIERlcHRoOiAzMi1CaXQgQ29sb3IgKEFSR0I4ODg4KVxuIgorIiAgICAgICAgIE1haW4gRGlzcGxheTogWWVzXG4iCisiICAgICAgICAgTWlycm9yOiBPZmZcbiIKKyIgICAgICAgICBPbmxpbmU6IFllc1xuIgorIiAgICAgICAgIEJ1aWx0LUluOiBZZXNcbiIKKyIgICAgICAgICBDb25uZWN0aW9uIFR5cGU6IERpc3BsYXlQb3J0XG4iCisiXG4iCisiXG4iCisiICAgTlZJRElBIEdlRm9yY2UgR1QgNjUwTTpcbiIKKyJcbiIKKyJcbiIKKyIgICAgIENoaXBzZXQgTW9kZWw6IE5WSURJQSBHZUZvcmNlIEdUIDY1ME1cbiIKKyIgICAgIFR5cGU6IEdQVVxuIgorIiAgICAgQnVzOiBQQ0llXG4iCisiICAgICBQQ0llIExhbmUgV2lkdGg6IHg4XG4iCisiICAgICBWUkFNIChUb3RhbCk6IDEwMjQgTUJcbiIKKyIgICAgIFZlbmRvcjogTlZJRElBICgweDEwZGUpXG4iCisiICAgICBEZXZpY2UgSUQ6IDB4MGZkNVxuIgorIiAgICAgUmV2aXNpb24gSUQ6IDB4MDBhMlxuIgorIiAgICAgUk9NIFJldmlzaW9uOiAzNjg4XG4iCisiICAgICBnTXV4IFZlcnNpb246IDMuMi4xOSBbMy4yLjhdXG4iOworCitzdGF0aWMgY29uc3QgY2hhciB3aW5fbm9pbnN0YWxsZWRkcml2ZXJzW10gPSAKKyJcclxuIgorIlxyXG4iCisiQWNjZWxlcmF0b3JDYXBhYmlsaXRpZXM9XHJcbiIKKyJBZGFwdGVyQ29tcGF0aWJpbGl0eT1SZWFsVk5DXHJcbiIKKyJBZGFwdGVyREFDVHlwZT1cclxuIgorIkFkYXB0ZXJSQU09XHJcbiIKKyJBdmFpbGFiaWxpdHk9OFxyXG4iCisiQ2FwYWJpbGl0eURlc2NyaXB0aW9ucz1cclxuIgorIkNhcHRpb249Vk5DIE1pcnJvciBEcml2ZXJcclxuIgorIkNvbG9yVGFibGVFbnRyaWVzPVxyXG4iCisiQ29uZmlnTWFuYWdlckVycm9yQ29kZT0wXHJcbiIKKyJDb25maWdNYW5hZ2VyVXNlckNvbmZpZz1GQUxTRVxyXG4iCisiQ3JlYXRpb25DbGFzc05hbWU9V2luMzJfVmlkZW9Db250cm9sbGVyXHJcbiIKKyJDdXJyZW50Qml0c1BlclBpeGVsPVxyXG4iCisiQ3VycmVudEhvcml6b250YWxSZXNvbHV0aW9uPVxyXG4iCisiQ3VycmVudE51bWJlck9mQ29sb3JzPVxyXG4iCisiQ3VycmVudE51bWJlck9mQ29sdW1ucz1cclxuIgorIkN1cnJlbnROdW1iZXJPZlJvd3M9XHJcbiIKKyJDdXJyZW50UmVmcmVzaFJhdGU9XHJcbiIKKyJDdXJyZW50U2Nhbk1vZGU9XHJcbiIKKyJDdXJyZW50VmVydGljYWxSZXNvbHV0aW9uPVxyXG4iCisiRGVzY3JpcHRpb249Vk5DIE1pcnJvciBEcml2ZXJcclxuIgorIkRldmljZUlEPVZpZGVvQ29udHJvbGxlcjFcclxuIgorIkRldmljZVNwZWNpZmljUGVucz1cclxuIgorIkRpdGhlclR5cGU9XHJcbiIKKyJEcml2ZXJEYXRlPTIwMDgwMzE0MDAwMDAwLjAwMDAwMC0wMDBcclxuIgorIkRyaXZlclZlcnNpb249MS44LjAuMFxyXG4iCisiRXJyb3JDbGVhcmVkPVxyXG4iCisiRXJyb3JEZXNjcmlwdGlvbj1cclxuIgorIklDTUludGVudD1cclxuIgorIklDTU1ldGhvZD1cclxuIgorIkluZkZpbGVuYW1lPW9lbTI0LmluZlxyXG4iCisiSW5mU2VjdGlvbj12bmNtaXJyb3JcclxuIgorIkluc3RhbGxEYXRlPVxyXG4iCisiSW5zdGFsbGVkRGlzcGxheURyaXZlcnM9XHJcbiIKKyJMYXN0RXJyb3JDb2RlPVxyXG4iCisiTWF4TWVtb3J5U3VwcG9ydGVkPVxyXG4iCisiTWF4TnVtYmVyQ29udHJvbGxlZD1cclxuIgorIk1heFJlZnJlc2hSYXRlPVxyXG4iCisiTWluUmVmcmVzaFJhdGU9XHJcbiIKKyJNb25vY2hyb21lPUZBTFNFXHJcbiIKKyJOYW1lPVZOQyBNaXJyb3IgRHJpdmVyXHJcbiIKKyJOdW1iZXJPZkNvbG9yUGxhbmVzPVxyXG4iCisiTnVtYmVyT2ZWaWRlb1BhZ2VzPVxyXG4iCisiUE5QRGV2aWNlSUQ9Uk9PVFxcRElTUExBWVxcMDAwMFxyXG4iCisiUG93ZXJNYW5hZ2VtZW50Q2FwYWJpbGl0aWVzPVxyXG4iCisiUG93ZXJNYW5hZ2VtZW50U3VwcG9ydGVkPVxyXG4iCisiUHJvdG9jb2xTdXBwb3J0ZWQ9XHJcbiIKKyJSZXNlcnZlZFN5c3RlbVBhbGV0dGVFbnRyaWVzPVxyXG4iCisiU3BlY2lmaWNhdGlvblZlcnNpb249XHJcbiIKKyJTdGF0dXM9RGVncmFkZWRcclxuIgorIlN0YXR1c0luZm89XHJcbiIKKyJTeXN0ZW1DcmVhdGlvbkNsYXNzTmFtZT1XaW4zMl9Db21wdXRlclN5c3RlbVxyXG4iCisiU3lzdGVtTmFtZT1BTkRSRVctUENcclxuIgorIlN5c3RlbVBhbGV0dGVFbnRyaWVzPVxyXG4iCisiVGltZU9mTGFzdFJlc2V0PVxyXG4iCisiVmlkZW9BcmNoaXRlY3R1cmU9NVxyXG4iCisiVmlkZW9NZW1vcnlUeXBlPTJcclxuIgorIlZpZGVvTW9kZT1cclxuIgorIlZpZGVvTW9kZURlc2NyaXB0aW9uPVxyXG4iCisiVmlkZW9Qcm9jZXNzb3I9XHJcbiIKKyJcclxuIgorIlxyXG4iCisiQWNjZWxlcmF0b3JDYXBhYmlsaXRpZXM9XHJcbiIKKyJBZGFwdGVyQ29tcGF0aWJpbGl0eT1OVklESUFcclxuIgorIkFkYXB0ZXJEQUNUeXBlPUludGVncmF0ZWQgUkFNREFDXHJcbiIKKyJBZGFwdGVyUkFNPTIxNDc0ODM2NDhcclxuIgorIkF2YWlsYWJpbGl0eT0zXHJcbiIKKyJDYXBhYmlsaXR5RGVzY3JpcHRpb25zPVxyXG4iCisiQ2FwdGlvbj1OVklESUEgR2VGb3JjZSBHVFggNjYwTSBcclxuIgorIkNvbG9yVGFibGVFbnRyaWVzPVxyXG4iCisiQ29uZmlnTWFuYWdlckVycm9yQ29kZT0wXHJcbiIKKyJDb25maWdNYW5hZ2VyVXNlckNvbmZpZz1GQUxTRVxyXG4iCisiQ3JlYXRpb25DbGFzc05hbWU9V2luMzJfVmlkZW9Db250cm9sbGVyXHJcbiIKKyJDdXJyZW50Qml0c1BlclBpeGVsPTMyXHJcbiIKKyJDdXJyZW50SG9yaXpvbnRhbFJlc29sdXRpb249MTYwMFxyXG4iCisiQ3VycmVudE51bWJlck9mQ29sb3JzPTQyOTQ5NjcyOTZcclxuIgorIkN1cnJlbnROdW1iZXJPZkNvbHVtbnM9MFxyXG4iCisiQ3VycmVudE51bWJlck9mUm93cz0wXHJcbiIKKyJDdXJyZW50UmVmcmVzaFJhdGU9NjBcclxuIgorIkN1cnJlbnRTY2FuTW9kZT00XHJcbiIKKyJDdXJyZW50VmVydGljYWxSZXNvbHV0aW9uPTkwMFxyXG4iCisiRGVzY3JpcHRpb249TlZJRElBIEdlRm9yY2UgR1RYIDY2ME0gXHJcbiIKKyJEZXZpY2VJRD1WaWRlb0NvbnRyb2xsZXIyXHJcbiIKKyJEZXZpY2VTcGVjaWZpY1BlbnM9XHJcbiIKKyJEaXRoZXJUeXBlPTBcclxuIgorIkRyaXZlckRhdGU9MjAxNjAzMjEwMDAwMDAuMDAwMDAwLTAwMFxyXG4iCisiRHJpdmVyVmVyc2lvbj0xMC4xOC4xMy42NDcyXHJcbiIKKyJFcnJvckNsZWFyZWQ9XHJcbiIKKyJFcnJvckRlc2NyaXB0aW9uPVxyXG4iCisiSUNNSW50ZW50PVxyXG4iCisiSUNNTWV0aG9kPVxyXG4iCisiSW5mRmlsZW5hbWU9b2VtNjUuaW5mXHJcbiIKKyJJbmZTZWN0aW9uPVNlY3Rpb24wMzFcclxuIgorIkluc3RhbGxEYXRlPVxyXG4iCisiSW5zdGFsbGVkRGlzcGxheURyaXZlcnM9bnZkM2R1bXguZGxsLG52d2dmMnVteC5kbGwsbnZ3Z2YydW14LmRsbCxudndnZjJ1bXguZGxsLG52ZDNkdW0sbnZ3Z2YydW0sbnZ3Z2YydW0sbnZ3Z2YydW1cclxuIgorIkxhc3RFcnJvckNvZGU9XHJcbiIKKyJNYXhNZW1vcnlTdXBwb3J0ZWQ9XHJcbiIKKyJNYXhOdW1iZXJDb250cm9sbGVkPVxyXG4iCisiTWF4UmVmcmVzaFJhdGU9NjBcclxuIgorIk1pblJlZnJlc2hSYXRlPTYwXHJcbiIKKyJNb25vY2hyb21lPUZBTFNFXHJcbiIKKyJOYW1lPU5WSURJQSBHZUZvcmNlIEdUWCA2NjBNIFxyXG4iCisiTnVtYmVyT2ZDb2xvclBsYW5lcz1cclxuIgorIk51bWJlck9mVmlkZW9QYWdlcz1cclxuIgorIlBOUERldmljZUlEPVBDSVxcVkVOXzEwREUmYW1wO0RFVl8wRkQ0JmFtcDtTVUJTWVNfMjExNTEwNDMmYW1wO1JFVl9BMVxcNCZhbXA7MTY5NTM0RjImYW1wOzAmYW1wOzAwMDhcclxuIgorIlBvd2VyTWFuYWdlbWVudENhcGFiaWxpdGllcz1cclxuIgorIlBvd2VyTWFuYWdlbWVudFN1cHBvcnRlZD1cclxuIgorIlByb3RvY29sU3VwcG9ydGVkPVxyXG4iCisiUmVzZXJ2ZWRTeXN0ZW1QYWxldHRlRW50cmllcz1cclxuIgorIlNwZWNpZmljYXRpb25WZXJzaW9uPVxyXG4iCisiU3RhdHVzPU9LXHJcbiIKKyJTdGF0dXNJbmZvPVxyXG4iCisiU3lzdGVtQ3JlYXRpb25DbGFzc05hbWU9V2luMzJfQ29tcHV0ZXJTeXN0ZW1cclxuIgorIlN5c3RlbU5hbWU9QU5EUkVXLVBDXHJcbiIKKyJTeXN0ZW1QYWxldHRlRW50cmllcz1cclxuIgorIlRpbWVPZkxhc3RSZXNldD1cclxuIgorIlZpZGVvQXJjaGl0ZWN0dXJlPTVcclxuIgorIlZpZGVvTWVtb3J5VHlwZT0yXHJcbiIKKyJWaWRlb01vZGU9XHJcbiIKKyJWaWRlb01vZGVEZXNjcmlwdGlvbj0xNjAwIHggOTAwIHggNDI5NDk2NzI5NiBjb2xvcnNcclxuIgorIlZpZGVvUHJvY2Vzc29yPUdlRm9yY2UgR1RYIDY2ME1cclxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgd2luX3NpbmdsZV9ncHVbXSA9IAorIlxyXG4iCisiXHJcbiIKKyJBY2NlbGVyYXRvckNhcGFiaWxpdGllcz1cclxuIgorIkFkYXB0ZXJDb21wYXRpYmlsaXR5PU5WSURJQVxyXG4iCisiQWRhcHRlckRBQ1R5cGU9SW50ZWdyYXRlZCBSQU1EQUNcclxuIgorIkFkYXB0ZXJSQU09MTA3Mzc0MTgyNFxyXG4iCisiQXZhaWxhYmlsaXR5PTNcclxuIgorIkNhcGFiaWxpdHlEZXNjcmlwdGlvbnM9XHJcbiIKKyJDYXB0aW9uPU5WSURJQSBRdWFkcm8gSzYwMFxyXG4iCisiQ29sb3JUYWJsZUVudHJpZXM9XHJcbiIKKyJDb25maWdNYW5hZ2VyRXJyb3JDb2RlPTBcclxuIgorIkNvbmZpZ01hbmFnZXJVc2VyQ29uZmlnPUZBTFNFXHJcbiIKKyJDcmVhdGlvbkNsYXNzTmFtZT1XaW4zMl9WaWRlb0NvbnRyb2xsZXJcclxuIgorIkN1cnJlbnRCaXRzUGVyUGl4ZWw9MzJcclxuIgorIkN1cnJlbnRIb3Jpem9udGFsUmVzb2x1dGlvbj0yNTYwXHJcbiIKKyJDdXJyZW50TnVtYmVyT2ZDb2xvcnM9NDI5NDk2NzI5NlxyXG4iCisiQ3VycmVudE51bWJlck9mQ29sdW1ucz0wXHJcbiIKKyJDdXJyZW50TnVtYmVyT2ZSb3dzPTBcclxuIgorIkN1cnJlbnRSZWZyZXNoUmF0ZT01OVxyXG4iCisiQ3VycmVudFNjYW5Nb2RlPTRcclxuIgorIkN1cnJlbnRWZXJ0aWNhbFJlc29sdXRpb249MTYwMFxyXG4iCisiRGVzY3JpcHRpb249TlZJRElBIFF1YWRybyBLNjAwXHJcbiIKKyJEZXZpY2VJRD1WaWRlb0NvbnRyb2xsZXIxXHJcbiIKKyJEZXZpY2VTcGVjaWZpY1BlbnM9XHJcbiIKKyJEaXRoZXJUeXBlPTBcclxuIgorIkRyaXZlckRhdGU9MjAxMzA4MzAwMDAwMDAuMDAwMDAwLTAwMFxyXG4iCisiRHJpdmVyVmVyc2lvbj05LjE4LjEzLjIwODZcclxuIgorIkVycm9yQ2xlYXJlZD1cclxuIgorIkVycm9yRGVzY3JpcHRpb249XHJcbiIKKyJJQ01JbnRlbnQ9XHJcbiIKKyJJQ01NZXRob2Q9XHJcbiIKKyJJbmZGaWxlbmFtZT1vZW0zOS5pbmZcclxuIgorIkluZlNlY3Rpb249U2VjdGlvbjA3OFxyXG4iCisiSW5zdGFsbERhdGU9XHJcbiIKKyJJbnN0YWxsZWREaXNwbGF5RHJpdmVycz1udmQzZHVteC5kbGwsbnZ3Z2YydW14LmRsbCxudndnZjJ1bXguZGxsLG52ZDNkdW0sbnZ3Z2YydW0sbnZ3Z2YydW1cclxuIgorIkxhc3RFcnJvckNvZGU9XHJcbiIKKyJNYXhNZW1vcnlTdXBwb3J0ZWQ9XHJcbiIKKyJNYXhOdW1iZXJDb250cm9sbGVkPVxyXG4iCisiTWF4UmVmcmVzaFJhdGU9NjBcclxuIgorIk1pblJlZnJlc2hSYXRlPTUwXHJcbiIKKyJNb25vY2hyb21lPUZBTFNFXHJcbiIKKyJOYW1lPU5WSURJQSBRdWFkcm8gSzYwMFxyXG4iCisiTnVtYmVyT2ZDb2xvclBsYW5lcz1cclxuIgorIk51bWJlck9mVmlkZW9QYWdlcz1cclxuIgorIlBOUERldmljZUlEPVBDSVxcVkVOXzEwREUmYW1wO0RFVl8wRkZBJmFtcDtTVUJTWVNfMDk0QjEwM0MmYW1wO1JFVl9BMVxcNCZhbXA7MTZDOUU5RjkmYW1wOzAmYW1wOzAwMTBcclxuIgorIlBvd2VyTWFuYWdlbWVudENhcGFiaWxpdGllcz1cclxuIgorIlBvd2VyTWFuYWdlbWVudFN1cHBvcnRlZD1cclxuIgorIlByb3RvY29sU3VwcG9ydGVkPVxyXG4iCisiUmVzZXJ2ZWRTeXN0ZW1QYWxldHRlRW50cmllcz1cclxuIgorIlNwZWNpZmljYXRpb25WZXJzaW9uPVxyXG4iCisiU3RhdHVzPU9LXHJcbiIKKyJTdGF0dXNJbmZvPVxyXG4iCisiU3lzdGVtQ3JlYXRpb25DbGFzc05hbWU9V2luMzJfQ29tcHV0ZXJTeXN0ZW1cclxuIgorIlN5c3RlbVBhbGV0dGVFbnRyaWVzPVxyXG4iCisiVGltZU9mTGFzdFJlc2V0PVxyXG4iCisiVmlkZW9BcmNoaXRlY3R1cmU9NVxyXG4iCisiVmlkZW9NZW1vcnlUeXBlPTJcclxuIgorIlZpZGVvTW9kZT1cclxuIgorIlZpZGVvTW9kZURlc2NyaXB0aW9uPTI1NjAgeCAxNjAwIHggNDI5NDk2NzI5NiBjb2xvcnNcclxuIgorIlZpZGVvUHJvY2Vzc29yPVF1YWRybyBLNjAwXHJcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIHdpbl9kdWFsX2dwdVtdID0KKyJBY2NlbGVyYXRvckNhcGFiaWxpdGllcz1cclxuIgorIkFkYXB0ZXJDb21wYXRpYmlsaXR5PUFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy5cclxuIgorIkFkYXB0ZXJEQUNUeXBlPUludGVybmFsIERBQyg0MDBNSHopXHJcbiIKKyJBZGFwdGVyUkFNPTQyOTM5MTg3MjBcclxuIgorIkF2YWlsYWJpbGl0eT04XHJcbiIKKyJDYXBhYmlsaXR5RGVzY3JpcHRpb25zPVxyXG4iCisiQ2FwdGlvbj1BTUQgUmFkZW9uIChUTSkgUjUgTTMzNVxyXG4iCisiQ29sb3JUYWJsZUVudHJpZXM9XHJcbiIKKyJDb25maWdNYW5hZ2VyRXJyb3JDb2RlPTBcclxuIgorIkNvbmZpZ01hbmFnZXJVc2VyQ29uZmlnPUZBTFNFXHJcbiIKKyJDcmVhdGlvbkNsYXNzTmFtZT1XaW4zMl9WaWRlb0NvbnRyb2xsZXJcclxuIgorIkN1cnJlbnRCaXRzUGVyUGl4ZWw9XHJcbiIKKyJDdXJyZW50SG9yaXpvbnRhbFJlc29sdXRpb249XHJcbiIKKyJDdXJyZW50TnVtYmVyT2ZDb2xvcnM9XHJcbiIKKyJDdXJyZW50TnVtYmVyT2ZDb2x1bW5zPVxyXG4iCisiQ3VycmVudE51bWJlck9mUm93cz1cclxuIgorIkN1cnJlbnRSZWZyZXNoUmF0ZT1cclxuIgorIkN1cnJlbnRTY2FuTW9kZT1cclxuIgorIkN1cnJlbnRWZXJ0aWNhbFJlc29sdXRpb249XHJcbiIKKyJEZXNjcmlwdGlvbj1BTUQgUmFkZW9uIChUTSkgUjUgTTMzNVxyXG4iCisiRGV2aWNlSUQ9VmlkZW9Db250cm9sbGVyMVxyXG4iCisiRGV2aWNlU3BlY2lmaWNQZW5zPVxyXG4iCisiRGl0aGVyVHlwZT1cclxuIgorIkRyaXZlckRhdGU9MjAxNTEyMDQwMDAwMDAuMDAwMDAwLTAwMFxyXG4iCisiRHJpdmVyVmVyc2lvbj0xNS4zMDAuMTAyNS4xMDAxXHJcbiIKKyJFcnJvckNsZWFyZWQ9XHJcbiIKKyJFcnJvckRlc2NyaXB0aW9uPVxyXG4iCisiSUNNSW50ZW50PVxyXG4iCisiSUNNTWV0aG9kPVxyXG4iCisiSW5mRmlsZW5hbWU9b2VtMjcuaW5mXHJcbiIKKyJJbmZTZWN0aW9uPWF0aTJtdGFnX1I1MDNcclxuIgorIkluc3RhbGxEYXRlPVxyXG4iCisiSW5zdGFsbGVkRGlzcGxheURyaXZlcnM9YXRpY2Z4NjQuZGxsLGF0aWNmeDY0LmRsbCxhdGljZng2NC5kbGwsYW1keGM2NC5kbGwsYXRpY2Z4MzIsYXRpY2Z4MzIsYXRpY2Z4MzIsYW1keGMzMixhdGl1bWQ2NC5kbGwsYXRpZHh4NjQuZGxsLGF0aWR4eDY0LmRsbCxhdGl1bWRhZyxhdGlkeHgzMixhdGlkeHgzMixhdGl1bWR2YSxhdGl1bWQ2YS5jYXAsYXRpdG1tNjQuZGxsXHJcbiIKKyJMYXN0RXJyb3JDb2RlPVxyXG4iCisiTWF4TWVtb3J5U3VwcG9ydGVkPVxyXG4iCisiTWF4TnVtYmVyQ29udHJvbGxlZD1cclxuIgorIk1heFJlZnJlc2hSYXRlPVxyXG4iCisiTWluUmVmcmVzaFJhdGU9XHJcbiIKKyJNb25vY2hyb21lPUZBTFNFXHJcbiIKKyJOYW1lPUFNRCBSYWRlb24gKFRNKSBSNSBNMzM1XHJcbiIKKyJOdW1iZXJPZkNvbG9yUGxhbmVzPVxyXG4iCisiTnVtYmVyT2ZWaWRlb1BhZ2VzPVxyXG4iCisiUE5QRGV2aWNlSUQ9UENJXFxWRU5fMTAwMiZhbXA7REVWXzY2NjAmYW1wO1NVQlNZU18wNkIyMTAyOCZhbXA7UkVWXzgxXFw0JmFtcDsyMzcwMjY3RCZhbXA7MCZhbXA7MDBFMFxyXG4iCisiUG93ZXJNYW5hZ2VtZW50Q2FwYWJpbGl0aWVzPVxyXG4iCisiUG93ZXJNYW5hZ2VtZW50U3VwcG9ydGVkPVxyXG4iCisiUHJvdG9jb2xTdXBwb3J0ZWQ9XHJcbiIKKyJSZXNlcnZlZFN5c3RlbVBhbGV0dGVFbnRyaWVzPVxyXG4iCisiU3BlY2lmaWNhdGlvblZlcnNpb249XHJcbiIKKyJTdGF0dXM9T0tcclxuIgorIlN0YXR1c0luZm89XHJcbiIKKyJTeXN0ZW1DcmVhdGlvbkNsYXNzTmFtZT1XaW4zMl9Db21wdXRlclN5c3RlbVxyXG4iCisiU3lzdGVtTmFtZT1ERVNLVE9QLVE3QkczM05cclxuIgorIlN5c3RlbVBhbGV0dGVFbnRyaWVzPVxyXG4iCisiVGltZU9mTGFzdFJlc2V0PVxyXG4iCisiVmlkZW9BcmNoaXRlY3R1cmU9NVxyXG4iCisiVmlkZW9NZW1vcnlUeXBlPTJcclxuIgorIlZpZGVvTW9kZT1cclxuIgorIlZpZGVvTW9kZURlc2NyaXB0aW9uPVxyXG4iCisiVmlkZW9Qcm9jZXNzb3I9QU1EIFJhZGVvbiBHcmFwaGljcyBQcm9jZXNzb3IgKDB4NjY2MClcclxuIgorIlxyXG4iCisiXHJcbiIKKyJBY2NlbGVyYXRvckNhcGFiaWxpdGllcz1cclxuIgorIkFkYXB0ZXJDb21wYXRpYmlsaXR5PUludGVsIENvcnBvcmF0aW9uXHJcbiIKKyJBZGFwdGVyREFDVHlwZT1JbnRlcm5hbFxyXG4iCisiQWRhcHRlclJBTT0xMDczNzQxODI0XHJcbiIKKyJBdmFpbGFiaWxpdHk9M1xyXG4iCisiQ2FwYWJpbGl0eURlc2NyaXB0aW9ucz1cclxuIgorIkNhcHRpb249SW50ZWwoUikgSEQgR3JhcGhpY3MgNTIwXHJcbiIKKyJDb2xvclRhYmxlRW50cmllcz1cclxuIgorIkNvbmZpZ01hbmFnZXJFcnJvckNvZGU9MFxyXG4iCisiQ29uZmlnTWFuYWdlclVzZXJDb25maWc9RkFMU0VcclxuIgorIkNyZWF0aW9uQ2xhc3NOYW1lPVdpbjMyX1ZpZGVvQ29udHJvbGxlclxyXG4iCisiQ3VycmVudEJpdHNQZXJQaXhlbD0zMlxyXG4iCisiQ3VycmVudEhvcml6b250YWxSZXNvbHV0aW9uPTE5MjBcclxuIgorIkN1cnJlbnROdW1iZXJPZkNvbG9ycz00Mjk0OTY3Mjk2XHJcbiIKKyJDdXJyZW50TnVtYmVyT2ZDb2x1bW5zPTBcclxuIgorIkN1cnJlbnROdW1iZXJPZlJvd3M9MFxyXG4iCisiQ3VycmVudFJlZnJlc2hSYXRlPTU5XHJcbiIKKyJDdXJyZW50U2Nhbk1vZGU9NFxyXG4iCisiQ3VycmVudFZlcnRpY2FsUmVzb2x1dGlvbj0xMDgwXHJcbiIKKyJEZXNjcmlwdGlvbj1JbnRlbChSKSBIRCBHcmFwaGljcyA1MjBcclxuIgorIkRldmljZUlEPVZpZGVvQ29udHJvbGxlcjJcclxuIgorIkRldmljZVNwZWNpZmljUGVucz1cclxuIgorIkRpdGhlclR5cGU9MFxyXG4iCisiRHJpdmVyRGF0ZT0yMDE1MDgzMTAwMDAwMC4wMDAwMDAtMDAwXHJcbiIKKyJEcml2ZXJWZXJzaW9uPTEwLjE4LjE1LjQyODFcclxuIgorIkVycm9yQ2xlYXJlZD1cclxuIgorIkVycm9yRGVzY3JpcHRpb249XHJcbiIKKyJJQ01JbnRlbnQ9XHJcbiIKKyJJQ01NZXRob2Q9XHJcbiIKKyJJbmZGaWxlbmFtZT1vZW02LmluZlxyXG4iCisiSW5mU2VjdGlvbj1pU0tMRF93MTBcclxuIgorIkluc3RhbGxEYXRlPVxyXG4iCisiSW5zdGFsbGVkRGlzcGxheURyaXZlcnM9aWdkdW1kaW02NC5kbGwsaWdkMTBpdW1kNjQuZGxsLGlnZDEwaXVtZDY0LmRsbCxpZ2QxMnVtZDY0LmRsbCxpZ2R1bWRpbTMyLGlnZDEwaXVtZDMyLGlnZDEwaXVtZDMyLGlnZDEydW1kMzJcclxuIgorIkxhc3RFcnJvckNvZGU9XHJcbiIKKyJNYXhNZW1vcnlTdXBwb3J0ZWQ9XHJcbiIKKyJNYXhOdW1iZXJDb250cm9sbGVkPVxyXG4iCisiTWF4UmVmcmVzaFJhdGU9NTlcclxuIgorIk1pblJlZnJlc2hSYXRlPTQ4XHJcbiIKKyJNb25vY2hyb21lPUZBTFNFXHJcbiIKKyJOYW1lPUludGVsKFIpIEhEIEdyYXBoaWNzIDUyMFxyXG4iCisiTnVtYmVyT2ZDb2xvclBsYW5lcz1cclxuIgorIk51bWJlck9mVmlkZW9QYWdlcz1cclxuIgorIlBOUERldmljZUlEPVBDSVxcVkVOXzgwODYmYW1wO0RFVl8xOTE2JmFtcDtTVUJTWVNfMDZCMjEwMjgmYW1wO1JFVl8wN1xcMyZhbXA7MTE1ODM2NTkmYW1wOzAmYW1wOzEwXHJcbiIKKyJQb3dlck1hbmFnZW1lbnRDYXBhYmlsaXRpZXM9XHJcbiIKKyJQb3dlck1hbmFnZW1lbnRTdXBwb3J0ZWQ9XHJcbiIKKyJQcm90b2NvbFN1cHBvcnRlZD1cclxuIgorIlJlc2VydmVkU3lzdGVtUGFsZXR0ZUVudHJpZXM9XHJcbiIKKyJTcGVjaWZpY2F0aW9uVmVyc2lvbj1cclxuIgorIlN0YXR1cz1PS1xyXG4iCisiU3RhdHVzSW5mbz1cclxuIgorIlN5c3RlbUNyZWF0aW9uQ2xhc3NOYW1lPVdpbjMyX0NvbXB1dGVyU3lzdGVtXHJcbiIKKyJTeXN0ZW1QYWxldHRlRW50cmllcz1cclxuIgorIlRpbWVPZkxhc3RSZXNldD1cclxuIgorIlZpZGVvQXJjaGl0ZWN0dXJlPTVcclxuIgorIlZpZGVvTWVtb3J5VHlwZT0yXHJcbiIKKyJWaWRlb01vZGU9XHJcbiIKKyJWaWRlb01vZGVEZXNjcmlwdGlvbj0xOTIwIHggMTA4MCB4IDQyOTQ5NjcyOTYgY29sb3JzXHJcbiIKKyJWaWRlb1Byb2Nlc3Nvcj1JbnRlbChSKSBIRCBHcmFwaGljcyBGYW1pbHlcclxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgbGludXhfc2luZ2xlX2dwdVtdID0KKyJSZXY6IDA1XG4iCisiXG4iCisiRGV2aWNlOiAwNDowMC4wXG4iCisiQ2xhc3M6ICBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyIFswMzAwXVxuIgorIlZlbmRvcjogTlZJRElBIENvcnBvcmF0aW9uIFsxMGRlXVxuIgorIkRldmljZTogR00xMDdHTCBbUXVhZHJvIEsyMjAwXSBbMTNiYV1cbiIKKyJTVmVuZG9yOiAgICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBbMTAzY11cbiIKKyJTRGV2aWNlOiAgICBEZXZpY2UgWzEwOTddXG4iCisiUGh5U2xvdDogICAgMlxuIgorIlJldjogICAgYTJcbiIKKyJcbiIKKyJEZXZpY2U6IDA0OjAwLjFcbiIKKyJcbiIKKyJcbiIKKyJcbiIKKyJcbiIKKyJPcGVuR0wgdmVyc2lvbiBzdHJpbmc6IDQuNC4wIE5WSURJQSAzNDAuOTZcbiIKKyJPcGVuR0wgc2hhZGluZyBsYW5ndWFnZSB2ZXJzaW9uIHN0cmluZzogNC40MCBOVklESUEgdmlhIENnIGNvbXBpbGVyXG4iCisiT3BlbkdMIGNvbnRleHQgZmxhZ3M6IChub25lKVxuIgorIlxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIgbGludXhfbWVzYWRyaVtdID0KKyJSZXY6IDA1XG4iCisiXG4iCisiRGV2aWNlOiAwNDowMC4wXG4iCisiQ2xhc3M6ICBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyIFswMzAwXVxuIgorIlZlbmRvcjogTlZJRElBIENvcnBvcmF0aW9uIFsxMGRlXVxuIgorIkRldmljZTogR00xMDdHTCBbUXVhZHJvIEsyMjAwXSBbMTNiYV1cbiIKKyJTVmVuZG9yOiAgICBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSBbMTAzY11cbiIKKyJTRGV2aWNlOiAgICBEZXZpY2UgWzEwOTddXG4iCisiUGh5U2xvdDogICAgMlxuIgorIlJldjogICAgYTJcbiIKKyJcbiIKKyJEZXZpY2U6IDA0OjAwLjFcbiIKKyJcbiIKKyJcbiIKKyJcbiIKKyJcbiIKKyJPcGVuR0wgdmVyc2lvbiBzdHJpbmc6IDMuMCBNZXNhIDEwLjQuMiAoZ2l0LSlcbiIKKyJcbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGxpbnV4X25vX2dseGluZm9bXSA9CisiUmV2OiAwNVxuIgorIlxuIgorIkRldmljZTogMDQ6MDAuMFxuIgorIkNsYXNzOiAgVkdBIGNvbXBhdGlibGUgY29udHJvbGxlciBbMDMwMF1cbiIKKyJWZW5kb3I6IE5WSURJQSBDb3Jwb3JhdGlvbiBbMTBkZV1cbiIKKyJEZXZpY2U6IEdNMTA3R0wgW1F1YWRybyBLMjIwMF0gWzEzYmFdXG4iCisiU1ZlbmRvcjogICAgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkgWzEwM2NdXG4iCisiU0RldmljZTogICAgRGV2aWNlIFsxMDk3XVxuIgorIlBoeVNsb3Q6ICAgIDJcbiIKKyJSZXY6ICAgIGEyXG4iCisiXG4iCisiRGV2aWNlOiAwNDowMC4xXG4iCisiXG4iCisiXG4iCisiXG4iCisiXG4iCisiXG4iOworCitzdGF0aWMgY29uc3QgY2hhciBsaW51eF9ub19sc3BjaVtdID0KKyJcbiIKKyJcbiIKKyJPcGVuR0wgdmVyc2lvbiBzdHJpbmc6IDMuMCBNZXNhIDEwLjQuMiAoZ2l0LSlcbiIKKyJcbiI7CisKK1RFU1QocGFyc2VfZ3B1X2luZm9fbGlzdF9vc3gsIFNpbmdsZUdwdSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKG9zeF9zaW5nbGVfZ3B1KTsKKworICAgIEdwdUluZm9MaXN0IGdwdWxpc3Q7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF9vc3goY29udGVudHMsICZncHVsaXN0KTsKKworICAgIEVYUEVDVF9UUlVFKGdwdWxpc3QuaW5mb3Muc2l6ZSgpID09IDEpOworCisgICAgR3B1SW5mbyBpbmZvID0gZ3B1bGlzdC5jdXJyR3B1KCk7CisKKyAgICBFWFBFQ1RfVFJVRShpbmZvLmN1cnJlbnRfZ3B1KTsKKyAgICBFWFBFQ1RfU1RSRVEoIkludGVsICgweDgwODYpIiwgaW5mby5tYWtlLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiSW50ZWwgSXJpcyBQcm8iLCBpbmZvLm1vZGVsLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMHgwZDI2IiwgaW5mby5kZXZpY2VfaWQuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIweDAwMDgiLCBpbmZvLnJldmlzaW9uX2lkLmNfc3RyKCkpOworICAgIEVYUEVDVF9UUlVFKGluZm8udmVyc2lvbi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRShpbmZvLnJlbmRlcmVyLmVtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKGluZm8uZGxscy5lbXB0eSgpKTsKK30KKworVEVTVChwYXJzZV9ncHVfaW5mb19saXN0X29zeCwgRHVhbEdwdSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKG9zeF9kdWFsX2dwdSk7CisKKyAgICBHcHVJbmZvTGlzdCBncHVsaXN0OworICAgIHBhcnNlX2dwdV9pbmZvX2xpc3Rfb3N4KGNvbnRlbnRzLCAmZ3B1bGlzdCk7CisKKyAgICBFWFBFQ1RfVFJVRShncHVsaXN0LmluZm9zLnNpemUoKSA9PSAyKTsKKworICAgIEdwdUluZm8mIGludGVsX2luZm8gPSBncHVsaXN0LmluZm9zWzBdOworICAgIEVYUEVDVF9UUlVFKGludGVsX2luZm8uY3VycmVudF9ncHUpOworICAgIEVYUEVDVF9TVFJFUSgiSW50ZWwgKDB4ODA4NikiLCBpbnRlbF9pbmZvLm1ha2UuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJJbnRlbCBIRCBHcmFwaGljcyA0MDAwIiwgaW50ZWxfaW5mby5tb2RlbC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjB4MDE2NiIsIGludGVsX2luZm8uZGV2aWNlX2lkLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMHgwMDA5IiwgaW50ZWxfaW5mby5yZXZpc2lvbl9pZC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShpbnRlbF9pbmZvLnZlcnNpb24uZW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUoaW50ZWxfaW5mby5yZW5kZXJlci5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRShpbnRlbF9pbmZvLmRsbHMuZW1wdHkoKSk7CisKKyAgICBHcHVJbmZvJiBudmlkaWFfaW5mbyA9IGdwdWxpc3QuaW5mb3NbMV07CisgICAgRVhQRUNUX0ZBTFNFKG52aWRpYV9pbmZvLmN1cnJlbnRfZ3B1KTsKKyAgICBFWFBFQ1RfU1RSRVEoIk5WSURJQSAoMHgxMGRlKSIsIG52aWRpYV9pbmZvLm1ha2UuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJOVklESUEgR2VGb3JjZSBHVCA2NTBNIiwgbnZpZGlhX2luZm8ubW9kZWwuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIweDBmZDUiLCBudmlkaWFfaW5mby5kZXZpY2VfaWQuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIweDAwYTIiLCBudmlkaWFfaW5mby5yZXZpc2lvbl9pZC5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby52ZXJzaW9uLmVtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKG52aWRpYV9pbmZvLnJlbmRlcmVyLmVtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKG52aWRpYV9pbmZvLmRsbHMuZW1wdHkoKSk7Cit9CisKK1RFU1QocGFyc2VfZ3B1X2luZm9fbGlzdF93aW5kb3dzLCBXaW5Ob0luc3RhbGxlZERyaXZlcnNDb250aW51ZUNhc2UpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cyh3aW5fbm9pbnN0YWxsZWRkcml2ZXJzKTsKKworICAgIEdwdUluZm9MaXN0IGdwdWxpc3Q7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF93aW5kb3dzKGNvbnRlbnRzLCAmZ3B1bGlzdCk7CisKKyAgICBFWFBFQ1RfRVEoMiwgKGludClncHVsaXN0LmluZm9zLnNpemUoKSk7Cit9CisKK1RFU1QocGFyc2VfZ3B1X2luZm9fbGlzdF93aW5kb3dzLCBTaW5nbGVHcHUpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cyh3aW5fc2luZ2xlX2dwdSk7CisKKyAgICBHcHVJbmZvTGlzdCBncHVsaXN0OworICAgIHBhcnNlX2dwdV9pbmZvX2xpc3Rfd2luZG93cyhjb250ZW50cywgJmdwdWxpc3QpOworCisgICAgRVhQRUNUX1RSVUUoZ3B1bGlzdC5pbmZvcy5zaXplKCkgPT0gMSk7CisKKyAgICBHcHVJbmZvJiBudmlkaWFfaW5mbyA9IGdwdWxpc3QuaW5mb3NbMF07CisKKyAgICBFWFBFQ1RfRkFMU0UobnZpZGlhX2luZm8uY3VycmVudF9ncHUpOworICAgIEVYUEVDVF9TVFJFUSgiTlZJRElBIiwgbnZpZGlhX2luZm8ubWFrZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIk5WSURJQSBRdWFkcm8gSzYwMCIsIG52aWRpYV9pbmZvLm1vZGVsLmNfc3RyKCkpOworICAgIEVYUEVDVF9UUlVFKG52aWRpYV9pbmZvLmRldmljZV9pZC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5yZXZpc2lvbl9pZC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjkuMTguMTMuMjA4NiIsIG52aWRpYV9pbmZvLnZlcnNpb24uY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUobnZpZGlhX2luZm8ucmVuZGVyZXIuZW1wdHkoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5kbGxzLnNpemUoKSA9PSA4KTsKKyAgICBFWFBFQ1RfU1RSRVEoIm52ZDNkdW14LmRsbCIsIG52aWRpYV9pbmZvLmRsbHNbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJudndnZjJ1bXguZGxsIiwgbnZpZGlhX2luZm8uZGxsc1sxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIm52d2dmMnVteC5kbGwiLCBudmlkaWFfaW5mby5kbGxzWzJdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgibnZkM2R1bSIsIG52aWRpYV9pbmZvLmRsbHNbM10uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJudndnZjJ1bSIsIG52aWRpYV9pbmZvLmRsbHNbNF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJudndnZjJ1bSIsIG52aWRpYV9pbmZvLmRsbHNbNV0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJudm9nbHYzMi5kbGwiLCBudmlkaWFfaW5mby5kbGxzWzZdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgibnZvZ2x2NjQuZGxsIiwgbnZpZGlhX2luZm8uZGxsc1s3XS5jX3N0cigpKTsKK30KKworVEVTVChwYXJzZV9ncHVfaW5mb19saXN0X3dpbmRvd3MsIER1YWxHcHUpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cyh3aW5fZHVhbF9ncHUpOworCisgICAgR3B1SW5mb0xpc3QgZ3B1bGlzdDsKKyAgICBwYXJzZV9ncHVfaW5mb19saXN0X3dpbmRvd3MoY29udGVudHMsICZncHVsaXN0KTsKKworICAgIEVYUEVDVF9UUlVFKGdwdWxpc3QuaW5mb3Muc2l6ZSgpID09IDIpOworCisgICAgR3B1SW5mbyYgYXRpX2luZm8gPSBncHVsaXN0LmluZm9zWzBdOworICAgIEVYUEVDVF9GQUxTRShhdGlfaW5mby5jdXJyZW50X2dwdSk7CisgICAgRVhQRUNUX1NUUkVRKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuIiwgYXRpX2luZm8ubWFrZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkFNRCBSYWRlb24gKFRNKSBSNSBNMzM1IiwgYXRpX2luZm8ubW9kZWwuY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUoYXRpX2luZm8uZGV2aWNlX2lkLmVtcHR5KCkpOworICAgIEVYUEVDVF9UUlVFKGF0aV9pbmZvLnJldmlzaW9uX2lkLmVtcHR5KCkpOworICAgIEVYUEVDVF9TVFJFUSgiMTUuMzAwLjEwMjUuMTAwMSIsIGF0aV9pbmZvLnZlcnNpb24uY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUoYXRpX2luZm8ucmVuZGVyZXIuZW1wdHkoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShhdGlfaW5mby5kbGxzLnNpemUoKSA9PSAxOSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGljZng2NC5kbGwiLCBhdGlfaW5mby5kbGxzWzBdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYXRpY2Z4NjQuZGxsIiwgYXRpX2luZm8uZGxsc1sxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImF0aWNmeDY0LmRsbCIsIGF0aV9pbmZvLmRsbHNbMl0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhbWR4YzY0LmRsbCIsIGF0aV9pbmZvLmRsbHNbM10uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGljZngzMiIsIGF0aV9pbmZvLmRsbHNbNF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGljZngzMiIsIGF0aV9pbmZvLmRsbHNbNV0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGljZngzMiIsIGF0aV9pbmZvLmRsbHNbNl0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhbWR4YzMyIiwgYXRpX2luZm8uZGxsc1s3XS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImF0aXVtZDY0LmRsbCIsIGF0aV9pbmZvLmRsbHNbOF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGlkeHg2NC5kbGwiLCBhdGlfaW5mby5kbGxzWzldLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYXRpZHh4NjQuZGxsIiwgYXRpX2luZm8uZGxsc1sxMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGl1bWRhZyIsIGF0aV9pbmZvLmRsbHNbMTFdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYXRpZHh4MzIiLCBhdGlfaW5mby5kbGxzWzEyXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImF0aWR4eDMyIiwgYXRpX2luZm8uZGxsc1sxM10uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGl1bWR2YSIsIGF0aV9pbmZvLmRsbHNbMTRdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYXRpdW1kNmEuY2FwIiwgYXRpX2luZm8uZGxsc1sxNV0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJhdGl0bW02NC5kbGwiLCBhdGlfaW5mby5kbGxzWzE2XS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImF0aW9nbHh4LmRsbCIsIGF0aV9pbmZvLmRsbHNbMTddLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiYXRpZzZ0eHguZGxsIiwgYXRpX2luZm8uZGxsc1sxOF0uY19zdHIoKSk7CisKKyAgICBHcHVJbmZvJiBpbnRlbF9pbmZvID0gZ3B1bGlzdC5pbmZvc1sxXTsKKyAgICBFWFBFQ1RfRkFMU0UoaW50ZWxfaW5mby5jdXJyZW50X2dwdSk7CisgICAgRVhQRUNUX1NUUkVRKCJJbnRlbCBDb3Jwb3JhdGlvbiIsIGludGVsX2luZm8ubWFrZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkludGVsKFIpIEhEIEdyYXBoaWNzIDUyMCIsIGludGVsX2luZm8ubW9kZWwuY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUoaW50ZWxfaW5mby5kZXZpY2VfaWQuZW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUoaW50ZWxfaW5mby5yZXZpc2lvbl9pZC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEwLjE4LjE1LjQyODEiLCBpbnRlbF9pbmZvLnZlcnNpb24uY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUoaW50ZWxfaW5mby5yZW5kZXJlci5lbXB0eSgpKTsKKworICAgIEVYUEVDVF9UUlVFKGludGVsX2luZm8uZGxscy5zaXplKCkgPT0gOCk7CisgICAgRVhQRUNUX1NUUkVRKCJpZ2R1bWRpbTY0LmRsbCIsIGludGVsX2luZm8uZGxsc1swXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImlnZDEwaXVtZDY0LmRsbCIsIGludGVsX2luZm8uZGxsc1sxXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImlnZDEwaXVtZDY0LmRsbCIsIGludGVsX2luZm8uZGxsc1syXS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImlnZDEydW1kNjQuZGxsIiwgaW50ZWxfaW5mby5kbGxzWzNdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiaWdkdW1kaW0zMiIsIGludGVsX2luZm8uZGxsc1s0XS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImlnZDEwaXVtZDMyIiwgaW50ZWxfaW5mby5kbGxzWzVdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiaWdkMTBpdW1kMzIiLCBpbnRlbF9pbmZvLmRsbHNbNl0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJpZ2QxMnVtZDMyIiwgaW50ZWxfaW5mby5kbGxzWzddLmNfc3RyKCkpOworfQorCitURVNUKHBhcnNlX2dwdV9pbmZvX2xpc3RfbGludXgsIEVtcHR5U3RyKSB7CisgICAgc3RkOjpzdHJpbmcgY29udGVudHM7CisKKyAgICBHcHVJbmZvTGlzdCBncHVsaXN0OworICAgIHBhcnNlX2dwdV9pbmZvX2xpc3RfbGludXgoY29udGVudHMsICZncHVsaXN0KTsKKworICAgIEVYUEVDVF9UUlVFKGdwdWxpc3QuaW5mb3Muc2l6ZSgpID09IDApOworfQorCitURVNUKHBhcnNlX2dwdV9pbmZvX2xpc3RfbGludXgsIE5vR2x4SW5mbykgeworICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKGxpbnV4X25vX2dseGluZm8pOworCisgICAgR3B1SW5mb0xpc3QgZ3B1bGlzdDsKKyAgICBwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4KGNvbnRlbnRzLCAmZ3B1bGlzdCk7CisKKyAgICBFWFBFQ1RfVFJVRShncHVsaXN0LmluZm9zLnNpemUoKSA9PSAxKTsKK30KKworVEVTVChwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4LCBOb2xzcGNpKSB7CisgICAgc3RkOjpzdHJpbmcgY29udGVudHMobGludXhfbm9fbHNwY2kpOworCisgICAgR3B1SW5mb0xpc3QgZ3B1bGlzdDsKKyAgICBwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4KGNvbnRlbnRzLCAmZ3B1bGlzdCk7CisKKyAgICBFWFBFQ1RfVFJVRShncHVsaXN0LmluZm9zLnNpemUoKSA9PSAxKTsKK30KKworVEVTVChwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4LCBTaW5nbGVHcHUpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cyhsaW51eF9zaW5nbGVfZ3B1KTsKKworICAgIEdwdUluZm9MaXN0IGdwdWxpc3Q7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF9saW51eChjb250ZW50cywgJmdwdWxpc3QpOworCisgICAgRVhQRUNUX1RSVUUoZ3B1bGlzdC5pbmZvcy5zaXplKCkgPT0gMSk7CisgICAgR3B1SW5mbyYgbnZpZGlhX2luZm8gPSBncHVsaXN0LmluZm9zWzBdOworICAgIEVYUEVDVF9GQUxTRShudmlkaWFfaW5mby5jdXJyZW50X2dwdSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMGRlIiwgbnZpZGlhX2luZm8ubWFrZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5tb2RlbC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEzYmEiLCBudmlkaWFfaW5mby5kZXZpY2VfaWQuY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUobnZpZGlhX2luZm8ucmV2aXNpb25faWQuZW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUobnZpZGlhX2luZm8udmVyc2lvbi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIk9wZW5HTCB2ZXJzaW9uIHN0cmluZzogNC40LjAgTlZJRElBIDM0MC45NiIsCisgICAgICAgICAgICBudmlkaWFfaW5mby5yZW5kZXJlci5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5kbGxzLmVtcHR5KCkpOworfQorCitURVNUKHBhcnNlX2dwdV9pbmZvX2xpc3RfbGludXgsIE1lc2FEUkkpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cyhsaW51eF9tZXNhZHJpKTsKKworICAgIEdwdUluZm9MaXN0IGdwdWxpc3Q7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF9saW51eChjb250ZW50cywgJmdwdWxpc3QpOworCisgICAgRVhQRUNUX1RSVUUoZ3B1bGlzdC5pbmZvcy5zaXplKCkgPT0gMSk7CisgICAgR3B1SW5mbyYgbnZpZGlhX2luZm8gPSBncHVsaXN0LmluZm9zWzBdOworICAgIEVYUEVDVF9GQUxTRShudmlkaWFfaW5mby5jdXJyZW50X2dwdSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMGRlIiwgbnZpZGlhX2luZm8ubWFrZS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5tb2RlbC5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjEzYmEiLCBudmlkaWFfaW5mby5kZXZpY2VfaWQuY19zdHIoKSk7CisgICAgRVhQRUNUX1RSVUUobnZpZGlhX2luZm8ucmV2aXNpb25faWQuZW1wdHkoKSk7CisgICAgRVhQRUNUX1RSVUUobnZpZGlhX2luZm8udmVyc2lvbi5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIk9wZW5HTCB2ZXJzaW9uIHN0cmluZzogMy4wIE1lc2EgMTAuNC4yIChnaXQtKSIsCisgICAgICAgICAgICBudmlkaWFfaW5mby5yZW5kZXJlci5jX3N0cigpKTsKKyAgICBFWFBFQ1RfVFJVRShudmlkaWFfaW5mby5kbGxzLmVtcHR5KCkpOworfQorCitURVNUKGdwdWluZm9fcXVlcnlfYmxhY2tsaXN0LCB0ZXN0QmxhY2tsaXN0X1BvcykgeworICAgIGNvbnN0IEJsYWNrbGlzdEVudHJ5IHRlc3RfbGlzdFtdID0geworICAgICAgICB7IjEwZGUiLCBudWxscHRyLCAiMTNiYSIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9CisgICAgfTsKKworICAgIGludCB0ZXN0X2xpc3RfbGVuID0gc2l6ZW9mKHRlc3RfbGlzdCkgLyBzaXplb2YoQmxhY2tsaXN0RW50cnkpOworCisgICAgc3RkOjpzdHJpbmcgY29udGVudHMobGludXhfc2luZ2xlX2dwdSk7CisgICAgR3B1SW5mb0xpc3QgZ3B1bGlzdDsKKyAgICBwYXJzZV9ncHVfaW5mb19saXN0X2xpbnV4KGNvbnRlbnRzLCAmZ3B1bGlzdCk7CisgICAgYm9vbCBvbl9ibGFja2xpc3QgPSBncHVpbmZvX3F1ZXJ5X2JsYWNrbGlzdCgmZ3B1bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbGlzdF9sZW4pOworCisgICAgRVhQRUNUX1RSVUUob25fYmxhY2tsaXN0KTsKK30KKworVEVTVChncHVpbmZvX3F1ZXJ5X2JsYWNrbGlzdCwgdGVzdEJsYWNrbGlzdF9OZWcpIHsKKyAgICBjb25zdCBCbGFja2xpc3RFbnRyeSB0ZXN0X2xpc3RbXSA9IHsKKyAgICAgICAgeyIxMGRlIiwgbnVsbHB0ciwgIjEzYmEiLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfSwKKyAgICAgICAgeyJOVklESUEiLCAiTlZJRElBIFF1YWRybyBLNjAwIiwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn0sCisgICAgICAgIHsiQVNERiIsICJJbnRlbCBJcmlzIFBybyIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9CisgICAgfTsKKworICAgIGludCB0ZXN0X2xpc3RfbGVuID0gc2l6ZW9mKHRlc3RfbGlzdCkgLyBzaXplb2YoQmxhY2tsaXN0RW50cnkpOworCisgICAgc3RkOjpzdHJpbmcgY29udGVudHMob3N4X3NpbmdsZV9ncHUpOworICAgIEdwdUluZm9MaXN0IGdwdWxpc3Q7CisgICAgcGFyc2VfZ3B1X2luZm9fbGlzdF9vc3goY29udGVudHMsICZncHVsaXN0KTsKKyAgICBib29sIG9uX2JsYWNrbGlzdCA9IGdwdWluZm9fcXVlcnlfYmxhY2tsaXN0KCZncHVsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9saXN0X2xlbik7CisKKyAgICBFWFBFQ1RfRkFMU0Uob25fYmxhY2tsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvbG9nZ2VyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvbG9nZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzVjMWRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbC9sb2dnZXIuY3BwCkBAIC0wLDAgKzEsMjAwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL2xvZ2dlci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9DcmFzaFJlcG9ydGVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jazsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxvY2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpjcmFzaHJlcG9ydDo6Q3Jhc2hSZXBvcnRlcjsKKworLy8gVGhlIHB1cnBvc2Ugb2YgdGhlIE9wZW5HTCBsb2dnZXIgaXMgdG8gbG9nCisvLyBpbmZvcm1hdGlvbiBhYm91dCBzdWNoIHRoaW5ncyBhcyBFR0wgaW5pdGlhbGl6YXRpb24KKy8vIGFuZCBwb3NzaWJseSBtaXNjZWxsYW5vdXMgT3BlbkdMIGNvbW1hbmRzLAorLy8gaW4gb3JkZXIgdG8gZ2V0IGEgYmV0dGVyIGlkZWEgb2Ygd2hhdCBpcyBnb2luZyBvbgorLy8gaW4gY3Jhc2ggcmVwb3J0cy4KKworLy8gVGhlIE9wZW5HTExvZ2dlciBpbXBsZW1lbnRhdGlvbidzIGluaXRpYWxpemF0aW9uIG1ldGhvZAorLy8gYnkgZGVmYXVsdCB1c2VzIHRoZSBjcmFzaCByZXBvcnRlcidzIGRhdGEgZGlyZWN0b3J5LgorCitzdGF0aWMgY29uc3QgaW50IGtCdWZmZXJMZW4gPSAyMDQ4OworCit0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc3RkOjpzdHJpbmc+IFRpbWVzdGFtcGVkTG9nRW50cnk7CisKK2NsYXNzIE9wZW5HTExvZ2dlciB7CitwdWJsaWM6CisgICAgT3BlbkdMTG9nZ2VyKCk7CisgICAgT3BlbkdMTG9nZ2VyKGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKKyAgICAvLyBDb2Fyc2UgbG9nOiBDYWxsIHRoaXMgaW5mcmVxdWVudGx5LgorICAgIHZvaWQgd3JpdGVDb2Fyc2UoY29uc3QgY2hhciogc3RyKTsKKworICAgIC8vIEZpbmUgbG9nOiBXaGVuIHdlIHdhbnQgdG8gbG9nIHZlcnkgZnJlcXVlbnQgZXZlbnRzLgorICAgIC8vIEZpbmUgbG9ncyBjYW4gYmUgdG9nZ2xlZCBvbi9vZmYuCisgICAgdm9pZCB3cml0ZUZpbmUodWludDY0X3QgdGltZSwgY29uc3QgY2hhciogc3RyKTsKKyAgICB2b2lkIHdyaXRlRmluZVRpbWVzdGFtcGVkKGNvbnN0IGNoYXIqIHN0cik7CisKKyAgICB2b2lkIHN0YXJ0RmluZUxvZygpOworICAgIHZvaWQgc3RvcEZpbmVMb2coKTsKKyAgICBzdGF0aWMgT3BlbkdMTG9nZ2VyKiBnZXQoKTsKK3ByaXZhdGU6CisgICAgTG9jayBtTG9jazsKKyAgICBib29sIG1GaW5lTG9nQWN0aXZlOworICAgIHN0ZDo6c3RyaW5nIG1GaWxlTmFtZTsKKyAgICBzdGQ6Om9mc3RyZWFtIG1GaWxlSGFuZGxlOworICAgIHN0ZDo6c3RyaW5nIG1GaW5lTG9nRmlsZU5hbWU7CisgICAgc3RkOjpvZnN0cmVhbSBtRmluZUxvZ0ZpbGVIYW5kbGU7CisgICAgc3RkOjp2ZWN0b3I8VGltZXN0YW1wZWRMb2dFbnRyeT4gbUZpbmVMb2c7CisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoT3BlbkdMTG9nZ2VyKTsKK307CisKKzo6YW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPE9wZW5HTExvZ2dlcj4gc09wZW5HTExvZ2dlciA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworT3BlbkdMTG9nZ2VyKiBPcGVuR0xMb2dnZXI6OmdldCgpIHsKKyAgICByZXR1cm4gc09wZW5HTExvZ2dlci5wdHIoKTsKK30KKworT3BlbkdMTG9nZ2VyOjpPcGVuR0xMb2dnZXIoKSA6CisgICAgbUZpbmVMb2dBY3RpdmUoZmFsc2UpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGF0YV9kaXIgPQorICAgICAgICBDcmFzaFJlcG9ydGVyOjpnZXQoKS0+Z2V0RGF0YUV4Y2hhbmdlRGlyKCk7CisgICAgbUZpbGVOYW1lID0gUGF0aFV0aWxzOjpqb2luKGRhdGFfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlbmdsX2xvZy50eHQiKTsKKyAgICBtRmlsZUhhbmRsZS5vcGVuKG1GaWxlTmFtZSwgc3RkOjppb3M6OmFwcCk7CisgICAgbUZpbmVMb2dGaWxlTmFtZSA9IFBhdGhVdGlsczo6am9pbihkYXRhX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuZ2xfY3h0X2xvZy50eHQiKTsKKyAgICBtRmluZUxvZ0ZpbGVIYW5kbGUub3BlbihtRmluZUxvZ0ZpbGVOYW1lLCBzdGQ6Omlvczo6YXBwKTsKK30KKworT3BlbkdMTG9nZ2VyOjpPcGVuR0xMb2dnZXIoY29uc3QgY2hhciogZmlsZW5hbWUpIDoKKyAgICBtRmlsZU5hbWUoZmlsZW5hbWUpIHsKKyAgICBtRmlsZUhhbmRsZS5vcGVuKG1GaWxlTmFtZSwgc3RkOjppb3M6OmFwcCk7Cit9CisKK3ZvaWQgT3BlbkdMTG9nZ2VyOjp3cml0ZUNvYXJzZShjb25zdCBjaGFyKiBzdHIpIHsKKyAgICBpZiAobUZpbGVIYW5kbGUpIHsKKyAgICAgICAgbUZpbGVIYW5kbGUgPDwgc3RyOworICAgICAgICBtRmlsZUhhbmRsZSA8PCBzdGQ6OmVuZGw7CisgICAgfQorfQorCit2b2lkIE9wZW5HTExvZ2dlcjo6d3JpdGVGaW5lKHVpbnQ2NF90IHRpbWUsIGNvbnN0IGNoYXIqIHN0cikgeworICAgIGlmIChtRmluZUxvZ0FjdGl2ZSkgeworICAgICAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgbUZpbmVMb2cuZW1wbGFjZV9iYWNrKHRpbWUsIHN0cik7CisgICAgfQorfQorCit2b2lkIE9wZW5HTExvZ2dlcjo6d3JpdGVGaW5lVGltZXN0YW1wZWQoY29uc3QgY2hhciogc3RyKSB7CisgICAgaWYgKG1GaW5lTG9nQWN0aXZlKSB7CisgICAgICAgIGNoYXIgYnVmW2tCdWZmZXJMZW5dID0ge307CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworICAgICAgICB1aW50NjRfdCBjdXJyX21pY3JvcyA9ICh0di50dl91c2VjKSAlIDEwMDA7CisgICAgICAgIHVpbnQ2NF90IGN1cnJfbWlsbGlzID0gKHR2LnR2X3VzZWMgLyAxMDAwKSAlIDEwMDA7CisgICAgICAgIHVpbnQ2NF90IGN1cnJfc2VjcyA9IHR2LnR2X3NlYzsKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsCisgICAgICAgICAgICAgICAgInRpbWVfdXM9IgorICAgICAgICAgICAgICAgICIlIiBQUkl1NjQgIiBzICIKKyAgICAgICAgICAgICAgICAiJSIgUFJJdTY0ICIgbXMgIgorICAgICAgICAgICAgICAgICIlIiBQUkl1NjQgIiB1cyB8ICVzIiwKKyAgICAgICAgICAgICAgICBjdXJyX3NlY3MsCisgICAgICAgICAgICAgICAgY3Vycl9taWxsaXMsCisgICAgICAgICAgICAgICAgY3Vycl9taWNyb3MsCisgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgd3JpdGVGaW5lKGN1cnJfbWljcm9zICsgMTAwMFVMTCAqIGN1cnJfbWlsbGlzICsKKyAgICAgICAgICAgICAgICAgIDEwMDBVTEwgKiAxMDAwVUxMICogY3Vycl9zZWNzLCBidWYpOworICAgIH0KK30KKwordm9pZCBPcGVuR0xMb2dnZXI6OnN0YXJ0RmluZUxvZygpIHsKKyAgICBtRmluZUxvZ0FjdGl2ZSA9IHRydWU7Cit9CisKK3ZvaWQgT3BlbkdMTG9nZ2VyOjpzdG9wRmluZUxvZygpIHsKKyAgICBpZiAobUZpbmVMb2dBY3RpdmUpIHsKKyAgICAgICAgbUZpbmVMb2dBY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gT25seSBwcmludCBtZXNzYWdlIHdoZW4gZmluZS1ncmFpbmVkCisgICAgICAgIC8vIGxvZ2dpbmcgaXMgdHVybmVkIG9uLgorICAgICAgICBpZiAoIW1GaW5lTG9nLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiV3JpdGluZyBmaW5lLWdyYWluZWQgR0wgbG9nIHRvICVzLi4uIiwKKyAgICAgICAgICAgICAgICAgICAgbUZpbmVMb2dGaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgbG9nIGVudHJpZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHRpbWVzdGFtcHMuCisgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgbG9nIGVudHJpZXMgbWlnaHQgYXJyaXZlCisgICAgICAgIC8vIG91dCBvZiBvcmRlci4KKyAgICAgICAgc3RkOjpzb3J0KG1GaW5lTG9nLmJlZ2luKCksIG1GaW5lTG9nLmVuZCgpLAorICAgICAgICAgICAgICAgICAgW10oY29uc3QgVGltZXN0YW1wZWRMb2dFbnRyeSYgeCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVzdGFtcGVkTG9nRW50cnkmIHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5maXJzdCA8IHkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogbUZpbmVMb2cpIHsKKyAgICAgICAgICAgIC8vIFRoZSBmaW5lIGxvZyBkb2VzIG5vdCBwcmludCBuZXdsaW5lcworICAgICAgICAgICAgLy8gYXMgaXQgaXMgdXNlZCB3aXRoIHRoZSBvcGVuZ2wgZGVidWcKKyAgICAgICAgICAgIC8vIHByaW50b3V0IGluIGVtdWdsLCB3aGljaCBhZGRzCisgICAgICAgICAgICAvLyBuZXdsaW5lcyBvZiBpdHMgb3duLgorICAgICAgICAgICAgbUZpbmVMb2dGaWxlSGFuZGxlIDw8IGVudHJ5LnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBtRmluZUxvZ0ZpbGVIYW5kbGUuY2xvc2UoKTsKKyAgICAgICAgaWYgKCFtRmluZUxvZy5lbXB0eSgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvbmVcbiIpOworICAgICAgICB9CisgICAgICAgIG1GaW5lTG9nLmNsZWFyKCk7CisgICAgfQorfQorCisvLyBDIGludGVyZmFjZQorCit2b2lkIGFuZHJvaWRfaW5pdF9vcGVuZ2xfbG9nZ2VyKCkgeworICAgIE9wZW5HTExvZ2dlciogZ2xfbG9nID0gT3BlbkdMTG9nZ2VyOjpnZXQoKTsKKyAgICBnbF9sb2ctPnN0YXJ0RmluZUxvZygpOworfQorCit2b2lkIGFuZHJvaWRfb3BlbmdsX2xvZ2dlcl93cml0ZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgIGNoYXIgYnVmW2tCdWZmZXJMZW5dID0ge307CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgT3BlbkdMTG9nZ2VyOjpnZXQoKS0+d3JpdGVDb2Fyc2UoYnVmKTsKK30KKwordm9pZCBhbmRyb2lkX29wZW5nbF9jeHRfbG9nZ2VyX3dyaXRlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgICAgY2hhciBidWZba0J1ZmZlckxlbl0gPSB7fTsKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBPcGVuR0xMb2dnZXI6OmdldCgpLT53cml0ZUZpbmVUaW1lc3RhbXBlZChidWYpOworfQorCit2b2lkIGFuZHJvaWRfc3RvcF9vcGVuZ2xfbG9nZ2VyKCkgeworICAgIE9wZW5HTExvZ2dlciogZ2xfbG9nID0gT3BlbkdMTG9nZ2VyOjpnZXQoKTsKKyAgICBnbF9sb2ctPnN0b3BGaW5lTG9nKCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2wvbG9nZ2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL2xvZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGQzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsL2xvZ2dlci5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBUaGUgcHVycG9zZSBvZiB0aGUgT3BlbkdMIGxvZ2dlciBpcyB0byBsb2cKKy8vIGluZm9ybWF0aW9uIGFib3V0IHN1Y2ggdGhpbmdzIGFzIEVHTCBpbml0aWFsaXphdGlvbgorLy8gYW5kIHBvc3NpYmx5IG1pc2NlbGxhbm91cyBPcGVuR0wgY29tbWFuZHMsCisvLyBpbiBvcmRlciB0byBnZXQgYSBiZXR0ZXIgaWRlYSBvZiB3aGF0IGlzIGdvaW5nIG9uCisvLyBpbiBjcmFzaCByZXBvcnRzLgorCisvLyBDIGludGVyZmFjZSBmb3IgYW5kcm9pZC1lbXVnbAordm9pZCBhbmRyb2lkX2luaXRfb3BlbmdsX2xvZ2dlcigpOwordm9pZCBhbmRyb2lkX29wZW5nbF9sb2dnZXJfd3JpdGUoY29uc3QgY2hhciogZm10LCAuLi4pOwordm9pZCBhbmRyb2lkX3N0b3Bfb3BlbmdsX2xvZ2dlcigpOworCisvLyBUaGlzIGlzIGZvciBsb2dnaW5nIHdoYXQgZ29lcyBvbiBpbiBpbmRpdmlkdWFsIE9wZW5HTAorLy8gY29udGV4dHMgKGN4dHMpLiBPbmx5IGNhbGxlZCB3aGVuIGVtdWdsIGlzIGNvbXBpbGVkCisvLyB3aXRoIC1ET1BFTkdMX0RFQlVHX1BSSU5UT1VULgordm9pZCBhbmRyb2lkX29wZW5nbF9jeHRfbG9nZ2VyX3dyaXRlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsZXMtcGlwZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbGVzLXBpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDA4YjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbGVzLXBpcGUuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gSW5pdGlhbGl6ZSB0aGUgJ29wZW5nbGVzJyBwaXBlIC0gdGhlIG9uZSB1c2VkIGZvciBHUFUgZW11bGF0aW9uIHByb3RvY29sCisvLyBiZXR3ZWVuIGd1ZXN0IGFuZCB0aGUgZW11Z2wgbGlicmFyeS4KKy8vIHxkdW1teUxvb3BlcnwgaXMgbm93IHVudXNlZCwgdGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcGF0Y2guCit2b2lkIGFuZHJvaWRfaW5pdF9vcGVuZ2xlc19waXBlKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9vcGVuZ2xlcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzE0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsZXMuY3BwCkBAIC0wLDAgKzEsMjgxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2xlcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsL2xvZ2dlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kbGwuaCIKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfZnVuY3Rpb25zLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIEQoLi4uKSAgVkVSQk9TRV9QUklOVChpbml0LF9fVkFfQVJHU19fKQorI2RlZmluZSBERCguLi4pIFZFUkJPU0VfUFJJTlQoZ2xlcyxfX1ZBX0FSR1NfXykKKworLyogTmFtZSBvZiB0aGUgR0xFUyByZW5kZXJpbmcgbGlicmFyeSB3ZSdyZSBnb2luZyB0byB1c2UgKi8KKyNpZiBVSU5UUFRSX01BWCA9PSBVSU5UMzJfTUFYCisjZGVmaW5lIFJFTkRFUkVSX0xJQl9OQU1FICAibGliT3BlbmdsUmVuZGVyIgorI2VsaWYgVUlOVFBUUl9NQVggPT0gVUlOVDY0X01BWAorI2RlZmluZSBSRU5ERVJFUl9MSUJfTkFNRSAgImxpYjY0T3BlbmdsUmVuZGVyIgorI2Vsc2UKKyNlcnJvciBVbmtub3duIFVJTlRQVFJfTUFYCisjZW5kaWYKKworLyogRGVjbGFyZWQgaW4gImFuZHJvaWQvZ2xvYmFscy5oIiAqLworaW50ICBhbmRyb2lkX2dsZXNfZmFzdF9waXBlcyA9IDE7CisKKy8vIERlZmluZSB0aGUgUmVuZGVyIEFQSSBmdW5jdGlvbiBwb2ludGVycy4KKyNkZWZpbmUgRlVOQ1RJT05fKHJldCwgbmFtZSwgc2lnLCBwYXJhbXMpIFwKKyAgICAgICAgc3RhdGljIHJldCAoKm5hbWUpIHNpZyA9IE5VTEw7CitMSVNUX1JFTkRFUl9BUElfRlVOQ1RJT05TKEZVTkNUSU9OXykKKyN1bmRlZiBGVU5DVElPTl8KKworLy8gRGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgYnkgbG9va2luZyB1cAorLy8gdGhlIHN5bWJvbHMgZnJvbSB0aGUgc2hhcmVkIGxpYnJhcnkuCitzdGF0aWMgaW50IGluaXRPcGVuZ2xlc0VtdWxhdGlvbkZ1bmNzKEFEeW5hbWljTGlicmFyeSogcmVuZGVyZXJMaWIpIHsKKyAgICB2b2lkKiAgc3ltYm9sOworICAgIGNoYXIqICBlcnJvcjsKKworI2RlZmluZSBGVU5DVElPTl8ocmV0LCBuYW1lLCBzaWcsIHBhcmFtcykgXAorICAgIHN5bWJvbCA9IGFkeW5hbWljTGlicmFyeV9maW5kU3ltYm9sKHJlbmRlcmVyTGliLCAjbmFtZSwgJmVycm9yKTsgXAorICAgIGlmIChzeW1ib2wgIT0gTlVMTCkgeyBcCisgICAgICAgIHVzaW5nIHR5cGUgPSByZXQoc2lnKTsgXAorICAgICAgICBuYW1lID0gKHR5cGUqKXN5bWJvbDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVycm9yKCJHTEVTIGVtdWxhdGlvbjogQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgc3ltYm9sICglcyk6ICVzIiwgI25hbWUsIGVycm9yKTsgXAorICAgICAgICBmcmVlKGVycm9yKTsgXAorICAgICAgICByZXR1cm4gLTE7IFwKKyAgICB9CisgICAgTElTVF9SRU5ERVJfQVBJX0ZVTkNUSU9OUyhGVU5DVElPTl8pCisjdW5kZWYgRlVOQ1RJT05fCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgc1JlbmRlcmVyVXNlc1N1YldpbmRvdzsKK3N0YXRpYyBlbXVnbDo6UmVuZGVyTGliUHRyIHNSZW5kZXJMaWIgPSBudWxscHRyOworc3RhdGljIGVtdWdsOjpSZW5kZXJlclB0ciBzUmVuZGVyZXIgPSBudWxscHRyOworCitpbnQgYW5kcm9pZF9pbml0T3BlbmdsZXNFbXVsYXRpb24oKSB7CisgICAgY2hhciogZXJyb3IgPSBOVUxMOworCisgICAgaWYgKHNSZW5kZXJMaWIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBEKCJJbml0aWFsaXppbmcgaGFyZHdhcmUgT3BlbkdMRVMgZW11bGF0aW9uIHN1cHBvcnQiKTsKKworICAgIEFEeW5hbWljTGlicmFyeSogY29uc3QgcmVuZGVyZXJTbyA9CisgICAgICAgICAgICBhZHluYW1pY0xpYnJhcnlfb3BlbihSRU5ERVJFUl9MSUJfTkFNRSwgJmVycm9yKTsKKyAgICBpZiAocmVuZGVyZXJTbyA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvcigiQ291bGQgbm90IGxvYWQgT3BlbkdMRVMgZW11bGF0aW9uIGxpYnJhcnkgWyVzXTogJXMiLAorICAgICAgICAgICAgICAgUkVOREVSRVJfTElCX05BTUUsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFJlc29sdmUgdGhlIGZ1bmN0aW9ucyAqLworICAgIGlmIChpbml0T3BlbmdsZXNFbXVsYXRpb25GdW5jcyhyZW5kZXJlclNvKSA8IDApIHsKKyAgICAgICAgZGVycm9yKCJPcGVuR0xFUyBlbXVsYXRpb24gbGlicmFyeSBtaXNtYXRjaC4gQmUgc3VyZSB0byB1c2UgdGhlIGNvcnJlY3QgdmVyc2lvbiEiKTsKKyAgICAgICAgZ290byBCQURfRVhJVDsKKyAgICB9CisKKyAgICBzUmVuZGVyTGliID0gaW5pdExpYnJhcnkoKTsKKyAgICBpZiAoIXNSZW5kZXJMaWIpIHsKKyAgICAgICAgZGVycm9yKCJPcGVuR0xFUyBpbml0aWFsaXphdGlvbiBmYWlsZWQhIik7CisgICAgICAgIGdvdG8gQkFEX0VYSVQ7CisgICAgfQorCisgICAgc1JlbmRlcmVyVXNlc1N1YldpbmRvdyA9IHRydWU7CisgICAgaWYgKGNvbnN0IGNoYXIqIGVudiA9IGdldGVudigiQU5EUk9JRF9HTF9TT0ZUV0FSRV9SRU5ERVJFUiIpKSB7CisgICAgICAgIGlmIChlbnZbMF0gIT0gJ1wwJyAmJiBlbnZbMF0gIT0gJzAnKSB7CisgICAgICAgICAgICBzUmVuZGVyZXJVc2VzU3ViV2luZG93ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworQkFEX0VYSVQ6CisgICAgZGVycm9yKCJPcGVuR0xFUyBlbXVsYXRpb24gbGlicmFyeSBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQhIik7CisgICAgYWR5bmFtaWNMaWJyYXJ5X2Nsb3NlKHJlbmRlcmVyU28pOworICAgIHJldHVybiAtMTsKK30KKworaW50CithbmRyb2lkX3N0YXJ0T3BlbmdsZXNSZW5kZXJlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBndWVzdEFwaUxldmVsKQoreworICAgIGlmICghc1JlbmRlckxpYikgeworICAgICAgICBEKCJDYW4ndCBzdGFydCBPcGVuR0xFUyByZW5kZXJlciB3aXRob3V0IHN1cHBvcnQgbGlicmFyaWVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoc1JlbmRlcmVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFuZHJvaWRfaW5pdF9vcGVuZ2xfbG9nZ2VyKCk7CisKKyAgICBzUmVuZGVyTGliLT5zZXRBcGlMZXZlbChndWVzdEFwaUxldmVsKTsKKyAgICBzUmVuZGVyTGliLT5zZXRDcmFzaFJlcG9ydGVyKCZjcmFzaGhhbmRsZXJfZGllX2Zvcm1hdCk7CisgICAgc1JlbmRlckxpYi0+c2V0RmVhdHVyZUNvbnRyb2xsZXIoJmFuZHJvaWQ6OmZlYXR1cmVjb250cm9sOjppc0VuYWJsZWQpOworICAgIHNSZW5kZXJMaWItPnNldFN5bmNEZXZpY2UoZ29sZGZpc2hfc3luY19jcmVhdGVfdGltZWxpbmUsCisgICAgICAgICAgICBnb2xkZmlzaF9zeW5jX2NyZWF0ZV9mZW5jZSwKKyAgICAgICAgICAgIGdvbGRmaXNoX3N5bmNfdGltZWxpbmVfaW5jLAorICAgICAgICAgICAgZ29sZGZpc2hfc3luY19kZXN0cm95X3RpbWVsaW5lLAorICAgICAgICAgICAgZ29sZGZpc2hfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXQsCisgICAgICAgICAgICBnb2xkZmlzaF9zeW5jX2RldmljZV9leGlzdHMpOworCisgICAgZW11Z2xfbG9nZ2VyX3N0cnVjdCBsb2dmdW5jczsKKyAgICBsb2dmdW5jcy5jb2Fyc2UgPSBhbmRyb2lkX29wZW5nbF9sb2dnZXJfd3JpdGU7CisgICAgbG9nZnVuY3MuZmluZSA9IGFuZHJvaWRfb3BlbmdsX2N4dF9sb2dnZXJfd3JpdGU7CisgICAgc1JlbmRlckxpYi0+c2V0TG9nZ2VyKGxvZ2Z1bmNzKTsKKworICAgIHNSZW5kZXJlciA9IHNSZW5kZXJMaWItPmluaXRSZW5kZXJlcih3aWR0aCwgaGVpZ2h0LCBzUmVuZGVyZXJVc2VzU3ViV2luZG93KTsKKyAgICBpZiAoIXNSZW5kZXJlcikgeworICAgICAgICBEKCJDYW4ndCBzdGFydCBPcGVuR0xFUyByZW5kZXJlcj8iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorYW5kcm9pZF9zZXRQb3N0Q2FsbGJhY2soT25Qb3N0RnVuYyBvblBvc3QsIHZvaWQqIG9uUG9zdENvbnRleHQpCit7CisgICAgaWYgKHNSZW5kZXJlcikgeworICAgICAgICBzUmVuZGVyZXItPnNldFBvc3RDYWxsYmFjayhvblBvc3QsIG9uUG9zdENvbnRleHQpOworICAgIH0KK30KKworc3RhdGljIGNoYXIqIHN0cmR1cEJhc2VTdHJpbmcoY29uc3QgY2hhciogc3JjKSB7CisgICAgY29uc3QgY2hhciogYmVnaW4gPSBzdHJjaHIoc3JjLCAnKCcpOworICAgIGlmICghYmVnaW4pIHsKKyAgICAgICAgcmV0dXJuIHN0cmR1cChzcmMpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIqIGVuZCA9IHN0cnJjaHIoYmVnaW4gKyAxLCAnKScpOworICAgIGlmICghZW5kKSB7CisgICAgICAgIHJldHVybiBzdHJkdXAoc3JjKTsKKyAgICB9CisKKyAgICAvLyBzcmMgaXMgb2YgdGhlIGZvcm06CisgICAgLy8gImZvbyAoYmFyenp6enp6enp6eikiCisgICAgLy8gICAgICAgXiAgICAgICAgICAgIF4KKyAgICAvLyAgICAgICAoYisxKSAgICAgICAgZQorICAgIC8vICAgICA9IDUgICAgICAgICAgICAxOAorICAgIGludCBsZW47CisgICAgYmVnaW4gKz0gMTsKKyAgICBsZW4gPSBlbmQgLSBiZWdpbjsKKworICAgIGNoYXIqIHJlc3VsdDsKKyAgICByZXN1bHQgPSAoY2hhciopbWFsbG9jKGxlbiArIDEpOworICAgIG1lbWNweShyZXN1bHQsIGJlZ2luLCBsZW4pOworICAgIHJlc3VsdFtsZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIGFuZHJvaWRfZ2V0T3BlbmdsZXNIYXJkd2FyZVN0cmluZ3MoY2hhcioqIHZlbmRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqIHZlcnNpb24pIHsKKyAgICBhc3NlcnQodmVuZG9yICE9IE5VTEwgJiYgcmVuZGVyZXIgIT0gTlVMTCAmJiB2ZXJzaW9uICE9IE5VTEwpOworICAgIGFzc2VydCgqdmVuZG9yID09IE5VTEwgJiYgKnJlbmRlcmVyID09IE5VTEwgJiYgKnZlcnNpb24gPT0gTlVMTCk7CisgICAgaWYgKCFzUmVuZGVyZXIpIHsKKyAgICAgICAgRCgiQ2FuJ3QgZ2V0IE9wZW5HTCBFUyBoYXJkd2FyZSBzdHJpbmdzIHdoZW4gcmVuZGVyZXIgbm90IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGVtdWdsOjpSZW5kZXJlcjo6SGFyZHdhcmVTdHJpbmdzIHN0cmluZ3MgPQorICAgICAgICAgICAgc1JlbmRlcmVyLT5nZXRIYXJkd2FyZVN0cmluZ3MoKTsKKyAgICBEKCJPcGVuR0wgVmVuZG9yPVslc10iLCBzdHJpbmdzLnZlbmRvci5jX3N0cigpKTsKKyAgICBEKCJPcGVuR0wgUmVuZGVyZXI9WyVzXSIsIHN0cmluZ3MucmVuZGVyZXIuY19zdHIoKSk7CisgICAgRCgiT3BlbkdMIFZlcnNpb249WyVzXSIsIHN0cmluZ3MudmVyc2lvbi5jX3N0cigpKTsKKworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGRlZmF1bHQgRVMgdG8gR0wgdHJhbnNsYXRvcnM6IGV4dHJhY3QgdGhlIHN0cmluZ3MKKyAgICAgKiBvZiB0aGUgdW5kZXJseWluZyBPcGVuR0wgaW1wbGVtZW50YXRpb24uICovCisgICAgaWYgKHN0cm5jbXAoc3RyaW5ncy52ZW5kb3IuY19zdHIoKSwgIkdvb2dsZSIsIDYpID09IDAgJiYKKyAgICAgICAgICAgIHN0cm5jbXAoc3RyaW5ncy5yZW5kZXJlci5jX3N0cigpLCAiQW5kcm9pZCBFbXVsYXRvciBPcGVuR0wgRVMgVHJhbnNsYXRvciIsIDM3KSA9PSAwKSB7CisgICAgICAgICp2ZW5kb3IgPSBzdHJkdXBCYXNlU3RyaW5nKHN0cmluZ3MudmVuZG9yLmNfc3RyKCkpOworICAgICAgICAqcmVuZGVyZXIgPSBzdHJkdXBCYXNlU3RyaW5nKHN0cmluZ3MucmVuZGVyZXIuY19zdHIoKSk7CisgICAgICAgICp2ZXJzaW9uID0gc3RyZHVwQmFzZVN0cmluZyhzdHJpbmdzLnZlcnNpb24uY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnZlbmRvciA9IHN0cmR1cChzdHJpbmdzLnZlbmRvci5jX3N0cigpKTsKKyAgICAgICAgKnJlbmRlcmVyID0gc3RyZHVwKHN0cmluZ3MucmVuZGVyZXIuY19zdHIoKSk7CisgICAgICAgICp2ZXJzaW9uID0gc3RyZHVwKHN0cmluZ3MudmVyc2lvbi5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQKK2FuZHJvaWRfc3RvcE9wZW5nbGVzUmVuZGVyZXIodm9pZCkKK3sKKyAgICBpZiAoc1JlbmRlcmVyKSB7CisgICAgICAgIHNSZW5kZXJlci0+c3RvcCgpOworICAgICAgICBzUmVuZGVyZXIucmVzZXQoKTsKKyAgICAgICAgYW5kcm9pZF9zdG9wX29wZW5nbF9sb2dnZXIoKTsKKyAgICB9Cit9CisKK2ludAorYW5kcm9pZF9zaG93T3BlbmdsZXNXaW5kb3codm9pZCogd2luZG93LCBpbnQgd3gsIGludCB3eSwgaW50IHd3LCBpbnQgd2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJ3LCBpbnQgZmJoLCBmbG9hdCBkcHIsIGZsb2F0IHJvdGF0aW9uKQoreworICAgIGlmICghc1JlbmRlcmVyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRkJOYXRpdmVXaW5kb3dUeXBlIHdpbiA9IChGQk5hdGl2ZVdpbmRvd1R5cGUpKHVpbnRwdHJfdCl3aW5kb3c7CisgICAgYm9vbCBzdWNjZXNzID0gc1JlbmRlcmVyLT5zaG93T3BlbkdMU3Vid2luZG93KAorICAgICAgICAgICAgd2luLCB3eCwgd3ksIHd3LCB3aCwgZmJ3LCBmYmgsIGRwciwgcm90YXRpb24pOworICAgIHJldHVybiBzdWNjZXNzID8gMCA6IC0xOworfQorCit2b2lkCithbmRyb2lkX3NldE9wZW5nbGVzVHJhbnNsYXRpb24oZmxvYXQgcHgsIGZsb2F0IHB5KQoreworICAgIGlmIChzUmVuZGVyZXIpIHsKKyAgICAgICAgc1JlbmRlcmVyLT5zZXRPcGVuR0xEaXNwbGF5VHJhbnNsYXRpb24ocHgsIHB5KTsKKyAgICB9Cit9CisKK2ludAorYW5kcm9pZF9oaWRlT3BlbmdsZXNXaW5kb3codm9pZCkKK3sKKyAgICBpZiAoIXNSZW5kZXJlcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IHNSZW5kZXJlci0+ZGVzdHJveU9wZW5HTFN1YndpbmRvdygpOworICAgIHJldHVybiBzdWNjZXNzID8gMCA6IC0xOworfQorCit2b2lkCithbmRyb2lkX3JlZHJhd09wZW5nbGVzV2luZG93KHZvaWQpCit7CisgICAgaWYgKHNSZW5kZXJlcikgeworICAgICAgICBzUmVuZGVyZXItPnJlcGFpbnRPcGVuR0xEaXNwbGF5KCk7CisgICAgfQorfQorCitjb25zdCBlbXVnbDo6UmVuZGVyZXJQdHImIGFuZHJvaWRfZ2V0T3BlbmdsZXNSZW5kZXJlcigpCit7CisgICAgcmV0dXJuIHNSZW5kZXJlcjsKK30KKwordm9pZCBhbmRyb2lkX2NsZWFudXBQcm9jR0xPYmplY3RzKHVpbnQ2NF90IHB1aWQpIHsKKyAgICBpZiAoc1JlbmRlcmVyKSB7CisgICAgICAgIHNSZW5kZXJlci0+Y2xlYW51cFByb2NHTE9iamVjdHMocHVpZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbmdsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU0MDRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5nbGVzLmgKQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlcmVyLmgiCisjZW5kaWYKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIG9wZW5nbGVzIGVtdWxhdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhYm9ydCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QKKyAqIGxpYnJhcmllcyB0aHJvdWdoIGRsb3BlbigpIG9yIGVxdWl2YWxlbnQuCisgKi8KK2ludCBhbmRyb2lkX2luaXRPcGVuZ2xlc0VtdWxhdGlvbih2b2lkKTsKKworLyogVHJpZXMgdG8gc3RhcnQgdGhlIHJlbmRlcmVyIHByb2Nlc3MuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAqIEF0IHRoZSBtb21lbnQsIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgVk0gc3RhcnRzLiBUaGUgb25Qb3N0IGNhbGxiYWNrCisgKiBtYXkgYmUgTlVMTC4KKyAqCisgKiB3aWR0aCBhbmQgaGVpZ2h0OiB0aGUgZnJhbWVidWZmZXIgZGltZW5zaW9ucyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQKKyAqICAgICAgICAgICAgICAgICAgIHRvIHRoZSBndWVzdCBkaXNwbGF5IGRyaXZlci4KKyAqIGd1ZXN0QXBpTGV2ZWw6IEFQSSBsZXZlbCBvZiBndWVzdCBpbWFnZSAoMjMgZm9yIG1uYywgMjQgZm9yIG55YywgZXRjKQorICovCitpbnQgYW5kcm9pZF9zdGFydE9wZW5nbGVzUmVuZGVyZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZ3Vlc3RBcGlMZXZlbCk7CisKKy8qIFNlZSB0aGUgZGVzY3JpcHRpb24gaW4gcmVuZGVyX2FwaS5oLiAqLwordHlwZWRlZiB2b2lkICgqT25Qb3N0RnVuYykodm9pZCogY29udGV4dCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyKiBwaXhlbHMpOwordm9pZCBhbmRyb2lkX3NldFBvc3RDYWxsYmFjayhPblBvc3RGdW5jIG9uUG9zdCwgdm9pZCogb25Qb3N0Q29udGV4dCk7CisKKy8qIFJldHJpZXZlIHRoZSBWZW5kb3IvUmVuZGVyZXIvVmVyc2lvbiBzdHJpbmdzIGRlc2NyaWJpbmcgdGhlIHVuZGVybHlpbmcgR0wKKyAqIGltcGxlbWVudGF0aW9uLiBUaGUgY2FsbCBvbmx5IHdvcmtzIHdoaWxlIHRoZSByZW5kZXJlciBpcyBzdGFydGVkLgorICoKKyAqIEV4cGVjdHMgfCp2ZW5kb3J8LCB8KnJlbmRlcmVyfCBhbmQgfCp2ZXJzaW9ufCB0byBiZSBOVUxMLgorICoKKyAqIE9uIGV4aXQsIHNldHMgfCp2ZW5kb3J8LCB8KnJlbmRlcmVyfCBhbmQgfCp2ZXJzaW9ufCB0byBwb2ludCB0byBuZXcKKyAqIGhlYXAtYWxsb2NhdGVkIHN0cmluZ3MgKHRoYXQgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyKSB3aGljaCByZXByZXNlbnQgdGhlCisgKiBPcGVuR0wgaGFyZHdhcmUgdmVuZG9yIG5hbWUsIGRyaXZlciBuYW1lIGFuZCB2ZXJzaW9uLCByZXNwZWN0aXZlbHkuCisgKiBJbiBjYXNlIG9mIGVycm9yLCB8KnZlbmRvcnwgZXRjLiBhcmUgc2V0IHRvIE5VTEwuCisgKi8KK3ZvaWQgYW5kcm9pZF9nZXRPcGVuZ2xlc0hhcmR3YXJlU3RyaW5ncyhjaGFyKiogdmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiByZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogdmVyc2lvbik7CisKK2ludCBhbmRyb2lkX3Nob3dPcGVuZ2xlc1dpbmRvdyh2b2lkKiB3aW5kb3csIGludCB3eCwgaW50IHd5LCBpbnQgd3csIGludCB3aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJ3LCBpbnQgZmJoLCBmbG9hdCBkcHIsIGZsb2F0IHJvdGF0aW9uKTsKKworaW50IGFuZHJvaWRfaGlkZU9wZW5nbGVzV2luZG93KHZvaWQpOworCit2b2lkIGFuZHJvaWRfc2V0T3BlbmdsZXNUcmFuc2xhdGlvbihmbG9hdCBweCwgZmxvYXQgcHkpOworCit2b2lkIGFuZHJvaWRfcmVkcmF3T3BlbmdsZXNXaW5kb3codm9pZCk7CisKKy8qIFN0b3AgdGhlIHJlbmRlcmVyIHByb2Nlc3MgKi8KK3ZvaWQgYW5kcm9pZF9zdG9wT3BlbmdsZXNSZW5kZXJlcih2b2lkKTsKKworLyogc2V0IHRvIFRSVUUgaWYgeW91IHdhbnQgdG8gdXNlIGZhc3QgR0xFUyBwaXBlcywgMCBpZiB5b3Ugd2FudCB0bworICogZmFsbGJhY2sgdG8gbG9jYWwgVENQIG9uZXMKKyAqLworZXh0ZXJuIGludCAgYW5kcm9pZF9nbGVzX2Zhc3RfcGlwZXM7CisKK3ZvaWQgYW5kcm9pZF9jbGVhbnVwUHJvY0dMT2JqZWN0cyh1aW50NjRfdCBwdWlkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitjb25zdCBlbXVnbDo6UmVuZGVyZXJQdHImIGFuZHJvaWRfZ2V0T3BlbmdsZXNSZW5kZXJlcigpOworI2VuZGlmCisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbnNzbC1zdXBwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA1NTNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5jcHAKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpMb2NrOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGhyZWFkOworCit1bnNpZ25lZCBzTnVtTG9ja3MgPSAwOworTG9jayogc09wZW5Tc2xMb2NrcyA9IG51bGxwdHI7CisKK3N0YXRpYyB2b2lkIGxvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCBuLCAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUpIHsKKyAgICBhc3NlcnQobiA+PSAwICYmICh1bnNpZ25lZCluIDwgc051bUxvY2tzKTsKKyAgICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7CisgICAgICAgIHNPcGVuU3NsTG9ja3Nbbl0ubG9jaygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNPcGVuU3NsTG9ja3Nbbl0udW5sb2NrKCk7CisgICAgfQorfQorCitib29sIGFuZHJvaWRfb3BlbnNzbF9pbml0KCkgeworICAgIHNOdW1Mb2NrcyA9IENSWVBUT19udW1fbG9ja3MoKTsKKyAgICBkZWxldGVbXSBzT3BlblNzbExvY2tzOworICAgIHNPcGVuU3NsTG9ja3MgPSBuZXcgTG9ja1tzTnVtTG9ja3NdOworICAgIGlmICghc09wZW5Tc2xMb2NrcykgeworICAgICAgICBzTnVtTG9ja3MgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tpbmdfY2FsbGJhY2spOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGFuZHJvaWRfb3BlbnNzbF9maW5pc2goKSB7CisgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKG51bGxwdHIpOworCisgICAgZGVsZXRlW10gc09wZW5Tc2xMb2NrczsKKyAgICBzT3BlblNzbExvY2tzID0gbnVsbHB0cjsKKyAgICBzTnVtTG9ja3MgPSAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL29wZW5zc2wtc3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjdiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvb3BlbnNzbC1zdXBwb3J0LmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBTZXR1cCBjYWxsYmFja3MgZm9yIHRocmVhZCBsb2NraW5nIHJlcXVpcmVkIGJ5IE9wZW5TU0wuCisvLyBZb3UgbXVzdCBjYWxsIGFuZHJvaWRfb3BlbnNzbF9pbml0IGJlZm9yZSBjcmVhdGluZyB0aHJlYWRzLCBhbmQKKy8vIGFuZHJvaWRfb3BlbnNzbF9maW5pc2ggYXQgdGhlIGVuZCBvZiB0aGUgcHJvY2Vzcywgd2hlbiBhbGwgdGhyZWFkcyAoZXhjZXB0CisvLyB0aGUgbWFpbiB0aHJlYWQpIGhhdmUgZGllZC4KK2V4dGVybiBib29sIGFuZHJvaWRfb3BlbnNzbF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYW5kcm9pZF9vcGVuc3NsX2ZpbmlzaCh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJvY2Vzc19zZXR1cC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJvY2Vzc19zZXR1cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NDA2NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm9jZXNzX3NldHVwLmNwcApAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvcHJvY2Vzc19zZXR1cC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jdXJsLXN1cHBvcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlbG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3OwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCisvLyBUaGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaGVyZSBjYW4gYmUgdmVyeSBmaW5pY2t5LiBIYW5kbGUgd2l0aCBjYXJlLCBhbmQKKy8vIGxlYXZlIGhpbnRzIGFib3V0IGFueSBvcmRlcmluZyBjb25zdHJhaW50cyB2aWEgY29tbWVudHMuCit2b2lkIHByb2Nlc3NfZWFybHlfc2V0dXAoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgZmlyc3QgdGhpbmcgZW11bGF0b3IgY2FsbHMgLSBzbyBpdCdzIHRoZSBiZXN0IHBsYWNlCisgICAgLy8gdG8gd2FpdCBmb3IgYSBkZWJ1Z2dlciB0byBhdHRhY2gsIGJlZm9yZSBldmVuIHRoZSBvcHRpb25zIHBhcnNpbmcgY29kZS4KKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcgd2FpdEZvckRlYnVnZ2VyQXJnID0gIi13YWl0LWZvci1kZWJ1Z2dlciI7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgaWYgKHdhaXRGb3JEZWJ1Z2dlckFyZyA9PSBhcmd2W2ldKSB7CisgICAgICAgICAgICBkcHJpbnQoIldhaXRpbmcgZm9yIGEgZGVidWdnZXIuLi4iKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OldhaXRGb3JEZWJ1Z2dlcigpOworICAgICAgICAgICAgZHByaW50KCJEZWJ1Z2dlciBoYXMgYXR0YWNoZWQsIHJlc3VtaW5nIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgc29ja2V0cyBmaXJzdCBzbyBjdXJsL2NyYXNoIHByb2Nlc3NvciBjYW4gdXNlIHNvY2tldHMuCisgICAgLy8gRG9lcyBub3QgY3JlYXRlIGFueSB0aHJlYWRzLgorICAgIGFuZHJvaWRfc29ja2V0X2luaXQoKTsKKworICAgIGZpbGVsb2NrX2luaXQoKTsKKworICAgIC8vIENhdGNoIGNyYXNoZXMgaW4gZXZlcnl0aGluZy4KKyAgICAvLyBUaGlzIHByb21pc2VzIHRvIG5vdCBsYXVuY2ggYW55IHRocmVhZHMuLi4KKyAgICBpZiAoY3Jhc2hoYW5kbGVyX2luaXQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSAiPT09PT0gQ29tbWFuZC1saW5lIGFyZ3VtZW50cyA9PT09PVxuIjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cyArPSBhcmd2W2ldOworICAgICAgICAgICAgYXJndW1lbnRzICs9ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBhcmd1bWVudHMgKz0gIlxuPT09PT0gRW52aXJvbm1lbnQgPT09PT1cbiI7CisgICAgICAgIGNvbnN0IGF1dG8gYWxsRW52ID0gU3lzdGVtOjpnZXQoKS0+ZW52R2V0QWxsKCk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcmIGVudiA6IGFsbEVudikgeworICAgICAgICAgICAgYXJndW1lbnRzICs9IGVudjsKKyAgICAgICAgICAgIGFyZ3VtZW50cyArPSAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgYW5kcm9pZDo6Y3Jhc2hyZXBvcnQ6OkNyYXNoUmVwb3J0ZXI6OmdldCgpLT5hdHRhY2hEYXRhKAorICAgICAgICAgICAgICAgICAgICAiY29tbWFuZC1saW5lLWFuZC1lbnZpcm9ubWVudC50eHQiLCBhcmd1bWVudHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQ3Jhc2ggaGFuZGxpbmcgbm90IGluaXRpYWxpemVkIjsKKyAgICB9CisKKyAgICAvLyBsaWJjdXJsIGluaXRpYWxpemF0aW9uIGlzIHRocmVhZC11bnNhZmUsIHNvIGxldCdzIGNhbGwgaXQgZmlyc3QKKyAgICAvLyB0byBtYWtlIHN1cmUgbm8gb3RoZXIgdGhyZWFkIGNvdWxkIGJlIGRvaW5nIHRoZSBzYW1lCisgICAgc3RkOjpzdHJpbmcgbGF1bmNoZXJEaXIgPSBTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpOworICAgIHN0ZDo6c3RyaW5nIGNhQnVuZGxlRmlsZSA9CisgICAgICAgICAgICBQYXRoVXRpbHM6OmpvaW4obGF1bmNoZXJEaXIsICJsaWIiLCAiY2EtYnVuZGxlLnBlbSIpOworICAgIGlmICghU3lzdGVtOjpnZXQoKS0+cGF0aENhblJlYWQoY2FCdW5kbGVGaWxlKSkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkNhbiBub3QgcmVhZCBjYS1idW5kbGUuIEN1cmwgaW5pdCBza2lwcGVkLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3VybF9pbml0KGNhQnVuZGxlRmlsZS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgcHJvY2Vzc19sYXRlX3RlYXJkb3duKCkgeworICAgIGN1cmxfY2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb2Nlc3Nfc2V0dXAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm9jZXNzX3NldHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5OTE3MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm9jZXNzX3NldHVwLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBMZXQncyBzdGFydCBvZmYgb3VyIHByb2Nlc3MgaW4gc3R5bGUuCisvLyAtIFRoaXMgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gaGFwcGVuIGJlZm9yZSBhbnkgdGhyZWFkcyBhcmUgbGF1bmNoZWQ7CisvLyAtIEFmdGVyIHRoaXMgaW5pdGlhbGl6YXRpb24sIGFueSBjcmFzaGVzIHdpbGwgYmUgcmVwb3J0ZWQgKGlmIGVuYWJsZWQpLgordm9pZCBwcm9jZXNzX2Vhcmx5X3NldHVwKGludCBhcmdjLCBjaGFyKiogYXJndik7CisKK3ZvaWQgcHJvY2Vzc19sYXRlX3RlYXJkb3duKCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMjJjMTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJvdG9idWYvRGVsaW1pdGVkU2VyaWFsaXphdGlvbi5jcHAKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uaCIKKworI2luY2x1ZGUgImdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcHJvdG9idWYgeworCitib29sIHdyaXRlT25lRGVsaW1pdGVkKGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dCkgeworICAgIC8vIFdlIGNyZWF0ZSBhIG5ldyBjb2RlZCBzdHJlYW0gZm9yIGVhY2ggbWVzc2FnZS4gVGhpcyBpcyBmYXN0LgorICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQob3V0KTsKKworICAgIC8vIFdyaXRlIHRoZSBzaXplLgorICAgIGNvbnN0IGludCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZSgpOworICAgIG91dHB1dC5Xcml0ZVZhcmludDMyKHNpemUpOworCisgICAgdWludDhfdCogYnVmZmVyID0gb3V0cHV0LkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAvLyBPcHRpbWl6YXRpb246IFRoZSBtZXNzYWdlIGZpdHMgaW4gb25lIGJ1ZmZlciwgc28gdXNlIHRoZSBmYXN0ZXIKKyAgICAgICAgLy8gZGlyZWN0LXRvLWFycmF5IHNlcmlhbGl6YXRpb24gcGF0aC4KKyAgICAgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2xpZ2h0bHktc2xvd2VyIHBhdGggd2hlbiB0aGUgbWVzc2FnZSBpcyBtdWx0aXBsZSBidWZmZXJzLgorICAgICAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICAgICAgaWYgKG91dHB1dC5IYWRFcnJvcigpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByZWFkT25lRGVsaW1pdGVkKGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbikgeworICAgIC8vIFdlIGNyZWF0ZSBhIG5ldyBjb2RlZCBzdHJlYW0gZm9yIGVhY2ggbWVzc2FnZS4gVGhpcyBpcyBmYXN0LAorICAgIC8vIGFuZCBpdCBtYWtlcyBzdXJlIHRoZSA2NE1CIHRvdGFsIHNpemUgbGltaXQgaXMgaW1wb3NlZCBwZXItbWVzc2FnZSByYXRoZXIKKyAgICAvLyB0aGFuIG9uIHRoZSB3aG9sZSBzdHJlYW0gKFNlZSB0aGUgQ29kZWRJbnB1dFN0cmVhbSBpbnRlcmZhY2UgZm9yIG1vcmUKKyAgICAvLyBpbmZvIG9uIHRoaXMgbGltaXQpLgorICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KGluKTsKKworICAgIC8vIFJlYWQgdGhlIHNpemUuCisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICBpZiAoIWlucHV0LlJlYWRWYXJpbnQzMigmc2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRlbGwgdGhlIHN0cmVhbSBub3QgdG8gcmVhZCBiZXlvbmQgdGhhdCBzaXplLgorICAgIGNvbnN0IGF1dG8gbGltaXQgPSBpbnB1dC5QdXNoTGltaXQoc2l6ZSk7CisKKyAgICAvLyBQYXJzZSB0aGUgbWVzc2FnZS4KKyAgICBpZiAoIW1lc3NhZ2UtPk1lcmdlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBSZWxlYXNlIHRoZSBsaW1pdC4KKyAgICBpbnB1dC5Qb3BMaW1pdChsaW1pdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3RvYnVmL0RlbGltaXRlZFNlcmlhbGl6YXRpb24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm90b2J1Zi9EZWxpbWl0ZWRTZXJpYWxpemF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMTkwMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm90b2J1Zi9EZWxpbWl0ZWRTZXJpYWxpemF0aW9uLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oIgorI2luY2x1ZGUgImdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBtZXRob2RzIGZvciBzZXJpYWxpemF0aW9uIG9mIHByb3RvYnVmIG1lc3NhZ2VzIGluIHRoZSBzYW1lCisvLyB3YXkgYXMgSmF2YSdzIHdyaXRlRGVsaW1pdGVkVG8oKS9wYXJzZURlbGltaXRlZEZyb20oKS4KKy8vCisKK2Jvb2wgd3JpdGVPbmVEZWxpbWl0ZWQoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0KTsKKworYm9vbCByZWFkT25lRGVsaW1pdGVkKGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmY4MTRjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L1Byb3h5VXRpbHMuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0Rucy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHByb3h5IHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6SXBBZGRyZXNzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6RG5zOworCitQYXJzZVJlc3VsdCBwYXJzZUNvbmZpZ3VyYXRpb25TdHJpbmcoYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBzdHIpIHsKKyAgICBQYXJzZVJlc3VsdCByZXN1bHR7fTsKKworICAgIGNvbnN0IGNoYXIqIHBvcyA9IHN0ci5iZWdpbigpOworICAgIGNvbnN0IGNoYXIqIGVuZCA9IHN0ci5lbmQoKTsKKworICAgIC8vIFNraXAgb3B0aW9uYWwgaHR0cDovLyBwcmVmaXguCisgICAgc3RhdGljIGNvbnN0ZXhwciBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGtIdHRwUHJlZml4ID0gImh0dHA6Ly8iOworICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGVuZCAtIHBvcykgPj0ga0h0dHBQcmVmaXguc2l6ZSgpICYmCisgICAgICAgICFtZW1jbXAocG9zLCBrSHR0cFByZWZpeC5jX3N0cigpLCBrSHR0cFByZWZpeC5zaXplKCkpKSB7CisgICAgICAgIHBvcyArPSBrSHR0cFByZWZpeC5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrLgorICAgIGlmIChwb3MgPj0gZW5kKSB7CisgICAgICAgIHJlc3VsdC5tRXJyb3IgPSAiRW1wdHkgcHJveHkgY29uZmlndXJhdGlvbiBzdHJpbmciOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIElzIHRoZXJlIGEgdXNlcm5hbWU6cGFzc3dvcmQgcGFpcj8KKyAgICBjb25zdCBjaGFyKiBzZXAgPSBzdGQ6OmZpbmQocG9zLCBlbmQsICdAJyk7CisgICAgaWYgKHNlcCA8IGVuZCkgeworICAgICAgICBjb25zdCBhdXRvIHNlcDIgPSBzdGQ6OmZpbmQocG9zLCBzZXAsICc6Jyk7CisgICAgICAgIGlmIChzZXAyID09IHNlcCkgeworICAgICAgICAgICAgcmVzdWx0Lm1FcnJvciA9CisgICAgICAgICAgICAgICAgICAgICJCYWQgZm9ybWF0OiBtaXNzaW5nIGNvbG9uIGJldHdlZW4gdXNlcm5hbWUgIgorICAgICAgICAgICAgICAgICAgICAiYW5kIHBhc3N3b3JkIjsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQubVVzZXJuYW1lID0gc3RkOjpzdHJpbmcocG9zLCBzZXAyKTsKKyAgICAgICAgcmVzdWx0Lm1QYXNzd29yZCA9IHN0ZDo6c3RyaW5nKHNlcDIgKyAxLCBzZXApOworCisgICAgICAgIHBvcyA9IHNlcCArIDE7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgcHJveHkgbmFtZS4gSXQgY2FuIGNvbnRhaW4gY29sb25zIChlLmcuIElQdjYpIGlmIGl0IGlzCisgICAgLy8gd3JhcHBlZCB3aXRoIGJyYWNlcy4KKyAgICBjb25zdCBjaGFyKiBwcm94eSA9IHBvczsKKyAgICBjb25zdCBjaGFyKiBwcm94eUVuZCA9IG51bGxwdHI7CisgICAgaWYgKHBvcyA8IGVuZCAmJiBwb3NbMF0gPT0gJ1snKSB7CisgICAgICAgIHNlcCA9IHN0ZDo6ZmluZChwb3MgKyAxLCBlbmQsICddJyk7CisgICAgICAgIGlmIChzZXAgPT0gZW5kKSB7CisgICAgICAgICAgICByZXN1bHQubUVycm9yID0gIkJhZCBmb3JtYXQ6IG1pc3NpbmcgY2xvc2luZyBicmFja2V0IjsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcHJveHkgPSBwb3MgKyAxOworICAgICAgICBwcm94eUVuZCA9IHNlcDsKKyAgICAgICAgc2VwKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VwID0gc3RkOjpmaW5kKHBvcywgZW5kLCAnOicpOworICAgICAgICBwcm94eUVuZCA9IHNlcDsKKyAgICB9CisgICAgaWYgKHNlcCA9PSBlbmQgfHwgc2VwWzBdICE9ICc6JyB8fCBzZXAgKyAxID09IGVuZCkgeworICAgICAgICByZXN1bHQubUVycm9yID0gIkJhZCBmb3JtYXQ6IG1pc3NpbmcgY29sb24gYmV0d2VlbiBwcm94eSBhbmQgcG9ydCI7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcHJveHlOYW1lKHByb3h5LCBwcm94eUVuZCk7CisgICAgRG5zOjpBZGRyZXNzTGlzdCBsaXN0ID0gRG5zOjpyZXNvbHZlTmFtZShwcm94eU5hbWUpOworICAgIGlmIChsaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0Lm1FcnJvciA9ICJCYWQgZm9ybWF0OiBpbnZhbGlkIHByb3h5IG5hbWUiOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXN1bHQubVNlcnZlckFkZHJlc3MgPSBsaXN0WzBdOworCisgICAgLy8gVGhlbiBleHRyYWN0IHBvcnQgbnVtYmVyLgorICAgIGVycm5vID0gMDsKKyAgICBjaGFyKiBwb3J0RW5kID0gbnVsbHB0cjsKKyAgICBsb25nIHBvcnQgPSBzdHJ0b2woc2VwICsgMSwgJnBvcnRFbmQsIDEwKTsKKyAgICBpZiAoZXJybm8gfHwgcG9ydEVuZCAhPSBjb25zdF9jYXN0PGNoYXIqPihlbmQpKSB7CisgICAgICAgIHJlc3VsdC5tRXJyb3IgPSAiQmFkIGZvcm1hdDogaW52YWxpZCBwb3J0IG51bWJlciAobXVzdCBiZSBkZWNpbWFsKSI7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmIChwb3J0IDwgMCB8fCBwb3J0ID4gNjU1MzUpIHsKKyAgICAgICAgcmVzdWx0Lm1FcnJvciA9CisgICAgICAgICAgICAgICAgIkJhZCBmb3JtYXQ6IGludmFsaWQgcG9ydCBudW1iZXIgIgorICAgICAgICAgICAgICAgICIobXVzdCBiZSBpbiAwLi42NTUzNSByYW5nZSkiOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXN1bHQubVNlcnZlclBvcnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBvcnQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwcm94eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvUHJveHlVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTJkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvUHJveHlVdGlscy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHByb3h5IHsKKworLy8gQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYSBwcm94eSBjb25maWd1cmF0aW9uCisvLyBzdHJpbmcuIHxtU2VydmVyQWRkcmVzc3wgaXMgdGhlIHByb3h5IHNlcnZlcidzIElQIGFkZHJlc3MsIHxtVXNlcm5hbWV8CisvLyBhbmQgfG1QYXNzd29yZHwgYXJlIG9wdGlvbmFsIGF1dGhlbnRpY2F0aW9uIHVzZXJuYW1lL3Bhc3N3b3Jkcy4gSW4gY2FzZQorLy8gb2YgZXJyb3IgZHVyaW5nIHBhcnNpbmcsIHxtRXJyb3J8IHdpbGwgY29udGFpbiBhIHVzZXItZnJpZW5kbHkgZXJyb3IKKy8vIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuCitzdHJ1Y3QgUGFyc2VSZXN1bHQgeworICAgIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBtRXJyb3I7CisgICAgYW5kcm9pZDo6YmFzZTo6SXBBZGRyZXNzIG1TZXJ2ZXJBZGRyZXNzOworICAgIGludCBtU2VydmVyUG9ydDsKKyAgICBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gbVVzZXJuYW1lOworICAgIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBtUGFzc3dvcmQ7Cit9OworCisvLyBQYXJzZSBhIGdpdmVuIHByb3h5IGNvbmZpZ3VyYXRpb24gc3RyaW5nLiB8c3RyfCBpcyBhIHN0cmluZyBpbiBvbmUgb2YgdGhlCisvLyBmb2xsb3dpbmcgZm9ybWF0czoKKy8vICAgICBbaHR0cDovL11bPHVzZXJuYW1lPjo8cGFzc3dvcmQ+QF08aG9zdG5hbWU+Ojxwb3J0PgorLy8gICAgIFtodHRwOi8vXVs8dXNlcm5hbWU+OjxwYXNzd29yZD5AXVxbPGhvc3RuYW1lPlxdOjxwb3J0PgorLy8KKy8vIFdoaWNoIG1lYW5zIHRoYXQgPGhvc3RuYW1lPiBjYW4gYmUgd3JhcHBlZCBhcm91bmQgYnJhY2tldHMsIHdoaWNoIGlzIHVzZWZ1bAorLy8gd2hlbiBpdCBjb250YWlucyBjb2xvbnMgKGUuZy4gSVB2NiBhZGRyZXNzZXMgc3VjaCBhcyAnWzo6MV0nKSwgc2luY2UgdGhlCisvLyBjb2xvbiBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gdGhlIGhvc3RuYW1lIGFuZCB0aGUgcG9ydC4KKy8vCisvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIFBhcnNlUmVzdWx0IGluc3RhbmNlLCB0aGUgY2FsbGVyIHNob3VsZCBmaXJzdCBjaGVjaworLy8gaXRzIHxtRXJyb3J8IGZpZWxkLCBpZiBpdCBpcyBjb25zdHJ1Y3RlZCwgYW4gZXJyb3Igb2NjdXJlZCwgb3RoZXJ3aXNlIHRoZQorLy8gcmVzdCBvZiB0aGUgc3RydWN0dXJlIGlzIHZhbGlkIGFuZCBjYW4gYmUgdXNlZC4KKy8vCisvLyBOT1RFOiBUaGlzIGRvZXNuJ3Qgc3VwcG9ydCBhIDx1c2VybmFtZT4gb3IgPHBhc3N3b3JkPiB0aGF0IGNvbnRhaW4gYSBAIG9yIDoKK1BhcnNlUmVzdWx0IHBhcnNlQ29uZmlndXJhdGlvblN0cmluZyhhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IHN0cik7CisKK30gIC8vIG5hbWVzcGFjZSBwcm94eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODAxMjNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L1Byb3h5VXRpbHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9Qcm94eVV0aWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdERuc1Jlc29sdmVyLmgiCisKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcHJveHkgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpJcEFkZHJlc3M7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3REbnNSZXNvbHZlcjsKKworVEVTVChQcm94eVV0aWxzLCBwYXJzZUNvbmZpZ3VyYXRpb25TdHJpbmcpIHsKKyAgICBUZXN0RG5zUmVzb2x2ZXIgcmVzb2x2ZXI7CisgICAgcmVzb2x2ZXIuYWRkRW50cnkoInByb3h5LmV4YW1wbGUuY29tIiwgIjEwLjAuMC40MiIpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0lwdjZMb29wYmFja1tdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDF9OworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIElwQWRkcmVzcyBzZXJ2ZXJBZGRyZXNzOworICAgICAgICAgICAgaW50IHNlcnZlclBvcnQ7CisgICAgICAgICAgICBPcHRpb25hbDxzdGQ6OnN0cmluZz4gdXNlck5hbWU7CisgICAgICAgICAgICBPcHRpb25hbDxzdGQ6OnN0cmluZz4gcGFzc3dvcmQ7CisgICAgICAgIH0gZXhwZWN0ZWQ7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICAgICAgeyIxMjcuMC4wLjE6ODA4MCIsIHtJcEFkZHJlc3MoMHg3ZjAwMDAwMVUpLCA4MDgwLCB7fSwge319fSwKKyAgICAgICAgICAgIHsiaHR0cDovLzEyNy4wLjAuMTo4MDgwIiwge0lwQWRkcmVzcygweDdmMDAwMDAxVSksIDgwODAsIHt9LCB7fX19LAorICAgICAgICAgICAgeyJ1c2VyOnBhc3NAMTkyLjE2OC4wLjE4OjMxMjgiLAorICAgICAgICAgICAgIHtJcEFkZHJlc3MoMHhjMGE4MDAxMlUpLCAzMTI4LCBPcHRpb25hbDxzdGQ6OnN0cmluZz4oInVzZXIiKSwKKyAgICAgICAgICAgICAgT3B0aW9uYWw8c3RkOjpzdHJpbmc+KCJwYXNzIil9fSwKKyAgICAgICAgICAgIHsiWzo6MV06NzAwMCIsIHtJcEFkZHJlc3Moa0lwdjZMb29wYmFjayksIDcwMDAsIHt9LCB7fX19LAorICAgICAgICAgICAgeyJwcm94eS5leGFtcGxlLmNvbTozMDAwIiwgSXBBZGRyZXNzKDB4MGEwMDAwMmEpLCAzMDAwLCB7fSwge319LAorICAgIH07CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDoga0RhdGEpIHsKKyAgICAgICAgUGFyc2VSZXN1bHQgcmVzdWx0ID0gcGFyc2VDb25maWd1cmF0aW9uU3RyaW5nKGl0ZW0uaW5wdXQpOworICAgICAgICBFWFBFQ1RfRkFMU0UocmVzdWx0Lm1FcnJvcik7CisgICAgICAgIGlmIChyZXN1bHQubUVycm9yKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIFsiIDw8ICpyZXN1bHQubUVycm9yCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdIGZvciBpbnB1dCBbIiA8PCBpdGVtLmlucHV0IDw8ICJdIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEVYUEVDVF9FUShpdGVtLmV4cGVjdGVkLnNlcnZlckFkZHJlc3MsIHJlc3VsdC5tU2VydmVyQWRkcmVzcykKKyAgICAgICAgICAgICAgICA8PCAiRm9yIGlucHV0IFsiIDw8IGl0ZW0uaW5wdXQgPDwgIl0iOworICAgICAgICBFWFBFQ1RfRVEoaXRlbS5leHBlY3RlZC5zZXJ2ZXJQb3J0LCByZXN1bHQubVNlcnZlclBvcnQpCisgICAgICAgICAgICAgICAgPDwgIkZvciBpbnB1dCBbIiA8PCBpdGVtLmlucHV0IDw8ICJdIjsKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0uZXhwZWN0ZWQudXNlck5hbWUsIHJlc3VsdC5tVXNlcm5hbWUpCisgICAgICAgICAgICAgICAgPDwgIkZvciBpbnB1dCBbIiA8PCBpdGVtLmlucHV0IDw8ICJdIjsKKyAgICAgICAgRVhQRUNUX0VRKGl0ZW0uZXhwZWN0ZWQucGFzc3dvcmQsIHJlc3VsdC5tUGFzc3dvcmQpCisgICAgICAgICAgICAgICAgPDwgIkZvciBpbnB1dCBbIiA8PCBpdGVtLmlucHV0IDw8ICJdIjsKKyAgICB9Cit9CisKK1RFU1QoUHJveHlVdGlscywgcGFyc2VDb25maWd1cmF0aW9uU3RyaW5nV2l0aEVycm9ycykgeworICAgIFRlc3REbnNSZXNvbHZlciByZXNvbHZlcjsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRFcnJvcjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgICB7Imh0dHA6Ly8iLCAiRW1wdHkgcHJveHkgY29uZmlndXJhdGlvbiBzdHJpbmcifSwKKyAgICAgICAgICAgIHsiIiwgIkVtcHR5IHByb3h5IGNvbmZpZ3VyYXRpb24gc3RyaW5nIn0sCisgICAgICAgICAgICB7bnVsbHB0ciwgIkVtcHR5IHByb3h5IGNvbmZpZ3VyYXRpb24gc3RyaW5nIn0sCisgICAgICAgICAgICB7IjI1Ni4wLjAuMTo4MDgwIiwgIkJhZCBmb3JtYXQ6IGludmFsaWQgcHJveHkgbmFtZSJ9LAorICAgICAgICAgICAgeyIxMjcuMC4wLjE6Zm9vIiwKKyAgICAgICAgICAgICAiQmFkIGZvcm1hdDogaW52YWxpZCBwb3J0IG51bWJlciAobXVzdCBiZSBkZWNpbWFsKSJ9LAorICAgICAgICAgICAgeyIxMjcuMC4wLjE6LTIiLAorICAgICAgICAgICAgICJCYWQgZm9ybWF0OiBpbnZhbGlkIHBvcnQgbnVtYmVyIChtdXN0IGJlIGluIDAuLjY1NTM1IHJhbmdlKSJ9LAorICAgICAgICAgICAgeyIxMjcuMC4wLjE6MTAwMDAwIiwKKyAgICAgICAgICAgICAiQmFkIGZvcm1hdDogaW52YWxpZCBwb3J0IG51bWJlciAobXVzdCBiZSBpbiAwLi42NTUzNSByYW5nZSkifSwKKyAgICAgICAgICAgIHsiMTI3LjAuMC4xIiwgIkJhZCBmb3JtYXQ6IG1pc3NpbmcgY29sb24gYmV0d2VlbiBwcm94eSBhbmQgcG9ydCJ9LAorICAgICAgICAgICAgeyJodHRwOjEyNy4wLjAuMTo4MDgwIiwgIkJhZCBmb3JtYXQ6IGludmFsaWQgcHJveHkgbmFtZSJ9LAorICAgICAgICAgICAgeyI6OjE6ODA4MCIsICJCYWQgZm9ybWF0OiBpbnZhbGlkIHByb3h5IG5hbWUifSwKKyAgICAgICAgICAgIHsidXNlckBwYXNzOjEyNy4wLjAuMTo4MDgwIiwKKyAgICAgICAgICAgICAiQmFkIGZvcm1hdDogbWlzc2luZyBjb2xvbiBiZXR3ZWVuIHVzZXJuYW1lIGFuZCBwYXNzd29yZCJ9LAorICAgICAgICAgICAgeyJ1c2VyQDEyNy4wLjAuMTo4MDgwIiwKKyAgICAgICAgICAgICAiQmFkIGZvcm1hdDogbWlzc2luZyBjb2xvbiBiZXR3ZWVuIHVzZXJuYW1lIGFuZCBwYXNzd29yZCJ9LAorICAgICAgICAgICAgeyJwcm94eS5leGFtcGxlLmNvbTo3MDAwIiwgIkJhZCBmb3JtYXQ6IGludmFsaWQgcHJveHkgbmFtZSJ9LAorICAgICAgICAgICAgeyJbOjoxfTo3MDAwIiwgIkJhZCBmb3JtYXQ6IG1pc3NpbmcgY2xvc2luZyBicmFja2V0In0sCisgICAgfTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBrRGF0YSkgeworICAgICAgICBQYXJzZVJlc3VsdCByZXN1bHQgPSBwYXJzZUNvbmZpZ3VyYXRpb25TdHJpbmcoaXRlbS5pbnB1dCk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlc3VsdC5tRXJyb3IpIDw8ICJGb3IgaW5wdXQgWyIgPDwgaXRlbS5pbnB1dCA8PCAiXSI7CisgICAgICAgIGlmICghcmVzdWx0Lm1FcnJvcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgRVhQRUNUX1NUUkVRKGl0ZW0uZXhwZWN0ZWRFcnJvciwgcmVzdWx0Lm1FcnJvci0+Y19zdHIoKSkKKyAgICAgICAgICAgICAgICA8PCAiRm9yIGlucHV0IFsiIDw8IGl0ZW0uaW5wdXQgPDwgIl0iOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHByb3h5Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTUzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uLmMKQEAgLTAsMCArMSw0OTkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X2ludC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9pb2xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludCAgcHJveHlfbG9nID0gMDsKKwordm9pZAorcHJveHlfTE9HKGNvbnN0IGNoYXIqICBmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0ICBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3ZvaWQKK3Byb3h5X3NldF92ZXJib3NlKGludCAgbW9kZSkKK3sKKyAgICBwcm94eV9sb2cgPSBtb2RlOworfQorCisvKiogR2xvYmFsIGNvbm5lY3Rpb24gbGlzdAorICoqLworCitzdGF0aWMgUHJveHlDb25uZWN0aW9uICBzX2Nvbm5lY3Rpb25zWzFdOworCisjZGVmaW5lICBNQVhfSEVYX0RVTVAgIDUxMgorCitzdGF0aWMgdm9pZAoraGV4X2R1bXAoIHZvaWQqICAgYmFzZSwgaW50ICBzaXplLCBjb25zdCBjaGFyKiAgcHJlZml4ICkKK3sKKyAgICBTVFJBTExPQ19ERUZJTkUocyk7CisgICAgaWYgKHNpemUgPiBNQVhfSEVYX0RVTVApCisgICAgICAgIHNpemUgPSBNQVhfSEVYX0RVTVA7CisgICAgc3RyYWxsb2NfYWRkX2hleGR1bXAocywgYmFzZSwgc2l6ZSwgcHJlZml4KTsKKyAgICBwcm94eV9MT0coICIlcyIsIHN0cmFsbG9jX2NzdHIocykgKTsKKyAgICBzdHJhbGxvY19yZXNldChzKTsKK30KKwordm9pZAorcHJveHlfY29ubmVjdGlvbl9pbml0KCBQcm94eUNvbm5lY3Rpb24qICAgICAgICAgICBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzKiAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIFByb3h5U2VydmljZSogICAgICAgICAgICAgIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIExvb3BJb0Z1bmMgICAgICAgICAgICAgICAgIGNvbm5faW8sCisgICAgICAgICAgICAgICAgICAgICAgIFByb3h5Q29ubmVjdGlvbkZyZWVGdW5jICAgIGNvbm5fZnJlZSApCit7CisgICAgY29ubi0+aW8gICAgICAgID0gbG9vcElvX25ldyhsb29wZXJfZ2V0Rm9yVGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubik7CisgICAgY29ubi0+YWRkcmVzcyAgID0gYWRkcmVzc1swXTsKKyAgICBjb25uLT5zZXJ2aWNlICAgPSBzZXJ2aWNlOworICAgIGNvbm4tPm5leHQgICAgICA9IE5VTEw7CisgICAgY29ubi0+Y29ubl9mcmVlID0gY29ubl9mcmVlOworCisgICAgc29ja2V0X3NldF9ub25ibG9jayhzb2NrZXQpOworCisgICAgeworICAgICAgICBTb2NrZXRUeXBlICB0eXBlID0gc29ja2V0X2dldF90eXBlKHNvY2tldCk7CisKKyAgICAgICAgc25wcmludGYoIGNvbm4tPm5hbWUsIHNpemVvZihjb25uLT5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICIlczolcyglZCkiLAorICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gU09DS0VUX1NUUkVBTSkgPyAidGNwIiA6ICJ1ZHAiLAorICAgICAgICAgICAgICAgICAgc29ja19hZGRyZXNzX3RvX3N0cmluZyhhZGRyZXNzKSwgc29ja2V0ICk7CisKKyAgICAgICAgLyoganVzdCBpbiBjYXNlICovCisgICAgICAgIGNvbm4tPm5hbWVbc2l6ZW9mKGNvbm4tPm5hbWUpLTFdID0gMDsKKyAgICB9CisKKyAgICBzdHJhbGxvY19yZXNldChjb25uLT5zdHIpOworICAgIGNvbm4tPnN0cl9wb3MgPSAwOworfQorCit2b2lkCitwcm94eV9jb25uZWN0aW9uX2RvbmUoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4gKQoreworICAgIHN0cmFsbG9jX3Jlc2V0KCBjb25uLT5zdHIgKTsKKyAgICBpZiAoY29ubi0+aW8pIHsKKyAgICAgICAgaW50IHNvY2tldCA9IGxvb3BJb19mZChjb25uLT5pbyk7CisgICAgICAgIGxvb3BJb19mcmVlKGNvbm4tPmlvKTsKKyAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2tldCk7CisgICAgICAgIGNvbm4tPmlvID0gTlVMTDsKKyAgICB9Cit9CisKKwordm9pZAorcHJveHlfY29ubmVjdGlvbl9yZXdpbmQoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4gKQoreworICAgIHN0cmFsbG9jX3QqICBzdHIgPSBjb25uLT5zdHI7CisKKyAgICAvKiBvbmx5IGtlZXAgYSBzbWFsbCBidWZmZXIgaW4gdGhlIGhlYXAgKi8KKyAgICBjb25uLT5zdHJfcG9zID0gMDsKKyAgICBzdHItPm4gICAgICAgID0gMDsKKyAgICBpZiAoc3RyLT5hID4gMTAyNCkKKyAgICAgICAgc3RyYWxsb2NfcmVzZXQoc3RyKTsKK30KKworRGF0YVN0YXR1cworcHJveHlfY29ubmVjdGlvbl9zZW5kKCBQcm94eUNvbm5lY3Rpb24qICBjb25uLCBpbnQgIGZkICkKK3sKKyAgICBzdHJhbGxvY190KiAgc3RyICAgID0gY29ubi0+c3RyOworICAgIGludCAgICAgICAgICBhdmFpbCAgPSBzdHItPm4gLSBjb25uLT5zdHJfcG9zOworCisgICAgY29ubi0+c3RyX3NlbnQgPSAwOworCisgICAgaWYgKGF2YWlsIDw9IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKHByb3h5X2xvZykgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBzZW5kaW5nICVkIGJ5dGVzOiIsIGNvbm4tPm5hbWUsIGF2YWlsICk7CisgICAgICAgIGhleF9kdW1wKCBzdHItPnMgKyBjb25uLT5zdHJfcG9zLCBhdmFpbCwgIj4+ICIgKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgIGludCAgbiA9IHNvY2tldF9zZW5kKGZkLCBzdHItPnMgKyBjb25uLT5zdHJfcG9zLCBhdmFpbCk7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciAoc2VuZCkiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbm4tPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIERBVEFfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKQorICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX05FRURfTU9SRTsKKworICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogZXJyb3I6ICVzIiwgY29ubi0+bmFtZSwgZXJybm9fc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBEQVRBX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbm4tPnN0cl9wb3MgICs9IG47CisgICAgICAgIGNvbm4tPnN0cl9zZW50ICs9IG47CisgICAgICAgIGF2YWlsICAgICAgICAgIC09IG47CisgICAgfQorCisgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQoY29ubik7CisgICAgcmV0dXJuIERBVEFfQ09NUExFVEVEOworfQorCisKK0RhdGFTdGF0dXMKK3Byb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZSggUHJveHlDb25uZWN0aW9uKiAgY29ubiwgaW50ICBmZCwgaW50ICB3YW50ZWQgKQoreworICAgIHN0cmFsbG9jX3QqICBzdHIgICAgPSBjb25uLT5zdHI7CisKKyAgICBjb25uLT5zdHJfcmVjdiA9IDA7CisKKyAgICB3aGlsZSAod2FudGVkID4gMCkgeworICAgICAgICBpbnQgIG47CisKKyAgICAgICAgc3RyYWxsb2NfcmVhZHlwbHVzKCBzdHIsIHdhbnRlZCApOworICAgICAgICBuID0gc29ja2V0X3JlY3YoZmQsIHN0ci0+cyArIHN0ci0+biwgd2FudGVkKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogY29ubmVjdGlvbiByZXNldCBieSBwZWVyIChyZWNlaXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgY29ubi0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pCisgICAgICAgICAgICAgICAgcmV0dXJuIERBVEFfTkVFRF9NT1JFOworCisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBlcnJvcjogJXMiLCBjb25uLT5uYW1lLCBlcnJub19zdHIpOworICAgICAgICAgICAgcmV0dXJuIERBVEFfRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJveHlfbG9nKSB7CisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZWNlaXZlZCAlZCBieXRlczoiLCBjb25uLT5uYW1lLCBuICk7CisgICAgICAgICAgICBoZXhfZHVtcCggc3RyLT5zICsgc3RyLT5uLCBuLCAiPDwgIiApOworICAgICAgICB9CisKKyAgICAgICAgc3RyLT5uICAgICAgICAgKz0gbjsKKyAgICAgICAgd2FudGVkICAgICAgICAgLT0gbjsKKyAgICAgICAgY29ubi0+c3RyX3JlY3YgKz0gbjsKKyAgICB9CisgICAgcmV0dXJuIERBVEFfQ09NUExFVEVEOworfQorCisKK0RhdGFTdGF0dXMKK3Byb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZV9saW5lKCBQcm94eUNvbm5lY3Rpb24qICBjb25uLCBpbnQgIGZkICkKK3sKKyAgICBzdHJhbGxvY190KiAgc3RyID0gY29ubi0+c3RyOworCisgICAgZm9yICg7OykgeworICAgICAgICBjaGFyICBjOworICAgICAgICBpbnQgICBuID0gc29ja2V0X3JlY3YoZmQsICZjLCAxKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogZGlzY29ubmVjdGVkIGZyb20gc2VydmVyIiwgY29ubi0+bmFtZSApOworICAgICAgICAgICAgcmV0dXJuIERBVEFfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogYmxvY2tlZCIsIGNvbm4tPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX05FRURfTU9SRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGVycm9yOiAlcyIsIGNvbm4tPm5hbWUsIGVycm5vX3N0cik7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmFsbG9jX2FkZF9jKHN0ciwgYyk7CisgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgIHN0ci0+c1stLXN0ci0+bl0gPSAwOworICAgICAgICAgICAgaWYgKHN0ci0+biA+IDAgJiYgc3RyLT5zW3N0ci0+bi0xXSA9PSAnXHInKQorICAgICAgICAgICAgICAgIHN0ci0+c1stLXN0ci0+bl0gPSAwOworCisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZWNlaXZlZCAnJXMnIiwgY29ubi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9ieXRlcyhzdHItPnMsIHN0ci0+bikpOworICAgICAgICAgICAgcmV0dXJuIERBVEFfQ09NUExFVEVEOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcHJveHlfY29ubmVjdGlvbl9pbnNlcnQoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4sIFByb3h5Q29ubmVjdGlvbiogIGFmdGVyICkKK3sKKyAgICBjb25uLT5uZXh0ICAgICAgICA9IGFmdGVyLT5uZXh0OworICAgIGFmdGVyLT5uZXh0LT5wcmV2ID0gY29ubjsKKyAgICBhZnRlci0+bmV4dCAgICAgICA9IGNvbm47CisgICAgY29ubi0+cHJldiAgICAgICAgPSBhZnRlcjsKK30KKworc3RhdGljIHZvaWQKK3Byb3h5X2Nvbm5lY3Rpb25fcmVtb3ZlKCBQcm94eUNvbm5lY3Rpb24qICBjb25uICkKK3sKKyAgICBjb25uLT5wcmV2LT5uZXh0ID0gY29ubi0+bmV4dDsKKyAgICBjb25uLT5uZXh0LT5wcmV2ID0gY29ubi0+cHJldjsKKworICAgIGNvbm4tPm5leHQgPSBjb25uLT5wcmV2ID0gY29ubjsKK30KKworLyoqIEdsb2JhbCBzZXJ2aWNlIGxpc3QKKyAqKi8KKworI2RlZmluZSAgTUFYX1NFUlZJQ0VTICA0CisKK3N0YXRpYyAgUHJveHlTZXJ2aWNlKiAgc19zZXJ2aWNlc1sgTUFYX1NFUlZJQ0VTIF07CitzdGF0aWMgIGludCAgICAgICAgICAgIHNfbnVtX3NlcnZpY2VzOworc3RhdGljICBpbnQgICAgICAgICAgICBzX2luaXQ7CisKK3N0YXRpYyB2b2lkICBwcm94eV9tYW5hZ2VyX2F0ZXhpdCggdm9pZCApOworCitzdGF0aWMgdm9pZAorcHJveHlfbWFuYWdlcl9pbml0KHZvaWQpCit7CisgICAgc19pbml0ID0gMTsKKyAgICBzX2Nvbm5lY3Rpb25zLT5uZXh0ID0gc19jb25uZWN0aW9uczsKKyAgICBzX2Nvbm5lY3Rpb25zLT5wcmV2ID0gc19jb25uZWN0aW9uczsKKyAgICBhdGV4aXQoIHByb3h5X21hbmFnZXJfYXRleGl0ICk7Cit9CisKKworZXh0ZXJuIGludAorcHJveHlfbWFuYWdlcl9hZGRfc2VydmljZSggUHJveHlTZXJ2aWNlKiAgc2VydmljZSApCit7CisgICAgaWYgKCFzZXJ2aWNlIHx8IHNfbnVtX3NlcnZpY2VzID49IE1BWF9TRVJWSUNFUykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFzX2luaXQpCisgICAgICAgIHByb3h5X21hbmFnZXJfaW5pdCgpOworCisgICAgc19zZXJ2aWNlc1tzX251bV9zZXJ2aWNlcysrXSA9IHNlcnZpY2U7CisgICAgcmV0dXJuIDA7Cit9CisKKworZXh0ZXJuIHZvaWQKK3Byb3h5X21hbmFnZXJfYXRleGl0KCB2b2lkICkKK3sKKyAgICBQcm94eUNvbm5lY3Rpb24qICBjb25uID0gc19jb25uZWN0aW9ucy0+bmV4dDsKKyAgICBpbnQgICAgICAgICAgICAgICBuOworCisgICAgLyogZnJlZSBhbGwgcHJveHkgY29ubmVjdGlvbnMgKi8KKyAgICB3aGlsZSAoY29ubiAhPSBzX2Nvbm5lY3Rpb25zKSB7CisgICAgICAgIFByb3h5Q29ubmVjdGlvbiogIG5leHQgPSBjb25uLT5uZXh0OworICAgICAgICBjb25uLT5jb25uX2ZyZWUoIGNvbm4gKTsKKyAgICAgICAgY29ubiA9IG5leHQ7CisgICAgfQorICAgIGNvbm4tPm5leHQgPSBjb25uOworICAgIGNvbm4tPnByZXYgPSBjb25uOworCisgICAgLyogZnJlZSBhbGwgcHJveHkgc2VydmljZXMgKi8KKyAgICBmb3IgKG4gPSBzX251bV9zZXJ2aWNlczsgbi0tID4gMDspIHsKKyAgICAgICAgUHJveHlTZXJ2aWNlKiAgc2VydmljZSA9IHNfc2VydmljZXNbbl07CisgICAgICAgIHNlcnZpY2UtPnNlcnZfZnJlZSggc2VydmljZS0+b3BhcXVlICk7CisgICAgfQorICAgIHNfbnVtX3NlcnZpY2VzID0gMDsKK30KKworCit2b2lkCitwcm94eV9jb25uZWN0aW9uX2ZyZWUoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGtlZXBfYWxpdmUsCisgICAgICAgICAgICAgICAgICAgICAgIFByb3h5RXZlbnQgICAgICAgIGV2ZW50ICkKK3sKKyAgICBpZiAoIWNvbm4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3h5X2Nvbm5lY3Rpb25fcmVtb3ZlKGNvbm4pOworCisgICAgaWYgKGV2ZW50ICE9IFBST1hZX0VWRU5UX05PTkUgJiYgY29ubi0+aW8pIHsKKyAgICAgICAgY29ubi0+ZXZfZnVuYyggY29ubi0+ZXZfb3BhcXVlLCBsb29wSW9fZmQoY29ubi0+aW8pLCBldmVudCApOworICAgIH0KKworICAgIGlmIChjb25uLT5pbykgeworICAgICAgICBpbnQgZmQgPSBsb29wSW9fZmQoY29ubi0+aW8pOworICAgICAgICBsb29wSW9fZnJlZShjb25uLT5pbyk7CisgICAgICAgIGNvbm4tPmlvID0gTlVMTDsKKyAgICAgICAgaWYgKCFrZWVwX2FsaXZlKSB7CisgICAgICAgICAgICBzb2NrZXRfY2xvc2UoZmQpOworICAgICAgICB9CisgICAgfQorCisgICAgY29ubi0+Y29ubl9mcmVlKGNvbm4pOworfQorCisKK2ludAorcHJveHlfbWFuYWdlcl9hZGQoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBTb2NrZXRUeXBlICAgICAgICAgIHNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICBQcm94eUV2ZW50RnVuYyAgICAgIGV2X2Z1bmMsCisgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICBldl9vcGFxdWUgKQoreworICAgIGludCAgbjsKKworICAgIGlmICghc19pbml0KSB7CisgICAgICAgIHByb3h5X21hbmFnZXJfaW5pdCgpOworICAgIH0KKworICAgIGZvciAobiA9IDA7IG4gPCBzX251bV9zZXJ2aWNlczsgbisrKSB7CisgICAgICAgIFByb3h5U2VydmljZSogICAgIHNlcnZpY2UgPSBzX3NlcnZpY2VzW25dOworICAgICAgICBQcm94eUNvbm5lY3Rpb24qICBjb25uICAgID0gc2VydmljZS0+c2Vydl9jb25uZWN0KCBzZXJ2aWNlLT5vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyApOworICAgICAgICBpZiAoY29ubiAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25uLT5ldl9mdW5jICAgPSBldl9mdW5jOworICAgICAgICAgICAgY29ubi0+ZXZfb3BhcXVlID0gZXZfb3BhcXVlOworICAgICAgICAgICAgcHJveHlfY29ubmVjdGlvbl9pbnNlcnQoY29ubiwgc19jb25uZWN0aW9ucy0+cHJldik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworLyogcmVtb3ZlIGFuIG9uLWdvaW5nIHByb3hpZmllZCBzb2NrZXQgY29ubmVjdGlvbiBmcm9tIHRoZSBtYW5hZ2VyJ3MgbGlzdC4KKyAqIHRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiB0aGUgc29ja2V0IGNvbm5lY3Rpb24gbXVzdCBiZSBjYW5jZWxlZCBiZWZvcmUKKyAqIHRoZSBjb25uZWN0aW9uIGFjY2VwdC9yZWZ1c2FsIG9jY3VyZWQKKyAqLwordm9pZAorcHJveHlfbWFuYWdlcl9kZWwoIHZvaWQqICBldl9vcGFxdWUgKQoreworICAgIFByb3h5Q29ubmVjdGlvbiogIGNvbm4gPSBzX2Nvbm5lY3Rpb25zLT5uZXh0OworICAgIGZvciAoIDsgY29ubiAhPSBzX2Nvbm5lY3Rpb25zOyBjb25uID0gY29ubi0+bmV4dCApIHsKKyAgICAgICAgaWYgKGNvbm4tPmV2X29wYXF1ZSA9PSBldl9vcGFxdWUpIHsKKyAgICAgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fcmVtb3ZlKGNvbm4pOworICAgICAgICAgICAgY29ubi0+Y29ubl9mcmVlKGNvbm4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgcHJveHlfYmFzZTY0X2VuY29kZShjb25zdCBjaGFyKiBzcmN4LCBpbnQgc3JjbGVuLCBjaGFyKiBkc3QsIGludCBkc3RsZW4pIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMgPSAoY29uc3QgdW5zaWduZWQgY2hhciopc3JjeDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBjYjY0WzY0XT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjZW5kID0gc3JjICsgc3JjbGVuOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgd2hpbGUgKHNyYyszIDw9IHNyY2VuZCAmJiByZXN1bHQrNCA8PSBkc3RsZW4pCisgICAgeworICAgICAgICBkc3RbcmVzdWx0KzBdID0gY2I2NFsgc3JjWzBdID4+IDIgXTsKKyAgICAgICAgZHN0W3Jlc3VsdCsxXSA9IGNiNjRbICgoc3JjWzBdICYgMykgPDwgNCkgfCAoKHNyY1sxXSAmIDB4ZjApID4+IDQpIF07CisgICAgICAgIGRzdFtyZXN1bHQrMl0gPSBjYjY0WyAoKHNyY1sxXSAmIDB4ZikgPDwgMikgfCAoKHNyY1syXSAmIDB4YzApID4+IDYpIF07CisgICAgICAgIGRzdFtyZXN1bHQrM10gPSBjYjY0WyBzcmNbMl0gJiAweDNmIF07CisgICAgICAgIHNyYyAgICArPSAzOworICAgICAgICByZXN1bHQgKz0gNDsKKyAgICB9CisKKyAgICBpZiAoc3JjIDwgc3JjZW5kKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgIGluWzRdOworCisgICAgICAgIGlmIChyZXN1bHQrNCA+IGRzdGxlbikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpblswXSA9IHNyY1swXTsKKyAgICAgICAgaW5bMV0gPSBzcmMrMSA8IHNyY2VuZCA/IHNyY1sxXSA6IDA7CisgICAgICAgIGluWzJdID0gc3JjKzIgPCBzcmNlbmQgPyBzcmNbMl0gOiAwOworCisgICAgICAgIGRzdFtyZXN1bHQrMF0gPSBjYjY0WyBpblswXSA+PiAyIF07CisgICAgICAgIGRzdFtyZXN1bHQrMV0gPSBjYjY0WyAoKGluWzBdICYgMykgPDwgNCkgfCAoKGluWzFdICYgMHhmMCkgPj4gNCkgXTsKKyAgICAgICAgZHN0W3Jlc3VsdCsyXSA9ICh1bnNpZ25lZCBjaGFyKSAoc3JjKzEgPCBzcmNlbmQgPyBjYjY0WyAoKGluWzFdICYgMHhmKSA8PCAyKSB8ICgoaW5bMl0gJiAweGMwKSA+PiA2KSBdIDogJz0nKTsKKyAgICAgICAgZHN0W3Jlc3VsdCszXSA9ICh1bnNpZ25lZCBjaGFyKSAoc3JjKzIgPCBzcmNlbmQgPyBjYjY0WyBpblsyXSAmIDB4M2YgXSA6ICc9Jyk7CisgICAgICAgIHJlc3VsdCArPSA0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3Byb3h5X3Jlc29sdmVfc2VydmVyKCBTb2NrQWRkcmVzcyogICBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIHNlcnZlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgc2VydmVybmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBzZXJ2ZXJwb3J0ICkKK3sKKyAgICBjaGFyICBuYW1lMFs2NF0sICpuYW1lID0gbmFtZTA7CisgICAgaW50ICAgcmVzdWx0ID0gLTE7CisKKyAgICBpZiAoc2VydmVybmFtZWxlbiA8IDApCisgICAgICAgIHNlcnZlcm5hbWVsZW4gPSBzdHJsZW4oc2VydmVybmFtZSk7CisKKyAgICBpZiAoc2VydmVybmFtZWxlbiA+PSAoaW50KXNpemVvZihuYW1lMCkpIHsKKyAgICAgICAgQUFSUkFZX05FVyhuYW1lLCBzZXJ2ZXJuYW1lbGVuKzEpOworICAgIH0KKworICAgIG1lbWNweShuYW1lLCBzZXJ2ZXJuYW1lLCBzZXJ2ZXJuYW1lbGVuKTsKKyAgICBuYW1lW3NlcnZlcm5hbWVsZW5dID0gMDsKKworICAgIGlmIChzb2NrX2FkZHJlc3NfaW5pdF9yZXNvbHZlKCBhZGRyLCBuYW1lLCBzZXJ2ZXJwb3J0LCAwICkgPCAwKSB7CisgICAgICAgIFBST1hZX0xPRygiJXM6IGNhbid0IHJlc29sdmUgcHJveHkgc2VydmVyIG5hbWUgJyVzJyIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgUFJPWFlfTE9HKCJzZXJ2ZXIgbmFtZSAnJXMnIHJlc29sdmVkIHRvICVzIiwgbmFtZSwgc29ja19hZGRyZXNzX3RvX3N0cmluZyhhZGRyKSk7CisgICAgcmVzdWx0ID0gMDsKKworRXhpdDoKKyAgICBpZiAobmFtZSAhPSBuYW1lMCkKKyAgICAgICAgQUZSRUUobmFtZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2ludAorcHJveHlfY2hlY2tfY29ubmVjdGlvbiggY29uc3QgY2hhciogcHJveHluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcHJveHluYW1lX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHByb3h5cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRpbWVvdXRfbXMgKQoreworICAgIFNvY2tBZGRyZXNzICBhZGRyOworICAgIGludCAgICAgICAgICBzb2NrOworICAgIElvTG9vcGVyKiAgICBsb29wZXI7CisgICAgaW50ICAgICAgICAgIHJldDsKKworICAgIGlmIChwcm94eV9yZXNvbHZlX3NlcnZlcigmYWRkciwgcHJveHluYW1lLCBwcm94eW5hbWVfbGVuLCBwcm94eXBvcnQpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc29jayA9IHNvY2tldF9jcmVhdGUoYWRkci5mYW1pbHksIFNPQ0tFVF9TVFJFQU0pOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBDb3VsZCBub3QgY3JlYXRlIHNvY2tldCAhPzogJXMiLCBfX0ZVTkNUSU9OX18sIGVycm5vX3N0cik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzb2NrZXRfc2V0X25vbmJsb2NrKHNvY2spOworCisgICAgLyogQW4gaW1tZWRpYXRlIGNvbm5lY3Rpb24gaXMgdmVyeSB1bmxpa2VseSwgYnV0IGRlYWwgd2l0aCBpdCwganVzdCBpbiBjYXNlICovCisgICAgaWYgKHNvY2tldF9jb25uZWN0KHNvY2ssICZhZGRyKSA9PSAwKSB7CisgICAgICAgIFBST1hZX0xPRygiJXM6IEltbWVkaWF0ZSBjb25uZWN0aW9uIHRvICUuKnM6JWQ6ICVzICEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHByb3h5bmFtZV9sZW4sIHByb3h5bmFtZSwgcHJveHlwb3J0KTsKKyAgICAgICAgc29ja2V0X2Nsb3NlKHNvY2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBPaywgY3JlYXRlIGFuIElvTG9vcGVyIG9iamVjdCB0byB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiAqLworICAgIGxvb3BlciA9IGlvbG9vcGVyX25ldygpOworICAgIGlvbG9vcGVyX2FkZF93cml0ZShsb29wZXIsIHNvY2spOworCisgICAgcmV0ID0gaW9sb29wZXJfd2FpdChsb29wZXIsIHRpbWVvdXRfbXMpOworCisgICAgaW9sb29wZXJfZnJlZShsb29wZXIpOworICAgIHNvY2tldF9jbG9zZShzb2NrKTsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBlcnJubyA9IEVUSU1FRE9VVDsKKyAgICAgICAgcmV0ICAgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9jb21tb24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjRkNzQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5oCkBAIC0wLDAgKzEsMTMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBDb21tb24gaW50ZXJmYWNlIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNwYXJlbnQgcHJveHkgZW5naW5lLgorLy8KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLworLy8gLSBSZWdpc3RlciB0aGUgcmVtb3RlIHByb3h5IHNlcnZlciB1c2luZyB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24uIEZvcgorLy8gICBleGFtcGxlLCB1c2UgcHJveHlfaHR0cF9zZXR1cCgpIChkZWNsYXJlZCBpbiBwcm94eV9odHRwLmgpIHRvIHRlbGwgdGhlCisvLyAgIGVuZ2luZSB0byB1c2UgYSBzcGVjaWZpYyBIVFRQL0hUVFBTIHByb3h5LgorLy8KKy8vIC0gRm9yIGVhY2ggbmV3IGNvbm5lY3Rpb24gdG8gYSByZW1vdGUgc2VydmVyLCBjYWxsIHByb3h5X21hbmFnZXJfYWRkKCkKKy8vICAgcGFzc2luZyB0aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgZGVzaXJlZCBzb2NrZXQgdHlwZS4gVGhlIGZ1bmN0aW9uCisvLyAgIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBhZGRyZXNzIGFzeW5jaHJvbm91c2x5IHRocm91Z2ggdGhlCisvLyAgIGNvbmZpZ3VyZWQgcHJveHkgc2VydmVyLCBhbmQgbWF5IHJldHVybiBpbW1lZGlhdGVseS4KKy8vCisvLyAtIFRoZSBjYWxsYmFjayBwYXNzZWQgdG8gcHJveHlfbWFuYWdlZF9hZGQoKSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZQorLy8gICBjb25uZWN0aW9uIHN1Y2NlZWRzIG9yIGZhaWxzLiBJbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgc29ja2V0IGZpbGUgZGVzY3JpcHRvcgorLy8gICBpcyBhbHNvIHBhc3NlZCwgYW5kIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKy8vICAgcmVtb3RlIHNlcnZlciB0aHJvdWdoIHRoZSBwcm94eS4KKy8vCisvLyAgIE5vdGUgdGhhdCB0aGlzIGhhcHBlbnMgd2l0aGluIHRoZSB0aHJlYWQncyBjdXJyZW50IGxvb3BlcidzIGV2ZW50IGxvb3AuCisvLworLy8gLSBDYWxsIHByb3h5X21hbmFnZXJfZGVsKCkgdG8gZm9yY2UtZnVsbHkgcmVtb3ZlIGEgcHJveGlmaWVkIHNvY2tldAorLy8gICBjb25uZWN0aW9uLiBDbG9zaW5nIHRoZSBzb2NrZXQgd2lsbCBhbHNvIHdvcmsuCisKKy8qIHR5cGVzIGFuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBwcm94eSBjb25uZWN0aW9ucyAqLworCisvLyBDb25uZWN0aW9uIGF0dGVtcHQgcmVzdWx0LgordHlwZWRlZiBlbnVtIHsKKyAgICBQUk9YWV9FVkVOVF9OT05FLAorICAgIFBST1hZX0VWRU5UX0NPTk5FQ1RFRCwKKyAgICBQUk9YWV9FVkVOVF9DT05ORUNUSU9OX1JFRlVTRUQsCisgICAgUFJPWFlfRVZFTlRfU0VSVkVSX0VSUk9SCit9IFByb3h5RXZlbnQ7CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlcG9ydCB0aGUgcmVzdWx0IG9mIGFuIGFzeW5jaHJvbm91cworLy8gY29ubmVjdGlvbiBhdHRlbXB0IHN0YXJ0ZWQgYnkgcHJveHlfbWFuYWdlZF9hZGQoKSBiZWxvdy4KKy8vIHxvcGFxdWV8IGlzIGEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCBwb2ludGVyLCB0aGF0IGNvbWVzIGZyb20gdGhlCisvLyBpbml0aWFsIHByb3h5X21hbmFnZXJfYWRkKCkgY2FsbCwgYW5kIGNhbiBhbHNvIGJlIHVzZWQgdG8gY2FsbAorLy8gcHJveHlfbWFuYWdlcl9kZWwoKS4gfGZkfCBpcyB0aGUgc29ja2V0IGRlc2NyaXB0b3IgdG8gdXNlIGZyb20gdGhlCisvLyBjbGllbnQsIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gfGV2ZW50fCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgY29ubmVjdGlvbgorLy8gc3VjY2VlZGVkIG9yIG5vdC4gSXQgY2Fubm90IGJlIFBST1hZX0VWRU5UX05PTkUuCit0eXBlZGVmIHZvaWQgKCpQcm94eUV2ZW50RnVuYykoIHZvaWQqICBvcGFxdWUsIGludCAgZmQsIFByb3h5RXZlbnQgIGV2ZW50ICk7CisKKy8vIFNldCB8bW9kZXwgdG8gbm9uLTAgdmFsdWUgdG8gZW5hYmxlIHByb3h5IGxvZ3MuCitleHRlcm4gdm9pZCAgcHJveHlfc2V0X3ZlcmJvc2UoaW50ICBtb2RlKTsKKworLy8gTGlzdCBvZiBwcm94eSBvcHRpb24gdHlwZXMuCisvLyBQUk9YWV9PUFRJT05fQVVUSF9VU0VSTkFNRTogdmFsdWUgaXMgcHJveHkgdXNlcm5hbWUuCisvLyBQUk9YWV9PUFRJT05fQVVUSF9QQVNTV09SRDogdmFsdWUgaXMgcHJveHkgcGFzc3dvcmQuCisvLyBQUk9YWV9PUFRJT05fSFRUUF9OT0NBQ0hFOiBmb3JjZSBIVFRQIE5vLUNhY2hlIG9wdGlvbi4KKy8vIFBST1hZX09QVElPTl9IVFRQX0tFRVBBTElWRToKKy8vIFBST1hZX09QVElPTl9IVFRQX1VTRVJfQUdFTlQ6CisvLyBQUk9YWV9PUFRJT05fVFlQRTogaWYgcHJlc2VudCwgZm9yY2VzIHRoZSB0eXBlIG9mIHByb3h5IHRvIHVzZS4gVmFsaWQKKy8vIHZhbHVlcyBhcmUgImh0dHAiIGFuZCAiaHR0cHMiLiBUaGlzIGlzIHVzZWQgZHVyaW5nIHVuaXQtdGVzdGluZy4gT3RoZXJ3aXNlCisvLyB0aGUgdHlwZSBpcyBhdXRvLWRldGVjdGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIHRhcmdldAorLy8gc2VydmVyIGFkZHJlc3MnIHBvcnQgKDgwIGZvciAiaHR0cCIsIGFueXRoaW5nIGVsc2UgZm9yICJodHRwcyIpLgordHlwZWRlZiBlbnVtIHsKKyAgICBQUk9YWV9PUFRJT05fQVVUSF9VU0VSTkFNRSA9IDEsCisgICAgUFJPWFlfT1BUSU9OX0FVVEhfUEFTU1dPUkQsCisKKyAgICBQUk9YWV9PUFRJT05fSFRUUF9OT0NBQ0hFID0gMTAwLAorICAgIFBST1hZX09QVElPTl9IVFRQX0tFRVBBTElWRSwKKyAgICBQUk9YWV9PUFRJT05fSFRUUF9VU0VSX0FHRU5ULAorCisgICAgUFJPWFlfT1BUSU9OX1RZUEUsCisKKyAgICBQUk9YWV9PUFRJT05fTUFYICAvLyBNdXN0IGJlIGxhc3QuCit9IFByb3h5T3B0aW9uVHlwZTsKKworLy8gUHJveHkgb3B0aW9uIGtleS92YWx1ZSBwYWlyLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIFByb3h5T3B0aW9uVHlwZSAgdHlwZTsKKyAgICBjb25zdCBjaGFyKiAgICAgIHN0cmluZzsKKyAgICBpbnQgICAgICAgICAgICAgIHN0cmluZ19sZW47Cit9IFByb3h5T3B0aW9uOworCisKKy8vIFN0YXJ0IGEgbmV3IGNvbm5lY3Rpb24gYXR0ZW1wdCB0byB0aGUgdGFyZ2V0IHNlcnZlcidzIHxhZGRyZXNzfC4KKy8vIHxzb2NrX3R5cGV8IGRldGVybWluZXMgdGhlIHR5cGUgb2Ygc29ja2V0IHRvIHVzZS4gfGV2X2Z1bmN8IGFuZCB8ZXZfb3BhcXVlfAorLy8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZQorLy8gY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvciBmYWlscy4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGNhbGxiYWNrIGNhbiBiZSBpbnZva2VkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKy8vIChlLmcuIGlmIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IHN1Y2NlZWRzLCBvciBpZiB0aGVyZSBpcyBhIHByb2JsZW0KKy8vIHdpdGggdGhlIHNlcnZlcidzIGFkZHJlc3MpLiBPdGhlcndpc2UsIGl0IHdpbGwgYmUgaW52b2tlZCBsYXRlciBkdXJpbmcgdGhlCisvLyBjdXJyZW50IHRocmVhZCdzIG1haW4gbG9vcCBwcm9jZXNzaW5nLgorLy8KKy8vIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBpZiB0aGVyZSBpcyBubyBwcm94eSBzZXJ2aWNlIGZvciB0aGlzIHR5cGUgb2YKKy8vIGNvbm5lY3Rpb24uCitleHRlcm4gaW50ICAgcHJveHlfbWFuYWdlcl9hZGQoIGNvbnN0IFNvY2tBZGRyZXNzKiAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFR5cGUgICAgICAgICAgIHNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlFdmVudEZ1bmMgICAgICAgZXZfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgZXZfb3BhcXVlICk7CisKKy8vIFJlbW92ZSBhIHBlbmRpbmcgcHJveGlmaWVkIHNvY2tldCBjb25uZWN0aW9uIGZyb20gdGhlIG1hbmFnZXIncyBsaXN0LgorLy8gdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSBzb2NrZXQgY29ubmVjdGlvbiBtdXN0IGJlIGNhbmNlbGVkIGJlZm9yZQorLy8gdGhlIGNvbm5lY3Rpb24gYWNjZXB0L3JlZnVzYWwgb2NjdXJlZC4gfGV2X29wYXF1ZXwgbXVzdCBiZSB0aGUgc2FtZSB2YWx1ZQorLy8gdGhhdCB3YXMgcGFzc2VkIHRvIHByb3h5X21hbmFnZXJfYWRkKCkuCitleHRlcm4gdm9pZCAgcHJveHlfbWFuYWdlcl9kZWwoIHZvaWQqICBldl9vcGFxdWUgKTsKKworLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgdGhhdCBvbmUgY2FuIGNvbm5lY3QgdG8gYSBnaXZlbiBwcm94eS4gSXQgd2lsbCBzaW1wbHkKKy8vIHRyeSB0byBjb25uZWN0KCkgdG8gaXQsIGZvciBhIHNwZWNpZmllZCB0aW1lb3V0LCBpbiBtaWxsaXNlY29uZHMsIHRoZW4gY2xvc2UKKy8vIHRoZSBjb25uZWN0aW9uLgorLy8KKy8vIHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFuZCAtMSBpbiBjYXNlIG9mIGVycm9yLiBlcnJubyB3aWxsIGJlIHNldAorLy8gdG8gRVRJTUVPVVQgaW4gY2FzZSBvZiB0aW1lb3V0LCBvciBFQ09OTlJFRlVTRUQgaWYgdGhlIGNvbm5lY3Rpb24gaXMKKy8vIHJlZnVzZWQuCitleHRlcm4gaW50ICAgcHJveHlfY2hlY2tfY29ubmVjdGlvbiggY29uc3QgY2hhciogcHJveHluYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHByb3h5bmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgcHJveHlwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHRpbWVvdXRfbXMgKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9jb21tb25fdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTk4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfaW50LmgiCit9CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCitURVNUKFByb3h5Q29tbW9uLCBwcm94eV9iYXNlNjRfZW5jb2RlKSB7CisgICAgY2hhciBkc3RbNjRdOworCisgICAgRVhQRUNUX0VRKDAsIHByb3h5X2Jhc2U2NF9lbmNvZGUoIiIsIDAsIGRzdCwgNjQpKTsKKworICAgIEVYUEVDVF9FUSg0LCBwcm94eV9iYXNlNjRfZW5jb2RlKCJcMCIsIDEsIGRzdCwgNjQpKTsKKyAgICBkc3RbNF0gPSAwOworICAgIEVYUEVDVF9TVFJFUSgiQUE9PSIsIGRzdCk7CisKKyAgICBFWFBFQ1RfRVEoNCwgcHJveHlfYmFzZTY0X2VuY29kZSgiXHhmZiIsIDEsIGRzdCwgNjQpKTsKKyAgICBkc3RbNF0gPSAwOworICAgIEVYUEVDVF9TVFJFUSgiL3c9PSIsIGRzdCk7CisKKyAgICBFWFBFQ1RfRVEoOCwgcHJveHlfYmFzZTY0X2VuY29kZSgiXHhhYVx4YmJceGNjXHhkZCIsIDQsIGRzdCwgNjQpKTsKKyAgICBkc3RbOF0gPSAwOworICAgIEVYUEVDVF9TVFJFUSgicXJ2TTNRPT0iLCBkc3QpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2h0dHAuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxNGZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X2ludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9pbnQuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSAgSFRUUF9WRVJTSU9OICAiMS4xIgorCitzdGF0aWMgdm9pZAoraHR0cF9zZXJ2aWNlX2ZyZWUoIEh0dHBTZXJ2aWNlKiAgc2VydmljZSApCit7CisgICAgUFJPWFlfTE9HKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKHNlcnZpY2UtPmZvb3RlciAhPSBzZXJ2aWNlLT5mb290ZXIwKQorICAgICAgICBmcmVlKHNlcnZpY2UtPmZvb3Rlcik7CisgICAgZnJlZShzZXJ2aWNlKTsKK30KKworCitzdGF0aWMgUHJveHlDb25uZWN0aW9uKgoraHR0cF9zZXJ2aWNlX2Nvbm5lY3QoIEh0dHBTZXJ2aWNlKiAgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRUeXBlICAgIHNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIC8qIHRoZSBIVFRQIHByb3h5IGNhbiBvbmx5IGhhbmRsZSBUQ1AgY29ubmVjdGlvbnMgKi8KKyAgICBpZiAoc29ja190eXBlICE9IFNPQ0tFVF9TVFJFQU0pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogaWYgdGhlIGNsaWVudCB0cmllcyB0byBkaXJlY3RseSBjb25uZWN0IHRvIHRoZSBwcm94eSwgbGV0IGl0IGRvIHNvICovCisgICAgaWYgKHNvY2tfYWRkcmVzc19lcXVhbCggYWRkcmVzcywgJnNlcnZpY2UtPnNlcnZlcl9hZGRyICkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgUFJPWFlfTE9HKCIlczogdHJ5aW5nIHRvIGNvbm5lY3QgdG8gJXMiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvY2tfYWRkcmVzc190b19zdHJpbmcoYWRkcmVzcykpOworCisgICAgSHR0cFNlcnZpY2VUeXBlIHNlcnZpY2VfdHlwZSA9IHNlcnZpY2UtPnNlcnZpY2VfdHlwZTsKKyAgICBpZiAoc2VydmljZV90eXBlID09IEhUVFBfU0VSVklDRV9UWVBFX0FVVE8pIHsKKyAgICAgICAgaWYgKHNvY2tfYWRkcmVzc19nZXRfcG9ydChhZGRyZXNzKSA9PSA4MCkgeworICAgICAgICAgICAgc2VydmljZV90eXBlID0gSFRUUF9TRVJWSUNFX1RZUEVfUkVXUklURVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXJ2aWNlX3R5cGUgPSBIVFRQX1NFUlZJQ0VfVFlQRV9DT05ORUNUT1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2VydmljZV90eXBlID09IEhUVFBfU0VSVklDRV9UWVBFX1JFV1JJVEVSKSB7CisgICAgICAgIC8qIHVzZSB0aGUgcmV3cml0ZXIgZm9yIEhUVFAgKi8KKyAgICAgICAgUFJPWFlfTE9HKCIlczogdXNpbmcgSFRUUCByZXdyaXRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBodHRwX3Jld3JpdGVyX2Nvbm5lY3Qoc2VydmljZSwgYWRkcmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUFJPWFlfTE9HKCIlczogdXNpbmcgSFRUUCBjb25uZWN0b3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gaHR0cF9jb25uZWN0b3JfY29ubmVjdChzZXJ2aWNlLCBhZGRyZXNzKTsKKyAgICB9Cit9CisKKworaW50Citwcm94eV9odHRwX3NldHVwKCBjb25zdCBjaGFyKiAgICAgICAgIHNlcnZlcm5hbWUsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHNlcnZlcm5hbWVsZW4sCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIHNlcnZlcnBvcnQsCisgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG51bV9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3QgUHJveHlPcHRpb24qICBvcHRpb25zICkKK3sKKyAgICBIdHRwU2VydmljZSogICAgICAgIHNlcnZpY2U7CisgICAgU29ja0FkZHJlc3MgICAgICAgICBzZXJ2ZXJfYWRkcjsKKyAgICBjb25zdCBQcm94eU9wdGlvbiogIG9wdF9ub2NhY2hlICAgPSBOVUxMOworICAgIGNvbnN0IFByb3h5T3B0aW9uKiAgb3B0X2tlZXBhbGl2ZSA9IE5VTEw7CisgICAgY29uc3QgUHJveHlPcHRpb24qICBvcHRfYXV0aF91c2VyID0gTlVMTDsKKyAgICBjb25zdCBQcm94eU9wdGlvbiogIG9wdF9hdXRoX3Bhc3MgPSBOVUxMOworICAgIGNvbnN0IFByb3h5T3B0aW9uKiAgb3B0X3VzZXJfYWdlbnQgPSBOVUxMOworICAgIGNvbnN0IFByb3h5T3B0aW9uKiAgb3B0X3R5cGUgPSBOVUxMOworCisgICAgaWYgKHNlcnZlcm5hbWVsZW4gPCAwKQorICAgICAgICBzZXJ2ZXJuYW1lbGVuID0gc3RybGVuKHNlcnZlcm5hbWUpOworCisgICAgUFJPWFlfTE9HKCAiJXM6IGNyZWF0aW5nIGh0dHAgcHJveHkgc2VydmljZSBjb25uZWN0aW5nIHRvOiAlLipzOiVkIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VydmVybmFtZWxlbiwgc2VydmVybmFtZSwgc2VydmVycG9ydCApOworCisgICAgLyogcmVzb2x2ZSBzZXJ2ZXIgYWRkcmVzcyAqLworICAgIGlmIChwcm94eV9yZXNvbHZlX3NlcnZlcigmc2VydmVyX2FkZHIsIHNlcnZlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcm5hbWVsZW4sIHNlcnZlcnBvcnQpIDwgMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgc2VydmljZSBvYmplY3QgKi8KKyAgICBzZXJ2aWNlID0gY2FsbG9jKDEsIHNpemVvZigqc2VydmljZSkpOworICAgIGlmIChzZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgUFJPWFlfTE9HKCIlczogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgbmV3IHByb3h5IHNlcnZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2VydmljZS0+c2VydmVyX2FkZHIgPSBzZXJ2ZXJfYWRkcjsKKworICAgIC8qIHBhcnNlIG9wdGlvbnMgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IFByb3h5T3B0aW9uKiAgb3B0ID0gb3B0aW9uczsKKyAgICAgICAgY29uc3QgUHJveHlPcHRpb24qICBlbmQgPSBvcHQgKyBudW1fb3B0aW9uczsKKworICAgICAgICBmb3IgKCA7IG9wdCA8IGVuZDsgb3B0KysgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wdC0+dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgUFJPWFlfT1BUSU9OX0hUVFBfTk9DQUNIRTogICAgIG9wdF9ub2NhY2hlICAgID0gb3B0OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBST1hZX09QVElPTl9IVFRQX0tFRVBBTElWRTogICBvcHRfa2VlcGFsaXZlICA9IG9wdDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUk9YWV9PUFRJT05fQVVUSF9VU0VSTkFNRTogICAgb3B0X2F1dGhfdXNlciAgPSBvcHQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUFJPWFlfT1BUSU9OX0FVVEhfUEFTU1dPUkQ6ICAgIG9wdF9hdXRoX3Bhc3MgID0gb3B0OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFBST1hZX09QVElPTl9IVFRQX1VTRVJfQUdFTlQ6ICBvcHRfdXNlcl9hZ2VudCA9IG9wdDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUk9YWV9PUFRJT05fVFlQRTogICAgICAgICAgICAgb3B0X3R5cGUgICAgICAgPSBvcHQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNlcnZpY2UtPnNlcnZpY2VfdHlwZSA9IEhUVFBfU0VSVklDRV9UWVBFX0FVVE87CisgICAgaWYgKG9wdF90eXBlKSB7CisgICAgICAgIGlmIChvcHRfdHlwZS0+c3RyaW5nX2xlbiA9PSA0ICYmCisgICAgICAgICAgICAgICAgIW1lbWNtcChvcHRfdHlwZS0+c3RyaW5nLCAiaHR0cCIsIG9wdF90eXBlLT5zdHJpbmdfbGVuKSkgeworICAgICAgICAgICAgc2VydmljZS0+c2VydmljZV90eXBlID0gSFRUUF9TRVJWSUNFX1RZUEVfUkVXUklURVI7CisgICAgICAgIH0gZWxzZSBpZiAob3B0X3R5cGUtPnN0cmluZ19sZW4gPT0gNSAmJgorICAgICAgICAgICAgICAgICFtZW1jbXAob3B0X3R5cGUtPnN0cmluZywgImh0dHBzIiwgb3B0X3R5cGUtPnN0cmluZ19sZW4pKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5zZXJ2aWNlX3R5cGUgPSBIVFRQX1NFUlZJQ0VfVFlQRV9DT05ORUNUT1I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBVbmtub3duIEhUVFAgc2VydmljZSB0eXBlIFslLipzXSwgaWdub3JpbmciLAorICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3B0X3R5cGUtPnN0cmluZ19sZW4sIG9wdF90eXBlLT5zdHJpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcHJlcGFyZSBmb290ZXIgKi8KKyAgICB7CisgICAgICAgIGludCAgICB3bGVuOworICAgICAgICBjaGFyKiAgcCAgICA9IHNlcnZpY2UtPmZvb3RlcjA7CisgICAgICAgIGNoYXIqICBlbmQgID0gcCArIHNpemVvZihzZXJ2aWNlLT5mb290ZXIwKTsKKworICAgICAgICAvKiBuby1jYWNoZSAqLworICAgICAgICBpZiAob3B0X25vY2FjaGUpIHsKKyAgICAgICAgICAgIHAgKz0gc25wcmludGYocCwgZW5kLXAsICJQcmFnbWE6IG5vLWNhY2hlXHJcbkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlXHJcbiIpOworICAgICAgICAgICAgaWYgKHAgPj0gZW5kKSBnb3RvIEZvb3Rlck92ZXJmbG93OworICAgICAgICB9CisgICAgICAgIC8qIGtlZXAtYWxpdmUgKi8KKyAgICAgICAgaWYgKG9wdF9rZWVwYWxpdmUpIHsKKyAgICAgICAgICAgIHAgKz0gc25wcmludGYocCwgZW5kLXAsICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlXHJcblByb3h5LUNvbm5lY3Rpb246IEtlZXAtQWxpdmVcclxuIik7CisgICAgICAgICAgICBpZiAocCA+PSBlbmQpIGdvdG8gRm9vdGVyT3ZlcmZsb3c7CisgICAgICAgIH0KKyAgICAgICAgLyogYXV0aGVudGljYXRpb24gKi8KKyAgICAgICAgaWYgKG9wdF9hdXRoX3VzZXIgJiYgb3B0X2F1dGhfcGFzcykgeworICAgICAgICAgICAgY2hhciAgdXNlcl9wYXNzWzI1Nl07CisgICAgICAgICAgICBjaGFyICBlbmNvZGVkWzUxMl07CisgICAgICAgICAgICBpbnQgICB1cGxlbjsKKworICAgICAgICAgICAgdXBsZW4gPSBzbnByaW50ZiggdXNlcl9wYXNzLCBzaXplb2YodXNlcl9wYXNzKSwgIiUuKnM6JS4qcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXV0aF91c2VyLT5zdHJpbmdfbGVuLCBvcHRfYXV0aF91c2VyLT5zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfYXV0aF9wYXNzLT5zdHJpbmdfbGVuLCBvcHRfYXV0aF9wYXNzLT5zdHJpbmcgKTsKKworICAgICAgICAgICAgaWYgKHVwbGVuID49IChpbnQpc2l6ZW9mKHVzZXJfcGFzcykpIGdvdG8gRm9vdGVyT3ZlcmZsb3c7CisKKyAgICAgICAgICAgIHdsZW4gPSBwcm94eV9iYXNlNjRfZW5jb2RlKHVzZXJfcGFzcywgdXBsZW4sIGVuY29kZWQsIChpbnQpc2l6ZW9mKGVuY29kZWQpKTsKKyAgICAgICAgICAgIGlmICh3bGVuIDwgMCkgeworICAgICAgICAgICAgICAgIFBST1hZX0xPRyggImNvdWxkIG5vdCBiYXNlNjQgZW5jb2RlICclLipzJyIsIHVwbGVuLCB1c2VyX3Bhc3MpOworICAgICAgICAgICAgICAgIGdvdG8gRm9vdGVyT3ZlcmZsb3c7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAgKz0gc25wcmludGYocCwgZW5kLXAsICJQcm94eS1hdXRob3JpemF0aW9uOiBCYXNpYyAlLipzXHJcbiIsIHdsZW4sIGVuY29kZWQpOworICAgICAgICAgICAgaWYgKHAgPj0gZW5kKSBnb3RvIEZvb3Rlck92ZXJmbG93OworICAgICAgICB9CisgICAgICAgIC8qIHVzZXIgYWdlbnQgKi8KKyAgICAgICAgaWYgKG9wdF91c2VyX2FnZW50KSB7CisgICAgICAgICAgICBwICs9IHNucHJpbnRmKHAsIGVuZC1wLCAiVXNlci1BZ2VudDogJS4qc1xyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfdXNlcl9hZ2VudC0+c3RyaW5nX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X3VzZXJfYWdlbnQtPnN0cmluZyk7CisgICAgICAgICAgICBpZiAocCA+PSBlbmQpIGdvdG8gRm9vdGVyT3ZlcmZsb3c7CisgICAgICAgIH0KKworICAgICAgICBwICs9IHNucHJpbnRmKHAsIGVuZC1wLCAiXHJcbiIpOworCisgICAgICAgIGlmIChwID49IGVuZCkgeworICAgICAgICBGb290ZXJPdmVyZmxvdzoKKyAgICAgICAgICAgIFBST1hZX0xPRyggIiVzOiBidWZmZXIgb3ZlcmZsb3cgd2hlbiBjcmVhdGluZyBjb25uZWN0aW9uIGZvb3RlciIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBodHRwX3NlcnZpY2VfZnJlZShzZXJ2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNlcnZpY2UtPmZvb3RlciAgICAgPSBzZXJ2aWNlLT5mb290ZXIwOworICAgICAgICBzZXJ2aWNlLT5mb290ZXJfbGVuID0gKHAgLSBzZXJ2aWNlLT5mb290ZXIpOworICAgIH0KKworICAgIFBST1hZX0xPRyggIiVzOiBjcmVhdGluZyBIVFRQIFByb3h5IFNlcnZpY2UgRm9vdGVyIGlzIChsZW49JWQpOlxuJyUuKnMnIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VydmljZS0+Zm9vdGVyX2xlbiwKKyAgICAgICAgICAgICAgIHNlcnZpY2UtPmZvb3Rlcl9sZW4sIHNlcnZpY2UtPmZvb3RlciApOworCisgICAgc2VydmljZS0+cm9vdC0+b3BhcXVlICAgICAgID0gc2VydmljZTsKKyAgICBzZXJ2aWNlLT5yb290LT5zZXJ2X2ZyZWUgICAgPSAoUHJveHlTZXJ2aWNlRnJlZUZ1bmMpICAgIGh0dHBfc2VydmljZV9mcmVlOworICAgIHNlcnZpY2UtPnJvb3QtPnNlcnZfY29ubmVjdCA9IChQcm94eVNlcnZpY2VDb25uZWN0RnVuYykgaHR0cF9zZXJ2aWNlX2Nvbm5lY3Q7CisKKyAgICBpZiAocHJveHlfbWFuYWdlcl9hZGRfc2VydmljZSggc2VydmljZS0+cm9vdCApIDwgMCkgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgc2VydmljZSA/IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaHR0cF9zZXJ2aWNlX2ZyZWUoc2VydmljZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDAwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQ29uZmlndXJlIHRoZSB0cmFuc3BhcmVudCBwcm94eSBlbmdpbmUgdG8gdXNlIGEgc3BlY2lmaWMgSFRUUC9IVFRQUworLy8gcHJveHkuIHxzZXJ2ZXJuYW1lfCBhbmQgfHNlcnZlcm5hbWVsZW58IHNwZWNpZnkgdGhlIHNlcnZlcidzIFVSTC4KKy8vIHxzZXJ2ZXJwb3J0fCBpcyB0aGUgcG9ydCB0byBjb25uZWN0IHRvLgorLy8gfG51bV9vcHRpb25zfCBpcyB0aGUgbnVtYmVyIG9mIG9wdGlvbnMsIGxpc3RlZCBpbiB0aGUgfG9wdGlvbnN8CisvLyBhcnJheSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB2YXJpb3VzIFByb3h5T3B0aW9uIGtleS92YWx1ZQorLy8gcGFpcnMgdG8gY29uZmlndXJlIHRoZSBwcm94eS4KKy8vCisvLyBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4KK2V4dGVybiBpbnQKK3Byb3h5X2h0dHBfc2V0dXAoIGNvbnN0IGNoYXIqICAgICAgICAgc2VydmVybmFtZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgc2VydmVybmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgc2VydmVycG9ydCwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbnVtX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBQcm94eU9wdGlvbiogIG9wdGlvbnMgKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9jb25uZWN0b3IuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwX2Nvbm5lY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZDRiNWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9jb25uZWN0b3IuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9pbnQuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogQSBIdHRwQ29ubmVjdG9yIGltcGxlbWVudHMgYSBub24tSFRUUCBwcm94aWVkIGNvbm5lY3Rpb24KKyAqIHRocm91Z2ggdGhlIENPTk5FQ1QgbWV0aG9kLiBNYW55IGZpcmV3YWxscyBhcmUgY29uZmlndXJlZAorICogdG8gcmVqZWN0IHRoZXNlIGZvciBwb3J0IDgwLCBzbyB0aGVzZSBjb25uZWN0aW9ucyBzaG91bGQKKyAqIHVzZSBhIEh0dHBSZXdyaXRlciBpbnN0ZWFkLgorICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgU1RBVEVfTk9ORSA9IDAsCisgICAgU1RBVEVfQ09OTkVDVElORywgICAgICAgICAgIC8qIGNvbm5lY3RpbmcgdG8gdGhlIHNlcnZlciAqLworICAgIFNUQVRFX1NFTkRfSEVBREVSLCAgICAgICAgICAvKiBjb25uZWN0ZWQsIHNlbmRpbmcgaGVhZGVyIHRvIHRoZSBzZXJ2ZXIgKi8KKyAgICBTVEFURV9SRUNFSVZFX0FOU1dFUl9MSU5FMSwKKyAgICBTVEFURV9SRUNFSVZFX0FOU1dFUl9MSU5FMiAgLyogY29ubmVjdGVkLCByZWFkaW5nIHNlcnZlcidzIGFuc3dlciAqLworfSBDb25uZWN0b3JTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29ubmVjdGlvbiB7CisgICAgUHJveHlDb25uZWN0aW9uICByb290WzFdOworICAgIENvbm5lY3RvclN0YXRlICAgc3RhdGU7Cit9IENvbm5lY3Rpb247CisKKworc3RhdGljIHZvaWQKK2Nvbm5lY3Rpb25fZnJlZSggUHJveHlDb25uZWN0aW9uKiAgcm9vdCApCit7CisgICAgcHJveHlfY29ubmVjdGlvbl9kb25lKHJvb3QpOworICAgIGZyZWUocm9vdCk7Cit9CisKKworCisjZGVmaW5lICBIVFRQX1ZFUlNJT04gICIxLjEiCisKK3N0YXRpYyBpbnQKK2Nvbm5lY3Rpb25faW5pdCggQ29ubmVjdGlvbiogIGNvbm4gKQoreworICAgIEh0dHBTZXJ2aWNlKiAgICAgIHNlcnZpY2UgPSAoSHR0cFNlcnZpY2UqKSBjb25uLT5yb290LT5zZXJ2aWNlOworICAgIFByb3h5Q29ubmVjdGlvbiogIHJvb3QgICAgPSBjb25uLT5yb290OworICAgIHN0cmFsbG9jX3QqICAgICAgIHN0ciAgICAgPSByb290LT5zdHI7CisKKyAgICBwcm94eV9jb25uZWN0aW9uX3Jld2luZChyb290KTsKKyAgICBzdHJhbGxvY19hZGRfZm9ybWF0KHN0ciwgIkNPTk5FQ1QgJXMgSFRUUC8iIEhUVFBfVkVSU0lPTiAiXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKCZyb290LT5hZGRyZXNzKSk7CisKKyAgICBzdHJhbGxvY19hZGRfYnl0ZXMoc3RyLCBzZXJ2aWNlLT5mb290ZXIsIHNlcnZpY2UtPmZvb3Rlcl9sZW4pOworCisgICAgbG9vcElvX3dhbnRXcml0ZShjb25uLT5yb290LT5pbyk7CisKKyAgICBpZiAoIXNvY2tldF9jb25uZWN0KGxvb3BJb19mZChyb290LT5pbyksICZzZXJ2aWNlLT5zZXJ2ZXJfYWRkciApKSB7CisgICAgICAgIC8qIGltbWVkaWF0ZSBjb25uZWN0aW9uID8/ICovCisgICAgICAgIGNvbm4tPnN0YXRlID0gU1RBVEVfU0VORF9IRUFERVI7CisgICAgICAgIFBST1hZX0xPRygiJXM6IGltbWVkaWF0ZSBjb25uZWN0aW9uIiwgcm9vdC0+bmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZXJybm8gPT0gRUlOUFJPR1JFU1MgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKKyAgICAgICAgICAgIGNvbm4tPnN0YXRlID0gU1RBVEVfQ09OTkVDVElORzsKKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNvbm5lY3RpbmciLCByb290LT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNhbm5vdCBjb25uZWN0IHRvIHByb3h5OiAlcyIsIHJvb3QtPm5hbWUsIGVycm5vX3N0cik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2Nvbm5lY3Rpb25faW9fZXZlbnQodm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cykgeworICAgIENvbm5lY3Rpb24qICBjb25uID0gb3BhcXVlOworICAgIFByb3h5Q29ubmVjdGlvbiogcm9vdCA9IGNvbm4tPnJvb3Q7CisgICAgRGF0YVN0YXR1cyAgIHJldCAgPSBEQVRBX05FRURfTU9SRTsKKworICAgIGlmIChldmVudHMgJiBMT09QX0lPX1dSSVRFKSB7CisgICAgICAgIHN3aXRjaCAoY29ubi0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9DT05ORUNUSU5HOgorICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogY29ubmVjdGVkIHRvIGh0dHAgcHJveHksIHNlbmRpbmcgaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lKTsKKyAgICAgICAgICAgIGNvbm4tPnN0YXRlID0gU1RBVEVfU0VORF9IRUFERVI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX1NFTkRfSEVBREVSOgorICAgICAgICAgICAgcmV0ID0gcHJveHlfY29ubmVjdGlvbl9zZW5kKHJvb3QsIGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBjb25uLT5zdGF0ZSA9IFNUQVRFX1JFQ0VJVkVfQU5TV0VSX0xJTkUxOworICAgICAgICAgICAgICAgIGxvb3BJb19kb250V2FudFdyaXRlKHJvb3QtPmlvKTsKKyAgICAgICAgICAgICAgICBsb29wSW9fd2FudFJlYWQocm9vdC0+aW8pOworICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGhlYWRlciBzZW50LCByZWNlaXZpbmcgZmlyc3QgYW5zd2VyIGxpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBpbnZhbGlkIHN0YXRlIGZvciB3cml0ZSBldmVudDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUsIGNvbm4tPnN0YXRlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXZlbnRzICYgTE9PUF9JT19SRUFEKSB7CisgICAgICAgIHN3aXRjaCAoY29ubi0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9SRUNFSVZFX0FOU1dFUl9MSU5FMToKKyAgICAgICAgY2FzZSBTVEFURV9SRUNFSVZFX0FOU1dFUl9MSU5FMjoKKyAgICAgICAgICAgIHJldCA9IHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZV9saW5lKHJvb3QsIGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbGluZSA9IHJvb3QtPnN0ci0+czsKKyAgICAgICAgICAgICAgICBpZiAoY29ubi0+c3RhdGUgPT0gU1RBVEVfUkVDRUlWRV9BTlNXRVJfTElORTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICBodHRwMSwgaHR0cDIsIGNvZGVudW07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiSFRUUC8lZC4lZCAlZCIsICZodHRwMSwgJmh0dHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlbnVtKSAhPSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUk9YWV9MT0coICIlczogaW52YWxpZCBhbnN3ZXIgZnJvbSBwcm94eTogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lLCBsaW5lICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBEQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzdWNjZXNzIGlzIDJ4eCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZW51bS8yICE9IDEwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCAiJXM6IGNvbm5lY3Rpb24gcmVmdXNlZCwgZXJyb3I9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgY29kZW51bSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfY29ubmVjdGlvbl9mcmVlKHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9YWV9FVkVOVF9DT05ORUNUSU9OX1JFRlVTRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IHJlY2VpdmluZyBzZWNvbmQgYW5zd2VyIGxpbmUiLCByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgY29ubi0+c3RhdGUgPSBTVEFURV9SRUNFSVZFX0FOU1dFUl9MSU5FMjsKKyAgICAgICAgICAgICAgICAgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQocm9vdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVbMF0gPT0gJ1wwJykgeyAvKiBlbmQgb2YgaGVhZGVycyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogb2ssIHdlJ3JlIGNvbm5lY3RlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogY29ubmVjdGlvbiBzdWNjZWVkZWQiLCByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fZnJlZShyb290LCAxLCBQUk9YWV9FVkVOVF9DT05ORUNURUQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyoganVzdCBza2lwIGhlYWRlcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBpbnZhbGlkIHN0YXRlIGZvciByZWFkIGV2ZW50OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgY29ubi0+c3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJldCA9PSBEQVRBX0VSUk9SKSB7CisgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fZnJlZShyb290LCAwLCBQUk9YWV9FVkVOVF9TRVJWRVJfRVJST1IpOworICAgIH0KK30KKworCitQcm94eUNvbm5lY3Rpb24qCitodHRwX2Nvbm5lY3Rvcl9jb25uZWN0KCBIdHRwU2VydmljZSogIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIENvbm5lY3Rpb24qICBjb25uOworICAgIGludCAgICAgICAgICBzOworCisgICAgcyA9IHNvY2tldF9jcmVhdGVfaW5ldCggU09DS0VUX1NUUkVBTSApOworICAgIGlmIChzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjb25uID0gY2FsbG9jKDEsIHNpemVvZigqY29ubikpOworICAgIGlmIChjb25uID09IE5VTEwpIHsKKyAgICAgICAgc29ja2V0X2Nsb3NlKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBwcm94eV9jb25uZWN0aW9uX2luaXQoY29ubi0+cm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS0+cm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9pb19ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9mcmVlKTsKKworICAgIGlmICggY29ubmVjdGlvbl9pbml0KCBjb25uICkgPCAwICkgeworICAgICAgICBjb25uZWN0aW9uX2ZyZWUoIGNvbm4tPnJvb3QgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNvbm4tPnJvb3Q7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9pbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzg3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaHR0cF9pbnQuaApAQCAtMCwwICsxLDQ2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9wcm94eV9odHRwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9wcm94eV9pbnQuaCIKKworLy8gVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBIVFRQIHByb3h5IHRvIGltcGxlbWVudC4KKy8vIEFVVE8gLT4gZGV0ZXJtaW5lIHR5cGUgYmFzZWQgb24gYWRkcmVzcyBwb3J0ICg4MCAtPiBSRVdSSVRFUiwgb3RoZXIgLT4gQ09OTkVDVE9SKQorLy8gQ09OTkVDVE9SIC0+IHVzZSBjb25uZWN0b3IgbWV0aG9kIChIVFRQUykuCisvLyBSRVdSSVRFUiAtPiB1c2UgcmV3cml0ZXIgbWV0aG9kIChIVFRQKS4KK3R5cGVkZWYgZW51bSB7CisgICAgSFRUUF9TRVJWSUNFX1RZUEVfQVVUTywKKyAgICBIVFRQX1NFUlZJQ0VfVFlQRV9DT05ORUNUT1IsCisgICAgSFRUUF9TRVJWSUNFX1RZUEVfUkVXUklURVIsCit9IEh0dHBTZXJ2aWNlVHlwZTsKKworLyogdGhlIEh0dHBTZXJ2aWNlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgSHR0cFNlcnZpY2UgeworICAgIFByb3h5U2VydmljZSAgICAgICAgcm9vdFsxXTsKKyAgICBTb2NrQWRkcmVzcyAgICAgICAgIHNlcnZlcl9hZGRyOyAgLyogc2VydmVyIGFkZHJlc3MgYW5kIHBvcnQgKi8KKyAgICBIdHRwU2VydmljZVR5cGUgICAgIHNlcnZpY2VfdHlwZTsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIGZvb3RlcjsgICAgICAvKiB0aGUgZm9vdGVyIGNvbnRhaW5zIHRoZSBzdGF0aWMgcGFydHMgb2YgdGhlICovCisgICAgaW50ICAgICAgICAgICAgICAgICBmb290ZXJfbGVuOyAgLyogY29ubmVjdGlvbiBoZWFkZXIsIHdlIGdlbmVyYXRlIGl0IG9ubHkgb25jZSAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZm9vdGVyMFs1MTJdOworfSBIdHRwU2VydmljZTsKKworLyogY3JlYXRlIGEgQ09OTkVDVCBjb25uZWN0aW9uIChmb3IgcG9ydCAhPSA4MCkgKi8KK2V4dGVybiBQcm94eUNvbm5lY3Rpb24qICBodHRwX2Nvbm5lY3Rvcl9jb25uZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwU2VydmljZSogICBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcmVzcyogICBhZGRyZXNzICk7CisKKy8qIGNyZWF0ZSBhIEhUVFAgcmV3cml0aW5nIGNvbm5lY3Rpb24gKGZvciBwb3J0ID09IDgwKSAqLworZXh0ZXJuIFByb3h5Q29ubmVjdGlvbiogIGh0dHBfcmV3cml0ZXJfY29ubmVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFNlcnZpY2UqICAgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja0FkZHJlc3MqICAgYWRkcmVzcyApOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2h0dHBfcmV3cml0ZXIuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwX3Jld3JpdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmZmYwYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9odHRwX3Jld3JpdGVyLmMKQEAgLTAsMCArMSwxMjUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9wcm94eV9odHRwX2ludC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIgIC8qIHN0cnNlcCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogdGhpcyBpbXBsZW1lbnRzIGEgdHJhbnNwYXJlbnQgSFRUUCByZXdyaXRpbmcgcHJveHkKKyAqCisgKiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBIVFRQIHNwZWMgbWFuZGF0ZXMgdGhhdAorICogYW55IHF1ZXJ5IG1hZGUgdG8gYSBwcm94eSB1c2VzIGFuIGFic29sdXRlIFVSSSBhcworICogaW46CisgKgorICogICAgR0VUIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vaW5kZXguaHRtbCBIVFRQLzEuMQorICoKKyAqIHdoaWxlIHRoZSBBbmRyb2lkIGJyb3dzZXIgd2lsbCB0aGluayBpdCdzIHRhbGtpbmcgdG8KKyAqIGEgbm9ybWFsIHdlYiBzZXJ2ZXIgYW5kIHdpbGwgaXNzdWUgYToKKyAqCisgKiAgICBHRVQgL2luZGV4Lmh0bWwgSFRUUC8xLjEKKyAqICAgIEhvc3Q6IHd3dy5leGFtcGxlLmNvbQorICoKKyAqIHdoYXQgd2UgZG8gaGVyZSBpcyB0aHVzIHRoZSBmb2xsb3dpbmc6CisgKgorICogLSByZWFkIHRoZSByZXF1ZXN0IGhlYWRlcgorICogLSByZXdyaXRlIHRoZSByZXF1ZXN0J3MgVVJJIHRvIHVzZSBhYnNvbHV0ZSBVUkkKKyAqIC0gc2VuZCB0aGUgcmV3cml0dGVuIGhlYWRlciB0byB0aGUgcHJveHkKKyAqIC0gdGhlbiByZWFkIHRoZSByZXN0IG9mIHRoZSByZXF1ZXN0LCBhbmQgdHVubmVsIGl0IHRvIHRoZQorICogICBwcm94eSBhcyB3ZWxsCisgKiAtIHJlYWQgdGhlIGFuc3dlciBhcy1pcyBhbmQgc2VuZCBpdCBiYWNrIHRvIHRoZSBzeXN0ZW0KKyAqCisgKiB0aGlzIHNvdW5kcyBhbGwgZWFzeSwgYnV0IHRoZSBydWxlcyBmb3IgY29tcHV0aW5nIHRoZQorICogc2l6ZXMgb2YgSFRUUCBNZXNzYWdlIEJvZGllcyBtYWtlcyB0aGUgaW1wbGVtZW50YXRpb24KKyAqIGEgKmJpdCogZnVua3kuCisgKi8KKworLyogZGVmaW5lIERfQUNUSVZFIHRvIDEgdG8gZHVtcCBhZGRpdGlvbm5hbCBkZWJ1Z2dpbmcKKyAqIGluZm8gd2hlbiAtZGVidWctcHJveHkgaXMgdXNlZC4gVGhlc2UgYXJlIG9ubHkgbmVlZGVkCisgKiB3aGVuIGRlYnVnZ2luZyB0aGUgcHJveHkgY29kZS4KKyAqLworI2RlZmluZSAgRF9BQ1RJVkUgIDAKKworI2lmIERfQUNUSVZFCisjICBkZWZpbmUgIEQoLi4uKSAgIFBST1hZX0xPRyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjICBkZWZpbmUgIEQoLi4uKSAgICgodm9pZCkwKQorI2VuZGlmCisKKworLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqICAgSFRUUCBIRUFERVJTCisgKioKKyAqKi8KKworLyogSHR0cEhlYWRlciBpcyBhIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgKGtleSx2YWx1ZSkKKyAqIHBhaXIgaW4gYSBsaW5rZWQgbGlzdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgSHR0cEhlYWRlciB7CisgICAgc3RydWN0IEh0dHBIZWFkZXIqICBuZXh0OworICAgIGNvbnN0IGNoYXIqICAgICAgICAga2V5OworICAgIGNvbnN0IGNoYXIqICAgICAgICAgdmFsdWU7Cit9IEh0dHBIZWFkZXI7CisKK3N0YXRpYyB2b2lkCitodHRwX2hlYWRlcl9mcmVlKCBIdHRwSGVhZGVyKiAgaCApCit7CisgICAgaWYgKGgpIHsKKyAgICAgICAgZnJlZSgoY2hhciopaC0+dmFsdWUpOworICAgICAgICBmcmVlKGgpOworICAgIH0KK30KKworc3RhdGljIGludAoraHR0cF9oZWFkZXJfYXBwZW5kKCBIdHRwSGVhZGVyKiAgaCwgY29uc3QgY2hhciogIHZhbHVlICkKK3sKKyAgICBpbnQgICAgb2xkID0gc3RybGVuKGgtPnZhbHVlKTsKKyAgICBpbnQgICAgbmV3ID0gc3RybGVuKHZhbHVlKTsKKyAgICBjaGFyKiAgcyAgID0gcmVhbGxvYygoY2hhciopaC0+dmFsdWUsIG9sZCtuZXcrMSk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShzICsgb2xkLCB2YWx1ZSwgbmV3KzEpOworICAgIGgtPnZhbHVlID0gKGNvbnN0IGNoYXIqKXM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIdHRwSGVhZGVyKgoraHR0cF9oZWFkZXJfYWxsb2MoIGNvbnN0IGNoYXIqICBrZXksIGNvbnN0IGNoYXIqICB2YWx1ZSApCit7CisgICAgaW50ICAgICAgICAgIGxlbiA9IHN0cmxlbihrZXkpKzE7CisgICAgSHR0cEhlYWRlciogIGggICA9IG1hbGxvYyhzaXplb2YoKmgpICsgbGVuKzEpOworICAgIGlmIChoKSB7CisgICAgICAgIGgtPm5leHQgID0gTlVMTDsKKyAgICAgICAgaC0+a2V5ICAgPSAoY29uc3QgY2hhciopKGgrMSk7CisgICAgICAgIG1lbWNweSggKGNoYXIqKWgtPmtleSwga2V5LCBsZW4gKTsKKyAgICAgICAgaC0+dmFsdWUgPSBzdHJkdXAodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gaDsKK30KKworLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKgorICoqICAgSFRUUCBIRUFERVJTIExJU1QKKyAqKgorICoqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSHR0cEhlYWRlciogICBmaXJzdDsKKyAgICBIdHRwSGVhZGVyKiAgIGxhc3Q7Cit9IEh0dHBIZWFkZXJMaXN0OworCitzdGF0aWMgdm9pZAoraHR0cF9oZWFkZXJfbGlzdF9pbml0KCBIdHRwSGVhZGVyTGlzdCogIGwgKQoreworICAgIGwtPmZpcnN0ID0gbC0+bGFzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitodHRwX2hlYWRlcl9saXN0X2RvbmUoIEh0dHBIZWFkZXJMaXN0KiAgbCApCit7CisgICAgd2hpbGUgKGwtPmZpcnN0KSB7CisgICAgICAgIEh0dHBIZWFkZXIqICBoID0gbC0+Zmlyc3Q7CisgICAgICAgIGwtPmZpcnN0ID0gaC0+bmV4dDsKKyAgICAgICAgaHR0cF9oZWFkZXJfZnJlZShoKTsKKyAgICB9CisgICAgbC0+bGFzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCitodHRwX2hlYWRlcl9saXN0X2FkZCggSHR0cEhlYWRlckxpc3QqICBsLAorICAgICAgICAgICAgICAgICAgICAgIEh0dHBIZWFkZXIqICAgICAgaCApCit7CisgICAgaWYgKCFsLT5maXJzdCkgeworICAgICAgICBsLT5maXJzdCA9IGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbC0+bGFzdC0+bmV4dCA9IGg7CisgICAgfQorICAgIGgtPm5leHQgPSBOVUxMOworICAgIGwtPmxhc3QgPSBoOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2h0dHBfaGVhZGVyX2xpc3RfZmluZCggSHR0cEhlYWRlckxpc3QqICBsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgIGtleSApCit7CisgICAgSHR0cEhlYWRlciogIGg7CisgICAgZm9yIChoID0gbC0+Zmlyc3Q7IGg7IGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoIXN0cmNhc2VjbXAoaC0+a2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGgtPnZhbHVlOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioKKyAqKiAgIEhUVFAgUkVRVUVTVCBBTkQgUkVQTFkKKyAqKgorICoqLworCit0eXBlZGVmIGVudW0geworICAgIEhUVFBfUkVRVUVTVF9VTlNVUFBPUlRFRCA9IDAsCisgICAgSFRUUF9SRVFVRVNUX0dFVCwKKyAgICBIVFRQX1JFUVVFU1RfSEVBRCwKKyAgICBIVFRQX1JFUVVFU1RfUE9TVCwKKyAgICBIVFRQX1JFUVVFU1RfUFVULAorICAgIEhUVFBfUkVRVUVTVF9ERUxFVEUsCit9IEh0dHBSZXF1ZXN0VHlwZTsKKworLyogSHR0cFJlcXVlc3QgaXMgdXNlZCBib3RoIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMKKyAqIHJlcXVlc3QgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHJlcGx5CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBIdHRwUmVxdWVzdFR5cGUgICByZXFfdHlwZTsgICAgIC8qIHJlcXVlc3QgdHlwZSAqLworICAgIGNoYXIqICAgICAgICAgICAgIHJlcV9tZXRob2Q7ICAgLyogIkdFVCIsICJQT1NUIiwgIkhFQUQiLCBldGMuLi4gKi8KKyAgICBjaGFyKiAgICAgICAgICAgICByZXFfdXJpOyAgICAgIC8qIHRoZSByZXF1ZXN0IFVSSSAqLworICAgIGNoYXIqICAgICAgICAgICAgIHJlcV92ZXJzaW9uOyAgLyogIkhUVFAvMS4wIiBvciAiSFRUUC8xLjEiICovCisgICAgY2hhciogICAgICAgICAgICAgcmVwX3ZlcnNpb247ICAvKiByZXBseSB2ZXJzaW9uIHN0cmluZyAqLworICAgIGludCAgICAgICAgICAgICAgIHJlcF9jb2RlOyAgICAgLyogcmVwbHkgY29kZSBhcyBkZWNpbWFsICovCisgICAgY2hhciogICAgICAgICAgICAgcmVwX3JlYWRhYmxlOyAvKiBodW1hbi1mcmllbmRseSByZXBseS9lcnJvciBtZXNzYWdlICovCisgICAgSHR0cEhlYWRlckxpc3QgICAgaGVhZGVyc1sxXTsgICAvKiBoZWFkZXJzICovCit9IEh0dHBSZXF1ZXN0OworCisKK3N0YXRpYyBIdHRwUmVxdWVzdCoKK2h0dHBfcmVxdWVzdF9hbGxvYyggY29uc3QgY2hhciogICAgICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgIHZlcnNpb24gKQoreworICAgIEh0dHBSZXF1ZXN0KiAgciA9IG1hbGxvYyhzaXplb2YoKnIpKTsKKworICAgIHItPnJlcV9tZXRob2QgICA9IHN0cmR1cChtZXRob2QpOworICAgIHItPnJlcV91cmkgICAgICA9IHN0cmR1cCh1cmkpOworICAgIHItPnJlcV92ZXJzaW9uICA9IHN0cmR1cCh2ZXJzaW9uKTsKKyAgICByLT5yZXBfdmVyc2lvbiAgPSBOVUxMOworICAgIHItPnJlcF9jb2RlICAgICA9IC0xOworICAgIHItPnJlcF9yZWFkYWJsZSA9IE5VTEw7CisKKyAgICBpZiAoIXN0cmNtcChtZXRob2QsIkdFVCIpKSB7CisgICAgICAgIHItPnJlcV90eXBlID0gSFRUUF9SRVFVRVNUX0dFVDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCJQT1NUIikpIHsKKyAgICAgICAgci0+cmVxX3R5cGUgPSBIVFRQX1JFUVVFU1RfUE9TVDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCJIRUFEIikpIHsKKyAgICAgICAgci0+cmVxX3R5cGUgPSBIVFRQX1JFUVVFU1RfSEVBRDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0aG9kLCJQVVQiKSkgeworICAgICAgICByLT5yZXFfdHlwZSA9IEhUVFBfUkVRVUVTVF9QVVQ7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG1ldGhvZCwiREVMRVRFIikpIHsKKyAgICAgICAgci0+cmVxX3R5cGUgPSBIVFRQX1JFUVVFU1RfREVMRVRFOworICAgIH0gZWxzZQorICAgICAgICByLT5yZXFfdHlwZSA9IEhUVFBfUkVRVUVTVF9VTlNVUFBPUlRFRDsKKworICAgIGh0dHBfaGVhZGVyX2xpc3RfaW5pdChyLT5oZWFkZXJzKTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQKK2h0dHBfcmVxdWVzdF9yZXBsYWNlX3VyaSggSHR0cFJlcXVlc3QqICByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgIHVyaSApCit7CisgICAgY29uc3QgY2hhciogIG9sZCA9IHItPnJlcV91cmk7CisgICAgci0+cmVxX3VyaSA9IHN0cmR1cCh1cmkpOworICAgIGZyZWUoKGNoYXIqKW9sZCk7Cit9CisKK3N0YXRpYyB2b2lkCitodHRwX3JlcXVlc3RfZnJlZSggSHR0cFJlcXVlc3QqICByICkKK3sKKyAgICBpZiAocikgeworICAgICAgICBodHRwX2hlYWRlcl9saXN0X2RvbmUoci0+aGVhZGVycyk7CisKKyAgICAgICAgZnJlZShyLT5yZXFfbWV0aG9kKTsKKyAgICAgICAgZnJlZShyLT5yZXFfdXJpKTsKKyAgICAgICAgZnJlZShyLT5yZXFfdmVyc2lvbik7CisgICAgICAgIGZyZWUoci0+cmVwX3ZlcnNpb24pOworICAgICAgICBmcmVlKHItPnJlcF9yZWFkYWJsZSk7CisgICAgICAgIGZyZWUocik7CisgICAgfQorfQorCitzdGF0aWMgY2hhcioKK2h0dHBfcmVxdWVzdF9maW5kX2hlYWRlciggSHR0cFJlcXVlc3QqICByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgIGtleSApCit7CisgICAgcmV0dXJuIChjaGFyKilodHRwX2hlYWRlcl9saXN0X2ZpbmQoci0+aGVhZGVycywga2V5KTsKK30KKworCitzdGF0aWMgaW50CitodHRwX3JlcXVlc3RfYWRkX2hlYWRlciggSHR0cFJlcXVlc3QqICByLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgdmFsdWUgKQoreworICAgIEh0dHBIZWFkZXIqICBoID0gaHR0cF9oZWFkZXJfYWxsb2Moa2V5LHZhbHVlKTsKKyAgICBpZiAoaCkgeworICAgICAgICBodHRwX2hlYWRlcl9saXN0X2FkZChyLT5oZWFkZXJzLCBoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAoraHR0cF9yZXF1ZXN0X2FkZF90b19sYXN0X2hlYWRlciggSHR0cFJlcXVlc3QqICByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBsaW5lICkKK3sKKyAgICBpZiAoci0+aGVhZGVycy0+bGFzdCkgeworICAgICAgICByZXR1cm4gaHR0cF9oZWFkZXJfYXBwZW5kKCByLT5oZWFkZXJzLT5sYXN0LCBsaW5lICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGludAoraHR0cF9yZXF1ZXN0X3NldF9yZXBseSggSHR0cFJlcXVlc3QqICByLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICByZWFkYWJsZSApCit7CisgICAgaWYgKHN0cmNtcCh2ZXJzaW9uLCJIVFRQLzEuMCIpICYmIHN0cmNtcCh2ZXJzaW9uLCJIVFRQLzEuMSIpKSB7CisgICAgICAgIFBST1hZX0xPRygiJXM6IGJhZCByZXBseSBwcm90b2NvbDogJXMiLCBfX0ZVTkNUSU9OX18sIHZlcnNpb24pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHItPnJlcF9jb2RlID0gYXRvaShjb2RlKTsKKyAgICBpZiAoci0+cmVwX2NvZGUgPT0gMCkgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBiYWQgcmVwbHkgY29kZTogJWQiLCBfX0ZVTkNUSU9OX18sIGNvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgci0+cmVwX3ZlcnNpb24gID0gc3RyZHVwKHZlcnNpb24pOworICAgIHItPnJlcF9yZWFkYWJsZSA9IHN0cmR1cChyZWFkYWJsZSk7CisKKyAgICAvKiByZXNldCB0aGUgbGlzdCBvZiBoZWFkZXJzICovCisgICAgaHR0cF9oZWFkZXJfbGlzdF9kb25lKHItPmhlYWRlcnMpOworICAgIHJldHVybiAwOworfQorCisvKiogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqCisgKiogICBSRVdSSVRFUiBDT05ORUNUSU9OCisgKioKKyAqKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBTVEFURV9DT05ORUNUSU5HID0gMCwKKyAgICBTVEFURV9DUkVBVEVfU09DS0VUX1BBSVIsCisgICAgU1RBVEVfUkVRVUVTVF9GSVJTVF9MSU5FLAorICAgIFNUQVRFX1JFUVVFU1RfSEVBREVSUywKKyAgICBTVEFURV9SRVFVRVNUX1NFTkQsCisgICAgU1RBVEVfUkVRVUVTVF9CT0RZLAorICAgIFNUQVRFX1JFUExZX0ZJUlNUX0xJTkUsCisgICAgU1RBVEVfUkVQTFlfSEVBREVSUywKKyAgICBTVEFURV9SRVBMWV9TRU5ELAorICAgIFNUQVRFX1JFUExZX0JPRFksCit9IENvbm5lY3Rpb25TdGF0ZTsKKworLyogcm9vdC0+c29ja2V0IGlzIGNvbm5lY3RlZCB0byB0aGUgcHJveHkgc2VydmVyLiB3aGlsZQorICogc2xpcnBfZmQgaXMgY29ubmVjdGVkIHRvIHRoZSBzbGlycCBjb2RlIHRocm91Z2ggYQorICogc29ja2V0X3BhaXIoKSB3ZSBjcmVhdGVkIGZvciB0aGlzIHNwZWNpZmljIHB1cnBvc2UuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKyAgICBCT0RZX05PTkUgPSAwLAorICAgIEJPRFlfS05PV05fTEVOR1RILAorICAgIEJPRFlfVU5USUxfQ0xPU0UsCisgICAgQk9EWV9DSFVOS0VELAorICAgIEJPRFlfTU9ERV9NQVgKK30gQm9keU1vZGU7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCAgYm9keV9tb2RlX3N0cltCT0RZX01PREVfTUFYXSA9IHsKKyAgICAiTk9ORSIsICJLTk9XTl9MRU5HVEgiLCAiVU5USUxfQ0xPU0UiLCAiQ0hVTktFRCIKK307CisKK2VudW0geworICAgIENIVU5LX0hFQURFUiwgICAgLy8gV2FpdGluZyBmb3IgYSBjaHVuayBoZWFkZXIgKyBDUiBMRgorICAgIENIVU5LX0RBVEEsICAgICAgLy8gV2FpdGluZyBmb3IgY2h1bmsgZGF0YQorICAgIENIVU5LX0RBVEFfRU5ELCAgLy8gV2FpdGluZyBmb3IgdGhlIENSIExGIGFmdGVyIHRoZSBjaHVuayBkYXRhCisgICAgQ0hVTktfVFJBSUxFUiAgICAvLyBXYWl0aW5nIGZvciB0aGUgY2h1bmsgdHJhaWxlciArIENSIExGCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHJveHlDb25uZWN0aW9uICAgcm9vdFsxXTsKKyAgICBMb29wSW8qICAgICAgICAgICBzbGlycF9pbzsKKyAgICBDb25uZWN0aW9uU3RhdGUgICBzdGF0ZTsKKyAgICBIdHRwUmVxdWVzdCogICAgICByZXF1ZXN0OworICAgIEJvZHlNb2RlICAgICAgICAgIGJvZHlfbW9kZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICBib2R5X2xlbmd0aDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBib2R5X3RvdGFsOworICAgIGludDY0X3QgICAgICAgICAgIGJvZHlfc2VudDsKKyAgICBpbnQ2NF90ICAgICAgICAgICBjaHVua19sZW5ndGg7CisgICAgaW50NjRfdCAgICAgICAgICAgY2h1bmtfdG90YWw7CisgICAgaW50ICAgICAgICAgICAgICAgY2h1bmtfc3RhdGU7CisgICAgY2hhciAgICAgICAgICAgICAgYm9keV9oYXNfZGF0YTsKKyAgICBjaGFyICAgICAgICAgICAgICBib2R5X2lzX2Z1bGw7CisgICAgY2hhciAgICAgICAgICAgICAgYm9keV9pc19jbG9zZWQ7CisgICAgY2hhciAgICAgICAgICAgICAgcGFyc2VfY2h1bmtfaGVhZGVyOworICAgIGNoYXIgICAgICAgICAgICAgIHBhcnNlX2NodW5rX3RyYWlsZXI7Cit9IFJld3JpdGVDb25uZWN0aW9uOworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK3N0YXRpYyB2b2lkIHJld3JpdGVfY29ubmVjdGlvbl9zZXRfc3RhdGUoUmV3cml0ZUNvbm5lY3Rpb24qIGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25TdGF0ZSBzdGF0ZSk7CisKK3N0YXRpYyB2b2lkIHJld3JpdGVfY29ubmVjdGlvbl9pb19ldmVudCh2b2lkKiBvcGFxdWUsIGludCBmZCwgdW5zaWduZWQgZXZlbnRzKTsKKworc3RhdGljIHZvaWQKK3Jld3JpdGVfY29ubmVjdGlvbl9mcmVlKCBQcm94eUNvbm5lY3Rpb24qICByb290ICkKK3sKKyAgICBSZXdyaXRlQ29ubmVjdGlvbiogIGNvbm4gPSAoUmV3cml0ZUNvbm5lY3Rpb24qKXJvb3Q7CisKKyAgICBpZiAoY29ubi0+c2xpcnBfaW8pIHsKKyAgICAgICAgaW50IGZkID0gbG9vcElvX2ZkKGNvbm4tPnNsaXJwX2lvKTsKKyAgICAgICAgbG9vcElvX2ZyZWUoY29ubi0+c2xpcnBfaW8pOworICAgICAgICBjb25uLT5zbGlycF9pbyA9IE5VTEw7CisgICAgICAgIHNvY2tldF9jbG9zZShmZCk7CisgICAgfQorICAgIGh0dHBfcmVxdWVzdF9mcmVlKGNvbm4tPnJlcXVlc3QpOworICAgIHByb3h5X2Nvbm5lY3Rpb25fZG9uZShyb290KTsKKyAgICBmcmVlKGNvbm4pOworfQorCisKK3N0YXRpYyBpbnQKK3Jld3JpdGVfY29ubmVjdGlvbl9pbml0KCBSZXdyaXRlQ29ubmVjdGlvbiogICBjb25uICkKK3sKKyAgICBIdHRwU2VydmljZSogICAgICBzZXJ2aWNlID0gKEh0dHBTZXJ2aWNlKikgY29ubi0+cm9vdC0+c2VydmljZTsKKyAgICBQcm94eUNvbm5lY3Rpb24qICByb290ICAgID0gY29ubi0+cm9vdDsKKyAgICBpbnQgcHJveHlfZmQgPSBsb29wSW9fZmQocm9vdC0+aW8pOworCisgICAgY29ubi0+c2xpcnBfaW8gPSBOVUxMOworICAgIGNvbm4tPnN0YXRlICAgID0gU1RBVEVfQ09OTkVDVElORzsKKworICAgIGlmIChzb2NrZXRfY29ubmVjdChwcm94eV9mZCwgJnNlcnZpY2UtPnNlcnZlcl9hZGRyICkgPT0gMCkgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBpbW1lZGlhdGUgY29ubmVjdGlvbiIsIHJvb3QtPm5hbWUpOworICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25fc2V0X3N0YXRlKGNvbm4sIFNUQVRFX0NSRUFURV9TT0NLRVRfUEFJUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZXJybm8gIT0gRUlOUFJPR1JFU1MgJiYgZXJybm8gIT0gRVdPVUxEQkxPQ0sgJiYgZXJybm8gIT0gRUFHQUlOKSB7CisgICAgICAgIFBST1hZX0xPRygiJXM6IGNhbm5vdCBjb25uZWN0IHRvIHByb3h5OiAlcyIsIHJvb3QtPm5hbWUsIGVycm5vX3N0cik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUFJPWFlfTE9HKCIlczogY29ubmVjdGluZyIsIGNvbm4tPnJvb3QtPm5hbWUpOworICAgIGxvb3BJb193YW50V3JpdGUocm9vdC0+aW8pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CityZXdyaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX3NvY2tldHMoIFJld3JpdGVDb25uZWN0aW9uKiAgY29ubiApCit7CisgICAgLyogaW1tZWRpYXRlIGNvbm5lY3Rpb24gdG8gdGhlIHByb3h5LiBub3cgY3JlYXRlIGEgc29ja2V0CisgICAgICAgICogcGFpciBhbmQgc2VuZCBhICdzdWNjZXNzJyBldmVudCB0byBzbGlycCAqLworICAgIGludCAgICAgICAgICAgICAgIHNsaXJwXzEsIHNsaXJwXzI7CisgICAgUHJveHlDb25uZWN0aW9uKiAgcm9vdCA9IGNvbm4tPnJvb3Q7CisKKyAgICBpZiAoc29ja2V0X3BhaXIoICZzbGlycF8xLCAmc2xpcnBfMiApIDwgMCkgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBjb3VsdCBub3QgY3JlYXRlIHNvY2tldCBwYWlyOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUsIGVycm5vX3N0cik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjb25uLT5zbGlycF9pbyA9IGxvb3BJb19uZXcobG9vcGVyX2dldEZvclRocmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlycF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25faW9fZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4pOworICAgIHJvb3QtPmV2X2Z1bmMoIHJvb3QtPmV2X29wYXF1ZSwgc2xpcnBfMSwgUFJPWFlfRVZFTlRfQ09OTkVDVEVEICk7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogcmVhZCB0aGUgZmlyc3QgbGluZSBvZiBhIGdpdmVuIEhUVFAgcmVxdWVzdC4gcmV0dXJucyAtMS8wLysxICovCitzdGF0aWMgRGF0YVN0YXR1cworcmV3cml0ZV9jb25uZWN0aW9uX3JlYWRfcmVxdWVzdCggUmV3cml0ZUNvbm5lY3Rpb24qICBjb25uICkKK3sKKyAgICBQcm94eUNvbm5lY3Rpb24qICByb290ID0gY29ubi0+cm9vdDsKKyAgICBEYXRhU3RhdHVzICAgICAgICByZXQ7CisKKyAgICByZXQgPSBwcm94eV9jb25uZWN0aW9uX3JlY2VpdmVfbGluZShyb290LCBsb29wSW9fZmQoY29ubi0+c2xpcnBfaW8pKTsKKyAgICBpZiAocmV0ID09IERBVEFfQ09NUExFVEVEKSB7CisgICAgICAgIC8qIG5vdyBwYXJzZSB0aGUgZmlyc3QgbGluZSB0byBzZWUgaWYgd2UgY2FuIGhhbmRsZSBpdCAqLworICAgICAgICBjaGFyKiAgbGluZSAgID0gcm9vdC0+c3RyLT5zOworICAgICAgICBjaGFyKiAgbWV0aG9kOworICAgICAgICBjaGFyKiAgdXJpOworICAgICAgICBjaGFyKiAgdmVyc2lvbjsKKyAgICAgICAgY2hhciogIHAgPSBsaW5lOworCisgICAgICAgIG1ldGhvZCA9IHN0cnNlcCgmcCwgIiAiKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogY2FuJ3QgcGFyc2UgbWV0aG9kIGluICclJyIsCisgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgbGluZSk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB1cmkgPSBzdHJzZXAoJnAsICIgIik7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFBST1hZX0xPRyggIiVzOiBjYW4ndCBwYXJzZSBVUkkgaW4gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUsIGxpbmUpOworICAgICAgICAgICAgcmV0dXJuIERBVEFfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgdmVyc2lvbiA9IHN0cnNlcCgmcCwgIiAiKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgUFJPWFlfTE9HKCAiJXM6IGV4dHJhIGRhdGEgYWZ0ZXIgdmVyc2lvbiBpbiAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgbGluZSk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29ubi0+cmVxdWVzdCkKKyAgICAgICAgICAgIGh0dHBfcmVxdWVzdF9mcmVlKGNvbm4tPnJlcXVlc3QpOworCisgICAgICAgIGNvbm4tPnJlcXVlc3QgPSBodHRwX3JlcXVlc3RfYWxsb2MoIG1ldGhvZCwgdXJpLCB2ZXJzaW9uICk7CisgICAgICAgIGlmICghY29ubi0+cmVxdWVzdCkKKyAgICAgICAgICAgIHJldHVybiBEQVRBX0VSUk9SOworCisgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fcmV3aW5kKHJvb3QpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBEYXRhU3RhdHVzCityZXdyaXRlX2Nvbm5lY3Rpb25fcmVhZF9yZXBseSggUmV3cml0ZUNvbm5lY3Rpb24qICBjb25uLCBpbnQgZmQgKQoreworICAgIFByb3h5Q29ubmVjdGlvbiogIHJvb3QgPSBjb25uLT5yb290OworICAgIERhdGFTdGF0dXMgICAgICAgIHJldDsKKworICAgIHJldCA9IHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZV9saW5lKCByb290LCBmZCApOworICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgSHR0cFJlcXVlc3QqICByZXF1ZXN0ID0gY29ubi0+cmVxdWVzdDsKKworICAgICAgICBjaGFyKiAgbGluZSA9IHN0cmFsbG9jX2NzdHIoIHJvb3QtPnN0ciApOworICAgICAgICBjaGFyKiAgcCA9IGxpbmU7CisgICAgICAgIGNoYXIqICBwcm90b2NvbDsKKyAgICAgICAgY2hhciogIG51bWJlcjsKKyAgICAgICAgY2hhciogIHJlYWRhYmxlOworCisgICAgICAgIHByb3RvY29sID0gc3Ryc2VwKCZwLCAiICIpOworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBjYW4ndCBwYXJzZSByZXNwb25zZSBwcm90b2NvbDogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgbGluZSk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBudW1iZXIgPSBzdHJzZXAoJnAsICIgIik7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNhbid0IHBhcnNlIHJlc3BvbnNlIG51bWJlcjogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgbGluZSk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWFkYWJsZSA9IHA7CisKKyAgICAgICAgaWYgKGh0dHBfcmVxdWVzdF9zZXRfcmVwbHkocmVxdWVzdCwgcHJvdG9jb2wsIG51bWJlciwgcmVhZGFibGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBEQVRBX0VSUk9SOworCisgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fcmV3aW5kKHJvb3QpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBEYXRhU3RhdHVzCityZXdyaXRlX2Nvbm5lY3Rpb25fcmVhZF9oZWFkZXJzKCBSZXdyaXRlQ29ubmVjdGlvbiogICBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgZmQgKQoreworICAgIGludCAgICAgICAgICAgICAgIHJldDsKKyAgICBQcm94eUNvbm5lY3Rpb24qICByb290ID0gY29ubi0+cm9vdDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciogICAgICAgIGxpbmU7CisgICAgICAgIHN0cmFsbG9jX3QqICBzdHIgPSByb290LT5zdHI7CisKKyAgICAgICAgcmV0ID0gcHJveHlfY29ubmVjdGlvbl9yZWNlaXZlX2xpbmUocm9vdCwgZmQpOworICAgICAgICBpZiAocmV0ICE9IERBVEFfQ09NUExFVEVEKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3RyLT5uID0gMDsKKyAgICAgICAgbGluZSAgID0gc3RyLT5zOworCisgICAgICAgIGlmIChsaW5lWzBdID09IDApIHsKKyAgICAgICAgICAgIC8qIGFuIGVtcHR5IGxpbmUgbWVhbnMgdGhlIGVuZCBvZiBoZWFkZXJzICovCisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBpdCB0aGlzIGEgY29udGludWF0aW9uID8gKi8KKyAgICAgICAgaWYgKGxpbmVbMF0gPT0gJyAnIHx8IGxpbmVbMF0gPT0gJ1x0JykgeworICAgICAgICAgICAgcmV0ID0gaHR0cF9yZXF1ZXN0X2FkZF90b19sYXN0X2hlYWRlciggY29ubi0+cmVxdWVzdCwgbGluZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciogIGtleTsKKyAgICAgICAgICAgIGNoYXIqICB2YWx1ZTsKKworICAgICAgICAgICAgdmFsdWUgPSBsaW5lOworICAgICAgICAgICAga2V5ICAgPSBzdHJzZXAoJnZhbHVlLCAiOiIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBjYW4ndCBwYXJzZSBoZWFkZXIgJyVzJyIsIHJvb3QtPm5hbWUsIGxpbmUpOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgKz0gc3Ryc3BuKHZhbHVlLCAiICIpOworICAgICAgICAgICAgaWYgKGh0dHBfcmVxdWVzdF9hZGRfaGVhZGVyKGNvbm4tPnJlcXVlc3QsIGtleSwgdmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IERBVEFfRVJST1IpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcmV3cml0ZV9jb25uZWN0aW9uX3Jld3JpdGVfcmVxdWVzdCggUmV3cml0ZUNvbm5lY3Rpb24qICBjb25uICkKK3sKKyAgICBQcm94eUNvbm5lY3Rpb24qIHJvb3QgICAgPSBjb25uLT5yb290OworICAgIEh0dHBTZXJ2aWNlKiAgICAgc2VydmljZSA9IChIdHRwU2VydmljZSopIHJvb3QtPnNlcnZpY2U7CisgICAgSHR0cFJlcXVlc3QqICAgICByICAgICAgID0gY29ubi0+cmVxdWVzdDsKKyAgICBzdHJhbGxvY190KiAgICAgIHN0ciAgICAgPSByb290LT5zdHI7CisgICAgSHR0cEhlYWRlciogICAgICBoOworCisgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQoY29ubi0+cm9vdCk7CisKKyAgICAvKiBvbmx5IHJld3JpdGUgdGhlIFVSSSBpZiBpdCBpcyBub3QgYWJzb2x1dGUgKi8KKyAgICBpZiAoci0+cmVxX3VyaVswXSA9PSAnLycpIHsKKyAgICAgICAgY2hhciogIGhvc3QgPSBodHRwX3JlcXVlc3RfZmluZF9oZWFkZXIociwgIkhvc3QiKTsKKyAgICAgICAgaWYgKGhvc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogdWggb2gsIG5vdCBIb3N0OiBpbiByZXF1ZXN0ID8iLCByb290LT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vdyBjcmVhdGUgbmV3IFVSSSAqLworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX3N0cihzdHIsICJodHRwOi8vIik7CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfc3RyKHN0ciwgaG9zdCk7CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfc3RyKHN0ciwgci0+cmVxX3VyaSk7CisgICAgICAgICAgICBodHRwX3JlcXVlc3RfcmVwbGFjZV91cmkociwgc3RyYWxsb2NfY3N0cihzdHIpKTsKKyAgICAgICAgICAgIHByb3h5X2Nvbm5lY3Rpb25fcmV3aW5kKHJvb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyYWxsb2NfZm9ybWF0KCBzdHIsICIlcyAlcyAlc1xyXG4iLCByLT5yZXFfbWV0aG9kLCByLT5yZXFfdXJpLCByLT5yZXFfdmVyc2lvbiApOworICAgIGZvciAoaCA9IHItPmhlYWRlcnMtPmZpcnN0OyBoOyBoID0gaC0+bmV4dCkgeworICAgICAgICBzdHJhbGxvY19hZGRfZm9ybWF0KCBzdHIsICIlczogJXNcclxuIiwgaC0+a2V5LCBoLT52YWx1ZSApOworICAgIH0KKyAgICAvKiBhZGQgdGhlIHNlcnZpY2UncyBmb290ZXIgLSBpbmNsdWRlcyBmaW5hbCBcclxuICovCisgICAgc3RyYWxsb2NfYWRkX2J5dGVzKCBzdHIsIHNlcnZpY2UtPmZvb3Rlciwgc2VydmljZS0+Zm9vdGVyX2xlbiApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Jld3JpdGVfY29ubmVjdGlvbl9yZXdyaXRlX3JlcGx5KCBSZXdyaXRlQ29ubmVjdGlvbiogIGNvbm4gKQoreworICAgIEh0dHBSZXF1ZXN0KiAgICAgciAgICA9IGNvbm4tPnJlcXVlc3Q7CisgICAgUHJveHlDb25uZWN0aW9uKiByb290ID0gY29ubi0+cm9vdDsKKyAgICBzdHJhbGxvY190KiAgICAgIHN0ciAgPSByb290LT5zdHI7CisgICAgSHR0cEhlYWRlciogICAgICBoOworCisgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQocm9vdCk7CisgICAgc3RyYWxsb2NfZm9ybWF0KHN0ciwgIiVzICVkICVzXHJcbiIsIHItPnJlcF92ZXJzaW9uLCByLT5yZXBfY29kZSwgci0+cmVwX3JlYWRhYmxlKTsKKyAgICBmb3IgKGggPSByLT5oZWFkZXJzLT5maXJzdDsgaDsgaCA9IGgtPm5leHQpIHsKKyAgICAgICAgc3RyYWxsb2NfYWRkX2Zvcm1hdChzdHIsICIlczogJXNcclxuIiwgaC0+a2V5LCBoLT52YWx1ZSk7CisgICAgfQorICAgIHN0cmFsbG9jX2FkZF9zdHIoc3RyLCAiXHJcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcmV3cml0ZV9jb25uZWN0aW9uX2dldF9ib2R5X2xlbmd0aCggUmV3cml0ZUNvbm5lY3Rpb24qICBjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBpc19yZXF1ZXN0ICkKK3sKKyAgICBIdHRwUmVxdWVzdCogICAgICByICAgID0gY29ubi0+cmVxdWVzdDsKKyAgICBQcm94eUNvbm5lY3Rpb24qICByb290ID0gY29ubi0+cm9vdDsKKyAgICBjaGFyKiAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDsKKyAgICBjaGFyKiAgICAgICAgICAgICB0cmFuc2Zlcl9lbmNvZGluZzsKKworICAgIGNvbm4tPmJvZHlfbW9kZSAgICAgID0gQk9EWV9OT05FOworICAgIGNvbm4tPmJvZHlfbGVuZ3RoICAgID0gMDsKKyAgICBjb25uLT5ib2R5X3RvdGFsICAgICA9IDA7CisgICAgY29ubi0+Ym9keV9zZW50ICAgICAgPSAwOworICAgIGNvbm4tPmJvZHlfaXNfY2xvc2VkID0gMDsKKyAgICBjb25uLT5ib2R5X2lzX2Z1bGwgICA9IDA7CisgICAgY29ubi0+Ym9keV9oYXNfZGF0YSAgPSAwOworCisgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQocm9vdCk7CisKKyAgICBpZiAoaXNfcmVxdWVzdCkgeworICAgICAgICAvKiBvbmx5IFBPU1QgYW5kIFBVVCBzaG91bGQgaGF2ZSBhIGJvZHkgKi8KKyAgICAgICAgaWYgKHItPnJlcV90eXBlICE9IEhUVFBfUkVRVUVTVF9QT1NUICYmCisgICAgICAgICAgICByLT5yZXFfdHlwZSAhPSBIVFRQX1JFUVVFU1RfUFVUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEhUVFAgMS4xIFNlY3Rpb24gNC4zIE1lc3NhZ2UgQm9keSBzdGF0ZXMgdGhhdCBIRUFEIHJlcXVlc3RzIG11c3Qgbm90IGhhdmUKKyAgICAgICAgKiBhIG1lc3NhZ2UgYm9keSwgYXMgd2VsbCBhcyBhbnkgMXh4LCAyMDQgYW5kIDMwNCByZXBsaWVzICovCisgICAgICAgIGlmIChyLT5yZXFfdHlwZSA9PSBIVFRQX1JFUVVFU1RfSEVBRCB8fCByLT5yZXBfY29kZS8xMDAgPT0gMSB8fAorICAgICAgICAgICAgci0+cmVwX2NvZGUgPT0gMjA0IHx8IHItPnJlcF9jb2RlID09IDMwNCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnRlbnRfbGVuZ3RoID0gaHR0cF9yZXF1ZXN0X2ZpbmRfaGVhZGVyKHIsICJDb250ZW50LUxlbmd0aCIpOworICAgIGlmIChjb250ZW50X2xlbmd0aCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIqICAgIGVuZDsKKyAgICAgICAgaW50NjRfdCAgYm9keV9sZW4gPSBzdHJ0b2xsKCBjb250ZW50X2xlbmd0aCwgJmVuZCwgMTAgKTsKKyAgICAgICAgaWYgKCplbmQgIT0gJ1wwJyB8fCAqY29udGVudF9sZW5ndGggPT0gJ1wwJyB8fCBib2R5X2xlbiA8IDApIHsKKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGJhZCBjb250ZW50IGxlbmd0aDogJXMiLCByb290LT5uYW1lLCBjb250ZW50X2xlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYm9keV9sZW4gPiAwKSB7CisgICAgICAgICAgICBjb25uLT5ib2R5X21vZGUgICA9IEJPRFlfS05PV05fTEVOR1RIOworICAgICAgICAgICAgY29ubi0+Ym9keV9sZW5ndGggPSBib2R5X2xlbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRyYW5zZmVyX2VuY29kaW5nID0gaHR0cF9yZXF1ZXN0X2ZpbmRfaGVhZGVyKHIsICJUcmFuc2Zlci1FbmNvZGluZyIpOworICAgICAgICBpZiAodHJhbnNmZXJfZW5jb2RpbmcgJiYgIXN0cmNhc2VjbXAodHJhbnNmZXJfZW5jb2RpbmcsICJDaHVua2VkIikpIHsKKyAgICAgICAgICAgIGNvbm4tPmJvZHlfbW9kZSAgICAgICAgICAgPSBCT0RZX0NIVU5LRUQ7CisgICAgICAgICAgICBjb25uLT5wYXJzZV9jaHVua19oZWFkZXIgID0gMDsKKyAgICAgICAgICAgIGNvbm4tPnBhcnNlX2NodW5rX3RyYWlsZXIgPSAwOworICAgICAgICAgICAgY29ubi0+Y2h1bmtfbGVuZ3RoICAgICAgICA9IC0xOworICAgICAgICAgICAgY29ubi0+Y2h1bmtfdG90YWwgICAgICAgICA9IDA7CisgICAgICAgICAgICBjb25uLT5jaHVua19zdGF0ZSAgICAgICAgID0gQ0hVTktfSEVBREVSOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb25uLT5ib2R5X21vZGUgPT0gQk9EWV9OT05FKSB7CisgICAgICAgIGNoYXIqICBjb25uZWN0aW9uID0gaHR0cF9yZXF1ZXN0X2ZpbmRfaGVhZGVyKHIsICJQcm94eS1Db25uZWN0aW9uIik7CisKKyAgICAgICAgaWYgKCFjb25uZWN0aW9uKQorICAgICAgICAgICAgY29ubmVjdGlvbiA9IGh0dHBfcmVxdWVzdF9maW5kX2hlYWRlcihyLCAiQ29ubmVjdGlvbiIpOworCisgICAgICAgIGlmICghY29ubmVjdGlvbiB8fCBzdHJjYXNlY21wKGNvbm5lY3Rpb24sICJDbG9zZSIpKSB7CisgICAgICAgICAgICAvKiBodW0sIHdlIGNhbid0IHN1cHBvcnQgdGhpcyBhdCBhbGwgKi8KKyAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNhbid0IGRldGVybWluZSBjb250ZW50IGxlbmd0aCwgYW5kIGNsaWVudCB3YW50cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdG8ga2VlcCBjb25uZWN0aW9uIG9wZW5lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBhIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHRoYXQgdGhlIGRhdGEgZW5kcyB3aGVuIHRoZSBjbGllbnQKKyAgICAgICAgICogZGlzY29ubmVjdHMgdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICAgICAgICBjb25uLT5ib2R5X21vZGUgPSBCT0RZX1VOVElMX0NMT1NFOworICAgIH0KKyAgICBEKCIlczogYm9keV9sZW5ndGg9JWxsZCBib2R5X21vZGU9JXMiLAorICAgICAgcm9vdC0+bmFtZSwgY29ubi0+Ym9keV9sZW5ndGgsCisgICAgICBib2R5X21vZGVfc3RyW2Nvbm4tPmJvZHlfbW9kZV0pOworCisgICAgcHJveHlfY29ubmVjdGlvbl9yZXdpbmQocm9vdCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgIE1BWF9CT0RZX0JVRkZFUiAgNjU1MzYKKworc3RhdGljIERhdGFTdGF0dXMKK3Jld3JpdGVfY29ubmVjdGlvbl9yZWFkX2JvZHkoIFJld3JpdGVDb25uZWN0aW9uKiAgY29ubiwgaW50ICBmZCApCit7CisgICAgUHJveHlDb25uZWN0aW9uKiAgcm9vdCAgID0gY29ubi0+cm9vdDsKKyAgICBzdHJhbGxvY190KiAgICAgICBzdHIgICAgPSByb290LT5zdHI7CisgICAgaW50ICAgICAgICAgICAgICAgd2FudGVkID0gMCwgY3VycmVudCwgYXZhaWw7CisgICAgRGF0YVN0YXR1cyAgICAgICAgcmV0OworCisgICAgaWYgKGNvbm4tPmJvZHlfaXNfY2xvc2VkKSB7CisgICAgICAgIEQoIiVzOiByZWFkX2JvZHkgd2l0aCBjbG9zZWQhIT8iLCByb290LT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIERBVEFfTkVFRF9NT1JFOworICAgIH0KKworICAgIC8qIGZpcnN0LCBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgd2Ugd2FudCB0byByZWFkLiAqLworICAgIHN3aXRjaCAoY29ubi0+Ym9keV9tb2RlKSB7CisgICAgY2FzZSBCT0RZX05PTkU6CisgICAgICAgIEQoIiVzOiBJTlRFUk5BTCBFUlJPUjogU0hPVUxETidUIEJFIFRIRVJFIiwgcm9vdC0+bmFtZSk7CisgICAgICAgIHJldHVybiBEQVRBX0NPTVBMRVRFRDsKKworICAgIGNhc2UgQk9EWV9LTk9XTl9MRU5HVEg6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25uLT5ib2R5X2xlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX0NPTVBMRVRFRDsKKworICAgICAgICAgICAgaWYgKGNvbm4tPmJvZHlfbGVuZ3RoID4gTUFYX0JPRFlfQlVGRkVSKQorICAgICAgICAgICAgICAgIHdhbnRlZCA9IE1BWF9CT0RZX0JVRkZFUjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3YW50ZWQgPSAoaW50KWNvbm4tPmJvZHlfbGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBCT0RZX1VOVElMX0NMT1NFOgorICAgICAgICB3YW50ZWQgPSBNQVhfQk9EWV9CVUZGRVI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBCT0RZX0NIVU5LRUQ6CisgICAgICAgIGlmIChjb25uLT5jaHVua19zdGF0ZSA9PSBDSFVOS19EQVRBX0VORCkgeworICAgICAgICAgICAgLyogV2UncmUgd2FpdGluZyBmb3IgdGhlIENSIExGIGFmdGVyIHRoZSBjaHVuayBkYXRhICovCisgICAgICAgICAgICByZXQgPSBwcm94eV9jb25uZWN0aW9uX3JlY2VpdmVfbGluZShyb290LCBmZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IERBVEFfQ09NUExFVEVEKSB7CisgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogcmVjZWl2ZSBsaW5lIHRvbyBlYXJseSByZXQ9JWQiLCByb290LT5uYW1lLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHItPnNbMF0gIT0gMCkgeyAvKiB0aGlzIHNob3VsZCBiZSBhbiBlbXB0eSBsaW5lICovCisgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogaW52YWxpZCBjaHVuayBkYXRhIGVuZDogJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgc3RyLT5zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gREFUQV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZV9saW5lKCkgZGlkIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICogdHJhaWxpbmcgXHJcbiwgYnV0IHdlIG11c3QgcHJlc2VydmUgaXQgd2hlbiB3ZQorICAgICAgICAgICAgKiBzZW5kIHRoZSBjaHVuayBzaXplIGVuZCB0byB0aGUgcHJveHkuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX3N0cihyb290LT5zdHIsICJcclxuIik7CisgICAgICAgICAgICBjb25uLT5jaHVua19zdGF0ZSA9IENIVU5LX0hFQURFUjsKKyAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbm4tPmNodW5rX3N0YXRlID09IENIVU5LX0hFQURFUikgeworICAgICAgICAgICAgY2hhciogICAgICBsaW5lOworICAgICAgICAgICAgY2hhciogICAgICBlbmQ7CisgICAgICAgICAgICBsb25nIGxvbmcgIGxlbmd0aDsKKyAgICAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSBwcmV2aW91cyBjaHVuayB3YXMgZmx1c2hlZCBiZWZvcmUKKyAgICAgICAgICAgICAqIGFjY2VwdGluZyBhIG5ldyBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmICghY29ubi0+cGFyc2VfY2h1bmtfaGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm4tPmJvZHlfaGFzX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgRCgiJXM6IGNodW5rIHN0YXRlIHdhaXRpbmcgZm9yIGZsdXNoIiwgcm9vdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX05FRURfTU9SRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRCgiJXM6IHdhaXRpbmcgY2h1bmsgaGVhZGVyIiwgcm9vdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgY29ubi0+cGFyc2VfY2h1bmtfaGVhZGVyID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZV9saW5lKHJvb3QsIGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBEKCIlczolZCIsIHJvb3QtPm5hbWUsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29ubi0+cGFyc2VfY2h1bmtfaGVhZGVyID0gMDsKKworICAgICAgICAgICAgbGluZSAgID0gc3RyLT5zOworICAgICAgICAgICAgbGVuZ3RoID0gc3RydG9sbChsaW5lLCAmZW5kLCAxNik7CisgICAgICAgICAgICBpZiAobGluZVswXSA9PSAnICcgfHwgKGVuZFswXSAhPSAnXDAnICYmIGVuZFswXSAhPSAnOycpKSB7CisgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogaW52YWxpZCBjaHVuayBoZWFkZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUsIGxpbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiBpbnZhbGlkIGNodW5rIGxlbmd0aCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIERBVEFfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBwcm94eV9jb25uZWN0aW9uX3JlY2VpdmVfbGluZSgpIGRpZCByZW1vdmUgdGhlCisgICAgICAgICAgICAqIHRyYWlsaW5nIFxyXG4sIGJ1dCB3ZSBtdXN0IHByZXNlcnZlIGl0IHdoZW4gd2UKKyAgICAgICAgICAgICogc2VuZCB0aGUgY2h1bmsgc2l6ZSB0byB0aGUgcHJveHkuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX3N0cihyb290LT5zdHIsICJcclxuIik7CisKKyAgICAgICAgICAgIGNvbm4tPmNodW5rX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgICAgIGNvbm4tPmNodW5rX3RvdGFsICA9IDA7CisgICAgICAgICAgICBjb25uLT5jaHVua19zdGF0ZSAgPSBDSFVOS19EQVRBOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIGxhc3QgY2h1bmssIG5vIHdlIG5lZWQgdG8gYWRkIHRoZSB0cmFpbGVyICovCisgICAgICAgICAgICAgICAgY29ubi0+Y2h1bmtfc3RhdGUgICAgICAgICA9IENIVU5LX1RSQUlMRVI7CisgICAgICAgICAgICAgICAgY29ubi0+cGFyc2VfY2h1bmtfdHJhaWxlciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubi0+Y2h1bmtfc3RhdGUgPT0gQ0hVTktfVFJBSUxFUikgeworICAgICAgICAgICAgLyogZW5zdXJlIHRoYXQgJ3N0cicgaXMgZmx1c2hlZCBiZWZvcmUgcmVhZGluZyB0aGUgdHJhaWxlciAqLworICAgICAgICAgICAgaWYgKCFjb25uLT5wYXJzZV9jaHVua190cmFpbGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbm4tPmJvZHlfaGFzX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgRCgiJXM6JWQiLCByb290LT5uYW1lLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEQVRBX05FRURfTU9SRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29ubi0+cGFyc2VfY2h1bmtfdHJhaWxlciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSByZXdyaXRlX2Nvbm5lY3Rpb25fcmVhZF9oZWFkZXJzKGNvbm4sIGZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBjb25uLT5ib2R5X2lzX2Nsb3NlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgd2UgZ2V0IGhlcmUsIGJvZHlfbGVuZ3RoID4gMCAqLworICAgICAgICBpZiAoY29ubi0+Y2h1bmtfbGVuZ3RoID4gTUFYX0JPRFlfQlVGRkVSKQorICAgICAgICAgICAgd2FudGVkID0gTUFYX0JPRFlfQlVGRkVSOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3YW50ZWQgPSAoaW50KWNvbm4tPmNodW5rX2xlbmd0aDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICA7CisgICAgfQorCisgICAgLyogd2UgZG9uJ3Qgd2FudCBtb3JlIHRoYW4gTUFYX0JPRFlfQlVGRkVSIGJ5dGVzIGluIHRoZQorICAgICAqIGJ1ZmZlciB3ZSB1c2VkIHRvIHBhc3MgdGhlIGJvZHkgKi8KKyAgICBjdXJyZW50ID0gc3RyLT5uOworICAgIGF2YWlsICAgPSBNQVhfQk9EWV9CVUZGRVIgLSBjdXJyZW50OworICAgIGlmIChhdmFpbCA8PSAwKSB7CisgICAgICAgIC8qIHdhaXQgZm9yIHNvbWUgZmx1c2ggKi8KKyAgICAgICAgY29ubi0+Ym9keV9pc19mdWxsID0gMTsKKyAgICAgICAgRCgiJXM6IHdhaXRpbmcgdG8gZmx1c2ggJWQgYnl0ZXMiLAorICAgICAgICAgIHJvb3QtPm5hbWUsIGN1cnJlbnQpOworICAgICAgICByZXR1cm4gREFUQV9ORUVEX01PUkU7CisgICAgfQorCisgICAgaWYgKHdhbnRlZCA+IGF2YWlsKQorICAgICAgICB3YW50ZWQgPSBhdmFpbDsKKworICAgIHJldCA9IHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZShyb290LCBmZCwgd2FudGVkKTsKKyAgICBjb25uLT5ib2R5X2hhc19kYXRhID0gKHN0ci0+biA+IDApOworICAgIGNvbm4tPmJvZHlfaXNfZnVsbCAgPSAoc3RyLT5uID09IE1BWF9CT0RZX0JVRkZFUik7CisKKyAgICBpZiAocmV0ID09IERBVEFfRVJST1IpIHsKKyAgICAgICAgaWYgKGNvbm4tPmJvZHlfbW9kZSA9PSBCT0RZX1VOVElMX0NMT1NFKSB7CisgICAgICAgICAgICAvKiBhIGRpc2Nvbm5lY3Rpb24gaGVyZSBpcyBub3JtYWwgYW5kIHNpZ25hbHMgdGhlCisgICAgICAgICAgICAgKiBlbmQgb2YgdGhlIGJvZHkgKi8KKyAgICAgICAgICAgIGNvbm4tPmJvZHlfdG90YWwgICAgKz0gcm9vdC0+c3RyX3JlY3Y7CisgICAgICAgICAgICBEKCIlczogYm9keSBjb21wbGV0ZWQgYnkgY2xvc2UgKCVsbGQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICByb290LT5uYW1lLCBjb25uLT5ib2R5X3RvdGFsKTsKKyAgICAgICAgICAgIGNvbm4tPmJvZHlfaXNfY2xvc2VkID0gMTsKKyAgICAgICAgICAgIHJldCA9IERBVEFfQ09NUExFVEVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZhaWwgPSByb290LT5zdHJfcmVjdjsKKyAgICAgICAgcmV0ICAgPSBEQVRBX05FRURfTU9SRTsgIC8qIHdlJ3JlIG5vdCByZWFsbHkgZG9uZSB5ZXQgKi8KKworICAgICAgICBzd2l0Y2ggKGNvbm4tPmJvZHlfbW9kZSkgeworICAgICAgICBjYXNlIEJPRFlfQ0hVTktFRDoKKyAgICAgICAgICAgIGNvbm4tPmNodW5rX3RvdGFsICArPSBhdmFpbDsKKyAgICAgICAgICAgIGNvbm4tPmNodW5rX2xlbmd0aCAtPSBhdmFpbDsKKworICAgICAgICAgICAgaWYgKGNvbm4tPmNodW5rX2xlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IGNodW5rIGNvbXBsZXRlZCAoJWxsZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lLCBjb25uLT5jaHVua190b3RhbCk7CisgICAgICAgICAgICAgICAgY29ubi0+Ym9keV90b3RhbCAgKz0gY29ubi0+Y2h1bmtfdG90YWw7CisgICAgICAgICAgICAgICAgY29ubi0+Y2h1bmtfdG90YWwgID0gMDsKKyAgICAgICAgICAgICAgICBjb25uLT5jaHVua19sZW5ndGggPSAtMTsKKyAgICAgICAgICAgICAgICBjb25uLT5jaHVua19zdGF0ZSAgPSBDSFVOS19EQVRBX0VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQk9EWV9LTk9XTl9MRU5HVEg6CisgICAgICAgICAgICBjb25uLT5ib2R5X2xlbmd0aCAtPSBhdmFpbDsKKyAgICAgICAgICAgIGNvbm4tPmJvZHlfdG90YWwgICs9IGF2YWlsOworCisgICAgICAgICAgICBpZiAoY29ubi0+Ym9keV9sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIEQoIiVzOiBib2R5IGNvbXBsZXRlZCAoJWxsZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lLCBjb25uLT5ib2R5X3RvdGFsKTsKKyAgICAgICAgICAgICAgICBjb25uLT5ib2R5X2lzX2Nsb3NlZCA9IDE7CisgICAgICAgICAgICAgICAgcmV0ID0gREFUQV9DT01QTEVURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJPRFlfVU5USUxfQ0xPU0U6CisgICAgICAgICAgICBjb25uLT5ib2R5X3RvdGFsICs9IGF2YWlsOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgRGF0YVN0YXR1cworcmV3cml0ZV9jb25uZWN0aW9uX3NlbmRfYm9keSggUmV3cml0ZUNvbm5lY3Rpb24qICBjb25uLCBpbnQgIGZkICkKK3sKKyAgICBQcm94eUNvbm5lY3Rpb24qICByb290ICAgPSBjb25uLT5yb290OworICAgIHN0cmFsbG9jX3QqICAgICAgIHN0ciAgICA9IHJvb3QtPnN0cjsKKyAgICBEYXRhU3RhdHVzICAgICAgICByZXQgICAgPSBEQVRBX05FRURfTU9SRTsKKworICAgIGlmIChjb25uLT5ib2R5X2hhc19kYXRhKSB7CisgICAgICAgIHJldCA9IHByb3h5X2Nvbm5lY3Rpb25fc2VuZChyb290LCBmZCk7CisgICAgICAgIGlmIChyZXQgIT0gREFUQV9FUlJPUikgeworICAgICAgICAgICAgaW50ICBwb3MgPSByb290LT5zdHJfcG9zOworCisgICAgICAgICAgICBtZW1tb3ZlKHN0ci0+cywgc3RyLT5zK3Bvcywgc3RyLT5uLXBvcyk7CisgICAgICAgICAgICBzdHItPm4gICAgICAgICAtPSBwb3M7CisgICAgICAgICAgICByb290LT5zdHJfcG9zICAgPSAwOworICAgICAgICAgICAgY29ubi0+Ym9keV9pc19mdWxsICA9IChzdHItPm4gPT0gTUFYX0JPRFlfQlVGRkVSKTsKKyAgICAgICAgICAgIGNvbm4tPmJvZHlfaGFzX2RhdGEgPSAoc3RyLT5uID4gMCk7CisgICAgICAgICAgICBjb25uLT5ib2R5X3NlbnQgICAgKz0gcm9vdC0+c3RyX3NlbnQ7CisKKyAgICAgICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIHJldHVybiBEQVRBX0NPTVBMRVRFRCBvbmx5IHdoZW4KKyAgICAgICAgICAgICogd2UgaGF2ZSBzZW50IGV2ZXJ5dGhpbmcsIGFuZCB0aGVyZSBpcyBubyBtb3JlCisgICAgICAgICAgICAqIGJvZHkgcGllY2VzIHRvIHJlYWQgKi8KKyAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbm4tPmJvZHlfaXNfY2xvc2VkIHx8IGNvbm4tPmJvZHlfaGFzX2RhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IERBVEFfTkVFRF9NT1JFOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBEKCIlczogc2VudCBhbGwgYm9keSAoJWxsZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgY29ubi0+Ym9keV9zZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEKCIlczogc2VudCBjbG9zZWQ9JWQgZGF0YT0lZCBuPSVkIHJldD0lZCIsCisgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSwgY29ubi0+Ym9keV9pc19jbG9zZWQsCisgICAgICAgICAgICAgICAgY29ubi0+Ym9keV9oYXNfZGF0YSwgc3RyLT5uLAorICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQUk9YWV9MT0coIiVzOiBzZW5kX2JvZHkgd2l0aCBubyBkYXRhISE/Iiwgcm9vdC0+bmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8vIFRPRE8oZGlnaXQpOiBBZGQgdGhpcyBmdW5jdGlvbiB0byBsb29wZXIuaCBpbnN0ZWFkLgorc3RhdGljIHZvaWQgbG9vcElvX3NldE1hc2soTG9vcElvKiBpbywgdW5zaWduZWQgZXZlbnRzKSB7CisgICAgaWYgKGV2ZW50cyAmIExPT1BfSU9fUkVBRCkgeworICAgICAgICBsb29wSW9fd2FudFJlYWQoaW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvb3BJb19kb250V2FudFJlYWQoaW8pOworICAgIH0KKyAgICBpZiAoZXZlbnRzICYgTE9PUF9JT19XUklURSkgeworICAgICAgICBsb29wSW9fd2FudFdyaXRlKGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsb29wSW9fZG9udFdhbnRXcml0ZShpbyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShSZXdyaXRlQ29ubmVjdGlvbiogY29ubiwgQ29ubmVjdGlvblN0YXRlIHN0YXRlKSB7CisgICAgTG9vcElvKiBwcm94eV9pbyA9IGNvbm4tPnJvb3QtPmlvOworICAgIExvb3BJbyogc2xpcnBfaW8gPSBjb25uLT5zbGlycF9pbzsKKworICAgIHVuc2lnbmVkIHByb3h5X21hc2sgPSAwVTsKKyAgICB1bnNpZ25lZCBzbGlycF9tYXNrID0gMFU7CisKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfQ09OTkVDVElORzoKKyAgICAgICAgY2FzZSBTVEFURV9DUkVBVEVfU09DS0VUX1BBSVI6CisgICAgICAgICAgICBwcm94eV9tYXNrIHw9IExPT1BfSU9fV1JJVEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNUQVRFX1JFUVVFU1RfRklSU1RfTElORToKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX0hFQURFUlM6CisgICAgICAgICAgICBzbGlycF9tYXNrIHw9IExPT1BfSU9fUkVBRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVRVUVTVF9TRU5EOgorICAgICAgICAgICAgcHJveHlfbWFzayB8PSBMT09QX0lPX1dSSVRFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX0JPRFk6CisgICAgICAgICAgICBpZiAoIWNvbm4tPmJvZHlfaXNfY2xvc2VkICYmICFjb25uLT5ib2R5X2lzX2Z1bGwpIHsKKyAgICAgICAgICAgICAgICBzbGlycF9tYXNrIHw9IExPT1BfSU9fUkVBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25uLT5ib2R5X2hhc19kYXRhKSB7CisgICAgICAgICAgICAgICAgcHJveHlfbWFzayB8PSBMT09QX0lPX1dSSVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVBMWV9GSVJTVF9MSU5FOgorICAgICAgICBjYXNlIFNUQVRFX1JFUExZX0hFQURFUlM6CisgICAgICAgICAgICBwcm94eV9tYXNrIHw9IExPT1BfSU9fUkVBRDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVQTFlfU0VORDoKKyAgICAgICAgICAgIHNsaXJwX21hc2sgfD0gTE9PUF9JT19XUklURTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVQTFlfQk9EWToKKyAgICAgICAgICAgIGlmIChjb25uLT5ib2R5X2hhc19kYXRhKSB7CisgICAgICAgICAgICAgICAgc2xpcnBfbWFzayB8PSBMT09QX0lPX1dSSVRFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb25uLT5ib2R5X2lzX2Nsb3NlZCAmJiAhY29ubi0+Ym9keV9pc19mdWxsKSB7CisgICAgICAgICAgICAgICAgcHJveHlfbWFzayB8PSBMT09QX0lPX1JFQUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIDsKKyAgICB9CisgICAgRCgiJXM6IGNoYW5nZSBzdGF0ZSAlZCAtPiAlZCB3YW50ZWQgZXZlbnRzIHByb3h5PSVzJXMgc2xpcnA9JXMlcyIsCisgICAgICBjb25uLT5yb290LT5uYW1lLAorICAgICAgY29ubi0+c3RhdGUsCisgICAgICBzdGF0ZSwKKyAgICAgIChwcm94eV9tYXNrICYgTE9PUF9JT19SRUFEKSA/ICJSIiA6ICIiLAorICAgICAgKHByb3h5X21hc2sgJiBMT09QX0lPX1dSSVRFKSA/ICJXIiA6ICIiLAorICAgICAgKHNsaXJwX21hc2sgJiBMT09QX0lPX1JFQUQpID8gIlIiIDogIiIsCisgICAgICAoc2xpcnBfbWFzayAmIExPT1BfSU9fV1JJVEUpID8gIlciIDogIiIpOworCisgICAgbG9vcElvX3NldE1hc2socHJveHlfaW8sIHByb3h5X21hc2spOworICAgIGlmIChzbGlycF9pbykgeworICAgICAgICBsb29wSW9fc2V0TWFzayhzbGlycF9pbywgc2xpcnBfbWFzayk7CisgICAgfQorICAgIGNvbm4tPnN0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkCityZXdyaXRlX2Nvbm5lY3Rpb25faW9fZXZlbnQodm9pZCogb3BhcXVlLCBpbnQgZmQsIHVuc2lnbmVkIGV2ZW50cykgeworICAgIFByb3h5Q29ubmVjdGlvbiogcm9vdCA9IG9wYXF1ZTsKKyAgICBSZXdyaXRlQ29ubmVjdGlvbiogY29ubiA9IChSZXdyaXRlQ29ubmVjdGlvbiopcm9vdDsKKworICAgIGludCAgICAgICAgIHNsaXJwICAgICA9IGNvbm4tPnNsaXJwX2lvID8gbG9vcElvX2ZkKGNvbm4tPnNsaXJwX2lvKSA6IC0xOworICAgIGludCAgICAgICAgIHByb3h5ICAgICA9IGxvb3BJb19mZChyb290LT5pbyk7CisgICAgaW50ICAgICAgICAgaGFzX3NsaXJwID0gKGZkID09IHNsaXJwKTsKKyAgICBpbnQgICAgICAgICBoYXNfcHJveHkgPSAoZmQgPT0gcHJveHkpOworICAgIERhdGFTdGF0dXMgIHJldCAgICAgICA9IERBVEFfTkVFRF9NT1JFOworCisgICAgRCgiJXM6IHN0YXRlPSVkIGZkPSVzIGV2ZW50cz0lcyVzIiwKKyAgICAgIHJvb3QtPm5hbWUsCisgICAgICBjb25uLT5zdGF0ZSwKKyAgICAgIGhhc19zbGlycCA/ICJzbGlycCIgOiAoaGFzX3Byb3h5ID8gInByb3h5IiA6ICJub25lIiksCisgICAgICAoZXZlbnRzICYgTE9PUF9JT19SRUFEKSA/ICJSIiA6ICIiLAorICAgICAgKGV2ZW50cyAmIExPT1BfSU9fV1JJVEUpID8gIlciIDogIiIpOworCisgICAgc3dpdGNoIChjb25uLT5zdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX0NPTk5FQ1RJTkc6CisgICAgICAgICAgICBpZiAoaGFzX3Byb3h5KSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IGNvbm5lY3RlZCIsIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgIHJld3JpdGVfY29ubmVjdGlvbl9zZXRfc3RhdGUoY29ubiwgU1RBVEVfQ1JFQVRFX1NPQ0tFVF9QQUlSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfQ1JFQVRFX1NPQ0tFVF9QQUlSOgorICAgICAgICAgICAgaWYgKGhhc19wcm94eSkgeworICAgICAgICAgICAgICAgIGlmIChyZXdyaXRlX2Nvbm5lY3Rpb25fY3JlYXRlX3NvY2tldHMoY29ubikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IERBVEFfRVJST1I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgRCgiJXM6IHNvY2tldCBwYWlyIGNyZWF0ZWQiLCByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFX1JFUVVFU1RfRklSU1RfTElORSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX0ZJUlNUX0xJTkU6CisgICAgICAgICAgICBpZiAoaGFzX3NsaXJwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV3cml0ZV9jb25uZWN0aW9uX3JlYWRfcmVxdWVzdChjb25uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IERBVEFfQ09NUExFVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IHJlcXVlc3QgZmlyc3QgbGluZSBvayIsIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25fc2V0X3N0YXRlKGNvbm4sIFNUQVRFX1JFUVVFU1RfSEVBREVSUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX0hFQURFUlM6CisgICAgICAgICAgICBpZiAoaGFzX3NsaXJwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV3cml0ZV9jb25uZWN0aW9uX3JlYWRfaGVhZGVycyhjb25uLCBzbGlycCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBEQVRBX0NPTVBMRVRFRCkgeworICAgICAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZXF1ZXN0IGhlYWRlcnMgb2siLCByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJld3JpdGVfY29ubmVjdGlvbl9yZXdyaXRlX3JlcXVlc3QoY29ubikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBEQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVFVRVNUX1NFTkQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX1NFTkQ6CisgICAgICAgICAgICBpZiAoaGFzX3Byb3h5KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcHJveHlfY29ubmVjdGlvbl9zZW5kKHJvb3QsIHByb3h5KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IERBVEFfQ09NUExFVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXdyaXRlX2Nvbm5lY3Rpb25fZ2V0X2JvZHlfbGVuZ3RoKGNvbm4sIDEpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uLT5ib2R5X21vZGUgIT0gQk9EWV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZXF1ZXN0IHNlbnQsIHdhaXRpbmcgZm9yIGJvZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVFVRVNUX0JPRFkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogcmVxdWVzdCBzZW50LCB3YWl0aW5nIGZvciByZXBseSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25fc2V0X3N0YXRlKGNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFX1JFUExZX0ZJUlNUX0xJTkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVFVRVNUX0JPRFk6CisgICAgICAgICAgICBpZiAoaGFzX3NsaXJwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV3cml0ZV9jb25uZWN0aW9uX3JlYWRfYm9keShjb25uLCBzbGlycCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBEQVRBX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJld3JpdGVfY29ubmVjdGlvbl9zZXRfc3RhdGUoY29ubiwgU1RBVEVfUkVRVUVTVF9CT0RZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV0ICE9IERBVEFfRVJST1IgJiYgaGFzX3Byb3h5KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV3cml0ZV9jb25uZWN0aW9uX3NlbmRfYm9keShjb25uLCBwcm94eSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBEQVRBX0NPTVBMRVRFRCkgeworICAgICAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZXF1ZXN0IGJvZHkgb2ssIHdhaXRpbmcgZm9yIHJlcGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25fc2V0X3N0YXRlKGNvbm4sIFNUQVRFX1JFUExZX0ZJUlNUX0xJTkUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IERBVEFfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVFVRVNUX0JPRFkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVQTFlfRklSU1RfTElORToKKyAgICAgICAgICAgIGlmIChoYXNfcHJveHkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZXdyaXRlX2Nvbm5lY3Rpb25fcmVhZF9yZXBseShjb25uLCBwcm94eSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBEQVRBX0NPTVBMRVRFRCkgeworICAgICAgICAgICAgICAgICAgICBQUk9YWV9MT0coIiVzOiByZXBseSBmaXJzdCBsaW5lIG9rIiwgcm9vdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJld3JpdGVfY29ubmVjdGlvbl9zZXRfc3RhdGUoY29ubiwgU1RBVEVfUkVQTFlfSEVBREVSUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFURV9SRVBMWV9IRUFERVJTOgorICAgICAgICAgICAgaWYgKGhhc19wcm94eSkgeworICAgICAgICAgICAgICAgIHJldCA9IHJld3JpdGVfY29ubmVjdGlvbl9yZWFkX2hlYWRlcnMoY29ubiwgcHJveHkpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgUFJPWFlfTE9HKCIlczogcmVwbHkgaGVhZGVycyBvayIsIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV3cml0ZV9jb25uZWN0aW9uX3Jld3JpdGVfcmVwbHkoY29ubikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBEQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVBMWV9TRU5EKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVQTFlfU0VORDoKKyAgICAgICAgICAgIGlmIChoYXNfc2xpcnApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBwcm94eV9jb25uZWN0aW9uX3NlbmQoY29ubi0+cm9vdCwgc2xpcnApOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gREFUQV9DT01QTEVURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJld3JpdGVfY29ubmVjdGlvbl9nZXRfYm9keV9sZW5ndGgoY29ubiwgMCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBEQVRBX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbm4tPmJvZHlfbW9kZSAhPSBCT0RZX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IHJlcGx5IHNlbnQsIHdhaXRpbmcgZm9yIGJvZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVBMWV9CT0RZKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IHJlcGx5IHNlbnQsIGxvb3BpbmcgdG8gd2FpdGluZyByZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJld3JpdGVfY29ubmVjdGlvbl9zZXRfc3RhdGUoY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEVfUkVRVUVTVF9GSVJTVF9MSU5FKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RBVEVfUkVQTFlfQk9EWToKKyAgICAgICAgICAgIGlmIChoYXNfcHJveHkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZXdyaXRlX2Nvbm5lY3Rpb25fcmVhZF9ib2R5KGNvbm4sIHByb3h5KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IERBVEFfRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLCBTVEFURV9SRVBMWV9CT0RZKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmV0ICE9IERBVEFfRVJST1IgJiYgaGFzX3NsaXJwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV3cml0ZV9jb25uZWN0aW9uX3NlbmRfYm9keShjb25uLCBzbGlycCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBEQVRBX0NPTVBMRVRFRCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubi0+Ym9keV9tb2RlID09IEJPRFlfVU5USUxfQ0xPU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygiJXM6IGNsb3NpbmcgY29ubmVjdGlvbiIsIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gREFUQV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST1hZX0xPRygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiByZXBseSBib2R5IG9rLCBsb29waW5nIHRvIHdhaXRpbmcgcmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX3NldF9zdGF0ZShjb25uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURV9SRVFVRVNUX0ZJUlNUX0xJTkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gREFUQV9FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXdyaXRlX2Nvbm5lY3Rpb25fc2V0X3N0YXRlKGNvbm4sIFNUQVRFX1JFUExZX0JPRFkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICA7CisgICAgfQorICAgIGlmIChyZXQgPT0gREFUQV9FUlJPUikKKyAgICAgICAgcHJveHlfY29ubmVjdGlvbl9mcmVlKHJvb3QsIDAsIFBST1hZX0VWRU5UX05PTkUpOworCisgICAgcmV0dXJuOworfQorCisKK1Byb3h5Q29ubmVjdGlvbioKK2h0dHBfcmV3cml0ZXJfY29ubmVjdCggSHR0cFNlcnZpY2UqICBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIFJld3JpdGVDb25uZWN0aW9uKiAgY29ubjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHM7CisKKyAgICBzID0gc29ja2V0X2NyZWF0ZShhZGRyZXNzLT5mYW1pbHksIFNPQ0tFVF9TVFJFQU0gKTsKKyAgICBpZiAocyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY29ubiA9IGNhbGxvYygxLCBzaXplb2YoKmNvbm4pKTsKKyAgICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgICAgIHNvY2tldF9jbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHJveHlfY29ubmVjdGlvbl9pbml0KCBjb25uLT5yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLT5yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX2lvX2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3cml0ZV9jb25uZWN0aW9uX2ZyZWUgKTsKKworICAgIGlmICggcmV3cml0ZV9jb25uZWN0aW9uX2luaXQoIGNvbm4gKSA8IDAgKSB7CisgICAgICAgIHJld3JpdGVfY29ubmVjdGlvbl9mcmVlKCBjb25uLT5yb290ICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjb25uLT5yb290OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2ludC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGQwNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfaW50LmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmgiCisKK2V4dGVybiBpbnQgIHByb3h5X2xvZzsKKworZXh0ZXJuIHZvaWQgcHJveHlfTE9HKGNvbnN0IGNoYXIqICBmbXQsIC4uLik7CisKKyNkZWZpbmUgIFBST1hZX0xPRyguLi4pICAgXAorICAgIGRvIHsgaWYgKHByb3h5X2xvZykgcHJveHlfTE9HKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKworCisvKiBzb2NrZXRzIHByb3h5IG1hbmFnZXIgaW50ZXJuYWxzICovCisKK3R5cGVkZWYgc3RydWN0IFByb3h5Q29ubmVjdGlvbiAgIFByb3h5Q29ubmVjdGlvbjsKK3R5cGVkZWYgc3RydWN0IFByb3h5U2VydmljZSAgICAgIFByb3h5U2VydmljZTsKKworLyogZnJlZSBhIGdpdmVuIHByb3hpZmllZCBjb25uZWN0aW9uICovCit0eXBlZGVmIHZvaWQgKCpQcm94eUNvbm5lY3Rpb25GcmVlRnVuYykoUHJveHlDb25uZWN0aW9uKiBjb25uKTsKKworLyogcm9vdCBQcm94eUNvbm5lY3Rpb24gb2JqZWN0ICovCitzdHJ1Y3QgUHJveHlDb25uZWN0aW9uIHsKKyAgICBMb29wSW8qICAgICAgICAgICAgIGlvOworICAgIFNvY2tBZGRyZXNzICAgICAgICAgYWRkcmVzczsgIC8qIGZvciBkZWJ1Z2dpbmcgKi8KKyAgICBQcm94eUNvbm5lY3Rpb24qICAgIG5leHQ7CisgICAgUHJveHlDb25uZWN0aW9uKiAgICBwcmV2OworICAgIFByb3h5RXZlbnRGdW5jICAgICAgZXZfZnVuYzsKKyAgICB2b2lkKiAgICAgICAgICAgICAgIGV2X29wYXF1ZTsKKyAgICBQcm94eVNlcnZpY2UqICAgICAgIHNlcnZpY2U7CisKKyAgICAvKiB0aGUgZm9sbG93aW5nIGlzIHVzZWZ1bCBmb3IgYWxsIHR5cGVzIG9mIHNlcnZpY2VzICovCisgICAgY2hhciAgICAgICAgICAgICAgICBuYW1lWzY0XTsgICAgLyogZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworCisgICAgc3RyYWxsb2NfdCAgICAgICAgICBzdHJbMV07ICAgICAgLyogbmV0d29yayBidWZmZXIgKGR5bmFtaWMpICovCisgICAgaW50ICAgICAgICAgICAgICAgICBzdHJfcG9zOyAgICAgLyogc2VlIHByb3h5X2Nvbm5lY3Rpb25fc2VuZCgpICovCisgICAgaW50ICAgICAgICAgICAgICAgICBzdHJfc2VudDsgICAgLyogc2VlIHByb3h5X2Nvbm5lY3Rpb25fc2VuZCgpICovCisgICAgaW50ICAgICAgICAgICAgICAgICBzdHJfcmVjdjsgICAgLyogc2VlIHByb3h5X2Nvbm5lY3Rpb25fcmVjZWl2ZSgpICovCisKKyAgICAvKiBjb25uZWN0aW9uIG1ldGhvZHMgKi8KKyAgICBQcm94eUNvbm5lY3Rpb25GcmVlRnVuYyAgICBjb25uX2ZyZWU7CisKKyAgICAvKiByZXN0IG9mIGRhdGEgZGVwZW5kIG9uIGV4YWN0IGltcGxlbWVudGF0aW9uICovCit9OworCisKKworZXh0ZXJuIHZvaWQKK3Byb3h5X2Nvbm5lY3Rpb25faW5pdCggUHJveHlDb25uZWN0aW9uKiAgICAgICAgICAgY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2NrQWRkcmVzcyogICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICBQcm94eVNlcnZpY2UqICAgICAgICAgICAgICBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBMb29wSW9GdW5jICAgICAgICAgICAgICAgICBjb25uX2lvLAorICAgICAgICAgICAgICAgICAgICAgICBQcm94eUNvbm5lY3Rpb25GcmVlRnVuYyAgICBjb25uX2ZyZWUgKTsKKworZXh0ZXJuIHZvaWQKK3Byb3h5X2Nvbm5lY3Rpb25fZG9uZSggUHJveHlDb25uZWN0aW9uKiAgY29ubiApOworCisvKiBmcmVlIHRoZSBwcm94eSBjb25uZWN0aW9uIG9iamVjdC4gdGhpcyB3aWxsIGFsc28KKyAqIGNsb3NlIHRoZSBjb3JyZXNwb25kaW5nIHNvY2tldCB1bmxlc3MgdGhlCisgKiAna2VlcF9hbGl2ZScgZmxhZyBpcyBzZXQgdG8gVFJVRS4KKyAqLworZXh0ZXJuIHZvaWQKK3Byb3h5X2Nvbm5lY3Rpb25fZnJlZSggUHJveHlDb25uZWN0aW9uKiAgY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAga2VlcF9hbGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHJveHlFdmVudCAgICAgICAgZXZlbnQgKTsKKworLyogc3RhdHVzIG9mIGRhdGEgdHJhbnNmZXIgb3BlcmF0aW9ucyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBEQVRBX0VSUk9SICAgICA9IC0xLAorICAgIERBVEFfTkVFRF9NT1JFID0gIDAsCisgICAgREFUQV9DT01QTEVURUQgPSAgMQorfSBEYXRhU3RhdHVzOworCisvKiB0cnkgdG8gc2VuZCBkYXRhIGZyb20gdGhlIGNvbm5lY3Rpb24ncyBidWZmZXIgdG8gYSBzb2NrZXQuCisgKiBzdGFydGluZyBmcm9tIG9mZnNldCBjb25uLT5zdHJfcG9zIGluIHRoZSBidWZmZXIKKyAqCisgKiByZXR1cm5zIERBVEFfQ09NUExFVEVEIGlmIGV2ZXJ5dGhpbmcgY291bGQgYmUgd3JpdHRlbgorICogcmV0dXJucyBEQVRBX0VSUk9SIGZvciBhIHNvY2tldCBkaXNjb25uZWN0aW9uIG9yIGVycm9yCisgKiByZXR1cm5zIERBVEFfTkVFRF9NT1JFIGlmIGFsbCBkYXRhIGNvdWxkIG5vdCBiZSBzZW50LgorICoKKyAqIG9uIGV4aXQsIGNvbm4tPnN0cl9zZW50IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIHRoYXQgd2VyZSByZWFsbHkgc2VudC4gY29ubi0+c3RyX3BvcyB3aWxsIGJlIGluY3JlbWVudGVkCisgKiBieSBjb25uLT5zdHJfc2VudCBhcyB3ZWxsLgorICoKKyAqIG5vdGUgdGhhdCBpbiBjYXNlIG9mIHN1Y2Nlc3MgKERBVEFfQ09NUExFVEVEKSwgdGhpcyBhbHNvCisgKiBwZXJmb3JtcyBhIHByb3h5X2Nvbm5lY3Rpb25fcmV3aW5kIHdoaWNoIHNldHMgY29ubi0+c3RyX3BvcworICogdG8gMC4KKyAqLworZXh0ZXJuIERhdGFTdGF0dXMKK3Byb3h5X2Nvbm5lY3Rpb25fc2VuZCggUHJveHlDb25uZWN0aW9uKiAgY29ubiwgaW50ICBmZCApOworCisvKiB0cnkgdG8gcmVhZCAnd2FudGVkJyBieXRlcyBpbnRvIGNvbm4tPnN0ciBmcm9tIGEgc29ja2V0CisgKgorICogcmV0dXJucyBEQVRBX0NPTVBMRVRFRCBpZiBhbGwgYnl0ZXMgY291bGQgYmUgcmVhZAorICogcmV0dXJucyBEQVRBX05FRURfTU9SRSBpZiBub3QgYWxsIGJ5dGVzIGNvdWxkIGJlIHJlYWQKKyAqIHJldHVybnMgREFUQV9FUlJPUiBpbiBjYXNlIG9mIHNvY2tldCBkaXNjb25uZWN0aW9uIG9yIGVycm9yCisgKgorICogb24gZXhpdCwgdGhlIGFtb3VudCBvZiBkYXRhIHJlY2VpdmVkIGlzIGluIGNvbm4tPnN0cl9yZWN2CisgKi8KK2V4dGVybiBEYXRhU3RhdHVzCitwcm94eV9jb25uZWN0aW9uX3JlY2VpdmUoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4sIGludCAgZmQsIGludCAgd2FudGVkICk7CisKKy8qIHRyaWVzIHRvIHJlY2VpdmUgYSBsaW5lIG9mIHRleHQgZnJvbSB0aGUgcHJveHkuCisgKiB3aGVuIGFuIGVudGlyZSBsaW5lIGlzIHJlYWQsIHRoZSB0cmFpbGluZyBcclxuIGlzIHN0cmlwcGVkCisgKiBhbmQgcmVwbGFjZWQgYnkgYSB0ZXJtaW5hdGluZyB6ZXJvLiBzdHItPm4gd2lsbCBiZSB0aGUKKyAqIGxlbmdodCBvZiB0aGUgbGluZSwgZXhjbHVzaW5nIHRoZSB0ZXJtaW5hdGluZyB6ZXJvLgorICogcmV0dXJucyAxIHdoZW4gYSBsaW5lIGhhcyBiZWVuIHJlY2VpdmVkCisgKiByZXR1cm5zIDAgaWYgdGhlcmUgaXMgc3RpbGwgc29tZSBkYXRhIHRvIHJlY2VpdmUKKyAqIHJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvcgorICovCitleHRlcm4gRGF0YVN0YXR1cworcHJveHlfY29ubmVjdGlvbl9yZWNlaXZlX2xpbmUoIFByb3h5Q29ubmVjdGlvbiogIGNvbm4sIGludCAgZmQgKTsKKworLyogcmV3aW5kIHRoZSBzdHJpbmcgYnVmZmVyIGZvciBhIG5ldyBvcGVyYXRpb24gKi8KK2V4dGVybiB2b2lkCitwcm94eV9jb25uZWN0aW9uX3Jld2luZCggUHJveHlDb25uZWN0aW9uKiAgY29ubiApOworCisvKiBiYXNlNjQgZW5jb2RlIGEgc291cmNlIHN0cmluZywgcmV0dXJucyBzaXplIG9mIGVuY29kZWQgcmVzdWx0LAorICogb3IgLTEgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKi8KK2V4dGVybiBpbnQKK3Byb3h5X2Jhc2U2NF9lbmNvZGUoIGNvbnN0IGNoYXIqICBzcmMsIGludCAgc3JjbGVuLAorICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgIGRzdCwgaW50ICBkc3RsZW4gKTsKKworZXh0ZXJuIGludAorcHJveHlfcmVzb2x2ZV9zZXJ2ZXIoIFNvY2tBZGRyZXNzKiAgIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgc2VydmVybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBzZXJ2ZXJuYW1lbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHNlcnZlcnBvcnQgKTsKKworLyogYSBQcm94eVNlcnZpY2UgaXMgcmVhbGx5IGEgcHJveHkgc2VydmVyIGFuZCBhc3NvY2lhdGVkIG9wdGlvbnMgKi8KKworLyogZGVzdHJveSBhIGdpdmVuIHByb3h5IHNlcnZpY2UgKi8KK3R5cGVkZWYgdm9pZCAgICAgICAgICAgICAgKCpQcm94eVNlcnZpY2VGcmVlRnVuYykgICAgICAoIHZvaWQqICBvcGFxdWUgKTsKKworLyogdHJpZXMgdG8gY3JlYXRlIGEgbmV3IHByb3hpZmllZCBjb25uZWN0aW9uLCByZXR1cm5zIE5VTEwgaWYgdGhlIHNlcnZpY2UgY2FuJ3QKKyAqIGhhbmRsZSB0aGlzIGFkZHJlc3MgKi8KK3R5cGVkZWYgUHJveHlDb25uZWN0aW9uKiAgKCpQcm94eVNlcnZpY2VDb25uZWN0RnVuYykoIHZvaWQqICAgICAgICAgICAgICAgb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0VHlwZSAgICAgICAgICBzb2NrZXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzKiAgYWRkcmVzcyApOworCitzdHJ1Y3QgUHJveHlTZXJ2aWNlIHsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBvcGFxdWU7CisgICAgUHJveHlTZXJ2aWNlRnJlZUZ1bmMgICAgICAgc2Vydl9mcmVlOworICAgIFByb3h5U2VydmljZUNvbm5lY3RGdW5jICAgIHNlcnZfY29ubmVjdDsKK307CisKK2V4dGVybiBpbnQKK3Byb3h5X21hbmFnZXJfYWRkX3NlcnZpY2UoIFByb3h5U2VydmljZSogIHNlcnZpY2UgKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9zZXR1cC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfc2V0dXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTQxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfc2V0dXAuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X3NldHVwLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L1Byb3h5VXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfaHR0cC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2Jvb2wgYW5kcm9pZF9odHRwX3Byb3h5X3NldHVwKGNvbnN0IGNoYXIqIGh0dHBfcHJveHksIGJvb2wgdmVyYm9zZSkgeworICAgIGlmICghaHR0cF9wcm94eSkgeworICAgICAgICBWRVJCT1NFX0RQUklOVChpbml0LCAiTm90IHVzaW5nIGFueSBodHRwIHByb3h5Iik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFBhcnNlIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZyBmaXJzdC4KKyAgICBhbmRyb2lkOjpwcm94eTo6UGFyc2VSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OnByb3h5OjpwYXJzZUNvbmZpZ3VyYXRpb25TdHJpbmcoaHR0cF9wcm94eSk7CisgICAgaWYgKHJlc3VsdC5tRXJyb3IpIHsKKyAgICAgICAgZHdhcm5pbmcoIklnbm9yaW5nIGludmFsaWQgaHR0cCBwcm94eTogJXMiLCByZXN1bHQubUVycm9yLT5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIHByb3h5X3NldF92ZXJib3NlKDEpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHByb3h5ID0gcmVzdWx0Lm1TZXJ2ZXJBZGRyZXNzLnRvU3RyaW5nKCk7CisgICAgaW50IHByb3h5UG9ydCA9IHJlc3VsdC5tU2VydmVyUG9ydDsKKyAgICBWRVJCT1NFX0RQUklOVChpbml0LCAic2V0dGluZyB1cCBodHRwIHByb3h5OiBwcm94eT0lcyBwb3J0PSVkIiwKKyAgICAgICAgICAgICAgICAgICBwcm94eS5jX3N0cigpLCBwcm94eVBvcnQpOworCisgICAgLyogQ2hlY2sgdGhhdCB3ZSBjYW4gY29ubmVjdCB0byB0aGUgcHJveHkgaW4gdGhlIG5leHQgc2Vjb25kLgorICAgICAqIElmIG5vdCwgdGhlIHByb3h5IHNldHRpbmcgaXMgcHJvYmFibHkgZ2FyYmFnZSAhIQorICAgICAqLworICAgIGlmIChwcm94eV9jaGVja19jb25uZWN0aW9uKHByb3h5LmNfc3RyKCksIHByb3h5LnNpemUoKSwgcHJveHlQb3J0LCAxMDAwKSA8CisgICAgICAgIDApIHsKKyAgICAgICAgZHdhcm5pbmcoIkNvdWxkIG5vdCBjb25uZWN0IHRvIHByb3h5IGF0ICVzOiVkOiAlcyAhIiwgcHJveHkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcHJveHlQb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBkd2FybmluZygiUHJveHkgd2lsbCBiZSBpZ25vcmVkICEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb3h5T3B0aW9uIG9wdGlvbl90YWJbMl0gPSB7fTsKKyAgICBQcm94eU9wdGlvbiogb3B0aW9uID0gb3B0aW9uX3RhYjsKKworICAgIGlmIChyZXN1bHQubVVzZXJuYW1lKSB7CisgICAgICAgIG9wdGlvbi0+dHlwZSA9IFBST1hZX09QVElPTl9BVVRIX1VTRVJOQU1FOworICAgICAgICBvcHRpb24tPnN0cmluZyA9IHJlc3VsdC5tVXNlcm5hbWUtPmNfc3RyKCk7CisgICAgICAgIG9wdGlvbi0+c3RyaW5nX2xlbiA9IHJlc3VsdC5tVXNlcm5hbWUtPnNpemUoKTsKKyAgICAgICAgb3B0aW9uKys7CisgICAgfQorICAgIGlmIChyZXN1bHQubVBhc3N3b3JkKSB7CisgICAgICAgIG9wdGlvbi0+dHlwZSA9IFBST1hZX09QVElPTl9BVVRIX1BBU1NXT1JEOworICAgICAgICBvcHRpb24tPnN0cmluZyA9IHJlc3VsdC5tUGFzc3dvcmQtPmNfc3RyKCk7CisgICAgICAgIG9wdGlvbi0+c3RyaW5nX2xlbiA9IHJlc3VsdC5tUGFzc3dvcmQtPnNpemUoKTsKKyAgICAgICAgb3B0aW9uKys7CisgICAgfQorCisgICAgaWYgKHByb3h5X2h0dHBfc2V0dXAocHJveHkuY19zdHIoKSwgcHJveHkuc2l6ZSgpLCBwcm94eVBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIC0gb3B0aW9uX3RhYiwgb3B0aW9uX3RhYikgPCAwKSB7CisgICAgICAgIGR3YXJuaW5nKCJIdHRwIHByb3h5IHNldHVwIGZhaWxlZCBmb3IgJyVzOiVkJzogJXMiLCBwcm94eS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm94eVBvcnQsIGVycm5vX3N0cik7CisgICAgICAgIGR3YXJuaW5nKCJQcm94eSB3aWxsIGJlIGlnbm9yZWQgISIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfc2V0dXAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9wcm94eS9wcm94eV9zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZTViMWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfc2V0dXAuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gU2V0dXAgdGhlIG9wdGlvbmFsIEhUVFAgcHJveHkgaWYgbmVjZXNzYXJ5LiB8aHR0cF9wcm94eXwgaXMgZWl0aGVyIG51bGxwdHIKKy8vIG9yIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb3h5IHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6CisvLworLy8gICAgIFtodHRwOi8vXVs8dXNlcm5hbWU+OjxwYXNzd29yZD5AXTxob3N0bmFtZT46PHBvcnQ+CisvLyAgICAgW2h0dHA6Ly9dWzx1c2VybmFtZT46PHBhc3N3b3JkPkBdezxob3N0bmFtZT59Ojxwb3J0PgorLy8KKy8vIFdoZXJlIDxob3N0bmFtZT4gY2FuIGJlIGEgaG9zdG5hbWUsIGEgZGVjaW1hbCBkb3R0ZWQgSVB2NCBJUCBhZGRyZXNzLAorLy8gb3IgYW4gSVB2NiBhZGRyZXNzIHdyYXBwZWQgYXJvdW5kIGJyYWNlcyAoZS5nLiAnezo6MX0nKSwgc2luY2UgdGhlIGNvbG9uCisvLyBpcyBhbHJlYWR5IHVzZWQgYXMgYSBzZXBhcmF0ZWQgYmV0d2VlbiB0aGUgaG9zdG5hbWUgYW5kIHRoZSBwb3J0LgorLy8KKy8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZSAoZS5nLiBpZiB0aGUgcHJveHkgYWRkcmVzcyBpcworLy8gaW52YWxpZCwgb2YgaXQgY29ubmVjdGluZyB0byB0aGUgcHJveHkgaXMgaW1wb3NzaWJsZSwgb3IgdGltZWQtb3V0IGFmdGVyCisvLyBhIHNtYWxsIGRlbGF5KS4KK2Jvb2wgYW5kcm9pZF9odHRwX3Byb3h5X3NldHVwKGNvbnN0IGNoYXIqIGh0dHBfcHJveHksIGJvb2wgdmVyYm9zZSk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X3V0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcHJveHkvcHJveHlfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY4ZTAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Byb3h5L3Byb3h5X3V0aWxzLmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbmV0d29yay9JcEFkZHJlc3MuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHByb3h5IHsKKworLy8gQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgYSBwcm94eSBjb25maWd1cmF0aW9uCisvLyBzdHJpbmcuIHxtU2VydmVyQWRkcmVzc3wgaXMgdGhlIHByb3h5IHNlcnZlcidzIElQIGFkZHJlc3MsIHxtVXNlcm5hbWV8CisvLyBhbmQgfG1QYXNzd29yZHwgYXJlIG9wdGlvbmFsIGF1dGhlbnRpY2F0aW9uIHVzZXJuYW1lL3Bhc3N3b3Jkcy4gSW4gY2FzZQorLy8gb2YgZXJyb3IgZHVyaW5nIHBhcnNpbmcsIHxtRXJyb3J8IHdpbGwgY29udGFpbiBhIHVzZXItZnJpZW5kbHkgZXJyb3IKKy8vIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IuCitzdHJ1Y3QgUGFyc2VSZXN1bHQgeworICAgIGFuZHJvaWQ6OmJhc2U6OklwQWRkcmVzcyBtU2VydmVyQWRkcmVzczsKKyAgICBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4gbVVzZXJuYW1lOworICAgIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBtUGFzc3dvcmQ7CisgICAgc3RkOjpzdHJpbmcgbUVycm9yOworfTsKKworLy8gUGFyc2UgYSBnaXZlbiBwcm94eSBjb25maWd1cmF0aW9uIHN0cmluZy4gfHN0cnwgaXMgYSBzdHJpbmcgaW4gb25lIG9mIHRoZQorLy8gZm9sbG93aW5nIGZvcm1hdHM6CisvLyAgICAgPGhvc3RuYW1lPjo8cG9ydD4KKy8vICAgICA8dXNlcm5hbWU+OjxwYXNzd29yZD5APGhvc3RuYW1lPjo8cG9ydD4KKy8vCisvLyBXaGVyZSA8aG9zdG5hbWU+IGNhbiBiZSBhIGhvc3RuYW1lLCBhIGRvdHRlZCBkZWNpbWFsIElQdjQgYWRkcmVzcywgb3IgYW4KKy8vIElQdjYgYWRkcmVzcyB3cmFwcGVkIGluIGJyYWNlcyAoZS5nLiAnezo6MX0nKSBzaW5jZSB0aGUgY29sb24gaXMgdXNlZCB0bworLy8gZGVsaW1pdCB0aGUgaG9zdG5hbWUgYW5kIHRoZSBwb3J0IGFscmVhZHkuCisvLworLy8gTk9URTogVGhpcyBkb2Vzbid0IHN1cHBvcnQgYSA8dXNlcm5hbWU+IG9yIDxwYXNzd29yZD4gdGhhdCBjb250YWluIGEgQCBvcgorLy8gICAgICAgYSBjb2xvbi4gOi0vCitib29sIHBhcnNlQ29uZmlndXJhdGlvblN0cmluZyhTdHJpbmdWaWV3IHN0ciwgUGFyc2VSZXN1bHQqIG91dCk7CisKK30gIC8vIG5hbWVzcGFjZSBwcm94eQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xZW11LXNldHVwLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcWVtdS1zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDVkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcWVtdS1zZXR1cC5jCkBAIC0wLDAgKzEsMzk5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnNvbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYWRiLXNlcnZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvY21kbGluZS1vcHRpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NsaXBib2FyZC1waXBlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jb25zb2xlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Bpbmdwb25nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3Rocm90dGxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYW5kcm9pZF9waXBlX3VuaXguaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3BpcGVfemVyby5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctZmluZ2VycHJpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LXNlbnNvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbGVzLXBpcGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Byb3h5L3Byb3h5X3NldHVwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaXBhZGRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC92ZXJzaW9uLmgiCisKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSAgRCguLi4pICBkbyB7ICBpZiAoVkVSQk9TRV9DSEVDSyhpbml0KSkgZHByaW50KF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKworLyogQ29udGFpbnMgYXJndW1lbnRzIGZvciAtYW5kcm9pZC1wb3J0cyBvcHRpb24uICovCitjaGFyKiBhbmRyb2lkX29wX3BvcnRzID0gTlVMTDsKKy8qIENvbnRhaW5zIHRoZSBwYXJzZWQgbnVtYmVycyBmcm9tIGFuZHJvaWRfb3BfcG9ydHMgKi8KK2ludCBhbmRyb2lkX29wX3BvcnRzX251bWJlcnNbMl0gPSB7LTEsIC0xfTsKKy8qIENvbnRhaW5zIGFyZ3VtZW50cyBmb3IgLWFuZHJvaWQtcG9ydCBvcHRpb24uICovCitjaGFyKiBhbmRyb2lkX29wX3BvcnQgPSBOVUxMOworLyogQ29udGFpbnMgdGhlIHBhcnNlZCBudW1iZXIgZnJvbSBhbmRyb2lkX29wX3BvcnQgKi8KK2ludCBhbmRyb2lkX29wX3BvcnRfbnVtYmVyID0gLTE7CisvKiBDb250YWlucyBhcmd1bWVudHMgZm9yIC1hbmRyb2lkLXJlcG9ydC1jb25zb2xlIG9wdGlvbi4gKi8KK2NoYXIqIGFuZHJvaWRfb3BfcmVwb3J0X2NvbnNvbGUgPSBOVUxMOworLyogQ29udGFpbnMgYXJndW1lbnRzIGZvciAtaHR0cC1wcm94eSBvcHRpb24uICovCitjaGFyKiBvcF9odHRwX3Byb3h5ID0gTlVMTDsKKy8qIEJhc2UgcG9ydCBmb3IgdGhlIGVtdWxhdGVkIHN5c3RlbS4gKi8KK2ludCAgICBhbmRyb2lkX2Jhc2VfcG9ydDsKKy8qIEFEQiBwb3J0ICovCitpbnQgICAgYW5kcm9pZF9hZGJfcG9ydCA9IDUwMzc7IC8vIERlZmF1bHQKKy8qIFRoZSBkZXZpY2UgInNlcmlhbCBudW1iZXIiIGlzICJlbXVsYXRvci08dGhpcyBudW1iZXI+IiAqLworaW50ICAgIGFuZHJvaWRfc2VyaWFsX251bWJlcl9wb3J0OworCisvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdXNlZCB0byBzdXBwb3J0IHRoZSAtcmVwb3J0LWNvbnNvbGUgb3B0aW9uLAorLy8gd2hpY2ggdGFrZXMgYSBwYXJhbWV0ZXIgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKKy8vCisvLyAgICB0Y3A6PHBvcnQ+Wyw8b3B0aW9ucz5dCisvLyAgICB1bml4OjxwYXRoPlssPG9wdGlvbnM+XQorLy8KKy8vIFdoZXJlIDxvcHRpb25zPiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9wdGlvbnMgd2hpY2ggY2FuIGJlCisvLyAgICBzZXJ2ZXIgICAgICAgIC0gRW5hYmxlIHNlcnZlciBtb2RlICh3YWl0cyBmb3IgY2xpZW50IGNvbm5lY3Rpb24pLgorLy8gICAgbWF4PTxjb3VudD4gICAtIFNldCBtYXhpbXVtIGNvbm5lY3Rpb24gYXR0ZW1wdHMgKGNsaWVudCBtb2RlIG9ubHkpLgorLy8gICAgaXB2NiAgICAgICAgICAtIFVzZSBJUHY2IGxvY2FsaG9zdCAoOjoxKSBpbnN0ZWFkIG9mICgxMjcuMC4wLjEpCisvLworCisvLyBiaXQgZmxhZ3MgcmV0dXJuZWQgYnkgZ2V0X3JlcG9ydF9jb25zb2xlX29wdGlvbnMoKSBiZWxvdy4KK2VudW0geworICAgIFJFUE9SVF9DT05TT0xFX1NFUlZFUiA9ICgxIDw8IDApLAorICAgIFJFUE9SVF9DT05TT0xFX01BWCAgICA9ICgxIDw8IDEpLAorICAgIFJFUE9SVF9DT05TT0xFX0lQVjYgICA9ICgxIDw8IDIpLAorfTsKKworLy8gTG9vayBhdCB8ZW5kfCBmb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiAtcmVwb3J0LWNvbnNvbGUgb3B0aW9ucworLy8gYW5kIHJldHVybiBhIHNldCBvZiBjb3JyZXNwb25kaW5nIGJpdCBmbGFncy4gUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisvLyBPbiBzdWNjZXNzLCBpZiBSRVBPUlRfQ09OU09MRV9NQVggaXMgc2V0IGluIHRoZSByZXN1bHQsIHwqbWF4dHJpZXN8CisvLyB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgPGNvdW50PiBwYXJhbWV0ZXIgb2YgdGhlIG1heD0gb3B0aW9uLgorc3RhdGljIGludCBnZXRfcmVwb3J0X2NvbnNvbGVfb3B0aW9ucyhjaGFyKiBlbmQsIGludCogbWF4dHJpZXMpIHsKKyAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgaWYgKGVuZCA9PSBOVUxMIHx8ICplbmQgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZW5kWzBdICE9ICcsJykgeworICAgICAgICBkZXJyb3IoInNvY2tldCBwb3J0L3BhdGggY2FuIGJlIGZvbGxvd2VkIGJ5IFssPG9wdGlvbj5dKyBvbmx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZW5kICs9IDE7CisgICAgd2hpbGUgKCplbmQpIHsKKyAgICAgICAgY2hhciogIHAgPSBzdHJjaHIoZW5kLCAnLCcpOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgcCA9IGVuZCArIHN0cmxlbihlbmQpOworCisgICAgICAgIGlmICgocCAtIGVuZCkgPT0gc3RybGVuKCJzZXJ2ZXIiKSAmJiAhbWVtY21wKGVuZCwgInNlcnZlciIsIHAgLSBlbmQpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBSRVBPUlRfQ09OU09MRV9TRVJWRVI7CisgICAgICAgIH0gZWxzZSBpZiAobWVtY21wKCBlbmQsICJtYXg9IiwgNCkgPT0gMCkgeworICAgICAgICAgICAgZW5kICArPSA0OworICAgICAgICAgICAgKm1heHRyaWVzID0gc3RydG9sKCBlbmQsIE5VTEwsIDEwICk7CisgICAgICAgICAgICBmbGFncyB8PSBSRVBPUlRfQ09OU09MRV9NQVg7CisgICAgICAgIH0gZWxzZSBpZiAoKHAgLSBlbmQpID09IHN0cmxlbigiaXB2NiIpICYmCisgICAgICAgICAgICAgICAgIW1lbWNtcChlbmQsICJpcHY2IiwgcCAtIGVuZCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFJFUE9SVF9DT05TT0xFX0lQVjY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXJyb3IoInNvY2tldCBwb3J0L3BhdGggY2FuIGJlIGZvbGxvd2VkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAiWyxzZXJ2ZXJdWyxtYXg9PGNvdW50Pl1bLGlwdjZdIG9ubHkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGVuZCA9IHA7CisgICAgICAgIGlmICgqZW5kKQorICAgICAgICAgICAgZW5kICs9IDE7CisgICAgfQorICAgIHJldHVybiBmbGFnczsKK30KKworLy8gSW1wbGVtZW50IC1yZXBvcnQtY29uc29sZSBvcHRpb24uIHxwcm90b19wb3J0fCBpcyB0aGUgb3B0aW9uJ3MgcGFyYW1ldGVyCisvLyBhcyBkZXNjcmliZWQgYWJvdmUgKGUuZy4gJ3RjcDo8cG9ydD4sc2VydmVyJykuIEFuZCB8Y29uc29sZV9wb3J0fCBpcworLy8gdGhlIGVtdWxhdG9yJ3MgY29uc29sZSBwb3J0IHRvIHJlcG9ydC4gUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KK3N0YXRpYyBpbnQgcmVwb3J0X2NvbnNvbGUoY29uc3QgY2hhciogcHJvdG9fcG9ydCwgaW50IGNvbnNvbGVfcG9ydCkgeworICAgIGludCAgIHMgPSAtMSwgczI7CisgICAgaW50ICAgbWF4dHJpZXMgPSAxMDsKKyAgICBpbnQgICBmbGFncyA9IDA7CisgICAgc2lnbmFsX3N0YXRlX3QgIHNpZ3N0YXRlOworCisgICAgZGlzYWJsZV9zaWdhbHJtKCAmc2lnc3RhdGUgKTsKKworICAgIGlmICggIXN0cm5jbXAoIHByb3RvX3BvcnQsICJ0Y3A6IiwgNCkgKSB7CisgICAgICAgIGNoYXIqICBlbmQ7CisgICAgICAgIGxvbmcgICBwb3J0ID0gc3RydG9sKHByb3RvX3BvcnQgKyA0LCAmZW5kLCAxMCk7CisKKyAgICAgICAgZmxhZ3MgPSBnZXRfcmVwb3J0X2NvbnNvbGVfb3B0aW9ucyggZW5kLCAmbWF4dHJpZXMgKTsKKyAgICAgICAgaWYgKGZsYWdzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzICYgUkVQT1JUX0NPTlNPTEVfU0VSVkVSKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBMaXN0ZW4gb24gYm90aCBJUHY2IGFuZCBJUHY0IGludGVyZmFjZXMgYXQgdGhlIHNhbWUgdGltZT8KKyAgICAgICAgICAgIGlmIChmbGFncyAmIFJFUE9SVF9DT05TT0xFX0lQVjYpIHsKKyAgICAgICAgICAgICAgICBzID0gc29ja2V0X2xvb3BiYWNrNl9zZXJ2ZXIoIHBvcnQsIFNPQ0tFVF9TVFJFQU0gKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IHNvY2tldF9sb29wYmFjazRfc2VydmVyKCBwb3J0LCBTT0NLRVRfU1RSRUFNICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldCBvbiBUQ1A6JWxkOiAlcyIsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX3N0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICggOyBtYXh0cmllcyA+IDA7IG1heHRyaWVzLS0gKSB7CisgICAgICAgICAgICAgICAgRCgidHJ5aW5nIHRvIGZpbmQgY29uc29sZS1yZXBvcnQgY2xpZW50IG9uIHRjcDolZCIsIHBvcnQpOworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIFJFUE9SVF9DT05TT0xFX0lQVjYpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNvY2tldF9sb29wYmFjazZfY2xpZW50KCBwb3J0LCBTT0NLRVRfU1RSRUFNICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNvY2tldF9sb29wYmFjazRfY2xpZW50KCBwb3J0LCBTT0NLRVRfU1RSRUFNICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc2xlZXBfbXMoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImNvdWxkIG5vdCBjb25uZWN0IHRvIHNlcnZlciBvbiBUQ1A6JWxkOiAlcyIsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX3N0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggIXN0cm5jbXAoIHByb3RvX3BvcnQsICJ1bml4OiIsIDUpICkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBkZXJyb3IoInNvcnJ5LCB0aGUgdW5peDogcHJvdG9jb2wgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW4zMiIpOworICAgICAgICByZXR1cm4gLTE7CisjZWxzZQorICAgICAgICBjaGFyKiAgcGF0aCA9IHN0cmR1cChwcm90b19wb3J0KzUpOworICAgICAgICBjaGFyKiAgZW5kICA9IHN0cmNocihwYXRoLCAnLCcpOworICAgICAgICBpZiAoZW5kICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0X3JlcG9ydF9jb25zb2xlX29wdGlvbnMoIGVuZCwgJm1heHRyaWVzICk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgPCAwKSB7CisgICAgICAgICAgICAgICAgZnJlZShwYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqZW5kICA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdzICYgUkVQT1JUX0NPTlNPTEVfU0VSVkVSKSB7CisgICAgICAgICAgICBzID0gc29ja2V0X3VuaXhfc2VydmVyKCBwYXRoLCBTT0NLRVRfU1RSRUFNICk7CisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImNvdWxkIG5vdCBiaW5kIHVuaXggc29ja2V0IG9uICclcyc6ICVzIiwgcHJvdG9fcG9ydCArIDUsCisgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX3N0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICggOyBtYXh0cmllcyA+IDA7IG1heHRyaWVzLS0gKSB7CisgICAgICAgICAgICAgICAgcyA9IHNvY2tldF91bml4X2NsaWVudCggcGF0aCwgU09DS0VUX1NUUkVBTSApOworICAgICAgICAgICAgICAgIGlmIChzID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgc2xlZXBfbXMoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgICAgICBkZXJyb3IoImNvdWxkIG5vdCBjb25uZWN0IHRvIHVuaXggc29ja2V0IG9uICclcyc6ICVzIiwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fc3RyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwYXRoKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGRlcnJvcigiLXJlcG9ydC1jb25zb2xlIG11c3QgYmUgZm9sbG93ZWQgYnkgYSAndGNwOjxwb3J0Picgb3IgIgorICAgICAgICAgICAgICAgIid1bml4OjxwYXRoPiciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChmbGFncyAmIFJFUE9SVF9DT05TT0xFX1NFUlZFUikgeworICAgICAgICBpbnQgIHRyaWVzID0gMzsKKyAgICAgICAgRCggIndhaXRpbmcgZm9yIGNvbnNvbGUtcmVwb3J0aW5nIGNsaWVudCIgKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgczIgPSBzb2NrZXRfYWNjZXB0KHMsIE5VTEwpOworICAgICAgICB9IHdoaWxlIChzMiA8IDAgJiYgLS10cmllcyA+IDApOworCisgICAgICAgIGlmIChzMiA8IDApIHsKKyAgICAgICAgICAgIGRlcnJvcigiY291bGQgbm90IGFjY2VwdCBjb25zb2xlLXJlcG9ydGluZyBjbGllbnQgY29ubmVjdGlvbjogJXMiLAorICAgICAgICAgICAgICAgICAgIGVycm5vX3N0cik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzb2NrZXRfY2xvc2Uocyk7CisgICAgICAgIHMgPSBzMjsKKyAgICB9CisKKyAgICAvKiBzaW1wbHkgc2VuZCB0aGUgY29uc29sZSBwb3J0IGluIHRleHQgKi8KKyAgICB7CisgICAgICAgIGNoYXIgIHRlbXBbMTJdOworICAgICAgICBzbnByaW50ZiggdGVtcCwgc2l6ZW9mKHRlbXApLCAiJWQiLCBjb25zb2xlX3BvcnQgKTsKKworICAgICAgICBpZiAoc29ja2V0X3NlbmQocywgdGVtcCwgc3RybGVuKHRlbXApKSA8IDApIHsKKyAgICAgICAgICAgIGRlcnJvcigiY291bGQgbm90IHNlbmQgY29uc29sZSBudW1iZXIgcmVwb3J0OiAlZDogJXMiLCBlcnJubywKKyAgICAgICAgICAgICAgICAgICBlcnJub19zdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNvY2tldF9jbG9zZShzKTsKKyAgICB9CisgICAgRCggImNvbnNvbGUgcG9ydCBudW1iZXIgc2VudCB0byByZW1vdGUuIHJlc3VtaW5nIGJvb3QiICk7CisKKyAgICByZXN0b3JlX3NpZ2Fscm0gKCZzaWdzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWVtdV9hbmRyb2lkX2NvbnNvbGVfc3RhcnQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFuZHJvaWRDb25zb2xlQWdlbnRzKiBhZ2VudHMpIHsKKyAgICByZXR1cm4gYW5kcm9pZF9jb25zb2xlX3N0YXJ0KHBvcnQsIGFnZW50cyk7Cit9CisKKy8vIFRyeSB0byBiaW5kIHRvIHNwZWNpZmljIHxjb25zb2xlX3BvcnR8IGFuZCB8YWRiX3BvcnR8IG9uIHRoZSBsb2NhbGhvc3QKKy8vIGludGVyZmFjZS4gfGxlZ2FjeV9hZGJ8IGlzIHRydWUgaWZmIHRoZSBsZWdhY3kgQURCIG5ldHdvcmsgcmVkaXJlY3Rpb24KKy8vIHRocm91Z2ggZ3Vlc3Q6dGNwOjU1NTUgbXVzdCBhbHNvIGJlIHNldHVwLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuIE5vdGUgdGhhdCBmYWlsdXJlIGlzIGNsZWFuLCBpLmUuCisvLyBpdCB3b24ndCBsZWF2ZSBwb3J0cyBib3VuZCBieSBtaXN0YWtlLgorc3RhdGljIGJvb2wgc2V0dXBfY29uc29sZV9hbmRfYWRiX3BvcnRzKGludCBjb25zb2xlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkYl9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGVnYWN5X2FkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbmRyb2lkQ29uc29sZUFnZW50cyogYWdlbnRzKSB7CisgICAgYm9vbCByZWdpc3Rlcl9hZGJfc2VydmljZSA9IGZhbHNlOworICAgIC8vIFRoZSBndWVzdCBJUCB0aGF0IEFEQiBsaXN0ZW5zIHRvIGluIGxlZ2FjeSBtb2RlLgorICAgIHVpbnQzMl90IGd1ZXN0X2lwOworICAgIGluZXRfc3RydG9pcCgiMTAuMC4yLjE1IiwgJmd1ZXN0X2lwKTsKKworICAgIGlmIChsZWdhY3lfYWRiKSB7CisgICAgICAgIGFnZW50cy0+bmV0LT5zbGlycFJlZGlyKGZhbHNlLCBhZGJfcG9ydCwgZ3Vlc3RfaXAsIDU1NTUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhbmRyb2lkX2FkYl9zZXJ2ZXJfaW5pdChhZGJfcG9ydCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0ZXJfYWRiX3NlcnZpY2UgPSB0cnVlOworICAgIH0KKyAgICBpZiAocWVtdV9hbmRyb2lkX2NvbnNvbGVfc3RhcnQoY29uc29sZV9wb3J0LCBhZ2VudHMpIDwgMCkgeworICAgICAgICBpZiAobGVnYWN5X2FkYikgeworICAgICAgICAgICAgYWdlbnRzLT5uZXQtPnNsaXJwVW5yZWRpcihmYWxzZSwgYWRiX3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVnaXN0ZXJfYWRiX3NlcnZpY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGFuZHJvaWRfYWRiX3NlcnZlcl91bmRvX2luaXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChyZWdpc3Rlcl9hZGJfc2VydmljZSkgeworICAgICAgICBhbmRyb2lkX2FkYl9zZXJ2aWNlX2luaXQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gcWVtdV9tYWluKCkgb25jZSBhbGwgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQKKyAqIGl0IHNob3VsZCBiZSB1c2VkIHRvIHNldHVwIGFueSBBbmRyb2lkLXNwZWNpZmljIGl0ZW1zIGluIHRoZSBlbXVsYXRpb24gYmVmb3JlIHRoZQorICogbWFpbiBsb29wIHJ1bnMKKyAqLworYm9vbCBhbmRyb2lkX2VtdWxhdGlvbl9zZXR1cChjb25zdCBBbmRyb2lkQ29uc29sZUFnZW50cyogYWdlbnRzKSB7CisKKyAgICAvLyBSZWdpc3RlciBBbmRyb2lkIHBpcGUgc2VydmljZXMuCisgICAgYW5kcm9pZF9waXBlX2FkZF90eXBlX3plcm8oKTsKKyAgICBhbmRyb2lkX3BpcGVfYWRkX3R5cGVfcGluZ3BvbmcoKTsKKyAgICBhbmRyb2lkX3BpcGVfYWRkX3R5cGVfdGhyb3R0bGUoKTsKKworICAgIGFuZHJvaWRfdW5peF9waXBlc19pbml0KCk7CisgICAgYW5kcm9pZF9pbml0X29wZW5nbGVzX3BpcGUoKTsKKyAgICBhbmRyb2lkX2luaXRfY2xpcGJvYXJkX3BpcGUoKTsKKworICAgIGlmIChhbmRyb2lkX29wX3BvcnQgJiYgYW5kcm9pZF9vcF9wb3J0cykgeworICAgICAgICBkZXJyb3IoIm9wdGlvbnMgLXBvcnQgYW5kIC1wb3J0cyBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCB0cmllcyA9IE1BWF9BTkRST0lEX0VNVUxBVE9SUzsKKyAgICBpbnQgc3VjY2VzcyAgID0gMDsKKyAgICBpbnQgYWRiX3BvcnQgPSAtMTsKKyAgICBpbnQgYmFzZV9wb3J0ID0gQU5EUk9JRF9DT05TT0xFX0JBU0VQT1JUOworICAgIGludCBsZWdhY3lfYWRiID0gYXZkSW5mb19nZXRBZGJkQ29tbXVuaWNhdGlvbk1vZGUoYW5kcm9pZF9hdmRJbmZvKSA/IDAgOiAxOworCisgICAgaWYgKGFuZHJvaWRfb3BfcG9ydHMpIHsKKyAgICAgICAgaW50IGNvbnNvbGVfcG9ydCA9IC0xOworICAgICAgICBpZiAoIWFuZHJvaWRfcGFyc2VfcG9ydHNfb3B0aW9uKGFuZHJvaWRfb3BfcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnNvbGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRiX3BvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzZXR1cF9jb25zb2xlX2FuZF9hZGJfcG9ydHMoY29uc29sZV9wb3J0LCBhZGJfcG9ydCwgbGVnYWN5X2FkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZW50cyk7CisKKyAgICAgICAgYmFzZV9wb3J0ID0gY29uc29sZV9wb3J0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhbmRyb2lkX29wX3BvcnQpIHsKKyAgICAgICAgICAgIGlmICghYW5kcm9pZF9wYXJzZV9wb3J0X29wdGlvbihhbmRyb2lkX29wX3BvcnQsICZiYXNlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGJfcG9ydCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmllcyAgICAgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyhwcHJhYmh1KTogSXMgdGhpcyBsb29wIGx5aW5nPworICAgICAgICBmb3IgKCA7IHRyaWVzID4gMDsgdHJpZXMtLSwgYmFzZV9wb3J0ICs9IDIgKSB7CisKKyAgICAgICAgICAgIC8qIHNldHVwIGZpcnN0IHJlZGlyZWN0aW9uIGZvciBBREIsIHRoZSBBbmRyb2lkIERlYnVnIEJyaWRnZSAqLworICAgICAgICAgICAgYWRiX3BvcnQgPSBiYXNlX3BvcnQgKyAxOworCisgICAgICAgICAgICBpZiAoIXNldHVwX2NvbnNvbGVfYW5kX2FkYl9wb3J0cyhiYXNlX3BvcnQsIGFkYl9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X2FkYiwgYWdlbnRzKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBEKCAiY29udHJvbCBjb25zb2xlIGxpc3RlbmluZyBvbiBwb3J0ICVkLCBBREIgb24gcG9ydCAlZCIsIGJhc2VfcG9ydCwgYWRiX3BvcnQgKTsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIGRlcnJvcigiSXQgc2VlbXMgdG9vIG1hbnkgZW11bGF0b3IgaW5zdGFuY2VzIGFyZSBydW5uaW5nIG9uICIKKyAgICAgICAgICAgICAgICAgICAgInRoaXMgbWFjaGluZS4gQWJvcnRpbmcuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTYXZlIGJhc2UgcG9ydCBhbmQgQURCIHBvcnQuICovCisgICAgYW5kcm9pZF9iYXNlX3BvcnQgPSBiYXNlX3BvcnQ7CisgICAgYW5kcm9pZF9zZXJpYWxfbnVtYmVyX3BvcnQgPSBhZGJfcG9ydCAtIDE7CisKKyAgICAvKiBzZW5kIGEgc2ltcGxlIG1lc3NhZ2UgdG8gdGhlIEFEQiBob3N0IHNlcnZlciB0byB0ZWxsIGl0IHdlIGp1c3Qgc3RhcnRlZC4KKyAgICAqIGl0IHNob3VsZCBiZSBsaXN0ZW5pbmcgb24gcG9ydCA1MDM3LiBpZiB3ZSBjYW4ndCByZWFjaCBpdCwgZG9uJ3QgYm90aGVyCisgICAgKi8KKyAgICBhbmRyb2lkX2FkYl9zZXJ2ZXJfbm90aWZ5KGFkYl9wb3J0KTsKKworICAgIGFuZHJvaWRfdmFsaWRhdGVfcG9ydHMoYmFzZV9wb3J0LCBhZGJfcG9ydCk7CisKKyAgICBpZiAoYW5kcm9pZF9vcF9yZXBvcnRfY29uc29sZSkgeworICAgICAgICBpZiAocmVwb3J0X2NvbnNvbGUoYW5kcm9pZF9vcF9yZXBvcnRfY29uc29sZSwgYW5kcm9pZF9iYXNlX3BvcnQpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICBhZ2VudHMtPnRlbGVwaG9ueS0+aW5pdE1vZGVtKGFuZHJvaWRfYmFzZV9wb3J0KTsKKworICAgIC8qIHNldHVwIHRoZSBodHRwIHByb3h5LCBpZiBhbnkgKi8KKyAgICBpZiAoIW9wX2h0dHBfcHJveHkpIHsKKyAgICAgICAgb3BfaHR0cF9wcm94eSA9IGdldGVudigiaHR0cF9wcm94eSIpOworICAgIH0KKyAgICBhbmRyb2lkX2h0dHBfcHJveHlfc2V0dXAob3BfaHR0cF9wcm94eSwgVkVSQk9TRV9DSEVDSyhwcm94eSkpOworCisgICAgLyogaW5pdGlhbGl6ZSBzZW5zb3JzLCB0aGlzIG11c3QgYmUgZG9uZSBoZXJlIGR1ZSB0byB0aW1lciBpc3N1ZXMgKi8KKyAgICBhbmRyb2lkX2h3X3NlbnNvcnNfaW5pdCgpOworCisgICAgLyogaW5pdGlsaXplIGZpbmdwZXJwcmludCBoZXJlICovCisgICAgYW5kcm9pZF9od19maW5nZXJwcmludF9pbml0KCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xZW11LXRjcGR1bXAuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xZW11LXRjcGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVhNWEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3FlbXUtdGNwZHVtcC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGNwZHVtcC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworaW50ICBxZW11X3RjcGR1bXBfYWN0aXZlOworCitzdGF0aWMgRklMRSogICAgIGNhcHR1cmVfZmlsZTsKK3N0YXRpYyB1aW50NjRfdCAgY2FwdHVyZV9jb3VudDsKK3N0YXRpYyB1aW50NjRfdCAgY2FwdHVyZV9zaXplOworc3RhdGljIGludCAgICAgICBjYXB0dXJlX2luaXQ7CisKK3N0YXRpYyB2b2lkCitjYXB0dXJlX2F0ZXhpdCh2b2lkKQoreworICAgIGlmIChxZW11X3RjcGR1bXBfYWN0aXZlKSB7CisgICAgICAgIGZjbG9zZShjYXB0dXJlX2ZpbGUpOworICAgICAgICBxZW11X3RjcGR1bXBfYWN0aXZlID0gMDsKKyAgICB9Cit9CisKKy8qIFNlZSBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0RldmVsb3BtZW50L0xpYnBjYXBGaWxlRm9ybWF0IGZvcgorICogdGhlIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrZXQgY2FwdHVyZSBmaWxlIGZvcm1hdAorICovCisKKyNkZWZpbmUgIFBDQVBfTUFHSUMgICAgIDB4YTFiMmMzZDQKKyNkZWZpbmUgIFBDQVBfTUFKT1IgICAgIDIKKyNkZWZpbmUgIFBDQVBfTUlOT1IgICAgIDQKKyNkZWZpbmUgIFBDQVBfU05BUExFTiAgIDY1NTM1CisjZGVmaW5lICBQQ0FQX0VUSEVSTkVUICAxCisKK3N0YXRpYyBpbnQKK3BjYXBfd3JpdGVfaGVhZGVyKCBGSUxFKiAgb3V0ICkKK3sKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90ICAgbWFnaWM7CisgICAgICAgIHVpbnQxNl90ICAgdmVyc2lvbl9tYWpvcjsKKyAgICAgICAgdWludDE2X3QgICB2ZXJzaW9uX21pbm9yOworICAgICAgICBpbnQzMl90ICAgIHRoaXNfem9uZTsKKyAgICAgICAgdWludDMyX3QgICBzaWdmaWdzOworICAgICAgICB1aW50MzJfdCAgIHNuYXBsZW47CisgICAgICAgIHVpbnQzMl90ICAgbmV0d29yazsKKyAgICB9IFBjYXBIZWFkZXI7CisKKyAgICBQY2FwSGVhZGVyICBoOworCisgICAgaC5tYWdpYyAgICAgICAgID0gUENBUF9NQUdJQzsKKyAgICBoLnZlcnNpb25fbWFqb3IgPSBQQ0FQX01BSk9SOworICAgIGgudmVyc2lvbl9taW5vciA9IFBDQVBfTUlOT1I7CisgICAgaC50aGlzX3pvbmUgICAgID0gMDsKKyAgICBoLnNpZ2ZpZ3MgICAgICAgPSAwOyAgLyogYWxsIHRvb2xzIHNldCBpdCB0byAwIGluIHByYWN0aWNlICovCisgICAgaC5zbmFwbGVuICAgICAgID0gUENBUF9TTkFQTEVOOworICAgIGgubmV0d29yayAgICAgICA9IFBDQVBfRVRIRVJORVQ7CisKKyAgICBpZiAoZndyaXRlKCZoLCBzaXplb2YoaCksIDEsIG91dCkgIT0gMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK3FlbXVfdGNwZHVtcF9zdGFydCggY29uc3QgY2hhciogIGZpbGVwYXRoICkKK3sKKyAgICBpZiAoIWNhcHR1cmVfaW5pdCkgeworICAgICAgICBjYXB0dXJlX2luaXQgPSAxOworICAgICAgICBhdGV4aXQoY2FwdHVyZV9hdGV4aXQpOworICAgIH0KKworICAgIHFlbXVfdGNwZHVtcF9zdG9wKCk7CisKKyAgICBpZiAoZmlsZXBhdGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY2FwdHVyZV9maWxlID0gZm9wZW4oZmlsZXBhdGgsICJ3YiIpOworICAgIGlmIChjYXB0dXJlX2ZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHBjYXBfd3JpdGVfaGVhZGVyKGNhcHR1cmVfZmlsZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBxZW11X3RjcGR1bXBfYWN0aXZlID0gMTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorcWVtdV90Y3BkdW1wX3N0b3AoIHZvaWQgKQoreworICAgIGlmICghcWVtdV90Y3BkdW1wX2FjdGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcWVtdV90Y3BkdW1wX2FjdGl2ZSA9IDA7CisKKyAgICBjYXB0dXJlX2NvdW50ID0gMDsKKyAgICBjYXB0dXJlX3NpemUgID0gMDsKKworICAgIGZjbG9zZShjYXB0dXJlX2ZpbGUpOworICAgIGNhcHR1cmVfZmlsZSA9IE5VTEw7Cit9CisKK3ZvaWQKK3FlbXVfdGNwZHVtcF9wYWNrZXQoIGNvbnN0IHZvaWQqICBiYXNlLCBpbnQgIGxlbiApCit7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCAgdHNfc2VjOworICAgICAgICB1aW50MzJfdCAgdHNfdXNlYzsKKyAgICAgICAgdWludDMyX3QgIGluY2xfbGVuOworICAgICAgICB1aW50MzJfdCAgb3JpZ19sZW47CisgICAgfSBQYWNrZXRIZWFkZXI7CisKKyAgICBQYWNrZXRIZWFkZXIgICAgaDsKKyAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OworICAgIGludCAgICAgICAgICAgICBsZW4yID0gbGVuOworCisgICAgaWYgKGxlbjIgPiBQQ0FQX1NOQVBMRU4pCisgICAgICAgIGxlbjIgPSBQQ0FQX1NOQVBMRU47CisKKyAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgICAgaC50c19zZWMgICA9ICh1aW50MzJfdCkgbm93LnR2X3NlYzsKKyAgICBoLnRzX3VzZWMgID0gKHVpbnQzMl90KSBub3cudHZfdXNlYzsKKyAgICBoLmluY2xfbGVuID0gKHVpbnQzMl90KSBsZW4yOworICAgIGgub3JpZ19sZW4gPSAodWludDMyX3QpIGxlbjsKKworICAgIGZ3cml0ZSggJmgsIHNpemVvZihoKSwgMSwgY2FwdHVyZV9maWxlICk7CisgICAgZndyaXRlKCBiYXNlLCAxLCBsZW4yLCBjYXB0dXJlX2ZpbGUgKTsKKworICAgIGNhcHR1cmVfY291bnQgKz0gMTsKKyAgICBjYXB0dXJlX3NpemUgICs9IGxlbjI7Cit9CisKK3ZvaWQKK3FlbXVfdGNwZHVtcF9zdGF0cyggdWludDY0X3QgICpwY291bnQsIHVpbnQ2NF90KiAgcHNpemUgKQoreworICAgICpwY291bnQgPSBjYXB0dXJlX2NvdW50OworICAgICpwc2l6ZSAgPSBjYXB0dXJlX3NpemU7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA0YmUxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3BhdGguY3BwCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9xdC9xdF9wYXRoLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworCisvLyBHZXQgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXMgYW5kIHBsdWdpbnMuCitzdGF0aWMgc3RkOjpzdHJpbmcgYW5kcm9pZFF0R2V0QmFzZURpcihpbnQgYml0bmVzcywgY29uc3QgY2hhciogZW11bGF0b3JEaXIpIHsKKyAgICBpZiAoIWJpdG5lc3MpIHsKKyAgICAgICAgYml0bmVzcyA9IFN5c3RlbTo6Z2V0UHJvZ3JhbUJpdG5lc3MoKTsKKyAgICB9CisKKyAgICBTeXN0ZW0qIHN5c3RlbSA9IFN5c3RlbTo6Z2V0KCk7CisgICAgY29uc3QgY2hhciogY29uc3QgbGliQml0bmVzcyA9IGJpdG5lc3MgPT0gNjQgPyAibGliNjQiIDogImxpYiI7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1YkRpclZlY3RvcjsKKyAgICBzdWJEaXJWZWN0b3IucHVzaF9iYWNrKGVtdWxhdG9yRGlyID8gZW11bGF0b3JEaXIgOiBzeXN0ZW0tPmdldExhdW5jaGVyRGlyZWN0b3J5KCkpOworICAgIHN1YkRpclZlY3Rvci5wdXNoX2JhY2soc3RkOjpzdHJpbmcobGliQml0bmVzcykpOworICAgIHN1YkRpclZlY3Rvci5wdXNoX2JhY2soc3RkOjpzdHJpbmcoInF0IikpOworICAgIHN0ZDo6c3RyaW5nIHF0RGlyID0gUGF0aFV0aWxzOjpyZWNvbXBvc2Uoc3ViRGlyVmVjdG9yKTsKKworICAgIHJldHVybiBxdERpcjsKK30KKworc3RkOjpzdHJpbmcgYW5kcm9pZFF0R2V0TGlicmFyeURpcihpbnQgYml0bmVzcywgY29uc3QgY2hhciogZW11bGF0b3JEaXIpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3ViRGlyVmVjdG9yOworICAgIHN1YkRpclZlY3Rvci5wdXNoX2JhY2soYW5kcm9pZFF0R2V0QmFzZURpcihiaXRuZXNzLCBlbXVsYXRvckRpcikpOworICAgIHN1YkRpclZlY3Rvci5wdXNoX2JhY2soc3RkOjpzdHJpbmcoImxpYiIpKTsKKyAgICBzdGQ6OnN0cmluZyBxdExpYkRpciA9IFBhdGhVdGlsczo6cmVjb21wb3NlKHN1YkRpclZlY3Rvcik7CisKKyAgICByZXR1cm4gcXRMaWJEaXI7Cit9CisKK3N0ZDo6c3RyaW5nIGFuZHJvaWRRdEdldFBsdWdpbnNEaXIoaW50IGJpdG5lc3MsIGNvbnN0IGNoYXIqIGVtdWxhdG9yRGlyKSB7CisgICAgU3lzdGVtKiBzeXN0ZW0gPSBTeXN0ZW06OmdldCgpOworICAgIHN0ZDo6c3RyaW5nIHF0UGx1Z2luc0RpciA9CisgICAgICAgICAgICBzeXN0ZW0tPmVudkdldCgiQU5EUk9JRF9RVF9RUEFfUExBVEZPUk1fUExVR0lOX1BBVEgiKTsKKyAgICBpZiAoIXF0UGx1Z2luc0Rpci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBxdFBsdWdpbnNEaXI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN1YkRpclZlY3RvcjsKKyAgICBzdWJEaXJWZWN0b3IucHVzaF9iYWNrKGFuZHJvaWRRdEdldEJhc2VEaXIoYml0bmVzcywgZW11bGF0b3JEaXIpKTsKKyAgICBzdWJEaXJWZWN0b3IucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCJwbHVnaW5zIikpOworICAgIHF0UGx1Z2luc0RpciA9IFBhdGhVdGlsczo6cmVjb21wb3NlKHN1YkRpclZlY3Rvcik7CisKKyAgICByZXR1cm4gcXRQbHVnaW5zRGlyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3BhdGguaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmNGI2NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIGVtdWxhdG9yJ3MgUXQgbGlicmFyeSBkaXJlY3RvcnksCisvLyB3aGljaCBob2xkcyBRdCdzIHNoYXJlZCBsaWJyYXJpZXMuIFRoaXMgcGF0aCBpcyB0eXBpY2FsbHkKKy8vIGFkZGVkIHRvIHRoZSBzeXN0ZW0gbGlicmFyeSBzZWFyY2ggcGF0aCBhbmQgcGFzc2VkIHRvCisvLyBRQ29yZUFwcGxpY2F0aW9uOjpzZXRMaWJyYXJ5UGF0aHMoKS4KKy8vIHxiaXRuZXNzfCAtIHRhcmdldCBwcm9ncmFtIGJpdHRuZXNzLCAzMi82NCBvciAwIGZvciBhdXRvZGV0ZWN0aW9uCisvLyB8ZW11bGF0b3JEaXJ8IC0gdGhlIGRpcmVjdG9yeSB3aGVyZSAnZW11bGF0b3InIGlzIGxvY2F0ZWQ7IGlmIG5vdCBnaXZlbiwKKy8vIGl0IHdpbGwgYmUgaW5mZXJyZWQgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBjYWxsaW5nIGJpbmFyeSBvZiB0aGlzCisvLyBmdW5jdGlvbgorc3RkOjpzdHJpbmcgYW5kcm9pZFF0R2V0TGlicmFyeURpcihpbnQgYml0bmVzcyA9IDAsIGNvbnN0IGNoYXIqIGVtdWxhdG9yRGlyID0gbnVsbHB0cik7CisKKy8vIFJldHVybiB0aGUgcGF0aCB0byB0aGUgZW11bGF0b3IncyBRdCBwbHVnaW5zIGRpcmVjdG9yeSwKKy8vIHdoaWNoIGhvbGRzIFF0J3MgcGx1Z2lucy4gSXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZQorLy8gUVRfUVBBX1BMQVRGT1JNX1BMVUdJTl9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLgorLy8gfGJpdG5lc3N8IC0gdGFyZ2V0IHByb2dyYW0gYml0dG5lc3MsIDMyLzY0IG9yIDAgZm9yIGF1dG9kZXRlY3Rpb24KKy8vIHxlbXVsYXRvckRpcnwgLSB0aGUgZGlyZWN0b3J5IHdoZXJlICdlbXVsYXRvcicgaXMgbG9jYXRlZDsKKy8vIHxlbXVsYXRvckRpcnwgLSB0aGUgZGlyZWN0b3J5IHdoZXJlICdlbXVsYXRvcicgaXMgbG9jYXRlZDsgaWYgbm90IGdpdmVuLAorLy8gaXQgd2lsbCBiZSBpbmZlcnJlZCBiYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGNhbGxpbmcgYmluYXJ5IG9mIHRoaXMKKy8vIGZ1bmN0aW9uCitzdGQ6OnN0cmluZyBhbmRyb2lkUXRHZXRQbHVnaW5zRGlyKGludCBiaXRuZXNzID0gMCwgY29uc3QgY2hhciogZW11bGF0b3JEaXIgPSBudWxscHRyKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9wYXRoX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGZhOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3BhdGhfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvcXQvcXRfcGF0aC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworVEVTVChhbmRyb2lkUXRHZXRMaWJyYXJ5RGlyLCBRdDMyKSB7CisjaWYgX1dJTjMyCisgICAgY29uc3QgY2hhciBiYXNlUGF0aFtdICAgPSAiXFxmb28iOworICAgIGNvbnN0IGNoYXIgcmVzdWx0UGF0aFtdID0gIlxcZm9vXFxsaWJcXHF0XFxsaWIiOworI2Vsc2UKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gID0gIi9mb28iOworICAgIGNvbnN0IGNoYXIgcmVzdWx0UGF0aFtdID0gIi9mb28vbGliL3F0L2xpYiI7CisjZW5kaWYKKworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhiYXNlUGF0aCwgMzIpOworCisgICAgRVhQRUNUX1NUUkVRKHJlc3VsdFBhdGgsIGFuZHJvaWRRdEdldExpYnJhcnlEaXIoMzIpLmNfc3RyKCkpOworfQorCitURVNUKGFuZHJvaWRRdEdldExpYnJhcnlEaXIsIFF0NjQpIHsKKyNpZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gICA9ICJcXGZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiXFxmb29cXGxpYjY0XFxxdFxcbGliIjsKKyNlbHNlCisgICAgY29uc3QgY2hhciBiYXNlUGF0aFtdICA9ICIvZm9vIjsKKyAgICBjb25zdCBjaGFyIHJlc3VsdFBhdGhbXSA9ICIvZm9vL2xpYjY0L3F0L2xpYiI7CisjZW5kaWYKKworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhiYXNlUGF0aCwgNjQpOworCisgICAgRVhQRUNUX1NUUkVRKHJlc3VsdFBhdGgsIGFuZHJvaWRRdEdldExpYnJhcnlEaXIoNjQpLmNfc3RyKCkpOworfQorCisKK1RFU1QoYW5kcm9pZFF0R2V0TGlicmFyeURpciwgRGV0ZWN0Qml0dG5lc3MpIHsKKyNpZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gICA9ICJcXGZvbyI7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0UGF0aCA9IHN0ZDo6c3RyaW5nKCJcXGZvb1xcIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN5c3RlbTo6a0xpYlN1YkRpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcXHF0XFxsaWIiKTsKKyNlbHNlCisgICAgY29uc3QgY2hhciBiYXNlUGF0aFtdICA9ICIvZm9vIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHRQYXRoID0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCIvZm9vLyIpLmFwcGVuZChTeXN0ZW06OmtMaWJTdWJEaXIpLmFwcGVuZCgiL3F0L2xpYiIpOworI2VuZGlmCisKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoYmFzZVBhdGgsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKworICAgIEVYUEVDVF9TVFJFUShyZXN1bHRQYXRoLmNfc3RyKCksIGFuZHJvaWRRdEdldExpYnJhcnlEaXIoMCkuY19zdHIoKSk7Cit9CisKK1RFU1QoYW5kcm9pZFF0R2V0UGx1Z2luc0RpciwgUXQzMikgeworI2lmIF9XSU4zMgorICAgIGNvbnN0IGNoYXIgYmFzZVBhdGhbXSAgID0gIlxcZm9vIjsKKyAgICBjb25zdCBjaGFyIHJlc3VsdFBhdGhbXSA9ICJcXGZvb1xcbGliXFxxdFxccGx1Z2lucyI7CisjZWxzZQorICAgIGNvbnN0IGNoYXIgYmFzZVBhdGhbXSAgPSAiL2ZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiL2Zvby9saWIvcXQvcGx1Z2lucyI7CisjZW5kaWYKKworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhiYXNlUGF0aCwgMzIpOworCisgICAgRVhQRUNUX1NUUkVRKHJlc3VsdFBhdGgsIGFuZHJvaWRRdEdldFBsdWdpbnNEaXIoMzIpLmNfc3RyKCkpOworfQorCitURVNUKGFuZHJvaWRRdEdldFBsdWdpbnNEaXIsIFF0NjQpIHsKKyNpZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gICA9ICJcXGZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiXFxmb29cXGxpYjY0XFxxdFxccGx1Z2lucyI7CisjZWxzZQorICAgIGNvbnN0IGNoYXIgYmFzZVBhdGhbXSAgPSAiL2ZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiL2Zvby9saWI2NC9xdC9wbHVnaW5zIjsKKyNlbmRpZgorCisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzKGJhc2VQYXRoLCA2NCk7CisKKyAgICBFWFBFQ1RfU1RSRVEocmVzdWx0UGF0aCwgYW5kcm9pZFF0R2V0UGx1Z2luc0Rpcig2NCkuY19zdHIoKSk7Cit9CisKK1RFU1QoYW5kcm9pZFF0R2V0UGx1Z2luc0RpciwgUmVzcGVjdEVudikgeworI2lmIF9XSU4zMgorICAgIGNvbnN0IGNoYXIgYmFzZVBhdGhbXSA9ICJcXGZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiXFxvdGhlclxccXRfcGx1Z2lucyI7CisjZWxzZQorICAgIGNvbnN0IGNoYXIgYmFzZVBhdGhbXSAgPSAiL2ZvbyI7CisgICAgY29uc3QgY2hhciByZXN1bHRQYXRoW10gPSAiL290aGVyL3F0X3BsdWdpbnMiOworI2VuZGlmCisKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMoYmFzZVBhdGgsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICB0ZXN0U3lzLmVudlNldCgiQU5EUk9JRF9RVF9RUEFfUExBVEZPUk1fUExVR0lOX1BBVEgiLCByZXN1bHRQYXRoKTsKKworICAgIEVYUEVDVF9TVFJFUShyZXN1bHRQYXRoLCBhbmRyb2lkUXRHZXRQbHVnaW5zRGlyKDApLmNfc3RyKCkpOworfQorCitURVNUKGFuZHJvaWRRdEdldFBsdWdpbnNEaXIsIERldGVjdEJpdG5lc3MpIHsKKyNpZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gPSAiXFxmb28iOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdFBhdGggPSBzdGQ6OnN0cmluZygiXFxmb29cXCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTeXN0ZW06OmtMaWJTdWJEaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiXFxxdFxccGx1Z2lucyIpOworI2Vsc2UKKyAgICBjb25zdCBjaGFyIGJhc2VQYXRoW10gID0gIi9mb28iOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdFBhdGggPSBzdGQ6OnN0cmluZygiL2Zvby8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoU3lzdGVtOjprTGliU3ViRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIi9xdC9wbHVnaW5zIik7CisjZW5kaWYKKworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cyhiYXNlUGF0aCwgU3lzdGVtOjprUHJvZ3JhbUJpdG5lc3MpOworCisgICAgRVhQRUNUX1NUUkVRKHJlc3VsdFBhdGguY19zdHIoKSwgYW5kcm9pZFF0R2V0UGx1Z2luc0RpcigwKS5jX3N0cigpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9zZXR1cC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcXQvcXRfc2V0dXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDQ1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcXQvcXRfc2V0dXAuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3F0L3F0X3NldHVwLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3F0L3F0X3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitib29sIGFuZHJvaWRRdFNldHVwRW52KGludCBiaXRuZXNzLCBjb25zdCBjaGFyKiBlbXVsYXRvckRpcikgeworICAgIC8vIEFkZCA8cHJvZ2Rpcj4vPGxpYj4vcXQvbGliIGlmIGl0IGV4aXN0cyB0byB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aC4KKyAgICBzdGQ6OnN0cmluZyBxdExpYlN1YkRpciA9IGFuZHJvaWRRdEdldExpYnJhcnlEaXIoYml0bmVzcywgZW11bGF0b3JEaXIpOworICAgIGF1dG8gc3lzdGVtID0gYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpnZXQoKTsKKworICAgIGlmICghc3lzdGVtLT5wYXRoSXNEaXIocXRMaWJTdWJEaXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlF0IGxpYnJhcnkgbm90IGZvdW5kIGF0ICIgPDwgcXRMaWJTdWJEaXIuY19zdHIoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBWRVJCT1NFX1BSSU5UKGluaXQsCisgICAgICAgICJBZGRpbmcgbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgUXQ6ICclcyciLCBxdExpYlN1YkRpci5jX3N0cigpKTsKKyAgICBzeXN0ZW0tPmFkZExpYnJhcnlTZWFyY2hEaXIocXRMaWJTdWJEaXIpOworCisgICAgLy8gU2V0IHRoZSBwbGF0Zm9ybXMgcGx1Z2luIHBhdGggdG9vLgorICAgIHN0ZDo6c3RyaW5nIHF0UGx1Z2luc1N1YkRpciA9IGFuZHJvaWRRdEdldFBsdWdpbnNEaXIoYml0bmVzcywgZW11bGF0b3JEaXIpOworCisgICAgVkVSQk9TRV9QUklOVChpbml0LAorICAgICAgICAiU2V0dGluZyBRdCBwbHVnaW4gc2VhcmNoIHBhdGg6IFFUX1FQQV9QTEFURk9STV9QTFVHSU5fUEFUSD0lcyIsCisgICAgICAgIHF0UGx1Z2luc1N1YkRpci5jX3N0cigpKTsKKyAgICBzeXN0ZW0tPmVudlNldCgiUVRfUVBBX1BMQVRGT1JNX1BMVUdJTl9QQVRIIiwgcXRQbHVnaW5zU3ViRGlyKTsKKworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3NldHVwLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcXQvcXRfc2V0dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzk0ODUxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3NldHVwLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBTZXR1cCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcnVuIHRoZSBRdC1iYXNlZCBVSSBwcm9ncmFtcy4KKy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSB0b3AtbGV2ZWwgbGF1bmNoZXIgYW5kIHdpbGwKKy8vIG1vZGlmeSB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCB3aGVuIG5lZWRlZC4KKy8vIFJldHVybiB0cnVlIGluIGNhc2Ugb2Ygc3VjY2VzcywgZmFsc2UgaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZworLy8gUXQgbGlicmFyeSBkaXJlY3RvcnkuCisvLyB8Yml0bmVzc3wgLSB0YXJnZXQgcHJvZ3JhbSBiaXR0bmVzcywgMzIvNjQgb3IgMCBmb3IgYXV0b2RldGVjdGlvbgorLy8gfGVtdWxhdG9yRGlyfCAtIHRoZSBkaXJlY3Rvcnkgd2hlcmUgJ2VtdWxhdG9yJyBpcyBsb2NhdGVkOyBpZiBub3QgZ2l2ZW4sCisvLyBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FsbGluZyBiaW5hcnkgb2YgdGhpcworLy8gZnVuY3Rpb24KK2Jvb2wgYW5kcm9pZFF0U2V0dXBFbnYoaW50IGJpdG5lc3MsIGNvbnN0IGNoYXIqIGVtdWxhdG9yRGlyID0gbnVsbHB0cik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3F0L3F0X3NldHVwX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9zZXR1cF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5NTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9xdC9xdF9zZXR1cF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9xdC9xdF9zZXR1cC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFN5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RUZW1wRGlyLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworVEVTVChhbmRyb2lkUXRTZXR1cEVudiwgTm9RdExpYkRpcikgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5czMyKCIvZm9vIiwgMzIpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyMzIgPSB0ZXN0U3lzMzIuZ2V0VGVtcFJvb3QoKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjMyLT5tYWtlU3ViRGlyKCJmb28vbGliNjQiKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRRdFNldHVwRW52KDMyKSk7CisKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXM2NCgiL2ZvbyIsIDY0KTsKKyAgICBUZXN0VGVtcERpciogdGVzdERpcjY0ID0gdGVzdFN5czY0LmdldFRlbXBSb290KCk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28vbGliIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYjY0IikpOworICAgIEVYUEVDVF9GQUxTRShhbmRyb2lkUXRTZXR1cEVudig2NCkpOworfQorCitURVNUKGFuZHJvaWRRdFNldHVwRW52LCBRdExpYkRpcjMyT25seSkgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5czMyKCIvZm9vIiwgMzIpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyMzIgPSB0ZXN0U3lzMzIuZ2V0VGVtcFJvb3QoKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjMyLT5tYWtlU3ViRGlyKCJmb28vbGliL3F0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYi9xdC9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjMyLT5tYWtlU3ViRGlyKCJmb28vbGliNjQiKSk7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZFF0U2V0dXBFbnYoMzIpKTsKKworICAgIFRlc3RTeXN0ZW0gdGVzdFN5czY0KCIvZm9vIiwgNjQpOworICAgIFRlc3RUZW1wRGlyKiB0ZXN0RGlyNjQgPSB0ZXN0U3lzNjQuZ2V0VGVtcFJvb3QoKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvby9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28vbGliL3F0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYi9xdC9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28vbGliNjQiKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRRdFNldHVwRW52KDY0KSk7Cit9CisKK1RFU1QoYW5kcm9pZFF0U2V0dXBFbnYsIFF0TGliRGlyNjRPbmx5KSB7CisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzMzIoIi9mb28iLCAzMik7CisgICAgVGVzdFRlbXBEaXIqIHRlc3REaXIzMiA9IHRlc3RTeXMzMi5nZXRUZW1wUm9vdCgpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWI2NCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWI2NC9xdCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWI2NC9xdC9saWIiKSk7CisgICAgRVhQRUNUX0ZBTFNFKGFuZHJvaWRRdFNldHVwRW52KDMyKSk7CisKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXM2NCgiL2ZvbyIsIDY0KTsKKyAgICBUZXN0VGVtcERpciogdGVzdERpcjY0ID0gdGVzdFN5czY0LmdldFRlbXBSb290KCk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28vbGliIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYjY0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L3F0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L3F0L2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkUXRTZXR1cEVudig2NCkpOworfQorCitURVNUKGFuZHJvaWRRdFNldHVwRW52LCBRdExpYkRpcjMyQW5kNjQpIHsKKyAgICBUZXN0U3lzdGVtIHRlc3RTeXMzMigiL2ZvbyIsIDMyKTsKKyAgICBUZXN0VGVtcERpciogdGVzdERpcjMyID0gdGVzdFN5czMyLmdldFRlbXBSb290KCk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjMyLT5tYWtlU3ViRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjMyLT5tYWtlU3ViRGlyKCJmb28vbGliIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYi9xdCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyMzItPm1ha2VTdWJEaXIoImZvby9saWIvcXQvbGliIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYjY0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L3F0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXIzMi0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L3F0L2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkUXRTZXR1cEVudigzMikpOworCisgICAgVGVzdFN5c3RlbSB0ZXN0U3lzNjQoIi9mb28iLCA2NCk7CisgICAgVGVzdFRlbXBEaXIqIHRlc3REaXI2NCA9IHRlc3RTeXM2NC5nZXRUZW1wUm9vdCgpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXI2NC0+bWFrZVN1YkRpcigiZm9vL2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvby9saWIvcXQiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpcjY0LT5tYWtlU3ViRGlyKCJmb28vbGliL3F0L2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvby9saWI2NCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvby9saWI2NC9xdCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyNjQtPm1ha2VTdWJEaXIoImZvby9saWI2NC9xdC9saWIiKSk7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZFF0U2V0dXBFbnYoNjQpKTsKK30KKworVEVTVChhbmRyb2lkUXRTZXR1cEVudiwgRGV0ZWN0Qml0bmVzcykgeworICAgIFRlc3RTeXN0ZW0gdGVzdFN5cygiL2ZvbyIsIFN5c3RlbTo6a1Byb2dyYW1CaXRuZXNzKTsKKyAgICBUZXN0VGVtcERpciogdGVzdERpciA9IHRlc3RTeXMuZ2V0VGVtcFJvb3QoKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyLT5tYWtlU3ViRGlyKCJmb28iKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpci0+bWFrZVN1YkRpcigiZm9vL2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyLT5tYWtlU3ViRGlyKCJmb28vbGliL3F0IikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXItPm1ha2VTdWJEaXIoImZvby9saWIvcXQvbGliIikpOworICAgIEVYUEVDVF9UUlVFKHRlc3REaXItPm1ha2VTdWJEaXIoImZvby9saWI2NCIpKTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0RGlyLT5tYWtlU3ViRGlyKCJmb28vbGliNjQvcXQiKSk7CisgICAgRVhQRUNUX1RSVUUodGVzdERpci0+bWFrZVN1YkRpcigiZm9vL2xpYjY0L3F0L2xpYiIpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkUXRTZXR1cEVudigwKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcmVzb3VyY2UuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9yZXNvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYWVlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcmVzb3VyY2UuYwpAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9yZXNvdXJjZS5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogICAgICAgICAgIG5hbWU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogIGJhc2U7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIHNpemU7Cit9IEZpbGVFbnRyeTsKKworY29uc3QgdW5zaWduZWQgY2hhcioKK19yZXNvdXJjZV9maW5kKCBjb25zdCBjaGFyKiAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVFbnRyeSogIGVudHJpZXMsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAqcHNpemUgKQoreworICAgIGNvbnN0IEZpbGVFbnRyeSogIGUgPSBlbnRyaWVzOworCisgICAgZm9yICggOyBlLT5uYW1lICE9IE5VTEw7IGUrKyApIHsKKyAgICAgICAgLy9kcHJpbnQoIlNDQU4gJXNcbiIsIGUtPm5hbWUpOworICAgICAgICBpZiAoIHN0cmNtcChlLT5uYW1lLCBuYW1lKSA9PSAwICkgeworICAgICAgICAgICAgKnBzaXplID0gZS0+c2l6ZTsKKyAgICAgICAgICAgIHJldHVybiBlLT5iYXNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisjdW5kZWYgICBfZmlsZV9lbnRyaWVzCisjZGVmaW5lICBfZmlsZV9lbnRyaWVzICBfaWNvbl9lbnRyaWVzCisKK2NvbnN0IHVuc2lnbmVkIGNoYXIqIGFuZHJvaWRfZW11bGF0b3JfaWNvbl9maW5kKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBzaXplKSB7CisjICAgaW5jbHVkZSAiYW5kcm9pZC9pY29ucy5oIgorICAgIHJldHVybiBfcmVzb3VyY2VfZmluZCggbmFtZSwgX2ZpbGVfZW50cmllcywgcHNpemUgKTsKK30KKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcmVzb3VyY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjIzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvcmVzb3VyY2UuaApAQCAtMCwwICsxLDIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyKgorYW5kcm9pZF9yZXNvdXJjZV9maW5kKCBjb25zdCBjaGFyKiAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICpwc2l6ZSApOworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciogYW5kcm9pZF9lbXVsYXRvcl9pY29uX2ZpbmQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBzaXplKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZGstY29udHJvbGxlci1zb2NrZXQuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZGstY29udHJvbGxlci1zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmFkNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Nkay1jb250cm9sbGVyLXNvY2tldC5jCkBAIC0wLDAgKzEsMjIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBFbmNhcHN1bGF0ZXMgZXhjaGFuZ2UgcHJvdG9jb2wgYmV0d2VlbiB0aGUgZW11bGF0b3IsIGFuZCBhbiBBbmRyb2lkIGRldmljZQorICogdGhhdCBpcyBjb25uZWN0ZWQgdG8gdGhlIGhvc3QgdmlhIFVTQi4gVGhlIGNvbW11bmljYXRpb24gaXMgZXN0YWJsaXNoZWQgb3ZlcgorICogYSBUQ1AgcG9ydCBmb3J3YXJkaW5nLCBlbmFibGVkIGJ5IEFEQi4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9zZGstY29udHJvbGxlci1zb2NrZXQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYXN5bmMtc29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hc3luYy1zb2NrZXQtY29ubmVjdG9yLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW9sb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhbmljLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSAgRSguLi4pICAgIGRlcnJvcihfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFcoLi4uKSAgICBkd2FybmluZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIEQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKHNka2N0bHNvY2tldCxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKHNka2N0bHNvY2tldCkKKworI2RlZmluZSBUUkFDRV9PTiAgICAwCisKKyNpZiBUUkFDRV9PTgorI2RlZmluZSAgVCguLi4pICAgIFZFUkJPU0VfUFJJTlQoc2RrY3Rsc29ja2V0LF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgIFQoLi4uKQorI2VuZGlmCisKKy8qIFJlY3ljbGluZyBtZW1vcnkgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bFJlY3ljbGVkIFNES0N0bFJlY3ljbGVkOworc3RydWN0IFNES0N0bFJlY3ljbGVkIHsKKyAgICB1bmlvbiB7CisgICAgICAgIC8qIE5leHQgcmVjeWNsZWQgZGVzY3JpcHRvciAod2hpbGUgbGlzdGVkIGluIHJlY3ljbGVyKS4gKi8KKyAgICAgICAgU0RLQ3RsUmVjeWNsZWQqIG5leHQ7CisgICAgICAgIC8qIEFsbG9jYXRlZCBtZW1vcnkgc2l6ZSAod2hpbGUgb3V0c2lkZSBvZiB0aGUgcmVjeWNsZXIpLiAqLworICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZTsKKyAgICB9OworfTsKKworLyoKKyAqIFR5cGVzIG9mIHRoZSBkYXRhIHBhY2tldHMgc2VudCB2aWEgU0RLIGNvbnRyb2xsZXIgc29ja2V0LgorICovCisKKy8qIFRoZSBwYWNrZXQgaXMgYSBtZXNzYWdlLiAqLworI2RlZmluZSBTREtDVExfUEFDS0VUX01FU1NBR0UgICAgICAgICAgIDEKKy8qIFRoZSBwYWNrZXQgaXMgYSBxdWVyeS4gKi8KKyNkZWZpbmUgU0RLQ1RMX1BBQ0tFVF9RVUVSWSAgICAgICAgICAgICAyCisvKiBUaGUgcGFja2V0IGlzIGEgcmVzcG9uc2UgdG8gYSBxdWVyeS4gKi8KKyNkZWZpbmUgU0RLQ1RMX1BBQ0tFVF9RVUVSWV9SRVNQT05TRSAgICAzCisKKy8qCisgKiBUeXBlcyBvZiBpbnRlbmFsIHBvcnQgbWVzc2FnZXMgc2VudCB2aWEgU0RLIGNvbnRyb2xsZXIgc29ja2V0LgorICovCisKKy8qIFBvcnQgaXMgY29ubmVjdGVkLgorICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYnkgU0RLIGNvbnRyb2xsZXIgd2hlbiB0aGUgc2VydmljZSBjb25uZWN0cyBhIHNvY2tldCB3aXRoCisgKiBhIHBvcnQgdGhhdCBwcm92aWRlcyByZXF1ZXN0ZWQgZW11bGF0aW9uIGZ1bmN0aW9uYWxpdHkuCisgKi8KKyNkZWZpbmUgU0RLQ1RMX01TR19QT1JUX0NPTk5FQ1RFRCAgICAgICAtMQorLyogUG9ydCBpcyBkaXNjb25uZWN0ZWQuCisgKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBieSBTREsgY29udHJvbGxlciB3aGVuIGEgcG9ydCB0aGF0IHByb3ZpZGVzIHJlcXVlc3RlZAorICogZW11bGF0aW9uIGZ1bmN0aW9uYWxpdHkgZGlzY29ubmVjdHMgZnJvbSB0aGUgc29ja2V0LgorICovCisjZGVmaW5lIFNES0NUTF9NU0dfUE9SVF9ESVNDT05ORUNURUQgICAgLTIKKy8qIFBvcnQgaXMgZW5hYmxlZC4KKyAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGJ5IFNESyBjb250cm9sbGVyIHdoZW4gYSBwb3J0IHRoYXQgcHJvdmlkZXMgcmVxdWVzdGVkCisgKiBlbXVsYXRpb24gZnVuY3Rpb25hbGl0eSBpcyByZWFkeSB0byBkbyB0aGUgZW11bGF0aW9uLgorICovCisjZGVmaW5lIFNES0NUTF9NU0dfUE9SVF9FTkFCTEVEICAgICAgICAgLTMKKy8qIFBvcnQgaXMgZGlzYWJsZWQuCisgKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBieSBTREsgY29udHJvbGxlciB3aGVuIGEgcG9ydCB0aGF0IHByb3ZpZGVzIHJlcXVlc3RlZAorICogZW11bGF0aW9uIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHJlYWR5IHRvIGRvIHRoZSBlbXVsYXRpb24uCisgKi8KKyNkZWZpbmUgU0RLQ1RMX01TR19QT1JUX0RJU0FCTEVEICAgICAgICAtNAorCisvKgorICogVHlwZXMgb2YgaW50ZXJuYWwgcXVlcmllcyBzZW50IHZpYSBTREsgY29udHJvbGxlciBzb2NrZXQuCisgKi8KKworLyogSGFuZHNoYWtlIHF1ZXJ5LgorICogVGhpcyBxdWVyeSBpcyBzZW50IHRvIFNESyBjb250cm9sbGVyIHNlcnZpY2UgYXMgcGFydCBvZiB0aGUgY29ubmVjdGlvbgorICogcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisgKi8KKyNkZWZpbmUgU0RLQ1RMX1FVRVJZX0hBTkRTSEFLRSAgICAgICAgICAtMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIFNES0N0bFBhY2tldCBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQYWNrZXQgc2lnbmF0dXJlIHZhbHVlICgnU0RLQycpLiAqLworc3RhdGljIGNvbnN0IGludCBfc2RrY3RsX3BhY2tldF9zaWcgPSAweDUzNDQ0QjQzOworCisvKiBEYXRhIHBhY2tldCBkZXNjcmlwdG9yLgorICoKKyAqIEFsbCBwYWNrZXRzLCBzZW50IGFuZCByZWNlaXZlZCB2aWEgU0RLIGNvbnRyb2xsZXIgc29ja2V0IGJlZ2luIHdpdGggdGhpcworICogaGVhZGVyLCB3aXRoIHBhY2tldCBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU0RLQ3RsUGFja2V0SGVhZGVyIHsKKyAgICAvKiBTaWduYXR1cmUuICovCisgICAgaW50ICAgICBzaWduYXR1cmU7CisgICAgLyogVG90YWwgc2l6ZSBvZiB0aGUgZGF0YSB0byB0cmFuc2ZlciB3aXRoIHRoaXMgcGFja2V0LCBpbmNsdWRpbmcgdGhpcworICAgICAqIGhlYWRlci4gVGhlIHRyYW5zZmVycmluZyBkYXRhIHNob3VsZCBpbW1lZGlhdGVsbHkgZm9sbG93IHRoaXMgaGVhZGVyLiAqLworICAgIGludCAgICAgc2l6ZTsKKyAgICAvKiBFbmNvZGVzIHBhY2tldCB0eXBlLiBTZWUgU0RLQ1RMX1BBQ0tFVF9YWFggZm9yIHRoZSBsaXN0IG9mIHBhY2tldCB0eXBlcworICAgICAqIHVzZWQgYnkgU0RLIGNvbnRyb2xsZXIuICovCisgICAgaW50ICAgICB0eXBlOworfSBTREtDdGxQYWNrZXRIZWFkZXI7CisKKy8qIFBhY2tldCBkZXNjcmlwdG9yLCBhbGxvY2F0ZWQgYnkgdGhpcyBBUEkgZm9yIGRhdGEgcGFja2V0cyB0byBiZSBzZW50IHRvIFNESworICogY29udHJvbGxlci4KKyAqCisgKiBXaGVuIHBhY2tldCBkZXNjcmlwdG9ycyBhcmUgYWxsb2NhdGVkIGJ5IHRoaXMgQVBJLCB0aGV5IGFyZSBhbGxvY2F0ZWQgbGFyZ2UKKyAqIGVub3VnaCB0byBjb250YWluIHRoaXMgaGVhZGVyLCBhbmQgcGFja2V0IGRhdGEgdG8gc2VuZCB0byB0aGUgc2VydmljZSwKKyAqIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIGRlc2NyaXB0b3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bFBhY2tldCB7CisgICAgLyogU3VwcG9ydHMgcmVjeWNsaW5nLiBEb24ndCBwdXQgYW55dGhpbmcgaW4gZnJvbnQ6IHJlY3ljbGVyIGV4cGVjdHMgdGhpcworICAgICAqIHRvIGJlIHRoZSBmaXJzdCBmaWVsZCBpbiByZWN5Y2xhYmxlIGRlc2NyaXB0b3IuICovCisgICAgU0RLQ3RsUmVjeWNsZWQgICAgICAgICAgcmVjeWNsaW5nOworCisgICAgLyogU0RLIGNvbnRyb2xsZXIgc29ja2V0IHRoYXQgdHJhbnNtaXRzIHRoaXMgcGFja2V0LiAqLworICAgIFNES0N0bFNvY2tldCogICAgICAgICAgIHNka2N0bDsKKyAgICAvKiBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgcGFja2V0LiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlZl9jb3VudDsKKworICAgIC8qIENvbW1vbiBwYWNrZXQgaGVhZGVyLiBQYWNrZXQgZGF0YSBpbW1lZGlhdGVseSBmb2xsb3dzIHRoaXMgaGVhZGVyLCBzbyBpdAorICAgICAqIG11c3QgYmUgdGhlIGxhc3QgZmllbGQgaW4gU0RLQ3RsUGFja2V0IGRlc2NyaXB0b3IuICovCisgICAgU0RLQ3RsUGFja2V0SGVhZGVyICAgICAgaGVhZGVyOworfSBTREtDdGxQYWNrZXQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsRGlyZWN0UGFja2V0IGRlY2xhcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERpcmVjdCBwYWNrZXQgZGVzY3JpcHRvciwgYWxsb2NhdGVkIGJ5IHRoaXMgQVBJIGZvciBkaXJlY3QgZGF0YSBwYWNrZXRzIHRvIGJlCisgKiBzZW50IHRvIFNESyBjb250cm9sbGVyIHNlcnZpY2Ugb24gdGhlIGRldmljZS4KKyAqCisgKiBEaXJlY3QgcGFja2V0ICh1bmxpa2UgU0RLQ3RsUGFja2V0KSBkb24ndCBjb250YWluIGRhdGEgYnVmZmVyLCBidXQgcmF0aGVyCisgKiByZWZlcmVuY2UgZGF0YSBhbGxvY2F0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBjbGllbnQgc2VuZHMgbGFyZ2UKKyAqIGFtb3VudCBvZiBkYXRhIChzdWNoIGFzIGZyYW1lYnVmZmVyIHVwZGF0ZXMgc2VudCBteSBtdWx0aS10b3VjaCBwb3J0KSwgYW5kCisgKiByZWd1bGFyIHBhY2tldCBkZXNjcmlwdG9ycyBmb3Igc3VjaCBsYXJnZSB0cmFuc2ZlciBjYW5ub3QgYmUgb2J0YWluZWQgZnJvbSB0aGUKKyAqIHJlY3ljbGVyLgorICovCitzdHJ1Y3QgU0RLQ3RsRGlyZWN0UGFja2V0IHsKKyAgICAvKiBTdXBwb3J0cyByZWN5Y2xpbmcuIERvbid0IHB1dCBhbnl0aGluZyBpbiBmcm9udDogcmVjeWNsZXIgZXhwZWN0cyB0aGlzCisgICAgICogdG8gYmUgdGhlIGZpcnN0IGZpZWxkIGluIHJlY3ljbGFibGUgZGVzY3JpcHRvci4gKi8KKyAgICBTREtDdGxSZWN5Y2xlZCAgICAgICAgICByZWN5Y2xpbmc7CisKKyAgICAvKiBTREtDdGxTb2NrZXQgdGhhdCBvd25zIHRoaXMgcGFja2V0LiAqLworICAgIFNES0N0bFNvY2tldCogICAgICAgICAgIHNka2N0bDsKKyAgICAvKiBQYWNrZXQgdG8gc2VuZC4gKi8KKyAgICBTREtDdGxQYWNrZXRIZWFkZXIqICAgICBwYWNrZXQ7CisgICAgLyogQ2FsbGJhY2sgdG8gaW52b2tlIG9uIHBhY2tldCB0cmFuc21pc3Npb24gZXZlbnRzLiAqLworICAgIG9uX3Nka2N0bF9kaXJlY3RfY2IgICAgIG9uX3NlbnQ7CisgICAgLyogQW4gb3BhcXVlIHBvaW50ZXIgdG8gcGFzcyB0byBvbl9zZW50IGNhbGxiYWNrLiAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG9uX3NlbnRfb3BhcXVlOworICAgIC8qIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBwYWNrZXQuICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgcmVmX2NvdW50OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxRdWVyeSBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBRdWVyeSBwYWNrZXQgZGVzY3JpcHRvci4KKyAqCisgKiBBbGwgcXVlcmllcywgc2VudCBhbmQgcmVjZWl2ZWQgdmlhIFNESyBjb250cm9sbGVyIHNvY2tldCBiZWdpbiB3aXRoIHRoaXMKKyAqIGhlYWRlciwgd2l0aCBxdWVyeSBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGlzIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgU0RLQ3RsUXVlcnlIZWFkZXIgeworICAgIC8qIERhdGEgcGFja2V0IGhlYWRlciBmb3IgdGhpcyBxdWVyeS4gKi8KKyAgICBTREtDdGxQYWNrZXRIZWFkZXIgIHBhY2tldDsKKyAgICAvKiBBIHVuaXF1ZSBxdWVyeSBpZGVudGlmaWVyLiBUaGlzIElEIGlzIHVzZWQgdG8gdHJhY2sgdGhlIHF1ZXJ5IGluIHRoZQorICAgICAqIGFzeW5jaHJvbm91cyBlbnZpcm9ubWVudCBpbiB3aGNpaCBTREsgY29udHJvbGxlciBzb2NrZXQgb3BlcmF0ZXMuICovCisgICAgaW50ICAgICAgICAgICAgICAgICBxdWVyeV9pZDsKKyAgICAvKiBRdWVyeSB0eXBlLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgcXVlcnlfdHlwZTsKK30gU0RLQ3RsUXVlcnlIZWFkZXI7CisKKy8qIFF1ZXJ5IGRlc2NyaXB0b3IsIGFsbG9jYXRlZCBieSB0aGlzIEFQSSBmb3IgcXVlcmllcyB0byBiZSBzZW50IHRvIFNESworICogY29udHJvbGxlciBzZXJ2aWNlIG9uIHRoZSBkZXZpY2UuCisgKgorICogV2hlbiBxdWVyeSBkZXNjcmlwdG9ycyBhcmUgYWxsb2NhdGVkIGJ5IHRoaXMgQVBJLCB0aGV5IGFyZSBhbGxvY2F0ZWQgbGFyZ2UKKyAqIGVub3VnaCB0byBjb250YWluIHRoaXMgaGVhZGVyLCBhbmQgcXVlcnkgZGF0YSB0byBzZW5kIHRvIHRoZSBzZXJ2aWNlLAorICogaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgZGVzY3JpcHRvci4KKyAqLworc3RydWN0IFNES0N0bFF1ZXJ5IHsKKyAgICAvKiBTdXBwb3J0cyByZWN5Y2xpbmcuIERvbid0IHB1dCBhbnl0aGluZyBpbiBmcm9udDogcmVjeWNsZXIgZXhwZWN0cyB0aGlzCisgICAgICogdG8gYmUgdGhlIGZpcnN0IGZpZWxkIGluIHJlY3ljbGFibGUgZGVzY3JpcHRvci4gKi8KKyAgICBTREtDdGxSZWN5Y2xlZCAgICAgICAgICByZWN5Y2xpbmc7CisKKyAgICAvKiBOZXh0IHF1ZXJ5IGluIHRoZSBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLiAqLworICAgIFNES0N0bFF1ZXJ5KiAgICAgICAgICAgIG5leHQ7CisgICAgLyogQSB0aW1lciB0byBydW4gdGltZSBvdXQgb24gdGhpcyBxdWVyeSBhZnRlciBpdCBoYXMgYmVlbiBzZW50LiAqLworICAgIExvb3BUaW1lciogICAgICAgICAgICAgIHRpbWVyOworICAgIC8qIEFic29sdXRlIHRpbWUgZm9yIHRoaXMgcXVlcnkncyBkZWFkbGluZS4gVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCBxdWVyeSdzCisgICAgICogdGltZXIgaXMgc2V0IHRvIGFmdGVyIHF1ZXJ5IGhhcyBiZWVuIHRyYW5zbWl0dGVkIHRvIHRoZSBzZXJ2aWNlLiAqLworICAgIER1cmF0aW9uICAgICAgICAgICAgICAgIGRlYWRsaW5lOworICAgIC8qIFNESyBjb250cm9sbGVyIHNvY2tldCB0aGF0IG93bnMgdGhlIHF1ZXJ5LiAqLworICAgIFNES0N0bFNvY2tldCogICAgICAgICAgIHNka2N0bDsKKyAgICAvKiBBIGNhbGxiYWNrIHRvIGludm9rZSBvbiBxdWVyeSBzdGF0ZSBjaGFuZ2VzLiAqLworICAgIG9uX3Nka2N0bF9xdWVyeV9jYiAgICAgIHF1ZXJ5X2NiOworICAgIC8qIEFuIG9wYXF1ZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHF1ZXJ5LiAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIHF1ZXJ5X29wYXF1ZTsKKyAgICAvKiBQb2ludHMgdG8gYW4gYWRkcmVzcyBvZiBhIGJ1ZmZlciB3aGVyZSB0byBzYXZlIHF1ZXJ5IHJlc3BvbnNlLiAqLworICAgIHZvaWQqKiAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2J1ZmZlcjsKKyAgICAvKiBQb2ludHMgdG8gYSB2YXJpYWJsZSBjb250YWluaW5nIHNpemUgb2YgdGhlIHJlc3BvbnNlIGJ1ZmZlciAob24gdGhlIHdheQorICAgICAqIGluKSwgb3IgYWN0dWFsIHF1ZXJ5IHJlc3BvbnNlIHNpemUgKHdoZW4gcXVlcnkgaXMgY29tcGxldGVkKS4gKi8KKyAgICB1aW50MzJfdCogICAgICAgICAgICAgICByZXNwb25zZV9zaXplOworICAgIC8qIEludGVybmFsIHJlc3BvbnNlIGJ1ZmZlciwgYWxsb2NhdGVkIGlmIHF1ZXJ5IGNyZWF0b3IgZGlkbid0IHByb3ZpZGUgaXRzCisgICAgICogb3duLiBUaGlzIGZpZWxkIGlzIHZhbGlkIG9ubHkgaWYgcmVzcG9uc2VfYnVmZmVyIGZpZWxkIGlzIE5VTEwsIG9yIGlzCisgICAgICogcG9pbnRpbmcgdG8gdGhpcyBmaWVsZC4gKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBpbnRlcm5hbF9yZXNwX2J1ZmZlcjsKKyAgICAvKiBJbnRlcm5hbCByZXNwb25zZSBidWZmZXIgc2l6ZSB1c2VkIGlmIHF1ZXJ5IGNyZWF0b3IgZGlkbid0IHByb3ZpZGUgaXRzCisgICAgICogb3duLiBUaGlzIGZpZWxkIGlzIHZhbGlkIG9ubHkgaWYgcmVzcG9uc2Vfc2l6ZSBmaWVsZCBpcyBOVUxMLCBvciBpcworICAgICAqIHBvaW50aW5nIHRvIHRoaXMgZmllbGQuICovCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgaW50ZXJuYWxfcmVzcF9zaXplOworICAgIC8qIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBxdWVyeS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZWZfY291bnQ7CisKKyAgICAvKiBDb21tb24gcXVlcnkgaGVhZGVyLiBRdWVyeSBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhpcyBoZWFkZXIsIHNvIGl0CisgICAgICogbXVzdCBiZSBsYXN0IGZpZWxkIGluIFNES0N0bFF1ZXJ5IGRlc2NyaXB0b3IuICovCisgICAgU0RLQ3RsUXVlcnlIZWFkZXIgICAgICAgaGVhZGVyOworfTsKKworLyogUXVlcnkgcmVwbHkgZGVzY3JpcHRvci4KKyAqCisgKiBBbGwgcmVwbGllcyB0byBhIHF1ZXJ5LCBzZW50IGFuZCByZWNlaXZlZCB2aWEgU0RLIGNvbnRyb2xsZXIgc29ja2V0IGJlZ2luIHdpdGgKKyAqIHRoaXMgaGVhZGVyLCB3aXRoIHF1ZXJ5IHJlcGx5IGRhdGEgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBTREtDdGxRdWVyeVJlcGx5SGVhZGVyIHsKKyAgICAvKiBEYXRhIHBhY2tldCBoZWFkZXIgZm9yIHRoaXMgcmVwbHkuICovCisgICAgU0RLQ3RsUGFja2V0SGVhZGVyICBwYWNrZXQ7CisKKyAgICAvKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgcXVlcnkgdGhhdCBpcyBhZGRyZXNzZWQgd2l0aCB0aGlzIHJlcGx5LiAqLworICAgIGludCAgICAgICAgICAgICAgICAgcXVlcnlfaWQ7Cit9IFNES0N0bFF1ZXJ5UmVwbHlIZWFkZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsTWVzc2FnZSBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNZXNzYWdlIHBhY2tldCBkZXNjcmlwdG9yLgorICoKKyAqIEFsbCBtZXNzYWdlcywgc2VudCBhbmQgcmVjZWl2ZWQgdmlhIFNESyBjb250cm9sbGVyIHNvY2tldCBiZWdpbiB3aXRoIHRoaXMKKyAqIGhlYWRlciwgd2l0aCBtZXNzYWdlIGRhdGEgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgaGVhZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBTREtDdGxNZXNzYWdlSGVhZGVyIHsKKyAgICAvKiBEYXRhIHBhY2tldCBoZWFkZXIgZm9yIHRoaXMgcXVlcnkuICovCisgICAgU0RLQ3RsUGFja2V0SGVhZGVyICBwYWNrZXQ7CisgICAgLyogTWVzc2FnZSB0eXBlLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgbXNnX3R5cGU7Cit9IFNES0N0bE1lc3NhZ2VIZWFkZXI7CisKKy8qIE1lc3NhZ2UgcGFja2V0IGRlc2NyaXB0b3IuCisgKgorICogQWxsIG1lc3NhZ2VzLCBzZW50IGFuZCByZWNlaXZlZCB2aWEgU0RLIGNvbnRyb2xsZXIgc29ja2V0IGJlZ2luIHdpdGggdGhpcworICogaGVhZGVyLCB3aXRoIG1lc3NhZ2UgZGF0YSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhpcyBoZWFkZXIuCisgKi8KK3N0cnVjdCBTREtDdGxNZXNzYWdlIHsKKyAgICAvKiBEYXRhIHBhY2tldCBkZXNjcmlwdG9yIGZvciB0aGlzIG1lc3NhZ2UuICovCisgICAgU0RLQ3RsUGFja2V0ICBwYWNrZXQ7CisgICAgLyogTWVzc2FnZSB0eXBlLiAqLworICAgIGludCAgICAgICAgICAgbXNnX3R5cGU7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIFNESyBDb250cm9sIFNvY2tldCBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFbnVtZXJhdGVzIFNES0N0bFNvY2tldCBzdGF0ZXMuICovCit0eXBlZGVmIGVudW0gU0RLQ3RsU29ja2V0U3RhdGUgeworICAgIC8qIFNvY2tldCBpcyBkaXNjb25uZWN0ZWQgZnJvbSBTREsgY29udHJvbGxlci4gKi8KKyAgICBTREtDVExfU09DS0VUX0RJU0NPTk5FQ1RFRCwKKyAgICAvKiBDb25uZWN0aW9uIHRvIFNESyBjb250cm9sbGVyIGlzIGluIHByb2dyZXNzLiAqLworICAgIFNES0NUTF9TT0NLRVRfQ09OTkVDVElORywKKyAgICAvKiBTb2NrZXQgaXMgY29ubmVjdGVkIHRvIGFuIFNESyBjb250cm9sbGVyIHNlcnZpY2UuICovCisgICAgU0RLQ1RMX1NPQ0tFVF9DT05ORUNURUQKK30gU0RLQ3RsU29ja2V0U3RhdGU7CisKKy8qIEVudW1lcmF0ZXMgU0RLQ3RsU29ja2V0IEkvTyBkaXNwYXRjaGVyIHN0YXRlcy4gKi8KK3R5cGVkZWYgZW51bSBTREtDdGxJT0Rpc3BhdGNoZXJTdGF0ZSB7CisgICAgLyogSS9PIGRpc3BhdGNoZXIgZXhwZWN0cyBhIHBhY2tldCBoZWFkZXIuICovCisgICAgU0RLQ1RMX0lPRElTUF9FWFBFQ1RfSEVBREVSLAorICAgIC8qIEkvTyBkaXNwYXRjaGVyIGV4cGVjdHMgcGFja2V0IGRhdGEuICovCisgICAgU0RLQ1RMX0lPRElTUF9FWFBFQ1RfREFUQSwKKyAgICAvKiBJL08gZGlzcGF0Y2hlciBleHBlY3RzIHF1ZXJ5IHJlc3BvbnNlIGhlYWRlci4gKi8KKyAgICBTREtDVExfSU9ESVNQX0VYUEVDVF9RVUVSWV9SRVBMWV9IRUFERVIsCisgICAgLyogSS9PIGRpc3BhdGNoZXIgZXhwZWN0cyBxdWVyeSByZXNwb25zZSBkYXRhLiAqLworICAgIFNES0NUTF9JT0RJU1BfRVhQRUNUX1FVRVJZX1JFUExZX0RBVEEsCit9IFNES0N0bElPRGlzcGF0Y2hlclN0YXRlOworCisvKiBTREtDdGxTb2NrZXQgSS9PIGRpc3BhdGNoZXIgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bElPRGlzcGF0Y2hlciB7CisgICAgLyogU0RLQ3RsU29ja2V0IGluc3RhbmNlIGZvciB0aGlzIGRpc3BhdGNoZXIuICovCisgICAgU0RLQ3RsU29ja2V0KiAgICAgICAgICAgICAgIHNka2N0bDsKKyAgICAvKiBEaXNwYXRjaGVyIHN0YXRlLiAqLworICAgIFNES0N0bElPRGlzcGF0Y2hlclN0YXRlICAgICBzdGF0ZTsKKyAgICAvKiBVbml0ZXMgYWxsIHR5cGVzIG9mIGhlYWRlcnMgdXNlZCBpbiBTREsgY29udHJvbGxlciBkYXRhIGV4Y2hhbmdlLiAqLworICAgIHVuaW9uIHsKKyAgICAgICAgLyogQ29tbW9uIHBhY2tldCBoZWFkZXIuICovCisgICAgICAgIFNES0N0bFBhY2tldEhlYWRlciAgICAgIHBhY2tldF9oZWFkZXI7CisgICAgICAgIC8qIEhlYWRlciBmb3IgYSBxdWVyeSBwYWNrZXQuICovCisgICAgICAgIFNES0N0bFF1ZXJ5SGVhZGVyICAgICAgIHF1ZXJ5X2hlYWRlcjsKKyAgICAgICAgLyogSGVhZGVyIGZvciBhIG1lc3NhZ2UgcGFja2V0LiAqLworICAgICAgICBTREtDdGxNZXNzYWdlSGVhZGVyICAgICBtZXNzYWdlX2hlYWRlcjsKKyAgICAgICAgLyogSGVhZGVyIGZvciBhIHF1ZXJ5IHJlc3BvbnNlIHBhY2tldC4gKi8KKyAgICAgICAgU0RLQ3RsUXVlcnlSZXBseUhlYWRlciAgcXVlcnlfcmVwbHlfaGVhZGVyOworICAgIH07CisgICAgLyogRGVzY3JpcHRvciBvZiBhIHBhY2tldCB0aGF0IGlzIGJlaW5nIHJlY2VpdmVkIGZyb20gU0RLIGNvbnRyb2xsZXIuICovCisgICAgU0RLQ3RsUGFja2V0KiAgICAgICAgICAgICAgIHBhY2tldDsKKyAgICAvKiBBIHF1ZXJ5IGZvciB3aGljaCBhIHJlcGx5IGlzIGN1cnJlbnRseSBiZWluZyByZWNlaXZlZC4gKi8KKyAgICBTREtDdGxRdWVyeSogICAgICAgICAgICAgICAgY3VycmVudF9xdWVyeTsKK30gU0RLQ3RsSU9EaXNwYXRjaGVyOworCisvKiBTREsgY29udHJvbGxlciBzb2NrZXQgZGVzY3JpcHRvci4gKi8KK3N0cnVjdCBTREtDdGxTb2NrZXQgeworICAgIC8qIFNESyBjb250cm9sbGVyIHNvY2tldCBzdGF0ZSAqLworICAgIFNES0N0bFNvY2tldFN0YXRlICAgICAgICAgICAgICAgc3RhdGU7CisgICAgLyogU0RLIGNvbnRyb2xsZXIgcG9ydCBzdGF0dXMgKi8KKyAgICBTZGtDdGxQb3J0U3RhdHVzICAgICAgICAgICAgICAgIHBvcnRfc3RhdHVzOworICAgIC8qIEkvTyBkaXNwYXRjaGVyIGZvciB0aGUgc29ja2V0LiAqLworICAgIFNES0N0bElPRGlzcGF0Y2hlciAgICAgICAgICAgICAgaW9fZGlzcGF0Y2hlcjsKKyAgICAvKiBBc3luY2hyb25vdXMgc29ja2V0IGNvbm5lY3RlZCB0byBTREsgQ29udHJvbGxlciBvbiB0aGUgZGV2aWNlLiAqLworICAgIEFzeW5jU29ja2V0KiAgICAgICAgICAgICAgICAgICAgYXM7CisgICAgLyogQ2xpZW50IGNhbGxiYWNrIHRoYXQgbW9uaXRvcnMgdGhpcyBzb2NrZXQgY29ubmVjdGlvbi4gKi8KKyAgICBvbl9zZGtjdGxfc29ja2V0X2Nvbm5lY3Rpb25fY2IgIG9uX3NvY2tldF9jb25uZWN0aW9uOworICAgIC8qIENsaWVudCBjYWxsYmFjayB0aGF0IG1vbml0b3JzIFNESyBjb250cm9sbGVyIHBydCBjb25uZWN0aW9uLiAqLworICAgIG9uX3Nka2N0bF9wb3J0X2Nvbm5lY3Rpb25fY2IgICAgb25fcG9ydF9jb25uZWN0aW9uOworICAgIC8qIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIFNESyBjb250cm9sbGVyLiAqLworICAgIG9uX3Nka2N0bF9tZXNzYWdlX2NiICAgICAgICAgICAgb25fbWVzc2FnZTsKKyAgICAvKiBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBzb2NrZXQuICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWU7CisgICAgLyogTmFtZSBvZiBhbiBTREsgY29udHJvbGxlciBwb3J0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0by4gKi8KKyAgICBjaGFyKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZTsKKyAgICAvKiBJL08gbG9vcGVyIGZvciB0aW1lcnMuICovCisgICAgTG9vcGVyKiAgICAgICAgICAgICAgICAgICAgICAgICBsb29wZXI7CisgICAgLyogSGVhZCBvZiB0aGUgYWN0aXZlIHF1ZXJ5IGxpc3QuICovCisgICAgU0RLQ3RsUXVlcnkqICAgICAgICAgICAgICAgICAgICBxdWVyeV9oZWFkOworICAgIC8qIFRhaWwgb2YgdGhlIGFjdGl2ZSBxdWVyeSBsaXN0LiAqLworICAgIFNES0N0bFF1ZXJ5KiAgICAgICAgICAgICAgICAgICAgcXVlcnlfdGFpbDsKKyAgICAvKiBRdWVyeSBJRCBnZW5lcmF0b3IgdGhhdCBnZXRzIGluY3JlbWVudGVkIGZvciBlYWNoIG5ldyBxdWVyeS4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcXVlcnlfaWQ7CisgICAgLyogVGltZW91dCBiZWZvcmUgdHJ5aW5nIHRvIHJlY29ubmVjdCBhZnRlciBkaXNjb25uZWN0aW9uLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25uZWN0X3RvOworICAgIC8qIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoaXMgZGVzY3JpcHRvci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9jb3VudDsKKyAgICAvKiBIZWFkIG9mIHRoZSByZWN5Y2xlZCBtZW1vcnkgKi8KKyAgICBTREtDdGxSZWN5Y2xlZCogICAgICAgICAgICAgICAgIHJlY3ljbGVyOworICAgIC8qIFJlY3ljbGFibGUgYmxvY2sgc2l6ZS4gKi8KKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ljbGVyX2Jsb2NrX3NpemU7CisgICAgLyogTWF4aW11bSBudW1iZXIgb2YgYmxvY2tzIHRvIHJlY3ljbGUuICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN5Y2xlcl9tYXg7CisgICAgLyogTnVtYmVyIG9mIGJsb2NzIGluIHRoZSByZWN5Y2xlci4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ljbGVyX2NvdW50OworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQgcmVjeWNsaW5nIG1hbmFnZW1lbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHZXRzIGEgcmVjeWNsZWQgYmxvY2sgZm9yIGEgZ2l2ZW4gU0RLQ3RsU29ja2V0LCBvciBhbGxvY2F0ZXMgbmV3IG1lbW9yeQorICogYmxvY2suICovCitzdGF0aWMgdm9pZCoKK19zZGtjdGxfc29ja2V0X2FsbG9jX3JlY3ljbGVyKFNES0N0bFNvY2tldCogc2RrY3RsLCB1aW50MzJfdCBzaXplKQoreworICAgIFNES0N0bFJlY3ljbGVkKiBibG9jayA9IE5VTEw7CisKKyAgICBpZiAoc2RrY3RsLT5yZWN5Y2xlciAhPSBOVUxMICYmIHNpemUgPD0gc2RrY3RsLT5yZWN5Y2xlcl9ibG9ja19zaXplKSB7CisgICAgICAgIGFzc2VydChzZGtjdGwtPnJlY3ljbGVyX2NvdW50ID4gMCk7CisgICAgICAgIC8qIFRoZXJlIGFyZSBibG9ja3MgaW4gdGhlIHJlY3ljbGVyLCBhbmQgcmVxdWVzdGVkIHNpemUgZml0cy4gKi8KKyAgICAgICAgYmxvY2sgPSBzZGtjdGwtPnJlY3ljbGVyOworICAgICAgICBzZGtjdGwtPnJlY3ljbGVyID0gYmxvY2stPm5leHQ7CisgICAgICAgIGJsb2NrLT5zaXplID0gc2RrY3RsLT5yZWN5Y2xlcl9ibG9ja19zaXplOworICAgICAgICBzZGtjdGwtPnJlY3ljbGVyX2NvdW50LS07CisgICAgfSBlbHNlIGlmIChzaXplIDw9IHNka2N0bC0+cmVjeWNsZXJfYmxvY2tfc2l6ZSkgeworICAgICAgICAvKiBUaGVyZSBhcmUgbm8gYmxvY2tzIGluIHRoZSByZWN5Y2xlciwgYnV0IHJlcXVlc3RlZCBzaXplIGZpdHMuIExldHMKKyAgICAgICAgICogYWxsb2NhdGUgYmxvY2sgdGhhdCB3ZSBjYW4gbGF0ZXIgcmVjeWNsZS4gKi8KKyAgICAgICAgYmxvY2sgPSBtYWxsb2Moc2RrY3RsLT5yZWN5Y2xlcl9ibG9ja19zaXplKTsKKyAgICAgICAgaWYgKGJsb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFQQU5JQygiU0RLQ3RsICVzOiBVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgYmxvY2suIiwKKyAgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgc2RrY3RsLT5yZWN5Y2xlcl9ibG9ja19zaXplKTsKKyAgICAgICAgfQorICAgICAgICBibG9jay0+c2l6ZSA9IHNka2N0bC0+cmVjeWNsZXJfYmxvY2tfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSZXF1ZXN0ZWQgc2l6ZSBkb2Vzbid0IGZpdCB0aGUgcmVjeWNsZXIuICovCisgICAgICAgIGJsb2NrID0gbWFsbG9jKHNpemUpOworICAgICAgICBpZiAoYmxvY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgQVBBTklDKCJTREtDdGwgJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBibG9jayIsCisgICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGJsb2NrLT5zaXplID0gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gYmxvY2s7Cit9CisKKy8qIFJlY3ljbGVzLCBvciBmcmVlcyBhIGJsb2NrIG9mIG1lbW9yeSBmb3IgYSBnaXZlbiBTREtDdGxTb2NrZXQuICovCitzdGF0aWMgdm9pZAorX3Nka2N0bF9zb2NrZXRfZnJlZV9yZWN5Y2xlcihTREtDdGxTb2NrZXQqIHNka2N0bCwgdm9pZCogbWVtKQoreworICAgIFNES0N0bFJlY3ljbGVkKiBjb25zdCBibG9jayA9IChTREtDdGxSZWN5Y2xlZCopbWVtOworCisgICAgaWYgKGJsb2NrLT5zaXplICE9IHNka2N0bC0+cmVjeWNsZXJfYmxvY2tfc2l6ZSB8fAorICAgICAgICBzZGtjdGwtPnJlY3ljbGVyX2NvdW50ID09IHNka2N0bC0+cmVjeWNsZXJfbWF4KSB7CisgICAgICAgIC8qIFJlY3ljbGVyIGlzIGZ1bGwsIG9yIGJsb2NrIGNhbm5vdCBiZSByZWN5Y2xlZC4gSnVzdCBmcmVlIHRoZSBtZW1vcnkuICovCisgICAgICAgIGZyZWUobWVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBZGQgdGhhdCBibG9jayB0byB0aGUgcmVjeWNsZXIuICovCisgICAgICAgIGFzc2VydChzZGtjdGwtPnJlY3ljbGVyX2NvdW50ID49IDApOworICAgICAgICBibG9jay0+bmV4dCA9IHNka2N0bC0+cmVjeWNsZXI7CisgICAgICAgIHNka2N0bC0+cmVjeWNsZXIgPSBibG9jazsKKyAgICAgICAgc2RrY3RsLT5yZWN5Y2xlcl9jb3VudCsrOworICAgIH0KK30KKworLyogRW1wdGllcyB0aGUgcmVjeWNsZXIgZm9yIGEgZ2l2ZW4gU0RLQ3RsU29ja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfc29ja2V0X2VtcHR5X3JlY3ljbGVyKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIFNES0N0bFJlY3ljbGVkKiBibG9jayA9IHNka2N0bC0+cmVjeWNsZXI7CisgICAgd2hpbGUgKGJsb2NrICE9IE5VTEwpIHsKKyAgICAgICAgdm9pZCogY29uc3QgdG9fZnJlZSA9IGJsb2NrOworICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICBmcmVlKHRvX2ZyZWUpOworICAgIH0KKyAgICBzZGtjdGwtPnJlY3ljbGVyID0gTlVMTDsKKyAgICBzZGtjdGwtPnJlY3ljbGVyX2NvdW50ID0gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQgcXVlcnkgbGlzdCBtYW5hZ2VtZW50CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWRkcyBhIHF1ZXJ5IHRvIHRoZSBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLgorICogUGFyYW06CisgKiAgc2RrY3RsIC0gU0RLQ3RsU29ja2V0IGluc3RhbmNlIGZvciB0aGUgcXVlcnkuCisgKiAgcXVlcnkgLSBRdWVyeSB0byBhZGQgdG8gdGhlIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCitfc2RrY3RsX3NvY2tldF9hZGRfcXVlcnkoU0RLQ3RsUXVlcnkqIHF1ZXJ5KQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gcXVlcnktPnNka2N0bDsKKyAgICBpZiAoc2RrY3RsLT5xdWVyeV9oZWFkID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KHNka2N0bC0+cXVlcnlfdGFpbCA9PSBOVUxMKTsKKyAgICAgICAgc2RrY3RsLT5xdWVyeV9oZWFkID0gc2RrY3RsLT5xdWVyeV90YWlsID0gcXVlcnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2RrY3RsLT5xdWVyeV90YWlsLT5uZXh0ID0gcXVlcnk7CisgICAgICAgIHNka2N0bC0+cXVlcnlfdGFpbCA9IHF1ZXJ5OworICAgIH0KKworICAgIC8qIEtlZXAgdGhlIHF1ZXJ5IHJlZmVyZW5jZWQgd2hpbGUgaXQncyBpbiB0aGUgbGlzdC4gKi8KKyAgICBzZGtjdGxfcXVlcnlfcmVmZXJlbmNlKHF1ZXJ5KTsKK30KKworLyogUmVtb3ZlcyBhIHF1ZXJ5IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJpZXMuCisgKiBQYXJhbToKKyAqICBxdWVyeSAtIFF1ZXJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLiBJZiBxdWVyeSBoYXMgYmVlbgorICogICAgICByZW1vdmVkIGZyb20gdGhlIGxpc3QsIGl0IHdpbGwgYmUgZGVyZWZlcmVuY2VkIHRvIG9mZnNldCB0aGUgcmVmZXJlbmNlCisgKiAgICAgIHRoYXQgd2FkIG1hZGUgd2hlbiB0aGUgcXVlcnkgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGxpc3QuCisgKiBSZXR1cm46CisgKiAgQm9vbGVhbjogMSBpZiBxdWVyeSBoYXMgYmVlbiByZW1vdmVkLCBvciAwIGlmIHF1ZXJ5IGhhcyBub3QgYmVlbiBmb3VuZCBpbiB0aGUKKyAqICBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLgorICovCitzdGF0aWMgaW50Citfc2RrY3RsX3NvY2tldF9yZW1vdmVfcXVlcnkoU0RLQ3RsUXVlcnkqIHF1ZXJ5KQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gcXVlcnktPnNka2N0bDsKKyAgICBTREtDdGxRdWVyeSogcHJldiA9IE5VTEw7CisgICAgU0RLQ3RsUXVlcnkqIGhlYWQgPSBzZGtjdGwtPnF1ZXJ5X2hlYWQ7CisKKyAgICAvKiBRdWljayBjaGVjazogdGhlIHF1ZXJ5IGNvdWxkIGJlIGN1cnJlbnRseSBoYW5kbGVkIGJ5IHRoZSBkaXNwYXRjaGVyLiAqLworICAgIGlmIChzZGtjdGwtPmlvX2Rpc3BhdGNoZXIuY3VycmVudF9xdWVyeSA9PSBxdWVyeSkgeworICAgICAgICAvKiBSZWxlYXNlIHRoZSBxdWVyeSBmcm9tIGRpc3BhdGNoZXIuICovCisgICAgICAgIHNka2N0bC0+aW9fZGlzcGF0Y2hlci5jdXJyZW50X3F1ZXJ5ID0gTlVMTDsKKyAgICAgICAgc2RrY3RsX3F1ZXJ5X3JlbGVhc2UocXVlcnkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBSZW1vdmUgcXVlcnkgZnJvbSB0aGUgbGlzdC4gKi8KKyAgICB3aGlsZSAoaGVhZCAhPSBOVUxMICYmIHF1ZXJ5ICE9IGhlYWQpIHsKKyAgICAgICAgcHJldiA9IGhlYWQ7CisgICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OworICAgIH0KKyAgICBpZiAoaGVhZCA9PSBOVUxMKSB7CisgICAgICAgIEQoIlNES0N0bCAlczogUXVlcnkgJXAgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LiIsCisgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgICAgICAvKiBRdWVyeSBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKyAgICAgICAgYXNzZXJ0KHF1ZXJ5ID09IHNka2N0bC0+cXVlcnlfaGVhZCk7CisgICAgICAgIHNka2N0bC0+cXVlcnlfaGVhZCA9IHF1ZXJ5LT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFF1ZXJ5IGlzIGluIHRoZSBtaWRkbGUgLyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAqLworICAgICAgICBhc3NlcnQocXVlcnkgIT0gc2RrY3RsLT5xdWVyeV9oZWFkKTsKKyAgICAgICAgcHJldi0+bmV4dCA9IHF1ZXJ5LT5uZXh0OworICAgIH0KKyAgICBpZiAoc2RrY3RsLT5xdWVyeV90YWlsID09IHF1ZXJ5KSB7CisgICAgICAgIC8qIFF1ZXJ5IGlzIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0LiAqLworICAgICAgICBhc3NlcnQocXVlcnktPm5leHQgPT0gTlVMTCk7CisgICAgICAgIHNka2N0bC0+cXVlcnlfdGFpbCA9IHByZXY7CisgICAgfQorICAgIHF1ZXJ5LT5uZXh0ID0gTlVMTDsKKworICAgIC8qIFJlbGVhc2UgcXVlcnkgdGhhdCBpcyBub3cgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBOb3RlIHRoYXQgcXVlcnkKKyAgICAgKiBwYXNzZWQgdG8gdGhpcyByb3V0aW5lIHNob3VsZCBob2xkIGFuIGV4dHJhIHJlZmVyZW5jZSwgb3duZWQgYnkgdGhlCisgICAgICogY2FsbGVyLiAqLworICAgIHNka2N0bF9xdWVyeV9yZWxlYXNlKHF1ZXJ5KTsKKworICAgIHJldHVybiAxOworfQorCisvKiBSZW1vdmVzIGEgcXVlcnkgKGJhc2VkIG9uIHF1ZXJ5IElEKSBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLgorICogUGFyYW06CisgKiAgc2RrY3RsIC0gU0RLQ3RsU29ja2V0IGluc3RhbmNlIHRoYXQgb3ducyB0aGUgcXVlcnkuCisgKiAgcXVlcnlfaWQgLSBJZGVudGlmaWVzIHRoZSBxdWVyeSB0byByZW1vdmUuCisgKiBSZXR1cm46CisgKiAgQSBxdWVyeSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJpZXMsIG9yIE5VTEwgaWYgcXVlcnkgd2l0aCB0aGUKKyAqICBnaXZlbiBJRCBoYXMgbm90IGJlZW4gZm91bmQgaW4gdGhlIGxpc3QuIE5vdGUgdGhhdCBxdWVyeSByZXR1cm5lZCBmcm9tIHRoaXMKKyAqICByb3V0aW5lIHN0aWxsIGhvbGRzIHRoZSByZWZlcmVuY2UgbWFkZSB3aGVuIHRoZSBxdWVyeSBoYXMgYmVlbiBhZGRlZCB0byB0aGUKKyAqICBsaXN0LgorICovCitzdGF0aWMgU0RLQ3RsUXVlcnkqCitfc2RrY3RsX3NvY2tldF9yZW1vdmVfcXVlcnlfaWQoU0RLQ3RsU29ja2V0KiBzZGtjdGwsIGludCBxdWVyeV9pZCkKK3sKKyAgICBTREtDdGxRdWVyeSogcXVlcnkgPSBOVUxMOworICAgIFNES0N0bFF1ZXJ5KiBwcmV2ID0gTlVMTDsKKyAgICBTREtDdGxRdWVyeSogaGVhZCA9IHNka2N0bC0+cXVlcnlfaGVhZDsKKworICAgIC8qIFF1aWNrIGNoZWNrOiB0aGUgcXVlcnkgY291bGQgYmUgY3VycmVudGx5IGhhbmRsZWQgYnkgZGlzcGF0Y2hlci4gKi8KKyAgICBpZiAoc2RrY3RsLT5pb19kaXNwYXRjaGVyLmN1cnJlbnRfcXVlcnkgIT0gTlVMTCAmJgorICAgICAgICBzZGtjdGwtPmlvX2Rpc3BhdGNoZXIuY3VycmVudF9xdWVyeS0+aGVhZGVyLnF1ZXJ5X2lkID09IHF1ZXJ5X2lkKSB7CisgICAgICAgIC8qIFJlbGVhc2UgdGhlIHF1ZXJ5IGZyb20gZGlzcGF0Y2hlci4gKi8KKyAgICAgICAgcXVlcnkgPSBzZGtjdGwtPmlvX2Rpc3BhdGNoZXIuY3VycmVudF9xdWVyeTsKKyAgICAgICAgc2RrY3RsLT5pb19kaXNwYXRjaGVyLmN1cnJlbnRfcXVlcnkgPSBOVUxMOworICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorCisgICAgLyogUmVtb3ZlIHF1ZXJ5IGZyb20gdGhlIGxpc3QuICovCisgICAgd2hpbGUgKGhlYWQgIT0gTlVMTCAmJiBoZWFkLT5oZWFkZXIucXVlcnlfaWQgIT0gcXVlcnlfaWQpIHsKKyAgICAgICAgcHJldiA9IGhlYWQ7CisgICAgICAgIGhlYWQgPSBoZWFkLT5uZXh0OworICAgIH0KKyAgICBpZiAoaGVhZCA9PSBOVUxMKSB7CisgICAgICAgIEQoIlNES0N0bCAlczogUXVlcnkgSUQgJWQgaXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LiIsCisgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5X2lkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogUXVlcnkgaXMgZm91bmQgaW4gdGhlIGxpc3QuICovCisgICAgcXVlcnkgPSBoZWFkOworICAgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICAgICAgLyogUXVlcnkgaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICovCisgICAgICAgIGFzc2VydChxdWVyeSA9PSBzZGtjdGwtPnF1ZXJ5X2hlYWQpOworICAgICAgICBzZGtjdGwtPnF1ZXJ5X2hlYWQgPSBxdWVyeS0+bmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBRdWVyeSBpcyBpbiB0aGUgbWlkZGxlLCBvciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAqLworICAgICAgICBhc3NlcnQocXVlcnkgIT0gc2RrY3RsLT5xdWVyeV9oZWFkKTsKKyAgICAgICAgcHJldi0+bmV4dCA9IHF1ZXJ5LT5uZXh0OworICAgIH0KKyAgICBpZiAoc2RrY3RsLT5xdWVyeV90YWlsID09IHF1ZXJ5KSB7CisgICAgICAgIC8qIFF1ZXJ5IGlzIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0LiAqLworICAgICAgICBhc3NlcnQocXVlcnktPm5leHQgPT0gTlVMTCk7CisgICAgICAgIHNka2N0bC0+cXVlcnlfdGFpbCA9IHByZXY7CisgICAgfQorICAgIHF1ZXJ5LT5uZXh0ID0gTlVMTDsKKworICAgIHJldHVybiBxdWVyeTsKK30KKworLyogUHVsbHMgdGhlIGZpcnN0IHF1ZXJ5IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJpZXMuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBTREtDdGxTb2NrZXQgaW5zdGFuY2UgdGhhdCBvd25zIHRoZSBxdWVyeS4KKyAqIFJldHVybjoKKyAqICBBIHF1ZXJ5IHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdCBvZiBhY3RpdmUgcXVlcmllcywgb3IgTlVMTCBpZiBxdWVyeQorICogIGxpc3QgaXMgZW1wdHkuCisgKi8KK3N0YXRpYyBTREtDdGxRdWVyeSoKK19zZGtjdGxfc29ja2V0X3B1bGxfZmlyc3RfcXVlcnkoU0RLQ3RsU29ja2V0KiBzZGtjdGwpCit7CisgICAgU0RLQ3RsUXVlcnkqIGNvbnN0IHF1ZXJ5ID0gc2RrY3RsLT5xdWVyeV9oZWFkOworCisgICAgaWYgKHF1ZXJ5ICE9IE5VTEwpIHsKKyAgICAgICAgc2RrY3RsLT5xdWVyeV9oZWFkID0gcXVlcnktPm5leHQ7CisgICAgICAgIGlmIChzZGtjdGwtPnF1ZXJ5X2hlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgc2RrY3RsLT5xdWVyeV90YWlsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcXVlcnk7Cit9CisKKy8qIEdlbmVyYXRlcyBuZXcgcXVlcnkgSUQgZm9yIHRoZSBnaXZlbiBTREtDdGwuICovCitzdGF0aWMgaW50Citfc2RrY3RsX3NvY2tldF9uZXh0X3F1ZXJ5X2lkKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIHJldHVybiArK3Nka2N0bC0+bmV4dF9xdWVyeV9pZDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxQYWNrZXQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbG9jYXRlcyBhIHBhY2tldC4gKi8KK3N0YXRpYyBTREtDdGxQYWNrZXQqCitfc2RrY3RsX3BhY2tldF9uZXcoU0RLQ3RsU29ja2V0KiBzZGtjdGwsIHVpbnQzMl90IHNpemUsIGludCB0eXBlKQoreworICAgIC8qIEFsbG9jYXRlIHBhY2tldCBkZXNjcmlwdG9yIGxhcmdlIGVub3VnaCB0byBjb250YWluIHBhY2tldCBkYXRhLiAqLworICAgIFNES0N0bFBhY2tldCogY29uc3QgcGFja2V0ID0KKyAgICAgICAgX3Nka2N0bF9zb2NrZXRfYWxsb2NfcmVjeWNsZXIoc2RrY3RsLCBzaXplb2YoU0RLQ3RsUGFja2V0KSArIHNpemUpOworCisgICAgcGFja2V0LT5zZGtjdGwgICAgICAgICAgICAgID0gc2RrY3RsOworICAgIHBhY2tldC0+cmVmX2NvdW50ICAgICAgICAgICA9IDE7CisgICAgcGFja2V0LT5oZWFkZXIuc2lnbmF0dXJlICAgID0gX3Nka2N0bF9wYWNrZXRfc2lnOworICAgIHBhY2tldC0+aGVhZGVyLnNpemUgICAgICAgICA9IHNpemU7CisgICAgcGFja2V0LT5oZWFkZXIudHlwZSAgICAgICAgID0gdHlwZTsKKworICAgIC8qIFJlZmVuY2UgU0RLQ1RsU29ja2V0IHRoYXQgb3ducyB0aGlzIHBhY2tldC4gKi8KKyAgICBzZGtjdGxfc29ja2V0X3JlZmVyZW5jZShzZGtjdGwpOworCisgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgJXAgb2YgdHlwZSAlZCBpcyBhbGxvY2F0ZWQgZm9yICVkIGJ5dGVzIHRyYW5zZmVyLiIsCisgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldCwgdHlwZSwgc2l6ZSk7CisKKyAgICByZXR1cm4gcGFja2V0OworfQorCisvKiBGcmVlcyBhIHBhY2tldC4gKi8KK3N0YXRpYyB2b2lkCitfc2RrY3RsX3BhY2tldF9mcmVlKFNES0N0bFBhY2tldCogcGFja2V0KQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gcGFja2V0LT5zZGtjdGw7CisKKyAgICAvKiBSZWN5Y2xlIHBhY2tldC4gKi8KKyAgICBfc2RrY3RsX3NvY2tldF9mcmVlX3JlY3ljbGVyKHBhY2tldC0+c2RrY3RsLCBwYWNrZXQpOworCisgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgJXAgaXMgZnJlZWQuIiwgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldCk7CisKKyAgICAvKiBSZWxlYXNlIFNES0NUbFNvY2tldCB0aGF0IG93bmVkIHRoaXMgcGFja2V0LiAqLworICAgIHNka2N0bF9zb2NrZXRfcmVsZWFzZShzZGtjdGwpOworfQorCisvKiBSZWZlcmVuY2VzIGEgcGFja2V0LiAqLworaW50Citfc2RrY3RsX3BhY2tldF9yZWZlcmVuY2UoU0RLQ3RsUGFja2V0KiBwYWNrZXQpCit7CisgICAgYXNzZXJ0KHBhY2tldC0+cmVmX2NvdW50ID4gMCk7CisgICAgcGFja2V0LT5yZWZfY291bnQrKzsKKyAgICByZXR1cm4gcGFja2V0LT5yZWZfY291bnQ7Cit9CisKKy8qIFJlbGVhc2VzIGEgcGFja2V0LiAqLworaW50Citfc2RrY3RsX3BhY2tldF9yZWxlYXNlKFNES0N0bFBhY2tldCogcGFja2V0KQoreworICAgIGFzc2VydChwYWNrZXQtPnJlZl9jb3VudCA+IDApOworICAgIHBhY2tldC0+cmVmX2NvdW50LS07CisgICAgaWYgKHBhY2tldC0+cmVmX2NvdW50ID09IDApIHsKKyAgICAgICAgLyogTGFzdCByZWZlcmVuY2UgaGFzIGJlZW4gZHJvcHBlZC4gRGVzdHJveSB0aGlzIG9iamVjdC4gKi8KKyAgICAgICAgX3Nka2N0bF9wYWNrZXRfZnJlZShwYWNrZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHBhY2tldC0+cmVmX2NvdW50OworfQorCisvKiBBbiBJL08gY2FsbGJhY2sgaW52b2tlZCBvbiBwYWNrZXQgdHJhbnNtaXNzaW9uLgorICogUGFyYW06CisgKiAgaW9fb3BhcXVlIFNES0N0bFBhY2tldCBpbnN0YW5jZSBvZiB0aGUgcGFja2V0IHRoYXQncyBiZWluZyBzZW50IHdpdGggdGhpcyBJL08uCisgKiAgYXNpbyAtIFdyaXRlIEkvTyBkZXNjcmlwdG9yLgorICogIHN0YXR1cyAtIEkvTyBzdGF0dXMuCisgKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25fc2RrY3RsX3BhY2tldF9zZW5kX2lvKHZvaWQqIGlvX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogYXNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cykKK3sKKyAgICBTREtDdGxQYWNrZXQqIGNvbnN0IHBhY2tldCA9IChTREtDdGxQYWNrZXQqKWlvX29wYXF1ZTsKKyAgICBBc3luY0lPQWN0aW9uIGFjdGlvbiA9IEFTSU9fQUNUSU9OX0RPTkU7CisKKyAgICAvKiBSZWZlcmVuY2UgdGhlIHBhY2tldCB3aGlsZSB3ZSdyZSBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIF9zZGtjdGxfcGFja2V0X3JlZmVyZW5jZShwYWNrZXQpOworCisgICAgLyogTGV0cyBzZWUgd2hhdCdzIGdvaW5nIG9uIHdpdGggcXVlcnkgdHJhbnNtaXNzaW9uLiAqLworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQVNJT19TVEFURV9TVUNDRUVERUQ6CisgICAgICAgICAgICAvKiBQYWNrZXQgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmljZS4gKi8KKyAgICAgICAgICAgIFQoIlNES0N0bCAlczogUGFja2V0ICVwIHRyYW5zbWlzc2lvbiBoYXMgc3VjY2VlZGVkLiIsCisgICAgICAgICAgICAgIHBhY2tldC0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfQ0FOQ0VMTEVEOgorICAgICAgICAgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgJXAgaXMgY2FuY2VsbGVkLiIsCisgICAgICAgICAgICAgIHBhY2tldC0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgJXAgaGFzIGZhaWxlZDogJWQgLT4gJXMiLAorICAgICAgICAgICAgICBwYWNrZXQtPnNka2N0bC0+c2VydmljZV9uYW1lLCBwYWNrZXQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBU0lPX1NUQVRFX0ZJTklTSEVEOgorICAgICAgICAgICAgLyogVGltZSB0byBkaXNhc3NvY2lhdGUgdGhlIHBhY2tldCB3aXRoIHRoZSBJL08uICovCisgICAgICAgICAgICBfc2RrY3RsX3BhY2tldF9yZWxlYXNlKHBhY2tldCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogVHJhbnNpdGlvbmFsIHN0YXRlLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX3Nka2N0bF9wYWNrZXRfcmVsZWFzZShwYWNrZXQpOworCisgICAgcmV0dXJuIGFjdGlvbjsKK30KKworLyogVHJhbnNtaXRzIGEgcGFja2V0IHRvIFNESyBDb250cm9sbGVyLgorICogUGFyYW06CisgKiAgcGFja2V0IC0gUGFja2V0IHRvIHRyYW5zbWl0LgorICovCitzdGF0aWMgdm9pZAorX3Nka2N0bF9wYWNrZXRfdHJhbnNtaXQoU0RLQ3RsUGFja2V0KiBwYWNrZXQpCit7CisgICAgYXNzZXJ0KHBhY2tldC0+aGVhZGVyLnNpZ25hdHVyZSA9PSBfc2RrY3RsX3BhY2tldF9zaWcpOworCisgICAgLyogUmVmZXJlbmNlIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJL08gKi8KKyAgICBfc2RrY3RsX3BhY2tldF9yZWZlcmVuY2UocGFja2V0KTsKKworICAgIC8qIFRyYW5zbWl0IHRoZSBwYWNrZXQgdG8gU0RLIGNvbnRyb2xsZXIuICovCisgICAgYXN5bmNfc29ja2V0X3dyaXRlX3JlbChwYWNrZXQtPnNka2N0bC0+YXMsICZwYWNrZXQtPmhlYWRlciwgcGFja2V0LT5oZWFkZXIuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9zZGtjdGxfcGFja2V0X3NlbmRfaW8sIHBhY2tldCwgLTEpOworCisgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgJXAgc2l6ZSAlZCBpcyBiZWluZyBzZW50LiIsCisgICAgICBwYWNrZXQtPnNka2N0bC0+c2VydmljZV9uYW1lLCBwYWNrZXQsIHBhY2tldC0+aGVhZGVyLnNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsRGlyZWN0UGFja2V0IGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NES0N0bERpcmVjdFBhY2tldCoKK3Nka2N0bF9kaXJlY3RfcGFja2V0X25ldyhTREtDdGxTb2NrZXQqIHNka2N0bCkKK3sKKyAgICBTREtDdGxEaXJlY3RQYWNrZXQqIGNvbnN0IHBhY2tldCA9CisgICAgICAgIF9zZGtjdGxfc29ja2V0X2FsbG9jX3JlY3ljbGVyKHNka2N0bCwgc2l6ZW9mKFNES0N0bERpcmVjdFBhY2tldCkpOworCisgICAgcGFja2V0LT5zZGtjdGwgICAgICA9IHNka2N0bDsKKyAgICBwYWNrZXQtPnJlZl9jb3VudCAgID0gMTsKKworICAgIC8qIFJlZmVuY2UgU0RLQ1RsU29ja2V0IHRoYXQgb3ducyB0aGlzIHBhY2tldC4gKi8KKyAgICBzZGtjdGxfc29ja2V0X3JlZmVyZW5jZShwYWNrZXQtPnNka2N0bCk7CisKKyAgICBUKCJTREtDdGwgJXM6IERpcmVjdCBwYWNrZXQgJXAgaXMgYWxsb2NhdGVkLiIsIHNka2N0bC0+c2VydmljZV9uYW1lLCBwYWNrZXQpOworCisgICAgcmV0dXJuIHBhY2tldDsKK30KKworLyogRnJlZXMgYSBkaXJlY3QgcGFja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfZGlyZWN0X3BhY2tldF9mcmVlKFNES0N0bERpcmVjdFBhY2tldCogcGFja2V0KQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gcGFja2V0LT5zZGtjdGw7CisKKyAgICAvKiBGcmVlIGFsbG9jYXRlZCByZXNvdXJjZXMuICovCisgICAgX3Nka2N0bF9zb2NrZXRfZnJlZV9yZWN5Y2xlcihwYWNrZXQtPnNka2N0bCwgcGFja2V0KTsKKworICAgIFQoIlNES0N0bCAlczogRGlyZWN0IHBhY2tldCAlcCBpcyBmcmVlZC4iLCBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgcGFja2V0KTsKKworICAgIC8qIFJlbGVhc2UgU0RLQ1RsU29ja2V0IHRoYXQgb3duZWQgdGhpcyBwYWNrZXQuICovCisgICAgc2RrY3RsX3NvY2tldF9yZWxlYXNlKHNka2N0bCk7Cit9CisKKy8qIFJlZmVyZW5jZXMgYSBwYWNrZXQuICovCitpbnQKK3Nka2N0bF9kaXJlY3RfcGFja2V0X3JlZmVyZW5jZShTREtDdGxEaXJlY3RQYWNrZXQqIHBhY2tldCkKK3sKKyAgICBhc3NlcnQocGFja2V0LT5yZWZfY291bnQgPiAwKTsKKyAgICBwYWNrZXQtPnJlZl9jb3VudCsrOworICAgIHJldHVybiBwYWNrZXQtPnJlZl9jb3VudDsKK30KKworLyogUmVsZWFzZXMgYSBwYWNrZXQuICovCitpbnQKK3Nka2N0bF9kaXJlY3RfcGFja2V0X3JlbGVhc2UoU0RLQ3RsRGlyZWN0UGFja2V0KiBwYWNrZXQpCit7CisgICAgYXNzZXJ0KHBhY2tldC0+cmVmX2NvdW50ID4gMCk7CisgICAgcGFja2V0LT5yZWZfY291bnQtLTsKKyAgICBpZiAocGFja2V0LT5yZWZfY291bnQgPT0gMCkgeworICAgICAgICAvKiBMYXN0IHJlZmVyZW5jZSBoYXMgYmVlbiBkcm9wcGVkLiBEZXN0cm95IHRoaXMgb2JqZWN0LiAqLworICAgICAgICBfc2RrY3RsX2RpcmVjdF9wYWNrZXRfZnJlZShwYWNrZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHBhY2tldC0+cmVmX2NvdW50OworfQorCisvKiBBbiBJL08gY2FsbGJhY2sgaW52b2tlZCBvbiBkaXJlY3QgcGFja2V0IHRyYW5zbWlzc2lvbi4KKyAqIFBhcmFtOgorICogIGlvX29wYXF1ZSBTREtDdGxEaXJlY3RQYWNrZXQgaW5zdGFuY2Ugb2YgdGhlIHBhY2tldCB0aGF0J3MgYmVpbmcgc2VudCB3aXRoCisgKiAgICAgIHRoaXMgSS9PLgorICogIGFzaW8gLSBXcml0ZSBJL08gZGVzY3JpcHRvci4KKyAqICBzdGF0dXMgLSBJL08gc3RhdHVzLgorICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX3Nka2N0bF9kaXJlY3RfcGFja2V0X3NlbmRfaW8odm9pZCogaW9fb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogYXNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpCit7CisgICAgU0RLQ3RsRGlyZWN0UGFja2V0KiBjb25zdCBwYWNrZXQgPSAoU0RLQ3RsRGlyZWN0UGFja2V0Kilpb19vcGFxdWU7CisgICAgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPSBBU0lPX0FDVElPTl9ET05FOworCisgICAgLyogUmVmZXJlbmNlIHRoZSBwYWNrZXQgd2hpbGUgd2UncmUgaW4gdGhpcyBjYWxsYmFjay4gKi8KKyAgICBzZGtjdGxfZGlyZWN0X3BhY2tldF9yZWZlcmVuY2UocGFja2V0KTsKKworICAgIC8qIExldHMgc2VlIHdoYXQncyBnb2luZyBvbiB3aXRoIHF1ZXJ5IHRyYW5zbWlzc2lvbi4gKi8KKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfU1VDQ0VFREVEOgorICAgICAgICAgICAgLyogUGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gdGhlIHNlcnZpY2UuICovCisgICAgICAgICAgICBUKCJTREtDdGwgJXM6IERpcmVjdCBwYWNrZXQgJXAgdHJhbnNtaXNzaW9uIGhhcyBzdWNjZWVkZWQuIiwKKyAgICAgICAgICAgICAgcGFja2V0LT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgcGFja2V0KTsKKyAgICAgICAgICAgIHBhY2tldC0+b25fc2VudChwYWNrZXQtPm9uX3NlbnRfb3BhcXVlLCBwYWNrZXQsIHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfQ0FOQ0VMTEVEOgorICAgICAgICAgICAgVCgiU0RLQ3RsICVzOiBEaXJlY3QgcGFja2V0ICVwIGlzIGNhbmNlbGxlZC4iLAorICAgICAgICAgICAgICBwYWNrZXQtPnNka2N0bC0+c2VydmljZV9uYW1lLCBwYWNrZXQpOworICAgICAgICAgICAgcGFja2V0LT5vbl9zZW50KHBhY2tldC0+b25fc2VudF9vcGFxdWUsIHBhY2tldCwgc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVNJT19TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICBUKCJTREtDdGwgJXM6IERpcmVjdCBwYWNrZXQgJXAgaGFzIGZhaWxlZDogJWQgLT4gJXMiLAorICAgICAgICAgICAgICBwYWNrZXQtPnNka2N0bC0+c2VydmljZV9uYW1lLCBwYWNrZXQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcGFja2V0LT5vbl9zZW50KHBhY2tldC0+b25fc2VudF9vcGFxdWUsIHBhY2tldCwgc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVNJT19TVEFURV9GSU5JU0hFRDoKKyAgICAgICAgICAgIC8qIFRpbWUgdG8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIEkvTy4gKi8KKyAgICAgICAgICAgIHNka2N0bF9kaXJlY3RfcGFja2V0X3JlbGVhc2UocGFja2V0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBUcmFuc2l0aW9uYWwgc3RhdGUuICovCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZGtjdGxfZGlyZWN0X3BhY2tldF9yZWxlYXNlKHBhY2tldCk7CisKKyAgICByZXR1cm4gYWN0aW9uOworfQorCit2b2lkCitzZGtjdGxfZGlyZWN0X3BhY2tldF9zZW5kKFNES0N0bERpcmVjdFBhY2tldCogcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9zZGtjdGxfZGlyZWN0X2NiIGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjYl9vcGFxdWUpCit7CisgICAgcGFja2V0LT5wYWNrZXQgICAgICAgICAgPSAoU0RLQ3RsUGFja2V0SGVhZGVyKilkYXRhOworICAgIHBhY2tldC0+b25fc2VudCAgICAgICAgID0gY2I7CisgICAgcGFja2V0LT5vbl9zZW50X29wYXF1ZSAgPSBjYl9vcGFxdWU7CisgICAgYXNzZXJ0KHBhY2tldC0+cGFja2V0LT5zaWduYXR1cmUgPT0gX3Nka2N0bF9wYWNrZXRfc2lnKTsKKworICAgIC8qIFJlZmVyZW5jZSBmb3IgSS9PICovCisgICAgc2RrY3RsX2RpcmVjdF9wYWNrZXRfcmVmZXJlbmNlKHBhY2tldCk7CisKKyAgICAvKiBUcmFuc21pdCB0aGUgcGFja2V0IHRvIFNESyBjb250cm9sbGVyLiAqLworICAgIGFzeW5jX3NvY2tldF93cml0ZV9yZWwocGFja2V0LT5zZGtjdGwtPmFzLCBwYWNrZXQtPnBhY2tldCwgcGFja2V0LT5wYWNrZXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fc2RrY3RsX2RpcmVjdF9wYWNrZXRfc2VuZF9pbywgcGFja2V0LCAtMSk7CisKKyAgICBUKCJTREtDdGwgJXM6IERpcmVjdCBwYWNrZXQgJXAgc2l6ZSAlZCBpcyBiZWluZyBzZW50IiwKKyAgICAgIHBhY2tldC0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldCwgcGFja2V0LT5wYWNrZXQtPnNpemUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgIFNES0N0bE1lc3NhZ2UgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbG9jYXRlcyBhIG1lc3NhZ2UgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyBTREtDdGxNZXNzYWdlKgorX3Nka2N0bF9tZXNzYWdlX25ldyhTREtDdGxTb2NrZXQqIHNka2N0bCwgdWludDMyX3QgbXNnX3NpemUsIGludCBtc2dfdHlwZSkKK3sKKyAgICBTREtDdGxNZXNzYWdlKiBjb25zdCBtc2cgPQorICAgICAgICAoU0RLQ3RsTWVzc2FnZSopX3Nka2N0bF9wYWNrZXRfbmV3KHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0RLQ3RsTWVzc2FnZUhlYWRlcikgKyBtc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDVExfUEFDS0VUX01FU1NBR0UpOworICAgIG1zZy0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKworICAgIHJldHVybiBtc2c7Cit9CisKK2ludAorc2RrY3RsX21lc3NhZ2VfcmVmZXJlbmNlKFNES0N0bE1lc3NhZ2UqIG1zZykKK3sKKyAgICByZXR1cm4gX3Nka2N0bF9wYWNrZXRfcmVmZXJlbmNlKCZtc2ctPnBhY2tldCk7Cit9CisKK2ludAorc2RrY3RsX21lc3NhZ2VfcmVsZWFzZShTREtDdGxNZXNzYWdlKiBtc2cpCit7CisgICAgcmV0dXJuIF9zZGtjdGxfcGFja2V0X3JlbGVhc2UoJm1zZy0+cGFja2V0KTsKK30KKworU0RLQ3RsTWVzc2FnZSoKK3Nka2N0bF9tZXNzYWdlX3NlbmQoU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBTREtDdGxNZXNzYWdlKiBjb25zdCBtc2cgPSBfc2RrY3RsX21lc3NhZ2VfbmV3KHNka2N0bCwgc2l6ZSwgbXNnX3R5cGUpOworICAgIGlmIChzaXplICE9IDAgJiYgZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShtc2cgKyAxLCBkYXRhLCBzaXplKTsKKyAgICB9CisgICAgX3Nka2N0bF9wYWNrZXRfdHJhbnNtaXQoJm1zZy0+cGFja2V0KTsKKworICAgIHJldHVybiBtc2c7Cit9CisKK2ludAorc2RrY3RsX21lc3NhZ2VfZ2V0X2hlYWRlcl9zaXplKHZvaWQpCit7CisgICAgcmV0dXJuIHNpemVvZihTREtDdGxNZXNzYWdlSGVhZGVyKTsKK30KKwordm9pZAorc2RrY3RsX2luaXRfbWVzc2FnZV9oZWFkZXIodm9pZCogbXNnLCBpbnQgbXNnX3R5cGUsIGludCBtc2dfc2l6ZSkKK3sKKyAgICBTREtDdGxNZXNzYWdlSGVhZGVyKiBjb25zdCBtc2dfaGVhZGVyID0gKFNES0N0bE1lc3NhZ2VIZWFkZXIqKW1zZzsKKworICAgIG1zZ19oZWFkZXItPnBhY2tldC5zaWduYXR1cmUgICAgPSBfc2RrY3RsX3BhY2tldF9zaWc7CisgICAgbXNnX2hlYWRlci0+cGFja2V0LnNpemUgICAgICAgICA9IHNpemVvZihTREtDdGxNZXNzYWdlSGVhZGVyKSArIG1zZ19zaXplOworICAgIG1zZ19oZWFkZXItPnBhY2tldC50eXBlICAgICAgICAgPSBTREtDVExfUEFDS0VUX01FU1NBR0U7CisgICAgbXNnX2hlYWRlci0+bXNnX3R5cGUgICAgICAgICAgICA9IG1zZ190eXBlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICBTREtDdGxRdWVyeSBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZyZWVzIHF1ZXJ5IGRlc2NyaXB0b3IuICovCitzdGF0aWMgdm9pZAorX3Nka2N0bF9xdWVyeV9mcmVlKFNES0N0bFF1ZXJ5KiBxdWVyeSkKK3sKKyAgICBpZiAocXVlcnkgIT0gTlVMTCkgeworICAgICAgICBTREtDdGxTb2NrZXQqIGNvbnN0IHNka2N0bCA9IHF1ZXJ5LT5zZGtjdGw7CisgICAgICAgIGlmIChxdWVyeS0+aW50ZXJuYWxfcmVzcF9idWZmZXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgKHF1ZXJ5LT5yZXNwb25zZV9idWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgICAgIHF1ZXJ5LT5yZXNwb25zZV9idWZmZXIgPT0gJnF1ZXJ5LT5pbnRlcm5hbF9yZXNwX2J1ZmZlcikpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgcXVlcnkgdXNlZCBpdHMgaW50ZXJuYWwgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIHJlc3BvbnNlLgorICAgICAgICAgICAgICogRnJlZSBpdC4gKi8KKyAgICAgICAgICAgIGZyZWUocXVlcnktPmludGVybmFsX3Jlc3BfYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvb3BUaW1lcl9mcmVlKHF1ZXJ5LT50aW1lcik7CisKKyAgICAgICAgLyogUmVjeWxlIHRoZSBkZXNjcmlwdG9yLiAqLworICAgICAgICBfc2RrY3RsX3NvY2tldF9mcmVlX3JlY3ljbGVyKHNka2N0bCwgcXVlcnkpOworCisgICAgICAgIFQoIlNES0N0bCAlczogUXVlcnkgJXAgaXMgZnJlZWQuIiwgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5KTsKKworICAgICAgICAvKiBSZWxlYXNlIHNvY2tldCB0aGF0IG93bmVkIHRoaXMgcXVlcnkuICovCisgICAgICAgIHNka2N0bF9zb2NrZXRfcmVsZWFzZShzZGtjdGwpOworICAgIH0KK30KKworLyogQ2FuY2VscyB0aW1lb3V0IGZvciB0aGUgcXVlcnkuCisgKgorICogRm9yIHRoZSBzaW1wbGljaXR5IG9mIGltcGxlbWVudGF0aW9uLCB0aGUgZGlzcGF0Y2hlciB3aWxsIGNhbmNlbCBxdWVyeSB0aW1lcgorICogd2hlbiBxdWVyeSByZXNwb25zZSBkYXRhIGJlZ2lucyB0byBmbG93IGluLiBJZiB3ZSBsZXQgdGhlIHRpbWVyIHRvIGV4cGlyZSBhdAorICogdGhhdCBzdGFnZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBkYXRhIGZsb3dpbmcgaW4gd2l0aG91dCByZWFsIHBsYWNlIHRvCisgKiBhY2NvbW9kYXRlIGl0LgorICovCitzdGF0aWMgdm9pZAorX3Nka2N0bF9xdWVyeV9jYW5jZWxfdGltZW91dChTREtDdGxRdWVyeSogcXVlcnkpCit7CisgICAgbG9vcFRpbWVyX3N0b3AocXVlcnktPnRpbWVyKTsKKworICAgIFQoIlNES0N0bCAlczogUXVlcnkgJXAgSUQgJWQgZGVhZGxpbmUgJWxsZCBpcyBjYW5jZWxsZWQuIiwKKyAgICAgIHF1ZXJ5LT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgcXVlcnksIHF1ZXJ5LT5oZWFkZXIucXVlcnlfaWQsIHF1ZXJ5LT5kZWFkbGluZSk7Cit9CisKKy8qCisgKiBRdWVyeSBJL08gY2FsbGJhY2tzLgorICovCisKKy8qIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBieSB0aGUgSS9PIGRpc3BhdGNoZXIgd2hlbiBxdWVyeSBpcyBzdWNjZXNzZnVseQorICogY29tcGxldGVkIChpLmUuIHJlc3BvbnNlIHRvIHRoZSBxdWVyeSBpcyByZWNlaXZlZCkuCisgKi8KK3N0YXRpYyB2b2lkCitfb25fc2RrY3RsX3F1ZXJ5X2NvbXBsZXRlZChTREtDdGxRdWVyeSogcXVlcnkpCit7CisgICAgVCgiU0RLQ3RsICVzOiBRdWVyeSAlcCBJRCAlZCBpcyBjb21wbGV0ZWQuIiwKKyAgICAgIHF1ZXJ5LT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgcXVlcnksIHF1ZXJ5LT5oZWFkZXIucXVlcnlfaWQpOworCisgICAgLyogQ2FuY2VsIGRlYWRsaW5lLCBhbmQgaW5mb3JtIHRoZSBjbGllbnQgYWJvdXQgcXVlcnkgY29tcGxldGlvbi4gKi8KKyAgICBfc2RrY3RsX3F1ZXJ5X2NhbmNlbF90aW1lb3V0KHF1ZXJ5KTsKKyAgICBxdWVyeS0+cXVlcnlfY2IocXVlcnktPnF1ZXJ5X29wYXF1ZSwgcXVlcnksIEFTSU9fU1RBVEVfU1VDQ0VFREVEKTsKK30KKworLyogQSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgb24gcXVlcnkgY2FuY2VsbGF0aW9uLiAqLworc3RhdGljIHZvaWQKK19vbl9zZGtjdGxfcXVlcnlfY2FuY2VsbGVkKFNES0N0bFF1ZXJ5KiBxdWVyeSkKK3sKKyAgICAvKgorICAgICAqIFF1ZXJ5IGNhbmNlbGxhdGlvbiBtZWFucyB0aGF0IFNESyBjb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZC4gSW4gdHVybiwKKyAgICAgKiB0aGlzIG1lYW5zIHRoYXQgU0RLIGNvbnRyb2xsZXIgc29ja2V0IHdpbGwgaGFuZGxlIGRpc2Nvbm5lY3Rpb24gaW4gaXRzCisgICAgICogY29ubmVjdGlvbiBjYWxsYmFjay4gU28sIGF0IHRoaXMgcG9pbnQgYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBpbmZvcm0KKyAgICAgKiB0aGUgY2xpZW50IGFib3V0IHF1ZXJ5IGNhbmNlbGxhdGlvbi4KKyAgICAgKi8KKworICAgIC8qIENhbmNlbCBkZWFkbGluZSwgYW5kIGluZm9ybSB0aGUgY2xpZW50IGFib3V0IHF1ZXJ5IGNhbmNlbGxhdGlvbi4gKi8KKyAgICBfc2RrY3RsX3F1ZXJ5X2NhbmNlbF90aW1lb3V0KHF1ZXJ5KTsKKyAgICBxdWVyeS0+cXVlcnlfY2IocXVlcnktPnF1ZXJ5X29wYXF1ZSwgcXVlcnksIEFTSU9fU1RBVEVfQ0FOQ0VMTEVEKTsKK30KKworLyogQSB0aW1lciBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgb24gcXVlcnkgdGltZW91dC4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIFNES0N0bFF1ZXJ5IGluc3RhbmNlLgorICovCitzdGF0aWMgdm9pZAorX29uX3NrZGN0bF9xdWVyeV90aW1lb3V0KHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB0aW1lcikKK3sKKyAgICBTREtDdGxRdWVyeSogY29uc3QgcXVlcnkgPSAoU0RLQ3RsUXVlcnkqKW9wYXF1ZTsKKworICAgIEQoIlNES0N0bCAlczogUXVlcnkgJXAgSUQgJWQgd2l0aCBkZWFkbGluZSAlbGxkIGhhcyB0aW1lZCBvdXQgYXQgJWxsZCIsCisgICAgICBxdWVyeS0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5LCBxdWVyeS0+aGVhZGVyLnF1ZXJ5X2lkLAorICAgICAgcXVlcnktPmRlYWRsaW5lLCBhc3luY19zb2NrZXRfZGVhZGxpbmUocXVlcnktPnNka2N0bC0+YXMsIDApKTsKKworICAgIC8qIFJlZmVyZW5jZSB0aGUgcXVlcnkgd2hpbGUgd2UncmUgaW4gdGhpcyBjYWxsYmFjay4gKi8KKyAgICBzZGtjdGxfcXVlcnlfcmVmZXJlbmNlKHF1ZXJ5KTsKKworICAgIC8qIEluZm9ybSB0aGUgY2xpZW50IGFib3V0IGRlYWRsaW5lIGV4cGlyYXRpb24uIE5vdGUgdGhhdCBjbGllbnQgbWF5CisgICAgICogZXh0ZW5kIHRoZSBkZWFkbGluZSwgYW5kIHJldHJ5IHRoZSBxdWVyeS4gKi8KKyAgICBjb25zdCBBc3luY0lPQWN0aW9uIGFjdGlvbiA9CisgICAgICAgIHF1ZXJ5LT5xdWVyeV9jYihxdWVyeS0+cXVlcnlfb3BhcXVlLCBxdWVyeSwgQVNJT19TVEFURV9USU1FRF9PVVQpOworCisgICAgLyogRm9yIGFjdGlvbnMgb3RoZXIgdGhhbiByZXRyeSB3ZSB3aWxsIGRlc3Ryb3kgdGhlIHF1ZXJ5LiAqLworICAgIGlmIChhY3Rpb24gIT0gQVNJT19BQ1RJT05fUkVUUlkpIHsKKyAgICAgICAgX3Nka2N0bF9zb2NrZXRfcmVtb3ZlX3F1ZXJ5KHF1ZXJ5KTsKKyAgICB9CisKKyAgICBzZGtjdGxfcXVlcnlfcmVsZWFzZShxdWVyeSk7Cit9CisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gcXVlcnkgaGFzIGJlZW4gc2VudCB0byB0aGUgU0RLIGNvbnRyb2xsZXIuICovCitzdGF0aWMgdm9pZAorX29uX3Nka2N0bF9xdWVyeV9zZW50KFNES0N0bFF1ZXJ5KiBxdWVyeSkKK3sKKyAgICBUKCJTREtDdGwgJXM6IFNlbnQgJWQgYnl0ZXMgb2YgcXVlcnkgJXAgSUQgJWQgb2YgdHlwZSAlZCIsCisgICAgICBxdWVyeS0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5LT5oZWFkZXIucGFja2V0LnNpemUsIHF1ZXJ5LAorICAgICAgcXVlcnktPmhlYWRlci5xdWVyeV9pZCwgcXVlcnktPmhlYWRlci5xdWVyeV90eXBlKTsKKworICAgIC8qIEluZm9ybSB0aGUgY2xpZW50IGFib3V0IHRoZSBldmVudC4gKi8KKyAgICBxdWVyeS0+cXVlcnlfY2IocXVlcnktPnF1ZXJ5X29wYXF1ZSwgcXVlcnksIEFTSU9fU1RBVEVfQ09OVElOVUVTKTsKKworICAgIC8qIFNldCBhIHRpbWVyIHRvIGV4cGlyZSBhdCBxdWVyeSdzIGRlYWRsaW5lLCBhbmQgbGV0IHRoZSByZXNwb25zZSB0byBjb21lCisgICAgICogdGhyb3VnaCB0aGUgZGlzcGF0Y2hlciBsb29wLiAqLworICAgIGxvb3BUaW1lcl9zdGFydEFic29sdXRlKHF1ZXJ5LT50aW1lciwgcXVlcnktPmRlYWRsaW5lKTsKK30KKworLyogQW4gSS9PIGNhbGxiYWNrIGludm9rZWQgb24gcXVlcnkgdHJhbnNtaXNzaW9uLgorICogUGFyYW06CisgKiAgaW9fb3BhcXVlIFNES0N0bFF1ZXJ5IGluc3RhbmNlIG9mIHRoZSBxdWVyeSB0aGF0J3MgYmVpbmcgc2VudCB3aXRoIHRoaXMgSS9PLgorICogIGFzaW8gLSBXcml0ZSBJL08gZGVzY3JpcHRvci4KKyAqICBzdGF0dXMgLSBJL08gc3RhdHVzLgorICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX3Nka2N0bF9xdWVyeV9zZW5kX2lvKHZvaWQqIGlvX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiBhc2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpCit7CisgICAgU0RLQ3RsUXVlcnkqIGNvbnN0IHF1ZXJ5ID0gKFNES0N0bFF1ZXJ5Kilpb19vcGFxdWU7CisgICAgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPSBBU0lPX0FDVElPTl9ET05FOworCisgICAgLyogUmVmZXJlbmNlIHRoZSBxdWVyeSB3aGlsZSB3ZSdyZSBpbiB0aGlzIGNhbGxiYWNrLiAqLworICAgIHNka2N0bF9xdWVyeV9yZWZlcmVuY2UocXVlcnkpOworCisgICAgLyogTGV0cyBzZWUgd2hhdCdzIGdvaW5nIG9uIHdpdGggcXVlcnkgdHJhbnNtaXNzaW9uLiAqLworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQVNJT19TVEFURV9TVUNDRUVERUQ6CisgICAgICAgICAgICAvKiBRdWVyeSBoYXMgYmVlbiBzZW50IHRvIHRoZSBzZXJ2aWNlLiAqLworICAgICAgICAgICAgX29uX3Nka2N0bF9xdWVyeV9zZW50KHF1ZXJ5KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVNJT19TVEFURV9DQU5DRUxMRUQ6CisgICAgICAgICAgICBUKCJTREtDdGwgJXM6IFF1ZXJ5ICVwIElEICVkIGlzIGNhbmNlbGxlZCBpbiB0cmFuc21pc3Npb24uIiwKKyAgICAgICAgICAgICAgcXVlcnktPnNka2N0bC0+c2VydmljZV9uYW1lLCBxdWVyeSwgcXVlcnktPmhlYWRlci5xdWVyeV9pZCk7CisgICAgICAgICAgICAvKiBSZW1vdmUgdGhlIHF1ZXJ5IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIHF1ZXJpZXMuICovCisgICAgICAgICAgICBfc2RrY3RsX3NvY2tldF9yZW1vdmVfcXVlcnkocXVlcnkpOworICAgICAgICAgICAgX29uX3Nka2N0bF9xdWVyeV9jYW5jZWxsZWQocXVlcnkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBU0lPX1NUQVRFX1RJTUVEX09VVDoKKyAgICAgICAgICAgIEQoIlNES0N0bCAlczogUXVlcnkgJXAgSUQgJWQgd2l0aCBkZWFkbGluZSAlbGxkIGhhcyB0aW1lZCBvdXQgaW4gdHJhbnNtaXNzaW9uIGF0ICVsbGQiLAorICAgICAgICAgICAgICBxdWVyeS0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5LCBxdWVyeS0+aGVhZGVyLnF1ZXJ5X2lkLAorICAgICAgICAgICAgICBxdWVyeS0+ZGVhZGxpbmUsICBhc3luY19zb2NrZXRfZGVhZGxpbmUocXVlcnktPnNka2N0bC0+YXMsIDApKTsKKyAgICAgICAgICAgIC8qIEludm9rZSBxdWVyeSdzIGNhbGxiYWNrLiAqLworICAgICAgICAgICAgYWN0aW9uID0gcXVlcnktPnF1ZXJ5X2NiKHF1ZXJ5LT5xdWVyeV9vcGFxdWUsIHF1ZXJ5LCBzdGF0dXMpOworICAgICAgICAgICAgLyogRm9yIGFjdGlvbnMgb3RoZXIgdGhhbiByZXRyeSB3ZSBuZWVkIHRvIHN0b3AgdGhlIHF1ZXJ5LiAqLworICAgICAgICAgICAgaWYgKGFjdGlvbiAhPSBBU0lPX0FDVElPTl9SRVRSWSkgeworICAgICAgICAgICAgICAgIF9zZGtjdGxfc29ja2V0X3JlbW92ZV9xdWVyeShxdWVyeSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgVCgiU0RLQ3RsICVzOiBRdWVyeSAlcCBJRCAlZCBmYWlsZWQgaW4gdHJhbnNtaXNzaW9uOiAlZCAtPiAlcyIsCisgICAgICAgICAgICAgIHF1ZXJ5LT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgcXVlcnksIHF1ZXJ5LT5oZWFkZXIucXVlcnlfaWQsCisgICAgICAgICAgICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgLyogSW52b2tlIHF1ZXJ5J3MgY2FsbGJhY2suIE5vdGUgdGhhdCB3ZSB3aWxsIGxldCB0aGUgY2xpZW50IHRvCisgICAgICAgICAgICAgKiBkZWNpZGUgd2hhdCB0byBkbyBvbiBJL08gZmFpbHVyZS4gKi8KKyAgICAgICAgICAgIGFjdGlvbiA9IHF1ZXJ5LT5xdWVyeV9jYihxdWVyeS0+cXVlcnlfb3BhcXVlLCBxdWVyeSwgc3RhdHVzKTsKKyAgICAgICAgICAgIC8qIEZvciBhY3Rpb25zIG90aGVyIHRoYW4gcmV0cnkgd2UgbmVlZCB0byBzdG9wIHRoZSBxdWVyeS4gKi8KKyAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gQVNJT19BQ1RJT05fUkVUUlkpIHsKKyAgICAgICAgICAgICAgICBfc2RrY3RsX3NvY2tldF9yZW1vdmVfcXVlcnkocXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBU0lPX1NUQVRFX0ZJTklTSEVEOgorICAgICAgICAgICAgLyogVGltZSB0byBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgSS9PLiAqLworICAgICAgICAgICAgc2RrY3RsX3F1ZXJ5X3JlbGVhc2UocXVlcnkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIFRyYW5zaXRpb25hbCBzdGF0ZS4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNka2N0bF9xdWVyeV9yZWxlYXNlKHF1ZXJ5KTsKKworICAgIHJldHVybiBhY3Rpb247Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgIFNES0N0bFF1ZXJ5IHB1YmxpYyBBUEkgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworU0RLQ3RsUXVlcnkqCitzZGtjdGxfcXVlcnlfbmV3KFNES0N0bFNvY2tldCogc2RrY3RsLCBpbnQgcXVlcnlfdHlwZSwgdWludDMyX3QgaW5fZGF0YV9zaXplKQoreworICAgIFNES0N0bFF1ZXJ5KiBjb25zdCBxdWVyeSA9CisgICAgICAgIF9zZGtjdGxfc29ja2V0X2FsbG9jX3JlY3ljbGVyKHNka2N0bCwgc2l6ZW9mKFNES0N0bFF1ZXJ5KSArIGluX2RhdGFfc2l6ZSk7CisgICAgcXVlcnktPm5leHQgICAgICAgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgcXVlcnktPnNka2N0bCAgICAgICAgICAgICAgICAgICA9IHNka2N0bDsKKyAgICBxdWVyeS0+cmVzcG9uc2VfYnVmZmVyICAgICAgICAgID0gTlVMTDsKKyAgICBxdWVyeS0+cmVzcG9uc2Vfc2l6ZSAgICAgICAgICAgID0gTlVMTDsKKyAgICBxdWVyeS0+aW50ZXJuYWxfcmVzcF9idWZmZXIgICAgID0gTlVMTDsKKyAgICBxdWVyeS0+aW50ZXJuYWxfcmVzcF9zaXplICAgICAgID0gMDsKKyAgICBxdWVyeS0+cXVlcnlfY2IgICAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBxdWVyeS0+cXVlcnlfb3BhcXVlICAgICAgICAgICAgID0gTlVMTDsKKyAgICBxdWVyeS0+ZGVhZGxpbmUgICAgICAgICAgICAgICAgID0gRFVSQVRJT05fSU5GSU5JVEU7CisgICAgcXVlcnktPnJlZl9jb3VudCAgICAgICAgICAgICAgICA9IDE7CisgICAgcXVlcnktPmhlYWRlci5wYWNrZXQuc2lnbmF0dXJlICA9IF9zZGtjdGxfcGFja2V0X3NpZzsKKyAgICBxdWVyeS0+aGVhZGVyLnBhY2tldC5zaXplICAgICAgID0gc2l6ZW9mKFNES0N0bFF1ZXJ5SGVhZGVyKSArIGluX2RhdGFfc2l6ZTsKKyAgICBxdWVyeS0+aGVhZGVyLnBhY2tldC50eXBlICAgICAgID0gU0RLQ1RMX1BBQ0tFVF9RVUVSWTsKKyAgICBxdWVyeS0+aGVhZGVyLnF1ZXJ5X2lkICAgICAgICAgID0gX3Nka2N0bF9zb2NrZXRfbmV4dF9xdWVyeV9pZChzZGtjdGwpOworICAgIHF1ZXJ5LT5oZWFkZXIucXVlcnlfdHlwZSAgICAgICAgPSBxdWVyeV90eXBlOworCisgICAgLyogSW5pdGlhbGl6ZSB0aW1lciB0byBmaXJlIHVwIG9uIHF1ZXJ5IGRlYWRsaW5lIGV4cGlyYXRpb24uICovCisgICAgcXVlcnktPnRpbWVyID0gbG9vcFRpbWVyX25ldygKKyAgICAgICAgICAgIHNka2N0bC0+bG9vcGVyLCBfb25fc2tkY3RsX3F1ZXJ5X3RpbWVvdXQsIHF1ZXJ5KTsKKworICAgIC8qIFJlZmVyZW5jZSBzb2NrZXQgdGhhdCBvd25zIHRoaXMgcXVlcnkuICovCisgICAgc2RrY3RsX3NvY2tldF9yZWZlcmVuY2Uoc2RrY3RsKTsKKworICAgIFQoIlNES0N0bCAlczogUXVlcnkgJXAgSUQgJWQgdHlwZSAlZCBpcyBjcmVhdGVkIGZvciAlZCBieXRlcyBvZiBkYXRhLiIsCisgICAgICBxdWVyeS0+c2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5LCBxdWVyeS0+aGVhZGVyLnF1ZXJ5X2lkLAorICAgICAgcXVlcnlfdHlwZSwgaW5fZGF0YV9zaXplKTsKKworICAgIHJldHVybiBxdWVyeTsKK30KKworU0RLQ3RsUXVlcnkqCitzZGtjdGxfcXVlcnlfbmV3X2V4KFNES0N0bFNvY2tldCogc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICBpbnQgcXVlcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5fZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiogcmVzcG9uc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcmVzcG9uc2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgb25fc2RrY3RsX3F1ZXJ5X2NiIHF1ZXJ5X2NiLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiBxdWVyeV9vcGFxdWUpCit7CisgICAgU0RLQ3RsUXVlcnkqIGNvbnN0IHF1ZXJ5ID0gc2RrY3RsX3F1ZXJ5X25ldyhzZGtjdGwsIHF1ZXJ5X3R5cGUsIGluX2RhdGFfc2l6ZSk7CisKKyAgICBxdWVyeS0+cmVzcG9uc2VfYnVmZmVyID0gcmVzcG9uc2VfYnVmZmVyOworICAgIGlmIChxdWVyeS0+cmVzcG9uc2VfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLyogQ3JlYXRvciBkaWRuJ3Qgc3VwcGx5IGEgYnVmZmVyLiBVc2UgaW50ZXJuYWwgb25lIGluc3RlYWQuICovCisgICAgICAgIHF1ZXJ5LT5yZXNwb25zZV9idWZmZXIgPSAmcXVlcnktPmludGVybmFsX3Jlc3BfYnVmZmVyOworICAgIH0KKyAgICBxdWVyeS0+cmVzcG9uc2Vfc2l6ZSA9IHJlc3BvbnNlX3NpemU7CisgICAgaWYgKHF1ZXJ5LT5yZXNwb25zZV9zaXplID09IE5VTEwpIHsKKyAgICAgICAgLyogQ3JlYXRvciBkaWRuJ3Qgc3VwcGx5IGEgYnVmZmVyIGZvciByZXNwb25zZSBzaXplLiBVc2UgaW50ZXJuYWwgb25lCisgICAgICAgICAqIGluc3RlYWQuICovCisgICAgICAgIHF1ZXJ5LT5yZXNwb25zZV9zaXplID0gJnF1ZXJ5LT5pbnRlcm5hbF9yZXNwX3NpemU7CisgICAgfQorICAgIHF1ZXJ5LT5xdWVyeV9jYiA9IHF1ZXJ5X2NiOworICAgIHF1ZXJ5LT5xdWVyeV9vcGFxdWUgPSBxdWVyeV9vcGFxdWU7CisgICAgLyogSW5pdCBxdWVyeSdzIGlucHV0IGJ1ZmZlci4gKi8KKyAgICBpZiAoaW5fZGF0YV9zaXplICE9IDAgJiYgaW5fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShxdWVyeSArIDEsIGluX2RhdGEsIGluX2RhdGFfc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHF1ZXJ5OworfQorCit2b2lkCitzZGtjdGxfcXVlcnlfc2VuZChTREtDdGxRdWVyeSogcXVlcnksIGludCB0bykKK3sKKyAgICBTREtDdGxTb2NrZXQqIGNvbnN0IHNka2N0bCA9IHF1ZXJ5LT5zZGtjdGw7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBkZWFkbGluZS4gKi8KKyAgICBxdWVyeS0+ZGVhZGxpbmUgPSBhc3luY19zb2NrZXRfZGVhZGxpbmUocXVlcnktPnNka2N0bC0+YXMsIHRvKTsKKworICAgIC8qIExpc3QgdGhlIHF1ZXJ5IGluIHRoZSBsaXN0IG9mIGFjdGl2ZSBxdWVyaWVzLiAqLworICAgIF9zZGtjdGxfc29ja2V0X2FkZF9xdWVyeShxdWVyeSk7CisKKyAgICAvKiBSZWZlcmVuY2UgcXVlcnkgYXNzb2NpYXRlZCB3aXRoIHdyaXRlIEkvTy4gKi8KKyAgICBzZGtjdGxfcXVlcnlfcmVmZXJlbmNlKHF1ZXJ5KTsKKworICAgIGFzc2VydChxdWVyeS0+aGVhZGVyLnBhY2tldC5zaWduYXR1cmUgPT0gX3Nka2N0bF9wYWNrZXRfc2lnKTsKKyAgICAvKiBUcmFuc21pdCB0aGUgcXVlcnkgdG8gU0RLIGNvbnRyb2xsZXIuICovCisgICAgYXN5bmNfc29ja2V0X3dyaXRlX2FicyhzZGtjdGwtPmFzLCAmcXVlcnktPmhlYWRlciwgcXVlcnktPmhlYWRlci5wYWNrZXQuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9zZGtjdGxfcXVlcnlfc2VuZF9pbywgcXVlcnksIHF1ZXJ5LT5kZWFkbGluZSk7CisKKyAgICBUKCJTREtDdGwgJXM6IFF1ZXJ5ICVwIElEICVkIHR5cGUgJWQgaXMgYmVpbmcgc2VudCB3aXRoIGRlYWRsaW5lIGF0ICVsbGQiLAorICAgICAgcXVlcnktPnNka2N0bC0+c2VydmljZV9uYW1lLCBxdWVyeSwgcXVlcnktPmhlYWRlci5xdWVyeV9pZCwKKyAgICAgIHF1ZXJ5LT5oZWFkZXIucXVlcnlfdHlwZSwgcXVlcnktPmRlYWRsaW5lKTsKK30KKworU0RLQ3RsUXVlcnkqCitzZGtjdGxfcXVlcnlfYnVpbGRfYW5kX3NlbmQoU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1ZXJ5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5fZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHJlc3BvbnNlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcmVzcG9uc2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9zZGtjdGxfcXVlcnlfY2IgcXVlcnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcXVlcnlfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0bykKK3sKKyAgICBTREtDdGxRdWVyeSogY29uc3QgcXVlcnkgPQorICAgICAgICBzZGtjdGxfcXVlcnlfbmV3X2V4KHNka2N0bCwgcXVlcnlfdHlwZSwgaW5fZGF0YV9zaXplLCBpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2J1ZmZlciwgcmVzcG9uc2Vfc2l6ZSwgcXVlcnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlfb3BhcXVlKTsKKyAgICBzZGtjdGxfcXVlcnlfc2VuZChxdWVyeSwgdG8pOworICAgIHJldHVybiBxdWVyeTsKK30KKworaW50CitzZGtjdGxfcXVlcnlfcmVmZXJlbmNlKFNES0N0bFF1ZXJ5KiBxdWVyeSkKK3sKKyAgICBhc3NlcnQocXVlcnktPnJlZl9jb3VudCA+IDApOworICAgIHF1ZXJ5LT5yZWZfY291bnQrKzsKKyAgICByZXR1cm4gcXVlcnktPnJlZl9jb3VudDsKK30KKworaW50CitzZGtjdGxfcXVlcnlfcmVsZWFzZShTREtDdGxRdWVyeSogcXVlcnkpCit7CisgICAgYXNzZXJ0KHF1ZXJ5LT5yZWZfY291bnQgPiAwKTsKKyAgICBxdWVyeS0+cmVmX2NvdW50LS07CisgICAgaWYgKHF1ZXJ5LT5yZWZfY291bnQgPT0gMCkgeworICAgICAgICAvKiBMYXN0IHJlZmVyZW5jZSBoYXMgYmVlbiBkcm9wcGVkLiBEZXN0cm95IHRoaXMgb2JqZWN0LiAqLworICAgICAgICBfc2RrY3RsX3F1ZXJ5X2ZyZWUocXVlcnkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHF1ZXJ5LT5yZWZfY291bnQ7Cit9CisKK3ZvaWQqCitzZGtjdGxfcXVlcnlfZ2V0X2J1ZmZlcl9pbihTREtDdGxRdWVyeSogcXVlcnkpCit7CisgICAgLyogUXVlcnkgYnVmZmVyIHN0YXJ0cyByaWdodCBhZnRlciB0aGUgaGVhZGVyLiAqLworICAgIHJldHVybiBxdWVyeSArIDE7Cit9CisKK3ZvaWQqCitzZGtjdGxfcXVlcnlfZ2V0X2J1ZmZlcl9vdXQoU0RLQ3RsUXVlcnkqIHF1ZXJ5KQoreworICAgIHJldHVybiBxdWVyeS0+cmVzcG9uc2VfYnVmZmVyICE9IE5VTEwgPyAqcXVlcnktPnJlc3BvbnNlX2J1ZmZlciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LT5pbnRlcm5hbF9yZXNwX2J1ZmZlcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxQYWNrZXQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCBmcm9tIFNESyBjb250cm9sbGVyLgorICogTm90ZSB0aGF0IHdlIGV4cGVjdCB0aGUgcGFja2V0IHRvIGJlIGEgbWVzc2FnZSwgc2luY2UgcXVlcmllcywgYW5kIHF1ZXJ5CisgKiByZXBsaWVzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuICovCitzdGF0aWMgdm9pZAorX29uX3Nka2N0bF9wYWNrZXRfcmVjZWl2ZWQoU0RLQ3RsU29ja2V0KiBzZGtjdGwsIFNES0N0bFBhY2tldCogcGFja2V0KQoreworICAgIFQoIlNES0N0bCAlczogUmVjZWl2ZWQgcGFja2V0IHNpemU6ICVkLCB0eXBlOiAlZCIsCisgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgcGFja2V0LT5oZWFkZXIuc2l6ZSwgcGFja2V0LT5oZWFkZXIudHlwZSk7CisKKyAgICBhc3NlcnQocGFja2V0LT5oZWFkZXIuc2lnbmF0dXJlID09IF9zZGtjdGxfcGFja2V0X3NpZyk7CisgICAgaWYgKHBhY2tldC0+aGVhZGVyLnR5cGUgPT0gU0RLQ1RMX1BBQ0tFVF9NRVNTQUdFKSB7CisgICAgICAgIFNES0N0bE1lc3NhZ2UqIGNvbnN0IG1zZyA9IChTREtDdGxNZXNzYWdlKilwYWNrZXQ7CisgICAgICAgIC8qIExldHMgc2VlIGlmIHRoaXMgaXMgYW4gaW50ZXJuYWwgcHJvdG9jb2wgbWVzc2FnZS4gKi8KKyAgICAgICAgc3dpdGNoIChtc2ctPm1zZ190eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNES0NUTF9NU0dfUE9SVF9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgc2RrY3RsLT5wb3J0X3N0YXR1cyA9IFNES0NUTF9QT1JUX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICBzZGtjdGwtPm9uX3BvcnRfY29ubmVjdGlvbihzZGtjdGwtPm9wYXF1ZSwgc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0NUTF9QT1JUX0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0RLQ1RMX01TR19QT1JUX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICBzZGtjdGwtPnBvcnRfc3RhdHVzID0gU0RLQ1RMX1BPUlRfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgICAgIHNka2N0bC0+b25fcG9ydF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ1RMX1BPUlRfRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTREtDVExfTVNHX1BPUlRfRU5BQkxFRDoKKyAgICAgICAgICAgICAgICBzZGtjdGwtPnBvcnRfc3RhdHVzID0gU0RLQ1RMX1BPUlRfRU5BQkxFRDsKKyAgICAgICAgICAgICAgICBzZGtjdGwtPm9uX3BvcnRfY29ubmVjdGlvbihzZGtjdGwtPm9wYXF1ZSwgc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0NUTF9QT1JUX0VOQUJMRUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNES0NUTF9NU0dfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgICAgICAgICBzZGtjdGwtPnBvcnRfc3RhdHVzID0gU0RLQ1RMX1BPUlRfRElTQUJMRUQ7CisgICAgICAgICAgICAgICAgc2RrY3RsLT5vbl9wb3J0X2Nvbm5lY3Rpb24oc2RrY3RsLT5vcGFxdWUsIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDVExfUE9SVF9ESVNBQkxFRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIGhpZ2hlci1sZXZlbCBtZXNzYWdlLiBEaXNwYXRjaCB0aGUgbWVzc2FnZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBjbGllbnQuICovCisgICAgICAgICAgICAgICAgc2RrY3RsLT5vbl9tZXNzYWdlKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIG1zZywgbXNnLT5tc2dfdHlwZSwgbXNnICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5oZWFkZXIuc2l6ZSAtIHNpemVvZihTREtDdGxNZXNzYWdlSGVhZGVyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBFKCJTREtDdGwgJXM6IFJlY2VpdmVkIHVua25vd24gcGFja2V0IHR5cGUgJWQgc2l6ZSAlZCIsCisgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBhY2tldC0+aGVhZGVyLnR5cGUsIHBhY2tldC0+aGVhZGVyLnNpemUpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREtDdGxJT0Rpc3BhdGNoZXIgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBbiBJL08gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGRhdGEgZ2V0cyByZWNlaXZlZCBmcm9tIHRoZSBzb2NrZXQuCisgKiBQYXJhbToKKyAqICBpb19vcGFxdWUgU0RLQ3RsSU9EaXNwYXRjaGVyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVhZGVyLgorICogIGFzaW8gLSBSZWFkIEkvTyBkZXNjcmlwdG9yLgorICogIHN0YXR1cyAtIEkvTyBzdGF0dXMuCisgKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uIF9vbl9zZGtjdGxfaW9fZGlzcGF0Y2hlcl9pbyh2b2lkKiBpb19vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogYXNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0lPU3RhdGUgc3RhdHVzKTsKKworLyogU3RhcnRzIEkvTyBkaXNwYXRjaGVyIGZvciBTREsgY29udHJvbGxlciBzb2NrZXQuICovCitzdGF0aWMgdm9pZAorX3Nka2N0bF9pb19kaXNwYXRjaGVyX3N0YXJ0KFNES0N0bFNvY2tldCogc2RrY3RsKSB7CisgICAgU0RLQ3RsSU9EaXNwYXRjaGVyKiBjb25zdCBkaXNwYXRjaGVyID0gJnNka2N0bC0+aW9fZGlzcGF0Y2hlcjsKKworICAgIGRpc3BhdGNoZXItPnN0YXRlICAgICAgICAgICA9IFNES0NUTF9JT0RJU1BfRVhQRUNUX0hFQURFUjsKKyAgICBkaXNwYXRjaGVyLT5zZGtjdGwgICAgICAgICAgPSBzZGtjdGw7CisgICAgZGlzcGF0Y2hlci0+cGFja2V0ICAgICAgICAgID0gTlVMTDsKKyAgICBkaXNwYXRjaGVyLT5jdXJyZW50X3F1ZXJ5ICAgPSBOVUxMOworCisgICAgLyogUmVnaXN0ZXIgYSBwYWNrZXQgaGVhZGVyIHJlYWRlciB3aXRoIHRoZSBzb2NrZXQuICovCisgICAgYXN5bmNfc29ja2V0X3JlYWRfcmVsKGRpc3BhdGNoZXItPnNka2N0bC0+YXMsICZkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoU0RLQ3RsUGFja2V0SGVhZGVyKSwgX29uX3Nka2N0bF9pb19kaXNwYXRjaGVyX2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLCAtMSk7Cit9CisKKy8qIFJlc2V0cyBJL08gZGlzcGF0Y2hlciBmb3IgU0RLIGNvbnRyb2xsZXIgc29ja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfaW9fZGlzcGF0Y2hlcl9yZXNldChTREtDdGxTb2NrZXQqIHNka2N0bCkgeworICAgIFNES0N0bElPRGlzcGF0Y2hlciogY29uc3QgZGlzcGF0Y2hlciA9ICZzZGtjdGwtPmlvX2Rpc3BhdGNoZXI7CisKKyAgICAvKiBDYW5jZWwgY3VycmVudCBxdWVyeS4gKi8KKyAgICBpZiAoZGlzcGF0Y2hlci0+Y3VycmVudF9xdWVyeSAhPSBOVUxMKSB7CisgICAgICAgIFNES0N0bFF1ZXJ5KiBjb25zdCBxdWVyeSA9IGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnk7CisgICAgICAgIGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnkgPSBOVUxMOworICAgICAgICBfb25fc2RrY3RsX3F1ZXJ5X2NhbmNlbGxlZChxdWVyeSk7CisgICAgICAgIHNka2N0bF9xdWVyeV9yZWxlYXNlKHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKiBGcmVlIHBhY2tldCBkYXRhIGJ1ZmZlci4gKi8KKyAgICBpZiAoZGlzcGF0Y2hlci0+cGFja2V0ICE9IE5VTEwpIHsKKyAgICAgICAgX3Nka2N0bF9wYWNrZXRfcmVsZWFzZShkaXNwYXRjaGVyLT5wYWNrZXQpOworICAgICAgICBkaXNwYXRjaGVyLT5wYWNrZXQgPSBOVUxMOworICAgIH0KKworICAgIC8qIFJlc2V0IGRpc3BhdGNoZXIgc3RhdGUuICovCisgICAgZGlzcGF0Y2hlci0+c3RhdGUgPSBTREtDVExfSU9ESVNQX0VYUEVDVF9IRUFERVI7CisKKyAgICBUKCJTREtDdGwgJXM6IEkvTyBEaXNwYXRjaGVyIGlzIHJlc2V0Iiwgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworfQorCisvKgorICogSS9PIGRpc3BhdGNoZXIgY2FsbGJhY2tzLgorICovCisKKy8qIEEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gYSBmYWlsdXJlIG9jY3VycmVkIHdoaWxlIGRpc3BhdGNoZXIgd2FzCisgKiByZWFkaW5nIGRhdGEgZnJvbSB0aGUgc29ja2V0LgorICovCitzdGF0aWMgdm9pZAorX29uX2lvX2Rpc3BhdGNoZXJfaW9fZmFpbHVyZShTREtDdGxJT0Rpc3BhdGNoZXIqIGRpc3BhdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgU0RLQ3RsU29ja2V0KiBjb25zdCBzZGtjdGwgPSBkaXNwYXRjaGVyLT5zZGtjdGw7CisKKyAgICBEKCJTREtDdGwgJXM6IERpc3BhdGNoZXIgSS9PIGZhaWx1cmU6ICVkIC0+ICVzIiwKKyAgICAgIHNka2N0bC0+c2VydmljZV9uYW1lLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIC8qIFdlIHRyZWF0IGFsbCBJL08gZmFpbHVyZXMgc2FtZSB3YXkgd2UgdHJlYXQgZGlzY29ubmVjdGlvbi4gSnVzdCBjYW5jZWwKKyAgICAgKiBldmVyeXRoaW5nLCBkaXNjb25uZWN0LCBhbmQgbGV0IHRoZSBjbGllbnQgdG8gZGVjaWRlIHdoYXQgdG8gZG8gbmV4dC4gKi8KKyAgICBzZGtjdGxfc29ja2V0X2Rpc2Nvbm5lY3Qoc2RrY3RsKTsKKworICAgIC8qIFJlcG9ydCBkaXNjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQsIGFuZCBsZXQgaXQgcmVzdG9yZSBjb25uZWN0aW9uIGluIHRoaXMKKyAgICAgKiBjYWxsYmFjay4gKi8KKyAgICBzZGtjdGwtPm9uX3NvY2tldF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIEFTSU9fU1RBVEVfRkFJTEVEKTsKK30KKworLyogQSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiBkaXNwYXRjaGVyJ3MgcmVhZGVyIGhhcyBiZWVuIGNhbmNlbGxlZC4gKi8KK3N0YXRpYyB2b2lkCitfb25faW9fZGlzcGF0Y2hlcl9pb19jYW5jZWxsZWQoU0RLQ3RsSU9EaXNwYXRjaGVyKiBkaXNwYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jU29ja2V0SU8qIGFzaW8pCit7CisgICAgVCgiU0RLQ3RsICVzOiBEaXNwYXRjaGVyIEkvTyBjYW5jZWxsZWQuIiwgZGlzcGF0Y2hlci0+c2RrY3RsLT5zZXJ2aWNlX25hbWUpOworCisgICAgLyogSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiByZWNlaXZpbmcgcXVlcnkgcmVwbHkgd2UgbmVlZCB0byBjYW5jZWwgdGhlCisgICAgICogcXVlcnkuICovCisgICAgaWYgKGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnkgIT0gTlVMTCkgeworICAgICAgICBTREtDdGxRdWVyeSogY29uc3QgcXVlcnkgPSBkaXNwYXRjaGVyLT5jdXJyZW50X3F1ZXJ5OworICAgICAgICBkaXNwYXRjaGVyLT5jdXJyZW50X3F1ZXJ5ID0gTlVMTDsKKyAgICAgICAgX29uX3Nka2N0bF9xdWVyeV9jYW5jZWxsZWQocXVlcnkpOworICAgICAgICBzZGtjdGxfcXVlcnlfcmVsZWFzZShxdWVyeSk7CisgICAgfQorCisgICAgLyogRGlzY2FyZCBwYWNrZXQgZGF0YSB3ZSd2ZSByZWNlaXZlZCBzbyBmYXIuICovCisgICAgaWYgKGRpc3BhdGNoZXItPnBhY2tldCAhPSBOVUxMKSB7CisgICAgICAgIF9zZGtjdGxfcGFja2V0X3JlbGVhc2UoZGlzcGF0Y2hlci0+cGFja2V0KTsKKyAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0ID0gTlVMTDsKKyAgICB9Cit9CisKKy8qIEEgZ2VuZXJpYyBwYWNrZXQgaGVhZGVyIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IEkvTyBkaXNwYXRjaGVyLiAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24KK19vbl9pb19kaXNwYXRjaGVyX3BhY2tldF9oZWFkZXIoU0RLQ3RsSU9EaXNwYXRjaGVyKiBkaXNwYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gZGlzcGF0Y2hlci0+c2RrY3RsOworCisgICAgVCgiU0RLQ3RsICVzOiBQYWNrZXQgaGVhZGVyIHR5cGUgJWQsIHNpemUgJWQgaXMgcmVjZWl2ZWQuIiwKKyAgICAgIGRpc3BhdGNoZXItPnNka2N0bC0+c2VydmljZV9uYW1lLCBkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLnR5cGUsCisgICAgICBkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLnNpemUpOworCisgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBwYWNrZXQgaGVhZGVyLiAqLworICAgIGlmIChkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLnNpZ25hdHVyZSAhPSBfc2RrY3RsX3BhY2tldF9zaWcpIHsKKyAgICAgICAgRSgiU0RLQ3RsICVzOiBJbnZhbGlkIHBhY2tldCBzaWduYXR1cmUgJXggZm9yIHBhY2tldCB0eXBlICVkLCBzaXplICVkIiwKKyAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci5zaWduYXR1cmUsCisgICAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci50eXBlLCBkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLnNpemUpOworICAgICAgICAvKiBUaGlzIGlzIGEgcHJvdG9jb2wgZmFpbHVyZS4gVHJlYXQgaXQgYXMgSS9PIGZhaWx1cmU6IGRpc2Nvbm5lY3QsIGFuZAorICAgICAgICAgKiBsZXQgdGhlIGNsaWVudCB0byBkZWNpZGUgd2hhdCB0byBkbyBuZXh0LiAqLworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgX29uX2lvX2Rpc3BhdGNoZXJfaW9fZmFpbHVyZShkaXNwYXRjaGVyLCBhc2lvKTsKKyAgICAgICAgcmV0dXJuIEFTSU9fQUNUSU9OX0RPTkU7CisgICAgfQorCisgICAgLyogSGVyZSB3ZSBoYXZlIHRocmVlIGNob2ljZXMgZm9yIHRoZSBwYWNrZXQsIHRoYXQgZGVmaW5lIHRoZSByZXN0IG9mCisgICAgICogdGhlIGRhdGEgdGhhdCBmb2xsb3cgaXQ6CisgICAgICogLSBSZWd1bGFyIHBhY2tldCwKKyAgICAgKiAtIFJlc3BvbnNlIHRvIGEgcXVlcnkgdGhhdCBoYXMgYmVlbiBzZW50IHRvIFNESyBjb250cm9sbGVyLAorICAgICAqIC0gQSBxdWVyeSBmcm9tIFNESyBjb250cm9sbGVyLgorICAgICAqIFVwZGF0ZSB0aGUgc3RhdGUgYWNjb3JkaW5nbHksIGFuZCBpbml0aWF0ZSByZWFkaW5nIG9mIHRoZQorICAgICAqIHJlbWFpbmluZyBvZiB0aGUgcGFja2V0LgorICAgICAqLworICAgICBpZiAoZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci50eXBlID09IFNES0NUTF9QQUNLRVRfUVVFUllfUkVTUE9OU0UpIHsKKyAgICAgICAgLyogVGhpcyBpcyBhIHJlc3BvbnNlIHRvIHRoZSBxdWVyeS4gQmVmb3JlIHJlY2VpdmluZyByZXNwb25zZSBkYXRhIHdlCisgICAgICAgICAqIG5lZWQgdG8gbG9jYXRlIHRoZSByZWxldmFudCBxdWVyeSwgYW5kIHVzZSBpdHMgcmVzcG9uc2UgYnVmZmVyIHRvIHJlYWQKKyAgICAgICAgICogdGhlIGRhdGEuIEZvciB0aGF0IHdlIG5lZWQgdG8gb2J0YWluIHF1ZXJ5IElEIGZpcnRzLiBTbywgaW5pdGlhdGUKKyAgICAgICAgICogcmVhZGluZyBvZiB0aGUgcmVtYWluaW5nIHBhcnQgb2YgU0RLQ3RsUXVlcnlSZXBseUhlYWRlci4gKi8KKyAgICAgICAgZGlzcGF0Y2hlci0+c3RhdGUgPSBTREtDVExfSU9ESVNQX0VYUEVDVF9RVUVSWV9SRVBMWV9IRUFERVI7CisgICAgICAgIGFzeW5jX3NvY2tldF9yZWFkX3JlbChzZGtjdGwtPmFzLCAmZGlzcGF0Y2hlci0+cXVlcnlfcmVwbHlfaGVhZGVyLnF1ZXJ5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNES0N0bFF1ZXJ5UmVwbHlIZWFkZXIpIC0gc2l6ZW9mKFNES0N0bFBhY2tldEhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9zZGtjdGxfaW9fZGlzcGF0Y2hlcl9pbywgZGlzcGF0Y2hlciwgLTEpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEZvciByZWd1bGFyIHBhY2tldHMsIGFzIHdlbGwgYXMgcXVlcmllcywgd2Ugc2ltcGx5IGFsbG9jYXRlIGJ1ZmZlciwKKyAgICAgICAgICogdGhhdCBmaXRzIHRoZSBlbnRpcmUgcGFja2V0LCBhbmQgcmVhZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBkYXRhIGluCisgICAgICAgICAqIHRoZXJlLiAqLworICAgICAgICBkaXNwYXRjaGVyLT5zdGF0ZSA9IFNES0NUTF9JT0RJU1BfRVhQRUNUX0RBVEE7CisgICAgICAgIGRpc3BhdGNoZXItPnBhY2tldCA9CisgICAgICAgICAgICBfc2RrY3RsX3BhY2tldF9uZXcoc2RrY3RsLCBkaXNwYXRjaGVyLT5wYWNrZXRfaGVhZGVyLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci50eXBlKTsKKyAgICAgICAgLyogSW5pdGlhdGUgcmVhZGluZyBvZiB0aGUgcGFja2V0IGRhdGEuICovCisgICAgICAgIGFzeW5jX3NvY2tldF9yZWFkX3JlbChzZGtjdGwtPmFzLCBkaXNwYXRjaGVyLT5wYWNrZXQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci5zaXplIC0gc2l6ZW9mKFNES0N0bFBhY2tldEhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fc2RrY3RsX2lvX2Rpc3BhdGNoZXJfaW8sIGRpc3BhdGNoZXIsIC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gQVNJT19BQ1RJT05fRE9ORTsKK30KKworLyogQSBnZW5lcmljIHBhY2tldCBoYXMgYmVlbiByZWNlaXZlZCBieSBJL08gZGlzcGF0Y2hlci4gKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25faW9fZGlzcGF0Y2hlcl9wYWNrZXQoU0RLQ3RsSU9EaXNwYXRjaGVyKiBkaXNwYXRjaGVyLCBBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gZGlzcGF0Y2hlci0+c2RrY3RsOworICAgIFNES0N0bFBhY2tldCogY29uc3QgcGFja2V0ID0gZGlzcGF0Y2hlci0+cGFja2V0OworICAgIGRpc3BhdGNoZXItPnBhY2tldCA9IE5VTEw7CisKKyAgICBUKCJTREtDdGwgJXM6IFBhY2tldCB0eXBlICVkLCBzaXplICVkIGlzIHJlY2VpdmVkLiIsCisgICAgICBkaXNwYXRjaGVyLT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci50eXBlLAorICAgICAgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci5zaXplKTsKKworICAgIF9vbl9zZGtjdGxfcGFja2V0X3JlY2VpdmVkKHNka2N0bCwgcGFja2V0KTsKKyAgICBfc2RrY3RsX3BhY2tldF9yZWxlYXNlKHBhY2tldCk7CisKKyAgICAvKiBHZXQgcmVhZHkgZm9yIHRoZSBuZXh0IEkvTyBjeWNsZS4gKi8KKyAgICBkaXNwYXRjaGVyLT5zdGF0ZSA9IFNES0NUTF9JT0RJU1BfRVhQRUNUX0hFQURFUjsKKyAgICBhc3luY19zb2NrZXRfcmVhZF9yZWwoc2RrY3RsLT5hcywgJmRpc3BhdGNoZXItPnBhY2tldF9oZWFkZXIsIHNpemVvZihTREtDdGxQYWNrZXRIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fc2RrY3RsX2lvX2Rpc3BhdGNoZXJfaW8sIGRpc3BhdGNoZXIsIC0xKTsKKyAgICByZXR1cm4gQVNJT19BQ1RJT05fRE9ORTsKK30KKworLyogQSBxdWVyeSByZXBseSBoZWFkZXIgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgSS9PIGRpc3BhdGNoZXIuICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX2lvX2Rpc3BhdGNoZXJfcXVlcnlfcmVwbHlfaGVhZGVyKFNES0N0bElPRGlzcGF0Y2hlciogZGlzcGF0Y2hlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gZGlzcGF0Y2hlci0+c2RrY3RsOworICAgIFNES0N0bFF1ZXJ5KiBxdWVyeTsKKworICAgIFQoIlNES0N0bCAlczogUXVlcnkgcmVwbHkgaGVhZGVyIGlzIHJlY2VpdmVkIGZvciBxdWVyeSBJRCAlZCIsCisgICAgICBkaXNwYXRjaGVyLT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgZGlzcGF0Y2hlci0+cXVlcnlfcmVwbHlfaGVhZGVyLnF1ZXJ5X2lkKTsKKworICAgIC8qIFB1bGwgdGhlIHF1ZXJ5IG91dCBvZiB0aGUgbGlzdCBvZiBhY3RpdmUgcXVlcmllcy4gSXQncyB0aGUgZGlzcGF0Y2hlciB0aGF0CisgICAgICogb3ducyB0aGlzIHF1ZXJ5IG5vdy4gKi8KKyAgICBkaXNwYXRjaGVyLT5jdXJyZW50X3F1ZXJ5ID0KKyAgICAgICAgX3Nka2N0bF9zb2NrZXRfcmVtb3ZlX3F1ZXJ5X2lkKHNka2N0bCwgZGlzcGF0Y2hlci0+cXVlcnlfcmVwbHlfaGVhZGVyLnF1ZXJ5X2lkKTsKKyAgICBxdWVyeSA9IGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnk7CisgICAgY29uc3QgdWludDMyX3QgcXVlcnlfZGF0YV9zaXplID0KKyAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci5zaXplIC0gc2l6ZW9mKFNES0N0bFF1ZXJ5UmVwbHlIZWFkZXIpOworICAgIGRpc3BhdGNoZXItPnN0YXRlID0gU0RLQ1RMX0lPRElTUF9FWFBFQ1RfUVVFUllfUkVQTFlfREFUQTsKKworICAgIGlmIChxdWVyeSA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBRdWVyeSAjJWQgaXMgbm90IGZvdW5kIGJ5IGRpc3BhdGNoZXIiLAorICAgICAgICAgIGRpc3BhdGNoZXItPnNka2N0bC0+c2VydmljZV9uYW1lLCBkaXNwYXRjaGVyLT5xdWVyeV9yZXBseV9oZWFkZXIucXVlcnlfaWQpOworCisgICAgICAgIC8qIFF1ZXJ5IGlzIG5vdCBmb3VuZC4gSnVzdCByZWFkIHRoZSByZW1haW5kZXIgb2YgcmVwbHkgdXAgaW4gdGhlIGFpciwKKyAgICAgICAgICogYW5kIHRoZW4gZGlzY2FyZCB3aGVuIGl0J3Mgb3Zlci4gKi8KKyAgICAgICAgZGlzcGF0Y2hlci0+c3RhdGUgPSBTREtDVExfSU9ESVNQX0VYUEVDVF9RVUVSWV9SRVBMWV9EQVRBOworICAgICAgICBkaXNwYXRjaGVyLT5wYWNrZXQgPQorICAgICAgICAgICAgX3Nka2N0bF9wYWNrZXRfbmV3KHNka2N0bCwgZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlci5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXItPnBhY2tldF9oZWFkZXIudHlwZSk7CisgICAgICAgIC8qIENvcHkgcXVlcnkgcmVwbHkgaW5mbyB0byB0aGUgcGFja2V0LiAqLworICAgICAgICBtZW1jcHkoJmRpc3BhdGNoZXItPnBhY2tldC0+aGVhZGVyLCAmZGlzcGF0Y2hlci0+cXVlcnlfcmVwbHlfaGVhZGVyLAorICAgICAgICAgICAgICAgc2l6ZW9mKFNES0N0bFF1ZXJ5UmVwbHlIZWFkZXIpKTsKKyAgICAgICAgYXN5bmNfc29ja2V0X3JlYWRfcmVsKHNka2N0bC0+YXMsIGRpc3BhdGNoZXItPnBhY2tldCArIDEsIHF1ZXJ5X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uX3Nka2N0bF9pb19kaXNwYXRjaGVyX2lvLCBkaXNwYXRjaGVyLCAtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUHJlcGFyZSB0byByZWNlaXZlIHF1ZXJ5IHJlcGx5LiBGb3IgdGhlIHNpbXBsaWNpdHkgc2FrZSwgY2FuY2VsIHF1ZXJ5CisgICAgICAgICAqIHRpbWUgb3V0LCBzbyBpdCBkb2Vzbid0IGV4cGlyZSBvbiB1cyB3aGlsZSB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mCisgICAgICAgICAqIHJlY2VpdmluZyBxdWVyeSdzIHJlcGx5LiAqLworICAgICAgICBfc2RrY3RsX3F1ZXJ5X2NhbmNlbF90aW1lb3V0KHF1ZXJ5KTsKKworICAgICAgICBpZiAoKnF1ZXJ5LT5yZXNwb25zZV9zaXplIDwgcXVlcnlfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAqcXVlcnktPnJlc3BvbnNlX2J1ZmZlciA9IG1hbGxvYyhxdWVyeV9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKCpxdWVyeS0+cmVzcG9uc2VfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBUEFOSUMoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHF1ZXJ5IHJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHF1ZXJ5X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogU2F2ZSB0aGUgYWN0dWFsIHF1ZXJ5IHJlc3BvbnNlIHNpemUuICovCisgICAgICAgICpxdWVyeS0+cmVzcG9uc2Vfc2l6ZSA9IHF1ZXJ5X2RhdGFfc2l6ZTsKKworICAgICAgICAvKiBTdGFydCByZWFkaW5nIHF1ZXJ5IHJlc3BvbnNlLiAqLworICAgICAgICBhc3luY19zb2NrZXRfcmVhZF9yZWwoc2RrY3RsLT5hcywgKnF1ZXJ5LT5yZXNwb25zZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcXVlcnktPnJlc3BvbnNlX3NpemUsIF9vbl9zZGtjdGxfaW9fZGlzcGF0Y2hlcl9pbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIsIC0xKTsKKyAgICB9CisKKyAgICByZXR1cm4gQVNJT19BQ1RJT05fRE9ORTsKK30KKworLyogQSBxdWVyeSByZXBseSBoZWFkZXIgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgSS9PIGRpc3BhdGNoZXIuICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX2lvX2Rpc3BhdGNoZXJfcXVlcnlfcmVwbHkoU0RLQ3RsSU9EaXNwYXRjaGVyKiBkaXNwYXRjaGVyLCBBc3luY1NvY2tldElPKiBhc2lvKQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gZGlzcGF0Y2hlci0+c2RrY3RsOworICAgIFNES0N0bFF1ZXJ5KiBjb25zdCBxdWVyeSA9IGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnk7CisgICAgZGlzcGF0Y2hlci0+Y3VycmVudF9xdWVyeSA9IE5VTEw7CisKKyAgICBpZiAocXVlcnkgIT0gTlVMTCkgeworICAgICAgICBfQU5EUk9JRF9BU1NFUlQocXVlcnktPmhlYWRlci5xdWVyeV9pZCA9PSBkaXNwYXRjaGVyLT5xdWVyeV9yZXBseV9oZWFkZXIucXVlcnlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAiU0RLQ3RsICVzOiBRdWVyeSBJRCBtaXNtYXRjaCBpbiBJL08gZGlzcGF0Y2hlciIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisgICAgICAgIFQoIlNES0N0bCAlczogUXVlcnkgcmVwbHkgaXMgcmVjZWl2ZWQgZm9yIHF1ZXJ5ICVwIElEICVkLiBSZXBseSBzaXplIGlzICVkIiwKKyAgICAgICAgICBkaXNwYXRjaGVyLT5zZGtjdGwtPnNlcnZpY2VfbmFtZSwgcXVlcnksIHF1ZXJ5LT5oZWFkZXIucXVlcnlfaWQsCisgICAgICAgICAgKnF1ZXJ5LT5yZXNwb25zZV9zaXplKTsKKworICAgICAgICAvKiBDb21wbGV0ZSB0aGUgcXVlcnksIGFuZCByZWxlYXNlIGl0IGZyb20gdGhlIGRpc3BhdGNoZXIuICovCisgICAgICAgIF9vbl9zZGtjdGxfcXVlcnlfY29tcGxldGVkKHF1ZXJ5KTsKKyAgICAgICAgc2RrY3RsX3F1ZXJ5X3JlbGVhc2UocXVlcnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgd2FzICJyZWFkIHVwIGluIHRoZSBhaXIiIGZvciBhIGNhbmNlbGxlZCBxdWVyeS4gSnVzdCBkaXNjYXJkIHRoZQorICAgICAgICAgKiByZWFkIGRhdGEuICovCisgICAgICAgIGlmIChkaXNwYXRjaGVyLT5wYWNrZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgX3Nka2N0bF9wYWNrZXRfcmVsZWFzZShkaXNwYXRjaGVyLT5wYWNrZXQpOworICAgICAgICAgICAgZGlzcGF0Y2hlci0+cGFja2V0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdldCByZWFkeSBmb3IgdGhlIG5leHQgSS9PIGN5Y2xlLiAqLworICAgIGRpc3BhdGNoZXItPnN0YXRlID0gU0RLQ1RMX0lPRElTUF9FWFBFQ1RfSEVBREVSOworICAgIGFzeW5jX3NvY2tldF9yZWFkX3JlbChzZGtjdGwtPmFzLCAmZGlzcGF0Y2hlci0+cGFja2V0X2hlYWRlciwgc2l6ZW9mKFNES0N0bFBhY2tldEhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9zZGtjdGxfaW9fZGlzcGF0Y2hlcl9pbywgZGlzcGF0Y2hlciwgLTEpOworICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCisvKiBBbiBJL08gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGRhdGEgZ2V0cyByZWNlaXZlZCBmcm9tIHRoZSBzb2NrZXQuCisgKiBUaGlzIGlzIG1haW4gSS9PIGRpc3BhdGNoZXIgbG9vcC4KKyAqIFBhcmFtOgorICogIGlvX29wYXF1ZSBTREtDdGxJT0Rpc3BhdGNoZXIgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkZXIuCisgKiAgYXNpbyAtIFJlYWQgSS9PIGRlc2NyaXB0b3IuCisgKiAgc3RhdHVzIC0gSS9PIHN0YXR1cy4KKyAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24KK19vbl9zZGtjdGxfaW9fZGlzcGF0Y2hlcl9pbyh2b2lkKiBpb19vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNTb2NrZXRJTyogYXNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0lPU3RhdGUgc3RhdHVzKQoreworICAgIEFzeW5jSU9BY3Rpb24gYWN0aW9uID0gQVNJT19BQ1RJT05fRE9ORTsKKyAgICBTREtDdGxJT0Rpc3BhdGNoZXIqIGNvbnN0IGRpc3BhdGNoZXIgPSAoU0RLQ3RsSU9EaXNwYXRjaGVyKilpb19vcGFxdWU7CisgICAgU0RLQ3RsU29ja2V0KiBjb25zdCBzZGtjdGwgPSBkaXNwYXRjaGVyLT5zZGtjdGw7CisKKyAgICAvKiBSZWZlcmVuY2UgU0RLQ3RsU29ja2V0IHdoaWxlIHdlJ3JlIGluIHRoaXMgY2FsbGJhY2suICovCisgICAgc2RrY3RsX3NvY2tldF9yZWZlcmVuY2Uoc2RrY3RsKTsKKworICAgIGlmIChzdGF0dXMgIT0gQVNJT19TVEFURV9TVUNDRUVERUQpIHsKKyAgICAgICAgLyogU29tZXRoaW5nIGdvaW5nIG9uIHdpdGggSS9PIG90aGVyIHRoYW4gcmVjZWl2aW5nIGRhdGEuLiAqLworICAgICAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICAgICAgY2FzZSBBU0lPX1NUQVRFX1NUQVJURUQ6CisgICAgICAgICAgICAgICAgLyogRGF0YSBoYXMgc3RhcnRlZCBmbG93aW5nIGluLiBDYW5jZWwgdGltZW91dCBvbiBJL08gdGhhdCBoYXMKKyAgICAgICAgICAgICAgICAgKiBzdGFydGVkLCBzbyB3ZSBjYW4gY29tcGxldGUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgICAgICAgICAgICAgICAgICogZGlzcGF0Y2hlciB3aXRob3V0IGludGVycnVwdGlvbnMgb3RoZXIgdGhhbiBJL08gZmFpbHVyZXMuICovCisgICAgICAgICAgICAgICAgYXN5bmNfc29ja2V0X2lvX2NhbmNlbF90aW1lX291dChhc2lvKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBU0lPX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAvKiBJL08gZmFpbHVyZSBoYXMgb2NjdXJyZWQuIEhhbmRsZSB0aGUgZmFpbHVyZS4gKi8KKyAgICAgICAgICAgICAgICBfb25faW9fZGlzcGF0Y2hlcl9pb19mYWlsdXJlKGRpc3BhdGNoZXIsIGFzaW8pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFTSU9fU1RBVEVfVElNRURfT1VUOgorICAgICAgICAgICAgICAgICAvKiBUaGUgd2F5IEkvTyBkaXNwYXRjaGVyIGlzIGltcGxlbWVudGVkLCB0aGlzIHNob3VsZCBuZXZlcgorICAgICAgICAgICAgICAgICAgKiBoYXBwZW4sIGJlY2F1c2UgZGlzcGF0Y2hlciBkb2Vzbid0IHNldCBJL08gZXhwaXJhdGlvbiB0aW1lCisgICAgICAgICAgICAgICAgICAqIHdoZW4gcmVnaXN0ZXJpbmcgaXRzIHJlYWRlcnMuICovCisgICAgICAgICAgICAgICAgX0FORFJPSURfQVNTRVJUKDAsCisgICAgICAgICAgICAgICAgICAgICJTREtDdGwgJXM6IFdlIHNob3VsZCBuZXZlciByZWNlaXZlIEFTSU9fU1RBVEVfVElNRURfT1VUIGluIFNES0N0bCBJL08gZGlzcGF0Y2hlci4iLAorICAgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVNJT19TVEFURV9DQU5DRUxMRUQ6CisgICAgICAgICAgICAgICAgLyogQ2FuY2VsbGF0aW9uIG1lYW5zIHRoYXQgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBoYW5kbGluZworICAgICAgICAgICAgICAgICAqIGRpc2Nvbm5lY3Rpb24uIFNvb25lciBvciBsYXRlciwgdGhpcyBkaXNwYXRjaGVyIHdpbGwgYmUgcmVzZXQsCisgICAgICAgICAgICAgICAgICogc28gd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQga2VlcGluZyBpdHMgc3RhdGUgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBfb25faW9fZGlzcGF0Y2hlcl9pb19jYW5jZWxsZWQoZGlzcGF0Y2hlciwgYXNpbyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQVNJT19TVEFURV9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBfQU5EUk9JRF9BU1NFUlQoMCwgIlNES0N0bCAlczogVW5leHBlY3RlZCBJL08gc3RhdHVzICVkIGluIHRoZSBkaXNwYXRjaGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgLyogSGFuZGxlIHRoaXMgYXMgcHJvdG9jb2wgZmFpbHVyZS4gKi8KKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgICAgICBfb25faW9fZGlzcGF0Y2hlcl9pb19mYWlsdXJlKGRpc3BhdGNoZXIsIGFzaW8pOworICAgICAgICAgICAgICAgIGFjdGlvbiA9IEFTSU9fQUNUSU9OX0FCT1JUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2RrY3RsX3NvY2tldF9yZWxlYXNlKHNka2N0bCk7CisKKyAgICAgICAgcmV0dXJuIGFjdGlvbjsKKyAgICB9CisKKyAgICAvKiBSZXF1ZXN0ZWQgZGF0YSBoYXMgYmVlbiByZWFkLiBIYW5kbGUgdGhlIGNodW5rIGRlcGVuZGluZyBvbiBkaXNwYXRjaGVyJ3MKKyAgICAgKiBzdGF0ZS4gKi8KKyAgICBzd2l0Y2ggKGRpc3BhdGNoZXItPnN0YXRlKSB7CisgICAgICAgIGNhc2UgU0RLQ1RMX0lPRElTUF9FWFBFQ1RfSEVBREVSOgorICAgICAgICAgICAgLyogQSBnZW5lcmljIHBhY2tldCBoZWFkZXIgaXMgcmVjZWl2ZWQuICovCisgICAgICAgICAgICBhY3Rpb24gPSBfb25faW9fZGlzcGF0Y2hlcl9wYWNrZXRfaGVhZGVyKGRpc3BhdGNoZXIsIGFzaW8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSU9ESVNQX0VYUEVDVF9RVUVSWV9SRVBMWV9IRUFERVI6CisgICAgICAgICAgICAvKiBRdWVyeSByZXBseSBoZWFkZXIgaXMgcmVjZWl2ZWQuICovCisgICAgICAgICAgICBhY3Rpb24gPSBfb25faW9fZGlzcGF0Y2hlcl9xdWVyeV9yZXBseV9oZWFkZXIoZGlzcGF0Y2hlciwgYXNpbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9JT0RJU1BfRVhQRUNUX1FVRVJZX1JFUExZX0RBVEE6CisgICAgICAgICAgICAvKiBRdWVyeSByZXBseSBpcyByZWNlaXZlZC4gQ29tcGxldGUgdGhlIHF1ZXJ5LiAqLworICAgICAgICAgICAgYWN0aW9uID0gX29uX2lvX2Rpc3BhdGNoZXJfcXVlcnlfcmVwbHkoZGlzcGF0Y2hlciwgYXNpbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9JT0RJU1BfRVhQRUNUX0RBVEE6CisgICAgICAgICAgICAvKiBBIGdlbmVyaWMgcGFja2V0IGlzIHJlY2VpdmVkLiAqLworICAgICAgICAgICAgYWN0aW9uID0gX29uX2lvX2Rpc3BhdGNoZXJfcGFja2V0KGRpc3BhdGNoZXIsIGFzaW8pOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIF9BTkRST0lEX0FTU0VSVCgwLCAiU0RLQ3RsICVzOiBVbmV4cGVjdGVkIEkvTyBkaXNwYWNoZXIgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNka2N0bC0+c2VydmljZV9uYW1lLCBkaXNwYXRjaGVyLT5zdGF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzZGtjdGxfc29ja2V0X3JlbGVhc2Uoc2RrY3RsKTsKKworICAgIHJldHVybiBhY3Rpb247Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgIFNES0N0bFNvY2tldCBpbnRlcm5hbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2FuY2VscyBhbGwgcXVlcmllcyB0aGF0IGlzIGFjdGl2ZSBvbiB0aGlzIHNvY2tldC4gKi8KK3N0YXRpYyB2b2lkCitfc2RrY3RsX3NvY2tldF9jYW5jZWxfYWxsX3F1ZXJpZXMoU0RLQ3RsU29ja2V0KiBzZGtjdGwpCit7CisgICAgU0RLQ3RsSU9EaXNwYXRjaGVyKiBjb25zdCBkaXNwYXRjaGVyID0gJnNka2N0bC0+aW9fZGlzcGF0Y2hlcjsKKyAgICBTREtDdGxRdWVyeSogcXVlcnk7CisKKyAgICAvKiBDYW5jZWwgcXVlcnkgdGhhdCBpcyBiZWluZyBjb21wbGV0ZWQgaW4gZGlzcGF0Y2hlci4gKi8KKyAgICBpZiAoZGlzcGF0Y2hlci0+Y3VycmVudF9xdWVyeSAhPSBOVUxMKSB7CisgICAgICAgIFNES0N0bFF1ZXJ5KiBjb25zdCBxdWVyeSA9IGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnk7CisgICAgICAgIGRpc3BhdGNoZXItPmN1cnJlbnRfcXVlcnkgPSBOVUxMOworICAgICAgICBfb25fc2RrY3RsX3F1ZXJ5X2NhbmNlbGxlZChxdWVyeSk7CisgICAgICAgIHNka2N0bF9xdWVyeV9yZWxlYXNlKHF1ZXJ5KTsKKyAgICB9CisKKyAgICAvKiBPbmUgYnkgb25lIGVtcHR5IHF1ZXJ5IGxpc3QgY2FuY2VsbGluZyBwdWxsZWQgcXVlcmllcy4gKi8KKyAgICBxdWVyeSA9IF9zZGtjdGxfc29ja2V0X3B1bGxfZmlyc3RfcXVlcnkoc2RrY3RsKTsKKyAgICB3aGlsZSAocXVlcnkgIT0gTlVMTCkgeworICAgICAgICBfc2RrY3RsX3F1ZXJ5X2NhbmNlbF90aW1lb3V0KHF1ZXJ5KTsKKyAgICAgICAgcXVlcnktPnF1ZXJ5X2NiKHF1ZXJ5LT5xdWVyeV9vcGFxdWUsIHF1ZXJ5LCBBU0lPX1NUQVRFX0NBTkNFTExFRCk7CisgICAgICAgIHNka2N0bF9xdWVyeV9yZWxlYXNlKHF1ZXJ5KTsKKyAgICAgICAgcXVlcnkgPSBfc2RrY3RsX3NvY2tldF9wdWxsX2ZpcnN0X3F1ZXJ5KHNka2N0bCk7CisgICAgfQorfQorCisvKiBDYW5jZWxzIGFsbCBwYWNrZXRzIHRoYXQgaXMgYWN0aXZlIG9uIHRoaXMgc29ja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfc29ja2V0X2NhbmNlbF9hbGxfcGFja2V0cyhTREtDdGxTb2NrZXQqIHNka2N0bCkKK3sKK30KKworLyogQ2FuY2VscyBhbGwgSS9PIHRoYXQgaXMgYWN0aXZlIG9uIHRoaXMgc29ja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfc29ja2V0X2NhbmNlbF9hbGxfaW8oU0RLQ3RsU29ja2V0KiBzZGtjdGwpCit7CisgICAgLyogQ2FuY2VsIGFsbCBxdWVyaWVzLCBhbmQgcGFja2V0cyB0aGF0IGFyZSBhY3RpdmUgZm9yIHRoaXMgSS9PLiAqLworICAgIF9zZGtjdGxfc29ja2V0X2NhbmNlbF9hbGxfcXVlcmllcyhzZGtjdGwpOworICAgIF9zZGtjdGxfc29ja2V0X2NhbmNlbF9hbGxfcGFja2V0cyhzZGtjdGwpOworfQorCisvKiBEaXNjb25uZWN0cyBBc3luY1NvY2tldCBmb3IgU0RLQ3RsU29ja2V0LiAqLworc3RhdGljIHZvaWQKK19zZGtjdGxfc29ja2V0X2Rpc2Nvbm5lY3Rfc29ja2V0KFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIGlmIChzZGtjdGwtPmFzICE9IE5VTEwpIHsKKyAgICAgICAgLyogRGlzY29ubmVjdCB0aGUgc29ja2V0LiBUaGlzIHdpbGwgdHJpZ2dlciBJL08gY2FuY2VsbGF0aW9uIGNhbGxiYWNrcy4gKi8KKyAgICAgICAgYXN5bmNfc29ja2V0X2Rpc2Nvbm5lY3Qoc2RrY3RsLT5hcyk7CisKKyAgICAgICAgLyogQ2FuY2VsIGFsbCBJL08gdGhhdCBpcyBhY3RpdmUgb24gdGhpcyBzb2NrZXQuICovCisgICAgICAgIF9zZGtjdGxfc29ja2V0X2NhbmNlbF9hbGxfaW8oc2RrY3RsKTsKKworICAgICAgICAvKiBSZXNldCBJL08gZGlzcGF0Y2hlci4gKi8KKyAgICAgICAgX3Nka2N0bF9pb19kaXNwYXRjaGVyX3Jlc2V0KHNka2N0bCk7CisgICAgfQorCisgICAgc2RrY3RsLT5zdGF0ZSA9IFNES0NUTF9TT0NLRVRfRElTQ09OTkVDVEVEOworICAgIHNka2N0bC0+cG9ydF9zdGF0dXMgPSBTREtDVExfUE9SVF9ESVNDT05ORUNURUQ7Cit9CisKKy8qIEZyZWVzIFNES0N0bFNvY2tldCBpbnN0YW5jZS4gKi8KK3N0YXRpYyB2b2lkCitfc2RrY3RsX3NvY2tldF9mcmVlKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIGlmIChzZGtjdGwgIT0gTlVMTCkgeworICAgICAgICBUKCJTREtDdGwgJXM6IGRlc2NyaXB0b3IgaXMgZGVzdHJvaW5nLiIsIHNka2N0bC0+c2VydmljZV9uYW1lKTsKKworICAgICAgICAvKiBEaXNjb25uZWN0LCBhbmQgcmVsZWFzZSB0aGUgc29ja2V0LiAqLworICAgICAgICBpZiAoc2RrY3RsLT5hcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhc3luY19zb2NrZXRfZGlzY29ubmVjdChzZGtjdGwtPmFzKTsKKyAgICAgICAgICAgIGFzeW5jX3NvY2tldF9yZWxlYXNlKHNka2N0bC0+YXMpOworICAgICAgICB9CisKKyAgICAgICAgLyogRnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLiAqLworICAgICAgICBzZGtjdGwtPmxvb3BlciA9IE5VTEw7CisgICAgICAgIGlmIChzZGtjdGwtPnNlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHNka2N0bC0+c2VydmljZV9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBfc2RrY3RsX3NvY2tldF9lbXB0eV9yZWN5Y2xlcihzZGtjdGwpOworCisgICAgICAgIEFGUkVFKHNka2N0bCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICBTREsgQ29udHJvbCBTb2NrZXQgY29ubmVjdGlvbiBjYWxsYmFja3MuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhdGVzIGhhbmRzaGFrZSBxdWVyeSB3aGVuIFNESyBjb250cm9sbGVyIHNvY2tldCBpcyBjb25uZWN0ZWQuICovCitzdGF0aWMgdm9pZCBfc2RrY3RsX2RvX2hhbmRzaGFrZShTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIEEgc29ja2V0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuCisgKiBIZXJlIHdlIHdpbGwgc3RhcnQgSS9PIGRpc3BhdGNoZXIsIGFuZCB3aWxsIGluaXRpYXRlIGEgaGFuZHNoYWtlIHdpdGgKKyAqIHRoZSBTZGtDb250cm9sbGVyIHNlcnZpY2UgZm9yIHRoaXMgc29ja2V0LiAqLworc3RhdGljIEFzeW5jSU9BY3Rpb24KK19vbl9hc3luY19zb2NrZXRfY29ubmVjdGVkKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIEQoIlNES0N0bCAlczogU29ja2V0IGlzIGNvbm5lY3RlZC4iLCBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisKKyAgICAvKiBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuICovCisgICAgY29uc3QgQXN5bmNJT0FjdGlvbiBhY3Rpb24gPQorICAgICAgICBzZGtjdGwtPm9uX3NvY2tldF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIEFTSU9fU1RBVEVfU1VDQ0VFREVEKTsKKworICAgIGlmIChhY3Rpb24gPT0gQVNJT19BQ1RJT05fRE9ORSkgeworICAgICAgICAvKiBJbml0aWFsaXplLCBhbmQgc3RhcnQgbWFpbiBJL08gZGlzcGF0Y2hlci4gKi8KKyAgICAgICAgX3Nka2N0bF9pb19kaXNwYXRjaGVyX3N0YXJ0KHNka2N0bCk7CisKKyAgICAgICAgLyogSW5pdGlhdGUgaGFuZHNoYWtlLiAqLworICAgICAgICBfc2RrY3RsX2RvX2hhbmRzaGFrZShzZGtjdGwpOworCisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ2xpZW50IGRpZG4ndCBsaWtlIHNvbWV0aGluZyBhYm91dCB0aGlzIGNvbm5lY3Rpb24uICovCisgICAgICAgIHJldHVybiBhY3Rpb247CisgICAgfQorfQorCisvKiBIYW5kbGVzIGxvc3QgY29ubmVjdGlvbiB3aXRoIFNka0NvbnRyb2xsZXIgc2VydmljZS4gKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25fYXN5bmNfc29ja2V0X2Rpc2Nvbm5lY3RlZChTREtDdGxTb2NrZXQqIHNka2N0bCkKK3sKKyAgICBEKCJTREtDdGwgJXM6IFNvY2tldCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuIiwgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworCisgICAgX3Nka2N0bF9zb2NrZXRfZGlzY29ubmVjdF9zb2NrZXQoc2RrY3RsKTsKKworICAgIEFzeW5jSU9BY3Rpb24gYWN0aW9uID0gc2RrY3RsLT5vbl9zb2NrZXRfY29ubmVjdGlvbihzZGtjdGwtPm9wYXF1ZSwgc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0lPX1NUQVRFX0ZBSUxFRCk7CisgICAgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9ET05FKSB7CisgICAgICAgIC8qIERlZmF1bHQgYWN0aW9uIGZvciBkaXNjb25uZWN0IGlzIHRvIHJlZXN0YWJsaXNoIHRoZSBjb25uZWN0aW9uLiAqLworICAgICAgICBhY3Rpb24gPSBBU0lPX0FDVElPTl9SRVRSWTsKKyAgICB9CisgICAgaWYgKGFjdGlvbiA9PSBBU0lPX0FDVElPTl9SRVRSWSkgeworICAgICAgICBzZGtjdGwtPnN0YXRlID0gU0RLQ1RMX1NPQ0tFVF9DT05ORUNUSU5HOworICAgIH0KKyAgICByZXR1cm4gYWN0aW9uOworfQorCisvKiBBbiBlbnRyeSBwb2ludCBmb3IgYWxsIHNvY2tldCBjb25uZWN0aW9uIGV2ZW50cy4KKyAqIEhlcmUgd2Ugd2lsbCBkaXNwYXRjaCBjb25uZWN0aW9uIGV2ZW50cyB0byBhcHByb3ByaWF0ZSBoYW5kbGVycy4KKyAqIFBhcmFtOgorICogIGNsaWVudF9vcGFxdWUgLSBTREtDdGxTb2NrZXQgaXNudGFuY2UuCisgKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25fYXN5bmNfc29ja2V0X2Nvbm5lY3Rpb24odm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldCogYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cykKK3sKKyAgICBBc3luY0lPQWN0aW9uIGFjdGlvbiA9IEFTSU9fQUNUSU9OX0RPTkU7CisgICAgU0RLQ3RsU29ja2V0KiBjb25zdCBzZGtjdGwgPSAoU0RLQ3RsU29ja2V0KiljbGllbnRfb3BhcXVlOworCisgICAgLyogUmVmZXJlbmNlIHRoZSBzb2NrZXQgd2hpbGUgaW4gdGhpcyBjYWxsYmFjay4gKi8KKyAgICBzZGtjdGxfc29ja2V0X3JlZmVyZW5jZShzZGtjdGwpOworCisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBBU0lPX1NUQVRFX1NVQ0NFRURFRDoKKyAgICAgICAgICAgIHNka2N0bC0+c3RhdGUgPSBTREtDVExfU09DS0VUX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIF9vbl9hc3luY19zb2NrZXRfY29ubmVjdGVkKHNka2N0bCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfRkFJTEVEOgorICAgICAgICAgICAgaWYgKHNka2N0bC0+c3RhdGUgPT0gU0RLQ1RMX1NPQ0tFVF9DT05ORUNURUQpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGRpc2Nvbm5lY3Rpb24gY29uZGl0aW9uLiAqLworICAgICAgICAgICAgICAgIGFjdGlvbiA9IF9vbl9hc3luY19zb2NrZXRfZGlzY29ubmVjdGVkKHNka2N0bCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gc29ja2V0LgorICAgICAgICAgICAgICAgICAqIExldHMgdHJ5IGFnYWluLi4uICovCisgICAgICAgICAgICAgICAgYWN0aW9uID0gQVNJT19BQ1RJT05fUkVUUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFTSU9fU1RBVEVfUkVUUllJTkc6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhY3Rpb24gPSBBU0lPX0FDVElPTl9SRVRSWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNka2N0bF9zb2NrZXRfcmVsZWFzZShzZGtjdGwpOworCisgICAgcmV0dXJuIGFjdGlvbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTREsgQ29udHJvbCBTb2NrZXQgcHVibGljIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1NES0N0bFNvY2tldCoKK3Nka2N0bF9zb2NrZXRfbmV3KGludCByZWNvbm5lY3RfdG8sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICBvbl9zZGtjdGxfc29ja2V0X2Nvbm5lY3Rpb25fY2Igb25fc29ja2V0X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICBvbl9zZGtjdGxfcG9ydF9jb25uZWN0aW9uX2NiIG9uX3BvcnRfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9tZXNzYWdlX2NiIG9uX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpCit7CisgICAgU0RLQ3RsU29ja2V0KiBzZGtjdGw7CisgICAgQU5FVzAoc2RrY3RsKTsKKworICAgIHNka2N0bC0+c3RhdGUgICAgICAgICAgICAgICAgICAgPSBTREtDVExfU09DS0VUX0RJU0NPTk5FQ1RFRDsKKyAgICBzZGtjdGwtPnBvcnRfc3RhdHVzICAgICAgICAgICAgID0gU0RLQ1RMX1BPUlRfRElTQ09OTkVDVEVEOworICAgIHNka2N0bC0+b3BhcXVlICAgICAgICAgICAgICAgICAgPSBvcGFxdWU7CisgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUgICAgICAgICAgICA9IEFTVFJEVVAoc2VydmljZV9uYW1lKTsKKyAgICBzZGtjdGwtPm9uX3NvY2tldF9jb25uZWN0aW9uICAgID0gb25fc29ja2V0X2Nvbm5lY3Rpb247CisgICAgc2RrY3RsLT5vbl9wb3J0X2Nvbm5lY3Rpb24gICAgICA9IG9uX3BvcnRfY29ubmVjdGlvbjsKKyAgICBzZGtjdGwtPm9uX21lc3NhZ2UgICAgICAgICAgICAgID0gb25fbWVzc2FnZTsKKyAgICBzZGtjdGwtPnJlY29ubmVjdF90byAgICAgICAgICAgID0gcmVjb25uZWN0X3RvOworICAgIHNka2N0bC0+YXMgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMOworICAgIHNka2N0bC0+bmV4dF9xdWVyeV9pZCAgICAgICAgICAgPSAwOworICAgIHNka2N0bC0+cXVlcnlfaGVhZCAgICAgICAgICAgICAgPSBzZGtjdGwtPnF1ZXJ5X3RhaWwgPSBOVUxMOworICAgIHNka2N0bC0+cmVmX2NvdW50ICAgICAgICAgICAgICAgPSAxOworICAgIHNka2N0bC0+cmVjeWNsZXIgICAgICAgICAgICAgICAgPSBOVUxMOworICAgIHNka2N0bC0+cmVjeWNsZXJfYmxvY2tfc2l6ZSAgICAgPSAwOworICAgIHNka2N0bC0+cmVjeWNsZXJfbWF4ICAgICAgICAgICAgPSAwOworICAgIHNka2N0bC0+cmVjeWNsZXJfY291bnQgICAgICAgICAgPSAwOworCisgICAgVCgiU0RLQ3RsICVzOiBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIiwgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworCisgICAgc2RrY3RsLT5sb29wZXIgPSBsb29wZXJfZ2V0Rm9yVGhyZWFkKCk7CisgICAgaWYgKHNka2N0bC0+bG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgRSgiVW5hYmxlIHRvIGNyZWF0ZSBJL08gbG9vcGVyIGZvciBTREtDdGwgc29ja2V0ICclcyciLAorICAgICAgICAgIHNlcnZpY2VfbmFtZSk7CisgICAgICAgIG9uX3NvY2tldF9jb25uZWN0aW9uKG9wYXF1ZSwgc2RrY3RsLCBBU0lPX1NUQVRFX0ZBSUxFRCk7CisgICAgICAgIF9zZGtjdGxfc29ja2V0X2ZyZWUoc2RrY3RsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNka2N0bDsKK30KKworaW50IHNka2N0bF9zb2NrZXRfcmVmZXJlbmNlKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIGFzc2VydChzZGtjdGwtPnJlZl9jb3VudCA+IDApOworICAgIHNka2N0bC0+cmVmX2NvdW50Kys7CisgICAgcmV0dXJuIHNka2N0bC0+cmVmX2NvdW50OworfQorCitpbnQKK3Nka2N0bF9zb2NrZXRfcmVsZWFzZShTREtDdGxTb2NrZXQqIHNka2N0bCkKK3sKKyAgICBhc3NlcnQoc2RrY3RsLT5yZWZfY291bnQgPiAwKTsKKyAgICBzZGtjdGwtPnJlZl9jb3VudC0tOworICAgIGlmIChzZGtjdGwtPnJlZl9jb3VudCA9PSAwKSB7CisgICAgICAgIC8qIExhc3QgcmVmZXJlbmNlIGhhcyBiZWVuIGRyb3BwZWQuIERlc3Ryb3kgdGhpcyBvYmplY3QuICovCisgICAgICAgIF9zZGtjdGxfc29ja2V0X2ZyZWUoc2RrY3RsKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzZGtjdGwtPnJlZl9jb3VudDsKK30KKwordm9pZAorc2RrY3RsX2luaXRfcmVjeWNsZXIoU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JlY3ljbGVkX251bSkKK3sKKyAgICBpZiAoc2RrY3RsLT5yZWN5Y2xlciAhPSBOVUxMKSB7CisgICAgICAgIEQoIlNES0N0bCAlczogUmVjeWNsZXIgaXMgYWxyZWFkeSBpbml0aWFsaXplZC4gSWdub3JpbmcgcmVjeWNsZXIgaW5pdC4iLAorICAgICAgICAgIHNka2N0bC0+c2VydmljZV9uYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFNES0N0bFF1ZXJ5IGlzIG1heCBkZXNjcmlwdG9yIHNpemVvZi4gKi8KKyAgICBkYXRhX3NpemUgKz0gc2l6ZW9mKFNES0N0bFF1ZXJ5KTsKKworICAgIHNka2N0bC0+cmVjeWNsZXJfYmxvY2tfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICBzZGtjdGwtPnJlY3ljbGVyX21heCAgICAgICAgPSBtYXhfcmVjeWNsZWRfbnVtOworICAgIHNka2N0bC0+cmVjeWNsZXJfY291bnQgICAgICA9IDA7Cit9CisKK3ZvaWQKK3Nka2N0bF9zb2NrZXRfY29ubmVjdChTREtDdGxTb2NrZXQqIHNka2N0bCwgaW50IHBvcnQsIGludCByZXRyeV90bykKK3sKKyAgICBUKCJTREtDdGwgJXM6IEhhbmRsaW5nIGNvbm5lY3QgcmVxdWVzdCB0byBwb3J0ICVkLCByZXRyeWluZyBpbiAlZG1zLi4uIiwKKyAgICAgIHNka2N0bC0+c2VydmljZV9uYW1lLCBwb3J0LCByZXRyeV90byk7CisKKyAgICBzZGtjdGwtPnN0YXRlID0gU0RLQ1RMX1NPQ0tFVF9DT05ORUNUSU5HOworICAgIHNka2N0bC0+YXMgPSBhc3luY19zb2NrZXRfbmV3KHBvcnQsIHNka2N0bC0+cmVjb25uZWN0X3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vbl9hc3luY19zb2NrZXRfY29ubmVjdGlvbiwgc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNka2N0bC0+bG9vcGVyKTsKKyAgICBpZiAoc2RrY3RsLT5hcyA9PSBOVUxMKSB7CisgICAgICAgIEUoIlVuYWJsZSB0byBhbGxvY2F0ZSBBc3luY1NvY2tldCBmb3IgU0RLQ3RsIHNvY2tldCAnJXMnIiwKKyAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworICAgICAgICBzZGtjdGwtPm9uX3NvY2tldF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIEFTSU9fU1RBVEVfRkFJTEVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3luY19zb2NrZXRfY29ubmVjdChzZGtjdGwtPmFzLCByZXRyeV90byk7CisgICAgfQorfQorCit2b2lkCitzZGtjdGxfc29ja2V0X3JlY29ubmVjdChTREtDdGxTb2NrZXQqIHNka2N0bCwgaW50IHBvcnQsIGludCByZXRyeV90bykKK3sKKyAgICBUKCJTREtDdGwgJXM6IEhhbmRsaW5nIHJlY29ubmVjdGlvbiByZXF1ZXN0IHRvIHBvcnQgJWQsIHJldHJ5aW5nIGluICVkbXMuLi4iLAorICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHBvcnQsIHJldHJ5X3RvKTsKKworICAgIF9zZGtjdGxfc29ja2V0X2Rpc2Nvbm5lY3Rfc29ja2V0KHNka2N0bCk7CisKKyAgICBpZiAoc2RrY3RsLT5hcyA9PSBOVUxMKSB7CisgICAgICAgIHNka2N0bF9zb2NrZXRfY29ubmVjdChzZGtjdGwsIHBvcnQsIHJldHJ5X3RvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZGtjdGwtPnN0YXRlID0gU0RLQ1RMX1NPQ0tFVF9DT05ORUNUSU5HOworICAgICAgICBhc3luY19zb2NrZXRfcmVjb25uZWN0KHNka2N0bC0+YXMsIHJldHJ5X3RvKTsKKyAgICB9Cit9CisKK3ZvaWQKK3Nka2N0bF9zb2NrZXRfZGlzY29ubmVjdChTREtDdGxTb2NrZXQqIHNka2N0bCkKK3sKKyAgICBUKCJTREtDdGwgJXM6IEhhbmRsaW5nIGRpc2Nvbm5lY3QgcmVxdWVzdC4iLCBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisKKyAgICBfc2RrY3RsX3NvY2tldF9kaXNjb25uZWN0X3NvY2tldChzZGtjdGwpOworfQorCitpbnQKK3Nka2N0bF9zb2NrZXRfaXNfY29ubmVjdGVkKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIHJldHVybiAoc2RrY3RsLT5zdGF0ZSA9PSBTREtDVExfU09DS0VUX0NPTk5FQ1RFRCkgPyAxIDogMDsKK30KKworaW50CitzZGtjdGxfc29ja2V0X2lzX3BvcnRfcmVhZHkoU0RLQ3RsU29ja2V0KiBzZGtjdGwpCit7CisgICAgcmV0dXJuIChzZGtjdGwtPnBvcnRfc3RhdHVzID09IFNES0NUTF9QT1JUX0VOQUJMRUQpID8gMSA6IDA7Cit9CisKK1Nka0N0bFBvcnRTdGF0dXMKK3Nka2N0bF9zb2NrZXRfZ2V0X3BvcnRfc3RhdHVzKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIHJldHVybiBzZGtjdGwtPnBvcnRfc3RhdHVzOworfQorCitpbnQKK3Nka2N0bF9zb2NrZXRfaXNfaGFuZHNoYWtlX29rKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworICAgIHN3aXRjaCAoc2RrY3RsLT5wb3J0X3N0YXR1cykgeworICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfRFVQOgorICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfVU5LTk9XTl9RVUVSWToKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX1VOS05PV05fUkVTUE9OU0U6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICBIYW5kc2hha2UgcXVlcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogSGFuZHNoYWtlIHJlc3VsdCB2YWx1ZXMuCisgKi8KKworLyogSGFuZHNoYWtlIGhhcyBzdWNjZWVkZWQgY29tcGxldGVkLCBhbmQgc2VydmljZS1zaWRlIHBvcnQgaXMgY29ubmVjdGVkLiAqLworI2RlZmluZSBTREtDVExfSEFORFNIQUtFX1JFU1BfQ09OTkVDVEVEICAgICAgICAgMAorLyogSGFuZHNoYWtlIGhhcyBzdWNjZWVkZWQgY29tcGxldGVkLCBidXQgc2VydmljZS1zaWRlIHBvcnQgaXMgbm90IGNvbm5lY3RlZC4gKi8KKyNkZWZpbmUgU0RLQ1RMX0hBTkRTSEFLRV9SRVNQX05PUE9SVCAgICAgICAgICAgIDEKKy8qIEhhbmRzaGFrZSBoYXMgZmFpbGVkIGR1ZSB0byBkdXBsaWNhdGUgY29ubmVjdGlvbiByZXF1ZXN0LiAqLworI2RlZmluZSBTREtDVExfSEFORFNIQUtFX1JFU1BfRFVQICAgICAgICAgICAgICAgLTEKKy8qIEhhbmRzaGFrZSBoYXMgZmFpbGVkIGR1ZSB0byB1bmtub3duIHF1ZXJ5LiAqLworI2RlZmluZSBTREtDVExfSEFORFNIQUtFX1JFU1BfUVVFUllfVU5LTk9XTiAgICAgLTIKKworLyogQSBjYWxsYmFjayB0aGF0IGlzIGl2b2tlZCBvbiBoYW5kc2hha2UgSS9PIGV2ZW50cy4gKi8KK3N0YXRpYyBBc3luY0lPQWN0aW9uCitfb25faGFuZHNoYWtlX2lvKHZvaWQqIHF1ZXJ5X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgU0RLQ3RsUXVlcnkqIHF1ZXJ5LAorICAgICAgICAgICAgICAgICBBc3luY0lPU3RhdGUgc3RhdHVzKQoreworICAgIFNES0N0bFNvY2tldCogY29uc3Qgc2RrY3RsID0gKFNES0N0bFNvY2tldCopcXVlcnlfb3BhcXVlOworCisgICAgaWYgKHN0YXR1cyA9PSBBU0lPX1NUQVRFX1NVQ0NFRURFRCkgeworICAgICAgICBjb25zdCBpbnQqIHJlcyA9IChjb25zdCBpbnQqKSgqcXVlcnktPnJlc3BvbnNlX2J1ZmZlcik7CisgICAgICAgIFNka0N0bFBvcnRTdGF0dXMgaGFuZHNoYWtlX3N0YXR1czsKKyAgICAgICAgc3dpdGNoICgqcmVzKSB7CisgICAgICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfUkVTUF9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgRCgiU0RLQ3RsICVzOiBIYW5kc2hha2Ugc3VjY2VlZGVkLiBQb3J0IGlzIGNvbm5lY3RlZCIsCisgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgaGFuZHNoYWtlX3N0YXR1cyA9IFNES0NUTF9IQU5EU0hBS0VfQ09OTkVDVEVEOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfUkVTUF9OT1BPUlQ6CisgICAgICAgICAgICAgICAgRCgiU0RLQ3RsICVzOiBIYW5kc2hha2Ugc3VjY2VlZGVkLiBQb3J0IGlzIG5vdCBjb25uZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworICAgICAgICAgICAgICAgIGhhbmRzaGFrZV9zdGF0dXMgPSBTREtDVExfSEFORFNIQUtFX05PX1BPUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU0RLQ1RMX0hBTkRTSEFLRV9SRVNQX0RVUDoKKyAgICAgICAgICAgICAgICBEKCJTREtDdGwgJXM6IEhhbmRzaGFrZSBmYWlsZWQ6IGR1cGxpY2F0ZSBjb25uZWN0aW9uLiIsCisgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgaGFuZHNoYWtlX3N0YXR1cyA9IFNES0NUTF9IQU5EU0hBS0VfRFVQOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfUkVTUF9RVUVSWV9VTktOT1dOOgorICAgICAgICAgICAgICAgIEQoIlNES0N0bCAlczogSGFuZHNoYWtlIGZhaWxlZDogdW5rbm93biBxdWVyeS4iLAorICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUpOworICAgICAgICAgICAgICAgIGhhbmRzaGFrZV9zdGF0dXMgPSBTREtDVExfSEFORFNIQUtFX1VOS05PV05fUVVFUlk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgRSgiU0RLQ3RsICVzOiBVbmtub3duIGhhbmRzaGFrZSByZXNwb25zZTogJWQiLAorICAgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsICpyZXMpOworICAgICAgICAgICAgICAgIGhhbmRzaGFrZV9zdGF0dXMgPSBTREtDVExfSEFORFNIQUtFX1VOS05PV05fUkVTUE9OU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2RrY3RsLT5wb3J0X3N0YXR1cyA9IGhhbmRzaGFrZV9zdGF0dXM7CisgICAgICAgIHNka2N0bC0+b25fcG9ydF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIGhhbmRzaGFrZV9zdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNvbWV0aGluZyBpcyBnb2luZyBvbiB3aXRoIHRoZSBoYW5kc2hha2UuLi4gKi8KKyAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQVNJT19TVEFURV9GQUlMRUQ6CisgICAgICAgICAgICBjYXNlIEFTSU9fU1RBVEVfVElNRURfT1VUOgorICAgICAgICAgICAgY2FzZSBBU0lPX1NUQVRFX0NBTkNFTExFRDoKKyAgICAgICAgICAgICAgRCgiU0RLQ3RsICVzOiBIYW5kc2hha2UgZmFpbGVkOiBJL08gc3RhdGUgJWQuIEVycm9yOiAlZCAtPiAlcyIsCisgICAgICAgICAgICAgICAgc2RrY3RsLT5zZXJ2aWNlX25hbWUsIHN0YXR1cywgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgc2RrY3RsLT5vbl9zb2NrZXRfY29ubmVjdGlvbihzZGtjdGwtPm9wYXF1ZSwgc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNJT19TVEFURV9GQUlMRUQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX3Nka2N0bF9lbmRpYW5uZXNzX2lvKHZvaWQqIGlvX29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY1NvY2tldElPKiBhc2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpIHsKKyAgICBTREtDdGxTb2NrZXQqIGNvbnN0IHNka2N0bCA9IChTREtDdGxTb2NrZXQqKWlvX29wYXF1ZTsKKworICAgIGlmIChzdGF0dXMgPT0gQVNJT19TVEFURV9TVUNDRUVERUQpIHsKKyAgICAgICAgLyogTm93IGl0J3MgdGltZSB0byBpbml0aWF0ZSBoYW5kc2hha2UgbWVzc2FnZS4gKi8KKyAgICAgICAgRCgiU0RLQ3RsICVzOiBTZW5kaW5nIGhhbmRzaGFrZSBxdWVyeS4uLiIsIHNka2N0bC0+c2VydmljZV9uYW1lKTsKKyAgICAgICAgU0RLQ3RsUXVlcnkqIHF1ZXJ5ID0KKyAgICAgICAgICAgIHNka2N0bF9xdWVyeV9idWlsZF9hbmRfc2VuZChzZGtjdGwsIFNES0NUTF9RVUVSWV9IQU5EU0hBS0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHNka2N0bC0+c2VydmljZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25faGFuZHNoYWtlX2lvLCBzZGtjdGwsIDMwMDApOworICAgICAgICBzZGtjdGxfcXVlcnlfcmVsZWFzZShxdWVyeSk7CisgICAgICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNvbWV0aGluZyBpcyBnb2luZyBvbiB3aXRoIHRoZSBlbmRpYW5uZXNzLi4uICovCisgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBU0lPX1NUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICBjYXNlIEFTSU9fU1RBVEVfVElNRURfT1VUOgorICAgICAgICAgICAgICAgIGNhc2UgQVNJT19TVEFURV9DQU5DRUxMRUQ6CisgICAgICAgICAgICAgICAgICBEKCJTREtDdGwgJXM6IGVuZGlhbm5lc3MgZmFpbGVkOiBJL08gc3RhdGUgJWQuIEVycm9yOiAlZCAtPiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHNka2N0bC0+c2VydmljZV9uYW1lLCBzdGF0dXMsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgICAgICBzZGtjdGwtPm9uX3NvY2tldF9jb25uZWN0aW9uKHNka2N0bC0+b3BhcXVlLCBzZGtjdGwsIEFTSU9fU1RBVEVfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVNJT19BQ1RJT05fRE9ORTsKK30KKworc3RhdGljIHZvaWQKK19zZGtjdGxfZG9faGFuZHNoYWtlKFNES0N0bFNvY2tldCogc2RrY3RsKQoreworI2lmbmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorc3RhdGljIGNvbnN0IGNoYXIgX2hvc3RfZW5kID0gMDsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciBfaG9zdF9lbmQgPSAxOworI2VuZGlmCisKKyAgICBEKCJTREtDdGwgJXM6IFNlbmRpbmcgZW5kaWFubmVzczogJWQiLCBzZGtjdGwtPnNlcnZpY2VfbmFtZSwgX2hvc3RfZW5kKTsKKworICAgIC8qIEJlZm9yZSB3ZSBjYW4gc2VuZCBhbnkgc3RydWN0dXJlZCBkYXRhIHRvIHRoZSBTREsgY29udHJvbGxlciB3ZSBuZWVkIHRvCisgICAgICogcmVwb3J0IGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QuICovCisgICAgYXN5bmNfc29ja2V0X3dyaXRlX3JlbChzZGtjdGwtPmFzLCAmX2hvc3RfZW5kLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uX3Nka2N0bF9lbmRpYW5uZXNzX2lvLCBzZGtjdGwsIDMwMDApOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Nkay1jb250cm9sbGVyLXNvY2tldC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3Nkay1jb250cm9sbGVyLXNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNjE2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2RrLWNvbnRyb2xsZXItc29ja2V0LmgKQEAgLTAsMCArMSw2MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYXN5bmMtc29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hc3luYy11dGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyoKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9uIG9mIGFuIEFQSSB0aGF0IGVuY2Fwc3VsYXRlcyBjb21tdW5pY2F0aW9uIHByb3RvY29sIHdpdGgKKyAqIFNka0NvbnRyb2xsZXIgcnVubmluZyBvbiBhbiBBbmRyb2lkIGRldmljZS4KKyAqCisgKiBTZGtDb250cm9sbGVyIGlzIHVzZWQgdG8gcHJvdmlkZToKKyAqCisgKiAtIFJlYWxpc3RpYyBzZW5zb3IgZW11bGF0aW9uLgorICogLSBNdWx0aS10b3VjaCBlbXVsYXRpb24uCisgKiAtIE9wZW4gZm9yIG90aGVyIHR5cGVzIG9mIGVtdWxhdGlvbi4KKyAqCisgKiBUaGUgaWRlYSBiZWhpbmQgdGhpcyB0eXBlIG9mIGVtdWxhdGlvbiBpcyBzdWNoIHRoYXQgdGhlcmUgaXMgYW4gYWN0dWFsCisgKiBBbmRyb2lkIGRldmljZSB0aGF0IGlzIGNvbm5lY3RlZCB2aWEgVVNCIHRvIHRoZSBob3N0IHJ1bm5pbmcgdGhlIGVtdWxhdG9yLgorICogT24gdGhlIGRldmljZSB0aGVyZSBpcyBhbiBTZGtDb250cm9sbGVyIHNlcnZpY2UgcnVubmluZyB0aGF0IGVuYWJsZXMKKyAqIGNvbW11bmljYXRpb24gYmV0d2VlbiBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIHRoYXQgZ2F0aGVycyBpbmZvcm1hdGlvbiByZXF1aXJlZAorICogYnkgdGhlIGVtdWxhdG9yLCBhbmQgdHJhbnNtaXRzIHRoYXQgaW5mbyB0byB0aGUgZW11bGF0b3IuCisgKgorICogU2RrQ29udHJvbGxlciBzZXJ2aWNlIG9uIHRoZSBkZXZpY2UsIGFuZCBTREtDdGxTb2NrZXQgQVBJIGltcGxlbWVudGVkIGhlcmUKKyAqIGltcGxlbWVudCB0aGUgZXhjaGFuZ2UgcHJvdG9jb2wgYmV0d2VlbiBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uLCBhbmQgZW11bGF0aW9uCisgKiBlbmdpbmUgcnVubmluZyBpbnNpZGUgdGhlIGVtdWxhdG9yLgorICoKKyAqIEluIHR1cm4sIHRoZSBleGNoYW5nZSBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgYXN5bmNocm9ub3VzIHNvY2tldAorICogY29tbXVuaWNhdGlvbiAoYWJzdHJhY3RlZCBpbiBBc3luY1NvY2tldCBwcm90b2NvbCBpbXBsZW1lbnRlZCBpbgorICogYW5kcm9pZC9hc3luYy1zb2NrZXQuKikuIEl0IG1lYW5zIHRoYXQgY29ubmVjdGlvbiwgYW5kIGFsbCBkYXRhIHRyYW5zZmVyCisgKiAoYm90aCwgaW4sIGFuZCBvdXQpIGFyZSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91cywgYW5kIHJlc3VsdHMgb2YgZWFjaCBvcGVyYXRpb24KKyAqIGFyZSByZXBvcnRlZCB0aHJvdWdoIGNhbGxiYWNrcy4KKyAqCisgKiBFc3NlbnRpYWxseSwgdGhpcyBlbnRpcmUgQVBJIGltcGxlbWVudHMgdHdvIHR5cGVzIG9mIHByb3RvY29sczoKKyAqCisgKiAtIENvbm5lY3Rpb24gcHJvdG9jb2wuCisgKiAtIERhdGEgZXhjaGFuZ2UgcHJvdG9jb2wuCisgKgorICogMS4gQ29ubmVjdGlvbiBwcm90b2NvbC4KKyAqCisgKiBDb25uZWN0aW5nIHRvIFNka0NvbnRyb2xsZXIgc2VydmljZSBvbiB0aGUgYXR0YWNoZWQgZGV2aWNlIGNhbiBiZSBicm9rZW4gZG93bgorICogaW50byB0d28gcGhhc2VzOgorICogLSBDb25uZWN0aW5nIHRvIGEgVENQIHNvY2tldC4KKyAqIC0gU2VuZGluZyBhICJoYW5kc2hha2UiIHF1ZXJ5IHRvIHRoZSBTZGtDb250cm9sbGVyLgorICoKKyAqIDEuMS4gQ29ubmVjdGluZyB0byB0aGUgc29ja2V0LgorICoKKyAqIFRDUCBzb2NrZXQgY29ubmVjdGlvbiB3aXRoIFNka0NvbnRyb2xsZXIgaXMgZW5hYmxlZCBieSB1c2luZyBhZGIgcG9ydAorICogZm9yd2FyZGluZy4gU2RrQ29udHJvbGxlciBpcyBhbHdheXMgbGlzdGVuaW5nIHRvIGEgbG9jYWwgYWJzdHJhY3Qgc29ja2V0IG5hbWVkCisgKiAnYW5kcm9pZC5zZGsuY29udHJvbGxlcicsIHNvIHRvIGVuYWJsZSBjb25uZWN0aW5nIHRvIGl0IGZyb20gdGhlIGhvc3QsIHJ1bgorICoKKyAqICAgYWRiIGZvcndhcmQgdGNwOjxwb3J0PiBsb2NhbGFic3RyYWN0OiBhbmRyb2lkLnNkay5jb250cm9sbGVyCisgKgorICogQWZ0ZXIgdGhhdCBUQ1Agc29ja2V0IGZvciB0aGUgcmVxdWVzdGVkIHBvcnQgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0bworICogU2RrQ29udHJvbGxlciwgYW5kIGNvbm5lY3RpbmcgdG8gaXQgaXMgbm8gZGlmZmVyZW50IHRoYW4gY29ubmVjdGluZyB0byBhbnkKKyAqIHNvY2tldCBzZXJ2ZXIuIEV4Y2VwdCBmb3Igb25lIHRoaW5nOiBhZGIgcG9ydCBmb3J3YXJkaW5nIGlzIGltcGxlbWVudGVkIGluCisgKiBzdWNoIGEgd2F5LCB0aGF0IHNvY2tldF9jb25uZWN0IHdpbGwgYWx3YXlzIHN1Y2NlZWQsIGV2ZW4gaWYgdGhlcmUgaXMgbm8KKyAqIHNlcnZlciBsaXN0ZW5pbmcgdG8gdGhhdCBwb3J0IG9uIHRoZSBvdGhlciBzaWRlIG9mIGNvbm5lY3Rpb24uIE1vcmVvdmVyLAorICogZXZlbiBzb2NrZWRfc2VuZCB3aWxsIHN1Y2NlZWQgaW4gdGhpcyBjYXNlLCBzbyB0aGUgb25seSB3YXkgdG8gZW5zdXJlIHRoYXQKKyAqIFNka0NvbnRyb2xsZXIgaW4gZGVlZCBpcyBsaXN0ZW5pbmcgaXMgdG8gZXhjaGFuZ2UgYSBoYW5kc2hha2Ugd2l0aCBpdDoKKyAqIEZvcnR1bmF0ZWxseSwgYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gZm9yd2FyZGVkIFRDUCBwb3J0IG9uIGNvbmRpdGlvbiB0aGF0CisgKiB0aGVyZSBpcyBubyBsaXN0ZW5lciBvbiB0aGUgb2hlciBzaWRlIHdpbGwgZmFpbC4KKyAqCisgKiAxLjIuIEhhbmRzaGFrZSBxdWVyeS4KKyAqCisgKiBIYW5kc2hha2UgcXVlcnkgaXMgYSBzcGVjaWFsIHR5cGUgb2YgcXVlcnkgdGhhdCBTREtDdGxTb2NrZXQgc2VuZHMgdG8gdGhlCisgKiBTZGtDb250cm9sbGVyIHVwb24gc3VjY2Vzc2Z1bCBzb2NrZXQgY29ubmVjdGlvbi4gVGhpcyBxdWVyeSBzZXJ2ZWQgdHdvCisgKiBwdXJwb3NlczoKKyAqIC0gSW5mb3JtcyB0aGUgU2RrQ29udHJvbGxlciBhYm91dCBob3N0IGVuZGlhbm5lc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMKKyAqICAgaW1wb3J0YW50LCBiZWNhdXNlIFNka0NvbnRyb2xsZXIgbmVlZHMgaXQgaW4gb3JkZXIgdG8gZm9ybWF0IGl0cyBtZXNzYWdlcworICogICB3aXRoIHByb3BlciBlbmRpYW5uZXNzLgorICogLSBFbnN1cmVzIHRoYXQgU2RrQ29udHJvbGxlciBpcyBpbiBkZWVkIGxpc3RlbmluZyBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKKyAqICAgY29ubmVjdGVkIHNvY2tldC4KKyAqCisgKiBDb25uZWN0aW9uIHdpdGggU2RrQ29udHJvbGxlciBpcyBjb25zaWRlcmVkIHRvIGJlIHN1Y2Nlc3NmdWx5IGVzdGFibGlzaGVkIHdoZW4KKyAqIFNka0NvbnRyb2xsZXIgcmVzcG9uZHMgdG8gdGhlIGhhbmRzaGFrZSBxdWVyeSwgdGh1cywgY29tcGxldGluZyB0aGUgY29ubmVjdGlvbi4KKyAqCisgKiAyLiBEYXRhIGV4Y2hhbmdlIHByb3RvY29sLgorICoKKyAqIEFzIGl0IHdhcyBtZW50aW9uZWQgYWJvdmUsIGFsbCBkYXRhIHRyYW5zZmVyIGluIHRoaXMgQVBJIGlzIGNvbXBsZXRlbHkKKyAqIGFzeW5jaHJvbm91cywgYW5kIHJlc3VsdCBvZiBlYWNoIGRhdGEgdHJhbnNmZXIgaXMgcmVwb3J0ZWQgdmlhIGNhbGxiYWNrcy4KKyAqIFRoaXMgYWxzbyBjb21wbGljYXRlcyBkZXN0cnVjdGlvbiBvZiBkYXRhIGludm9sdmVkIGluIGV4Y2hhbmdlLCBzaW5jZSBpbiBhbgorICogYXN5bmNocm9ub3VzIGVudmlyb25tZW50IGl0J3MgaGFyZCB0byBjb250cm9sIHRoZSBsaWZlc3BhbiBvZiBhbiBvYmplY3QsIGl0cworICogb3duZXIsIGFuZCB3aG8gYW5kIHdoZW4gaXMgcmVzcG9uc2libGUgdG8gZnJlZSByZXNvdXJjZXMgYWxsb2NhdGVkIGZvciB0aGUKKyAqIHRyYW5zZmVyLiBUbyBhZGRyZXNzIHRoaXMgaXNzdWUsIGFsbCB0aGUgZGVzY3JpcHRvcnMgdGhhdCB0aGlzIEFQSSBvcGVyYXRlcworICogd2l0aCBhcmUgcmVmZXJlbmNlZCBvbiB1c2UgLyByZWxlYXNlZCBhZnRlciB1c2UsIGFuZCBnZXQgZnJlZWQgd2hlbiByZWZlcmVuY2UKKyAqIGNvdW50ZXIgZm9yIHRoZW0gZHJvcHMgdG8gemVybywgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIG5vIGNvbXBvbmVudCB0aGF0IGlzCisgKiBpbnRlcmVzdGVkIGluIHRoYXQgcGFydGljdWxhciBkZXNjcmlwdG9yLgorICoKKyAqIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBkYXRhIGluIHRoZSBleGNoYW5nZSBwcm90b2NvbDoKKyAqIC0gQSBtZXNzYWdlIC0gdGhlIHNpbXBsZXN0IHR5cGUgb2YgZGF0YSB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhbnkgcmVwbGllcy4KKyAqIC0gQSBxdWVyeSAtIEEgbWVzc2FnZSB0aGF0IHJlcXVpcmUgYSByZXBseSwgYW5kCisgKiAtIEEgcXVlcnkgcmVwbHkgLSBBIG1lc3NhZ2UgdGhhdCBkZWxpdmVycyBxdWVyeSByZXBseS4KKyAqLworCisvKiBEZWZhdWx0IFRDUCBwb3J0IHRvIHVzZSBmb3IgY29ubmVjdGlvbiB3aXRoIFNESyBjb250cm9sbGVyLiAqLworI2RlZmluZSBTREtDVExfREVGQVVMVF9UQ1BfUE9SVCAgICAgMTk3MAorCisvKiBEZWNsYXJlcyBTREsgY29udHJvbGxlciBzb2NrZXQgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bFNvY2tldCBTREtDdGxTb2NrZXQ7CisKKy8qIERlY2xhcmVzIFNESyBjb250cm9sbGVyIG1lc3NhZ2UgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bE1lc3NhZ2UgU0RLQ3RsTWVzc2FnZTsKKworLyogRGVjbGFyZXMgU0RLIGNvbnRyb2xsZXIgcXVlcnkgZGVzY3JpcHRvci4gKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bFF1ZXJ5IFNES0N0bFF1ZXJ5OworCisvKiBEZWNsYXJlcyBTREsgY29udHJvbGxlciBkaXJlY3QgcGFja2V0IGRlc2NyaXB0b3IuCisgKiBEaXJlY3QgcGFja2V0ICh1bmxpa2UgbWVzc2FnZSwgb3IgcXVlcnkgcGFja2V0cykgZG9lc24ndCBjb250YWluIGRhdGEgYnVmZmVyLAorICogYnV0IHJhdGhlciByZWZlcmVuY2VzIG1lc3NhZ2UsIG9yIHF1ZXJ5IGRhdGEgYWxsb2NhdGVkIGJ5IHRoZSBjbGllbnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IFNES0N0bERpcmVjdFBhY2tldCBTREtDdGxEaXJlY3RQYWNrZXQ7CisKKy8qIERlZmluZXMgY2xpZW50J3MgY2FsbGJhY2sgc2V0IHRvIG1vbml0b3IgU0RLIGNvbnRyb2xsZXIgc29ja2V0IGNvbm5lY3Rpb24uCisgKgorICogU0RLQ3RsU29ja2V0IHdpbGwgaW52b2tlIHRoaXMgY2FsbGJhY2sgd2hlbiBjb25uZWN0aW9uIHRvIFRDUCBwb3J0IGlzCisgKiBlc3RhYmxpc2hlZCwgYnV0IGJlZm9yZSBoYW5kc2hha2UgcXVlcnkgaXMgcHJvY2Vzc2VkLiBUaGUgY2xpZW50IHNob3VsZCB1c2UKKyAqIG9uX3Nka2N0bF9oYW5kc2hha2VfY2IgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gYWJvdXQgYW4gb3BlcmF0aW9uYWwgY29ubmVjdGlvbgorICogd2l0aCBTZGtDb250cm9sbGVyLgorICoKKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcyBjYWxsYmFjayBmb3IgdGhlIGNsaWVudCBpcyB0byBtb25pdG9yIGNvbm5lY3Rpb24KKyAqIHN0YXRlOiBpbiBhZGRpdGlvbiB0byBUQ1AgcG9ydCBjb25uZWN0aW9uLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuCisgKiBjb25uZWN0aW9uIHdpdGggdGhlIHBvcnQgaXMgbG9zdC4KKyAqCisgKiBQYXJhbToKKyAqICBjbGllbnRfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQuCisgKiAgc2RrY3RsIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlLgorICogIHN0YXR1cyAtIFNvY2tldCBjb25uZWN0aW9uIHN0YXR1cy4gIENhbiBiZSBvbmUgb2YgdGhlc2U6CisgKiAgICAtIEFTSU9fU1RBVEVfU1VDQ0VFREVEIDogU29ja2V0IGlzIGNvbm5lY3RlZCB0byB0aGUgcG9ydC4KKyAqICAgIC0gQVNJT19TVEFURV9GQUlMRUQgICAgOiBDb25uZWN0aW9uIGF0dGVtcHQgaGFzIGZhaWxlZCwgb3IgY29ubmVjdGlvbiB3aXRoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBvcnQgaXMgbG9zdC4KKyAqIFJldHVybjoKKyAqICBPbmUgb2YgdGhlIEFzeW5jSU9BY3Rpb24gdmFsdWVzLgorICovCit0eXBlZGVmIEFzeW5jSU9BY3Rpb24gKCpvbl9zZGtjdGxfc29ja2V0X2Nvbm5lY3Rpb25fY2IpKHZvaWQqIGNsaWVudF9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0N0bFNvY2tldCogc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luY0lPU3RhdGUgc3RhdHVzKTsKKworLyogRW51bWVyYXRlcyBwb3J0IGNvbm5lY3Rpb24gc3RhdHVzZXMgcGFzc2VkIHRvIHBvcnQgY29ubmVjdGlvbiBjYWxsYmFjay4KKyAqLwordHlwZWRlZiBlbnVtIFNka0N0bFBvcnRTdGF0dXMgeworICAgIC8qIFNlcnZpY2Utc2lkZSBwb3J0IGhhcyBjb25uZWN0ZWQgdG8gdGhlIHNvY2tldC4gKi8KKyAgICBTREtDVExfUE9SVF9ESVNDT05ORUNURUQsCisgICAgLyogU2VydmljZS1zaWRlIHBvcnQgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBzb2NrZXQuICovCisgICAgU0RLQ1RMX1BPUlRfQ09OTkVDVEVELAorICAgIC8qIFNlcnZpY2Utc2lkZSBwb3J0IGhhcyBlbmFibGVkIGVtdWxhdGlvbiAqLworICAgIFNES0NUTF9QT1JUX0VOQUJMRUQsCisgICAgLyogU2VydmljZS1zaWRlIHBvcnQgaGFzIGRpc2FibGVkIGVtdWxhdGlvbiAqLworICAgIFNES0NUTF9QT1JUX0RJU0FCTEVELAorICAgIC8qIEhhbmRzaGFrZSByZXF1ZXN0IGhhcyBzdWNjZWVkZWQsIGFuZCBzZXJ2aWNlLXNpZGUgcG9ydCBpcyBjb25uZWN0ZWQuICovCisgICAgU0RLQ1RMX0hBTkRTSEFLRV9DT05ORUNURUQsCisgICAgLyogSGFuZHNoYWtlIHJlcXVlc3QgaGFzIHN1Y2NlZWRlZCwgYnV0IHNlcnZpY2Utc2lkZSBwb3J0IGlzIG5vdCBjb25uZWN0ZWQuICovCisgICAgU0RLQ1RMX0hBTkRTSEFLRV9OT19QT1JULAorICAgIC8qIEhhbmRzaGFrZSByZXF1ZXN0IGhhcyBmYWlsZWQgZHVlIHRvIHBvcnQgZHVwbGljYXRpb24uICovCisgICAgU0RLQ1RMX0hBTkRTSEFLRV9EVVAsCisgICAgLyogSGFuZHNoYWtlIHJlcXVlc3QgaGFzIGZhaWxlZCBvbiBhbiB1bmtub3duIHF1ZXJ5LiAqLworICAgIFNES0NUTF9IQU5EU0hBS0VfVU5LTk9XTl9RVUVSWSwKKyAgICAvKiBIYW5kc2hha2UgcmVxdWVzdCBoYXMgZmFpbGVkIG9uIGFuIHVua25vd24gcmVzcG9uc2UuICovCisgICAgU0RLQ1RMX0hBTkRTSEFLRV9VTktOT1dOX1JFU1BPTlNFLAorfSBTZGtDdGxQb3J0U3RhdHVzOworCisvKiBEZWZpbmVzIGNsaWVudCdzIGNhbGxiYWNrIHNldCB0byByZWNlaXZlIHBvcnQgY29ubmVjdGlvbiBzdGF0dXMuCisgKgorICogUG9ydCBjb25uZWN0aW9uIGlzIGRpZmZlcmVudCB0aGFuIHNvY2tldCBjb25uZWN0aW9uLCBhbmQgaW5kaWNhdGVzIHdoZXRoZXIKKyAqIG9yIG5vdCBhIHNlcnZpY2Utc2lkZSBwb3J0IHRoYXQgcHJvdmlkZXMgcmVxdWVzdGVkIGVtdWxhdGlvbiBmdW5jdGlvbmFsaXR5IGlzCisgKiBob29rZWQgdXAgd2l0aCB0aGUgY29ubmVjdGVkIHNvY2tldC4gRm9yIGluc3RhbmNlLCBtdWx0aS10b3VjaCBwb3J0IG1heSBiZQorICogaW5hY3RpdmUgYXQgdGhlIHRpbWUgd2hlbiBzb2NrZXQgaXMgY29ubmVjdGVkLiBTbywgdGhlcmUgaXMgYSBzdWNjZXNzZnVsCisgKiBzb2NrZXQgY29ubmVjdGlvbiwgYnV0IHRoZXJlIGlzIG5vIHNlcnZpY2UgYXQgdGhlIGRldmljZSBlbmQgdGhhdCBwcm92aWRlcworICogbXVsdGktdG91Y2ggZnVuY3Rpb25hbGl0eS4gU28sIGZvciBtdWx0aS10b3VjaCBleGFtcGxlLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUKKyAqIGludm9rZWQgd2hlbiBtdWx0aS10b3VjaCBwb3J0IGF0IHRoZSBkZXZpY2UgZW5kIGJlY29tZXMgYWN0aXZlLCBhbmQgaG9va3MgdXAKKyAqIHdpdGggdGhlIHNvY2tldCB0aGF0IHdhcyBjb25uZWN0ZWQgYmVmb3JlLgorICoKKyAqIFBhcmFtOgorICogIGNsaWVudF9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNsaWVudC4KKyAqICBzZGtjdGwgLSBJbml0aWFsaXplZCBTREtDdGxTb2NrZXQgaW5zdGFuY2UuCisgKiAgc3RhdHVzIC0gUG9ydCBjb25uZWN0aW9uIHN0YXR1cy4KKyAqLwordHlwZWRlZiB2b2lkICgqb25fc2RrY3RsX3BvcnRfY29ubmVjdGlvbl9jYikodm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0N0bFNvY2tldCogc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2RrQ3RsUG9ydFN0YXR1cyBzdGF0dXMpOworCisvKiBEZWZpbmVzIGEgbWVzc2FnZSBub3RpZmljYXRpb24gY2FsbGJhY2suCisgKiBQYXJhbToKKyAqICBjbGllbnRfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbGllbnQuCisgKiAgc2RrY3RsIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlLgorICogIG1lc3NhZ2UgLSBEZXNjcmlwdG9yIGZvciByZWNlaXZlZCBtZXNzYWdlLiBOb3RlIHRoYXQgbWVzc2FnZSBkZXNjcmlwdG9yIHdpbGwKKyAqICAgICAgYmUgcmVsZWFzZWQgdXBvbiBleGl0IGZyb20gdGhpcyBjYWxsYmFjayAodGh1cywgY291bGQgYmUgZnJlZWQgYWxvbmcKKyAqICAgICAgd2l0aCBtZXNzYWdlIGRhdGEpLiBJZiB0aGUgY2xpZW50IGlzIGludGVyZXN0ZWQgaW4gd29ya2luZyB3aXRoIHRoYXQKKyAqICAgICAgbWVzc2FnZSBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucywgaXQgc2hvdWxkIHJlZmVyZW5jZSB0aGUgbWVzc2FnZQorICogICAgICBkZXNjcmlwdG9yIGluIHRoaXMgY2FsbGJhY2suCisgKiAgbXNnX3R5cGUgLSBNZXNzYWdlIHR5cGUuCisgKiAgbXNnX2RhdGEsIG1zZ19zaXplIC0gTWVzc2FnZSBkYXRhLgorICovCit0eXBlZGVmIHZvaWQgKCpvbl9zZGtjdGxfbWVzc2FnZV9jYikodm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBtc2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXNnX3NpemUpOworCisvKiBEZWZpbmVzIHF1ZXJ5IGNvbXBsZXRpb24gY2FsbGJhY2suCisgKiBQYXJhbToKKyAqICBxdWVyeV9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXJ5IGJ5IHRoZSBjbGllbnQuCisgKiAgcXVlcnkgLSBRdWVyeSBkZXNjcmlwdG9yLiAgTm90ZSB0aGF0IHF1ZXJ5IGRlc2NyaXB0b3Igd2lsbCBiZSByZWxlYXNlZCB1cG9uCisgKiAgICAgIGV4aXQgZnJvbSB0aGlzIGNhbGxiYWNrICh0aHVzLCBjb3VsZCBiZSBmcmVlZCBhbG9uZyB3aXRoIHF1ZXJ5IGRhdGEpLiBJZgorICogICAgICB0aGUgY2xpZW50IGlzIGludGVyZXN0ZWQgaW4gd29ya2luZyB3aXRoIHRoYXQgcXVlcnkgYWZ0ZXIgdGhlIGNhbGxiYWNrCisgKiAgICAgIHJldHVybnMsIGl0IHNob3VsZCByZWZlcmVuY2UgdGhlIHF1ZXJ5IGRlc2NyaXB0b3IgaW4gdGhpcyBjYWxsYmFjay4KKyAqICBzdGF0dXMgLSBRdWVyeSBzdGF0dXMuIENhbiBiZSBvbmUgb2YgdGhlc2U6CisgKiAgICAtIEFTSU9fU1RBVEVfQ09OVElOVUVTIDogUXVlcnkgZGF0YSBoYXMgYmVlbiB0cmFuc21pdHRlZCB0byB0aGUgc2VydmljZSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcXVlcnkgaXMgbm93IHdhaXRpbmcgZm9yIHJlc3BvbnNlLgorICogICAgLSBBU0lPX1NUQVRFX1NVQ0NFRURFRCA6IFF1ZXJ5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgKiAgICAtIEFTSU9fU1RBVEVfRkFJTEVEICAgIDogUXVlcnkgaGFzIGZhaWxlZCBvbiBhbiBJL08uCisgKiAgICAtIEFTSU9fU1RBVEVfVElNRURfT1VUIDogRGVhZGxpbmUgc2V0IGZvciB0aGUgcXVlcnkgaGFzIGV4cGlyZWQuCisgKiAgICAtIEFTSU9fU1RBVEVfQ0FOQ0VMTEVEIDogUXVlcnkgaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBzb2NrZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uLgorICogUmV0dXJuOgorICogIE9uZSBvZiB0aGUgQXN5bmNJT0FjdGlvbiB2YWx1ZXMuCisgKi8KK3R5cGVkZWYgQXN5bmNJT0FjdGlvbiAoKm9uX3Nka2N0bF9xdWVyeV9jYikodm9pZCogcXVlcnlfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxRdWVyeSogcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpOworCisvKiBEZWZpbmVzIGRpcmVjdCBwYWNrZXQgY29tcGxldGlvbiBjYWxsYmFjay4KKyAqIFBhcmFtOgorICogIG9wYXF1ZSAtIEFuIG9wYXF1ZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlyZWN0IHBhY2tldCBieSB0aGUgY2xpZW50LgorICogIHBhY2tldCAtIFBhY2tldCBkZXNjcmlwdG9yLiAgTm90ZSB0aGF0IHBhY2tldCBkZXNjcmlwdG9yIHdpbGwgYmUgcmVsZWFzZWQKKyAqICAgICAgdXBvbiBleGl0IGZyb20gdGhpcyBjYWxsYmFjayAodGh1cywgY291bGQgYmUgZnJlZWQpLiBJZiB0aGUgY2xpZW50IGlzCisgKiAgICAgIGludGVyZXN0ZWQgaW4gd29ya2luZyB3aXRoIHRoYXQgcGFja2V0IGFmdGVyIHRoZSBjYWxsYmFjayByZXR1cm5zLCBpdAorICogICAgICBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBpbiB0aGlzIGNhbGxiYWNrLgorICogIHN0YXR1cyAtIFBhY2tldCBzdGF0dXMuIENhbiBiZSBvbmUgb2YgdGhlc2U6CisgKiAgICAtIEFTSU9fU1RBVEVfU1VDQ0VFREVEIDogUGFja2V0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50LgorICogICAgLSBBU0lPX1NUQVRFX0ZBSUxFRCAgICA6IFBhY2tldCBoYXMgZmFpbGVkIG9uIGFuIEkvTy4KKyAqICAgIC0gQVNJT19TVEFURV9DQU5DRUxMRUQgOiBQYWNrZXQgaGFzIGJlZW4gY2FuY2VsbGVkIGR1ZSB0byBzb2NrZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0aW9uLgorICogUmV0dXJuOgorICogIE9uZSBvZiB0aGUgQXN5bmNJT0FjdGlvbiB2YWx1ZXMuCisgKi8KK3R5cGVkZWYgQXN5bmNJT0FjdGlvbiAoKm9uX3Nka2N0bF9kaXJlY3RfY2IpKHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0N0bERpcmVjdFBhY2tldCogcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxEaXJlY3RQYWNrZXQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENyZWF0ZXMgbmV3IFNES0N0bERpcmVjdFBhY2tldCBkZXNjcmlwdG9yLgorICogUGFyYW06CisgKiAgc2RrY3RsIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlIHRvIGNyZWF0ZSBhIGRpcmVjdCBwYWNrZXQgZm9yLgorICogUmV0dXJuOgorICogIFJlZmVyZW5jZWQgU0RLQ3RsRGlyZWN0UGFja2V0IGluc3RhbmNlLgorICovCitleHRlcm4gU0RLQ3RsRGlyZWN0UGFja2V0KiBzZGtjdGxfZGlyZWN0X3BhY2tldF9uZXcoU0RLQ3RsU29ja2V0KiBzZGtjdGwpOworCisvKiBSZWZlcmVuY2VzIFNES0N0bERpcmVjdFBhY2tldCBvYmplY3QuCisgKiBQYXJhbToKKyAqICBwYWNrZXQgLSBJbml0aWFsaXplZCBTREtDdGxEaXJlY3RQYWNrZXQgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfZGlyZWN0X3BhY2tldF9yZWZlcmVuY2UoU0RLQ3RsRGlyZWN0UGFja2V0KiBwYWNrZXQpOworCisvKiBSZWxlYXNlcyBTREtDdGxEaXJlY3RQYWNrZXQgb2JqZWN0LgorICogTm90ZSB0aGF0IHVwb24gZXhpdGluZyBmcm9tIHRoaXMgcm91dGluZSB0aGUgb2JqZWN0IG1pZ2h0IGJlIGRlc3Ryb3llZCwgZXZlbgorICogaWYgdGhpcyByb3V0aW5lIHJldHVybnMgdmFsdWUgb3RoZXIgdGhhbiB6ZXJvLgorICogUGFyYW06CisgKiAgcGFja2V0IC0gSW5pdGlhbGl6ZWQgU0RLQ3RsRGlyZWN0UGFja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIE51bWJlciBvZiBvdXRzdGFuZGluZyByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QuCisgKi8KK2V4dGVybiBpbnQgc2RrY3RsX2RpcmVjdF9wYWNrZXRfcmVsZWFzZShTREtDdGxEaXJlY3RQYWNrZXQqIHBhY2tldCk7CisKKy8qIFNlbmRzIGRpcmVjdCBwYWNrZXQuCisgKiBQYXJhbToKKyAqICBwYWNrZXQgLSBQYWNrZXQgZGVzY3JpcHRvciBmb3IgdGhlIGRpcmVjdCBwYWNrZXQgdG8gc2VuZC4KKyAqICBkYXRhIC0gRGF0YSB0byBzZW5kIHdpdGggdGhlIHBhY2tldC4gTXVzdCBiZSBmdWxseSBpbml0aWFsaXplZCBtZXNzYWdlLCBvcgorICogICAgICBxdWVyeSBoZWFkZXIuCisgKiAgY2IsIGNiX29wYXF1ZSAtIENhbGxiYWNrIHRvIGludm9rZSBvbiBwYWNrZXQgdHJhbnNtaXNzaW9uIGV2ZW50cy4KKyAqLworZXh0ZXJuIHZvaWQgc2RrY3RsX2RpcmVjdF9wYWNrZXRfc2VuZChTREtDdGxEaXJlY3RQYWNrZXQqIHBhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fc2RrY3RsX2RpcmVjdF9jYiBjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2Jfb3BhcXVlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxNZXNzYWdlIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZWZlcmVuY2VzIFNES0N0bE1lc3NhZ2Ugb2JqZWN0LgorICogUGFyYW06CisgKiAgbXNnIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsTWVzc2FnZSBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICovCitleHRlcm4gaW50IHNka2N0bF9tZXNzYWdlX3JlZmVyZW5jZShTREtDdGxNZXNzYWdlKiBtc2cpOworCisvKiBSZWxlYXNlcyBTREtDdGxNZXNzYWdlIG9iamVjdC4KKyAqIE5vdGUgdGhhdCB1cG9uIGV4aXRpbmcgZnJvbSB0aGlzIHJvdXRpbmUgdGhlIG9iamVjdCBtaWdodCBiZSBkZXN0cm95ZWQsIGV2ZW4KKyAqIGlmIHRoaXMgcm91dGluZSByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gemVyby4KKyAqIFBhcmFtOgorICogIG1zZyAtIEluaXRpYWxpemVkIFNES0N0bE1lc3NhZ2UgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfbWVzc2FnZV9yZWxlYXNlKFNES0N0bE1lc3NhZ2UqIG1zZyk7CisKKy8qIEJ1aWxkcyBhbmQgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBkZXZpY2UuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBTREtDdGxTb2NrZXQgaW5zdGFuY2UgZm9yIHRoZSBtZXNzYWdlLgorICogIG1zZ190eXBlIC0gRGVmaW5lcyBtZXNzYWdlIHR5cGUuCisgKiAgZGF0YSAtIE1lc3NhZ2UgZGF0YS4gQ2FuIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlCisgKiAgICAgIG1lc3NhZ2UuCisgKiAgc2l6ZSAtIEJ5dGUgc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIuCisgKiBSZXR1cm46CisgKiAgUmVmZXJlbmNlZCBTREtDdGxRdWVyeSBkZXNjcmlwdG9yLgorICovCitleHRlcm4gU0RLQ3RsTWVzc2FnZSogc2RrY3RsX21lc3NhZ2Vfc2VuZChTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKTsKKworLyogR2V0cyBtZXNzYWdlIGhlYWRlciBzaXplICovCitleHRlcm4gaW50IHNka2N0bF9tZXNzYWdlX2dldF9oZWFkZXJfc2l6ZSh2b2lkKTsKKworLyogSW5pdGlhbGl6ZXMgbWVzc2FnZSBoZWFkZXIuCisgKiBQYXJhbToKKyAqICBtc2cgLSBCZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UgcGFja2V0LgorICogIG1zZ190eXBlIC0gTWVzc2FnZSB0eXBlLgorICogIG1zZ19zaXplIC0gTWVzc2FnZSBkYXRhIHNpemUuCisgKi8KK2V4dGVybiB2b2lkIHNka2N0bF9pbml0X21lc3NhZ2VfaGVhZGVyKHZvaWQqIG1zZywgaW50IG1zZ190eXBlLCBpbnQgbXNnX3NpemUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDdGxRdWVyeSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlcywgYW5kIHBhcnRpYWxseSBpbml0aWFsaXplcyBxdWVyeSBkZXNjcmlwdG9yLgorICogTm90ZSB0aGF0IHJldHVybmVkIGRlc2NyaXB0b3IgaXMgcmVmZXJlbmNlZCwgYW5kIGl0IG11c3QgYmUgZXZlbnR1YWxseQorICogcmVsZWFzZWQgd2l0aCBhIGNhbGwgdG8gc2RrY3RsX3F1ZXJ5X3JlbGVhc2UuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBTREtDdGxTb2NrZXQgaW5zdGFuY2UgZm9yIHRoZSBxdWVyeS4KKyAqICBxdWVyeV90eXBlIC0gRGVmaW5lcyBxdWVyeSB0eXBlLgorICogIGluX2RhdGFfc2l6ZSBTaXplIG9mIHRoZSBxdWVyeSdzIGlucHV0IGJ1ZmZlciAoZGF0YSB0byBiZSBzZW50IHdpdGggdGhpcworICogICAgICBxdWVyeSkuIE5vdGUgdGhhdCBidWZmZXIgZm9yIHF1ZXJ5IGRhdGEgd2lsbCBiZSBhbGxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUKKyAqICAgICAgcXVlcnkgZGVzY3JpcHRvci4gVXNlIHNka2N0bF9xdWVyeV9nZXRfYnVmZmVyX2luIHRvIGdldCBhZGRyZXNzIG9mIGRhdGEKKyAqICAgICAgYnVmZmVyIGZvciB0aGlzIHF1ZXJ5LgorICogUmV0dXJuOgorICogIFJlZmVyZW5jZWQgU0RLQ3RsUXVlcnkgZGVzY3JpcHRvci4KKyAqLworZXh0ZXJuIFNES0N0bFF1ZXJ5KiBzZGtjdGxfcXVlcnlfbmV3KFNES0N0bFNvY2tldCogc2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWVyeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluX2RhdGFfc2l6ZSk7CisKKy8qIENyZWF0ZXMsIGFuZCBmdWxseSBpbml0aWFsaXplcyBxdWVyeSBkZXNjcmlwdG9yLgorICogTm90ZSB0aGF0IHJldHVybmVkIGRlc2NyaXB0b3IgaXMgcmVmZXJlbmNlZCwgYW5kIGl0IG11c3QgYmUgZXZlbnR1YWxseQorICogcmVsZWFzZWQgd2l0aCBhIGNhbGwgdG8gc2RrY3RsX3F1ZXJ5X3JlbGVhc2UuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBTREtDdGxTb2NrZXQgaW5zdGFuY2UgZm9yIHRoZSBxdWVyeS4KKyAqICBxdWVyeV90eXBlIC0gRGVmaW5lcyBxdWVyeSB0eXBlLgorICogIGluX2RhdGFfc2l6ZSBTaXplIG9mIHRoZSBxdWVyeSdzIGlucHV0IGJ1ZmZlciAoZGF0YSB0byBiZSBzZW50IHdpdGggdGhpcworICogICAgICBxdWVyeSkuIE5vdGUgdGhhdCBidWZmZXIgZm9yIHF1ZXJ5IGRhdGEgd2lsbCBiZSBhbGxvY2F0ZWQgYWxvbmcgd2l0aCB0aGUKKyAqICAgICAgcXVlcnkgZGVzY3JpcHRvci4gVXNlIHNka2N0bF9xdWVyeV9nZXRfYnVmZmVyX2luIHRvIGdldCBhZGRyZXNzIG9mIGRhdGEKKyAqICAgICAgYnVmZmVyIGZvciB0aGlzIHF1ZXJ5LgorICogIGluX2RhdGEgLSBEYXRhIHRvIGluaXRpYWxpemUgcXVlcnkncyBpbnB1dCBidWZmZXIgd2l0aC4KKyAqICByZXNwb25zZV9idWZmZXIgLSBDb250YWlucyBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYWRkcmVzc2luZyBwcmVhbGxvY2F0ZWQKKyAqICAgICAgcmVzcG9uc2UgYnVmZmVyIG9uIHRoZSB3YXkgaW4sIGFuZCBhZGRyZXNzIG9mIHRoZSBidWZmZXIgY29udGFpbmluZyBxdWVyeQorICogICAgICByZXNwb25zZSBvbiBxdWVyeSBjb21wbGV0aW9uLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCB0aGUgQVBJIHdpbGwKKyAqICAgICAgYWxsb2NhdGUgaXRzIG93biBxdWVyeSByZXNwb25zZSBidWZmZXIsIHdoaWNoIGlzIGdvaW5nIHRvIGJlIGZyZWVkIGFmdGVyCisgKiAgICAgIHF1ZXJ5IGNvbXBsZXRpb24uCisgKiAgcmVzcG9uc2Vfc2l6ZSAtIENvbnRhaW5zIHNpemUgb2YgcHJlYWxsb2NhdGVkIHJlc3BvbnNlIGJ1ZmZlciBvbiB0aGUgd2F5IGluLAorICogICAgICBhbmQgc2l6ZSBvZiB0aGUgcmVjZWl2ZWQgcmVzcG9uc2Ugb24gcXVlcnkgY29tcGxldGlvbi4gQ2FuIGJlIE5VTEwuCisgKiAgcXVlcnlfY2IgLSBBIGNhbGxiYWNrIHRvIG1vbml0b3IgcXVlcnkgc3RhdGUuCisgKiAgcXVlcnlfb3BhcXVlIC0gQW4gb3BhcXVlIHBvaW50ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBxdWVyeS4KKyAqIFJldHVybjoKKyAqICBSZWZlcmVuY2VkIFNES0N0bFF1ZXJ5IGRlc2NyaXB0b3IuCisgKi8KK2V4dGVybiBTREtDdGxRdWVyeSogc2RrY3RsX3F1ZXJ5X25ld19leChTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVlcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbl9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcmVzcG9uc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiByZXNwb25zZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9xdWVyeV9jYiBxdWVyeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBxdWVyeV9vcGFxdWUpOworCisvKiBTZW5kcyBxdWVyeSB0byBTREsgY29udHJvbGxlci4KKyAqIFBhcmFtOgorICogIHF1ZXJ5IC0gUXVlcnkgdG8gc2VuZC4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBhIGZ1bGx5IGluaXRpYWxpemVkIHF1ZXJ5CisgKiAgICAgIGRlc2NyaXB0b3IuCisgKiAgdG8gLSBNaWxsaXNlY29uZHMgdG8gYWxsb3cgZm9yIHRoZSBxdWVyeSB0byBjb21wbGV0ZS4gTmVnYXRpdmUgdmFsdWUgbWVhbnMKKyAqICAiZm9yZXZlciIuCisgKi8KK2V4dGVybiB2b2lkIHNka2N0bF9xdWVyeV9zZW5kKFNES0N0bFF1ZXJ5KiBxdWVyeSwgaW50IHRvKTsKKworLyogQ3JlYXRlcywgZnVsbHkgaW5pdGlhbGl6ZXMgcXVlcnkgZGVzY3JpcHRvciwgYW5kIHNlbmRzIHRoZSBxdWVyeSB0byBTREsKKyAqIGNvbnRyb2xsZXIuCisgKiBOb3RlIHRoYXQgcmV0dXJuZWQgZGVzY3JpcHRvciBpcyByZWZlcmVuY2VkLCBhbmQgaXQgbXVzdCBiZSBldmVudHVhbGx5CisgKiByZWxlYXNlZCB3aXRoIGEgY2FsbCB0byBzZGtjdGxfcXVlcnlfcmVsZWFzZS4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIFNES0N0bFNvY2tldCBpbnN0YW5jZSBmb3IgdGhlIHF1ZXJ5LgorICogIHF1ZXJ5X3R5cGUgLSBEZWZpbmVzIHF1ZXJ5IHR5cGUuCisgKiAgaW5fZGF0YV9zaXplIFNpemUgb2YgdGhlIHF1ZXJ5J3MgaW5wdXQgYnVmZmVyIChkYXRhIHRvIGJlIHNlbnQgd2l0aCB0aGlzCisgKiAgICAgIHF1ZXJ5KS4gTm90ZSB0aGF0IGJ1ZmZlciBmb3IgcXVlcnkgZGF0YSB3aWxsIGJlIGFsbG9jYXRlZCBhbG9uZyB3aXRoIHRoZQorICogICAgICBxdWVyeSBkZXNjcmlwdG9yLiBVc2Ugc2RrY3RsX3F1ZXJ5X2dldF9idWZmZXJfaW4gdG8gZ2V0IGFkZHJlc3Mgb2YgZGF0YQorICogICAgICBidWZmZXIgZm9yIHRoaXMgcXVlcnkuCisgKiAgaW5fZGF0YSAtIERhdGEgdG8gaW5pdGlhbGl6ZSBxdWVyeSdzIGlucHV0IGJ1ZmZlciB3aXRoLgorICogIHJlc3BvbnNlX2J1ZmZlciAtIENvbnRhaW5zIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhZGRyZXNzaW5nIHByZWFsbG9jYXRlZAorICogICAgICByZXNwb25zZSBidWZmZXIgb24gdGhlIHdheSBpbiwgYW5kIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHF1ZXJ5CisgKiAgICAgIHJlc3BvbnNlIG9uIHF1ZXJ5IGNvbXBsZXRpb24uIElmIHRoaXMgcGFyYW1ldGVyIGlzIE5VTEwsIHRoZSBBUEkgd2lsbAorICogICAgICBhbGxvY2F0ZSBpdHMgb3duIHF1ZXJ5IHJlc3BvbnNlIGJ1ZmZlciwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgZnJlZWQgYWZ0ZXIKKyAqICAgICAgcXVlcnkgY29tcGxldGlvbi4KKyAqICByZXNwb25zZV9zaXplIC0gQ29udGFpbnMgc2l6ZSBvZiBwcmVhbGxvY2F0ZWQgcmVzcG9uc2UgYnVmZmVyIG9uIHRoZSB3YXkgaW4sCisgKiAgICAgIGFuZCBzaXplIG9mIHRoZSByZWNlaXZlZCByZXNwb25zZSBvbiBxdWVyeSBjb21wbGV0aW9uLiBDYW4gYmUgTlVMTC4KKyAqICBxdWVyeV9jYiAtIEEgY2FsbGJhY2sgdG8gbW9uaXRvciBxdWVyeSBzdGF0ZS4KKyAqICBxdWVyeV9vcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXJ5LgorICogIHRvIC0gTWlsbGlzZWNvbmRzIHRvIGFsbG93IGZvciB0aGUgcXVlcnkgdG8gY29tcGxldGUuIE5lZ2F0aXZlIHZhbHVlIG1lYW5zCisgKiAgImZvcmV2ZXIiLgorICogUmV0dXJuOgorICogIFJlZmVyZW5jZWQgU0RLQ3RsUXVlcnkgZGVzY3JpcHRvciBmb3IgdGhlIHF1ZXJ5IHRoYXQgaGFzIGJlZW4gc2VudC4KKyAqLworZXh0ZXJuIFNES0N0bFF1ZXJ5KiBzZGtjdGxfcXVlcnlfYnVpbGRfYW5kX3NlbmQoU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVlcnlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcmVzcG9uc2VfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHJlc3BvbnNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbl9zZGtjdGxfcXVlcnlfY2IgcXVlcnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBxdWVyeV9vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG8pOworCisvKiBSZWZlcmVuY2VzIFNES0N0bFF1ZXJ5IG9iamVjdC4KKyAqIFBhcmFtOgorICogIHF1ZXJ5IC0gSW5pdGlhbGl6ZWQgU0RLQ3RsUXVlcnkgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfcXVlcnlfcmVmZXJlbmNlKFNES0N0bFF1ZXJ5KiBxdWVyeSk7CisKKy8qIFJlbGVhc2VzIFNES0N0bFF1ZXJ5IG9iamVjdC4KKyAqIE5vdGUgdGhhdCB1cG9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUgdGhlIG9iamVjdCBtaWdodCBiZSBkZXN0cm95ZWQsIGV2ZW4gaWYKKyAqIHRoaXMgcm91dGluZSByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gemVyby4KKyAqIFBhcmFtOgorICogIHF1ZXJ5IC0gSW5pdGlhbGl6ZWQgU0RLQ3RsUXVlcnkgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfcXVlcnlfcmVsZWFzZShTREtDdGxRdWVyeSogcXVlcnkpOworCisvKiBHZXRzIGFkZHJlc3Mgb2YgcXVlcnkncyBpbnB1dCBkYXRhIGJ1ZmZlciAoZGF0YSB0byBiZSBzZW5kKS4KKyAqIFBhcmFtOgorICogIHF1ZXJ5IC0gUXVlcnkgdG8gZ2V0IGRhdGEgYnVmZmVyIGZvci4KKyAqIFJldHVybjoKKyAqICBBZGRyZXNzIG9mIHF1ZXJ5J3MgaW5wdXQgZGF0YSBidWZmZXIuCisgKi8KK2V4dGVybiB2b2lkKiBzZGtjdGxfcXVlcnlfZ2V0X2J1ZmZlcl9pbihTREtDdGxRdWVyeSogcXVlcnkpOworCisvKiBHZXRzIGFkZHJlc3Mgb2YgcXVlcnkncyBvdXRwdXQgZGF0YSBidWZmZXIgKHJlc3BvbnNlIGRhdGEpLgorICogUGFyYW06CisgKiAgcXVlcnkgLSBRdWVyeSB0byBnZXQgZGF0YSBidWZmZXIgZm9yLgorICogUmV0dXJuOgorICogIEFkZHJlc3Mgb2YgcXVlcnkncyBvdXRwdXQgZGF0YSBidWZmZXIuCisgKi8KK2V4dGVybiB2b2lkKiBzZGtjdGxfcXVlcnlfZ2V0X2J1ZmZlcl9vdXQoU0RLQ3RsUXVlcnkqIHF1ZXJ5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsU29ja2V0IEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDcmVhdGVzIGFuIFNESyBjb250cm9sbGVyIHNvY2tldCBkZXNjcmlwdG9yLgorICogUGFyYW06CisgKiAgcmVjb25uZWN0X3RvIC0gVGltZW91dCBiZWZvcmUgdHJ5aW5nIHRvIHJlY29ubmVjdCwgb3IgcmV0cnkgY29ubmVjdGlvbgorICogICAgICBhdHRlbXB0cyBhZnRlciBkaXNjb25uZWN0aW9uLCBvciBvbiBjb25uZWN0aW9uIGZhaWx1cmVzLgorICogIHNlcnZpY2VfbmFtZSAtIE5hbWUgb2YgdGhlIFNka0NvbnRyb2xsZXIgc2VydmljZSBmb3IgdGhpcyBzb2NrZXQgKHN1Y2ggYXMKKyAqICAgICAgJ3NlbnNvcnMnLCAnbWlsdGktdG91Y2gnLCBldGMuKQorICogIG9uX3NvY2tldF9jb25uZWN0aW9uIC0gQSBjYWxsYmFjayB0byBpbnZva2Ugb24gc29ja2V0IGNvbm5lY3Rpb24gZXZlbnRzLgorICogIG9uX3BvcnRfY29ubmVjdGlvbiAtIEEgY2FsbGJhY2sgdG8gaW52b2tlIG9uIHBvcnQgY29ubmVjdGlvbiBldmVudHMuCisgKiAgb25fbWVzc2FnZSAtIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGZyb20gdGhlIFNESworICogICAgICBjb250cm9sbGVyLgorICogIG9wYXF1ZSAtIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBzb2NrZXQuCisgKiBSZXR1cm46CisgKiAgSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAqLworZXh0ZXJuIFNES0N0bFNvY2tldCogc2RrY3RsX3NvY2tldF9uZXcoaW50IHJlY29ubmVjdF90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9zb2NrZXRfY29ubmVjdGlvbl9jYiBvbl9zb2NrZXRfY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uX3Nka2N0bF9wb3J0X2Nvbm5lY3Rpb25fY2Igb25fcG9ydF9jb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fc2RrY3RsX21lc3NhZ2VfY2Igb25fbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSk7CisKKy8qIEltcHJvdmVzIHRocm91Z2hwdXQgYnkgcmVjeWNsaW5nIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGJ1ZmZlcnMgdHJhbnNmZXJyZWQgdmlhCisgKiB0aGlzIEFQSS4KKyAqCisgKiBJbiBtYW55IGNhc2VzIGRhdGEgZXhjaGFuZ2VkIGJldHdlZW4gU0RLIGNvbnRyb2xsZXIgc2lkZXMgYXJlIHNtYWxsLCBhbmQsCisgKiBhbHRob3VnaCBtYXkgY29tZSBxdWl0ZSBvZnRlbiwgYXJlIGNvbWluZyBpbiBhIHNlcXVlbnRpYWwgbWFubmVyLiBGb3IgaW5zdGFuY2UsCisgKiBzZW5zb3Igc2VydmljZSBvbiB0aGUgZGV2aWNlIG1heSBzZW5kIHVzIHNlbnNvciB1cGRhdGVzIGV2ZXJ5IDIwbXMsIG9uZSBhZnRlcgorICogYW5vdGhlci4gRm9yIHN1Y2ggZGF0YSB0cmFmZmljIGl0IG1ha2VzIHBlcmZlY3Qgc2Vuc2UgdG8gcmVjeWNsZSBtZW1vcnkKKyAqIGFsbG9jYXRlZCBmb3IgdGhlIHByZXZpb3VzIHNlbnNvciB1cGRhdGUsIHJhdGhlciB0aGFuIHRvIGZyZWUgaXQganVzdCB0bworICogcmVhbGxvY2F0ZSBzYW1lIGJ1ZmZlciBpbiAyMG1zLiBUaGlzIHJvdXRpbmUgc2V0cyBwcm9wZXJ0aWVzIG9mIHRoZSByZWN5Y2xlcgorICogZm9yIHRoZSBnaXZlbiBTREsgY29udHJvbGxlciBjb25uZWN0aW9uLiBSZWN5Y2xpbmcgaW5jbHVkZXMgbWVtb3J5IGFsbG9jYXRlZAorICogZm9yIGFsbCB0eXBlcyBvZiBkYXRhIHRyYW5zZmVycmVkIGluIHRoaXMgQVBJOiBwYWNrZXRzLCBhbmQgcXVlcmllcy4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIEluaXRpYWxpemVkIFNES0N0bFNvY2tldCBpbnN0YW5jZS4KKyAqICBkYXRhX3NpemUgLSBTaXplIG9mIGJ1ZmZlciB0byBhbGxvY2F0ZSBmb3IgZWFjaCBkYXRhIGJsb2NrLgorICogIG1heF9yZWN5Y2xlZF9udW0gLSBNYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0ZWQgYnVmZmVycyB0byBrZWVwIGluIHRoZQorICogICAgICByZWN5Y2xlci4KKyAqLworZXh0ZXJuIHZvaWQgc2RrY3RsX2luaXRfcmVjeWNsZXIoU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JlY3ljbGVkX251bSk7CisKKy8qIFJlZmVyZW5jZXMgU0RLQ3RsU29ja2V0IG9iamVjdC4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIEluaXRpYWxpemVkIFNES0N0bFNvY2tldCBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICovCitleHRlcm4gaW50IHNka2N0bF9zb2NrZXRfcmVmZXJlbmNlKFNES0N0bFNvY2tldCogc2RrY3RsKTsKKworLyogUmVsZWFzZXMgU0RLQ3RsU29ja2V0IG9iamVjdC4KKyAqIE5vdGUgdGhhdCB1cG9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUgdGhlIG9iamVjdCBtaWdodCBiZSBkZXN0cm95ZWQsIGV2ZW4gaWYKKyAqIHRoaXMgcm91dGluZSByZXR1cm5zIHZhbHVlIG90aGVyIHRoYW4gemVyby4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIEluaXRpYWxpemVkIFNES0N0bFNvY2tldCBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0LgorICovCitleHRlcm4gaW50IHNka2N0bF9zb2NrZXRfcmVsZWFzZShTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIEFzeW5jaHJvbm91c2x5IGNvbm5lY3RzIHRvIFNESyBjb250cm9sbGVyLgorICogUGFyYW06CisgKiAgc2RrY3RsIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlLgorICogIHBvcnQgLSBUQ1AgcG9ydCB0byBjb25uZWN0IHRoZSBzb2NrZXQgdG8uCisgKiAgcmV0cnlfdG8gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIGEgZmFpbGVkCisgKiAgICAgIGNvbm5lY3Rpb24gYXR0ZW1wdC4KKyAqLworZXh0ZXJuIHZvaWQgc2RrY3RsX3NvY2tldF9jb25uZWN0KFNES0N0bFNvY2tldCogc2RrY3RsLCBpbnQgcG9ydCwgaW50IHJldHJ5X3RvKTsKKworLyogQXN5bmNocm9ub3VzbHkgcmVjb25uZWN0cyB0byBTREsgY29udHJvbGxlci4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIEluaXRpYWxpemVkIFNES0N0bFNvY2tldCBpbnN0YW5jZS4KKyAqICBwb3J0IC0gVENQIHBvcnQgdG8gcmVjb25uZWN0IHRoZSBzb2NrZXQgdG8uCisgKiAgcmV0cnlfdG8gLSBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHJlY29ubmVjdGluZy4gU2FtZSB0aW1lb3V0CisgKiAgICAgIHdpbGwgYmUgdXNlZCBmb3IgcmV0cnlpbmcgYSBmYWlsZWQgY29ubmVjdGlvbiBhdHRlbXB0LgorICovCitleHRlcm4gdm9pZCBzZGtjdGxfc29ja2V0X3JlY29ubmVjdChTREtDdGxTb2NrZXQqIHNka2N0bCwgaW50IHBvcnQsIGludCByZXRyeV90byk7CisKKy8qIERpc2Nvbm5lY3RzIGZyb20gU0RLIGNvbnRyb2xsZXIuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBJbml0aWFsaXplZCBTREtDdGxTb2NrZXQgaW5zdGFuY2UuCisgKi8KK2V4dGVybiB2b2lkIHNka2N0bF9zb2NrZXRfZGlzY29ubmVjdChTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIENoZWNrcyBpZiBTREsgY29udHJvbGxlciBzb2NrZXQgaXMgY29ubmVjdGVkLgorICogUGFyYW06CisgKiAgc2RrY3RsIC0gSW5pdGlhbGl6ZWQgU0RLQ3RsU29ja2V0IGluc3RhbmNlLgorICogUmV0dXJuOgorICogIEJvb2xlYW46IDEgaWYgc29ja2V0IGlzIGNvbm5lY3RlZCwgMCBpZiBzb2NrZXQgaXMgbm90IGNvbm5lY3RlZC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfc29ja2V0X2lzX2Nvbm5lY3RlZChTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIENoZWNrcyBpZiBTREsgY29udHJvbGxlciBwb3J0IGlzIHJlYWR5IGZvciBlbXVsYXRpb24uCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBJbml0aWFsaXplZCBTREtDdGxTb2NrZXQgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgQm9vbGVhbjogMSBpZiBwb3J0IGlzIHJlYWR5LCAwIGlmIHBvcnQgaXMgbm90IHJlYWR5LgorICovCitleHRlcm4gaW50IHNka2N0bF9zb2NrZXRfaXNfcG9ydF9yZWFkeShTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIEdldHMgc3RhdHVzIG9mIHRoZSBTREsgY29udHJvbGxlciBwb3J0IGZvciB0aGlzIHNvY2tldC4KKyAqIFBhcmFtOgorICogIHNka2N0bCAtIEluaXRpYWxpemVkIFNES0N0bFNvY2tldCBpbnN0YW5jZS4KKyAqIFJldHVybjoKKyAqICBTdGF0dXMgb2YgdGhlIFNESyBjb250cm9sbGVyIHBvcnQgZm9yIHRoaXMgc29ja2V0LgorICovCitleHRlcm4gU2RrQ3RsUG9ydFN0YXR1cyBzZGtjdGxfc29ja2V0X2dldF9wb3J0X3N0YXR1cyhTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKKy8qIENoZWNrcyBpZiBoYW5kc2hha2Ugd2FzIHN1Y2Nlc3NmdWwuCisgKiBQYXJhbToKKyAqICBzZGtjdGwgLSBJbml0aWFsaXplZCBTREtDdGxTb2NrZXQgaW5zdGFuY2UuCisgKiBSZXR1cm46CisgKiAgQm9vbGVhbjogMSBpZiBoYW5kc2hha2Ugd2FzIHN1Y2Nlc3NmdWwsIDAgaWYgaGFuZHNoYWtlIHdhcyBub3Qgc3VjY2Vzc2Z1bC4KKyAqLworZXh0ZXJuIGludCBzZGtjdGxfc29ja2V0X2lzX2hhbmRzaGFrZV9vayhTREtDdGxTb2NrZXQqIHNka2N0bCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NlbnNvcnMtcG9ydC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NlbnNvcnMtcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTYxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2Vuc29ycy1wb3J0LmMKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9zZGstY29udHJvbGxlci1zb2NrZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NlbnNvcnMtcG9ydC5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctc2Vuc29ycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lICBFKC4uLikgICAgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSAgVyguLi4pICAgIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSAgRCguLi4pICAgIFZFUkJPU0VfUFJJTlQoc2Vuc29yc19wb3J0LF9fVkFfQVJHU19fKQorI2RlZmluZSAgRF9BQ1RJVkUgIFZFUkJPU0VfQ0hFQ0soc2Vuc29yc19wb3J0KQorCisjZGVmaW5lIFRSQUNFX09OICAgIDEKKworI2lmIFRSQUNFX09OCisjZGVmaW5lICBUKC4uLikgICAgVkVSQk9TRV9QUklOVChzZW5zb3JzX3BvcnQsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgVCguLi4pCisjZW5kaWYKKworLyogVGltZW91dCAobWlsbGlzZWMpIHRvIHVzZSB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCBTREsgY29udHJvbGxlci4gKi8KKyNkZWZpbmUgU0RLQ1RMX1NFTlNPUlNfVElNRU9VVCAgICAgIDMwMDAKKworLyoKKyAqIFF1ZXJpZXMgc2VudCB0byBzZW5zb3JzIHBvcnQgb2YgdGhlIFNESyBjb250cm9sbGVyLgorICovCisKKy8qIFF1ZXJpZXMgdGhlIHBvcnQgZm9yIGxpc3Qgb2YgYXZhaWxhYmxlIHNlbnNvcnMuICovCisjZGVmaW5lIFNES0NUTF9TRU5TT1JTX1FVRVJZX0xJU1QgICAxCisKKy8qCisgKiBNZXNzYWdlcyBzZW50IGJldHdlZW4gdGhlIGVtdWF0b3IsIGFuZCAgc2Vuc29ycyBwb3J0IG9mIHRoZSBTREsgY29udHJvbGxlci4KKyAqLworCisvKiBTdGFydHMgc2Vuc29yIGVtdWxhdGlvbi4gKi8KKyNkZWZpbmUgU0RLQ1RMX1NFTlNPUlNfU1RBUlQgICAgICAgICAgICAxCisvKiBTdG9wcyBzZW5zb3IgZW11bGF0aW9uLiAqLworI2RlZmluZSBTRU5TT1JfU0VOU09SU19TVE9QICAgICAgICAgICAgIDIKKy8qIEVuYWJsZXMgZW11bGF0aW9uIGZvciBhIHNlbnNvci4gKi8KKyNkZWZpbmUgU0RLQ1RMX1NFTlNPUlNfRU5BQkxFICAgICAgICAgICAzCisvKiBEaXNhYmxlcyBlbXVsYXRpb24gZm9yIGEgc2Vuc29yLiAqLworI2RlZmluZSBTREtDVExfU0VOU09SU19ESVNBQkxFICAgICAgICAgIDQKKy8qIFRoaXMgbWVzc2FnZSBkZWxpdmVycyBzZW5zb3IgdmFsdWVzLiAqLworI2RlZmluZSBTREtDVExfU0VOU09SU19TRU5TT1JfRVZFTlQgICAgIDUKKworCisvKiBEZXNjcmliZXMgYSBzZW5zb3Igb24gdGhlIGRldmljZS4KKyAqIFdoZW4gU0RLIGNvbnRyb2xsZXIgc2Vuc29ycyBwb3J0IHJlcGxpZXMgdG8gYSAibGlzdCIgcXVlcnksIGl0IHJlcGxpZXMgd2l0aAorICogYSBmbGF0IGJ1ZmZlciBjb250YWluaW5nIGVudHJpZXMgb2YgdGhpcyB0eXBlIGZvbGxvd2luZyBlYWNoIG90aGVyLiBFbmQgb2YKKyAqIGVhY2ggZW50cnkgaXMgYSB6ZXJvLXRlcm1pbmF0b3IgZm9yIGl0cyAnc2Vuc29yX25hbWUnIGZpZWxkLiBUaGUgZW5kIG9mIHRoZQorICogZW50aXJlIGxpc3QgaXMgbWFya2VkIHdpdGggYW4gZW50cnksIGNvbnRhaW5pbmcgLTEgYXQgaXRzICdzZW5zb3JfaWQnIGZpZWxkLgorICovCit0eXBlZGVmIHN0cnVjdCBTZW5zb3JFbnRyeSB7CisgICAgLyogSWRlbnRpZmllcyBzZW5zb3Igb24gdGhlIGRldmljZS4gVmFsdWUgLTEgaW5kaWNhdGVzIGxpc3QgdGVybWluYXRvciwKKyAgICAgKiByYXRoZXIgdGhhbiBhIHZhbGlkIHNlbnNvciBkZXNjcmlwdG9yLiAqLworICAgIGludCAgICAgc2Vuc29yX2lkOworICAgIC8qIEJlZ2lubmluZyBvZiB6ZXJvLXRlcm1pbmF0ZWQgc2Vuc29yIG5hbWUuICovCisgICAgY2hhciAgICBzZW5zb3JfbmFtZVsxXTsKK30gU2Vuc29yRW50cnk7CisKKy8qIERlc2NyaWJlcyBhIHNlbnNvciBpbiB0aGUgYXJyYXkgb2YgZW11bGF0ZWQgc2Vuc29ycy4gKi8KK3R5cGVkZWYgc3RydWN0IFNlbnNvckRlc2NyaXB0b3IgeworICAgIC8qIElkZW50aWZpZXMgc2Vuc29yIG9uIHRoZSBkZXZpY2UuICovCisgICAgaW50ICAgICAgICAgc2Vuc29yX2lkOworICAgIC8qIElkZW50aWZpZXMgc2Vuc29yIGluIGVtdWxhdG9yLiAqLworICAgIGludCAgICAgICAgIGVtdWxhdG9yX2lkOworICAgIC8qIFNlbnNvciBuYW1lLiAqLworICAgIGNoYXIqICAgICAgIHNlbnNvcl9uYW1lOworfSBTZW5zb3JEZXNjcmlwdG9yOworCisvKiBTZW5zb3IgZXZlbnQgbWVzc2FnZSBkZXNjcmlwdG9yLgorICogRW50cmllcyBvZiB0aGlzIHR5cGUgYXJlIHNlbnQgYWxvbmcgd2l0aCBTREtDVExfU0VOU09SU19TRU5TT1JfRVZFTlQgbWVzc2FnZQorICovCit0eXBlZGVmIHN0cnVjdCBTZW5zb3JFdmVudCB7CisgICAgLyogSWRlbnRpZmllcyBhIGRldmljZSBzZW5zb3IgZm9yIHdoaWNoIHZhbHVlcyBoYXZlIGJlZW4gZGVsaXZlcmVkLiAqLworICAgIGludCAgICAgc2Vuc29yX2lkOworICAgIC8qIFNlbnNvciB2YWx1ZXMuICovCisgICAgZmxvYXQgICBmdmFsdWVzWzNdOworfSBTZW5zb3JFdmVudDsKKworLyogU2Vuc29ycyBwb3J0IGRlc2NyaXB0b3IuICovCitzdHJ1Y3QgQW5kcm9pZFNlbnNvcnNQb3J0IHsKKyAgICAvKiBDYWxsZXIgaWRlbnRpZmllci4gKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgIG9wYXF1ZTsKKyAgICAvKiBDb21tdW5pY2F0aW9uIHNvY2tldC4gKi8KKyAgICBTREtDdGxTb2NrZXQqICAgICAgIHNka2N0bDsKKyAgICAvKiBMaXN0cyBzZW5zb3JzIGF2YWlsYWJsZSBmb3IgZW11bGF0aW9uLiAqLworICAgIFNlbnNvckRlc2NyaXB0b3IqKiAgc2Vuc29yczsKKyAgICAvKiBOdW1iZXIgb2Ygc2Vuc29ycyBpbiAnc2Vuc29ycycgbGlzdC4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgIHNlbnNvcnNfY291bnQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5zb3JzIHBvcnQgaW50ZXJuYWxzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2hlY2tzIGlmIHNlbnNvciBkZXNjcmlwdG9yIGlzIHRoZSB0ZXJtaW5hdG9yLgorICogUmV0dXJuOgorICogIEJvb2xlYW4sIDEgaWYgaXQgaXMgYSB0ZXJtaW5hdG9yLCAwIGlmIGl0IGlzIG5vdC4KKyAqLworc3RhdGljIGludAorX3NlbnNvcl9lbnRyeV9pc190ZXJtaW5hdG9yKGNvbnN0IFNlbnNvckVudHJ5KiBlbnRyeSkKK3sKKyAgICByZXR1cm4gZW50cnkgPT0gTlVMTCB8fCBlbnRyeS0+c2Vuc29yX2lkID09IC0xOworfQorCisvKiBHZXRzIG5leHQgc2Vuc29yIGRlc2NyaXB0b3IuCisgKiBSZXR1cm46CisgKiAgTmV4dCBzZW5zb3IgZGVzY2lwdG9yLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBubyBtb3JlIGRlc2NyaXB0b3JzIGluIHRoZSBsaXN0LgorICovCitzdGF0aWMgY29uc3QgU2Vuc29yRW50cnkqCitfc2Vuc29yX2VudHJ5X25leHQoY29uc3QgU2Vuc29yRW50cnkqIGVudHJ5KQoreworICAgIGlmICghX3NlbnNvcl9lbnRyeV9pc190ZXJtaW5hdG9yKGVudHJ5KSkgeworICAgICAgICAvKiBOZXh0IGRlc2NyaXB0b3IgYmVnaW5zIHJpZ2h0IGFmdGVyIHplcm8tdGVybWluYXRvciBmb3IgdGhlIHNlbnNvcl9uYW1lCisgICAgICAgICAqIGZpZWxkIG9mIHRoaXMgZGVzY3JpcHRvci4gKi8KKyAgICAgICAgZW50cnkgPSAoY29uc3QgU2Vuc29yRW50cnkqKShlbnRyeS0+c2Vuc29yX25hbWUgKyBzdHJsZW4oZW50cnktPnNlbnNvcl9uYW1lKSArIDEpOworICAgICAgICBpZiAoIV9zZW5zb3JfZW50cnlfaXNfdGVybWluYXRvcihlbnRyeSkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogR2V0cyBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbGlzdC4gKi8KK3N0YXRpYyBpbnQKK19zZW5zb3JfZW50cnlfbGlzdF9zaXplKGNvbnN0IFNlbnNvckVudHJ5KiBlbnRyeSkgeworICAgIGludCByZXQgPSAwOworICAgIHdoaWxlICghX3NlbnNvcl9lbnRyeV9pc190ZXJtaW5hdG9yKGVudHJ5KSkgeworICAgICAgICByZXQrKzsKKyAgICAgICAgZW50cnkgPSBfc2Vuc29yX2VudHJ5X25leHQoZW50cnkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBEaXNjYXJkcyBzZW5zb3JzIHNhdmVkIGluIEFuZHJvaWRTZW5zb3JzUG9ydCdzIGFycmF5LiAqLworc3RhdGljIHZvaWQKK19zZW5zb3JzX3BvcnRfZGlzY2FyZF9zZW5zb3JzKEFuZHJvaWRTZW5zb3JzUG9ydCogYXNwKQoreworICAgIGlmIChhc3AtPnNlbnNvcnMgIT0gTlVMTCkgeworICAgICAgICBpbnQgbjsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGFzcC0+c2Vuc29yc19jb3VudDsgbisrKSB7CisgICAgICAgICAgICBpZiAoYXNwLT5zZW5zb3JzW25dICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGFzcC0+c2Vuc29yc1tuXS0+c2Vuc29yX25hbWUpOworICAgICAgICAgICAgICAgIEFGUkVFKGFzcC0+c2Vuc29yc1tuXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZShhc3AtPnNlbnNvcnMpOworICAgICAgICBhc3AtPnNlbnNvcnMgPSBOVUxMOworICAgIH0KKyAgICBhc3AtPnNlbnNvcnNfY291bnQgPSAwOworfQorCisKKy8qIERlc3Ryb3lzIGFuZCBmcmVlcyB0aGUgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyB2b2lkCitfc2Vuc29yc19wb3J0X2ZyZWUoQW5kcm9pZFNlbnNvcnNQb3J0KiBhc3ApCit7CisgICAgaWYgKGFzcCAhPSBOVUxMKSB7CisgICAgICAgIF9zZW5zb3JzX3BvcnRfZGlzY2FyZF9zZW5zb3JzKGFzcCk7CisgICAgICAgIGlmIChhc3AtPnNka2N0bCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZGtjdGxfc29ja2V0X3JlbGVhc2UoYXNwLT5zZGtjdGwpOworICAgICAgICB9CisgICAgICAgIEFGUkVFKGFzcCk7CisgICAgfQorfQorCisvKiBQYXJzZXMgZmxhdCBzZW5zb3IgbGlzdCwgYW5kIHNhdmVzIGl0cyBlbnRyaWVzIGludG8gJ3NlbnNvcnMnIGFycmF5IGZpbGVkIG9mCisgKiB0aGUgQW5kcm9pZFNlbnNvcnNQb3J0IGRlc2NyaXB0b3IuICovCitzdGF0aWMgdm9pZAorX3NlbnNvcnNfcG9ydF9zYXZlX3NlbnNvcnMoQW5kcm9pZFNlbnNvcnNQb3J0KiBhc3AsIGNvbnN0IFNlbnNvckVudHJ5KiBsaXN0KQoreworICAgIGNvbnN0IGludCBjb3VudCA9IF9zZW5zb3JfZW50cnlfbGlzdF9zaXplKGxpc3QpOworICAgIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgIGludCBuOworICAgICAgICAvKiBBbGxvY2F0ZSBhcnJheSBmb3Igc2Vuc29yIGRlc2NyaXB0b3JzLiAqLworICAgICAgICBhc3AtPnNlbnNvcnMgPSBtYWxsb2Moc2l6ZW9mKFNlbnNvckRlc2NyaXB0b3IqKSAqIGNvdW50KTsKKworICAgICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGZsYXQgc2Vuc29yIGxpc3QsIGZpbGxpbmcgdXAgYXJyYXkgb2YgZW11bGF0ZWQKKyAgICAgICAgICogc2Vuc29ycy4gKi8KKyAgICAgICAgY29uc3QgU2Vuc29yRW50cnkqIGVudHJ5ID0gX3NlbnNvcl9lbnRyeV9pc190ZXJtaW5hdG9yKGxpc3QpID8gTlVMTCA6IGxpc3Q7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBjb3VudCAmJiAgZW50cnkgIT0gTlVMTDsgbisrKSB7CisgICAgICAgICAgICAvKiBHZXQgZW11bGF0b3Itc2lkZSBJRCBmb3IgdGhlIHNlbnNvci4gPCAwIHZhbHVlIGluZGljYXRlcyB0aGF0CisgICAgICAgICAgICAgKiBzZW5zb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW11bGF0b3IuICovCisgICAgICAgICAgICBjb25zdCBpbnQgZW11bGF0b3JfaWQgPQorICAgICAgICAgICAgICAgIGFuZHJvaWRfc2Vuc29yc19nZXRfaWRfZnJvbV9uYW1lKChjaGFyKillbnRyeS0+c2Vuc29yX25hbWUpOworICAgICAgICAgICAgaWYgKGVtdWxhdG9yX2lkID49IDApIHsKKyAgICAgICAgICAgICAgICBTZW5zb3JEZXNjcmlwdG9yKiBkZXNjOworICAgICAgICAgICAgICAgIEFORVcwKGRlc2MpOworICAgICAgICAgICAgICAgIGRlc2MtPmVtdWxhdG9yX2lkICAgPSBlbXVsYXRvcl9pZDsKKyAgICAgICAgICAgICAgICBkZXNjLT5zZW5zb3JfaWQgICAgID0gZW50cnktPnNlbnNvcl9pZDsKKyAgICAgICAgICAgICAgICBkZXNjLT5zZW5zb3JfbmFtZSAgID0gQVNUUkRVUChlbnRyeS0+c2Vuc29yX25hbWUpOworCisgICAgICAgICAgICAgICAgYXNwLT5zZW5zb3JzW2FzcC0+c2Vuc29yc19jb3VudCsrXSA9IGRlc2M7CisgICAgICAgICAgICAgICAgRCgiU2Vuc29yczogRW11bGF0ZWQgc2Vuc29yICclcyc6IERldmljZSBpZCA9ICVkLCBFbXVsYXRvciBpZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgIGRlc2MtPnNlbnNvcl9uYW1lLCBkZXNjLT5zZW5zb3JfaWQsIGRlc2MtPmVtdWxhdG9yX2lkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRCgiU2Vuc29yczogU2Vuc29yICclcycgaXMgbm90IHN1cHBvcnQgYnkgZW11bGF0b3IiLAorICAgICAgICAgICAgICAgICAgZW50cnktPnNlbnNvcl9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJ5ID0gX3NlbnNvcl9lbnRyeV9uZXh0KGVudHJ5KTsKKyAgICAgICAgfQorICAgICAgICBEKCJTZW5zb3JzOiBFbXVsYXRpbmcgJWQgc2Vuc29ycyIsIGFzcC0+c2Vuc29yc19jb3VudCk7CisgICAgfQorfQorCisvKiBGaW5kcyBzZW5zb3IgZGVzY3JpcHRvciBmb3IgYW4gU0RLIGNvbnRyb2xsZXItc2lkZSBJRC4gKi8KK3N0YXRpYyBjb25zdCBTZW5zb3JEZXNjcmlwdG9yKgorX3NlbnNvcl9mcm9tX3Nka2N0bF9pZChBbmRyb2lkU2Vuc29yc1BvcnQqIGFzcCwgaW50IGlkKQoreworICAgIGludCBuOworICAgIGZvciAobiA9IDA7IG4gPCBhc3AtPnNlbnNvcnNfY291bnQ7IG4rKykgeworICAgICAgICBpZiAoYXNwLT5zZW5zb3JzW25dLT5zZW5zb3JfaWQgPT0gaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBhc3AtPnNlbnNvcnNbbl07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEluaXRpYXRlcyBzZW5zb3IgZW11bGF0aW9uLgorICogUGFyYW06CisgKiAgYXNwIC0gQW5kcm9pZCBzZW5zb3JzIHBvcnQgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSBzZW5zb3JzX3BvcnRfY3JlYXRlLgorICogUmV0dXJuOgorICogIFplcm8gb24gc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB2b2lkCitfc2Vuc29yc19wb3J0X3N0YXJ0KEFuZHJvaWRTZW5zb3JzUG9ydCogYXNwKQoreworICAgIGludCBuOworCisgICAgaWYgKCFzZGtjdGxfc29ja2V0X2lzX3BvcnRfcmVhZHkoYXNwLT5zZGtjdGwpKSB7CisgICAgICAgIC8qIFNESyBjb250cm9sbGVyIHNpZGUgaXMgbm90IHJlYWR5IGZvciBlbXVsYXRpb24uIFJldHJlYXQuLi4gKi8KKyAgICAgICAgRCgiU2Vuc29yczogU0RLIGNvbnRyb2xsZXIgc2lkZSBpcyBub3QgcmVhZHkgZm9yIGVtdWxhdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERpc2FibGUgYWxsIHNlbnNvcnMsIGFuZCByZWVuYWJsZSBvbmx5IHRob3NlIHRoYXQgYXJlIGVtdWxhdGVkIGJ5CisgICAgICogaGFyZHdhcmUuICovCisgICAgc2Vuc29yc19wb3J0X2Rpc2FibGVfc2Vuc29yKGFzcCwgImFsbCIpOworCisgICAgLyogV2FsayB0aHJvdWggdGhlIGxpc3Qgb2YgZW5hYmxlZCBzZW5zb3JzIGVuYWJsaW5nIHRoZW0gb24gdGhlIGRldmljZS4gKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgYXNwLT5zZW5zb3JzX2NvdW50OyBuKyspIHsKKyAgICAgICAgaWYgKGFuZHJvaWRfc2Vuc29yc19nZXRfc2Vuc29yX3N0YXR1cyhhc3AtPnNlbnNvcnNbbl0tPmVtdWxhdG9yX2lkKSA9PSAxKSB7CisgICAgICAgICAgICAvKiBSZWVuYWJsZSBlbXVsYXRpb24gZm9yIHRoaXMgc2Vuc29yLiAqLworICAgICAgICAgICAgc2Vuc29yc19wb3J0X2VuYWJsZV9zZW5zb3IoYXNwLCBhc3AtPnNlbnNvcnNbbl0tPnNlbnNvcl9uYW1lKTsKKyAgICAgICAgICAgIEQoIlNlbnNvcnM6IFNlbnNvciAnJXMnIGlzIGVuYWJsZWQgb24gU0RLIGNvbnRyb2xsZXIuIiwKKyAgICAgICAgICAgICAgYXNwLT5zZW5zb3JzW25dLT5zZW5zb3JfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdGFydCB0aGUgZW11bGF0aW9uLiAqLworICAgIFNES0N0bE1lc3NhZ2UqIGNvbnN0IG1zZyA9CisgICAgICAgIHNka2N0bF9tZXNzYWdlX3NlbmQoYXNwLT5zZGtjdGwsIFNES0NUTF9TRU5TT1JTX1NUQVJULCBOVUxMLCAwKTsKKyAgICBzZGtjdGxfbWVzc2FnZV9yZWxlYXNlKG1zZyk7CisKKyAgICBEKCJTZW5zb3JzOiBFbXVsYXRpb24gaGFzIGJlZW4gc3RhcnRlZC4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vuc29ycyBwb3J0IGNhbGxiYWNrcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvbXBsZXRpb24gZm9yIHRoZSAibGlzdCIgcXVlcnkuICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX3NlbnNvcl9saXN0X3F1ZXJ5KHZvaWQqIHF1ZXJ5X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBTREtDdGxRdWVyeSogcXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgQXN5bmNJT1N0YXRlIHN0YXR1cykKK3sKKyAgICBBbmRyb2lkU2Vuc29yc1BvcnQqIGNvbnN0IGFzcCA9IChBbmRyb2lkU2Vuc29yc1BvcnQqKShxdWVyeV9vcGFxdWUpOworICAgIGlmIChzdGF0dXMgIT0gQVNJT19TVEFURV9TVUNDRUVERUQpIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgZmFpbHVyZXMgYXQgdGhpcyBwb2ludC4gVGhleSB3aWxsCisgICAgICAgICAqIGV2ZW50dWFsbHkgc3VyZmFjZSB1cCBpbiBhbm90aGVyIHBsYWNlLiAqLworICAgICAgICByZXR1cm4gQVNJT19BQ1RJT05fRE9ORTsKKyAgICB9CisKKyAgICAvKiBQYXJzZSBxdWVyeSByZXNwb25zZSB3aGljaCBpcyBhIGZsYXQgbGlzdCBvZiBTZW5zb3JFbnRyeSBlbnRyaWVzLiAqLworICAgIGNvbnN0IFNlbnNvckVudHJ5KiBjb25zdCBsaXN0ID0KKyAgICAgICAgKGNvbnN0IFNlbnNvckVudHJ5KilzZGtjdGxfcXVlcnlfZ2V0X2J1ZmZlcl9vdXQocXVlcnkpOworICAgIEQoIlNlbnNvcnM6IFNlbnNvciBsaXN0IHJlY2VpdmVkIHdpdGggJWQgc2Vuc29ycy4iLAorICAgICAgX3NlbnNvcl9lbnRyeV9saXN0X3NpemUobGlzdCkpOworICAgIF9zZW5zb3JzX3BvcnRfc2F2ZV9zZW5zb3JzKGFzcCwgbGlzdCk7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSByZWFkeSB0byBzdGF0ciBzZW5zb3IgZW11bGF0aW9uLiAqLworICAgIF9zZW5zb3JzX3BvcnRfc3RhcnQoYXNwKTsKKworICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBvbiBzZW5zb3IgZXZlbnRzLgorICogUGFyYW06CisgKiAgYXNwIC0gQW5kcm9pZFNlbnNvcnNQb3J0IGluc3RhbmNlLgorICogIGV2ZW50IC0gU2Vuc29yIGV2ZW50LgorICovCitzdGF0aWMgdm9pZAorX29uX3NlbnNvcl9ldmVudChBbmRyb2lkU2Vuc29yc1BvcnQqIGFzcCwgY29uc3QgU2Vuc29yRXZlbnQqIGV2ZW50KQoreworICAgIC8qIEZpbmQgY29ycmVzcG9uZGluZyBzZXJ2ZXIgZGVzY3JpcHRvci4gKi8KKyAgICBjb25zdCBTZW5zb3JEZXNjcmlwdG9yKiBjb25zdCBkZXNjID0KKyAgICAgICAgX3NlbnNvcl9mcm9tX3Nka2N0bF9pZChhc3AsIGV2ZW50LT5zZW5zb3JfaWQpOworICAgIGlmIChkZXNjICE9IE5VTEwpIHsKKyAgICAgICAgVCgiU2Vuc29yczogJXMgLT4gJWYsICVmLCAlZiIsIGRlc2MtPnNlbnNvcl9uYW1lLAorICAgICAgICAgIGV2ZW50LT5mdmFsdWVzWzBdLCBldmVudC0+ZnZhbHVlc1sxXSwKKyAgICAgICAgICBldmVudC0+ZnZhbHVlc1syXSk7CisgICAgICAgIC8qIEZpcmUgdXAgc2Vuc29yIGNoYW5nZSBpbiB0aGUgZ3Vlc3QuICovCisgICAgICAgIGFuZHJvaWRfc2Vuc29yc19zZXQoZGVzYy0+ZW11bGF0b3JfaWQsIGV2ZW50LT5mdmFsdWVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5mdmFsdWVzWzFdLCBldmVudC0+ZnZhbHVlc1syXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVygiU2Vuc29yczogTm8gZGVzY3JpcHRvciBmb3Igc2Vuc29yICVkIiwgZXZlbnQtPnNlbnNvcl9pZCk7CisgICAgfQorfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBvbiBTREsgY29udHJvbGxlciBzb2NrZXQgY29ubmVjdGlvbiBldmVudHMuICovCitzdGF0aWMgQXN5bmNJT0FjdGlvbgorX29uX3NlbnNvcnNfc29ja2V0X2Nvbm5lY3Rpb24odm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jSU9TdGF0ZSBzdGF0dXMpCit7CisgICAgQW5kcm9pZFNlbnNvcnNQb3J0KiBjb25zdCBhc3AgPSAoQW5kcm9pZFNlbnNvcnNQb3J0KiljbGllbnRfb3BhcXVlOworICAgIGlmIChzdGF0dXMgPT0gQVNJT19TVEFURV9GQUlMRUQpIHsKKyAgICAgICAgLyogRGlzY29ubmVjdGlvbiBjb3VsZCBtZWFuIHRoYXQgdXNlciBpcyBzd2FwcGluZyBkZXZpY2VzLiBOZXcgZGV2aWNlIG1heQorICAgICAgICAgKiBoYXZlIGRpZmZlcmVudCBzZXQgb2Ygc2Vuc29ycywgc28gd2UgbmVlZCB0byByZS1xdWVyeSBzZW5zb3IgbGlzdCBvbgorICAgICAgICAgKiByZWNvbm5lY3Rpb24uICovCisgICAgICAgIF9zZW5zb3JzX3BvcnRfZGlzY2FyZF9zZW5zb3JzKGFzcCk7CisKKyAgICAgICAgLyogUmVjb25uZWN0IChhZnRlciB0aW1lb3V0IGRlbGF5KSBvbiBmYWlsdXJlcyAqLworICAgICAgICBpZiAoc2RrY3RsX3NvY2tldF9pc19oYW5kc2hha2Vfb2soc2RrY3RsKSkgeworICAgICAgICAgICAgc2RrY3RsX3NvY2tldF9yZWNvbm5lY3Qoc2RrY3RsLCBTREtDVExfREVGQVVMVF9UQ1BfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0NUTF9TRU5TT1JTX1RJTUVPVVQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBU0lPX0FDVElPTl9ET05FOworfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCBvbiBTREsgY29udHJvbGxlciBwb3J0IGNvbm5lY3Rpb24gZXZlbnRzLiAqLworc3RhdGljIHZvaWQKK19vbl9zZW5zb3JzX3BvcnRfY29ubmVjdGlvbih2b2lkKiBjbGllbnRfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ3RsU29ja2V0KiBzZGtjdGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZGtDdGxQb3J0U3RhdHVzIHN0YXR1cykKK3sKKyAgICBBbmRyb2lkU2Vuc29yc1BvcnQqIGNvbnN0IGFzcCA9IChBbmRyb2lkU2Vuc29yc1BvcnQqKWNsaWVudF9vcGFxdWU7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBTREtDVExfUE9SVF9DT05ORUNURUQ6IHsKKyAgICAgICAgICAgIEQoIlNlbnNvcnM6IFNESyBDb250cm9sbGVyIGlzIGNvbm5lY3RlZC4iKTsKKyAgICAgICAgICAgIC8qIFF1ZXJ5IGxpc3Qgb2YgYXZhaWxhYmxlIHNlbnNvcnMuICovCisgICAgICAgICAgICBTREtDdGxRdWVyeSogY29uc3QgcXVlcnkgPQorICAgICAgICAgICAgICAgIHNka2N0bF9xdWVyeV9idWlsZF9hbmRfc2VuZChhc3AtPnNka2N0bCwgU0RLQ1RMX1NFTlNPUlNfUVVFUllfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uX3NlbnNvcl9saXN0X3F1ZXJ5LCBhc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0NUTF9TRU5TT1JTX1RJTUVPVVQpOworICAgICAgICAgICAgc2RrY3RsX3F1ZXJ5X3JlbGVhc2UocXVlcnkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNES0NUTF9QT1JUX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIF9zZW5zb3JzX3BvcnRfZGlzY2FyZF9zZW5zb3JzKGFzcCk7CisgICAgICAgICAgICBEKCJTZW5zb3JzOiBTREsgQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9QT1JUX0VOQUJMRUQ6CisgICAgICAgICAgICBfc2Vuc29yc19wb3J0X3N0YXJ0KGFzcCk7CisgICAgICAgICAgICBEKCJTZW5zb3JzOiBTREsgQ29udHJvbGxlciBpcyBlbmFibGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfUE9SVF9ESVNBQkxFRDoKKyAgICAgICAgICAgIEQoIlNlbnNvcnM6IFNESyBDb250cm9sbGVyIGlzIGRpc2FibGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIEQoIlNlbnNvcnM6IFNESyBDb250cm9sbGVyIGhhcyBzdWNjZWVkZWQgaGFuZHNoYWtlLCBhbmQgcG9ydCBpcyBjb25uZWN0ZWQuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNES0NUTF9IQU5EU0hBS0VfTk9fUE9SVDoKKyAgICAgICAgICAgIEQoIlNlbnNvcnM6IFNESyBDb250cm9sbGVyIGhhcyBzdWNjZWVkZWQgaGFuZHNoYWtlLCBhbmQgcG9ydCBpcyBub3QgY29ubmVjdGVkLiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX0RVUDoKKyAgICAgICAgICAgIEUoIlNlbnNvcnM6IFNESyBDb250cm9sbGVyIGhhcyBmYWlsZWQgdGhlIGhhbmRzaGFrZSBkdWUgdG8gcG9ydCBkdXBsaWNhdGlvbi4iKTsKKyAgICAgICAgICAgIHNka2N0bF9zb2NrZXRfZGlzY29ubmVjdChzZGtjdGwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTREtDVExfSEFORFNIQUtFX1VOS05PV05fUVVFUlk6CisgICAgICAgICAgICBFKCJTZW5zb3JzOiBTREsgQ29udHJvbGxlciBoYXMgZmFpbGVkIHRoZSBoYW5kc2hha2UgZHVlIHRvIHVua25vd24gcXVlcnkuIik7CisgICAgICAgICAgICBzZGtjdGxfc29ja2V0X2Rpc2Nvbm5lY3Qoc2RrY3RsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0RLQ1RMX0hBTkRTSEFLRV9VTktOT1dOX1JFU1BPTlNFOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRSgiU2Vuc29yczogSGFuZHNoYWtlIGhhcyBmYWlsZWQgZHVlIHRvIHVua25vd24gcmVhc29ucy4iKTsKKyAgICAgICAgICAgIHNka2N0bF9zb2NrZXRfZGlzY29ubmVjdChzZGtjdGwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBBIGNhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIFNESyBjb250cm9sbGVyLiAqLworc3RhdGljIHZvaWQKK19vbl9zZW5zb3JzX21lc3NhZ2Uodm9pZCogY2xpZW50X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICBTREtDdGxTb2NrZXQqIHNka2N0bCwKKyAgICAgICAgICAgICAgICAgICBTREtDdGxNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGludCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBtc2dfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbXNnX3NpemUpCit7CisgICAgQW5kcm9pZFNlbnNvcnNQb3J0KiBjb25zdCBhc3AgPSAoQW5kcm9pZFNlbnNvcnNQb3J0KiljbGllbnRfb3BhcXVlOworICAgIHN3aXRjaCAobXNnX3R5cGUpIHsKKyAgICAgICAgY2FzZSBTREtDVExfU0VOU09SU19TRU5TT1JfRVZFTlQ6CisgICAgICAgICAgICBfb25fc2Vuc29yX2V2ZW50KGFzcCwgKGNvbnN0IFNlbnNvckV2ZW50Kiltc2dfZGF0YSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRSgiU2Vuc29yczogVW5rbm93biBtZXNzYWdlIHR5cGUgJWQiLCBtc2dfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFNlbnNvcnMgcG9ydCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitBbmRyb2lkU2Vuc29yc1BvcnQqCitzZW5zb3JzX3BvcnRfY3JlYXRlKHZvaWQqIG9wYXF1ZSkKK3sKKyAgICBBbmRyb2lkU2Vuc29yc1BvcnQqIGFzcDsKKworICAgIEFORVcwKGFzcCk7CisgICAgYXNwLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgYXNwLT5zZW5zb3JzID0gTlVMTDsKKyAgICBhc3AtPnNlbnNvcnNfY291bnQgPSAwOworICAgIGFzcC0+c2RrY3RsID0gc2RrY3RsX3NvY2tldF9uZXcoU0RLQ1RMX1NFTlNPUlNfVElNRU9VVCwgInNlbnNvcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29uX3NlbnNvcnNfc29ja2V0X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fc2Vuc29yc19wb3J0X2Nvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb25fc2Vuc29yc19tZXNzYWdlLCBhc3ApOworICAgIHNka2N0bF9pbml0X3JlY3ljbGVyKGFzcC0+c2RrY3RsLCA3NiwgOCk7CisgICAgc2RrY3RsX3NvY2tldF9jb25uZWN0KGFzcC0+c2RrY3RsLCBTREtDVExfREVGQVVMVF9UQ1BfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RLQ1RMX1NFTlNPUlNfVElNRU9VVCk7CisgICAgcmV0dXJuIGFzcDsKK30KKwordm9pZAorc2Vuc29yc19wb3J0X2Rlc3Ryb3koQW5kcm9pZFNlbnNvcnNQb3J0KiBhc3ApCit7CisgICAgaWYgKGFzcC0+c2RrY3RsICE9IE5VTEwpIHsKKyAgICAgICAgc2RrY3RsX3NvY2tldF9kaXNjb25uZWN0KGFzcC0+c2RrY3RsKTsKKyAgICB9CisgICAgX3NlbnNvcnNfcG9ydF9mcmVlKGFzcCk7Cit9CisKK2ludAorc2Vuc29yc19wb3J0X2VuYWJsZV9zZW5zb3IoQW5kcm9pZFNlbnNvcnNQb3J0KiBhc3AsIGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgaWYgKGFzcC0+c2RrY3RsICE9IE5VTEwgJiYgc2RrY3RsX3NvY2tldF9pc19wb3J0X3JlYWR5KGFzcC0+c2RrY3RsKSkgeworICAgICAgICBTREtDdGxNZXNzYWdlKiBjb25zdCBtc2cgPSBzZGtjdGxfbWVzc2FnZV9zZW5kKGFzcC0+c2RrY3RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNES0NUTF9TRU5TT1JTX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzdHJsZW4obmFtZSkpOworICAgICAgICBzZGtjdGxfbWVzc2FnZV9yZWxlYXNlKG1zZyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludAorc2Vuc29yc19wb3J0X2Rpc2FibGVfc2Vuc29yKEFuZHJvaWRTZW5zb3JzUG9ydCogYXNwLCBjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGlmIChhc3AtPnNka2N0bCAhPSBOVUxMICYmIHNka2N0bF9zb2NrZXRfaXNfcG9ydF9yZWFkeShhc3AtPnNka2N0bCkpIHsKKyAgICAgICAgU0RLQ3RsTWVzc2FnZSogY29uc3QgbXNnID0gc2RrY3RsX21lc3NhZ2Vfc2VuZChhc3AtPnNka2N0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREtDVExfU0VOU09SU19ESVNBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHN0cmxlbihuYW1lKSk7CisgICAgICAgIHNka2N0bF9tZXNzYWdlX3JlbGVhc2UobXNnKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZW5zb3JzLXBvcnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZW5zb3JzLXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNkZmEyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NlbnNvcnMtcG9ydC5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworLyoKKyAqIEVuY2Fwc3VsYXRlcyBleGNoYW5nZSBwcm90b2NvbCBiZXR3ZWVuIHRoZSBzZW5zb3IgZW11bGF0b3IsIGFuZCBhbiBhcHBsaWNhdGlvbgorICogcnVubmluZyBvbiBhbiBBbmRyb2lkIGRldmljZSB0aGF0IHByb3ZpZGVzIHNlbnNvciB2YWx1ZXMsIGFuZCBpcyBjb25uZWN0ZWQgdG8KKyAqIHRoZSBob3N0IHZpYSBVU0IuCisgKi8KKworLyogRGVjbGFyZXMgc2Vuc29ycyBwb3J0IGRlc2NyaXB0b3IuICovCit0eXBlZGVmIHN0cnVjdCBBbmRyb2lkU2Vuc29yc1BvcnQgQW5kcm9pZFNlbnNvcnNQb3J0OworCisvKiBDcmVhdGVzIHNlbnNvcnMgcG9ydCwgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBkZXZpY2UuCisgKiBQYXJhbToKKyAqICBvcGFxdWUgLSBBbiBvcGFxdWUgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lcy4KKyAqIFJldHVybjoKKyAqICBJbml0aWFsaXplZCBkZXZpY2UgZGVzY3JpcHRvciBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuIElmIGZhaWx1cmUgaXMKKyAqICByZXR1cm5lZCBmcm9tIHRoaXMgcm91dGluZSwgJ2Vycm5vJyBpbmRpY2F0ZXMgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4gSWYgdGhpcworICogIHJvdXRpbmUgc3VjY2Vzc2VkcywgYSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkIHdpdGggdGhlIHNlbnNvciByZWFkaW5nCisgKiAgYXBwbGljYXRpb24gb24gdGhlIGRldmljZS4KKyAqLworZXh0ZXJuIEFuZHJvaWRTZW5zb3JzUG9ydCogc2Vuc29yc19wb3J0X2NyZWF0ZSh2b2lkKiBvcGFxdWUpOworCisvKiBEaXNjb25uZWN0cyBmcm9tIHRoZSBzZW5zb3JzIHBvcnQsIGFuZCBkZXN0cm95cyB0aGUgZGVzY3JpcHRvci4gKi8KK2V4dGVybiB2b2lkIHNlbnNvcnNfcG9ydF9kZXN0cm95KEFuZHJvaWRTZW5zb3JzUG9ydCogYXNwKTsKKworLyogRW5hYmxlcyBldmVudHMgZnJvbSBhIHBhcnRpY3VsYXIgc2Vuc29yLgorICogUGFyYW06CisgKiAgYXNwIC0gQW5kcm9pZCBzZW5zb3JzIHBvcnQgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSBzZW5zb3JzX3BvcnRfY3JlYXRlLgorICogIG5hbWUgLSBOYW1lIG9mIHRoZSBzZW5zb3IgdG8gZW5hYmxlIGV2ZW50cyBvbi4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgImFsbCIsCisgKiAgICAgIHRoZW4gZXZlbnRzIG9uIGFsbCBzZW5zb3JzIHdpbGwgYmUgZW5hYmxlZC4KKyAqIFJldHVybjoKKyAqICBaZXJvIG9uIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlLgorICovCitleHRlcm4gaW50IHNlbnNvcnNfcG9ydF9lbmFibGVfc2Vuc29yKEFuZHJvaWRTZW5zb3JzUG9ydCogYXNwLCBjb25zdCBjaGFyKiBuYW1lKTsKKworCisvKiBEaXNhYmxlcyBldmVudHMgZnJvbSBhIHBhcnRpY3VsYXIgc2Vuc29yLgorICogUGFyYW06CisgKiAgYXNwIC0gQW5kcm9pZCBzZW5zb3JzIHBvcnQgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSBzZW5zb3JzX3BvcnRfY3JlYXRlLgorICogIG5hbWUgLSBOYW1lIG9mIHRoZSBzZW5zb3IgdG8gZGlzYWJsZSBldmVudHMgb24uIElmIHRoaXMgcGFyYW1ldGVyIGlzICJhbGwiLAorICogICAgICB0aGVuIGV2ZW50cyBvbiBhbGwgc2Vuc29ycyB3aWxsIGJlIGRpc2FibGUuCisgKiBSZXR1cm46CisgKiAgWmVybyBvbiBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZS4KKyAqLworZXh0ZXJuIGludCBzZW5zb3JzX3BvcnRfZGlzYWJsZV9zZW5zb3IoQW5kcm9pZFNlbnNvcnNQb3J0KiBhc3AsIGNvbnN0IGNoYXIqIG5hbWUpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NldHRpbmdzLWFnZW50LWltcGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZXR0aW5ncy1hZ2VudC1pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmZjQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zZXR0aW5ncy1hZ2VudC1pbXBsLmgKQEAgLTAsMCArMSwxNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9zZXR0aW5ncy1hZ2VudC5oIgorCit2b2lkIHNldHRpbmdzX3NldEFkYlBvcnQoaW50IHBvcnROdW1iZXIpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NldHRpbmdzLWFnZW50LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2V0dGluZ3MtYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWVhNWNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NldHRpbmdzLWFnZW50LmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisKK2VudW0gU2V0dGluZ3NUaGVtZSB7IFNFVFRJTkdTX1RIRU1FX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgU0VUVElOR1NfVEhFTUVfREFSSywKKyAgICAgICAgICAgICAgICAgICAgIFNFVFRJTkdTX1RIRU1FX05VTV9FTlRSSUVTIH07CisKK3R5cGVkZWYgc3RydWN0IFNldHRpbmdzQWdlbnQgeworICAgIC8vIFNldHMgdGhlIElQIHBvcnQgdXNlZCBmb3IgdGhlIEFuZHJvaWQgRGVidWcgQnJpZGdlCisgICAgdm9pZCAoKnNldEFkYlBvcnQpKGludCBwb3J0TnVtYmVyKTsKKworfSBTZXR0aW5nc0FnZW50OworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zaGFwZXIuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zaGFwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTI3MzIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NoYXBlci5jCkBAIC0wLDAgKzEsNjA4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9zaGFwZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvY3Jhc2hyZXBvcnQvY3Jhc2gtaGFuZGxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworTmV0U2hhcGVyICBhbmRyb2lkX25ldF9zaGFwZXJfaW47CitOZXRTaGFwZXIgIGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQ7CitOZXREZWxheSAgIGFuZHJvaWRfbmV0X2RlbGF5X2luOworCisjZGVmaW5lICBTSEFQRVJfQ0xPQ0sgICAgICAgIExPT1BFUl9DTE9DS19SRUFMVElNRQorI2RlZmluZSAgU0hBUEVSX0NMT0NLX1VOSVQgICAxMDAwLgorCitzdGF0aWMgaW50CitfcGFja2V0X2lzX2ludGVybmFsKCBjb25zdCB1aW50OF90KiAgZGF0YSwgc2l6ZV90ICBzaXplICkKK3sKKyAgICBjb25zdCB1aW50OF90KiAgZW5kID0gZGF0YSArIHNpemU7CisKKyAgICAvKiBtdXN0IGhhdmUgcm9vbSBmb3IgTWFjICsgSVAgaGVhZGVyICovCisgICAgaWYgKGRhdGEgKyA0MCA+IGVuZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZGF0YVsxMl0gIT0gMHgwOCB8fCBkYXRhWzEzXSAhPSAweDAwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBtdXN0IGhhdmUgdmFsaWQgSVAgaGVhZGVyICovCisgICAgZGF0YSArPSAxNDsKKyAgICBpZiAoKGRhdGFbMF0gPj4gNCkgIT0gNCB8fCAoZGF0YVswXSAmIDE1KSA8IDUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogaW50ZXJuYWwgaWYgYm90aCBzb3VyY2UgYW5kIGRlc3QgYWRkcmVzc2VzIGFyZSBpbiAxMC54LngueCAqLworICAgIHJldHVybiAoIGRhdGFbMTJdID09IDEwICYmIGRhdGFbMTZdID09IDEwKTsKK30KKworLyogaGVyZSdzIGhvdyB3ZSBpbXBsZW1lbnQgbmV0d29yayBzaGFwaW5nLiB3ZSB3YW50IHRvIGxpbWl0IHRoZSBuZXR3b3JrCisgKiByYXRlIHRvIGEgZ2l2ZW4gY29uc3RhbnQgTUFYX1JBVEUgZXhwcmVzc2VkIGFzIGJpdHMvc2Vjb25kLiB0aGlzIG1lYW5zCisgKiB0aGF0IGl0IHRha2VzIDEvTUFYX1JBVEUgc2Vjb25kcyB0byBzZW5kIGEgc2luZ2xlIGJpdCwgYW5kIGNvdW50KjgvTUFYX1JBVEUKKyAqIHNlY29uZHMgdG8gc2VuZCAnY291bnQnIGJ5dGVzLgorICoKKyAqIHdlJ3JlIGdvaW5nIHRvIGltcGxlbWVudCBhIHNjaGVtZSB3aGVyZSwgd2hlbiB3ZSBzZW5kIGEgcGFja2V0IG9mCisgKiAnY291bnQnIGJ5dGVzLCBubyBvdGhlciBwYWNrZXQgd2lsbCBnbyB0aHJvdWdoIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBmb3IKKyAqIGF0IGxlYXN0ICdjb3VudCo4L01BWF9SQVRFJyBzZWNvbmRzLiBhbnkgc3VjY2Vzc2l2ZSBwYWNrZXQgdGhhdCBpcyAic2VudCIKKyAqIGluIHRoaXMgaW50ZXJ2YWwgaXMgcGxhY2VkIGluIGEgcXVldWUsIGFzc29jaWF0ZWQgdG8gYSB0aW1lcgorICoKKyAqIHRoZXJlIGFyZSBkaWZmZXJlbnQgKHF1ZXVlL3RpbWVyL3JhdGUpIHZhbHVlcyBmb3IgdGhlIGlucHV0IGFuZCBvdXRwdXQKKyAqIGRpcmVjdGlvbiBvZiB0aGUgdXNlciB2bGFuLgorICovCit0eXBlZGVmIHN0cnVjdCBRdWV1ZWRQYWNrZXRSZWNfIHsKKyAgICBEdXJhdGlvbiAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uOworICAgIHN0cnVjdCBRdWV1ZWRQYWNrZXRSZWNfKiAgIG5leHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICBvcGFxdWU7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgZGF0YTsKK30gUXVldWVkUGFja2V0UmVjLCAqUXVldWVkUGFja2V0OworCisKK3N0YXRpYyBRdWV1ZWRQYWNrZXQKK3F1ZXVlZF9wYWNrZXRfY3JlYXRlKCBjb25zdCB2b2lkKiAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgZG9fY29weSApCit7CisgICAgUXVldWVkUGFja2V0ICAgcGFja2V0OworICAgIHNpemVfdCAgICAgICAgIHBhY2tldF9zaXplID0gc2l6ZW9mKCpwYWNrZXQpOworCisgICAgaWYgKGRvX2NvcHkpCisgICAgICAgIHBhY2tldF9zaXplICs9IHNpemU7CisKKyAgICBwYWNrZXQgPSBtYWxsb2MocGFja2V0X3NpemUpOworICAgIHBhY2tldC0+bmV4dCAgICAgICA9IE5VTEw7CisgICAgcGFja2V0LT5leHBpcmF0aW9uID0gMDsKKyAgICBwYWNrZXQtPnNpemUgICAgICAgPSAoc2l6ZV90KXNpemU7CisgICAgcGFja2V0LT5vcGFxdWUgICAgID0gb3BhcXVlOworCisgICAgaWYgKGRvX2NvcHkpIHsKKyAgICAgICAgcGFja2V0LT5kYXRhID0gKHZvaWQqKShwYWNrZXQrMSk7CisgICAgICAgIG1lbWNweSggKGNoYXIqKXBhY2tldC0+ZGF0YSwgKGNoYXIqKWRhdGEsIHBhY2tldC0+c2l6ZSApOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhY2tldC0+ZGF0YSA9ICh2b2lkKilkYXRhOworICAgIH0KKyAgICByZXR1cm4gcGFja2V0OworfQorCitzdGF0aWMgdm9pZAorcXVldWVkX3BhY2tldF9mcmVlKCBRdWV1ZWRQYWNrZXQgIHBhY2tldCApCit7CisgICAgaWYgKHBhY2tldCkgeworICAgICAgICBmcmVlKCBwYWNrZXQgKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RydWN0IE5ldFNoYXBlclJlY18geworICAgIFF1ZXVlZFBhY2tldCAgIHBhY2tldHM7ICAgLyogbGlzdCBvZiBxdWV1ZWQgcGFja2V0cywgb3JkZXJlZCBieSBleHBpcmF0aW9uIGRhdGUgKi8KKyAgICBpbnQgICAgICAgICAgICBudW1fcGFja2V0czsKKyAgICBpbnQgICAgICAgICAgICBhY3RpdmU7ICAgIC8qIGlzIHRoaXMgc2hhcGVyIGFjdGl2ZSA/ICovCisgICAgRHVyYXRpb24gICAgICAgYmxvY2tfdW50aWw7CisgICAgZG91YmxlICAgICAgICAgbWF4X3JhdGU7ICAvKiBtYXggcmF0ZSBleHByZXNzZWQgaW4gYnl0ZXMvc2Vjb25kICovCisgICAgZG91YmxlICAgICAgICAgaW52X3JhdGU7ICAvKiBpbnZlcnNlIG9mIG1heCByYXRlICAgICAgICAgICAgICAgICovCisgICAgTG9vcFRpbWVyKiAgICAgdGltZXI7ICAgICAvKiB0aW1lciAqLworCisgICAgaW50ICAgICAgICAgICAgICAgIGRvX2NvcHk7CisgICAgTmV0U2hhcGVyU2VuZEZ1bmMgIHNlbmRfZnVuYzsKKworfSBOZXRTaGFwZXJSZWM7CisKKwordm9pZAorbmV0c2hhcGVyX2Rlc3Ryb3koIE5ldFNoYXBlciAgc2hhcGVyICkKK3sKKyAgICBpZiAoc2hhcGVyKSB7CisgICAgICAgIHNoYXBlci0+YWN0aXZlID0gMDsKKworICAgICAgICB3aGlsZSAoc2hhcGVyLT5wYWNrZXRzKSB7CisgICAgICAgICAgICBRdWV1ZWRQYWNrZXQgIHBhY2tldCA9IHNoYXBlci0+cGFja2V0czsKKyAgICAgICAgICAgIHNoYXBlci0+cGFja2V0cyA9IHBhY2tldC0+bmV4dDsKKyAgICAgICAgICAgIHBhY2tldC0+bmV4dCAgICA9IE5VTEw7CisgICAgICAgICAgICBxdWV1ZWRfcGFja2V0X2ZyZWUocGFja2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGxvb3BUaW1lcl9zdG9wKHNoYXBlci0+dGltZXIpOworICAgICAgICBsb29wVGltZXJfZnJlZShzaGFwZXItPnRpbWVyKTsKKyAgICAgICAgc2hhcGVyLT50aW1lciA9IE5VTEw7CisgICAgICAgIGZyZWUoc2hhcGVyKTsKKyAgICB9Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHNoYXBlcidzIHRpbWVyIGV4cGlyZXMgKi8KK3N0YXRpYyB2b2lkCituZXRzaGFwZXJfZXhwaXJlcyh2b2lkKiBvcGFxdWUsIExvb3BUaW1lciogdW51c2VkKQoreworICAgIE5ldFNoYXBlciBzaGFwZXIgPSAoTmV0U2hhcGVyKW9wYXF1ZTsKKyAgICBRdWV1ZWRQYWNrZXQgIHBhY2tldDsKKworICAgIGlmIChvcGFxdWUgPT0gTlVMTCkgeworICAgICAgICBjcmFzaGhhbmRsZXJfZGllKCJuZXRzaGFwZXJfZXhwaXJlcygpIHdpdGggb3BhcXVlPT1OVUxMIik7CisgICAgfQorCisgICAgd2hpbGUgKChwYWNrZXQgPSBzaGFwZXItPnBhY2tldHMpICE9IE5VTEwpIHsKKyAgICAgICBEdXJhdGlvbiBub3cgPSBsb29wZXJfbm93V2l0aENsb2NrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgU0hBUEVSX0NMT0NLKTsKKworICAgICAgIGlmIChwYWNrZXQtPmV4cGlyYXRpb24gPiBub3cpCisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgc2hhcGVyLT5wYWNrZXRzID0gcGFja2V0LT5uZXh0OworICAgICAgIHNoYXBlci0+c2VuZF9mdW5jKCBwYWNrZXQtPmRhdGEsIHBhY2tldC0+c2l6ZSwgcGFja2V0LT5vcGFxdWUgKTsKKyAgICAgICBxdWV1ZWRfcGFja2V0X2ZyZWUocGFja2V0KTsKKyAgICAgICBzaGFwZXItPm51bV9wYWNrZXRzLS07CisgICB9CisKKyAgIC8qIHJlcHJvZ3JhbSB0aW1lciBpZiBuZWVkZWQgKi8KKyAgIGlmIChzaGFwZXItPnBhY2tldHMpIHsKKyAgICAgICBzaGFwZXItPmJsb2NrX3VudGlsID0gc2hhcGVyLT5wYWNrZXRzLT5leHBpcmF0aW9uOworICAgICAgIGxvb3BUaW1lcl9zdGFydEFic29sdXRlKHNoYXBlci0+dGltZXIsIHNoYXBlci0+YmxvY2tfdW50aWwpOworICAgfSBlbHNlIHsKKyAgICAgICBzaGFwZXItPmJsb2NrX3VudGlsID0gLTE7CisgICB9Cit9CisKKworTmV0U2hhcGVyCituZXRzaGFwZXJfY3JlYXRlKCBpbnQgICAgICAgICAgICAgICAgZG9fY29weSwKKyAgICAgICAgICAgICAgICAgIE5ldFNoYXBlclNlbmRGdW5jICBzZW5kX2Z1bmMgKQoreworICAgIE5ldFNoYXBlciAgc2hhcGVyID0gbWFsbG9jKHNpemVvZigqc2hhcGVyKSk7CisKKyAgICBzaGFwZXItPmFjdGl2ZSA9IDA7CisgICAgc2hhcGVyLT5wYWNrZXRzID0gTlVMTDsKKyAgICBzaGFwZXItPm51bV9wYWNrZXRzID0gMDsKKyAgICBzaGFwZXItPnRpbWVyID0gbG9vcFRpbWVyX25ld1dpdGhDbG9jaygKKyAgICAgICAgICAgIGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgbmV0c2hhcGVyX2V4cGlyZXMsIHNoYXBlciwgU0hBUEVSX0NMT0NLKTsKKyAgICBzaGFwZXItPnNlbmRfZnVuYyA9IHNlbmRfZnVuYzsKKyAgICBzaGFwZXItPm1heF9yYXRlICA9IDFlNjsKKyAgICBzaGFwZXItPmludl9yYXRlICA9IDAuOworCisgICAgc2hhcGVyLT5ibG9ja191bnRpbCA9IC0xOyAvKiBtYWdpYyB2YWx1ZSwgbWVhbnMgdG8gbm90IGJsb2NrICovCisKKyAgICByZXR1cm4gc2hhcGVyOworfQorCit2b2lkCituZXRzaGFwZXJfc2V0X3JhdGUoIE5ldFNoYXBlciAgc2hhcGVyLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgIHJhdGUgKQoreworICAgIGlmICghc2hhcGVyKSByZXR1cm47CisKKyAgICAvKiBzZW5kIGFsbCBjdXJyZW50IHBhY2tldHMgd2hlbiBjaGFuZ2luZyB0aGUgcmF0ZSAqLworICAgIHdoaWxlIChzaGFwZXItPnBhY2tldHMpIHsKKyAgICAgICAgUXVldWVkUGFja2V0ICBwYWNrZXQgPSBzaGFwZXItPnBhY2tldHM7CisgICAgICAgIHNoYXBlci0+cGFja2V0cyA9IHBhY2tldC0+bmV4dDsKKyAgICAgICAgc2hhcGVyLT5zZW5kX2Z1bmMocGFja2V0LT5kYXRhLCBwYWNrZXQtPnNpemUsIHBhY2tldC0+b3BhcXVlKTsKKyAgICAgICAgZnJlZShwYWNrZXQpOworICAgICAgICBzaGFwZXItPm51bV9wYWNrZXRzID0gMDsKKyAgICB9CisKKyAgICBzaGFwZXItPm1heF9yYXRlID0gcmF0ZTsKKyAgICBpZiAocmF0ZSA+IDEuKSB7CisgICAgICAgIHNoYXBlci0+aW52X3JhdGUgPSAoOC4qU0hBUEVSX0NMT0NLX1VOSVQpL3JhdGU7ICAvKiBvdXIgY2xvY2sgdGltZSBpcyBpbiBtcyAqLworICAgICAgICBzaGFwZXItPmFjdGl2ZSAgID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHRoZSByZWFsLXRpbWUgY2xvY2sgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBzaGFwZXItPmFjdGl2ZSA9IDA7CisgICAgfQorCisgICAgc2hhcGVyLT5ibG9ja191bnRpbCA9IC0xOworfQorCit2b2lkCituZXRzaGFwZXJfc2VuZF9hdXgoIE5ldFNoYXBlciAgc2hhcGVyLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBvcGFxdWUgKQoreworICAgIER1cmF0aW9uIG5vdzsKKworICAgIGlmICghc2hhcGVyLT5hY3RpdmUgfHwgX3BhY2tldF9pc19pbnRlcm5hbChkYXRhLCBzaXplKSkgeworICAgICAgICBzaGFwZXItPnNlbmRfZnVuYyggZGF0YSwgc2l6ZSwgb3BhcXVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBub3cgPSBsb29wZXJfbm93V2l0aENsb2NrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgU0hBUEVSX0NMT0NLKTsKKyAgICBpZiAobm93ID49IHNoYXBlci0+YmxvY2tfdW50aWwpIHsKKyAgICAgICAgc2hhcGVyLT5zZW5kX2Z1bmMoIGRhdGEsIHNpemUsIG9wYXF1ZSApOworICAgICAgICBzaGFwZXItPmJsb2NrX3VudGlsID0gbm93ICsgc2l6ZSpzaGFwZXItPmludl9yYXRlOworICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCAiTkVUU0hBUEVSOiBibG9jayBmb3IgJS4yZm1zXG4iLCAoc2hhcGVyLT5ibG9ja191bnRpbCAtIG5vdykqMS4wICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgbmV3IHBhY2tldCwgYWRkIGl0IHRvIHRoZSBxdWV1ZSAqLworICAgIHsKKyAgICAgICAgUXVldWVkUGFja2V0ICAgcGFja2V0OworCisgICAgICAgIHBhY2tldCA9IHF1ZXVlZF9wYWNrZXRfY3JlYXRlKCBkYXRhLCBzaXplLCBvcGFxdWUsIHNoYXBlci0+ZG9fY29weSApOworCisgICAgICAgIHBhY2tldC0+ZXhwaXJhdGlvbiA9IHNoYXBlci0+YmxvY2tfdW50aWw7CisKKyAgICAgICAgeworICAgICAgICAgICAgUXVldWVkUGFja2V0ICAqcG5vZGUsIG5vZGU7CisKKyAgICAgICAgICAgIHBub2RlID0gJnNoYXBlci0+cGFja2V0czsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBub2RlID0gKnBub2RlOworICAgICAgICAgICAgICAgIGlmIChub2RlID09IE5VTEwgfHwgbm9kZS0+ZXhwaXJhdGlvbiA+IHBhY2tldC0+ZXhwaXJhdGlvbiApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHBub2RlID0gJm5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYWNrZXQtPm5leHQgPSAqcG5vZGU7CisgICAgICAgICAgICAqcG5vZGUgICAgICAgPSBwYWNrZXQ7CisKKyAgICAgICAgICAgIGlmIChwYWNrZXQgPT0gc2hhcGVyLT5wYWNrZXRzKSB7CisgICAgICAgICAgICAgICAgbG9vcFRpbWVyX3N0YXJ0QWJzb2x1dGUoc2hhcGVyLT50aW1lciwgcGFja2V0LT5leHBpcmF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzaGFwZXItPm51bV9wYWNrZXRzICs9IDE7CisgICAgfQorICAgIHNoYXBlci0+YmxvY2tfdW50aWwgKz0gc2l6ZSpzaGFwZXItPmludl9yYXRlOworICAgIC8vZnByaW50ZihzdGRlcnIsICJORVRTSEFQRVI6IGJsb2NrMiBmb3IgJS4yZm1zXG4iLCAoc2hhcGVyLT5ibG9ja191bnRpbCAtIG5vdykqMS4wICk7Cit9CisKK3ZvaWQKK25ldHNoYXBlcl9zZW5kKCBOZXRTaGFwZXIgIHNoYXBlciwKKyAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgc2l6ZV90ICAgICBzaXplICkKK3sKKyAgICBuZXRzaGFwZXJfc2VuZF9hdXgoc2hhcGVyLCBkYXRhLCBzaXplLCBOVUxMKTsKK30KKworCitpbnQKK25ldHNoYXBlcl9jYW5fc2VuZCggTmV0U2hhcGVyICBzaGFwZXIgKQoreworICAgIER1cmF0aW9uIG5vdzsKKworICAgIGlmICghc2hhcGVyLT5hY3RpdmUgfHwgc2hhcGVyLT5ibG9ja191bnRpbCA8IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKHNoYXBlci0+cGFja2V0cykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBub3cgPSBsb29wZXJfbm93V2l0aENsb2NrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgU0hBUEVSX0NMT0NLKTsKKyAgICByZXR1cm4gKG5vdyA+PSBzaGFwZXItPmJsb2NrX3VudGlsKTsKK30KKworCisKKworCisKKy8qIHRoaXMgdHlwZSBpcyB1c2VkIHRvIG1vZGVsIGEgc2Vzc2lvbiBjb25uZWN0aW9uL3N0YXRlCisgKiBpZiBzZXNzaW9uLT5wYWNrZXQgaXMgIT0gTlVMTCwgdGhlbiB0aGUgY29ubmVjdGlvbiBpcyBkZWxheWVkCisgKi8KK3R5cGVkZWYgc3RydWN0IFNlc3Npb25SZWNfIHsKKyAgICBEdXJhdGlvbiAgICAgICAgICAgICAgZXhwaXJhdGlvbjsKKyAgICBzdHJ1Y3QgU2Vzc2lvblJlY18qICAgbmV4dDsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgICAgc3JjX2lwOworICAgIHVuc2lnbmVkICAgICAgICAgICAgICBkc3RfaXA7CisgICAgdW5zaWduZWQgc2hvcnQgICAgICAgIHNyY19wb3J0OworICAgIHVuc2lnbmVkIHNob3J0ICAgICAgICBkc3RfcG9ydDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgcHJvdG9jb2w7CisgICAgUXVldWVkUGFja2V0ICAgICAgICAgIHBhY2tldDsKKworfSBTZXNzaW9uUmVjLCAqU2Vzc2lvbjsKKworI2RlZmluZSAgX1BST1RPQ09MX1RDUCAgIDYKKyNkZWZpbmUgIF9QUk9UT0NPTF9VRFAgICAxNworCisKKworc3RhdGljIHZvaWQKK3Nlc3Npb25fZnJlZSggU2Vzc2lvbiAgc2Vzc2lvbiApCit7CisgICAgaWYgKHNlc3Npb24pIHsKKyAgICAgICAgaWYgKHNlc3Npb24tPnBhY2tldCkgeworICAgICAgICAgICAgcXVldWVkX3BhY2tldF9mcmVlKHNlc3Npb24tPnBhY2tldCk7CisgICAgICAgICAgICBzZXNzaW9uLT5wYWNrZXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGZyZWUoIHNlc3Npb24gKTsKKyAgICB9Cit9CisKKworI2lmIDAgIC8qIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCitzdGF0aWMgY29uc3QgY2hhcioKK3Nlc3Npb25fdG9fc3RyaW5nKCBTZXNzaW9uICBzZXNzaW9uICkKK3sKKyAgICBzdGF0aWMgY2hhciAgdGVtcFsyNTZdOworICAgIGNvbnN0IGNoYXIqICBmb3JtYXQgPSAoc2Vzc2lvbi0+cHJvdG9jb2wgPT0gX1BST1RPQ09MX1RDUCkgPyAiVENQIiA6ICJVRFAiOworICAgIHNwcmludGYoIHRlbXAsICIlc1slZC4lZC4lZC4lZDolZCAvICVkLiVkLiVkLiVkOiVkXSIsIGZvcm1hdCwKKyAgICAgICAgICAgICAoc2Vzc2lvbi0+c3JjX2lwID4+IDI0KSAmIDI1NSwgKHNlc3Npb24tPnNyY19pcCA+PiAxNikgJiAyNTUsCisgICAgICAgICAgICAgKHNlc3Npb24tPnNyY19pcCA+PiA4KSAmIDI1NSwgKHNlc3Npb24tPnNyY19pcCkgJiAyNTUsIHNlc3Npb24tPnNyY19wb3J0LAorICAgICAgICAgICAgIChzZXNzaW9uLT5kc3RfaXAgPj4gMjQpICYgMjU1LCAoc2Vzc2lvbi0+ZHN0X2lwID4+IDE2KSAmIDI1NSwKKyAgICAgICAgICAgICAoc2Vzc2lvbi0+ZHN0X2lwID4+IDgpICYgMjU1LCAoc2Vzc2lvbi0+ZHN0X2lwKSAmIDI1NSwgc2Vzc2lvbi0+ZHN0X3BvcnQpOworCisgICAgcmV0dXJuIHRlbXA7Cit9CisjZW5kaWYKKworLyogcmV0dXJucyBUUlVFIGlmIHRoaXMgY29ycmVzcG9uZHMgdG8gYSBTWU4gcGFja2V0ICovCitpbnQKK19wYWNrZXRfU1lOX2ZsYWdzKCBjb25zdCB2b2lkKiAgX2RhdGEsIHNpemVfdCAgIHNpemUsIFNlc3Npb24gIGluZm8gKQoreworICAgIGNvbnN0IHVpbnQ4X3QqICBkYXRhID0gKGNvbnN0IHVpbnQ4X3QqKV9kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QqICBlbmQgID0gZGF0YSArIHNpemU7CisKKyAgICAvKiBlbm91Z2ggcm9vbSBmb3IgYSBFdGhlcm5ldCBNQUMgcGFja2V0ID8gKi8KKyAgICBpZiAoZGF0YSArIDE0ID4gZW5kIC0gNCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBpcyBpdCBhbiBJUCBwYWNrZXQgPyAqLworICAgIGlmIChkYXRhWzEyXSAhPSAweDggfHwgZGF0YVsxM10gIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBkYXRhICs9IDE0OworICAgIGVuZCAgLT0gNDsKKworICAgIGlmIChkYXRhICsgMjAgPiBlbmQpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogSVAgdmVyc2lvbiBtdXN0IGJlIDQsIGFuZCB0aGUgaGVhZGVyIGxlbmd0aCBpbiB3b3JkcyBhdCBsZWFzdCA1ICovCisgICAgaWYgKChkYXRhWzBdICYgMHhGKSA8IDUgfHwgKGRhdGFbMF0gPj4gNCkgIT0gNCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiB0aW1lLXRvLWxpdmUgbXVzdCBiZSA+IDAgKi8KKyAgICBpZiAoZGF0YVs4XSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIG11c3QgYmUgVENQIG9yIFVEUCBwYWNrZXQgKi8KKyAgICBpZiAoZGF0YVs5XSAhPSBfUFJPVE9DT0xfVENQICYmIGRhdGFbOV0gIT0gX1BST1RPQ09MX1VEUCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbmZvLT5wcm90b2NvbCA9IGRhdGFbOV07CisgICAgaW5mby0+c3JjX2lwICAgPSAoZGF0YVsxMl0gPDwgMjQpIHwgKGRhdGFbMTNdIDw8IDE2KSB8IChkYXRhWzE0XSA8PCA4KSB8IGRhdGFbMTVdOworICAgIGluZm8tPmRzdF9pcCAgID0gKGRhdGFbMTZdIDw8IDI0KSB8IChkYXRhWzE3XSA8PCAxNikgfCAoZGF0YVsxOF0gPDwgOCkgfCBkYXRhWzE5XTsKKworICAgIGRhdGEgKz0gNCooZGF0YVswXSAmIDE1KTsKKyAgICBpZiAoZGF0YSArIDIwID4gZW5kKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGluZm8tPnNyY19wb3J0ID0gKHVuc2lnbmVkIHNob3J0KSgoZGF0YVswXSA8PCA4KSB8IGRhdGFbMV0pOworICAgIGluZm8tPmRzdF9wb3J0ID0gKHVuc2lnbmVkIHNob3J0KSgoZGF0YVsyXSA8PCA4KSB8IGRhdGFbM10pOworCisgICAgcmV0dXJuIChkYXRhWzEzXSAmIDB4MWYpOworfQorCisKK3R5cGVkZWYgc3RydWN0IE5ldERlbGF5UmVjXworeworICAgIFNlc3Npb24gICAgIHNlc3Npb25zOworICAgIGludCAgICAgICAgIG51bV9zZXNzaW9uczsKKyAgICBMb29wVGltZXIqICB0aW1lcjsKKyAgICBpbnQgICAgICAgICBhY3RpdmU7CisgICAgaW50ICAgICAgICAgbWluX21zOworICAgIGludCAgICAgICAgIG1heF9tczsKKworICAgIE5ldFNoYXBlclNlbmRGdW5jICBzZW5kX2Z1bmM7CisKK30gTmV0RGVsYXlSZWM7CisKKworc3RhdGljIFNlc3Npb24qCituZXRkZWxheV9sb29rdXBfc2Vzc2lvbiggTmV0RGVsYXkgIGRlbGF5LCBTZXNzaW9uICBpbmZvICkKK3sKKyAgICBTZXNzaW9uKiAgcG5vZGUgPSAmZGVsYXktPnNlc3Npb25zOworICAgIFNlc3Npb24gICBub2RlOworCisgICAgZm9yICg7OykgeworICAgICAgICBub2RlID0gKnBub2RlOworICAgICAgICBpZiAobm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG5vZGUtPnNyY19pcCA9PSBpbmZvLT5zcmNfaXAgJiYKKyAgICAgICAgICAgIG5vZGUtPmRzdF9pcCA9PSBpbmZvLT5kc3RfaXAgJiYKKyAgICAgICAgICAgIG5vZGUtPnNyY19wb3J0ID09IGluZm8tPnNyY19wb3J0ICYmCisgICAgICAgICAgICBub2RlLT5kc3RfcG9ydCA9PSBpbmZvLT5kc3RfcG9ydCAmJgorICAgICAgICAgICAgbm9kZS0+cHJvdG9jb2wgPT0gaW5mby0+cHJvdG9jb2wgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcG5vZGUgPSAmbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHBub2RlOworfQorCisKKworLyogY2FsbGVkIGJ5IHRoZSBkZWxheSdzIHRpbWVyIG9uIGV4cGlyYXRpb24gKi8KK3N0YXRpYyB2b2lkCituZXRkZWxheV9leHBpcmVzKHZvaWQqIG9wYXF1ZSwgTG9vcFRpbWVyKiB1bnVzZWQpCit7CisgICAgTmV0RGVsYXkgZGVsYXkgPSAoTmV0RGVsYXkpb3BhcXVlOworICAgIFNlc3Npb24gIHNlc3Npb247CisgICAgRHVyYXRpb24gbm93ID0gbG9vcGVyX25vd1dpdGhDbG9jayhsb29wZXJfZ2V0Rm9yVGhyZWFkKCksIFNIQVBFUl9DTE9DSyk7CisgICAgaW50ICAgICAgcmVhcm0gPSAwOworICAgIER1cmF0aW9uIHJlYXJtX3RpbWUgPSAwOworCisgICAgZm9yIChzZXNzaW9uID0gZGVsYXktPnNlc3Npb25zOyBzZXNzaW9uICE9IE5VTEw7IHNlc3Npb24gPSBzZXNzaW9uLT5uZXh0KQorICAgIHsKKyAgICAgICAgUXVldWVkUGFja2V0ICBwYWNrZXQgPSBzZXNzaW9uLT5wYWNrZXQ7CisKKyAgICAgICAgaWYgKHBhY2tldCA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHNlc3Npb24tPmV4cGlyYXRpb24gPD0gbm93KSB7CisgICAgICAgICAgICAvKiBzZW5kIHRoZSBTWU4gcGFja2V0IG5vdyAqLworICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCAiTmV0RGVsYXk6UlNUOiBzZW5kaW5nIGNyZWF0aW9uIGZvciAlc1xuIiwgc2Vzc2lvbl90b19zdHJpbmcoc2Vzc2lvbikgKTsKKyAgICAgICAgICAgIGRlbGF5LT5zZW5kX2Z1bmMoIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplLCBwYWNrZXQtPm9wYXF1ZSApOworICAgICAgICAgICAgc2Vzc2lvbi0+cGFja2V0ID0gTlVMTDsKKyAgICAgICAgICAgIHF1ZXVlZF9wYWNrZXRfZnJlZSggcGFja2V0ICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXJlYXJtKSB7CisgICAgICAgICAgICAgICAgcmVhcm0gICAgICA9IDE7CisgICAgICAgICAgICAgICAgcmVhcm1fdGltZSA9IHNlc3Npb24tPmV4cGlyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggc2Vzc2lvbi0+ZXhwaXJhdGlvbiA8IHJlYXJtX3RpbWUgKQorICAgICAgICAgICAgICAgIHJlYXJtX3RpbWUgPSBzZXNzaW9uLT5leHBpcmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlYXJtKSB7CisgICAgICAgIGxvb3BUaW1lcl9zdGFydEFic29sdXRlKGRlbGF5LT50aW1lciwgcmVhcm1fdGltZSk7CisgICAgfQorfQorCisKK05ldERlbGF5CituZXRkZWxheV9jcmVhdGUoIE5ldFNoYXBlclNlbmRGdW5jICBzZW5kX2Z1bmMgKQoreworICAgIE5ldERlbGF5ICBkZWxheSA9IG1hbGxvYyhzaXplb2YoKmRlbGF5KSk7CisKKyAgICBkZWxheS0+c2Vzc2lvbnMgICAgID0gTlVMTDsKKyAgICBkZWxheS0+bnVtX3Nlc3Npb25zID0gMDsKKyAgICBkZWxheS0+dGltZXIgPSBsb29wVGltZXJfbmV3V2l0aENsb2NrKAorICAgICAgICAgICAgbG9vcGVyX2dldEZvclRocmVhZCgpLCBuZXRkZWxheV9leHBpcmVzLCBkZWxheSwgU0hBUEVSX0NMT0NLKTsKKyAgICBkZWxheS0+YWN0aXZlID0gMDsKKyAgICBkZWxheS0+bWluX21zID0gMDsKKyAgICBkZWxheS0+bWF4X21zID0gMDsKKworICAgIGRlbGF5LT5zZW5kX2Z1bmMgPSBzZW5kX2Z1bmM7CisKKyAgICByZXR1cm4gZGVsYXk7Cit9CisKKwordm9pZAorbmV0ZGVsYXlfc2V0X2xhdGVuY3koIE5ldERlbGF5ICBkZWxheSwgaW50ICBtaW5fbXMsIGludCAgbWF4X21zICkKK3sKKyAgICAvKiB3aGVuIGNoYW5naW5nIHRoZSBsYXRlbmN5LCBhY2NlcHQgYWxsIHNlc3Npb25zICovCisgICAgd2hpbGUgKGRlbGF5LT5zZXNzaW9ucykgeworICAgICAgICBTZXNzaW9uICBzZXNzaW9uID0gZGVsYXktPnNlc3Npb25zOworICAgICAgICBkZWxheS0+c2Vzc2lvbnMgPSBzZXNzaW9uLT5uZXh0OworICAgICAgICBzZXNzaW9uLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgaWYgKHNlc3Npb24tPnBhY2tldCkgeworICAgICAgICAgICAgUXVldWVkUGFja2V0ICBwYWNrZXQgPSBzZXNzaW9uLT5wYWNrZXQ7CisgICAgICAgICAgICBkZWxheS0+c2VuZF9mdW5jKCBwYWNrZXQtPmRhdGEsIHBhY2tldC0+c2l6ZSwgcGFja2V0LT5vcGFxdWUgKTsKKyAgICAgICAgfQorICAgICAgICBzZXNzaW9uX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgIGRlbGF5LT5udW1fc2Vzc2lvbnMtLTsKKyAgICB9CisKKyAgICBkZWxheS0+bWluX21zID0gbWluX21zOworICAgIGRlbGF5LT5tYXhfbXMgPSBtYXhfbXM7CisgICAgZGVsYXktPmFjdGl2ZSA9IChtaW5fbXMgPD0gbWF4X21zKSAmJiBtaW5fbXMgPiAwOworfQorCit2b2lkCituZXRkZWxheV9zZW5kKCBOZXREZWxheSAgZGVsYXksIGNvbnN0IHZvaWQqICBkYXRhLCBzaXplX3QgIHNpemUgKQoreworICAgIG5ldGRlbGF5X3NlbmRfYXV4KGRlbGF5LCBkYXRhLCBzaXplLCBOVUxMKTsKK30KKworCit2b2lkCituZXRkZWxheV9zZW5kX2F1eCggTmV0RGVsYXkgIGRlbGF5LCBjb25zdCB2b2lkKiAgZGF0YSwgc2l6ZV90ICBzaXplLCB2b2lkKiBvcGFxdWUgKQoreworICAgIGlmIChkZWxheS0+YWN0aXZlICYmICFfcGFja2V0X2lzX2ludGVybmFsKGRhdGEsIHNpemUpKSB7CisgICAgICAgIFNlc3Npb25SZWMgIGluZm9bMV07CisgICAgICAgIGludCAgICAgICAgIGZsYWdzOworCisgICAgICAgIGZsYWdzID0gX3BhY2tldF9TWU5fZmxhZ3MoIGRhdGEsIHNpemUsIGluZm8gKTsKKyAgICAgICAgaWYgKChmbGFncyAmIDB4MDUpICE9IDApCisgICAgICAgIHsgIC8qIEZJTiBvciBSU1Q6IGRyb3AgY29ubmVjdGlvbiAqLworICAgICAgICAgICAgU2Vzc2lvbiogIGxvb2t1cCAgPSBuZXRkZWxheV9sb29rdXBfc2Vzc2lvbiggZGVsYXksIGluZm8gKTsKKyAgICAgICAgICAgIFNlc3Npb24gICBzZXNzaW9uID0gKmxvb2t1cDsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCAiTmV0RGVsYXk6UlNUOiBkcm9wcGluZyAlc1xuIiwgc2Vzc2lvbl90b19zdHJpbmcoaW5mbykgKTsKKworICAgICAgICAgICAgICAgICpsb29rdXAgPSBzZXNzaW9uLT5uZXh0OworICAgICAgICAgICAgICAgIHNlc3Npb25fZnJlZSggc2Vzc2lvbiApOworICAgICAgICAgICAgICAgIGRlbGF5LT5udW1fc2Vzc2lvbnMgLT0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoZmxhZ3MgJiAweDEyKSA9PSAweDAyKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTWU46IGNyZWF0ZSBjb25uZWN0aW9uICovCisgICAgICAgICAgICBTZXNzaW9uKiAgbG9va3VwICA9IG5ldGRlbGF5X2xvb2t1cF9zZXNzaW9uKCBkZWxheSwgaW5mbyApOworICAgICAgICAgICAgU2Vzc2lvbiAgIHNlc3Npb24gPSAqbG9va3VwOworCisgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24tPnBhY2tldCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgLyogdGhpcyBpcyBhIFNZTiByZS10cmFuc21pc3Npb24sIHNpbmNlIHdlIGRpZG4ndAorICAgICAgICAgICAgICAgICAgICAqIHNlbmQgdGhlIG9yaWdpbmFsIFNZTiBwYWNrZXQgeWV0LCBqdXN0IGVhdCB0aGlzIG9uZQorICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCAiTmV0RGVsYXk6UlNUOiBzd2FsbG93IFNZTiByZS1zZW5kIGZvciAlc1xuIiwgc2Vzc2lvbl90b19zdHJpbmcoaW5mbykgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZXN0YWJsaXNoIGEgbmV3IHNlc3Npb24gc2xpZ2h0bHkgaW4gdGhlIGZ1dHVyZSAqLworICAgICAgICAgICAgICAgIGludCAgIGxhdGVuY3kgPSBkZWxheS0+bWluX21zOworICAgICAgICAgICAgICAgIGludCAgIHJhbmdlICAgPSBkZWxheS0+bWF4X21zIC0gZGVsYXktPm1pbl9tczsKKworICAgICAgICAgICAgICAgICBpZiAocmFuZ2UgPiAwKQorICAgICAgICAgICAgICAgICAgICBsYXRlbmN5ICs9IHJhbmQoKSAlIHJhbmdlOworCisgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRlcnIsICJOZXREZWxheTpSU1Q6IGRlbGF5IGNyZWF0aW9uIGZvciAlc1xuIiwgc2Vzc2lvbl90b19zdHJpbmcoaW5mbykgKTsKKyAgICAgICAgICAgICAgICBzZXNzaW9uID0gbWFsbG9jKCBzaXplb2YoKnNlc3Npb24pICk7CisKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5uZXh0ICAgICAgICA9IGRlbGF5LT5zZXNzaW9uczsKKyAgICAgICAgICAgICAgICBkZWxheS0+c2Vzc2lvbnMgICAgICA9IHNlc3Npb247CisgICAgICAgICAgICAgICAgZGVsYXktPm51bV9zZXNzaW9ucyArPSAxOworCisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZXhwaXJhdGlvbiA9IGxvb3Blcl9ub3dXaXRoQ2xvY2sobG9vcGVyX2dldEZvclRocmVhZCgpLCBTSEFQRVJfQ0xPQ0spICsgbGF0ZW5jeTsKKworICAgICAgICAgICAgICAgIHNlc3Npb24tPnNyY19pcCAgID0gaW5mby0+c3JjX2lwOworICAgICAgICAgICAgICAgIHNlc3Npb24tPmRzdF9pcCAgID0gaW5mby0+ZHN0X2lwOworICAgICAgICAgICAgICAgIHNlc3Npb24tPnNyY19wb3J0ID0gaW5mby0+c3JjX3BvcnQ7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+ZHN0X3BvcnQgPSBpbmZvLT5kc3RfcG9ydDsKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm90b2NvbCA9IGluZm8tPnByb3RvY29sOworCisgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cGFja2V0ID0gcXVldWVkX3BhY2tldF9jcmVhdGUoIGRhdGEsIHNpemUsIG9wYXF1ZSwgMSApOworCisgICAgICAgICAgICAgICAgbmV0ZGVsYXlfZXhwaXJlcyhkZWxheSwgZGVsYXktPnRpbWVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxheS0+c2VuZF9mdW5jKCAodm9pZCopZGF0YSwgc2l6ZSwgb3BhcXVlICk7Cit9CisKKwordm9pZAorbmV0ZGVsYXlfZGVzdHJveSggTmV0RGVsYXkgIGRlbGF5ICkKK3sKKyAgICBpZiAoZGVsYXkpIHsKKyAgICAgICAgd2hpbGUgKGRlbGF5LT5zZXNzaW9ucykgeworICAgICAgICAgICAgU2Vzc2lvbiAgc2Vzc2lvbiA9IGRlbGF5LT5zZXNzaW9uczsKKyAgICAgICAgICAgIGRlbGF5LT5zZXNzaW9ucyA9IHNlc3Npb24tPm5leHQ7CisgICAgICAgICAgICBzZXNzaW9uX2ZyZWUoc2Vzc2lvbik7CisgICAgICAgICAgICBkZWxheS0+bnVtX3Nlc3Npb25zIC09IDE7CisgICAgICAgIH0KKyAgICAgICAgbG9vcFRpbWVyX3N0b3AoZGVsYXktPnRpbWVyKTsKKyAgICAgICAgbG9vcFRpbWVyX2ZyZWUoZGVsYXktPnRpbWVyKTsKKyAgICAgICAgZGVsYXktPnRpbWVyID0gTlVMTDsKKyAgICAgICAgZGVsYXktPmFjdGl2ZSA9IDA7CisgICAgICAgIGZyZWUoIGRlbGF5ICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NoYXBlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NoYXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjRlODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2hhcGVyLmgKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2lmbmRlZiBfU0xJUlBfU0hBUEVSX0hfCisjZGVmaW5lIF9TTElSUF9TSEFQRVJfSF8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKiBhIE5ldFNoYXBlciBvYmplY3QgaXMgdXNlZCB0byBsaW1pdCB0aGUgdGhyb3VnaHB1dCBvZiBkYXRhIHBhY2tldHMKKyAqIGF0IGEgZml4ZWQgcmF0ZSBleHByZXNzZWQgaW4gYml0cy9zZWNvbmRzCisgKi8KK3R5cGVkZWYgc3RydWN0IE5ldFNoYXBlclJlY18qICBOZXRTaGFwZXI7Cit0eXBlZGVmIHZvaWQgKCpOZXRTaGFwZXJTZW5kRnVuYykoIHZvaWQqICBkYXRhLCBzaXplX3QgIHNpemUsIHZvaWQqICBvcGFxdWUpOworCitOZXRTaGFwZXIgICBuZXRzaGFwZXJfY3JlYXRlICAoIGludCAgICAgICAgICAgICAgICBkb19jb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRTaGFwZXJTZW5kRnVuYyAgc2VuZF9mdW5jICk7CisKK3ZvaWQgICAgICAgIG5ldHNoYXBlcl9zZXRfcmF0ZShOZXRTaGFwZXIgIHNoYXBlciwgZG91YmxlICByYXRlICk7CisKK3ZvaWQgICAgICAgIG5ldHNoYXBlcl9zZW5kKCBOZXRTaGFwZXIgIHNoYXBlciwgdm9pZCogZGF0YSwgc2l6ZV90ICBzaXplICk7CisKK3ZvaWQgICAgICAgIG5ldHNoYXBlcl9zZW5kX2F1eCggTmV0U2hhcGVyICBzaGFwZXIsIHZvaWQqIGRhdGEsIHNpemVfdCAgc2l6ZSwgdm9pZCogIG9wYXF1ZSApOworCitpbnQgICAgICAgICBuZXRzaGFwZXJfY2FuX3NlbmQoIE5ldFNoYXBlciAgc2hhcGVyICk7CisKK3ZvaWQgICAgICAgIG5ldHNoYXBlcl9kZXN0cm95IChOZXRTaGFwZXIgICBzaGFwZXIpOworCisvKiBhIE5ldERlbGF5IG9iamVjdCBpcyB1c2VkIHRvIHNpbXVsYXRlIG5ldHdvcmsgY29ubmVjdGlvbiBsYXRlbmNpZXMgKi8KK3R5cGVkZWYgc3RydWN0IE5ldERlbGF5UmVjXyogIE5ldERlbGF5OworCitOZXREZWxheSAgIG5ldGRlbGF5X2NyZWF0ZSggTmV0U2hhcGVyU2VuZEZ1bmMgIHNlbmRfZnVuYyApOwordm9pZCAgICAgICBuZXRkZWxheV9zZXRfbGF0ZW5jeSggTmV0RGVsYXkgIGRlbGF5LCBpbnQgIG1pbl9tcywgaW50ICBtYXhfbXMgKTsKK3ZvaWQgICAgICAgbmV0ZGVsYXlfc2VuZCggTmV0RGVsYXkgIGRlbGF5LCBjb25zdCB2b2lkKiAgZGF0YSwgc2l6ZV90ICBzaXplICk7Cit2b2lkICAgICAgIG5ldGRlbGF5X3NlbmRfYXV4KCBOZXREZWxheSAgZGVsYXksIGNvbnN0IHZvaWQqICBkYXRhLCBzaXplX3QgIHNpemUsIHZvaWQqICBvcGFxdWUgKTsKK3ZvaWQgICAgICAgbmV0ZGVsYXlfZGVzdHJveSggTmV0RGVsYXkgIGRlbGF5ICk7CisKKy8qIG5ldHdvcmsgdHJhZmZpYyBzaGFwZXIgYW5kIGRlbGF5ZXIgKi8KK2V4dGVybiBOZXRTaGFwZXIgICBhbmRyb2lkX25ldF9zaGFwZXJfaW47CitleHRlcm4gTmV0U2hhcGVyICAgYW5kcm9pZF9uZXRfc2hhcGVyX291dDsKK2V4dGVybiBOZXREZWxheSAgICBhbmRyb2lkX25ldF9kZWxheV9pbjsKKworQU5EUk9JRF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBfU0xJUlBfU0hBUEVSX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9hbmRyb2lkX2tleWNvZGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9hbmRyb2lkX2tleWNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjMmEwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2FuZHJvaWRfa2V5Y29kZXMuaApAQCAtMCwwICsxLDIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvKiBUaGlzIGV4dGVuZHMgdGhlIGxpc3Qgb2Yga2V5IGNvZGVzIHRoYXQgYXJlIGRlZmluZWQgaW4gbGludXhfa2V5Y29kZXMuaAorKi8KKworI3ByYWdtYSBvbmNlCisKKy8vIE5vdGU6IHFlbXUtdXNlci1ldmVudC1hZ2VudC1pbXBsLmMgbGltaXRzIGtleSB2YWx1ZXMgdG8gMHgzZmYgKDEwMjMpCisKKyNkZWZpbmUgS0VZX0FQUFNXSVRDSCAgICA1ODAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2FyZ2IuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2FyZ2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI5Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vYXJnYi5oCkBAIC0wLDAgKzEsODYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisvKiB0aGlzIGZpbGUgY29udGFpbnMgdGVtcGxhdGUgY29kZSBhbmQgbWF5IGJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzICovCisKKyNpZm5kZWYgQVJHQl9UX0RFRklORUQKKyNkZWZpbmUgQVJHQl9UX0RFRklORUQKKyNpZiBVU0VfTU1YCisjaW5jbHVkZSA8bW1pbnRyaW4uaD4KKwordHlwZWRlZiBfX202NCAgIG1teF90OwordHlwZWRlZiAgbW14X3QgIGFyZ2JfdDsKKworc3RhdGljIGlubGluZSBtbXhfdAorbW14X2xvYWQ4ODg4KCB1bnNpZ25lZCAgdmFsdWUsIG1teF90ICB6ZXJvICkKK3sKKyAgICByZXR1cm4gX21tX3VucGFja2xvX3BpOCggX21tX2N2dHNpMzJfc2k2NCAodmFsdWUpLCB6ZXJvKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZAorbW14X3NhdmU4ODg4KCBtbXhfdCAgIGFyZ2IsIG1teF90ICB6ZXJvICkKK3sKKyAgICByZXR1cm4gKHVuc2lnbmVkKSBfbW1fY3Z0c2k2NF9zaTMyKCBfbW1fcGFja3NfcHUxNiggYXJnYiwgemVybyApICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbW14X3QKK21teF9leHBhbmQxNiggaW50ICB2YWx1ZSApCit7CisgICAgbW14X3QgIHQxID0gX21tX2N2dHNpMzJfc2k2NCggdmFsdWUgKTsKKyAgICByZXR1cm4gX21tX3BhY2tzX3BpMzIoIHQxLCB0MSApOworfQorCitzdGF0aWMgaW5saW5lIG1teF90CittbXhfbXVsc2hpZnQoIG1teF90ICAgYXJnYiwgaW50ICBtdWx0aXBsaWVyLCBpbnQgIHJzaGlmdCwgbW14X3QgIHplcm8gKQoreworICAgIG1teF90ICAgYXIgICA9IF9tbV91bnBhY2toaV9waTE2KGFyZ2IsIHplcm8gKTsKKyAgICBtbXhfdCAgIGdiICAgPSBfbW1fdW5wYWNrbG9fcGkxNihhcmdiLCB6ZXJvICk7CisgICAgbW14X3QgICBtdWx0ID0gbW14X2V4cGFuZDE2KG11bHRpcGxpZXIpOworCisgICAgYXIgPSBfbW1fc3JsaV9waTMyKCBfbW1fbWFkZF9waTE2KCBhciwgbXVsdCApLCByc2hpZnQgKTsKKyAgICBnYiA9IF9tbV9zcmxpX3BpMzIoIF9tbV9tYWRkX3BpMTYoIGdiLCBtdWx0ICksIHJzaGlmdCApOworCisgICAgcmV0dXJuIF9tbV9wYWNrc19waTMyKCBnYiwgYXIgKTsKK30KKworc3RhdGljIGlubGluZSBtbXhfdAorbW14X2ludGVycDI1NSggbW14X3QgIG0xLCBtbXhfdCAgbTIsIG1teF90ICB6ZXJvLCBpbnQgIGFscGhhICkKK3sKKyAgICBtbXhfdCAgbXVsdCwgbXVsdDIsIHQxLCB0MiwgcjEsIHIyOworCisgICAgLy8gbTEgPSBbIGExIHwgcjEgfCBnMSB8IGIxIF0KKyAgICAvLyBtMiA9IFsgYTIgfCByMiB8IGcyIHwgYjIgXQorICAgIGFscGhhID0gKGFscGhhIDw8IDE2KSB8IChhbHBoYSBeIDI1NSk7CisgICAgbXVsdCAgPSBfbW1fY3Z0c2kzMl9zaTY0KCBhbHBoYSApOyAgICAgICAgICAgICAgICAgICAvLyBtdWx0ICA9IFsgIDAgIHwgIDAgIHwgIGEgIHwgMS1hIF0KKyAgICBtdWx0MiA9IF9tbV9zbGxpX3NpNjQoIG11bHQsIDMyICk7ICAgICAgICAgICAgICAgICAgIC8vIG11bHQyID0gWyAgYSAgfCAxLWEgfCAgMCAgfCAgMCAgXQorICAgIG11bHQgID0gX21tX29yX3NpNjQoIG11bHQsIG11bHQyICk7ICAgICAgICAgICAgICAgICAgLy8gbXVsdHMgPSBbICBhICB8IDEtYSB8ICBhICB8IDEtYSBdCisKKyAgICB0MSA9IF9tbV91bnBhY2toaV9waTE2KCBtMSwgbTIgKTsgICAgLy8gdDEgPSBbIGEyIHwgYTEgfCByMiB8IHIxIF0KKyAgICByMSA9IF9tbV9tYWRkX3BpMTYoIHQxLCBtdWx0ICk7ICAgICAgLy8gcjEgPSBbICAgcmEgICAgfCAgICByciAgIF0KKworICAgIHQyID0gX21tX3VucGFja2xvX3BpMTYoIG0xLCBtMiApOyAgICAvLyB0MSA9IFsgZzIgfCBnMSB8IGIyIHwgYjEgXQorICAgIHIyID0gX21tX21hZGRfcGkxNiggdDIsIG11bHQgKTsgICAgICAvLyByMiA9IFsgICByZyAgICB8ICAgIHJiICAgXQorCisgICAgcjEgPSBfbW1fc3JsaV9waTMyKCByMSwgOCApOworICAgIHIyID0gX21tX3NybGlfcGkzMiggcjIsIDggKTsKKworICAgIHJldHVybiAgX21tX3BhY2tzX3BpMzIoIHIyLCByMSApOworfQorCisjZGVmaW5lICAgQVJHQl9ERUNMX1pFUk8oKSAgICAgIG1teF90ICAgIF96ZXJvID0gX21tX3NldHplcm9fc2k2NCgpCisjZGVmaW5lICAgQVJHQl9ERUNMKHgpICAgICAgICAgIG1teF90ICAgIHgKKyNkZWZpbmUgICBBUkdCX0RFQ0wyKHgxLHgyKSAgICAgbW14X3QgICAgeDEsIHgyCisjZGVmaW5lICAgQVJHQl9aRVJPKHgpICAgICAgICAgIHggPSBfemVybworI2RlZmluZSAgIEFSR0JfVU5QQUNLKHgsdikgICAgICB4ID0gIG1teF9sb2FkODg4OCgodiksIF96ZXJvKQorI2RlZmluZSAgIEFSR0JfUEFDSyh4KSAgICAgICAgICBtbXhfc2F2ZTg4ODgoeCwgX3plcm8pCisjZGVmaW5lICAgQVJHQl9DT1BZKHgseSkgICAgICAgIHggPSB5CisjZGVmaW5lICAgQVJHQl9TVU0oeDEseDIseDMpICAgIHgxID0gX21tX2FkZF9waTMyKHgyLCB4MykKKyNkZWZpbmUgICBBUkdCX1JFRFVDRSh4LHJlZCkgICBcCisgICAgKHsgXAorICAgICAgICBpbnQgIF9yZWQgPSAocmVkKSA+PiA4OyAgXAorICAgICAgICBpZiAoX3JlZCA8IDI1NikgXAorICAgICAgICAgICAgeCA9IG1teF9tdWxzaGlmdCggeCwgX3JlZCwgOCwgX3plcm8gKTsgXAorICAgIH0pCisKKyNkZWZpbmUgIEFSR0JfSU5URVJQMjU1KHgxLHgyLHgzLGFscGhhKSAgXAorICAgIHgxID0gbW14X2ludGVycDI1NSggeDIsIHgzLCBfemVybywgKGFscGhhKSkKKworI2RlZmluZSAgICBBUkdCX0FERFdfMTEoeDEseDIseDMpICBcCisgICAgQVJHQl9TVU0oeDEseDIseDMpCisKKyNkZWZpbmUgICAgQVJHQl9BRERXXzMxKHgxLHgyLHgzKSAgXAorICAgICh7IFwKKyAgICAgICAgbW14X3QgICBfdDEgPSBfbW1fYWRkX3BpMTYoeDIsIHgzKTsgIFwKKyAgICAgICAgbW14X3QgICBfdDIgPSBfbW1fc2xsaV9waTE2KHgyLCAxKTsgIFwKKyAgICAgICAgeDEgPSBfbW1fYWRkX3BpMTYoX3QxLCBfdDIpOyAgXAorICAgIH0pCisKKyNkZWZpbmUgICAgQVJHQl9BRERXXzEzKHgxLHgyLHgzKSAgXAorICAgICh7IFwKKyAgICAgICAgbW14X3QgICBfdDEgPSBfbW1fYWRkX3BpMTYoeDIsIHgzKTsgIFwKKyAgICAgICAgbW14X3QgICBfdDIgPSBfbW1fc2xsaV9waTE2KHgzLCAxKTsgIFwKKyAgICAgICAgeDEgPSBfbW1fYWRkX3BpMTYoX3QxLCBfdDIpOyAgXAorICAgIH0pCisKKyNkZWZpbmUgICAgQVJHQl9TSFIoeDEseDIscykgICBcCisgICAgeDEgPSBfbW1fc3JsaV9waTE2KHgyLCBzKQorCisKKyNkZWZpbmUgICAgQVJHQl9NVUxTSElGVCh4MSx4Mix2LHMpICAgXAorICAgIHgxID0gbW14X211bHNoaWZ0KHgyLCB2LCBzLCBfemVybykKKworI2RlZmluZSAgIEFSR0JfQkVHSU4gX21tX2VtcHR5KCkKKyNkZWZpbmUgICBBUkdCX0RPTkUgIF9tbV9lbXB0eSgpCisKKyNkZWZpbmUgICBBUkdCX1JFU0NBTEVfU0hJRlQgICAgICAxMAorI2RlZmluZSAgIEFSR0JfREVDTF9TQ0FMRShzMixzKSAgIGludCAgIHMyID0gKGludCkoKHMpKihzKSooMSA8PCBBUkdCX1JFU0NBTEVfU0hJRlQpKQorI2RlZmluZSAgIEFSR0JfUkVTQ0FMRSh4LHMyKSAgICAgIHggPSBtbXhfbXVsc2hpZnQoIHgsIHMyLCBBUkdCX1JFU0NBTEVfU0hJRlQsIF96ZXJvICkKKworI2Vsc2UgLyogIVVTRV9NTVggKi8KKwordHlwZWRlZiB1aW50MzJfdCAgICBhcmdiX3Q7CisKKyNkZWZpbmUgIEFSR0JfREVDTF9aRVJPKCkgICAvKiBub3RoaW5nICovCisjZGVmaW5lICBBUkdCX0RFQ0woeCkgICAgICAgYXJnYl90ICAgIHgjI19hZywgeCMjX3JiCisjZGVmaW5lICBBUkdCX0RFQ0wyKHgxLHgyKSAgYXJnYl90ICAgIHgxIyNfYWcsIHgxIyNfcmIsIHgyIyNfYWcsIHgyIyNfcmIKKyNkZWZpbmUgIEFSR0JfWkVSTyh4KSAgICAgICAoeCMjX2FnID0geCMjX3JiID0gMCkKKyNkZWZpbmUgIEFSR0JfQ09QWSh4LHkpICAgICAoeCMjX2FnID0geSMjX2FnLCB4IyNfcmIgPSB5IyNfcmIpCisKKyNkZWZpbmUgIEFSR0JfVU5QQUNLKHgsdikgIFwKKyAgICAoeyBcCisgICAgICAgIGFyZ2JfdCAgX3YgPSAoYXJnYl90KSh2KTsgXAorICAgICAgICB4IyNfYWcgPSAoX3YgPj4gOCkgJiAweGZmMDBmZjsgXAorICAgICAgICB4IyNfcmIgPSAoX3YpICAgICAgJiAweGZmMDBmZjsgXAorICAgIH0pCisKKyNkZWZpbmUgIEFSR0JfUEFDSyh4KSAgICAgICh1aW50MzJfdCkoKCh4IyNfYWcpIDw8IDgpIHwgeCMjX3JiKQorCisjZGVmaW5lICAgQVJHQl9TVU0oeDEseDIseDMpICBcCisgICAgKHsgXAorICAgICAgICB4MSMjX2FnID0geDIjI19hZyArIHgzIyNfYWc7IFwKKyAgICAgICAgeDEjI19yYiA9IHgyIyNfcmIgKyB4MyMjX3JiOyBcCisgICAgfSkKKworI2RlZmluZSAgIEFSR0JfUkVEVUNFKHgscmVkKSAgIFwKKyAgICAoeyBcCisgICAgICAgIGludCAgX3JlZCA9IChyZWQpID4+IDg7IFwKKyAgICAgICAgaWYgKF9yZWQgPCAyNTYpIHsgXAorICAgICAgICAgICAgeCMjX2FnID0gKCh4IyNfYWcqX3JlZCkgPj4gOCkgJiAweGZmMDBmZjsgXAorICAgICAgICAgICAgeCMjX3JiID0gKCh4IyNfcmIqX3JlZCkgPj4gOCkgJiAweGZmMDBmZjsgXAorICAgICAgICB9IFwKKyAgICB9KQorCisjZGVmaW5lICAgIEFSR0JfSU5URVJQMjU1KHgxLHgyLHgzLGFscGhhKSAgXAorICAgICh7IFwKKyAgICAgICAgaW50ICBfYWxwaGEgPSAoYWxwaGEpOyBcCisgICAgICAgIGludCAgX2lhbHBoYTsgXAorICAgICAgICBfYWxwaGEgKz0gX2FscGhhID4+IDg7IFwKKyAgICAgICAgX2lhbHBoYSA9IDI1NiAtIF9hbHBoYTsgXAorICAgICAgICB4MSMjX2FnID0gKCh4MiMjX2FnKl9pYWxwaGEgKyB4MyMjX2FnKl9hbHBoYSkgPj4gOCkgJiAweGZmMDBmZjsgIFwKKyAgICAgICAgeDEjI19yYiA9ICgoeDIjI19yYipfaWFscGhhICsgeDMjI19yYipfYWxwaGEpID4+IDgpICYgMHhmZjAwZmY7ICBcCisgICAgfSkKKworI2RlZmluZSAgICBBUkdCX0FERFdfMTEoeDEseDIseDMpICBcCisgICAgKHsgXAorICAgICAgICB4MSMjX2FnID0gKHgyIyNfYWcgKyB4MyMjX2FnKTsgIFwKKyAgICAgICAgeDEjI19yYiA9ICh4MiMjX3JiICsgeDMjI19yYik7ICBcCisgICAgfSkKKworI2RlZmluZSAgICBBUkdCX0FERFdfMzEoeDEseDIseDMpICBcCisgICAgKHsgXAorICAgICAgICB4MSMjX2FnID0gKDMqeDIjI19hZyArIHgzIyNfYWcpOyAgXAorICAgICAgICB4MSMjX3JiID0gKDMqeDIjI19yYiArIHgzIyNfcmIpOyAgXAorICAgIH0pCisKKyNkZWZpbmUgICAgQVJHQl9BRERXXzEzKHgxLHgyLHgzKSAgXAorICAgICh7IFwKKyAgICAgICAgeDEjI19hZyA9ICh4MiMjX2FnICsgMyp4MyMjX2FnKTsgIFwKKyAgICAgICAgeDEjI19yYiA9ICh4MiMjX3JiICsgMyp4MyMjX3JiKTsgIFwKKyAgICB9KQorCisjZGVmaW5lICAgIEFSR0JfTVVMU0hJRlQoeDEseDIsdixzKSAgIFwKKyAgICAoeyBcCisgICAgICAgIHVuc2lnbmVkICBfdnYgPSAodik7ICBcCisgICAgICAgIHgxIyNfYWcgPSAoKHgyIyNfYWcgKiBfdnYpID4+IChzKSkgJiAweGZmMDBmZjsgIFwKKyAgICAgICAgeDEjI19yYiA9ICgoeDIjI19yYiAqIF92dikgPj4gKHMpKSAmIDB4ZmYwMGZmOyAgXAorICAgIH0pCisKKyNkZWZpbmUgICBBUkdCX1NIUih4MSx4MixzKSAgXAorICAgICh7ICBcCisgICAgICAgIGludCAgX3MgPSAocyk7ICBcCisgICAgICAgIHgxIyNfYWcgPSAoeDIjI19hZyA+PiBfcykgJiAweGZmMDBmZjsgXAorICAgICAgICB4MSMjX3JiID0gKHgyIyNfcmIgPj4gX3MpICYgMHhmZjAwZmY7IFwKKyAgICB9KQorCisjZGVmaW5lICAgQVJHQl9CRUdJTiAoKHZvaWQpMCkKKyNkZWZpbmUgICBBUkdCX0RPTkUgICgodm9pZCkwKQorCisjZGVmaW5lICAgQVJHQl9SRVNDQUxFX1NISUZUICAgICAgOAorI2RlZmluZSAgIEFSR0JfREVDTF9TQ0FMRShzMixzKSAgIGludCAgIHMyID0gKGludCkoKHMpKihzKSooMSA8PCBBUkdCX1JFU0NBTEVfU0hJRlQpKQorI2RlZmluZSAgIEFSR0JfUkVTQ0FMRSh4LHNjYWxlMikgIEFSR0JfTVVMU0hJRlQoeCx4LHNjYWxlMixBUkdCX1JFU0NBTEVfU0hJRlQpCisKKyNlbmRpZiAvKiAhVVNFX01NWCAqLworCisjZGVmaW5lICAgQVJHQl9BREQoeDEseDIpICAgICBBUkdCX1NVTSh4MSx4MSx4MikKKyNkZWZpbmUgICBBUkdCX1JFQUQoeCxwKSAgICAgIEFSR0JfVU5QQUNLKHgsKih1aW50MzJfdCopKHApKQorI2RlZmluZSAgIEFSR0JfV1JJVEUoeCxwKSAgICAgKih1aW50MzJfdCopKHApID0gQVJHQl9QQUNLKHgpCisKKyNlbmRpZiAvKiAhQVJHQl9UX0RFRklORUQgKi8KKworCisKKyNpZmRlZiBBUkdCX1NDQUxFX0dFTkVSSUMKK3N0YXRpYyB2b2lkCitBUkdCX1NDQUxFX0dFTkVSSUMoIFNjYWxlT3AqICAgb3AgKQoreworICAgIGludCAgICAgICAgZHN0X3BpdGNoID0gb3AtPmRzdF9waXRjaDsKKyAgICBpbnQgICAgICAgIHNyY19waXRjaCA9IG9wLT5zcmNfcGl0Y2g7CisgICAgdWludDhfdCogICBkc3RfbGluZSAgPSBvcC0+ZHN0X2xpbmU7CisgICAgdWludDhfdCogICBzcmNfbGluZSAgPSBvcC0+c3JjX2xpbmU7CisgICAgQVJHQl9ERUNMX1NDQUxFKHNjYWxlMiwgb3AtPnNjYWxlKTsKKyAgICBpbnQgICAgICAgIGg7CisgICAgaW50ICAgICAgICBzeCA9IG9wLT5zeDsKKyAgICBpbnQgICAgICAgIHN5ID0gb3AtPnN5OworICAgIGludCAgICAgICAgaXggPSBvcC0+aXg7CisgICAgaW50ICAgICAgICBpeSA9IG9wLT5peTsKKworICAgIEFSR0JfQkVHSU47CisKKyAgICBzcmNfbGluZSArPSAoc3ggPj4gMTYpKjQgKyAoc3kgPj4gMTYpKnNyY19waXRjaDsKKyAgICBzeCAgICAgICAmPSAweGZmZmY7CisgICAgc3kgICAgICAgJj0gMHhmZmZmOworCisgICAgZm9yICggaCA9IG9wLT5yZC5zaXplLmg7IGggPiAwOyBoLS0gKSB7CisgICAgICAgIHVpbnQ4X3QqICBkc3QgPSBkc3RfbGluZTsKKyAgICAgICAgdWludDhfdCogIHNyYyA9IHNyY19saW5lOworICAgICAgICB1aW50OF90KiAgZHN0X2VuZCA9IGRzdCArIDQgKiBvcC0+cmQuc2l6ZS53OworICAgICAgICBpbnQgICAgICAgc3gxID0gc3g7CisgICAgICAgIGludCAgICAgICBzeTEgPSBzeTsKKworICAgICAgICBmb3IgKCA7IGRzdCA8IGRzdF9lbmQ7ICkgeworICAgICAgICAgICAgaW50ICBzeDIgPSBzeDEgKyBpeDsKKyAgICAgICAgICAgIGludCAgc3kyID0gc3kxICsgaXk7CisKKyAgICAgICAgICAgIEFSR0JfREVDTF9aRVJPKCk7CisgICAgICAgICAgICBBUkdCX0RFQ0woc3BpeCk7CisgICAgICAgICAgICBBUkdCX0RFQ0wocGl4KTsKKyAgICAgICAgICAgIEFSR0JfWkVSTyhwaXgpOworCisgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBkZXN0aW5hdGlvbiBwaXhlbCBtYXBzIHRvIHRoZSAoc3gxLHN5MSktKHN4MixzeTIpCisgICAgICAgICAgICAqIHNvdXJjZSBzcXVhcmUsIHdlJ3JlIGdvaW5nIHRvIGNvbXB1dGUgdGhlIHN1bSBvZiBpdHMgcGl4ZWxzJworICAgICAgICAgICAgKiBjb2xvcnMuLi4gIHNpbXBsZSBib3ggZmlsdGVyaW5nCisgICAgICAgICAgICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCAgZ3N5LCBnc3g7CisgICAgICAgICAgICAgICAgZm9yICggZ3N5ID0gMDsgZ3N5IDwgc3kyOyBnc3kgKz0gNjU1MzYgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoIGdzeCA9IDA7IGdzeCA8IHN4MjsgZ3N4ICs9IDY1NTM2ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogIHMgICAgPSBzcmMgKyAoZ3N4ID4+IDE2KSo0ICsgKGdzeSA+PiAxNikqc3JjX3BpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHhtaW4gPSBnc3gsIHhtYXggPSBnc3ggKyA2NTUzNiwgeW1pbiA9IGdzeSwgeW1heCA9IGdzeSArIDY1NTM2OworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgIHd3LCBoaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICByZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWluIDwgc3gxKSB4bWluID0gc3gxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhtYXggPiBzeDIpIHhtYXggPSBzeDI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeW1pbiA8IHN5MSkgeW1pbiA9IHN5MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5bWF4ID4gc3kyKSB5bWF4ID0gc3kyOworCisgICAgICAgICAgICAgICAgICAgICAgICB3dyA9ICh1bnNpZ25lZCkoeG1heC14bWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCA9IHd3OworCisgICAgICAgICAgICAgICAgICAgICAgICBoaCA9ICh1bnNpZ25lZCkoeW1heC15bWluKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZCA9IChoaCA8IDY1NTM2KSA/IChyZWQqaGggPj4gMTZVKSA6IHJlZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUkdCX1JFRFVDRShzcGl4LHJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBUkdCX0FERChwaXgsc3BpeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFSR0JfUkVTQ0FMRShwaXgsc2NhbGUyKTsKKyAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LGRzdCk7CisKKyAgICAgICAgICAgIHN4MSAgPSBzeDI7CisgICAgICAgICAgICBzcmMgKz0gKHN4MSA+PiAxNikqNDsKKyAgICAgICAgICAgIHN4MSAmPSAweGZmZmY7CisgICAgICAgICAgICBkc3QgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIHN5ICAgICAgICs9IGl5OworICAgICAgICBzcmNfbGluZSArPSAoc3kgPj4gMTYpKnNyY19waXRjaDsKKyAgICAgICAgc3kgICAgICAgJj0gMHhmZmZmOworCisgICAgICAgIGRzdF9saW5lICs9IGRzdF9waXRjaDsKKyAgICB9CisgICAgQVJHQl9ET05FOworfQorI2VuZGlmCisjdW5kZWYgIEFSR0JfU0NBTEVfR0VORVJJQworCisKKyNpZmRlZiBBUkdCX1NDQUxFXzA1X1RPXzEwCitzdGF0aWMgaW5saW5lIGludCBjcm9zcyggaW50ICB4LCBpbnQgIHkgKSB7CisgICAgaWYgKHggPT0gNjU1MzYgJiYgeSA9PSA2NTUzNikKKyAgICAgICAgcmV0dXJuIDY1NTM2OworCisgICAgcmV0dXJuIChpbnQpKCh1bnNpZ25lZCl4ICogKHVuc2lnbmVkKXkgPj4gMTZVKTsKK30KKworc3RhdGljIHZvaWQKK3NjYWxlXzA1X3RvXzEwKCBTY2FsZU9wKiAgIG9wICkKK3sKKyAgICBpbnQgICAgICAgIGRzdF9waXRjaCA9IG9wLT5kc3RfcGl0Y2g7CisgICAgaW50ICAgICAgICBzcmNfcGl0Y2ggPSBvcC0+c3JjX3BpdGNoOworICAgIHVpbnQ4X3QqICAgZHN0X2xpbmUgID0gb3AtPmRzdF9saW5lOworICAgIHVpbnQ4X3QqICAgc3JjX2xpbmUgID0gb3AtPnNyY19saW5lOworICAgIEFSR0JfREVDTF9TQ0FMRShzY2FsZTIsIG9wLT5zY2FsZSk7CisgICAgaW50ICAgICAgICBoOworICAgIGludCAgICAgICAgc3ggPSBvcC0+c3g7CisgICAgaW50ICAgICAgICBzeSA9IG9wLT5zeTsKKyAgICBpbnQgICAgICAgIGl4ID0gb3AtPml4OworICAgIGludCAgICAgICAgaXkgPSBvcC0+aXk7CisKKyAgICBBUkdCX0JFR0lOOworCisgICAgc3JjX2xpbmUgKz0gKHN4ID4+IDE2KSo0ICsgKHN5ID4+IDE2KSpzcmNfcGl0Y2g7CisgICAgc3ggICAgICAgJj0gMHhmZmZmOworICAgIHN5ICAgICAgICY9IDB4ZmZmZjsKKworICAgIGZvciAoIGggPSBvcC0+cmQuc2l6ZS5oOyBoID4gMDsgaC0tICkgeworICAgICAgICB1aW50OF90KiAgZHN0ID0gZHN0X2xpbmU7CisgICAgICAgIHVpbnQ4X3QqICBzcmMgPSBzcmNfbGluZTsKKyAgICAgICAgdWludDhfdCogIGRzdF9lbmQgPSBkc3QgKyA0Km9wLT5yZC5zaXplLnc7CisgICAgICAgIGludCAgICAgICBzeDEgPSBzeDsKKyAgICAgICAgaW50ICAgICAgIHN5MSA9IHN5OworCisgICAgICAgIGZvciAoIDsgZHN0IDwgZHN0X2VuZDsgKSB7CisgICAgICAgICAgICBpbnQgIHN4MiA9IHN4MSArIGl4OworICAgICAgICAgICAgaW50ICBzeTIgPSBzeTEgKyBpeTsKKworICAgICAgICAgICAgQVJHQl9ERUNMX1pFUk8oKTsKKyAgICAgICAgICAgIEFSR0JfREVDTDIoc3BpeCwgcGl4KTsKKworICAgICAgICAgICAgaW50ICAgICAgb2ZmID0gc3JjX3BpdGNoOworICAgICAgICAgICAgaW50ICAgICAgZngxID0gc3gxICYgMHhmZmZmOworICAgICAgICAgICAgaW50ICAgICAgZngyID0gc3gyICYgMHhmZmZmOworICAgICAgICAgICAgaW50ICAgICAgZnkxID0gc3kxICYgMHhmZmZmOworICAgICAgICAgICAgaW50ICAgICAgZnkyID0gc3kyICYgMHhmZmZmOworCisgICAgICAgICAgICBpbnQgICAgICBjZW50ZXJfeCA9ICgoc3gxID4+IDE2KSArIDEpIDwgKChzeDItMSkgPj4gMTYpOworICAgICAgICAgICAgaW50ICAgICAgY2VudGVyX3kgPSAoKHN5MSA+PiAxNikgKyAxKSA8ICgoc3kyLTEpID4+IDE2KTsKKworICAgICAgICAgICAgQVJHQl9aRVJPKHBpeCk7CisKKyAgICAgICAgICAgIGlmIChmeDIgPT0gMCkgeworICAgICAgICAgICAgICAgIGZ4MiAgPSA2NTUzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmeTIgPT0gMCkgeworICAgICAgICAgICAgICAgIGZ5MiAgPSA2NTUzNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ4MSA9IDY1NTM2IC0gZngxOworICAgICAgICAgICAgZnkxID0gNjU1MzYgLSBmeTE7CisKKyAgICAgICAgICAgIC8qKiBUT1AgQkFORAorICAgICAgICAgICAgICoqLworCisgICAgICAgICAgICAvKiB0b3AtbGVmdCBwaXhlbCAqLworICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgsc3JjKTsKKyAgICAgICAgICAgIEFSR0JfUkVEVUNFKHNwaXgsY3Jvc3MoZngxLGZ5MSkpOworICAgICAgICAgICAgQVJHQl9BREQocGl4LHNwaXgpOworCisgICAgICAgICAgICAvKiB0b3AtY2VudGVyIHBpeGVsLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4LHNyYyArIDQpOworICAgICAgICAgICAgaWYgKGNlbnRlcl94KSB7CisgICAgICAgICAgICAgICAgQVJHQl9SRURVQ0Uoc3BpeCxmeTEpOworICAgICAgICAgICAgICAgIEFSR0JfQUREKHBpeCxzcGl4KTsKKyAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeCxzcmMgKyA4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdG9wLXJpZ2h0IHBpeGVsICovCisgICAgICAgICAgICBBUkdCX1JFRFVDRShzcGl4LGNyb3NzKGZ4MixmeTEpKTsKKyAgICAgICAgICAgIEFSR0JfQUREKHBpeCxzcGl4KTsKKworICAgICAgICAgICAgLyoqIE1JRERMRSBCQU5ELCBJRiBBTlkKKyAgICAgICAgICAgICAqKi8KKyAgICAgICAgICAgIGlmIChjZW50ZXJfeSkgeworICAgICAgICAgICAgICAgIC8qIGxlZnQtbWlkZGxlIHBpeGVsICovCisgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgsc3JjICsgb2ZmKTsKKyAgICAgICAgICAgICAgICBBUkdCX1JFRFVDRShzcGl4LGZ4MSk7CisgICAgICAgICAgICAgICAgQVJHQl9BREQocGl4LHNwaXgpOworCisgICAgICAgICAgICAgICAgLyogY2VudGVyIHBpeGVsLCBpZiBhbnkgKi8KKyAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeCxzcmMgKyBvZmYgKyA0KTsKKyAgICAgICAgICAgICAgICBpZiAoY2VudGVyX3gpIHsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BREQocGl4LHNwaXgpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeCxzcmMgKyBvZmYgKyA4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiByaWdodC1taWRkbGUgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICBBUkdCX1JFRFVDRShzcGl4LGZ4Mik7CisgICAgICAgICAgICAgICAgQVJHQl9BREQocGl4LHNwaXgpOworCisgICAgICAgICAgICAgICAgb2ZmICs9IHNyY19waXRjaDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIEJPVFRPTSBCQU5ECisgICAgICAgICAgICAgKiovCisgICAgICAgICAgICAvKiBsZWZ0LWJvdHRvbSBwaXhlbCAqLworICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgsc3JjICsgb2ZmKTsKKyAgICAgICAgICAgIEFSR0JfUkVEVUNFKHNwaXgsY3Jvc3MoZngxLGZ5MikpOworICAgICAgICAgICAgQVJHQl9BREQocGl4LHNwaXgpOworCisgICAgICAgICAgICAvKiBjZW50ZXItYm90dG9tLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4LHNyYyArIG9mZiArIDQpOworICAgICAgICAgICAgaWYgKGNlbnRlcl94KSB7CisgICAgICAgICAgICAgICAgQVJHQl9SRURVQ0Uoc3BpeCxmeTIpOworICAgICAgICAgICAgICAgIEFSR0JfQUREKHBpeCxzcGl4KTsKKyAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeCxzcmMgKyBvZmYgKyA4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmlnaHQtYm90dG9tIHBpeGVsICovCisgICAgICAgICAgICBBUkdCX1JFRFVDRShzcGl4LGNyb3NzKGZ4MixmeTIpKTsKKyAgICAgICAgICAgIEFSR0JfQUREKHBpeCxzcGl4KTsKKworICAgICAgICAgICAgLyoqIFdSSVRFIElUCisgICAgICAgICAgICAgKiovCisgICAgICAgICAgICBBUkdCX1JFU0NBTEUocGl4LHNjYWxlMik7CisgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworCisgICAgICAgICAgICBzeDEgID0gc3gyOworICAgICAgICAgICAgc3JjICs9IChzeDEgPj4gMTYpKjQ7CisgICAgICAgICAgICBzeDEgJj0gMHhmZmZmOworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBzeSAgICAgICArPSBpeTsKKyAgICAgICAgc3JjX2xpbmUgKz0gKHN5ID4+IDE2KSpzcmNfcGl0Y2g7CisgICAgICAgIHN5ICAgICAgICY9IDB4ZmZmZjsKKworICAgICAgICBkc3RfbGluZSArPSBkc3RfcGl0Y2g7CisgICAgfQorICAgIEFSR0JfRE9ORTsKK30KKyNlbmRpZgorI3VuZGVmIEFSR0JfU0NBTEVfMDVfVE9fMTAKKworCisjaWZkZWYgQVJHQl9TQ0FMRV9VUF9CSUxJTkVBUgorc3RhdGljIHZvaWQKK3NjYWxlX3VwX2JpbGluZWFyKCBTY2FsZU9wKiAgb3AgKQoreworICAgIGludCAgICAgICAgZHN0X3BpdGNoID0gb3AtPmRzdF9waXRjaDsKKyAgICBpbnQgICAgICAgIHNyY19waXRjaCA9IG9wLT5zcmNfcGl0Y2g7CisgICAgdWludDhfdCogICBkc3RfbGluZSAgPSBvcC0+ZHN0X2xpbmU7CisgICAgdWludDhfdCogICBzcmNfbGluZSAgPSBvcC0+c3JjX2xpbmU7CisgICAgaW50ICAgICAgICBzeCA9IG9wLT5zeDsKKyAgICBpbnQgICAgICAgIHN5ID0gb3AtPnN5OworICAgIGludCAgICAgICAgaXggPSBvcC0+aXg7CisgICAgaW50ICAgICAgICBpeSA9IG9wLT5peTsKKyAgICBpbnQgICAgICAgIHhsaW1pdCwgeWxpbWl0OworICAgIGludCAgICAgICAgaCwgc3gwOworCisgICAgQVJHQl9CRUdJTjsKKworICAgIC8qIHRoZSBjZW50ZXIgcGl4ZWwgaXMgYXQgKHN4K2l4LzIsIHN5K2l5LzIpLCB3ZSB0aGVuIHdhbnQgdG8gZ2V0ICovCisgICAgLyogdGhlIGZvdXIgbmVhcmVzdCBzb3VyY2UgcGl4ZWxzLCB3aGljaCBhcmUgYXQgKDAuNSwwLjUpIG9mZnNldHMgKi8KKworICAgIHN4ID0gc3ggKyBpeC8yIC0gMzI3Njg7CisgICAgc3kgPSBzeSArIGl5LzIgLSAzMjc2ODsKKworICAgIHhsaW1pdCA9IChvcC0+c3JjX3ctMSk7CisgICAgeWxpbWl0ID0gKG9wLT5zcmNfaC0xKTsKKworICAgIHN4MCA9IHN4OworCisgICAgZm9yICggaCA9IG9wLT5yZC5zaXplLmg7IGggPiAwOyBoLS0gKSB7CisgICAgICAgIHVpbnQ4X3QqICBkc3QgPSBkc3RfbGluZTsKKyAgICAgICAgdWludDhfdCogIGRzdF9lbmQgPSBkc3QgKyA0Km9wLT5yZC5zaXplLnc7CisKKyAgICAgICAgc3ggPSBzeDA7CisgICAgICAgIGZvciAoIDsgZHN0IDwgZHN0X2VuZDsgKSB7CisgICAgICAgICAgICBpbnQgICAgICAgIGV4MSwgZXgyLCBleTEsIGV5MiwgYWxwaGE7CisgICAgICAgICAgICB1aW50OF90KiAgIHM7CisKKyAgICAgICAgICAgIEFSR0JfREVDTF9aRVJPKCk7CisgICAgICAgICAgICBBUkdCX0RFQ0wyKHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgIEFSR0JfREVDTDIocGl4MyxwaXg0KTsKKyAgICAgICAgICAgIEFSR0JfREVDTChwaXgpOworCisgICAgICAgICAgICAvKiBmaW5kIHRoZSBmb3VyIG5laWdoYm91cnMgKi8KKyAgICAgICAgICAgIGV4MSA9IChzeCA+PiAxNik7CisgICAgICAgICAgICBleTEgPSAoc3kgPj4gMTYpOworICAgICAgICAgICAgZXgyID0gKHN4KzY1NTM1KSA+PiAxNjsKKyAgICAgICAgICAgIGV5MiA9IChzeSs2NTUzNSkgPj4gMTY7CisKKyAgICAgICAgICAgIGlmIChleDEgPCAwKSBleDEgPSAwOyBlbHNlIGlmIChleDEgPiB4bGltaXQpIGV4MSA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTEgPCAwKSBleTEgPSAwOyBlbHNlIGlmIChleTEgPiB5bGltaXQpIGV5MSA9IHlsaW1pdDsKKyAgICAgICAgICAgIGlmIChleDIgPCAwKSBleDIgPSAwOyBlbHNlIGlmIChleDIgPiB4bGltaXQpIGV4MiA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTIgPCAwKSBleTIgPSAwOyBlbHNlIGlmIChleTIgPiB5bGltaXQpIGV5MiA9IHlsaW1pdDsKKworICAgICAgICAgICAgZXgyID0gKGV4Mi1leDEpKjQ7CisgICAgICAgICAgICBleTIgPSAoZXkyLWV5MSkqc3JjX3BpdGNoOworCisgICAgICAgICAgICAvKiBpbnRlcnBvbGF0ZSAqLworICAgICAgICAgICAgcyAgID0gc3JjX2xpbmUgKyBleDEqNCArIGV5MSpzcmNfcGl0Y2g7CisgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHMpOworICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBzK2V4Mik7CisKKyAgICAgICAgICAgIGFscGhhICA9IChzeCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBBUkdCX0lOVEVSUDI1NShwaXgzLHNwaXgxLHNwaXgyLGFscGhhKTsKKworICAgICAgICAgICAgcyAgKz0gZXkyOworICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBzKTsKKyAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcytleDIpOworCisgICAgICAgICAgICBBUkdCX0lOVEVSUDI1NShwaXg0LHNwaXgxLHNwaXgyLGFscGhhKTsKKworICAgICAgICAgICAgYWxwaGEgPSAoc3kgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgQVJHQl9JTlRFUlAyNTUocGl4LHBpeDMscGl4NCxhbHBoYSk7CisKKyAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LGRzdCk7CisKKyAgICAgICAgICAgIHN4ICArPSBpeDsKKyAgICAgICAgICAgIGRzdCArPSA0OworICAgICAgICB9CisKKyAgICAgICAgc3kgICAgICAgKz0gaXk7CisgICAgICAgIGRzdF9saW5lICs9IGRzdF9waXRjaDsKKyAgICB9CisgICAgQVJHQl9ET05FOworfQorI2VuZGlmCisjdW5kZWYgQVJHQl9TQ0FMRV9VUF9CSUxJTkVBUgorCisjaWZkZWYgQVJHQl9TQ0FMRV9VUF9RVUlDS180eDQKK3N0YXRpYyB2b2lkCitBUkdCX1NDQUxFX1VQX1FVSUNLXzR4NCggU2NhbGVPcCogIG9wICkKK3sKKyAgICBpbnQgICAgICAgIGRzdF9waXRjaCA9IG9wLT5kc3RfcGl0Y2g7CisgICAgaW50ICAgICAgICBzcmNfcGl0Y2ggPSBvcC0+c3JjX3BpdGNoOworICAgIHVpbnQ4X3QqICAgZHN0X2xpbmUgID0gb3AtPmRzdF9saW5lOworICAgIHVpbnQ4X3QqICAgc3JjX2xpbmUgID0gb3AtPnNyY19saW5lOworICAgIGludCAgICAgICAgc3ggPSBvcC0+c3g7CisgICAgaW50ICAgICAgICBzeSA9IG9wLT5zeTsKKyAgICBpbnQgICAgICAgIGl4ID0gb3AtPml4OworICAgIGludCAgICAgICAgaXkgPSBvcC0+aXk7CisgICAgaW50ICAgICAgICB4bGltaXQsIHlsaW1pdDsKKyAgICBpbnQgICAgICAgIGgsIHN4MDsKKworICAgIEFSR0JfQkVHSU47CisKKyAgICAvKiB0aGUgY2VudGVyIHBpeGVsIGlzIGF0IChzeCtpeC8yLCBzeStpeS8yKSwgd2UgdGhlbiB3YW50IHRvIGdldCAqLworICAgIC8qIHRoZSBmb3VyIG5lYXJlc3Qgc291cmNlIHBpeGVscywgd2hpY2ggYXJlIGF0ICgwLjUsMC41KSBvZmZzZXRzICovCisKKyAgICBzeCA9IHN4ICsgaXgvMiAtIDMyNzY4OworICAgIHN5ID0gc3kgKyBpeS8yIC0gMzI3Njg7CisKKyAgICB4bGltaXQgPSAob3AtPnNyY193LTEpOworICAgIHlsaW1pdCA9IChvcC0+c3JjX2gtMSk7CisKKyAgICBzeDAgPSBzeDsKKworICAgIGZvciAoIGggPSBvcC0+cmQuc2l6ZS5oOyBoID4gMDsgaC0tICkgeworICAgICAgICB1aW50OF90KiAgZHN0ID0gZHN0X2xpbmU7CisgICAgICAgIHVpbnQ4X3QqICBkc3RfZW5kID0gZHN0ICsgNCpvcC0+cmQuc2l6ZS53OworCisgICAgICAgIHN4ID0gc3gwOworICAgICAgICBmb3IgKCA7IGRzdCA8IGRzdF9lbmQ7ICkgeworICAgICAgICAgICAgaW50ICAgICAgICBleDEsIGV4MiwgZXkxLCBleTI7CisgICAgICAgICAgICB1aW50OF90KiAgIHA7CisgICAgICAgICAgICBBUkdCX0RFQ0xfWkVSTygpOworICAgICAgICAgICAgQVJHQl9ERUNMKHBpeCk7CisgICAgICAgICAgICBBUkdCX0RFQ0wyKHNwaXgxLCBzcGl4Mik7CisgICAgICAgICAgICBBUkdCX0RFQ0wyKHBpeDMsIHBpeDQpOworCisgICAgICAgICAgICAvKiBmaW5kIHRoZSBmb3VyIG5laWdoYm91cnMgKi8KKyAgICAgICAgICAgIGV4MSA9IChzeCA+PiAxNik7CisgICAgICAgICAgICBleTEgPSAoc3kgPj4gMTYpOworICAgICAgICAgICAgZXgyID0gKHN4KzY1NTM1KSA+PiAxNjsKKyAgICAgICAgICAgIGV5MiA9IChzeSs2NTUzNSkgPj4gMTY7CisKKyAgICAgICAgICAgIGlmIChleDEgPCAwKSBleDEgPSAwOyBlbHNlIGlmIChleDEgPiB4bGltaXQpIGV4MSA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTEgPCAwKSBleTEgPSAwOyBlbHNlIGlmIChleTEgPiB5bGltaXQpIGV5MSA9IHlsaW1pdDsKKyAgICAgICAgICAgIGlmIChleDIgPCAwKSBleDIgPSAwOyBlbHNlIGlmIChleDIgPiB4bGltaXQpIGV4MiA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTIgPCAwKSBleTIgPSAwOyBlbHNlIGlmIChleTIgPiB5bGltaXQpIGV5MiA9IHlsaW1pdDsKKworICAgICAgICAgICAgLyogaW50ZXJwb2xhdGUgKi8KKyAgICAgICAgICAgIHAgICA9IChzcmNfbGluZSArIGV4MSo0ICsgZXkxKnNyY19waXRjaCk7CisKKyAgICAgICAgICAgIGV4MiA9IChleDItZXgxKSo0OworICAgICAgICAgICAgZXkyID0gKGV5Mi1leTEpKnNyY19waXRjaDsKKworICAgICAgICAgICAgc3dpdGNoICgoKHN4ID4+IDE0KSAmIDMpIHwgKChzeSA+PiAxMikgJiAxMikpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICoodWludDMyX3QqKWRzdCA9ICoodWludDMyX3QqKXA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogdG9wLWxpbmUgaXMgZWFzeSAqLworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18zMShwaXgsc3BpeDEsc3BpeDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCwgZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTEocGl4LCBzcGl4MSwgc3BpeDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDEpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCwgZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTMocGl4LHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9TSFIocGl4LHBpeCwyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9XUklURShwaXgsIGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogc2Vjb25kIGxpbmUgaXMgaGFyZGVyICovCisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzMxKHBpeCxzcGl4MSxzcGl4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfU0hSKHBpeCxwaXgsMik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LCBkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18zMShwaXgzLHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBleTI7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMzEocGl4NCxzcGl4MSxzcGl4Mik7CisKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzMxKHBpeCxwaXgzLHBpeDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMShwaXgzLHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBleTI7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTEocGl4NCxzcGl4MSxzcGl4Mik7CisKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzMxKHBpeCxwaXgzLHBpeDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDMpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMyhwaXgzLHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBleTI7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTMocGl4NCxzcGl4MSxzcGl4Mik7CisKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzMxKHBpeCxwaXgzLHBpeDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAvKiB0aGlyZCBsaW5lICovCisgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXkyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzExKHBpeCxzcGl4MSxzcGl4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfU0hSKHBpeCxwaXgsMSk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LCBkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18zMShwaXgzLHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBleTI7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMzEocGl4NCxzcGl4MSxzcGl4Mik7CisKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzExKHBpeCxwaXgzLHBpeDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDMpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTEocGl4MyxzcGl4MSxzcGl4Mik7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gZXkyOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzExKHBpeDQsc3BpeDEsc3BpeDIpOworCisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMShwaXgscGl4MyxwaXg0KTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9TSFIocGl4LHBpeCwyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9XUklURShwaXgsZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzEzKHBpeDMsc3BpeDEsc3BpeDIpOworICAgICAgICAgICAgICAgICAgICBwICs9IGV5MjsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMyhwaXg0LHNwaXgxLHNwaXgyKTsKKworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTEocGl4LHBpeDMscGl4NCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfU0hSKHBpeCxwaXgsMyk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgIC8qIGxhc3QgbGluZSAqLworICAgICAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleTIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTMocGl4LHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9TSFIocGl4LHBpeCwyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9XUklURShwaXgsIGRzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18zMShwaXgzLHNwaXgxLHNwaXgyKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBleTI7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMzEocGl4NCxzcGl4MSxzcGl4Mik7CisKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzEzKHBpeCxwaXgzLHBpeDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1NIUihwaXgscGl4LDQpOworICAgICAgICAgICAgICAgICAgICBBUkdCX1dSSVRFKHBpeCxkc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MSwgcCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfUkVBRChzcGl4MiwgcCtleDIpOworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTEocGl4MyxzcGl4MSxzcGl4Mik7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gZXkyOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzExKHBpeDQsc3BpeDEsc3BpeDIpOworCisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMyhwaXgscGl4MyxwaXg0KTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9TSFIocGl4LHBpeCwzKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9XUklURShwaXgsZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDEsIHApOworICAgICAgICAgICAgICAgICAgICBBUkdCX1JFQUQoc3BpeDIsIHArZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9BRERXXzEzKHBpeDMsc3BpeDEsc3BpeDIpOworICAgICAgICAgICAgICAgICAgICBwICs9IGV5MjsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgxLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgQVJHQl9SRUFEKHNwaXgyLCBwK2V4Mik7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfQUREV18xMyhwaXg0LHNwaXgxLHNwaXgyKTsKKworICAgICAgICAgICAgICAgICAgICBBUkdCX0FERFdfMTMocGl4LHBpeDMscGl4NCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfU0hSKHBpeCxwaXgsNCk7CisgICAgICAgICAgICAgICAgICAgIEFSR0JfV1JJVEUocGl4LGRzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeCAgKz0gaXg7CisgICAgICAgICAgICBkc3QgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIHN5ICAgICAgICs9IGl5OworICAgICAgICBkc3RfbGluZSArPSBkc3RfcGl0Y2g7CisgICAgfQorICAgIEFSR0JfRE9ORTsKK30KKyNlbmRpZgorI3VuZGVmICBBUkdCX1NDQUxFX1VQX1FVSUNLXzR4NAorCisKKyNpZmRlZiBBUkdCX1NDQUxFX05FQVJFU1QKKy8qIHRoaXMgdmVyc2lvbiBzY2FsZXMgdXAgd2l0aCBuZWFyZXN0IG5laWdoYm91cnMgLSBsb29rcyBjcmFwICovCitzdGF0aWMgdm9pZAorQVJHQl9TQ0FMRV9ORUFSRVNUKCBTY2FsZU9wKiAgb3AgKQoreworICAgIGludCAgICAgICAgZHN0X3BpdGNoID0gb3AtPmRzdF9waXRjaDsKKyAgICBpbnQgICAgICAgIHNyY19waXRjaCA9IG9wLT5zcmNfcGl0Y2g7CisgICAgdWludDhfdCogICBkc3RfbGluZSAgPSBvcC0+ZHN0X2xpbmU7CisgICAgdWludDhfdCogICBzcmNfbGluZSAgPSBvcC0+c3JjX2xpbmU7CisgICAgaW50ICAgICAgICBzeCA9IG9wLT5zeDsKKyAgICBpbnQgICAgICAgIHN5ID0gb3AtPnN5OworICAgIGludCAgICAgICAgaXggPSBvcC0+aXg7CisgICAgaW50ICAgICAgICBpeSA9IG9wLT5peTsKKyAgICBpbnQgICAgICAgIHhsaW1pdCwgeWxpbWl0OworICAgIGludCAgICAgICAgaCwgc3gwOworCisgICAgQVJHQl9CRUdJTjsKKworICAgIC8qIHRoZSBjZW50ZXIgcGl4ZWwgaXMgYXQgKHN4K2l4LzIsIHN5K2l5LzIpLCB3ZSB0aGVuIHdhbnQgdG8gZ2V0ICovCisgICAgLyogdGhlIGZvdXIgbmVhcmVzdCBzb3VyY2UgcGl4ZWxzLCB3aGljaCBhcmUgYXQgKDAuNSwwLjUpIG9mZnNldHMgKi8KKworICAgIHN4ID0gc3ggKyBpeC8yIC0gMzI3Njg7CisgICAgc3kgPSBzeSArIGl5LzIgLSAzMjc2ODsKKworICAgIHhsaW1pdCA9IChvcC0+c3JjX3ctMSk7CisgICAgeWxpbWl0ID0gKG9wLT5zcmNfaC0xKTsKKworICAgIHN4MCA9IHN4OworCisgICAgZm9yICggaCA9IG9wLT5yZC5zaXplLmg7IGggPiAwOyBoLS0gKSB7CisgICAgICAgIHVpbnQ4X3QqICBkc3QgPSBkc3RfbGluZTsKKyAgICAgICAgdWludDhfdCogIGRzdF9lbmQgPSBkc3QgKyA0Km9wLT5yZC5zaXplLnc7CisKKyAgICAgICAgc3ggPSBzeDA7CisgICAgICAgIGZvciAoIDsgZHN0IDwgZHN0X2VuZDsgKSB7CisgICAgICAgICAgICBpbnQgICAgICAgIGV4MSwgZXgyLCBleTEsIGV5MjsKKyAgICAgICAgICAgIHVuc2lnbmVkKiAgcDsKKworICAgICAgICAgICAgLyogZmluZCB0aGUgdG9wLWxlZnQgbmVpZ2hib3VyICovCisgICAgICAgICAgICBleDEgPSAoc3ggPj4gMTYpOworICAgICAgICAgICAgZXkxID0gKHN5ID4+IDE2KTsKKyAgICAgICAgICAgIGV4MiA9IGV4MSsxOworICAgICAgICAgICAgZXkyID0gZXkxKzE7CisKKyAgICAgICAgICAgIGlmIChleDEgPCAwKSBleDEgPSAwOyBlbHNlIGlmIChleDEgPiB4bGltaXQpIGV4MSA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTEgPCAwKSBleTEgPSAwOyBlbHNlIGlmIChleTEgPiB5bGltaXQpIGV5MSA9IHlsaW1pdDsKKyAgICAgICAgICAgIGlmIChleDIgPCAwKSBleDIgPSAwOyBlbHNlIGlmIChleDIgPiB4bGltaXQpIGV4MiA9IHhsaW1pdDsKKyAgICAgICAgICAgIGlmIChleTIgPCAwKSBleTIgPSAwOyBlbHNlIGlmIChleTIgPiB5bGltaXQpIGV5MiA9IHlsaW1pdDsKKworICAgICAgICAgICAgcCAgID0gKHVuc2lnbmVkKikoc3JjX2xpbmUgKyBleDEqNCArIGV5MSpzcmNfcGl0Y2gpOworICAgICAgICAgICAgaWYgKChzeCAmIDB4ZmZmZikgPj0gMzI3NjgpCisgICAgICAgICAgICAgICAgcCArPSAoZXgyLWV4MSk7CisgICAgICAgICAgICBpZiAoKHN5ICYgMHhmZmZmKSA+PSAzMjc2OCkKKyAgICAgICAgICAgICAgICBwID0gKHVuc2lnbmVkKikoKGNoYXIqKXAgKyAoZXkyLWV5MSkqc3JjX3BpdGNoKTsKKworICAgICAgICAgICAgKih1bnNpZ25lZCopZHN0ID0gcFswXTsKKworICAgICAgICAgICAgc3ggICs9IGl4OworICAgICAgICAgICAgZHN0ICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICBzeSAgICAgICArPSBpeTsKKyAgICAgICAgZHN0X2xpbmUgKz0gZHN0X3BpdGNoOworICAgIH0KK30KKyNlbmRpZgorI3VuZGVmICBBUkdCX1NDQUxFX05FQVJFU1QKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2NoYXJtYXAuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2NoYXJtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE0ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vY2hhcm1hcC5jCkBAIC0wLDAgKzEsNzM3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2NoYXJtYXAuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogUGFyc2VzIC5rY20gZmlsZSBwcm9kdWNpbmcga2V5IGNoYXJhY3RlcnMgbWFwLgorICogLmtjbSBmaWxlIHBhcnNlZCBieSB0aGlzIG1vZHVsZSBpcyBleHBlY3RlZCB0byBjb250YWluIDQgdHlwZXMgb2YKKyAqIGxpbmVzOgorICogMS4gQW4gZW1wdHkgbGluZSAoY29udGFpbmluZyBubyBjaGFyYWN0ZXJzLCBvciBvbmx5IHNwYWNlIG9yIHRhYgorICogICAgY2hhcmFjdGVycykuCisgKiAyLiBBIGNvbW1lbnQgbGluZSAoYmVnaW5zIHdpdGggJyMnKQorICogMy4gQSB0eXBlIHNlY3Rpb24gbGluZSAoYmVnaW5zIHdpdGggJ1snKQorICogNC4gQ2hhcmFjdGVyIG1hcCBsaW5lLCBmb3JtYXR0ZWQgYXMgc3VjaDoKKyAqIEtleSBjb2RlIHZhbHVlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBzcGFjZSBvciB0YWIgY2hhcmFjdGVycy4KKyAqIERpc3BsYXkgdmFsdWUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHNwYWNlIG9yIHRhYiBjaGFyYWN0ZXJzLgorICogTnVtYmVyIHZhbHVlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBzcGFjZSBvciB0YWIgY2hhcmFjdGVycy4KKyAqIEJhc2UgdmFsdWUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHNwYWNlIG9yIHRhYiBjaGFyYWN0ZXJzLgorICogQ2FwcyB2YWx1ZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgc3BhY2Ugb3IgdGFiIGNoYXJhY3RlcnMuCisgKiBGbiB2YWx1ZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgc3BhY2Ugb3IgdGFiIGNoYXJhY3RlcnMuCisgKiBDYXBzX2ZuIHZhbHVlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBzcGFjZSBvciB0YWIgY2hhcmFjdGVycy4KKyAqIEFsbCB2YWx1ZXMsIGV4Y2VwdCBmb3IgdGhlIGtleSBjb2RlIHZhbHVlIG11c3QgYmUgZWl0aGVyIGluIGNoYXJhY3RlcgorICogZm9ybSAoJ1gnLCB3aGVyZSBYIGlzIHRoZSB2YWx1ZSksIG9yIGluIGhleGFkZWNpbWFsIGZvcm0gKDB4WFhYWCwgd2hlcmUKKyAqIFhYWFggaXMgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlKS4gTm90ZSB0aGF0IGlmIHZhbHVlIGlzCisgKiBpbiBoZXhhZGVjaW1hbCBmb3JtLCBpdCBtdXN0IG5vdCBleGNlZWQgdmFsdWUgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluCisgKiB2YXJpYWJsZSBvZiAndW5zaWduZWQgc2hvcnQnIHR5cGUuCisgKiBCZWxsb3cgYXJlIGEgY291cGxlIG9mIGV4YW1wbGVzIG9mIHZhbGlkIC5rY20gZmlsZSBsaW5lczoKKyAqICMga2V5Y29kZSAgICAgICBkaXNwbGF5IG51bWJlciAgYmFzZSAgICBjYXBzICAgIGZuICAgICAgY2Fwc19mbgorICogQSAgICAgICAgICAgICAgICdBJyAgICAgJzInICAgICAnYScgICAgICdBJyAgICAgJyMnICAgICAweDAwCisgKiBQRVJJT0QgICAgICAgICAgJy4nICAgICAnLicgICAgICcuJyAgICAgJzonICAgICAnOicgICAgIDB4MjAyNgorICogU1BBQ0UgICAgICAgICAgIDB4MjAgICAgMHgyMCAgICAweDIwICAgIDB4MjAgICAgMHhFRjAxICAweEVGMDEKKyovCisKKy8qIE1heGltdW0gbGVuZ3RoIG9mIGEgbGluZSBleHBlY3RlZCBpbiAua2NtIGZpbGUuICovCisjZGVmaW5lIEtDTV9NQVhfTElORV9MRU4gICAgMTAyNAorCisvKiBNYXhpbXVtIGxlbmd0aCBvZiBhIHRva2VuIGluIGEga2V5IG1hcCBsaW5lLiAqLworI2RlZmluZSBLQ01fTUFYX1RPS0VOX0xFTiAgIDUxMgorCisvKiBNYXBzIHN5bWJvbCBuYW1lIGZyb20gLmtjbSBmaWxlIHRvIGEga2V5Y29kZSB2YWx1ZS4gKi8KK3R5cGVkZWYgc3RydWN0IEFLZXljb2RlTWFwRW50cnkgeworICAgIC8qIFN5bWJvbCBuYW1lIGZyb20gLmtjbSBmaWxlLiAqLworICAgIGNvbnN0IGNoYXIqIGtleV9uYW1lOworCisgICAgLyogS2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBzeW1ib2wuICovCisgICAgaW50ICAgICAgICAga2V5X2NvZGU7Cit9IEFLZXljb2RlTWFwRW50cnk7CisKKy8qIFJlc3VsdCBvZiBwYXJzaW5nIGEgbGluZSBpbiBhIC5rY20gZmlsZS4gKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogTGluZSBmb3JtYXQgd2FzIGJhZC4gKi8KKyAgICBCQURfRk9STUFULAorCisgICAgLyogTGluZSBoYWQgYmVlbiBza2lwcGVkIChhbiBlbXB0eSBsaW5lLCBvciBhIGNvbW1lbnQsIGV0Yy4pLiAqLworICAgIFNLSVBfTElORSwKKworICAgIC8qIExpbmUgcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUga2V5IG1hcC4gKi8KKyAgICBLRVlfRU5UUlksCit9IFBhcnNlU3RhdHVzOworCitzdGF0aWMgY29uc3QgQUtleWNvZGVNYXBFbnRyeSBrZXljb2RlX21hcFtdID0geworICAgIC8qICBTeW1ib2wgICAgICAgICAgIEtleSBjb2RlICovCisKKyAgICAgIHsgIkEiLCAgICAgICAgICAgICBrS2V5Q29kZUEgfSwKKyAgICAgIHsgIkIiLCAgICAgICAgICAgICBrS2V5Q29kZUIgfSwKKyAgICAgIHsgIkMiLCAgICAgICAgICAgICBrS2V5Q29kZUMgfSwKKyAgICAgIHsgIkQiLCAgICAgICAgICAgICBrS2V5Q29kZUQgfSwKKyAgICAgIHsgIkUiLCAgICAgICAgICAgICBrS2V5Q29kZUUgfSwKKyAgICAgIHsgIkYiLCAgICAgICAgICAgICBrS2V5Q29kZUYgfSwKKyAgICAgIHsgIkciLCAgICAgICAgICAgICBrS2V5Q29kZUcgfSwKKyAgICAgIHsgIkgiLCAgICAgICAgICAgICBrS2V5Q29kZUggfSwKKyAgICAgIHsgIkkiLCAgICAgICAgICAgICBrS2V5Q29kZUkgfSwKKyAgICAgIHsgIkoiLCAgICAgICAgICAgICBrS2V5Q29kZUogfSwKKyAgICAgIHsgIksiLCAgICAgICAgICAgICBrS2V5Q29kZUsgfSwKKyAgICAgIHsgIkwiLCAgICAgICAgICAgICBrS2V5Q29kZUwgfSwKKyAgICAgIHsgIk0iLCAgICAgICAgICAgICBrS2V5Q29kZU0gfSwKKyAgICAgIHsgIk4iLCAgICAgICAgICAgICBrS2V5Q29kZU4gfSwKKyAgICAgIHsgIk8iLCAgICAgICAgICAgICBrS2V5Q29kZU8gfSwKKyAgICAgIHsgIlAiLCAgICAgICAgICAgICBrS2V5Q29kZVAgfSwKKyAgICAgIHsgIlEiLCAgICAgICAgICAgICBrS2V5Q29kZVEgfSwKKyAgICAgIHsgIlIiLCAgICAgICAgICAgICBrS2V5Q29kZVIgfSwKKyAgICAgIHsgIlMiLCAgICAgICAgICAgICBrS2V5Q29kZVMgfSwKKyAgICAgIHsgIlQiLCAgICAgICAgICAgICBrS2V5Q29kZVQgfSwKKyAgICAgIHsgIlUiLCAgICAgICAgICAgICBrS2V5Q29kZVUgfSwKKyAgICAgIHsgIlYiLCAgICAgICAgICAgICBrS2V5Q29kZVYgfSwKKyAgICAgIHsgIlciLCAgICAgICAgICAgICBrS2V5Q29kZVcgfSwKKyAgICAgIHsgIlgiLCAgICAgICAgICAgICBrS2V5Q29kZVggfSwKKyAgICAgIHsgIlkiLCAgICAgICAgICAgICBrS2V5Q29kZVkgfSwKKyAgICAgIHsgIloiLCAgICAgICAgICAgICBrS2V5Q29kZVogfSwKKyAgICAgIHsgIjAiLCAgICAgICAgICAgICBrS2V5Q29kZTAgfSwKKyAgICAgIHsgIjEiLCAgICAgICAgICAgICBrS2V5Q29kZTEgfSwKKyAgICAgIHsgIjIiLCAgICAgICAgICAgICBrS2V5Q29kZTIgfSwKKyAgICAgIHsgIjMiLCAgICAgICAgICAgICBrS2V5Q29kZTMgfSwKKyAgICAgIHsgIjQiLCAgICAgICAgICAgICBrS2V5Q29kZTQgfSwKKyAgICAgIHsgIjUiLCAgICAgICAgICAgICBrS2V5Q29kZTUgfSwKKyAgICAgIHsgIjYiLCAgICAgICAgICAgICBrS2V5Q29kZTYgfSwKKyAgICAgIHsgIjciLCAgICAgICAgICAgICBrS2V5Q29kZTcgfSwKKyAgICAgIHsgIjgiLCAgICAgICAgICAgICBrS2V5Q29kZTggfSwKKyAgICAgIHsgIjkiLCAgICAgICAgICAgICBrS2V5Q29kZTkgfSwKKyAgICAgIHsgIkNPTU1BIiwgICAgICAgICBrS2V5Q29kZUNvbW1hIH0sCisgICAgICB7ICJQRVJJT0QiLCAgICAgICAga0tleUNvZGVQZXJpb2QgfSwKKyAgICAgIHsgIkFUIiwgICAgICAgICAgICBrS2V5Q29kZUF0IH0sCisgICAgICB7ICJTTEFTSCIsICAgICAgICAga0tleUNvZGVTbGFzaCB9LAorICAgICAgeyAiU1BBQ0UiLCAgICAgICAgIGtLZXlDb2RlU3BhY2UgfSwKKyAgICAgIHsgIkVOVEVSIiwgICAgICAgICBrS2V5Q29kZU5ld2xpbmUgfSwKKyAgICAgIHsgIlRBQiIsICAgICAgICAgICBrS2V5Q29kZVRhYiB9LAorICAgICAgeyAiR1JBVkUiLCAgICAgICAgIGtLZXlDb2RlR3JhdmUgfSwKKyAgICAgIHsgIk1JTlVTIiwgICAgICAgICBrS2V5Q29kZU1pbnVzIH0sCisgICAgICB7ICJFUVVBTFMiLCAgICAgICAga0tleUNvZGVFcXVhbHMgfSwKKyAgICAgIHsgIkxFRlRfQlJBQ0tFVCIsICBrS2V5Q29kZUxlZnRCcmFja2V0IH0sCisgICAgICB7ICJSSUdIVF9CUkFDS0VUIiwga0tleUNvZGVSaWdodEJyYWNrZXQgfSwKKyAgICAgIHsgIkJBQ0tTTEFTSCIsICAgICBrS2V5Q29kZUJhY2tzbGFzaCB9LAorICAgICAgeyAiU0VNSUNPTE9OIiwgICAgIGtLZXlDb2RlU2VtaWNvbG9uIH0sCisgICAgICB7ICJBUE9TVFJPUEhFIiwgICAga0tleUNvZGVBcG9zdHJvcGhlIH0sCisgICAgICB7ICJTVEFSIiwgICAgICAgICAga0tleUNvZGVTdGFyIH0sCisgICAgICB7ICJQT1VORCIsICAgICAgICAga0tleUNvZGVQb3VuZCB9LAorICAgICAgeyAiUExVUyIsICAgICAgICAgIGtLZXlDb2RlUGx1cyB9LAorICAgICAgeyAiREVMIiwgICAgICAgICAgIGtLZXlDb2RlRGVsIH0sCit9OworCisvKiB0aGUgZm9sbG93aW5nIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSAnZ2VuLWNoYXJtYXAucHknIHNjcmlwdAorICogZG8gbm90IHRvdWNoLiB0aGUgZ2VuZXJhdGlvbiBjb21tYW5kIHdhczoKKyAqICAgZ2VuLWNoYXJtYXAucHkgcXdlcnR5Mi5rY20KKyAqLworCitzdGF0aWMgY29uc3QgU2tpbktleUVudHJ5ICBfcXdlcnR5Ml9rZXlzW10gPQoreworICAgLyoga2V5Y29kZSAgICAgICAgICAgICAgICAgICBiYXNlICAgY2FwcyAgICBmbiAgY2FwcytmbiAgIG51bWJlciAqLworCisgICAgeyBrS2V5Q29kZUEgICAgICAgICAgICAgLCAgICdhJywgICAnQScsICAweGUxLCAgIDB4YzEsICAgJ2EnIH0sCisgICAgeyBrS2V5Q29kZUIgICAgICAgICAgICAgLCAgICdiJywgICAnQicsICAgJ2InLCAgICAnQicsICAgJ2InIH0sCisgICAgeyBrS2V5Q29kZUMgICAgICAgICAgICAgLCAgICdjJywgICAnQycsICAweGE5LCAgIDB4YTIsICAgJ2MnIH0sCisgICAgeyBrS2V5Q29kZUQgICAgICAgICAgICAgLCAgICdkJywgICAnRCcsICAweGYwLCAgIDB4ZDAsICAnXCcnIH0sCisgICAgeyBrS2V5Q29kZUUgICAgICAgICAgICAgLCAgICdlJywgICAnRScsICAweGU5LCAgIDB4YzksICAgJyInIH0sCisgICAgeyBrS2V5Q29kZUYgICAgICAgICAgICAgLCAgICdmJywgICAnRicsICAgJ1snLCAgICAnWycsICAgJ1snIH0sCisgICAgeyBrS2V5Q29kZUcgICAgICAgICAgICAgLCAgICdnJywgICAnRycsICAgJ10nLCAgICAnXScsICAgJ10nIH0sCisgICAgeyBrS2V5Q29kZUggICAgICAgICAgICAgLCAgICdoJywgICAnSCcsICAgJzwnLCAgICAnPCcsICAgJzwnIH0sCisgICAgeyBrS2V5Q29kZUkgICAgICAgICAgICAgLCAgICdpJywgICAnSScsICAweGVkLCAgIDB4Y2QsICAgJy0nIH0sCisgICAgeyBrS2V5Q29kZUogICAgICAgICAgICAgLCAgICdqJywgICAnSicsICAgJz4nLCAgICAnPicsICAgJz4nIH0sCisgICAgeyBrS2V5Q29kZUsgICAgICAgICAgICAgLCAgICdrJywgICAnSycsICAgJzsnLCAgICAnSycsICAgJzsnIH0sCisgICAgeyBrS2V5Q29kZUwgICAgICAgICAgICAgLCAgICdsJywgICAnTCcsICAweGY4LCAgIDB4ZDgsICAgJzonIH0sCisgICAgeyBrS2V5Q29kZU0gICAgICAgICAgICAgLCAgICdtJywgICAnTScsICAweGI1LCAgICAnTScsICAgJyUnIH0sCisgICAgeyBrS2V5Q29kZU4gICAgICAgICAgICAgLCAgICduJywgICAnTicsICAweGYxLCAgIDB4ZDEsICAgJ24nIH0sCisgICAgeyBrS2V5Q29kZU8gICAgICAgICAgICAgLCAgICdvJywgICAnTycsICAweGYzLCAgIDB4ZDMsICAgJysnIH0sCisgICAgeyBrS2V5Q29kZVAgICAgICAgICAgICAgLCAgICdwJywgICAnUCcsICAweGY2LCAgIDB4ZDYsICAgJz0nIH0sCisgICAgeyBrS2V5Q29kZVEgICAgICAgICAgICAgLCAgICdxJywgICAnUScsICAweGU0LCAgIDB4YzQsICAgJ3wnIH0sCisgICAgeyBrS2V5Q29kZVIgICAgICAgICAgICAgLCAgICdyJywgICAnUicsICAweGFlLCAgICAnUicsICAgJ2AnIH0sCisgICAgeyBrS2V5Q29kZVMgICAgICAgICAgICAgLCAgICdzJywgICAnUycsICAweGRmLCAgIDB4YTcsICAnXFwnIH0sCisgICAgeyBrS2V5Q29kZVQgICAgICAgICAgICAgLCAgICd0JywgICAnVCcsICAweGZlLCAgIDB4ZGUsICAgJ30nIH0sCisgICAgeyBrS2V5Q29kZVUgICAgICAgICAgICAgLCAgICd1JywgICAnVScsICAweGZhLCAgIDB4ZGEsICAgJ18nIH0sCisgICAgeyBrS2V5Q29kZVYgICAgICAgICAgICAgLCAgICd2JywgICAnVicsICAgJ3YnLCAgICAnVicsICAgJ3YnIH0sCisgICAgeyBrS2V5Q29kZVcgICAgICAgICAgICAgLCAgICd3JywgICAnVycsICAweGU1LCAgIDB4YzUsICAgJ34nIH0sCisgICAgeyBrS2V5Q29kZVggICAgICAgICAgICAgLCAgICd4JywgICAnWCcsICAgJ3gnLCAgICAnWCcsICAgJ3gnIH0sCisgICAgeyBrS2V5Q29kZVkgICAgICAgICAgICAgLCAgICd5JywgICAnWScsICAweGZjLCAgIDB4ZGMsICAgJ30nIH0sCisgICAgeyBrS2V5Q29kZVogICAgICAgICAgICAgLCAgICd6JywgICAnWicsICAweGU2LCAgIDB4YzYsICAgJ3onIH0sCisgICAgeyBrS2V5Q29kZUNvbW1hICAgICAgICAgLCAgICcsJywgICAnPCcsICAweGU3LCAgIDB4YzcsICAgJywnIH0sCisgICAgeyBrS2V5Q29kZVBlcmlvZCAgICAgICAgLCAgICcuJywgICAnPicsICAgJy4nLCAweDIwMjYsICAgJy4nIH0sCisgICAgeyBrS2V5Q29kZUF0ICAgICAgICAgICAgLCAgICdAJywgICAnQCcsICAgJ0AnLCAweDIwMjIsICAgJ0AnIH0sCisgICAgeyBrS2V5Q29kZVNsYXNoICAgICAgICAgLCAgICcvJywgICAnPycsICAweGJmLCAgICAnPycsICAgJy8nIH0sCisgICAgeyBrS2V5Q29kZVNwYWNlICAgICAgICAgLCAgMHgyMCwgIDB4MjAsICAgMHg5LCAgICAweDksICAweDIwIH0sCisgICAgeyBrS2V5Q29kZU5ld2xpbmUgICAgICAgLCAgIDB4YSwgICAweGEsICAgMHhhLCAgICAweGEsICAgMHhhIH0sCisgICAgeyBrS2V5Q29kZTAgICAgICAgICAgICAgLCAgICcwJywgICAnKScsIDB4MmJjLCAgICAnKScsICAgJzAnIH0sCisgICAgeyBrS2V5Q29kZTEgICAgICAgICAgICAgLCAgICcxJywgICAnIScsICAweGExLCAgIDB4YjksICAgJzEnIH0sCisgICAgeyBrS2V5Q29kZTIgICAgICAgICAgICAgLCAgICcyJywgICAnQCcsICAweGIyLCAgICAnQCcsICAgJzInIH0sCisgICAgeyBrS2V5Q29kZTMgICAgICAgICAgICAgLCAgICczJywgICAnIycsICAweGIzLCAgICAnIycsICAgJzMnIH0sCisgICAgeyBrS2V5Q29kZTQgICAgICAgICAgICAgLCAgICc0JywgICAnJCcsICAweGE0LCAgIDB4YTMsICAgJzQnIH0sCisgICAgeyBrS2V5Q29kZTUgICAgICAgICAgICAgLCAgICc1JywgICAnJScsMHgyMGFjLCAgICAnJScsICAgJzUnIH0sCisgICAgeyBrS2V5Q29kZTYgICAgICAgICAgICAgLCAgICc2JywgICAnXicsICAweGJjLCAweDAzMDIsICAgJzYnIH0sCisgICAgeyBrS2V5Q29kZTcgICAgICAgICAgICAgLCAgICc3JywgICAnJicsICAweGJkLCAgICAnJicsICAgJzcnIH0sCisgICAgeyBrS2V5Q29kZTggICAgICAgICAgICAgLCAgICc4JywgICAnKicsICAweGJlLCAgICAnKicsICAgJzgnIH0sCisgICAgeyBrS2V5Q29kZTkgICAgICAgICAgICAgLCAgICc5JywgICAnKCcsIDB4MmJiLCAgICAnKCcsICAgJzknIH0sCisgICAgeyBrS2V5Q29kZVRhYiAgICAgICAgICAgLCAgIDB4OSwgICAweDksICAgMHg5LCAgICAweDksICAgMHg5IH0sCisgICAgeyBrS2V5Q29kZUdyYXZlICAgICAgICAgLCAgICdgJywgICAnficsIDB4MzAwLCAweDAzMDMsICAgJ2AnIH0sCisgICAgeyBrS2V5Q29kZU1pbnVzICAgICAgICAgLCAgICctJywgICAnXycsICAweGE1LCAgICAnXycsICAgJy0nIH0sCisgICAgeyBrS2V5Q29kZUVxdWFscyAgICAgICAgLCAgICc9JywgICAnKycsICAweGQ3LCAgIDB4ZjcsICAgJz0nIH0sCisgICAgeyBrS2V5Q29kZUxlZnRCcmFja2V0ICAgLCAgICdbJywgICAneycsICAweGFiLCAgICAneycsICAgJ1snIH0sCisgICAgeyBrS2V5Q29kZVJpZ2h0QnJhY2tldCAgLCAgICddJywgICAnfScsICAweGJiLCAgICAnfScsICAgJ10nIH0sCisgICAgeyBrS2V5Q29kZUJhY2tzbGFzaCAgICAgLCAgJ1xcJywgICAnfCcsICAweGFjLCAgIDB4YTYsICAnXFwnIH0sCisgICAgeyBrS2V5Q29kZVNlbWljb2xvbiAgICAgLCAgICc7JywgICAnOicsICAweGI2LCAgIDB4YjAsICAgJzsnIH0sCisgICAgeyBrS2V5Q29kZUFwb3N0cm9waGUgICAgLCAgJ1wnJywgICAnIicsIDB4MzAxLCAgMHgzMDgsICAnXCcnIH0sCit9OworCitzdGF0aWMgY29uc3QgU2tpbkNoYXJtYXAgIF9kZWZhdWx0X2NoYXJtYXAgPQoreworICAgIF9xd2VydHkyX2tleXMsCisgICAgNTEsCisgICAgInF3ZXJ0eTIiCit9OworCisvKiBDdXN0b20gY2hhcmFjdGVyIG1hcCBjcmVhdGVkIHdpdGggLWNoYXJtYXAgb3B0aW9uLiAqLworc3RhdGljIFNraW5DaGFybWFwIGFuZHJvaWRfY3VzdG9tX2NoYXJtYXAgPSB7IDAgfTsKKworc3RhdGljIGNvbnN0IFNraW5DaGFybWFwKiBhbmRyb2lkX2NoYXJtYXAgPSAmX2RlZmF1bHRfY2hhcm1hcDsKKworLyogQ2hlY2tzIGlmIGEgY2hhcmFjdGVyIHJlcHJlc2VudHMgYW4gZW5kIG9mIHRoZSBsaW5lLgorICogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIGNoIGlzIGFuIEVPTCBjaGFyYWN0ZXIuIFJldHVybnMKKyAqIHplcm8gdmFsdWUgaWYgY2ggaXMgbm90IGFuIEVPTCBjaGFyYWN0ZXIuCisqLworc3RhdGljIGludAora2NtX2lzX2VvbChjaGFyIGNoKSB7CisgICAgLy8gRU9McyBhcmUgMCwgXHIgYW5kIFxuIGNoYXJzLgorICAgIHJldHVybiAoJ1wwJyA9PSBjaCkgfHwgKCdcbicgPT0gY2gpIHx8ICgnXHInID09IGNoKTsKK30KKworLyogQ2hlY2tzIGlmIGEgY2hhcmFjdGVyIHJlcHJlc2VudHMgYSB0b2tlbiBzZXBhcmF0b3IuCisgKiBSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgY2ggaXMgYSB0b2tlbiBzZXBhcmF0b3IuCisgKiBSZXR1cm5zIHplcm8gdmFsdWUgaWYgY2ggaXMgbm90IGEgdG9rZW4gc2VwYXJhdG9yLgorKi8KK3N0YXRpYyBpbnQKK2tjbV9pc190b2tlbl9zZXBhcmF0b3IoY2hhciBjaCkgeworICAgIC8vIFNwYWNlcyBhbmQgdGFicyBhcmUgdGhlIG9ubHkgc2VwYXJhdG9ycyBhbGxvd2VkCisgICAgLy8gYmV0d2VlbiB0b2tlbnMgaW4gLmtjbSBmaWxlcy4KKyAgICByZXR1cm4gKCcgJyA9PSBjaCkgfHwgKCdcdCcgPT0gY2gpOworfQorCisvKiBDaGVja3MgaWYgYSBjaGFyYWN0ZXIgcmVwcmVzZW50cyBhIHBhdGggc2VwYXJhdG9yLgorICogUmV0dXJucyBhIG5vbi16ZXJvIHZhbHVlIGlmIGNoIGlzIGEgcGF0aCBzZXBhcmF0b3IuCisgKiBSZXR1cm5zIHplcm8gdmFsdWUgaWYgY2ggaXMgbm90IGEgcGF0aCBzZXBhcmF0b3IuCisqLworc3RhdGljIGludAora2NtX2lzX3BhdGhfc2VwYXJhdG9yKGNoYXIgY2gpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gJy8nID09IGNoIHx8ICdcXCcgPT0gY2g7CisjZWxzZQorICAgIHJldHVybiAnLycgPT0gY2g7CisjZW5kaWYgIC8vIF9XSU4zMgorfQorCisvKiBTa2lwcyBzcGFjZSBzZXBhcmF0b3JzIGluIGEgc3RyaW5nLgorICogc3RyIC0gc3RyaW5nIHRvIGFkdmFuY2UgcGFzdCBzcGFjZSBzZXBhcmF0b3JzLgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZywgdGhhdCBpcworICogbm90IGEgc3BhY2Ugc2VwYXJhdG9yLiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSByZXR1cm4KKyAqIHBvaW50ZXIgdG8gRU9MIGluIGNhc2UgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyB3ZXJlCisgKiBzcGFjZSBzZXBhcmF0b3JzLgorKi8KK3N0YXRpYyBjb25zdCBjaGFyKgora2NtX3NraXBfc3BhY2VzKGNvbnN0IGNoYXIqIHN0cikgeworICAgIHdoaWxlICgha2NtX2lzX2VvbCgqc3RyKSAmJiBrY21faXNfdG9rZW5fc2VwYXJhdG9yKCpzdHIpKSB7CisgICAgICAgIHN0cisrOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKiBBZHZhbmNlcyBzdHJpbmcgdG8gdGhlIGZpcnN0IHNwYWNlIHNlcGFyYXRvciBjaGFyYWN0ZXIuCisgKiBzdHIgLSBzdHJpbmcgdG8gYWR2YW5jZS4KKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgZmlyc3Qgc3BhY2Ugc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLgorICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBtYXkgcmV0dXJuIHBvaW50ZXIgdG8gRU9MIGluIGNhc2UgaWYgYWxsCisgKiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgd2VyZSBub3Qgc3BhY2Ugc2VwYXJhdG9ycy4KKyovCitzdGF0aWMgY29uc3QgY2hhcioKK2tjbV9za2lwX25vbl9zcGFjZXMoY29uc3QgY2hhciogc3RyKSB7CisgICAgd2hpbGUgKCFrY21faXNfZW9sKCpzdHIpICYmICFrY21faXNfdG9rZW5fc2VwYXJhdG9yKCpzdHIpKSB7CisgICAgICAgIHN0cisrOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKiBHZXRzIGZpcnN0IHRva2VuIGZyb20gYSBzdHJpbmcuCisgKiBsaW5lIC0gU3RyaW5nIHRvIGdldCB0b2tlbiBmcm9tLiBFbmQgb2YgdGhlIHN0cmluZyBzaG91bGQgYmUKKyAqIGRldGVybWluZWQgdXNpbmcga2NtX2lzX2VvbCgpIHJvdXRpbmUuCisgKiB0b2tlbiAtIFN0cmluZyB3aGVyZSB0byBjb3B5IHRva2VuLiBUb2tlbiwgY29waWVkIHRvIHRoaXMKKyAqIHN0cmluZyB3aWxsIGJlIHplcm8tdGVybWluYXRlZC4gTm90ZSB0aGF0IGJ1ZmZlciBmb3IgdGhlCisgKiB0b2tlbiBzdHJpbmcgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gZml0IHRva2VuIG9mIGFueSBzaXplLgorICogbWF4X3Rva2VuX2xlbiAtIGNoYXJhY3RlciBzaXplIG9mIHRoZSBidWZmZXIgYWRkcmVzc2VkIGJ5CisgKiB0aGUgJ3Rva2VuJyBwYXJhbWV0ZXIuCisgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgd2VyZSBubyB0b2tlbnMgZm91bmQgaW4gdGhlIHN0cmluZywgb3IKKyAqIGEgcG9pbnRlciB0byB0aGUgbGluZSBzdHJpbmcsIGFkdmFuY2VkIHBhc3QgdGhlIGZvdW5kIHRva2VuLgorKi8KK3N0YXRpYyBjb25zdCBjaGFyKgora2NtX2dldF90b2tlbihjb25zdCBjaGFyKiBsaW5lLCBjaGFyKiB0b2tlbiwgc2l6ZV90IG1heF90b2tlbl9sZW4pIHsKKyAgICAvLyBQYXNzIHNwYWNlcyBhbmQgdGFicy4KKyAgICBjb25zdCBjaGFyKiB0b2tlbl9zdGFydHMgPSBrY21fc2tpcF9zcGFjZXMobGluZSk7CisgICAgLy8gQWR2YW5jZSB0byBuZXh0IHNwYWNlLgorICAgIGNvbnN0IGNoYXIqIHRva2VuX2VuZHMgPSBrY21fc2tpcF9ub25fc3BhY2VzKHRva2VuX3N0YXJ0cyk7CisgICAgLy8gQ2FsYyB0b2tlbiBsZW5ndGgKKyAgICBzaXplX3QgdG9rZW5fbGVuID0gdG9rZW5fZW5kcyAtIHRva2VuX3N0YXJ0czsKKyAgICBpZiAoKDAgPT0gdG9rZW5fbGVuKSB8fCAodG9rZW5fbGVuID49IG1heF90b2tlbl9sZW4pKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHRva2VuLCB0b2tlbl9zdGFydHMsIHRva2VuX2xlbik7CisgICAgdG9rZW5bdG9rZW5fbGVuXSA9ICdcMCc7CisgICAgcmV0dXJuIHRva2VuX2VuZHM7Cit9CisKKy8qIENoZWNrcyBpZiB0b2tlbiByZXByZXNlbnRzIGEgY29tbWVudC4KKyAqIFJldHVybnMgbm9uLXplcm8gdmFsdWUgaWYgdG9rZW4gcmVwcmVzZW50cyBhIGNvbW1lbnQsIG9yIHplcm8gb3RoZXJ3aXNlLgorKi8KK3N0YXRpYyBpbnQKK2tjbV9pc190b2tlbl9jb21tZW50KGNvbnN0IGNoYXIqIHRva2VuKSB7CisgICAgcmV0dXJuICcjJyA9PSAqdG9rZW47Cit9CisKKy8qIENvbnZlcnRzIGEga2V5IG5hbWUgdG8gYSBrZXkgY29kZSBhcyBkZWZpbmVkIGJ5IFNraW5LZXlDb2RlIGVudW0uCisgKiBrZXlfbmFtZSAtIEtleSBuYW1lIHRvIGNvbnZlcnQuCisgKiBrZXlfY29kZSAtIFVwb24gc3VjY2VzcyBjb250YWlucyBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIGtleV9uYW1lLgorICogUmV0dXJucyBhIHplcm8gdmFsdWUgb24gc3VjY2Vzcywgb3IgLTEgaWYga2V5IGNvZGUgd2FzIG5vdCBmb3VuZAorICogZm9yIHRoZSBnaXZlbiBrZXlfbmFtZS4KKyovCitzdGF0aWMgaW50CitrY21fZ2V0X2tleV9jb2RlKGNvbnN0IGNoYXIqIGtleV9uYW1lLCB1bnNpZ25lZCBzaG9ydCoga2V5X2NvZGUpIHsKKyAgICBpbnQgbjsKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGtleSBjb2RlIG1hcCwgbWF0Y2hpbmcga2V5IG5hbWVzLgorICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2Yoa2V5Y29kZV9tYXApIC8gc2l6ZW9mKGtleWNvZGVfbWFwWzBdKTsgbisrKSB7CisgICAgICAgIGlmICgwID09IHN0cmNtcChrZXlfbmFtZSwga2V5Y29kZV9tYXBbbl0ua2V5X25hbWUpKSB7CisgICAgICAgICAgICAqa2V5X2NvZGUgPSBrZXljb2RlX21hcFtuXS5rZXlfY29kZTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyogR2V0cyB1bnNpZ25lZCBzaG9ydCBoZXhhZGVjaW1hbCB2YWx1ZSBmb3IgYSB0b2tlbi4KKyAqIHRva2VuIC0gVG9rZW4gdG8gZ2V0IGhleGFkZWNpbWFsIHZhbHVlIGZvci4gTm90ZSB0aGF0IHRoaXMKKyAqIHJvdXRpbmUgZXhwZWN0cyBhICJjbGVhbiIgKGkuZS4gbm8gIjB4IiBwcmVmaXgpIGhleCBudW1iZXIKKyAqIHJlcHJlc2VudGVkIGJ5IHRoZSB0b2tlbiBzdHJpbmcuCisgKiB2YWwgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgaGV4YWRlY2ltYWwgdmFsdWUgZm9yIHRoZSB0b2tlbi4KKyAqIFJldHVybnMgYSB6ZXJvIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGVycm9yLgorKi8KK3N0YXRpYyBpbnQKK2tjbV9nZXRfdXNob3J0X2hleF92YWwoY29uc3QgY2hhciogdG9rZW4sIHVuc2lnbmVkIHNob3J0KiB2YWwpIHsKKyAgICBpbnQgaGV4X3ZhbCA9IGhleDJpbnQoKGNvbnN0IHVpbnQ4X3QqKXRva2VuLCBzdHJsZW4odG9rZW4pKTsKKyAgICAvLyBNYWtlIHN1cmUgdG9rZW4gZm9ybWF0IHdhcyBvayBhbmQgdmFsdWUgZG9lc24ndCBleGNlZWQgdW5zaWduZWQgc2hvcnQuCisgICAgaWYgKC0xID09IGhleF92YWwgfHwgMCAhPSAoaGV4X3ZhbCAmIH4weEZGRkYpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKnZhbCA9ICh1bnNpZ25lZCBzaG9ydCloZXhfdmFsOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEdldHMgYSBjaGFyYWN0ZXIgb3IgaGV4YWRlY2ltYWwgdmFsdWUgcmVwcmVzZW50ZWQgYnkgYSB0b2tlbi4KKyAqIHRva2VuIC0gVG9rZW4gdG8gZ2V0IHZhbHVlIGZyb20uCisgKiB2YWwgLSBVcG9uIHN1Y2Nlc3Mgd2lsbCBjb250YWluIGEgY2hhcmFjdGVyIG9yIGhleGFkZWNpbWFsCisgKiB2YWx1ZSByZXByZXNlbnRlZCBieSBhIHRva2VuLgorICogUmV0dXJucyBhIHplcm8gdmFsdWUgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuCisqLworc3RhdGljIGludAora2NtX2dldF9jaGFyX29yX2hleF92YWwoY29uc3QgY2hhciogdG9rZW4sIHVuc2lnbmVkIHNob3J0KiB2YWwpIHsKKyAgICAvLyBGb3IgY2hhcnMgdG9rZW4gbXVzdCBiZWdpbiB3aXRoICcgZm9sbG93ZWQgYnkgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5ICcKKyAgICBpZiAoJ1wnJyA9PSAqdG9rZW4pIHsKKyAgICAgICAgaWYgKCdcMCcgPT0gdG9rZW5bMV0gfHwgJ1wnJyAhPSB0b2tlblsyXSB8fCAnXDAnICE9IHRva2VuWzNdKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqdmFsID0gdG9rZW5bMV07CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGhleCB0b2tlbiBpcyBwcmVmaXhlZCB3aXRoICIweCIKKyAgICAgICAgaWYgKCgnMCcgIT0gKnRva2VuKSB8fCAoJ3gnICE9IHRva2VuWzFdKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8vIFBhc3QgMHgKKyAgICAgICAgcmV0dXJuIGtjbV9nZXRfdXNob3J0X2hleF92YWwodG9rZW4gKyAyLCB2YWwpOworICAgIH0KK30KKworLyogR2V0cyBmaXJzdCB0b2tlbiBmb3IgdGhlIGxpbmUgYW5kIGNhbGN1bGF0ZXMgaXRzIHZhbHVlLgorICogbGluZSAtIExpbmUgdG8gZ2V0IHRva2VuJ3MgdmFsdWUgZnJvbS4KKyAqIHZhbCAtIFVwb24gc3VjY2VzcyB3aWxsIGNvbnRhaW4gYSBjaGFyYWN0ZXIgb3IgaGV4YWRlY2ltYWwKKyAqIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbGluZS4KKyAqIHJldHVybnMgTlVMTCBvbiBlcnJvciwgb3IgYSBwb2ludGVyIHRvIHRoZSBsaW5lIHN0cmluZywKKyAqIGFkdmFuY2VkIHBhc3QgdGhlIGZvdW5kIHRva2VuLgorKi8KK3N0YXRpYyBjb25zdCBjaGFyKgora2NtX2dldF9jaGFyX29yX2hleF90b2tlbl92YWx1ZShjb25zdCBjaGFyKiBsaW5lLCB1bnNpZ25lZCBzaG9ydCogdmFsKSB7CisgICAgY2hhciB0b2tlbltLQ01fTUFYX1RPS0VOX0xFTl07CisgICAgbGluZSA9IGtjbV9nZXRfdG9rZW4obGluZSwgdG9rZW4sIEtDTV9NQVhfVE9LRU5fTEVOKTsKKyAgICBpZiAoTlVMTCAhPSBsaW5lKSB7CisgICAgICAgIC8vIFRva2VuIG11c3QgYmUgYSBjaGFyLCBvciBhIGhleCBudW1iZXIuCisgICAgICAgIGlmIChrY21fZ2V0X2NoYXJfb3JfaGV4X3ZhbCh0b2tlbiwgdmFsKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGluZTsKK30KKworLyogUGFyc2VzIGEgbGluZSBpbiAua2NtIGZpbGUgZXh0cmFjdGluZyBrZXkgaW5mb3JtYXRpb24uCisgKiBsaW5lIC0gTGluZSBpbiAua2NtIGZpbGUgdG8gcGFyc2UuCisgKiBsaW5lX2luZGV4IC0gSW5kZXggb2YgdGhlIHBhcnNpbmcgbGluZSBpbiAua2NtIGZpbGUuCisgKiBrZXlfZW50cnkgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMga2V5IGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tCisgKiB0aGUgbGluZS4KKyAqIGtjbV9maWxlX3BhdGggLSBQYXRoIHRvIHRoZSBjaGFybWFwIGZpbGUsIHdoZXJlIHBhcmVzZWQgbGluZSB3YXMgdGFrZW4gZnJvbS4KKyAqIHJldHVybnMgQkFEX0ZPUk1BVCBpZiBsaW5lIGZvcm1hdCB3YXMgbm90IHJlY29nbml6ZWQsIFNLSVBfTElORSBpZiBsaW5lCisgKiBmb3JtYXQgd2FzIG9rLCBidXQgaXQgZGlkbid0IGNvbnRhaW4ga2V5IGluZm9ybWF0aW9uLCBvciBLRVlfRU5UUlkKKyAqIGlmIGtleSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bHkgZXh0cmFjdGVkIGZyb20gdGhlIGxpbmUuCisqLworc3RhdGljIFBhcnNlU3RhdHVzCitrY21fcGFyc2VfbGluZShjb25zdCBjaGFyKiBsaW5lLAorICAgICAgICAgICAgICAgaW50IGxpbmVfaW5kZXgsCisgICAgICAgICAgICAgICBTa2luS2V5RW50cnkqIGtleV9lbnRyeSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtjbV9maWxlX3BhdGgpIHsKKyAgICAgIGNoYXIgdG9rZW5bS0NNX01BWF9UT0tFTl9MRU5dOworICAgICAgdW5zaWduZWQgc2hvcnQgZGlzcDsKKworICAgICAgLy8gR2V0IGZpcnN0IHRva2VuLCBhbmQgc2VlIGlmIGl0J3MgYW4gZW1wdHksIG9yIGEgY29tbWVudCBsaW5lLgorICAgICAgbGluZSA9IGtjbV9nZXRfdG9rZW4obGluZSwgdG9rZW4sIEtDTV9NQVhfVE9LRU5fTEVOKTsKKyAgICAgIGlmICgoTlVMTCA9PSBsaW5lKSB8fCBrY21faXNfdG9rZW5fY29tbWVudCh0b2tlbikpIHsKKyAgICAgICAgICAvLyBFbXB0eSBsaW5lLCBvciBhIGNvbW1lbnQuCisgICAgICAgICAgcmV0dXJuIFNLSVBfTElORTsKKyAgICAgIH0KKworICAgICAgLy8gSGVyZSB3ZSBleHBlY3QgZWl0aGVyIFt0eXBlPVhYWFhdLCBvciBhIGtleSBzdHJpbmcuCisgICAgICBpZiAoJ1snID09IHRva2VuWzBdKSB7CisgICAgICAgICAgcmV0dXJuIFNLSVBfTElORTsKKyAgICAgIH0KKworICAgICAgLy8gSXQgbXVzdCBiZSBhIGtleSBzdHJpbmcuCisgICAgICAvLyBGaXJzdCB0b2tlbiBpcyBrZXkgY29kZS4KKyAgICAgIGlmIChrY21fZ2V0X2tleV9jb2RlKHRva2VuLCAma2V5X2VudHJ5LT5jb2RlKSkgeworICAgICAgICAgIGRlcnJvcigiSW52YWxpZCBmb3JtYXQgb2YgY2hhcm1hcCBmaWxlICVzLiBVbmtub3duIGtleSAlcyBpbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAga2NtX2ZpbGVfcGF0aCwgdG9rZW4sIGxpbmVfaW5kZXgpOworICAgICAgICAgIHJldHVybiBCQURfRk9STUFUOworICAgICAgfQorCisgICAgICAvLyAyLW5kIHRva2VuIGlzIGRpc3BsYXkgY2hhcmFjdGVyLCB3aGljaCBpcyBpZ25vcmVkLgorICAgICAgbGluZSA9IGtjbV9nZXRfY2hhcl9vcl9oZXhfdG9rZW5fdmFsdWUobGluZSwgJmRpc3ApOworICAgICAgaWYgKE5VTEwgPT0gbGluZSkgeworICAgICAgICAgIGRlcnJvcigiSW52YWxpZCBmb3JtYXQgb2YgY2hhcm1hcCBmaWxlICVzLiBJbnZhbGlkIGRpc3BsYXkgdmFsdWUgaW4gbGluZSAlZCIsCisgICAgICAgICAgICAgICAgIGtjbV9maWxlX3BhdGgsIGxpbmVfaW5kZXgpOworICAgICAgICAgIHJldHVybiBCQURfRk9STUFUOworICAgICAgfQorCisgICAgICAvLyAzLXJkIHRva2VuIGlzIG51bWJlci4KKyAgICAgIGxpbmUgPSBrY21fZ2V0X2NoYXJfb3JfaGV4X3Rva2VuX3ZhbHVlKGxpbmUsICZrZXlfZW50cnktPm51bWJlcik7CisgICAgICBpZiAoTlVMTCA9PSBsaW5lKSB7CisgICAgICAgICAgZGVycm9yKCJJbnZhbGlkIGZvcm1hdCBvZiBjaGFybWFwIGZpbGUgJXMuIEludmFsaWQgbnVtYmVyIHZhbHVlIGluIGxpbmUgJWQiLAorICAgICAgICAgICAgICAgICBrY21fZmlsZV9wYXRoLCBsaW5lX2luZGV4KTsKKyAgICAgICAgICByZXR1cm4gQkFEX0ZPUk1BVDsKKyAgICAgIH0KKworICAgICAgLy8gNC10aCB0b2tlbiBpcyBiYXNlLgorICAgICAgbGluZSA9IGtjbV9nZXRfY2hhcl9vcl9oZXhfdG9rZW5fdmFsdWUobGluZSwgJmtleV9lbnRyeS0+YmFzZSk7CisgICAgICBpZiAoTlVMTCA9PSBsaW5lKSB7CisgICAgICAgICAgZGVycm9yKCJJbnZhbGlkIGZvcm1hdCBvZiBjaGFybWFwIGZpbGUgJXMuIEludmFsaWQgYmFzZSB2YWx1ZSBpbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAga2NtX2ZpbGVfcGF0aCwgbGluZV9pbmRleCk7CisgICAgICAgICAgcmV0dXJuIEJBRF9GT1JNQVQ7CisgICAgICB9CisKKyAgICAgIC8vIDUtdGggdG9rZW4gaXMgY2Fwcy4KKyAgICAgIGxpbmUgPSBrY21fZ2V0X2NoYXJfb3JfaGV4X3Rva2VuX3ZhbHVlKGxpbmUsICZrZXlfZW50cnktPmNhcHMpOworICAgICAgaWYgKE5VTEwgPT0gbGluZSkgeworICAgICAgICAgIGRlcnJvcigiSW52YWxpZCBmb3JtYXQgb2YgY2hhcm1hcCBmaWxlICVzLiBJbnZhbGlkIGNhcHMgdmFsdWUgaW4gbGluZSAlZCIsCisgICAgICAgICAgICAgICAgIGtjbV9maWxlX3BhdGgsIGxpbmVfaW5kZXgpOworICAgICAgICAgIHJldHVybiBCQURfRk9STUFUOworICAgICAgfQorCisgICAgICAvLyA2LXRoIHRva2VuIGlzIGZuLgorICAgICAgbGluZSA9IGtjbV9nZXRfY2hhcl9vcl9oZXhfdG9rZW5fdmFsdWUobGluZSwgJmtleV9lbnRyeS0+Zm4pOworICAgICAgaWYgKE5VTEwgPT0gbGluZSkgeworICAgICAgICAgIGRlcnJvcigiSW52YWxpZCBmb3JtYXQgb2YgY2hhcm1hcCBmaWxlICVzLiBJbnZhbGlkIGZuIHZhbHVlIGluIGxpbmUgJWQiLAorICAgICAgICAgICAgICAgICBrY21fZmlsZV9wYXRoLCBsaW5lX2luZGV4KTsKKyAgICAgICAgICByZXR1cm4gQkFEX0ZPUk1BVDsKKyAgICAgIH0KKworICAgICAgLy8gNy10aCB0b2tlbiBpcyBjYXBzX2ZuLgorICAgICAgbGluZSA9IGtjbV9nZXRfY2hhcl9vcl9oZXhfdG9rZW5fdmFsdWUobGluZSwgJmtleV9lbnRyeS0+Y2Fwc19mbik7CisgICAgICBpZiAoTlVMTCA9PSBsaW5lKSB7CisgICAgICAgICAgZGVycm9yKCJJbnZhbGlkIGZvcm1hdCBvZiBjaGFybWFwIGZpbGUgJXMuIEludmFsaWQgY2Fwc19mbiB2YWx1ZSBpbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAga2NtX2ZpbGVfcGF0aCwgbGluZV9pbmRleCk7CisgICAgICAgICAgcmV0dXJuIEJBRF9GT1JNQVQ7CisgICAgICB9CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGxpbmUgZG9lc24ndCBjb250YWluIGFueXRoaW5nIGVsc2UsCisgICAgICAvLyBleGNlcHQgKG1heSBiZSkgYSBjb21tZW50IHRva2VuLgorICAgICAgbGluZSA9IGtjbV9nZXRfdG9rZW4obGluZSwgdG9rZW4sIEtDTV9NQVhfVE9LRU5fTEVOKTsKKyAgICAgIGlmICgoTlVMTCA9PSBsaW5lKSB8fCBrY21faXNfdG9rZW5fY29tbWVudCh0b2tlbikpIHsKKyAgICAgICAgICByZXR1cm4gS0VZX0VOVFJZOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZXJyb3IoIkludmFsaWQgZm9ybWF0IG9mIGNoYXJtYXAgZmlsZSAlcyBpbiBsaW5lICVkIiwKKyAgICAgICAgICAgICAgICAga2NtX2ZpbGVfcGF0aCwgbGluZV9pbmRleCk7CisgICAgICAgICAgcmV0dXJuIEJBRF9GT1JNQVQ7CisgICAgICB9Cit9CisKK3ZvaWQKK2tjbV9leHRyYWN0X2NoYXJtYXBfbmFtZShjb25zdCBjaGFyKiBrY21fZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGNoYXJtYXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xlbikgeworICAgIGNvbnN0IGNoYXIqIGV4dF9zZXBhcmF0b3I7CisgICAgc2l6ZV90IHRvX2NvcHk7CisKKyAgICAvLyBJbml0aWFsaXplIGNoYXJtYXAgbmFtZSB3aXRoIG5hbWUgb2YgLmtjbSBmaWxlLgorICAgIC8vIEZpcnN0LCBnZXQgZmlsZSBuYW1lIGZyb20gdGhlIGZ1bGwgcGF0aCB0byAua2NtIGZpbGUuCisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0ga2NtX2ZpbGVfcGF0aCArIHN0cmxlbihrY21fZmlsZV9wYXRoKTsKKyAgICB3aGlsZSAoIWtjbV9pc19wYXRoX3NlcGFyYXRvcigqZmlsZV9uYW1lKSAmJgorICAgICAgICAgICAoZmlsZV9uYW1lICE9IGtjbV9maWxlX3BhdGgpKSB7CisgICAgICAgIGZpbGVfbmFtZS0tOworICAgIH0KKyAgICBpZiAoa2NtX2lzX3BhdGhfc2VwYXJhdG9yKCpmaWxlX25hbWUpKSB7CisgICAgICAgIGZpbGVfbmFtZSsrOworICAgIH0KKworICAgIC8vIEN1dCBvZmYgZmlsZSBuYW1lIGV4dGVuc2lvbi4KKyAgICBleHRfc2VwYXJhdG9yID0gc3RycmNocihmaWxlX25hbWUsICcuJyk7CisgICAgaWYgKE5VTEwgPT0gZXh0X3NlcGFyYXRvcikgeworICAgICAgLy8gImZpbGVuYW1lIiBpcyBsZWdhbCBuYW1lLgorICAgICAgZXh0X3NlcGFyYXRvciA9IGZpbGVfbmFtZSArIHN0cmxlbihmaWxlX25hbWUpOworICAgIH0gZWxzZSBpZiAoZXh0X3NlcGFyYXRvciA9PSBmaWxlX25hbWUpIHsKKyAgICAgIC8vICIuZmlsZW5hbWUiIGlzIGxlZ2FsIG5hbWUgdG9vLiBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCB1c2UKKyAgICAgIC8vICJmaWxlbmFtZSIgYXMgb3VyIGN1c3RvbSBjaGFybWFwIG5hbWUuCisgICAgICBmaWxlX25hbWUrKzsKKyAgICAgIGV4dF9zZXBhcmF0b3IgPSBmaWxlX25hbWUgKyBzdHJsZW4oZmlsZV9uYW1lKTsKKyAgICB9CisKKyAgICAvLyBDb3B5IGZpbGUgbmFtZSB0byBjaGFybWFwIG5hbWUuCisgICAgdG9fY29weSA9IGV4dF9zZXBhcmF0b3IgLSBmaWxlX25hbWU7CisgICAgaWYgKHRvX2NvcHkgPiAobWF4X2xlbiAtIDEpKSB7CisgICAgICAgIHRvX2NvcHkgPSBtYXhfbGVuIC0gMTsKKyAgICB9CisgICAgbWVtY3B5KGNoYXJtYXBfbmFtZSwgZmlsZV9uYW1lLCB0b19jb3B5KTsKKyAgICBjaGFybWFwX25hbWVbdG9fY29weV0gPSAnXDAnOworfQorCisvKiBFeHRyYWN0cyBjaGFybWFwIG5hbWUgZnJvbSAua2NtIGZpbGUgbmFtZSwKKyAqIGFuZCBzYXZlcyBpdCBpbnRvIGNoYXJfbWFwIGFzIGl0cyBuYW1lLgorKi8KK3N0YXRpYyB2b2lkCitrY21fZ2V0X2NoYXJtYXBfbmFtZShjb25zdCBjaGFyKiBrY21fZmlsZV9wYXRoLCBTa2luQ2hhcm1hcCogY2hhcl9tYXApIHsKKyAgICBrY21fZXh0cmFjdF9jaGFybWFwX25hbWUoa2NtX2ZpbGVfcGF0aCwgY2hhcl9tYXAtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyX21hcC0+bmFtZSkpOworfQorCisvKiBQYXJzZXMgLmtjbSBmaWxlIHByb2R1Y2luZyBrZXkgY2hhcmFjdGVycyBtYXAuCisgKiBTZWUgY29tbWVudHMgdG8gdGhpcyBtb2R1bGUgZm9yIC5rY20gZmlsZSBmb3JtYXQgaW5mb3JtYXRpb24uCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIGZvcm1hdCBvbmx5IGZvciBjaGFyYWN0ZXIgbWFwIGxpbmVzLiBJdCB3aWxsIG5vdCBjaGVjaworICogZm9ybWF0IGZvciBlbXB0eSBsaW5lcywgY29tbWVudHMsIGFuZCB0eXBlIHNlY3Rpb24gbGluZXMuCisgKiBOb3RlIHRoYXQgbGluZSBsZW5ndGggaW4gLmtjbSBmaWxlIHNob3VsZCBub3QgZXhjZWVkIDEwMjQgY2hhcmFjdGVycywKKyAqIGluY2x1ZGluZyBuZXdsaW5lIGNoYXJhY3Rlci4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICoga2NtX2ZpbGVfcGF0aCAtIEZ1bGwgcGF0aCB0byB0aGUgLmtjbSBmaWxlIHRvIHBhcnNlLgorICogY2hhcl9tYXAgLSBVcG9uIHN1Y2Nlc3Mgd2lsbCBjb250YWluIGluaXRpYWxpemVkIGNoYXJhY3RlcnMgbWFwLgorICogUmV0dXJucyBhIHplcm8gdmFsdWUgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4KKyovCitzdGF0aWMgaW50CitwYXJzZV9rY21fZmlsZShjb25zdCBjaGFyKiBrY21fZmlsZV9wYXRoLCBTa2luQ2hhcm1hcCogY2hhcl9tYXApIHsKKyAgICAvLyBBIGxpbmUgcmVhZCBmcm9tIC5rY20gZmlsZS4KKyAgICBjaGFyIGxpbmVbS0NNX01BWF9MSU5FX0xFTl07CisgICAgLy8gUmV0dXJuIGNvZGUuCisgICAgaW50IGVyciA9IDA7CisgICAgLy8gTnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgcGFyc2VkIGxpbmUuCisgICAgaW50IGN1cl9saW5lID0gMTsKKyAgICAvLyBJbml0aWFsIHNpemUgb2YgdGhlIGNoYXJtYXAncyBhcnJheSBvZiBrZXlzLgorICAgIGludCBtYXBfc2l6ZSA9IDUyOworICAgIEZJTEUqIGtjbV9maWxlOworCisgICAgY2hhcl9tYXAtPm51bV9lbnRyaWVzID0gMDsKKyAgICBjaGFyX21hcC0+ZW50cmllcyA9IDA7CisKKyAgICBrY21fZmlsZSA9IGZvcGVuKGtjbV9maWxlX3BhdGgsICJyIik7CisgICAgaWYgKE5VTEwgPT0ga2NtX2ZpbGUpIHsKKyAgICAgICAgZGVycm9yKCJVbmFibGUgdG8gb3BlbiBjaGFybWFwIGZpbGUgJXMgOiAlcyIsCisgICAgICAgICAgICAgICBrY21fZmlsZV9wYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGNoYXJtYXAgbmFtZS4KKyAgICBrY21fZ2V0X2NoYXJtYXBfbmFtZShrY21fZmlsZV9wYXRoLCBjaGFyX21hcCk7CisKKyAgICAvLyBQcmVhbGxvY2F0ZSBtYXAuCisgICAgY2hhcl9tYXAtPm51bV9lbnRyaWVzID0gMDsKKyAgICBBQVJSQVlfTkVXMChjaGFyX21hcC0+ZW50cmllcywgbWFwX3NpemUpOworCisgICAgLy8gTGluZSBieSBsaW5lIHBhcnNlIHRoZSBmaWxlLgorICAgIGZvciAoOyAwICE9IGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwga2NtX2ZpbGUpOyBjdXJfbGluZSsrKSB7CisgICAgICAgIFNraW5LZXlFbnRyeSBrZXlfZW50cnk7CisgICAgICAgIFBhcnNlU3RhdHVzIHBhcnNlX3JlcyA9CisgICAgICAgICAgICBrY21fcGFyc2VfbGluZShsaW5lLCBjdXJfbGluZSwgJmtleV9lbnRyeSwga2NtX2ZpbGVfcGF0aCk7CisgICAgICAgIGlmIChCQURfRk9STUFUID09IHBhcnNlX3JlcykgeworICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChLRVlfRU5UUlkgPT0gcGFyc2VfcmVzKSB7CisgICAgICAgICAgICBTa2luS2V5RW50cnkqIGVudHJpZXM7CisgICAgICAgICAgICAvLyBLZXkgaW5mb3JtYXRpb24gaGFzIGJlZW4gZXh0cmFjdGVkLiBBZGQgaXQgdG8gdGhlIG1hcC4KKyAgICAgICAgICAgIC8vIExldHMgc2VlIGlmIHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSBtYXAuCisgICAgICAgICAgICBpZiAobWFwX3NpemUgPT0gY2hhcl9tYXAtPm51bV9lbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgU2tpbktleUVudHJ5KiBlbnRyaWVzID0gKFNraW5LZXlFbnRyeSopY2hhcl9tYXAtPmVudHJpZXM7CisgICAgICAgICAgICAgICAgbWFwX3NpemUgKz0gMTA7CisgICAgICAgICAgICAgICAgQUFSUkFZX1JFTkVXKGVudHJpZXMsIG1hcF9zaXplKTsKKyAgICAgICAgICAgICAgICBjaGFyX21hcC0+ZW50cmllcyA9IChjb25zdCBTa2luS2V5RW50cnkqKWVudHJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRyaWVzID0gKFNraW5LZXlFbnRyeSopY2hhcl9tYXAtPmVudHJpZXM7CisgICAgICAgICAgICBlbnRyaWVzW2NoYXJfbWFwLT5udW1fZW50cmllc10gPSBrZXlfZW50cnk7CisgICAgICAgICAgICBjaGFyX21hcC0+bnVtX2VudHJpZXMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZXJyKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBleGl0ZWQgdGhlIGxvb3Agb24gRU9GIGNvbmRpdGlvbi4gQW55IG90aGVyCisgICAgICAgIC8vIGNvbmRpdGlvbiBpcyBhbiBlcnJvci4KKyAgICAgICAgaWYgKDAgPT0gZmVvZihrY21fZmlsZSkpIHsKKyAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICBkZXJyb3IoIkVycm9yIHJlYWRpbmcgY2hhcm1hcCBmaWxlICVzIDogJXMiLAorICAgICAgICAgICAgICAgICAga2NtX2ZpbGVfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZjbG9zZShrY21fZmlsZSk7CisKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIC8vIENsZWFudXAgb24gZmFpbHVyZS4KKyAgICAgICAgaWYgKDAgIT0gY2hhcl9tYXAtPmVudHJpZXMpIHsKKyAgICAgICAgICAgIEFGUkVFKCh2b2lkKiljaGFyX21hcC0+ZW50cmllcyk7CisgICAgICAgICAgICBjaGFyX21hcC0+ZW50cmllcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY2hhcl9tYXAtPm51bV9lbnRyaWVzID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQKK3NraW5fY2hhcm1hcF9zZXR1cChjb25zdCBjaGFyKiBrY21fZmlsZV9wYXRoKSB7CisKKyAgICAvKiBSZXR1cm4gaWYgd2UgYWxyZWFkeSBsb2FkZWQgYSBjaGFybWFwICovCisgICAgaWYgKGFuZHJvaWRfY2hhcm1hcCAhPSAmX2RlZmF1bHRfY2hhcm1hcCB8fCBrY21fZmlsZV9wYXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFwYXJzZV9rY21fZmlsZShrY21fZmlsZV9wYXRoLCAmYW5kcm9pZF9jdXN0b21fY2hhcm1hcCkpIHsKKyAgICAgICAgLy8gSGVyZSB3ZSBoYXZlIHRoZSBkZWZhdWx0IGNoYXJtYXAgYW5kIHRoZSBjdXN0b20gb25lLgorICAgICAgICBhbmRyb2lkX2NoYXJtYXAgPSAmYW5kcm9pZF9jdXN0b21fY2hhcm1hcDsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXJyb3IoIlVuYWJsZSB0byBwYXJzZSBrY20gZmlsZS4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkCitza2luX2NoYXJtYXBfZG9uZSh2b2lkKSB7CisgICAgaWYgKGFuZHJvaWRfY2hhcm1hcCAhPSAmX2RlZmF1bHRfY2hhcm1hcCkKKyAgICAgICAgQUZSRUUoKHZvaWQqKWFuZHJvaWRfY2hhcm1hcC0+ZW50cmllcyk7Cit9CisKK2NvbnN0IFNraW5DaGFybWFwKgorc2tpbl9jaGFybWFwX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghc3RyY21wKGFuZHJvaWRfY2hhcm1hcC0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZF9jaGFybWFwOworICAgICAgICBpZiAoIXN0cmNtcChfZGVmYXVsdF9jaGFybWFwLm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuICZfZGVmYXVsdF9jaGFybWFwOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50Citza2luX2NoYXJtYXBfcmV2ZXJzZV9tYXBfdW5pY29kZShjb25zdCBTa2luQ2hhcm1hcCogY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbktleWNvZGVCdWZmZXIqIGtleWNvZGVzKQoreworICAgIGludCAgICAgICAgICAgICAgICAgbjsKKworICAgIGlmIChjbWFwID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHVuaWNvZGUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBjaGVjayBiYXNlIGtleXMgKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgY21hcC0+bnVtX2VudHJpZXM7IG4rKykgeworICAgICAgICBpZiAoY21hcC0+ZW50cmllc1tuXS5iYXNlID09IHVuaWNvZGUpIHsKKyAgICAgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKGtleWNvZGVzLCBjbWFwLT5lbnRyaWVzW25dLmNvZGUsIGRvd24pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBjYXBzICsga2V5cyAqLworICAgIGZvciAobiA9IDA7IG4gPCBjbWFwLT5udW1fZW50cmllczsgbisrKSB7CisgICAgICAgIGlmIChjbWFwLT5lbnRyaWVzW25dLmNhcHMgPT0gdW5pY29kZSkgeworICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBza2luX2tleWNvZGVfYnVmZmVyX2FkZChrZXljb2Rlcywga0tleUNvZGVDYXBMZWZ0LCBkb3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKGtleWNvZGVzLCBjbWFwLT5lbnRyaWVzW25dLmNvZGUsIGRvd24pOworICAgICAgICAgICAgaWYgKCFkb3duKSB7CisgICAgICAgICAgICAgICAgc2tpbl9rZXljb2RlX2J1ZmZlcl9hZGQoa2V5Y29kZXMsIGtLZXlDb2RlQ2FwTGVmdCwgZG93bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGZuICsga2V5cyAqLworICAgIGZvciAobiA9IDA7IG4gPCBjbWFwLT5udW1fZW50cmllczsgbisrKSB7CisgICAgICAgIGlmIChjbWFwLT5lbnRyaWVzW25dLmZuID09IHVuaWNvZGUpIHsKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgc2tpbl9rZXljb2RlX2J1ZmZlcl9hZGQoa2V5Y29kZXMsIGtLZXlDb2RlQWx0TGVmdCwgZG93bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2luX2tleWNvZGVfYnVmZmVyX2FkZChrZXljb2RlcywgY21hcC0+ZW50cmllc1tuXS5jb2RlLCBkb3duKTsKKyAgICAgICAgICAgIGlmICghZG93bikgeworICAgICAgICAgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKGtleWNvZGVzLCBrS2V5Q29kZUFsdExlZnQsIGRvd24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBjYXBzICsgZm4gKyBrZXlzICovCisgICAgZm9yIChuID0gMDsgbiA8IGNtYXAtPm51bV9lbnRyaWVzOyBuKyspIHsKKyAgICAgICAgaWYgKGNtYXAtPmVudHJpZXNbbl0uY2Fwc19mbiA9PSB1bmljb2RlKSB7CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKGtleWNvZGVzLCBrS2V5Q29kZUFsdExlZnQsIGRvd24pOworICAgICAgICAgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKGtleWNvZGVzLCBrS2V5Q29kZUNhcExlZnQsIGRvd24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpbl9rZXljb2RlX2J1ZmZlcl9hZGQoa2V5Y29kZXMsIGNtYXAtPmVudHJpZXNbbl0uY29kZSwgZG93bik7CisgICAgICAgICAgICBpZiAoIWRvd24pIHsKKyAgICAgICAgICAgICAgICBza2luX2tleWNvZGVfYnVmZmVyX2FkZChrZXljb2Rlcywga0tleUNvZGVDYXBMZWZ0LCBkb3duKTsKKyAgICAgICAgICAgICAgICBza2luX2tleWNvZGVfYnVmZmVyX2FkZChrZXljb2Rlcywga0tleUNvZGVBbHRMZWZ0LCBkb3duKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm8gbWF0Y2ggKi8KKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgU2tpbkNoYXJtYXAqIHNraW5fY2hhcm1hcF9nZXQodm9pZCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9jaGFybWFwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vY2hhcm1hcC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vY2hhcm1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjNjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9jaGFybWFwLmgKQEAgLTAsMCArMSw5NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9rZXljb2RlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgiCisKKy8qIHRoaXMgZGVmaW5lcyBhIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFuIEFuZHJvaWQga2V5Ym9hcmQgY2hhcm1hcCAqLwordHlwZWRlZiBzdHJ1Y3QgU2tpbktleUVudHJ5IHsKKyAgICB1bnNpZ25lZCBzaG9ydCAgY29kZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgYmFzZTsKKyAgICB1bnNpZ25lZCBzaG9ydCAgY2FwczsKKyAgICB1bnNpZ25lZCBzaG9ydCAgZm47CisgICAgdW5zaWduZWQgc2hvcnQgIGNhcHNfZm47CisgICAgdW5zaWduZWQgc2hvcnQgIG51bWJlcjsKK30gU2tpbktleUVudHJ5OworCisvKiBEZWZpbmVzIHNpemUgb2YgbmFtZSBidWZmZXIgaW4gU2tpbkNoYXJtYXAgZW50cnkuICovCisjZGVmaW5lIFNLSU5fQ0hBUk1BUF9OQU1FX1NJWkUgICAzMgorCit0eXBlZGVmIHN0cnVjdCBTa2luQ2hhcm1hcCB7CisgICAgY29uc3QgU2tpbktleUVudHJ5KiAgZW50cmllczsKKyAgICBpbnQgbnVtX2VudHJpZXM7CisgICAgY2hhciBuYW1lW1NLSU5fQ0hBUk1BUF9OQU1FX1NJWkVdOworfSBTa2luQ2hhcm1hcDsKKworLyogRXh0cmFjdHMgY2hhcm1hcCBuYW1lIGZyb20gLmtjbSBmaWxlIG5hbWUuCisgKiBDaGFybWFwIG5hbWUsIGV4dHJhY3RlZCBieSB0aGlzIHJvdXRpbmUgaXMgYSBuYW1lIG9mIHRoZSBrY20gZmlsZSwgdHJpbW1lZAorICogb2YgZmlsZSBuYW1lIGV4dGVuc2lvbiwgYW5kIHNocmlua2VkIChpZiBuZWNlc3NhcnkpIHRvIGZpdCBpbnRvIHRoZSBuYW1lCisgKiBidWZmZXIuIEhlcmUgYXJlIGV4YW1wbGVzIG9uIGhvdyB0aGlzIHJvdXRpbmUgZXh0cmFjdHMgY2hhcm1hcCBuYW1lOgorICogL2EvcGF0aC90by9rY21maWxlLmtjbSAgICAgICAtPiBrY21maWxlCisgKiAvYS9wYXRoL3RvL2tjbWZpbGUuZXh0LmtjbSAgIC0+IGtjbWZpbGUuZXh0CisgKiAvYS9wYXRoL3RvL2tjbWZpbGUgICAgICAgICAgIC0+IGtjbWZpbGUKKyAqIC9hL3BhdGgvdG8vLmtjbWZpbGUgICAgICAgICAgLT4ga2NtZmlsZQorICogL2EvcGF0aC90by8ua2NtZmlsZS5rY20gICAgICAtPiAua2NtZmlsZQorICoga2NtX2ZpbGVfcGF0aCAtIFBhdGggdG8ga2V5IGNoYXJtYXAgZmlsZSB0byBleHRyYWN0IGNoYXJtYXAgbmFtZSBmcm9tLgorICogY2hhcm1hcF9uYW1lIC0gQnVmZmVyLCB3aGVyZSB0byBzYXZlIGV4dHJhY3RlZCBjaGFybmFtZS4KKyAqIG1heF9sZW4gLSBjaGFybWFwX25hbWUgYnVmZmVyIHNpemUuCisqLwordm9pZCBrY21fZXh0cmFjdF9jaGFybWFwX25hbWUoY29uc3QgY2hhcioga2NtX2ZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGNoYXJtYXBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGVuKTsKKworLyogUGFyc2UgYSBjaGFybWFwIGZpbGUgYW5kIGFkZCBpdCB0byBvdXIgbGlzdC4KKyAqIEtleSBjaGFybWFwIGFycmF5IGFsd2F5cyBjb250YWlucyB0d28gbWFwczogb25lIGZvciBxd2VydHksIGFuZAorICogYW5vdGhlciBmb3IgcXdlcnR5MiBrZXlib2FyZCBsYXlvdXQuIEhvd2V2ZXIsIGEgY3VzdG9tIGxheW91dCBjYW4KKyAqIGJlIHJlcXVlc3RlZCB3aXRoIC1jaGFybWFwIG9wdGlvbi4gSW4gdGhhIGNhc2Uga2NtX2ZpbGVfcGF0aAorICogcGFyYW1ldGVyIGNvbnRhaW5zIHBhdGggdG8gYSAua2NtIGZpbGUgdGhhdCBkZWZpbmVzIHRoYXQgY3VzdG9tCisgKiBsYXlvdXQsIGFuZCBhcyB0aGUgcmVzdWx0LCBrZXkgY2hhcm1hcCBhcnJheSB3aWxsIGNvbnRhaW4gYW5vdGhlcgorICogZW50cnkgYnVpbHQgZnJvbSB0aGF0IGZpbGUuIElmIC1jaGFybWFwIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCwKKyAqIGtjbV9maWxlX3BhdGggaXMgTlVMTCBhbmQgZmluYWwga2V5IGNoYXJtYXAgYXJyYXkgd2lsbCBjb250YWluIG9ubHkKKyAqIHR3byBkZWZhdWx0IGVudHJpZXMuCisgKiBSZXR1cm5zIGEgemVybyB2YWx1ZSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLgorICoKKyAqIE5vdGU6IG9uIHN1Y2Nlc3MsIHRoZSBjaGFybWFwIHdpbGwgYmUgcmV0dXJuZWQgYnkgc2tpbl9jaGFybWFwX2dldCgpCisgKi8KK2ludCBza2luX2NoYXJtYXBfc2V0dXAoY29uc3QgY2hhcioga2NtX2ZpbGVfcGF0aCk7CisKKy8qIENsZWFudXBzIGluaXRpYWxpemF0aW9uIHBlcmZvcm1lZCBpbiBza2luX2NoYXJtYXBfc2V0dXAgcm91dGluZS4gKi8KK3ZvaWQgc2tpbl9jaGFybWFwX2RvbmUodm9pZCk7CisKKy8qIEdldHMgY2hhcm1hcCBkZXNjcmlwdG9yIGJ5IGl0cyBuYW1lLgorICogVGhpcyByb3V0aW5lIHRyaWVzIHRvIGZpbmQgYSBjaGFybWFwIGJ5IG5hbWUuIFRoaXMgd2lsbCBjb21wYXJlIHRoZQorICogbmFtZSB0byB0aGUgZGVmYXVsdCBjaGFybWFwJ3MgbmFtZSwgb3IgYW55IGNoYXJtYXAgbG9hZGVkIHdpdGgKKyAqIHNraW5fY2hhcm1hcF9zZXR1cCgpLiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KKyAqLworY29uc3QgU2tpbkNoYXJtYXAqIHNraW5fY2hhcm1hcF9nZXRfYnlfbmFtZShjb25zdCBjaGFyKiBuYW1lKTsKKworLyogTWFwcyBnaXZlbiB1bmljb2RlIGtleSBjaGFyYWN0ZXIgaW50byBhIGtleWNvZGUgYW5kIGFkZHMgbWFwcGVkIGtleWNvZGUgaW50bworICoga2V5Y29kZSBhcnJheS4gVGhpcyByb3V0aW5lIHVzZXMgY2hhcm1hcCBwYXNzZWQgYXMgY21hcCBwYXJhbWV0ZXIgdG8gZG8gdGhlCisgKiB0cmFuc2xhdGlvbiwgYW5kICdkb3duJyBwYXJhbWV0ZXIgdG8gZ2VuZXJhdGUgYXBwcm9wcmlhdGUgKCdkb3duJyBvciAndXAnKQorICoga2V5Y29kZS4KKyAqLworaW50Citza2luX2NoYXJtYXBfcmV2ZXJzZV9tYXBfdW5pY29kZShjb25zdCBTa2luQ2hhcm1hcCogY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbktleWNvZGVCdWZmZXIqIGtleWNvZGVzKTsKKworLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYWN0aXZlIGNoYXJtYXAuIElmIHNraW5fY2hhcm1hcF9zZXR1cCgpIHdhcworICogY2FsbGVkIHN1Y2Nlc2Z1bGx5LCB0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBuZXdseSBsb2FkZWQgY2hhcm1hcC4KKyAqCisgKiBPdGhlcndpc2UsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2hhcm1hcC4KKyAqLworY29uc3QgU2tpbkNoYXJtYXAqIHNraW5fY2hhcm1hcF9nZXQodm9pZCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9ldmVudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vZXZlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYwYTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vZXZlbnQuaApAQCAtMCwwICsxLDEwOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVjdC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAga0V2ZW50S2V5RG93biwKKyAgICBrRXZlbnRLZXlVcCwKKyAgICBrRXZlbnRUZXh0SW5wdXQsCisgICAga0V2ZW50TGF5b3V0TmV4dCwKKyAgICBrRXZlbnRMYXlvdXRQcmV2LAorICAgIGtFdmVudE1vdXNlQnV0dG9uRG93biwKKyAgICBrRXZlbnRNb3VzZUJ1dHRvblVwLAorICAgIGtFdmVudE1vdXNlTW90aW9uLAorICAgIGtFdmVudFF1aXQsCisgICAga0V2ZW50U2Nyb2xsQmFyQ2hhbmdlZCwKKyAgICBrRXZlbnRTZXRTY2FsZSwKKyAgICBrRXZlbnRTZXRab29tLAorICAgIGtFdmVudEZvcmNlUmVkcmF3LAorICAgIGtFdmVudFdpbmRvd01vdmVkLAorICAgIGtFdmVudExheW91dFJvdGF0ZSwKKyAgICBrRXZlbnRTY3JlZW5DaGFuZ2VkLAorICAgIGtFdmVudFpvb21lZFdpbmRvd1Jlc2l6ZWQsCisgICAga0V2ZW50VG9nZ2xlVHJhY2tiYWxsLAorfSBTa2luRXZlbnRUeXBlOworCit0eXBlZGVmIGVudW0geworICAgIGtNb3VzZUJ1dHRvbkxlZnQsCisgICAga01vdXNlQnV0dG9uU2Vjb25kYXJ5VG91Y2gsCisgICAga01vdXNlQnV0dG9uUmlnaHQKK30gU2tpbk1vdXNlQnV0dG9uVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGtleWNvZGU7CisgICAgdWludDMyX3QgbW9kOworICAgIC8vdWludDMyX3QgdW5pY29kZTsKK30gU2tpbkV2ZW50S2V5RGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGJvb2wgZG93bjsKKyAgICB1aW50OF90IHRleHRbMzJdOworfSBTa2luRXZlbnRUZXh0SW5wdXREYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50IHhyZWw7CisgICAgaW50IHlyZWw7CisgICAgaW50IGJ1dHRvbjsKKyAgICBpbnQgc2tpcF9zeW5jOworfSBTa2luRXZlbnRNb3VzZURhdGE7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgU2tpblJvdGF0aW9uIHJvdGF0aW9uOworfSBTa2luRXZlbnRMYXlvdXRSb3RhdGVEYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHg7IC8vIFNlbmQgY3VycmVudCB3aW5kb3cgY29vcmRpbmF0ZXMgdG8gbWFpbnRhaW4gd2luZG93IGxvY2F0aW9uCisgICAgaW50IHk7CisgICAgaW50IHNjcm9sbF9oOyAvLyBIZWlnaHQgb2YgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyLCBuZWVkZWQgZm9yIE9TWAorICAgIGRvdWJsZSBzY2FsZTsKK30gU2tpbkV2ZW50V2luZG93RGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB4OworICAgIGludCB5OworICAgIGludCB4bWF4OworICAgIGludCB5bWF4OworICAgIGludCBzY3JvbGxfaDsgLy8gSGVpZ2h0IG9mIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciwgbmVlZGVkIGZvciBPU1gKK30gU2tpbkV2ZW50U2Nyb2xsRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFNraW5FdmVudFR5cGUgdHlwZTsKKyAgICB1bmlvbiB7CisgICAgICAgIFNraW5FdmVudEtleURhdGEga2V5OworICAgICAgICBTa2luRXZlbnRNb3VzZURhdGEgbW91c2U7CisgICAgICAgIFNraW5FdmVudFNjcm9sbERhdGEgc2Nyb2xsOworICAgICAgICBTa2luRXZlbnRUZXh0SW5wdXREYXRhIHRleHQ7CisgICAgICAgIFNraW5FdmVudFdpbmRvd0RhdGEgd2luZG93OworICAgICAgICBTa2luRXZlbnRMYXlvdXRSb3RhdGVEYXRhIGxheW91dF9yb3RhdGlvbjsKKyAgICB9IHU7Cit9IFNraW5FdmVudDsKKworLy8gUG9sbCBmb3IgaW5jb21pbmcgaW5wdXQgZXZlbnRzLiBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cyB8KmV2ZW50fC4KKy8vIE9uIGZhaWx1cmUsIGkuZS4gaWYgdGhlcmUgYXJlIG5vIGV2ZW50cywgcmV0dXJuIGZhbHNlLgorZXh0ZXJuIGJvb2wgc2tpbl9ldmVudF9wb2xsKFNraW5FdmVudCogZXZlbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vZmlsZS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZmM5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9maWxlLmMKQEAgLTAsMCArMSwxMDE0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vZmlsZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyoqIFVUSUxJVFkgUk9VVElORVMKKyAqKi8KK3N0YXRpYyBTa2luSW1hZ2UqCitza2luX2ltYWdlX2ZpbmRfaW4oIGNvbnN0IGNoYXIqICBkaXJuYW1lLCBjb25zdCBjaGFyKiAgZmlsZW5hbWUgKQoreworICAgIGNoYXIgICBidWZmZXJbMTAyNF07CisgICAgY2hhciogIHAgICA9IGJ1ZmZlcjsKKyAgICBjaGFyKiAgZW5kID0gcCArIHNpemVvZihidWZmZXIpOworCisgICAgcCA9IGJ1ZnByaW50KCBwLCBlbmQsICIlcyIgUEFUSF9TRVAgIiVzIiwgZGlybmFtZSwgZmlsZW5hbWUgKTsKKyAgICBpZiAocCA+PSBlbmQpCisgICAgICAgIHJldHVybiBTS0lOX0lNQUdFX05PTkU7CisKKyAgICByZXR1cm4gc2tpbl9pbWFnZV9maW5kX3NpbXBsZShidWZmZXIpOworfQorCisvKiogU0tJTiBCQUNLR1JPVU5ECisgKiovCisKK3N0YXRpYyB2b2lkCitza2luX2JhY2tncm91bmRfZG9uZSggU2tpbkJhY2tncm91bmQqICBiYWNrZ3JvdW5kICkKK3sKKyAgICBpZiAoYmFja2dyb3VuZC0+aW1hZ2UpCisgICAgICAgIHNraW5faW1hZ2VfdW5yZWYoJmJhY2tncm91bmQtPmltYWdlKTsKK30KKworc3RhdGljIGludCBza2luX2JhY2tncm91bmRfaW5pdF9mcm9tKFNraW5CYWNrZ3JvdW5kKiBiYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDb25maWcqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZXBhdGgpIHsKKyAgICBjb25zdCBjaGFyKiBpbWcgPSBhY29uZmlnX3N0cihub2RlLCAiaW1hZ2UiLCBOVUxMKTsKKyAgICBpbnQgICAgICAgICB4ICAgPSBhY29uZmlnX2ludChub2RlLCAieCIsIDApOworICAgIGludCAgICAgICAgIHkgICA9IGFjb25maWdfaW50KG5vZGUsICJ5IiwgMCk7CisKKyAgICBiYWNrZ3JvdW5kLT52YWxpZCA9IDA7CisKKyAgICBpZiAoaW1nID09IE5VTEwpICAgLyogbm8gYmFja2dyb3VuZCAqLworICAgICAgICByZXR1cm4gLTE7CisKKyAgICBiYWNrZ3JvdW5kLT5pbWFnZSA9IHNraW5faW1hZ2VfZmluZF9pbiggYmFzZXBhdGgsIGltZyApOworICAgIGlmIChiYWNrZ3JvdW5kLT5pbWFnZSA9PSBTS0lOX0lNQUdFX05PTkUpIHsKKyAgICAgICAgYmFja2dyb3VuZC0+aW1hZ2UgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYmFja2dyb3VuZC0+cmVjdC5wb3MueCAgPSB4OworICAgIGJhY2tncm91bmQtPnJlY3QucG9zLnkgID0geTsKKyAgICBiYWNrZ3JvdW5kLT5yZWN0LnNpemUudyA9IHNraW5faW1hZ2VfdyggYmFja2dyb3VuZC0+aW1hZ2UgKTsKKyAgICBiYWNrZ3JvdW5kLT5yZWN0LnNpemUuaCA9IHNraW5faW1hZ2VfaCggYmFja2dyb3VuZC0+aW1hZ2UgKTsKKworICAgIGJhY2tncm91bmQtPnZhbGlkID0gMTsKKworICAgIHJldHVybiAwOworfQorCisvKiogU0tJTiBESVNQTEFZCisgKiovCisKK3N0YXRpYyB2b2lkCitza2luX2Rpc3BsYXlfZG9uZShTa2luRGlzcGxheSogIGRpc3BsYXkpCit7CisgICAgaWYgKGRpc3BsYXktPmZyYW1lYnVmZmVyX2Z1bmNzICYmIGRpc3BsYXktPm93bnNfZnJhbWVidWZmZXIpIHsKKyAgICAgICAgZGlzcGxheS0+ZnJhbWVidWZmZXJfZnVuY3MtPmZyZWVfZnJhbWVidWZmZXIoZGlzcGxheS0+ZnJhbWVidWZmZXIpOworICAgIH0KK30KKworc3RhdGljIGludCBza2luX2Rpc3BsYXlfaW5pdF9mcm9tKFNraW5EaXNwbGF5KiBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDb25maWcqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZiX2Z1bmNzKSB7CisgICAgZGlzcGxheS0+cmVjdC5wb3MueCAgPSBhY29uZmlnX2ludChub2RlLCAieCIsIDApOworICAgIGRpc3BsYXktPnJlY3QucG9zLnkgID0gYWNvbmZpZ19pbnQobm9kZSwgInkiLCAwKTsKKyAgICBkaXNwbGF5LT5yZWN0LnNpemUudyA9IGFjb25maWdfaW50KG5vZGUsICJ3aWR0aCIsIDApOworICAgIGRpc3BsYXktPnJlY3Quc2l6ZS5oID0gYWNvbmZpZ19pbnQobm9kZSwgImhlaWdodCIsIDApOworICAgIGRpc3BsYXktPnJvdGF0aW9uICAgID0gYWNvbmZpZ191bnNpZ25lZChub2RlLCAicm90YXRpb24iLCBTS0lOX1JPVEFUSU9OXzApOworICAgIGRpc3BsYXktPmJwcCAgICAgICAgID0gYWNvbmZpZ19pbnQobm9kZSwgImJwcCIsIGFuZHJvaWRfaHctPmh3X2xjZF9kZXB0aCk7CisgICAgZGlzcGxheS0+b3duc19mcmFtZWJ1ZmZlciA9IDE7CisKKyAgICBkaXNwbGF5LT52YWxpZCA9ICggZGlzcGxheS0+cmVjdC5zaXplLncgPiAwICYmIGRpc3BsYXktPnJlY3Quc2l6ZS5oID4gMCApOworICAgIGRpc3BsYXktPmZyYW1lYnVmZmVyX2Z1bmNzID0gZmJfZnVuY3M7CisgICAgaWYgKGRpc3BsYXktPnZhbGlkICYmIGZiX2Z1bmNzKSB7CisgICAgICAgIFNraW5SZWN0ICByOworICAgICAgICBza2luX3JlY3Rfcm90YXRlKCAmciwgJmRpc3BsYXktPnJlY3QsIC1kaXNwbGF5LT5yb3RhdGlvbiApOworICAgICAgICBkaXNwbGF5LT5mcmFtZWJ1ZmZlciA9IGZiX2Z1bmNzLT5jcmVhdGVfZnJhbWVidWZmZXIoCisgICAgICAgICAgICAgICAgci5zaXplLncsCisgICAgICAgICAgICAgICAgci5zaXplLmgsCisgICAgICAgICAgICAgICAgZGlzcGxheS0+YnBwKTsKKyNpZiAwCisgICAgICAgIHFmcmFtZWJ1ZmZlcl9pbml0KCBkaXNwbGF5LT5xZmJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNpemUudywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2l6ZS5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXktPmJwcCA9PSAzMiA/IFFGUkFNRV9CVUZGRVJfUkdCWF84ODg4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBRRlJBTUVfQlVGRkVSX1JHQjU2NSApOworCisgICAgICAgIHFmcmFtZWJ1ZmZlcl9maWZvX2FkZCggZGlzcGxheS0+cWZidWZmICk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGRpc3BsYXktPnZhbGlkID8gMCA6IC0xOworfQorCisvKiogU0tJTiBCVVRUT04KKyAqKi8KKworCitzdGF0aWMgdm9pZAorc2tpbl9idXR0b25fZnJlZSggU2tpbkJ1dHRvbiogIGJ1dHRvbiApCit7CisgICAgaWYgKGJ1dHRvbikgeworICAgICAgICBza2luX2ltYWdlX3VucmVmKCAmYnV0dG9uLT5pbWFnZSApOworICAgICAgICBBRlJFRShidXR0b24pOworICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIHRyYW5zbGF0ZV9idXR0b25fbmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiAgICAgbmFtZTsKKyAgICAgICAgU2tpbktleUNvZGUgIGNvZGU7CisgICAgfSBLZXlJbmZvOworCisgICAgc3RhdGljIGNvbnN0IEtleUluZm8ga2V5aW5mb190YWJsZVtdID0geworICAgICAgICB7ICJkcGFkLXVwIiwgICAgICBrS2V5Q29kZURwYWRVcCB9LAorICAgICAgICB7ICJkcGFkLWRvd24iLCAgICBrS2V5Q29kZURwYWREb3duIH0sCisgICAgICAgIHsgImRwYWQtbGVmdCIsICAgIGtLZXlDb2RlRHBhZExlZnQgfSwKKyAgICAgICAgeyAiZHBhZC1yaWdodCIsICAga0tleUNvZGVEcGFkUmlnaHQgfSwKKyAgICAgICAgeyAiZHBhZC1jZW50ZXIiLCAga0tleUNvZGVEcGFkQ2VudGVyIH0sCisgICAgICAgIHsgInNvZnQtbGVmdCIsICAgIGtLZXlDb2RlU29mdExlZnQgfSwKKyAgICAgICAgeyAic29mdC1yaWdodCIsICAga0tleUNvZGVTb2Z0UmlnaHQgfSwKKyAgICAgICAgeyAic2VhcmNoIiwgICAgICAga0tleUNvZGVTZWFyY2ggfSwKKyAgICAgICAgeyAiY2FtZXJhIiwgICAgICAga0tleUNvZGVDYW1lcmEgfSwKKyAgICAgICAgeyAidm9sdW1lLXVwIiwgICAga0tleUNvZGVWb2x1bWVVcCB9LAorICAgICAgICB7ICJ2b2x1bWUtZG93biIsICBrS2V5Q29kZVZvbHVtZURvd24gfSwKKyAgICAgICAgeyAicG93ZXIiLCAgICAgICAga0tleUNvZGVQb3dlciB9LAorICAgICAgICB7ICJob21lIiwgICAgICAgICBrS2V5Q29kZUhvbWUgfSwKKyAgICAgICAgeyAiaG9tZXBhZ2UiLCAgICAga0tleUNvZGVIb21lUGFnZSB9LAorICAgICAgICB7ICJiYWNrIiwgICAgICAgICBrS2V5Q29kZUJhY2sgfSwKKyAgICAgICAgeyAiZGVsIiwgICAgICAgICAga0tleUNvZGVEZWwgfSwKKyAgICAgICAgeyAiMCIsICAgICAgICAgICAga0tleUNvZGUwIH0sCisgICAgICAgIHsgIjEiLCAgICAgICAgICAgIGtLZXlDb2RlMSB9LAorICAgICAgICB7ICIyIiwgICAgICAgICAgICBrS2V5Q29kZTIgfSwKKyAgICAgICAgeyAiMyIsICAgICAgICAgICAga0tleUNvZGUzIH0sCisgICAgICAgIHsgIjQiLCAgICAgICAgICAgIGtLZXlDb2RlNCB9LAorICAgICAgICB7ICI1IiwgICAgICAgICAgICBrS2V5Q29kZTUgfSwKKyAgICAgICAgeyAiNiIsICAgICAgICAgICAga0tleUNvZGU2IH0sCisgICAgICAgIHsgIjciLCAgICAgICAgICAgIGtLZXlDb2RlNyB9LAorICAgICAgICB7ICI4IiwgICAgICAgICAgICBrS2V5Q29kZTggfSwKKyAgICAgICAgeyAiOSIsICAgICAgICAgICAga0tleUNvZGU5IH0sCisgICAgICAgIHsgInN0YXIiLCAgICAgICAgIGtLZXlDb2RlU3RhciB9LAorICAgICAgICB7ICJwb3VuZCIsICAgICAgICBrS2V5Q29kZVBvdW5kIH0sCisgICAgICAgIHsgInBob25lLWRpYWwiLCAgIGtLZXlDb2RlQ2FsbCB9LAorICAgICAgICB7ICJwaG9uZS1oYW5ndXAiLCBrS2V5Q29kZUVuZENhbGwgfSwKKyAgICAgICAgeyAicSIsICAgICAgICAgICAga0tleUNvZGVRIH0sCisgICAgICAgIHsgInciLCAgICAgICAgICAgIGtLZXlDb2RlVyB9LAorICAgICAgICB7ICJlIiwgICAgICAgICAgICBrS2V5Q29kZUUgfSwKKyAgICAgICAgeyAiciIsICAgICAgICAgICAga0tleUNvZGVSIH0sCisgICAgICAgIHsgInQiLCAgICAgICAgICAgIGtLZXlDb2RlVCB9LAorICAgICAgICB7ICJ5IiwgICAgICAgICAgICBrS2V5Q29kZVkgfSwKKyAgICAgICAgeyAidSIsICAgICAgICAgICAga0tleUNvZGVVIH0sCisgICAgICAgIHsgImkiLCAgICAgICAgICAgIGtLZXlDb2RlSSB9LAorICAgICAgICB7ICJvIiwgICAgICAgICAgICBrS2V5Q29kZU8gfSwKKyAgICAgICAgeyAicCIsICAgICAgICAgICAga0tleUNvZGVQIH0sCisgICAgICAgIHsgImEiLCAgICAgICAgICAgIGtLZXlDb2RlQSB9LAorICAgICAgICB7ICJzIiwgICAgICAgICAgICBrS2V5Q29kZVMgfSwKKyAgICAgICAgeyAiZCIsICAgICAgICAgICAga0tleUNvZGVEIH0sCisgICAgICAgIHsgImYiLCAgICAgICAgICAgIGtLZXlDb2RlRiB9LAorICAgICAgICB7ICJnIiwgICAgICAgICAgICBrS2V5Q29kZUcgfSwKKyAgICAgICAgeyAiaCIsICAgICAgICAgICAga0tleUNvZGVIIH0sCisgICAgICAgIHsgImoiLCAgICAgICAgICAgIGtLZXlDb2RlSiB9LAorICAgICAgICB7ICJrIiwgICAgICAgICAgICBrS2V5Q29kZUsgfSwKKyAgICAgICAgeyAibCIsICAgICAgICAgICAga0tleUNvZGVMIH0sCisgICAgICAgIHsgIkRFTCIsICAgICAgICAgIGtLZXlDb2RlRGVsIH0sCisgICAgICAgIHsgInoiLCAgICAgICAgICAgIGtLZXlDb2RlWiB9LAorICAgICAgICB7ICJ4IiwgICAgICAgICAgICBrS2V5Q29kZVggfSwKKyAgICAgICAgeyAiYyIsICAgICAgICAgICAga0tleUNvZGVDIH0sCisgICAgICAgIHsgInYiLCAgICAgICAgICAgIGtLZXlDb2RlViB9LAorICAgICAgICB7ICJiIiwgICAgICAgICAgICBrS2V5Q29kZUIgfSwKKyAgICAgICAgeyAibiIsICAgICAgICAgICAga0tleUNvZGVOIH0sCisgICAgICAgIHsgIm0iLCAgICAgICAgICAgIGtLZXlDb2RlTSB9LAorICAgICAgICB7ICJDT01NQSIsICAgICAgICBrS2V5Q29kZUNvbW1hIH0sCisgICAgICAgIHsgIlBFUklPRCIsICAgICAgIGtLZXlDb2RlUGVyaW9kIH0sCisgICAgICAgIHsgIkVOVEVSIiwgICAgICAgIGtLZXlDb2RlTmV3bGluZSB9LAorICAgICAgICB7ICJBVCIsICAgICAgICAgICBrS2V5Q29kZUF0IH0sCisgICAgICAgIHsgIlNQQUNFIiwgICAgICAgIGtLZXlDb2RlU3BhY2UgfSwKKyAgICAgICAgeyAiU0xBU0giLCAgICAgICAga0tleUNvZGVTbGFzaCB9LAorICAgICAgICB7ICJDQVAiLCAgICAgICAgICBrS2V5Q29kZUNhcExlZnQgfSwKKyAgICAgICAgeyAiU1lNIiwgICAgICAgICAga0tleUNvZGVTeW0gfSwKKyAgICAgICAgeyAiQUxUIiwgICAgICAgICAga0tleUNvZGVBbHRMZWZ0IH0sCisgICAgICAgIHsgIkFMVDIiLCAgICAgICAgIGtLZXlDb2RlQWx0UmlnaHQgfSwKKyAgICAgICAgeyAiQ0FQMiIsICAgICAgICAga0tleUNvZGVDYXBSaWdodCB9LAorICAgICAgICB7ICJ0diIsICAgICAgICAgICBrS2V5Q29kZVRWIH0sCisgICAgICAgIHsgImVwZyIsICAgICAgICAgIGtLZXlDb2RlRVBHIH0sCisgICAgICAgIHsgImR2ciIsICAgICAgICAgIGtLZXlDb2RlRFZSIH0sCisgICAgICAgIHsgInByZXYiLCAgICAgICAgIGtLZXlDb2RlUHJldmlvdXMgfSwKKyAgICAgICAgeyAibmV4dCIsICAgICAgICAga0tleUNvZGVOZXh0IH0sCisgICAgICAgIHsgInBsYXkiLCAgICAgICAgIGtLZXlDb2RlUGxheSB9LAorICAgICAgICB7ICJwbGF5cGF1c2UiLCAgICBrS2V5Q29kZVBsYXlwYXVzZSB9LAorICAgICAgICB7ICJwYXVzZSIsICAgICAgICBrS2V5Q29kZVBhdXNlIH0sCisgICAgICAgIHsgInN0b3AiLCAgICAgICAgIGtLZXlDb2RlU3RvcCB9LAorICAgICAgICB7ICJyZXYiLCAgICAgICAgICBrS2V5Q29kZVJld2luZCB9LAorICAgICAgICB7ICJmZndkIiwgICAgICAgICBrS2V5Q29kZUZhc3RGb3J3YXJkIH0sCisgICAgICAgIHsgImJvb2ttYXJrcyIsICAgIGtLZXlDb2RlQm9va21hcmtzIH0sCisgICAgICAgIHsgIndpbmRvdyIsICAgICAgIGtLZXlDb2RlQ3ljbGVXaW5kb3dzIH0sCisgICAgICAgIHsgImNoYW5uZWwtdXAiLCAgIGtLZXlDb2RlQ2hhbm5lbFVwIH0sCisgICAgICAgIHsgImNoYW5uZWwtZG93biIsIGtLZXlDb2RlQ2hhbm5lbERvd24gfSwKKyAgICAgICAgeyAiYXBwLXN3aXRjaCIsICAga0tleUNvZGVBcHBTd2l0Y2ggfSwKKyAgICAgICAgeyAwLCAwIH0sCisgICAgfTsKKworICAgIGNvbnN0IEtleUluZm8gKmtpID0ga2V5aW5mb190YWJsZTsKKyAgICB3aGlsZShraS0+bmFtZSkgeworICAgICAgICBpZighc3RyY21wKG5hbWUsIGtpLT5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBraS0+Y29kZTsKKyAgICAgICAga2krKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTa2luQnV0dG9uKiBza2luX2J1dHRvbl9jcmVhdGVfZnJvbShjb25zdCBBQ29uZmlnKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VwYXRoKSB7CisgICAgU2tpbkJ1dHRvbiogIGJ1dHRvbjsKKyAgICBBTkVXMChidXR0b24pOworICAgIGlmIChidXR0b24pIHsKKyAgICAgICAgY29uc3QgY2hhciogIGltZyA9IGFjb25maWdfc3RyKG5vZGUsICJpbWFnZSIsIE5VTEwpOworICAgICAgICBpbnQgICAgICAgICAgeCAgID0gYWNvbmZpZ19pbnQobm9kZSwgIngiLCAwKTsKKyAgICAgICAgaW50ICAgICAgICAgIHkgICA9IGFjb25maWdfaW50KG5vZGUsICJ5IiwgMCk7CisKKyAgICAgICAgYnV0dG9uLT5uYW1lICAgICAgID0gbm9kZS0+bmFtZTsKKyAgICAgICAgYnV0dG9uLT5yZWN0LnBvcy54ID0geDsKKyAgICAgICAgYnV0dG9uLT5yZWN0LnBvcy55ID0geTsKKworICAgICAgICBpZiAoaW1nICE9IE5VTEwpCisgICAgICAgICAgICBidXR0b24tPmltYWdlID0gc2tpbl9pbWFnZV9maW5kX2luKCBiYXNlcGF0aCwgaW1nICk7CisKKyAgICAgICAgaWYgKGJ1dHRvbi0+aW1hZ2UgPT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgICAgICBza2luX2J1dHRvbl9mcmVlKGJ1dHRvbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1dHRvbi0+cmVjdC5zaXplLncgPSBza2luX2ltYWdlX3coIGJ1dHRvbi0+aW1hZ2UgKTsKKyAgICAgICAgYnV0dG9uLT5yZWN0LnNpemUuaCA9IHNraW5faW1hZ2VfaCggYnV0dG9uLT5pbWFnZSApOworCisgICAgICAgIGJ1dHRvbi0+a2V5Y29kZSA9IHRyYW5zbGF0ZV9idXR0b25fbmFtZShidXR0b24tPm5hbWUpOworICAgICAgICBpZiAoYnV0dG9uLT5rZXljb2RlID09IDApIHsKKyAgICAgICAgICAgIGRwcmludCgiV2FybmluZzogc2tpbiBmaWxlIGJ1dHRvbiB1c2VzIHVua25vd24ga2V5IG5hbWUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgYnV0dG9uLT5uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnV0dG9uOworfQorCisvKiogU0tJTiBQQVJUCisgKiovCisKK3N0YXRpYyB2b2lkCitza2luX3BhcnRfZnJlZSggU2tpblBhcnQqICBwYXJ0ICkKK3sKKyAgICBpZiAocGFydCkgeworICAgICAgICBza2luX2JhY2tncm91bmRfZG9uZSggcGFydC0+YmFja2dyb3VuZCApOworICAgICAgICBza2luX2Rpc3BsYXlfZG9uZSggcGFydC0+ZGlzcGxheSApOworCisgICAgICAgIFNLSU5fUEFSVF9MT09QX0JVVFRPTlMocGFydCxidXR0b24pCisgICAgICAgICAgICBza2luX2J1dHRvbl9mcmVlKGJ1dHRvbik7CisgICAgICAgIFNLSU5fUEFSVF9MT09QX0VORAorICAgICAgICBwYXJ0LT5idXR0b25zID0gTlVMTDsKKyAgICAgICAgQUZSRUUocGFydCk7CisgICAgfQorfQorCitzdGF0aWMgU2tpbkxvY2F0aW9uKiBza2luX2xvY2F0aW9uX2NyZWF0ZV9mcm9tX3YyKGNvbnN0IEFDb25maWcqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5QYXJ0KiBwYXJ0cykgeworICAgIGNvbnN0IGNoYXIqICAgIHBhcnRuYW1lID0gYWNvbmZpZ19zdHIobm9kZSwgIm5hbWUiLCBOVUxMKTsKKyAgICBpbnQgICAgICAgICAgICB4ICAgICAgICA9IGFjb25maWdfaW50KG5vZGUsICJ4IiwgMCk7CisgICAgaW50ICAgICAgICAgICAgeSAgICAgICAgPSBhY29uZmlnX2ludChub2RlLCAieSIsIDApOworICAgIFNraW5Sb3RhdGlvbiAgIHJvdCAgICAgID0gYWNvbmZpZ19pbnQobm9kZSwgInJvdGF0aW9uIiwgU0tJTl9ST1RBVElPTl8wKTsKKyAgICBTa2luUGFydCogICAgICBwYXJ0OworICAgIFNraW5Mb2NhdGlvbiogIGxvY2F0aW9uOworCisgICAgaWYgKHBhcnRuYW1lID09IE5VTEwpIHsKKyAgICAgICAgZHByaW50KCAiIyMjIFdBUk5JTkc6IGlnbm9yaW5nIHBhcnQgbG9jYXRpb24gd2l0aG91dCAnbmFtZScgZWxlbWVudCIgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChwYXJ0ID0gcGFydHM7IHBhcnQ7IHBhcnQgPSBwYXJ0LT5uZXh0KQorICAgICAgICBpZiAoIXN0cmNtcChwYXJ0LT5uYW1lLCBwYXJ0bmFtZSkpCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmIChwYXJ0ID09IE5VTEwpIHsKKyAgICAgICAgZHByaW50KCAiIyMjIFdBUk5JTkc6IGlnbm9yaW5nIHBhcnQgbG9jYXRpb24gd2l0aCB1bmtub3duIG5hbWUgJyVzJyIsIHBhcnRuYW1lICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIEFORVcwKGxvY2F0aW9uKTsKKyAgICBsb2NhdGlvbi0+cGFydCAgICAgPSBwYXJ0OworICAgIGxvY2F0aW9uLT5hbmNob3IueCA9IHg7CisgICAgbG9jYXRpb24tPmFuY2hvci55ID0geTsKKyAgICBsb2NhdGlvbi0+cm90YXRpb24gPSByb3Q7CisKKyAgICByZXR1cm4gbG9jYXRpb247Cit9CisKK3N0YXRpYyBTa2luUGFydCogc2tpbl9wYXJ0X2NyZWF0ZV9mcm9tX3YxKAorICAgICAgICBjb25zdCBBQ29uZmlnKiByb290LAorICAgICAgICBjb25zdCBjaGFyKiBiYXNlcGF0aCwKKyAgICAgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZiX2Z1bmNzKSB7CisgICAgU2tpblBhcnQqIHBhcnQ7CisgICAgY29uc3QgQUNvbmZpZyogbm9kZTsKKyAgICBTa2luQm94IGJveDsKKworICAgIEFORVcwKHBhcnQpOworICAgIHBhcnQtPm5hbWUgPSByb290LT5uYW1lOworCisgICAgbm9kZSA9IGFjb25maWdfZmluZF9jb25zdChyb290LCAiYmFja2dyb3VuZCIpOworICAgIGlmIChub2RlKQorICAgICAgICBza2luX2JhY2tncm91bmRfaW5pdF9mcm9tKHBhcnQtPmJhY2tncm91bmQsIG5vZGUsIGJhc2VwYXRoKTsKKworICAgIG5vZGUgPSBhY29uZmlnX2ZpbmRfY29uc3Qocm9vdCwgImRpc3BsYXkiKTsKKyAgICBpZiAobm9kZSkKKyAgICAgICAgc2tpbl9kaXNwbGF5X2luaXRfZnJvbShwYXJ0LT5kaXNwbGF5LCBub2RlLCBmYl9mdW5jcyk7CisKKyAgICBub2RlID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsICJidXR0b24iKTsKKyAgICBpZiAobm9kZSkgeworICAgICAgICBmb3IgKG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgU2tpbkJ1dHRvbiogIGJ1dHRvbiA9IHNraW5fYnV0dG9uX2NyZWF0ZV9mcm9tKAorICAgICAgICAgICAgICAgICAgICBub2RlLCBiYXNlcGF0aCk7CisKKyAgICAgICAgICAgIGlmIChidXR0b24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGJ1dHRvbi0+bmV4dCAgPSBwYXJ0LT5idXR0b25zOworICAgICAgICAgICAgICAgIHBhcnQtPmJ1dHRvbnMgPSBidXR0b247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBza2luX2JveF9taW5tYXhfaW5pdCggJmJveCApOworCisgICAgaWYgKHBhcnQtPmJhY2tncm91bmQtPnZhbGlkKQorICAgICAgICBza2luX2JveF9taW5tYXhfdXBkYXRlKCAmYm94LCAmcGFydC0+YmFja2dyb3VuZC0+cmVjdCApOworCisgICAgaWYgKHBhcnQtPmRpc3BsYXktPnZhbGlkKQorICAgICAgICBza2luX2JveF9taW5tYXhfdXBkYXRlKCAmYm94LCAmcGFydC0+ZGlzcGxheS0+cmVjdCApOworCisgICAgU0tJTl9QQVJUX0xPT1BfQlVUVE9OUyhwYXJ0LCBidXR0b24pCisgICAgICAgIHNraW5fYm94X21pbm1heF91cGRhdGUoICZib3gsICZidXR0b24tPnJlY3QgKTsKKyAgICBTS0lOX1BBUlRfTE9PUF9FTkQKKworICAgIGlmICggIXNraW5fYm94X21pbm1heF90b19yZWN0KCAmYm94LCAmcGFydC0+cmVjdCApICkgeworICAgICAgICBza2luX3BhcnRfZnJlZShwYXJ0KTsKKyAgICAgICAgcGFydCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBhcnQ7Cit9CisKK3N0YXRpYyBTa2luUGFydCogc2tpbl9wYXJ0X2NyZWF0ZV9mcm9tX3YyKAorICAgICAgICBjb25zdCBBQ29uZmlnKiByb290LAorICAgICAgICBjb25zdCBjaGFyKiBiYXNlcGF0aCwKKyAgICAgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZiX2Z1bmNzKSB7CisgICAgU2tpblBhcnQqIHBhcnQ7CisgICAgY29uc3QgQUNvbmZpZyogbm9kZTsKKyAgICBTa2luQm94IGJveDsKKworICAgIEFORVcwKHBhcnQpOworICAgIHBhcnQtPm5hbWUgPSByb290LT5uYW1lOworCisgICAgbm9kZSA9IGFjb25maWdfZmluZF9jb25zdChyb290LCAiYmFja2dyb3VuZCIpOworICAgIGlmIChub2RlKQorICAgICAgICBza2luX2JhY2tncm91bmRfaW5pdF9mcm9tKHBhcnQtPmJhY2tncm91bmQsIG5vZGUsIGJhc2VwYXRoKTsKKworICAgIG5vZGUgPSBhY29uZmlnX2ZpbmRfY29uc3Qocm9vdCwgImRpc3BsYXkiKTsKKyAgICBpZiAobm9kZSkKKyAgICAgICAgc2tpbl9kaXNwbGF5X2luaXRfZnJvbShwYXJ0LT5kaXNwbGF5LCBub2RlLCBmYl9mdW5jcyk7CisKKyAgICBub2RlID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsICJidXR0b25zIik7CisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgZm9yIChub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNraW5CdXR0b24qICBidXR0b24gPSBza2luX2J1dHRvbl9jcmVhdGVfZnJvbSgKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgYmFzZXBhdGgpOworCisgICAgICAgICAgICBpZiAoYnV0dG9uICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBidXR0b24tPm5leHQgID0gcGFydC0+YnV0dG9uczsKKyAgICAgICAgICAgICAgICBwYXJ0LT5idXR0b25zID0gYnV0dG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc2tpbl9ib3hfbWlubWF4X2luaXQoICZib3ggKTsKKworICAgIGlmIChwYXJ0LT5iYWNrZ3JvdW5kLT52YWxpZCkKKyAgICAgICAgc2tpbl9ib3hfbWlubWF4X3VwZGF0ZSggJmJveCwgJnBhcnQtPmJhY2tncm91bmQtPnJlY3QgKTsKKworICAgIGlmIChwYXJ0LT5kaXNwbGF5LT52YWxpZCkKKyAgICAgICAgc2tpbl9ib3hfbWlubWF4X3VwZGF0ZSggJmJveCwgJnBhcnQtPmRpc3BsYXktPnJlY3QgKTsKKworICAgIFNLSU5fUEFSVF9MT09QX0JVVFRPTlMocGFydCwgYnV0dG9uKQorICAgICAgICBza2luX2JveF9taW5tYXhfdXBkYXRlKCAmYm94LCAmYnV0dG9uLT5yZWN0ICk7CisgICAgU0tJTl9QQVJUX0xPT1BfRU5ECisKKyAgICBpZiAoICFza2luX2JveF9taW5tYXhfdG9fcmVjdCggJmJveCwgJnBhcnQtPnJlY3QgKSApIHsKKyAgICAgICAgc2tpbl9wYXJ0X2ZyZWUocGFydCk7CisgICAgICAgIHBhcnQgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcGFydDsKK30KKworLyoqIFNLSU4gTEFZT1VUCisgKiovCisKK3N0YXRpYyB2b2lkCitza2luX2xheW91dF9mcmVlKCBTa2luTGF5b3V0KiAgbGF5b3V0ICkKK3sKKyAgICBpZiAobGF5b3V0KSB7CisgICAgICAgIFNLSU5fTEFZT1VUX0xPT1BfTE9DUyhsYXlvdXQsbG9jKQorICAgICAgICAgICAgQUZSRUUobG9jKTsKKyAgICAgICAgU0tJTl9MQVlPVVRfTE9PUF9FTkQKKyAgICAgICAgbGF5b3V0LT5sb2NhdGlvbnMgPSBOVUxMOworICAgICAgICBpZiAobGF5b3V0LT5vbmlvbl9pbWFnZSkgeworICAgICAgICAgIHNraW5faW1hZ2VfdW5yZWYoICZsYXlvdXQtPm9uaW9uX2ltYWdlICk7CisgICAgICAgIH0KKyAgICAgICAgQUZSRUUobGF5b3V0KTsKKyAgICB9Cit9CisKK1NraW5EaXNwbGF5Kgorc2tpbl9sYXlvdXRfZ2V0X2Rpc3BsYXkoIFNraW5MYXlvdXQqICBsYXlvdXQgKQoreworICAgIFNLSU5fTEFZT1VUX0xPT1BfTE9DUyhsYXlvdXQsbG9jKQorICAgICAgICBTa2luUGFydCogIHBhcnQgPSBsb2MtPnBhcnQ7CisgICAgICAgIGlmIChwYXJ0LT5kaXNwbGF5LT52YWxpZCkgeworICAgICAgICAgICAgcmV0dXJuIHBhcnQtPmRpc3BsYXk7CisgICAgICAgIH0KKyAgICBTS0lOX0xBWU9VVF9MT09QX0VORAorICAgIHJldHVybiBOVUxMOworfQorCitTa2luUm90YXRpb24KK3NraW5fbGF5b3V0X2dldF9kcGFkX3JvdGF0aW9uKFNraW5MYXlvdXQqIGxheW91dCkKK3sKKyAgICBpZiAobGF5b3V0LT5oYXNfZHBhZF9yb3RhdGlvbikKKyAgICAgICAgcmV0dXJuIGxheW91dC0+ZHBhZF9yb3RhdGlvbjsKKworICAgIFNLSU5fTEFZT1VUX0xPT1BfTE9DUyhsYXlvdXQsIGxvYykKKyAgICAgICAgU2tpblBhcnQqICBwYXJ0ID0gbG9jLT5wYXJ0OworICAgICAgICBTS0lOX1BBUlRfTE9PUF9CVVRUT05TKHBhcnQsYnV0dG9uKQorICAgICAgICAgICAgaWYgKGJ1dHRvbi0+a2V5Y29kZSA9PSBrS2V5Q29kZURwYWRVcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jLT5yb3RhdGlvbjsKKyAgICAgICAgU0tJTl9QQVJUX0xPT1BfRU5ECisgICAgU0tJTl9MQVlPVVRfTE9PUF9FTkQKKworICAgIHJldHVybiBTS0lOX1JPVEFUSU9OXzA7Cit9CisKKworc3RhdGljIGludAorc2tpbl9sYXlvdXRfZXZlbnRfZGVjb2RlKCBjb25zdCBjaGFyKiAgZXZlbnQsIGludCAgKnB0eXBlLCBpbnQgICpwY29kZSwgaW50ICpwdmFsdWUgKQoreworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogIG5hbWU7CisgICAgICAgIGludCAgICAgICAgICB2YWx1ZTsKKyAgICB9IEV2ZW50TmFtZTsKKworICAgIHN0YXRpYyBjb25zdCBFdmVudE5hbWUgIF9ldmVudF9uYW1lc1tdID0geworICAgICAgICB7ICJFVl9TVyIsIDB4MDUgfSwKKyAgICAgICAgeyBOVUxMLCAwIH0sCisgICAgfTsKKworICAgIGNvbnN0IGNoYXIqICAgICAgIHggPSBzdHJjaHIoZXZlbnQsICc6Jyk7CisgICAgY29uc3QgY2hhciogICAgICAgeSA9IE5VTEw7CisgICAgY29uc3QgRXZlbnROYW1lKiAgZXYgPSBfZXZlbnRfbmFtZXM7CisKKyAgICBpZiAoeCAhPSBOVUxMKQorICAgICAgICB5ID0gc3RyY2hyKHgrMSwgJzonKTsKKworICAgIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKSB7CisgICAgICAgIGRwcmludCggIiMjIyBXQVJOSU5HOiBpbnZhbGlkIHNraW4gbGF5b3V0IGV2ZW50IGZvcm1hdDogJyVzJywgc2hvdWxkIGJlICc8VFlQRT46PENPREU+OjxWQUxVRT4nIiwgZXZlbnQgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAoIDsgZXYtPm5hbWUgIT0gTlVMTDsgZXYrKyApCisgICAgICAgIGlmICghbWVtY21wKCBldmVudCwgZXYtPm5hbWUsIHggLSBldmVudCApICYmIGV2LT5uYW1lW3gtZXZlbnRdID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmICghZXYtPm5hbWUpIHsKKyAgICAgICAgZHByaW50KCAiIyMjIFdBUk5JTkc6IHVucmVjb2duaXplZCBza2luIGxheW91dCBldmVudCBuYW1lOiAlLipzIiwgeC1ldmVudCwgZXZlbnQgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICpwdHlwZSAgPSBldi0+dmFsdWU7CisgICAgKnBjb2RlICA9IHN0cnRvbCh4KzEsIE5VTEwsIDApOworICAgICpwdmFsdWUgPSBzdHJ0b2woeSsxLCBOVUxMLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFNraW5MYXlvdXQqIHNraW5fbGF5b3V0X2NyZWF0ZV9mcm9tX3YyKGNvbnN0IEFDb25maWcqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblBhcnQqIHBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VwYXRoKSB7CisgICAgU2tpbkxheW91dCogICAgbGF5b3V0OworICAgIGludCAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CisgICAgU2tpbkxvY2F0aW9uKiogcHRhaWw7CisgICAgY29uc3QgQUNvbmZpZyogbm9kZTsKKworICAgIEFORVcwKGxheW91dCk7CisKKyAgICB3aWR0aCAgPSBhY29uZmlnX2ludCggcm9vdCwgIndpZHRoIiwgNDAwICk7CisgICAgaGVpZ2h0ID0gYWNvbmZpZ19pbnQoIHJvb3QsICJoZWlnaHQiLCA0MDAgKTsKKworICAgIG5vZGUgPSBhY29uZmlnX2ZpbmRfY29uc3Qocm9vdCwgImV2ZW50Iik7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBza2luX2xheW91dF9ldmVudF9kZWNvZGUoIG5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXlvdXQtPmV2ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheW91dC0+ZXZlbnRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF5b3V0LT5ldmVudF92YWx1ZSApOworICAgIH0gZWxzZSB7CisgICAgICAgIGxheW91dC0+ZXZlbnRfdHlwZSAgPSAweDA1OyAgLyogY2xvc2Uga2V5Ym9hcmQgYnkgZGVmYXVsdCAqLworICAgICAgICBsYXlvdXQtPmV2ZW50X2NvZGUgID0gMDsKKyAgICAgICAgbGF5b3V0LT5ldmVudF92YWx1ZSA9IDE7CisgICAgfQorCisgICAgbGF5b3V0LT5uYW1lICA9IHJvb3QtPm5hbWU7CisgICAgbGF5b3V0LT5jb2xvciA9IGFjb25maWdfdW5zaWduZWQoIHJvb3QsICJjb2xvciIsIDB4ODA4MDgwICkgfCAweGZmMDAwMDAwOworICAgIHB0YWlsICAgICAgICAgPSAmbGF5b3V0LT5sb2NhdGlvbnM7CisKKyAgICBub2RlID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsICJkcGFkLXJvdGF0aW9uIik7CisgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICBsYXlvdXQtPmRwYWRfcm90YXRpb24gICAgID0gYWNvbmZpZ19pbnQoIHJvb3QsICJkcGFkLXJvdGF0aW9uIiwgMCApOworICAgICAgICBsYXlvdXQtPmhhc19kcGFkX3JvdGF0aW9uID0gMTsKKyAgICB9CisKKyAgICBub2RlID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsICJvbmlvbiIpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgY29uc3QgY2hhciogaW1nID0gYWNvbmZpZ19zdHIobm9kZSwgImltYWdlIiwgTlVMTCk7CisgICAgICAgIGxheW91dC0+b25pb25faW1hZ2UgPSBza2luX2ltYWdlX2ZpbmRfaW4oIGJhc2VwYXRoLCBpbWcgKTsKKyAgICAgICAgaWYgKGxheW91dC0+b25pb25faW1hZ2UgPT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgICAgICBsYXlvdXQtPm9uaW9uX2ltYWdlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvLyBJbiBsYXlvdXQgZmlsZSwgYWxwaGEgaXMgc3BlY2lmaWVkIGluIHJhbmdlIDAtMTAwLiBDb252ZXJ0IHRvCisgICAgICAgIC8vIGludGVybmFsIHJhbmdlIDAtMjU2IHdpdGggZGVmYXVsdD0xMjguCisgICAgICAgIGludCBhbHBoYSA9IGFjb25maWdfaW50KCBub2RlLCAiYWxwaGEiLCA1MCApOworICAgICAgICBsYXlvdXQtPm9uaW9uX2FscGhhID0gKDI1NiphbHBoYSkvMTAwOworICAgICAgICBsYXlvdXQtPm9uaW9uX3JvdGF0aW9uID0gYWNvbmZpZ19pbnQoIG5vZGUsICJyb3RhdGlvbiIsIDAgKTsKKyAgICB9CisKKyAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCisgICAgeworICAgICAgICBpZiAoIW1lbWNtcChub2RlLT5uYW1lLCAicGFydCIsIDQpKSB7CisgICAgICAgICAgICBTa2luTG9jYXRpb24qICBsb2NhdGlvbiA9IHNraW5fbG9jYXRpb25fY3JlYXRlX2Zyb21fdjIoIG5vZGUsIHBhcnRzICk7CisgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnB0YWlsID0gbG9jYXRpb247CisgICAgICAgICAgICBwdGFpbCAgPSAmbG9jYXRpb24tPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGF5b3V0LT5sb2NhdGlvbnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgbGF5b3V0LT5zaXplLncgPSB3aWR0aDsKKyAgICBsYXlvdXQtPnNpemUuaCA9IGhlaWdodDsKKworICAgIHJldHVybiBsYXlvdXQ7CisKK0ZhaWw6CisgICAgc2tpbl9sYXlvdXRfZnJlZShsYXlvdXQpOworICAgIHJldHVybiBOVUxMOworfQorCisvLyBSb3RhdGVzIGEgZ2l2ZW4gcmVjdCB0aGF0IGlzIGluc2lkZSBhbm90aGVyIHJlY3QgYXJvdW5kIHRoZSBjZW50ZXIgb2YgaXRzIHBhcmVudAorLy8gJ2RzdCcgaXMgYSBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkCisvLyAnc3JjJyBpcyBhIHBvaW50ZXIgdG8gdGhlIHJlY3QgdGhhdCB3aWxsIGJlIHJvdGF0ZWQgYW5kIGNhbiBiZSB0aGUgc2FtZSBhcyAnZHN0JworLy8gJ3BhcmVudF9zaXplJyBpcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBzcmMncyBwYXJlbnQgcmVjdAorLy8gJ2J5JyBpcyB0aGUgYW1vdW50IG9mIHJvdGF0aW9uLCBpbiA5MC1kZWdyZWUgaW5jcmVtZW50cworc3RhdGljIHZvaWQKK3NraW5fcmVjdF9yb3RhdGVfaW5fcmVjdChTa2luUmVjdCogZHN0LCBjb25zdCBTa2luUmVjdCogc3JjLCBjb25zdCBTa2luU2l6ZSogcGFyZW50X3NpemUsIFNraW5Sb3RhdGlvbiBieSkgeworICAgIGludCB4ID0gc3JjLT5wb3MueDsKKyAgICBpbnQgeSA9IHNyYy0+cG9zLnk7CisKKyAgICBza2luX3NpemVfcm90YXRlKCYoZHN0LT5zaXplKSwgJihzcmMtPnNpemUpLCBieSk7CisKKyAgICBzd2l0Y2goYnkpIHsKKyAgICBjYXNlIFNLSU5fUk9UQVRJT05fOTA6CisgICAgICAgIGRzdC0+cG9zLnggPSBwYXJlbnRfc2l6ZS0+dyAtIHkgLSBkc3QtPnNpemUudzsKKyAgICAgICAgZHN0LT5wb3MueSA9IHg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgZHN0LT5wb3MueCA9IHBhcmVudF9zaXplLT53IC0geCAtIGRzdC0+c2l6ZS53OworICAgICAgICBkc3QtPnBvcy55ID0gcGFyZW50X3NpemUtPmggLSB5IC0gZHN0LT5zaXplLmg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgZHN0LT5wb3MueCA9IHk7CisgICAgICAgIGRzdC0+cG9zLnkgPSBwYXJlbnRfc2l6ZS0+aCAtIHggLSBkc3QtPnNpemUuaDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNLSU5fUk9UQVRJT05fMDoKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8vIENyZWF0ZXMgYSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBidXR0b24gcm90YXRlZCBhcm91bmQgdGhlIGNlbnRlciBvZiB0aGUgZ2l2ZW4gcGFydC4KKy8vICdzcmMnIGlzIHRoZSBidXR0b24gdGhhdCBuZWVkcyByb3RhdGlvbgorLy8gJ3BhcnRfc2l6ZScgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHBhcnQgY29udGFpbmluZyB0aGUgYnV0dG9uCisvLyAnYnknIGlzIHRoZSBhbW91bnQgb2Ygcm90YXRpb24gaW4gOTAtZGVncmVlIGluY3JlbWVudHMKK3N0YXRpYyBTa2luQnV0dG9uKgorc2tpbl9idXR0b25fY3JlYXRlX3JvdGF0ZWQoY29uc3QgU2tpbkJ1dHRvbiogc3JjLCBjb25zdCBTa2luU2l6ZSogcGFydF9zaXplLCBTa2luUm90YXRpb24gYnkpIHsKKyAgICBTa2luQnV0dG9uKiBuZXdfYnV0dG9uOworICAgIEFORVcwKG5ld19idXR0b24pOworICAgICpuZXdfYnV0dG9uID0gKnNyYzsKKyAgICBuZXdfYnV0dG9uLT5uZXh0ID0gTlVMTDsKKyAgICBza2luX3JlY3Rfcm90YXRlX2luX3JlY3QoJihuZXdfYnV0dG9uLT5yZWN0KSwgJihzcmMtPnJlY3QpLCBwYXJ0X3NpemUsIGJ5KTsKKyAgICBuZXdfYnV0dG9uLT5pbWFnZSA9IHNraW5faW1hZ2VfY2xvbmVfcm90YXRlZChzcmMtPmltYWdlLCBieSk7CisgICAgaWYgKG5ld19idXR0b24tPmltYWdlID09IFNLSU5fSU1BR0VfTk9ORSkgeworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIHJldHVybiBuZXdfYnV0dG9uOworCitGYWlsOgorICAgIHNraW5fYnV0dG9uX2ZyZWUobmV3X2J1dHRvbik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIENyZWF0ZXMgYSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBza2luIHBhcnQgdGhhdCBpcyByb3RhdGVkIGFyb3VuZCB0aGUgY2VudGVyIG9mIHRoZSBnaXZlbgorLy8gbGF5b3V0LgorLy8gJ3NyYycgaXMgdGhlIHBhcnQgdGhhdCBuZWVkcyByb3RhdGlvbgorLy8gJ2xheW91dF9zaXplJyBpcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGFyZW50IGxheW91dAorLy8gJ2J5JyBpcyB0aGUgYW1vdW50IG9mIHJvdGF0aW9uIGluIDkwLWRlZ3JlZSBpbmNyZW1lbnRzCitzdGF0aWMgU2tpblBhcnQqCitza2luX3BhcnRfY3JlYXRlX3JvdGF0ZWQoY29uc3QgU2tpblBhcnQqIHNyYywgY29uc3QgU2tpblNpemUqIGxheW91dF9zaXplLCBTa2luUm90YXRpb24gYnkpIHsKKyAgICBTa2luUGFydCogbmV3X3BhcnQ7CisgICAgQU5FVzAobmV3X3BhcnQpOworCisgICAgKm5ld19wYXJ0ID0gKnNyYzsKKyAgICBuZXdfcGFydC0+bmV4dCA9IE5VTEw7CisgICAgbmV3X3BhcnQtPmJ1dHRvbnMgPSBOVUxMOworCisgICAgLy8gUm90YXRlIHRoZSBiYWNrZ3JvdW5kIGltYWdlCisgICAgaWYgKG5ld19wYXJ0LT5iYWNrZ3JvdW5kLT5pbWFnZSAmJgorICAgICAgICBuZXdfcGFydC0+YmFja2dyb3VuZC0+aW1hZ2UgIT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgIG5ld19wYXJ0LT5iYWNrZ3JvdW5kLT5pbWFnZSA9CisgICAgICAgICAgICBza2luX2ltYWdlX2Nsb25lX3JvdGF0ZWQoc3JjLT5iYWNrZ3JvdW5kLT5pbWFnZSwgYnkpOworICAgICAgICBza2luX3NpemVfcm90YXRlKCYobmV3X3BhcnQtPmJhY2tncm91bmQtPnJlY3Quc2l6ZSksICYoc3JjLT5iYWNrZ3JvdW5kLT5yZWN0LnNpemUpLCBieSk7CisgICAgICAgIGlmIChuZXdfcGFydC0+YmFja2dyb3VuZC0+aW1hZ2UgPT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB0aGUgcGFydCBoYXMgYSBkaXNwbGF5LCByb3RhdGUgdGhhdCB0b28KKyAgICBpZiAobmV3X3BhcnQtPmRpc3BsYXktPnZhbGlkKSB7CisgICAgICAgIHNraW5fc2l6ZV9yb3RhdGUoJihuZXdfcGFydC0+ZGlzcGxheS0+cmVjdC5zaXplKSwgJihzcmMtPmRpc3BsYXktPnJlY3Quc2l6ZSksIGJ5KTsKKyAgICAgICAgbmV3X3BhcnQtPmRpc3BsYXktPnJvdGF0aW9uID0gc2tpbl9yb3RhdGlvbl9yb3RhdGUobmV3X3BhcnQtPmRpc3BsYXktPnJvdGF0aW9uLCBieSk7CisKKyAgICAgICAgLy8gUm90YXRlZCBwYXJ0IHNoYXJlcyBmcmFtZWJ1ZmZlciB3aXRoIHRoZSBvcmlnaW5hbC4KKyAgICAgICAgbmV3X3BhcnQtPmRpc3BsYXktPm93bnNfZnJhbWVidWZmZXIgPSAwOworICAgIH0KKworICAgIC8vIFJvdGF0ZSBlYWNoIG9mIHRoZSBwYXJ0J3MgYnV0dG9ucyBzbyB0aGF0IHRoZXkgYWxpZ24gd2l0aCB0aGUgcm90YXRlZAorICAgIC8vIGJhY2tncm91bmQgcHJvcGVybHkuCisgICAgU2tpbkJ1dHRvbioqIG5ld19idG4gPSAmKG5ld19wYXJ0LT5idXR0b25zKTsKKyAgICBTS0lOX1BBUlRfTE9PUF9CVVRUT05TKHNyYywgYnRuKQorICAgICAgICAqbmV3X2J0biA9IHNraW5fYnV0dG9uX2NyZWF0ZV9yb3RhdGVkKGJ0biwgJihuZXdfcGFydC0+YmFja2dyb3VuZC0+cmVjdC5zaXplKSwgYnkpOworICAgICAgICBpZiAoKm5ld19idG4gPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIG5ld19idG4gPSAmKCgqbmV3X2J0biktPm5leHQpOworICAgIFNLSU5fUEFSVF9MT09QX0VORAorCisgICAgcmV0dXJuIG5ld19wYXJ0OworCitGYWlsOgorICAgIHNraW5fcGFydF9mcmVlKG5ld19wYXJ0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gUm90YXRlcyBhIGdpdmVuIFNraW5Mb2NhdGlvbiB3aXRoaW4gaXRzIHBhcmVudCBsYXlvdXQuIEl0IHdpbGwgY3JlYXRlIGEgcm90YXRlZCBjb3B5IG9mCisvLyB0aGUgc2tpbiBwYXJ0IHRoYXQgdGhlIGxvY2F0aW9uIHJlZmVybmNlcy4KK3N0YXRpYyBTa2luTG9jYXRpb24qCitza2luX2xvY2F0aW9uX2NyZWF0ZV9yb3RhdGVkKGNvbnN0IFNraW5Mb2NhdGlvbiogc3JjLCBjb25zdCBTa2luU2l6ZSogbGF5b3V0X3NpemUsIFNraW5Sb3RhdGlvbiBieSkKK3sKKyAgICBTa2luTG9jYXRpb24qIG5ld19sb2NhdGlvbjsKKyAgICBBTkVXMChuZXdfbG9jYXRpb24pOworCisgICAgKm5ld19sb2NhdGlvbiA9ICpzcmM7CisgICAgbmV3X2xvY2F0aW9uLT5uZXh0ID0gTlVMTDsKKyAgICBuZXdfbG9jYXRpb24tPnBhcnQgPSBza2luX3BhcnRfY3JlYXRlX3JvdGF0ZWQoc3JjLT5wYXJ0LCBsYXlvdXRfc2l6ZSwgYnkpOworICAgIGlmIChuZXdfbG9jYXRpb24tPnBhcnQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgU2tpblJlY3QgcjsKKyAgICByLnBvcyA9IHNyYy0+YW5jaG9yOworICAgIHIuc2l6ZSA9IG5ld19sb2NhdGlvbi0+cGFydC0+ZGlzcGxheS0+dmFsaWQgPworICAgICAgICBzcmMtPnBhcnQtPmRpc3BsYXktPnJlY3Quc2l6ZSA6CisgICAgICAgIHNyYy0+cGFydC0+YmFja2dyb3VuZC0+cmVjdC5zaXplOworCisgICAgc2tpbl9yZWN0X3JvdGF0ZV9pbl9yZWN0KCZyLCAmciwgbGF5b3V0X3NpemUsIGJ5KTsKKyAgICBuZXdfbG9jYXRpb24tPmFuY2hvci54ID0gci5wb3MueDsKKyAgICBuZXdfbG9jYXRpb24tPmFuY2hvci55ID0gci5wb3MueTsKKyAgICByZXR1cm4gbmV3X2xvY2F0aW9uOworCitGYWlsOgorICAgIEFGUkVFKG5ld19sb2NhdGlvbik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIENyZWF0ZSBhIG5ldyBsYXlvdXQgd2hpY2ggaXMgdGhlIHNhbWUgYXMgc3JjLCBidXQgcm90YXRlZCBieSBhIGdpdmVuIGFtb3VudC4KKy8vIFRoaXMgd2lsbCBhbHNvIGNyZWF0ZSByb3RhdGVkIGNsb25lcyBvZiBhbGwgdGhlIHBhcnRzIHVzZWQgYnkgdGhlIHNvdXJjZSBsYXlvdXQuCisvLyAnc3JjJyBpcyB0aGUgc291cmNlIGxheW91dC4KKy8vICduZXdfcGFydHNfcHRyJyBpcyB0aGUgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGhlYWQgb2YgdGhlIGxpbmtlZCBsaXN0CisvLyAgICAgICAgICAgICAgICAgb2YgdGhlIG5ldyBwYXJ0cyBzaG91bGQgYmUgc3RvcmVkLgorLy8gJ2J5JyBpcyB0aGUgYW1vdW50IG9mIHJvdGF0aW9uIHRvIGFwcGx5LCBpbiA5MC1kZWdyZWUgaW5jcmVtZW50cy4KK3N0YXRpYyBTa2luTGF5b3V0Kgorc2tpbl9sYXlvdXRfY3JlYXRlX3JvdGF0ZWQoY29uc3QgU2tpbkxheW91dCogc3JjLCBTa2luUGFydCoqIG5ld19wYXJ0c19wdHIsIFNraW5Sb3RhdGlvbiBieSkKK3sKKyAgICBTa2luTGF5b3V0KiBuZXdfbGF5b3V0OworICAgIEFORVcwKG5ld19sYXlvdXQpOworCisgICAgKm5ld19sYXlvdXQgPSAqc3JjOworCisgICAgbmV3X2xheW91dC0+bmV4dCA9IE5VTEw7CisgICAgbmV3X2xheW91dC0+b3JpZW50YXRpb24gPSBza2luX3JvdGF0aW9uX3JvdGF0ZShuZXdfbGF5b3V0LT5vcmllbnRhdGlvbiwgYnkpOworCisgICAgLy8gRFBhZCByb3RhdGlvbiBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoZSBhcnJvdyBrZXlzIHdvcmsgY29ycmVjdGx5LCBldmVuIGlmCisgICAgLy8gdGhlIGRldmljZSBpc24ndCBjb25maWd1cmVkIGZvciBhIERQYWQKKyAgICBuZXdfbGF5b3V0LT5oYXNfZHBhZF9yb3RhdGlvbiA9IHRydWU7CisgICAgbmV3X2xheW91dC0+ZHBhZF9yb3RhdGlvbiA9IGJ5OworICAgIHNraW5fc2l6ZV9yb3RhdGUoJihuZXdfbGF5b3V0LT5zaXplKSwgJihzcmMtPnNpemUpLCBieSk7CisKKyAgICBuZXdfbGF5b3V0LT5sb2NhdGlvbnMgPSBOVUxMOworICAgIFNraW5Mb2NhdGlvbioqIGN1cnJlbnRfbG9jX3B0ciA9ICYobmV3X2xheW91dC0+bG9jYXRpb25zKTsKKyAgICBTa2luUGFydCogbmV3X3BhcnRzID0gKm5ld19wYXJ0c19wdHI7IC8vIEEgbGlua2VkIGxpc3Qgb2YgbmV3bHkgZ2VuZXJhdGVkLCByb3RhdGVkIHBhcnRzLgorCisgICAgU0tJTl9MQVlPVVRfTE9PUF9MT0NTKHNyYywgbG9jKQorICAgICAgICAqY3VycmVudF9sb2NfcHRyID0gc2tpbl9sb2NhdGlvbl9jcmVhdGVfcm90YXRlZChsb2MsICYobmV3X2xheW91dC0+c2l6ZSksIGJ5KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgLy8gUHJlcGVuZCB0aGUgcGFydCBnZW5lcmF0ZWQgZm9yIHRoaXMgbG9jYXRpb24gdG8gdGhlIGxpbmtlZCBsaXN0IG9mIG5ldyBwYXJ0cworICAgICAgICAoKmN1cnJlbnRfbG9jX3B0ciktPnBhcnQtPm5leHQgPSBuZXdfcGFydHM7CisgICAgICAgIG5ld19wYXJ0cyA9ICgqY3VycmVudF9sb2NfcHRyKS0+cGFydDsKKworICAgICAgICAoKmN1cnJlbnRfbG9jX3B0ciktPm5leHQgPSBOVUxMOworICAgICAgICBjdXJyZW50X2xvY19wdHIgPSAmKCgqY3VycmVudF9sb2NfcHRyKS0+bmV4dCk7CisgICAgU0tJTl9MQVlPVVRfTE9PUF9FTkQKKworICAgIC8vIFJvdGF0ZSB0aGUgb25pb24gaW1hZ2UgaWYgdGhlcmUgaXMgb25lLgorICAgIGlmIChzcmMtPm9uaW9uX2ltYWdlICYmIHNyYy0+b25pb25faW1hZ2UgIT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgIG5ld19sYXlvdXQtPm9uaW9uX3JvdGF0aW9uID0KKyAgICAgICAgICAgIHNraW5fcm90YXRpb25fcm90YXRlKHNyYy0+b25pb25fcm90YXRpb24sIGJ5KTsKKyAgICAgICAgbmV3X2xheW91dC0+b25pb25faW1hZ2UgPSBza2luX2ltYWdlX2Nsb25lX3JvdGF0ZWQoc3JjLT5vbmlvbl9pbWFnZSwgYnkpOworICAgICAgICBpZiAobmV3X2xheW91dC0+b25pb25faW1hZ2UgPT0gU0tJTl9JTUFHRV9OT05FKSB7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgbmV3X2xheW91dC0+b25pb25faW1hZ2UgPQorICAgICAgICAgICAgc2tpbl9pbWFnZV9jbG9uZV9yb3RhdGVkKAorICAgICAgICAgICAgICAgIG5ld19sYXlvdXQtPm9uaW9uX2ltYWdlLAorICAgICAgICAgICAgICAgIHNraW5fcm90YXRpb25fcm90YXRlKHNraW5faW1hZ2Vfcm90KG5ld19sYXlvdXQtPm9uaW9uX2ltYWdlKSwgYnkpKTsKKyAgICAgICAgaWYgKG5ld19sYXlvdXQtPm9uaW9uX2ltYWdlID09IFNLSU5fSU1BR0VfTk9ORSkgeworICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgKm5ld19wYXJ0c19wdHIgPSBuZXdfcGFydHM7CisgICAgcmV0dXJuIG5ld19sYXlvdXQ7CisKK0ZhaWw6CisgICAgLy8gRnJlZSB0aGUgbmV3bHkgY3JlYXRlZCBza2lucyBiZWNhdXNlIHRoZXkncmUgbm90IGdvaW5nIHRvIGJlIHVzZWQuCisgICAgd2hpbGUgKG5ld19wYXJ0cykgeworICAgICAgICBTa2luUGFydCogbmV4dCA9IG5ld19wYXJ0cy0+bmV4dDsKKyAgICAgICAgc2tpbl9wYXJ0X2ZyZWUobmV3X3BhcnRzKTsKKyAgICAgICAgbmV3X3BhcnRzID0gbmV4dDsKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoZSBsYXlvdXQgaXRzZWxmLgorICAgIHNraW5fbGF5b3V0X2ZyZWUobmV3X2xheW91dCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKiBTS0lOIEZJTEUKKyAqKi8KKworc3RhdGljIGludCBza2luX2ZpbGVfbG9hZF9mcm9tX3YxKFNraW5GaWxlKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDb25maWcqIGFjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZiX2Z1bmNzKSB7CisgICAgU2tpblBhcnQqICAgICAgcGFydDsKKyAgICBTa2luTGF5b3V0KiAgICBsYXlvdXQ7CisgICAgU2tpbkxheW91dCoqICAgcHRhaWwgPSAmZmlsZS0+bGF5b3V0czsKKyAgICBTa2luTG9jYXRpb24qICBsb2NhdGlvbjsKKyAgICBpbnQgICAgICAgICAgICBubjsKKworICAgIGZpbGUtPnBhcnRzID0gcGFydCA9IHNraW5fcGFydF9jcmVhdGVfZnJvbV92MSgKKyAgICAgICAgICAgIGFjb25maWcsIGJhc2VwYXRoLCBmYl9mdW5jcyk7CisgICAgaWYgKHBhcnQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgNDsgbm4rKykKKyAgICB7CisgICAgICAgIEFORVcwKGxheW91dCk7CisKKyAgICAgICAgbGF5b3V0LT5jb2xvciA9IDB4ZmY4MDgwODA7CisKKyAgICAgICAgQU5FVzAobG9jYXRpb24pOworCisgICAgICAgIGxheW91dC0+ZXZlbnRfdHlwZSAgPSAweDA1OyAgLyogY2xvc2Uga2V5Ym9hcmQgYnkgZGVmYXVsdCAqLworICAgICAgICBsYXlvdXQtPmV2ZW50X2NvZGUgID0gMDsKKyAgICAgICAgbGF5b3V0LT5ldmVudF92YWx1ZSA9IDA7CisKKyAgICAgICAgbG9jYXRpb24tPnBhcnQgICAgID0gcGFydDsKKyAgICAgICAgc3dpdGNoIChubikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGxvY2F0aW9uLT5hbmNob3IueCA9IDA7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci55ID0gMDsKKyAgICAgICAgICAgICAgICBsb2NhdGlvbi0+cm90YXRpb24gPSBTS0lOX1JPVEFUSU9OXzA7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5zaXplICAgICAgID0gcGFydC0+cmVjdC5zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci54ID0gcGFydC0+cmVjdC5zaXplLmg7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci55ID0gMDsKKyAgICAgICAgICAgICAgICBsb2NhdGlvbi0+cm90YXRpb24gPSBTS0lOX1JPVEFUSU9OXzkwOworICAgICAgICAgICAgICAgIGxheW91dC0+c2l6ZS53ICAgICA9IHBhcnQtPnJlY3Quc2l6ZS5oOworICAgICAgICAgICAgICAgIGxheW91dC0+c2l6ZS5oICAgICA9IHBhcnQtPnJlY3Quc2l6ZS53OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci54ID0gcGFydC0+cmVjdC5zaXplLnc7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci55ID0gcGFydC0+cmVjdC5zaXplLmg7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPnJvdGF0aW9uID0gU0tJTl9ST1RBVElPTl8xODA7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5zaXplICAgICAgID0gcGFydC0+cmVjdC5zaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGxvY2F0aW9uLT5hbmNob3IueCA9IDA7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPmFuY2hvci55ID0gcGFydC0+cmVjdC5zaXplLnc7CisgICAgICAgICAgICAgICAgbG9jYXRpb24tPnJvdGF0aW9uID0gU0tJTl9ST1RBVElPTl8yNzA7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5zaXplLncgICAgID0gcGFydC0+cmVjdC5zaXplLmg7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5zaXplLmggICAgID0gcGFydC0+cmVjdC5zaXplLnc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGF5b3V0LT5sb2NhdGlvbnMgPSBsb2NhdGlvbjsKKyAgICAgICAgbGF5b3V0LT5vcmllbnRhdGlvbiA9IGxvY2F0aW9uLT5yb3RhdGlvbjsKKworICAgICAgICAqcHRhaWwgPSBsYXlvdXQ7CisgICAgICAgIHB0YWlsICA9ICZsYXlvdXQtPm5leHQ7CisgICAgfQorICAgIGZpbGUtPnZlcnNpb24gPSAxOworICAgIHJldHVybiAwOworfQorCisvLyBOYW1lcyBmb3IgYXV0by1nZW5lcmF0ZWQgbGF5b3V0cy4KKy8vIFdlIGRvbid0IG5lZWQgInBvcnRyYWl0IiAtIGl0IGlzIHRoZSBmaXJzdCBsYXlvdXQgaW4KKy8vIHNraW4gZmlsZXMgYnkgY29udmVudGlvbiwgYW5kIHdlIGdlbmVyYXRlIG90aGVyCisvLyBvcmllbnRhdGlvbnMgZnJvbSBpdC4KK3N0YXRpYyBjb25zdCBjaGFyKiBhdXRvX2xheW91dF9uYW1lc1tdID0KKyAgICB7ICJyZXZlcnNlX2xhbmRzY2FwZSIsICJyZXZlcnNlX3BvcnRyYWl0IiwgImxhbmRzY2FwZSIgfTsKKworc3RhdGljIGludCBza2luX2ZpbGVfbG9hZF9mcm9tX3YyKFNraW5GaWxlKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFDb25maWcqIGFjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZXBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZiX2Z1bmNzKSB7CisgICAgLyogZmlyc3QsIGxvYWQgYWxsIHBhcnRzICovCisgICAgY29uc3QgQUNvbmZpZyogbm9kZSA9IGFjb25maWdfZmluZF9jb25zdChhY29uZmlnLCAicGFydHMiKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgU2tpblBhcnQqKiAgcHRhaWwgPSAmZmlsZS0+cGFydHM7CisgICAgICAgIGZvciAobm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBTa2luUGFydCogIHBhcnQgPSBza2luX3BhcnRfY3JlYXRlX2Zyb21fdjIoCisgICAgICAgICAgICAgICAgICAgIG5vZGUsIGJhc2VwYXRoLCBmYl9mdW5jcyk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZHByaW50KCAiIyMgV0FSTklORzogY2FuJ3QgbG9hZCBwYXJ0ICclcycgZnJvbSBza2luXG4iLCBub2RlLT5uYW1lID8gIjxOVUxMPiIgOiBub2RlLT5uYW1lICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcnQtPm5leHQgPSBOVUxMOworICAgICAgICAgICAgKnB0YWlsICAgICA9IHBhcnQ7CisgICAgICAgICAgICBwdGFpbCAgICAgID0gJnBhcnQtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmlsZS0+cGFydHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogdGhlbiBsb2FkIGFsbCBsYXlvdXRzICovCisgICAgbm9kZSA9IGFjb25maWdfZmluZF9jb25zdChhY29uZmlnLCAibGF5b3V0cyIpOworICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBTa2luTGF5b3V0KiBuZXh0ID0gc2tpbl9sYXlvdXRfY3JlYXRlX2Zyb21fdjIobm9kZS0+Zmlyc3RfY2hpbGQsIGZpbGUtPnBhcnRzLCBiYXNlcGF0aCk7CisgICAgICAgIG5leHQtPm9yaWVudGF0aW9uID0gU0tJTl9ST1RBVElPTl8wOworCisgICAgICAgIC8vIFdlIG5lZWQgdG8gZmluZCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBsaXN0IG9mIHBhcnRzIGRlZmluZWQgYnkgdGhlIHNraW4uCisgICAgICAgIC8vIFRoZSBhdXRvbWF0aWNhbGx5IHBhcnRzIGdlbmVyYXRlZCBwYXJ0cyAoZ2VuZXJhdGVkIGJ5IHJvdGF0aW9uKSB3aWxsIGJlIGFwcGVuZGVkCisgICAgICAgIC8vIGFmdGVyIHRoYXQgcGFydC4KKyAgICAgICAgU2tpblBhcnQqKiBsYXN0X3BhcnRfcHRyID0gJihmaWxlLT5wYXJ0cyk7CisKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgICAgICBmaWxlLT5sYXlvdXRzID0gbmV4dDsKKworICAgICAgICAvLyBHZW5lcmF0ZSBuZXcgbGF5b3V0cyBmcm9tIHRoZSBmaXJzdCBsYXlvdXQuIFRoZSBuZXcgbGF5b3V0cyBhcmUgcm90YXRlZAorICAgICAgICAvLyB2ZXJzaW9ucyBvZiB0aGUgZmlyc3QgbGF5b3V0LgorICAgICAgICBTa2luTGF5b3V0KiBsYXlvdXQgPSBmaWxlLT5sYXlvdXRzOworICAgICAgICBTa2luTGF5b3V0KiBmaXJzdF9sYXlvdXQgPSBsYXlvdXQ7CisgICAgICAgIFNraW5Sb3RhdGlvbiByOworCisgICAgICAgIGZvciAociA9IFNLSU5fUk9UQVRJT05fOTA7IHIgPD0gU0tJTl9ST1RBVElPTl8yNzA7IHIrKykgeworICAgICAgICAgICAgLy8gRmluZCB0aGUgcGxhY2UgaW4gdGhlIGxpc3Qgb2YgcGFydHMgYXQgd2hpY2ggdG8gaW5zZXJ0IG5ldworICAgICAgICAgICAgLy8gcm90YXRlZCB2ZXJzaW9ucyBvZiBwYXJ0cy4KKyAgICAgICAgICAgIHdoaWxlICgqbGFzdF9wYXJ0X3B0cikgeworICAgICAgICAgICAgICAgIGxhc3RfcGFydF9wdHIgPSAmKCgqbGFzdF9wYXJ0X3B0ciktPm5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSb3RhdGUgdGhlIGxheW91dC4KKyAgICAgICAgICAgIGxheW91dC0+bmV4dCA9IHNraW5fbGF5b3V0X2NyZWF0ZV9yb3RhdGVkKAorICAgICAgICAgICAgICAgICAgICBmaXJzdF9sYXlvdXQsIGxhc3RfcGFydF9wdHIsCisgICAgICAgICAgICAgICAgICAgIChmaXJzdF9sYXlvdXQtPmRwYWRfcm90YXRpb24gKyByKSAlIDQpOworICAgICAgICAgICAgaWYgKGxheW91dC0+bmV4dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGxheW91dCBuYW1lLgorICAgICAgICAgICAgICAgIGludCBsYXlvdXRfbmFtZV9pZHggPSByIC0gU0tJTl9ST1RBVElPTl85MDsKKyAgICAgICAgICAgICAgICBpZiAobGF5b3V0X25hbWVfaWR4ID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0X25hbWVfaWR4IDwgc2l6ZW9mKGF1dG9fbGF5b3V0X25hbWVzKSAvIHNpemVvZihjb25zdCBjaGFyKikpIHsKKyAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5uZXh0LT5uYW1lID0gYXV0b19sYXlvdXRfbmFtZXNbbGF5b3V0X25hbWVfaWR4XTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsYXlvdXQgPSBsYXlvdXQtPm5leHQ7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHByaW50KCIjIyBXQVJOSU5HOiBmYWlsZWQgdG8gYXV0by1nZW5lcmF0ZSByb3RhdGVkIGxheW91dCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWxlLT5sYXlvdXRzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZpbGUtPnZlcnNpb24gPSAyOworICAgIHJldHVybiAwOworfQorCitTa2luRmlsZSogc2tpbl9maWxlX2NyZWF0ZV9mcm9tX2Fjb25maWcoY29uc3QgQUNvbmZpZyogYWNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBiYXNlcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luRnJhbWVidWZmZXJGdW5jcyogZmJfZnVuY3MpIHsKKyAgICBTa2luRmlsZSogIGZpbGU7CisKKyAgICBBTkVXMChmaWxlKTsKKworICAgIGlmIChhY29uZmlnX2ZpbmRfY29uc3QoYWNvbmZpZywgInBhcnRzIikgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2tpbl9maWxlX2xvYWRfZnJvbV92MigKKyAgICAgICAgICAgICAgICBmaWxlLCBhY29uZmlnLCBiYXNlcGF0aCwgZmJfZnVuY3MpIDwgMCkgeworICAgICAgICAgICAgZ290byBCQURfRklMRTsKKyAgICAgICAgfQorICAgICAgICBmaWxlLT52ZXJzaW9uID0gYWNvbmZpZ19pbnQoYWNvbmZpZywgInZlcnNpb24iLCAyKTsKKyAgICAgICAgLyogVGhlIGZpbGUgdmVyc2lvbiBtdXN0IGJlIDEgb3IgaGlnaGVyICovCisgICAgICAgIGlmIChmaWxlLT52ZXJzaW9uIDw9IDApIHsKKyAgICAgICAgICAgIGRwcmludCggIiMjIFdBUk5JTkc6IGludmFsaWQgc2tpbiB2ZXJzaW9uOiAlZCIsIGZpbGUtPnZlcnNpb24pOworICAgICAgICAgICAgZ290byBCQURfRklMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNraW5fZmlsZV9sb2FkX2Zyb21fdjEoCisgICAgICAgICAgICAgICAgZmlsZSwgYWNvbmZpZywgYmFzZXBhdGgsIGZiX2Z1bmNzKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gQkFEX0ZJTEU7CisgICAgICAgIH0KKyAgICAgICAgZmlsZS0+dmVyc2lvbiA9IDE7CisgICAgfQorICAgIHJldHVybiBmaWxlOworCitCQURfRklMRToKKyAgICBza2luX2ZpbGVfZnJlZSggZmlsZSApOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkCitza2luX2ZpbGVfZnJlZSggU2tpbkZpbGUqICBmaWxlICkKK3sKKyAgICBpZiAoZmlsZSkgeworICAgICAgICBTS0lOX0ZJTEVfTE9PUF9MQVlPVVRTKGZpbGUsbGF5b3V0KQorICAgICAgICAgICAgc2tpbl9sYXlvdXRfZnJlZShsYXlvdXQpOworICAgICAgICBTS0lOX0ZJTEVfTE9PUF9FTkRfTEFZT1VUUworICAgICAgICBmaWxlLT5sYXlvdXRzID0gTlVMTDsKKworICAgICAgICBTS0lOX0ZJTEVfTE9PUF9QQVJUUyhmaWxlLHBhcnQpCisgICAgICAgICAgICBza2luX3BhcnRfZnJlZShwYXJ0KTsKKyAgICAgICAgU0tJTl9GSUxFX0xPT1BfRU5EX1BBUlRTCisgICAgICAgIGZpbGUtPnBhcnRzID0gTlVMTDsKKworICAgICAgICBBRlJFRShmaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9maWxlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNmQxOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2ZpbGUuaApAQCAtMCwwICsxLDE1NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9pbWFnZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYWNvbmZpZy1maWxlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkKiAoKmNyZWF0ZV9mcmFtZWJ1ZmZlcikoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBwKTsKKworICAgIHZvaWQgKCpmcmVlX2ZyYW1lYnVmZmVyKSh2b2lkKiBmcmFtZWJ1ZmZlcik7CisKKyAgICB2b2lkKiAoKmdldF9waXhlbHMpKHZvaWQqIGZyYW1lYnVmZmVyKTsKKworICAgIGludCAoKmdldF9kZXB0aCkodm9pZCogZnJhbWVidWZmZXIpOworfSBTa2luRnJhbWVidWZmZXJGdW5jczsKKworLyoqICBMYXlvdXQKKyAqKi8KKwordHlwZWRlZiBzdHJ1Y3QgU2tpbkJhY2tncm91bmQgeworICAgIFNraW5JbWFnZSogIGltYWdlOworICAgIFNraW5SZWN0ICAgIHJlY3Q7CisgICAgY2hhciAgICAgICAgdmFsaWQ7Cit9IFNraW5CYWNrZ3JvdW5kOworCit0eXBlZGVmIHN0cnVjdCBTa2luRGlzcGxheSB7CisgICAgU2tpblJlY3QgICAgICByZWN0OyAgICAgIC8qIGRpc3BsYXkgcmVjdGFuZ2xlICAgICovCisgICAgU2tpblJvdGF0aW9uICByb3RhdGlvbjsgIC8qIGZyYW1lYnVmZmVyIHJvdGF0aW9uICovCisgICAgaW50ICAgICAgICAgICBicHA7ICAgICAgIC8qIGJpdHMgcGVyIHBpeGVsLCAzMiBvciAxNiAqLworICAgIGNoYXIgICAgICAgICAgdmFsaWQ7CisgICAgdm9pZCogICAgICAgICBmcmFtZWJ1ZmZlcjsKKyAgICBjaGFyICAgICAgICAgIG93bnNfZnJhbWVidWZmZXI7CisgICAgY29uc3QgU2tpbkZyYW1lYnVmZmVyRnVuY3MqIGZyYW1lYnVmZmVyX2Z1bmNzOworfSBTa2luRGlzcGxheTsKKwordHlwZWRlZiBzdHJ1Y3QgU2tpbkJ1dHRvbiB7CisgICAgc3RydWN0IFNraW5CdXR0b24qICBuZXh0OworICAgIGNvbnN0IGNoYXIqICAgICAgICAgbmFtZTsKKyAgICBTa2luSW1hZ2UqICAgICAgICAgIGltYWdlOworICAgIFNraW5SZWN0ICAgICAgICAgICAgcmVjdDsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIGtleWNvZGU7Cit9IFNraW5CdXR0b247CisKK3R5cGVkZWYgc3RydWN0IFNraW5QYXJ0IHsKKyAgICBzdHJ1Y3QgU2tpblBhcnQqICAgbmV4dDsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgbmFtZTsKKyAgICBTa2luQmFja2dyb3VuZCAgICAgYmFja2dyb3VuZFsxXTsKKyAgICBTa2luRGlzcGxheSAgICAgICAgZGlzcGxheVsxXTsKKyAgICBTa2luQnV0dG9uKiAgICAgICAgYnV0dG9uczsKKyAgICBTa2luUmVjdCAgICAgICAgICAgcmVjdDsgICAgLyogYm91bmRpbmcgYm94IG9mIGFsbCBwYXJ0cyAqLworfSBTa2luUGFydDsKKworI2RlZmluZSAgU0tJTl9QQVJUX0xPT1BfQlVUVE9OUyhwYXJ0LGJ1dHRvbikgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNraW5CdXR0b24qICBfX2J1dHRvbiA9IChwYXJ0KS0+YnV0dG9uczsgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoX19idXR0b24gIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFNraW5CdXR0b24qICBfX2J1dHRvbl9uZXh0ID0gX19idXR0b24tPm5leHQ7ICBcCisgICAgICAgICAgICBTa2luQnV0dG9uKiAgYnV0dG9uICAgICAgICA9IF9fYnV0dG9uOworCisjZGVmaW5lICAgU0tJTl9QQVJUX0xPT1BfRU5EICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fYnV0dG9uID0gX19idXR0b25fbmV4dDsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKK3R5cGVkZWYgc3RydWN0IFNraW5Mb2NhdGlvbiB7CisgICAgU2tpblBhcnQqICAgICAgICAgICAgIHBhcnQ7CisgICAgU2tpblBvcyAgICAgICAgICAgICAgIGFuY2hvcjsKKyAgICBTa2luUm90YXRpb24gICAgICAgICAgcm90YXRpb247CisgICAgc3RydWN0IFNraW5Mb2NhdGlvbiogIG5leHQ7Cit9IFNraW5Mb2NhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgU2tpbkxheW91dCB7CisgICAgc3RydWN0IFNraW5MYXlvdXQqICBuZXh0OworICAgIGNvbnN0IGNoYXIqICAgICAgICAgbmFtZTsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIGNvbG9yOworICAgIGludCAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGV2ZW50X2NvZGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBldmVudF92YWx1ZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgIGhhc19kcGFkX3JvdGF0aW9uOworICAgIFNraW5Sb3RhdGlvbiAgICAgICAgZHBhZF9yb3RhdGlvbjsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIGRwYWRfdXBfa2V5Y29kZTsKKyAgICBTa2luU2l6ZSAgICAgICAgICAgIHNpemU7CisgICAgU2tpbkxvY2F0aW9uKiAgICAgICBsb2NhdGlvbnM7CisgICAgU2tpbkltYWdlKiAgICAgICAgICBvbmlvbl9pbWFnZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG9uaW9uX2FscGhhOworICAgIFNraW5Sb3RhdGlvbiAgICAgICAgb25pb25fcm90YXRpb247CisgICAgU2tpblJvdGF0aW9uICAgICAgICBvcmllbnRhdGlvbjsKK30gU2tpbkxheW91dDsKKworI2RlZmluZSAgU0tJTl9MQVlPVVRfTE9PUF9MT0NTKGxheW91dCxsb2MpICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTa2luTG9jYXRpb24qICBfX2xvYyA9IChsYXlvdXQpLT5sb2NhdGlvbnM7ICAgICAgXAorICAgICAgICB3aGlsZSAoX19sb2MgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU2tpbkxvY2F0aW9uKiAgX19sb2NfbmV4dCA9IChfX2xvYyktPm5leHQ7ICAgXAorICAgICAgICAgICAgU2tpbkxvY2F0aW9uKiAgbG9jICAgICAgICA9IF9fbG9jOworCisjZGVmaW5lICBTS0lOX0xBWU9VVF9MT09QX0VORCAgIFwKKyAgICAgICAgICAgIF9fbG9jID0gX19sb2NfbmV4dDsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKK2V4dGVybiBTa2luRGlzcGxheSogICBza2luX2xheW91dF9nZXRfZGlzcGxheSggU2tpbkxheW91dCogIGxheW91dCApOworCitleHRlcm4gU2tpblJvdGF0aW9uICAgc2tpbl9sYXlvdXRfZ2V0X2RwYWRfcm90YXRpb24oIFNraW5MYXlvdXQqICBsYXlvdXQgKTsKKwordHlwZWRlZiBzdHJ1Y3QgU2tpbkZpbGUgeworICAgIGludCAgICAgICAgICAgICB2ZXJzaW9uOyAgLyogMSwgMiBvciAzICovCisgICAgU2tpblBhcnQqICAgICAgIHBhcnRzOworICAgIFNraW5MYXlvdXQqICAgICBsYXlvdXRzOworICAgIGludCAgICAgICAgICAgICBudW1fcGFydHM7CisgICAgaW50ICAgICAgICAgICAgIG51bV9sYXlvdXRzOworfSBTa2luRmlsZTsKKworI2RlZmluZSAgU0tJTl9GSUxFX0xPT1BfTEFZT1VUUyhmaWxlLGxheW91dCkgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTa2luTGF5b3V0KiAgX19sYXlvdXQgPSAoZmlsZSktPmxheW91dHM7ICAgICAgICAgXAorICAgICAgICB3aGlsZSAoX19sYXlvdXQgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU2tpbkxheW91dCogIF9fbGF5b3V0X25leHQgPSBfX2xheW91dC0+bmV4dDsgXAorICAgICAgICAgICAgU2tpbkxheW91dCogIGxheW91dCAgICAgICAgPSBfX2xheW91dDsKKworI2RlZmluZSAgU0tJTl9GSUxFX0xPT1BfRU5EX0xBWU9VVFMgICAgICAgXAorICAgICAgICAgICAgX19sYXlvdXQgPSBfX2xheW91dF9uZXh0OyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lICBTS0lOX0ZJTEVfTE9PUF9QQVJUUyhmaWxlLHBhcnQpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNraW5QYXJ0KiAgIF9fcGFydCA9IChmaWxlKS0+cGFydHM7ICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChfX3BhcnQgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTa2luUGFydCogIF9fcGFydF9uZXh0ID0gX19wYXJ0LT5uZXh0OyAgICAgICBcCisgICAgICAgICAgICBTa2luUGFydCogIHBhcnQgICAgICAgID0gX19wYXJ0OworCisjZGVmaW5lICBTS0lOX0ZJTEVfTE9PUF9FTkRfUEFSVFMgIFwKKyAgICAgICAgICAgIF9fcGFydCA9IF9fcGFydF9uZXh0OyAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKK2V4dGVybiBTa2luRmlsZSogc2tpbl9maWxlX2NyZWF0ZV9mcm9tX2Fjb25maWcoCisgICAgICAgIGNvbnN0IEFDb25maWcqIGFjb25maWcsCisgICAgICAgIGNvbnN0IGNoYXIqIGJhc2VwYXRoLAorICAgICAgICBjb25zdCBTa2luRnJhbWVidWZmZXJGdW5jcyogZmJfZnVuY3MpOworCitleHRlcm4gdm9pZCAgICAgICBza2luX2ZpbGVfZnJlZSggU2tpbkZpbGUqICBmaWxlICk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9pbWFnZS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vaW1hZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzFkOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vaW1hZ2UuYwpAQCAtMCwwICsxLDc4OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9pbWFnZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZXNvdXJjZS5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSAgREVCVUcgIDAKKworI2lmIERFQlVHCitzdGF0aWMgdm9pZCBEKGNvbnN0IGNoYXIqICBmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0ICBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKyNlbHNlCisjZGVmaW5lICBEKC4uLikgIGRve313aGlsZSgwKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKiAgICAgICAgICAgIFUgVCBJIEwgSSBUIFkgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gQ3JlYXRlIGEgcm90YXRlZCBjb3B5IG9mIGFuIGlucHV0IGltYWdlLiB8ZGF0YXwgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCisvLyBzb3VyY2UgaW1hZ2UgcGl4ZWwgYnVmZmVyLCB3aGlsZSB8d2lkdGh8IGFuZCB8aGVpZ2h0fCBhcmUgaXRzIHBpeGVsCisvLyBkaW1lbnNpb25zLiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgMzItYml0IHBpeGVsIHZhbHVlcywgYW5kIGEgcGl0Y2ggb2YKKy8vIGV4YWN0bHkgfDQgKiB3aWR0aHwgYnl0ZXMuCisvLyB8cm90YXRpb258IGlzIGEgU2tpblJvdGF0aW9uIHZhbHVlIGluZGljYXRpbmcgd2hpY2ggcm90YXRpb24gdG8gYXBwbHksCisvLyBpbiBjbG9ja3dpc2UtOTAtZGVncmVlcyBpbmNyZW1lbnRzLgorLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBvZiBhIG5ldyBwaXhlbCBidWZmZXIgY29udGFpbmluZyB0aGUgcm90YXRlZAorLy8gcGl4ZWxzIG9mIHRoZSBjb3B5Lgorc3RhdGljIHZvaWQqCityb3RhdGVfaW1hZ2Uodm9pZCogZGF0YSwKKyAgICAgICAgICAgICB1bnNpZ25lZCB3aWR0aCwKKyAgICAgICAgICAgICB1bnNpZ25lZCBoZWlnaHQsCisgICAgICAgICAgICAgU2tpblJvdGF0aW9uIHJvdGF0aW9uKSB7CisgICAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKHdpZHRoICogaGVpZ2h0ICogNCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN3aXRjaCAocm90YXRpb24gJiAzKSB7CisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8wOgorICAgICAgICAgICAgbWVtY3B5KChjaGFyKilyZXN1bHQsIChjb25zdCBjaGFyKilkYXRhLCB3aWR0aCAqIGhlaWdodCAqNCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNLSU5fUk9UQVRJT05fMjcwOiB7CisgICAgICAgICAgICB1bnNpZ25lZCogIHN0YXJ0ICAgID0gKHVuc2lnbmVkKilkYXRhOworICAgICAgICAgICAgdW5zaWduZWQqICBzcmNfbGluZSA9IHN0YXJ0ICsgKHdpZHRoIC0gMSk7CisgICAgICAgICAgICB1bnNpZ25lZCogIGRzdF9saW5lID0gKHVuc2lnbmVkKilyZXN1bHQ7CisgICAgICAgICAgICB1bnNpZ25lZCAgIGhoOworCisgICAgICAgICAgICBmb3IgKGhoID0gd2lkdGg7IGhoID4gMDsgaGgtLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCogIHNyYyAgID0gc3JjX2xpbmU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQqICBkc3QgICA9IGRzdF9saW5lOworICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgY291bnQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSApIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgICAgICBkc3QgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgc3JjICs9IHdpZHRoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNyY19saW5lIC09IDE7CisgICAgICAgICAgICAgICAgZHN0X2xpbmUgKz0gaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNLSU5fUk9UQVRJT05fMTgwOiB7CisgICAgICAgICAgICB1bnNpZ25lZCogIHN0YXJ0ICAgID0gKHVuc2lnbmVkKilkYXRhOworICAgICAgICAgICAgdW5zaWduZWQqICBzcmNfbGluZSA9IHN0YXJ0ICsgd2lkdGggKiAoaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICB1bnNpZ25lZCogIGRzdF9saW5lID0gKHVuc2lnbmVkKilyZXN1bHQ7CisgICAgICAgICAgICB1bnNpZ25lZCAgIGhoOworCisgICAgICAgICAgICBmb3IgKGhoID0gaGVpZ2h0OyBoaCA+IDA7IGhoLS0pIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCogIHNyYyA9IHNyY19saW5lICsgKHdpZHRoIC0gMSk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQqICBkc3QgPSBkc3RfbGluZTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChzcmMgPj0gc3JjX2xpbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKnNyYy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3RfbGluZSArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBzcmNfbGluZSAtPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzkwOiB7CisgICAgICAgICAgICB1bnNpZ25lZCogIHN0YXJ0ICAgID0gKHVuc2lnbmVkKilkYXRhOworICAgICAgICAgICAgdW5zaWduZWQqICBzcmNfbGluZSA9IHN0YXJ0ICsgd2lkdGggKiAoaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICB1bnNpZ25lZCogIGRzdF9saW5lID0gKHVuc2lnbmVkKilyZXN1bHQ7CisgICAgICAgICAgICB1bnNpZ25lZCAgIGhoOworCisgICAgICAgICAgICBmb3IgKGhoID0gd2lkdGg7IGhoID4gMDsgaGgtLSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkKiAgc3JjID0gc3JjX2xpbmU7CisgICAgICAgICAgICAgICAgdW5zaWduZWQqICBkc3QgPSBkc3RfbGluZTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCAgIGNvdW50OworCisgICAgICAgICAgICAgICAgZm9yIChjb3VudCA9IGhlaWdodDsgY291bnQgPiAwOyBjb3VudC0tKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICAgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgc3JjICAgLT0gd2lkdGg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZHN0X2xpbmUgKz0gaGVpZ2h0OworICAgICAgICAgICAgICAgIHNyY19saW5lICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvLyBDb21wdXRlIHRoZSBibGVuZGVkIChhbHBoYS1hdHRlbnVhdGVkKSBwaXhlbHMgb2YgYSBnaXZlbiBzb3VyY2UgaW1hZ2UuCisvLyB8ZHN0X3BpeGVsc3wgYW5kIHxzcmNfcGl4ZWxzfCBhcmUgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc3RpbmF0aW9uIGFuZAorLy8gc291cmNlIHBpeGVsIGJ1ZmZlcnMsIHJlc3BlY3RpdmVseS4gfHd8IGFuZCB8aHwgYXJlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0CisvLyBvZiBib3RoIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2VzLiB8YWxwaGF8IGlzIGFuIGF0dGVudWF0aW9uIGZhY3Rvci4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgMzItYml0IEFSR0Igb3IgQkdSQSBwaXhlbHMsIGFuZCBhIHBpdGNoIG9mIGV4YWN0bHkKKy8vIHw0ICogd3wgZm9yIGJvdGggYnVmZmVycy4gRm9yIGVhY2ggcGl4ZWwsIGl0IHdpbGwgY29tcHV0ZToKKy8vCisvLyAgICAgICAgZHN0X3BpeGVsc1tuXS5SID0gKHNyY19waXhlbHNbbl0uUiAqIGFscGhhKSA+PiA4OworLy8gICAgICAgIGRzdF9waXhlbHNbbl0uRyA9IChzcmNfcGl4ZWxzW25dLkcgKiBhbHBoYSkgPj4gODsKKy8vICAgICAgICBkc3RfcGl4ZWxzW25dLkIgPSAoc3JjX3BpeGVsc1tuXS5CICogYWxwaGEpID4+IDg7CisvLyAgICAgICAgZHN0X3BpeGVsc1tuXS5BID0gKHNyY19waXhlbHNbbl0uQSAqIGFscGhhKSA+PiA4OworLy8KK3N0YXRpYyB2b2lkCitibGVuZF9pbWFnZSh1bnNpZ25lZCogIGRzdF9waXhlbHMsCisgICAgICAgICAgICB1bnNpZ25lZCogIHNyY19waXhlbHMsCisgICAgICAgICAgICB1bnNpZ25lZCAgIHcsCisgICAgICAgICAgICB1bnNpZ25lZCAgIGgsCisgICAgICAgICAgICBpbnQgICAgICAgIGFscGhhKSB7CisgICAgdW5zaWduZWQqICBkc3QgICAgID0gZHN0X3BpeGVsczsKKyAgICB1bnNpZ25lZCogIGRzdF9lbmQgPSBkc3QgKyB3ICogaDsKKyAgICB1bnNpZ25lZCogIHNyYyAgICAgPSBzcmNfcGl4ZWxzOworCisgICAgZm9yICggOyBkc3QgPCBkc3RfZW5kOyBkc3QrKywgc3JjKysgKSB7CisgICAgICAgIHVuc2lnbmVkICBhZyA9IChzcmNbMF0gPj4gOCkgJiAweGZmMDBmZjsKKyAgICAgICAgdW5zaWduZWQgIHJiID0gIHNyY1swXSAgICAgICAmIDB4ZmYwMGZmOworCisgICAgICAgIGFnID0gKGFnICogYWxwaGEpICYgMHhmZjAwZmYwMDsKKyAgICAgICAgcmIgPSAoKHJiICogYWxwaGEpID4+IDgpICYgMHgwMGZmMDBmZjsKKworICAgICAgICBkc3RbMF0gPSBhZyB8IHJiOworICAgIH0KK30KKworCitzdGF0aWMgdW5zaWduZWQKK3NraW5faW1hZ2VfZGVzY19oYXNoKGNvbnN0IFNraW5JbWFnZURlc2MqIGRlc2MpIHsKKyAgICB1bnNpZ25lZCAgaCA9IDA7CisgICAgaW50ICAgICAgIG47CisKKyAgICBmb3IgKG4gPSAwOyBkZXNjLT5wYXRoW25dICE9IDA7IG4rKykgeworICAgICAgICBpbnQgIGMgPSBkZXNjLT5wYXRoW25dOworICAgICAgICBoID0gaCAqIDMzICsgYzsKKyAgICB9CisgICAgaCArPSBkZXNjLT5yb3RhdGlvbiAqIDE1NzM7CisgICAgaCArPSBkZXNjLT5ibGVuZCAqIDc7CisKKyAgICByZXR1cm4gIGg7Cit9CisKKworc3RhdGljIGludAorc2tpbl9pbWFnZV9kZXNjX2VxdWFsKGNvbnN0IFNraW5JbWFnZURlc2MqIGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpbkltYWdlRGVzYyogYikKK3sKKyAgICByZXR1cm4gKGEtPnJvdGF0aW9uID09IGItPnJvdGF0aW9uICYmCisgICAgICAgICAgICBhLT5ibGVuZCAgICA9PSBiLT5ibGVuZCAgICAmJgorICAgICAgICAgICAgIXN0cmNtcChhLT5wYXRoLCBiLT5wYXRoKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKiAgICAgICAgICAgIFMgSyBJIE4gICBJIE0gQSBHIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSB7CisgICAgU0tJTl9JTUFHRV9DTE9ORSA9ICgxIDw8IDApICAgLyogdGhpcyBpbWFnZSBpcyBhIGNsb25lICovCit9OworCitzdHJ1Y3QgU2tpbkltYWdlIHsKKyAgICB1bnNpZ25lZCAgICAgICAgIGhhc2g7CisgICAgU2tpbkltYWdlKiAgICAgICBsaW5rOworICAgIGludCAgICAgICAgICAgICAgcmVmX2NvdW50OworICAgIFNraW5JbWFnZSogICAgICAgbmV4dDsKKyAgICBTa2luSW1hZ2UqICAgICAgIHByZXY7CisgICAgU2tpblN1cmZhY2UqICAgICBzdXJmYWNlOworICAgIHVuc2lnbmVkICAgICAgICAgZmxhZ3M7CisgICAgdW5zaWduZWQgICAgICAgICB3LCBoOworICAgIHZvaWQqICAgICAgICAgICAgcGl4ZWxzOyAgLyogMzItYml0IEFSR0IgKi8KKyAgICBTa2luSW1hZ2VEZXNjICAgIGRlc2M7Cit9OworCisKK3N0YXRpYyBjb25zdCBTa2luSW1hZ2UgX25vX2ltYWdlWzFdID0geworICAgIHsKKyAgICAgICAgLmhhc2ggPSAwLAorICAgICAgICAubGluayA9IE5VTEwsCisgICAgICAgIC5yZWZfY291bnQgPSAwLAorICAgICAgICAubmV4dCA9IE5VTEwsCisgICAgICAgIC5wcmV2ID0gTlVMTCwKKyAgICAgICAgLnN1cmZhY2UgPSBOVUxMLAorICAgICAgICAuZmxhZ3MgPSAwLAorICAgICAgICAudyA9IDAsCisgICAgICAgIC5oID0gMCwKKyAgICAgICAgLnBpeGVscyA9IE5VTEwsCisgICAgICAgIC5kZXNjID0gKFNraW5JbWFnZURlc2MpeworICAgICAgICAgICAgLnBhdGggPSAiPG5vbmU+IiwKKyAgICAgICAgICAgIC5yb3RhdGlvbiA9IFNLSU5fUk9UQVRJT05fMCwKKyAgICAgICAgICAgIC5ibGVuZCA9IDAsCisgICAgICAgIH0KKyAgICB9Cit9OworCitTa2luSW1hZ2UqIFNLSU5fSU1BR0VfTk9ORSA9IChTa2luSW1hZ2UqKSZfbm9faW1hZ2U7CisKK3N0YXRpYyB2b2lkCitza2luX2ltYWdlX2ZyZWUoIFNraW5JbWFnZSogIGltYWdlICkKK3sKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UgIT0gX25vX2ltYWdlKQorICAgIHsKKyAgICAgICAgc2tpbl9zdXJmYWNlX3VucmVmcCgmaW1hZ2UtPnN1cmZhY2UpOworCisgICAgICAgIGlmIChpbWFnZS0+cGl4ZWxzKSB7CisgICAgICAgICAgICBmcmVlKCBpbWFnZS0+cGl4ZWxzICk7CisgICAgICAgICAgICBpbWFnZS0+cGl4ZWxzID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGZyZWUoaW1hZ2UpOworICAgIH0KK30KKworCitzdGF0aWMgU2tpbkltYWdlKgorc2tpbl9pbWFnZV9hbGxvYyggU2tpbkltYWdlRGVzYyogIGRlc2MsIHVuc2lnbmVkICBoYXNoICkKK3sKKyAgICBpbnQgICAgICAgICBsZW4gICA9IHN0cmxlbihkZXNjLT5wYXRoKTsKKyAgICBTa2luSW1hZ2UqICBpbWFnZSA9IGNhbGxvYygxLCBzaXplb2YoKmltYWdlKSArIGxlbiArIDEpOworCisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIGltYWdlLT5kZXNjID0gZGVzY1swXTsKKyAgICAgICAgaW1hZ2UtPmRlc2MucGF0aCA9IChjb25zdCBjaGFyKikoaW1hZ2UgKyAxKTsKKyAgICAgICAgbWVtY3B5KCAoY2hhciopaW1hZ2UtPmRlc2MucGF0aCwgZGVzYy0+cGF0aCwgbGVuICk7CisgICAgICAgICgoY2hhciopaW1hZ2UtPmRlc2MucGF0aClbbGVuXSA9IDA7CisKKyAgICAgICAgaW1hZ2UtPmhhc2ggICAgICA9IGhhc2g7CisgICAgICAgIGltYWdlLT5uZXh0ICAgICAgPSBpbWFnZS0+cHJldiA9IGltYWdlOworICAgICAgICBpbWFnZS0+cmVmX2NvdW50ID0gMTsKKyAgICB9CisgICAgcmV0dXJuIGltYWdlOworfQorCisKK2V4dGVybiB2b2lkICpsb2FkcG5nKGNvbnN0IGNoYXIgKmZuLCB1bnNpZ25lZCAqX3dpZHRoLCB1bnNpZ25lZCAqX2hlaWdodCk7CitleHRlcm4gdm9pZCAqcmVhZHBuZyhjb25zdCB1bnNpZ25lZCBjaGFyKiAgYmFzZSwgc2l6ZV90ICBzaXplLCB1bnNpZ25lZCAqX3dpZHRoLCB1bnNpZ25lZCAqX2hlaWdodCk7CisKK2V4dGVybiB2b2lkICpsb2FkV2ViUChjb25zdCBjaGFyICpmaWxlTmFtZSwgdW5zaWduZWQgKnBXaWR0aCwgdW5zaWduZWQgKnBIZWlnaHQpOworZXh0ZXJuIHZvaWQgKnJlYWRXZWJQKGNvbnN0IHVuc2lnbmVkIGNoYXIqICBiYXNlLCBzaXplX3QgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKnBXaWR0aCwgdW5zaWduZWQgKnBIZWlnaHQpOworCitzdGF0aWMgaW50Citza2luX2ltYWdlX2xvYWQoIFNraW5JbWFnZSogIGltYWdlICkKK3sKKyAgICB2b2lkKiAgICAgZGF0YTsKKyAgICB1bnNpZ25lZCAgdywgaDsKKyAgICBjb25zdCBjaGFyKiAgcGF0aCA9IGltYWdlLT5kZXNjLnBhdGg7CisKKyAgICBpZiAocGF0aFswXSA9PSAnOicpIHsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgIHNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBiYXNlOworCisgICAgICAgIGlmIChwYXRoWzFdID09ICcvJyB8fCBwYXRoWzFdID09ICdcXCcpCisgICAgICAgICAgICBwYXRoICs9IDE7CisKKyAgICAgICAgYmFzZSA9IHNraW5fcmVzb3VyY2VfZmluZCggcGF0aCsxLCAmc2l6ZSApOworICAgICAgICBpZiAoYmFzZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBsb2NhdGUgYnVpbHQtaW4gaW1hZ2UgZmlsZSAnJXMnXG4iLCBwYXRoICk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBkYXRhID0gcmVhZHBuZyhiYXNlLCBzaXplLCAmdywgJmgpOworICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhID0gcmVhZFdlYlAoYmFzZSwgc2l6ZSwgJncsICZoKTsKKyAgICAgICAgICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBsb2FkIGJ1aWx0LWluIGltYWdlIGZpbGUgJyVzJ1xuIiwgcGF0aCApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGEgPSBsb2FkcG5nKHBhdGgsICZ3LCAmaCk7CisgICAgICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEgPSBsb2FkV2ViUChwYXRoLCAmdywgJmgpOworICAgICAgICAgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGxvYWQgaW1hZ2UgZmlsZSAnJXMnXG4iLCBwYXRoICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAvKiBUaGUgZGF0YSBpcyBsb2FkZWQgaW50byBtZW1vcnkgYXMgUkdCQSBieXRlcy4gV2Ugd2FudCB0byBtYW5hZ2UgdGhlIHZhbHVlcworICAgICogYXMgMzItYml0IEFSR0IgcGl4ZWxzLCBzbyBzd2FwIHRoZSBieXRlcyBhY2NvcmRpbmdseSwgZGVwZW5kaW5nIG9uIG91ciBDUFUKKyAgICAqIGVuZGlhbmVzcy4KKyAgICAqLworICAgIHsKKyAgICAgICAgdW5zaWduZWQqICBkICAgICA9IGRhdGE7CisgICAgICAgIHVuc2lnbmVkKiAgZF9lbmQgPSBkICsgdypoOworCisgICAgICAgIGZvciAoIDsgZCA8IGRfZW5kOyBkKysgKSB7CisgICAgICAgICAgICB1bnNpZ25lZCAgcGl4ID0gZFswXTsKKyNpZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICAgICAgLyogUixHLEIsQSByZWFkIGFzIFJHQkEgPT4gQVJHQiAqLworICAgICAgICAgICAgcGl4ID0gKChwaXggPj4gOCkgJiAweGZmZmZmZikgfCAocGl4IDw8IDI0KTsKKyNlbHNlCisgICAgICAgICAgICAvKiBSLEcsQixBIHJlYWQgYXMgQUJHUiA9PiBBUkdCICovCisgICAgICAgICAgICBwaXggPSAocGl4ICYgMHhmZjAwZmYwMCkgfCAoKHBpeCA+PiAxNikgJiAweGZmKSB8ICgocGl4ICYgMHhmZikgPDwgMTYpOworI2VuZGlmCisgICAgICAgICAgICBkWzBdID0gcGl4OworICAgICAgICB9CisgICAgfQorCisgICAgaW1hZ2UtPnBpeGVscyA9IGRhdGE7CisgICAgaW1hZ2UtPncgICAgICA9IHc7CisgICAgaW1hZ2UtPmggICAgICA9IGg7CisKKyAgICBpbWFnZS0+c3VyZmFjZSA9IHNraW5fc3VyZmFjZV9jcmVhdGVfYXJnYjMyX2Zyb20odywgaCwgdyAqIDQsIGltYWdlLT5waXhlbHMpOworICAgIGlmIChpbWFnZS0+c3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGNyZWF0ZSBza2luIHN1cmZhY2UgZm9yICclcycgaW1hZ2VcbiIsIHBhdGgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qIHNpbXBsZSBoYXNoIHRhYmxlIGZvciBpbWFnZXMgKi8KKworI2RlZmluZSAgTlVNX0JVQ0tFVFMgIDY0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTa2luSW1hZ2UqICAgICBidWNrZXRzWyBOVU1fQlVDS0VUUyBdOworICAgIFNraW5JbWFnZSAgICAgIG1ydV9oZWFkOworICAgIGludCAgICAgICAgICAgIG51bV9pbWFnZXM7CisgICAgdW5zaWduZWQgbG9uZyAgdG90YWxfcGl4ZWxzOworICAgIHVuc2lnbmVkIGxvbmcgIG1heF9waXhlbHM7CisgICAgdW5zaWduZWQgbG9uZyAgdG90YWxfaW1hZ2VzOworfSBTa2luSW1hZ2VDYWNoZTsKKworCitzdGF0aWMgdm9pZAorc2tpbl9pbWFnZV9jYWNoZV9pbml0KCBTa2luSW1hZ2VDYWNoZSogIGNhY2hlICkKK3sKKyAgICBtZW1zZXQoY2FjaGUsIDAsIHNpemVvZigqY2FjaGUpKTsKKyNpZiBERUJVRworICAgIGNhY2hlLT5tYXhfcGl4ZWxzID0gMTsKKyNlbHNlCisgICAgY2FjaGUtPm1heF9waXhlbHMgPSA0KjEwMjQqMTAyNDsgIC8qIGxpbWl0IGltYWdlIGNhY2hlIHRvIDQgTUIgKi8KKyNlbmRpZgorICAgIGNhY2hlLT5tcnVfaGVhZC5uZXh0ID0gY2FjaGUtPm1ydV9oZWFkLnByZXYgPSAmY2FjaGUtPm1ydV9oZWFkOworfQorCisKK3N0YXRpYyB2b2lkCitza2luX2ltYWdlX2NhY2hlX3JlbW92ZSggU2tpbkltYWdlQ2FjaGUqICBjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTa2luSW1hZ2UqICAgICAgIGltYWdlICkKK3sKKyAgICAvKiByZW1vdmUgZnJvbSBoYXNoIHRhYmxlICovCisgICAgU2tpbkltYWdlKiogIHBub2RlID0gY2FjaGUtPmJ1Y2tldHMgKyAoaW1hZ2UtPmhhc2ggJiAoTlVNX0JVQ0tFVFMtMSkpOworICAgIFNraW5JbWFnZSogICBub2RlOworCisgICAgZm9yICg7OykgeworICAgICAgICBub2RlID0gKnBub2RlOworICAgICAgICBhc3NlcnQobm9kZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgIC8qIHNob3VsZCBub3QgaGFwcGVuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG5vZGUgPT0gaW1hZ2UpIHsKKyAgICAgICAgICAgICpwbm9kZSA9IG5vZGUtPmxpbms7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwbm9kZSA9ICZub2RlLT5saW5rOworICAgIH0KKworICAgIEQoICJza2luX2ltYWdlX2NhY2hlOiByZW1vdmUgJyVzJyAocm90PSVkKSwgJWQgcGl4ZWxzXG4iLAorICAgICAgIG5vZGUtPmRlc2MucGF0aCwgbm9kZS0+ZGVzYy5yb3RhdGlvbiwgbm9kZS0+dypub2RlLT5oICk7CisKKyAgICAvKiByZW1vdmUgZnJvbSBtcnUgbGlzdCAqLworICAgIGltYWdlLT5wcmV2LT5uZXh0ID0gaW1hZ2UtPm5leHQ7CisgICAgaW1hZ2UtPm5leHQtPnByZXYgPSBpbWFnZS0+cHJldjsKKworICAgIGNhY2hlLT50b3RhbF9waXhlbHMgLT0gaW1hZ2UtPncqaW1hZ2UtPmg7CisgICAgY2FjaGUtPnRvdGFsX2ltYWdlcyAtPSAxOworfQorCisKK3N0YXRpYyBTa2luSW1hZ2UqCitza2luX2ltYWdlX2NhY2hlX3JhaXNlKCBTa2luSW1hZ2VDYWNoZSogIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgU2tpbkltYWdlKiAgICAgICBpbWFnZSApCit7CisgICAgaWYgKGltYWdlICE9IGNhY2hlLT5tcnVfaGVhZC5uZXh0KSB7CisgICAgICAgIFNraW5JbWFnZSogIHByZXYgPSBpbWFnZS0+cHJldjsKKyAgICAgICAgU2tpbkltYWdlKiAgbmV4dCA9IGltYWdlLT5uZXh0OworCisgICAgICAgIC8qIHJlbW92ZSBmcm9tIG1ydSBsaXN0ICovCisgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OworICAgICAgICBuZXh0LT5wcmV2ID0gcHJldjsKKworICAgICAgICAvKiBhZGQgdG8gdG9wICovCisgICAgICAgIGltYWdlLT5wcmV2ID0gJmNhY2hlLT5tcnVfaGVhZDsKKyAgICAgICAgaW1hZ2UtPm5leHQgPSBpbWFnZS0+cHJldi0+bmV4dDsKKyAgICAgICAgaW1hZ2UtPnByZXYtPm5leHQgPSBpbWFnZTsKKyAgICAgICAgaW1hZ2UtPm5leHQtPnByZXYgPSBpbWFnZTsKKyAgICB9CisgICAgcmV0dXJuIGltYWdlOworfQorCisKK3N0YXRpYyB2b2lkCitza2luX2ltYWdlX2NhY2hlX2ZsdXNoKCBTa2luSW1hZ2VDYWNoZSogIGNhY2hlICkKK3sKKyAgICBTa2luSW1hZ2UqICAgICBpbWFnZSA9IGNhY2hlLT5tcnVfaGVhZC5wcmV2OworICAgIGludCAgICAgICAgICAgIGNvdW50ID0gMDsKKworICAgIEQoInNraW5faW1hZ2VfY2FjaGVfZmx1c2g6IHN0YXJ0aW5nXG4iKTsKKyAgICB3aGlsZSAoY2FjaGUtPnRvdGFsX3BpeGVscyA+IGNhY2hlLT5tYXhfcGl4ZWxzICYmCisgICAgICAgICAgIGltYWdlICE9ICZjYWNoZS0+bXJ1X2hlYWQpCisgICAgeworICAgICAgICBTa2luSW1hZ2UqICBwcmV2ID0gaW1hZ2UtPnByZXY7CisKKyAgICAgICAgaWYgKGltYWdlLT5yZWZfY291bnQgPT0gMCkgeworICAgICAgICAgICAgc2tpbl9pbWFnZV9jYWNoZV9yZW1vdmUoY2FjaGUsIGltYWdlKTsKKyAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgaW1hZ2UgPSBwcmV2OworICAgIH0KKyAgICBEKCJza2luX2ltYWdlX2NhY2hlX2ZsdXNoOiBmaW5pc2hlZCwgJWQgaW1hZ2VzIGZsdXNoZWRcbiIsIGNvdW50KTsKK30KKworCitzdGF0aWMgU2tpbkltYWdlKioKK3NraW5faW1hZ2VfbG9va3VwX3AoIFNraW5JbWFnZUNhY2hlKiAgIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgU2tpbkltYWdlRGVzYyogICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICAgICAgKnBoYXNoICkKK3sKKyAgICB1bnNpZ25lZCAgICAgaCAgICAgPSBza2luX2ltYWdlX2Rlc2NfaGFzaChkZXNjKTsKKyAgICB1bnNpZ25lZCAgICAgaW5kZXggPSBoICYgKE5VTV9CVUNLRVRTLTEpOworICAgIFNraW5JbWFnZSoqICBwbm9kZSA9ICZjYWNoZS0+YnVja2V0c1tpbmRleF07CisgICAgZm9yICg7OykgeworICAgICAgICBTa2luSW1hZ2UqICBub2RlID0gKnBub2RlOworICAgICAgICBpZiAobm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChub2RlLT5oYXNoID09IGggJiYgc2tpbl9pbWFnZV9kZXNjX2VxdWFsKGRlc2MsICZub2RlLT5kZXNjKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwbm9kZSA9ICZub2RlLT5saW5rOworICAgIH0KKyAgICAqcGhhc2ggPSBoOworICAgIHJldHVybiAgcG5vZGU7Cit9CisKKworc3RhdGljIFNraW5JbWFnZSoKK3NraW5faW1hZ2VfY3JlYXRlKCBTa2luSW1hZ2VEZXNjKiAgZGVzYywgdW5zaWduZWQgIGhhc2ggKQoreworICAgIFNraW5JbWFnZSogIG5vZGU7CisKKyAgICBub2RlID0gc2tpbl9pbWFnZV9hbGxvYyggZGVzYywgaGFzaCApOworICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgIHJldHVybiBTS0lOX0lNQUdFX05PTkU7CisKKyAgICBpZiAoZGVzYy0+cm90YXRpb24gPT0gU0tJTl9ST1RBVElPTl8wICYmCisgICAgICAgIGRlc2MtPmJsZW5kICAgID09IFNLSU5fQkxFTkRfRlVMTCkKKyAgICB7CisgICAgICAgIGlmIChza2luX2ltYWdlX2xvYWQobm9kZSkgPCAwKSB7CisgICAgICAgICAgICBza2luX2ltYWdlX2ZyZWUobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gU0tJTl9JTUFHRV9OT05FOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFNraW5JbWFnZURlc2MgIGRlc2MwID0gZGVzY1swXTsKKyAgICAgICAgU2tpbkltYWdlKiAgICAgcGFyZW50OworCisgICAgICAgIGRlc2MwLnJvdGF0aW9uID0gU0tJTl9ST1RBVElPTl8wOworICAgICAgICBkZXNjMC5ibGVuZCAgICA9IFNLSU5fQkxFTkRfRlVMTDsKKworICAgICAgICBwYXJlbnQgPSBza2luX2ltYWdlX2ZpbmQoICZkZXNjMCApOworICAgICAgICBpZiAocGFyZW50ID09IFNLSU5fSU1BR0VfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBTS0lOX0lNQUdFX05PTkU7CisKKyAgICAgICAgaWYgKGRlc2MtPnJvdGF0aW9uID09IFNLSU5fUk9UQVRJT05fOTAgfHwKKyAgICAgICAgICAgIGRlc2MtPnJvdGF0aW9uID09IFNLSU5fUk9UQVRJT05fMjcwKQorICAgICAgICB7CisgICAgICAgICAgICBub2RlLT53ID0gcGFyZW50LT5oOworICAgICAgICAgICAgbm9kZS0+aCA9IHBhcmVudC0+dzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5vZGUtPncgPSBwYXJlbnQtPnc7CisgICAgICAgICAgICBub2RlLT5oID0gcGFyZW50LT5oOworICAgICAgICB9CisKKyAgICAgICAgbm9kZS0+cGl4ZWxzID0gcm90YXRlX2ltYWdlKHBhcmVudC0+cGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+cm90YXRpb24pOworCisgICAgICAgIHNraW5faW1hZ2VfdW5yZWYoJnBhcmVudCk7CisKKyAgICAgICAgaWYgKG5vZGUtPnBpeGVscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBza2luX2ltYWdlX2ZyZWUobm9kZSk7CisgICAgICAgICAgICByZXR1cm4gU0tJTl9JTUFHRV9OT05FOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MtPmJsZW5kICE9IFNLSU5fQkxFTkRfRlVMTCkgeworICAgICAgICAgICAgYmxlbmRfaW1hZ2Uobm9kZS0+cGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+cGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmgsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5ibGVuZCk7CisgICAgICAgIH0KKworICAgICAgICBub2RlLT5zdXJmYWNlID0gc2tpbl9zdXJmYWNlX2NyZWF0ZV9hcmdiMzJfZnJvbShub2RlLT53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT53ICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+cGl4ZWxzKTsKKyAgICAgICAgaWYgKG5vZGUtPnN1cmZhY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgc2tpbl9pbWFnZV9mcmVlKG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIFNLSU5fSU1BR0VfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbm9kZTsKK30KKworCitzdGF0aWMgU2tpbkltYWdlQ2FjaGUgICBfaW1hZ2VfY2FjaGVbMV07CitzdGF0aWMgaW50ICAgICAgICAgICAgICBfaW1hZ2VfY2FjaGVfaW5pdDsKKworU2tpbkltYWdlKgorc2tpbl9pbWFnZV9maW5kKCBTa2luSW1hZ2VEZXNjKiAgZGVzYyApCit7CisgICAgU2tpbkltYWdlQ2FjaGUqICBjYWNoZSA9IF9pbWFnZV9jYWNoZTsKKyAgICB1bnNpZ25lZCAgICAgICAgIGhhc2g7CisgICAgU2tpbkltYWdlKiogICAgICBwbm9kZSA9IHNraW5faW1hZ2VfbG9va3VwX3AoIGNhY2hlLCBkZXNjLCAmaGFzaCApOworICAgIFNraW5JbWFnZSogICAgICAgbm9kZSAgPSAqcG5vZGU7CisKKyAgICBpZiAoIV9pbWFnZV9jYWNoZV9pbml0KSB7CisgICAgICAgIF9pbWFnZV9jYWNoZV9pbml0ID0gMTsKKyAgICAgICAgc2tpbl9pbWFnZV9jYWNoZV9pbml0KGNhY2hlKTsKKyAgICB9CisKKyAgICBpZiAobm9kZSkgeworICAgICAgICBub2RlLT5yZWZfY291bnQgKz0gMTsKKyAgICAgICAgcmV0dXJuIHNraW5faW1hZ2VfY2FjaGVfcmFpc2UoIGNhY2hlLCBub2RlICk7CisgICAgfQorICAgIG5vZGUgPSBza2luX2ltYWdlX2NyZWF0ZSggZGVzYywgaGFzaCApOworICAgIGlmIChub2RlID09IFNLSU5fSU1BR0VfTk9ORSkKKyAgICAgICAgcmV0dXJuIG5vZGU7CisKKyAgICAvKiBhZGQgdG8gaGFzaCB0YWJsZSAqLworICAgIG5vZGUtPmxpbmsgPSAqcG5vZGU7CisgICAgKnBub2RlICAgICA9IG5vZGU7CisKKyAgICAvKiBhZGQgdG8gbXJ1IGxpc3QgKi8KKyAgICBza2luX2ltYWdlX2NhY2hlX3JhaXNlKCBjYWNoZSwgbm9kZSApOworCisgICAgRCggInNraW5faW1hZ2VfY2FjaGU6IGFkZCAnJXMnIChyb3Q9JWQpLCAlZCBwaXhlbHNcbiIsCisgICAgICAgbm9kZS0+ZGVzYy5wYXRoLCBub2RlLT5kZXNjLnJvdGF0aW9uLCBub2RlLT53Km5vZGUtPmggKTsKKworICAgIGNhY2hlLT50b3RhbF9waXhlbHMgKz0gbm9kZS0+dypub2RlLT5oOworICAgIGlmIChjYWNoZS0+dG90YWxfcGl4ZWxzID4gY2FjaGUtPm1heF9waXhlbHMpCisgICAgICAgIHNraW5faW1hZ2VfY2FjaGVfZmx1c2goIGNhY2hlICk7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworCitTa2luSW1hZ2UqCitza2luX2ltYWdlX2ZpbmRfc2ltcGxlKCBjb25zdCBjaGFyKiAgcGF0aCApCit7CisgICAgU2tpbkltYWdlRGVzYyAgZGVzYzsKKworICAgIGRlc2MucGF0aCAgICAgPSBwYXRoOworICAgIGRlc2Mucm90YXRpb24gPSBTS0lOX1JPVEFUSU9OXzA7CisgICAgZGVzYy5ibGVuZCAgICA9IFNLSU5fQkxFTkRfRlVMTDsKKworICAgIHJldHVybiBza2luX2ltYWdlX2ZpbmQoICZkZXNjICk7Cit9CisKKworU2tpbkltYWdlKgorc2tpbl9pbWFnZV9yZWYoIFNraW5JbWFnZSogIGltYWdlICkKK3sKKyAgICBpZiAoaW1hZ2UgJiYgaW1hZ2UgIT0gX25vX2ltYWdlKQorICAgICAgICBpbWFnZS0+cmVmX2NvdW50ICs9IDE7CisKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKKwordm9pZAorc2tpbl9pbWFnZV91bnJlZiggU2tpbkltYWdlKiogIHBpbWFnZSApCit7CisgICAgU2tpbkltYWdlKiAgaW1hZ2UgPSAqcGltYWdlOworCisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIGlmIChpbWFnZSAhPSBfbm9faW1hZ2UgJiYgLS1pbWFnZS0+cmVmX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgIHNraW5faW1hZ2VfZnJlZShpbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgKnBpbWFnZSA9IE5VTEw7CisgICAgfQorfQorCisKK1NraW5JbWFnZSoKK3NraW5faW1hZ2Vfcm90YXRlKCBTa2luSW1hZ2UqICBzb3VyY2UsIFNraW5Sb3RhdGlvbiAgcm90YXRpb24gKQoreworICAgIFNraW5JbWFnZURlc2MgIGRlc2M7CisgICAgU2tpbkltYWdlKiAgICAgaW1hZ2U7CisKKyAgICBpZiAoc291cmNlID09IF9ub19pbWFnZSB8fCBzb3VyY2UtPmRlc2Mucm90YXRpb24gPT0gcm90YXRpb24pIHsKKyAgICAgICAgcmV0dXJuIHNraW5faW1hZ2VfcmVmKHNvdXJjZSk7CisgICAgfQorCisgICAgZGVzYyAgICAgICAgICA9IHNvdXJjZS0+ZGVzYzsKKyAgICBkZXNjLnJvdGF0aW9uID0gcm90YXRpb247CisgICAgaW1hZ2UgICAgICAgICA9IHNraW5faW1hZ2VfZmluZCggJmRlc2MgKTsKKyAgICBza2luX2ltYWdlX3VucmVmKCAmc291cmNlICk7CisgICAgcmV0dXJuIGltYWdlOworfQorCitTa2luSW1hZ2UqCitza2luX2ltYWdlX2Nsb25lX3JvdGF0ZWQoIFNraW5JbWFnZSogc291cmNlLCBTa2luUm90YXRpb24gYnkgKSB7CisgICAgU2tpbkltYWdlKiAgIGltYWdlOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZSA9PSBfbm9faW1hZ2UpCisgICAgICAgIHJldHVybiBTS0lOX0lNQUdFX05PTkU7CisKKyAgICBpbWFnZSA9IGNhbGxvYygxLCBzaXplb2YoKmltYWdlKSk7CisgICAgaWYgKGltYWdlID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIGltYWdlLT5yZWZfY291bnQgPSAxOworICAgIGltYWdlLT5kZXNjICA9IHNvdXJjZS0+ZGVzYzsKKyAgICBpbWFnZS0+ZGVzYy5yb3RhdGlvbiA9IFNLSU5fUk9UQVRJT05fMDsKKyAgICBpbWFnZS0+aGFzaCAgPSBzb3VyY2UtPmhhc2g7CisgICAgaW1hZ2UtPmZsYWdzID0gU0tJTl9JTUFHRV9DTE9ORTsKKyAgICBpZiAoYnkgPT0gU0tJTl9ST1RBVElPTl85MCB8fCBieSA9PSBTS0lOX1JPVEFUSU9OXzI3MCkgeworICAgICAgICBpbWFnZS0+dyAgICAgPSBzb3VyY2UtPmg7CisgICAgICAgIGltYWdlLT5oICAgICA9IHNvdXJjZS0+dzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbWFnZS0+dyAgICAgPSBzb3VyY2UtPnc7CisgICAgICAgIGltYWdlLT5oICAgICA9IHNvdXJjZS0+aDsKKyAgICB9CisgICAgaW1hZ2UtPnBpeGVscyA9IHJvdGF0ZV9pbWFnZSggc291cmNlLT5waXhlbHMsIHNvdXJjZS0+dywgc291cmNlLT5oLCBieSApOworICAgIGlmIChpbWFnZS0+cGl4ZWxzID09IE5VTEwpIHsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KKworICAgIGltYWdlLT5zdXJmYWNlID0gc2tpbl9zdXJmYWNlX2NyZWF0ZV9hcmdiMzJfZnJvbShpbWFnZS0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53ICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPnBpeGVscyk7CisgICAgaWYgKGltYWdlLT5zdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KKworICAgIHJldHVybiBpbWFnZTsKK0ZhaWw6CisgICAgaWYgKGltYWdlICE9IE5VTEwpIHsKKyAgICAgICAgc2tpbl9pbWFnZV9mcmVlKGltYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIFNLSU5fSU1BR0VfTk9ORTsKK30KKworU2tpbkltYWdlKgorc2tpbl9pbWFnZV9jbG9uZSggU2tpbkltYWdlKiAgc291cmNlICkKK3sKKyAgICBTa2luSW1hZ2UqICAgaW1hZ2U7CisKKyAgICBpZiAoc291cmNlID09IE5VTEwgfHwgc291cmNlID09IF9ub19pbWFnZSkKKyAgICAgICAgcmV0dXJuIFNLSU5fSU1BR0VfTk9ORTsKKworICAgIGltYWdlID0gY2FsbG9jKDEsIHNpemVvZigqaW1hZ2UpKTsKKyAgICBpZiAoaW1hZ2UgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgaW1hZ2UtPnJlZl9jb3VudCA9IDE7CisgICAgaW1hZ2UtPmRlc2MgID0gc291cmNlLT5kZXNjOworICAgIGltYWdlLT5oYXNoICA9IHNvdXJjZS0+aGFzaDsKKyAgICBpbWFnZS0+ZmxhZ3MgPSBTS0lOX0lNQUdFX0NMT05FOworICAgIGltYWdlLT53ICAgICA9IHNvdXJjZS0+dzsKKyAgICBpbWFnZS0+aCAgICAgPSBzb3VyY2UtPmg7CisgICAgaW1hZ2UtPnBpeGVscyA9IHJvdGF0ZV9pbWFnZSggc291cmNlLT5waXhlbHMsIHNvdXJjZS0+dywgc291cmNlLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSU5fUk9UQVRJT05fMCApOworICAgIGlmIChpbWFnZS0+cGl4ZWxzID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIGltYWdlLT5zdXJmYWNlID0gc2tpbl9zdXJmYWNlX2NyZWF0ZV9hcmdiMzJfZnJvbShpbWFnZS0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT53ICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPnBpeGVscyk7CisgICAgaWYgKGltYWdlLT5zdXJmYWNlID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIHJldHVybiBpbWFnZTsKK0ZhaWw6CisgICAgaWYgKGltYWdlICE9IE5VTEwpCisgICAgICAgIHNraW5faW1hZ2VfZnJlZShpbWFnZSk7CisgICAgcmV0dXJuIFNLSU5fSU1BR0VfTk9ORTsKK30KKworU2tpbkltYWdlKgorc2tpbl9pbWFnZV9jbG9uZV9mdWxsKCBTa2luSW1hZ2UqICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2tpblJvdGF0aW9uICByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBibGVuZCApCit7CisgICAgU2tpbkltYWdlRGVzYyAgIGRlc2M7CisgICAgU2tpbkltYWdlKiAgICAgIGNsb25lOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZSA9PSBTS0lOX0lNQUdFX05PTkUpCisgICAgICAgIHJldHVybiBTS0lOX0lNQUdFX05PTkU7CisKKyAgICBpZiAocm90YXRpb24gPT0gU0tJTl9ST1RBVElPTl8wICYmCisgICAgICAgIGJsZW5kICAgID09IFNLSU5fQkxFTkRfRlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBza2luX2ltYWdlX2Nsb25lKHNvdXJjZSk7CisgICAgfQorCisgICAgZGVzYy5wYXRoICAgICA9IHNvdXJjZS0+ZGVzYy5wYXRoOworICAgIGRlc2Mucm90YXRpb24gPSByb3RhdGlvbjsKKyAgICBkZXNjLmJsZW5kICAgID0gYmxlbmQ7CisKKyAgICBjbG9uZSA9IHNraW5faW1hZ2VfY3JlYXRlKCAmZGVzYywgMCApOworICAgIGlmIChjbG9uZSAhPSBTS0lOX0lNQUdFX05PTkUpCisgICAgICAgIGNsb25lLT5mbGFncyB8PSBTS0lOX0lNQUdFX0NMT05FOworCisgICAgcmV0dXJuIGNsb25lOworfQorCitpbnQKK3NraW5faW1hZ2VfdyggU2tpbkltYWdlKiAgaW1hZ2UgKQoreworICAgIHJldHVybiAgaW1hZ2UgPyBpbWFnZS0+dyA6IDA7Cit9CisKK2ludAorc2tpbl9pbWFnZV9oKCBTa2luSW1hZ2UqICBpbWFnZSApCit7CisgICAgcmV0dXJuICBpbWFnZSA/IGltYWdlLT5oIDogMDsKK30KKworU2tpblJvdGF0aW9uCitza2luX2ltYWdlX3JvdCggU2tpbkltYWdlKiAgaW1hZ2UgKQoreworICAgIHJldHVybiBpbWFnZS0+ZGVzYy5yb3RhdGlvbjsKK30KKworU2tpblN1cmZhY2UqCitza2luX2ltYWdlX3N1cmZhY2UoIFNraW5JbWFnZSogIGltYWdlICkKK3sKKyAgICByZXR1cm4gaW1hZ2UgPyBpbWFnZS0+c3VyZmFjZSA6IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9pbWFnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAwYmNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vaW1hZ2UuaApAQCAtMCwwICsxLDg0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vc3VyZmFjZS5oIgorCisvKiBza2luIGltYWdlIGZpbGUgb2JqZWN0cyAqLworCisvKiBvcGFxdWUgc2tpbiBpbWFnZSB0eXBlLiBhbGwgc2tpbiBpbWFnZXMgYXJlIHBsYWNlZCBpbiBhIHNpbXBsZSBNUlUgY2FjaGUKKyAqIHRvIGxpbWl0IHRoZSBlbXVsYXRvcidzIG1lbW9yeSB1c2FnZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mICdjbG9uZXMnIGNyZWF0ZWQKKyAqIHdpdGggc2tpbl9pbWFnZV9jbG9uZSgpIG9yIHNraW5faW1hZ2VfY2xvbmVfYmxlbmQoKQorICovCit0eXBlZGVmIHN0cnVjdCBTa2luSW1hZ2UgICBTa2luSW1hZ2U7CisKKy8qIGEgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBza2luIGltYWdlICovCit0eXBlZGVmIHN0cnVjdCBTa2luSW1hZ2VEZXNjIHsKKyAgICBjb25zdCBjaGFyKiAgIHBhdGg7ICAgICAgLyogaW1hZ2UgZmlsZSBwYXRoIChtdXN0IGJlIC5wbmcpICovCisgICAgU2tpblJvdGF0aW9uICByb3RhdGlvbjsgIC8qIHJvdGF0aW9uICovCisgICAgaW50ICAgICAgICAgICBibGVuZDsgICAgIC8qIGJsZW5kaW5nLCAwLi4yNTYgdmFsdWUgKi8KK30gU2tpbkltYWdlRGVzYzsKKworI2RlZmluZSAgU0tJTl9CTEVORF9OT05FICAgMAorI2RlZmluZSAgU0tJTl9CTEVORF9IQUxGICAgMTI4CisjZGVmaW5lICBTS0lOX0JMRU5EX0ZVTEwgICAyNTYKKworLyogYSBzcGVjaWFsIHZhbHVlIHJldHVybmVkIHdoZW4gYW4gaW1hZ2UgY2Fubm90IGJlIHByb3Blcmx5IGxvYWRlZCAqLworZXh0ZXJuIFNraW5JbWFnZSogICAgU0tJTl9JTUFHRV9OT05FOworCisvKiByZXR1cm4gdGhlIFNraW5TdXJmYWNlKiBwb2ludGVyIG9mIGEgZ2l2ZW4gc2tpbiBpbWFnZSAqLworZXh0ZXJuIFNraW5TdXJmYWNlKiAgc2tpbl9pbWFnZV9zdXJmYWNlKCBTa2luSW1hZ2UqICBpbWFnZSApOworZXh0ZXJuIGludCAgICAgICAgICAgc2tpbl9pbWFnZV93ICAgICAgKCBTa2luSW1hZ2UqICBpbWFnZSApOworZXh0ZXJuIGludCAgICAgICAgICAgc2tpbl9pbWFnZV9oICAgICAgKCBTa2luSW1hZ2UqICBpbWFnZSApOworZXh0ZXJuIFNraW5Sb3RhdGlvbiAgc2tpbl9pbWFnZV9yb3QgICAgKCBTa2luSW1hZ2UqICBpbWFnZSApOworCisvKiBnZXQgYW4gaW1hZ2UgZnJvbSB0aGUgY2FjaGUgKGxvYWQgaXQgZnJvbSB0aGUgZmlsZSBpZiBuZWNlc3NhcnkpLgorICogcmV0dXJucyBTS0lOX0lNQUdFX05PTkUgaW4gY2FzZSBvZiBlcnJvci4gY2Fubm90IHJldHVybiBOVUxMCisgKiB0aGlzIGZ1bmN0aW9uIGFsc28gaW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBza2luIGltYWdlLAorICogdXNlICJza2luX2ltYWdlX3VucmVmKCkiIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZQorICovCitleHRlcm4gU2tpbkltYWdlKiAgICBza2luX2ltYWdlX2ZpbmQoIFNraW5JbWFnZURlc2MqICBkZXNjICk7CisKK2V4dGVybiBTa2luSW1hZ2UqICAgIHNraW5faW1hZ2VfZmluZF9zaW1wbGUoIGNvbnN0IGNoYXIqICBwYXRoICk7CisKKy8qIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgZ2l2ZW4gc2tpbiBpbWFnZSwKKyAqIGRvbid0IGRvIGFueXRoaW5nIGlmICdpbWFnZScgaXMgTlVMTCAqLworZXh0ZXJuIFNraW5JbWFnZSogICAgc2tpbl9pbWFnZV9yZWYoIFNraW5JbWFnZSogIGltYWdlICk7CisKKy8qIGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgZ2l2ZW4gc2tpbiBpbWFnZS4gaWYKKyAqIHRoZSBjb3VudCByZWFjaGVzIDAsIHRoZSBpbWFnZSBiZWNvbWVzIGVsaWdpYmxlIGZvciBjYWNoZSBmbHVzaGluZy4KKyAqIHVubGVzcyBpdCB3YXMgY3JlYXRlZCB0aHJvdWdoIGEgc2tpbl9pbWFnZV9jbG9uZS4uLiBmdW5jdGlvbiwgd2hlcmUKKyAqIGl0IGlzIGltbWVkaWF0ZWx5IGRpc2NhcmRlZC4uLgorICovCitleHRlcm4gdm9pZCAgICAgICAgICBza2luX2ltYWdlX3VucmVmKCBTa2luSW1hZ2UqKiAgcGltYWdlICk7CisKKy8qIGdldCB0aGUgcm90YXRpb24gb2YgYSBnaXZlbiBpbWFnZS4gdGhpcyBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQKKyAqIG9mIHRoZSBzb3VyY2UgYWZ0ZXIgcmV0dXJuaW5nIHRoZSB0YXJnZXQsIHdob3NlIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZAorICovCitleHRlcm4gU2tpbkltYWdlKiAgICBza2luX2ltYWdlX3JvdGF0ZSggU2tpbkltYWdlKiAgc291cmNlLCBTa2luUm90YXRpb24gIHJvdGF0aW9uICk7CisKKy8qIFNpbWlsYXIgdG8gc2tpbl9pbWFnZV9jbG9uZSwgYnV0IGl0IGFsc28gcm90YXRlcyB0aGUgaW1hZ2UgYnkgYSBnaXZlbiBhbW91bnQgKi8KK2V4dGVybiBTa2luSW1hZ2UqIHNraW5faW1hZ2VfY2xvbmVfcm90YXRlZCggU2tpbkltYWdlKiBzb3VyY2UsIFNraW5Sb3RhdGlvbiBieSApOworCisvKiBjcmVhdGUgYSBza2luIGltYWdlIGNsb25lLiB0aGUgY2xvbmUgaXMgbm90IHBhcnQgb2YgdGhlIGNhY2hlIGFuZCB3aWxsCisgKiBiZSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkgd2hlbiBpdHMgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgMC4gdGhpcyBpcyB1c2VmdWwKKyAqIGlmIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGUgY29udGVudCBvZiB0aGUgY2xvbmUgKGUuZy4gYmxlbmRpbmcpCisgKi8KK2V4dGVybiBTa2luSW1hZ2UqICAgIHNraW5faW1hZ2VfY2xvbmUoIFNraW5JbWFnZSogIHNvdXJjZSApOworCisvKiBjcmVhdGUgYSBza2luIGltYWdlIGNsb25lLCB0aGUgY2xvbmUgaXMgYSByb3RhdGVkIHZlcnNpb24gb2YgYSBzb3VyY2UgaW1hZ2UKKyAqLworZXh0ZXJuIFNraW5JbWFnZSogICAgc2tpbl9pbWFnZV9jbG9uZV9mdWxsKCBTa2luSW1hZ2UqICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJvdGF0aW9uICAgICByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBibGVuZCApOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Ym9hcmQuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWJvYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlYjJmMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWJvYXJkLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Ym9hcmQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9jaGFybWFwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy91dGY4X3V0aWxzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lICBERUJVRyAgMQorCisjaWYgREVCVUcKKyMgIGRlZmluZSAgRCguLi4pICBWRVJCT1NFX1BSSU5UKGtleXMsX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lICBEKC4uLikgICgodm9pZCkwKQorI2VuZGlmCisKK3N0cnVjdCBTa2luS2V5Ym9hcmQgeworICAgIGNvbnN0IFNraW5DaGFybWFwKiAgY2hhcm1hcDsKKworICAgIFNraW5Sb3RhdGlvbiAgICAgICAgcm90YXRpb247CisKKyAgICBTa2luS2V5Y29kZUJ1ZmZlciAgIGtleWNvZGVzWzFdOworfTsKKworI2RlZmluZSBERUZBVUxUX0FORFJPSURfQ0hBUk1BUCAgInF3ZXJ0eTIiCisKK3N0YXRpYyBib29sIHNraW5fa2V5X2NvZGVfaXNfYXJyb3coaW50IGNvZGUpIHsKKyAgICByZXR1cm4gY29kZSA9PSBrS2V5Q29kZURwYWRMZWZ0IHx8CisgICAgICAgICAgIGNvZGUgPT0ga0tleUNvZGVEcGFkUmlnaHQgfHwKKyAgICAgICAgICAgY29kZSA9PSBrS2V5Q29kZURwYWRVcCB8fAorICAgICAgICAgICBjb2RlID09IGtLZXlDb2RlRHBhZERvd247Cit9CisKK3N0YXRpYyBTa2luS2V5Q29kZQorc2tpbl9rZXlib2FyZF9rZXlfdG9fY29kZShTa2luS2V5Ym9hcmQqICBrZXlib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgbW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBkb3duKQoreworICAgIEQoImtleSBjb2RlPSVkIG1vZD0lZCBzdHI9JXMiLAorICAgICAgY29kZSwKKyAgICAgIG1vZCwKKyAgICAgIHNraW5fa2V5X3BhaXJfdG9fc3RyaW5nKGNvZGUsIG1vZCkpOworCisgICAgLyogZmlyc3QsIGhhbmRsZSB0aGUgYXJyb3cga2V5cyBkaXJlY3RseSAqLworICAgIGlmIChza2luX2tleV9jb2RlX2lzX2Fycm93KGNvZGUpKSB7CisgICAgICAgIGNvZGUgPSBza2luX2tleWNvZGVfcm90YXRlKGNvZGUsIC1rZXlib2FyZC0+cm90YXRpb24pOworICAgICAgICBEKCJoYW5kbGluZyBhcnJvdyAoY29kZT0lZCBtb2Q9JWQpIiwgY29kZSwgbW9kKTsKKyAgICAgICAgaW50ICBkb0NhcEwsIGRvQ2FwUiwgZG9BbHRMLCBkb0FsdFI7CisKKyAgICAgICAgZG9DYXBMID0gbW9kICYga0tleU1vZExTaGlmdDsKKyAgICAgICAgZG9DYXBSID0gbW9kICYga0tleU1vZFJTaGlmdDsKKyAgICAgICAgZG9BbHRMID0gbW9kICYga0tleU1vZExBbHQ7CisgICAgICAgIGRvQWx0UiA9IG1vZCAmIGtLZXlNb2RSQWx0OworCisgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICBpZiAoZG9BbHRMKSBza2luX2tleWJvYXJkX2FkZF9rZXlfZXZlbnQoa2V5Ym9hcmQsIGtLZXlDb2RlQWx0TGVmdCwgMSk7CisgICAgICAgICAgICBpZiAoZG9BbHRSKSBza2luX2tleWJvYXJkX2FkZF9rZXlfZXZlbnQoa2V5Ym9hcmQsIGtLZXlDb2RlQWx0UmlnaHQsIDEpOworICAgICAgICAgICAgaWYgKGRvQ2FwTCkgc2tpbl9rZXlib2FyZF9hZGRfa2V5X2V2ZW50KGtleWJvYXJkLCBrS2V5Q29kZUNhcExlZnQsIDEpOworICAgICAgICAgICAgaWYgKGRvQ2FwUikgc2tpbl9rZXlib2FyZF9hZGRfa2V5X2V2ZW50KGtleWJvYXJkLCBrS2V5Q29kZUNhcFJpZ2h0LCAxKTsKKyAgICAgICAgfQorICAgICAgICBza2luX2tleWJvYXJkX2FkZF9rZXlfZXZlbnQoa2V5Ym9hcmQsIGNvZGUsIGRvd24pOworCisgICAgICAgIGlmICghZG93bikgeworICAgICAgICAgICAgaWYgKGRvQWx0Uikgc2tpbl9rZXlib2FyZF9hZGRfa2V5X2V2ZW50KGtleWJvYXJkLCBrS2V5Q29kZUFsdFJpZ2h0LCAwKTsKKyAgICAgICAgICAgIGlmIChkb0FsdEwpIHNraW5fa2V5Ym9hcmRfYWRkX2tleV9ldmVudChrZXlib2FyZCwga0tleUNvZGVBbHRMZWZ0LCAwKTsKKyAgICAgICAgICAgIGlmIChkb0NhcFIpIHNraW5fa2V5Ym9hcmRfYWRkX2tleV9ldmVudChrZXlib2FyZCwga0tleUNvZGVDYXBSaWdodCwgMCk7CisgICAgICAgICAgICBpZiAoZG9DYXBMKSBza2luX2tleWJvYXJkX2FkZF9rZXlfZXZlbnQoa2V5Ym9hcmQsIGtLZXlDb2RlQ2FwTGVmdCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA9IDA7CisgICAgICAgIHJldHVybiBjb2RlOworICAgIH0KKworICAgIC8qIHNwZWNpYWwgY2FzZSBmb3Iga2V5cGFkIGtleXMsIGlnbm9yZSB0aGVtIGhlcmUgaWYgbnVtbG9jayBpcyBvbiAqLworICAgIGlmICgobW9kICYga0tleU1vZE51bUxvY2spICE9IDApIHsKKyAgICAgICAgc3dpdGNoICgoaW50KWNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQMDoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQMToKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQMjoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQMzoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQNDoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQNToKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQNjoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQNzoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQODoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQOToKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQUExVUzoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQTUlOVVM6CisgICAgICAgICAgICBjYXNlIEtFWV9LUEFTVEVSSVNLOgorICAgICAgICAgICAgY2FzZSBLRVlfS1BTTEFTSDoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQRVFVQUw6CisgICAgICAgICAgICBjYXNlIEtFWV9LUERPVDoKKyAgICAgICAgICAgIGNhc2UgS0VZX0tQRU5URVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEQoImNvdWxkIG5vdCBoYW5kbGUgKGNvZGU9JWQsIG1vZD0lZCwgc3RyPSVzKSIsIGNvZGUsIG1vZCwKKyAgICAgIHNraW5fa2V5X3BhaXJfdG9fc3RyaW5nKGNvZGUsbW9kKSk7CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkCitza2luX2tleWJvYXJkX3Byb2Nlc3NfZXZlbnQoU2tpbktleWJvYXJkKiAga2IsIFNraW5FdmVudCogZXYsIGludCAgZG93bikKK3sKKyAgICBpZiAoZXYtPnR5cGUgPT0ga0V2ZW50VGV4dElucHV0KSB7CisgICAgICAgIC8vIFRPRE8oZGlnaXQpOiBGb3IgZWFjaCBVbmljb2RlIHZhbHVlIGluIHRoZSBpbnB1dCB0ZXh0LgorICAgICAgICBjb25zdCB1aW50OF90KiB0ZXh0ID0gZXYtPnUudGV4dC50ZXh0OworICAgICAgICBjb25zdCB1aW50OF90KiBlbmQgPSB0ZXh0ICsgc2l6ZW9mKGV2LT51LnRleHQudGV4dCk7CisgICAgICAgIHdoaWxlICh0ZXh0IDwgZW5kICYmICp0ZXh0KSB7CisgICAgICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQgPSAwOworICAgICAgICAgICAgaW50IGxlbiA9IGFuZHJvaWRfdXRmOF9kZWNvZGUodGV4dCwgZW5kIC0gdGV4dCwgJmNvZGVwb2ludCk7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpbl9rZXlib2FyZF9wcm9jZXNzX3VuaWNvZGVfZXZlbnQoa2IsIGNvZGVwb2ludCwgMSk7CisgICAgICAgICAgICBza2luX2tleWJvYXJkX3Byb2Nlc3NfdW5pY29kZV9ldmVudChrYiwgY29kZXBvaW50LCAwKTsKKyAgICAgICAgICAgIHRleHQgKz0gbGVuOworICAgICAgICB9CisgICAgICAgIHNraW5fa2V5Ym9hcmRfZmx1c2goa2IpOworICAgIH0gZWxzZSBpZiAoZXYtPnR5cGUgPT0ga0V2ZW50S2V5RG93biB8fCBldi0+dHlwZSA9PSBrRXZlbnRLZXlVcCkgeworICAgICAgICBpbnQga2V5Y29kZSA9IGV2LT51LmtleS5rZXljb2RlOworICAgICAgICBpbnQgbW9kID0gZXYtPnUua2V5Lm1vZDsKKworICAgICAgICAvKiBmaXJzdCwgdHJ5IHRoZSBrZXlib2FyZC1tb2RlLWluZGVwZW5kZW50IGtleXMgKi8KKyAgICAgICAgaW50IGNvZGUgPSBza2luX2tleWJvYXJkX2tleV90b19jb2RlKGtiLCBrZXljb2RlLCBtb2QsIGRvd24pOworICAgICAgICBpZiAoY29kZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbnQpY29kZSA+IDApIHsKKyAgICAgICAgICAgIHNraW5fa2V5Ym9hcmRfYWRkX2tleV9ldmVudChrYiwgY29kZSwgZG93bik7CisgICAgICAgICAgICBza2luX2tleWJvYXJkX2ZsdXNoKGtiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGUgPSBrZXljb2RlOworCisgICAgICAgIGlmIChjb2RlID09IGtLZXlDb2RlQWx0TGVmdCAgfHwgY29kZSA9PSBrS2V5Q29kZUFsdFJpZ2h0IHx8CisgICAgICAgICAgICBjb2RlID09IGtLZXlDb2RlQ2FwTGVmdCAgfHwgY29kZSA9PSBrS2V5Q29kZUNhcFJpZ2h0IHx8CisgICAgICAgICAgICBjb2RlID09IGtLZXlDb2RlU3ltKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29kZSA9PSBLRVlfQVBQU1dJVENIICAgfHwgY29kZSA9PSBLRVlfUExBWVBBVVNFICB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfQkFDSyAgICAgICAgfHwgY29kZSA9PSBLRVlfUE9XRVIgICAgICB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfQkFDS1NQQUNFICAgfHwgY29kZSA9PSBLRVlfU09GVDEgICAgICB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfQ0VOVEVSICAgICAgfHwgY29kZSA9PSBLRVlfUkVXSU5EICAgICB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfRU5URVIgICAgICAgfHwgY29kZSA9PSBLRVlfVk9MVU1FRE9XTiB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfRkFTVEZPUldBUkQgfHwgY29kZSA9PSBLRVlfVk9MVU1FVVAgICB8fAorICAgICAgICAgICAgY29kZSA9PSBLRVlfSE9NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNraW5fa2V5Ym9hcmRfYWRkX2tleV9ldmVudChrYiwgY29kZSwgZG93bik7CisgICAgICAgICAgICBza2luX2tleWJvYXJkX2ZsdXNoKGtiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBEKCJpZ25vcmluZyBrZXljb2RlICVkIiwga2V5Y29kZSk7CisgICAgfQorfQorCit2b2lkCitza2luX2tleWJvYXJkX3NldF9yb3RhdGlvbiggU2tpbktleWJvYXJkKiAgICAga2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJvdGF0aW9uICAgICAgcm90YXRpb24gKQoreworICAgIGtleWJvYXJkLT5yb3RhdGlvbiA9IChyb3RhdGlvbiAmIDMpOworfQorCit2b2lkCitza2luX2tleWJvYXJkX2FkZF9rZXlfZXZlbnQoIFNraW5LZXlib2FyZCogIGtiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgICBkb3duICkKK3sKKyAgICBza2luX2tleWNvZGVfYnVmZmVyX2FkZChrYi0+a2V5Y29kZXMsIGNvZGUsIGRvd24pOworfQorCisKK3ZvaWQKK3NraW5fa2V5Ym9hcmRfZmx1c2goIFNraW5LZXlib2FyZCogIGtiICkKK3sKKyAgICBza2luX2tleWNvZGVfYnVmZmVyX2ZsdXNoKGtiLT5rZXljb2Rlcyk7Cit9CisKKworaW50Citza2luX2tleWJvYXJkX3Byb2Nlc3NfdW5pY29kZV9ldmVudCggU2tpbktleWJvYXJkKiAga2IsICB1bnNpZ25lZCBpbnQgIHVuaWNvZGUsIGludCAgZG93biApCit7CisgICAgcmV0dXJuIHNraW5fY2hhcm1hcF9yZXZlcnNlX21hcF91bmljb2RlKGtiLT5jaGFybWFwLCB1bmljb2RlLCBkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYi0+a2V5Y29kZXMpOworfQorCitzdGF0aWMgU2tpbktleWJvYXJkKiBza2luX2tleWJvYXJkX2NyZWF0ZV9mcm9tX2NoYXJtYXBfbmFtZSgKKyAgICAgICAgY29uc3QgY2hhciogY2hhcm1hcF9uYW1lLAorICAgICAgICBTa2luUm90YXRpb24gZHBhZF9yb3RhdGlvbiwKKyAgICAgICAgU2tpbktleUNvZGVGbHVzaEZ1bmMga2V5Y29kZV9mbHVzaCkgeworICAgIFNraW5LZXlib2FyZCogIGtiOworCisgICAgQU5FVzAoa2IpOworCisgICAga2ItPmNoYXJtYXAgPSBza2luX2NoYXJtYXBfZ2V0X2J5X25hbWUoY2hhcm1hcF9uYW1lKTsKKyAgICBpZiAoIWtiLT5jaGFybWFwKSB7CisgICAgICAgIC8vIENoYXJtYXAgbmFtZSB3YXMgbm90IGZvdW5kLiBEZWZhdWx0IHRvICJxd2VydHkyIiAqLworICAgICAgICBrYi0+Y2hhcm1hcCA9IHNraW5fY2hhcm1hcF9nZXRfYnlfbmFtZShERUZBVUxUX0FORFJPSURfQ0hBUk1BUCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIyMjIHdhcm5pbmcsIHNraW4gcmVxdWlyZXMgdW5rbm93biAnJXMnIGNoYXJtYXAsIHJldmVydGluZyB0byAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGNoYXJtYXBfbmFtZSwga2ItPmNoYXJtYXAtPm5hbWUgKTsKKyAgICB9CisgICAgc2tpbl9rZXljb2RlX2J1ZmZlcl9pbml0KGtiLT5rZXljb2Rlcywga2V5Y29kZV9mbHVzaCk7CisgICAgc2tpbl9rZXlib2FyZF9zZXRfcm90YXRpb24oa2IsIGRwYWRfcm90YXRpb24pOworICAgIHJldHVybiBrYjsKK30KKworU2tpbktleWJvYXJkKiBza2luX2tleWJvYXJkX2NyZWF0ZShjb25zdCBjaGFyKiBrY21fZmlsZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gZHBhZF9yb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbktleUNvZGVGbHVzaEZ1bmMga2V5Y29kZV9mbHVzaCkgeworICAgIGNvbnN0IGNoYXIqIGNoYXJtYXBfbmFtZSA9IERFRkFVTFRfQU5EUk9JRF9DSEFSTUFQOworICAgIGNoYXIgICAgICAgIGNtYXBfYnVmZltTS0lOX0NIQVJNQVBfTkFNRV9TSVpFXTsKKworICAgIGlmIChrY21fZmlsZV9wYXRoICE9IE5VTEwpIHsKKyAgICAgICAga2NtX2V4dHJhY3RfY2hhcm1hcF9uYW1lKGtjbV9maWxlX3BhdGgsIGNtYXBfYnVmZiwgc2l6ZW9mIGNtYXBfYnVmZik7CisgICAgICAgIGNoYXJtYXBfbmFtZSA9IGNtYXBfYnVmZjsKKyAgICB9CisgICAgcmV0dXJuIHNraW5fa2V5Ym9hcmRfY3JlYXRlX2Zyb21fY2hhcm1hcF9uYW1lKGNoYXJtYXBfbmFtZSwgZHBhZF9yb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Y29kZV9mbHVzaCk7Cit9CisKK3ZvaWQKK3NraW5fa2V5Ym9hcmRfZnJlZSggU2tpbktleWJvYXJkKiAga2V5Ym9hcmQgKQoreworICAgIGlmIChrZXlib2FyZCkgeworICAgICAgICBBRlJFRShrZXlib2FyZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Ym9hcmQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWJvYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjOWFlNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWJvYXJkLmgKQEAgLTAsMCArMSwzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9jaGFybWFwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2ltYWdlLmgiICAvKiBmb3IgU2tpblJvdGF0aW9uICovCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2tpbktleWJvYXJkICAgU2tpbktleWJvYXJkOworCit0eXBlZGVmIHZvaWQgKCpTa2luS2V5RXZlbnRGdW5jKSggdm9pZCogIG9wYXF1ZSwgU2tpbktleUNvZGUgIGNvZGUsIGludCAgZG93biApOworCisvKiBJZiBrY21fZmlsZV9wYXRoIGlzIE5VTEwsIGNyZWF0ZSBhIGtleWJvYXJkIHVzaW5nIHRoZSBkZWZhdWx0IGJ1aWx0LWluIHF3ZXJ0eTIgY2hhcm1hcCAqLworZXh0ZXJuIFNraW5LZXlib2FyZCogc2tpbl9rZXlib2FyZF9jcmVhdGUoY29uc3QgY2hhcioga2NtX2ZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5Sb3RhdGlvbiBkcGFkX3JvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbktleUNvZGVGbHVzaEZ1bmMga2V5Y29kZV9mbHVzaCk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICBza2luX2tleWJvYXJkX2ZyZWUoIFNraW5LZXlib2FyZCogIGtleWJvYXJkICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICBza2luX2tleWJvYXJkX3NldF9yb3RhdGlvbiggU2tpbktleWJvYXJkKiAgICAga2V5Ym9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5Sb3RhdGlvbiAgICAgIHJvdGF0aW9uICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICBza2luX2tleWJvYXJkX3Byb2Nlc3NfZXZlbnQoIFNraW5LZXlib2FyZCogIGtleWJvYXJkLCBTa2luRXZlbnQqICBldiwgaW50ICBkb3duICk7CitleHRlcm4gaW50ICAgICAgICAgICAgc2tpbl9rZXlib2FyZF9wcm9jZXNzX3VuaWNvZGVfZXZlbnQoIFNraW5LZXlib2FyZCogIGtiLCAgdW5zaWduZWQgaW50ICB1bmljb2RlLCBpbnQgIGRvd24gKTsKKworZXh0ZXJuIHZvaWQgICAgICAgICAgIHNraW5fa2V5Ym9hcmRfYWRkX2tleV9ldmVudCggU2tpbktleWJvYXJkKiAgaywgdW5zaWduZWQgY29kZSwgdW5zaWduZWQgIGRvd24gKTsKK2V4dGVybiB2b2lkICAgICAgICAgICBza2luX2tleWJvYXJkX2ZsdXNoKCBTa2luS2V5Ym9hcmQqICBrYiApOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNDU0NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmMKQEAgLTAsMCArMSw1MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIHNraW5fa2V5Y29kZV9idWZmZXJfaW5pdChTa2luS2V5Y29kZUJ1ZmZlciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbktleUNvZGVGbHVzaEZ1bmMgZmx1c2hfZnVuYykgeworICAgIGJ1ZmZlci0+a2V5Y29kZV9mbHVzaCA9IGZsdXNoX2Z1bmM7CisgICAgYnVmZmVyLT5rZXljb2RlX2NvdW50ID0gMDsKK30KKwordm9pZCBza2luX2tleWNvZGVfYnVmZmVyX2FkZChTa2luS2V5Y29kZUJ1ZmZlcioga2V5Y29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb3duKSB7CisgICAgaWYgKGNvZGUgIT0gMCAmJiBrZXljb2Rlcy0+a2V5Y29kZV9jb3VudCA8IE1BWF9LRVlDT0RFUykgeworICAgICAgICBrZXljb2Rlcy0+a2V5Y29kZXNbKGludClrZXljb2Rlcy0+a2V5Y29kZV9jb3VudCsrXSA9CisgICAgICAgICAgICAgICAgKCAoY29kZSAmIDB4M2ZmKSB8IChkb3duID8gMHg0MDAgOiAwKSApOworICAgIH0KK30KKwordm9pZCBza2luX2tleWNvZGVfYnVmZmVyX2ZsdXNoKFNraW5LZXljb2RlQnVmZmVyKiBrZXljb2RlcykgeworICAgIGlmIChrZXljb2Rlcy0+a2V5Y29kZV9jb3VudCA+IDApIHsKKyAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0soa2V5cykpIHsKKyAgICAgICAgICAgIGludCAgbm47CisgICAgICAgICAgICBwcmludGYoIj4+IEtFWSIpOworICAgICAgICAgICAgZm9yIChubiA9IDA7IG5uIDwga2V5Y29kZXMtPmtleWNvZGVfY291bnQ7IG5uKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgIGNvZGUgPSBrZXljb2Rlcy0+a2V5Y29kZXNbbm5dOworICAgICAgICAgICAgICAgIHByaW50ZigiIFsweCUwM3gsJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUgJiAweDNmZiksIChjb2RlICYgMHg0MDApID8gImRvd24iIDogIiB1cCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoa2V5Y29kZXMtPmtleWNvZGVfZmx1c2gpIHsKKyAgICAgICAgICAgIGtleWNvZGVzLT5rZXljb2RlX2ZsdXNoKGtleWNvZGVzLT5rZXljb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGVzLT5rZXljb2RlX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBrZXljb2Rlcy0+a2V5Y29kZV9jb3VudCA9IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZmQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgKQEAgLTAsMCArMSw0OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMgdGhhdCBtYW5hZ2Uga2V5Y29kZSBzZXF1ZW5jZSB0aGF0IG5lZWRzCisgKiB0byBiZSB0cmFuc2ZlcnJlZCB0byB0aGUgZW11bGF0b3IgY29yZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgorICovCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGtleWNvZGVzIGtlcHQgaW4gdGhlIGFycmF5LiAqLworI2RlZmluZSAgTUFYX0tFWUNPREVTICAgMjU2KjIKKworLy8gVHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZmx1c2ggYnVmZmVyZWQgY29kZXMKK3R5cGVkZWYgdm9pZCAoKlNraW5LZXlDb2RlRmx1c2hGdW5jKShpbnQqIGNvZGVzLCBpbnQgY291bnQpOworCisvKiBEZXNjcmliZXMgYXJyYXkgb2Yga2V5Y29kZXMgY29sbGVjdGVkIGZvciB0cmFuc2ZlcnJpbmcgdG8gdGhlIGNvcmUuICovCit0eXBlZGVmIHN0cnVjdCBTa2luS2V5Y29kZUJ1ZmZlciB7CisgICAgU2tpbktleUNvZGVGbHVzaEZ1bmMga2V5Y29kZV9mbHVzaDsKKyAgICBpbnQga2V5Y29kZV9jb3VudDsKKyAgICBpbnQga2V5Y29kZXNbTUFYX0tFWUNPREVTXTsKK30gU2tpbktleWNvZGVCdWZmZXI7CisKK3ZvaWQgc2tpbl9rZXljb2RlX2J1ZmZlcl9pbml0KFNraW5LZXljb2RlQnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luS2V5Q29kZUZsdXNoRnVuYyBmbHVzaF9mdW5jKTsKKworLyogQWRkcyBhIGtleSBldmVudCB0byB0aGUgYXJyYXkgb2Yga2V5Y29kZXMuICovCit2b2lkIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKFNraW5LZXljb2RlQnVmZmVyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG93bik7CisKKy8qIEZsdXNoZXMgKHRyYW5zZmVycykgY29sbGVjdGVkIGtleWNvZGVzIHRvIHRoZSBjb3JlLiAqLwordm9pZCBza2luX2tleWNvZGVfYnVmZmVyX2ZsdXNoKFNraW5LZXljb2RlQnVmZmVyKiBidWZmZXIpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE0MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vbGludXhfa2V5Y29kZXMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgQVJSQVlMRU4oeCkgIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCituYW1lc3BhY2UgYW5kcm9pZF9za2luIHsKKworbmFtZXNwYWNlIHsKKworLy8gR2xvYmFsIHZhcmlhYmxlcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgZmx1c2ggY2FsbGJhY2sgZHVyaW5nIHRlc3RpbmcuCitjb25zdCBpbnQga01heENvZGVzID0gMjU2OworaW50IHNDb2Rlc1trTWF4Q29kZXNdOworaW50IHNDb2Rlc0NvdW50ID0gMDsKKwordm9pZCBteUZsdXNoRnVuYyhpbnQqIGNvZGVzLCBpbnQgY291bnQpIHsKKyAgICBpZiAoY291bnQgPiBrTWF4Q29kZXMpIHsKKyAgICAgICAgY291bnQgPSBrTWF4Q29kZXM7CisgICAgfQorICAgIGZvciAoaW50IG4gPSAwOyBuIDwgY291bnQ7ICsrbikgeworICAgICAgICBzQ29kZXNbbl0gPSBjb2Rlc1tuXTsKKyAgICB9CisgICAgc0NvZGVzQ291bnQgPSBjb3VudDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1Qoa2V5Y29kZV9idWZmZXIsc2tpbl9rZXljb2RlX2J1ZmZlcl9mbHVzaCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBpbnQgZXhwZWN0ZWQ7CisgICAgICAgIHVuc2lnbmVkIGNvZGU7CisgICAgICAgIGJvb2wgZG93bjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgS0VZX0YxfDB4NDAwLCBLRVlfRjEsIHRydWUgfSwKKyAgICAgICAgeyBLRVlfRjEsIEtFWV9GMSwgZmFsc2UgfSwKKyAgICAgICAgeyBLRVlfQ09NUE9TRSwgS0VZX0NPTVBPU0UsIGZhbHNlIH0sCisgICAgICAgIHsgS0VZX0NPTVBPU0V8MHg0MDAsIEtFWV9DT01QT1NFLCB0cnVlIH0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBBUlJBWUxFTihrRGF0YSk7CisKKyAgICBTa2luS2V5Y29kZUJ1ZmZlciBidWZmZXI7CisKKyAgICBza2luX2tleWNvZGVfYnVmZmVyX2luaXQoJmJ1ZmZlciwgJm15Rmx1c2hGdW5jKTsKKyAgICBmb3IgKHNpemVfdCBubiA9IDBVOyBubiA8IGtEYXRhTGVuOyArK25uKSB7CisgICAgICAgIHNraW5fa2V5Y29kZV9idWZmZXJfYWRkKCZidWZmZXIsIGtEYXRhW25uXS5jb2RlLCBrRGF0YVtubl0uZG93bik7CisgICAgfQorICAgIHNraW5fa2V5Y29kZV9idWZmZXJfZmx1c2goJmJ1ZmZlcik7CisKKyAgICBFWFBFQ1RfRVEoa0RhdGFMZW4sIHN0YXRpY19jYXN0PHNpemVfdD4oc0NvZGVzQ291bnQpKTsKKyAgICBmb3IgKHNpemVfdCBubiA9IDBVOyBubiA8IGtEYXRhTGVuOyArK25uKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtubl0uZXhwZWN0ZWQsIHNDb2Rlc1tubl0pIDw8ICIjIiA8PCBubjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkX3NraW4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjE3Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Y29kZS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitTa2luS2V5Q29kZSBza2luX2tleWNvZGVfcm90YXRlKFNraW5LZXlDb2RlIGNvZGUsIGludCAgcm90YXRpb24pIHsKKyAgICBzdGF0aWMgY29uc3QgU2tpbktleUNvZGUgIHdoZWVsWzRdID0geyBrS2V5Q29kZURwYWRVcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5Q29kZURwYWRSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5Q29kZURwYWREb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlDb2RlRHBhZExlZnQgfTsKKyAgICBpbnQgIGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykgeworICAgICAgICBpZiAoY29kZSA9PSB3aGVlbFtpbmRleF0pIHsKKyAgICAgICAgICAgIGluZGV4ID0gKGluZGV4ICsgcm90YXRpb24pICYgMzsKKyAgICAgICAgICAgIGNvZGUgID0gd2hlZWxbaW5kZXhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvZGU7Cit9CisKKyNkZWZpbmUgIF9LRVlTWU0xXyh4KSAgX0tFWVNZTV8oeCx4KQorCisjZGVmaW5lIF9LRVlTWU1fTElTVCAgXAorICAgIF9LRVlTWU1fKEVTQyxFc2NhcGUpIFwKKyAgICBfS0VZU1lNXyhCQUNLU1BBQ0UsQmFja3NwYWNlKSAgXAorICAgIF9LRVlTWU1fKFRBQixUYWIpICAgICAgICAgXAorICAgIF9LRVlTWU1fKENMRUFSLENsZWFyKSAgICAgXAorICAgIF9LRVlTWU1fKEVOVEVSLFJldHVybikgICAgXAorICAgIF9LRVlTWU1fKEVRVUFMLEVxdWFsKSAgICBcCisgICAgX0tFWVNZTV8oUEFVU0UsUGF1c2UpICAgIFwKKyAgICBfS0VZU1lNXyhFU0MsRXNjKSAgICAgICAgXAorICAgIF9LRVlTWU1fKFNQQUNFLFNwYWNlKSAgICBcCisgICAgX0tFWVNZTV8oUExVUyxQbHVzKSBcCisgICAgX0tFWVNZTV8oQ09NTUEsQ29tbWEpIFwKKyAgICBfS0VZU1lNXyhNSU5VUyxNaW51cykgXAorICAgIF9LRVlTWU1fKFNMQVNILFNsYXNoKSBcCisgICAgX0tFWVNZTTFfKDApIFwKKyAgICBfS0VZU1lNMV8oMSkgXAorICAgIF9LRVlTWU0xXygyKSBcCisgICAgX0tFWVNZTTFfKDMpIFwKKyAgICBfS0VZU1lNMV8oNCkgXAorICAgIF9LRVlTWU0xXyg1KSBcCisgICAgX0tFWVNZTTFfKDYpIFwKKyAgICBfS0VZU1lNMV8oNykgXAorICAgIF9LRVlTWU0xXyg4KSBcCisgICAgX0tFWVNZTTFfKDkpIFwKKyAgICBfS0VZU1lNMV8oU0VNSUNPTE9OKSBcCisgICAgX0tFWVNZTTFfKFFVRVNUSU9OKSBcCisgICAgX0tFWVNZTTFfKEJBQ0tTTEFTSCkgXAorICAgIF9LRVlTWU0xXyhBKSBcCisgICAgX0tFWVNZTTFfKEIpIFwKKyAgICBfS0VZU1lNMV8oQykgXAorICAgIF9LRVlTWU0xXyhEKSBcCisgICAgX0tFWVNZTTFfKEUpIFwKKyAgICBfS0VZU1lNMV8oRikgXAorICAgIF9LRVlTWU0xXyhHKSBcCisgICAgX0tFWVNZTTFfKEgpIFwKKyAgICBfS0VZU1lNMV8oSSkgXAorICAgIF9LRVlTWU0xXyhKKSBcCisgICAgX0tFWVNZTTFfKEspIFwKKyAgICBfS0VZU1lNMV8oTCkgXAorICAgIF9LRVlTWU0xXyhNKSBcCisgICAgX0tFWVNZTTFfKE4pIFwKKyAgICBfS0VZU1lNMV8oTykgXAorICAgIF9LRVlTWU0xXyhQKSBcCisgICAgX0tFWVNZTTFfKFEpIFwKKyAgICBfS0VZU1lNMV8oUikgXAorICAgIF9LRVlTWU0xXyhTKSBcCisgICAgX0tFWVNZTTFfKFQpIFwKKyAgICBfS0VZU1lNMV8oVSkgXAorICAgIF9LRVlTWU0xXyhWKSBcCisgICAgX0tFWVNZTTFfKFcpIFwKKyAgICBfS0VZU1lNMV8oWCkgXAorICAgIF9LRVlTWU0xXyhZKSBcCisgICAgX0tFWVNZTTFfKFopIFwKKyAgICBfS0VZU1lNXyhDT01NQSxDb21tYSkgXAorICAgIF9LRVlTWU1fKEtQUExVUyxLZXlwYWRfUGx1cykgICAgIFwKKyAgICBfS0VZU1lNXyhLUE1JTlVTLEtleXBhZF9NaW51cykgICAgXAorICAgIF9LRVlTWU1fKEtQQVNURVJJU0ssS2V5cGFkX011bHRpcGx5KSBcCisgICAgX0tFWVNZTV8oS1BTTEFTSCxLZXlwYWRfRGl2aWRlKSAgIFwKKyAgICBfS0VZU1lNXyhLUEVOVEVSLEtleXBhZF9FbnRlcikgICAgXAorICAgIF9LRVlTWU1fKEtQRE9ULEtleXBhZF9QZXJpb2QpICAgXAorICAgIF9LRVlTWU1fKEtQRVFVQUwsS2V5cGFkX0VxdWFscykgICBcCisgICAgX0tFWVNZTV8oTlVNTE9DSyxOdW1Mb2NrKSBcCisgICAgX0tFWVNZTV8oS1AxLEtleXBhZF8xKSAgICAgICAgIFwKKyAgICBfS0VZU1lNXyhLUDIsS2V5cGFkXzIpICAgICAgICAgXAorICAgIF9LRVlTWU1fKEtQMyxLZXlwYWRfMykgICAgICAgICBcCisgICAgX0tFWVNZTV8oS1A0LEtleXBhZF80KSAgICAgICAgIFwKKyAgICBfS0VZU1lNXyhLUDUsS2V5cGFkXzUpICAgICAgICAgXAorICAgIF9LRVlTWU1fKEtQNixLZXlwYWRfNikgICAgICAgICBcCisgICAgX0tFWVNZTV8oS1A3LEtleXBhZF83KSAgICAgICAgIFwKKyAgICBfS0VZU1lNXyhLUDgsS2V5cGFkXzgpICAgICAgICAgXAorICAgIF9LRVlTWU1fKEtQOSxLZXlwYWRfOSkgICAgICAgICBcCisgICAgX0tFWVNZTV8oS1AwLEtleXBhZF8wKSAgICAgICAgIFwKKyAgICBfS0VZU1lNXyhVUCxVcCkgIFwKKyAgICBfS0VZU1lNXyhET1dOLERvd24pIFwKKyAgICBfS0VZU1lNXyhSSUdIVCxSaWdodCkgXAorICAgIF9LRVlTWU1fKExFRlQsTGVmdCkgXAorICAgIF9LRVlTWU1fKElOU0VSVCxJbnNlcnQpIFwKKyAgICBfS0VZU1lNXyhERUxFVEUsRGVsZXRlKSBcCisgICAgX0tFWVNZTV8oSE9NRSxIb21lKSBcCisgICAgX0tFWVNZTV8oSE9NRVBBR0UsSG9tZVBhZ2UpIFwKKyAgICBfS0VZU1lNXyhFTkQsRW5kKSBcCisgICAgX0tFWVNZTV8oUEFHRVVQLFBhZ2VVcCkgXAorICAgIF9LRVlTWU1fKFBBR0VET1dOLFBhZ2VEb3duKSBcCisgICAgX0tFWVNZTTFfKEYxKSBcCisgICAgX0tFWVNZTTFfKEYyKSBcCisgICAgX0tFWVNZTTFfKEYzKSBcCisgICAgX0tFWVNZTTFfKEY0KSBcCisgICAgX0tFWVNZTTFfKEY1KSBcCisgICAgX0tFWVNZTTFfKEY2KSBcCisgICAgX0tFWVNZTTFfKEY3KSBcCisgICAgX0tFWVNZTTFfKEY4KSBcCisgICAgX0tFWVNZTTFfKEY5KSBcCisgICAgX0tFWVNZTTFfKEYxMCkgXAorICAgIF9LRVlTWU0xXyhGMTEpIFwKKyAgICBfS0VZU1lNMV8oRjEyKSBcCisgICAgX0tFWVNZTTFfKEYxMykgXAorICAgIF9LRVlTWU0xXyhGMTQpIFwKKyAgICBfS0VZU1lNMV8oRjE1KSBcCisgICAgX0tFWVNZTTFfKFBSSU5UKSBcCisgICAgX0tFWVNZTTFfKEJSRUFLKSBcCisgICAgX0tFWVNZTTFfKFBMQVlQQVVTRSkgXAorICAgIF9LRVlTWU0xXyhSRVdJTkQpIFwKKyAgICBfS0VZU1lNMV8oRkFTVEZPUldBUkQpIFwKKyAgICBfS0VZU1lNMV8oQVBQU1dJVENIKSBcCisKKyNkZWZpbmUgX0tFWVNZTV8oeCx5KSAgIHsgS0VZXyMjeCwgI3kgfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBpbnQgIF9zeW07IGNvbnN0IGNoYXIqICBfc3RyOyB9ICBrZXlzeW1fbmFtZXNbXSA9Cit7CisgICAgX0tFWVNZTV9MSVNUCit9OworI3VuZGVmIF9LRVlTWU1fCisKK3N0YXRpYyBjb25zdCBpbnQga2V5c3ltX25hbWVzX3NpemUgPQorICAgICAgICAoaW50KShzaXplb2Yoa2V5c3ltX25hbWVzKSAvIHNpemVvZihrZXlzeW1fbmFtZXNbMF0pKTsKKworaW50IHNraW5fa2V5X2NvZGVfY291bnQoIHZvaWQgKQoreworICAgIHJldHVybiBrZXlzeW1fbmFtZXNfc2l6ZTsKK30KKworY29uc3QgY2hhcioKK3NraW5fa2V5X2NvZGVfc3RyKCBpbnQgIGluZGV4ICkKK3sKKyAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtleXN5bV9uYW1lc19zaXplKSB7CisgICAgICAgIHJldHVybiBrZXlzeW1fbmFtZXNbaW5kZXhdLl9zdHI7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBza2luX2tleV9wYWlyX3RvX3N0cmluZyh1aW50MzJfdCBrZXljb2RlLCB1aW50MzJfdCBtb2QpIHsKKyAgICBzdGF0aWMgY2hhciAgdGVtcFszMl07CisgICAgY2hhciogICAgICAgIHAgPSB0ZW1wOworICAgIGNoYXIqICAgICAgICBlbmQgPSBwICsgc2l6ZW9mKHRlbXApOworICAgIGludCAgICAgICAgICBubjsKKworICAgIGlmICgobW9kICYga0tleU1vZExDdHJsKSAhPSAwKSB7CisgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICJDdHJsLSIpOworICAgIH0KKyAgICBpZiAoKG1vZCAmIGtLZXlNb2RSQ3RybCkgIT0gMCkgeworICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiUkN0cmwtIik7CisgICAgfQorICAgIGlmICgobW9kICYga0tleU1vZExTaGlmdCkgIT0gMCkgeworICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiU2hpZnQtIik7CisgICAgfQorICAgIGlmICgobW9kICYga0tleU1vZFJTaGlmdCkgIT0gMCkgeworICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiUlNoaWZ0LSIpOworICAgIH0KKyAgICBpZiAoKG1vZCAmIGtLZXlNb2RMQWx0KSAhPSAwKSB7CisgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICJBbHQtIik7CisgICAgfQorICAgIGlmICgobW9kICYga0tleU1vZFJBbHQpICE9IDApIHsKKyAgICAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIlJBbHQtIik7CisgICAgfQorICAgIGZvciAobm4gPSAwOyBubiA8IGtleXN5bV9uYW1lc19zaXplOyArK25uKSB7CisgICAgICAgIGlmIChrZXlzeW1fbmFtZXNbbm5dLl9zeW0gPT0ga2V5Y29kZSkgeworICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiVzIiwga2V5c3ltX25hbWVzW25uXS5fc3RyKTsKKyAgICAgICAgICAgIHJldHVybiB0ZW1wOzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChrZXljb2RlID49IDMyICYmIGtleWNvZGUgPD0gMTI3KSB7CisgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICIlYyIsIChpbnQpa2V5Y29kZSk7CisgICAgICAgIHJldHVybiB0ZW1wOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvLyBDb252ZXJ0IGEgdGV4dHVhbCBrZXkgZGVzY3JpcHRpb24gfHN0cnwgKGUuZy4gIkN0cmwtSyIpIGludG8gYSBwYWlyCisvLyBpZiAoU2tpbktleUNvZGUsU2tpbktleU1vZCkgdmFsdWVzLiBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cworLy8gfCprZXljb2RlfCBhbmQgfCptb2R8LiBPbiBmYWlsdXJlLCByZXR1cm4gZmFsc2UuCitib29sIHNraW5fa2V5X3BhaXJfZnJvbV9zdHJpbmcoY29uc3QgY2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwa2V5Y29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcG1vZCkgeworICAgIHVpbnQzMl90ICAgICBtb2QgPSAwOworICAgIGludCAgICAgICAgICBtYXRjaCA9IDE7CisgICAgaW50ICAgICAgICAgIG5uOworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeyBjb25zdCBjaGFyKiAgcHJlZml4OyBpbnQgIG1vZDsgfSAgbW9kc1tdID0KKyAgICB7CisgICAgICAgIHsgIl4iLCAgICAgIGtLZXlNb2RMQ3RybCB9LAorICAgICAgICB7ICJDdHJsIiwgICBrS2V5TW9kTEN0cmwgfSwKKyAgICAgICAgeyAiY3RybCIsICAga0tleU1vZExDdHJsIH0sCisgICAgICAgIHsgIlJDdHJsIiwgIGtLZXlNb2RSQ3RybCB9LAorICAgICAgICB7ICJyY3RybCIsICBrS2V5TW9kUkN0cmwgfSwKKyAgICAgICAgeyAiQWx0IiwgICAga0tleU1vZExBbHQgfSwKKyAgICAgICAgeyAiYWx0IiwgICAga0tleU1vZExBbHQgfSwKKyAgICAgICAgeyAiUkFsdCIsICAga0tleU1vZFJBbHQgfSwKKyAgICAgICAgeyAicmFsdCIsICAga0tleU1vZFJBbHQgfSwKKyAgICAgICAgeyAiU2hpZnQiLCAga0tleU1vZExTaGlmdCB9LAorICAgICAgICB7ICJzaGlmdCIsICBrS2V5TW9kTFNoaWZ0IH0sCisgICAgICAgIHsgIlJTaGlmdCIsIGtLZXlNb2RSU2hpZnQgfSwKKyAgICAgICAgeyAicnNoaWZ0Iiwga0tleU1vZFJTaGlmdCB9LAorICAgICAgICB7IE5VTEwsIDAgfQorICAgIH07CisKKyAgICB3aGlsZSAobWF0Y2gpIHsKKyAgICAgICAgbWF0Y2ggPSAwOworICAgICAgICBmb3IgKG5uID0gMDsgbW9kc1tubl0ubW9kICE9IDA7ICsrbm4pIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcmVmaXggPSBtb2RzW25uXS5wcmVmaXg7CisgICAgICAgICAgICBpbnQgICAgICAgICAgbGVuICAgID0gc3RybGVuKHByZWZpeCk7CisKKyAgICAgICAgICAgIGlmICggIXN0cm5jbXAoc3RyLCBwcmVmaXgsIGxlbikgKSB7CisgICAgICAgICAgICAgICAgc3RyICArPSBsZW47CisgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOworICAgICAgICAgICAgICAgIG1vZCAgfD0gbW9kc1tubl0ubW9kOworICAgICAgICAgICAgICAgIGlmIChzdHJbMF0gPT0gJy0nICYmIHN0clsxXSAhPSAwKQorICAgICAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAobm4gPSAwOyBubiA8IGtleXN5bV9uYW1lc19zaXplOyArK25uKSB7CisjaWZkZWYgX1dJTjMyCisgICAgICAgIGlmICggIXN0cmljbXAoc3RyLCBrZXlzeW1fbmFtZXNbbm5dLl9zdHIpICkKKyNlbHNlCisgICAgICAgIGlmICggIXN0cmNhc2VjbXAoc3RyLCBrZXlzeW1fbmFtZXNbbm5dLl9zdHIpICkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAqcGtleWNvZGUgPSBrZXlzeW1fbmFtZXNbbm5dLl9zeW07CisgICAgICAgICAgICAqcG1vZCA9IG1vZDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzRhYzNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4va2V5Y29kZS5oCkBAIC0wLDAgKzEsMTgxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9hbmRyb2lkX2tleWNvZGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2xpbnV4X2tleWNvZGVzLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIERlZmluZSBsYXlvdXQtaW5kZXBlbmRlbnQga2V5IGNvZGVzLiBUaGluayBvZiBpdCBhcyAidGhlIHVzZXIgcHJlc3NlZAorICogdGhlIGtleSB0aGF0IGNvcnJlc3BvbmRzIHRvIFEgb24gYSBVUyBRV0VSVFkga2V5Ym9hcmQiLgorICoKKyAqIFRoZSB2YWx1ZXMgaGVyZSBtdXN0IG1hdGNoIHRoZSBMaW51eCBrZXljb2RlcyBzaW5jZSB0aGV5IGFyZSBzZW50CisgKiB0byB0aGUgZ3Vlc3Qga2VybmVsIGRpcmVjdGx5LgorICovCisKKy8qIEtlZXAgaXQgY29uc2lzdGVudCB3aXRoIGxpbnV4L2lucHV0LmggKi8KK3R5cGVkZWYgZW51bSB7CisgICAga0tleUNvZGVTb2Z0TGVmdCAgICAgICAgICAgICAgICA9IEtFWV9TT0ZUMSwKKyAgICBrS2V5Q29kZVNvZnRSaWdodCAgICAgICAgICAgICAgID0gS0VZX1NPRlQyLAorICAgIGtLZXlDb2RlSG9tZSAgICAgICAgICAgICAgICAgICAgPSBLRVlfSE9NRSwKKyAgICBrS2V5Q29kZUhvbWVQYWdlICAgICAgICAgICAgICAgID0gS0VZX0hPTUVQQUdFLAorICAgIGtLZXlDb2RlQmFjayAgICAgICAgICAgICAgICAgICAgPSBLRVlfQkFDSywKKyAgICBrS2V5Q29kZUNhbGwgICAgICAgICAgICAgICAgICAgID0gS0VZX1NFTkQsCisgICAga0tleUNvZGVFbmRDYWxsICAgICAgICAgICAgICAgICA9IEtFWV9FTkQsCisgICAga0tleUNvZGUwICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV8wLAorICAgIGtLZXlDb2RlMSAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfMSwKKyAgICBrS2V5Q29kZTIgICAgICAgICAgICAgICAgICAgICAgID0gS0VZXzIsCisgICAga0tleUNvZGUzICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV8zLAorICAgIGtLZXlDb2RlNCAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfNCwKKyAgICBrS2V5Q29kZTUgICAgICAgICAgICAgICAgICAgICAgID0gS0VZXzUsCisgICAga0tleUNvZGU2ICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV82LAorICAgIGtLZXlDb2RlNyAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfNywKKyAgICBrS2V5Q29kZTggICAgICAgICAgICAgICAgICAgICAgID0gS0VZXzgsCisgICAga0tleUNvZGU5ICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV85LAorICAgIGtLZXlDb2RlU3RhciAgICAgICAgICAgICAgICAgICAgPSBLRVlfU1RBUiwKKyAgICBrS2V5Q29kZVBvdW5kICAgICAgICAgICAgICAgICAgID0gS0VZX1NIQVJQLAorICAgIGtLZXlDb2RlRHBhZFVwICAgICAgICAgICAgICAgICAgPSBLRVlfVVAsCisgICAga0tleUNvZGVEcGFkRG93biAgICAgICAgICAgICAgICA9IEtFWV9ET1dOLAorICAgIGtLZXlDb2RlRHBhZExlZnQgICAgICAgICAgICAgICAgPSBLRVlfTEVGVCwKKyAgICBrS2V5Q29kZURwYWRSaWdodCAgICAgICAgICAgICAgID0gS0VZX1JJR0hULAorICAgIGtLZXlDb2RlRHBhZENlbnRlciAgICAgICAgICAgICAgPSBLRVlfQ0VOVEVSLAorICAgIGtLZXlDb2RlVm9sdW1lVXAgICAgICAgICAgICAgICAgPSBLRVlfVk9MVU1FVVAsCisgICAga0tleUNvZGVWb2x1bWVEb3duICAgICAgICAgICAgICA9IEtFWV9WT0xVTUVET1dOLAorICAgIGtLZXlDb2RlUG93ZXIgICAgICAgICAgICAgICAgICAgPSBLRVlfUE9XRVIsCisgICAga0tleUNvZGVDYW1lcmEgICAgICAgICAgICAgICAgICA9IEtFWV9DQU1FUkEsCisgICAga0tleUNvZGVDbGVhciAgICAgICAgICAgICAgICAgICA9IEtFWV9DTEVBUiwKKyAgICBrS2V5Q29kZUEgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX0EsCisgICAga0tleUNvZGVCICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9CLAorICAgIGtLZXlDb2RlQyAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfQywKKyAgICBrS2V5Q29kZUQgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX0QsCisgICAga0tleUNvZGVFICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9FLAorICAgIGtLZXlDb2RlRiAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfRiwKKyAgICBrS2V5Q29kZUcgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX0csCisgICAga0tleUNvZGVIICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9ILAorICAgIGtLZXlDb2RlSSAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfSSwKKyAgICBrS2V5Q29kZUogICAgICAgICAgICAgICAgICAgICAgID0gS0VZX0osCisgICAga0tleUNvZGVLICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9LLAorICAgIGtLZXlDb2RlTCAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfTCwKKyAgICBrS2V5Q29kZU0gICAgICAgICAgICAgICAgICAgICAgID0gS0VZX00sCisgICAga0tleUNvZGVOICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9OLAorICAgIGtLZXlDb2RlTyAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfTywKKyAgICBrS2V5Q29kZVAgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX1AsCisgICAga0tleUNvZGVRICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9RLAorICAgIGtLZXlDb2RlUiAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfUiwKKyAgICBrS2V5Q29kZVMgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX1MsCisgICAga0tleUNvZGVUICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9ULAorICAgIGtLZXlDb2RlVSAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfVSwKKyAgICBrS2V5Q29kZVYgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX1YsCisgICAga0tleUNvZGVXICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9XLAorICAgIGtLZXlDb2RlWCAgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfWCwKKyAgICBrS2V5Q29kZVkgICAgICAgICAgICAgICAgICAgICAgID0gS0VZX1ksCisgICAga0tleUNvZGVaICAgICAgICAgICAgICAgICAgICAgICA9IEtFWV9aLAorCisgICAga0tleUNvZGVDb21tYSAgICAgICAgICAgICAgICAgICA9IEtFWV9DT01NQSwKKyAgICBrS2V5Q29kZVBlcmlvZCAgICAgICAgICAgICAgICAgID0gS0VZX0RPVCwKKyAgICBrS2V5Q29kZUFsdExlZnQgICAgICAgICAgICAgICAgID0gS0VZX0xFRlRBTFQsCisgICAga0tleUNvZGVBbHRSaWdodCAgICAgICAgICAgICAgICA9IEtFWV9SSUdIVEFMVCwKKyAgICBrS2V5Q29kZUNhcExlZnQgICAgICAgICAgICAgICAgID0gS0VZX0xFRlRTSElGVCwKKyAgICBrS2V5Q29kZUNhcFJpZ2h0ICAgICAgICAgICAgICAgID0gS0VZX1JJR0hUU0hJRlQsCisgICAga0tleUNvZGVUYWIgICAgICAgICAgICAgICAgICAgICA9IEtFWV9UQUIsCisgICAga0tleUNvZGVTcGFjZSAgICAgICAgICAgICAgICAgICA9IEtFWV9TUEFDRSwKKyAgICBrS2V5Q29kZVN5bSAgICAgICAgICAgICAgICAgICAgID0gS0VZX0NPTVBPU0UsCisgICAga0tleUNvZGVFeHBsb3JlciAgICAgICAgICAgICAgICA9IEtFWV9XV1csCisgICAga0tleUNvZGVFbnZlbG9wZSAgICAgICAgICAgICAgICA9IEtFWV9NQUlMLAorICAgIGtLZXlDb2RlTmV3bGluZSAgICAgICAgICAgICAgICAgPSBLRVlfRU5URVIsCisgICAga0tleUNvZGVEZWwgICAgICAgICAgICAgICAgICAgICA9IEtFWV9CQUNLU1BBQ0UsCisgICAga0tleUNvZGVHcmF2ZSAgICAgICAgICAgICAgICAgICA9IDM5OSwKKyAgICBrS2V5Q29kZU1pbnVzICAgICAgICAgICAgICAgICAgID0gS0VZX01JTlVTLAorICAgIGtLZXlDb2RlRXF1YWxzICAgICAgICAgICAgICAgICAgPSBLRVlfRVFVQUwsCisgICAga0tleUNvZGVMZWZ0QnJhY2tldCAgICAgICAgICAgICA9IEtFWV9MRUZUQlJBQ0UsCisgICAga0tleUNvZGVSaWdodEJyYWNrZXQgICAgICAgICAgICA9IEtFWV9SSUdIVEJSQUNFLAorICAgIGtLZXlDb2RlQmFja3NsYXNoICAgICAgICAgICAgICAgPSBLRVlfQkFDS1NMQVNILAorICAgIGtLZXlDb2RlU2VtaWNvbG9uICAgICAgICAgICAgICAgPSBLRVlfU0VNSUNPTE9OLAorICAgIGtLZXlDb2RlQXBvc3Ryb3BoZSAgICAgICAgICAgICAgPSBLRVlfQVBPU1RST1BIRSwKKyAgICBrS2V5Q29kZVNsYXNoICAgICAgICAgICAgICAgICAgID0gS0VZX1NMQVNILAorICAgIGtLZXlDb2RlQXQgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfRU1BSUwsCisgICAga0tleUNvZGVOdW0gICAgICAgICAgICAgICAgICAgICA9IEtFWV9OVU0sCisgICAga0tleUNvZGVIZWFkc2V0SG9vayAgICAgICAgICAgICA9IEtFWV9IRUFEU0VUSE9PSywKKyAgICBrS2V5Q29kZUZvY3VzICAgICAgICAgICAgICAgICAgID0gS0VZX0ZPQ1VTLAorICAgIGtLZXlDb2RlUGx1cyAgICAgICAgICAgICAgICAgICAgPSBLRVlfUExVUywKKyAgICBrS2V5Q29kZU1lbnUgICAgICAgICAgICAgICAgICAgID0gS0VZX1NPRlQxLAorICAgIGtLZXlDb2RlTm90aWZpY2F0aW9uICAgICAgICAgICAgPSBLRVlfTk9USUZJQ0FUSU9OLAorICAgIGtLZXlDb2RlU2VhcmNoICAgICAgICAgICAgICAgICAgPSBLRVlfU0VBUkNILAorICAgIGtLZXlDb2RlVFYgICAgICAgICAgICAgICAgICAgICAgPSBLRVlfVFYsCisgICAga0tleUNvZGVFUEcgICAgICAgICAgICAgICAgICAgICA9IEtFWV9QUk9HUkFNLAorICAgIGtLZXlDb2RlRFZSICAgICAgICAgICAgICAgICAgICAgPSBLRVlfUFZSLAorICAgIGtLZXlDb2RlUHJldmlvdXMgICAgICAgICAgICAgICAgPSBLRVlfUFJFVklPVVMsCisgICAga0tleUNvZGVOZXh0ICAgICAgICAgICAgICAgICAgICA9IEtFWV9ORVhULAorICAgIGtLZXlDb2RlUGxheSAgICAgICAgICAgICAgICAgICAgPSBLRVlfUExBWSwKKyAgICBrS2V5Q29kZVBsYXlwYXVzZSAgICAgICAgICAgICAgID0gS0VZX1BMQVlQQVVTRSwKKyAgICBrS2V5Q29kZVBhdXNlICAgICAgICAgICAgICAgICAgID0gS0VZX1BBVVNFLAorICAgIGtLZXlDb2RlU3RvcCAgICAgICAgICAgICAgICAgICAgPSBLRVlfU1RPUCwKKyAgICBrS2V5Q29kZVJld2luZCAgICAgICAgICAgICAgICAgID0gS0VZX1JFV0lORCwKKyAgICBrS2V5Q29kZUZhc3RGb3J3YXJkICAgICAgICAgICAgID0gS0VZX0ZBU1RGT1JXQVJELAorICAgIGtLZXlDb2RlQm9va21hcmtzICAgICAgICAgICAgICAgPSBLRVlfQk9PS01BUktTLAorICAgIGtLZXlDb2RlQ3ljbGVXaW5kb3dzICAgICAgICAgICAgPSBLRVlfQ1lDTEVXSU5ET1dTLAorICAgIGtLZXlDb2RlQ2hhbm5lbFVwICAgICAgICAgICAgICAgPSBLRVlfQ0hBTk5FTFVQLAorICAgIGtLZXlDb2RlQ2hhbm5lbERvd24gICAgICAgICAgICAgPSBLRVlfQ0hBTk5FTERPV04sCisgICAga0tleUNvZGVBcHBTd2l0Y2ggICAgICAgICAgICAgICA9IEtFWV9BUFBTV0lUQ0gsCisKK30gU2tpbktleUNvZGU7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByb3RhdGUgRC1QYWQga2V5Y29kZXMsIHdoaWxlIGxlYXZpbmcgb3RoZXIgb25lcworICogdW50b3VjaGVkLiAnY29kZScgaXMgdGhlIGlucHV0IGtleWNvZGUsIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYXMgaXMgaWYKKyAqIGl0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhIEQtUGFkIGFycm93LiAncm90YXRpb24nIGlzIHRoZSBudW1iZXIgb2YKKyAqICpjbG9ja3dpc2UqIDkwIGRlZ3JlZXMgcm90YXRpb25zIHRvIHBlcmZvcm0gb24gRC1QYWQga2V5cy4KKyAqCisgKiBIZXJlIGFyZSBleGFtcGxlczoKKyAqICAgIHNraW5fa2V5Y29kZV9yb3RhdGUoIGtLZXlDb2RlRHBhZFVwLCAxICkgID0+IGtLZXlDb2RlRHBhZFJpZ2h0CisgKiAgICBza2luX2tleWNvZGVfcm90YXRlKCBrS2V5Q29kZURwYWRSaWdodCwgMiApID0+IGtLZXlDb2RlRHBhZExlZnQKKyAqICAgIHNraW5fa2V5Y29kZV9yb3RhdGUoIGtLZXlDb2RlRHBhZERvd24sIDMgKSA9PiBrS2V5Q29kZURwYWRSaWdodAorICogICAgc2tpbl9rZXljb2RlX3JvdGF0ZSgga0tleUNvZGVTcGFjZSwgbiApID0+IGtLZXlDb2RlU3BhY2UgaW5kZXBlbmRlbnQgb2YgbgorICovCitleHRlcm4gU2tpbktleUNvZGUgc2tpbl9rZXljb2RlX3JvdGF0ZSggU2tpbktleUNvZGUgIGNvZGUsIGludCAgcm90YXRpb24gKTsKKworZXh0ZXJuIGludCBza2luX2tleV9jb2RlX2NvdW50KHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIqIHNraW5fa2V5X2NvZGVfc3RyKGludCBpbmRleCk7CisKKworLy8gQml0IGZsYWcgZm9yIGtleSBtb2RpZmllcnMgbGlrZSBDdHJsIG9yIEFsdC4KK3R5cGVkZWYgZW51bSB7CisgICAga0tleU1vZExDdHJsICA9ICgxVSA8PCAwKSwgIC8vIGxlZnQtY29udHJvbCBrZXkKKyAgICBrS2V5TW9kUkN0cmwgID0gKDFVIDw8IDEpLCAgLy8gcmlnaHQtY29udHJvbAorICAgIGtLZXlNb2RMQWx0ICAgPSAoMVUgPDwgMiksICAvLyBsZWZ0LWFsdAorICAgIGtLZXlNb2RSQWx0ICAgPSAoMVUgPDwgMyksICAvLyByaWdodC1hbHQKKyAgICBrS2V5TW9kTFNoaWZ0ID0gKDFVIDw8IDQpLCAgLy8gbGVmdC1zaGlmdAorICAgIGtLZXlNb2RSU2hpZnQgPSAoMVUgPDwgNSksICAvLyByaWdodC1zaGlmdAorICAgIGtLZXlNb2ROdW1Mb2NrID0gKDFVIDw8IDYpLCAgLy8gbnVtbG9jaworCit9IFNraW5LZXlNb2Q7CisKKy8vIENvbnZlcnQgYSBwYWlyIG9mIChTa2luS2V5Q29kZSxTa2luS2V5TW9kKSB2YWx1ZXMgaW50byBhIGh1bWFuLXJlYWRhYmxlCisvLyBzdHJpbmcuIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYSBzdGF0aWMgc3RyaW5nIHRoYXQgaXMgb3ZlcndyaXR0ZW4gb24KKy8vIGVhY2ggY2FsbC4KKy8vIHxrZXljb2RlfCBpcyB0aGUgbGF5b3V0LWluZGVwZW5kZW50IFNraW5LZXlDb2RlLgorLy8gfG1vZHwgaXMgYSBzZXQgb2YgU2tpbktleU1vZCBiaXQgZmxhZ3MuCitleHRlcm4gY29uc3QgY2hhciogc2tpbl9rZXlfcGFpcl90b19zdHJpbmcodWludDMyX3Qga2V5Y29kZSwgdWludDMyX3QgbW9kKTsKKworLy8gQ29udmVydCBhIHRleHR1YWwga2V5IGRlc2NyaXB0aW9uIHxzdHJ8IChlLmcuICJDdHJsLUsiKSBpbnRvIGEgcGFpcgorLy8gaWYgKFNraW5LZXlDb2RlLFNraW5LZXlNb2QpIHZhbHVlcy4gT24gc3VjY2VzcywgcmV0dXJuIHRydWUgYW5kIHNldHMKKy8vIHwqa2V5Y29kZXwgYW5kIHwqbW9kfC4gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlLgorZXh0ZXJuIGJvb2wgc2tpbl9rZXlfcGFpcl9mcm9tX3N0cmluZyhjb25zdCBjaGFyKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBrZXljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbW9kKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9rZXljb2RlX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2tleWNvZGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDNjODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9rZXljb2RlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEwOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9rZXljb2RlLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZF9za2luIHsKKworI2RlZmluZSBBUlJBWUxFTih4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK25hbWVzcGFjZSB7CisKKy8vIFNoYXJlZCB0YWJsZSBvZiBrZXkgcGFpciBzYW1wbGVzIGZvciB0ZXN0aW5nIHN0cmluZyBtYXBwaW5nIGZ1bmN0aW9ucy4KK2NvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogc3RyaW5nOworICAgIHVpbnQzMl90IGNvZGU7CisgICAgdWludDMyX3QgbW9kOworfSBrS2V5UGFpckRhdGFbXSA9IHsKKyAgICB7ICJGMSIsIEtFWV9GMSwgMCB9LAorICAgIHsgIkN0cmwtRjIiLCBLRVlfRjIsIGtLZXlNb2RMQ3RybCB9LAorICAgIHsgIlJDdHJsLUEiLCBLRVlfQSwga0tleU1vZFJDdHJsIH0sCisgICAgeyAiQWx0LVJldHVybiIsIEtFWV9FTlRFUiwga0tleU1vZExBbHQgfSwKKyAgICB7ICJSQWx0LUNvbW1hIiwgS0VZX0NPTU1BLCBrS2V5TW9kUkFsdCB9LAorICAgIHsgIlNoaWZ0LTMiLCBLRVlfMywga0tleU1vZExTaGlmdCB9LAorICAgIHsgIlJTaGlmdC1LZXlwYWRfNSIsIEtFWV9LUDUsIGtLZXlNb2RSU2hpZnQgfSwKKyAgICB7ICJDdHJsLVNoaWZ0LUFsdC1EZWxldGUiLCBLRVlfREVMRVRFLAorICAgICAgICAgICAga0tleU1vZExDdHJsfGtLZXlNb2RMU2hpZnR8a0tleU1vZExBbHQgfSwKK307CisKK2NvbnN0IHNpemVfdCBrS2V5UGFpckRhdGFMZW4gPSBBUlJBWUxFTihrS2V5UGFpckRhdGEpOworCit9ICAvLyBuYW1lc3BhY2UKKworCitURVNUKGtleWNvZGUsc2tpbl9rZXljb2RlX3JvdGF0ZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBTa2luS2V5Q29kZSBleHBlY3RlZDsKKyAgICAgICAgU2tpbktleUNvZGUgY29kZTsKKyAgICAgICAgaW50IHJvdGF0aW9uOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyBrS2V5Q29kZURwYWRVcCwga0tleUNvZGVEcGFkVXAsIDAgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWRSaWdodCwga0tleUNvZGVEcGFkVXAsIDEgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWREb3duLCBrS2V5Q29kZURwYWRVcCwgMiB9LAorICAgICAgICB7IGtLZXlDb2RlRHBhZExlZnQsIGtLZXlDb2RlRHBhZFVwLCAzIH0sCisKKyAgICAgICAgeyBrS2V5Q29kZURwYWRMZWZ0LCBrS2V5Q29kZURwYWRMZWZ0LCAwIH0sCisgICAgICAgIHsga0tleUNvZGVEcGFkVXAsIGtLZXlDb2RlRHBhZExlZnQsIDEgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWRSaWdodCwga0tleUNvZGVEcGFkTGVmdCwgMiB9LAorICAgICAgICB7IGtLZXlDb2RlRHBhZERvd24sIGtLZXlDb2RlRHBhZExlZnQsIDMgfSwKKworICAgICAgICB7IGtLZXlDb2RlRHBhZERvd24sIGtLZXlDb2RlRHBhZERvd24sIDAgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWRMZWZ0LCBrS2V5Q29kZURwYWREb3duLCAxIH0sCisgICAgICAgIHsga0tleUNvZGVEcGFkVXAsIGtLZXlDb2RlRHBhZERvd24sIDIgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWRSaWdodCwga0tleUNvZGVEcGFkRG93biwgMyB9LAorCisgICAgICAgIHsga0tleUNvZGVEcGFkUmlnaHQsIGtLZXlDb2RlRHBhZFJpZ2h0LCAwIH0sCisgICAgICAgIHsga0tleUNvZGVEcGFkRG93biwga0tleUNvZGVEcGFkUmlnaHQsIDEgfSwKKyAgICAgICAgeyBrS2V5Q29kZURwYWRMZWZ0LCBrS2V5Q29kZURwYWRSaWdodCwgMiB9LAorICAgICAgICB7IGtLZXlDb2RlRHBhZFVwLCBrS2V5Q29kZURwYWRSaWdodCwgMyB9LAorCisgICAgICAgIHsga0tleUNvZGVBLCBrS2V5Q29kZUEsIDAgfSwKKyAgICAgICAgeyBrS2V5Q29kZUEsIGtLZXlDb2RlQSwgMSB9LAorICAgICAgICB7IGtLZXlDb2RlQSwga0tleUNvZGVBLCAyIH0sCisgICAgICAgIHsga0tleUNvZGVBLCBrS2V5Q29kZUEsIDMgfSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YUxlbiA9IEFSUkFZTEVOKGtEYXRhKTsKKworICAgIGZvciAoc2l6ZV90IG5uID0gMDsgbm4gPCBrRGF0YUxlbjsgKytubikgeworICAgICAgICBTa2luS2V5Q29kZSBjb2RlID0ga0RhdGFbbm5dLmNvZGU7CisgICAgICAgIGludCByb3RhdGlvbiA9IGtEYXRhW25uXS5yb3RhdGlvbjsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25uXS5leHBlY3RlZCwgc2tpbl9rZXljb2RlX3JvdGF0ZShjb2RlLCByb3RhdGlvbikpCisgICAgICAgICAgICAgICAgPDwgImNvZGU9IiA8PCBjb2RlIDw8ICIgcm90YXRpb249IiA8PCByb3RhdGlvbjsKKyAgICB9Cit9CisKK1RFU1Qoa2V5Y29kZSwgc2tpbl9rZXlfcGFpcl90b19zdHJpbmcpIHsKKyAgICBmb3IgKHNpemVfdCBubiA9IDA7IG5uIDwga0tleVBhaXJEYXRhTGVuOyArK25uKSB7CisgICAgICAgIHVpbnQzMl90IGNvZGUgPSBrS2V5UGFpckRhdGFbbm5dLmNvZGU7CisgICAgICAgIHVpbnQzMl90IG1vZCA9IGtLZXlQYWlyRGF0YVtubl0ubW9kOworICAgICAgICBFWFBFQ1RfU1RSRVEoa0tleVBhaXJEYXRhW25uXS5zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICBza2luX2tleV9wYWlyX3RvX3N0cmluZyhjb2RlLCBtb2QpKQorICAgICAgICAgICAgICAgIDw8ICJjb2RlPSIgPDwgY29kZSA8PCAiIG1vZD0iIDw8IG1vZDsKKyAgICB9Cit9CisKK1RFU1Qoa2V5Y29kZSwgc2tpbl9rZXlfcGFpcl9mcm9tX3N0cmluZykgeworICAgIGZvciAoc2l6ZV90IG5uID0gMDsgbm4gPCBrS2V5UGFpckRhdGFMZW47ICsrbm4pIHsKKyAgICAgICAgdWludDMyX3QgY29kZSA9IDA7CisgICAgICAgIHVpbnQzMl90IG1vZCA9IDA7CisgICAgICAgIEVYUEVDVF9UUlVFKHNraW5fa2V5X3BhaXJfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAgICAga0tleVBhaXJEYXRhW25uXS5zdHJpbmcsCisgICAgICAgICAgICAgICAgJmNvZGUsCisgICAgICAgICAgICAgICAgJm1vZCkpIDw8ICIjIiA8PCBubjsKKyAgICAgICAgRVhQRUNUX0VRKGtLZXlQYWlyRGF0YVtubl0uY29kZSwgY29kZSk7CisgICAgICAgIEVYUEVDVF9FUShrS2V5UGFpckRhdGFbbm5dLm1vZCwgbW9kKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkX3NraW4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL2xpbnV4X2tleWNvZGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9saW51eF9rZXljb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OThjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9saW51eF9rZXljb2Rlcy5oCkBAIC0wLDAgKzEsNTA1IEBACisjcHJhZ21hIG9uY2UKKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFZvanRlY2ggUGF2bGlrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogS2V5cyBhbmQgYnV0dG9ucworICovCisKKyNkZWZpbmUgS0VZX1JFU0VSVkVECQkwCisjZGVmaW5lIEtFWV9FU0MJCQkxCisjZGVmaW5lIEtFWV8xCQkJMgorI2RlZmluZSBLRVlfMgkJCTMKKyNkZWZpbmUgS0VZXzMJCQk0CisjZGVmaW5lIEtFWV80CQkJNQorI2RlZmluZSBLRVlfNQkJCTYKKyNkZWZpbmUgS0VZXzYJCQk3CisjZGVmaW5lIEtFWV83CQkJOAorI2RlZmluZSBLRVlfOAkJCTkKKyNkZWZpbmUgS0VZXzkJCQkxMAorI2RlZmluZSBLRVlfMAkJCTExCisjZGVmaW5lIEtFWV9NSU5VUwkJMTIKKyNkZWZpbmUgS0VZX0VRVUFMCQkxMworI2RlZmluZSBLRVlfQkFDS1NQQUNFCQkxNAorI2RlZmluZSBLRVlfVEFCCQkJMTUKKyNkZWZpbmUgS0VZX1EJCQkxNgorI2RlZmluZSBLRVlfVwkJCTE3CisjZGVmaW5lIEtFWV9FCQkJMTgKKyNkZWZpbmUgS0VZX1IJCQkxOQorI2RlZmluZSBLRVlfVAkJCTIwCisjZGVmaW5lIEtFWV9ZCQkJMjEKKyNkZWZpbmUgS0VZX1UJCQkyMgorI2RlZmluZSBLRVlfSQkJCTIzCisjZGVmaW5lIEtFWV9PCQkJMjQKKyNkZWZpbmUgS0VZX1AJCQkyNQorI2RlZmluZSBLRVlfTEVGVEJSQUNFCQkyNgorI2RlZmluZSBLRVlfUklHSFRCUkFDRQkJMjcKKyNkZWZpbmUgS0VZX0VOVEVSCQkyOAorI2RlZmluZSBLRVlfTEVGVENUUkwJCTI5CisjZGVmaW5lIEtFWV9BCQkJMzAKKyNkZWZpbmUgS0VZX1MJCQkzMQorI2RlZmluZSBLRVlfRAkJCTMyCisjZGVmaW5lIEtFWV9GCQkJMzMKKyNkZWZpbmUgS0VZX0cJCQkzNAorI2RlZmluZSBLRVlfSAkJCTM1CisjZGVmaW5lIEtFWV9KCQkJMzYKKyNkZWZpbmUgS0VZX0sJCQkzNworI2RlZmluZSBLRVlfTAkJCTM4CisjZGVmaW5lIEtFWV9TRU1JQ09MT04JCTM5CisjZGVmaW5lIEtFWV9BUE9TVFJPUEhFCQk0MAorI2RlZmluZSBLRVlfR1JBVkUJCTQxCisjZGVmaW5lIEtFWV9MRUZUU0hJRlQJCTQyCisjZGVmaW5lIEtFWV9CQUNLU0xBU0gJCTQzCisjZGVmaW5lIEtFWV9aCQkJNDQKKyNkZWZpbmUgS0VZX1gJCQk0NQorI2RlZmluZSBLRVlfQwkJCTQ2CisjZGVmaW5lIEtFWV9WCQkJNDcKKyNkZWZpbmUgS0VZX0IJCQk0OAorI2RlZmluZSBLRVlfTgkJCTQ5CisjZGVmaW5lIEtFWV9NCQkJNTAKKyNkZWZpbmUgS0VZX0NPTU1BCQk1MQorI2RlZmluZSBLRVlfRE9UCQkJNTIKKyNkZWZpbmUgS0VZX1NMQVNICQk1MworI2RlZmluZSBLRVlfUklHSFRTSElGVAkJNTQKKyNkZWZpbmUgS0VZX0tQQVNURVJJU0sJCTU1CisjZGVmaW5lIEtFWV9MRUZUQUxUCQk1NgorI2RlZmluZSBLRVlfU1BBQ0UJCTU3CisjZGVmaW5lIEtFWV9DQVBTTE9DSwkJNTgKKyNkZWZpbmUgS0VZX0YxCQkJNTkKKyNkZWZpbmUgS0VZX0YyCQkJNjAKKyNkZWZpbmUgS0VZX0YzCQkJNjEKKyNkZWZpbmUgS0VZX0Y0CQkJNjIKKyNkZWZpbmUgS0VZX0Y1CQkJNjMKKyNkZWZpbmUgS0VZX0Y2CQkJNjQKKyNkZWZpbmUgS0VZX0Y3CQkJNjUKKyNkZWZpbmUgS0VZX0Y4CQkJNjYKKyNkZWZpbmUgS0VZX0Y5CQkJNjcKKyNkZWZpbmUgS0VZX0YxMAkJCTY4CisjZGVmaW5lIEtFWV9OVU1MT0NLCQk2OQorI2RlZmluZSBLRVlfU0NST0xMTE9DSwkJNzAKKyNkZWZpbmUgS0VZX0tQNwkJCTcxCisjZGVmaW5lIEtFWV9LUDgJCQk3MgorI2RlZmluZSBLRVlfS1A5CQkJNzMKKyNkZWZpbmUgS0VZX0tQTUlOVVMJCTc0CisjZGVmaW5lIEtFWV9LUDQJCQk3NQorI2RlZmluZSBLRVlfS1A1CQkJNzYKKyNkZWZpbmUgS0VZX0tQNgkJCTc3CisjZGVmaW5lIEtFWV9LUFBMVVMJCTc4CisjZGVmaW5lIEtFWV9LUDEJCQk3OQorI2RlZmluZSBLRVlfS1AyCQkJODAKKyNkZWZpbmUgS0VZX0tQMwkJCTgxCisjZGVmaW5lIEtFWV9LUDAJCQk4MgorI2RlZmluZSBLRVlfS1BET1QJCTgzCisKKyNkZWZpbmUgS0VZX1pFTktBS1VIQU5LQUtVCTg1CisjZGVmaW5lIEtFWV8xMDJORAkJODYKKyNkZWZpbmUgS0VZX0YxMQkJCTg3CisjZGVmaW5lIEtFWV9GMTIJCQk4OAorI2RlZmluZSBLRVlfUk8JCQk4OQorI2RlZmluZSBLRVlfS0FUQUtBTkEJCTkwCisjZGVmaW5lIEtFWV9ISVJBR0FOQQkJOTEKKyNkZWZpbmUgS0VZX0hFTktBTgkJOTIKKyNkZWZpbmUgS0VZX0tBVEFLQU5BSElSQUdBTkEJOTMKKyNkZWZpbmUgS0VZX01VSEVOS0FOCQk5NAorI2RlZmluZSBLRVlfS1BKUENPTU1BCQk5NQorI2RlZmluZSBLRVlfS1BFTlRFUgkJOTYKKyNkZWZpbmUgS0VZX1JJR0hUQ1RSTAkJOTcKKyNkZWZpbmUgS0VZX0tQU0xBU0gJCTk4CisjZGVmaW5lIEtFWV9TWVNSUQkJOTkKKyNkZWZpbmUgS0VZX1JJR0hUQUxUCQkxMDAKKyNkZWZpbmUgS0VZX0xJTkVGRUVECQkxMDEKKyNkZWZpbmUgS0VZX0hPTUUJCTEwMgorI2RlZmluZSBLRVlfVVAJCQkxMDMKKyNkZWZpbmUgS0VZX1BBR0VVUAkJMTA0CisjZGVmaW5lIEtFWV9MRUZUCQkxMDUKKyNkZWZpbmUgS0VZX1JJR0hUCQkxMDYKKyNkZWZpbmUgS0VZX0VORAkJCTEwNworI2RlZmluZSBLRVlfRE9XTgkJMTA4CisjZGVmaW5lIEtFWV9QQUdFRE9XTgkJMTA5CisjZGVmaW5lIEtFWV9JTlNFUlQJCTExMAorI2RlZmluZSBLRVlfREVMRVRFCQkxMTEKKyNkZWZpbmUgS0VZX01BQ1JPCQkxMTIKKyNkZWZpbmUgS0VZX01VVEUJCTExMworI2RlZmluZSBLRVlfVk9MVU1FRE9XTgkJMTE0CisjZGVmaW5lIEtFWV9WT0xVTUVVUAkJMTE1CisjZGVmaW5lIEtFWV9QT1dFUgkJMTE2CisjZGVmaW5lIEtFWV9LUEVRVUFMCQkxMTcKKyNkZWZpbmUgS0VZX0tQUExVU01JTlVTCQkxMTgKKyNkZWZpbmUgS0VZX1BBVVNFCQkxMTkKKworI2RlZmluZSBLRVlfS1BDT01NQQkJMTIxCisjZGVmaW5lIEtFWV9IQU5HRVVMCQkxMjIKKyNkZWZpbmUgS0VZX0hBTkdVRUwJCUtFWV9IQU5HRVVMCisjZGVmaW5lIEtFWV9IQU5KQQkJMTIzCisjZGVmaW5lIEtFWV9ZRU4JCQkxMjQKKyNkZWZpbmUgS0VZX0xFRlRNRVRBCQkxMjUKKyNkZWZpbmUgS0VZX1JJR0hUTUVUQQkJMTI2CisjZGVmaW5lIEtFWV9DT01QT1NFCQkxMjcKKworI2RlZmluZSBLRVlfU1RPUAkJMTI4CisjZGVmaW5lIEtFWV9BR0FJTgkJMTI5CisjZGVmaW5lIEtFWV9QUk9QUwkJMTMwCisjZGVmaW5lIEtFWV9VTkRPCQkxMzEKKyNkZWZpbmUgS0VZX0ZST05UCQkxMzIKKyNkZWZpbmUgS0VZX0NPUFkJCTEzMworI2RlZmluZSBLRVlfT1BFTgkJMTM0CisjZGVmaW5lIEtFWV9QQVNURQkJMTM1CisjZGVmaW5lIEtFWV9GSU5ECQkxMzYKKyNkZWZpbmUgS0VZX0NVVAkJCTEzNworI2RlZmluZSBLRVlfSEVMUAkJMTM4CisjZGVmaW5lIEtFWV9NRU5VCQkxMzkKKyNkZWZpbmUgS0VZX0NBTEMJCTE0MAorI2RlZmluZSBLRVlfU0VUVVAJCTE0MQorI2RlZmluZSBLRVlfU0xFRVAJCTE0MgorI2RlZmluZSBLRVlfV0FLRVVQCQkxNDMKKyNkZWZpbmUgS0VZX0ZJTEUJCTE0NAorI2RlZmluZSBLRVlfU0VOREZJTEUJCTE0NQorI2RlZmluZSBLRVlfREVMRVRFRklMRQkJMTQ2CisjZGVmaW5lIEtFWV9YRkVSCQkxNDcKKyNkZWZpbmUgS0VZX1BST0cxCQkxNDgKKyNkZWZpbmUgS0VZX1BST0cyCQkxNDkKKyNkZWZpbmUgS0VZX1dXVwkJCTE1MAorI2RlZmluZSBLRVlfTVNET1MJCTE1MQorI2RlZmluZSBLRVlfQ09GRkVFCQkxNTIKKyNkZWZpbmUgS0VZX0RJUkVDVElPTgkJMTUzCisjZGVmaW5lIEtFWV9DWUNMRVdJTkRPV1MJMTU0CisjZGVmaW5lIEtFWV9NQUlMCQkxNTUKKyNkZWZpbmUgS0VZX0JPT0tNQVJLUwkJMTU2CisjZGVmaW5lIEtFWV9DT01QVVRFUgkJMTU3CisjZGVmaW5lIEtFWV9CQUNLCQkxNTgKKyNkZWZpbmUgS0VZX0ZPUldBUkQJCTE1OQorI2RlZmluZSBLRVlfQ0xPU0VDRAkJMTYwCisjZGVmaW5lIEtFWV9FSkVDVENECQkxNjEKKyNkZWZpbmUgS0VZX0VKRUNUQ0xPU0VDRAkxNjIKKyNkZWZpbmUgS0VZX05FWFRTT05HCQkxNjMKKyNkZWZpbmUgS0VZX1BMQVlQQVVTRQkJMTY0CisjZGVmaW5lIEtFWV9QUkVWSU9VU1NPTkcJMTY1CisjZGVmaW5lIEtFWV9TVE9QQ0QJCTE2NgorI2RlZmluZSBLRVlfUkVDT1JECQkxNjcKKyNkZWZpbmUgS0VZX1JFV0lORAkJMTY4CisjZGVmaW5lIEtFWV9QSE9ORQkJMTY5CisjZGVmaW5lIEtFWV9JU08JCQkxNzAKKyNkZWZpbmUgS0VZX0NPTkZJRwkJMTcxCisjZGVmaW5lIEtFWV9IT01FUEFHRQkJMTcyCisjZGVmaW5lIEtFWV9SRUZSRVNICQkxNzMKKyNkZWZpbmUgS0VZX0VYSVQJCTE3NAorI2RlZmluZSBLRVlfTU9WRQkJMTc1CisjZGVmaW5lIEtFWV9FRElUCQkxNzYKKyNkZWZpbmUgS0VZX1NDUk9MTFVQCQkxNzcKKyNkZWZpbmUgS0VZX1NDUk9MTERPV04JCTE3OAorI2RlZmluZSBLRVlfS1BMRUZUUEFSRU4JCTE3OQorI2RlZmluZSBLRVlfS1BSSUdIVFBBUkVOCTE4MAorI2RlZmluZSBLRVlfTkVXCQkJMTgxCisjZGVmaW5lIEtFWV9SRURPCQkxODIKKworI2RlZmluZSBLRVlfRjEzCQkJMTgzCisjZGVmaW5lIEtFWV9GMTQJCQkxODQKKyNkZWZpbmUgS0VZX0YxNQkJCTE4NQorI2RlZmluZSBLRVlfRjE2CQkJMTg2CisjZGVmaW5lIEtFWV9GMTcJCQkxODcKKyNkZWZpbmUgS0VZX0YxOAkJCTE4OAorI2RlZmluZSBLRVlfRjE5CQkJMTg5CisjZGVmaW5lIEtFWV9GMjAJCQkxOTAKKyNkZWZpbmUgS0VZX0YyMQkJCTE5MQorI2RlZmluZSBLRVlfRjIyCQkJMTkyCisjZGVmaW5lIEtFWV9GMjMJCQkxOTMKKyNkZWZpbmUgS0VZX0YyNAkJCTE5NAorCisjZGVmaW5lIEtFWV9QTEFZQ0QJCTIwMAorI2RlZmluZSBLRVlfUEFVU0VDRAkJMjAxCisjZGVmaW5lIEtFWV9QUk9HMwkJMjAyCisjZGVmaW5lIEtFWV9QUk9HNAkJMjAzCisjZGVmaW5lIEtFWV9TVVNQRU5ECQkyMDUKKyNkZWZpbmUgS0VZX0NMT1NFCQkyMDYKKyNkZWZpbmUgS0VZX1BMQVkJCTIwNworI2RlZmluZSBLRVlfRkFTVEZPUldBUkQJCTIwOAorI2RlZmluZSBLRVlfQkFTU0JPT1NUCQkyMDkKKyNkZWZpbmUgS0VZX1BSSU5UCQkyMTAKKyNkZWZpbmUgS0VZX0hQCQkJMjExCisjZGVmaW5lIEtFWV9DQU1FUkEJCTIxMgorI2RlZmluZSBLRVlfU09VTkQJCTIxMworI2RlZmluZSBLRVlfUVVFU1RJT04JCTIxNAorI2RlZmluZSBLRVlfRU1BSUwJCTIxNQorI2RlZmluZSBLRVlfQ0hBVAkJMjE2CisjZGVmaW5lIEtFWV9TRUFSQ0gJCTIxNworI2RlZmluZSBLRVlfQ09OTkVDVAkJMjE4CisjZGVmaW5lIEtFWV9GSU5BTkNFCQkyMTkKKyNkZWZpbmUgS0VZX1NQT1JUCQkyMjAKKyNkZWZpbmUgS0VZX1NIT1AJCTIyMQorI2RlZmluZSBLRVlfQUxURVJBU0UJCTIyMgorI2RlZmluZSBLRVlfQ0FOQ0VMCQkyMjMKKyNkZWZpbmUgS0VZX0JSSUdIVE5FU1NET1dOCTIyNAorI2RlZmluZSBLRVlfQlJJR0hUTkVTU1VQCTIyNQorI2RlZmluZSBLRVlfTUVESUEJCTIyNgorCisKKy8qWmV1czogdGhlc2Uga2V5cyBhcmUgZGVmaW5lZCBmb3IgT01BUDczMCBQZXJzZXVzMiovCisjZGVmaW5lIEtFWV9TVEFSCQkyMjcKKyNkZWZpbmUgS0VZX1NIQVJQCQkyMjgKKyNkZWZpbmUgS0VZX1NPRlQxCQkyMjkKKyNkZWZpbmUgS0VZX1NPRlQyCQkyMzAKKyNkZWZpbmUgS0VZX1NFTkQJCTIzMQorI2RlZmluZSBLRVlfQ0VOVEVSCQkyMzIKKyNkZWZpbmUgS0VZX0hFQURTRVRIT09LCQkyMzMKKyNkZWZpbmUgS0VZXzBfNQkJCTIzNAorI2RlZmluZSBLRVlfMl81CQkJMjM1CisKKyNkZWZpbmUgS0VZX1NXSVRDSFZJREVPTU9ERQkyMzYKKyNkZWZpbmUgS0VZX0tCRElMTFVNVE9HR0xFCTIzNworI2RlZmluZSBLRVlfS0JESUxMVU1ET1dOCTIzOAorI2RlZmluZSBLRVlfS0JESUxMVU1VUAkJMjM5CisKKyNkZWZpbmUgS0VZX1NFTkQJCTIzMQorI2RlZmluZSBLRVlfUkVQTFkJCTIzMgorI2RlZmluZSBLRVlfRk9SV0FSRE1BSUwJCTIzMworI2RlZmluZSBLRVlfU0FWRQkJMjM0CisjZGVmaW5lIEtFWV9ET0NVTUVOVFMJCTIzNQorCisjZGVmaW5lIEtFWV9CQVRURVJZCQkyMzYKKworI2RlZmluZSBLRVlfVU5LTk9XTgkJMjQwCisKKyNkZWZpbmUgS0VZX05VTSAgICAgICAgICAgICAgICAgMjQxCisjZGVmaW5lIEtFWV9GT0NVUyAgICAgICAgICAgICAgIDI0MgorI2RlZmluZSBLRVlfUExVUyAgICAgICAgICAgICAgICAyNDMKKyNkZWZpbmUgS0VZX05PVElGSUNBVElPTiAgICAgICAgMjQ0CisKKyNkZWZpbmUgQlROX01JU0MJCTB4MTAwCisjZGVmaW5lIEJUTl8wCQkJMHgxMDAKKyNkZWZpbmUgQlROXzEJCQkweDEwMQorI2RlZmluZSBCVE5fMgkJCTB4MTAyCisjZGVmaW5lIEJUTl8zCQkJMHgxMDMKKyNkZWZpbmUgQlROXzQJCQkweDEwNAorI2RlZmluZSBCVE5fNQkJCTB4MTA1CisjZGVmaW5lIEJUTl82CQkJMHgxMDYKKyNkZWZpbmUgQlROXzcJCQkweDEwNworI2RlZmluZSBCVE5fOAkJCTB4MTA4CisjZGVmaW5lIEJUTl85CQkJMHgxMDkKKworI2RlZmluZSBCVE5fTU9VU0UJCTB4MTEwCisjZGVmaW5lIEJUTl9MRUZUCQkweDExMAorI2RlZmluZSBCVE5fUklHSFQJCTB4MTExCisjZGVmaW5lIEJUTl9NSURETEUJCTB4MTEyCisjZGVmaW5lIEJUTl9TSURFCQkweDExMworI2RlZmluZSBCVE5fRVhUUkEJCTB4MTE0CisjZGVmaW5lIEJUTl9GT1JXQVJECQkweDExNQorI2RlZmluZSBCVE5fQkFDSwkJMHgxMTYKKyNkZWZpbmUgQlROX1RBU0sJCTB4MTE3CisKKyNkZWZpbmUgQlROX0pPWVNUSUNLCQkweDEyMAorI2RlZmluZSBCVE5fVFJJR0dFUgkJMHgxMjAKKyNkZWZpbmUgQlROX1RIVU1CCQkweDEyMQorI2RlZmluZSBCVE5fVEhVTUIyCQkweDEyMgorI2RlZmluZSBCVE5fVE9QCQkJMHgxMjMKKyNkZWZpbmUgQlROX1RPUDIJCTB4MTI0CisjZGVmaW5lIEJUTl9QSU5LSUUJCTB4MTI1CisjZGVmaW5lIEJUTl9CQVNFCQkweDEyNgorI2RlZmluZSBCVE5fQkFTRTIJCTB4MTI3CisjZGVmaW5lIEJUTl9CQVNFMwkJMHgxMjgKKyNkZWZpbmUgQlROX0JBU0U0CQkweDEyOQorI2RlZmluZSBCVE5fQkFTRTUJCTB4MTJhCisjZGVmaW5lIEJUTl9CQVNFNgkJMHgxMmIKKyNkZWZpbmUgQlROX0RFQUQJCTB4MTJmCisKKyNkZWZpbmUgQlROX0dBTUVQQUQJCTB4MTMwCisjZGVmaW5lIEJUTl9BCQkJMHgxMzAKKyNkZWZpbmUgQlROX0IJCQkweDEzMQorI2RlZmluZSBCVE5fQwkJCTB4MTMyCisjZGVmaW5lIEJUTl9YCQkJMHgxMzMKKyNkZWZpbmUgQlROX1kJCQkweDEzNAorI2RlZmluZSBCVE5fWgkJCTB4MTM1CisjZGVmaW5lIEJUTl9UTAkJCTB4MTM2CisjZGVmaW5lIEJUTl9UUgkJCTB4MTM3CisjZGVmaW5lIEJUTl9UTDIJCQkweDEzOAorI2RlZmluZSBCVE5fVFIyCQkJMHgxMzkKKyNkZWZpbmUgQlROX1NFTEVDVAkJMHgxM2EKKyNkZWZpbmUgQlROX1NUQVJUCQkweDEzYgorI2RlZmluZSBCVE5fTU9ERQkJMHgxM2MKKyNkZWZpbmUgQlROX1RIVU1CTAkJMHgxM2QKKyNkZWZpbmUgQlROX1RIVU1CUgkJMHgxM2UKKworI2RlZmluZSBCVE5fRElHSQkJMHgxNDAKKyNkZWZpbmUgQlROX1RPT0xfUEVOCQkweDE0MAorI2RlZmluZSBCVE5fVE9PTF9SVUJCRVIJCTB4MTQxCisjZGVmaW5lIEJUTl9UT09MX0JSVVNICQkweDE0MgorI2RlZmluZSBCVE5fVE9PTF9QRU5DSUwJCTB4MTQzCisjZGVmaW5lIEJUTl9UT09MX0FJUkJSVVNICTB4MTQ0CisjZGVmaW5lIEJUTl9UT09MX0ZJTkdFUgkJMHgxNDUKKyNkZWZpbmUgQlROX1RPT0xfTU9VU0UJCTB4MTQ2CisjZGVmaW5lIEJUTl9UT09MX0xFTlMJCTB4MTQ3CisjZGVmaW5lIEJUTl9UT1VDSAkJMHgxNGEKKyNkZWZpbmUgQlROX1NUWUxVUwkJMHgxNGIKKyNkZWZpbmUgQlROX1NUWUxVUzIJCTB4MTRjCisjZGVmaW5lIEJUTl9UT09MX0RPVUJMRVRBUAkweDE0ZAorI2RlZmluZSBCVE5fVE9PTF9UUklQTEVUQVAJMHgxNGUKKworI2RlZmluZSBCVE5fV0hFRUwJCTB4MTUwCisjZGVmaW5lIEJUTl9HRUFSX0RPV04JCTB4MTUwCisjZGVmaW5lIEJUTl9HRUFSX1VQCQkweDE1MQorCisjZGVmaW5lIEtFWV9PSwkJCTB4MTYwCisjZGVmaW5lIEtFWV9TRUxFQ1QJCTB4MTYxCisjZGVmaW5lIEtFWV9HT1RPCQkweDE2MgorI2RlZmluZSBLRVlfQ0xFQVIJCTB4MTYzCisjZGVmaW5lIEtFWV9QT1dFUjIJCTB4MTY0CisjZGVmaW5lIEtFWV9PUFRJT04JCTB4MTY1CisjZGVmaW5lIEtFWV9JTkZPCQkweDE2NgorI2RlZmluZSBLRVlfVElNRQkJMHgxNjcKKyNkZWZpbmUgS0VZX1ZFTkRPUgkJMHgxNjgKKyNkZWZpbmUgS0VZX0FSQ0hJVkUJCTB4MTY5CisjZGVmaW5lIEtFWV9QUk9HUkFNCQkweDE2YQorI2RlZmluZSBLRVlfQ0hBTk5FTAkJMHgxNmIKKyNkZWZpbmUgS0VZX0ZBVk9SSVRFUwkJMHgxNmMKKyNkZWZpbmUgS0VZX0VQRwkJCTB4MTZkCisjZGVmaW5lIEtFWV9QVlIJCQkweDE2ZQorI2RlZmluZSBLRVlfTUhQCQkJMHgxNmYKKyNkZWZpbmUgS0VZX0xBTkdVQUdFCQkweDE3MAorI2RlZmluZSBLRVlfVElUTEUJCTB4MTcxCisjZGVmaW5lIEtFWV9TVUJUSVRMRQkJMHgxNzIKKyNkZWZpbmUgS0VZX0FOR0xFCQkweDE3MworI2RlZmluZSBLRVlfWk9PTQkJMHgxNzQKKyNkZWZpbmUgS0VZX01PREUJCTB4MTc1CisjZGVmaW5lIEtFWV9LRVlCT0FSRAkJMHgxNzYKKyNkZWZpbmUgS0VZX1NDUkVFTgkJMHgxNzcKKyNkZWZpbmUgS0VZX1BDCQkJMHgxNzgKKyNkZWZpbmUgS0VZX1RWCQkJMHgxNzkKKyNkZWZpbmUgS0VZX1RWMgkJCTB4MTdhCisjZGVmaW5lIEtFWV9WQ1IJCQkweDE3YgorI2RlZmluZSBLRVlfVkNSMgkJMHgxN2MKKyNkZWZpbmUgS0VZX1NBVAkJCTB4MTdkCisjZGVmaW5lIEtFWV9TQVQyCQkweDE3ZQorI2RlZmluZSBLRVlfQ0QJCQkweDE3ZgorI2RlZmluZSBLRVlfVEFQRQkJMHgxODAKKyNkZWZpbmUgS0VZX1JBRElPCQkweDE4MQorI2RlZmluZSBLRVlfVFVORVIJCTB4MTgyCisjZGVmaW5lIEtFWV9QTEFZRVIJCTB4MTgzCisjZGVmaW5lIEtFWV9URVhUCQkweDE4NAorI2RlZmluZSBLRVlfRFZECQkJMHgxODUKKyNkZWZpbmUgS0VZX0FVWAkJCTB4MTg2CisjZGVmaW5lIEtFWV9NUDMJCQkweDE4NworI2RlZmluZSBLRVlfQVVESU8JCTB4MTg4CisjZGVmaW5lIEtFWV9WSURFTwkJMHgxODkKKyNkZWZpbmUgS0VZX0RJUkVDVE9SWQkJMHgxOGEKKyNkZWZpbmUgS0VZX0xJU1QJCTB4MThiCisjZGVmaW5lIEtFWV9NRU1PCQkweDE4YworI2RlZmluZSBLRVlfQ0FMRU5EQVIJCTB4MThkCisjZGVmaW5lIEtFWV9SRUQJCQkweDE4ZQorI2RlZmluZSBLRVlfR1JFRU4JCTB4MThmCisjZGVmaW5lIEtFWV9ZRUxMT1cJCTB4MTkwCisjZGVmaW5lIEtFWV9CTFVFCQkweDE5MQorI2RlZmluZSBLRVlfQ0hBTk5FTFVQCQkweDE5MgorI2RlZmluZSBLRVlfQ0hBTk5FTERPV04JCTB4MTkzCisjZGVmaW5lIEtFWV9GSVJTVAkJMHgxOTQKKyNkZWZpbmUgS0VZX0xBU1QJCTB4MTk1CisjZGVmaW5lIEtFWV9BQgkJCTB4MTk2CisjZGVmaW5lIEtFWV9ORVhUCQkweDE5NworI2RlZmluZSBLRVlfUkVTVEFSVAkJMHgxOTgKKyNkZWZpbmUgS0VZX1NMT1cJCTB4MTk5CisjZGVmaW5lIEtFWV9TSFVGRkxFCQkweDE5YQorI2RlZmluZSBLRVlfQlJFQUsJCTB4MTliCisjZGVmaW5lIEtFWV9QUkVWSU9VUwkJMHgxOWMKKyNkZWZpbmUgS0VZX0RJR0lUUwkJMHgxOWQKKyNkZWZpbmUgS0VZX1RFRU4JCTB4MTllCisjZGVmaW5lIEtFWV9UV0VOCQkweDE5ZgorCisjZGVmaW5lIEtFWV9ERUxfRU9MCQkweDFjMAorI2RlZmluZSBLRVlfREVMX0VPUwkJMHgxYzEKKyNkZWZpbmUgS0VZX0lOU19MSU5FCQkweDFjMgorI2RlZmluZSBLRVlfREVMX0xJTkUJCTB4MWMzCisKKyNkZWZpbmUgS0VZX0ZOCQkJMHgxZDAKKyNkZWZpbmUgS0VZX0ZOX0VTQwkJMHgxZDEKKyNkZWZpbmUgS0VZX0ZOX0YxCQkweDFkMgorI2RlZmluZSBLRVlfRk5fRjIJCTB4MWQzCisjZGVmaW5lIEtFWV9GTl9GMwkJMHgxZDQKKyNkZWZpbmUgS0VZX0ZOX0Y0CQkweDFkNQorI2RlZmluZSBLRVlfRk5fRjUJCTB4MWQ2CisjZGVmaW5lIEtFWV9GTl9GNgkJMHgxZDcKKyNkZWZpbmUgS0VZX0ZOX0Y3CQkweDFkOAorI2RlZmluZSBLRVlfRk5fRjgJCTB4MWQ5CisjZGVmaW5lIEtFWV9GTl9GOQkJMHgxZGEKKyNkZWZpbmUgS0VZX0ZOX0YxMAkJMHgxZGIKKyNkZWZpbmUgS0VZX0ZOX0YxMQkJMHgxZGMKKyNkZWZpbmUgS0VZX0ZOX0YxMgkJMHgxZGQKKyNkZWZpbmUgS0VZX0ZOXzEJCTB4MWRlCisjZGVmaW5lIEtFWV9GTl8yCQkweDFkZgorI2RlZmluZSBLRVlfRk5fRAkJMHgxZTAKKyNkZWZpbmUgS0VZX0ZOX0UJCTB4MWUxCisjZGVmaW5lIEtFWV9GTl9GCQkweDFlMgorI2RlZmluZSBLRVlfRk5fUwkJMHgxZTMKKyNkZWZpbmUgS0VZX0ZOX0IJCTB4MWU0CisKKyNkZWZpbmUgS0VZX0JSTF9ET1QxCQkweDFmMQorI2RlZmluZSBLRVlfQlJMX0RPVDIJCTB4MWYyCisjZGVmaW5lIEtFWV9CUkxfRE9UMwkJMHgxZjMKKyNkZWZpbmUgS0VZX0JSTF9ET1Q0CQkweDFmNAorI2RlZmluZSBLRVlfQlJMX0RPVDUJCTB4MWY1CisjZGVmaW5lIEtFWV9CUkxfRE9UNgkJMHgxZjYKKyNkZWZpbmUgS0VZX0JSTF9ET1Q3CQkweDFmNworI2RlZmluZSBLRVlfQlJMX0RPVDgJCTB4MWY4CisKKy8qIFdlIGF2b2lkIGxvdyBjb21tb24ga2V5cyBpbiBtb2R1bGUgYWxpYXNlcyBzbyB0aGV5IGRvbid0IGdldCBodWdlLiAqLworI2RlZmluZSBLRVlfTUlOX0lOVEVSRVNUSU5HCUtFWV9NVVRFCisjZGVmaW5lIEtFWV9NQVgJCQkweDFmZgorCisjaWZuZGVmIEFCU19NVF9TTE9UCisjZGVmaW5lIEFCU19NVF9TTE9UICAgICAgICAgICAgIDB4MmYgICAgLyogTVQgc2xvdCBiZWluZyBtb2RpZmllZCAqLworI2VuZGlmCisjaWZuZGVmIEFCU19NVF9UT1VDSF9NQUpPUgorI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUFKT1IgICAgICAweDMwICAgIC8qIE1ham9yIGF4aXMgb2YgdG91Y2hpbmcgZWxsaXBzZSAqLworI2VuZGlmCisjaWZuZGVmIEFCU19NVF9UT1VDSF9NSU5PUgorI2RlZmluZSBBQlNfTVRfVE9VQ0hfTUlOT1IgICAgICAweDMxICAgIC8qIE1pbm9yIGF4aXMgKG9taXQgaWYgY2lyY3VsYXIpICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX1dJRFRIX01BSk9SCisjZGVmaW5lIEFCU19NVF9XSURUSF9NQUpPUiAgICAgIDB4MzIgICAgLyogTWFqb3IgYXhpcyBvZiBhcHByb2FjaGluZyBlbGxpcHNlICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX1dJRFRIX01JTk9SCisjZGVmaW5lIEFCU19NVF9XSURUSF9NSU5PUiAgICAgIDB4MzMgICAgLyogTWlub3IgYXhpcyAob21pdCBpZiBjaXJjdWxhcikgKi8KKyNlbmRpZgorI2lmbmRlZiBBQlNfTVRfT1JJRU5UQVRJT04KKyNkZWZpbmUgQUJTX01UX09SSUVOVEFUSU9OICAgICAgMHgzNCAgICAvKiBFbGxpcHNlIG9yaWVudGF0aW9uICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX1BPU0lUSU9OX1gKKyNkZWZpbmUgQUJTX01UX1BPU0lUSU9OX1ggICAgICAgMHgzNSAgICAvKiBDZW50ZXIgWCBlbGxpcHNlIHBvc2l0aW9uICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX1BPU0lUSU9OX1kKKyNkZWZpbmUgQUJTX01UX1BPU0lUSU9OX1kgICAgICAgMHgzNiAgICAvKiBDZW50ZXIgWSBlbGxpcHNlIHBvc2l0aW9uICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX1RPT0xfVFlQRQorI2RlZmluZSBBQlNfTVRfVE9PTF9UWVBFICAgICAgICAweDM3ICAgIC8qIFR5cGUgb2YgdG91Y2hpbmcgZGV2aWNlICovCisjZW5kaWYKKyNpZm5kZWYgQUJTX01UX0JMT0JfSUQKKyNkZWZpbmUgQUJTX01UX0JMT0JfSUQgICAgICAgICAgMHgzOCAgICAvKiBHcm91cCBhIHNldCBvZiBwYWNrZXRzIGFzIGEgYmxvYiAqLworI2VuZGlmCisjaWZuZGVmIEFCU19NVF9UUkFDS0lOR19JRAorI2RlZmluZSBBQlNfTVRfVFJBQ0tJTkdfSUQgICAgICAweDM5ICAgIC8qIFVuaXF1ZSBJRCBvZiBpbml0aWF0ZWQgY29udGFjdCAqLworI2VuZGlmCisjaWZuZGVmIEFCU19NVF9QUkVTU1VSRQorI2RlZmluZSBBQlNfTVRfUFJFU1NVUkUgICAgICAgICAweDNhICAgIC8qIFByZXNzdXJlIG9uIGNvbnRhY3QgYXJlYSAqLworI2VuZGlmCisjaWZuZGVmIEFCU19NVF9ESVNUQU5DRQorI2RlZmluZSBBQlNfTVRfRElTVEFOQ0UgICAgICAgICAweDNiICAgIC8qIENvbnRhY3QgaG92ZXIgZGlzdGFuY2UgKi8KKyNlbmRpZgorI2lmbmRlZiBBQlNfTUFYCisjZGVmaW5lIEFCU19NQVggICAgICAgICAgICAgICAgIDB4M2YKKyNlbmRpZgorCisjaWZuZGVmIFNZTl9SRVBPUlQKKyNkZWZpbmUgU1lOX1JFUE9SVCAgICAgICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIFNZTl9DT05GSUcKKyNkZWZpbmUgU1lOX0NPTkZJRyAgICAgICAgICAgICAgMQorI2VuZGlmCisjaWZuZGVmIFNZTl9NVF9SRVBPUlQKKyNkZWZpbmUgU1lOX01UX1JFUE9SVCAgICAgICAgICAgMgorI2VuZGlmCisjaWZuZGVmIFNZTl9EUk9QUEVECisjZGVmaW5lIFNZTl9EUk9QUEVEICAgICAgICAgICAgIDMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvUXRMb29wZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvUXRMb29wZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTczNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9RdExvb3Blci5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L1F0TG9vcGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TY29wZWRQb2ludGVyU2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvVGFpbFF1ZXVlTGlzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9RdFRpbWVySW1wbC5oIgorCisjaW5jbHVkZSA8UVRpbWU+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBxdCB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0eXBlZGVmIDo6YW5kcm9pZDo6YmFzZTo6TG9vcGVyIEJhc2VMb29wZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpUaW1lciBCYXNlVGltZXI7Cit0eXBlZGVmIDo6YW5kcm9pZDo6YmFzZTo6TG9vcGVyOjpGZFdhdGNoIEJhc2VGZFdhdGNoOworCisvLyBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6YmFzZTo6TG9vcGVyIG9uIHRvcCBvZiB0aGUgUXQgbWFpbgorLy8gZXZlbnQgbG9vcC4gVGhlcmUgYXJlIGZldyBpbXBvcnRhbnQgdGhpbmdzIGhlcmU6CisvLworLy8gIDEvIFRoZXJlIGlzIGEgc2luZ2xlIGdsb2JhbCBRdCBldmVudCBsb29wIHBlciB0aHJlYWQuIFNvLCBhbGwgaW5zdGFuY2VzCisvLyAgICAgcmV0dXJuZWQgYnkgY3JlYXRlTG9vcGVyKCkgd2lsbCByZWFsbHkgdXNlIHRoZSBzYW1lIHN0YXRlIG9uIGEgdGhyZWFkIQorLy8KKy8vICAgICBJbiBvdGhlciB3b3JkcywgZG9uJ3QgY2FsbCBpdCBtb3JlIHRoYW4gb25jZSBwZXIgdGhyZWFkIQorLy8KKy8vICAyLyBJdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCB0aGUgcnVuV2l0aERlYWRsaW5lTXMoKSBtZXRob2QsIHNpbmNlCisvLyAgICAgdGhlIGV2ZW50IGxvb3AgaXMgc3RhcnRlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZCBieQorLy8gICAgIHRoZSBleGVjdXRhYmxlLgorLy8KKy8vICAzLyBDbG9jayBpbXBsZW1lbnRhdGlvbiBpcyBsaW1pdGVkCisvLyAgICAgICAgIC0gTWlsbGlzZWNvbmQgcHJlY2lzaW9uIG9ubHkuCisvLyAgICAgICAgIC0gT25seSBDbG9ja1R5cGU6OmtIb3N0IGlzIHN1cHBvcnRlZC4KKy8vCisvLyAgNC8gRmRXYXRjaCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0IChhcyBpdCdzIG5vdCBpbiB1c2UgeWV0KS4KKworY2xhc3MgUXRMb29wZXIgOiBwdWJsaWMgQmFzZUxvb3BlciB7CitwdWJsaWM6CisgICAgUXRMb29wZXIoKSA6IExvb3BlcigpIHt9CisKKyAgICAvLworICAgIC8vIFQgSSBNIEUgUiBTCisgICAgLy8KKyAgICAvLyBUaGUgdW5kZXJseWluZyB0aW1lciBpcyBvZiBRdDo6VGltZXJUeXBlIFF0OjpDb2Fyc2VUaW1lci4gVGhpcyBnaXZlcyB1cworICAgIC8vIGFsbW9zdCBtaWxsaXNlY29uZCBhY2N1cmFjeSAoNSUgZXJyb3IgbWFyZ2luKSwgYnV0IGlzIG1vcmUgZWZmaWNpZW50LgorICAgIGNsYXNzIFRpbWVyIDogcHVibGljIEJhc2VUaW1lciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgc3RhcnRSZWxhdGl2ZShEdXJhdGlvbiB0aW1lb3V0X21zKSB7CisgICAgICAgICAgICBpZiAodGltZW91dF9tcyA9PSBrRHVyYXRpb25JbmZpbml0ZSkgeworICAgICAgICAgICAgICAgIG1UaW1lci5zdG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lci5zdGFydCh0aW1lb3V0X21zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzdGFydEFic29sdXRlKER1cmF0aW9uIGRlYWRsaW5lX21zKSB7CisgICAgICAgICAgICBRX0FTU0VSVF9YKGZhbHNlLCAiUXRMb29wZXI6OlRpbWVyOjpzdGFydEFic29sdXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0QWJzb2x1dGUgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgeyBtVGltZXIuc3RvcCgpOyB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbVRpbWVyLmlzQWN0aXZlKCk7IH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2F2ZShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAgICAgICAgICAgcURlYnVnKCJRdExvb3Blcjo6VGltZXIgZG9lcyBub3Qgc3VwcG9ydCBzZXJpYWxpemF0aW9uLiBTa2lwcGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGxvYWQoYW5kcm9pZDo6YmFzZTo6U3RyZWFtKiBzdHJlYW0pIHsKKyAgICAgICAgICAgIHFEZWJ1ZygiUXRMb29wZXI6OlRpbWVyIGRvZXMgbm90IHN1cHBvcnQgZGVzZXJpYWxpemF0aW9uLiAiCisgICAgICAgICAgICAgICAgICAgIlNraXBwZWQuIik7CisgICAgICAgIH0KKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gfFF0TG9vcGVyfCBwcm92aWRlcyBtZXRob2QocykgdG8gY29uc3RydWN0IGFuIG9iamVjdCBvZiB0aGlzIGtpbmQuCisgICAgICAgIGZyaWVuZCBjbGFzcyBRdExvb3BlcjsKKworICAgICAgICBUaW1lcihRdExvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICBCYXNlVGltZXI6OkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgIENsb2NrVHlwZSBjbG9jaykKKyAgICAgICAgICAgIDogQmFzZVRpbWVyKGxvb3BlciwgY2FsbGJhY2ssIG9wYXF1ZSwgY2xvY2spLAorICAgICAgICAgICAgICBtVGltZXIoY2FsbGJhY2ssIG9wYXF1ZSwgdGhpcykgeworICAgICAgICAgICAgbVRpbWVyLnNldFNpbmdsZVNob3QodHJ1ZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVySW1wbCBtVGltZXI7CisKKyAgICAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRpbWVyKTsKKyAgICB9OworCisgICAgdmlydHVhbCBCYXNlVGltZXIqIGNyZWF0ZVRpbWVyKEJhc2VUaW1lcjo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvY2tUeXBlIGNsb2NrKSB7CisgICAgICAgIGNsb2NrID0gdmFsaWRhdGVDbG9ja1R5cGUoY2xvY2spOworICAgICAgICByZXR1cm4gbmV3IFF0TG9vcGVyOjpUaW1lcih0aGlzLCBjYWxsYmFjaywgb3BhcXVlLCBjbG9jayk7CisgICAgfQorCisgICAgdmlydHVhbCBCYXNlRmRXYXRjaCogY3JlYXRlRmRXYXRjaChpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlRmRXYXRjaDo6Q2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpIHsKKyAgICAgICAgUV9BU1NFUlRfWChmYWxzZSwgIlF0TG9vcGVyOjpjcmVhdGVGZFdhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAiRmRXYXRjaCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGZvciBRdExvb3Blci4iKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8KKyAgICAvLyAgTCBPIE8gUCBFIFIKKyAgICAvLworICAgIHZpcnR1YWwgRHVyYXRpb24gbm93TXMoQ2xvY2tUeXBlIGNsb2NrKSB7CisgICAgICAgIGNsb2NrID0gdmFsaWRhdGVDbG9ja1R5cGUoY2xvY2spOworICAgICAgICBhdXRvIHRpbWUgPSBRVGltZTo6Y3VycmVudFRpbWUoKTsKKyAgICAgICAgcmV0dXJuIHRpbWUubXNlYygpICsKKyAgICAgICAgICAgICAgIDEwMDBVTCAqICh0aW1lLnNlY29uZCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICA2MFVMICogKHRpbWUubWludXRlKCkgKyA2MFVMICogdGltZS5ob3VyKCkpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIER1cmF0aW9uTnMgbm93TnMoQ2xvY2tUeXBlIGNsb2NrVHlwZSkgeworICAgICAgICBxV2FybmluZygiUXRMb29wZXI6Om5vd05zIGlzIG5vdCBzdXBwb3J0ZWQuIERlZmF1bHRpbmcgdG8gbm93TXMuIik7CisgICAgICAgIHJldHVybiBub3dNcyhjbG9ja1R5cGUpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJ1bldpdGhEZWFkbGluZU1zKER1cmF0aW9uIGRlYWRsaW5lX21zKSB7CisgICAgICAgIHFXYXJuaW5nKCJVc2VyIGNhbm5vdCBjYWxsIHxydW4qfCBvbiBhIFF0TG9vcGVyIGV2ZW50IGxvb3AiKTsKKyAgICAgICAgZXJybm8gPSBFTk9TWVM7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZm9yY2VRdWl0KCkgeworICAgICAgICBxV2FybmluZygiVXNlciBjYW5ub3QgY2FsbCB8Zm9yY2VRdWl0fCBvbiBhIFF0TG9vcGVyIGV2ZW50IGxvb3AiKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDbG9ja1R5cGUgdmFsaWRhdGVDbG9ja1R5cGUoQ2xvY2tUeXBlIGNsb2NrKSB7CisgICAgICAgIGlmIChjbG9jayAhPSBDbG9ja1R5cGU6OmtIb3N0KSB7CisgICAgICAgICAgICBxV2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgIlF0TG9vcGVyOjpUaW1lciBkb2VzIG5vdCBzdXBwb3J0ICVzLiIKKyAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHRpbmcgdG8gIENsb2NrVHlwZTo6a0hvc3QuIiwKKyAgICAgICAgICAgICAgICAgICAgTG9vcGVyOjpjbG9ja1R5cGVUb1N0cmluZyhjbG9jaykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDbG9ja1R5cGU6OmtIb3N0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUXRMb29wZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK2FuZHJvaWQ6OmJhc2U6Okxvb3BlciogY3JlYXRlTG9vcGVyKCkgeworICAgIHJldHVybiBuZXcgaW50ZXJuYWw6OlF0TG9vcGVyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBxdAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L1F0TG9vcGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9RdExvb3Blci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDAxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9RdExvb3Blci5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHF0IHsKKworLy8gUmV0dXJuIGEgTG9vcGVyIGluc3RhbmNlIGZvciB0aHJlYWRzIHJ1bm5pbmcgUXQncyBldmVudCBsb29wLgorLy8gVGhlcmUgaXMgb25lIGluc3RhbmNlIHBlciBRRXZlbnRMb29wLCBzbyBjYWxsaW5nIHRoaXMgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUKKy8vIGFueSB0aHJlYWQgd2lsbCBnaXZlbiB5b3UgZGlmZmVyZW50IGluc3RhbmNlcyBvZiBMb29wZXIgdGhhdCBjb3JyZXNwb25kIHRvCisvLyB0aGUgc2FtZSBnbG9iYWwgc3RhdGUgZm9yIHRoYXQgdGhyZWFkLgorLy8gVE9ETyhwcHJhYmh1KSBDb21tZW50IGFib3V0IHN0YXJ0aW5nIHRoZSBldmVudCBsb29wPworYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBjcmVhdGVMb29wZXIoKTsKKworfSAgLy8gbmFtZXNwYWNlIHF0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvUXRUaW1lckltcGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L1F0VGltZXJJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhOGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L1F0VGltZXJJbXBsLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorCisjaW5jbHVkZSA8UVRpbWVyPgorI2luY2x1ZGUgPFF0R2xvYmFsPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcXQgeworbmFtZXNwYWNlIGludGVybmFsIHsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmJhc2U6Okxvb3BlciBCYXNlTG9vcGVyOwordHlwZWRlZiA6OmFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6VGltZXIgQmFzZVRpbWVyOworCitjbGFzcyBUaW1lckltcGwgOiBwdWJsaWMgUVRpbWVyIHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgVGltZXJJbXBsKEJhc2VUaW1lcjo6Q2FsbGJhY2sgY2FsbGJhY2ssIHZvaWQqIG9wYXF1ZSwgQmFzZVRpbWVyKiB0aW1lcikKKyAgICAgICAgOiBRVGltZXIoKSwgbUNhbGxiYWNrKGNhbGxiYWNrKSwgbU9wYXF1ZShvcGFxdWUpLCBtVGltZXIodGltZXIpIHsKKyAgICAgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmVGltZXJJbXBsOjp0aW1lb3V0LCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICZUaW1lckltcGw6OnNsb3RfdGltZW91dCk7CisgICAgfQorCitwdWJsaWMgc2xvdHM6CisgICAgdm9pZCBzbG90X3RpbWVvdXQoKSB7IG1DYWxsYmFjayhtT3BhcXVlLCBtVGltZXIpOyB9CisKK3ByaXZhdGU6CisgICAgQmFzZVRpbWVyOjpDYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgdm9pZCogbU9wYXF1ZTsKKyAgICBCYXNlVGltZXIqIG1UaW1lcjsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUaW1lckltcGwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCit9ICAvLyBuYW1lc3BhY2UgcXQKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9SRUFETUUgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L1JFQURNRQpAQCAtMCwwICsxLDYxIEBACitCVUlMRElORyBBTkQgUlVOTklORyBBIFFUIEVNVUxBVE9SCisKKz09PT09PT09PT09CitCVUlMRElORyBRVAorPT09PT09PT09PT0KKworSWYgeW91IGRvbid0IGhhdmUgJEFPU1AvcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3ItYnVpbGQvcXQgaW4geW91ciB3b3Jrc3BhY2UsCitydW4gdGhlIGZvbGxvd2luZyBzY3JpcHRzIGZpcnN0OgorCisgIGFuZHJvaWQvc2NyaXB0cy9kb3dubG9hZC1zb3VyY2VzLnNoCisgIGFuZHJvaWQvc2NyaXB0cy9idWlsZC1xdC5zaAorCitUaGV5IHdpbGwgcmVidWlsZCB0aGUgUXQgbGlicmFyaWVzIGZyb20gc291cmNlIGFuZCBwbGFjZSB0aGVtIGF0IHRoZSBsb2NhdGlvbgorYWJvdmUuCisKKz09PT09PT09PT09PT09PT09CitCVUlMRElORyBFTVVMQVRPUgorPT09PT09PT09PT09PT09PT0KKworQnkgZGVmYXVsdCB0aGUgZW11bGF0b3Igc3RpbGwgdXNlcyBhIFNETDItYmFzZWQgVUkgYmFja2VuZCwgdGhlIFF0IG9uZQoraXMgc3RpbGwgZXhwZXJpbWVudGFsIGJ1dCBjYW4gYmUgZW5hYmxlZCB3aXRoIHRoZSAtLXVpPXF0IGNvbW1hbmQtbGluZQorb3B0aW9uLCBhcyBpbjoKKworICAuL2FuZHJvaWQvcmVidWlsZC5zaCAtLXVpPXF0IDxvdGhlci1vcHRpb25zPgorCitVc2UgJ29ianMvZW11bGF0b3IgPG9wdGlvbnM+JyBhcyB1c3VhbCB0byBzdGFydCB0aGUgZW11bGF0b3IuIFRoZSBidWlsZAorc2NyaXB0IHRha2VzIGNhcmUgb2YgY29weWluZyB0aGUgUXQgc2hhcmVkIGxpYnJhcmllcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiwKK2FuZCB0aGUgdG9wLWxldmVsICdlbXVsYXRvcicgcHJvZ3JhbSBtb2RpZmllcyB0aGUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaAorcGF0aCB0byBiZSBzdXJlIHRoZXkgYXJlIGxvY2F0ZWQgYW5kIHVzZWQgYnkgdGhlIGVtdWxhdGlvbiBlbmdpbmUuCisKK1RoaXMgb3B0aW9uIGlzIGFsc28gc3VwcG9ydGVkIGJ5IHBhY2thZ2UtcmVsZWFzZS5zaCwgaS5lLjoKKworICAuL2FuZHJvaWQvc2NyaXB0cy9wYWNrYWdlLXJlbGVhc2Uuc2ggLS11aT1xdCA8b3RoZXItb3B0aW9ucz4KKworCis9PT09PT09PT09PT09PT09PQorREVWRUxPUE1FTlQKKz09PT09PT09PT09PT09PT09CisKK1RoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSBzdXBwb3J0cyBydW5uaW5nIHRoZSAnbW9jJyB0b29sIGFuZCBjb21waWxpbmcKK3RoZSBjb3JyZXNwb25kaW5nIHNvdXJjZXMgYXV0b21hdGljYWxseSwgdXNpbmcgc29tZXRoaW5nIGxpa2UgdGhpcyBpbgorc291cmNlcy5tazoKKworICAgQU5EUk9JRF9TS0lOX1FUX01PQ19TUkNfRklMRVMgOj0gXAorICAgICAgIGFuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5oIFwKKyAgICAgICBhbmRyb2lkL3NraW4vcXQvZW11bGF0b3Itd2luZG93LmggXAorCitOb3RlIHRoYXQgdGhlICdzb3VyY2VzJyBoZXJlIGFyZSByZWFsbHkgaGVhZGVyIGZpbGVzIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKK3Rocm91Z2ggJ21vYycuIFRoZSBjb3JyZXNwb25kaW5nIGdlbmVyYXRlZCBzb3VyY2VzIGFyZSBjb21waWxlZCBpbnRvIHRoZQorY3VycmVudCBtb2R1bGUuIFRoZSBoZWFkZXJzIG11c3QgYmUgbWFudWFsbHkgbGlzdGVkIChpLmUuIHRoZXJlIGlzIG5vCithdXRvbWF0ZWQgc2Nhbm5pbmcgb2YgYWxsIHNvdXJjZXMgZm9yIFFfT0JKRUNUIG1hY3JvcykuCisKK1RoZSBidWlsZCBzeXN0ZW0gYWxzbyBzdXBwb3J0cyBydW5uaW5nIHRoZSAncmNjJyB0b29sIHRvIHRyYW5zbGF0ZSByZXNvdXJjZQorZmlsZXMgKCoucXJjKSBpbnRvIGF1dG8tZ2VuZXJhdGVkIEMrKyBzb3VyY2VzIHRoYXQgYXJlIGF1dG9tYXRpY2FsbHkgY29tcGlsZWQKK2ludG8gdGhlIGN1cnJlbnQgbW9kdWxlLCB3aXRoIHNvbWV0aGluZyBsaWtlOgorCisgICAgQU5EUk9JRF9TS0lOX1FUX1JFU09VUkNFUyA6PSBcCisgICAgICAgIGFuZHJvaWQvc2tpbi9xdC9yZXNvdXJjZXMucXJjCisKK05vdGUgdGhhdCB0aGUgZmlsZSdzIGJhc2VuYW1lIGlzIHVzZWQgdG8gaW52b2tlICdyY2MnIHdpdGggdGhlIC0tbmFtZSA8bmFtZT4KK29wdGlvbi4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FjY2VsZXJvbWV0ZXItM2Qtd2lkZ2V0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FjY2VsZXJvbWV0ZXItM2Qtd2lkZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY2YjEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvYWNjZWxlcm9tZXRlci0zZC13aWRnZXQuY3BwCkBAIC0wLDAgKzEsNDA1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kDQorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4NCisvLw0KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9hY2NlbGVyb21ldGVyLTNkLXdpZGdldC5oIg0KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZ2wtY29tbW9uLmgiDQorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC93YXZlZnJvbnQtb2JqLXBhcnNlci5oIg0KKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiDQorDQorQWNjZWxlcm9tZXRlcjNEV2lkZ2V0OjpBY2NlbGVyb21ldGVyM0RXaWRnZXQoUVdpZGdldCogcGFyZW50KSA6DQorICAgIEdMV2lkZ2V0KHBhcmVudCksDQorICAgIG1UcmFja2luZyhmYWxzZSksDQorICAgIG1PcGVyYXRpb25Nb2RlKE9wZXJhdGlvbk1vZGU6OlJvdGF0ZSkgew0KKyAgICB0b2dnbGVBQSgpOw0KK30NCisNCitBY2NlbGVyb21ldGVyM0RXaWRnZXQ6On5BY2NlbGVyb21ldGVyM0RXaWRnZXQoKSB7DQorICAgIC8vIEZyZWUgdXAgYWxsb2NhdGVkIHJlc291cmNlcy4NCisgICAgaWYgKCFtR0xFUzIpIHsNCisgICAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgICBpZiAocmVhZHlGb3JSZW5kZXJpbmcoKSkgew0KKyAgICAgICAgaWYobWFrZUNvbnRleHRDdXJyZW50KCkpIHsNCisgICAgICAgICAgICBtR0xFUzItPmdsRGVsZXRlUHJvZ3JhbShtUHJvZ3JhbSk7DQorICAgICAgICAgICAgbUdMRVMyLT5nbERlbGV0ZUJ1ZmZlcnMoMSwgJm1WZXJ0ZXhEYXRhQnVmZmVyKTsNCisgICAgICAgICAgICBtR0xFUzItPmdsRGVsZXRlQnVmZmVycygxLCAmbVZlcnRleEluZGV4QnVmZmVyKTsNCisgICAgICAgICAgICBtR0xFUzItPmdsRGVsZXRlVGV4dHVyZXMoMSwgJm1HbG9zc01hcCk7DQorICAgICAgICAgICAgbUdMRVMyLT5nbERlbGV0ZVRleHR1cmVzKDEsICZtRGlmZnVzZU1hcCk7DQorICAgICAgICAgICAgbUdMRVMyLT5nbERlbGV0ZVRleHR1cmVzKDEsICZtU3BlY3VsYXJNYXApOw0KKyAgICAgICAgICAgIG1HTEVTMi0+Z2xEZWxldGVUZXh0dXJlcygxLCAmbUVudk1hcCk7DQorICAgICAgICB9DQorICAgIH0NCit9DQorDQorLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgdXBsb2FkcyB0aGUgZGF0YSBmcm9tIHRleHR1cmUgaW4gdGhlIGZpbGUNCisvLyBzcGVjaWZpZWQgYnkgfHNvdXJjZV9maWxlbmFtZXwgaW50byB0aGUgdGV4dHVyZSBvYmplY3QgYm91bmQNCisvLyBhdCB8dGFyZ2V0fCB1c2luZyB0aGUgZ2l2ZW4gfGZvcm1hdHwuIHxmb3JtYXR8IHNob3VsZCBiZQ0KKy8vIGVpdGhlciBHTF9SR0JBIG9yIEdMX0xVTUlOQU5DRS4NCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4NCitzdGF0aWMgYm9vbCBsb2FkVGV4dHVyZShjb25zdCBHTEVTdjJEaXNwYXRjaCogZ2xlczIsDQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlX2ZpbGVuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCkgew0KKyAgICBRSW1hZ2UgaW1hZ2UgPQ0KKyAgICAgICAgUUltYWdlKHNvdXJjZV9maWxlbmFtZSkuY29udmVydFRvRm9ybWF0KGZvcm1hdCA9PSBHTF9SR0JBID8NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUltYWdlOjpGb3JtYXRfUkdCQTg4ODggOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSW1hZ2U6OkZvcm1hdF9HcmF5c2NhbGU4KTsNCisgICAgaWYgKGltYWdlLmlzTnVsbCgpKSB7DQorICAgICAgICBxV2FybmluZygiRmFpbGVkIHRvIGxvYWQgaW1hZ2UgXCIlc1wiIiwgc291cmNlX2ZpbGVuYW1lKTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBnbGVzMi0+Z2xUZXhJbWFnZTJEKHRhcmdldCwNCisgICAgICAgICAgICAgICAgICAgICAgICAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS53aWR0aCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLmhlaWdodCgpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0JZVEUsDQorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYml0cygpKTsNCisgICAgcmV0dXJuIGdsZXMyLT5nbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1I7DQorfQ0KKw0KKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSAyRCB0ZXh0dXJlIGZyb20gYSBnaXZlbiBmaWxlDQorLy8gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4NCitzdGF0aWMgR0x1aW50IGNyZWF0ZTJEVGV4dHVyZShjb25zdCBHTEVTdjJEaXNwYXRjaCogZ2xlczIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc291cmNlX2ZpbGVuYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gbWluX2ZpbHRlciA9IEdMX0xJTkVBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gbWFnX2ZpbHRlciA9IEdMX0xJTkVBUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gd3JhcF9zID0gR0xfQ0xBTVBfVE9fRURHRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gd3JhcF90ID0gR0xfQ0xBTVBfVE9fRURHRSkgew0KKyAgICBHTHVpbnQgdGV4dHVyZSA9IDA7DQorICAgIGdsZXMyLT5nbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsNCisNCisgICAgLy8gVXBsb2FkIHRleHR1cmUgZGF0YSBhbmQgc2V0IHBhcmFtZXRlcnMuDQorICAgIGdsZXMyLT5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOw0KKyAgICBpZighbG9hZFRleHR1cmUoZ2xlczIsDQorICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZW5hbWUsDQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQsDQorICAgICAgICAgICAgICAgICAgICBmb3JtYXQpKSByZXR1cm4gMDsNCisgICAgZ2xlczItPmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgbWluX2ZpbHRlcik7DQorICAgIGdsZXMyLT5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX01BR19GSUxURVIsIG1hZ19maWx0ZXIpOw0KKyAgICBnbGVzMi0+Z2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1MsIHdyYXBfcyk7DQorICAgIGdsZXMyLT5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBHTF9URVhUVVJFX1dSQVBfVCwgd3JhcF90KTsNCisNCisgICAgLy8gR2VuZXJhdGUgbWlwbWFwcyBpZiBuZWNlc3NhcnkuDQorICAgIGlmIChtaW5fZmlsdGVyID09IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgfHwNCisgICAgICAgIG1pbl9maWx0ZXIgPT0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSIHx8DQorICAgICAgICBtaW5fZmlsdGVyID09IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCB8fA0KKyAgICAgICAgbWluX2ZpbHRlciA9PSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUikgew0KKyAgICAgICAgZ2xlczItPmdsR2VuZXJhdGVNaXBtYXAoR0xfVEVYVFVSRV8yRCk7DQorICAgIH0NCisNCisgICAgcmV0dXJuIGdsZXMyLT5nbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IgPyB0ZXh0dXJlIDogMDsNCit9DQorDQorYm9vbCBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6OmluaXRHTCgpIHsNCisgICAgaWYgKCFtR0xFUzIpIHsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICAvLyBQZXJmb3JtIGluaXRpYWwgc2V0LXVwLg0KKw0KKyAgICAvLyBFbmFibGUgZGVwdGggdGVzdGluZyBhbmQgYmxlbmRpbmcuDQorICAgIG1HTEVTMi0+Z2xFbmFibGUoR0xfREVQVEhfVEVTVCk7DQorICAgIG1HTEVTMi0+Z2xFbmFibGUoR0xfQkxFTkQpOw0KKw0KKyAgICAvLyBTZXQgdGhlIGJsZW5kIGZ1bmN0aW9uLg0KKyAgICBtR0xFUzItPmdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7DQorDQorICAgIC8vIENsZWFyIHNjcmVlbiB0byBncmF5Lg0KKyAgICBtR0xFUzItPmdsQ2xlYXJDb2xvcigwLjUsIDAuNSwgMC41ICAsIDEuMCk7DQorDQorICAgIC8vIFNldCB1cCB0aGUgY2FtZXJhIHRyYW5zZm9ybWF0aW9uLg0KKyAgICBtQ2FtZXJhVHJhbnNmb3JtLnNldFRvSWRlbnRpdHkoKTsNCisgICAgbUNhbWVyYVRyYW5zZm9ybS5sb29rQXQoDQorICAgICAgICBRVmVjdG9yM0QoMC4wLCAwLjAsIDguNSksIC8vIENhbWVyYSBwb3NpdGlvbg0KKyAgICAgICAgUVZlY3RvcjNEKDAsIDAsIDApLCAvLyBQb2ludCBhdCB3aGljaCB0aGUgY2FtZXJhIGlzIGxvb2tpbmcNCisgICAgICAgIFFWZWN0b3IzRCgwLCAxLCAwKSk7IC8vICJ1cCIgdmVjdG9yDQorDQorICAgIGlmICghaW5pdFByb2dyYW0oKSB8fA0KKyAgICAgICAgIWluaXRNb2RlbCgpIHx8DQorICAgICAgICAhaW5pdFRleHR1cmVzKCkpIHsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKw0KKyAgICByZXNpemVHTCh3aWR0aCgpLCBoZWlnaHQoKSk7DQorICAgIHJldHVybiB0cnVlOw0KK30NCisNCitib29sIEFjY2VsZXJvbWV0ZXIzRFdpZGdldDo6aW5pdFByb2dyYW0oKSB7DQorICAgIC8vIENvbXBpbGUgJiBsaW5rIHNoYWRlcnMuDQorICAgIFFGaWxlIHZlcnRleF9zaGFkZXJfZmlsZSgiOi9waG9uZS1tb2RlbC92ZXJ0Lmdsc2wiKTsNCisgICAgUUZpbGUgZnJhZ21lbnRfc2hhZGVyX2ZpbGUoIjovcGhvbmUtbW9kZWwvZnJhZy5nbHNsIik7DQorICAgIHZlcnRleF9zaGFkZXJfZmlsZS5vcGVuKFFGaWxlOjpSZWFkT25seSB8IFFGaWxlOjpUZXh0KTsNCisgICAgZnJhZ21lbnRfc2hhZGVyX2ZpbGUub3BlbihRRmlsZTo6UmVhZE9ubHkgfCBRRmlsZTo6VGV4dCk7DQorICAgIFFCeXRlQXJyYXkgdmVydGV4X3NoYWRlcl9jb2RlID0gdmVydGV4X3NoYWRlcl9maWxlLnJlYWRBbGwoKTsNCisgICAgUUJ5dGVBcnJheSBmcmFnbWVudF9zaGFkZXJfY29kZSA9IGZyYWdtZW50X3NoYWRlcl9maWxlLnJlYWRBbGwoKTsNCisgICAgR0x1aW50IHZlcnRleF9zaGFkZXIgPQ0KKyAgICAgICAgY3JlYXRlU2hhZGVyKG1HTEVTMiwgR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4X3NoYWRlcl9jb2RlLmNvbnN0RGF0YSgpKTsNCisgICAgR0x1aW50IGZyYWdtZW50X3NoYWRlciA9DQorICAgICAgICBjcmVhdGVTaGFkZXIobUdMRVMyLCBHTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50X3NoYWRlcl9jb2RlLmNvbnN0RGF0YSgpKTsNCisgICAgaWYgKHZlcnRleF9zaGFkZXIgPT0gMCB8fCBmcmFnbWVudF9zaGFkZXIgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIG1Qcm9ncmFtID0gbUdMRVMyLT5nbENyZWF0ZVByb2dyYW0oKTsNCisgICAgbUdMRVMyLT5nbEF0dGFjaFNoYWRlcihtUHJvZ3JhbSwgdmVydGV4X3NoYWRlcik7DQorICAgIG1HTEVTMi0+Z2xBdHRhY2hTaGFkZXIobVByb2dyYW0sIGZyYWdtZW50X3NoYWRlcik7DQorICAgIG1HTEVTMi0+Z2xMaW5rUHJvZ3JhbShtUHJvZ3JhbSk7DQorICAgIEdMaW50IGNvbXBpbGVfc3RhdHVzID0gMDsNCisgICAgbUdMRVMyLT5nbEdldFByb2dyYW1pdihtUHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZjb21waWxlX3N0YXR1cyk7DQorICAgIGlmIChjb21waWxlX3N0YXR1cyA9PSBHTF9GQUxTRSkgew0KKyAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBsaW5rIHByb2dyYW0iKTsNCisgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgfQ0KKyAgICBDSEVDS19HTF9FUlJPUl9SRVRVUk4oIkZhaWxlZCB0byBpbml0aWFsaXplIHNoYWRlcnMiLCBmYWxzZSk7DQorDQorICAgIC8vIFdlIG5vIGxvbmdlciBuZWVkIHNoYWRlciBvYmplY3RzIGFmdGVyIHN1Y2Nlc3NmdWwgcHJvZ3JhbSBsaW5rYWdlLg0KKyAgICBtR0xFUzItPmdsRGV0YWNoU2hhZGVyKG1Qcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTsNCisgICAgbUdMRVMyLT5nbERldGFjaFNoYWRlcihtUHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTsNCisgICAgbUdMRVMyLT5nbERlbGV0ZVNoYWRlcih2ZXJ0ZXhfc2hhZGVyKTsNCisgICAgbUdMRVMyLT5nbERlbGV0ZVNoYWRlcihmcmFnbWVudF9zaGFkZXIpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6OmluaXRNb2RlbCgpIHsNCisgICAgLy8gTG9hZCB0aGUgbW9kZWwgYW5kIHNldCB1cCBidWZmZXJzLg0KKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbW9kZWxfdmVydGV4X2RhdGE7DQorICAgIHN0ZDo6dmVjdG9yPEdMdWludD4gaW5kaWNlczsNCisgICAgUUZpbGUgbW9kZWxfZmlsZSgiOi9waG9uZS1tb2RlbC9tb2RlbC5vYmoiKTsNCisgICAgaWYgKG1vZGVsX2ZpbGUub3BlbihRRmlsZTo6UmVhZE9ubHkpKSB7DQorICAgICAgICBRVGV4dFN0cmVhbSBmaWxlX3N0cmVhbSgmbW9kZWxfZmlsZSk7DQorICAgICAgICBpZighcGFyc2VXYXZlZnJvbnRPQkooZmlsZV9zdHJlYW0sIG1vZGVsX3ZlcnRleF9kYXRhLCBpbmRpY2VzKSkgew0KKyAgICAgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gbG9hZCBtb2RlbCIpOw0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIH0NCisgICAgfSBlbHNlIHsNCisgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gb3BlbiBtb2RlbCBmaWxlIGZvciByZWFkaW5nIik7DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisgICAgbUVsZW1lbnRzQ291bnQgPSBpbmRpY2VzLnNpemUoKTsNCisNCisgICAgbVZlcnRleFBvc2l0aW9uQXR0cmlidXRlID0gbUdMRVMyLT5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAidnR4X3BvcyIpOw0KKyAgICBtVmVydGV4Tm9ybWFsQXR0cmlidXRlICAgPSBtR0xFUzItPmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJ2dHhfbm9ybWFsIik7DQorICAgIG1WZXJ0ZXhVVkF0dHJpYnV0ZSAgID0gbUdMRVMyLT5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAidnR4X3V2Iik7DQorICAgIG1HTEVTMi0+Z2xHZW5CdWZmZXJzKDEsICZtVmVydGV4RGF0YUJ1ZmZlcik7DQorICAgIG1HTEVTMi0+Z2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleERhdGFCdWZmZXIpOw0KKyAgICBtR0xFUzItPmdsQnVmZmVyRGF0YShHTF9BUlJBWV9CVUZGRVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3ZlcnRleF9kYXRhLnNpemUoKSAqIHNpemVvZihmbG9hdCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlbF92ZXJ0ZXhfZGF0YVswXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfU1RBVElDX0RSQVcpOw0KKyAgICBtR0xFUzItPmdsR2VuQnVmZmVycygxLCAmbVZlcnRleEluZGV4QnVmZmVyKTsNCisgICAgbUdMRVMyLT5nbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhJbmRleEJ1ZmZlcik7DQorICAgIG1HTEVTMi0+Z2xCdWZmZXJEYXRhKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICBtRWxlbWVudHNDb3VudCAqIHNpemVvZihHTHVpbnQpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kaWNlc1swXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfU1RBVElDX0RSQVcpOw0KKyAgICBDSEVDS19HTF9FUlJPUl9SRVRVUk4oIkZhaWxlZCB0byBsb2FkIG1vZGVsIiwgZmFsc2UpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCit9DQorDQorYm9vbCBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6OmluaXRUZXh0dXJlcygpIHsNCisgICAgLy8gQ3JlYXRlIHRleHR1cmVzLg0KKyAgICBtRGlmZnVzZU1hcCA9IGNyZWF0ZTJEVGV4dHVyZShtR0xFUzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6L3Bob25lLW1vZGVsL2RpZmZ1c2UtbWFwLnBuZyIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQkEsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSKTsNCisgICAgbVNwZWN1bGFyTWFwID0gY3JlYXRlMkRUZXh0dXJlKG1HTEVTMiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6L3Bob25lLW1vZGVsL3NwZWN1bGFyLW1hcC5wbmciLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRV8yRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0xVTUlOQU5DRSk7DQorICAgIG1HbG9zc01hcCA9IGNyZWF0ZTJEVGV4dHVyZShtR0xFUzIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOi9waG9uZS1tb2RlbC9nbG9zcy1tYXAucG5nIiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9MVU1JTkFOQ0UpOw0KKyAgICBpZiAoIW1EaWZmdXNlTWFwIHx8ICFtU3BlY3VsYXJNYXAgfHwgIW1HbG9zc01hcCkgew0KKyAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICB9DQorICAgIG1HTEVTMi0+Z2xHZW5UZXh0dXJlcygxLCAmbUVudk1hcCk7DQorICAgIG1HTEVTMi0+Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQLCBtRW52TWFwKTsNCisgICAgbG9hZFRleHR1cmUobUdMRVMyLCAiOi9waG9uZS1tb2RlbC9lbnYtbWFwLWZyb250LnBuZyIsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiwgR0xfUkdCQSk7DQorICAgIGxvYWRUZXh0dXJlKG1HTEVTMiwgIjovcGhvbmUtbW9kZWwvZW52LW1hcC1iYWNrLnBuZyIsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiwgR0xfUkdCQSk7DQorICAgIGxvYWRUZXh0dXJlKG1HTEVTMiwgIjovcGhvbmUtbW9kZWwvZW52LW1hcC1yaWdodC5wbmciLCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIEdMX1JHQkEpOw0KKyAgICBsb2FkVGV4dHVyZShtR0xFUzIsICI6L3Bob25lLW1vZGVsL2Vudi1tYXAtbGVmdC5wbmciLCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1gsIEdMX1JHQkEpOw0KKyAgICBsb2FkVGV4dHVyZShtR0xFUzIsICI6L3Bob25lLW1vZGVsL2Vudi1tYXAtdG9wLnBuZyIsIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSwgR0xfUkdCQSk7DQorICAgIGxvYWRUZXh0dXJlKG1HTEVTMiwgIjovcGhvbmUtbW9kZWwvZW52LW1hcC1ib3R0b20ucG5nIiwgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZLCBHTF9SR0JBKTsNCisgICAgbUdMRVMyLT5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9DVUJFX01BUCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUik7DQorICAgIG1HTEVTMi0+Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfQ1VCRV9NQVAsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsNCisgICAgbUdMRVMyLT5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9DVUJFX01BUCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOw0KKyAgICBtR0xFUzItPmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0NVQkVfTUFQLCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7DQorICAgIG1HTEVTMi0+Z2xHZW5lcmF0ZU1pcG1hcChHTF9URVhUVVJFX0NVQkVfTUFQKTsNCisgICAgQ0hFQ0tfR0xfRVJST1JfUkVUVVJOKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjdWJlbWFwIiwgZmFsc2UpOw0KKyAgICByZXR1cm4gdHJ1ZTsNCit9DQorDQordm9pZCBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6OnJlc2l6ZUdMKGludCB3LCBpbnQgaCkgew0KKyAgICBpZiAoIW1HTEVTMikgew0KKyAgICAgICAgcmV0dXJuOw0KKyAgICB9DQorDQorICAgIC8vIEFkanVzdCBmb3IgbmV3IHZpZXdwb3J0DQorICAgIG1HTEVTMi0+Z2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsNCisNCisgICAgLy8gUmVjb21wdXRlIHRoZSBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIHRyYW5zZm9ybS4NCisgICAgbVBlcnNwZWN0aXZlLnNldFRvSWRlbnRpdHkoKTsNCisgICAgbVBlcnNwZWN0aXZlLnBlcnNwZWN0aXZlKA0KKyAgICAgICAgICAgIDQ1LjAsIC8vIEZPVg0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4odykgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGgpLCAvLyBBc3BlY3QgcmF0aW8NCisgICAgICAgICAgICAwLjUsIDEwMC4wKTsgLy8gbmVhciBhbmQgZmFyIGNsaXBwaW5nIHBsYW5lcw0KKw0KKyAgICAvLyBDYWxjdWxhdGUgdGhlIGRlcHRoIG9mIHRoZSB3b3JsZCdzIFhZIHBsYW5lLg0KKyAgICBRVmVjdG9yM0QgdmVjID0gbVBlcnNwZWN0aXZlICogbUNhbWVyYVRyYW5zZm9ybSAqIFFWZWN0b3IzRCgwLjBmLCAwLjBmLCAwLjBmKTsNCisgICAgbVhZUGxhbmVEZXB0aCA9IHZlYy56KCk7DQorfQ0KKw0KK3ZvaWQgQWNjZWxlcm9tZXRlcjNEV2lkZ2V0OjpyZXBhaW50R0woKSB7DQorICAgIGlmICghbUdMRVMyKSB7DQorICAgICAgICByZXR1cm47DQorICAgIH0NCisNCisgICAgLy8gSGFuZGxlIHJlcGFpbnQgZXZlbnQuDQorICAgIC8vIFJlY29tcHV0ZSB0aGUgbW9kZWwgdHJhbnNmb3JtYXRpb24gbWF0cml4IHVzaW5nIHRoZSBnaXZlbiByb3RhdGlvbnMuDQorICAgIFFNYXRyaXg0eDQgbW9kZWxfdmlld190cmFuc2Zvcm07DQorICAgIG1vZGVsX3ZpZXdfdHJhbnNmb3JtLnNldFRvSWRlbnRpdHkoKTsNCisgICAgbW9kZWxfdmlld190cmFuc2Zvcm0udHJhbnNsYXRlKG1UcmFuc2xhdGlvbi54KCksIG1UcmFuc2xhdGlvbi55KCkpOw0KKyAgICBtb2RlbF92aWV3X3RyYW5zZm9ybS5yb3RhdGUobVF1YXQpOw0KKyAgICBtb2RlbF92aWV3X3RyYW5zZm9ybSA9IG1DYW1lcmFUcmFuc2Zvcm0gKiBtb2RlbF92aWV3X3RyYW5zZm9ybTsNCisNCisgICAgLy8gTm9ybWFscyBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkIHVzaW5nIHRoZSBpbnZlcnNlIHRyYW5zcG9zZSBvZiBtb2RlbHZpZXcgbWF0cml4Lg0KKyAgICBRTWF0cml4NHg0IG5vcm1hbF90cmFuc2Zvcm0gPSBtb2RlbF92aWV3X3RyYW5zZm9ybS5pbnZlcnRlZCgpLnRyYW5zcG9zZWQoKTsNCisNCisgICAgLy8gUmVjb21wdXRlIHRoZSBtb2RlbC12aWV3LXByb2plY3Rpb24gbWF0cml4IHVzaW5nIHRoZSBuZXcgbW9kZWwgdHJhbnNmb3JtLg0KKyAgICBRTWF0cml4NHg0IG1vZGVsX3ZpZXdfcHJvamVjdGlvbiA9IG1QZXJzcGVjdGl2ZSAqIG1vZGVsX3ZpZXdfdHJhbnNmb3JtOw0KKw0KKyAgICAvLyBHaXZlIHRoZSBuZXcgTVZQIG1hdHJpeCB0byB0aGUgc2hhZGVyLg0KKyAgICBtR0xFUzItPmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7DQorDQorICAgIC8vIFVwbG9hZCBtYXRyaWNlcy4NCisgICAgR0x1aW50IG12X21hdHJpeF91bmlmb3JtID0gbUdMRVMyLT5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgIm1vZGVsX3ZpZXciKTsNCisgICAgbUdMRVMyLT5nbFVuaWZvcm1NYXRyaXg0ZnYobXZfbWF0cml4X3VuaWZvcm0sIDEsIEdMX0ZBTFNFLCBtb2RlbF92aWV3X3RyYW5zZm9ybS5jb25zdERhdGEoKSk7DQorDQorICAgIEdMdWludCBtdml0X21hdHJpeF91bmlmb3JtID0gbUdMRVMyLT5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgIm1vZGVsX3ZpZXdfaW52ZXJzZV90cmFuc3Bvc2UiKTsNCisgICAgbUdMRVMyLT5nbFVuaWZvcm1NYXRyaXg0ZnYobXZpdF9tYXRyaXhfdW5pZm9ybSwgMSwgR0xfRkFMU0UsIG5vcm1hbF90cmFuc2Zvcm0uY29uc3REYXRhKCkpOw0KKw0KKyAgICBHTHVpbnQgbXZwX21hdHJpeF91bmlmb3JtID0gbUdMRVMyLT5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgIm1vZGVsX3ZpZXdfcHJvamVjdGlvbiIpOw0KKyAgICBtR0xFUzItPmdsVW5pZm9ybU1hdHJpeDRmdihtdnBfbWF0cml4X3VuaWZvcm0sIDEsIEdMX0ZBTFNFLCBtb2RlbF92aWV3X3Byb2plY3Rpb24uY29uc3REYXRhKCkpOw0KKw0KKyAgICAvLyBTZXQgdGV4dHVyZXMuDQorICAgIG1HTEVTMi0+Z2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsNCisgICAgbUdMRVMyLT5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1EaWZmdXNlTWFwKTsNCisgICAgbUdMRVMyLT5nbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOw0KKyAgICBtR0xFUzItPmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVNwZWN1bGFyTWFwKTsNCisgICAgbUdMRVMyLT5nbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTIpOw0KKyAgICBtR0xFUzItPmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbUdsb3NzTWFwKTsNCisgICAgbUdMRVMyLT5nbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTMpOw0KKyAgICBtR0xFUzItPmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCwgbUVudk1hcCk7DQorDQorICAgIEdMdWludCBkaWZmdXNlX21hcF91bmlmb3JtID0gbUdMRVMyLT5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgImRpZmZ1c2VfbWFwIik7DQorICAgIG1HTEVTMi0+Z2xVbmlmb3JtMWkoZGlmZnVzZV9tYXBfdW5pZm9ybSwgMCk7DQorICAgIEdMdWludCBzcGVjdWxhcl9tYXBfdW5pZm9ybSA9IG1HTEVTMi0+Z2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJzcGVjdWxhcl9tYXAiKTsNCisgICAgbUdMRVMyLT5nbFVuaWZvcm0xaShzcGVjdWxhcl9tYXBfdW5pZm9ybSwgMSk7DQorICAgIEdMdWludCBnbG9zc19tYXBfdW5pZm9ybSA9IG1HTEVTMi0+Z2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJnbG9zc19tYXAiKTsNCisgICAgbUdMRVMyLT5nbFVuaWZvcm0xaShnbG9zc19tYXBfdW5pZm9ybSwgMik7DQorICAgIEdMdWludCBlbnZfbWFwX3VuaWZvcm0gPSBtR0xFUzItPmdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAiZW52X21hcCIpOw0KKyAgICBtR0xFUzItPmdsVW5pZm9ybTFpKGVudl9tYXBfdW5pZm9ybSwgMyk7DQorDQorICAgIC8vIFNldCB1cCBhdHRyaWJ1dGUgcG9pbnRlcnMuDQorICAgIG1HTEVTMi0+Z2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleERhdGFCdWZmZXIpOw0KKyAgICBtR0xFUzItPmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVZlcnRleFBvc2l0aW9uQXR0cmlidXRlKTsNCisgICAgbUdMRVMyLT5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1WZXJ0ZXhOb3JtYWxBdHRyaWJ1dGUpOw0KKyAgICBtR0xFUzItPmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVZlcnRleFVWQXR0cmlidXRlKTsNCisgICAgbUdMRVMyLT5nbFZlcnRleEF0dHJpYlBvaW50ZXIobVZlcnRleFBvc2l0aW9uQXR0cmlidXRlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9GTE9BVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkFMU0UsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiA4LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsNCisgICAgbUdMRVMyLT5nbFZlcnRleEF0dHJpYlBvaW50ZXIobVZlcnRleE5vcm1hbEF0dHJpYnV0ZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkxPQVQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZBTFNFLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpICogOCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKShzaXplb2YoZmxvYXQpICogMykpOw0KKyAgICBtR0xFUzItPmdsVmVydGV4QXR0cmliUG9pbnRlcihtVmVydGV4VVZBdHRyaWJ1dGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZMT0FULA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9GQUxTRSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIDgsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikoc2l6ZW9mKGZsb2F0KSAqIDYpKTsNCisgICAgbUdMRVMyLT5nbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhJbmRleEJ1ZmZlcik7DQorDQorICAgIC8vIERyYXcgdGhlIG1vZGVsLg0KKyAgICBtR0xFUzItPmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8IEdMX0RFUFRIX0JVRkZFUl9CSVQpOw0KKyAgICBtR0xFUzItPmdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbUVsZW1lbnRzQ291bnQsIEdMX1VOU0lHTkVEX0lOVCwgMCk7DQorfQ0KKw0KK3N0YXRpYyBmbG9hdCBjbGFtcChmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCB4KSB7DQorICAgIHJldHVybiBzdGQ6Om1heChhLCBzdGQ6Om1pbihiLCB4KSk7DQorfQ0KKw0KK3ZvaWQgQWNjZWxlcm9tZXRlcjNEV2lkZ2V0Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCAqZXZlbnQpIHsNCisgICAgaWYgKG1UcmFja2luZyAmJiBtT3BlcmF0aW9uTW9kZSA9PSBPcGVyYXRpb25Nb2RlOjpSb3RhdGUpIHsNCisgICAgICAgIGludCBkaWZmX3ggPSBldmVudC0+eCgpIC0gbVByZXZNb3VzZVgsDQorICAgICAgICAgICAgZGlmZl95ID0gZXZlbnQtPnkoKSAtIG1QcmV2TW91c2VZOw0KKyAgICAgICAgUVF1YXRlcm5pb24gcSA9IFFRdWF0ZXJuaW9uOjpmcm9tQXhpc0FuZEFuZ2xlKDEuMCwgMC4wLCAwLjAsIGRpZmZfeSkgKg0KKyAgICAgICAgICAgICAgICAgICAgICAgIFFRdWF0ZXJuaW9uOjpmcm9tQXhpc0FuZEFuZ2xlKDAuMCwgMS4wLCAwLjAsIGRpZmZfeCk7DQorICAgICAgICBtUXVhdCA9IHEgKiBtUXVhdDsNCisgICAgICAgIHJlbmRlckZyYW1lKCk7DQorICAgICAgICBlbWl0KHJvdGF0aW9uQ2hhbmdlZCgpKTsNCisgICAgICAgIG1QcmV2TW91c2VYID0gZXZlbnQtPngoKTsNCisgICAgICAgIG1QcmV2TW91c2VZID0gZXZlbnQtPnkoKTsNCisgICAgfSBlbHNlIGlmIChtVHJhY2tpbmcgJiYgbU9wZXJhdGlvbk1vZGUgPT0gT3BlcmF0aW9uTW9kZTo6TW92ZSkgew0KKyAgICAgICAgUVZlY3RvcjJEIHZlYyA9IHNjcmVlblRvWFlQbGFuZShldmVudC0+eCgpLCBldmVudC0+eSgpKTsNCisgICAgICAgIG1UcmFuc2xhdGlvbiArPSB2ZWMgLSBtUHJldkRyYWdPcmlnaW47DQorICAgICAgICBtVHJhbnNsYXRpb24uc2V0WChjbGFtcChNaW5YLCBNYXhYLCBtVHJhbnNsYXRpb24ueCgpKSk7DQorICAgICAgICBtVHJhbnNsYXRpb24uc2V0WShjbGFtcChNaW5ZLCBNYXhZLCBtVHJhbnNsYXRpb24ueSgpKSk7DQorICAgICAgICByZW5kZXJGcmFtZSgpOw0KKyAgICAgICAgZW1pdChwb3NpdGlvbkNoYW5nZWQoKSk7DQorICAgICAgICBtUHJldkRyYWdPcmlnaW4gPSB2ZWM7DQorICAgIH0NCit9DQorDQorUVZlY3RvcjJEIEFjY2VsZXJvbWV0ZXIzRFdpZGdldDo6c2NyZWVuVG9YWVBsYW5lKGludCB4LCBpbnQgeSkgY29uc3Qgew0KKyAgICBRVmVjdG9yM0QgdmVjOyAvLyBOb3JtYWxpemVkIGRldmljZSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQuDQorDQorICAgIC8vIENvbnZlcnQgeCBhbmQgeSBmcm9tIFF0IGNvb3JkaW5hdGUgc3lzdGVtIGludG8gTkRDDQorICAgIHZlYy5zZXRYKDIuMCAqIHggLyBzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgoKSkgLSAxLjApOw0KKyAgICB2ZWMuc2V0WSgxLjAgLSAyLjAgKiB5IC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGhlaWdodCgpKSk7DQorDQorICAgIC8vIE1ha2Ugc3VyZSB0aGUgcG9pbnQgbGllcyBvbiB0aGUgd29ybGQncyBYWSBwbGFuZS4NCisgICAgdmVjLnNldFoobVhZUGxhbmVEZXB0aCk7DQorDQorICAgIC8vIE5vdywgYnkgYXBwbHlpbmcgdGhlIGludmVyc2UgcGVyc3BlY3RpdmUgYW5kIGNhbWVyYSB0cmFuc2Zvcm0sDQorICAgIC8vIHR1cm4gdmVjIGludG8gd29ybGQgY29vcmRpbmF0ZXMuDQorICAgIHZlYyA9IChtUGVyc3BlY3RpdmUgKiBtQ2FtZXJhVHJhbnNmb3JtKS5pbnZlcnRlZCgpICogdmVjOw0KKyAgICByZXR1cm4gUVZlY3RvcjJEKHZlYy54KCksIHZlYy55KCkpOw0KK30NCisNCit2b2lkIEFjY2VsZXJvbWV0ZXIzRFdpZGdldDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkgew0KKyAgICBtUHJldk1vdXNlWCA9IGV2ZW50LT54KCk7DQorICAgIG1QcmV2TW91c2VZID0gZXZlbnQtPnkoKTsNCisgICAgbVByZXZEcmFnT3JpZ2luID0gc2NyZWVuVG9YWVBsYW5lKGV2ZW50LT54KCksIGV2ZW50LT55KCkpOw0KKyAgICBtVHJhY2tpbmcgPSB0cnVlOw0KKyAgICBpZiAobU9wZXJhdGlvbk1vZGUgPT0gT3BlcmF0aW9uTW9kZTo6TW92ZSkgew0KKyAgICAgICAgbURyYWdnaW5nID0gdHJ1ZTsNCisgICAgICAgIGVtaXQoZHJhZ1N0YXJ0ZWQoKSk7DQorICAgIH0NCit9DQorDQordm9pZCBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6Om1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgew0KKyAgICBtVHJhY2tpbmcgPSBmYWxzZTsNCisgICAgaWYgKG1EcmFnZ2luZykgew0KKyAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7DQorICAgICAgICBlbWl0KGRyYWdTdG9wcGVkKCkpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FjY2VsZXJvbWV0ZXItM2Qtd2lkZ2V0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9hY2NlbGVyb21ldGVyLTNkLXdpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9hY2NlbGVyb21ldGVyLTNkLXdpZGdldC5oCkBAIC0wLDAgKzEsMTI2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0DQorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYw0KKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kDQorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4NCisvLw0KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuDQorDQorI3ByYWdtYSBvbmNlDQorDQorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuaCINCisjaW5jbHVkZSAiR0xFUzIvZ2wyLmgiDQorDQorI2luY2x1ZGUgPFFNYXRyaXg0eDQ+DQorI2luY2x1ZGUgPFFNb3VzZUV2ZW50Pg0KKyNpbmNsdWRlIDxRVmVjdG9yM0Q+DQorDQorI2luY2x1ZGUgPHN0cmluZz4NCisNCisvLyBBIHdpZGdldCB0aGF0IGRpc3BsYXlzIGEgM0QgbW9kZWwgb2YgYSBkZXZpY2UgYW5kIGxldHMgdGhlIHVzZXINCisvLyBtYW5pcHVsYXRlIGl0cyByb3RhdGlvbiBhbmQgcG9zaXRpb24uDQorLy8gVGhlIGNoYW5nZXMgaW4gcm90YXRpb24gYW5kIHBvc2l0aW9uIGNhbiBiZSB1c2VkIHRvDQorLy8gZGVyaXZlIHRoZSB2YWx1ZXMgd2hpY2ggc2hvdWxkIGJlIHJlcG9ydGVkIGJ5IHRoZSB2aXJ0dWFsIGFjY2VsZXJvbWV0ZXINCisvLyBhbmQgbWFnbmV0b21ldGVyLg0KK2NsYXNzIEFjY2VsZXJvbWV0ZXIzRFdpZGdldCA6IHB1YmxpYyBHTFdpZGdldCB7DQorICAgIFFfT0JKRUNUDQorICAgIFFfUFJPUEVSVFkoUVF1YXRlcm5pb24gcm90YXRpb24gUkVBRCByb3RhdGlvbiBXUklURSBzZXRSb3RhdGlvbiBOT1RJRlkgcm90YXRpb25DaGFuZ2VkIFVTRVIgdHJ1ZSk7DQorICAgIFFfUFJPUEVSVFkoUVZlY3RvcjJEIHBvc2l0aW9uIFJFQUQgcG9zaXRpb24gV1JJVEUgc2V0UG9zaXRpb24gTk9USUZZIHBvc2l0aW9uQ2hhbmdlZCBVU0VSIHRydWUpOw0KK3B1YmxpYzoNCisgICAgZW51bSBjbGFzcyBPcGVyYXRpb25Nb2RlIHsNCisgICAgICAgIFJvdGF0ZSwNCisgICAgICAgIE1vdmUNCisgICAgfTsNCisNCisgICAgIEFjY2VsZXJvbWV0ZXIzRFdpZGdldChRV2lkZ2V0ICpwYXJlbnQgPSAwKTsNCisgICAgfkFjY2VsZXJvbWV0ZXIzRFdpZGdldCgpOw0KKw0KK3NpZ25hbHM6DQorICAgIC8vIEVtaXR0ZWQgd2hlbiB0aGUgbW9kZWwncyByb3RhdGlvbiBjaGFuZ2VzLg0KKyAgICB2b2lkIHJvdGF0aW9uQ2hhbmdlZCgpOw0KKw0KKyAgICAvLyBFbWl0dGVkIHdoZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBtb2RlbCBjaGFuZ2VzLg0KKyAgICB2b2lkIHBvc2l0aW9uQ2hhbmdlZCgpOw0KKw0KKyAgICAvLyBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgYmVnaW5zIGRyYWdnaW5nIHRoZSBtb2RlbC4NCisgICAgdm9pZCBkcmFnU3RhcnRlZCgpOw0KKw0KKyAgICAvLyBFbWl0dGVkIHdoZW4gdGhlIHVzciBzdG9wcyBkcmFnZ2luZyB0aGUgbW9kZWwuDQorICAgIHZvaWQgZHJhZ1N0b3BwZWQoKTsNCisNCitwdWJsaWMgc2xvdHM6DQorICAgIC8vIFNldHMgdGhlIHJvdGF0aW9uIHF1YXRlcm5pb24uDQorICAgIHZvaWQgc2V0Um90YXRpb24oY29uc3QgUVF1YXRlcm5pb24mIHF1YXQpIHsgbVF1YXQgPSBxdWF0OyB9DQorDQorICAgIC8vIFNldHMgdGhlIFggYW5kIFkgY29vcmRpbmF0ZXMgb2YgdGhlIG1vZGVsJ3Mgb3JpZ2luOw0KKyAgICB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IFFWZWN0b3IyRCYgcG9zKSB7IG1UcmFuc2xhdGlvbiA9IHBvczsgfQ0KKw0KKyAgICAvLyBTZXRzIHRoZSB3aWRnZXQncyBvcGVyYXRpb24gbW9kZSB3aGljaCBkZXRlcm1pbmVzIGhvdyBpdCByZWFjdHMNCisgICAgLy8gdG8gbW9zZSBkcmFnZ2luZy4gSXQgbWF5IGVpdGhlciByb3RhdGUgdGhlIG1vZGVsIG9yIG1vdmUgaXQgYXJvdW5kLg0KKyAgICB2b2lkIHNldE9wZXJhdGlvbk1vZGUoT3BlcmF0aW9uTW9kZSBtb2RlKSB7IG1PcGVyYXRpb25Nb2RlID0gbW9kZTsgfQ0KKw0KK3B1YmxpYzoNCisgICAgLy8gUmV0dXJucyB0aGUgcm90YXRpb24gcXVhdGVybmlvbi4NCisgICAgY29uc3QgUVF1YXRlcm5pb24mIHJvdGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbVF1YXQ7IH0NCisNCisgICAgLy8gUmV0dXJucyB0aGUgWCBhbmQgWSBjb29yZGluYXRlcyBvZiB0aGUgbW9kZWwncyBvcmlnaW4uDQorICAgIGNvbnN0IFFWZWN0b3IyRCYgcG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBtVHJhbnNsYXRpb247IH0NCisNCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBNYXhYID0gNy4wOw0KKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IE1pblggPSAtNy4wOw0KKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IE1heFkgPSA0LjA7DQorICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgTWluWSA9IC00LjA7DQorDQorcHJvdGVjdGVkOg0KKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBvbmNlLCBhZnRlciB0aGUgR0wgY29udGV4dCBpcyBjcmVhdGVkLCB0byBkbyBzb21lIG9uZS1vZmYNCisgICAgLy8gc2V0dXAgd29yay4NCisgICAgYm9vbCBpbml0R0woKSBvdmVycmlkZTsNCisNCisgICAgLy8gQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHdpZGdldCBjaGFuZ2VzIGl0cyBkaW1lbnNpb25zLg0KKyAgICB2b2lkIHJlc2l6ZUdMKGludCwgaW50KSBvdmVycmlkZTsNCisNCisgICAgLy8gQ2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHdpZGdldCBuZWVkcyB0byBiZSByZXBhaW50ZWQuDQorICAgIHZvaWQgcmVwYWludEdMKCkgb3ZlcnJpZGU7DQorDQorICAgIC8vIFRoaXMgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG1vdXNlIGlzIG1vdmVkLg0KKyAgICB2b2lkIG1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICpldmVudCk7DQorICAgIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50ICpldmVudCk7DQorICAgIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KTsNCisNCitwcml2YXRlOg0KKyAgICBib29sIGluaXRQcm9ncmFtKCk7DQorICAgIGJvb2wgaW5pdE1vZGVsKCk7DQorICAgIGJvb2wgaW5pdFRleHR1cmVzKCk7DQorDQorICAgIC8vIFJldHVybnMgdGhlIHdvcmxkIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgb24gdGhlIFhZIHBsYW5lDQorICAgIC8vIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHBvaW50IG9uIHRoZSBzY3JlZW4uDQorICAgIFFWZWN0b3IyRCBzY3JlZW5Ub1hZUGxhbmUoaW50IHgsIGludCB5KSBjb25zdDsNCisNCisgICAgUVF1YXRlcm5pb24gbVF1YXQ7DQorICAgIFFWZWN0b3IyRCBtVHJhbnNsYXRpb247DQorICAgIFFNYXRyaXg0eDQgbVBlcnNwZWN0aXZlOw0KKyAgICBRTWF0cml4NHg0IG1DYW1lcmFUcmFuc2Zvcm07DQorDQorICAgIEdMdWludCBtUHJvZ3JhbTsNCisgICAgR0x1aW50IG1WZXJ0ZXhEYXRhQnVmZmVyOw0KKyAgICBHTHVpbnQgbVZlcnRleEluZGV4QnVmZmVyOw0KKyAgICBHTHVpbnQgbURpZmZ1c2VNYXA7DQorICAgIEdMdWludCBtU3BlY3VsYXJNYXA7DQorICAgIEdMdWludCBtR2xvc3NNYXA7DQorICAgIEdMdWludCBtRW52TWFwOw0KKyAgICBpbnQgbUVsZW1lbnRzQ291bnQ7DQorDQorICAgIEdMdWludCBtVmVydGV4UG9zaXRpb25BdHRyaWJ1dGU7DQorICAgIEdMdWludCBtVmVydGV4Tm9ybWFsQXR0cmlidXRlOw0KKyAgICBHTHVpbnQgbVZlcnRleFVWQXR0cmlidXRlOw0KKw0KKyAgICBpbnQgbVByZXZNb3VzZVg7DQorICAgIGludCBtUHJldk1vdXNlWTsNCisgICAgUVZlY3RvcjJEIG1QcmV2RHJhZ09yaWdpbjsNCisgICAgYm9vbCBtVHJhY2tpbmc7DQorICAgIGJvb2wgbURyYWdnaW5nOw0KKyAgICBkb3VibGUgbVhZUGxhbmVEZXB0aDsNCisgICAgT3BlcmF0aW9uTW9kZSBtT3BlcmF0aW9uTW9kZTsNCit9Ow0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FuZ2xlLWlucHV0LXdpZGdldC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9hbmdsZS1pbnB1dC13aWRnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWQwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9hbmdsZS1pbnB1dC13aWRnZXQuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9hbmdsZS1pbnB1dC13aWRnZXQuaCIKKyNpbmNsdWRlIDxRdE1hdGg+CisKKy8vIEhlbHBlciBmdW5jdGlvbiBmb3IgQW5nbGVJbnB1dFdpZGdldCBjdG9yCitzdGF0aWMgdm9pZCBzZXRVcExpbmVFZGl0KFFMaW5lRWRpdCogZWRpdG9yLCBjb25zdCBRVmFsaWRhdG9yKiB2YWxpZGF0b3IpIHsKKyAgICBlZGl0b3ItPnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOworICAgIGVkaXRvci0+c2V0UHJvcGVydHkoImNsYXNzIiwgIkVkaXRhYmxlVmFsdWUiKTsKK30KKworLy8gQW5vdGhlciBoZWxwZXIKK3N0YXRpYyB2b2lkIHNldFVwTGFiZWwoUUxhYmVsKiBsYWJlbCwgY29uc3QgUVN0cmluZyYgdGl0bGUpIHsKKyAgICBsYWJlbC0+c2V0VGV4dCh0aXRsZSk7CisgICAgbGFiZWwtPnNldFByb3BlcnR5KCJDb2xvckdyb3VwIiwgIlRpdGxlIik7Cit9CisKK0FuZ2xlSW5wdXRXaWRnZXQ6OkFuZ2xlSW5wdXRXaWRnZXQoUVdpZGdldCogcGFyZW50KSA6CisgICAgUVdpZGdldChwYXJlbnQpLAorICAgIG1EZWNpbWFsTW9kZUZyYW1lKHRoaXMpLAorICAgIG1TZXhhZ2VzaW1hbE1vZGVGcmFtZSh0aGlzKSwKKyAgICBtRGVjaW1hbFZhbHVlRWRpdG9yKCZtRGVjaW1hbE1vZGVGcmFtZSksCisgICAgbURlZ3JlZXNWYWx1ZUVkaXRvcigmbVNleGFnZXNpbWFsTW9kZUZyYW1lKSwKKyAgICBtTWludXRlc1ZhbHVlRWRpdG9yKCZtU2V4YWdlc2ltYWxNb2RlRnJhbWUpLAorICAgIG1TZWNvbmRzVmFsdWVFZGl0b3IoJm1TZXhhZ2VzaW1hbE1vZGVGcmFtZSksCisgICAgbURlZ3JlZXNMYWJlbCgmbVNleGFnZXNpbWFsTW9kZUZyYW1lKSwKKyAgICBtTWludXRlc0xhYmVsKCZtU2V4YWdlc2ltYWxNb2RlRnJhbWUpLAorICAgIG1TZWNvbmRzTGFiZWwoJm1TZXhhZ2VzaW1hbE1vZGVGcmFtZSksCisgICAgbU1pblZhbHVlKDAuMCksCisgICAgbU1heFZhbHVlKDAuMCksCisgICAgbURlY2ltYWxWYWx1ZSgwLjApLAorICAgIG1DdXJyZW50SW5wdXRNb2RlKElucHV0TW9kZTo6RGVjaW1hbCkgeworCisgICAgLy8gU2V0IHVwIHZhbGlkYXRvcnMgZm9yIHRoZSBlZGl0b3JzLgorICAgIHNldE1pblZhbHVlKC0xODAuMCk7CisgICAgc2V0TWF4VmFsdWUoMTgwLjApOworICAgIG1EZWNpbWFsRGVncmVlVmFsaWRhdG9yLnNldE5vdGF0aW9uKFFEb3VibGVWYWxpZGF0b3I6OlN0YW5kYXJkTm90YXRpb24pOworICAgIG1EZWNpbWFsRGVncmVlVmFsaWRhdG9yLnNldERlY2ltYWxzKDEwMCk7CisgICAgbURlY2ltYWxEZWdyZWVWYWxpZGF0b3Iuc2V0TG9jYWxlKFFMb2NhbGU6OkMpOworICAgIG1NaW5WYWxpZGF0b3Iuc2V0Qm90dG9tKDApOworICAgIG1NaW5WYWxpZGF0b3Iuc2V0VG9wKDU5KTsKKyAgICBtU2VjVmFsaWRhdG9yLnNldEJvdHRvbSgwLjApOworICAgIG1TZWNWYWxpZGF0b3Iuc2V0VG9wKDU5LjApOworICAgIG1TZWNWYWxpZGF0b3Iuc2V0TG9jYWxlKFFMb2NhbGU6OkMpOworCisgICAgLy8gU2V0IHVwIHRoZSBlZGl0b3JzLgorICAgIHNldFVwTGluZUVkaXQoJm1EZWNpbWFsVmFsdWVFZGl0b3IsICZtRGVjaW1hbERlZ3JlZVZhbGlkYXRvcik7CisgICAgc2V0VXBMaW5lRWRpdCgmbURlZ3JlZXNWYWx1ZUVkaXRvciwgJm1JbnRlZ2VyRGVncmVlVmFsaWRhdG9yKTsKKyAgICBzZXRVcExpbmVFZGl0KCZtTWludXRlc1ZhbHVlRWRpdG9yLCAmbU1pblZhbGlkYXRvcik7CisgICAgc2V0VXBMaW5lRWRpdCgmbVNlY29uZHNWYWx1ZUVkaXRvciwgJm1TZWNWYWxpZGF0b3IpOworICAgIHNldFVwTGFiZWwoJm1EZWdyZWVzTGFiZWwsIFFTdHJpbmcoIlx1MDBCMCIpKTsgLy8gVSswMEIwIGlzIHRoZSAiZGVncmVlIiBzaWduIGluIFVuaWNvZGUuCisgICAgc2V0VXBMYWJlbCgmbU1pbnV0ZXNMYWJlbCwgUVN0cmluZygiJyIpKTsKKyAgICBzZXRVcExhYmVsKCZtU2Vjb25kc0xhYmVsLCBRU3RyaW5nKCInJyIpKTsKKworICAgIC8vIExheSBvdXQgdGhlIHN1YndpZGdldHMgaG9yaXpvbnRhbGx5LgorICAgIG1EZWNpbWFsRnJhbWVMYXlvdXQuYWRkV2lkZ2V0KCZtRGVjaW1hbFZhbHVlRWRpdG9yKTsKKyAgICBtRGVjaW1hbE1vZGVGcmFtZS5zZXRMYXlvdXQoJm1EZWNpbWFsRnJhbWVMYXlvdXQpOworICAgIG1TZXhhZ2VzaW1hbEZyYW1lTGF5b3V0LmFkZFdpZGdldCgmbURlZ3JlZXNWYWx1ZUVkaXRvcik7CisgICAgbVNleGFnZXNpbWFsRnJhbWVMYXlvdXQuYWRkV2lkZ2V0KCZtRGVncmVlc0xhYmVsKTsKKyAgICBtU2V4YWdlc2ltYWxGcmFtZUxheW91dC5hZGRXaWRnZXQoJm1NaW51dGVzVmFsdWVFZGl0b3IpOworICAgIG1TZXhhZ2VzaW1hbEZyYW1lTGF5b3V0LmFkZFdpZGdldCgmbU1pbnV0ZXNMYWJlbCk7CisgICAgbVNleGFnZXNpbWFsRnJhbWVMYXlvdXQuYWRkV2lkZ2V0KCZtU2Vjb25kc1ZhbHVlRWRpdG9yKTsKKyAgICBtU2V4YWdlc2ltYWxGcmFtZUxheW91dC5hZGRXaWRnZXQoJm1TZWNvbmRzTGFiZWwpOworICAgIG1TZXhhZ2VzaW1hbE1vZGVGcmFtZS5zZXRMYXlvdXQoJm1TZXhhZ2VzaW1hbEZyYW1lTGF5b3V0KTsKKyAgICBtTGF5b3V0LmFkZFdpZGdldCgmbURlY2ltYWxNb2RlRnJhbWUpOworICAgIG1MYXlvdXQuYWRkV2lkZ2V0KCZtU2V4YWdlc2ltYWxNb2RlRnJhbWUpOworICAgIHNldExheW91dCgmbUxheW91dCk7CisKKyAgICAvLyBEZWZhdWx0IGlucHV0IG1vZGUgaXMgImRlY2ltYWwiLgorICAgIHNldElucHV0TW9kZShJbnB1dE1vZGU6OkRlY2ltYWwpOworCisgICAgLy8gRW5zdXJlIHRoZSBpbnRlcm5hbCB2YWx1ZSBpcyB1cGRhdGVkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZSBpbiB0aGUgZWRpdG9yIHN1YndpZGdldHMuCisgICAgY29ubmVjdCgmbURlY2ltYWxWYWx1ZUVkaXRvciwgU0lHTkFMKGVkaXRpbmdGaW5pc2hlZCgpKSwKKyAgICAgICAgICAgIHRoaXMsIFNMT1QodXBkYXRlVmFsdWVGcm9tRGVjaW1hbElucHV0KCkpKTsKKyAgICBjb25uZWN0KCZtRGVncmVlc1ZhbHVlRWRpdG9yLCBTSUdOQUwoZWRpdGluZ0ZpbmlzaGVkKCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVWYWx1ZUZyb21TZXhhZ2VzaW1hbElucHV0KCkpKTsKKyAgICBjb25uZWN0KCZtTWludXRlc1ZhbHVlRWRpdG9yLCBTSUdOQUwoZWRpdGluZ0ZpbmlzaGVkKCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVWYWx1ZUZyb21TZXhhZ2VzaW1hbElucHV0KCkpKTsKKyAgICBjb25uZWN0KCZtU2Vjb25kc1ZhbHVlRWRpdG9yLCBTSUdOQUwoZWRpdGluZ0ZpbmlzaGVkKCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVWYWx1ZUZyb21TZXhhZ2VzaW1hbElucHV0KCkpKTsKKworICAgIC8vIFRoZSBsaW5lIGVkaXQgY29udHJvbHMgbXVzdCBub3QgYmUgc3F1aXNoZWQgYnkgdGhlIHNwYWNpbmcKKyAgICAvLyBpbnRyb2R1Y2VkIGJ5IGFkZGl0aW9uYWwgYm94IGxheW91dHMuIFRoZSBzcGFjaW5nIGlzIHJlbW92ZWQKKyAgICAvLyBieSBzZXR0aW5nIG1hcmdpbnMgdG8gMC4KKyAgICBzZXRDb250ZW50c01hcmdpbnMoMCwgMCwgMCwgMCk7CisgICAgbURlY2ltYWxNb2RlRnJhbWUuc2V0Q29udGVudHNNYXJnaW5zKDAsIDAsIDAsIDApOworICAgIG1TZXhhZ2VzaW1hbE1vZGVGcmFtZS5zZXRDb250ZW50c01hcmdpbnMoMCwgMCwgMCwgMCk7CisgICAgbVNleGFnZXNpbWFsRnJhbWVMYXlvdXQuc2V0Q29udGVudHNNYXJnaW5zKDAsIDAsIDAsIDApOworICAgIG1EZWNpbWFsRnJhbWVMYXlvdXQuc2V0Q29udGVudHNNYXJnaW5zKDAsIDAsIDAsIDApOworICAgIG1MYXlvdXQuc2V0Q29udGVudHNNYXJnaW5zKDAsIDAsIDAsIDApOworfQorCit2b2lkIEFuZ2xlSW5wdXRXaWRnZXQ6OnNldFZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAgIG1EZWNpbWFsVmFsdWUgPQorICAgICAgICAodmFsdWUgPD0gbU1pblZhbHVlID8gbU1pblZhbHVlIDogKHZhbHVlID49IG1NYXhWYWx1ZSA/IG1NYXhWYWx1ZSA6IHZhbHVlKSk7CisgICAgdXBkYXRlVmlldygpOworfQorCit2b2lkIEFuZ2xlSW5wdXRXaWRnZXQ6OnNldE1pblZhbHVlKGRvdWJsZSB2YWx1ZSkgeworICAgaWYgKHZhbHVlID4gbU1heFZhbHVlKSB7CisgICAgICAgcmV0dXJuOworICAgfQorICAgbU1pblZhbHVlID0gdmFsdWU7CisgICBtRGVjaW1hbERlZ3JlZVZhbGlkYXRvci5zZXRCb3R0b20obU1pblZhbHVlKTsKKyAgIG1JbnRlZ2VyRGVncmVlVmFsaWRhdG9yLnNldEJvdHRvbShxRmxvb3IobU1pblZhbHVlKSk7CisgICBpZiAobURlY2ltYWxWYWx1ZSA8IG1NaW5WYWx1ZSkgeworICAgICAgIG1EZWNpbWFsVmFsdWUgPSBtTWluVmFsdWU7CisgICB9Cit9CisKK3ZvaWQgQW5nbGVJbnB1dFdpZGdldDo6c2V0TWF4VmFsdWUoZG91YmxlIHZhbHVlKSB7CisgICBpZiAodmFsdWUgPCBtTWluVmFsdWUpIHsKKyAgICAgICByZXR1cm47CisgICB9CisgICBtTWF4VmFsdWUgPSB2YWx1ZTsKKyAgIG1EZWNpbWFsRGVncmVlVmFsaWRhdG9yLnNldFRvcChtTWF4VmFsdWUpOworICAgbUludGVnZXJEZWdyZWVWYWxpZGF0b3Iuc2V0VG9wKHFGbG9vcihtTWF4VmFsdWUpKTsKKyAgIGlmIChtRGVjaW1hbFZhbHVlID4gbU1heFZhbHVlKSB7CisgICAgICAgbURlY2ltYWxWYWx1ZSA9IG1NYXhWYWx1ZTsKKyAgIH0KK30KKwordm9pZCBBbmdsZUlucHV0V2lkZ2V0Ojpmb3JjZVVwZGF0ZSgpIHsKKyAgICBzd2l0Y2ggKG1DdXJyZW50SW5wdXRNb2RlKSB7CisgICAgY2FzZSBJbnB1dE1vZGU6OkRlY2ltYWw6CisgICAgICAgIHVwZGF0ZVZhbHVlRnJvbURlY2ltYWxJbnB1dCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElucHV0TW9kZTo6U2V4YWdlc2ltYWw6CisgICAgICAgIHVwZGF0ZVZhbHVlRnJvbVNleGFnZXNpbWFsSW5wdXQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK2NvbnN0IGludCBNSU5VVEVTX0lOX0RFR1JFRSA9IDYwOworY29uc3QgaW50IFNFQ09ORFNfSU5fTUlOVVRFID0gNjA7Citjb25zdCBpbnQgU0VDT05EU19JTl9ERUdSRUUgPSBNSU5VVEVTX0lOX0RFR1JFRSAqIFNFQ09ORFNfSU5fTUlOVVRFOworCitzdGF0aWMgaW50IHNnbihkb3VibGUgeCkgeworICAgIHJldHVybiAoeCA+IDAuMCkgLSAoeCA8IDAuMCk7Cit9CisKK3ZvaWQgQW5nbGVJbnB1dFdpZGdldDo6dXBkYXRlVmlldygpIHsKKyAgICBzd2l0Y2gobUN1cnJlbnRJbnB1dE1vZGUpIHsKKyAgICBjYXNlIElucHV0TW9kZTo6RGVjaW1hbDoKKyAgICAgICAgLy8gVXBkYXRlIHRoZSB2aXNpYmxlIHN1Yi13aWRnZXRzLgorICAgICAgICBtRGVjaW1hbE1vZGVGcmFtZS5zaG93KCk7CisgICAgICAgIG1TZXhhZ2VzaW1hbE1vZGVGcmFtZS5oaWRlKCk7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBjb3JyZWN0IHZhbHVlIGlzIGRpc3BsYXllZCBpbiB0aGUgZWRpdG9yLgorICAgICAgICBtRGVjaW1hbFZhbHVlRWRpdG9yLnNldFRleHQoUVN0cmluZzo6bnVtYmVyKG1EZWNpbWFsVmFsdWUpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElucHV0TW9kZTo6U2V4YWdlc2ltYWw6CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmlzaWJsZSBzdWItd2lkZ2V0cy4KKyAgICAgICAgbURlY2ltYWxNb2RlRnJhbWUuaGlkZSgpOworICAgICAgICBtU2V4YWdlc2ltYWxNb2RlRnJhbWUuc2hvdygpOworCisgICAgICAgIC8vIENvbnZlcnQgdGhlIGRlY2ltYWwgdmFsdWUgdG8gc2V4YWdlc2ltYWwgcmVwcmVzZW50YXRpb24uCisgICAgICAgIGludCBzaWduID0gc2duKG1EZWNpbWFsVmFsdWUpOworICAgICAgICBkb3VibGUgc2Vjb25kcyA9IHFGYWJzKG1EZWNpbWFsVmFsdWUpICogU0VDT05EU19JTl9ERUdSRUU7CisgICAgICAgIGludCB3aG9sZV9zZWNvbmRzID0gcUZsb29yKHNlY29uZHMpOworICAgICAgICBkb3VibGUgcmVtYWluZGVyX3NlY29uZHMgPSBzZWNvbmRzIC0gd2hvbGVfc2Vjb25kczsKKworICAgICAgICBpbnQgZGVncmVlcyA9IHNpZ24gKiB3aG9sZV9zZWNvbmRzIC8gU0VDT05EU19JTl9ERUdSRUU7CisgICAgICAgIHdob2xlX3NlY29uZHMgPSB3aG9sZV9zZWNvbmRzICUgU0VDT05EU19JTl9ERUdSRUU7CisgICAgICAgIGludCBtaW51dGVzID0gd2hvbGVfc2Vjb25kcyAvIFNFQ09ORFNfSU5fTUlOVVRFOworICAgICAgICBzZWNvbmRzID0gd2hvbGVfc2Vjb25kcyAlIFNFQ09ORFNfSU5fTUlOVVRFICsgcmVtYWluZGVyX3NlY29uZHM7CisKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBjb3JyZWN0IHZhbHVlIGlzIGRpc3BsYXllZCBpbiB0aGUgZWRpdG9yLgorICAgICAgICAvLyBUaGVyZSBpcyBhIHNsaWdodCB0d2VhayB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgbmVnYXRpdmUgYW5nbGVzCisgICAgICAgIC8vIHdob3NlIGFic29sdXRlIHZhbHVlIGlzID4gMCBhbmQgPCAxLiBXZSB3YW50IHRvIGRpc3BsYXkgdGhlCisgICAgICAgIC8vIGFsd2F5cyBkaXNwbGF5IHRoZSAiLSIgc2lnbiBpbiB0aGUgZmlyc3QgYm94LCBldmVuIGlmIGRlZ3JlZXMKKyAgICAgICAgLy8gaXMgMC4KKyAgICAgICAgbURlZ3JlZXNWYWx1ZUVkaXRvci5zZXRUZXh0KAorICAgICAgICAgICAgICAgIFFTdHJpbmcoZGVncmVlcyA9PSAwICYmIHNpZ24gPT0gLTEgPyAiLSIgOiAiIikgKworICAgICAgICAgICAgICAgIFFTdHJpbmc6Om51bWJlcihkZWdyZWVzKSk7CisgICAgICAgIG1NaW51dGVzVmFsdWVFZGl0b3Iuc2V0VGV4dChRU3RyaW5nOjpudW1iZXIobWludXRlcykpOworICAgICAgICBtU2Vjb25kc1ZhbHVlRWRpdG9yLnNldFRleHQoUVN0cmluZzo6bnVtYmVyKHNlY29uZHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIEFuZ2xlSW5wdXRXaWRnZXQ6OnNldElucHV0TW9kZShBbmdsZUlucHV0V2lkZ2V0OjpJbnB1dE1vZGUgbW9kZSkgeworICAgIG1DdXJyZW50SW5wdXRNb2RlID0gbW9kZTsKKyAgICB1cGRhdGVWaWV3KCk7Cit9CisKK3ZvaWQgQW5nbGVJbnB1dFdpZGdldDo6dXBkYXRlVmFsdWVGcm9tRGVjaW1hbElucHV0KCkgeworICAgIHZhbGlkYXRlQW5kVXBkYXRlVmFsdWUobURlY2ltYWxWYWx1ZUVkaXRvci50ZXh0KCkudG9Eb3VibGUoKSk7Cit9CisKK3N0YXRpYyBib29sIGhhc1ZhbGlkVmFsdWUoY29uc3QgUUxpbmVFZGl0JiBsZSkgeworICAgIFFTdHJpbmcgc3RyID0gbGUudGV4dCgpOworICAgIGludCBwb3MgPSAwOworICAgIHJldHVybiBsZS52YWxpZGF0b3IoKS0+dmFsaWRhdGUoc3RyLCBwb3MpID09IFFWYWxpZGF0b3I6OkFjY2VwdGFibGU7Cit9CisKK3ZvaWQgQW5nbGVJbnB1dFdpZGdldDo6dXBkYXRlVmFsdWVGcm9tU2V4YWdlc2ltYWxJbnB1dCgpIHsKKyAgICAvLyBFbnN1cmUgdGhhdCBBTEwgaW5wdXQgYm94ZXMgY29udGFpbiBhIHZhbGlkIHZhbHVlLgorICAgIGlmICghaGFzVmFsaWRWYWx1ZShtRGVncmVlc1ZhbHVlRWRpdG9yKSB8fAorICAgICAgICAhaGFzVmFsaWRWYWx1ZShtTWludXRlc1ZhbHVlRWRpdG9yKSB8fAorICAgICAgICAhaGFzVmFsaWRWYWx1ZShtU2Vjb25kc1ZhbHVlRWRpdG9yKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IGRlZ3JlZXMgPSBtRGVncmVlc1ZhbHVlRWRpdG9yLnRleHQoKS50b0ludCgpOworICAgIGludCBtaW51dGVzID0gbU1pbnV0ZXNWYWx1ZUVkaXRvci50ZXh0KCkudG9JbnQoKTsKKyAgICBkb3VibGUgc2Vjb25kcyA9IG1TZWNvbmRzVmFsdWVFZGl0b3IudGV4dCgpLnRvRG91YmxlKCk7CisKKyAgICAvLyBBZ2FpbiwgdGhlcmUncyBhIHR3ZWFrIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVuIHRoZSBhYnMKKyAgICAvLyB2YWx1ZSBvZiBhIG5lZ2F0aXZlIGFuZ2xlIGlzIGJldHdlZW4gMCBhbmQgMSBkZWdyZWVzLAorICAgIC8vIGkuZS4gMCBkZWcgMzAgbWluIDI1IHNlYy4gIi0iIHNpZ24gaXMgYWx3YXlzIGluIHRoZSAiZGVncmVlcyIKKyAgICAvLyBib3gsIGV2ZW4gaWYgImRlZ3JlZXMiIGlzIDAuCisgICAgaW50IHNpZ24gPQorICAgICAgICBkZWdyZWVzID09IDAgJiYgbURlZ3JlZXNWYWx1ZUVkaXRvci50ZXh0KClbMF0gPT0gJy0nCisgICAgICAgICAgICA/IC0xCisgICAgICAgICAgICA6IHNnbihkZWdyZWVzKTsKKworICAgIHZhbGlkYXRlQW5kVXBkYXRlVmFsdWUoCisgICAgICAgIChzaWduID09IDAgPyAxIDogc2lnbikgKiAoYWJzKGRlZ3JlZXMpICsKKyAgICAgICAgICAgICAgICBtaW51dGVzIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihNSU5VVEVTX0lOX0RFR1JFRSkgKworICAgICAgICAgICAgICAgIHNlY29uZHMgLyBzdGF0aWNfY2FzdDxkb3VibGU+KFNFQ09ORFNfSU5fREVHUkVFKSkpOworfQorCit2b2lkIEFuZ2xlSW5wdXRXaWRnZXQ6OnZhbGlkYXRlQW5kVXBkYXRlVmFsdWUoZG91YmxlIG5ld192YWx1ZSkgeworICAgIGlmIChuZXdfdmFsdWUgPj0gbU1pblZhbHVlICYmIG5ld192YWx1ZSA8PSBtTWF4VmFsdWUpIHsKKyAgICAgICAgbURlY2ltYWxWYWx1ZSA9IG5ld192YWx1ZTsKKyAgICAgICAgZW1pdCh2YWx1ZUNoYW5nZWQobURlY2ltYWxWYWx1ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvcmNlIGRpc3BsYXkgdGhlIG9sZCB2YWx1ZSBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgd2FzIG91dCBvZiByYW5nZS4KKyAgICAgICAgdXBkYXRlVmlldygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FuZ2xlLWlucHV0LXdpZGdldC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvYW5nbGUtaW5wdXQtd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4MzlhYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2FuZ2xlLWlucHV0LXdpZGdldC5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxRRG91YmxlVmFsaWRhdG9yPgorI2luY2x1ZGUgPFFIQm94TGF5b3V0PgorI2luY2x1ZGUgPFFMYWJlbD4KKyNpbmNsdWRlIDxRTGluZUVkaXQ+CisjaW5jbHVkZSA8UUludFZhbGlkYXRvcj4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorCisvLyBUaGlzIGlzIGEgd2lkZ2V0IGZvciBzcGVjaWZ5aW5nIGFuZ2xlIHZhbHVlcy4KKy8vIEl0IGhhcyB0d28gaW5wdXQgbW9kZXMgLSBkZWNpbWFsIGFuZCBzZXhhZ2VzaW1hbC4KKy8vIEluIGRlY2ltYWwgbW9kZSwgaXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBzaW5nbGUKKy8vIGRlY2ltYWwgdmFsdWUgaW4gZGVncmVlcywgaS5lLiAxMC41IGRlZ3JlZXMKKy8vIEluIHNleGFnZXNpbWFsIG1vZGUsIGl0IGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSB2YWx1ZQorLy8gaW4gdGVybXMgb2YgZGVncmVlcywgbWludXRlcyBhbmQgc2Vjb25kcywgaS5lLiAxMCBkZWdyZWVzIGFuZAorLy8gMzAgbWludXRlcy4KKy8vIFRoZSB3aWRnZXQgbGltaXRzIHRoZSBpbnB1dCB2YWx1ZXMgdG8gYSBjZXJ0YWluIHJhbmdlLiBUaGUKKy8vIGRlZmF1bHQgcmFuZ2UgaXMgWy0xODA7ICsxODBdLgorY2xhc3MgQW5nbGVJbnB1dFdpZGdldCA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKyAgICBRX1BST1BFUlRZKGRvdWJsZSB2YWx1ZSBSRUFEIHZhbHVlIE5PVElGWSB2YWx1ZUNoYW5nZWQgVVNFUiB0cnVlKTsKKworcHVibGljOgorICAgIGVudW0gY2xhc3MgSW5wdXRNb2RlIHsKKyAgICAgICAgRGVjaW1hbCwKKyAgICAgICAgU2V4YWdlc2ltYWwKKyAgICB9OworCisgICAgZXhwbGljaXQgQW5nbGVJbnB1dFdpZGdldChRV2lkZ2V0KiBwYXJlbnQgPSBudWxscHRyKTsKKworICAgIC8vIEZvciBzZXR0aW5nIHRoZSB2YWx1ZSBwcm9ncmFtbWF0aWNhbGx5LgorICAgIC8vIFRoZSB2YWx1ZSB3aWxsIGJlIGNsaXBwZWQgdG8gdGhlIGN1cnJlbnQgdmFsdWUgcmFuZ2UuCisgICAgLy8gVGhpcyB3aWxsIE5PVCB0cmlnZ2VyIGEgdmFsdWVDaGFuZ2VkIHNpZ25hbC4KKyAgICB2b2lkIHNldFZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBkZWNpbWFsIG1lYXN1cmUgb2YgdGhlIGFuZ2xlLCBpbiBkZWdyZWVzLgorICAgIGRvdWJsZSB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWNpbWFsVmFsdWU7IH0KKworICAgIC8vIEluZGljYXRlcyB3aGljaCBpbnB1dCBtb2RlIHRoZSB3aWRnZXQgaXMgY3VycmVudGx5IGluLgorICAgIElucHV0TW9kZSBjdXJyZW50TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50SW5wdXRNb2RlOyB9CisKKyAgICAvLyBNb2RpZnkgdGhlIHJhbmdlIG9mIGlucHV0IHZhbHVlcyBhbGxvd2VkIGJ5IHRoZSB3aWRnZXQgYnkKKyAgICAvLyBzZXR0aW5nIHRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWUuCisgICAgLy8gSWYgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBtYXggdmFsdWUsCisgICAgLy8gdGhlIHJhbmdlIGlzIG5vdCBtb2RpZmllZC4KKyAgICAvLyBJZiBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbCwgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZQorICAgIC8vIHByb3ZpZGVkIGFyZ3VtZW50LCBpdCBpcyBzZXQgdG8gdGhlIHByb3ZpZGVkIGFyZ3VtZW50LgorICAgIHZvaWQgc2V0TWluVmFsdWUoZG91YmxlIHZhbHVlKTsKKworICAgIC8vIE1vZGlmeSB0aGUgcmFuZ2Ugb2YgaW5wdXQgdmFsdWVzIGFsbG93ZWQgYnkgdGhlIHdpZGdldCBieQorICAgIC8vIHNldHRpbmcgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZS4KKyAgICAvLyBJZiB0aGUgcHJvdmlkZWQgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IG1pbiB2YWx1ZSwKKyAgICAvLyB0aGUgcmFuZ2UgaXMgbm90IG1vZGlmaWVkLgorICAgIC8vIElmIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLCB0aGUgY3VycmVudCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4KKyAgICAvLyB0aGUgcHJvdmlkZWQgYXJndW1lbnQsIGl0IGlzIHNldCB0byB0aGUgcHJvdmlkZWQgYXJndW1lbnQuCisgICAgdm9pZCBzZXRNYXhWYWx1ZShkb3VibGUgdmFsdWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1pbmltdW0gdmFsdWUgYWxsb3dlZCBieSB0aGUgd2lkZ2V0LgorICAgIGRvdWJsZSBtaW5WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1NaW5WYWx1ZTsgfQorCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1heGltdW0gdmFsdWUgYWxsb3dlZCBieSB0aGUgd2lkZ2V0LgorICAgIGRvdWJsZSBtYXhWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1NYXhWYWx1ZTsgfQorCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgbGF0ZXN0IExhdC9Mb24gaW5wdXQgZnJvbSB0aGUgdXNlci4KKyAgICAvLyBJZiBhIG51bWJlciBpcyB2YWxpZCwgaXQgaXMgdXNlZC4gSWYgaXQgaXMgaW52YWxpZCwgdGhlCisgICAgLy8gcHJldmlvdXMgdmFsaWQgbnVtYmVyIGlzIHJlLWRpc3BsYXllZC4KKyAgICAvLyBUaGlzIHdheSwgdGhlIHVzZXIgc2VlcyB0aGUgTGF0L0xvbiB0aGF0IGlzIGFjdHVhbGx5IHNlbnQKKyAgICAvLyB0byB0aGUgQVZELgorICAgIHZvaWQgZm9yY2VVcGRhdGUoKTsKKworcHVibGljIHNsb3RzOgorICAgIC8vIFNldHMgdGhlIHdpZGdldCdzIGN1cnJlbnQgaW5wdXQgbW9kZSB0byBlaXRoZXIgZGVjaW1hbCBvciBzZXhhZ2VzaW1hbC4KKyAgICB2b2lkIHNldElucHV0TW9kZShJbnB1dE1vZGUpOworCitzaWduYWxzOgorICAgIC8vIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB2YWx1ZS4KKyAgICAvLyBSZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IGlucHV0IG1vZGUsIG5ld192YWx1ZSB3aWxsIGFsd2F5cyBiZSBhIGRlY2ltYWwKKyAgICAvLyB2YWx1ZSBzcGVjaWZpZWQgaW4gZGVncmVlcywgaS5lLiAxMC41IGRlZ3JlZXMuCisgICAgdm9pZCB2YWx1ZUNoYW5nZWQoZG91YmxlIG5ld192YWx1ZSk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgLy8gVXBkYXRlcyB0aGUgaW50ZXJuYWwgdmFsdWUgYmFzZWQgb24gdGhlIGRlY2ltYWwgZWRpdG9yLgorICAgIHZvaWQgdXBkYXRlVmFsdWVGcm9tRGVjaW1hbElucHV0KCk7CisKKyAgICAvLyBVcGRhdGVzIHRoZSBpbnRlcm5hbCB2YWx1ZSBiYXNlZCBvbiB0aGUgc2V4YWdlc2ltYWwgZWRpdG9yLgorICAgIHZvaWQgdXBkYXRlVmFsdWVGcm9tU2V4YWdlc2ltYWxJbnB1dCgpOworCisgICAgLy8gQ2hlY2tzIHRoYXQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50IGZpdHMgaW50byB0aGUgcmFuZ2UgcGVybWl0dGVkCisgICAgLy8gYnkgdGhlIHdpZGdldC4gSWYgaXQgZG9lcywgdXBkYXRlcyB0aGUgaW50ZXJuYWwgdmFsdWUgYW5kIGVtaXRzCisgICAgLy8gdGhlIGFwcHJvcHJpYXRlIHNpZ25hbC4KKyAgICB2b2lkIHZhbGlkYXRlQW5kVXBkYXRlVmFsdWUoZG91YmxlIG5ld192YWx1ZSk7CisKKyAgICAvLyBVcGRhdGVzIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIHNldCBvZiB3aWRnZXRzIChkZXBlbmRpbmcgb24gdGhlCisgICAgLy8gaW5wdXQgbW9kZSkgdG8gY29ycmVjdGx5IGRpc3BsYXkgdGhlIGN1cnJlbnQgdmFsdWUuCisgICAgdm9pZCB1cGRhdGVWaWV3KCk7Citwcml2YXRlOgorICAgIFFGcmFtZSBtRGVjaW1hbE1vZGVGcmFtZTsKKyAgICBRRnJhbWUgbVNleGFnZXNpbWFsTW9kZUZyYW1lOworICAgIFFIQm94TGF5b3V0IG1EZWNpbWFsRnJhbWVMYXlvdXQ7CisgICAgUUhCb3hMYXlvdXQgbVNleGFnZXNpbWFsRnJhbWVMYXlvdXQ7CisgICAgUUxpbmVFZGl0IG1EZWNpbWFsVmFsdWVFZGl0b3I7CisgICAgUUxpbmVFZGl0IG1EZWdyZWVzVmFsdWVFZGl0b3I7CisgICAgUUxpbmVFZGl0IG1NaW51dGVzVmFsdWVFZGl0b3I7CisgICAgUUxpbmVFZGl0IG1TZWNvbmRzVmFsdWVFZGl0b3I7CisgICAgUUxhYmVsIG1EZWdyZWVzTGFiZWw7CisgICAgUUxhYmVsIG1NaW51dGVzTGFiZWw7CisgICAgUUxhYmVsIG1TZWNvbmRzTGFiZWw7CisgICAgUURvdWJsZVZhbGlkYXRvciBtRGVjaW1hbERlZ3JlZVZhbGlkYXRvcjsKKyAgICBRSW50VmFsaWRhdG9yIG1JbnRlZ2VyRGVncmVlVmFsaWRhdG9yOworICAgIFFJbnRWYWxpZGF0b3IgbU1pblZhbGlkYXRvcjsKKyAgICBRRG91YmxlVmFsaWRhdG9yIG1TZWNWYWxpZGF0b3I7CisgICAgUUhCb3hMYXlvdXQgbUxheW91dDsKKyAgICBRRG91YmxlVmFsaWRhdG9yKiBtVmFsdWVWYWxpZGF0b3I7CisgICAgZG91YmxlIG1NaW5WYWx1ZTsKKyAgICBkb3VibGUgbU1heFZhbHVlOworICAgIGRvdWJsZSBtRGVjaW1hbFZhbHVlOworICAgIElucHV0TW9kZSBtQ3VycmVudElucHV0TW9kZTsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VkaXRhYmxlLXNsaWRlci13aWRnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTA0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmgiCisKKyNpbmNsdWRlIDxRRXZlbnQ+CisjaW5jbHVkZSA8UVN0eWxlPgorCitFZGl0YWJsZVNsaWRlcldpZGdldDo6RWRpdGFibGVTbGlkZXJXaWRnZXQoUVdpZGdldCAqcGFyZW50KSA6CisgICAgUVdpZGdldChwYXJlbnQpLAorICAgIG1NaW5WYWx1ZUxhYmVsKHRoaXMpLAorICAgIG1NYXhWYWx1ZUxhYmVsKHRoaXMpLAorICAgIG1TbGlkZXIoUXQ6Okhvcml6b250YWwsIHRoaXMpLAorICAgIG1MaW5lRWRpdCh0aGlzKSwKKyAgICBtTGluZUVkaXRWYWxpZGF0b3IoJm1MaW5lRWRpdCkgeworCisgICAgLy8gQXJyYW5nZSB0aGUgY2hpbGQgd2lkZ2V0cyBpbiBhIGxheW91dC4KKyAgICBtU2xpZGVyTGFiZWxzTGF5b3V0LnNldFNwYWNpbmcoMCk7CisgICAgbVNsaWRlckxhYmVsc0xheW91dC5hZGRXaWRnZXQoJm1NaW5WYWx1ZUxhYmVsKTsKKyAgICBtU2xpZGVyTGFiZWxzTGF5b3V0LmFkZFdpZGdldCgmbU1heFZhbHVlTGFiZWwpOworICAgIG1Bbm5vdGF0ZWRTbGlkZXJMYXlvdXQuc2V0U3BhY2luZygwKTsKKyAgICBtQW5ub3RhdGVkU2xpZGVyTGF5b3V0LmFkZFdpZGdldCgmbVNsaWRlcik7CisgICAgbUFubm90YXRlZFNsaWRlckxheW91dC5hZGRTcGFjaW5nKDMpOworICAgIG1Bbm5vdGF0ZWRTbGlkZXJMYXlvdXQuYWRkTGF5b3V0KCZtU2xpZGVyTGFiZWxzTGF5b3V0KTsKKyAgICBtRWRpdEJveExheW91dC5zZXRTcGFjaW5nKDApOworICAgIG1FZGl0Qm94TGF5b3V0LmFkZFdpZGdldCgmbUxpbmVFZGl0KTsKKyAgICBtRWRpdEJveExheW91dC5hZGRTdHJldGNoKCk7CisgICAgbU1haW5MYXlvdXQuc2V0U3BhY2luZygwKTsKKyAgICBtTWFpbkxheW91dC5hZGRMYXlvdXQoJm1Bbm5vdGF0ZWRTbGlkZXJMYXlvdXQpOworICAgIG1NYWluTGF5b3V0LmFkZFNwYWNpbmcoMTYpOworICAgIG1NYWluTGF5b3V0LmFkZExheW91dCgmbUVkaXRCb3hMYXlvdXQpOworICAgIHNldExheW91dCgmbU1haW5MYXlvdXQpOworCisgICAgLy8gU2V0IGluaXRpYWwgdmFsdWVzLgorICAgIHNldE1pbmltdW0oc3RhdGljX2Nhc3Q8aW50PihtU2xpZGVyLm1pbmltdW0oKS8xMC4wKSk7CisgICAgc2V0TWF4aW11bShzdGF0aWNfY2FzdDxpbnQ+KG1TbGlkZXIubWF4aW11bSgpLzEwLjApKTsKKyAgICBzZXRWYWx1ZShzdGF0aWNfY2FzdDxpbnQ+KG1TbGlkZXIudmFsdWUoKS8xMC4wKSk7CisKKyAgICAvLyBEbyBzb21lIGFkanVzdG1lbnRzIHRvIGNoaWxkIHdpZGdldHMuCisgICAgbU1pblZhbHVlTGFiZWwuc2V0QWxpZ25tZW50KFF0OjpBbGlnbkxlZnQgfCBRdDo6QWxpZ25Ub3ApOworICAgIG1NYXhWYWx1ZUxhYmVsLnNldEFsaWdubWVudChRdDo6QWxpZ25SaWdodCB8IFF0OjpBbGlnblRvcCk7CisgICAgbU1pblZhbHVlTGFiZWwuc2V0UHJvcGVydHkoIkNvbG9yR3JvdXAiLCAiU2xpZGVyTGFiZWwiKTsKKyAgICBtTWF4VmFsdWVMYWJlbC5zZXRQcm9wZXJ0eSgiQ29sb3JHcm91cCIsICJTbGlkZXJMYWJlbCIpOworICAgIG1MaW5lRWRpdFZhbGlkYXRvci5zZXREZWNpbWFscygxKTsKKyAgICBtTGluZUVkaXRWYWxpZGF0b3Iuc2V0Tm90YXRpb24oUURvdWJsZVZhbGlkYXRvcjo6U3RhbmRhcmROb3RhdGlvbik7CisgICAgbUxpbmVFZGl0VmFsaWRhdG9yLnNldExvY2FsZShRTG9jYWxlOjpjKCkpOworICAgIG1MaW5lRWRpdC5zZXRWYWxpZGF0b3IoJm1MaW5lRWRpdFZhbGlkYXRvcik7CisgICAgbUxpbmVFZGl0LnNldEFsaWdubWVudChRdDo6QWxpZ25SaWdodCB8IFF0OjpBbGlnblRvcCk7CisgICAgbUxpbmVFZGl0LnNldE1heGltdW1XaWR0aCg2MCk7CisgICAgbUxpbmVFZGl0LnNldFRleHRNYXJnaW5zKDAsIDAsIDAsIDQpOworICAgIG1MaW5lRWRpdC5zZXRQcm9wZXJ0eSgiY2xhc3MiLCAiRWRpdGFibGVWYWx1ZSIpOworICAgIG1MaW5lRWRpdC5pbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7CisKKyAgICAvLyBIYW5kbGUgY2hpbGQgd2lkZ2V0cycgdmFsdWUgY2hhbmdlcyBpbiBvdXIgb3duIHNsb3RzLgorICAgIGNvbm5lY3QoJm1TbGlkZXIsIFNJR05BTCh2YWx1ZUNoYW5nZWQoaW50KSksIHRoaXMsIFNMT1Qoc2xpZGVyVmFsdWVDaGFuZ2VkKGludCkpKTsKKyAgICBjb25uZWN0KCZtU2xpZGVyLCBTSUdOQUwoc2xpZGVyUHJlc3NlZCgpKSwgdGhpcywgU0lHTkFMKHNsaWRlclByZXNzZWQoKSkpOworICAgIGNvbm5lY3QoJm1TbGlkZXIsIFNJR05BTChzbGlkZXJSZWxlYXNlZCgpKSwgdGhpcywgU0lHTkFMKHNsaWRlclJlbGVhc2VkKCkpKTsKKyAgICBjb25uZWN0KCZtTGluZUVkaXQsIFNJR05BTChlZGl0aW5nRmluaXNoZWQoKSksIHRoaXMsIFNMT1QobGluZUVkaXRWYWx1ZUNoYW5nZWQoKSkpOworfQorCit2b2lkIEVkaXRhYmxlU2xpZGVyV2lkZ2V0OjpzZXRWYWx1ZShkb3VibGUgdmFsdWUsIGJvb2wgZW1pdF9zaWduYWwpIHsKKyAgICAvLyBDbGlwIHRoZSB2YWx1ZSB0byB0aGUgYWxsb3dlZCByYW5nZS4KKyAgICBtVmFsdWUgPQorICAgICAgICB2YWx1ZSA8IG1NaW5pbXVtID8gbU1pbmltdW0gOiAodmFsdWUgPiBtTWF4aW11bSA/IG1NYXhpbXVtIDogdmFsdWUpOworCisgICAgLy8gVXBkYXRlIHRoZSB2YWx1ZXMgZGlzcGxheWVkIGJ5IHRoZSBzbGlkZXIgYW5kIHRoZSBlZGl0IGJveC4KKyAgICB7CisgICAgICAgIFFTaWduYWxCbG9ja2VyIGJsb2NrZXIobVNsaWRlcik7CisgICAgICAgIG1TbGlkZXIuc2V0VmFsdWUoc3RhdGljX2Nhc3Q8aW50PihtVmFsdWUgKiAxMC4wKSk7CisgICAgfQorICAgIG1MaW5lRWRpdC5zZXRUZXh0KFFTdHJpbmcoIiUxIikuYXJnKG1WYWx1ZSwgMCwgJ2YnLCAxLCAnMCcpKTsKKyAgICBpZiAoZW1pdF9zaWduYWwpIHsKKyAgICAgICAgZW1pdCB2YWx1ZUNoYW5nZWQobVZhbHVlKTsKKyAgICAgICAgZW1pdCB2YWx1ZUNoYW5nZWQoKTsKKyAgICB9CisgICAgbUxpbmVFZGl0LnNldFByb3BlcnR5KCJDb2xvckdyb3VwIiwgUVN0cmluZygpKTsKKyAgICBtTGluZUVkaXQuc3R5bGUoKS0+dW5wb2xpc2goJm1MaW5lRWRpdCk7CisgICAgbUxpbmVFZGl0LnN0eWxlKCktPnBvbGlzaCgmbUxpbmVFZGl0KTsKK30KKwordm9pZCBFZGl0YWJsZVNsaWRlcldpZGdldDo6c2V0TWluaW11bShkb3VibGUgbWluaW11bSkgeworICAgIG1NaW5pbXVtID0gbWluaW11bTsKKyAgICBtTGluZUVkaXRWYWxpZGF0b3Iuc2V0Qm90dG9tKG1NaW5pbXVtKTsKKyAgICBzZXRWYWx1ZShtVmFsdWUpOyAvLyBGb3JjZSB0aGUgY3VycmVudCB2YWx1ZSBpbnRvIHRoZSBuZXcgYm91bmRzLgorICAgIG1NaW5WYWx1ZUxhYmVsLnNldFRleHQoUVN0cmluZzo6bnVtYmVyKG1NaW5pbXVtKSk7CisgICAgbVNsaWRlci5zZXRNaW5pbXVtKHN0YXRpY19jYXN0PGludD4obU1pbmltdW0gKiAxMC4wKSk7Cit9CisKK3ZvaWQgRWRpdGFibGVTbGlkZXJXaWRnZXQ6OnNldE1heGltdW0oZG91YmxlIG1heGltdW0pIHsKKyAgICBtTWF4aW11bSA9IG1heGltdW07CisgICAgbUxpbmVFZGl0VmFsaWRhdG9yLnNldFRvcChtTWF4aW11bSk7CisgICAgc2V0VmFsdWUobVZhbHVlKTsgLy8gRm9yY2UgdGhlIGN1cnJlbnQgdmFsdWUgaW50byB0aGUgbmV3IGJvdW5kcy4KKyAgICBtTWF4VmFsdWVMYWJlbC5zZXRUZXh0KFFTdHJpbmc6Om51bWJlcihtTWF4aW11bSkpOworICAgIG1TbGlkZXIuc2V0TWF4aW11bShzdGF0aWNfY2FzdDxpbnQ+KG1NYXhpbXVtICogMTAuMCkpOworfQorCit2b2lkIEVkaXRhYmxlU2xpZGVyV2lkZ2V0OjpzbGlkZXJWYWx1ZUNoYW5nZWQoaW50IG5ld192YWx1ZSkgeworICAgIHNldFZhbHVlKHN0YXRpY19jYXN0PGRvdWJsZT4obmV3X3ZhbHVlKSAvIDEwLjApOworfQorCit2b2lkIEVkaXRhYmxlU2xpZGVyV2lkZ2V0OjpsaW5lRWRpdFZhbHVlQ2hhbmdlZCgpIHsKKyAgICBRU3RyaW5nIG5ld192YWx1ZSA9IG1MaW5lRWRpdC50ZXh0KCk7CisgICAgc2V0VmFsdWUobmV3X3ZhbHVlLnRvRG91YmxlKCkpOworfQorCitib29sIEVkaXRhYmxlU2xpZGVyV2lkZ2V0OjpldmVudEZpbHRlcihRT2JqZWN0KiwgUUV2ZW50KiBlKSB7CisgICAgaWYgKGUtPnR5cGUoKSA9PSBRRXZlbnQ6OkZvY3VzSW4pIHsKKyAgICAgICAgLy8gSWYgdGhlIGVkaXQgYm94IHdhcyBwcmV2aW91c2x5IGhpZ2hsaWdodGVkIGR1ZSB0byBhbgorICAgICAgICAvLyBpbnZhbGlkIHZhbHVlLCB1bi1oaWdobGlnaHQgaXQuCisgICAgICAgIG1MaW5lRWRpdC5zZXRQcm9wZXJ0eSgiQ29sb3JHcm91cCIsIFFTdHJpbmcoKSk7CisgICAgICAgIG1MaW5lRWRpdC5zdHlsZSgpLT51bnBvbGlzaCgmbUxpbmVFZGl0KTsKKyAgICAgICAgbUxpbmVFZGl0LnN0eWxlKCktPnBvbGlzaCgmbUxpbmVFZGl0KTsKKyAgICB9IGVsc2UgaWYgKGUtPnR5cGUoKSA9PSBRRXZlbnQ6OkZvY3VzT3V0KSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGVkaXQgYm94IGxvc2VzIGZvY3VzLCBoaWdobGlnaHQgaXQKKyAgICAgICAgLy8gaWYgaXQgY29udGFpbnMgYW4gaW52YWxpZCB2YWx1ZS4KKyAgICAgICAgaW50IGR1bW15OworICAgICAgICBRU3RyaW5nIHRleHQgPSBtTGluZUVkaXQudGV4dCgpOworICAgICAgICBpZiAobUxpbmVFZGl0LnZhbGlkYXRvcigpLT52YWxpZGF0ZSh0ZXh0LCBkdW1teSkgIT0gUVZhbGlkYXRvcjo6QWNjZXB0YWJsZSkgeworICAgICAgICAgICAgbUxpbmVFZGl0LnNldFByb3BlcnR5KCJDb2xvckdyb3VwIiwgUVN0cmluZygiSW52YWxpZElucHV0IikpOworICAgICAgICAgICAgbUxpbmVFZGl0LnN0eWxlKCktPnVucG9saXNoKCZtTGluZUVkaXQpOworICAgICAgICAgICAgbUxpbmVFZGl0LnN0eWxlKCktPnBvbGlzaCgmbUxpbmVFZGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkZDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VkaXRhYmxlLXNsaWRlci13aWRnZXQuaApAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UURvdWJsZVZhbGlkYXRvcj4KKyNpbmNsdWRlIDxRSEJveExheW91dD4KKyNpbmNsdWRlIDxRTGFiZWw+CisjaW5jbHVkZSA8UUxpbmVFZGl0PgorI2luY2x1ZGUgPFFTbGlkZXI+CisjaW5jbHVkZSA8UVZCb3hMYXlvdXQ+CisjaW5jbHVkZSA8UVdpZGdldD4KKworLy8gVGhpcyB3aWRnZXQgaXMgc291cGVkLXVwIHNsaWRlciB0aGF0IHN1cHBvcnRzIGZyYWN0aW9uYWwgdmFsdWVzLCBhbmQgaGFzIGFuIGVkaXRhYmxlCisvLyB0ZXh0IGJveCBuZXh0IHRvIGl0IHRoYXQgZGlzcGxheXMgdGhlIGN1cnJlbnQgdmFsdWUuCitjbGFzcyBFZGl0YWJsZVNsaWRlcldpZGdldCA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKyAgICBRX1BST1BFUlRZKGRvdWJsZSB2YWx1ZSBSRUFEIGdldFZhbHVlIFdSSVRFIHNldFZhbHVlIE5PVElGWSB2YWx1ZUNoYW5nZWQgVVNFUiB0cnVlKTsKKyAgICBRX1BST1BFUlRZKGRvdWJsZSBtaW5pbXVtIFJFQUQgZ2V0TWluaW11bSBXUklURSBzZXRNaW5pbXVtKTsKKyAgICBRX1BST1BFUlRZKGRvdWJsZSBtYXhpbXVtIFJFQUQgZ2V0TWF4aW11bSBXUklURSBzZXRNYXhpbXVtKTsKKworcHVibGljOgorICAgIGV4cGxpY2l0IEVkaXRhYmxlU2xpZGVyV2lkZ2V0KFFXaWRnZXQgKnBhcmVudCA9IDApOworCisgICAgZG91YmxlIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbVZhbHVlOyB9CisgICAgZG91YmxlIGdldE1pbmltdW0oKSBjb25zdCB7IHJldHVybiBtTWluaW11bTsgfQorICAgIGRvdWJsZSBnZXRNYXhpbXVtKCkgY29uc3QgeyByZXR1cm4gbU1heGltdW07IH0KKworICAgIC8vIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHdpZGdldC4KKyAgICAvLyBUaGUgcHJvdmlkZWQgdmFsdWUgaXMgY2xpcHBlZCB0byB0aGUgYm91bmRzIGN1cnJlbnRseSBpbXBvc2VkIGJ5IHRoZQorICAgIC8vIHdpZGdldCwgaS5lLiBpZiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbG93ZXIgdGhhbiBtaW1pbXVtIGFsbG93ZWQgdmFsdWUsIHRoZQorICAgIC8vIGFjdHVhbCB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgbWluaW11bSBhbGxvd2VkIHZhbHVlLCBhbmQgaWYgdGhlIHByb3ZpZGVkCisgICAgLy8gdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUsIHRoZSBhY3R1YWwgdmFsdWUgd2lsbCBiZQorICAgIC8vIHNldCB0byBtYXguCisgICAgLy8gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGVtaXQgdGhlIHZhbHVlQ2hhbmdlZCBzaWduYWwgYXMgbG9uZyBhcyB0aGUKKyAgICAvLyBlbWl0X3NpZ25hbCBwYXJhbWV0ZXIgaXMgdHJ1ZS4KKyAgICB2b2lkIHNldFZhbHVlKGRvdWJsZSB2YWx1ZSwgYm9vbCBlbWl0X3NpZ25hbCA9IHRydWUpOworCisgICAgLy8gQ2hhbmdlcyB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGFsbG93ZWQgdmFsdWUgcmFuZ2UuIFRoZSBjdXJyZW50IHZhbHVlIGlzCisgICAgLy8gY2xpcHBlZCB0byBmaXQgaW50byB0aGUgbmV3IHJhbmdlLgorICAgIHZvaWQgc2V0TWluaW11bShkb3VibGUgbWluaW11bSk7CisKKyAgICAvLyBDaGFuZ2VzIHRoZSB1cHBlciBib3VuZCBvZiB0aGUgYWxsb3dlZCB2YWx1ZSByYW5nZS4gVGhlIGN1cnJlbnQgdmFsdWUgaXMKKyAgICAvLyBjbGlwcGVkIHRvIGZpdCBpbnRvIHRoZSBuZXcgcmFuZ2UuCisgICAgdm9pZCBzZXRNYXhpbXVtKGRvdWJsZSBtYXhpbXVtKTsKKworICAgIC8vIEVxdWl2YWxlbnQgdG8gY2FsbGluZyBzZXRNaW5pbXVtIGFuZCBzZXRNYXhpbXVtIG9uZSBhZnRlciBhbm90aGVyLCB3aXRoCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuIElmIHRoZSByYW5nZSBpcyBpbnZhbGlkIChpLmUuIG1pbmltdW0gPj0gbWF4aW11bSksCisgICAgLy8gdGhpcyBtZXRob2Qgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKyAgICB2b2lkIHNldFJhbmdlKGRvdWJsZSBtaW5pbXVtLCBkb3VibGUgbWF4aW11bSkgeworICAgICAgICBpZiAobWluaW11bSA8IG1heGltdW0pIHsKKyAgICAgICAgICAgIHNldE1pbmltdW0obWluaW11bSk7CisgICAgICAgICAgICBzZXRNYXhpbXVtKG1heGltdW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzbGlkZXIgaXMgcHJlc3NlZCBkb3duLgorICAgIGJvb2wgaXNTbGlkZXJEb3duKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNsaWRlci5pc1NsaWRlckRvd24oKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBib29sIGV2ZW50RmlsdGVyKFFPYmplY3QqLCBRRXZlbnQqKSBvdmVycmlkZTsKKworc2lnbmFsczoKKyAgICAvLyBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHZhbHVlIHN0b3JlZCBieSB0aGUgd2lkZ2V0IGNoYW5nZXMuCisgICAgdm9pZCB2YWx1ZUNoYW5nZWQoZG91YmxlIHZhbHVlKTsKKyAgICB2b2lkIHZhbHVlQ2hhbmdlZCgpOworICAgIHZvaWQgc2xpZGVyUHJlc3NlZCgpOworICAgIHZvaWQgc2xpZGVyUmVsZWFzZWQoKTsKKworcHJpdmF0ZSBzbG90czoKKyAgICAvLyBIYW5kbGVzIHRoZSBjaGFuZ2VzIGluIHRoZSBjaGlsZCBzbGlkZXIgd2lkZ2V0LgorICAgIHZvaWQgc2xpZGVyVmFsdWVDaGFuZ2VkKGludCBuZXdfdmFsdWUpOworCisgICAgLy8gSGFuZGxlcyBjaGFuZ2VzIGluIHRoZSBjaGlsZCBsaW5lIGVkaXQgd2lkZ2V0LgorICAgIHZvaWQgbGluZUVkaXRWYWx1ZUNoYW5nZWQoKTsKKworcHJpdmF0ZToKKyAgICBkb3VibGUgbVZhbHVlOworICAgIGRvdWJsZSBtTWluaW11bTsKKyAgICBkb3VibGUgbU1heGltdW07CisgICAgUUhCb3hMYXlvdXQgbU1haW5MYXlvdXQ7CisgICAgUVZCb3hMYXlvdXQgbUFubm90YXRlZFNsaWRlckxheW91dDsKKyAgICBRVkJveExheW91dCBtRWRpdEJveExheW91dDsKKyAgICBRSEJveExheW91dCBtU2xpZGVyTGFiZWxzTGF5b3V0OworICAgIFFMYWJlbCBtTWluVmFsdWVMYWJlbDsKKyAgICBRTGFiZWwgbU1heFZhbHVlTGFiZWw7CisgICAgUVNsaWRlciBtU2xpZGVyOworICAgIFFMaW5lRWRpdCBtTGluZUVkaXQ7CisgICAgUURvdWJsZVZhbGlkYXRvciBtTGluZUVkaXRWYWxpZGF0b3I7Cit9OworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1jb250YWluZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItY29udGFpbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTBiZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItY29udGFpbmVyLmNwcApAQCAtMCwwICsxLDMxMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLWNvbnRhaW5lci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5oIgorCisjaW5jbHVkZSA8UXRDb3JlPgorI2luY2x1ZGUgPFFBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPFFTY3JvbGxCYXI+CisjaW5jbHVkZSA8UVN0eWxlPgorI2luY2x1ZGUgPFFTdHlsZUZhY3Rvcnk+CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvbWFjLW5hdGl2ZS13aW5kb3cuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5oIgorI2VuZGlmCisKK0VtdWxhdG9yQ29udGFpbmVyOjpFbXVsYXRvckNvbnRhaW5lcihFbXVsYXRvclF0V2luZG93KiB3aW5kb3cpCisgICAgOiBRU2Nyb2xsQXJlYSgpLCBtRW11bGF0b3JXaW5kb3cod2luZG93KSB7CisgICAgc2V0RnJhbWVTaGFwZShRRnJhbWU6Ok5vRnJhbWUpOworICAgIHNldFdpZGdldCh3aW5kb3cpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBoaW50cyBwcmV2ZW50IHRoZSBtaW5pbWl6ZS9tYXhpbWl6ZS9jbG9zZSBidXR0b25zIGZyb20KKyAgICAvLyBhcHBlYXJpbmcuCisgICAgc2V0V2luZG93RmxhZ3MoUXQ6OldpbmRvd1RpdGxlSGludCB8IFF0OjpDdXN0b21pemVXaW5kb3dIaW50IHwgUXQ6OldpbmRvdyk7CisKKyNpZmRlZiBfX0FQUExFX18KKyAgICAvLyBEaWdnaW5nIGludG8gdGhlIFF0IHNvdXJjZSBjb2RlIHJldmVhbHMgdGhhdCBpZiB0aGUgYWJvdmUgZmxhZ3MgYXJlIHNldAorICAgIC8vIG9uIE9TWCwgdGhlIGNyZWF0ZWQgd2luZG93IHdpbGwgYmUgZ2l2ZW4gYSBzdHlsZSBtYXNrIHRoYXQgcmVtb3ZlcyB0aGUKKyAgICAvLyByZXNpemUgaGFuZGxlcyBmcm9tIHRoZSB3aW5kb3cuIFRoZSBoaW50IGJlbG93IGlzIHRoZSBzcGVjaWZpYworICAgIC8vIGN1c3RvbWl6YXRpb24gZmxhZyB0aGF0IGVuc3VyZXMgdGhlIHdpbmRvdyB3aWxsIGhhdmUgcmVzaXplIGhhbmRsZXMuCisgICAgLy8gU28sIHdlIGFkZCB0aGUgYnV0dG9uIGZvciBub3csIHRoZW4gaW1tZWRpYXRlbHkgZGlzYWJsZSBpdCB3aGVuIHRoZQorICAgIC8vIHdpbmRvdyBpcyBmaXJzdCBzaG93bi4KKyAgICBzZXRXaW5kb3dGbGFncyh0aGlzLT53aW5kb3dGbGFncygpIHwgUXQ6OldpbmRvd01heGltaXplQnV0dG9uSGludCk7CisKKyAgICAvLyBPbiBPUyBYIHRoZSBuYXRpdmUgc2Nyb2xsYmFycyBkaXNhcHBlYXIgd2hlbiBub3QgaW4gdXNlIHdoaWNoCisgICAgLy8gbWFrZXMgdGhlIHpvb21lZC1pbiBlbXVsYXRvciB3aW5kb3cgbG9vayB1bnNjcm9sbGFibGUuIEFsc28sIGR1ZQorICAgIC8vIHRvIHRoZSBzZW1pLXRyYW5zcGFyZW50IG5hdHVyZSBvZiB0aGUgc2Nyb2xsYmFyLCBpdCB3aWxsCisgICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIG1haW4gR0wgd2luZG93LCBjYXVzaW5nIGFsbCBraW5kcyBvZiB1Z2x5CisgICAgLy8gZWZmZWN0cy4KKyAgICBRU3R5bGUqIHN0eWxlID0gUVN0eWxlRmFjdG9yeTo6Y3JlYXRlKCJGdXNpb24iKTsKKyAgICBpZiAoc3R5bGUpIHsKKyAgICAgICAgdGhpcy0+dmVydGljYWxTY3JvbGxCYXIoKS0+c2V0U3R5bGUoc3R5bGUpOworICAgICAgICB0aGlzLT5ob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFN0eWxlKHN0eWxlKTsKKyAgICAgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmUU9iamVjdDo6ZGVzdHJveWVkLCBbc3R5bGVdIHsgZGVsZXRlIHN0eWxlOyB9KTsKKyAgICB9CisjZW5kaWYgIC8vIF9fQVBQTEVfXworCisgICAgbVJlc2l6ZVRpbWVyLnNldFNpbmdsZVNob3QodHJ1ZSk7CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbVJlc2l6ZVRpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgIFNMT1Qoc2xvdF9yZXNpemVEb25lKCkpKTsKK30KKworRW11bGF0b3JDb250YWluZXI6On5FbXVsYXRvckNvbnRhaW5lcigpIHsKKyAgICAvLyBUaGlzIG9iamVjdCBpcyBvd25lZCBkaXJlY3RseSBieSB8d2luZG93fC4gIEF2b2lkIGNpcmN1bGFyCisgICAgLy8gZGVzdHJ1Y3RvciBjYWxscyBieSBleHBsaWNpdGx5IHVuc2V0dGluZyB0aGUgd2lkZ2V0LgorICAgIHRha2VXaWRnZXQoKTsKK30KKworYm9vbCBFbXVsYXRvckNvbnRhaW5lcjo6ZXZlbnQoUUV2ZW50KiBlKSB7CisgICAgLy8gSWdub3JlIE1ldGFDYWxsIGFuZCBVcGRhdGVSZXF1ZXN0IGV2ZW50cywgYW5kIGRvbid0IHNuYXAgaW4gem9vbSBtb2RlLgorICAgIGlmIChtRW11bGF0b3JXaW5kb3ctPmlzSW5ab29tTW9kZSgpIHx8IGUtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1ldGFDYWxsIHx8CisgICAgICAgIGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlVwZGF0ZVJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIFFTY3JvbGxBcmVhOjpldmVudChlKTsKKyAgICB9CisKKyAgICAvLyBBZGQgdG8gdGhlIGV2ZW50IGJ1ZmZlciwgYnV0IGtlZXAgaXQgYSByZWFzb25hYmxlIHNpemUgLSBhIGZldyBldmVudHMsCisgICAgLy8gc3VjaCBhcyByZXBhaW50LAorICAgIC8vIGNhbiBvY2N1ciBpbiBiZXR3ZWVuIHJlc2l6ZXMgYnV0IGJlZm9yZSB0aGUgcmVsZWFzZSBoYXBwZW5zCisgICAgbUV2ZW50QnVmZmVyLnB1c2hfYmFjayhlLT50eXBlKCkpOworICAgIGlmIChtRXZlbnRCdWZmZXIuc2l6ZSgpID4gOCkgeworICAgICAgICBtRXZlbnRCdWZmZXIucmVtb3ZlRmlyc3QoKTsKKyAgICB9CisKKyAgICAvLyBTY2FuIHRvIHNlZSBpZiBhIHJlc2l6ZSBldmVudCBoYXBwZW5lZCByZWNlbnRseQorICAgIGJvb2wgZm91bmRSZXNpemUgPSBmYWxzZTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCBtRXZlbnRCdWZmZXIuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1FdmVudEJ1ZmZlcltpXSA9PSBRRXZlbnQ6OlJlc2l6ZSkgeworICAgICAgICAgICAgZm91bmRSZXNpemUgPSB0cnVlOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmluZyByZXNpemUtb3ZlciBpcyBPUyBzcGVjaWZpYworICAgIC8vIERvIHNvIGJ5IHNjYW5uaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGV2ZW50IGJ1ZmZlciBmb3Igc3BlY2lmaWMKKyAgICAvLyBjb21iaW5hdGlvbnMKKyAgICBpZiAoZm91bmRSZXNpemUpIHsKKyNpZmRlZiBfV0lOMzIKKworICAgICAgICBmb3IgKDsgaSA8IG1FdmVudEJ1ZmZlci5zaXplKCkgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtRXZlbnRCdWZmZXJbaV0gPT0gUUV2ZW50OjpOb25DbGllbnRBcmVhTW91c2VCdXR0b25SZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgbUV2ZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5kb1Jlc2l6ZSh0aGlzLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgLy8gS2lsbCB0aGUgcmVzaXplIHRpbWVyIHRvIGF2b2lkIGRvdWJsZSByZXNpemVzLgorICAgICAgICAgICAgICAgIHN0b3BSZXNpemVUaW1lcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNlbGlmIF9fbGludXhfXworCisgICAgICAgIGZvciAoOyBpIDwgbUV2ZW50QnVmZmVyLnNpemUoKSAtIDM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1FdmVudEJ1ZmZlcltpXSA9PSBRRXZlbnQ6OldpbmRvd0FjdGl2YXRlICYmCisgICAgICAgICAgICAgICAgbUV2ZW50QnVmZmVyW2kgKyAxXSA9PSBRRXZlbnQ6OkFjdGl2YXRpb25DaGFuZ2UgJiYKKyAgICAgICAgICAgICAgICBtRXZlbnRCdWZmZXJbaSArIDJdID09IFFFdmVudDo6Rm9jdXNJbiAmJgorICAgICAgICAgICAgICAgIG1FdmVudEJ1ZmZlcltpICsgM10gPT0gUUV2ZW50OjpJbnB1dE1ldGhvZFF1ZXJ5KSB7CisgICAgICAgICAgICAgICAgbUV2ZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5kb1Jlc2l6ZSh0aGlzLT5zaXplKCkpOworCisgICAgICAgICAgICAgICAgLy8gS2lsbCB0aGUgcmVzaXplIHRpbWVyIHRvIGF2b2lkIGRvdWJsZSByZXNpemVzLgorICAgICAgICAgICAgICAgIHN0b3BSZXNpemVUaW1lcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNlbGlmIF9fQVBQTEVfXworCisgICAgICAgIGlmIChlLT50eXBlKCkgPT0gUUV2ZW50OjpOb25DbGllbnRBcmVhTW91c2VNb3ZlIHx8CisgICAgICAgICAgICBlLT50eXBlKCkgPT0gUUV2ZW50OjpFbnRlciB8fCBlLT50eXBlKCkgPT0gUUV2ZW50OjpMZWF2ZSkgeworICAgICAgICAgICAgbUV2ZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPmRvUmVzaXplKHRoaXMtPnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIEtpbGwgdGhlIHJlc2l6ZSB0aW1lciB0byBhdm9pZCBkb3VibGUgcmVzaXplcy4KKyAgICAgICAgICAgIHN0b3BSZXNpemVUaW1lcigpOworICAgICAgICB9CisKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiBRU2Nyb2xsQXJlYTo6ZXZlbnQoZSk7Cit9CisKK3ZvaWQgRW11bGF0b3JDb250YWluZXI6OmNoYW5nZUV2ZW50KFFFdmVudCogZXZlbnQpIHsKKyAgICAvLyBTdHJpY3RseSBwcmV2ZW50aW5nIHRoZSBtYXhpbWl6aW5nIChjYWxsZWQgInpvb21pbmciIG9uIE9TIFgpIG9mIGEKKyAgICAvLyB3aW5kb3cgaXMgaGFyZCAtIGl0IGNoYW5nZXMgYnkgaG9zdCwgYW5kIGV2ZW4gYnkgd2luZG93IG1hbmFnZXIgb24KKyAgICAvLyBMaW51eC4gVGhlcmVmb3JlLCB3ZSBjb3VudGVyYWN0IGl0IGJ5IHNlZWluZyBpZiB0aGUgd2luZG93IGV2ZXIKKyAgICAvLyBlbnRlcnMgYSBtYXhpbWl6ZWQgc3RhdGUsIGFuZCBpZiBpdCBkb2VzLCBpbW1lZGlhdGVseSB1bmRvaW5nIHRoYXQKKyAgICAvLyBtYXhpbWl6YXRpb24uCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgd2UgKmRvIG5vdCogY2FsbCBldmVudC0+aWdub3JlKCkuIE1heGltaXppbmcgaGFwcGVucyBpbiB0aGUKKyAgICAvLyBPUy1sZXZlbCB3aW5kb3csIG5vdCBRdCdzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aW5kb3cuIFRoaXMgZXZlbnQKKyAgICAvLyBzaW1wbHkgbm90aWZpZXMgdGhlIFF0IHJlcHJlc2VudGF0aW9uIChhbmQgdXMpIHRoYXQgdGhlIE9TLWxldmVsIHdpbmRvdworICAgIC8vIGhhcyBjaGFuZ2VkIHRvIGEgbWF4aW1pemVkIHN0YXRlLiBXZSBkbyBub3Qgd2FudCB0byBpZ25vcmUgdGhpcyBzdGF0ZQorICAgIC8vIGNoYW5nZSwgd2UganVzdCB3YW50IHRvIGNvdW50ZXJhY3QgdGhlIGVmZmVjdHMgaXQgaGFkLgorICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6V2luZG93U3RhdGVDaGFuZ2UpIHsKKyAgICAgICAgaWYgKHdpbmRvd1N0YXRlKCkgJiBRdDo6V2luZG93TWF4aW1pemVkKSB7CisgICAgICAgICAgICBzaG93Tm9ybWFsKCk7CisgICAgICAgIH0gZWxzZSBpZiAod2luZG93U3RhdGUoKSAmIFF0OjpXaW5kb3dNaW5pbWl6ZWQpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHdpbmRvdyB3YXMgbWluaW1pemVkIHdpdGhvdXQgcHJlc3NpbmcgdGhlIHRvb2xiYXIncworICAgICAgICAgICAgLy8gbWluaW1pemUgYnV0dG9uICh3aGljaCBpcyBwb3NzaWJsZSBvbiBzb21lIHdpbmRvdyBtYW5hZ2VycyksCisgICAgICAgICAgICAvLyByZW1lbWJlciB0byBoaWRlIHRoZSB0b29sYmFyICh3aGljaCB3aWxsIGFsc28gaGlkZSB0aGUgZXh0ZW5kZWQKKyAgICAgICAgICAgIC8vIHdpbmRvdywgaWYgaXQgZXhpc3RzKS4KKyAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+dG9vbFdpbmRvdygpLT5oaWRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JDb250YWluZXI6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGV2ZW50KSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5jbG9zZUV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFbXVsYXRvckNvbnRhaW5lcjo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50KiBldmVudCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+dG9vbFdpbmRvdygpLT5yYWlzZSgpOworICAgIGlmIChtRW11bGF0b3JXaW5kb3ctPmlzSW5ab29tTW9kZSgpKSB7CisgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+c2hvd1pvb21JZk5vdFVzZXJIaWRkZW4oKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JDb250YWluZXI6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldmVudCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+a2V5UHJlc3NFdmVudChldmVudCk7Cit9CisKK3ZvaWQgRW11bGF0b3JDb250YWluZXI6OmtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqIGV2ZW50KSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5rZXlSZWxlYXNlRXZlbnQoZXZlbnQpOworfQorCit2b2lkIEVtdWxhdG9yQ29udGFpbmVyOjptb3ZlRXZlbnQoUU1vdmVFdmVudCogZXZlbnQpIHsKKyAgICBRU2Nyb2xsQXJlYTo6bW92ZUV2ZW50KGV2ZW50KTsKKyAgICBtRW11bGF0b3JXaW5kb3ctPnNpbXVsYXRlV2luZG93TW92ZWQoZXZlbnQtPnBvcygpKTsKKyAgICBtRW11bGF0b3JXaW5kb3ctPnRvb2xXaW5kb3coKS0+ZG9ja01haW5XaW5kb3coKTsKK30KKwordm9pZCBFbXVsYXRvckNvbnRhaW5lcjo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50KiBldmVudCkgeworICAgIFFTY3JvbGxBcmVhOjpyZXNpemVFdmVudChldmVudCk7CisgICAgbUVtdWxhdG9yV2luZG93LT50b29sV2luZG93KCktPmRvY2tNYWluV2luZG93KCk7CisgICAgbUVtdWxhdG9yV2luZG93LT5zaW11bGF0ZVpvb21lZFdpbmRvd1Jlc2l6ZWQodGhpcy0+dmlld3BvcnRTaXplKCkpOworCisgICAgLy8gVG8gc29sdmUgc29tZSByZXNpemluZyBlZGdlIGNhc2VzIG9uIE9TWC9XaW5kb3dzL0tERSwgc3RhcnQgYSBzaG9ydAorICAgIC8vIHRpbWVyIHRoYXQgd2lsbCBhdHRlbXB0IHRvIHRyaWdnZXIgYSByZXNpemUgaW4gY2FzZSB0aGUgdXNlcidzIG1vdXNlIGhhcworICAgIC8vIG5vdCBlbnRlcmVkIHRoZSB3aW5kb3cgYWdhaW4uIFdlIHVzZSBhIGxvbmdlciB0aW1lciBvbiBMaW51eCBiZWNhdXNlCisgICAgLy8gdGhlIHRpbWVyIGlzIG5vdCBuZWVkZWQgb24gbm9uLUtERSBzeXN0ZW1zLCBzbyB3ZSB3YW50IGl0IHRvIGJlIGxlc3MKKyAgICAvLyBub3RpY2VhYmxlLgorI2lmZGVmIF9fbGludXhfXworICAgIG1SZXNpemVUaW1lci5zdGFydCgxMDAwKTsKKyNlbHNlCisgICAgbVJlc2l6ZVRpbWVyLnN0YXJ0KDUwMCk7CisjZW5kaWYKK30KKwordm9pZCBFbXVsYXRvckNvbnRhaW5lcjo6c2hvd0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KSB7CisvLyBEaXNhYmxlIHRvIG1heGltaXplIGJ1dHRvbiBvbiBPU1guIFNlZSB0aGUgY29tbWVudCBpbiB0aGUgY29uc3RydWN0b3IgZm9yIGFuCisvLyBleHBsYW5hdGlvbiBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuCisjaWZkZWYgX19BUFBMRV9fCisgICAgV0lkIHdpZCA9IGVmZmVjdGl2ZVdpbklkKCk7CisgICAgd2lkID0gKFdJZClnZXROU1dpbmRvdygodm9pZCopd2lkKTsKKyAgICBuc1dpbmRvd0hpZGVXaW5kb3dCdXR0b25zKCh2b2lkKil3aWQpOworI2VuZGlmIC8vIF9fQVBQTEVfXworCisgICAgLy8gc2hvd0V2ZW50KCkgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgZW11bGF0b3IgaXMgbWluaW1pemVkIGJlY2F1c2Ugd2UgYXJlCisgICAgLy8gY2FsbGluZyBzaG93TWluaW1pemVkKCksIHdoaWNoICp0ZWNobmljYWxseSogaXMgYSBzaG93IGV2ZW50LiBXZSBvbmx5CisgICAgLy8gd2FudCB0byByZS1zaG93IHRoZSB0b29sYmFyIHdoZW4gd2UgYXJlIHRyYW5zaXRpb25pbmcgdG8gYSBub3QtbWluaW1pemVkCisgICAgLy8gc3RhdGUuIEhvd2V2ZXIsIHdlIG11c3QgZG8gaXQgYWZ0ZXIgY2hhbmdpbmcgZmxhZ3Mgb24gTGludXguCisgICAgaWYgKCEod2luZG93U3RhdGUoKSAmIFF0OjpXaW5kb3dNaW5pbWl6ZWQpKSB7CisvLyBBcyBzZWVuIGJlbG93IGluIHNob3dNaW5pbWl6ZWQoKSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIG1pbmltaXplIGJ1dHRvbiBvbgorLy8gTGludXggd2hlbiB0aGUgd2luZG93IGlzIHJlLXNob3duLiBXZSBrbm93IHRoaXMgc2hvdyBldmVudCBpcyBmcm9tIGJlaW5nCisvLyB1bi1taW5pbWl6ZWQgYmVjYXVzZSB0aGUgbWluaW1pemVkIGJ1dHRvbiBmbGFnIGlzIHByZXNlbnQuCisjaWZkZWYgX19saW51eF9fCisgICAgICAgIFF0OjpXaW5kb3dGbGFncyBmbGFncyA9IHdpbmRvd0ZsYWdzKCk7CisgICAgICAgIGlmIChmbGFncyAmIFF0OjpXaW5kb3dNaW5pbWl6ZUJ1dHRvbkhpbnQpIHsKKyAgICAgICAgICAgIHNldFdpbmRvd0ZsYWdzKGZsYWdzICYgflF0OjpXaW5kb3dNaW5pbWl6ZUJ1dHRvbkhpbnQpOworCisgICAgICAgICAgICAvLyBDaGFuZ2luZyB3aW5kb3cgZmxhZ3MgcmVxdWlyZXMgcmUtc2hvd2luZyB0aGlzIHdpbmRvdyB0byBlbnN1cmUKKyAgICAgICAgICAgIC8vIHRoZSBmbGFncyBhcmUgYXBwcm9wcmlhdGVseSBjaGFuZ2VkLgorICAgICAgICAgICAgc2hvd05vcm1hbCgpOworCisgICAgICAgICAgICAvLyBUaGUgc3Vid2luZG93IHdvbid0IHJlZHJhdyB1bnRpbCB0aGUgZ3Vlc3Qgc2NyZWVuIGNoYW5nZXMsIHdoaWNoCisgICAgICAgICAgICAvLyBtYXkgbm90IGhhcHBlbiBmb3IgYSBtaW51dGUgKHdoZW4gdGhlIGNsb2NrIGNoYW5nZXMpLCBzbyBmb3JjZSBhCisgICAgICAgICAgICAvLyByZWRyYXcgYWZ0ZXIgcmUtc2hvd2luZyB0aGUgd2luZG93LgorICAgICAgICAgICAgU2tpbkV2ZW50KiBldmVudCA9IG5ldyBTa2luRXZlbnQoKTsKKyAgICAgICAgICAgIGV2ZW50LT50eXBlID0ga0V2ZW50Rm9yY2VSZWRyYXc7CisgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnF1ZXVlU2tpbkV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorI2VuZGlmIC8vIF9fbGludXhfXworICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnRvb2xXaW5kb3coKS0+c2hvdygpOworICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnRvb2xXaW5kb3coKS0+ZG9ja01haW5XaW5kb3coKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JDb250YWluZXI6OnNob3dNaW5pbWl6ZWQoKSB7CisvLyBTb21lIExpbnV4IHdpbmRvdyBtYW5hZ2VycyAoc3BlY2lmaWNhbGx5LCBDb21waXosIHdoaWNoIGlzIHRoZSBkZWZhdWx0CisvLyBVYnVudHUgd2luZG93IG1hbmFnZXIpIHdpbGwgbm90IGFsbG93IG1pbmltaXppbmcgdW5sZXNzIHRoZSBtaW5pbWl6ZQorLy8gYnV0dG9uIGlzIGFjdHVhbGx5IHRoZXJlISBTbywgd2UgcmUtYWRkIHRoZSBidXR0b24sIG1pbmltaXplIHRoZSB3aW5kb3csCisvLyBhbmQgdGhlbiByZW1vdmUgdGhlIGJ1dHRvbiB3aGVuIGl0IGdldHMgcmVzaG93bi4KKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzZXRXaW5kb3dGbGFncyh3aW5kb3dGbGFncygpIHwgUXQ6OldpbmRvd01pbmltaXplQnV0dG9uSGludCk7CisjZW5kaWYgLy8gX19saW51eF9fCisgICAgUVNjcm9sbEFyZWE6OnNob3dNaW5pbWl6ZWQoKTsKK30KKwordm9pZCBFbXVsYXRvckNvbnRhaW5lcjo6c3RvcFJlc2l6ZVRpbWVyKCkgeworICAgIG1SZXNpemVUaW1lci5zdG9wKCk7Cit9CisKK1FTaXplIEVtdWxhdG9yQ29udGFpbmVyOjp2aWV3cG9ydFNpemUoKSBjb25zdCB7CisgICAgUVNpemUgb3V0cHV0ID0gdGhpcy0+c2l6ZSgpOworCisgICAgUVNjcm9sbEJhciogdmVydGljYWwgPSB0aGlzLT52ZXJ0aWNhbFNjcm9sbEJhcigpOworICAgIG91dHB1dC5zZXRXaWR0aChvdXRwdXQud2lkdGgoKSAtCisgICAgICAgICAgICAgICAgICAgICh2ZXJ0aWNhbC0+aXNWaXNpYmxlKCkgPyB2ZXJ0aWNhbC0+d2lkdGgoKSA6IDApKTsKKworICAgIFFTY3JvbGxCYXIqIGhvcml6b250YWwgPSB0aGlzLT5ob3Jpem9udGFsU2Nyb2xsQmFyKCk7CisgICAgb3V0cHV0LnNldEhlaWdodChvdXRwdXQuaGVpZ2h0KCkgLQorICAgICAgICAgICAgICAgICAgICAgKGhvcml6b250YWwtPmlzVmlzaWJsZSgpID8gaG9yaXpvbnRhbC0+aGVpZ2h0KCkgOiAwKSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCit2b2lkIEVtdWxhdG9yQ29udGFpbmVyOjpzbG90X3Jlc2l6ZURvbmUoKSB7CisgICAgaWYgKG1FbXVsYXRvcldpbmRvdy0+aXNJblpvb21Nb2RlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworLy8gV2luZG93cyBhbmQgQXBwbGUgaGF2ZSBjb252ZW5pZW50IHdheXMgb2YgY2hlY2tpbmcgZ2xvYmFsIG1vdXNlIHN0YXRlLCBzbworLy8gd2UnbGwgb25seSBkbyBhIHJlc2l6ZSBpZiBubyBtb3VzZSBidXR0b25zIGFyZSBoZWxkIGRvd24uCisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX1dJTjMyKQorICAgIC8vIEEgaGFja3kgd2F5IG9mIGRldGVybWluaW5nIGlmIHRoZSB1c2VyIGlzIHN0aWxsIGhvbGRpbmcgZG93biBmb3IgYQorICAgIC8vIHJlc2l6ZS4KKyAgICAvLyBUaGlzIHF1ZXJpZXMgdGhlIGdsb2JhbCBldmVudCBzdGF0ZSB0byBzZWUgaWYgYW55IG1vdXNlIGJ1dHRvbnMgYXJlIGhlbGQKKyAgICAvLyBkb3duLgorICAgIC8vIElmIHRoZXJlIGFyZSwgdGhlbiB0aGUgdXNlciBtdXN0IG5vdCBiZSBkb25lIHJlc2l6aW5nIHlldC4KKyAgICBpZiAobnVtSGVsZE1vdXNlQnV0dG9ucygpID09IDApIHsKKyAgICAgICAgbUVtdWxhdG9yV2luZG93LT5kb1Jlc2l6ZSh0aGlzLT5zaXplKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZXNpemVUaW1lci5zdGFydCg1MDApOworICAgIH0KKyNlbmRpZgorCisvLyBYMTEgZG9lc24ndC4gSG9wZSB0aGF0IHRoZSB1c2VyIGlzbid0IHN0aWxsIGhvbGRpbmcgZG93biBhIG1vdXNlIGJ1dHRvbiwgYW5kCisvLyBpZiB0aGV5IGFyZSwgb2ggd2VsbC4KKyNpZmRlZiBfX2xpbnV4X18KKyAgICBtRW11bGF0b3JXaW5kb3ctPmRvUmVzaXplKHRoaXMtPnNpemUoKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLWNvbnRhaW5lci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk1NDgyYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLWNvbnRhaW5lci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxRdENvcmU+CisjaW5jbHVkZSA8UU9iamVjdD4KKyNpbmNsdWRlIDxRU2Nyb2xsQXJlYT4KKyNpbmNsdWRlIDxRVGltZXI+CisjaW5jbHVkZSA8UVdpZGdldD4KKworY2xhc3MgRW11bGF0b3JRdFdpbmRvdzsKKworY2xhc3MgRW11bGF0b3JDb250YWluZXIgOiBwdWJsaWMgUVNjcm9sbEFyZWEgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBFbXVsYXRvckNvbnRhaW5lcihFbXVsYXRvclF0V2luZG93KiB3aW5kb3cpOworICAgIHZpcnR1YWwgfkVtdWxhdG9yQ29udGFpbmVyKCk7CisKKyAgICB2b2lkIGNoYW5nZUV2ZW50KFFFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgY2xvc2VFdmVudChRQ2xvc2VFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIGJvb2wgZXZlbnQoUUV2ZW50KiBlKSBvdmVycmlkZTsKKyAgICB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIG1vdmVFdmVudChRTW92ZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIHNob3dFdmVudChRU2hvd0V2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNob3dNaW5pbWl6ZWQoKTsKKworICAgIHZvaWQgc3RvcFJlc2l6ZVRpbWVyKCk7CisgICAgUVNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBzbG90X3Jlc2l6ZURvbmUoKTsKKworcHJpdmF0ZToKKyAgICBFbXVsYXRvclF0V2luZG93KiBtRW11bGF0b3JXaW5kb3c7CisgICAgUUxpc3Q8UUV2ZW50OjpUeXBlPiBtRXZlbnRCdWZmZXI7CisgICAgUVRpbWVyIG1SZXNpemVUaW1lcjsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1vdmVybGF5LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLW92ZXJsYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDc1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1vdmVybGF5LmNwcApAQCAtMCwwICsxLDQwOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLW92ZXJsYXkuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1jb250YWluZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmgiCisKK0VtdWxhdG9yT3ZlcmxheTo6RW11bGF0b3JPdmVybGF5KEVtdWxhdG9yUXRXaW5kb3cqIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtdWxhdG9yQ29udGFpbmVyKiBjb250YWluZXIpCisgICAgOiBRRnJhbWUoY29udGFpbmVyKSwKKyAgICAgIG1FbXVsYXRvcldpbmRvdyh3aW5kb3cpLAorICAgICAgbUNvbnRhaW5lcihjb250YWluZXIpLAorICAgICAgbVJ1YmJlckJhbmQoUVJ1YmJlckJhbmQ6OlJlY3RhbmdsZSwgdGhpcyksCisgICAgICBtQ3Vyc29yKCI6L2N1cnNvci96b29tX2N1cnNvciIpLAorICAgICAgbU11bHRpdG91Y2hDZW50ZXIoLTEsIC0xKSwKKyAgICAgIG1QcmltYXJ5VG91Y2hQb2ludCgtMSwgLTEpLAorICAgICAgbVNlY29uZGFyeVRvdWNoUG9pbnQoLTEsIC0xKSwKKyAgICAgIG1SZWxlYXNlT25DbG9zZShmYWxzZSksCisgICAgICBtTGVycFZhbHVlKDEpLAorICAgICAgbUZsYXNoVmFsdWUoMCksCisgICAgICBtTW9kZShPdmVybGF5TW9kZTo6SGlkZGVuKSB7CisgICAgc2V0V2luZG93RmxhZ3MoUXQ6OkZyYW1lbGVzc1dpbmRvd0hpbnQgfCBRdDo6VG9vbCk7CisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9UcmFuc2x1Y2VudEJhY2tncm91bmQpOworCisvLyBXaXRob3V0IHRoZSBoaW50IGJlbG93LCBYMTEgd2luZG93IHN5c3RlbXMgd2lsbCBwcmV2ZW50IHRoaXMgd2luZG93IGZyb20KKy8vIGJlaW5nIG1vdmVkIGludG8gYSBwb3NpdGlvbiB3aGVyZSB0aGV5IGFyZSBub3QgZnVsbHkgdmlzaWJsZS4gSXQgaXMgcmVxdWlyZWQKKy8vIHNvIHRoYXQgd2hlbiB0aGUgZW11bGF0b3IgY29udGFpbmVyIGlzIG1vdmVkIHBhcnRpYWxseSBvZmZzY3JlZW4sIHRoaXMKKy8vIG92ZXJsYXkgaXMgInBlcm1pdHRlZCIgdG8gZm9sbG93IGl0IG9mZnNjcmVlbi4KKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzZXRXaW5kb3dGbGFncyh3aW5kb3dGbGFncygpIHwgUXQ6OlgxMUJ5cGFzc1dpbmRvd01hbmFnZXJIaW50KTsKKyNlbmRpZgorCisgICAgbVJ1YmJlckJhbmQuaGlkZSgpOworCisgICAgLy8gTG9hZCBpbiBoaWdoZXItcmVzb2x1dGlvbiBpbWFnZXMgb24gaGlnaGVyIHJlc29sdXRpb24gc2NyZWVucworICAgIGlmIChkZXZpY2VQaXhlbFJhdGlvKCkgPiAxLjUpIHsKKyAgICAgICAgbUNlbnRlckltYWdlLmxvYWQoIjovbXVsdGl0b3VjaC9jZW50ZXJfcG9pbnRfMngiKTsKKyAgICAgICAgbUNlbnRlckltYWdlLnNldERldmljZVBpeGVsUmF0aW8oZGV2aWNlUGl4ZWxSYXRpbygpKTsKKworICAgICAgICBtVG91Y2hJbWFnZS5sb2FkKCI6L211bHRpdG91Y2gvdG91Y2hfcG9pbnRfMngiKTsKKyAgICAgICAgbVRvdWNoSW1hZ2Uuc2V0RGV2aWNlUGl4ZWxSYXRpbyhkZXZpY2VQaXhlbFJhdGlvKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DZW50ZXJJbWFnZS5sb2FkKCI6L211bHRpdG91Y2gvY2VudGVyX3BvaW50Iik7CisgICAgICAgIG1Ub3VjaEltYWdlLmxvYWQoIjovbXVsdGl0b3VjaC90b3VjaF9wb2ludCIpOworICAgIH0KKworICAgIG1DZW50ZXJQb2ludFJhZGl1cyA9IG1DZW50ZXJJbWFnZS53aWR0aCgpIC8gZGV2aWNlUGl4ZWxSYXRpbygpOworICAgIG1Ub3VjaFBvaW50UmFkaXVzID0gbVRvdWNoSW1hZ2Uud2lkdGgoKSAvIGRldmljZVBpeGVsUmF0aW8oKTsKKworICAgIG1GbGFzaEFuaW1hdGlvbi5zZXRTdGFydFZhbHVlKDI1MCk7CisgICAgbUZsYXNoQW5pbWF0aW9uLnNldEVuZFZhbHVlKDApOworICAgIG1GbGFzaEFuaW1hdGlvbi5zZXRFYXNpbmdDdXJ2ZShRRWFzaW5nQ3VydmU6OkxpbmVhcik7CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbUZsYXNoQW5pbWF0aW9uLCBTSUdOQUwoZmluaXNoZWQoKSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3RfZmxhc2hBbmltYXRpb25GaW5pc2hlZCgpKSk7CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbUZsYXNoQW5pbWF0aW9uLCBTSUdOQUwodmFsdWVDaGFuZ2VkKFFWYXJpYW50KSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3RfZmxhc2hBbmltYXRpb25WYWx1ZUNoYW5nZWQoUVZhcmlhbnQpKSk7CisKKyAgICBtVG91Y2hQb2ludEFuaW1hdGlvbi5zZXRTdGFydFZhbHVlKDApOworICAgIG1Ub3VjaFBvaW50QW5pbWF0aW9uLnNldEVuZFZhbHVlKDI1MCk7CisgICAgbVRvdWNoUG9pbnRBbmltYXRpb24uc2V0RWFzaW5nQ3VydmUoUUVhc2luZ0N1cnZlOjpPdXRRdWludCk7CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbVRvdWNoUG9pbnRBbmltYXRpb24sIFNJR05BTCh2YWx1ZUNoYW5nZWQoUVZhcmlhbnQpKSwKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMsIFNMT1Qoc2xvdF9hbmltYXRpb25WYWx1ZUNoYW5nZWQoUVZhcmlhbnQpKSk7Cit9CisKK0VtdWxhdG9yT3ZlcmxheTo6fkVtdWxhdG9yT3ZlcmxheSgpIHt9CisKK3ZvaWQgRW11bGF0b3JPdmVybGF5Ojpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50KiBldmVudCkgeworICAgIGlmIChtTW9kZSA9PSBPdmVybGF5TW9kZTo6TXVsdGl0b3VjaCkgeworICAgICAgICBoaWRlQW5kRm9jdXNDb250YWluZXIoKTsKKyAgICB9IGVsc2UgaWYgKG1Nb2RlID09IE92ZXJsYXlNb2RlOjpab29tKSB7CisgICAgICAgIGhpZGUoKTsKKyAgICB9CisgICAgUUZyYW1lOjpmb2N1c091dEV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OmhpZGVFdmVudChRSGlkZUV2ZW50KiBldmVudCkgeworICAgIG1SdWJiZXJCYW5kLmhpZGUoKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldmVudCkgeworICAgIGlmIChldmVudC0+a2V5KCkgPT0gUXQ6OktleV9Db250cm9sICYmIG1Nb2RlID09IE92ZXJsYXlNb2RlOjpab29tKSB7CisgICAgICAgIGhpZGVBbmRGb2N1c0NvbnRhaW5lcigpOworICAgICAgICBtTW9kZSA9IE92ZXJsYXlNb2RlOjpVc2VySGlkZGVuWm9vbTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW11bGF0b3JXaW5kb3ctPmtleVByZXNzRXZlbnQoZXZlbnQpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OmtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqIGV2ZW50KSB7CisgICAgaWYgKGV2ZW50LT5rZXkoKSA9PSBRdDo6S2V5X0NvbnRyb2wgJiYgbU1vZGUgPT0gT3ZlcmxheU1vZGU6Ok11bHRpdG91Y2gpIHsKKyAgICAgICAgaGlkZUFuZEZvY3VzQ29udGFpbmVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVtdWxhdG9yV2luZG93LT5rZXlSZWxlYXNlRXZlbnQoZXZlbnQpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgeworICAgIGlmIChtTW9kZSA9PSBPdmVybGF5TW9kZTo6Wm9vbSkgeworICAgICAgICBtUnViYmVyQmFuZC5zZXRHZW9tZXRyeSgKKyAgICAgICAgICAgICAgICBRUmVjdChtUnViYmVyYmFuZE9yaWdpbiwgZXZlbnQtPnBvcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyc2VjdGVkKFFSZWN0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKSkpOworICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gT3ZlcmxheU1vZGU6Ok11bHRpdG91Y2gpIHsKKyAgICAgICAgbUxhc3RNb3VzZVBvcyA9IGV2ZW50LT5wb3MoKTsKKyAgICAgICAgdXBkYXRlVG91Y2hQb2ludHMoZXZlbnQpOworICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgZ2VuZXJhdGVUb3VjaEV2ZW50cyhldmVudCk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgeworICAgIGlmIChtTW9kZSA9PSBPdmVybGF5TW9kZTo6Wm9vbSkgeworICAgICAgICBtUnViYmVyYmFuZE9yaWdpbiA9IGV2ZW50LT5wb3MoKTsKKyAgICAgICAgbVJ1YmJlckJhbmQuc2V0R2VvbWV0cnkoUVJlY3QobVJ1YmJlcmJhbmRPcmlnaW4sIFFTaXplKCkpKTsKKyAgICAgICAgbVJ1YmJlckJhbmQuc2hvdygpOworICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gT3ZlcmxheU1vZGU6Ok11bHRpdG91Y2gpIHsKKyAgICAgICAgaWYgKCFhbmRyb2lkSHdDb25maWdfaXNTY3JlZW5NdWx0aVRvdWNoKGFuZHJvaWRfaHcpKSB7CisgICAgICAgICAgICBzaG93RXJyb3JEaWFsb2codHIoIllvdXIgdmlydHVhbCBkZXZpY2UgaXMgbm90IGNvbmZpZ3VyZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktdG91Y2ggaW5wdXQuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIoIk11bHRpLXRvdWNoIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2VPbkNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgIGdlbmVyYXRlVG91Y2hFdmVudHMoZXZlbnQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6bW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KSB7CisgICAgaWYgKG1Nb2RlID09IE92ZXJsYXlNb2RlOjpab29tKSB7CisgICAgICAgIFFSZWN0IGdlb20gPSBtUnViYmVyQmFuZC5nZW9tZXRyeSgpOworICAgICAgICBRUG9pbnQgbG9jYWxQb2ludCA9CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5tYXBGcm9tR2xvYmFsKG1hcFRvR2xvYmFsKGdlb20uY2VudGVyKCkpKTsKKworICAgICAgICAvLyBBc3N1bWUgdGhhdCB2ZXJ5LCB2ZXJ5IHNtYWxsIGRyYWdnZWQgcmVjdGFuZ2xlcyB3ZXJlIGFjdHVhbGx5IGp1c3QKKyAgICAgICAgLy8gY2xpY2tzIHRoYXQgc2xpcHBlZCBhIGJpdAorICAgICAgICBpbnQgYXJlYVNxID0KKyAgICAgICAgICAgICAgICBnZW9tLndpZHRoKCkgKiBnZW9tLndpZHRoKCkgKyBnZW9tLmhlaWdodCgpICogZ2VvbS5oZWlnaHQoKTsKKworICAgICAgICAvLyBMZWZ0IGNsaWNrIHpvb21zIGluCisgICAgICAgIGlmIChldmVudC0+YnV0dG9uKCkgPT0gUXQ6OkxlZnRCdXR0b24pIHsKKyAgICAgICAgICAgIC8vIENsaWNrIGV2ZW50cyAod2l0aCBubyBkcmFnKSBrZWVwIHRoZSBtb3VzZSBmb2N1c2VkIG9uIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBwaXhlbAorICAgICAgICAgICAgaWYgKGFyZWFTcSA8IDIwKSB7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT56b29tSW4oCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LCBtQ29udGFpbmVyLT5tYXBGcm9tR2xvYmFsKFFDdXJzb3I6OnBvcygpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBEcmFnZ2VkIHJlY3RhbmdsZXMgd2lsbCBjZW50ZXIgc2FpZCByZWN0YW5nbGUgYW5kIHpvb20gaW4gYXMKKyAgICAgICAgICAgICAgICAvLyBtdWNoIGFzIHBvc3NpYmxlCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+em9vbVRvKGxvY2FsUG9pbnQsIGdlb20uc2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmlnaHQgY2xpY2sgem9vbXMgb3V0CisgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPmJ1dHRvbigpID09IFF0OjpSaWdodEJ1dHRvbikgeworICAgICAgICAgICAgLy8gQ2xpY2sgZXZlbnRzICh3aXRoIG5vIGRyYWcpIGtlZXAgdGhlIG1vdXNlIGZvY3VzZWQgb24gdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIHBpeGVsCisgICAgICAgICAgICBpZiAoYXJlYVNxIDwgMjApIHsKKyAgICAgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnpvb21PdXQoCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LCBtQ29udGFpbmVyLT5tYXBGcm9tR2xvYmFsKFFDdXJzb3I6OnBvcygpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBEcmFnZ2VkIHJlY3RhbmdsZXMgd2lsbCByZXNldCB6b29tIHRvIDEKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT56b29tUmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUnViYmVyQmFuZC5oaWRlKCk7CisgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBPdmVybGF5TW9kZTo6TXVsdGl0b3VjaCkgeworICAgICAgICBnZW5lcmF0ZVRvdWNoRXZlbnRzKGV2ZW50KTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JPdmVybGF5Ojptb3ZlRXZlbnQoUU1vdmVFdmVudCogZXZlbnQpIHsKKyAgICBpZiAobU1vZGUgPT0gT3ZlcmxheU1vZGU6Ok11bHRpdG91Y2gpIHsKKyAgICAgICAgaGlkZUFuZEZvY3VzQ29udGFpbmVyKCk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6cGFpbnRFdmVudChRUGFpbnRFdmVudCogZSkgeworICAgIC8vIEEgZnJhbWVsZXNzIGFuZCB0cmFuc2x1Y2VudCB3aW5kb3cgKEFLQSBhIHRvdGFsbHkgaW52aXNpYmxlIG9uZSBsaWtlCisgICAgLy8gdGhpcykgd2lsbCBhY3R1YWxseSBub3QgYXBwZWFyIGF0IGFsbCBvbiBzb21lIHN5c3RlbXMuIFRvIGNpcmN1bXZlbnQKKyAgICAvLyB0aGlzLCB3ZSBkcmF3IGEgd2luZG93LXNpemVkIHF1YWQgdGhhdCBpcyBiYXNpY2FsbHkgaW52aXNpYmxlLCBmb3JjaW5nCisgICAgLy8gdGhlIHdpbmRvdyB0byBiZSBkcmF3bi4gQmVjYXVzZSB0aGlzIGlzIG5vdCBzdHJhbmdlIGVub3VnaCwgdGhlIGFscGhhCisgICAgLy8gdmFsdWUgb2Ygc2FpZCBxdWFkICptdXN0KiBiZSBhYm92ZSBhIGNlcnRhaW4gdGhyZXNob2xkIGVsc2UgdGhlIHdpbmRvdworICAgIC8vIHdpbGwgc2ltcGx5IG5vdCBhcHBlYXIuCisgICAgaW50IGFscGhhID0gbUZsYXNoVmFsdWUgKiAyNTU7CisKKy8vIE9uIE9TWCwgdGhpcyB0aHJlc2hvbGQgaXMgMTIsIHNvIG1ha2UgYWxwaGEgMTMuCisvLyBPbiBXaW5kb3dzLCB0aGlzIHRocmVzaG9sZCBpcyAwLCBzbyBtYWtlIGFscGhhIDEuCisvLyBPbiBMaW51eCwgdGhpcyB0aHJlc2hvbGQgaXMgMC4KKyNpZiBfX0FQUExFX18KKyAgICBpZiAoYWxwaGEgPCAxMykKKyAgICAgICAgYWxwaGEgPSAxMzsKKyNlbGlmIF9XSU4zMgorICAgIGlmIChhbHBoYSA8IDEpCisgICAgICAgIGFscGhhID0gMTsKKyNlbmRpZgorCisgICAgUVBhaW50ZXIgcGFpbnRlcih0aGlzKTsKKyAgICBwYWludGVyLnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OkFudGlhbGlhc2luZyk7CisgICAgUVJlY3QgYmcoUVBvaW50KDAsIDApLCBzaXplKCkpOworICAgIHBhaW50ZXIuZmlsbFJlY3QoYmcsIFFDb2xvcigyNTUsIDI1NSwgMjU1LCBhbHBoYSkpOworCisgICAgaWYgKG1Nb2RlID09IE92ZXJsYXlNb2RlOjpNdWx0aXRvdWNoKSB7CisgICAgICAgIGRvdWJsZSBsZXJwVmFsdWUgPSBtSXNTd2lwZUdlc3R1cmUgPyAxLjAgLSBtTGVycFZhbHVlIDogbUxlcnBWYWx1ZTsKKyAgICAgICAgUVBvaW50IHByaW1hcnlQb2ludCA9IGxlcnBWYWx1ZSAqIHByaW1hcnlQaW5jaFBvaW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEuMCAtIGxlcnBWYWx1ZSkgKiBwcmltYXJ5U3dpcGVQb2ludCgpOworICAgICAgICBRUG9pbnQgc2Vjb25kYXJ5UG9pbnQgPSBsZXJwVmFsdWUgKiBzZWNvbmRhcnlQaW5jaFBvaW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMS4wIC0gbGVycFZhbHVlKSAqIHNlY29uZGFyeVRvdWNoUG9pbnQoKTsKKworICAgICAgICBwYWludGVyLnRyYW5zbGF0ZSgtbVRvdWNoUG9pbnRSYWRpdXMgLyAyLCAtbVRvdWNoUG9pbnRSYWRpdXMgLyAyKTsKKyAgICAgICAgcGFpbnRlci5kcmF3SW1hZ2UocHJpbWFyeVBvaW50LCBtVG91Y2hJbWFnZSk7CisgICAgICAgIHBhaW50ZXIuZHJhd0ltYWdlKHNlY29uZGFyeVBvaW50LCBtVG91Y2hJbWFnZSk7CisgICAgICAgIHBhaW50ZXIucmVzZXRUcmFuc2Zvcm0oKTsKKworICAgICAgICBwYWludGVyLnNldE9wYWNpdHkobGVycFZhbHVlKTsKKyAgICAgICAgcGFpbnRlci50cmFuc2xhdGUoLW1DZW50ZXJQb2ludFJhZGl1cyAvIDIsIC1tQ2VudGVyUG9pbnRSYWRpdXMgLyAyKTsKKyAgICAgICAgcGFpbnRlci5kcmF3SW1hZ2UobU11bHRpdG91Y2hDZW50ZXIsIG1DZW50ZXJJbWFnZSk7CisgICAgICAgIHBhaW50ZXIucmVzZXRUcmFuc2Zvcm0oKTsKKworICAgICAgICBwYWludGVyLnNldE9wYWNpdHkoLjY3ICogbGVycFZhbHVlKTsKKyAgICAgICAgcGFpbnRlci5zZXRQZW4oUVBlbihRQ29sb3IoIiMwMEJFQTQiKSkpOworCisgICAgICAgIFFMaW5lRiBsaW5lVG9PbmUgPSBRTGluZUYoUVBvaW50KCksIHByaW1hcnlQb2ludCAtIG1NdWx0aXRvdWNoQ2VudGVyKTsKKyAgICAgICAgaWYgKGxpbmVUb09uZS5sZW5ndGgoKSA+IG1Ub3VjaFBvaW50UmFkaXVzKSB7CisgICAgICAgICAgICBRUG9pbnRGIGRlbHRhID0KKyAgICAgICAgICAgICAgICAgICAgKGxpbmVUb09uZS51bml0VmVjdG9yKCkucDIoKSAqIChtVG91Y2hQb2ludFJhZGl1cyAvIDIpKTsKKyAgICAgICAgICAgIHBhaW50ZXIuZHJhd0xpbmUoCisgICAgICAgICAgICAgICAgICAgIFFMaW5lRihtTXVsdGl0b3VjaENlbnRlciArIGRlbHRhLCBwcmltYXJ5UG9pbnQgLSBkZWx0YSkpOworICAgICAgICB9CisKKyAgICAgICAgUUxpbmVGIGxpbmVUb1R3byA9IFFMaW5lRihRUG9pbnQoKSwgc2Vjb25kYXJ5UG9pbnQgLSBtTXVsdGl0b3VjaENlbnRlcik7CisgICAgICAgIGlmIChsaW5lVG9Ud28ubGVuZ3RoKCkgPiBtVG91Y2hQb2ludFJhZGl1cykgeworICAgICAgICAgICAgUVBvaW50RiBkZWx0YSA9CisgICAgICAgICAgICAgICAgICAgIChsaW5lVG9Ud28udW5pdFZlY3RvcigpLnAyKCkgKiAobVRvdWNoUG9pbnRSYWRpdXMgLyAyKSk7CisgICAgICAgICAgICBwYWludGVyLmRyYXdMaW5lKAorICAgICAgICAgICAgICAgICAgICBRTGluZUYobU11bHRpdG91Y2hDZW50ZXIgKyBkZWx0YSwgc2Vjb25kYXJ5UG9pbnQgLSBkZWx0YSkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6c2hvd0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KSB7CisgICAgc2V0Rm9jdXMoKTsKKyAgICBhY3RpdmF0ZVdpbmRvdygpOworfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6c2hvd0FzRmxhc2goKSB7CisgICAgaWYgKG1Nb2RlID09IE92ZXJsYXlNb2RlOjpIaWRkZW4pIHsKKyAgICAgICAgbU1vZGUgPSBPdmVybGF5TW9kZTo6Rmxhc2g7CisgICAgfQorICAgIG1GbGFzaEFuaW1hdGlvbi5zdGFydCgpOworICAgIHNob3coKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OmhpZGVGb3JGbGFzaCgpIHsKKyAgICBpZiAobU1vZGUgPT0gT3ZlcmxheU1vZGU6OkZsYXNoKSB7CisgICAgICAgIGhpZGVBbmRGb2N1c0NvbnRhaW5lcigpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnNob3dGb3JNdWx0aXRvdWNoKCkgeworICAgIGlmIChtTW9kZSAhPSBPdmVybGF5TW9kZTo6SGlkZGVuKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWdlb21ldHJ5KCkuY29udGFpbnMoUUN1cnNvcjo6cG9zKCkpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBTaG93IGFuZCByZW5kZXIgdGhlIGZyYW1lIG9uY2UgYmVmb3JlIHRoZSBtb2RlIGlzIGNoYW5nZWQuCisgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZSBvdmVybGF5IHRoYXQgaXMgcmVuZGVyZWQgKmRvZXMKKyAgICAvLyBub3QqIHNob3cgdGhlIGNlbnRlciBwb2ludCwgYXMgdGhpcyBoYXMgYWR2ZXJzZSBlZmZlY3RzIG9uIE9TWCAoaXQgc2VlbXMKKyAgICAvLyB0byBjb3JydXB0IHRoZSBhbHBoYSBwb3J0aW9uIG9mIHRoZSBjb2xvciBidWZmZXIsIGxlYXZpbmcgdGhlIG9yaWdpbmFsCisgICAgLy8gbG9jYXRpb24gb2YgdGhlIHBvaW50IHdpdGggYSBkaWZmZXJlbnQgYWxwaGEsIHJlc3VsdGluZyBpbiBhIHNoYWRvdykuCisgICAgc2hvdygpOworICAgIHVwZGF0ZSgpOworCisgICAgbU1vZGUgPSBPdmVybGF5TW9kZTo6TXVsdGl0b3VjaDsKKyAgICBzZXRDdXJzb3IoUXQ6OkFycm93Q3Vyc29yKTsKKyAgICBzZXRNb3VzZVRyYWNraW5nKHRydWUpOworCisgICAgUVBvaW50IG1vdXNlUG9zaXRpb24gPSBtYXBGcm9tR2xvYmFsKFFDdXJzb3I6OnBvcygpKTsKKyAgICBtUHJpbWFyeVRvdWNoUG9pbnQgPSBtb3VzZVBvc2l0aW9uOworICAgIG1NdWx0aXRvdWNoQ2VudGVyID0gbUVtdWxhdG9yV2luZG93LT5kZXZpY2VHZW9tZXRyeSgpLmNlbnRlcigpOworICAgIG1TZWNvbmRhcnlUb3VjaFBvaW50ID0gc2Vjb25kYXJ5UGluY2hQb2ludCgpOworICAgIG1MYXN0TW91c2VQb3MgPSBtb3VzZVBvc2l0aW9uOworICAgIG1Jc1N3aXBlR2VzdHVyZSA9IGZhbHNlOworfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6c2hvd0Zvclpvb20oKSB7CisgICAgaWYgKG1Nb2RlICE9IE92ZXJsYXlNb2RlOjpIaWRkZW4pCisgICAgICAgIHJldHVybjsKKworICAgIG1Nb2RlID0gT3ZlcmxheU1vZGU6Olpvb207CisgICAgc2V0Q3Vyc29yKFFDdXJzb3IobUN1cnNvcikpOworICAgIHNob3coKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnNob3dGb3Jab29tVXNlckhpZGRlbigpIHsKKyAgICBpZiAobU1vZGUgIT0gT3ZlcmxheU1vZGU6OlVzZXJIaWRkZW5ab29tKQorICAgICAgICByZXR1cm47CisKKyAgICBtTW9kZSA9IE92ZXJsYXlNb2RlOjpIaWRkZW47CisgICAgc2hvd0Zvclpvb20oKTsKK30KKworYm9vbCBFbXVsYXRvck92ZXJsYXk6Ondhc1pvb21Vc2VySGlkZGVuKCkgY29uc3QgeworICAgIHJldHVybiBtTW9kZSA9PSBPdmVybGF5TW9kZTo6VXNlckhpZGRlblpvb207Cit9CisKK3ZvaWQgRW11bGF0b3JPdmVybGF5OjpoaWRlKCkgeworICAgIFFGcmFtZTo6aGlkZSgpOworICAgIHNldE1vdXNlVHJhY2tpbmcoZmFsc2UpOworICAgIG1Nb2RlID0gT3ZlcmxheU1vZGU6OkhpZGRlbjsKKworICAgIGlmIChtUmVsZWFzZU9uQ2xvc2UpIHsKKyAgICAgICAgbUVtdWxhdG9yV2luZG93LT5oYW5kbGVNb3VzZUV2ZW50KGtFdmVudE1vdXNlQnV0dG9uVXAsIGtNb3VzZUJ1dHRvbkxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeVRvdWNoUG9pbnQpOworCisgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+aGFuZGxlTW91c2VFdmVudChrRXZlbnRNb3VzZUJ1dHRvblVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01vdXNlQnV0dG9uU2Vjb25kYXJ5VG91Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vjb25kYXJ5VG91Y2hQb2ludCk7CisgICAgICAgIG1SZWxlYXNlT25DbG9zZSA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnNsb3RfZmxhc2hBbmltYXRpb25GaW5pc2hlZCgpIHsKKyAgICBoaWRlRm9yRmxhc2goKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnNsb3RfZmxhc2hBbmltYXRpb25WYWx1ZUNoYW5nZWQoY29uc3QgUVZhcmlhbnQmIHZhbHVlKSB7CisgICAgbUZsYXNoVmFsdWUgPSB2YWx1ZS50b0RvdWJsZSgpIC8gbUZsYXNoQW5pbWF0aW9uLnN0YXJ0VmFsdWUoKS50b0RvdWJsZSgpOworICAgIHJlcGFpbnQoKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnNsb3RfYW5pbWF0aW9uVmFsdWVDaGFuZ2VkKGNvbnN0IFFWYXJpYW50JiB2YWx1ZSkgeworICAgIG1MZXJwVmFsdWUgPSB2YWx1ZS50b0RvdWJsZSgpIC8gbVRvdWNoUG9pbnRBbmltYXRpb24uZW5kVmFsdWUoKS50b0RvdWJsZSgpOworICAgIHJlcGFpbnQoKTsKK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OmhpZGVBbmRGb2N1c0NvbnRhaW5lcigpIHsKKyAgICBoaWRlKCk7CisgICAgbUNvbnRhaW5lci0+c2V0Rm9jdXMoKTsKKyAgICBtQ29udGFpbmVyLT5hY3RpdmF0ZVdpbmRvdygpOworfQorCit2b2lkIEVtdWxhdG9yT3ZlcmxheTo6Z2VuZXJhdGVUb3VjaEV2ZW50cyhRTW91c2VFdmVudCogZXZlbnQpIHsKKyAgICBTa2luRXZlbnRUeXBlIGV2ZW50VHlwZSA9IChTa2luRXZlbnRUeXBlKTA7CisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRTW91c2VFdmVudDo6TW91c2VCdXR0b25QcmVzcykgeworICAgICAgICBpZiAoZXZlbnQtPmJ1dHRvbigpID09IFF0OjpSaWdodEJ1dHRvbikgeworICAgICAgICAgICAgbUxlcnBWYWx1ZSA9IDAuMDsKKyAgICAgICAgICAgIG1Jc1N3aXBlR2VzdHVyZSA9IHRydWU7CisgICAgICAgICAgICBtVG91Y2hQb2ludEFuaW1hdGlvbi5zdGFydCgpOworICAgICAgICAgICAgdXBkYXRlVG91Y2hQb2ludHMoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIGV2ZW50VHlwZSA9IGtFdmVudE1vdXNlQnV0dG9uRG93bjsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gUU1vdXNlRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZSkgeworICAgICAgICBpZiAoZXZlbnQtPmJ1dHRvbigpID09IFF0OjpSaWdodEJ1dHRvbikgeworICAgICAgICAgICAgbUxlcnBWYWx1ZSA9IDAuMDsKKyAgICAgICAgICAgIG1Jc1N3aXBlR2VzdHVyZSA9IGZhbHNlOworICAgICAgICAgICAgbVRvdWNoUG9pbnRBbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVRvdWNoUG9pbnRzKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgICBldmVudFR5cGUgPSBrRXZlbnRNb3VzZUJ1dHRvblVwOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRTW91c2VFdmVudDo6TW91c2VNb3ZlKSB7CisgICAgICAgIGV2ZW50VHlwZSA9IGtFdmVudE1vdXNlTW90aW9uOworICAgIH0KKworICAgIGlmIChldmVudFR5cGUpIHsKKyAgICAgICAgbUVtdWxhdG9yV2luZG93LT5oYW5kbGVNb3VzZUV2ZW50KGV2ZW50VHlwZSwga01vdXNlQnV0dG9uTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5VG91Y2hQb2ludCwgdHJ1ZSk7CisgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+aGFuZGxlTW91c2VFdmVudChldmVudFR5cGUsIGtNb3VzZUJ1dHRvblNlY29uZGFyeVRvdWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlY29uZGFyeVRvdWNoUG9pbnQpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvck92ZXJsYXk6OnVwZGF0ZVRvdWNoUG9pbnRzKFFNb3VzZUV2ZW50KiBldmVudCkgeworICAgIGlmICghbUlzU3dpcGVHZXN0dXJlKSB7CisgICAgICAgIG1QcmltYXJ5VG91Y2hQb2ludCA9IHByaW1hcnlQaW5jaFBvaW50KCk7CisgICAgICAgIG1TZWNvbmRhcnlUb3VjaFBvaW50ID0gc2Vjb25kYXJ5UGluY2hQb2ludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1QcmltYXJ5VG91Y2hQb2ludCA9IHByaW1hcnlTd2lwZVBvaW50KCk7CisgICAgICAgIG1TZWNvbmRhcnlUb3VjaFBvaW50ID0gc2Vjb25kYXJ5VG91Y2hQb2ludCgpOworICAgIH0KK30KKworUVBvaW50IEVtdWxhdG9yT3ZlcmxheTo6cHJpbWFyeVBpbmNoUG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MYXN0TW91c2VQb3M7Cit9CisKK1FQb2ludCBFbXVsYXRvck92ZXJsYXk6OnNlY29uZGFyeVBpbmNoUG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MYXN0TW91c2VQb3MgKyAyICogKG1NdWx0aXRvdWNoQ2VudGVyIC0gbUxhc3RNb3VzZVBvcyk7Cit9CisKK1FQb2ludCBFbXVsYXRvck92ZXJsYXk6OnByaW1hcnlTd2lwZVBvaW50KCkgY29uc3QgeworICAgIHJldHVybiBtTGFzdE1vdXNlUG9zICsgUVBvaW50KHdpZHRoKCkgKiAuMSwgMCk7Cit9CisKK1FQb2ludCBFbXVsYXRvck92ZXJsYXk6OnNlY29uZGFyeVRvdWNoUG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1MYXN0TW91c2VQb3MgLSBRUG9pbnQod2lkdGgoKSAqIC4xLCAwKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLW92ZXJsYXkuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLW92ZXJsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iODgwOTdlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3Itb3ZlcmxheS5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UXRDb3JlPgorI2luY2x1ZGUgPFFGcmFtZT4KKyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPFFSdWJiZXJCYW5kPgorI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRVmFyaWFudEFuaW1hdGlvbj4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorCitjbGFzcyBFbXVsYXRvclF0V2luZG93OworY2xhc3MgRW11bGF0b3JDb250YWluZXI7CisKK2NsYXNzIEVtdWxhdG9yT3ZlcmxheSA6IHB1YmxpYyBRRnJhbWUgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBFbXVsYXRvck92ZXJsYXkoRW11bGF0b3JRdFdpbmRvdyogd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbXVsYXRvckNvbnRhaW5lciogY29udGFpbmVyKTsKKyAgICB2aXJ0dWFsIH5FbXVsYXRvck92ZXJsYXkoKTsKKworICAgIHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgaGlkZUV2ZW50KFFIaWRlRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBrZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBtb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBtb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgbW92ZUV2ZW50KFFNb3ZlRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGUpIG92ZXJyaWRlOworICAgIHZvaWQgc2hvd0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKworICAgIHZvaWQgaGlkZUZvckZsYXNoKCk7CisgICAgdm9pZCBzaG93QXNGbGFzaCgpOworCisgICAgdm9pZCBzaG93Rm9yTXVsdGl0b3VjaCgpOworCisgICAgdm9pZCBzaG93Rm9yWm9vbSgpOworICAgIHZvaWQgc2hvd0Zvclpvb21Vc2VySGlkZGVuKCk7CisgICAgYm9vbCB3YXNab29tVXNlckhpZGRlbigpIGNvbnN0OworCitwdWJsaWMgc2xvdHM6CisgICAgdm9pZCBoaWRlKCk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBzbG90X2ZsYXNoQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICB2b2lkIHNsb3RfZmxhc2hBbmltYXRpb25WYWx1ZUNoYW5nZWQoY29uc3QgUVZhcmlhbnQmIHZhbHVlKTsKKworICAgIHZvaWQgc2xvdF9hbmltYXRpb25WYWx1ZUNoYW5nZWQoY29uc3QgUVZhcmlhbnQmIHZhbHVlKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGhpZGVBbmRGb2N1c0NvbnRhaW5lcigpOworCisgICAgdm9pZCBnZW5lcmF0ZVRvdWNoRXZlbnRzKFFNb3VzZUV2ZW50KiBldmVudCk7CisgICAgdm9pZCB1cGRhdGVUb3VjaFBvaW50cyhRTW91c2VFdmVudCogZXZlbnQpOworCisgICAgUVBvaW50IHByaW1hcnlQaW5jaFBvaW50KCkgY29uc3Q7CisgICAgUVBvaW50IHNlY29uZGFyeVBpbmNoUG9pbnQoKSBjb25zdDsKKworICAgIFFQb2ludCBwcmltYXJ5U3dpcGVQb2ludCgpIGNvbnN0OworICAgIFFQb2ludCBzZWNvbmRhcnlUb3VjaFBvaW50KCkgY29uc3Q7CisKKyAgICBFbXVsYXRvclF0V2luZG93KiBtRW11bGF0b3JXaW5kb3c7CisgICAgRW11bGF0b3JDb250YWluZXIqIG1Db250YWluZXI7CisKKyAgICAvLyBab29tLXJlbGF0ZWQgbWVtYmVycworICAgIFFSdWJiZXJCYW5kIG1SdWJiZXJCYW5kOworICAgIFFQb2ludCBtUnViYmVyYmFuZE9yaWdpbjsKKyAgICBRUGl4bWFwIG1DdXJzb3I7CisKKyAgICAvLyBNdWx0aXRvdWNoLXJlbGF0ZWQgbWVtYmVycworICAgIFFJbWFnZSBtQ2VudGVySW1hZ2U7CisgICAgUUltYWdlIG1Ub3VjaEltYWdlOworICAgIFFQb2ludCBtTXVsdGl0b3VjaENlbnRlcjsKKyAgICBRUG9pbnQgbVByaW1hcnlUb3VjaFBvaW50OworICAgIFFQb2ludCBtU2Vjb25kYXJ5VG91Y2hQb2ludDsKKyAgICBRUG9pbnQgbUxhc3RNb3VzZVBvczsKKyAgICBpbnQgbUNlbnRlclBvaW50UmFkaXVzOworICAgIGludCBtVG91Y2hQb2ludFJhZGl1czsKKyAgICBib29sIG1Jc1N3aXBlR2VzdHVyZTsKKyAgICBib29sIG1SZWxlYXNlT25DbG9zZTsKKworICAgIC8vIE11bHRpdG91Y2ggYW5pbWF0aW9uIHZhbHVlcworICAgIFFWYXJpYW50QW5pbWF0aW9uIG1Ub3VjaFBvaW50QW5pbWF0aW9uOworICAgIGRvdWJsZSBtTGVycFZhbHVlOworCisgICAgLy8gU2NyZWVuc2hvdC1mbGFzaCByZWxhdGVkIG1lbWJlcnMKKyAgICBRVmFyaWFudEFuaW1hdGlvbiBtRmxhc2hBbmltYXRpb247CisgICAgZG91YmxlIG1GbGFzaFZhbHVlOworCisgICAgLy8gRW5zdXJlIHRoZSBvdmVybGF5IGlzIG5ldmVyIGJlaW5nIHVzZWQgZm9yIG1vcmUgdGhhbiBvbmUgZnVuY3Rpb24KKyAgICBlbnVtIGNsYXNzIE92ZXJsYXlNb2RlIHsKKyAgICAgICAgSGlkZGVuLAorICAgICAgICBGbGFzaCwKKyAgICAgICAgTXVsdGl0b3VjaCwKKyAgICAgICAgWm9vbSwKKyAgICAgICAgVXNlckhpZGRlblpvb20sCisgICAgfSBtTW9kZTsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtbm8td2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDljYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtbm8td2luZG93LmNwcApAQCAtMCwwICsxLDg3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuaCIKKworI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVRocmVhZD4KKyNpbmNsdWRlIDxRdENvcmU+CisjaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKyNkZWZpbmUgRCguLi4pIHFEZWJ1ZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEQoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPEVtdWxhdG9yUXROb1dpbmRvdzo6UHRyPiBzTm9XaW5kb3dJbnN0YW5jZSA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworVGFzazo6VGFzayhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZikgOiBmcHRyKGYpIHt9CisKK3ZvaWQgVGFzazo6cnVuKCkgeworICAgIGZwdHIoKTsKKyAgICBEKCJUYXNrIGZpbmlzaGVkLCBub3RpZnkgY29ubmVjdGVkIHNsb3RzIik7CisgICAgZW1pdCBmaW5pc2hlZCgpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEVtdWxhdG9yUXROb1dpbmRvdzo6Y3JlYXRlKCkgeworICAgIHNOb1dpbmRvd0luc3RhbmNlLmdldCgpID0gUHRyKG5ldyBFbXVsYXRvclF0Tm9XaW5kb3coKSk7Cit9CisKK0VtdWxhdG9yUXROb1dpbmRvdzo6RW11bGF0b3JRdE5vV2luZG93KFFPYmplY3QqIHBhcmVudCkgeworICAgIFFPYmplY3Q6OmNvbm5lY3QoUUNvcmVBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICZRQ29yZUFwcGxpY2F0aW9uOjphYm91dFRvUXVpdCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0Tm9XaW5kb3c6OnNsb3RfY2xlYXJJbnN0YW5jZSk7Cit9CisKK0VtdWxhdG9yUXROb1dpbmRvdzo6UHRyIEVtdWxhdG9yUXROb1dpbmRvdzo6Z2V0SW5zdGFuY2VQdHIoKSB7CisgICAgcmV0dXJuIHNOb1dpbmRvd0luc3RhbmNlLmdldCgpOworfQorCitFbXVsYXRvclF0Tm9XaW5kb3cqIEVtdWxhdG9yUXROb1dpbmRvdzo6Z2V0SW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGdldEluc3RhbmNlUHRyKCkuZ2V0KCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdE5vV2luZG93OjpzdGFydFRocmVhZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZikgeworICAgIGF1dG8gdGhyZWFkID0gbmV3IFFUaHJlYWQoKTsKKyAgICBhdXRvIHRhc2sgPSBuZXcgVGFzayhmKTsKKworICAgIC8vIHBhc3MgdGFzayBvYmplY3QgdG8gdGhyZWFkIGFuZCBzdGFydCB0YXNrIHdoZW4gdGhyZWFkIHN0YXJ0cworICAgIHRhc2stPm1vdmVUb1RocmVhZCh0aHJlYWQpOworICAgIGNvbm5lY3QodGhyZWFkLCBTSUdOQUwoc3RhcnRlZCgpKSwgdGFzaywgU0xPVChydW4oKSkpOworICAgIC8vIHdoZW4gdGhlIHRhc2sgaXMgZmluaXNoZWQsIHNpZ25hbCB0aGUgdGhyZWFkIHRvIHF1aXQKKyAgICBjb25uZWN0KHRhc2ssIFNJR05BTChmaW5pc2hlZCgpKSwgdGhyZWFkLCBTTE9UKHF1aXQoKSkpOworICAgIC8vIHF1ZXVlIHVwIHRhc2sgb2JqZWN0IGZvciBkZWxldGlvbiB3aGVuIHRoZSB0aHJlYWQgaXMgZmluaXNoZWQKKyAgICBjb25uZWN0KHRocmVhZCwgU0lHTkFMKGZpbmlzaGVkKCkpLCB0YXNrLCBTTE9UKGRlbGV0ZUxhdGVyKCkpKTsKKyAgICAvLyBxdWV1ZSB1cCB0aHJlYWQgb2JqZWN0IGZvciBkZWxldGlvbiB3aGVuIHRoZSB0aHJlYWQgaXMgZmluaXNoZWQKKyAgICBjb25uZWN0KHRocmVhZCwgU0lHTkFMKGZpbmlzaGVkKCkpLCB0aHJlYWQsIFNMT1QoZGVsZXRlTGF0ZXIoKSkpOworICAgIC8vIHdoZW4gdGhlIHRocmVhZCBpcyBmaW5pc2hlZCwgcXVpdCB0aGlzIEdVSS1sZXNzIHdpbmRvdyB0b28KKyAgICBjb25uZWN0KHRocmVhZCwgU0lHTkFMKGZpbmlzaGVkKCkpLCBnZXRJbnN0YW5jZSgpLCBTTE9UKHNsb3RfZmluaXNoZWQoKSkpOworCisgICAgdGhyZWFkLT5zdGFydCgpOworfQorCit2b2lkIEVtdWxhdG9yUXROb1dpbmRvdzo6c2xvdF9jbGVhckluc3RhbmNlKCkgeworICAgIHNOb1dpbmRvd0luc3RhbmNlLmdldCgpLnJlc2V0KCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdE5vV2luZG93OjpzbG90X2ZpbmlzaGVkKCkgeworICAgIEQoIkNsb3NpbmcgR1VJLWxlc3Mgd2luZG93LCBxdWl0aW5nIGFwcGxpY2F0aW9uIik7CisgICAgUUNvcmVBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKS0+cXVpdCgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtbm8td2luZG93LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGY4NDhmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtbm8td2luZG93LmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UU9iamVjdD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworLy8gVGFzayBpcyBhIHNpbXBsZSB3cmFwcGVyIGNsYXNzLCB1c2VkIHRvIG1vdmUgdGhlIGV4ZWN1dGlvbgorLy8gb2YgZnVuY3Rpb24gZiB0byBhIHNlcGFyYXRlIFFUIFRocmVhZAorCitjbGFzcyBUYXNrIDogcHVibGljIFFPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBUYXNrKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmKTsKKworcHVibGljIHNsb3RzOgorICAgIHZvaWQgcnVuKCk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBmaW5pc2hlZCgpOworCitwcml2YXRlOgorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmcHRyOworfTsKKworLy8gVGhlIEVtdWxhdG9yUVROb1dpbmRvdyBjbGFzcyBpcyB1c2VkIHRvIGJ1aWxkIGEgUVQtV2lkZ2V0LWxlc3MKKy8vIGV2ZW50IGxvb3Agd2hlbiB0aGUgcGFyYW1ldGVyIC1uby13aW5kb3cgaXMgcGFzc2VkIHRvIHRoZSBhbmRyb2lkCisvLyBlbXVsYXRvci4gTXVjaCBsaWtlIEVtdWxhdG9yUXRXaW5kb3csIHN0YXJ0VGhyZWFkKGYpIHdpbGwgc3Bhd24KKy8vIGEgbmV3IFFUIFRocmVhZCB0byBleGVjdXRlIGZ1bmN0aW9uIGYgKHFlbXUgbWFpbiBsb29wKS4KKworY2xhc3MgRW11bGF0b3JRdE5vV2luZG93IGZpbmFsIDogcHVibGljIFFPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8RW11bGF0b3JRdE5vV2luZG93PjsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZSgpOworICAgIHN0YXRpYyBFbXVsYXRvclF0Tm9XaW5kb3cqIGdldEluc3RhbmNlKCk7CisgICAgc3RhdGljIFB0ciBnZXRJbnN0YW5jZVB0cigpOworCisgICAgdm9pZCBzdGFydFRocmVhZChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZik7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgRW11bGF0b3JRdE5vV2luZG93KFFPYmplY3QqIHBhcmVudCA9IDApOworCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgc2xvdF9jbGVhckluc3RhbmNlKCk7CisgICAgdm9pZCBzbG90X2ZpbmlzaGVkKCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtd2luZG93LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2NTg2OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5jcHAKQEAgLTAsMCArMSwxNzM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUtMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jcHVfYWNjZWxlcmF0b3IuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L0NyYXNoUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3VzZXJfZXZlbnRfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdG9yLXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9QZXJpb2RpY1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsZXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9ncHVpbmZvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvUXRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXZlbnQtc2VyaWFsaXplci5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91aS1lbXUtYWdlbnQuaCIKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9tYWMtbmF0aXZlLXdpbmRvdy5oIgorI2VuZGlmCisKKyNkZWZpbmUgREVCVUcgMQorCisjaWYgREVCVUcKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjZGVmaW5lIEQoLi4uKSBWRVJCT1NFX1BSSU5UKHN1cmZhY2UsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgRCguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxRQ2hlY2tCb3g+CisjaW5jbHVkZSA8UUN1cnNvcj4KKyNpbmNsdWRlIDxRRGVza3RvcFdpZGdldD4KKyNpbmNsdWRlIDxRRmlsZURpYWxvZz4KKyNpbmNsdWRlIDxRSWNvbj4KKyNpbmNsdWRlIDxRTGFiZWw+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVkZSA8UVBpeG1hcD4KKyNpbmNsdWRlIDxRUHJvZ3Jlc3NCYXI+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisjaW5jbHVkZSA8UVNjcmVlbj4KKyNpbmNsdWRlIDxRU2Nyb2xsQmFyPgorI2luY2x1ZGUgPFFTZW1hcGhvcmU+CisjaW5jbHVkZSA8UVNldHRpbmdzPgorI2luY2x1ZGUgPFFUb29sVGlwPgorI2luY2x1ZGUgPFFXaW5kb3c+CisjaW5jbHVkZSA8UXRDb3JlPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Cit1c2luZyBhbmRyb2lkOjplbXVsYXRpb246OkFwa0luc3RhbGxlcjsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6RmlsZVB1c2hlcjsKK3VzaW5nIGFuZHJvaWQ6OmVtdWxhdGlvbjo6U2NyZWVuQ2FwdHVyZXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvLyBNYWtlIHN1cmUgaXQgaXMgUE9EIGhlcmUKK3N0YXRpYyBMYXp5SW5zdGFuY2U8RW11bGF0b3JRdFdpbmRvdzo6UHRyPiBzSW5zdGFuY2UgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKKy8vIHN0YXRpYworY29uc3QgaW50IEVtdWxhdG9yUXRXaW5kb3c6OmtQdXNoUHJvZ3Jlc3NCYXJNYXggPSAyMDAwOworY29uc3QgU3RyaW5nVmlldyBFbXVsYXRvclF0V2luZG93OjprUmVtb3RlRG93bmxvYWRzRGlyID0gIi9zZGNhcmQvRG93bmxvYWQvIjsKKworLy8gR2luZ2VyYnJlYWQgZGV2aWNlcyBkb3dubG9hZCBmaWxlcyB0byB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSAobm90ZSB0aGUKKy8vIHVuY2FwaXRhbGl6ZWQgImRvd25sb2FkIikuCitjb25zdCBTdHJpbmdWaWV3IEVtdWxhdG9yUXRXaW5kb3c6OmtSZW1vdGVEb3dubG9hZHNEaXJBcGkxMCA9CisgICAgICAgICIvc2RjYXJkL2Rvd25sb2FkLyI7CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6Y3JlYXRlKCkgeworICAgIHNJbnN0YW5jZS5nZXQoKSA9IFB0cihuZXcgRW11bGF0b3JRdFdpbmRvdygpKTsKK30KKworRW11bGF0b3JRdFdpbmRvdzo6RW11bGF0b3JRdFdpbmRvdyhRV2lkZ2V0KiBwYXJlbnQpCisgICAgOiBRRnJhbWUocGFyZW50KSwKKyAgICAgIG1Mb29wZXIoYW5kcm9pZDo6cXQ6OmNyZWF0ZUxvb3BlcigpKSwKKyAgICAgIG1TdGFydHVwRGlhbG9nKHRoaXMpLAorICAgICAgbUNvbnRhaW5lcih0aGlzKSwKKyAgICAgIG1PdmVybGF5KHRoaXMsICZtQ29udGFpbmVyKSwKKyAgICAgIG1ab29tRmFjdG9yKDEuMCksCisgICAgICBtSW5ab29tTW9kZShmYWxzZSksCisgICAgICBtTmV4dElzWm9vbShmYWxzZSksCisgICAgICBtRm9yd2FyZFNob3J0Y3V0c1RvRGV2aWNlKGZhbHNlKSwKKyAgICAgIG1QcmV2TW91c2VQb3NpdGlvbigwLCAwKSwKKyAgICAgIG1NYWluTG9vcFRocmVhZChudWxscHRyKSwKKyAgICAgIG1BdmRXYXJuaW5nQm94KFFNZXNzYWdlQm94OjpJbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHRyKCJSZWNvbW1lbmRlZCBBVkQiKSwKKyAgICAgICAgICAgICAgICAgICAgIHRyKCJSdW5uaW5nIGFuIHg4NiBiYXNlZCBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIChBVkQpIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIxMHggZmFzdGVyLjxici8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIldlIHN0cm9uZ2x5IHJlY29tbWVuZCBjcmVhdGluZyBhIG5ldyBBVkQuIiksCisgICAgICAgICAgICAgICAgICAgICBRTWVzc2FnZUJveDo6T2ssCisgICAgICAgICAgICAgICAgICAgICB0aGlzKSwKKyAgICAgIG1HcHVXYXJuaW5nQm94KFFNZXNzYWdlQm94OjpJbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHRyKCJHUFUgRHJpdmVyIElzc3VlIiksCisgICAgICAgICAgICAgICAgICAgICB0cigiWW91ciBHUFUgZHJpdmVyIGluZm9ybWF0aW9uOlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJTFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIHVzZXJzIGhhdmUgZXhwZXJpZW5jZWQgZW11bGF0b3Igc3RhYmlsaXR5IGlzc3VlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGlzIGRyaXZlciB2ZXJzaW9uLiAgQXMgYSByZXN1bHQsIHdlJ3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RpbmcgYSBzb2Z0d2FyZSByZW5kZXJlci4gIFBsZWFzZSBjaGVjayB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5b3VyIG1hbnVmYWN0dXJlciB0byBzZWUgaWYgdGhlcmUgaXMgYW4gdXBkYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZHJpdmVyIGF2YWlsYWJsZS4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKChHcHVJbmZvTGlzdDo6Z2V0KCktPmJsYWNrbGlzdF9zdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFFTdHJpbmc6OmZyb21TdGRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwdUluZm9MaXN0OjpnZXQoKS0+ZHVtcCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiIpKSwKKyAgICAgICAgICAgICAgICAgICAgIFFNZXNzYWdlQm94OjpPaywKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMpLAorICAgICAgbUFkYldhcm5pbmdCb3goUU1lc3NhZ2VCb3g6Oldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICB0cigiRGV0ZWN0ZWQgQURCIiksCisgICAgICAgICAgICAgICAgICAgICB0cigiIiksCisgICAgICAgICAgICAgICAgICAgICBRTWVzc2FnZUJveDo6T2ssCisgICAgICAgICAgICAgICAgICAgICB0aGlzKSwKKyAgICAgIG1GaXJzdFNob3dFdmVudCh0cnVlKSwKKyAgICAgIG1FdmVudExvZ2dlcihuZXcgVUlFdmVudFJlY29yZGVyPGFuZHJvaWQ6OmJhc2U6OkNpcmN1bGFyQnVmZmVyPigKKyAgICAgICAgICAgICAgJm1FdmVudENhcHR1cmVyLAorICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpDaXJjdWxhckJ1ZmZlcjxFdmVudFJlY29yZD4oMTAwMCkpKSwKKyAgICAgIG1Vc2VyQWN0aW9uc0NvdW50ZXIobmV3IGFuZHJvaWQ6OnF0OjpVc2VyQWN0aW9uc0NvdW50ZXIoJm1FdmVudENhcHR1cmVyKSksCisgICAgICBtQWRiSW50ZXJmYWNlKGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlOjpjcmVhdGUobUxvb3BlcikpLAorICAgICAgbUFwa0luc3RhbGxlcihtQWRiSW50ZXJmYWNlLmdldCgpKSwKKyAgICAgIG1GaWxlUHVzaGVyKG1BZGJJbnRlcmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICBbdGhpc10oU3RyaW5nVmlldyBmaWxlUGF0aCwgRmlsZVB1c2hlcjo6UmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIGFkYlB1c2hEb25lKGZpbGVQYXRoLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgIFt0aGlzXShkb3VibGUgcHJvZ3Jlc3MsIGJvb2wgZG9uZSkgeworICAgICAgICAgICAgICAgICAgICAgIGFkYlB1c2hQcm9ncmVzcyhwcm9ncmVzcywgZG9uZSk7CisgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgIG1TY3JlZW5DYXB0dXJlcihtQWRiSW50ZXJmYWNlLmdldCgpKSwKKyAgICAgIG1JbnN0YWxsRGlhbG9nKHRoaXMpLAorICAgICAgbVB1c2hEaWFsb2codGhpcyksCisgICAgICBtU3RhcnRlZEFkYlN0b3BQcm9jZXNzKGZhbHNlKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6VGhyZWFkTG9vcGVyOjpzZXRMb29wZXIobUxvb3BlciwgdHJ1ZSk7CisKKyAgICAvLyBTdGFydCBhIHRpbWVyLiBJZiB0aGUgbWFpbiB3aW5kb3cgZG9lc24ndAorICAgIC8vIGFwcGVhciBiZWZvcmUgdGhlIHRpbWVyIGV4cGlyZXMsIHNob3cgYQorICAgIC8vIHBvcC11cCB0byBsZXQgdGhlIHVzZXIga25vdyB3ZSdyZSBzdGlsbAorICAgIC8vIHdvcmtpbmcuCisgICAgUU9iamVjdDo6Y29ubmVjdCgmbVN0YXJ0dXBUaW1lciwgJlFUaW1lcjo6dGltZW91dCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X3N0YXJ0dXBUaWNrKTsKKyAgICBtU3RhcnR1cFRpbWVyLnNldFNpbmdsZVNob3QodHJ1ZSk7CisgICAgbVN0YXJ0dXBUaW1lci5zZXRJbnRlcnZhbCg1MDApOyAgLy8gSGFsZiBhIHNlY29uZAorICAgIG1TdGFydHVwVGltZXIuc3RhcnQoKTsKKworICAgIG1CYWNraW5nU3VyZmFjZSA9IE5VTEw7CisKKyAgICBtVG9vbFdpbmRvdyA9IG5ldyBUb29sV2luZG93KHRoaXMsICZtQ29udGFpbmVyLCBtRXZlbnRMb2dnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVXNlckFjdGlvbnNDb3VudGVyKTsKKworICAgIHRoaXMtPnNldEFjY2VwdERyb3BzKHRydWUpOworCisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6YmxpdCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X2JsaXQpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OmNyZWF0ZUJpdG1hcCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X2NyZWF0ZUJpdG1hcCk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6ZmlsbCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X2ZpbGwpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OmdldEJpdG1hcEluZm8sIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9nZXRCaXRtYXBJbmZvKTsKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHRoaXMsICZFbXVsYXRvclF0V2luZG93OjpnZXREZXZpY2VQaXhlbFJhdGlvLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfZ2V0RGV2aWNlUGl4ZWxSYXRpbyk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6Z2V0U2NyZWVuRGltZW5zaW9ucywgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X2dldFNjcmVlbkRpbWVuc2lvbnMpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OmdldFdpbmRvd0lkLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfZ2V0V2luZG93SWQpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OmdldFdpbmRvd1BvcywgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X2dldFdpbmRvd1Bvcyk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6aXNXaW5kb3dGdWxseVZpc2libGUsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9pc1dpbmRvd0Z1bGx5VmlzaWJsZSk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6cmVsZWFzZUJpdG1hcCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X3JlbGVhc2VCaXRtYXApOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnJlcXVlc3RDbG9zZSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X3JlcXVlc3RDbG9zZSk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmRW11bGF0b3JRdFdpbmRvdzo6cmVxdWVzdFVwZGF0ZSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICZFbXVsYXRvclF0V2luZG93OjpzbG90X3JlcXVlc3RVcGRhdGUpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnNldERldmljZUdlb21ldHJ5LCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc2V0RGV2aWNlR2VvbWV0cnkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnNldFdpbmRvd0ljb24sIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zZXRXaW5kb3dJY29uKTsKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHRoaXMsICZFbXVsYXRvclF0V2luZG93OjpzZXRXaW5kb3dQb3MsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zZXRXaW5kb3dQb3MpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnNldFRpdGxlLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc2V0V2luZG93VGl0bGUpOworICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnNob3dXaW5kb3csIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zaG93V2luZG93KTsKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHRoaXMsICZFbXVsYXRvclF0V2luZG93OjpydW5PblVpVGhyZWFkLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfcnVuT25VaVRocmVhZCk7CisgICAgUU9iamVjdDo6Y29ubmVjdChRQXBwbGljYXRpb246Omluc3RhbmNlKCksICZRQ29yZUFwcGxpY2F0aW9uOjphYm91dFRvUXVpdCwKKyAgICAgICAgICAgICAgICAgICAgIHRoaXMsICZFbXVsYXRvclF0V2luZG93OjpzbG90X2NsZWFySW5zdGFuY2UpOworCisgICAgLy8gVE9ETzogbWFrZSBkaWFsb2dzIGFmZmVjdGVkIGJ5IHRoZW1lcyBhbmQgY2hhbmdlcworICAgIG1JbnN0YWxsRGlhbG9nLnNldFdpbmRvd1RpdGxlKHRyKCJBUEsgSW5zdGFsbGVyIikpOworICAgIG1JbnN0YWxsRGlhbG9nLnNldExhYmVsVGV4dCh0cigiSW5zdGFsbGluZyBBUEsuLi4iKSk7CisgICAgbUluc3RhbGxEaWFsb2cuc2V0UmFuZ2UoMCwgMCk7ICAvLyBNYWtlcyBpdCBhICJidXN5IiBkaWFsb2cKKyAgICBtSW5zdGFsbERpYWxvZy5zZXRNb2RhbCh0cnVlKTsKKyAgICBtSW5zdGFsbERpYWxvZy5jbG9zZSgpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJm1JbnN0YWxsRGlhbG9nLCBTSUdOQUwoY2FuY2VsZWQoKSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3RfaW5zdGFsbENhbmNlbGVkKCkpKTsKKworICAgIG1QdXNoRGlhbG9nLnNldFdpbmRvd1RpdGxlKHRyKCJGaWxlIENvcHkiKSk7CisgICAgbVB1c2hEaWFsb2cuc2V0TGFiZWxUZXh0KHRyKCJDb3B5aW5nIGZpbGVzLi4uIikpOworICAgIG1QdXNoRGlhbG9nLnNldFJhbmdlKDAsIGtQdXNoUHJvZ3Jlc3NCYXJNYXgpOworICAgIG1QdXNoRGlhbG9nLmNsb3NlKCk7CisgICAgUU9iamVjdDo6Y29ubmVjdCgmbVB1c2hEaWFsb2csIFNJR05BTChjYW5jZWxlZCgpKSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgIFNMT1Qoc2xvdF9hZGJQdXNoQ2FuY2VsZWQoKSkpOworCisgICAgUU9iamVjdDo6Y29ubmVjdChtQ29udGFpbmVyLmhvcml6b250YWxTY3JvbGxCYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIFNJR05BTCh2YWx1ZUNoYW5nZWQoaW50KSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3RfaG9yaXpvbnRhbFNjcm9sbENoYW5nZWQoaW50KSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QobUNvbnRhaW5lci52ZXJ0aWNhbFNjcm9sbEJhcigpLCBTSUdOQUwodmFsdWVDaGFuZ2VkKGludCkpLAorICAgICAgICAgICAgICAgICAgICAgdGhpcywgU0xPVChzbG90X3ZlcnRpY2FsU2Nyb2xsQ2hhbmdlZChpbnQpKSk7CisgICAgUU9iamVjdDo6Y29ubmVjdChtQ29udGFpbmVyLmhvcml6b250YWxTY3JvbGxCYXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIFNJR05BTChyYW5nZUNoYW5nZWQoaW50LCBpbnQpKSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgIFNMT1Qoc2xvdF9zY3JvbGxSYW5nZUNoYW5nZWQoaW50LCBpbnQpKSk7CisgICAgUU9iamVjdDo6Y29ubmVjdChtQ29udGFpbmVyLnZlcnRpY2FsU2Nyb2xsQmFyKCksCisgICAgICAgICAgICAgICAgICAgICBTSUdOQUwocmFuZ2VDaGFuZ2VkKGludCwgaW50KSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3Rfc2Nyb2xsUmFuZ2VDaGFuZ2VkKGludCwgaW50KSkpOworCisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIGJvb2wgb25Ub3AgPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkFMV0FZU19PTl9UT1AsIGZhbHNlKS50b0Jvb2woKTsKKyAgICBzZXRPblRvcChvblRvcCk7CisKKyAgICBib29sIHNob3J0Y3V0Qm9vbCA9CisgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkZPUldBUkRfU0hPUlRDVVRTX1RPX0RFVklDRSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIC50b0Jvb2woKTsKKyAgICBzZXRGb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2Uoc2hvcnRjdXRCb29sID8gMSA6IDApOworCisgICAgaW5pdEVycm9yRGlhbG9nKHRoaXMpOworICAgIHNldE9iamVjdE5hbWUoIk1haW5XaW5kb3ciKTsKKyAgICBtRXZlbnRMb2dnZXItPnN0YXJ0UmVjb3JkaW5nKHRoaXMpOworICAgIG1FdmVudExvZ2dlci0+c3RhcnRSZWNvcmRpbmcobVRvb2xXaW5kb3cpOworICAgIG1Vc2VyQWN0aW9uc0NvdW50ZXItPnN0YXJ0Q291bnRpbmdGb3JNYWluV2luZG93KHRoaXMpOworICAgIG1Vc2VyQWN0aW9uc0NvdW50ZXItPnN0YXJ0Q291bnRpbmdGb3JUb29sV2luZG93KG1Ub29sV2luZG93KTsKKyAgICBtVXNlckFjdGlvbnNDb3VudGVyLT5zdGFydENvdW50aW5nRm9yT3ZlcmxheVdpbmRvdygmbU92ZXJsYXkpOworCisgICAgLy8gVGhlIGNyYXNoIHJlcG9ydGVyIHdpbGwgZHVtcCB0aGUgbGFzdCAxMDAwIFVJIGV2ZW50cy4KKyAgICAvLyBtRXZlbnRMb2dnZXIgaXMgYSBzaGFyZWQgcG9pbnRlciwgY2FwdHVyaW5nIGl0cyBjb3B5CisgICAgLy8gaW5zaWRlIGEgbGFtYmRhIGVuc3VyZXMgdGhhdCBpdCBsaXZlcyBvbiBhcyBsb25nIGFzCisgICAgLy8gQ3Jhc2hSZXBvcnRlciBuZWVkcyBpdCwgZXZlbiBpZiBFbXVsYXRvclF0V2luZG93IGlzCisgICAgLy8gZGVzdHJveWVkLgorICAgIGF1dG8gZXZlbnRfbG9nZ2VyID0gbUV2ZW50TG9nZ2VyOworICAgIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YWRkQ3Jhc2hDYWxsYmFjaygKKyAgICAgICAgICAgIFtldmVudF9sb2dnZXJdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWNlbnQtdWktYWN0aW9ucy50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRXZlbnRzKGV2ZW50X2xvZ2dlci0+Y29udGFpbmVyKCkpKTsKKyAgICAgICAgICAgIH0pOworCisgICAgYXV0byB1c2VyX2FjdGlvbnMgPSBtVXNlckFjdGlvbnNDb3VudGVyOworICAgIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YWRkQ3Jhc2hDYWxsYmFjaygKKyAgICAgICAgICAgIFt1c2VyX2FjdGlvbnNdKCkgeworICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmNyYXNocmVwb3J0OjpDcmFzaFJlcG9ydGVyOjpnZXQoKS0+YXR0YWNoRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJudW0tdXNlci1hY3Rpb25zLnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyh1c2VyX2FjdGlvbnMtPmNvdW50KCkpKTsKKyAgICAgICAgICAgIH0pOworICAgIHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6cXQ6OlVzZXJBY3Rpb25zQ291bnRlcj4gdXNlcl9hY3Rpb25zX3dlYWsoCisgICAgICAgICAgICBtVXNlckFjdGlvbnNDb3VudGVyKTsKKworICAgIHVzaW5nIGFuZHJvaWQ6Om1ldHJpY3M6OlBlcmlvZGljUmVwb3J0ZXI7CisgICAgbU1ldHJpY3NSZXBvcnRpbmdUb2tlbiA9IFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZENhbmNlbGFibGVUYXNrKAorICAgICAgICAgICAgNjAgKiAxMCAqIDEwMDAsICAvLyByZXBvcnRpbmcgcGVyaW9kCisgICAgICAgICAgICBbdXNlcl9hY3Rpb25zX3dlYWtdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gdXNlcl9hY3Rpb25zID0gdXNlcl9hY3Rpb25zX3dlYWsubG9jaygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gYWN0aW9uc0NvdW50ID0gdXNlcl9hY3Rpb25zLT5jb3VudCgpOworICAgICAgICAgICAgICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl91aV9ldmVudCgpLT5zZXRfY29udGV4dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3N0dWRpbzo6RW11bGF0b3JVaUV2ZW50OjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOS05PV05fRU1VTEFUT1JfVUlfRVZFTlRfQ09OVEVYVCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5tdXRhYmxlX2VtdWxhdG9yX3VpX2V2ZW50KCktPnNldF90eXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfc3R1ZGlvOjpFbXVsYXRvclVpRXZlbnQ6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5LT05XTl9FTVVMQVRPUl9VSV9FVkVOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfdWlfZXZlbnQoKS0+c2V0X3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnNDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9KTsKKworICAgIG1XaGVlbFNjcm9sbFRpbWVyLnNldEludGVydmFsKDEwMCk7CisgICAgbVdoZWVsU2Nyb2xsVGltZXIuc2V0U2luZ2xlU2hvdCh0cnVlKTsKKyAgICBjb25uZWN0KCZtV2hlZWxTY3JvbGxUaW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIHRoaXMsCisgICAgICAgICAgICBTTE9UKHdoZWVsU2Nyb2xsVGltZW91dCgpKSk7Cit9CisKK0VtdWxhdG9yUXRXaW5kb3c6OlB0ciBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZVB0cigpIHsKKyAgICByZXR1cm4gc0luc3RhbmNlLmdldCgpOworfQorCitFbXVsYXRvclF0V2luZG93KiBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gZ2V0SW5zdGFuY2VQdHIoKS5nZXQoKTsKK30KKworRW11bGF0b3JRdFdpbmRvdzo6fkVtdWxhdG9yUXRXaW5kb3coKSB7CisgICAgaWYgKG1BcGtJbnN0YWxsQ29tbWFuZCkgeworICAgICAgICBtQXBrSW5zdGFsbENvbW1hbmQtPmNhbmNlbCgpOworICAgIH0KKyAgICBtSW5zdGFsbERpYWxvZy5kaXNjb25uZWN0KCk7CisgICAgbUluc3RhbGxEaWFsb2cuY2xvc2UoKTsKKyAgICBtUHVzaERpYWxvZy5kaXNjb25uZWN0KCk7CisgICAgbVB1c2hEaWFsb2cuY2xvc2UoKTsKKworICAgIGRlbGV0ZUVycm9yRGlhbG9nKCk7CisgICAgaWYgKG1Ub29sV2luZG93KSB7CisgICAgICAgIGRlbGV0ZSBtVG9vbFdpbmRvdzsKKyAgICAgICAgbVRvb2xXaW5kb3cgPSBOVUxMOworICAgIH0KKworICAgIGRlbGV0ZSBtTWFpbkxvb3BUaHJlYWQ7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2hvd0F2ZEFyY2hXYXJuaW5nKCkgeworICAgIFNjb3BlZENQdHI8Y2hhcj4gYXJjaChhdmRJbmZvX2dldFRhcmdldENwdUFyY2goYW5kcm9pZF9hdmRJbmZvKSk7CisgICAgaWYgKCFzdHJjbXAoYXJjaC5nZXQoKSwgIng4NiIpIHx8ICFzdHJjbXAoYXJjaC5nZXQoKSwgIng4Nl82NCIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIHN0YXR1c2VzIGluZGljYXRlIHRoYXQgdGhlIG1hY2hpbmUgaGFyZHdhcmUgZG9lcyBub3QKKyAgICAvLyBzdXBwb3J0CisgICAgLy8gaGFyZHdhcmUKKyAgICAvLyBhY2NlbGVyYXRpb24uIFRoZXNlIG1hY2hpbmVzIHNob3VsZCBuZXZlciBzaG93IGEgcG9wdXAgaW5kaWNhdGluZyB0bworICAgIC8vIHN3aXRjaAorICAgIC8vIHRvIHg4Ni4KKyAgICBzdGF0aWMgY29uc3QgQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBiYWRTdGF0dXNlc1tdID0geworICAgICAgICAgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05FU1RFRF9OT1RfU1VQUE9SVEVELCAgLy8gSEFYTSBkb2Vzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgVk0KKyAgICAgICAgICAgIEFORFJPSURfQ1BVX0FDQ0VMRVJBVElPTl9JTlRFTF9SRVFVSVJFRCwgICAgICAgIC8vIEhBWE0gcmVxdWlyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdlbml1bmVJbnRlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc29yCisgICAgICAgICAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fTk9fQ1BVX1NVUFBPUlQsICAvLyBDUFUgZG9lc24ndCBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmVhdHVyZXMgKFZULXggb3IgU1ZNKQorICAgICAgICAgICAgQU5EUk9JRF9DUFVfQUNDRUxFUkFUSU9OX05PX0NQVV9WVFhfU1VQUE9SVCwgIC8vIENQVSBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWVC14CisgICAgICAgICAgICBBTkRST0lEX0NQVV9BQ0NFTEVSQVRJT05fTk9fQ1BVX05YX1NVUFBPUlQsICAgLy8gQ1BVIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5YCisgICAgfTsKKworICAgIEFuZHJvaWRDcHVBY2NlbGVyYXRpb24gY3B1U3RhdHVzID0KKyAgICAgICAgICAgIGFuZHJvaWRDcHVBY2NlbGVyYXRpb25fZ2V0U3RhdHVzKG51bGxwdHIpOworICAgIGZvciAoQW5kcm9pZENwdUFjY2VsZXJhdGlvbiBzdGF0dXMgOiBiYWRTdGF0dXNlcykgeworICAgICAgICBpZiAoY3B1U3RhdHVzID09IHN0YXR1cykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIGlmIChzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlNIT1dfQVZEX0FSQ0hfV0FSTklORywgdHJ1ZSkudG9Cb29sKCkpIHsKKyAgICAgICAgUU9iamVjdDo6Y29ubmVjdCgmbUF2ZFdhcm5pbmdCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkFMKGJ1dHRvbkNsaWNrZWQoUUFic3RyYWN0QnV0dG9uKikpLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1Qoc2xvdF9hdmRBcmNoV2FybmluZ01lc3NhZ2VBY2NlcHRlZCgpKSk7CisKKyAgICAgICAgUUNoZWNrQm94KiBjaGVja2JveCA9IG5ldyBRQ2hlY2tCb3godHIoIk5ldmVyIHNob3cgdGhpcyBhZ2Fpbi4iKSk7CisgICAgICAgIGNoZWNrYm94LT5zZXRDaGVja1N0YXRlKFF0OjpVbmNoZWNrZWQpOworICAgICAgICBtQXZkV2FybmluZ0JveC5zZXRXaW5kb3dNb2RhbGl0eShRdDo6Tm9uTW9kYWwpOworICAgICAgICBtQXZkV2FybmluZ0JveC5zZXRDaGVja0JveChjaGVja2JveCk7CisgICAgICAgIG1BdmRXYXJuaW5nQm94LnNob3coKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2hvd0dwdVdhcm5pbmcoKSB7CisgICAgaWYgKCFHcHVJbmZvTGlzdDo6Z2V0KCktPmJsYWNrbGlzdF9zdGF0dXMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBpZiAoc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpTSE9XX0dQVV9XQVJOSU5HLCB0cnVlKS50b0Jvb2woKSkgeworICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KCZtR3B1V2FybmluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTSUdOQUwoYnV0dG9uQ2xpY2tlZChRQWJzdHJhY3RCdXR0b24qKSksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVChzbG90X2dwdVdhcm5pbmdNZXNzYWdlQWNjZXB0ZWQoKSkpOworCisgICAgICAgIFFDaGVja0JveCogY2hlY2tib3ggPSBuZXcgUUNoZWNrQm94KHRyKCJOZXZlciBzaG93IHRoaXMgYWdhaW4uIikpOworICAgICAgICBjaGVja2JveC0+c2V0Q2hlY2tTdGF0ZShRdDo6VW5jaGVja2VkKTsKKyAgICAgICAgbUdwdVdhcm5pbmdCb3guc2V0V2luZG93TW9kYWxpdHkoUXQ6Ok5vbk1vZGFsKTsKKyAgICAgICAgbUdwdVdhcm5pbmdCb3guc2V0Q2hlY2tCb3goY2hlY2tib3gpOworICAgICAgICBtR3B1V2FybmluZ0JveC5zaG93KCk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc3RhcnR1cFRpY2soKSB7CisgICAgLy8gSXQncyBiZWVuIGEgd2hpbGUgc2luY2Ugd2Ugd2VyZSBsYXVuY2hlZCwgYW5kIHRoZSBtYWluCisgICAgLy8gd2luZG93IHN0aWxsIGhhc24ndCBhcHBlYXJlZC4KKyAgICAvLyBTaG93IGEgcG9wLXVwIHRoYXQgbGV0cyB0aGUgdXNlciBrbm93IHdlIGFyZSB3b3JraW5nLgorCisgICAgbVN0YXJ0dXBEaWFsb2cuc2V0V2luZG93VGl0bGUodHIoIkFuZHJvaWQgRW11bGF0b3IiKSk7CisgICAgLy8gSGlkZSBjbG9zZS9taW5pbWl6ZS9tYXhpbWl6ZSBidXR0b25zCisgICAgbVN0YXJ0dXBEaWFsb2cuc2V0V2luZG93RmxhZ3MoUXQ6OkRpYWxvZyB8IFF0OjpDdXN0b21pemVXaW5kb3dIaW50IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdDo6V2luZG93VGl0bGVIaW50KTsKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGljb24gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIG1haW4gd2luZG93CisgICAgbVN0YXJ0dXBEaWFsb2cuc2V0V2luZG93SWNvbihRQXBwbGljYXRpb246OndpbmRvd0ljb24oKSk7CisKKyAgICAvLyBFbXVsYXRvciBsb2dvCisgICAgUUxhYmVsKiBsYWJlbCA9IG5ldyBRTGFiZWwoKTsKKyAgICBsYWJlbC0+c2V0QWxpZ25tZW50KFF0OjpBbGlnbkNlbnRlcik7CisgICAgUVNpemUgc2l6ZTsKKyAgICBzaXplLnNldFdpZHRoKG1TdGFydHVwRGlhbG9nLnNpemUoKS53aWR0aCgpIC8gMik7CisgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS53aWR0aCgpKTsKKyAgICBRUGl4bWFwIHBpeG1hcCA9IHdpbmRvd0ljb24oKS5waXhtYXAoc2l6ZSk7CisgICAgbGFiZWwtPnNldFBpeG1hcChwaXhtYXApOworICAgIG1TdGFydHVwRGlhbG9nLnNldExhYmVsKGxhYmVsKTsKKworICAgIC8vIFRoZSBkZWZhdWx0IHByb2dyZXNzIGJhciBvbiBXaW5kb3dzIGlzbid0IGNlbnRlcmVkIGZvciBzb21lIHJlYXNvbgorICAgIFFQcm9ncmVzc0JhciogYmFyID0gbmV3IFFQcm9ncmVzc0JhcigpOworICAgIGJhci0+c2V0QWxpZ25tZW50KFF0OjpBbGlnbkhDZW50ZXIpOworICAgIG1TdGFydHVwRGlhbG9nLnNldEJhcihiYXIpOworCisgICAgbVN0YXJ0dXBEaWFsb2cuc2V0UmFuZ2UoMCwgMCk7ICAgICAgLy8gRG9uJ3Qgc2hvdyAlIGNvbXBsZXRlCisgICAgbVN0YXJ0dXBEaWFsb2cuc2V0Q2FuY2VsQnV0dG9uKDApOyAgLy8gTm8gImNhbmNlbCIgYnV0dG9uCisgICAgbVN0YXJ0dXBEaWFsb2cuc2hvdygpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfYXZkQXJjaFdhcm5pbmdNZXNzYWdlQWNjZXB0ZWQoKSB7CisgICAgUUNoZWNrQm94KiBjaGVja2JveCA9IG1BdmRXYXJuaW5nQm94LmNoZWNrQm94KCk7CisgICAgaWYgKGNoZWNrYm94LT5jaGVja1N0YXRlKCkgPT0gUXQ6OkNoZWNrZWQpIHsKKyAgICAgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OlNIT1dfQVZEX0FSQ0hfV0FSTklORywgZmFsc2UpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X2dwdVdhcm5pbmdNZXNzYWdlQWNjZXB0ZWQoKSB7CisgICAgUUNoZWNrQm94KiBjaGVja2JveCA9IG1HcHVXYXJuaW5nQm94LmNoZWNrQm94KCk7CisgICAgaWYgKGNoZWNrYm94LT5jaGVja1N0YXRlKCkgPT0gUXQ6OkNoZWNrZWQpIHsKKyAgICAgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OlNIT1dfR1BVX1dBUk5JTkcsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6Y2xvc2VFdmVudChRQ2xvc2VFdmVudCogZXZlbnQpIHsKKyAgICBjcmFzaGhhbmRsZXJfZXhpdG1vZGUoX19GVU5DVElPTl9fKTsKKyAgICBpZiAobU1haW5Mb29wVGhyZWFkICYmIG1NYWluTG9vcFRocmVhZC0+aXNSdW5uaW5nKCkpIHsKKyAgICAgICAgLy8gd2UgZG9udCB3YW50IHRvIHJlc3RvcmUgdG8gYSBzdGF0ZSB3aGVyZSB0aGUKKyAgICAgICAgLy8gZnJhbWV3b3JrIGlzIHN0b3BwZWQgYnkgJ2FkYiBzaGVsbCBzdG9wJworICAgICAgICAvLyBzbyBza2lwIHRoYXQgc3RlcCB3aGVuIHNhdmluZyB2bSBvbiBleGl0CisgICAgICAgIGlmIChzYXZldm1fb25fZXhpdCkgeworICAgICAgICAgICAgcXVldWVRdWl0RXZlbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bkFkYlNoZWxsU3RvcEFuZFF1aXQoKTsKKyAgICAgICAgfQorICAgICAgICBldmVudC0+aWdub3JlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSXQgaXMgb25seSBzYWZlIHRvIHN0b3AgdGhlIE9wZW5HTCBFUworICAgICAgICAvLyByZW5kZXJlciBhZnRlciB0aGUgbWFpbiBsb29wIGhhcyBleGl0ZWQuCisgICAgICAgIC8vIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IGJlZm9yZQorICAgICAgICAvLyB8c2tpbl93aW5kb3dfZnJlZXwgaXMgY2FsbGVkLCBlc3BlY2lhbGx5CisgICAgICAgIC8vIG9uIFdpbmRvd3MhCisgICAgICAgIGFuZHJvaWRfc3RvcE9wZW5nbGVzUmVuZGVyZXIoKTsKKyAgICAgICAgbVRvb2xXaW5kb3ctPmNsb3NlRXh0ZW5kZWRXaW5kb3coKTsKKyAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpxdWV1ZVF1aXRFdmVudCgpIHsKKyAgICBxdWV1ZVNraW5FdmVudChjcmVhdGVTa2luRXZlbnQoa0V2ZW50UXVpdCkpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OmRyYWdFbnRlckV2ZW50KFFEcmFnRW50ZXJFdmVudCogZXZlbnQpIHsKKyAgICAvLyBBY2NlcHQgYWxsIGRyYWcgZW50ZXIgZXZlbnRzIHdpdGggYW55IFVSTCwgdGhlbiBmaWx0ZXIgbW9yZSBpbiBkcm9wCisgICAgLy8gZXZlbnRzCisgICAgLy8gVE9ETzogY2hlY2sgdGhpcyB3aXRoIGhhc0Zvcm1hdHMoKSB1c2luZyBNSU1FIHR5cGUgZm9yIC5hcGs/CisgICAgaWYgKGV2ZW50LT5taW1lRGF0YSgpICYmIGV2ZW50LT5taW1lRGF0YSgpLT5oYXNVcmxzKCkpIHsKKyAgICAgICAgZXZlbnQtPmFjY2VwdFByb3Bvc2VkQWN0aW9uKCk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OmRyYWdMZWF2ZUV2ZW50KFFEcmFnTGVhdmVFdmVudCogZXZlbnQpIHsKKyAgICBRVG9vbFRpcDo6aGlkZVRleHQoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpkcmFnTW92ZUV2ZW50KFFEcmFnTW92ZUV2ZW50KiBldmVudCkgeworICAgIFFUb29sVGlwOjpzaG93VGV4dChtYXBUb0dsb2JhbChldmVudC0+cG9zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICB0cigiQVBLJ3Mgd2lsbCBiZSBpbnN0YWxsZWQuPGJyLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byAvc2RjYXJkL0Rvd25sb2FkLiIpKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93Ojpkcm9wRXZlbnQoUURyb3BFdmVudCogZXZlbnQpIHsKKyAgICAvLyBNb2RhbCBkaWFsb2dzIGRvbid0IHByZXZlbnQgZHJhZy1hbmQtZHJvcCEgTWFudWFsbHkgY2hlY2sgZm9yIGEgbW9kYWwKKyAgICAvLyBkaWFsb2csIGFuZCBpZiBzbywgcmVqZWN0IHRoZSBldmVudC4KKyAgICBpZiAoUUFwcGxpY2F0aW9uOjphY3RpdmVNb2RhbFdpZGdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgZXZlbnQtPmlnbm9yZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUUxpc3Q8UVVybD4gdXJscyA9IGV2ZW50LT5taW1lRGF0YSgpLT51cmxzKCk7CisgICAgaWYgKHVybHMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBzaG93RXJyb3JEaWFsb2coCisgICAgICAgICAgICAgICAgdHIoIkRyb3BwZWQgY29udGVudCBkaWRuJ3QgaGF2ZSBhbnkgZmlsZXMuIEVtdWxhdG9yIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICJzdXBwb3J0cyBkcmFnLWFuZC1kcm9wIGZvciBmaWxlcyB0byBjb3B5IHRoZW0gb3IgaW5zdGFsbCAiCisgICAgICAgICAgICAgICAgICAgImEgc2luZ2xlIEFQSy4iKSwKKyAgICAgICAgICAgICAgICB0cigiRHJhZyBhbmQgRHJvcCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEdldCB0aGUgZmlyc3QgdXJsIC0gaWYgaXQncyBhbiBBUEsgYW5kIHRoZSBvbmx5IGZpbGUsIGF0dGVtcHQgdG8gaW5zdGFsbAorICAgIC8vIGl0CisgICAgUVN0cmluZyB1cmwgPSB1cmxzWzBdLnRvTG9jYWxGaWxlKCk7CisgICAgaWYgKHVybC5lbmRzV2l0aCgiLmFwayIpICYmIHVybHMubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICBydW5BZGJJbnN0YWxsKHVybCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiBhbnkgb2YgdGhlIGZpbGVzIGlzIGFuIEFQSywgaW50ZW50IHdhcyBhbWJpZ3VvdXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh1cmxzW2ldLnBhdGgoKS5lbmRzV2l0aCgiLmFwayIpKSB7CisgICAgICAgICAgICAgICAgc2hvd0Vycm9yRGlhbG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgdHIoIkRyYWctYW5kLWRyb3AgY2FuIGVpdGhlciBpbnN0YWxsIGEgc2luZ2xlIEFQSyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmlsZSBvciBjb3B5IG9uZSBvciBtb3JlIG5vbi1BUEsgZmlsZXMgdG8gdGhlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBFbXVsYXRvciBTRCBjYXJkLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHIoIkRyYWcgYW5kIERyb3AiKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJ1bkFkYlB1c2godXJscyk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldmVudCkgeworICAgIGhhbmRsZUtleUV2ZW50KGtFdmVudEtleURvd24sIGV2ZW50KTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjprZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldmVudCkgeworICAgIGhhbmRsZUtleUV2ZW50KGtFdmVudEtleVVwLCBldmVudCk7CisKKyAgICAvLyBJZiB3ZSBlbmFibGVkIHRyYWNrYmFsbCBtb2RlLCB0ZWxsIFF0IHRvIGFsd2F5cyBmb3J3YXJkIG1vdXNlIG1vdmVtZW50CisgICAgLy8gZXZlbnRzLiBPdGhlcndpc2UsIFF0IHdpbGwgZm9yd2FyZCB0aGVtIG9ubHkgd2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkLgorICAgIEVtdWxhdG9yV2luZG93KiBldyA9IGVtdWxhdG9yX3dpbmRvd19nZXQoKTsKKyAgICBib29sIHRyYWNrYmFsbEFjdGl2ZSA9IHNraW5fdWlfaXNfdHJhY2tiYWxsX2FjdGl2ZShldy0+dWkpOworICAgIGlmICh0cmFja2JhbGxBY3RpdmUgIT0gaGFzTW91c2VUcmFja2luZygpKSB7CisgICAgICAgIHNldE1vdXNlVHJhY2tpbmcodHJhY2tiYWxsQWN0aXZlKTsKKyAgICB9Cit9Cit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgeworICAgIGhhbmRsZU1vdXNlRXZlbnQoa0V2ZW50TW91c2VNb3Rpb24sIGdldFNraW5Nb3VzZUJ1dHRvbihldmVudCksCisgICAgICAgICAgICAgICAgICAgICBldmVudC0+cG9zKCkpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6Om1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZXZlbnQpIHsKKyAgICBoYW5kbGVNb3VzZUV2ZW50KGtFdmVudE1vdXNlQnV0dG9uRG93biwgZ2V0U2tpbk1vdXNlQnV0dG9uKGV2ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5wb3MoKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6bW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KSB7CisgICAgaGFuZGxlTW91c2VFdmVudChrRXZlbnRNb3VzZUJ1dHRvblVwLCBnZXRTa2luTW91c2VCdXR0b24oZXZlbnQpLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPnBvcygpKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpwYWludEV2ZW50KFFQYWludEV2ZW50KikgeworICAgIFFQYWludGVyIHBhaW50ZXIodGhpcyk7CisgICAgUVJlY3QgYmcoUVBvaW50KDAsIDApLCB0aGlzLT5zaXplKCkpOworCisgICAgcGFpbnRlci5maWxsUmVjdChiZywgUXQ6OmJsYWNrKTsKKworICAgIC8vIEVuc3VyZSB3ZSBhY3R1YWxseSBoYXZlIGEgdmFsaWQgYml0bWFwIGJlZm9yZSBhdHRlbXB0aW5nIHRvCisgICAgLy8gcmVzY2FsZQorICAgIGlmIChtQmFja2luZ1N1cmZhY2UgJiYgIW1CYWNraW5nU3VyZmFjZS0+Yml0bWFwLT5pc051bGwoKSkgeworICAgICAgICBRUmVjdCByKDAsIDAsIG1CYWNraW5nU3VyZmFjZS0+dywgbUJhY2tpbmdTdXJmYWNlLT5oKTsKKyAgICAgICAgLy8gUmVzY2FsZSB3aXRoIHNtb290aCB0cmFuc2Zvcm1hdGlvbiB0byBhdm9pZCBhbGlhc2luZworICAgICAgICBRSW1hZ2Ugc2NhbGVkX2JpdG1hcCA9IG1CYWNraW5nU3VyZmFjZS0+Yml0bWFwLT5zY2FsZWQoCisgICAgICAgICAgICAgICAgci5zaXplKCkgKiBkZXZpY2VQaXhlbFJhdGlvKCksIFF0OjpLZWVwQXNwZWN0UmF0aW8sCisgICAgICAgICAgICAgICAgUXQ6OlNtb290aFRyYW5zZm9ybWF0aW9uKTsKKyAgICAgICAgaWYgKCFzY2FsZWRfYml0bWFwLmlzTnVsbCgpKSB7CisgICAgICAgICAgICBzY2FsZWRfYml0bWFwLnNldERldmljZVBpeGVsUmF0aW8oZGV2aWNlUGl4ZWxSYXRpbygpKTsKKyAgICAgICAgICAgIHBhaW50ZXIuZHJhd0ltYWdlKHIsIHNjYWxlZF9iaXRtYXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBzY2FsZSB0aGUgc2tpbiBiaXRtYXAiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEQoIlBhaW50aW5nIGVtdWxhdG9yIHdpbmRvdywgYnV0IG5vIGJhY2tpbmcgYml0bWFwIik7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnJhaXNlKCkgeworICAgIG1Db250YWluZXIucmFpc2UoKTsKKyAgICBtVG9vbFdpbmRvdy0+cmFpc2UoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzaG93KCkgeworICAgIG1Db250YWluZXIuc2hvdygpOworICAgIFFGcmFtZTo6c2hvdygpOworICAgIG1Ub29sV2luZG93LT5zaG93KCk7CisKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHdpbmRvdygpLT53aW5kb3dIYW5kbGUoKSwgJlFXaW5kb3c6OnNjcmVlbkNoYW5nZWQsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zY3JlZW5DaGFuZ2VkKTsKKyAgICAvLyBPbiBNYWMsIHRoZSBhYm92ZSBmdW5jdGlvbiB3b24ndCBiZSB0cmlnZ2VyZWQgd2hlbiB5b3UgcGx1ZyBpbiBhIG5ldworICAgIC8vIG1vbml0b3IgYW5kIHRoZSBPUyBtb3ZlIHRoZSBlbXVsYXRvciB0byB0aGUgbmV3IHNjcmVlbi4gSW4gc3VjaAorICAgIC8vIHNpdHVhdGlvbiwgaXQgd2lsbCB0cmlnZ2VyIHNjcmVlbkNvdW50Q2hhbmdlZC4KKyAgICBRT2JqZWN0Ojpjb25uZWN0KHFBcHAtPmRlc2t0b3AoKSwgJlFEZXNrdG9wV2lkZ2V0OjpzY3JlZW5Db3VudENoYW5nZWQsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zY3JlZW5DaGFuZ2VkKTsKKyAgICAvLyBUaGVyZSBpcyBzdGlsbCBhIGNvcm5lciBjYXNlIHdoZXJlIHVzZXIgY2FuIG1pc3MgdGhlIHNjcmVlbiBjaGFuZ2UgZXZlbnQKKyAgICAvLyBieSBjaGFuZ2luZyB0aGUgcHJpbWFyeSBkaXNwbGF5IHRocm91Z2ggc3lzdGVtIHNldHRpbmcuIFRoaXMgY2FuIGJlCisgICAgLy8gY2FwdHVyZWQgYnkgdGhlIGZ1bmN0aW9uIGJlbG93LCBidXQgaXQgd29uJ3QgYmUgc3VwcG9ydGVkIHVudGlsIFF0IDUuNi4KKyAgICAvLworICAgIC8vIFRPRE8oeWFoYW4pOiB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHdoZW4gdXBncmFkZSB0byBRdCA1LjYKKyAgICAvLyBRT2JqZWN0Ojpjb25uZWN0KHFBcHAtPmRlc2t0b3AoKSwgJlFEZXNrdG9wV2lkZ2V0OjpwcmltYXJ5U2NyZWVuQ2hhbmdlZCwKKyAgICAvLyAgICAgICAgdGhpcywgJkVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc2NyZWVuQ2hhbmdlZCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2V0T25Ub3AoYm9vbCBvblRvcCkgeworICAgIHNldEZyYW1lT25Ub3AoJm1Db250YWluZXIsIG9uVG9wKTsKKyAgICBzZXRGcmFtZU9uVG9wKG1Ub29sV2luZG93LCBvblRvcCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2hvd01pbmltaXplZCgpIHsKKyAgICBtQ29udGFpbmVyLnNob3dNaW5pbWl6ZWQoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzdGFydFRocmVhZChTdGFydEZ1bmN0aW9uIGYsIGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmICghbU1haW5Mb29wVGhyZWFkKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBudWxsIGFzIGFyZ3VtZW50cyB0byBTdGFydEZ1bmN0aW9uCisgICAgICAgIGlmIChhcmdjICYmICFhcmd2KSB7CisgICAgICAgICAgICBEKCJFbXB0eSBhcmd2IHBhc3NlZCB0byBhIHN0YXJ0VGhyZWFkKCksIHJldHVybmluZyBlYXJseSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGFzcyB0aGUgUUVNVSBtYWluIHRocmVhZCdzIGFyZ3VtZW50cyBpbnRvIHRoZSBjcmFzaCBoYW5kbGVyCisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9ICI9PT09PSBRRU1VIG1haW4gbG9vcCBhcmd1bWVudHMgPT09PT1cbiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgbnVsbCBpbiBhcmd2CisgICAgICAgICAgICBpZiAoIWFyZ3ZbaV0pIHsKKyAgICAgICAgICAgICAgICBEKCJJbnRlcm5hbCBFcnJvcjogYXJndlslZF0gd2FzIG51bGwsIHJlcGxhY2VkIHdpdGggZW1wdHkgIgorICAgICAgICAgICAgICAgICAgInN0cmluZyIsCisgICAgICAgICAgICAgICAgICBpKTsKKyAgICAgICAgICAgICAgICBhcmd2W2ldID0gc3RyZHVwKCIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyZ3VtZW50cyArPSBhcmd2W2ldOworICAgICAgICAgICAgYXJndW1lbnRzICs9ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZDo6Y3Jhc2hyZXBvcnQ6OkNyYXNoUmVwb3J0ZXI6OmdldCgpLT5hdHRhY2hEYXRhKAorICAgICAgICAgICAgICAgICJxZW11LW1haW4tbG9vcC1hcmdzLnR4dCIsIGFyZ3VtZW50cyk7CisKKyAgICAgICAgbU1haW5Mb29wVGhyZWFkID0gbmV3IE1haW5Mb29wVGhyZWFkKGYsIGFyZ2MsIGFyZ3YpOworICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KG1NYWluTG9vcFRocmVhZCwgJlFUaHJlYWQ6OmZpbmlzaGVkLCAmbUNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmRW11bGF0b3JDb250YWluZXI6OmNsb3NlKTsKKyAgICAgICAgbU1haW5Mb29wVGhyZWFkLT5zdGFydCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIEQoIm1NYWluTG9vcFRocmVhZCBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9ibGl0KFFJbWFnZSogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVJlY3QqIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRSW1hZ2UqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQb2ludCogZHN0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBhaW50ZXI6OkNvbXBvc2l0aW9uTW9kZSogb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICBRUGFpbnRlciBwYWludGVyKGRzdCk7CisgICAgcGFpbnRlci5zZXRDb21wb3NpdGlvbk1vZGUoKm9wKTsKKyAgICBwYWludGVyLmRyYXdJbWFnZSgqZHN0UG9zLCAqc3JjLCAqc3JjUmVjdCk7CisKKyAgICBwYWludGVyLnNldENvbXBvc2l0aW9uTW9kZShRUGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlX1NvdXJjZSk7CisgICAgaWYgKHNlbWFwaG9yZSAhPSBOVUxMKQorICAgICAgICBzZW1hcGhvcmUtPnJlbGVhc2UoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X2NsZWFySW5zdGFuY2UoKSB7CisjaWZuZGVmIF9fQVBQTEVfXworICAgIGlmIChtVG9vbFdpbmRvdykgeworICAgICAgICBkZWxldGUgbVRvb2xXaW5kb3c7CisgICAgICAgIG1Ub29sV2luZG93ID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIHNraW5fd2luc3lzX3NhdmVfd2luZG93X3BvcygpOworICAgIHNJbnN0YW5jZS5nZXQoKS5yZXNldCgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfY3JlYXRlQml0bWFwKFNraW5TdXJmYWNlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSkgeworICAgIHMtPmJpdG1hcCA9IG5ldyBRSW1hZ2UodywgaCwgUUltYWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICBpZiAocy0+Yml0bWFwLT5pc051bGwoKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gY3JlYXRlIGltYWdlLCB3YXJuIHVzZXIuCisgICAgICAgIHNob3dFcnJvckRpYWxvZyh0cigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNraW4gYml0bWFwLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnkgY29uZmlndXJpbmcgeW91ciBBVkQgdG8gbm90IGhhdmUgYSBza2luLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHIoIkVycm9yIGRpc3BsYXlpbmcgc2tpbiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5iaXRtYXAtPmZpbGwoMCk7CisgICAgfQorICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9maWxsKFNraW5TdXJmYWNlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QqIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQ29sb3IqIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgUVBhaW50ZXIgcGFpbnRlcihzLT5iaXRtYXApOworICAgIHBhaW50ZXIuZmlsbFJlY3QoKnJlY3QsICpjb2xvcik7CisgICAgaWYgKHNlbWFwaG9yZSAhPSBOVUxMKQorICAgICAgICBzZW1hcGhvcmUtPnJlbGVhc2UoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X2dldEJpdG1hcEluZm8oU2tpblN1cmZhY2UqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luU3VyZmFjZVBpeGVscyogcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgcGl4LT5waXhlbHMgPSAodWludDMyX3QqKXMtPmJpdG1hcC0+Yml0cygpOworICAgIHBpeC0+dyA9IHMtPm9yaWdpbmFsX3c7CisgICAgcGl4LT5oID0gcy0+b3JpZ2luYWxfaDsKKyAgICBwaXgtPnBpdGNoID0gcy0+Yml0bWFwLT5ieXRlc1BlckxpbmUoKTsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfZ2V0RGV2aWNlUGl4ZWxSYXRpbyhkb3VibGUqIG91dF9kcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICAqb3V0X2RwciA9IGRldmljZVBpeGVsUmF0aW8oKTsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfZ2V0U2NyZWVuRGltZW5zaW9ucyhRUmVjdCogb3V0X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICBRUmVjdCByZWN0ID0gKChRQXBwbGljYXRpb24qKVFBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtPmRlc2t0b3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2NyZWVuR2VvbWV0cnkoKTsKKyAgICBvdXRfcmVjdC0+c2V0WChyZWN0LngoKSk7CisgICAgb3V0X3JlY3QtPnNldFkocmVjdC55KCkpOworCisgICAgLy8gQWx3YXlzIHJlcG9ydCBzbGlnaHRseSBzbWFsbGVyLXRoYW4tYWN0dWFsIGRpbWVuc2lvbnMgdG8gcHJldmVudCBvZGQKKyAgICAvLyByZXNpemluZyBiZWhhdmlvciwKKyAgICAvLyB3aGljaCBjYW4gaGFwcGVuIGlmIHRoaW5ncyBsaWtlIHRoZSBPU1ggZG9jayBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudC4KKyAgICAvLyBUaGUgZGlmZmVyZW5jZQorICAgIC8vIGJlbG93IGlzIHNwZWNpZmljYWxseSB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgT1NYIGRvY2suCisgICAgb3V0X3JlY3QtPnNldFdpZHRoKHJlY3Qud2lkdGgoKSAqIC45NSk7CisjaWZkZWYgX19BUFBMRV9fCisgICAgb3V0X3JlY3QtPnNldEhlaWdodChyZWN0LmhlaWdodCgpICogLjg1KTsKKyNlbHNlICAvLyBfV0lOMzIgfHwgX19saW51eF9fCisgICAgb3V0X3JlY3QtPnNldEhlaWdodChyZWN0LmhlaWdodCgpICogLjk1KTsKKyNlbmRpZgorCisgICAgaWYgKHNlbWFwaG9yZSAhPSBOVUxMKQorICAgICAgICBzZW1hcGhvcmUtPnJlbGVhc2UoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X2dldFdpbmRvd0lkKFdJZCogb3V0X2lkLCBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICBXSWQgd2lkID0gZWZmZWN0aXZlV2luSWQoKTsKKyAgICBEKCJFZmZlY3RpdmUgd2luIElEIGlzICVseCIsIHdpZCk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgd2lkID0gKFdJZClnZXROU1dpbmRvdygodm9pZCopd2lkKTsKKyAgICBEKCJBZnRlciBmaW5kaW5nIHBhcmVudCwgd2luIElEIGlzICVseCIsIHdpZCk7CisjZW5kaWYKKyAgICAqb3V0X2lkID0gd2lkOworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9nZXRXaW5kb3dQb3MoaW50KiB4eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB5eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgLy8gTm90ZSB0aGF0IG1Db250YWluZXIueCgpID09IG1Db250YWluZXIuZnJhbWVHZW9tZXRyeSgpLngoKSwgd2hpY2gKKyAgICAvLyBpcyBOT1Qgd2hhdCB3ZSB3YW50LgorCisgICAgUVJlY3QgZ2VvbSA9IG1Db250YWluZXIuZ2VvbWV0cnkoKTsKKworICAgICp4eCA9IGdlb20ueCgpOworICAgICp5eSA9IGdlb20ueSgpOworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9pc1dpbmRvd0Z1bGx5VmlzaWJsZShib29sKiBvdXRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgUURlc2t0b3BXaWRnZXQqIGRlc2t0b3AgPQorICAgICAgICAgICAgKChRQXBwbGljYXRpb24qKVFBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSktPmRlc2t0b3AoKTsKKyAgICBpbnQgc2NyZWVuTnVtID0KKyAgICAgICAgICAgIGRlc2t0b3AtPnNjcmVlbk51bWJlcigmbUNvbnRhaW5lcik7ICAvLyBTY3JlZW4gaG9sZGluZyB0aGUgYXBwCisgICAgUVJlY3Qgc2NyZWVuR2VvID0gZGVza3RvcC0+c2NyZWVuR2VvbWV0cnkoc2NyZWVuTnVtKTsKKworICAgICpvdXRfdmFsdWUgPSBzY3JlZW5HZW8uY29udGFpbnMobUNvbnRhaW5lci5nZW9tZXRyeSgpKTsKKworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6cG9sbEV2ZW50KFNraW5FdmVudCogZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBoYXNFdmVudCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIGxvY2sobVNraW5FdmVudFF1ZXVlTG9jayk7CisgICAgaWYgKG1Ta2luRXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgKmhhc0V2ZW50ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2tpbkV2ZW50KiBuZXdFdmVudCA9IG1Ta2luRXZlbnRRdWV1ZS5kZXF1ZXVlKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICpoYXNFdmVudCA9IHRydWU7CisKKyAgICAgICAgLy8gVE9ETyhncmlnb3J5aik6IGRlYnVnIG91dHB1dCBuZWVkZWQgZm9yIGludmVzdGlnYXRpbmcgdGhlIHJvdGF0aW9uCisgICAgICAgIC8vIGJ1Zy4KKyAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0socm90YXRpb24pICYmIChuZXdFdmVudC0+dHlwZSA9PSBrRXZlbnRMYXlvdXROZXh0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQtPnR5cGUgPT0ga0V2ZW50TGF5b3V0UHJldikpIHsKKyAgICAgICAgICAgIHFXYXJuaW5nKCJEZXF1ZWQgZXZlbnQgTGF5b3V0JXMiLAorICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQtPnR5cGUgPT0ga0V2ZW50TGF5b3V0TmV4dCA/ICJOZXh0IiA6ICJQcmV2Iik7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGV2ZW50LCBuZXdFdmVudCwgc2l6ZW9mKFNraW5FdmVudCkpOworICAgICAgICBkZWxldGUgbmV3RXZlbnQ7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnF1ZXVlU2tpbkV2ZW50KFNraW5FdmVudCogZXZlbnQpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBsb2NrKG1Ta2luRXZlbnRRdWV1ZUxvY2spOworICAgIGNvbnN0IGJvb2wgZmlyc3RFdmVudCA9IG1Ta2luRXZlbnRRdWV1ZS5pc0VtcHR5KCk7CisKKyAgICAvLyBGb3IgdGhlIGZvbGxvd2luZyBldmVudHMsIG9ubHkgdGhlICJsYXN0IiBleGFtcGxlIG9mIHNhaWQgZXZlbnQKKyAgICAvLyBtYXR0ZXJzLCBzbyBlbnN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBvZiB0aGVtIGluIHRoZSBxdWV1ZSBhdCBhCisgICAgLy8gdGltZS4gQWRkaXRpb25hbHkgdGhlIHNjcmVlbiBjaGFuZ2VkIGV2ZW50IHByb2Nlc3NpbmcgaXMgdmVyeSBzbG93LAorICAgIC8vIHNvIGxldCdzIG5vdCBnZW5lcmF0ZSB0b28gbWFueSBvZiB0aGVtLgorICAgIGJvb2wgcmVwbGFjZWQgPSBmYWxzZTsKKyAgICBjb25zdCBhdXRvIHR5cGUgPSBldmVudC0+dHlwZTsKKyAgICBpZiAodHlwZSA9PSBrRXZlbnRTY3JvbGxCYXJDaGFuZ2VkIHx8CisgICAgICAgIHR5cGUgPT0ga0V2ZW50Wm9vbWVkV2luZG93UmVzaXplZCB8fAorICAgICAgICB0eXBlID09IGtFdmVudFNjcmVlbkNoYW5nZWQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU2tpbkV2ZW50UXVldWUuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtU2tpbkV2ZW50UXVldWUuYXQoaSktPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgICAgIFNraW5FdmVudCogdG9EZWxldGUgPSBtU2tpbkV2ZW50UXVldWUuYXQoaSk7CisgICAgICAgICAgICAgICAgbVNraW5FdmVudFF1ZXVlLnJlcGxhY2UoaSwgZXZlbnQpOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgZGVsZXRlIHRvRGVsZXRlOworICAgICAgICAgICAgICAgIHJlcGxhY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmVwbGFjZWQpIHsKKyAgICAgICAgbVNraW5FdmVudFF1ZXVlLmVucXVldWUoZXZlbnQpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIC8vIFRPRE8oZ3JpZ29yeWopOiBkZWJ1ZyBvdXRwdXQgbmVlZGVkIGZvciBpbnZlc3RpZ2F0aW5nIHRoZQorICAgICAgICAvLyByb3RhdGlvbiBidWcuCisgICAgICAgIGlmIChWRVJCT1NFX0NIRUNLKHJvdGF0aW9uKSAmJiAodHlwZSA9PSBrRXZlbnRMYXlvdXROZXh0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBrRXZlbnRMYXlvdXRQcmV2KSkgeworICAgICAgICAgICAgcVdhcm5pbmcoIkVucXVldWVkIExheW91dCVzIGV2ZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0ga0V2ZW50TGF5b3V0TmV4dCA/ICJOZXh0IiA6ICJQcmV2Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHVpQWdlbnQgPSBtVG9vbFdpbmRvdy0+Z2V0VWlFbXVBZ2VudCgpOworICAgIGlmIChmaXJzdEV2ZW50ICYmIHVpQWdlbnQgJiYgdWlBZ2VudC0+dXNlckV2ZW50cyAmJgorICAgICAgICB1aUFnZW50LT51c2VyRXZlbnRzLT5vbk5ld1VzZXJFdmVudCkgeworICAgICAgICAvLyBXZSBrbm93IHRoYXQgYXMgc29vbiBhcyBlbXVsYXRvciBzdGFydHMgcHJvY2Vzc2luZyB1c2VyIGV2ZW50cworICAgICAgICAvLyBpdCBwcm9jZXNzZXMgdGhlbSB1bnRpbCB0aGVyZSBhcmUgbm9uZS4gU28gd2Ugc2hvdWxkIG9ubHkgbm90aWZ5IGl0CisgICAgICAgIC8vIGlmIHRoaXMgZXZlbnQgaXMgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgdWlBZ2VudC0+dXNlckV2ZW50cy0+b25OZXdVc2VyRXZlbnQoKTsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0ga0V2ZW50TGF5b3V0TmV4dCkgeworICAgICAgICBlbWl0KGxheW91dENoYW5nZWQodHJ1ZSkpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrRXZlbnRMYXlvdXRQcmV2KSB7CisgICAgICAgIGVtaXQobGF5b3V0Q2hhbmdlZChmYWxzZSkpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X3JlbGVhc2VCaXRtYXAoU2tpblN1cmZhY2UqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICBpZiAobUJhY2tpbmdTdXJmYWNlID09IHMpIHsKKyAgICAgICAgbUJhY2tpbmdTdXJmYWNlID0gTlVMTDsKKyAgICB9CisgICAgZGVsZXRlIHMtPmJpdG1hcDsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfcmVxdWVzdENsb3NlKFFTZW1hcGhvcmUqIHNlbWFwaG9yZSkgeworICAgIGNyYXNoaGFuZGxlcl9leGl0bW9kZShfX0ZVTkNUSU9OX18pOworICAgIG1Db250YWluZXIuY2xvc2UoKTsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfcmVxdWVzdFVwZGF0ZShjb25zdCBRUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSkgeworICAgIGlmICghbUJhY2tpbmdTdXJmYWNlKQorICAgICAgICByZXR1cm47CisKKyAgICBRUmVjdCByKHJlY3QtPngoKSAqIG1CYWNraW5nU3VyZmFjZS0+dyAvIG1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfdywKKyAgICAgICAgICAgIHJlY3QtPnkoKSAqIG1CYWNraW5nU3VyZmFjZS0+aCAvIG1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfaCwKKyAgICAgICAgICAgIHJlY3QtPndpZHRoKCkgKiBtQmFja2luZ1N1cmZhY2UtPncgLyBtQmFja2luZ1N1cmZhY2UtPm9yaWdpbmFsX3csCisgICAgICAgICAgICByZWN0LT5oZWlnaHQoKSAqIG1CYWNraW5nU3VyZmFjZS0+aCAvIG1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfaCk7CisgICAgdXBkYXRlKHIpOworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zZXREZXZpY2VHZW9tZXRyeShjb25zdCBRUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICBtRGV2aWNlR2VvbWV0cnkgPQorICAgICAgICAgICAgUVJlY3QocmVjdC0+eCgpLCByZWN0LT55KCksIHJlY3QtPndpZHRoKCksIHJlY3QtPmhlaWdodCgpKTsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc2V0V2luZG93UG9zKGludCB4LCBpbnQgeSwgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgbUNvbnRhaW5lci5tb3ZlKHgsIHkpOworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zZXRXaW5kb3dJY29uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSkgeworICAgIFFQaXhtYXAgaW1hZ2U7CisgICAgaW1hZ2UubG9hZEZyb21EYXRhKGRhdGEsIHNpemUpOworICAgIFFJY29uIGljb24oaW1hZ2UpOworICAgIFFBcHBsaWNhdGlvbjo6c2V0V2luZG93SWNvbihpY29uKTsKKyAgICBpZiAoc2VtYXBob3JlICE9IE5VTEwpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3Rfc2V0V2luZG93VGl0bGUoY29uc3QgUVN0cmluZyogdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlKSB7CisgICAgbUNvbnRhaW5lci5zZXRXaW5kb3dUaXRsZSgqdGl0bGUpOworCisgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHdlIGtub3cgdGhlIGFuZHJvaWRfc2VyaWFsX251bWJlcl9wb3J0CisgICAgLy8gaGFzIGJlZW4gc2V0LiBUaGlzIHBvcnQgZW5zdXJlcyBBZGJJbnRlcmZhY2UgY2FuIGlkZW50aWZ5IHRoZSBjb3JyZWN0CisgICAgLy8gZGV2aWNlIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUuCisgICAgbUFkYkludGVyZmFjZS0+c2V0U2VyaWFsTnVtYmVyUG9ydChhbmRyb2lkX3NlcmlhbF9udW1iZXJfcG9ydCk7CisgICAgaWYgKHNlbWFwaG9yZSAhPSBOVUxMKQorICAgICAgICBzZW1hcGhvcmUtPnJlbGVhc2UoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X3Nob3dXaW5kb3coU2tpblN1cmZhY2UqIHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSkgeworICAgIG1CYWNraW5nU3VyZmFjZSA9IHN1cmZhY2U7CisKKyAgICBzaG93Tm9ybWFsKCk7CisgICAgc2V0Rml4ZWRTaXplKHJlY3QtPnNpemUoKSk7CisKKyAgICAvLyBJZiB0aGlzIHdhcyB0aGUgcmVzdWx0IG9mIGEgem9vbSwgZG9uJ3QgY2hhbmdlIHRoZSBvdmVyYWxsIHdpbmRvdyBzaXplLAorICAgIC8vIGFuZCBhZGp1c3QgdGhlCisgICAgLy8gc2Nyb2xsIGJhcnMgdG8gcmVmbGVjdCB0aGUgZGVzaXJlZCBmb2N1cyBwb2ludC4KKyAgICBpZiAobUluWm9vbU1vZGUgJiYgbU5leHRJc1pvb20pIHsKKyAgICAgICAgbUNvbnRhaW5lci5zdG9wUmVzaXplVGltZXIoKTsKKyAgICAgICAgcmVjZW50ZXJGb2N1c1BvaW50KCk7CisgICAgfSBlbHNlIGlmICghbU5leHRJc1pvb20pIHsKKyAgICAgICAgbUNvbnRhaW5lci5yZXNpemUocmVjdC0+c2l6ZSgpKTsKKyAgICB9CisgICAgbU5leHRJc1pvb20gPSBmYWxzZTsKKworICAgIHNob3coKTsKKworICAgIC8vIFpvb21pbmcgZm9yY2VzIHRoZSBzY3JvbGwgYmFyIHRvIGJlIHZpc2libGUgZm9yIHNpemluZyBwdXJwb3Nlcy4gVGhleQorICAgIC8vIHNob3VsZCBuZXZlciBiZSBzaG93biB3aGVuIG5vdCBpbiB6b29tIG1vZGUsIGFuZCBzaG91bGQgb25seSBzaG93IHdoZW4KKyAgICAvLyBuZWNlc3Nhcnkgd2hlbiBpbiB6b29tIG1vZGUuCisgICAgaWYgKG1Jblpvb21Nb2RlKSB7CisgICAgICAgIG1Db250YWluZXIuc2V0SG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQXNOZWVkZWQpOworICAgICAgICBtQ29udGFpbmVyLnNldFZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5KFF0OjpTY3JvbGxCYXJBc05lZWRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvbnRhaW5lci5zZXRIb3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5KFF0OjpTY3JvbGxCYXJBbHdheXNPZmYpOworICAgICAgICBtQ29udGFpbmVyLnNldFZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5KFF0OjpTY3JvbGxCYXJBbHdheXNPZmYpOworICAgIH0KKworICAgIC8vIElmIHRoZSB1c2VyIGlzbid0IHVzaW5nIGFuIHg4NiBBVkQsIG1ha2Ugc3VyZSBpdHMgYmVjYXVzZSB0aGVpciBtYWNoaW5lCisgICAgLy8gZG9lc24ndCBzdXBwb3J0CisgICAgLy8gQ1BVIGFjY2VsZXJhdGlvbi4gSWYgaXQgZG9lcywgcmVjb21tZW5kIHN3aXRjaGluZyB0byBhbiB4ODYgQVZELgorICAgIC8vIFRoaXMgY2Fubm90IGJlIGRvbmUgb24gdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgd2luZG93IHNpbmNlIHRoZSBRdCBVSQorICAgIC8vIHRocmVhZCBoYXMgbm90IGJlZW4KKyAgICAvLyBwcm9wZXJseSBpbml0aWFsaXplZCB5ZXQuCisgICAgaWYgKG1GaXJzdFNob3dFdmVudCkgeworICAgICAgICBzaG93QXZkQXJjaFdhcm5pbmcoKTsKKyAgICAgICAgc2hvd0dwdVdhcm5pbmcoKTsKKyAgICAgICAgY2hlY2tBZGJWZXJzaW9uQW5kV2FybigpOworICAgIH0KKyAgICBtRmlyc3RTaG93RXZlbnQgPSBmYWxzZTsKKworICAgIGlmIChzZW1hcGhvcmUgIT0gTlVMTCkKKyAgICAgICAgc2VtYXBob3JlLT5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zY3JlZW5DaGFuZ2VkKCkgeworICAgIHF1ZXVlU2tpbkV2ZW50KGNyZWF0ZVNraW5FdmVudChrRXZlbnRTY3JlZW5DaGFuZ2VkKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9ob3Jpem9udGFsU2Nyb2xsQ2hhbmdlZChpbnQgdmFsdWUpIHsKKyAgICBzaW11bGF0ZVNjcm9sbEJhckNoYW5nZWQodmFsdWUsIG1Db250YWluZXIudmVydGljYWxTY3JvbGxCYXIoKS0+dmFsdWUoKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF92ZXJ0aWNhbFNjcm9sbENoYW5nZWQoaW50IHZhbHVlKSB7CisgICAgc2ltdWxhdGVTY3JvbGxCYXJDaGFuZ2VkKG1Db250YWluZXIuaG9yaXpvbnRhbFNjcm9sbEJhcigpLT52YWx1ZSgpLCB2YWx1ZSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9zY3JvbGxSYW5nZUNoYW5nZWQoaW50IG1pbiwgaW50IG1heCkgeworICAgIHNpbXVsYXRlU2Nyb2xsQmFyQ2hhbmdlZChtQ29udGFpbmVyLmhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRhaW5lci52ZXJ0aWNhbFNjcm9sbEJhcigpLT52YWx1ZSgpKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzY3JlZW5zaG90KCkgeworICAgIHN0YXRpYyBjb25zdCBpbnQgTUlOX1NDUkVFTlNIT1RfQVBJID0gMTQ7CisgICAgaWYgKGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYW5kcm9pZF9hdmRJbmZvKSA8IE1JTl9TQ1JFRU5TSE9UX0FQSSkgeworICAgICAgICBzaG93RXJyb3JEaWFsb2codHIoIlNjcmVlbnNob3QgaXMgbm90IHN1cHBvcnRlZCBiZWxvdyBBUEkgMTQuIiksCisgICAgICAgICAgICAgICAgICAgICAgICB0cigiU2NyZWVuc2hvdCIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFTdHJpbmcgc2F2ZVBhdGggPSBnZXRTY3JlZW5zaG90U2F2ZURpcmVjdG9yeSgpOworICAgIGlmIChzYXZlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHRyKCJUaGUgc2NyZWVuc2hvdCBzYXZlIGxvY2F0aW9uIGlzIGludmFsaWQuPGJyLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgdGhlIHNldHRpbmdzIHBhZ2UgYW5kIGVuc3VyZSB0aGUgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGlzdHMgYW5kIGlzIHdyaXRlYWJsZS4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyKCJTY3JlZW5zaG90IikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNjcmVlbkNhcHR1cmVyLmNhcHR1cmUoc2F2ZVBhdGgudG9TdGRTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpc10oU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW11bGF0b3JRdFdpbmRvdzo6c2NyZWVuc2hvdERvbmUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIERpc3BsYXkgdGhlIGZsYXNoIGFuaW1hdGlvbiBpbW1lZGlhdGVseSBhcyBmZWVkYmFjayAtIGlmIGl0IGZhaWxzLCBhbgorICAgIC8vIGVycm9yIGRpYWxvZyB3aWxsIGluZGljYXRlIGFzIHN1Y2guCisgICAgbU92ZXJsYXkuc2hvd0FzRmxhc2goKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzY3JlZW5zaG90RG9uZShTY3JlZW5DYXB0dXJlcjo6UmVzdWx0IHJlc3VsdCkgeworICAgIFFTdHJpbmcgbXNnOworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBTY3JlZW5DYXB0dXJlcjo6UmVzdWx0OjprT3BlcmF0aW9uSW5Qcm9ncmVzczoKKyAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIHRyKCJBbm90aGVyIHNjcmVlbiBjYXB0dXJlIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuPGJyLz4iCisgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2NyZWVuQ2FwdHVyZXI6OlJlc3VsdDo6a0NhcHR1cmVGYWlsZWQ6CisgICAgICAgICAgICBtc2cgPQorICAgICAgICAgICAgICAgICAgICB0cigiVGhlIHNjcmVlbnNob3QgY291bGQgbm90IGJlIGNhcHR1cmVkLjxici8+IgorICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgc2V0dGluZ3MgdG8gdmVyaWZ5IHRoYXQgeW91ciBjaG9zZW4gYWRiIHBhdGggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAidmFsaWQuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JlZW5DYXB0dXJlcjo6UmVzdWx0OjprU2F2ZUxvY2F0aW9uSW52YWxpZDoKKyAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIHRyKCJUaGUgc2NyZWVuc2hvdCBzYXZlIGxvY2F0aW9uIGlzIGludmFsaWQuPGJyLz4iCisgICAgICAgICAgICAgICAgICAgICAgICJDaGVjayB0aGUgc2V0dGluZ3MgcGFnZSBhbmQgZW5zdXJlIHRoZSBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3RzIGFuZCBpcyB3cml0ZWFibGUuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTY3JlZW5DYXB0dXJlcjo6UmVzdWx0OjprUHVsbEZhaWxlZDoKKyAgICAgICAgICAgIG1zZyA9IHRyKCJUaGUgc2NyZWVuc2hvdCBjb3VsZCBub3QgYmUgbG9hZGVkIGZyb20gdGhlIGRldmljZS4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgdHIoIlRoZXJlIHdhcyBhbiB1bmtub3duIGVycm9yIHdoaWxlIGNhcHR1cmluZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAic2NyZWVuc2hvdC4iKTsKKyAgICB9CisgICAgc2hvd0Vycm9yRGlhbG9nKG1zZywgdHIoIlNjcmVlbnNob3QiKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9pbnN0YWxsQ2FuY2VsZWQoKSB7CisgICAgaWYgKG1BcGtJbnN0YWxsQ29tbWFuZCAmJiBtQXBrSW5zdGFsbENvbW1hbmQtPmluRmxpZ2h0KCkpIHsKKyAgICAgICAgbUFwa0luc3RhbGxDb21tYW5kLT5jYW5jZWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6cnVuQWRiSW5zdGFsbChjb25zdCBRU3RyaW5nJiBwYXRoKSB7CisgICAgaWYgKG1BcGtJbnN0YWxsQ29tbWFuZCAmJiBtQXBrSW5zdGFsbENvbW1hbmQtPmluRmxpZ2h0KCkpIHsKKyAgICAgICAgLy8gTW9kYWwgZGlhbG9ncyBzaG91bGQgcHJldmVudCB0aGlzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2hvdyBhIGRpYWxvZyBzbyB0aGUgdXNlciBrbm93cyBzb21ldGhpbmcgaXMgaGFwcGVuaW5nCisgICAgbUluc3RhbGxEaWFsb2cuc2hvdygpOworCisgICAgbUFwa0luc3RhbGxDb21tYW5kID0gbUFwa0luc3RhbGxlci5pbnN0YWxsKAorICAgICAgICAgICAgcGF0aC50b1N0ZFN0cmluZygpLAorICAgICAgICAgICAgW3RoaXNdKEFwa0luc3RhbGxlcjo6UmVzdWx0IHJlc3VsdCwgU3RyaW5nVmlldyBlcnJvclN0cmluZykgeworICAgICAgICAgICAgICAgIGluc3RhbGxEb25lKHJlc3VsdCwgZXJyb3JTdHJpbmcpOworICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6aW5zdGFsbERvbmUoQXBrSW5zdGFsbGVyOjpSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWaWV3IGVycm9yU3RyaW5nKSB7CisgICAgbUluc3RhbGxEaWFsb2cuaGlkZSgpOworCisgICAgUVN0cmluZyBtc2c7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBBcGtJbnN0YWxsZXI6OlJlc3VsdDo6a1N1Y2Nlc3M6CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBBcGtJbnN0YWxsZXI6OlJlc3VsdDo6a09wZXJhdGlvbkluUHJvZ3Jlc3M6CisgICAgICAgICAgICBtc2cgPQorICAgICAgICAgICAgICAgICAgICB0cigiQW5vdGhlciBBUEsgaW5zdGFsbCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLjxici8+IgorICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHRyeSBhZ2FpbiBhZnRlciBpdCBjb21wbGV0ZXMuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFwa0luc3RhbGxlcjo6UmVzdWx0OjprQXBrUGVybWlzc2lvbnNFcnJvcjoKKyAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIHRyKCJVbmFibGUgdG8gcmVhZCB0aGUgZ2l2ZW4gQVBLLjxici8+IgorICAgICAgICAgICAgICAgICAgICAgICAiRW5zdXJlIHRoYXQgdGhlIGZpbGUgaXMgcmVhZGFibGUuIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFwa0luc3RhbGxlcjo6UmVzdWx0OjprQWRiQ29ubmVjdGlvbkZhaWxlZDoKKyAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgIHRyKCJGYWlsZWQgdG8gc3RhcnQgYWRiLjxici8+IgorICAgICAgICAgICAgICAgICAgICAgICAiQ2hlY2sgc2V0dGluZ3MgdG8gdmVyaWZ5IHlvdXIgY2hvc2VuIGFkYiBwYXRoIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkLiIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBcGtJbnN0YWxsZXI6OlJlc3VsdDo6a0luc3RhbGxGYWlsZWQ6CisgICAgICAgICAgICBtc2cgPSB0cigiVGhlIEFQSyBmYWlsZWQgdG8gaW5zdGFsbC48YnIvPiBFcnJvcjogJTEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKGVycm9yU3RyaW5nLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1zZyA9IHRyKCJUaGVyZSB3YXMgYW4gdW5rbm93biBlcnJvciB3aGlsZSBpbnN0YWxsaW5nIHRoZSBBUEsuIik7CisgICAgfQorCisgICAgc2hvd0Vycm9yRGlhbG9nKG1zZywgdHIoIkFQSyBJbnN0YWxsZXIiKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6cnVuQWRiUHVzaChjb25zdCBRTGlzdDxRVXJsPiYgdXJscykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiBmaWxlX3BhdGhzOworICAgIFN0cmluZ1ZpZXcgcmVtb3RlRG93bmxvYWRzRGlyID0gYXZkSW5mb19nZXRBcGlMZXZlbChhbmRyb2lkX2F2ZEluZm8pID4gMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBrUmVtb3RlRG93bmxvYWRzRGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1JlbW90ZURvd25sb2Fkc0RpckFwaTEwOworICAgIGZvciAoY29uc3QgYXV0byYgdXJsIDogdXJscykgeworICAgICAgICBzdHJpbmcgcmVtb3RlRmlsZSA9IFBhdGhVdGlsczo6am9pbihyZW1vdGVEb3dubG9hZHNEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybC5maWxlTmFtZSgpLnRvU3RkU3RyaW5nKCkpOworICAgICAgICBmaWxlX3BhdGhzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcih1cmwudG9Mb2NhbEZpbGUoKS50b1N0ZFN0cmluZygpLCByZW1vdGVGaWxlKSk7CisgICAgfQorCisgICAgbUZpbGVQdXNoZXIucHVzaEZpbGVzKGZpbGVfcGF0aHMuYmVnaW4oKSwgZmlsZV9wYXRocy5lbmQoKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2xvdF9hZGJQdXNoQ2FuY2VsZWQoKSB7CisgICAgbUZpbGVQdXNoZXIuY2FuY2VsKCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6YWRiUHVzaFByb2dyZXNzKGRvdWJsZSBwcm9ncmVzcywgYm9vbCBkb25lKSB7CisgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgbVB1c2hEaWFsb2cuaGlkZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVB1c2hEaWFsb2cuc2V0VmFsdWUocHJvZ3Jlc3MgKiBrUHVzaFByb2dyZXNzQmFyTWF4KTsKKyAgICBtUHVzaERpYWxvZy5zaG93KCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6YWRiUHVzaERvbmUoU3RyaW5nVmlldyBmaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVB1c2hlcjo6UmVzdWx0IHJlc3VsdCkgeworICAgIFFTdHJpbmcgbXNnOworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgRmlsZVB1c2hlcjo6UmVzdWx0OjpTdWNjZXNzOgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIEZpbGVQdXNoZXI6OlJlc3VsdDo6UHJvY2Vzc1N0YXJ0RmFpbHVyZToKKyAgICAgICAgICAgIG1zZyA9IHRyKCJDb3VsZCBub3QgbGF1bmNoIHByb2Nlc3MgdG8gY29weSAlMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmcoZmlsZVBhdGguY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWxlUHVzaGVyOjpSZXN1bHQ6OkZpbGVSZWFkRXJyb3I6CisgICAgICAgICAgICBtc2cgPSB0cigiQ291bGQgbm90IGxvY2F0ZSAlMSIpLmFyZyhmaWxlUGF0aC5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpbGVQdXNoZXI6OlJlc3VsdDo6QWRiUHVzaEZhaWx1cmU6CisgICAgICAgICAgICBtc2cgPSB0cigiJ2FkYiBwdXNoJyBmYWlsZWQgZm9yICUxIikuYXJnKGZpbGVQYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtc2cgPSB0cigiQ291bGQgbm90IGNvcHkgJTEiKS5hcmcoZmlsZVBhdGguY19zdHIoKSk7CisgICAgfQorICAgIHNob3dFcnJvckRpYWxvZyhtc2csIHRyKCJGaWxlIENvcHkiKSk7Cit9CisKKy8vIENvbnZlcnQgYSBRdDo6S2V5X1hYWCBjb2RlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgTGludXgga2V5Y29kZSB2YWx1ZS4KKy8vIE9uIGZhaWx1cmUsIHJldHVybiAtMS4KK3N0YXRpYyBpbnQgY29udmVydEtleUNvZGUoaW50IHN5bSkgeworI2RlZmluZSBLSyh4LCB5KSBcCisgICAgeyBRdDo6S2V5XyMjeCwgS0VZXyMjeSB9CisjZGVmaW5lIEsxKHgpIEtLKHgsIHgpCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGludCBxdF9zeW07CisgICAgICAgIGludCBrZXljb2RlOworICAgIH0ga0NvbnZlcnRbXSA9IHsKKyAgICAgICAgICAgIEtLKExlZnQsIExFRlQpLAorICAgICAgICAgICAgS0soUmlnaHQsIFJJR0hUKSwKKyAgICAgICAgICAgIEtLKFVwLCBVUCksCisgICAgICAgICAgICBLSyhEb3duLCBET1dOKSwKKyAgICAgICAgICAgIEsxKDApLAorICAgICAgICAgICAgSzEoMSksCisgICAgICAgICAgICBLMSgyKSwKKyAgICAgICAgICAgIEsxKDMpLAorICAgICAgICAgICAgSzEoNCksCisgICAgICAgICAgICBLMSg1KSwKKyAgICAgICAgICAgIEsxKDYpLAorICAgICAgICAgICAgSzEoNyksCisgICAgICAgICAgICBLMSg4KSwKKyAgICAgICAgICAgIEsxKDkpLAorICAgICAgICAgICAgSzEoRjEpLAorICAgICAgICAgICAgSzEoRjIpLAorICAgICAgICAgICAgSzEoRjMpLAorICAgICAgICAgICAgSzEoRjQpLAorICAgICAgICAgICAgSzEoRjUpLAorICAgICAgICAgICAgSzEoRjYpLAorICAgICAgICAgICAgSzEoRjcpLAorICAgICAgICAgICAgSzEoRjgpLAorICAgICAgICAgICAgSzEoRjkpLAorICAgICAgICAgICAgSzEoRjEwKSwKKyAgICAgICAgICAgIEsxKEYxMSksCisgICAgICAgICAgICBLMShGMTIpLAorICAgICAgICAgICAgSzEoQSksCisgICAgICAgICAgICBLMShCKSwKKyAgICAgICAgICAgIEsxKEMpLAorICAgICAgICAgICAgSzEoRCksCisgICAgICAgICAgICBLMShFKSwKKyAgICAgICAgICAgIEsxKEYpLAorICAgICAgICAgICAgSzEoRyksCisgICAgICAgICAgICBLMShIKSwKKyAgICAgICAgICAgIEsxKEkpLAorICAgICAgICAgICAgSzEoSiksCisgICAgICAgICAgICBLMShLKSwKKyAgICAgICAgICAgIEsxKEwpLAorICAgICAgICAgICAgSzEoTSksCisgICAgICAgICAgICBLMShOKSwKKyAgICAgICAgICAgIEsxKE8pLAorICAgICAgICAgICAgSzEoUCksCisgICAgICAgICAgICBLMShRKSwKKyAgICAgICAgICAgIEsxKFIpLAorICAgICAgICAgICAgSzEoUyksCisgICAgICAgICAgICBLMShUKSwKKyAgICAgICAgICAgIEsxKFUpLAorICAgICAgICAgICAgSzEoViksCisgICAgICAgICAgICBLMShXKSwKKyAgICAgICAgICAgIEsxKFgpLAorICAgICAgICAgICAgSzEoWSksCisgICAgICAgICAgICBLMShaKSwKKyAgICAgICAgICAgIEtLKE1pbnVzLCBNSU5VUyksCisgICAgICAgICAgICBLSyhFcXVhbCwgRVFVQUwpLAorICAgICAgICAgICAgS0soQmFja3NwYWNlLCBCQUNLU1BBQ0UpLAorICAgICAgICAgICAgS0soSG9tZSwgSE9NRSksCisgICAgICAgICAgICBLSyhFc2NhcGUsIEVTQyksCisgICAgICAgICAgICBLSyhDb21tYSwgQ09NTUEpLAorICAgICAgICAgICAgS0soUGVyaW9kLCBET1QpLAorICAgICAgICAgICAgS0soU3BhY2UsIFNQQUNFKSwKKyAgICAgICAgICAgIEtLKFNsYXNoLCBTTEFTSCksCisgICAgICAgICAgICBLSyhSZXR1cm4sIEVOVEVSKSwKKyAgICAgICAgICAgIEtLKFRhYiwgVEFCKSwKKyAgICAgICAgICAgIEtLKEJyYWNrZXRMZWZ0LCBMRUZUQlJBQ0UpLAorICAgICAgICAgICAgS0soQnJhY2tldFJpZ2h0LCBSSUdIVEJSQUNFKSwKKyAgICAgICAgICAgIEtLKEJhY2tzbGFzaCwgQkFDS1NMQVNIKSwKKyAgICAgICAgICAgIEtLKFNlbWljb2xvbiwgU0VNSUNPTE9OKSwKKyAgICAgICAgICAgIEtLKEFwb3N0cm9waGUsIEFQT1NUUk9QSEUpLAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtDb252ZXJ0U2l6ZSA9IHNpemVvZihrQ29udmVydCkgLyBzaXplb2Yoa0NvbnZlcnRbMF0pOworICAgIHNpemVfdCBubjsKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBrQ29udmVydFNpemU7ICsrbm4pIHsKKyAgICAgICAgaWYgKHN5bSA9PSBrQ29udmVydFtubl0ucXRfc3ltKSB7CisgICAgICAgICAgICByZXR1cm4ga0NvbnZlcnRbbm5dLmtleWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitTa2luRXZlbnQqIEVtdWxhdG9yUXRXaW5kb3c6OmNyZWF0ZVNraW5FdmVudChTa2luRXZlbnRUeXBlIHR5cGUpIHsKKyAgICBTa2luRXZlbnQqIHNraW5fZXZlbnQgPSBuZXcgU2tpbkV2ZW50KCk7CisgICAgc2tpbl9ldmVudC0+dHlwZSA9IHR5cGU7CisgICAgcmV0dXJuIHNraW5fZXZlbnQ7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6ZG9SZXNpemUoY29uc3QgUVNpemUmIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNLYmRTaG9ydGN1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmbGlwRGltZW5zaW9ucykgeworICAgIGlmICghbUJhY2tpbmdTdXJmYWNlKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgb3JpZ2luYWxXaWR0aCA9IGZsaXBEaW1lbnNpb25zID8gbUJhY2tpbmdTdXJmYWNlLT5vcmlnaW5hbF9oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfdzsKKyAgICBpbnQgb3JpZ2luYWxIZWlnaHQgPSBmbGlwRGltZW5zaW9ucyA/IG1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUJhY2tpbmdTdXJmYWNlLT5vcmlnaW5hbF9oOworCisgICAgUVNpemUgbmV3U2l6ZShvcmlnaW5hbFdpZHRoLCBvcmlnaW5hbEhlaWdodCk7CisgICAgbmV3U2l6ZS5zY2FsZShzaXplLCBRdDo6S2VlcEFzcGVjdFJhdGlvKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbmV3IHNpemUgaXMgYWx3YXlzIGEgbGl0dGxlIGJpdCBzbWFsbGVyIHRoYW4gdGhlCisgICAgLy8gc2NyZWVuIHRvIHByZXZlbnQga2V5Ym9hcmQgc2hvcnRjdXQgc2NhbGluZyBmcm9tIG1ha2luZyBhIHdpbmRvdworICAgIC8vIHRvbyBsYXJnZSBmb3IgdGhlIHNjcmVlbiwgd2hpY2ggY2FuIHJlc3VsdCBpbiB0aGUgc2hvd2luZyBvZiB0aGUKKyAgICAvLyBzY3JvbGwgYmFycy4gVGhpcyBpcyBub3QgYW4gaXNzdWUgd2hlbiByZXNpemluZyBieSBkcmFnZ2luZyB0aGUKKyAgICAvLyBjb3JuZXIgYmVjYXVzZSB0aGUgT1Mgd2lsbCBwcmV2ZW50IHRvbyBsYXJnZSBhIHdpbmRvdy4KKyAgICBpZiAoaXNLYmRTaG9ydGN1dCkgeworICAgICAgICBRUmVjdCBzY3JlZW5EaW1lbnNpb25zOworICAgICAgICBzbG90X2dldFNjcmVlbkRpbWVuc2lvbnMoJnNjcmVlbkRpbWVuc2lvbnMpOworCisgICAgICAgIGlmIChuZXdTaXplLndpZHRoKCkgPiBzY3JlZW5EaW1lbnNpb25zLndpZHRoKCkgfHwKKyAgICAgICAgICAgIG5ld1NpemUuaGVpZ2h0KCkgPiBzY3JlZW5EaW1lbnNpb25zLmhlaWdodCgpKSB7CisgICAgICAgICAgICBuZXdTaXplLnNjYWxlKHNjcmVlbkRpbWVuc2lvbnMuc2l6ZSgpLCBRdDo6S2VlcEFzcGVjdFJhdGlvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvdWJsZSB3aWR0aFNjYWxlID0gKGRvdWJsZSluZXdTaXplLndpZHRoKCkgLyAoZG91YmxlKW9yaWdpbmFsV2lkdGg7CisgICAgZG91YmxlIGhlaWdodFNjYWxlID0gKGRvdWJsZSluZXdTaXplLmhlaWdodCgpIC8gKGRvdWJsZSlvcmlnaW5hbEhlaWdodDsKKworICAgIHNpbXVsYXRlU2V0U2NhbGUoc3RkOjptYXgoLjIsIHN0ZDo6bWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKSkpOworfQorCitTa2luTW91c2VCdXR0b25UeXBlIEVtdWxhdG9yUXRXaW5kb3c6OmdldFNraW5Nb3VzZUJ1dHRvbigKKyAgICAgICAgUU1vdXNlRXZlbnQqIGV2ZW50KSBjb25zdCB7CisgICAgcmV0dXJuIChldmVudC0+YnV0dG9uKCkgPT0gUXQ6OlJpZ2h0QnV0dG9uKSA/IGtNb3VzZUJ1dHRvblJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNb3VzZUJ1dHRvbkxlZnQ7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6aGFuZGxlTW91c2VFdmVudChTa2luRXZlbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpbk1vdXNlQnV0dG9uVHlwZSBidXR0b24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVBvaW50JiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwU3luYykgeworICAgIFNraW5FdmVudCogc2tpbl9ldmVudCA9IGNyZWF0ZVNraW5FdmVudCh0eXBlKTsKKyAgICBza2luX2V2ZW50LT51Lm1vdXNlLmJ1dHRvbiA9IGJ1dHRvbjsKKyAgICBza2luX2V2ZW50LT51Lm1vdXNlLnNraXBfc3luYyA9IHNraXBTeW5jOworICAgIHNraW5fZXZlbnQtPnUubW91c2UueCA9IHBvcy54KCk7CisgICAgc2tpbl9ldmVudC0+dS5tb3VzZS55ID0gcG9zLnkoKTsKKworICAgIHNraW5fZXZlbnQtPnUubW91c2UueHJlbCA9IHBvcy54KCkgLSBtUHJldk1vdXNlUG9zaXRpb24ueCgpOworICAgIHNraW5fZXZlbnQtPnUubW91c2UueXJlbCA9IHBvcy55KCkgLSBtUHJldk1vdXNlUG9zaXRpb24ueSgpOworICAgIG1QcmV2TW91c2VQb3NpdGlvbiA9IHBvczsKKworICAgIHF1ZXVlU2tpbkV2ZW50KHNraW5fZXZlbnQpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OmZvcndhcmRLZXlFdmVudFRvRW11bGF0b3IoU2tpbkV2ZW50VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFLZXlFdmVudCogZXZlbnQpIHsKKyAgICBTa2luRXZlbnQqIHNraW5fZXZlbnQgPSBjcmVhdGVTa2luRXZlbnQodHlwZSk7CisgICAgU2tpbkV2ZW50S2V5RGF0YSYga2V5RGF0YSA9IHNraW5fZXZlbnQtPnUua2V5OworICAgIGtleURhdGEua2V5Y29kZSA9IGNvbnZlcnRLZXlDb2RlKGV2ZW50LT5rZXkoKSk7CisKKyAgICBRdDo6S2V5Ym9hcmRNb2RpZmllcnMgbW9kaWZpZXJzID0gZXZlbnQtPm1vZGlmaWVycygpOworICAgIGlmIChtb2RpZmllcnMgJiBRdDo6U2hpZnRNb2RpZmllcikKKyAgICAgICAga2V5RGF0YS5tb2QgfD0ga0tleU1vZExTaGlmdDsKKyAgICBpZiAobW9kaWZpZXJzICYgUXQ6OkNvbnRyb2xNb2RpZmllcikKKyAgICAgICAga2V5RGF0YS5tb2QgfD0ga0tleU1vZExDdHJsOworICAgIGlmIChtb2RpZmllcnMgJiBRdDo6QWx0TW9kaWZpZXIpCisgICAgICAgIGtleURhdGEubW9kIHw9IGtLZXlNb2RMQWx0OworCisgICAgcXVldWVTa2luRXZlbnQoc2tpbl9ldmVudCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6aGFuZGxlS2V5RXZlbnQoU2tpbkV2ZW50VHlwZSB0eXBlLCBRS2V5RXZlbnQqIGV2ZW50KSB7CisgICAgaWYgKCFtRm9yd2FyZFNob3J0Y3V0c1RvRGV2aWNlICYmIG1Jblpvb21Nb2RlKSB7CisgICAgICAgIGlmIChldmVudC0+a2V5KCkgPT0gUXQ6OktleV9Db250cm9sKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBrRXZlbnRLZXlVcCkgeworICAgICAgICAgICAgICAgIHJhaXNlKCk7CisgICAgICAgICAgICAgICAgbU92ZXJsYXkuc2hvd0Zvclpvb21Vc2VySGlkZGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1Gb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2UgJiYgIW1Jblpvb21Nb2RlICYmCisgICAgICAgIGV2ZW50LT5rZXkoKSA9PSBRdDo6S2V5X0NvbnRyb2wgJiYKKyAgICAgICAgZXZlbnQtPm1vZGlmaWVycygpID09IFF0OjpDb250cm9sTW9kaWZpZXIpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0ga0V2ZW50S2V5RG93bikgeworICAgICAgICAgICAgcmFpc2UoKTsKKyAgICAgICAgICAgIG1PdmVybGF5LnNob3dGb3JNdWx0aXRvdWNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUZvcndhcmRTaG9ydGN1dHNUb0RldmljZSB8fCAhbVRvb2xXaW5kb3ctPmhhbmRsZVF0S2V5RXZlbnQoZXZlbnQpKSB7CisgICAgICAgIGZvcndhcmRLZXlFdmVudFRvRW11bGF0b3IodHlwZSwgZXZlbnQpOworICAgICAgICBpZiAodHlwZSA9PSBrRXZlbnRLZXlEb3duICYmIGV2ZW50LT50ZXh0KCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBRdDo6S2V5Ym9hcmRNb2RpZmllcnMgbW9kcyA9IGV2ZW50LT5tb2RpZmllcnMoKTsKKyAgICAgICAgICAgIG1vZHMgJj0gfihRdDo6U2hpZnRNb2RpZmllciB8IFF0OjpLZXlwYWRNb2RpZmllcik7CisgICAgICAgICAgICBpZiAobW9kcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGtleSBldmVudCBnZW5lcmF0ZWQgdGV4dCB3aXRob3V0IEN0cmwsIEFsdCwgZXRjLgorICAgICAgICAgICAgICAgIC8vIFNlbmQgYW4gYWRkaXRpb25hbCBUZXh0SW5wdXQgZXZlbnQgdG8gdGhlIGVtdWxhdG9yLgorICAgICAgICAgICAgICAgIFNraW5FdmVudCogc2tpbl9ldmVudCA9IGNyZWF0ZVNraW5FdmVudChrRXZlbnRUZXh0SW5wdXQpOworICAgICAgICAgICAgICAgIHNraW5fZXZlbnQtPnUudGV4dC5kb3duID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciopc2tpbl9ldmVudC0+dS50ZXh0LnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZXZlbnQtPnRleHQoKS50b1V0ZjgoKS5jb25zdERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihza2luX2V2ZW50LT51LnRleHQudGV4dCkgLSAxKTsKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGV2ZW50J3MgdGV4dCBpcyAwLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICBza2luX2V2ZW50LT51LnRleHQudGV4dFtzaXplb2Yoc2tpbl9ldmVudC0+dS50ZXh0LnRleHQpIC0gMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgICAgICAgICAgICAgICBxdWV1ZVNraW5FdmVudChza2luX2V2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzaW11bGF0ZUtleVByZXNzKGludCBrZXlDb2RlLCBpbnQgbW9kaWZpZXJzKSB7CisgICAgU2tpbkV2ZW50KiBldmVudCA9IGNyZWF0ZVNraW5FdmVudChrRXZlbnRLZXlEb3duKTsKKyAgICBldmVudC0+dS5rZXkua2V5Y29kZSA9IGtleUNvZGU7CisgICAgZXZlbnQtPnUua2V5Lm1vZCA9IG1vZGlmaWVyczsKKyAgICBxdWV1ZVNraW5FdmVudChldmVudCk7CisKKyAgICBldmVudCA9IGNyZWF0ZVNraW5FdmVudChrRXZlbnRLZXlVcCk7CisgICAgZXZlbnQtPnUua2V5LmtleWNvZGUgPSBrZXlDb2RlOworICAgIGV2ZW50LT51LmtleS5tb2QgPSBtb2RpZmllcnM7CisgICAgcXVldWVTa2luRXZlbnQoZXZlbnQpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNpbXVsYXRlU2Nyb2xsQmFyQ2hhbmdlZChpbnQgeCwgaW50IHkpIHsKKyAgICBTa2luRXZlbnQqIGV2ZW50ID0gY3JlYXRlU2tpbkV2ZW50KGtFdmVudFNjcm9sbEJhckNoYW5nZWQpOworICAgIGV2ZW50LT51LnNjcm9sbC54ID0geDsKKyAgICBldmVudC0+dS5zY3JvbGwueG1heCA9IG1Db250YWluZXIuaG9yaXpvbnRhbFNjcm9sbEJhcigpLT5tYXhpbXVtKCk7CisgICAgZXZlbnQtPnUuc2Nyb2xsLnkgPSB5OworICAgIGV2ZW50LT51LnNjcm9sbC55bWF4ID0gbUNvbnRhaW5lci52ZXJ0aWNhbFNjcm9sbEJhcigpLT5tYXhpbXVtKCk7CisgICAgcXVldWVTa2luRXZlbnQoZXZlbnQpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNpbXVsYXRlU2V0U2NhbGUoZG91YmxlIHNjYWxlKSB7CisgICAgLy8gQXZvaWQgem9vbSBhbmQgc2NhbGUgZXZlbnRzIGNsb2JiZXJpbmcgZWFjaCBvdGhlciBpZiB0aGUgdXNlciByYXBpZGx5CisgICAgLy8gY2hhbmdlcyB6b29tIGxldmVscworICAgIGlmIChtSW5ab29tTW9kZSAmJiBtTmV4dElzWm9vbSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUmVzZXQgb3VyIGxvY2FsIGNvcHkgb2Ygem9vbSBmYWN0b3IKKyAgICBtWm9vbUZhY3RvciA9IDEuMDsKKworICAgIFNraW5FdmVudCogZXZlbnQgPSBjcmVhdGVTa2luRXZlbnQoa0V2ZW50U2V0U2NhbGUpOworICAgIGV2ZW50LT51LndpbmRvdy5zY2FsZSA9IHNjYWxlOworICAgIHF1ZXVlU2tpbkV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzaW11bGF0ZVNldFpvb20oZG91YmxlIHpvb20pIHsKKyAgICAvLyBBdm9pZCB6b29tIGFuZCBzY2FsZSBldmVudHMgY2xvYmJlcmluZyBlYWNoIG90aGVyIGlmIHRoZSB1c2VyIHJhcGlkbHkKKyAgICAvLyBjaGFuZ2VzIHpvb20gbGV2ZWxzCisgICAgaWYgKG1OZXh0SXNab29tIHx8IG1ab29tRmFjdG9yID09IHpvb20pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFF0IFdpZGdldHMgZG8gbm90IGdldCBwcm9wZXJseSBzaXplZCB1bmxlc3MgdGhleSBhcHBlYXIgYXQgbGVhc3Qgb25jZS4KKyAgICAvLyBUaGUKKyAgICAvLyBzY3JvbGwgYmFycworICAgIC8vICptdXN0KiBiZSBwcm9wZXJseSBzaXplZCBpbiBvcmRlciBmb3Igem9vbSB0byBjcmVhdGUgdGhlIGNvcnJlY3QgR0xFUworICAgIC8vIHN1YndpbmRvdywgc28gdGhpcworICAgIC8vIGVuc3VyZXMgdGhleSB3aWxsIGJlLiBUaGlzIGlzIHJlc2V0IGFzIHNvb24gYXMgdGhlIHdpbmRvdyBpcyBzaG93bi4KKyAgICBtQ29udGFpbmVyLnNldEhvcml6b250YWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFsd2F5c09uKTsKKyAgICBtQ29udGFpbmVyLnNldFZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5KFF0OjpTY3JvbGxCYXJBbHdheXNPbik7CisKKyAgICBtTmV4dElzWm9vbSA9IHRydWU7CisgICAgbVpvb21GYWN0b3IgPSB6b29tOworCisgICAgUVNpemUgdmlld3BvcnQgPSBtQ29udGFpbmVyLnZpZXdwb3J0U2l6ZSgpOworCisgICAgU2tpbkV2ZW50KiBldmVudCA9IGNyZWF0ZVNraW5FdmVudChrRXZlbnRTZXRab29tKTsKKyAgICBldmVudC0+dS53aW5kb3cueCA9IHZpZXdwb3J0LndpZHRoKCk7CisgICAgZXZlbnQtPnUud2luZG93LnkgPSB2aWV3cG9ydC5oZWlnaHQoKTsKKworICAgIFFTY3JvbGxCYXIqIGhvcml6b250YWwgPSBtQ29udGFpbmVyLmhvcml6b250YWxTY3JvbGxCYXIoKTsKKyAgICBldmVudC0+dS53aW5kb3cuc2Nyb2xsX2ggPQorICAgICAgICAgICAgaG9yaXpvbnRhbC0+aXNWaXNpYmxlKCkgPyBob3Jpem9udGFsLT5oZWlnaHQoKSA6IDA7CisgICAgZXZlbnQtPnUud2luZG93LnNjYWxlID0gem9vbTsKKyAgICBxdWV1ZVNraW5FdmVudChldmVudCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2ltdWxhdGVXaW5kb3dNb3ZlZChjb25zdCBRUG9pbnQmIHBvcykgeworICAgIFNraW5FdmVudCogZXZlbnQgPSBjcmVhdGVTa2luRXZlbnQoa0V2ZW50V2luZG93TW92ZWQpOworICAgIGV2ZW50LT51LndpbmRvdy54ID0gcG9zLngoKTsKKyAgICBldmVudC0+dS53aW5kb3cueSA9IHBvcy55KCk7CisgICAgcXVldWVTa2luRXZlbnQoZXZlbnQpOworCisgICAgbU92ZXJsYXkubW92ZShtQ29udGFpbmVyLm1hcFRvR2xvYmFsKFFQb2ludCgpKSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2ltdWxhdGVab29tZWRXaW5kb3dSZXNpemVkKGNvbnN0IFFTaXplJiBzaXplKSB7CisgICAgbU92ZXJsYXkucmVzaXplKHNpemUpOworICAgIGlmICghbUluWm9vbU1vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNraW5FdmVudCogZXZlbnQgPSBjcmVhdGVTa2luRXZlbnQoa0V2ZW50Wm9vbWVkV2luZG93UmVzaXplZCk7CisgICAgUVNjcm9sbEJhciogaG9yaXpvbnRhbCA9IG1Db250YWluZXIuaG9yaXpvbnRhbFNjcm9sbEJhcigpOworICAgIGV2ZW50LT51LnNjcm9sbC54ID0gaG9yaXpvbnRhbC0+dmFsdWUoKTsKKyAgICBldmVudC0+dS5zY3JvbGwueSA9IG1Db250YWluZXIudmVydGljYWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKKyAgICBldmVudC0+dS5zY3JvbGwueG1heCA9IHNpemUud2lkdGgoKTsKKyAgICBldmVudC0+dS5zY3JvbGwueW1heCA9IHNpemUuaGVpZ2h0KCk7CisgICAgZXZlbnQtPnUuc2Nyb2xsLnNjcm9sbF9oID0KKyAgICAgICAgICAgIGhvcml6b250YWwtPmlzVmlzaWJsZSgpID8gaG9yaXpvbnRhbC0+aGVpZ2h0KCkgOiAwOworICAgIHF1ZXVlU2tpbkV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzZXRGb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2UoaW50IGluZGV4KSB7CisgICAgbUZvcndhcmRTaG9ydGN1dHNUb0RldmljZSA9IChpbmRleCAhPSAwKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpzbG90X3J1bk9uVWlUaHJlYWQoU2tpbkdlbmVyaWNGdW5jdGlvbiogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUpIHsKKyAgICAoKmYpKGRhdGEpOworICAgIGlmIChzZW1hcGhvcmUpCisgICAgICAgIHNlbWFwaG9yZS0+cmVsZWFzZSgpOworfQorCitib29sIEVtdWxhdG9yUXRXaW5kb3c6OmlzSW5ab29tTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluWm9vbU1vZGU7Cit9CisKK1Rvb2xXaW5kb3cqIEVtdWxhdG9yUXRXaW5kb3c6OnRvb2xXaW5kb3coKSBjb25zdCB7CisgICAgcmV0dXJuIG1Ub29sV2luZG93OworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNob3dab29tSWZOb3RVc2VySGlkZGVuKCkgeworICAgIGlmICghbU92ZXJsYXkud2FzWm9vbVVzZXJIaWRkZW4oKSkgeworICAgICAgICBtT3ZlcmxheS5zaG93Rm9yWm9vbSgpOworICAgIH0KK30KKworUVNpemUgRW11bGF0b3JRdFdpbmRvdzo6Y29udGFpbmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNvbnRhaW5lci5zaXplKCk7Cit9CisKK1FSZWN0IEVtdWxhdG9yUXRXaW5kb3c6OmRldmljZUdlb21ldHJ5KCkgY29uc3QgeworICAgIHJldHVybiBtRGV2aWNlR2VvbWV0cnk7Cit9CisKK2FuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlKiBFbXVsYXRvclF0V2luZG93OjpnZXRBZGJJbnRlcmZhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BZGJJbnRlcmZhY2UuZ2V0KCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6dG9nZ2xlWm9vbU1vZGUoKSB7CisgICAgbUluWm9vbU1vZGUgPSAhbUluWm9vbU1vZGU7CisKKyAgICAvLyBFeGl0aW5nIHpvb20gbW9kZSBzbmFwcyBiYWNrIHRvIGFzcGVjdCByYXRpbworICAgIGlmICghbUluWm9vbU1vZGUpIHsKKyAgICAgICAgLy8gU2Nyb2xsIGJhcnMgc2hvdWxkIGJlIHR1cm5lZCBvZmYgaW1tZWRpYXRlbHkuCisgICAgICAgIG1Db250YWluZXIuc2V0SG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKKyAgICAgICAgbUNvbnRhaW5lci5zZXRWZXJ0aWNhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKKworICAgICAgICBkb1Jlc2l6ZShtQ29udGFpbmVyLnNpemUoKSk7CisgICAgICAgIG1PdmVybGF5LmhpZGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT3ZlcmxheS5zaG93Rm9yWm9vbSgpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpyZWNlbnRlckZvY3VzUG9pbnQoKSB7CisgICAgbUNvbnRhaW5lci5ob3Jpem9udGFsU2Nyb2xsQmFyKCktPnNldFZhbHVlKG1Gb2N1cy54KCkgKiB3aWR0aCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZXdwb3J0Rm9jdXMueCgpKTsKKyAgICBtQ29udGFpbmVyLnZlcnRpY2FsU2Nyb2xsQmFyKCktPnNldFZhbHVlKG1Gb2N1cy55KCkgKiBoZWlnaHQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlld3BvcnRGb2N1cy55KCkpOworCisgICAgbUZvY3VzID0gUVBvaW50RigpOworICAgIG1WaWV3cG9ydEZvY3VzID0gUVBvaW50KCk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2F2ZVpvb21Qb2ludHMoY29uc3QgUVBvaW50JiBmb2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVBvaW50JiB2aWV3cG9ydEZvY3VzKSB7CisgICAgLy8gVGhlIHVuZGVybHlpbmcgZnJhbWUgd2lsbCBjaGFuZ2Ugc2l6ZXMsIHNvIGdldCB3aGF0ICJwZXJjZW50YWdlIiBvZiB0aGUKKyAgICAvLyBmcmFtZSB3YXMKKyAgICAvLyBjbGlja2VkLCB3aGVyZSAoMCwwKSBpcyB0aGUgdG9wLWxlZnQgY29ybmVyIGFuZCAoMSwxKSBpcyB0aGUgYm90dG9tIHJpZ2h0CisgICAgLy8gY29ybmVyLgorICAgIG1Gb2N1cyA9IFFQb2ludEYoKGZsb2F0KWZvY3VzLngoKSAvIHRoaXMtPndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZm9jdXMueSgpIC8gdGhpcy0+aGVpZ2h0KCkpOworCisgICAgLy8gU2F2ZSB0byByZS1hbGlnbiB0aGUgY29udGFpbmVyIHdpdGggdGhlIHVuZGVybHlpbmcgZnJhbWUuCisgICAgbVZpZXdwb3J0Rm9jdXMgPSB2aWV3cG9ydEZvY3VzOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNjYWxlRG93bigpIHsKKyAgICBkb1Jlc2l6ZShtQ29udGFpbmVyLnNpemUoKSAvIDEuMSwgdHJ1ZSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6c2NhbGVVcCgpIHsKKyAgICBkb1Jlc2l6ZShtQ29udGFpbmVyLnNpemUoKSAqIDEuMSwgdHJ1ZSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6em9vbUluKCkgeworICAgIHpvb21JbihRUG9pbnQod2lkdGgoKSAvIDIsIGhlaWdodCgpIC8gMiksCisgICAgICAgICAgIFFQb2ludChtQ29udGFpbmVyLndpZHRoKCkgLyAyLCBtQ29udGFpbmVyLmhlaWdodCgpIC8gMikpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6Onpvb21Jbihjb25zdCBRUG9pbnQmIGZvY3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVBvaW50JiB2aWV3cG9ydEZvY3VzKSB7CisgICAgaWYgKCFtQmFja2luZ1N1cmZhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIHNhdmVab29tUG9pbnRzKGZvY3VzLCB2aWV3cG9ydEZvY3VzKTsKKworICAgIC8vIFRoZSBiZWxvdyBzY2FsZSA9IHggY3JlYXRlcyBhIHNraW4gZXF1aXZhbGVudCB0byBjYWxsaW5nICJ3aW5kb3cKKyAgICAvLyBzY2FsZSB4IiB0aHJvdWdoIHRoZSBlbXVsYXRvciBjb25zb2xlLiBBdCBzY2FsZSA9IDEsIHRoZSBkZXZpY2UKKyAgICAvLyBzaG91bGQgYmUgYXQgYSAxOjEgcGl4ZWwgbWFwcGluZyB3aXRoIHRoZSBtb25pdG9yLiBXZSBhbGxvdyBnb2luZworICAgIC8vIHRvIHR3aWNlIHRoaXMgc2l6ZS4KKyAgICBkb3VibGUgc2NhbGUgPQorICAgICAgICAgICAgKChkb3VibGUpc2l6ZSgpLndpZHRoKCkgLyAoZG91YmxlKW1CYWNraW5nU3VyZmFjZS0+b3JpZ2luYWxfdyk7CisgICAgZG91YmxlIG1heFpvb20gPSBtWm9vbUZhY3RvciAqIDIuMCAvIHNjYWxlOworCisgICAgaWYgKHNjYWxlIDwgMikgeworICAgICAgICBzaW11bGF0ZVNldFpvb20oc3RkOjptaW4obVpvb21GYWN0b3IgKyAuMjUsIG1heFpvb20pKTsKKyAgICB9Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6em9vbU91dCgpIHsKKyAgICB6b29tT3V0KFFQb2ludCh3aWR0aCgpIC8gMiwgaGVpZ2h0KCkgLyAyKSwKKyAgICAgICAgICAgIFFQb2ludChtQ29udGFpbmVyLndpZHRoKCkgLyAyLCBtQ29udGFpbmVyLmhlaWdodCgpIC8gMikpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6Onpvb21PdXQoY29uc3QgUVBvaW50JiBmb2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUG9pbnQmIHZpZXdwb3J0Rm9jdXMpIHsKKyAgICBzYXZlWm9vbVBvaW50cyhmb2N1cywgdmlld3BvcnRGb2N1cyk7CisgICAgaWYgKG1ab29tRmFjdG9yID4gMSkgeworICAgICAgICBzaW11bGF0ZVNldFpvb20oc3RkOjptYXgobVpvb21GYWN0b3IgLSAuMjUsIDEuMCkpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93Ojp6b29tUmVzZXQoKSB7CisgICAgc2ltdWxhdGVTZXRab29tKDEpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6Onpvb21Ubyhjb25zdCBRUG9pbnQmIGZvY3VzLCBjb25zdCBRU2l6ZSYgcmVjdFNpemUpIHsKKyAgICBpZiAoIW1CYWNraW5nU3VyZmFjZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2F2ZVpvb21Qb2ludHMoZm9jdXMsCisgICAgICAgICAgICAgICAgICAgUVBvaW50KG1Db250YWluZXIud2lkdGgoKSAvIDIsIG1Db250YWluZXIuaGVpZ2h0KCkgLyAyKSk7CisKKyAgICAvLyBUaGUgYmVsb3cgc2NhbGUgPSB4IGNyZWF0ZXMgYSBza2luIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAid2luZG93CisgICAgLy8gc2NhbGUgeCIgdGhyb3VnaCB0aGUgZW11bGF0b3IgY29uc29sZS4gQXQgc2NhbGUgPSAxLCB0aGUgZGV2aWNlCisgICAgLy8gc2hvdWxkIGJlIGF0IGEgMToxIHBpeGVsIG1hcHBpbmcgd2l0aCB0aGUgbW9uaXRvci4gV2UgYWxsb3cgZ29pbmcgdG8KKyAgICAvLyB0d2ljZSB0aGlzIHNpemUuCisgICAgZG91YmxlIHNjYWxlID0KKyAgICAgICAgICAgICgoZG91YmxlKXNpemUoKS53aWR0aCgpIC8gKGRvdWJsZSltQmFja2luZ1N1cmZhY2UtPm9yaWdpbmFsX3cpOworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSAiaWRlYWwiIHpvb20gZmFjdG9yLCB3aGljaCB3b3VsZCBwZXJmZWN0bHkgZnJhbWUgdGhpcworICAgIC8vIHJlY3RhbmdsZSwgYW5kIHRoZSAibWF4aW11bSIgem9vbSBmYWN0b3IsIHdoaWNoIG1ha2VzIHNjYWxlID0gMSwgYW5kCisgICAgLy8gcGljayB0aGUgc21hbGxlciBvbmUuIEFkZGluZyAyMCBhY2NvdW50cyBmb3IgdGhlIHNjcm9sbCBiYXJzCisgICAgLy8gcG90ZW50aWFsbHkgY3V0dGluZyBvZmYgcGFydHMgb2YgdGhlIHNlbGVjdGlvbgorICAgIGRvdWJsZSBtYXhab29tID0gbVpvb21GYWN0b3IgKiAyLjAgLyBzY2FsZTsKKyAgICBkb3VibGUgaWRlYWxXaWR0aFpvb20gPSBtWm9vbUZhY3RvciAqIChkb3VibGUpbUNvbnRhaW5lci53aWR0aCgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShyZWN0U2l6ZS53aWR0aCgpICsgMjApOworICAgIGRvdWJsZSBpZGVhbEhlaWdodFpvb20gPSBtWm9vbUZhY3RvciAqIChkb3VibGUpbUNvbnRhaW5lci5oZWlnaHQoKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpKHJlY3RTaXplLmhlaWdodCgpICsgMjApOworCisgICAgc2ltdWxhdGVTZXRab29tKHN0ZDo6bWluKHtpZGVhbFdpZHRoWm9vbSwgaWRlYWxIZWlnaHRab29tLCBtYXhab29tfSkpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnBhbkhvcml6b250YWwoYm9vbCBsZWZ0KSB7CisgICAgUVNjcm9sbEJhciogYmFyID0gbUNvbnRhaW5lci5ob3Jpem9udGFsU2Nyb2xsQmFyKCk7CisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYmFyLT5zZXRWYWx1ZShiYXItPnZhbHVlKCkgLSBiYXItPnNpbmdsZVN0ZXAoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmFyLT5zZXRWYWx1ZShiYXItPnZhbHVlKCkgKyBiYXItPnNpbmdsZVN0ZXAoKSk7CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnBhblZlcnRpY2FsKGJvb2wgdXApIHsKKyAgICBRU2Nyb2xsQmFyKiBiYXIgPSBtQ29udGFpbmVyLnZlcnRpY2FsU2Nyb2xsQmFyKCk7CisgICAgaWYgKHVwKSB7CisgICAgICAgIGJhci0+c2V0VmFsdWUoYmFyLT52YWx1ZSgpIC0gYmFyLT5zaW5nbGVTdGVwKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJhci0+c2V0VmFsdWUoYmFyLT52YWx1ZSgpICsgYmFyLT5zaW5nbGVTdGVwKCkpOworICAgIH0KK30KKworYm9vbCBFbXVsYXRvclF0V2luZG93Ojptb3VzZUluc2lkZSgpIHsKKyAgICBRUG9pbnQgd2lkZ2V0X2N1cnNvcl9jb29yZHMgPSBtYXBGcm9tR2xvYmFsKFFDdXJzb3I6OnBvcygpKTsKKyAgICByZXR1cm4gd2lkZ2V0X2N1cnNvcl9jb29yZHMueCgpID49IDAgJiYKKyAgICAgICAgICAgd2lkZ2V0X2N1cnNvcl9jb29yZHMueCgpIDwgd2lkdGgoKSAmJgorICAgICAgICAgICB3aWRnZXRfY3Vyc29yX2Nvb3Jkcy55KCkgPj0gMCAmJiB3aWRnZXRfY3Vyc29yX2Nvb3Jkcy55KCkgPCBoZWlnaHQoKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93Ojp3aGVlbEV2ZW50KFFXaGVlbEV2ZW50KiBldmVudCkgeworICAgIGlmICghbVdoZWVsU2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICBoYW5kbGVNb3VzZUV2ZW50KGtFdmVudE1vdXNlQnV0dG9uRG93biwga01vdXNlQnV0dG9uTGVmdCwgZXZlbnQtPnBvcygpKTsKKyAgICAgICAgbVdoZWVsU2Nyb2xsUG9zID0gZXZlbnQtPnBvcygpOworICAgIH0KKworICAgIG1XaGVlbFNjcm9sbFRpbWVyLnN0YXJ0KCk7CisgICAgbVdoZWVsU2Nyb2xsUG9zLnNldFkobVdoZWVsU2Nyb2xsUG9zLnkoKSArIGV2ZW50LT5kZWx0YSgpIC8gOCk7CisgICAgaGFuZGxlTW91c2VFdmVudChrRXZlbnRNb3VzZU1vdGlvbiwga01vdXNlQnV0dG9uTGVmdCwgbVdoZWVsU2Nyb2xsUG9zKTsKK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93Ojp3aGVlbFNjcm9sbFRpbWVvdXQoKSB7CisgICAgaGFuZGxlTW91c2VFdmVudChrRXZlbnRNb3VzZUJ1dHRvblVwLCBrTW91c2VCdXR0b25MZWZ0LCBtV2hlZWxTY3JvbGxQb3MpOworfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OmNoZWNrQWRiVmVyc2lvbkFuZFdhcm4oKSB7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIGlmICghbUFkYkludGVyZmFjZS0+aXNBZGJWZXJzaW9uQ3VycmVudCgpICYmCisgICAgICAgIHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6QVVUT19GSU5EX0FEQiwgdHJ1ZSkudG9Cb29sKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWRiX3BhdGggPSBtQWRiSW50ZXJmYWNlLT5kZXRlY3RlZEFkYlBhdGgoKTsKKyAgICAgICAgaWYgKGFkYl9wYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1BZGJXYXJuaW5nQm94LnNldFRleHQoCisgICAgICAgICAgICAgICAgICAgIHRyKCJDb3VsZCBub3QgYXV0b21hdGljYWxseSBkZXRlY3QgYW4gQURCIGJpbmFyeS4gU29tZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJlbXVsYXRvciBmdW5jdGlvbmFsaXR5IHdpbGwgbm90IHdvcmsgdW50aWwgYSBjdXN0b20gIgorICAgICAgICAgICAgICAgICAgICAgICAicGF0aCB0byBBREIgIGlzIGFkZGVkIGluIHRoZSBleHRlbmRlZCBzZXR0aW5ncyBwYWdlLiIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGJXYXJuaW5nQm94LnNldFRleHQoCisgICAgICAgICAgICAgICAgICAgIHRyKCJUaGUgQURCIGJpbmFyeSBmb3VuZCBhdCAlMSBpcyBvYnNvbGV0ZSBhbmQgaGFzIHNlcmlvdXMiCisgICAgICAgICAgICAgICAgICAgICAgICJwZXJmb3JtYW5jZSBwcm9ibGVtcyB3aXRoIHRoZSBBbmRyb2lkIEVtdWxhdG9yLiBQbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAidXBkYXRlIHRvIGEgbmV3ZXIgdmVyc2lvbiB0byBnZXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiYXBwL2ZpbGUgdHJhbnNmZXIuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKGFkYl9wYXRoLmNfc3RyKCkpKTsKKyAgICAgICAgfQorICAgICAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIGlmIChzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlNIT1dfQURCX1dBUk5JTkcsIHRydWUpLnRvQm9vbCgpKSB7CisgICAgICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KCZtQWRiV2FybmluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkFMKGJ1dHRvbkNsaWNrZWQoUUFic3RyYWN0QnV0dG9uKikpLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTE9UKHNsb3RfYWRiV2FybmluZ01lc3NhZ2VBY2NlcHRlZCgpKSk7CisKKyAgICAgICAgICAgIFFDaGVja0JveCogY2hlY2tib3ggPSBuZXcgUUNoZWNrQm94KHRyKCJOZXZlciBzaG93IHRoaXMgYWdhaW4uIikpOworICAgICAgICAgICAgY2hlY2tib3gtPnNldENoZWNrU3RhdGUoUXQ6OlVuY2hlY2tlZCk7CisgICAgICAgICAgICBtQWRiV2FybmluZ0JveC5zZXRXaW5kb3dNb2RhbGl0eShRdDo6Tm9uTW9kYWwpOworICAgICAgICAgICAgbUFkYldhcm5pbmdCb3guc2V0Q2hlY2tCb3goY2hlY2tib3gpOworICAgICAgICAgICAgbUFkYldhcm5pbmdCb3guc2hvdygpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEVtdWxhdG9yUXRXaW5kb3c6OnNsb3RfYWRiV2FybmluZ01lc3NhZ2VBY2NlcHRlZCgpIHsKKyAgICBRQ2hlY2tCb3gqIGNoZWNrYm94ID0gbUFkYldhcm5pbmdCb3guY2hlY2tCb3goKTsKKyAgICBpZiAoY2hlY2tib3gtPmNoZWNrU3RhdGUoKSA9PSBRdDo6Q2hlY2tlZCkgeworICAgICAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6U0hPV19BREJfV0FSTklORywgZmFsc2UpOworICAgIH0KK30KKwordm9pZCBFbXVsYXRvclF0V2luZG93OjpydW5BZGJTaGVsbFN0b3BBbmRRdWl0KCkgeworICAgIC8vIHdlIG5lZWQgdG8gcnVuIGl0IG9ubHkgb25jZSwgc28gZG9uJ3QgZXZlciByZXNldCB0aGlzCisgICAgaWYgKG1TdGFydGVkQWRiU3RvcFByb2Nlc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RhcnRlZEFkYlN0b3BQcm9jZXNzID0gdHJ1ZTsKKyAgICBtQWRiSW50ZXJmYWNlLT5ydW5BZGJDb21tYW5kKAorICAgICAgICAgICAgeyJzaGVsbCIsICJzdG9wIn0sCisgICAgICAgICAgICBbdGhpc10oY29uc3QgYW5kcm9pZDo6ZW11bGF0aW9uOjpPcHRpb25hbEFkYkNvbW1hbmRSZXN1bHQmKSB7CisgICAgICAgICAgICAgICAgcXVldWVRdWl0RXZlbnQoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmtJbmZpbml0ZSk7Cit9CisKK3ZvaWQgRW11bGF0b3JRdFdpbmRvdzo6cm90YXRlU2tpbihTa2luUm90YXRpb24gcm90KSB7CisgICAgU2tpbkV2ZW50KiBldmVudCA9IGNyZWF0ZVNraW5FdmVudChrRXZlbnRMYXlvdXRSb3RhdGUpOworICAgIGV2ZW50LT51LmxheW91dF9yb3RhdGlvbi5yb3RhdGlvbiA9IHJvdDsKKyAgICBxdWV1ZVNraW5FdmVudChldmVudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC13aW5kb3cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDMzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC13aW5kb3cuaApAQCAtMCwwICsxLDM4OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9DaXJjdWxhckJ1ZmZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9BcGtJbnN0YWxsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL0ZpbGVQdXNoZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL1NjcmVlbkNhcHR1cmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL1BlcmlvZGljUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vZXZlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItY29udGFpbmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLW92ZXJsYXkuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXJyb3ItZGlhbG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3VpLWV2ZW50LXJlY29yZGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3VzZXItYWN0aW9ucy1jb3VudGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3N1cmZhY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UURyYWdFbnRlckV2ZW50PgorI2luY2x1ZGUgPFFEcm9wRXZlbnQ+CisjaW5jbHVkZSA8UUZyYW1lPgorI2luY2x1ZGUgPFFJbWFnZT4KKyNpbmNsdWRlIDxRTWVzc2FnZUJveD4KKyNpbmNsdWRlIDxRTW91c2VFdmVudD4KKyNpbmNsdWRlIDxRTW92ZUV2ZW50PgorI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVkZSA8UVByb2dyZXNzRGlhbG9nPgorI2luY2x1ZGUgPFFSZXNpemVFdmVudD4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPFF0Q29yZT4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgVWkgeworY2xhc3MgRW11bGF0b3JXaW5kb3c7Cit9CisKK3R5cGVkZWYgc3RydWN0IFNraW5TdXJmYWNlIFNraW5TdXJmYWNlOworCitjbGFzcyBNYWluTG9vcFRocmVhZCA6IHB1YmxpYyBRVGhyZWFkIHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgTWFpbkxvb3BUaHJlYWQoU3RhcnRGdW5jdGlvbiBmLCBpbnQgYXJnYywgY2hhcioqIGFyZ3YpCisgICAgICAgIDogc3RhcnRfZnVuY3Rpb24oZiksIGFyZ2MoYXJnYyksIGFyZ3YoYXJndikge30KKyAgICB2b2lkIHJ1bigpIFFfREVDTF9PVkVSUklERSB7CisgICAgICAgIGlmIChzdGFydF9mdW5jdGlvbikKKyAgICAgICAgICAgIHN0YXJ0X2Z1bmN0aW9uKGFyZ2MsIGFyZ3YpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTdGFydEZ1bmN0aW9uIHN0YXJ0X2Z1bmN0aW9uOworICAgIGludCBhcmdjOworICAgIGNoYXIqKiBhcmd2OworfTsKKworY2xhc3MgRW11bGF0b3JRdFdpbmRvdyBmaW5hbCA6IHB1YmxpYyBRRnJhbWUgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICB1c2luZyBQdHIgPSBzdGQ6OnNoYXJlZF9wdHI8RW11bGF0b3JRdFdpbmRvdz47CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgRW11bGF0b3JRdFdpbmRvdyhRV2lkZ2V0KiBwYXJlbnQgPSAwKTsKKworcHVibGljOgorICAgIHN0YXRpYyB2b2lkIGNyZWF0ZSgpOworICAgIHN0YXRpYyBFbXVsYXRvclF0V2luZG93KiBnZXRJbnN0YW5jZSgpOworICAgIHN0YXRpYyBQdHIgZ2V0SW5zdGFuY2VQdHIoKTsKKworICAgIHZpcnR1YWwgfkVtdWxhdG9yUXRXaW5kb3coKTsKKworICAgIHZvaWQgcXVldWVRdWl0RXZlbnQoKTsKKyAgICB2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIGRyYWdFbnRlckV2ZW50KFFEcmFnRW50ZXJFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgZHJhZ0xlYXZlRXZlbnQoUURyYWdMZWF2ZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkcmFnTW92ZUV2ZW50KFFEcmFnTW92ZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBkcm9wRXZlbnQoUURyb3BFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKyAgICB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwYWludEV2ZW50KFFQYWludEV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCB3aGVlbEV2ZW50KFFXaGVlbEV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzdGFydFRocmVhZChTdGFydEZ1bmN0aW9uIGYsIGludCBhcmdjLCBjaGFyKiogYXJndik7CisKKyAgICAvKgorICAgICBJbiBRdCwgc2lnbmFscyBhcmUgbm9ybWFsbHkgZXZlbnRzIG9mIGludGVyZXN0IHRoYXQgYSBjbGFzcyBjYW4gZW1pdCwgd2hpY2gKKyAgICAgY2FuIGJlIGhvb2tlZCB1cCB0byBhcmJpdHJhcnkgc2xvdHMuIEhlcmUKKyAgICAgd2UgdXNlIHRoaXMgbWVjaGFuaXNtIGZvciBhIGRpZmZlcmVudCBwdXJwb3NlOiBpdCdzIHRvIGFsbG93IHRoZSBRRU1VCisgICAgIHRocmVhZAorICAgICB0byByZXF1ZXN0IGFuIG9wZXJhdGlvbiBiZSBwZXJmb3JtZWQgb24KKyAgICAgdGhlIFF0IHRocmVhZDsgUXQgYWxsb3dzIHNpZ25hbHMgdG8gYmUgZW1pdHRlZCBmcm9tIGFueSB0aHJlYWQuIFdoZW4gdXNlZAorICAgICBpbgorICAgICB0aGlzIGZhc2hpb24sIHRoZSBzaWduYWwgaXMgcXVldWVkIGFuZAorICAgICBoYW5kbGVkIGFzeW5jcmhvbm91c2x5LiBTaW5jZSB3ZSBzb21ldGltZXMgd2lsbCBjYWxsIHRoZXNlIHNpZ25hbHMgZnJvbQorICAgICBRdCdzCisgICAgIHRocmVhZCBhcyB3ZWxsLCB3ZSBjYW4ndCB1c2UKKyAgICAgQmxvY2tpbmdRdWV1ZWRDb25uZWN0aW9ucyBmb3IgdGhlc2Ugc2lnbmFscywgc2luY2UgdGhpcyBjb25uZWN0aW9uIHR5cGUKKyAgICAgd2lsbAorICAgICBkZWFkbG9jayBpZiBjYWxsZWQgZnJvbSB0aGUgc2FtZSB0aHJlYWQuCisgICAgIEZvciB0aGF0IHJlYXNvbiwgd2UgdXNlIGEgbm9ybWFsIG5vbi1ibG9ja2luZyBjb25uZWN0aW9uIHR5cGUsIGFuZCBhbGxvdworICAgICBhbGwKKyAgICAgb2YgdGhlIHNpZ25hbHMgdG8gcGFzcyBhbiBvcHRpb25hbCBzZW1hcGhvcmUKKyAgICAgdGhhdCB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBzbG90IHdoZW4gaXQgaXMgZG9uZSBwcm9jZXNzaW5nLiBJZiB5b3Ugd2FudAorICAgICB0bworICAgICBibG9jayBvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgc2lnbmFsLCBzaW1wbHkKKyAgICAgcGFzcyBpbiB0aGUgc2VtYXBob3JlIHRvIHRoZSBzaWduYWwgYW5kIGFjcXVpcmUgaXQgYWZ0ZXIgdGhlIGNhbGwgcmV0dXJucy4KKyAgICAgSWYKKyAgICAgeW91J3JlIHBhc3NpbmcgaW4gcG9pbnRlcnMgdG8gZGF0YSBzdHJ1Y3R1cmVzCisgICAgIHRoYXQgY291bGQgY2hhbmdlIG9yIGdvIGF3YXksIHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBzdXJlIHlvdSBibG9jayB0bworICAgICBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIHRoZSBkYXRhIHdoaWxlIHRoZSBzaWduYWwgcnVucy4KKworICAgICBUT0RPOiBhbGxvdyBub25ibG9ja2luZyBjYWxscyB0byB0aGVzZSBzaWduYWxzIGJ5IGhhdmluZyB0aGUgc2lnbmFsIHRha2UKKyAgICAgb3duZXJzaGlwIG9mIG9iamVjdCBwb2ludGVycy4gVGhpcyB3b3VsZCBhbGxvdyBRRU1VCisgICAgIHRvIGRvIHRoaW5ncyBsaWtlIHVwZGF0ZSB0aGUgc2NyZWVuIHdpdGhvdXQgYmxvY2tpbmcsIHdoaWNoIHdvdWxkIG1ha2UgaXQKKyAgICAgcnVuCisgICAgIGZhc3Rlci4KKyAgICAgKi8KK3NpZ25hbHM6CisgICAgdm9pZCBibGl0KFFJbWFnZSogc3JjLAorICAgICAgICAgICAgICBRUmVjdCogc3JjUmVjdCwKKyAgICAgICAgICAgICAgUUltYWdlKiBkc3QsCisgICAgICAgICAgICAgIFFQb2ludCogZHN0UG9zLAorICAgICAgICAgICAgICBRUGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlKiBvcCwKKyAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBjcmVhdGVCaXRtYXAoU2tpblN1cmZhY2UqIHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBmaWxsKFNraW5TdXJmYWNlKiBzLAorICAgICAgICAgICAgICBjb25zdCBRUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgY29uc3QgUUNvbG9yKiBjb2xvciwKKyAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBnZXRCaXRtYXBJbmZvKFNraW5TdXJmYWNlKiBzLAorICAgICAgICAgICAgICAgICAgICAgICBTa2luU3VyZmFjZVBpeGVscyogcGl4LAorICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIGdldERldmljZVBpeGVsUmF0aW8oZG91YmxlKiBvdXRfZHByLCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIGdldFNjcmVlbkRpbWVuc2lvbnMoUVJlY3QqIG91dF9yZWN0LCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIGdldFdpbmRvd0lkKFdJZCogb3V0X2lkLCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIGdldFdpbmRvd1BvcyhpbnQqIHgsIGludCogeSwgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBpc1dpbmRvd0Z1bGx5VmlzaWJsZShib29sKiBvdXRfdmFsdWUsIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgcmVsZWFzZUJpdG1hcChTa2luU3VyZmFjZSogcywgUVNlbWFwaG9yZSogc2VtcGFob3JlID0gTlVMTCk7CisgICAgdm9pZCByZXF1ZXN0Q2xvc2UoUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCByZXF1ZXN0VXBkYXRlKGNvbnN0IFFSZWN0KiByZWN0LCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNldERldmljZUdlb21ldHJ5KGNvbnN0IFFSZWN0KiByZWN0LCBRU2VtYXBob3JlKiBzZW1wYWhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNldFdpbmRvd0ljb24oY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgc2V0V2luZG93UG9zKGludCB4LCBpbnQgeSwgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBzZXRUaXRsZShjb25zdCBRU3RyaW5nKiB0aXRsZSwgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBzaG93V2luZG93KFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBRUmVjdCogcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisKKyAgICAvLyBRdCBkb2Vzbid0IHN1cHBvcnQgZnVuY3Rpb24gcG9pbnRlcnMgaW4gc2lnbmFscy9zbG90cyBuYXRpdmVseSwgYnV0CisgICAgLy8gcG9pbnRlciB0byBmdW5jdGlvbiBwb2ludGVyIHdvcmtzIGZpbmUKKyAgICB2b2lkIHJ1bk9uVWlUaHJlYWQoU2tpbkdlbmVyaWNGdW5jdGlvbiogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBsYXlvdXRDaGFuZ2VkKGJvb2wgbmV4dCk7CisKK3B1YmxpYzoKKyAgICB2b2lkIHBvbGxFdmVudChTa2luRXZlbnQqIGV2ZW50LAorICAgICAgICAgICAgICAgICAgIGJvb2wqIGhhc0V2ZW50KTsKKworICAgIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlKiBnZXRBZGJJbnRlcmZhY2UoKSBjb25zdDsKKyAgICBib29sIGlzSW5ab29tTW9kZSgpIGNvbnN0OworICAgIFRvb2xXaW5kb3cqIHRvb2xXaW5kb3coKSBjb25zdDsKKyAgICB2b2lkIHNob3dab29tSWZOb3RVc2VySGlkZGVuKCk7CisgICAgUVNpemUgY29udGFpbmVyU2l6ZSgpIGNvbnN0OworICAgIFFSZWN0IGRldmljZUdlb21ldHJ5KCkgY29uc3Q7CisKKyAgICB2b2lkIGRvUmVzaXplKGNvbnN0IFFTaXplJiBzaXplLAorICAgICAgICAgICAgICAgICAgYm9vbCBpc0tiZFNob3J0Y3V0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICBib29sIGZsaXBEaW1lbnNpb25zID0gZmFsc2UpOworICAgIHZvaWQgaGFuZGxlTW91c2VFdmVudChTa2luRXZlbnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5Nb3VzZUJ1dHRvblR5cGUgYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUG9pbnQmIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwU3luYyA9IGZhbHNlKTsKKyAgICB2b2lkIHBhbkhvcml6b250YWwoYm9vbCBsZWZ0KTsKKyAgICB2b2lkIHBhblZlcnRpY2FsKGJvb2wgdXApOworICAgIHZvaWQgcXVldWVTa2luRXZlbnQoU2tpbkV2ZW50KiBldmVudCk7CisgICAgdm9pZCByZWNlbnRlckZvY3VzUG9pbnQoKTsKKyAgICB2b2lkIHNhdmVab29tUG9pbnRzKGNvbnN0IFFQb2ludCYgZm9jdXMsIGNvbnN0IFFQb2ludCYgdmlld3BvcnRGb2N1cyk7CisgICAgdm9pZCBzY2FsZURvd24oKTsKKyAgICB2b2lkIHNjYWxlVXAoKTsKKyAgICB2b2lkIHNjcmVlbnNob3QoKTsKKyAgICB2b2lkIHNldE9uVG9wKGJvb2wgb25Ub3ApOworICAgIHZvaWQgc2ltdWxhdGVLZXlQcmVzcyhpbnQga2V5Q29kZSwgaW50IG1vZGlmaWVycyk7CisgICAgdm9pZCBzaW11bGF0ZVNjcm9sbEJhckNoYW5nZWQoaW50IHgsIGludCB5KTsKKyAgICB2b2lkIHNpbXVsYXRlU2V0U2NhbGUoZG91YmxlIHNjYWxlKTsKKyAgICB2b2lkIHNpbXVsYXRlU2V0Wm9vbShkb3VibGUgem9vbSk7CisgICAgdm9pZCBzaW11bGF0ZVdpbmRvd01vdmVkKGNvbnN0IFFQb2ludCYgcG9zKTsKKyAgICB2b2lkIHNpbXVsYXRlWm9vbWVkV2luZG93UmVzaXplZChjb25zdCBRU2l6ZSYgc2l6ZSk7CisgICAgdm9pZCB0b2dnbGVab29tTW9kZSgpOworICAgIHZvaWQgem9vbUluKCk7CisgICAgdm9pZCB6b29tSW4oY29uc3QgUVBvaW50JiBmb2N1cywgY29uc3QgUVBvaW50JiB2aWV3cG9ydEZvY3VzKTsKKyAgICB2b2lkIHpvb21PdXQoKTsKKyAgICB2b2lkIHpvb21PdXQoY29uc3QgUVBvaW50JiBmb2N1cywgY29uc3QgUVBvaW50JiB2aWV3cG9ydEZvY3VzKTsKKyAgICB2b2lkIHpvb21SZXNldCgpOworICAgIHZvaWQgem9vbVRvKGNvbnN0IFFQb2ludCYgZm9jdXMsIGNvbnN0IFFTaXplJiByZWN0U2l6ZSk7CisKK3B1YmxpYyBzbG90czoKKyAgICB2b2lkIHJvdGF0ZVNraW4oU2tpblJvdGF0aW9uIHJvdCk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBzbG90X2FkYldhcm5pbmdNZXNzYWdlQWNjZXB0ZWQoKTsKKyAgICB2b2lkIHNsb3RfYmxpdChRSW1hZ2UqIHNyYywKKyAgICAgICAgICAgICAgICAgICBRUmVjdCogc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICBRSW1hZ2UqIGRzdCwKKyAgICAgICAgICAgICAgICAgICBRUG9pbnQqIGRzdFBvcywKKyAgICAgICAgICAgICAgICAgICBRUGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlKiBvcCwKKyAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfY2xlYXJJbnN0YW5jZSgpOworICAgIHZvaWQgc2xvdF9jcmVhdGVCaXRtYXAoU2tpblN1cmZhY2UqIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBzbG90X2ZpbGwoU2tpblN1cmZhY2UqIHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QqIHJlY3QsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUUNvbG9yKiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfZ2V0Qml0bWFwSW5mbyhTa2luU3VyZmFjZSogcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luU3VyZmFjZVBpeGVscyogcGl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgc2xvdF9nZXREZXZpY2VQaXhlbFJhdGlvKGRvdWJsZSogb3V0X2RwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfZ2V0U2NyZWVuRGltZW5zaW9ucyhRUmVjdCogb3V0X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBzbG90X2dldFdpbmRvd0lkKFdJZCogb3V0X2lkLCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfZ2V0V2luZG93UG9zKGludCogeCwgaW50KiB5LCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfaXNXaW5kb3dGdWxseVZpc2libGUoYm9vbCogb3V0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfcmVsZWFzZUJpdG1hcChTa2luU3VyZmFjZSogcywgUVNlbWFwaG9yZSogc2VtcGFob3JlID0gTlVMTCk7CisgICAgdm9pZCBzbG90X3JlcXVlc3RDbG9zZShRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3RfcmVxdWVzdFVwZGF0ZShjb25zdCBRUmVjdCogcmVjdCwgUVNlbWFwaG9yZSogc2VtYXBob3JlID0gTlVMTCk7CisgICAgdm9pZCBzbG90X3NldERldmljZUdlb21ldHJ5KGNvbnN0IFFSZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3Rfc2V0V2luZG93SWNvbihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgc2xvdF9zZXRXaW5kb3dQb3MoaW50IHgsIGludCB5LCBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKyAgICB2b2lkIHNsb3Rfc2V0V2luZG93VGl0bGUoY29uc3QgUVN0cmluZyogdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgc2xvdF9zaG93V2luZG93KFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFSZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFTZW1hcGhvcmUqIHNlbWFwaG9yZSA9IE5VTEwpOworICAgIHZvaWQgc2xvdF9ydW5PblVpVGhyZWFkKFNraW5HZW5lcmljRnVuY3Rpb24qIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU2VtYXBob3JlKiBzZW1hcGhvcmUgPSBOVUxMKTsKKworICAgIHZvaWQgc2xvdF9ob3Jpem9udGFsU2Nyb2xsQ2hhbmdlZChpbnQgdmFsdWUpOworICAgIHZvaWQgc2xvdF92ZXJ0aWNhbFNjcm9sbENoYW5nZWQoaW50IHZhbHVlKTsKKworICAgIHZvaWQgc2xvdF9zY3JvbGxSYW5nZUNoYW5nZWQoaW50IG1pbiwgaW50IG1heCk7CisKKyAgICB2b2lkIHNsb3Rfc3RhcnR1cFRpY2soKTsKKworICAgIHZvaWQgc2xvdF9hdmRBcmNoV2FybmluZ01lc3NhZ2VBY2NlcHRlZCgpOworICAgIHZvaWQgc2xvdF9ncHVXYXJuaW5nTWVzc2FnZUFjY2VwdGVkKCk7CisKKyAgICB2b2lkIHNsb3RfaW5zdGFsbENhbmNlbGVkKCk7CisgICAgdm9pZCBzbG90X2FkYlB1c2hDYW5jZWxlZCgpOworCisgICAgLyoKKyAgICAgSGVyZSBhcmUgY29udmVudGlvbmFsIHNsb3RzIHRoYXQgcGVyZm9ybSBpbnRlcmVzdGluZyBoaWdoLWxldmVsIGZ1bmN0aW9ucworICAgICBpbgorICAgICB0aGUgZW11bGF0b3IuIFRoZXNlIGNhbiBiZSBob29rZWQgdXAgdG8gc2lnbmFscworICAgICBmcm9tIFVJIGVsZW1lbnRzIG9yIGNhbGxlZCBpbmRlcGVuZGVudGx5LgorICAgICAqLworcHVibGljIHNsb3RzOgorICAgIHZvaWQgcmFpc2UoKTsKKyAgICB2b2lkIHNldEZvcndhcmRTaG9ydGN1dHNUb0RldmljZShpbnQgaW5kZXgpOworICAgIHZvaWQgc2hvdygpOworICAgIHZvaWQgc2hvd01pbmltaXplZCgpOworICAgIHZvaWQgd2hlZWxTY3JvbGxUaW1lb3V0KCk7CisKKyAgICB2b2lkIHNsb3Rfc2NyZWVuQ2hhbmdlZCgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGtSZW1vdGVEb3dubG9hZHNEaXI7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcga1JlbW90ZURvd25sb2Fkc0RpckFwaTEwOworCisgICAgLy8gV2hlbiB0aGUgbWFpbiB3aW5kb3cgYXBwZWFycywgY2xvc2UgdGhlICJTdGFydGluZy4uLiIKKyAgICAvLyBwb3AtdXAsIGlmIGl0IHdhcyBkaXNwbGF5ZWQuCisgICAgdm9pZCBzaG93RXZlbnQoUVNob3dFdmVudCogZXZlbnQpIHsKKyAgICAgICAgbVN0YXJ0dXBUaW1lci5zdG9wKCk7CisgICAgICAgIG1TdGFydHVwRGlhbG9nLmNsb3NlKCk7CisgICAgfQorCisgICAgdm9pZCBjaGVja0FkYlZlcnNpb25BbmRXYXJuKCk7CisgICAgdm9pZCBzaG93QXZkQXJjaFdhcm5pbmcoKTsKKyAgICB2b2lkIHNob3dHcHVXYXJuaW5nKCk7CisKKyAgICBib29sIG1vdXNlSW5zaWRlKCk7CisgICAgU2tpbk1vdXNlQnV0dG9uVHlwZSBnZXRTa2luTW91c2VCdXR0b24oUU1vdXNlRXZlbnQqIGV2ZW50KSBjb25zdDsKKworICAgIFNraW5FdmVudCogY3JlYXRlU2tpbkV2ZW50KFNraW5FdmVudFR5cGUgdHlwZSk7CisgICAgdm9pZCBmb3J3YXJkS2V5RXZlbnRUb0VtdWxhdG9yKFNraW5FdmVudFR5cGUgdHlwZSwgUUtleUV2ZW50KiBldmVudCk7CisgICAgdm9pZCBoYW5kbGVLZXlFdmVudChTa2luRXZlbnRUeXBlIHR5cGUsIFFLZXlFdmVudCogZXZlbnQpOworCisgICAgdm9pZCBzY3JlZW5zaG90RG9uZShhbmRyb2lkOjplbXVsYXRpb246OlNjcmVlbkNhcHR1cmVyOjpSZXN1bHQgcmVzdWx0KTsKKworICAgIHZvaWQgcnVuQWRiSW5zdGFsbChjb25zdCBRU3RyaW5nJiBwYXRoKTsKKyAgICB2b2lkIGluc3RhbGxEb25lKGFuZHJvaWQ6OmVtdWxhdGlvbjo6QXBrSW5zdGFsbGVyOjpSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldyBlcnJvclN0cmluZyk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGtQdXNoUHJvZ3Jlc3NCYXJNYXg7CisgICAgdm9pZCBydW5BZGJQdXNoKGNvbnN0IFFMaXN0PFFVcmw+JiB1cmxzKTsKKyAgICB2b2lkIGFkYlB1c2hQcm9ncmVzcyhkb3VibGUgcHJvZ3Jlc3MsIGJvb2wgZG9uZSk7CisgICAgdm9pZCBhZGJQdXNoRG9uZShhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6ZW11bGF0aW9uOjpGaWxlUHVzaGVyOjpSZXN1bHQgcmVzdWx0KTsKKworICAgIHZvaWQgcnVuQWRiU2hlbGxTdG9wQW5kUXVpdCgpOworCisgICAgYW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBtTG9vcGVyOworICAgIFFUaW1lciBtU3RhcnR1cFRpbWVyOworICAgIFFQcm9ncmVzc0RpYWxvZyBtU3RhcnR1cERpYWxvZzsKKworICAgIFNraW5TdXJmYWNlKiBtQmFja2luZ1N1cmZhY2U7CisgICAgUVF1ZXVlPFNraW5FdmVudCo+IG1Ta2luRXZlbnRRdWV1ZTsKKyAgICBhbmRyb2lkOjpiYXNlOjpMb2NrIG1Ta2luRXZlbnRRdWV1ZUxvY2s7CisgICAgVG9vbFdpbmRvdyogbVRvb2xXaW5kb3c7CisgICAgRW11bGF0b3JDb250YWluZXIgbUNvbnRhaW5lcjsKKyAgICBFbXVsYXRvck92ZXJsYXkgbU92ZXJsYXk7CisgICAgUVJlY3QgbURldmljZUdlb21ldHJ5OworCisgICAgUVBvaW50RiBtRm9jdXM7CisgICAgUVBvaW50IG1WaWV3cG9ydEZvY3VzOworICAgIGRvdWJsZSBtWm9vbUZhY3RvcjsKKyAgICBib29sIG1Jblpvb21Nb2RlOworICAgIGJvb2wgbU5leHRJc1pvb207CisgICAgYm9vbCBtRm9yd2FyZFNob3J0Y3V0c1RvRGV2aWNlOworICAgIFFQb2ludCBtUHJldk1vdXNlUG9zaXRpb247CisKKyAgICBNYWluTG9vcFRocmVhZCogbU1haW5Mb29wVGhyZWFkOworCisgICAgUU1lc3NhZ2VCb3ggbUF2ZFdhcm5pbmdCb3g7CisgICAgUU1lc3NhZ2VCb3ggbUdwdVdhcm5pbmdCb3g7CisgICAgUU1lc3NhZ2VCb3ggbUFkYldhcm5pbmdCb3g7CisgICAgYm9vbCBtRmlyc3RTaG93RXZlbnQ7CisKKyAgICBFdmVudENhcHR1cmVyIG1FdmVudENhcHR1cmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxVSUV2ZW50UmVjb3JkZXI8YW5kcm9pZDo6YmFzZTo6Q2lyY3VsYXJCdWZmZXI+PgorICAgICAgICAgICAgbUV2ZW50TG9nZ2VyOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnF0OjpVc2VyQWN0aW9uc0NvdW50ZXI+IG1Vc2VyQWN0aW9uc0NvdW50ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlPiBtQWRiSW50ZXJmYWNlOworICAgIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiQ29tbWFuZFB0ciBtQXBrSW5zdGFsbENvbW1hbmQ7CisgICAgYW5kcm9pZDo6ZW11bGF0aW9uOjpBcGtJbnN0YWxsZXIgbUFwa0luc3RhbGxlcjsKKyAgICBhbmRyb2lkOjplbXVsYXRpb246OkZpbGVQdXNoZXIgbUZpbGVQdXNoZXI7CisgICAgYW5kcm9pZDo6ZW11bGF0aW9uOjpTY3JlZW5DYXB0dXJlciBtU2NyZWVuQ2FwdHVyZXI7CisgICAgUVByb2dyZXNzRGlhbG9nIG1JbnN0YWxsRGlhbG9nOworICAgIFFQcm9ncmVzc0RpYWxvZyBtUHVzaERpYWxvZzsKKworICAgIFFUaW1lciBtV2hlZWxTY3JvbGxUaW1lcjsKKyAgICBRUG9pbnQgbVdoZWVsU2Nyb2xsUG9zOworICAgIGJvb2wgbVN0YXJ0ZWRBZGJTdG9wUHJvY2VzczsKKworICAgIGFuZHJvaWQ6Om1ldHJpY3M6OlBlcmlvZGljUmVwb3J0ZXI6OlRhc2tUb2tlbiBtTWV0cmljc1JlcG9ydGluZ1Rva2VuOworfTsKKworc3RydWN0IFNraW5TdXJmYWNlIHsKKyAgICBpbnQgcmVmY291bnQ7CisgICAgaW50IGlkOworICAgIFFJbWFnZSogYml0bWFwOworICAgIGludCB3LCBoLCBvcmlnaW5hbF93LCBvcmlnaW5hbF9oOworICAgIEVtdWxhdG9yUXRXaW5kb3c6OlB0ciB3aW5kb3c7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXJyb3ItZGlhbG9nLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyM2FjNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5oIgorCisjaW5jbHVkZSA8UU1lc3NhZ2VCb3g+CisKK3N0YXRpYyBRTWVzc2FnZUJveCogc0Vycm9yRGlhbG9nID0gbnVsbHB0cjsKKwordm9pZCBpbml0RXJyb3JEaWFsb2coUVdpZGdldCAqcGFyZW50KQoreworICAgIC8vIFRoaXMgZGlhbG9nIHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBwYXJlbnQgaXMgZGVsZXRlZCwgd2hpY2ggb2NjdXJzCisgICAgLy8gd2hlbiB0aGUgZW11bGF0b3IgY2xvc2VzLgorCisgICAgaWYgKCFzRXJyb3JEaWFsb2cpIHsKKyAgICAgICAgc0Vycm9yRGlhbG9nID0gbmV3IFFNZXNzYWdlQm94KFFNZXNzYWdlQm94OjpXYXJuaW5nLCAiIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRTWVzc2FnZUJveDo6T2ssIHBhcmVudCk7CisgICAgICAgIHNFcnJvckRpYWxvZy0+c2V0TW9kYWwodHJ1ZSk7CisgICAgfQorfQorCit2b2lkIHNob3dFcnJvckRpYWxvZyhjb25zdCBRU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBRU3RyaW5nJiB0aXRsZSkKK3sKKyAgICBpZiAoc0Vycm9yRGlhbG9nKSB7CisgICAgICAgIHNFcnJvckRpYWxvZy0+c2V0VGV4dChtZXNzYWdlKTsKKyAgICAgICAgc0Vycm9yRGlhbG9nLT5zZXRXaW5kb3dUaXRsZSh0aXRsZSk7CisgICAgICAgIHNFcnJvckRpYWxvZy0+ZXhlYygpOworICAgIH0KK30KKwordm9pZCBkZWxldGVFcnJvckRpYWxvZygpIHsKKyAgICBkZWxldGUgc0Vycm9yRGlhbG9nOworICAgIHNFcnJvckRpYWxvZyA9IG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lcnJvci1kaWFsb2cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2Y3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9lcnJvci1kaWFsb2cuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UVN0cmluZz4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorCit2b2lkIGluaXRFcnJvckRpYWxvZyhRV2lkZ2V0ICpwYXJlbnQpOworCit2b2lkIHNob3dFcnJvckRpYWxvZyhjb25zdCBRU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBRU3RyaW5nJiB0aXRsZSk7CisKK3ZvaWQgZGVsZXRlRXJyb3JEaWFsb2coKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V0Yy9xdC5jb25mIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXRjL3F0LmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5MmIyNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V0Yy9xdC5jb25mCkBAIC0wLDAgKzEsMyBAQAorW1BhdGhzXQorUHJlZml4ICA9IDovCitQbHVnaW5zID0gbGliL3F0L3BsdWdpbnMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LWNhcHR1cmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LWNhcHR1cmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIyZTAwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtY2FwdHVyZXIuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXZlbnQtY2FwdHVyZXIuaCIKKworRXZlbnRDYXB0dXJlcjo6U3Vic2NyaWJlclRva2VuIEV2ZW50Q2FwdHVyZXI6OnN1YnNjcmliZVRvRXZlbnRzKAorICAgICAgICBRT2JqZWN0KiByb290LAorICAgICAgICBjb25zdCBFdmVudENhcHR1cmVyOjpPYmplY3RQcmVkaWNhdGUmIGNoaWxkX3ByZWRpY2F0ZSwKKyAgICAgICAgY29uc3QgRXZlbnRDYXB0dXJlcjo6RXZlbnRUeXBlU2V0JiBldmVudF90eXBlcywKKyAgICAgICAgY29uc3QgRXZlbnRDYXB0dXJlcjo6Q2FsbGJhY2smIGNhbGxiYWNrKSB7CisgICAgLy8gVGhpcyB3aWxsIGNvbnRhaW4gdGhlIHNldCBvZiBvYmplY3RzIHdob3NlIGV2ZW50cyB0aGUgY2FsbGVyCisgICAgLy8gc2hvdWxkIGJlIHN1YnNjcmliZWQgdG8uCisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PFFPYmplY3QqPiBvYmplY3RzOworCisgICAgLy8gVHJhdmVyc2UgdGhlIG9iamVjdCBoaWVyYXJjaHkgc3RhcnRpbmcgYXQgcm9vdC4gRm9yIGVhY2ggb2JqZWN0LAorICAgIC8vIGNoZWNrIHRoZSB2YWx1ZSBvZiB8Y2hpbGRfcHJlZGljYXRlfC4gSWYgaXQgaXMgdHJ1ZSwgaW5jbHVkZSBpdAorICAgIC8vIGludG8gdGhlIHNldCBvZiBtb25pdG9yZWQgb2JqZWN0cy4KKyAgICBhdXRvIHdhdGNoX2lmX25lZWRlZCA9IFsmY2hpbGRfcHJlZGljYXRlLCAmb2JqZWN0cywgdGhpc10oUU9iamVjdCogb2JqKSB7CisgICAgICAgIGlmIChjaGlsZF9wcmVkaWNhdGUob2JqKSkgeworICAgICAgICAgICAgb2JqZWN0cy5pbnNlcnQob2JqKTsKKyAgICAgICAgICAgIG9iai0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOworICAgICAgICB9CisgICAgfTsKKyAgICB3YXRjaF9pZl9uZWVkZWQocm9vdCk7CisgICAgZm9yIChRT2JqZWN0KiBvYmogOiByb290LT5maW5kQ2hpbGRyZW48UU9iamVjdCo+KCkpIHsKKyAgICAgICAgd2F0Y2hfaWZfbmVlZGVkKG9iaik7CisgICAgICAgIGlmIChjaGlsZF9wcmVkaWNhdGUob2JqKSkgeworICAgICAgICAgICAgb2JqZWN0cy5pbnNlcnQob2JqKTsKKyAgICAgICAgICAgIG9iai0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1TdWJzY3JpYmVycy5lbXBsYWNlKGV2ZW50X3R5cGVzLCBzdGQ6Om1vdmUob2JqZWN0cyksIGNhbGxiYWNrKTsKK30KKworYm9vbCBFdmVudENhcHR1cmVyOjpldmVudEZpbHRlcihRT2JqZWN0KiB0YXJnZXQsIFFFdmVudCogZXZlbnQpIHsKKyAgICAvLyBJbmRpY2F0ZXMgd2hldGhlciB8dGFyZ2V0fCBzdGlsbCBoYXMgYW55IHN1YnNjcmliZXJzCisgICAgLy8gaW50ZXJlc3RlZCBpbiBpdHMgZXZlbnRzLgorICAgIGJvb2wgaGFzX3N1YnNjcmliZXJzID0gZmFsc2U7CisKKyAgICBmb3IgKGF1dG8mIHN1YnNjcmliZXIgOiBtU3Vic2NyaWJlcnMpIHsKKyAgICAgICAgaWYgKHN1YnNjcmliZXIub2JqZWN0cy5jb3VudCh0YXJnZXQpKSB7CisgICAgICAgICAgICBoYXNfc3Vic2NyaWJlcnMgPSB0cnVlOworICAgICAgICAgICAgaWYoc3Vic2NyaWJlci5ldmVudF90eXBlcy5jb3VudChldmVudC0+dHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY2FsbGJhY2sodGFyZ2V0LCBldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWhhc19zdWJzY3JpYmVycykgeworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gc3Vic2NyaWJlcnMgaW50ZXJlc3RlZCBpbiBldmVudHMgZnJvbQorICAgICAgICAvLyB0aGlzIG9iamVjdCwgaXQgaXMgc2FmZSB0byByZW1vdmUgdGhlIGV2ZW50IGZpbHRlciBmb3IKKyAgICAgICAgLy8gaXQuCisgICAgICAgIHRhcmdldC0+cmVtb3ZlRXZlbnRGaWx0ZXIodGhpcyk7CisgICAgfQorCisgICAgcmV0dXJuIFFPYmplY3Q6OmV2ZW50RmlsdGVyKHRhcmdldCwgZXZlbnQpOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1jYXB0dXJlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtY2FwdHVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZhN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtY2FwdHVyZXIuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9TdWJzY3JpYmVyTGlzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9xdC1zdGQtaGFzaC5oIgorCisjaW5jbHVkZSA8UUV2ZW50PgorI2luY2x1ZGUgPFFPYmplY3Q+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisvLyBVc2UgdGhpcyBjbGFzcyB0byAic3B5IiBvbiBldmVudHMgcmVjZWl2ZWQgYnkgb3RoZXIgb2JqZWN0cy4KKy8vIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLiBBbGwgc3Vic2NyaWJlcnMgc2hvdWxkIGJlIG9uCisvLyB0aGUgVUkgdGhyZWFkLgorY2xhc3MgRXZlbnRDYXB0dXJlciA6IHB1YmxpYyBRT2JqZWN0IHsKK1FfT0JKRUNUCitwdWJsaWM6CisgICAgdXNpbmcgQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUU9iamVjdCosIGNvbnN0IFFFdmVudCopPjsKKyAgICB1c2luZyBPYmplY3RQcmVkaWNhdGUgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgUU9iamVjdCopPjsKKyAgICB1c2luZyBFdmVudFR5cGVTZXQgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8UUV2ZW50OjpUeXBlPjsKKyAgICB1c2luZyBTdWJzY3JpYmVyVG9rZW4gPSBhbmRyb2lkOjpiYXNlOjpTdWJzY3JpcHRpb25Ub2tlbjsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgU3Vic2NyaWJlckluZm8geworICAgICAgICAvLyBXaGF0IHR5cGVzIG9mIGV2ZW50cyB0aGUgc3Vic2NyaWJlciB3YW50cy4KKyAgICAgICAgRXZlbnRUeXBlU2V0IGV2ZW50X3R5cGVzOworCisgICAgICAgIC8vIFdoYXQgb2JqZWN0cyB0aGUgc3Vic2NyaWJlciB3YW50cyB0byBtb25pdG9yLgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8UU9iamVjdCo+IG9iamVjdHM7CisKKyAgICAgICAgLy8gQ2FsbGJhY2sgcHJvdmlkZWQgYnkgdGhlIHN1YnNjcmliZXIuCisgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrOworCisgICAgICAgIFN1YnNjcmliZXJJbmZvKEV2ZW50VHlwZVNldCBlLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8UU9iamVjdCo+IG8sCisgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGMpCisgICAgICAgICAgICA6IGV2ZW50X3R5cGVzKGUpLCBvYmplY3RzKG8pLCBjYWxsYmFjayhjKSB7fQorICAgIH07CisKK3B1YmxpYzoKKyAgICBFdmVudENhcHR1cmVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkV2ZW50Q2FwdHVyZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBFbnN1cmVzIHRoYXQgfGNhbGxiYWNrfCBpcyBpbnZva2VkIGZvciBldmVyeSBldmVudCB0aGF0IG1lZXRzCisgICAgLy8gdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6CisgICAgLy8gICAxLiBUaGUgZXZlbnQgaXMgdHJpZ2dlcmVkIGZvciBhbiBvYmplY3QgdGhhdCBpcyBwYXJ0CisgICAgLy8gICAgICBvZiB8cm9vdHwncyBoaWVyYXJjaHkuCisgICAgLy8gICAyLiB8Y2hpbGRfZmlsdGVyfCB3YXMgdHJ1ZSBmb3IgdGhhdCBvYmplY3QgYXQgdGhlIG1vbWVudAorICAgIC8vICAgICAgfHN1YnNjcmliZVRvRXZlbnRzfCB3YXMgY2FsbGVkLgorICAgIC8vICAgMy4gVGhlIGV2ZW50J3MgdHlwZSBpcyBvbmUgb2YgdGhvc2UgbGlzdGVkIGluIHxldmVudF90eXBlc3wuCisgICAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIG5vbi1jb3B5YWJsZSwgbW92YWJsZSwgb3BhcXVlIHRva2VuLgorICAgIC8vIFdoZW4gdGhhdCB0b2tlbiBpcyBkZXN0cm95ZWQgKGkuZS4gYnkgZ29pbmcgb3V0IG9mIHNjb3BlKSwKKyAgICAvLyBldmVudHMgd2lsbCBubyBsb25nZXIgYmUgZGVsaXZlcmVkIHRvIHRoZSBzdWJzY3JpYmVyLgorICAgIFN1YnNjcmliZXJUb2tlbiBzdWJzY3JpYmVUb0V2ZW50cygKKyAgICAgICAgICAgIFFPYmplY3QqIHJvb3QsCisgICAgICAgICAgICBjb25zdCBPYmplY3RQcmVkaWNhdGUmIGNoaWxkX2ZpbHRlciwKKyAgICAgICAgICAgIGNvbnN0IEV2ZW50VHlwZVNldCYgZXZlbnRfdHlwZXMsCisgICAgICAgICAgICBjb25zdCBDYWxsYmFjayYgY2FsbGJhY2spOworCitwcml2YXRlOgorICAgIC8vIEludGVyY2VwdHMgdGhlIGV2ZW50cyBmcm9tIG1vbml0b3JlZCBvYmplY3RzLgorICAgIGJvb2wgZXZlbnRGaWx0ZXIoUU9iamVjdCogdGFyZ2V0LCBRRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKworICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgc3Vic2NyaWJlcnMuCisgICAgYW5kcm9pZDo6YmFzZTo6U3Vic2NyaWJlckxpc3Q8U3Vic2NyaWJlckluZm8+IG1TdWJzY3JpYmVyczsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFdmVudENhcHR1cmVyKTsKK307CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXF0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk5YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtcXQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaW5jbHVkZSA8UVNlbWFwaG9yZT4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9ldmVudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9rZXljb2RlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvdXRmOF91dGlscy5oIgorCisjZGVmaW5lICBERUJVRyAgMQorCisjaWYgREVCVUcKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjZGVmaW5lICBEKC4uLikgICBWRVJCT1NFX1BSSU5UKHN1cmZhY2UsX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSAgRCguLi4pICAgKCh2b2lkKTApCisjZW5kaWYKKworZXh0ZXJuIGJvb2wgc2tpbl9ldmVudF9wb2xsKFNraW5FdmVudCogZXZlbnQpIHsKKyAgICBFbXVsYXRvclF0V2luZG93ICp3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghd2luZG93KSByZXR1cm4gZmFsc2U7CisgICAgYm9vbCByZXR2YWw7CisgICAgd2luZG93LT5wb2xsRXZlbnQoZXZlbnQsICZyZXR2YWwpOworICAgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1zZXJpYWxpemVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXNlcmlhbGl6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxN2Y1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1zZXJpYWxpemVyLmNwcApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9ldmVudC1zZXJpYWxpemVyLmgiCisKKyNpbmNsdWRlIDxRRW50ZXJFdmVudD4KKyNpbmNsdWRlIDxRRXZlbnQ+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CisjaW5jbHVkZSA8UVJlc2l6ZUV2ZW50PgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKwordm9pZCBzZXJpYWxpemVFdmVudFRvU3RyZWFtKHN0ZDo6b3N0cmVhbSYgc3RyLCBjb25zdCBRRXZlbnQqIGV2ZW50KSB7CisgICAgc3dpdGNoIChldmVudC0+dHlwZSgpKSB7CisgICAgY2FzZSBRRXZlbnQ6OkVudGVyOgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBRRW50ZXJFdmVudCogZW50ZXJfZXZlbnQgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgUUVudGVyRXZlbnQqPihldmVudCk7CisgICAgICAgICAgICBhc3NlcnQoZW50ZXJfZXZlbnQpOworICAgICAgICAgICAgc3RyIDw8IGVudGVyX2V2ZW50LT5sb2NhbFBvcygpLngoKSA8PCAiICIgPDwgZW50ZXJfZXZlbnQtPmxvY2FsUG9zKCkueSgpIDw8ICIgIgorICAgICAgICAgICAgICAgIDw8IGVudGVyX2V2ZW50LT53aW5kb3dQb3MoKS54KCkgPDwgIiAiIDw8IGVudGVyX2V2ZW50LT53aW5kb3dQb3MoKS55KCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgZW50ZXJfZXZlbnQtPnNjcmVlblBvcygpLngoKSA8PCAiICIgPDwgZW50ZXJfZXZlbnQtPnNjcmVlblBvcygpLnkoKSA8PCAiICI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvblByZXNzOgorICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IFFNb3VzZUV2ZW50KiBtb3VzZV9ldmVudCA9IGR5bmFtaWNfY2FzdDxjb25zdCBRTW91c2VFdmVudCo+KGV2ZW50KTsKKyAgICAgICAgICAgIGFzc2VydChtb3VzZV9ldmVudCk7CisgICAgICAgICAgICBzdHIgPDwgbW91c2VfZXZlbnQtPmxvY2FsUG9zKCkueCgpIDw8ICIgIiA8PCBtb3VzZV9ldmVudC0+bG9jYWxQb3MoKS55KCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgbW91c2VfZXZlbnQtPndpbmRvd1BvcygpLngoKSA8PCAiICIgPDwgbW91c2VfZXZlbnQtPndpbmRvd1BvcygpLnkoKSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCBtb3VzZV9ldmVudC0+c2NyZWVuUG9zKCkueCgpIDw8ICIgIiA8PCBtb3VzZV9ldmVudC0+c2NyZWVuUG9zKCkueSgpIDw8ICIgIgorICAgICAgICAgICAgICAgIDw8IG1vdXNlX2V2ZW50LT5idXR0b25zKCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgbW91c2VfZXZlbnQtPm1vZGlmaWVycygpIDw8ICIgIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBRRXZlbnQ6OlJlc2l6ZToKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgUVJlc2l6ZUV2ZW50KiByZXNpemVfZXZlbnQgPSBkeW5hbWljX2Nhc3Q8Y29uc3QgUVJlc2l6ZUV2ZW50Kj4oZXZlbnQpOworICAgICAgICAgICAgYXNzZXJ0KHJlc2l6ZV9ldmVudCk7CisgICAgICAgICAgICBzdHIgPDwgcmVzaXplX2V2ZW50LT5zaXplKCkud2lkdGgoKSA8PCAiICIgPDwgcmVzaXplX2V2ZW50LT5zaXplKCkuaGVpZ2h0KCkgPDwgIiAiCisgICAgICAgICAgICAgICAgPDwgcmVzaXplX2V2ZW50LT5vbGRTaXplKCkud2lkdGgoKSA8PCAiICIgPDwgcmVzaXplX2V2ZW50LT5vbGRTaXplKCkuaGVpZ2h0KCkgPDwgIiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFFFdmVudDo6Q2xvc2U6CisgICAgY2FzZSBRRXZlbnQ6OkxlYXZlOgorICAgIGNhc2UgUUV2ZW50OjpGb2N1c0luOgorICAgIGNhc2UgUUV2ZW50OjpGb2N1c091dDoKKyAgICBjYXNlIFFFdmVudDo6SGlkZToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3RyIDw8ICI8dW5zdXBwb3J0ZWQgYnkgc2VyaWFsaXplcj4iOworICAgIH0KKyAgICBzdHIgPDwgIlxuIjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1zZXJpYWxpemVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1zZXJpYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYzQyYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXNlcmlhbGl6ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC91aS1ldmVudC1yZWNvcmRlci5oIgorCisjaW5jbHVkZSA8UUV2ZW50PgorI2luY2x1ZGUgPFFNZXRhRW51bT4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OmVuYWJsZV9pZl9jb252ZXJ0aWJsZTsKKwordm9pZCBzZXJpYWxpemVFdmVudFRvU3RyZWFtKHN0ZDo6b3N0cmVhbSYsIGNvbnN0IFFFdmVudCopOworCit0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyVHlwZT4KK3N0ZDo6c3RyaW5nIHNlcmlhbGl6ZUV2ZW50cygKKyAgICAgICAgY29uc3QgQ29udGFpbmVyVHlwZSYgY29udGFpbmVyLAorICAgICAgICBlbmFibGVfaWZfY29udmVydGlibGU8CisgICAgICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUeXBlOjp2YWx1ZV90eXBlLAorICAgICAgICAgICAgRXZlbnRSZWNvcmQ+ID0gbnVsbHB0cikgeworICAgIHN0YXRpYyBpbnQgZXZlbnRfZW51bV9pbmRleCA9CisgICAgICAgIFFFdmVudDo6c3RhdGljTWV0YU9iamVjdC5pbmRleE9mRW51bWVyYXRvcigiVHlwZSIpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHI7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluZXIuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgYXV0byYgZXZlbnQgPSBjb250YWluZXJbaV0uZXZlbnQ7CisgICAgICAgIGlmIChldmVudCkgeworICAgICAgICAgICAgc3RyIDw8IGNvbnRhaW5lcltpXS50YXJnZXRfbmFtZSA8PCAiICIKKyAgICAgICAgICAgICAgICA8PCBRRXZlbnQ6OnN0YXRpY01ldGFPYmplY3QuZW51bWVyYXRvcihldmVudF9lbnVtX2luZGV4KS52YWx1ZVRvS2V5KGV2ZW50LT50eXBlKCkpIDw8ICIgIjsKKyAgICAgICAgICAgIHNlcmlhbGl6ZUV2ZW50VG9TdHJlYW0oc3RyLCBldmVudC5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0ci5zdHIoKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtc3Vic2NyaWJlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9ldmVudC1zdWJzY3JpYmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjYwMDliCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtc3Vic2NyaWJlci5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9ldmVudC1zdWJzY3JpYmVyLmgiCisKK0V2ZW50U3Vic2NyaWJlcjo6RXZlbnRTdWJzY3JpYmVyKEV2ZW50Q2FwdHVyZXIqIGVjYXApIDogbUV2ZW50Q2FwdHVyZXIoZWNhcCkge30KKwordm9pZCBFdmVudFN1YnNjcmliZXI6OnN0YXJ0UmVjb3JkaW5nKFFPYmplY3QqIHRhcmdldCkgeworICAgIGlmIChtRXZlbnRDYXB0dXJlcikgeworICAgICAgICBtVG9rZW5zW3RhcmdldF0gPSBtRXZlbnRDYXB0dXJlci0+c3Vic2NyaWJlVG9FdmVudHMoCisgICAgICAgICAgICAgICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgIFt0aGlzXShjb25zdCBRT2JqZWN0KiBvKXsgcmV0dXJuIHRoaXMtPm9iamVjdFByZWRpY2F0ZShvKTsgfSwKKyAgICAgICAgICAgICAgICBldmVudFR5cGVzKCksCisgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFFPYmplY3QqIHRhcmdldCwgY29uc3QgUUV2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLT5wcm9jZXNzRXZlbnQodGFyZ2V0LCBldmVudCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGNvbm5lY3QodGFyZ2V0LCBTSUdOQUwoZGVzdHJveWVkKCkpLCB0aGlzLCBTTE9UKHN0b3BSZWNvcmRpbmdGb3JFbWl0dGVyKCkpKTsKKyAgICB9Cit9CisKK3ZvaWQgRXZlbnRTdWJzY3JpYmVyOjpzdG9wUmVjb3JkaW5nKFFPYmplY3QqIHRhcmdldCkgeworICAgIG1Ub2tlbnMuZXJhc2UodGFyZ2V0KTsKK30KKwordm9pZCBFdmVudFN1YnNjcmliZXI6OnN0b3BSZWNvcmRpbmdGb3JFbWl0dGVyKCkgeworICAgIGlmIChhdXRvIHRhcmdldCA9IHNlbmRlcigpKSB7CisgICAgICAgIHN0b3BSZWNvcmRpbmcodGFyZ2V0KTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXN1YnNjcmliZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V2ZW50LXN1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRjMWExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXZlbnQtc3Vic2NyaWJlci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V2ZW50LWNhcHR1cmVyLmgiCisKKyNpbmNsdWRlIDxRT2JqZWN0PgorI2luY2x1ZGUgPFFQb2ludGVyPgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworLy8gVGhpcyBpcyBhIHN1Z2dlc3RlZCBiYXNlIGNsYXNzIGZvciBhbGwgY2xpZW50cyBvZiBFdmVudENhcHR1cmVyLgorLy8gVGhleSdyZSBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgdG8gdXNlIGl0LCBidXQgaXQgbWFrZXMgdGhpbmdzCisvLyBlYXNpZXIgYnkgY29tcGxldGVseSBtYW5hZ2luZyBzdWJzY3JpcHRpb24vdW5zdWJzY3JpcHRpb24uCisvLyBPbmx5IDMgdGhpbmdzIGFyZSByZXF1aXJlZCBmcm9tIGNsaWVudHM6CisvLyAgMS4gVGhlIGxvZ2ljIGZvciBwcm9jZXNzaW5nIGludGVyY2VwdGVkIGV2ZW50cyAoc2VlCisvLyAgICAgfHByb2Nlc3NFdmVudHwuCisvLyAgMi4gQSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdGhpcyBjbGllbnQgaXMKKy8vICAgICBpbnRlcmVzdGVkIGluIG1vbml0b3JpbmcgYSBnaXZlbiBvYmplY3QgKHNlZSB8b2JqZWN0UHJlZGljYXRlfCkuCisvLyAgMy4gVGhlIHNldCBvZiB0eXBlcyBvZiBldmVudHMgdGhhdCB0aGUgc3Vic2NyaWJlciBpcyBpbnRlcmVzdGVkIGluCisvLyAgICAgKHNlZSB8ZXZlbnRUeXBlc3wpLgorY2xhc3MgRXZlbnRTdWJzY3JpYmVyIDogcHVibGljIFFPYmplY3QgeworUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICAvLyBDcmVhdGVzIGEgbmV3IHN1YnNjcmliZXIgYmFzZWQgb24gdGhlIGdpdmVuIEV2ZW50Q2FwdHVyZXIuCisgICAgZXhwbGljaXQgRXZlbnRTdWJzY3JpYmVyKEV2ZW50Q2FwdHVyZXIqIGVjYXApOworICAgIHZpcnR1YWwgfkV2ZW50U3Vic2NyaWJlcigpe30KKworcHVibGljIHNsb3RzOgorICAgIC8vIFN0YXJ0cyBtb25pdG9yaW5nIGV2ZW50cyBmcm9tIHRoZSBoaWVyYXJjaHkgb2YgYSBnaXZlbiBvYmplY3QuCisgICAgLy8gV2hlbiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGRlc3Ryb3llZCwgdW5zdWJzY3JpcHRpb24gd2lsbCBoYXBwZW4KKyAgICAvLyBhdXRvbWF0aWNhbGx5LgorICAgIHZvaWQgc3RhcnRSZWNvcmRpbmcoUU9iamVjdCogdGFyZ2V0KTsKKworICAgIC8vIFN0b3BzIG1vbml0b3JpbmcgZXZlbnRzIGZyb20gdGhlIGdpdmVuIG9iamVjdCdzIGhpZXJhcmNoeS4KKyAgICAvLyBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBzdWJzY3JpYmVyIHdhcyBub3QgcHJldmlvdXNseQorICAgIC8vIHN1YnNjcmliZWQgdG8gdGhlIGV2ZW50cyBmcm9tIHRoYXQgb2JqZWN0LgorICAgIHZvaWQgc3RvcFJlY29yZGluZyhRT2JqZWN0KiB0YXJnZXQpOworCisgICAgLy8gVGhlIGVmZmVjdCBvZiB0aGlzIHNsb3QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoZSBwcmV2aW91cyBtZXRob2QKKyAgICAvLyB3aXRoIGl0cyBwYXJhbWV0ZXIgc2V0IHRvIHRoZSBvYmplY3QgdGhhdCBlbWl0dGVkIHRoZSB0cmlnZ2VyaW5nIHNpZ25hbC4KKyAgICAvLyBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IHdoZW4gY2FsbGVkIGRpcmVjdGx5LgorICAgIHZvaWQgc3RvcFJlY29yZGluZ0ZvckVtaXR0ZXIoKTsKKworcHJpdmF0ZToKKyAgICAvLyBDaGlsZCBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlaXIgZXZlbnQgcHJvY2Vzc2luZyBsb2dpYyBpbiB0aGlzCisgICAgLy8gbWV0aG9kLgorICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRXZlbnQoY29uc3QgUU9iamVjdCogdGFyZ2V0LCBjb25zdCBRRXZlbnQqIGV2ZW50KSA9IDA7CisKKyAgICAvLyBDaGlsZCBjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRydWUgaWYgdGhleSdyZQorICAgIC8vIGludGVyZXN0ZWQgaW4gaW50ZXJjZXB0aW5nIGV2ZW50cyBmcm9tIHRoZSBnaXZlbiBvYmplY3QuCisgICAgdmlydHVhbCBib29sIG9iamVjdFByZWRpY2F0ZShjb25zdCBRT2JqZWN0KiBvYmplY3QpIGNvbnN0ID0gMDsKKworICAgIC8vIENoaWxkIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZXR1cm4gdGhlIHNldCBvZiB0eXBlcworICAgIC8vIG9mIGV2ZW50cyB0aGV5J3JlIGludGVyZXN0ZWQgaW4uCisgICAgdmlydHVhbCBjb25zdCBFdmVudENhcHR1cmVyOjpFdmVudFR5cGVTZXQmIGV2ZW50VHlwZXMoKSBjb25zdCA9IDA7CisKK3ByaXZhdGU6CisgICAgUVBvaW50ZXI8RXZlbnRDYXB0dXJlcj4gbUV2ZW50Q2FwdHVyZXI7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPFFPYmplY3QqLCBFdmVudENhcHR1cmVyOjpTdWJzY3JpYmVyVG9rZW4+IG1Ub2tlbnM7Cit9OworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9iYXR0ZXJ5LXBhZ2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc1NWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLmNwcApAQCAtMCwwICsxLDEzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9iYXR0ZXJ5LXBhZ2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvYmF0dGVyeV9hZ2VudC5oIgorI2luY2x1ZGUgInVpX2JhdHRlcnktcGFnZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCitCYXR0ZXJ5UGFnZTo6QmF0dGVyeVBhZ2UoUVdpZGdldCAqcGFyZW50KSA6CisgICAgUVdpZGdldChwYXJlbnQpLAorICAgIG1VaShuZXcgVWk6OkJhdHRlcnlQYWdlKCkpLAorICAgIG1CYXR0ZXJ5QWdlbnQobnVsbHB0cikKK3sKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEJhdHRlcnlDaGFyZ2VyLCBzdGQ6OnN0cmluZz4+IGNoYXJnaW5nQXNzb2NpYXRpb25zID0KKyAgICB7CisgICAgICAgIHsgQkFUVEVSWV9DSEFSR0VSX05PTkUsICAgICAiTm9uZSJ9LAorICAgICAgICB7IEJBVFRFUllfQ0hBUkdFUl9BQywgICAgICAgIkFDIGNoYXJnZXIifSwKKyAgICAgICAgLy8gVE9ETzogVGhlIFVJIG9ubHkgYWxsb3dzIE5PTkUgYW5kIEFDLgorICAgICAgICAvLyBOZWVkIHRvIGFsc28gYWxsb3cgYW5kIGltcGxlbWVudCBVU0IgYW5kIFdJUkVMRVNTLgorICAgICAgICAvLyAgeyBCQVRURVJZX0NIQVJHRVJfVVNCLCAgICAgICJVU0IgY2hhcmdlciIgICAgICB9LAorICAgICAgICAvLyAgeyBCQVRURVJZX0NIQVJHRVJfV0lSRUxFU1MsICJXaXJlbGVzcyBjaGFyZ2VyIiB9CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QmF0dGVyeUhlYWx0aCwgc3RkOjpzdHJpbmc+PiBoZWFsdGhBc3NvY2lhdGlvbnMgPQorICAgIHsKKyAgICAgICAgeyBCQVRURVJZX0hFQUxUSF9HT09ELCAgICAgICAgIkdvb2QifSwKKyAgICAgICAgeyBCQVRURVJZX0hFQUxUSF9GQUlMRUQsICAgICAgIkZhaWxlZCJ9LAorICAgICAgICB7IEJBVFRFUllfSEVBTFRIX0RFQUQsICAgICAgICAiRGVhZCJ9LAorICAgICAgICB7IEJBVFRFUllfSEVBTFRIX09WRVJWT0xUQUdFLCAiT3ZlcnZvbHRhZ2UifSwKKyAgICAgICAgeyBCQVRURVJZX0hFQUxUSF9PVkVSSEVBVEVELCAgIk92ZXJoZWF0ZWQifSwKKyAgICAgICAgeyBCQVRURVJZX0hFQUxUSF9VTktOT1dOLCAgICAgIlVua25vd24ifSwKKyAgICB9OworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxCYXR0ZXJ5U3RhdHVzLCBzdGQ6OnN0cmluZz4+IHN0YXR1c0Fzc29jaWF0aW9ucyA9CisgICAgeworICAgICAgICB7IEJBVFRFUllfU1RBVFVTX1VOS05PV04sICAgICAgIlVua25vd24iICAgICAgfSwKKyAgICAgICAgeyBCQVRURVJZX1NUQVRVU19DSEFSR0lORywgICAgICJDaGFyZ2luZyIgICAgIH0sCisgICAgICAgIHsgQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkcsICAiRGlzY2hhcmdpbmciICB9LAorICAgICAgICB7IEJBVFRFUllfU1RBVFVTX05PVF9DSEFSR0lORywgIk5vdCBjaGFyZ2luZyIgfSwKKyAgICAgICAgeyBCQVRURVJZX1NUQVRVU19GVUxMLCAgICAgICAgICJGdWxsIiAgICAgICAgIH0sCisgICAgfTsKKworICAgIG1VaS0+c2V0dXBVaSh0aGlzKTsKKyAgICBwb3B1bGF0ZUxpc3RCb3goY2hhcmdpbmdBc3NvY2lhdGlvbnMsIG1VaS0+YmF0X2NoYXJnZXJCb3gpOworICAgIHBvcHVsYXRlTGlzdEJveChoZWFsdGhBc3NvY2lhdGlvbnMsIG1VaS0+YmF0X2hlYWx0aEJveCk7CisgICAgcG9wdWxhdGVMaXN0Qm94KHN0YXR1c0Fzc29jaWF0aW9ucywgbVVpLT5iYXRfc3RhdHVzQm94KTsKK30KKwordm9pZCBCYXR0ZXJ5UGFnZTo6c2V0QmF0dGVyeUFnZW50KGNvbnN0IFFBbmRyb2lkQmF0dGVyeUFnZW50KiBhZ2VudCkgeworICAgIG1CYXR0ZXJ5QWdlbnQgPSBhZ2VudDsKKworICAgIC8vIFVwZGF0ZSB0aGUgVUkgd2l0aCB2YWx1ZXMgcmVhZCBmcm9tIHRoZSBiYXR0ZXJ5IGFnZW50LgorCisgICAgaW50IGNoYXJnZUxldmVsID0gNTA7CisgICAgaWYgKG1CYXR0ZXJ5QWdlbnQgJiYgIG1CYXR0ZXJ5QWdlbnQtPmNoYXJnZUxldmVsKSB7CisgICAgICAgIGNoYXJnZUxldmVsID0gbUJhdHRlcnlBZ2VudC0+Y2hhcmdlTGV2ZWwoKTsKKyAgICB9CisgICAgbVVpLT5iYXRfbGV2ZWxTbGlkZXItPnNldFZhbHVlKGNoYXJnZUxldmVsKTsKKworICAgIEJhdHRlcnlDaGFyZ2VyIGJDaGFyZ2VyID0gQkFUVEVSWV9DSEFSR0VSX0FDOworICAgIGlmIChtQmF0dGVyeUFnZW50ICYmICBtQmF0dGVyeUFnZW50LT5jaGFyZ2VyKSB7CisgICAgICAgIGJDaGFyZ2VyID0gbUJhdHRlcnlBZ2VudC0+Y2hhcmdlcigpOworICAgIH0KKyAgICBpbnQgY2hhcmdlSWR4ID0gbVVpLT5iYXRfY2hhcmdlckJveC0+ZmluZERhdGEoYkNoYXJnZXIpOworICAgIGlmIChjaGFyZ2VJZHggPCAwKSBjaGFyZ2VJZHggPSAwOyAvLyBJbiBjYXNlIHRoZSBzYXZlZCB2YWx1ZSB3YXNuJ3QgZm91bmQKKyAgICBtVWktPmJhdF9jaGFyZ2VyQm94LT5zZXRDdXJyZW50SW5kZXgoY2hhcmdlSWR4KTsKKworICAgIEJhdHRlcnlIZWFsdGggYkhlYWx0aCA9IEJBVFRFUllfSEVBTFRIX1VOS05PV047CisgICAgaWYgKG1CYXR0ZXJ5QWdlbnQgJiYgIG1CYXR0ZXJ5QWdlbnQtPmhlYWx0aCkgeworICAgICAgICBiSGVhbHRoID0gbUJhdHRlcnlBZ2VudC0+aGVhbHRoKCk7CisgICAgfQorICAgIGludCBoZWFsdGhJZHggPSBtVWktPmJhdF9oZWFsdGhCb3gtPmZpbmREYXRhKGJIZWFsdGgpOworICAgIGlmIChoZWFsdGhJZHggPCAwKSBoZWFsdGhJZHggPSAwOyAvLyBJbiBjYXNlIHRoZSBzYXZlZCB2YWx1ZSB3YXNuJ3QgZm91bmQKKyAgICBtVWktPmJhdF9oZWFsdGhCb3gtPnNldEN1cnJlbnRJbmRleChoZWFsdGhJZHgpOworCisgICAgQmF0dGVyeVN0YXR1cyBiU3RhdHVzID0gQkFUVEVSWV9TVEFUVVNfVU5LTk9XTjsKKyAgICBpZiAobUJhdHRlcnlBZ2VudCAmJiAgbUJhdHRlcnlBZ2VudC0+c3RhdHVzKSB7CisgICAgICAgIGJTdGF0dXMgPSBtQmF0dGVyeUFnZW50LT5zdGF0dXMoKTsKKyAgICB9CisgICAgaW50IHN0YXR1c0lkeCA9IG1VaS0+YmF0X3N0YXR1c0JveC0+ZmluZERhdGEoYlN0YXR1cyk7CisgICAgaWYgKHN0YXR1c0lkeCA8IDApIHN0YXR1c0lkeCA9IDA7IC8vIEluIGNhc2UgdGhlIHNhdmVkIHZhbHVlIHdhc24ndCBmb3VuZAorICAgIG1VaS0+YmF0X3N0YXR1c0JveC0+c2V0Q3VycmVudEluZGV4KHN0YXR1c0lkeCk7Cit9CisKK3ZvaWQgQmF0dGVyeVBhZ2U6Om9uX2JhdF9jaGFyZ2VyQm94X2FjdGl2YXRlZChpbnQgaW5kZXgpCit7CisgICAgQmF0dGVyeUNoYXJnZXIgYkNoYXJnZXIgPSBzdGF0aWNfY2FzdDxCYXR0ZXJ5Q2hhcmdlcj4oCisgICAgICAgICAgICBtVWktPmJhdF9zdGF0dXNCb3gtPml0ZW1EYXRhKGluZGV4KS50b0ludCgpICk7CisKKyAgICBpZiAoYkNoYXJnZXIgPj0gMCAmJiBiQ2hhcmdlciA8IEJBVFRFUllfQ0hBUkdFUl9OVU1fRU5UUklFUykgeworICAgICAgICBpZiAobUJhdHRlcnlBZ2VudCAmJiBtQmF0dGVyeUFnZW50LT5zZXRDaGFyZ2VyKSB7CisgICAgICAgICAgICBtQmF0dGVyeUFnZW50LT5zZXRDaGFyZ2VyKGJDaGFyZ2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5UGFnZTo6b25fYmF0X2xldmVsU2xpZGVyX3ZhbHVlQ2hhbmdlZChpbnQgdmFsdWUpCit7CisgICAgLy8gVXBkYXRlIHRoZSB0ZXh0IG91dHB1dAorICAgIG1VaS0+YmF0X2NoYXJnZUxldmVsVGV4dC0+c2V0VGV4dChRU3RyaW5nOjpudW1iZXIodmFsdWUpKyIlIik7CisKKyAgICBpZiAobUJhdHRlcnlBZ2VudCAmJiBtQmF0dGVyeUFnZW50LT5zZXRDaGFyZ2VMZXZlbCkgeworICAgICAgICBtQmF0dGVyeUFnZW50LT5zZXRDaGFyZ2VMZXZlbCh2YWx1ZSk7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlQYWdlOjpvbl9iYXRfaGVhbHRoQm94X2FjdGl2YXRlZChpbnQgaW5kZXgpCit7CisgICAgQmF0dGVyeUhlYWx0aCBiSGVhbHRoID0gc3RhdGljX2Nhc3Q8QmF0dGVyeUhlYWx0aD4oCisgICAgICAgICAgICBtVWktPmJhdF9oZWFsdGhCb3gtPml0ZW1EYXRhKGluZGV4KS50b0ludCgpICk7CisKKyAgICBpZiAoYkhlYWx0aCA+PSAwICYmIGJIZWFsdGggPCBCQVRURVJZX0hFQUxUSF9OVU1fRU5UUklFUykgeworICAgICAgICBpZiAobUJhdHRlcnlBZ2VudCAmJiBtQmF0dGVyeUFnZW50LT5zZXRIZWFsdGgpIHsKKyAgICAgICAgICAgIG1CYXR0ZXJ5QWdlbnQtPnNldEhlYWx0aChiSGVhbHRoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5UGFnZTo6b25fYmF0X3N0YXR1c0JveF9hY3RpdmF0ZWQoaW50IGluZGV4KQoreworICAgIEJhdHRlcnlTdGF0dXMgYlN0YXR1cyA9IHN0YXRpY19jYXN0PEJhdHRlcnlTdGF0dXM+KAorICAgICAgICAgICAgbVVpLT5iYXRfc3RhdHVzQm94LT5pdGVtRGF0YShpbmRleCkudG9JbnQoKSApOworCisgICAgaWYgKGJTdGF0dXMgPj0gMCAmJiBiU3RhdHVzIDwgQkFUVEVSWV9TVEFUVVNfTlVNX0VOVFJJRVMpIHsKKyAgICAgICAgaWYgKG1CYXR0ZXJ5QWdlbnQgJiYgbUJhdHRlcnlBZ2VudC0+c2V0U3RhdHVzKSB7CisgICAgICAgICAgICAgICAgbUJhdHRlcnlBZ2VudC0+c2V0U3RhdHVzKGJTdGF0dXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9iYXR0ZXJ5LXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzdhNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ1aV9iYXR0ZXJ5LXBhZ2UuaCIKKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworc3RydWN0IFFBbmRyb2lkQmF0dGVyeUFnZW50OworY2xhc3MgQmF0dGVyeVBhZ2UgOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCYXR0ZXJ5UGFnZShRV2lkZ2V0ICpwYXJlbnQgPSAwKTsKKyAgICB2b2lkIHNldEJhdHRlcnlBZ2VudChjb25zdCBRQW5kcm9pZEJhdHRlcnlBZ2VudCogYWdlbnQpOworCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgb25fYmF0X2NoYXJnZXJCb3hfYWN0aXZhdGVkKGludCB2YWx1ZSk7CisgICAgdm9pZCBvbl9iYXRfaGVhbHRoQm94X2FjdGl2YXRlZChpbnQgaW5kZXgpOworICAgIHZvaWQgb25fYmF0X2xldmVsU2xpZGVyX3ZhbHVlQ2hhbmdlZChpbnQgdmFsdWUpOworICAgIHZvaWQgb25fYmF0X3N0YXR1c0JveF9hY3RpdmF0ZWQoaW50IGluZGV4KTsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICB2b2lkIHBvcHVsYXRlTGlzdEJveCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFQsIHN0ZDo6c3RyaW5nPj4mIGFzc29jaWF0aW9ucywKKyAgICAgICAgUUNvbWJvQm94KiBsaXN0KSB7CisgICAgICAgIGxpc3QtPmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYSA6IGFzc29jaWF0aW9ucykgeworICAgICAgICAgICAgbGlzdC0+YWRkSXRlbSh0cihhLnNlY29uZC5jX3N0cigpKSwgYS5maXJzdCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFVpOjpCYXR0ZXJ5UGFnZT4gbVVpOworICAgIGNvbnN0IFFBbmRyb2lkQmF0dGVyeUFnZW50KiBtQmF0dGVyeUFnZW50OworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2JhdHRlcnktcGFnZS51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2JhdHRlcnktcGFnZS51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjc4OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLnVpCkBAIC0wLDAgKzEsMzIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPkJhdHRlcnlQYWdlPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJCYXR0ZXJ5UGFnZSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjYyMjwvd2lkdGg+CisgICAgPGhlaWdodD41ODA8L2hlaWdodD4KKyAgIDwvcmVjdD4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmc+Rm9ybTwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImJhdF9hY0dyb3VwIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4xMzE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkNoYXJnZXIgY29ubmVjdGlvbjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRQ29tYm9Cb3giIG5hbWU9ImJhdF9oZWFsdGhCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjExMjwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkdvb2Q8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkZhaWxlZDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RGVhZDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+T3ZlcnZvbHRhZ2U8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPk92ZXJoZWF0ZWQ8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlVua25vd248L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJiYXRfY2hhcmdlR3JvdXAiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjIwPC95PgorICAgICA8d2lkdGg+MjgwPC93aWR0aD4KKyAgICAgPGhlaWdodD42MTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5DaGFyZ2UgbGV2ZWw8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHdpZGdldCBjbGFzcz0iUVNsaWRlciIgbmFtZT0iYmF0X2xldmVsU2xpZGVyIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICA8cmVjdD4KKyAgICAgIDx4PjA8L3g+CisgICAgICA8eT4zODwveT4KKyAgICAgIDx3aWR0aD4yMjE8L3dpZHRoPgorICAgICAgPGhlaWdodD4yOTwvaGVpZ2h0PgorICAgICA8L3JlY3Q+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWNjZXNzaWJsZU5hbWUiPgorICAgICA8c3RyaW5nPkNoYXJnZSBsZXZlbDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Im1heGltdW0iPgorICAgICA8bnVtYmVyPjEwMDwvbnVtYmVyPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InZhbHVlIj4KKyAgICAgPG51bWJlcj41MDwvbnVtYmVyPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Im9yaWVudGF0aW9uIj4KKyAgICAgPGVudW0+UXQ6Okhvcml6b250YWw8L2VudW0+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgIDwvcHJvcGVydHk+CisgICA8L3dpZGdldD4KKyAgIDx3aWRnZXQgY2xhc3M9IlFMaW5lRWRpdCIgbmFtZT0iYmF0X2NoYXJnZUxldmVsVGV4dCI+CisgICAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZWQiPgorICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgPHJlY3Q+CisgICAgICA8eD4yMjk8L3g+CisgICAgICA8eT4zODwveT4KKyAgICAgIDx3aWR0aD41MTwvd2lkdGg+CisgICAgICA8aGVpZ2h0PjI5PC9oZWlnaHQ+CisgICAgIDwvcmVjdD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICAgPHNpemVwb2xpY3kgaHNpemV0eXBlPSJGaXhlZCIgdnNpemV0eXBlPSJGaXhlZCI+CisgICAgICA8aG9yc3RyZXRjaD4wPC9ob3JzdHJldGNoPgorICAgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgICAgPC9zaXplcG9saWN5PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICA8Zm9udD4KKyAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgIDwvZm9udD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtb3VzZVRyYWNraW5nIj4KKyAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWNjZXB0RHJvcHMiPgorICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sVGlwIj4KKyAgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+NTAlPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWxpZ25tZW50Ij4KKyAgICAgPHNldD5RdDo6QWxpZ25SaWdodHxRdDo6QWxpZ25UcmFpbGluZ3xRdDo6QWxpZ25WQ2VudGVyPC9zZXQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgIDwvcHJvcGVydHk+CisgICA8L3dpZGdldD4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0iYmF0X3N0YXR1c0dyb3VwIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+OTQ8L3k+CisgICAgIDx3aWR0aD4yNTE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkJhdHRlcnkgc3RhdHVzPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDb21ib0JveCIgbmFtZT0iYmF0X3N0YXR1c0JveCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4zMjQ8L3g+CisgICAgIDx5PjExMjwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPjE8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlVua25vd248L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkNoYXJnaW5nPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5EaXNjaGFyZ2luZzwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+Tm90IGNoYXJnaW5nPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5GdWxsPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDb21ib0JveCIgbmFtZT0iYmF0X2NoYXJnZXJCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4zODwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPjE8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ibWF4VmlzaWJsZUl0ZW1zIj4KKyAgICA8bnVtYmVyPjQ8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPk5vbmU8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkFDIGNoYXJnZXI8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJiYXRfaGVhbHRoR3JvdXAiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5Pjk0PC95PgorICAgICA8d2lkdGg+MjQxPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5CYXR0ZXJ5IGhlYWx0aDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorIDwvd2lkZ2V0PgorIDxyZXNvdXJjZXMvPgorIDxjb25uZWN0aW9ucy8+Cis8L3VpPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jZWxsdWxhci1wYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTc0Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jZWxsdWxhcl9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJ1aV9jZWxsdWxhci1wYWdlLmgiCisKKyNpbmNsdWRlIDxRU2V0dGluZ3M+CisKK0NlbGx1bGFyUGFnZTo6Q2VsbHVsYXJQYWdlKFFXaWRnZXQgKnBhcmVudCkgOgorICAgIFFXaWRnZXQocGFyZW50KSwKKyAgICBtVWkobmV3IFVpOjpDZWxsdWxhclBhZ2UoKSksCisgICAgbUNlbGx1bGFyQWdlbnQobnVsbHB0cikKK3sKKyAgICBtVWktPnNldHVwVWkodGhpcyk7CisKKyAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHZhbHVlcworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKworICAgIC8vIE5ldHdvcmsgdHlwZQorICAgIGludCBjU3RhbmRhcmQgPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNFTExVTEFSX05FVFdPUktfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU3RkX2Z1bGwpLnRvSW50KCk7CisgICAgbVVpLT5jZWxsX3N0YW5kYXJkQm94LT5zZXRDdXJyZW50SW5kZXgoY1N0YW5kYXJkKTsKKworICAgIC8vIFNpZ25hbCBzdHJlbmd0aAorICAgIGludCBjU3RyZW5ndGggPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNFTExVTEFSX1NJR05BTF9TVFJFTkdUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU2lnbmFsX01vZGVyYXRlKS50b0ludCgpOworICAgIG1VaS0+Y2VsbF9zaWduYWxTdGF0dXNCb3gtPnNldEN1cnJlbnRJbmRleChjU3RyZW5ndGgpOworCisgICAgLy8gVm9pY2Ugc3RhdHVzCisgICAgaW50IHZvaWNlU3RhdHVzID0gc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9WT0lDRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU3RhdF9Ib21lKS50b0ludCgpOworICAgIG1VaS0+Y2VsbF92b2ljZVN0YXR1c0JveC0+c2V0Q3VycmVudEluZGV4KHZvaWNlU3RhdHVzKTsKKworICAgIC8vIERhdGEgc3RhdHVzCisgICAgaW50IGRhdGFTdGF0dXMgPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNFTExVTEFSX0RBVEFfU1RBVFVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU3RhdF9Ib21lKS50b0ludCgpOworICAgIG1VaS0+Y2VsbF9kYXRhU3RhdHVzQm94LT5zZXRDdXJyZW50SW5kZXgoZGF0YVN0YXR1cyk7Cit9CisKK3ZvaWQgQ2VsbHVsYXJQYWdlOjpzZXRDZWxsdWxhckFnZW50KGNvbnN0IFFBbmRyb2lkQ2VsbHVsYXJBZ2VudCogYWdlbnQpIHsKKworICAgIGlmICghYWdlbnQpIHJldHVybjsKKworICAgIG1DZWxsdWxhckFnZW50ID0gYWdlbnQ7CisKKyAgICBpZiAoZW11bGF0b3JfaGFzX25ldHdvcmtfb3B0aW9uKSB7CisgICAgICAgIC8vIFRoZSB1c2VyIHNwZWNpZmllZCBuZXR3b3JrIHBhcmFtZXRlcnMgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgLy8gRG8gbm90IG92ZXJyaWRlIHRoZSBjb21tYW5kLWxpbmUgdmFsdWVzLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBzZXR0aW5ncyB0aGF0IHdlcmUgcHJldmlvdXNseSBzYXZlZC4gR2l2ZSB0aGVtCisgICAgLy8gdG8gdGhlIGRldmljZS4KKworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKworICAgIC8vIE5ldHdvcmsgdHlwZQorICAgIGludCBjU3RhbmRhcmQgPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNFTExVTEFSX05FVFdPUktfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU3RkX2Z1bGwpLnRvSW50KCk7CisgICAgbUNlbGx1bGFyQWdlbnQtPnNldFN0YW5kYXJkKChDZWxsdWxhclN0YW5kYXJkKWNTdGFuZGFyZCk7CisKKyAgICAvLyBTaWduYWwgc3RyZW5ndGgKKyAgICBpbnQgY1N0cmVuZ3RoID0gc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9TSUdOQUxfU1RSRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbGx1bGFyX1NpZ25hbF9Nb2RlcmF0ZSkudG9JbnQoKTsKKyAgICBtQ2VsbHVsYXJBZ2VudC0+c2V0U2lnbmFsU3RyZW5ndGhQcm9maWxlKChDZWxsdWxhclNpZ25hbCljU3RyZW5ndGgpOworCisgICAgLy8gVm9pY2Ugc3RhdHVzCisgICAgaW50IHZvaWNlU3RhdHVzID0gc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9WT0lDRV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHVsYXJfU3RhdF9Ib21lKS50b0ludCgpOworICAgIG1DZWxsdWxhckFnZW50LT5zZXRWb2ljZVN0YXR1cygoQ2VsbHVsYXJTdGF0dXMpdm9pY2VTdGF0dXMpOworCisgICAgLy8gRGF0YSBzdGF0dXMKKyAgICBpbnQgZGF0YVN0YXR1cyA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6Q0VMTFVMQVJfREFUQV9TVEFUVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsdWxhcl9TdGF0X0hvbWUpLnRvSW50KCk7CisgICAgbUNlbGx1bGFyQWdlbnQtPnNldERhdGFTdGF0dXMoKENlbGx1bGFyU3RhdHVzKWRhdGFTdGF0dXMpOworfQorCit2b2lkIENlbGx1bGFyUGFnZTo6b25fY2VsbF9zdGFuZGFyZEJveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkKK3sKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9ORVRXT1JLX1RZUEUsIGluZGV4KTsKKworICAgIGlmIChtQ2VsbHVsYXJBZ2VudCAmJiBtQ2VsbHVsYXJBZ2VudC0+c2V0U3RhbmRhcmQpIHsKKyAgICAgICAgQ2VsbHVsYXJTdGFuZGFyZCBjU3RhbmRhcmQgPSAoQ2VsbHVsYXJTdGFuZGFyZClpbmRleDsKKyAgICAgICAgbUNlbGx1bGFyQWdlbnQtPnNldFN0YW5kYXJkKGNTdGFuZGFyZCk7CisgICAgfQorfQorCit2b2lkIENlbGx1bGFyUGFnZTo6b25fY2VsbF92b2ljZVN0YXR1c0JveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkKK3sKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9WT0lDRV9TVEFUVVMsIGluZGV4KTsKKworICAgIGlmIChtQ2VsbHVsYXJBZ2VudCAmJiBtQ2VsbHVsYXJBZ2VudC0+c2V0Vm9pY2VTdGF0dXMpIHsKKyAgICAgICAgQ2VsbHVsYXJTdGF0dXMgdlN0YXR1cyA9IChDZWxsdWxhclN0YXR1cylpbmRleDsKKyAgICAgICAgbUNlbGx1bGFyQWdlbnQtPnNldFZvaWNlU3RhdHVzKHZTdGF0dXMpOworICAgIH0KK30KKwordm9pZCBDZWxsdWxhclBhZ2U6Om9uX2NlbGxfZGF0YVN0YXR1c0JveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkKK3sKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpDRUxMVUxBUl9EQVRBX1NUQVRVUywgaW5kZXgpOworCisgICAgaWYgKG1DZWxsdWxhckFnZW50ICYmIG1DZWxsdWxhckFnZW50LT5zZXREYXRhU3RhdHVzKSB7CisgICAgICAgIENlbGx1bGFyU3RhdHVzIGRTdGF0dXMgPSAoQ2VsbHVsYXJTdGF0dXMpaW5kZXg7CisgICAgICAgIG1DZWxsdWxhckFnZW50LT5zZXREYXRhU3RhdHVzKGRTdGF0dXMpOworICAgIH0KK30KKwordm9pZCBDZWxsdWxhclBhZ2U6Om9uX2NlbGxfc2lnbmFsU3RhdHVzQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KQoreworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkNFTExVTEFSX1NJR05BTF9TVFJFTkdUSCwgaW5kZXgpOworCisgICAgaWYgKG1DZWxsdWxhckFnZW50ICYmIG1DZWxsdWxhckFnZW50LT5zZXRTaWduYWxTdHJlbmd0aFByb2ZpbGUpIHsKKyAgICAgICAgQ2VsbHVsYXJTaWduYWwgc2lnbmFsID0gKENlbGx1bGFyU2lnbmFsKWluZGV4OworICAgICAgICBtQ2VsbHVsYXJBZ2VudC0+c2V0U2lnbmFsU3RyZW5ndGhQcm9maWxlKHNpZ25hbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmQ1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jZWxsdWxhci1wYWdlLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInVpX2NlbGx1bGFyLXBhZ2UuaCIKKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworc3RydWN0IFFBbmRyb2lkQ2VsbHVsYXJBZ2VudDsKK2NsYXNzIENlbGx1bGFyUGFnZSA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIGV4cGxpY2l0IENlbGx1bGFyUGFnZShRV2lkZ2V0ICpwYXJlbnQgPSBudWxscHRyKTsKKyAgICB2b2lkIHNldENlbGx1bGFyQWdlbnQoY29uc3QgUUFuZHJvaWRDZWxsdWxhckFnZW50KiBhZ2VudCk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBvbl9jZWxsX2RhdGFTdGF0dXNCb3hfY3VycmVudEluZGV4Q2hhbmdlZChpbnQgaW5kZXgpOworICAgIHZvaWQgb25fY2VsbF9zdGFuZGFyZEJveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCk7CisgICAgdm9pZCBvbl9jZWxsX3ZvaWNlU3RhdHVzQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KTsKKyAgICB2b2lkIG9uX2NlbGxfc2lnbmFsU3RhdHVzQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KTsKKworICAgIC8vIFRPRE86IEltcGxlbWVudCBOZXR3b3JrIGRlbGF5IHNldHRpbmcKKyAgICAvLyBodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Rvb2xzL2RldmljZXMvZW11bGF0b3IuaHRtbCNuZXRkZWxheQorCitwcml2YXRlOgorICAgIHN0ZDo6dW5pcXVlX3B0cjxVaTo6Q2VsbHVsYXJQYWdlPiBtVWk7CisgICAgY29uc3QgUUFuZHJvaWRDZWxsdWxhckFnZW50KiBtQ2VsbHVsYXJBZ2VudDsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jZWxsdWxhci1wYWdlLnVpIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZmNTFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS51aQpAQCAtMCwwICsxLDMwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx1aSB2ZXJzaW9uPSI0LjAiPgorIDxjbGFzcz5DZWxsdWxhclBhZ2U8L2NsYXNzPgorIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9IkNlbGx1bGFyUGFnZSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjYyMjwvd2lkdGg+CisgICAgPGhlaWdodD41ODA8L2hlaWdodD4KKyAgIDwvcmVjdD4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmc+Rm9ybTwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRQ29tYm9Cb3giIG5hbWU9ImNlbGxfc3RhbmRhcmRCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjM4PC95PgorICAgICA8d2lkdGg+MjgwPC93aWR0aD4KKyAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+cGFkZGluZzogM3B4IDNweCAzcHggM3B4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50SW5kZXgiPgorICAgIDxudW1iZXI+NzwvbnVtYmVyPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+R1NNPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5IU0NTRDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+R1BSUzwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RURHRTwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+VU1UUzwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+SFNEUEE8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkxURTwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RnVsbDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImNlbGxfdlN0YXR1c0dyb3VwQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT45NDwveT4KKyAgICAgPHdpZHRoPjExMTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPlZvaWNlIHN0YXR1czwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImNlbGxfZFN0YXR1c0dyb3VwQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+OTQ8L3k+CisgICAgIDx3aWR0aD45MTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkRhdGEgc3RhdHVzPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0iY2VsbF9zdGRHcm91cEJveCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4xMzE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5OZXR3b3JrIHR5cGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJjZWxsX3NpZ25hbEdyb3VwQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4xMzE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5TaWduYWwgc3RyZW5ndGg8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJjZWxsX3ZvaWNlU3RhdHVzQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT4xMTI8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5wYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Ib21lPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Sb2FtaW5nPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5TZWFyY2hpbmc8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkRlbmllZCAoZW1lcmdlbmN5IGNhbGxzIG9ubHkpPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5VbnJlZ2lzdGVyZWQgKG9mZik8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJjZWxsX2RhdGFTdGF0dXNCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4xMTI8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5wYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Ib21lPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Sb2FtaW5nPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5TZWFyY2hpbmc8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkRlbmllZDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+VW5yZWdpc3RlcmVkIChvZmYpPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDb21ib0JveCIgbmFtZT0iY2VsbF9zaWduYWxTdGF0dXNCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4zODwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPjI8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+Tm9uZTwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+UG9vcjwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+TW9kZXJhdGU8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkdvb2Q8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkdyZWF0PC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgPC93aWRnZXQ+CisgPC93aWRnZXQ+CisgPHRhYnN0b3BzPgorICA8dGFic3RvcD5jZWxsX3N0YW5kYXJkQm94PC90YWJzdG9wPgorICA8dGFic3RvcD5jZWxsX3NpZ25hbFN0YXR1c0JveDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+Y2VsbF92b2ljZVN0YXR1c0JveDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+Y2VsbF9kYXRhU3RhdHVzQm94PC90YWJzdG9wPgorIDwvdGFic3RvcHM+CisgPHJlc291cmNlcy8+CisgPGNvbm5lY3Rpb25zLz4KKzwvdWk+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jb21tb24uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTkwZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmNwcApAQCAtMCwwICsxLDE1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9yYWlzZWQtbWF0ZXJpYWwtYnV0dG9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtc2V0dGluZ3MuaCIKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UURpcj4KKyNpbmNsdWRlIDxRU2V0dGluZ3M+CisjaW5jbHVkZSA8UVN0YW5kYXJkUGF0aHM+CisjaW5jbHVkZSA8UVN0cmluZ0xpc3Q+CisjaW5jbHVkZSA8UVRlbXBvcmFyeUZpbGU+CisjaW5jbHVkZSA8UVZhcmlhbnQ+CisKK3ZvaWQgc2V0QnV0dG9uRW5hYmxlZChRUHVzaEJ1dHRvbiogIGJ1dHRvbiwgU2V0dGluZ3NUaGVtZSB0aGVtZSwgYm9vbCBpc0VuYWJsZWQpCit7CisgICAgYnV0dG9uLT5zZXRFbmFibGVkKGlzRW5hYmxlZCk7CisgICAgLy8gSWYgdGhpcyBidXR0b24gaGFzIGljb24gaW1hZ2UgcHJvcGVydGllcywgcmVzZXQgaXRzCisgICAgLy8gaW1hZ2UuCisgICAgUVN0cmluZyBlbmFibGVkUHJvcFN0ciAgPSBidXR0b24tPnByb3BlcnR5KCJ0aGVtZUljb25OYW1lIiAgICAgICAgICkudG9TdHJpbmcoKTsKKyAgICBRU3RyaW5nIGRpc2FibGVkUHJvcFN0ciA9IGJ1dHRvbi0+cHJvcGVydHkoInRoZW1lSWNvbk5hbWVfZGlzYWJsZWQiKS50b1N0cmluZygpOworCisgICAgLy8gR2V0IHRoZSByZXNvdXJjZSBuYW1lIGJhc2VkIG9uIHRoZSBsaWdodC9kYXJrIHRoZW1lCisgICAgUVN0cmluZyByZXNOYW1lID0gIjovIjsKKyAgICByZXNOYW1lICs9IFVpOjpzdHlsZXNoZWV0VmFsdWVzKHRoZW1lKVtVaTo6VEhFTUVfUEFUSF9WQVJdOworICAgIHJlc05hbWUgKz0gIi8iOworCisgICAgaWYgKCFpc0VuYWJsZWQgICYmICAhZGlzYWJsZWRQcm9wU3RyLmlzTnVsbCgpKSB7CisgICAgICAgIC8vIFRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIGhhcyBhIHNwZWNpZmljCisgICAgICAgIC8vIGljb24gZm9yIHdoZW4gaXQgaXMgZGlzYWJsZWQuCisgICAgICAgIC8vIEFwcGx5IHRoaXMgaWNvbiBhbmQgdGVsbCBRdCB0byB1c2UgaXQKKyAgICAgICAgLy8gZGlyZWN0bHkgKGRvbid0IGdyYXkgaXQgb3V0KSBldmVuIHRob3VnaAorICAgICAgICAvLyBpdCBpcyBkaXNhYmxlZC4KKyAgICAgICAgcmVzTmFtZSArPSBkaXNhYmxlZFByb3BTdHI7CisgICAgICAgIFFJY29uIGljb24ocmVzTmFtZSk7CisgICAgICAgIGljb24uYWRkUGl4bWFwKFFQaXhtYXAocmVzTmFtZSksIFFJY29uOjpEaXNhYmxlZCk7CisgICAgICAgIGJ1dHRvbi0+c2V0SWNvbihpY29uKTsKKyAgICB9IGVsc2UgaWYgKCAhZW5hYmxlZFByb3BTdHIuaXNOdWxsKCkgKSB7CisgICAgICAgIC8vIFVzZSB0aGUgJ2VuYWJsZWQnIHZlcnNpb24gb2YgdGhlIGljb24KKyAgICAgICAgLy8gKExldCBRdCBncmV5IHRoZSBpY29uIGlmIGl0IHdhbnRzIHRvKQorICAgICAgICByZXNOYW1lICs9IGVuYWJsZWRQcm9wU3RyOworICAgICAgICBRSWNvbiBpY29uKHJlc05hbWUpOworICAgICAgICBidXR0b24tPnNldEljb24oaWNvbik7CisgICAgfQorfQorCitib29sIGRpcmVjdG9yeUlzV3JpdGFibGUoY29uc3QgUVN0cmluZyYgZGlyTmFtZSkgeworICAgIFFTdHJpbmcgZE5hbWUgPSBRRGlyOjp0b05hdGl2ZVNlcGFyYXRvcnMoZGlyTmFtZSk7CisKKyAgICAvLyBDaGVjayBpZiB0aGlzIHBhdGggaXMgd3JpdGFibGUuIChOb3RlIHRoYXQgUUZpbGVJbmZvOjppc1dyaXRhYmxlKCkKKyAgICAvLyBkb2VzIG5vdCB3b3JrIHdlbGwgb24gV2luZG93cy4pCisgICAgYm9vbCBkaXJJc09LID0gZmFsc2U7CisgICAgUURpciB0aGVEaXIoZE5hbWUpOworICAgIGlmICh0aGVEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgLy8gU2VlIGlmIHdlIGNhbiBjcmVhdGUgYSBmaWxlIGhlcmUKKyAgICAgICAgUVRlbXBvcmFyeUZpbGUgdG1wRmlsZShkaXJOYW1lICsgIi9YWFhYWFgiKTsKKyAgICAgICAgLy8gSWYgd2UgY2FuIG9wZW4gYSB0ZW1wb3JhcnkgZmlsZSwgdGhlIGRpcmVjdG9yeSBpcyBPSworICAgICAgICBkaXJJc09LID0gdG1wRmlsZS5vcGVuKCk7CisgICAgICAgIC8vIFRoZSB0ZW1wb3JhcnkgZmlsZSBpcyByZW1vdmVkIHdoZW4gd2UgbGVhdmUgdGhpcyBzY29wZQorICAgIH0KKyAgICByZXR1cm4gZGlySXNPSzsKK30KKworUVN0cmluZyBnZXRTY3JlZW5zaG90U2F2ZURpcmVjdG9yeSgpCit7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIFFTdHJpbmcgc2F2ZVBhdGggPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlNBVkVfUEFUSCwgIiIpLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoICFkaXJlY3RvcnlJc1dyaXRhYmxlKHNhdmVQYXRoKSApIHsKKyAgICAgICAgLy8gVGhpcyBwYXRoIGlzIG5vdCB3cml0YWJsZS4KKyAgICAgICAgLy8gQ2xlYXIgaXQsIHNvIHdlJ2xsIHRyeSB0aGUgZGVmYXVsdCBpbnN0ZWFkLgorICAgICAgICBzYXZlUGF0aCA9ICIiOworICAgIH0KKworICAgIGlmIChzYXZlUGF0aC5pc0VtcHR5KCkpIHsKKworICAgICAgICAvLyBXZSBoYXZlIG5vIHBhdGguIFRyeSB0byBkZXRlcm1pbmUgdGhlIHBhdGggdG8gdGhlIGRlc2t0b3AuCisgICAgICAgIFFTdHJpbmdMaXN0IHBhdGhzID0KKyAgICAgICAgICAgICAgICBRU3RhbmRhcmRQYXRoczo6c3RhbmRhcmRMb2NhdGlvbnMoCisgICAgICAgICAgICAgICAgICAgIFFTdGFuZGFyZFBhdGhzOjpEZXNrdG9wTG9jYXRpb24pOworICAgICAgICBpZiAocGF0aHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgc2F2ZVBhdGggPSBRRGlyOjp0b05hdGl2ZVNlcGFyYXRvcnMocGF0aHNbMF0pOworCisgICAgICAgICAgICAvLyBTYXZlIHRoaXMgZm9yIGZ1dHVyZSByZWZlcmVuY2UKKyAgICAgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6U0FWRV9QQVRILCBzYXZlUGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2F2ZVBhdGg7Cit9CisKK1NldHRpbmdzVGhlbWUgZ2V0U2VsZWN0ZWRUaGVtZSgpIHsKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgcmV0dXJuIChTZXR0aW5nc1RoZW1lKXNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6VUlfVEhFTUUsIFNFVFRJTkdTX1RIRU1FX0xJR0hUKS50b0ludCgpOworfQorCit2b2lkIGFkanVzdEFsbEJ1dHRvbnNGb3JUaGVtZShTZXR0aW5nc1RoZW1lIHRoZW1lKQoreworICAgIC8vIFN3aXRjaCB0byB0aGUgaWNvbiBpbWFnZXMgdGhhdCBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoaXMgdGhlbWUuCisgICAgLy8gRXhhbWluZSBldmVyeSB3aWRnZXQuCisgICAgUVdpZGdldExpc3Qgd0xpc3QgPSBRQXBwbGljYXRpb246OmFsbFdpZGdldHMoKTsKKyAgICBmb3IgKFFXaWRnZXQqIHcgOiB3TGlzdCkgeworICAgICAgICBpZiAoUVB1c2hCdXR0b24gKnBCID0gcW9iamVjdF9jYXN0PFFQdXNoQnV0dG9uKj4odykpIHsKKyAgICAgICAgICAgIGlmICghcEItPmljb24oKS5pc051bGwoKSkgeworICAgICAgICAgICAgICAgIHNldEJ1dHRvbkVuYWJsZWQocEIsIHRoZW1lLCBwQi0+aXNFbmFibGVkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGp1c3Qgc2hhZG93IGNvbG9yIGZvciBtYXRlcmlhbCBidXR0b25zIGRlcGVuZGluZyBvbiB0aGVtZS4KKyAgICAgICAgICAgIGlmIChSYWlzZWRNYXRlcmlhbEJ1dHRvbiogbWF0ZXJpYWxfYnRuID0KKyAgICAgICAgICAgICAgICAgICAgcW9iamVjdF9jYXN0PFJhaXNlZE1hdGVyaWFsQnV0dG9uKj4ocEIpKSB7CisgICAgICAgICAgICAgICAgbWF0ZXJpYWxfYnRuCisgICAgICAgICAgICAgICAgICAgIC0+c2hhZG93RWZmZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgLT5zZXRDb2xvcih0aGVtZSA9PSBTRVRUSU5HU19USEVNRV9MSUdIVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDb2xvcigyMDAsIDIwMCwgMjAwKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDb2xvcigyNSwgMjUsIDI1KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworUUljb24gZ2V0SWNvbkZvckN1cnJlbnRUaGVtZShjb25zdCBRU3RyaW5nJiBpY29uX25hbWUpIHsKKyAgICBRU3RyaW5nIGljb25UeXBlID0gVWk6OnN0eWxlc2hlZXRWYWx1ZXMoZ2V0U2VsZWN0ZWRUaGVtZSgpKVtVaTo6VEhFTUVfUEFUSF9WQVJdOworICAgIHJldHVybiBRSWNvbigiOi8iICsgaWNvblR5cGUgKyAiLyIgKyBpY29uX25hbWUpOworfQorCit2b2lkIHNldEZyYW1lT25Ub3AoUUZyYW1lKiBmcmFtZSwgYm9vbCBvblRvcCkgeworI2lmbmRlZiBfX2xpbnV4X18KKyAgICAvLyBPbiBMaW51eCwgdGhlIFF0OjpXaW5kb3dTdGF5c09uVG9wSGludCBvbmx5IHdvcmtzIGlmIFgxMSB3aW5kb3cKKyAgICAvLyBtYW5hZ21lbnQgaXMgYnlwYXNzZWQgKFF0OjpYMTFCeXBhc3NXaW5kb3dNYW5hZ2VySGludCkuIFVuZm9ydHVuYXRlbHksCisgICAgLy8gdGhpcyBwcmV2ZW50cyBhIGxvdCBvZiBjb21tb24gb3BlcmF0aW9ucyAobGlrZSBtb3Zpbmcgb3IgcmVzaXppbmcgdGhlCisgICAgLy8gd2luZG93KSwgc28gdGhlICJhbHdheXMgb24gdG9wIiBmZWF0dXJlIGlzIGRpc2FibGVkIGZvciBMaW51eC4KKyAgICBRdDo6V2luZG93RmxhZ3MgZmxhZ3MgPSBmcmFtZS0+d2luZG93RmxhZ3MoKTsKKyAgICBjb25zdCBib29sIGlzVmlzaWJsZSA9IGZyYW1lLT5pc1Zpc2libGUoKTsKKworICAgIGlmIChvblRvcCkgeworICAgICAgICBmbGFncyB8PSBRdDo6V2luZG93U3RheXNPblRvcEhpbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxhZ3MgJj0gflF0OjpXaW5kb3dTdGF5c09uVG9wSGludDsKKyAgICB9CisgICAgZnJhbWUtPnNldFdpbmRvd0ZsYWdzKGZsYWdzKTsKKworICAgIGlmIChpc1Zpc2libGUpIHsKKyAgICAgICAgZnJhbWUtPnNob3coKTsKKyAgICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2NvbW1vbi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhZjQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2NvbW1vbi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2V0dGluZ3MtYWdlbnQuaCIKKworI2luY2x1ZGUgPFFGcmFtZT4KKyNpbmNsdWRlIDxRSWNvbj4KKyNpbmNsdWRlIDxRUHVzaEJ1dHRvbj4KKyNpbmNsdWRlIDxRU3RyaW5nPgorCisvLyBTZXRzIHRoZSBidXR0b24gc3RhdGUgdG8gZW5hYmxlZCBvciBkaXNhYmxlZCwgYW5kIHNldHMgdGhlCisvLyBjb3JyZXNwb25kaW5nIGljb24gZm9yIHRoZSBidXR0b24uCit2b2lkIHNldEJ1dHRvbkVuYWJsZWQoUVB1c2hCdXR0b24qICBidXR0b24sIFNldHRpbmdzVGhlbWUgdGhlbWUsIGJvb2wgaXNFbmFibGVkKTsKKworCisvLyBEZXRlcm1pbmUgaWYgYSBkaXJlY3RvcnkgKHBhdGgpIGlzIHdyaXRhYmxlCitib29sIGRpcmVjdG9yeUlzV3JpdGFibGUoY29uc3QgUVN0cmluZyYgZGlyTmFtZSk7CisKKy8vIEdldCB0aGUgcGF0aCB0byB0aGUgZm9sZGVyIHdoZXJlIHNjcmVlbnNob3RzIGFyZSBzYXZlZC4KK1FTdHJpbmcgZ2V0U2NyZWVuc2hvdFNhdmVEaXJlY3RvcnkoKTsKKworLy8gR2V0IHRoZSBjdXJyZW50bHkgYWN0aXZlIFVJIHRoZW1lLgorU2V0dGluZ3NUaGVtZSBnZXRTZWxlY3RlZFRoZW1lKCk7CisKKy8vIEFkanVzdHMgYWxsIHB1c2ggYnV0dG9ucyB0byBmaXQgdGhlIGdpdmVuIHRoZW1lIChpLmUuIGNoYW5naW5nIGljb25zKQordm9pZCBhZGp1c3RBbGxCdXR0b25zRm9yVGhlbWUoU2V0dGluZ3NUaGVtZSB0aGVtZSk7CisKKy8vIE9idGFpbnMgdGhlIGdpdmVuIGljb24gZm9yIHRoZSBjdXJyZW50IHRoZW1lLgorUUljb24gZ2V0SWNvbkZvckN1cnJlbnRUaGVtZShjb25zdCBRU3RyaW5nJiBpY29uX25hbWUpOworCisvLyBTZXQgYSBmcmFtZSdzIHdpbmRvdyBmbGFncyB0byBiZSBhbHdheXMgb24gdG9wCit2b2lkIHNldEZyYW1lT25Ub3AoUUZyYW1lKiBmcmFtZSwgYm9vbCBvblRvcCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9kcGFkLXBhZ2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZHBhZC1wYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTlkNmFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZHBhZC1wYWdlLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvc2l6ZS10d2Vha2VyLmgiCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUJpdG1hcD4KKyNpbmNsdWRlIDxRRGVza3RvcFdpZGdldD4KKyNpbmNsdWRlIDxRU2NyZWVuPgorI2luY2x1ZGUgPFFTZXR0aW5ncz4KKworRFBhZFBhZ2U6OkRQYWRQYWdlKFFXaWRnZXQgKnBhcmVudCkgOgorICAgIFFXaWRnZXQocGFyZW50KSwKKyAgICBtVWkobmV3IFVpOjpEUGFkUGFnZSgpKQoreworICAgIG1VaS0+c2V0dXBVaSh0aGlzKTsKKworICAgIGlmIChhbmRyb2lkX2h3LT5od19kUGFkKSB7CisgICAgICAgIC8vIFRoaXMgQVZEIGhhcyBhIEQtUGFkLiBTZXQgdXAgdGhlIGNvbnRyb2wuCisgICAgICAgIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgICBRUHVzaEJ1dHRvbiogYnV0dG9uOworICAgICAgICAgICAgU2tpbktleUNvZGUga2V5X2NvZGU7CisgICAgICAgIH0gYnV0dG9uc1tdID0geworICAgICAgICAgICAge21VaS0+ZHBhZF9sZWZ0QnV0dG9uLCBrS2V5Q29kZURwYWRMZWZ0fSwKKyAgICAgICAgICAgIHttVWktPmRwYWRfdXBCdXR0b24sIGtLZXlDb2RlRHBhZFVwfSwKKyAgICAgICAgICAgIHttVWktPmRwYWRfcmlnaHRCdXR0b24sIGtLZXlDb2RlRHBhZFJpZ2h0fSwKKyAgICAgICAgICAgIHttVWktPmRwYWRfZG93bkJ1dHRvbiwga0tleUNvZGVEcGFkRG93bn0sCisgICAgICAgICAgICB7bVVpLT5kcGFkX3NlbGVjdEJ1dHRvbiwga0tleUNvZGVEcGFkQ2VudGVyfSwKKyAgICAgICAgICAgIHttVWktPmRwYWRfYmFja0J1dHRvbiwga0tleUNvZGVSZXdpbmR9LAorICAgICAgICAgICAge21VaS0+ZHBhZF9wbGF5QnV0dG9uLCBrS2V5Q29kZVBsYXlwYXVzZX0sCisgICAgICAgICAgICB7bVVpLT5kcGFkX2ZvcndhcmRCdXR0b24sIGtLZXlDb2RlRmFzdEZvcndhcmR9LAorICAgICAgICB9OworCisgICAgICAgIGZvciAoY29uc3QgYXV0byYgYnV0dG9uX2luZm8gOiBidXR0b25zKSB7CisgICAgICAgICAgICBRUHVzaEJ1dHRvbiogYnV0dG9uID0gYnV0dG9uX2luZm8uYnV0dG9uOworICAgICAgICAgICAgY29uc3QgU2tpbktleUNvZGUga2V5X2NvZGUgPSBidXR0b25faW5mby5rZXlfY29kZTsKKyAgICAgICAgICAgIGNvbm5lY3QoYnV0dG9uLCAmUVB1c2hCdXR0b246OnByZXNzZWQsCisgICAgICAgICAgICAgICAgICAgIFtidXR0b24sIGtleV9jb2RlLCB0aGlzXSgpIHsgdG9nZ2xlQnV0dG9uUHJlc3NlZChidXR0b24sIGtleV9jb2RlLCB0cnVlKTsgfSk7CisgICAgICAgICAgICBjb25uZWN0KGJ1dHRvbiwgJlFQdXNoQnV0dG9uOjpyZWxlYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgW2J1dHRvbiwga2V5X2NvZGUsIHRoaXNdKCkgeyB0b2dnbGVCdXR0b25QcmVzc2VkKGJ1dHRvbiwga2V5X2NvZGUsIGZhbHNlKTsgfSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBzaG93IHRoZSBvdmVybGF5IHRoYXQgb2JzY3VyZXMgdGhlIGJ1dHRvbnMuCisgICAgICAgIG1VaS0+ZHBhZF9ub0RQYWRfbWFzay0+aGlkZSgpOworICAgICAgICAvLyBEb24ndCBzaG93IHRoZSB0ZXh0IHNheWluZyB0aGF0IHRoZSBELVBhZCBpcyBkaXNhYmxlZC4KKyAgICAgICAgbVVpLT5kcGFkX25vRFBhZF9tZXNzYWdlLT5oaWRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBBVkQgZG9lcyBub3QgaGF2ZSBhIEQtUGFkLgorICAgICAgICAvLyBPdmVybGF5IGEgbWFzayBhbmQgdGV4dCBzYXlpbmcgdGhhdCB0aGUgRC1QYWQgaXMgZGlzYWJsZWQuCisgICAgICAgIG1VaS0+ZHBhZF9ub0RQYWRfbWFzay0+cmFpc2UoKTsKKyAgICAgICAgbVVpLT5kcGFkX25vRFBhZF9tZXNzYWdlLT5yYWlzZSgpOworICAgIH0KKworICAgIHJlbWFza0J1dHRvbnMoKTsKKyAgICBpbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7Cit9CisKK3ZvaWQgRFBhZFBhZ2U6OnNldEVtdWxhdG9yV2luZG93KEVtdWxhdG9yUXRXaW5kb3cqIGVXKQoreworICAgIG1FbXVsYXRvcldpbmRvdyA9IGVXOworfQorCit2b2lkIERQYWRQYWdlOjp0b2dnbGVCdXR0b25QcmVzc2VkKAorICAgIFFQdXNoQnV0dG9uKiBidXR0b24sCisgICAgY29uc3QgU2tpbktleUNvZGUga2V5X2NvZGUsCisgICAgY29uc3QgYm9vbCBwcmVzc2VkKSB7CisgICAgaWYgKG1FbXVsYXRvcldpbmRvdykgeworICAgICAgICBTa2luRXZlbnQqIHNraW5fZXZlbnQgPSBuZXcgU2tpbkV2ZW50KCk7CisgICAgICAgIHNraW5fZXZlbnQtPnR5cGUgPSBwcmVzc2VkID8ga0V2ZW50S2V5RG93biA6IGtFdmVudEtleVVwOworICAgICAgICBza2luX2V2ZW50LT51LmtleS5rZXljb2RlID0ga2V5X2NvZGU7CisgICAgICAgIHNraW5fZXZlbnQtPnUua2V5Lm1vZCA9IDA7CisgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+cXVldWVTa2luRXZlbnQoc2tpbl9ldmVudCk7CisgICAgfQorCisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIFNldHRpbmdzVGhlbWUgdGhlbWUgPQorICAgICAgICAoU2V0dGluZ3NUaGVtZSlzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlVJX1RIRU1FLCAwKS50b0ludCgpOworCisgICAgUVN0cmluZyBpY29uTmFtZSA9CisgICAgICAgIGJ1dHRvbi0+cHJvcGVydHkocHJlc3NlZCA/ICJ0aGVtZUljb25OYW1lUHJlc3NlZCIgOiAidGhlbWVJY29uTmFtZSIpLnRvU3RyaW5nKCk7CisgICAgaWYgKCAhaWNvbk5hbWUuaXNOdWxsKCkgKSB7CisgICAgICAgIFFTdHJpbmcgcmVzTmFtZSA9CisgICAgICAgICAgICAiOi8iICsgVWk6OnN0eWxlc2hlZXRWYWx1ZXModGhlbWUpW1VpOjpUSEVNRV9QQVRIX1ZBUl0gKyAiLyIgKyBpY29uTmFtZTsKKyAgICAgICAgYnV0dG9uLT5zZXRJY29uKFFJY29uKHJlc05hbWUpKTsKKyAgICB9Cit9CisKK3ZvaWQgRFBhZFBhZ2U6OnJlbWFza0J1dHRvbnMoKSB7CisgICAgZm9yIChRUHVzaEJ1dHRvbiogYnV0dG9uIDogZmluZENoaWxkcmVuPFFQdXNoQnV0dG9uKj4oKSkgeworICAgICAgICBjb25zdCBRU3RyaW5nIGljb25fbmFtZSA9IGJ1dHRvbi0+cHJvcGVydHkoInRoZW1lSWNvbk5hbWUiKS50b1N0cmluZygpOworICAgICAgICBpZiAoIWljb25fbmFtZS5pc051bGwoKSkgeworICAgICAgICAgICAgLy8gTWFzayB0aGUgYnV0dG9uIHRvIG9ubHkgaXRzIG5vbi10cmFuc3BhcmVudCBwaXhlbHMKKyAgICAgICAgICAgIC8vIChOb3RlIHdlIGNhcmUgb25seSBhYm91dCB0aGUgc2hhcGUgb2YgdGhlIGJ1dHRvbgorICAgICAgICAgICAgLy8gIGhlcmUsIHNvIDovZGFyay8gYW5kIDovbGlnaHQvIGFyZSBlcXVpdmFsZW50LikKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDYXV0aW9uOiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGJ1dHRvbiBpY29uIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgLy8gICAgICAgICAgYXQgaXRzIG5hdHVyYWwgc2l6ZS4KKyAgICAgICAgICAgIGNvbnN0IFFQaXhtYXAgbWFza19waXhtYXAoIjovbGlnaHQvIiArIGljb25fbmFtZSk7CisKKyAgICAgICAgICAgIC8vIEhBQ0s6IE9uIHdpbmRvd3MvbGludXgsIG9uIG5vcm1hbC1kZW5zaXR5IHNjcmVlbnMsCisgICAgICAgICAgICAvLyBhbmQgb24gT1MgWCB3aXRoIHJldGluYSBkaXNwbGF5LAorICAgICAgICAgICAgLy8gdGhlIG1hc2sgd2lsbCBlbmQgdXAgYmVpbmcgdG9vIGJpZyBmb3IgdGhlIGJ1dHRvbiwgc28gaXQgbmVlZHMKKyAgICAgICAgICAgIC8vIHRvIGJlIHNjYWxlZCBkb3duLgorICAgICAgICAgICAgZG91YmxlIG1hc2tfc2NhbGUgPSAwLjU7CisjaWZuZGVmIFFfT1NfTUFDCisgICAgICAgICAgICBpbnQgc2NyZWVuX251bSA9IFFBcHBsaWNhdGlvbjo6ZGVza3RvcCgpLT5zY3JlZW5OdW1iZXIodGhpcyk7CisgICAgICAgICAgICBpZiAoc2NyZWVuX251bSA+PSAwICYmIHNjcmVlbl9udW0gPCAgUUFwcGxpY2F0aW9uOjpzY3JlZW5zKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgUVNjcmVlbiAqc2NyID0gUUFwcGxpY2F0aW9uOjpzY3JlZW5zKCkuYXQoc2NyZWVuX251bSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGRwciA9IHNjci0+bG9naWNhbERvdHNQZXJJbmNoKCkgLyBTaXplVHdlYWtlcjo6QmFzZWxpbmVEcGk7CisgICAgICAgICAgICAgICAgbWFza19zY2FsZSAqPSBkcHI7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGJ1dHRvbi0+c2V0TWFzayhtYXNrX3BpeG1hcC5tYXNrKCkuc2NhbGVkKG1hc2tfcGl4bWFwLnNpemUoKSAqIG1hc2tfc2NhbGUpKTsKKyAgICAgICAgICAgIGJ1dHRvbi0+c2V0U3R5bGVTaGVldCgiYm9yZGVyOiBub25lOyIpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIERQYWRQYWdlOjpldmVudEZpbHRlcihRT2JqZWN0KiBvLCBRRXZlbnQqIGV2ZW50KSB7CisgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpTY3JlZW5DaGFuZ2VJbnRlcm5hbCkgeworICAgICAgICAvLyBXaGVuIG1vdmVkIGFjcm9zcyBzY3JlZW5zLCBtYXNrcyBvbiBidXR0b25zIG5lZWQgdG8KKyAgICAgICAgLy8gYmUgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIHNjcmVlbiBkZW5zaXR5LgorICAgICAgICByZW1hc2tCdXR0b25zKCk7CisgICAgfQorICAgIHJldHVybiBRV2lkZ2V0OjpldmVudEZpbHRlcihvLCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9kcGFkLXBhZ2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWE0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9kcGFkLXBhZ2UuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidWlfZHBhZC1wYWdlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4va2V5Y29kZS5oIgorI2luY2x1ZGUgPFFQdXNoQnV0dG9uPgorI2luY2x1ZGUgPFFXaWRnZXQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBFbXVsYXRvclF0V2luZG93OworCitjbGFzcyBEUGFkUGFnZSA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIGV4cGxpY2l0IERQYWRQYWdlKFFXaWRnZXQgKnBhcmVudCA9IDApOworICAgIHZvaWQgc2V0RW11bGF0b3JXaW5kb3coRW11bGF0b3JRdFdpbmRvdyogZVcpOworCitwcml2YXRlOgorICAgIHZvaWQgdG9nZ2xlQnV0dG9uUHJlc3NlZChRUHVzaEJ1dHRvbiogYnV0dG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luS2V5Q29kZSBrZXlfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBwcmVzc2VkKTsKK3ByaXZhdGU6CisgICAgdm9pZCByZW1hc2tCdXR0b25zKCk7CisgICAgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiwgUUV2ZW50Kikgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OkRQYWRQYWdlPiBtVWk7CisgICAgRW11bGF0b3JRdFdpbmRvdyogbUVtdWxhdG9yV2luZG93OworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RlYWI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZHBhZC1wYWdlLnVpCkBAIC0wLDAgKzEsMzQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPkRQYWRQYWdlPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJEUGFkUGFnZSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjYyMDwvd2lkdGg+CisgICAgPGhlaWdodD42MDA8L2hlaWdodD4KKyAgIDwvcmVjdD4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmc+Rm9ybTwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRTGFiZWwiIG5hbWU9ImRwYWRfbm9EUGFkX21hc2siPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MTA8L3g+CisgICAgIDx5PjEwPC95PgorICAgICA8d2lkdGg+NjAwPC93aWR0aD4KKyAgICAgPGhlaWdodD41ODA8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImF1dG9GaWxsQmFja2dyb3VuZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+YmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMjgsIDEyOCwgMTI4LCAyMDApPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJkcGFkX25vRFBhZF9tZXNzYWdlIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjEwPC94PgorICAgICA8eT4yOTA8L3k+CisgICAgIDx3aWR0aD42MDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjgxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImF1dG9GaWxsQmFja2dyb3VuZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+YmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMjgsIDEyOCwgMTI4LCAwKTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPlRoaXMgZW11bGF0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGRpcmVjdGlvbmFsIHBhZC48L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYWxpZ25tZW50Ij4KKyAgICA8c2V0PlF0OjpBbGlnbkNlbnRlcjwvc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJkcGFkX2Rvd25CdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjQwPC94PgorICAgICA8eT4yMDY8L3k+CisgICAgIDx3aWR0aD4xNDI8L3dpZHRoPgorICAgICA8aGVpZ2h0PjEwMDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF9kb3duPC9ub3JtYWxvZmY+Oi9kYXJrL2RwYWRfZG93bjwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MTQxPC93aWR0aD4KKyAgICAgPGhlaWdodD4xMDA8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5kcGFkX2Rvd248L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZVByZXNzZWQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5kcGFkX2Rvd25fcHJlc3NlZDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iZHBhZF9sZWZ0QnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwOTwveD4KKyAgICAgPHk+MTMyPC95PgorICAgICA8d2lkdGg+MTAwPC93aWR0aD4KKyAgICAgPGhlaWdodD4xNDI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9kYXJrL2RwYWRfbGVmdDwvbm9ybWFsb2ZmPjovZGFyay9kcGFkX2xlZnQ8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjEwMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MTQxPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9sZWZ0PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWVQcmVzc2VkIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9sZWZ0X3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfZm9yd2FyZEJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4zODA8L3g+CisgICAgIDx5PjM2MDwveT4KKyAgICAgPHdpZHRoPjUwPC93aWR0aD4KKyAgICAgPGhlaWdodD41MDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF9mb3J3YXJkPC9ub3JtYWxvZmY+Oi9kYXJrL2RwYWRfZm9yd2FyZDwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+NTA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjUwPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9mb3J3YXJkPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWVQcmVzc2VkIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9mb3J3YXJkX3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfcGxheUJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yODY8L3g+CisgICAgIDx5PjM2MDwveT4KKyAgICAgPHdpZHRoPjUwPC93aWR0aD4KKyAgICAgPGhlaWdodD41MDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF9wbGF5PC9ub3JtYWxvZmY+Oi9kYXJrL2RwYWRfcGxheTwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+NTA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjUwPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9wbGF5PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWVQcmVzc2VkIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9wbGF5X3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfdXBCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjQwPC94PgorICAgICA8eT4xMDA8L3k+CisgICAgIDx3aWR0aD4xNDI8L3dpZHRoPgorICAgICA8aGVpZ2h0PjEwMDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF91cDwvbm9ybWFsb2ZmPjovZGFyay9kcGFkX3VwPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4xNDE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjEwMDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPmRwYWRfdXA8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZVByZXNzZWQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5kcGFkX3VwX3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfcmlnaHRCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzEzPC94PgorICAgICA8eT4xMzI8L3k+CisgICAgIDx3aWR0aD4xMDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjE0MjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF9yaWdodDwvbm9ybWFsb2ZmPjovZGFyay9kcGFkX3JpZ2h0PC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4xMDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjE0MTwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPmRwYWRfcmlnaHQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZVByZXNzZWQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5kcGFkX3JpZ2h0X3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfYmFja0J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xOTI8L3g+CisgICAgIDx5PjM2MDwveT4KKyAgICAgPHdpZHRoPjUwPC93aWR0aD4KKyAgICAgPGhlaWdodD41MDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZHBhZF9iYWNrPC9ub3JtYWxvZmY+Oi9kYXJrL2RwYWRfYmFjazwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+NTA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjUwPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+ZHBhZF9iYWNrPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWVQcmVzc2VkIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9iYWNrX3ByZXNzZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImRwYWRfc2VsZWN0QnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjI2ODwveD4KKyAgICAgPHk+MTYwPC95PgorICAgICA8d2lkdGg+ODY8L3dpZHRoPgorICAgICA8aGVpZ2h0Pjg2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovZGFyay9kcGFkX3NlbGVjdDwvbm9ybWFsb2ZmPjovZGFyay9kcGFkX3NlbGVjdDwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+ODU8L3dpZHRoPgorICAgICA8aGVpZ2h0Pjg1PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZF9zZWxlY3Q8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZVByZXNzZWQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5kcGFkX3NlbGVjdF9wcmVzc2VkPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgPC93aWRnZXQ+CisgPHJlc291cmNlcz4KKyAgPGluY2x1ZGUgbG9jYXRpb249Ii4uL3Jlc291cmNlcy5xcmMiLz4KKyA8L3Jlc291cmNlcz4KKyA8Y29ubmVjdGlvbnMvPgorPC91aT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhhMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZmluZ2VyLXBhZ2UuY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9maW5nZXItcGFnZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvZmluZ2VyX2FnZW50LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKworRmluZ2VyUGFnZTo6RmluZ2VyUGFnZShRV2lkZ2V0ICpwYXJlbnQpIDoKKyAgICBRV2lkZ2V0KHBhcmVudCksCisgICAgbVVpKG5ldyBVaTo6RmluZ2VyUGFnZSgpKQoreworICAgIG1VaS0+c2V0dXBVaSh0aGlzKTsKKworICAgIGludCBhcGlMZXZlbCA9IGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYW5kcm9pZF9hdmRJbmZvKTsKKworICAgIGlmIChhcGlMZXZlbCA+PSAyMykgeworICAgICAgICAvLyBUaGlzIEFQSSBsZXZlbCBzdXBwb3J0cyBmaW5nZXJwcmludCByZWNvZ25pdGlvbi4KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSAxMCAiZmluZ2VycyIsIGVhY2ggd2l0aCBhIGZpeGVkCisgICAgICAgIC8vIHJhbmRvbSBmaW5nZXJwcmludCBJRCB2YWx1ZQorICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgMSIsICAgNDUxNDY1NzIpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgMiIsICAxOTI2MTgwNzUpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgMyIsICAgODQ4MDc4NzMpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgNCIsICAxODk2NzU3OTMpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgNSIsICAxMzI3MTA0NzIpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgNiIsICAgMzYzMjEwNDMpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgNyIsICAxMzk0MjU1MzQpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgOCIsICAgMTUzMDEzNDApOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgOSIsICAxMDU3MDIyMzMpOworICAgICAgICBtVWktPmZpbmdlcl9waWNrQm94LT5hZGRJdGVtKCJGaW5nZXIgMTAiLCAgODc3NTQyODYpOworCisgICAgICAgIC8vIERvbid0IHNob3cgdGhlIG92ZXJsYXkgdGhhdCBvYnNjdXJlcyB0aGUgY29udHJvbHMuCisgICAgICAgIG1VaS0+ZmluZ2VyX25vRmluZ2VyX21hc2stPmhpZGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGlzIEFQSSBsZXZlbCBkb2VzIG5vdCBzdXBwb3J0IGZpbmdlcnByaW50CisgICAgICAgIC8vIHJlY29nbml0aW9uLgorICAgICAgICAvLyBPdmVybGF5IGEgbWFzayBhbmQgdGV4dCBzYXlpbmcgdGhhdCB0aGlzIGlzIGRpc2FibGVkLgorICAgICAgICBRU3RyaW5nIGRlc3NlcnROYW1lID0gYXZkSW5mb19nZXRBcGlEZXNzZXJ0TmFtZShhcGlMZXZlbCk7CisgICAgICAgIGlmICggIWRlc3NlcnROYW1lLmlzRW1wdHkoKSApIHsKKyAgICAgICAgICAgIGRlc3NlcnROYW1lID0gIiAoIiArIGRlc3NlcnROYW1lICsgIikiOworICAgICAgICB9CisKKyAgICAgICAgUVN0cmluZyBiYWRBcGkgPSB0cigiVGhpcyBlbXVsYXRlZCBkZXZpY2UgaXMgdXNpbmcgQVBJIGxldmVsICUxJTIuPGJyPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmluZ2VycHJpbnQgcmVjb2duaXRpb24gaXMgYXZhaWxhYmxlIHdpdGggQVBJIGxldmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjMgKE1hcnNobWFsbG93KSBhbmQgaGlnaGVyIG9ubHkuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKGFwaUxldmVsKS5hcmcoZGVzc2VydE5hbWUpOworCisgICAgICAgIG1VaS0+ZmluZ2VyX25vRmluZ2VyX21hc2stPnNldFRleHRGb3JtYXQoUXQ6OlJpY2hUZXh0KTsKKyAgICAgICAgbVVpLT5maW5nZXJfbm9GaW5nZXJfbWFzay0+c2V0VGV4dChiYWRBcGkpOworICAgICAgICBtVWktPmZpbmdlcl9ub0Zpbmdlcl9tYXNrLT5yYWlzZSgpOworICAgIH0KK30KKwordm9pZCBGaW5nZXJQYWdlOjpvbl9maW5nZXJfdG91Y2hCdXR0b25fcHJlc3NlZCgpCit7CisgICAgLy8gU2VuZCB0aGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZWxlY3RlZCBmaW5nZXJwcmludAorICAgIGludCBmaW5nZXJJRCA9IG1VaS0+ZmluZ2VyX3BpY2tCb3gtPmN1cnJlbnREYXRhKCkudG9JbnQoKTsKKworICAgIGlmIChtRmluZ2VyQWdlbnQgJiYgbUZpbmdlckFnZW50LT5zZXRUb3VjaCkgeworICAgICAgICBtRmluZ2VyQWdlbnQtPnNldFRvdWNoKHRydWUsIGZpbmdlcklEKTsKKyAgICB9Cit9CisKK3ZvaWQgRmluZ2VyUGFnZTo6b25fZmluZ2VyX3RvdWNoQnV0dG9uX3JlbGVhc2VkKCkKK3sKKyAgICBpZiAobUZpbmdlckFnZW50ICYmIG1GaW5nZXJBZ2VudC0+c2V0VG91Y2gpIHsKKyAgICAgICAgbUZpbmdlckFnZW50LT5zZXRUb3VjaChmYWxzZSwgMCk7CisgICAgfQorfQorCit2b2lkIEZpbmdlclBhZ2U6OnNldEZpbmdlckFnZW50KGNvbnN0IFFBbmRyb2lkRmluZ2VyQWdlbnQqIGFnZW50KQoreworICAgIG1GaW5nZXJBZ2VudCA9IGFnZW50OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZmluZ2VyLXBhZ2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwZGVhMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInVpX2Zpbmdlci1wYWdlLmgiCisjaW5jbHVkZSA8UVdpZGdldD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3N0cnVjdCBRQW5kcm9pZEZpbmdlckFnZW50OworY2xhc3MgRmluZ2VyUGFnZSA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIGV4cGxpY2l0IEZpbmdlclBhZ2UoUVdpZGdldCAqcGFyZW50ID0gMCk7CisgICAgdm9pZCBzZXRGaW5nZXJBZ2VudChjb25zdCBRQW5kcm9pZEZpbmdlckFnZW50KiBhZ2VudCk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBvbl9maW5nZXJfdG91Y2hCdXR0b25fcHJlc3NlZCgpOworICAgIHZvaWQgb25fZmluZ2VyX3RvdWNoQnV0dG9uX3JlbGVhc2VkKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFVpOjpGaW5nZXJQYWdlPiBtVWk7CisgICAgY29uc3QgUUFuZHJvaWRGaW5nZXJBZ2VudCogbUZpbmdlckFnZW50OworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLnVpIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZmluZ2VyLXBhZ2UudWkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NDc5MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLnVpCkBAIC0wLDAgKzEsMTMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPkZpbmdlclBhZ2U8L2NsYXNzPgorIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9IkZpbmdlclBhZ2UiPgorICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgPHJlY3Q+CisgICAgPHg+MDwveD4KKyAgICA8eT4wPC95PgorICAgIDx3aWR0aD42MjA8L3dpZHRoPgorICAgIDxoZWlnaHQ+NjAwPC9oZWlnaHQ+CisgICA8L3JlY3Q+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dUaXRsZSI+CisgICA8c3RyaW5nPkZvcm08L3N0cmluZz4KKyAgPC9wcm9wZXJ0eT4KKyAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJmaW5nZXJfbm9GaW5nZXJfbWFzayI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMDwveD4KKyAgICAgPHk+MTA8L3k+CisgICAgIDx3aWR0aD42MDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjU4MDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhdXRvRmlsbEJhY2tncm91bmQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJhY2tncm91bmQtY29sb3I6IHJnYmEoMTI4LCAxMjgsIDEyOCwgMjAwKTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhbGlnbm1lbnQiPgorICAgIDxzZXQ+UXQ6OkFsaWduQ2VudGVyPC9zZXQ+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9ImZpbmdlcl90b3VjaEJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xNjg8L3g+CisgICAgIDx5PjgwPC95PgorICAgICA8d2lkdGg+MTMyPC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5UT1VDSCBTRU5TT1I8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRvb2w8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJmaW5nZXJfSWRHcm91cCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4xMTE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5GaW5nZXJwcmludDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRQ29tYm9Cb3giIG5hbWU9ImZpbmdlcl9waWNrQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT4zODwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPi0xPC9udW1iZXI+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Im1heFZpc2libGVJdGVtcyI+CisgICAgPG51bWJlcj4xMDwvbnVtYmVyPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorIDwvd2lkZ2V0PgorIDxjdXN0b213aWRnZXRzPgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPlJhaXNlZE1hdGVyaWFsQnV0dG9uPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFQdXNoQnV0dG9uPC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvcmFpc2VkLW1hdGVyaWFsLWJ1dHRvbi5oPC9oZWFkZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorIDwvY3VzdG9td2lkZ2V0cz4KKyA8dGFic3RvcHM+CisgIDx0YWJzdG9wPmZpbmdlcl9waWNrQm94PC90YWJzdG9wPgorICA8dGFic3RvcD5maW5nZXJfdG91Y2hCdXR0b248L3RhYnN0b3A+CisgPC90YWJzdG9wcz4KKyA8cmVzb3VyY2VzLz4KKyA8Y29ubmVjdGlvbnMvPgorPC91aT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2hlbHAtcGFnZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9oZWxwLXBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzUxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9oZWxwLXBhZ2UuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvaGVscC1wYWdlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NvbmZpZ0RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91cGRhdGUtY2hlY2svVmVyc2lvbkV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8UURlc2t0b3BTZXJ2aWNlcz4KKyNpbmNsdWRlIDxRVGhyZWFkPgorI2luY2x1ZGUgPFFVcmw+CisKK2NvbnN0IGNoYXIgRE9DU19VUkxbXSA9CisgICAgImh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vci9zdHVkaW8tdWkvZW11bGF0b3IuaHRtbCI7Citjb25zdCBjaGFyIEZJTEVfQlVHX1VSTFtdID0KKyAgICAiaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9lbnRyeT90ZW1wbGF0ZT1BbmRyb2lkJTIwRW11bGF0b3IlMjBCdWciOworY29uc3QgY2hhciBTRU5EX0ZFRURCQUNLX1VSTFtdID0KKyAgICAiaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9lbnRyeT90ZW1wbGF0ZT1FbXVsYXRvciUyMEZlYXR1cmUlMjBSZXF1ZXN0IjsKKworSGVscFBhZ2U6OkhlbHBQYWdlKFFXaWRnZXQgKnBhcmVudCkgOgorICAgIFFXaWRnZXQocGFyZW50KSwKKyAgICBtVWkobmV3IFVpOjpIZWxwUGFnZSkKK3sKKyAgICBtVWktPnNldHVwVWkodGhpcyk7CisKKyAgICAvLyBHZXQgdGhlIHZlcnNpb24gb2YgdGhpcyBjb2RlCisgICAgYW5kcm9pZDo6dXBkYXRlX2NoZWNrOjpWZXJzaW9uRXh0cmFjdG9yIHZFeDsKKworICAgIGFuZHJvaWQ6OmJhc2U6OlZlcnNpb24gY3VyVmVyc2lvbiA9IHZFeC5nZXRDdXJyZW50VmVyc2lvbigpOworICAgIGF1dG8gdmVyU3RyID0gY3VyVmVyc2lvbi5pc1ZhbGlkKCkKKyAgICAgICAgICAgID8gUVN0cmluZyhjdXJWZXJzaW9uLnRvU3RyaW5nKCkuY19zdHIoKSkgOiAiVW5rbm93biI7CisKKyAgICBtVWktPmhlbHBfdmVyc2lvbkJveC0+c2V0UGxhaW5UZXh0KHZlclN0cik7CisKKyAgICBpbnQgYXBpTGV2ZWwgPSBhdmRJbmZvX2dldEFwaUxldmVsKGFuZHJvaWRfYXZkSW5mbyk7CisgICAgY2hhciB2ZXJzaW9uU3RyaW5nWzEyOF07CisgICAgYXZkSW5mb19nZXRGdWxsQXBpTmFtZShhcGlMZXZlbCwgdmVyc2lvblN0cmluZywgMTI4KTsKKyAgICBtVWktPmhlbHBfYW5kcm9pZFZlcnNpb25Cb3gtPnNldFBsYWluVGV4dCh2ZXJzaW9uU3RyaW5nKTsKKworICAgIC8vIGxhdW5jaCB0aGUgbGF0ZXN0IHZlcnNpb24gbG9hZGVyIGluIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgYXV0byBsYXRlc3RWZXJzaW9uVGhyZWFkID0gbmV3IFFUaHJlYWQoKTsKKyAgICBhdXRvIGxhdGVzdFZlcnNpb25UYXNrID0gbmV3IExhdGVzdFZlcnNpb25Mb2FkVGFzaygpOworICAgIGxhdGVzdFZlcnNpb25UYXNrLT5tb3ZlVG9UaHJlYWQobGF0ZXN0VmVyc2lvblRocmVhZCk7CisgICAgY29ubmVjdChsYXRlc3RWZXJzaW9uVGhyZWFkLCBTSUdOQUwoc3RhcnRlZCgpKSwgbGF0ZXN0VmVyc2lvblRhc2ssIFNMT1QocnVuKCkpKTsKKyAgICBjb25uZWN0KGxhdGVzdFZlcnNpb25UYXNrLCBTSUdOQUwoZmluaXNoZWQoUVN0cmluZykpLAorICAgICAgICAgICAgbVVpLT5oZWxwX2xhdGVzdFZlcnNpb25Cb3gsIFNMT1Qoc2V0UGxhaW5UZXh0KFFTdHJpbmcpKSk7CisgICAgY29ubmVjdChsYXRlc3RWZXJzaW9uVGFzaywgU0lHTkFMKGZpbmlzaGVkKFFTdHJpbmcpKSwgbGF0ZXN0VmVyc2lvblRocmVhZCwgU0xPVChxdWl0KCkpKTsKKyAgICBjb25uZWN0KGxhdGVzdFZlcnNpb25UaHJlYWQsIFNJR05BTChmaW5pc2hlZCgpKSwgbGF0ZXN0VmVyc2lvblRhc2ssIFNMT1QoZGVsZXRlTGF0ZXIoKSkpOworICAgIGNvbm5lY3QobGF0ZXN0VmVyc2lvblRocmVhZCwgU0lHTkFMKGZpbmlzaGVkKCkpLCBsYXRlc3RWZXJzaW9uVGhyZWFkLCBTTE9UKGRlbGV0ZUxhdGVyKCkpKTsKKyAgICBtVWktPmhlbHBfbGF0ZXN0VmVyc2lvbkJveC0+c2V0UGxhaW5UZXh0KHRyKCJMb2FkaW5nLi4uIikpOworICAgIGxhdGVzdFZlcnNpb25UaHJlYWQtPnN0YXJ0KCk7CisKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHRoaXMsICZIZWxwUGFnZTo6YWRiUG9ydFVwZGF0ZVJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkhlbHBQYWdlOjp1cGRhdGVBZGJQb3J0TnVtYmVyKTsKK30KKwordm9pZCBIZWxwUGFnZTo6aW5pdGlhbGl6ZShjb25zdCBTaG9ydGN1dEtleVN0b3JlPFF0VUlDb21tYW5kPioga2V5X3N0b3JlKSB7CisgICAgaW5pdGlhbGl6ZUxpY2Vuc2VUZXh0KCk7CisgICAgaW5pdGlhbGl6ZUtleWJvYXJkU2hvcnRjdXRMaXN0KGtleV9zdG9yZSk7Cit9CisKK3ZvaWQgSGVscFBhZ2U6OmluaXRpYWxpemVMaWNlbnNlVGV4dCgpIHsKKyAgICAvLyBSZWFkIHRoZSBsaWNlbnNlIHRleHQgaW50byB0aGUgZGlzcGxheSBib3gKKyAgICAvLyBUaGUgZmlsZSBpcyA8U0RLIHBhdGg+L3Rvb2xzL05PVElDRS50eHQKKworICAgIFFTdHJpbmcgbEZpbGVOYW1lID0gYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpnZXQoKS0+Z2V0TGF1bmNoZXJEaXJlY3RvcnkoKS5jX3N0cigpOworICAgIGxGaWxlTmFtZSArPSAiL05PVElDRS50eHQiOworCisgICAgUUZpbGUgbGljZW5zZUZpbGUobEZpbGVOYW1lKTsKKyAgICBpZiAobGljZW5zZUZpbGUub3BlbihRSU9EZXZpY2U6OlJlYWRPbmx5KSkgeworICAgICAgICAvLyBSZWFkIHRoZSBmaWxlIGludG8gdGhlIHRleHQgYm94CisgICAgICAgIFFUZXh0U3RyZWFtIGxUZXh0KCZsaWNlbnNlRmlsZSk7CisgICAgICAgIG1VaS0+aGVscF9saWNlbnNlVGV4dC0+c2V0UGxhaW5UZXh0KGxUZXh0LnJlYWRBbGwoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQ2FuJ3QgcmVhZCB0aGUgZmlsZS4gR2l2ZSBhIGJhY2t1cCBub3RpY2UuCisgICAgICAgIG1VaS0+aGVscF9saWNlbnNlVGV4dC0+c2V0UGxhaW5UZXh0KAorICAgICAgICAgICAgICAgIHRyKCJGaW5kIEFuZHJvaWQgRW11bGF0b3IgTGljZW5zZSBOT1RJQ0UgZmlsZXMgaGVyZToiKSArCisgICAgICAgICAgICAgICAgIlxuXG5odHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9leHRlcm5hbC8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJxZW11LysvZW11LW1hc3Rlci1kZXYvIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRTaG9ydGN1dHNUYWJsZVJvdyhRVGFibGVXaWRnZXQqIHRhYmxlX3dpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcmIGtleV9zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFTdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgaW50IHRhYmxlX3JvdyA9IHRhYmxlX3dpZGdldC0+cm93Q291bnQoKTsKKyAgICB0YWJsZV93aWRnZXQtPmluc2VydFJvdyh0YWJsZV9yb3cpOworICAgIHRhYmxlX3dpZGdldC0+c2V0SXRlbSh0YWJsZV9yb3csIDAsIG5ldyBRVGFibGVXaWRnZXRJdGVtKGRlc2NyaXB0aW9uKSk7CisgICAgdGFibGVfd2lkZ2V0LT5zZXRJdGVtKHRhYmxlX3JvdywgMSwgbmV3IFFUYWJsZVdpZGdldEl0ZW0oa2V5X3NlcXVlbmNlKSk7Cit9CisKK3ZvaWQgSGVscFBhZ2U6OmluaXRpYWxpemVLZXlib2FyZFNob3J0Y3V0TGlzdChjb25zdCBTaG9ydGN1dEtleVN0b3JlPFF0VUlDb21tYW5kPioga2V5X3N0b3JlKQoreworICAgIFFUYWJsZVdpZGdldCogdGFibGVfd2lkZ2V0ID0gbVVpLT5zaG9ydGN1dHNUYWJsZVdpZGdldDsKKyAgICBpZiAoa2V5X3N0b3JlKSB7CisgICAgICAgIGZvciAoYXV0byBrZXlfc2VxdWVuY2VfYW5kX2NvbW1hbmQgPSBrZXlfc3RvcmUtPmJlZ2luKCk7CisgICAgICAgICAgICAga2V5X3NlcXVlbmNlX2FuZF9jb21tYW5kICE9IGtleV9zdG9yZS0+ZW5kKCk7CisgICAgICAgICAgICAgKytrZXlfc2VxdWVuY2VfYW5kX2NvbW1hbmQpIHsKKyAgICAgICAgICAgIFFTdHJpbmcga2V5X2NvbWJvOworCisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCBRS2V5U2VxdWVuY2UgZG9lc24ndCBoYW5kbGUgbW9kaWZpZXItb25seSBrZXkKKyAgICAgICAgICAgIC8vIHNlcXVlbmNlcyB2ZXJ5IHdlbGwuIEluIHRoaXMgY2FzZSwgIm11bHRpdG91Y2giIGlzIEN0cmwgYW5kCisgICAgICAgICAgICAvLyBRS2V5U2VxdWVuY2U6OnRvU3RyaW5nIHNvbWV0aW1lcyBwcm9kdWNlcyBzdHJpbmdzIHdpdGggd2VpcmQKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMuIFRvIG1pdGlnYXRlIHRoaXMgcHJvYmxlbSwgd2Ugc2ltcGx5IGhhcmRjb2RlIHRoZQorICAgICAgICAgICAgLy8gc3RyaW5nIGZvciB0aGUgIm11bHRpdG91Y2giIGtleSBjb21iby4KKyAgICAgICAgICAgIGlmIChrZXlfc2VxdWVuY2VfYW5kX2NvbW1hbmQudmFsdWUoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICBRdFVJQ29tbWFuZDo6U0hPV19NVUxUSVRPVUNIKSB7CisjaWZkZWYgUV9PU19NQUMKKyAgICAgICAgICAgICAgICBrZXlfY29tYm8gPSAiXHUyMzE4IjsgIC8vIENtZAorI2Vsc2UKKyAgICAgICAgICAgICAgICBrZXlfY29tYm8gPSAiQ3RybCI7CisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAga2V5X2NvbWJvICA9IGtleV9zZXF1ZW5jZV9hbmRfY29tbWFuZC5rZXkoKS50b1N0cmluZyhRS2V5U2VxdWVuY2U6Ok5hdGl2ZVRleHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhZGRTaG9ydGN1dHNUYWJsZVJvdyh0YWJsZV93aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfY29tYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdFVJQ29tbWFuZERlc2NyaXB0aW9uKGtleV9zZXF1ZW5jZV9hbmRfY29tbWFuZC52YWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0YWJsZV93aWRnZXQtPnNvcnRJdGVtcygwKTsKK30KKwordm9pZCBIZWxwUGFnZTo6c2V0QWRiUG9ydCgpIHsKKyAgICAvLyBUaGUgVUkgY2FuIG9ubHkgYmUgdXBkYXRlZCBmcm9tIHRoZSBwcm9wZXIgdGhyZWFkLgorICAgIC8vIEVtaXQgYSBzaWduYWwgc28gdGhhdCBoYXBwZW5zIG5vdywgYnV0IGluIHRoZSByaWdodAorICAgIC8vIGNvbnRleHQuCisgICAgZW1pdCBhZGJQb3J0VXBkYXRlUmVxdWlyZWQoKTsKK30KKwordm9pZCBIZWxwUGFnZTo6dXBkYXRlQWRiUG9ydE51bWJlcigpIHsKKyAgICAvLyBTaG93IHRoZSAic2VyaWFsIG51bWJlciIgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25uZWN0IEFEQgorICAgIC8vIHRvIHRoaXMgZGV2aWNlCisgICAgbVVpLT5oZWxwX2FkYlNlcmlhbE51bWJlckJveC0+c2V0UGxhaW5UZXh0KAorICAgICAgICAgICAgImVtdWxhdG9yLSIgKyBRU3RyaW5nOjpudW1iZXIoYW5kcm9pZF9zZXJpYWxfbnVtYmVyX3BvcnQpICk7Cit9CisKK3ZvaWQgSGVscFBhZ2U6Om9uX2hlbHBfZG9jc19jbGlja2VkKCkgeworICAgIFFEZXNrdG9wU2VydmljZXM6Om9wZW5VcmwoUVVybDo6ZnJvbUVuY29kZWQoRE9DU19VUkwpKTsKK30KKwordm9pZCBIZWxwUGFnZTo6b25faGVscF9maWxlQnVnX2NsaWNrZWQoKSB7CisgICAgUURlc2t0b3BTZXJ2aWNlczo6b3BlblVybChRVXJsOjpmcm9tRW5jb2RlZChGSUxFX0JVR19VUkwpKTsKK30KKwordm9pZCBIZWxwUGFnZTo6b25faGVscF9zZW5kRmVlZGJhY2tfY2xpY2tlZCgpIHsKKyAgICBRRGVza3RvcFNlcnZpY2VzOjpvcGVuVXJsKFFVcmw6OmZyb21FbmNvZGVkKFNFTkRfRkVFREJBQ0tfVVJMKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiB1cGRhdGVDaGFubmVsTmFtZShhbmRyb2lkOjpzdHVkaW86OlVwZGF0ZUNoYW5uZWwgY2hhbm5lbCkgeworICAgIHN3aXRjaCAoY2hhbm5lbCkgeworICAgICAgICBjYXNlIGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbDo6U3RhYmxlOgorICAgICAgICAgICAgcmV0dXJuICJTdGFibGUiOworICAgICAgICBjYXNlIGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbDo6RGV2OgorICAgICAgICAgICAgcmV0dXJuICJEZXYiOworICAgICAgICBjYXNlIGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbDo6QmV0YToKKyAgICAgICAgICAgIHJldHVybiAiQmV0YSI7CisgICAgICAgIGNhc2UgYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsOjpDYW5hcnk6CisgICAgICAgICAgICByZXR1cm4gIkNhbmFyeSI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgTGF0ZXN0VmVyc2lvbkxvYWRUYXNrOjpydW4oKSB7CisgICAgLy8gR2V0IGxhdGVzdCB2ZXJzaW9uIHRoYXQgaXMgYXZhaWxhYmxlIG9ubGluZQorICAgIGFuZHJvaWQ6OnVwZGF0ZV9jaGVjazo6VXBkYXRlQ2hlY2tlciB1cENoZWNrKAorICAgICAgICAgICAgYW5kcm9pZDo6Q29uZmlnRGlyczo6Z2V0VXNlckRpcmVjdG9yeSgpLmNfc3RyKCkpOworICAgIGNvbnN0IGF1dG8gbGF0ZXN0VmVyc2lvbiA9IHVwQ2hlY2suZ2V0TGF0ZXN0VmVyc2lvbigpOworICAgIFFTdHJpbmcgbGF0ZXN0VmVyU3RyaW5nOworICAgIGlmICghbGF0ZXN0VmVyc2lvbikgeworICAgICAgICBsYXRlc3RWZXJTdHJpbmcgPSB0cigiVW5hdmFpbGFibGUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsYXRlc3RWZXJTdHJpbmcgPQorICAgICAgICAgICAgICAgIFFTdHJpbmc6OmZyb21TdGRTdHJpbmcobGF0ZXN0VmVyc2lvbi0+Zmlyc3QudG9TdHJpbmcoKSk7CisgICAgICAgIGlmIChjb25zdCBhdXRvIGNoYW5uZWxOYW1lID0gdXBkYXRlQ2hhbm5lbE5hbWUobGF0ZXN0VmVyc2lvbi0+c2Vjb25kKSkgeworICAgICAgICAgICAgbGF0ZXN0VmVyU3RyaW5nICs9IHRyKCIgKCUxIHVwZGF0ZSBjaGFubmVsKSIpLmFyZyhjaGFubmVsTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZW1pdCBmaW5pc2hlZChsYXRlc3RWZXJTdHJpbmcpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvaGVscC1wYWdlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9oZWxwLXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzQxNTBmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvaGVscC1wYWdlLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9zaG9ydGN1dC1rZXktc3RvcmUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuaCIKKyNpbmNsdWRlICJ1aV9oZWxwLXBhZ2UuaCIKKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgSGVscFBhZ2UgOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBIZWxwUGFnZShRV2lkZ2V0ICpwYXJlbnQgPSAwKTsKKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3QgU2hvcnRjdXRLZXlTdG9yZTxRdFVJQ29tbWFuZD4qIGtleV9zdG9yZSk7CisgICAgdm9pZCBzZXRBZGJQb3J0KCk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBhZGJQb3J0VXBkYXRlUmVxdWlyZWQoKTsKKworcHJpdmF0ZSBzbG90czoKKyAgICB2b2lkIG9uX2hlbHBfZG9jc19jbGlja2VkKCk7CisgICAgdm9pZCBvbl9oZWxwX2ZpbGVCdWdfY2xpY2tlZCgpOworICAgIHZvaWQgb25faGVscF9zZW5kRmVlZGJhY2tfY2xpY2tlZCgpOworICAgIHZvaWQgdXBkYXRlQWRiUG9ydE51bWJlcigpOworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdGlhbGl6ZUxpY2Vuc2VUZXh0KCk7CisgICAgdm9pZCBpbml0aWFsaXplS2V5Ym9hcmRTaG9ydGN1dExpc3QoY29uc3QgU2hvcnRjdXRLZXlTdG9yZTxRdFVJQ29tbWFuZD4qIGtleV9zdG9yZSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OkhlbHBQYWdlPiBtVWk7Cit9OworCitjbGFzcyBMYXRlc3RWZXJzaW9uTG9hZFRhc2sgOiBwdWJsaWMgUU9iamVjdCB7CisgICAgUV9PQkpFQ1QKKworcHVibGljIHNsb3RzOgorICAgIHZvaWQgcnVuKCk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBmaW5pc2hlZChRU3RyaW5nIHZlcnNpb24pOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2hlbHAtcGFnZS51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2hlbHAtcGFnZS51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg1YzNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvaGVscC1wYWdlLnVpCkBAIC0wLDAgKzEsNTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPkhlbHBQYWdlPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJIZWxwUGFnZSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjYyMjwvd2lkdGg+CisgICAgPGhlaWdodD41ODA8L2hlaWdodD4KKyAgIDwvcmVjdD4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmc+Rm9ybTwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRVGFiV2lkZ2V0IiBuYW1lPSJoZWxwX3RhYnMiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjIwPC95PgorICAgICA8d2lkdGg+NjAwPC93aWR0aD4KKyAgICAgPGhlaWdodD41NTA8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvciI+CisgICAgPGN1cnNvclNoYXBlPkFycm93Q3Vyc29yPC9jdXJzb3JTaGFwZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPjA8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWJfMyI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+CisgICAgIDxzdHJpbmc+S2V5Ym9hcmQgc2hvcnRjdXRzPC9zdHJpbmc+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPHdpZGdldCBjbGFzcz0iUVRhYmxlV2lkZ2V0IiBuYW1lPSJzaG9ydGN1dHNUYWJsZVdpZGdldCI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4xMDwveD4KKyAgICAgICA8eT4xMDwveT4KKyAgICAgICA8d2lkdGg+NTcwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjUwMDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9jdXNQb2xpY3kiPgorICAgICAgPGVudW0+UXQ6Ok5vRm9jdXM8L2VudW0+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJlZGl0VHJpZ2dlcnMiPgorICAgICAgPHNldD5RQWJzdHJhY3RJdGVtVmlldzo6Tm9FZGl0VHJpZ2dlcnM8L3NldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InNlbGVjdGlvbk1vZGUiPgorICAgICAgPGVudW0+UUFic3RyYWN0SXRlbVZpZXc6Ok5vU2VsZWN0aW9uPC9lbnVtPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic2VsZWN0aW9uQmVoYXZpb3IiPgorICAgICAgPGVudW0+UUFic3RyYWN0SXRlbVZpZXc6OlNlbGVjdFJvd3M8L2VudW0+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG93R3JpZCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImNvcm5lckJ1dHRvbkVuYWJsZWQiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaG9yaXpvbnRhbEhlYWRlckRlZmF1bHRTZWN0aW9uU2l6ZSI+CisgICAgICA8bnVtYmVyPjE5MDwvbnVtYmVyPgorICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgPGF0dHJpYnV0ZSBuYW1lPSJob3Jpem9udGFsSGVhZGVyU3RyZXRjaExhc3RTZWN0aW9uIj4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvYXR0cmlidXRlPgorICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnRpY2FsSGVhZGVyVmlzaWJsZSI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9hdHRyaWJ1dGU+CisgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVydGljYWxIZWFkZXJEZWZhdWx0U2VjdGlvblNpemUiPgorICAgICAgPG51bWJlcj40ODwvbnVtYmVyPgorICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJ0aWNhbEhlYWRlckhpZ2hsaWdodFNlY3Rpb25zIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgPGNvbHVtbj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICA8c3RyaW5nPkNvbW1hbmQ8L3N0cmluZz4KKyAgICAgIDwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dEFsaWdubWVudCI+CisgICAgICAgPHNldD5BbGlnbkxlYWRpbmd8QWxpZ25WQ2VudGVyPC9zZXQ+CisgICAgICA8L3Byb3BlcnR5PgorICAgICA8L2NvbHVtbj4KKyAgICAgPGNvbHVtbj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICA8c3RyaW5nPktleTwvc3RyaW5nPgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0QWxpZ25tZW50Ij4KKyAgICAgICA8c2V0PkFsaWduTGVhZGluZ3xBbGlnblZDZW50ZXI8L3NldD4KKyAgICAgIDwvcHJvcGVydHk+CisgICAgIDwvY29sdW1uPgorICAgIDwvd2lkZ2V0PgorICAgPC93aWRnZXQ+CisgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWJfNCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+CisgICAgIDxzdHJpbmc+RW11bGF0b3IgaGVscDwvc3RyaW5nPgorICAgIDwvYXR0cmlidXRlPgorICAgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJoZWxwX2RvY3MiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+NDwveD4KKyAgICAgICA8eT4xMDwveT4KKyAgICAgICA8d2lkdGg+MTQ1PC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgIDx3ZWlnaHQ+NzU8L3dlaWdodD4KKyAgICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iY3Vyc29yIj4KKyAgICAgIDxjdXJzb3JTaGFwZT5Qb2ludGluZ0hhbmRDdXJzb3I8L2N1cnNvclNoYXBlPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRleHQtYWxpZ246bGVmdDsgcGFkZGluZzozcHg7PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmc+RE9DVU1FTlRBVElPTjwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+VG9vbDwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iaGVscF9maWxlQnVnIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjQ8L3g+CisgICAgICAgPHk+NjA8L3k+CisgICAgICAgPHdpZHRoPjE0NTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgICA8d2VpZ2h0Pjc1PC93ZWlnaHQ+CisgICAgICAgPGJvbGQ+dHJ1ZTwvYm9sZD4KKyAgICAgIDwvZm9udD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvciI+CisgICAgICA8Y3Vyc29yU2hhcGU+UG9pbnRpbmdIYW5kQ3Vyc29yPC9jdXJzb3JTaGFwZT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5UZXh0LWFsaWduOmxlZnQ7IHBhZGRpbmc6M3B4Ozwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPkZJTEUgQSBCVUc8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImhlbHBfc2VuZEZlZWRiYWNrIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjQ8L3g+CisgICAgICAgPHk+MTEwPC95PgorICAgICAgIDx3aWR0aD4xNDU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MzY8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICAgPGZvbnQ+CisgICAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICAgIDxib2xkPnRydWU8L2JvbGQ+CisgICAgICA8L2ZvbnQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiPgorICAgICAgPGN1cnNvclNoYXBlPlBvaW50aW5nSGFuZEN1cnNvcjwvY3Vyc29yU2hhcGU+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+VGV4dC1hbGlnbjpsZWZ0OyBwYWRkaW5nOjNweDs8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZz5TRU5EIEZFRURCQUNLPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5Ub29sPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgPC93aWRnZXQ+CisgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWIiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiPgorICAgICA8c3RyaW5nPkxpY2Vuc2VzPC9zdHJpbmc+CisgICAgPC9hdHRyaWJ1dGU+CisgICAgPHdpZGdldCBjbGFzcz0iUVBsYWluVGV4dEVkaXQiIG5hbWU9ImhlbHBfbGljZW5zZVRleHQiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MTA8L3k+CisgICAgICAgPHdpZHRoPjU3MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD41MDA8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICAgPGZvbnQ+CisgICAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgICA8L2ZvbnQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZWFkT25seSI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgPC93aWRnZXQ+CisgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWJfNSI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+CisgICAgIDxzdHJpbmc+QWJvdXQ8L3N0cmluZz4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUGxhaW5UZXh0RWRpdCIgbmFtZT0iaGVscF9hZGJTZXJpYWxOdW1iZXJCb3giPgorICAgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlZCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+Mjg8L3k+CisgICAgICAgPHdpZHRoPjI3NTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSI+CisgICAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkZpeGVkIiB2c2l6ZXR5cGU9IkZpeGVkIj4KKyAgICAgICA8aG9yc3RyZXRjaD4wPC9ob3JzdHJldGNoPgorICAgICAgIDx2ZXJzdHJldGNoPjA8L3ZlcnN0cmV0Y2g+CisgICAgICA8L3NpemVwb2xpY3k+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idmVydGljYWxTY3JvbGxCYXJQb2xpY3kiPgorICAgICAgPGVudW0+UXQ6OlNjcm9sbEJhckFsd2F5c09mZjwvZW51bT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imhvcml6b250YWxTY3JvbGxCYXJQb2xpY3kiPgorICAgICAgPGVudW0+UXQ6OlNjcm9sbEJhckFsd2F5c09mZjwvZW51bT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlYWRPbmx5Ij4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbGFpblRleHQiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5lbXVsYXRvci01NTU0PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJhbmRyb2lkVmVyc2lvblRpdGxlIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjMyNDwveD4KKyAgICAgICA8eT4xMDwveT4KKyAgICAgICA8d2lkdGg+MTgxPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICA8L2ZvbnQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgICA8c3RyaW5nPkFuZHJvaWQgdmVyc2lvbjwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImFkYlNlcmlhbE51bWJlclRpdGxlIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjEwPC94PgorICAgICAgIDx5PjEwPC95PgorICAgICAgIDx3aWR0aD4xODE8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICAgPGZvbnQ+CisgICAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgIDwvZm9udD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5ib3JkZXI6IDBweDs8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICAgIDxzdHJpbmc+RW11bGF0b3IgQURCIHNlcmlhbCBudW1iZXI8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJ2ZXJzaW9uVGl0bGUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+ODQ8L3k+CisgICAgICAgPHdpZHRoPjE4MTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgICAgPHN0cmluZz5FbXVsYXRvciB2ZXJzaW9uPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFQbGFpblRleHRFZGl0IiBuYW1lPSJoZWxwX3ZlcnNpb25Cb3giPgorICAgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlZCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MTAyPC95PgorICAgICAgIDx3aWR0aD4yNzU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InNpemVQb2xpY3kiPgorICAgICAgPHNpemVwb2xpY3kgaHNpemV0eXBlPSJGaXhlZCIgdnNpemV0eXBlPSJGaXhlZCI+CisgICAgICAgPGhvcnN0cmV0Y2g+MDwvaG9yc3RyZXRjaD4KKyAgICAgICA8dmVyc3RyZXRjaD4wPC92ZXJzdHJldGNoPgorICAgICAgPC9zaXplcG9saWN5PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgIDwvZm9udD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImFjY2Vzc2libGVOYW1lIj4KKyAgICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idmVydGljYWxTY3JvbGxCYXJQb2xpY3kiPgorICAgICAgPGVudW0+UXQ6OlNjcm9sbEJhckFsd2F5c09mZjwvZW51bT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imhvcml6b250YWxTY3JvbGxCYXJQb2xpY3kiPgorICAgICAgPGVudW0+UXQ6OlNjcm9sbEJhckFsd2F5c09mZjwvZW51bT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InVuZG9SZWRvRW5hYmxlZCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlYWRPbmx5Ij4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbGFpblRleHQiPgorICAgICAgPHN0cmluZz4xLjQ8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUGxhaW5UZXh0RWRpdCIgbmFtZT0iaGVscF9hbmRyb2lkVmVyc2lvbkJveCI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVkIj4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zMjQ8L3g+CisgICAgICAgPHk+Mjg8L3k+CisgICAgICAgPHdpZHRoPjI2NTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSI+CisgICAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkZpeGVkIiB2c2l6ZXR5cGU9IkZpeGVkIj4KKyAgICAgICA8aG9yc3RyZXRjaD4wPC9ob3JzdHJldGNoPgorICAgICAgIDx2ZXJzdHJldGNoPjA8L3ZlcnN0cmV0Y2g+CisgICAgICA8L3NpemVwb2xpY3k+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iYWNjZXNzaWJsZU5hbWUiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbFNjcm9sbEJhclBvbGljeSI+CisgICAgICA8ZW51bT5RdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmPC9lbnVtPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeSI+CisgICAgICA8ZW51bT5RdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmPC9lbnVtPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idW5kb1JlZG9FbmFibGVkIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVhZE9ubHkiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InBsYWluVGV4dCI+CisgICAgICA8c3RyaW5nPlVua25vd24gQVBJIHZlcnNpb248L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUGxhaW5UZXh0RWRpdCIgbmFtZT0iaGVscF9sYXRlc3RWZXJzaW9uQm94Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZWQiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjMyNDwveD4KKyAgICAgICA8eT4xMDI8L3k+CisgICAgICAgPHdpZHRoPjI2NTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZVBvbGljeSI+CisgICAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkZpeGVkIiB2c2l6ZXR5cGU9IkZpeGVkIj4KKyAgICAgICA8aG9yc3RyZXRjaD4wPC9ob3JzdHJldGNoPgorICAgICAgIDx2ZXJzdHJldGNoPjA8L3ZlcnN0cmV0Y2g+CisgICAgICA8L3NpemVwb2xpY3k+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iYWNjZXNzaWJsZU5hbWUiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJ0aWNhbFNjcm9sbEJhclBvbGljeSI+CisgICAgICA8ZW51bT5RdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmPC9lbnVtPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeSI+CisgICAgICA8ZW51bT5RdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmPC9lbnVtPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idW5kb1JlZG9FbmFibGVkIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVhZE9ubHkiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InBsYWluVGV4dCI+CisgICAgICA8c3RyaW5nPlVuYXZhaWxhYmxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJhdmFpbFZlcnNpb25UaXRsZSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zMjQ8L3g+CisgICAgICAgPHk+ODQ8L3k+CisgICAgICAgPHdpZHRoPjIyMTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgICAgPHN0cmluZz5MYXRlc3QgYXZhaWxhYmxlIGVtdWxhdG9yIHZlcnNpb248L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHpvcmRlcj5hZGJTZXJpYWxOdW1iZXJUaXRsZTwvem9yZGVyPgorICAgIDx6b3JkZXI+YXZhaWxWZXJzaW9uVGl0bGU8L3pvcmRlcj4KKyAgICA8em9yZGVyPmhlbHBfYWRiU2VyaWFsTnVtYmVyQm94PC96b3JkZXI+CisgICAgPHpvcmRlcj5hbmRyb2lkVmVyc2lvblRpdGxlPC96b3JkZXI+CisgICAgPHpvcmRlcj52ZXJzaW9uVGl0bGU8L3pvcmRlcj4KKyAgICA8em9yZGVyPmhlbHBfdmVyc2lvbkJveDwvem9yZGVyPgorICAgIDx6b3JkZXI+aGVscF9hbmRyb2lkVmVyc2lvbkJveDwvem9yZGVyPgorICAgIDx6b3JkZXI+aGVscF9sYXRlc3RWZXJzaW9uQm94PC96b3JkZXI+CisgICA8L3dpZGdldD4KKyAgPC93aWRnZXQ+CisgPC93aWRnZXQ+CisgPHJlc291cmNlcy8+CisgPGNvbm5lY3Rpb25zLz4KKzwvdWk+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9sb2NhdGlvbi1wYWdlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2xvY2F0aW9uLXBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9sb2NhdGlvbi1wYWdlLmNwcApAQCAtMCwwICsxLDU4MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2xvY2F0aW9uLXBhZ2UuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvbG9jYXRpb25fYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dwcy9HcHhQYXJzZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dwcy9LbWxQYXJzZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvTWV0cmljc1JlcG9ydGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL3Byb3RvL3N0dWRpb19zdGF0cy5wYi5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2V0dGluZ3MtYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXJyb3ItZGlhbG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2NvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9xdC1zZXR0aW5ncy5oIgorCisjaW5jbHVkZSA8UUZpbGVEaWFsb2c+CisjaW5jbHVkZSA8UVNldHRpbmdzPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitzdGF0aWMgY29uc3QgZG91YmxlIGtHcGxleExvbiA9IC0xMjIuMDg0Oworc3RhdGljIGNvbnN0IGRvdWJsZSBrR3BsZXhMYXQgPSAgIDM3LjQyMjsKKworTG9jYXRpb25QYWdlOjpMb2NhdGlvblBhZ2UoUVdpZGdldCAqcGFyZW50KSA6CisgICAgUVdpZGdldChwYXJlbnQpLAorICAgIG1VaShuZXcgVWk6OkxvY2F0aW9uUGFnZSksCisgICAgbU5vd0xvYWRpbmdHZW9EYXRhKGZhbHNlKSwKKyAgICBtR2VvRGF0YUxvYWRpbmdTdG9wUmVxdWVzdGVkKGZhbHNlKQoreworICAgIG1VaS0+c2V0dXBVaSh0aGlzKTsKKyAgICBtTm93UGxheWluZyA9IGZhbHNlOworICAgIG1UaW1lci5zZXRTaW5nbGVTaG90KHRydWUpOworCisgICAgLy8gV2UgY2FuIG9ubHkgc2VuZCAxIGRlY2ltYWwgb2YgYWx0aXR1ZGUgKGluIG1ldGVycykuCisgICAgbUFsdGl0dWRlVmFsaWRhdG9yLnNldE5vdGF0aW9uKFFEb3VibGVWYWxpZGF0b3I6OlN0YW5kYXJkTm90YXRpb24pOworICAgIG1BbHRpdHVkZVZhbGlkYXRvci5zZXRSYW5nZSgtMTAwMCwgMTAwMDAsIDEpOworICAgIG1BbHRpdHVkZVZhbGlkYXRvci5zZXRMb2NhbGUoUUxvY2FsZTo6Qyk7CisgICAgbVVpLT5sb2NfYWx0aXR1ZGVJbnB1dC0+c2V0VmFsaWRhdG9yKCZtQWx0aXR1ZGVWYWxpZGF0b3IpOworCisgICAgbVVpLT5sb2NfbGF0aXR1ZGVJbnB1dC0+c2V0TWluVmFsdWUoLTkwLjApOworICAgIG1VaS0+bG9jX2xhdGl0dWRlSW5wdXQtPnNldE1heFZhbHVlKDkwLjApOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJm1UaW1lciwgJlFUaW1lcjo6dGltZW91dCwgdGhpcywgJkxvY2F0aW9uUGFnZTo6dGltZW91dCk7CisgICAgUU9iamVjdDo6Y29ubmVjdCh0aGlzLCAmTG9jYXRpb25QYWdlOjpsb2NhdGlvblVwZGF0ZVJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgdGhpcywgJkxvY2F0aW9uUGFnZTo6dXBkYXRlRGlzcGxheWVkTG9jYXRpb24pOworICAgIHNldEJ1dHRvbkVuYWJsZWQobVVpLT5sb2NfcGxheVN0b3BCdXR0b24sIGdldFNlbGVjdGVkVGhlbWUoKSwgZmFsc2UpOworCisgICAgLy8gUmVzdG9yZSBwcmV2aW91cyB2YWx1ZXMuIElmIHRoZXJlIGFyZSBubyBwcmV2aW91cyB2YWx1ZXMsIHVzZSB0aGUKKyAgICAvLyBHb29nbGVwbGV4J3MgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZS4KKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgZG91YmxlIGFsdFZhbHVlID0gc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpMT0NBVElPTl9FTlRFUkVEX0FMVElUVURFLCAwLjApLnRvRG91YmxlKCk7CisgICAgbVVpLT5sb2NfYWx0aXR1ZGVJbnB1dC0+c2V0VGV4dCggUVN0cmluZzo6bnVtYmVyKGFsdFZhbHVlLCAnZicsIDEpICk7CisgICAgbVVpLT5sb2NfbG9uZ2l0dWRlSW5wdXQtPnNldFZhbHVlKAorICAgICAgICAgICAgc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpMT0NBVElPTl9FTlRFUkVEX0xPTkdJVFVERSwga0dwbGV4TG9uKS50b0RvdWJsZSgpKTsKKyAgICBtVWktPmxvY19sYXRpdHVkZUlucHV0LT5zZXRWYWx1ZSgKKyAgICAgICAgICAgIHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fRU5URVJFRF9MQVRJVFVERSwga0dwbGV4TGF0KS50b0RvdWJsZSgpKTsKKyAgICBtVWktPmxvY19wbGF5YmFja1NwZWVkLT5zZXRDdXJyZW50SW5kZXgoCisgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkxPQ0FUSU9OX1BMQVlCQUNLX1NQRUVELCAwKS50b0ludCgpKTsKKyAgICBRU3RyaW5nIGxvY2F0aW9uX2RhdGFfZmlsZSA9CisgICAgICAgIHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fUExBWUJBQ0tfRklMRSwgIiIpLnRvU3RyaW5nKCk7CisgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5ob3Jpem9udGFsSGVhZGVyKCktPnNldFNlY3Rpb25SZXNpemVNb2RlKFFIZWFkZXJWaWV3OjpTdHJldGNoKTsKKyAgICBtR2VvRGF0YUxvYWRlciA9IEdlb0RhdGFMb2FkZXJUaHJlYWQ6Om5ld0luc3RhbmNlKAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1QoZ2VvRGF0YVRocmVhZFN0YXJ0ZWQoKSksCisgICAgICAgICAgICBTTE9UKHN0YXJ0dXBHZW9EYXRhVGhyZWFkRmluaXNoZWQoUVN0cmluZywgYm9vbCwgUVN0cmluZykpKTsKKyAgICBtR2VvRGF0YUxvYWRlci0+bG9hZEdlb0RhdGFGcm9tRmlsZShsb2NhdGlvbl9kYXRhX2ZpbGUsICZtR3BzRml4ZXNBcnJheSk7CisKKyAgICB1c2luZyBhbmRyb2lkOjptZXRyaWNzOjpQZXJpb2RpY1JlcG9ydGVyOworICAgIG1NZXRyaWNzUmVwb3J0aW5nVG9rZW4gPSBQZXJpb2RpY1JlcG9ydGVyOjpnZXQoKS5hZGRDYW5jZWxhYmxlVGFzaygKKyAgICAgICAgICAgIDYwICogMTAgKiAxMDAwLCAgLy8gcmVwb3J0aW5nIHBlcmlvZAorICAgICAgICAgICAgW3RoaXNdKGFuZHJvaWRfc3R1ZGlvOjpBbmRyb2lkU3R1ZGlvRXZlbnQqIGV2ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKG1Mb2NhdGlvblVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQtPm11dGFibGVfZW11bGF0b3JfZGV0YWlscygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5tdXRhYmxlX3VzZWRfZmVhdHVyZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+c2V0X2dwcyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbU1ldHJpY3NSZXBvcnRpbmdUb2tlbi5yZXNldCgpOyAgLy8gUmVwb3J0IGl0IG9ubHkgb25jZS4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KTsKK30KKworTG9jYXRpb25QYWdlOjp+TG9jYXRpb25QYWdlKCkgeworICAgIGlmIChtR2VvRGF0YUxvYWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBsb2FkZXIgdGhyZWFkIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQsCisgICAgICAgIC8vIGlnbm9yZSBhbGwgc2lnbmFscyBmcm9tIGl0IGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCisgICAgICAgIG1HZW9EYXRhTG9hZGVyLT5ibG9ja1NpZ25hbHModHJ1ZSk7CisgICAgICAgIG1HZW9EYXRhTG9hZGVyLT53YWl0KCk7CisgICAgfQorfQorCit2b2lkIExvY2F0aW9uUGFnZTo6c2V0TG9jYXRpb25BZ2VudChjb25zdCBRQW5kcm9pZExvY2F0aW9uQWdlbnQqIGFnZW50KSB7CisgICAgbUxvY2F0aW9uQWdlbnQgPSBhZ2VudDsKKworICAgIC8vIFNob3cgdGhlIHVzZXIgdGhlIGRldmljZSdzIGN1cnJlbnQgbG9jYXRpb24uCisgICAgZG91YmxlIGN1ckxhdCwgY3VyTG9uLCBjdXJBbHQ7CisgICAgZ2V0RGV2aWNlTG9jYXRpb24obUxvY2F0aW9uQWdlbnQsICZjdXJMYXQsICZjdXJMb24sICZjdXJBbHQpOworCisgICAgc2VuZExvY2F0aW9uVG9EZXZpY2UobUxvY2F0aW9uQWdlbnQsIGN1ckxhdCwgY3VyTG9uLCBjdXJBbHQpOworCisgICAgLy8gV2UgY2Fubm90IHVwZGF0ZSB0aGUgVUkgaGVyZSBiZWNhdXNlIHdlIGFyZSBub3QgY2FsbGVkIGZyb20KKyAgICAvLyB0aGUgUXQgdGhyZWFkLiBFbWl0IGEgc2lnbmFsIHRvIGRvIHRoYXQgdXBkYXRlLgorICAgIGVtaXQgbG9jYXRpb25VcGRhdGVSZXF1aXJlZChjdXJMYXQsIGN1ckxvbiwgY3VyQWx0KTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Om9uX2xvY19HcHhLbWxCdXR0b25fY2xpY2tlZCgpCit7CisgICAgLy8gVXNlIGRpYWxvZyB0byBnZXQgZmlsZSBuYW1lCisgICAgUVN0cmluZyBmaWxlTmFtZSA9IFFGaWxlRGlhbG9nOjpnZXRPcGVuRmlsZU5hbWUodGhpcywgdHIoIk9wZW4gR1BYIG9yIEtNTCBGaWxlIiksICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cigiR1BYIGFuZCBLTUwgZmlsZXMgKCouZ3B4ICoua21sKSIpKTsKKworICAgIGlmIChmaWxlTmFtZS5pc051bGwoKSkgcmV0dXJuOworCisgICAgLy8gQXN5bmNocm9ub3VzbHkgcGFyc2UgdGhlIGZpbGUgd2l0aCBnZW8gZGF0YS4KKyAgICAvLyBJZiB0aGUgZmlsZSBpcyBiaWcgZW5vdWdoLCBwYXJzaW5nIGl0IHN5bmNocm9ub3VzbHkgd2lsbCBjYXVzZSBhIG5vdGljZWFibGUKKyAgICAvLyBoaWNjdXAgaW4gdGhlIFVJLgorICAgIG1HZW9EYXRhTG9hZGVyID0gR2VvRGF0YUxvYWRlclRocmVhZDo6bmV3SW5zdGFuY2UodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QoZ2VvRGF0YVRocmVhZFN0YXJ0ZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTE9UKGdlb0RhdGFUaHJlYWRGaW5pc2hlZChRU3RyaW5nLCBib29sLCBRU3RyaW5nKSkpOworICAgIG1HZW9EYXRhTG9hZGVyLT5sb2FkR2VvRGF0YUZyb21GaWxlKGZpbGVOYW1lLCAmbUdwc0ZpeGVzQXJyYXkpOworfQorCit2b2lkIExvY2F0aW9uUGFnZTo6b25fbG9jX3BhdGhUYWJsZV9jZWxsQ2hhbmdlZChpbnQgcm93LCBpbnQgY29sKQoreworICAgIC8vIElmIHRoZSBjZWxsJ3MgY29udGVudHMgYXJlIGJhZCwgdHVybiB0aGUgY2VsbCByZWQKKyAgICBRU3RyaW5nIG91dEVycm9yTWVzc2FnZTsKKyAgICBib29sIGNlbGxPSyA9IHZhbGlkYXRlQ2VsbChtVWktPmxvY19wYXRoVGFibGUsIHJvdywgY29sLCAmb3V0RXJyb3JNZXNzYWdlKTsKKyAgICBRQ29sb3Igbm9ybWFsQ29sb3IgPQorICAgICAgICBnZXRTZWxlY3RlZFRoZW1lKCkgPT0gU0VUVElOR1NfVEhFTUVfTElHSFQgPyBRdDo6YmxhY2sgOiBRdDo6d2hpdGU7CisgICAgUUNvbG9yIG5ld0NvbG9yID0gKGNlbGxPSyA/IG5vcm1hbENvbG9yIDogUXQ6OnJlZCk7CisgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5pdGVtKHJvdywgY29sKS0+c2V0Rm9yZWdyb3VuZChRQnJ1c2gobmV3Q29sb3IpKTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Om9uX2xvY19wbGF5U3RvcEJ1dHRvbl9jbGlja2VkKCkgeworICAgIG1Mb2NhdGlvblVzZWQgPSB0cnVlOworICAgIGlmIChtTm93UGxheWluZykgeworICAgICAgICBsb2NhdGlvblBsYXliYWNrU3RvcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvY2F0aW9uUGxheWJhY2tTdGFydCgpOworICAgIH0KK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Om9uX2xvY19tb2RlU3dpdGNoX2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID09IDEpIHsKKyAgICAgICAgbVVpLT5sb2NfbGF0aXR1ZGVJbnB1dC0+c2V0SW5wdXRNb2RlKEFuZ2xlSW5wdXRXaWRnZXQ6OklucHV0TW9kZTo6U2V4YWdlc2ltYWwpOworICAgICAgICBtVWktPmxvY19sb25naXR1ZGVJbnB1dC0+c2V0SW5wdXRNb2RlKEFuZ2xlSW5wdXRXaWRnZXQ6OklucHV0TW9kZTo6U2V4YWdlc2ltYWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1VaS0+bG9jX2xhdGl0dWRlSW5wdXQtPnNldElucHV0TW9kZShBbmdsZUlucHV0V2lkZ2V0OjpJbnB1dE1vZGU6OkRlY2ltYWwpOworICAgICAgICBtVWktPmxvY19sb25naXR1ZGVJbnB1dC0+c2V0SW5wdXRNb2RlKEFuZ2xlSW5wdXRXaWRnZXQ6OklucHV0TW9kZTo6RGVjaW1hbCk7CisgICAgfQorfQorCit2b2lkIExvY2F0aW9uUGFnZTo6b25fbG9jX3NlbmRQb2ludEJ1dHRvbl9jbGlja2VkKCkgeworICAgIG1Mb2NhdGlvblVzZWQgPSB0cnVlOworICAgIG1VaS0+bG9jX2xhdGl0dWRlSW5wdXQtPmZvcmNlVXBkYXRlKCk7CisgICAgbVVpLT5sb2NfbG9uZ2l0dWRlSW5wdXQtPmZvcmNlVXBkYXRlKCk7CisKKyAgICBkb3VibGUgYWx0aXR1ZGUgPSBtVWktPmxvY19hbHRpdHVkZUlucHV0LT50ZXh0KCkudG9Eb3VibGUoKTsKKyAgICBpZiAoYWx0aXR1ZGUgPCAtMTAwMC4wIHx8IGFsdGl0dWRlID4gMTAwMDAuMCkgeworICAgICAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIG1VaS0+bG9jX2FsdGl0dWRlSW5wdXQtPnNldFRleHQoUVN0cmluZzo6bnVtYmVyKAorICAgICAgICAgICAgICAgIHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fRU5URVJFRF9BTFRJVFVERSwgMC4wKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvRG91YmxlKCkpKTsKKyAgICB9CisKKyAgICB1cGRhdGVEaXNwbGF5ZWRMb2NhdGlvbihtVWktPmxvY19sYXRpdHVkZUlucHV0LT52YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaS0+bG9jX2xvbmdpdHVkZUlucHV0LT52YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1VaS0+bG9jX2FsdGl0dWRlSW5wdXQtPnRleHQoKS50b0RvdWJsZSgpKTsKKworICAgIHNlbmRMb2NhdGlvblRvRGV2aWNlKG1Mb2NhdGlvbkFnZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1VaS0+bG9jX2xhdGl0dWRlSW5wdXQtPnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbVVpLT5sb2NfbG9uZ2l0dWRlSW5wdXQtPnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbVVpLT5sb2NfYWx0aXR1ZGVJbnB1dC0+dGV4dCgpLnRvRG91YmxlKCkpOworfQorCit2b2lkIExvY2F0aW9uUGFnZTo6dXBkYXRlRGlzcGxheWVkTG9jYXRpb24oZG91YmxlIGxhdCwgZG91YmxlIGxvbiwgZG91YmxlIGFsdCkgeworICAgIFFTdHJpbmcgY3VyTG9jID0gdHIoIkxvbmdpdHVkZTogJTFcbkxhdGl0dWRlOiAlMlxuQWx0aXR1ZGU6ICUzIikKKyAgICAgICAgICAgICAgICAgICAgIC5hcmcobG9uLCAwLCAnZicsIDQpLmFyZyhsYXQsIDAsICdmJywgNCkuYXJnKGFsdCwgMCwgJ2YnLCAxKTsKKyAgICBtVWktPmxvY19jdXJyZW50TG9jLT5zZXRQbGFpblRleHQoY3VyTG9jKTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Om9uX2xvY19sb25naXR1ZGVJbnB1dF92YWx1ZUNoYW5nZWQoZG91YmxlIHZhbHVlKSB7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fRU5URVJFRF9MT05HSVRVREUsIHZhbHVlKTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Om9uX2xvY19sYXRpdHVkZUlucHV0X3ZhbHVlQ2hhbmdlZChkb3VibGUgdmFsdWUpIHsKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpMT0NBVElPTl9FTlRFUkVEX0xBVElUVURFLCB2YWx1ZSk7Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpvbl9sb2NfYWx0aXR1ZGVJbnB1dF9lZGl0aW5nRmluaXNoZWQoKSB7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fRU5URVJFRF9BTFRJVFVERSwKKyAgICAgICAgICAgICAgICAgICAgICBtVWktPmxvY19hbHRpdHVkZUlucHV0LT50ZXh0KCkudG9Eb3VibGUoKSk7Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpvbl9sb2NfcGxheWJhY2tTcGVlZF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkxPQ0FUSU9OX1BMQVlCQUNLX1NQRUVELCBpbmRleCk7Cit9CisKK2Jvb2wgTG9jYXRpb25QYWdlOjp2YWxpZGF0ZUNlbGwoUVRhYmxlV2lkZ2V0KiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVN0cmluZyogb3V0RXJyb3JNZXNzYWdlKSB7CisgICAgUVRhYmxlV2lkZ2V0SXRlbSAqdGhlSXRlbTsKKyAgICBkb3VibGUgY2VsbFZhbHVlOworICAgIGJvb2wgY2VsbE9LID0gdHJ1ZTsKKworICAgIC8vIFRoZSBlbnRyeSBpcyBhIG51bWJlci4gQ2hlY2sgaXRzIHJhbmdlLgorICAgIHN3aXRjaCAoY29sKSB7CisgICAgICAgIGNhc2UgMDogLy8gRGVsYXkKKyAgICAgICAgICAgIHRoZUl0ZW0gPSB0YWJsZS0+aXRlbShyb3csIGNvbCk7CisgICAgICAgICAgICBjZWxsVmFsdWUgPSB0aGVJdGVtLT50ZXh0KCkudG9Eb3VibGUoJmNlbGxPSyk7IC8vIFNldHMgJ2NlbGxPSycKKyAgICAgICAgICAgIGlmICghY2VsbE9LKSB7CisgICAgICAgICAgICAgICAgKm91dEVycm9yTWVzc2FnZSA9IHRyKCJEZWxheSBtdXN0IGJlIGEgbnVtYmVyLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEV4Y2VwdCBmb3IgdGhlIGZpcnN0IGVudHJ5LCB0aGUgZGVsYXkgbXVzdCBiZSA+PSAxIG1pbGxpc2Vjb25kCisgICAgICAgICAgICBpZiAocm93ICE9IDAgJiYgY2VsbFZhbHVlIDwgMC4wMDEpIHsKKyAgICAgICAgICAgICAgICAqb3V0RXJyb3JNZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyKCJEZWxheSBtdXN0IGJlID49IDEgbWlsbGlzZWNvbmQgd2l0aCB0aGUgZXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0aGUgZmlyc3QgZW50cnkuIik7CisgICAgICAgICAgICAgICAgY2VsbE9LID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyBMYXRpdHVkZQorICAgICAgICAgICAgdGhlSXRlbSA9IHRhYmxlLT5pdGVtKHJvdywgY29sKTsKKyAgICAgICAgICAgIGNlbGxWYWx1ZSA9IHRoZUl0ZW0tPnRleHQoKS50b0RvdWJsZSgmY2VsbE9LKTsgLy8gU2V0cyAnY2VsbE9LJworICAgICAgICAgICAgaWYgKCFjZWxsT0spIHsKKyAgICAgICAgICAgICAgICAqb3V0RXJyb3JNZXNzYWdlID0gdHIoIkxhdGl0dWRlIG11c3QgYmUgYSBudW1iZXIuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNlbGxWYWx1ZSA8IC05MC4wIHx8IGNlbGxWYWx1ZSA+IDkwLjApIHsKKyAgICAgICAgICAgICAgICAqb3V0RXJyb3JNZXNzYWdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyKCJMYXRpdHVkZSBtdXN0IGJlIGJldHdlZW4gLTkwIGFuZCA5MCwgaW5jbHVzaXZlLiIpOworICAgICAgICAgICAgICAgIGNlbGxPSyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gTG9uZ2l0dWRlCisgICAgICAgICAgICB0aGVJdGVtID0gdGFibGUtPml0ZW0ocm93LCBjb2wpOworICAgICAgICAgICAgY2VsbFZhbHVlID0gdGhlSXRlbS0+dGV4dCgpLnRvRG91YmxlKCZjZWxsT0spOyAvLyBTZXRzICdjZWxsT0snCisgICAgICAgICAgICBpZiAoIWNlbGxPSykgeworICAgICAgICAgICAgICAgICpvdXRFcnJvck1lc3NhZ2UgPSB0cigiTG9uZ2l0dWRlIG11c3QgYmUgYSBudW1iZXIuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNlbGxWYWx1ZSA8IC0xODAuMCB8fCBjZWxsVmFsdWUgPiAxODAuMCkgeworICAgICAgICAgICAgICAgICpvdXRFcnJvck1lc3NhZ2UgPSB0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICJMb25naXR1ZGUgbXVzdCBiZSBiZXR3ZWVuIC0xODAgYW5kIDE4MCwgaW5jbHVzaXZlLiIpOworICAgICAgICAgICAgICAgIGNlbGxPSyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gRWxldmF0aW9uCisgICAgICAgICAgICB0aGVJdGVtID0gdGFibGUtPml0ZW0ocm93LCBjb2wpOworICAgICAgICAgICAgY2VsbFZhbHVlID0gdGhlSXRlbS0+dGV4dCgpLnRvRG91YmxlKCZjZWxsT0spOyAvLyBTZXRzICdjZWxsT0snCisgICAgICAgICAgICBpZiAoIWNlbGxPSykgeworICAgICAgICAgICAgICAgICpvdXRFcnJvck1lc3NhZ2UgPSB0cigiRWxldmF0aW9uIG11c3QgYmUgYSBudW1iZXIuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNlbGxWYWx1ZSA8IC0xMDAwLjAgfHwgY2VsbFZhbHVlID4gMTAwMDAuMCkgeworICAgICAgICAgICAgICAgICpvdXRFcnJvck1lc3NhZ2UgPSB0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICJBbHRpdHVkZSBtdXN0IGJlIGJldHdlZW4gLTEwMDAgYW5kIDEwMDAwLCBpbmNsdXNpdmUuIik7CisgICAgICAgICAgICAgICAgY2VsbE9LID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIE5hbWUsIGRlc2NyaXB0aW9uOiBBbnl0aGluZyBpcyBPSworICAgICAgICAgICAgY2VsbE9LID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY2VsbE9LOworfQorCisKK3N0YXRpYyBRVGFibGVXaWRnZXRJdGVtKiBpdGVtRm9yVGFibGUoY29uc3QgUVN0cmluZyYgdGV4dCkgeworICAgIFFUYWJsZVdpZGdldEl0ZW0qIGl0ZW0gPSBuZXcgUVRhYmxlV2lkZ2V0SXRlbSh0ZXh0KTsKKyAgICBpdGVtLT5zZXRUZXh0QWxpZ25tZW50KFF0OjpBbGlnblJpZ2h0IHwgUXQ6OkFsaWduVkNlbnRlcik7CisgICAgcmV0dXJuIGl0ZW07Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpwb3B1bGF0ZVRhYmxlKEdwc0ZpeEFycmF5KiBmaXhlcykKK3sKKyAgICAvLyBEZWxldGUgYWxsIHJvd3MgaW4gdGFibGUKKyAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldFJvd0NvdW50KDApOworCisgICAgaWYgKGZpeGVzLT5zaXplKCkgPiAwKSB7CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSwgdGhlIGZpcnN0IHJvdyB3aWxsIGhhdmUgZGVsYXkgMAorICAgICAgICB0aW1lX3QgcHJldmlvdXNUaW1lID0gZml4ZXMtPmF0KDApLnRpbWU7CisgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+c2V0Um93Q291bnQoZml4ZXMtPnNpemUoKSk7CisgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+YmxvY2tTaWduYWxzKHRydWUpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyAhbUdlb0RhdGFMb2FkaW5nU3RvcFJlcXVlc3RlZCAmJiBpIDwgZml4ZXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBHcHNGaXggJmZpeCA9IGZpeGVzLT5hdChpKTsKKyAgICAgICAgICAgIHRpbWVfdCBkZWxheSA9IGZpeC50aW1lIC0gcHJldmlvdXNUaW1lOyAvLyBJbiBzZWNvbmRzCisKKyAgICAgICAgICAgIC8vIEVuc3VyZSBhbGwgb3RoZXIgZGVsYXlzIGFyZSA+IDAsIGV2ZW4gaWYgbXVsdGlwbGUgcG9pbnRzIGhhdmUgdGhlIHNhbWUgdGltZXN0YW1wCisgICAgICAgICAgICBpZiAoZGVsYXkgPT0gMCAmJiBpICE9IDApIHsKKyAgICAgICAgICAgICAgICBkZWxheSA9IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+c2V0SXRlbShpLCAwLCBpdGVtRm9yVGFibGUoUVN0cmluZzo6bnVtYmVyKGRlbGF5KSkpOworICAgICAgICAgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5zZXRJdGVtKGksIDEsIGl0ZW1Gb3JUYWJsZShRU3RyaW5nOjpudW1iZXIoZml4LmxhdGl0dWRlKSkpOworICAgICAgICAgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5zZXRJdGVtKGksIDIsIGl0ZW1Gb3JUYWJsZShRU3RyaW5nOjpudW1iZXIoZml4LmxvbmdpdHVkZSkpKTsKKyAgICAgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+c2V0SXRlbShpLCAzLCBpdGVtRm9yVGFibGUoUVN0cmluZzo6bnVtYmVyKGZpeC5lbGV2YXRpb24pKSk7CisgICAgICAgICAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEl0ZW0oaSwgNCwgaXRlbUZvclRhYmxlKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcoZml4Lm5hbWUpKSk7CisgICAgICAgICAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEl0ZW0oaSwgNSwgaXRlbUZvclRhYmxlKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcoZml4LmRlc2NyaXB0aW9uKSkpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgZml4ZXMgYXJyYXkgY29udGFpbnMgYSBsb3Qgb2YgZWxlbWVudHMsIHRoaXMgbG9vcCBjYW4gY2F1c2UKKyAgICAgICAgICAgIC8vIGEgbGFnIGluIHRoZSBVSS4gSnVzdCBtYWtlIHN1cmUgd2UgbGV0IHRoZSBhcHBsaWNhdGlvbiBoYW5kbGUgVUkKKyAgICAgICAgICAgIC8vIGV2ZW50cyBmb3IgZXZlcnkgZmV3IHJvd3Mgd2UgYWRkLgorICAgICAgICAgICAgaWYgKGkgJSAxMDAgPT0gMCkgeworICAgICAgICAgICAgICAgIHFBcHAtPnByb2Nlc3NFdmVudHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZpb3VzVGltZSA9IGZpeC50aW1lOworICAgICAgICB9CisgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+YmxvY2tTaWduYWxzKGZhbHNlKTsKKyAgICAgICAgc2V0QnV0dG9uRW5hYmxlZChtVWktPmxvY19wbGF5U3RvcEJ1dHRvbiwgZ2V0U2VsZWN0ZWRUaGVtZSgpLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRCdXR0b25FbmFibGVkKG1VaS0+bG9jX3BsYXlTdG9wQnV0dG9uLCBnZXRTZWxlY3RlZFRoZW1lKCksIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpsb2NhdGlvblBsYXliYWNrU3RhcnQoKQoreworICAgIGlmIChtVWktPmxvY19wYXRoVGFibGUtPnJvd0NvdW50KCkgPD0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgYWxsIHRoZSB2YWx1ZXMgaW4gdGhlIHRhYmxlLgorICAgIFFTdHJpbmcgb3V0RXJyb3JNZXNzYWdlOworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1VaS0+bG9jX3BhdGhUYWJsZS0+cm93Q291bnQoKTsgcm93KyspIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbVVpLT5sb2NfcGF0aFRhYmxlLT5jb2x1bW5Db3VudCgpOyBjb2wrKykgeworICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUNlbGwobVVpLT5sb2NfcGF0aFRhYmxlLCByb3csIGNvbCwgJm91dEVycm9yTWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEN1cnJlbnRDZWxsKHJvdywgY29sKTsKKyAgICAgICAgICAgICAgICBzaG93RXJyb3JEaWFsb2codHIoIlRoZSB0YWJsZSBjb250YWlucyBlcnJvcnMuTm8gbG9jYXRpb25zICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlcmUgc2VudC48YnIvPkVycm9yOiAlMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFyZyhvdXRFcnJvck1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cigiR1BTIFBsYXliYWNrIikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1Sb3dUb1NlbmQgPSBzdGQ6Om1heCgwLCBtVWktPmxvY19wYXRoVGFibGUtPmN1cnJlbnRSb3coKSk7CisKKyAgICBTZXR0aW5nc1RoZW1lIHRoZW1lID0gZ2V0U2VsZWN0ZWRUaGVtZSgpOworCisgICAgLy8gRGlzYWJsZSBlZGl0aW5nIHRoZSBkYXRhIGluIHRoZSB0YWJsZSB3aGlsZSBwbGF5YmFjayBpcyBpbiBwcm9ncmVzcy4KKyAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEVkaXRUcmlnZ2VycyhRQWJzdHJhY3RJdGVtVmlldzo6Tm9FZGl0VHJpZ2dlcnMpOworCisgICAgLy8gRGlzYWJsZSBsb2FkaW5nIGEgbmV3IGRhdGFzZXQgd2hpbGUgcGxheWJhY2sgaXMgaW4gcHJvZ3Jlc3MuCisgICAgc2V0QnV0dG9uRW5hYmxlZChtVWktPmxvY19HcHhLbWxCdXR0b24sICB0aGVtZSwgZmFsc2UpOworCisgICAgLy8gQ2hhbmdlIHRoZSBpY29uIG9uIHRoZSBwbGF5L3N0b3AgYnV0dG9uLgorICAgIG1VaS0+bG9jX3BsYXlTdG9wQnV0dG9uLT5zZXRJY29uKGdldEljb25Gb3JDdXJyZW50VGhlbWUoInN0b3AiKSk7CisgICAgbVVpLT5sb2NfcGxheVN0b3BCdXR0b24tPnNldFByb3BlcnR5KCJ0aGVtZUljb25OYW1lIiwgInN0b3AiKTsKKworCisgICAgLy8gVGhlIHRpbWVyIHdpbGwgYmUgdHJpZ2dlcmVkIGZvciB0aGUgZmlyc3Qgcm93IGFmdGVyIHRoaXMKKyAgICAvLyBmdW5jdGlvbiByZXR1cm5zLgorICAgIG1UaW1lci5zZXRJbnRlcnZhbCgwKTsKKyAgICBtVGltZXIuc3RhcnQoKTsKKyAgICBtTm93UGxheWluZyA9IHRydWU7Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpsb2NhdGlvblBsYXliYWNrU3RvcCgpCit7CisgICAgbVRpbWVyLnN0b3AoKTsKKyAgICBpZiAobVJvd1RvU2VuZCA+IDAgJiYKKyAgICAgICAgbVJvd1RvU2VuZCA8PSBtVWktPmxvY19wYXRoVGFibGUtPnJvd0NvdW50KCkpIHsKKyAgICAgICAgaWYgKG1Sb3dUb1NlbmQgPT0gbVVpLT5sb2NfcGF0aFRhYmxlLT5yb3dDb3VudCgpKSB7CisgICAgICAgICAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEN1cnJlbnRJdGVtKG51bGxwdHIpOworICAgICAgICB9CisgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+aXRlbShtUm93VG9TZW5kIC0gMSwgMCktPnNldEljb24oUUljb24oKSk7CisgICAgfQorICAgIG1Sb3dUb1NlbmQgPSAtMTsKKyAgICBTZXR0aW5nc1RoZW1lIHRoZW1lID0gZ2V0U2VsZWN0ZWRUaGVtZSgpOworICAgIHNldEJ1dHRvbkVuYWJsZWQobVVpLT5sb2NfR3B4S21sQnV0dG9uLCAgdGhlbWUsIHRydWUpOworICAgIG1VaS0+bG9jX3BsYXlTdG9wQnV0dG9uLT5zZXRJY29uKGdldEljb25Gb3JDdXJyZW50VGhlbWUoInBsYXlfYXJyb3ciKSk7CisgICAgbVVpLT5sb2NfcGxheVN0b3BCdXR0b24tPnNldFByb3BlcnR5KCJ0aGVtZUljb25OYW1lIiwgInBsYXlfYXJyb3ciKTsKKyAgICBtVWktPmxvY19wYXRoVGFibGUtPnNldEVkaXRUcmlnZ2VycyhRQWJzdHJhY3RJdGVtVmlldzo6RG91YmxlQ2xpY2tlZCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQWJzdHJhY3RJdGVtVmlldzo6RWRpdEtleVByZXNzZWQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUFic3RyYWN0SXRlbVZpZXc6OkFueUtleVByZXNzZWQpOworICAgIG1Ob3dQbGF5aW5nID0gZmFsc2U7Cit9CisKKwordm9pZCBMb2NhdGlvblBhZ2U6OnRpbWVvdXQoKSB7CisgICAgYm9vbCBjZWxsT0s7CisgICAgUVRhYmxlV2lkZ2V0SXRlbSAqdGhlSXRlbTsKKworICAgIC8vIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZGF0YXNldC4KKyAgICBpZiAobVJvd1RvU2VuZCA8IDAgIHx8CisgICAgICAgIG1Sb3dUb1NlbmQgPj0gbVVpLT5sb2NfcGF0aFRhYmxlLT5yb3dDb3VudCgpKSB7CisgICAgICAgIC8vIE5vIG1vcmUgdG8gc2VuZC4gU2FtZSBhcyBjbGlja2luZyBTdG9wLgorICAgICAgICBsb2NhdGlvblBsYXliYWNrU3RvcCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHRoZSBkYXRhIGZvciB0aGUgcG9pbnQgd2UncmUgYWJvdXQgdG8gc2VuZC4KKyAgICB0aGVJdGVtID0gbVVpLT5sb2NfcGF0aFRhYmxlLT5pdGVtKG1Sb3dUb1NlbmQsIDEpOworICAgIGRvdWJsZSBsYXQgPSB0aGVJdGVtLT50ZXh0KCkudG9Eb3VibGUoJmNlbGxPSyk7CisgICAgdGhlSXRlbSA9IG1VaS0+bG9jX3BhdGhUYWJsZS0+aXRlbShtUm93VG9TZW5kLCAyKTsKKyAgICBkb3VibGUgbG9uID0gdGhlSXRlbS0+dGV4dCgpLnRvRG91YmxlKCZjZWxsT0spOworICAgIHRoZUl0ZW0gPSBtVWktPmxvY19wYXRoVGFibGUtPml0ZW0obVJvd1RvU2VuZCwgMyk7CisgICAgZG91YmxlIGFsdCA9IHRoZUl0ZW0tPnRleHQoKS50b0RvdWJsZSgmY2VsbE9LKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgdGFibGU6CisgICAgLy8gMS4gQ2xlYXIgdGhlICJwbGF5IGFycm93IiBpY29uIGZyb20gdGhlIHByZXZpb3VzIHBvaW50LCBpZiBuZWNlc3NhcnkuCisgICAgLy8gMi4gU2V0IHRoZSAicGxheSBhcnJvdyIgaWNvbiBuZWFyIHRoZSBwb2ludCB3ZSdyZSBhYm91dCB0byBzZW5kLgorICAgIC8vIDMuIFNjcm9sbCB0byB0aGUgcG9pbnQgdGhhdCBpcyBiZWluZyBzZW50LgorICAgIC8vIDQuIE1ha2UgaXQgc2VsZWN0ZWQuCisgICAgaWYgKG1Sb3dUb1NlbmQgPiAwKSB7CisgICAgICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+aXRlbShtUm93VG9TZW5kIC0gMSwgMCktPnNldEljb24oUUljb24oKSk7CisgICAgfQorICAgIFFUYWJsZVdpZGdldEl0ZW0qIGN1cnJlbnRJdGVtID0gbVVpLT5sb2NfcGF0aFRhYmxlLT5pdGVtKG1Sb3dUb1NlbmQsIDApOworICAgIGN1cnJlbnRJdGVtLT5zZXRJY29uKGdldEljb25Gb3JDdXJyZW50VGhlbWUoInBsYXlfYXJyb3ciKSk7CisgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5zY3JvbGxUb0l0ZW0oY3VycmVudEl0ZW0pOworICAgIG1VaS0+bG9jX3BhdGhUYWJsZS0+c2V0Q3VycmVudEl0ZW0oY3VycmVudEl0ZW0pOworCisgICAgdXBkYXRlRGlzcGxheWVkTG9jYXRpb24obGF0LCBsb24sIGFsdCk7CisKKyAgICAvLyBTZW5kIHRoZSBjb21tYW5kLgorICAgIHNlbmRMb2NhdGlvblRvRGV2aWNlKG1Mb2NhdGlvbkFnZW50LCBsYXQsIGxvbiwgYWx0KTsKKworICAgIC8vIEdvIG9uIHRvIHRoZSBuZXh0IHJvdworICAgIG1Sb3dUb1NlbmQrKzsKKyAgICBpZiAobVJvd1RvU2VuZCA+PSBtVWktPmxvY19wYXRoVGFibGUtPnJvd0NvdW50KCkpIHsKKyAgICAgICAgLy8gTm8gbW9yZSB0byBzZW5kLiBTYW1lIGFzIGNsaWNraW5nIFN0b3AuCisgICAgICAgIGxvY2F0aW9uUGxheWJhY2tTdG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2V0IGEgdGltZXIgZm9yIHdoZW4gdGhpcyByb3cgc2hvdWxkIGJlIHNlbnQKKyAgICAgICAgdGhlSXRlbSA9IG1VaS0+bG9jX3BhdGhUYWJsZS0+aXRlbShtUm93VG9TZW5kLCAwKTsKKyAgICAgICAgZG91YmxlIGRUaW1lID0gdGhlSXRlbS0+dGV4dCgpLnRvRG91YmxlKCk7CisgICAgICAgIGludCBtU2VjID0gZFRpbWUgKiAxMDAwLjA7CisgICAgICAgIGlmIChtU2VjIDwgMCkgbVNlYyA9IDA7CisgICAgICAgIG1UaW1lci5zZXRJbnRlcnZhbCgKKyAgICAgICAgICAgICAgICBtU2VjIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtVWktPmxvY19wbGF5YmFja1NwZWVkLT5jdXJyZW50SW5kZXgoKSArIDEpKTsKKyAgICAgICAgbVRpbWVyLnN0YXJ0KCk7CisgICAgfQorfQorCit2b2lkIExvY2F0aW9uUGFnZTo6Z2VvRGF0YVRocmVhZFN0YXJ0ZWQoKSB7CisgICAgbVVpLT5sb2NfcGF0aFRhYmxlLT5zZXRSb3dDb3VudCgwKTsKKyAgICBTZXR0aW5nc1RoZW1lIHRoZW1lID0gZ2V0U2VsZWN0ZWRUaGVtZSgpOworCisgICAgLy8gUHJldmVudCB0aGUgdXNlciBmcm9tIGluaXRpYXRpbmcgYSBsb2FkIGdweC9rbWwgd2hpbGUgYW5vdGhlciBsb2FkIGlzIGFscmVhZHkKKyAgICAvLyBpbiBwcm9ncmVzcworICAgIHNldEJ1dHRvbkVuYWJsZWQobVVpLT5sb2NfR3B4S21sQnV0dG9uLCB0aGVtZSwgZmFsc2UpOworICAgIHNldEJ1dHRvbkVuYWJsZWQobVVpLT5sb2NfcGxheVN0b3BCdXR0b24sIHRoZW1lLCBmYWxzZSk7CisgICAgbU5vd0xvYWRpbmdHZW9EYXRhID0gdHJ1ZTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6OmZpbmlzaEdlb0RhdGFMb2FkaW5nKAorICAgICAgICBjb25zdCBRU3RyaW5nJiBmaWxlX25hbWUsCisgICAgICAgIGJvb2wgb2ssCisgICAgICAgIGNvbnN0IFFTdHJpbmcmIGVycm9yX21lc3NhZ2UsCisgICAgICAgIGJvb2wgaWdub3JlX2Vycm9yKSB7CisgICAgbUdlb0RhdGFMb2FkZXIgPSBudWxscHRyOworICAgIGlmIChvaykgeworICAgICAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fUExBWUJBQ0tfRklMRSwgZmlsZV9uYW1lKTsKKyAgICAgICAgcG9wdWxhdGVUYWJsZSgmbUdwc0ZpeGVzQXJyYXkpOworICAgIH0gZWxzZSBpZiAoIWlnbm9yZV9lcnJvcikgeworICAgICAgICBzaG93RXJyb3JEaWFsb2coZXJyb3JfbWVzc2FnZSwgdHIoIkdlbyBEYXRhIFBhcnNlciIpKTsKKyAgICB9CisgICAgU2V0dGluZ3NUaGVtZSB0aGVtZSA9IGdldFNlbGVjdGVkVGhlbWUoKTsKKyAgICBzZXRCdXR0b25FbmFibGVkKG1VaS0+bG9jX0dweEttbEJ1dHRvbiwgdGhlbWUsIHRydWUpOworICAgIHNldEJ1dHRvbkVuYWJsZWQobVVpLT5sb2NfcGxheVN0b3BCdXR0b24sIHRoZW1lLCB0cnVlKTsKKyAgICBtTm93TG9hZGluZ0dlb0RhdGEgPSBmYWxzZTsKKyAgICBlbWl0KGdlb0RhdGFMb2FkaW5nRmluaXNoZWQoKSk7Cit9CisKK3ZvaWQgTG9jYXRpb25QYWdlOjpzdGFydHVwR2VvRGF0YVRocmVhZEZpbmlzaGVkKFFTdHJpbmcgZmlsZV9uYW1lLCBib29sIG9rLCBRU3RyaW5nIGVycm9yX21lc3NhZ2UpIHsKKyAgICAvLyBvbiBzdGFydHVwLCB3ZSBzaWxlbnRseSBpZ25vcmUgdGhlIHByZXZpb3VzbHkgcmVtZWJlcmVkIGdlbyBkYXRhIGZpbGUgYmVpbmcKKyAgICAvLyBtaXNzaW5nIG9yIG1hbGZvcm1lZC4KKyAgICBmaW5pc2hHZW9EYXRhTG9hZGluZyhmaWxlX25hbWUsIG9rLCBlcnJvcl9tZXNzYWdlLCB0cnVlKTsKK30KKwordm9pZCBMb2NhdGlvblBhZ2U6Omdlb0RhdGFUaHJlYWRGaW5pc2hlZChRU3RyaW5nIGZpbGVfbmFtZSwgYm9vbCBvaywgUVN0cmluZyBlcnJvcl9tZXNzYWdlKSB7CisgICAgZmluaXNoR2VvRGF0YUxvYWRpbmcoZmlsZV9uYW1lLCBvaywgZXJyb3JfbWVzc2FnZSwgZmFsc2UpOworfQorCisvLyBHZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gZnJvbSB0aGUgZGV2aWNlLiBJZiB0aGF0IGZhaWxzLCB1c2UKKy8vIHRoZSBzYXZlZCBsb2NhdGlvbiBmcm9tIHRoaXMgVUkuCisvLyAoc3RhdGljIGZ1bmN0aW9uKQordm9pZCBMb2NhdGlvblBhZ2U6OmdldERldmljZUxvY2F0aW9uKGNvbnN0IFFBbmRyb2lkTG9jYXRpb25BZ2VudCogbG9jQWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwTGF0aXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwTG9uZ2l0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcEFsdGl0dWRlKQoreworICAgIGJvb2wgZ290RGV2aWNlTG9jID0gZmFsc2U7CisKKyAgICBpZiAobG9jQWdlbnQgJiYgbG9jQWdlbnQtPmdwc0dldExvYykgeworICAgICAgICAvLyBRdWVyeSB0aGUgZGV2aWNlCisgICAgICAgIGdvdERldmljZUxvYyA9IGxvY0FnZW50LT5ncHNHZXRMb2MocExhdGl0dWRlLCBwTG9uZ2l0dWRlLCBwQWx0aXR1ZGUsIG51bGxwdHIpOworICAgIH0KKworICAgIGlmICghZ290RGV2aWNlTG9jKSB7CisgICAgICAgIC8vIFVzZSB0aGUgc2F2ZWQgc2V0dGluZ3MKKyAgICAgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgICAgICAqcExhdGl0dWRlICA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fUkVDRU5UX0xBVElUVURFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtHcGxleExhdCkudG9Eb3VibGUoKTsKKyAgICAgICAgKnBMb25naXR1ZGUgPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkxPQ0FUSU9OX1JFQ0VOVF9MT05HSVRVREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0dwbGV4TG9uKS50b0RvdWJsZSgpOworICAgICAgICAqcEFsdGl0dWRlICA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6TE9DQVRJT05fUkVDRU5UX0FMVElUVURFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCkudG9Eb3VibGUoKTsKKyAgICB9Cit9CisKKy8vIFNlbmQgYSBHUFMgbG9jYXRpb24gdG8gdGhlIGRldmljZQorLy8gKHN0YXRpYyBmdW5jdGlvbikKK3ZvaWQgTG9jYXRpb25QYWdlOjpzZW5kTG9jYXRpb25Ub0RldmljZShjb25zdCBRQW5kcm9pZExvY2F0aW9uQWdlbnQqIGxvY0FnZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbG9uZ2l0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHRpdHVkZSkKK3sKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpMT0NBVElPTl9SRUNFTlRfTEFUSVRVREUsIGxhdGl0dWRlKTsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkxPQ0FUSU9OX1JFQ0VOVF9MT05HSVRVREUsIGxvbmdpdHVkZSk7CisgICAgc2V0dGluZ3Muc2V0VmFsdWUoVWk6OlNldHRpbmdzOjpMT0NBVElPTl9SRUNFTlRfQUxUSVRVREUsIGFsdGl0dWRlKTsKKworICAgIGlmIChsb2NBZ2VudCAmJiBsb2NBZ2VudC0+Z3BzU2VuZExvYykgeworICAgICAgICAvLyBTZW5kIHRoZXNlIHRvIHRoZSBkZXZpY2UKKyAgICAgICAgdGltZXZhbCB0aW1lVmFsID0ge307CisgICAgICAgIGdldHRpbWVvZmRheSgmdGltZVZhbCwgbnVsbHB0cik7CisgICAgICAgIGxvY0FnZW50LT5ncHNTZW5kTG9jKGxhdGl0dWRlLCBsb25naXR1ZGUsIGFsdGl0dWRlLCA0LCAmdGltZVZhbCk7CisgICAgfQorfQorCit2b2lkIEdlb0RhdGFMb2FkZXJUaHJlYWQ6OmxvYWRHZW9EYXRhRnJvbUZpbGUoY29uc3QgUVN0cmluZyYgZmlsZV9uYW1lLCBHcHNGaXhBcnJheSogZml4ZXMpIHsKKyAgICBtRmlsZU5hbWUgPSBmaWxlX25hbWU7CisgICAgbUZpeGVzID0gZml4ZXM7CisgICAgc3RhcnQoKTsKK30KKwordm9pZCBHZW9EYXRhTG9hZGVyVGhyZWFkOjpydW4oKSB7CisgICAgaWYgKG1GaWxlTmFtZS5pc0VtcHR5KCkgfHwgbUZpeGVzID09IG51bGxwdHIpIHsKKyAgICAgICAgZW1pdChsb2FkaW5nRmluaXNoZWQobUZpbGVOYW1lLCBmYWxzZSwgdHIoIk5vIGZpbGUgdG8gbG9hZCIpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIG9rID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgZXJyX3N0cjsKKworICAgIHsKKyAgICAgICAgUUZpbGVJbmZvIGZpbGVfaW5mbyhtRmlsZU5hbWUpOworICAgICAgICBtRml4ZXMtPmNsZWFyKCk7CisgICAgICAgIGF1dG8gc3VmZml4ID0gZmlsZV9pbmZvLnN1ZmZpeCgpLnRvTG93ZXIoKTsKKyAgICAgICAgaWYgKHN1ZmZpeCA9PSAiZ3B4IikgeworICAgICAgICAgICAgb2sgPSBHcHhQYXJzZXI6OnBhcnNlRmlsZShtRmlsZU5hbWUudG9TdGRTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRml4ZXMsICZlcnJfc3RyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdWZmaXggPT0gImttbCIpIHsKKyAgICAgICAgICAgIG9rID0gS21sUGFyc2VyOjpwYXJzZUZpbGUobUZpbGVOYW1lLnRvU3RkU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpeGVzLCAmZXJyX3N0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJfc3RyID0gdHIoIlVua25vd24gZmlsZSB0eXBlIikudG9TdGRTdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gZXJyX3FzdHJpbmcgPSBRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKGVycl9zdHIpOworICAgIGVtaXQobG9hZGluZ0ZpbmlzaGVkKG1GaWxlTmFtZSwgb2ssIGVycl9xc3RyaW5nKSk7Cit9CisKK0dlb0RhdGFMb2FkZXJUaHJlYWQqIEdlb0RhdGFMb2FkZXJUaHJlYWQ6Om5ld0luc3RhbmNlKGNvbnN0IFFPYmplY3QqIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGFydGVkX3Nsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaW5pc2hlZF9zbG90KSB7CisgICAgR2VvRGF0YUxvYWRlclRocmVhZCogbmV3X2luc3RhbmNlID0gbmV3IEdlb0RhdGFMb2FkZXJUaHJlYWQoKTsKKyAgICBjb25uZWN0KG5ld19pbnN0YW5jZSwgU0lHTkFMKHN0YXJ0ZWQoKSksIGhhbmRsZXIsIHN0YXJ0ZWRfc2xvdCk7CisgICAgY29ubmVjdChuZXdfaW5zdGFuY2UsIFNJR05BTChsb2FkaW5nRmluaXNoZWQoUVN0cmluZywgYm9vbCwgUVN0cmluZykpLCBoYW5kbGVyLCBmaW5pc2hlZF9zbG90KTsKKworICAgIC8vIE1ha2Ugc3VyZSBuZXdfaW5zdGFuY2UgZ2V0cyBjbGVhbmVkIHVwIGFmdGVyIHRoZSB0aHJlYWQgZXhpdHMuCisgICAgY29ubmVjdChuZXdfaW5zdGFuY2UsICZRVGhyZWFkOjpmaW5pc2hlZCwgbmV3X2luc3RhbmNlLCAmUU9iamVjdDo6ZGVsZXRlTGF0ZXIpOworCisgICAgcmV0dXJuIG5ld19pbnN0YW5jZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2xvY2F0aW9uLXBhZ2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2xvY2F0aW9uLXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQ2NzcxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvbG9jYXRpb24tcGFnZS5oCkBAIC0wLDAgKzEsMTMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInVpX2xvY2F0aW9uLXBhZ2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dwcy9HcHNGaXguaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvUGVyaW9kaWNSZXBvcnRlci5oIgorI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRVGhyZWFkPgorI2luY2x1ZGUgPFFXaWRnZXQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgUUFuZHJvaWRMb2NhdGlvbkFnZW50OworY2xhc3MgR2VvRGF0YUxvYWRlclRocmVhZDsKK2NsYXNzIExvY2F0aW9uUGFnZSA6IHB1YmxpYyBRV2lkZ2V0Cit7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIGV4cGxpY2l0IExvY2F0aW9uUGFnZShRV2lkZ2V0ICpwYXJlbnQgPSAwKTsKKyAgICB+TG9jYXRpb25QYWdlKCk7CisKKyAgICB2b2lkIHNldExvY2F0aW9uQWdlbnQoY29uc3QgUUFuZHJvaWRMb2NhdGlvbkFnZW50KiBhZ2VudCk7CisgICAgYm9vbCBpc0xvYWRpbmdHZW9EYXRhKCkgY29uc3QgeyByZXR1cm4gbU5vd0xvYWRpbmdHZW9EYXRhOyB9CisgICAgdm9pZCByZXF1ZXN0U3RvcExvYWRpbmdHZW9EYXRhKCkgeyBtR2VvRGF0YUxvYWRpbmdTdG9wUmVxdWVzdGVkID0gdHJ1ZTsgfQorCisgICAgc3RhdGljIHZvaWQgZ2V0RGV2aWNlTG9jYXRpb24oY29uc3QgUUFuZHJvaWRMb2NhdGlvbkFnZW50KiBsb2NBZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBPdXRMYXRpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBPdXRMb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwT3V0QWx0aXR1ZGUpOworICAgIHN0YXRpYyB2b2lkIHNlbmRMb2NhdGlvblRvRGV2aWNlKGNvbnN0IFFBbmRyb2lkTG9jYXRpb25BZ2VudCogbG9jQWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGl0dWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFsdGl0dWRlKTsKKworc2lnbmFsczoKKyAgICB2b2lkIGdlb0RhdGFMb2FkaW5nRmluaXNoZWQoKTsKKyAgICB2b2lkIGxvY2F0aW9uVXBkYXRlUmVxdWlyZWQoZG91YmxlIGxhdGl0dWRlLCBkb3VibGUgbG9uZ2l0dWRlLCBkb3VibGUgYWx0aXR1ZGUpOworCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgb25fbG9jX0dweEttbEJ1dHRvbl9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9sb2NfcGF0aFRhYmxlX2NlbGxDaGFuZ2VkKGludCByb3csIGludCBjb2wpOworICAgIHZvaWQgb25fbG9jX3BsYXlTdG9wQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX2xvY19tb2RlU3dpdGNoX2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KTsKKyAgICB2b2lkIG9uX2xvY19zZW5kUG9pbnRCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fbG9jX2xvbmdpdHVkZUlucHV0X3ZhbHVlQ2hhbmdlZChkb3VibGUpOworICAgIHZvaWQgb25fbG9jX2xhdGl0dWRlSW5wdXRfdmFsdWVDaGFuZ2VkKGRvdWJsZSk7CisgICAgdm9pZCBvbl9sb2NfYWx0aXR1ZGVJbnB1dF9lZGl0aW5nRmluaXNoZWQoKTsKKyAgICB2b2lkIG9uX2xvY19wbGF5YmFja1NwZWVkX2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSB0aHJlYWQgdGhhdCBsb2FkcyBhbmQgcGFyc2VzCisgICAgLy8gZ2VvIGRhdGEgZnJvbSBmaWxlIGlzIGluaXRpYXRlZC4KKyAgICB2b2lkIGdlb0RhdGFUaHJlYWRTdGFydGVkKCk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgZ2VvIGRhdGEgbG9kaW5nIHRocmVhZCBpcyBmaW5pc2hlZC4KKyAgICAvLyBDYWxscyBmaW5pc2hHZW9EYXRhTG9hZGluZy4KKyAgICAvLyBEbyBub3QgY2hhbmdlIFFTdHJpbmcgdG8gUVN0cmluZyYgLSB0aGVzZSBhcmd1bWVudHMgYXJlIHBhc3NlZAorICAgIC8vIGJldHdlZW4gdGhyZWFkcy4KKyAgICB2b2lkIGdlb0RhdGFUaHJlYWRGaW5pc2hlZChRU3RyaW5nIGZpbGVfbmFtZSwgYm9vbCBvaywgUVN0cmluZyBlcnJvcik7CisKKyAgICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgb25seSB3b3JrcyBmb3IgdGhlIGluaXRpYWwgaW52b2thdGlvbiBvZiB0aGUgZ2VvIGRhdGEKKyAgICAvLyBsb2FkZXIgdGhyZWFkICh0aGUgb25lIHRoYXQgb2NjdXJzIHdoZW4gdGhlIHdpZGdldCBpcyBmaXJzdCBjb25zdHJ1Y3RlZCkKKyAgICB2b2lkIHN0YXJ0dXBHZW9EYXRhVGhyZWFkRmluaXNoZWQoUVN0cmluZyBmaWxlX25hbWUsIGJvb2wgb2ssIFFTdHJpbmcgZXJyb3IpOworCisgICAgdm9pZCB1cGRhdGVEaXNwbGF5ZWRMb2NhdGlvbihkb3VibGUgbGF0LCBkb3VibGUgbG9uLCBkb3VibGUgYWx0KTsKKworICAgIHZvaWQgbG9jYXRpb25QbGF5YmFja1N0YXJ0KCk7CisgICAgdm9pZCBsb2NhdGlvblBsYXliYWNrU3RvcCgpOworICAgIHZvaWQgdGltZW91dCgpOworCitwcml2YXRlOgorICAgIHZvaWQgZmluaXNoR2VvRGF0YUxvYWRpbmcoCisgICAgICAgIGNvbnN0IFFTdHJpbmcmIGZpbGVfbmFtZSwKKyAgICAgICAgYm9vbCBvaywKKyAgICAgICAgY29uc3QgUVN0cmluZyYgZXJyb3JfbWVzc2FnZSwKKyAgICAgICAgYm9vbCBpZ25vcmVfZXJyb3IpOworCisgICAgdm9pZCBwb3B1bGF0ZVRhYmxlKEdwc0ZpeEFycmF5ICpmaXhlcyk7CisgICAgc3RhdGljIGJvb2wgdmFsaWRhdGVDZWxsKFFUYWJsZVdpZGdldCogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcqIG91dEVycm9yTWVzc2FnZSk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OkxvY2F0aW9uUGFnZT4gbVVpOworICAgIGNvbnN0IFFBbmRyb2lkTG9jYXRpb25BZ2VudCogbUxvY2F0aW9uQWdlbnQ7CisgICAgUURvdWJsZVZhbGlkYXRvciBtQWx0aXR1ZGVWYWxpZGF0b3I7CisgICAgR3BzRml4QXJyYXkgICAgICAgICAgbUdwc0ZpeGVzQXJyYXk7CisgICAgR2VvRGF0YUxvYWRlclRocmVhZCogbUdlb0RhdGFMb2FkZXI7CisgICAgUVRpbWVyIG1UaW1lcjsKKyAgICBib29sIG1Ob3dQbGF5aW5nOworICAgIGJvb2wgbU5vd0xvYWRpbmdHZW9EYXRhOworICAgIGJvb2wgbUdlb0RhdGFMb2FkaW5nU3RvcFJlcXVlc3RlZDsKKyAgICBpbnQgbVJvd1RvU2VuZDsKKyAgICBib29sIG1Mb2NhdGlvblVzZWQgPSBmYWxzZTsKKyAgICBhbmRyb2lkOjptZXRyaWNzOjpQZXJpb2RpY1JlcG9ydGVyOjpUYXNrVG9rZW4gbU1ldHJpY3NSZXBvcnRpbmdUb2tlbjsKK307CisKK2NsYXNzIEdlb0RhdGFMb2FkZXJUaHJlYWQgOiBwdWJsaWMgUVRocmVhZCB7CitRX09CSkVDVAorcHVibGljOgorICAgIC8vIExvYWRzIGdlbyBkYXRhIGZyb20gYSBncHggb3Iga21sIGZpbGUgc3BlY2lmaWVkCisgICAgLy8gYnkgZmlsZV9uYW1lIGludG8gdGhlIEdwc0ZpeEFycmF5IHBvaW50ZWQgdG8KKyAgICAvLyBieSBmaXhlcworICAgIHZvaWQgbG9hZEdlb0RhdGFGcm9tRmlsZShjb25zdCBRU3RyaW5nJiBmaWxlX25hbWUsIEdwc0ZpeEFycmF5KiBmaXhlcyk7CisKKworICAgIHN0YXRpYyBHZW9EYXRhTG9hZGVyVGhyZWFkKiBuZXdJbnN0YW5jZSgKKyAgICAgICAgICAgIGNvbnN0IFFPYmplY3QqIGhhbmRsZXIsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBzdGFydGVkX3Nsb3QsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBmaW5pc2hlZF9zbG90KTsKKworc2lnbmFsczoKKyAgICB2b2lkIGxvYWRpbmdGaW5pc2hlZChRU3RyaW5nIGZpbGVfbmFtZSwgYm9vbCBvaywgUVN0cmluZyBlcnJvcik7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBSZWltcGxlbWVudGVkIHRvIGxvYWQgdGhlIGZpbGUgaW50byB0aGUgZ2l2ZW4gZml4ZXMgYXJyYXkuCisgICAgdm9pZCBydW4oKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBHZW9EYXRhTG9hZGVyVGhyZWFkKCkgOiBtRml4ZXMobnVsbHB0cikge30KKyAgICBRU3RyaW5nIG1GaWxlTmFtZTsKKyAgICBHcHNGaXhBcnJheSogbUZpeGVzOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2xvY2F0aW9uLXBhZ2UudWkgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9sb2NhdGlvbi1wYWdlLnVpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmM0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9sb2NhdGlvbi1wYWdlLnVpCkBAIC0wLDAgKzEsNTQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPkxvY2F0aW9uUGFnZTwvY2xhc3M+CisgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0iTG9jYXRpb25QYWdlIj4KKyAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgIDxyZWN0PgorICAgIDx4PjA8L3g+CisgICAgPHk+MDwveT4KKyAgICA8d2lkdGg+NjIyPC93aWR0aD4KKyAgICA8aGVpZ2h0PjU4MDwvaGVpZ2h0PgorICAgPC9yZWN0PgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93VGl0bGUiPgorICAgPHN0cmluZz5Gb3JtPC9zdHJpbmc+CisgIDwvcHJvcGVydHk+CisgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0ibG9jYXRpb25Hcm91cF8zIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT4yMDwveT4KKyAgICAgPHdpZHRoPjE4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgIDx3ZWlnaHQ+NTA8L3dlaWdodD4KKyAgICAgPGJvbGQ+ZmFsc2U8L2JvbGQ+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5HUFMgZGF0YSBwb2ludDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRQ29tYm9Cb3giIG5hbWU9ImxvY19wbGF5YmFja1NwZWVkIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjExMDwveD4KKyAgICAgPHk+NTU1PC95PgorICAgICA8d2lkdGg+MTExPC93aWR0aD4KKyAgICAgPGhlaWdodD4yNzwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlNwZWVkIDFYPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5TcGVlZCAyWDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+U3BlZWQgM1g8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlNwZWVkIDRYPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5TcGVlZCA1WDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJSYWlzZWRNYXRlcmlhbEJ1dHRvbiIgbmFtZT0ibG9jX3NlbmRQb2ludEJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD41Mzg8L3g+CisgICAgIDx5PjIyMDwveT4KKyAgICAgPHdpZHRoPjY2PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5TRU5EPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5Ub29sPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfMTIiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4xMTA8L3k+CisgICAgIDx3aWR0aD4xNDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjE2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPkxhdGl0dWRlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlJhaXNlZE1hdGVyaWFsQnV0dG9uIiBuYW1lPSJsb2NfcGxheVN0b3BCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjU1MDwveT4KKyAgICAgPHdpZHRoPjM2PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZy8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3BsYXlfYXJyb3c8L25vcm1hbG9mZj46L2xpZ2h0L3BsYXlfYXJyb3c8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjI0PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnBsYXlfYXJyb3c8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZV9kaXNhYmxlZCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnBsYXlfYXJyb3dfZGlzYWJsZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF8xMyI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4zMjQ8L3g+CisgICAgIDx5PjUwPC95PgorICAgICA8d2lkdGg+MTQwPC93aWR0aD4KKyAgICAgPGhlaWdodD4xNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5Mb25naXR1ZGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9ImxvY19HcHhLbWxCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+NDgwPC94PgorICAgICA8eT41NTA8L3k+CisgICAgIDx3aWR0aD4xMjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9Ik1pbmltdW0iIHZzaXpldHlwZT0iRml4ZWQiPgorICAgICA8aG9yc3RyZXRjaD4wPC9ob3JzdHJldGNoPgorICAgICA8dmVyc3RyZXRjaD4wPC92ZXJzdHJldGNoPgorICAgIDwvc2l6ZXBvbGljeT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5MT0FEIEdQWC9LTUw8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iQW5nbGVJbnB1dFdpZGdldCIgbmFtZT0ibG9jX2xvbmdpdHVkZUlucHV0IiBuYXRpdmU9InRydWUiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT43MDwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IkFuZ2xlSW5wdXRXaWRnZXQiIG5hbWU9ImxvY19sYXRpdHVkZUlucHV0IiBuYXRpdmU9InRydWUiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4xMzA8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImxvY2F0aW9uR3JvdXBfMiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjUwPC95PgorICAgICA8d2lkdGg+MTgwPC93aWR0aD4KKyAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD41MDwvd2VpZ2h0PgorICAgICA8Ym9sZD5mYWxzZTwvYm9sZD4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkdQUyBkYXRhIHBsYXliYWNrPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFUYWJsZVdpZGdldCIgbmFtZT0ibG9jX3BhdGhUYWJsZSI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjkwPC95PgorICAgICA8d2lkdGg+NTg0PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNTE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjk8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD41MDwvd2VpZ2h0PgorICAgICA8Ym9sZD5mYWxzZTwvYm9sZD4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imhvcml6b250YWxTY3JvbGxCYXJQb2xpY3kiPgorICAgIDxlbnVtPlF0OjpTY3JvbGxCYXJBbHdheXNPZmY8L2VudW0+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InNlbGVjdGlvbk1vZGUiPgorICAgIDxlbnVtPlFBYnN0cmFjdEl0ZW1WaWV3OjpFeHRlbmRlZFNlbGVjdGlvbjwvZW51bT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic2VsZWN0aW9uQmVoYXZpb3IiPgorICAgIDxlbnVtPlFBYnN0cmFjdEl0ZW1WaWV3OjpTZWxlY3RSb3dzPC9lbnVtPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzaG93R3JpZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJvd0NvdW50Ij4KKyAgICA8bnVtYmVyPjE8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY29sdW1uQ291bnQiPgorICAgIDxudW1iZXI+NjwvbnVtYmVyPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxhdHRyaWJ1dGUgbmFtZT0iaG9yaXpvbnRhbEhlYWRlckNhc2NhZGluZ1NlY3Rpb25SZXNpemVzIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9hdHRyaWJ1dGU+CisgICA8YXR0cmlidXRlIG5hbWU9Imhvcml6b250YWxIZWFkZXJTdHJldGNoTGFzdFNlY3Rpb24iPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L2F0dHJpYnV0ZT4KKyAgIDxhdHRyaWJ1dGUgbmFtZT0idmVydGljYWxIZWFkZXJWaXNpYmxlIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvYXR0cmlidXRlPgorICAgPHJvdy8+CisgICA8Y29sdW1uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5EZWxheSAoc2VjKTwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICA8Zm9udD4KKyAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICA8d2VpZ2h0Pjc1PC93ZWlnaHQ+CisgICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgICA8L2ZvbnQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dEFsaWdubWVudCI+CisgICAgIDxzZXQ+QWxpZ25SaWdodHxBbGlnblZDZW50ZXI8L3NldD4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9jb2x1bW4+CisgICA8Y29sdW1uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5MYXRpdHVkZTwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICA8Zm9udD4KKyAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICA8d2VpZ2h0Pjc1PC93ZWlnaHQ+CisgICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgICA8L2ZvbnQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dEFsaWdubWVudCI+CisgICAgIDxzZXQ+QWxpZ25SaWdodHxBbGlnblZDZW50ZXI8L3NldD4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9jb2x1bW4+CisgICA8Y29sdW1uPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Mb25naXR1ZGU8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgPGZvbnQ+CisgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICAgPGJvbGQ+dHJ1ZTwvYm9sZD4KKyAgICAgPC9mb250PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHRBbGlnbm1lbnQiPgorICAgICA8c2V0PkFsaWduUmlnaHR8QWxpZ25WQ2VudGVyPC9zZXQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvY29sdW1uPgorICAgPGNvbHVtbj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RWxldmF0aW9uPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgIDxmb250PgorICAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgIDx3ZWlnaHQ+NzU8L3dlaWdodD4KKyAgICAgIDxib2xkPnRydWU8L2JvbGQ+CisgICAgIDwvZm9udD4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0QWxpZ25tZW50Ij4KKyAgICAgPHNldD5BbGlnblJpZ2h0fEFsaWduVkNlbnRlcjwvc2V0PgorICAgIDwvcHJvcGVydHk+CisgICA8L2NvbHVtbj4KKyAgIDxjb2x1bW4+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPk5hbWU8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgPGZvbnQ+CisgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICAgPGJvbGQ+dHJ1ZTwvYm9sZD4KKyAgICAgPC9mb250PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHRBbGlnbm1lbnQiPgorICAgICA8c2V0PkFsaWduUmlnaHR8QWxpZ25WQ2VudGVyPC9zZXQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvY29sdW1uPgorICAgPGNvbHVtbj4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RGVzY3JpcHRpb248L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgPGZvbnQ+CisgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICAgPGJvbGQ+dHJ1ZTwvYm9sZD4KKyAgICAgPC9mb250PgorICAgIDwvcHJvcGVydHk+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHRBbGlnbm1lbnQiPgorICAgICA8c2V0PkFsaWduUmlnaHR8QWxpZ25WQ2VudGVyPC9zZXQ+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvY29sdW1uPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUxpbmVFZGl0IiBuYW1lPSJsb2NfYWx0aXR1ZGVJbnB1dCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4zMjQ8L3g+CisgICAgIDx5PjE5MDwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+MDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzcyIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPkVkaXRhYmxlVmFsdWU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF8xNCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4zMjQ8L3g+CisgICAgIDx5PjE3MDwveT4KKyAgICAgPHdpZHRoPjE0MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MTY8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+QWx0aXR1ZGUgKG1ldGVycyk8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJsb2NfbW9kZVN3aXRjaCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xNjA8L3g+CisgICAgIDx5PjUwPC95PgorICAgICA8d2lkdGg+MTQwPC93aWR0aD4KKyAgICAgPGhlaWdodD4yNTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPkRlY2ltYWw8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlNleGlnZXNpbWFsPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfMTUiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjUwPC95PgorICAgICA8d2lkdGg+MTQwPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5Db29yZGluYXRlIHN5c3RlbTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImxvY19jdXJyZW50TG9jTGFiZWwiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjExMDwveT4KKyAgICAgPHdpZHRoPjE4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgIDx3ZWlnaHQ+NTA8L3dlaWdodD4KKyAgICAgPGJvbGQ+ZmFsc2U8L2JvbGQ+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5DdXJyZW50bHkgcmVwb3J0ZWQgbG9jYXRpb248L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVRleHRCcm93c2VyIiBuYW1lPSJsb2NfY3VycmVudExvYyI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MTI4PC95PgorICAgICA8d2lkdGg+MjgwPC93aWR0aD4KKyAgICAgPGhlaWdodD42MDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyA8L3dpZGdldD4KKyA8Y3VzdG9td2lkZ2V0cz4KKyAgPGN1c3RvbXdpZGdldD4KKyAgIDxjbGFzcz5SYWlzZWRNYXRlcmlhbEJ1dHRvbjwvY2xhc3M+CisgICA8ZXh0ZW5kcz5RUHVzaEJ1dHRvbjwvZXh0ZW5kcz4KKyAgIDxoZWFkZXI+YW5kcm9pZC9za2luL3F0L3JhaXNlZC1tYXRlcmlhbC1idXR0b24uaDwvaGVhZGVyPgorICA8L2N1c3RvbXdpZGdldD4KKyAgPGN1c3RvbXdpZGdldD4KKyAgIDxjbGFzcz5BbmdsZUlucHV0V2lkZ2V0PC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9hbmdsZS1pbnB1dC13aWRnZXQuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorIDwvY3VzdG9td2lkZ2V0cz4KKyA8dGFic3RvcHM+CisgIDx0YWJzdG9wPmxvY19tb2RlU3dpdGNoPC90YWJzdG9wPgorICA8dGFic3RvcD5sb2NfYWx0aXR1ZGVJbnB1dDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+bG9jX3NlbmRQb2ludEJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+bG9jX3BsYXlTdG9wQnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD5sb2NfcGxheWJhY2tTcGVlZDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+bG9jX0dweEttbEJ1dHRvbjwvdGFic3RvcD4KKyA8L3RhYnN0b3BzPgorIDxyZXNvdXJjZXM+CisgIDxpbmNsdWRlIGxvY2F0aW9uPSIuLi9yZXNvdXJjZXMucXJjIi8+CisgPC9yZXNvdXJjZXM+CisgPGNvbm5lY3Rpb25zLz4KKzwvdWk+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9zZXR0aW5ncy1wYWdlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3NldHRpbmdzLXBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDZjNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9zZXR0aW5ncy1wYWdlLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lcnJvci1kaWFsb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3F0LXNldHRpbmdzLmgiCisjaW5jbHVkZSA8UUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFGaWxlRGlhbG9nPgorI2luY2x1ZGUgPFFNZXNzYWdlQm94PgorI2luY2x1ZGUgPFFTZXR0aW5ncz4KKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB0aGUgY29udGVudHMgb2YgYSBRTGluZUVkaXQuCitzdGF0aWMgdm9pZCBzZXRFbGlkZWRUZXh0KFFMaW5lRWRpdCogbGluZV9lZGl0LCBjb25zdCBRU3RyaW5nJiB0ZXh0KSB7CisgICAgUUZvbnRNZXRyaWNzIGZvbnRfbWV0cmljcyhsaW5lX2VkaXQtPmZvbnQoKSk7CisgICAgbGluZV9lZGl0LT5zZXRUZXh0KAorICAgICAgICAgICAgZm9udF9tZXRyaWNzLmVsaWRlZFRleHQodGV4dCwgUXQ6OkVsaWRlUmlnaHQsIGxpbmVfZWRpdC0+d2lkdGgoKSAqIDAuOSkpOworfQorCitTZXR0aW5nc1BhZ2U6OlNldHRpbmdzUGFnZShRV2lkZ2V0KiBwYXJlbnQpCisgICAgOiBRV2lkZ2V0KHBhcmVudCksIG1BZGIobnVsbHB0ciksIG1VaShuZXcgVWk6OlNldHRpbmdzUGFnZSgpKSB7CisgICAgbVVpLT5zZXR1cFVpKHRoaXMpOworICAgIG1VaS0+c2V0X3NhdmVMb2NCb3gtPmluc3RhbGxFdmVudEZpbHRlcih0aGlzKTsKKyAgICBtVWktPnNldF9hZGJQYXRoQm94LT5pbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7CisKKyAgICBRU3RyaW5nIHNhdmVQYXRoID0KKyAgICAgICAgUURpcjo6dG9OYXRpdmVTZXBhcmF0b3JzKGdldFNjcmVlbnNob3RTYXZlRGlyZWN0b3J5KCkpOworCisgICAgaWYgKHNhdmVQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICBtVWktPnNldF9zYXZlTG9jQm94LT5zZXRUZXh0KHRyKCJOb25lIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldEVsaWRlZFRleHQobVVpLT5zZXRfc2F2ZUxvY0JveCwgc2F2ZVBhdGgpOworICAgIH0KKworICAgIC8vIEFEQiBwYXRoCisgICAgUVNldHRpbmdzIHNldHRpbmdzOworCisgICAgYm9vbCBhdXRvRmluZEFkYiA9CisgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkFVVE9fRklORF9BREIsIHRydWUpLnRvQm9vbCgpOworICAgIG1VaS0+c2V0X2F1dG9GaW5kQWRiLT5zZXRDaGVja2VkKGF1dG9GaW5kQWRiKTsKKyAgICBvbl9zZXRfYXV0b0ZpbmRBZGJfdG9nZ2xlZChhdXRvRmluZEFkYik7CisKKyAgICBRU3RyaW5nIGFkYlBhdGggPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkFEQl9QQVRILCAiIikudG9TdHJpbmcoKTsKKyAgICBhZGJQYXRoID0gUURpcjo6dG9OYXRpdmVTZXBhcmF0b3JzKGFkYlBhdGgpOworICAgIHNldEVsaWRlZFRleHQobVVpLT5zZXRfYWRiUGF0aEJveCwgYWRiUGF0aCk7CisKKyAgICAvLyBEYXJrL0xpZ2h0IHRoZW1lCisgICAgU2V0dGluZ3NUaGVtZSB0aGVtZSA9CisgICAgICAgIHN0YXRpY19jYXN0PFNldHRpbmdzVGhlbWU+KHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6VUlfVEhFTUUsIDApLnRvSW50KCkpOworICAgIGlmICh0aGVtZSA8IDAgfHwgdGhlbWUgPj0gU0VUVElOR1NfVEhFTUVfTlVNX0VOVFJJRVMpIHsKKyAgICAgICAgdGhlbWUgPSBzdGF0aWNfY2FzdDxTZXR0aW5nc1RoZW1lPigwKTsKKyAgICB9CisgICAgbVVpLT5zZXRfdGhlbWVCb3gtPnNldEN1cnJlbnRJbmRleChzdGF0aWNfY2FzdDxpbnQ+KHRoZW1lKSk7CisKKyAgICBjb25uZWN0KG1VaS0+c2V0X2ZvcndhcmRTaG9ydGN1dHNUb0RldmljZSwgU0lHTkFMKGN1cnJlbnRJbmRleENoYW5nZWQoaW50KSksCisgICAgICAgICAgICB0aGlzLCBTSUdOQUwob25Gb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2VDaGFuZ2VkKGludCkpKTsKKworICAgIC8vICJTZW5kIGtleWJvYXJkIHNob3J0Y3V0cyI6IGEgcHVsbC1kb3duIHRoYXQgYWN0cyBsaWtlIGEgY2hlY2tib3gKKyAgICBib29sIHNob3J0Y3V0Qm9vbCA9IHNldHRpbmdzLnZhbHVlKAorICAgICAgICAgICAgICAgVWk6OlNldHRpbmdzOjpGT1JXQVJEX1NIT1JUQ1VUU19UT19ERVZJQ0UsIGZhbHNlKS50b0Jvb2woKTsKKworICAgIG1VaS0+c2V0X2ZvcndhcmRTaG9ydGN1dHNUb0RldmljZS0+c2V0Q3VycmVudEluZGV4KCBzaG9ydGN1dEJvb2wgPyAxIDogMCApOworCisjaWZkZWYgX19saW51eF9fCisgICAgLy8gIkFsd2F5cyBvbiB0b3AiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIExpbnV4IChzZWUgZW11bGF0b3ItcXQtd2luZG93LmNwcCkKKyAgICAvLyBNYWtlIHRoZSBjb250cm9sIGludmlzaWJsZQorICAgIG1VaS0+c2V0X29uVG9wVGl0bGUtPmhpZGUoKTsKKyAgICBtVWktPnNldF9vblRvcC0+aGlkZSgpOworI2Vsc2UgLy8gV2luZG93cyBvciBPU1gKKyAgICBib29sIG9uVG9wT25seSA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6QUxXQVlTX09OX1RPUCwgZmFsc2UpLnRvQm9vbCgpOworICAgIG1VaS0+c2V0X29uVG9wLT5zZXRDaGVja1N0YXRlKG9uVG9wT25seSA/IFF0OjpDaGVja2VkIDogUXQ6OlVuY2hlY2tlZCk7CisjZW5kaWYKKworICAgIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSByZXBvcnRfcHJlZiA9CisgICAgICAgIHN0YXRpY19jYXN0PFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRT4oCisgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0UsIDApLnRvSW50KCkpOworCisgICAgc3dpdGNoIChyZXBvcnRfcHJlZikgeworICAgICAgICBjYXNlIFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BU0s6CisgICAgICAgICAgICBtVWktPnNldF9jcmFzaFJlcG9ydFByZWZDb21ib0JveC0+c2V0Q3VycmVudEluZGV4KAorICAgICAgICAgICAgICAgICAgICBVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX0NPTUJPQk9YX0FTSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfQUxXQVlTOgorICAgICAgICAgICAgbVVpLT5zZXRfY3Jhc2hSZXBvcnRQcmVmQ29tYm9Cb3gtPnNldEN1cnJlbnRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9DT01CT0JPWF9BTFdBWVMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFX05FVkVSOgorICAgICAgICAgICAgbVVpLT5zZXRfY3Jhc2hSZXBvcnRQcmVmQ29tYm9Cb3gtPnNldEN1cnJlbnRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9DT01CT0JPWF9ORVZFUik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBTZXR0aW5nc1BhZ2U6OnNldEFkYkludGVyZmFjZShhbmRyb2lkOjplbXVsYXRpb246OkFkYkludGVyZmFjZSogYWRiKSB7CisgICAgbUFkYiA9IGFkYjsKK30KKworYm9vbCBTZXR0aW5nc1BhZ2U6OmV2ZW50RmlsdGVyKFFPYmplY3QqIG9iamVjdCwgUUV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSAhPSBRRXZlbnQ6OkZvY3VzSW4gJiYgZXZlbnQtPnR5cGUoKSAhPSBRRXZlbnQ6OkZvY3VzT3V0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisKKyAgICBpZiAob2JqZWN0ID09IG1VaS0+c2V0X3NhdmVMb2NCb3gpIHsKKyAgICAgICAgUVN0cmluZyBzYXZlUGF0aCA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6U0FWRV9QQVRILCAiIikudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OkZvY3VzSW4pIHsKKyAgICAgICAgICAgIG1VaS0+c2V0X3NhdmVMb2NCb3gtPnNldFRleHQoc2F2ZVBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpGb2N1c091dCkgeworICAgICAgICAgICAgc2V0RWxpZGVkVGV4dChtVWktPnNldF9zYXZlTG9jQm94LCBzYXZlUGF0aCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9iamVjdCA9PSBtVWktPnNldF9hZGJQYXRoQm94KSB7CisgICAgICAgIFFTdHJpbmcgYWRiUGF0aCA9IHNldHRpbmdzLnZhbHVlKFVpOjpTZXR0aW5nczo6QURCX1BBVEgsICIiKS50b1N0cmluZygpOworCisgICAgICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6Rm9jdXNJbikgeworICAgICAgICAgICAgbVVpLT5zZXRfYWRiUGF0aEJveC0+c2V0VGV4dChhZGJQYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6Rm9jdXNPdXQpIHsKKyAgICAgICAgICAgIHNldEVsaWRlZFRleHQobVVpLT5zZXRfYWRiUGF0aEJveCwgYWRiUGF0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X3RoZW1lQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KQoreworICAgIC8vIFNlbGVjdCBlaXRoZXIgdGhlIGxpZ2h0IG9yIGRhcmsgdGhlbWUKKyAgICBTZXR0aW5nc1RoZW1lIHRoZW1lID0gKFNldHRpbmdzVGhlbWUpaW5kZXg7CisKKyAgICBpZiAodGhlbWUgPCAwIHx8IHRoZW1lID49IFNFVFRJTkdTX1RIRU1FX05VTV9FTlRSSUVTKSB7CisgICAgICAgIC8vIE91dCBvZiByYW5nZS0taWdub3JlCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6VUlfVEhFTUUsIChpbnQpdGhlbWUpOworCisgICAgZW1pdCh0aGVtZUNoYW5nZWQodGhlbWUpKTsKK30KKwordm9pZCBTZXR0aW5nc1BhZ2U6Om9uX3NldF9zYXZlTG9jRm9sZGVyQnV0dG9uX2NsaWNrZWQoKQoreworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKworICAgIFFTdHJpbmcgZGlyTmFtZSA9IFFGaWxlRGlhbG9nOjpnZXRFeGlzdGluZ0RpcmVjdG9yeSgKKyAgICAgICAgICAgIHRoaXMsIHRyKCJTYXZlIGxvY2F0aW9uIiksCisgICAgICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlNBVkVfUEFUSCwgIiIpLnRvU3RyaW5nKCksCisgICAgICAgICAgICBRRmlsZURpYWxvZzo6U2hvd0RpcnNPbmx5KTsKKworICAgIGlmICggZGlyTmFtZS5pc0VtcHR5KCkgKSByZXR1cm47IC8vIE9wZXJhdGlvbiB3YXMgY2FuY2VsZWQKKworICAgIGRpck5hbWUgPSBRRGlyOjp0b05hdGl2ZVNlcGFyYXRvcnMoZGlyTmFtZSk7CisKKyAgICBpZiAoICFkaXJlY3RvcnlJc1dyaXRhYmxlKGRpck5hbWUpICkgeworICAgICAgICBRU3RyaW5nIGVyclN0ciA9IHRyKCJUaGUgcGF0aCBpcyBub3Qgd3JpdGFibGU6PGJyPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXJOYW1lOworICAgICAgICBzaG93RXJyb3JEaWFsb2coZXJyU3RyLCB0cigiU2F2ZSBsb2NhdGlvbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6U0FWRV9QQVRILCBkaXJOYW1lKTsKKworICAgIHNldEVsaWRlZFRleHQobVVpLT5zZXRfc2F2ZUxvY0JveCwgZGlyTmFtZSk7Cit9CisKK3ZvaWQgU2V0dGluZ3NQYWdlOjpvbl9zZXRfYWRiUGF0aEJ1dHRvbl9jbGlja2VkKCkgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBRU3RyaW5nIGFkYlBhdGggPSBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OkFEQl9QQVRILCAiIikudG9TdHJpbmcoKTsKKworICAgIC8vIFJlcGVhdCB0aGlzIGRpYWxvZyB1bnRpbCB0aGUgdXNlciBpcyBzdWNjZXNzZnVsIG9yIGNhbmNlbHMKKyAgICBib29sIHBhdGhJc0dvb2QgPSBmYWxzZTsKKyAgICBkbyB7CisgICAgICAgIGFkYlBhdGggPSBRRmlsZURpYWxvZzo6Z2V0T3BlbkZpbGVOYW1lKHRoaXMsIHRyKCJCYWNrdXAgQURCIHBhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiUGF0aCk7CisKKyAgICAgICAgaWYgKGFkYlBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBicmVhazsgLy8gT3BlcmF0aW9uIHdhcyBjYW5jZWxlZAorICAgICAgICB9CisKKyAgICAgICAgLy8gV2UgZ290IGEgcGF0aC4gTWFrZSBzdXJlIHRoYXQgdGhlIGZpbGUgYm90aCBleGlzdHMgYW5kIGlzCisgICAgICAgIC8vIGV4ZWN1dGFibGUuCisgICAgICAgIFFGaWxlSW5mbyBmaWxlSW5mbyhhZGJQYXRoKTsKKyAgICAgICAgcGF0aElzR29vZCA9IGZpbGVJbmZvLmV4aXN0cygpICYmIGZpbGVJbmZvLmlzRXhlY3V0YWJsZSgpICYmCisgICAgICAgICAgICAgICAgICAgICBmaWxlSW5mby5maWxlTmFtZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcoYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOjp0b0V4ZWN1dGFibGVOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisKKyAgICAgICAgaWYgKHBhdGhJc0dvb2QpIHsKKyAgICAgICAgICAgIC8vIFNhdmUgdGhpcyBzZWxlY3Rpb24KKyAgICAgICAgICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6QURCX1BBVEgsIGFkYlBhdGgpOworCisgICAgICAgICAgICBhZGJQYXRoID0gUURpcjo6dG9OYXRpdmVTZXBhcmF0b3JzKGFkYlBhdGgpOworICAgICAgICAgICAgc2V0RWxpZGVkVGV4dChtVWktPnNldF9hZGJQYXRoQm94LCBhZGJQYXRoKTsKKyAgICAgICAgICAgIGlmIChtQWRiKSB7CisgICAgICAgICAgICAgICAgbUFkYi0+c2V0Q3VzdG9tQWRiUGF0aChhZGJQYXRoLnRvU3RkU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVGhlIHBhdGggaXMgbm90IGdvb2QuIEZvcmNlIHRoZSB1c2VyIHRvIGNhbmNlbCBvciB0cnkgYWdhaW4uCisgICAgICAgICAgICBRU3RyaW5nIGVyclN0ciA9IHRyKCJUaGlzIHBhdGggZG9lcyBub3QgcG9pbnQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gQURCIGV4ZWN1dGFibGUuPGJyPjxicj4iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFEaXI6OnRvTmF0aXZlU2VwYXJhdG9ycyhhZGJQYXRoKTsKKyAgICAgICAgICAgIFFNZXNzYWdlQm94IG1zZ0JveDsKKyAgICAgICAgICAgIG1zZ0JveC5zZXRXaW5kb3dUaXRsZSh0cigiU2VsZWN0IGJhY2t1cCBBREIgcGF0aCIpKTsKKyAgICAgICAgICAgIG1zZ0JveC5zZXRUZXh0KGVyclN0cik7CisgICAgICAgICAgICBtc2dCb3guc2V0SW5mb3JtYXRpdmVUZXh0KHRyKCJEbyB5b3Ugd2FudCB0cnkgYWdhaW4gb3IgY2FuY2VsPyIpKTsKKyAgICAgICAgICAgIG1zZ0JveC5zZXRTdGFuZGFyZEJ1dHRvbnMoUU1lc3NhZ2VCb3g6OlJldHJ5IHwgUU1lc3NhZ2VCb3g6OkNhbmNlbCk7CisgICAgICAgICAgICBtc2dCb3guc2V0RGVmYXVsdEJ1dHRvbihRTWVzc2FnZUJveDo6Q2FuY2VsKTsKKyAgICAgICAgICAgIGludCBzZWxlY3Rpb24gPSBtc2dCb3guZXhlYygpOworICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiA9PSBRTWVzc2FnZUJveDo6Q2FuY2VsKSBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCAhcGF0aElzR29vZCApOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X3NhdmVMb2NCb3hfdGV4dEVkaXRlZChjb25zdCBRU3RyaW5nJikgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBtVWktPnNldF9zYXZlTG9jQm94LT5zZXRUZXh0KAorICAgICAgICBzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlNBVkVfUEFUSCwgIiIpLnRvU3RyaW5nKCkpOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X2FkYlBhdGhCb3hfdGV4dEVkaXRlZChjb25zdCBRU3RyaW5nJikgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBtVWktPnNldF9hZGJQYXRoQm94LT5zZXRUZXh0KAorICAgICAgICAgICAgc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpBREJfUEFUSCwgIiIpLnRvU3RyaW5nKCkpOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X2ZvcndhcmRTaG9ydGN1dHNUb0RldmljZV9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCkgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkZPUldBUkRfU0hPUlRDVVRTX1RPX0RFVklDRSwgKGluZGV4ICE9IDApKTsKK30KKwordm9pZCBTZXR0aW5nc1BhZ2U6Om9uX3NldF9vblRvcF90b2dnbGVkKGJvb2wgY2hlY2tlZCkgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkFMV0FZU19PTl9UT1AsIGNoZWNrZWQpOworCisgICAgZW1pdChvblRvcENoYW5nZWQoY2hlY2tlZCkpOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X2F1dG9GaW5kQWRiX3RvZ2dsZWQoYm9vbCBjaGVja2VkKSB7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIHNldHRpbmdzLnNldFZhbHVlKFVpOjpTZXR0aW5nczo6QVVUT19GSU5EX0FEQiwgY2hlY2tlZCk7CisKKyAgICBpZiAobUFkYikgeworICAgICAgICBpZiAoY2hlY2tlZCkgeworICAgICAgICAgICAgbUFkYi0+c2V0Q3VzdG9tQWRiUGF0aChzdGQ6OnN0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1BZGItPnNldEN1c3RvbUFkYlBhdGgoc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpBREJfUEFUSCwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdGRTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtVWktPnNldF9hZGJQYXRoQm94LT5zZXRIaWRkZW4oY2hlY2tlZCk7CisgICAgbVVpLT5zZXRfYWRiUGF0aEJ1dHRvbi0+c2V0SGlkZGVuKGNoZWNrZWQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfcmVwb3J0UHJlZl90byhVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfVkFMVUUgdikgeworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0UsIHYpOworfQorCit2b2lkIFNldHRpbmdzUGFnZTo6b25fc2V0X2NyYXNoUmVwb3J0UHJlZkNvbWJvQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KSB7CisgICAgaWYgKGluZGV4ID09IFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfQ09NQk9CT1hfQUxXQVlTKSB7CisgICAgICAgIHNldF9yZXBvcnRQcmVmX3RvKFVpOjpTZXR0aW5nczo6Q1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BTFdBWVMpOworICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9DT01CT0JPWF9ORVZFUikgeworICAgICAgICBzZXRfcmVwb3J0UHJlZl90byhVaTo6U2V0dGluZ3M6OkNSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfTkVWRVIpOworICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9DT01CT0JPWF9BU0spIHsKKyAgICAgICAgc2V0X3JlcG9ydFByZWZfdG8oVWk6OlNldHRpbmdzOjpDUkFTSFJFUE9SVF9QUkVGRVJFTkNFX0FTSyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzRhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9zZXR0aW5ncy1wYWdlLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9zZXR0aW5ncy1hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC13aW5kb3cuaCIKKyNpbmNsdWRlICJ1aV9zZXR0aW5ncy1wYWdlLmgiCisjaW5jbHVkZSA8UVN0cmluZz4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgU2V0dGluZ3NQYWdlIDogcHVibGljIFFXaWRnZXQKK3sKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgZXhwbGljaXQgU2V0dGluZ3NQYWdlKFFXaWRnZXQgKnBhcmVudCA9IDApOworCisgICAgdm9pZCBzZXRBZGJJbnRlcmZhY2UoYW5kcm9pZDo6ZW11bGF0aW9uOjpBZGJJbnRlcmZhY2UqIGFkYik7CisKK3NpZ25hbHM6CisgICAgdm9pZCBvbkZvcndhcmRTaG9ydGN1dHNUb0RldmljZUNoYW5nZWQoaW50IGluZGV4KTsKKyAgICB2b2lkIG9uVG9wQ2hhbmdlZChib29sIGlzT25Ub3ApOworICAgIHZvaWQgdGhlbWVDaGFuZ2VkKFNldHRpbmdzVGhlbWUgbmV3X3RoZW1lKTsKKworcHJpdmF0ZSBzbG90czoKKyAgICB2b2lkIG9uX3NldF9mb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2VfY3VycmVudEluZGV4Q2hhbmdlZChpbnQgaW5kZXgpOworICAgIHZvaWQgb25fc2V0X29uVG9wX3RvZ2dsZWQoYm9vbCBjaGVja2VkKTsKKyAgICB2b2lkIG9uX3NldF9hdXRvRmluZEFkYl90b2dnbGVkKGJvb2wgY2hlY2tlZCk7CisgICAgdm9pZCBvbl9zZXRfc2F2ZUxvY0JveF90ZXh0RWRpdGVkKGNvbnN0IFFTdHJpbmcmKTsKKyAgICB2b2lkIG9uX3NldF9zYXZlTG9jRm9sZGVyQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX3NldF9hZGJQYXRoQm94X3RleHRFZGl0ZWQoY29uc3QgUVN0cmluZyYpOworICAgIHZvaWQgb25fc2V0X2FkYlBhdGhCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fc2V0X3RoZW1lQm94X2N1cnJlbnRJbmRleENoYW5nZWQoaW50IGluZGV4KTsKKyAgICB2b2lkIG9uX3NldF9jcmFzaFJlcG9ydFByZWZDb21ib0JveF9jdXJyZW50SW5kZXhDaGFuZ2VkKGludCBpbmRleCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBldmVudEZpbHRlciAoUU9iamVjdCogb2JqZWN0LCBRRXZlbnQqIGV2ZW50KSBvdmVycmlkZTsKKworICAgIGFuZHJvaWQ6OmVtdWxhdGlvbjo6QWRiSW50ZXJmYWNlKiBtQWRiOworICAgIHN0ZDo6dW5pcXVlX3B0cjxVaTo6U2V0dGluZ3NQYWdlPiBtVWk7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3NldHRpbmdzLXBhZ2UudWkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3ZTcwMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3NldHRpbmdzLXBhZ2UudWkKQEAgLTAsMCArMSw0NTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8dWkgdmVyc2lvbj0iNC4wIj4KKyA8Y2xhc3M+U2V0dGluZ3NQYWdlPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJTZXR0aW5nc1BhZ2UiPgorICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgPHJlY3Q+CisgICAgPHg+MDwveD4KKyAgICA8eT4wPC95PgorICAgIDx3aWR0aD42MjI8L3dpZHRoPgorICAgIDxoZWlnaHQ+NTgwPC9oZWlnaHQ+CisgICA8L3JlY3Q+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dUaXRsZSI+CisgICA8c3RyaW5nPkZvcm08L3N0cmluZz4KKyAgPC9wcm9wZXJ0eT4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJzZXRfY3Jhc2hSZXByb3RQcmVmVGl0bGUiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4xNjg8L3k+CisgICAgIDx3aWR0aD4yODE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPldoZW4gdG8gc2VuZCBjcmFzaCByZXBvcnRzPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDaGVja0JveCIgbmFtZT0ic2V0X29uVG9wIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT4xODY8L3k+CisgICAgIDx3aWR0aD4yMTE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrZWQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+VG9nZ2xlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFMaW5lRWRpdCIgbmFtZT0ic2V0X2FkYlBhdGhCb3giPgorICAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZWQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzcwPC94PgorICAgICA8eT4xMTI8L3k+CisgICAgIDx3aWR0aD4xOTE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkZpeGVkIiB2c2l6ZXR5cGU9IkZpeGVkIj4KKyAgICAgPGhvcnN0cmV0Y2g+MDwvaG9yc3RyZXRjaD4KKyAgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgICA8L3NpemVwb2xpY3k+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlYWRPbmx5Ij4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9InNhdmVMb2NhdGlvblRpdGxlIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4zMDE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPlNjcmVlbnNob3Qgc2F2ZSBsb2NhdGlvbjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRTGluZUVkaXQiIG5hbWU9InNldF9zYXZlTG9jQm94Ij4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVkIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+Mzg8L3k+CisgICAgIDx3aWR0aD4yNDA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgICA8c2l6ZXBvbGljeSBoc2l6ZXR5cGU9IkZpeGVkIiB2c2l6ZXR5cGU9IkZpeGVkIj4KKyAgICAgPGhvcnN0cmV0Y2g+MDwvaG9yc3RyZXRjaD4KKyAgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgICA8L3NpemVwb2xpY3k+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlYWRPbmx5Ij4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0ic2V0X3NhdmVMb2NGb2xkZXJCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+NTcyPC94PgorICAgICA8eT4zODwveT4KKyAgICAgPHdpZHRoPjMyPC93aWR0aD4KKyAgICAgPGhlaWdodD4zMjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2RhcmsvZm9sZGVyPC9ub3JtYWxvZmY+Oi9kYXJrL2ZvbGRlcjwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Zm9sZGVyPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDaGVja0JveCIgbmFtZT0ic2V0X2F1dG9GaW5kQWRiIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+MTEyPC95PgorICAgICA8d2lkdGg+NDE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrZWQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5Ub2dnbGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJzZXRfb25Ub3BUaXRsZSI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MTY4PC95PgorICAgICA8d2lkdGg+MjExPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgPHN0cmluZz5FbXVsYXRvciBhbHdheXMgb24gdG9wPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0idGhlbWVUaXRsZSI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD4xODE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkVtdWxhdG9yIHdpbmRvdyB0aGVtZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRQ29tYm9Cb3giIG5hbWU9InNldF90aGVtZUJveCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+Mzg8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5wYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5MaWdodDwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgICA8aXRlbT4KKyAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgIDxzdHJpbmc+RGFyazwvc3RyaW5nPgorICAgIDwvcHJvcGVydHk+CisgICA8L2l0ZW0+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0ic2V0X2FkYlBhdGhCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+NTcyPC94PgorICAgICA8eT4xMTI8L3k+CisgICAgIDx3aWR0aD4zMjwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9kYXJrL2ZvbGRlcjwvbm9ybWFsb2ZmPjovZGFyay9mb2xkZXI8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjI0PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmZvbGRlcjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImtiZFNob3J0Y3V0c1RpdGxlIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT45NDwveT4KKyAgICAgPHdpZHRoPjI4MTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5ib3JkZXI6IDBweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgIDxzdHJpbmc+U2VuZCBrZXlib2FyZCBzaG9ydGN1dHMgdG88L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJhdXRvRmluZEFkYlRpdGxlIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMyNDwveD4KKyAgICAgPHk+OTQ8L3k+CisgICAgIDx3aWR0aD4yNTE8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPlVzZSBkZXRlY3RlZCBBREIgbG9jYXRpb248L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJzZXRfY3Jhc2hSZXBvcnRQcmVmQ29tYm9Cb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MzI0PC94PgorICAgICA8eT4xODY8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5wYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Im1heFZpc2libGVJdGVtcyI+CisgICAgPG51bWJlcj4zPC9udW1iZXI+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5BbHdheXM8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPk5ldmVyPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5Bc2s8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJzZXRfZm9yd2FyZFNob3J0Y3V0c1RvRGV2aWNlIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjIwPC94PgorICAgICA8eT4xMTI8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5wYWRkaW5nOiAzcHggM3B4IDNweCAzcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz5FbXVsYXRvciBjb250cm9scyAoZGVmYXVsdCk8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPlZpcnR1YWwgZGV2aWNlPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgPC93aWRnZXQ+CisgIDx6b3JkZXI+a2JkU2hvcnRjdXRzVGl0bGU8L3pvcmRlcj4KKyAgPHpvcmRlcj5zZXRfY3Jhc2hSZXByb3RQcmVmVGl0bGU8L3pvcmRlcj4KKyAgPHpvcmRlcj5zZXRfb25Ub3A8L3pvcmRlcj4KKyAgPHpvcmRlcj5zZXRfYWRiUGF0aEJveDwvem9yZGVyPgorICA8em9yZGVyPnNhdmVMb2NhdGlvblRpdGxlPC96b3JkZXI+CisgIDx6b3JkZXI+c2V0X3NhdmVMb2NCb3g8L3pvcmRlcj4KKyAgPHpvcmRlcj5zZXRfc2F2ZUxvY0ZvbGRlckJ1dHRvbjwvem9yZGVyPgorICA8em9yZGVyPnNldF9hdXRvRmluZEFkYjwvem9yZGVyPgorICA8em9yZGVyPnNldF9vblRvcFRpdGxlPC96b3JkZXI+CisgIDx6b3JkZXI+dGhlbWVUaXRsZTwvem9yZGVyPgorICA8em9yZGVyPnNldF90aGVtZUJveDwvem9yZGVyPgorICA8em9yZGVyPnNldF9hZGJQYXRoQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+YXV0b0ZpbmRBZGJUaXRsZTwvem9yZGVyPgorICA8em9yZGVyPnNldF9jcmFzaFJlcG9ydFByZWZDb21ib0JveDwvem9yZGVyPgorICA8em9yZGVyPnNldF9mb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2U8L3pvcmRlcj4KKyA8L3dpZGdldD4KKyA8dGFic3RvcHM+CisgIDx0YWJzdG9wPnNldF90aGVtZUJveDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+c2V0X3NhdmVMb2NCb3g8L3RhYnN0b3A+CisgIDx0YWJzdG9wPnNldF9zYXZlTG9jRm9sZGVyQnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD5zZXRfZm9yd2FyZFNob3J0Y3V0c1RvRGV2aWNlPC90YWJzdG9wPgorICA8dGFic3RvcD5zZXRfYXV0b0ZpbmRBZGI8L3RhYnN0b3A+CisgIDx0YWJzdG9wPnNldF9hZGJQYXRoQm94PC90YWJzdG9wPgorICA8dGFic3RvcD5zZXRfYWRiUGF0aEJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+c2V0X29uVG9wPC90YWJzdG9wPgorICA8dGFic3RvcD5zZXRfY3Jhc2hSZXBvcnRQcmVmQ29tYm9Cb3g8L3RhYnN0b3A+CisgPC90YWJzdG9wcz4KKyA8cmVzb3VyY2VzPgorICA8aW5jbHVkZSBsb2NhdGlvbj0iLi4vcmVzb3VyY2VzLnFyYyIvPgorIDwvcmVzb3VyY2VzPgorIDxjb25uZWN0aW9ucy8+Cis8L3VpPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYmU2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy90ZWxlcGhvbnktcGFnZS5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3RlbGVwaG9ueS1wYWdlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3RlbGVwaG9ueV9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lcnJvci1kaWFsb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3F0LXNldHRpbmdzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zbXMuaCIKKyNpbmNsdWRlIDxRU2V0dGluZ3M+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjZGVmaW5lIE1BWF9TTVNfTVNHX1NJWkUgMTAyNCAvLyBBcmJpdHJhcnkgZW11bGF0b3IgbGltaXRhdGlvbgorCitUZWxlcGhvbnlQYWdlOjpUZWxlcGhvbnlQYWdlKFFXaWRnZXQgKnBhcmVudCkgOgorICAgIFFXaWRnZXQocGFyZW50KSwKKyAgICBtVWkobmV3IFVpOjpUZWxlcGhvbnlQYWdlKCkpLAorICAgIG1UZWxlcGhvbnlBZ2VudChudWxscHRyKSwKKyAgICBtQ2FsbEFjdGl2aXR5KFRlbGVwaG9ueVBhZ2U6OkNhbGxBY3Rpdml0eTo6SW5hY3RpdmUpCit7CisgICAgbVVpLT5zZXR1cFVpKHRoaXMpOworICAgIG1VaS0+dGVsX251bWJlckJveC0+c2V0VmFsaWRhdG9yKG5ldyBQaG9uZU51bWJlclZhbGlkYXRvcigpKTsKK30KKwordm9pZCBUZWxlcGhvbnlQYWdlOjpvbl90ZWxfc3RhcnRFbmRCdXR0b25fY2xpY2tlZCgpCit7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIFNldHRpbmdzVGhlbWUgdGhlbWUgPQorICAgICAgICAoU2V0dGluZ3NUaGVtZSlzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlVJX1RIRU1FLCAwKS50b0ludCgpOworICAgIGlmIChtQ2FsbEFjdGl2aXR5ID09IENhbGxBY3Rpdml0eTo6SW5hY3RpdmUpIHsKKyAgICAgICAgLy8gU3RhcnQgYSBjYWxsCisgICAgICAgIGlmIChtVGVsZXBob255QWdlbnQgJiYgbVRlbGVwaG9ueUFnZW50LT50ZWxlcGhvbnlDbWQpIHsKKyAgICAgICAgICAgIC8vIENvbW1hbmQgdGhlIGVtdWxhdG9yCisgICAgICAgICAgICBUZWxlcGhvbnlSZXNwb25zZSB0UmVzcDsKKworICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBzcHVyaW91cyBjaGFyYWN0ZXJzIGZyb20gdGhlIHBob25lIG51bWJlcgorICAgICAgICAgICAgLy8gKEFsbG93IG9ubHkgJysnIGFuZCAnMCcuLic5JykKKyAgICAgICAgICAgIC8vIE5vdGU6IHBob25lTnVtYmVyVmFsaWRhdG9yIHZhbGlkYXRlcyB0aGUgdXNlcidzIGlucHV0LCBidXQKKyAgICAgICAgICAgIC8vIGFsbG93cyBzb21lIGh1bWFuLXJlYWRhYmxlIGNoYXJhY3RlcnMgbGlrZSAnLicgYW5kICcpJy4KKyAgICAgICAgICAgIC8vIEhlcmUgd2UgcmVtb3ZlIHRoYXQgbWVhbmluZ2xlc3MgcHVuY3R1YXRpb24uCisgICAgICAgICAgICBRU3RyaW5nIGNsZWFuTnVtYmVyID0gbVVpLT50ZWxfbnVtYmVyQm94LT5jdXJyZW50VGV4dCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZShRUmVndWxhckV4cHJlc3Npb24oIlteKzAtOV0iKSk7CisKKyAgICAgICAgICAgIHRSZXNwID0gbVRlbGVwaG9ueUFnZW50LT50ZWxlcGhvbnlDbWQoVGVsX09wX0luaXRfQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5OdW1iZXIudG9TdGRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmICh0UmVzcCAhPSBUZWxfUmVzcF9PSykgeworICAgICAgICAgICAgICAgIHNob3dFcnJvckRpYWxvZyh0cigiVGhlIGNhbGwgZmFpbGVkLiIpLCB0cigiVGVsZXBob255IikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1Y2Nlc3M6IFVwZGF0ZSB0aGUgc3RhdGUgYW5kIHRoZSBVSSBidXR0b25zCisgICAgICAgIG1DYWxsQWN0aXZpdHkgPSBDYWxsQWN0aXZpdHk6OkFjdGl2ZTsKKyAgICAgICAgbVBob25lTnVtYmVyID0gbVVpLT50ZWxfbnVtYmVyQm94LT5jdXJyZW50VGV4dCgpOworCisgICAgICAgIG1VaS0+dGVsX251bWJlckJveC0+c2V0RW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgc2V0QnV0dG9uRW5hYmxlZChtVWktPnRlbF9ob2xkQ2FsbEJ1dHRvbiwgdGhlbWUsIHRydWUpOworICAgICAgICAvLyBDaGFuZ2UgdGhlIGljb24gYW5kIHRleHQgdG8gIkVORCBDQUxMIgorICAgICAgICBRSWNvbiB0aGVJY29uKCI6L2RhcmsvY2FsbF9lbmQiKTsgLy8gU2FtZSBmb3IgbGlnaHQgYW5kIGRhcmsKKyAgICAgICAgbVVpLT50ZWxfc3RhcnRFbmRCdXR0b24tPnNldEljb24odGhlSWNvbik7CisgICAgICAgIG1VaS0+dGVsX3N0YXJ0RW5kQnV0dG9uLT5zZXRUZXh0KHRyKCJFTkQgQ0FMTCIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBFbmQgYSBjYWxsCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhdGUgYW5kIHRoZSBVSSBidXR0b25zCisgICAgICAgIG1DYWxsQWN0aXZpdHkgPSBDYWxsQWN0aXZpdHk6OkluYWN0aXZlOworCisgICAgICAgIG1VaS0+dGVsX251bWJlckJveC0+c2V0RW5hYmxlZCh0cnVlKTsKKworICAgICAgICBtVWktPnRlbF9ob2xkQ2FsbEJ1dHRvbi0+c2V0UHJvcGVydHkoInRoZW1lSWNvbk5hbWUiLCAicGhvbmVfcGF1c2VkIik7CisKKyAgICAgICAgc2V0QnV0dG9uRW5hYmxlZChtVWktPnRlbF9ob2xkQ2FsbEJ1dHRvbiwgdGhlbWUsIGZhbHNlKTsKKyAgICAgICAgLy8gQ2hhbmdlIHRoZSBpY29uIGFuZCB0ZXh0IHRvICJDQUxMIERFVklDRSIKKyAgICAgICAgUUljb24gdGhlSWNvbigiOi9kYXJrL3Bob25lX2J1dHRvbiIpOyAvLyBTYW1lIGZvciBsaWdodCBhbmQgZGFyaworICAgICAgICBtVWktPnRlbF9zdGFydEVuZEJ1dHRvbi0+c2V0SWNvbih0aGVJY29uKTsKKyAgICAgICAgbVVpLT50ZWxfc3RhcnRFbmRCdXR0b24tPnNldFRleHQodHIoIkNBTEwgREVWSUNFIikpOworCisgICAgICAgIGlmIChtVGVsZXBob255QWdlbnQgJiYgbVRlbGVwaG9ueUFnZW50LT50ZWxlcGhvbnlDbWQpIHsKKyAgICAgICAgICAgIC8vIENvbW1hbmQgdGhlIGVtdWxhdG9yCisgICAgICAgICAgICBRU3RyaW5nIGNsZWFuTnVtYmVyID0gbVVpLT50ZWxfbnVtYmVyQm94LT5jdXJyZW50VGV4dCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKFFSZWd1bGFyRXhwcmVzc2lvbigiW14rMC05XSIpKTsKKyAgICAgICAgICAgIFRlbGVwaG9ueVJlc3BvbnNlIHRSZXNwOworICAgICAgICAgICAgdFJlc3AgPSBtVGVsZXBob255QWdlbnQtPnRlbGVwaG9ueUNtZChUZWxfT3BfRGlzY29ubmVjdF9DYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbk51bWJlci50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKHRSZXNwICE9IFRlbF9SZXNwX09LICAmJgorICAgICAgICAgICAgICAgIHRSZXNwICE9IFRlbF9SZXNwX0ludmFsaWRfQWN0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHNob3cgYW4gZXJyb3IgZm9yIEludmFsaWQgQWN0aW9uOiB0aGF0CisgICAgICAgICAgICAgICAgLy8ganVzdCBtZWFucyB0aGF0IHRoZSBBVkQgYWxyZWFkeSBoYW5nZWQgdXAuCisgICAgICAgICAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHRyKCJUaGUgZW5kLWNhbGwgZmFpbGVkLiIpLCB0cigiVGVsZXBob255IikpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBUZWxlcGhvbnlQYWdlOjpvbl90ZWxfaG9sZENhbGxCdXR0b25fY2xpY2tlZCgpCit7CisgICAgUVNldHRpbmdzIHNldHRpbmdzOworICAgIFNldHRpbmdzVGhlbWUgdGhlbWUgPQorICAgICAgICAoU2V0dGluZ3NUaGVtZSlzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlVJX1RIRU1FLCAwKS50b0ludCgpOworICAgIHN3aXRjaCAobUNhbGxBY3Rpdml0eSkgeworICAgICAgICBjYXNlIENhbGxBY3Rpdml0eTo6QWN0aXZlOgorICAgICAgICAgICAgLy8gQWN0aXZlIC0tPiBPbiBob2xkCisgICAgICAgICAgICBtQ2FsbEFjdGl2aXR5ID0gQ2FsbEFjdGl2aXR5OjpIZWxkOworCisgICAgICAgICAgICBtVWktPnRlbF9ob2xkQ2FsbEJ1dHRvbi0+CisgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkoInRoZW1lSWNvbk5hbWUiLCAicGhvbmVfaW5fdGFsayIpOworCisgICAgICAgICAgICBzZXRCdXR0b25FbmFibGVkKG1VaS0+dGVsX2hvbGRDYWxsQnV0dG9uLCAgdGhlbWUsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2FsbEFjdGl2aXR5OjpIZWxkOgorICAgICAgICAgICAgLy8gT24gaG9sZCAtLT4gQWN0aXZlCisgICAgICAgICAgICBtQ2FsbEFjdGl2aXR5ID0gQ2FsbEFjdGl2aXR5OjpBY3RpdmU7CisKKyAgICAgICAgICAgIG1VaS0+dGVsX2hvbGRDYWxsQnV0dG9uLT4KKyAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgidGhlbWVJY29uTmFtZSIsICAgICAgICAgICJwaG9uZV9wYXVzZWQiKTsKKyAgICAgICAgICAgIG1VaS0+dGVsX2hvbGRDYWxsQnV0dG9uLT4KKyAgICAgICAgICAgICAgICBzZXRQcm9wZXJ0eSgidGhlbWVJY29uTmFtZV9kaXNhYmxlZCIsICJwaG9uZV9wYXVzZWRfZGlzYWJsZWQiKTsKKworICAgICAgICAgICAgc2V0QnV0dG9uRW5hYmxlZChtVWktPnRlbF9ob2xkQ2FsbEJ1dHRvbiwgIHRoZW1lLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OjsKKyAgICB9CisgICAgaWYgKG1UZWxlcGhvbnlBZ2VudCAmJiBtVGVsZXBob255QWdlbnQtPnRlbGVwaG9ueUNtZCkgeworICAgICAgICAvLyBDb21tYW5kIHRoZSBlbXVsYXRvcgorICAgICAgICBRU3RyaW5nIGNsZWFuTnVtYmVyID0gbVVpLT50ZWxfbnVtYmVyQm94LT5jdXJyZW50VGV4dCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoUVJlZ3VsYXJFeHByZXNzaW9uKCJbXiswLTldIikpOworICAgICAgICBUZWxlcGhvbnlSZXNwb25zZSAgdFJlc3A7CisgICAgICAgIFRlbGVwaG9ueU9wZXJhdGlvbiB0T3AgPSAobUNhbGxBY3Rpdml0eSA9PSBDYWxsQWN0aXZpdHk6OkhlbGQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWxfT3BfUGxhY2VfQ2FsbF9Pbl9Ib2xkIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZWxfT3BfVGFrZV9DYWxsX09mZl9Ib2xkOworCisgICAgICAgIHRSZXNwID0gbVRlbGVwaG9ueUFnZW50LT50ZWxlcGhvbnlDbWQodE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuTnVtYmVyLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGlmICh0UmVzcCAhPSBUZWxfUmVzcF9PSykgeworICAgICAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHRyKCJUaGUgY2FsbCBob2xkIGZhaWxlZC4iKSwgdHIoIlRlbGVwaG9ueSIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworUVZhbGlkYXRvcjo6U3RhdGUgVGVsZXBob255UGFnZTo6UGhvbmVOdW1iZXJWYWxpZGF0b3I6OnZhbGlkYXRlKFFTdHJpbmcgJmlucHV0LCBpbnQgJnBvcykgY29uc3QKK3sKKyAgICBpbnQgbnVtRGlnaXRzID0gMDsKKyAgICBjb25zdCBpbnQgTUFYX0RJR0lUUyA9IDE2OworICAgIHN0YXRpYyBjb25zdCBRU3RyaW5nIGFjY2VwdGFibGVfbm9uX2RpZ2l0cyA9ICItLigpLyArIjsKKworICAgIGlmIChpbnB1dC5sZW5ndGgoKSA+PSAzMikgeworICAgICAgICByZXR1cm4gUVZhbGlkYXRvcjo6SW52YWxpZDsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgUUNoYXJSZWYgYyA9IGlucHV0W2ldOworICAgICAgICBpZiAoYy5pc0RpZ2l0KCkpIHsKKyAgICAgICAgICAgIG51bURpZ2l0cysrOworICAgICAgICAgICAgaWYgKG51bURpZ2l0cyA+IE1BWF9ESUdJVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVZhbGlkYXRvcjo6SW52YWxpZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjID09ICcrJyAmJiBpICE9IDApIHsKKyAgICAgICAgICAgIC8vICcrJyBpcyBvbmx5IGFsbG93ZWQgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgICAgICAgICAgcmV0dXJuIFFWYWxpZGF0b3I6OkludmFsaWQ7CisgICAgICAgIH0gZWxzZSBpZiAoIWFjY2VwdGFibGVfbm9uX2RpZ2l0cy5jb250YWlucyhjKSkgeworICAgICAgICAgICAgcmV0dXJuIFFWYWxpZGF0b3I6OkludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKChudW1EaWdpdHMgPiAwKSA/IFFWYWxpZGF0b3I6OkFjY2VwdGFibGUgOiBRVmFsaWRhdG9yOjpJbnRlcm1lZGlhdGUpOworfQorCit2b2lkIFRlbGVwaG9ueVBhZ2U6Om9uX3Ntc19zZW5kQnV0dG9uX2NsaWNrZWQoKQoreworICAgIC8vIEdldCB0aGUgImZyb20iIG51bWJlcgorICAgIFNtc0FkZHJlc3NSZWMgc2VuZGVyOworICAgIGludCByZXRWYWwgPSBzbXNfYWRkcmVzc19mcm9tX3N0cigmc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgbVVpLT50ZWxfbnVtYmVyQm94LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0KCkudG9TdGRTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgbVVpLT50ZWxfbnVtYmVyQm94LT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUZXh0KCkubGVuZ3RoKCkpOworICAgIGlmIChyZXRWYWwgPCAwICB8fCAgc2VuZGVyLmxlbiA8PSAwKSB7CisgICAgICAgIHNob3dFcnJvckRpYWxvZyh0cigiVGhlIFwiRnJvbVwiIG51bWJlciBpcyBpbnZhbGlkLiIpLCB0cigiU01TIikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IHRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGhlTWVzc2FnZSA9CisgICAgICAgICAgICBtVWktPnNtc19tZXNzYWdlQm94LT50b1BsYWluVGV4dCgpLnRvU3RkU3RyaW5nKCk7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBtZXNzYWdlIHRleHQgdG8gVVRGLTgKKyAgICB1bnNpZ25lZCBjaGFyIHV0ZjhNZXNzYWdlW01BWF9TTVNfTVNHX1NJWkUrMV07CisgICAgaW50ICAgICAgICAgICBuVXRmOENoYXJzOworICAgIG5VdGY4Q2hhcnMgPSBzbXNfdXRmOF9mcm9tX21lc3NhZ2Vfc3RyKHRoZU1lc3NhZ2UuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNZXNzYWdlLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGY4TWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfU01TX01TR19TSVpFKTsKKyAgICBpZiAoblV0ZjhDaGFycyA9PSAwKSB7CisgICAgICAgIHNob3dFcnJvckRpYWxvZyh0cigiVGhlIG1lc3NhZ2UgaXMgZW1wdHkuPGJyPlBsZWFzZSBlbnRlciBhIG1lc3NhZ2UuIiksIHRyKCJTTVMiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoblV0ZjhDaGFycyA8IDApIHsKKyAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHRyKCJUaGUgbWVzc2FnZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIiksIHRyKCJTTVMiKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIFNNUyBQRFVzLCB0aGVuIHNlbmQgdGhlbQorICAgIFNtc1BEVSAqcGR1cyA9IHNtc3BkdV9jcmVhdGVfZGVsaXZlcl91dGY4KHV0ZjhNZXNzYWdlLCBuVXRmOENoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW5kZXIsIE5VTEwpOworICAgIGlmIChwZHVzID09IE5VTEwpIHsKKyAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHRyKCJUaGUgbWVzc2FnZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIoIlNNUyIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtVGVsZXBob255QWdlbnQgJiYgbVRlbGVwaG9ueUFnZW50LT5nZXRNb2RlbSkgeworICAgICAgICBBTW9kZW0gbW9kZW0gPSBtVGVsZXBob255QWdlbnQtPmdldE1vZGVtKCk7CisgICAgICAgIGlmIChtb2RlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBzaG93RXJyb3JEaWFsb2codHIoIkNhbm5vdCBzZW5kIG1lc3NhZ2UsIG1vZGVtIGVtdWxhdGlvbiBub3QgcnVubmluZy4iKSwgdHIoIlNNUyIpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IHBkdXNbaWR4XSAhPSBOVUxMOyBpZHgrKykgeworICAgICAgICAgICAgYW1vZGVtX3JlY2VpdmVfc21zKG1vZGVtLCBwZHVzW2lkeF0pOworICAgICAgICB9CisgICAgfQorCisgICAgc21zcGR1X2ZyZWVfbGlzdCggcGR1cyApOworfQorCit2b2lkIFRlbGVwaG9ueVBhZ2U6OnNldFRlbGVwaG9ueUFnZW50KGNvbnN0IFFBbmRyb2lkVGVsZXBob255QWdlbnQqIGFnZW50KSB7CisgICAgbVRlbGVwaG9ueUFnZW50ID0gYWdlbnQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy90ZWxlcGhvbnktcGFnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I4ODlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAidWlfdGVsZXBob255LXBhZ2UuaCIKKyNpbmNsdWRlIDxRVmFsaWRhdG9yPgorI2luY2x1ZGUgPFFXaWRnZXQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgUUFuZHJvaWRUZWxlcGhvbnlBZ2VudDsKK2NsYXNzIFRlbGVwaG9ueVBhZ2UgOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUZWxlcGhvbnlQYWdlKFFXaWRnZXQgKnBhcmVudCA9IDApOworCisgICAgdm9pZCBzZXRUZWxlcGhvbnlBZ2VudChjb25zdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50KiBhZ2VudCk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBvbl90ZWxfc3RhcnRFbmRCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fdGVsX2hvbGRDYWxsQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX3Ntc19zZW5kQnV0dG9uX2NsaWNrZWQoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBQaG9uZU51bWJlclZhbGlkYXRvciA6IHB1YmxpYyBRVmFsaWRhdG9yCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGlucHV0IG9mIGEgdGVsZXBob25lIG51bWJlci4KKyAgICAgICAgLy8gV2UgYWxsb3cgJysnIG9ubHkgaW4gdGhlIGZpcnN0IHBvc2l0aW9uLgorICAgICAgICAvLyBPbmUgb3IgbW9yZSBkaWdpdHMgKDAtOSkgYXJlIHJlcXVpcmVkLgorICAgICAgICAvLyBTb21lIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCwgYnV0IGlnbm9yZWQuCisgICAgICAgIFN0YXRlIHZhbGlkYXRlKFFTdHJpbmcgJmlucHV0LCBpbnQgJnBvcykgY29uc3Q7CisgICAgfTsKKworICAgIGVudW0gY2xhc3MgQ2FsbEFjdGl2aXR5IHsKKyAgICAgICAgSW5hY3RpdmUsIEFjdGl2ZSwgSGVsZAorICAgIH07CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OlRlbGVwaG9ueVBhZ2U+IG1VaTsKKyAgICBjb25zdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50KiBtVGVsZXBob255QWdlbnQ7CisgICAgQ2FsbEFjdGl2aXR5IG1DYWxsQWN0aXZpdHk7CisgICAgUVN0cmluZyBtUGhvbmVOdW1iZXI7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UudWkgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy90ZWxlcGhvbnktcGFnZS51aQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRhZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UudWkKQEAgLTAsMCArMSwyNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8dWkgdmVyc2lvbj0iNC4wIj4KKyA8Y2xhc3M+VGVsZXBob255UGFnZTwvY2xhc3M+CisgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0iVGVsZXBob255UGFnZSI+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICA8cmVjdD4KKyAgICA8eD4wPC94PgorICAgIDx5PjA8L3k+CisgICAgPHdpZHRoPjYyMjwvd2lkdGg+CisgICAgPGhlaWdodD41ODA8L2hlaWdodD4KKyAgIDwvcmVjdD4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmc+Rm9ybTwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRUGxhaW5UZXh0RWRpdCIgbmFtZT0ic21zX21lc3NhZ2VCb3giPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjE0ODwveT4KKyAgICAgPHdpZHRoPjI4MDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MTQwPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDRweCAycHggMnB4IDJweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icGxhaW5UZXh0Ij4KKyAgICA8c3RyaW5nPkRvbid0IGZvcmdldCB0aGUgbWFyc2htYWxsb3dzITwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+U21zQm94PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0idGVsX2Zyb21Hcm91cCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+MjA8L3k+CisgICAgIDx3aWR0aD41MTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPkZyb208L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRpdGxlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9InRlbF9zdGFydEVuZEJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xNzI8L3g+CisgICAgIDx5PjgwPC95PgorICAgICA8d2lkdGg+MTI4PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5TdGFydCBjYWxsPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+Q0FMTCBERVZJQ0U8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvcGhvbmVfYnV0dG9uPC9ub3JtYWxvZmY+Oi9saWdodC9waG9uZV9idXR0b248L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5waG9uZV9idXR0b248L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZV9kaXNhYmxlZCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnBob25lX2Rpc2FibGVkPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFDb21ib0JveCIgbmFtZT0idGVsX251bWJlckJveCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4yMDwveD4KKyAgICAgPHk+Mzg8L3k+CisgICAgIDx3aWR0aD4yODA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZWRpdGFibGUiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imluc2VydFBvbGljeSI+CisgICAgPGVudW0+UUNvbWJvQm94OjpJbnNlcnRBdFRvcDwvZW51bT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPGl0ZW0+CisgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICA8c3RyaW5nPig2NTApIDU1NS0xMjEyPC9zdHJpbmc+CisgICAgPC9wcm9wZXJ0eT4KKyAgIDwvaXRlbT4KKyAgIDxpdGVtPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgPHN0cmluZz4rMSA2NTAgNTU1LTY3ODk8L3N0cmluZz4KKyAgICA8L3Byb3BlcnR5PgorICAgPC9pdGVtPgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9InNtc19zZW5kQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjE2MDwveD4KKyAgICAgPHk+Mjk4PC95PgorICAgICA8d2lkdGg+MTQwPC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD43NTwvd2VpZ2h0PgorICAgICA8Ym9sZD50cnVlPC9ib2xkPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz5TRU5EIE1FU1NBR0U8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovZGFyay9zZW5kPC9ub3JtYWxvZmY+Oi9kYXJrL3NlbmQ8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5zZW5kPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5Ub29sPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlJhaXNlZE1hdGVyaWFsQnV0dG9uIiBuYW1lPSJ0ZWxfaG9sZENhbGxCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9ImVuYWJsZWQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjQwPC94PgorICAgICA8eT44MDwveT4KKyAgICAgPHdpZHRoPjExODwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzY8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgIDx3ZWlnaHQ+NzU8L3dlaWdodD4KKyAgICAgPGJvbGQ+dHJ1ZTwvYm9sZD4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgIDxzdHJpbmc+SG9sZCBjYWxsPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+SE9MRCBDQUxMPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3Bob25lX3BhdXNlZDwvbm9ybWFsb2ZmPgorICAgICA8ZGlzYWJsZWRvZmY+Oi9saWdodC9waG9uZV9wYXVzZWRfZGlzYWJsZWQ8L2Rpc2FibGVkb2ZmPjovbGlnaHQvcGhvbmVfcGF1c2VkPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+cGhvbmVfcGF1c2VkPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWVfZGlzYWJsZWQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5waG9uZV9wYXVzZWRfZGlzYWJsZWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJ0ZWxfU21zR3JvdXAiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MjA8L3g+CisgICAgIDx5PjEzMDwveT4KKyAgICAgPHdpZHRoPjE0MTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjE8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICA8c3RyaW5nPlNNUyBtZXNzYWdlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5UaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx6b3JkZXI+dGVsX1Ntc0dyb3VwPC96b3JkZXI+CisgIDx6b3JkZXI+c21zX21lc3NhZ2VCb3g8L3pvcmRlcj4KKyAgPHpvcmRlcj50ZWxfZnJvbUdyb3VwPC96b3JkZXI+CisgIDx6b3JkZXI+dGVsX3N0YXJ0RW5kQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+dGVsX251bWJlckJveDwvem9yZGVyPgorICA8em9yZGVyPnNtc19zZW5kQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+dGVsX2hvbGRDYWxsQnV0dG9uPC96b3JkZXI+CisgPC93aWRnZXQ+CisgPGN1c3RvbXdpZGdldHM+CisgIDxjdXN0b213aWRnZXQ+CisgICA8Y2xhc3M+UmFpc2VkTWF0ZXJpYWxCdXR0b248L2NsYXNzPgorICAgPGV4dGVuZHM+UVB1c2hCdXR0b248L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9yYWlzZWQtbWF0ZXJpYWwtYnV0dG9uLmg8L2hlYWRlcj4KKyAgPC9jdXN0b213aWRnZXQ+CisgPC9jdXN0b213aWRnZXRzPgorIDx0YWJzdG9wcz4KKyAgPHRhYnN0b3A+dGVsX251bWJlckJveDwvdGFic3RvcD4KKyAgPHRhYnN0b3A+dGVsX2hvbGRDYWxsQnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD50ZWxfc3RhcnRFbmRCdXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPnNtc19tZXNzYWdlQm94PC90YWJzdG9wPgorICA8dGFic3RvcD5zbXNfc2VuZEJ1dHRvbjwvdGFic3RvcD4KKyA8L3RhYnN0b3BzPgorIDxyZXNvdXJjZXM+CisgIDxpbmNsdWRlIGxvY2F0aW9uPSIuLi9yZXNvdXJjZXMucXJjIi8+CisgPC9yZXNvdXJjZXM+CisgPGNvbm5lY3Rpb25zLz4KKzwvdWk+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy92aXJ0dWFsLXNlbnNvcnMtcGFnZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy92aXJ0dWFsLXNlbnNvcnMtcGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjNWFmNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLmNwcApAQCAtMCwwICsxLDUwMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy92aXJ0dWFsLXNlbnNvcnMtcGFnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9zZW5zb3JzX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRvci13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LXNlbnNvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21ldHJpY3MvUGVyaW9kaWNSZXBvcnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9wcm90by9zdHVkaW9fc3RhdHMucGIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vdWkuaCIKKworCisjaW5jbHVkZSA8UURlc2t0b3BTZXJ2aWNlcz4KKyNpbmNsdWRlIDxRUXVhdGVybmlvbj4KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK1ZpcnR1YWxTZW5zb3JzUGFnZTo6VmlydHVhbFNlbnNvcnNQYWdlKFFXaWRnZXQqIHBhcmVudCkgOgorICAgIFFXaWRnZXQocGFyZW50KSwKKyAgICBtVWkobmV3IFVpOjpWaXJ0dWFsU2Vuc29yc1BhZ2UoKSksCisgICAgbVNlbnNvcnNBZ2VudChudWxscHRyKQoreworICAgIG1VaS0+c2V0dXBVaSh0aGlzKTsKKyAgICBtVWktPnRlbXBlcmF0dXJlU2Vuc29yVmFsdWVXaWRnZXQtPnNldFJhbmdlKC0yNzMuMSwgMTAwLjApOworICAgIG1VaS0+dGVtcGVyYXR1cmVTZW5zb3JWYWx1ZVdpZGdldC0+c2V0VmFsdWUoMjUuMCk7CisgICAgbVVpLT5saWdodFNlbnNvclZhbHVlV2lkZ2V0LT5zZXRSYW5nZSgwLCA0MDAwMC4wKTsKKyAgICBtVWktPmxpZ2h0U2Vuc29yVmFsdWVXaWRnZXQtPnNldFZhbHVlKDIwMDAwLjApOworICAgIG1VaS0+cHJlc3N1cmVTZW5zb3JWYWx1ZVdpZGdldC0+c2V0UmFuZ2UoMzAwLCAxMTAwKTsKKyAgICBtVWktPnByZXNzdXJlU2Vuc29yVmFsdWVXaWRnZXQtPnNldFZhbHVlKDEwMTMuMjUpOworICAgIG1VaS0+aHVtaWRpdHlTZW5zb3JWYWx1ZVdpZGdldC0+c2V0UmFuZ2UoMCwgMTAwKTsKKyAgICBtVWktPmh1bWlkaXR5U2Vuc29yVmFsdWVXaWRnZXQtPnNldFZhbHVlKDUwKTsKKyAgICBtVWktPnByb3hpbWl0eVNlbnNvclZhbHVlV2lkZ2V0LT5zZXRSYW5nZSgwLCAxMCk7CisgICAgbVVpLT5wcm94aW1pdHlTZW5zb3JWYWx1ZVdpZGdldC0+c2V0VmFsdWUoMTApOworICAgIG1VaS0+bWFnTm9ydGhXaWRnZXQtPnNldExvY2FsZShRTG9jYWxlOjpjKCkpOworICAgIG1VaS0+bWFnRWFzdFdpZGdldC0+c2V0TG9jYWxlKFFMb2NhbGU6OmMoKSk7CisgICAgbVVpLT5tYWdWZXJ0aWNhbFdpZGdldC0+c2V0TG9jYWxlKFFMb2NhbGU6OmMoKSk7CisKKyAgICB1cGRhdGVBY2NlbGVyb21ldGVyVmFsdWVzKCk7CisKKyAgICBjb25uZWN0KG1VaS0+bWFnTm9ydGhXaWRnZXQsCisgICAgICAgICAgICBTSUdOQUwoZWRpdGluZ0ZpbmlzaGVkKCkpLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1Qob25NYWdWZWN0b3JDaGFuZ2VkKCkpKTsKKyAgICBjb25uZWN0KG1VaS0+bWFnRWFzdFdpZGdldCwKKyAgICAgICAgICAgIFNJR05BTChlZGl0aW5nRmluaXNoZWQoKSksCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgU0xPVChvbk1hZ1ZlY3RvckNoYW5nZWQoKSkpOworICAgIGNvbm5lY3QobVVpLT5tYWdWZXJ0aWNhbFdpZGdldCwKKyAgICAgICAgICAgIFNJR05BTChlZGl0aW5nRmluaXNoZWQoKSksCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgU0xPVChvbk1hZ1ZlY3RvckNoYW5nZWQoKSkpOworICAgIGNvbm5lY3QobVVpLT5hY2NlbFdpZGdldCwKKyAgICAgICAgICAgIFNJR05BTChyb3RhdGlvbkNoYW5nZWQoKSksCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgU0xPVChvblBob25lUm90YXRpb25DaGFuZ2VkKCkpKTsKKyAgICBjb25uZWN0KG1VaS0+YWNjZWxXaWRnZXQsCisgICAgICAgICAgICBTSUdOQUwocG9zaXRpb25DaGFuZ2VkKCkpLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1Qob25QaG9uZVBvc2l0aW9uQ2hhbmdlZCgpKSk7CisgICAgY29ubmVjdChtVWktPmFjY2VsV2lkZ2V0LAorICAgICAgICAgICAgU0lHTkFMKGRyYWdTdG9wcGVkKCkpLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1Qob25EcmFnU3RvcHBlZCgpKSk7CisgICAgY29ubmVjdChtVWktPmFjY2VsV2lkZ2V0LAorICAgICAgICAgICAgU0lHTkFMKGRyYWdTdGFydGVkKCkpLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1Qob25EcmFnU3RhcnRlZCgpKSk7CisgICAgY29ubmVjdChtVWktPnBvc2l0aW9uWFNsaWRlciwKKyAgICAgICAgICAgIFNJR05BTChzbGlkZXJQcmVzc2VkKCkpLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIFNMT1Qob25EcmFnU3RhcnRlZCgpKSk7CisgICAgY29ubmVjdChtVWktPnBvc2l0aW9uWFNsaWRlciwKKyAgICAgICAgICAgIFNJR05BTChzbGlkZXJSZWxlYXNlZCgpKSwKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBTTE9UKG9uRHJhZ1N0b3BwZWQoKSkpOworICAgIGNvbm5lY3QobVVpLT5wb3NpdGlvbllTbGlkZXIsCisgICAgICAgICAgICBTSUdOQUwoc2xpZGVyUHJlc3NlZCgpKSwKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICBTTE9UKG9uRHJhZ1N0YXJ0ZWQoKSkpOworICAgIGNvbm5lY3QobVVpLT5wb3NpdGlvbllTbGlkZXIsCisgICAgICAgICAgICBTSUdOQUwoc2xpZGVyUmVsZWFzZWQoKSksCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgU0xPVChvbkRyYWdTdG9wcGVkKCkpKTsKKworICAgIGNvbm5lY3QodGhpcywgJlZpcnR1YWxTZW5zb3JzUGFnZTo6dXBkYXRlUmVzdWx0aW5nVmFsdWVzUmVxdWlyZWQsCisgICAgICAgICAgICB0aGlzLCAmVmlydHVhbFNlbnNvcnNQYWdlOjp1cGRhdGVSZXN1bHRpbmdWYWx1ZXMpOworCisKKyAgICBjb25uZWN0KCZtQWNjZWxlcmF0aW9uVGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVMaW5lYXJBY2NlbGVyYXRpb24oKSkpOworICAgIG1BY2NlbGVyYXRpb25UaW1lci5zZXRJbnRlcnZhbCgxMDApOworICAgIG1BY2NlbGVyYXRpb25UaW1lci5zdG9wKCk7CisKKyAgICBtVWktPnlhd1NsaWRlci0+c2V0UmFuZ2UoLTE4MC4wLCAxODAuMCk7CisgICAgbVVpLT5waXRjaFNsaWRlci0+c2V0UmFuZ2UoLTE4MC4wLCAxODAuMCk7CisgICAgbVVpLT5yb2xsU2xpZGVyLT5zZXRSYW5nZSgtMTgwLjAsIDE4MC4wKTsKKyAgICBtVWktPnBvc2l0aW9uWFNsaWRlci0+c2V0UmFuZ2UoQWNjZWxlcm9tZXRlcjNEV2lkZ2V0OjpNaW5YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6Ok1heFgpOworICAgIG1VaS0+cG9zaXRpb25ZU2xpZGVyLT5zZXRSYW5nZShBY2NlbGVyb21ldGVyM0RXaWRnZXQ6Ok1pblksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VsZXJvbWV0ZXIzRFdpZGdldDo6TWF4WSk7CisgICAgLy8gSGlzdG9yaWNhbGx5LCB0aGUgQVZEIHN0YXJ0cyB1cCB3aXRoIHRoZSBzY3JlZW4gbW9zdGx5CisgICAgLy8gdmVydGljYWwsIGJ1dCB0aWx0ZWQgYmFjayA0Ljc1IGRlZ3JlZXMuIFJldGFpbiB0aGF0CisgICAgLy8gaW5pdGlhbCBvcmllbnRhdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIGRvIHRoaXMgYWZ0ZXIgd2UgY2FsbCBzZXRSYW5nZSBzaW5jZSBzZXRSYW5nZSB3aWxsIHRyaWdnZXIKKyAgICAvLyBvbl8qU2xpZGVyX3ZhbHVlQ2hhbmdlZCB3aGljaCBqdXN0IHRyaWdnZXIgc2V0Um90YXRpb24gZnJvbSBkZWZhdWx0CisgICAgLy8gdmFsdWUgb2YgU2xpZGVycy4KKyAgICBzdGF0aWMgY29uc3QgUVF1YXRlcm5pb24gaW5pdGlhbFF1YXQgPQorICAgICAgICAgICAgUVF1YXRlcm5pb246OmZyb21FdWxlckFuZ2xlcygtNC43NSwgMC4wMCwgMC4wMCk7CisgICAgbVVpLT5hY2NlbFdpZGdldC0+c2V0Um90YXRpb24oaW5pdGlhbFF1YXQpOworICAgIG9uUGhvbmVSb3RhdGlvbkNoYW5nZWQoKTsKKworICAgIHVzaW5nIGFuZHJvaWQ6Om1ldHJpY3M6OlBlcmlvZGljUmVwb3J0ZXI7CisgICAgbU1ldHJpY3NSZXBvcnRpbmdUb2tlbiA9IFBlcmlvZGljUmVwb3J0ZXI6OmdldCgpLmFkZENhbmNlbGFibGVUYXNrKAorICAgICAgICAgICAgNjAgKiAxMCAqIDEwMDAsICAvLyByZXBvcnRpbmcgcGVyaW9kCisgICAgICAgICAgICBbdGhpc10oYW5kcm9pZF9zdHVkaW86OkFuZHJvaWRTdHVkaW9FdmVudCogZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAobVZpcnR1YWxTZW5zb3JzVXNlZCkgeworICAgICAgICAgICAgICAgICAgICBldmVudC0+bXV0YWJsZV9lbXVsYXRvcl9kZXRhaWxzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm11dGFibGVfdXNlZF9mZWF0dXJlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5zZXRfc2Vuc29ycyh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbU1ldHJpY3NSZXBvcnRpbmdUb2tlbi5yZXNldCgpOyAgLy8gUmVwb3J0IGl0IG9ubHkgb25jZS4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9KTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6OnNob3dFdmVudChRU2hvd0V2ZW50KikgeworICByZXNldEFjY2VsZXJvbWV0ZXJSb3RhdGlvbkZyb21Ta2luTGF5b3V0KAorICAgICAgc2tpbl91aV9nZXRfY3VycmVudF9sYXlvdXQoZW11bGF0b3Jfd2luZG93X2dldCgpLT51aSkpOworICBtRmlyc3RTaG93ID0gZmFsc2U7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpzZXRMYXlvdXRDaGFuZ2VOb3RpZmllcigKKyAgICAgICAgUU9iamVjdCogbGF5b3V0X2NoYW5nZV9ub3RpZmllcikgeworICAgIGNvbm5lY3QobGF5b3V0X2NoYW5nZV9ub3RpZmllciwgU0lHTkFMKGxheW91dENoYW5nZWQoYm9vbCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVChvblNraW5MYXlvdXRDaGFuZ2UoYm9vbCkpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uU2tpbkxheW91dENoYW5nZShib29sIG5leHQpIHsKKyAgICBjb25zdCBTa2luVUkqIHVpID0gZW11bGF0b3Jfd2luZG93X2dldCgpLT51aTsKKyAgICBpZiAodWkpIHsKKyAgICAgICAgY29uc3QgU2tpbkxheW91dCogbGF5b3V0ID0KKyAgICAgICAgICAgIChuZXh0ID8gc2tpbl91aV9nZXRfbmV4dF9sYXlvdXQgOiBza2luX3VpX2dldF9wcmV2X2xheW91dCkodWkpOworICAgICAgICByZXNldEFjY2VsZXJvbWV0ZXJSb3RhdGlvbkZyb21Ta2luTGF5b3V0KGxheW91dCk7CisgICAgfQorfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6cmVzZXRBY2NlbGVyb21ldGVyUm90YXRpb25Gcm9tU2tpbkxheW91dCgKKyAgICAgICAgY29uc3QgU2tpbkxheW91dCogbGF5b3V0KSB7CisgICAgaWYgKGxheW91dCkgeworICAgICAgICBmbG9hdCByb3QgPSAwLjA7CisKKyAgICAgICAgLy8gTk9URTogdGhlICJpbmNvcnJlY3QiIGFuZ2xlIHZhbHVlcworICAgICAgICAvLyBzdGVtIGZyb20gdGhlIGZhY3QgdGhhdCBRUXVhdGVybmlvbiBhbmQgU0tJTl9ST1RBVElPTl8qCisgICAgICAgIC8vIGRpc2FncmVlIG9uIHdoaWNoIGRpcmVjdGlvbiBpcyAicG9zaXRpdmUiIChza2luIHVzZXMKKyAgICAgICAgLy8gYSBkaWZmZXJlbnQgY29vcmRpbmF0ZSBzeXN0ZW0gd2l0aCBvcmlnaW4gYXQgdG9wIGxlZnQKKyAgICAgICAgLy8gYW5kIFggYW5kIFkgYXhpcyBwb2ludGluZyByaWdodCBhbmQgZG93biByZXNwZWN0aXZlbHkpLgorICAgICAgICBzd2l0Y2ggKGxheW91dC0+b3JpZW50YXRpb24pIHsKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzA6CisgICAgICAgICAgICByb3QgPSAwLjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzkwOgorICAgICAgICAgICAgcm90ID0gLTkwLjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIHJvdCA9IDE4MC4wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8yNzA6CisgICAgICAgICAgICByb3QgPSA5MC4wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzZXRBY2NlbGVyb21ldGVyUm90YXRpb24oCisgICAgICAgICAgICAgICAgUVF1YXRlcm5pb246OmZyb21BeGlzQW5kQW5nbGUoCisgICAgICAgICAgICAgICAgICAgIDAuMCwgMC4wLCAxLjAsIHJvdCkpOworICAgIH0KK30KK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpyZXNldEFjY2VsZXJvbWV0ZXJSb3RhdGlvbihjb25zdCBRUXVhdGVybmlvbiYgcm90YXRpb24pIHsKKyAgICBpZiAoIW1GaXJzdFNob3cpIG1WaXJ0dWFsU2Vuc29yc1VzZWQgPSB0cnVlOworICAgIG1VaS0+YWNjZWxXaWRnZXQtPnNldFBvc2l0aW9uKFFWZWN0b3IyRCgwLjAsIDAuMCkpOworICAgIG1VaS0+YWNjZWxXaWRnZXQtPnNldFJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBtVWktPmFjY2VsV2lkZ2V0LT5yZW5kZXJGcmFtZSgpOworICAgIG9uUGhvbmVSb3RhdGlvbkNoYW5nZWQoKTsKKyAgICBvblBob25lUG9zaXRpb25DaGFuZ2VkKCk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9yb3RhdGVUb1BvcnRyYWl0X2NsaWNrZWQoKSB7CisgICAgcmVzZXRBY2NlbGVyb21ldGVyUm90YXRpb24oUVF1YXRlcm5pb24oKSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9yb3RhdGVUb0xhbmRzY2FwZV9jbGlja2VkKCkgeworICAgIHJlc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKAorICAgICAgICBRUXVhdGVybmlvbjo6ZnJvbUF4aXNBbmRBbmdsZSgwLjAsIDAuMCwgMS4wLCA5MC4wKSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9yb3RhdGVUb1JldmVyc2VQb3J0cmFpdF9jbGlja2VkKCkgeworICAgIHJlc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uKAorICAgICAgICBRUXVhdGVybmlvbjo6ZnJvbUF4aXNBbmRBbmdsZSgwLjAsIDAuMCwgMS4wLCAxODAuMCkpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6b25fcm90YXRlVG9SZXZlcnNlTGFuZHNjYXBlX2NsaWNrZWQoKSB7CisgICAgcmVzZXRBY2NlbGVyb21ldGVyUm90YXRpb24oCisgICAgICAgIFFRdWF0ZXJuaW9uOjpmcm9tQXhpc0FuZEFuZ2xlKDAuMCwgMC4wLCAxLjAsIC05MC4wKSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpzZXRTZW5zb3JzQWdlbnQoY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIGFnZW50KSB7CisgICAgbVNlbnNvcnNBZ2VudCA9IGFnZW50OworCisgICAgLy8gVXBkYXRlIHRoZSBhZ2VudCB3aXRoIGN1cnJlbnQgdmFsdWVzLgorICAgIHVwZGF0ZUFjY2VsZXJvbWV0ZXJWYWx1ZXMoKTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uCitzdGF0aWMgdm9pZCBzZXRTZW5zb3JWYWx1ZSgKKyAgICAgICAgY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIGFnZW50LAorICAgICAgICBBbmRyb2lkU2Vuc29yIHNlbnNvcl9pZCwKKyAgICAgICAgZG91YmxlIHYxLAorICAgICAgICBkb3VibGUgdjIgPSAwLjAsCisgICAgICAgIGRvdWJsZSB2MyA9IDAuMCkgeworICBpZiAoYWdlbnQpIHsKKyAgICAgICAgYWdlbnQtPnNldFNlbnNvcihzZW5zb3JfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHYxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4odjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih2MykpOworICAgIH0KK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX3RlbXBlcmF0dXJlU2Vuc29yVmFsdWVXaWRnZXRfdmFsdWVDaGFuZ2VkKAorICAgICAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBpZiAoIW1GaXJzdFNob3cpIG1WaXJ0dWFsU2Vuc29yc1VzZWQgPSB0cnVlOworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsIEFORFJPSURfU0VOU09SX1RFTVBFUkFUVVJFLCB2YWx1ZSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9wcm94aW1pdHlTZW5zb3JWYWx1ZVdpZGdldF92YWx1ZUNoYW5nZWQoCisgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGlmICghbUZpcnN0U2hvdykgbVZpcnR1YWxTZW5zb3JzVXNlZCA9IHRydWU7CisgICAgc2V0U2Vuc29yVmFsdWUobVNlbnNvcnNBZ2VudCwgQU5EUk9JRF9TRU5TT1JfUFJPWElNSVRZLCB2YWx1ZSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9saWdodFNlbnNvclZhbHVlV2lkZ2V0X3ZhbHVlQ2hhbmdlZChkb3VibGUgdmFsdWUpIHsKKyAgICBpZiAoIW1GaXJzdFNob3cpIG1WaXJ0dWFsU2Vuc29yc1VzZWQgPSB0cnVlOworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsIEFORFJPSURfU0VOU09SX0xJR0hULCB2YWx1ZSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9wcmVzc3VyZVNlbnNvclZhbHVlV2lkZ2V0X3ZhbHVlQ2hhbmdlZCgKKyAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBpZiAoIW1GaXJzdFNob3cpIG1WaXJ0dWFsU2Vuc29yc1VzZWQgPSB0cnVlOworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsIEFORFJPSURfU0VOU09SX1BSRVNTVVJFLCB2YWx1ZSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9odW1pZGl0eVNlbnNvclZhbHVlV2lkZ2V0X3ZhbHVlQ2hhbmdlZCgKKyAgICBkb3VibGUgdmFsdWUpIHsKKyAgICBpZiAoIW1GaXJzdFNob3cpIG1WaXJ0dWFsU2Vuc29yc1VzZWQgPSB0cnVlOworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsIEFORFJPSURfU0VOU09SX0hVTUlESVRZLCB2YWx1ZSk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbk1hZ1ZlY3RvckNoYW5nZWQoKSB7CisgICAgdXBkYXRlQWNjZWxlcm9tZXRlclZhbHVlcygpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6b25QaG9uZVJvdGF0aW9uQ2hhbmdlZCgpIHsKKyAgICBjb25zdCBRUXVhdGVybmlvbiYgcm90YXRpb24gPSBtVWktPmFjY2VsV2lkZ2V0LT5yb3RhdGlvbigpOworICAgIC8vIENBVkVBVDogVGhlcmUgaXMgc29tZSBpbmNvbnNpc3RlbmN5IHJlbGF0ZWQgdG8gdGhlIHRlcm1zICJ5YXciLAorICAgIC8vICJwaXRjaCIgYW5kICJyb2xsIiBiZXR3ZWVuIHRoZSBRUXVhdGVybmlvbiBkb2NzIGFuZCBob3cKKyAgICAvLyB0aGVzZSB0ZXJtcyBhcmUgZGVmaW5lZCBpbiB0aGUgQW5kcm9pZCBkb2NzLgorICAgIC8vIEFjY29yZGluZyB0byBhbmRyb2lkIGRvY3M6CisgICAgLy8gV2hlbiB0aGUgZGV2aWNlIGxpZXMgZmxhdCwgc2NyZWVuLXVwLCB0aGUgWgorICAgIC8vIGF4aXMgY29tZXMgb3V0IG9mIHRoZSBzY3JlZW4sIHRoZSBZIGF4aXMgY29tZXMKKyAgICAvLyBvdXQgb2YgdGhlIHRvcCBhbmQgdGhlIFggYXhpcyBjb21lcyBvdXQgb2YgdGhlIHJpZ2h0IHNpZGUKKyAgICAvLyBvZiB0aGUgZGV2aWNlLiBUaGUgc2FtZSBjb29yZGluYXRlIHN5c3RlbSBpcyB1c2VkIGJ5IHRoZQorICAgIC8vIGFjY2VsZXJvbWV0ZXIgY29udHJvbCB3aWRnZXQuCisgICAgLy8gQW5kcm9pZCBkb2NzIGRlZmluZSAicm9sbCIgYXMgdGhlIHJvdGF0aW9uIGFyb3VuZCB0aGUgWSBheGlzLgorICAgIC8vIEhvd2V2ZXIsIFFRdWF0ZXJuaW9uIGRlZmluZXMgInJvbGwiIGFzIHRoZSByb3RhdGlvbiBhcm91bmQKKyAgICAvLyB0aGUgWiBheGlzLiBFc3NlbnRpYWxseSwgInlhdyIgYW5kICJyb2xsIiBhcmUgc3dpdGNoZWQuCisgICAgLy8gRm9yIGNvbnNpc3RlbmN5LCB3ZSBzdGljayB3aXRoIEFuZHJvaWQgZGVmaW5pdGlvbnMgb2YKKyAgICAvLyB5YXcsIHBpdGNoIGFuZCByb2xsLgorICAgIGZsb2F0IHgsIHksIHo7CisgICAgcm90YXRpb24uZ2V0RXVsZXJBbmdsZXMoJngsICZ5LCAmeik7CisgICAgbVVpLT55YXdTbGlkZXItPnNldFZhbHVlKHosIGZhbHNlKTsKKyAgICBtVWktPnBpdGNoU2xpZGVyLT5zZXRWYWx1ZSh4LCBmYWxzZSk7CisgICAgbVVpLT5yb2xsU2xpZGVyLT5zZXRWYWx1ZSh5LCBmYWxzZSk7CisgICAgdXBkYXRlQWNjZWxlcm9tZXRlclZhbHVlcygpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6c2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uRnJvbVNsaWRlcnMoKSB7CisgICAgLy8gV0FSTklORzogcmVhZCB0aGUgY29tbWVudCBpbiBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uUGhvbmVSb3RhdGlvbkNoYW5nZWQKKyAgICAvLyBiZWZvcmUgY2hhbmdpbmcgdGhlIG9yZGVyIG9mIHRoZXNlIGFyZ3VtZW50cyEhCisgICAgbVVpLT5hY2NlbFdpZGdldC0+c2V0Um90YXRpb24oCisgICAgICAgIFFRdWF0ZXJuaW9uOjpmcm9tRXVsZXJBbmdsZXMoCisgICAgICAgICAgICBtVWktPnBpdGNoU2xpZGVyLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgbVVpLT5yb2xsU2xpZGVyLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgbVVpLT55YXdTbGlkZXItPmdldFZhbHVlKCkpKTsKKyAgICB1cGRhdGVBY2NlbGVyb21ldGVyVmFsdWVzKCk7CisgICAgbVVpLT5hY2NlbFdpZGdldC0+cmVuZGVyRnJhbWUoKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX3lhd1NsaWRlcl92YWx1ZUNoYW5nZWQoZG91YmxlKSB7CisgICAgc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uRnJvbVNsaWRlcnMoKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX3BpdGNoU2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpIHsKKyAgICBzZXRBY2NlbGVyb21ldGVyUm90YXRpb25Gcm9tU2xpZGVycygpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6b25fcm9sbFNsaWRlcl92YWx1ZUNoYW5nZWQoZG91YmxlKSB7CisgICAgc2V0QWNjZWxlcm9tZXRlclJvdGF0aW9uRnJvbVNsaWRlcnMoKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6OnNldFBob25lUG9zaXRpb25Gcm9tU2xpZGVycygpIHsKKyAgICBtQ3VycmVudFBvc2l0aW9uID0gUVZlY3RvcjNEKG1VaS0+cG9zaXRpb25YU2xpZGVyLT5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpLT5wb3NpdGlvbllTbGlkZXItPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjApOworICAgIG1VaS0+YWNjZWxXaWRnZXQtPnNldFBvc2l0aW9uKG1DdXJyZW50UG9zaXRpb24udG9WZWN0b3IyRCgpKTsKKyAgICBtVWktPmFjY2VsV2lkZ2V0LT5yZW5kZXJGcmFtZSgpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6b25fcG9zaXRpb25YU2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpIHsKKyAgICBzZXRQaG9uZVBvc2l0aW9uRnJvbVNsaWRlcnMoKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX3Bvc2l0aW9uWVNsaWRlcl92YWx1ZUNoYW5nZWQoZG91YmxlKSB7CisgICAgc2V0UGhvbmVQb3NpdGlvbkZyb21TbGlkZXJzKCk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjp1cGRhdGVBY2NlbGVyb21ldGVyVmFsdWVzKCkgeworICAgIGlmICghbUZpcnN0U2hvdykgbVZpcnR1YWxTZW5zb3JzVXNlZCA9IHRydWU7CisgICAgLy8gR3Jhdml0eSBhbmQgbWFnbmV0aWMgdmVjdG9yIGluIHRoZSBkZXZpY2UncyBmcmFtZSBvZgorICAgIC8vIHJlZmVyZW5jZS4KKyAgICBRVmVjdG9yM0QgZ3Jhdml0eV92ZWN0b3IoMC4wLCA5LjgxLCAwLjApOworICAgIFFWZWN0b3IzRCBtYWduZXRpY192ZWN0b3IoCisgICAgICAgICAgICBtVWktPm1hZ05vcnRoV2lkZ2V0LT52YWx1ZSgpLAorICAgICAgICAgICAgbVVpLT5tYWdFYXN0V2lkZ2V0LT52YWx1ZSgpLAorICAgICAgICAgICAgbVVpLT5tYWdWZXJ0aWNhbFdpZGdldC0+dmFsdWUoKSk7CisKKyAgICBRUXVhdGVybmlvbiBkZXZpY2Vfcm90YXRpb25fcXVhdCA9IG1VaS0+YWNjZWxXaWRnZXQtPnJvdGF0aW9uKCk7CisKKyAgICAvLyBHcmF2aXR5IGFuZCBtYWduZXRpYyB2ZWN0b3JzIGFzIG9ic2VydmVkIGJ5IHRoZSBkZXZpY2UuCisgICAgLy8gTm90ZSBob3cgd2UncmUgYXBwbHlpbmcgdGhlICppbnZlcnNlKiBvZiB0aGUgdHJhbnNmb3JtYXRpb24KKyAgICAvLyByZXByZXNlbnRlZCBieSBkZXZpY2Vfcm90YXRpb25fcXVhdCB0byB0aGUgImFic29sdXRlIiBjb29yZGluYXRlcworICAgIC8vIG9mIHRoZSB2ZWN0b3JzLgorICAgIFFWZWN0b3IzRCBkZXZpY2VfZ3Jhdml0eV92ZWN0b3IgPQorICAgICAgICBkZXZpY2Vfcm90YXRpb25fcXVhdC5jb25qdWdhdGUoKS5yb3RhdGVkVmVjdG9yKGdyYXZpdHlfdmVjdG9yKTsKKyAgICBRVmVjdG9yM0QgZGV2aWNlX21hZ25ldGljX3ZlY3RvciA9CisgICAgICAgIGRldmljZV9yb3RhdGlvbl9xdWF0LmNvbmp1Z2F0ZSgpLnJvdGF0ZWRWZWN0b3IobWFnbmV0aWNfdmVjdG9yKTsKKyAgICBRVmVjdG9yM0QgYWNjZWxlcmF0aW9uID0gZGV2aWNlX2dyYXZpdHlfdmVjdG9yIC0gbUxpbmVhckFjY2VsZXJhdGlvbjsKKworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsCisgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQUNDRUxFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbi54KCksCisgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uLnkoKSwKKyAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24ueigpKTsKKworICAgIHNldFNlbnNvclZhbHVlKG1TZW5zb3JzQWdlbnQsCisgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTUFHTkVUSUNfRklFTEQsCisgICAgICAgICAgICAgICAgICAgZGV2aWNlX21hZ25ldGljX3ZlY3Rvci54KCksCisgICAgICAgICAgICAgICAgICAgZGV2aWNlX21hZ25ldGljX3ZlY3Rvci55KCksCisgICAgICAgICAgICAgICAgICAgZGV2aWNlX21hZ25ldGljX3ZlY3Rvci56KCkpOworCisgICAgLy8gVXBkYXRlIHRoZSAicm90YXRpb24iIGxhYmVsIGFjY29yZGluZyB0byB0aGUgc2ltdWxhdGVkIGdyYXZpdHkgdmVjdG9yLgorICAgIFFWZWN0b3IzRCBub3JtYWxpemVkX2dyYXZpdHkgPSBkZXZpY2VfZ3Jhdml0eV92ZWN0b3Iubm9ybWFsaXplZCgpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OmFycmF5PHN0ZDo6cGFpcjxRVmVjdG9yM0QsIFNraW5Sb3RhdGlvbj4sIDQ+IGRpcmVjdGlvbnMgeworICAgICAgc3RkOjptYWtlX3BhaXIoUVZlY3RvcjNEKDAsIDEsIDApLCBTS0lOX1JPVEFUSU9OXzApLAorICAgICAgc3RkOjptYWtlX3BhaXIoUVZlY3RvcjNEKC0xLCAwLCAwKSwgU0tJTl9ST1RBVElPTl85MCksCisgICAgICBzdGQ6Om1ha2VfcGFpcihRVmVjdG9yM0QoMCwgLTEsIDApLCBTS0lOX1JPVEFUSU9OXzE4MCksCisgICAgICBzdGQ6Om1ha2VfcGFpcihRVmVjdG9yM0QoMSwgMCwgMCksIFNLSU5fUk9UQVRJT05fMjcwKQorICAgIH07CisKKyAgICBRU3RyaW5nIHJvdGF0aW9uX2xhYmVsOworICAgIFNraW5Sb3RhdGlvbiBjb2Fyc2Vfb3JpZW50YXRpb24gPSBtQ29hcnNlT3JpZW50YXRpb247CisgICAgZm9yIChjb25zdCBhdXRvJiB2IDogZGlyZWN0aW9ucykgeworICAgICAgaWYgKGZhYnMoUVZlY3RvcjNEOjpkb3RQcm9kdWN0KG5vcm1hbGl6ZWRfZ3Jhdml0eSwgdi5maXJzdCkgLSAxLjApIDwgMC4xKSB7CisgICAgICAgIGNvYXJzZV9vcmllbnRhdGlvbiA9IHYuc2Vjb25kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29hcnNlX29yaWVudGF0aW9uICE9IG1Db2Fyc2VPcmllbnRhdGlvbikgeworICAgICAgbUNvYXJzZU9yaWVudGF0aW9uID0gY29hcnNlX29yaWVudGF0aW9uOworICAgICAgZW1pdChjb2Fyc2VPcmllbnRhdGlvbkNoYW5nZWQobUNvYXJzZU9yaWVudGF0aW9uKSk7CisgICAgfQorCisgICAgLy8gRW1pdCBhIHNpZ25hbCB0byB1cGRhdGUgdGhlIFVJLiBXZSBjYW5ub3QganVzdCB1cGRhdGUKKyAgICAvLyB0aGUgVUkgaGVyZSBiZWNhdXNlIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzIHNvbWV0aW1lcworICAgIC8vIGNhbGxlZCBmcm9tIGEgbm9uLVF0IHRocmVhZC4KKyAgICBlbWl0IHVwZGF0ZVJlc3VsdGluZ1ZhbHVlc1JlcXVpcmVkKGFjY2VsZXJhdGlvbiwgZGV2aWNlX21hZ25ldGljX3ZlY3Rvcik7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjp1cGRhdGVSZXN1bHRpbmdWYWx1ZXMoUVZlY3RvcjNEIGFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVZlY3RvcjNEIGRldmljZV9tYWduZXRpY192ZWN0b3IpIHsKKworICAgIHN0YXRpYyBjb25zdCBRU3RyaW5nIHJvdGF0aW9uX2xhYmVsc1tdID0geworICAgICAgICAiUk9UQVRJT05fMCIsCisgICAgICAgICJST1RBVElPTl85MCIsCisgICAgICAgICJST1RBVElPTl8xODAiLAorICAgICAgICAiUk9UQVRJT05fMjcwIgorICAgIH07CisKKyAgICAvLyBVcGRhdGUgbGFiZWxzIHdpdGggbmV3IHZhbHVlcy4KKyAgICBRU3RyaW5nIHRhYmxlX2h0bWw7CisgICAgUVRleHRTdHJlYW0gdGFibGVfaHRtbF9zdHJlYW0oJnRhYmxlX2h0bWwpOworICAgIHRhYmxlX2h0bWxfc3RyZWFtLnNldFJlYWxOdW1iZXJQcmVjaXNpb24oMik7CisgICAgdGFibGVfaHRtbF9zdHJlYW0uc2V0TnVtYmVyRmxhZ3ModGFibGVfaHRtbF9zdHJlYW0ubnVtYmVyRmxhZ3MoKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVRleHRTdHJlYW06OkZvcmNlUG9pbnQpOworICAgIHRhYmxlX2h0bWxfc3RyZWFtLnNldFJlYWxOdW1iZXJOb3RhdGlvbihRVGV4dFN0cmVhbTo6Rml4ZWROb3RhdGlvbik7CisgICAgdGFibGVfaHRtbF9zdHJlYW0KKyAgICAgICAgPDwgIjx0YWJsZSBib3JkZXI9XCIwXCIiCisgICAgICAgIDw8ICIgICAgICAgY2VsbHBhZGRpbmc9XCIzXCIgc3R5bGU9XCJmb250LXNpemU6OHB0XCI+IgorICAgICAgICA8PCAiPHRyPiIKKyAgICAgICAgPDwgIjx0ZD4iIDw8IHRyKCJBY2NlbGVyb21ldGVyIChtL3M8c3VwPjI8L3N1cD4pIikgPDwgIjo8L3RkPiIKKyAgICAgICAgPDwgIjx0ZCBhbGlnbj1sZWZ0PiIgPDwgYWNjZWxlcmF0aW9uLngoKSA8PCAiPC90ZD4iCisgICAgICAgIDw8ICI8dGQgYWxpZ249bGVmdD4iIDw8IGFjY2VsZXJhdGlvbi55KCkgPDwgIjwvdGQ+IgorICAgICAgICA8PCAiPHRkIGFsaWduPWxlZnQ+IiA8PCBhY2NlbGVyYXRpb24ueigpIDw8ICI8L3RkPjwvdHI+IgorICAgICAgICA8PCAiPHRyPiIKKyAgICAgICAgPDwgIjx0ZD4iIDw8IHRyKCJNYWduZXRvbWV0ZXIgKCZtdTtUKSIpIDw8ICI6PC90ZD4iCisgICAgICAgIDw8ICI8dGQgYWxpZ249bGVmdD4iIDw8IGRldmljZV9tYWduZXRpY192ZWN0b3IueCgpIDw8ICI8L3RkPiIKKyAgICAgICAgPDwgIjx0ZCBhbGlnbj1sZWZ0PiIgPDwgZGV2aWNlX21hZ25ldGljX3ZlY3Rvci55KCkgPDwgIjwvdGQ+IgorICAgICAgICA8PCAiPHRkIGFsaWduPWxlZnQ+IiA8PCBkZXZpY2VfbWFnbmV0aWNfdmVjdG9yLnooKSA8PCAiPC90ZD48L3RyPiIKKyAgICAgICAgPDwgIjx0cj48dGQ+IiA8PCB0cigiUm90YXRpb24iKQorICAgICAgICA8PCAiOjwvdGQ+PHRkIGNvbHNwYW4gPSBcIjNcIiBhbGlnbj1sZWZ0PiIKKyAgICAgICAgPDwgcm90YXRpb25fbGFiZWxzW21Db2Fyc2VPcmllbnRhdGlvbiAtIFNLSU5fUk9UQVRJT05fMF0KKyAgICAgICAgPDwgIjwvdGQ+PC90cj4iCisgICAgICAgIDw8ICI8L3RhYmxlPiI7CisgICAgbVVpLT5yZXN1bHRpbmdBY2NlbGVyb21ldGVyVmFsdWVzLT5zZXRUZXh0KHRhYmxlX2h0bWwpOworfQorCit2b2lkIFZpcnR1YWxTZW5zb3JzUGFnZTo6b25QaG9uZVBvc2l0aW9uQ2hhbmdlZCgpIHsKKyAgICBjb25zdCBRVmVjdG9yMkQmIHBvcyA9IG1VaS0+YWNjZWxXaWRnZXQtPnBvc2l0aW9uKCk7CisgICAgbUN1cnJlbnRQb3NpdGlvbiA9IFFWZWN0b3IzRChwb3MueCgpLCBwb3MueSgpLCAwLjApOworICAgIG1VaS0+cG9zaXRpb25YU2xpZGVyLT5zZXRWYWx1ZShwb3MueCgpLCBmYWxzZSk7CisgICAgbVVpLT5wb3NpdGlvbllTbGlkZXItPnNldFZhbHVlKHBvcy55KCksIGZhbHNlKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6OnVwZGF0ZUxpbmVhckFjY2VsZXJhdGlvbigpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgayA9IDEwMC4wOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtYXNzID0gMS4wOworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtZXRlcnNfcGVyX3VuaXQgPSAwLjAyNTQ7CisKKyAgICBRVmVjdG9yM0QgZGVsdGEgPQorICAgICAgICBtVWktPmFjY2VsV2lkZ2V0LT5yb3RhdGlvbigpLmNvbmp1Z2F0ZSgpLnJvdGF0ZWRWZWN0b3IoCisgICAgICAgICAgICBtZXRlcnNfcGVyX3VuaXQgKiAobUN1cnJlbnRQb3NpdGlvbiAtIG1QcmV2UG9zaXRpb24pKTsKKyAgICBtTGluZWFyQWNjZWxlcmF0aW9uID0gZGVsdGEgKiBrIC8gbWFzczsKKyAgICBtUHJldlBvc2l0aW9uID0gbUN1cnJlbnRQb3NpdGlvbjsKKyAgICB1cGRhdGVBY2NlbGVyb21ldGVyVmFsdWVzKCk7Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9hY2NlbE1vZGVSb3RhdGVfdG9nZ2xlZCgpIHsKKyAgICBpZiAobVVpLT5hY2NlbE1vZGVSb3RhdGUtPmlzQ2hlY2tlZCgpKSB7CisgICAgICAgIG1VaS0+YWNjZWxXaWRnZXQtPnNldE9wZXJhdGlvbk1vZGUoCisgICAgICAgICAgICBBY2NlbGVyb21ldGVyM0RXaWRnZXQ6Ok9wZXJhdGlvbk1vZGU6OlJvdGF0ZSk7CisgICAgICAgIG1VaS0+YWNjZWxlcm9tZXRlclNsaWRlcnMtPnNldEN1cnJlbnRJbmRleCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9hY2NlbE1vZGVNb3ZlX3RvZ2dsZWQoKSB7CisgICAgaWYgKG1VaS0+YWNjZWxNb2RlTW92ZS0+aXNDaGVja2VkKCkpIHsKKyAgICAgICAgbVVpLT5hY2NlbFdpZGdldC0+c2V0T3BlcmF0aW9uTW9kZSgKKyAgICAgICAgICAgIEFjY2VsZXJvbWV0ZXIzRFdpZGdldDo6T3BlcmF0aW9uTW9kZTo6TW92ZSk7CisgICAgICAgIG1VaS0+YWNjZWxlcm9tZXRlclNsaWRlcnMtPnNldEN1cnJlbnRJbmRleCgxKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlydHVhbFNlbnNvcnNQYWdlOjpvbl9oZWxwTWFnbmV0aWNGaWVsZF9jbGlja2VkKCkgeworICAgIFFEZXNrdG9wU2VydmljZXM6Om9wZW5VcmwoUVVybDo6ZnJvbUVuY29kZWQoCisgICAgICAgICAgICAiaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yLmh0bWwjVFlQRV9NQUdORVRJQ19GSUVMRCIpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX2hlbHBMaWdodF9jbGlja2VkKCkgeworICAgIFFEZXNrdG9wU2VydmljZXM6Om9wZW5VcmwoUVVybDo6ZnJvbUVuY29kZWQoCisgICAgICAgICAgICAiaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yLmh0bWwjVFlQRV9MSUdIVCIpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX2hlbHBQcmVzc3VyZV9jbGlja2VkKCkgeworICAgIFFEZXNrdG9wU2VydmljZXM6Om9wZW5VcmwoUVVybDo6ZnJvbUVuY29kZWQoCisgICAgICAgICAgICAiaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvU2Vuc29yLmh0bWwjVFlQRV9QUkVTU1VSRSIpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX2hlbHBBbWJpZW50VGVtcF9jbGlja2VkKCkgeworICBRRGVza3RvcFNlcnZpY2VzOjpvcGVuVXJsKFFVcmw6OmZyb21FbmNvZGVkKAorICAgICAgICAgICAgImh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvci5odG1sI1RZUEVfQU1CSUVOVF9URU1QRVJBVFVSRSIpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX2hlbHBQcm94aW1pdHlfY2xpY2tlZCgpIHsKKyAgUURlc2t0b3BTZXJ2aWNlczo6b3BlblVybChRVXJsOjpmcm9tRW5jb2RlZCgKKyAgICAgICAgICAgICJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9TZW5zb3IuaHRtbCNUWVBFX1BST1hJTUlUWSIpKTsKK30KKwordm9pZCBWaXJ0dWFsU2Vuc29yc1BhZ2U6Om9uX2hlbHBIdW1pZGl0eV9jbGlja2VkKCkgeworICBRRGVza3RvcFNlcnZpY2VzOjpvcGVuVXJsKFFVcmw6OmZyb21FbmNvZGVkKAorICAgICAgICAgICAgImh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvci5odG1sI1RZUEVfUkVMQVRJVkVfSFVNSURJVFkiKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy92aXJ0dWFsLXNlbnNvcnMtcGFnZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdmlydHVhbC1zZW5zb3JzLXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNkZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdmlydHVhbC1zZW5zb3JzLXBhZ2UuaApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ1aV92aXJ0dWFsLXNlbnNvcnMtcGFnZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9tZXRyaWNzL1BlcmlvZGljUmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZWN0LmgiCisKKyNpbmNsdWRlIDxRRG91YmxlVmFsaWRhdG9yPgorI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorCisjaW5jbHVkZSA8bWVtb3J5PgorCitzdHJ1Y3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQ7CitjbGFzcyBWaXJ0dWFsU2Vuc29yc1BhZ2UgOiBwdWJsaWMgUVdpZGdldAoreworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBWaXJ0dWFsU2Vuc29yc1BhZ2UoUVdpZGdldCogcGFyZW50ID0gMCk7CisKKyAgICB2b2lkIHNldFNlbnNvcnNBZ2VudChjb25zdCBRQW5kcm9pZFNlbnNvcnNBZ2VudCogYWdlbnQpOworICAgIHZvaWQgc2V0TGF5b3V0Q2hhbmdlTm90aWZpZXIoUU9iamVjdCogbGF5b3V0X2NoYW5nZV9ub3RpZmllcik7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBvbl90ZW1wZXJhdHVyZVNlbnNvclZhbHVlV2lkZ2V0X3ZhbHVlQ2hhbmdlZChkb3VibGUgdmFsdWUpOworICAgIHZvaWQgb25fcHJveGltaXR5U2Vuc29yVmFsdWVXaWRnZXRfdmFsdWVDaGFuZ2VkKGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBvbl9saWdodFNlbnNvclZhbHVlV2lkZ2V0X3ZhbHVlQ2hhbmdlZChkb3VibGUgdmFsdWUpOworICAgIHZvaWQgb25fcHJlc3N1cmVTZW5zb3JWYWx1ZVdpZGdldF92YWx1ZUNoYW5nZWQoZG91YmxlIHZhbHVlKTsKKyAgICB2b2lkIG9uX2h1bWlkaXR5U2Vuc29yVmFsdWVXaWRnZXRfdmFsdWVDaGFuZ2VkKGRvdWJsZSB2YWx1ZSk7CisgICAgdm9pZCBvbl9hY2NlbE1vZGVSb3RhdGVfdG9nZ2xlZCgpOworICAgIHZvaWQgb25fYWNjZWxNb2RlTW92ZV90b2dnbGVkKCk7CisKKyAgICB2b2lkIG9uTWFnVmVjdG9yQ2hhbmdlZCgpOworICAgIHZvaWQgdXBkYXRlTGluZWFyQWNjZWxlcmF0aW9uKCk7CisgICAgdm9pZCBvblBob25lUm90YXRpb25DaGFuZ2VkKCk7CisgICAgdm9pZCBvblBob25lUG9zaXRpb25DaGFuZ2VkKCk7CisgICAgdm9pZCBvbkRyYWdTdGFydGVkKCkgeyBtQWNjZWxlcmF0aW9uVGltZXIuc3RhcnQoKTsgfQorICAgIHZvaWQgb25EcmFnU3RvcHBlZCgpIHsKKyAgICAgICAgbUxpbmVhckFjY2VsZXJhdGlvbiA9IFFWZWN0b3IzRCgwLCAwLCAwKTsKKyAgICAgICAgdXBkYXRlQWNjZWxlcm9tZXRlclZhbHVlcygpOworICAgICAgICBtQWNjZWxlcmF0aW9uVGltZXIuc3RvcCgpOworICAgIH0KKyAgICB2b2lkIG9uU2tpbkxheW91dENoYW5nZShib29sIG5leHQpOworCitzaWduYWxzOgorICAgIHZvaWQgY29hcnNlT3JpZW50YXRpb25DaGFuZ2VkKFNraW5Sb3RhdGlvbik7CisgICAgdm9pZCB1cGRhdGVSZXN1bHRpbmdWYWx1ZXNSZXF1aXJlZChRVmVjdG9yM0QgYWNjZWxlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVZlY3RvcjNEIGRldmljZV9tYWduZXRpY192ZWN0b3IpOworCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgb25fcm90YXRlVG9Qb3J0cmFpdF9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9yb3RhdGVUb0xhbmRzY2FwZV9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9yb3RhdGVUb1JldmVyc2VQb3J0cmFpdF9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9yb3RhdGVUb1JldmVyc2VMYW5kc2NhcGVfY2xpY2tlZCgpOworICAgIHZvaWQgb25faGVscE1hZ25ldGljRmllbGRfY2xpY2tlZCgpOworICAgIHZvaWQgb25faGVscExpZ2h0X2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX2hlbHBQcmVzc3VyZV9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9oZWxwQW1iaWVudFRlbXBfY2xpY2tlZCgpOworICAgIHZvaWQgb25faGVscFByb3hpbWl0eV9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9oZWxwSHVtaWRpdHlfY2xpY2tlZCgpOworICAgIHZvaWQgb25feWF3U2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpOworICAgIHZvaWQgb25fcGl0Y2hTbGlkZXJfdmFsdWVDaGFuZ2VkKGRvdWJsZSk7CisgICAgdm9pZCBvbl9yb2xsU2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpOworICAgIHZvaWQgb25fcG9zaXRpb25YU2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpOworICAgIHZvaWQgb25fcG9zaXRpb25ZU2xpZGVyX3ZhbHVlQ2hhbmdlZChkb3VibGUpOworCisgICAgdm9pZCB1cGRhdGVSZXN1bHRpbmdWYWx1ZXMoUVZlY3RvcjNEIGFjY2VsZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVmVjdG9yM0QgZGV2aWNlX21hZ25ldGljX3ZlY3Rvcik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBzaG93RXZlbnQoUVNob3dFdmVudCopIG92ZXJyaWRlOworCisgICAgdm9pZCByZXNldEFjY2VsZXJvbWV0ZXJSb3RhdGlvbihjb25zdCBRUXVhdGVybmlvbiYpOworICAgIHZvaWQgcmVzZXRBY2NlbGVyb21ldGVyUm90YXRpb25Gcm9tU2tpbkxheW91dChjb25zdCBTa2luTGF5b3V0Kik7CisgICAgdm9pZCBzZXRBY2NlbGVyb21ldGVyUm90YXRpb25Gcm9tU2xpZGVycygpOworICAgIHZvaWQgc2V0UGhvbmVQb3NpdGlvbkZyb21TbGlkZXJzKCk7CisgICAgdm9pZCB1cGRhdGVBY2NlbGVyb21ldGVyVmFsdWVzKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OlZpcnR1YWxTZW5zb3JzUGFnZT4gbVVpOworICAgIFFEb3VibGVWYWxpZGF0b3IgbU1hZ0ZpZWxkVmFsaWRhdG9yOworICAgIGNvbnN0IFFBbmRyb2lkU2Vuc29yc0FnZW50KiBtU2Vuc29yc0FnZW50OworICAgIFFWZWN0b3IzRCBtTGluZWFyQWNjZWxlcmF0aW9uOworICAgIFFWZWN0b3IzRCBtUHJldlBvc2l0aW9uOworICAgIFFWZWN0b3IzRCBtQ3VycmVudFBvc2l0aW9uOworICAgIFFUaW1lciBtQWNjZWxlcmF0aW9uVGltZXI7CisgICAgYm9vbCBtRmlyc3RTaG93ID0gdHJ1ZTsKKyAgICBTa2luUm90YXRpb24gbUNvYXJzZU9yaWVudGF0aW9uOworICAgIGJvb2wgbVZpcnR1YWxTZW5zb3JzVXNlZCA9IGZhbHNlOworICAgIGFuZHJvaWQ6Om1ldHJpY3M6OlBlcmlvZGljUmVwb3J0ZXI6OlRhc2tUb2tlbiBtTWV0cmljc1JlcG9ydGluZ1Rva2VuOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLnVpIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdmlydHVhbC1zZW5zb3JzLXBhZ2UudWkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhmODZmMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLnVpCkBAIC0wLDAgKzEsODQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHVpIHZlcnNpb249IjQuMCI+CisgPGNsYXNzPlZpcnR1YWxTZW5zb3JzUGFnZTwvY2xhc3M+CisgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0iVmlydHVhbFNlbnNvcnNQYWdlIj4KKyAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgIDxyZWN0PgorICAgIDx4PjA8L3g+CisgICAgPHk+MDwveT4KKyAgICA8d2lkdGg+NjIyPC93aWR0aD4KKyAgICA8aGVpZ2h0PjU4MDwvaGVpZ2h0PgorICAgPC9yZWN0PgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93VGl0bGUiPgorICAgPHN0cmluZz5Gb3JtPC9zdHJpbmc+CisgIDwvcHJvcGVydHk+CisgIDx3aWRnZXQgY2xhc3M9IlFUYWJXaWRnZXQiIG5hbWU9InRhYldpZGdldCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4wPC94PgorICAgICA8eT4yMDwveT4KKyAgICAgPHdpZHRoPjYzMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+NTYxPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY3VycmVudEluZGV4Ij4KKyAgICA8bnVtYmVyPjA8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJ0YWIiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiPgorICAgICA8c3RyaW5nPkFjY2VsZXJvbWV0ZXI8L3N0cmluZz4KKyAgICA8L2F0dHJpYnV0ZT4KKyAgICA8d2lkZ2V0IGNsYXNzPSJBY2NlbGVyb21ldGVyM0RXaWRnZXQiIG5hbWU9ImFjY2VsV2lkZ2V0IiBuYXRpdmU9InRydWUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MTA8L3k+CisgICAgICAgPHdpZHRoPjYwMDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yOTE8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUVJhZGlvQnV0dG9uIiBuYW1lPSJhY2NlbE1vZGVSb3RhdGUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MzIxPC95PgorICAgICAgIDx3aWR0aD4xMDM8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MjU8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZz5Sb3RhdGU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrZWQiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUVJhZGlvQnV0dG9uIiBuYW1lPSJhY2NlbE1vZGVNb3ZlIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjEyMDwveD4KKyAgICAgICA8eT4zMjE8L3k+CisgICAgICAgPHdpZHRoPjEwMzwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPk1vdmU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9InJvdGF0ZVRvUG9ydHJhaXQiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MzYwPC94PgorICAgICAgIDx5PjMzMDwveT4KKyAgICAgICA8d2lkdGg+NDA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+NDA8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgICAgPHN0cmluZz5ST1RBVElPTl8wPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmcvPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3Bob25lX3BvcnRyYWl0PC9ub3JtYWxvZmY+Oi9saWdodC9waG9uZV9wb3J0cmFpdDwvaWNvbnNldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+cGhvbmVfcG9ydHJhaXQ8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJSYWlzZWRNYXRlcmlhbEJ1dHRvbiIgbmFtZT0icm90YXRlVG9MYW5kc2NhcGUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+NTEwPC94PgorICAgICAgIDx5PjMzMDwveT4KKyAgICAgICA8d2lkdGg+NDA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+NDA8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgICAgPHN0cmluZz5ST1RBVElPTl8yNzA8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZy8+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvcGhvbmVfbGFuZHNjYXBlPC9ub3JtYWxvZmY+Oi9saWdodC9waG9uZV9sYW5kc2NhcGU8L2ljb25zZXQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgICA8c2l6ZT4KKyAgICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICAgIDwvc2l6ZT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPnBob25lX2xhbmRzY2FwZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iY29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+VG9vbDwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlJhaXNlZE1hdGVyaWFsQnV0dG9uIiBuYW1lPSJyb3RhdGVUb1JldmVyc2VQb3J0cmFpdCI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD40NjA8L3g+CisgICAgICAgPHk+MzMwPC95PgorICAgICAgIDx3aWR0aD40MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD40MDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgICA8c3RyaW5nPlJPVEFUSU9OXzE4MDwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nLz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICAgIDxub3JtYWxvZmY+Oi9saWdodC9waG9uZV9yZXZlcnNlX3BvcnRyYWl0PC9ub3JtYWxvZmY+Oi9saWdodC9waG9uZV9yZXZlcnNlX3BvcnRyYWl0PC9pY29uc2V0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgICAgPHNpemU+CisgICAgICAgPHdpZHRoPjI0PC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgICA8L3NpemU+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5waG9uZV9yZXZlcnNlX3BvcnRyYWl0PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5Ub29sPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUmFpc2VkTWF0ZXJpYWxCdXR0b24iIG5hbWU9InJvdGF0ZVRvUmV2ZXJzZUxhbmRzY2FwZSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD40MTA8L3g+CisgICAgICAgPHk+MzMwPC95PgorICAgICAgIDx3aWR0aD40MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD40MDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgICA8c3RyaW5nPlJPVEFUSU9OXzkwPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmcvPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3Bob25lX3JldmVyc2VfbGFuZHNjYXBlPC9ub3JtYWxvZmY+Oi9saWdodC9waG9uZV9yZXZlcnNlX2xhbmRzY2FwZTwvaWNvbnNldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+cGhvbmVfcmV2ZXJzZV9sYW5kc2NhcGU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRvb2w8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRU3RhY2tlZFdpZGdldCIgbmFtZT0iYWNjZWxlcm9tZXRlclNsaWRlcnMiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MzUwPC95PgorICAgICAgIDx3aWR0aD4zMDA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTcwPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJyZW50SW5kZXgiPgorICAgICAgPG51bWJlcj4wPC9udW1iZXI+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9InBhZ2UiPgorICAgICAgPHdpZGdldCBjbGFzcz0iRWRpdGFibGVTbGlkZXJXaWRnZXQiIG5hbWU9Inlhd1NsaWRlciIgbmF0aXZlPSJ0cnVlIj4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgICA8cmVjdD4KKyAgICAgICAgIDx4PjQ5PC94PgorICAgICAgICAgPHk+MTA8L3k+CisgICAgICAgICA8d2lkdGg+MjMxPC93aWR0aD4KKyAgICAgICAgIDxoZWlnaHQ+NTA8L2hlaWdodD4KKyAgICAgICAgPC9yZWN0PgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L3dpZGdldD4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IkVkaXRhYmxlU2xpZGVyV2lkZ2V0IiBuYW1lPSJwaXRjaFNsaWRlciIgbmF0aXZlPSJ0cnVlIj4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgICA8cmVjdD4KKyAgICAgICAgIDx4PjUwPC94PgorICAgICAgICAgPHk+NzA8L3k+CisgICAgICAgICA8d2lkdGg+MjMxPC93aWR0aD4KKyAgICAgICAgIDxoZWlnaHQ+NTA8L2hlaWdodD4KKyAgICAgICAgPC9yZWN0PgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L3dpZGdldD4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IkVkaXRhYmxlU2xpZGVyV2lkZ2V0IiBuYW1lPSJyb2xsU2xpZGVyIiBuYXRpdmU9InRydWUiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICAgIDxyZWN0PgorICAgICAgICAgPHg+NTA8L3g+CisgICAgICAgICA8eT4xMzA8L3k+CisgICAgICAgICA8d2lkdGg+MjMxPC93aWR0aD4KKyAgICAgICAgIDxoZWlnaHQ+NTA8L2hlaWdodD4KKyAgICAgICAgPC9yZWN0PgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L3dpZGdldD4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWwiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICAgIDxyZWN0PgorICAgICAgICAgPHg+MTA8L3g+CisgICAgICAgICA8eT4yMDwveT4KKyAgICAgICAgIDx3aWR0aD4zMDwvd2lkdGg+CisgICAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICAgIDwvcmVjdD4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgPHN0cmluZz5ZYXc8L3N0cmluZz4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC93aWRnZXQ+CisgICAgICA8d2lkZ2V0IGNsYXNzPSJRTGFiZWwiIG5hbWU9ImxhYmVsXzIiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICAgIDxyZWN0PgorICAgICAgICAgPHg+MTA8L3g+CisgICAgICAgICA8eT44MDwveT4KKyAgICAgICAgIDx3aWR0aD4zMDwvd2lkdGg+CisgICAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICAgIDwvcmVjdD4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgPHN0cmluZz5QaXRjaDwvc3RyaW5nPgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L3dpZGdldD4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfMyI+CisgICAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgICAgPHJlY3Q+CisgICAgICAgICA8eD4xMDwveD4KKyAgICAgICAgIDx5PjE0MDwveT4KKyAgICAgICAgIDx3aWR0aD4zMDwvd2lkdGg+CisgICAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICAgIDwvcmVjdD4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgPHN0cmluZz5Sb2xsPC9zdHJpbmc+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvd2lkZ2V0PgorICAgICA8L3dpZGdldD4KKyAgICAgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0icGFnZV8yIj4KKyAgICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfMTIiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICAgIDxyZWN0PgorICAgICAgICAgPHg+MTA8L3g+CisgICAgICAgICA8eT44MDwveT4KKyAgICAgICAgIDx3aWR0aD4zMDwvd2lkdGg+CisgICAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICAgIDwvcmVjdD4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICAgPHN0cmluZz5ZPC9zdHJpbmc+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvd2lkZ2V0PgorICAgICAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF8xMyI+CisgICAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgICAgPHJlY3Q+CisgICAgICAgICA8eD4xMDwveD4KKyAgICAgICAgIDx5PjIwPC95PgorICAgICAgICAgPHdpZHRoPjMwPC93aWR0aD4KKyAgICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgICAgPC9yZWN0PgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgICA8c3RyaW5nPlg8L3N0cmluZz4KKyAgICAgICA8L3Byb3BlcnR5PgorICAgICAgPC93aWRnZXQ+CisgICAgICA8d2lkZ2V0IGNsYXNzPSJFZGl0YWJsZVNsaWRlcldpZGdldCIgbmFtZT0icG9zaXRpb25ZU2xpZGVyIiBuYXRpdmU9InRydWUiPgorICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICAgIDxyZWN0PgorICAgICAgICAgPHg+NTA8L3g+CisgICAgICAgICA8eT43MDwveT4KKyAgICAgICAgIDx3aWR0aD4yMzE8L3dpZHRoPgorICAgICAgICAgPGhlaWdodD41MDwvaGVpZ2h0PgorICAgICAgICA8L3JlY3Q+CisgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvd2lkZ2V0PgorICAgICAgPHdpZGdldCBjbGFzcz0iRWRpdGFibGVTbGlkZXJXaWRnZXQiIG5hbWU9InBvc2l0aW9uWFNsaWRlciIgbmF0aXZlPSJ0cnVlIj4KKyAgICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgICA8cmVjdD4KKyAgICAgICAgIDx4PjQ5PC94PgorICAgICAgICAgPHk+MTA8L3k+CisgICAgICAgICA8d2lkdGg+MjMxPC93aWR0aD4KKyAgICAgICAgIDxoZWlnaHQ+NTA8L2hlaWdodD4KKyAgICAgICAgPC9yZWN0PgorICAgICAgIDwvcHJvcGVydHk+CisgICAgICA8L3dpZGdldD4KKyAgICAgPC93aWRnZXQ+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF8xNSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zNjA8L3g+CisgICAgICAgPHk+MzEwPC95PgorICAgICAgIDx3aWR0aD45MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPkRldmljZSByb3RhdGlvbjwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFUZXh0QnJvd3NlciIgbmFtZT0icmVzdWx0aW5nQWNjZWxlcm9tZXRlclZhbHVlcyI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zNjA8L3g+CisgICAgICAgPHk+NDAwPC95PgorICAgICAgIDx3aWR0aD4yNTA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTEwPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF82Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjM2MDwveD4KKyAgICAgICA8eT4zODA8L3k+CisgICAgICAgPHdpZHRoPjEwMDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yMDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPlJlc3VsdGluZyBWYWx1ZXM8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgIDwvd2lkZ2V0PgorICAgPHdpZGdldCBjbGFzcz0iUVdpZGdldCIgbmFtZT0idGFiXzIiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0idGl0bGUiPgorICAgICA8c3RyaW5nPkFkZGl0aW9uYWwgc2Vuc29yczwvc3RyaW5nPgorICAgIDwvYXR0cmlidXRlPgorICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfNCI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4yMDwveD4KKyAgICAgICA8eT4zMDwveT4KKyAgICAgICA8d2lkdGg+MTYwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmc+QW1iaWVudCB0ZW1wZXJhdHVyZSAowrBDKTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IkVkaXRhYmxlU2xpZGVyV2lkZ2V0IiBuYW1lPSJ0ZW1wZXJhdHVyZVNlbnNvclZhbHVlV2lkZ2V0IiBuYXRpdmU9InRydWUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+NTA8L3k+CisgICAgICAgPHdpZHRoPjI5MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD44MDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRTGFiZWwiIG5hbWU9ImxhYmVsXzUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MjA8L3g+CisgICAgICAgPHk+MTQwPC95PgorICAgICAgIDx3aWR0aD45MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPlByb3hpbWl0eSAoY20pPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iRWRpdGFibGVTbGlkZXJXaWRnZXQiIG5hbWU9InByb3hpbWl0eVNlbnNvclZhbHVlV2lkZ2V0IiBuYXRpdmU9InRydWUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTA8L3g+CisgICAgICAgPHk+MTYwPC95PgorICAgICAgIDx3aWR0aD4yOTA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+ODA8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUxhYmVsIiBuYW1lPSJsYWJlbF83Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjMyNDwveD4KKyAgICAgICA8eT4zMDwveT4KKyAgICAgICA8d2lkdGg+MTIwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmc+TWFnbmV0aWMgZmllbGQgKM68VCk8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRV2lkZ2V0IiBuYW1lPSJob3Jpem9udGFsTGF5b3V0V2lkZ2V0Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjMyNDwveD4KKyAgICAgICA8eT41MDwveT4KKyAgICAgICA8d2lkdGg+MjgwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjQwPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxsYXlvdXQgY2xhc3M9IlFIQm94TGF5b3V0IiBuYW1lPSJob3Jpem9udGFsTGF5b3V0Ij4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BNYXJnaW4iPgorICAgICAgIDxudW1iZXI+MDwvbnVtYmVyPgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDxpdGVtPgorICAgICAgIDx3aWRnZXQgY2xhc3M9IlFEb3VibGVTcGluQm94IiBuYW1lPSJtYWdOb3J0aFdpZGdldCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtaW5pbXVtIj4KKyAgICAgICAgIDxkb3VibGU+LTEwMDAuMDAwMDAwMDAwMDAwMDAwPC9kb3VibGU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXhpbXVtIj4KKyAgICAgICAgIDxkb3VibGU+MTAwMC4wMDAwMDAwMDAwMDAwMDA8L2RvdWJsZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InZhbHVlIj4KKyAgICAgICAgIDxkb3VibGU+MjIuMDAwMDAwMDAwMDAwMDAwPC9kb3VibGU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzcyIgc3Rkc2V0PSIwIj4KKyAgICAgICAgIDxzdHJpbmc+RWRpdGFibGVWYWx1ZTwvc3RyaW5nPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDwvd2lkZ2V0PgorICAgICAgPC9pdGVtPgorICAgICAgPGl0ZW0+CisgICAgICAgPHdpZGdldCBjbGFzcz0iUURvdWJsZVNwaW5Cb3giIG5hbWU9Im1hZ0Vhc3RXaWRnZXQiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWluaW11bSI+CisgICAgICAgICA8ZG91YmxlPi0xMDAwLjAwMDAwMDAwMDAwMDAwMDwvZG91YmxlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4aW11bSI+CisgICAgICAgICA8ZG91YmxlPjEwMDAuMDAwMDAwMDAwMDAwMDAwPC9kb3VibGU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2YWx1ZSI+CisgICAgICAgICA8ZG91YmxlPjUuOTAwMDAwMDAwMDAwMDAwPC9kb3VibGU+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzcyIgc3Rkc2V0PSIwIj4KKyAgICAgICAgIDxzdHJpbmc+RWRpdGFibGVWYWx1ZTwvc3RyaW5nPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgIDwvd2lkZ2V0PgorICAgICAgPC9pdGVtPgorICAgICAgPGl0ZW0+CisgICAgICAgPHdpZGdldCBjbGFzcz0iUURvdWJsZVNwaW5Cb3giIG5hbWU9Im1hZ1ZlcnRpY2FsV2lkZ2V0Ij4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1pbmltdW0iPgorICAgICAgICAgPGRvdWJsZT4tMTAwMC4wMDAwMDAwMDAwMDAwMDA8L2RvdWJsZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heGltdW0iPgorICAgICAgICAgPGRvdWJsZT4xMDAwLjAwMDAwMDAwMDAwMDAwMDwvZG91YmxlPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0idmFsdWUiPgorICAgICAgICAgPGRvdWJsZT40My4xMDAwMDAwMDAwMDAwMDE8L2RvdWJsZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzIiBzdGRzZXQ9IjAiPgorICAgICAgICAgPHN0cmluZz5FZGl0YWJsZVZhbHVlPC9zdHJpbmc+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgPC93aWRnZXQ+CisgICAgICA8L2l0ZW0+CisgICAgIDwvbGF5b3V0PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IkVkaXRhYmxlU2xpZGVyV2lkZ2V0IiBuYW1lPSJsaWdodFNlbnNvclZhbHVlV2lkZ2V0IiBuYXRpdmU9InRydWUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MzE0PC94PgorICAgICAgIDx5PjE2MDwveT4KKyAgICAgICA8d2lkdGg+MzAwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjgwPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfOSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zMjQ8L3g+CisgICAgICAgPHk+MTQwPC95PgorICAgICAgIDx3aWR0aD42MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nPkxpZ2h0IChsdXgpPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iRWRpdGFibGVTbGlkZXJXaWRnZXQiIG5hbWU9InByZXNzdXJlU2Vuc29yVmFsdWVXaWRnZXQiIG5hdGl2ZT0idHJ1ZSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4xMDwveD4KKyAgICAgICA8eT4yODA8L3k+CisgICAgICAgPHdpZHRoPjI5MDwvd2lkdGg+CisgICAgICAgPGhlaWdodD44MDwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRTGFiZWwiIG5hbWU9ImxhYmVsXzEwIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjIwPC94PgorICAgICAgIDx5PjI2MDwveT4KKyAgICAgICA8d2lkdGg+OTA8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZz5QcmVzc3VyZSAoaFBhKTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IkVkaXRhYmxlU2xpZGVyV2lkZ2V0IiBuYW1lPSJodW1pZGl0eVNlbnNvclZhbHVlV2lkZ2V0IiBuYXRpdmU9InRydWUiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MzE0PC94PgorICAgICAgIDx5PjI4MDwveT4KKyAgICAgICA8d2lkdGg+MzAwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjgwPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFMYWJlbCIgbmFtZT0ibGFiZWxfMTEiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MzI0PC94PgorICAgICAgIDx5PjI2MDwveT4KKyAgICAgICA8d2lkdGg+MTMwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmc+UmVsYXRpdmUgaHVtaWRpdHkgKCUpPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImhlbHBNYWduZXRpY0ZpZWxkIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjQzMDwveD4KKyAgICAgICA8eT4zMDwveT4KKyAgICAgICA8d2lkdGg+MTU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZy8+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvaGVscF9vdXRsaW5lPC9ub3JtYWxvZmY+Oi9saWdodC9oZWxwX291dGxpbmU8L2ljb25zZXQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgICA8c2l6ZT4KKyAgICAgICA8d2lkdGg+MTU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgIDwvc2l6ZT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPmhlbHBfb3V0bGluZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaGVscEJ1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9ImhlbHBMaWdodCI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4zOTA8L3g+CisgICAgICAgPHk+MTQwPC95PgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nLz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICAgIDxub3JtYWxvZmY+Oi9saWdodC9oZWxwX291dGxpbmU8L25vcm1hbG9mZj46L2xpZ2h0L2hlbHBfb3V0bGluZTwvaWNvbnNldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+aGVscF9vdXRsaW5lPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxwQnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iaGVscFByZXNzdXJlIj4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjExMDwveD4KKyAgICAgICA8eT4yNjA8L3k+CisgICAgICAgPHdpZHRoPjE1PC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmcvPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L2hlbHBfb3V0bGluZTwvbm9ybWFsb2ZmPjovbGlnaHQvaGVscF9vdXRsaW5lPC9pY29uc2V0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgICAgPHNpemU+CisgICAgICAgPHdpZHRoPjE1PC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3NpemU+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5oZWxwX291dGxpbmU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImhlbHBCdXR0b24iIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJoZWxwQW1iaWVudFRlbXAiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+MTYwPC94PgorICAgICAgIDx5PjMwPC95PgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nLz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICAgIDxub3JtYWxvZmY+Oi9saWdodC9oZWxwX291dGxpbmU8L25vcm1hbG9mZj46L2xpZ2h0L2hlbHBfb3V0bGluZTwvaWNvbnNldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+aGVscF9vdXRsaW5lPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxwQnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iaGVscFByb3hpbWl0eSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4xMTA8L3g+CisgICAgICAgPHk+MTQwPC95PgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICA8c3RyaW5nLz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgICAgPGljb25zZXQgcmVzb3VyY2U9Ii4uL3Jlc291cmNlcy5xcmMiPgorICAgICAgIDxub3JtYWxvZmY+Oi9saWdodC9oZWxwX291dGxpbmU8L25vcm1hbG9mZj46L2xpZ2h0L2hlbHBfb3V0bGluZTwvaWNvbnNldD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4xNTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4xNTwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+aGVscF9vdXRsaW5lPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxwQnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iaGVscE1hZ25ldGljRmllbGRfMiI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD40MjA8L3g+CisgICAgICAgPHk+MjYwPC95PgorICAgICAgIDx3aWR0aD4wPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgIDxzdHJpbmcvPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgICA8aWNvbnNldCByZXNvdXJjZT0iLi4vcmVzb3VyY2VzLnFyYyI+CisgICAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L2hlbHBfb3V0bGluZTwvbm9ybWFsb2ZmPjovbGlnaHQvaGVscF9vdXRsaW5lPC9pY29uc2V0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgICAgPHNpemU+CisgICAgICAgPHdpZHRoPjE1PC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjE1PC9oZWlnaHQ+CisgICAgICA8L3NpemU+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5oZWxwX291dGxpbmU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImhlbHBCdXR0b24iIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJoZWxwSHVtaWRpdHkiPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+NDQwPC94PgorICAgICAgIDx5PjI2MDwveT4KKyAgICAgICA8d2lkdGg+MTU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgPHN0cmluZy8+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICAgIDxpY29uc2V0IHJlc291cmNlPSIuLi9yZXNvdXJjZXMucXJjIj4KKyAgICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvaGVscF9vdXRsaW5lPC9ub3JtYWxvZmY+Oi9saWdodC9oZWxwX291dGxpbmU8L2ljb25zZXQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgICA8c2l6ZT4KKyAgICAgICA8d2lkdGg+MTU8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MTU8L2hlaWdodD4KKyAgICAgIDwvc2l6ZT4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPmhlbHBfb3V0bGluZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iaGVscEJ1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICAgIDxib29sPnRydWU8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICA8L3dpZGdldD4KKyAgPC93aWRnZXQ+CisgPC93aWRnZXQ+CisgPGN1c3RvbXdpZGdldHM+CisgIDxjdXN0b213aWRnZXQ+CisgICA8Y2xhc3M+RWRpdGFibGVTbGlkZXJXaWRnZXQ8L2NsYXNzPgorICAgPGV4dGVuZHM+UVdpZGdldDwvZXh0ZW5kcz4KKyAgIDxoZWFkZXI+YW5kcm9pZC9za2luL3F0L2VkaXRhYmxlLXNsaWRlci13aWRnZXQuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPkFjY2VsZXJvbWV0ZXIzRFdpZGdldDwvY2xhc3M+CisgICA8ZXh0ZW5kcz5RV2lkZ2V0PC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvYWNjZWxlcm9tZXRlci0zZC13aWRnZXQuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPlJhaXNlZE1hdGVyaWFsQnV0dG9uPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFQdXNoQnV0dG9uPC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvcmFpc2VkLW1hdGVyaWFsLWJ1dHRvbi5oPC9oZWFkZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorIDwvY3VzdG9td2lkZ2V0cz4KKyA8cmVzb3VyY2VzPgorICA8aW5jbHVkZSBsb2NhdGlvbj0iLi4vcmVzb3VyY2VzLnFyYyIvPgorIDwvcmVzb3VyY2VzPgorIDxjb25uZWN0aW9ucy8+Cis8L3VpPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LXN0eWxlcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LXN0eWxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2VmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3ctc3R5bGVzLmgKQEAgLTAsMCArMSwzMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvbG9ycyBhbmQgb3RoZXIgc3R5bGVzIHRoYXQgZGV0ZXJtaW5lCisvLyBob3cgdGhlIGV4dGVuZGVkIHdpbmRvdyBhcHBlYXJzCisKKy8vIFRoaXMgZ2l2ZXMgdGhlIG9yZGVyIG9mIHRoZSB0YWJiZWQgcGFuZXMgb24gdGhlIGV4dGVuZGVkIHdpbmRvdy4KKy8vIFRoaXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBvcmRlcmluZyB0aGF0IGlzIHNldCBmcm9tIHdpdGhpbgorLy8gUXREZXNpZ25lciBhbmQgd3JpdHRlbiB0byBleHRlbmRlZC51aS4KK2VudW0gRXh0ZW5kZWRXaW5kb3dQYW5lIHsKKyAgICBQQU5FX0lEWF9MT0NBVElPTiA9IDAsCisgICAgUEFORV9JRFhfQ0VMTFVMQVIsCisgICAgUEFORV9JRFhfQkFUVEVSWSwKKyAgICBQQU5FX0lEWF9URUxFUEhPTkUsCisgICAgUEFORV9JRFhfVklSVF9TRU5TT1JTLAorICAgIFBBTkVfSURYX0RQQUQsCisgICAgUEFORV9JRFhfRklOR0VSLAorICAgIFBBTkVfSURYX1NFVFRJTkdTLAorICAgIFBBTkVfSURYX0hFTFAsCit9OworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDZjNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LmNwcApAQCAtMCwwICsxLDI2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LXN0eWxlcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9tYWluLWNvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3F0LXNldHRpbmdzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvdG9vbC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VpLWVtdS1hZ2VudC5oIgorCisjaW5jbHVkZSAidWlfZXh0ZW5kZWQuaCIKKworI2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgorCitFeHRlbmRlZFdpbmRvdzo6RXh0ZW5kZWRXaW5kb3coCisgICAgRW11bGF0b3JRdFdpbmRvdyAqZVcsCisgICAgVG9vbFdpbmRvdyAqdFcsCisgICAgY29uc3QgU2hvcnRjdXRLZXlTdG9yZTxRdFVJQ29tbWFuZD4qIHNob3J0Y3V0cykgOgorICAgIFFGcmFtZShudWxscHRyKSwKKyAgICBtRW11bGF0b3JXaW5kb3coZVcpLAorICAgIG1Ub29sV2luZG93KHRXKSwKKyAgICBtRXh0ZW5kZWRVaShuZXcgVWk6OkV4dGVuZGVkQ29udHJvbHMpLAorICAgIG1TaXplVHdlYWtlcih0aGlzKSwKKyAgICBtU2lkZWJhckJ1dHRvbnModGhpcykKK3sKKyAgICAvLyAiVG9vbCIgdHlwZSB3aW5kb3dzIGxpdmUgaW4gYW5vdGhlciBsYXllciBvbiB0b3Agb2YgZXZlcnl0aGluZyBpbiBPU1gsIHdoaWNoIGlzIHVuZGVzaXJhYmxlCisgICAgLy8gYmVjYXVzZSBpdCBtZWFucyB0aGUgZXh0ZW5kZWQgd2luZG93IG11c3QgYmUgb24gdG9wIG9mIHRoZSBlbXVsYXRvciB3aW5kb3cuIEhvd2V2ZXIsIG9uCisgICAgLy8gV2luZG93cyBhbmQgTGludXgsICJUb29sIiB0eXBlIHdpbmRvd3MgYXJlIHRoZSBvbmx5IHdheSB0byBtYWtlIGEgd2luZG93IHRoYXQgZG9lcyBub3QgaGF2ZQorICAgIC8vIGl0cyBvd24gdGFza2JhciBpdGVtLgorI2lmZGVmIF9fQVBQTEVfXworICAgIFF0OjpXaW5kb3dGbGFncyBmbGFnID0gUXQ6OkRpYWxvZzsKKyNlbHNlCisgICAgUXQ6OldpbmRvd0ZsYWdzIGZsYWcgPSBRdDo6VG9vbDsKKyNlbmRpZgorCisgICAgc2V0V2luZG93RmxhZ3MoZmxhZyB8IFF0OjpXaW5kb3dNaW5pbWl6ZUJ1dHRvbkhpbnQgfCBRdDo6V2luZG93Q2xvc2VCdXR0b25IaW50KTsKKworICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBib29sIG9uVG9wID0gc2V0dGluZ3MudmFsdWUoVWk6OlNldHRpbmdzOjpBTFdBWVNfT05fVE9QLCBmYWxzZSkudG9Cb29sKCk7CisgICAgc2V0RnJhbWVPblRvcCh0aGlzLCBvblRvcCk7CisKKyAgICBtRXh0ZW5kZWRVaS0+c2V0dXBVaSh0aGlzKTsKKyAgICBtRXh0ZW5kZWRVaS0+aGVscFBhZ2UtPmluaXRpYWxpemUoc2hvcnRjdXRzKTsKKyAgICBtRXh0ZW5kZWRVaS0+ZHBhZFBhZ2UtPnNldEVtdWxhdG9yV2luZG93KG1FbXVsYXRvcldpbmRvdyk7CisgICAgbUV4dGVuZGVkVWktPnNldHRpbmdzUGFnZS0+c2V0QWRiSW50ZXJmYWNlKAorICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5nZXRBZGJJbnRlcmZhY2UoKSk7CisgICAgbUV4dGVuZGVkVWktPnZpcnR1YWxTZW5zb3JzUGFnZS0+c2V0TGF5b3V0Q2hhbmdlTm90aWZpZXIoZVcpOworCisgICAgY29ubmVjdCgKKyAgICAgICAgbUV4dGVuZGVkVWktPnNldHRpbmdzUGFnZSwgU0lHTkFMKG9uVG9wQ2hhbmdlZChib29sKSksCisgICAgICAgIHRoaXMsIFNMT1Qoc3dpdGNoT25Ub3AoYm9vbCkpKTsKKworICAgIGNvbm5lY3QoCisgICAgICAgIG1FeHRlbmRlZFVpLT5zZXR0aW5nc1BhZ2UsIFNJR05BTChvbkZvcndhcmRTaG9ydGN1dHNUb0RldmljZUNoYW5nZWQoaW50KSksCisgICAgICAgIG1FbXVsYXRvcldpbmRvdywgU0xPVChzZXRGb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2UoaW50KSkpOworCisgICAgY29ubmVjdCgKKyAgICAgICAgbUV4dGVuZGVkVWktPnNldHRpbmdzUGFnZSwgU0lHTkFMKHRoZW1lQ2hhbmdlZChTZXR0aW5nc1RoZW1lKSksCisgICAgICAgIHRoaXMsIFNMT1Qoc3dpdGNoVG9UaGVtZShTZXR0aW5nc1RoZW1lKSkpOworCisgICAgbVBhbmVCdXR0b25NYXAgPSB7CisgICAgICAgIHtQQU5FX0lEWF9MT0NBVElPTiwgIG1FeHRlbmRlZFVpLT5sb2NhdGlvbkJ1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9DRUxMVUxBUiwgIG1FeHRlbmRlZFVpLT5jZWxsdWxhckJ1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9CQVRURVJZLCAgIG1FeHRlbmRlZFVpLT5iYXR0ZXJ5QnV0dG9ufSwKKyAgICAgICAge1BBTkVfSURYX1RFTEVQSE9ORSwgbUV4dGVuZGVkVWktPnRlbGVwaG9uZUJ1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9EUEFELCAgICAgIG1FeHRlbmRlZFVpLT5kcGFkQnV0dG9ufSwKKyAgICAgICAge1BBTkVfSURYX0ZJTkdFUiwgICAgbUV4dGVuZGVkVWktPmZpbmdlckJ1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9WSVJUX1NFTlNPUlMsIG1FeHRlbmRlZFVpLT52aXJ0U2Vuc29yc0J1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9TRVRUSU5HUywgIG1FeHRlbmRlZFVpLT5zZXR0aW5nc0J1dHRvbn0sCisgICAgICAgIHtQQU5FX0lEWF9IRUxQLCAgICAgIG1FeHRlbmRlZFVpLT5oZWxwQnV0dG9ufSwKKyAgICB9OworCisgICAgc2V0T2JqZWN0TmFtZSgiRXh0ZW5kZWRDb250cm9scyIpOworCisgICAgbVNpZGViYXJCdXR0b25zLmFkZEJ1dHRvbihtRXh0ZW5kZWRVaS0+bG9jYXRpb25CdXR0b24pOworICAgIG1TaWRlYmFyQnV0dG9ucy5hZGRCdXR0b24obUV4dGVuZGVkVWktPmNlbGx1bGFyQnV0dG9uKTsKKyAgICBtU2lkZWJhckJ1dHRvbnMuYWRkQnV0dG9uKG1FeHRlbmRlZFVpLT5iYXR0ZXJ5QnV0dG9uKTsKKyAgICBtU2lkZWJhckJ1dHRvbnMuYWRkQnV0dG9uKG1FeHRlbmRlZFVpLT50ZWxlcGhvbmVCdXR0b24pOworICAgIG1TaWRlYmFyQnV0dG9ucy5hZGRCdXR0b24obUV4dGVuZGVkVWktPmRwYWRCdXR0b24pOworICAgIG1TaWRlYmFyQnV0dG9ucy5hZGRCdXR0b24obUV4dGVuZGVkVWktPmZpbmdlckJ1dHRvbik7CisgICAgbVNpZGViYXJCdXR0b25zLmFkZEJ1dHRvbihtRXh0ZW5kZWRVaS0+dmlydFNlbnNvcnNCdXR0b24pOworICAgIG1TaWRlYmFyQnV0dG9ucy5hZGRCdXR0b24obUV4dGVuZGVkVWktPnNldHRpbmdzQnV0dG9uKTsKKyAgICBtU2lkZWJhckJ1dHRvbnMuYWRkQnV0dG9uKG1FeHRlbmRlZFVpLT5oZWxwQnV0dG9uKTsKKworICAgIGZvciAoUVdpZGdldCogdyA6IGZpbmRDaGlsZHJlbjxRV2lkZ2V0Kj4oKSkgeworICAgICAgICB3LT5zZXRBdHRyaWJ1dGUoUXQ6OldBX01hY1Nob3dGb2N1c1JlY3QsIGZhbHNlKTsKKyAgICB9CisKKyAgICBjb25uZWN0KG1FeHRlbmRlZFVpLT52aXJ0dWFsU2Vuc29yc1BhZ2UsCisgICAgICAgICAgICBTSUdOQUwoY29hcnNlT3JpZW50YXRpb25DaGFuZ2VkKFNraW5Sb3RhdGlvbikpLAorICAgICAgICAgICAgZVcsCisgICAgICAgICAgICBTTE9UKHJvdGF0ZVNraW4oU2tpblJvdGF0aW9uKSkpOworfQorCitFeHRlbmRlZFdpbmRvdzo6fkV4dGVuZGVkV2luZG93KCkgeworICAgIG1FeHRlbmRlZFVpLT5sb2NhdGlvbl9wYWdlLT5yZXF1ZXN0U3RvcExvYWRpbmdHZW9EYXRhKCk7Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OnNldEFnZW50KGNvbnN0IFVpRW11QWdlbnQqIGFnZW50UHRyKSB7CisgICAgaWYgKGFnZW50UHRyKSB7CisgICAgICAgIG1FeHRlbmRlZFVpLT5jZWxsdWxhcl9wYWdlLT5zZXRDZWxsdWxhckFnZW50KGFnZW50UHRyLT5jZWxsdWxhcik7CisgICAgICAgIG1FeHRlbmRlZFVpLT5iYXR0ZXJ5UGFnZS0+c2V0QmF0dGVyeUFnZW50KGFnZW50UHRyLT5iYXR0ZXJ5KTsKKyAgICAgICAgbUV4dGVuZGVkVWktPnRlbGVwaG9ueVBhZ2UtPnNldFRlbGVwaG9ueUFnZW50KGFnZW50UHRyLT50ZWxlcGhvbnkpOworICAgICAgICBtRXh0ZW5kZWRVaS0+ZmluZ2VyX3BhZ2UtPnNldEZpbmdlckFnZW50KGFnZW50UHRyLT5maW5nZXIpOworICAgICAgICBtRXh0ZW5kZWRVaS0+bG9jYXRpb25fcGFnZS0+c2V0TG9jYXRpb25BZ2VudChhZ2VudFB0ci0+bG9jYXRpb24pOworICAgICAgICBtRXh0ZW5kZWRVaS0+dmlydHVhbFNlbnNvcnNQYWdlLT5zZXRTZW5zb3JzQWdlbnQoYWdlbnRQdHItPnNlbnNvcnMpOworICAgIH0KKyAgICAvLyBUaGUgQURCIHBvcnQgaXMga25vd24gbm93LiBTaG93IGl0IG9uIHRoZSBVSSBIZWxwIHBhZ2UuCisgICAgbUV4dGVuZGVkVWktPmhlbHBQYWdlLT5zZXRBZGJQb3J0KCk7Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OnNob3coKSB7CisgICAgUUZyYW1lOjpzaG93KCk7CisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgZXh0ZW5kZWQgcGFuZSBpcyBmdWxseSB2aXNpYmxlIChvdGhlcndpc2UgaXQgbWF5IGJlCisgICAgLy8gaW1wb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gbW92ZSBpdCkKKyAgICBRRGVza3RvcFdpZGdldCAqZGVza3RvcCA9IHN0YXRpY19jYXN0PFFBcHBsaWNhdGlvbio+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSApLT5kZXNrdG9wKCk7CisgICAgaW50IHNjcmVlbk51bSA9IGRlc2t0b3AtPnNjcmVlbk51bWJlcih0aGlzKTsgLy8gU2NyZWVuIGhvbGRpbmcgbW9zdCBvZiB0aGlzCisKKyAgICBRUmVjdCBzY3JlZW5HZW8gPSBkZXNrdG9wLT5zY3JlZW5HZW9tZXRyeShzY3JlZW5OdW0pOworICAgIFFSZWN0IG15R2VvID0gZ2VvbWV0cnkoKTsKKworICAgIGJvb2wgbW92ZWQgPSBmYWxzZTsKKyAgICAvLyBMZWF2ZSBzb21lIHBhZGRpbmcgYmV0d2VlbiB0aGUgd2luZG93IGFuZCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuLgorICAgIC8vIFRoaXMgZGlzdGFuY2UgaXNuJ3QgcHJlY2lzZS0taXQncyBtYWlubHkgdG8gcHJldmVudCB0aGUgd2luZG93IGZyb20KKyAgICAvLyBsb29raW5nIGxpa2UgaXQncyBhIGxpdHRsZSBvZmYgc2NyZWVuLgorICAgIHN0YXRpYyBjb25zdCBpbnQgZ2FwID0gMTA7CisgICAgaWYgKG15R2VvLngoKSArIG15R2VvLndpZHRoKCkgPiBzY3JlZW5HZW8ueCgpICsgc2NyZWVuR2VvLndpZHRoKCkgLSBnYXApIHsKKyAgICAgICAgLy8gUmlnaHQgZWRnZSBpcyBvZmYgdGhlIHNjcmVlbgorICAgICAgICBteUdlby5zZXRYKHNjcmVlbkdlby54KCkgKyBzY3JlZW5HZW8ud2lkdGgoKSAtIG15R2VvLndpZHRoKCkgLSBnYXApOworICAgICAgICBtb3ZlZCA9IHRydWU7CisgICAgfQorICAgIGlmIChteUdlby55KCkgKyBteUdlby5oZWlnaHQoKSA+IHNjcmVlbkdlby55KCkgKyBzY3JlZW5HZW8uaGVpZ2h0KCkgLSBnYXApIHsKKyAgICAgICAgLy8gQm90dG9tIGVkZ2UgaXMgb2ZmIHRoZSBzY3JlZW4KKyAgICAgICAgbXlHZW8uc2V0WShzY3JlZW5HZW8ueSgpICsgc2NyZWVuR2VvLmhlaWdodCgpIC0gbXlHZW8uaGVpZ2h0KCkgLSBnYXApOworICAgICAgICBtb3ZlZCA9IHRydWU7CisgICAgfQorICAgIGlmIChteUdlby54KCkgPCBzY3JlZW5HZW8ueCgpICsgZ2FwKSB7CisgICAgICAgIC8vIFRvcCBlZGdlIGlzIG9mZiB0aGUgc2NyZWVuCisgICAgICAgIG15R2VvLnNldFgoc2NyZWVuR2VvLngoKSArIGdhcCk7CisgICAgICAgIG1vdmVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG15R2VvLnkoKSA8IHNjcmVlbkdlby55KCkgKyBnYXApIHsKKyAgICAgICAgLy8gTGVmdCBlZGdlIGlzIG9mZiB0aGUgc2NyZWVuCisgICAgICAgIG15R2VvLnNldFkoc2NyZWVuR2VvLnkoKSArIGdhcCk7CisgICAgICAgIG1vdmVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1vdmVkKSB7CisgICAgICAgIHNldEdlb21ldHJ5KG15R2VvKTsKKyAgICB9Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OnNob3dQYW5lKEV4dGVuZGVkV2luZG93UGFuZSBwYW5lKSB7CisgICAgc2hvdygpOworICAgIGFkanVzdFRhYnMocGFuZSk7Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpIHsKKyAgICAvLyBNZXJlbHkgaGlkZSB0aGUgd2luZG93IHRoZSB3aWRnZXQgaXMgY2xvc2VkLCBkbyBub3QgZGVzdHJveSBzdGF0ZS4KKyAgICBlLT5pZ25vcmUoKTsKKyAgICBoaWRlKCk7Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBlKSB7CisgICAgbVRvb2xXaW5kb3ctPmhhbmRsZVF0S2V5RXZlbnQoZSk7Cit9CisKKy8vIFRhYiBidXR0b25zLiBFYWNoIHJhaXNlcyBpdHMgc3RhY2tlZCBwYW5lIHRvIHRoZSB0b3AuCit2b2lkIEV4dGVuZGVkV2luZG93Ojpvbl9iYXR0ZXJ5QnV0dG9uX2NsaWNrZWQoKSAgICAgeyBhZGp1c3RUYWJzKFBBTkVfSURYX0JBVFRFUlkpOyB9Cit2b2lkIEV4dGVuZGVkV2luZG93Ojpvbl9jZWxsdWxhckJ1dHRvbl9jbGlja2VkKCkgICAgeyBhZGp1c3RUYWJzKFBBTkVfSURYX0NFTExVTEFSKTsgfQordm9pZCBFeHRlbmRlZFdpbmRvdzo6b25fZHBhZEJ1dHRvbl9jbGlja2VkKCkgICAgICAgIHsgYWRqdXN0VGFicyhQQU5FX0lEWF9EUEFEKTsgfQordm9pZCBFeHRlbmRlZFdpbmRvdzo6b25fZmluZ2VyQnV0dG9uX2NsaWNrZWQoKSAgICAgIHsgYWRqdXN0VGFicyhQQU5FX0lEWF9GSU5HRVIpOyB9Cit2b2lkIEV4dGVuZGVkV2luZG93Ojpvbl9oZWxwQnV0dG9uX2NsaWNrZWQoKSAgICAgICAgeyBhZGp1c3RUYWJzKFBBTkVfSURYX0hFTFApOyB9Cit2b2lkIEV4dGVuZGVkV2luZG93Ojpvbl9sb2NhdGlvbkJ1dHRvbl9jbGlja2VkKCkgICAgeyBhZGp1c3RUYWJzKFBBTkVfSURYX0xPQ0FUSU9OKTsgfQordm9pZCBFeHRlbmRlZFdpbmRvdzo6b25fc2V0dGluZ3NCdXR0b25fY2xpY2tlZCgpICAgIHsgYWRqdXN0VGFicyhQQU5FX0lEWF9TRVRUSU5HUyk7IH0KK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6Om9uX3RlbGVwaG9uZUJ1dHRvbl9jbGlja2VkKCkgICB7IGFkanVzdFRhYnMoUEFORV9JRFhfVEVMRVBIT05FKTsgfQordm9pZCBFeHRlbmRlZFdpbmRvdzo6b25fdmlydFNlbnNvcnNCdXR0b25fY2xpY2tlZCgpIHsgYWRqdXN0VGFicyhQQU5FX0lEWF9WSVJUX1NFTlNPUlMpOyB9CisKKwordm9pZCBFeHRlbmRlZFdpbmRvdzo6YWRqdXN0VGFicyhFeHRlbmRlZFdpbmRvd1BhbmUgdGhpc0luZGV4KSB7CisgICAgYXV0byBpdCA9IG1QYW5lQnV0dG9uTWFwLmZpbmQodGhpc0luZGV4KTsKKyAgICBpZiAoaXQgPT0gbVBhbmVCdXR0b25NYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBRUHVzaEJ1dHRvbiogdGhpc0J1dHRvbiA9IGl0LT5zZWNvbmQ7CisgICAgdGhpc0J1dHRvbi0+dG9nZ2xlKCk7CisgICAgdGhpc0J1dHRvbi0+Y2xlYXJGb2N1cygpOyAvLyBJdCBsb29rcyBiZXR0ZXIgd2hlbiBub3QgaGlnaGxpZ2h0ZWQKKyAgICBtRXh0ZW5kZWRVaS0+c3RhY2tlZFdpZGdldC0+c2V0Q3VycmVudEluZGV4KHN0YXRpY19jYXN0PGludD4odGhpc0luZGV4KSk7Cit9CisKK3ZvaWQgRXh0ZW5kZWRXaW5kb3c6OnN3aXRjaE9uVG9wKGJvb2wgaXNPblRvcCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+c2V0T25Ub3AoaXNPblRvcCk7CisgICAgc2V0RnJhbWVPblRvcCh0aGlzLCBpc09uVG9wKTsKK30KKwordm9pZCBFeHRlbmRlZFdpbmRvdzo6c3dpdGNoVG9UaGVtZShTZXR0aW5nc1RoZW1lIHRoZW1lKSB7CisgICAgLy8gU3dpdGNoIHRvIHRoZSBpY29uIGltYWdlcyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyB0aGVtZS4KKyAgICBhZGp1c3RBbGxCdXR0b25zRm9yVGhlbWUodGhlbWUpOworCisgICAgLy8gU2V0IHRoZSBRdCBzdHlsZS4KKworICAgIC8vIFRoZSBmaXJzdCBwYXJ0IGlzIGJhc2VkIG9uIHRoZSBkaXNwbGF5J3MgcGl4ZWwgZGVuc2l0eS4KKyAgICAvLyBNb3N0IGRpc3BsYXlzIGdpdmUgMS4wOyBoaWdoIGRlbnNpdHkgZGlzcGxheXMgZ2l2ZSAyLjAuCisgICAgZG91YmxlIGRlbnNpdHlGYWN0b3IgPSAxLjA7CisgICAgaWYgKHNraW5fd2luc3lzX2dldF9kZXZpY2VfcGl4ZWxfcmF0aW8oJmRlbnNpdHlGYWN0b3IpICE9IDApIHsKKyAgICAgICAgLy8gRmFpbGVkOiB1c2UgMS4wCisgICAgICAgIGRlbnNpdHlGYWN0b3IgPSAxLjA7CisgICAgfQorICAgIFFTdHJpbmcgc3R5bGVTdHJpbmcgPSBVaTo6Zm9udFN0eWxlc2hlZXQoZGVuc2l0eUZhY3RvciA+IDEuNSk7CisKKyAgICAvLyBUaGUgc2Vjb25kIHBhcnQgaXMgYmFzZWQgb24gdGhlIHRoZW1lCisgICAgLy8gU2V0IHRoZSBzdHlsZSBmb3IgdGhpcyB0aGVtZQorICAgIHN0eWxlU3RyaW5nICs9IFVpOjpzdHlsZXNoZWV0Rm9yVGhlbWUodGhlbWUpOworCisgICAgLy8gQXBwbHkgdGhpcyBzdHlsZSB0byB0aGUgZXh0ZW5kZWQgd2luZG93ICh0aGlzKSwKKyAgICAvLyBhbmQgdG8gdGhlIG1haW4gdG9vbC1iYXIuCisgICAgdGhpcy0+c2V0U3R5bGVTaGVldChzdHlsZVN0cmluZyk7CisgICAgbVRvb2xXaW5kb3ctPnNldFN0eWxlU2hlZXQoc3R5bGVTdHJpbmcpOworCisgICAgLy8gRm9yY2UgYSByZS1kcmF3IHRvIG1ha2UgdGhlIG5ldyBzdHlsZSB0YWtlIGVmZmVjdAorICAgIHRoaXMtPnN0eWxlKCktPnVucG9saXNoKG1FeHRlbmRlZFVpLT5zdGFja2VkV2lkZ2V0KTsKKyAgICB0aGlzLT5zdHlsZSgpLT5wb2xpc2gobUV4dGVuZGVkVWktPnN0YWNrZWRXaWRnZXQpOworICAgIHRoaXMtPnVwZGF0ZSgpOworCisgICAgLy8gTWFrZSB0aGUgU2V0dGluZ3MgcGFuZSBhY3RpdmUgKHN0aWxsKQorICAgIGFkanVzdFRhYnMoUEFORV9JRFhfU0VUVElOR1MpOworfQorCit2b2lkIEV4dGVuZGVkV2luZG93OjpzaG93RXZlbnQoUVNob3dFdmVudCogZSkgeworICAgIGlmIChtRmlyc3RTaG93RXZlbnQgJiYgIWUtPnNwb250YW5lb3VzKCkpIHsKKyAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBoYXMgdGhpbmdzIHRoYXQgbXVzdCBiZSBwZXJmb3JtZWQKKyAgICAgICAgLy8gYWZ0ZXIgdGhlIGN0b3IgYW5kIGFmdGVyIHNob3coKSBpcyBjYWxsZWQKKyAgICAgICAgc3dpdGNoVG9UaGVtZShnZXRTZWxlY3RlZFRoZW1lKCkpOworCisgICAgICAgIC8vIFNldCB0aGUgZmlyc3QgdGFiIGFjdGl2ZQorICAgICAgICBvbl9sb2NhdGlvbkJ1dHRvbl9jbGlja2VkKCk7CisKKyAgICAgICAgbUZpcnN0U2hvd0V2ZW50ID0gZmFsc2U7CisKKyAgICAgICAgLy8gVGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0aGUgbWFpbiB3aW5kb3cgYW5kIHRoZSB0b29sIGJhci4gVXNlIHRoZSBzYW1lCisgICAgICAgIC8vIGdhcCBiZXR3ZWVuIHRoZSB0b29sIGJhciBhbmQgdGhlIGV4dGVuZGVkIHdpbmRvdy4KKyAgICAgICAgbW92ZShtVG9vbFdpbmRvdy0+Z2VvbWV0cnkoKS5yaWdodCgpICsgVG9vbFdpbmRvdzo6dG9vbEdhcCwKKyAgICAgICAgICAgICBtVG9vbFdpbmRvdy0+Z2VvbWV0cnkoKS50b3AoKSk7CisgICAgfQorICAgIFFGcmFtZTo6c2hvd0V2ZW50KGUpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjNlMTkxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LmgKQEAgLTAsMCArMSw5OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2xvY2F0aW9uX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9zZW5zb3JzX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC91c2VyX2V2ZW50X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMvR3BzRml4LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ody1zZW5zb3JzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9zZXR0aW5ncy1hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3ctc3R5bGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3Nob3J0Y3V0LWtleS1zdG9yZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9zaXplLXR3ZWFrZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91aS1lbXUtYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPFFCdXR0b25Hcm91cD4KKyNpbmNsdWRlIDxRRmlsZT4KKyNpbmNsdWRlIDxRRnJhbWU+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisjaW5jbHVkZSA8UVN0cmluZz4KKyNpbmNsdWRlIDxRVGFibGVXaWRnZXQ+CisjaW5jbHVkZSA8UVRocmVhZD4KKyNpbmNsdWRlIDxRVGltZXI+CisjaW5jbHVkZSA8UURvdWJsZVZhbGlkYXRvcj4KKyNpbmNsdWRlIDxRU2hvd0V2ZW50PgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIEVtdWxhdG9yUXRXaW5kb3c7CitjbGFzcyBUb29sV2luZG93OworY2xhc3MgR2VvRGF0YUxvYWRlclRocmVhZDsKKworbmFtZXNwYWNlIFVpIHsKKyAgICBjbGFzcyBFeHRlbmRlZENvbnRyb2xzOworfQorCitjbGFzcyBFeHRlbmRlZFdpbmRvdyA6IHB1YmxpYyBRRnJhbWUKK3sKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgRXh0ZW5kZWRXaW5kb3coCisgICAgICAgIEVtdWxhdG9yUXRXaW5kb3cqIGVXLAorICAgICAgICBUb29sV2luZG93KiB0VywKKyAgICAgICAgY29uc3QgU2hvcnRjdXRLZXlTdG9yZTxRdFVJQ29tbWFuZD4qIHNob3J0Y3V0cyk7CisKKyAgICB+RXh0ZW5kZWRXaW5kb3coKTsKKworICAgIHZvaWQgc2V0QWdlbnQoY29uc3QgVWlFbXVBZ2VudCogYWdlbnRQdHIpOworCisgICAgdm9pZCBzaG93KCk7CisgICAgdm9pZCBzaG93UGFuZShFeHRlbmRlZFdpbmRvd1BhbmUgcGFuZSk7CisKK3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCBzd2l0Y2hPblRvcChib29sIGlzT250b3ApOworICAgIHZvaWQgc3dpdGNoVG9UaGVtZShTZXR0aW5nc1RoZW1lIHRoZW1lKTsKKworICAgIC8vIE1hc3RlciB0YWJzCisgICAgdm9pZCBvbl9iYXR0ZXJ5QnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX2NlbGx1bGFyQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX2RwYWRCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fZmluZ2VyQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX2hlbHBCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fbG9jYXRpb25CdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fc2V0dGluZ3NCdXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fdGVsZXBob25lQnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX3ZpcnRTZW5zb3JzQnV0dG9uX2NsaWNrZWQoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGNlKSBvdmVycmlkZTsKKyAgICB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBlKSBvdmVycmlkZTsKKyAgICB2b2lkIGFkanVzdFRhYnMoRXh0ZW5kZWRXaW5kb3dQYW5lIHRoaXNJbmRleCk7CisgICAgdm9pZCBzaG93RXZlbnQoUVNob3dFdmVudCogZSkgb3ZlcnJpZGU7CisKKyAgICBFbXVsYXRvclF0V2luZG93KiBtRW11bGF0b3JXaW5kb3c7CisgICAgVG9vbFdpbmRvdyogbVRvb2xXaW5kb3c7CisgICAgc3RkOjptYXA8RXh0ZW5kZWRXaW5kb3dQYW5lLCBRUHVzaEJ1dHRvbio+IG1QYW5lQnV0dG9uTWFwOworICAgIGNvbnN0IFNob3J0Y3V0S2V5U3RvcmU8UXRVSUNvbW1hbmQ+KiBtUXRVSVNob3J0Y3V0czsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VWk6OkV4dGVuZGVkQ29udHJvbHM+IG1FeHRlbmRlZFVpOworICAgIGJvb2wgbUZpcnN0U2hvd0V2ZW50ID0gdHJ1ZTsKKyAgICBTaXplVHdlYWtlciBtU2l6ZVR3ZWFrZXI7CisgICAgUUJ1dHRvbkdyb3VwIG1TaWRlYmFyQnV0dG9uczsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLnVpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMTY5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC51aQpAQCAtMCwwICsxLDkyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx1aSB2ZXJzaW9uPSI0LjAiPgorIDxjbGFzcz5FeHRlbmRlZENvbnRyb2xzPC9jbGFzcz4KKyA8d2lkZ2V0IGNsYXNzPSJRRnJhbWUiIG5hbWU9IkV4dGVuZGVkQ29udHJvbHMiPgorICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgPHJlY3Q+CisgICAgPHg+MDwveD4KKyAgICA8eT4wPC95PgorICAgIDx3aWR0aD44MjA8L3dpZHRoPgorICAgIDxoZWlnaHQ+NjAwPC9oZWlnaHQ+CisgICA8L3JlY3Q+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgIDxzaXplcG9saWN5IGhzaXpldHlwZT0iRml4ZWQiIHZzaXpldHlwZT0iRml4ZWQiPgorICAgIDxob3JzdHJldGNoPjA8L2hvcnN0cmV0Y2g+CisgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgIDwvc2l6ZXBvbGljeT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1pbmltdW1TaXplIj4KKyAgIDxzaXplPgorICAgIDx3aWR0aD44MjA8L3dpZHRoPgorICAgIDxoZWlnaHQ+NjAwPC9oZWlnaHQ+CisgICA8L3NpemU+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJtYXhpbXVtU2l6ZSI+CisgICA8c2l6ZT4KKyAgICA8d2lkdGg+ODIwPC93aWR0aD4KKyAgICA8aGVpZ2h0PjYwMDwvaGVpZ2h0PgorICAgPC9zaXplPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICA8Zm9udD4KKyAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgPC9mb250PgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93VGl0bGUiPgorICAgPHN0cmluZz5FeHRlbmRlZCBjb250cm9sczwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICA8c3RyaW5nIG5vdHI9InRydWUiPi8qIFF0OjpXaW5kb3dNaW5pbWl6ZUJ1dHRvbkhpbnQ7IFRoaXMgaXMgYmFkKi8KK2JhY2tncm91bmQtY29sb3I6ICMzYzQyNDk7Citjb2xvcjogI2YwZjBmMDsKK2ZvbnQtZmFtaWx5OiAmcXVvdDtSb2JvdG8mcXVvdDs8L3N0cmluZz4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImZyYW1lU2hhcGUiPgorICAgPGVudW0+UUZyYW1lOjpTdHlsZWRQYW5lbDwvZW51bT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImZyYW1lU2hhZG93Ij4KKyAgIDxlbnVtPlFGcmFtZTo6UmFpc2VkPC9lbnVtPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRU3RhY2tlZFdpZGdldCIgbmFtZT0ic3RhY2tlZFdpZGdldCI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xOTg8L3g+CisgICAgIDx5PjA8L3k+CisgICAgIDx3aWR0aD42MjA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjYwMDwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ibGF5b3V0RGlyZWN0aW9uIj4KKyAgICA8ZW51bT5RdDo6TGVmdFRvUmlnaHQ8L2VudW0+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImN1cnJlbnRJbmRleCI+CisgICAgPG51bWJlcj4wPC9udW1iZXI+CisgICA8L3Byb3BlcnR5PgorICAgPHdpZGdldCBjbGFzcz0iTG9jYXRpb25QYWdlIiBuYW1lPSJsb2NhdGlvbl9wYWdlIi8+CisgICA8d2lkZ2V0IGNsYXNzPSJDZWxsdWxhclBhZ2UiIG5hbWU9ImNlbGx1bGFyX3BhZ2UiLz4KKyAgIDx3aWRnZXQgY2xhc3M9IkJhdHRlcnlQYWdlIiBuYW1lPSJiYXR0ZXJ5UGFnZSIvPgorICAgPHdpZGdldCBjbGFzcz0iVGVsZXBob255UGFnZSIgbmFtZT0idGVsZXBob255UGFnZSIvPgorICAgPHdpZGdldCBjbGFzcz0iVmlydHVhbFNlbnNvcnNQYWdlIiBuYW1lPSJ2aXJ0dWFsU2Vuc29yc1BhZ2UiLz4KKyAgIDx3aWRnZXQgY2xhc3M9IkRQYWRQYWdlIiBuYW1lPSJkcGFkUGFnZSIvPgorICAgPHdpZGdldCBjbGFzcz0iRmluZ2VyUGFnZSIgbmFtZT0iZmluZ2VyX3BhZ2UiLz4KKyAgIDx3aWRnZXQgY2xhc3M9IlNldHRpbmdzUGFnZSIgbmFtZT0ic2V0dGluZ3NQYWdlIi8+CisgICA8d2lkZ2V0IGNsYXNzPSJIZWxwUGFnZSIgbmFtZT0iaGVscFBhZ2UiLz4KKyAgIDx3aWRnZXQgY2xhc3M9IlFXaWRnZXQiIG5hbWU9InBhZ2UiPgorICAgIDx3aWRnZXQgY2xhc3M9IlFHcm91cEJveCIgbmFtZT0ibG9jYXRpb25Hcm91cF80Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjMwPC94PgorICAgICAgIDx5PjEwPC95PgorICAgICAgIDx3aWR0aD40OTE8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MzE8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgICAgPGZvbnQ+CisgICAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgICAgPHdlaWdodD41MDwvd2VpZ2h0PgorICAgICAgIDxib2xkPmZhbHNlPC9ib2xkPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgICAgPHN0cmluZz5IaWRkZW4gcGFnZSB0aGF0IGhvbGRzIGZ1dHVyZSB3aWRnZXRzIGZvciBvdGhlciBwYWdlczwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICAgIDxzdHJpbmc+VGl0bGU8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImxvY2F0aW9uR3JvdXBfNSI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4xMDwveD4KKyAgICAgICA8eT43MDwveT4KKyAgICAgICA8d2lkdGg+MTIxPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgIDx3ZWlnaHQ+NTA8L3dlaWdodD4KKyAgICAgICA8Ym9sZD5mYWxzZTwvYm9sZD4KKyAgICAgIDwvZm9udD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5ib3JkZXI6IDBweDs8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICAgIDxzdHJpbmc+Q2VsbHVsYXIgcGFnZTo8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUdyb3VwQm94IiBuYW1lPSJjZWxsX2RlbGF5R3JvdXBCb3giPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+NjA8L3g+CisgICAgICAgPHk+MTIyPC95PgorICAgICAgIDx3aWR0aD4xNjE8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5ib3JkZXI6IDBweDs8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InRpdGxlIj4KKyAgICAgIDxzdHJpbmc+TmV0d29yayBkZWxheSAobXNlYyk8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPlRpdGxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUNvbWJvQm94IiBuYW1lPSJjZWxsX2RlbGF5Qm94Ij4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICAgIDxyZWN0PgorICAgICAgIDx4PjYwPC94PgorICAgICAgIDx5PjE0MDwveT4KKyAgICAgICA8d2lkdGg+MjgwPC93aWR0aD4KKyAgICAgICA8aGVpZ2h0PjMxPC9oZWlnaHQ+CisgICAgICA8L3JlY3Q+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICAgIDxmb250PgorICAgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPnBhZGRpbmc6IDNweCAzcHggM3B4IDNweDs8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnJlbnRJbmRleCI+CisgICAgICA8bnVtYmVyPjA8L251bWJlcj4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxpdGVtPgorICAgICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgICAgIDxzdHJpbmc+MDwvc3RyaW5nPgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPC9pdGVtPgorICAgICA8aXRlbT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICA8c3RyaW5nPjM1LTIwMCAoVU1UUy8zRyk8L3N0cmluZz4KKyAgICAgIDwvcHJvcGVydHk+CisgICAgIDwvaXRlbT4KKyAgICAgPGl0ZW0+CisgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgICAgPHN0cmluZz4xNTAtNTAwIChHUFJTKTwvc3RyaW5nPgorICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPC9pdGVtPgorICAgICA8aXRlbT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICAgICA8c3RyaW5nPjgwLTQwMCAoRURHRS9FR1BSUyk8L3N0cmluZz4KKyAgICAgIDwvcHJvcGVydHk+CisgICAgIDwvaXRlbT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9InRoZW1lVGl0bGVfMyI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD43MDwveD4KKyAgICAgICA8eT4yNjI8L3k+CisgICAgICAgPHdpZHRoPjIxMTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgPC9mb250PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgICA8c3RyaW5nIG5vdHI9InRydWUiPmJvcmRlcjogMHB4Ozwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0idGl0bGUiPgorICAgICAgPHN0cmluZz5Pbi1zY3JlZW4ga2V5Ym9hcmQ8L3N0cmluZz4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRpdGxlPC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgPC93aWRnZXQ+CisgICAgPHdpZGdldCBjbGFzcz0iUUNoZWNrQm94IiBuYW1lPSJzZXRfa2V5Ym9hcmRCb3giPgorICAgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgICAgPHJlY3Q+CisgICAgICAgPHg+NzA8L3g+CisgICAgICAgPHk+MjgwPC95PgorICAgICAgIDx3aWR0aD4yMTE8L3dpZHRoPgorICAgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICAgIDwvcmVjdD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICAgIDxzaXplPgorICAgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgICAgPC9zaXplPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tlZCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgICA8c3RyaW5nPlRvZ2dsZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L3dpZGdldD4KKyAgICA8d2lkZ2V0IGNsYXNzPSJRR3JvdXBCb3giIG5hbWU9ImxvY2F0aW9uR3JvdXBfNiI+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgICA8cmVjdD4KKyAgICAgICA8eD4yMDwveD4KKyAgICAgICA8eT4yMDA8L3k+CisgICAgICAgPHdpZHRoPjEyMTwvd2lkdGg+CisgICAgICAgPGhlaWdodD4zMTwvaGVpZ2h0PgorICAgICAgPC9yZWN0PgorICAgICA8L3Byb3BlcnR5PgorICAgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgICA8Zm9udD4KKyAgICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgICA8d2VpZ2h0PjUwPC93ZWlnaHQ+CisgICAgICAgPGJvbGQ+ZmFsc2U8L2JvbGQ+CisgICAgICA8L2ZvbnQ+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Ym9yZGVyOiAwcHg7PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSI+CisgICAgICA8c3RyaW5nPlNldHRpbmdzIHBhZ2U6PC9zdHJpbmc+CisgICAgIDwvcHJvcGVydHk+CisgICAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgICAgPHN0cmluZz5UaXRsZTwvc3RyaW5nPgorICAgICA8L3Byb3BlcnR5PgorICAgIDwvd2lkZ2V0PgorICAgPC93aWRnZXQ+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0idGVsZXBob25lQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5PjEzODwveT4KKyAgICAgPHdpZHRoPjE5NDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+NDI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhdXRvRmlsbEJhY2tncm91bmQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDBweCAwcHggMHB4IDE2cHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+ICBQaG9uZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9waG9uZTwvbm9ybWFsb2ZmPjovbGlnaHQvcGhvbmU8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjIwPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY2hlY2thYmxlIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnBob25lPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5NYWpvclRhYjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJiYXR0ZXJ5QnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5Pjk2PC95PgorICAgICA8d2lkdGg+MTk0PC93aWR0aD4KKyAgICAgPGhlaWdodD40MjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZm9udCI+CisgICAgPGZvbnQ+CisgICAgIDxmYW1pbHk+Um9ib3RvPC9mYW1pbHk+CisgICAgIDxwb2ludHNpemU+MTA8L3BvaW50c2l6ZT4KKyAgICAgPHdlaWdodD41MDwvd2VpZ2h0PgorICAgICA8Ym9sZD5mYWxzZTwvYm9sZD4KKyAgICA8L2ZvbnQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImF1dG9GaWxsQmFja2dyb3VuZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+dGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMHB4IDBweCAwcHggMTZweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZz4gIEJhdHRlcnk8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvYmF0dGVyeTwvbm9ybWFsb2ZmPjovbGlnaHQvYmF0dGVyeTwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIwPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja2FibGUiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+YmF0dGVyeTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0ibG9jYXRpb25CdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MDwveD4KKyAgICAgPHk+MTI8L3k+CisgICAgIDx3aWR0aD4xOTQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjQyPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYXV0b0ZpbGxCYWNrZ3JvdW5kIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj50ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPiAgTG9jYXRpb248L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvbG9jYXRpb248L25vcm1hbG9mZj46L2xpZ2h0L2xvY2F0aW9uPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjA8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrYWJsZSI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5sb2NhdGlvbjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iY2VsbHVsYXJCdXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MDwveD4KKyAgICAgPHk+NTQ8L3k+CisgICAgIDx3aWR0aD4xOTQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjQyPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYXV0b0ZpbGxCYWNrZ3JvdW5kIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj50ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPiAgQ2VsbHVsYXI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvc2lnbmFsX2NlbGx1bGFyXzNfYmFyPC9ub3JtYWxvZmY+Oi9saWdodC9zaWduYWxfY2VsbHVsYXJfM19iYXI8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjIwPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY2hlY2thYmxlIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnNpZ25hbF9jZWxsdWxhcl8zX2Jhcjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iZmluZ2VyQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5PjIyMjwveT4KKyAgICAgPHdpZHRoPjE5NDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+NDI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhdXRvRmlsbEJhY2tncm91bmQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDBweCAwcHggMHB4IDE2cHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+ICBGaW5nZXJwcmludDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9maW5nZXJwcmludDwvbm9ybWFsb2ZmPjovbGlnaHQvZmluZ2VycHJpbnQ8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjIwPC93aWR0aD4KKyAgICAgPGhlaWdodD4yMDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iY2hlY2thYmxlIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPmZpbmdlcnByaW50PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5NYWpvclRhYjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJkcGFkQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5PjE4MDwveT4KKyAgICAgPHdpZHRoPjE5NDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+NDI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhdXRvRmlsbEJhY2tncm91bmQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDBweCAwcHggMHB4IDE2cHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+ICBEaXJlY3Rpb25hbCBwYWQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvZHBhZDwvbm9ybWFsb2ZmPjovbGlnaHQvZHBhZDwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjA8L3dpZHRoPgorICAgICA8aGVpZ2h0PjIwPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja2FibGUiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+ZHBhZDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJMaW5lIiBuYW1lPSJWZXJ0RGl2aWRlciI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xOTQ8L3g+CisgICAgIDx5PjA8L3k+CisgICAgIDx3aWR0aD40PC93aWR0aD4KKyAgICAgPGhlaWdodD42MDA8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+Y29sb3IgOiAjODA4MDgwPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZyYW1lU2hhZG93Ij4KKyAgICA8ZW51bT5RRnJhbWU6OlBsYWluPC9lbnVtPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJsaW5lV2lkdGgiPgorICAgIDxudW1iZXI+MTA8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ib3JpZW50YXRpb24iPgorICAgIDxlbnVtPlF0OjpWZXJ0aWNhbDwvZW51bT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPkdyYWRpZW50RGl2aWRlcjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJzZXR0aW5nc0J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4wPC94PgorICAgICA8eT4zMTA8L3k+CisgICAgIDx3aWR0aD4xOTQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjQyPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYXV0b0ZpbGxCYWNrZ3JvdW5kIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj50ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPiAgU2V0dGluZ3M8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvc2V0dGluZ3M8L25vcm1hbG9mZj46L2xpZ2h0L3NldHRpbmdzPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjA8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrYWJsZSI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5zZXR0aW5nczwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0ic3BhY2VyMkJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZW5hYmxlZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MDwveD4KKyAgICAgPHk+MzUwPC95PgorICAgICA8d2lkdGg+MTk0PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNTA8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImF1dG9GaWxsQmFja2dyb3VuZCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InN0eWxlU2hlZXQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+dGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogMHB4IDBweCAwcHggMTZweDs8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZy8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjMyPC93aWR0aD4KKyAgICAgPGhlaWdodD4zMjwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPk1ham9yVGFiVGl0bGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0iaGVscEJ1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4wPC94PgorICAgICA8eT4zNTI8L3k+CisgICAgIDx3aWR0aD4xOTQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjQyPC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmb250Ij4KKyAgICA8Zm9udD4KKyAgICAgPGZhbWlseT5Sb2JvdG88L2ZhbWlseT4KKyAgICAgPHBvaW50c2l6ZT4xMDwvcG9pbnRzaXplPgorICAgIDwvZm9udD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYXV0b0ZpbGxCYWNrZ3JvdW5kIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj50ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nPiAgSGVscDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9oZWxwPC9ub3JtYWxvZmY+Oi9saWdodC9oZWxwPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjA8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrYWJsZSI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPmhlbHA8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iQ29sb3JHcm91cCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPk1ham9yVGFiPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJzcGFjZXIxQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVkIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4wPC94PgorICAgICA8eT4wPC95PgorICAgICA8d2lkdGg+MTk0PC93aWR0aD4KKyAgICAgPGhlaWdodD4xMjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iYXV0b0ZpbGxCYWNrZ3JvdW5kIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj50ZXh0LWFsaWduOiBsZWZ0OyBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4Ozwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MzI8L3dpZHRoPgorICAgICA8aGVpZ2h0PjMyPC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+TWFqb3JUYWJUaXRsZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IkxpbmUiIG5hbWU9ImxpbmUiPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MDwveD4KKyAgICAgPHk+MzA2PC95PgorICAgICA8d2lkdGg+MTk0PC93aWR0aD4KKyAgICAgPGhlaWdodD40PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmcmFtZVNoYWRvdyI+CisgICAgPGVudW0+UUZyYW1lOjpQbGFpbjwvZW51bT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ibGluZVdpZHRoIj4KKyAgICA8bnVtYmVyPjI8L251bWJlcj4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0ib3JpZW50YXRpb24iPgorICAgIDxlbnVtPlF0OjpIb3Jpem9udGFsPC9lbnVtPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJDb2xvckdyb3VwIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+SG9yaXpEaXZpZGVyPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9InZpcnRTZW5zb3JzQnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjA8L3g+CisgICAgIDx5PjI2NDwveT4KKyAgICAgPHdpZHRoPjE5NDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+NDI8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZvbnQiPgorICAgIDxmb250PgorICAgICA8ZmFtaWx5PlJvYm90bzwvZmFtaWx5PgorICAgICA8cG9pbnRzaXplPjEwPC9wb2ludHNpemU+CisgICAgPC9mb250PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJhdXRvRmlsbEJhY2tncm91bmQiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZVNoZWV0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDBweCAwcHggMHB4IDE2cHg7PC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmc+ICBWaXJ0dWFsIHNlbnNvcnM8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvdmlydFNlbnNvcnM8L25vcm1hbG9mZj46L2xpZ2h0L3ZpcnRTZW5zb3JzPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yMDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjA8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrYWJsZSI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPnZpcnRTZW5zb3JzPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IkNvbG9yR3JvdXAiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5NYWpvclRhYjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8em9yZGVyPnNwYWNlcjJCdXR0b248L3pvcmRlcj4KKyAgPHpvcmRlcj5zcGFjZXIxQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+c2V0dGluZ3NCdXR0b248L3pvcmRlcj4KKyAgPHpvcmRlcj5oZWxwQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+ZmluZ2VyQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+ZHBhZEJ1dHRvbjwvem9yZGVyPgorICA8em9yZGVyPnRlbGVwaG9uZUJ1dHRvbjwvem9yZGVyPgorICA8em9yZGVyPmJhdHRlcnlCdXR0b248L3pvcmRlcj4KKyAgPHpvcmRlcj5jZWxsdWxhckJ1dHRvbjwvem9yZGVyPgorICA8em9yZGVyPmxvY2F0aW9uQnV0dG9uPC96b3JkZXI+CisgIDx6b3JkZXI+c3RhY2tlZFdpZGdldDwvem9yZGVyPgorICA8em9yZGVyPlZlcnREaXZpZGVyPC96b3JkZXI+CisgIDx6b3JkZXI+bGluZTwvem9yZGVyPgorICA8em9yZGVyPnZpcnRTZW5zb3JzQnV0dG9uPC96b3JkZXI+CisgPC93aWRnZXQ+CisgPGN1c3RvbXdpZGdldHM+CisgIDxjdXN0b213aWRnZXQ+CisgICA8Y2xhc3M+Q2VsbHVsYXJQYWdlPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jZWxsdWxhci1wYWdlLmg8L2hlYWRlcj4KKyAgIDxjb250YWluZXI+MTwvY29udGFpbmVyPgorICA8L2N1c3RvbXdpZGdldD4KKyAgPGN1c3RvbXdpZGdldD4KKyAgIDxjbGFzcz5CYXR0ZXJ5UGFnZTwvY2xhc3M+CisgICA8ZXh0ZW5kcz5RV2lkZ2V0PC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLmg8L2hlYWRlcj4KKyAgIDxjb250YWluZXI+MTwvY29udGFpbmVyPgorICA8L2N1c3RvbXdpZGdldD4KKyAgPGN1c3RvbXdpZGdldD4KKyAgIDxjbGFzcz5UZWxlcGhvbnlQYWdlPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy90ZWxlcGhvbnktcGFnZS5oPC9oZWFkZXI+CisgICA8Y29udGFpbmVyPjE8L2NvbnRhaW5lcj4KKyAgPC9jdXN0b213aWRnZXQ+CisgIDxjdXN0b213aWRnZXQ+CisgICA8Y2xhc3M+RmluZ2VyUGFnZTwvY2xhc3M+CisgICA8ZXh0ZW5kcz5RV2lkZ2V0PC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZmluZ2VyLXBhZ2UuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPkhlbHBQYWdlPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9oZWxwLXBhZ2UuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPkRQYWRQYWdlPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9kcGFkLXBhZ2UuaDwvaGVhZGVyPgorICAgPGNvbnRhaW5lcj4xPC9jb250YWluZXI+CisgIDwvY3VzdG9td2lkZ2V0PgorICA8Y3VzdG9td2lkZ2V0PgorICAgPGNsYXNzPlNldHRpbmdzUGFnZTwvY2xhc3M+CisgICA8ZXh0ZW5kcz5RV2lkZ2V0PC9leHRlbmRzPgorICAgPGhlYWRlcj5hbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS5oPC9oZWFkZXI+CisgICA8Y29udGFpbmVyPjE8L2NvbnRhaW5lcj4KKyAgPC9jdXN0b213aWRnZXQ+CisgIDxjdXN0b213aWRnZXQ+CisgICA8Y2xhc3M+TG9jYXRpb25QYWdlPC9jbGFzcz4KKyAgIDxleHRlbmRzPlFXaWRnZXQ8L2V4dGVuZHM+CisgICA8aGVhZGVyPmFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9sb2NhdGlvbi1wYWdlLmg8L2hlYWRlcj4KKyAgIDxjb250YWluZXI+MTwvY29udGFpbmVyPgorICA8L2N1c3RvbXdpZGdldD4KKyAgPGN1c3RvbXdpZGdldD4KKyAgIDxjbGFzcz5WaXJ0dWFsU2Vuc29yc1BhZ2U8L2NsYXNzPgorICAgPGV4dGVuZHM+UVdpZGdldDwvZXh0ZW5kcz4KKyAgIDxoZWFkZXI+YW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLmg8L2hlYWRlcj4KKyAgIDxjb250YWluZXI+MTwvY29udGFpbmVyPgorICA8L2N1c3RvbXdpZGdldD4KKyA8L2N1c3RvbXdpZGdldHM+CisgPHRhYnN0b3BzPgorICA8dGFic3RvcD5sb2NhdGlvbkJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+Y2VsbHVsYXJCdXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPmJhdHRlcnlCdXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPnRlbGVwaG9uZUJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+ZHBhZEJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+ZmluZ2VyQnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD5zZXR0aW5nc0J1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+aGVscEJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+c3BhY2VyMkJ1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+c3BhY2VyMUJ1dHRvbjwvdGFic3RvcD4KKyA8L3RhYnN0b3BzPgorIDxyZXNvdXJjZXM+CisgIDxpbmNsdWRlIGxvY2F0aW9uPSJyZXNvdXJjZXMucXJjIi8+CisgPC9yZXNvdXJjZXM+CisgPGNvbm5lY3Rpb25zLz4KKzwvdWk+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tQm9sZC50dGYgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tQm9sZC50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlYzIxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ZvbnRzL1JvYm90by1Cb2xkLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tTWVkaXVtLnR0ZiBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ZvbnRzL1JvYm90by1NZWRpdW0udHRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTgzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tTWVkaXVtLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tUmVndWxhci50dGYgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9mb250cy9Sb2JvdG8tUmVndWxhci50dGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5YTZjNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ZvbnRzL1JvYm90by1SZWd1bGFyLnR0ZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC1jYW52YXMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtY2FudmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGVkNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtY2FudmFzLmNwcApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC1jYW52YXMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC1jb21tb24uaCIKKyNpbmNsdWRlICJHTEVTMi9nbDIuaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKK0dMQ2FudmFzOjpHTENhbnZhcyhpbnQgdywgaW50IGgsIGNvbnN0IEdMRVN2MkRpc3BhdGNoKiBnbF9kaXNwYXRjaCkgOgorICAgICAgICAvLyBOb3RlIHRoYXQgd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHBvd2VycyBvZiAyIHRvIGNvbXBseSB3aXRoCisgICAgICAgIC8vIEdMRVMgMi4wCisgICAgICAgIG1XaWR0aCh3ICogMiksCisgICAgICAgIG1IZWlnaHQoaCAqIDIpLAorICAgICAgICBtR0xFUzIoZ2xfZGlzcGF0Y2gpLAorICAgICAgICBtRnJhbWVidWZmZXIoMCksCisgICAgICAgIG1UYXJnZXRUZXh0dXJlKDApLAorICAgICAgICBtRGVwdGhCdWZmZXIoMCkgeworICAgIGFzc2VydCgoKG1XaWR0aCAmIChtV2lkdGggLSAxKSkgPT0gMCkgJiYgKChtSGVpZ2h0ICYgKG1IZWlnaHQgLSAxKSkgPT0gMCkpOworICAgIC8vIENyZWF0ZSBhbmQgYmluZCBmcmFtZWJ1ZmZlciBvYmplY3QuCisgICAgbUdMRVMyLT5nbEdlbkZyYW1lYnVmZmVycygxLCAmbUZyYW1lYnVmZmVyKTsKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWJ1ZmZlciBvYmplY3QiKTsKKyAgICBtR0xFUzItPmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRnJhbWVidWZmZXIpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gYmluZCBmcmFtZWJ1ZmZlciBvYmplY3QiKTsKKworICAgIC8vIENyZWF0ZSBhIHRleHR1cmUgdG8gcmVuZGVyIHRvLgorICAgIG1HTEVTMi0+Z2xHZW5UZXh0dXJlcygxLCAmbVRhcmdldFRleHR1cmUpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRhcmdldCB0ZXh0dXJlIGZvciBGQk8iKTsKKyAgICBtR0xFUzItPmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVRhcmdldFRleHR1cmUpOworICAgIG1HTEVTMi0+Z2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gbWlwbWFwIGxldmVsIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvLyBib3JkZXIsIG11c3QgYmUgMAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvLyBkb24ndCB1cGxvYWQgYW55IGRhdGEsIGp1c3QgYWxsb2NhdGUgc3BhY2UKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIHBvcHVsYXRlIHRhcmdldCB0ZXh0dXJlIik7CisgICAgbUdMRVMyLT5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFX1dSQVBfUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBtR0xFUzItPmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfV1JBUF9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0NMQU1QX1RPX0VER0UpOworICAgIG1HTEVTMi0+Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSX01JUE1BUF9MSU5FQVIpOworICAgIG1HTEVTMi0+Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICBtR0xFUzItPmdsRnJhbWVidWZmZXJUZXh0dXJlMkQoR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0NPTE9SX0FUVEFDSE1FTlQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0VGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7IC8vIG1pcG1hcCBsZXZlbCwgbXVzdCBiZSAwCisgICAgQ0hFQ0tfR0xfRVJST1IoIkZhaWxlZCB0byBzZXQgRkJPIGNvbG9yIGF0dGFjaG1lbnQiKTsKKworICAgIC8vIENyZWF0ZSBhIGRlcHRoIGJ1ZmZlciBmb3IgdGhlIEZCTy4KKyAgICBtR0xFUzItPmdsR2VuUmVuZGVyYnVmZmVycygxLCAmbURlcHRoQnVmZmVyKTsKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBkZXB0aCBidWZmZXIiKTsKKyAgICBtR0xFUzItPmdsQmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIG1EZXB0aEJ1ZmZlcik7CisgICAgbUdMRVMyLT5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xfUkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RFUFRIX0NPTVBPTkVOVDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KCkpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZXB0aCBidWZmZXIiKTsKKyAgICBtR0xFUzItPmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RFUFRIX0FUVEFDSE1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlcHRoQnVmZmVyKTsKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIGF0dGFjaCBkZXB0aCBidWZmZXIgdG8gRkJPIik7CisgICAgbUdMRVMyLT5nbEJpbmRSZW5kZXJidWZmZXIoR0xfUkVOREVSQlVGRkVSLCAwKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IEZCTyBpcyB2YWxpZC4KKyAgICBHTGVudW0gZmJfc3RhdHVzID0gbUdMRVMyLT5nbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpOworICAgIGlmIChmYl9zdGF0dXMgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGQk8gbm90IGNvbXBsZXRlIik7CisgICAgfQorCisgICAgLy8gUmVzdG9yZSB0aGUgZGVmYXVsdCBmcmFtZS1idWZmZXIuCisgICAgbUdMRVMyLT5nbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Cit9CisKK0dMQ2FudmFzOjp+R0xDYW52YXMoKSB7CisgICAgaWYgKG1GcmFtZWJ1ZmZlcikgeworICAgICAgICBtR0xFUzItPmdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtRnJhbWVidWZmZXIpOworICAgICAgICBtRnJhbWVidWZmZXIgPSAwOworICAgIH0KKworICAgIGlmIChtVGFyZ2V0VGV4dHVyZSkgeworICAgICAgICBtR0xFUzItPmdsRGVsZXRlVGV4dHVyZXMoMSwgJm1UYXJnZXRUZXh0dXJlKTsKKyAgICAgICAgbVRhcmdldFRleHR1cmUgPSAwOworICAgIH0KKworICAgIGlmIChtRGVwdGhCdWZmZXIpIHsKKyAgICAgICAgbUdMRVMyLT5nbERlbGV0ZVJlbmRlcmJ1ZmZlcnMoMSwgJm1EZXB0aEJ1ZmZlcik7CisgICAgICAgIG1EZXB0aEJ1ZmZlciA9IDA7CisgICAgfQorfQorCit2b2lkIEdMQ2FudmFzOjpiaW5kKCkgeworICAgIG1HTEVTMi0+Z2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GcmFtZWJ1ZmZlcik7CisgICAgbUdMRVMyLT5nbFZpZXdwb3J0KDAsIDAsIHdpZHRoKCksIGhlaWdodCgpKTsKK30KKwordm9pZCBHTENhbnZhczo6dW5iaW5kKCkgeworICAgIG1HTEVTMi0+Z2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtY2FudmFzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC1jYW52YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRiOTkwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtY2FudmFzLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiCisKKy8vIFRoaXMgaXMgYSAyRCBSR0IgdGV4dHVyZSB0aGF0IGNhbiBiZSByZW5kZXJlZCB0by4KK2NsYXNzIEdMQ2FudmFzIHsKK3B1YmxpYzoKKyAgICBHTENhbnZhcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IEdMRVN2MkRpc3BhdGNoKiBnbF9kaXNwYXRjaCk7CisgICAgfkdMQ2FudmFzKCk7CisKKyAgICAvLyBXaWR0aCBvZiB0aGUgdGV4dHVyZSBpbiBwaXhlbHMuCisgICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4gbVdpZHRoOyB9CisKKyAgICAvLyBIZWlnaHQgb2YgdGhlIHRleHRydXJlIGluIHBpeGVscy4KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgdW5kZXJseWluZyBPcGVuR0wgdGV4dHVyZSBvYmplY3QuCisgICAgR0x1aW50IHRleHR1cmUoKSBjb25zdCB7IHJldHVybiBtVGFyZ2V0VGV4dHVyZTsgfQorCisgICAgLy8gQWxsIHJlbmRlcmluZyBvcGVyYXRpb25zIGZvbGxvd2luZyBhIGNhbGwgdG8gYmluZCgpCisgICAgLy8gYmUgcGVyZm9ybWVkIG9uIHRoZSB1bmRlcmx5aW5nIHRleHR1cmUsIHVudGlsIHVuYmluZCgpIGlzCisgICAgLy8gY2FsbGVkIG9uIHRoZSBzYW1lIGluc3RhbmNlLCBvciBiaW5kKCkgaXMgY2FsbGVkIG9uIHNvbWUKKyAgICAvLyBvdGhlciBHTENhbnZhcyBpbnN0YW5jZS4KKyAgICB2b2lkIGJpbmQoKTsKKworICAgIC8vIFVuYmluZCB0aGUgY2FudmFzLgorICAgIHZvaWQgdW5iaW5kKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBjb25zdCBHTEVTdjJEaXNwYXRjaCogbUdMRVMyOworICAgIEdMdWludCBtRnJhbWVidWZmZXI7CisgICAgR0x1aW50IG1UYXJnZXRUZXh0dXJlOworICAgIEdMdWludCBtRGVwdGhCdWZmZXI7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtY29tbW9uLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLWNvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1ZDYxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLWNvbW1vbi5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC1jb21tb24uaCIKKworI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlIDxRdEdsb2JhbD4KKworR0x1aW50IGNyZWF0ZVNoYWRlcihjb25zdCBHTEVTdjJEaXNwYXRjaCogZ2xlczIsCisgICAgICAgICAgICAgICAgICAgIEdMaW50IHNoYWRlcl90eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzaGFkZXJfY29kZSkgeworICAgIEdMdWludCBzaGFkZXIgPSBnbGVzMi0+Z2xDcmVhdGVTaGFkZXIoc2hhZGVyX3R5cGUpOworICAgIGlmICghc2hhZGVyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBHTGNoYXIqIHRleHQgPSBzdGF0aWNfY2FzdDxjb25zdCBHTGNoYXIqPihzaGFkZXJfY29kZSk7CisgICAgY29uc3QgR0xpbnQgdGV4dF9sZW4gPSBzdHJsZW4oc2hhZGVyX2NvZGUpOworICAgIGdsZXMyLT5nbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZ0ZXh0LCAmdGV4dF9sZW4pOworICAgIGdsZXMyLT5nbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKKyAgICBHTGludCBzdWNjZXNzOworICAgIGdsZXMyLT5nbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdWNjZXNzKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBHTF9GQUxTRSkgeworICAgICAgICBjaGFyIG1zZ3NbMjU2XTsKKyAgICAgICAgZ2xlczItPmdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIHNpemVvZihtc2dzKSwgbnVsbHB0ciwgbXNncyk7CisgICAgICAgIHFXYXJuaW5nKCJFcnJvciBjb21waWxpbmcgJXMgc2hhZGVyOiAlcyIsCisgICAgICAgICAgICAgICAgIHNoYWRlcl90eXBlID09IEdMX1ZFUlRFWF9TSEFERVIgPyAidmVydGV4IiA6ICJmcmFnbWVudCIsCisgICAgICAgICAgICAgICAgIG1zZ3MpOworICAgIH0KKyAgICByZXR1cm4gc3VjY2VzcyA9PSBHTF9UUlVFID8gc2hhZGVyIDogMDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC1jb21tb24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2U0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC1jb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkdMRVMyL2dsMi5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YyRGlzcGF0Y2guaCIKKworI2luY2x1ZGUgPGNzdGRpbz4KKworLy8gSGVscGVyIG1hY3JvIGZvciBjaGVja2luZyBlcnJvciBzdGF0dXMgYW5kIGNsZWFuaW5nIHVwLgorI2RlZmluZSBDSEVDS19HTF9FUlJPUihlcnJvcl9tc2cpIFwKKyAgICBpZiAobUdMRVMyLT5nbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IpIHsgIFwKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIGVycm9yX21zZyk7IFwKKyAgICAgICAgcmV0dXJuOyBcCisgICAgfQorCisjZGVmaW5lIENIRUNLX0dMX0VSUk9SX1JFVFVSTihlcnJvcl9tc2csIHJldHZhbCkgXAorICAgIGlmIChtR0xFUzItPmdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUikgeyAgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgZXJyb3JfbXNnKTsgXAorICAgICAgICByZXR1cm4gKHJldHZhbCk7IFwKKyAgICB9CisKK0dMdWludCBjcmVhdGVTaGFkZXIoY29uc3QgR0xFU3YyRGlzcGF0Y2gqIGdsZXMyLAorICAgICAgICAgICAgICAgICAgICBHTGludCBzaGFkZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2hhZGVyX2NvZGUpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtdGV4dHVyZS1kcmF3LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLXRleHR1cmUtZHJhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwN2QyNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLXRleHR1cmUtZHJhdy5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZ2wtdGV4dHVyZS1kcmF3LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZ2wtY29tbW9uLmgiCisjaW5jbHVkZSAiR0xFUzIvZ2wyLmgiCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorCisvLyBWZXJ0ZXggc2hhZGVyIGZvciBhbnRpLWFsaWFzaW5nIC0gZG9lc24ndCBkbyBhbnl0aGluZyBzcGVjaWFsLgorc3RhdGljIGNvbnN0IGNoYXIgVmVydGV4U2hhZGVyU291cmNlW10gPSBSIigKKyAgICBhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsKKyAgICB2b2lkIG1haW4odm9pZCkgeworICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgMC4wLCAxLjApOworICAgIH0pIjsKKworLy8gRnJhZ21lbnQgc2hhZGVyCitzdGF0aWMgY29uc3QgY2hhciBGcmFnbWVudFNoYWRlclNvdXJjZVtdID0gUiIoCisgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CisgICAgdW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTsKKyAgICB1bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjsKKyAgICB2b2lkIG1haW4odm9pZCkgeworICAgICAgICB2ZWMyIHBpeGVsX2Nvb3JkID0gZ2xfRnJhZ0Nvb3JkLnh5OworICAgICAgICB2ZWMyIGludmVyc2VfcmVzID0gMS4wIC8gcmVzb2x1dGlvbjsKKyAgICAgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIGludmVyc2VfcmVzICogcGl4ZWxfY29vcmQpOworICAgIH0KKykiOworCitUZXh0dXJlRHJhdzo6VGV4dHVyZURyYXcoY29uc3QgR0xFU3YyRGlzcGF0Y2gqIGdsX2Rpc3BhdGNoKSA6CisgICAgICAgIG1HTEVTMihnbF9kaXNwYXRjaCksCisgICAgICAgIG1Qcm9ncmFtKDApLAorICAgICAgICBtVmVydGV4QnVmZmVyKDApIHsKKyAgICBHTHVpbnQgdmVydGV4X3NoYWRlciA9CisgICAgICAgICAgICBjcmVhdGVTaGFkZXIobUdMRVMyLCBHTF9WRVJURVhfU0hBREVSLCBWZXJ0ZXhTaGFkZXJTb3VyY2UpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHZlcnRleCBzaGFkZXIiKTsKKyAgICBHTHVpbnQgZnJhZ21lbnRfc2hhZGVyID0KKyAgICAgICAgICAgIGNyZWF0ZVNoYWRlcihtR0xFUzIsIEdMX0ZSQUdNRU5UX1NIQURFUiwgRnJhZ21lbnRTaGFkZXJTb3VyY2UpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIGZyYWdtZW50IHNoYWRlciIpOworCisgICAgbVByb2dyYW0gPSBtR0xFUzItPmdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHByb2dyYW0gb2JqZWN0Iik7CisgICAgbUdMRVMyLT5nbEF0dGFjaFNoYWRlcihtUHJvZ3JhbSwgdmVydGV4X3NoYWRlcik7CisgICAgbUdMRVMyLT5nbEF0dGFjaFNoYWRlcihtUHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTsKKyAgICBtR0xFUzItPmdsTGlua1Byb2dyYW0obVByb2dyYW0pOworCisgICAgLy8gU2hhZGVyIG9iamVjdHMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICBtR0xFUzItPmdsRGVsZXRlU2hhZGVyKHZlcnRleF9zaGFkZXIpOworICAgIG1HTEVTMi0+Z2xEZWxldGVTaGFkZXIoZnJhZ21lbnRfc2hhZGVyKTsKKworICAgIC8vIENoZWNrIGZvciBlcnJvcnMuCisgICAgR0xpbnQgc3VjY2VzczsKKyAgICBtR0xFUzItPmdsR2V0UHJvZ3JhbWl2KG1Qcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJnN1Y2Nlc3MpOworICAgIGlmIChzdWNjZXNzID09IEdMX0ZBTFNFKSB7CisgICAgICAgIEdMY2hhciBpbmZvbG9nWzI1Nl07CisgICAgICAgIG1HTEVTMi0+Z2xHZXRQcm9ncmFtSW5mb0xvZyhtUHJvZ3JhbSwgc2l6ZW9mKGluZm9sb2cpLCAwLCBpbmZvbG9nKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY3JlYXRlL2xpbmsgcHJvZ3JhbTogJXNcbiIsIGluZm9sb2cpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IGFsbCB0aGUgYXR0cmlidXRlcyBhbmQgdW5pZm9ybXMuCisgICAgbVBvc2l0aW9uQXR0cmliTG9jYXRpb24gPQorICAgICAgICAgICAgbUdMRVMyLT5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAicG9zaXRpb24iKTsKKyAgICBtSW5wdXRVbmlmb3JtTG9jYXRpb24gPQorICAgICAgICAgICAgbUdMRVMyLT5nbEdldFVuaWZvcm1Mb2NhdGlvbihtUHJvZ3JhbSwgInRleHR1cmUiKTsKKyAgICBtUmVzb2x1dGlvblVuaWZvcm1Mb2NhdGlvbiA9CisgICAgICAgICAgICBtR0xFUzItPmdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAicmVzb2x1dGlvbiIpOworICAgIENIRUNLX0dMX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IGF0dHJpYnV0ZXMgJiB1bmlmb3JtcyBmb3Igc2hhZGVyIik7CisKKyAgICAvLyBDcmVhdGUgdmVydGV4IGFuZCBpbmRleCBidWZmZXJzLgorICAgIG1HTEVTMi0+Z2xHZW5CdWZmZXJzKDEsICZtVmVydGV4QnVmZmVyKTsKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB2ZXJ0ZXggYnVmZmVyIGZvciBhbnRpLWFsaWFzaW5nIHNoYWRlciIpOworCisgICAgbUdMRVMyLT5nbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyKTsKKworICAgIC8vIFRoaXMgaXMgYSByaWdodCB0cmlhbmdsZSB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBzY3JlZW4uCisgICAgLy8gVGhlIHNjcmVlbiBmaXRzIGludG8gdGhlIHRyaWFuZ2xlIHNvIHRoYXQgaXRzIGJvdHRvbSBsZWZ0CisgICAgLy8gY29ybmVyIGNvaW5jaWRlcyB3aXRoIHRoZSB2ZXJ0ZXggYXQgdGhlIDkwLWRlZ3JlZSBhbmdsZQorICAgIC8vIGFuZCB0aGUgdG9wLXJpZ2h0IGNvcm5lciBsaWVzIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGh5cG90aGVudXNlLgorICAgIC8vICgwLCAwKSBpcyBhdCB0aGUgY2VudGVyIG9mIHRoZSBzY3JlZW4gcmVjdGFuZ2xlLgorICAgIHN0YXRpYyBjb25zdCBmbG9hdCB2ZXJ0ZXhfZGF0YVtdID0geworICAgICAgICAtMS4wLCAtMS4wLAorICAgICAgICAzLjAsIC0xLjAsCisgICAgICAgIC0xLjAsIDMuMCwKKyAgICB9OworICAgIG1HTEVTMi0+Z2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodmVydGV4X2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1NUQVRJQ19EUkFXKTsKKyAgICBDSEVDS19HTF9FUlJPUigiRmFpbGVkIHRvIHBvcHVsYXRlIHZlcnRleCBidWZmZXIiKTsKK30KKworVGV4dHVyZURyYXc6On5UZXh0dXJlRHJhdygpIHsKKyAgICBpZiAobVByb2dyYW0pIHsKKyAgICAgICAgbUdMRVMyLT5nbFVzZVByb2dyYW0oMCk7CisgICAgICAgIG1HTEVTMi0+Z2xEZWxldGVQcm9ncmFtKG1Qcm9ncmFtKTsKKyAgICAgICAgbVByb2dyYW0gPSAwOworICAgIH0KKworICAgIGlmIChtVmVydGV4QnVmZmVyKSB7CisgICAgICAgIG1HTEVTMi0+Z2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgMCk7CisgICAgICAgIG1HTEVTMi0+Z2xEZWxldGVCdWZmZXJzKDEsICZtVmVydGV4QnVmZmVyKTsKKyAgICAgICAgbVZlcnRleEJ1ZmZlciA9IDA7CisgICAgfQorfQorCit2b2lkIFRleHR1cmVEcmF3OjpkcmF3KEdMdWludCBpbnB1dF90ZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAvLyBEcmF3IHRleHR1cmUgb24tc2NyZWVuLCBhcHBseWluZyB0aGUgYW50aS1hbGlhc2luZyBzaGFkZXIuCisgICAgbUdMRVMyLT5nbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9ERVBUSF9CVUZGRVJfQklUKTsKKyAgICBtR0xFUzItPmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7CisgICAgbUdMRVMyLT5nbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyKTsKKyAgICBtR0xFUzItPmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVBvc2l0aW9uQXR0cmliTG9jYXRpb24pOworICAgIG1HTEVTMi0+Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1Qb3NpdGlvbkF0dHJpYkxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIC8vIGNvbXBvbmVudHMgcGVyIGF0dHJpYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZMT0FULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8vIHN0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvLyBvZmZzZXQKKyAgICBtR0xFUzItPmdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisgICAgbUdMRVMyLT5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGlucHV0X3RleHR1cmUpOworICAgIG1HTEVTMi0+Z2xVbmlmb3JtMWkobUlucHV0VW5pZm9ybUxvY2F0aW9uLCAwKTsKKyAgICBtR0xFUzItPmdsVW5pZm9ybTJmKG1SZXNvbHV0aW9uVW5pZm9ybUxvY2F0aW9uLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBtR0xFUzItPmdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtdGV4dHVyZS1kcmF3LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC10ZXh0dXJlLWRyYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNkMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtdGV4dHVyZS1kcmF3LmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiCisKKy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBuZWNlc3NhcnkgdG8gZHJhdyB0aGUKKy8vIGNvbnRlbnRzIG9mIHRoZSB0ZXh0dXJlIG9uIHNjcmVlbi4KK2NsYXNzIFRleHR1cmVEcmF3IHsKK3B1YmxpYzoKKyAgICAvLyB8Z2xfZGlzcGF0Y2h8IGlzIHRoZSBHTCBFUyAyIGRpc3BhdGNoIHRhYmxlLgorICAgIGV4cGxpY2l0IFRleHR1cmVEcmF3KGNvbnN0IEdMRVN2MkRpc3BhdGNoKiBnbF9kaXNwYXRjaCk7CisKKyAgICAvLyBGcmVlcyB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGluc3RhbmNlLgorICAgIH5UZXh0dXJlRHJhdygpOworCisgICAgLy8gUmVuZGVycyB0aGUgY29udGVudHMgb2YgMkQgfGlucHV0X3RleHR1cmV8IG9uIHNjcmVlbgorICAgIC8vIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdGV4dHVyZS4KKyAgICB2b2lkIGRyYXcoR0x1aW50IGlucHV0X3RleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgR0xFU3YyRGlzcGF0Y2gqIG1HTEVTMjsKKyAgICBHTHVpbnQgbVByb2dyYW07CisgICAgR0x1aW50IG1WZXJ0ZXhCdWZmZXI7CisgICAgR0x1aW50IG1JbnB1dFVuaWZvcm1Mb2NhdGlvbjsKKyAgICBHTHVpbnQgbVJlc29sdXRpb25Vbmlmb3JtTG9jYXRpb247CisgICAgR0x1aW50IG1Qb3NpdGlvbkF0dHJpYkxvY2F0aW9uOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtd2lkZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E4OTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvZ2wtd2lkZ2V0LmNwcApAQCAtMCwwICsxLDMxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisKKyNpbmNsdWRlICJHTEVTMi9nbDIuaCIKKworI2luY2x1ZGUgPFFSZXNpemVFdmVudD4KKyNpbmNsdWRlIDxRdEdsb2JhbD4KKyNpbmNsdWRlIDxRV2luZG93PgorCisvLyBOb3RlIHRoYXQgdGhpcyBoZWFkZXIgbXVzdCBjb21lIGFmdGVyIEFMTCBRdCBoZWFkZXJzLgorLy8gSW5jbHVkaW5nIGFueSBRdCBoZWFkZXJzIGFmdGVyIGl0IHdpbGwgY2F1c2UgY29tcGlsYXRpb24KKy8vIHRvIGZhaWwgc3BlY3RhY3VsYXJseS4gVGhpcyBpcyBiZWNhdXNlIEVHTCBpbmRpcmVjdGx5CisvLyBpbmNsdWRlcyBYMTEgaGVhZGVycyB3aGljaCBkZWZpbmUgc3R1ZmYgdGhhdCBjb25mbGljdHMKKy8vIHdpdGggUXQncyBvd24gbWFjcm9zLiBJdCBpcyBhIGtub3duIGlzc3VlLgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBjbGFzcyB0byBob2xkIGEgZ2xvYmFsIEdMRVN2MkRpc3BhdGNoIHRoYXQgaXMgaW5pdGlhbGl6ZWQgbGF6aWx5CisvLyBpbiBhIHRocmVhZC1zYWZlIHdheS4gVGhlIGluc3RhbmNlIGlzIGxlYWtlZCBvbiBwcm9ncmFtIGV4aXQuCitzdHJ1Y3QgTXlHTEVTdjJEaXNwYXRjaCA6IHB1YmxpYyBHTEVTdjJEaXNwYXRjaCB7CisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gZ2xvYmFsIEdMRVN2MkRpc3BhdGNoIGluc3RhbmNlLCBvciBudWxscHRyIGlmIHRoZXJlCisgICAgLy8gd2FzIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGluaXRpYWxpemUvbG9hZCB0aGUgbGlicmFyeS4KKyAgICBzdGF0aWMgY29uc3QgR0xFU3YyRGlzcGF0Y2gqIGdldCgpOworCisgICAgTXlHTEVTdjJEaXNwYXRjaCgpIHsgbVZhbGlkID0gZ2xlczJfZGlzcGF0Y2hfaW5pdCgmbURpc3BhdGNoKTsgfQorCitwcml2YXRlOgorICAgIEdMRVN2MkRpc3BhdGNoIG1EaXNwYXRjaDsKKyAgICBib29sIG1WYWxpZDsKK307CisKKy8vIE11c3QgYmUgZGVjbGFyZWQgb3V0c2lkZSBvZiBNeUdMRVN2MkRpc3BhdGNoIHNjb3BlIGR1ZSB0byB0aGUgdXNlIG9mCisvLyBzaXplb2YoVCkgd2l0aGluIHRoZSB0ZW1wbGF0ZSBkZWZpbml0aW9uLgorYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPE15R0xFU3YyRGlzcGF0Y2g+IHNHTEVTdjJEaXNwYXRjaCA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworLy8gc3RhdGljCitjb25zdCBHTEVTdjJEaXNwYXRjaCogTXlHTEVTdjJEaXNwYXRjaDo6Z2V0KCkgeworICAgIE15R0xFU3YyRGlzcGF0Y2gqIGluc3RhbmNlID0gc0dMRVN2MkRpc3BhdGNoLnB0cigpOworICAgIGlmIChpbnN0YW5jZS0+bVZhbGlkKSB7CisgICAgICAgIHJldHVybiAmaW5zdGFuY2UtPm1EaXNwYXRjaDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKKy8vIEhlbHBlciBjbGFzcyB1c2VkIHRvIGxhemlseSBpbml0aWFsaXplIHRoZSBnbG9iYWwgRUdMIGRpc3BhdGNoIHRhYmxlCisvLyBpbiBhIHRocmVhZCBzYWZlIHdheS4gTm90ZSB0aGF0IHRoZSBkaXNwYXRjaCB0YWJsZSBpcyBwcm92aWRlZCBieQorLy8gbGliT3BlbkdMRVNEaXNwYXRjaCBhcyB0aGUgJ3NfZWdsJyBnbG9iYWwgdmFyaWFibGUuCitzdHJ1Y3QgTXlFR0xEaXNwYXRjaCA6IHB1YmxpYyBFR0xEaXNwYXRjaCB7CisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gRUdMRGlzcGF0Y2ggdGFibGUsIG9yIG51bGxwdHIgaWYgdGhlcmUgd2FzCisgICAgLy8gYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gaW5pdGlhbGl6ZS9sb2FkIHRoZSBsaWJyYXJ5LgorICAgIHN0YXRpYyBjb25zdCBFR0xEaXNwYXRjaCogZ2V0KCk7CisKKyAgICBNeUVHTERpc3BhdGNoKCkgeyBtVmFsaWQgPSBpbml0X2VnbF9kaXNwYXRjaCgpOyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7Cit9OworCithbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U8TXlFR0xEaXNwYXRjaD4gc0VHTERpc3BhdGNoID0gTEFaWV9JTlNUQU5DRV9JTklUOworCisvLyBzdGF0aWMKK2NvbnN0IEVHTERpc3BhdGNoKiBNeUVHTERpc3BhdGNoOjpnZXQoKSB7CisgICAgTXlFR0xEaXNwYXRjaCogaW5zdGFuY2UgPSBzRUdMRGlzcGF0Y2gucHRyKCk7CisgICAgaWYgKGluc3RhbmNlLT5tVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuICZzX2VnbDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgRUdMU3RhdGUgeworICAgIEVHTERpc3BsYXkgZGlzcGxheTsKKyAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworfTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbmVhcmVzdCBwb3dlci1vZi10d28uCisvLyBJdCdzIG5lZWRlZCB0byBjcmVhdGUgYSBHTENhbnZhcyB3aXRoIGNvcnJlY3QgZGltZW5zaW9ucworLy8gdG8gYWxsb3cgZ2VuZXJhdGluZyBtaXBtYXBzIChHTEVTIDIuMCBkb2Vzbid0IHN1cHBvcnQKKy8vIG1pcG1hcHMgZm9yIE5QT1QgdGV4dHVyZXMpCitzdGF0aWMgaW50IG5lYXJlc3RQT1QoaW50IHZhbHVlKSB7CisgICAgcmV0dXJuIHBvdygyLCBjZWlsKGxvZyh2YWx1ZSkvbG9nKDIpKSk7Cit9CisKK0dMV2lkZ2V0OjpHTFdpZGdldChRV2lkZ2V0KiBwYXJlbnQpIDoKKyAgICAgICAgUVdpZGdldChwYXJlbnQpLAorICAgICAgICBtRUdMKE15RUdMRGlzcGF0Y2g6OmdldCgpKSwKKyAgICAgICAgbUdMRVMyKE15R0xFU3YyRGlzcGF0Y2g6OmdldCgpKSwKKyAgICAgICAgbUVHTFN0YXRlKG51bGxwdHIpLAorICAgICAgICBtVmFsaWQoZmFsc2UpLAorICAgICAgICBtRW5hYmxlQUEoZmFsc2UpIHsKKyAgICBzZXRBdXRvRmlsbEJhY2tncm91bmQoZmFsc2UpOworICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfT3BhcXVlUGFpbnRFdmVudCwgdHJ1ZSk7CisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9QYWludE9uU2NyZWVuLCB0cnVlKTsKKyAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX05vU3lzdGVtQmFja2dyb3VuZCwgdHJ1ZSk7CisKKyAgICAvLyBRR0xXaWRnZXQgYWx3YXlzIGhhcyBhIG5hdGl2ZSB3aW5kb3csIGFuZCBvdXJzIHNob3VsZCBiZWhhdmUKKyAgICAvLyBpbiBhIHNpbWlsYXIgZmFzaGlvbiBhcyB3ZWxsLiBOb3QgaGF2aW5nIHRoZXNlIGF0dHJpYnV0ZXMgc2V0CisgICAgLy8gY2F1c2VzIGlzc3VlcyB3aXRoIHRoZSB3aW5kb3cgaW5pdGlhbGl6YXRpb24uCisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9Eb250Q3JlYXRlTmF0aXZlQW5jZXN0b3JzLCB0cnVlKTsKKyAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX05hdGl2ZVdpbmRvdywgdHJ1ZSk7Cit9CisKK3ZvaWQgR0xXaWRnZXQ6OmhhbmRsZVNjcmVlbkNoYW5nZShRU2NyZWVuKikgeworICAgIC8vIERlc3Ryb3kgdGhlIGNvbnRleHQsIGZvcmNpbmcgaXRzIHJlLWNyZWF0aW9uIG9uCisgICAgLy8gbmV4dCBwYWludCBldmVudC4KKyAgICBkZXN0cm95Q29udGV4dCgpOworICAgIHJlc2l6ZUdMKHJlYWxQaXhlbHNXaWR0aCgpLCByZWFsUGl4ZWxzSGVpZ2h0KCkpOworfQorCitib29sIEdMV2lkZ2V0OjplbnN1cmVJbml0KCkgeworICAgIC8vIElmIGFuIGVycm9yIG9jY3VyZWQgd2hlbiBsb2FkaW5nIHRoZSBFR0wvR0xFU3YyIGxpYnJhcmllcywgcmV0dXJuIGZhbHNlLgorICAgIGlmICghbUVHTCB8fCAhbUdMRVMyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJZiBhbHJlYWR5IGluaXRpYWxpemVkLCByZXR1cm4gbVZhbGlkIHRvIGluZGljYXRlIGlmIGFuIGVycm9yIG9jY3VyZWQuCisgICAgaWYgKG1FR0xTdGF0ZSkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIG1FR0xTdGF0ZSA9IG5ldyBFR0xTdGF0ZSgpOworICAgIG1WYWxpZCA9IGZhbHNlOworCisgICAgbUVHTFN0YXRlLT5kaXNwbGF5ID0gbUVHTC0+ZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKKyAgICBpZiAobUVHTFN0YXRlLT5kaXNwbGF5ID09IEVHTF9OT19ESVNQTEFZKSB7CisgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gZ2V0IEVHTCBkaXNwbGF5OiBFR0wgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICBtRUdMLT5lZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVHTGludCBlZ2xfbWFqLCBlZ2xfbWluOworICAgIEVHTENvbmZpZyBlZ2xfY29uZmlnOworCisgICAgLy8gVHJ5IHRvIGluaXRpYWxpemUgRUdMIGRpc3BsYXkuCisgICAgLy8gSW5pdGlhbGl6aW5nIGFuIGFscmVhZHktaW5pdGlhbGl6ZWQgZGlzcGxheSBpcyBPSy4KKyAgICBpZiAobUVHTC0+ZWdsSW5pdGlhbGl6ZShtRUdMU3RhdGUtPmRpc3BsYXksICZlZ2xfbWFqLCAmZWdsX21pbikgPT0KKyAgICAgICAgRUdMX0ZBTFNFKSB7CisgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBFR0wgZGlzcGxheTogRUdMIGVycm9yICVkIiwKKyAgICAgICAgICAgICAgICAgbUVHTC0+ZWdsR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBHZXQgYW4gRUdMIGNvbmZpZy4KKyAgICBjb25zdCBFR0xpbnQgY29uZmlnX2F0dHJpYnNbXSA9IHtFR0xfU1VSRkFDRV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX09QRU5HTF9FUzJfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9SRURfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAvLyBObyBtdWx0aXNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OworICAgIEVHTGludCBudW1fY29uZmlnOworICAgIEVHTEJvb2xlYW4gY2hvb3NlX3Jlc3VsdCA9IG1FR0wtPmVnbENob29zZUNvbmZpZygKKyAgICAgICAgICAgIG1FR0xTdGF0ZS0+ZGlzcGxheSwgY29uZmlnX2F0dHJpYnMsICZlZ2xfY29uZmlnLCAxLCAmbnVtX2NvbmZpZyk7CisgICAgaWYgKGNob29zZV9yZXN1bHQgPT0gRUdMX0ZBTFNFIHx8IG51bV9jb25maWcgPCAxKSB7CisgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gY2hvb3NlIEVHTCBjb25maWc6IEVHTCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgIG1FR0wtPmVnbEdldEVycm9yKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgY29udGV4dC4KKyAgICBFR0xpbnQgY29udGV4dF9hdHRyaWJzW10gPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FfTsKKyAgICBtRUdMU3RhdGUtPmNvbnRleHQgPSBtRUdMLT5lZ2xDcmVhdGVDb250ZXh0KAorICAgICAgICAgICAgbUVHTFN0YXRlLT5kaXNwbGF5LCBlZ2xfY29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKKyAgICBpZiAobUVHTFN0YXRlLT5jb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHFXYXJuaW5nKCJGYWlsZWQgdG8gY3JlYXRlIEVHTCBjb250ZXh0ICVkIiwgbUVHTC0+ZWdsR2V0RXJyb3IoKSk7CisgICAgfQorCisgICAgLy8gRmluYWxseSwgY3JlYXRlIGEgd2luZG93IHN1cmZhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2lkZ2V0LgorICAgIG1FR0xTdGF0ZS0+c3VyZmFjZSA9IG1FR0wtPmVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoCisgICAgICAgICAgICBtRUdMU3RhdGUtPmRpc3BsYXksIGVnbF9jb25maWcsIChFR0xOYXRpdmVXaW5kb3dUeXBlKSh3aW5JZCgpKSwKKyAgICAgICAgICAgIG51bGxwdHIpOworICAgIGlmIChtRUdMU3RhdGUtPnN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBjcmVhdGUgYW4gRUdMIHN1cmZhY2UgJWQiLCBtRUdMLT5lZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgbUNhbnZhcy5yZXNldChuZXcgR0xDYW52YXMoCisgICAgICAgIG5lYXJlc3RQT1QocmVhbFBpeGVsc1dpZHRoKCkpLAorICAgICAgICBuZWFyZXN0UE9UKHJlYWxQaXhlbHNIZWlnaHQoKSksCisgICAgICAgIG1HTEVTMikpOworICAgIG1UZXh0dXJlRHJhdy5yZXNldChuZXcgVGV4dHVyZURyYXcobUdMRVMyKSk7CisgICAgbVZhbGlkID0gaW5pdEdMKCk7CisKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEdMV2lkZ2V0OjptYWtlQ29udGV4dEN1cnJlbnQoKSB7CisgICAgaWYgKG1FR0xTdGF0ZSkgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1FR0wtPmVnbE1ha2VDdXJyZW50KG1FR0xTdGF0ZS0+ZGlzcGxheSwgbUVHTFN0YXRlLT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVHTFN0YXRlLT5zdXJmYWNlLCBtRUdMU3RhdGUtPmNvbnRleHQpID09IEVHTF9UUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBHTFdpZGdldDo6cmVuZGVyRnJhbWUoKSB7CisgICAgaWYgKCFyZWFkeUZvclJlbmRlcmluZygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKKyAgICAvLyBSZW5kZXIgM0Qgc2NlbmUgdG8gdGV4dHVyZS4KKyAgICBpZiAobUVuYWJsZUFBKSB7CisgICAgICAgIG1DYW52YXMtPmJpbmQoKTsKKyAgICAgICAgcmVwYWludEdMKCk7CisgICAgICAgIG1DYW52YXMtPnVuYmluZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1HTEVTMi0+Z2xWaWV3cG9ydCgwLCAwLCByZWFsUGl4ZWxzV2lkdGgoKSwgcmVhbFBpeGVsc0hlaWdodCgpKTsKKyAgICAgICAgcmVwYWludEdMKCk7CisgICAgfQorCisgICAgaWYgKG1FbmFibGVBQSkgeworICAgICAgICBtR0xFUzItPmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbUNhbnZhcy0+dGV4dHVyZSgpKTsKKyAgICAgICAgbUdMRVMyLT5nbEdlbmVyYXRlTWlwbWFwKEdMX1RFWFRVUkVfMkQpOworICAgICAgICBtVGV4dHVyZURyYXctPmRyYXcobUNhbnZhcy0+dGV4dHVyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFBpeGVsc1dpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsUGl4ZWxzSGVpZ2h0KCkpOworICAgIH0KKworICAgIG1FR0wtPmVnbFN3YXBCdWZmZXJzKG1FR0xTdGF0ZS0+ZGlzcGxheSwgbUVHTFN0YXRlLT5zdXJmYWNlKTsKK30KKwordm9pZCBHTFdpZGdldDo6cGFpbnRFdmVudChRUGFpbnRFdmVudCopIHsKKyAgICBpZiAoZW5zdXJlSW5pdCgpKSB7CisgICAgICByZW5kZXJGcmFtZSgpOworICAgIH0KK30KKwordm9pZCBHTFdpZGdldDo6c2hvd0V2ZW50KFFTaG93RXZlbnQqKSB7CisgICAgLy8gV2hlbiB0aGUgd2lkZ2V0IGZpcnN0IGJlY29tZXMgdmlzaWJsZSwgd2UgcmVuZGVyIGEgZnJhbWUsCisgICAgLy8gd2hpY2ggd2lsbCBmb3JjZSB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgorICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgd2lkZ2V0IGlzIGFjdHVhbGx5CisgICAgLy8gdmlzaWJsZSBvbiBzY3JlZW4gKGF0IGxlYXN0IGZvciBPUyBYKSBiZWZvcmUgZG9pbmcgYW55CisgICAgLy8gaW5pdGlhbGl6YXRpb24gYXQgYWxsLgorICAgIC8vIEhvd2V2ZXIsIHNob3cgZXZlbnRzIG1heSBiZSBkZWxpdmVyZWQgd2hlbiB0aGUgd2lkZ2V0CisgICAgLy8gaXNuJ3QgdmlzaWJsZSB5ZXQsIHNvIHdlIG5lZWQgYW4gYWRkaXRpb25hbCBjaGVjay4KKyAgICBpZiAoaXNWaXNpYmxlKCkgJiYgIXZpc2libGVSZWdpb24oKS5pc051bGwoKSkgeworICAgICAgICBpZiAoZW5zdXJlSW5pdCgpKSB7CisgICAgICAgICAgICByZW5kZXJGcmFtZSgpOworICAgICAgICB9CisgICAgfQorICAgIGNvbm5lY3Qod2luZG93KCktPndpbmRvd0hhbmRsZSgpLCBTSUdOQUwoc2NyZWVuQ2hhbmdlZChRU2NyZWVuKikpLCB0aGlzLCBTTE9UKGhhbmRsZVNjcmVlbkNoYW5nZShRU2NyZWVuKikpKTsKK30KKwordm9pZCBHTFdpZGdldDo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50KiBlKSB7CisgICAgaWYgKG1FR0xTdGF0ZSkgeworICAgICAgICAvLyBXZSBzaG91bGQgb25seSBjYWxsIHJlc2l6ZUdMIGFuZCByZXBhaW50IGlmIGFsbCB0aGUgc2V0dXAKKyAgICAgICAgLy8gaGFzIGJlZW4gZG9uZS4KKyAgICAgICAgLy8gV2Ugc2hvdWxkIE5PVCBhdHRlbXB0IHRvIGluaXRpYWxpemUgRUdMIHN0YXRlIGR1cmluZyBhIHJlc2l6ZQorICAgICAgICAvLyBldmVudCBkdWUgdG8gc29tZSBzdWJ0bGV0aWVzIG9uIE9TIFguIElmIHdlIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZQorICAgICAgICAvLyBFR0wgc3RhdGUgYXQgdGhlIHRpbWUgdGhlIHJlc2l6ZSBldmVudCBpcyBnZW5lcmF0ZWQsIHRoZSBkZWZhdWx0CisgICAgICAgIC8vIGZyYW1lYnVmZmVyIHdpbGwgbm90IGJlIGNyZWF0ZWQuCisgICAgICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgICAgICAvLyBSZS1jcmVhdGUgdGhlIGZyYW1lYnVmZmVyIHdpdGggbmV3IHNpemUuCisgICAgICAgIG1DYW52YXMucmVzZXQobmV3IEdMQ2FudmFzKAorICAgICAgICAgICAgbmVhcmVzdFBPVChlLT5zaXplKCkud2lkdGgoKSAqIGRldmljZVBpeGVsUmF0aW8oKSksCisgICAgICAgICAgICBuZWFyZXN0UE9UKGUtPnNpemUoKS5oZWlnaHQoKSAqIGRldmljZVBpeGVsUmF0aW8oKSksCisgICAgICAgICAgICBtR0xFUzIpKTsKKyAgICAgICAgcmVzaXplR0woZS0+c2l6ZSgpLndpZHRoKCkgKiBkZXZpY2VQaXhlbFJhdGlvKCksCisgICAgICAgICAgICAgICAgIGUtPnNpemUoKS5oZWlnaHQoKSAqIGRldmljZVBpeGVsUmF0aW8oKSk7CisgICAgICAgIHJlbmRlckZyYW1lKCk7CisgICAgfQorfQorCitHTFdpZGdldDo6fkdMV2lkZ2V0KCkgeworICAgIGRlc3Ryb3lDb250ZXh0KCk7Cit9CisKK3ZvaWQgR0xXaWRnZXQ6OmRlc3Ryb3lDb250ZXh0KCkgeworICAgIGlmIChtR0xFUzIgJiYgbUVHTCAmJiBtRUdMU3RhdGUpIHsKKyAgICAgICAgLy8gRGVzdHJveSBjYW52YXMgYW5kIHRleHR1cmVkcmF3IHN0YXRlCisgICAgICAgIC8vIHdpdGhpbiB0aGlzIGNvbnRleHQuCisgICAgICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgICAgICBtQ2FudmFzLnJlc2V0KG51bGxwdHIpOworICAgICAgICBtVGV4dHVyZURyYXcucmVzZXQobnVsbHB0cik7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZXh0IGlzbid0IGFjdGl2ZSBiZWZvcmUgZGVzdHJveWluZyBpdC4KKyAgICAgICAgbUVHTC0+ZWdsTWFrZUN1cnJlbnQobUVHTFN0YXRlLT5kaXNwbGF5LCAwLCAwLCAwKTsKKworICAgICAgICAvLyBSZXNldCBFR0wgc3RhdGUgYW5kIHNldCBtRUdMU3RhdGUgdG8gbnVsbCwgd2hpY2ggd2lsbCBmb3JjZQorICAgICAgICAvLyByZS1pbml0aWFsaXphdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICBtRUdMLT5lZ2xEZXN0cm95U3VyZmFjZShtRUdMU3RhdGUtPmRpc3BsYXksIG1FR0xTdGF0ZS0+c3VyZmFjZSk7CisgICAgICAgIG1FR0wtPmVnbERlc3Ryb3lDb250ZXh0KG1FR0xTdGF0ZS0+ZGlzcGxheSwgbUVHTFN0YXRlLT5jb250ZXh0KTsKKyAgICAgICAgZGVsZXRlIG1FR0xTdGF0ZTsKKyAgICAgICAgbUVHTFN0YXRlID0gbnVsbHB0cjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2dsLXdpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzExNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuaApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9nbC1jYW52YXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZ2wtdGV4dHVyZS1kcmF3LmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjJEaXNwYXRjaC5oIgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8UVdpZGdldD4KKworc3RydWN0IEVHTFN0YXRlOworc3RydWN0IEVHTERpc3BhdGNoOworCisvLyBIZWxwZXIgY2xhc3MgdXNlZCB0byBwZXJmb3JtIEVHTC9HTEVTdjIgcmVuZGVyaW5nIGluc2lkZSBhIFF0IHdpZGdldC4KKy8vIFJlbGllcyBvbiBFbXVHTCdzIE9wZW5HTEVTRGlzcGF0Y2ggbGlicmFyeSB0byBhY2Nlc3MgdGhlIGNvcnJlY3Qgc2V0IG9mCisvLyBob3N0IGdyYXBoaWNzIGxpYnJhcmllcywgYW5kIHByb3ZpZGUgZGlzcGF0Y2ggdGFibGVzIHRvIGNhbGwgdGhlaXIgZnVuY3Rpb25zLgorLy8KKy8vIENsaWVudCBzaG91bGQgY3JlYXRlIGEgZGVyaXZlZCBjbGFzcyBhbmQgb3ZlcnJpZGUgaW5pdEdMKCksIHJlcGFpbnRHTCgpCisvLyBhbmQgcmVzaXplR0woKSBwcm9wZXJseS4gVGhlc2UgbWV0aG9kcyBjYW4gdXNlIHRoZSB8bUVHTHwgYW5kIHxtR0xFUzJ8CisvLyBmaWVsZHMgdG8gcGVyZm9ybSBFR0wvR0xFU3YyIGNhbGxzLgorY2xhc3MgR0xXaWRnZXQgOiBwdWJsaWMgUVdpZGdldCB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBHTFdpZGdldChRV2lkZ2V0KiBwYXJlbnQgPSAwKTsKKworICAgIHZpcnR1YWwgfkdMV2lkZ2V0KCk7CisKKyAgICBRUGFpbnRFbmdpbmUqIHBhaW50RW5naW5lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIGJvb2wgcmVhZHlGb3JSZW5kZXJpbmcoKSBjb25zdCB7IHJldHVybiBtVmFsaWQ7IH0KKworcHVibGljIHNsb3RzOgorICAgIHZvaWQgcmVuZGVyRnJhbWUoKTsKKyAgICBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpOworCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgaGFuZGxlU2NyZWVuQ2hhbmdlKFFTY3JlZW4qKTsKKworcHJvdGVjdGVkOgorICAgIC8vIERpc3BhdGNoIHRhYmxlcyBmb3IgRUdMIGFuZCBHTEVTdjIgQVBJcy4gTm90ZSB0aGF0IHRoZXNlIHdpbGwgYmUgbnVsbHB0cgorICAgIC8vIGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hlbiBsb2FkaW5nIHRoZSBob3N0IGxpYnJhcmllcy4KKyAgICBjb25zdCBFR0xEaXNwYXRjaCogbUVHTDsKKyAgICBjb25zdCBHTEVTdjJEaXNwYXRjaCogbUdMRVMyOworCisgICAgLy8gQ2FsbGVkIHRoZSBmaXJzdCB0aW1lIGEgZnJhbWUgbmVlZHMgdG8gYmUgcmVuZGVyZWQgYnkgdGhlIHdpZGdldC4KKyAgICAvLyBUaGlzIHdpbGwgYWx3YXlzIGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHJlcGFpbnRHTCgpIG9yIHJlc2l6ZUdMKCkKKyAgICAvLyBjYWxsLiBUaGUgaW1wbGVtZW50YXRpb24gY2FuIGFzc3VtZSB0aGF0IHxtRUdMfCBhbmQgfG1HTEVTMnwgYXJlIHZhbGlkLAorICAgIC8vIGFuZCB0aGF0IHRoZSB3aWRnZXQncyBjb250ZXh0IGlzIGFscmVhZHkgc2V0LgorICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSBpbml0aWFsaXphdGlvbiBpcyBzdWNjZXNzZnVsIGFuZAorICAgIC8vIGZhbHNlIG90aGVyd2lzZS4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdEdMKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIGEgZnJhbWUgbmVlZHMgdG8gYmUgcmVwYWludGVkIGJ5IHRoZSB3aWRnZXQuCisgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIGNhbiBhc3N1bWUgdGhhdCB8bUVHTHwgYW5kIHxtR0xFUzJ8IGFyZSB2YWxpZCwKKyAgICAvLyBhbmQgdGhhdCB0aGUgd2lkZ2V0J3MgY29udGV4dCBpcyBhbHJlYWR5IHNldC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVwYWludEdMKCkge30KKworICAgIC8vIENhbGxlZCB3aGVuZXZlciB0aGUgd2lkZ2V0IG5lZWRzIHRvIGJlIHJlc2l6ZWQgYW5kIHVwZGF0ZWQuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBhbHdheXMgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHJlcGFpbnRHTCgpLiBUaGUKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBjYW4gYXNzdW1lIHRoYXQgfG1FR0x8IGFuZCB8bUdMRVMyfCBhcmUgdmFsaWQgYW5kIHRoYXQKKyAgICAvLyB0aGUgd2lkZ2V0J3MgY29udGV4dCBpcyBhbHJlYWR5IHNldC4gfHd8IGFuZCB8aHwgYXJlIHRoZSB3aWRnZXQncworICAgIC8vIG5ldyBkaW1lbnNpb25zIGluIHBpeGVscy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplR0woaW50IHcsIGludCBoKSB7fQorCisgICAgaW50IHJlYWxQaXhlbHNXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6Y2VpbCh3aWR0aCgpICogZGV2aWNlUGl4ZWxSYXRpbygpKTsgfQorICAgIGludCByZWFsUGl4ZWxzSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gc3RkOjpjZWlsKGhlaWdodCgpICogZGV2aWNlUGl4ZWxSYXRpbygpKTsgfQorICAgIHZvaWQgdG9nZ2xlQUEoKSB7IG1FbmFibGVBQSA9ICFtRW5hYmxlQUE7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCopIG92ZXJyaWRlOworICAgIHZvaWQgc2hvd0V2ZW50KFFTaG93RXZlbnQqKSBvdmVycmlkZTsKKworICAgIGJvb2wgZW5zdXJlSW5pdCgpOworICAgIHZvaWQgZGVzdHJveUNvbnRleHQoKTsKKworICAgIEVHTFN0YXRlKiBtRUdMU3RhdGU7CisgICAgYm9vbCBtVmFsaWQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R0xDYW52YXM+IG1DYW52YXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPFRleHR1cmVEcmF3PiBtVGV4dHVyZURyYXc7CisgICAgYm9vbCBtRW5hYmxlQUE7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2N1cnNvci96b29tX2N1cnNvci5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvY3Vyc29yL3pvb21fY3Vyc29yLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIwODY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2N1cnNvci96b29tX2N1cnNvci5zdmcKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCIgWworCTwhRU5USVRZIG5zX2V4dGVuZCAiaHR0cDovL25zLmFkb2JlLmNvbS9FeHRlbnNpYmlsaXR5LzEuMC8iPgorCTwhRU5USVRZIG5zX2FpICJodHRwOi8vbnMuYWRvYmUuY29tL0Fkb2JlSWxsdXN0cmF0b3IvMTAuMC8iPgorCTwhRU5USVRZIG5zX2dyYXBocyAiaHR0cDovL25zLmFkb2JlLmNvbS9HcmFwaHMvMS4wLyI+CisJPCFFTlRJVFkgbnNfdmFycyAiaHR0cDovL25zLmFkb2JlLmNvbS9WYXJpYWJsZXMvMS4wLyI+CisJPCFFTlRJVFkgbnNfaW1yZXAgImh0dHA6Ly9ucy5hZG9iZS5jb20vSW1hZ2VSZXBsYWNlbWVudC8xLjAvIj4KKwk8IUVOVElUWSBuc19zZncgImh0dHA6Ly9ucy5hZG9iZS5jb20vU2F2ZUZvcldlYi8xLjAvIj4KKwk8IUVOVElUWSBuc19jdXN0b20gImh0dHA6Ly9ucy5hZG9iZS5jb20vR2VuZXJpY0N1c3RvbU5hbWVzcGFjZS8xLjAvIj4KKwk8IUVOVElUWSBuc19hZG9iZV94cGF0aCAiaHR0cDovL25zLmFkb2JlLmNvbS9YUGF0aC8xLjAvIj4KK10+Cis8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOng9IiZuc19leHRlbmQ7IiB4bWxuczppPSImbnNfYWk7IiB4bWxuczpncmFwaD0iJm5zX2dyYXBoczsiCisJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiCisJIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KKzxtZXRhZGF0YT4KKwk8c2Z3ICB4bWxucz0iJm5zX3NmdzsiPgorCQk8c2xpY2VzPjwvc2xpY2VzPgorCQk8c2xpY2VTb3VyY2VCb3VuZHMgIHdpZHRoPSI2Mi45IiBoZWlnaHQ9IjkyLjUiIHg9Ii0zMi4yIiB5PSItOTMiIGJvdHRvbUxlZnRPcmlnaW49InRydWUiPjwvc2xpY2VTb3VyY2VCb3VuZHM+CisJPC9zZnc+Cis8L21ldGFkYXRhPgorPHBhdGggZmlsbD0ibm9uZSIgZD0iTS0zMi4yLTUuN0g4LjZ2NDAuOGgtNDAuOFYtNS43eiIvPgorPHBhdGggZmlsbD0iI0ZGRkZGRiIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjAuMzAyOCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBkPSJNMTYuOCwxNS4xaC0xbC0wLjMtMC4zCisJYzEuMi0xLjQsMS45LTMuMiwxLjktNS4xYzAtNC4zLTMuNS03LjktNy45LTcuOVMxLjYsNS4zLDEuNiw5LjdzMy41LDcuOSw3LjksNy45YzIsMCwzLjctMC43LDUuMS0xLjlMMTUsMTZ2MWw2LjEsNmwxLjgtMS44CisJTDE2LjgsMTUuMXogTTkuNSwxNS4xYy0zLDAtNS41LTIuNC01LjUtNS41czIuNC01LjUsNS41LTUuNVMxNSw2LjcsMTUsOS43UzEyLjUsMTUuMSw5LjUsMTUuMXoiLz4KKzxwYXRoIGZpbGw9IiNGRkZGRkYiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIwLjMwMjgiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgZD0iTTEyLjUsMTAuM2gtMi40djIuNEg4Ljl2LTIuNEg2LjVWOS4xaDIuNAorCVY2LjZoMS4ydjIuNGgyLjRWMTAuM3oiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvUmVtb3RlXzY3Ny5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9SZW1vdGVfNjc3LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTNkOGYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvUmVtb3RlXzY3Ny5zdmcKQEAgLTAsMCArMSwxNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5SZW1vdGU8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IlJlbW90ZSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iaWNfcmFkaW9fYnV0dG9uX3VuY2hlY2tlZF9ibGFja18yNGRwLWNvcHktMTgiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAgTDQ4LDAgTDQ4LDQ4IEwwLDQ4IEwwLDAgWiIgaWQ9IlNoYXBlIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0LDQzLjIgQzM0LjYwMzg2NzIsNDMuMiA0My4yLDM0LjYwMzg2NzIgNDMuMiwyNCBDNDMuMiwxMy4zOTYxMzI4IDM0LjYwMzg2NzIsNC44IDI0LDQuOCBDMTMuMzk2MTMyOCw0LjggNC44LDEzLjM5NjEzMjggNC44LDI0IEM0LjgsMzQuNjAzODY3MiAxMy4zOTYxMzI4LDQzLjIgMjQsNDMuMiBaIE0yNCwzMS4yIEMyNy45NzY0NTAyLDMxLjIgMzEuMiwyNy45NzY0NTAyIDMxLjIsMjQgQzMxLjIsMjAuMDIzNTQ5OCAyNy45NzY0NTAyLDE2LjggMjQsMTYuOCBDMjAuMDIzNTQ5OCwxNi44IDE2LjgsMjAuMDIzNTQ5OCAxNi44LDI0IEMxNi44LDI3Ljk3NjQ1MDIgMjAuMDIzNTQ5OCwzMS4yIDI0LDMxLjIgWiBNMTkuODIzNDM3NSwxMy4zMjAxMTcyIEwyNC4wMjM0Mzc1LDkuMTIwMTE3MTkgTDI4LjIyMzQzNzUsMTMuMzIwMTE3MiBMMTkuODIzNDM3NSwxMy4zMjAxMTcyIFogTTE5LjgyMzQzNzUsMzQuOCBMMjQuMDIzNDM3NSwzOSBMMjguMjIzNDM3NSwzNC44IEwxOS44MjM0Mzc1LDM0LjggWiBNMTMuMzE5NTMxMywxOS44IEw5LjExOTUzMTI1LDI0IEwxMy4zMTk1MzEzLDI4LjIgTDEzLjMxOTUzMTMsMTkuOCBaIE0zNC44LDE5LjggTDM5LDI0IEwzNC44LDI4LjIgTDM0LjgsMTkuOCBaIiBpZD0iT3ZhbC0xNjAiIGZpbGw9IiM2ODcwNzQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvUm90YXRlX0xlZnRfd2hpdGUuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvUm90YXRlX0xlZnRfd2hpdGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjU0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9Sb3RhdGVfTGVmdF93aGl0ZS5zdmcKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5Sb3RhdGVfTGVmdDwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iUm90YXRlX0xlZnQiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IlNoYXBlLTMtKy1TaGFwZS00LSstU2hhcGUtNi1Db3B5LTEwIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw0OCwwIEw0OCw0Ni40NTE2MTI5IEwwLDQ2LjQ1MTYxMjkgTDAsMCBaIiBpZD0iU2hhcGUtMyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNS42NDI1MzcyLDQuNDY5Njc2MzUgTDIuOTAxNDE1NzcsMTcuMTg0Mzk5MSBDMS40OTQ5ODAzOCwxOC41OTA4MzQ1IDEuNTQ5ODk5MDEsMjAuODk4NTk1MyAzLjAwODQyNDU5LDIyLjM1NzEyMDkgTDI2Ljc2NzIxMjQsNDYuMTE1OTA4NyBDMjguMjI1NzM4LDQ3LjU3NDQzNDMgMzAuNTMzNDk4OSw0Ny42MjkzNTMgMzEuOTM5OTM0Miw0Ni4yMjI5MTc2IEw0NC42Njc4NTYzLDMzLjQ5NDk5NTUgQzQ2LjA3NDI5MTcsMzIuMDg4NTYwMSA0Ni4wMzIxMDEsMjkuNzY4MDcxNCA0NC41NzM1NzU0LDI4LjMwOTU0NTggTDIwLjgxNDc4NzYsNC41NTA3NTc5MyBDMTkuMzU2MjYyLDMuMDkyMjMyMzQgMTcuMDQ4OTcyNSwzLjA2MzI0MDk2IDE1LjY0MjUzNzIsNC40Njk2NzYzNSBMMTUuNjQyNTM3Miw0LjQ2OTY3NjM1IEwxNS42NDI1MzcyLDQuNDY5Njc2MzUgWiBNMzkuMzg4MTI1NywyOC4yMTUyNjQ5IEwyNi42NjAyMDM2LDQwLjk0MzE4NjkgTDguMTgxMTQ2NCwyMi40NjQxMjk3IEwyMC45MDkwNjg1LDkuNzM2MjA3NjYgTDM5LjM4ODEyNTcsMjguMjE1MjY0OSBMMzkuMzg4MTI1NywyOC4yMTUyNjQ5IFoiIGlkPSJTaGFwZS00IiBmaWxsPSJ3aGl0ZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMi43LDYuNDE2MTI5MDMgQzM5LjIzLDkuNDE2MTI5MDMgNDMuOTIsMTUuNTYxMjkwMyA0NC42MywyMi44Mzg3MDk3IEw0Ny42MywyMi44Mzg3MDk3IEM0Ni42MSwxMC45MTYxMjkgMzYuMzEsMS41NDgzODcxIDIzLjczLDEuNTQ4Mzg3MSBDMjMuMjgsMS41NDgzODcxIDIyLjg1LDEuNTg3MDk2NzcgMjIuNCwxLjYxNjEyOTAzIEwzMC4wMyw5IEwzMi43LDYuNDE2MTI5MDMgTDMyLjcsNi40MTYxMjkwMyBaIiBpZD0iU2hhcGUtNSIgZmlsbD0id2hpdGUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvUm90YXRlX1JpZ2h0X3doaXRlLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1JvdGF0ZV9SaWdodF93aGl0ZS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkMDE1YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1JvdGF0ZV9SaWdodF93aGl0ZS5zdmcKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5Sb3RhdGVfUmlnaHQ8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IlJvdGF0ZV9SaWdodCIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iU2hhcGUtNi0rLVNoYXBlLTctKy1TaGFwZS05LUNvcHktMTIiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAgTDQ4LDAgTDQ4LDQ2LjQ1MTYxMjkgTDAsNDYuNDUxNjEyOSBMMCwwIFoiIGlkPSJTaGFwZS02IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNC4wMDAwMDAsIDIzLjIyNTgwNikgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMjQuMDAwMDAwLCAtMjMuMjI1ODA2KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMzEuOTM5NDYyOCw0LjQ2OTY3NjM1IEw0NC42ODA1ODQyLDE3LjE4NDM5OTEgQzQ2LjA4NzAxOTYsMTguNTkwODM0NSA0Ni4wMzIxMDEsMjAuODk4NTk1MyA0NC41NzM1NzU0LDIyLjM1NzEyMDkgTDIwLjgxNDc4NzYsNDYuMTE1OTA4NyBDMTkuMzU2MjYyLDQ3LjU3NDQzNDMgMTcuMDQ4NTAxMSw0Ny42MjkzNTMgMTUuNjQyMDY1OCw0Ni4yMjI5MTc2IEwyLjkxNDE0MzY5LDMzLjQ5NDk5NTUgQzEuNTA3NzA4MywzMi4wODg1NjAxIDEuNTQ5ODk5MDEsMjkuNzY4MDcxNCAzLjAwODQyNDU5LDI4LjMwOTU0NTggTDI2Ljc2NzIxMjQsNC41NTA3NTc5MyBDMjguMjI1NzM4LDMuMDkyMjMyMzQgMzAuNTMzMDI3NSwzLjA2MzI0MDk2IDMxLjkzOTQ2MjgsNC40Njk2NzYzNSBMMzEuOTM5NDYyOCw0LjQ2OTY3NjM1IEwzMS45Mzk0NjI4LDQuNDY5Njc2MzUgWiBNOC4xOTM4NzQzMiwyOC4yMTUyNjQ5IEwyMC45MjE3OTY0LDQwLjk0MzE4NjkgTDM5LjQwMDg1MzYsMjIuNDY0MTI5NyBMMjYuNjcyOTMxNSw5LjczNjIwNzY2IEw4LjE5Mzg3NDMyLDI4LjIxNTI2NDkgTDguMTkzODc0MzIsMjguMjE1MjY0OSBaIiBpZD0iU2hhcGUtNyIgZmlsbD0id2hpdGUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAuMyw2LjQxNjEyOTAzIEMxNi44Myw5LjQxNjEyOTAzIDIxLjUyLDE1LjU2MTI5MDMgMjIuMjMsMjIuODM4NzA5NyBMMjUuMjMsMjIuODM4NzA5NyBDMjQuMjEsMTAuOTE2MTI5IDEzLjkxLDEuNTQ4Mzg3MSAxLjMzLDEuNTQ4Mzg3MSBDMC44OCwxLjU0ODM4NzEgMC40NSwxLjU4NzA5Njc3IDAsMS42MTYxMjkwMyBMNy42Myw5IEwxMC4zLDYuNDE2MTI5MDMgTDEwLjMsNi40MTYxMjkwMyBaIiBpZD0iU2hhcGUtOCIgZmlsbD0id2hpdGUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLjYxNTAwMCwgMTIuMTkzNTQ4KSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMi42MTUwMDAsIC0xMi4xOTM1NDgpICI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9TeXN0ZW1fQmFja193aGl0ZS5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9TeXN0ZW1fQmFja193aGl0ZS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1N5c3RlbV9CYWNrX3doaXRlLnN2ZwpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IlN5c3RlbV9CYWNrIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iUGFnZS0xIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IlN5c3RlbV9CYWNrIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTE4LSstYmFjay0xMi1Db3B5LTExIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTExOCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTM2LjcwODg0NzMsMTAuOTQ5NDc2NSBMMzYuNzA4ODQ3OCwzNy42MzQ5Njg4IEMzNi43MDg4NDc4LDM5LjQwMzk0OTggMzUuNDgyMDg0NCw0MC4wOTQ5MTE1IDMzLjk2NDY1MDgsMzkuMTc1NzY0NyBMMTIuMTM3Mzc5NSwyNS45NTQ0NDk3IEMxMC42MjE4MDEzLDI1LjAzNjQyNjcgMTAuNjE5OTQ1OSwyMy41NDkxNDE0IDEyLjEzNzM3OTQsMjIuNjI5OTk0NiBMMzMuOTY0NjUwMyw5LjQwODY4MDU0IEMzNS40ODAyMjg0LDguNDkwNjU3NjMgMzYuNzA4ODQ3Myw5LjE2ODM1NTExIDM2LjcwODg0NzMsMTAuOTQ5NDc2NSBaIE0zMy41MDg4NDgyLDEzLjQzMDUyMzcgTDMzLjUwODg0ODIsMzUuMTMwNTI0NSBMMTUuNTA4ODQ4MiwyNC4yODA1MjQxIEwzMy41MDg4NDgyLDEzLjQzMDUyMzcgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjZmZmZmZmIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1N5c3RlbV9Ib21lX3doaXRlLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1N5c3RlbV9Ib21lX3doaXRlLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNkMWJlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvU3lzdGVtX0hvbWVfd2hpdGUuc3ZnCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+U3lzdGVtX0hvbWU8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IlN5c3RlbV9Ib21lIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTE5LSstaG9tZS0xMi1Db3B5LTExIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTExOSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0LDM1LjIgTDI0LDM1LjIgQzMwLjE4NTU4OTIsMzUuMiAzNS4yLDMwLjE4NTU4OTIgMzUuMiwyNCBDMzUuMiwxNy44MTQ0MTA4IDMwLjE4NTU4OTIsMTIuOCAyNCwxMi44IEMxNy44MTQ0MTA4LDEyLjggMTIuOCwxNy44MTQ0MTA4IDEyLjgsMjQgQzEyLjgsMzAuMTg1NTg5MiAxNy44MTQ0MTA4LDM1LjIgMjQsMzUuMiBMMjQsMzUuMiBaIE0yNCwzOC40IEwyNCwzOC40IEMxNi4wNDcwOTk2LDM4LjQgOS42LDMxLjk1MjkwMDQgOS42LDI0IEM5LjYsMTYuMDQ3MDk5NiAxNi4wNDcwOTk2LDkuNiAyNCw5LjYgQzMxLjk1MjkwMDQsOS42IDM4LjQsMTYuMDQ3MDk5NiAzOC40LDI0IEMzOC40LDMxLjk1MjkwMDQgMzEuOTUyOTAwNCwzOC40IDI0LDM4LjQgTDI0LDM4LjQgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjZmZmZmZmIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1N5c3RlbV9PdmVydmlld193aGl0ZS5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9TeXN0ZW1fT3ZlcnZpZXdfd2hpdGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNGRkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9TeXN0ZW1fT3ZlcnZpZXdfd2hpdGUuc3ZnCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+U3lzdGVtX092ZXJ2aWV3PC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJTeXN0ZW1fT3ZlcnZpZXciIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IlJlY3RhbmdsZS0xMjAtKy1yZWNlbnQtMTItQ29weS0xMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CisgICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xMjAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PC9yZWN0PgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi43OTIxNDI5LDEyLjggTDEyLjc5MjE0MjksMTIuOCBDMTIuNzk1OTk0NSwxMi44IDEyLjgsMTIuNzk1OTk1NCAxMi44LDEyLjc5MjE0MjkgTDEyLjgsMzUuMjA3ODU3MSBDMTIuOCwzNS4yMDQwMDU1IDEyLjc5NTk5NTQsMzUuMiAxMi43OTIxNDI5LDM1LjIgTDM1LjIwNzg1NzEsMzUuMiBDMzUuMjA0MDA1NSwzNS4yIDM1LjIsMzUuMjA0MDA0NiAzNS4yLDM1LjIwNzg1NzEgTDM1LjIsMTIuNzkyMTQyOSBDMzUuMiwxMi43OTU5OTQ1IDM1LjIwNDAwNDYsMTIuOCAzNS4yMDc4NTcxLDEyLjggTDEyLjc5MjE0MjksMTIuOCBaIE0xMi43OTIxNDI5LDkuNiBMMTIuNzkyMTQyOSw5LjYgTDM1LjIwNzg1NzEsOS42IEMzNi45NzE4MDM1LDkuNiAzOC40LDExLjAyOTE3MSAzOC40LDEyLjc5MjE0MjkgTDM4LjQsMzUuMjA3ODU3MSBDMzguNCwzNi45NzE4MDM1IDM2Ljk3MDgyOSwzOC40IDM1LjIwNzg1NzEsMzguNCBMMTIuNzkyMTQyOSwzOC40IEMxMS4wMjgxOTY1LDM4LjQgOS42LDM2Ljk3MDgyOSA5LjYsMzUuMjA3ODU3MSBMOS42LDEyLjc5MjE0MjkgQzkuNiwxMS4wMjgxOTY1IDExLjAyOTE3MSw5LjYgMTIuNzkyMTQyOSw5LjYgTDEyLjc5MjE0MjksOS42IFoiIGlkPSJTaGFwZSIgZmlsbD0iI2ZmZmZmZiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9WaXJ0dWFsX1NlbnNvcnNfNjc3LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL1ZpcnR1YWxfU2Vuc29yc182Nzcuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODQ0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9WaXJ0dWFsX1NlbnNvcnNfNjc3LnN2ZwpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPlZpcnR1YWxfU2Vuc29yczwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iVmlydHVhbF9TZW5zb3JzIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJHcm91cC1Db3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTgwNyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgPGcgaWQ9IlNoYXBlLTYtKy1TaGFwZS03LSstU2hhcGUtOS1Db3B5LTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuNDAwMDAwLCAzLjQwMDAwMCkiIGZpbGw9IiM2ODcwNzQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAuMyw1LjQxNjEyOTAzIEMxNi44Myw4LjQxNjEyOTAzIDIxLjUyLDE0LjU2MTI5MDMgMjIuMjMsMjEuODM4NzA5NyBMMjUuMjMsMjEuODM4NzA5NyBDMjQuMjEsOS45MTYxMjkwMyAxMy45MSwwLjU0ODM4NzA5NyAxLjMzLDAuNTQ4Mzg3MDk3IEMwLjg4LDAuNTQ4Mzg3MDk3IDAuNDUsMC41ODcwOTY3NzQgMCwwLjYxNjEyOTAzMiBMNy42Myw4IEwxMC4zLDUuNDE2MTI5MDMgTDEwLjMsNS40MTYxMjkwMyBaIiBpZD0iU2hhcGUtOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNjE1MDAwLCAxMS4xOTM1NDgpIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTEyLjYxNTAwMCwgLTExLjE5MzU0OCkgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgICAgIDxnIGlkPSJTaGFwZS02LSstU2hhcGUtNy0rLVNoYXBlLTktQ29weS02IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMy4xMDAwMDAsIDMzLjUwMzAzMCkgc2NhbGUoLTEsIC0xKSB0cmFuc2xhdGUoLTMzLjEwMDAwMCwgLTMzLjUwMzAzMCkgdHJhbnNsYXRlKDE5LjYwMDAwMCwgMjIuNTAzMDMwKSIgZmlsbD0iIzY4NzA3NCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS4zLDUuNDE2MTI5MDMgQzE3LjgzLDguNDE2MTI5MDMgMjIuNTIsMTQuNTYxMjkwMyAyMy4yMywyMS44Mzg3MDk3IEwyNi4yMywyMS44Mzg3MDk3IEMyNS4yMSw5LjkxNjEyOTAzIDE0LjkxLDAuNTQ4Mzg3MDk3IDIuMzMsMC41NDgzODcwOTcgQzEuODgsMC41NDgzODcwOTcgMS40NSwwLjU4NzA5Njc3NCAxLDAuNjE2MTI5MDMyIEw4LjYzLDggTDExLjMsNS40MTYxMjkwMyBMMTEuMyw1LjQxNjEyOTAzIFoiIGlkPSJTaGFwZS04IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy42MTUwMDAsIDExLjE5MzU0OCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTMuNjE1MDAwLCAtMTEuMTkzNTQ4KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMTY2IiBmaWxsPSIjNjg3MDc0IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjQiIGN5PSIyNCIgcng9IjcuMiIgcnk9IjcuMiI+PC9lbGxpcHNlPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2JhY2suc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9iYWNrLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTMzN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9iYWNrLnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjEwMHB4IiBoZWlnaHQ9IjEwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iIzU0NmU3YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJpY19mYXN0X2ZvcndhcmRfYmxhY2tfMjRkcCIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjUuMDAwMDAwLCAyNS4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTI1LjAwMDAwMCwgLTI1LjAwMDAwMCkgdHJhbnNsYXRlKDEzLjAwMDAwMCwgMTMuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQsMTggTDEyLjUsMTIgTDQsNiBMNCwxOCBMNCwxOCBaIE0xMyw2IEwxMywxOCBMMjEuNSwxMiBMMTMsNiBMMTMsNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEwyNCwwIEwyNCwyNCBMMCwyNCBMMCwwIFoiIGlkPSJTaGFwZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2JhY2tfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2JhY2tfcHJlc3NlZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlMTQyYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfYmFja19wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjEwMHB4IiBoZWlnaHQ9IjEwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iIzNkNTA1OSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJpY19mYXN0X2ZvcndhcmRfYmxhY2tfMjRkcCIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjUuMDAwMDAwLCAyNS4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTI1LjAwMDAwMCwgLTI1LjAwMDAwMCkgdHJhbnNsYXRlKDEzLjAwMDAwMCwgMTMuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQsMTggTDEyLjUsMTIgTDQsNiBMNCwxOCBMNCwxOCBaIE0xMyw2IEwxMywxOCBMMjEuNSwxMiBMMTMsNiBMMTMsNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEwyNCwwIEwyNCwyNCBMMCwyNCBMMCwwIFoiIGlkPSJTaGFwZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2Rvd24uc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9kb3duLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY0NzdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9kb3duLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjI4NHB4IiBoZWlnaHQ9IjIwMnB4IiB2aWV3Qm94PSIwIDAgMjg0IDIwMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzEuMDAwMDAwLCA1MC41MDAwMDApIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcxLjAwMDAwMCwgLTUwLjUwMDAwMCkgIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiM1NDZlN2EiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9kb3duX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9kb3duX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDY1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2Rvd25fcHJlc3NlZC5zdmcKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIyODRweCIgaGVpZ2h0PSIyMDJweCIgdmlld0JveD0iMCAwIDI4NCAyMDIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iRmlsbC0yLUNvcHktKy1pY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcxLjAwMDAwMCwgNTAuNTAwMDAwKSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MS4wMDAwMDAsIC01MC41MDAwMDApICI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuMjg5LDcxLjY4MzcxNzQgQzE4LjMzMTk5OSw4OS43Nzk3MTc0IDQzLjI1NzM5OTUsMTAwLjk3MjcxNyA3MC43ODksMTAwLjk3MjcxNyBDOTguMzIwNjAwNSwxMDAuOTcyNzE3IDEyMy4yNDYwMDEsODkuNzc5NzE3NCAxNDEuMjg5LDcxLjY4MzcxNzQgTDcwLjc4OSwwLjk3MjcxNzM1NyBMMC4yODksNzEuNjgzNzE3NCIgaWQ9IkZpbGwtMi1Db3B5IiBmaWxsPSIjM2Q1MDU5IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC43ODkwMDAsIDUwLjk3MjcxNykgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtNzAuNzg5MDAwLCAtNTAuOTcyNzE3KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC44NTAwMDAsIDMyLjQ4NjM1OSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNzAuODUwMDAwLCAtMzIuNDg2MzU5KSB0cmFuc2xhdGUoNTMuMzUwMDAwLCAxNS40ODYzNTkpIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBMMTkuMTgxNzgzNCwxNy4xMjcyNjExIEwxMi41MTExMjUzLDEwLjcwOTQ0NzEgTDE0LjU2NDc1NTgsOC43Mzc5NjE3OCBMMjMuMzAzNjA5MywxNy4xMjcyNjExIEwxNC41NjQ3NTU4LDI1LjUxNjU2MDUgTDEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwzMy45MDU4NTk5IEwwLDMzLjkwNTg1OTkgTDAsMC4zNDg2NjI0MiBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfZm9yd2FyZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2ZvcndhcmQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmI0YzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2ZvcndhcmQuc3ZnCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0yIiBmaWxsPSIjNTQ2ZTdhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjUiIGN5PSIyNSIgcj0iMjUiPjwvY2lyY2xlPgorICAgICAgICAgICAgPGcgaWQ9ImljX2Zhc3RfZm9yd2FyZF9ibGFja18yNGRwIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy4wMDAwMDAsIDEzLjAwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00LDE4IEwxMi41LDEyIEw0LDYgTDQsMTggTDQsMTggWiBNMTMsNiBMMTMsMTggTDIxLjUsMTIgTDEzLDYgTDEzLDYgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMMjQsMCBMMjQsMjQgTDAsMjQgTDAsMCBaIiBpZD0iU2hhcGUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9mb3J3YXJkX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9mb3J3YXJkX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwY2RhNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2ZvcndhcmRfcHJlc3NlZC5zdmcKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIxMDBweCIgaGVpZ2h0PSIxMDBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTIiIGZpbGw9IiMzZDUwNTkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIGN4PSIyNSIgY3k9IjI1IiByPSIyNSI+PC9jaXJjbGU+CisgICAgICAgICAgICA8ZyBpZD0iaWNfZmFzdF9mb3J3YXJkX2JsYWNrXzI0ZHAiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzLjAwMDAwMCwgMTMuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQsMTggTDEyLjUsMTIgTDQsNiBMNCwxOCBMNCwxOCBaIE0xMyw2IEwxMywxOCBMMjEuNSwxMiBMMTMsNiBMMTMsNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEwyNCwwIEwyNCwyNCBMMCwyNCBMMCwwIFoiIGlkPSJTaGFwZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2xlZnQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9sZWZ0LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY0Y2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9sZWZ0LnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjIwMnB4IiBoZWlnaHQ9IjI4NHB4IiB2aWV3Qm94PSIwIDAgMjAyIDI4NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuNTAwMDAwLCA3MS4wMDAwMDApIHNjYWxlKC0xLCAtMSkgcm90YXRlKC0yNzAuMDAwMDAwKSB0cmFuc2xhdGUoLTUwLjUwMDAwMCwgLTcxLjAwMDAwMCkgdHJhbnNsYXRlKC0yMC41MDAwMDAsIDIwLjUwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjI4OSw3MS42ODM3MTc0IEMxOC4zMzE5OTksODkuNzc5NzE3NCA0My4yNTczOTk1LDEwMC45NzI3MTcgNzAuNzg5LDEwMC45NzI3MTcgQzk4LjMyMDYwMDUsMTAwLjk3MjcxNyAxMjMuMjQ2MDAxLDg5Ljc3OTcxNzQgMTQxLjI4OSw3MS42ODM3MTc0IEw3MC43ODksMC45NzI3MTczNTcgTDAuMjg5LDcxLjY4MzcxNzQiIGlkPSJGaWxsLTItQ29weSIgZmlsbD0iIzU0NmU3YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuNzg5MDAwLCA1MC45NzI3MTcpIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcwLjc4OTAwMCwgLTUwLjk3MjcxNykgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuODUwMDAwLCAzMi40ODYzNTkpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTcwLjg1MDAwMCwgLTMyLjQ4NjM1OSkgdHJhbnNsYXRlKDUzLjM1MDAwMCwgMTUuNDg2MzU5KSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi41MTExMjUzLDIzLjU0NTA3NTIgTDE5LjE4MTc4MzQsMTcuMTI3MjYxMSBMMTIuNTExMTI1MywxMC43MDk0NDcxIEwxNC41NjQ3NTU4LDguNzM3OTYxNzggTDIzLjMwMzYwOTMsMTcuMTI3MjYxMSBMMTQuNTY0NzU1OCwyNS41MTY1NjA1IEwxMi41MTExMjUzLDIzLjU0NTA3NTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMzMuOTA1ODU5OSBMMCwzMy45MDU4NTk5IEwwLDAuMzQ4NjYyNDIgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2xlZnRfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX2xlZnRfcHJlc3NlZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3ZmU3YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfbGVmdF9wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjIwMnB4IiBoZWlnaHQ9IjI4NHB4IiB2aWV3Qm94PSIwIDAgMjAyIDI4NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuNTAwMDAwLCA3MS4wMDAwMDApIHNjYWxlKC0xLCAtMSkgcm90YXRlKC0yNzAuMDAwMDAwKSB0cmFuc2xhdGUoLTUwLjUwMDAwMCwgLTcxLjAwMDAwMCkgdHJhbnNsYXRlKC0yMC41MDAwMDAsIDIwLjUwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjI4OSw3MS42ODM3MTc0IEMxOC4zMzE5OTksODkuNzc5NzE3NCA0My4yNTczOTk1LDEwMC45NzI3MTcgNzAuNzg5LDEwMC45NzI3MTcgQzk4LjMyMDYwMDUsMTAwLjk3MjcxNyAxMjMuMjQ2MDAxLDg5Ljc3OTcxNzQgMTQxLjI4OSw3MS42ODM3MTc0IEw3MC43ODksMC45NzI3MTczNTcgTDAuMjg5LDcxLjY4MzcxNzQiIGlkPSJGaWxsLTItQ29weSIgZmlsbD0iIzNkNTA1OSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuNzg5MDAwLCA1MC45NzI3MTcpIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcwLjc4OTAwMCwgLTUwLjk3MjcxNykgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuODUwMDAwLCAzMi40ODYzNTkpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTcwLjg1MDAwMCwgLTMyLjQ4NjM1OSkgdHJhbnNsYXRlKDUzLjM1MDAwMCwgMTUuNDg2MzU5KSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi41MTExMjUzLDIzLjU0NTA3NTIgTDE5LjE4MTc4MzQsMTcuMTI3MjYxMSBMMTIuNTExMTI1MywxMC43MDk0NDcxIEwxNC41NjQ3NTU4LDguNzM3OTYxNzggTDIzLjMwMzYwOTMsMTcuMTI3MjYxMSBMMTQuNTY0NzU1OCwyNS41MTY1NjA1IEwxMi41MTExMjUzLDIzLjU0NTA3NTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMzMuOTA1ODU5OSBMMCwzMy45MDU4NTk5IEwwLDAuMzQ4NjYyNDIgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3BsYXlfcGF1c2Uuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9wbGF5X3BhdXNlLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI5MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9wbGF5X3BhdXNlLnN2ZwpAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjEwMHB4IiBoZWlnaHQ9IjEwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iIzU0NmU3YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTY3MC0rLWljX3BhdXNlX2JsYWNrXzI0ZHAtKDEpLSstaWNfcGxheV9hcnJvd19ibGFja18yNGRwLWNvcHktNyIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMuMDAwMDAwLCAxMy4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTE2NzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHg9IjAiIHk9IjAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19wYXVzZV9ibGFja18yNGRwLSgxKS0rLWljX3BsYXlfYXJyb3dfYmxhY2tfMjRkcC1jb3B5LTciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMDAwMDAwLCA2LjAwMDAwMCkiIGZpbGw9IiNGRkZGRkYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfcGF1c2VfYmxhY2tfMjRkcC0oMSkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwLjAwMDAwMCwgMC4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjUsMTEuMjUgTDMuNSwxMS4yNSBMMy41LDAuNzUgTDAuNSwwLjc1IEwwLjUsMTEuMjUgTDAuNSwxMS4yNSBaIE02LjUsMC43NSBMNi41LDExLjI1IEw5LjUsMTEuMjUgTDkuNSwwLjc1IEw2LjUsMC43NSBMNi41LDAuNzUgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICAgICAgPGcgaWQ9ImljX3BsYXlfYXJyb3dfYmxhY2tfMjRkcC1jb3B5LTciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC43NSBMMCwxMS4yNSBMOC4yNSw2IEwwLDAuNzUgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfcGxheV9wYXVzZV9wcmVzc2VkLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfcGxheV9wYXVzZV9wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJhZWIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9wbGF5X3BhdXNlX3ByZXNzZWQuc3ZnCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0yIiBmaWxsPSIjM2Q1MDU5IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjUiIGN5PSIyNSIgcj0iMjUiPjwvY2lyY2xlPgorICAgICAgICAgICAgPGcgaWQ9IlJlY3RhbmdsZS0xNjcwLSstaWNfcGF1c2VfYmxhY2tfMjRkcC0oMSktKy1pY19wbGF5X2Fycm93X2JsYWNrXzI0ZHAtY29weS03IiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy4wMDAwMDAsIDEzLjAwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMTY3MCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgeD0iMCIgeT0iMCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX3BhdXNlX2JsYWNrXzI0ZHAtKDEpLSstaWNfcGxheV9hcnJvd19ibGFja18yNGRwLWNvcHktNyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMi4wMDAwMDAsIDYuMDAwMDAwKSIgZmlsbD0iI0ZGRkZGRiIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJpY19wYXVzZV9ibGFja18yNGRwLSgxKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAuMDAwMDAwLCAwLjAwMDAwMCkiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNSwxMS4yNSBMMy41LDExLjI1IEwzLjUsMC43NSBMMC41LDAuNzUgTDAuNSwxMS4yNSBMMC41LDExLjI1IFogTTYuNSwwLjc1IEw2LjUsMTEuMjUgTDkuNSwxMS4yNSBMOS41LDAuNzUgTDYuNSwwLjc1IEw2LjUsMC43NSBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfcGxheV9hcnJvd19ibGFja18yNGRwLWNvcHktNyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjc1IEwwLDExLjI1IEw4LjI1LDYgTDAsMC43NSBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9yaWdodC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3JpZ2h0LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI4N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9yaWdodC5zdmcKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIyMDJweCIgaGVpZ2h0PSIyODRweCIgdmlld0JveD0iMCAwIDIwMiAyODQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iRmlsbC0yLUNvcHktKy1pY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUwLjUwMDAwMCwgNzEuMDAwMDAwKSBzY2FsZSgxLCAtMSkgcm90YXRlKC0yNzAuMDAwMDAwKSB0cmFuc2xhdGUoLTUwLjUwMDAwMCwgLTcxLjAwMDAwMCkgdHJhbnNsYXRlKC0yMC41MDAwMDAsIDIwLjUwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjI4OSw3MS42ODM3MTc0IEMxOC4zMzE5OTksODkuNzc5NzE3NCA0My4yNTczOTk1LDEwMC45NzI3MTcgNzAuNzg5LDEwMC45NzI3MTcgQzk4LjMyMDYwMDUsMTAwLjk3MjcxNyAxMjMuMjQ2MDAxLDg5Ljc3OTcxNzQgMTQxLjI4OSw3MS42ODM3MTc0IEw3MC43ODksMC45NzI3MTczNTcgTDAuMjg5LDcxLjY4MzcxNzQiIGlkPSJGaWxsLTItQ29weSIgZmlsbD0iIzU0NmU3YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuNzg5MDAwLCA1MC45NzI3MTcpIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcwLjc4OTAwMCwgLTUwLjk3MjcxNykgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuODUwMDAwLCAzMi40ODYzNTkpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTcwLjg1MDAwMCwgLTMyLjQ4NjM1OSkgdHJhbnNsYXRlKDUzLjM1MDAwMCwgMTUuNDg2MzU5KSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi41MTExMjUzLDIzLjU0NTA3NTIgTDE5LjE4MTc4MzQsMTcuMTI3MjYxMSBMMTIuNTExMTI1MywxMC43MDk0NDcxIEwxNC41NjQ3NTU4LDguNzM3OTYxNzggTDIzLjMwMzYwOTMsMTcuMTI3MjYxMSBMMTQuNTY0NzU1OCwyNS41MTY1NjA1IEwxMi41MTExMjUzLDIzLjU0NTA3NTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMzMuOTA1ODU5OSBMMCwzMy45MDU4NTk5IEwwLDAuMzQ4NjYyNDIgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3JpZ2h0X3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9yaWdodF9wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUzM2VhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9yaWdodF9wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjIwMnB4IiBoZWlnaHQ9IjI4NHB4IiB2aWV3Qm94PSIwIDAgMjAyIDI4NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuNTAwMDAwLCA3MS4wMDAwMDApIHNjYWxlKDEsIC0xKSByb3RhdGUoLTI3MC4wMDAwMDApIHRyYW5zbGF0ZSgtNTAuNTAwMDAwLCAtNzEuMDAwMDAwKSB0cmFuc2xhdGUoLTIwLjUwMDAwMCwgMjAuNTAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuMjg5LDcxLjY4MzcxNzQgQzE4LjMzMTk5OSw4OS43Nzk3MTc0IDQzLjI1NzM5OTUsMTAwLjk3MjcxNyA3MC43ODksMTAwLjk3MjcxNyBDOTguMzIwNjAwNSwxMDAuOTcyNzE3IDEyMy4yNDYwMDEsODkuNzc5NzE3NCAxNDEuMjg5LDcxLjY4MzcxNzQgTDcwLjc4OSwwLjk3MjcxNzM1NyBMMC4yODksNzEuNjgzNzE3NCIgaWQ9IkZpbGwtMi1Db3B5IiBmaWxsPSIjM2Q1MDU5IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC43ODkwMDAsIDUwLjk3MjcxNykgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtNzAuNzg5MDAwLCAtNTAuOTcyNzE3KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC44NTAwMDAsIDMyLjQ4NjM1OSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNzAuODUwMDAwLCAtMzIuNDg2MzU5KSB0cmFuc2xhdGUoNTMuMzUwMDAwLCAxNS40ODYzNTkpIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBMMTkuMTgxNzgzNCwxNy4xMjcyNjExIEwxMi41MTExMjUzLDEwLjcwOTQ0NzEgTDE0LjU2NDc1NTgsOC43Mzc5NjE3OCBMMjMuMzAzNjA5MywxNy4xMjcyNjExIEwxNC41NjQ3NTU4LDI1LjUxNjU2MDUgTDEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwzMy45MDU4NTk5IEwwLDMzLjkwNTg1OTkgTDAsMC4zNDg2NjI0MiBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfc2VsZWN0XzIzMy5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3NlbGVjdF8yMzMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzIzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3NlbGVjdF8yMzMuc3ZnCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTcycHgiIGhlaWdodD0iMTcycHgiIHZpZXdCb3g9IjAgMCAxNzIgMTcyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiIHN0cm9rZT0iIzI3MzIzOCIgc3Ryb2tlLXdpZHRoPSIzIiBmaWxsPSIjNTQ2ZTdhIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMzU5LUNvcHktOCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjQzIiBjeT0iNDMiIHI9IjQwIj48L2NpcmNsZT4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9zZWxlY3RfMjMzX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvZHBhZF9zZWxlY3RfMjMzX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYjU4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3NlbGVjdF8yMzNfcHJlc3NlZC5zdmcKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIxNzJweCIgaGVpZ2h0PSIxNzJweCIgdmlld0JveD0iMCAwIDE3MiAxNzIiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCIgc3Ryb2tlPSIjMjczMjM4IiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9IiMzZDUwNTkiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0zNTktQ29weS04IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iNDMiIGN5PSI0MyIgcj0iNDAiPjwvY2lyY2xlPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3VwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfdXAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YTRkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3VwLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjI4NHB4IiBoZWlnaHQ9IjIwMnB4IiB2aWV3Qm94PSIwIDAgMjg0IDIwMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuMjg5LDcxLjY4MzcxNzQgQzE4LjMzMTk5OSw4OS43Nzk3MTc0IDQzLjI1NzM5OTUsMTAwLjk3MjcxNyA3MC43ODksMTAwLjk3MjcxNyBDOTguMzIwNjAwNSwxMDAuOTcyNzE3IDEyMy4yNDYwMDEsODkuNzc5NzE3NCAxNDEuMjg5LDcxLjY4MzcxNzQgTDcwLjc4OSwwLjk3MjcxNzM1NyBMMC4yODksNzEuNjgzNzE3NCIgaWQ9IkZpbGwtMi1Db3B5IiBmaWxsPSIjNTQ2ZTdhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC43ODkwMDAsIDUwLjk3MjcxNykgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtNzAuNzg5MDAwLCAtNTAuOTcyNzE3KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC44NTAwMDAsIDMyLjQ4NjM1OSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNzAuODUwMDAwLCAtMzIuNDg2MzU5KSB0cmFuc2xhdGUoNTMuMzUwMDAwLCAxNS40ODYzNTkpIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBMMTkuMTgxNzgzNCwxNy4xMjcyNjExIEwxMi41MTExMjUzLDEwLjcwOTQ0NzEgTDE0LjU2NDc1NTgsOC43Mzc5NjE3OCBMMjMuMzAzNjA5MywxNy4xMjcyNjExIEwxNC41NjQ3NTU4LDI1LjUxNjU2MDUgTDEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBaIiBpZD0iU2hhcGUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwzMy45MDU4NTk5IEwwLDMzLjkwNTg1OTkgTDAsMC4zNDg2NjI0MiBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2RwYWRfdXBfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3VwX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDZhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9kcGFkX3VwX3ByZXNzZWQuc3ZnCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMjg0cHgiIGhlaWdodD0iMjAycHgiIHZpZXdCb3g9IjAgMCAyODQgMjAyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IkZpbGwtMi1Db3B5LSstaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiMzZDUwNTkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfYWRkXzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2FkZF8wQkFfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxMGU1NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2FkZF8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMzggMjZIMjZ2MTJoLTRWMjZIMTB2LTRoMTJWMTBoNHYxMmgxMnY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfYWRkXzE1NV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2FkZF8xNTVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0NzUwOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2FkZF8xNTVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMWI1YzU4Ij4KKyAgICA8cGF0aCBkPSJNMzggMjZIMjZ2MTJoLTRWMjZIMTB2LTRoMTJWMTBoNHYxMmgxMnY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF9kb3duXzY2N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2Fycm93X2Ryb3BfZG93bl82NjdfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyZDQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2Fycm93X2Ryb3BfZG93bl82NjdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjU2ZDcyIj4KKyAgICA8cGF0aCBkPSJNMTQgMjBsMTAgMTAgMTAtMTB6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19hcnJvd19kcm9wX2Rvd25fd2hpdGVfMThweC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19hcnJvd19kcm9wX2Rvd25fd2hpdGVfMThweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1YWI0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2Fycm93X2Ryb3BfZG93bl93aGl0ZV8xOHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgZmlsbD0iI0ZGRkZGRiIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iNDgiIHRyYW5zZm9ybT0ic2NhbGUoMiwyKSx0cmFuc2xhdGUoLTYsLTYpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgorICAgIDxwYXRoIGQ9Ik03IDEwbDUgNSA1LTV6Ii8+CisgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19hcnJvd19kcm9wX3VwX3doaXRlXzE4cHguc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF91cF93aGl0ZV8xOHB4LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWM5MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF91cF93aGl0ZV8xOHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgZmlsbD0iI0ZGRkZGRiIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iNDgiIHRyYW5zZm9ybT0ic2NhbGUoMiwyKSx0cmFuc2xhdGUoLTYsLTYpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgorICAgIDxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6Ii8+CisgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19iYXR0ZXJ5XzgwXzY3N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2JhdHRlcnlfODBfNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTdiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19iYXR0ZXJ5XzgwXzY3N180OGRwLnN2ZwpAQCAtMCwwICsxLDUgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2ODcwNzQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4zIiBkPSJNMzQgMTAuNjdDMzQgOS4xOSAzMi44MSA4IDMxLjMzIDhIMjhWNGgtOHY0aC0zLjMzQzE1LjE5IDggMTQgOS4xOSAxNCAxMC42N1YxOGgyMHYtNy4zM3oiLz4KKyAgICA8cGF0aCBkPSJNMTQgMTh2MjMuMzNDMTQgNDIuOCAxNS4xOSA0NCAxNi42NyA0NGgxNC42N2MxLjQ3IDAgMi42Ny0xLjE5IDIuNjctMi42N1YxOEgxNHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2FsbF9lbmRfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2FsbF9lbmRfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTg1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jYWxsX2VuZF8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTI0IDE4Yy0zLjIxIDAtNi4zLjUtOS4yIDEuNDR2Ni4yMWMwIC43OS0uNDYgMS40Ny0xLjEyIDEuOC0xLjk1Ljk4LTMuNzQgMi4yMy01LjMzIDMuNy0uMzYuMzUtLjg1LjU3LTEuNC41Ny0uNTUgMC0xLjA1LS4yMi0xLjQxLS41OUwuNTkgMjYuMThjLS4zNy0uMzctLjU5LS44Ny0uNTktMS40MiAwLS41NS4yMi0xLjA1LjU5LTEuNDJDNi42OCAxNy41NSAxNC45MyAxNCAyNCAxNHMxNy4zMiAzLjU1IDIzLjQxIDkuMzRjLjM3LjM2LjU5Ljg3LjU5IDEuNDIgMCAuNTUtLjIyIDEuMDUtLjU5IDEuNDFsLTQuOTUgNC45NWMtLjM2LjM2LS44Ni41OS0xLjQxLjU5LS41NCAwLTEuMDQtLjIyLTEuNC0uNTctMS41OS0xLjQ3LTMuMzgtMi43Mi01LjMzLTMuNy0uNjYtLjMzLTEuMTItMS4wMS0xLjEyLTEuOHYtNi4yMUMzMC4zIDE4LjUgMjcuMjEgMTggMjQgMTh6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2NhbGxfZW5kXzE1NV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2NhbGxfZW5kXzE1NV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU3ZjgwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2FsbF9lbmRfMTU1XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzFiNWM1OCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0yNCAxOGMtMy4yMSAwLTYuMy41LTkuMiAxLjQ0djYuMjFjMCAuNzktLjQ2IDEuNDctMS4xMiAxLjgtMS45NS45OC0zLjc0IDIuMjMtNS4zMyAzLjctLjM2LjM1LS44NS41Ny0xLjQuNTctLjU1IDAtMS4wNS0uMjItMS40MS0uNTlMLjU5IDI2LjE4Yy0uMzctLjM3LS41OS0uODctLjU5LTEuNDIgMC0uNTUuMjItMS4wNS41OS0xLjQyQzYuNjggMTcuNTUgMTQuOTMgMTQgMjQgMTRzMTcuMzIgMy41NSAyMy40MSA5LjM0Yy4zNy4zNi41OS44Ny41OSAxLjQyIDAgLjU1LS4yMiAxLjA1LS41OSAxLjQxbC00Ljk1IDQuOTVjLS4zNi4zNi0uODYuNTktMS40MS41OS0uNTQgMC0xLjA0LS4yMi0xLjQtLjU3LTEuNTktMS40Ny0zLjM4LTIuNzItNS4zMy0zLjctLjY2LS4zMy0xLjEyLTEuMDEtMS4xMi0xLjh2LTYuMjFDMzAuMyAxOC41IDI3LjIxIDE4IDI0IDE4eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jYW1lcmFfNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2FtZXJhXzY3N180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY2NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2FtZXJhXzY3N180OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2ODcwNzQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTguOCAyMWw5LjUzLTE2LjUxQzI2Ljk0IDQuMTggMjUuNDkgNCAyNCA0Yy00LjggMC05LjE5IDEuNjktMTIuNjQgNC41MWw3LjMzIDEyLjY5LjExLS4yem0yNC4yOC0zYy0xLjg0LTUuODUtNi4zLTEwLjUyLTExLjk5LTEyLjY4TDIzLjc3IDE4aDE5LjMxem0uNTIgMkgyOC42MmwuNTggMSA5LjUzIDE2LjVDNDEuOTkgMzMuOTQgNDQgMjkuMjEgNDQgMjRjMC0xLjM3LS4xNC0yLjcxLS40LTR6bS0yNi41MyA0bC03LjgtMTMuNUM2LjAxIDE0LjA2IDQgMTguNzkgNCAyNGMwIDEuMzcuMTQgMi43MS40IDRoMTQuOThsLTIuMzEtNHpNNC45MiAzMGMxLjg0IDUuODUgNi4zIDEwLjUyIDExLjk5IDEyLjY4TDI0LjIzIDMwSDQuOTJ6bTIyLjU0IDBsLTcuOCAxMy41MWMxLjQuMzEgMi44NS40OSA0LjM0LjQ5IDQuOCAwIDkuMTktMS42OSAxMi42NC00LjUxTDI5LjMxIDI2LjggMjcuNDYgMzB6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2NoZWNrX2JveF8wQkFfMjRkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jaGVja19ib3hfMEJBXzI0ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjViMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jaGVja19ib3hfMEJBXzI0ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS05IDE0bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2NoZWNrX2JveF9vdXRsaW5lX2JsYW5rX0JDQ18yNGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2NoZWNrX2JveF9vdXRsaW5lX2JsYW5rX0JDQ18yNGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU3ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfY2hlY2tfYm94X291dGxpbmVfYmxhbmtfQkNDXzI0ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2JlYzFjMyI+CisgICAgPHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ii8+CisgICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jbG9zZV80OHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2Nsb3NlXzQ4cHguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDA4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19jbG9zZV80OHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMwMDAwMDAiPgorICAgIDxwYXRoIGQ9Ik0zOCAxMi44M0wzNS4xNyAxMCAyNCAyMS4xNyAxMi44MyAxMCAxMCAxMi44MyAyMS4xNyAyNCAxMCAzNS4xNyAxMi44MyAzOCAyNCAyNi44MyAzNS4xNyAzOCAzOCAzNS4xNyAyNi44MyAyNHoiIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIi8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19maWxlX2Rvd25sb2FkXzY3N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2ZpbGVfZG93bmxvYWRfNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2NlODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19maWxlX2Rvd25sb2FkXzY3N180OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2ODcwNzQiPgorICAgIDxwYXRoIGQ9Ik0zOCAxOGgtOFY2SDE4djEyaC04bDE0IDE0IDE0LTE0ek0xMCAzNnY0aDI4di00SDEweiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfZmlsZV91cGxvYWRfNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfZmlsZV91cGxvYWRfNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGI1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19maWxlX3VwbG9hZF82NzdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjg3MDc0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTE4IDMyaDEyVjIwaDhMMjQgNiAxMCAyMGg4em0tOCA0aDI4djRIMTB6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2ZpbHRlcl90aWx0X3NoaWZ0XzY3N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2ZpbHRlcl90aWx0X3NoaWZ0XzY3N180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjIyNzNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfZmlsdGVyX3RpbHRfc2hpZnRfNjc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzY4NzA3NCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0yMiA4LjE0VjQuMWMtNC4wMi40LTcuNjggMi0xMC42NSA0LjQybDIuODUgMi44NWMyLjIyLTEuNzEgNC44OC0yLjg3IDcuOC0zLjIzem0xNC42NS4zOEMzMy42OSA2LjEgMzAuMDIgNC41IDI2IDQuMXY0LjA0YzIuOTIuMzcgNS41OCAxLjUyIDcuOCAzLjI0bDIuODUtMi44NnpNMzkuODYgMjJoNC4wNGMtLjQtNC4wMi0yLTcuNjgtNC40Mi0xMC42NWwtMi44NSAyLjg1YzEuNzEgMi4yMiAyLjg3IDQuODggMy4yMyA3Ljh6bS0yOC40OC03LjhsLTIuODUtMi44NUM2LjEgMTQuMzIgNC41IDE3Ljk4IDQuMSAyMmg0LjA0Yy4zNy0yLjkyIDEuNTItNS41OCAzLjI0LTcuOHpNOC4xNCAyNkg0LjFjLjQgNC4wMiAyIDcuNjggNC40MiAxMC42NWwyLjg1LTIuODVjLTEuNzEtMi4yMi0yLjg2LTQuODktMy4yMy03Ljh6TTMwIDI0YzAtMy4zMS0yLjY5LTYtNi02cy02IDIuNjktNiA2IDIuNjkgNiA2IDYgNi0yLjY5IDYtNnptNi42MiA5Ljc5bDIuODUgMi44NUM0MS45IDMzLjY4IDQzLjUgMzAuMDIgNDMuOSAyNmgtNC4wNGMtLjM2IDIuOTEtMS41MiA1LjU4LTMuMjQgNy43OXpNMjYgMzkuODZ2NC4wNGM0LjAyLS40IDcuNjgtMiAxMC42NS00LjQybC0yLjg1LTIuODVjLTIuMjIgMS43MS00Ljg4IDIuODYtNy44IDMuMjN6bS0xNC42NS0uMzhDMTQuMzIgNDEuOSAxNy45OCA0My41IDIyIDQzLjl2LTQuMDRjLTIuOTItLjM3LTUuNTgtMS41Mi03LjgtMy4yNGwtMi44NSAyLjg2eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19maW5nZXJwcmludF82NzdfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19maW5nZXJwcmludF82NzdfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViNzljMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2ZpbmdlcnByaW50XzY3N180OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2ODcwNzQiPgorICAgIDxwYXRoIGQ9Ik0zNS42MiA4Ljk0Yy0uMTYgMC0uMzEtLjA0LS40Ni0uMTFDMzEuMzMgNi44NSAyOCA2IDI0LjAyIDZjLTMuOTcgMC03LjcxLjk1LTExLjE0IDIuODItLjQ5LjI2LTEuMDkuMDktMS4zNi0uNC0uMjYtLjQ5LS4wOS0xLjA5LjQtMS4zNkMxNS42NSA1LjAzIDE5LjcyIDQgMjQuMDIgNGM0LjI2IDAgNy45OC45NCAxMi4wNiAzLjA1LjQ5LjI1LjY4Ljg2LjQzIDEuMzUtLjE4LjM0LS41My41NC0uODkuNTR6TTcgMTkuNDRjLS4yIDAtLjQtLjA2LS41OC0uMTgtLjQ1LS4zMi0uNTYtLjk0LS4yNC0xLjM5IDEuOTgtMi44IDQuNTEtNSA3LjUxLTYuNTUgNi4yOS0zLjI1IDE0LjMzLTMuMjYgMjAuNjMtLjAyIDIuOTkgMS41NCA1LjUxIDMuNzIgNy41IDYuNS4zMi40NS4yMiAxLjA3LS4yMyAxLjM5LS40NS4zMi0xLjA4LjIyLTEuNC0uMjMtMS44LTIuNTItNC4wOC00LjUtNi43OC01Ljg4LTUuNzQtMi45NS0xMy4wNy0yLjk0LTE4LjguMDItMi43MSAxLjQtNSAzLjM5LTYuNzkgNS45My0uMi4yNy0uNTEuNDEtLjgyLjQxem0xMi41MSAyNC4xM2MtLjI2IDAtLjUxLS4xLS43MS0uMy0xLjczLTEuNzUtMi42Ny0yLjg2LTQuMDItNS4yNy0xLjM4LTIuNDYtMi4xMS01LjQ3LTIuMTEtOC42OSAwLTUuOTQgNS4wOC0xMC43OCAxMS4zMy0xMC43OHMxMS4zMyA0LjgzIDExLjMzIDEwLjc4YzAgLjU1LS40NSAxLTEgMXMtMS0uNDUtMS0xYzAtNC44NC00LjE4LTguNzgtOS4zMy04Ljc4LTUuMTQgMC05LjMzIDMuOTQtOS4zMyA4Ljc4IDAgMi44OC42NCA1LjU0IDEuODUgNy43MSAxLjI5IDIuMyAyLjE1IDMuMjkgMy42OSA0Ljg0LjM5LjM5LjM5IDEuMDMtLjAxIDEuNDEtLjE4LjIxLS40NC4zLS42OS4zem0xNC4zMy0zLjdjLTIuMzggMC00LjQ3LS42LTYuMi0xLjc3LTIuOTctMi4wMi00Ljc1LTUuMy00Ljc1LTguNzggMC0uNTUuNDUtMSAxLTFzMSAuNDUgMSAxYzAgMi44MSAxLjQ1IDUuNDcgMy44OCA3LjEyIDEuNDEuOTYgMy4wNyAxLjQzIDUuMDcgMS40My40OCAwIDEuMjktLjA1IDIuMDktLjE5LjU0LS4xIDEuMDYuMjcgMS4xNi44MS4xLjU0LS4yNyAxLjA2LS44MSAxLjE2LTEuMTcuMjEtMi4xNi4yMi0yLjQ0LjIyek0yOS44MSA0NGMtLjA5IDAtLjE4LS4wMS0uMjYtLjA0LTMuMTktLjg3LTUuMjctMi4wNS03LjQzLTQuMi0yLjc5LTIuNzgtNC4zMy02LjQ5LTQuMzMtMTAuNDQgMC0zLjI1IDIuNzYtNS44OSA2LjE2LTUuODkgMy40IDAgNi4xNiAyLjY0IDYuMTYgNS44OSAwIDIuMTQgMS44NyAzLjg5IDQuMTYgMy44OXM0LjE2LTEuNzQgNC4xNi0zLjg5YzAtNy41NC02LjUtMTMuNjctMTQuNDktMTMuNjctNS42OSAwLTEwLjg4IDMuMTYtMTMuMjIgOC4wNi0uNzggMS42Mi0xLjE3IDMuNTEtMS4xNyA1LjYxIDAgMS41Ni4xNCA0LjAyIDEuMzMgNy4yMS4xOS41Mi0uMDcgMS4wOS0uNTkgMS4yOS0uNTIuMTktMS4wOS0uMDctMS4yOS0uNTktLjk4LTIuNjMtMS40Ni01LjIxLTEuNDYtNy45MSAwLTIuNC40Ni00LjU4IDEuMzctNi40NyAyLjY3LTUuNTggOC41Ny05LjE5IDE1LjAyLTkuMTkgOS4wOSAwIDE2LjQ5IDcuMDMgMTYuNDkgMTUuNjcgMCAzLjI1LTIuNzcgNS44OS02LjE2IDUuODlzLTYuMTYtMi42NC02LjE2LTUuODljMC0yLjE0LTEuODctMy44OS00LjE2LTMuODlzLTQuMTYgMS43NC00LjE2IDMuODljMCAzLjQxIDEuMzMgNi42MiAzLjc0IDkuMDIgMS44OSAxLjg4IDMuNzMgMi45MiA2LjU1IDMuNjkuNTMuMTUuODUuNy43IDEuMjMtLjEyLjQ0LS41Mi43My0uOTYuNzN6Ii8+CisgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGg0OHY0OEgweiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19mb2xkZXJfYmNjXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfZm9sZGVyX2JjY180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjgzMTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfZm9sZGVyX2JjY180OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiZWMxYzMiPgorICAgIDxwYXRoIGQ9Ik0yMCA4SDhjLTIuMjEgMC0zLjk4IDEuNzktMy45OCA0TDQgMzZjMCAyLjIxIDEuNzkgNCA0IDRoMzJjMi4yMSAwIDQtMS43OSA0LTRWMTZjMC0yLjIxLTEuNzktNC00LTRIMjRsLTQtNHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2hlbHBfNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfaGVscF82NzdfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX2hlbHBfNjc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzY4NzA3NCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0yNCA0QzEyLjk1IDQgNCAxMi45NSA0IDI0czguOTUgMjAgMjAgMjAgMjAtOC45NSAyMC0yMFMzNS4wNSA0IDI0IDR6bTIgMzRoLTR2LTRoNHY0em00LjEzLTE1LjQ5bC0xLjc5IDEuODRDMjYuOSAyNS43OSAyNiAyNyAyNiAzMGgtNHYtMWMwLTIuMjEuOS00LjIxIDIuMzQtNS42NmwyLjQ5LTIuNTJDMjcuNTUgMjAuMSAyOCAxOS4xIDI4IDE4YzAtMi4yMS0xLjc5LTQtNC00cy00IDEuNzktNCA0aC00YzAtNC40MiAzLjU4LTggOC04czggMy41OCA4IDhjMCAxLjc2LS43MSAzLjM1LTEuODcgNC41MXoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfaGVscF9vdXRsaW5lX3doaXRlXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfaGVscF9vdXRsaW5lX3doaXRlXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjA3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19oZWxwX291dGxpbmVfd2hpdGVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB0cmFuc2Zvcm09InNjYWxlKDIsMikiIGZpbGw9IiNGRkZGRkYiPgorICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMHoiLz4KKyAgICA8cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfa2V5Ym9hcmRfNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfa2V5Ym9hcmRfNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWVjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19rZXlib2FyZF82NzdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjg3MDc0Ij4KKyAgICA8cGF0aCBkPSJNNDAgMTBIOGMtMi4yMSAwLTMuOTggMS43OS0zLjk4IDRMNCAzNGMwIDIuMjEgMS43OSA0IDQgNGgzMmMyLjIxIDAgNC0xLjc5IDQtNFYxNGMwLTIuMjEtMS43OS00LTQtNHptLTE4IDZoNHY0aC00di00em0wIDZoNHY0aC00di00em0tNi02aDR2NGgtNHYtNHptMCA2aDR2NGgtNHYtNHptLTIgNGgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTE4IDE0SDE2di00aDE2djR6bTAtOGgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6bTYgNmgtNHYtNGg0djR6bTAtNmgtNHYtNGg0djR6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgwem0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfbG9jYXRpb25fb25fNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfbG9jYXRpb25fb25fNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmExZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19sb2NhdGlvbl9vbl82NzdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjg3MDc0Ij4KKyAgICA8cGF0aCBkPSJNMjQgNGMtNy43MyAwLTE0IDYuMjctMTQgMTQgMCAxMC41IDE0IDI2IDE0IDI2czE0LTE1LjUgMTQtMjZjMC03LjczLTYuMjctMTQtMTQtMTR6bTAgMTljLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfbWVzc2FnZV82NzdfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19tZXNzYWdlXzY3N180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM4MDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfbWVzc2FnZV82NzdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjg3MDc0Ij4KKyAgICA8cGF0aCBkPSJNNDAgNEg4QzUuNzkgNCA0LjAyIDUuNzkgNC4wMiA4TDQgNDRsOC04aDI4YzIuMjEgMCA0LTEuNzkgNC00VjhjMC0yLjIxLTEuNzktNC00LTR6bS00IDI0SDEydi00aDI0djR6bTAtNkgxMnYtNGgyNHY0em0wLTZIMTJ2LTRoMjR2NHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX21vcmVfaG9yaXpfd2hpdGVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19tb3JlX2hvcml6X3doaXRlXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjA1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19tb3JlX2hvcml6X3doaXRlXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI0ZGRkZGRiI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xMiAyMGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6bTI0IDBjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0tMTIgMGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BhdXNlXzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BhdXNlXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzE0ZjQyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGF1c2VfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTEyIDM4aDhWMTBoLTh2Mjh6bTE2LTI4djI4aDhWMTBoLTh6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19wYXVzZV8xNTVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19wYXVzZV8xNTVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MWEzYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BhdXNlXzE1NV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMxYjVjNTgiPgorICAgIDxwYXRoIGQ9Ik0xMiAzOGg4VjEwaC04djI4em0xNi0yOHYyOGg4VjEwaC04eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTEzLjI1IDIxLjU5YzIuODggNS42NiA3LjUxIDEwLjI5IDEzLjE4IDEzLjE3bDQuNC00LjQxYy41NS0uNTUgMS4zNC0uNzEgMi4wMy0uNDlDMzUuMSAzMC42IDM3LjUxIDMxIDQwIDMxYzEuMTEgMCAyIC44OSAyIDJ2N2MwIDEuMTEtLjg5IDItMiAyQzIxLjIyIDQyIDYgMjYuNzggNiA4YzAtMS4xMS45LTIgMi0yaDdjMS4xMSAwIDIgLjg5IDIgMiAwIDIuNDkuNCA0LjkgMS4xNCA3LjE0LjIyLjY5LjA2IDEuNDgtLjQ5IDIuMDNsLTQuNCA0LjQyeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV8xNTVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV8xNTVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlNWI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lXzE1NV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMxYjVjNTgiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTMuMjUgMjEuNTljMi44OCA1LjY2IDcuNTEgMTAuMjkgMTMuMTggMTMuMTdsNC40LTQuNDFjLjU1LS41NSAxLjM0LS43MSAyLjAzLS40OUMzNS4xIDMwLjYgMzcuNTEgMzEgNDAgMzFjMS4xMSAwIDIgLjg5IDIgMnY3YzAgMS4xMS0uODkgMi0yIDJDMjEuMjIgNDIgNiAyNi43OCA2IDhjMC0xLjExLjktMiAyLTJoN2MxLjExIDAgMiAuODkgMiAyIDAgMi40OS40IDQuOSAxLjE0IDcuMTQuMjIuNjkuMDYgMS40OC0uNDkgMi4wM2wtNC40IDQuNDJ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lXzY3N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lXzY3N180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M1ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfNjc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzY4NzA3NCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xMy4yNSAyMS41OWMyLjg4IDUuNjYgNy41MSAxMC4yOSAxMy4xOCAxMy4xN2w0LjQtNC40MWMuNTUtLjU1IDEuMzQtLjcxIDIuMDMtLjQ5QzM1LjEgMzAuNiAzNy41MSAzMSA0MCAzMWMxLjExIDAgMiAuODkgMiAydjdjMCAxLjExLS44OSAyLTIgMkMyMS4yMiA0MiA2IDI2Ljc4IDYgOGMwLTEuMTEuOS0yIDItMmg3YzEuMTEgMCAyIC44OSAyIDIgMCAyLjQ5LjQgNC45IDEuMTQgNy4xNC4yMi42OS4wNiAxLjQ4LS40OSAyLjAzbC00LjQgNC40MnoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfYW5kcm9pZF9sYW5kc2NhcGUuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfYW5kcm9pZF9sYW5kc2NhcGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmRiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV9hbmRyb2lkX2xhbmRzY2FwZS5zdmcKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCisgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgorICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKKyAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgorICAgZmlsbD0iIzAwMDAwMCIKKyAgIGhlaWdodD0iNDgiCisgICB2aWV3Qm94PSIwIDAgNDggNDgiCisgICB3aWR0aD0iNDgiCisgICB0cmFuc2Zvcm09InNjYWxlKDIsMikiCisgICBpZD0ic3ZnMzA4OSIKKyAgIHZlcnNpb249IjEuMSIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKKyAgIHNvZGlwb2RpOmRvY25hbWU9ImljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9wb3J0cmFpdC5zdmciPgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhMzA5OSI+CisgICAgPHJkZjpSREY+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiPgorICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KKyAgICAgICAgPGRjOnR5cGUKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CisgICAgICA8L2NjOldvcms+CisgICAgPC9yZGY6UkRGPgorICA8L21ldGFkYXRhPgorICA8ZGVmcworICAgICBpZD0iZGVmczMwOTciIC8+CisgIDxzb2RpcG9kaTpuYW1lZHZpZXcKKyAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgorICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKKyAgICAgYm9yZGVyb3BhY2l0eT0iMSIKKyAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKKyAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCisgICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKKyAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCisgICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCisgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTE0MCIKKyAgICAgaWQ9Im5hbWVkdmlldzMwOTUiCisgICAgIHNob3dncmlkPSJmYWxzZSIKKyAgICAgaW5rc2NhcGU6em9vbT0iNC45MTY2NjY3IgorICAgICBpbmtzY2FwZTpjeD0iLTExLjA4NDc0NiIKKyAgICAgaW5rc2NhcGU6Y3k9IjcuNzI4ODEzNiIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgorICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmczMDg5IiAvPgorICA8cGF0aAorICAgICBkPSJtIDEsOCAwLDggYyAwLDEuNjYgMS4zNCwzIDMsMyBsIDE2LDAgYyAxLjY2LDAgMywtMS4zNCAzLC0zIEwgMjMsOCBDIDIzLDYuMzQgMjEuNjYsNSAyMCw1IEwgNCw1IEMgMi4zNCw1IDEsNi4zNCAxLDggeiBtIDIwLDIgMCw0IC0xLDAgMCwtNCAxLDAgeiBtIC0zLC0zLjI1IDAsMTAuNSAtMTQsMCAwLC0xMC41IDE0LDAgeiIKKyAgICAgaWQ9InBhdGgzMDkxIgorICAgICBzdHlsZT0iZmlsbDojMDBiZWE0O2ZpbGwtb3BhY2l0eToxIgorICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPgorICA8cGF0aAorICAgICBkPSJNMCAwaDI0djI0SDB6IgorICAgICBmaWxsPSJub25lIgorICAgICBpZD0icGF0aDMwOTMiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcG9ydHJhaXQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfYW5kcm9pZF9wb3J0cmFpdC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlZWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcG9ydHJhaXQuc3ZnCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKKyAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIGZpbGw9IiMwMDAwMDAiCisgICBoZWlnaHQ9IjQ4IgorICAgdmlld0JveD0iMCAwIDQ4IDQ4IgorICAgd2lkdGg9IjQ4IgorICAgdHJhbnNmb3JtPSJzY2FsZSgyLDIpIgorICAgaWQ9InN2ZzMwODkiCisgICB2ZXJzaW9uPSIxLjEiCisgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjQgcjk5MzkiCisgICBzb2RpcG9kaTpkb2NuYW1lPSJpY19waG9uZV9hbmRyb2lkX3BvcnRyYWl0LnN2ZyI+CisgIDxtZXRhZGF0YQorICAgICBpZD0ibWV0YWRhdGEzMDk5Ij4KKyAgICA8cmRmOlJERj4KKyAgICAgIDxjYzpXb3JrCisgICAgICAgICByZGY6YWJvdXQ9IiI+CisgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgorICAgICAgICA8ZGM6dHlwZQorICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgorICAgICAgPC9jYzpXb3JrPgorICAgIDwvcmRmOlJERj4KKyAgPC9tZXRhZGF0YT4KKyAgPGRlZnMKKyAgICAgaWQ9ImRlZnMzMDk3IiAvPgorICA8c29kaXBvZGk6bmFtZWR2aWV3CisgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKKyAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCisgICAgIGJvcmRlcm9wYWNpdHk9IjEiCisgICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCisgICAgIGdyaWR0b2xlcmFuY2U9IjEwIgorICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCisgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgorICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNDAiCisgICAgIGlkPSJuYW1lZHZpZXczMDk1IgorICAgICBzaG93Z3JpZD0iZmFsc2UiCisgICAgIGlua3NjYXBlOnpvb209IjQuOTE2NjY2NyIKKyAgICAgaW5rc2NhcGU6Y3g9Ii0xMS4wODQ3NDYiCisgICAgIGlua3NjYXBlOmN5PSI3LjcyODgxMzYiCisgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKKyAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzA4OSIgLz4KKyAgPHBhdGgKKyAgICAgZD0iTTE2IDFIOEM2LjM0IDEgNSAyLjM0IDUgNHYxNmMwIDEuNjYgMS4zNCAzIDMgM2g4YzEuNjYgMCAzLTEuMzQgMy0zVjRjMC0xLjY2LTEuMzQtMy0zLTN6bS0yIDIwaC00di0xaDR2MXptMy4yNS0zSDYuNzVWNGgxMC41djE0eiIKKyAgICAgaWQ9InBhdGgzMDkxIgorICAgICBzdHlsZT0iZmlsbDojMDBiZWE0O2ZpbGwtb3BhY2l0eToxIiAvPgorICA8cGF0aAorICAgICBkPSJNMCAwaDI0djI0SDB6IgorICAgICBmaWxsPSJub25lIgorICAgICBpZD0icGF0aDMwOTMiIC8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9sYW5kc2NhcGUuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX2xhbmRzY2FwZS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0NzdhZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9sYW5kc2NhcGUuc3ZnCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKKyAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIGZpbGw9IiMwMDAwMDAiCisgICBoZWlnaHQ9IjQ4IgorICAgdmlld0JveD0iMCAwIDQ4IDQ4IgorICAgd2lkdGg9IjQ4IgorICAgdHJhbnNmb3JtPSJzY2FsZSgyLDIpIgorICAgaWQ9InN2ZzMwODkiCisgICB2ZXJzaW9uPSIxLjEiCisgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjQgcjk5MzkiCisgICBzb2RpcG9kaTpkb2NuYW1lPSJpY19waG9uZV9hbmRyb2lkX2xhbmRzY2FwZS5zdmciPgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhMzA5OSI+CisgICAgPHJkZjpSREY+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiPgorICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KKyAgICAgICAgPGRjOnR5cGUKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CisgICAgICA8L2NjOldvcms+CisgICAgPC9yZGY6UkRGPgorICA8L21ldGFkYXRhPgorICA8ZGVmcworICAgICBpZD0iZGVmczMwOTciIC8+CisgIDxzb2RpcG9kaTpuYW1lZHZpZXcKKyAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgorICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKKyAgICAgYm9yZGVyb3BhY2l0eT0iMSIKKyAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKKyAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCisgICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKKyAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCisgICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCisgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTE0MCIKKyAgICAgaWQ9Im5hbWVkdmlldzMwOTUiCisgICAgIHNob3dncmlkPSJmYWxzZSIKKyAgICAgaW5rc2NhcGU6em9vbT0iNC45MTY2NjY3IgorICAgICBpbmtzY2FwZTpjeD0iLTExLjA4NDc0NiIKKyAgICAgaW5rc2NhcGU6Y3k9IjcuNzI4ODEzNiIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgorICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmczMDg5IiAvPgorICA8cGF0aAorICAgICBkPSJNIDIzLDE2IDIzLDggQyAyMyw2LjM0IDIxLjY2LDUgMjAsNSBMIDQsNSBDIDIuMzQsNSAxLDYuMzQgMSw4IGwgMCw4IGMgMCwxLjY2IDEuMzQsMyAzLDMgbCAxNiwwIGMgMS42NiwwIDMsLTEuMzQgMywtMyB6IG0gLTIwLC0yIDAsLTQgMSwwIDAsNCAtMSwwIHogbSAzLDMuMjUgMCwtMTAuNSAxNCwwIDAsMTAuNSAtMTQsMCB6IgorICAgICBpZD0icGF0aDMwOTEiCisgICAgIHN0eWxlPSJmaWxsOiMwMGJlYTQ7ZmlsbC1vcGFjaXR5OjEiCisgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CisgIDxwYXRoCisgICAgIGQ9Ik0wIDBoMjR2MjRIMHoiCisgICAgIGZpbGw9Im5vbmUiCisgICAgIGlkPSJwYXRoMzA5MyIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX3BvcnRyYWl0LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9wb3J0cmFpdC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNWUwYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9wb3J0cmFpdC5zdmcKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCisgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgorICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKKyAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgorICAgZmlsbD0iIzAwMDAwMCIKKyAgIGhlaWdodD0iNDgiCisgICB2aWV3Qm94PSIwIDAgNDggNDgiCisgICB3aWR0aD0iNDgiCisgICB0cmFuc2Zvcm09InNjYWxlKDIsMikiCisgICBpZD0ic3ZnMzA4OSIKKyAgIHZlcnNpb249IjEuMSIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKKyAgIHNvZGlwb2RpOmRvY25hbWU9ImljX3Bob25lX2FuZHJvaWRfcG9ydHJhaXQuc3ZnIj4KKyAgPG1ldGFkYXRhCisgICAgIGlkPSJtZXRhZGF0YTMwOTkiPgorICAgIDxyZGY6UkRGPgorICAgICAgPGNjOldvcmsKKyAgICAgICAgIHJkZjphYm91dD0iIj4KKyAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CisgICAgICAgIDxkYzp0eXBlCisgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CisgICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgorICAgICAgPC9jYzpXb3JrPgorICAgIDwvcmRmOlJERj4KKyAgPC9tZXRhZGF0YT4KKyAgPGRlZnMKKyAgICAgaWQ9ImRlZnMzMDk3IiAvPgorICA8c29kaXBvZGk6bmFtZWR2aWV3CisgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKKyAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCisgICAgIGJvcmRlcm9wYWNpdHk9IjEiCisgICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCisgICAgIGdyaWR0b2xlcmFuY2U9IjEwIgorICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCisgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgorICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNDAiCisgICAgIGlkPSJuYW1lZHZpZXczMDk1IgorICAgICBzaG93Z3JpZD0iZmFsc2UiCisgICAgIGlua3NjYXBlOnpvb209IjQuOTE2NjY2NyIKKyAgICAgaW5rc2NhcGU6Y3g9Ii0xMS4wODQ3NDYiCisgICAgIGlua3NjYXBlOmN5PSI3LjcyODgxMzYiCisgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKKyAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzA4OSIgLz4KKyAgPHBhdGgKKyAgICAgZD0ibSA4LDIzIDgsMCBjIDEuNjYsMCAzLC0xLjM0IDMsLTMgTCAxOSw0IEMgMTksMi4zNCAxNy42NiwxIDE2LDEgTCA4LDEgQyA2LjM0LDEgNSwyLjM0IDUsNCBsIDAsMTYgYyAwLDEuNjYgMS4zNCwzIDMsMyB6IG0gMiwtMjAgNCwwIDAsMSAtNCwwIDAsLTEgeiBtIC0zLjI1LDMgMTAuNSwwIDAsMTQgLTEwLjUsMCAwLC0xNCB6IgorICAgICBpZD0icGF0aDMwOTEiCisgICAgIHN0eWxlPSJmaWxsOiMwMGJlYTQ7ZmlsbC1vcGFjaXR5OjEiCisgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+CisgIDxwYXRoCisgICAgIGQ9Ik0wIDBoMjR2MjRIMHoiCisgICAgIGZpbGw9Im5vbmUiCisgICAgIGlkPSJwYXRoMzA5MyIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfaW5fdGFsa18wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV9pbl90YWxrXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWYwNmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfaW5fdGFsa18wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTQwIDMxYy0yLjQ5IDAtNC44OS0uNC03LjE0LTEuMTQtLjY5LS4yMi0xLjQ4LS4wNi0yLjAzLjQ5bC00LjQgNC40MWMtNS42Ny0yLjg4LTEwLjI5LTcuNTEtMTMuMTgtMTMuMTdsNC40LTQuNDFjLjU1LS41NS43MS0xLjM0LjQ5LTIuMDNDMTcuNCAxMi45IDE3IDEwLjQ5IDE3IDhjMC0xLjExLS44OS0yLTItMkg4Yy0xLjExIDAtMiAuODktMiAyIDAgMTguNzggMTUuMjIgMzQgMzQgMzQgMS4xMSAwIDItLjg5IDItMnYtN2MwLTEuMTEtLjg5LTItMi0yem0tMi03aDRjMC05Ljk0LTguMDYtMTgtMTgtMTh2NGM3LjczIDAgMTQgNi4yNyAxNCAxNHptLTggMGg0YzAtNS41Mi00LjQ4LTEwLTEwLTEwdjRjMy4zMSAwIDYgMi42OSA2IDZ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2luX3RhbGtfMTU1XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfaW5fdGFsa18xNTVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5YTI2NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob25lX2luX3RhbGtfMTU1XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzFiNWM1OCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik00MCAzMWMtMi40OSAwLTQuODktLjQtNy4xNC0xLjE0LS42OS0uMjItMS40OC0uMDYtMi4wMy40OWwtNC40IDQuNDFjLTUuNjctMi44OC0xMC4yOS03LjUxLTEzLjE4LTEzLjE3bDQuNC00LjQxYy41NS0uNTUuNzEtMS4zNC40OS0yLjAzQzE3LjQgMTIuOSAxNyAxMC40OSAxNyA4YzAtMS4xMS0uODktMi0yLTJIOGMtMS4xMSAwLTIgLjg5LTIgMiAwIDE4Ljc4IDE1LjIyIDM0IDM0IDM0IDEuMTEgMCAyLS44OSAyLTJ2LTdjMC0xLjExLS44OS0yLTItMnptLTItN2g0YzAtOS45NC04LjA2LTE4LTE4LTE4djRjNy43MyAwIDE0IDYuMjcgMTQgMTR6bS04IDBoNGMwLTUuNTItNC40OC0xMC0xMC0xMHY0YzMuMzEgMCA2IDIuNjkgNiA2eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV9wYXVzZWRfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWUzNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzBCQV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMwMGJlYTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMzQgNmgtNHYxNGg0VjZ6bTYgMjVjLTIuNDkgMC00Ljg5LS40LTcuMTQtMS4xNC0uNjktLjIyLTEuNDgtLjA2LTIuMDMuNDlsLTQuNCA0LjQxYy01LjY3LTIuODgtMTAuMjktNy41MS0xMy4xOC0xMy4xN2w0LjQtNC40MWMuNTUtLjU1LjcxLTEuMzQuNDktMi4wM0MxNy40IDEyLjkgMTcgMTAuNDkgMTcgOGMwLTEuMTEtLjg5LTItMi0ySDhjLTEuMTEgMC0yIC44OS0yIDIgMCAxOC43OCAxNS4yMiAzNCAzNCAzNCAxLjExIDAgMi0uODkgMi0ydi03YzAtMS4xMS0uODktMi0yLTJ6TTM4IDZ2MTRoNFY2aC00eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG9uZV9wYXVzZWRfMTU1XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzE1NV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzIyMWEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzE1NV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMxYjVjNTgiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMzQgNmgtNHYxNGg0VjZ6bTYgMjVjLTIuNDkgMC00Ljg5LS40LTcuMTQtMS4xNC0uNjktLjIyLTEuNDgtLjA2LTIuMDMuNDlsLTQuNCA0LjQxYy01LjY3LTIuODgtMTAuMjktNy41MS0xMy4xOC0xMy4xN2w0LjQtNC40MWMuNTUtLjU1LjcxLTEuMzQuNDktMi4wM0MxNy40IDEyLjkgMTcgMTAuNDkgMTcgOGMwLTEuMTEtLjg5LTItMi0ySDhjLTEuMTEgMC0yIC44OS0yIDIgMCAxOC43OCAxNS4yMiAzNCAzNCAzNCAxLjExIDAgMi0uODkgMi0ydi03YzAtMS4xMS0uODktMi0yLTJ6TTM4IDZ2MTRoNFY2aC00eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG90b19jYW1lcmFfd2hpdGVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19waG90b19jYW1lcmFfd2hpdGVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyNWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3Bob3RvX2NhbWVyYV93aGl0ZV80OGRwLnN2ZwpAQCAtMCwwICsxLDUgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNGRkZGRkYiPgorICAgIDxjaXJjbGUgY3g9IjI0IiBjeT0iMjQiIHI9IjYuNCIvPgorICAgIDxwYXRoIGQ9Ik0xOCA0bC0zLjY2IDRIOGMtMi4yMSAwLTQgMS43OS00IDR2MjRjMCAyLjIxIDEuNzkgNCA0IDRoMzJjMi4yMSAwIDQtMS43OSA0LTRWMTJjMC0yLjIxLTEuNzktNC00LTRoLTYuMzRMMzAgNEgxOHptNiAzMGMtNS41MiAwLTEwLTQuNDgtMTAtMTBzNC40OC0xMCAxMC0xMCAxMCA0LjQ4IDEwIDEwLTQuNDggMTAtMTAgMTB6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BsYXlfYXJyb3dfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMWFiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZwpAQCAtMCwwICsxLDUgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTS04MzgtMjIzMkg1NjJ2MzYwMEgtODM4eiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xNiAxMHYyOGwyMi0xNHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BsYXlfYXJyb3dfMTU1XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcGxheV9hcnJvd18xNTVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyYzFhYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3BsYXlfYXJyb3dfMTU1XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMWI1YzU4Ij4KKyAgICA8cGF0aCBkPSJNLTgzOC0yMjMySDU2MnYzNjAwSC04Mzh6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTE2IDEwdjI4bDIyLTE0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcG93ZXJfc2V0dGluZ3NfbmV3XzQ4cHguc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcG93ZXJfc2V0dGluZ3NfbmV3XzQ4cHguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTY4OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19wb3dlcl9zZXR0aW5nc19uZXdfNDhweC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiPgorICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoNDh2NDhIMHoiLz4KKyAgICA8cGF0aCBkPSJNMjYgNmgtNHYyMGg0VjZ6bTkuNjcgNC4zM2wtMi44MyAyLjgzQzM1Ljk4IDE1LjczIDM4IDE5LjYyIDM4IDI0YzAgNy43My02LjI3IDE0LTE0IDE0cy0xNC02LjI3LTE0LTE0YzAtNC4zOCAyLjAyLTguMjcgNS4xNi0xMC44NGwtMi44My0yLjgzQzguNDcgMTMuNjMgNiAxOC41MiA2IDI0YzAgOS45NCA4LjA2IDE4IDE4IDE4czE4LTguMDYgMTgtMThjMC01LjQ4LTIuNDctMTAuMzctNi4zMy0xMy42N3oiIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3JhZGlvX2J1dHRvbl9jaGVja2VkXzBCQV8yNGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3JhZGlvX2J1dHRvbl9jaGVja2VkXzBCQV8yNGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNmOGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmFkaW9fYnV0dG9uX2NoZWNrZWRfMEJBXzI0ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCB0cmFuc2Zvcm0gPSAic2NhbGUoMikiIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiLz4KKyAgICA8cGF0aCB0cmFuc2Zvcm0gPSAic2NhbGUoMikiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmFkaW9fYnV0dG9uX3VuY2hlY2tlZF9CQ0NfMjRkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19yYWRpb19idXR0b25fdW5jaGVja2VkX0JDQ18yNGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTE4MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmFkaW9fYnV0dG9uX3VuY2hlY2tlZF9CQ0NfMjRkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiZWMxYzMiPgorICAgIDxwYXRoIHRyYW5zZm9ybT0ic2NhbGUoMikiIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiLz4KKyAgICA8cGF0aCB0cmFuc2Zvcm09InNjYWxlKDIpIiBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3JlbW92ZV8wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19yZW1vdmVfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjNiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19yZW1vdmVfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTM4IDI2SDEwdi00aDI4djR6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19yZW1vdmVfMTU1XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmVtb3ZlXzE1NV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWFjZjVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmVtb3ZlXzE1NV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMxYjVjNTgiPgorICAgIDxwYXRoIGQ9Ik0zOCAyNkgxMHYtNGgyOHY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmVtb3ZlX3doaXRlXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfcmVtb3ZlX3doaXRlXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzM2IwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19yZW1vdmVfd2hpdGVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjRkZGRkZGIj4KKyAgICA8cGF0aCBkPSJNMzggMjZIMTB2LTRoMjh2NHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NjcmVlbl9yb3RhdGlvbl93aGl0ZV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NjcmVlbl9yb3RhdGlvbl93aGl0ZV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTAzMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfc2NyZWVuX3JvdGF0aW9uX3doaXRlXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI0ZGRkZGRiI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0zMi45NyA1LjAzQzM5LjUgOC4xMyA0NC4xOSAxNC40OCA0NC45IDIyaDNDNDYuODggOS42OCAzNi41OCAwIDI0IDBjLS40NSAwLS44OC4wNC0xLjMzLjA3TDMwLjMgNy43bDIuNjctMi42N3pNMjAuNDYgMy40OWMtMS4xNy0xLjE3LTMuMDctMS4xNy00LjI0IDBMMy40OSAxNi4yMmMtMS4xNyAxLjE3LTEuMTcgMy4wNyAwIDQuMjRMMjcuNTMgNDQuNWMxLjE3IDEuMTcgMy4wNyAxLjE3IDQuMjQgMEw0NC41IDMxLjc3YzEuMTctMS4xNyAxLjE3LTMuMDcgMC00LjI0TDIwLjQ2IDMuNDl6bTkuMiAzOC44OUw1LjYxIDE4LjM0IDE4LjM0IDUuNjFsMjQuMDQgMjQuMDQtMTIuNzIgMTIuNzN6bS0xNC42My41OUM4LjUgMzkuODcgMy44MSAzMy41MiAzLjEgMjZoLTNDMS4xMiAzOC4zMiAxMS40MiA0OCAyNCA0OGMuNDUgMCAuODgtLjA0IDEuMzMtLjA3TDE3LjcgNDAuM2wtMi42NyAyLjY3eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19zZW5kXzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NlbmRfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2YyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19zZW5kXzBCQV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMwMGJlYTQiPgorICAgIDxwYXRoIGQ9Ik00LjAyIDQyTDQ2IDI0IDQuMDIgNiA0IDIwbDMwIDQtMzAgNHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NldHRpbmdzXzY3N180OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NldHRpbmdzXzY3N180OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJjYzkzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfc2V0dGluZ3NfNjc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzY4NzA3NCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0zOC44NiAyNS45NWMuMDgtLjY0LjE0LTEuMjkuMTQtMS45NXMtLjA2LTEuMzEtLjE0LTEuOTVsNC4yMy0zLjMxYy4zOC0uMy40OS0uODQuMjQtMS4yOGwtNC02LjkzYy0uMjUtLjQzLS43Ny0uNjEtMS4yMi0uNDNsLTQuOTggMi4wMWMtMS4wMy0uNzktMi4xNi0xLjQ2LTMuMzgtMS45N0wyOSA0Ljg0Yy0uMDktLjQ3LS41LS44NC0xLS44NGgtOGMtLjUgMC0uOTEuMzctLjk5Ljg0bC0uNzUgNS4zYy0xLjIyLjUxLTIuMzUgMS4xNy0zLjM4IDEuOTdMOS45IDEwLjFjLS40NS0uMTctLjk3IDAtMS4yMi40M2wtNCA2LjkzYy0uMjUuNDMtLjE0Ljk3LjI0IDEuMjhsNC4yMiAzLjMxQzkuMDYgMjIuNjkgOSAyMy4zNCA5IDI0cy4wNiAxLjMxLjE0IDEuOTVsLTQuMjIgMy4zMWMtLjM4LjMtLjQ5Ljg0LS4yNCAxLjI4bDQgNi45M2MuMjUuNDMuNzcuNjEgMS4yMi40M2w0Ljk4LTIuMDFjMS4wMy43OSAyLjE2IDEuNDYgMy4zOCAxLjk3bC43NSA1LjNjLjA4LjQ3LjQ5Ljg0Ljk5Ljg0aDhjLjUgMCAuOTEtLjM3Ljk5LS44NGwuNzUtNS4zYzEuMjItLjUxIDIuMzUtMS4xNyAzLjM4LTEuOTdsNC45OCAyLjAxYy40NS4xNy45NyAwIDEuMjItLjQzbDQtNi45M2MuMjUtLjQzLjE0LS45Ny0uMjQtMS4yOGwtNC4yMi0zLjMxek0yNCAzMWMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3NpZ25hbF9jZWxsdWxhcl8zX2Jhcl82NzdfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19zaWduYWxfY2VsbHVsYXJfM19iYXJfNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwM2E0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19zaWduYWxfY2VsbHVsYXJfM19iYXJfNjc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzY4NzA3NCI+CisgICAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMyIgZD0iTTQgNDRoNDBWNHoiLz4KKyAgICA8cGF0aCBkPSJNMzQgMTRMNCA0NGgzMHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3N0b3BfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfc3RvcF8wQkFfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ1ZDZhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3N0b3BfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xMiAxMmgyNHYyNEgxMnoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfc3RvcF8xNTVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY19zdG9wXzE1NV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGFjYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfc3RvcF8xNTVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMWI1YzU4Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTEyIDEyaDI0djI0SDEyeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY191bmZvbGRfbW9yZV93aGl0ZV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3VuZm9sZF9tb3JlX3doaXRlXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOTYwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY191bmZvbGRfbW9yZV93aGl0ZV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNGRkZGRkYiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMjQgMTEuNjZMMzAuMzQgMThsMi44My0yLjgzTDI0IDZsLTkuMTcgOS4xN0wxNy42NiAxOCAyNCAxMS42NnptMCAyNC42OEwxNy42NiAzMGwtMi44MyAyLjgzTDI0IDQybDkuMTctOS4xN0wzMC4zNCAzMCAyNCAzNi4zNHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfdmlkZW9jYW1fNjc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfdmlkZW9jYW1fNjc3XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTNlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY192aWRlb2NhbV82NzdfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjg3MDc0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTM0IDIxdi03YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjIwYzAgMS4xLjkgMiAyIDJoMjRjMS4xIDAgMi0uOSAyLTJ2LTdsOCA4VjEzbC04IDh6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3ZvbHVtZV9kb3duXzQ4cHguc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfdm9sdW1lX2Rvd25fNDhweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiYTU2YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3ZvbHVtZV9kb3duXzQ4cHguc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4Ij4KKyAgICA8cGF0aCBkPSJNMzcgMjRjMC0zLjUzLTIuMDQtNi41OC01LTguMDV2MTYuMTFjMi45Ni0xLjQ4IDUtNC41MyA1LTguMDZ6bS0yNy02djEyaDhsMTAgMTBWOEwxOCAxOGgtOHoiIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIi8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY192b2x1bWVfdXBfNDhweC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY192b2x1bWVfdXBfNDhweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ZjZiOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL2ljX3ZvbHVtZV91cF80OHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CisgICAgPHBhdGggZD0iTTYgMTh2MTJoOGwxMCAxMFY4TDE0IDE4SDZ6bTI3IDZjMC0zLjUzLTIuMDQtNi41OC01LTguMDV2MTYuMTFjMi45Ni0xLjQ4IDUtNC41MyA1LTguMDZ6TTI4IDYuNDZ2NC4xM2M1Ljc4IDEuNzIgMTAgNy4wNyAxMCAxMy40MXMtNC4yMiAxMS42OS0xMCAxMy40MXY0LjEzYzguMDEtMS44MiAxNC04Ljk3IDE0LTE3LjU0UzM2LjAxIDguMjggMjggNi40NnoiIGZpbGw9IndoaXRlIiBzdHJva2U9IndoaXRlIi8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay9pY196b29tX2luX3doaXRlXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfem9vbV9pbl93aGl0ZV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmRhYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2RhcmsvaWNfem9vbV9pbl93aGl0ZV80OGRwLnN2ZwpAQCAtMCwwICsxLDUgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI0ZGRkZGRiI+CisgICAgPHBhdGggdHJhbnNmb3JtPSJzY2FsZSgyKSIgZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+CisgICAgPHBhdGggdHJhbnNmb3JtPSJzY2FsZSgyKSIgZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgwVjB6Ii8+CisgICAgPHBhdGggdHJhbnNmb3JtPSJzY2FsZSgyKSIgZD0iTTEyIDEwaC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL3RvZ2dsZV9vZmZfZGFyay5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay90b2dnbGVfb2ZmX2RhcmsucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNGI4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay90b2dnbGVfb2ZmX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9kYXJrL3RvZ2dsZV9vbi5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay90b2dnbGVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmQ3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvZGFyay90b2dnbGVfb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9SZW1vdGVfNjc4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9SZW1vdGVfNjc4LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGM3M2NmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L1JlbW90ZV82Nzguc3ZnCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+UmVtb3RlPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJSZW1vdGUiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9ImljX3JhZGlvX2J1dHRvbl91bmNoZWNrZWRfYmxhY2tfMjRkcC1jb3B5LTE4IiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEw0OCwwIEw0OCw0OCBMMCw0OCBMMCwwIFoiIGlkPSJTaGFwZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yNCw0My4yIEMzNC42MDM4NjcyLDQzLjIgNDMuMiwzNC42MDM4NjcyIDQzLjIsMjQgQzQzLjIsMTMuMzk2MTMyOCAzNC42MDM4NjcyLDQuOCAyNCw0LjggQzEzLjM5NjEzMjgsNC44IDQuOCwxMy4zOTYxMzI4IDQuOCwyNCBDNC44LDM0LjYwMzg2NzIgMTMuMzk2MTMyOCw0My4yIDI0LDQzLjIgWiBNMjQsMzEuMiBDMjcuOTc2NDUwMiwzMS4yIDMxLjIsMjcuOTc2NDUwMiAzMS4yLDI0IEMzMS4yLDIwLjAyMzU0OTggMjcuOTc2NDUwMiwxNi44IDI0LDE2LjggQzIwLjAyMzU0OTgsMTYuOCAxNi44LDIwLjAyMzU0OTggMTYuOCwyNCBDMTYuOCwyNy45NzY0NTAyIDIwLjAyMzU0OTgsMzEuMiAyNCwzMS4yIFogTTE5LjgyMzQzNzUsMTMuMzIwMTE3MiBMMjQuMDIzNDM3NSw5LjEyMDExNzE5IEwyOC4yMjM0Mzc1LDEzLjMyMDExNzIgTDE5LjgyMzQzNzUsMTMuMzIwMTE3MiBaIE0xOS44MjM0Mzc1LDM0LjggTDI0LjAyMzQzNzUsMzkgTDI4LjIyMzQzNzUsMzQuOCBMMTkuODIzNDM3NSwzNC44IFogTTEzLjMxOTUzMTMsMTkuOCBMOS4xMTk1MzEyNSwyNCBMMTMuMzE5NTMxMywyOC4yIEwxMy4zMTk1MzEzLDE5LjggWiBNMzQuOCwxOS44IEwzOSwyNCBMMzQuOCwyOC4yIEwzNC44LDE5LjggWiIgaWQ9Ik92YWwtMTYwIiBmaWxsPSIjNjE3ZDhhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9Sb3RhdGVfTGVmdF82Nzguc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L1JvdGF0ZV9MZWZ0XzY3OC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5ODRmNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9Sb3RhdGVfTGVmdF82Nzguc3ZnCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+Um90YXRlX0xlZnQ8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IlJvdGF0ZV9MZWZ0IiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJTaGFwZS0zLSstU2hhcGUtNC0rLVNoYXBlLTYtQ29weS0xMCIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMNDgsMCBMNDgsNDYuNDUxNjEyOSBMMCw0Ni40NTE2MTI5IEwwLDAgWiIgaWQ9IlNoYXBlLTMiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUuNjQyNTM3Miw0LjQ2OTY3NjM1IEwyLjkwMTQxNTc3LDE3LjE4NDM5OTEgQzEuNDk0OTgwMzgsMTguNTkwODM0NSAxLjU0OTg5OTAxLDIwLjg5ODU5NTMgMy4wMDg0MjQ1OSwyMi4zNTcxMjA5IEwyNi43NjcyMTI0LDQ2LjExNTkwODcgQzI4LjIyNTczOCw0Ny41NzQ0MzQzIDMwLjUzMzQ5ODksNDcuNjI5MzUzIDMxLjkzOTkzNDIsNDYuMjIyOTE3NiBMNDQuNjY3ODU2MywzMy40OTQ5OTU1IEM0Ni4wNzQyOTE3LDMyLjA4ODU2MDEgNDYuMDMyMTAxLDI5Ljc2ODA3MTQgNDQuNTczNTc1NCwyOC4zMDk1NDU4IEwyMC44MTQ3ODc2LDQuNTUwNzU3OTMgQzE5LjM1NjI2MiwzLjA5MjIzMjM0IDE3LjA0ODk3MjUsMy4wNjMyNDA5NiAxNS42NDI1MzcyLDQuNDY5Njc2MzUgTDE1LjY0MjUzNzIsNC40Njk2NzYzNSBMMTUuNjQyNTM3Miw0LjQ2OTY3NjM1IFogTTM5LjM4ODEyNTcsMjguMjE1MjY0OSBMMjYuNjYwMjAzNiw0MC45NDMxODY5IEw4LjE4MTE0NjQsMjIuNDY0MTI5NyBMMjAuOTA5MDY4NSw5LjczNjIwNzY2IEwzOS4zODgxMjU3LDI4LjIxNTI2NDkgTDM5LjM4ODEyNTcsMjguMjE1MjY0OSBaIiBpZD0iU2hhcGUtNCIgZmlsbD0iIzYxN2Q4YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMi43LDYuNDE2MTI5MDMgQzM5LjIzLDkuNDE2MTI5MDMgNDMuOTIsMTUuNTYxMjkwMyA0NC42MywyMi44Mzg3MDk3IEw0Ny42MywyMi44Mzg3MDk3IEM0Ni42MSwxMC45MTYxMjkgMzYuMzEsMS41NDgzODcxIDIzLjczLDEuNTQ4Mzg3MSBDMjMuMjgsMS41NDgzODcxIDIyLjg1LDEuNTg3MDk2NzcgMjIuNCwxLjYxNjEyOTAzIEwzMC4wMyw5IEwzMi43LDYuNDE2MTI5MDMgTDMyLjcsNi40MTYxMjkwMyBaIiBpZD0iU2hhcGUtNSIgZmlsbD0iIzYxN2Q4YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvUm90YXRlX1JpZ2h0XzY3OC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvUm90YXRlX1JpZ2h0XzY3OC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiNjk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9Sb3RhdGVfUmlnaHRfNjc4LnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPlJvdGF0ZV9SaWdodDwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iUm90YXRlX1JpZ2h0IiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJTaGFwZS02LSstU2hhcGUtNy0rLVNoYXBlLTktQ29weS0xMiIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMNDgsMCBMNDgsNDYuNDUxNjEyOSBMMCw0Ni40NTE2MTI5IEwwLDAgWiIgaWQ9IlNoYXBlLTYiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0LjAwMDAwMCwgMjMuMjI1ODA2KSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0yNC4wMDAwMDAsIC0yMy4yMjU4MDYpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMS45Mzk0NjI4LDQuNDY5Njc2MzUgTDQ0LjY4MDU4NDIsMTcuMTg0Mzk5MSBDNDYuMDg3MDE5NiwxOC41OTA4MzQ1IDQ2LjAzMjEwMSwyMC44OTg1OTUzIDQ0LjU3MzU3NTQsMjIuMzU3MTIwOSBMMjAuODE0Nzg3Niw0Ni4xMTU5MDg3IEMxOS4zNTYyNjIsNDcuNTc0NDM0MyAxNy4wNDg1MDExLDQ3LjYyOTM1MyAxNS42NDIwNjU4LDQ2LjIyMjkxNzYgTDIuOTE0MTQzNjksMzMuNDk0OTk1NSBDMS41MDc3MDgzLDMyLjA4ODU2MDEgMS41NDk4OTkwMSwyOS43NjgwNzE0IDMuMDA4NDI0NTksMjguMzA5NTQ1OCBMMjYuNzY3MjEyNCw0LjU1MDc1NzkzIEMyOC4yMjU3MzgsMy4wOTIyMzIzNCAzMC41MzMwMjc1LDMuMDYzMjQwOTYgMzEuOTM5NDYyOCw0LjQ2OTY3NjM1IEwzMS45Mzk0NjI4LDQuNDY5Njc2MzUgTDMxLjkzOTQ2MjgsNC40Njk2NzYzNSBaIE04LjE5Mzg3NDMyLDI4LjIxNTI2NDkgTDIwLjkyMTc5NjQsNDAuOTQzMTg2OSBMMzkuNDAwODUzNiwyMi40NjQxMjk3IEwyNi42NzI5MzE1LDkuNzM2MjA3NjYgTDguMTkzODc0MzIsMjguMjE1MjY0OSBMOC4xOTM4NzQzMiwyOC4yMTUyNjQ5IFoiIGlkPSJTaGFwZS03IiBmaWxsPSIjNjE3ZDhhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjMsNi40MTYxMjkwMyBDMTYuODMsOS40MTYxMjkwMyAyMS41MiwxNS41NjEyOTAzIDIyLjIzLDIyLjgzODcwOTcgTDI1LjIzLDIyLjgzODcwOTcgQzI0LjIxLDEwLjkxNjEyOSAxMy45MSwxLjU0ODM4NzEgMS4zMywxLjU0ODM4NzEgQzAuODgsMS41NDgzODcxIDAuNDUsMS41ODcwOTY3NyAwLDEuNjE2MTI5MDMgTDcuNjMsOSBMMTAuMyw2LjQxNjEyOTAzIEwxMC4zLDYuNDE2MTI5MDMgWiIgaWQ9IlNoYXBlLTgiIGZpbGw9IiM2MTdkOGEiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyLjYxNTAwMCwgMTIuMTkzNTQ4KSBzY2FsZSgtMSwgMSkgdHJhbnNsYXRlKC0xMi42MTUwMDAsIC0xMi4xOTM1NDgpICI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvU3lzdGVtX0JhY2tfNjc4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9TeXN0ZW1fQmFja182Nzguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OThiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvU3lzdGVtX0JhY2tfNjc4LnN2ZwpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IlN5c3RlbV9CYWNrIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iUGFnZS0xIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPGcgaWQ9IlN5c3RlbV9CYWNrIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTE4LSstYmFjay0xMi1Db3B5LTExIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTExOCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTM2LjcwODg0NzMsMTAuOTQ5NDc2NSBMMzYuNzA4ODQ3OCwzNy42MzQ5Njg4IEMzNi43MDg4NDc4LDM5LjQwMzk0OTggMzUuNDgyMDg0NCw0MC4wOTQ5MTE1IDMzLjk2NDY1MDgsMzkuMTc1NzY0NyBMMTIuMTM3Mzc5NSwyNS45NTQ0NDk3IEMxMC42MjE4MDEzLDI1LjAzNjQyNjcgMTAuNjE5OTQ1OSwyMy41NDkxNDE0IDEyLjEzNzM3OTQsMjIuNjI5OTk0NiBMMzMuOTY0NjUwMyw5LjQwODY4MDU0IEMzNS40ODAyMjg0LDguNDkwNjU3NjMgMzYuNzA4ODQ3Myw5LjE2ODM1NTExIDM2LjcwODg0NzMsMTAuOTQ5NDc2NSBaIE0zMy41MDg4NDgyLDEzLjQzMDUyMzcgTDMzLjUwODg0ODIsMzUuMTMwNTI0NSBMMTUuNTA4ODQ4MiwyNC4yODA1MjQxIEwzMy41MDg4NDgyLDEzLjQzMDUyMzcgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjNjE3ZDhhIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9TeXN0ZW1fSG9tZV82Nzguc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L1N5c3RlbV9Ib21lXzY3OC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlM2Y2OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9TeXN0ZW1fSG9tZV82Nzguc3ZnCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+U3lzdGVtX0hvbWU8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IlN5c3RlbV9Ib21lIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTE5LSstaG9tZS0xMi1Db3B5LTExIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTExOSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0LDM1LjIgTDI0LDM1LjIgQzMwLjE4NTU4OTIsMzUuMiAzNS4yLDMwLjE4NTU4OTIgMzUuMiwyNCBDMzUuMiwxNy44MTQ0MTA4IDMwLjE4NTU4OTIsMTIuOCAyNCwxMi44IEMxNy44MTQ0MTA4LDEyLjggMTIuOCwxNy44MTQ0MTA4IDEyLjgsMjQgQzEyLjgsMzAuMTg1NTg5MiAxNy44MTQ0MTA4LDM1LjIgMjQsMzUuMiBMMjQsMzUuMiBaIE0yNCwzOC40IEwyNCwzOC40IEMxNi4wNDcwOTk2LDM4LjQgOS42LDMxLjk1MjkwMDQgOS42LDI0IEM5LjYsMTYuMDQ3MDk5NiAxNi4wNDcwOTk2LDkuNiAyNCw5LjYgQzMxLjk1MjkwMDQsOS42IDM4LjQsMTYuMDQ3MDk5NiAzOC40LDI0IEMzOC40LDMxLjk1MjkwMDQgMzEuOTUyOTAwNCwzOC40IDI0LDM4LjQgTDI0LDM4LjQgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjNjE3ZDhhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9TeXN0ZW1fT3ZlcnZpZXdfNjc4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9TeXN0ZW1fT3ZlcnZpZXdfNjc4LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTYxNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L1N5c3RlbV9PdmVydmlld182Nzguc3ZnCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+U3lzdGVtX092ZXJ2aWV3PC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJTeXN0ZW1fT3ZlcnZpZXciIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IlJlY3RhbmdsZS0xMjAtKy1yZWNlbnQtMTItQ29weS0xMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CisgICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xMjAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHg9IjAiIHk9IjAiIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PC9yZWN0PgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi43OTIxNDI5LDEyLjggTDEyLjc5MjE0MjksMTIuOCBDMTIuNzk1OTk0NSwxMi44IDEyLjgsMTIuNzk1OTk1NCAxMi44LDEyLjc5MjE0MjkgTDEyLjgsMzUuMjA3ODU3MSBDMTIuOCwzNS4yMDQwMDU1IDEyLjc5NTk5NTQsMzUuMiAxMi43OTIxNDI5LDM1LjIgTDM1LjIwNzg1NzEsMzUuMiBDMzUuMjA0MDA1NSwzNS4yIDM1LjIsMzUuMjA0MDA0NiAzNS4yLDM1LjIwNzg1NzEgTDM1LjIsMTIuNzkyMTQyOSBDMzUuMiwxMi43OTU5OTQ1IDM1LjIwNDAwNDYsMTIuOCAzNS4yMDc4NTcxLDEyLjggTDEyLjc5MjE0MjksMTIuOCBaIE0xMi43OTIxNDI5LDkuNiBMMTIuNzkyMTQyOSw5LjYgTDM1LjIwNzg1NzEsOS42IEMzNi45NzE4MDM1LDkuNiAzOC40LDExLjAyOTE3MSAzOC40LDEyLjc5MjE0MjkgTDM4LjQsMzUuMjA3ODU3MSBDMzguNCwzNi45NzE4MDM1IDM2Ljk3MDgyOSwzOC40IDM1LjIwNzg1NzEsMzguNCBMMTIuNzkyMTQyOSwzOC40IEMxMS4wMjgxOTY1LDM4LjQgOS42LDM2Ljk3MDgyOSA5LjYsMzUuMjA3ODU3MSBMOS42LDEyLjc5MjE0MjkgQzkuNiwxMS4wMjgxOTY1IDExLjAyOTE3MSw5LjYgMTIuNzkyMTQyOSw5LjYgTDEyLjc5MjE0MjksOS42IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzYxN2Q4YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvVmlydHVhbF9TZW5zb3JzXzY3OC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvVmlydHVhbF9TZW5zb3JzXzY3OC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4Mjc4OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9WaXJ0dWFsX1NlbnNvcnNfNjc4LnN2ZwpAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPlZpcnR1YWxfU2Vuc29yczwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iVmlydHVhbF9TZW5zb3JzIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJHcm91cC1Db3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTgwNyIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4Ij48L3JlY3Q+CisgICAgICAgICAgICAgICAgPGcgaWQ9IlNoYXBlLTYtKy1TaGFwZS03LSstU2hhcGUtOS1Db3B5LTUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuNDAwMDAwLCAzLjQwMDAwMCkiIGZpbGw9IiM2MTdkOGEiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAuMyw1LjQxNjEyOTAzIEMxNi44Myw4LjQxNjEyOTAzIDIxLjUyLDE0LjU2MTI5MDMgMjIuMjMsMjEuODM4NzA5NyBMMjUuMjMsMjEuODM4NzA5NyBDMjQuMjEsOS45MTYxMjkwMyAxMy45MSwwLjU0ODM4NzA5NyAxLjMzLDAuNTQ4Mzg3MDk3IEMwLjg4LDAuNTQ4Mzg3MDk3IDAuNDUsMC41ODcwOTY3NzQgMCwwLjYxNjEyOTAzMiBMNy42Myw4IEwxMC4zLDUuNDE2MTI5MDMgTDEwLjMsNS40MTYxMjkwMyBaIiBpZD0iU2hhcGUtOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIuNjE1MDAwLCAxMS4xOTM1NDgpIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTEyLjYxNTAwMCwgLTExLjE5MzU0OCkgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgICAgIDxnIGlkPSJTaGFwZS02LSstU2hhcGUtNy0rLVNoYXBlLTktQ29weS02IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMy4xMDAwMDAsIDMzLjUwMzAzMCkgc2NhbGUoLTEsIC0xKSB0cmFuc2xhdGUoLTMzLjEwMDAwMCwgLTMzLjUwMzAzMCkgdHJhbnNsYXRlKDE5LjYwMDAwMCwgMjIuNTAzMDMwKSIgZmlsbD0iIzYxN2Q4YSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMS4zLDUuNDE2MTI5MDMgQzE3LjgzLDguNDE2MTI5MDMgMjIuNTIsMTQuNTYxMjkwMyAyMy4yMywyMS44Mzg3MDk3IEwyNi4yMywyMS44Mzg3MDk3IEMyNS4yMSw5LjkxNjEyOTAzIDE0LjkxLDAuNTQ4Mzg3MDk3IDIuMzMsMC41NDgzODcwOTcgQzEuODgsMC41NDgzODcwOTcgMS40NSwwLjU4NzA5Njc3NCAxLDAuNjE2MTI5MDMyIEw4LjYzLDggTDExLjMsNS40MTYxMjkwMyBMMTEuMyw1LjQxNjEyOTAzIFoiIGlkPSJTaGFwZS04IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy42MTUwMDAsIDExLjE5MzU0OCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMTMuNjE1MDAwLCAtMTEuMTkzNTQ4KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMTY2IiBmaWxsPSIjNjE3ZDhhIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjQiIGN5PSIyNCIgcng9IjcuMiIgcnk9IjcuMiI+PC9lbGxpcHNlPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9iYWNrLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2JhY2suc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNmUyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9iYWNrLnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjEwMHB4IiBoZWlnaHQ9IjEwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iI0UwRTBFMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJpY19mYXN0X2ZvcndhcmRfYmxhY2tfMjRkcCIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjUuMDAwMDAwLCAyNS4wMDAwMDApIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTI1LjAwMDAwMCwgLTI1LjAwMDAwMCkgdHJhbnNsYXRlKDEzLjAwMDAwMCwgMTMuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQsMTggTDEyLjUsMTIgTDQsNiBMNCwxOCBMNCwxOCBaIE0xMyw2IEwxMywxOCBMMjEuNSwxMiBMMTMsNiBMMTMsNiBaIiBpZD0iU2hhcGUiIGZpbGw9IiM5RTlFOUUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwIEwyNCwwIEwyNCwyNCBMMCwyNCBMMCwwIFoiIGlkPSJTaGFwZSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9iYWNrX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfYmFja19wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDA5YjZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfYmFja19wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjEwMHB4IiBoZWlnaHQ9IjEwMHB4IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtID0gInNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQzBDMEMwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjUiIGN5PSIyNSIgcj0iMjUiPjwvY2lyY2xlPgorICAgICAgICAgICAgPGcgaWQ9ImljX2Zhc3RfZm9yd2FyZF9ibGFja18yNGRwIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNS4wMDAwMDAsIDI1LjAwMDAwMCkgc2NhbGUoLTEsIDEpIHRyYW5zbGF0ZSgtMjUuMDAwMDAwLCAtMjUuMDAwMDAwKSB0cmFuc2xhdGUoMTMuMDAwMDAwLCAxMy4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCwxOCBMMTIuNSwxMiBMNCw2IEw0LDE4IEw0LDE4IFogTTEzLDYgTDEzLDE4IEwyMS41LDEyIEwxMyw2IEwxMyw2IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAgTDI0LDAgTDI0LDI0IEwwLDI0IEwwLDAgWiIgaWQ9IlNoYXBlIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2Rvd24uc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfZG93bi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhMDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2Rvd24uc3ZnCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMjg0cHgiIGhlaWdodD0iMjAycHgiIHZpZXdCb3g9IjAgMCAyODQgMjAyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IkZpbGwtMi1Db3B5LSstaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MS4wMDAwMDAsIDUwLjUwMDAwMCkgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtNzEuMDAwMDAwLCAtNTAuNTAwMDAwKSAiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjI4OSw3MS42ODM3MTc0IEMxOC4zMzE5OTksODkuNzc5NzE3NCA0My4yNTczOTk1LDEwMC45NzI3MTcgNzAuNzg5LDEwMC45NzI3MTcgQzk4LjMyMDYwMDUsMTAwLjk3MjcxNyAxMjMuMjQ2MDAxLDg5Ljc3OTcxNzQgMTQxLjI4OSw3MS42ODM3MTc0IEw3MC43ODksMC45NzI3MTczNTcgTDAuMjg5LDcxLjY4MzcxNzQiIGlkPSJGaWxsLTItQ29weSIgZmlsbD0iI0UwRTBFMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuNzg5MDAwLCA1MC45NzI3MTcpIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcwLjc4OTAwMCwgLTUwLjk3MjcxNykgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuODUwMDAwLCAzMi40ODYzNTkpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTcwLjg1MDAwMCwgLTMyLjQ4NjM1OSkgdHJhbnNsYXRlKDUzLjM1MDAwMCwgMTUuNDg2MzU5KSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi41MTExMjUzLDIzLjU0NTA3NTIgTDE5LjE4MTc4MzQsMTcuMTI3MjYxMSBMMTIuNTExMTI1MywxMC43MDk0NDcxIEwxNC41NjQ3NTU4LDguNzM3OTYxNzggTDIzLjMwMzYwOTMsMTcuMTI3MjYxMSBMMTQuNTY0NzU1OCwyNS41MTY1NjA1IEwxMi41MTExMjUzLDIzLjU0NTA3NTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjOUU5RTlFIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMzMuOTA1ODU5OSBMMCwzMy45MDU4NTk5IEwwLDAuMzQ4NjYyNDIgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9kb3duX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfZG93bl9wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDg0ZjZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfZG93bl9wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjI4NHB4IiBoZWlnaHQ9IjIwMnB4IiB2aWV3Qm94PSIwIDAgMjg0IDIwMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzEuMDAwMDAwLCA1MC41MDAwMDApIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcxLjAwMDAwMCwgLTUwLjUwMDAwMCkgIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiNDMEMwQzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfZm9yd2FyZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9mb3J3YXJkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA0NzhjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfZm9yd2FyZC5zdmcKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIxMDBweCIgaGVpZ2h0PSIxMDBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybSA9ICJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iI0UwRTBFMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJpY19mYXN0X2ZvcndhcmRfYmxhY2tfMjRkcCIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMuMDAwMDAwLCAxMy4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCwxOCBMMTIuNSwxMiBMNCw2IEw0LDE4IEw0LDE4IFogTTEzLDYgTDEzLDE4IEwyMS41LDEyIEwxMyw2IEwxMyw2IFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAgTDI0LDAgTDI0LDI0IEwwLDI0IEwwLDAgWiIgaWQ9IlNoYXBlIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2ZvcndhcmRfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9mb3J3YXJkX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmJjYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9mb3J3YXJkX3ByZXNzZWQuc3ZnCkBAIC0wLDAgKzEsMTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm09InNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQzBDMEMwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iMjUiIGN5PSIyNSIgcj0iMjUiPjwvY2lyY2xlPgorICAgICAgICAgICAgPGcgaWQ9ImljX2Zhc3RfZm9yd2FyZF9ibGFja18yNGRwIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMy4wMDAwMDAsIDEzLjAwMDAwMCkiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik00LDE4IEwxMi41LDEyIEw0LDYgTDQsMTggTDQsMTggWiBNMTMsNiBMMTMsMTggTDIxLjUsMTIgTDEzLDYgTDEzLDYgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjOUU5RTlFIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMCBMMjQsMCBMMjQsMjQgTDAsMjQgTDAsMCBaIiBpZD0iU2hhcGUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfbGVmdC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9sZWZ0LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGVlNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfbGVmdC5zdmcKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIyMDJweCIgaGVpZ2h0PSIyODRweCIgdmlld0JveD0iMCAwIDIwMiAyODQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iRmlsbC0yLUNvcHktKy1pY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUwLjUwMDAwMCwgNzEuMDAwMDAwKSBzY2FsZSgtMSwgLTEpIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC01MC41MDAwMDAsIC03MS4wMDAwMDApIHRyYW5zbGF0ZSgtMjAuNTAwMDAwLCAyMC41MDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiNFMEUwRTAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfbGVmdF9wcmVzc2VkLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2xlZnRfcHJlc3NlZC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhM2U3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX2xlZnRfcHJlc3NlZC5zdmcKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIyMDJweCIgaGVpZ2h0PSIyODRweCIgdmlld0JveD0iMCAwIDIwMiAyODQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybT0ic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iRmlsbC0yLUNvcHktKy1pY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUwLjUwMDAwMCwgNzEuMDAwMDAwKSBzY2FsZSgtMSwgLTEpIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC01MC41MDAwMDAsIC03MS4wMDAwMDApIHRyYW5zbGF0ZSgtMjAuNTAwMDAwLCAyMC41MDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiNDMEMwQzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfcGxheV9wYXVzZS5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9wbGF5X3BhdXNlLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdiNjUyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfcGxheV9wYXVzZS5zdmcKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIxMDBweCIgaGVpZ2h0PSIxMDBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybSA9ICJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtMiIgZmlsbD0iI0UwRTBFMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgY3g9IjI1IiBjeT0iMjUiIHI9IjI1Ij48L2NpcmNsZT4KKyAgICAgICAgICAgIDxnIGlkPSJSZWN0YW5nbGUtMTY3MC0rLWljX3BhdXNlX2JsYWNrXzI0ZHAtKDEpLSstaWNfcGxheV9hcnJvd19ibGFja18yNGRwLWNvcHktNyIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMuMDAwMDAwLCAxMy4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTE2NzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHg9IjAiIHk9IjAiIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19wYXVzZV9ibGFja18yNGRwLSgxKS0rLWljX3BsYXlfYXJyb3dfYmxhY2tfMjRkcC1jb3B5LTciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIuMDAwMDAwLCA2LjAwMDAwMCkiIGZpbGw9IiM5RTlFOUUiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfcGF1c2VfYmxhY2tfMjRkcC0oMSkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwLjAwMDAwMCwgMC4wMDAwMDApIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjUsMTEuMjUgTDMuNSwxMS4yNSBMMy41LDAuNzUgTDAuNSwwLjc1IEwwLjUsMTEuMjUgTDAuNSwxMS4yNSBaIE02LjUsMC43NSBMNi41LDExLjI1IEw5LjUsMTEuMjUgTDkuNSwwLjc1IEw2LjUsMC43NSBMNi41LDAuNzUgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICAgICAgPGcgaWQ9ImljX3BsYXlfYXJyb3dfYmxhY2tfMjRkcC1jb3B5LTciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC43NSBMMCwxMS4yNSBMOC4yNSw2IEwwLDAuNzUgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3BsYXlfcGF1c2VfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9wbGF5X3BhdXNlX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOTA0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9wbGF5X3BhdXNlX3ByZXNzZWQuc3ZnCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTAwcHgiIGhlaWdodD0iMTAwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm0gPSAic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTIiIGZpbGw9IiNDMEMwQzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIGN4PSIyNSIgY3k9IjI1IiByPSIyNSI+PC9jaXJjbGU+CisgICAgICAgICAgICA8ZyBpZD0iUmVjdGFuZ2xlLTE2NzAtKy1pY19wYXVzZV9ibGFja18yNGRwLSgxKS0rLWljX3BsYXlfYXJyb3dfYmxhY2tfMjRkcC1jb3B5LTciIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzLjAwMDAwMCwgMTMuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0xNjcwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB4PSIwIiB5PSIwIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiPjwvcmVjdD4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfcGF1c2VfYmxhY2tfMjRkcC0oMSktKy1pY19wbGF5X2Fycm93X2JsYWNrXzI0ZHAtY29weS03IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyLjAwMDAwMCwgNi4wMDAwMDApIiBmaWxsPSIjOUU5RTlFIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPGcgaWQ9ImljX3BhdXNlX2JsYWNrXzI0ZHAtKDEpIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMC4wMDAwMDAsIDAuMDAwMDAwKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC41LDExLjI1IEwzLjUsMTEuMjUgTDMuNSwwLjc1IEwwLjUsMC43NSBMMC41LDExLjI1IEwwLjUsMTEuMjUgWiBNNi41LDAuNzUgTDYuNSwxMS4yNSBMOS41LDExLjI1IEw5LjUsMC43NSBMNi41LDAuNzUgTDYuNSwwLjc1IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgICAgIDxnIGlkPSJpY19wbGF5X2Fycm93X2JsYWNrXzI0ZHAtY29weS03Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuNzUgTDAsMTEuMjUgTDguMjUsNiBMMCwwLjc1IFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9yaWdodC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9yaWdodC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0Yjc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3JpZ2h0LnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjIwMnB4IiBoZWlnaHQ9IjI4NHB4IiB2aWV3Qm94PSIwIDAgMjAyIDI4NCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtID0gInNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IkZpbGwtMi1Db3B5LSstaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MC41MDAwMDAsIDcxLjAwMDAwMCkgc2NhbGUoMSwgLTEpIHJvdGF0ZSgtMjcwLjAwMDAwMCkgdHJhbnNsYXRlKC01MC41MDAwMDAsIC03MS4wMDAwMDApIHRyYW5zbGF0ZSgtMjAuNTAwMDAwLCAyMC41MDAwMDApIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiNFMEUwRTAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfcmlnaHRfcHJlc3NlZC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9yaWdodF9wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI3MTIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfcmlnaHRfcHJlc3NlZC5zdmcKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnIHdpZHRoPSIyMDJweCIgaGVpZ2h0PSIyODRweCIgdmlld0JveD0iMCAwIDIwMiAyODQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM6c2tldGNoPSJodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2gvbnMiPgorICAgIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggMy4zLjIgKDEyMDQzKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaCAtLT4KKyAgICA8dGl0bGU+QXJ0Ym9hcmQgMTwvdGl0bGU+CisgICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CisgICAgPGRlZnM+PC9kZWZzPgorICAgIDxnIHRyYW5zZm9ybSA9ICJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KKyAgICAgICAgICAgIDxnIGlkPSJGaWxsLTItQ29weS0rLWljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNTAuNTAwMDAwLCA3MS4wMDAwMDApIHNjYWxlKDEsIC0xKSByb3RhdGUoLTI3MC4wMDAwMDApIHRyYW5zbGF0ZSgtNTAuNTAwMDAwLCAtNzEuMDAwMDAwKSB0cmFuc2xhdGUoLTIwLjUwMDAwMCwgMjAuNTAwMDAwKSI+CisgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuMjg5LDcxLjY4MzcxNzQgQzE4LjMzMTk5OSw4OS43Nzk3MTc0IDQzLjI1NzM5OTUsMTAwLjk3MjcxNyA3MC43ODksMTAwLjk3MjcxNyBDOTguMzIwNjAwNSwxMDAuOTcyNzE3IDEyMy4yNDYwMDEsODkuNzc5NzE3NCAxNDEuMjg5LDcxLjY4MzcxNzQgTDcwLjc4OSwwLjk3MjcxNzM1NyBMMC4yODksNzEuNjgzNzE3NCIgaWQ9IkZpbGwtMi1Db3B5IiBmaWxsPSIjQzBDMEMwIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC43ODkwMDAsIDUwLjk3MjcxNykgc2NhbGUoMSwgLTEpIHRyYW5zbGF0ZSgtNzAuNzg5MDAwLCAtNTAuOTcyNzE3KSAiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8ZyBpZD0iaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg3MC44NTAwMDAsIDMyLjQ4NjM1OSkgcm90YXRlKC05MC4wMDAwMDApIHRyYW5zbGF0ZSgtNzAuODUwMDAwLCAtMzIuNDg2MzU5KSB0cmFuc2xhdGUoNTMuMzUwMDAwLCAxNS40ODYzNTkpIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBMMTkuMTgxNzgzNCwxNy4xMjcyNjExIEwxMi41MTExMjUzLDEwLjcwOTQ0NzEgTDE0LjU2NDc1NTgsOC43Mzc5NjE3OCBMMjMuMzAzNjA5MywxNy4xMjcyNjExIEwxNC41NjQ3NTU4LDI1LjUxNjU2MDUgTDEyLjUxMTEyNTMsMjMuNTQ1MDc1MiBaIiBpZD0iU2hhcGUiIGZpbGw9IiM5RTlFOUUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwzMy45MDU4NTk5IEwwLDMzLjkwNTg1OTkgTDAsMC4zNDg2NjI0MiBaIiBpZD0iU2hhcGUiPjwvcGF0aD4KKyAgICAgICAgICAgICAgICA8L2c+CisgICAgICAgICAgICA8L2c+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3NlbGVjdF9GRkYuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfc2VsZWN0X0ZGRi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiYzkyNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3NlbGVjdF9GRkYuc3ZnCkBAIC0wLDAgKzEsMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMTcycHgiIGhlaWdodD0iMTcycHgiIHZpZXdCb3g9IjAgMCAxNzIgMTcyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm0gPSAic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCIgc3Ryb2tlPSIjRjlGOUY5IiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9IiNFMEUwRTAiPgorICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC0zNTktQ29weS04IiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIiBjeD0iNDMiIGN5PSI0MyIgcj0iNDAiPjwvY2lyY2xlPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF9zZWxlY3RfRkZGX3ByZXNzZWQuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfc2VsZWN0X0ZGRl9wcmVzc2VkLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE2MWQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfc2VsZWN0X0ZGRl9wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDEyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjE3MnB4IiBoZWlnaHQ9IjE3MnB4IiB2aWV3Qm94PSIwIDAgMTcyIDE3MiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtPSJzY2FsZSgyKSIgaWQ9IlBhZ2UtMSIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+CisgICAgICAgIDxnIGlkPSJBcnRib2FyZC0xIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIiBzdHJva2U9IiNGOUY5RjkiIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0iI0MwQzBDMCI+CisgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTM1OS1Db3B5LTgiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIGN4PSI0MyIgY3k9IjQzIiByPSI0MCI+PC9jaXJjbGU+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3VwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3VwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDY4NTZmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2RwYWRfdXAuc3ZnCkBAIC0wLDAgKzEsMTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZyB3aWR0aD0iMjg0cHgiIGhlaWdodD0iMjAycHgiIHZpZXdCb3g9IjAgMCAyODQgMjAyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIj4KKyAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4yICgxMjA0MykgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CisgICAgPHRpdGxlPkFydGJvYXJkIDE8L3RpdGxlPgorICAgIDxkZXNjPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgorICAgIDxkZWZzPjwvZGVmcz4KKyAgICA8ZyB0cmFuc2Zvcm0gPSAic2NhbGUoMikiIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgorICAgICAgICA8ZyBpZD0iQXJ0Ym9hcmQtMSIgc2tldGNoOnR5cGU9Ik1TQXJ0Ym9hcmRHcm91cCI+CisgICAgICAgICAgICA8ZyBpZD0iRmlsbC0yLUNvcHktKy1pY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHNrZXRjaDp0eXBlPSJNU0xheWVyR3JvdXAiPgorICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLjI4OSw3MS42ODM3MTc0IEMxOC4zMzE5OTksODkuNzc5NzE3NCA0My4yNTczOTk1LDEwMC45NzI3MTcgNzAuNzg5LDEwMC45NzI3MTcgQzk4LjMyMDYwMDUsMTAwLjk3MjcxNyAxMjMuMjQ2MDAxLDg5Ljc3OTcxNzQgMTQxLjI4OSw3MS42ODM3MTc0IEw3MC43ODksMC45NzI3MTczNTcgTDAuMjg5LDcxLjY4MzcxNzQiIGlkPSJGaWxsLTItQ29weSIgZmlsbD0iI0UwRTBFMCIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuNzg5MDAwLCA1MC45NzI3MTcpIHNjYWxlKDEsIC0xKSB0cmFuc2xhdGUoLTcwLjc4OTAwMCwgLTUwLjk3MjcxNykgIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPGcgaWQ9ImljX2tleWJvYXJkX2Fycm93X3JpZ2h0X3doaXRlXzI0ZHAtY29weS0yMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzAuODUwMDAwLCAzMi40ODYzNTkpIHJvdGF0ZSgtOTAuMDAwMDAwKSB0cmFuc2xhdGUoLTcwLjg1MDAwMCwgLTMyLjQ4NjM1OSkgdHJhbnNsYXRlKDUzLjM1MDAwMCwgMTUuNDg2MzU5KSIgc2tldGNoOnR5cGU9Ik1TU2hhcGVHcm91cCI+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi41MTExMjUzLDIzLjU0NTA3NTIgTDE5LjE4MTc4MzQsMTcuMTI3MjYxMSBMMTIuNTExMTI1MywxMC43MDk0NDcxIEwxNC41NjQ3NTU4LDguNzM3OTYxNzggTDIzLjMwMzYwOTMsMTcuMTI3MjYxMSBMMTQuNTY0NzU1OCwyNS41MTY1NjA1IEwxMi41MTExMjUzLDIzLjU0NTA3NTIgWiIgaWQ9IlNoYXBlIiBmaWxsPSIjOUU5RTlFIj48L3BhdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0wLDAuMzQ4NjYyNDIgTDM0Ljk1NTQxNCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMzMuOTA1ODU5OSBMMCwzMy45MDU4NTk5IEwwLDAuMzQ4NjYyNDIgWiIgaWQ9IlNoYXBlIj48L3BhdGg+CisgICAgICAgICAgICAgICAgPC9nPgorICAgICAgICAgICAgPC9nPgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF91cF9wcmVzc2VkLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9kcGFkX3VwX3ByZXNzZWQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTU1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvZHBhZF91cF9wcmVzc2VkLnN2ZwpAQCAtMCwwICsxLDE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcgd2lkdGg9IjI4NHB4IiBoZWlnaHQ9IjIwMnB4IiB2aWV3Qm94PSIwIDAgMjg0IDIwMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CisgICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCAzLjMuMiAoMTIwNDMpIC0gaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoIC0tPgorICAgIDx0aXRsZT5BcnRib2FyZCAxPC90aXRsZT4KKyAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KKyAgICA8ZGVmcz48L2RlZnM+CisgICAgPGcgdHJhbnNmb3JtID0gInNjYWxlKDIpIiBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBza2V0Y2g6dHlwZT0iTVNQYWdlIj4KKyAgICAgICAgPGcgaWQ9IkFydGJvYXJkLTEiIHNrZXRjaDp0eXBlPSJNU0FydGJvYXJkR3JvdXAiPgorICAgICAgICAgICAgPGcgaWQ9IkZpbGwtMi1Db3B5LSstaWNfa2V5Ym9hcmRfYXJyb3dfcmlnaHRfd2hpdGVfMjRkcC1jb3B5LTIxIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KKyAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMC4yODksNzEuNjgzNzE3NCBDMTguMzMxOTk5LDg5Ljc3OTcxNzQgNDMuMjU3Mzk5NSwxMDAuOTcyNzE3IDcwLjc4OSwxMDAuOTcyNzE3IEM5OC4zMjA2MDA1LDEwMC45NzI3MTcgMTIzLjI0NjAwMSw4OS43Nzk3MTc0IDE0MS4yODksNzEuNjgzNzE3NCBMNzAuNzg5LDAuOTcyNzE3MzU3IEwwLjI4OSw3MS42ODM3MTc0IiBpZD0iRmlsbC0yLUNvcHkiIGZpbGw9IiNDMEMwQzAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjc4OTAwMCwgNTAuOTcyNzE3KSBzY2FsZSgxLCAtMSkgdHJhbnNsYXRlKC03MC43ODkwMDAsIC01MC45NzI3MTcpICI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDxnIGlkPSJpY19rZXlib2FyZF9hcnJvd19yaWdodF93aGl0ZV8yNGRwLWNvcHktMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDcwLjg1MDAwMCwgMzIuNDg2MzU5KSByb3RhdGUoLTkwLjAwMDAwMCkgdHJhbnNsYXRlKC03MC44NTAwMDAsIC0zMi40ODYzNTkpIHRyYW5zbGF0ZSg1My4zNTAwMDAsIDE1LjQ4NjM1OSkiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuNTExMTI1MywyMy41NDUwNzUyIEwxOS4xODE3ODM0LDE3LjEyNzI2MTEgTDEyLjUxMTEyNTMsMTAuNzA5NDQ3MSBMMTQuNTY0NzU1OCw4LjczNzk2MTc4IEwyMy4zMDM2MDkzLDE3LjEyNzI2MTEgTDE0LjU2NDc1NTgsMjUuNTE2NTYwNSBMMTIuNTExMTI1MywyMy41NDUwNzUyIFoiIGlkPSJTaGFwZSIgZmlsbD0iIzlFOUU5RSI+PC9wYXRoPgorICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMCwwLjM0ODY2MjQyIEwzNC45NTU0MTQsMC4zNDg2NjI0MiBMMzQuOTU1NDE0LDMzLjkwNTg1OTkgTDAsMzMuOTA1ODU5OSBMMCwwLjM0ODY2MjQyIFoiIGlkPSJTaGFwZSI+PC9wYXRoPgorICAgICAgICAgICAgICAgIDwvZz4KKyAgICAgICAgICAgIDwvZz4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2FkZF8wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfYWRkXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTEwZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2FkZF8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMzggMjZIMjZ2MTJoLTRWMjZIMTB2LTRoMTJWMTBoNHYxMmgxMnY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2FkZF9CRUVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfYWRkX0JFRV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGIwYWViCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2FkZF9CRUVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjYmFlYWU0Ij4KKyAgICA8cGF0aCBkPSJNMzggMjZIMjZ2MTJoLTRWMjZIMTB2LTRoMTJWMTBoNHYxMmgxMnY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2Fycm93X2Ryb3BfZG93bl9ibGFja18xOHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX2Rvd25fYmxhY2tfMThweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0MDRlNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX2Rvd25fYmxhY2tfMThweC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIGZpbGw9IiMwMDAwMDAiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiB0cmFuc2Zvcm09InNjYWxlKDIsMiksdHJhbnNsYXRlKC02LCAtNikiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CisgICAgPHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX2Rvd25fY2NjXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2Fycm93X2Ryb3BfZG93bl9jY2NfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYTViNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX2Rvd25fY2NjXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI2M5Y2NjZSI+CisgICAgPHBhdGggZD0iTTE0IDIwbDEwIDEwIDEwLTEweiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2Fycm93X2Ryb3BfdXBfYmxhY2tfMThweC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfYXJyb3dfZHJvcF91cF9ibGFja18xOHB4LnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE5ZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2Fycm93X2Ryb3BfdXBfYmxhY2tfMThweC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIGZpbGw9IiMwMDAwMDAiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4IiB0cmFuc2Zvcm09InNjYWxlKDIsMiksdHJhbnNsYXRlKC02LC02KSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KKyAgICA8cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2JhdHRlcnlfODBfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2JhdHRlcnlfODBfNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzEzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfYmF0dGVyeV84MF82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw1IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3RDhBIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZmlsbC1vcGFjaXR5PSIuMyIgZD0iTTM0IDEwLjY3QzM0IDkuMTkgMzIuODEgOCAzMS4zMyA4SDI4VjRoLTh2NGgtMy4zM0MxNS4xOSA4IDE0IDkuMTkgMTQgMTAuNjdWMThoMjB2LTcuMzN6Ii8+CisgICAgPHBhdGggZD0iTTE0IDE4djIzLjMzQzE0IDQyLjggMTUuMTkgNDQgMTYuNjcgNDRoMTQuNjdjMS40NyAwIDIuNjctMS4xOSAyLjY3LTIuNjdWMThIMTR6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19jYWxsX2VuZF8wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2FsbF9lbmRfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTg1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2FsbF9lbmRfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0yNCAxOGMtMy4yMSAwLTYuMy41LTkuMiAxLjQ0djYuMjFjMCAuNzktLjQ2IDEuNDctMS4xMiAxLjgtMS45NS45OC0zLjc0IDIuMjMtNS4zMyAzLjctLjM2LjM1LS44NS41Ny0xLjQuNTctLjU1IDAtMS4wNS0uMjItMS40MS0uNTlMLjU5IDI2LjE4Yy0uMzctLjM3LS41OS0uODctLjU5LTEuNDIgMC0uNTUuMjItMS4wNS41OS0xLjQyQzYuNjggMTcuNTUgMTQuOTMgMTQgMjQgMTRzMTcuMzIgMy41NSAyMy40MSA5LjM0Yy4zNy4zNi41OS44Ny41OSAxLjQyIDAgLjU1LS4yMiAxLjA1LS41OSAxLjQxbC00Ljk1IDQuOTVjLS4zNi4zNi0uODYuNTktMS40MS41OS0uNTQgMC0xLjA0LS4yMi0xLjQtLjU3LTEuNTktMS40Ny0zLjM4LTIuNzItNS4zMy0zLjctLjY2LS4zMy0xLjEyLTEuMDEtMS4xMi0xLjh2LTYuMjFDMzAuMyAxOC41IDI3LjIxIDE4IDI0IDE4eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2FsbF9lbmRfQkVFXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NhbGxfZW5kX0JFRV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQxYmNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NhbGxfZW5kX0JFRV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiYWVhZTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMjQgMThjLTMuMjEgMC02LjMuNS05LjIgMS40NHY2LjIxYzAgLjc5LS40NiAxLjQ3LTEuMTIgMS44LTEuOTUuOTgtMy43NCAyLjIzLTUuMzMgMy43LS4zNi4zNS0uODUuNTctMS40LjU3LS41NSAwLTEuMDUtLjIyLTEuNDEtLjU5TC41OSAyNi4xOGMtLjM3LS4zNy0uNTktLjg3LS41OS0xLjQyIDAtLjU1LjIyLTEuMDUuNTktMS40MkM2LjY4IDE3LjU1IDE0LjkzIDE0IDI0IDE0czE3LjMyIDMuNTUgMjMuNDEgOS4zNGMuMzcuMzYuNTkuODcuNTkgMS40MiAwIC41NS0uMjIgMS4wNS0uNTkgMS40MWwtNC45NSA0Ljk1Yy0uMzYuMzYtLjg2LjU5LTEuNDEuNTktLjU0IDAtMS4wNC0uMjItMS40LS41Ny0xLjU5LTEuNDctMy4zOC0yLjcyLTUuMzMtMy43LS42Ni0uMzMtMS4xMi0xLjAxLTEuMTItMS44di02LjIxQzMwLjMgMTguNSAyNy4yMSAxOCAyNCAxOHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NhbWVyYV82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2FtZXJhXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2M1NjFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NhbWVyYV82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3ZDhhIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTE4LjggMjFsOS41My0xNi41MUMyNi45NCA0LjE4IDI1LjQ5IDQgMjQgNGMtNC44IDAtOS4xOSAxLjY5LTEyLjY0IDQuNTFsNy4zMyAxMi42OS4xMS0uMnptMjQuMjgtM2MtMS44NC01Ljg1LTYuMy0xMC41Mi0xMS45OS0xMi42OEwyMy43NyAxOGgxOS4zMXptLjUyIDJIMjguNjJsLjU4IDEgOS41MyAxNi41QzQxLjk5IDMzLjk0IDQ0IDI5LjIxIDQ0IDI0YzAtMS4zNy0uMTQtMi43MS0uNC00em0tMjYuNTMgNGwtNy44LTEzLjVDNi4wMSAxNC4wNiA0IDE4Ljc5IDQgMjRjMCAxLjM3LjE0IDIuNzEuNCA0aDE0Ljk4bC0yLjMxLTR6TTQuOTIgMzBjMS44NCA1Ljg1IDYuMyAxMC41MiAxMS45OSAxMi42OEwyNC4yMyAzMEg0Ljkyem0yMi41NCAwbC03LjggMTMuNTFjMS40LjMxIDIuODUuNDkgNC4zNC40OSA0LjggMCA5LjE5LTEuNjkgMTIuNjQtNC41MUwyOS4zMSAyNi44IDI3LjQ2IDMweiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2hlY2tfYm94XzBCQV8yNGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19jaGVja19ib3hfMEJBXzI0ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjViMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2hlY2tfYm94XzBCQV8yNGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiMwMGJlYTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfY2hlY2tfYm94X291dGxpbmVfYmxhbmtfNzc3XzI0ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NoZWNrX2JveF9vdXRsaW5lX2JsYW5rXzc3N18yNGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGNhOWMzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2NoZWNrX2JveF9vdXRsaW5lX2JsYW5rXzc3N18yNGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIyNHB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9IiM3NTc1NzUiPgorICAgIDxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2Nsb3NlXzY3OF80OHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19jbG9zZV82NzhfNDhweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmODQwZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19jbG9zZV82NzhfNDhweC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDAwMDAwIj4KKyAgICA8cGF0aCBkPSJNMzggMTIuODNMMzUuMTcgMTAgMjQgMjEuMTcgMTIuODMgMTAgMTAgMTIuODMgMjEuMTcgMjQgMTAgMzUuMTcgMTIuODMgMzggMjQgMjYuODMgMzUuMTcgMzggMzggMzUuMTcgMjYuODMgMjR6IiBmaWxsPSIjNjE3ZDhhIiBzdHJva2U9IiM2MTdkOGEiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19maWxlX2Rvd25sb2FkXzY3OF80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19maWxlX2Rvd25sb2FkXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGZmNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2ZpbGVfZG93bmxvYWRfNjc4XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYxN0Q4QSI+CisgICAgPHBhdGggZD0iTTM4IDE4aC04VjZIMTh2MTJoLThsMTQgMTQgMTQtMTR6TTEwIDM2djRoMjh2LTRIMTB6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfZmlsZV91cGxvYWRfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2ZpbGVfdXBsb2FkXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWRlNDAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2ZpbGVfdXBsb2FkXzY3OF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdEOEEiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTggMzJoMTJWMjBoOEwyNCA2IDEwIDIwaDh6bS04IDRoMjh2NEgxMHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2ZpbHRlcl90aWx0X3NoaWZ0XzY3OF80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19maWx0ZXJfdGlsdF9zaGlmdF82NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwNmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19maWx0ZXJfdGlsdF9zaGlmdF82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3ZDhhIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTIyIDguMTRWNC4xYy00LjAyLjQtNy42OCAyLTEwLjY1IDQuNDJsMi44NSAyLjg1YzIuMjItMS43MSA0Ljg4LTIuODcgNy44LTMuMjN6bTE0LjY1LjM4QzMzLjY5IDYuMSAzMC4wMiA0LjUgMjYgNC4xdjQuMDRjMi45Mi4zNyA1LjU4IDEuNTIgNy44IDMuMjRsMi44NS0yLjg2ek0zOS44NiAyMmg0LjA0Yy0uNC00LjAyLTItNy42OC00LjQyLTEwLjY1bC0yLjg1IDIuODVjMS43MSAyLjIyIDIuODcgNC44OCAzLjIzIDcuOHptLTI4LjQ4LTcuOGwtMi44NS0yLjg1QzYuMSAxNC4zMiA0LjUgMTcuOTggNC4xIDIyaDQuMDRjLjM3LTIuOTIgMS41Mi01LjU4IDMuMjQtNy44ek04LjE0IDI2SDQuMWMuNCA0LjAyIDIgNy42OCA0LjQyIDEwLjY1bDIuODUtMi44NWMtMS43MS0yLjIyLTIuODYtNC44OS0zLjIzLTcuOHpNMzAgMjRjMC0zLjMxLTIuNjktNi02LTZzLTYgMi42OS02IDYgMi42OSA2IDYgNiA2LTIuNjkgNi02em02LjYyIDkuNzlsMi44NSAyLjg1QzQxLjkgMzMuNjggNDMuNSAzMC4wMiA0My45IDI2aC00LjA0Yy0uMzYgMi45MS0xLjUyIDUuNTgtMy4yNCA3Ljc5ek0yNiAzOS44NnY0LjA0YzQuMDItLjQgNy42OC0yIDEwLjY1LTQuNDJsLTIuODUtMi44NWMtMi4yMiAxLjcxLTQuODggMi44Ni03LjggMy4yM3ptLTE0LjY1LS4zOEMxNC4zMiA0MS45IDE3Ljk4IDQzLjUgMjIgNDMuOXYtNC4wNGMtMi45Mi0uMzctNS41OC0xLjUyLTcuOC0zLjI0bC0yLjg1IDIuODZ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19maW5nZXJwcmludF82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfZmluZ2VycHJpbnRfNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWQ0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfZmluZ2VycHJpbnRfNjc4XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYxN0Q4QSI+CisgICAgPHBhdGggZD0iTTM1LjYyIDguOTRjLS4xNiAwLS4zMS0uMDQtLjQ2LS4xMUMzMS4zMyA2Ljg1IDI4IDYgMjQuMDIgNmMtMy45NyAwLTcuNzEuOTUtMTEuMTQgMi44Mi0uNDkuMjYtMS4wOS4wOS0xLjM2LS40LS4yNi0uNDktLjA5LTEuMDkuNC0xLjM2QzE1LjY1IDUuMDMgMTkuNzIgNCAyNC4wMiA0YzQuMjYgMCA3Ljk4Ljk0IDEyLjA2IDMuMDUuNDkuMjUuNjguODYuNDMgMS4zNS0uMTguMzQtLjUzLjU0LS44OS41NHpNNyAxOS40NGMtLjIgMC0uNC0uMDYtLjU4LS4xOC0uNDUtLjMyLS41Ni0uOTQtLjI0LTEuMzkgMS45OC0yLjggNC41MS01IDcuNTEtNi41NSA2LjI5LTMuMjUgMTQuMzMtMy4yNiAyMC42My0uMDIgMi45OSAxLjU0IDUuNTEgMy43MiA3LjUgNi41LjMyLjQ1LjIyIDEuMDctLjIzIDEuMzktLjQ1LjMyLTEuMDguMjItMS40LS4yMy0xLjgtMi41Mi00LjA4LTQuNS02Ljc4LTUuODgtNS43NC0yLjk1LTEzLjA3LTIuOTQtMTguOC4wMi0yLjcxIDEuNC01IDMuMzktNi43OSA1LjkzLS4yLjI3LS41MS40MS0uODIuNDF6bTEyLjUxIDI0LjEzYy0uMjYgMC0uNTEtLjEtLjcxLS4zLTEuNzMtMS43NS0yLjY3LTIuODYtNC4wMi01LjI3LTEuMzgtMi40Ni0yLjExLTUuNDctMi4xMS04LjY5IDAtNS45NCA1LjA4LTEwLjc4IDExLjMzLTEwLjc4czExLjMzIDQuODMgMTEuMzMgMTAuNzhjMCAuNTUtLjQ1IDEtMSAxcy0xLS40NS0xLTFjMC00Ljg0LTQuMTgtOC43OC05LjMzLTguNzgtNS4xNCAwLTkuMzMgMy45NC05LjMzIDguNzggMCAyLjg4LjY0IDUuNTQgMS44NSA3LjcxIDEuMjkgMi4zIDIuMTUgMy4yOSAzLjY5IDQuODQuMzkuMzkuMzkgMS4wMy0uMDEgMS40MS0uMTguMjEtLjQ0LjMtLjY5LjN6bTE0LjMzLTMuN2MtMi4zOCAwLTQuNDctLjYtNi4yLTEuNzctMi45Ny0yLjAyLTQuNzUtNS4zLTQuNzUtOC43OCAwLS41NS40NS0xIDEtMXMxIC40NSAxIDFjMCAyLjgxIDEuNDUgNS40NyAzLjg4IDcuMTIgMS40MS45NiAzLjA3IDEuNDMgNS4wNyAxLjQzLjQ4IDAgMS4yOS0uMDUgMi4wOS0uMTkuNTQtLjEgMS4wNi4yNyAxLjE2LjgxLjEuNTQtLjI3IDEuMDYtLjgxIDEuMTYtMS4xNy4yMS0yLjE2LjIyLTIuNDQuMjJ6TTI5LjgxIDQ0Yy0uMDkgMC0uMTgtLjAxLS4yNi0uMDQtMy4xOS0uODctNS4yNy0yLjA1LTcuNDMtNC4yLTIuNzktMi43OC00LjMzLTYuNDktNC4zMy0xMC40NCAwLTMuMjUgMi43Ni01Ljg5IDYuMTYtNS44OSAzLjQgMCA2LjE2IDIuNjQgNi4xNiA1Ljg5IDAgMi4xNCAxLjg3IDMuODkgNC4xNiAzLjg5czQuMTYtMS43NCA0LjE2LTMuODljMC03LjU0LTYuNS0xMy42Ny0xNC40OS0xMy42Ny01LjY5IDAtMTAuODggMy4xNi0xMy4yMiA4LjA2LS43OCAxLjYyLTEuMTcgMy41MS0xLjE3IDUuNjEgMCAxLjU2LjE0IDQuMDIgMS4zMyA3LjIxLjE5LjUyLS4wNyAxLjA5LS41OSAxLjI5LS41Mi4xOS0xLjA5LS4wNy0xLjI5LS41OS0uOTgtMi42My0xLjQ2LTUuMjEtMS40Ni03LjkxIDAtMi40LjQ2LTQuNTggMS4zNy02LjQ3IDIuNjctNS41OCA4LjU3LTkuMTkgMTUuMDItOS4xOSA5LjA5IDAgMTYuNDkgNy4wMyAxNi40OSAxNS42NyAwIDMuMjUtMi43NyA1Ljg5LTYuMTYgNS44OXMtNi4xNi0yLjY0LTYuMTYtNS44OWMwLTIuMTQtMS44Ny0zLjg5LTQuMTYtMy44OXMtNC4xNiAxLjc0LTQuMTYgMy44OWMwIDMuNDEgMS4zMyA2LjYyIDMuNzQgOS4wMiAxLjg5IDEuODggMy43MyAyLjkyIDYuNTUgMy42OS41My4xNS44NS43LjcgMS4yMy0uMTIuNDQtLjUyLjczLS45Ni43M3oiLz4KKyAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMCAwaDQ4djQ4SDB6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19mb2xkZXJfNzc3XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2ZvbGRlcl83NzdfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1ZDc4NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19mb2xkZXJfNzc3XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzc1NzU3NSI+CisgICAgPHBhdGggZD0iTTIwIDhIOGMtMi4yMSAwLTMuOTggMS43OS0zLjk4IDRMNCAzNmMwIDIuMjEgMS43OSA0IDQgNGgzMmMyLjIxIDAgNC0xLjc5IDQtNFYxNmMwLTIuMjEtMS43OS00LTQtNEgyNGwtNC00eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2hlbHBfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2hlbHBfNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2Q0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfaGVscF82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3ZDhhIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTI0IDRDMTIuOTUgNCA0IDEyLjk1IDQgMjRzOC45NSAyMCAyMCAyMCAyMC04Ljk1IDIwLTIwUzM1LjA1IDQgMjQgNHptMiAzNGgtNHYtNGg0djR6bTQuMTMtMTUuNDlsLTEuNzkgMS44NEMyNi45IDI1Ljc5IDI2IDI3IDI2IDMwaC00di0xYzAtMi4yMS45LTQuMjEgMi4zNC01LjY2bDIuNDktMi41MkMyNy41NSAyMC4xIDI4IDE5LjEgMjggMThjMC0yLjIxLTEuNzktNC00LTRzLTQgMS43OS00IDRoLTRjMC00LjQyIDMuNTgtOCA4LThzOCAzLjU4IDggOGMwIDEuNzYtLjcxIDMuMzUtMS44NyA0LjUxeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfaGVscF9vdXRsaW5lX2dyZXk2MDBfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfaGVscF9vdXRsaW5lX2dyZXk2MDBfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI2NzgzZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19oZWxwX291dGxpbmVfZ3JleTYwMF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgdHJhbnNmb3JtPSJzY2FsZSgyKSIgZmlsbD0iIzc1NzU3NSI+CisgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgweiIvPgorICAgIDxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfa2V5Ym9hcmRfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2tleWJvYXJkXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmVhNGYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2tleWJvYXJkXzY3OF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdkOGEiPgorICAgIDxwYXRoIGQ9Ik00MCAxMEg4Yy0yLjIxIDAtMy45OCAxLjc5LTMuOTggNEw0IDM0YzAgMi4yMSAxLjc5IDQgNCA0aDMyYzIuMjEgMCA0LTEuNzkgNC00VjE0YzAtMi4yMS0xLjc5LTQtNC00em0tMTggNmg0djRoLTR2LTR6bTAgNmg0djRoLTR2LTR6bS02LTZoNHY0aC00di00em0wIDZoNHY0aC00di00em0tMiA0aC00di00aDR2NHptMC02aC00di00aDR2NHptMTggMTRIMTZ2LTRoMTZ2NHptMC04aC00di00aDR2NHptMC02aC00di00aDR2NHptNiA2aC00di00aDR2NHptMC02aC00di00aDR2NHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6bTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfbG9jYXRpb25fb25fNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2xvY2F0aW9uX29uXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmEzYTVmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX2xvY2F0aW9uX29uXzY3OF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdEOEEiPgorICAgIDxwYXRoIGQ9Ik0yNCA0Yy03LjczIDAtMTQgNi4yNy0xNCAxNCAwIDEwLjUgMTQgMjYgMTQgMjZzMTQtMTUuNSAxNC0yNmMwLTcuNzMtNi4yNy0xNC0xNC0xNHptMCAxOWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfbWVzc2FnZV82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfbWVzc2FnZV82NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxZWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19tZXNzYWdlXzY3OF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdEOEEiPgorICAgIDxwYXRoIGQ9Ik00MCA0SDhDNS43OSA0IDQuMDIgNS43OSA0LjAyIDhMNCA0NGw4LThoMjhjMi4yMSAwIDQtMS43OSA0LTRWOGMwLTIuMjEtMS43OS00LTQtNHptLTQgMjRIMTJ2LTRoMjR2NHptMC02SDEydi00aDI0djR6bTAtNkgxMnYtNGgyNHY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX21vcmVfaG9yaXpfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX21vcmVfaG9yaXpfNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZWFiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfbW9yZV9ob3Jpel82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3ZDhhIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTEyIDIwYy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHptMjQgMGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6bS0xMiAwYy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTQtMS43OS00LTQtNHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3BhdXNlXzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wYXVzZV8wQkFfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyMzU1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wYXVzZV8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMwMGJlYTQiPgorICAgIDxwYXRoIGQ9Ik0xMiAzOGg4VjEwaC04djI4em0xNi0yOHYyOGg4VjEwaC04eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3BhdXNlX0JFRV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wYXVzZV9CRUVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjMmMwOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wYXVzZV9CRUVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjYmFlYWU0Ij4KKyAgICA8cGF0aCBkPSJNMTIgMzhoOFYxMGgtOHYyOHptMTYtMjh2MjhoOFYxMGgtOHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV8wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0xMy4yNSAyMS41OWMyLjg4IDUuNjYgNy41MSAxMC4yOSAxMy4xOCAxMy4xN2w0LjQtNC40MWMuNTUtLjU1IDEuMzQtLjcxIDIuMDMtLjQ5QzM1LjEgMzAuNiAzNy41MSAzMSA0MCAzMWMxLjExIDAgMiAuODkgMiAydjdjMCAxLjExLS44OSAyLTIgMkMyMS4yMiA0MiA2IDI2Ljc4IDYgOGMwLTEuMTEuOS0yIDItMmg3YzEuMTEgMCAyIC44OSAyIDIgMCAyLjQ5LjQgNC45IDEuMTQgNy4xNC4yMi42OS4wNiAxLjQ4LS40OSAyLjAzbC00LjQgNC40MnoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lXzY3OF80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV82NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyZjMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3RDhBIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTEzLjI1IDIxLjU5YzIuODggNS42NiA3LjUxIDEwLjI5IDEzLjE4IDEzLjE3bDQuNC00LjQxYy41NS0uNTUgMS4zNC0uNzEgMi4wMy0uNDlDMzUuMSAzMC42IDM3LjUxIDMxIDQwIDMxYzEuMTEgMCAyIC44OSAyIDJ2N2MwIDEuMTEtLjg5IDItMiAyQzIxLjIyIDQyIDYgMjYuNzggNiA4YzAtMS4xMS45LTIgMi0yaDdjMS4xMSAwIDIgLjg5IDIgMiAwIDIuNDkuNCA0LjkgMS4xNCA3LjE0LjIyLjY5LjA2IDEuNDgtLjQ5IDIuMDNsLTQuNCA0LjQyeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfQkVFXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX0JFRV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODNhNTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX0JFRV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiYWVhZTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTMuMjUgMjEuNTljMi44OCA1LjY2IDcuNTEgMTAuMjkgMTMuMTggMTMuMTdsNC40LTQuNDFjLjU1LS41NSAxLjM0LS43MSAyLjAzLS40OUMzNS4xIDMwLjYgMzcuNTEgMzEgNDAgMzFjMS4xMSAwIDIgLjg5IDIgMnY3YzAgMS4xMS0uODkgMi0yIDJDMjEuMjIgNDIgNiAyNi43OCA2IDhjMC0xLjExLjktMiAyLTJoN2MxLjExIDAgMiAuODkgMiAyIDAgMi40OS40IDQuOSAxLjE0IDcuMTQuMjIuNjkuMDYgMS40OC0uNDkgMi4wM2wtNC40IDQuNDJ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9hbmRyb2lkX2xhbmRzY2FwZS5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9sYW5kc2NhcGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmRiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9sYW5kc2NhcGUuc3ZnCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPHN2ZworICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgorICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKKyAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCisgICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCisgICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKKyAgIGZpbGw9IiMwMDAwMDAiCisgICBoZWlnaHQ9IjQ4IgorICAgdmlld0JveD0iMCAwIDQ4IDQ4IgorICAgd2lkdGg9IjQ4IgorICAgdHJhbnNmb3JtPSJzY2FsZSgyLDIpIgorICAgaWQ9InN2ZzMwODkiCisgICB2ZXJzaW9uPSIxLjEiCisgICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjQgcjk5MzkiCisgICBzb2RpcG9kaTpkb2NuYW1lPSJpY19waG9uZV9hbmRyb2lkX3JldmVyc2VfcG9ydHJhaXQuc3ZnIj4KKyAgPG1ldGFkYXRhCisgICAgIGlkPSJtZXRhZGF0YTMwOTkiPgorICAgIDxyZGY6UkRGPgorICAgICAgPGNjOldvcmsKKyAgICAgICAgIHJkZjphYm91dD0iIj4KKyAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CisgICAgICAgIDxkYzp0eXBlCisgICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CisgICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgorICAgICAgPC9jYzpXb3JrPgorICAgIDwvcmRmOlJERj4KKyAgPC9tZXRhZGF0YT4KKyAgPGRlZnMKKyAgICAgaWQ9ImRlZnMzMDk3IiAvPgorICA8c29kaXBvZGk6bmFtZWR2aWV3CisgICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKKyAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCisgICAgIGJvcmRlcm9wYWNpdHk9IjEiCisgICAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCisgICAgIGdyaWR0b2xlcmFuY2U9IjEwIgorICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCisgICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgorICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgorICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE5MjAiCisgICAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9IjExNDAiCisgICAgIGlkPSJuYW1lZHZpZXczMDk1IgorICAgICBzaG93Z3JpZD0iZmFsc2UiCisgICAgIGlua3NjYXBlOnpvb209IjQuOTE2NjY2NyIKKyAgICAgaW5rc2NhcGU6Y3g9Ii0xMS4wODQ3NDYiCisgICAgIGlua3NjYXBlOmN5PSI3LjcyODgxMzYiCisgICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKKyAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMzA4OSIgLz4KKyAgPHBhdGgKKyAgICAgZD0ibSAxLDggMCw4IGMgMCwxLjY2IDEuMzQsMyAzLDMgbCAxNiwwIGMgMS42NiwwIDMsLTEuMzQgMywtMyBMIDIzLDggQyAyMyw2LjM0IDIxLjY2LDUgMjAsNSBMIDQsNSBDIDIuMzQsNSAxLDYuMzQgMSw4IHogbSAyMCwyIDAsNCAtMSwwIDAsLTQgMSwwIHogbSAtMywtMy4yNSAwLDEwLjUgLTE0LDAgMCwtMTAuNSAxNCwwIHoiCisgICAgIGlkPSJwYXRoMzA5MSIKKyAgICAgc3R5bGU9ImZpbGw6IzAwYmVhNDtmaWxsLW9wYWNpdHk6MSIKKyAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KKyAgPHBhdGgKKyAgICAgZD0iTTAgMGgyNHYyNEgweiIKKyAgICAgZmlsbD0ibm9uZSIKKyAgICAgaWQ9InBhdGgzMDkzIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9wb3J0cmFpdC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9wb3J0cmFpdC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmMTBhZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9hbmRyb2lkX3BvcnRyYWl0LnN2ZwpAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKyAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCisgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCisgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgZmlsbD0iIzAwMDAwMCIKKyAgIGhlaWdodD0iNDhweCIKKyAgIHZpZXdCb3g9IjAgMCA0OCA0OCIKKyAgIHdpZHRoPSI0OHB4IgorICAgaWQ9InN2ZzMwODkiCisgICB0cmFuc2Zvcm09InNjYWxlKDIsMikiCisgICB2ZXJzaW9uPSIxLjEiPgorICA8cGF0aAorICAgICBkPSJNMTYgMUg4QzYuMzQgMSA1IDIuMzQgNSA0djE2YzAgMS42NiAxLjM0IDMgMyAzaDhjMS42NiAwIDMtMS4zNCAzLTNWNGMwLTEuNjYtMS4zNC0zLTMtM3ptLTIgMjBoLTR2LTFoNHYxem0zLjI1LTNINi43NVY0aDEwLjV2MTR6IgorICAgICBpZD0icGF0aDMwOTEiCisgICAgIHN0eWxlPSJmaWxsOiMwMGJlYTQ7ZmlsbC1vcGFjaXR5OjEiIC8+CisgIDxwYXRoCisgICAgIGQ9Ik0wIDBoMjR2MjRIMHoiCisgICAgIGZpbGw9Im5vbmUiCisgICAgIGlkPSJwYXRoMzA5MyIgLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9sYW5kc2NhcGUuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9sYW5kc2NhcGUuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTZjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX2xhbmRzY2FwZS5zdmcKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8c3ZnCisgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCisgICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgorICAgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIgorICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKKyAgIHhtbG5zOnNvZGlwb2RpPSJodHRwOi8vc29kaXBvZGkuc291cmNlZm9yZ2UubmV0L0RURC9zb2RpcG9kaS0wLmR0ZCIKKyAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgorICAgZmlsbD0iIzAwMDAwMCIKKyAgIGhlaWdodD0iNDgiCisgICB2aWV3Qm94PSIwIDAgNDggNDgiCisgICB0cmFuc2Zvcm09InNjYWxlKDIsMikiCisgICB3aWR0aD0iNDgiCisgICBpZD0ic3ZnMzA4OSIKKyAgIHZlcnNpb249IjEuMSIKKyAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKKyAgIHNvZGlwb2RpOmRvY25hbWU9ImljX3Bob25lX2FuZHJvaWRfbGFuZHNjYXBlLnN2ZyI+CisgIDxtZXRhZGF0YQorICAgICBpZD0ibWV0YWRhdGEzMDk5Ij4KKyAgICA8cmRmOlJERj4KKyAgICAgIDxjYzpXb3JrCisgICAgICAgICByZGY6YWJvdXQ9IiI+CisgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgorICAgICAgICA8ZGM6dHlwZQorICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgorICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KKyAgICAgIDwvY2M6V29yaz4KKyAgICA8L3JkZjpSREY+CisgIDwvbWV0YWRhdGE+CisgIDxkZWZzCisgICAgIGlkPSJkZWZzMzA5NyIgLz4KKyAgPHNvZGlwb2RpOm5hbWVkdmlldworICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCisgICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgorICAgICBib3JkZXJvcGFjaXR5PSIxIgorICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgorICAgICBncmlkdG9sZXJhbmNlPSIxMCIKKyAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgorICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKKyAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKKyAgICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxOTIwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIxMTQwIgorICAgICBpZD0ibmFtZWR2aWV3MzA5NSIKKyAgICAgc2hvd2dyaWQ9ImZhbHNlIgorICAgICBpbmtzY2FwZTp6b29tPSI0LjkxNjY2NjciCisgICAgIGlua3NjYXBlOmN4PSItMTEuMDg0NzQ2IgorICAgICBpbmtzY2FwZTpjeT0iNy43Mjg4MTM2IgorICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LXk9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjEiCisgICAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9InN2ZzMwODkiIC8+CisgIDxwYXRoCisgICAgIGQ9Ik0gMjMsMTYgMjMsOCBDIDIzLDYuMzQgMjEuNjYsNSAyMCw1IEwgNCw1IEMgMi4zNCw1IDEsNi4zNCAxLDggbCAwLDggYyAwLDEuNjYgMS4zNCwzIDMsMyBsIDE2LDAgYyAxLjY2LDAgMywtMS4zNCAzLC0zIHogbSAtMjAsLTIgMCwtNCAxLDAgMCw0IC0xLDAgeiBtIDMsMy4yNSAwLC0xMC41IDE0LDAgMCwxMC41IC0xNCwwIHoiCisgICAgIGlkPSJwYXRoMzA5MSIKKyAgICAgc3R5bGU9ImZpbGw6IzAwYmVhNDtmaWxsLW9wYWNpdHk6MSIKKyAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KKyAgPHBhdGgKKyAgICAgZD0iTTAgMGgyNHYyNEgweiIKKyAgICAgZmlsbD0ibm9uZSIKKyAgICAgaWQ9InBhdGgzMDkzIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX3BvcnRyYWl0LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9hbmRyb2lkX3JldmVyc2VfcG9ydHJhaXQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX3BvcnRyYWl0LnN2ZwpAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxzdmcKKyAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKKyAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCisgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCisgICB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgorICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgorICAgeG1sbnM6aW5rc2NhcGU9Imh0dHA6Ly93d3cuaW5rc2NhcGUub3JnL25hbWVzcGFjZXMvaW5rc2NhcGUiCisgICBmaWxsPSIjMDAwMDAwIgorICAgaGVpZ2h0PSI0OCIKKyAgIHZpZXdCb3g9IjAgMCA0OCA0OCIKKyAgIHdpZHRoPSI0OCIKKyAgIHRyYW5zZm9ybT0ic2NhbGUoMiwyKSIKKyAgIGlkPSJzdmczMDg5IgorICAgdmVyc2lvbj0iMS4xIgorICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgorICAgc29kaXBvZGk6ZG9jbmFtZT0iaWNfcGhvbmVfYW5kcm9pZF9wb3J0cmFpdC5zdmciPgorICA8bWV0YWRhdGEKKyAgICAgaWQ9Im1ldGFkYXRhMzA5OSI+CisgICAgPHJkZjpSREY+CisgICAgICA8Y2M6V29yaworICAgICAgICAgcmRmOmFib3V0PSIiPgorICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KKyAgICAgICAgPGRjOnR5cGUKKyAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KKyAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CisgICAgICA8L2NjOldvcms+CisgICAgPC9yZGY6UkRGPgorICA8L21ldGFkYXRhPgorICA8ZGVmcworICAgICBpZD0iZGVmczMwOTciIC8+CisgIDxzb2RpcG9kaTpuYW1lZHZpZXcKKyAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgorICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKKyAgICAgYm9yZGVyb3BhY2l0eT0iMSIKKyAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKKyAgICAgZ3JpZHRvbGVyYW5jZT0iMTAiCisgICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKKyAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCisgICAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCisgICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTkyMCIKKyAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTE0MCIKKyAgICAgaWQ9Im5hbWVkdmlldzMwOTUiCisgICAgIHNob3dncmlkPSJmYWxzZSIKKyAgICAgaW5rc2NhcGU6em9vbT0iNC45MTY2NjY3IgorICAgICBpbmtzY2FwZTpjeD0iLTExLjA4NDc0NiIKKyAgICAgaW5rc2NhcGU6Y3k9IjcuNzI4ODEzNiIKKyAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCisgICAgIGlua3NjYXBlOndpbmRvdy15PSIwIgorICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIxIgorICAgICBpbmtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmczMDg5IiAvPgorICA8cGF0aAorICAgICBkPSJtIDgsMjMgOCwwIGMgMS42NiwwIDMsLTEuMzQgMywtMyBMIDE5LDQgQyAxOSwyLjM0IDE3LjY2LDEgMTYsMSBMIDgsMSBDIDYuMzQsMSA1LDIuMzQgNSw0IGwgMCwxNiBjIDAsMS42NiAxLjM0LDMgMywzIHogbSAyLC0yMCA0LDAgMCwxIC00LDAgMCwtMSB6IG0gLTMuMjUsMyAxMC41LDAgMCwxNCAtMTAuNSwwIDAsLTE0IHoiCisgICAgIGlkPSJwYXRoMzA5MSIKKyAgICAgc3R5bGU9ImZpbGw6IzAwYmVhNDtmaWxsLW9wYWNpdHk6MSIKKyAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz4KKyAgPHBhdGgKKyAgICAgZD0iTTAgMGgyNHYyNEgweiIKKyAgICAgZmlsbD0ibm9uZSIKKyAgICAgaWQ9InBhdGgzMDkzIiAvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfaW5fdGFsa18wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfaW5fdGFsa18wQkFfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMDZiZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9pbl90YWxrXzBCQV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiMwMGJlYTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNNDAgMzFjLTIuNDkgMC00Ljg5LS40LTcuMTQtMS4xNC0uNjktLjIyLTEuNDgtLjA2LTIuMDMuNDlsLTQuNCA0LjQxYy01LjY3LTIuODgtMTAuMjktNy41MS0xMy4xOC0xMy4xN2w0LjQtNC40MWMuNTUtLjU1LjcxLTEuMzQuNDktMi4wM0MxNy40IDEyLjkgMTcgMTAuNDkgMTcgOGMwLTEuMTEtLjg5LTItMi0ySDhjLTEuMTEgMC0yIC44OS0yIDIgMCAxOC43OCAxNS4yMiAzNCAzNCAzNCAxLjExIDAgMi0uODkgMi0ydi03YzAtMS4xMS0uODktMi0yLTJ6bS0yLTdoNGMwLTkuOTQtOC4wNi0xOC0xOC0xOHY0YzcuNzMgMCAxNCA2LjI3IDE0IDE0em0tOCAwaDRjMC01LjUyLTQuNDgtMTAtMTAtMTB2NGMzLjMxIDAgNiAyLjY5IDYgNnoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX2luX3RhbGtfQkVFXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX2luX3RhbGtfQkVFXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWMwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGhvbmVfaW5fdGFsa19CRUVfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjYmFlYWU0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTQwIDMxYy0yLjQ5IDAtNC44OS0uNC03LjE0LTEuMTQtLjY5LS4yMi0xLjQ4LS4wNi0yLjAzLjQ5bC00LjQgNC40MWMtNS42Ny0yLjg4LTEwLjI5LTcuNTEtMTMuMTgtMTMuMTdsNC40LTQuNDFjLjU1LS41NS43MS0xLjM0LjQ5LTIuMDNDMTcuNCAxMi45IDE3IDEwLjQ5IDE3IDhjMC0xLjExLS44OS0yLTItMkg4Yy0xLjExIDAtMiAuODktMiAyIDAgMTguNzggMTUuMjIgMzQgMzQgMzQgMS4xMSAwIDItLjg5IDItMnYtN2MwLTEuMTEtLjg5LTItMi0yem0tMi03aDRjMC05Ljk0LTguMDYtMTgtMTgtMTh2NGM3LjczIDAgMTQgNi4yNyAxNCAxNHptLTggMGg0YzAtNS41Mi00LjQ4LTEwLTEwLTEwdjRjMy4zMSAwIDYgMi42OSA2IDZ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9wYXVzZWRfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX3BhdXNlZF8wQkFfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlMzRiOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9wYXVzZWRfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0zNCA2aC00djE0aDRWNnptNiAyNWMtMi40OSAwLTQuODktLjQtNy4xNC0xLjE0LS42OS0uMjItMS40OC0uMDYtMi4wMy40OWwtNC40IDQuNDFjLTUuNjctMi44OC0xMC4yOS03LjUxLTEzLjE4LTEzLjE3bDQuNC00LjQxYy41NS0uNTUuNzEtMS4zNC40OS0yLjAzQzE3LjQgMTIuOSAxNyAxMC40OSAxNyA4YzAtMS4xMS0uODktMi0yLTJIOGMtMS4xMSAwLTIgLjg5LTIgMiAwIDE4Ljc4IDE1LjIyIDM0IDM0IDM0IDEuMTEgMCAyLS44OSAyLTJ2LTdjMC0xLjExLS44OS0yLTItMnpNMzggNnYxNGg0VjZoLTR6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9wYXVzZWRfQkVFXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob25lX3BhdXNlZF9CRUVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwMzgyNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG9uZV9wYXVzZWRfQkVFXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iI2JhZWFlNCI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0zNCA2aC00djE0aDRWNnptNiAyNWMtMi40OSAwLTQuODktLjQtNy4xNC0xLjE0LS42OS0uMjItMS40OC0uMDYtMi4wMy40OWwtNC40IDQuNDFjLTUuNjctMi44OC0xMC4yOS03LjUxLTEzLjE4LTEzLjE3bDQuNC00LjQxYy41NS0uNTUuNzEtMS4zNC40OS0yLjAzQzE3LjQgMTIuOSAxNyAxMC40OSAxNyA4YzAtMS4xMS0uODktMi0yLTJIOGMtMS4xMSAwLTIgLjg5LTIgMiAwIDE4Ljc4IDE1LjIyIDM0IDM0IDM0IDEuMTEgMCAyLS44OSAyLTJ2LTdjMC0xLjExLS44OS0yLTItMnpNMzggNnYxNGg0VjZoLTR6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG90b19jYW1lcmFfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3Bob3RvX2NhbWVyYV82NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiM2QzZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19waG90b19jYW1lcmFfNjc4XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYxN2Q4YSI+CisgICAgPGNpcmNsZSBjeD0iMjQiIGN5PSIyNCIgcj0iNi40Ii8+CisgICAgPHBhdGggZD0iTTE4IDRsLTMuNjYgNEg4Yy0yLjIxIDAtNCAxLjc5LTQgNHYyNGMwIDIuMjEgMS43OSA0IDQgNGgzMmMyLjIxIDAgNC0xLjc5IDQtNFYxMmMwLTIuMjEtMS43OS00LTQtNGgtNi4zNEwzMCA0SDE4em02IDMwYy01LjUyIDAtMTAtNC40OC0xMC0xMHM0LjQ4LTEwIDEwLTEwIDEwIDQuNDggMTAgMTAtNC40OCAxMC0xMCAxMHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFhYmY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3BsYXlfYXJyb3dfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNSBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNLTgzOC0yMjMySDU2MnYzNjAwSC04Mzh6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTE2IDEwdjI4bDIyLTE0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3BsYXlfYXJyb3dfQkVFXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3BsYXlfYXJyb3dfQkVFXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjFhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcGxheV9hcnJvd19CRUVfNDhkcC5zdmcKQEAgLTAsMCArMSw1IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiYWVhZTQiPgorICAgIDxwYXRoIGQ9Ik0tODM4LTIyMzJINTYydjM2MDBILTgzOHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTYgMTB2MjhsMjItMTR6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcG93ZXJfc2V0dGluZ3NfbmV3XzY3OF80OHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19wb3dlcl9zZXR0aW5nc19uZXdfNjc4XzQ4cHguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzBjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcG93ZXJfc2V0dGluZ3NfbmV3XzY3OF80OHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CisgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGg0OHY0OEgweiIvPgorICAgIDxwYXRoIGQ9Ik0yNiA2aC00djIwaDRWNnptOS42NyA0LjMzbC0yLjgzIDIuODNDMzUuOTggMTUuNzMgMzggMTkuNjIgMzggMjRjMCA3LjczLTYuMjcgMTQtMTQgMTRzLTE0LTYuMjctMTQtMTRjMC00LjM4IDIuMDItOC4yNyA1LjE2LTEwLjg0bC0yLjgzLTIuODNDOC40NyAxMy42MyA2IDE4LjUyIDYgMjRjMCA5Ljk0IDguMDYgMTggMTggMThzMTgtOC4wNiAxOC0xOGMwLTUuNDgtMi40Ny0xMC4zNy02LjMzLTEzLjY3eiIgZmlsbD0iIzYxN2Q4YSIgc3Ryb2tlPSIjNjE3ZDhhIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19yYWRpb19idXR0b25fY2hlY2tlZF8wQkFfMjRkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmFkaW9fYnV0dG9uX2NoZWNrZWRfMEJBXzI0ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YmVkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmFkaW9fYnV0dG9uX2NoZWNrZWRfMEJBXzI0ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCB0cmFuc2Zvcm09InNjYWxlKDIpIiBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6Ii8+CisgICAgPHBhdGggdHJhbnNmb3JtPSJzY2FsZSgyKSIgZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmFkaW9fYnV0dG9uX3VuY2hlY2tlZF83NzdfMjRkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmFkaW9fYnV0dG9uX3VuY2hlY2tlZF83NzdfMjRkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5OTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19yYWRpb19idXR0b25fdW5jaGVja2VkXzc3N18yNGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzc1NzU3NSI+CisgICAgPHBhdGggdHJhbnNmb3JtPSJzY2FsZSgyKSIgZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIvPgorICAgIDxwYXRoIHRyYW5zZm9ybT0ic2NhbGUoMikiIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3JlbW92ZV8wQkFfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmVtb3ZlXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYzYjIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3JlbW92ZV8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMzggMjZIMTB2LTRoMjh2NHoiLz4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19yZW1vdmVfNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3JlbW92ZV82NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyM2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19yZW1vdmVfNjc4XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYxN0Q4QSI+CisgICAgPHBhdGggZD0iTTM4IDI2SDEwdi00aDI4djR6Ii8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmVtb3ZlX0JFRV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19yZW1vdmVfQkVFXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWIyODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfcmVtb3ZlX0JFRV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiYWVhZTQiPgorICAgIDxwYXRoIGQ9Ik0zOCAyNkgxMHYtNGgyOHY0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NjcmVlbl9yb3RhdGlvbl82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfc2NyZWVuX3JvdGF0aW9uXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIzMWE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NjcmVlbl9yb3RhdGlvbl82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3ZDhhIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTMyLjk3IDUuMDNDMzkuNSA4LjEzIDQ0LjE5IDE0LjQ4IDQ0LjkgMjJoM0M0Ni44OCA5LjY4IDM2LjU4IDAgMjQgMGMtLjQ1IDAtLjg4LjA0LTEuMzMuMDdMMzAuMyA3LjdsMi42Ny0yLjY3ek0yMC40NiAzLjQ5Yy0xLjE3LTEuMTctMy4wNy0xLjE3LTQuMjQgMEwzLjQ5IDE2LjIyYy0xLjE3IDEuMTctMS4xNyAzLjA3IDAgNC4yNEwyNy41MyA0NC41YzEuMTcgMS4xNyAzLjA3IDEuMTcgNC4yNCAwTDQ0LjUgMzEuNzdjMS4xNy0xLjE3IDEuMTctMy4wNyAwLTQuMjRMMjAuNDYgMy40OXptOS4yIDM4Ljg5TDUuNjEgMTguMzQgMTguMzQgNS42MWwyNC4wNCAyNC4wNC0xMi43MiAxMi43M3ptLTE0LjYzLjU5QzguNSAzOS44NyAzLjgxIDMzLjUyIDMuMSAyNmgtM0MxLjEyIDM4LjMyIDExLjQyIDQ4IDI0IDQ4Yy40NSAwIC44OC0uMDQgMS4zMy0uMDdMMTcuNyA0MC4zbC0yLjY3IDIuNjd6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19zZW5kXzBCQV80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19zZW5kXzBCQV80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2NmMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NlbmRfMEJBXzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzAwYmVhNCI+CisgICAgPHBhdGggZD0iTTQuMDIgNDJMNDYgMjQgNC4wMiA2IDQgMjBsMzAgNC0zMCA0eiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NldHRpbmdzXzY3OF80OGRwLnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19zZXR0aW5nc182NzhfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5YzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19zZXR0aW5nc182NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3RDhBIj4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTM4Ljg2IDI1Ljk1Yy4wOC0uNjQuMTQtMS4yOS4xNC0xLjk1cy0uMDYtMS4zMS0uMTQtMS45NWw0LjIzLTMuMzFjLjM4LS4zLjQ5LS44NC4yNC0xLjI4bC00LTYuOTNjLS4yNS0uNDMtLjc3LS42MS0xLjIyLS40M2wtNC45OCAyLjAxYy0xLjAzLS43OS0yLjE2LTEuNDYtMy4zOC0xLjk3TDI5IDQuODRjLS4wOS0uNDctLjUtLjg0LTEtLjg0aC04Yy0uNSAwLS45MS4zNy0uOTkuODRsLS43NSA1LjNjLTEuMjIuNTEtMi4zNSAxLjE3LTMuMzggMS45N0w5LjkgMTAuMWMtLjQ1LS4xNy0uOTcgMC0xLjIyLjQzbC00IDYuOTNjLS4yNS40My0uMTQuOTcuMjQgMS4yOGw0LjIyIDMuMzFDOS4wNiAyMi42OSA5IDIzLjM0IDkgMjRzLjA2IDEuMzEuMTQgMS45NWwtNC4yMiAzLjMxYy0uMzguMy0uNDkuODQtLjI0IDEuMjhsNCA2LjkzYy4yNS40My43Ny42MSAxLjIyLjQzbDQuOTgtMi4wMWMxLjAzLjc5IDIuMTYgMS40NiAzLjM4IDEuOTdsLjc1IDUuM2MuMDguNDcuNDkuODQuOTkuODRoOGMuNSAwIC45MS0uMzcuOTktLjg0bC43NS01LjNjMS4yMi0uNTEgMi4zNS0xLjE3IDMuMzgtMS45N2w0Ljk4IDIuMDFjLjQ1LjE3Ljk3IDAgMS4yMi0uNDNsNC02LjkzYy4yNS0uNDMuMTQtLjk3LS4yNC0xLjI4bC00LjIyLTMuMzF6TTI0IDMxYy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NpZ25hbF9jZWxsdWxhcl8zX2Jhcl82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfc2lnbmFsX2NlbGx1bGFyXzNfYmFyXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI3MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3NpZ25hbF9jZWxsdWxhcl8zX2Jhcl82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw1IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjNjE3RDhBIj4KKyAgICA8cGF0aCBmaWxsLW9wYWNpdHk9Ii4zIiBkPSJNNCA0NGg0MFY0eiIvPgorICAgIDxwYXRoIGQ9Ik0zNCAxNEw0IDQ0aDMweiIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3N0b3BfMEJBXzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3N0b3BfMEJBXzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNWQ2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfc3RvcF8wQkFfNDhkcC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4cHgiIGhlaWdodD0iNDhweCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSIjMDBiZWE0Ij4KKyAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CisgICAgPHBhdGggZD0iTTEyIDEyaDI0djI0SDEyeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfc3RvcF9CRUVfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfc3RvcF9CRUVfNDhkcC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwYzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY19zdG9wX0JFRV80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiNiYWVhZTQiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMTIgMTJoMjR2MjRIMTJ6Ii8+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY191bmZvbGRfbW9yZV82NzhfNDhkcC5zdmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfdW5mb2xkX21vcmVfNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwM2U5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfdW5mb2xkX21vcmVfNjc4XzQ4ZHAuc3ZnCkBAIC0wLDAgKzEsNCBAQAorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OHB4IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzYxN2Q4YSI+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorICAgIDxwYXRoIGQ9Ik0yNCAxMS42NkwzMC4zNCAxOGwyLjgzLTIuODNMMjQgNmwtOS4xNyA5LjE3TDE3LjY2IDE4IDI0IDExLjY2em0wIDI0LjY4TDE3LjY2IDMwbC0yLjgzIDIuODNMMjQgNDJsOS4xNy05LjE3TDMwLjM0IDMwIDI0IDM2LjM0eiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfdmlkZW9jYW1fNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3ZpZGVvY2FtXzY3OF80OGRwLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGI0ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3ZpZGVvY2FtXzY3OF80OGRwLnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDhweCIgaGVpZ2h0PSI0OHB4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdkOGEiPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKyAgICA8cGF0aCBkPSJNMzQgMjF2LTdjMC0xLjEtLjktMi0yLTJIOGMtMS4xIDAtMiAuOS0yIDJ2MjBjMCAxLjEuOSAyIDIgMmgyNGMxLjEgMCAyLS45IDItMnYtN2w4IDhWMTNsLTggOHoiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3ZvbHVtZV9kb3duXzY3OF80OHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY192b2x1bWVfZG93bl82NzhfNDhweC5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzYTVlZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY192b2x1bWVfZG93bl82NzhfNDhweC5zdmcKQEAgLTAsMCArMSw0IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiPgorICAgIDxwYXRoIGQ9Ik0zNyAyNGMwLTMuNTMtMi4wNC02LjU4LTUtOC4wNXYxNi4xMWMyLjk2LTEuNDggNS00LjUzIDUtOC4wNnptLTI3LTZ2MTJoOGwxMCAxMFY4TDE4IDE4aC04eiIgZmlsbD0iIzYxN2Q4YSIgc3Ryb2tlPSIjNjE3ZDhhIi8+CisgICAgPHBhdGggZD0iTTAgMGg0OHY0OEgweiIgZmlsbD0ibm9uZSIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfdm9sdW1lX3VwXzY3OF80OHB4LnN2ZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC9pY192b2x1bWVfdXBfNjc4XzQ4cHguc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZjg5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfdm9sdW1lX3VwXzY3OF80OHB4LnN2ZwpAQCAtMCwwICsxLDQgQEAKKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHZpZXdCb3g9IjAgMCA0OCA0OCI+CisgICAgPHBhdGggZD0iTTYgMTh2MTJoOGwxMCAxMFY4TDE0IDE4SDZ6bTI3IDZjMC0zLjUzLTIuMDQtNi41OC01LTguMDV2MTYuMTFjMi45Ni0xLjQ4IDUtNC41MyA1LTguMDZ6TTI4IDYuNDZ2NC4xM2M1Ljc4IDEuNzIgMTAgNy4wNyAxMCAxMy40MXMtNC4yMiAxMS42OS0xMCAxMy40MXY0LjEzYzguMDEtMS44MiAxNC04Ljk3IDE0LTE3LjU0UzM2LjAxIDguMjggMjggNi40NnoiIGZpbGw9IiM2MTdkOGEiIHN0cm9rZT0iIzYxN2Q4YSIvPgorICAgIDxwYXRoIGQ9Ik0wIDBoNDh2NDhIMHoiIGZpbGw9Im5vbmUiLz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3pvb21faW5fNjc4XzQ4ZHAuc3ZnIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL2xpZ2h0L2ljX3pvb21faW5fNjc4XzQ4ZHAuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjM2MDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvaWNfem9vbV9pbl82NzhfNDhkcC5zdmcKQEAgLTAsMCArMSw1IEBACis8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjQ4IiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgNDggNDgiIGZpbGw9IiM2MTdkOGEiPgorICAgIDxwYXRoIHRyYW5zZm9ybT0ic2NhbGUoMikiIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0eiIvPgorICAgIDxwYXRoIHRyYW5zZm9ybT0ic2NhbGUoMikiIGZpbGw9Im5vbmUiIGQ9Ik0wIDBoMjR2MjRIMFYweiIvPgorICAgIDxwYXRoIHRyYW5zZm9ybT0ic2NhbGUoMikiIGQ9Ik0xMiAxMGgtMnYySDl2LTJIN1Y5aDJWN2gxdjJoMnYxeiIvPgorPC9zdmc+CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvdG9nZ2xlX29mZl9saWdodC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvdG9nZ2xlX29mZl9saWdodC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1MGZiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC90b2dnbGVfb2ZmX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvdG9nZ2xlX29uLnBuZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9saWdodC90b2dnbGVfb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYmQ3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbGlnaHQvdG9nZ2xlX29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC9jZW50ZXJfcG9pbnQucG5nIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL211bHRpdG91Y2gvY2VudGVyX3BvaW50LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmJhZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL211bHRpdG91Y2gvY2VudGVyX3BvaW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC9jZW50ZXJfcG9pbnRfMngucG5nIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL211bHRpdG91Y2gvY2VudGVyX3BvaW50XzJ4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJmNTllCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW1hZ2VzL211bHRpdG91Y2gvY2VudGVyX3BvaW50XzJ4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC90b3VjaF9wb2ludC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC90b3VjaF9wb2ludC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4ODA4OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9tdWx0aXRvdWNoL3RvdWNoX3BvaW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC90b3VjaF9wb2ludF8yeC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbWFnZXMvbXVsdGl0b3VjaC90b3VjaF9wb2ludF8yeC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkNGM1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2ltYWdlcy9tdWx0aXRvdWNoL3RvdWNoX3BvaW50XzJ4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbml0LXF0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L2luaXQtcXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Yjg5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbml0LXF0LmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2luaXQtcXQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9xdC1zZXR0aW5ncy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPFFDb3JlQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUZvbnREYXRhYmFzZT4KKwordm9pZCBhbmRyb2lkUXREZWZhdWx0SW5pdCgpIHsKKyAgICBRX0lOSVRfUkVTT1VSQ0UocmVzb3VyY2VzKTsKKworICAgIC8vIEdpdmUgUXQgdGhlIGZvbnRzIGZyb20gb3VyIHJlc291cmNlIGZpbGUKKyAgICBRRm9udERhdGFiYXNlIGZvbnREYjsKKyAgICBpbnQgZm9udElkID0gZm9udERiLmFkZEFwcGxpY2F0aW9uRm9udCgiOi9saWIvZm9udHMvUm9ib3RvIik7CisgICAgaWYgKGZvbnRJZCA8IDApIHsKKyAgICAgICAgVkVSQk9TRV9QUklOVChpbml0LAorICAgICAgICAgICAgICAgICAgICAgICJDb3VudCBub3QgbG9hZCBmb250IHJlc291cmNlOiBcIjovbGliL2ZvbnRzL1JvYm90byIpOworICAgIH0KKyAgICBmb250SWQgPSBmb250RGIuYWRkQXBwbGljYXRpb25Gb250KCI6L2xpYi9mb250cy9Sb2JvdG8tQm9sZCIpOworICAgIGlmIChmb250SWQgPCAwKSB7CisgICAgICAgIFZFUkJPU0VfUFJJTlQoCisgICAgICAgICAgICAgICAgaW5pdCwKKyAgICAgICAgICAgICAgICAiQ291bnQgbm90IGxvYWQgZm9udCByZXNvdXJjZTogXCI6L2xpYi9mb250cy9Sb2JvdG8tQm9sZCIpOworICAgIH0KKyAgICBmb250SWQgPSBmb250RGIuYWRkQXBwbGljYXRpb25Gb250KCI6L2xpYi9mb250cy9Sb2JvdG8tTWVkaXVtIik7CisgICAgaWYgKGZvbnRJZCA8IDApIHsKKyAgICAgICAgVkVSQk9TRV9QUklOVCgKKyAgICAgICAgICAgICAgICBpbml0LAorICAgICAgICAgICAgICAgICJDb3VudCBub3QgbG9hZCBmb250IHJlc291cmNlOiBcIjovbGliL2ZvbnRzL1JvYm90by1NZWRpdW0iKTsKKyAgICB9CisKKyAgICAvLyBTZXR1cCB0aGUgYXBwbGljYXRpb24gcHJvcGVydGllcworICAgIFFDb3JlQXBwbGljYXRpb246OnNldE9yZ2FuaXphdGlvbk5hbWUoVWk6OlNldHRpbmdzOjpPUkdfTkFNRSk7CisgICAgUUNvcmVBcHBsaWNhdGlvbjo6c2V0T3JnYW5pemF0aW9uRG9tYWluKFVpOjpTZXR0aW5nczo6T1JHX0RPTUFJTik7CisgICAgUUNvcmVBcHBsaWNhdGlvbjo6c2V0QXBwbGljYXRpb25OYW1lKFVpOjpTZXR0aW5nczo6QVBQX05BTUUpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW5pdC1xdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvaW5pdC1xdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OGJkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9pbml0LXF0LmgKQEAgLTAsMCArMSwxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKy8vIFJ1biB0aGUgZGVmYXVsdCBRdCBpbml0aWFsaXphdGlvbiAtIGZvbnRzLCByZXNvdXJjZXMsIG5hbWUvb3JnIGV0YworLy8gVGhlIGJlc3QgcGxhY2UgdG8gY2FsbCBpdCBpcyByaWdodCBhZnRlciB0aGUgUUFwcGxpY2F0aW9uIGNyZWF0aW9uCit2b2lkIGFuZHJvaWRRdERlZmF1bHRJbml0KCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9tYWMtbmF0aXZlLXdpbmRvdy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvbWFjLW5hdGl2ZS13aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNkODg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvbWFjLW5hdGl2ZS13aW5kb3cuaApAQCAtMCwwICsxLDIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCit2b2lkKiBnZXROU1dpbmRvdyh2b2lkKiBuc192aWV3KTsKK3ZvaWQgbnNXaW5kb3dIaWRlV2luZG93QnV0dG9ucyh2b2lkKiBuc193aW5kb3cpOworaW50IG51bUhlbGRNb3VzZUJ1dHRvbnMoKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L21hYy1uYXRpdmUtd2luZG93Lm1tIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvbWFjLW5hdGl2ZS13aW5kb3cubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5YjQyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L21hYy1uYXRpdmUtd2luZG93Lm1tCkBAIC0wLDAgKzEsNDUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KKworI2ltcG9ydCAiYW5kcm9pZC9za2luL3F0L21hYy1uYXRpdmUtd2luZG93LmgiCisKK3ZvaWQqIGdldE5TV2luZG93KHZvaWQqIG5zX3ZpZXcpIHsKKyAgICBOU1ZpZXcgKnZpZXcgPSAoTlNWaWV3ICopbnNfdmlldzsKKyAgICBpZiAoIXZpZXcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENsYXNzIHZpZXdDbGFzcyA9IFt2aWV3IGNsYXNzXTsKKyAgICBDbGFzcyBuc3ZpZXdDbGFzcyA9IFtOU1ZpZXcgY2xhc3NdOworICAgIGlmIChbdmlld0NsYXNzIGlzU3ViY2xhc3NPZkNsYXNzOm5zdmlld0NsYXNzIF0pIHsKKyAgICAgICAgcmV0dXJuIFt2aWV3IHdpbmRvd107CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHZpZXc7CisgICAgfQorCit9CisKK3ZvaWQgbnNXaW5kb3dIaWRlV2luZG93QnV0dG9ucyh2b2lkKiBuc193aW5kb3cpIHsKKyAgICBOU1dpbmRvdyAqd2luZG93ID0gKE5TV2luZG93ICopbnNfd2luZG93OworICAgIGlmICghd2luZG93KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgW1t3aW5kb3cgc3RhbmRhcmRXaW5kb3dCdXR0b246TlNXaW5kb3dDbG9zZUJ1dHRvbl0gc2V0SGlkZGVuOnRydWVdOworICAgIFtbd2luZG93IHN0YW5kYXJkV2luZG93QnV0dG9uOk5TV2luZG93TWluaWF0dXJpemVCdXR0b25dIHNldEhpZGRlbjp0cnVlXTsKKyAgICBbW3dpbmRvdyBzdGFuZGFyZFdpbmRvd0J1dHRvbjpOU1dpbmRvd1pvb21CdXR0b25dIHNldEhpZGRlbjp0cnVlXTsKKyAgICBbd2luZG93IHNldENvbGxlY3Rpb25CZWhhdmlvcjpOU1dpbmRvd0NvbGxlY3Rpb25CZWhhdmlvckZ1bGxTY3JlZW5BdXhpbGlhcnldOworfQorCitpbnQgbnVtSGVsZE1vdXNlQnV0dG9ucygpIHsKKyAgICByZXR1cm4gKGludCkgW05TRXZlbnQgcHJlc3NlZE1vdXNlQnV0dG9uc107Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWJhY2sucG5nIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvZW52LW1hcC1iYWNrLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzU2ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvZW52LW1hcC1iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWJvdHRvbS5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWJvdHRvbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2MGMyMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL2Vudi1tYXAtYm90dG9tLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWZyb250LnBuZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL2Vudi1tYXAtZnJvbnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWQ5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWZyb250LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLWxlZnQucG5nIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvZW52LW1hcC1sZWZ0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI1NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvZW52LW1hcC1sZWZ0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLXJpZ2h0LnBuZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL2Vudi1tYXAtcmlnaHQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDNjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLXJpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLXRvcC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9lbnYtbWFwLXRvcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxOWJiNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL2Vudi1tYXAtdG9wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9mcmFnLmdsc2wgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9mcmFnLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0NmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL2ZyYWcuZ2xzbApAQCAtMCwwICsxLDQ5IEBACitwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKKwordmFyeWluZyB2ZWMzIHZhcnlpbmdfcG9zOwordmFyeWluZyB2ZWMzIHZhcnlpbmdfbm9ybWFsOwordmFyeWluZyB2ZWMyIHZhcnlpbmdfdXY7CisKK3VuaWZvcm0gc2FtcGxlcjJEIGRpZmZ1c2VfbWFwOwordW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJfbWFwOwordW5pZm9ybSBzYW1wbGVyMkQgZ2xvc3NfbWFwOwordW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZfbWFwOworCitjb25zdCB2ZWMzIGxpZ2h0X3BvcyA9IHZlYzMoMC4wLCAwLjAsIDUuMCk7CisKK3ZvaWQgbWFpbigpIHsKKyAgICAvLyBNYWtlIHN1cmUgbm9ybWFsIGlzIHVuaXQgbGVuZ3RoLgorICAgIHZlYzMgbiA9IG5vcm1hbGl6ZSh2YXJ5aW5nX25vcm1hbCk7CisKKyAgICAvLyBEaXJlY3Rpb24gZnJvbSB0aGUgcG9pbnQgdG8gdGhlIGxpZ2h0IHNvdXJjZSwKKyAgICAvLyB1bml0IGxlbmd0aC4KKyAgICB2ZWMzIGwgPSBub3JtYWxpemUobGlnaHRfcG9zIC0gdmFyeWluZ19wb3MpOworCisgICAgLy8gTGFtYmVydGlhbgorICAgIGZsb2F0IGxhbWJlcnQgPSBtYXgoZG90KGwsIG4pLCAwLjApOworCisgICAgLy8gSGlnaGxpZ2h0CisgICAgZmxvYXQgc3BlY3VsYXJfdmFsdWUgPSAwLjA7CisgICAgaWYgKGxhbWJlcnQgPiAwLjApIHsKKyAgICAgICAgLy8gRGlyZWN0aW9uIGZyb20gcG9pbnQgdG93YXJkcyB2aWV3ZXIuCisgICAgICAgIHZlYzMgdiA9IG5vcm1hbGl6ZSgtdmFyeWluZ19wb3MpOworCisgICAgICAgIC8vIEhhbGZ3YXkgYmV0d2VlbiB2aWV3ZXIgYW5kIGxpZ2h0IHZlY3RvcnMsCisgICAgICAgIC8vIHVzZWQgdG8gYXBwcm94aW1hdGUgcmVmbGVjdGlvbiAob3B0aW1pemF0aW9uKS4KKyAgICAgICAgdmVjMyBoID0gKG5vcm1hbGl6ZShsK3YpKTsKKworICAgICAgICAvLyBBbHBoYSBkZXRlcm1pbmVzIHRoZSBzcGVjdWxhciBoYXJkbmVzcy9zaXplIG9mIGhpZ2hsaWdodC4KKyAgICAgICAgZmxvYXQgYWxwaGEgPSAyNTUuMCAqICh0ZXh0dXJlMkQoZ2xvc3NfbWFwLCB2YXJ5aW5nX3V2KS5yKTsKKyAgICAgICAgc3BlY3VsYXJfdmFsdWUgPSBwb3cobWF4KGRvdChoLCBuKSwgMC4wKSwgYWxwaGEpOworICAgIH0KKworICAgIHZlYzQgcmVmbF9jb2xvciA9IHRleHR1cmVDdWJlKGVudl9tYXAsIHJlZmxlY3QodmFyeWluZ19wb3MsIG4pKTsKKyAgICB2ZWM0IGRpZmZ1c2VfY29sb3IgPSB0ZXh0dXJlMkQoZGlmZnVzZV9tYXAsIHZhcnlpbmdfdXYpOworICAgIGZsb2F0IHNwZWNfaW50ZW5zaXR5ID0gdGV4dHVyZTJEKHNwZWN1bGFyX21hcCwgdmFyeWluZ191dikucjsKKworICAgIC8vIENvbXB1dGUgZGlmZnVzZSB0ZXJtLgorICAgIHZlYzMgZGlmZnVzZSA9IGxhbWJlcnQgKiAoKDEuMCAtIHNwZWNfaW50ZW5zaXR5KSAqIGRpZmZ1c2VfY29sb3IucmdiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjX2ludGVuc2l0eSAqIHJlZmxfY29sb3IucmdiKTsKKyAgICB2ZWMzIHNwZWN1bGFyID0gdmVjMyhzcGVjdWxhcl92YWx1ZSAqIHNwZWNfaW50ZW5zaXR5KTsKKyAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGRpZmZ1c2UgKyBzcGVjdWxhciwgZGlmZnVzZV9jb2xvci5hKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLWRpZmZ1c2UtbWFwLnBuZyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLWRpZmZ1c2UtbWFwLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTA2YjcwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvbW9kZWwtZGlmZnVzZS1tYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLWdsb3NzLW1hcC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1nbG9zcy1tYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmY0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1nbG9zcy1tYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLXNwZWN1bGFyLW1hcC5qcGcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1zcGVjdWxhci1tYXAuanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGYxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1zcGVjdWxhci1tYXAuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLXNwZWN1bGFyLW1hcC5wbmcgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1zcGVjdWxhci1tYXAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTYxOWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9waG9uZS1tb2RlbC9tb2RlbC1zcGVjdWxhci1tYXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLm9iaiBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL21vZGVsLm9iagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY0MGQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvbW9kZWwub2JqCkBAIC0wLDAgKzEsNTQxNjIgQEAKKyMgQmxlbmRlciB2Mi43NiAoc3ViIDApIE9CSiBGaWxlOiAnJworIyB3d3cuYmxlbmRlci5vcmcKK3YgMS4yNzk1MzQgMi42MTQ5NDUgLTAuMDE5OTU2Cit2IC0xLjIyNDQ1OCAyLjk2NjIzMSAtMC4wMTk5NTcKK3YgLTEuNTc2NzE4IC0yLjI3MTUzNCAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMi40MTY1NTQgLTAuMDE3OTg3Cit2IC0xLjA0MjM0MyAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgMS4yODE1MDMgMi42MTQ5NDggMC4xMzU4MDUKK3YgMS4yNTM2OTAgMi43NTE2NjcgMC4xMzU4MDUKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMzU4MDUKK3YgMS4wNjU2MzUgMi45Mzk2NzAgMC4xMzU4MDUKK3YgMC45Mjk0MjYgMi45NjgyMDAgMC4xMzU4MDUKK3YgLTEuMjI0NTkwIDIuOTY4MTk5IDAuMTM1ODA0Cit2IC0xLjM2MDk3MyAyLjkzOTY5NyAwLjEzNTgwNAordiAtMS40NzMyNDEgMi44NjQwNjkgMC4xMzU4MDQKK3YgLTEuNTQ4OTc4IDIuNzUxNjY3IDAuMTM1ODA0Cit2IC0xLjU3NjcxNyAyLjYxNDkxMCAwLjEzNTgwNAordiAtMS41NzY3MTggLTIuMjcxNTM0IDAuMTM1ODA2Cit2IC0xLjU3NjcxNyAyLjQxNjU1NSAwLjEzNTgwNAordiAxLjI4MTUwMyAyLjQxNjU1NCAwLjEzNTgwNQordiAxLjI4MTUwMSAtMi4yNzE1MzUgMC4xMzU4MDcKK3YgLTEuMDQyMzQzIDIuOTY4MjAxIDAuMTM1ODA1Cit2IDAuNjMzMTExIDIuOTY4MjAwIDAuMTM1ODA1Cit2IC0xLjQ2MTc5MSAyLjg1MjY1OCAwLjE2MzYyMgordiAtMS41MzQxNzIgMi43NDUxNjkgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDIuNjE0ODYxIDAuMTYzNjIyCit2IC0xLjU2MDI2MSAyLjQxNjU1NSAwLjE2MzYyMgordiAtMS41NjAyNjIgLTIuMjcxNTM0IDAuMTYzNjI0Cit2IDEuMjY0OTY0IC0yLjI3MTUzNSAwLjE2MzYyNQordiAxLjI2NDk2NSAyLjQxNjU1NCAwLjE2MzYyMwordiAxLjI2NDk2NSAyLjYxNDkyOCAwLjE2MzYyMwordiAxLjIzODg0NyAyLjc0NTE0OCAwLjE2MzYyMwordiAxLjE2NjgwOSAyLjg1MjY4MSAwLjE2MzYyMwordiAxLjA1OTUwNyAyLjkyNDgyNCAwLjE2MzYyMwordiAwLjkyOTIxMCAyLjk1MTY4OSAwLjE2MzYyMwordiAwLjYzMzExMSAyLjk1MTY4OSAwLjE2MzYyMwordiAtMS4wNDIzNDMgMi45NTE2OTAgMC4xNjM2MjIKK3YgLTEuMjIyMjE0IDIuOTUxNjkxIDAuMTYzNjIyCit2IC0xLjM1NDcwMiAyLjkyNDk0OSAwLjE2MzYyMgordiAxLjI1MTgzOCAyLjc1MDg5MSAtMC4wMTk5NTYKK3YgMS4xNzY1MjggMi44NjI0ODMgLTAuMDE5OTU2Cit2IDEuMDY0ODYwIDIuOTM3ODU5IC0wLjAxOTk1NgordiAwLjkyOTQyNiAyLjk2NjIzMSAtMC4wMTk5NTYKK3YgLTEuMzYwMTYwIDIuOTM3ODQ1IC0wLjAxOTk1NwordiAtMS40NzE4MjMgMi44NjI3NDQgLTAuMDE5OTU3Cit2IC0xLjU0NzEyNyAyLjc1MDg5MiAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ4IDIuNjE0OTA3IC0wLjAxOTk1NwordiAtMS41NzY3MTcgMi40MTY1NTUgLTAuMDE3OTg4Cit2IDEuMjgxNTAyIC0yLjI3MTUzNiAtMC4wMTc5ODYKK3YgMC42MzMxMTEgMi45NjgyMDAgLTAuMDE3OTg4Cit2IDEuMjgxNTAzIDIuNjE0OTQ4IDAuMTMwODc4Cit2IDEuMjUzNjkwIDIuNzUxNjY3IDAuMTMwODc4Cit2IDEuMTc3OTg0IDIuODYzOTk0IDAuMTMwODc4Cit2IDEuMDY1NjM1IDIuOTM5NjcwIDAuMTMwODc4Cit2IDAuOTI5NDI2IDIuOTY4MjAwIDAuMTMwODc4Cit2IC0xLjIyNDU5MCAyLjk2ODE5OSAwLjEzMDg3NwordiAtMS4zNjA5NzMgMi45Mzk2OTcgMC4xMzA4NzcKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMTMwODc3Cit2IC0xLjU0ODk3OCAyLjc1MTY2NyAwLjEzMDg3NwordiAtMS41NzY3MTcgMi42MTQ5MTAgMC4xMzA4NzcKK3YgLTEuNTc2NzE4IC0yLjI3MTUzNCAwLjEzMDg3OQordiAtMS41NzY3MTcgMi40MTY1NTUgMC4xMzA4NzcKK3YgMS4yODE1MDMgMi40MTY1NTQgMC4xMzA4NzgKK3YgMS4yODE1MDEgLTIuMjcxNTM1IDAuMTMwODgwCit2IC0xLjA0MjM0MyAyLjk2ODIwMSAwLjEzMDg3NwordiAwLjYzMzExMSAyLjk2ODIwMCAwLjEzMDg3OAordiAtMS40NTMyODMgMi44NDQxNTEgMC4xNjM2MjIKK3YgLTEuNTIzMDYyIDIuNzQwNTE4IDAuMTYzNjIyCit2IC0xLjU0ODQ1MCAyLjYxNDg0OSAwLjE2MzYyMgordiAtMS41NDg0NTAgMi40MTY1NTUgMC4xNjM2MjIKK3YgLTEuNTQ4NDUxIC0yLjI3MTUzNCAwLjE2MzYyNAordiAxLjI1MzE1MyAtMi4yNzE1MzUgMC4xNjM2MjUKK3YgMS4yNTMxNTQgMi40MTY1NTQgMC4xNjM2MjMKK3YgMS4yNTMxNTQgMi42MTQ5MTUgMC4xNjM2MjMKK3YgMS4yMjc3MzcgMi43NDA0OTcgMC4xNjM2MjMKK3YgMS4xNTg0MzMgMi44NDQxNzMgMC4xNjM2MjMKK3YgMS4wNTQ4NjMgMi45MTM3MTQgMC4xNjM2MjMKK3YgMC45MjkzNjUgMi45Mzk4NzggMC4xNjM2MjMKK3YgMC42MzMxMTEgMi45Mzk4NzggMC4xNjM2MjMKK3YgLTEuMDQyMzQzIDIuOTM5ODc4IDAuMTYzNjIyCit2IC0xLjIyMDU3NiAyLjkzOTc1NyAwLjE2MzYyMgordiAtMS4zNTAxNDggMi45MTM4NDIgMC4xNjM2MjIKK3YgLTEuNDQ3NjExIDIuODM4NDc5IDAuMTYwOTUwCit2IC0xLjUxNTY1NiAyLjczNzQxNyAwLjE2MDk1MAordiAtMS41NDA1NzYgMi42MTQ4NDAgMC4xNjA5NTAKK3YgLTEuNTQwNTc2IDIuNDE2NTU1IDAuMTYwOTUwCit2IC0xLjU0MDU3NyAtMi4yNzE1MzQgMC4xNjA5NTIKK3YgMS4yNDUyNzkgLTIuMjcxNTM1IDAuMTYwOTUzCit2IDEuMjQ1MjgwIDIuNDE2NTU0IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTYwOTUxCit2IDEuMjIwMzMwIDIuNzM3Mzk2IDAuMTYwOTUxCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwOTUxCit2IDEuMDUxNzYyIDIuOTA2MzA4IDAuMTYwOTUxCit2IDAuOTI5MjY3IDIuOTMyMDI4IDAuMTYwOTUxCit2IDAuNjMzMTExIDIuOTMyMDI4IDAuMTYwOTUxCit2IC0xLjA0MjM0MyAyLjkzMjAyOCAwLjE2MDk1MAordiAtMS4yMTk1NDggMi45MzIwMjIgMC4xNjA5NTAKK3YgLTEuMzQ3MDQ3IDIuOTA2NDM1IDAuMTYwOTUwCit2IC0xLjUzMDQ2MiAyLjc0MzkxNSAtMC4wMTk5NTcKK3YgLTEuNDU5MDYxIDIuODQ5OTgyIC0wLjAxOTk1NwordiAtMS4zNTMxNjYgMi45MjEyMTggLTAuMDE5OTU3Cit2IC0xLjIyMjIxMSAyLjk0ODUxNyAtMC4wMTk5NTcKK3YgLTEuMDQyMzQzIDIuOTQ4NTE2IC0wLjAxOTk1NwordiAwLjYzMzExMSAyLjk0ODUxNSAtMC4wMTk5NTYKK3YgMC45MjkyNjUgMi45NDg1MTUgLTAuMDE5OTU2Cit2IDEuMDU3ODg0IDIuOTIwNjMxIC0wLjAxOTk1NgordiAxLjE2MzkxNyAyLjg0OTcyMSAtMC4wMTk5NTYKK3YgMS4yMzUxNzQgMi43NDM5MTUgLTAuMDE5OTU2Cit2IDEuMjY3MzU3IDIuNjE0OTI2IC0wLjAxOTk1NgordiAxLjI2NzM1NyAyLjQxNjU1NCAtMC4wMTk5NTYKK3YgMS4yNjczNTUgLTIuMjcxNTM2IC0wLjAxOTk1NAordiAtMS41NTcwMzMgLTIuMjcxNTM0IC0wLjAxOTk1NQordiAtMS41NTcwMzIgMi40MTY1NTUgLTAuMDE5OTU3Cit2IC0xLjU1NzAzMiAyLjYxNDg4OCAtMC4wMTk5NTcKK3YgMS4yODE1MDMgMi42MTQ5NDggLTAuMDE3OTg3Cit2IC0xLjIyNDU5MCAyLjk2ODE5OSAtMC4wMTc5ODgKK3YgLTEuNTc0NzUwIC0yLjI3MTUzNCAtMC4wMTk5NTUKK3YgMS4yNzk1MzQgMi40MTY1NTQgLTAuMDE5OTU2Cit2IC0xLjA0MjM0MyAyLjk2NjIzMiAtMC4wMTk5NTcKK3YgMS4yNTM2OTAgMi43NTE2NjYgLTAuMDE3OTg4Cit2IDEuMTc3OTg0IDIuODYzOTk0IC0wLjAxNzk4OAordiAxLjA2NTYzNSAyLjkzOTY3MCAtMC4wMTc5ODgKK3YgMC45Mjk0MjYgMi45NjgyMDAgLTAuMDE3OTg4Cit2IC0xLjM2MDk3MyAyLjkzOTY5NyAtMC4wMTc5ODgKK3YgLTEuNDczMjQxIDIuODY0MDY5IC0wLjAxNzk4OAordiAtMS41NDg5NzggMi43NTE2NjcgLTAuMDE3OTg4Cit2IC0xLjU3NjcxNyAyLjYxNDkxMCAtMC4wMTc5ODgKK3YgLTEuNTc0NzQ4IDIuNDE2NTU1IC0wLjAxOTk1NwordiAxLjI3OTUzMyAtMi4yNzE1MzYgLTAuMDE5OTU0Cit2IDAuNjMzMTExIDIuOTY2MjMxIC0wLjAxOTk1NgordiAxLjI4MTUwMyAyLjYxNDk0OCAtMC4wMTI0ODAKK3YgMS4yNTM2OTAgMi43NTE2NjYgLTAuMDEyNDgxCit2IDEuMTc3OTg0IDIuODYzOTk0IC0wLjAxMjQ4MQordiAxLjA2NTYzNSAyLjkzOTY3MCAtMC4wMTI0ODEKK3YgMC45Mjk0MjYgMi45NjgyMDAgLTAuMDEyNDgxCit2IC0xLjIyNDU5MCAyLjk2ODE5OSAtMC4wMTI0ODEKK3YgLTEuMzYwOTczIDIuOTM5Njk3IC0wLjAxMjQ4MQordiAtMS40NzMyNDEgMi44NjQwNjkgLTAuMDEyNDgxCit2IC0xLjU0ODk3OCAyLjc1MTY2NyAtMC4wMTI0ODEKK3YgLTEuNTc2NzE3IDIuNjE0OTEwIC0wLjAxMjQ4MQordiAtMS41NzY3MTggLTIuMjcxNTM0IC0wLjAxMjQ4MAordiAtMS41NzY3MTcgMi40MTY1NTUgLTAuMDEyNDgxCit2IDEuMjgxNTAzIDIuNDE2NTU0IC0wLjAxMjQ4MAordiAxLjI4MTUwMiAtMi4yNzE1MzYgLTAuMDEyNDc5Cit2IC0xLjA0MjM0MyAyLjk2ODIwMSAtMC4wMTI0ODEKK3YgMC42MzMxMTEgMi45NjgyMDAgLTAuMDEyNDgxCit2IDEuMjgxNTAzIDIuNjE0OTQ4IDAuMDY4NDEzCit2IDEuMjUzNjkwIDIuNzUxNjY3IDAuMDY4NDEyCit2IDEuMTc3OTg0IDIuODYzOTk0IDAuMDY4NDEyCit2IDEuMDY1NjM1IDIuOTM5NjcwIDAuMDY4NDEyCit2IDAuOTI5NDI2IDIuOTY4MjAwIDAuMDY4NDEyCit2IC0xLjIyNDU5MCAyLjk2ODE5OSAwLjA2ODQxMgordiAtMS4zNjA5NzMgMi45Mzk2OTcgMC4wNjg0MTIKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMDY4NDEyCit2IC0xLjU0ODk3OCAyLjc1MTY2NyAwLjA2ODQxMgordiAtMS41NzY3MTcgMi42MTQ5MTAgMC4wNjg0MTIKK3YgLTEuNTc2NzE4IC0yLjI3MTUzNCAwLjA2ODQxMwordiAtMS41NzY3MTcgMi40MTY1NTUgMC4wNjg0MTIKK3YgMS4yODE1MDMgMi40MTY1NTQgMC4wNjg0MTMKK3YgMS4yODE1MDEgLTIuMjcxNTM1IDAuMDY4NDE0Cit2IC0xLjA0MjM0MyAyLjk2ODIwMSAwLjA2ODQxMgordiAwLjYzMzExMSAyLjk2ODIwMCAwLjA2ODQxMgordiAtMC45MjgwOTggMi45NjgyMDEgMC4xMzU4MDUKK3YgLTAuOTI4MDk3IDIuOTY2MjMyIC0wLjAxOTk1NwordiAtMC45MjgwOTggMi45NjgyMDEgMC4xMzA4NzcKK3YgLTAuOTI4MDk4IDIuOTM5ODc4IDAuMTYzNjIyCit2IC0wLjkyODA5OCAyLjkzMjAyOCAwLjE2MDk1MQordiAtMC45MjgwOTcgMi45NjgyMDEgLTAuMDE3OTg4Cit2IC0wLjkyODA5NyAyLjk2ODIwMSAtMC4wMTI0ODEKK3YgLTAuOTI4MDk4IDIuOTY4MjAxIDAuMDY4NDEyCit2IC0wLjkyODA5OCAyLjk1MTY5MCAwLjE2MzYyMgordiAtMC45MjgwOTcgMi45NDg1MTYgLTAuMDE5OTU3Cit2IC0wLjk4NDM0NCAyLjk2ODIwMSAwLjEzNTgwNQordiAtMC45ODQzNDMgMi45NjYyMzIgLTAuMDE5OTU3Cit2IC0wLjk4NDM0NCAyLjk2ODIwMSAwLjEzMDg3NwordiAtMC45ODQzNDQgMi45Mzk4NzggMC4xNjM2MjIKK3YgLTAuOTg0MzQ0IDIuOTMyMDI4IDAuMTYwOTUwCit2IC0wLjk4NDM0MyAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgLTAuOTg0MzQzIDIuOTY4MjAxIC0wLjAxMjQ4MQordiAtMC45ODQzNDQgMi45NjgyMDEgMC4wNjg0MTIKK3YgLTAuOTg0MzQ0IDIuOTUxNjkwIDAuMTYzNjIyCit2IC0wLjk4NDM0MyAyLjk0ODUxNiAtMC4wMTk5NTcKK3YgMS4yODE1MDMgMi42MTQ5NDggMC4wMTk4NTAKK3YgMS4yNTM2OTAgMi43NTE2NjcgMC4wMTk4NTAKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4wMTk4NTAKK3YgMS4wNjU2MzUgMi45Mzk2NzAgMC4wMTk4NTAKK3YgMC45Mjk0MjYgMi45NjgyMDAgMC4wMTk4NTAKK3YgLTEuMjI0NTkwIDIuOTY4MTk5IDAuMDE5ODUwCit2IC0xLjM2MDk3MyAyLjkzOTY5NyAwLjAxOTg1MAordiAtMS40NzMyNDEgMi44NjQwNjkgMC4wMTk4NTAKK3YgLTEuNTQ4OTc4IDIuNzUxNjY3IDAuMDE5ODUwCit2IC0xLjU3NjcxNyAyLjYxNDkxMCAwLjAxOTg1MAordiAtMS41NzY3MTkgLTIuMjcxNTM0IDAuMDE5ODQ3Cit2IC0xLjU3NjcxNyAyLjQxNjU1NSAwLjAxOTg1MAordiAxLjI4MTUwMyAyLjQxNjU1NCAwLjAxOTg1MAordiAxLjI4MTUwMSAtMi4yNzE1MzYgMC4wMTk4NDcKK3YgLTEuMDQyMzQzIDIuOTY4MjAxIDAuMDE5ODUwCit2IDAuNjMzMTExIDIuOTY4MjAwIDAuMDE5ODUwCit2IC0wLjkyODA5NyAyLjk2ODIwMSAwLjAxOTg1MAordiAtMC45ODQzNDQgMi45NjgyMDEgMC4wMTk4NTAKK3YgMS4yODE1MDMgMi42MTQ5NDggMC4xMTA0MTQKK3YgMS4yNTM2OTAgMi43NTE2NjcgMC4xMTA0MTQKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMTA0MTQKK3YgMS4wNjU2MzUgMi45Mzk2NzAgMC4xMTA0MTQKK3YgMC45Mjk0MjYgMi45NjgyMDAgMC4xMTA0MTQKK3YgLTEuMjI0NTkwIDIuOTY4MTk5IDAuMTEwNDEzCit2IC0xLjM2MDk3MyAyLjkzOTY5NyAwLjExMDQxMwordiAtMS40NzMyNDEgMi44NjQwNjkgMC4xMTA0MTMKK3YgLTEuNTQ4OTc4IDIuNzUxNjY3IDAuMTEwNDEzCit2IC0xLjU3NjcxNyAyLjYxNDkxMCAwLjExMDQxMwordiAtMS41NzY3MTggLTIuMjcxNTM0IDAuMTEwNDE1Cit2IC0xLjU3NjcxNyAyLjQxNjU1NSAwLjExMDQxMwordiAxLjI4MTUwMyAyLjQxNjU1NCAwLjExMDQxNAordiAxLjI4MTUwMSAtMi4yNzE1MzUgMC4xMTA0MTYKK3YgLTEuMDQyMzQzIDIuOTY4MjAxIDAuMTEwNDEzCit2IDAuNjMzMTExIDIuOTY4MjAwIDAuMTEwNDE0Cit2IC0wLjkyODA5OCAyLjk2ODIwMSAwLjExMDQxMwordiAtMC45ODQzNDQgMi45NjgyMDEgMC4xMTA0MTMKK3YgMC41MjI3MjcgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC41MjI3MjcgMi45NDg1MTUgLTAuMDE5OTU2Cit2IDAuNTIyNzI3IDIuOTY4MjAwIDAuMTM1ODA1Cit2IDAuNTIyNzI3IDIuOTY2MjMxIC0wLjAxOTk1NgordiAwLjUyMjcyNyAyLjk2ODIwMCAwLjEzMDg3OAordiAwLjUyMjcyNyAyLjkzOTg3OCAwLjE2MzYyMwordiAwLjUyMjcyNyAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjUyMjcyNyAyLjk2ODIwMCAtMC4wMTc5ODgKK3YgMC41MjI3MjcgMi45NjgyMDAgLTAuMDEyNDgxCit2IDAuNTIyNzI3IDIuOTY4MjAwIDAuMDY4NDEyCit2IDAuNTIyNzI3IDIuOTY4MjAwIDAuMDE5ODQ4Cit2IDAuNTIyNzI3IDIuOTY4MjAwIDAuMTEwNDEzCit2IDAuNTgwMzY2IDIuOTY4MjAwIDAuMDQzNDM0Cit2IDAuNTYyNTkyIDIuOTY4MjAwIDAuMDUwNTA1Cit2IDAuNTU1Mzc5IDIuOTY4MjAwIDAuMDY4NDEyCit2IDAuNTYyNjk4IDIuOTY4MjAwIDAuMDg2MTAzCit2IDAuNTgwMzU2IDIuOTY4MjAwIDAuMDkzNDI5Cit2IDAuNjA1MzIxIDIuOTY4MjAwIDAuMDY4NDEyCit2IDAuNTk4MDQwIDIuOTY4MjAwIDAuMDUwNzYwCit2IDAuNTk4MDQwIDIuOTY4MjAwIDAuMDg2MTAzCit2IDAuNTgwMzU2IDIuOTY4MjAwIDAuMDkwOTI5Cit2IDAuNTY0NDY1IDIuOTY4MjAwIDAuMDg0MzM1Cit2IDAuNTU3ODYzIDIuOTY4MjAwIDAuMDY4NDEyCit2IDAuNTY0NDgzIDIuOTY4MjAwIDAuMDUyNTEwCit2IDAuNTgwMzY2IDIuOTY4MjAwIDAuMDQ1OTM0Cit2IDAuNTk2MjczIDIuOTY4MjAwIDAuMDUyNTI4Cit2IDAuNjAyODY2IDIuOTY4MjAwIDAuMDY4NDEyCit2IDAuNTk2MjczIDIuOTY4MjAwIDAuMDg0MzM1Cit2IDAuNTgwMzU2IDIuOTUxNjg5IDAuMTYzNjIzCit2IDAuNTgwMzY2IDIuOTQ4NTE2IC0wLjAxOTk1NgordiAwLjU4MDM2NiAyLjk2ODIwMCAwLjAxOTg0NAordiAwLjU4MDM1NiAyLjk2ODIwMCAwLjExMDQxMwordiAwLjU4MDM1NiAyLjk2ODIwMCAwLjEzNTgwNQordiAwLjU4MDM2NiAyLjk2NjIzMSAtMC4wMTk5NTYKK3YgMC41ODAzNTYgMi45NjgyMDAgMC4xMzA4NzgKK3YgMC41ODAzNTYgMi45Mzk4NzggMC4xNjM2MjMKK3YgMC41ODAzNTYgMi45MzIwMjggMC4xNjA5NTEKK3YgMC41ODAzNjYgMi45NjgyMDAgLTAuMDE3OTg4Cit2IDAuNTgwMzY2IDIuOTY4MjAwIC0wLjAxMjQ4MQordiAwLjU4MDM1NiAyLjk1MTIzMSAwLjA4NzkyMwordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU2MDg1MyAyLjk1MTIzMSAwLjA2ODM5OAordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU4MDM2NiAyLjk1MTIzMSAwLjA0ODkwNwordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU5OTg3NyAyLjk1MTIzMSAwLjA2ODM5OAordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU4MDM1NiAyLjk2NzQxMyAwLjA5MDA3NwordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU1ODcxNiAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU4MDM2NiAyLjk2NzQxMyAwLjA0Njc4NgordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjYwMjAxNCAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA4MzczMwordiAxLjI4MTUwMiAtMC4yNDE1NzQgMC4xMzU4MDYKK3YgMS4yNjQ5NjQgLTAuMjQxNTc0IDAuMTYzNjI0Cit2IDEuMjc5NTM0IC0wLjI0MTU3NCAtMC4wMTk5NTUKK3YgMS4yODE1MDIgLTAuMjQxNTc0IDAuMTMwODc5Cit2IDEuMjUzMTUzIC0wLjI0MTU3NCAwLjE2MzYyNAordiAxLjI0NTI4MCAtMC4yNDE1NzQgMC4xNjA5NTIKK3YgMS4yNjczNTYgLTAuMjQxNTc0IC0wLjAxOTk1NQordiAxLjI4MTUwMiAtMC4yNDE1NzQgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIC0wLjI0MTU3NCAtMC4wMTI0ODAKK3YgMS4yODE1MDIgLTAuMjQxNTc0IDAuMDE5ODQ4Cit2IDEuMjgxNTAyIC0wLjI0MTU3NCAwLjExMDQxNQordiAxLjI4MTUwMiAwLjY3NTg0OSAwLjA1NDkwOAordiAxLjI4MTUwMiAtMC4yMjg0MjMgMC4wNTQ5MDgKK3YgMS4yODE1MDIgMC42NzU4NTAgMC4wMTk4NDgKK3YgMS4yODE1MDIgMC42NzU4NTEgLTAuMDEyNDgwCit2IDEuMjgxNTAyIDAuNjc1ODUyIC0wLjAxNzk4NwordiAxLjI3OTUzNCAwLjY3NTg1MiAtMC4wMTk5NTUKK3YgMS4yODE1MDIgLTAuMjI4NDIzIDAuMDE5ODQ4Cit2IDEuMjgxNTAyIC0wLjIyODQyMyAtMC4wMTI0ODAKK3YgMS4yODE1MDIgLTAuMjI4NDI0IC0wLjAxNzk4NwordiAxLjI3OTUzNCAtMC4yMjg0MjQgLTAuMDE5OTczCit2IDEuMjgxNTAzIDEuNTA1MzEwIDAuMTM1ODA2Cit2IDEuMjc5NTM0IDEuNTA1MzEwIC0wLjAxOTk1NgordiAxLjI4MTUwMyAxLjUwNTMxMCAwLjEzMDg3OQordiAxLjI1MzE1NCAxLjUwNTMxMCAwLjE2MzYyMwordiAxLjI0NTI4MCAxLjUwNTMxMCAwLjE2MDk1MQordiAxLjI4MTUwMyAxLjUwNTMxMCAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS41MDUzMTAgLTAuMDEyNDgwCit2IDEuMjgxNTAzIDEuNTA1MzEwIDAuMDE5ODUwCit2IDEuMjgxNTAzIDEuNTA1MzEwIDAuMTEwNDE0Cit2IDEuMjY0OTY1IDEuNTA1MzEwIDAuMTYzNjIzCit2IDEuMjY3MzU3IDEuNTA1MzEwIC0wLjAxOTk1NgordiAxLjI4MTUwMyAxLjQ5NTU4MCAwLjA1NDc1NgordiAxLjI4MTUwMyAxLjA3NjI4MyAwLjA1NDc1NgordiAxLjI4MTUwMyAxLjQ5NTU4NyAwLjAxOTg1MAordiAxLjI4MTUwMyAxLjQ5NTU5MSAtMC4wMTI0ODAKK3YgMS4yODE1MDMgMS40OTU1OTIgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IDEuNDk1NTkyIC0wLjAxOTk1NgordiAxLjI4MTUwMyAxLjA3NjI4NCAwLjAxOTg0OAordiAxLjI4MTUwMyAxLjA3NjI4NCAtMC4wMTI0ODAKK3YgMS4yODE1MDMgMS4wNzYyODUgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IDEuMDc2Mjg1IC0wLjAxOTk1NgordiAxLjI2NzM1NiAwLjY3NTkwNiAtMC4wMTk5NTUKK3YgMS4yNjczNTMgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI2NzM2NCAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNjczNTcgMS40OTU2MDEgLTAuMDE5OTU2Cit2IDEuMjgxNTAzIDEuNDg1NDUxIDAuMTM1ODA2Cit2IDEuMjgxNTAzIDEuMDg3MTk4IDAuMTM1ODA2Cit2IDEuMjgxNTAzIDEuNDg1NDUxIDAuMTMwODc5Cit2IDEuMjgxNTAzIDEuMDg3MTk4IDAuMTMwODc5Cit2IDEuMjUzMTU0IDEuNDg1NDUxIDAuMTYzNjIzCit2IDEuMjUzMTU0IDEuMDg3MTk4IDAuMTYzNjI0Cit2IDEuMjQ1MjgwIDEuNDg1NDUxIDAuMTYwOTUxCit2IDEuMjQ1MjgwIDEuMDg3MTk4IDAuMTYwOTUyCit2IDEuMjgxNTAzIDEuNDg1NDUxIDAuMTEwNDE0Cit2IDEuMjgxNTAzIDEuMDg3MTk4IDAuMTEwNDE0Cit2IDEuMjY0OTY1IDEuMDg3MTk4IDAuMTYzNjI0Cit2IDEuMjY0OTY1IDEuNDg1NDUxIDAuMTYzNjIzCit2IDEuMjgwMDE3IDEuMDg3MjA1IDAuMDUyNTgwCit2IDEuMjgxNTAzIDEuNDg1NDM4IDAuMDU0NzU2Cit2IDEuMjY0OTY0IC0wLjIxODIyNSAwLjE2MzYyNAordiAxLjI2NDk2NSAwLjY2NjAyMSAwLjE2MzYyNAordiAxLjI4MTUwMiAwLjY2NjAyMSAwLjEzNTgwNgordiAxLjI4MTUwMiAtMC4yMTgyMjUgMC4xMzU4MDYKK3YgMS4yODE1MDIgMC42NjYwMjEgMC4xMzA4NzkKK3YgMS4yODE1MDIgLTAuMjE4MjI2IDAuMTMwODc5Cit2IDEuMjUzMTU0IDAuNjY2MDIxIDAuMTYzNjI0Cit2IDEuMjUzMTUzIC0wLjIxODIyNSAwLjE2MzYyNAordiAxLjI0NTI4MCAwLjY2NjAyMSAwLjE2MDk1MgordiAxLjI0NTI4MCAtMC4yMTgyMjUgMC4xNjA5NTIKK3YgMS4yODE1MDIgMC42NjYwMjEgMC4xMTA0MTQKK3YgMS4yODE1MDIgLTAuMjE4MjI2IDAuMTEwNDE1Cit2IDEuMjgwMDE3IC0wLjIxODE2NSAwLjA1MjYxMQordiAxLjI4MTUwMiAwLjY2NjAyMSAwLjA1NDkwOAordiAxLjI2NDk2NCAtMC4yNjc2MzYgMC4xNjM2MjQKK3YgMS4yNjczNTYgLTAuMjY3NjM3IC0wLjAxOTk1NQordiAxLjI4MTUwMiAtMC4yNjc2MzYgMC4xMzU4MDYKK3YgMS4yNzk1MzQgLTAuMjY3NjM3IC0wLjAxOTk1NQordiAxLjI4MTUwMiAtMC4yNjc2MzYgMC4xMzA4NzkKK3YgMS4yNTMxNTMgLTAuMjY3NjM2IDAuMTYzNjI0Cit2IDEuMjQ1MjgwIC0wLjI2NzYzNiAwLjE2MDk1MgordiAxLjI4MTUwMiAtMC4yNjc2MzcgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIC0wLjI2NzYzNiAtMC4wMTI0ODAKK3YgMS4yODE1MDIgLTAuMjY3NjM2IDAuMDY4NDEzCit2IDEuMjgxNTAyIC0wLjI2NzYzNiAwLjAxOTg0NwordiAxLjI4MTUwMiAtMC4yNjc2MzYgMC4xMTA0MTUKK3YgMS4yODE1MDMgMS41MjM4NTMgMC4xMzU4MDYKK3YgMS4yNzk1MzQgMS41MjM4NTMgLTAuMDE5OTU2Cit2IDEuMjgxNTAzIDEuNTIzODUzIDAuMTMwODc5Cit2IDEuMjUzMTU0IDEuNTIzODUzIDAuMTYzNjIzCit2IDEuMjQ1MjgwIDEuNTIzODUzIDAuMTYwOTUxCit2IDEuMjgxNTAzIDEuNTIzODUzIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjUyMzg1MyAtMC4wMTI0ODAKK3YgMS4yODE1MDMgMS41MjM4NTMgMC4wNjg0MTMKK3YgMS4yODE1MDMgMS41MjM4NTMgMC4wMTk4NTAKK3YgMS4yODE1MDMgMS41MjM4NTMgMC4xMTA0MTQKK3YgMS4yNjQ5NjUgMS41MjM4NTMgMC4xNjM2MjMKK3YgMS4yNjczNTcgMS41MjM4NTIgLTAuMDE5OTU2Cit2IC0xLjU3NjcxOCAwLjA3MjUxMCAwLjEzNTgwNQordiAtMS41NjAyNjEgMC4wNzI1MTEgMC4xNjM2MjMKK3YgLTEuNTc0NzQ5IDAuMDcyNTEwIC0wLjAxOTk1NgordiAtMS41NzY3MTggMC4wNzI1MTAgMC4xMzA4NzgKK3YgLTEuNTQ4NDUwIDAuMDcyNTExIDAuMTYzNjIzCit2IC0xLjU0MDU3NiAwLjA3MjUxMCAwLjE2MDk1MQordiAtMS41NTcwMzMgMC4wNzI1MTAgLTAuMDE5OTU2Cit2IC0xLjU3NjcxOCAwLjA3MjUxMCAtMC4wMTc5ODcKK3YgLTEuNTc2NzE4IDAuMDcyNTEwIC0wLjAxMjQ4MAordiAtMS41NzY3MTggMC4wNzI1MTAgMC4wNjg0MTMKK3YgLTEuNTc2NzE4IDAuMDcyNTEwIDAuMDE5ODQ4Cit2IC0xLjU3NjcxOCAwLjA3MjUxMCAwLjExMDQxNAordiAtMS41NjAyNjEgMS44MzI3OTEgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDEuMTkwODA2IDAuMTYzNjIzCit2IC0xLjU1NzAzMiAxLjgzMjc5MCAtMC4wMTk5NTcKK3YgLTEuNTU3MDMyIDEuMTkwODA2IC0wLjAxOTk1NwordiAtMS41NzY3MTcgMS4xOTA4MDYgMC4xMzU4MDUKK3YgLTEuNTc2NzE3IDEuODMyNzkxIDAuMTM1ODA1Cit2IC0xLjU3NDc0OSAxLjE5MDgwNiAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ5IDEuODMyNzkwIC0wLjAxOTk1NwordiAtMS41NzY3MTcgMS4xOTA4MDYgMC4xMzA4NzgKK3YgLTEuNTc2NzE3IDEuODMyNzkxIDAuMTMwODc4Cit2IC0xLjU0ODQ1MCAxLjE5MDgwNiAwLjE2MzYyMwordiAtMS41NDg0NTAgMS44MzI3OTEgMC4xNjM2MjIKK3YgLTEuNTQwNTc2IDEuMTkwODA2IDAuMTYwOTUxCit2IC0xLjU0MDU3NiAxLjgzMjc5MSAwLjE2MDk1MAordiAtMS41NzY3MTcgMS4xOTA4MDYgLTAuMDE3OTg4Cit2IC0xLjU3NjcxNyAxLjgzMjc5MCAtMC4wMTc5ODgKK3YgLTEuNTc2NzE3IDEuMTkwODA2IC0wLjAxMjQ4MQordiAtMS41NzY3MTcgMS44MzI3OTAgLTAuMDEyNDgxCit2IC0xLjU3NjcxNyAxLjE5MDgwNiAwLjA2ODQxMgordiAtMS41NzY3MTcgMS44MzI3OTAgMC4wNjg0MTIKK3YgLTEuNTc2NzE3IDEuMTkwODA2IDAuMDE5ODQ4Cit2IC0xLjU3NjcxNyAxLjgzMjc5MCAwLjAxOTg1MAordiAtMS41NzY3MTcgMS4xOTA4MDYgMC4xMTA0MTMKK3YgLTEuNTc2NzE3IDEuODMyNzkxIDAuMTEwNDEzCit2IC0xLjU2MDI2MSAxLjIyMzk4OSAwLjE2MzYyMwordiAtMS41NzY3MTcgMS4yMjM5ODkgMC4xMzU4MDUKK3YgLTEuNTc2NzE3IDEuMjIzOTg5IDAuMTMwODc4Cit2IC0xLjU0ODQ1MCAxLjIyMzk4OSAwLjE2MzYyMwordiAtMS41NDA1NzYgMS4yMjM5ODkgMC4xNjA5NTEKK3YgLTEuNTc2NzE3IDEuMjIzOTg5IDAuMDY4NDEyCit2IC0xLjU3NjcxNyAxLjIyMzk4OSAwLjExMDQxMwordiAtMS41NzQ3NDkgMS4yMjQwMjYgLTAuMDE5OTU2Cit2IC0xLjU3NjcxNyAxLjIyNDAyNyAtMC4wMTc5ODgKK3YgLTEuNTc2NzE3IDEuMjI0MDI3IC0wLjAxMjQ4MQordiAtMS41NzY3MTcgMS4yMjM5ODkgMC4wNjI5ODUKK3YgLTEuNTc2NzE3IDEuNzk0NjYwIDAuMDYyOTI1Cit2IC0xLjU3NjcxNyAxLjc5NDY2MCAtMC4wMTI0ODEKK3YgLTEuNTc2NzE3IDEuNzk0NjQ2IC0wLjAxNzk4OAordiAtMS41NzQ3NDkgMS43OTQ2NDggLTAuMDE5OTU3Cit2IC0xLjU3NjcxNyAxLjIyNzIwNiAwLjA1OTc4OQordiAtMS41NzY3MTcgMS43OTEzNTAgMC4wNTk3OTMKK3YgLTEuNTc2NzE3IDEuNzkxMzMyIC0wLjAxNzk4OAordiAtMS41NzQ3NDkgMS43OTEzNDggLTAuMDE5OTU3Cit2IC0xLjU3NjcxNyAxLjIyNzIxOSAtMC4wMTI0ODEKK3YgLTEuNTc2NzE3IDEuMjI3MjE2IC0wLjAxNzk4OAordiAtMS41NzQ3NDkgMS4yMjcyMTQgLTAuMDE5OTU2Cit2IC0xLjU1NzAzMiAxLjIyNDAyNSAtMC4wMTk5NTYKK3YgLTEuNTU3MDMyIDEuMjI3MjE1IC0wLjAxOTk1NgordiAtMS41NTcwMjcgMS43OTAzNTcgLTAuMDE5OTQzCit2IC0xLjU1NzAzMiAxLjc5NDY0OCAtMC4wMTk5NTcKK3YgLTEuNTU3MDE5IDEuMjI4MDQ0IDAuMDU4OTc2Cit2IC0xLjU1NzAxOSAxLjc5MDM1OSAwLjA1ODk4NgordiAtMS41NTcwMTkgMS43OTAzNTcgLTAuMDE3OTg4Cit2IC0xLjU1NzAxOSAxLjIyODA0NCAtMC4wMTI0ODEKK3YgLTEuNTU3MDE5IDEuMjI4MDU0IC0wLjAxNzk4OAordiAxLjI2NzM1NCAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI2NzM1NCAxLjA3OTI0MSAwLjA1MjU4MAordiAxLjI2NzM1MyAxLjQ5MzQ2MCAwLjAxOTg1MAordiAxLjI2NzM1NCAxLjQ5MzQ2MSAtMC4wMTI0ODAKK3YgMS4yNjczNTQgMS40OTM0NjEgLTAuMDE3OTg3Cit2IDEuMjY3MzU0IDEuMDc5MjQzIDAuMDE5ODQ4Cit2IDEuMjY3MzU0IDEuMDc5MjQ0IC0wLjAxMjQ4MAordiAxLjI2NzM1NCAxLjA3OTI0NCAtMC4wMTc5ODcKK3YgMS4yNjczNTQgMS4wODcyMDUgMC4wNTI1ODAKK3YgMS4yNjczNTQgMS40ODU0MzUgMC4wNTI1NzYKK3YgMS4yNjczNTAgMC42NzM1NzYgMC4wNTI2MTEKK3YgMS4yNjczNDkgLTAuMjI2MTY3IDAuMDUyNjExCit2IDEuMjY3MzQ5IDAuNjczNTk1IDAuMDE5ODQ4Cit2IDEuMjY3MzUwIDAuNjczNTgxIC0wLjAxMjQ4MAordiAxLjI2NzM1MCAwLjY3MzU4MiAtMC4wMTc5ODcKK3YgMS4yNjczNDkgLTAuMjI2MTcxIDAuMDE5ODQ4Cit2IDEuMjY3MzQ5IC0wLjIyNjE3MCAtMC4wMTI0ODAKK3YgMS4yNjczNDkgLTAuMjI2MTcwIC0wLjAxNzk4NwordiAxLjI2NzM0OSAtMC4yMTgxNjUgMC4wNTI2MTEKK3YgMS4yNjczNTAgMC42NjYwMTcgMC4wNTI2MTEKK3YgMS4yODAwMTcgMC42NzM1NzYgMC4wNTI2MTEKK3YgMS4yODAwMTcgLTAuMjI2MTY3IDAuMDUyNjExCit2IDEuMjgwMDE3IDAuNjczNTgwIDAuMDE5ODQ4Cit2IDEuMjgwMDE3IDAuNjczNTgxIC0wLjAxMjQ4MAordiAxLjI4MDAxNyAwLjY3MzU4MiAtMC4wMTc5ODcKK3YgMS4yNzg1MTUgMC42NzM1ODIgLTAuMDE5OTU4Cit2IDEuMjgwMDE3IC0wLjIyNjE3MSAwLjAxOTg0OAordiAxLjI4MDAxNyAtMC4yMjYxNzAgLTAuMDEyNDgwCit2IDEuMjgwMDE3IC0wLjIyNjE3MCAtMC4wMTc5ODcKK3YgMS4yNzg1MTUgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI2NzM1NCAwLjY3MzU4MiAtMC4wMTk5NTgKK3YgMS4yNjczNTYgLTAuMjI4NDIzIC0wLjAxOTk3MwordiAxLjI4MTUwMiAtMC4yMTgxNzAgMC4wNTQ5MDgKK3YgMS4yODAwMTcgMC42NjYwMTcgMC4wNTI2MTEKK3YgMS4yODAwMTcgMS40OTM0NTggMC4wNTI1NzYKK3YgMS4yODAwMTcgMS4wNzkyNDIgMC4wNTI1ODAKK3YgMS4yODAwMTcgMS40OTM0NjAgMC4wMTk4NTAKK3YgMS4yODAwMTcgMS40OTM0NjEgLTAuMDEyNDgwCit2IDEuMjgwMDE3IDEuNDkzNDYxIC0wLjAxNzk4NwordiAxLjI3ODUxNCAxLjQ5MzQ2MSAtMC4wMTk5NTUKK3YgMS4yODAwMTcgMS4wNzkyNDMgMC4wMTk4NDgKK3YgMS4yODAwMTcgMS4wNzkyNDQgLTAuMDEyNDgwCit2IDEuMjgwMDE3IDEuMDc5MjQ0IC0wLjAxNzk4NwordiAxLjI3ODUxNCAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNjczNzAgMS4wNzYyODQgLTAuMDE5OTU2Cit2IDEuMjY3MzU1IDEuNDkzNDYyIC0wLjAxOTk1NgordiAxLjI4MTUwMyAxLjA4NzIwNCAwLjA1NDc1NgordiAxLjI4MDAxNyAxLjQ4NTQzNSAwLjA1MjU3NgordiAtMS41NzU5MzAgMS4yMjgwNDQgMC4wNTg5NzYKK3YgLTEuNTc1ODYwIDEuNzkwMzU5IDAuMDU4OTg2Cit2IC0xLjU3NTg1NSAxLjc5MDM1NyAtMC4wMTc5ODgKK3YgLTEuNTc0NzYwIDEuNzkwMzU3IC0wLjAxOTk1OQordiAtMS41NzU5MzAgMS4yMjgwNDQgLTAuMDEyNDgxCit2IC0xLjU3NTgxMCAxLjIyODA1NCAtMC4wMTc5ODgKK3YgLTEuNTc0NDAwIDEuMjI4MDUxIC0wLjAxOTk2NQordiAtMS41NTcwMjggMS4yMjgwNDggLTAuMDE5OTY2Cit2IC0xLjU1NzAzMiAxLjc5MTMzMSAtMC4wMTk5NTcKK3YgMS4yNzk1MzMgLTIuNDY2NjY3IC0wLjAxOTk1NAordiAtMS4yMjIyNjIgLTIuODE2NDA5IC0wLjAxOTk1NQordiAtMS4wNDIzNDUgLTIuODE5MTgzIC0wLjAxNzk4NgordiAxLjI4MTUwMiAtMi40NjY2NjggMC4xMzU4MDcKK3YgMS4yNTM3ODUgLTIuNjA0MDU5IDAuMTM1ODA3Cit2IDEuMTc4NTE4IC0yLjcxNjM2MiAwLjEzNTgwNwordiAxLjA2NTM4MSAtMi43OTIxOTYgMC4xMzU4MDcKK3YgMC45MzUzMDQgLTIuODE5MTg0IDAuMTM1ODA3Cit2IC0xLjIyMjMwMyAtMi44MTkxODQgMC4xMzU4MDcKK3YgLTEuMzYxMDA3IC0yLjc5MjIwMiAwLjEzNTgwNgordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMTM1ODA2Cit2IC0xLjU0OTAxNCAtMi42MDM5NDcgMC4xMzU4MDYKK3YgLTEuNTc2NzE4IC0yLjQ2NjYyOSAwLjEzNTgwNgordiAtMS4wNDIzNDUgLTIuODE5MTg0IDAuMTM1ODA3Cit2IDAuNzQ3MTA4IC0yLjgxOTE4NCAwLjEzNTgwNwordiAxLjI2NDk2NCAtMi40NjY2NTUgMC4xNjM2MjUKK3YgMS4yMzg5MDAgLTIuNTk3NjQxIDAuMTYzNjI1Cit2IDEuMTY3MzQyIC0yLjcwNDk4MyAwLjE2MzYyNQordiAxLjA1OTE5NCAtMi43NzczNjQgMC4xNjM2MjUKK3YgMC45MzMwMDMgLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNzQ3MTA4IC0yLjgwMjY4MyAwLjE2MzYyNQordiAtMS4wNDIzNDUgLTIuODAyNjgyIDAuMTYzNjI0Cit2IC0xLjIyMDY5NyAtMi44MDI2ODIgMC4xNjM2MjQKK3YgLTEuMzU0NDc0IC0yLjc3NzUwNSAwLjE2MzYyNAordiAtMS40NjE2NjkgLTIuNzA0Nzc3IDAuMTYzNjI0Cit2IC0xLjUzNDIzMSAtMi41OTY5OTQgMC4xNjM2MjQKK3YgLTEuNTYwMjYyIC0yLjQ2NjYyOSAwLjE2MzYyNAordiAxLjI1MTkzMyAtMi42MDMyMDggLTAuMDE5OTU0Cit2IDEuMTc3MTAwIC0yLjcxNDc3MCAtMC4wMTk5NTQKK3YgMS4wNjQ2MDYgLTIuNzkwMzQyIC0wLjAxOTk1NAordiAwLjkzNTE4MyAtMi44MTY0MTAgLTAuMDE5OTU0Cit2IC0xLjM2MDIzMSAtMi43OTAzNTIgLTAuMDE5OTU1Cit2IC0xLjQ3MTY2NSAtMi43MTQ1NTcgLTAuMDE5OTU1Cit2IC0xLjU0NzE2MiAtMi42MDMwOTQgLTAuMDE5OTU1Cit2IC0xLjU3NDc1MCAtMi40NjY2MjkgLTAuMDE5OTU1Cit2IDEuMjgxNTAyIC0yLjQ2NjY2OCAwLjEzMDg4MAordiAxLjI1Mzc4NSAtMi42MDQwNTkgMC4xMzA4ODAKK3YgMS4xNzg1MTggLTIuNzE2MzYyIDAuMTMwODgwCit2IDEuMDY1MzgxIC0yLjc5MjE5NiAwLjEzMDg4MAordiAwLjkzNTMwNCAtMi44MTkxODQgMC4xMzA4ODAKK3YgLTEuMjIyMzAzIC0yLjgxOTE4NCAwLjEzMDg3OQordiAtMS4zNjEwMDcgLTIuNzkyMjAyIDAuMTMwODc5Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4xMzA4NzkKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAwLjEzMDg3OQordiAtMS41NzY3MTggLTIuNDY2NjI5IDAuMTMwODc5Cit2IC0xLjA0MjM0NSAtMi44MTkxODQgMC4xMzA4NzkKK3YgMC43NDcxMDggLTIuODE5MTg0IDAuMTMwODgwCit2IDEuMjUzMTUzIC0yLjQ2NjY1MSAwLjE2MzYyNQordiAxLjIyNzc5MCAtMi41OTI5NzMgMC4xNjM2MjUKK3YgMS4xNTg4MzQgLTIuNjk2NDc1IDAuMTYzNjI1Cit2IDEuMDU0NTgxIC0yLjc2NjE3OCAwLjE2MzYyNQordiAwLjkzMTA1MiAtMi43OTA4NzIgMC4xNjM2MjUKK3YgMC43NDcxMDggLTIuNzkwODcyIDAuMTYzNjI1Cit2IC0xLjA0MjM0NSAtMi43OTA4NzEgMC4xNjM2MjQKK3YgLTEuMjE5NDg0IC0yLjc5MDg3MSAwLjE2MzYyNAordiAtMS4zNDk4MjMgLTIuNzY2Mzk1IDAuMTYzNjI0Cit2IC0xLjQ1MzE2MSAtMi42OTYyNjkgMC4xNjM2MjQKK3YgLTEuNTIzMTIyIC0yLjU5MjM1OSAwLjE2MzYyNAordiAtMS41NDg0NTEgLTIuNDY2NjI5IDAuMTYzNjI0Cit2IDEuMjQ1Mjc5IC0yLjQ2NjY0OSAwLjE2MDk1MwordiAxLjIyMDM4NCAtMi41ODk4OTQgMC4xNjA5NTMKK3YgMS4xNTMxNjIgLTIuNjkwODAzIDAuMTYwOTUzCit2IDEuMDUxNDgxIC0yLjc1ODc3MSAwLjE2MDk1MwordiAwLjkyOTg5MyAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC43NDcxMDggLTIuNzgyOTk3IDAuMTYwOTUzCit2IC0xLjA0MjM0NSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTEuMjE4NzE5IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMS4zNDY3MjMgLTIuNzU4OTg5IDAuMTYwOTUyCit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNjA5NTIKK3YgLTEuNTE1NzE1IC0yLjU4OTIzNyAwLjE2MDk1MgordiAtMS41NDA1NzcgLTIuNDY2NjI5IDAuMTYwOTUyCit2IC0xLjU1NzAzMyAtMi40NjY2MjkgLTAuMDE5OTU1Cit2IC0xLjUzMDQ5NyAtMi41OTU3MzIgLTAuMDE5OTU1Cit2IC0xLjQ1ODkwMyAtMi43MDIxMDQgLTAuMDE5OTU1Cit2IC0xLjM1Mjk2MyAtMi43NzQ0NTIgLTAuMDE5OTU1Cit2IC0xLjIyMDU4MyAtMi43OTQ1ODAgLTAuMDE5OTU1Cit2IC0xLjA0MjM0NSAtMi43OTQ1ODAgLTAuMDE5OTU1Cit2IDAuOTMxNjY0IC0yLjc5NDU4MCAtMC4wMTk5NTQKK3YgMS4wNTc2MzAgLTIuNzc2NDk4IC0wLjAxOTk1NAordiAxLjE2NDMzOSAtMi43MDIwNDIgLTAuMDE5OTU0Cit2IDEuMjM1MjY5IC0yLjU5NjIyMSAtMC4wMTk5NTQKK3YgMS4yNjczNTUgLTIuNDY2NjYyIC0wLjAxOTk1NAordiAxLjI4MTUwMiAtMi40NjY2NjggLTAuMDE3OTg2Cit2IC0xLjIyMjMwMyAtMi44MTkxODMgLTAuMDE3OTg2Cit2IC0xLjA0MjM0NSAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IDEuMjUzNzg1IC0yLjYwNDA1OSAtMC4wMTc5ODUKK3YgMS4xNzg1MTkgLTIuNzE2MzYyIC0wLjAxNzk4NgordiAxLjA2NTM4MSAtMi43OTIxOTYgLTAuMDE3OTg2Cit2IDAuOTM1MzA1IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMzYxMDA3IC0yLjc5MjIwMiAtMC4wMTc5ODYKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAtMC4wMTc5ODYKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAtMC4wMTc5ODcKK3YgLTEuNTc2NzE4IC0yLjQ2NjYyOSAtMC4wMTc5ODcKK3YgMS4yODE1MDIgLTIuNDY2NjY4IC0wLjAxMjQ3OQordiAxLjI1Mzc4NSAtMi42MDQwNTkgLTAuMDEyNDc5Cit2IDEuMTc4NTE5IC0yLjcxNjM2MiAtMC4wMTI0NzkKK3YgMS4wNjUzODEgLTIuNzkyMTk2IC0wLjAxMjQ3OQordiAwLjkzNTMwNSAtMi44MTkxODMgLTAuMDEyNDc5Cit2IC0xLjIyMjMwMyAtMi44MTkxODMgLTAuMDEyNDc5Cit2IC0xLjM2MTAwNyAtMi43OTIyMDIgLTAuMDEyNDc5Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgLTAuMDEyNDgwCit2IC0xLjU0OTAxNCAtMi42MDM5NDcgLTAuMDEyNDgwCit2IC0xLjU3NjcxOCAtMi40NjY2MjkgLTAuMDEyNDgwCit2IC0xLjA0MjM0NSAtMi44MTkxODMgLTAuMDEyNDc5Cit2IDEuMjgxNTAyIC0yLjQ2NjY2OCAwLjA2ODQxNAordiAxLjI1Mzc4NSAtMi42MDQwNTkgMC4wNjg0MTQKK3YgMS4xNzg1MTggLTIuNzE2MzYyIDAuMDY4NDE0Cit2IDEuMDY1MzgxIC0yLjc5MjE5NiAwLjA2ODQxNAordiAwLjkzNTMwNCAtMi44MTkxODQgMC4wNjg0MTQKK3YgLTEuMjIyMzAzIC0yLjgxOTE4NCAwLjA2ODQxNAordiAtMS4zNjEwMDcgLTIuNzkyMjAyIDAuMDY4NDE0Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4wNjg0MTMKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAwLjA2ODQxMwordiAtMS41NzY3MTggLTIuNDY2NjI5IDAuMDY4NDEzCit2IC0xLjA0MjM0NSAtMi44MTkxODQgMC4wNjg0MTQKK3YgMS4yODE1MDIgLTIuNDY2NjY4IDAuMDE5ODQ3Cit2IDEuMjUzNzg1IC0yLjYwNDA1OSAwLjAxOTg0NwordiAxLjE3ODUxOSAtMi43MTYzNjIgMC4wMTk4NDcKK3YgMS4wNjUzODEgLTIuNzkyMTk2IDAuMDE5ODQ2Cit2IDAuOTM1MzA1IC0yLjgxOTE4NCAwLjAxOTg0NgordiAtMS4yMjIzMDMgLTIuODE5MTg0IDAuMDE5ODQ2Cit2IC0xLjM2MTAwNyAtMi43OTIyMDIgMC4wMTk4NDcKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAwLjAxOTg0NwordiAtMS41NDkwMTMgLTIuNjAzOTQ3IDAuMDE5ODQ3Cit2IC0xLjU3NjcxOCAtMi40NjY2MjkgMC4wMTk4NDcKK3YgLTEuMDQyMzQ1IC0yLjgxOTE4NCAwLjAxOTg0NgordiAwLjYzMzA5NiAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC42MzMwOTYgLTIuNzk0NTgwIC0wLjAxOTk1NAordiAwLjYzMzA5NiAtMi44MTkxODQgMC4xMzU4MDcKK3YgMC42MzMwOTYgLTIuODE2NDEwIC0wLjAxOTk1NAordiAwLjYzMzA5NiAtMi44MTkxODQgMC4xMzA4ODAKK3YgMC42MzMwOTYgLTIuNzkwODcyIDAuMTYzNjI1Cit2IDAuNjMzMDk2IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjYzMzA5NiAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNjMzMDk2IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC42MzMwOTYgLTIuODE5MTg0IDAuMDY4NDE0Cit2IDAuNjMzMDk2IC0yLjgxOTE4NCAwLjAxOTg0NwordiAwLjc0NzA4NiAtMi44MTkxODQgMC4wNjU3MjgKK3YgMC42NjEyNjggLTIuODE5MTgzIC0wLjAxMjQ3OQordiAwLjY2MDUwNiAtMi44MTkxODMgLTAuMDE3OTk0Cit2IDAuNjYwMzgyIC0yLjgxNjQxMCAtMC4wMTk5NTQKK3YgMC44MzQzNzIgLTIuODE5MTgzIC0wLjAxMjQ3OQordiAwLjgzNjE4OSAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuODM2MzQ2IC0yLjgxNjQxMCAtMC4wMTk5NTQKK3YgMC44Mjk3NzcgLTIuODE2NDEwIC0wLjAxOTk1NAordiAwLjgyOTIyMSAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuODI3Njg1IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC43NDcwODYgLTIuODE5MTg0IDAuMDYxMTQ0Cit2IDAuNjY3OTk3IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC42NjYzOTIgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjY2NTg4NiAtMi44MTY0MTAgLTAuMDE5OTU0Cit2IDAuODM2MzUzIC0yLjc5NDY1MCAtMC4wMTk5NTQKK3YgMC44Mjg2OTcgLTIuNzk0NjUwIC0wLjAxOTYyOAordiAwLjY2NTg4NiAtMi43OTQ2NTAgLTAuMDE5OTU0Cit2IDAuNjYxMTk0IC0yLjc5NDY1MCAtMC4wMTk5NTQKK3YgMS4yODE1MDIgLTIuNDY2NjY4IDAuMTEwNDE2Cit2IDEuMjUzNzg1IC0yLjYwNDA1OSAwLjExMDQxNgordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4xMTA0MTYKK3YgMS4wNjUzODEgLTIuNzkyMTk2IDAuMTEwNDE2Cit2IDAuOTM1MzA0IC0yLjgxOTE4NCAwLjExMDQxNgordiAtMS4yMjIzMDMgLTIuODE5MTg0IDAuMTEwNDE1Cit2IC0xLjM2MTAwNyAtMi43OTIyMDIgMC4xMTA0MTUKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAwLjExMDQxNQordiAtMS41NDkwMTQgLTIuNjAzOTQ3IDAuMTEwNDE1Cit2IC0xLjU3NjcxOCAtMi40NjY2MjkgMC4xMTA0MTUKK3YgLTEuMDQyMzQ1IC0yLjgxOTE4NCAwLjExMDQxNQordiAwLjYzMzA5NiAtMi44MTkxODQgMC4xMTA0MTYKK3YgMC43NDcxMDggLTIuODE5MTg0IDAuMTEwNDE2Cit2IDAuODI4MjcxIC0yLjc5NDY1MCAtMC4wMTc5ODYKK3YgMC44MjY4MTYgLTIuNzk0NjUwIC0wLjAxMjQ3OQordiAwLjc0NzA4NSAtMi43OTQ2NTAgMC4wNjAyOTAKK3YgMC42Njg4NTIgLTIuNzk0NjUwIC0wLjAxMjQ3OQordiAwLjY2NzM2MSAtMi43OTQ2NTAgLTAuMDE3OTg2Cit2IDAuODI4Njk2IC0yLjgxNjA2NSAtMC4wMTk2MjgKK3YgMC44MjgyNzIgLTIuODE4MzkzIC0wLjAxNzk4NgordiAwLjgyNjgxNyAtMi44MTgzOTcgLTAuMDEyNDc5Cit2IDAuNzQ3MDg2IC0yLjgxODM5NyAwLjA2MDI5MAordiAwLjY2ODg1MSAtMi44MTgzOTcgLTAuMDEyNDc5Cit2IDAuNjY3MzQ0IC0yLjgxODM5MyAtMC4wMTc5ODYKK3YgMC42NjY5MjQgLTIuODE2MDY0IC0wLjAxOTYyOAordiAwLjgyOTc5NCAtMi43OTQ2NTAgLTAuMDE5OTU0Cit2IDAuNjY2OTM4IC0yLjc5NDY1MCAtMC4wMTk2MjgKK3YgMC4xNDAyMzIgLTIuODE5MTg0IDAuMTM1ODA2Cit2IDAuMTQwMjMyIC0yLjgwMjY4MyAwLjE2MzYyNAordiAwLjE0MDIzMiAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IDAuMTQwMjMyIC0yLjgxOTE4NCAwLjEzMDg3OQordiAwLjE0MDIzMiAtMi43OTA4NzIgMC4xNjM2MjQKK3YgMC4xNDAyMzIgLTIuNzgyOTk3IDAuMTYwOTUyCit2IDAuMTQwMjMyIC0yLjc5NDU4MCAtMC4wMTk5NTUKK3YgMC4xNDAyMzIgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjE0MDIzMiAtMi44MTkxODMgLTAuMDEyNDgwCit2IDAuMTQwMjMyIC0yLjgxOTE4NCAwLjA2ODQxMwordiAwLjE0MDIzMiAtMi44MTkxODQgMC4wMTk4NDgKK3YgMC4xNDAyMzIgLTIuODE5MTg0IDAuMTEwNDE0Cit2IDAuMDM5NzkyIC0yLjgxNjQwOSAtMC4wMTk5NTUKK3YgMC4wNDA3NjYgLTIuODE5MTgzIC0wLjAxNzk3NAordiAwLjA0NDAxMyAtMi44MTkxODMgLTAuMDEyNDgwCit2IDAuMDQ5NDY3IC0yLjgxOTE4NCAwLjAxOTg0OAordiAtMC4wMTM1NzAgLTIuODE5MTg0IDAuMDg4MjQ4Cit2IC0wLjAxMzU2OSAtMi44MTkxODQgMC4wODA0MDEKK3YgMC4wNDIyNTEgLTIuODE5MTg0IDAuMDE5ODQ4Cit2IDAuMDM2OTgxIC0yLjgxOTE4MyAtMC4wMTI0ODAKK3YgMC4wMzMyOTEgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjAzMjE0MSAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IDAuMDMyMTQwIC0yLjc5NDU4MCAtMC4wMTk5NTUKK3YgMC4wMzk3NTIgLTIuNzk0NTgwIC0wLjAxOTk1NQordiAtMC4wMTM1NjYgLTIuODE5MTg0IDAuMTM1ODA2Cit2IC0wLjAxMzU2NiAtMi44MTkxODQgMC4xMzA4NzkKK3YgLTAuMDEzNTY2IC0yLjc5MDg3MiAwLjE2MzYyNAordiAtMC4wMTM1NjYgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjAxMzU2NiAtMi44MDI2ODMgMC4xNjM2MjQKK3YgLTAuMDEzNTY2IC0yLjgxOTE4NCAwLjExMDQxNAordiAtMC4wMTM1NjkgLTIuNzUxMzUzIDAuMDc5NjIyCit2IDAuMDQxNDA0IC0yLjc1MTM1MyAwLjAxOTg0OAordiAwLjAzNjEzNCAtMi43NTEzNTMgLTAuMDEyNDgwCit2IDAuMDMyMzgyIC0yLjc1MTM1MyAtMC4wMTc5ODcKK3YgLTAuMDEzNTY5IC0yLjgxODM5NyAwLjA3OTYyMgordiAwLjA0MTQwNCAtMi44MTgzOTcgMC4wMTk4NDgKK3YgMC4wMzYxMzQgLTIuODE4Mzk3IC0wLjAxMjQ4MAordiAwLjAzMjM4MiAtMi44MTgzOTAgLTAuMDE3OTg3Cit2IDAuMDMxODY2IC0yLjgxNjA2NiAtMC4wMTk1NjUKK3YgMC4wMzE4NDMgLTIuNzUxMzUzIC0wLjAxOTU2NwordiAwLjAxOTkwOCAtMi44MTkxODQgMC4wNzg0NDIKK3YgMC4wMTYyNTIgLTIuODE5MTg0IDAuMDcxNjA5Cit2IDAuMDE1ODAwIC0yLjc1MTM1MyAwLjA3MDgzMQordiAwLjAxNTgwMCAtMi44MTgzOTcgMC4wNzA4MzEKK3YgMC4wNDIyMzAgLTIuODE5MTg0IDAuMDU0NDAyCit2IDAuMDM1NTA4IC0yLjgxOTE4NCAwLjA1MTA3MwordiAwLjAzNDg0MyAtMi43NTEzNTMgMC4wNTA2MjAKK3YgMC4wMzQ4NDMgLTIuODE4Mzk3IDAuMDUwNjIwCit2IDAuMDI4ODU3IC0yLjgxOTE4NCAwLjEzNTgwNgordiAwLjAyODg1NyAtMi44MTkxODQgMC4xMzA4NzkKK3YgMC4wMjg4NTcgLTIuNzkwODcyIDAuMTYzNjI0Cit2IDAuMDI4ODU3IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAwLjAyODg1NyAtMi44MDI2ODMgMC4xNjM2MjQKK3YgMC4wMjg4NTcgLTIuODE5MTg0IDAuMTEwNDE0Cit2IC0wLjQzNTA3NCAtMi44MTkxODQgMC4xMzU4MDYKK3YgLTAuNDM1MDc0IC0yLjgwMjY4MiAwLjE2MzYyNAordiAtMC40MzUwNzQgLTIuODE2NDA5IC0wLjAxOTk1NgordiAtMC40MzUwNzQgLTIuODE5MTg0IDAuMTMwODc5Cit2IC0wLjQzNTA3NCAtMi43OTA4NzEgMC4xNjM2MjQKK3YgLTAuNDM1MDc0IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC40MzUwNzQgLTIuNzk0NTgwIC0wLjAxOTk1NQordiAtMC40MzUwNzQgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC40MzUwNzQgLTIuODE5MTgzIC0wLjAxMjQ4MAordiAtMC40MzUwNzQgLTIuODE5MTg0IDAuMDY4NDEzCit2IC0wLjQzNTA3NCAtMi44MTkxODQgMC4wMTk4NDYKK3YgLTAuNDM1MDc0IC0yLjgxOTE4NCAwLjExMDQxNAordiAtMC4zMzU1MTIgLTIuODE2NDA5IC0wLjAxOTk1NQordiAtMC4zMzY2ODAgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4zMzk3MTggLTIuODE5MTgzIC0wLjAxMjQ4MAordiAtMC4zNDU0NDQgLTIuODE5MTg0IDAuMDE5ODQ3Cit2IC0wLjI4MTM0NCAtMi44MTkxODQgMC4wODgyNDgKK3YgLTAuMjgxMzQ1IC0yLjgxOTE4NCAwLjA4MDQwMQordiAtMC4zMzc0NDYgLTIuODE5MTg0IDAuMDE5ODQ3Cit2IC0wLjMzMjA5MyAtMi44MTkxODMgLTAuMDEyNDgwCit2IC0wLjMyODU3NSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IC0wLjMyNzQwMCAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IC0wLjMyNzM5OSAtMi43NTEzNTMgLTAuMDE5OTU1Cit2IC0wLjMzNTQ3MiAtMi43OTQ1ODAgLTAuMDE5OTU2Cit2IC0wLjI4MTM0OSAtMi44MTkxODQgMC4xMzU4MDYKK3YgLTAuMjgxMzQ5IC0yLjgxOTE4NCAwLjEzMDg3OQordiAtMC4yODEzNDkgLTIuNzkwODcyIDAuMTYzNjI0Cit2IC0wLjI4MTM0OSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuMjgxMzQ5IC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC4yODEzNDkgLTIuODE5MTg0IDAuMTEwNTUyCit2IC0wLjI4MTM0NSAtMi43NTEzNTMgMC4wNzk2MjIKK3YgLTAuMzM2NTk4IC0yLjc1MTM1MyAwLjAxOTg0NgordiAtMC4zMzEyNDUgLTIuNzUxMzUzIC0wLjAxMjQ4MAordiAtMC4zMjc2MDkgLTIuNzUxMzUzIC0wLjAxNzk4NwordiAtMC4yODEzNDUgLTIuODE4Mzk3IDAuMDc5NjIyCit2IC0wLjMzNjU5OCAtMi44MTgzOTcgMC4wMTk4NDcKK3YgLTAuMzMxMjQ1IC0yLjgxODM5NyAtMC4wMTI0ODAKK3YgLTAuMzI3NjA5IC0yLjgxODM5MSAtMC4wMTc5ODcKK3YgLTAuMzI2Nzc0IC0yLjgxNjA2NiAtMC4wMTk1NTAKK3YgLTAuMzI2NzcxIC0yLjc1MTM1MyAtMC4wMTk1NTAKK3YgLTAuMzE2MzY1IC0yLjgxOTE4NCAwLjA3Nzg0NgordiAtMC4zMTEzOTQgLTIuODE5MTg0IDAuMDcxNjUwCit2IC0wLjMxMDk0MiAtMi43NTEzNTMgMC4wNzA4NzAKK3YgLTAuMzEwOTQyIC0yLjgxODM5NyAwLjA3MDg3MAordiAtMC4zMzgxNjQgLTIuODE5MTg0IDAuMDU0NzIxCit2IC0wLjMzMDc4NCAtMi44MTkxODQgMC4wNTA5MzQKK3YgLTAuMzMwMDQ2IC0yLjc1MTM1MyAwLjA1MDU5NwordiAtMC4zMzAwNDYgLTIuODE4Mzk3IDAuMDUwNTk3Cit2IC0wLjMyMTIwNyAtMi44MTkxODQgMC4xMzU4MDYKK3YgLTAuMzIxMjA3IC0yLjgxOTE4NCAwLjEzMDg3OQordiAtMC4zMjEyMDcgLTIuNzkwODcyIDAuMTYzNjI0Cit2IC0wLjMyMTIwNyAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuMzIxMjA3IC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC4zMjEyMDcgLTIuODE5MTg0IDAuMTEwNDE0Cit2IC0wLjE0NzYxMSAtMi43NTEzNTMgMC4wNzk2MjIKK3YgLTAuMTQ3NjExIC0yLjgxODM5NyAwLjA3OTYyMgordiAtMC4xNDc2MTEgLTIuODE5MTg0IDAuMDgwNDAxCit2IC0wLjE0NzYxMSAtMi44MTkxODQgMC4wODgyNDgKK3YgLTAuMTQ3NjExIC0yLjgxOTE4NCAwLjExMDQxNAordiAtMC4xNDc2MTEgLTIuODE5MTg0IDAuMTMwODc5Cit2IC0wLjE0NzYxMSAtMi44MTkxODQgMC4xMzU4MDYKK3YgLTAuMTQ3NjExIC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC4xNDc2MTEgLTIuNzkwODcyIDAuMTYzNjI0Cit2IC0wLjE0NzYxMSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTEuNDQ3NjExIDIuODM4NDc5IDAuMTU3MDkxCit2IC0xLjUxNTY1NiAyLjczNzQxNyAwLjE1NzA5MQordiAtMS41NDA1NzYgMi42MTQ4NDAgMC4xNTcwOTEKK3YgLTEuNTQwNTc2IDIuNDE2NTU1IDAuMTU3MDkxCit2IC0xLjU0MDU3NyAtMi4yNzE1MzQgMC4xNTcwOTMKK3YgMS4yNDUyNzkgLTIuMjcxNTM1IDAuMTU3MDk0Cit2IDEuMjQ1MjgwIDIuNDE2NTU0IDAuMTU3MDkyCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTU3MDkyCit2IDEuMjIwMzMwIDIuNzM3Mzk2IDAuMTU3MDkyCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTU3MDkyCit2IDEuMDUxNzYyIDIuOTA2MzA4IDAuMTU3MDkyCit2IDAuOTI5MjY3IDIuOTMyMDI4IDAuMTU3MDkyCit2IDAuNjMzMTExIDIuOTMyMDI4IDAuMTU3MDkyCit2IC0xLjA0MjM0MyAyLjkzMjAyOCAwLjE1NzA5MQordiAtMS4yMTk1NDggMi45MzIwMjIgMC4xNTcwOTEKK3YgLTEuMzQ3MDQ3IDIuOTA2NDM1IDAuMTU3MDkxCit2IC0wLjkyODA5OCAyLjkzMjAyOCAwLjE1NzA5MgordiAtMC45ODQzNDQgMi45MzIwMjggMC4xNTcwOTEKK3YgMC41MjI3MjcgMi45MzIwMjggMC4xNTcwOTIKK3YgMC41ODAzNTYgMi45MzIwMjggMC4xNTcwOTIKK3YgMS4yNDUyODAgLTAuMjQxNTc0IDAuMTU3MDkzCit2IDEuMjQ1MjgwIDEuNTA1MzEwIDAuMTU3MDkyCit2IDEuMjQ1MjgwIDEuNDg1NDUxIDAuMTU3MDkyCit2IDEuMjQ1MjgwIDEuMDg3MTk4IDAuMTU3MDkzCit2IDEuMjQ1MjgwIDAuNjY2MDIxIDAuMTU3MDkzCit2IDEuMjQ1MjgwIC0wLjIxODIyNSAwLjE1NzA5MwordiAxLjI0NTI4MCAtMC4yNjc2MzYgMC4xNTcwOTMKK3YgMS4yNDUyODAgMS41MjM4NTMgMC4xNTcwOTIKK3YgLTEuNTQwNTc2IDAuMDcyNTEwIDAuMTU3MDkyCit2IC0xLjU0MDU3NiAxLjE5MDgwNiAwLjE1NzA5MgordiAtMS41NDA1NzYgMS44MzI3OTEgMC4xNTcwOTEKK3YgLTEuNTQwNTc2IDEuMjIzOTg5IDAuMTU3MDkyCit2IDEuMjQ1Mjc5IC0yLjQ2NjY0OSAwLjE1NzA5NAordiAxLjIyMDM4NCAtMi41ODk4OTQgMC4xNTcwOTQKK3YgMS4xNTMwODMgLTIuNjkwODAzIDAuMTU3MDk0Cit2IDEuMDUxNDgxIC0yLjc1ODc3MSAwLjE1NzA5NAordiAwLjkyOTg5MyAtMi43ODI5OTcgMC4xNTcwOTQKK3YgMC43NDcxMDggLTIuNzgyOTk3IDAuMTU3MDk0Cit2IC0xLjA0MjM0NSAtMi43ODI5OTcgMC4xNTcwOTMKK3YgLTEuMjE4NzE5IC0yLjc4Mjk5NyAwLjE1NzA5MwordiAtMS4zNDY3MjMgLTIuNzU4OTg5IDAuMTU3MDkzCit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNTcwOTMKK3YgLTEuNTE1NzE1IC0yLjU4OTIzNyAwLjE1NzA5MwordiAtMS41NDA1NzcgLTIuNDY2NjI5IDAuMTU3MDkzCit2IDAuNjMzMDk2IC0yLjc4Mjk5NyAwLjE1NzA5NAordiAwLjE0MDIzMiAtMi43ODI5OTcgMC4xNTcwOTMKK3YgLTAuMDEzNTY2IC0yLjc4Mjk5NyAwLjE1NzA5MwordiAwLjAyODg1NyAtMi43ODI5OTcgMC4xNTcwOTMKK3YgLTAuNDM1MDc0IC0yLjc4Mjk5NyAwLjE1NzA5MwordiAtMC4yODEzNDkgLTIuNzgyOTk3IDAuMTU3MDkzCit2IC0wLjMyMTIwNyAtMi43ODI5OTcgMC4xNTcwOTMKK3YgLTAuMTQ3NjExIC0yLjc4Mjk5NyAwLjE1NzA5MwordiAtMS40NDc2MTEgMi44Mzg0NzkgMC4xNjAyNTYKK3YgLTEuNTE1NjU2IDIuNzM3NDE3IDAuMTYwMjU2Cit2IC0xLjU0MDU3NiAyLjYxNDg0MCAwLjE2MDI1NgordiAtMS41NDA1NzYgMi40MTY1NTUgMC4xNjAyNTYKK3YgLTEuNTQwNTc3IC0yLjI3MTUzNCAwLjE2MDI1NwordiAxLjI0NTI3OSAtMi4yNzE1MzUgMC4xNjAyNTgKK3YgMS4yNDUyODAgMi40MTY1NTQgMC4xNjAyNTcKK3YgMS4yNDUyODAgMi42MTQ5MDYgMC4xNjAyNTcKK3YgMS4yMjAzMzAgMi43MzczOTYgMC4xNjAyNTcKK3YgMS4xNTI1OTMgMi44MzgyOTEgMC4xNjAyNTYKK3YgMS4wNTE3NjIgMi45MDYzMDggMC4xNjAyNTYKK3YgMC45MjkyNjcgMi45MzIwMjggMC4xNjAyNTYKK3YgMC42MzMxMTEgMi45MzIwMjggMC4xNjAyNTYKK3YgLTEuMDQyMzQzIDIuOTMyMDI4IDAuMTYwMjU2Cit2IC0xLjIxOTU0OCAyLjkzMjAyMiAwLjE2MDI1NgordiAtMS4zNDcwNDcgMi45MDY0MzUgMC4xNjAyNTYKK3YgLTAuOTI4MDk4IDIuOTMyMDI4IDAuMTYwMjU2Cit2IC0wLjk4NDM0NCAyLjkzMjAyOCAwLjE2MDI1NgordiAwLjUyMjcyNyAyLjkzMjAyOCAwLjE2MDI1NgordiAwLjU4MDM1NiAyLjkzMjAyOCAwLjE2MDI1NgordiAxLjI0NTI4MCAtMC4yNDE1NzQgMC4xNjAyNTcKK3YgMS4yNDUyODAgMS41MDUzMTAgMC4xNjAyNTcKK3YgMS4yNDUyODAgMS40ODU0NTEgMC4xNjAyNTcKK3YgMS4yNDUyODAgMS4wODcxOTggMC4xNjAyNTcKK3YgMS4yNDUyODAgMC42NjYwMjEgMC4xNjAyNTcKK3YgMS4yNDUyODAgLTAuMjE4MjI1IDAuMTYwMjU3Cit2IDEuMjQ1MjgwIC0wLjI2NzYzNiAwLjE2MDI1NwordiAxLjI0NTI4MCAxLjUyMzg1MyAwLjE2MDI1NwordiAtMS41NDA1NzYgMC4wNzI1MTAgMC4xNjAyNTcKK3YgLTEuNTQwNTc2IDEuMTkwODA2IDAuMTYwMjU2Cit2IC0xLjU0MDU3NiAxLjgzMjc5MSAwLjE2MDI1NgordiAtMS41NDA1NzYgMS4yMjM5ODkgMC4xNjAyNTYKK3YgMS4yNDUyNzkgLTIuNDY2NjQ5IDAuMTYwMjU4Cit2IDEuMjIwMzg0IC0yLjU4OTg5NCAwLjE2MDI1OAordiAxLjE1MzA4MyAtMi42OTA4MDMgMC4xNjAyNTgKK3YgMS4wNTE0ODEgLTIuNzU4NzcxIDAuMTYwMjU4Cit2IDAuOTI5ODkzIC0yLjc4Mjk5NyAwLjE2MDI1OAordiAwLjc0NzEwOCAtMi43ODI5OTcgMC4xNjAyNTgKK3YgLTEuMDQyMzQ1IC0yLjc4Mjk5NyAwLjE2MDI1OAordiAtMS4yMTg3MTkgLTIuNzgyOTk3IDAuMTYwMjU4Cit2IC0xLjM0NjcyMyAtMi43NTg5ODkgMC4xNjAyNTgKK3YgLTEuNDQ3NDg5IC0yLjY5MDU5NyAwLjE2MDI1NwordiAtMS41MTU3MTUgLTIuNTg5MjM3IDAuMTYwMjU3Cit2IC0xLjU0MDU3NyAtMi40NjY2MjkgMC4xNjAyNTcKK3YgMC42MzMwOTYgLTIuNzgyOTk3IDAuMTYwMjU4Cit2IDAuMTQwMjMyIC0yLjc4Mjk5NyAwLjE2MDI1NwordiAtMC4wMTM1NjYgLTIuNzgyOTk3IDAuMTYwMjU3Cit2IDAuMDI4ODU3IC0yLjc4Mjk5NyAwLjE2MDI1NwordiAtMC40MzUwNzQgLTIuNzgyOTk3IDAuMTYwMjU3Cit2IC0wLjI4MTM0OSAtMi43ODI5OTcgMC4xNjAyNTcKK3YgLTAuMzIxMjA3IC0yLjc4Mjk5NyAwLjE2MDI1NwordiAtMC4xNDc2MTEgLTIuNzgyOTk3IDAuMTYwMjU3Cit2IC0xLjU3NjcxNyAxLjIyMzk5MCAwLjAxOTg0OAordiAtMS41NzY3MTcgMS4yMjcyMTcgMC4wMTk4NDgKK3YgLTEuNTU3MDE5IDEuMjI4MDQ0IDAuMDE5ODQ4Cit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjAxOTg0OAordiAtMS41NzY3MTcgMS43OTQ2NjAgMC4wMTk4NTAKK3YgLTEuNTc2NzE3IDEuNzkxMzQxIDAuMDE5ODUwCit2IC0xLjU1NzAxOSAxLjc5MDM1NyAwLjAxOTg1MAordiAtMS41NzU4NTggMS43OTAzNTcgMC4wMTk4NTAKK3YgLTEuNTc2NzE3IDEuNzkxMzMzIC0wLjAxMjQ3OAordiAtMS41NTcwMTkgMS43OTAzNTcgLTAuMDEyNDc4Cit2IC0xLjU3NTg1NiAxLjc5MDM1NyAtMC4wMTI0NzgKK3YgLTEuNTQwNTc2IDEuNDUzMDU2IDAuMTYwOTUxCit2IC0xLjU3NjcxNyAxLjQ1MzA1NiAwLjEzNTgwNQordiAtMS41NzY3MTcgMS40NTMwNTYgMC4xMzA4NzgKK3YgLTEuNTQ4NDUwIDEuNDUzMDU2IDAuMTYzNjIzCit2IC0xLjU3NjcxNyAxLjQ1MzA1NiAwLjA2ODQxMgordiAtMS41NzY3MTcgMS40NTMwNTYgMC4xMTA0MTMKK3YgLTEuNTc2NzE3IDEuNDUzMDU2IDAuMDYyOTg0Cit2IC0xLjU2MDI2MSAxLjQ1MzA1NiAwLjE2MzYyMwordiAtMS41NzY3MTcgMS40NTMwNTggMC4wNTk3NzYKK3YgLTEuNTU3MDE5IDEuNDUzMDU5IDAuMDU4OTc1Cit2IC0xLjU3NTkzMCAxLjQ1MzA1OSAwLjA1ODk3NQordiAtMS41NDA1NzYgMS40NTMwNTYgMC4xNTcwOTEKK3YgLTEuNTQwNTc2IDEuNDUzMDU2IDAuMTYwMjU2Cit2IC0xLjU2MDI2MSAxLjc3ODIwMCAwLjE2MzYyMgordiAtMS41NTcwMTkgMS43NzgxODIgMC4wNTg5ODQKK3YgLTEuNTc2NzE3IDEuNzc4MTgzIDAuMDU5Nzk1Cit2IC0xLjU3NTg2NyAxLjc3ODE4MiAwLjA1ODk4NQordiAtMS41NDA1NzYgMS43NzgyMDAgMC4xNjA5NTAKK3YgLTEuNTc2NzE3IDEuNzc4MjAwIDAuMTM1ODA1Cit2IC0xLjU3NjcxNyAxLjc3ODIwMCAwLjEzMDg3OAordiAtMS41NDg0NTAgMS43NzgyMDAgMC4xNjM2MjIKK3YgLTEuNTc2NzE3IDEuNzc4MjAwIDAuMDY4NDEyCit2IC0xLjU3NjcxNyAxLjc3ODIwMCAwLjExMDQxMwordiAtMS41NzY3MTcgMS43NzgxODMgMC4wNjI5MjgKK3YgLTEuNTQwNTc2IDEuNzc4MjAwIDAuMTU3MDkxCit2IC0xLjU0MDU3NiAxLjc3ODIwMCAwLjE2MDI1NgordiAtMS41NjAyNjEgMS44NjQzNTIgMC4xNjM2MjIKK3YgLTEuNTU3MDMyIDEuODY0MzUyIC0wLjAxOTk1NwordiAtMS41NzY3MTcgMS44NjQzNTIgMC4xMzU4MDUKK3YgLTEuNTc0NzQ5IDEuODY0MzUyIC0wLjAxOTk1NwordiAtMS41NzY3MTcgMS44NjQzNTIgMC4xMzA4NzgKK3YgLTEuNTQ4NDUwIDEuODY0MzUyIDAuMTYzNjIyCit2IC0xLjU0MDU3NiAxLjg2NDM1MiAwLjE2MDk1MAordiAtMS41NzY3MTcgMS44NjQzNTIgLTAuMDE3OTg4Cit2IC0xLjU3NjcxNyAxLjg2NDM1MiAtMC4wMTI0ODEKK3YgLTEuNTc2NzE3IDEuODY0MzUyIDAuMDY4NDEyCit2IC0xLjU3NjcxNyAxLjg2NDM1MiAwLjAxOTg1MAordiAtMS41NzY3MTcgMS44NjQzNTIgMC4xMTA0MTMKK3YgLTEuNTQwNTc2IDEuODY0MzUyIDAuMTU3MDkxCit2IC0xLjU0MDU3NiAxLjg2NDM1MiAwLjE2MDI1NgordiAtMS41NzY3MTcgMS43OTQ2NjAgMC4wNTY0MjcKK3YgLTEuNTc2NzE3IDEuNzkxMzUwIDAuMDU2NDI1Cit2IC0xLjU1NzAxOSAxLjc5MDM1OSAwLjA1NjQxOQordiAtMS41NzU4NjAgMS43OTAzNTkgMC4wNTY0MTkKK3YgLTEuNTYwMjYxIDEuNzg3NjczIDAuMTYzNjIyCit2IC0xLjU1NzAxOSAxLjc4NzY2NCAwLjA1ODk4NQordiAtMS41NzY3MTcgMS43ODc2NjQgMC4wNTk4MDIKK3YgLTEuNTc1ODY0IDEuNzg3NjY0IDAuMDU4OTg1Cit2IC0xLjU0MDU3NiAxLjc4NzY3MyAwLjE2MDk1MAordiAtMS41NzY3MTcgMS43ODc2NzMgMC4xMzU4MDUKK3YgLTEuNTc2NzE3IDEuNzg3NjczIDAuMTMwODc4Cit2IC0xLjU0ODQ1MCAxLjc4NzY3MyAwLjE2MzYyMgordiAtMS41NzY3MTcgMS43ODc2NzMgMC4wNjg0MTIKK3YgLTEuNTc2NzE3IDEuNzg3NjczIDAuMTEwNDEzCit2IC0xLjU3NjcxNyAxLjc4NzY2NiAwLjA2MjkyNAordiAtMS41NDA1NzYgMS43ODc2NzMgMC4xNTcwOTEKK3YgLTEuNTQwNTc2IDEuNzg3NjczIDAuMTYwMjU2Cit2IC0xLjU3NjcxNyAxLjgzMjc5MCAwLjA1NjQxNQordiAtMS41NDA1NzYgMS4yMzAwMDYgMC4xNjA5NTEKK3YgLTEuNTc2NzE3IDEuMjMwMDA2IDAuMTM1ODA1Cit2IC0xLjU3NjcxNyAxLjIzMDAwNiAwLjEzMDg3OAordiAtMS41NDg0NTAgMS4yMzAwMDYgMC4xNjM2MjMKK3YgLTEuNTc2NzE3IDEuMjMwMDA2IDAuMDY4NDEyCit2IC0xLjU3NjcxNyAxLjIzMDAwNiAwLjExMDQxMwordiAtMS41NzY3MTcgMS4yMzAwMDYgMC4wNjI5ODUKK3YgLTEuNTQwNTc2IDEuMjMwMDA2IDAuMTU3MDkyCit2IC0xLjU0MDU3NiAxLjIzMDAwNiAwLjE2MDI1NgordiAtMS41NjAyNjEgMS4yMzAwMDYgMC4xNjM2MjMKK3YgLTEuNTc2NzE3IDEuMjMzMTExIDAuMDU5Nzg4Cit2IC0xLjU1NzAxOSAxLjIzMzk1MCAwLjA1ODk3NgordiAtMS41NzU5MzAgMS4yMzM5NTAgMC4wNTg5NzYKK3YgLTEuNTc2NzE3IDEuMjI3MjEyIDAuMDUyNTY2Cit2IC0xLjU1NzAxOSAxLjIyODA0NCAwLjA1MTg5NQordiAtMS41NzU5MzAgMS4yMjgwNDQgMC4wNTE4OTUKK3YgLTEuNTc2NzE3IDEuMjIzOTg5IDAuMDUzNzM5Cit2IC0xLjU3NjcxNyAxLjE0OTQyMyAwLjEzNTgwNQordiAtMS41NzQ3NDkgMS4xNDk0MjMgLTAuMDE5OTU2Cit2IC0xLjU3NjcxNyAxLjE0OTQyMyAwLjEzMDg3OAordiAtMS41NDg0NTAgMS4xNDk0MjMgMC4xNjM2MjMKK3YgLTEuNTQwNTc2IDEuMTQ5NDIzIDAuMTYwOTUxCit2IC0xLjU3NjcxNyAxLjE0OTQyMyAtMC4wMTc5ODgKK3YgLTEuNTc2NzE3IDEuMTQ5NDIzIC0wLjAxMjQ4MQordiAtMS41NzY3MTcgMS4xNDk0MjMgMC4wNjg0MTIKK3YgLTEuNTc2NzE3IDEuMTQ5NDIzIDAuMDE5ODQ4Cit2IC0xLjU3NjcxNyAxLjE0OTQyMyAwLjExMDQxMwordiAtMS41NjAyNjEgMS4xNDk0MjMgMC4xNjM2MjMKK3YgLTEuNTU3MDMyIDEuMTQ5NDIzIC0wLjAxOTk1NgordiAtMS41NDA1NzYgMS4xNDk0MjMgMC4xNTcwOTIKK3YgLTEuNTQwNTc2IDEuMTQ5NDIzIDAuMTYwMjU2Cit2IC0xLjU3NjcxNyAxLjE5MDgwNiAwLjA1Mzc0MwordiAxLjI4MTUwMiAwLjY4MTk3MiAwLjAxOTg0OAordiAxLjI4MTUwMiAxLjA3MDYwMyAwLjAxOTg0OAordiAxLjI4MTUwMiAwLjY4MTk3MiAtMC4wMTI0ODAKK3YgMS4yODE1MDMgMS4wNzA2MDMgLTAuMDEyNDgwCit2IDEuMjgxNTAyIDAuNjgxOTcyIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjA3MDYwMyAtMC4wMTc5ODcKK3YgMS4yNzk1MzQgMC42ODE5NzIgLTAuMDE5OTU1Cit2IDEuMjc5NTM0IDEuMDcwNjAzIC0wLjAxOTk1NQordiAxLjI2NzM2MSAwLjY4MTk3MyAtMC4wMTk5NTUKK3YgMS4yNjczNjUgMS4wNzA2MDIgLTAuMDE5OTU1Cit2IDEuMjgxNTAzIDEuMDcwNTkyIDAuMTMwODc5Cit2IDEuMjgxNTAyIDAuNjgxOTc3IDAuMTMwODc5Cit2IDEuMjUzMTU0IDEuMDcwNTkyIDAuMTYzNjI0Cit2IDEuMjUzMTU0IDAuNjgxOTc3IDAuMTYzNjI0Cit2IDEuMjgxNTAyIDAuNjgxOTc3IDAuMTEwNDE0Cit2IDEuMjgxNTAzIDEuMDcwNTkyIDAuMTEwNDE0Cit2IDEuMjY0OTY1IDAuNjgxOTc3IDAuMTYzNjI0Cit2IDEuMjY0OTY1IDEuMDcwNTkyIDAuMTYzNjI0Cit2IDEuMjQ1MjgwIDEuMDcwNTkyIDAuMTU3MDkzCit2IDEuMjQ1MjgwIDAuNjgxOTc3IDAuMTU3MDkzCit2IDEuMjgxNTAzIDEuMDcwNTkyIDAuMTM1ODA2Cit2IDEuMjgxNTAyIDAuNjgxOTc3IDAuMTM1ODA2Cit2IDEuMjQ1MjgwIDEuMDcwNTkyIDAuMTYwOTUyCit2IDEuMjQ1MjgwIDAuNjgxOTc3IDAuMTYwOTUyCit2IDEuMjQ1MjgwIDEuMDcwNTkyIDAuMTYwMjU3Cit2IDEuMjQ1MjgwIDAuNjgxOTc3IDAuMTYwMjU3Cit2IDEuMjgxNTAyIC0wLjI0MTU3NCAwLjA2ODM3MwordiAxLjI4MTUwMyAxLjUwNTMxMCAwLjA2ODM3MAordiAxLjI4MTUwMyAxLjA3MDU5OSAwLjA2ODM3NAordiAxLjI4MTUwMiAwLjY4MTk3NCAwLjA2ODM3NAordiAxLjI4MTUwMiAtMC4yMTgxODcgMC4wNjgzNzMKK3YgMS4yODE1MDIgMC42NjYwMjIgMC4wNjgzNzQKK3YgMS4yODE1MDMgMS4wODcyMDMgMC4wNjgzNzQKK3YgMS4yODE1MDIgMC42NzU4NTAgMC4wNDI1MDYKK3YgMS4yODE1MDMgMS4wNzYyODMgMC4wNDI1MDYKK3YgMS4yNjczNTQgMS4wNzkyNDIgMC4wNDI1MDYKK3YgMS4yNjczNDkgMC42NzM1ODcgMC4wNDI1MDYKK3YgMS4yODAwMTcgMC42NzM1NzkgMC4wNDI1MDYKK3YgMS4yODAwMTcgMS4wNzkyNDMgMC4wNDI1MDYKK3YgMS4yODE1MDIgMC42ODE5NzMgMC4wNDI1MDYKK3YgMS4yODE1MDMgMS4wNzA2MDEgMC4wNDI1MDYKK3YgMS4yODE1MDIgMC43MDI0NzUgMC4wMTk4NDgKK3YgMS4yODE1MDIgMS4wNTAxMDAgMC4wMTk4NDgKK3YgMS4yODE1MDIgMC43MDI0NzUgLTAuMDEyNDgwCit2IDEuMjgxNTAzIDEuMDUwMTAwIC0wLjAxMjQ4MAordiAxLjI4MTUwMiAwLjcwMjQ3NSAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS4wNTAxMDAgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IDAuNzAyNDc1IC0wLjAxOTk1NQordiAxLjI3OTUzNCAxLjA1MDEwMCAtMC4wMTk5NTUKK3YgMS4yNjczNjEgMC43MDI0NzYgLTAuMDE5OTU1Cit2IDEuMjY3MzY1IDEuMDUwMDk4IC0wLjAxOTk1NQordiAxLjI4MTUwMyAxLjA1MDA5MCAwLjEzMDg3OQordiAxLjI4MTUwMiAwLjcwMjQ4MCAwLjEzMDg3OQordiAxLjI1MzE1NCAxLjA1MDA5MCAwLjE2MzYyNAordiAxLjI1MzE1NCAwLjcwMjQ4MCAwLjE2MzYyNAordiAxLjI4MTUwMiAwLjcwMjQ4MCAwLjExMDQxNAordiAxLjI4MTUwMyAxLjA1MDA5MCAwLjExMDQxNAordiAxLjI2NDk2NSAwLjcwMjQ4MCAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA1MDA4OSAwLjE2MzYyNAordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE1NzA5MwordiAxLjI0NTI4MCAwLjcwMjQ4MCAwLjE1NzA5MwordiAxLjI4MTUwMyAxLjA1MDA5MCAwLjEzNTgwNgordiAxLjI4MTUwMiAwLjcwMjQ4MCAwLjEzNTgwNgordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjcwMjQ4MCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDI1NwordiAxLjI0NTI4MCAwLjcwMjQ4MCAwLjE2MDI1NwordiAxLjI4MTUwMyAxLjA1MDA5NiAwLjA2ODM3NAordiAxLjI4MTUwMiAwLjcwMjQ3NyAwLjA2ODM3NAordiAxLjI4MTUwMiAwLjcwMjQ3NiAwLjA0MjUwNgordiAxLjI4MTUwMyAxLjA1MDA5OCAwLjA0MjUwNgordiAxLjI4MTUwMyAxLjQ4NTQ1MCAwLjA2ODM3MAordiAxLjI4MTUwMyAxLjUwNTMxMCAwLjA0MjU0NgordiAxLjI4MTUwMyAxLjQ5NTU4OCAwLjA0MjU1NgordiAxLjI2NzM1NCAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI4MDAxNyAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI4MTUwMyAxLjc3OTAzOSAwLjEzNTgwNgordiAxLjI3OTUzNCAxLjc3OTAzOSAtMC4wMTk5NTYKK3YgMS4yODE1MDMgMS43NzkwMzkgMC4xMzA4NzgKK3YgMS4yNTMxNTQgMS43NzkwMzkgMC4xNjM2MjMKK3YgMS4yNDUyODAgMS43NzkwMzkgMC4xNjA5NTEKK3YgMS4yODE1MDMgMS43NzkwMzkgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuNzc5MDM5IC0wLjAxMjQ4MAordiAxLjI4MTUwMyAxLjc3OTAzOSAwLjA2ODQxMwordiAxLjI4MTUwMyAxLjc3OTAzOSAwLjAxOTg1MAordiAxLjI4MTUwMyAxLjc3OTAzOSAwLjExMDQxNAordiAxLjI2NDk2NSAxLjc3OTAzOSAwLjE2MzYyMwordiAxLjI2NzM1NyAxLjc3OTAzOSAtMC4wMTk5NTYKK3YgMS4yNDUyODAgMS43NzkwMzkgMC4xNTcwOTIKK3YgMS4yNDUyODAgMS43NzkwMzkgMC4xNjAyNTcKK3YgMS4yODE1MDIgLTAuMjI4NDIzIDAuMDQyNDY5Cit2IDEuMjY3MzQ5IC0wLjIyNjE2OSAwLjA0MjQ2OQordiAxLjI4MDAxNyAtMC4yMjYxNjkgMC4wNDI0NjkKK3YgMS4yODE1MDIgLTAuMjQxNTc0IDAuMDQyNDY2Cit2IDAuNzQ3MDg2IC0yLjgxOTE4NCAwLjA2ODQ3NQordiAwLjgyNTQ0OCAtMi44MTkxODQgMC4wMTk4NDcKK3YgMC44MTg3ODUgLTIuODE5MTg0IDAuMDE5ODQ2Cit2IDAuODE4MDc5IC0yLjc5NDY1MCAwLjAxOTY5OQordiAwLjgxODA4MCAtMi44MTgzOTcgMC4wMTk2OTkKK3YgMC43OTE4MjUgLTIuODE5MTg0IDAuMDUzNzcwCit2IDAuNzg4NDg4IC0yLjgxOTE4NCAwLjA0OTc5NgordiAwLjc4ODA4MiAtMi43OTQ2NTAgMC4wNDkxMTIKK3YgMC43ODgwODIgLTIuODE4Mzk3IDAuMDQ5MTEyCit2IDAuNjcwNzY0IC0yLjgxOTE4NCAwLjAxOTg1MgordiAwLjY3NjgwNiAtMi44MTkxODQgMC4wMTk4NDkKK3YgMC42Nzc1MDQgLTIuNzk0NjUwIDAuMDE5ODQwCit2IDAuNjc3NTAzIC0yLjgxODM5NyAwLjAxOTg0MAordiAwLjcwMjcyMyAtMi44MTkxODQgMC4wNTM1MDUKK3YgMC43MDYwNDAgLTIuODE5MTg0IDAuMDQ5NDA4Cit2IDAuNzA2NDQxIC0yLjc5NDY1MCAwLjA0ODcyMAordiAwLjcwNjQ0MSAtMi44MTgzOTcgMC4wNDg3MjAKK3YgMC40MDM3NzggLTIuNzk0NTgwIC0wLjAxOTk1NQordiAwLjQwMzc3OCAtMi44MTY0MTAgLTAuMDE5OTU1Cit2IDAuNDAzNzc4IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC40MDM3NzggLTIuODE5MTgzIC0wLjAxMjQ3OQordiAwLjQwMzc3OCAtMi44MTkxODQgMC4wMTk4NDcKK3YgMC40MDM3NzggLTIuODE5MTg0IDAuMDY4NDE0Cit2IDAuNDAzNzc4IC0yLjgxOTE4NCAwLjExMDQxNQordiAwLjQwMzc3OCAtMi44MTkxODQgMC4xMzA4ODAKK3YgMC40MDM3NzggLTIuODE5MTg0IDAuMTM1ODA3Cit2IDAuNDAzNzc4IC0yLjgwMjY4MyAwLjE2MzYyNAordiAwLjQwMzc3OCAtMi43OTA4NzIgMC4xNjM2MjQKK3YgMC40MDM3NzggLTIuNzgyOTk3IDAuMTYwOTUyCit2IDAuNDAzNzc4IC0yLjc4Mjk5NyAwLjE1NzA5MwordiAwLjQwMzc3OCAtMi43ODI5OTcgMC4xNjAyNTgKK3YgMC41MjI3MjcgLTIuODE2NDEwIC0wLjAxOTk1NAordiAwLjUyMjcyNyAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNTIyNzI3IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC41MjI3MjcgLTIuODE5MTg0IDAuMDE5ODQ3Cit2IDAuNTIyNzI3IC0yLjgxOTE4NCAwLjA2ODQxNAordiAwLjUyMjcyNyAtMi44MTkxODQgMC4xMTA0MTUKK3YgMC41MjI3MjcgLTIuODE5MTg0IDAuMTMwODgwCit2IDAuNTIyNzI3IC0yLjgxOTE4NCAwLjEzNTgwNwordiAwLjUyMjcyNyAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC41MjI3MjcgLTIuNzkwODcyIDAuMTYzNjI1Cit2IDAuNTIyNzI3IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjUyMjcyNyAtMi43ODI5OTcgMC4xNTcwOTQKK3YgMC41MjI3MjcgLTIuNzgyOTk3IDAuMTYwMjU4Cit2IDAuNTIyNzI3IC0yLjc5NDU4MCAtMC4wMTk5NTQKK3YgMC40NTE0NTggLTIuODE5MTg0IDAuMDgxODkzCit2IDAuNDc4MjQwIC0yLjgxOTE4NCAwLjA4MTg5MwordiAwLjQ4MzkwOCAtMi44MTkxODQgMC4wNjg0MTQKK3YgMC40NzgyMjQgLTIuODE5MTg0IDAuMDU1MTIwCit2IDAuNDUxNDc0IC0yLjgxOTE4NCAwLjA1NTEyMAordiAwLjQ0NTc4OSAtMi44MTkxODQgMC4wNjg0MTQKK3YgMC40NzcyNzkgLTIuODE5MTg0IDAuMDgwNzEyCit2IDAuNDUyNDE5IC0yLjgxOTE4NCAwLjA4MDcxMgordiAwLjQ0NzE1MyAtMi44MTkxODQgMC4wNjg0MTcKK3YgMC40NTI0MjggLTIuODE5MTg0IDAuMDU2MzAyCit2IDAuNDc3MjY5IC0yLjgxOTE4NCAwLjA1NjMwMgordiAwLjQ4MjU0NSAtMi44MTkxODQgMC4wNjg0MTcKK3YgMC40NzUxNzcgLTIuODE0Mzg5IDAuMDc4MTE4Cit2IDAuNDU0NTIxIC0yLjgxNDM4OSAwLjA3ODExOAordiAwLjQ1MDE0NCAtMi44MTQzODggMC4wNjg0MjcKK3YgMC40NTQ1MjYgLTIuODE0Mzg5IDAuMDU4ODg4Cit2IDAuNDc1MTcyIC0yLjgxNDM4OSAwLjA1ODg4OAordiAwLjQ3OTU1NCAtMi44MTQzODkgMC4wNjg0MjcKK3YgMC40NzY0MTQgLTIuODE4NDQ3IDAuMDc5NjQ3Cit2IDAuNDUzMjg0IC0yLjgxODQ0NyAwLjA3OTY0NwordiAwLjQ0ODM4MiAtMi44MTg0NDcgMC4wNjg0MjAKK3YgMC40NTMyODkgLTIuODE4NDQ3IDAuMDU3MzY1Cit2IDAuNDc2NDA4IC0yLjgxODQ0NyAwLjA1NzM2NQordiAwLjQ4MTMxNiAtMi44MTg0NDcgMC4wNjg0MjEKK3YgMC40NzYzMTUgLTIuODE4MTIzIDAuMDc5NTI1Cit2IDAuNDUzMzgzIC0yLjgxODEyMyAwLjA3OTUyNQordiAwLjQ0ODUyMyAtMi44MTgxMjIgMC4wNjg0MjEKK3YgMC40NTMzODggLTIuODE4MTIyIDAuMDU3NDg3Cit2IDAuNDc2MzA5IC0yLjgxODEyMiAwLjA1NzQ4NwordiAwLjQ4MTE3NSAtMi44MTgxMjMgMC4wNjg0MjEKK3YgLTEuNTc1NTM0IDEuNzQwOTUyIDAuMDU4ODE0Cit2IC0xLjU3NTUzNCAxLjcwNDk1NSAwLjA1ODgxNAordiAtMS41NzY3MTAgMS43NDA5NTIgMC4wNTcyNTMKK3YgLTEuNTc2NzExIDEuNzA0OTU1IDAuMDU3MjgzCit2IC0xLjU3NjcxMiAxLjc4NzcwNyAwLjA1NDk3MgordiAtMS41NzY3MDggMS43NDA5NTEgMC4wNTQ5NjUKK3YgLTEuNTc2NzA4IDEuNzA0OTUyIDAuMDU0OTkxCit2IC0xLjU3NjcxMCAxLjc0MDk0NyAwLjAzMjg2MwordiAtMS41NzY3MTEgMS43NDk3MzAgMC4wMjkyNzEKK3YgLTEuNTc2NzExIDEuNzMyMTcyIDAuMDI5MjE2Cit2IC0xLjU3NjcxMCAxLjc0MDk0OCAwLjAzNDU1OAordiAtMS41NzY3MTEgMS43MzEwMzAgMC4wMzA0MzYKK3YgLTEuNTc2NzEwIDEuNzUxMDA0IDAuMDMwNDA3Cit2IC0xLjU3MDcyNCAxLjc0MDk0NyAwLjAzMTIwNQordiAtMS41NzA3MjUgMS43NDgyNTQgMC4wMjgwNTYKK3YgLTEuNTcwNzI1IDEuNzMzNTY0IDAuMDI4MDUyCit2IC0xLjU3NjI5MyAxLjc0MDk0NyAwLjAzMjUyNQordiAtMS41NzYyOTMgMS43NDk0MTkgMC4wMjg5NjcKK3YgLTEuNTc2MjkzIDEuNzMyNDE0IDAuMDI4OTg3Cit2IC0xLjU3NjcxMCAxLjY2MDkzMCAwLjA1NzI4NQordiAtMS41NzU1MzQgMS42NjA5MzAgMC4wNTg4MTYKK3YgLTEuNTc2NzA4IDEuNjYwOTI3IDAuMDU0OTkzCit2IC0xLjU3NjcwOCAxLjcwNDk1MiAwLjA1MTgyMwordiAtMS41NzY3MDggMS42NjA5MjcgMC4wNTE4MjUKK3YgLTEuNTc2NzE4IDEuNzg1NTQwIDAuMDU3MjUzCit2IC0xLjU3NTUzNiAxLjc4NTU0MCAwLjA1ODgxNQordiAtMS41NzY3MTAgMS43ODU1NDAgMC4wNTQ5ODYKK3YgLTEuNTc2NzE1IDEuNzg5MDY5IDAuMDUxODQ3Cit2IC0xLjU3NTUzNCAxLjc5MDA0MSAwLjA1MTg0NwordiAtMS41NzY3MTEgMS43ODc3MDkgMC4wNTE4NDcKK3YgLTEuNTc2NzEwIDEuNzQwOTQ5IDAuMDUxODQ4Cit2IC0xLjU3NjcxMSAxLjc4NTU0MSAwLjA1MTg0NwordiAtMS41NTcxMTIgMS43NDA5NTIgMC4wNTg4MTQKK3YgLTEuNTU3MTEzIDEuNzA0OTU1IDAuMDU4ODE0Cit2IC0xLjU1NzExMiAxLjY2MDkzMCAwLjA1ODgxNgordiAtMS41NTcxMTUgMS43ODU1NDAgMC4wNTg4MTYKK3YgLTEuNTU3MTEzIDEuNzkwMDQxIDAuMDUxODQ3Cit2IC0xLjU3Mjg1NyAxLjc0MDk1MiAwLjA1ODgxNAordiAtMS41NzI4NTcgMS43MDQ5NTUgMC4wNTg4MTQKK3YgLTEuNTcyODU3IDEuNjYwOTMwIDAuMDU4ODE2Cit2IC0xLjU3Mjg1OSAxLjc4NTU0MCAwLjA1ODgxNQordiAtMS41NzI4NTggMS43OTAwNDEgMC4wNTE4NDcKK3YgLTEuNTc2NzIwIDEuNzg5MDYzIDAuMDU3MjUxCit2IC0xLjU3NTUzNCAxLjc5MDA1MyAwLjA1ODgxMwordiAtMS41NTcxMTMgMS43OTAwNTMgMC4wNTg4MTYKK3YgLTEuNTcyODU4IDEuNzkwMDUzIDAuMDU4ODE2Cit2IC0xLjU3NjcxOCAxLjc4NTU0MCAtMC4wMTgzNjEKK3YgLTEuNTc1NTM2IDEuNzg1NTQwIC0wLjAxOTkyNAordiAtMS41NzU1MzQgMS43OTAwNDYgLTAuMDE5OTIwCit2IC0xLjU3NjcxMCAxLjc0MDk1MiAtMC4wMTgzNjIKK3YgLTEuNTc2NzExIDEuNzA0OTU1IC0wLjAxODM5MQordiAtMS41NzU1MzQgMS43MDQ5NTUgLTAuMDE5OTIyCit2IC0xLjU3NTUzNCAxLjc0MDk1MiAtMC4wMTk5MjMKK3YgLTEuNTc2NzA4IDEuNzg5MDcwIDAuMDE5NzU4Cit2IC0xLjU3NjcxNSAxLjc4OTA2OSAtMC4wMTI3NTAKK3YgLTEuNTc1NTM0IDEuNzkwMDQxIC0wLjAxMjc1MAordiAtMS41NzU1MzMgMS43OTAwMzcgMC4wMTk3NTgKK3YgLTEuNTc2NzEwIDEuNjYwOTMwIC0wLjAxODM5MwordiAtMS41NzU1MzQgMS42NjA5MzAgLTAuMDE5OTI0Cit2IC0xLjU3NjcxMCAxLjc4NzcwOSAwLjAxOTc1OAordiAtMS41NzY3MTEgMS43ODc3MDkgLTAuMDEyNzUwCit2IC0xLjU3NjcxMiAxLjc4NzY4OCAtMC4wMTU4NzUKK3YgLTEuNTc2NzEwIDEuNzg1NTQwIC0wLjAxNTg4OQordiAtMS41NzY3MDggMS43NDA5NTEgLTAuMDE1ODY4Cit2IC0xLjU3NjcwOCAxLjcwNDk1MiAtMC4wMTU4OTQKK3YgLTEuNTc2NzA4IDEuNjYwOTI3IC0wLjAxNTg5NgordiAtMS41NzY3MTAgMS43NDA5NDcgMC4wMDY2NTMKK3YgLTEuNTc2NzEwIDEuNzQwOTQ4IDAuMDA0OTU4Cit2IC0xLjU3NjcxMCAxLjc1MTAwNCAwLjAwOTEwOQordiAtMS41NzY3MTEgMS43NDk3MzAgMC4wMTAyNDYKK3YgLTEuNTc2NzExIDEuNzMyMTcyIDAuMDEwMzAwCit2IC0xLjU3NjcxMSAxLjczMTAzMCAwLjAwOTA4MQordiAtMS41NzY3MDkgMS43NTUxNjQgMC4wMTk3NTgKK3YgLTEuNTc2NzA5IDEuNzUzNDE0IDAuMDE5NzU4Cit2IC0xLjU3NjcxMCAxLjcyNjg4OSAwLjAxOTc1OAordiAtMS41NzY3MTAgMS43Mjg2MzggMC4wMTk3NTgKK3YgLTEuNTc2MjkyIDEuNzUyOTg2IDAuMDE5NzU4Cit2IC0xLjU3MDcyMyAxLjc1MTMyNyAwLjAxOTc1OAordiAtMS41NzA3MjUgMS43NDgyNTQgMC4wMTE0NjAKK3YgLTEuNTc2MjkzIDEuNzQ5NDE5IDAuMDEwNTUwCit2IC0xLjU3NjI5MyAxLjc0MDk0NyAwLjAwNjk5MQordiAtMS41NzA3MjQgMS43NDA5NDcgMC4wMDgzMTEKK3YgLTEuNTcwNzI1IDEuNzMzNTY0IDAuMDExNDY0Cit2IC0xLjU3NjI5MyAxLjczMjQxNCAwLjAxMDUyOQordiAtMS41NzA3MjQgMS43MzA3NzEgMC4wMTk3NTgKK3YgLTEuNTc2MjkzIDEuNzI5MDcyIDAuMDE5NzU4Cit2IC0xLjU3NjcwOCAxLjcwNDk1MiAtMC4wMTI3MjYKK3YgLTEuNTc2NzA4IDEuNjYwOTI3IC0wLjAxMjcyNwordiAtMS41NzY3MTAgMS43NDA5NDkgLTAuMDEyNzUwCit2IC0xLjU3NjcxMSAxLjc4NTU0MSAtMC4wMTI3NTAKK3YgLTEuNTc2NzA4IDEuNzA0OTUyIDAuMDE5NzU4Cit2IC0xLjU3NjcwOCAxLjY2MDkyNyAwLjAxOTc1OAordiAtMS41NzY3MjAgMS43ODkwNzggLTAuMDE4MzQxCit2IC0xLjU3NjcxMSAxLjc4NTU0MiAwLjAxOTc1OAordiAtMS41NzI4NTcgMS43NDA5NTIgLTAuMDE5OTIzCit2IC0xLjU3Mjg1OSAxLjc4NTU0MCAtMC4wMTk5MjQKK3YgLTEuNTcyODU3IDEuNzA0OTU1IC0wLjAxOTkyMgordiAtMS41NzI4NTggMS43OTAwNDEgLTAuMDEyNzUwCit2IC0xLjU3Mjg1NyAxLjY2MDkzMCAtMC4wMTk5MjQKK3YgLTEuNTcyODU4IDEuNzkwMDQ4IC0wLjAxOTkyMQordiAtMS41NzI4NTYgMS43OTAwMzcgMC4wMTk3NTgKK3YgLTEuNTU3MTEyIDEuNzQwOTUyIC0wLjAxOTkyMwordiAtMS41NTcxMTUgMS43ODU1NDAgLTAuMDE5OTI0Cit2IC0xLjU1NzExMyAxLjcwNDk1NSAtMC4wMTk5MjIKK3YgLTEuNTU3MTEzIDEuNzkwMDQ4IC0wLjAxOTkyMQordiAtMS41NTcxMTMgMS43OTAwNDEgLTAuMDEyNzUwCit2IC0xLjU1NzExMiAxLjY2MDkzMCAtMC4wMTk5MjQKK3YgLTEuNTU3MTEyIDEuNzkwMDM3IDAuMDE5NzU4Cit2IC0xLjU3NjcyMCAxLjIyOTE3NCAwLjA1NzI1MQordiAtMS41NzY3MTggMS4yMzM5MTYgMC4wNTcyNTMKK3YgLTEuNTc1NTM2IDEuMjMzOTE2IDAuMDU4ODE1Cit2IC0xLjU3NTUzNCAxLjIyODE5MyAwLjA1ODgxMwordiAtMS41NzY3MDggMS4yMjkxNjcgMC4wMTk3NTgKK3YgLTEuNTc2NzE1IDEuMjI5MTY4IDAuMDUxNjM0Cit2IC0xLjU3NTUzNCAxLjIyODE5NiAwLjA1MTYzNAordiAtMS41NzU1MzMgMS4yMjgyMDEgMC4wMTk3NTgKK3YgLTEuNTc2NzEwIDEuMjMwNTI4IDAuMDE5NzU4Cit2IC0xLjU3NjcxMSAxLjIzMDUyOCAwLjA1MTYzNAordiAtMS41NzY3MTIgMS4yMzA1MzEgMC4wNTQ5NzIKK3YgLTEuNTc2NzEwIDEuMjMzOTE3IDAuMDU0OTg2Cit2IC0xLjU3NjcxMSAxLjIzMzkxNiAwLjA1MTYzNAordiAtMS41NzY3MTEgMS4yMzM5MTUgMC4wMTk3NTgKK3YgLTEuNTcyODU5IDEuMjMzOTE2IDAuMDU4ODE1Cit2IC0xLjU3Mjg1OCAxLjIyODE5MyAwLjA1ODgxNQordiAtMS41NzI4NTggMS4yMjgxOTYgMC4wNTE2MzQKK3YgLTEuNTcyODU2IDEuMjI4MjAxIDAuMDE5NzU4Cit2IC0xLjU1NzExNSAxLjIzMzkxNiAwLjA1ODgxNQordiAtMS41NTcxMTMgMS4yMjgxOTMgMC4wNTg4MTUKK3YgLTEuNTU3MTEzIDEuMjI4MTk2IDAuMDUxNjM0Cit2IC0xLjU1NzExMiAxLjIyODIwMSAwLjAxOTc1OAordiAtMS41NzY3MjAgMS4yMjkxNzggLTAuMDE4MzYwCit2IC0xLjU3NTUzNCAxLjIyODIwOSAtMC4wMTk5MjEKK3YgLTEuNTc1NTM2IDEuMjMzOTE2IC0wLjAxOTkyNAordiAtMS41NzY3MTggMS4yMzM5MTYgLTAuMDE4MzYyCit2IC0xLjU3NTUzNCAxLjIyODE5NiAtMC4wMTI3NTAKK3YgLTEuNTc2NzE1IDEuMjI5MTY5IC0wLjAxMjc1MAordiAtMS41NzY3MTEgMS4yMzA1MjggLTAuMDEyNzUwCit2IC0xLjU3NjcxMCAxLjIzMzkxNyAtMC4wMTU4ODkKK3YgLTEuNTc2NzEyIDEuMjMwNTMxIC0wLjAxNTg3NQordiAtMS41NzY3MTEgMS4yMzM5MTYgLTAuMDEyNzUwCit2IC0xLjU3Mjg1OSAxLjIzMzkxNiAtMC4wMTk5MjQKK3YgLTEuNTcyODU4IDEuMjI4MTk2IC0wLjAxMjc1MAordiAtMS41NzI4NTggMS4yMjgyMDkgLTAuMDE5OTIxCit2IC0xLjU1NzExNSAxLjIzMzkxNiAtMC4wMTk5MjQKK3YgLTEuNTU3MTEzIDEuMjI4MTk2IC0wLjAxMjc1MAordiAtMS41NTcxMTMgMS4yMjgyMDkgLTAuMDE5OTIxCit2IC0xLjU3NTUzNiAxLjI0ODYxMyAwLjA1ODgxNQordiAtMS41NzY3MTAgMS4yNDg2MTQgMC4wNTE2MjkKK3YgLTEuNTc2NzE2IDEuMjQ4NjE0IDAuMDU3MjU5Cit2IC0xLjU3NjcxMCAxLjI0ODYxNSAwLjA1NDk4NwordiAtMS41NzI4NTkgMS4yNDg2MTMgMC4wNTg4MTUKK3YgLTEuNTU3MTE0IDEuMjQ4NjEzIDAuMDU4ODE1Cit2IC0xLjU3NjcxMCAxLjI0ODYxNSAtMC4wMTU4OTAKK3YgLTEuNTc1NTM2IDEuMjQ4NjE0IC0wLjAxOTkyNAordiAtMS41NzY3MTYgMS4yNDg2MTQgLTAuMDE4MzY4Cit2IC0xLjU3NjcxMCAxLjI0ODYxNCAtMC4wMTI3NDUKK3YgLTEuNTcyODU5IDEuMjQ4NjE0IC0wLjAxOTkyNAordiAtMS41NTcxMTQgMS4yNDg2MTQgLTAuMDE5OTI0Cit2IC0xLjU3NjcxMCAxLjI0ODYxMyAwLjAxOTc1OAordiAtMS41NzY3MDkgMS40NTQ3NzEgMC4wNTQ5OTAKK3YgLTEuNTc2NzEzIDEuNDU0NzcyIC0wLjAxODM4MQordiAtMS41NzU1MzUgMS40NTQ3NzIgLTAuMDE5OTI0Cit2IC0xLjU3NjcwOSAxLjQ1NDc3MSAtMC4wMTI3MzYKK3YgLTEuNTcyODU4IDEuNDU0NzcyIC0wLjAxOTkyNAordiAtMS41NTcxMTMgMS40NTQ3NzIgLTAuMDE5OTI0Cit2IC0xLjU3NjcxMyAxLjQ1NDc3MiAwLjA1NzI3MgordiAtMS41NzY3MDkgMS40NTQ3NzEgMC4wNTE3MjcKK3YgLTEuNTc1NTM1IDEuNDU0NzcyIDAuMDU4ODE1Cit2IC0xLjU3Mjg1OCAxLjQ1NDc3MiAwLjA1ODgxNQordiAtMS41NzY3MDkgMS40NTQ3NzEgLTAuMDE1ODkzCit2IC0xLjU3NjcwOSAxLjQ1NDc3MCAwLjAxOTc1OAordiAtMS41NTcxMTMgMS40NTQ3NzIgMC4wNTg4MTUKK3YgMC40NjQ4NjQgLTIuNzk0NTgwIC0wLjAxOTk1NQordiAwLjQ2NDg2NCAtMi44MTY0MTAgLTAuMDE5OTU1Cit2IDAuNDY0ODY0IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC40NjQ4NjQgLTIuODE5MTgzIC0wLjAxMjQ3OQordiAwLjQ2NDg2NCAtMi44MTkxODQgMC4wMTk4NDcKK3YgMC40NjQ2NjUgLTIuODE5MTg0IDAuMTEwNDE1Cit2IDAuNDY0NjY1IC0yLjgxOTE4NCAwLjEzMDg4MAordiAwLjQ2NDY2NSAtMi44MTkxODQgMC4xMzU4MDcKK3YgMC40NjQ2NjUgLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNDY0NjY1IC0yLjc5MDg3MiAwLjE2MzYyNQordiAwLjQ2NDY2NSAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC40NjQ2NjUgLTIuNzgyOTk3IDAuMTU3MDk0Cit2IDAuNDY0NjY1IC0yLjc4Mjk5NyAwLjE2MDI1OAordiAwLjQ2NDY2NiAtMi44MTkxODQgMC4wODc0MzUKK3YgMC40NjQ4NjUgLTIuODE5MTg0IDAuMDQ5NDQzCit2IDAuNDY0NjY2IC0yLjgxOTE4NCAwLjA4NjAxMwordiAwLjQ2NDg2NSAtMi44MTkxODQgMC4wNTA4NjUKK3YgMC40NjQ2NjYgLTIuODE0Mzg5IDAuMDgyODg5Cit2IDAuNDY0ODY1IC0yLjgxNDM4OSAwLjA1NDExNgordiAwLjQ2NDY2NiAtMi44MTg0NDcgMC4wODQ3MzAKK3YgMC40NjQ4NjUgLTIuODE4NDQ3IDAuMDUyMTQ2Cit2IDAuNDY0NjY2IC0yLjgxODEyMyAwLjA4NDU4MwordiAwLjQ2NDg2NSAtMi44MTgxMjIgMC4wNTIyOTMKK3YgMC44Mjg2OTcgLTIuNzUwNTYxIC0wLjAxOTYyOAordiAwLjgyODI3MSAtMi43NTA1NjEgLTAuMDE3OTg2Cit2IDAuODI2ODE2IC0yLjc1MDU2MSAtMC4wMTI0NzkKK3YgMC43NDcwODUgLTIuNzUwNTYxIDAuMDYwMjkwCit2IDAuNjY4ODUyIC0yLjc1MDU2MSAtMC4wMTI0NzkKK3YgMC42NjczNjEgLTIuNzUwNTYxIC0wLjAxNzk4NgordiAwLjY2NjkzOCAtMi43NTA1NjEgLTAuMDE5NjI4Cit2IDAuODE4MDc5IC0yLjc1MDU2MSAwLjAxOTY5OQordiAwLjc4ODA4MiAtMi43NTA1NjEgMC4wNDkxMTIKK3YgMC42Nzc1MDQgLTIuNzUwNTYxIDAuMDE5ODQwCit2IDAuNzA2NDQxIC0yLjc1MDU2MSAwLjA0ODcyMAordiAtMS41NDMzNzcgMi43NDkzMjIgLTAuMDE5OTU3Cit2IC0xLjQ2ODk1MSAyLjg1OTg3MyAtMC4wMTk5NTcKK3YgLTEuMzU4NTg3IDIuOTM0MTA0IC0wLjAxOTk1NwordiAtMS4yMjM5NTMgMi45NjIyNDUgLTAuMDE5OTU3Cit2IC0xLjA0MjM0MyAyLjk2MjI0NiAtMC4wMTk5NTcKK3YgMC42MzMxMTEgMi45NjIyNDUgLTAuMDE5OTU2Cit2IDAuOTI5MzkwIDIuOTYyMjQ1IC0wLjAxOTk1NgordiAxLjA2MzI5MCAyLjkzMzk4MyAtMC4wMTk5NTYKK3YgMS4xNzM2OTAgMi44NTk2MTIgLTAuMDE5OTU2Cit2IDEuMjQ4MDg5IDIuNzQ5MzIxIC0wLjAxOTk1NgordiAxLjI3NTU0OCAyLjYxNDk0MSAtMC4wMTk5NTYKK3YgMS4yNzU1NDggMi40MTY1NTQgLTAuMDE5OTU2Cit2IDEuMjc1NTQ3IC0yLjI3MTUzNiAtMC4wMTk5NTQKK3YgLTEuNTcwNzY0IC0yLjI3MTUzNCAtMC4wMTk5NTUKK3YgLTEuNTcwNzYyIDIuNDE2NTU1IC0wLjAxOTk1NwordiAtMS41NzA3NjIgMi42MTQ5MDMgLTAuMDE5OTU3Cit2IC0wLjkyODA5NyAyLjk2MjI0NiAtMC4wMTk5NTcKK3YgLTAuOTg0MzQzIDIuOTYyMjQ2IC0wLjAxOTk1NwordiAwLjUyMjcyNyAyLjk2MjI0NSAtMC4wMTk5NTYKK3YgMC41ODAzNjYgMi45NjIyNDYgLTAuMDE5OTU2Cit2IDEuMjc1NTQ4IC0wLjI0MTU3NCAtMC4wMTk5NTUKK3YgMS4yNzU1NDggMS41MDUzMTAgLTAuMDE5OTU2Cit2IDEuMjc1NTQ4IDAuNjc1ODY0IC0wLjAxOTk1NQordiAxLjI3NTU0OCAtMC4yMjg0MjMgLTAuMDE5OTczCit2IDEuMjc1NTUxIDEuMDc2Mjg0IC0wLjAxOTk1NgordiAxLjI3NTU0OCAxLjQ5NTU5NCAtMC4wMTk5NTYKK3YgMS4yNzU1NDcgLTAuMjY3NjM3IC0wLjAxOTk1NQordiAxLjI3NTU0OCAxLjUyMzg1MyAtMC4wMTk5NTYKK3YgLTEuNTcwNzYzIDAuMDcyNTEwIC0wLjAxOTk1NgordiAtMS41NzA3NjIgMS44MzI3OTAgLTAuMDE5OTU3Cit2IC0xLjU3MDc2MiAxLjE5MDgwNiAtMC4wMTk5NTcKK3YgLTEuNTcwNzYyIDEuMjI0MDI2IC0wLjAxOTk1NgordiAtMS41NzA3NjIgMS4yMjcyMTQgLTAuMDE5OTU2Cit2IC0xLjU3MDc2MiAxLjc5MTM0NSAtMC4wMTk5NTcKK3YgLTEuNTcwNzYyIDEuNzk0NjQ4IC0wLjAxOTk1NwordiAtMS41NzE2NzUgMS4yMjgwNDQgMC4wNTg5NzYKK3YgLTEuNTcxNjIxIDEuNzkwMzU5IDAuMDU4OTg2Cit2IC0xLjU3MTYxNyAxLjc5MDM1NyAtMC4wMTc5ODgKK3YgLTEuNTcxNjc1IDEuMjI4MDQ0IC0wLjAxMjQ4MQordiAtMS41NzE1ODMgMS4yMjgwNTQgLTAuMDE3OTg4Cit2IDEuMjc1OTIyIDEuNDkzNDU4IDAuMDUyNTc2Cit2IDEuMjc1OTIyIDEuMDc5MjQyIDAuMDUyNTgwCit2IDEuMjc1OTIyIDEuNDkzNDYwIDAuMDE5ODUwCit2IDEuMjc1OTIyIDEuNDkzNDYxIC0wLjAxMjQ4MAordiAxLjI3NTkyMSAxLjQ5MzQ2MSAtMC4wMTc5ODcKK3YgMS4yNzU5MjIgMS4wNzkyNDMgMC4wMTk4NDgKK3YgMS4yNzU5MjIgMS4wNzkyNDQgLTAuMDEyNDgwCit2IDEuMjc1OTIxIDEuMDc5MjQ0IC0wLjAxNzk4NwordiAxLjI3NTkyMiAxLjA4NzIwNSAwLjA1MjU4MAordiAxLjI3NTkyMiAxLjQ4NTQzNSAwLjA1MjU3NgordiAxLjI3NTkyMSAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI3NTkyMCAtMC4yMjYxNjcgMC4wNTI2MTEKK3YgMS4yNzU5MjAgMC42NzM1ODQgMC4wMTk4NDgKK3YgMS4yNzU5MjEgMC42NzM1ODEgLTAuMDEyNDgwCit2IDEuMjc1OTIxIDAuNjczNTgyIC0wLjAxNzk4NwordiAxLjI3NTkyMCAtMC4yMjYxNzEgMC4wMTk4NDgKK3YgMS4yNzU5MjAgLTAuMjI2MTcwIC0wLjAxMjQ4MAordiAxLjI3NTkyMSAtMC4yMjYxNzAgLTAuMDE3OTg3Cit2IDEuMjc1OTIwIC0wLjIxODE2NSAwLjA1MjYxMQordiAxLjI3NTkyMSAwLjY2NjAxNyAwLjA1MjYxMQordiAxLjI3NDc1OCAwLjY3MzU4MiAtMC4wMTk5NTgKK3YgMS4yNzQ3NTcgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI3NDc1OSAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNzQ3NTcgMS40OTM0NjEgLTAuMDE5OTU1Cit2IC0xLjU3MDQ5MSAxLjIyODA1MCAtMC4wMTk5NjUKK3YgLTEuNTcwNzcwIDEuNzkwMzU3IC0wLjAxOTk1NgordiAtMS41NzA3NjQgLTIuNDY2NjI5IC0wLjAxOTk1NQordiAtMS41NDM0MTIgLTIuNjAxNDM3IC0wLjAxOTk1NQordiAtMS40Njg3OTMgLTIuNzExNzU1IC0wLjAxOTk1NQordiAtMS4zNTg1OTYgLTIuNzg2NDU4IC0wLjAxOTk1NQordiAtMS4yMjE4ODQgLTIuODExNDk4IC0wLjAxOTk1NQordiAtMS4wNDIzNDUgLTIuODExNDk4IC0wLjAxOTk1NQordiAwLjkzNDM5MSAtMi44MTE0OTggLTAuMDE5OTU0Cit2IDEuMDYzMDM2IC0yLjc4NzgzNiAtMC4wMTk5NTQKK3YgMS4xNzQyMjkgLTIuNzExOTA2IC0wLjAxOTk1NAordiAxLjI0ODE4NCAtMi42MDE2MzYgLTAuMDE5OTU0Cit2IDEuMjc1NTQ3IC0yLjQ2NjY2NiAtMC4wMTk5NTQKK3YgMC42MzMwOTYgLTIuODExNDk4IC0wLjAxOTk1NAordiAwLjgzNjM0NyAtMi44MTE1MTQgLTAuMDE5OTU0Cit2IDAuODI5NzgxIC0yLjgxMTUxNCAtMC4wMTk5NTQKK3YgMC42NjU4ODYgLTIuODExNTE0IC0wLjAxOTk1NAordiAwLjY2MDU2NCAtMi44MTE1MTQgLTAuMDE5OTU0Cit2IDAuODI4MjcyIC0yLjgxMzA1MSAtMC4wMTc5ODYKK3YgMC44MjY4MTcgLTIuODEzMDU0IC0wLjAxMjQ3OQordiAwLjc0NzA4NiAtMi44MTMwNTQgMC4wNjAyOTAKK3YgMC42Njg4NTEgLTIuODEzMDU0IC0wLjAxMjQ3OQordiAwLjY2NzM0OCAtMi44MTMwNTEgLTAuMDE3OTg2Cit2IDAuODI4Njk2IC0yLjgxMTI0NiAtMC4wMTk2MjgKK3YgMC42NjY5MjcgLTIuODExMjQ2IC0wLjAxOTYyOAordiAwLjE0MDIzMiAtMi44MTE0OTggLTAuMDE5OTU1Cit2IDAuMDMyMTQxIC0yLjgxMTQ5OCAtMC4wMTk5NTUKK3YgMC4wMzk3ODMgLTIuODExNDk4IC0wLjAxOTk1NQordiAtMC4wMTM1NjkgLTIuODAzMzEyIDAuMDc5NjIyCit2IDAuMDQxNDA0IC0yLjgwMzMxMiAwLjAxOTg0OAordiAwLjAzNjEzNCAtMi44MDMzMTIgLTAuMDEyNDgwCit2IDAuMDMyMzgyIC0yLjgwMzMwNyAtMC4wMTc5ODcKK3YgMC4wMzE4NjEgLTIuODAxNTA2IC0wLjAxOTU2NQordiAwLjAxNTgwMCAtMi44MDMzMTIgMC4wNzA4MzEKK3YgMC4wMzQ4NDMgLTIuODAzMzEyIDAuMDUwNjIwCit2IC0wLjQzNTA3NCAtMi44MTE0OTggLTAuMDE5OTU2Cit2IC0wLjMyNzQwMCAtMi44MDE3NzIgLTAuMDE5OTU1Cit2IC0wLjMzNTUwMyAtMi44MTE0OTggLTAuMDE5OTU1Cit2IC0wLjI4MTM0NSAtMi44MDMzMTIgMC4wNzk2MjIKK3YgLTAuMzM2NTk4IC0yLjgwMzMxMiAwLjAxOTg0NwordiAtMC4zMzEyNDUgLTIuODAzMzEyIC0wLjAxMjQ4MAordiAtMC4zMjc2MDkgLTIuODAzMzA3IC0wLjAxNzk4NwordiAtMC4zMjY3NzMgLTIuODAxNTA2IC0wLjAxOTU1MAordiAtMC4zMTA5NDIgLTIuODAzMzEyIDAuMDcwODcwCit2IC0wLjMzMDA0NiAtMi44MDMzMTIgMC4wNTA1OTcKK3YgLTAuMTQ3NjExIC0yLjgwMzMxMiAwLjA3OTYyMgordiAtMS41NzE2NzUgMS4yMjgwNDQgMC4wMTk4NDgKK3YgLTEuNTcxNjE5IDEuNzkwMzU3IDAuMDE5ODUwCit2IC0xLjU3MTYxOCAxLjc5MDM1NyAtMC4wMTI0NzgKK3YgLTEuNTcxNjc1IDEuNDUzMDU5IDAuMDU4OTc1Cit2IC0xLjU3MTYyNiAxLjc3ODE4MiAwLjA1ODk4NAordiAtMS41NzA3NjIgMS44NjQzNTIgLTAuMDE5OTU3Cit2IC0xLjU3MTYyMSAxLjc5MDM1OSAwLjA1NjQxOQordiAtMS41NzE2MjQgMS43ODc2NjQgMC4wNTg5ODUKK3YgLTEuNTcxNjc1IDEuMjMzOTUwIDAuMDU4OTc2Cit2IC0xLjU3MTY3NSAxLjIyODA0NCAwLjA1MTg5NQordiAtMS41NzA3NjIgMS4xNDk0MjMgLTAuMDE5OTU2Cit2IDEuMjc1NTQ5IDAuNjgxOTcyIC0wLjAxOTk1NQordiAxLjI3NTU1MCAxLjA3MDYwMyAtMC4wMTk5NTUKK3YgMS4yNzU5MjIgMS4wNzkyNDMgMC4wNDI1MDYKK3YgMS4yNzU5MjAgMC42NzM1ODEgMC4wNDI1MDYKK3YgMS4yNzU1NDkgMC43MDI0NzYgLTAuMDE5OTU1Cit2IDEuMjc1NTUwIDEuMDUwMDk5IC0wLjAxOTk1NQordiAxLjI3NTkyMiAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI3NTU0OCAxLjc3OTAzOSAtMC4wMTk5NTYKK3YgMS4yNzU5MjAgLTAuMjI2MTY5IDAuMDQyNDY5Cit2IDAuODE4MDgwIC0yLjgxMzA1NCAwLjAxOTY5OQordiAwLjc4ODA4MiAtMi44MTMwNTQgMC4wNDkxMTIKK3YgMC42Nzc1MDMgLTIuODEzMDU0IDAuMDE5ODQwCit2IDAuNzA2NDQxIC0yLjgxMzA1NCAwLjA0ODcyMAordiAwLjQwMzc3OCAtMi44MTE0OTggLTAuMDE5OTU1Cit2IDAuNTIyNzI3IC0yLjgxMTQ5OCAtMC4wMTk5NTQKK3YgMC40NjQ4NjQgLTIuODExNDk4IC0wLjAxOTk1NQordiAtMC4yMDI2ODUgMi45NjgyMDEgMC4xMzU4MDUKK3YgLTAuMjAyNjg1IDIuOTUxNjkwIDAuMTYzNjIzCit2IC0wLjIwMjY4NSAyLjk2ODIwMSAwLjEzMDg3OAordiAtMC4yMDI2ODUgMi45MzIwMjggMC4xNjA5NTEKK3YgLTAuMjAyNjg1IDIuOTY4MjAxIDAuMDE5ODQ5Cit2IC0wLjIwMjY4NSAyLjk2NjIzMiAtMC4wMTk5NTYKK3YgLTAuMjAyNjg1IDIuOTM5ODc4IDAuMTYzNjIzCit2IC0wLjIwMjY4NSAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgLTAuMjAyNjg1IDIuOTY4MjAxIC0wLjAxMjQ4MQordiAtMC4yMDI2ODUgMi45NjgyMDEgMC4wNjg0MTIKK3YgLTAuMjAyNjg1IDIuOTQ4NTE1IC0wLjAxOTk1NgordiAtMC4yMDI2ODUgMi45NjgyMDEgMC4xMTA0MTMKK3YgLTAuMjAyNjg1IDIuOTMyMDI4IDAuMTU3MDkyCit2IC0wLjIwMjY4NSAyLjkzMjAyOCAwLjE2MDI1NgordiAtMC4yMDI2ODUgMi45NjIyNDYgLTAuMDE5OTU2Cit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAtMC4wMTc5ODgKK3YgLTEuNDczMjQxIDIuODY0MDY5IC0wLjAxMjQ4MQordiAtMS40NzMyNDEgMi44NjQwNjkgLTAuMDE3OTg4Cit2IDEuMTc3OTg0IDIuODYzOTk0IC0wLjAxNzk4OAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAtMC4wMTI0ODEKK3YgMS4xNzc5ODQgMi44NjM5OTQgLTAuMDE3OTg4Cit2IDEuMTY2ODA5IDIuODUyNjgxIDAuMTYzNjIzCit2IDEuMTY2ODA5IDIuODUyNjgxIDAuMTYzNjIzCit2IDEuMTc3OTg0IDIuODYzOTk0IDAuMTM1ODA1Cit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjEzNTgwNAordiAtMS40NjE3OTEgMi44NTI2NTggMC4xNjM2MjIKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMTM1ODA0Cit2IC0xLjQ2MTc5MSAyLjg1MjY1OCAwLjE2MzYyMgordiAtMS41MzQxNzIgMi43NDUxNjkgMC4xNjM2MjIKK3YgLTEuNTM0MTcyIDIuNzQ1MTY5IDAuMTYzNjIyCit2IC0xLjUyMzA2MiAyLjc0MDUxOCAwLjE2MzYyMgordiAtMS41MzQxNzIgMi43NDUxNjkgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDIuNjE0ODYxIDAuMTYzNjIyCit2IC0xLjU2MDI2MSAyLjYxNDg2MSAwLjE2MzYyMgordiAtMS41MjMwNjIgMi43NDA1MTggMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDIuNjE0ODYxIDAuMTYzNjIyCit2IC0xLjU2MDI2MSAyLjQxNjU1NSAwLjE2MzYyMgordiAtMS41NjAyNjEgMi40MTY1NTUgMC4xNjM2MjIKK3YgMS4yNjQ5NjQgLTIuMjcxNTM1IDAuMTYzNjI1Cit2IDEuMjY0OTY0IC0wLjI2NzYzNiAwLjE2MzYyNAordiAxLjI2NDk2NCAtMC4yNjc2MzYgMC4xNjM2MjQKK3YgMS4yNjQ5NjUgMi40MTY1NTQgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMi42MTQ5MjggMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMi40MTY1NTQgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMi42MTQ5MjggMC4xNjM2MjMKK3YgMS4yMzg4NDcgMi43NDUxNDggMC4xNjM2MjMKK3YgMS4yMzg4NDcgMi43NDUxNDggMC4xNjM2MjMKK3YgMS4yMjc3MzcgMi43NDA0OTcgMC4xNjM2MjMKK3YgMS4yMzg4NDcgMi43NDUxNDggMC4xNjM2MjMKK3YgMS4xNjY4MDkgMi44NTI2ODEgMC4xNjM2MjMKK3YgMS4xNjY4MDkgMi44NTI2ODEgMC4xNjM2MjMKK3YgMS4yMjc3MzcgMi43NDA0OTcgMC4xNjM2MjMKK3YgMS4xNjY4MDkgMi44NTI2ODEgMC4xNjM2MjMKK3YgMS4wNTk1MDcgMi45MjQ4MjQgMC4xNjM2MjMKK3YgMS4wNTk1MDcgMi45MjQ4MjQgMC4xNjM2MjMKK3YgMS4wNTk1MDcgMi45MjQ4MjQgMC4xNjM2MjMKK3YgMC45MjkyMTAgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC45MjkyMTAgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC45MjkyMTAgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC42MzMxMTEgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC42MzMxMTEgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC42MzMxMTEgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC41ODAzNTYgMi45NTE2ODkgMC4xNjM2MjMKK3YgMC41ODAzNTYgMi45NTE2ODkgMC4xNjM2MjMKK3YgLTEuMDQyMzQzIDIuOTUxNjkwIDAuMTYzNjIyCit2IC0xLjIyMjIxNCAyLjk1MTY5MSAwLjE2MzYyMgordiAtMS4wNDIzNDMgMi45NTE2OTAgMC4xNjM2MjIKK3YgLTEuMjIyMjE0IDIuOTUxNjkxIDAuMTYzNjIyCit2IC0xLjM1NDcwMiAyLjkyNDk0OSAwLjE2MzYyMgordiAtMS4zNTQ3MDIgMi45MjQ5NDkgMC4xNjM2MjIKK3YgLTEuMzU0NzAyIDIuOTI0OTQ5IDAuMTYzNjIyCit2IC0xLjQ2MTc5MSAyLjg1MjY1OCAwLjE2MzYyMgordiAtMS40NjE3OTEgMi44NTI2NTggMC4xNjM2MjIKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMTM1ODA0Cit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjEzMDg3NwordiAtMS40NzMyNDEgMi44NjQwNjkgMC4xMzU4MDQKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMzU4MDUKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMzA4NzgKK3YgLTEuNTE1NjU2IDIuNzM3NDE3IDAuMTYwOTUwCit2IC0xLjUyMzA2MiAyLjc0MDUxOCAwLjE2MzYyMgordiAtMS41MjMwNjIgMi43NDA1MTggMC4xNjM2MjIKK3YgMS4yMjAzMzAgMi43MzczOTYgMC4xNjA5NTEKK3YgMS4yMjc3MzcgMi43NDA0OTcgMC4xNjM2MjMKK3YgMS4yMjc3MzcgMi43NDA0OTcgMC4xNjM2MjMKK3YgLTEuNDY4OTUxIDIuODU5ODczIC0wLjAxOTk1NwordiAtMS40Njg5NTEgMi44NTk4NzMgLTAuMDE5OTU3Cit2IC0xLjQ3MTgyMyAyLjg2Mjc0NCAtMC4wMTk5NTcKK3YgMS4xNzM2OTAgMi44NTk2MTIgLTAuMDE5OTU2Cit2IDEuMTczNjkwIDIuODU5NjEyIC0wLjAxOTk1NgordiAxLjE3NjUyOCAyLjg2MjQ4MyAtMC4wMTk5NTYKK3YgLTEuNTQ3MTI3IDIuNzUwODkyIC0wLjAxOTk1NwordiAtMS41NDg5NzggMi43NTE2NjcgLTAuMDE3OTg4Cit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAtMC4wMTc5ODgKK3YgLTEuNDczMjQxIDIuODY0MDY5IC0wLjAxNzk4OAordiAtMS40NzE4MjMgMi44NjI3NDQgLTAuMDE5OTU3Cit2IC0xLjU0NzEyNyAyLjc1MDg5MiAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ4IDIuNjE0OTA3IC0wLjAxOTk1NwordiAtMS41NzY3MTcgMi42MTQ5MTAgLTAuMDE3OTg4Cit2IC0xLjU0ODk3OCAyLjc1MTY2NyAtMC4wMTc5ODgKK3YgLTEuNTQ4OTc4IDIuNzUxNjY3IC0wLjAxNzk4OAordiAtMS41NDcxMjcgMi43NTA4OTIgLTAuMDE5OTU3Cit2IC0xLjU3NDc0OCAyLjYxNDkwNyAtMC4wMTk5NTcKK3YgLTEuNDcxODIzIDIuODYyNzQ0IC0wLjAxOTk1NwordiAtMS40NzMyNDEgMi44NjQwNjkgLTAuMDE3OTg4Cit2IC0xLjM2MDk3MyAyLjkzOTY5NyAtMC4wMTc5ODgKK3YgLTEuMzYwOTczIDIuOTM5Njk3IC0wLjAxNzk4OAordiAtMS4zNjAxNjAgMi45Mzc4NDUgLTAuMDE5OTU3Cit2IC0xLjQ3MTgyMyAyLjg2Mjc0NCAtMC4wMTk5NTcKK3YgLTEuMzYwMTYwIDIuOTM3ODQ1IC0wLjAxOTk1NwordiAtMS4zNjA5NzMgMi45Mzk2OTcgLTAuMDE3OTg4Cit2IC0xLjIyNDU5MCAyLjk2ODE5OSAtMC4wMTc5ODgKK3YgLTEuMjI0NTkwIDIuOTY4MTk5IC0wLjAxNzk4OAordiAtMS4yMjQ0NTggMi45NjYyMzEgLTAuMDE5OTU3Cit2IC0xLjM2MDE2MCAyLjkzNzg0NSAtMC4wMTk5NTcKK3YgLTEuMjI0NDU4IDIuOTY2MjMxIC0wLjAxOTk1NwordiAtMS4wNDIzNDMgMi45NjYyMzIgLTAuMDE5OTU3Cit2IC0xLjIyNDQ1OCAyLjk2NjIzMSAtMC4wMTk5NTcKK3YgMC45Mjk0MjYgMi45NjYyMzEgLTAuMDE5OTU2Cit2IDAuOTI5NDI2IDIuOTY4MjAwIC0wLjAxNzk4OAordiAxLjA2NTYzNSAyLjkzOTY3MCAtMC4wMTc5ODgKK3YgMS4wNjU2MzUgMi45Mzk2NzAgLTAuMDE3OTg4Cit2IDEuMDY0ODYwIDIuOTM3ODU5IC0wLjAxOTk1NgordiAwLjkyOTQyNiAyLjk2NjIzMSAtMC4wMTk5NTYKK3YgMS4wNjU2MzUgMi45Mzk2NzAgLTAuMDE3OTg4Cit2IDEuMTc3OTg0IDIuODYzOTk0IC0wLjAxNzk4OAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAtMC4wMTc5ODgKK3YgMS4xNzY1MjggMi44NjI0ODMgLTAuMDE5OTU2Cit2IDEuMTc3OTg0IDIuODYzOTk0IC0wLjAxNzk4OAordiAxLjI1MzY5MCAyLjc1MTY2NiAtMC4wMTc5ODgKK3YgMS4yNTM2OTAgMi43NTE2NjYgLTAuMDE3OTg4Cit2IDEuMTc2NTI4IDIuODYyNDgzIC0wLjAxOTk1NgordiAxLjI1MTgzOCAyLjc1MDg5MSAtMC4wMTk5NTYKK3YgMS4yNTM2OTAgMi43NTE2NjYgLTAuMDE3OTg4Cit2IDEuMjgxNTAzIDIuNjE0OTQ4IC0wLjAxNzk4NwordiAxLjI4MTUwMyAyLjYxNDk0OCAtMC4wMTc5ODcKK3YgMS4yNzk1MzQgMi42MTQ5NDUgLTAuMDE5OTU2Cit2IDEuMjUxODM4IDIuNzUwODkxIC0wLjAxOTk1NgordiAxLjI4MTUwMyAyLjYxNDk0OCAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMi40MTY1NTQgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDIuNDE2NTU0IC0wLjAxNzk4NwordiAtMS41NzQ3NDkgMC4wNzI1MTAgLTAuMDE5OTU2Cit2IC0xLjU3NDc0OSAwLjA3MjUxMCAtMC4wMTk5NTYKK3YgLTEuNTc0NzUwIC0yLjI3MTUzNCAtMC4wMTk5NTUKK3YgLTEuNTc0NzQ4IDIuNDE2NTU1IC0wLjAxOTk1NwordiAtMS41NzQ3NDggMi42MTQ5MDcgLTAuMDE5OTU3Cit2IC0xLjU3NDc0OCAyLjQxNjU1NSAtMC4wMTk5NTcKK3YgLTEuMDQyMzQzIDIuOTY4MjAxIC0wLjAxNzk4OAordiAtMS4wNDIzNDMgMi45NjgyMDEgLTAuMDE3OTg4Cit2IDAuNjMzMTExIDIuOTY4MjAwIC0wLjAxNzk4OAordiAwLjkyOTQyNiAyLjk2ODIwMCAtMC4wMTc5ODgKK3YgMC45Mjk0MjYgMi45NjgyMDAgLTAuMDE3OTg4Cit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjAxOTg1MAordiAtMS40NzMyNDEgMi44NjQwNjkgLTAuMDEyNDgxCit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjAxOTg1MAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjAxOTg1MAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAtMC4wMTI0ODEKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4wMTk4NTAKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMTEwNDEzCit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjA2ODQxMgordiAtMS40NzMyNDEgMi44NjQwNjkgMC4xMTA0MTMKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMTA0MTQKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4wNjg0MTIKK3YgMS4xNzc5ODQgMi44NjM5OTQgMC4xMTA0MTQKK3YgLTAuOTg0MzQzIDIuOTY4MjAxIC0wLjAxNzk4OAordiAtMC45MjgwOTcgMi45NjgyMDEgLTAuMDE3OTg4Cit2IC0wLjk4NDM0MyAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgLTAuOTI4MDk4IDIuOTUxNjkwIDAuMTYzNjIyCit2IC0wLjk4NDM0NCAyLjk1MTY5MCAwLjE2MzYyMgordiAtMC45ODQzNDQgMi45NTE2OTAgMC4xNjM2MjIKK3YgLTAuOTg0MzQzIDIuOTY4MjAxIC0wLjAxNzk4OAordiAtMC45ODQzNDQgMi45NTE2OTAgMC4xNjM2MjIKK3YgLTEuMDQyMzQzIDIuOTUxNjkwIDAuMTYzNjIyCit2IC0wLjk4NDM0NCAyLjk1MTY5MCAwLjE2MzYyMgordiAtMS40NzMyNDEgMi44NjQwNjkgMC4wNjg0MTIKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMDE5ODUwCit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjA2ODQxMgordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjA2ODQxMgordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjAxOTg1MAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjA2ODQxMgordiAtMS40NzMyNDEgMi44NjQwNjkgMC4xMzA4NzcKK3YgLTEuNDczMjQxIDIuODY0MDY5IDAuMTEwNDEzCit2IC0xLjQ3MzI0MSAyLjg2NDA2OSAwLjEzMDg3NwordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjEzMDg3OAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjExMDQxNAordiAxLjE3Nzk4NCAyLjg2Mzk5NCAwLjEzMDg3OAordiAtMC4yMDI2ODUgMi45NjgyMDEgLTAuMDE3OTg4Cit2IC0wLjIwMjY4NSAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgLTAuMjAyNjg1IDIuOTUxNjkwIDAuMTYzNjIzCit2IDAuNTIyNzI3IDIuOTUxNjg5IDAuMTYzNjIzCit2IC0wLjIwMjY4NSAyLjk1MTY5MCAwLjE2MzYyMwordiAwLjU4MDM2NiAyLjk2ODIwMCAtMC4wMTc5ODgKK3YgMC41MjI3MjcgMi45NjgyMDAgLTAuMDE3OTg4Cit2IDAuNTgwMzY2IDIuOTY4MjAwIC0wLjAxNzk4OAordiAwLjU4MDM1NiAyLjk1MTY4OSAwLjE2MzYyMwordiAwLjUyMjcyNyAyLjk1MTY4OSAwLjE2MzYyMwordiAwLjUyMjcyNyAyLjk1MTY4OSAwLjE2MzYyMwordiAwLjYzMzExMSAyLjk2ODIwMCAtMC4wMTc5ODgKK3YgMC41ODAzNjYgMi45NjgyMDAgLTAuMDE3OTg4Cit2IDAuNjMzMTExIDIuOTY4MjAwIC0wLjAxNzk4OAordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU2NjU3OCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA1NDYyNAordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU5NDE2MCAyLjk1MTIzMSAwLjA4MjIwNgordiAwLjU4MDM1NiAyLjk2ODIwMCAwLjA5MDkyOQordiAwLjU2NDQ2NSAyLjk2ODIwMCAwLjA4NDMzNQordiAwLjU4MDM1NiAyLjk2ODIwMCAwLjA5MDkyOQordiAwLjU2NDQ2NSAyLjk2ODIwMCAwLjA4NDMzNQordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU1ODcxNiAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU1ODcxNiAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU1Nzg2MyAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjU2NDQ2NSAyLjk2ODIwMCAwLjA4NDMzNQordiAwLjU1Nzg2MyAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjU1ODcxNiAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU2NDQ4MyAyLjk2ODIwMCAwLjA1MjUxMAordiAwLjU1Nzg2MyAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjU2NTA2OCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU4MDM2NiAyLjk2NzQxMyAwLjA0Njc4NgordiAwLjU4MDM2NiAyLjk2NzQxMyAwLjA0Njc4NgordiAwLjU4MDM2NiAyLjk2ODIwMCAwLjA0NTkzNAordiAwLjU4MDM2NiAyLjk2NzQxMyAwLjA0Njc4NgordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA1MjUyOAordiAwLjU4MDM2NiAyLjk2ODIwMCAwLjA0NTkzNAordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA1MjUyOAordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA1MzEzMAordiAwLjYwMjAxNCAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjYwMjAxNCAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjYwMjg2NiAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA1MjUyOAordiAwLjYwMjg2NiAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjYwMjAxNCAyLjk2NzQxMyAwLjA2ODQxMgordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA4NDMzNQordiAwLjYwMjg2NiAyLjk2ODIwMCAwLjA2ODQxMgordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA4NDMzNQordiAwLjU5NTY3MCAyLjk2NzQxMyAwLjA4MzczMwordiAwLjU4MDM1NiAyLjk2NzQxMyAwLjA5MDA3NwordiAwLjU4MDM1NiAyLjk2NzQxMyAwLjA5MDA3NwordiAwLjU4MDM1NiAyLjk2ODIwMCAwLjA5MDkyOQordiAwLjU5NjI3MyAyLjk2ODIwMCAwLjA4NDMzNQordiAxLjI2NDk2NCAtMC4yMTgyMjUgMC4xNjM2MjQKK3YgMS4yNjQ5NjUgMC42NjYwMjEgMC4xNjM2MjQKK3YgMS4yNjQ5NjUgMC42NjYwMjEgMC4xNjM2MjQKK3YgMS4yODE1MDIgLTAuMjY3NjM3IC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjQ5NTU5MiAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS40OTU1OTIgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuNTA1MzEwIC0wLjAxNzk4NwordiAxLjI2NDk2NSAxLjA4NzE5OCAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjQ4NTQ1MSAwLjE2MzYyMwordiAxLjI2NDk2NSAxLjQ4NTQ1MSAwLjE2MzYyMwordiAxLjI4MTUwMiAtMC4yNDE1NzQgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIC0wLjI0MTU3NCAtMC4wMTc5ODcKK3YgMS4yNzk1MzQgLTAuMjQxNTc0IC0wLjAxOTk1NQordiAxLjI4MTUwMiAtMC4yNDE1NzQgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IC0wLjI0MTU3NCAtMC4wMTk5NTUKK3YgMS4yODE1MDMgMS41MDUzMTAgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuNTA1MzEwIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjUyMzg1MyAtMC4wMTc5ODcKK3YgMS4yNjQ5NjUgMS41MDUzMTAgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMS41MjM4NTMgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMS41MDUzMTAgMC4xNjM2MjMKK3YgMS4yNzk1MzQgLTAuMjI4NDI0IC0wLjAxOTk3MwordiAxLjI3OTUzNCAtMC4yMjg0MjQgLTAuMDE5OTczCit2IDEuMjY0OTY1IDEuNDg1NDUxIDAuMTYzNjIzCit2IDEuMjY0OTY1IDEuNTA1MzEwIDAuMTYzNjIzCit2IDEuMjY0OTY1IDEuNDg1NDUxIDAuMTYzNjIzCit2IDEuMjY0OTY1IDAuNzAyNDgwIDAuMTYzNjI0Cit2IDEuMjY0OTY1IDEuMDUwMDg5IDAuMTYzNjI0Cit2IDEuMjY0OTY1IDEuMDUwMDg5IDAuMTYzNjI0Cit2IDEuMjY0OTY0IC0wLjI0MTU3NCAwLjE2MzYyNAordiAxLjI2NDk2NCAtMC4yMTgyMjUgMC4xNjM2MjQKK3YgMS4yNjQ5NjQgLTAuMjQxNTc0IDAuMTYzNjI0Cit2IDEuMjgxNTAyIC0wLjI0MTU3NCAtMC4wMTc5ODcKK3YgMS4yNjQ5NjQgLTAuMjY3NjM2IDAuMTYzNjI0Cit2IDEuMjY0OTY0IC0wLjI0MTU3NCAwLjE2MzYyNAordiAxLjI2NDk2NCAtMC4yNjc2MzYgMC4xNjM2MjQKK3YgMS4yODE1MDIgLTIuMjcxNTM2IC0wLjAxNzk4NgordiAxLjI4MTUwMiAtMC4yNjc2MzcgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIC0yLjI3MTUzNiAtMC4wMTc5ODYKK3YgMS4yODE1MDMgMS43NzkwMzkgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuNTIzODUzIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjc3OTAzOSAtMC4wMTc5ODcKK3YgMS4yNjQ5NjUgMS43NzkwMzkgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMS41MjM4NTMgMC4xNjM2MjMKK3YgMS4yNjQ5NjUgMS43NzkwMzkgMC4xNjM2MjMKK3YgLTEuNTYwMjYxIDAuMDcyNTExIDAuMTYzNjIzCit2IC0xLjU2MDI2MiAtMi4yNzE1MzQgMC4xNjM2MjQKK3YgLTEuNTYwMjYxIDAuMDcyNTExIDAuMTYzNjIzCit2IC0xLjU2MDI2MSAxLjE0OTQyMyAwLjE2MzYyMwordiAtMS41NjAyNjEgMS4xOTA4MDYgMC4xNjM2MjMKK3YgLTEuNTYwMjYxIDEuMTQ5NDIzIDAuMTYzNjIzCit2IC0xLjU2MDI2MSAxLjg2NDM1MiAwLjE2MzYyMgordiAtMS41NjAyNjEgMS44NjQzNTIgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDEuODMyNzkxIDAuMTYzNjIyCit2IC0xLjU3NDc0OSAxLjg2NDM1MiAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ5IDEuODMyNzkwIC0wLjAxOTk1NwordiAtMS41NzQ3NDkgMS44MzI3OTAgLTAuMDE5OTU3Cit2IC0xLjU2MDI2MSAxLjIyMzk4OSAwLjE2MzYyMwordiAtMS41NjAyNjEgMS4yMjM5ODkgMC4xNjM2MjMKK3YgLTEuNTYwMjYxIDEuMTkwODA2IDAuMTYzNjIzCit2IC0xLjU2MDI2MSAxLjE5MDgwNiAwLjE2MzYyMwordiAtMS41NzQ3NDkgMS44MzI3OTAgLTAuMDE5OTU3Cit2IC0xLjU3NDc0OSAxLjgzMjc5MCAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ5IDEuMjI0MDI2IC0wLjAxOTk1NgordiAtMS41NzQ3NDkgMS4yMjQwMjYgLTAuMDE5OTU2Cit2IC0xLjU3NDc0OSAxLjIyNzIxNCAtMC4wMTk5NTYKK3YgLTEuNTc0NzQ5IDEuNzkxMzQ4IC0wLjAxOTk1NwordiAtMS41NzQ3NDkgMS43OTEzNDggLTAuMDE5OTU3Cit2IC0xLjU3NDc0OSAxLjc5NDY0OCAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ5IDEuNzk0NjQ4IC0wLjAxOTk1NwordiAtMS41NzE2MjEgMS43OTAzNTkgMC4wNTg5ODYKK3YgLTEuNTc1ODYwIDEuNzkwMzU5IDAuMDU4OTg2Cit2IC0xLjU3NTg2MCAxLjc5MDM1OSAwLjA1ODk4NgordiAxLjI3NTkyMiAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI3NTkyMCAtMC4yMjYxNjcgMC4wNTI2MTEKK3YgMS4yODAwMTcgLTAuMjI2MTY3IDAuMDUyNjExCit2IDEuMjgwMDE3IC0wLjIyNjE2NyAwLjA1MjYxMQordiAxLjI4MDAxNyAtMC4yMjYxNjcgMC4wNTI2MTEKK3YgMS4yODAwMTcgLTAuMjE4MTY1IDAuMDUyNjExCit2IDEuMjgwMDE3IC0wLjIxODE2NSAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU4MCAwLjAxOTg0OAordiAxLjI4MDAxNyAwLjY3MzU4MSAtMC4wMTI0ODAKK3YgMS4yODAwMTcgMC42NzM1ODEgLTAuMDEyNDgwCit2IDEuMjgwMDE3IDAuNjczNTgxIC0wLjAxMjQ4MAordiAxLjI4MDAxNyAwLjY3MzU4MiAtMC4wMTc5ODcKK3YgMS4yODAwMTcgMC42NzM1ODIgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIDAuNjc1ODUyIC0wLjAxNzk4NwordiAxLjI4MDAxNyAwLjY3MzU4MiAtMC4wMTc5ODcKK3YgMS4yNzg1MTUgMC42NzM1ODIgLTAuMDE5OTU4Cit2IDEuMjc4NTE1IDAuNjczNTgyIC0wLjAxOTk1OAordiAxLjI4MTUwMiAwLjY3NTg1MiAtMC4wMTc5ODcKK3YgMS4yODAwMTcgLTAuMjI2MTY5IDAuMDQyNDY5Cit2IDEuMjgwMDE3IC0wLjIyNjE3MSAwLjAxOTg0OAordiAxLjI4MDAxNyAtMC4yMjYxNjkgMC4wNDI0NjkKK3YgMS4yODAwMTcgLTAuMjI2MTcwIC0wLjAxMjQ4MAordiAxLjI4MDAxNyAtMC4yMjYxNzEgMC4wMTk4NDgKK3YgMS4yODAwMTcgLTAuMjI2MTcxIDAuMDE5ODQ4Cit2IDEuMjgwMDE3IC0wLjIyNjE3MCAtMC4wMTc5ODcKK3YgMS4yODAwMTcgLTAuMjI2MTcwIC0wLjAxMjQ4MAordiAxLjI4MDAxNyAtMC4yMjYxNzAgLTAuMDEyNDgwCit2IDEuMjc5NTM0IC0wLjIyODQyNCAtMC4wMTk5NzMKK3YgMS4yODAwMTcgLTAuMjI2MTcwIC0wLjAxNzk4NwordiAxLjI4MDAxNyAtMC4yMjYxNzAgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIC0wLjIyODQyNCAtMC4wMTc5ODcKK3YgMS4yNzk1MzQgLTAuMjI4NDI0IC0wLjAxOTk3MwordiAxLjI3NDc1OCAwLjY3MzU4MiAtMC4wMTk5NTgKK3YgMS4yNzk1MzQgMC42NzU4NTIgLTAuMDE5OTU1Cit2IDEuMjc5NTM0IDAuNjc1ODUyIC0wLjAxOTk1NQordiAxLjI3ODUxNSAwLjY3MzU4MiAtMC4wMTk5NTgKK3YgMS4yNzQ3NTggMC42NzM1ODIgLTAuMDE5OTU4Cit2IDEuMjc0NzU3IC0wLjIyNjE3MCAtMC4wMTk5NzYKK3YgMS4yNjczNTMgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI3NDc1NyAtMC4yMjYxNzAgLTAuMDE5OTc2Cit2IDEuMjgwMDE3IC0wLjIxODE2NSAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY2NjAxNyAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY2NjAxNyAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY2NjAxNyAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3OSAwLjA0MjUwNgordiAxLjI4MDAxNyAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3OSAwLjA0MjUwNgordiAxLjI4MDAxNyAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjA4NzIwNSAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjA4NzIwNSAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjQ5MzQ2MCAwLjAxOTg1MAordiAxLjI4MDAxNyAxLjQ5MzQ2MSAtMC4wMTI0ODAKK3YgMS4yODAwMTcgMS40OTM0NjEgLTAuMDEyNDgwCit2IDEuMjgwMDE3IDEuNDkzNDYxIC0wLjAxMjQ4MAordiAxLjI4MDAxNyAxLjQ5MzQ2MSAtMC4wMTc5ODcKK3YgMS4yODAwMTcgMS40OTM0NjEgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuNDk1NTkyIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjQ5NTU5MiAtMC4wMTc5ODcKK3YgMS4yODAwMTcgMS40OTM0NjEgLTAuMDE3OTg3Cit2IDEuMjc4NTE0IDEuNDkzNDYxIC0wLjAxOTk1NQordiAxLjI3ODUxNCAxLjQ5MzQ2MSAtMC4wMTk5NTUKK3YgMS4yNzk1MzQgMS40OTU1OTIgLTAuMDE5OTU2Cit2IDEuMjgxNTAzIDEuNDk1NTkyIC0wLjAxNzk4NwordiAxLjI4MDAxNyAxLjA3OTI0MyAwLjA0MjUwNgordiAxLjI4MDAxNyAxLjA3OTI0MyAwLjAxOTg0OAordiAxLjI4MDAxNyAxLjA3OTI0MyAwLjA0MjUwNgordiAxLjI4MDAxNyAxLjA3OTI0NCAtMC4wMTI0ODAKK3YgMS4yODAwMTcgMS4wNzkyNDMgMC4wMTk4NDgKK3YgMS4yODAwMTcgMS4wNzkyNDMgMC4wMTk4NDgKK3YgMS4yODAwMTcgMS4wNzkyNDQgLTAuMDE3OTg3Cit2IDEuMjgwMDE3IDEuMDc5MjQ0IC0wLjAxMjQ4MAordiAxLjI4MDAxNyAxLjA3OTI0NCAtMC4wMTI0ODAKK3YgMS4yODAwMTcgMS4wNzkyNDQgLTAuMDE3OTg3Cit2IDEuMjgwMDE3IDEuMDc5MjQ0IC0wLjAxNzk4NwordiAxLjI3NDc1OSAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNjczNjQgMS4wNzkyNDQgLTAuMDE5OTU1Cit2IDEuMjc0NzU5IDEuMDc5MjQ0IC0wLjAxOTk1NQordiAxLjI3NDc1NyAxLjQ5MzQ2MSAtMC4wMTk5NTUKK3YgMS4yNzg1MTQgMS40OTM0NjEgLTAuMDE5OTU1Cit2IDEuMjc0NzU3IDEuNDkzNDYxIC0wLjAxOTk1NQordiAxLjI4MDAxNyAxLjA4NzIwNSAwLjA1MjU4MAordiAxLjI4MDAxNyAxLjQ4NTQzNSAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ4NTQzNSAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ4NTQzNSAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI4MDAxNyAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OSAwLjA0MjU1NQordiAtMS41NzY3MTcgMS4yMjcyMTkgLTAuMDEyNDgxCit2IC0xLjU3NjcxNyAxLjIyNzIxNiAtMC4wMTc5ODgKK3YgLTEuNTc2NzE3IDEuMjI3MjE5IC0wLjAxMjQ4MQordiAtMS41NzY3MTcgMS4yMjcyMTYgLTAuMDE3OTg4Cit2IC0xLjU3NTgxMCAxLjIyODA1NCAtMC4wMTc5ODgKK3YgLTEuNTc0NDAwIDEuMjI4MDUxIC0wLjAxOTk2NQordiAtMS41NzQ0MDAgMS4yMjgwNTEgLTAuMDE5OTY1Cit2IC0xLjU3NDc0OSAxLjIyNzIxNCAtMC4wMTk5NTYKK3YgLTEuNTc2NzE3IDEuMjI3MjE2IC0wLjAxNzk4OAordiAtMS41NzA0OTEgMS4yMjgwNTAgLTAuMDE5OTY1Cit2IC0xLjU3NDc0OSAxLjIyNzIxNCAtMC4wMTk5NTYKK3YgLTEuNTc0NzQ5IDEuMjI3MjE0IC0wLjAxOTk1NgordiAtMS41NzQ0MDAgMS4yMjgwNTEgLTAuMDE5OTY1Cit2IC0xLjU3MDQ5MSAxLjIyODA1MCAtMC4wMTk5NjUKK3YgLTEuNTcwNzcwIDEuNzkwMzU3IC0wLjAxOTk1NgordiAtMS41NTcwMjcgMS43OTAzNTcgLTAuMDE5OTQzCit2IC0xLjU3MDc3MCAxLjc5MDM1NyAtMC4wMTk5NTYKK3YgLTEuNTc2NzE3IDEuNzkxMzUwIDAuMDU5NzkzCit2IC0xLjU3NjcxNyAxLjc5MTM1MCAwLjA1OTc5MwordiAxLjE3ODUxOSAtMi43MTYzNjIgLTAuMDE3OTg2Cit2IDEuMTc4NTE5IC0yLjcxNjM2MiAtMC4wMTI0NzkKK3YgMS4xNzg1MTkgLTIuNzE2MzYyIC0wLjAxMjQ3OQordiAtMS40NzMwODMgLTIuNzE2MTQ0IC0wLjAxNzk4NgordiAtMS40NzMwODMgLTIuNzE2MTQ0IC0wLjAxMjQ4MAordiAtMS40NzMwODMgLTIuNzE2MTQ0IC0wLjAxNzk4NgordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4xMzU4MDcKK3YgMS4xNjczNDIgLTIuNzA0OTgzIDAuMTYzNjI1Cit2IDEuMTY3MzQyIC0yLjcwNDk4MyAwLjE2MzYyNQordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMTM1ODA2Cit2IC0xLjQ2MTY2OSAtMi43MDQ3NzcgMC4xNjM2MjQKK3YgLTEuNDYxNjY5IC0yLjcwNDc3NyAwLjE2MzYyNAordiAxLjI2NDk2NCAtMi40NjY2NTUgMC4xNjM2MjUKK3YgMS4yMzg5MDAgLTIuNTk3NjQxIDAuMTYzNjI1Cit2IDEuMjY0OTY0IC0yLjQ2NjY1NSAwLjE2MzYyNQordiAxLjE2NzM0MiAtMi43MDQ5ODMgMC4xNjM2MjUKK3YgMS4yMzg5MDAgLTIuNTk3NjQxIDAuMTYzNjI1Cit2IDEuMjI3NzkwIC0yLjU5Mjk3MyAwLjE2MzYyNQordiAxLjIyNzc5MCAtMi41OTI5NzMgMC4xNjM2MjUKK3YgMS4xNjczNDIgLTIuNzA0OTgzIDAuMTYzNjI1Cit2IDEuMDU5MTk0IC0yLjc3NzM2NCAwLjE2MzYyNQordiAxLjE2NzM0MiAtMi43MDQ5ODMgMC4xNjM2MjUKK3YgMS4wNTkxOTQgLTIuNzc3MzY0IDAuMTYzNjI1Cit2IDAuOTMzMDAzIC0yLjgwMjY4MyAwLjE2MzYyNQordiAxLjA1OTE5NCAtMi43NzczNjQgMC4xNjM2MjUKK3YgMC45MzMwMDMgLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNzQ3MTA4IC0yLjgwMjY4MyAwLjE2MzYyNQordiAwLjkzMzAwMyAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC43NDcxMDggLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNjMzMDk2IC0yLjgwMjY4MyAwLjE2MzYyNQordiAwLjc0NzEwOCAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC42MzMwOTYgLTIuODAyNjgzIDAuMTYzNjI1Cit2IC0xLjA0MjM0NSAtMi44MDI2ODIgMC4xNjM2MjQKK3YgLTEuMjIwNjk3IC0yLjgwMjY4MiAwLjE2MzYyNAordiAtMS4wNDIzNDUgLTIuODAyNjgyIDAuMTYzNjI0Cit2IC0xLjM1NDQ3NCAtMi43Nzc1MDUgMC4xNjM2MjQKK3YgLTEuMjIwNjk3IC0yLjgwMjY4MiAwLjE2MzYyNAordiAtMS4zNTQ0NzQgLTIuNzc3NTA1IDAuMTYzNjI0Cit2IC0xLjQ2MTY2OSAtMi43MDQ3NzcgMC4xNjM2MjQKK3YgLTEuMzU0NDc0IC0yLjc3NzUwNSAwLjE2MzYyNAordiAtMS40NjE2NjkgLTIuNzA0Nzc3IDAuMTYzNjI0Cit2IC0xLjUzNDIzMSAtMi41OTY5OTQgMC4xNjM2MjQKK3YgLTEuNDYxNjY5IC0yLjcwNDc3NyAwLjE2MzYyNAordiAtMS40NTMxNjEgLTIuNjk2MjY5IDAuMTYzNjI0Cit2IC0xLjQ1MzE2MSAtMi42OTYyNjkgMC4xNjM2MjQKK3YgLTEuNTM0MjMxIC0yLjU5Njk5NCAwLjE2MzYyNAordiAtMS41NjAyNjIgLTIuNDY2NjI5IDAuMTYzNjI0Cit2IC0xLjUzNDIzMSAtMi41OTY5OTQgMC4xNjM2MjQKK3YgLTEuNTYwMjYyIC0yLjQ2NjYyOSAwLjE2MzYyNAordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4xMzA4ODAKK3YgMS4xNzg1MTggLTIuNzE2MzYyIDAuMTMwODgwCit2IDEuMTc4NTE4IC0yLjcxNjM2MiAwLjEzNTgwNwordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMTM1ODA2Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4xMzA4NzkKK3YgMS4yMjc3OTAgLTIuNTkyOTczIDAuMTYzNjI1Cit2IDEuMjI3NzkwIC0yLjU5Mjk3MyAwLjE2MzYyNQordiAxLjIyMDM4NCAtMi41ODk4OTQgMC4xNjA5NTMKK3YgLTEuNDUzMTYxIC0yLjY5NjI2OSAwLjE2MzYyNAordiAtMS40NTMxNjEgLTIuNjk2MjY5IDAuMTYzNjI0Cit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNjA5NTIKK3YgLTEuMzYwMjMxIC0yLjc5MDM1MiAtMC4wMTk5NTUKK3YgLTEuMzYwMjMxIC0yLjc5MDM1MiAtMC4wMTk5NTUKK3YgLTEuMzU4NTk2IC0yLjc4NjQ1OCAtMC4wMTk5NTUKK3YgMS4yNDgxODQgLTIuNjAxNjM2IC0wLjAxOTk1NAordiAxLjI1MTkzMyAtMi42MDMyMDggLTAuMDE5OTU0Cit2IDEuMjQ4MTg0IC0yLjYwMTYzNiAtMC4wMTk5NTQKK3YgMS4yNTE5MzMgLTIuNjAzMjA4IC0wLjAxOTk1NAordiAxLjI3OTUzMyAtMi40NjY2NjcgLTAuMDE5OTU0Cit2IDEuMjgxNTAyIC0yLjQ2NjY2OCAtMC4wMTc5ODYKK3YgMS4yODE1MDIgLTIuNDY2NjY4IC0wLjAxNzk4NgordiAxLjI1Mzc4NSAtMi42MDQwNTkgLTAuMDE3OTg1Cit2IDEuMjUxOTMzIC0yLjYwMzIwOCAtMC4wMTk5NTQKK3YgMS4yNTM3ODUgLTIuNjA0MDU5IC0wLjAxNzk4NQordiAxLjI1Mzc4NSAtMi42MDQwNTkgLTAuMDE3OTg1Cit2IDEuMTc4NTE5IC0yLjcxNjM2MiAtMC4wMTc5ODYKK3YgMS4xNzg1MTkgLTIuNzE2MzYyIC0wLjAxNzk4NgordiAxLjE3ODUxOSAtMi43MTYzNjIgLTAuMDE3OTg2Cit2IDEuMDY1MzgxIC0yLjc5MjE5NiAtMC4wMTc5ODYKK3YgMS4wNjUzODEgLTIuNzkyMTk2IC0wLjAxNzk4NgordiAxLjA2NTM4MSAtMi43OTIxOTYgLTAuMDE3OTg2Cit2IDAuOTM1MzA1IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMDQyMzQ1IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMDQyMzQ1IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMjIyMzAzIC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMzYwMjMxIC0yLjc5MDM1MiAtMC4wMTk5NTUKK3YgLTEuMjIyMzAzIC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMjIyMzAzIC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgLTEuMzYxMDA3IC0yLjc5MjIwMiAtMC4wMTc5ODYKK3YgLTEuMzYwMjMxIC0yLjc5MDM1MiAtMC4wMTk5NTUKK3YgLTEuNTc0NzUwIC0yLjQ2NjYyOSAtMC4wMTk5NTUKK3YgLTEuNTQ3MTYyIC0yLjYwMzA5NCAtMC4wMTk5NTUKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAtMC4wMTc5ODcKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAtMC4wMTc5ODcKK3YgLTEuNTc2NzE4IC0yLjQ2NjYyOSAtMC4wMTc5ODcKK3YgLTEuNTc0NzUwIC0yLjQ2NjYyOSAtMC4wMTk5NTUKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAtMC4wMTc5ODYKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAtMC4wMTc5ODYKK3YgLTEuNTQ5MDE0IC0yLjYwMzk0NyAtMC4wMTc5ODcKK3YgLTEuMzYxMDA3IC0yLjc5MjIwMiAtMC4wMTc5ODYKK3YgLTEuMzYxMDA3IC0yLjc5MjIwMiAtMC4wMTc5ODYKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAtMC4wMTc5ODYKK3YgMC44MzYxODkgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjgyOTIyMSAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuODI5MjIxIC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMS4xNzg1MTkgLTIuNzE2MzYyIC0wLjAxMjQ3OQordiAxLjE3ODUxOSAtMi43MTYzNjIgLTAuMDEyNDc5Cit2IDEuMTc4NTE5IC0yLjcxNjM2MiAwLjAxOTg0NwordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMDE5ODQ3Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgLTAuMDEyNDgwCit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4wMTk4NDcKK3YgMS4xNzg1MTggLTIuNzE2MzYyIDAuMDY4NDE0Cit2IDEuMTc4NTE4IC0yLjcxNjM2MiAwLjA2ODQxNAordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4xMTA0MTYKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAwLjExMDQxNQordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMDY4NDEzCit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4xMTA0MTUKK3YgMS4xNzg1MTkgLTIuNzE2MzYyIDAuMDE5ODQ3Cit2IDEuMTc4NTE5IC0yLjcxNjM2MiAwLjAxOTg0NwordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4wNjg0MTQKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAwLjA2ODQxMwordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMDE5ODQ3Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4wNjg0MTMKK3YgMC42NjA1MDYgLTIuODE5MTgzIC0wLjAxNzk5NAordiAwLjYzMzA5NiAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNjYwNTA2IC0yLjgxOTE4MyAtMC4wMTc5OTQKK3YgMC42NjYzOTIgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjY2MDUwNiAtMi44MTkxODMgLTAuMDE3OTk0Cit2IDAuNjYwNTA2IC0yLjgxOTE4MyAtMC4wMTc5OTQKK3YgMC44MzYxODkgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjkzNTMwNSAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuODM2MTg5IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMS4xNzg1MTggLTIuNzE2MzYyIDAuMTEwNDE2Cit2IDEuMTc4NTE4IC0yLjcxNjM2MiAwLjExMDQxNgordiAxLjE3ODUxOCAtMi43MTYzNjIgMC4xMzA4ODAKK3YgLTEuNDczMDgzIC0yLjcxNjE0NCAwLjEzMDg3OQordiAtMS40NzMwODMgLTIuNzE2MTQ0IDAuMTEwNDE1Cit2IC0xLjQ3MzA4MyAtMi43MTYxNDQgMC4xMzA4NzkKK3YgMC44MjkyMjEgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjgyODI3MiAtMi44MTgzOTMgLTAuMDE3OTg2Cit2IDAuODI4MjcyIC0yLjgxODM5MyAtMC4wMTc5ODYKK3YgMC44MjY4MTcgLTIuODE4Mzk3IC0wLjAxMjQ3OQordiAwLjgyNjgxNyAtMi44MTgzOTcgLTAuMDEyNDc5Cit2IDAuODI4MjcyIC0yLjgxODM5MyAtMC4wMTc5ODYKK3YgMC44MjY4MTcgLTIuODE4Mzk3IC0wLjAxMjQ3OQordiAwLjgyNzY4NSAtMi44MTkxODMgLTAuMDEyNDc5Cit2IDAuODI3Njg1IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC44MTg3ODUgLTIuODE5MTg0IDAuMDE5ODQ2Cit2IDAuNzQ3MDg2IC0yLjgxODM5NyAwLjA2MDI5MAordiAwLjY2NzM0NCAtMi44MTgzOTMgLTAuMDE3OTg2Cit2IDAuNjY3MzQ0IC0yLjgxODM5MyAtMC4wMTc5ODYKK3YgMC42Njg4NTEgLTIuODE4Mzk3IC0wLjAxMjQ3OQordiAwLjY2NjM5MiAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNjY2OTI0IC0yLjgxNjA2NCAtMC4wMTk2MjgKK3YgMC42NjY5MjQgLTIuODE2MDY0IC0wLjAxOTYyOAordiAwLjY2NzM0NCAtMi44MTgzOTMgLTAuMDE3OTg2Cit2IDAuNjY2MzkyIC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC44Mjg2OTYgLTIuODExMjQ2IC0wLjAxOTYyOAordiAwLjgyODY5NyAtMi43OTQ2NTAgLTAuMDE5NjI4Cit2IDAuODI4Njk2IC0yLjgxMTI0NiAtMC4wMTk2MjgKK3YgMC42NjY5MjcgLTIuODExMjQ2IC0wLjAxOTYyOAordiAwLjY2NjkyNCAtMi44MTYwNjQgLTAuMDE5NjI4Cit2IDAuNjY2OTI3IC0yLjgxMTI0NiAtMC4wMTk2MjgKK3YgMS4yODE1MDIgLTIuMjcxNTM2IC0wLjAxNzk4NgordiAxLjI4MTUwMiAtMi4yNzE1MzYgLTAuMDE3OTg2Cit2IDEuMjgxNTAyIC0yLjQ2NjY2OCAtMC4wMTc5ODYKK3YgMS4yNjQ5NjQgLTIuNDY2NjU1IDAuMTYzNjI1Cit2IDEuMjY0OTY0IC0yLjQ2NjY1NSAwLjE2MzYyNQordiAxLjI2NDk2NCAtMi4yNzE1MzUgMC4xNjM2MjUKK3YgLTEuNTYwMjYyIC0yLjI3MTUzNCAwLjE2MzYyNAordiAtMS41NjAyNjIgLTIuNDY2NjI5IDAuMTYzNjI0Cit2IC0xLjU2MDI2MiAtMi4yNzE1MzQgMC4xNjM2MjQKK3YgLTEuNTc0NzUwIC0yLjI3MTUzNCAtMC4wMTk5NTUKK3YgLTEuNTc0NzUwIC0yLjI3MTUzNCAtMC4wMTk5NTUKK3YgLTEuNTc0NzUwIC0yLjQ2NjYyOSAtMC4wMTk5NTUKK3YgMC4xNDAyMzIgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjA0MDc2NiAtMi44MTkxODMgLTAuMDE3OTc0Cit2IDAuMTQwMjMyIC0yLjgxOTE4MyAtMC4wMTc5ODcKK3YgMC4wMzMyOTEgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjAzMzI5MSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IDAuMDQwNzY2IC0yLjgxOTE4MyAtMC4wMTc5NzQKK3YgLTAuMDEzNTY2IC0yLjgwMjY4MyAwLjE2MzYyNAordiAwLjAyODg1NyAtMi44MDI2ODMgMC4xNjM2MjQKK3YgMC4wMjg4NTcgLTIuODAyNjgzIDAuMTYzNjI0Cit2IDAuMDQxNDA0IC0yLjgxODM5NyAwLjAxOTg0OAordiAwLjAzNjEzNCAtMi44MTgzOTcgLTAuMDEyNDgwCit2IDAuMDM2MTM0IC0yLjgxODM5NyAtMC4wMTI0ODAKK3YgMC4wMzY5ODEgLTIuODE5MTgzIC0wLjAxMjQ4MAordiAwLjAzNjEzNCAtMi44MTgzOTcgLTAuMDEyNDgwCit2IDAuMDMyMzgyIC0yLjgxODM5MCAtMC4wMTc5ODcKK3YgMC4wMzIzODIgLTIuODE4MzkwIC0wLjAxNzk4NwordiAwLjAzMzI5MSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IDAuMDM2OTgxIC0yLjgxOTE4MyAtMC4wMTI0ODAKK3YgMC4wMzMyOTEgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjAzMjM4MiAtMi44MTgzOTAgLTAuMDE3OTg3Cit2IDAuMDMxODY2IC0yLjgxNjA2NiAtMC4wMTk1NjUKK3YgMC4wMzE4NjYgLTIuODE2MDY2IC0wLjAxOTU2NQordiAwLjAzMjE0MSAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IDAuMDMzMjkxIC0yLjgxOTE4MyAtMC4wMTc5ODcKK3YgMC4wMzIxNDEgLTIuODExNDk4IC0wLjAxOTk1NQordiAwLjAzMjE0MSAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IDAuMDMyMTQxIC0yLjgxNjQwOSAtMC4wMTk5NTUKK3YgMC4wMzQ4NDMgLTIuODE4Mzk3IDAuMDUwNjIwCit2IDAuMDM0ODQzIC0yLjgxODM5NyAwLjA1MDYyMAordiAwLjAxNTgwMCAtMi44MDMzMTIgMC4wNzA4MzEKK3YgMC4wMTU4MDAgLTIuNzUxMzUzIDAuMDcwODMxCit2IDAuMDE1ODAwIC0yLjc1MTM1MyAwLjA3MDgzMQordiAwLjA0MTQwNCAtMi44MTgzOTcgMC4wMTk4NDgKK3YgMC4wNDIyNTEgLTIuODE5MTg0IDAuMDE5ODQ4Cit2IDAuMDM1NTA4IC0yLjgxOTE4NCAwLjA1MTA3MwordiAwLjAzNTUwOCAtMi44MTkxODQgMC4wNTEwNzMKK3YgMC4wMzQ4NDMgLTIuODE4Mzk3IDAuMDUwNjIwCit2IDAuMDQxNDA0IC0yLjgxODM5NyAwLjAxOTg0OAordiAwLjAyODg1NyAtMi44MDI2ODMgMC4xNjM2MjQKK3YgMC4wMjg4NTcgLTIuODAyNjgzIDAuMTYzNjI0Cit2IDAuMTQwMjMyIC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC40MzUwNzQgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4zMzY2ODAgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC40MzUwNzQgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4zMzY2ODAgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4zMjg1NzUgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4zMjg1NzUgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMC4yODEzNDkgLTIuODAyNjgzIDAuMTYzNjI0Cit2IC0wLjMyMTIwNyAtMi44MDI2ODMgMC4xNjM2MjQKK3YgLTAuMjgxMzQ5IC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC4zMzEyNDUgLTIuODE4Mzk3IC0wLjAxMjQ4MAordiAtMC4zMzEyNDUgLTIuODE4Mzk3IC0wLjAxMjQ4MAordiAtMC4zMzY1OTggLTIuODE4Mzk3IDAuMDE5ODQ3Cit2IC0wLjMzMjA5MyAtMi44MTkxODMgLTAuMDEyNDgwCit2IC0wLjMyODU3NSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IC0wLjMyNzYwOSAtMi44MTgzOTEgLTAuMDE3OTg3Cit2IC0wLjMyNzYwOSAtMi44MTgzOTEgLTAuMDE3OTg3Cit2IC0wLjMzMTI0NSAtMi44MTgzOTcgLTAuMDEyNDgwCit2IC0wLjMzMjA5MyAtMi44MTkxODMgLTAuMDEyNDgwCit2IC0wLjMyODU3NSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IC0wLjMyNzQwMCAtMi44MTY0MDkgLTAuMDE5OTU1Cit2IC0wLjMyNjc3NCAtMi44MTYwNjYgLTAuMDE5NTUwCit2IC0wLjMyNjc3NCAtMi44MTYwNjYgLTAuMDE5NTUwCit2IC0wLjMyNzYwOSAtMi44MTgzOTEgLTAuMDE3OTg3Cit2IC0wLjMyODU3NSAtMi44MTkxODMgLTAuMDE3OTg3Cit2IC0wLjMyNjc3MyAtMi44MDE1MDYgLTAuMDE5NTUwCit2IC0wLjMyNjc3NCAtMi44MTYwNjYgLTAuMDE5NTUwCit2IC0wLjMyNjc3MyAtMi44MDE1MDYgLTAuMDE5NTUwCit2IC0wLjMzMDA0NiAtMi44MTgzOTcgMC4wNTA1OTcKK3YgLTAuMzMwMDQ2IC0yLjgxODM5NyAwLjA1MDU5NwordiAtMC4zMTA5NDIgLTIuNzUxMzUzIDAuMDcwODcwCit2IC0wLjMxMDk0MiAtMi44MDMzMTIgMC4wNzA4NzAKK3YgLTAuMzEwOTQyIC0yLjc1MTM1MyAwLjA3MDg3MAordiAtMC4zMzY1OTggLTIuODE4Mzk3IDAuMDE5ODQ3Cit2IC0wLjMzMDA0NiAtMi44MTgzOTcgMC4wNTA1OTcKK3YgLTAuMzM2NTk4IC0yLjgxODM5NyAwLjAxOTg0NwordiAtMC4zMjEyMDcgLTIuODAyNjgzIDAuMTYzNjI0Cit2IC0wLjQzNTA3NCAtMi44MDI2ODIgMC4xNjM2MjQKK3YgLTAuMzIxMjA3IC0yLjgwMjY4MyAwLjE2MzYyNAordiAwLjE0MDIzMiAtMi44MTkxODMgLTAuMDE3OTg3Cit2IDAuNDAzNzc4IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC4xNDAyMzIgLTIuODE5MTgzIC0wLjAxNzk4NwordiAwLjE0MDIzMiAtMi44MDI2ODMgMC4xNjM2MjQKK3YgMC40MDM3NzggLTIuODAyNjgzIDAuMTYzNjI0Cit2IDAuMTQwMjMyIC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC40MzUwNzQgLTIuODE5MTgzIC0wLjAxNzk4NwordiAtMS4wNDIzNDUgLTIuODAyNjgyIDAuMTYzNjI0Cit2IC0wLjQzNTA3NCAtMi44MDI2ODIgMC4xNjM2MjQKK3YgLTEuMDQyMzQ1IC0yLjgwMjY4MiAwLjE2MzYyNAordiAtMS4wNDIzNDUgLTIuODE5MTgzIC0wLjAxNzk4NgordiAtMS4wNDIzNDUgLTIuODE5MTgzIC0wLjAxNzk4NgordiAtMC4yODEzNDUgLTIuODE4Mzk3IDAuMDc5NjIyCit2IC0wLjI4MTM0NSAtMi44MTgzOTcgMC4wNzk2MjIKK3YgLTAuMjgxMzQ1IC0yLjgxOTE4NCAwLjA4MDQwMQordiAtMC4yODEzNDUgLTIuODE4Mzk3IDAuMDc5NjIyCit2IC0wLjE0NzYxMSAtMi44MTkxODQgMC4wODA0MDEKK3YgLTAuMjgxMzQ5IC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMC4yODEzNDkgLTIuODAyNjgzIDAuMTYzNjI0Cit2IC0wLjE0NzYxMSAtMi44MDI2ODMgMC4xNjM2MjQKK3YgLTAuMDEzNTY5IC0yLjgxODM5NyAwLjA3OTYyMgordiAtMC4wMTM1NjkgLTIuODE5MTg0IDAuMDgwNDAxCit2IC0wLjAxMzU2OSAtMi44MTgzOTcgMC4wNzk2MjIKK3YgLTAuMTQ3NjExIC0yLjgxOTE4NCAwLjA4MDQwMQordiAtMC4xNDc2MTEgLTIuODAyNjgzIDAuMTYzNjI0Cit2IC0wLjAxMzU2NiAtMi44MDI2ODMgMC4xNjM2MjQKK3YgLTAuMDEzNTY2IC0yLjgwMjY4MyAwLjE2MzYyNAordiAtMS40NDc2MTEgMi44Mzg0NzkgMC4xNjA5NTAKK3YgLTEuNDQ3NjExIDIuODM4NDc5IDAuMTYwOTUwCit2IC0xLjUxNTY1NiAyLjczNzQxNyAwLjE2MDk1MAordiAtMS41MTU2NTYgMi43Mzc0MTcgMC4xNjA5NTAKK3YgLTEuNTE1NjU2IDIuNzM3NDE3IDAuMTYwOTUwCit2IC0xLjU0MDU3NiAyLjYxNDg0MCAwLjE2MDk1MAordiAtMS41NDA1NzYgMi40MTY1NTUgMC4xNjA5NTAKK3YgLTEuNTQwNTc2IDIuNjE0ODQwIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAyLjQxNjU1NSAwLjE2MDk1MAordiAtMS41NDA1NzcgLTIuMjcxNTM0IDAuMTYwOTUyCit2IC0xLjU0MDU3NiAwLjA3MjUxMCAwLjE2MDk1MQordiAtMS41NDA1NzcgLTIuMjcxNTM0IDAuMTYwOTUyCit2IDEuMjQ1MjgwIDEuNzc5MDM5IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDEuNTIzODUzIDAuMTYwOTUxCit2IDEuMjQ1MjgwIDEuNzc5MDM5IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNDE2NTU0IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNjE0OTA2IDAuMTYwOTUxCit2IDEuMjIwMzMwIDIuNzM3Mzk2IDAuMTYwOTUxCit2IDEuMjIwMzMwIDIuNzM3Mzk2IDAuMTYwOTUxCit2IDEuMjIwMzMwIDIuNzM3Mzk2IDAuMTYwOTUxCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwOTUxCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwMjU2Cit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwOTUxCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwOTUxCit2IDEuMDUxNzYyIDIuOTA2MzA4IDAuMTYwOTUxCit2IDEuMDUxNzYyIDIuOTA2MzA4IDAuMTYwOTUxCit2IDEuMDUxNzYyIDIuOTA2MzA4IDAuMTYwOTUxCit2IDAuOTI5MjY3IDIuOTMyMDI4IDAuMTYwOTUxCit2IDAuNjMzMTExIDIuOTMyMDI4IDAuMTYwOTUxCit2IDAuOTI5MjY3IDIuOTMyMDI4IDAuMTYwOTUxCit2IDAuNjMzMTExIDIuOTMyMDI4IDAuMTYwOTUxCit2IC0wLjk4NDM0NCAyLjkzMjAyOCAwLjE2MDk1MAordiAtMC45ODQzNDQgMi45MzIwMjggMC4xNjA5NTAKK3YgLTEuMDQyMzQzIDIuOTMyMDI4IDAuMTYwOTUwCit2IC0xLjIxOTU0OCAyLjkzMjAyMiAwLjE2MDk1MAordiAtMS4wNDIzNDMgMi45MzIwMjggMC4xNjA5NTAKK3YgLTEuMjE5NTQ4IDIuOTMyMDIyIDAuMTYwOTUwCit2IC0xLjIxOTU0OCAyLjkzMjAyMiAwLjE2MDk1MAordiAtMS4yMTk1NDggMi45MzIwMjIgMC4xNjA5NTAKK3YgLTEuMzQ3MDQ3IDIuOTA2NDM1IDAuMTYwOTUwCit2IC0xLjQ0NzYxMSAyLjgzODQ3OSAwLjE2MDI1NgordiAtMS4zNDcwNDcgMi45MDY0MzUgMC4xNjA5NTAKK3YgLTEuMzQ3MDQ3IDIuOTA2NDM1IDAuMTYwOTUwCit2IC0xLjQ0NzYxMSAyLjgzODQ3OSAwLjE2MDk1MAordiAtMS40NDc2MTEgMi44Mzg0NzkgMC4xNjAyNTYKK3YgLTAuMjAyNjg1IDIuOTMyMDI4IDAuMTYwOTUxCit2IDAuNTIyNzI3IDIuOTMyMDI4IDAuMTYwOTUxCit2IC0wLjIwMjY4NSAyLjkzMjAyOCAwLjE2MDk1MQordiAtMC45MjgwOTggMi45MzIwMjggMC4xNjA5NTEKK3YgLTAuOTI4MDk4IDIuOTMyMDI4IDAuMTYwOTUxCit2IC0wLjk4NDM0NCAyLjkzMjAyOCAwLjE2MDk1MAordiAwLjU4MDM1NiAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjU4MDM1NiAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjUyMjcyNyAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjYzMzExMSAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjYzMzExMSAyLjkzMjAyOCAwLjE2MDk1MQordiAwLjU4MDM1NiAyLjkzMjAyOCAwLjE2MDk1MQordiAxLjI0NTI4MCAtMC4yNjc2MzYgMC4xNjA5NTIKK3YgMS4yNDUyODAgLTAuMjY3NjM2IDAuMTYwOTUyCit2IDEuMjQ1MjgwIC0wLjI0MTU3NCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjcwMjQ4MCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjQ4NTQ1MSAwLjE2MDk1MQordiAxLjI0NTI4MCAxLjQ4NTQ1MSAwLjE2MDk1MQordiAxLjI0NTI4MCAxLjUwNTMxMCAwLjE2MDk1MQordiAxLjI0NTI4MCAxLjQ4NTQ1MSAwLjE2MDk1MQordiAxLjI0NTI4MCAxLjA4NzE5OCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjQ4NTQ1MSAwLjE2MDk1MQordiAxLjI0NTI4MCAwLjY2NjAyMSAwLjE2MDk1MgordiAxLjI0NTI4MCAtMC4yMTgyMjUgMC4xNjA5NTIKK3YgMS4yNDUyODAgMC42NjYwMjEgMC4xNjA5NTIKK3YgMS4yNDUyODAgLTAuMjQxNTc0IDAuMTYwOTUyCit2IDEuMjQ1MjgwIC0wLjI0MTU3NCAwLjE2MDk1MgordiAxLjI0NTI4MCAtMC4yMTgyMjUgMC4xNjA5NTIKK3YgMS4yNDUyODAgLTAuMjY3NjM2IDAuMTYwOTUyCit2IDEuMjQ1Mjc5IC0yLjI3MTUzNSAwLjE2MDk1MwordiAxLjI0NTI4MCAtMC4yNjc2MzYgMC4xNjA5NTIKK3YgMS4yNDUyODAgMS41MDUzMTAgMC4xNjA5NTEKK3YgMS4yNDUyODAgMS41MDUzMTAgMC4xNjA5NTEKK3YgMS4yNDUyODAgMS41MjM4NTMgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDEuMTkwODA2IDAuMTYwOTUxCit2IC0xLjU0MDU3NiAxLjE5MDgwNiAwLjE2MDk1MQordiAtMS41NDA1NzYgMS4xNDk0MjMgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDEuMjIzOTg5IDAuMTYwOTUxCit2IC0xLjU0MDU3NiAxLjIyMzk4OSAwLjE2MDk1MQordiAtMS41NDA1NzYgMS4xOTA4MDYgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDEuODY0MzUyIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAyLjQxNjU1NSAwLjE2MDk1MAordiAtMS41NDA1NzYgMS44NjQzNTIgMC4xNjA5NTAKK3YgLTEuNTQwNTc2IDEuODMyNzkxIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAxLjgzMjc5MSAwLjE2MDk1MAordiAxLjIyMDM4NCAtMi41ODk4OTQgMC4xNjA5NTMKK3YgMS4yMjAzODQgLTIuNTg5ODk0IDAuMTYwOTUzCit2IDEuMjQ1Mjc5IC0yLjQ2NjY0OSAwLjE2MDk1MwordiAxLjE1MzE2MiAtMi42OTA4MDMgMC4xNjA5NTMKK3YgMS4xNTMxNjIgLTIuNjkwODAzIDAuMTYwOTUzCit2IDEuMjIwMzg0IC0yLjU4OTg5NCAwLjE2MDk1MwordiAxLjE1MzA4MyAtMi42OTA4MDMgMC4xNjAyNTgKK3YgMS4wNTE0ODEgLTIuNzU4NzcxIDAuMTYwOTUzCit2IDEuMDUxNDgxIC0yLjc1ODc3MSAwLjE2MDk1MwordiAxLjE1MzE2MiAtMi42OTA4MDMgMC4xNjA5NTMKK3YgMS4xNTMwODMgLTIuNjkwODAzIDAuMTYwMjU4Cit2IDAuOTI5ODkzIC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjkyOTg5MyAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMS4wNTE0ODEgLTIuNzU4NzcxIDAuMTYwOTUzCit2IDAuOTI5ODkzIC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjc0NzEwOCAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC45Mjk4OTMgLTIuNzgyOTk3IDAuMTYwOTUzCit2IC0xLjA0MjM0NSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTEuMjE4NzE5IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMS4wNDIzNDUgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0xLjM0NjcyMyAtMi43NTg5ODkgMC4xNjA5NTIKK3YgLTEuMzQ2NzIzIC0yLjc1ODk4OSAwLjE2MDk1MgordiAtMS4yMTg3MTkgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNjA5NTIKK3YgLTEuNDQ3NDg5IC0yLjY5MDU5NyAwLjE2MDk1MgordiAtMS4zNDY3MjMgLTIuNzU4OTg5IDAuMTYwOTUyCit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNjAyNTcKK3YgLTEuNTE1NzE1IC0yLjU4OTIzNyAwLjE2MDk1MgordiAtMS41MTU3MTUgLTIuNTg5MjM3IDAuMTYwOTUyCit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNjA5NTIKK3YgLTEuNDQ3NDg5IC0yLjY5MDU5NyAwLjE2MDI1NwordiAtMS41NDA1NzcgLTIuNDY2NjI5IDAuMTYwOTUyCit2IC0xLjU0MDU3NyAtMi40NjY2MjkgMC4xNjA5NTIKK3YgLTEuNTE1NzE1IC0yLjU4OTIzNyAwLjE2MDk1MgordiAwLjYzMzA5NiAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC42MzMwOTYgLTIuNzgyOTk3IDAuMTYwOTUzCit2IDAuNzQ3MTA4IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAxLjI0NTI3OSAtMi4yNzE1MzUgMC4xNjA5NTMKK3YgMS4yNDUyNzkgLTIuNDY2NjQ5IDAuMTYwOTUzCit2IDEuMjQ1Mjc5IC0yLjI3MTUzNSAwLjE2MDk1MwordiAtMS41NDA1NzcgLTIuNDY2NjI5IDAuMTYwOTUyCit2IC0xLjU0MDU3NyAtMi4yNzE1MzQgMC4xNjA5NTIKK3YgLTEuNTQwNTc3IC0yLjQ2NjYyOSAwLjE2MDk1MgordiAtMC4wMTM1NjYgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjAxMzU2NiAtMi43ODI5OTcgMC4xNjA5NTIKK3YgMC4wMjg4NTcgLTIuNzgyOTk3IDAuMTYwOTUyCit2IDAuMDI4ODU3IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAwLjAyODg1NyAtMi43ODI5OTcgMC4xNjA5NTIKK3YgMC4xNDAyMzIgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjMyMTIwNyAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuMzIxMjA3IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC4yODEzNDkgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjQzNTA3NCAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuNDM1MDc0IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC4zMjEyMDcgLTIuNzgyOTk3IDAuMTYwOTUyCit2IDAuNDAzNzc4IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAwLjE0MDIzMiAtMi43ODI5OTcgMC4xNjA5NTIKK3YgMC40MDM3NzggLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjQzNTA3NCAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTEuMDQyMzQ1IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC40MzUwNzQgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjE0NzYxMSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuMTQ3NjExIC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC4wMTM1NjYgLTIuNzgyOTk3IDAuMTYwOTUyCit2IC0wLjI4MTM0OSAtMi43ODI5OTcgMC4xNjA5NTIKK3YgLTAuMjgxMzQ5IC0yLjc4Mjk5NyAwLjE2MDk1MgordiAtMC4xNDc2MTEgLTIuNzgyOTk3IDAuMTYwOTUyCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTU3MDkyCit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwMjU2Cit2IDEuMTUyNTkzIDIuODM4MjkxIDAuMTYwMjU2Cit2IC0xLjQ0NzYxMSAyLjgzODQ3OSAwLjE1NzA5MQordiAtMS40NDc2MTEgMi44Mzg0NzkgMC4xNjAyNTYKK3YgLTEuNDQ3NjExIDIuODM4NDc5IDAuMTU3MDkxCit2IDEuMTUzMDgzIC0yLjY5MDgwMyAwLjE1NzA5NAordiAxLjE1MzA4MyAtMi42OTA4MDMgMC4xNjAyNTgKK3YgMS4xNTMwODMgLTIuNjkwODAzIDAuMTU3MDk0Cit2IC0xLjQ0NzQ4OSAtMi42OTA1OTcgMC4xNTcwOTMKK3YgLTEuNDQ3NDg5IC0yLjY5MDU5NyAwLjE2MDI1NwordiAtMS40NDc0ODkgLTIuNjkwNTk3IDAuMTU3MDkzCit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjA1MTg5NQordiAtMS41NzU5MzAgMS4yMjgwNDQgMC4wNTE4OTUKK3YgLTEuNTc1OTMwIDEuMjI4MDQ0IDAuMDE5ODQ4Cit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjAxOTg0OAordiAtMS41NzU5MzAgMS4yMjgwNDQgLTAuMDEyNDgxCit2IC0xLjU3NTg1NiAxLjc5MDM1NyAtMC4wMTI0NzgKK3YgLTEuNTc1ODU2IDEuNzkwMzU3IC0wLjAxMjQ3OAordiAtMS41NzU4NTggMS43OTAzNTcgMC4wMTk4NTAKK3YgLTEuNTc1ODU4IDEuNzkwMzU3IDAuMDE5ODUwCit2IC0xLjU3NTg2MCAxLjc5MDM1OSAwLjA1NjQxOQordiAtMS41NzU4NTggMS43OTAzNTcgMC4wMTk4NTAKK3YgLTEuNTc1ODU2IDEuNzkwMzU3IC0wLjAxMjQ3OAordiAtMS41NzU4NTYgMS43OTAzNTcgLTAuMDEyNDc4Cit2IC0xLjU3NTg1NSAxLjc5MDM1NyAtMC4wMTc5ODgKK3YgLTEuNTYwMjYxIDEuMjMwMDA2IDAuMTYzNjIzCit2IC0xLjU2MDI2MSAxLjQ1MzA1NiAwLjE2MzYyMwordiAtMS41NjAyNjEgMS40NTMwNTYgMC4xNjM2MjMKK3YgLTEuNTQwNTc2IDEuMjMwMDA2IDAuMTYwOTUxCit2IC0xLjU0MDU3NiAxLjQ1MzA1NiAwLjE2MDk1MQordiAtMS41NDA1NzYgMS4yMzAwMDYgMC4xNjA5NTEKK3YgLTEuNTYwMjYxIDEuNzc4MjAwIDAuMTYzNjIyCit2IC0xLjU2MDI2MSAxLjc3ODIwMCAwLjE2MzYyMgordiAtMS41NDA1NzYgMS43ODc2NzMgMC4xNjA5NTAKK3YgLTEuNTQwNTc2IDEuNzg3NjczIDAuMTYwOTUwCit2IC0xLjU3NjcxNyAxLjc4NzY2NCAwLjA1OTgwMgordiAtMS41NzY3MTcgMS43ODc2NjQgMC4wNTk4MDIKK3YgLTEuNTc1OTMwIDEuNDUzMDU5IDAuMDU4OTc1Cit2IC0xLjU3NjcxNyAxLjQ1MzA1OCAwLjA1OTc3NgordiAtMS41NzY3MTcgMS43NzgxODMgMC4wNTk3OTUKK3YgLTEuNTc2NzE3IDEuNzc4MTgzIDAuMDU5Nzk1Cit2IC0xLjU3NTkzMCAxLjQ1MzA1OSAwLjA1ODk3NQordiAtMS41NDA1NzYgMS40NTMwNTYgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDEuNzc4MjAwIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAxLjQ1MzA1NiAwLjE2MDk1MQordiAtMS41NjAyNjEgMS43ODc2NzMgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDIuNDE2NTU1IDAuMTYzNjIyCit2IC0xLjU2MDI2MSAxLjg2NDM1MiAwLjE2MzYyMgordiAtMS41NjAyNjEgMS44NjQzNTIgMC4xNjM2MjIKK3YgLTEuNTc0NzQ4IDIuNDE2NTU1IC0wLjAxOTk1NwordiAtMS41NzQ3NDkgMS44NjQzNTIgLTAuMDE5OTU3Cit2IC0xLjU3NDc0OSAxLjg2NDM1MiAtMC4wMTk5NTcKK3YgLTEuNTQwNTc2IDEuODY0MzUyIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAxLjg2NDM1MiAwLjE2MDk1MAordiAtMS41NDA1NzYgMS44MzI3OTEgMC4xNjA5NTAKK3YgLTEuNTc1ODYwIDEuNzkwMzU5IDAuMDU2NDE5Cit2IC0xLjU3NTg2MCAxLjc5MDM1OSAwLjA1NjQxOQordiAtMS41NzU4NjAgMS43OTAzNTkgMC4wNTg5ODYKK3YgLTEuNTYwMjYxIDEuNzc4MjAwIDAuMTYzNjIyCit2IC0xLjU3NjcxNyAxLjc3ODE4MyAwLjA1OTc5NQordiAtMS41NzY3MTcgMS43NzgxODMgMC4wNTk3OTUKK3YgLTEuNTQwNTc2IDEuNzc4MjAwIDAuMTYwOTUwCit2IC0xLjU0MDU3NiAxLjc4NzY3MyAwLjE2MDk1MAordiAtMS41NzY3MTcgMS43ODc2NjQgMC4wNTk4MDIKK3YgLTEuNTYwMjYxIDEuODMyNzkxIDAuMTYzNjIyCit2IC0xLjU2MDI2MSAxLjc4NzY3MyAwLjE2MzYyMgordiAtMS41NjAyNjEgMS43ODc2NzMgMC4xNjM2MjIKK3YgLTEuNTYwMjYxIDEuNDUzMDU2IDAuMTYzNjIzCit2IC0xLjU2MDI2MSAxLjIyMzk4OSAwLjE2MzYyMwordiAtMS41NjAyNjEgMS4yMzAwMDYgMC4xNjM2MjMKK3YgLTEuNTYwMjYxIDEuMjMwMDA2IDAuMTYzNjIzCit2IC0xLjU0MDU3NiAxLjIzMDAwNiAwLjE2MDk1MQordiAtMS41NDA1NzYgMS4yMzAwMDYgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDEuMjIzOTg5IDAuMTYwOTUxCit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjAxOTg0OAordiAtMS41NzE2NzUgMS4yMjgwNDQgMC4wNTg5NzYKK3YgLTEuNTc1OTMwIDEuMjI4MDQ0IDAuMDUxODk1Cit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjA1MTg5NQordiAtMS41NzU5MzAgMS4yMjgwNDQgMC4wNTg5NzYKK3YgLTEuNTcxNjc1IDEuMjI4MDQ0IDAuMDU4OTc2Cit2IC0xLjU2MDI2MSAwLjA3MjUxMSAwLjE2MzYyMwordiAtMS41NjAyNjEgMS4xNDk0MjMgMC4xNjM2MjMKK3YgLTEuNTYwMjYxIDAuMDcyNTExIDAuMTYzNjIzCit2IC0xLjU3MDc2MyAwLjA3MjUxMCAtMC4wMTk5NTYKK3YgLTEuNTc0NzQ5IDAuMDcyNTEwIC0wLjAxOTk1NgordiAtMS41NzQ3NDkgMC4wNzI1MTAgLTAuMDE5OTU2Cit2IC0xLjU0MDU3NiAwLjA3MjUxMCAwLjE2MDk1MQordiAtMS41NDA1NzYgMS4xNDk0MjMgMC4xNjA5NTEKK3YgLTEuNTQwNTc2IDAuMDcyNTEwIDAuMTYwOTUxCit2IDEuMjgxNTAzIDEuMDUwMTAwIC0wLjAxNzk4NwordiAxLjI4MTUwMiAwLjcwMjQ3NSAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS4wNTAxMDAgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IDAuNjc1ODUyIC0wLjAxOTk1NQordiAxLjI4MTUwMiAwLjY4MTk3MiAtMC4wMTc5ODcKK3YgMS4yODE1MDIgMC42ODE5NzIgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIDAuNjc1ODUyIC0wLjAxNzk4NwordiAxLjI3OTUzNCAwLjY3NTg1MiAtMC4wMTk5NTUKK3YgMS4yODE1MDMgMS4wNzYyODUgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuMDcwNjAzIC0wLjAxNzk4NwordiAxLjI3OTUzNCAxLjA3NjI4NSAtMC4wMTk5NTYKK3YgMS4yODE1MDMgMS4wNzYyODUgLTAuMDE3OTg3Cit2IDEuMjc5NTM0IDAuNjc1ODUyIC0wLjAxOTk1NQordiAxLjI2NDk2NSAwLjY2NjAyMSAwLjE2MzYyNAordiAxLjI2NDk2NSAwLjY4MTk3NyAwLjE2MzYyNAordiAxLjI2NDk2NSAwLjY4MTk3NyAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA4NzE5OCAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA3MDU5MiAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA4NzE5OCAwLjE2MzYyNAordiAxLjI0NTI4MCAxLjA3MDU5MiAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA3MDU5MiAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA4NzE5OCAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjY2NjAyMSAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjY4MTk3NyAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjY2NjAyMSAwLjE2MDk1MgordiAxLjI3NTkyMSAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI3NTkyMSAwLjY3MzU3NiAwLjA1MjYxMQordiAxLjI4MDAxNyAwLjY3MzU3OSAwLjA0MjUwNgordiAxLjI4MDAxNyAwLjY3MzU3OSAwLjA0MjUwNgordiAxLjI4MDAxNyAwLjY3MzU4MCAwLjAxOTg0OAordiAxLjI4MDAxNyAxLjA3OTI0MyAwLjA0MjUwNgordiAxLjI4MDAxNyAxLjA3OTI0MyAwLjA0MjUwNgordiAxLjI4MDAxNyAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI2NDk2NSAwLjY4MTk3NyAwLjE2MzYyNAordiAxLjI2NDk2NSAwLjcwMjQ4MCAwLjE2MzYyNAordiAxLjI2NDk2NSAwLjcwMjQ4MCAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA3MDU5MiAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA1MDA4OSAwLjE2MzYyNAordiAxLjI2NDk2NSAxLjA3MDU5MiAwLjE2MzYyNAordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA1MDA5MCAwLjE2MDk1MgordiAxLjI0NTI4MCAxLjA3MDU5MiAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjY4MTk3NyAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjY4MTk3NyAwLjE2MDk1MgordiAxLjI0NTI4MCAwLjcwMjQ4MCAwLjE2MDk1MgordiAxLjI4MTUwMiAwLjcwMjQ3NSAtMC4wMTc5ODcKK3YgMS4yODE1MDIgMC43MDI0NzUgLTAuMDE3OTg3Cit2IDEuMjgxNTAyIDAuNjgxOTcyIC0wLjAxNzk4NwordiAxLjI4MTUwMyAxLjA3MDYwMyAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS4wNzA2MDMgLTAuMDE3OTg3Cit2IDEuMjgxNTAzIDEuMDUwMTAwIC0wLjAxNzk4NwordiAxLjI3NTkyMiAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI3NTkyMiAxLjQ5MzQ1OCAwLjA1MjU3NgordiAxLjI4MDAxNyAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI4MDAxNyAxLjQ5MzQ1OSAwLjA0MjU1NQordiAxLjI4MDAxNyAxLjQ5MzQ2MCAwLjAxOTg1MAordiAxLjI4MTUwMyAyLjQxNjU1NCAtMC4wMTc5ODcKK3YgMS4yODE1MDMgMS43NzkwMzkgLTAuMDE3OTg3Cit2IDEuMjY0OTY1IDIuNDE2NTU0IDAuMTYzNjIzCit2IDEuMjY0OTY1IDEuNzc5MDM5IDAuMTYzNjIzCit2IDEuMjY0OTY1IDIuNDE2NTU0IDAuMTYzNjIzCit2IDEuMjQ1MjgwIDIuNDE2NTU0IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDEuNzc5MDM5IDAuMTYwOTUxCit2IDEuMjQ1MjgwIDIuNDE2NTU0IDAuMTYwOTUxCit2IDEuMjgwMDE3IC0wLjIyNjE2OSAwLjA0MjQ2OQordiAxLjI4MDAxNyAtMC4yMjYxNjkgMC4wNDI0NjkKK3YgMS4yODAwMTcgLTAuMjI2MTY3IDAuMDUyNjExCit2IDAuODE4Nzg1IC0yLjgxOTE4NCAwLjAxOTg0NgordiAwLjc4ODQ4OCAtMi44MTkxODQgMC4wNDk3OTYKK3YgMC43ODgwODIgLTIuODE4Mzk3IDAuMDQ5MTEyCit2IDAuNzg4MDgyIC0yLjgxODM5NyAwLjA0OTExMgordiAwLjgxODc4NSAtMi44MTkxODQgMC4wMTk4NDYKK3YgMC44MTgwNzkgLTIuNzk0NjUwIDAuMDE5Njk5Cit2IDAuODE4MDgwIC0yLjgxMzA1NCAwLjAxOTY5OQordiAwLjgxODA3OSAtMi43OTQ2NTAgMC4wMTk2OTkKK3YgMC43NDcwODYgLTIuODE4Mzk3IDAuMDYwMjkwCit2IDAuNzg4MDgyIC0yLjgxODM5NyAwLjA0OTExMgordiAwLjc0NzA4NiAtMi44MTgzOTcgMC4wNjAyOTAKK3YgMC42Nzc1MDMgLTIuODEzMDU0IDAuMDE5ODQwCit2IDAuNjc3NTAzIC0yLjgxMzA1NCAwLjAxOTg0MAordiAwLjY2ODg1MSAtMi44MTgzOTcgLTAuMDEyNDc5Cit2IDAuNjc3NTAzIC0yLjgxODM5NyAwLjAxOTg0MAordiAwLjY3NjgwNiAtMi44MTkxODQgMC4wMTk4NDkKK3YgMC42NzY4MDYgLTIuODE5MTg0IDAuMDE5ODQ5Cit2IDAuNjY3OTk3IC0yLjgxOTE4MyAtMC4wMTI0NzkKK3YgMC42Njg4NTEgLTIuODE4Mzk3IC0wLjAxMjQ3OQordiAwLjcwNjQ0MSAtMi44MTMwNTQgMC4wNDg3MjAKK3YgMC43MDY0NDEgLTIuODEzMDU0IDAuMDQ4NzIwCit2IDAuNzA2NDQxIC0yLjc5NDY1MCAwLjA0ODcyMAordiAwLjcwNjA0MCAtMi44MTkxODQgMC4wNDk0MDgKK3YgMC42NzY4MDYgLTIuODE5MTg0IDAuMDE5ODQ5Cit2IDAuNjc3NTAzIC0yLjgxODM5NyAwLjAxOTg0MAordiAwLjY3NzUwMyAtMi44MTgzOTcgMC4wMTk4NDAKK3YgMC43MDY0NDEgLTIuODE4Mzk3IDAuMDQ4NzIwCit2IDAuNzA2MDQwIC0yLjgxOTE4NCAwLjA0OTQwOAordiAwLjQ2NDg2NCAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNDAzNzc4IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC40NjQ4NjQgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjQ2NDY2NSAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC40MDM3NzggLTIuODAyNjgzIDAuMTYzNjI0Cit2IDAuNDY0NjY1IC0yLjgwMjY4MyAwLjE2MzYyNQordiAwLjQwMzc3OCAtMi43ODI5OTcgMC4xNjA5NTIKK3YgMC40MDM3NzggLTIuNzgyOTk3IDAuMTYwOTUyCit2IDAuNDY0NjY1IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjYzMzA5NiAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNTIyNzI3IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC42MzMwOTYgLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNTIyNzI3IC0yLjgwMjY4MyAwLjE2MzYyNQordiAwLjYzMzA5NiAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC41MjI3MjcgLTIuNzgyOTk3IDAuMTYwOTUzCit2IDAuNTIyNzI3IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjYzMzA5NiAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC40NTMzODggLTIuODE4MTIyIDAuMDU3NDg3Cit2IDAuNDUzMjg5IC0yLjgxODQ0NyAwLjA1NzM2NQordiAwLjQ1MzI4OSAtMi44MTg0NDcgMC4wNTczNjUKK3YgMC40NzYzMTUgLTIuODE4MTIzIDAuMDc5NTI1Cit2IDAuNDc2NDE0IC0yLjgxODQ0NyAwLjA3OTY0NwordiAwLjQ3NjMxNSAtMi44MTgxMjMgMC4wNzk1MjUKK3YgMC40NjQ2NjYgLTIuODE4NDQ3IDAuMDg0NzMwCit2IDAuNDUzMjg0IC0yLjgxODQ0NyAwLjA3OTY0NwordiAwLjQ2NDY2NiAtMi44MTg0NDcgMC4wODQ3MzAKK3YgMC40NDgzODIgLTIuODE4NDQ3IDAuMDY4NDIwCit2IDAuNDUzMjg0IC0yLjgxODQ0NyAwLjA3OTY0NwordiAwLjQ1MzI4NCAtMi44MTg0NDcgMC4wNzk2NDcKK3YgMC40NTMyODkgLTIuODE4NDQ3IDAuMDU3MzY1Cit2IDAuNDQ4MzgyIC0yLjgxODQ0NyAwLjA2ODQyMAordiAwLjQ0ODM4MiAtMi44MTg0NDcgMC4wNjg0MjAKK3YgMC40NjQ4NjUgLTIuODE4NDQ3IDAuMDUyMTQ2Cit2IDAuNDc2NDA4IC0yLjgxODQ0NyAwLjA1NzM2NQordiAwLjQ2NDg2NSAtMi44MTg0NDcgMC4wNTIxNDYKK3YgMC40ODEzMTYgLTIuODE4NDQ3IDAuMDY4NDIxCit2IDAuNDc2NDA4IC0yLjgxODQ0NyAwLjA1NzM2NQordiAwLjQ3NjQwOCAtMi44MTg0NDcgMC4wNTczNjUKK3YgMC40NzY0MTQgLTIuODE4NDQ3IDAuMDc5NjQ3Cit2IDAuNDgxMzE2IC0yLjgxODQ0NyAwLjA2ODQyMQordiAwLjQ4MTMxNiAtMi44MTg0NDcgMC4wNjg0MjEKK3YgMC40NTMzODMgLTIuODE4MTIzIDAuMDc5NTI1Cit2IDAuNDUzMzgzIC0yLjgxODEyMyAwLjA3OTUyNQordiAwLjQ1NDUyMSAtMi44MTQzODkgMC4wNzgxMTgKK3YgMC40NTQ1MjEgLTIuODE0Mzg5IDAuMDc4MTE4Cit2IDAuNDc2MzA5IC0yLjgxODEyMiAwLjA1NzQ4NwordiAwLjQ3NjMwOSAtMi44MTgxMjIgMC4wNTc0ODcKK3YgMC40NzUxNzIgLTIuODE0Mzg5IDAuMDU4ODg4Cit2IDAuNDc1MTcyIC0yLjgxNDM4OSAwLjA1ODg4OAordiAwLjQ3NjMxNSAtMi44MTgxMjMgMC4wNzk1MjUKK3YgMC40NzYzMTUgLTIuODE4MTIzIDAuMDc5NTI1Cit2IC0xLjU3NjcxNSAxLjc4OTA2OSAwLjA1MTg0NwordiAtMS41NzY3MDggMS43ODkwNzAgMC4wMTk3NTgKK3YgLTEuNTc2NzA4IDEuNzg5MDcwIDAuMDE5NzU4Cit2IC0xLjU3NjI5MyAxLjc0OTQxOSAwLjAyODk2NwordiAtMS41NzA3MjUgMS43NDgyNTQgMC4wMjgwNTYKK3YgLTEuNTc2MjkzIDEuNzQ5NDE5IDAuMDI4OTY3Cit2IC0xLjU3NjI5MyAxLjczMjQxNCAwLjAyODk4NwordiAtMS41NzA3MjUgMS43MzM1NjQgMC4wMjgwNTIKK3YgLTEuNTc2MjkzIDEuNzMyNDE0IDAuMDI4OTg3Cit2IC0xLjU3NjcxMSAxLjc0OTczMCAwLjAyOTI3MQordiAtMS41NzY3MDkgMS43NTM0MTQgMC4wMTk3NTgKK3YgLTEuNTc2MjkyIDEuNzUyOTg2IDAuMDE5NzU4Cit2IC0xLjU3NjI5MiAxLjc1Mjk4NiAwLjAxOTc1OAordiAtMS41NzYyOTMgMS43NDk0MTkgMC4wMjg5NjcKK3YgLTEuNTc2NzExIDEuNzQ5NzMwIDAuMDI5MjcxCit2IC0xLjU3NjcxMSAxLjczMjE3MiAwLjAyOTIxNgordiAtMS41NzY3MTAgMS43NDA5NDcgMC4wMzI4NjMKK3YgLTEuNTc2NzExIDEuNzMyMTcyIDAuMDI5MjE2Cit2IC0xLjU3NjcxMCAxLjc0MDk0NyAwLjAzMjg2MwordiAtMS41NzY3MTEgMS43NDk3MzAgMC4wMjkyNzEKK3YgLTEuNTc2MjkzIDEuNzQ5NDE5IDAuMDI4OTY3Cit2IC0xLjU3NjI5MyAxLjc0OTQxOSAwLjAyODk2NwordiAtMS41NzYyOTMgMS43NDA5NDcgMC4wMzI1MjUKK3YgLTEuNTc2NzEwIDEuNzQwOTQ3IDAuMDMyODYzCit2IC0xLjU3NjcxMCAxLjcyODYzOCAwLjAxOTc1OAordiAtMS41NzY3MTEgMS43MzIxNzIgMC4wMjkyMTYKK3YgLTEuNTc2MjkzIDEuNzMyNDE0IDAuMDI4OTg3Cit2IC0xLjU3NjI5MyAxLjczMjQxNCAwLjAyODk4NwordiAtMS41NzY3MTAgMS43Mjg2MzggMC4wMTk3NTgKK3YgLTEuNTc1NTM0IDEuNzkwMDUzIDAuMDU4ODEzCit2IC0xLjU3NjcyMCAxLjc4OTA2MyAwLjA1NzI1MQordiAtMS41NzU1MzQgMS43OTAwNTMgMC4wNTg4MTMKK3YgLTEuNTc2NzE1IDEuNzg5MDY5IDAuMDUxODQ3Cit2IC0xLjU3NTUzNiAxLjc4NTU0MCAwLjA1ODgxNQordiAtMS41NzU1MzQgMS43NDA5NTIgMC4wNTg4MTQKK3YgLTEuNTc1NTM2IDEuNzg1NTQwIDAuMDU4ODE1Cit2IC0xLjU3NTUzNCAxLjc0MDk1MiAwLjA1ODgxNAordiAtMS41NzU1MzQgMS43MDQ5NTUgMC4wNTg4MTQKK3YgLTEuNTc1NTM0IDEuNzQwOTUyIDAuMDU4ODE0Cit2IC0xLjU3NTUzNCAxLjc5MDA1MyAwLjA1ODgxMwordiAtMS41NzU1MzQgMS43MDQ5NTUgMC4wNTg4MTQKK3YgLTEuNTc1NTM0IDEuNjYwOTMwIDAuMDU4ODE2Cit2IC0xLjU3NTUzNCAxLjcwNDk1NSAwLjA1ODgxNAordiAtMS41NzU1MzQgMS43OTAwNTMgMC4wNTg4MTMKK3YgLTEuNTc1NTM2IDEuNzg1NTQwIDAuMDU4ODE1Cit2IC0xLjU3Mjg1OCAxLjc5MDA1MyAwLjA1ODgxNgordiAtMS41NzU1MzQgMS43OTAwNTMgMC4wNTg4MTMKK3YgLTEuNTU3MTEzIDEuNzkwMDUzIDAuMDU4ODE2Cit2IC0xLjU3Mjg1OCAxLjc5MDA1MyAwLjA1ODgxNgordiAtMS41NTcxMTMgMS43OTAwNTMgMC4wNTg4MTYKK3YgLTEuNTc2NzA4IDEuNzg5MDcwIDAuMDE5NzU4Cit2IC0xLjU3NjcwOCAxLjc4OTA3MCAwLjAxOTc1OAordiAtMS41NzY3MTUgMS43ODkwNjkgLTAuMDEyNzUwCit2IC0xLjU3NjI5MyAxLjc0OTQxOSAwLjAxMDU1MAordiAtMS41NzA3MjUgMS43NDgyNTQgMC4wMTE0NjAKK3YgLTEuNTc2MjkzIDEuNzQ5NDE5IDAuMDEwNTUwCit2IC0xLjU3NjI5MyAxLjczMjQxNCAwLjAxMDUyOQordiAtMS41NzA3MjUgMS43MzM1NjQgMC4wMTE0NjQKK3YgLTEuNTc2MjkzIDEuNzMyNDE0IDAuMDEwNTI5Cit2IC0xLjU3NjcxMSAxLjc0OTczMCAwLjAxMDI0NgordiAtMS41NzYyOTMgMS43NDk0MTkgMC4wMTA1NTAKK3YgLTEuNTc2MjkyIDEuNzUyOTg2IDAuMDE5NzU4Cit2IC0xLjU3NjI5MiAxLjc1Mjk4NiAwLjAxOTc1OAordiAtMS41NzY3MDkgMS43NTM0MTQgMC4wMTk3NTgKK3YgLTEuNTc2NzExIDEuNzQ5NzMwIDAuMDEwMjQ2Cit2IC0xLjU3NjcxMSAxLjczMjE3MiAwLjAxMDMwMAordiAtMS41NzY3MTAgMS43NDA5NDcgMC4wMDY2NTMKK3YgLTEuNTc2NzExIDEuNzMyMTcyIDAuMDEwMzAwCit2IC0xLjU3NjcxMCAxLjc0MDk0NyAwLjAwNjY1MwordiAtMS41NzYyOTMgMS43NDA5NDcgMC4wMDY5OTEKK3YgLTEuNTc2MjkzIDEuNzQ5NDE5IDAuMDEwNTUwCit2IC0xLjU3NjI5MyAxLjc0OTQxOSAwLjAxMDU1MAordiAtMS41NzY3MTEgMS43NDk3MzAgMC4wMTAyNDYKK3YgLTEuNTc2NzEwIDEuNzQwOTQ3IDAuMDA2NjUzCit2IC0xLjU3NjcxMCAxLjcyODYzOCAwLjAxOTc1OAordiAtMS41NzYyOTMgMS43MzI0MTQgMC4wMTA1MjkKK3YgLTEuNTc2MjkzIDEuNzMyNDE0IDAuMDEwNTI5Cit2IC0xLjU3NjcxMSAxLjczMjE3MiAwLjAxMDMwMAordiAtMS41NzY3MTAgMS43Mjg2MzggMC4wMTk3NTgKK3YgLTEuNTc1NTM0IDEuNzkwMDQ2IC0wLjAxOTkyMAordiAtMS41NzY3MjAgMS43ODkwNzggLTAuMDE4MzQxCit2IC0xLjU3NTUzNCAxLjc5MDA0NiAtMC4wMTk5MjAKK3YgLTEuNTc2NzE1IDEuNzg5MDY5IC0wLjAxMjc1MAordiAtMS41NzU1MzYgMS43ODU1NDAgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNCAxLjc0MDk1MiAtMC4wMTk5MjMKK3YgLTEuNTc1NTM2IDEuNzg1NTQwIC0wLjAxOTkyNAordiAtMS41NzU1MzQgMS43NDA5NTIgLTAuMDE5OTIzCit2IC0xLjU3NTUzNCAxLjcwNDk1NSAtMC4wMTk5MjIKK3YgLTEuNTc1NTM0IDEuNzQwOTUyIC0wLjAxOTkyMwordiAtMS41NzU1MzQgMS43OTAwNDYgLTAuMDE5OTIwCit2IC0xLjU3NTUzNCAxLjcwNDk1NSAtMC4wMTk5MjIKK3YgLTEuNTc1NTM0IDEuNjYwOTMwIC0wLjAxOTkyNAordiAtMS41NzU1MzQgMS43MDQ5NTUgLTAuMDE5OTIyCit2IC0xLjU3NTUzNCAxLjc5MDA0NiAtMC4wMTk5MjAKK3YgLTEuNTcyODU4IDEuNzkwMDQ4IC0wLjAxOTkyMQordiAtMS41NzU1MzYgMS43ODU1NDAgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNCAxLjc5MDA0NiAtMC4wMTk5MjAKK3YgLTEuNTU3MTEzIDEuNzkwMDQ4IC0wLjAxOTkyMQordiAtMS41NzI4NTggMS43OTAwNDggLTAuMDE5OTIxCit2IC0xLjU1NzExMyAxLjc5MDA0OCAtMC4wMTk5MjEKK3YgLTEuNTc2NzA4IDEuMjI5MTY3IDAuMDE5NzU4Cit2IC0xLjU3NjcwOCAxLjIyOTE2NyAwLjAxOTc1OAordiAtMS41NzY3MTUgMS4yMjkxNjggMC4wNTE2MzQKK3YgLTEuNTc1NTM0IDEuMjI4MTkzIDAuMDU4ODEzCit2IC0xLjU3NjcyMCAxLjIyOTE3NCAwLjA1NzI1MQordiAtMS41NzU1MzQgMS4yMjgxOTMgMC4wNTg4MTMKK3YgLTEuNTc2NzE1IDEuMjI5MTY4IDAuMDUxNjM0Cit2IC0xLjU3NTUzNiAxLjI0ODYxMyAwLjA1ODgxNQordiAtMS41NzU1MzYgMS4yMzM5MTYgMC4wNTg4MTUKK3YgLTEuNTc1NTM2IDEuMjMzOTE2IDAuMDU4ODE1Cit2IC0xLjU3NTUzNCAxLjIyODE5MyAwLjA1ODgxMwordiAtMS41NzU1MzQgMS4yMjgxOTMgMC4wNTg4MTMKK3YgLTEuNTcyODU4IDEuMjI4MTkzIDAuMDU4ODE1Cit2IC0xLjU3NTUzNiAxLjIzMzkxNiAwLjA1ODgxNQordiAtMS41NzU1MzQgMS4yMjgxOTMgMC4wNTg4MTMKK3YgLTEuNTU3MTEzIDEuMjI4MTkzIDAuMDU4ODE1Cit2IC0xLjU3Mjg1OCAxLjIyODE5MyAwLjA1ODgxNQordiAtMS41NTcxMTMgMS4yMjgxOTMgMC4wNTg4MTUKK3YgLTEuNTc2NzE1IDEuMjI5MTY5IC0wLjAxMjc1MAordiAtMS41NzY3MDggMS4yMjkxNjcgMC4wMTk3NTgKK3YgLTEuNTc2NzA4IDEuMjI5MTY3IDAuMDE5NzU4Cit2IC0xLjU3NTUzNCAxLjIyODIwOSAtMC4wMTk5MjEKK3YgLTEuNTc2NzIwIDEuMjI5MTc4IC0wLjAxODM2MAordiAtMS41NzU1MzQgMS4yMjgyMDkgLTAuMDE5OTIxCit2IC0xLjU3NjcxNSAxLjIyOTE2OSAtMC4wMTI3NTAKK3YgLTEuNTc1NTM2IDEuMjMzOTE2IC0wLjAxOTkyNAordiAtMS41NzU1MzYgMS4yMzM5MTYgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNCAxLjIyODIwOSAtMC4wMTk5MjEKK3YgLTEuNTc1NTM0IDEuMjI4MjA5IC0wLjAxOTkyMQordiAtMS41NzU1MzYgMS4yMzM5MTYgLTAuMDE5OTI0Cit2IC0xLjU3Mjg1OCAxLjIyODIwOSAtMC4wMTk5MjEKK3YgLTEuNTc1NTM0IDEuMjI4MjA5IC0wLjAxOTkyMQordiAtMS41NTcxMTMgMS4yMjgyMDkgLTAuMDE5OTIxCit2IC0xLjU3Mjg1OCAxLjIyODIwOSAtMC4wMTk5MjEKK3YgLTEuNTU3MTEzIDEuMjI4MjA5IC0wLjAxOTkyMQordiAtMS41NzU1MzUgMS40NTQ3NzIgMC4wNTg4MTUKK3YgLTEuNTc1NTM2IDEuMjQ4NjEzIDAuMDU4ODE1Cit2IC0xLjU3NTUzNiAxLjI0ODYxMyAwLjA1ODgxNQordiAtMS41NzU1MzYgMS4yNDg2MTQgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNiAxLjI0ODYxNCAtMC4wMTk5MjQKK3YgLTEuNTc1NTM1IDEuNDU0NzcyIC0wLjAxOTkyNAordiAtMS41NzU1MzUgMS40NTQ3NzIgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNiAxLjI0ODYxNCAtMC4wMTk5MjQKK3YgLTEuNTc1NTM2IDEuMjQ4NjE0IC0wLjAxOTkyNAordiAtMS41NzU1MzQgMS42NjA5MzAgMC4wNTg4MTYKK3YgLTEuNTc1NTM1IDEuNDU0NzcyIDAuMDU4ODE1Cit2IC0xLjU3NTUzNSAxLjQ1NDc3MiAwLjA1ODgxNQordiAtMS41NzU1MzQgMS42NjA5MzAgLTAuMDE5OTI0Cit2IC0xLjU3NTUzNSAxLjQ1NDc3MiAtMC4wMTk5MjQKK3YgLTEuNTc1NTM0IDEuNjYwOTMwIC0wLjAxOTkyNAordiAwLjUyMjcyNyAtMi44MTkxODMgLTAuMDE3OTg2Cit2IDAuNDY0ODY0IC0yLjgxOTE4MyAtMC4wMTc5ODYKK3YgMC41MjI3MjcgLTIuODE5MTgzIC0wLjAxNzk4NgordiAwLjUyMjcyNyAtMi44MDI2ODMgMC4xNjM2MjUKK3YgMC40NjQ2NjUgLTIuODAyNjgzIDAuMTYzNjI1Cit2IDAuNTIyNzI3IC0yLjgwMjY4MyAwLjE2MzYyNQordiAwLjQ2NDY2NSAtMi43ODI5OTcgMC4xNjA5NTMKK3YgMC40NjQ2NjUgLTIuNzgyOTk3IDAuMTYwOTUzCit2IDAuNTIyNzI3IC0yLjc4Mjk5NyAwLjE2MDk1MwordiAwLjQ1MzM4MyAtMi44MTgxMjMgMC4wNzk1MjUKK3YgMC40NTMyODQgLTIuODE4NDQ3IDAuMDc5NjQ3Cit2IDAuNDUzMzgzIC0yLjgxODEyMyAwLjA3OTUyNQordiAwLjQ3NjMwOSAtMi44MTgxMjIgMC4wNTc0ODcKK3YgMC40NzY0MDggLTIuODE4NDQ3IDAuMDU3MzY1Cit2IDAuNDc2MzA5IC0yLjgxODEyMiAwLjA1NzQ4NwordiAwLjQ2NDY2NiAtMi44MTg0NDcgMC4wODQ3MzAKK3YgMC40NjQ2NjYgLTIuODE4NDQ3IDAuMDg0NzMwCit2IDAuNDc2NDE0IC0yLjgxODQ0NyAwLjA3OTY0NwordiAwLjQ2NDg2NSAtMi44MTg0NDcgMC4wNTIxNDYKK3YgMC40NjQ4NjUgLTIuODE4NDQ3IDAuMDUyMTQ2Cit2IDAuNDUzMjg5IC0yLjgxODQ0NyAwLjA1NzM2NQordiAwLjQ3NTE3NyAtMi44MTQzODkgMC4wNzgxMTgKK3YgMC40NTMzODggLTIuODE4MTIyIDAuMDU3NDg3Cit2IDAuNDU0NTI2IC0yLjgxNDM4OSAwLjA1ODg4OAordiAwLjQ1MzM4OCAtMi44MTgxMjIgMC4wNTc0ODcKK3YgMC42Nzc1MDQgLTIuNzk0NjUwIDAuMDE5ODQwCit2IDAuNjc3NTA0IC0yLjc5NDY1MCAwLjAxOTg0MAordiAwLjgxODA3OSAtMi43OTQ2NTAgMC4wMTk2OTkKK3YgMC44MTgwNzkgLTIuNzUwNTYxIDAuMDE5Njk5Cit2IDAuODE4MDc5IC0yLjc5NDY1MCAwLjAxOTY5OQordiAwLjY3NzUwNCAtMi43NTA1NjEgMC4wMTk4NDAKK3YgMC42Nzc1MDQgLTIuNzUwNTYxIDAuMDE5ODQwCit2IDAuNzA2NDQxIC0yLjc5NDY1MCAwLjA0ODcyMAordiAwLjcwNjQ0MSAtMi43NTA1NjEgMC4wNDg3MjAKK3YgMC43MDY0NDEgLTIuNzUwNTYxIDAuMDQ4NzIwCit2IC0xLjQ1OTA2MSAyLjg0OTk4MiAtMC4wMTk5NTcKK3YgLTEuNDY4OTUxIDIuODU5ODczIC0wLjAxOTk1NwordiAtMS40Njg5NTEgMi44NTk4NzMgLTAuMDE5OTU3Cit2IDEuMTYzOTE3IDIuODQ5NzIxIC0wLjAxOTk1NgordiAxLjE3MzY5MCAyLjg1OTYxMiAtMC4wMTk5NTYKK3YgMS4xNzM2OTAgMi44NTk2MTIgLTAuMDE5OTU2Cit2IC0xLjU1NzAzMyAwLjA3MjUxMCAtMC4wMTk5NTYKK3YgLTEuNTU3MDMzIDAuMDcyNTEwIC0wLjAxOTk1NgordiAtMS41NzQ3NDkgMS4xNDk0MjMgLTAuMDE5OTU2Cit2IC0xLjU3NDc0OSAxLjE5MDgwNiAtMC4wMTk5NTcKK3YgLTEuNTc0NzQ5IDEuMTQ5NDIzIC0wLjAxOTk1NgordiAtMS41NzQ3NDkgMS4xOTA4MDYgLTAuMDE5OTU3Cit2IC0xLjU3NDc0OSAxLjIyNDAyNiAtMC4wMTk5NTYKK3YgLTEuNTc0NzQ5IDEuMTkwODA2IC0wLjAxOTk1NwordiAtMS41NTcwMTkgMS43OTAzNTkgMC4wNTg5ODYKK3YgLTEuNTcxNjIxIDEuNzkwMzU5IDAuMDU4OTg2Cit2IC0xLjU1NzAxOSAxLjc5MDM1OSAwLjA1ODk4NgordiAtMS41NzQ3NjAgMS43OTAzNTcgLTAuMDE5OTU5Cit2IC0xLjU3NTg1NSAxLjc5MDM1NyAtMC4wMTc5ODgKK3YgLTEuNTc0NzYwIDEuNzkwMzU3IC0wLjAxOTk1OQordiAxLjI2NzM1NCAxLjA3OTI0MSAwLjA1MjU4MAordiAxLjI3NTkyMiAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI3NTkyMiAxLjA3OTI0MiAwLjA1MjU4MAordiAxLjI3ODUxNCAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNzg1MTQgMS4wNzkyNDQgLTAuMDE5OTU1Cit2IDEuMjY3MzQ5IC0wLjIyNjE2NyAwLjA1MjYxMQordiAxLjI3NTkyMCAtMC4yMjYxNjcgMC4wNTI2MTEKK3YgMS4yNzU5MjAgLTAuMjI2MTY3IDAuMDUyNjExCit2IDEuMjc4NTE1IC0wLjIyNjE3MCAtMC4wMTk5NzYKK3YgMS4yNzg1MTUgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI3NDc1OCAwLjY3MzU4MiAtMC4wMTk5NTgKK3YgMS4yNzQ3NTggMC42NzM1ODIgLTAuMDE5OTU4Cit2IDEuMjY3MzU0IDAuNjczNTgyIC0wLjAxOTk1OAordiAxLjI3OTUzNCAtMC4yMjg0MjQgLTAuMDE5OTczCit2IDEuMjc0NzU3IC0wLjIyNjE3MCAtMC4wMTk5NzYKK3YgMS4yNzQ3NTcgLTAuMjI2MTcwIC0wLjAxOTk3NgordiAxLjI3ODUxNSAtMC4yMjYxNzAgLTAuMDE5OTc2Cit2IDEuMjc5NTM0IC0wLjIyODQyNCAtMC4wMTk5NzMKK3YgMS4yNzk1MzQgMS4wNzYyODUgLTAuMDE5OTU2Cit2IDEuMjc0NzU5IDEuMDc5MjQ0IC0wLjAxOTk1NQordiAxLjI3NDc1OSAxLjA3OTI0NCAtMC4wMTk5NTUKK3YgMS4yNzg1MTQgMS4wNzkyNDQgLTAuMDE5OTU1Cit2IDEuMjc5NTM0IDEuMDc2Mjg1IC0wLjAxOTk1NgordiAxLjI3NDc1NyAxLjQ5MzQ2MSAtMC4wMTk5NTUKK3YgMS4yNzQ3NTcgMS40OTM0NjEgLTAuMDE5OTU1Cit2IDEuMjY3MzU1IDEuNDkzNDYyIC0wLjAxOTk1NgordiAtMS41NzA0OTEgMS4yMjgwNTAgLTAuMDE5OTY1Cit2IC0xLjU3MDQ5MSAxLjIyODA1MCAtMC4wMTk5NjUKK3YgLTEuNTU3MDI4IDEuMjI4MDQ4IC0wLjAxOTk2NgordiAtMS41NzQ3NDkgMS43OTEzNDggLTAuMDE5OTU3Cit2IC0xLjU3MDc3MCAxLjc5MDM1NyAtMC4wMTk5NTYKK3YgLTEuNTcwNzcwIDEuNzkwMzU3IC0wLjAxOTk1NgordiAtMS41NzQ3NjAgMS43OTAzNTcgLTAuMDE5OTU5Cit2IC0xLjU3NDc0OSAxLjc5MTM0OCAtMC4wMTk5NTcKK3YgLTEuMzU4NTk2IC0yLjc4NjQ1OCAtMC4wMTk5NTUKK3YgLTEuMzU4NTk2IC0yLjc4NjQ1OCAtMC4wMTk5NTUKK3YgLTEuMzUyOTYzIC0yLjc3NDQ1MiAtMC4wMTk5NTUKK3YgMS4yMzUyNjkgLTIuNTk2MjIxIC0wLjAxOTk1NAordiAxLjI0ODE4NCAtMi42MDE2MzYgLTAuMDE5OTU0Cit2IDEuMjM1MjY5IC0yLjU5NjIyMSAtMC4wMTk5NTQKK3YgMC42Nzc1MDQgLTIuNzk0NjUwIDAuMDE5ODQwCit2IDAuODI4Njk2IC0yLjgxNjA2NSAtMC4wMTk2MjgKK3YgMC44Mjg2OTYgLTIuODExMjQ2IC0wLjAxOTYyOAordiAwLjY2NjkzOCAtMi43OTQ2NTAgLTAuMDE5NjI4Cit2IDAuNjY2OTI3IC0yLjgxMTI0NiAtMC4wMTk2MjgKK3YgMC42NjY5MzggLTIuNzk0NjUwIC0wLjAxOTYyOAordiAwLjAzMjE0MCAtMi43OTQ1ODAgLTAuMDE5OTU1Cit2IDAuMDMyMTQxIC0yLjgxMTQ5OCAtMC4wMTk5NTUKK3YgMC4wMzIxNDAgLTIuNzk0NTgwIC0wLjAxOTk1NQordiAwLjAxNTgwMCAtMi44MTgzOTcgMC4wNzA4MzEKK3YgLTAuMDEzNTY5IC0yLjgxODM5NyAwLjA3OTYyMgordiAwLjAxNTgwMCAtMi44MTgzOTcgMC4wNzA4MzEKK3YgMC4wMTU4MDAgLTIuODE4Mzk3IDAuMDcwODMxCit2IDAuMDE1ODAwIC0yLjgwMzMxMiAwLjA3MDgzMQordiAwLjAxNTgwMCAtMi44MDMzMTIgMC4wNzA4MzEKK3YgLTAuMzI2NzcxIC0yLjc1MTM1MyAtMC4wMTk1NTAKK3YgLTAuMzI2NzczIC0yLjgwMTUwNiAtMC4wMTk1NTAKK3YgLTAuMzI2NzcxIC0yLjc1MTM1MyAtMC4wMTk1NTAKK3YgLTAuMjgxMzQ1IC0yLjgxODM5NyAwLjA3OTYyMgordiAtMC4zMTA5NDIgLTIuODE4Mzk3IDAuMDcwODcwCit2IC0wLjI4MTM0NSAtMi44MTgzOTcgMC4wNzk2MjIKK3YgLTAuMzEwOTQyIC0yLjgxODM5NyAwLjA3MDg3MAordiAtMC4zMTA5NDIgLTIuODAzMzEyIDAuMDcwODcwCit2IC0wLjMxMDk0MiAtMi44MTgzOTcgMC4wNzA4NzAKK3YgLTAuMDEzNTY5IC0yLjgxODM5NyAwLjA3OTYyMgordiAtMC4wMTM1NjkgLTIuODE4Mzk3IDAuMDc5NjIyCit2IC0xLjU3NTkzMCAxLjIzMzk1MCAwLjA1ODk3NgordiAtMS41NzU5MzAgMS40NTMwNTkgMC4wNTg5NzUKK3YgLTEuNTc1OTMwIDEuMjMzOTUwIDAuMDU4OTc2Cit2IC0xLjU3NTkzMCAxLjQ1MzA1OSAwLjA1ODk3NQordiAtMS41NzU5MzAgMS40NTMwNTkgMC4wNTg5NzUKK3YgLTEuNTc1OTMwIDEuMjMzOTUwIDAuMDU4OTc2Cit2IC0xLjU3NTkzMCAxLjIyODA0NCAwLjA1ODk3NgordiAtMS41NzU5MzAgMS4yMzM5NTAgMC4wNTg5NzYKK3YgLTEuNTU3MDE5IDEuMjI4MDQ0IDAuMDU4OTc2Cit2IC0xLjU3MTY3NSAxLjIyODA0NCAwLjA1ODk3NgordiAtMS41NTcwMTkgMS4yMjgwNDQgMC4wNTg5NzYKK3YgLTEuNTc0NzQ5IDAuMDcyNTEwIC0wLjAxOTk1NgordiAtMS41NzQ3NDkgMS4xNDk0MjMgLTAuMDE5OTU2Cit2IC0xLjU3MDc2MyAwLjA3MjUxMCAtMC4wMTk5NTYKK3YgLTEuNTc0NzQ5IDAuMDcyNTEwIC0wLjAxOTk1NgordiAxLjI3OTUzNCAxLjA3NjI4NSAtMC4wMTk5NTYKK3YgMS4yNjczNTAgMC42NzM1NzYgMC4wNTI2MTEKK3YgMS4yNzU5MjEgMC42NzM1NzYgMC4wNTI2MTEKK3YgMS4yNjczNTAgMC42NzM1NzYgMC4wNTI2MTEKK3YgMS4yNjczNTQgMS40OTM0NTggMC4wNTI1NzYKK3YgMS4yNzU5MjIgMS40OTM0NTggMC4wNTI1NzYKK3YgMS4yNjczNTQgMS40OTM0NTggMC4wNTI1NzYKK3YgMC44MTgwODAgLTIuODE4Mzk3IDAuMDE5Njk5Cit2IDAuODE4MDgwIC0yLjgxODM5NyAwLjAxOTY5OQordiAwLjgxODA4MCAtMi44MTMwNTQgMC4wMTk2OTkKK3YgMC44MTgwODAgLTIuODE4Mzk3IDAuMDE5Njk5Cit2IDAuNzA2NDQxIC0yLjgxODM5NyAwLjA0ODcyMAordiAwLjY3NzUwMyAtMi44MTgzOTcgMC4wMTk4NDAKK3YgMC42Nzc1MDMgLTIuODEzMDU0IDAuMDE5ODQwCit2IDAuNjc3NTAzIC0yLjgxMzA1NCAwLjAxOTg0MAordiAwLjcwNjQ0MSAtMi44MTgzOTcgMC4wNDg3MjAKK3YgMC43MDY0NDEgLTIuODE4Mzk3IDAuMDQ4NzIwCit2IDAuNzA2NDQxIC0yLjgxMzA1NCAwLjA0ODcyMAordiAwLjcwNjQ0MSAtMi44MTMwNTQgMC4wNDg3MjAKK3YgMC41MjI3MjcgMi45NjgyMDAgLTAuMDE3OTg4Cit2IDAuNTIyNzI3IDIuOTY4MjAwIC0wLjAxNzk4OAordiAtMC45MjgwOTcgMi45NjgyMDEgLTAuMDE3OTg4Cit2IC0wLjIwMjY4NSAyLjk2ODIwMSAtMC4wMTc5ODgKK3YgLTAuOTI4MDk3IDIuOTY4MjAxIC0wLjAxNzk4OAordiAtMC45MjgwOTggMi45NTE2OTAgMC4xNjM2MjIKK3YgLTAuMjAyNjg1IDIuOTUxNjkwIDAuMTYzNjIzCit2IC0wLjkyODA5OCAyLjk1MTY5MCAwLjE2MzYyMgordiAtMC45MjgwOTggMi45MzIwMjggMC4xNjA5NTEKK3YgLTAuMjAyNjg1IDIuOTMyMDI4IDAuMTYwOTUxCit2IC0wLjkyODA5OCAyLjkzMjAyOCAwLjE2MDk1MQordiAxLjI0MTQyNSAwLjY3Njg2MiAtMC4xMTc0MDIKK3YgMS4xODIwMjAgMC42NzY5NjkgLTAuMTM4Mjc3Cit2IDEuMjgxNTE2IDAuNjc2NzkwIC0wLjA3Njc1NAordiAxLjI3OTU0NiAwLjY3Njc5MCAtMC4wMTk4NTQKK3YgMS4yODE1MTYgMC42NzY3OTAgLTAuMDcwODc3Cit2IDAuOTgzNjE1IDAuNjc3MDc1IC0wLjE0NzM0NgordiAtMS41NzY3NTggLTEuODI4NDIxIC0wLjA3Njc2NgordiAtMS41NzQ3OTEgLTEuODI4NDIxIC0wLjAxOTg2NgordiAxLjI0MTQyNSAtMS44MjgzNTcgLTAuMTE3NDAyCit2IC0xLjU3Njc1OCAtMS44Mjg0MjEgLTAuMDcwODg5Cit2IC0xLjQ1MTE5OCAtMS44MjgxNjUgLTAuMTQ3MzU2Cit2IDEuMTgyMDIwIC0xLjgyODI2MCAtMC4xMzgyNzcKK3YgLTEuNDAxMTk4IC0xLjgyODE2NSAtMC4xNDczNTYKK3YgLTEuMjc4ODY4IC0xLjgyODE2NSAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0xLjgyODE2NSAtMC4xNDczNTUKK3YgLTEuMDI4Mjc0IC0xLjgyODE2NSAtMC4xNDczNTQKK3YgMC40MDQ0OTEgLTEuODI4MTY1IC0wLjE0NzM0OAordiAxLjI4MTUxNiAtMS44Mjg0MjEgLTAuMDc2NzU0Cit2IDEuMjgxNTE1IC0xLjgyODQyMSAtMC4wMjE4NjEKK3YgLTEuNTM2NzA3IC0xLjgyODM1NiAtMC4xMTc0MTQKK3YgMS4yODE1MTYgLTEuODI4NDIxIC0wLjA3MDg3NwordiAxLjEyMjkwNCAtMS44MjgxNjUgLTAuMTQ3MzQ1Cit2IC0xLjQ5NTc0NiAtMS44MjgyNjAgLTAuMTM4Mjg4Cit2IDEuMDcyOTA0IC0xLjgyODE2NSAtMC4xNDczNDUKK3YgMC43NDc3NjEgLTEuODI4MTY1IC0wLjE0NzM0NwordiAwLjkwODU5NSAtMS44MjgxNjUgLTAuMTQ3MzQ2Cit2IDAuOTgzNjE0IC0xLjgyODE2NSAtMC4xNDczNDYKK3YgLTAuNjk5NzA3IC0xLjgyODE2NSAtMC4xNDczNTMKK3YgLTAuMTQ3NjEyIC0xLjU1NzU3MyAtMC4xNDczNTAKK3YgLTAuNDM0NDExIDAuNDA5MzM5IC0wLjE0NzM1MQordiAtMC40MzQ0MTEgLTAuNTUyNjg1IC0wLjE0NzM1MQordiAtMC40MzQ0MTEgLTAuNzAyODE3IC0wLjE0NzM1MQordiAtMC40MzQ0MTIgLTEuMzgxMzI0IC0wLjE0NzM1MQordiAtMC40MzQ0MTIgLTEuNTU3NTczIC0wLjE0NzM1MgordiAtMC40MzQ0MTIgLTAuOTU3MDcxIC0wLjE0NzM1MQordiAtMC40MzQ0MTEgLTAuODI3MDIyIC0wLjE0NzM1MQordiAtMC40MzQ0MTEgLTAuMzk0OTg4IC0wLjE0NzM1MQordiAtMC40MzQ0MTEgLTAuMDUyODk4IC0wLjE0NzM1MQordiAtMC40MzQ0MTEgMC4wMjkyNDggLTAuMTQ3MzUxCit2IC0wLjQzNDQxMSAwLjE4MDExNCAtMC4xNDczNTEKK3YgMC4xNTczNTMgLTEuNTU3NTczIC0wLjE0NzM0OQordiAtMC4yOTM3MzggLTEuNTU3NTczIC0wLjE0NzM1MQordiAwLjE1NzE4MyAtMC4yNTI2MDkgLTAuMTQ3MzQ5Cit2IDAuMTU3MTgzIC0wLjA3MDc4NiAtMC4xNDczNTAKK3YgMC4xNTcxODMgMC40MDkzNDAgLTAuMTQ3MzUwCit2IC0wLjE5NjIxNyAwLjAwMjg5MiAtMC4xNDczNTEKK3YgLTAuMjY0NDA0IDAuMDI2OTE3IC0wLjE0NzM1MgordiAtMC4zMTA1NDcgMC4wODU2MDkgLTAuMTQ3MzUyCit2IC0wLjMyODA0NyAwLjE4MDI4NyAtMC4xNDczNTIKK3YgLTAuMzA1MzM2IDAuMjczMTQ0IC0wLjE0NzM1MgordiAtMC4yNTE4OTMgMC4zMTg4MDcgLTAuMTQ3MzUyCit2IC0wLjE4OTg0OCAwLjMxMTY1NyAtMC4xNDczNTEKK3YgLTAuMTUxMDUxIDAuMjcyNTUyIC0wLjE0NzM1MQordiAtMC4xMzMwNzIgMC4yMjMzMTEgLTAuMTQ3MzUxCit2IC0wLjEyNTE1NyAwLjE3MTM2MyAtMC4xNDczNTEKK3YgLTAuMTE4NzQzIDAuMTI3ODI4IC0wLjE0NzM1MQordiAtMC4xMDcwNTYgMC4wOTI3NTMgLTAuMTQ3MzUxCit2IC0wLjA4NTk0MCAwLjA3MDE5MyAtMC4xNDczNTEKK3YgLTAuMDYxMjc0IDAuMDY4NjY2IC0wLjE0NzM1MQordiAtMC4wMzU5NjUgMC4wOTQyNTcgLTAuMTQ3MzUxCit2IC0wLjAyMzA2NSAwLjE1NjUzMiAtMC4xNDczNTAKK3YgLTAuMDM1MDY0IDAuMjE2NzQwIC0wLjE0NzM1MQordiAtMC4wNjUwNDAgMC4yNTYzOTcgLTAuMTQ3MzUxCit2IC0wLjEwOTI1MyAwLjI3MjYxMCAtMC4xNDczNTEKK3YgLTAuMTA2OTQzIDAuMzI3NDM2IC0wLjE0NzM1MQordiAtMC4wMzY3MTMgMC4zMDI2NzQgLTAuMTQ3MzUxCit2IDAuMDEyMDUwIDAuMjQyODU2IC0wLjE0NzM1MAordiAwLjAzMDk1NCAwLjE1NTg2NiAtMC4xNDczNTAKK3YgMC4wMDc0NDggMC4wNjA3NTQgLTAuMTQ3MzUwCit2IC0wLjA0NzgwNCAwLjAxNDAzMSAtMC4xNDczNTEKK3YgLTAuMTEyMDYyIDAuMDIxNjIwIC0wLjE0NzM1MQordiAtMC4xNTE4NjkgMC4wNjE1ODYgLTAuMTQ3MzUxCit2IC0wLjE3MDI4OCAwLjExMTcwMiAtMC4xNDczNTEKK3YgLTAuMTc4MzI3IDAuMTY0MzE3IC0wLjE0NzM1MQordiAtMC4xODQ2MTYgMC4yMDcyMjIgLTAuMTQ3MzUxCit2IC0wLjE5NTg3NSAwLjI0MTQyNSAtMC4xNDczNTEKK3YgLTAuMjE1OTU5IDAuMjYzMDQ1IC0wLjE0NzM1MgordiAtMC4yMzgzMTcgMC4yNjQyMzUgLTAuMTQ3MzUyCit2IC0wLjI2MTg5MyAwLjIzOTc4NCAtMC4xNDczNTIKK3YgLTAuMjc0MTAwIDAuMTc5MzUzIC0wLjE0NzM1MgordiAtMC4yNjMzMDEgMC4xMTEzMDkgLTAuMTQ3MzUyCit2IC0wLjIzNjE0NSAwLjA3MzE4NCAtMC4xNDczNTIKK3YgLTAuMTk0NDQxIDAuMDU3NzczIC0wLjE0NzM1MQordiAwLjAxNzI5OSAtMC4yOTYwNjEgLTAuMTQ3MzUwCit2IDAuMDE3Mjk5IC0wLjM1NDUyMyAtMC4xNDczNTAKK3YgLTAuMjM2ODc3IC0wLjM1NDE3OSAtMC4xNDczNTEKK3YgLTAuMjkwODYzIC0wLjMyNjM2OSAtMC4xNDczNTIKK3YgLTAuMzIxNTcwIC0wLjI2MjAzNSAtMC4xNDczNTIKK3YgLTAuMzE2NTY1IC0wLjE3Njg0NyAtMC4xNDczNTIKK3YgLTAuMjYzMDA1IC0wLjA4MTUxNSAtMC4xNDczNTIKK3YgLTAuMjU4Nzk3IC0wLjE3NTUzNiAtMC4xNDczNTEKK3YgLTAuMjY1NTY4IC0wLjIzODQxNiAtMC4xNDczNTEKK3YgLTAuMjQ2MDk0IC0wLjI3OTQ0MCAtMC4xNDczNTEKK3YgLTAuMjEyMzA5IC0wLjI5NjQ0MSAtMC4xNDczNTEKK3YgLTAuMzE2NDkxIC0wLjA4MTUwMyAtMC4xNDczNTIKK3YgLTAuMzE2NDkxIC0wLjAyMzA2NSAtMC4xNDczNTIKK3YgMC4wMTcyMzEgLTAuMDIzMDY1IC0wLjE0NzM1MAordiAwLjAxNzIzMSAtMC4wODE1MDMgLTAuMTQ3MzUwCit2IC0wLjE1NTk1MCAtMC41OTc1MjggLTAuMTQ3MzUxCit2IC0wLjMxNjUwMyAtMC43NDMzOTEgLTAuMTQ3MzUxCit2IC0wLjMxNjUwMyAtMC42NjIyMDMgLTAuMTQ3MzUxCit2IC0wLjE5OTAyMyAtMC41NTU0NzAgLTAuMTQ3MzUxCit2IC0wLjE5ODYzMiAtMC41NDY2MDcgLTAuMTQ3MzUxCit2IC0wLjMxMjY4NiAtMC40Mzc4OTIgLTAuMTQ3MzUyCit2IC0wLjMxMjY4NiAtMC4zNTQyNzUgLTAuMTQ3MzUyCit2IC0wLjE1NDU5MyAtMC41MDQ5NjcgLTAuMTQ3MzUxCit2IC0wLjE1MDA4NSAtMC41NTEzMzkgLTAuMTQ3MzUxCit2IC0wLjE0MzcxMSAtMC41MDUyMjUgLTAuMTQ3MzUxCit2IDAuMDE1NTA3IC0wLjM2MDE4NyAtMC4xNDczNTAKK3YgMC4wMTU1MDcgLTAuNDQxNDAxIC0wLjE0NzM1MAordiAtMC4xMDA4MTAgLTAuNTQ3NDQwIC0wLjE0NzM1MAordiAtMC4xMDA5ODcgLTAuNTU2MTIyIC0wLjE0NzM1MAordiAwLjAxNjI5MiAtMC42NjQ1NDUgLTAuMTQ3MzUwCit2IDAuMDE2MjkyIC0wLjc0NzkyNSAtMC4xNDczNTAKK3YgLTAuMTQ1MTQwIC0wLjU5NzY0NCAtMC4xNDczNTEKK3YgLTAuMTY0NTAzIC0wLjcyNDA0NCAtMC4xNDczNTEKK3YgLTAuMDUzMjc1IC0wLjc0MjQ1NCAtMC4xNDczNTAKK3YgMC4wMDk2OTYgLTAuNzk4MzMxIC0wLjE0NzM1MAordiAwLjAzMDY4MCAtMC45MDA0MzIgLTAuMTQ3MzUwCit2IC0wLjAwNzk2OCAtMC45OTk3MTcgLTAuMTQ3MzUwCit2IC0wLjE4Mzc1MCAtMS4wNTkzNjIgLTAuMTQ3MzUxCit2IC0wLjMyMTUzOSAtMC45MjU3NjUgLTAuMTQ3MzUxCit2IC0wLjMxNzYyOSAtMC44MjY5OTIgLTAuMTQ3MzUxCit2IC0wLjI5NDE5OCAtMC43Njg1OTMgLTAuMTQ3MzUxCit2IC0wLjI1MTg3NiAtMC43MjEyODggLTAuMTQ3MzUxCit2IC0wLjIxNjc5MiAtMC43NTk4NTEgLTAuMTQ3MzUxCit2IC0wLjI0ODc5NCAtMC43OTkyNjMgLTAuMTQ3MzUxCit2IC0wLjI2NDQ0MSAtMC44NDMxMzggLTAuMTQ3MzUxCit2IC0wLjI2OTI2NCAtMC45MDM1NTIgLTAuMTQ3MzUxCit2IC0wLjEwODYzMCAtMS4wMDYyMjMgLTAuMTQ3MzUwCit2IC0wLjA1MDYxMSAtMC45NjIxOTggLTAuMTQ3MzUwCit2IC0wLjAyNTgyMCAtMC44OTQ3NzcgLTAuMTQ3MzUwCit2IC0wLjAzOTI3MSAtMC44MzM1MDkgLTAuMTQ3MzUwCit2IC0wLjA3Mjk0NiAtMC43OTUzMzQgLTAuMTQ3MzUwCit2IC0wLjEwODcwNSAtMC43ODQzMDQgLTAuMTQ3MzUwCit2IDAuMDE2ODk1IC0xLjM3NDM5MiAtMC4xNDczNDkKK3YgMC4wMTY4OTUgLTEuNDMyODMwIC0wLjE0NzM0OQordiAtMC4zMTY0OTEgLTEuNDMyODMwIC0wLjE0NzM1MQordiAtMC4zMTY0OTEgLTEuMzc0MzkyIC0wLjE0NzM1MQordiAtMC4zMTY0OTEgLTEuMTU5ODc4IC0wLjE0NzM1MQordiAtMC4zMTY0OTEgLTEuMTAxNDE0IC0wLjE0NzM1MQordiAtMC4wNjE5OTUgLTEuMTAxNzYwIC0wLjE0NzM1MAordiAtMC4wMDgwMDkgLTEuMTI5NTY4IC0wLjE0NzM1MAordiAwLjAyMjY5NyAtMS4xOTM5MDMgLTAuMTQ3MzQ5Cit2IDAuMDE3NjkyIC0xLjI3OTA5MCAtMC4xNDczNDkKK3YgLTAuMDk1MjMxIC0xLjM3NDQwMiAtMC4xNDczNTAKK3YgLTAuMDQwMDc2IC0xLjI4MDQwMiAtMC4xNDczNTAKK3YgLTAuMDMzMzA1IC0xLjIxNzUyMyAtMC4xNDczNTAKK3YgLTAuMDUyNzc4IC0xLjE3NjQ5OCAtMC4xNDczNTAKK3YgLTAuMDg2NTY0IC0xLjE1OTQ5OCAtMC4xNDczNTAKK3YgLTAuMTE1NzkwIC0wLjcyNDA4NSAtMC4xNDczNTAKK3YgLTAuMjAyOTYzIDAuMDUyMDM5IC0wLjE0NzM1MQordiAtMC4yMDQxNzYgMC4wMTQ1MzEgLTAuMTQ3MzUxCit2IC0wLjI1OTM1MSAwLjAzMzk3MSAtMC4xNDczNTEKK3YgLTAuMzAyNzI4IDAuMDg5MTQzIC0wLjE0NzM1MgordiAtMC4zMTk1MjkgMC4xODAwNDMgLTAuMTQ3MzUyCit2IC0wLjI5Nzg4MSAwLjI2ODU1NCAtMC4xNDczNTIKK3YgLTAuMjQ5MjQwIDAuMzEwMTE1IC0wLjE0NzM1MgordiAtMC4xOTM3MDUgMC4zMDM3MTQgLTAuMTQ3MzUxCit2IC0wLjE1ODI1MSAwLjI2Nzk4MCAtMC4xNDczNTEKK3YgLTAuMTQxMTgzIDAuMjIxMjM0IC0wLjE0NzM1MQordiAtMC4xMzMzOTcgMC4xNzAxMjkgLTAuMTQ3MzUxCit2IC0wLjEyNjg3OSAwLjEyNTg4OSAtMC4xNDczNTEKK3YgLTAuMTE0Mzg0IDAuMDg4MzkxIC0wLjE0NzM1MQordiAtMC4wODk3NjAgMC4wNjIwODIgLTAuMTQ3MzUxCit2IC0wLjA1ODAxMSAwLjA2MDExNyAtMC4xNDczNTEKK3YgLTAuMDI4MzA3IDAuMDkwMTUyIC0wLjE0NzM1MQordiAtMC4wMTQ1NjQgMC4xNTY1MDAgLTAuMTQ3MzUxCit2IC0wLjAyNzI2NiAwLjIyMDI0MCAtMC4xNDczNTEKK3YgLTAuMDU5ODcxIDAuMjYzMzc2IC0wLjE0NzM1MQordiAtMC4xMDA2NzMgMC4yNzgzMzggLTAuMTQ3MzUxCit2IC0wLjA5OTA5MyAwLjMxNTgzMyAtMC4xNDczNTEKK3YgLTAuMDQxNjkyIDAuMjk1NTk0IC0wLjE0NzM1MQordiAwLjAwNDMzMiAwLjIzOTEzNyAtMC4xNDczNTAKK3YgMC4wMjI0MDEgMC4xNTU5ODcgLTAuMTQ3MzUwCit2IDAuMDAwMDA4IDAuMDY1MzcyIC0wLjE0NzM1MAordiAtMC4wNTA0MjEgMC4wMjI3MjggLTAuMTQ3MzUxCit2IC0wLjEwODIwNSAwLjAyOTU1NCAtMC4xNDczNTEKK3YgLTAuMTQ0Njc5IDAuMDY2MTczIC0wLjE0NzM1MQordiAtMC4xNjIxNzkgMC4xMTM3ODkgLTAuMTQ3MzUxCit2IC0wLjE3MDA4NyAwLjE2NTU1MSAtMC4xNDczNTEKK3YgLTAuMTc2NDc3IDAuMjA5MTQ0IC0wLjE0NzM1MQordiAtMC4xODg1MzEgMC4yNDU3NjAgLTAuMTQ3MzUxCit2IC0wLjIxMjE0OSAwLjI3MTE4NiAtMC4xNDczNTEKK3YgLTAuMjQxNjc0IDAuMjcyNzU4IC0wLjE0NzM1MgordiAtMC4yNjk1NzggMC4yNDM4MTggLTAuMTQ3MzUyCit2IC0wLjI4MjU2NCAwLjE3OTUzMSAtMC4xNDczNTIKK3YgLTAuMjcxMjIyIDAuMTA4MDY5IC0wLjE0NzM1MgordiAtMC4yNDE0NDIgMC4wNjYyNjAgLTAuMTQ3MzUyCit2IC0wLjI1ODAzNyAtMC4wODk4NTkgLTAuMTQ3MzUyCit2IC0wLjIxODE5OSAtMC4wODk4NTkgLTAuMTQ3MzUxCit2IC0wLjI2Njg4OSAtMC4xNzI4NjQgLTAuMTQ3MzUxCit2IC0wLjI3NDEwNCAtMC4yMzk4NjIgLTAuMTQ3MzUxCit2IC0wLjI1MjM5NCAtMC4yODU1OTcgLTAuMTQ3MzUxCit2IC0wLjIxNDI4MCAtMC4zMDQ3NzUgLTAuMTQ3MzUxCit2IDAuMDA5Mjg3IC0wLjMwNDQwNiAtMC4xNDczNTAKK3YgMC4wMDkyODcgLTAuMzQ2MTgwIC0wLjE0NzM1MAordiAtMC4yMzQ4NTIgLTAuMzQ1ODQ5IC0wLjE0NzM1MQordiAtMC4yODQ1NTMgLTAuMzIwMjQ4IC0wLjE0NzM1MQordiAtMC4zMTMxMjcgLTAuMjYwMzgyIC0wLjE0NzM1MgordiAtMC4zMDgzNjAgLTAuMTc5MjU4IC0wLjE0NzM1MgordiAtMC4zMDgxNTkgLTAuMDMxMzk3IC0wLjE0NzM1MgordiAwLjAwODU2NCAtMC4wMzEzOTcgLTAuMTQ3MzUwCit2IDAuMDA4NTY0IC0wLjA3MzE3MSAtMC4xNDczNTAKK3YgLTAuMzA4MTU5IC0wLjA3MzE3MSAtMC4xNDczNTIKK3YgLTAuMTYzNzYxIC0wLjU5MzM2NyAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjcyNDU2NSAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjY2NTg5MCAtMC4xNDczNTEKK3YgLTAuMTk1NDQ2IC0wLjU2MzQ3OCAtMC4xNDczNTEKK3YgLTAuMTU4ODI5IC0wLjU1OTcxMSAtMC4xNDczNTEKK3YgLTAuMzA0MzU0IC0wLjQzNDMyNCAtMC4xNDczNTIKK3YgLTAuMzA0MzU0IC0wLjM3MzcyNyAtMC4xNDczNTIKK3YgLTAuMTYyNTAwIC0wLjUwODk0MCAtMC4xNDczNTEKK3YgLTAuMTU4NTM4IC0wLjU0MTI2NCAtMC4xNDczNTEKK3YgLTAuMTk1MDM4IC0wLjUzODUyMiAtMC4xNDczNTEKK3YgLTAuMTM1ODAxIC0wLjUwOTI5MSAtMC4xNDczNTEKK3YgMC4wMDcxNzUgLTAuMzc5MDQ3IC0wLjE0NzM1MAordiAwLjAwNzE3NSAtMC40Mzc3MjIgLTAuMTQ3MzUwCit2IC0wLjEwNDI0OCAtMC41MzkyOTkgLTAuMTQ3MzUwCit2IC0wLjEzOTU5MyAtMC41NDE0MjAgLTAuMTQ3MzUxCit2IDAuMDA3OTYwIC0wLjY2ODE5MCAtMC4xNDczNTAKK3YgMC4wMDc5NjAgLTAuNzI4Nzg2IC0wLjE0NzM1MAordiAtMC4xMzcxMDEgLTAuNTkzNzQ1IC0wLjE0NzM1MQordiAtMC4xMzk4OTQgLTAuNTU5ODI2IC0wLjE0NzM1MQordiAtMC4xMDQ2NjIgLTAuNTY0MDcxIC0wLjE0NzM1MAordiAtMC4yODcwMTIgLTAuNzczMDU2IC0wLjE0NzM1MQordiAtMC4yNTE4MjQgLTAuNzMzNzI3IC0wLjE0NzM1MQordiAtMC4yMjc3NzUgLTAuNzYwMTU3IC0wLjE0NzM1MQordiAtMC4yNTYxNjIgLTAuNzk1MTE4IC0wLjE0NzM1MQordiAtMC4yNzI1OTggLTAuODQxMjEwIC0wLjE0NzM1MQordiAtMC4yNzcyMDggLTAuOTA2OTAzIC0wLjE0NzM1MQordiAtMC4xMDQ3NjkgLTEuMDE0OTk5IC0wLjE0NzM1MAordiAtMC4wNDQxMjMgLTAuOTY3ODc0IC0wLjE0NzM1MAordiAtMC4wMTcyNDMgLTAuODk1NjUyIC0wLjE0NzM1MAordiAtMC4wMzE3MTIgLTAuODI5NDg0IC0wLjE0NzM1MAordiAtMC4wNjgyNTAgLTAuNzg4MDY0IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuNzczMDE1IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuOTk3ODg0IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuOTk3ODU3IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuNzMyMzgzIC0wLjE0NzM1MQordiAtMC4xMTY5OTIgLTAuNzMyNDE2IC0wLjE0NzM1MAordiAtMC4wNTc0MTIgLTAuNzQ5OTI0IC0wLjE0NzM1MAordiAwLjAwMjIyMyAtMC44MDI4MzggLTAuMTQ3MzUwCit2IDAuMDIyMTI3IC0wLjg5OTQ5MyAtMC4xNDczNTAKK3YgLTAuMDE0NDU3IC0wLjk5NDAzOCAtMC4xNDczNTAKK3YgLTAuMTc4NjQwIC0xLjA1MjQ1MiAtMC4xNDczNTEKK3YgLTAuMzEzNTk0IC0wLjkyMjQxNSAtMC4xNDczNTEKK3YgLTAuMzA5NTIzIC0wLjgyOTE2NCAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjQyNDQ5OCAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjM4MjcyNCAtMC4xNDczNTEKK3YgMC4wMDg1NjQgLTEuMzgyNzI0IC0wLjE0NzM0OQordiAwLjAwODU2NCAtMS40MjQ0OTggLTAuMTQ3MzQ5Cit2IC0wLjA0MDgzNSAtMS4zNjYwNzcgLTAuMTQ3MzUwCit2IC0wLjA4MDY3NCAtMS4zNjYwNzcgLTAuMTQ3MzUwCit2IC0wLjAzMTk4NCAtMS4yODMwNzQgLTAuMTQ3MzUwCit2IC0wLjAyNDc2OSAtMS4yMTYwNzYgLTAuMTQ3MzUwCit2IC0wLjA0NjQ3OCAtMS4xNzAzNDEgLTAuMTQ3MzUwCit2IC0wLjA4NDU5MiAtMS4xNTExNjMgLTAuMTQ3MzUwCit2IC0wLjMwODE1OSAtMS4xNTE1MzMgLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS4xMDk3NTggLTAuMTQ3MzUxCit2IC0wLjA2NDAyMCAtMS4xMTAwODcgLTAuMTQ3MzUwCit2IC0wLjAxNDMyMCAtMS4xMzU2OTEgLTAuMTQ3MzUwCit2IDAuMDE0MjU0IC0xLjE5NTU1NCAtMC4xNDczNDkKK3YgMC4wMDk0ODggLTEuMjc2NjgxIC0wLjE0NzM0OQordiAtMC4wODI4NDIgLTEuMDU0Mzk4IC0wLjE0NzM1MAordiAtMC4xNjQ0NzAgLTEuMDA2MTY0IC0wLjE0NzM1MAordiAtMC4xNjgyMjQgLTEuMDE0NzE1IC0wLjE0NzM1MQordiAtMC4wODc1NDEgLTEuMDQ3MDgxIC0wLjE0NzM1MAordiAtMC4yNzU2OTYgLTEuMDA4NjYyIC0wLjE0NzM1MQordiAtMC4yMzc5ODEgLTAuOTY5OTMxIC0wLjE0NzM1MQordiAtMC4yNDM2OTcgLTAuOTc1ODA4IC0wLjE0NzM1MQordiAtMC4yNjk5NzkgLTEuMDAyNzg0IC0wLjE0NzM1MQordiAtMC4wOTUyNDIgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wMzU5NjMgLTEuMzc0NDAyIC0wLjE0NzM1MAordiAtMC4wMzU5NjcgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4xNTAwNzQgLTAuNTQ5MzQwIC0wLjE0NzM1MQordiAtMC4xNDc5OTQgLTAuNTQ5MzUxIC0wLjE0NzM1MQordiAtMC4xNDgwMzYgLTAuNTUxMzY4IC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDIzMDY1IC0wLjE0NzM1MQordiAtMC4yMDM0OTcgLTAuMDgxNTE1IC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDczMTcxIC0wLjE0NzM1MQordiAtMC4yNjMxMDEgLTAuMDIzMDY1IC0wLjE0NzM1MgordiAtMC4yNjMwNzkgLTAuMDMxMzk3IC0wLjE0NzM1MgordiAtMC4yNjMwNzkgLTAuMDczMTcxIC0wLjE0NzM1MgordiAtMC4xMTgxNTYgLTEuMTAxNTkzIC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTU5Njc0IC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTUxMzM1IC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTA5OTMwIC0wLjE0NzM1MAordiAtMC4xODU3MzUgLTAuMzU0MzE0IC0wLjE0NzM1MQordiAtMC4xODU3MzQgLTAuMjk2MzIyIC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzA0NjU2IC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzQ1OTc4IC0wLjE0NzM1MQordiAwLjAwMTg5MyAtMS40MzI4MzAgLTAuMTQ3MzQ5Cit2IC0wLjAwNDQxNyAtMS40MjQ0OTggLTAuMTQ3MzQ5Cit2IDAuMDAxODg4IC0xLjM3NDM5NyAtMC4xNDczNDkKK3YgLTAuMDA0NDE3IC0xLjM4MjcyNCAtMC4xNDczNDkKK3YgLTAuMzAyNTE3IC0xLjM3NDM5NyAtMC4xNDczNTEKK3YgLTAuMjk2NzczIC0xLjM4MjcyNCAtMC4xNDczNTEKK3YgLTAuMzAyNDU4IC0xLjQzMjgzMCAtMC4xNDczNTEKK3YgLTAuMjk2NzczIC0xLjQyNDQ5OCAtMC4xNDczNTEKK3YgLTAuMzE2NDkxIC0xLjQwMzYxMiAtMC4xNDczNTEKK3YgMC4wMTY4OTUgLTEuNDAzNjEyIC0wLjE0NzM0OQordiAtMC4zMDgxNTkgLTEuNDAzNjEyIC0wLjE0NzM1MQordiAwLjAwODU2NCAtMS40MDM2MTIgLTAuMTQ3MzQ5Cit2IC0wLjA4NjA1OCAtMS4zNTg3NjggLTAuMTQ3MzUwCit2IC0wLjAzMDA2OSAtMS4zNjM5MzMgLTAuMTQ3MzUwCit2IC0wLjA3NDcyOCAtMS4zNTU5NDEgLTAuMTQ3MzUwCit2IC0wLjAzNjYwNiAtMS4zNTg1NjcgLTAuMTQ3MzUwCit2IC0wLjA2NTU5NyAtMS4zNzQ0MDIgLTAuMTQ3MzUwCit2IC0wLjMxNjQ5MSAtMS4xMzExNDUgLTAuMTQ3MzUxCit2IC0wLjA2MDc1NCAtMS4zNjYwNzcgLTAuMTQ3MzUwCit2IC0wLjMwODE1OSAtMS4xMzExNDUgLTAuMTQ3MzUxCit2IC0wLjA2NTYwNCAtMS4zODI3MjQgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMiAtMS40MzI4MzAgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMiAtMS40MjQ0OTggLTAuMTQ3MzUwCit2IC0wLjExODE0MyAtMS4zNzQ0MDIgLTAuMTQ3MzUwCit2IC0wLjExODE0MyAtMS4zODI3MjQgLTAuMTQ3MzUwCit2IC0wLjMwMjU5MCAtMS4xMDE0MjYgLTAuMTQ3MzUxCit2IC0wLjI5NzAwOCAtMS4xMDk3NjkgLTAuMTQ3MzUxCit2IC0wLjMwMjUyMyAtMS4xNTk4NjQgLTAuMTQ3MzUxCit2IC0wLjI5NzAwOCAtMS4xNTE1MjAgLTAuMTQ3MzUxCit2IC0wLjMwMjUxOCAtMS4zNTQzNjAgLTAuMTQ3MzUxCit2IC0wLjMwMjUyMiAtMS4xOTM2OTIgLTAuMTQ3MzUxCit2IC0wLjExODE1NCAtMS4xOTM2OTIgLTAuMTQ3MzUwCit2IC0wLjExODE1MiAtMS4yMjUwMDkgLTAuMTQ3MzUwCit2IC0wLjExODE0OCAtMS4yODg4MzQgLTAuMTQ3MzUwCit2IC0wLjExODE0NCAtMS4zNTQzMjUgLTAuMTQ3MzUwCit2IC0wLjE2NDQ4MyAtMC44OTQ3NzggLTAuMTQ3MzUxCit2IC0wLjEwODY2OCAtMC44OTQ3OTUgLTAuMTQ3MzUwCit2IC0wLjExNzAzNyAtMC44OTQ3OTAgLTAuMTQ3MzUwCit2IC0wLjE1NjE3MSAtMC44OTQ3NzggLTAuMTQ3MzUxCit2IC0wLjI2MTM5OCAtMC43MzE5MzMgLTAuMTQ3MzUxCit2IC0wLjIyMzk5MiAtMC43Njg3MTggLTAuMTQ3MzUxCit2IC0wLjI1OTc0MSAtMC43NDI1NzYgLTAuMTQ3MzUxCit2IC0wLjIzNDE2MiAtMC43NjgwMjUgLTAuMTQ3MzUxCit2IC0wLjE2NDUwMSAtMC43Mzk2NjYgLTAuMTQ3MzUxCit2IC0wLjE1NjE3MSAtMC43NDYxMzAgLTAuMTQ3MzUxCit2IC0wLjEwODcwMCAtMC43OTc1NjMgLTAuMTQ3MzUwCit2IC0wLjExNzAzNyAtMC43ODc2MjggLTAuMTQ3MzUwCit2IC0wLjE2NDQ5OCAtMC43Njg4OTkgLTAuMTQ3MzUxCit2IC0wLjE1NjE3MSAtMC43Njg5MDIgLTAuMTQ3MzUxCit2IC0wLjE2NDQ3MiAtMC45OTI4MDAgLTAuMTQ3MzUwCit2IC0wLjE1NjE3MSAtMC45ODU0ODcgLTAuMTQ3MzUwCit2IC0wLjEwODYzNCAtMC45OTI4NTMgLTAuMTQ3MzUwCit2IC0wLjExNzAzNyAtMC45ODU1MTIgLTAuMTQ3MzUwCit2IC0wLjA5Nzk3NyAtMC43ODc2MTMgLTAuMTQ3MzUwCit2IC0wLjEwMjQwMSAtMC43Nzc1MzAgLTAuMTQ3MzUwCit2IC0wLjE2NDQ4OSAtMC44NDc2NjQgLTAuMTQ3MzUxCit2IC0wLjE1NjE3MSAtMC44NDc2NjQgLTAuMTQ3MzUxCit2IC0wLjEwODY4NCAtMC44NDc2NzEgLTAuMTQ3MzUwCit2IC0wLjExNzAzNyAtMC44NDc2NjkgLTAuMTQ3MzUwCit2IC0wLjEwODY5NCAtMC44MTU1NjUgLTAuMTQ3MzUwCit2IC0wLjExNzAzNyAtMC44MTQwNTAgLTAuMTQ3MzUwCit2IC0wLjE2NDQ5MyAtMC44MTExOTEgLTAuMTQ3MzUxCit2IC0wLjE1NjE3MSAtMC44MTExOTEgLTAuMTQ3MzUxCit2IC0wLjMwMTI1MSAtMC43Mjk1MzQgLTAuMTQ3MzUxCit2IC0wLjMwNTM0MiAtMC42NTIwNjQgLTAuMTQ3MzUxCit2IC0wLjI5NDQ1MiAtMC43MTIxMDEgLTAuMTQ3MzUxCit2IC0wLjI5NzQ2MyAtMC42NTYxNjEgLTAuMTQ3MzUxCit2IDAuMDAxMzYzIC0wLjczNDAyNSAtMC4xNDczNTAKK3YgMC4wMDY5MTAgLTAuNjU1ODcxIC0wLjE0NzM1MAordiAtMC4wMDU2NTkgLTAuNzE2MTA3IC0wLjE0NzM1MAordiAtMC4wMDEwNDkgLTAuNjU5ODYwIC0wLjE0NzM1MAordiAtMC4wNjE3MzkgLTAuNTkyNDA2IC0wLjE0NzM1MAordiAtMC4wNjE3NjcgLTAuNjAzNzI4IC0wLjE0NzM1MAordiAtMC4yNTY0NDIgLTAuNjg4ODI1IC0wLjE0NzM1MQordiAtMC4yNTY0NDQgLTAuNjc3NTY5IC0wLjE0NzM1MQordiAtMC4yNTY1NDcgLTAuNjA3NzMxIC0wLjE0NzM1MQordiAtMC4yNTY1MjEgLTAuNjE4OTY1IC0wLjE0NzM1MQordiAtMC4xNDM5ODQgLTAuNzI0MDY0IC0wLjE0NzM1MQordiAtMC4xNDA0MTkgLTAuNzMyNDAwIC0wLjE0NzM1MAordiAtMC4yMzQzMzQgLTAuNzQwNTY4IC0wLjE0NzM1MQordiAtMC4yMzk3OTkgLTAuNzQ2OTQzIC0wLjE0NzM1MQordiAtMC4xNjU0MDEgLTAuNjA2MTE0IC0wLjE0NzM1MQordiAtMC4xNzIwMjUgLTAuNjAwODc1IC0wLjE0NzM1MQordiAtMC4yMDc5MTcgLTAuNTYzNTUxIC0wLjE0NzM1MQordiAtMC4yMDI5MzYgLTAuNTcwMjgzIC0wLjE0NzM1MQordiAtMC4wOTExMjIgLTAuNTY1MjQyIC0wLjE0NzM1MAordiAtMC4wOTYxNTUgLTAuNTcxOTM2IC0wLjE0NzM1MAordiAtMC4xMzQwNjMgLTAuNjA3OTU2IC0wLjE0NzM1MQordiAtMC4xMjc0MDAgLTAuNjAyNzc2IC0wLjE0NzM1MQordiAtMC4xMzUxMzAgLTAuNDk3NDA4IC0wLjE0NzM1MQordiAtMC4wOTE0ODkgLTAuNTM4OTQyIC0wLjE0NzM1MAordiAtMC4xMjc3NzcgLTAuNTAxOTgwIC0wLjE0NzM1MQordiAtMC4wOTU3NDAgLTAuNTMxNTQzIC0wLjE0NzM1MAordiAtMC4xNjIzNjcgLTAuNDk3NTU2IC0wLjE0NzM1MQordiAtMC4yMDY4ODIgLTAuNTM4NzQzIC0wLjE0NzM1MQordiAtMC4xNzE4ODggLTAuNDk5OTkyIC0wLjE0NzM1MQordiAtMC4yMDQxNDggLTAuNTI5ODM4IC0wLjE0NzM1MQordiAtMC4zMTY1MDMgLTAuNzAyNzk3IC0wLjE0NzM1MQordiAtMC4zMTI2ODYgLTAuMzk2MDg0IC0wLjE0NzM1MgordiAwLjAxNTUwNyAtMC40MDA3OTQgLTAuMTQ3MzUwCit2IDAuMDE2MjkyIC0wLjcwNjIzNSAtMC4xNDczNTAKK3YgLTAuMzA4MTcxIC0wLjY5NTIyNyAtMC4xNDczNTEKK3YgLTAuMzA0MzU0IC0wLjQwNDAyNSAtMC4xNDczNTIKK3YgMC4wMDcxNzUgLTAuNDA4Mzg1IC0wLjE0NzM1MAordiAwLjAwNzk2MCAtMC42OTg0ODggLTAuMTQ3MzUwCit2IC0wLjE1NjU2NiAtMC42MDY2MzMgLTAuMTQ3MzUxCit2IC0wLjE0NDc1OCAtMC42MDczMjggLTAuMTQ3MzUxCit2IC0wLjE5NTMyOSAwLjAzMDMzMyAtMC4xNDczNTEKK3YgLTAuMTA4MDk4IDAuMzAwMDI0IC0wLjE0NzM1MQordiAtMC4yMDM1NzAgMC4wMzMyODUgLTAuMTQ3MzUxCit2IC0wLjA5OTg4MyAwLjI5NzA4NiAtMC4xNDczNTEKK3YgLTAuMDk0NjUzIDAuMzIzMTAzIC0wLjE0NzM1MQordiAtMC4xMDE1MTYgMC4yNjk3NzMgLTAuMTQ3MzUxCit2IC0wLjA5MzUzMyAwLjI3NTcyMCAtMC4xNDczNTEKK3YgLTAuMDg5MDQ4IDAuMzEyMjkxIC0wLjE0NzM1MQordiAtMC4yMDgxNTAgMC4wMDcwOTcgLTAuMTQ3MzUxCit2IC0wLjIwMTczOSAwLjA2MDQ3MSAtMC4xNDczNTEKK3YgLTAuMjEzODMyIDAuMDE3OTMzIC0wLjE0NzM1MQordiAtMC4yMDk2OTcgMC4wNTQ1MjggLTAuMTQ3MzUxCit2IDAuMDE3MjMxIC0wLjA1MjI4NCAtMC4xNDczNTAKK3YgLTAuMzE2NDkxIC0wLjA1MjI4NCAtMC4xNDczNTIKK3YgMC4wMDg1NjQgLTAuMDUyMjg0IC0wLjE0NzM1MAordiAtMC4zMDgxNTkgLTAuMDUyMjg0IC0wLjE0NzM1MgordiAtMC4yMzMyNTEgLTAuMDgxNTE1IC0wLjE0NzM1MQordiAwLjAxNzI5OSAtMC4zMjUyOTIgLTAuMTQ3MzUwCit2IC0wLjIzODExOCAtMC4wODk4NTkgLTAuMTQ3MzUxCit2IDAuMDA5Mjg3IC0wLjMyNTI5MyAtMC4xNDczNTAKK3YgLTAuMjMzMjEwIC0wLjA3MzE3MSAtMC4xNDczNTEKK3YgLTAuMjMzMjIxIC0wLjAyMzA2NSAtMC4xNDczNTEKK3YgLTAuMjMzMjEwIC0wLjAzMTM5NyAtMC4xNDczNTEKK3YgLTAuMjEwOTE5IC0wLjA5NDEzNSAtMC4xNDczNTEKK3YgLTAuMjY3NTQ1IC0wLjA4OTU5NyAtMC4xNDczNTIKK3YgLTAuMjI0ODkwIC0wLjEwMTI2NyAtMC4xNDczNTEKK3YgLTAuMjYyMjE5IC0wLjA5NzI4OCAtMC4xNDczNTIKK3YgLTAuMzAyMzQzIC0wLjAyMzA2NSAtMC4xNDczNTIKK3YgLTAuMjk2MjEzIC0wLjAzMTM5NyAtMC4xNDczNTIKK3YgLTAuMzAyMzE3IC0wLjA4MTUwNiAtMC4xNDczNTIKK3YgLTAuMjk2MjEzIC0wLjA3MzE3MSAtMC4xNDczNTIKK3YgMC4wMDE5NDggLTAuMDgxNTA0IC0wLjE0NzM1MAordiAtMC4wMDI5MzYgLTAuMDczMTcxIC0wLjE0NzM1MAordiAwLjAwMzE4OCAtMC4wMjMwNjUgLTAuMTQ3MzUwCit2IC0wLjAwMjkzNiAtMC4wMzEzOTcgLTAuMTQ3MzUwCit2IC0wLjE0ODE2OSAtMC4wMjMwNjUgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wODE1MTQgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IDAuMDAwNTY3IC0wLjM1NDUwNSAtMC4xNDczNTAKK3YgLTAuMDA1NTU3IC0wLjM0NjE2NCAtMC4xNDczNTAKK3YgMC4wMDE3NjUgLTAuMjk2MDgwIC0wLjE0NzM1MAordiAtMC4wMDU1NTcgLTAuMzA0NDI1IC0wLjE0NzM1MAordiAwLjAwMTkzNiAtMC4wOTU1MzIgLTAuMTQ3MzUwCit2IDAuMDAxODQyIC0wLjIwNTg5NSAtMC4xNDczNTAKK3YgMC4wMDE3ODQgLTAuMjc0MTgyIC0wLjE0NzM1MAordiAtMC4xODU3MzQgLTAuMjc0Mzc2IC0wLjE0NzM1MQordiAtMC4xODU3MzQgLTAuMjM1OTkzIC0wLjE0NzM1MQordiAtMC4xODU3MzQgLTAuMTc2MDQ5IC0wLjE0NzM1MQordiAtMC4xNDgxNjkgLTAuMDk1NTg4IC0wLjE0NzM1MQordiAtMC4wOTQ4MTEgLTAuMjk2MjAyIC0wLjE0NzM1MQordiAtMC4wOTQ4MTUgLTAuMzA0NTQwIC0wLjE0NzM1MQordiAtMC4wOTQ4MTEgLTAuMDgxNTA5IC0wLjE0NzM1MQordiAtMC4wOTQ4MTQgLTAuMDczMTcxIC0wLjE0NzM1MQordiAtMC4wOTQ4MTAgLTAuMDIzMDY1IC0wLjE0NzM1MQordiAtMC4wOTQ4MTQgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4wOTQ4MTIgLTAuMzU0NDA5IC0wLjE0NzM1MQordiAtMC4wOTQ4MTUgLTAuMzQ2MDcxIC0wLjE0NzM1MQordiAtMC4wOTQ4MTEgLTAuMjc0Mjc4IC0wLjE0NzM1MQordiAtMC4wOTQ4MTEgLTAuMjA1OTU4IC0wLjE0NzM1MQordiAtMC4wOTQ4MTEgLTAuMDk1NTYwIC0wLjE0NzM1MQordiAwLjAwOTA4NyAtMC40NDcyNTQgLTAuMTQ3MzUwCit2IDAuMDAxMDAwIC0wLjQ0MzM1MiAtMC4xNDczNTAKK3YgMC4wMDY0NjkgLTAuMzY4NDIwIC0wLjE0NzM1MAordiAtMC4wMDA5MjIgLTAuMzg2NDIzIC0wLjE0NzM1MAordiAtMC4yOTc3NjAgLTAuMzY4NTAyIC0wLjE0NzM1MgordiAtMC4yOTE1NzAgLTAuMzg1OTEyIC0wLjE0NzM1MQordiAtMC4zMDMxMDEgLTAuNDQ3MDI5IC0wLjE0NzM1MgordiAtMC4yOTU0NDEgLTAuNDQyODE5IC0wLjE0NzM1MQordiAtMC4yNDc0MTcgLTAuNTAwMTA1IC0wLjE0NzM1MQordiAtMC4yNDc0MTAgLTAuNDg4NTk0IC0wLjE0NzM1MQordiAtMC4yNDc0MjQgLTAuNDE2NDgyIC0wLjE0NzM1MQordiAtMC4yNDc0MTQgLTAuNDI4MDAxIC0wLjE0NzM1MQordiAtMC4wNTY3OTQgLTAuNDI2MDQ5IC0wLjE0NzM1MAordiAtMC4wNTY4MDggLTAuNDM3MzQ0IC0wLjE0NzM1MAordiAtMC4wNTY3ODMgLTAuNTA3MzAyIC0wLjE0NzM1MAordiAtMC4wNTY3OTcgLTAuNDk2MDQxIC0wLjE0NzM1MAordiAwLjA4MDc3MCAwLjI0Mjg3MCAtMC4xNDczNTAKK3YgMC4wODA3NzAgMC4xNTU2NTUgLTAuMTQ3MzUwCit2IDAuMDgwNzcwIDAuMDYwODU4IC0wLjE0NzM1MAordiAwLjA4MDc2OSAtMC4zNTQ1MjMgLTAuMTQ3MzUwCit2IDAuMDgwNzY5IC0wLjA5NTUyNyAtMC4xNDczNTAKK3YgMC4wODA3NjkgLTAuNjEwNDUxIC0wLjE0NzM1MAordiAwLjA4MDc2OSAtMC43OTY2NzYgLTAuMTQ3MzQ5Cit2IDAuMDgwNzY5IC0wLjkwMDQzMiAtMC4xNDczNDkKK3YgMC4wODA3NjkgLTEuMDU4MTEyIC0wLjE0NzM0OQordiAwLjA4MDc2OSAtMS40OTM2MDAgLTAuMTQ3MzQ5Cit2IDAuMDgwNzY5IC0xLjMxNTY3NCAtMC4xNDczNDkKK3YgMC4wODA3NzAgLTAuMDUyMjg0IC0wLjE0NzM1MAordiAwLjA4MDc2OSAtMC4zMjUyOTEgLTAuMTQ3MzUwCit2IDAuMDgwNzY5IC0wLjIwNTg4NSAtMC4xNDczNTAKK3YgMC4wODA3NjkgLTAuMjc0MTY1IC0wLjE0NzM1MAordiAtMC4zNzc5OTkgMC4xODAyODcgLTAuMTQ3MzUyCit2IC0wLjI5MzY0OCAwLjQwOTMyNiAtMC4xNDczNTIKK3YgLTAuMzc3OTk5IC0wLjEyNDM4NSAtMC4xNDczNTIKK3YgLTAuMzc3OTk5IDAuMDMwMjY3IC0wLjE0NzM1MgordiAtMC4zNzgwMDAgLTAuMzk0OTk5IC0wLjE0NzM1MgordiAtMC4zNzc5OTkgLTAuMjg1MzU0IC0wLjE0NzM1MgordiAtMC4zNzgwMDAgLTAuODI3MDM3IC0wLjE0NzM1MgordiAtMC4zNzgwMDAgLTEuMzU0MzcwIC0wLjE0NzM1MQordiAtMC4zNzgwMDAgLTAuOTU3MTE1IC0wLjE0NzM1MgordiAtMC4zNzgwMDAgLTEuNDAzNjA0IC0wLjE0NzM1MQordiAtMC4zNzgwMDAgLTEuMTMxMTYwIC0wLjE0NzM1MQordiAtMC4zNzgwMDAgLTEuMTkzNjkyIC0wLjE0NzM1MQordiAtMC4zNzgwMDAgLTAuNzAyNzk3IC0wLjE0NzM1MgordiAtMC4zNzc5OTkgLTAuMDUyMjg0IC0wLjE0NzM1MgordiAtMC4zNzgwMDAgLTEuNDkzNjAwIC0wLjE0NzM1MQordiAtMC4xNDc2MTIgLTEuNDkzNjAwIC0wLjE0NzM1MAordiAwLjAwMTg5MyAtMS40OTM2MDAgLTAuMTQ3MzQ5Cit2IC0wLjI5MzczNyAtMS40OTM2MDAgLTAuMTQ3MzUxCit2IC0wLjA1OTM3MSAtMC41NTI0NjEgLTAuMTQ3MzUwCit2IDAuMDgwNzY5IC0wLjQ5ODM2NCAtMC4xNDczNTAKK3YgLTAuMzA0MzM0IC0wLjU2MDU2MiAtMC4xNDczNTEKK3YgLTAuMzc4MDAwIC0wLjU2MDU1NyAtMC4xNDczNTIKK3YgLTAuMjUyNzkyIC0wLjU2MDY2MCAtMC4xNDczNTEKK3YgLTAuMzA0MTEyIC0wLjU0MDI0NiAtMC4xNDczNTEKK3YgLTAuMzc4MDAwIC0wLjU0MDI0OCAtMC4xNDczNTIKK3YgLTAuMjUxMDYyIC0wLjU0MDM0NyAtMC4xNDczNTEKK3YgLTAuMDk1MDcwIDAuNDA5MzM4IC0wLjE0NzM1MQordiAwLjA4MDc3MCAwLjQwOTMzNyAtMC4xNDczNTAKK3YgLTAuMTg5NTUwIDAuNDA5MzMzIC0wLjE0NzM1MgordiAwLjE1NzE4MiAtMS4zNTk2MDQgLTAuMTQ3MzQ5Cit2IDAuMTU3MTgyIC0xLjExNjg5MCAtMC4xNDczNDkKK3YgMC4xNTcxODMgLTAuNjY0NTQ4IC0wLjE0NzM0OQordiAwLjE1NzE4MyAtMC40OTg0MDQgLTAuMTQ3MzQ5Cit2IDAuMTU3MTgzIC0wLjMzODk4MSAtMC4xNDczNDkKK3YgMC4xNTcxODMgMC4yMDM2NDggLTAuMTQ3MzUwCit2IDAuMTU3MTgzIDAuMDYwODU5IC0wLjE0NzM1MAordiAtMC4yMDI5NjMgMC4wNTIwMzkgLTAuMTQxNDgyCit2IC0wLjIwNDE3NiAwLjAxNDUzMCAtMC4xNDE0ODIKK3YgLTAuMjU5MzUyIDAuMDMzOTcxIC0wLjE0MTQ4MgordiAtMC4zMDI3MjggMC4wODkxNDMgLTAuMTQxNDgyCit2IC0wLjMxOTUyOSAwLjE4MDA0MyAtMC4xNDE0ODMKK3YgLTAuMjk3ODgxIDAuMjY4NTU0IC0wLjE0MTQ4MgordiAtMC4yNDkyNDAgMC4zMTAxMTQgLTAuMTQxNDgyCit2IC0wLjE5MzcwNSAwLjMwMzcxNCAtMC4xNDE0ODIKK3YgLTAuMTU4MjUxIDAuMjY3OTgwIC0wLjE0MTQ4MgordiAtMC4xNDExODMgMC4yMjEyMzQgLTAuMTQxNDgyCit2IC0wLjEzMzM5NyAwLjE3MDEyOSAtMC4xNDE0ODIKK3YgLTAuMTI2ODc5IDAuMTI1ODg5IC0wLjE0MTQ4MgordiAtMC4xMTQzODQgMC4wODgzOTEgLTAuMTQxNDgxCit2IC0wLjA4OTc2MCAwLjA2MjA4MiAtMC4xNDE0ODEKK3YgLTAuMDU4MDExIDAuMDYwMTE3IC0wLjE0MTQ4MQordiAtMC4wMjgzMDcgMC4wOTAxNTIgLTAuMTQxNDgxCit2IC0wLjAxNDU2NCAwLjE1NjUwMCAtMC4xNDE0ODEKK3YgLTAuMDI3MjY2IDAuMjIwMjQwIC0wLjE0MTQ4MQordiAtMC4wNTk4NzEgMC4yNjMzNzUgLTAuMTQxNDgxCit2IC0wLjEwMDY3MyAwLjI3ODMzOCAtMC4xNDE0ODEKK3YgLTAuMDk5MDkzIDAuMzE1ODMzIC0wLjE0MTQ4MQordiAtMC4wNDE2OTIgMC4yOTU1OTQgLTAuMTQxNDgxCit2IDAuMDA0MzMyIDAuMjM5MTM3IC0wLjE0MTQ4MQordiAwLjAyMjQwMSAwLjE1NTk4NyAtMC4xNDE0ODEKK3YgMC4wMDAwMDcgMC4wNjUzNzIgLTAuMTQxNDgxCit2IC0wLjA1MDQyMSAwLjAyMjcyOCAtMC4xNDE0ODEKK3YgLTAuMTA4MjA1IDAuMDI5NTU0IC0wLjE0MTQ4MQordiAtMC4xNDQ2NzkgMC4wNjYxNzMgLTAuMTQxNDgyCit2IC0wLjE2MjE3OSAwLjExMzc4OSAtMC4xNDE0ODIKK3YgLTAuMTcwMDg3IDAuMTY1NTUxIC0wLjE0MTQ4MgordiAtMC4xNzY0NzcgMC4yMDkxNDQgLTAuMTQxNDgyCit2IC0wLjE4ODUzMSAwLjI0NTc2MCAtMC4xNDE0ODIKK3YgLTAuMjEyMTQ5IDAuMjcxMTg2IC0wLjE0MTQ4MgordiAtMC4yNDE2NzQgMC4yNzI3NTggLTAuMTQxNDgyCit2IC0wLjI2OTU3OCAwLjI0MzgxOCAtMC4xNDE0ODIKK3YgLTAuMjgyNTY0IDAuMTc5NTMxIC0wLjE0MTQ4MgordiAtMC4yNzEyMjIgMC4xMDgwNjkgLTAuMTQxNDgyCit2IC0wLjI0MTQ0MiAwLjA2NjI2MCAtMC4xNDE0ODIKK3YgLTAuMjU4MDM4IC0wLjA4OTg1OSAtMC4xNDE0ODIKK3YgLTAuMjE4MTk5IC0wLjA4OTg1OSAtMC4xNDE0ODIKK3YgLTAuMjY2ODg5IC0wLjE3Mjg2NCAtMC4xNDE0ODIKK3YgLTAuMjc0MTA0IC0wLjIzOTg2MiAtMC4xNDE0ODIKK3YgLTAuMjUyMzk1IC0wLjI4NTU5NyAtMC4xNDE0ODIKK3YgLTAuMjE0MjgwIC0wLjMwNDc3NSAtMC4xNDE0ODIKK3YgMC4wMDkyODcgLTAuMzA0NDA2IC0wLjE0MTQ4MQordiAwLjAwOTI4NyAtMC4zNDYxODAgLTAuMTQxNDgwCit2IC0wLjIzNDg1MiAtMC4zNDU4NDkgLTAuMTQxNDgyCit2IC0wLjI4NDU1MyAtMC4zMjAyNDggLTAuMTQxNDgyCit2IC0wLjMxMzEyNyAtMC4yNjAzODIgLTAuMTQxNDgyCit2IC0wLjMwODM2MCAtMC4xNzkyNTggLTAuMTQxNDgyCit2IC0wLjMwODE1OSAtMC4wMzEzOTcgLTAuMTQxNDgyCit2IDAuMDA4NTY0IC0wLjAzMTM5NyAtMC4xNDE0ODEKK3YgMC4wMDg1NjQgLTAuMDczMTcxIC0wLjE0MTQ4MQordiAtMC4zMDgxNTkgLTAuMDczMTcxIC0wLjE0MTQ4MgordiAtMC4xNjM3NjEgLTAuNTkzMzY3IC0wLjE0MTQ4MQordiAtMC4zMDgxNzEgLTAuNzI0NTY1IC0wLjE0MTQ4MgordiAtMC4zMDgxNzEgLTAuNjY1ODkwIC0wLjE0MTQ4MgordiAtMC4xOTU0NDYgLTAuNTYzNDc4IC0wLjE0MTQ4MQordiAtMC4xNTg4MjkgLTAuNTU5NzExIC0wLjE0MTQ4MQordiAtMC4zMDQzNTQgLTAuNDM0MzI0IC0wLjE0MTQ4MgordiAtMC4zMDQzNTQgLTAuMzczNzI2IC0wLjE0MTQ4MgordiAtMC4xNjI1MDAgLTAuNTA4OTQwIC0wLjE0MTQ4MQordiAtMC4xNTg1MzggLTAuNTQxMjY0IC0wLjE0MTQ4MQordiAtMC4xOTUwMzggLTAuNTM4NTIyIC0wLjE0MTQ4MQordiAtMC4xMzU4MDEgLTAuNTA5MjkxIC0wLjE0MTQ4MQordiAwLjAwNzE3NSAtMC4zNzkwNDcgLTAuMTQxNDgwCit2IDAuMDA3MTc1IC0wLjQzNzcyMiAtMC4xNDE0ODAKK3YgLTAuMTA0MjQ4IC0wLjUzOTI5OSAtMC4xNDE0ODEKK3YgLTAuMTM5NTkzIC0wLjU0MTQyMCAtMC4xNDE0ODEKK3YgMC4wMDc5NjAgLTAuNjY4MTkwIC0wLjE0MTQ4MAordiAwLjAwNzk2MCAtMC43Mjg3ODYgLTAuMTQxNDgwCit2IC0wLjEzNzEwMiAtMC41OTM3NDUgLTAuMTQxNDgxCit2IC0wLjEzOTg5NCAtMC41NTk4MjYgLTAuMTQxNDgxCit2IC0wLjEwNDY2MiAtMC41NjQwNzEgLTAuMTQxNDgxCit2IC0wLjI4NzAxMiAtMC43NzMwNTYgLTAuMTQxNDgyCit2IC0wLjI1MTgyNCAtMC43MzM3MjcgLTAuMTQxNDgxCit2IC0wLjIyNzc3NSAtMC43NjAxNTcgLTAuMTQxNDgxCit2IC0wLjI1NjE2MiAtMC43OTUxMTggLTAuMTQxNDgyCit2IC0wLjI3MjU5OCAtMC44NDEyMTAgLTAuMTQxNDgyCit2IC0wLjI3NzIwOCAtMC45MDY5MDMgLTAuMTQxNDgyCit2IC0wLjEwNDc2OSAtMS4wMTQ5OTkgLTAuMTQxNDgxCit2IC0wLjA0NDEyMyAtMC45Njc4NzQgLTAuMTQxNDgwCit2IC0wLjAxNzI0MyAtMC44OTU2NTMgLTAuMTQxNDgwCit2IC0wLjAzMTcxMyAtMC44Mjk0ODQgLTAuMTQxNDgwCit2IC0wLjA2ODI1MCAtMC43ODgwNjQgLTAuMTQxNDgxCit2IC0wLjExNzAzNyAtMC43NzMwMTUgLTAuMTQxNDgxCit2IC0wLjExNzAzNyAtMC45OTc4ODQgLTAuMTQxNDgxCit2IC0wLjE1NjE3MiAtMC45OTc4NTcgLTAuMTQxNDgxCit2IC0wLjE1NjE3MSAtMC43MzIzODMgLTAuMTQxNDgxCit2IC0wLjExNjk5MiAtMC43MzI0MTYgLTAuMTQxNDgxCit2IC0wLjA1NzQxMiAtMC43NDk5MjQgLTAuMTQxNDgxCit2IDAuMDAyMjIyIC0wLjgwMjgzOCAtMC4xNDE0ODAKK3YgMC4wMjIxMjcgLTAuODk5NDkzIC0wLjE0MTQ4MAordiAtMC4wMTQ0NTcgLTAuOTk0MDM4IC0wLjE0MTQ4MAordiAtMC4xNzg2NDAgLTEuMDUyNDUzIC0wLjE0MTQ4MQordiAtMC4zMTM1OTUgLTAuOTIyNDE1IC0wLjE0MTQ4MgordiAtMC4zMDk1MjQgLTAuODI5MTY0IC0wLjE0MTQ4MgordiAtMC4zMDgxNjAgLTEuNDI0NDk4IC0wLjE0MTQ4MQordiAtMC4zMDgxNjAgLTEuMzgyNzI0IC0wLjE0MTQ4MQordiAwLjAwODU2NCAtMS4zODI3MjQgLTAuMTQxNDgwCit2IDAuMDA4NTY0IC0xLjQyNDQ5OCAtMC4xNDE0ODAKK3YgLTAuMDQwODM1IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMDgwNjc0IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMDMxOTg0IC0xLjI4MzA3NCAtMC4xNDE0ODAKK3YgLTAuMDI0NzY5IC0xLjIxNjA3NiAtMC4xNDE0ODAKK3YgLTAuMDQ2NDc4IC0xLjE3MDM0MSAtMC4xNDE0ODAKK3YgLTAuMDg0NTkyIC0xLjE1MTE2MyAtMC4xNDE0ODEKK3YgLTAuMzA4MTU5IC0xLjE1MTUzMyAtMC4xNDE0ODIKK3YgLTAuMzA4MTU5IC0xLjEwOTc1OSAtMC4xNDE0ODIKK3YgLTAuMDY0MDIxIC0xLjExMDA4NyAtMC4xNDE0ODAKK3YgLTAuMDE0MzIwIC0xLjEzNTY5MSAtMC4xNDE0ODAKK3YgMC4wMTQyNTQgLTEuMTk1NTU1IC0wLjE0MTQ4MAordiAwLjAwOTQ4NyAtMS4yNzY2ODEgLTAuMTQxNDgwCit2IC0wLjE2ODIyNCAtMS4wMTQ3MTUgLTAuMTQxNDgxCit2IC0wLjA4NzU0MSAtMS4wNDcwODEgLTAuMTQxNDgxCit2IC0wLjI0MzY5NyAtMC45NzU4MDggLTAuMTQxNDgxCit2IC0wLjI2OTk3OSAtMS4wMDI3ODQgLTAuMTQxNDgxCit2IC0wLjA5NTI0MiAtMS4zODI3MjQgLTAuMTQxNDgwCit2IC0wLjAzNTk2NyAtMS4zODI3MjQgLTAuMTQxNDgwCit2IC0wLjIwMzM0MiAtMC4wMzEzOTcgLTAuMTQxNDgyCit2IC0wLjIwMzM0MiAtMC4wNzMxNzEgLTAuMTQxNDgyCit2IC0wLjI2MzA3OSAtMC4wMzEzOTcgLTAuMTQxNDgyCit2IC0wLjI2MzA3OSAtMC4wNzMxNzEgLTAuMTQxNDgyCit2IC0wLjExODE1NiAtMS4xNTEzMzUgLTAuMTQxNDgxCit2IC0wLjExODE1NiAtMS4xMDk5MzAgLTAuMTQxNDgxCit2IC0wLjE4NTczNSAtMC4zMDQ2NTYgLTAuMTQxNDgyCit2IC0wLjE4NTczNSAtMC4zNDU5NzggLTAuMTQxNDgxCit2IC0wLjAwNDQxNyAtMS40MjQ0OTggLTAuMTQxNDgwCit2IC0wLjAwNDQxNyAtMS4zODI3MjQgLTAuMTQxNDgwCit2IC0wLjI5Njc3MyAtMS4zODI3MjQgLTAuMTQxNDgxCit2IC0wLjI5Njc3MyAtMS40MjQ0OTggLTAuMTQxNDgxCit2IC0wLjMwODE2MCAtMS40MDM2MTIgLTAuMTQxNDgxCit2IDAuMDA4NTY0IC0xLjQwMzYxMiAtMC4xNDE0ODAKK3YgLTAuMDc0NzI4IC0xLjM1NTk0MSAtMC4xNDE0ODAKK3YgLTAuMDM2NjA3IC0xLjM1ODU2NyAtMC4xNDE0ODAKK3YgLTAuMDYwNzU0IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMzA4MTU5IC0xLjEzMTE0NSAtMC4xNDE0ODIKK3YgLTAuMDY1NjA1IC0xLjM4MjcyNCAtMC4xNDE0ODAKK3YgLTAuMTQ3NjEyIC0xLjQyNDQ5OCAtMC4xNDE0ODEKK3YgLTAuMTE4MTQzIC0xLjM4MjcyNCAtMC4xNDE0ODAKK3YgLTAuMjk3MDA4IC0xLjEwOTc2OSAtMC4xNDE0ODIKK3YgLTAuMjk3MDA4IC0xLjE1MTUyMCAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjg5NDc5MCAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjg5NDc3OCAtMC4xNDE0ODEKK3YgLTAuMjU5NzQxIC0wLjc0MjU3NiAtMC4xNDE0ODIKK3YgLTAuMjM0MTYyIC0wLjc2ODAyNiAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjc0NjEzMCAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjc4NzYyOCAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjc2ODkwMiAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjk4NTQ4NiAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjk4NTUxMiAtMC4xNDE0ODEKK3YgLTAuMTAyNDAxIC0wLjc3NzUzMCAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjg0NzY2NSAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjg0NzY2OSAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjgxNDA1MCAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjgxMTE5MSAtMC4xNDE0ODEKK3YgLTAuMjk0NDUyIC0wLjcxMjEwMSAtMC4xNDE0ODIKK3YgLTAuMjk3NDYzIC0wLjY1NjE2MSAtMC4xNDE0ODIKK3YgLTAuMDA1NjYwIC0wLjcxNjEwNyAtMC4xNDE0ODAKK3YgLTAuMDAxMDQ5IC0wLjY1OTg2MCAtMC4xNDE0ODAKK3YgLTAuMDYxNzY3IC0wLjYwMzcyOCAtMC4xNDE0ODEKK3YgLTAuMjU2NDQ0IC0wLjY3NzU2OSAtMC4xNDE0ODIKK3YgLTAuMjU2NTIxIC0wLjYxODk2NSAtMC4xNDE0ODIKK3YgLTAuMTQwNDE5IC0wLjczMjQwMCAtMC4xNDE0ODEKK3YgLTAuMjM5Nzk5IC0wLjc0Njk0MyAtMC4xNDE0ODIKK3YgLTAuMTcyMDI1IC0wLjYwMDg3NSAtMC4xNDE0ODEKK3YgLTAuMjAyOTM2IC0wLjU3MDI4MyAtMC4xNDE0ODEKK3YgLTAuMDk2MTU1IC0wLjU3MTkzNiAtMC4xNDE0ODEKK3YgLTAuMTI3NDAwIC0wLjYwMjc3NiAtMC4xNDE0ODEKK3YgLTAuMTI3Nzc3IC0wLjUwMTk4MCAtMC4xNDE0ODEKK3YgLTAuMDk1NzQwIC0wLjUzMTU0MyAtMC4xNDE0ODEKK3YgLTAuMTcxODg4IC0wLjQ5OTk5MiAtMC4xNDE0ODEKK3YgLTAuMjA0MTQ4IC0wLjUyOTgzOCAtMC4xNDE0ODEKK3YgLTAuMzA4MTcxIC0wLjY5NTIyNyAtMC4xNDE0ODIKK3YgLTAuMzA0MzU0IC0wLjQwNDAyNSAtMC4xNDE0ODIKK3YgMC4wMDcxNzUgLTAuNDA4Mzg1IC0wLjE0MTQ4MAordiAwLjAwNzk2MCAtMC42OTg0ODggLTAuMTQxNDgwCit2IC0wLjIwMzU3MCAwLjAzMzI4NSAtMC4xNDE0ODIKK3YgLTAuMDk5ODgzIDAuMjk3MDg2IC0wLjE0MTQ4MgordiAtMC4wOTM1MzMgMC4yNzU3MjAgLTAuMTQxNDgxCit2IC0wLjA4OTA0OCAwLjMxMjI5MSAtMC4xNDE0ODEKK3YgLTAuMjEzODMyIDAuMDE3OTMzIC0wLjE0MTQ4MgordiAtMC4yMDk2OTcgMC4wNTQ1MjggLTAuMTQxNDgyCit2IDAuMDA4NTY0IC0wLjA1MjI4NCAtMC4xNDE0ODEKK3YgLTAuMzA4MTU5IC0wLjA1MjI4NCAtMC4xNDE0ODIKK3YgLTAuMjM4MTE4IC0wLjA4OTg1OSAtMC4xNDE0ODIKK3YgMC4wMDkyODcgLTAuMzI1MjkzIC0wLjE0MTQ4MAordiAtMC4yMzMyMTAgLTAuMDczMTcxIC0wLjE0MTQ4MgordiAtMC4yMzMyMTAgLTAuMDMxMzk3IC0wLjE0MTQ4MgordiAtMC4yMjQ4OTAgLTAuMTAxMjY4IC0wLjE0MTQ4MgordiAtMC4yNjIyMTkgLTAuMDk3Mjg4IC0wLjE0MTQ4MgordiAtMC4yOTYyMTMgLTAuMDMxMzk3IC0wLjE0MTQ4MgordiAtMC4yOTYyMTMgLTAuMDczMTcxIC0wLjE0MTQ4MgordiAtMC4wMDI5MzYgLTAuMDczMTcxIC0wLjE0MTQ4MQordiAtMC4wMDI5MzYgLTAuMDMxMzk3IC0wLjE0MTQ4MQordiAtMC4xNDgxNjkgLTAuMDMxMzk3IC0wLjE0MTQ4MgordiAtMC4xNDgxNjkgLTAuMDczMTcxIC0wLjE0MTQ4MQordiAtMC4wMDU1NTcgLTAuMzQ2MTY0IC0wLjE0MTQ4MQordiAtMC4wMDU1NTcgLTAuMzA0NDI1IC0wLjE0MTQ4MQordiAtMC4wOTQ4MTUgLTAuMzA0NTQwIC0wLjE0MTQ4MQordiAtMC4wOTQ4MTQgLTAuMDczMTcxIC0wLjE0MTQ4MQordiAtMC4wOTQ4MTQgLTAuMDMxMzk3IC0wLjE0MTQ4MQordiAtMC4wOTQ4MTUgLTAuMzQ2MDcxIC0wLjE0MTQ4MQordiAwLjAwMTAwMCAtMC40NDMzNTIgLTAuMTQxNDgwCit2IC0wLjAwMDkyMiAtMC4zODY0MjMgLTAuMTQxNDgwCit2IC0wLjI5MTU3MCAtMC4zODU5MTIgLTAuMTQxNDgyCit2IC0wLjI5NTQ0MiAtMC40NDI4MTkgLTAuMTQxNDgyCit2IC0wLjI0NzQxMCAtMC40ODg1OTQgLTAuMTQxNDgyCit2IC0wLjI0NzQxNCAtMC40MjgwMDEgLTAuMTQxNDgyCit2IC0wLjA1NjgwOCAtMC40MzczNDQgLTAuMTQxNDgxCit2IC0wLjA1Njc5NyAtMC40OTYwNDEgLTAuMTQxNDgxCit2IC0wLjE0ODEzMCAwLjAyNTg4MyAtMC4xNDczNTEKK3YgMC4wMDE4OTIgLTEuNTU3NTczIC0wLjE0NzM0OQordiAtMC40MzQ0MTIgLTEuMTYyNDI2IC0wLjE0NzM1MQordiAwLjA4MDc2OSAtMS40MDM2MTIgLTAuMTQ3MzQ5Cit2IDAuMDgwNzY5IC0xLjE4MTcxNCAtMC4xNDczNDkKK3YgMC4xNTcxODMgLTAuODQ4NTYwIC0wLjE0NzM0OQordiAwLjAwNzk4OSAtMC41NTI0NjEgLTAuMTQ3MzUwCit2IDAuMDgwNzY5IC0wLjczMDYxMiAtMC4xNDczNTAKK3YgLTAuNDM0NDExIDAuMjczMTYwIC0wLjE0NzM1MQordiAtMC4zNzc5OTkgMC4yNzMyMzggLTAuMTQ3MzUyCit2IC0wLjM3ODAwMCAwLjQwOTMzNyAtMC4xNDIwNzEKK3YgMC4wODA3NjkgMC40MDkzMzcgLTAuMTQyMDY5Cit2IDAuMDgwNzY5IC0xLjQ5MzYwMCAtMC4xNDIwNjkKK3YgLTAuMzc4MDAwIC0xLjQ5MzYwMCAtMC4xNDIwNzEKK3YgMC4xNDAyNDcgLTEuODI4MTY1IC0wLjE0NzM0OQordiAtMC40MzU0NzQgLTEuODI4MTY1IC0wLjE0NzM1MgordiAtMC4zNzc5OTggMC40MDkzMzQgLTAuMTQ3MzUxCit2IDEuMjgxNTE2IDAuMjYxMzI1IC0wLjA3Njc1MwordiAxLjI4MTUxNiAwLjAwOTgzNiAtMC4wNzY3NTMKK3YgMS4yODE1MTYgLTAuMjM5NjY4IC0wLjA3Njc1NAordiAxLjI4MTUxNiAtMC40ODk0MDggLTAuMDc2NzU0Cit2IDEuMjgxNTE2IC0wLjczODc5NyAtMC4wNzY3NTQKK3YgMS4yODE1MTYgLTAuOTg4MzY1IC0wLjA3Njc1NAordiAxLjI4MTUxNiAtMS4yMzgwNDcgLTAuMDc2NzU0Cit2IDEuMjgxNTE2IC0xLjQ4ODI3OSAtMC4wNzY3NTQKK3YgMS4yNzk1NDcgMC4yNjEzMjUgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDAuMDA5ODM2IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC4yMzk2NjggLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0wLjQ4OTQwOCAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTAuNzM4Nzk3IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC45ODgzNjUgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0xLjIzODA0NyAtMC4wMTk4NTQKK3YgMS4yODE1MTUgLTEuNDg4Mjc5IC0wLjAyMTg2MQordiAtMS41MzY3MDcgMC4yNjE0MjEgLTAuMTE3NDE0Cit2IC0xLjUzNjcwNyAwLjAwOTg3NiAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0wLjIzOTY1NyAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0wLjQ4OTMyMCAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0wLjczODc5MSAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0wLjk4ODM1OSAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0xLjIzNzk5MCAtMC4xMTc0MTQKK3YgLTEuNTM2NzA3IC0xLjQ4NzkyMCAtMC4xMTc0MTQKK3YgMS4yODE1MTYgMC4yNjEzMjUgLTAuMDcwODc3Cit2IDEuMjgxNTE2IDAuMDA5ODM2IC0wLjA3MDg3NwordiAxLjI4MTUxNiAtMC4yMzk2NjggLTAuMDcwODc3Cit2IDEuMjgxNTE2IC0wLjQ4OTQwOCAtMC4wNzA4NzcKK3YgMS4yODE1MTYgLTAuNzM4Nzk3IC0wLjA3MDg3NwordiAxLjI4MTUxNiAtMC45ODgzNjUgLTAuMDcwODc3Cit2IDEuMjgxNTE2IC0xLjIzODA0NyAtMC4wNzA4NzcKK3YgMS4yODE1MTYgLTEuNDg4Mjc5IC0wLjA3MDg3NwordiAxLjEyMjkwNCAwLjI2MTQyMSAtMC4xNDczNDUKK3YgMS4xMjI5MDQgMC4wMDk5OTYgLTAuMTQ3MzQ1Cit2IDEuMTIyOTA0IC0wLjIzOTYyNiAtMC4xNDczNDUKK3YgMS4xMjI5MDQgLTAuNDg5MDU4IC0wLjE0NzM0NQordiAxLjEyMjkwNCAtMC43Mzg3NzIgLTAuMTQ3MzQ1Cit2IDEuMTIyOTA0IC0wLjk4ODM0NCAtMC4xNDczNDUKK3YgMS4xMjI5MDQgLTEuMjM3ODIyIC0wLjE0NzM0NQordiAxLjEyMjkwNCAtMS40ODY4NjAgLTAuMTQ3MzQ1Cit2IC0xLjQ5NTc0NiAwLjI2MTQyMSAtMC4xMzgyODgKK3YgLTEuNDk1NzQ2IDAuMDA5OTM2IC0wLjEzODI4OAordiAtMS40OTU3NDYgLTAuMjM5NjQxIC0wLjEzODI4OAordiAtMS40OTU3NDYgLTAuNDg5MTg5IC0wLjEzODI4OAordiAtMS40OTU3NDYgLTAuNzM4NzgxIC0wLjEzODI4OAordiAtMS40OTU3NDYgLTAuOTg4MzUxIC0wLjEzODI4OAordiAtMS40OTU3NDYgLTEuMjM3OTA2IC0wLjEzODI4OAordiAtMS40OTU3NDYgLTEuNDg3Mzg5IC0wLjEzODI4OAordiAxLjA3MjkwNCAwLjI2MTQyMSAtMC4xNDczNDUKK3YgMS4wNzI5MDQgMC4wMDk5OTYgLTAuMTQ3MzQ1Cit2IDEuMDcyOTA0IC0wLjIzOTYyNiAtMC4xNDczNDUKK3YgMS4wNzI5MDQgLTAuNDg5MDU4IC0wLjE0NzM0NQordiAxLjA3MjkwNCAtMC43Mzg3NzIgLTAuMTQ3MzQ1Cit2IDEuMDcyOTA0IC0wLjk4ODM0NCAtMC4xNDczNDUKK3YgMS4wNzI5MDQgLTEuMjM3ODIyIC0wLjE0NzM0NQordiAxLjA3MjkwNCAtMS40ODY4NjAgLTAuMTQ3MzQ1Cit2IDAuNzQ3NzYxIDAuMjYxNDIxIC0wLjE0NzM0NgordiAwLjc0Nzc2MSAwLjAwOTk5NiAtMC4xNDczNDcKK3YgMC43NDc3NjEgLTAuMjM5NjI2IC0wLjE0NzM0NwordiAwLjc0Nzc2MSAtMC40ODkwNTggLTAuMTQ3MzQ3Cit2IDAuNzQ3NzYxIC0wLjczODc3MiAtMC4xNDczNDcKK3YgMC43NDc3NjEgLTAuOTg4MzQ0IC0wLjE0NzM0NwordiAwLjc0Nzc2MSAtMS4yMzc4MjIgLTAuMTQ3MzQ3Cit2IDAuNzQ3NzYxIC0xLjQ4Njg2MCAtMC4xNDczNDcKK3YgMC45MDg1OTUgMC4yNjE0MjEgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IDAuMDA5OTk2IC0wLjE0NzM0NgordiAwLjkwODU5NSAtMC4yMzk2MjYgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IC0wLjQ4OTA1OCAtMC4xNDczNDYKK3YgMC45MDg1OTUgLTAuNzM4NzcyIC0wLjE0NzM0NgordiAwLjkwODU5NSAtMC45ODgzNDQgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IC0xLjIzNzgyMiAtMC4xNDczNDYKK3YgMC45MDg1OTUgLTEuNDg2ODYwIC0wLjE0NzM0NgordiAwLjk4MzYxNSAwLjI2MTQyMSAtMC4xNDczNDYKK3YgMC45ODM2MTUgMC4wMDk5OTYgLTAuMTQ3MzQ2Cit2IDAuOTgzNjE1IC0wLjIzOTYyNiAtMC4xNDczNDYKK3YgMC45ODM2MTUgLTAuNDg5MDU4IC0wLjE0NzM0NgordiAwLjk4MzYxNSAtMC43Mzg3NzIgLTAuMTQ3MzQ2Cit2IDAuOTgzNjE0IC0wLjk4ODM0NCAtMC4xNDczNDYKK3YgMC45ODM2MTQgLTEuMjM3ODIyIC0wLjE0NzM0NgordiAwLjk4MzYxNCAtMS40ODY4NjAgLTAuMTQ3MzQ2Cit2IC0wLjY5OTcwNyAwLjI2MTQyMSAtMC4xNDczNTMKK3YgLTAuNjk5NzA3IDAuMDA5OTk2IC0wLjE0NzM1MwordiAtMC42OTk3MDcgLTAuNDg5MDU4IC0wLjE0NzM1MwordiAtMC42OTk3MDcgLTAuNzM4NzcyIC0wLjE0NzM1MwordiAtMC42OTk3MDcgLTAuOTg4MzQ0IC0wLjE0NzM1MwordiAtMC42OTk3MDcgLTEuMjM3ODIyIC0wLjE0NzM1MwordiAtMC42OTk3MDcgLTEuNDg2ODYwIC0wLjE0NzM1MwordiAtMS41NzY3NTggLTEuNDg4Mjc5IC0wLjA3Njc2NgordiAtMS41NzY3NTggLTEuMjM4MDQ3IC0wLjA3Njc2NgordiAtMS41NzY3NTggLTAuOTg4MzY0IC0wLjA3Njc2NgordiAtMS41NzY3NTggLTAuNzM4Nzk3IC0wLjA3Njc2NgordiAtMS41NzY3NTggLTAuNDg5NDA4IC0wLjA3Njc2NgordiAtMS41NzY3NTggLTAuMjM5NjY4IC0wLjA3Njc2NQordiAtMS41NzY3NTggMC4wMDk4MzYgLTAuMDc2NzY1Cit2IC0xLjU3Njc1OCAwLjI2MTQyMCAtMC4wNzY3NjUKK3YgLTEuNTc0NzkwIC0xLjQ4ODI3OSAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0xLjIzODA0NyAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0wLjk4ODM2NCAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0wLjczODc5NyAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0wLjQ4OTQwOCAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0wLjIzOTY2OCAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIDAuMDA5ODM2IC0wLjAxOTg2NgordiAtMS41NzY3NTkgMC4yNjE0MjAgLTAuMDIxODczCit2IDEuMjQxNDI1IC0xLjQ4NzkyMSAtMC4xMTc0MDIKK3YgMS4yNDE0MjUgLTEuMjM3OTkwIC0wLjExNzQwMgordiAxLjI0MTQyNSAtMC45ODgzNTkgLTAuMTE3NDAyCit2IDEuMjQxNDI1IC0wLjczODc5MSAtMC4xMTc0MDIKK3YgMS4yNDE0MjUgLTAuNDg5MzIwIC0wLjExNzQwMgordiAxLjI0MTQyNSAtMC4yMzk2NTcgLTAuMTE3NDAyCit2IDEuMjQxNDI1IDAuMDA5ODc2IC0wLjExNzQwMgordiAxLjI0MTQyNSAwLjI2MTM1MCAtMC4xMTc0MDIKK3YgLTEuNTc2NzU4IC0xLjQ4ODI3OSAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IC0xLjIzODA0NyAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IC0wLjk4ODM2NCAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IC0wLjczODc5NyAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IC0wLjQ4OTQwOCAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IC0wLjIzOTY2OCAtMC4wNzA4ODkKK3YgLTEuNTc2NzU4IDAuMDA5ODM2IC0wLjA3MDg4OQordiAtMS41NzY3NTggMC4yNjE0MjAgLTAuMDcwODg5Cit2IC0xLjQ1MTE5OCAtMS40ODY4NTkgLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAtMS4yMzc4MjEgLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAtMC45ODgzNDQgLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAtMC43Mzg3NzIgLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAtMC40ODkwNTggLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAtMC4yMzk2MjUgLTAuMTQ3MzU2Cit2IC0xLjQ1MTE5OCAwLjAwOTk5NiAtMC4xNDczNTYKK3YgLTEuNDUxMTk4IDAuMjYxNDIxIC0wLjE0NzM1NgordiAxLjE4MjAyMCAtMS40ODczODkgLTAuMTM4Mjc3Cit2IDEuMTgyMDIwIC0xLjIzNzkwNiAtMC4xMzgyNzcKK3YgMS4xODIwMjAgLTAuOTg4MzUyIC0wLjEzODI3NwordiAxLjE4MjAyMCAtMC43Mzg3ODIgLTAuMTM4Mjc3Cit2IDEuMTgyMDIwIC0wLjQ4OTE4OSAtMC4xMzgyNzcKK3YgMS4xODIwMjAgLTAuMjM5NjQyIC0wLjEzODI3NwordiAxLjE4MjAyMCAwLjAwOTkzNiAtMC4xMzgyNzcKK3YgMS4xODIwMjAgMC4yNjEzODUgLTAuMTM4Mjc3Cit2IC0xLjQwMTE5OCAtMS40ODY4NTkgLTAuMTQ3MzU2Cit2IC0xLjQwMTE5OCAtMS4yMzc4MjEgLTAuMTQ3MzU2Cit2IC0xLjQwMTE5OCAtMC45ODgzNDQgLTAuMTQ3MzU2Cit2IC0xLjQwMTE5OCAtMC43Mzg3NzIgLTAuMTQ3MzU2Cit2IC0xLjQwMTE5OCAtMC40ODkwNTggLTAuMTQ3MzU2Cit2IC0xLjQwMTE5OCAtMC4yMzk2MjUgLTAuMTQ3MzU1Cit2IC0xLjQwMTE5OCAwLjAwOTk5NiAtMC4xNDczNTUKK3YgLTEuNDAxMTk4IDAuMjYxNDIxIC0wLjE0NzM1NQordiAtMS4yNzg4NjggLTEuNDg2ODU5IC0wLjE0NzM1NQordiAtMS4yNzg4NjggLTEuMjM3ODIxIC0wLjE0NzM1NQordiAtMS4yNzg4NjggLTAuOTg4MzQ0IC0wLjE0NzM1NQordiAtMS4yNzg4NjcgLTAuNzM4NzcyIC0wLjE0NzM1NQordiAtMS4yNzg4NjcgLTAuNDg5MDU4IC0wLjE0NzM1NQordiAtMS4yNzg4NjcgLTAuMjM5NjI1IC0wLjE0NzM1NQordiAtMS4yNzg4NjcgMC4wMDk5OTYgLTAuMTQ3MzU1Cit2IC0xLjI3ODg2NyAwLjI2MTQyMSAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0xLjQ4Njg1OSAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0xLjIzNzgyMSAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0wLjk4ODM0NCAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0wLjczODc3MiAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0wLjQ4OTA1OCAtMC4xNDczNTUKK3YgLTEuMjAzODE5IC0wLjIzOTYyNSAtMC4xNDczNTUKK3YgLTEuMjAzODE5IDAuMDA5OTk2IC0wLjE0NzM1NQordiAtMS4yMDM4MTkgMC4yNjE0MjEgLTAuMTQ3MzU1Cit2IC0xLjAyODI3NCAtMS40ODY4NTkgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAtMS4yMzc4MjEgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAtMC45ODgzNDQgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAtMC43Mzg3NzIgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAtMC40ODkwNTggLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAtMC4yMzk2MjUgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAwLjAwOTk5NiAtMC4xNDczNTQKK3YgLTEuMDI4Mjc0IDAuMjYxNDIxIC0wLjE0NzM1NAordiAwLjQwNDQ5MSAtMS40ODY4NjAgLTAuMTQ3MzQ4Cit2IDAuNDA0NDkxIC0xLjIzNzgyMiAtMC4xNDczNDgKK3YgMC40MDQ0OTEgLTAuOTg4MzQ0IC0wLjE0NzM0OAordiAwLjQwNDQ5MSAtMC43Mzg3NzIgLTAuMTQ3MzQ4Cit2IDAuNDA0NDkxIC0wLjQ4OTA1OCAtMC4xNDczNDgKK3YgMC40MDQ0OTEgLTAuMjM5NjI2IC0wLjE0NzM0OAordiAwLjQwNDQ5MSAwLjAwOTk5NiAtMC4xNDczNDgKK3YgMC40MDQ0OTEgMC4yNjE0MjEgLTAuMTQ3MzQ4Cit2IC0wLjQzNDQxMSAtMC4yODUwNzMgLTAuMTQ3MzUxCit2IC0wLjQzNDQxMSAtMC4xMjMwOTcgLTAuMTQ3MzUxCit2IC0wLjY5OTcwNyAtMC4yMzk2MjUgLTAuMTQ3MzUzCit2IC0wLjgzODEwNiAtMS44MjgxNjUgLTAuMTQ3MzUzCit2IC0wLjgzODEwNiAwLjI2MTQyMSAtMC4xNDczNTMKK3YgLTAuODM4MTA2IDAuMDA5OTk2IC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTAuNDg5MDU4IC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTEuNDg2ODU5IC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTEuMjM3ODIxIC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTAuOTg4MzQ0IC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTAuNzM4NzcyIC0wLjE0NzM1MwordiAtMC44MzgxMDYgLTAuMjM5NjI1IC0wLjE0NzM1MwordiAtMC45Mzc0MTUgLTEuODI4MTY1IC0wLjE0NzM1NAordiAtMC45Mzc0MTUgMC4yNjE0MjEgLTAuMTQ3MzU0Cit2IC0wLjkzNzQxNSAwLjAwOTk5NiAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0wLjQ4OTA1OCAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0xLjQ4Njg1OSAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0xLjIzNzgyMSAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0wLjk4ODM0NCAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0wLjczODc3MiAtMC4xNDczNTQKK3YgLTAuOTM3NDE1IC0wLjIzOTYyNSAtMC4xNDczNTQKK3YgLTEuNTU2NzU5IDAuMjYxNDIwIC0wLjAxOTg2NgordiAtMS41NTY3NTkgMC4wMDk4MzYgLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMC4yMzk2NjggLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMC40ODk0MDggLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMC43Mzg3OTcgLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMC45ODgzNjQgLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMS4yMzgwNDcgLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMS40ODgyNzkgLTAuMDE5ODY2Cit2IC0xLjU1Njc1OSAtMS44Mjg0MjEgLTAuMDE5ODY2Cit2IDEuMjYxNDc3IC0xLjgyODQyMSAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgLTEuNDg4Mjc5IC0wLjAxOTg1NAordiAxLjI2MTQ3NyAtMS4yMzgwNDcgLTAuMDE5ODU0Cit2IDEuMjYxNDc3IC0wLjk4ODM2NSAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgLTAuNzM4Nzk3IC0wLjAxOTg1NAordiAxLjI2MTQ3NyAtMC40ODk0MDggLTAuMDE5ODU0Cit2IDEuMjYxNDc3IC0wLjIzOTY2OCAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgMC4wMDk4MzYgLTAuMDE5ODU0Cit2IDEuMjYxNDc3IDAuMjYxMzI1IC0wLjAxOTg1NAordiAxLjI2MTQ3NyAwLjY3Njc5MCAtMC4wMTk4NTQKK3YgMS4yODE1MTUgMC42NzY3OTAgLTAuMDIxODYxCit2IC0xLjU3Njc1OSAtMS44Mjg0MjEgLTAuMDIxODczCit2IDEuMjc5NTQ2IC0xLjgyODQyMSAtMC4wMTk4NTQKK3YgMS4yODE1MTUgMC4yNjEzMjUgLTAuMDIxODYxCit2IDEuMjgxNTE1IDAuMDA5ODM2IC0wLjAyMTg2MQordiAxLjI4MTUxNSAtMC4yMzk2NjggLTAuMDIxODYxCit2IDEuMjgxNTE1IC0wLjQ4OTQwOCAtMC4wMjE4NjEKK3YgMS4yODE1MTUgLTAuNzM4Nzk3IC0wLjAyMTg2MQordiAxLjI4MTUxNSAtMC45ODgzNjUgLTAuMDIxODYxCit2IDEuMjgxNTE1IC0xLjIzODA0NyAtMC4wMjE4NjEKK3YgMS4yNzk1NDYgLTEuNDg4Mjc5IC0wLjAxOTg1NAordiAtMS41NzY3NTkgLTEuNDg4Mjc5IC0wLjAyMTg3MwordiAtMS41NzY3NTkgLTEuMjM4MDQ3IC0wLjAyMTg3MwordiAtMS41NzY3NTkgLTAuOTg4MzY0IC0wLjAyMTg3MwordiAtMS41NzY3NTkgLTAuNzM4Nzk3IC0wLjAyMTg3MwordiAtMS41NzY3NTkgLTAuNDg5NDA4IC0wLjAyMTg3MwordiAtMS41NzY3NTkgLTAuMjM5NjY4IC0wLjAyMTg3MwordiAtMS41NzY3NTkgMC4wMDk4MzYgLTAuMDIxODczCit2IC0xLjU3NDc5MCAwLjI2MTQyMCAtMC4wMTk4NjYKK3YgMS4yODE1MTUgMC42NzY3OTAgLTAuMDI0MTU3Cit2IC0xLjU3Njc1OSAtMS44Mjg0MjEgLTAuMDI0MTY5Cit2IDEuMjgxNTE1IC0xLjgyODQyMSAtMC4wMjQxNTcKK3YgMS4yODE1MTUgLTEuNDg4Mjc5IC0wLjAyNDE1NwordiAxLjI4MTUxNSAtMS4yMzgwNDcgLTAuMDI0MTU3Cit2IDEuMjgxNTE1IC0wLjk4ODM2NSAtMC4wMjQxNTcKK3YgMS4yODE1MTUgLTAuNzM4Nzk3IC0wLjAyNDE1NwordiAxLjI4MTUxNSAwLjI2MTMyNSAtMC4wMjQxNTcKK3YgMS4yODE1MTUgMC4wMDk4MzYgLTAuMDI0MTU3Cit2IDEuMjgxNTE1IC0wLjIzOTY2OCAtMC4wMjQxNTcKK3YgMS4yODE1MTUgLTAuNDg5NDA4IC0wLjAyNDE1NwordiAtMS41NzY3NTkgMC4yNjE0MjAgLTAuMDI0MTY5Cit2IC0xLjU3Njc1OSAwLjAwOTgzNiAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0wLjIzOTY2OCAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0wLjQ4OTQwOCAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0xLjQ4ODI3OSAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0xLjIzODA0NyAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0wLjk4ODM2NCAtMC4wMjQxNjkKK3YgLTEuNTc2NzU5IC0wLjczODc5NyAtMC4wMjQxNjkKK3YgMS4yODE1MTYgLTIuMjYzMjM4IC0wLjA3Njc1NAordiAtMS41NzY3NTggLTIuMjYzMjM4IC0wLjA3Njc2NgordiAtMS41NzY3NTkgLTIuMjYzMjM4IC0wLjAyMTg3MwordiAxLjI0MTQyNiAtMi4yNjMyMTUgLTAuMTE3NDAyCit2IC0xLjUzNjcwNiAtMi4yNjMyMTUgLTAuMTE3NDE0Cit2IDEuMjgxNTE2IC0yLjI2MzIzOCAtMC4wNzA4NzcKK3YgLTEuNTc2NzU4IC0yLjI2MzIzOCAtMC4wNzA4ODkKK3YgMS4xMjI5MDQgLTIuMjYzMTQ3IC0wLjE0NzM0NQordiAtMS40NTExOTggLTIuMjYzMTQ3IC0wLjE0NzM1NgordiAxLjE4MjAyMCAtMi4yNjMxODEgLTAuMTM4Mjc3Cit2IC0xLjQ5NTc0NiAtMi4yNjMxODEgLTAuMTM4Mjg4Cit2IC0xLjQwMTE5OCAtMi4yNjMxNDcgLTAuMTQ3MzU2Cit2IDEuMDcyOTA0IC0yLjI2MzE0NyAtMC4xNDczNDUKK3YgMC45ODM2MTUgLTIuMjYzMTQ3IC0wLjE0NzM0NgordiAwLjkwODU5NSAtMi4yNjMxNDcgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIC0yLjI2MzE0NyAtMC4xNDczNDcKK3YgLTEuMDI4Mjc1IC0yLjI2MzE0NyAtMC4xNDczNTQKK3YgLTEuMjAzODE5IC0yLjI2MzE0NyAtMC4xNDczNTUKK3YgLTEuMjc4ODY3IC0yLjI2MzE0NyAtMC4xNDczNTUKK3YgMS4yODE1MTUgLTIuMjYzMjM4IC0wLjAyMTg2MQordiAwLjQwNDQ3MCAtMi4yNjMxNDcgLTAuMTQ3MzQ4Cit2IC0wLjY5OTcyNyAtMi4yNjMxNDcgLTAuMTQ3MzUzCit2IC0wLjQzNTQ4NCAtMi4yNjMxNDcgLTAuMTQ3MzUyCit2IDAuMTQwMjM3IC0yLjI2MzE0NyAtMC4xNDczNDkKK3YgMS4yNjE0NzcgLTIuMjYzMjM4IC0wLjAxOTg1NAordiAtMS41NTY3NTkgLTIuMjYzMjM4IC0wLjAxOTg2NgordiAtMS41NzQ3OTAgLTIuMjYzMjM4IC0wLjAxOTg2NgordiAxLjI3OTU0NiAtMi4yNjMyMzggLTAuMDE5ODU0Cit2IDEuMjgxNTE1IC0yLjI2MzIzOCAtMC4wMjQxNTcKK3YgLTEuNTc2NzU5IC0yLjI2MzIzOCAtMC4wMjQxNjkKK3YgLTAuODM4NDY3IC0yLjI2MzE0NyAtMC4xNDczNTMKK3YgLTAuOTM3MTc1IC0yLjI2MzE0NyAtMC4xNDczNTQKK3YgMC42NDE5ODQgMC42NzcwNzUgLTAuMTQ3MzQ3Cit2IDAuNjQxNzkwIC0xLjgyODE2NSAtMC4xNDczNDcKK3YgMC42NDE3OTAgLTEuNDg2ODYwIC0wLjE0NzM0NwordiAwLjY0MTc5MCAtMS4yMzc4MjIgLTAuMTQ3MzQ3Cit2IDAuNjQxNzkwIC0wLjk4ODM0NCAtMC4xNDczNDcKK3YgMC42NDE3OTEgLTAuNzM4NzcyIC0wLjE0NzM0NwordiAwLjY0MTc5MSAwLjI2MTQyMSAtMC4xNDczNDcKK3YgMC42NDE3OTEgMC4wMDk5OTYgLTAuMTQ3MzQ3Cit2IDAuNjQxNzkxIC0wLjIzOTYyNiAtMC4xNDczNDcKK3YgMC42NDE3OTEgLTAuNDg5MDU4IC0wLjE0NzM0NwordiAwLjY0MTc5MCAtMi4yNjMxNDcgLTAuMTQ3MzQ3Cit2IC0wLjE0NzYxMiAtMS44MjgxNjUgLTAuMTQ3MzUwCit2IC0xLjU3Njc1OCAtMi40NjY2NzMgLTAuMDc2NzY1Cit2IC0xLjU0OTEwMSAtMi42MDQwNjEgLTAuMDc2NzY1Cit2IC0xLjQ3MzI4MSAtMi43MTYxNzAgLTAuMDc2NzY1Cit2IC0xLjM2MDk1MSAtMi43OTIxNjYgLTAuMDc2NzY1Cit2IC0xLjIyMjQ1OCAtMi44MTkxOTcgLTAuMDc2Nzg1Cit2IDAuOTM1MzE0IC0yLjgxOTE5NyAtMC4wNzY3ODAKK3YgMS4wNjU0MzYgLTIuNzkyMTY3IC0wLjA3Njc1NAordiAxLjE3ODU0MyAtMi43MTYxNjkgLTAuMDc2NzU0Cit2IDEuMjUzNzYwIC0yLjYwNDA2NSAtMC4wNzY3NTQKK3YgMS4yODE1MTYgLTIuNDY2NjY5IC0wLjA3Njc1MwordiAtMS41NDcyNTMgLTIuNjAzMjc1IC0wLjAxOTg2NgordiAtMS40NzMyODIgLTIuNzE2MTcwIC0wLjAyMTg3MgordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyMTg3MgordiAtMS4yMjI0NTkgLTIuODE5MTc5IC0wLjAyMTg2OAordiAxLjA2NDY2MCAtMi43OTAzMTggLTAuMDE5ODU1Cit2IDEuMTc4NTQyIC0yLjcxNjE2OSAtMC4wMjE4NjEKK3YgMS4yNTM3NTggLTIuNjA0MDY1IC0wLjAyMTg2MQordiAxLjI4MTUxNSAtMi40NjY2NjkgLTAuMDIxODYxCit2IC0xLjUzNjcwNyAtMi40NTg5NjQgLTAuMTE3NDE0Cit2IC0xLjUxMjI3MSAtMi41ODcyMzIgLTAuMTE3NDEzCit2IC0xLjQ0NDQzMSAtMi42ODczMjIgLTAuMTE3NDEzCit2IC0xLjM0NTE4MSAtMi43NTQ0NjkgLTAuMTE3NDEzCit2IC0xLjIxODQ1MCAtMi43Nzk3NTMgLTAuMTE3OTIzCit2IDAuOTI5MzE1IC0yLjc3OTc1MyAtMC4xMTc5MTQKK3YgMS4wNDk2NjQgLTIuNzU0NTE3IC0wLjExNzQwMwordiAxLjE0OTY5MSAtMi42ODczMTUgLTAuMTE3NDAyCit2IDEuMjE2MTk5IC0yLjU4NzM4NCAtMC4xMTc0MDIKK3YgMS4yNDE0MjUgLTIuNDU4OTY0IC0wLjExNzQwMgordiAtMS41NzY3NTggLTIuNDY2NjczIC0wLjA3MDg4OQordiAtMS41NDkxMDEgLTIuNjA0MDYxIC0wLjA3MDg4OQordiAtMS40NzMyODEgLTIuNzE2MTcwIC0wLjA3MDg4OAordiAtMS4zNjA5NTEgLTIuNzkyMTY2IC0wLjA3MDg4OAordiAtMS4yMjI0NTggLTIuODE5MTk3IC0wLjA3MDg4NwordiAwLjkzNTMxMSAtMi44MTkxOTcgLTAuMDcwODc4Cit2IDEuMDY1NDM2IC0yLjc5MjE2NyAtMC4wNzA4NzgKK3YgMS4xNzg1NDMgLTIuNzE2MTY5IC0wLjA3MDg3NwordiAxLjI1Mzc2MCAtMi42MDQwNjUgLTAuMDcwODc3Cit2IDEuMjgxNTE2IC0yLjQ2NjY2OSAtMC4wNzA4NzcKK3YgLTEuMDI4MzA2IC0yLjgxOTE5NyAtMC4wNzY3ODUKK3YgLTEuMDI4MjI4IC0yLjc3OTc1MyAtMC4xMTc5MjIKK3YgMC43NDc3MjMgLTIuNzc5MjU0IC0wLjExODgxNAordiAtMS4wMjgzMDYgLTIuODE5MTk3IC0wLjA3MDg4NwordiAtMS40NTExOTggLTIuNDQ3Njk1IC0wLjE0NzM1NgordiAwLjkxMzU5OSAtMi42NjE0MTYgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIC0yLjY2MTQxNiAtMC4xNDczNDYKK3YgMS4xMjI5MDQgLTIuNDQ3Njg3IC0wLjE0NzM0NQordiAxLjEwNDcxNiAtMi41NDE2NDMgLTAuMTQ3MzQ1Cit2IDEuMDY5NDk1IC0yLjYwMTY0NiAtMC4xNDczNDUKK3YgMS4wMDMzMDMgLTIuNjQwNDc0IC0wLjE0NzM0NgordiAtMS4yMDY1OTAgLTIuNjYxNDE2IC0wLjE0NzM1NAordiAtMS4yOTg1NTcgLTIuNjQwNDA5IC0wLjE0NzM1NAordiAtMS4zNzU2MjkgLTIuNjAyMjQwIC0wLjE0NzM1NQordiAtMS40MjcxMTcgLTIuNTQxNjQzIC0wLjE0NzM1NQordiAtMS4wMjgyNzUgLTIuNjYxNDE2IC0wLjE0NzM1NAordiAtMS40OTU3NDYgLTIuNDUzMDE5IC0wLjEzODI4OAordiAtMS40NzA1NTQgLTIuNTYzNDY5IC0wLjEzODI4OAordiAtMS40MTM3MjAgLTIuNjQ4NjQ3IC0wLjEzODI4NQordiAtMS4zMjMwMDkgLTIuNjk4NjY1IC0wLjEzODI5MwordiAtMS4yMTI5MzggLTIuNzIxMDE5IC0wLjEzODI5NQordiAwLjkxOTUxNCAtMi43MjEwMTkgLTAuMTM4MjkwCit2IDEuMDI2MjcyIC0yLjY5ODY2NCAtMC4xMzgyODkKK3YgMS4xMTIwNzggLTIuNjQ4NjM0IC0wLjEzODI4MAordiAxLjE2MDMyMiAtMi41NjM0NzMgLTAuMTM4Mjc3Cit2IDEuMTgyMDIwIC0yLjQ1MzAxOSAtMC4xMzgyNzcKK3YgLTEuMDI4MDkzIC0yLjcyMTAxOSAtMC4xMzgyOTUKK3YgMC43NDc3MjggLTIuNzIxMDU0IC0wLjEzODI5MQordiAxLjA3MjkwNCAtMi40NDIwOTkgLTAuMTQ3MzQ1Cit2IDEuMDU3Njg1IC0yLjUyMTk1NSAtMC4xNDczNDUKK3YgMS4wMzM0NzggLTIuNTY1NjI5IC0wLjE0NzM0NQordiAwLjk4MzYxNCAtMi41OTM0MTEgLTAuMTQ3MzQ1Cit2IDAuOTA4NTk1IC0yLjYxMTQxNiAtMC4xNDczNDYKK3YgMC43NDc3NjEgLTIuNjExNDE2IC0wLjE0NzM0NgordiAtMS4wMjgyNzUgLTIuNjExNDE2IC0wLjE0NzM1NAordiAtMS4yMDM4MTkgLTIuNjExNDE2IC0wLjE0NzM1NQordiAtMS4yNzg4NjggLTIuNTkwMzAzIC0wLjE0NzM1NQordiAtMS4zMzk2MTIgLTIuNTY2MjIzIC0wLjE0NzM1NQordiAtMS4zODAwODUgLTIuNTIxOTU1IC0wLjE0NzM1NQordiAtMS40MDExOTggLTIuNDQyMDk5IC0wLjE0NzM1NQordiAtMS4yNzg4NjggLTIuNDQyMDk5IC0wLjE0NzM1NQordiAtMS4yMDM4MTkgLTIuNDQyMDk5IC0wLjE0NzM1NAordiAtMS4wMjgyNzQgLTIuNDQyMDk5IC0wLjE0NzM1NAordiAwLjc0Nzc2MSAtMi40NDIwOTkgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IC0yLjQ0MjA5OSAtMC4xNDczNDYKK3YgMC45ODM2MTQgLTIuNDQyMDk5IC0wLjE0NzM0NQordiAtMS4yNzg4NjggLTIuNTIxOTU0IC0wLjE0NzM1NQordiAtMS4yMDM4MTkgLTIuNTIxOTU0IC0wLjE0NzM1NAordiAtMS4wMjgyNzQgLTIuNTIxOTU0IC0wLjE0NzM1NAordiAwLjc0Nzc2MSAtMi41MjE5NTQgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IC0yLjUyMTk1NCAtMC4xNDczNDYKK3YgMC45ODM2MTQgLTIuNTIxOTU0IC0wLjE0NzM0NQordiAtMS41NzQ3OTEgLTIuNDY2NjcyIC0wLjAxOTg2NgordiAwLjkzNTE5NyAtMi44MTY0MDEgLTAuMDE5ODY5Cit2IC0wLjY5OTc2MiAtMi43Nzk3NTMgLTAuMTE3OTIxCit2IC0wLjY5OTczMCAtMi43MjEwMTkgLTAuMTM4Mjk0Cit2IC0wLjY5OTcwNyAtMi40NDIwOTkgLTAuMTQ3MzUzCit2IC0wLjY5OTcwNyAtMi41MjE5NTQgLTAuMTQ3MzUyCit2IC0wLjY5OTc4MCAtMi44MTkxOTcgLTAuMDc2Nzg0Cit2IC0wLjY5OTc4MSAtMi44MTkxNzkgLTAuMDIxODY3Cit2IC0wLjY5OTc4MCAtMi44MTkxOTcgLTAuMDcwODg1Cit2IC0wLjY5OTcwNyAtMi42NjE0MTYgLTAuMTQ3MzUyCit2IC0wLjY5OTcwNyAtMi42MTE0MTYgLTAuMTQ3MzUyCit2IDAuNDA0MDAwIC0yLjgxOTE5NyAtMC4wNzY3ODIKK3YgMC40MDM5OTkgLTIuODE2NDAxIC0wLjAxOTg3MAordiAwLjQwNDAwMCAtMi44MTkxOTcgLTAuMDcwODgxCit2IDAuNDAzOTgzIC0yLjY2MTQxNiAtMC4xNDczNDgKK3YgMC40MDM5ODMgLTIuNjExNDE2IC0wLjE0NzM0OAordiAwLjQwMzk5NSAtMi43Nzk3NTMgLTAuMTE3OTE2Cit2IDAuNDAzOTg4IC0yLjcyMTAxOSAtMC4xMzgyOTEKK3YgMC40MDM5ODMgLTIuNDQyMDk5IC0wLjE0NzM0OAordiAwLjQwMzk4MyAtMi41MjE5NTQgLTAuMTQ3MzQ4Cit2IC0wLjQzNTUxMSAtMi44MTkxOTcgLTAuMDc2Nzg0Cit2IC0wLjQzNTUxMSAtMi44MTY0MDEgLTAuMDE5ODcyCit2IC0wLjQzNTUxMSAtMi44MTkxOTcgLTAuMDcwODg0Cit2IC0wLjQzNTQ3NCAtMi42NjE0MTYgLTAuMTQ3MzUxCit2IC0wLjQzNTQ3NCAtMi42MTE0MTYgLTAuMTQ3MzUxCit2IDAuMTQwMjUzIC0yLjc3OTc1MyAtMC4xMTc5MTcKK3YgMC4xNDAyNTAgLTIuNzIxMDE5IC0wLjEzODI5MgordiAwLjE0MDI0NyAtMi40NDIwOTkgLTAuMTQ3MzQ5Cit2IDAuMTQwMjQ3IC0yLjUyMTk1NCAtMC4xNDczNDkKK3YgLTAuNDM1NTAxIC0yLjc3OTc1MyAtMC4xMTc5MTkKK3YgLTAuNDM1NDg1IC0yLjcyMTAxOSAtMC4xMzgyOTMKK3YgLTAuNDM1NDc0IC0yLjQ0MjA5OSAtMC4xNDczNTEKK3YgLTAuNDM1NDc0IC0yLjUyMTk1NCAtMC4xNDczNTEKK3YgMC4xNDAyNTUgLTIuODE5MTk3IC0wLjA3Njc4MgordiAwLjE0MDI1NSAtMi44MTkxNzkgLTAuMDIxODY1Cit2IDAuMTQwMjU1IC0yLjgxOTE5NyAtMC4wNzA4ODIKK3YgMC4xNDAyNDcgLTIuNjYxNDE2IC0wLjE0NzM0OQordiAwLjE0MDI0NyAtMi42MTE0MTYgLTAuMTQ3MzQ5Cit2IC0xLjU1Njc1OSAtMi40NjY2NjcgLTAuMDE5ODY2Cit2IC0xLjUzMDI5MiAtMi41OTUyMzQgLTAuMDE5ODY2Cit2IC0xLjQ1ODg3NSAtMi43MDIwNjAgLTAuMDE5ODY1Cit2IC0xLjM1MzA3NyAtMi43NzMzMzAgLTAuMDE5ODY1Cit2IC0xLjIyMDQ1OCAtMi43OTQ4MDEgLTAuMDE5ODc0Cit2IC0wLjY5OTc4MCAtMi43OTQ4MDEgLTAuMDE5ODczCit2IC0wLjQzNTUxMSAtMi43OTQ4MDEgLTAuMDE5ODcyCit2IDAuMTQwMjU1IC0yLjc5NDgwMSAtMC4wMTk4NzEKK3YgMC40MDM5OTkgLTIuNzk0ODAxIC0wLjAxOTg3MAordiAwLjkzMTcyNyAtMi43OTQ4MDEgLTAuMDE5ODY5Cit2IDEuMDU3NTU5IC0yLjc3MzM3OSAtMC4wMTk4NTUKK3YgMS4xNjQxMzUgLTIuNzAxNDY2IC0wLjAxOTg1NAordiAxLjIzNTA2MSAtMi41OTYyMTAgLTAuMDE5ODU0Cit2IDEuMjYxNDc3IC0yLjQ2NjY2NiAtMC4wMTk4NTQKK3YgLTEuNTQ5MTA0IC0yLjYwNDA2MSAtMC4wMjE4NzIKK3YgLTEuNDcxODY0IC0yLjcxNDc2MCAtMC4wMTk4NjUKK3YgLTEuMzYwMTc3IC0yLjc5MDMxMiAtMC4wMTk4NjUKK3YgLTEuMjIyMjYyIC0yLjgxNjQwMSAtMC4wMTk4NzQKK3YgMS4wNjU0MzUgLTIuNzkyMTY3IC0wLjAyMTg2MgordiAxLjE3NzEyNCAtMi43MTQ3NDQgLTAuMDE5ODU0Cit2IDEuMjUxOTA2IC0yLjYwMzMwMiAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTIuNDY2NjY5IC0wLjAxOTg1NAordiAtMS41NzY3NTkgLTIuNDY2NjczIC0wLjAyMTg3MwordiAwLjkzNTMwOSAtMi44MTkxNzkgLTAuMDIxODYzCit2IC0wLjY5OTc4MCAtMi44MTY0MDEgLTAuMDE5ODczCit2IDAuNDAzOTk5IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgLTAuNDM1NTExIC0yLjgxOTE3OSAtMC4wMjE4NjYKK3YgMC4xNDAyNTUgLTIuODE2NDAxIC0wLjAxOTg3MQordiAtMS41NzY3NTkgLTIuNDY2NjczIC0wLjAyNDE2OQordiAtMS41NDkxMDQgLTIuNjA0MDYxIC0wLjAyNDE2OQordiAtMS40NzMyODIgLTIuNzE2MTcwIC0wLjAyNDE2OQordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyNDE2OAordiAtMS4yMjI0NTkgLTIuODE5MTgzIC0wLjAyNDE2NwordiAwLjkzNTMwOSAtMi44MTkxODMgLTAuMDI0MTU5Cit2IDEuMDY1NDM1IC0yLjc5MjE2NyAtMC4wMjQxNTgKK3YgMS4xNzg1NDIgLTIuNzE2MTY5IC0wLjAyNDE1OAordiAxLjI1Mzc1OCAtMi42MDQwNjUgLTAuMDI0MTU3Cit2IDEuMjgxNTE1IC0yLjQ2NjY2OSAtMC4wMjQxNTcKK3YgLTAuNjk5NzgxIC0yLjgxOTE4MyAtMC4wMjQxNjUKK3YgMC40MDM5OTkgLTIuODE5MTgzIC0wLjAyNDE2MQordiAtMC40MzU1MTEgLTIuODE5MTgzIC0wLjAyNDE2NAordiAwLjE0MDI1NSAtMi44MTkxODMgLTAuMDI0MTYyCit2IDAuNjMyODQ2IC0yLjgxNjQwMSAtMC4wMTk4NzAKK3YgMC42MzI4NDYgLTIuNzc5NzUzIC0wLjExNzkxNQordiAwLjY0MjA3NyAtMi43MjEwMTkgLTAuMTM4MjkxCit2IDAuNjQyMzY3IC0yLjQ0MjA5OSAtMC4xNDczNDcKK3YgMC42NDIyMjcgLTIuNTIxOTU0IC0wLjE0NzM0NwordiAwLjYzMjg0NyAtMi44MTkxNzkgLTAuMDIxODY0Cit2IDAuNjMyODQ3IC0yLjgxOTE4MyAtMC4wMjQxNjAKK3YgMC42MzI4NDcgLTIuODE5MTk3IC0wLjA3Njc4MQordiAwLjYzMjg0OSAtMi44MTkxOTcgLTAuMDcwODgwCit2IDAuNjQxOTk0IC0yLjY2MTQxNiAtMC4xNDczNDcKK3YgMC42NDIyMjcgLTIuNjExNDE2IC0wLjE0NzM0NwordiAwLjYzMjg0NiAtMi43OTQ4MDEgLTAuMDE5ODcwCit2IC0wLjkzNzAyOCAtMi43Nzk3NTMgLTAuMTE3OTIyCit2IC0wLjkzNzAyNyAtMi43MjEwMTkgLTAuMTM4Mjk1Cit2IC0wLjkzNzAyNyAtMi40NDIwOTkgLTAuMTQ3MzUzCit2IC0wLjkzNzAyNyAtMi41MjE5NTQgLTAuMTQ3MzUzCit2IC0wLjkzNzAyNCAtMi44MTY0MDEgLTAuMDE5ODczCit2IC0wLjkzNzAyOCAtMi44MTkxOTcgLTAuMDc2Nzg1Cit2IC0wLjkzNzAyOCAtMi44MTkxOTcgLTAuMDcwODg2Cit2IC0wLjkzNzAyNyAtMi42NjE0MTYgLTAuMTQ3MzUzCit2IC0wLjkzNzAyNyAtMi42MTE0MTYgLTAuMTQ3MzU0Cit2IC0wLjkzNzAyNCAtMi43OTQ4MDEgLTAuMDE5ODczCit2IC0wLjkzNzAyNCAtMi44MTkxNzkgLTAuMDIxODY3Cit2IC0wLjkzNzAyNCAtMi44MTkxODMgLTAuMDI0MTY2Cit2IC0wLjMzNTYxOCAtMi44MTY0MDEgLTAuMDE5ODcyCit2IC0wLjMzNDUxOCAtMi44MTkxNzkgLTAuMDIxODY2Cit2IC0wLjMzMzI5NyAtMi44MTkxODMgLTAuMDI0MTY0Cit2IC0wLjMyMjI1NiAtMi44MTkxODMgLTAuMDM5NDQ3Cit2IC0wLjI4ODIzNCAtMi44MTkxODMgLTAuMDUzOTkwCit2IC0wLjAwNzA0MiAtMi44MTkxODMgLTAuMDU0MDk4Cit2IDAuMDI1OTUwIC0yLjgxOTE4MyAtMC4wNDA0NjgKK3YgMC4wMzczMDUgLTIuODE5MTgzIC0wLjAyNDE2MgordiAwLjAzODc2NiAtMi44MTkxNzkgLTAuMDIxODY1Cit2IDAuMDM5ODYzIC0yLjgxNjQwMSAtMC4wMTk4NzEKK3YgLTAuMzI3NTM0IC0yLjgxNjQwMSAtMC4wMTk4NzIKK3YgLTAuMzI2MDYxIC0yLjgxOTE3OSAtMC4wMjE4NjYKK3YgLTAuMzI0MzA1IC0yLjgxOTE4MyAtMC4wMjQxNjQKK3YgLTAuMzE3MjgzIC0yLjgxOTE4MyAtMC4wMzQ5MTMKK3YgLTAuMjg4MjM2IC0yLjgxOTE4MyAtMC4wNDY4MjQKK3YgLTAuMDA3MDQxIC0yLjgxOTE4MyAtMC4wNDY4NjMKK3YgMC4wMjE4NTUgLTIuODE5MTgzIC0wLjAzNTE0OQordiAwLjAyOTI2MiAtMi44MTkxODMgLTAuMDI0MTYyCit2IDAuMDMwODg1IC0yLjgxOTE3OSAtMC4wMjE4NjUKK3YgMC4wMzIyNDAgLTIuODE2NDAxIC0wLjAxOTg3MQordiAtMC4zMjU4MTYgLTIuNzk0ODAwIC0wLjAyMDM5MQordiAtMC4zMzU1OTMgLTIuNzk0ODAxIC0wLjAxOTg3MgordiAwLjAzMjIyNyAtMi43OTQ4MDEgLTAuMDE5ODcxCit2IDAuMDM5ODM1IC0yLjc5NDgwMSAtMC4wMTk4NzEKK3YgLTAuMjg4MTYxIC0yLjgxOTE5NyAtMC4wNzY3ODMKK3YgLTAuMjg4MTYxIC0yLjgxOTE5NyAtMC4wNzA2ODcKK3YgLTAuMjg4MTM5IC0yLjY2MTQxNiAtMC4xNDczNTEKK3YgLTAuMjg4MTM5IC0yLjYxMTQxNiAtMC4xNDczNTEKK3YgLTAuMDA2OTk1IC0yLjc3OTc1MyAtMC4xMTc5MTgKK3YgLTAuMDA2OTk2IC0yLjcyMTAxOSAtMC4xMzgyOTIKK3YgLTAuMDA2OTk4IC0yLjQ0MjA5OSAtMC4xNDczNTAKK3YgLTAuMDA2OTk4IC0yLjUyMTk1NCAtMC4xNDczNTAKK3YgLTAuMjg4MTU1IC0yLjc3OTc1MyAtMC4xMTc5MTkKK3YgLTAuMjg4MTQ2IC0yLjcyMTAxOSAtMC4xMzgyOTMKK3YgLTAuMjg4MTM5IC0yLjQ0MjA5OSAtMC4xNDczNTEKK3YgLTAuMjg4MTM5IC0yLjUyMTk1NCAtMC4xNDczNTEKK3YgLTAuMDA2OTk0IC0yLjgxOTE5NyAtMC4wNzY3ODMKK3YgLTAuMDA2OTk0IC0yLjgxOTE5NyAtMC4wNzA2ODcKK3YgLTAuMDA2OTk4IC0yLjY2MTQxNiAtMC4xNDczNTAKK3YgLTAuMDA2OTk4IC0yLjYxMTQxNiAtMC4xNDczNTAKK3YgLTAuMjY5NTAwIC0yLjgxOTE4MyAtMC4wNTQwMjcKK3YgLTAuMDI2MTY1IC0yLjgxOTE4MyAtMC4wNTQyMTgKK3YgLTAuMjY5NTAwIC0yLjgxODM5NiAtMC4wNDYwMjYKK3YgLTAuMDI2MTY1IC0yLjgxOTE4MyAtMC4wNDY4NjMKK3YgLTAuMjY5NDk4IC0yLjgxOTE5NyAtMC4wNzY3ODMKK3YgLTAuMDI2MTYxIC0yLjgxOTE5NyAtMC4wNzY3ODMKK3YgLTAuMjY5NDk4IC0yLjgxOTE5NyAtMC4wNzA2ODcKK3YgLTAuMDI2MTYxIC0yLjgxOTE5NyAtMC4wNzA2ODcKK3YgLTAuMzI1MDA4IC0yLjc5NDgwMCAtMC4wMjE4NzUKK3YgLTAuMzIzNDY3IC0yLjc5NDgwMCAtMC4wMjQxNjIKK3YgLTAuMzE2NTY3IC0yLjc5NDgwMCAtMC4wMzQ0MjAKK3YgLTAuMjg4MjM2IC0yLjc5NDgwMCAtMC4wNDYwMjYKK3YgLTAuMDA3MDQxIC0yLjc5NDgwMCAtMC4wNDYwMjQKK3YgMC4wMjEyMzcgLTIuNzk0ODAwIC0wLjAzNDQzMQordiAwLjAyODI2MCAtMi43OTQ4MDAgLTAuMDI0MTYyCit2IDAuMDI5ODAzIC0yLjc5NDgwMCAtMC4wMjE4NzQKK3YgLTAuMjY5NTAwIC0yLjc5NDgwMCAtMC4wNDYwMjYKK3YgLTAuMDI2MTY1IC0yLjc5NDgwMCAtMC4wNDYwMjQKK3YgLTAuMzI1Nzg3IC0yLjgxNjQwNSAtMC4wMjAzODgKK3YgLTAuMzI1MDA4IC0yLjgxODQwNiAtMC4wMjE4NjYKK3YgLTAuMzIzNDY3IC0yLjgxODM5NiAtMC4wMjQxNjQKK3YgLTAuMzE2NTY3IC0yLjgxODM5NiAtMC4wMzQ0MjMKK3YgLTAuMjg4MjM2IC0yLjgxODM5NiAtMC4wNDYwMjYKK3YgLTAuMDA3MDQxIC0yLjgxODM5NiAtMC4wNDYwMjgKK3YgMC4wMjEyMzcgLTIuODE4Mzk2IC0wLjAzNDQzMwordiAwLjAyODI2MCAtMi44MTgzOTYgLTAuMDI0MTYyCit2IDAuMDI5ODAzIC0yLjgxODQwNiAtMC4wMjE4NjUKK3YgMC4wMzA5ODggLTIuODE2NDA3IC0wLjAyMDM4OAordiAtMC4zMjc1NTcgLTIuNzk0ODAxIC0wLjAxOTg3MgordiAwLjAzMDk5MSAtMi43OTQ4MDAgLTAuMDIwMzkwCit2IC0wLjI2OTUwMCAtMi44MTkxODMgLTAuMDQ2ODI0Cit2IC0wLjAyNjE2NSAtMi44MTgzOTYgLTAuMDQ2MDI4Cit2IC0wLjgzODg3MyAtMi43Nzk3NTMgLTAuMTE3OTIxCit2IC0wLjgzODg1NiAtMi43MjEwMTkgLTAuMTM4Mjk0Cit2IC0wLjgzODg0NSAtMi40NDIwOTkgLTAuMTQ3MzUzCit2IC0wLjgzODg0NSAtMi41MjE5NTQgLTAuMTQ3MzUzCit2IC0wLjgzODg4MCAtMi44MTY0MDEgLTAuMDE5ODczCit2IC0wLjgzODg4MCAtMi44MTkxNzkgLTAuMDIxODY3Cit2IC0wLjgzODg4MCAtMi44MTkxODMgLTAuMDI0MTY2Cit2IC0wLjgzODg4MiAtMi44MTkxOTcgLTAuMDc2Nzg1Cit2IC0wLjgzODg4MiAtMi44MTkxOTcgLTAuMDcwODg2Cit2IC0wLjgzODg0NSAtMi42NjE0MTYgLTAuMTQ3MzUzCit2IC0wLjgzODg0NSAtMi42MTE0MTYgLTAuMTQ3MzUzCit2IC0wLjgzODg4MCAtMi43OTQ4MDEgLTAuMDE5ODczCit2IDAuNTIyNDQ4IDAuMjYxNDIxIC0wLjE0NzM0NwordiAwLjUyMjQ0OCAwLjAwOTk5NiAtMC4xNDczNDcKK3YgMC41MjI0NDggLTAuMjM5NjI2IC0wLjE0NzM0NwordiAwLjUyMjQ0OCAtMC40ODkwNTggLTAuMTQ3MzQ3Cit2IDAuNTIyNDM5IC0yLjI2MzE0NyAtMC4xNDczNDgKK3YgMC41MjI0NDggLTEuODI4MTY1IC0wLjE0NzM0OAordiAwLjUyMjQ0OCAtMS40ODY4NjAgLTAuMTQ3MzQ4Cit2IDAuNTIyNDQ4IC0xLjIzNzgyMiAtMC4xNDczNDgKK3YgMC41MjI0NDggLTAuOTg4MzQ0IC0wLjE0NzM0OAordiAwLjUyMjQ0OCAtMC43Mzg3NzIgLTAuMTQ3MzQ4Cit2IDAuNTIyNzgxIC0yLjgxOTE5NyAtMC4wNzY3ODEKK3YgMC41MjI3ODEgLTIuODE5MTk3IC0wLjA3MDg4MAordiAwLjUyMjQ5MiAtMi42NjE0MTYgLTAuMTQ3MzQ3Cit2IDAuNTIyNDkyIC0yLjYxMTQxNSAtMC4xNDczNDcKK3YgMC41MjI3ODAgLTIuODE2NDAxIC0wLjAxOTg3MAordiAwLjUyMjc1NyAtMi43Nzk3NTMgLTAuMTE3OTE2Cit2IDAuNTIyNzE3IC0yLjcyMTAxOSAtMC4xMzgyOTEKK3YgMC41MjI1NzQgLTIuNDQyMDk5IC0wLjE0NzM0NwordiAwLjUyMjQ5MiAtMi41MjE5NTQgLTAuMTQ3MzQ3Cit2IDAuNTIyNzgwIC0yLjc5NDgwMSAtMC4wMTk4NzAKK3YgMC41MjI3ODAgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjUyMjc4MCAtMi44MTkxODMgLTAuMDI0MTYwCit2IC0xLjIyNDY5MCAyLjk2ODE4NiAtMC4wNzY3MTIKK3YgLTEuMzYwOTk2IDIuOTM5NjgzIC0wLjA3Njc2MwordiAtMS40NzMyMzYgMi44NjM5NzYgLTAuMDc2NzY0Cit2IC0xLjU0OTAwMiAyLjc1MTY1NSAtMC4wNzY3NjQKK3YgLTEuNTc2NzU4IDIuNjE0OTAyIC0wLjA3Njc2NQordiAtMS4zNjAyMjEgMi45Mzc4MzEgLTAuMDE5ODY0Cit2IC0xLjQ3MzIzNyAyLjg2Mzk3NiAtMC4wMjE4NzEKK3YgLTEuNTQ5MDAzIDIuNzUxNjU1IC0wLjAyMTg3MgordiAtMS41NzY3NTggMi42MTQ5MDIgLTAuMDIxODcyCit2IC0xLjQ0NjQxNCAyLjgzNDcxNyAtMC4xMTc0MTIKK3YgLTEuNTExMzMwIDIuNzM0NzAwIC0wLjExNzQxMwordiAtMS41MzY3MDcgMi42MDk0NjIgLTAuMTE3NDEzCit2IC0xLjIxODcwNyAyLjkyNzQwMyAtMC4xMTc0MTEKK3YgLTEuMzQ1MjI1IDIuOTAyMDA5IC0wLjExNzQxMgordiAtMS4yMjQ2OTAgMi45NjgxODYgLTAuMDcwODg2Cit2IC0xLjM2MDk5NiAyLjkzOTY4MyAtMC4wNzA4ODcKK3YgLTEuNDczMjM2IDIuODYzOTc2IC0wLjA3MDg4NwordiAtMS41NDkwMDIgMi43NTE2NTUgLTAuMDcwODg4Cit2IC0xLjU3Njc1OCAyLjYxNDkwMiAtMC4wNzA4ODgKK3YgLTEuNTc2NzU4IDIuNDE1MDQ3IC0wLjA3Njc2NQordiAtMS41NzY3NTkgMi40MTUwNDcgLTAuMDIxODcyCit2IC0xLjUzNjcwNiAyLjQxNDkxNiAtMC4xMTc0MTMKK3YgLTEuNTc2NzU0IDIuNDE1MDQ3IC0wLjA3MDg4OAordiAtMS4wNDIzNDMgMi45NjgxODYgLTAuMDc2NzEyCit2IC0xLjAzODc5MSAyLjkyNzQwMyAtMC4xMTc0MTEKK3YgLTEuMDQyMzQ0IDIuOTY4MTg2IC0wLjA3MDg4NgordiAtMS4zNzUwOTIgMi43NTc0NzIgLTAuMTQ3MzU0Cit2IC0xLjIwNDUyNyAyLjgwODg4MiAtMC4xNDczNTQKK3YgLTEuMjk3MTI3IDIuNzk1NTM2IC0wLjE0NzM1NAordiAtMS4wMjgyNzMgMi44MDg4ODIgLTAuMTQ3MzUzCit2IC0xLjQyNzExNiAyLjY5MTUwNCAtMC4xNDczNTQKK3YgLTEuNDUxMTk3IDIuNTkxMTI3IC0wLjE0NzM1NQordiAtMS40NTExOTcgMi40MTQ1MjYgLTAuMTQ3MzU1Cit2IC0xLjQxMjQxMyAyLjc5NDk5NyAtMC4xMzgyODcKK3YgLTEuNDcwNjk1IDIuNzE0MjM3IC0wLjEzODI4NwordiAtMS40OTU3NDYgMi42MDA5OTYgLTAuMTM4Mjg3Cit2IC0xLjIxMDUyNiAyLjg2Nzk5OCAtMC4xMzgyODYKK3YgLTEuMzIwNDA1IDIuODQ2MTMyIC0wLjEzODI4NgordiAtMS40OTU3NDYgMi40MTQ3MjEgLTAuMTM4Mjg3Cit2IC0xLjAzMzUxOSAyLjg2Nzk5OCAtMC4xMzgyODUKK3YgLTEuNDAxMTk3IDIuNDE0NTI2IC0wLjE0NzM1NQordiAtMS40MDExOTcgMi41ODIxNzEgLTAuMTQ3MzU1Cit2IC0xLjM4MDA4NSAyLjY3MzU2OCAtMC4xNDczNTQKK3YgLTEuMzQ1MDAxIDIuNzI1NDU4IC0wLjE0NzM1NAordiAtMS4yNzg4NjggMi43NTAzNTIgLTAuMTQ3MzU0Cit2IC0xLjIwMzYzMCAyLjc2NTE4MiAtMC4xNDczNTQKK3YgLTEuMDI4MjczIDIuNzY1MTgyIC0wLjE0NzM1MwordiAtMS4yNzg4NjcgMi40MTQ1MjYgLTAuMTQ3MzU0Cit2IC0xLjIwMzYzMCAyLjQxNDUyNiAtMC4xNDczNTQKK3YgLTEuMDI4Mjc0IDIuNDE0NTI2IC0wLjE0NzM1MwordiAtMS4yNzg4NjcgMi41ODIxNzEgLTAuMTQ3MzU0Cit2IC0xLjIwMzYzMCAyLjU4MjE3MSAtMC4xNDczNTQKK3YgLTEuMDI4Mjc0IDIuNTgyMTcxIC0wLjE0NzM1MwordiAtMS4yNzg4NjcgMi42NzM1NjkgLTAuMTQ3MzU0Cit2IC0xLjIwMzYzMCAyLjY3MzU2OSAtMC4xNDczNTQKK3YgLTEuMDI4Mjc0IDIuNjczNTY5IC0wLjE0NzM1MwordiAtMS4yMjQ0OTQgMi45NjYyMTYgLTAuMDE5ODY0Cit2IC0xLjA0MjM0NSAyLjk2ODE4NiAtMC4wMjE4NzAKK3YgLTAuMTQ3NjEyIDIuOTY4MTg2IC0wLjA3NjcxMAordiAtMC4xNDc2MTIgMi45NjgxODYgLTAuMDIxODY2Cit2IC0wLjE0NzYxMiAyLjkyNzQwMyAtMC4xMTc0MDcKK3YgLTAuMTQ3NjEyIDIuOTY4MTg2IC0wLjA3MDg4MgordiAtMC42OTk3NzkgMi45NjgxODYgLTAuMDc2NzExCit2IC0wLjY5OTc4MCAyLjk2ODE4NiAtMC4wMjE4NjgKK3YgLTAuNjk5Nzc5IDIuOTY4MTg2IC0wLjA3MDg4NAordiAtMC42OTk3MDYgMi44MDg4ODIgLTAuMTQ3MzUyCit2IC0wLjY5OTcwNiAyLjc2NTE4MiAtMC4xNDczNTIKK3YgLTAuNjk5NzA2IDIuNDE0NTI2IC0wLjE0NzM1MgordiAtMC43MDA4MjYgMi41ODIxNzEgLTAuMTQ3MzUyCit2IC0wLjY5OTcwNiAyLjY3MzU2OSAtMC4xNDczNTIKK3YgLTAuNjk5NzYxIDIuOTI3NDAzIC0wLjExNzQwOQordiAtMC42OTk3MzMgMi44Njc5OTggLTAuMTM4Mjg0Cit2IC0wLjY5OTcwNyAxLjUwNTQyNiAtMC4xNDczNTIKK3YgLTAuMzY5NDIyIDIuOTI3NDAzIC0wLjExNzQwOAordiAtMC4zNjk0MTUgMi44Njc5OTggLTAuMTM4MjgzCit2IC0wLjM2OTQyNyAyLjk2ODE4NiAtMC4wNzY3MTAKK3YgLTAuMzY5NDI4IDIuOTY4MTg2IC0wLjAyMTg2NwordiAtMC4zNjk0MjcgMi45NjgxODYgLTAuMDcwODgzCit2IC0wLjM2OTQwOCAyLjgwODg4MiAtMC4xNDczNTAKK3YgLTAuMzY5NDA4IDIuNzY1MTgyIC0wLjE0NzM1MAordiAtMC4zNjk0MDggMi43MTE5NjAgLTAuMTQ3MzUwCit2IC0xLjUzNjcwNyAxLjkwNDEzNiAtMC4xMTc0MTMKK3YgLTEuNDk1NzQ2IDEuOTA0MTM1IC0wLjEzODI4NwordiAtMC42OTk3MDcgMS45MDQxMzUgLTAuMTQ3MzUyCit2IC0xLjU3Njc1OCAxLjkwNDEzNiAtMC4wNzY3NjUKK3YgLTEuNTc2NzU0IDEuOTA0MTM2IC0wLjA3MDg4OAordiAtMS40NTExOTcgMS45MDQxMzUgLTAuMTQ3MzU1Cit2IC0xLjQwMTE5NyAxLjkwNDEzNSAtMC4xNDczNTUKK3YgLTEuMjc4ODY3IDEuOTA0MTM1IC0wLjE0NzM1NAordiAtMS4yMDM4MTggMS45MDQxMzUgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAxLjkwNDEzNSAtMC4xNDczNTMKK3YgLTAuMjgwODM1IDIuNDcxNjE5IC0wLjE5MzQ1NgordiAtMC4zODk2OTMgMi4zOTgxOTkgLTAuMTkzNDU2Cit2IC0wLjQ2MzA3NCAyLjI4OTM3MyAtMC4xOTM0NTcKK3YgLTAuNDg5OTk2IDIuMTU2MTE5IC0wLjE5MzQ1NwordiAtMC40NjMwODggMi4wMjI5NDUgLTAuMTkzNDU2Cit2IC0wLjM4ODU1NiAxLjkxNTExMSAtMC4xOTM0NTYKK3YgLTAuMjgwMTIxIDEuODQwNTk4IC0wLjE5MzQ1NgordiAtMC4yNzIyNzcgMi40NTEzNDcgLTAuMTk4OTQ4Cit2IC0wLjM3NDE0MSAyLjM4MjY0MiAtMC4xOTg5NDgKK3YgLTAuNDQyODA1IDIuMjgwODEzIC0wLjE5ODk0OQordiAtMC40Njc5OTggMi4xNTYxMTcgLTAuMTk4OTQ5Cit2IC0wLjQ0MjgyMCAyLjAzMTUwMSAtMC4xOTg5NDkKK3YgLTAuMzc0MTQ2IDEuOTI5NjA5IC0wLjE5ODk0OAordiAtMC4yNzIyNzIgMS44NjA4NjMgLTAuMTk4OTQ4Cit2IC0wLjMzODYzMyAyLjYwOTc2NyAtMC4xNDczNTAKK3YgLTAuNDk0ODk3IDIuNTA0MTU4IC0wLjE0NzM1MQordiAtMC42MDAwMDYgMi4zNDgzOTcgLTAuMTQ3MzUyCit2IC0wLjYzODYyOSAyLjE1NjExNyAtMC4xNDczNTIKK3YgLTAuNjAwMDA2IDEuOTY2MzYyIC0wLjE0NzM1MgordiAtMC41MDE1ODkgMS44MDIxNDggLTAuMTQ3NTIxCit2IC0wLjMzODYzNSAxLjcwNDk5MSAtMC4xNDczNTEKK3YgLTAuNjY3NTQ0IDIuMTU2MTE3IC0wLjE0NzM1MgordiAtMC4zNDkzNzYgMS42NzgxMzMgLTAuMTQ3MzUxCit2IC0wLjUyMTY0NyAxLjc4MTczNSAtMC4xNDczNTEKK3YgLTAuNjI1MTg2IDEuOTUxNjUzIC0wLjE0NzM1MgordiAtMC42MjQyNjQgMi4zNjUyODMgLTAuMTQ3MzUyCit2IC0wLjM1MDgyNSAyLjYzNjAwOSAtMC4xNDczNTAKK3YgLTAuNTE2NDE1IDIuNTIzNTEwIC0wLjE0NzM1MQordiAtMC44Mzg5NDYgMi45NjgxODYgLTAuMDc2NzExCit2IC0wLjgzODk0NiAyLjk2ODE4NiAtMC4wMjE4NjkKK3YgLTAuODM4OTQ2IDIuOTY4MTg2IC0wLjA3MDg4NQordiAtMC44Mzg1NDMgMi44MDg4ODIgLTAuMTQ3MzUyCit2IC0wLjgzODEwNSAyLjc2NTE4MiAtMC4xNDczNTIKK3YgLTAuODM4MTA1IDIuNDE0NTI2IC0wLjE0NzM1MgordiAtMC44Mzk0MzEgMi41ODIxNzEgLTAuMTQ3MzUyCit2IC0wLjgzODEwNSAyLjY3MzU2OSAtMC4xNDczNTIKK3YgLTAuODM4ODQ0IDIuOTI3NDAzIC0wLjExNzQxMAordiAtMC44Mzg2OTMgMi44Njc5OTggLTAuMTM4Mjg0Cit2IC0wLjgzODEwNSAxLjkwNDEzNSAtMC4xNDczNTMKK3YgLTAuOTM3MDg5IDIuOTY4MTg2IC0wLjA3NjcxMgordiAtMC45MzcwOTAgMi45NjYyMTYgLTAuMDE5ODYyCit2IC0wLjkzNzA4OSAyLjk2ODE4NiAtMC4wNzA4ODUKK3YgLTAuOTM3NDE0IDIuODA4ODgyIC0wLjE0NzM1MwordiAtMC45Mzc0MTQgMi43NjUxODIgLTAuMTQ3MzUzCit2IC0wLjkzNzQxNCAyLjQxNDUyNiAtMC4xNDczNTMKK3YgLTAuOTM3Mjk0IDIuNTgyMTcxIC0wLjE0NzM1MwordiAtMC45Mzc0MTQgMi42NzM1NjkgLTAuMTQ3MzUzCit2IC0wLjkzNzQxNCAxLjkwNDEzNSAtMC4xNDczNTMKK3YgLTAuOTM2OTM2IDIuOTI3NDAzIC0wLjExNzQxMAordiAtMC45MzY3MDggMi44Njc5OTggLTAuMTM4Mjg1Cit2IC0wLjI3MTM2MSAyLjQ0OTE3OCAtMC4xOTY2NjkKK3YgLTAuMzcyNDc4IDIuMzgwOTc4IC0wLjE5NjY2OQordiAtMC40NDA2MzUgMi4yNzk4OTYgLTAuMTk2NjcwCit2IC0wLjQ2NTY0MSAyLjE1NjExNyAtMC4xOTY2NzAKK3YgLTAuNDQwNjUwIDIuMDMyNDE3IC0wLjE5NjY3MAordiAtMC4zNzI0ODMgMS45MzEyNzMgLTAuMTk2NjcwCit2IC0wLjI3MTM1NyAxLjg2MzAzMiAtMC4xOTY2NjkKK3YgLTAuNDgwNjAzIDIuMTU2MTIxIC0wLjE5ODk0OQordiAtMC4yNzY0NzggMS44NDkyNTQgLTAuMTk4OTQ4Cit2IC0wLjM4MTkzNCAxLjkyMTczNSAtMC4xOTg5NDkKK3YgLTAuNDU0NDM0IDIuMDI2NjAwIC0wLjE5ODk0OQordiAtMC40NTQ0MjAgMi4yODU3MjAgLTAuMTk4OTQ5Cit2IC0wLjM4MzA1MiAyLjM5MTU1OSAtMC4xOTg5NDkKK3YgLTAuMjc3MTgwIDIuNDYyOTY3IC0wLjE5ODk0OAordiAtMS40NTk4NDMgMi44NDg2MjMgLTAuMDE5ODY0Cit2IC0xLjUzMDE5MSAyLjc0Mzc3OSAtMC4wMTk4NjUKK3YgLTEuNTU2NzU5IDIuNjExNDY4IC0wLjAxOTg2NQordiAtMS41NTY3NTkgMi40MTUwNDcgLTAuMDE5ODY1Cit2IC0wLjM2OTQyOCAyLjk0NzQ1NSAtMC4wMTk4NjAKK3YgLTAuNjk5NzgwIDIuOTQ3NDU1IC0wLjAxOTg2MgordiAtMC44Mzg5NDYgMi45NDc0NTUgLTAuMDE5ODYyCit2IC0wLjkzNzA5MCAyLjk0NzQ1NSAtMC4wMTk4NjIKK3YgLTEuMDQyMzQ1IDIuOTQ3NDU1IC0wLjAxOTg2MwordiAtMS4yMjI2OTAgMi45NDc0NTUgLTAuMDE5ODYzCit2IC0xLjM1MzEyMSAyLjkyMDg3MSAtMC4wMTk4NjQKK3YgLTEuMzYwOTk2IDIuOTM5NjgzIC0wLjAyMTg3MQordiAtMS40NzE5MTkgMi44NjI0NjUgLTAuMDE5ODY0Cit2IC0xLjU0NzE1MiAyLjc1MDg3OSAtMC4wMTk4NjUKK3YgLTEuNTc0NzkwIDIuNjE0NzA0IC0wLjAxOTg2NQordiAtMS41NzQ3OTAgMi40MTUwNDcgLTAuMDE5ODY1Cit2IC0xLjIyNDY5MiAyLjk2ODE4NiAtMC4wMjE4NzAKK3YgLTEuMDQyMzQ1IDIuOTY2MjE2IC0wLjAxOTg2MwordiAtMC42OTk3ODAgMi45NjYyMTYgLTAuMDE5ODYyCit2IC0wLjM2OTQyOCAyLjk2NjIxNiAtMC4wMTk4NjAKK3YgLTAuODM4OTQ2IDIuOTY2MjE2IC0wLjAxOTg2MgordiAtMC45MzcwOTAgMi45NjgxODYgLTAuMDIxODY5Cit2IC0xLjIyNDY5MiAyLjk2ODE4NiAtMC4wMjQxNjcKK3YgLTEuMzYwOTk2IDIuOTM5NjgzIC0wLjAyNDE2NwordiAtMS40NzMyMzcgMi44NjM5NzYgLTAuMDI0MTY4Cit2IC0xLjU0OTAwMyAyLjc1MTY1NSAtMC4wMjQxNjgKK3YgLTEuNTc2NzU4IDIuNjE0OTAyIC0wLjAyNDE2OAordiAtMS41NzY3NTkgMi40MTUwNDcgLTAuMDI0MTY4Cit2IC0xLjA0MjM0NSAyLjk2ODE4NiAtMC4wMjQxNjYKK3YgLTAuNjk5NzgwIDIuOTY4MTg2IC0wLjAyNDE2NQordiAtMC4zNjk0MjggMi45NjgxODYgLTAuMDI0MTYzCit2IC0wLjgzODk0NyAyLjk2ODE4NiAtMC4wMjQxNjUKK3YgLTAuOTM3MDkwIDIuOTY4MTg2IC0wLjAyNDE2NQordiAtMS41NTY3NTkgMi4xNTYxMTYgLTAuMDE5ODY1Cit2IC0xLjU3NDc5MCAyLjE1NjExNiAtMC4wMTk4NjUKK3YgLTEuNTc2NzU5IDIuMTU2MTE2IC0wLjAyMTg3MgordiAtMS41NzY3NTkgMi4xNTYxMTYgLTAuMDI0MTY4Cit2IC0xLjU3Njc1NCAyLjE1NjExNiAtMC4wNzA4ODgKK3YgLTEuNTc2NzU4IDIuMTU2MTE2IC0wLjA3Njc2NQordiAtMS41MzY3MDcgMi4xNTYxMTYgLTAuMTE3NDEzCit2IC0xLjQ5NTc0NiAyLjE1NjExNiAtMC4xMzgyODcKK3YgLTEuNDUxMTk3IDIuMTU2MTE2IC0wLjE0NzM1NQordiAtMS40MDExOTcgMi4xNTYxMTYgLTAuMTQ3MzU1Cit2IC0xLjI3ODg2NyAyLjE1NjExNiAtMC4xNDczNTQKK3YgLTEuMjAzNzQwIDIuMTU2MTE2IC0wLjE0NzM1NAordiAtMC45Mzc0MTQgMi4xNTYxMTYgLTAuMTQ3MzUzCit2IC0wLjY5OTcwNyAyLjE1NjExNiAtMC4xNDczNTIKK3YgLTEuNTc2NzU4IDAuNjc3MDcxIC0wLjA3Njc2NQordiAtMS41NzY3NTkgMC42NzcwNzEgLTAuMDIxODcyCit2IC0xLjU3Njc1OCAwLjY3NzA3MSAtMC4wNzA4ODkKK3YgLTEuNDUxMTk3IDAuNjc3MDc1IC0wLjE0NzM1NQordiAtMS40MDExOTcgMC42NzcwNzUgLTAuMTQ3MzU1Cit2IC0xLjI3ODg2NyAwLjY3NzA3NSAtMC4xNDczNTUKK3YgLTEuMjAzODE4IDAuNjc3MDc1IC0wLjE0NzM1NAordiAtMS4wMjgyNzQgMC42NzcwNzUgLTAuMTQ3MzU0Cit2IC0xLjUzNjcwNyAwLjY3NzA3MSAtMC4xMTc0MTMKK3YgLTEuNDk1NzQ2IDAuNjc3MDcxIC0wLjEzODI4OAordiAtMC42OTk3MDcgMC42NzcwNzUgLTAuMTQ3MzUyCit2IC0wLjM3OTM3OSAwLjY3NzA3NSAtMC4xNDczNTEKK3YgLTAuODM4MTA2IDAuNjc3MDc1IC0wLjE0NzM1MwordiAtMC45Mzc0MTUgMC42NzcwNzUgLTAuMTQ3MzUzCit2IC0xLjU1Njc1OSAwLjY3NzA3MSAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIDAuNjc3MDcxIC0wLjAxOTg2NgordiAtMS41NzY3NTkgMC42NzcwNzEgLTAuMDI0MTY5Cit2IDEuMjUzNzM5IDIuNzUxNjkzIC0wLjA3Njc1NAordiAxLjI1MzczOSAyLjc1MTY5MyAtMC4wNzA4NzcKK3YgMS4xNzc5ODkgMi44NjM5ODEgLTAuMDcwODc3Cit2IDEuMTc3OTg5IDIuODYzOTgxIC0wLjA3Njc1NAordiAxLjI4MTUxNyAyLjYxNDE5NyAtMC4wNzY3NTQKK3YgMS4yODE1MTcgMi42MTQxOTcgLTAuMDcwODc3Cit2IDEuMDY1NzQ3IDIuOTM5NjgzIC0wLjA3MDg3OAordiAxLjA2NTc0NyAyLjkzOTY4MyAtMC4wNzY3NTQKK3YgMC45Mjk0NzAgMi45NjgxODYgLTAuMDcwODc4Cit2IDAuOTI5NDcxIDIuOTY4MTg2IC0wLjA3NjcwNwordiAwLjc0Nzc2MSAyLjk2ODIwNCAtMC4wNzEwMjEKK3YgMC42NDE4MDkgMi45NjgxODYgLTAuMDcwODc5Cit2IDAuNjQxODA5IDIuOTY4MTg2IC0wLjA3NjcwOAordiAwLjc0NzcyNCAyLjk2ODIwNCAtMC4wNzY2ODUKK3YgMS4xNDkxMzcgMi44MzQ3NzcgLTAuMTE3NDAyCit2IDEuMjE2MDY1IDIuNzM1OTIyIC0wLjExNzQwMgordiAxLjI0MTQyNiAyLjYxMDE4OCAtMC4xMTc0MDIKK3YgMC45MjU0NjEgMi45Mjc0MDMgLTAuMTE3NDAzCit2IDEuMDQ5OTc1IDIuOTAyMDA5IC0wLjExNzQwMwordiAxLjEwNjM0MiAyLjc5NDk2MCAtMC4xMzgyNzcKK3YgMS4xNjAxODcgMi43MTM5NzAgLTAuMTM4Mjc3Cit2IDEuMTgyMDIwIDIuNjAwMjkyIC0wLjEzODI3NwordiAwLjc0NzcyMyAyLjkyNzQwMyAtMC4xMTc1MTgKK3YgMC42NDE3NjIgMi45Mjc0MDMgLTAuMTE3NDA0Cit2IDAuNjQxNjkzIDIuODY3OTk4IC0wLjEzODI3OQordiAwLjc0NzcyOCAyLjg2Nzk5OCAtMC4xMzgyNzgKK3YgMC45MTk1MTUgMi44Njc5OTggLTAuMTM4Mjc4Cit2IDEuMDI2NTc5IDIuODQ2MTMyIC0wLjEzODI3NwordiAxLjI1MzczOCAyLjc1MTY5MyAtMC4wMjQxNTcKK3YgMS4xNzc5ODcgMi44NjM5ODEgLTAuMDI0MTU3Cit2IDEuMjgxNTE1IDIuNjE0MTk3IC0wLjAyNDE1NwordiAxLjA2NTc0NiAyLjkzOTY4MyAtMC4wMjQxNTgKK3YgMC45Mjk0NjkgMi45NjgxODYgLTAuMDI0MTU4Cit2IDAuNzQ3NzYxIDIuOTY4MTg2IC0wLjAyMTg2MwordiAwLjY0MTgwOCAyLjk2ODE4NiAtMC4wMjE4NjMKK3YgMC42NDE4MDggMi45NjgxODYgLTAuMDI0MTU5Cit2IDAuNzQ3NzYxIDIuOTY4MTg2IC0wLjAyNDE1OQordiAxLjI4MTUxNyAyLjQ2NTExMCAtMC4wNzA4NzcKK3YgMS4yODE1MTcgMi40NjUxMTAgLTAuMDc2NzU0Cit2IDEuMjQxNDI2IDIuNDYxMjk5IC0wLjExNzQwMgordiAxLjE4MjAyMSAyLjQ1NTY0OCAtMC4xMzgyNzcKK3YgMS4yODE1MTUgMi40NjUxMTAgLTAuMDIxODYxCit2IDEuMjgxNTE1IDIuNjE0MTk3IC0wLjAyMTg2MQordiAxLjI4MTUxNSAyLjQ2NTExMCAtMC4wMjQxNTcKK3YgMC45MTM1OTkgMi44MDg4ODIgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIDIuODA4ODgyIC0wLjE0NzM0NgordiAxLjA2NDY1NSAyLjc1MzgwNyAtMC4xNDczNDUKK3YgMS4xMDQ1ODAgMi42OTEwMDUgLTAuMTQ3MzQ1Cit2IDEuMTIyOTA0IDIuNTkwNDI0IC0wLjE0NzM0NQordiAxLjAwMzMwMSAyLjc5MDUyNSAtMC4xNDczNDUKK3YgMS4xMjI5MDQgMi40NTAwMjQgLTAuMTQ3MzQ1Cit2IDEuMDcyOTA0IDIuNTgxNDY4IC0wLjE0NzM0NQordiAxLjA3MjkwNCAyLjQ1MDAyNCAtMC4xNDczNDUKK3YgMS4wNTc1NDkgMi42Njk1NjMgLTAuMTQ3MzQ1Cit2IDEuMDIzMzc2IDIuNzE1MTQ2IC0wLjE0NzM0NQordiAwLjk4MzYxMyAyLjc0MzE5NSAtMC4xNDczNDUKK3YgMC45MDg1OTUgMi43NjUxODIgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIDIuNzY1MTgyIC0wLjE0NzM0NgordiAwLjY0MjE3OSAyLjgwODg4MiAtMC4xNDczNDcKK3YgMC42NDIxNzkgMi43NjUxODIgLTAuMTQ3MzQ3Cit2IDAuOTgzNjE1IDIuNTgxNDY4IC0wLjE0NzM0NQordiAwLjk4MzYxNSAyLjQ1MDAyNCAtMC4xNDczNDYKK3YgMC45MDg1OTUgMi41ODE0NjcgLTAuMTQ3MzQ2Cit2IDAuOTA4NTk1IDIuNDUwMDI0IC0wLjE0NzM0NgordiAwLjc0Nzc2MSAyLjU4MTQ2NyAtMC4xNDczNDYKK3YgMC43NDc3NjEgMi40NTAwMjQgLTAuMTQ3MzQ2Cit2IDAuNjQyMDU5IDIuNTgxNDY3IC0wLjE0NzM0NwordiAwLjk4MzYxNSAyLjY2NTY4MSAtMC4xNDczNDUKK3YgMC45MDg1OTUgMi42NjU2ODEgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIDIuNjY1NjgxIC0wLjE0NzM0NgordiAwLjY0MjE3OCAyLjY2NTY4MSAtMC4xNDczNDcKK3YgMC4wNzQxODYgMi45Mjc0MDMgLTAuMTE3NDA2Cit2IDAuMDc0MTkxIDIuOTY4MTg2IC0wLjA3NjcwOQordiAtMC4xNDc2MTIgMi44MDg4ODIgLTAuMTQ3MzUwCit2IDAuMDc0MTcyIDIuODA4ODgyIC0wLjE0NzM0OQordiAwLjA3NDE3OSAyLjg2Nzk5OCAtMC4xMzgyODEKK3YgLTAuMTQ3NjEyIDIuODY3OTk4IC0wLjEzODI4MgordiAwLjQwNDU0MyAyLjk2ODE4NiAtMC4wNzA4ODAKK3YgMC4wNzQxOTEgMi45NjgxODYgLTAuMDcwODgxCit2IDAuNDA0NTQzIDIuOTY4MTg2IC0wLjA3NjcwOQordiAwLjQwNDUyNCAyLjkyNzQwMyAtMC4xMTc0MDUKK3YgMC40MDQ0OTggMi44Njc5OTggLTAuMTM4MjgwCit2IDAuNDA0NTQyIDIuOTY4MTg2IC0wLjAyMTg2NAordiAwLjA3NDE5MSAyLjk2ODE4NiAtMC4wMjE4NjUKK3YgMC4wNzQxOTEgMi45NjgxODYgLTAuMDI0MTYxCit2IDAuNDA0NTQyIDIuOTY4MTg2IC0wLjAyNDE2MAordiAwLjQwNDQ3MSAyLjgwODg4MiAtMC4xNDczNDcKK3YgMC4wNzQxNzIgMi43NjUxODIgLTAuMTQ3MzQ5Cit2IDAuNDA0NDcxIDIuNzY1MTgyIC0wLjE0NzM0NwordiAwLjA3NDE3MiAyLjcxMTk2MCAtMC4xNDczNDkKK3YgMC40MDQ0NzAgMi42NjU2ODEgLTAuMTQ3MzQ4Cit2IDAuNTIyNjI5IDIuOTI3NDAzIC0wLjExNzQwNQordiAwLjUyMjY1NCAyLjk2ODE4NiAtMC4wNzY3MDgKK3YgMC41MjI0NDIgMi44MDg4ODIgLTAuMTQ3MzQ3Cit2IDAuNTIyNTkzIDIuODY3OTk4IC0wLjEzODI3OQordiAxLjI4MTUxNiAxLjkwNDEzMyAtMC4wNzA4NzcKK3YgMS4yODE1MTYgMS45MDQxMzMgLTAuMDc2NzU0Cit2IDEuMjQxNDI2IDEuOTA0MTMzIC0wLjExNzQwMgordiAxLjE4MjAyMCAxLjkwNDEzMyAtMC4xMzgyNzcKK3YgMS4yODE1MTUgMS45MDQxMzMgLTAuMDIxODYxCit2IDEuMjgxNTE1IDEuOTA0MTMzIC0wLjAyNDE1NwordiAxLjEyMjkwNCAxLjkwNDEzMyAtMC4xNDczNDUKK3YgMS4wNzI5MDQgMS45MDQxMzMgLTAuMTQ3MzQ1Cit2IDAuOTgzNjE1IDEuOTA0MTMzIC0wLjE0NzM0NgordiAwLjkwODU5NSAxLjkwNDEzMyAtMC4xNDczNDYKK3YgMC43NDc3NjEgMS45MDQxMzMgLTAuMTQ3MzQ3Cit2IDAuNjQyMTc4IDEuOTA0MTMzIC0wLjE0NzM0NwordiAxLjEyMjkwNCAwLjY3NzA3NSAtMC4xNDczNDUKK3YgMS4wNzI5MDQgMC42NzcwNzUgLTAuMTQ3MzQ1Cit2IDAuOTA4NTk1IDAuNjc3MDc1IC0wLjE0NzM0NgordiAwLjc0Nzc2MSAwLjY3NzA3NSAtMC4xNDczNDcKK3YgLTAuMTQ3NjEyIDIuOTY4MTg2IC0wLjAyNDE2MgordiAtMC4xNDc2MTIgMi43NjUxODIgLTAuMTQ3MzUwCit2IDAuMTk5NjYxIDIuNTA0MTU4IC0wLjE0NzM0OAordiAwLjIyMTE3OSAyLjUyMzUxMCAtMC4xNDczNDgKK3YgMC4wNTU1ODkgMi42MzYwMDkgLTAuMTQ3MzQ5Cit2IDAuMDQzMzk3IDIuNjA5NzY3IC0wLjE0NzM0OQordiAtMC4xNDc2MTIgMi43MTE5NjAgLTAuMTQ3MzUwCit2IDAuMDgwODIxIDAuNjc3MDc1IC0wLjE0NzM0OQordiAwLjQwNDQ4MSAwLjY3NzA3NSAtMC4xNDczNDgKK3YgMC4xNjc4OTcgMi4yODkzNzAgLTAuMTkzNDU0Cit2IDAuMTU5MjQzIDIuMjg1NzE2IC0wLjE5ODk0NgordiAwLjE4NDMyMyAyLjE1NjEyMSAtMC4xOTg5NDYKK3YgMC4xOTM2OTYgMi4xNTYxMTkgLTAuMTkzNDU0Cit2IDAuMTU5MTc1IDIuMDI2NTkzIC0wLjE5ODk0NgordiAwLjE2NzgyNyAyLjAyMjkzOCAtMC4xOTM0NTQKK3YgMC4xNDc2MjcgMi4yODA4MDkgLTAuMTk4OTQ2Cit2IDAuMDg3ODEzIDIuMzkxNTc0IC0wLjE5ODk0NwordiAwLjA3ODg5OSAyLjM4MjY1NyAtMC4xOTg5NDcKK3YgLTAuMDIyODk2IDEuODYwODYzIC0wLjE5ODk0NwordiAtMC4xNDc2MTIgMS44MzU3NjUgLTAuMTk4OTQ4Cit2IC0wLjE0NzYxMiAxLjgyMzE2MSAtMC4xOTg5NDgKK3YgLTAuMDE3OTkzIDEuODQ5MjU0IC0wLjE5ODk0NwordiAwLjA3ODg5OCAxLjkyOTYyOSAtMC4xOTg5NDcKK3YgMC4wODc4MTMgMS45MjA3MjAgLTAuMTk4OTQ3Cit2IDAuMTQ3NTU2IDIuMDMxNDk0IC0wLjE5ODk0NwordiAwLjA5NDQ1MiAyLjM5ODIxMyAtMC4xOTM0NTQKK3YgLTAuMDE0Mzk1IDIuNDcxNjE5IC0wLjE5MzQ1NQordiAtMC4wMTgwNDggMi40NjI5NjcgLTAuMTk4OTQ3Cit2IC0wLjE0NzYxMyAyLjQ5ODY3NCAtMC4xOTM0NTUKK3YgLTAuMTQ3NjEyIDIuNDg5MjgxIC0wLjE5ODk0NwordiAwLjM0MzM5MyAyLjE1NjExNyAtMC4xNDczNDgKK3YgMC4zNzIzMDggMi4xNTYxMTcgLTAuMTQ3MzQ4Cit2IDAuMzI5MDI5IDIuMzY1MjgzIC0wLjE0NzM0OAordiAwLjMwNDc3MCAyLjM0ODM5NyAtMC4xNDczNDgKK3YgMC4zMDQ3NjkgMS45NjYzNjIgLTAuMTQ3MzQ4Cit2IC0wLjE0NzYxMiAxLjY2NjM3MCAtMC4xNDczNTAKK3YgLTAuMTQ3NjEyIDEuNjM3NDUxIC0wLjE0NzM1MAordiAwLjA1NDE0MCAxLjY3ODEzMyAtMC4xNDczNDkKK3YgMC4wNDMzOTggMS43MDQ5OTEgLTAuMTQ3MzQ5Cit2IC0wLjE0NzYxMiAyLjY0ODM4NyAtMC4xNDczNTAKK3YgMC4wOTQ0NTIgMS45MTQwNzggLTAuMTkzNDU0Cit2IDAuMjA1Njg5IDEuODAyMjI4IC0wLjE0NzM0OQordiAtMC4wMTQzMzkgMS44NDA1OTggLTAuMTkzNDU1Cit2IC0wLjE0NzYxMyAxLjgxMzc2NyAtMC4xOTM0NTUKK3YgMC4yMjM1MTUgMS43ODE3OTUgLTAuMTQ3MzQ5Cit2IDAuMzI5OTUwIDEuOTUxNjUzIC0wLjE0NzM0OAordiAwLjQwNDQ3MCAyLjQ1MDAyNCAtMC4xNDczNDgKK3YgMC40MDM5NzggMi41ODE0NjcgLTAuMTQ3MzQ4Cit2IC0wLjE0NzYxMiAyLjY3NzMwMSAtMC4xNDczNTAKK3YgMC40MDQ0NzAgMS45MDQxMzMgLTAuMTQ3MzQ4Cit2IDAuNTIyNjUzIDIuOTY4MTg2IC0wLjA3MDg4MAordiAwLjUyMjY1MyAyLjk2ODE4NiAtMC4wMjE4NjMKK3YgMC41MjI2NTMgMi45NjgxODYgLTAuMDI0MTYwCit2IDAuNTIyNDQyIDIuNzY1MTgyIC0wLjE0NzM0NwordiAwLjUyMjE1NiAyLjU4MTQ2NyAtMC4xNDczNDcKK3YgMC41MjI0NDEgMi40NTAwMjQgLTAuMTQ3MzQ3Cit2IDAuNTIyNDQxIDIuNjY1NjgxIC0wLjE0NzM0NwordiAwLjUyMjQ0MSAxLjkwNDEzMyAtMC4xNDczNDcKK3YgLTAuMTQ3NjEyIDIuNDc2NTYyIC0wLjE5ODk0NwordiAtMC4xNDc2MTIgMi40NzQyMDQgLTAuMTk2NjY4Cit2IC0wLjAyMzg3MCAyLjQ0OTE3OCAtMC4xOTY2NjgKK3YgLTAuMDIyOTU0IDIuNDUxMzQ3IC0wLjE5ODk0NwordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTY2NjgKK3YgMC4xNDU0NTggMi4yNzk4OTIgLTAuMTk2NjY3Cit2IDAuMTcwNDg4IDIuMTU2MTE3IC0wLjE5NjY2NwordiAwLjE3Mjg0NCAyLjE1NjExNyAtMC4xOTg5NDYKK3YgMC4xNDUzODYgMi4wMzI0MTAgLTAuMTk2NjY4Cit2IDAuMDc3MjM1IDEuOTMxMjkzIC0wLjE5NjY2OAordiAtMC4wMjM4MTIgMS44NjMwMzIgLTAuMTk2NjY4Cit2IC0wLjE0NzYxMiAxLjgzODEyMSAtMC4xOTY2NjkKK3YgMS4xNzY1NjkgMi44NjI1NjMgLTAuMDE5ODU0Cit2IDEuMjUxODg2IDIuNzUwOTE4IC0wLjAxOTg1NAordiAxLjIzNDkyNiAyLjc0MzgxOCAtMC4wMTk4NTQKK3YgMS4xNjM3MTggMi44NDk1NzQgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDIuNjE0MDAwIC0wLjAxOTg1NAordiAxLjI2MTQ3NyAyLjYxMjE5NSAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMi40NjUxMTAgLTAuMDE5ODU0Cit2IDEuMjYxNDc3IDIuNDY1MTEwIC0wLjAxOTg1NAordiAxLjI3OTU0NyAxLjkwNDEzMyAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgMS45MDQxMzMgLTAuMDE5ODU0Cit2IC0wLjE0NzYxMiAyLjk2NjIxNiAtMC4wMTk4NTkKK3YgMC4wNzQxOTEgMi45NjYyMTYgLTAuMDE5ODU4Cit2IDAuMDc0MTkxIDIuOTQ3NDU1IC0wLjAxOTg1OAordiAtMC4xNDc2MTIgMi45NDc0NTUgLTAuMDE5ODU5Cit2IDAuNDA0NTQyIDIuOTY2MjE2IC0wLjAxOTg1NwordiAwLjQwNDU0MiAyLjk0NzQ1NSAtMC4wMTk4NTcKK3YgMC41MjI2NTMgMi45NjYyMTYgLTAuMDE5ODU3Cit2IDAuNTIyNjUzIDIuOTQ3NDU1IC0wLjAxOTg1NwordiAwLjY0MTgwOCAyLjk2NjIxNiAtMC4wMTk4NTYKK3YgMC42NDE4MDggMi45NDc0NTUgLTAuMDE5ODU2Cit2IDAuNzQ3NzYxIDIuOTY2MjE2IC0wLjAxOTg1NgordiAwLjc0Nzc2MSAyLjk0NzQ1NSAtMC4wMTk4NTYKK3YgMC45MjkyNzIgMi45NjYyMTYgLTAuMDE5ODU1Cit2IDAuOTI3NDY3IDIuOTQ3NDU1IC0wLjAxOTg1NQordiAxLjA2NDk3MCAyLjkzNzgzMSAtMC4wMTk4NTUKK3YgMS4wNTc4NzAgMi45MjA4NzEgLTAuMDE5ODU1Cit2IDEuMTc3OTg3IDIuODYzOTgxIC0wLjAyMTg2MQordiAxLjI1MzczOCAyLjc1MTY5MyAtMC4wMjE4NjEKK3YgMS4wNjU3NDYgMi45Mzk2ODMgLTAuMDIxODYyCit2IDAuOTI5NDY5IDIuOTY4MTg2IC0wLjAyMTg2MgordiAtMC4xNDc2MTIgMC42NzcwNzUgLTAuMTQ3MzUwCit2IDAuNTIyNDQ1IDAuNjc3MDc1IC0wLjE0NzM0OAordiAxLjI2MTQ3NyAyLjA1OTAxOCAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgMi4xNTYxMTYgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMTU2MTE2IC0wLjAxOTg1NAordiAxLjI3OTU0NiAyLjA1OTAxOCAtMC4wMTk4NTQKK3YgMS4yODE1MTUgMi4xNTYxMTYgLTAuMDIxODYxCit2IDEuMjgxNTE1IDIuMDU5MDE4IC0wLjAyMTg2MQordiAxLjI4MTUxNSAyLjE1NjExNiAtMC4wMjQxNTcKK3YgMS4yODE1MTUgMi4wNTkwMTggLTAuMDI0MTU3Cit2IDEuMjgxNTE3IDIuMTU2MTE2IC0wLjA3MDg3NwordiAxLjI4MTUxNyAyLjA1OTAxOCAtMC4wNzA4NzcKK3YgMS4yODE1MTYgMi4xNTYxMTYgLTAuMDc2NzU0Cit2IDEuMjgxNTE3IDIuMDU5MDE4IC0wLjA3Njc1NAordiAxLjI0MTQyNiAyLjE1NjExNiAtMC4xMTc0MDIKK3YgMS4yNDE0MjYgMi4wNTk2NjYgLTAuMTE3NDAyCit2IDEuMTgyMDIxIDIuMTU2MTE2IC0wLjEzODI3NwordiAxLjE4MjAyMSAyLjA1OTM3MyAtMC4xMzgyNzcKK3YgMS4wNzI5MDQgMi4xNTYxMTYgLTAuMTQ3MzQ1Cit2IDEuMDcyOTAzIDIuMDU5MjAyIC0wLjE0NzM0NQordiAwLjk4MzYxNSAyLjE1NjExNiAtMC4xNDczNDYKK3YgMC45ODM2MTQgMi4wNTkyMDIgLTAuMTQ3MzQ2Cit2IDAuOTA5MzkyIDIuMTU2MTE2IC0wLjE0NzM0NgordiAwLjkwOTM5MiAyLjA1OTIwMiAtMC4xNDczNDYKK3YgMC44MzQ4NTkgMi4xNTYxMTYgLTAuMTQ3MzQ2Cit2IDAuODM0ODY5IDIuMDU5NDI5IC0wLjE0NzM0NgordiAwLjY2MDM4MSAyLjE1NjExNiAtMC4xNDczNDcKK3YgMC42NDIxNzggMi4xNTYxMTYgLTAuMTQ3MzQ3Cit2IDAuNjQyMTc4IDIuMDU5NDMyIC0wLjE0NzM0NwordiAwLjY2MDM5OSAyLjA1OTQyOSAtMC4xNDczNDcKK3YgMC40MDQ0NzAgMi4zMjU0NTkgLTAuMTQ3MzQ4Cit2IDEuMjYxNDc3IDIuMjUzODMwIC0wLjAxOTg1NAordiAxLjI2MTQ3NyAyLjMzMzg4OSAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMi4zMzM4ODkgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMjUzODMwIC0wLjAxOTg1NAordiAxLjI3OTU0NyAxLjk4MDczOSAtMC4wMTk4NTQKK3YgMS4yNjE0NzcgMS45ODA3MzkgLTAuMDE5ODU0Cit2IDEuMjgxNTE1IDIuMzMzODg5IC0wLjAyMTg2MQordiAxLjI4MTUxNSAyLjI1MzgzMCAtMC4wMjE4NjEKK3YgMS4yODE1MTUgMS45ODA3NDAgLTAuMDIxODYxCit2IDEuMjgxNTE1IDIuMzMzODg5IC0wLjAyNDE1NwordiAxLjI4MTUxNSAyLjI1MzgzMCAtMC4wMjQxNTcKK3YgMS4yODE1MTUgMS45ODA3NDAgLTAuMDI0MTU3Cit2IDEuMjgxNTE3IDIuMzMzODg5IC0wLjA3MDg3NwordiAxLjI4MTUxNiAyLjI1MzgzMCAtMC4wNzA4NzcKK3YgMS4yODE1MTYgMS45ODA3NDAgLTAuMDcwODc3Cit2IDEuMjgxNTE3IDIuMzMzODg5IC0wLjA3Njc1NAordiAxLjI4MTUxNiAyLjI1MzgzMCAtMC4wNzY3NTQKK3YgMS4yODE1MTYgMS45ODA3NDAgLTAuMDc2NzU0Cit2IDEuMjQxNDI2IDIuMzMzNTkxIC0wLjExNzQwMgordiAxLjI0MTQyNiAyLjI1Mzc4OCAtMC4xMTc0MDIKK3YgMS4yNDE0MjYgMS45ODA2MTggLTAuMTE3NDAyCit2IDEuMTgyMDIxIDIuMzMzMTQ5IC0wLjEzODI3NwordiAxLjE4MjAyMSAyLjI1MzcyNyAtMC4xMzgyNzcKK3YgMS4xODIwMjEgMS45ODA0MzggLTAuMTM4Mjc3Cit2IDEuMDcyOTA0IDIuMzMyNzA5IC0wLjE0NzM0NQordiAxLjA3MjkwMyAyLjI1MzY2NyAtMC4xNDczNDUKK3YgMS4wNzI5MDQgMS45ODAyNTggLTAuMTQ3MzQ1Cit2IDAuOTgzNjE0IDIuMzMyNzA5IC0wLjE0NzM0NgordiAwLjk4MzYxNCAyLjI1MzY2NyAtMC4xNDczNDYKK3YgMC45ODM2MTQgMS45ODAyNTggLTAuMTQ3MzQ2Cit2IDAuOTA5MzkyIDIuMzMyNzA5IC0wLjE0NzM0NgordiAwLjkwOTM5MiAyLjI1MzY2NyAtMC4xNDczNDYKK3YgMC45MDkzOTIgMS45ODAyNTggLTAuMTQ3MzQ2Cit2IDAuODM0ODQ5IDIuMjUyMjY0IC0wLjE0NzM0NgordiAwLjY2MDM2MiAyLjI1MjI2NCAtMC4xNDczNDcKK3YgMC42NDIxNzggMi4yNTIyNDcgLTAuMTQ3MzQ3Cit2IDAuNDA0NDcwIDIuMTU2MTE2IC0wLjE0NzM0OAordiAwLjU5ODU3MyAyLjI5NTE4NyAtMC4xNDczNDcKK3YgMC42MDE1NzMgMi4yOTk0ODMgLTAuMTQ3MzQ3Cit2IDAuNTY5MjQ3IDIuMzI4NjE1IC0wLjE0NzM0NwordiAwLjU2NzAzMiAyLjMyNDUwNSAtMC4xNDczNDcKK3YgMC40NDU5NjcgMi4yOTQ3MTkgLTAuMTQ3MzQ4Cit2IDAuNDQyNzI0IDIuMjk3NDg4IC0wLjE0NzM0OAordiAwLjQyODI2NSAyLjI1MjIyNCAtMC4xNDczNDgKK3YgMC40MzM2NzEgMi4yNTIyMDYgLTAuMTQ3MzQ4Cit2IDAuNDQ1OTA4IDIuMDE3MjY2IC0wLjE0NzM0OAordiAwLjQ0MTk5MyAyLjAxNDY4OCAtMC4xNDczNDgKK3YgMC40NzM2ODUgMS45ODM2MzUgLTAuMTQ3MzQ3Cit2IDAuNDc3NDE1IDEuOTg3NTQ0IC0wLjE0NzM0NwordiAwLjU5ODU1NSAyLjAxNjU3NyAtMC4xNDczNDcKK3YgMC42MDEzMDAgMi4wMTM4MjAgLTAuMTQ3MzQ3Cit2IDAuNjE2NTYyIDIuMDU5NDM0IC0wLjE0NzM0NwordiAwLjYxMTEzMiAyLjA1OTQzNSAtMC4xNDczNDcKK3YgMC42MTY1NTggMi4xNTYxMTYgLTAuMTQ3MzQ3Cit2IDAuNjE2NTU1IDIuMjUyMjI3IC0wLjE0NzM0NwordiAwLjQyODI2NCAyLjE1NjExNiAtMC4xNDczNDgKK3YgMC40MzM2ODEgMi4xNTYxMTYgLTAuMTQ3MzQ4Cit2IDAuNDMzNjcwIDIuMDU5Mzg0IC0wLjE0NzM0OAordiAwLjQyODI2NCAyLjA1OTM3MCAtMC4xNDczNDgKK3YgMC40MDQ0NzAgMi4wMDQwNTIgLTAuMTQ3MzQ4Cit2IDAuNDc3NTgxIDIuMzI0Mjk2IC0wLjE0NzM0NwordiAwLjQ3NDU0OCAyLjMyODMxMSAtMC4xNDczNDcKK3YgMC42MTExMzIgMi4yNTIyMTggLTAuMTQ3MzQ3Cit2IDAuNTY3MTE0IDEuOTg3MzM2IC0wLjE0NzM0NwordiAwLjU2OTg3MSAxLjk4MzI4OCAtMC4xNDczNDcKK3YgMC41MjI0NDEgMi4zMzU5MDkgLTAuMTQ3MzQ3Cit2IDAuNTIyNDQxIDIuMzQwNjA2IC0wLjE0NzM0NwordiAwLjUyMjQ0MSAxLjk3MTExNCAtMC4xNDczNDcKK3YgMC41MjI0NDEgMS45NzU4MTMgLTAuMTQ3MzQ3Cit2IDAuNjQyMTc4IDIuMzE1OTI0IC0wLjE0NzM0NwordiAwLjY0MjE3OCAyLjQ1MDAyNCAtMC4xNDczNDcKK3YgMC42NDIxNzggMi4wMDgzNjggLTAuMTQ3MzQ3Cit2IDAuNjQyMTc4IDEuOTYxMjM0IC0wLjE0NzM0NwordiAwLjYxMTA5NCAyLjE1NjExNiAtMC4xNDczNDcKK3YgMC44MjAxMjAgMi4wMTI5ODYgLTAuMTQ3MzQ2Cit2IDAuODE5OTk3IDIuMzAyMzMxIC0wLjE0NzM0NgordiAwLjgyOTQyNSAyLjI1MjI2NCAtMC4xNDczNDYKK3YgMC44Mjk0MDEgMi4xNTYxMTYgLTAuMTQ3MzQ2Cit2IDAuODI5NDQwIDIuMDU5NDI5IC0wLjE0NzM0NgordiAwLjc0Nzc2MSAxLjk3MTA1MSAtMC4xNDczNDYKK3YgMC43OTE1MDYgMS45ODI5MDIgLTAuMTQ3MzQ2Cit2IDAuNzg4NzQ5IDEuOTg2OTUwIC0wLjE0NzM0NgordiAwLjc0Nzc2MSAxLjk3NTc1MCAtMC4xNDczNDYKK3YgMC42NzI3NzIgMi4wMTM0MjEgLTAuMTQ3MzQ3Cit2IDAuNjc2Njg4IDIuMDE2MDAwIC0wLjE0NzM0NwordiAwLjY2NTgwOCAyLjA1OTQyOSAtMC4xNDczNDcKK3YgMC42NjU4MjEgMi4xNTYxMTYgLTAuMTQ3MzQ3Cit2IDAuNjY1NzY3IDIuMjUyMjY0IC0wLjE0NzM0NwordiAwLjcwMjkzNSAyLjMzMDU0OCAtMC4xNDczNDYKK3YgMC43MDU5NjggMi4zMjY1MzQgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIDIuMzM3NzkxIC0wLjE0NzM0NgordiAwLjc0Nzc2MSAyLjM0MjQ4OCAtMC4xNDczNDYKK3YgMC43ODgzNjMgMi4zMjYxOTYgLTAuMTQ3MzQ2Cit2IDAuNzkwNTc3IDIuMzMwMzA2IC0wLjE0NzM0NgordiAwLjgxNzI4MCAyLjI5ODAwMSAtMC4xNDczNDYKK3YgMC44MTc0OTMgMi4wMTU4OTIgLTAuMTQ3MzQ2Cit2IDAuNzA1NzU4IDEuOTg3MTIzIC0wLjE0NzM0NwordiAwLjcwMjAyOCAxLjk4MzIxNCAtMC4xNDczNDcKK3YgMC42NzM1NzMgMi4zMDA1MjggLTAuMTQ3MzQ3Cit2IDAuNjc2ODE3IDIuMjk3NzU3IC0wLjE0NzM0NwordiAwLjU5NjI0MyAyLjI5MjczMyAtMC4xNDUzNzgKK3YgMC42MDc5NDQgMi4yNTIwNDkgLTAuMTQ1Mzc4Cit2IDAuNTY1NDUzIDIuMzIxNjYxIC0wLjE0NTM3OQordiAwLjUyMjQzNCAyLjMzMjY0MSAtMC4xNDUzNzkKK3YgMC40Nzk0MjYgMi4zMjE2MDAgLTAuMTQ1Mzc5Cit2IDAuNDQ4NjA0IDIuMjkyNzU4IC0wLjE0NTM3OQordiAwLjQzNjg1MyAyLjI1MjA0NiAtMC4xNDUzNzkKK3YgMC40MzY4MzEgMi4xNTYxMTYgLTAuMTQ1Mzc5Cit2IDAuNDM2ODUzIDIuMDU5NTQ0IC0wLjE0NTM3OQordiAwLjQ0ODY3NSAyLjAxOTAwNCAtMC4xNDUzNzkKK3YgMC40Nzk0NzEgMS45OTAxMTkgLTAuMTQ1Mzc5Cit2IDAuNTIyNDQxIDEuOTc5MDc1IC0wLjE0NTM3OQordiAwLjU2NTM0NyAxLjk5MDA4MyAtMC4xNDUzNzkKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTQ1Mzc5Cit2IDAuNjA3OTQ0IDIuMDU5NjAxIC0wLjE0NTM3OAordiAwLjYwNzk0NCAyLjE1NjExNiAtMC4xNDUzNzgKK3YgMC43NDc3NjEgMi4zMzQ1MjMgLTAuMTQ1Mzc4Cit2IDAuNzg2Nzg0IDIuMzIzMzUzIC0wLjE0NTM3OAordiAwLjcwNzgxNCAyLjMyMzgzNyAtMC4xNDUzNzgKK3YgMC42Nzk0NTMgMi4yOTU3OTYgLTAuMTQ1Mzc4Cit2IDAuNjY4OTUwIDIuMjUyMTEwIC0wLjE0NTM3OAordiAwLjY2ODk3MCAyLjE1NjExNiAtMC4xNDUzNzgKK3YgMC42Njg5OTAgMi4wNTk1ODMgLTAuMTQ1Mzc4Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjE0NTM3OAordiAwLjcwNzgxNCAxLjk4OTY5OCAtMC4xNDUzNzgKK3YgMC43NDc3NjEgMS45NzkwMTIgLTAuMTQ1Mzc4Cit2IDAuNzg2OTgyIDEuOTg5Njk3IC0wLjE0NTM3OAordiAwLjgxNTAxMiAyLjAxODA4OCAtMC4xNDUzNzgKK3YgMC44MjYyNTEgMi4wNTk1OTUgLTAuMTQ1Mzc4Cit2IDAuODI2MjUxIDIuMTU2MTE2IC0wLjE0NTM3OAordiAwLjgyNjIzNyAyLjI1MjA5OSAtMC4xNDUzNzgKK3YgMC44MTUwMTQgMi4yOTU0NDAgLTAuMTQ1Mzc4Cit2IC0wLjgzODEwNSAyLjE1NjExNiAtMC4xNDczNTIKK3YgLTEuMDI5NDkxIDIuMTU2MTE2IC0wLjE0NzM1MwordiAwLjU5NjI0MyAyLjI5MjczMyAtMC4xMzkzNDkKK3YgMC42MDc5NDQgMi4yNTIwNDkgLTAuMTM5MzQ5Cit2IDAuNTY1NDUzIDIuMzIxNjYxIC0wLjEzOTM0OQordiAwLjUyMjQzNCAyLjMzMjY0MSAtMC4xMzkzNDkKK3YgMC40Nzk0MjYgMi4zMjE2MDAgLTAuMTM5MzUwCit2IDAuNDQ4NjA0IDIuMjkyNzU4IC0wLjEzOTM1MAordiAwLjQzNjg1MyAyLjI1MjA0NiAtMC4xMzkzNTAKK3YgMC40MzY4MzEgMi4xNTYxMTYgLTAuMTM5MzUwCit2IDAuNDM2ODUzIDIuMDU5NTQ0IC0wLjEzOTM1MAordiAwLjQ0ODY3NSAyLjAxOTAwNCAtMC4xMzkzNTAKK3YgMC40Nzk0NzEgMS45OTAxMTkgLTAuMTM5MzUwCit2IDAuNTIyNDQxIDEuOTc5MDc1IC0wLjEzOTM0OQordiAwLjU2NTM0NyAxLjk5MDA4MyAtMC4xMzkzNDkKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTM5MzQ5Cit2IDAuNjA3OTQ0IDIuMDU5NjAxIC0wLjEzOTM0OQordiAwLjYwNzk0NCAyLjE1NjExNiAtMC4xMzkzNDkKK3YgMC43NDc3MjggMi4zMzQ1MjMgLTAuMTMzMjY0Cit2IDAuNzg2Nzg0IDIuMzIzMzUzIC0wLjEzMzI2NAordiAwLjcwNzgxNCAyLjMyMzgzNyAtMC4xMzMyNjQKK3YgMC42Nzk0NTMgMi4yOTU3OTYgLTAuMTMzMjY0Cit2IDAuNjY4OTUwIDIuMjUyMTEwIC0wLjEzMzI2NAordiAwLjY2ODk3MCAyLjE1NjExNiAtMC4xMzMyNjQKK3YgMC42Njg5OTAgMi4wNTk1ODMgLTAuMTMzMjY0Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjEzMzI2NAordiAwLjcwNzgxNCAxLjk4OTY5OCAtMC4xMzMyNjQKK3YgMC43NDc3MjggMS45NzkwMTIgLTAuMTMzMjY0Cit2IDAuNzg2OTgyIDEuOTg5Njk3IC0wLjEzMzI2NAordiAwLjgxNTAxMiAyLjAxODA4OCAtMC4xMzMyNjQKK3YgMC44MjYyNTEgMi4wNTk1OTUgLTAuMTMzMjYzCit2IDAuODI2MjUxIDIuMTU2MTE2IC0wLjEzMzI2MwordiAwLjgyNjIzNyAyLjI1MjA5OSAtMC4xMzMyNjMKK3YgMC44MTUwMTQgMi4yOTU0NDAgLTAuMTMzMjYzCit2IDAuNTk2MjQzIDIuMjkyNzMzIC0wLjE0NDY1NQordiAwLjYwNzk0NCAyLjI1MjA0OSAtMC4xNDQ2NTUKK3YgMC41NjU0NTMgMi4zMjE2NjEgLTAuMTQ0NjU1Cit2IDAuNTIyNDM0IDIuMzMyNjQxIC0wLjE0NDY1NQordiAwLjQ3OTQyNiAyLjMyMTYwMCAtMC4xNDQ2NTUKK3YgMC40NDg2MDQgMi4yOTI3NTggLTAuMTQ0NjU2Cit2IDAuNDM2ODUzIDIuMjUyMDQ2IC0wLjE0NDY1NQordiAwLjQzNjgzMSAyLjE1NjExNiAtMC4xNDQ2NTYKK3YgMC40MzY4NTMgMi4wNTk1NDQgLTAuMTQ0NjU2Cit2IDAuNDQ4Njc1IDIuMDE5MDA0IC0wLjE0NDY1NgordiAwLjQ3OTQ3MSAxLjk5MDExOSAtMC4xNDQ2NTUKK3YgMC41MjI0NDEgMS45NzkwNzUgLTAuMTQ0NjU1Cit2IDAuNTY1MzQ3IDEuOTkwMDgzIC0wLjE0NDY1NQordiAwLjU5NjE5MiAyLjAxODkyMiAtMC4xNDQ2NTUKK3YgMC42MDc5NDQgMi4wNTk2MDEgLTAuMTQ0NjU1Cit2IDAuNjA3OTQ0IDIuMTU2MTE2IC0wLjE0NDY1NQordiAwLjc0Nzc2MSAyLjMzNDUyMyAtMC4xNDQ2NTQKK3YgMC43ODY3ODQgMi4zMjMzNTMgLTAuMTQ0NjU0Cit2IDAuNzA3ODE0IDIuMzIzODM3IC0wLjE0NDY1NAordiAwLjY3OTQ1MyAyLjI5NTc5NiAtMC4xNDQ2NTUKK3YgMC42Njg5NTAgMi4yNTIxMTAgLTAuMTQ0NjU1Cit2IDAuNjY4OTcwIDIuMTU2MTE2IC0wLjE0NDY1NQordiAwLjY2ODk5MCAyLjA1OTU4MyAtMC4xNDQ2NTUKK3YgMC42Nzk0NTQgMi4wMTc3MzggLTAuMTQ0NjU1Cit2IDAuNzA3ODE0IDEuOTg5Njk4IC0wLjE0NDY1NQordiAwLjc0Nzc2MSAxLjk3OTAxMiAtMC4xNDQ2NTQKK3YgMC43ODY5ODIgMS45ODk2OTcgLTAuMTQ0NjU0Cit2IDAuODE1MDEyIDIuMDE4MDg4IC0wLjE0NDY1NAordiAwLjgyNjI1MSAyLjA1OTU5NSAtMC4xNDQ2NTQKK3YgMC44MjYyNTEgMi4xNTYxMTYgLTAuMTQ0NjU0Cit2IDAuODI2MjM3IDIuMjUyMDk5IC0wLjE0NDY1NAordiAwLjgxNTAxNCAyLjI5NTQ0MCAtMC4xNDQ2NTQKK3YgMC43NjAwMTMgMi4xNTYxMTYgLTAuMTU5MDYyCit2IDAuNzQ3NzYxIDIuMTU2MTE2IC0wLjE1OTA2MgordiAwLjczNDQwNSAyLjE1NjExNiAtMC4xNTkwNjIKK3YgMC43NTk5NjcgMi4yNTAyNjcgLTAuMTU5MDYyCit2IDAuNzQ3NzYxIDIuMjUwMzkwIC0wLjE1OTA2MgordiAwLjczNDQwNSAyLjI1MDUxMiAtMC4xNTkwNjIKK3YgMC43NjAwNjAgMi4wNTk2MzEgLTAuMTU5MDYyCit2IDAuNzQ3NzYxIDIuMDU5NTA1IC0wLjE1OTA2MgordiAwLjczNDQwNSAyLjA1OTM3NyAtMC4xNTkwNjIKK3YgMC43NDc3NzEgMi4zMjUyODcgLTAuMTQ5Mzk1Cit2IDAuNzgyNTg3IDIuMzE1NTMzIC0wLjE0OTM5NQordiAwLjgwNzg1MiAyLjI5MTE2OSAtMC4xNDkzOTUKK3YgMC44MTgyNzkgMi4yNTE0NjggLTAuMTQ5Mzk1Cit2IDAuODE4MjkzIDIuMTU2MTE0IC0wLjE0OTM5NQordiAwLjgxODI5MyAyLjA2MDIxNCAtMC4xNDkzOTUKK3YgMC44MDc4MzEgMi4wMjIzMDAgLTAuMTQ5Mzk1Cit2IDAuNzgyNzc2IDEuOTk3NTQ5IC0wLjE0OTM5NQordiAwLjc0Nzc3MSAxLjk4ODIzNiAtMC4xNDkzOTUKK3YgMC43MTE5NDggMS45OTc1NjkgLTAuMTQ5Mzk1Cit2IDAuNjg2NjgzIDIuMDIxOTMyIC0wLjE0OTM5NQordiAwLjY3Njk1OCAyLjA2MDA5NiAtMC4xNDkzOTUKK3YgMC42NzY5MzggMi4xNTYxMTQgLTAuMTQ5Mzk1Cit2IDAuNjc2OTE3IDIuMjUxNTg0IC0wLjE0OTM5NQordiAwLjY4NjY3NyAyLjI5MTYwNCAtMC4xNDkzOTUKK3YgMC43MTE5NDggMi4zMTU5NzMgLTAuMTQ5Mzk1Cit2IDAuNzQ3NzYxIDIuMjkxMzY4IC0wLjE1ODI4MAordiAwLjczMDMxOSAyLjI4NjYzNiAtMC4xNTgyODAKK3YgMC43NjQwNTggMi4yODYzNTUgLTAuMTU4MjgwCit2IDAuNzc2MTc3IDIuMjc0MzIzIC0wLjE1ODI4MAordiAwLjc4MjYxNyAyLjI0OTUwOSAtMC4xNTgyODAKK3YgMC43ODI2MzAgMi4xNTYxMTYgLTAuMTU4MjgwCit2IDAuNzgyNjMxIDIuMDYwOTE5IC0wLjE1ODI4MAordiAwLjc3NjA5NSAyLjAzODkyNSAtMC4xNTgyODAKK3YgMC43NjQxOTYgMi4wMjY4MDEgLTAuMTU4MjgwCit2IDAuNzQ3NzYxIDIuMDIyMjY4IC0wLjE1ODI4MAordiAwLjczMDMxOCAyLjAyNjg3OSAtMC4xNTgyODAKK3YgMC43MTg2MzcgMi4wMzg0OTkgLTAuMTU4MjgwCit2IDAuNzEyNjE5IDIuMDYwNDM5IC0wLjE1ODI4MAordiAwLjcxMjU5OSAyLjE1NjExNiAtMC4xNTgyODAKK3YgMC43MTI1ODAgMi4yNDk5NzEgLTAuMTU4MjgwCit2IDAuNzE4NjE1IDIuMjc1MDE1IC0wLjE1ODI4MAordiAwLjc0Nzc4NyAyLjMwOTI5MSAtMC4xNTQ0OTkKK3YgMC43MTkzNzMgMi4zMDIyMzAgLTAuMTU0NDk5Cit2IDAuNzc1MDQ1IDIuMzAxODY3IC0wLjE1NDQ5OQordiAwLjc5NDk4NSAyLjI4MzU3MiAtMC4xNTQ0OTkKK3YgMC44MDM5OTkgMi4yNTExMjYgLTAuMTU0NDk5Cit2IDAuODA0MDE0IDIuMTU2MTE0IC0wLjE1NDQ5OQordiAwLjgwNDAxNSAyLjA1OTkxNSAtMC4xNTQ0OTkKK3YgMC43OTQ5MzAgMi4wMjk3OTIgLTAuMTU0NDk5Cit2IDAuNzc1MjIwIDIuMDExMjU2IC0wLjE1NDQ5OQordiAwLjc0Nzc4NyAyLjAwNDI5NSAtMC4xNTQ0OTkKK3YgMC43MTkzNzIgMi4wMTEzMDUgLTAuMTU0NDk5Cit2IDAuNjk5NjcxIDIuMDI5MzkxIC0wLjE1NDQ5OQordiAwLjY5MTI1OCAyLjA1OTYxMyAtMC4xNTQ0OTkKK3YgMC42OTEyMzcgMi4xNTYxMTQgLTAuMTU0NDk5Cit2IDAuNjkxMjE1IDIuMjUxNDE5IC0wLjE1NDQ5OQordiAwLjY5OTY1NyAyLjI4NDE0MCAtMC4xNTQ0OTkKK3YgMC43NDc3MzMgMi4zMzU5MzcgLTAuMTQxMTE1Cit2IDAuNzg3MDU4IDIuMzI0NzMyIC0wLjE0MTExNQordiAwLjcwNzUzMSAyLjMyNTIyMCAtMC4xNDExMTUKK3YgMC42Nzg5NzcgMi4yOTcxMDAgLTAuMTQxMTE1Cit2IDAuNjY4Mzc3IDIuMjUzMTU5IC0wLjE0MTExNQordiAwLjY2ODM5NyAyLjE1NjExMiAtMC4xNDExMTUKK3YgMC42Njg0MTggMi4wNTg1MTkgLTAuMTQxMTE1Cit2IDAuNjc4OTc4IDIuMDE2NDQwIC0wLjE0MTExNgordiAwLjcwNzUzMSAxLjk4ODMyNCAtMC4xNDExMTUKK3YgMC43NDc3MzMgMS45Nzc2MDUgLTAuMTQxMTE1Cit2IDAuNzg3MjU4IDEuOTg4MzE5IC0wLjE0MTExNQordiAwLjgxNTQ4NCAyLjAxNjc5NSAtMC4xNDExMTUKK3YgMC44MjY4MjkgMi4wNTg1MzcgLTAuMTQxMTE1Cit2IDAuODI2ODI5IDIuMTU2MTEyIC0wLjE0MTExNQordiAwLjgyNjgxNSAyLjI1MzE0MCAtMC4xNDExMTUKK3YgMC44MTU0ODggMi4yOTY3MzUgLTAuMTQxMTE1Cit2IC0wLjI3MTM2MSAyLjQ0OTE3OCAtMC4xODE1NDEKK3YgLTAuMzcyNDc4IDIuMzgwOTc4IC0wLjE4MTU0MgordiAtMC40NDA2MzUgMi4yNzk4OTYgLTAuMTgxNTQyCit2IC0wLjQ2NTY0MSAyLjE1NjExNyAtMC4xODE1NDIKK3YgLTAuNDQwNjUwIDIuMDMyNDE3IC0wLjE4MTU0MgordiAtMC4zNzI0ODMgMS45MzEyNzMgLTAuMTgxNTQyCit2IC0wLjI3MTM1NiAxLjg2MzAzMiAtMC4xODE1NDIKK3YgLTAuMTQ3NjEyIDIuNDc0MjA0IC0wLjE4MTU0MQordiAtMC4wMjM4NzAgMi40NDkxNzggLTAuMTgxNTQwCit2IDAuMDc3MjM2IDIuMzgwOTkzIC0wLjE4MTU0MAordiAwLjE0NTQ1OCAyLjI3OTg5MiAtMC4xODE1NDAKK3YgMC4xNzA0ODggMi4xNTYxMTcgLTAuMTgxNTQwCit2IDAuMTQ1Mzg2IDIuMDMyNDEwIC0wLjE4MTU0MAordiAwLjA3NzIzNSAxLjkzMTI5MyAtMC4xODE1NDAKK3YgLTAuMDIzODEyIDEuODYzMDMyIC0wLjE4MTU0MQordiAtMC4xNDc2MTIgMS44MzgxMjEgLTAuMTgxNTQxCit2IDAuODM2NzIxIC0yLjgxOTE3OSAtMC4wMjE4NjMKK3YgMC44MzYzODggLTIuODE5MTgzIC0wLjAyNDE1OQordiAwLjc0NzcyMyAtMi43ODU4NjEgLTAuMTE0OTk1Cit2IDAuNjYwNzMwIC0yLjgxOTE4MyAtMC4wMjQxNjAKK3YgMC42NjA0NjIgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjY2NjIxNyAtMi44MTkxNzkgLTAuMDIxODY0Cit2IDAuNjY2ODU0IC0yLjgxOTE4MyAtMC4wMjQxNjAKK3YgMC43NDc3MjMgLTIuNzg5MTI2IC0wLjEwNzM2MAordiAwLjgyODc5NiAtMi44MTkxODQgLTAuMDI0MTU5Cit2IDAuODI5MjcyIC0yLjgxOTE3OCAtMC4wMjE4NjMKK3YgMC44MzY4NjMgLTIuODE2NDAxIC0wLjAxOTg2OQordiAwLjgzNjk3MiAtMi43OTQ4MDEgLTAuMDE5ODY5Cit2IDAuNjYwNDQwIC0yLjc5NDgwMSAtMC4wMTk4NzAKK3YgMC42NjA0MTEgLTIuODE2NDAxIC0wLjAxOTg3MAordiAwLjY2Nzk0NCAtMi43OTQ4MDIgLTAuMDI0MTYwCit2IDAuNzQ3NzQzIC0yLjc5NDI1MCAtMC4xMDU0ODcKK3YgMC44Mjc3NzYgLTIuNzk0ODAyIC0wLjAyNDE2MAordiAwLjgyODczNSAtMi43OTQ4MDIgLTAuMDE5ODY5Cit2IDAuODI5ODIzIC0yLjgxNjQwMSAtMC4wMTk4NjkKK3YgMC44Mjk4MTQgLTIuNzk0ODAxIC0wLjAxOTg2OQordiAwLjY3MTYzMyAtMi44MTkxOTcgLTAuMDcwODgwCit2IDAuNjc3MTk1IC0yLjgxOTE5NyAtMC4wNjUzOTAKK3YgMC42Nzc4NjIgLTIuNzk0ODAyIC0wLjA2NTAxNQordiAtMS4wMjgzMDcgLTIuODE2NDAxIC0wLjAxOTg3NAordiAtMS4wMjgzMDcgLTIuNzk0ODAxIC0wLjAxOTg3NAordiAtMS4wMjgzMDggLTIuODE5MTc5IC0wLjAyMTg2OAordiAtMS4wMjgzMDggLTIuODE5MTgzIC0wLjAyNDE2NwordiAxLjEyMjkwNCAxLjk4MDM0MCAtMC4xNDczNDUKK3YgMS4xMjI5MDQgMi4wNTkyODAgLTAuMTQ3MzQ1Cit2IDEuMTIyOTA0IDIuMTU2MTE2IC0wLjE0NzM0NQordiAxLjEyMjkwNCAyLjI1MzY5NSAtMC4xNDczNDUKK3YgMS4xMjI5MDQgMi4zMzI5MTEgLTAuMTQ3MzQ1Cit2IC0wLjE0NzYxMiAtMi4yNjMxNDcgLTAuMTQ3MzUxCit2IC0wLjE0NzYxMiAtMi40NDIwOTkgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMiAtMi42NjE0MTYgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMiAtMi42MTE0MTYgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMyAtMi44MTkxODMgLTAuMDU0MDY5Cit2IC0wLjE0NzYxMyAtMi44MTkxODMgLTAuMDQ2ODQ0Cit2IC0wLjE0NzYxMyAtMi44MTkxOTcgLTAuMDc2NzgzCit2IC0wLjE0NzYxMyAtMi44MTkxOTcgLTAuMDcwNjg3Cit2IC0wLjE0NzYxMiAtMi43Nzk3NTMgLTAuMTE3OTE4Cit2IC0wLjE0NzYxMiAtMi43MjEwMTkgLTAuMTM4MjkzCit2IC0wLjE0NzYxMiAtMi41MjE5NTQgLTAuMTQ3MzUwCit2IC0wLjE0NzYxMyAtMi43OTQ4MDAgLTAuMDQ2MDI0Cit2IC0wLjE0NzYxMyAtMi44MTgzOTYgLTAuMDQ2MDI5Cit2IC0wLjIwNzk3MyAtMi4xODc4OTkgLTAuMTUwNDgzCit2IC0wLjIwNzk5OSAtMi4wNzAwOTggLTAuMTUwNDgzCit2IC0wLjE2NDUwNiAtMi4wNzAwOTMgLTAuMTUwNDgzCit2IC0wLjE2NDQ4OSAtMi4yMjI3MjMgLTAuMTUwNDgzCit2IC0wLjI3NDc1NSAtMi4yMjI3MzIgLTAuMTUwNDg0Cit2IC0wLjI3NDc2MCAtMi4xODc5NzkgLTAuMTUwNDg0Cit2IC0wLjI3MDI4OSAtMi4yMTgzMzUgLTAuMTUyOTI2Cit2IC0wLjI3MDI5NCAtMi4xOTI0MjQgLTAuMTUyOTI2Cit2IC0wLjIwMzQ5MiAtMi4xOTI0MjAgLTAuMTUyOTI1Cit2IC0wLjIwMzUxNSAtMi4wNzQ2ODYgLTAuMTUyOTI1Cit2IC0wLjE2ODk3NSAtMi4wNzQ1MTQgLTAuMTUyOTI1Cit2IC0wLjE2ODk1NSAtMi4yMTgzMjkgLTAuMTUyOTI2Cit2IC0wLjI2Nzk4OCAtMi4xODc5NjkgLTAuMTUwNDg0Cit2IC0wLjI2Nzk4NCAtMi4yMjI3MzIgLTAuMTUwNDg0Cit2IC0wLjI2Nzk4OCAtMi4xOTI0MjQgLTAuMTUyOTI2Cit2IC0wLjI2Nzk4NSAtMi4yMTgzMzUgLTAuMTUyOTI2Cit2IC0wLjI3NDc1OSAtMi4xOTQ2OTMgLTAuMTUwNDg0Cit2IC0wLjE2NDQ4OSAtMi4xOTQ2NzUgLTAuMTUwNDgzCit2IC0wLjI3MDI5MyAtMi4xOTQ2OTMgLTAuMTUyOTI2Cit2IC0wLjE2ODk1OSAtMi4xOTQ2NzcgLTAuMTUyOTI1Cit2IC0wLjI2Nzk4OCAtMi4xOTQ2OTMgLTAuMTUyOTI2Cit2IC0wLjI3NDc1NiAtMi4yMTU5MzAgLTAuMTUwNDg0Cit2IC0wLjI3MDI5MCAtMi4yMTU5MzAgLTAuMTUyOTI2Cit2IC0wLjE2NDQ4OSAtMi4yMTU5MTggLTAuMTUwNDgzCit2IC0wLjE2ODk1NSAtMi4yMTU5MTkgLTAuMTUyOTI1Cit2IC0wLjI2Nzk4NSAtMi4yMTU5MjkgLTAuMTUyOTI2Cit2IC0wLjIwOTU4NiAtMi4yMjI3MjYgLTAuMTUwNDg0Cit2IC0wLjIwOTYxOCAtMi4yMTgzMzEgLTAuMTUyOTI2Cit2IC0wLjIwOTgyOSAtMi4xODc5MDIgLTAuMTUwNDg0Cit2IC0wLjIwOTc5OSAtMi4xOTI0MjEgLTAuMTUyOTI1Cit2IC0wLjIwOTc4MiAtMi4xOTQ2ODMgLTAuMTUyOTI1Cit2IC0wLjIwOTYzNCAtMi4yMTU5MjMgLTAuMTUyOTI2Cit2IC0wLjIwMTM3MSAtMi4yMjI3MjUgLTAuMTUwNDg0Cit2IC0wLjIwMTM5MyAtMi4wNzAwOTcgLTAuMTUwNDgzCit2IC0wLjIwMTM5MiAtMi4wNzQ2NzIgLTAuMTUyOTI1Cit2IC0wLjIwMTM3MiAtMi4yMTgzMzEgLTAuMTUyOTI2Cit2IC0wLjIwMTM3NiAtMi4xOTQ2ODEgLTAuMTUyOTI1Cit2IC0wLjIwMTM3MyAtMi4yMTU5MjIgLTAuMTUyOTI2Cit2IC0wLjE2NDUwNSAtMi4wNzY3MDQgLTAuMTUwNDgzCit2IC0wLjIwNzk5NyAtMi4wNzY3MTEgLTAuMTUwNDgzCit2IC0wLjIwMzUxNCAtMi4wNzY3MTEgLTAuMTUyOTI1Cit2IC0wLjE2ODk3NCAtMi4wNzY3MDYgLTAuMTUyOTI1Cit2IC0wLjIwMTM5MiAtMi4wNzY3MTEgLTAuMTUyOTI1Cit2IC0wLjE3MTIyMyAtMi4yMjI3MjMgLTAuMTUwNDgzCit2IC0wLjE3MTIyMyAtMi4yMTgzMjkgLTAuMTUyOTI2Cit2IC0wLjE3MTIyNyAtMi4xOTQ2NzcgLTAuMTUyOTI1Cit2IC0wLjE3MTIyNCAtMi4yMTU5MTkgLTAuMTUyOTI1Cit2IC0wLjE3MTIzOSAtMi4wNzAwOTQgLTAuMTUwNDgzCit2IC0wLjE3MTIzOSAtMi4wNzQ1MjkgLTAuMTUyOTI1Cit2IC0wLjE3MTIzOCAtMi4wNzY3MDcgLTAuMTUyOTI1Cit2IC0wLjIwNzk3NCAtMi4xODUxNTIgLTAuMTUwNDgzCit2IC0wLjIwMzQ5NCAtMi4xODUxNTIgLTAuMTUyOTI1Cit2IC0wLjE2NDQ4OSAtMi4xODUxNDUgLTAuMTUwNDgzCit2IC0wLjE2ODk2MSAtMi4xODUxNDcgLTAuMTUyOTI1Cit2IC0wLjIwMTM3OCAtMi4xODUxNTIgLTAuMTUyOTI1Cit2IC0wLjE3MTIyOCAtMi4xODUxNDcgLTAuMTUyOTI1Cit2IC0wLjEzMTA4NyAtMi4xNDU1NjIgLTAuMTUwNDgzCit2IC0wLjEyMjM5MiAtMi4xMDYyMDMgLTAuMTUwNDgzCit2IC0wLjA5NzAwMiAtMi4wNjgxMzIgLTAuMTUwNDgzCit2IC0wLjA1OTE0OCAtMi4wNDIzNTYgLTAuMTUwNDgzCit2IC0wLjAxMjY3MSAtMi4wMzI2NjIgLTAuMTUwNDgzCit2IDAuMDMzOTM3IC0yLjA0MTcwNyAtMC4xNTA0ODMKK3YgMC4wNzIxNDYgLTIuMDY2OTgwIC0wLjE1MDQ4MwordiAwLjA5ODA2MiAtMi4xMDQ2NzAgLTAuMTUwNDgzCit2IDAuMTA3Nzk1IC0yLjE1MDk2NyAtMC4xNTA0ODMKK3YgMC4wOTg3MDcgLTIuMTk3MzMxIC0wLjE1MDQ4MwordiAwLjA3MzMxNyAtMi4yMzU1MDEgLTAuMTUwNDgzCit2IDAuMDM1NDY0IC0yLjI2MTQzNCAtMC4xNTA0ODMKK3YgLTAuMDExMDE1IC0yLjI3MTA3NiAtMC4xNTA0ODMKK3YgLTAuMDU3NjIyIC0yLjI2MjA4MSAtMC4xNTA0ODMKK3YgLTAuMDk1ODMwIC0yLjIzNjY2OCAtMC4xNTA0ODMKK3YgLTAuMTIxNzQ3IC0yLjE5ODg5MCAtMC4xNTA0ODMKK3YgMC4wMTM1NTMgLTIuMTMwMDUzIC0wLjE1MDQ1OAordiAwLjAyNTIzMyAtMi4xMzQ3MzEgLTAuMTUwNDU4Cit2IDAuMDM2NTk3IC0yLjEyOTg5MyAtMC4xNTA0NTcKK3YgMC4wNDEyOTQgLTIuMTE4Mzg4IC0wLjE1MDQ1NwordiAwLjAzNjQzOCAtMi4xMDY5NDggLTAuMTUwNDU3Cit2IDAuMDI0ODgzIC0yLjEwMjE5MSAtMC4xNTA0NTcKK3YgMC4wMTMzOTQgLTIuMTA3MTA4IC0wLjE1MDQ1NwordiAwLjAwNjczMyAtMi4xMTg2MTUgLTAuMTUwNDU3Cit2IC0wLjA0MTA0NyAtMi4xNjAyNDggLTAuMTUwNDU4Cit2IC0wLjA0MTA0OCAtMi4xNDU5NDkgLTAuMTUwNDU4Cit2IC0wLjA5NTg1NCAtMi4xODkzNTggLTAuMTUwNDU4Cit2IC0wLjA3NjUyMSAtMi4yMTg3NjAgLTAuMTUwNDU5Cit2IC0wLjA0OTUzOSAtMi4yMzcyMzAgLTAuMTUwNDU5Cit2IC0wLjAxMTAxNyAtMi4yNDU2MDYgLTAuMTUwNDU5Cit2IDAuMDI3MDk3IC0yLjIzNzY3NiAtMC4xNTA0NTkKK3YgMC4wNTQ1NzcgLTIuMjE4OTY4IC0wLjE1MDQ1OAordiAwLjA3NTQ3NiAtMi4xODc2NTIgLTAuMTUwNDU4Cit2IDAuMDgyOTU3IC0yLjE1MTA4NiAtMC4xNTA0NTgKK3YgMC4wNzQ5NDYgLTIuMTEyOTk1IC0wLjE1MDQ1NwordiAwLjA1NjA2NSAtMi4wODQ0MDQgLTAuMTUwNDU3Cit2IDAuMDI0NjE0IC0yLjA2NDMwOCAtMC4xNTA0NTcKK3YgLTAuMDEyNDcyIC0yLjA1NjU2MCAtMC4xNTA0NTcKK3YgLTAuMDEyNDY5IC0yLjA2NjM5OCAtMC4xNTA0NTcKK3YgMC4wMTk5MjAgLTIuMDc0Njc0IC0wLjE1MDQ1NwordiAwLjA0OTI3MyAtMi4wOTI1NTEgLTAuMTUwNDU3Cit2IDAuMDY1ODk4IC0yLjExNjkxOSAtMC4xNTA0NTcKK3YgMC4wNjYwNjkgLTIuMTgzOTMzIC0wLjE1MDQ1OAordiAwLjA0ODA1OSAtMi4yMTExMjIgLTAuMTUwNDU4Cit2IDAuMDIyMTk5IC0yLjIyODYzNCAtMC4xNTA0NTkKK3YgLTAuMDExMjY3IC0yLjIzNTQyNSAtMC4xNTA0NTkKK3YgLTAuMDQ1NTM5IC0yLjIyNzQ1MiAtMC4xNTA0NTkKK3YgLTAuMDY5MjExIC0yLjIwOTkzNyAtMC4xNTA0NTgKK3YgLTAuMDkzNTQyIC0yLjE2MDI1NSAtMC4xNTA0NTgKK3YgLTAuMDQwOTA3IC0yLjE4ODYxNyAtMC4xNTA0NTgKK3YgLTAuMDQwOTA1IC0yLjIwMDM5MCAtMC4xNTA0NTgKK3YgLTAuMDA1MzI2IC0yLjIwMDM3MyAtMC4xNTA0NTgKK3YgLTAuMDA1MzM1IC0yLjEwMjE4MCAtMC4xNTA0NTcKK3YgLTAuMDE1MDM0IC0yLjEwMjE4MSAtMC4xNTA0NTcKK3YgLTAuMDE1MDM0IC0yLjE4ODYxMCAtMC4xNTA0NTgKK3YgLTAuMTAzMTI2IC0yLjE0NTk1OCAtMC4xNTA0NTgKK3YgLTAuMDA1MzMxIC0yLjE1MTQ1OSAtMC4xNTA0NTgKK3YgMC4wNzI1MDIgLTIuMTUxNDAzIC0wLjE1MDQ1OAordiAwLjAyNTIzNyAtMi4xNTE0NDMgLTAuMTUyOTI1Cit2IDAuMDI1MjQyIC0yLjE4MjQ4MSAtMC4xNTI5MjUKK3YgLTAuMDA1MzI4IC0yLjE4MjQ5OCAtMC4xNTA0NTgKK3YgLTAuMDA2OTMxIC0yLjIwMDM3MyAtMC4xNTA0NTgKK3YgLTAuMDA1MzM0IC0yLjExODY4MyAtMC4xNTA0NTcKK3YgLTAuMDE1NjgzIC0yLjA1Mjc0NCAtMC4xNTI5MjQKK3YgLTAuMDE1Njc5IC0yLjA2OTA5NCAtMC4xNTI5MjQKK3YgMC4wMTg2NzcgLTIuMDc3MzgzIC0wLjE1MjkyNAordiAwLjA0Njk3OCAtMi4wOTQ5MzMgLTAuMTUyOTI0Cit2IDAuMDYyODg5IC0yLjExODI0NiAtMC4xNTI5MjQKK3YgMC4wNjkyMjkgLTIuMTUxNDEyIC0wLjE1MjkyNQordiAwLjA2MzA0MiAtMi4xODI5ODkgLTAuMTUyOTI1Cit2IDAuMDQ1NzMyIC0yLjIwODg4NSAtMC4xNTI5MjUKK3YgMC4wMjA5MTQgLTIuMjI1NzE2IC0wLjE1MjkyNQordiAtMC4wMTExOTYgLTIuMjMyMjk4IC0wLjE1MjkyNgordiAtMC4wNDQwNzcgLTIuMjI0NTgzIC0wLjE1MjkyNgordiAtMC4wNjY4MjcgLTIuMjA3NzkzIC0wLjE1MjkyNQordiAtMC4wODg3MTkgLTIuMTYzNjY5IC0wLjE1MjkyNQordiAtMC4wMzc3NTQgLTIuMTYzNjIzIC0wLjE1MjkyNQordiAtMC4wMzc3NTYgLTIuMTQyODMwIC0wLjE1MjkyNQordiAtMC4xMDY0NzcgLTIuMTQyODMzIC0wLjE1MjkyNQordiAtMC4wOTg4NzcgLTIuMTkwNjI3IC0wLjE1MjkyNQordiAtMC4wNzg4OTkgLTIuMjIxMDU5IC0wLjE1MjkyNgordiAtMC4wNTA4OTEgLTIuMjQwMTY3IC0wLjE1MjkyNgordiAtMC4wMTEwMzYgLTIuMjQ4ODM1IC0wLjE1MjkyNgordiAwLjAyODM3OSAtMi4yNDA2MzUgLTAuMTUyOTI2Cit2IDAuMDU2OTAyIC0yLjIyMTMyNyAtMC4xNTI5MjUKK3YgMC4wNzg1MDAgLTIuMTg4OTM1IC0wLjE1MjkyNQordiAwLjA4NjIyNyAtMi4xNTExMTAgLTAuMTUyOTI1Cit2IDAuMDc3OTUyIC0yLjExMTc2MyAtMC4xNTI5MjQKK3YgMC4wNTgzNTggLTIuMDgyMTU0IC0wLjE1MjkyNAordiAwLjAyNTg1NSAtMi4wNjE3MTYgLTAuMTUyOTI0Cit2IC0wLjEyNzgxNiAtMi4xNDU1NTkgLTAuMTUyOTI1Cit2IC0wLjExOTM2NyAtMi4xMDc0NzggLTAuMTUyOTI1Cit2IC0wLjA5NDY3NiAtMi4wNzA0NzkgLTAuMTUyOTI0Cit2IC0wLjAxMjY0OSAtMi4wMzU5ODIgLTAuMTUyOTI0Cit2IDAuMDMyNjk1IC0yLjA0NDc4MyAtMC4xNTI5MjQKK3YgMC4wNjk4NTEgLTIuMDY5MzM1IC0wLjE1MjkyNAordiAwLjA5NTA1NCAtMi4xMDU5ODcgLTAuMTUyOTI0Cit2IDAuMTA0NTIyIC0yLjE1MTAxMCAtMC4xNTI5MjUKK3YgMC4wOTU2ODAgLTIuMTk2MTU5IC0wLjE1MjkyNQordiAwLjA3MDk5MCAtMi4yMzMzNTAgLTAuMTUyOTI1Cit2IDAuMDM0MTc4IC0yLjI1ODQxNiAtMC4xNTI5MjYKK3YgLTAuMDExMDM5IC0yLjI2Nzc5MiAtMC4xNTI5MjYKK3YgLTAuMDU2MzgyIC0yLjI1OTA0MiAtMC4xNTI5MjYKK3YgLTAuMDkzNTM3IC0yLjIzNDQ4NiAtMC4xNTI5MjYKK3YgLTAuMTE4NzQwIC0yLjE5NzY1MCAtMC4xNTI5MjUKK3YgLTAuMDE4MjQ4IC0yLjA5OTA1MiAtMC4xNTI5MjQKK3YgLTAuMDE4MjQ3IC0yLjE4NTQ5NiAtMC4xNTI5MjUKK3YgLTAuMDQ0MTE2IC0yLjE4NTQ5NyAtMC4xNTI5MjUKK3YgLTAuMDQ0MTEzIC0yLjIwMzY2MyAtMC4xNTI5MjUKK3YgLTAuMDA2OTEyIC0yLjIwMzYyOCAtMC4xNTI5MjUKK3YgLTAuMDAxODY1IC0yLjIwMzYyNCAtMC4xNTI5MjUKK3YgLTAuMDAxODY5IC0yLjE4MjUwMSAtMC4xNTI5MjUKK3YgLTAuMDAxODczIC0yLjE1MTQ2MiAtMC4xNTI5MjUKK3YgLTAuMDAxODc4IC0yLjExODcwNyAtMC4xNTI5MjUKK3YgLTAuMDAxODgxIC0yLjA5OTAzMiAtMC4xNTI5MjQKK3YgMC4wMTExMTUgLTIuMTMyNTYyIC0wLjE1MjkyNQordiAwLjAyNTIzMyAtMi4xMzgyMzUgLTAuMTUyOTI1Cit2IDAuMDM5MDY3IC0yLjEzMjM2NyAtMC4xNTI5MjUKK3YgMC4wNDQ3NjUgLTIuMTE4NDEyIC0wLjE1MjkyNAordiAwLjAzODg3NCAtMi4xMDQ1MzUgLTAuMTUyOTI0Cit2IDAuMDI0ODU4IC0yLjA5ODg2MiAtMC4xNTI5MjQKK3YgMC4wMTA5MjEgLTIuMTA0NzI5IC0wLjE1MjkyNAordiAwLjAwMzI2MCAtMi4xMTg2ODcgLTAuMTUyOTI1Cit2IC0wLjA4MTk2NSAtMi4wODA3NTAgLTAuMTUyOTI0Cit2IC0wLjEwMTcwNiAtMi4xMTUyNzcgLTAuMTUyOTI1Cit2IC0wLjA5ODY0NyAtMi4xNDU5NTcgLTAuMTUwNDU4Cit2IC0wLjA5OTQyNSAtMi4xNDI4MzMgLTAuMTUyOTI1Cit2IC0wLjEwMzk0OSAtMi4xNTAyNzMgLTAuMTUwNDU4Cit2IC0wLjEwNzE4NyAtMi4xNTA3MTUgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xMDQyOTkgLTAuMTUwNDU3Cit2IC0wLjA0Mzg2MyAtMi4xNDU5NDkgLTAuMTUwNDU4Cit2IC0wLjA0Mzg2NCAtMi4xNDI4MzEgLTAuMTUyOTI1Cit2IC0wLjAxODI0OCAtMi4xMDQzNzIgLTAuMTUyOTI0Cit2IC0wLjAwNTMzNSAtMi4xMDQxOTggLTAuMTUwNDU3Cit2IC0wLjAwMTg4MCAtMi4xMDQyMjMgLTAuMTUyOTI0Cit2IC0wLjAwOTc0MSAtMi4wNTY1NjAgLTAuMTUwNDU3Cit2IC0wLjAwOTAyMCAtMi4wNjY5ODkgLTAuMTUwNDU3Cit2IC0wLjAwOTIzNCAtMi4wNzA1OTkgLTAuMTUyOTI0Cit2IC0wLjAwOTc2NiAtMi4wNTMzNjggLTAuMTUyOTI0Cit2IC0wLjAwNzYyNyAtMi4xMDIxODAgLTAuMTUwNDU3Cit2IC0wLjAxMzM4MyAtMi4xMDIxODEgLTAuMTUwNDU3Cit2IC0wLjAwNzY1MCAtMi4wOTkwMzcgLTAuMTUyOTI0Cit2IC0wLjAxMzQwOCAtMi4wOTkwNDcgLTAuMTUyOTI0Cit2IC0wLjAxMjQ3MSAtMi4wNTk1MzkgLTAuMTUwNDU3Cit2IC0wLjAxMjQ2OSAtMi4wNjQ1NjYgLTAuMTUwNDU3Cit2IC0wLjAxNTY4MiAtMi4wNTk1NDEgLTAuMTUyOTI0Cit2IC0wLjAxNTY4MCAtMi4wNjQ1NjcgLTAuMTUyOTI0Cit2IC0wLjA3NjQ1NSAtMi4wODUyMDYgLTAuMTUyOTI0Cit2IC0wLjA2OTQwMyAtMi4wODk4OTQgLTAuMTUyOTI0Cit2IC0wLjA5NTY1MiAtMi4xMTcyNDEgLTAuMTUyOTI1Cit2IC0wLjA4OTE0OCAtMi4xMTg5OTIgLTAuMTUyOTI1Cit2IC0wLjA5MTUwNCAtMi4xNDI4MzIgLTAuMTUyOTI1Cit2IC0wLjA5MTgzOCAtMi4xNDU5NTcgLTAuMTUwNDU4Cit2IC0wLjA0MTA0NyAtMi4xNTgwMjYgLTAuMTUwNDU4Cit2IC0wLjA0MTA0OCAtMi4xNDc1MzYgLTAuMTUwNDU4Cit2IC0wLjAzNzc1NSAtMi4xNTgwMjcgLTAuMTUyOTI1Cit2IC0wLjAzNzc1NiAtMi4xNDc1MzYgLTAuMTUyOTI1Cit2IC0wLjAxODI0NyAtMi4xNDc1MzUgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xNDc1MzQgLTAuMTUwNDU4Cit2IC0wLjAxODI0NyAtMi4xNTgwMjMgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xNTgwMjEgLTAuMTUwNDU4Cit2IC0wLjAzNTI0NSAtMi4wNzcwMDcgLTAuMTUyOTI0Cit2IC0wLjAzODkwNCAtMi4wNzE3MDcgLTAuMTUyOTI0Cit2IC0wLjA0MzI5OCAtMi4wNjQ2NjUgLTAuMTUyOTI0Cit2IC0wLjA0NzU0MCAtMi4wNTg1MjEgLTAuMTUyOTI0Cit2IC0wLjA1NzE4MCAtMi4wNDUyNzAgLTAuMTUyOTI0Cit2IC0wLjAxODI0OCAtMi4xMjY0NjkgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xMjY0NTkgLTAuMTUwNDU4Cit2IC0wLjA0MTkwMyAtMi4xMjY0OTMgLTAuMTUyOTI1Cit2IC0wLjA0MTkwNiAtMi4xMDI4MTggLTAuMTUyOTI0Cit2IC0wLjA4NTgyMiAtMi4xNjAyNTQgLTAuMTUwNDU4Cit2IC0wLjA0Mzc3MiAtMi4xNjAyNDkgLTAuMTUwNDU4Cit2IC0wLjA4NTc5MyAtMi4xNjM2MjQgLTAuMTUyOTI1Cit2IC0wLjA0Mzc0NCAtMi4xNjM2MjMgLTAuMTUyOTI1Cit2IC0wLjAyMDg3NyAtMi4xODg2MTIgLTAuMTUwNDU4Cit2IC0wLjAzODc1MCAtMi4xODg2MTcgLTAuMTUwNDU4Cit2IC0wLjAyMDg3OCAtMi4xODU0OTYgLTAuMTUyOTI1Cit2IC0wLjAzODc3MyAtMi4xODU0OTcgLTAuMTUyOTI1Cit2IC0wLjAxODI0NyAtMi4xODI4ODEgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xODI4ODEgLTAuMTUwNDU4Cit2IC0wLjA5MTc5NSAtMi4xNjU5MjEgLTAuMTUwNDU4Cit2IC0wLjA4Nzk2OSAtMi4xNjY0MzEgLTAuMTUyOTI1Cit2IC0wLjA0MzUzMSAtMi4xNjY0MjggLTAuMTUyOTI1Cit2IC0wLjAxODI0NyAtMi4xNjY0MjYgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xNjY0MjYgLTAuMTUwNDU4Cit2IC0wLjAxODI0NyAtMi4xNjM2MjMgLTAuMTUyOTI1Cit2IC0wLjAxNTAzNCAtMi4xNjM2MjMgLTAuMTUwNDU4Cit2IC0wLjAzNzc1NCAtMi4xNjY0MjcgLTAuMTUyOTI1Cit2IC0wLjAzNDIxOSAtMi4xODU0OTcgLTAuMTUyOTI1Cit2IC0wLjAzNDIxOSAtMi4xODg2MTUgLTAuMTUwNDU4Cit2IC0wLjA0MDkwNyAtMi4xOTA4MzUgLTAuMTUwNDU4Cit2IC0wLjA0NDExNiAtMi4xOTA4NDMgLTAuMTUyOTI1Cit2IC0wLjA3NjQ0NiAtMi4xOTI0MzUgLTAuMTUyOTI1Cit2IC0wLjA4MDI5NiAtMi4xOTI0MzIgLTAuMTUwNDU4Cit2IC0wLjAzNDIxOSAtMi4xODI4ODMgLTAuMTUyOTI1Cit2IC0wLjAzODk1MyAtMi4xODI4ODMgLTAuMTUyOTI1Cit2IC0wLjA4MTE4NiAtMi4xODQ0NTggLTAuMTUyOTI1Cit2IC0wLjA4NTAzMCAtMi4xODQ0NTggLTAuMTUwNDU4Cit2IC0wLjA0MDkwNSAtMi4xOTg0MzggLTAuMTUwNDU4Cit2IC0wLjA0NDExNCAtMi4xOTg0NDEgLTAuMTUyOTI1Cit2IC0wLjAzOTI4NSAtMi4yMDAzOTAgLTAuMTUwNDU4Cit2IC0wLjAzOTI4MyAtMi4yMDM2NjAgLTAuMTUyOTI1Cit2IC0wLjAwNTMyNiAtMi4xOTg0MzAgLTAuMTUwNDU4Cit2IDAuMDIzODgzIC0yLjIwMjM1NSAtMC4xNTI5MjUKK3YgLTAuMDAxODY2IC0yLjE5ODQzMCAtMC4xNTI5MjUKK3YgLTAuMjA3OTczIC0yLjE4Nzg4OSAtMC4xNDQ3NDcKK3YgLTAuMjA3OTk5IC0yLjA3MDA5NyAtMC4xNDQ3NDcKK3YgLTAuMTY0NTA2IC0yLjA3MDA5MiAtMC4xNDQ3NDcKK3YgLTAuMTY0NDg5IC0yLjIyMjcyMiAtMC4xNDQ3NDcKK3YgLTAuMjc0NzU1IC0yLjIyMjczMiAtMC4xNDQ3NDcKK3YgLTAuMjc0NzYwIC0yLjE4Nzk2OSAtMC4xNDQ3NDcKK3YgLTAuMjY3OTg4IC0yLjE4Nzk2MCAtMC4xNDQ3NDcKK3YgLTAuMjY3OTg0IC0yLjIyMjczMSAtMC4xNDQ3NDcKK3YgLTAuMjc0NzU5IC0yLjE5NDY5MiAtMC4xNDQ3NDcKK3YgLTAuMTY0NDg5IC0yLjE5NDY3NCAtMC4xNDQ3NDcKK3YgLTAuMjc0NzU2IC0yLjIxNTkyOSAtMC4xNDQ3NDcKK3YgLTAuMTY0NDg5IC0yLjIxNTkxNyAtMC4xNDQ3NDcKK3YgLTAuMjA5NTg1IC0yLjIyMjcyNiAtMC4xNDQ3NDcKK3YgLTAuMjA5ODI4IC0yLjE4Nzg5MiAtMC4xNDQ3NDcKK3YgLTAuMjAxMzcxIC0yLjIyMjcyNSAtMC4xNDQ3NDcKK3YgLTAuMjAxMzkzIC0yLjA3MDA5NiAtMC4xNDQ3NDcKK3YgLTAuMTY0NTA1IC0yLjA3NjcwMyAtMC4xNDQ3NDcKK3YgLTAuMjA3OTk3IC0yLjA3NjcxMCAtMC4xNDQ3NDcKK3YgLTAuMTcxMjIzIC0yLjIyMjcyMyAtMC4xNDQ3NDcKK3YgLTAuMTcxMjM5IC0yLjA3MDA5MyAtMC4xNDQ3NDcKK3YgLTAuMjA3OTc0IC0yLjE4NTE1MSAtMC4xNDQ3NDcKK3YgLTAuMTY0NDg5IC0yLjE4NTE0MyAtMC4xNDQ3NDcKK3YgLTAuMTMxMDg2IC0yLjE0NTU2NCAtMC4xNDQ3NDYKK3YgLTAuMTIyMzkwIC0yLjEwNjIwMSAtMC4xNDQ3NDYKK3YgLTAuMDk3MDAwIC0yLjA2ODEyNiAtMC4xNDQ3NDYKK3YgLTAuMDU5MTQ3IC0yLjA0MjM0NyAtMC4xNDQ3NDYKK3YgLTAuMDEyNjY5IC0yLjAzMjY1NCAtMC4xNDQ3NDYKK3YgMC4wMzM5MzkgLTIuMDQxNzAxIC0wLjE0NDc0NgordiAwLjA3MjE0NyAtMi4wNjY5NjkgLTAuMTQ0NzQ2Cit2IDAuMDk4MDY0IC0yLjEwNDY2OCAtMC4xNDQ3NDYKK3YgMC4xMDc3OTYgLTIuMTUwOTY5IC0wLjE0NDc0NgordiAwLjA5ODcwOCAtMi4xOTczMjggLTAuMTQ0NzQ2Cit2IDAuMDczMzE5IC0yLjIzNTQ5NCAtMC4xNDQ3NDYKK3YgMC4wMzU0NjUgLTIuMjYxNDM1IC0wLjE0NDc0NgordiAtMC4wMTEwMTMgLTIuMjcxMDM4IC0wLjE0NDc0NgordiAtMC4wNTc2MjEgLTIuMjYyMDgzIC0wLjE0NDc0NgordiAtMC4wOTU4MjggLTIuMjM2Njg1IC0wLjE0NDc0NgordiAtMC4xMjE3NDYgLTIuMTk4ODkyIC0wLjE0NDc0NgordiAtMC4yNzI1MjIgLTIuMjIwNTU5IC0wLjE1MjkyNgordiAtMC4yNzI1MjkgLTIuMTkwMjA4IC0wLjE1MjkyNgordiAtMC4yMDU3MzcgLTIuMTkwMjAzIC0wLjE1MjkyNQordiAtMC4yMDU3NTQgLTIuMDcyMzc4IC0wLjE1MjkyNQordiAtMC4xNjY3MzAgLTIuMDcyMzc0IC0wLjE1MjkyNQordiAtMC4xNjY3MjkgLTIuMjIwNTUxIC0wLjE1MjkyNgordiAtMC4yNjc5ODggLTIuMTkwMjA4IC0wLjE1MjkyNgordiAtMC4yNjc5ODQgLTIuMjIwNTU4IC0wLjE1MjkyNgordiAtMC4yNzI1MjggLTIuMTk0Njk0IC0wLjE1MjkyNgordiAtMC4xNjY3MjkgLTIuMTk0Njc2IC0wLjE1MjkyNQordiAtMC4yNzI1MjMgLTIuMjE1OTMwIC0wLjE1MjkyNgordiAtMC4xNjY3MjkgLTIuMjE1OTE5IC0wLjE1MjkyNQordiAtMC4yMDk2MDIgLTIuMjIwNTU0IC0wLjE1MjkyNgordiAtMC4yMDk4MTQgLTIuMTkwMjAzIC0wLjE1MjkyNQordiAtMC4yMDEzOTIgLTIuMDcyMzc3IC0wLjE1MjkyNQordiAtMC4yMDEzNzIgLTIuMjIwNTUzIC0wLjE1MjkyNgordiAtMC4yMDU3NTMgLTIuMDc2NzEyIC0wLjE1MjkyNQordiAtMC4xNjY3MzAgLTIuMDc2NzA2IC0wLjE1MjkyNQordiAtMC4xNzEyMjMgLTIuMjIwNTUxIC0wLjE1MjkyNgordiAtMC4xNzEyMzkgLTIuMDcyMzc1IC0wLjE1MjkyNQordiAtMC4yMDU3MzcgLTIuMTg1MTUzIC0wLjE1MjkyNQordiAtMC4xNjY3MjkgLTIuMTg1MTQ2IC0wLjE1MjkyNQordiAtMC4wMTQwNzggLTIuMDU0Njg1IC0wLjE1MjkyNAordiAtMC4wMTQwNzUgLTIuMDY3Nzc3IC0wLjE1MjkyNAordiAwLjAxOTI5OCAtMi4wNzYwNTggLTAuMTUyOTI0Cit2IDAuMDQ4MTI1IC0yLjA5Mzc3NCAtMC4xNTI5MjQKK3YgMC4wNjQzOTMgLTIuMTE3NjA2IC0wLjE1MjkyNAordiAwLjA3MDg2NSAtMi4xNTE0MTEgLTAuMTUyOTI1Cit2IDAuMDY0NTU1IC0yLjE4MzM2MyAtMC4xNTI5MjUKK3YgMC4wNDY4OTUgLTIuMjEwMDI3IC0wLjE1MjkyNQordiAwLjAyMTU1NiAtMi4yMjcyMTEgLTAuMTUyOTI1Cit2IC0wLjAxMTIzMiAtMi4yMzM5NDkgLTAuMTUyOTI2Cit2IC0wLjA0NDgwOSAtMi4yMjYwNjggLTAuMTUyOTI2Cit2IC0wLjA2ODAxOSAtMi4yMDg4ODkgLTAuMTUyOTI1Cit2IC0wLjA5MTEzMSAtMi4xNjE5MDIgLTAuMTUyOTI1Cit2IC0wLjAzOTQ0NCAtMi4xNjE4OTcgLTAuMTUyOTI1Cit2IC0wLjAzOTQ0NyAtMi4xNDQ0MTcgLTAuMTUyOTI1Cit2IC0wLjEwNDUxNSAtMi4xNDQ0MzYgLTAuMTUyOTI1Cit2IC0wLjA5NzM2NiAtMi4xOTAwMTYgLTAuMTUyOTI1Cit2IC0wLjA3NzcxMSAtMi4yMTk5NDYgLTAuMTUyOTI2Cit2IC0wLjA1MDIxNSAtMi4yMzg2ODMgLTAuMTUyOTI2Cit2IC0wLjAxMTAyNyAtMi4yNDcyMDMgLTAuMTUyOTI2Cit2IDAuMDI3NzM3IC0yLjIzOTEzOSAtMC4xNTI5MjYKK3YgMC4wNTU3MzkgLTIuMjIwMTg0IC0wLjE1MjkyNQordiAwLjA3Njk4OCAtMi4xODgzMTcgLTAuMTUyOTI1Cit2IDAuMDg0NTkxIC0yLjE1MTEyMiAtMC4xNTI5MjUKK3YgMC4wNzY0NDkgLTIuMTEyNDAxIC0wLjE1MjkyNAordiAwLjA1NzIxMSAtMi4wODMzMTIgLTAuMTUyOTI0Cit2IDAuMDI1MjM0IC0yLjA2MzA0MCAtMC4xNTI5MjQKK3YgLTAuMTI5NDUyIC0yLjE0NTU3MCAtMC4xNTI5MjUKK3YgLTAuMTIwODgwIC0yLjEwNjg1OCAtMC4xNTI5MjUKK3YgLTAuMDk1ODM5IC0yLjA2OTMzNiAtMC4xNTI5MjQKK3YgLTAuMDU4MTY1IC0yLjA0Mzg0MyAtMC4xNTI5MjQKK3YgLTAuMDEyNjYwIC0yLjAzNDM1MiAtMC4xNTI5MjQKK3YgMC4wMzMzMTYgLTIuMDQzMjc2IC0wLjE1MjkyNAordiAwLjA3MDk5OCAtMi4wNjgxNzYgLTAuMTUyOTI0Cit2IDAuMDk2NTU4IC0yLjEwNTM0NiAtMC4xNTI5MjQKK3YgMC4xMDYxNTggLTIuMTUwOTk3IC0wLjE1MjkyNQordiAwLjA5NzE5MyAtMi4xOTY3NzUgLTAuMTUyOTI1Cit2IDAuMDcyMTUzIC0yLjIzNDQ5MCAtMC4xNTI5MjUKK3YgMC4wMzQ4MjAgLTIuMjU5OTEwIC0wLjE1MjkyNgordiAtMC4wMTEwMjcgLTIuMjY5NDIxIC0wLjE1MjkyNgordiAtMC4wNTcwMDMgLTIuMjYwNTQ4IC0wLjE1MjkyNgordiAtMC4wOTQ2ODUgLTIuMjM1NjYxIC0wLjE1MjkyNgordiAtMC4xMjAyNDQgLTIuMTk4Mjg3IC0wLjE1MjkyNQordiAtMC4wMTY2NDcgLTIuMTAwNjUwIC0wLjE1MjkyNAordiAtMC4wMTY2MjggLTIuMTg3MDg2IC0wLjE1MjkyNQordiAtMC4wNDI1MTQgLTIuMTg3MDk0IC0wLjE1MjkyNQordiAtMC4wNDI1MDkgLTIuMjAyMDYzIC0wLjE1MjkyNQordiAtMC4wMDY5MjIgLTIuMjAyMDMzIC0wLjE1MjkyNQordiAtMC4wMDM3MTggLTIuMjAyMDMxIC0wLjE1MjkyNQordiAtMC4wMDM3MjMgLTIuMTgyNTAyIC0wLjE1MjkyNQordiAtMC4wMDM3MjkgLTIuMTUxNDYzIC0wLjE1MjkyNQordiAtMC4wMDM3MzUgLTIuMTE4NzE4IC0wLjE1MjkyNQordiAtMC4wMDM3MzkgLTIuMTAwNjI3IC0wLjE1MjkyNAordiAwLjAxMjMzMyAtMi4xMzEzMzEgLTAuMTUyOTI1Cit2IDAuMDI1MjMzIC0yLjEzNjUwNyAtMC4xNTI5MjUKK3YgMC4wMzc4MzIgLTIuMTMxMTU0IC0wLjE1MjkyNQordiAwLjA0MzAyOSAtMi4xMTg0MjQgLTAuMTUyOTI0Cit2IDAuMDM3NjU1IC0yLjEwNTc2NiAtMC4xNTI5MjQKK3YgMC4wMjQ4NzAgLTIuMTAwNTkxIC0wLjE1MjkyNAordiAwLjAxMjE1NyAtMi4xMDU5NDIgLTAuMTUyOTI0Cit2IDAuMDA0OTk2IC0yLjExODY3NCAtMC4xNTI5MjUKK3YgLTAuMDk5MDM3IC0yLjE0NDQzNCAtMC4xNTI5MjUKK3YgLTAuMTA1NTY4IC0yLjE1MDUyNiAtMC4xNTI5MjUKK3YgLTAuMDQzODYzIC0yLjE0NDQxOCAtMC4xNTI5MjUKK3YgLTAuMDE2NjQ2IC0yLjEwNDM3MSAtMC4xNTI5MjQKK3YgLTAuMDAzNzM5IC0yLjEwNDIzNCAtMC4xNTI5MjQKK3YgLTAuMDA5MTM3IC0yLjA2ODk3NCAtMC4xNTI5MjQKK3YgLTAuMDA5NzU0IC0yLjA1NDk5NiAtMC4xNTI5MjQKK3YgLTAuMDEzMzk2IC0yLjEwMDY0NiAtMC4xNTI5MjQKK3YgLTAuMDA3NjM5IC0yLjEwMDYzMSAtMC4xNTI5MjQKK3YgLTAuMDE0MDc1IC0yLjA2NDU2NyAtMC4xNTI5MjQKK3YgLTAuMDE0MDc3IC0yLjA1OTU0MSAtMC4xNTI5MjQKK3YgLTAuMDkxNjcxIC0yLjE0NDQzMyAtMC4xNTI5MjUKK3YgLTAuMDM5NDQ2IC0yLjE0NzUzNiAtMC4xNTI5MjUKK3YgLTAuMDM5NDQ1IC0yLjE1ODAyNyAtMC4xNTI5MjUKK3YgLTAuMDE2NjM3IC0yLjE0NzUzNSAtMC4xNTI5MjUKK3YgLTAuMDE2NjM0IC0yLjE1ODAyMyAtMC4xNTI5MjUKK3YgLTAuMDE2NjQxIC0yLjEyNjQ2NyAtMC4xNTI5MjUKK3YgLTAuMDQzNzU5IC0yLjE2MTg5NyAtMC4xNTI5MjUKK3YgLTAuMDg1ODA4IC0yLjE2MTkwMSAtMC4xNTI5MjUKK3YgLTAuMDM4NzYyIC0yLjE4NzA5MyAtMC4xNTI5MjUKK3YgLTAuMDIwODc4IC0yLjE4NzA4OCAtMC4xNTI5MjUKK3YgLTAuMDE2NjI5IC0yLjE4Mjg4MSAtMC4xNTI5MjUKK3YgLTAuMDg5ODgyIC0yLjE2NjM5MyAtMC4xNTI5MjUKK3YgLTAuMDE2NjMzIC0yLjE2NjQyNiAtMC4xNTI5MjUKK3YgLTAuMDE2NjMzIC0yLjE2MzYyMyAtMC4xNTI5MjUKK3YgLTAuMDM0MjE5IC0yLjE4NzA5MSAtMC4xNTI5MjUKK3YgLTAuMDQyNTEzIC0yLjE5MDg0MiAtMC4xNTI5MjUKK3YgLTAuMDc4MzcxIC0yLjE5MjQzNiAtMC4xNTI5MjUKK3YgLTAuMDgzMTA5IC0yLjE4NDQ1OCAtMC4xNTI5MjUKK3YgLTAuMDQyNTEwIC0yLjE5ODQ0MCAtMC4xNTI5MjUKK3YgLTAuMDM5Mjg0IC0yLjIwMjA2MSAtMC4xNTI5MjUKK3YgLTAuMDAzNzE5IC0yLjE5ODQzMCAtMC4xNTI5MjUKK3YgLTAuMDIyOTE1IC0yLjIwMDM4MiAtMC4xNTA0NTgKK3YgLTAuMDIyODk2IC0yLjIwMzY0NCAtMC4xNTI5MjUKK3YgLTAuMDIyOTA2IC0yLjIwMjA0NyAtMC4xNTI5MjUKK3YgMC4wMjUyNDAgLTIuMTY3MDYxIC0wLjE1MjkyNQordiAtMC4wMDUzMjkgLTIuMTY3MDgwIC0wLjE1MDQ1OAordiAtMC4wMDE4NzEgLTIuMTY3MDg0IC0wLjE1MjkyNQordiAtMC4wMDM3MjYgLTIuMTY3MDg1IC0wLjE1MjkyNQordiAtMC4wMjA4ODUgLTIuMTQ3NTM1IC0wLjE1MjkyNQordiAtMC4wMjA4ODMgLTIuMTU4MDI0IC0wLjE1MjkyNQordiAtMC4wMjA4ODcgLTIuMTI2NDczIC0wLjE1MjkyNQordiAtMC4wMjA4OTAgLTIuMTA0Mzc1IC0wLjE1MjkyNAordiAtMC4wMjA4ODIgLTIuMTY2NDI3IC0wLjE1MjkyNQordiAtMC4wMjA4ODIgLTIuMTYzNjIzIC0wLjE1MjkyNQordiAtMC4wMjA4ODAgLTIuMTgyODgyIC0wLjE1MjkyNQordiAwLjAxMzU1NCAtMi4xMzAwMDcgLTAuMTQ4MDU1Cit2IDAuMDI1MjMzIC0yLjEzNDY4NCAtMC4xNDgwNTUKK3YgMC4wMzY1OTggLTIuMTI5ODQ4IC0wLjE0ODA1NQordiAwLjA0MTI5NSAtMi4xMTgzNDEgLTAuMTQ4MDU1Cit2IDAuMDM2NDM5IC0yLjEwNjkwMiAtMC4xNDgwNTUKK3YgMC4wMjQ4ODQgLTIuMTAyMTg2IC0wLjE0ODA1NQordiAwLjAxMzM5NSAtMi4xMDcwNjIgLTAuMTQ4MDU1Cit2IDAuMDA2NzM0IC0yLjExODU2OCAtMC4xNDgwNTUKK3YgLTAuMDQxMDQ3IC0yLjE2MDI0NyAtMC4xNDgwNTUKK3YgLTAuMDQxMDQ4IC0yLjE0NTk0OCAtMC4xNDgwNTUKK3YgLTAuMDk1ODUzIC0yLjE4OTMxMSAtMC4xNDgwNTUKK3YgLTAuMDc2NTIwIC0yLjIxODcyNCAtMC4xNDgwNTUKK3YgLTAuMDQ5NTM3IC0yLjIzNzI2NyAtMC4xNDgwNTUKK3YgLTAuMDExMDE1IC0yLjI0NTYzOCAtMC4xNDgwNTUKK3YgMC4wMjcwOTggLTIuMjM3NzA5IC0wLjE0ODA1NQordiAwLjA1NDU3OCAtMi4yMTg5MzIgLTAuMTQ4MDU1Cit2IDAuMDc1NDc3IC0yLjE4NzYwNiAtMC4xNDgwNTUKK3YgMC4wODI5NTggLTIuMTUxMDQwIC0wLjE0ODA1NQordiAwLjA3NDk0NyAtMi4xMTI5NDggLTAuMTQ4MDU1Cit2IDAuMDU2MDY2IC0yLjA4NDM5NSAtMC4xNDgwNTUKK3YgMC4wMjQ2MTYgLTIuMDY0MzAwIC0wLjE0ODA1NQordiAtMC4wMTI0NzIgLTIuMDU2NTUwIC0wLjE0ODA1NQordiAtMC4wMTI0NjkgLTIuMDY2MzgyIC0wLjE0ODA1NQordiAwLjAxOTkyMSAtMi4wNzQ2NjYgLTAuMTQ4MDU1Cit2IDAuMDQ5Mjc0IC0yLjA5MjU0MSAtMC4xNDgwNTUKK3YgMC4wNjU4OTkgLTIuMTE2ODc0IC0wLjE0ODA1NQordiAwLjA2NjA3MCAtMi4xODM4ODcgLTAuMTQ4MDU1Cit2IDAuMDQ4MDYwIC0yLjIxMTExNCAtMC4xNDgwNTUKK3YgMC4wMjIyMDAgLTIuMjI4NjA4IC0wLjE0ODA1NQordiAtMC4wMTEyNjUgLTIuMjM1MjkzIC0wLjE0ODA1NQordiAtMC4wNDU1MzggLTIuMjI3NDI3IC0wLjE0ODA1NQordiAtMC4wNjkyMTAgLTIuMjA5OTI4IC0wLjE0ODA1NQordiAtMC4wOTM1NDAgLTIuMTYwMjU0IC0wLjE0ODA1NQordiAtMC4wNDA5MDcgLTIuMTg4NjE1IC0wLjE0ODA1NgordiAtMC4wNDA5MDUgLTIuMjAwMzg3IC0wLjE0ODA1NgordiAtMC4wMDUzMjYgLTIuMjAwMzY5IC0wLjE0ODA1NQordiAtMC4wMDUzMzUgLTIuMTAyMTc5IC0wLjE0ODA1NQordiAtMC4wMTUwMzQgLTIuMTAyMTgwIC0wLjE0ODA1NQordiAtMC4wMTUwMzQgLTIuMTg4NjA4IC0wLjE0ODA1NQordiAtMC4xMDMxMjUgLTIuMTQ1OTU3IC0wLjE0ODA1NQordiAtMC4wMDUzMzEgLTIuMTUxNDUzIC0wLjE0ODA1NQordiAwLjA3MjUwMyAtMi4xNTEzOTcgLTAuMTQ4MDU1Cit2IC0wLjAwNTMyOCAtMi4xODI0OTMgLTAuMTQ4MDU1Cit2IC0wLjAwNjkzMCAtMi4yMDAzNzAgLTAuMTQ4MDU1Cit2IC0wLjAwNTMzNCAtMi4xMTg2MzYgLTAuMTQ4MDU1Cit2IC0wLjA5ODY0NiAtMi4xNDU5NTcgLTAuMTQ4MDU1Cit2IC0wLjEwMzk0NyAtMi4xNTAyNjIgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xMDQzNTkgLTAuMTQ4MDU1Cit2IC0wLjA0Mzg2MyAtMi4xNDU5NDggLTAuMTQ4MDU1Cit2IC0wLjAwNTMzNSAtMi4xMDQxNTIgLTAuMTQ4MDU1Cit2IC0wLjAwOTc0MCAtMi4wNTY1NTAgLTAuMTQ4MDU1Cit2IC0wLjAwOTAxNyAtMi4wNjY5ODAgLTAuMTQ4MDU1Cit2IC0wLjAwNzYyNiAtMi4xMDIxNzkgLTAuMTQ4MDU1Cit2IC0wLjAxMzM4MiAtMi4xMDIxODAgLTAuMTQ4MDU1Cit2IC0wLjAxMjQ3MSAtMi4wNTk1MzggLTAuMTQ4MDU1Cit2IC0wLjAxMjQ2OSAtMi4wNjQ1NjYgLTAuMTQ4MDU1Cit2IC0wLjA5MTgzNiAtMi4xNDU5NTYgLTAuMTQ4MDU1Cit2IC0wLjA0MTA0NyAtMi4xNTgwMjQgLTAuMTQ4MDU1Cit2IC0wLjA0MTA0OCAtMi4xNDc1MzUgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xNDc1MzQgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xNTgwMTkgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xMjY0NTIgLTAuMTQ4MDU1Cit2IC0wLjA4NTgyMSAtMi4xNjAyNTMgLTAuMTQ4MDU1Cit2IC0wLjA0Mzc3MSAtMi4xNjAyNDggLTAuMTQ4MDU1Cit2IC0wLjAyMDg3NyAtMi4xODg2MTAgLTAuMTQ4MDU1Cit2IC0wLjAzODc0OSAtMi4xODg2MTUgLTAuMTQ4MDU2Cit2IC0wLjAxNTAzNCAtMi4xODI4ODAgLTAuMTQ4MDU1Cit2IC0wLjA5MTc5NCAtMi4xNjU4NzQgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xNjY0MjUgLTAuMTQ4MDU1Cit2IC0wLjAxNTAzNCAtMi4xNjM2MjMgLTAuMTQ4MDU1Cit2IC0wLjAzNDIxOSAtMi4xODg2MTMgLTAuMTQ4MDU2Cit2IC0wLjA0MDkwNyAtMi4xOTA4MzAgLTAuMTQ4MDU2Cit2IC0wLjA4MDI5NSAtMi4xOTI0MjcgLTAuMTQ4MDU1Cit2IC0wLjA4NTAyOSAtMi4xODQ0NTYgLTAuMTQ4MDU1Cit2IC0wLjA0MDkwNSAtMi4xOTg0MzcgLTAuMTQ4MDU2Cit2IC0wLjAzOTI4NSAtMi4yMDAzODcgLTAuMTQ4MDU2Cit2IC0wLjAwNTMyNiAtMi4xOTg0MjkgLTAuMTQ4MDU1Cit2IC0wLjAyMjkxNCAtMi4yMDAzNzggLTAuMTQ4MDU1Cit2IC0wLjAwNTMyOSAtMi4xNjcwNzQgLTAuMTQ4MDU1Cit2IC0wLjQwNTU1OCAtMi4yMDE5NDYgLTAuMTUwNDg0Cit2IC0wLjQwNTU1OCAtMi4xMzQxNDYgLTAuMTUwNDg0Cit2IC0wLjM0MDUyMCAtMi4xMzQxMzUgLTAuMTUwNDg0Cit2IC0wLjM0MDUxOSAtMi4xNjU1NjYgLTAuMTUwNDg0Cit2IC0wLjM2NTQzMyAtMi4xNjU1NDAgLTAuMTUwNDg0Cit2IC0wLjM2NTQ4MiAtMi4xODMyODEgLTAuMTUwNDg0Cit2IC0wLjMzMzI2MiAtMi4xOTQyNzYgLTAuMTUwNDg0Cit2IC0wLjMxMzQ0MCAtMi4xODMxOTMgLTAuMTUwNDg0Cit2IC0wLjMwNDgxNCAtMi4xNjIwMDcgLTAuMTUwNDg0Cit2IC0wLjMwNDA5MyAtMi4xNDIxMDcgLTAuMTUwNDg0Cit2IC0wLjMxMDYxOSAtMi4xMTg2MjYgLTAuMTUwNDg0Cit2IC0wLjMyNDQzMSAtMi4xMDUwODQgLTAuMTUwNDg0Cit2IC0wLjM0MzU1MyAtMi4xMDAxMzkgLTAuMTUwNDg0Cit2IC0wLjM1NzUzOSAtMi4xMDE2OTMgLTAuMTUwNDg0Cit2IC0wLjQwMjk2NCAtMi4wOTYzMzggLTAuMTUwNDg0Cit2IC0wLjM5MjcxNyAtMi4wODQ5MTAgLTAuMTUwNDg0Cit2IC0wLjM4MjMwNiAtMi4wNzgyODYgLTAuMTUwNDg0Cit2IC0wLjM2NDAxMSAtMi4wNzIyNzUgLTAuMTUwNDg0Cit2IC0wLjM0MTkyOSAtMi4wNzAwNjggLTAuMTUwNDg0Cit2IC0wLjMxNzU1OSAtMi4wNzM2NjYgLTAuMTUwNDg0Cit2IC0wLjI5MDM5MCAtMi4wOTE1MDYgLTAuMTUwNDg0Cit2IC0wLjI3NDM2MSAtMi4xMTU3NDEgLTAuMTUwNDg0Cit2IC0wLjI2OTgwMiAtMi4xNDE0NjQgLTAuMTUwNDg0Cit2IC0wLjI3MjgyMyAtMi4xNjk4NDQgLTAuMTUwNDg0Cit2IC0wLjI4NTEyNCAtMi4xOTgxMzMgLTAuMTUwNDg0Cit2IC0wLjMwNTQ4MCAtMi4yMTUxNDkgLTAuMTUwNDg0Cit2IC0wLjMyNjU2OSAtMi4yMjI4NDEgLTAuMTUwNDg0Cit2IC0wLjM0ODE0MyAtMi4yMjQxNDQgLTAuMTUwNDg0Cit2IC0wLjM2NjgyNCAtMi4yMjE0OTQgLTAuMTUwNDg0Cit2IC0wLjM5NDg5OCAtMi4wOTQ3NDQgLTAuMTUyOTI1Cit2IC0wLjM4OTI4MSAtMi4wODg1OTUgLTAuMTUyOTI1Cit2IC0wLjM4MDMwMCAtMi4wODMwMTIgLTAuMTUyOTI1Cit2IC0wLjM2MjY0MyAtMi4wNzcxMDYgLTAuMTUyOTI1Cit2IC0wLjM0MTc1NCAtMi4wNzUwNjQgLTAuMTUyOTI1Cit2IC0wLjMxODkyOSAtMi4wNzg1NzYgLTAuMTUyOTI1Cit2IC0wLjI5NDA4MyAtMi4wOTUxODYgLTAuMTUyOTI1Cit2IC0wLjI3OTE4MCAtMi4xMTcxNzggLTAuMTUyOTI1Cit2IC0wLjI3NDc3NCAtMi4xNDE0MTkgLTAuMTUyOTI1Cit2IC0wLjI3NzU4MiAtMi4xNjgzOTcgLTAuMTUyOTI2Cit2IC0wLjI4ODgwNiAtMi4xOTQ2MjAgLTAuMTUyOTI2Cit2IC0wLjMwNjk1OCAtMi4yMTAzNjkgLTAuMTUyOTI2Cit2IC0wLjMyNzk3MyAtMi4yMTgwODYgLTAuMTUyOTI2Cit2IC0wLjM0ODAzNyAtMi4yMTkxOTUgLTAuMTUyOTI2Cit2IC0wLjM2NTkxMiAtMi4yMTYzNDYgLTAuMTUyOTI2Cit2IC0wLjQwMDYzMiAtMi4xMzkxMjEgLTAuMTUyOTI2Cit2IC0wLjM0NTQ1OCAtMi4xMzkxMTIgLTAuMTUyOTI1Cit2IC0wLjM0NTQ1NyAtMi4xNjA3NTkgLTAuMTUyOTI2Cit2IC0wLjM3MDk0NSAtMi4xNjA3NjkgLTAuMTUyOTI2Cit2IC0wLjM3MDg2NyAtMi4xODUzNzEgLTAuMTUyOTI2Cit2IC0wLjMzMjY4MyAtMi4xOTk3MzcgLTAuMTUyOTI2Cit2IC0wLjMwOTUzOCAtMi4xODY2MzcgLTAuMTUyOTI2Cit2IC0wLjI5OTkxMSAtMi4xNjMxNTggLTAuMTUyOTI2Cit2IC0wLjI5OTEyNyAtMi4xNDE4MDAgLTAuMTUyOTI1Cit2IC0wLjMwNTk2NyAtMi4xMTY2MTEgLTAuMTUyOTI1Cit2IC0wLjMyMTYzNCAtMi4xMDA3MDkgLTAuMTUyOTI1Cit2IC0wLjM0MjQ0OSAtMi4wOTUwOTggLTAuMTUyOTI1Cit2IC0wLjM1OTAyMyAtMi4wOTY4MTYgLTAuMTUyOTI1Cit2IC0wLjM0MDUxOSAtMi4xNTcxNzcgLTAuMTUwNDg0Cit2IC0wLjQwNTU1OCAtMi4xNTcxODIgLTAuMTUwNDg0Cit2IC0wLjQwMDYyOSAtMi4xNTcxODIgLTAuMTUyOTI2Cit2IC0wLjM0NTQ1NiAtMi4xNTcxNzggLTAuMTUyOTI2Cit2IC0wLjM0MDUyMCAtMi4xNDQ3MzEgLTAuMTUwNDg0Cit2IC0wLjM0NTQ1OSAtMi4xNDQ3MzIgLTAuMTUyOTI2Cit2IC0wLjQwNTU1OCAtMi4xNDQ3MzYgLTAuMTUwNDg0Cit2IC0wLjQwMDYzMSAtMi4xNDQ3MzYgLTAuMTUyOTI2Cit2IC0wLjM3OTI2NiAtMi4xMzQxNDIgLTAuMTUwNDg0Cit2IC0wLjM3OTI1NyAtMi4yMTc1OTIgLTAuMTUwNDg0Cit2IC0wLjM3OTI2NiAtMi4xMzkxMTggLTAuMTUyOTI2Cit2IC0wLjM3OTI2NCAtMi4xNTcxODEgLTAuMTUyOTI2Cit2IC0wLjM3OTI2NiAtMi4xNDQ3MzQgLTAuMTUyOTI2Cit2IC0wLjM5NTc3OCAtMi4xMzQxNDUgLTAuMTUwNDg0Cit2IC0wLjM5NTc3NyAtMi4xMzkxMjAgLTAuMTUyOTI2Cit2IC0wLjM5NTc2OCAtMi4yMDk3NTAgLTAuMTUwNDg0Cit2IC0wLjM5NTc2OCAtMi4xNTcxODIgLTAuMTUyOTI2Cit2IC0wLjM5NTc3NyAtMi4xNDQ3MzUgLTAuMTUyOTI2Cit2IC0wLjM0Nzg5OCAtMi4xNjU1NzcgLTAuMTUwNDg0Cit2IC0wLjM0NzkwMCAtMi4xNjA3NjAgLTAuMTUyOTI2Cit2IC0wLjM0NzkwMCAtMi4xNTcxNzggLTAuMTUyOTI2Cit2IC0wLjM0NzkwNCAtMi4xNDQ3MzIgLTAuMTUyOTI2Cit2IC0wLjM0NzkwNiAtMi4xMzQxMzYgLTAuMTUwNDg0Cit2IC0wLjM0NzkwNCAtMi4xMzkxMTIgLTAuMTUyOTI2Cit2IC0wLjM1Nzc5MSAtMi4xMzQxMzkgLTAuMTUwNDg0Cit2IC0wLjM1Nzc4OSAtMi4xMzkxMTUgLTAuMTUyOTI2Cit2IC0wLjM1Nzc4MyAtMi4xNjU1OTkgLTAuMTUwNDg0Cit2IC0wLjM1Nzc4NSAtMi4xNjA3NjYgLTAuMTUyOTI2Cit2IC0wLjM1Nzc4NSAtMi4xNTcxNzkgLTAuMTUyOTI2Cit2IC0wLjM1Nzc4OSAtMi4xNDQ3MzMgLTAuMTUyOTI2Cit2IC0wLjM2NTQ0OSAtMi4xNzI0MzYgLTAuMTUwNDg0Cit2IC0wLjM3MDg4OSAtMi4xNzI0MzYgLTAuMTUyOTI2Cit2IC0wLjQwNTU1OCAtMi4xNzI0MzggLTAuMTUwNDg0Cit2IC0wLjQwMDYyNyAtMi4xNzI0MzggLTAuMTUyOTI2Cit2IC0wLjM3OTI2MyAtMi4xNzI0MzcgLTAuMTUyOTI2Cit2IC0wLjM5NTc2OCAtMi4xNzI0MzggLTAuMTUyOTI2Cit2IC0wLjM3OTI1OCAtMi4yMTI2ODAgLTAuMTUyOTI2Cit2IC0wLjM5NTc2OCAtMi4yMDQ2MDIgLTAuMTUyOTI2Cit2IC0wLjQwMDYyMiAtMi4yMDA0NDMgLTAuMTUyOTI2Cit2IC0wLjQwNTU1OCAtMi4xOTgxNjkgLTAuMTUwNDg0Cit2IC0wLjQwNTU1OCAtMi4yMDE5ODMgLTAuMTQ0NzQ3Cit2IC0wLjM5MjY5OCAtMi4wODQ4OTcgLTAuMTQ0NzQ3Cit2IC0wLjM4MjI5MSAtMi4wNzgyODEgLTAuMTQ0NzQ3Cit2IC0wLjM2NDAxMCAtMi4wNzIyNjggLTAuMTQ0NzQ3Cit2IC0wLjM0MTkyOCAtMi4wNzAwNjMgLTAuMTQ0NzQ3Cit2IC0wLjMxNzU1OCAtMi4wNzM2NzUgLTAuMTQ0NzQ3Cit2IC0wLjI5MDM4OSAtMi4wOTE1MDMgLTAuMTQ0NzQ3Cit2IC0wLjI3NDM2MCAtMi4xMTU3NDIgLTAuMTQ0NzQ3Cit2IC0wLjI2OTgwMSAtMi4xNDE0MzkgLTAuMTQ0NzQ3Cit2IC0wLjI3MjgyMiAtMi4xNjk4MzYgLTAuMTQ0NzQ3Cit2IC0wLjI4NTEyMiAtMi4xOTgxMTYgLTAuMTQ0NzQ3Cit2IC0wLjMwNTQ3OSAtMi4yMTUxNjMgLTAuMTQ0NzQ3Cit2IC0wLjMyNjU3MCAtMi4yMjI4MzcgLTAuMTQ0NzQ3Cit2IC0wLjM0ODE0NyAtMi4yMjQxMzEgLTAuMTQ0NzQ3Cit2IC0wLjM2NjgyNiAtMi4yMjE0NzkgLTAuMTQ0NzQ3Cit2IC0wLjQwNTU1OCAtMi4xNTcxODEgLTAuMTQ0NzQ3Cit2IC0wLjQwNTU1OCAtMi4xNDQ3MzUgLTAuMTQ0NzQ3Cit2IC0wLjM3OTI1NyAtMi4yMTc2MzAgLTAuMTQ0NzQ3Cit2IC0wLjM5NTc2OCAtMi4yMDk3ODggLTAuMTQ0NzQ3Cit2IC0wLjQwNTU1OCAtMi4xNzI0MzggLTAuMTQ0NzQ3Cit2IC0wLjQwNTU1OCAtMi4xOTgxNTkgLTAuMTQ0NzQ3Cit2IC0wLjM5ODk0MCAtMi4wOTU1NjAgLTAuMTUyOTI1Cit2IC0wLjM5MTAwNiAtMi4wODY3NzkgLTAuMTUyOTI1Cit2IC0wLjM4MTMwOCAtMi4wODA2NzggLTAuMTUyOTI1Cit2IC0wLjM2MzMyOCAtMi4wNzQ3MTkgLTAuMTUyOTI1Cit2IC0wLjM0MTg0MiAtMi4wNzI1OTYgLTAuMTUyOTI1Cit2IC0wLjMxODI0NSAtMi4wNzYxNTkgLTAuMTUyOTI1Cit2IC0wLjI5MjIzNyAtMi4wOTMzNzcgLTAuMTUyOTI1Cit2IC0wLjI3Njc3MSAtMi4xMTY0NzcgLTAuMTUyOTI1Cit2IC0wLjI3MjI4OCAtMi4xNDE0NDcgLTAuMTUyOTI1Cit2IC0wLjI3NTIwMyAtMi4xNjkxNTEgLTAuMTUyOTI2Cit2IC0wLjI4Njk2NSAtMi4xOTY0MDMgLTAuMTUyOTI2Cit2IC0wLjMwNjIxOSAtMi4yMTI3NzcgLTAuMTUyOTI2Cit2IC0wLjMyNzI2NSAtMi4yMjA0ODAgLTAuMTUyOTI2Cit2IC0wLjM0ODA4MiAtMi4yMjE2ODcgLTAuMTUyOTI2Cit2IC0wLjM2NjM5MyAtMi4yMTg5NDQgLTAuMTUyOTI2Cit2IC0wLjQwMzA4NyAtMi4yMDA5ODggLTAuMTUyOTI2Cit2IC0wLjQwMzA5OCAtMi4xMzY2NjEgLTAuMTUyOTI2Cit2IC0wLjM0MzAxOSAtMi4xMzY2NTcgLTAuMTUyOTI1Cit2IC0wLjM0Mjk3MCAtMi4xNjMxNDQgLTAuMTUyOTI2Cit2IC0wLjM2NzgyNyAtMi4xNjMxNDYgLTAuMTUyOTI2Cit2IC0wLjM2Nzc4NyAtMi4xODQzOTQgLTAuMTUyOTI2Cit2IC0wLjMzMjk3MyAtMi4xOTcwMzYgLTAuMTUyOTI2Cit2IC0wLjMxMTQ4OSAtMi4xODQ5NDQgLTAuMTUyOTI2Cit2IC0wLjMwMjM2MyAtMi4xNjI2MTEgLTAuMTUyOTI2Cit2IC0wLjMwMTYxMCAtMi4xNDIxMDcgLTAuMTUyOTI1Cit2IC0wLjMwODI5MyAtMi4xMTc2MzcgLTAuMTUyOTI1Cit2IC0wLjMyMzAzMyAtMi4xMDI5MTQgLTAuMTUyOTI1Cit2IC0wLjM0MzAwNyAtMi4wOTc2NDUgLTAuMTUyOTI1Cit2IC0wLjM1ODI5MCAtMi4wOTkyODAgLTAuMTUyOTI1Cit2IC0wLjQwMzA5NSAtMi4xNTcxODIgLTAuMTUyOTI2Cit2IC0wLjM0Mjk1NSAtMi4xNTcxNzcgLTAuMTUyOTI2Cit2IC0wLjM0MzAxMyAtMi4xNDQ3MzIgLTAuMTUyOTI2Cit2IC0wLjQwMzA5NyAtMi4xNDQ3MzYgLTAuMTUyOTI2Cit2IC0wLjM3OTI1NyAtMi4yMTUxODggLTAuMTUyOTI2Cit2IC0wLjM3OTI2NiAtMi4xMzY2NjAgLTAuMTUyOTI2Cit2IC0wLjM5NTc3OCAtMi4xMzY2NjEgLTAuMTUyOTI2Cit2IC0wLjM5NTc2OCAtMi4yMDcxNjQgLTAuMTUyOTI2Cit2IC0wLjM0Nzg5OSAtMi4xNjMxNTEgLTAuMTUyOTI2Cit2IC0wLjM0NzkwNSAtMi4xMzY2NTggLTAuMTUyOTI1Cit2IC0wLjM1Nzc5MCAtMi4xMzY2NTkgLTAuMTUyOTI2Cit2IC0wLjM1Nzc4NCAtMi4xNjMxNjcgLTAuMTUyOTI2Cit2IC0wLjM2Nzc5OSAtMi4xNzI0MzYgLTAuMTUyOTI2Cit2IC0wLjQwMzA5NCAtMi4xNzI0MzggLTAuMTUyOTI2Cit2IC0wLjQwMzA4OSAtMi4xOTgxNzIgLTAuMTUyOTI2Cit2IC0wLjQwNTU1OCAtMi4xMzQxNDUgLTAuMTQ0NzQ3Cit2IC0wLjM0MDUyMCAtMi4xMzQxMzQgLTAuMTQ0NzQ3Cit2IC0wLjM0MDUxOSAtMi4xNjU1NTYgLTAuMTQ0NzQ3Cit2IC0wLjM2NTQzMiAtMi4xNjU1MzAgLTAuMTQ0NzQ3Cit2IC0wLjM2NTQ3OCAtMi4xODMyNzMgLTAuMTQ0NzQ3Cit2IC0wLjMzMzI2MCAtMi4xOTQyNjYgLTAuMTQ0NzQ3Cit2IC0wLjMxMzQzOSAtMi4xODMxODggLTAuMTQ0NzQ3Cit2IC0wLjMwNDgxMyAtMi4xNjE5OTYgLTAuMTQ0NzQ3Cit2IC0wLjMwNDA5MiAtMi4xNDIxMDggLTAuMTQ0NzQ3Cit2IC0wLjMxMDYxOCAtMi4xMTg2MjggLTAuMTQ0NzQ3Cit2IC0wLjMyNDQyOSAtMi4xMDUwODUgLTAuMTQ0NzQ3Cit2IC0wLjM0MzUzNCAtMi4xMDAxNTQgLTAuMTQ0NzQ3Cit2IC0wLjM1NzUxNSAtMi4xMDE2ODcgLTAuMTQ0NzQ3Cit2IC0wLjQwMjk1OSAtMi4wOTYzMzcgLTAuMTQ0NzQ3Cit2IC0wLjM0MDUxOSAtMi4xNTcxNzYgLTAuMTQ0NzQ3Cit2IC0wLjM0MDUyMCAtMi4xNDQ3MzEgLTAuMTQ0NzQ3Cit2IC0wLjM3OTI2NiAtMi4xMzQxNDEgLTAuMTQ0NzQ3Cit2IC0wLjM5NTc3OCAtMi4xMzQxNDQgLTAuMTQ0NzQ3Cit2IC0wLjM0Nzg5OCAtMi4xNjU1NjggLTAuMTQ0NzQ3Cit2IC0wLjM0NzkwNiAtMi4xMzQxMzUgLTAuMTQ0NzQ3Cit2IC0wLjM1Nzc5MSAtMi4xMzQxMzggLTAuMTQ0NzQ3Cit2IC0wLjM1Nzc4MyAtMi4xNjU1OTAgLTAuMTQ0NzQ3Cit2IC0wLjM2NTQ0NyAtMi4xNzI0MzYgLTAuMTQ0NzQ3Cit2IC0wLjEyNjIyMyAtMi4xNzA0MjYgLTAuMTUyOTI1Cit2IC0wLjEwNzE1NSAtMi4xNjU5NTkgLTAuMTUyOTI1Cit2IC0wLjEyOTM2MiAtMi4xNzEwMTUgLTAuMTUwNDgzCit2IC0wLjEyNzc5MyAtMi4xNzA3NTEgLTAuMTUyOTI1Cit2IC0wLjEwNDAyNCAtMi4xNjUxMTIgLTAuMTUwNDU4Cit2IC0wLjEwNTU5MCAtMi4xNjU1NTkgLTAuMTUyOTI1Cit2IC0wLjEyOTM2MSAtMi4xNzEwMDcgLTAuMTQ0NzQ2Cit2IC0wLjEwNDAyMyAtMi4xNjUwNjUgLTAuMTQ4MDU1Cit2IC0wLjM2OTUwOCAtMi4xMDQyNjQgLTAuMTUyOTI1Cit2IC0wLjM2ODYwNyAtMi4xMDY1NTUgLTAuMTUwNDg0Cit2IC0wLjM3MDgyNCAtMi4xMDE4MTkgLTAuMTUyOTI1Cit2IC0wLjM2ODYwMCAtMi4xMDY1NTEgLTAuMTQ0NzQ3Cit2IC0wLjM4MTM5NCAtMi4xMDg5ODQgLTAuMTUyOTI1Cit2IC0wLjM4MTU2MSAtMi4xMTMwODYgLTAuMTUyOTI1Cit2IC0wLjM4MTgzNCAtMi4xMTYwOTggLTAuMTUwNDg0Cit2IC0wLjM4MTgzMiAtMi4xMTYxMTYgLTAuMTQ0NzQ3Cit2IC0wLjQwMTIxMiAtMi4yMDMzNzUgLTAuMTUyOTI2Cit2IC0wLjQwMTgzNSAtMi4yMDUyMjcgLTAuMTUwNDg0Cit2IC0wLjQwMTgzNSAtMi4yMDUyNjUgLTAuMTQ0NzQ3Cit2IC0wLjQwNTU1OCAtMi4xODc1MDcgLTAuMTUwNDg0Cit2IC0wLjQwMzA5MSAtMi4xODc1MDcgLTAuMTUyOTI2Cit2IC0wLjM5NTc2OCAtMi4xODc1MjMgLTAuMTUyOTI2Cit2IC0wLjM3OTI2MSAtMi4xODc1NTQgLTAuMTUyOTI2Cit2IC0wLjQwMDYyNSAtMi4xODc1MTQgLTAuMTUyOTI2Cit2IC0wLjQwNTU1OCAtMi4xODc1MDcgLTAuMTQ0NzQ3Cit2IC0wLjM1MzAwMCAtMi4xOTEzODYgLTAuMTUwNDg0Cit2IC0wLjM1NDA3NiAtMi4xOTM3NTkgLTAuMTUyOTI2Cit2IC0wLjM1NTIzNyAtMi4xOTYwNjIgLTAuMTUyOTI2Cit2IC0wLjM1Mjk5OSAtMi4xOTEzNzYgLTAuMTQ0NzQ3Cit2IC0xLjU1Njc1OSAxLjkwNDEzMCAtMC4wMTk4NjUKK3YgLTEuNTc0NzkwIDEuOTA0MTMwIC0wLjAxOTg2NQordiAtMS41NzY3NTkgMS45MDQxMzEgLTAuMDIxODcyCit2IC0xLjU3Njc1OSAxLjkwNDEzMiAtMC4wMjQxNjgKK3YgLTEuNTc2NzU4IDEuNDk1NTEwIC0wLjA3Njc2NQordiAtMS41NzY3NTggMS40OTU1MTAgLTAuMDcwODg4Cit2IC0xLjU1Njc1OSAxLjQ5NTQ2NiAtMC4wMTk5NzQKK3YgLTEuNTM2NzA3IDEuNDk1NTE1IC0wLjExNzQxMwordiAtMS40NTExOTcgMS40OTU1MTUgLTAuMTQ3MzU1Cit2IC0xLjQwMTE5NyAxLjUwNTQyNiAtMC4xNDczNTUKK3YgLTEuMjc4ODY3IDEuNTA1NDI2IC0wLjE0NzM1NAordiAtMS4yMDM4MTggMS41MDU0MjYgLTAuMTQ3MzU0Cit2IC0xLjAyODI3NCAxLjUwNTQyNiAtMC4xNDczNTQKK3YgLTAuMzc5Mzc5IDEuNTA0OTAxIC0wLjE0NzM1MQordiAtMC44MzgxMDUgMS41MDU0MjYgLTAuMTQ3MzUzCit2IC0xLjU3Njc1OSAxLjQ5NTQ5MiAtMC4wMjQxNjkKK3YgMS4xMjI5MDQgMS41MDU0MjYgLTAuMTQ3MzQ1Cit2IC0wLjE0NzYxMiAxLjUwNDkwMSAtMC4xNDczNTAKK3YgMC4wODA4MTggMS41MDQ5MDEgLTAuMTQ3MzQ5Cit2IDEuMjgxNTE2IDEuNTA1NDEyIC0wLjA3MDg3NwordiAxLjI4MTUxNiAxLjUwNTQxMiAtMC4wNzY3NTQKK3YgMS4yNDE0MjYgMS41MDU0MTYgLTAuMTE3NDAyCit2IDEuMTgyMDIwIDEuNTA1NDIxIC0wLjEzODI3NwordiAxLjI4MTUxNSAxLjUwNTQxMiAtMC4wMjE4NjEKK3YgMS4yODE1MTUgMS41MDU0MTIgLTAuMDI0MTU4Cit2IDAuOTgzNjE0IDEuNTA1NDI2IC0wLjE0NzM0NgordiAwLjY0MjE2OCAxLjUwNTQyNiAtMC4xNDczNDcKK3YgMC40MDQ0NzEgMS41MDU0MjYgLTAuMTQ3MzQ4Cit2IDEuMjYxNDc3IDEuNTA1NDEyIC0wLjAxOTk2MwordiAxLjA3MjkwNCAxLjUwNTQyNiAtMC4xNDczNDUKK3YgMC45MDg1OTQgMS41MDU0MjYgLTAuMTQ3MzQ2Cit2IDAuNzQ3NzYxIDEuNTA1NDI2IC0wLjE0NzM0NwordiAwLjUyMjQ0MSAxLjUwNTQyNiAtMC4xNDczNDcKK3YgMS4yNzk1NDYgMS41MDU0MTIgLTAuMDE5OTYzCit2IC0xLjU3Njc1OSAxLjQ5NTQ3OSAtMC4wMjE4NzIKK3YgLTEuNTc0NzkwIDEuNDk1NDY4IC0wLjAxOTk3NAordiAtMS40OTU3NDYgMS40OTU1MTUgLTAuMTM4Mjg3Cit2IC0wLjkzNzQxNSAxLjUwNTQyNiAtMC4xNDczNTMKK3YgMC42NDIxNzggMi4zNTk2MDEgLTAuMTQ3MzQ3Cit2IDAuODI0Mzg2IC0yLjgxOTE5NyAtMC4wNzA4NjIKK3YgMC44MTgzMDIgLTIuODE5MTk3IC0wLjA2NTMxOQordiAwLjgxNzY4NiAtMi43OTQ4MDIgLTAuMDY1MDA2Cit2IDAuNzg5Njg0IC0yLjgwMDIzNSAtMC4wOTU4MjQKK3YgMC43ODk0NjYgLTIuNzk0NjQ5IC0wLjA5NTU5MgordiAwLjcwMjk4MCAtMi43OTc4OTggLTAuMTAxOTQzCit2IDAuNzA1NjM4IC0yLjgwMDIyOCAtMC4wOTU3NzcKK3YgMC43MDU3NjYgLTIuNzk0NjQ5IC0wLjA5NTUyNQordiAwLjY3NTg4NSAtMi43Nzk0MDIgLTAuMTE4NjE0Cit2IDAuODMxODc4IC0yLjc3OTQwMyAtMC4xMTg2MTUKK3YgMC43OTI4MjkgLTIuNzk3ODg4IC0wLjEwMjEzMwordiAwLjY2Nzk0NCAtMi44MTY0MDAgLTAuMDI0MTU5Cit2IDAuNzQ3NzI1IC0yLjc4NjQ3OSAtMC4xMDY0NDEKK3YgMC44Mjc3NDEgLTIuODE2NDAwIC0wLjAyNDE1OQordiAwLjgyODczMyAtMi44MTYzOTkgLTAuMDE5ODY5Cit2IDAuNjc3ODA0IC0yLjgxNjQwMCAtMC4wNjUwMDgKK3YgMC44MTc1MTEgLTIuODE2NDAwIC0wLjA2NTAwNwordiAwLjc4OTM4NiAtMi43OTcxNzggLTAuMDk1NTE4Cit2IDAuNzA1ODIzIC0yLjc5NzA5MyAtMC4wOTU0NTAKK3YgMC42NjU4NDMgLTIuODE2NDAxIC0wLjAxOTg3MAordiAwLjY2NTg1MiAtMi43OTQ4MDIgLTAuMDE5ODcwCit2IDAuNjY2OTE4IC0yLjc5NDgwMiAtMC4wMTk4NzAKK3YgMC42NjY5MTcgLTIuODE2NDAwIC0wLjAxOTg3MAordiAwLjEzODAwMSAxLjIzMjc2NCAtMC4xNjA3MjUKK3YgMC4wOTg5NzQgMS4zNzY4NTggLTAuMTYwNzI1Cit2IC0wLjAwMzUyNCAxLjQ3OTM1NyAtMC4xNjA3MjUKK3YgLTAuMTQ3NjE4IDEuNTE4Mzg0IC0wLjE2MDcyNgordiAtMC4yOTE3MTIgMS40NzkzNTYgLTAuMTYwNzI2Cit2IC0wLjM5NDIxMCAxLjM3Njg1OSAtMC4xNjA3MjcKK3YgLTAuNDMzMjM3IDEuMjMyNzY0IC0wLjE2MDcyNwordiAtMC4zOTQyMTAgMS4wODg2NzAgLTAuMTYwNzI3Cit2IC0wLjI5MTcxMiAwLjk4NjE3MiAtMC4xNjA3MjYKK3YgLTAuMTQ3NjE4IDAuOTQ3MTQ1IC0wLjE2MDcyNgordiAtMC4wMDM1MjQgMC45ODYxNzIgLTAuMTYwNzI1Cit2IDAuMDk4OTc0IDEuMDg4NjcwIC0wLjE2MDcyNQordiAtMC4xNDc2MTggMS40NzE3MDIgLTAuMTYwNzI2Cit2IC0wLjAyNjk4NyAxLjQzOTAzMCAtMC4xNjA3MjUKK3YgMC4wNTg2NDggMS4zNTMzOTUgLTAuMTYwNzI1Cit2IDAuMDkxMzIwIDEuMjMyNzY0IC0wLjE2MDcyNQordiAwLjA1ODY0OCAxLjExMjEzNCAtMC4xNjA3MjUKK3YgLTAuMDI2OTg4IDEuMDI2NDk4IC0wLjE2MDcyNQordiAtMC4xNDc2MTggMC45OTM4MjYgLTAuMTYwNzI2Cit2IC0wLjI2ODI0OCAxLjAyNjQ5OCAtMC4xNjA3MjYKK3YgLTAuMzUzODg0IDEuMTEyMTM0IC0wLjE2MDcyNwordiAtMC4zODY1NTYgMS4yMzI3NjQgLTAuMTYwNzI3Cit2IC0wLjM1Mzg4NCAxLjM1MzM5NSAtMC4xNjA3MjYKK3YgLTAuMjY4MjQ4IDEuNDM5MDMwIC0wLjE2MDcyNgordiAtMC4xNDc2MTggMS41MTAyMjYgLTAuMTY1OTM1Cit2IC0wLjE0NzYxOCAxLjQ3OTE2NiAtMC4xNjU5MzUKK3YgLTAuMDA3NjA4IDEuNDcyMzA1IC0wLjE2NTkzNQordiAtMC4wMjMyNTEgMS40NDU0ODIgLTAuMTY1OTM1Cit2IDAuMDkxOTIzIDEuMzcyNzc0IC0wLjE2NTkzNQordiAwLjA2NTEwMCAxLjM1NzEzMSAtMC4xNjU5MzUKK3YgMC4xMjk4NDQgMS4yMzI3NjQgLTAuMTY1OTM0Cit2IDAuMDk4Nzg0IDEuMjMyNzY0IC0wLjE2NTkzNQordiAwLjA5MTkyMyAxLjA5Mjc1NCAtMC4xNjU5MzUKK3YgMC4wNjUxMDAgMS4xMDgzOTcgLTAuMTY1OTM1Cit2IC0wLjAwNzYwOCAwLjk5MzIyNCAtMC4xNjU5MzUKK3YgLTAuMDIzMjUxIDEuMDIwMDQ2IC0wLjE2NTkzNQordiAtMC4xNDc2MTggMC45NTUzMDMgLTAuMTY1OTM2Cit2IC0wLjE0NzYxOCAwLjk4NjM2MiAtMC4xNjU5MzYKK3YgLTAuMjg3NjI4IDAuOTkzMjI0IC0wLjE2NTkzNgordiAtMC4yNzE5ODUgMS4wMjAwNDYgLTAuMTY1OTM2Cit2IC0wLjM4NzE1OSAxLjA5Mjc1NCAtMC4xNjU5MzYKK3YgLTAuMzYwMzM2IDEuMTA4Mzk3IC0wLjE2NTkzNgordiAtMC40MjUwNzkgMS4yMzI3NjQgLTAuMTY1OTM3Cit2IC0wLjM5NDAyMCAxLjIzMjc2NCAtMC4xNjU5MzYKK3YgLTAuMzg3MTU5IDEuMzcyNzc1IC0wLjE2NTkzNgordiAtMC4zNjAzMzYgMS4zNTcxMzEgLTAuMTY1OTM2Cit2IC0wLjI4NzYyOCAxLjQ3MjMwNSAtMC4xNjU5MzYKK3YgLTAuMjcxOTg1IDEuNDQ1NDgyIC0wLjE2NTkzNgordiAwLjEzODAwMSAxLjIzMjc2NCAtMC4xMzk1MTAKK3YgMC4wOTg5NzQgMS4zNzY4NTggLTAuMTM5NTEwCit2IC0wLjAwMzUyNCAxLjQ3OTM1NyAtMC4xMzk1MTAKK3YgLTAuMTQ3NjE4IDEuNTE4Mzg0IC0wLjEzOTUxMQordiAtMC4yOTE3MTIgMS40NzkzNTYgLTAuMTM5NTExCit2IC0wLjM5NDIxMCAxLjM3Njg1OSAtMC4xMzk1MTIKK3YgLTAuNDMzMjM3IDEuMjMyNzY0IC0wLjEzOTUxMgordiAtMC4zOTQyMTAgMS4wODg2NzAgLTAuMTM5NTEyCit2IC0wLjI5MTcxMiAwLjk4NjE3MiAtMC4xMzk1MTEKK3YgLTAuMTQ3NjE4IDAuOTQ3MTQ1IC0wLjEzOTUxMQordiAtMC4wMDM1MjQgMC45ODYxNzIgLTAuMTM5NTEwCit2IDAuMDk4OTc0IDEuMDg4NjcwIC0wLjEzOTUxMAordiAtMC4xNDc2MTggMS40NzE3MDIgLTAuMTM5NTExCit2IC0wLjAyNjk4OCAxLjQzOTAzMCAtMC4xMzk1MTAKK3YgMC4wNTg2NDggMS4zNTMzOTUgLTAuMTM5NTEwCit2IDAuMDkxMzIwIDEuMjMyNzY0IC0wLjEzOTUxMAordiAwLjA1ODY0OCAxLjExMjEzNCAtMC4xMzk1MTAKK3YgLTAuMDI2OTg4IDEuMDI2NDk4IC0wLjEzOTUxMAordiAtMC4xNDc2MTggMC45OTM4MjYgLTAuMTM5NTExCit2IC0wLjI2ODI0OCAxLjAyNjQ5OCAtMC4xMzk1MTEKK3YgLTAuMzUzODg0IDEuMTEyMTM0IC0wLjEzOTUxMgordiAtMC4zODY1NTYgMS4yMzI3NjQgLTAuMTM5NTEyCit2IC0wLjM1Mzg4NCAxLjM1MzM5NSAtMC4xMzk1MTIKK3YgLTAuMjY4MjQ4IDEuNDM5MDMwIC0wLjEzOTUxMQordiAtMC4yNzEzNjEgMi40NDkxNzggLTAuMTk0MzI0Cit2IC0wLjM3MjQ3OCAyLjM4MDk3OCAtMC4xOTQzMjUKK3YgLTAuNDQwNjM1IDIuMjc5ODk2IC0wLjE5NDMyNQordiAtMC40NjU2NDEgMi4xNTYxMTcgLTAuMTk0MzI1Cit2IC0wLjQ0MDY1MCAyLjAzMjQxNyAtMC4xOTQzMjUKK3YgLTAuMzcyNDgzIDEuOTMxMjczIC0wLjE5NDMyNQordiAtMC4yNzEzNTcgMS44NjMwMzIgLTAuMTk0MzI0Cit2IC0wLjE0NzYxMiAyLjQ3NDIwNCAtMC4xOTQzMjMKK3YgLTAuMDIzODcwIDIuNDQ5MTc4IC0wLjE5NDMyMwordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTQzMjMKK3YgMC4xNDU0NTggMi4yNzk4OTIgLTAuMTk0MzIzCit2IDAuMTcwNDg4IDIuMTU2MTE3IC0wLjE5NDMyMgordiAwLjE0NTM4NiAyLjAzMjQxMCAtMC4xOTQzMjMKK3YgMC4wNzcyMzUgMS45MzEyOTMgLTAuMTk0MzIzCit2IC0wLjAyMzgxMiAxLjg2MzAzMiAtMC4xOTQzMjMKK3YgLTAuMTQ3NjEyIDEuODM4MTIxIC0wLjE5NDMyNAordiAwLjY2Nzk0NCAtMi43NTA1NzMgLTAuMDI0MTYwCit2IDAuNzQ3NzQzIC0yLjc1MDU1MyAtMC4xMDY1ODcKK3YgMC44Mjc3NzYgLTIuNzUwNTczIC0wLjAyNDE2MAordiAwLjgyODczNSAtMi43NTA1NzMgLTAuMDE5ODY5Cit2IDAuNjc3ODYyIC0yLjc1MDU3MyAtMC4wNjUwMTUKK3YgMC44MTc2ODYgLTIuNzUwNTczIC0wLjA2NTAwNgordiAwLjc4OTQ2NiAtMi43NTA1NTUgLTAuMDk1NTkyCit2IDAuNzA1NzY2IC0yLjc1MDU1NSAtMC4wOTU1MjUKK3YgMC42NjY5MTggLTIuNzUwNTczIC0wLjAxOTg3MAordiAtMC4zMjU4MTYgLTIuNzUwNTI0IC0wLjAyMDM5MQordiAwLjAzMjIyNyAtMi43NTA1MjUgLTAuMDE5ODcxCit2IC0wLjMyNTAwOCAtMi43NTA1MjQgLTAuMDIxODc1Cit2IC0wLjMyMzQ2NyAtMi43NTA1MjQgLTAuMDI0MTYyCit2IC0wLjMxNjU2NyAtMi43NTA1MjMgLTAuMDM0NDIwCit2IC0wLjI4ODIzNiAtMi43NTA1MjMgLTAuMDQ2MDI2Cit2IC0wLjAwNzA0MSAtMi43NTA1MjMgLTAuMDQ2MDI0Cit2IDAuMDIxMjM3IC0yLjc1MDUyMyAtMC4wMzQ0MzEKK3YgMC4wMjgyNjAgLTIuNzUwNTI0IC0wLjAyNDE2MgordiAwLjAyOTgwMyAtMi43NTA1MjQgLTAuMDIxODc0Cit2IC0wLjI2OTUwMCAtMi43NTA1MjMgLTAuMDQ2MDI2Cit2IC0wLjAyNjE2NSAtMi43NTA1MjMgLTAuMDQ2MDI0Cit2IDAuMDMwOTkxIC0yLjc1MDUyNCAtMC4wMjAzOTAKK3YgLTAuMTQ3NjEzIC0yLjc1MDUyMyAtMC4wNDYwMjQKK3YgLTAuNTY0MzEyIDIuMTU2MTE4IC0wLjE2MzU4MQordiAtMC4zMDk3MzQgMi41NDA2OTMgLTAuMTYzNTgwCit2IC0wLjQ0MjI5NSAyLjQ1MTE3OSAtMC4xNjM1ODEKK3YgLTAuNTMxNTQwIDIuMzE4ODg1IC0wLjE2MzU4MQordiAtMC41MzE1NDcgMS45OTQ2NTMgLTAuMTYzNTgxCit2IC0wLjQ0NTA3MyAxLjg1ODYyOSAtMC4xNjM2NjYKK3YgLTAuMzA5Mzc4IDEuNzcyNzk1IC0wLjE2MzU4MAordiAwLjIzNjMzMyAyLjMxODg4MyAtMC4xNjM1NzgKK3YgMC4yNjg1NDQgMi4xNTYxMTggLTAuMTYzNTc4Cit2IDAuMjM2Mjk4IDEuOTk0NjUwIC0wLjE2MzU3OAordiAtMC4xNDc2MTIgMi41NzM1MzEgLTAuMTYzNTc5Cit2IDAuMDE0NTAxIDIuNTQwNjkzIC0wLjE2MzU3OQordiAwLjE0NzA1NiAyLjQ1MTE4NiAtMC4xNjM1NzgKK3YgMC4xNTAwNzAgMS44NTgxNTMgLTAuMTYzNTc5Cit2IDAuMDE0NTI5IDEuNzcyNzk1IC0wLjE2MzU3OQordiAtMC4xNDc2MTIgMS43NDAwNjkgLTAuMTYzNTgwCit2IC0wLjIwMjk2MyAwLjA1MjAzOSAtMC4xNDczNTEKK3YgLTAuMjAyOTYzIDAuMDUyMDM5IC0wLjE0NzM1MQordiAtMC4yMDM1NzAgMC4wMzMyODUgLTAuMTQ3MzUxCit2IC0wLjIwNDE3NiAwLjAxNDUzMSAtMC4xNDczNTEKK3YgLTAuMjA0MTc2IDAuMDE0NTMxIC0wLjE0NzM1MQordiAtMC4yMTM4MzIgMC4wMTc5MzMgLTAuMTQ3MzUxCit2IC0wLjI1OTM1MSAwLjAzMzk3MSAtMC4xNDczNTEKK3YgLTAuMjU5MzUxIDAuMDMzOTcxIC0wLjE0NzM1MQordiAtMC4zMDI3MjggMC4wODkxNDMgLTAuMTQ3MzUyCit2IC0wLjMwMjcyOCAwLjA4OTE0MyAtMC4xNDczNTIKK3YgLTAuMzAyNzI4IDAuMDg5MTQzIC0wLjE0NzM1MgordiAtMC4zMTk1MjkgMC4xODAwNDMgLTAuMTQ3MzUyCit2IC0wLjMxOTUyOSAwLjE4MDA0MyAtMC4xNDczNTIKK3YgLTAuMzE5NTI5IDAuMTgwMDQzIC0wLjE0NzM1MgordiAtMC4yOTc4ODEgMC4yNjg1NTQgLTAuMTQ3MzUyCit2IC0wLjI5Nzg4MSAwLjI2ODU1NCAtMC4xNDE0ODIKK3YgLTAuMjk3ODgxIDAuMjY4NTU0IC0wLjE0NzM1MgordiAtMC4yOTc4ODEgMC4yNjg1NTQgLTAuMTQ3MzUyCit2IC0wLjI0OTI0MCAwLjMxMDExNSAtMC4xNDczNTIKK3YgLTAuMjQ5MjQwIDAuMzEwMTE1IC0wLjE0NzM1MgordiAtMC4yNDkyNDAgMC4zMTAxMTUgLTAuMTQ3MzUyCit2IC0wLjE5MzcwNSAwLjMwMzcxNCAtMC4xNDczNTEKK3YgLTAuMTkzNzA1IDAuMzAzNzE0IC0wLjE0MTQ4MgordiAtMC4xOTM3MDUgMC4zMDM3MTQgLTAuMTQ3MzUxCit2IC0wLjE5MzcwNSAwLjMwMzcxNCAtMC4xNDczNTEKK3YgLTAuMTU4MjUxIDAuMjY3OTgwIC0wLjE0NzM1MQordiAtMC4xNTgyNTEgMC4yNjc5ODAgLTAuMTQ3MzUxCit2IC0wLjE1ODI1MSAwLjI2Nzk4MCAtMC4xNDczNTEKK3YgLTAuMTQxMTgzIDAuMjIxMjM0IC0wLjE0NzM1MQordiAtMC4xNDExODMgMC4yMjEyMzQgLTAuMTQ3MzUxCit2IC0wLjE0MTE4MyAwLjIyMTIzNCAtMC4xNDczNTEKK3YgLTAuMTMzMzk3IDAuMTcwMTI5IC0wLjE0NzM1MQordiAtMC4xMzMzOTcgMC4xNzAxMjkgLTAuMTQ3MzUxCit2IC0wLjEzMzM5NyAwLjE3MDEyOSAtMC4xNDczNTEKK3YgLTAuMTI2ODc5IDAuMTI1ODg5IC0wLjE0NzM1MQordiAtMC4xMjY4NzkgMC4xMjU4ODkgLTAuMTQ3MzUxCit2IC0wLjEyNjg3OSAwLjEyNTg4OSAtMC4xNDczNTEKK3YgLTAuMTE0Mzg0IDAuMDg4MzkxIC0wLjE0NzM1MQordiAtMC4xMTQzODQgMC4wODgzOTEgLTAuMTQ3MzUxCit2IC0wLjExNDM4NCAwLjA4ODM5MSAtMC4xNDczNTEKK3YgLTAuMDg5NzYwIDAuMDYyMDgyIC0wLjE0NzM1MQordiAtMC4wODk3NjAgMC4wNjIwODIgLTAuMTQxNDgxCit2IC0wLjA4OTc2MCAwLjA2MjA4MiAtMC4xNDczNTEKK3YgLTAuMDg5NzYwIDAuMDYyMDgyIC0wLjE0NzM1MQordiAtMC4wNTgwMTEgMC4wNjAxMTcgLTAuMTQ3MzUxCit2IC0wLjA1ODAxMSAwLjA2MDExNyAtMC4xNDE0ODEKK3YgLTAuMDU4MDExIDAuMDYwMTE3IC0wLjE0NzM1MQordiAtMC4wNTgwMTEgMC4wNjAxMTcgLTAuMTQ3MzUxCit2IC0wLjAyODMwNyAwLjA5MDE1MiAtMC4xNDczNTEKK3YgLTAuMDI4MzA3IDAuMDkwMTUyIC0wLjE0NzM1MQordiAtMC4wMjgzMDcgMC4wOTAxNTIgLTAuMTQ3MzUxCit2IC0wLjAxNDU2NCAwLjE1NjUwMCAtMC4xNDczNTEKK3YgLTAuMDE0NTY0IDAuMTU2NTAwIC0wLjE0NzM1MQordiAtMC4wMTQ1NjQgMC4xNTY1MDAgLTAuMTQ3MzUxCit2IC0wLjAyNzI2NiAwLjIyMDI0MCAtMC4xNDczNTEKK3YgLTAuMDI3MjY2IDAuMjIwMjQwIC0wLjE0NzM1MQordiAtMC4wMjcyNjYgMC4yMjAyNDAgLTAuMTQ3MzUxCit2IC0wLjA1OTg3MSAwLjI2MzM3NiAtMC4xNDczNTEKK3YgLTAuMDU5ODcxIDAuMjYzMzc1IC0wLjE0MTQ4MQordiAtMC4wNTk4NzEgMC4yNjMzNzYgLTAuMTQ3MzUxCit2IC0wLjA1OTg3MSAwLjI2MzM3NiAtMC4xNDczNTEKK3YgLTAuMDkzNTMzIDAuMjc1NzIwIC0wLjE0NzM1MQordiAtMC4xMDA2NzMgMC4yNzgzMzggLTAuMTQ3MzUxCit2IC0wLjEwMDY3MyAwLjI3ODMzOCAtMC4xNDczNTEKK3YgLTAuMDk5ODgzIDAuMjk3MDg2IC0wLjE0NzM1MQordiAtMC4wOTkwOTMgMC4zMTU4MzMgLTAuMTQ3MzUxCit2IC0wLjA5OTA5MyAwLjMxNTgzMyAtMC4xNDczNTEKK3YgLTAuMDg5MDQ4IDAuMzEyMjkxIC0wLjE0NzM1MQordiAtMC4wNDE2OTIgMC4yOTU1OTQgLTAuMTQ3MzUxCit2IC0wLjA0MTY5MiAwLjI5NTU5NCAtMC4xNDczNTEKK3YgMC4wMDQzMzIgMC4yMzkxMzcgLTAuMTQ3MzUwCit2IDAuMDA0MzMyIDAuMjM5MTM3IC0wLjE0NzM1MAordiAwLjAwNDMzMiAwLjIzOTEzNyAtMC4xNDczNTAKK3YgMC4wMjI0MDEgMC4xNTU5ODcgLTAuMTQ3MzUwCit2IDAuMDIyNDAxIDAuMTU1OTg3IC0wLjE0NzM1MAordiAwLjAyMjQwMSAwLjE1NTk4NyAtMC4xNDczNTAKK3YgMC4wMDAwMDggMC4wNjUzNzIgLTAuMTQ3MzUwCit2IDAuMDAwMDA3IDAuMDY1MzcyIC0wLjE0MTQ4MQordiAwLjAwMDAwOCAwLjA2NTM3MiAtMC4xNDczNTAKK3YgMC4wMDAwMDggMC4wNjUzNzIgLTAuMTQ3MzUwCit2IC0wLjA1MDQyMSAwLjAyMjcyOCAtMC4xNDczNTEKK3YgLTAuMDUwNDIxIDAuMDIyNzI4IC0wLjE0NzM1MQordiAtMC4wNTA0MjEgMC4wMjI3MjggLTAuMTQ3MzUxCit2IC0wLjEwODIwNSAwLjAyOTU1NCAtMC4xNDczNTEKK3YgLTAuMTA4MjA1IDAuMDI5NTU0IC0wLjE0MTQ4MQordiAtMC4xMDgyMDUgMC4wMjk1NTQgLTAuMTQ3MzUxCit2IC0wLjEwODIwNSAwLjAyOTU1NCAtMC4xNDczNTEKK3YgLTAuMTQ0Njc5IDAuMDY2MTczIC0wLjE0NzM1MQordiAtMC4xNDQ2NzkgMC4wNjYxNzMgLTAuMTQ3MzUxCit2IC0wLjE0NDY3OSAwLjA2NjE3MyAtMC4xNDczNTEKK3YgLTAuMTYyMTc5IDAuMTEzNzg5IC0wLjE0NzM1MQordiAtMC4xNjIxNzkgMC4xMTM3ODkgLTAuMTQ3MzUxCit2IC0wLjE2MjE3OSAwLjExMzc4OSAtMC4xNDczNTEKK3YgLTAuMTcwMDg3IDAuMTY1NTUxIC0wLjE0NzM1MQordiAtMC4xNzAwODcgMC4xNjU1NTEgLTAuMTQ3MzUxCit2IC0wLjE3MDA4NyAwLjE2NTU1MSAtMC4xNDczNTEKK3YgLTAuMTc2NDc3IDAuMjA5MTQ0IC0wLjE0NzM1MQordiAtMC4xNzY0NzcgMC4yMDkxNDQgLTAuMTQ3MzUxCit2IC0wLjE3NjQ3NyAwLjIwOTE0NCAtMC4xNDczNTEKK3YgLTAuMTg4NTMxIDAuMjQ1NzYwIC0wLjE0NzM1MQordiAtMC4xODg1MzEgMC4yNDU3NjAgLTAuMTQ3MzUxCit2IC0wLjE4ODUzMSAwLjI0NTc2MCAtMC4xNDczNTEKK3YgLTAuMjEyMTQ5IDAuMjcxMTg2IC0wLjE0NzM1MQordiAtMC4yMTIxNDkgMC4yNzExODYgLTAuMTQxNDgyCit2IC0wLjIxMjE0OSAwLjI3MTE4NiAtMC4xNDczNTEKK3YgLTAuMjEyMTQ5IDAuMjcxMTg2IC0wLjE0NzM1MQordiAtMC4yNDE2NzQgMC4yNzI3NTggLTAuMTQ3MzUyCit2IC0wLjI0MTY3NCAwLjI3Mjc1OCAtMC4xNDE0ODIKK3YgLTAuMjQxNjc0IDAuMjcyNzU4IC0wLjE0NzM1MgordiAtMC4yNDE2NzQgMC4yNzI3NTggLTAuMTQ3MzUyCit2IC0wLjI2OTU3OCAwLjI0MzgxOCAtMC4xNDczNTIKK3YgLTAuMjY5NTc4IDAuMjQzODE4IC0wLjE0NzM1MgordiAtMC4yNjk1NzggMC4yNDM4MTggLTAuMTQ3MzUyCit2IC0wLjI4MjU2NCAwLjE3OTUzMSAtMC4xNDczNTIKK3YgLTAuMjgyNTY0IDAuMTc5NTMxIC0wLjE0NzM1MgordiAtMC4yODI1NjQgMC4xNzk1MzEgLTAuMTQ3MzUyCit2IC0wLjI3MTIyMiAwLjEwODA2OSAtMC4xNDczNTIKK3YgLTAuMjcxMjIyIDAuMTA4MDY5IC0wLjE0NzM1MgordiAtMC4yNzEyMjIgMC4xMDgwNjkgLTAuMTQ3MzUyCit2IC0wLjI0MTQ0MiAwLjA2NjI2MCAtMC4xNDczNTIKK3YgLTAuMjQxNDQyIDAuMDY2MjYwIC0wLjE0MTQ4MgordiAtMC4yNDE0NDIgMC4wNjYyNjAgLTAuMTQ3MzUyCit2IC0wLjI0MTQ0MiAwLjA2NjI2MCAtMC4xNDczNTIKK3YgLTAuMjA5Njk3IDAuMDU0NTI4IC0wLjE0NzM1MQordiAtMC4yNTgwMzcgLTAuMDg5ODU5IC0wLjE0NzM1MgordiAtMC4yNTgwMzcgLTAuMDg5ODU5IC0wLjE0NzM1MgordiAtMC4yMzgxMTggLTAuMDg5ODU5IC0wLjE0NzM1MQordiAtMC4yMTgxOTkgLTAuMDg5ODU5IC0wLjE0NzM1MQordiAtMC4yMTgxOTkgLTAuMDg5ODU5IC0wLjE0NzM1MQordiAtMC4yMjQ4OTAgLTAuMTAxMjY3IC0wLjE0NzM1MQordiAtMC4yNjY4ODkgLTAuMTcyODY0IC0wLjE0NzM1MQordiAtMC4yNjY4ODkgLTAuMTcyODY0IC0wLjE0NzM1MQordiAtMC4yNzQxMDQgLTAuMjM5ODYyIC0wLjE0NzM1MQordiAtMC4yNzQxMDQgLTAuMjM5ODYyIC0wLjE0NzM1MQordiAtMC4yNzQxMDQgLTAuMjM5ODYyIC0wLjE0NzM1MQordiAtMC4yNTIzOTQgLTAuMjg1NTk3IC0wLjE0NzM1MQordiAtMC4yNTIzOTUgLTAuMjg1NTk3IC0wLjE0MTQ4MgordiAtMC4yNTIzOTQgLTAuMjg1NTk3IC0wLjE0NzM1MQordiAtMC4yNTIzOTQgLTAuMjg1NTk3IC0wLjE0NzM1MQordiAtMC4yMTQyODAgLTAuMzA0Nzc1IC0wLjE0NzM1MQordiAtMC4yMTQyODAgLTAuMzA0Nzc1IC0wLjE0NzM1MQordiAtMC4yMTQyODAgLTAuMzA0Nzc1IC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzA0NjU2IC0wLjE0NzM1MQordiAwLjAwOTI4NyAtMC4zMDQ0MDYgLTAuMTQ3MzUwCit2IDAuMDA5Mjg3IC0wLjMwNDQwNiAtMC4xNDczNTAKK3YgMC4wMDkyODcgLTAuMzI1MjkzIC0wLjE0NzM1MAordiAwLjAwOTI4NyAtMC4zNDYxODAgLTAuMTQ3MzUwCit2IDAuMDA5Mjg3IC0wLjM0NjE4MCAtMC4xNDczNTAKK3YgLTAuMDA1NTU3IC0wLjM0NjE2NCAtMC4xNDczNTAKK3YgLTAuMjM0ODUyIC0wLjM0NTg0OSAtMC4xNDczNTEKK3YgLTAuMjM0ODUyIC0wLjM0NTg0OSAtMC4xNDczNTEKK3YgLTAuMjg0NTUzIC0wLjMyMDI0OCAtMC4xNDczNTEKK3YgLTAuMjg0NTUzIC0wLjMyMDI0OCAtMC4xNDE0ODIKK3YgLTAuMjg0NTUzIC0wLjMyMDI0OCAtMC4xNDczNTEKK3YgLTAuMjg0NTUzIC0wLjMyMDI0OCAtMC4xNDczNTEKK3YgLTAuMzEzMTI3IC0wLjI2MDM4MiAtMC4xNDczNTIKK3YgLTAuMzEzMTI3IC0wLjI2MDM4MiAtMC4xNDczNTIKK3YgLTAuMzEzMTI3IC0wLjI2MDM4MiAtMC4xNDczNTIKK3YgLTAuMzA4MzYwIC0wLjE3OTI1OCAtMC4xNDczNTIKK3YgLTAuMzA4MzYwIC0wLjE3OTI1OCAtMC4xNDczNTIKK3YgLTAuMzA4MzYwIC0wLjE3OTI1OCAtMC4xNDczNTIKK3YgLTAuMjYyMjE5IC0wLjA5NzI4OCAtMC4xNDczNTIKK3YgLTAuMzA4MTU5IC0wLjAzMTM5NyAtMC4xNDczNTIKK3YgLTAuMzA4MTU5IC0wLjAzMTM5NyAtMC4xNDczNTIKK3YgLTAuMjk2MjEzIC0wLjAzMTM5NyAtMC4xNDczNTIKK3YgMC4wMDg1NjQgLTAuMDMxMzk3IC0wLjE0NzM1MAordiAwLjAwODU2NCAtMC4wMzEzOTcgLTAuMTQ3MzUwCit2IDAuMDA4NTY0IC0wLjA1MjI4NCAtMC4xNDczNTAKK3YgMC4wMDg1NjQgLTAuMDczMTcxIC0wLjE0NzM1MAordiAwLjAwODU2NCAtMC4wNzMxNzEgLTAuMTQ3MzUwCit2IC0wLjAwMjkzNiAtMC4wNzMxNzEgLTAuMTQ3MzUwCit2IC0wLjMwODE1OSAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjMwODE1OSAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjMwODE1OSAtMC4wNTIyODQgLTAuMTQ3MzUyCit2IC0wLjE2Mzc2MSAtMC41OTMzNjcgLTAuMTQ3MzUxCit2IC0wLjE2Mzc2MSAtMC41OTMzNjcgLTAuMTQ3MzUxCit2IC0wLjE3MjAyNSAtMC42MDA4NzUgLTAuMTQ3MzUxCit2IC0wLjMwODE3MSAtMC43MjQ1NjUgLTAuMTQ3MzUxCit2IC0wLjMwODE3MSAtMC43MjQ1NjUgLTAuMTQ3MzUxCit2IC0wLjMwODE3MSAtMC42OTUyMjcgLTAuMTQ3MzUxCit2IC0wLjMwODE3MSAtMC42NjU4OTAgLTAuMTQ3MzUxCit2IC0wLjMwODE3MSAtMC42NjU4OTAgLTAuMTQ3MzUxCit2IC0wLjI5NzQ2MyAtMC42NTYxNjEgLTAuMTQ3MzUxCit2IC0wLjE5NTQ0NiAtMC41NjM0NzggLTAuMTQ3MzUxCit2IC0wLjE5NTQ0NiAtMC41NjM0NzggLTAuMTQ3MzUxCit2IC0wLjE1ODgyOSAtMC41NTk3MTEgLTAuMTQ3MzUxCit2IC0wLjE2Mzc2MSAtMC41OTMzNjcgLTAuMTQxNDgxCit2IC0wLjE1ODgyOSAtMC41NTk3MTEgLTAuMTQxNDgxCit2IC0wLjE1ODgyOSAtMC41NTk3MTEgLTAuMTQ3MzUxCit2IC0wLjE1ODgyOSAtMC41NTk3MTEgLTAuMTQ3MzUxCit2IC0wLjE2Mzc2MSAtMC41OTMzNjcgLTAuMTQ3MzUxCit2IC0wLjE2Mzc2MSAtMC41OTMzNjcgLTAuMTQxNDgxCit2IC0wLjMwNDM1NCAtMC40MzQzMjQgLTAuMTQ3MzUyCit2IC0wLjMwNDM1NCAtMC40MzQzMjQgLTAuMTQ3MzUyCit2IC0wLjMwNDM1NCAtMC40MDQwMjUgLTAuMTQ3MzUyCit2IC0wLjMwNDM1NCAtMC4zNzM3MjcgLTAuMTQ3MzUyCit2IC0wLjMwNDM1NCAtMC4zNzM3MjcgLTAuMTQ3MzUyCit2IC0wLjI5MTU3MCAtMC4zODU5MTIgLTAuMTQ3MzUxCit2IC0wLjE2MjUwMCAtMC41MDg5NDAgLTAuMTQ3MzUxCit2IC0wLjE2MjUwMCAtMC41MDg5NDAgLTAuMTQ3MzUxCit2IC0wLjE1ODUzOCAtMC41NDEyNjQgLTAuMTQ3MzUxCit2IC0wLjE1ODUzOCAtMC41NDEyNjQgLTAuMTQxNDgxCit2IC0wLjE1ODUzOCAtMC41NDEyNjQgLTAuMTQ3MzUxCit2IC0wLjE1ODUzOCAtMC41NDEyNjQgLTAuMTQ3MzUxCit2IC0wLjE5NTAzOCAtMC41Mzg1MjIgLTAuMTQ3MzUxCit2IC0wLjE5NTAzOCAtMC41Mzg1MjIgLTAuMTQ3MzUxCit2IC0wLjE5NTAzOCAtMC41Mzg1MjIgLTAuMTQ3MzUxCit2IC0wLjIwNDE0OCAtMC41Mjk4MzggLTAuMTQ3MzUxCit2IC0wLjEzNTgwMSAtMC41MDkyOTEgLTAuMTQ3MzUxCit2IC0wLjEzNTgwMSAtMC41MDkyOTEgLTAuMTQ3MzUxCit2IC0wLjEyNzc3NyAtMC41MDE5ODAgLTAuMTQ3MzUxCit2IDAuMDA3MTc1IC0wLjM3OTA0NyAtMC4xNDczNTAKK3YgMC4wMDcxNzUgLTAuMzc5MDQ3IC0wLjE0NzM1MAordiAwLjAwNzE3NSAtMC40MDgzODUgLTAuMTQ3MzUwCit2IDAuMDA3MTc1IC0wLjQzNzcyMiAtMC4xNDczNTAKK3YgMC4wMDcxNzUgLTAuNDM3NzIyIC0wLjE0NzM1MAordiAwLjAwMTAwMCAtMC40NDMzNTIgLTAuMTQ3MzUwCit2IC0wLjEwNDI0OCAtMC41MzkyOTkgLTAuMTQ3MzUwCit2IC0wLjEwNDI0OCAtMC41MzkyOTkgLTAuMTQ3MzUwCit2IC0wLjEzOTU5MyAtMC41NDE0MjAgLTAuMTQ3MzUxCit2IC0wLjEzNTgwMSAtMC41MDkyOTEgLTAuMTQxNDgxCit2IC0wLjEzOTU5MyAtMC41NDE0MjAgLTAuMTQxNDgxCit2IC0wLjEzOTU5MyAtMC41NDE0MjAgLTAuMTQ3MzUxCit2IC0wLjEzOTU5MyAtMC41NDE0MjAgLTAuMTQ3MzUxCit2IC0wLjEzNTgwMSAtMC41MDkyOTEgLTAuMTQ3MzUxCit2IC0wLjEzNTgwMSAtMC41MDkyOTEgLTAuMTQxNDgxCit2IDAuMDA3OTYwIC0wLjY2ODE5MCAtMC4xNDczNTAKK3YgMC4wMDc5NjAgLTAuNjY4MTkwIC0wLjE0NzM1MAordiAwLjAwNzk2MCAtMC42OTg0ODggLTAuMTQ3MzUwCit2IDAuMDA3OTYwIC0wLjcyODc4NiAtMC4xNDczNTAKK3YgMC4wMDc5NjAgLTAuNzI4Nzg2IC0wLjE0NzM1MAordiAtMC4wMDU2NTkgLTAuNzE2MTA3IC0wLjE0NzM1MAordiAtMC4xMzcxMDEgLTAuNTkzNzQ1IC0wLjE0NzM1MQordiAtMC4xMzcxMDEgLTAuNTkzNzQ1IC0wLjE0NzM1MQordiAtMC4xMzk4OTQgLTAuNTU5ODI2IC0wLjE0NzM1MQordiAtMC4xMzk4OTQgLTAuNTU5ODI2IC0wLjE0MTQ4MQordiAtMC4xMzk4OTQgLTAuNTU5ODI2IC0wLjE0NzM1MQordiAtMC4xMzk4OTQgLTAuNTU5ODI2IC0wLjE0NzM1MQordiAtMC4xMDQ2NjIgLTAuNTY0MDcxIC0wLjE0NzM1MAordiAtMC4xMDQ2NjIgLTAuNTY0MDcxIC0wLjE0NzM1MAordiAtMC4xMDQ2NjIgLTAuNTY0MDcxIC0wLjE0NzM1MAordiAtMC4wOTYxNTUgLTAuNTcxOTM2IC0wLjE0NzM1MAordiAtMC4yODcwMTIgLTAuNzczMDU2IC0wLjE0NzM1MQordiAtMC4yODcwMTIgLTAuNzczMDU2IC0wLjE0NzM1MQordiAtMC4yNTk3NDEgLTAuNzQyNTc2IC0wLjE0NzM1MQordiAtMC4yNTE4MjQgLTAuNzMzNzI3IC0wLjE0NzM1MQordiAtMC4yNTE4MjQgLTAuNzMzNzI3IC0wLjE0NzM1MQordiAtMC4yMzk3OTkgLTAuNzQ2OTQzIC0wLjE0NzM1MQordiAtMC4yMjc3NzUgLTAuNzYwMTU3IC0wLjE0NzM1MQordiAtMC4yMjc3NzUgLTAuNzYwMTU3IC0wLjE0NzM1MQordiAtMC4yMzQxNjIgLTAuNzY4MDI1IC0wLjE0NzM1MQordiAtMC4yNTYxNjIgLTAuNzk1MTE4IC0wLjE0NzM1MQordiAtMC4yNTYxNjIgLTAuNzk1MTE4IC0wLjE0NzM1MQordiAtMC4yNzI1OTggLTAuODQxMjEwIC0wLjE0NzM1MQordiAtMC4yNzI1OTggLTAuODQxMjEwIC0wLjE0NzM1MQordiAtMC4yNzI1OTggLTAuODQxMjEwIC0wLjE0NzM1MQordiAtMC4yNzcyMDggLTAuOTA2OTAzIC0wLjE0NzM1MQordiAtMC4yNzcyMDggLTAuOTA2OTAzIC0wLjE0NzM1MQordiAtMC4yNzcyMDggLTAuOTA2OTAzIC0wLjE0NzM1MQordiAtMC4yNDM2OTcgLTAuOTc1ODA4IC0wLjE0NzM1MQordiAtMC4yNDM2OTcgLTAuOTc1ODA4IC0wLjE0MTQ4MQordiAtMC4yNDM2OTcgLTAuOTc1ODA4IC0wLjE0NzM1MQordiAtMC4yNDM2OTcgLTAuOTc1ODA4IC0wLjE0NzM1MQordiAtMC4xNjgyMjQgLTEuMDE0NzE1IC0wLjE0NzM1MQordiAtMC4xMDQ3NjkgLTEuMDE0OTk5IC0wLjE0NzM1MAordiAtMC4xMDQ3NjkgLTEuMDE0OTk5IC0wLjE0NzM1MAordiAtMC4wNDQxMjMgLTAuOTY3ODc0IC0wLjE0NzM1MAordiAtMC4wNDQxMjMgLTAuOTY3ODc0IC0wLjE0MTQ4MAordiAtMC4wNDQxMjMgLTAuOTY3ODc0IC0wLjE0NzM1MAordiAtMC4wNDQxMjMgLTAuOTY3ODc0IC0wLjE0NzM1MAordiAtMC4wMTcyNDMgLTAuODk1NjUyIC0wLjE0NzM1MAordiAtMC4wMTcyNDMgLTAuODk1NjUyIC0wLjE0NzM1MAordiAtMC4wMTcyNDMgLTAuODk1NjUyIC0wLjE0NzM1MAordiAtMC4wMzE3MTIgLTAuODI5NDg0IC0wLjE0NzM1MAordiAtMC4wMzE3MTIgLTAuODI5NDg0IC0wLjE0NzM1MAordiAtMC4wMzE3MTIgLTAuODI5NDg0IC0wLjE0NzM1MAordiAtMC4wNjgyNTAgLTAuNzg4MDY0IC0wLjE0NzM1MAordiAtMC4wNjgyNTAgLTAuNzg4MDY0IC0wLjE0MTQ4MQordiAtMC4wNjgyNTAgLTAuNzg4MDY0IC0wLjE0NzM1MAordiAtMC4wNjgyNTAgLTAuNzg4MDY0IC0wLjE0NzM1MAordiAtMC4xMDI0MDEgLTAuNzc3NTMwIC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuNzczMDE1IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuNzczMDE1IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuNzg3NjI4IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuOTk3ODg0IC0wLjE0NzM1MAordiAtMC4xMTcwMzcgLTAuOTk3ODg0IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuOTk3ODU3IC0wLjE0NzM1MAordiAtMC4xNTYxNzIgLTAuOTk3ODU3IC0wLjE0MTQ4MQordiAtMC4xNTYxNzEgLTAuOTk3ODU3IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuOTk3ODU3IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuOTg1NDg3IC0wLjE0NzM1MAordiAtMC4xNTYxNzEgLTAuNzMyMzgzIC0wLjE0NzM1MQordiAtMC4xNTYxNzEgLTAuNzMyMzgzIC0wLjE0NzM1MQordiAtMC4xNDA0MTkgLTAuNzMyNDAwIC0wLjE0NzM1MAordiAtMC4xMTY5OTIgLTAuNzMyNDE2IC0wLjE0NzM1MAordiAtMC4xMTY5OTIgLTAuNzMyNDE2IC0wLjE0NzM1MAordiAtMC4wNTc0MTIgLTAuNzQ5OTI0IC0wLjE0NzM1MAordiAtMC4wNTc0MTIgLTAuNzQ5OTI0IC0wLjE0NzM1MAordiAtMC4wNTc0MTIgLTAuNzQ5OTI0IC0wLjE0NzM1MAordiAwLjAwMjIyMyAtMC44MDI4MzggLTAuMTQ3MzUwCit2IDAuMDAyMjIyIC0wLjgwMjgzOCAtMC4xNDE0ODAKK3YgMC4wMDIyMjMgLTAuODAyODM4IC0wLjE0NzM1MAordiAwLjAwMjIyMyAtMC44MDI4MzggLTAuMTQ3MzUwCit2IDAuMDIyMTI3IC0wLjg5OTQ5MyAtMC4xNDczNTAKK3YgMC4wMjIxMjcgLTAuODk5NDkzIC0wLjE0NzM1MAordiAwLjAyMjEyNyAtMC44OTk0OTMgLTAuMTQ3MzUwCit2IC0wLjAxNDQ1NyAtMC45OTQwMzggLTAuMTQ3MzUwCit2IC0wLjAxNDQ1NyAtMC45OTQwMzggLTAuMTQxNDgwCit2IC0wLjAxNDQ1NyAtMC45OTQwMzggLTAuMTQ3MzUwCit2IC0wLjAxNDQ1NyAtMC45OTQwMzggLTAuMTQ3MzUwCit2IC0wLjA4NzU0MSAtMS4wNDcwODEgLTAuMTQ3MzUwCit2IC0wLjE3ODY0MCAtMS4wNTI0NTIgLTAuMTQ3MzUxCit2IC0wLjE3ODY0MCAtMS4wNTI0NTIgLTAuMTQ3MzUxCit2IC0wLjI2OTk3OSAtMS4wMDI3ODQgLTAuMTQ3MzUxCit2IC0wLjMxMzU5NCAtMC45MjI0MTUgLTAuMTQ3MzUxCit2IC0wLjMxMzU5NCAtMC45MjI0MTUgLTAuMTQ3MzUxCit2IC0wLjMwOTUyMyAtMC44MjkxNjQgLTAuMTQ3MzUxCit2IC0wLjMwOTUyMyAtMC44MjkxNjQgLTAuMTQ3MzUxCit2IC0wLjMwOTUyMyAtMC44MjkxNjQgLTAuMTQ3MzUxCit2IC0wLjI4NzAxMiAtMC43NzMwNTYgLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS40MjQ0OTggLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS40MjQ0OTggLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS40MDM2MTIgLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS4zODI3MjQgLTAuMTQ3MzUxCit2IC0wLjMwODE1OSAtMS4zODI3MjQgLTAuMTQ3MzUxCit2IC0wLjI5Njc3MyAtMS4zODI3MjQgLTAuMTQ3MzUxCit2IDAuMDA4NTY0IC0xLjM4MjcyNCAtMC4xNDczNDkKK3YgMC4wMDg1NjQgLTEuMzgyNzI0IC0wLjE0NzM0OQordiAwLjAwODU2NCAtMS40MDM2MTIgLTAuMTQ3MzQ5Cit2IDAuMDA4NTY0IC0xLjQyNDQ5OCAtMC4xNDczNDkKK3YgMC4wMDg1NjQgLTEuNDI0NDk4IC0wLjE0NzM0OQordiAtMC4wMDQ0MTcgLTEuNDI0NDk4IC0wLjE0NzM0OQordiAtMC4wNDA4MzUgLTEuMzY2MDc3IC0wLjE0NzM1MAordiAtMC4wNDA4MzUgLTEuMzY2MDc3IC0wLjE0NzM1MAordiAtMC4wNjA3NTQgLTEuMzY2MDc3IC0wLjE0NzM1MAordiAtMC4wODA2NzQgLTEuMzY2MDc3IC0wLjE0NzM1MAordiAtMC4wODA2NzQgLTEuMzY2MDc3IC0wLjE0NzM1MAordiAtMC4wNzQ3MjggLTEuMzU1OTQxIC0wLjE0NzM1MAordiAtMC4wMzE5ODQgLTEuMjgzMDc0IC0wLjE0NzM1MAordiAtMC4wMzE5ODQgLTEuMjgzMDc0IC0wLjE0NzM1MAordiAtMC4wMjQ3NjkgLTEuMjE2MDc2IC0wLjE0NzM1MAordiAtMC4wMjQ3NjkgLTEuMjE2MDc2IC0wLjE0NzM1MAordiAtMC4wMjQ3NjkgLTEuMjE2MDc2IC0wLjE0NzM1MAordiAtMC4wNDY0NzggLTEuMTcwMzQxIC0wLjE0NzM1MAordiAtMC4wNDY0NzggLTEuMTcwMzQxIC0wLjE0MTQ4MAordiAtMC4wNDY0NzggLTEuMTcwMzQxIC0wLjE0NzM1MAordiAtMC4wNDY0NzggLTEuMTcwMzQxIC0wLjE0NzM1MAordiAtMC4wODQ1OTIgLTEuMTUxMTYzIC0wLjE0NzM1MAordiAtMC4wODQ1OTIgLTEuMTUxMTYzIC0wLjE0NzM1MAordiAtMC4wODQ1OTIgLTEuMTUxMTYzIC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTUxMzM1IC0wLjE0NzM1MAordiAtMC4zMDgxNTkgLTEuMTUxNTMzIC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuMTUxNTMzIC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuMTMxMTQ1IC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuMTA5NzU4IC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuMTA5NzU4IC0wLjE0NzM1MQordiAtMC4yOTcwMDggLTEuMTA5NzY5IC0wLjE0NzM1MQordiAtMC4wNjQwMjAgLTEuMTEwMDg3IC0wLjE0NzM1MAordiAtMC4wNjQwMjAgLTEuMTEwMDg3IC0wLjE0NzM1MAordiAtMC4wMTQzMjAgLTEuMTM1NjkxIC0wLjE0NzM1MAordiAtMC4wMTQzMjAgLTEuMTM1NjkxIC0wLjE0MTQ4MAordiAtMC4wMTQzMjAgLTEuMTM1NjkxIC0wLjE0NzM1MAordiAtMC4wMTQzMjAgLTEuMTM1NjkxIC0wLjE0NzM1MAordiAwLjAxNDI1NCAtMS4xOTU1NTQgLTAuMTQ3MzQ5Cit2IDAuMDE0MjU0IC0xLjE5NTU1NCAtMC4xNDczNDkKK3YgMC4wMTQyNTQgLTEuMTk1NTU0IC0wLjE0NzM0OQordiAwLjAwOTQ4OCAtMS4yNzY2ODEgLTAuMTQ3MzQ5Cit2IDAuMDA5NDg4IC0xLjI3NjY4MSAtMC4xNDczNDkKK3YgMC4wMDk0ODggLTEuMjc2NjgxIC0wLjE0NzM0OQordiAtMC4wMzY2MDYgLTEuMzU4NTY3IC0wLjE0NzM1MAordiAtMC4xNjgyMjQgLTEuMDE0NzE1IC0wLjE0NzM1MQordiAtMC4xNjgyMjQgLTEuMDE0NzE1IC0wLjE0NzM1MQordiAtMC4xMDQ3NjkgLTEuMDE0OTk5IC0wLjE0NzM1MAordiAtMC4wODc1NDEgLTEuMDQ3MDgxIC0wLjE0NzM1MAordiAtMC4wODc1NDEgLTEuMDQ3MDgxIC0wLjE0NzM1MAordiAtMC4xNzg2NDAgLTEuMDUyNDUyIC0wLjE0NzM1MQordiAtMC4yNjk5NzkgLTEuMDAyNzg0IC0wLjE0MTQ4MQordiAtMC4yNjk5NzkgLTEuMDAyNzg0IC0wLjE0NzM1MQordiAtMC4yNjk5NzkgLTEuMDAyNzg0IC0wLjE0NzM1MQordiAtMC4zMTM1OTQgLTAuOTIyNDE1IC0wLjE0NzM1MQordiAtMC4wOTUyNDIgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wOTUyNDIgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wNjU2MDQgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wMDQ0MTcgLTEuNDI0NDk4IC0wLjE0NzM0OQordiAtMC4xNDc2MTIgLTEuNDI0NDk4IC0wLjE0NzM1MAordiAtMC4xNDc2MTIgLTEuNDI0NDk4IC0wLjE0NzM1MAordiAtMC4wMzU5NjcgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wMzU5NjcgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4wMDQ0MTcgLTEuMzgyNzI0IC0wLjE0NzM0OQordiAtMC4yMDMzNDIgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4xNDgxNjkgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDczMTcxIC0wLjE0NzM1MQordiAtMC4yMDMzNDIgLTAuMDczMTcxIC0wLjE0NzM1MQordiAtMC4yMzMyMTAgLTAuMDczMTcxIC0wLjE0NzM1MQordiAtMC4yNjMwNzkgLTAuMDMxMzk3IC0wLjE0NzM1MgordiAtMC4yNjMwNzkgLTAuMDMxMzk3IC0wLjE0NzM1MgordiAtMC4yMzMyMTAgLTAuMDMxMzk3IC0wLjE0NzM1MQordiAtMC4yNjMwNzkgLTAuMDczMTcxIC0wLjE0NzM1MgordiAtMC4yNjMwNzkgLTAuMDczMTcxIC0wLjE0NzM1MgordiAtMC4yOTYyMTMgLTAuMDczMTcxIC0wLjE0NzM1MgordiAtMC4xMTgxNTYgLTEuMTUxMzM1IC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTUxMzM1IC0wLjE0NzM1MAordiAtMC4yOTcwMDggLTEuMTUxNTIwIC0wLjE0NzM1MQordiAtMC4xMTgxNTYgLTEuMTA5OTMwIC0wLjE0NzM1MAordiAtMC4xMTgxNTYgLTEuMTA5OTMwIC0wLjE0NzM1MAordiAtMC4wNjQwMjAgLTEuMTEwMDg3IC0wLjE0NzM1MAordiAtMC4xODU3MzUgLTAuMzA0NjU2IC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzA0NjU2IC0wLjE0NzM1MQordiAtMC4wOTQ4MTUgLTAuMzA0NTQwIC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzQ1OTc4IC0wLjE0NzM1MQordiAtMC4xODU3MzUgLTAuMzQ1OTc4IC0wLjE0NzM1MQordiAtMC4yMzQ4NTIgLTAuMzQ1ODQ5IC0wLjE0NzM1MQordiAwLjAwODU2NCAtMS4zODI3MjQgLTAuMTQxNDgwCit2IC0wLjAwNDQxNyAtMS4zODI3MjQgLTAuMTQ3MzQ5Cit2IC0wLjAwNDQxNyAtMS4zODI3MjQgLTAuMTQ3MzQ5Cit2IDAuMDA4NTY0IC0xLjM4MjcyNCAtMC4xNDczNDkKK3YgMC4wMDg1NjQgLTEuMzgyNzI0IC0wLjE0MTQ4MAordiAtMC4yOTY3NzMgLTEuMzgyNzI0IC0wLjE0NzM1MQordiAtMC4yOTY3NzMgLTEuMzgyNzI0IC0wLjE0NzM1MQordiAtMC4xMTgxNDMgLTEuMzgyNzI0IC0wLjE0NzM1MAordiAtMC4zMDgxNjAgLTEuNDI0NDk4IC0wLjE0MTQ4MQordiAtMC4yOTY3NzMgLTEuNDI0NDk4IC0wLjE0NzM1MQordiAtMC4yOTY3NzMgLTEuNDI0NDk4IC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuNDI0NDk4IC0wLjE0NzM1MQordiAtMC4zMDgxNjAgLTEuNDI0NDk4IC0wLjE0MTQ4MQordiAtMC4zMDgxNjAgLTEuMzgyNzI0IC0wLjE0MTQ4MQordiAtMC4zMDgxNTkgLTEuNDAzNjEyIC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuNDAzNjEyIC0wLjE0NzM1MQordiAtMC4zMDgxNTkgLTEuMzgyNzI0IC0wLjE0NzM1MQordiAtMC4zMDgxNjAgLTEuMzgyNzI0IC0wLjE0MTQ4MQordiAwLjAwODU2NCAtMS40MjQ0OTggLTAuMTQxNDgwCit2IDAuMDA4NTY0IC0xLjQwMzYxMiAtMC4xNDczNDkKK3YgMC4wMDg1NjQgLTEuNDAzNjEyIC0wLjE0NzM0OQordiAwLjAwODU2NCAtMS40MjQ0OTggLTAuMTQ3MzQ5Cit2IDAuMDA4NTY0IC0xLjQyNDQ5OCAtMC4xNDE0ODAKK3YgLTAuMDc0NzI4IC0xLjM1NTk0MSAtMC4xNDczNTAKK3YgLTAuMDc0NzI4IC0xLjM1NTk0MSAtMC4xNDczNTAKK3YgLTAuMDMxOTg0IC0xLjI4MzA3NCAtMC4xNDczNTAKK3YgLTAuMDQwODM1IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMDM2NjA2IC0xLjM1ODU2NyAtMC4xNDczNTAKK3YgLTAuMDM2NjA2IC0xLjM1ODU2NyAtMC4xNDczNTAKK3YgLTAuMDQwODM1IC0xLjM2NjA3NyAtMC4xNDczNTAKK3YgLTAuMDQwODM1IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMDgwNjc0IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMDYwNzU0IC0xLjM2NjA3NyAtMC4xNDczNTAKK3YgLTAuMDYwNzU0IC0xLjM2NjA3NyAtMC4xNDczNTAKK3YgLTAuMDgwNjc0IC0xLjM2NjA3NyAtMC4xNDczNTAKK3YgLTAuMDgwNjc0IC0xLjM2NjA3NyAtMC4xNDE0ODAKK3YgLTAuMzA4MTU5IC0xLjEwOTc1OSAtMC4xNDE0ODIKK3YgLTAuMzA4MTU5IC0xLjEzMTE0NSAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjEzMTE0NSAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjEwOTc1OCAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjEwOTc1OSAtMC4xNDE0ODIKK3YgLTAuMDY1NjA0IC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMDY1NjA0IC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMDM1OTY3IC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMTE4MTQzIC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMTE4MTQzIC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMDk1MjQyIC0xLjM4MjcyNCAtMC4xNDczNTAKK3YgLTAuMzA4MTU5IC0xLjE1MTUzMyAtMC4xNDE0ODIKK3YgLTAuMjk3MDA4IC0xLjE1MTUyMCAtMC4xNDczNTEKK3YgLTAuMjk3MDA4IC0xLjE1MTUyMCAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjE1MTUzMyAtMC4xNDczNTEKK3YgLTAuMzA4MTU5IC0xLjE1MTUzMyAtMC4xNDE0ODIKK3YgLTAuMTE3MDM3IC0wLjg5NDc5MCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjg5NDc5MCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjk4NTUxMiAtMC4xNDczNTAKK3YgLTAuMTU2MTcxIC0wLjg5NDc3OCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjg5NDc3OCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjg0NzY2NCAtMC4xNDczNTEKK3YgLTAuMjUxODI0IC0wLjczMzcyNyAtMC4xNDE0ODEKK3YgLTAuMjU5NzQxIC0wLjc0MjU3NiAtMC4xNDczNTEKK3YgLTAuMjU5NzQxIC0wLjc0MjU3NiAtMC4xNDczNTEKK3YgLTAuMjUxODI0IC0wLjczMzcyNyAtMC4xNDczNTEKK3YgLTAuMjUxODI0IC0wLjczMzcyNyAtMC4xNDE0ODEKK3YgLTAuMjM0MTYyIC0wLjc2ODAyNSAtMC4xNDczNTEKK3YgLTAuMjM0MTYyIC0wLjc2ODAyNSAtMC4xNDczNTEKK3YgLTAuMjU2MTYyIC0wLjc5NTExOCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjczMjM4MyAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjc0NjEzMCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjc0NjEzMCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjczMjM4MyAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjczMjM4MyAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjc4NzYyOCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjc4NzYyOCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjgxNDA1MCAtMC4xNDczNTAKK3YgLTAuMTU2MTcxIC0wLjc2ODkwMiAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjc2ODkwMiAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjc0NjEzMCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjk4NTQ4NyAtMC4xNDczNTAKK3YgLTAuMTU2MTcxIC0wLjk4NTQ4NyAtMC4xNDczNTAKK3YgLTAuMTU2MTcxIC0wLjg5NDc3OCAtMC4xNDczNTEKK3YgLTAuMTE3MDM3IC0wLjk5Nzg4NCAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjk4NTUxMiAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjk4NTUxMiAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjk5Nzg4NCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjk5Nzg4NCAtMC4xNDE0ODEKK3YgLTAuMTE3MDM3IC0wLjc3MzAxNSAtMC4xNDE0ODEKK3YgLTAuMTAyNDAxIC0wLjc3NzUzMCAtMC4xNDczNTAKK3YgLTAuMTAyNDAxIC0wLjc3NzUzMCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjc3MzAxNSAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjc3MzAxNSAtMC4xNDE0ODEKK3YgLTAuMTU2MTcxIC0wLjg0NzY2NCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjg0NzY2NCAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjgxMTE5MSAtMC4xNDczNTEKK3YgLTAuMTE3MDM3IC0wLjg0NzY2OSAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjg0NzY2OSAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjg5NDc5MCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjgxNDA1MCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjgxNDA1MCAtMC4xNDczNTAKK3YgLTAuMTE3MDM3IC0wLjg0NzY2OSAtMC4xNDczNTAKK3YgLTAuMTU2MTcxIC0wLjgxMTE5MSAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjgxMTE5MSAtMC4xNDczNTEKK3YgLTAuMTU2MTcxIC0wLjc2ODkwMiAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjcyNDU2NSAtMC4xNDE0ODIKK3YgLTAuMjk0NDUyIC0wLjcxMjEwMSAtMC4xNDczNTEKK3YgLTAuMjk0NDUyIC0wLjcxMjEwMSAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjcyNDU2NSAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjcyNDU2NSAtMC4xNDE0ODIKK3YgLTAuMjk3NDYzIC0wLjY1NjE2MSAtMC4xNDczNTEKK3YgLTAuMjk3NDYzIC0wLjY1NjE2MSAtMC4xNDczNTEKK3YgLTAuMjU2NTIxIC0wLjYxODk2NSAtMC4xNDczNTEKK3YgLTAuMDA1NjU5IC0wLjcxNjEwNyAtMC4xNDczNTAKK3YgLTAuMTI3NDAwIC0wLjYwMjc3NiAtMC4xNDczNTEKK3YgLTAuMTI3NDAwIC0wLjYwMjc3NiAtMC4xNDczNTEKK3YgMC4wMDc5NjAgLTAuNjY4MTkwIC0wLjE0MTQ4MAordiAtMC4wMDEwNDkgLTAuNjU5ODYwIC0wLjE0NzM1MAordiAtMC4wMDEwNDkgLTAuNjU5ODYwIC0wLjE0NzM1MAordiAwLjAwNzk2MCAtMC42NjgxOTAgLTAuMTQ3MzUwCit2IDAuMDA3OTYwIC0wLjY2ODE5MCAtMC4xNDE0ODAKK3YgLTAuMDYxNzY3IC0wLjYwMzcyOCAtMC4xNDczNTAKK3YgLTAuMDYxNzY3IC0wLjYwMzcyOCAtMC4xNDczNTAKK3YgLTAuMDAxMDQ5IC0wLjY1OTg2MCAtMC4xNDczNTAKK3YgLTAuMjU2NDQ0IC0wLjY3NzU2OSAtMC4xNDczNTEKK3YgLTAuMjU2NDQ0IC0wLjY3NzU2OSAtMC4xNDczNTEKK3YgLTAuMjk0NDUyIC0wLjcxMjEwMSAtMC4xNDczNTEKK3YgLTAuMjU2NTIxIC0wLjYxODk2NSAtMC4xNDczNTEKK3YgLTAuMjU2NTIxIC0wLjYxODk2NSAtMC4xNDczNTEKK3YgLTAuMjAyOTM2IC0wLjU3MDI4MyAtMC4xNDczNTEKK3YgLTAuMTQwNDE5IC0wLjczMjQwMCAtMC4xNDczNTAKK3YgLTAuMTQwNDE5IC0wLjczMjQwMCAtMC4xNDczNTAKK3YgLTAuMTE2OTkyIC0wLjczMjQxNiAtMC4xNDczNTAKK3YgLTAuMjM5Nzk5IC0wLjc0Njk0MyAtMC4xNDczNTEKK3YgLTAuMjM5Nzk5IC0wLjc0Njk0MyAtMC4xNDczNTEKK3YgLTAuMjI3Nzc1IC0wLjc2MDE1NyAtMC4xNDczNTEKK3YgLTAuMTcyMDI1IC0wLjYwMDg3NSAtMC4xNDczNTEKK3YgLTAuMTcyMDI1IC0wLjYwMDg3NSAtMC4xNDczNTEKK3YgLTAuMjU2NDQ0IC0wLjY3NzU2OSAtMC4xNDczNTEKK3YgLTAuMjAyOTM2IC0wLjU3MDI4MyAtMC4xNDczNTEKK3YgLTAuMjAyOTM2IC0wLjU3MDI4MyAtMC4xNDczNTEKK3YgLTAuMTk1NDQ2IC0wLjU2MzQ3OCAtMC4xNDczNTEKK3YgLTAuMDk2MTU1IC0wLjU3MTkzNiAtMC4xNDczNTAKK3YgLTAuMDk2MTU1IC0wLjU3MTkzNiAtMC4xNDczNTAKK3YgLTAuMDYxNzY3IC0wLjYwMzcyOCAtMC4xNDczNTAKK3YgLTAuMTM3MTAyIC0wLjU5Mzc0NSAtMC4xNDE0ODEKK3YgLTAuMTI3NDAwIC0wLjYwMjc3NiAtMC4xNDczNTEKK3YgLTAuMTI3NDAwIC0wLjYwMjc3NiAtMC4xNDczNTEKK3YgLTAuMTM3MTAxIC0wLjU5Mzc0NSAtMC4xNDczNTEKK3YgLTAuMTM3MTAyIC0wLjU5Mzc0NSAtMC4xNDE0ODEKK3YgLTAuMTI3Nzc3IC0wLjUwMTk4MCAtMC4xNDczNTEKK3YgLTAuMTI3Nzc3IC0wLjUwMTk4MCAtMC4xNDczNTEKK3YgLTAuMDU2ODA4IC0wLjQzNzM0NCAtMC4xNDczNTAKK3YgLTAuMDk1NzQwIC0wLjUzMTU0MyAtMC4xNDczNTAKK3YgLTAuMDk1NzQwIC0wLjUzMTU0MyAtMC4xNDczNTAKK3YgLTAuMTA0MjQ4IC0wLjUzOTI5OSAtMC4xNDczNTAKK3YgLTAuMTYyNTAwIC0wLjUwODk0MCAtMC4xNDE0ODEKK3YgLTAuMTcxODg4IC0wLjQ5OTk5MiAtMC4xNDczNTEKK3YgLTAuMTcxODg4IC0wLjQ5OTk5MiAtMC4xNDczNTEKK3YgLTAuMTYyNTAwIC0wLjUwODk0MCAtMC4xNDczNTEKK3YgLTAuMTYyNTAwIC0wLjUwODk0MCAtMC4xNDE0ODEKK3YgLTAuMjA0MTQ4IC0wLjUyOTgzOCAtMC4xNDczNTEKK3YgLTAuMjA0MTQ4IC0wLjUyOTgzOCAtMC4xNDczNTEKK3YgLTAuMjQ3NDEwIC0wLjQ4ODU5NCAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjY2NTg5MCAtMC4xNDE0ODIKK3YgLTAuMzA4MTcxIC0wLjY5NTIyNyAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjY5NTIyNyAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjY2NTg5MCAtMC4xNDczNTEKK3YgLTAuMzA4MTcxIC0wLjY2NTg5MCAtMC4xNDE0ODIKK3YgLTAuMzA0MzU0IC0wLjM3MzcyNiAtMC4xNDE0ODIKK3YgLTAuMzA0MzU0IC0wLjQwNDAyNSAtMC4xNDczNTIKK3YgLTAuMzA0MzU0IC0wLjQwNDAyNSAtMC4xNDczNTIKK3YgLTAuMzA0MzU0IC0wLjM3MzcyNyAtMC4xNDczNTIKK3YgLTAuMzA0MzU0IC0wLjM3MzcyNiAtMC4xNDE0ODIKK3YgMC4wMDcxNzUgLTAuNDM3NzIyIC0wLjE0MTQ4MAordiAwLjAwNzE3NSAtMC40MDgzODUgLTAuMTQ3MzUwCit2IDAuMDA3MTc1IC0wLjQwODM4NSAtMC4xNDczNTAKK3YgMC4wMDcxNzUgLTAuNDM3NzIyIC0wLjE0NzM1MAordiAwLjAwNzE3NSAtMC40Mzc3MjIgLTAuMTQxNDgwCit2IDAuMDA3OTYwIC0wLjcyODc4NiAtMC4xNDE0ODAKK3YgMC4wMDc5NjAgLTAuNjk4NDg4IC0wLjE0NzM1MAordiAwLjAwNzk2MCAtMC42OTg0ODggLTAuMTQ3MzUwCit2IDAuMDA3OTYwIC0wLjcyODc4NiAtMC4xNDczNTAKK3YgMC4wMDc5NjAgLTAuNzI4Nzg2IC0wLjE0MTQ4MAordiAtMC4yOTcwMDggLTEuMTA5NzY5IC0wLjE0NzM1MQordiAtMC4yOTcwMDggLTEuMTA5NzY5IC0wLjE0NzM1MQordiAtMC4xMTgxNTYgLTEuMTA5OTMwIC0wLjE0NzM1MAordiAtMC4yMDQxNzYgMC4wMTQ1MzAgLTAuMTQxNDgyCit2IC0wLjIwMzU3MCAwLjAzMzI4NSAtMC4xNDczNTEKK3YgLTAuMjAzNTcwIDAuMDMzMjg1IC0wLjE0NzM1MQordiAtMC4yMDQxNzYgMC4wMTQ1MzEgLTAuMTQ3MzUxCit2IC0wLjIwNDE3NiAwLjAxNDUzMCAtMC4xNDE0ODIKK3YgLTAuMDk5MDkzIDAuMzE1ODMzIC0wLjE0MTQ4MQordiAtMC4wOTk4ODMgMC4yOTcwODYgLTAuMTQ3MzUxCit2IC0wLjA5OTg4MyAwLjI5NzA4NiAtMC4xNDczNTEKK3YgLTAuMDk5MDkzIDAuMzE1ODMzIC0wLjE0NzM1MQordiAtMC4wOTkwOTMgMC4zMTU4MzMgLTAuMTQxNDgxCit2IC0wLjEwMDY3MyAwLjI3ODMzOCAtMC4xNDE0ODEKK3YgLTAuMDkzNTMzIDAuMjc1NzIwIC0wLjE0NzM1MQordiAtMC4wOTM1MzMgMC4yNzU3MjAgLTAuMTQ3MzUxCit2IC0wLjEwMDY3MyAwLjI3ODMzOCAtMC4xNDczNTEKK3YgLTAuMTAwNjczIDAuMjc4MzM4IC0wLjE0MTQ4MQordiAtMC4wNDE2OTIgMC4yOTU1OTQgLTAuMTQxNDgxCit2IC0wLjA4OTA0OCAwLjMxMjI5MSAtMC4xNDczNTEKK3YgLTAuMDg5MDQ4IDAuMzEyMjkxIC0wLjE0NzM1MQordiAtMC4wNDE2OTIgMC4yOTU1OTQgLTAuMTQ3MzUxCit2IC0wLjA0MTY5MiAwLjI5NTU5NCAtMC4xNDE0ODEKK3YgLTAuMjU5MzUyIDAuMDMzOTcxIC0wLjE0MTQ4MgordiAtMC4yMTM4MzIgMC4wMTc5MzMgLTAuMTQ3MzUxCit2IC0wLjIxMzgzMiAwLjAxNzkzMyAtMC4xNDczNTEKK3YgLTAuMjU5MzUxIDAuMDMzOTcxIC0wLjE0NzM1MQordiAtMC4yNTkzNTIgMC4wMzM5NzEgLTAuMTQxNDgyCit2IC0wLjIwMjk2MyAwLjA1MjAzOSAtMC4xNDE0ODIKK3YgLTAuMjA5Njk3IDAuMDU0NTI4IC0wLjE0NzM1MQordiAtMC4yMDk2OTcgMC4wNTQ1MjggLTAuMTQ3MzUxCit2IC0wLjIwMjk2MyAwLjA1MjAzOSAtMC4xNDczNTEKK3YgLTAuMjAyOTYzIDAuMDUyMDM5IC0wLjE0MTQ4MgordiAwLjAwODU2NCAtMC4wNzMxNzEgLTAuMTQxNDgxCit2IDAuMDA4NTY0IC0wLjA1MjI4NCAtMC4xNDczNTAKK3YgMC4wMDg1NjQgLTAuMDUyMjg0IC0wLjE0NzM1MAordiAwLjAwODU2NCAtMC4wNzMxNzEgLTAuMTQ3MzUwCit2IDAuMDA4NTY0IC0wLjA3MzE3MSAtMC4xNDE0ODEKK3YgLTAuMzA4MTU5IC0wLjAzMTM5NyAtMC4xNDE0ODIKK3YgLTAuMzA4MTU5IC0wLjA1MjI4NCAtMC4xNDczNTIKK3YgLTAuMzA4MTU5IC0wLjA1MjI4NCAtMC4xNDczNTIKK3YgLTAuMzA4MTU5IC0wLjAzMTM5NyAtMC4xNDczNTIKK3YgLTAuMzA4MTU5IC0wLjAzMTM5NyAtMC4xNDE0ODIKK3YgLTAuMjE4MTk5IC0wLjA4OTg1OSAtMC4xNDE0ODIKK3YgLTAuMjM4MTE4IC0wLjA4OTg1OSAtMC4xNDczNTEKK3YgLTAuMjM4MTE4IC0wLjA4OTg1OSAtMC4xNDczNTEKK3YgLTAuMjE4MTk5IC0wLjA4OTg1OSAtMC4xNDczNTEKK3YgLTAuMjE4MTk5IC0wLjA4OTg1OSAtMC4xNDE0ODIKK3YgMC4wMDkyODcgLTAuMzQ2MTgwIC0wLjE0MTQ4MAordiAwLjAwOTI4NyAtMC4zMjUyOTMgLTAuMTQ3MzUwCit2IDAuMDA5Mjg3IC0wLjMyNTI5MyAtMC4xNDczNTAKK3YgMC4wMDkyODcgLTAuMzQ2MTgwIC0wLjE0NzM1MAordiAwLjAwOTI4NyAtMC4zNDYxODAgLTAuMTQxNDgwCit2IC0wLjIzMzIxMCAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjIzMzIxMCAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjI2MzA3OSAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjIzMzIxMCAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjIzMzIxMCAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjIwMzM0MiAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjIyNDg5MCAtMC4xMDEyNjcgLTAuMTQ3MzUxCit2IC0wLjIyNDg5MCAtMC4xMDEyNjcgLTAuMTQ3MzUxCit2IC0wLjI2Njg4OSAtMC4xNzI4NjQgLTAuMTQ3MzUxCit2IC0wLjI1ODAzOCAtMC4wODk4NTkgLTAuMTQxNDgyCit2IC0wLjI2MjIxOSAtMC4wOTcyODggLTAuMTQ3MzUyCit2IC0wLjI2MjIxOSAtMC4wOTcyODggLTAuMTQ3MzUyCit2IC0wLjI1ODAzNyAtMC4wODk4NTkgLTAuMTQ3MzUyCit2IC0wLjI1ODAzOCAtMC4wODk4NTkgLTAuMTQxNDgyCit2IC0wLjI5NjIxMyAtMC4wMzEzOTcgLTAuMTQ3MzUyCit2IC0wLjI5NjIxMyAtMC4wMzEzOTcgLTAuMTQ3MzUyCit2IC0wLjI2MzA3OSAtMC4wMzEzOTcgLTAuMTQ3MzUyCit2IC0wLjMwODE1OSAtMC4wNzMxNzEgLTAuMTQxNDgyCit2IC0wLjI5NjIxMyAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjI5NjIxMyAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjMwODE1OSAtMC4wNzMxNzEgLTAuMTQ3MzUyCit2IC0wLjMwODE1OSAtMC4wNzMxNzEgLTAuMTQxNDgyCit2IC0wLjAwMjkzNiAtMC4wNzMxNzEgLTAuMTQ3MzUwCit2IC0wLjAwMjkzNiAtMC4wNzMxNzEgLTAuMTQ3MzUwCit2IC0wLjA5NDgxNCAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IDAuMDA4NTY0IC0wLjAzMTM5NyAtMC4xNDE0ODEKK3YgLTAuMDAyOTM2IC0wLjAzMTM5NyAtMC4xNDczNTAKK3YgLTAuMDAyOTM2IC0wLjAzMTM5NyAtMC4xNDczNTAKK3YgMC4wMDg1NjQgLTAuMDMxMzk3IC0wLjE0NzM1MAordiAwLjAwODU2NCAtMC4wMzEzOTcgLTAuMTQxNDgxCit2IC0wLjE0ODE2OSAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNCAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjIwMzM0MiAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjAwNTU1NyAtMC4zNDYxNjQgLTAuMTQ3MzUwCit2IC0wLjAwNTU1NyAtMC4zNDYxNjQgLTAuMTQ3MzUwCit2IC0wLjA5NDgxNSAtMC4zNDYwNzEgLTAuMTQ3MzUxCit2IDAuMDA5Mjg3IC0wLjMwNDQwNiAtMC4xNDE0ODEKK3YgLTAuMDA1NTU3IC0wLjMwNDQyNSAtMC4xNDczNTAKK3YgLTAuMDA1NTU3IC0wLjMwNDQyNSAtMC4xNDczNTAKK3YgMC4wMDkyODcgLTAuMzA0NDA2IC0wLjE0NzM1MAordiAwLjAwOTI4NyAtMC4zMDQ0MDYgLTAuMTQxNDgxCit2IC0wLjA5NDgxNSAtMC4zMDQ1NDAgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNSAtMC4zMDQ1NDAgLTAuMTQ3MzUxCit2IC0wLjAwNTU1NyAtMC4zMDQ0MjUgLTAuMTQ3MzUwCit2IC0wLjA5NDgxNCAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNCAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjE0ODE2OSAtMC4wNzMxNzEgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNCAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNCAtMC4wMzEzOTcgLTAuMTQ3MzUxCit2IC0wLjAwMjkzNiAtMC4wMzEzOTcgLTAuMTQ3MzUwCit2IC0wLjA5NDgxNSAtMC4zNDYwNzEgLTAuMTQ3MzUxCit2IC0wLjA5NDgxNSAtMC4zNDYwNzEgLTAuMTQ3MzUxCit2IC0wLjE4NTczNSAtMC4zNDU5NzggLTAuMTQ3MzUxCit2IDAuMDAxMDAwIC0wLjQ0MzM1MiAtMC4xNDczNTAKK3YgMC4wMDEwMDAgLTAuNDQzMzUyIC0wLjE0NzM1MAordiAtMC4wNTY3OTcgLTAuNDk2MDQxIC0wLjE0NzM1MAordiAwLjAwNzE3NSAtMC4zNzkwNDcgLTAuMTQxNDgwCit2IC0wLjAwMDkyMiAtMC4zODY0MjMgLTAuMTQ3MzUwCit2IC0wLjAwMDkyMiAtMC4zODY0MjMgLTAuMTQ3MzUwCit2IDAuMDA3MTc1IC0wLjM3OTA0NyAtMC4xNDczNTAKK3YgMC4wMDcxNzUgLTAuMzc5MDQ3IC0wLjE0MTQ4MAordiAtMC4yOTE1NzAgLTAuMzg1OTEyIC0wLjE0NzM1MQordiAtMC4yOTE1NzAgLTAuMzg1OTEyIC0wLjE0NzM1MQordiAtMC4yNDc0MTQgLTAuNDI4MDAxIC0wLjE0NzM1MQordiAtMC4zMDQzNTQgLTAuNDM0MzI0IC0wLjE0MTQ4MgordiAtMC4yOTU0NDEgLTAuNDQyODE5IC0wLjE0NzM1MQordiAtMC4yOTU0NDEgLTAuNDQyODE5IC0wLjE0NzM1MQordiAtMC4zMDQzNTQgLTAuNDM0MzI0IC0wLjE0NzM1MgordiAtMC4zMDQzNTQgLTAuNDM0MzI0IC0wLjE0MTQ4MgordiAtMC4yNDc0MTAgLTAuNDg4NTk0IC0wLjE0NzM1MQordiAtMC4yNDc0MTAgLTAuNDg4NTk0IC0wLjE0NzM1MQordiAtMC4yOTU0NDEgLTAuNDQyODE5IC0wLjE0NzM1MQordiAtMC4yNDc0MTQgLTAuNDI4MDAxIC0wLjE0NzM1MQordiAtMC4yNDc0MTQgLTAuNDI4MDAxIC0wLjE0NzM1MQordiAtMC4xNzE4ODggLTAuNDk5OTkyIC0wLjE0NzM1MQordiAtMC4wNTY4MDggLTAuNDM3MzQ0IC0wLjE0NzM1MAordiAtMC4wNTY4MDggLTAuNDM3MzQ0IC0wLjE0NzM1MAordiAtMC4wMDA5MjIgLTAuMzg2NDIzIC0wLjE0NzM1MAordiAtMC4wNTY3OTcgLTAuNDk2MDQxIC0wLjE0NzM1MAordiAtMC4wNTY3OTcgLTAuNDk2MDQxIC0wLjE0NzM1MAordiAtMC4wOTU3NDAgLTAuNTMxNTQzIC0wLjE0NzM1MAordiAtMC4xNDc2MTIgLTEuNDI0NDk4IC0wLjE0NzM1MAordiAtMC4yOTY3NzMgLTEuNDI0NDk4IC0wLjE0NzM1MQordiAtMC4yOTY3NzMgLTEuNDI0NDk4IC0wLjE0NzM1MQordiAxLjI3OTU0NyAwLjI2MTMyNSAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgMC42NzY3OTAgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDAuMjYxMzI1IC0wLjAxOTg1NAordiAtMS41NzQ3OTAgLTEuNDg4Mjc5IC0wLjAxOTg2NgordiAtMS41NzQ3OTEgLTEuODI4NDIxIC0wLjAxOTg2NgordiAtMS41NzQ3OTAgLTEuNDg4Mjc5IC0wLjAxOTg2NgordiAxLjI3OTU0NyAwLjAwOTgzNiAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMC4yNjEzMjUgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDAuMDA5ODM2IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC4yMzk2NjggLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDAuMDA5ODM2IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC4yMzk2NjggLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0wLjQ4OTQwOCAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTAuMjM5NjY4IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC40ODk0MDggLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0wLjczODc5NyAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTAuNDg5NDA4IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC43Mzg3OTcgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0wLjk4ODM2NSAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTAuNzM4Nzk3IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMC45ODgzNjUgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0xLjIzODA0NyAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTAuOTg4MzY1IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMS4yMzgwNDcgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0xLjQ4ODI3OSAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTEuMjM4MDQ3IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMS40ODgyNzkgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0xLjgyODQyMSAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTEuNDg4Mjc5IC0wLjAxOTg1NAordiAxLjI3OTU0NiAtMS44Mjg0MjEgLTAuMDE5ODU0Cit2IC0xLjU3NDc5MCAtMS4yMzgwNDcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMS40ODgyNzkgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMS4yMzgwNDcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC45ODgzNjQgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMS4yMzgwNDcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC45ODgzNjQgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC43Mzg3OTcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC45ODgzNjQgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC43Mzg3OTcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC40ODk0MDggLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC43Mzg3OTcgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC40ODk0MDggLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC4yMzk2NjggLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC40ODk0MDggLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMC4yMzk2NjggLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAwLjAwOTgzNiAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIC0wLjIzOTY2OCAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIDAuMDA5ODM2IC0wLjAxOTg2NgordiAtMS41NzQ3OTAgMC4yNjE0MjAgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAwLjAwOTgzNiAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIDAuMjYxNDIwIC0wLjAxOTg2NgordiAtMS41NzQ3OTAgMC42NzcwNzEgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAwLjI2MTQyMCAtMC4wMTk4NjYKK3YgLTEuNTc0NzkwIDAuNjc3MDcxIC0wLjAxOTg2NgordiAtMS41NzQ3OTAgLTIuMjYzMjM4IC0wLjAxOTg2NgordiAtMS41NzQ3OTEgLTEuODI4NDIxIC0wLjAxOTg2NgordiAtMS41NzQ3OTAgLTIuMjYzMjM4IC0wLjAxOTg2NgordiAxLjI3OTU0NiAtMS44Mjg0MjEgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0yLjI2MzIzOCAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTEuODI4NDIxIC0wLjAxOTg1NAordiAtMS41NzQ3OTEgLTIuNDY2NjcyIC0wLjAxOTg2NgordiAtMS41NDcyNTMgLTIuNjAzMjc1IC0wLjAxOTg2NgordiAtMS41NzQ3OTEgLTIuNDY2NjcyIC0wLjAxOTg2NgordiAtMS41NDcyNTMgLTIuNjAzMjc1IC0wLjAxOTg2NgordiAtMS40NzE4NjQgLTIuNzE0NzYwIC0wLjAxOTg2NQordiAtMS41NDcyNTMgLTIuNjAzMjc1IC0wLjAxOTg2NgordiAtMS40NzE4NjQgLTIuNzE0NzYwIC0wLjAxOTg2NQordiAtMS4zNjAxNzcgLTIuNzkwMzEyIC0wLjAxOTg2NQordiAtMS40NzE4NjQgLTIuNzE0NzYwIC0wLjAxOTg2NQordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyMTg3MgordiAxLjI1MTkwNiAtMi42MDMzMDIgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0yLjQ2NjY2OSAtMC4wMTk4NTQKK3YgMS4yNTE5MDYgLTIuNjAzMzAyIC0wLjAxOTg1NAordiAxLjE3NzEyNCAtMi43MTQ3NDQgLTAuMDE5ODU0Cit2IDEuMjUxOTA2IC0yLjYwMzMwMiAtMC4wMTk4NTQKK3YgMS4xNzcxMjQgLTIuNzE0NzQ0IC0wLjAxOTg1NAordiAxLjA2NDY2MCAtMi43OTAzMTggLTAuMDE5ODU1Cit2IDEuMDY1NDM1IC0yLjc5MjE2NyAtMC4wMjE4NjIKK3YgMS4xNzcxMjQgLTIuNzE0NzQ0IC0wLjAxOTg1NAordiAxLjA2NDY2MCAtMi43OTAzMTggLTAuMDE5ODU1Cit2IDAuNDAzOTk5IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC40MDM5OTkgLTIuODE5MTc5IC0wLjAyMTg2NAordiAtMC40MzU1MTEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC40MzU1MTEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC4zMzQ1MTggLTIuODE5MTc5IC0wLjAyMTg2NgordiAwLjE0MDI1NSAtMi44MTkxNzkgLTAuMDIxODY1Cit2IDAuNDAzOTk5IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC40MDM5OTkgLTIuODE5MTc5IC0wLjAyMTg2NAordiAtMC42OTk3ODEgLTIuODE5MTc5IC0wLjAyMTg2NwordiAtMC40MzU1MTEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC40MzU1MTEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAwLjAzODc2NiAtMi44MTkxNzkgLTAuMDIxODY1Cit2IDAuMTQwMjU1IC0yLjgxOTE3OSAtMC4wMjE4NjUKK3YgMC4xNDAyNTUgLTIuODE5MTc5IC0wLjAyMTg2NQordiAtMC44Mzg4ODAgLTIuODE5MTc5IC0wLjAyMTg2NwordiAtMC42OTk3ODEgLTIuODE5MTc5IC0wLjAyMTg2NwordiAtMC42OTk3ODEgLTIuODE5MTc5IC0wLjAyMTg2NwordiAtMS41NDkxMDQgLTIuNjA0MDYxIC0wLjAyMTg3MgordiAtMS41NzY3NTkgLTIuNDY2NjczIC0wLjAyMTg3MwordiAtMS41NDkxMDQgLTIuNjA0MDYxIC0wLjAyMTg3MgordiAtMS40NzMyODIgLTIuNzE2MTcwIC0wLjAyMTg3MgordiAtMS41NDkxMDQgLTIuNjA0MDYxIC0wLjAyMTg3MgordiAtMS40NzMyODIgLTIuNzE2MTcwIC0wLjAyMTg3MgordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyMTg3MgordiAtMS40NzMyODIgLTIuNzE2MTcwIC0wLjAyMTg3MgordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyMTg3MgordiAtMS4yMjI0NTkgLTIuODE5MTc5IC0wLjAyMTg2OAordiAtMS4zNjA5NTIgLTIuNzkyMTY2IC0wLjAyMTg3MgordiAtMS4yMjI0NTkgLTIuODE5MTc5IC0wLjAyMTg2OAordiAxLjA2NTQzNSAtMi43OTIxNjcgLTAuMDIxODYyCit2IDAuOTM1MzA5IC0yLjgxOTE3OSAtMC4wMjE4NjMKK3YgMS4wNjU0MzUgLTIuNzkyMTY3IC0wLjAyMTg2MgordiAxLjI4MTUxNSAtMi40NjY2NjkgLTAuMDIxODYxCit2IDEuMjUzNzU4IC0yLjYwNDA2NSAtMC4wMjE4NjEKK3YgMS4yODE1MTUgLTIuNDY2NjY5IC0wLjAyMTg2MQordiAxLjI1Mzc1OCAtMi42MDQwNjUgLTAuMDIxODYxCit2IDEuMTc4NTQyIC0yLjcxNjE2OSAtMC4wMjE4NjEKK3YgMS4yNTM3NTggLTIuNjA0MDY1IC0wLjAyMTg2MQordiAxLjE3ODU0MiAtMi43MTYxNjkgLTAuMDIxODYxCit2IDEuMDY1NDM1IC0yLjc5MjE2NyAtMC4wMjE4NjIKK3YgMS4xNzg1NDIgLTIuNzE2MTY5IC0wLjAyMTg2MQordiAwLjkzNTMwOSAtMi44MTkxNzkgLTAuMDIxODYzCit2IC0xLjAyODMwOCAtMi44MTkxNzkgLTAuMDIxODY4Cit2IC0xLjAyODMwOCAtMi44MTkxNzkgLTAuMDIxODY4Cit2IC0xLjIyMjQ1OSAtMi44MTkxNzkgLTAuMDIxODY4Cit2IDAuNTIyNzgwIC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC42NjA0NjIgLTIuODE5MTc5IC0wLjAyMTg2NAordiAtMS4wMjgzMDggLTIuODE5MTc5IC0wLjAyMTg2OAordiAtMC45MzcwMjQgLTIuODE5MTc5IC0wLjAyMTg2NwordiAtMC4zMzQ1MTggLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC4zMjYwNjEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAwLjAzMDg4NSAtMi44MTkxNzkgLTAuMDIxODY1Cit2IDAuMDM4NzY2IC0yLjgxOTE3OSAtMC4wMjE4NjUKK3YgMC4wMzg3NjYgLTIuODE5MTc5IC0wLjAyMTg2NQordiAtMC4zMTY1NjcgLTIuNzk0ODAwIC0wLjAzNDQyMAordiAtMC4zMTY1NjcgLTIuNzk0ODAwIC0wLjAzNDQyMAordiAtMC4zMTY1NjcgLTIuODE4Mzk2IC0wLjAzNDQyMwordiAwLjAyMTIzNyAtMi43OTQ4MDAgLTAuMDM0NDMxCit2IDAuMDIxMjM3IC0yLjc5NDgwMCAtMC4wMzQ0MzEKK3YgMC4wMjEyMzcgLTIuODE4Mzk2IC0wLjAzNDQzMwordiAtMC4zMjUwMDggLTIuODE4NDA2IC0wLjAyMTg2NgordiAtMC4zMjUwMDggLTIuODE4NDA2IC0wLjAyMTg2NgordiAtMC4zMjU3ODcgLTIuODE2NDA1IC0wLjAyMDM4OAordiAtMC4zMjYwNjEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC4zMjQzMDUgLTIuODE5MTgzIC0wLjAyNDE2NAordiAtMC4zMjYwNjEgLTIuODE5MTc5IC0wLjAyMTg2NgordiAtMC4zMjQzMDUgLTIuODE5MTgzIC0wLjAyNDE2NAordiAtMC4zMTcyODMgLTIuODE5MTgzIC0wLjAzNDkxMwordiAtMC4zMjQzMDUgLTIuODE5MTgzIC0wLjAyNDE2NAordiAtMC4zMTcyODMgLTIuODE5MTgzIC0wLjAzNDkxMwordiAtMC4yODgyMzYgLTIuODE5MTgzIC0wLjA0NjgyNAordiAtMC4yODgyMzYgLTIuODE4Mzk2IC0wLjA0NjAyNgordiAtMC4yODgyMzYgLTIuODE4Mzk2IC0wLjA0NjAyNgordiAtMC4zMTY1NjcgLTIuODE4Mzk2IC0wLjAzNDQyMwordiAtMC4zMTcyODMgLTIuODE5MTgzIC0wLjAzNDkxMwordiAtMC4yNjk1MDAgLTIuODE4Mzk2IC0wLjA0NjAyNgordiAtMC4yNjk1MDAgLTIuODE4Mzk2IC0wLjA0NjAyNgordiAtMC4yODgyMzYgLTIuODE4Mzk2IC0wLjA0NjAyNgordiAwLjAyMTIzNyAtMi44MTgzOTYgLTAuMDM0NDMzCit2IDAuMDIxMjM3IC0yLjgxODM5NiAtMC4wMzQ0MzMKK3YgLTAuMDA3MDQxIC0yLjgxODM5NiAtMC4wNDYwMjgKK3YgMC4wMjgyNjAgLTIuODE4Mzk2IC0wLjAyNDE2MgordiAwLjAyODI2MCAtMi44MTgzOTYgLTAuMDI0MTYyCit2IDAuMDIxMjM3IC0yLjgxODM5NiAtMC4wMzQ0MzMKK3YgMC4wMjk4MDMgLTIuODE4NDA2IC0wLjAyMTg2NQordiAwLjAyOTgwMyAtMi44MTg0MDYgLTAuMDIxODY1Cit2IDAuMDI4MjYwIC0yLjgxODM5NiAtMC4wMjQxNjIKK3YgMC4wMzA4ODUgLTIuODE5MTc5IC0wLjAyMTg2NQordiAwLjAzMDk4OCAtMi44MTY0MDcgLTAuMDIwMzg4Cit2IDAuMDMwOTg4IC0yLjgxNjQwNyAtMC4wMjAzODgKK3YgMC4wMjk4MDMgLTIuODE4NDA2IC0wLjAyMTg2NQordiAwLjAzMDg4NSAtMi44MTkxNzkgLTAuMDIxODY1Cit2IC0wLjMyNTc4NyAtMi44MTY0MDUgLTAuMDIwMzg4Cit2IC0wLjMyNTc4NyAtMi44MTY0MDUgLTAuMDIwMzg4Cit2IC0wLjMyNTgxNiAtMi43OTQ4MDAgLTAuMDIwMzkxCit2IDAuMDMwOTkxIC0yLjc5NDgwMCAtMC4wMjAzOTAKK3YgMC4wMzA5OTEgLTIuNzk0ODAwIC0wLjAyMDM5MAordiAwLjAzMDk4OCAtMi44MTY0MDcgLTAuMDIwMzg4Cit2IC0wLjE0NzYxMyAtMi44MTgzOTYgLTAuMDQ2MDI5Cit2IC0wLjI2OTUwMCAtMi44MTgzOTYgLTAuMDQ2MDI2Cit2IC0wLjI2OTUwMCAtMi44MTgzOTYgLTAuMDQ2MDI2Cit2IC0wLjAwNzA0MSAtMi44MTgzOTYgLTAuMDQ2MDI4Cit2IC0wLjAwNzA0MSAtMi44MTgzOTYgLTAuMDQ2MDI4Cit2IC0wLjAyNjE2NSAtMi44MTgzOTYgLTAuMDQ2MDI4Cit2IDEuMjgxNTE1IC0yLjQ2NjY2OSAtMC4wMjE4NjEKK3YgMS4yODE1MTUgLTIuNDY2NjY5IC0wLjAyMTg2MQordiAxLjI3OTU0NiAtMi4yNjMyMzggLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IC0yLjI2MzIzOCAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgLTIuNDY2NjY5IC0wLjAxOTg1NAordiAxLjI4MTUxNSAtMi40NjY2NjkgLTAuMDIxODYxCit2IC0xLjU3NDc5MSAtMi40NjY2NzIgLTAuMDE5ODY2Cit2IC0xLjU3NDc5MCAtMi4yNjMyMzggLTAuMDE5ODY2Cit2IC0xLjU3Njc1OSAtMi40NjY2NzMgLTAuMDIxODczCit2IC0xLjU3NDc5MSAtMi40NjY2NzIgLTAuMDE5ODY2Cit2IC0xLjU3Njc1OSAtMi40NjY2NzMgLTAuMDIxODczCit2IC0xLjU3Njc1OSAtMi40NjY2NzMgLTAuMDIxODczCit2IC0wLjkzNzAyNCAtMi44MTkxNzkgLTAuMDIxODY3Cit2IC0wLjgzODg4MCAtMi44MTkxNzkgLTAuMDIxODY3Cit2IC0wLjgzODg4MCAtMi44MTkxNzkgLTAuMDIxODY3Cit2IDAuNjMyODQ3IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC42MzI4NDcgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjUyMjc4MCAtMi44MTkxNzkgLTAuMDIxODY0Cit2IC0xLjQ3MTkxOSAyLjg2MjQ2NSAtMC4wMTk4NjQKK3YgLTEuNTQ3MTUyIDIuNzUwODc5IC0wLjAxOTg2NQordiAtMS40NzE5MTkgMi44NjI0NjUgLTAuMDE5ODY0Cit2IC0xLjU0NzE1MiAyLjc1MDg3OSAtMC4wMTk4NjUKK3YgLTEuNTc2NzU4IDIuNjE0OTAyIC0wLjAyMTg3MgordiAtMS41NzY3NTggMi42MTQ5MDIgLTAuMDIxODcyCit2IC0xLjU3NDc5MCAyLjYxNDcwNCAtMC4wMTk4NjUKK3YgLTEuNTQ3MTUyIDIuNzUwODc5IC0wLjAxOTg2NQordiAtMS4zNjAyMjEgMi45Mzc4MzEgLTAuMDE5ODY0Cit2IC0xLjQ3MzIzNyAyLjg2Mzk3NiAtMC4wMjE4NzEKK3YgLTEuNDczMjM3IDIuODYzOTc2IC0wLjAyMTg3MQordiAtMS40NzE5MTkgMi44NjI0NjUgLTAuMDE5ODY0Cit2IC0xLjM2MDIyMSAyLjkzNzgzMSAtMC4wMTk4NjQKK3YgLTEuMjI0NDk0IDIuOTY2MjE2IC0wLjAxOTg2NAordiAtMS4zNjAyMjEgMi45Mzc4MzEgLTAuMDE5ODY0Cit2IC0xLjIyNDQ5NCAyLjk2NjIxNiAtMC4wMTk4NjQKK3YgLTEuMDQyMzQ1IDIuOTY2MjE2IC0wLjAxOTg2MwordiAtMS4yMjQ2OTIgMi45NjgxODYgLTAuMDIxODcwCit2IC0xLjIyNDY5MiAyLjk2ODE4NiAtMC4wMjE4NzAKK3YgLTEuMjI0NDk0IDIuOTY2MjE2IC0wLjAxOTg2NAordiAtMS4wNDIzNDUgMi45NjYyMTYgLTAuMDE5ODYzCit2IC0xLjU3NDc5MCAyLjYxNDcwNCAtMC4wMTk4NjUKK3YgLTEuNTc0NzkwIDIuNDE1MDQ3IC0wLjAxOTg2NQordiAtMS41NzQ3OTAgMi42MTQ3MDQgLTAuMDE5ODY1Cit2IC0wLjkzNzA5MCAyLjk2NjIxNiAtMC4wMTk4NjIKK3YgLTEuMDQyMzQ1IDIuOTY2MjE2IC0wLjAxOTg2MwordiAtMC45MzcwOTAgMi45NjYyMTYgLTAuMDE5ODYyCit2IC0wLjM2OTQyOCAyLjk2NjIxNiAtMC4wMTk4NjAKK3YgLTAuNjk5NzgwIDIuOTY2MjE2IC0wLjAxOTg2MgordiAtMC4zNjk0MjggMi45NjYyMTYgLTAuMDE5ODYwCit2IC0wLjE0NzYxMiAyLjk2NjIxNiAtMC4wMTk4NTkKK3YgLTAuMzY5NDI4IDIuOTY2MjE2IC0wLjAxOTg2MAordiAtMC4xNDc2MTIgMi45NjYyMTYgLTAuMDE5ODU5Cit2IC0wLjY5OTc4MCAyLjk2NjIxNiAtMC4wMTk4NjIKK3YgLTAuODM4OTQ2IDIuOTY2MjE2IC0wLjAxOTg2MgordiAtMC42OTk3ODAgMi45NjYyMTYgLTAuMDE5ODYyCit2IC0wLjgzODk0NiAyLjk2NjIxNiAtMC4wMTk4NjIKK3YgLTAuOTM3MDkwIDIuOTY2MjE2IC0wLjAxOTg2MgordiAtMC44Mzg5NDYgMi45NjYyMTYgLTAuMDE5ODYyCit2IC0xLjU0OTAwMyAyLjc1MTY1NSAtMC4wMjE4NzIKK3YgLTEuNDczMjM3IDIuODYzOTc2IC0wLjAyMTg3MQordiAtMS41NDkwMDMgMi43NTE2NTUgLTAuMDIxODcyCit2IC0xLjU0OTAwMyAyLjc1MTY1NSAtMC4wMjE4NzIKK3YgLTEuNDczMjM3IDIuODYzOTc2IC0wLjAyMTg3MQordiAtMS4zNjA5OTYgMi45Mzk2ODMgLTAuMDIxODcxCit2IC0xLjQ3MzIzNyAyLjg2Mzk3NiAtMC4wMjE4NzEKK3YgLTEuMzYwOTk2IDIuOTM5NjgzIC0wLjAyMTg3MQordiAtMS4yMjQ2OTIgMi45NjgxODYgLTAuMDIxODcwCit2IC0xLjM2MDk5NiAyLjkzOTY4MyAtMC4wMjE4NzEKK3YgLTEuMjI0NjkyIDIuOTY4MTg2IC0wLjAyMTg3MAordiAtMS4yMjQ2OTIgMi45NjgxODYgLTAuMDIxODcwCit2IC0xLjU3NDc5MCAyLjQxNTA0NyAtMC4wMTk4NjUKK3YgLTEuNTc0NzkwIDIuMTU2MTE2IC0wLjAxOTg2NQordiAtMS41NzQ3OTAgMi40MTUwNDcgLTAuMDE5ODY1Cit2IDEuMTc2NTY5IDIuODYyNTYzIC0wLjAxOTg1NAordiAxLjI1MTg4NiAyLjc1MDkxOCAtMC4wMTk4NTQKK3YgMS4xNzY1NjkgMi44NjI1NjMgLTAuMDE5ODU0Cit2IDEuMjUxODg2IDIuNzUwOTE4IC0wLjAxOTg1NAordiAxLjI3OTU0NyAyLjYxNDAwMCAtMC4wMTk4NTQKK3YgMS4yODE1MTUgMi42MTQxOTcgLTAuMDIxODYxCit2IDEuMjgxNTE1IDIuNjE0MTk3IC0wLjAyMTg2MQordiAxLjI1MTg4NiAyLjc1MDkxOCAtMC4wMTk4NTQKK3YgMS4wNjQ5NzAgMi45Mzc4MzEgLTAuMDE5ODU1Cit2IDEuMTc2NTY5IDIuODYyNTYzIC0wLjAxOTg1NAordiAxLjE3Nzk4NyAyLjg2Mzk4MSAtMC4wMjE4NjEKK3YgMS4xNzc5ODcgMi44NjM5ODEgLTAuMDIxODYxCit2IDEuMDY0OTcwIDIuOTM3ODMxIC0wLjAxOTg1NQordiAwLjkyOTI3MiAyLjk2NjIxNiAtMC4wMTk4NTUKK3YgMS4wNjQ5NzAgMi45Mzc4MzEgLTAuMDE5ODU1Cit2IDEuMDY1NzQ2IDIuOTM5NjgzIC0wLjAyMTg2MgordiAxLjA2NTc0NiAyLjkzOTY4MyAtMC4wMjE4NjIKK3YgMC45MjkyNzIgMi45NjYyMTYgLTAuMDE5ODU1Cit2IDAuNzQ3NzYxIDIuOTY2MjE2IC0wLjAxOTg1NgordiAwLjkyOTI3MiAyLjk2NjIxNiAtMC4wMTk4NTUKK3YgMC45Mjk0NjkgMi45NjgxODYgLTAuMDIxODYyCit2IDAuOTI5NDY5IDIuOTY4MTg2IC0wLjAyMTg2MgordiAwLjc0Nzc2MSAyLjk2NjIxNiAtMC4wMTk4NTYKK3YgMS4yNzk1NDcgMi42MTQwMDAgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDIuNDY1MTEwIC0wLjAxOTg1NAordiAxLjI3OTU0NyAyLjYxNDAwMCAtMC4wMTk4NTQKK3YgMC42NDE4MDggMi45NjYyMTYgLTAuMDE5ODU2Cit2IDAuNzQ3NzYxIDIuOTY2MjE2IC0wLjAxOTg1NgordiAwLjY0MTgwOCAyLjk2NjIxNiAtMC4wMTk4NTYKK3YgMC4wNzQxOTEgMi45NjYyMTYgLTAuMDE5ODU4Cit2IDAuNDA0NTQyIDIuOTY2MjE2IC0wLjAxOTg1NwordiAwLjA3NDE5MSAyLjk2NjIxNiAtMC4wMTk4NTgKK3YgMS4yODE1MTUgMS41MDU0MTIgLTAuMDIxODYxCit2IC0wLjE0NzYxMiAyLjk2NjIxNiAtMC4wMTk4NTkKK3YgMC4wNzQxOTEgMi45NjYyMTYgLTAuMDE5ODU4Cit2IC0wLjE0NzYxMiAyLjk2NjIxNiAtMC4wMTk4NTkKK3YgMC40MDQ1NDIgMi45NjYyMTYgLTAuMDE5ODU3Cit2IDAuNTIyNjUzIDIuOTY2MjE2IC0wLjAxOTg1NwordiAwLjQwNDU0MiAyLjk2NjIxNiAtMC4wMTk4NTcKK3YgMC41MjI2NTMgMi45NjYyMTYgLTAuMDE5ODU3Cit2IDAuNjQxODA4IDIuOTY2MjE2IC0wLjAxOTg1NgordiAwLjUyMjY1MyAyLjk2NjIxNiAtMC4wMTk4NTcKK3YgMS4yNTM3MzggMi43NTE2OTMgLTAuMDIxODYxCit2IDEuMTc3OTg3IDIuODYzOTgxIC0wLjAyMTg2MQordiAxLjI1MzczOCAyLjc1MTY5MyAtMC4wMjE4NjEKK3YgMS4yNTM3MzggMi43NTE2OTMgLTAuMDIxODYxCit2IDEuMTc3OTg3IDIuODYzOTgxIC0wLjAyMTg2MQordiAxLjA2NTc0NiAyLjkzOTY4MyAtMC4wMjE4NjIKK3YgMS4xNzc5ODcgMi44NjM5ODEgLTAuMDIxODYxCit2IDEuMDY1NzQ2IDIuOTM5NjgzIC0wLjAyMTg2MgordiAwLjkyOTQ2OSAyLjk2ODE4NiAtMC4wMjE4NjIKK3YgMS4wNjU3NDYgMi45Mzk2ODMgLTAuMDIxODYyCit2IDAuOTI5NDY5IDIuOTY4MTg2IC0wLjAyMTg2MgordiAwLjkyOTQ2OSAyLjk2ODE4NiAtMC4wMjE4NjIKK3YgMS4yNzk1NDYgMi4xNTYxMTYgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMDU5MDE4IC0wLjAxOTg1NAordiAxLjI3OTU0NiAyLjE1NjExNiAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMi4zMzM4ODkgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMjUzODMwIC0wLjAxOTg1NAordiAxLjI3OTU0NyAyLjMzMzg4OSAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgMi4yNTM4MzAgLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMTU2MTE2IC0wLjAxOTg1NAordiAxLjI3OTU0NiAyLjI1MzgzMCAtMC4wMTk4NTQKK3YgMS4yNzk1NDYgMi4wNTkwMTggLTAuMDE5ODU0Cit2IDEuMjc5NTQ2IDIuMDU5MDE4IC0wLjAxOTg1NAordiAxLjI3OTU0NyAxLjk4MDczOSAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMi40NjUxMTAgLTAuMDE5ODU0Cit2IDEuMjc5NTQ3IDIuMzMzODg5IC0wLjAxOTg1NAordiAxLjI3OTU0NyAyLjQ2NTExMCAtMC4wMTk4NTQKK3YgMS4yODE1MTUgMS45MDQxMzMgLTAuMDIxODYxCit2IDEuMjc5NTQ3IDEuOTgwNzM5IC0wLjAxOTg1NAordiAxLjI3OTU0NyAxLjk4MDczOSAtMC4wMTk4NTQKK3YgMS4yNzk1NDcgMS45MDQxMzMgLTAuMDE5ODU0Cit2IDEuMjgxNTE1IDEuOTA0MTMzIC0wLjAyMTg2MQordiAxLjI4MTUxNSAxLjkwNDEzMyAtMC4wMjE4NjEKK3YgMC41OTYyNDMgMi4yOTI3MzMgLTAuMTQ1Mzc4Cit2IDAuNTk2MjQzIDIuMjkyNzMzIC0wLjE0NTM3OAordiAwLjYwNzk0NCAyLjI1MjA0OSAtMC4xNDUzNzgKK3YgMC41OTYyNDMgMi4yOTI3MzMgLTAuMTQ0NjU1Cit2IDAuNTY1NDUzIDIuMzIxNjYxIC0wLjE0NTM3OQordiAwLjU2NTQ1MyAyLjMyMTY2MSAtMC4xNDUzNzkKK3YgMC41OTYyNDMgMi4yOTI3MzMgLTAuMTQ1Mzc4Cit2IDAuNTk2MjQzIDIuMjkyNzMzIC0wLjE0NDY1NQordiAwLjUyMjQzNCAyLjMzMjY0MSAtMC4xNDUzNzkKK3YgMC41MjI0MzQgMi4zMzI2NDEgLTAuMTQ1Mzc5Cit2IDAuNTY1NDUzIDIuMzIxNjYxIC0wLjE0NTM3OQordiAwLjQ3OTQyNiAyLjMyMTYwMCAtMC4xNDUzNzkKK3YgMC40Nzk0MjYgMi4zMjE2MDAgLTAuMTQ1Mzc5Cit2IDAuNTIyNDM0IDIuMzMyNjQxIC0wLjE0NTM3OQordiAwLjQ0ODYwNCAyLjI5Mjc1OCAtMC4xNDUzNzkKK3YgMC40NDg2MDQgMi4yOTI3NTggLTAuMTQ1Mzc5Cit2IDAuNDc5NDI2IDIuMzIxNjAwIC0wLjE0NTM3OQordiAwLjQ0ODYwNCAyLjI5Mjc1OCAtMC4xNDQ2NTYKK3YgMC40MzY4NTMgMi4yNTIwNDYgLTAuMTQ1Mzc5Cit2IDAuNDM2ODUzIDIuMjUyMDQ2IC0wLjE0NTM3OQordiAwLjQ0ODYwNCAyLjI5Mjc1OCAtMC4xNDUzNzkKK3YgMC40NDg2MDQgMi4yOTI3NTggLTAuMTQ0NjU2Cit2IDAuNDM2ODMxIDIuMTU2MTE2IC0wLjE0NTM3OQordiAwLjQzNjgzMSAyLjE1NjExNiAtMC4xNDUzNzkKK3YgMC40MzY4NTMgMi4yNTIwNDYgLTAuMTQ1Mzc5Cit2IDAuNDM2ODUzIDIuMDU5NTQ0IC0wLjE0NTM3OQordiAwLjQzNjg1MyAyLjA1OTU0NCAtMC4xNDUzNzkKK3YgMC40MzY4MzEgMi4xNTYxMTYgLTAuMTQ1Mzc5Cit2IDAuNDQ4Njc1IDIuMDE5MDA0IC0wLjE0NTM3OQordiAwLjQ0ODY3NSAyLjAxOTAwNCAtMC4xNDUzNzkKK3YgMC40MzY4NTMgMi4wNTk1NDQgLTAuMTQ1Mzc5Cit2IDAuNDQ4Njc1IDIuMDE5MDA0IC0wLjE0NDY1NgordiAwLjQ3OTQ3MSAxLjk5MDExOSAtMC4xNDUzNzkKK3YgMC40Nzk0NzEgMS45OTAxMTkgLTAuMTQ1Mzc5Cit2IDAuNDQ4Njc1IDIuMDE5MDA0IC0wLjE0NTM3OQordiAwLjQ0ODY3NSAyLjAxOTAwNCAtMC4xNDQ2NTYKK3YgMC41MjI0NDEgMS45NzkwNzUgLTAuMTQ1Mzc5Cit2IDAuNTIyNDQxIDEuOTc5MDc1IC0wLjE0NTM3OQordiAwLjQ3OTQ3MSAxLjk5MDExOSAtMC4xNDUzNzkKK3YgMC41NjUzNDcgMS45OTAwODMgLTAuMTQ1Mzc5Cit2IDAuNTY1MzQ3IDEuOTkwMDgzIC0wLjE0NTM3OQordiAwLjUyMjQ0MSAxLjk3OTA3NSAtMC4xNDUzNzkKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTQ1Mzc5Cit2IDAuNTk2MTkyIDIuMDE4OTIyIC0wLjE0NTM3OQordiAwLjU2NTM0NyAxLjk5MDA4MyAtMC4xNDUzNzkKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTQ0NjU1Cit2IDAuNjA3OTQ0IDIuMDU5NjAxIC0wLjE0NTM3OAordiAwLjYwNzk0NCAyLjA1OTYwMSAtMC4xNDUzNzgKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTQ1Mzc5Cit2IDAuNTk2MTkyIDIuMDE4OTIyIC0wLjE0NDY1NQordiAwLjYwNzk0NCAyLjE1NjExNiAtMC4xNDUzNzgKK3YgMC42MDc5NDQgMi4xNTYxMTYgLTAuMTQ1Mzc4Cit2IDAuNjA3OTQ0IDIuMDU5NjAxIC0wLjE0NTM3OAordiAwLjYwNzk0NCAyLjI1MjA0OSAtMC4xNDUzNzgKK3YgMC42MDc5NDQgMi4yNTIwNDkgLTAuMTQ1Mzc4Cit2IDAuNjA3OTQ0IDIuMTU2MTE2IC0wLjE0NTM3OAordiAwLjc0Nzc2MSAyLjMzNDUyMyAtMC4xNDUzNzgKK3YgMC43NDc3NjEgMi4zMzQ1MjMgLTAuMTQ1Mzc4Cit2IDAuNzg2Nzg0IDIuMzIzMzUzIC0wLjE0NTM3OAordiAwLjcwNzgxNCAyLjMyMzgzNyAtMC4xNDUzNzgKK3YgMC43MDc4MTQgMi4zMjM4MzcgLTAuMTQ1Mzc4Cit2IDAuNzQ3NzYxIDIuMzM0NTIzIC0wLjE0NTM3OAordiAwLjY3OTQ1MyAyLjI5NTc5NiAtMC4xNDUzNzgKK3YgMC42Nzk0NTMgMi4yOTU3OTYgLTAuMTQ1Mzc4Cit2IDAuNzA3ODE0IDIuMzIzODM3IC0wLjE0NTM3OAordiAwLjY3OTQ1MyAyLjI5NTc5NiAtMC4xNDQ2NTUKK3YgMC42Njg5NTAgMi4yNTIxMTAgLTAuMTQ1Mzc4Cit2IDAuNjY4OTUwIDIuMjUyMTEwIC0wLjE0NTM3OAordiAwLjY3OTQ1MyAyLjI5NTc5NiAtMC4xNDUzNzgKK3YgMC42Nzk0NTMgMi4yOTU3OTYgLTAuMTQ0NjU1Cit2IDAuNjY4OTcwIDIuMTU2MTE2IC0wLjE0NTM3OAordiAwLjY2ODk3MCAyLjE1NjExNiAtMC4xNDUzNzgKK3YgMC42Njg5NTAgMi4yNTIxMTAgLTAuMTQ1Mzc4Cit2IDAuNjY4OTkwIDIuMDU5NTgzIC0wLjE0NTM3OAordiAwLjY2ODk5MCAyLjA1OTU4MyAtMC4xNDUzNzgKK3YgMC42Njg5NzAgMi4xNTYxMTYgLTAuMTQ1Mzc4Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjE0NTM3OAordiAwLjY3OTQ1NCAyLjAxNzczOCAtMC4xNDUzNzgKK3YgMC42Njg5OTAgMi4wNTk1ODMgLTAuMTQ1Mzc4Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjE0NDY1NQordiAwLjcwNzgxNCAxLjk4OTY5OCAtMC4xNDUzNzgKK3YgMC43MDc4MTQgMS45ODk2OTggLTAuMTQ1Mzc4Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjE0NTM3OAordiAwLjY3OTQ1NCAyLjAxNzczOCAtMC4xNDQ2NTUKK3YgMC43NDc3NjEgMS45NzkwMTIgLTAuMTQ1Mzc4Cit2IDAuNzQ3NzYxIDEuOTc5MDEyIC0wLjE0NTM3OAordiAwLjcwNzgxNCAxLjk4OTY5OCAtMC4xNDUzNzgKK3YgMC43ODY5ODIgMS45ODk2OTcgLTAuMTQ1Mzc4Cit2IDAuNzg2OTgyIDEuOTg5Njk3IC0wLjE0NTM3OAordiAwLjc0Nzc2MSAxLjk3OTAxMiAtMC4xNDUzNzgKK3YgMC43ODY5ODIgMS45ODk2OTcgLTAuMTQ0NjU0Cit2IDAuODE1MDEyIDIuMDE4MDg4IC0wLjE0NTM3OAordiAwLjgxNTAxMiAyLjAxODA4OCAtMC4xNDUzNzgKK3YgMC43ODY5ODIgMS45ODk2OTcgLTAuMTQ1Mzc4Cit2IDAuNzg2OTgyIDEuOTg5Njk3IC0wLjE0NDY1NAordiAwLjgyNjI1MSAyLjA1OTU5NSAtMC4xNDUzNzgKK3YgMC44MjYyNTEgMi4wNTk1OTUgLTAuMTQ1Mzc4Cit2IDAuODE1MDEyIDIuMDE4MDg4IC0wLjE0NTM3OAordiAwLjgyNjI1MSAyLjE1NjExNiAtMC4xNDUzNzgKK3YgMC44MjYyNTEgMi4xNTYxMTYgLTAuMTQ1Mzc4Cit2IDAuODI2MjUxIDIuMDU5NTk1IC0wLjE0NTM3OAordiAwLjgyNjIzNyAyLjI1MjA5OSAtMC4xNDUzNzgKK3YgMC44MjYyMzcgMi4yNTIwOTkgLTAuMTQ1Mzc4Cit2IDAuODI2MjUxIDIuMTU2MTE2IC0wLjE0NTM3OAordiAwLjgxNTAxNCAyLjI5NTQ0MCAtMC4xNDUzNzgKK3YgMC44MTUwMTQgMi4yOTU0NDAgLTAuMTQ1Mzc4Cit2IDAuODI2MjM3IDIuMjUyMDk5IC0wLjE0NTM3OAordiAwLjgxNTAxNCAyLjI5NTQ0MCAtMC4xNDQ2NTQKK3YgMC43ODY3ODQgMi4zMjMzNTMgLTAuMTQ1Mzc4Cit2IDAuNzg2Nzg0IDIuMzIzMzUzIC0wLjE0NTM3OAordiAwLjgxNTAxNCAyLjI5NTQ0MCAtMC4xNDUzNzgKK3YgMC44MTUwMTQgMi4yOTU0NDAgLTAuMTQ0NjU0Cit2IDAuNTk2MjQzIDIuMjkyNzMzIC0wLjEzOTM0OQordiAwLjU5NjI0MyAyLjI5MjczMyAtMC4xNDQ2NTUKK3YgMC41OTYyNDMgMi4yOTI3MzMgLTAuMTM5MzQ5Cit2IDAuNDQ4NjA0IDIuMjkyNzU4IC0wLjEzOTM1MAordiAwLjQ0ODYwNCAyLjI5Mjc1OCAtMC4xNDQ2NTYKK3YgMC40NDg2MDQgMi4yOTI3NTggLTAuMTM5MzUwCit2IDAuNDQ4Njc1IDIuMDE5MDA0IC0wLjEzOTM1MAordiAwLjQ0ODY3NSAyLjAxOTAwNCAtMC4xNDQ2NTYKK3YgMC40NDg2NzUgMi4wMTkwMDQgLTAuMTM5MzUwCit2IDAuNTk2MTkyIDIuMDE4OTIyIC0wLjEzOTM0OQordiAwLjU5NjE5MiAyLjAxODkyMiAtMC4xNDQ2NTUKK3YgMC41OTYxOTIgMi4wMTg5MjIgLTAuMTM5MzQ5Cit2IDAuNjc5NDUzIDIuMjk1Nzk2IC0wLjEzMzI2NAordiAwLjY3OTQ1MyAyLjI5NTc5NiAtMC4xNDQ2NTUKK3YgMC42Nzk0NTMgMi4yOTU3OTYgLTAuMTMzMjY0Cit2IDAuNjc5NDU0IDIuMDE3NzM4IC0wLjEzMzI2NAordiAwLjY3OTQ1NCAyLjAxNzczOCAtMC4xNDQ2NTUKK3YgMC42Nzk0NTQgMi4wMTc3MzggLTAuMTMzMjY0Cit2IDAuNzg2OTgyIDEuOTg5Njk3IC0wLjEzMzI2NAordiAwLjc4Njk4MiAxLjk4OTY5NyAtMC4xNDQ2NTQKK3YgMC43ODY5ODIgMS45ODk2OTcgLTAuMTMzMjY0Cit2IDAuODE1MDE0IDIuMjk1NDQwIC0wLjEzMzI2MwordiAwLjgxNTAxNCAyLjI5NTQ0MCAtMC4xNDQ2NTQKK3YgMC44MTUwMTQgMi4yOTU0NDAgLTAuMTMzMjYzCit2IC0xLjU3Njc1OSAxLjQ5NTQ3OSAtMC4wMjE4NzIKK3YgLTEuNTc2NzU5IDEuNDk1NDc5IC0wLjAyMTg3MgordiAtMS41NzY3NTkgMC42NzcwNzEgLTAuMDIxODcyCit2IC0wLjE0NzYxMiAyLjQ3NDIwNCAtMC4xOTY2NjgKK3YgLTAuMjcxMzYxIDIuNDQ5MTc4IC0wLjE5NjY2OQordiAtMC4xNDc2MTIgMi40NzQyMDQgLTAuMTk2NjY4Cit2IC0wLjI3MTM2MSAyLjQ0OTE3OCAtMC4xOTY2NjkKK3YgLTAuMzcyNDc4IDIuMzgwOTc4IC0wLjE5NjY2OQordiAtMC4yNzEzNjEgMi40NDkxNzggLTAuMTk2NjY5Cit2IC0wLjM3MjQ3OCAyLjM4MDk3OCAtMC4xOTY2NjkKK3YgLTAuMzcyNDc4IDIuMzgwOTc4IC0wLjE5NDMyNQordiAtMC40NDA2MzUgMi4yNzk4OTYgLTAuMTk2NjcwCit2IC0wLjM3MjQ3OCAyLjM4MDk3OCAtMC4xOTY2NjkKK3YgLTAuNDQwNjM1IDIuMjc5ODk2IC0wLjE5NjY3MAordiAtMC40NjU2NDEgMi4xNTYxMTcgLTAuMTk2NjcwCit2IC0wLjQ0MDYzNSAyLjI3OTg5NiAtMC4xOTY2NzAKK3YgLTAuNDY1NjQxIDIuMTU2MTE3IC0wLjE5NjY3MAordiAtMC40NDA2NTAgMi4wMzI0MTcgLTAuMTk2NjcwCit2IC0wLjQ2NTY0MSAyLjE1NjExNyAtMC4xOTY2NzAKK3YgLTAuNDQwNjUwIDIuMDMyNDE3IC0wLjE5NjY3MAordiAtMC4zNzI0ODMgMS45MzEyNzMgLTAuMTk2NjcwCit2IC0wLjQ0MDY1MCAyLjAzMjQxNyAtMC4xOTY2NzAKK3YgLTAuMzcyNDgzIDEuOTMxMjczIC0wLjE5NjY3MAordiAtMC4zNzI0ODMgMS45MzEyNzMgLTAuMTk0MzI1Cit2IC0wLjI3MTM1NyAxLjg2MzAzMiAtMC4xOTY2NjkKK3YgLTAuMzcyNDgzIDEuOTMxMjczIC0wLjE5NjY3MAordiAtMC4yNzEzNTcgMS44NjMwMzIgLTAuMTk2NjY5Cit2IC0wLjE0NzYxMiAxLjgzODEyMSAtMC4xOTY2NjkKK3YgLTAuMjcxMzU3IDEuODYzMDMyIC0wLjE5NjY2OQordiAtMC4wMjM4NzAgMi40NDkxNzggLTAuMTk2NjY4Cit2IC0wLjE0NzYxMiAyLjQ3NDIwNCAtMC4xOTY2NjgKK3YgLTAuMDIzODcwIDIuNDQ5MTc4IC0wLjE5NjY2OAordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTY2NjgKK3YgLTAuMDIzODcwIDIuNDQ5MTc4IC0wLjE5NjY2OAordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTY2NjgKK3YgMC4xNDU0NTggMi4yNzk4OTIgLTAuMTk2NjY3Cit2IDAuMDc3MjM1IDIuMzgwOTkzIC0wLjE5NDMyMwordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTQzMjMKK3YgMC4wNzcyMzUgMi4zODA5OTMgLTAuMTk2NjY4Cit2IDAuMTQ1NDU4IDIuMjc5ODkyIC0wLjE5NjY2NwordiAwLjE3MDQ4OCAyLjE1NjExNyAtMC4xOTY2NjcKK3YgMC4xNDU0NTggMi4yNzk4OTIgLTAuMTk2NjY3Cit2IDAuMTcwNDg4IDIuMTU2MTE3IC0wLjE5NjY2NwordiAwLjE0NTM4NiAyLjAzMjQxMCAtMC4xOTY2NjgKK3YgMC4xNzA0ODggMi4xNTYxMTcgLTAuMTk2NjY3Cit2IDAuMTQ1Mzg2IDIuMDMyNDEwIC0wLjE5NjY2OAordiAwLjA3NzIzNSAxLjkzMTI5MyAtMC4xOTY2NjgKK3YgMC4xNDUzODYgMi4wMzI0MTAgLTAuMTk2NjY4Cit2IDAuMDc3MjM1IDEuOTMxMjkzIC0wLjE5NjY2OAordiAtMC4wMjM4MTIgMS44NjMwMzIgLTAuMTk2NjY4Cit2IDAuMDc3MjM1IDEuOTMxMjkzIC0wLjE5NDMyMwordiAwLjA3NzIzNSAxLjkzMTI5MyAtMC4xOTQzMjMKK3YgMC4wNzcyMzUgMS45MzEyOTMgLTAuMTk2NjY4Cit2IC0wLjAyMzgxMiAxLjg2MzAzMiAtMC4xOTY2NjgKK3YgLTAuMTQ3NjEyIDEuODM4MTIxIC0wLjE5NjY2OQordiAtMC4wMjM4MTIgMS44NjMwMzIgLTAuMTk2NjY4Cit2IC0wLjE0NzYxMiAxLjgzODEyMSAtMC4xOTY2NjkKK3YgMC42NjYyMTcgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjY2NjIxNyAtMi44MTkxNzkgLTAuMDIxODY0Cit2IDAuODM2NzIxIC0yLjgxOTE3OSAtMC4wMjE4NjMKK3YgMC44MjkyNzIgLTIuODE5MTc4IC0wLjAyMTg2MwordiAwLjgyOTI3MiAtMi44MTkxNzggLTAuMDIxODYzCit2IDAuODM2NzIxIC0yLjgxOTE3OSAtMC4wMjE4NjMKK3YgMC42MzI4NDcgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjY2MDQ2MiAtMi44MTkxNzkgLTAuMDIxODY0Cit2IDAuNjMyODQ3IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC43MDU2MzggLTIuODAwMjI4IC0wLjA5NTc3NwordiAwLjcwNTYzOCAtMi44MDAyMjggLTAuMDk1Nzc3Cit2IDAuNzQ3NzIzIC0yLjc4OTEyNiAtMC4xMDczNjAKK3YgMC44MjkyNzIgLTIuODE5MTc4IC0wLjAyMTg2MwordiAwLjgyODc5NiAtMi44MTkxODQgLTAuMDI0MTU5Cit2IDAuODI5MjcyIC0yLjgxOTE3OCAtMC4wMjE4NjMKK3YgMC44Mjg3OTYgLTIuODE5MTg0IC0wLjAyNDE1OQordiAwLjgyODczMyAtMi44MTYzOTkgLTAuMDE5ODY5Cit2IDAuODI5MjcyIC0yLjgxOTE3OCAtMC4wMjE4NjMKK3YgMC42NjY4NTQgLTIuODE5MTgzIC0wLjAyNDE2MAordiAwLjY2Njg1NCAtMi44MTkxODMgLTAuMDI0MTYwCit2IDAuNjc3MTk1IC0yLjgxOTE5NyAtMC4wNjUzOTAKK3YgLTAuMDI2MTY1IC0yLjgxODM5NiAtMC4wNDYwMjgKK3YgLTAuMTQ3NjEzIC0yLjgxODM5NiAtMC4wNDYwMjkKK3YgLTAuMTQ3NjEzIC0yLjgxODM5NiAtMC4wNDYwMjkKK3YgLTEuNTc0NzkwIDEuOTA0MTMwIC0wLjAxOTg2NQordiAtMS41NzQ3OTAgMi4xNTYxMTYgLTAuMDE5ODY1Cit2IC0xLjU3NDc5MCAxLjkwNDEzMCAtMC4wMTk4NjUKK3YgMS4yODE1MTUgMS45MDQxMzMgLTAuMDIxODYxCit2IDEuMjgxNTE1IDEuOTA0MTMzIC0wLjAyMTg2MQordiAxLjI4MTUxNSAwLjY3Njc5MCAtMC4wMjE4NjEKK3YgMS4yODE1MTUgMS41MDU0MTIgLTAuMDIxODYxCit2IDEuMjgxNTE1IDEuNTA1NDEyIC0wLjAyMTg2MQordiAtMS41NzY3NTkgMS45MDQxMzEgLTAuMDIxODcyCit2IC0xLjU3Njc1OSAxLjQ5NTQ3OSAtMC4wMjE4NzIKK3YgLTEuNTc2NzU5IDEuNDk1NDc5IC0wLjAyMTg3MgordiAwLjc4OTY4NCAtMi44MDAyMzUgLTAuMDk1ODI0Cit2IDAuODE4MzAyIC0yLjgxOTE5NyAtMC4wNjUzMTkKK3YgMC44MTgzMDIgLTIuODE5MTk3IC0wLjA2NTMxOQordiAwLjgxODMwMiAtMi44MTkxOTcgLTAuMDY1MzE5Cit2IDAuNzg5Mzg2IC0yLjc5NzE3OCAtMC4wOTU1MTgKK3YgMC43NDc3MjMgLTIuNzg5MTI2IC0wLjEwNzM2MAordiAwLjc0NzcyMyAtMi43ODkxMjYgLTAuMTA3MzYwCit2IDAuNzg5Njg0IC0yLjgwMDIzNSAtMC4wOTU4MjQKK3YgMC43ODkzODYgLTIuNzk3MTc4IC0wLjA5NTUxOAordiAwLjY3NzE5NSAtMi44MTkxOTcgLTAuMDY1MzkwCit2IDAuNzA1NjM4IC0yLjgwMDIyOCAtMC4wOTU3NzcKK3YgMC43MDU2MzggLTIuODAwMjI4IC0wLjA5NTc3NwordiAwLjcwNTgyMyAtMi43OTcwOTMgLTAuMDk1NDUwCit2IDAuNzQ3NzI1IC0yLjc4NjQ3OSAtMC4xMDY0NDEKK3YgMC43NDc3MjUgLTIuNzg2NDc5IC0wLjEwNjQ0MQordiAwLjc4OTM4NiAtMi43OTcxNzggLTAuMDk1NTE4Cit2IDAuNzA1ODIzIC0yLjc5NzA5MyAtMC4wOTU0NTAKK3YgMC43MDU4MjMgLTIuNzk3MDkzIC0wLjA5NTQ1MAordiAwLjc4OTQ2NiAtMi43OTQ2NDkgLTAuMDk1NTkyCit2IDAuNzQ3NzI1IC0yLjc4NjQ3OSAtMC4xMDY0NDEKK3YgMC43MDU3NjYgLTIuNzk0NjQ5IC0wLjA5NTUyNQordiAwLjcwNTc2NiAtMi43OTQ2NDkgLTAuMDk1NTI1Cit2IDAuNzA1ODIzIC0yLjc5NzA5MyAtMC4wOTU0NTAKK3YgMC43NDc3MjUgLTIuNzg2NDc5IC0wLjEwNjQ0MQordiAwLjgyODczNSAtMi43OTQ4MDIgLTAuMDE5ODY5Cit2IDAuODI4NzM1IC0yLjc5NDgwMiAtMC4wMTk4NjkKK3YgMC44Mjg3MzMgLTIuODE2Mzk5IC0wLjAxOTg2OQordiAwLjY2NjkxNyAtMi44MTY0MDAgLTAuMDE5ODcwCit2IDAuNjY2OTE3IC0yLjgxNjQwMCAtMC4wMTk4NzAKK3YgMC42NjY5MTggLTIuNzk0ODAyIC0wLjAxOTg3MAordiAwLjY2NjkxOCAtMi43OTQ4MDIgLTAuMDE5ODcwCit2IDAuNjY2MjE3IC0yLjgxOTE3OSAtMC4wMjE4NjQKK3YgMC42NjYyMTcgLTIuODE5MTc5IC0wLjAyMTg2NAordiAwLjY2Njg1NCAtMi44MTkxODMgLTAuMDI0MTYwCit2IC0wLjM3MjQ3OCAyLjM4MDk3OCAtMC4xODE1NDIKK3YgLTAuMzcyNDc4IDIuMzgwOTc4IC0wLjE5NDMyNQordiAtMC4zNzI0NzggMi4zODA5NzggLTAuMTgxNTQyCit2IC0wLjM3MjQ4MyAxLjkzMTI3MyAtMC4xODE1NDIKK3YgLTAuMzcyNDgzIDEuOTMxMjczIC0wLjE5NDMyNQordiAtMC4zNzI0ODMgMS45MzEyNzMgLTAuMTgxNTQyCit2IDAuMDc3MjM2IDIuMzgwOTkzIC0wLjE4MTU0MAordiAwLjA3NzIzNSAyLjM4MDk5MyAtMC4xOTQzMjMKK3YgMC4wNzcyMzUgMi4zODA5OTMgLTAuMTk0MzIzCit2IDAuMDc3MjM1IDEuOTMxMjkzIC0wLjE4MTU0MAordiAwLjA3NzIzNSAxLjkzMTI5MyAtMC4xOTQzMjMKK3YgMC4wNzcyMzUgMS45MzEyOTMgLTAuMTk0MzIzCit2IDAuNzA1NzY2IC0yLjc5NDY0OSAtMC4wOTU1MjUKK3YgMC43NDc3NDMgLTIuNzk0MjUwIC0wLjEwNTQ4NwordiAwLjcwNTc2NiAtMi43OTQ2NDkgLTAuMDk1NTI1Cit2IDAuNzg5NDY2IC0yLjc5NDY0OSAtMC4wOTU1OTIKK3YgMC43ODk0NjYgLTIuNzk0NjQ5IC0wLjA5NTU5MgordiAwLjc0Nzc0MyAtMi43OTQyNTAgLTAuMTA1NDg3Cit2IDAuNzg5NDY2IC0yLjc5NDY0OSAtMC4wOTU1OTIKK3YgMC43ODk0NjYgLTIuNzUwNTU1IC0wLjA5NTU5MgordiAwLjc4OTQ2NiAtMi43NTA1NTUgLTAuMDk1NTkyCit2IDAuNzQ3NzQzIC0yLjc5NDI1MCAtMC4xMDU0ODcKK3YgMC43MDU3NjYgLTIuNzUwNTU1IC0wLjA5NTUyNQordiAwLjcwNTc2NiAtMi43NTA1NTUgLTAuMDk1NTI1Cit2IC0wLjMxNjU2NyAtMi43OTQ4MDAgLTAuMDM0NDIwCit2IC0wLjMxNjU2NyAtMi43NTA1MjMgLTAuMDM0NDIwCit2IC0wLjMxNjU2NyAtMi43OTQ4MDAgLTAuMDM0NDIwCit2IDAuMDIxMjM3IC0yLjc5NDgwMCAtMC4wMzQ0MzEKK3YgMC4wMjEyMzcgLTIuNzUwNTIzIC0wLjAzNDQzMQordiAwLjAyMTIzNyAtMi43OTQ4MDAgLTAuMDM0NDMxCit2IDAuMDMwOTkxIC0yLjc5NDgwMCAtMC4wMjAzOTAKK3YgMC4wMzIyMjcgLTIuNzk0ODAxIC0wLjAxOTg3MQordiAwLjAzMDk5MSAtMi43NTA1MjQgLTAuMDIwMzkwCit2IDAuMDMwOTkxIC0yLjc5NDgwMCAtMC4wMjAzOTAKK3YgMC43NDcxMDcgLTIuODExMTM4IDAuMDYwMTA1Cit2IDAuNjY3MDE5IC0yLjgxMTEzOCAtMC4wMTk4MjIKK3YgMC43NDc3MTYgLTIuNzgxOTM4IC0wLjEwNjMxOAordiAwLjgyODY0MiAtMi44MTExMzggLTAuMDE5ODYyCit2IDAuNjc3NTI1IC0yLjgxMDE4NCAtMC4wMTk4MTkKK3YgMC43NDcwOTYgLTIuODEwMTg0IDAuMDQ5NjU2Cit2IDAuODE4MTUzIC0yLjgxMDE4NCAtMC4wMTk3ODgKK3YgMC43NDc3MjIgLTIuNzg1MTk4IC0wLjA5NTkwNAordiAwLjY2OTQ3MyAtMi44MTMwODUgLTAuMDE5ODIyCit2IDAuNjc1MDAxIC0yLjgxMzI1NCAtMC4wMTk4MTkKK3YgMC43NDcxMDcgLTIuODEzMDg1IDAuMDU3NjUxCit2IDAuNzQ3MDk2IC0yLjgxMzI1NCAwLjA1MjE4MAordiAwLjgyNjE4OCAtMi44MTMwODUgLTAuMDE5ODYyCit2IDAuODIwNjc2IC0yLjgxMzI1NCAtMC4wMTk3ODgKK3YgMC43NDc3MTYgLTIuNzg0OTc0IC0wLjEwMzg2NAordiAwLjc0NzcyMiAtMi43ODgyNjggLTAuMDk4NDI4Cit2IDAuNjc3NTI1IC0yLjc2MzU1OCAtMC4wMTk4MTkKK3YgMC43NDcwOTYgLTIuNzYzNTU4IDAuMDQ5NjU2Cit2IDAuODE4MTUyIC0yLjc2MzU1OCAtMC4wMTk3ODgKK3YgMC43NDc3MjIgLTIuNzYzNTU4IC0wLjA5NTkwNQordiAwLjY4MzM3MCAtMi43NTUyNjQgLTAuMDE5ODE2Cit2IDAuNzQ3MDg4IC0yLjc1NTI2NCAwLjA0Mzg3MQordiAwLjgxMjMyOSAtMi43NTUyNjQgLTAuMDE5NzE0Cit2IDAuNzQ3NzMxIC0yLjc1NTI2NCAtMC4wOTAxNTMKK3YgMC42ODMzNjggLTIuNjM0MDU1IC0wLjAxOTgxNgordiAwLjc0NzA4NiAtMi42MzQwNTUgMC4wNDM4NzIKK3YgMC44MTIzMjggLTIuNjM0MDU1IC0wLjAxOTcxMwordiAwLjc0NzczMCAtMi42MzQwNTUgLTAuMDkwMTUyCit2IDAuNjc4NDEyIC0yLjc2MjU4MyAtMC4wMTk4MTkKK3YgMC42ODI0NTggLTIuNzU2MjM5IC0wLjAxOTgxNgordiAwLjc0NzA5NiAtMi43NjI1ODMgMC4wNDg3NjkKK3YgMC43NDcwODcgLTIuNzU2MjM4IDAuMDQ0NzgyCit2IDAuODE3MjY2IC0yLjc2MjU4MyAtMC4wMTk3ODgKK3YgMC44MTMyNDAgLTIuNzU2MjM4IC0wLjAxOTcxNAordiAwLjc0NzcyMyAtMi43NjI1ODMgLTAuMDk1MDE4Cit2IDAuNzQ3NzMxIC0yLjc1NjIzOSAtMC4wOTEwNjQKK3YgMC42OTMyMDYgLTIuNzU3NzQ1IDAuMDA0MjM3Cit2IDAuNjk4NjkxIC0yLjc1NzczOSAwLjAxNDcxNAordiAwLjY5NTE4MiAtMi43NTA5MjcgMC4wMDMyMDIKK3YgMC43MDA2NjggLTIuNzUwODIyIDAuMDEzNjc5Cit2IDAuNjg5MzE5IC0yLjc1NzU0MiAwLjAwNjI2OAordiAwLjY5MTEzNyAtMi43NTc5NTcgMC4wMDUzMTkKK3YgMC42OTY2MjEgLTIuNzU3OTU2IDAuMDE1Nzk2Cit2IDAuNjk0ODA0IC0yLjc1NzU0MCAwLjAxNjc0NQordiAwLjcwMDA5MyAtMi43NTUxNzYgMC4wMTM5ODAKK3YgMC42OTQ2MDcgLTIuNzU1MjgxIDAuMDAzNTA0Cit2IDAuNjk0ODM4IC0yLjc0MzcwNCAwLjAwMzM4MQordiAwLjcwMDMyMyAtMi43NDM1OTkgMC4wMTM4NTgKK3YgMC42OTI4MjQgLTIuNzM2MzU4IDAuMDA0NDMyCit2IDAuNjk4MzEyIC0yLjczNjI1MSAwLjAxNDkxMgordiAwLjY5MTgwNyAtMi43MzE0ODMgMC4wMDM4NzMKK3YgMC42OTgwMDYgLTIuNzMxMzY1IDAuMDE1NzEyCit2IDAuNjkxMjY0IC0yLjcyNTgxNiAwLjAwMzEyNAordiAwLjY5ODIwNCAtMi43MjU2ODMgMC4wMTYzNzgKK3YgMC42OTM0NjUgLTIuNjk4OTg5IDAuMDAyMjM2Cit2IDAuNzAwMTUzIC0yLjY5ODg1NSAwLjAxNTAwOAordiAwLjY5NTAwMyAtMi43NTc0ODUgMC4wMTY2NDEKK3YgMC42ODk1MTcgLTIuNzU3NDg3IDAuMDA2MTY1Cit2IDAuNjkyOTM2IC0yLjc1Nzc0NSAwLjAwMzcyMgordiAwLjY5ODk1NSAtMi43NTc3MzkgMC4wMTUyMTkKK3YgMC42OTQ5MTMgLTIuNzUwOTMyIDAuMDAyNjg3Cit2IDAuNzAwOTMyIC0yLjc1MDgxNyAwLjAxNDE4MwordiAwLjY4OTA0OSAtMi43NTc1NDIgMC4wMDU3NTMKK3YgMC42ODkyNDcgLTIuNzU3NDg3IDAuMDA1NjQ5Cit2IDAuNjkwODY3IC0yLjc1Nzk1OCAwLjAwNDgwNAordiAwLjY5Njg4NSAtMi43NTc5NTYgMC4wMTYzMDEKK3YgMC42OTUyNjcgLTIuNzU3NDg1IDAuMDE3MTQ2Cit2IDAuNjk1MDY4IC0yLjc1NzU0MCAwLjAxNzI1MAordiAwLjcwMDM1OCAtMi43NTUxNzEgMC4wMTQ0ODQKK3YgMC42OTQzMzggLTIuNzU1Mjg2IDAuMDAyOTg4Cit2IDAuNzAwNTg3IC0yLjc0MzU5NCAwLjAxNDM2MgordiAwLjY5NDU2OCAtMi43NDM3MDkgMC4wMDI4NjYKK3YgMC42OTg1NzYgLTIuNzM2MjQ2IDAuMDE1NDE3Cit2IDAuNjkyNTU1IC0yLjczNjM2MyAwLjAwMzkxNgordiAwLjY5ODI2NyAtMi43MzEzNTkgMC4wMTYyMTAKK3YgMC42OTE1MDQgLTIuNzMxNDg5IDAuMDAzMjkzCit2IDAuNjk4NTQ2IC0yLjcyNTY3NyAwLjAxNzAzMQordiAwLjY5MDkyMiAtMi43MjU4MjIgMC4wMDI0NzEKK3YgMC43MDA0OTQgLTIuNjk4ODQ5IDAuMDE1NjYwCit2IDAuNjkzMTIzIC0yLjY5ODk5NSAwLjAwMTU4MwordiAwLjY5NTk0OSAtMi43NTc3NDIgMC4wMDk0NzUKK3YgMC42OTc5MjUgLTIuNzUwODc0IDAuMDA4NDQwCit2IDAuNjkzODc4IC0yLjc1Nzk1NyAwLjAxMDU1OAordiAwLjY5MDc0MyAtMi43NTc1NDEgMC4wMTIxOTIKK3YgMC42OTczNTEgLTIuNzU1MjI5IDAuMDA4NzQxCit2IDAuNjk3NTgxIC0yLjc0MzY1MiAwLjAwODYxOQordiAwLjY5NTU2OCAtMi43MzYzMDUgMC4wMDk2NzIKK3YgMC42OTQ5MDcgLTIuNzMxNDI0IDAuMDA5NzkyCit2IDAuNjk0NzM0IC0yLjcyNTc0OSAwLjAwOTc1MQordiAwLjY5NjgwOSAtMi42OTg5MjIgMC4wMDg2MjIKK3YgMC42OTA5NDEgLTIuNzU3NDg2IDAuMDEyMDg4Cit2IDAuODAyOTQ3IC0yLjc1ODgwMyAtMC4wNTEyMjUKK3YgMC44MDQ3MjMgLTIuNzU4OTg2IC0wLjA1MjEyMAordiAwLjgwMjQ1NCAtMi43NTg5ODUgLTAuMDU2NjE2Cit2IDAuODAwNjc3IC0yLjc1ODgwMiAtMC4wNTU3MjAKK3YgMC44MDEyNTIgLTIuNzUyOTk4IC0wLjA1MDM2OAordiAwLjgwMTc0NSAtMi43NTY3MDYgLTAuMDUwNjE3Cit2IDAuNzk4NDI3IC0yLjc1NjY2MiAtMC4wNTQ0NDUKK3YgMC43OTc5MzUgLTIuNzUyOTU0IC0wLjA1NDE5NgordiAwLjgwNjI4MyAtMi43NTg2MzIgLTAuMDUyOTA2Cit2IDAuODA1ODY3IC0yLjc1ODYzMSAtMC4wNTgwODUKK3YgMC43OTcyMDQgLTIuNzU2NjE3IC0wLjA1OTYwNwordiAwLjc5ODQwNyAtMi43NTg4MDEgLTAuMDYwMjE1Cit2IDAuNzk4MjMwIC0yLjc0NjgwMiAtMC4wNTQzNDQKK3YgMC44MDE1NDcgLTIuNzQ2ODQ3IC0wLjA1MDUxNgordiAwLjgwMTAwNCAtMi43NDA1NDUgLTAuMDU1ODgyCit2IDAuODAzMjc1IC0yLjc0MDU5MCAtMC4wNTEzODYKK3YgMC44MDE1NjggLTIuNzM2Mzg3IC0wLjA1NTk3NwordiAwLjgwNDEzNCAtMi43MzY0MzggLTAuMDUwODk3Cit2IDAuODAxNzE1IC0yLjczMTU1NSAtMC4wNTU5MzkKK3YgMC44MDQ1ODcgLTIuNzMxNjEyIC0wLjA1MDI1MgordiAwLjc5OTkzNCAtMi43MDg3MDcgLTAuMDU1MDA0Cit2IDAuODAyNzAyIC0yLjcwODc2MyAtMC4wNDk1MjQKK3YgMC44MDE3NDIgLTIuNzU4NjMwIC0wLjA2MTg5NgordiAwLjgwNTY5NiAtMi43NTg1ODQgLTAuMDU3OTk5Cit2IDAuODAxNTcxIC0yLjc1ODU4MyAtMC4wNjE4MTAKK3YgMC44MDAxODMgLTIuNzU4OTg0IC0wLjA2MTExMQordiAwLjc5OTk2NSAtMi43NTg5ODQgLTAuMDYxNTQ0Cit2IDAuNzk4MTg5IC0yLjc1ODgwMSAtMC4wNjA2NDgKK3YgMC44MDMxNzAgLTIuNzU4ODAzIC0wLjA1MDc4MgordiAwLjgwNDk0NiAtMi43NTg5ODYgLTAuMDUxNjc4Cit2IDAuNzk2NzExIC0yLjc1MjkwOCAtMC4wNTkzNTgKK3YgMC43OTY5ODUgLTIuNzU2NjEyIC0wLjA2MDA0MAordiAwLjc5NjQ5MiAtMi43NTI5MDUgLTAuMDU5NzkxCit2IDAuODAxNDc1IC0yLjc1MzAwMiAtMC4wNDk5MjYKK3YgMC44MDE5NjggLTIuNzU2NzExIC0wLjA1MDE3NQordiAwLjgwMTUyNCAtMi43NTg2MzAgLTAuMDYyMzMwCit2IDAuODA2NTA2IC0yLjc1ODYzMiAtMC4wNTI0NjQKK3YgMC43OTY3ODggLTIuNzQ2NzUzIC0wLjA1OTkzOQordiAwLjc5NzAwNiAtMi43NDY3NTcgLTAuMDU5NTA2Cit2IDAuODAxNzcwIC0yLjc0Njg1MSAtMC4wNTAwNzQKK3YgMC43OTg1MTMgLTIuNzQwNDk1IC0wLjA2MDgxMgordiAwLjc5ODczMiAtMi43NDA0OTkgLTAuMDYwMzc5Cit2IDAuODAzNDk4IC0yLjc0MDU5NCAtMC4wNTA5NDQKK3YgMC43OTg3ODYgLTIuNzM2MzMyIC0wLjA2MTQ4NAordiAwLjc5OTAwMiAtMi43MzYzMzcgLTAuMDYxMDU2Cit2IDAuODA0Mzg1IC0yLjczNjQ0MyAtMC4wNTA0MDAKK3YgMC43OTg1NjAgLTIuNzMxNDkzIC0wLjA2MjE4NwordiAwLjc5ODg0MiAtMi43MzE0OTggLTAuMDYxNjI2Cit2IDAuODA0ODcwIC0yLjczMTYxNyAtMC4wNDk2OTIKK3YgMC43OTY4ODMgLTIuNzA4NjQ1IC0wLjA2MTA0NAordiAwLjc5NzE2NiAtMi43MDg2NTAgLTAuMDYwNDgzCit2IDAuODAyOTg0IC0yLjcwODc2OSAtMC4wNDg5NjQKK3YgMC44MDYzMzYgLTIuNzU4NTg1IC0wLjA1MjM3OAordiAwLjgwNjExMyAtMi43NTg1ODUgLTAuMDUyODIwCit2IDAuODAxMzUzIC0yLjc1ODU4MyAtMC4wNjIyNDMKK3YgMC42Nzc2MDggLTIuODExMTM4IDAuMDE5NzIzCit2IDAuNjg1OTI0IC0yLjgxMDE4NCAwLjAxNDkwNgordiAwLjY4Mzg5MiAtMi44MTMyNTQgMC4wMTYwOTMKK3YgMC42Nzk1ODQgLTIuODEzMDg1IDAuMDE4NTY5Cit2IDAuNjg1OTI0IC0yLjc2MzU1OCAwLjAxNDkwNgordiAwLjY5MDQ4OSAtMi43NTUyNjQgMC4wMTIyODIKK3YgMC42OTA3NDAgLTIuNjM0MDU1IDAuMDEyMDAxCit2IDAuNjg2NjM5IC0yLjc2MjU4MyAwLjAxNDQ4OQordiAwLjY4OTc1NSAtMi43NTYyMzkgMC4wMTI3MTAKK3YgMC43MDY1MTcgLTIuODExMTM4IDAuMDQ4NjAzCit2IDAuNzEwNzM2IC0yLjgxMDE4NCAwLjA0MDA1OAordiAwLjcwOTY3NCAtMi44MTMyNTQgMC4wNDIxNDIKK3YgMC43MDc1NDkgLTIuODEzMDg1IDAuMDQ2NTc3Cit2IDAuNzEwNzM2IC0yLjc2MzU1OCAwLjA0MDA1OAordiAwLjcxMjk5NiAtMi43NTUyNjQgMC4wMzUzNjMKK3YgMC43MTI5OTUgLTIuNjM0MDU1IDAuMDM1MzY1Cit2IDAuNzExMTA5IC0yLjc2MjU4MyAwLjAzOTMyNgordiAwLjcxMjYxMyAtMi43NTYyMzggMC4wMzYxMTYKK3YgMC43ODc5ODIgLTIuODExMTM4IDAuMDQ4OTYzCit2IDAuNzgyOTgyIC0yLjgxMDE4NCAwLjA0MDc0NQordiAwLjc4NDE5NCAtMi44MTMyNTQgMC4wNDI3NjYKK3YgMC43ODY4MDIgLTIuODEzMDg1IDAuMDQ2OTk4Cit2IDAuNzgyOTgyIC0yLjc2MzU1OCAwLjA0MDc0NQordiAwLjc4MDIyNSAtMi43NTUyNjQgMC4wMzYyNjIKK3YgMC43ODAyMjQgLTIuNjM0MDU1IDAuMDM2MjYzCit2IDAuNzgyNTU1IC0yLjc2MjU4MyAwLjA0MDAzNQordiAwLjc4MDY2MyAtMi43NTYyMzggMC4wMzY5OTEKK3YgMC44MTc4NjYgLTIuODExMTM4IDAuMDE5NjY5Cit2IDAuODA5NDUwIC0yLjgxMDE4NCAwLjAxNTEyMgordiAwLjgxMTUwNCAtMi44MTMyNTQgMC4wMTYyNTUKK3YgMC44MTU4NjggLTIuODEzMDg1IDAuMDE4NTY3Cit2IDAuODA5NDUwIC0yLjc2MzU1OCAwLjAxNTEyMgordiAwLjgwNDgzMiAtMi43NTUyNjQgMC4wMTI2NjgKK3YgMC44MDQ4MzEgLTIuNjM0MDU1IDAuMDEyNjY5Cit2IDAuODA4NzI5IC0yLjc2MjU4MyAwLjAxNDcyNAordiAwLjgwNTU3NCAtMi43NTYyMzggMC4wMTMwNzcKK3YgMC44MTc0MDcgLTIuODExMDQ3IC0wLjA2NDk1OAordiAwLjgwODk5OCAtMi44MTAxODQgLTAuMDYwMjQ1Cit2IDAuODExMDI1IC0yLjgxMzI1NCAtMC4wNjE0NDAKK3YgMC44MTU0MzUgLTIuODEyOTk0IC0wLjA2Mzc5NgordiAwLjgwODk5OCAtMi43NjM1NTggLTAuMDYwMjQ1Cit2IDAuODA0NDc1IC0yLjc1NTI2NCAtMC4wNTc4MjkKK3YgMC44MDQ0NzMgLTIuNjM0MDU1IC0wLjA1NzgyOAordiAwLjgwODI4NSAtMi43NjI1ODMgLTAuMDU5ODI1Cit2IDAuODA1MjA3IC0yLjc1NjIzOSAtMC4wNTgyNjEKK3YgMC43ODkzMjYgLTIuNzk0NDk3IC0wLjA5NTQyOAordiAwLjc4NDI0NCAtMi43OTY0NzkgLTAuMDg2OTQ5Cit2IDAuNzg1NDEyIC0yLjc5OTU0OSAtMC4wODg5ODkKK3YgMC43ODgyMzQgLTIuNzk2ODIwIC0wLjA5MzQ0NQordiAwLjc4NDI0NCAtMi43NjM1NTggLTAuMDg2OTUwCit2IDAuNzgxMjQyIC0yLjc1NTI2NCAtMC4wODE4MDkKK3YgMC43ODEyNDEgLTIuNjM0MDU1IC0wLjA4MTgwOAordiAwLjc4MzgzMyAtMi43NjI1ODMgLTAuMDg2MjMzCit2IDAuNzgxNjYzIC0yLjc1NjIzOSAtMC4wODI1NDUKK3YgMC43MDU4ODUgLTIuNzk0NDQ2IC0wLjA5NTM5NwordiAwLjcxMDUxMCAtMi43OTY0NzkgLTAuMDg2NDUwCit2IDAuNzA5MzU5IC0yLjc5OTU0OSAtMC4wODg0OTYKK3YgMC43MDY5NjAgLTIuNzk2NzgwIC0wLjA5MzQwNgordiAwLjcxMDUxMCAtMi43NjM1NTggLTAuMDg2NDUwCit2IDAuNzEzMDM5IC0yLjc1NTI2NCAtMC4wODE5MjIKK3YgMC43MTMwMzggLTIuNjM0MDU1IC0wLjA4MTkyMQordiAwLjcxMDkxNSAtMi43NjI1ODMgLTAuMDg1NzMwCit2IDAuNzEyNjIzIC0yLjc1NjIzOSAtMC4wODI2NjEKK3YgMC42Nzc5NzAgLTIuODExMDQ5IC0wLjA2NTAyMAordiAwLjY4NjMzNSAtMi44MTAxODQgLTAuMDYwMzAzCit2IDAuNjg0Mjk1IC0yLjgxMzI1NCAtMC4wNjE0NzIKK3YgMC42Nzk5NTQgLTIuODEyOTk2IC0wLjA2Mzg4NAordiAwLjY4NjMzNSAtMi43NjM1NTggLTAuMDYwMzAzCit2IDAuNjkwOTM0IC0yLjc1NTI2NCAtMC4wNTc3NDQKK3YgMC42OTA5MzIgLTIuNjM0MDU1IC0wLjA1Nzc0MwordiAwLjY4NzA1MSAtMi43NjI1ODMgLTAuMDU5ODkzCit2IDAuNjkwMTk3IC0yLjc1NjIzOSAtMC4wNTgxNjYKK3YgLTEuNTA5NjA0IDIuNzM0OTM4IDAuMTYwODA1Cit2IC0xLjU0MDQ3OSAyLjYxNDc3NiAwLjE1NzEwNgordiAtMS41NDA0NzggMi4zNzAwNzcgMC4xNTcxMDYKK3YgLTEuMjE5NTE4IDIuOTMxODM4IDAuMTU3MTA2Cit2IC0xLjM0NzAyMyAyLjkwNjM1MSAwLjE1NzEwNgordiAtMS40NDc1NDYgMi44MzgyMDIgMC4xNTcxMDYKK3YgLTEuNTE1NTI5IDIuNzM3NDE5IDAuMTU3MTA2Cit2IC0xLjUzNDE3OSAyLjYxNDQwMSAwLjE2MDgwNQordiAtMS41MzQxNzkgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTEuMjE5NTE4IDIuOTI1NTM5IDAuMTYwODA1Cit2IC0xLjM0NDU0MiAyLjkwMDQyNiAwLjE2MDgwNQordiAtMS40NDMyNzkgMi44MzM0OTggMC4xNjA4MDUKK3YgLTEuMjE5NTE4IDIuOTE0ODQ4IDAuMTYwODA1Cit2IC0xLjM0MDI5OCAyLjg5MDkwOCAwLjE2MDgwNQordiAtMS40MzYzOTcgMi44MjQ3ODIgMC4xNjA4MDUKK3YgLTEuNTAwMTk4IDIuNzMxMDAwIDAuMTYwODA1Cit2IC0xLjUyNDE3OSAyLjYxNDE1OSAwLjE2MDgwNQordiAtMS41MjQxNzkgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IDIuMzcwMDc3IDAuMTYwODA1Cit2IC0xLjMzMDA3NiAyLjM3MDA3NyAwLjE2MDgwNQordiAtMS4zMzAwNzYgMi42MTQxNTkgMC4xNjA4MDUKK3YgLTEuNTM5MzQ1IDIuNjE0NzMwIDAuMTU4NTIzCit2IC0xLjUzOTM0NSAyLjM3MDA3NyAwLjE1ODUyMwordiAtMS4yMTk1MTggMi45MzA3MDUgMC4xNTg1MjQKK3YgLTEuMzQ2NTc2IDIuOTA1Mjg1IDAuMTU4NTI0Cit2IC0xLjQ0NjcyOSAyLjgzNzM4NiAwLjE1ODUyNAordiAtMS41MTQ0NjMgMi43MzY5NzMgMC4xNTg1MjMKK3YgLTAuNjI1ODA2IDIuOTI1NTM5IDAuMTYwODA1Cit2IC0wLjYyNTgwNiAyLjkzMTgzOCAwLjE1NzEwNgordiAtMC42MjU4MDYgMi45MTQ4NDggMC4xNjA4MDUKK3YgLTAuNjI1ODY3IDIuMzcwMDc3IDAuMTYwODA1Cit2IC0wLjYyNTg2NyAyLjYxNDE1OSAwLjE2MDgwNQordiAtMC42MjU4MDYgMi45MzA3MDUgMC4xNTg1MjQKK3YgLTAuNjI1ODA2IDIuODU0OTkwIDAuMTYwODA1Cit2IC0xLjA0Mjc4MCAyLjg1NDk5MCAwLjE2MDgwNQordiAtMC41ODQwNTYgMi45MjU1MzkgMC4xNjA4MDUKK3YgLTAuNTg0MDU3IDIuOTMxODM4IDAuMTU3MTA2Cit2IC0wLjU4NDA1NiAyLjkxNDg0OCAwLjE2MDgwNQordiAtMC41ODQwNTYgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTAuNTg0MDU2IDIuNjE0MTU5IDAuMTYwODA1Cit2IC0wLjU4NDA1NiAyLjkzMDcwNSAwLjE1ODUyNAordiAtMC41ODQwNTYgMi44NTQ5OTAgMC4xNjA4MDUKK3YgLTAuNzkzNTc3IDIuOTI1NTM5IDAuMTYwODA1Cit2IC0wLjc5MzU3NyAyLjkzMTgzOCAwLjE1NzEwNgordiAtMC43OTM1NzcgMi45MTQ4NDggMC4xNjA4MDUKK3YgLTAuNzkzNTc3IDIuMzcwMDc3IDAuMTYwODA1Cit2IC0wLjc5MzU3NyAyLjYxNDE1OSAwLjE2MDgwNQordiAtMC43OTM1NzcgMi45MzA3MDUgMC4xNTg1MjQKK3YgLTAuNzkzNTc3IDIuNzI2NDkzIDAuMTYwODA1Cit2IC0wLjc5MzU3NyAyLjg1NDk5MCAwLjE2MDgwNQordiAtMC42MjU4MDYgMi43ODMyMTggMC4xNjA4MDUKK3YgLTAuNTg0MDU2IDIuNzgzNzQ4IDAuMTYwODA1Cit2IC0wLjU4NDA1NiAyLjY2OTUyMiAwLjE2MDgwNQordiAtMC42MjU4NjcgMi42Njk1MjIgMC4xNjA4MDUKK3YgLTAuNjYzNzg1IDIuNjg2MjI0IDAuMTYwODA1Cit2IC0wLjY4MDE5MiAyLjcyNjQ5MyAwLjE2MDgwNQordiAtMC42NjM3ODQgMi43NjY3MDAgMC4xNjA4MDUKK3YgLTAuNjU2MzMxIDIuNzU5MzExIDAuMTYwODA1Cit2IC0wLjYyNTgwNiAyLjc3Mjk3NCAwLjE2MDgwNQordiAtMC41ODQwNTYgMi43NzI5NTMgMC4xNjA4MDUKK3YgLTAuNTg0MDU2IDIuNjgwMTc3IDAuMTYwODA1Cit2IC0wLjYyNTg2NyAyLjY4MDEwMSAwLjE2MDgwNQordiAtMC42NTYyMTcgMi42OTM2NzAgMC4xNjA4MDUKK3YgLTAuNjY5NjkzIDIuNzI2NDkzIDAuMTYwODA1Cit2IC0xLjA0MjY2MSAyLjc4ODEyOCAwLjE2MDgwNQordiAtMC45OTkwNjYgMi43NzAwNTQgMC4xNjA4MDUKK3YgLTAuOTgwOTg3IDIuNzI2NDQ2IDAuMTYwODA1Cit2IC0wLjk5OTA2NiAyLjY4Mjg2MyAwLjE2MDgwNQordiAtMS4wNDI2NjEgMi42NjQ3ODkgMC4xNjA4MDUKK3YgLTEuMDg2MjU2IDIuNjgyODYzIDAuMTYwODA1Cit2IC0xLjEwNDMzMCAyLjcyNjQ1OSAwLjE2MDgwNQordiAtMS4wODYyNTcgMi43NzAwNTQgMC4xNjA4MDUKK3YgLTEuMDkxMzE4IDIuNzc1MTE2IDAuMTYwODA1Cit2IC0xLjA0MjY2MSAyLjc5NTI4OCAwLjE2MDgwNQordiAtMC45OTQwMDUgMi43NzUxMTYgMC4xNjA4MDUKK3YgLTAuOTczODI3IDIuNzI2NDQ2IDAuMTYwODA1Cit2IC0wLjk5NDAwNSAyLjY3NzgwMyAwLjE2MDgwNQordiAtMS4wNDI2NjEgMi42NTc2MzAgMC4xNjA4MDUKK3YgLTEuMDkxMzE4IDIuNjc3ODAzIDAuMTYwODA1Cit2IC0xLjExMTQ5MCAyLjcyNjQ1OSAwLjE2MDgwNQordiAtMS4wNDI2NjEgMi43MjY0NTIgMC4xNjA4MDUKK3YgLTEuMzMwMDc2IDIuNzI1NDQ2IDAuMTYwODA1Cit2IC0xLjMzMDA3NiAyLjg1NDg4NyAwLjE2MDgwNQordiAtMC44NzM5OTUgMi45MjU1MzkgMC4xNjA4MDUKK3YgLTAuODczOTk1IDIuOTMxODM4IDAuMTU3MTA2Cit2IC0wLjg3Mzk5NSAyLjkxNDg0OCAwLjE2MDgwNQordiAtMC44NzM5OTUgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTAuODczOTk1IDIuNjE0MTU5IDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAyLjkzMDcwNSAwLjE1ODUyNAordiAtMC44NzQwMzUgMi43MjY0OTMgMC4xNjA4MDUKK3YgLTAuODczOTk1IDIuODU0OTkwIDAuMTYwODA1Cit2IC0xLjUzNDE3OSAyLjM5ODY5MyAwLjE2MDgwNQordiAtMS41NDA0NzggMi4zOTkwMDggMC4xNTcxMDYKK3YgLTEuNTI0MTc5IDIuMzk4MTkyIDAuMTYwODA1Cit2IC0xLjIyMzY0NCAyLjM5ODE5MiAwLjE2MDgwNQordiAtMS4zMzAwNzYgMi4zOTgxOTIgMC4xNjA4MDUKK3YgLTEuNTM5MzQ1IDIuMzk4OTUyIDAuMTU4NTIzCit2IC0wLjYyNTg2NyAyLjM5ODE5MiAwLjE2MDgwNQordiAtMC41ODQwNTYgMi4zOTgxOTIgMC4xNjA4MDUKK3YgLTAuNzkzNTc3IDIuMzk4MTkyIDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAyLjM5ODE5MiAwLjE2MDgwNQordiAtMS40OTA1NzUgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTEuNDkwNTc1IDIuMzk4MTkyIDAuMTYwODA1Cit2IC0xLjQ5MTQ0OSAyLjYxNDE1OSAwLjE2MDgwNQordiAtMS40NzIxNjggMi43MjU0MTYgMC4xNjA4MDUKK3YgLTEuNDIyNzE2IDIuODAxMjUxIDAuMTYwODA1Cit2IC0xLjUzNDE3OSAyLjQyNzc0MyAwLjE2MDgwNQordiAtMS41NDA0NzkgMi40MjgxNDggMC4xNTcxMDYKK3YgLTEuNTI0MTc5IDIuNDI3MTAwIDAuMTYwODA1Cit2IC0xLjIyMzY0NCAyLjQyNzEwMCAwLjE2MDgwNQordiAtMS4zMzAwNzYgMi40MjcxMDAgMC4xNjA4MDUKK3YgLTEuNTM5MzQ2IDIuNDI4MDc1IDAuMTU4NTIzCit2IC0wLjYyNTg2NyAyLjQyNzEwMCAwLjE2MDgwNQordiAtMC41ODQwNTYgMi40MjcxMDAgMC4xNjA4MDUKK3YgLTAuNzkzNTc3IDIuNDI3MTAwIDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAyLjQyNzEwMCAwLjE2MDgwNQordiAtMS40OTA0NTUgMi40MjcxMDAgMC4xNjA4MDUKK3YgLTEuMDAxNTk2IDIuNzY3NTI0IDAuMTYwODA1Cit2IC0xLjA0MjY2MSAyLjc4NDU0OSAwLjE2MDgwNQordiAtMS4wODM3MjYgMi43Njc1MjQgMC4xNjA4MDUKK3YgLTEuMTAwNzUxIDIuNzI2NDU5IDAuMTYwODA1Cit2IC0xLjA4MzcyNiAyLjY4NTM5MyAwLjE2MDgwNQordiAtMS4wNDI2NjEgMi42NjgzNjkgMC4xNjA4MDUKK3YgLTEuMDAxNTk2IDIuNjg1Mzk0IDAuMTYwODA1Cit2IC0wLjk4NDU2NiAyLjcyNjQ0NiAwLjE2MDgwNQordiAtMC42NTQ4MTkgMi43NTc4MTIgMC4xNTYzMDAKK3YgLTAuNjI1ODA2IDIuNzcwOTI1IDAuMTU2MzAwCit2IC0wLjU4NDA1NiAyLjc3MDk4NCAwLjE1NjMwMAordiAtMC41ODQwNTYgMi42ODIxNDUgMC4xNTYzMDAKK3YgLTAuNjI1ODY3IDIuNjgyMTQ5IDAuMTU2MzAwCit2IC0wLjY1NDcwNSAyLjY5NTE3MCAwLjE1NjMwMAordiAtMC42Njc1NjQgMi43MjY0OTMgMC4xNTYzMDAKK3YgLTAuNjU0ODE5IDIuNzU3ODEyIDAuMTU4ODM3Cit2IC0wLjYyNTgwNiAyLjc3MDkyNSAwLjE1ODgzNwordiAtMC41ODQwNTYgMi43NzA5ODQgMC4xNTg4MzcKK3YgLTAuNTg0MDU2IDIuNjgyMTQ1IDAuMTU4ODM3Cit2IC0wLjYyNTg2NyAyLjY4MjE0OSAwLjE1ODgzNwordiAtMC42NTQ3MDUgMi42OTUxNzAgMC4xNTg4MzcKK3YgLTAuNjY3NTY0IDIuNzI2NDkzIDAuMTU4ODM3Cit2IC0xLjIxOTUxMyAyLjg1NTE5NyAwLjE2MDgwNQordiAtMS4yMjM2MzMgMi43MjU0MDUgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IDIuNjE0MTU5IDAuMTYwODA1Cit2IC0xLjA0MzA5MCAyLjkyNTUzOSAwLjE2MDgwNQordiAtMS4wNDMwOTAgMi45MTQ4NDggMC4xNjA4MDUKK3YgLTEuMDQzMDkwIDIuOTMwNzA1IDAuMTU4NTI0Cit2IC0xLjA0MzA5MCAyLjkzMTgzOCAwLjE1NzEwNgordiAtMS4wNDI1MzQgMi4zNzAwNzcgMC4xNjA4MDUKK3YgLTEuMDQyNTM0IDIuNjE0MTU5IDAuMTYwODA1Cit2IC0xLjA0MjUzNCAyLjM5ODE5MiAwLjE2MDgwNQordiAtMS4wNDI1MzQgMi40MjcxMDAgMC4xNjA4MDUKK3YgLTEuNDIxOTcyIDIuMzcwMDc3IDAuMTYwODA1Cit2IC0xLjQyMjA1NCAyLjYxNDE1OSAwLjE2MDgwNQordiAtMS40MjIwMzcgMi4zOTgxOTIgMC4xNjA4MDUKK3YgLTEuNDIyMDM0IDIuNzI1NDAwIDAuMTYwODA1Cit2IC0xLjQyMjAzNiAyLjQyNzEwMCAwLjE2MDgwNQordiAwLjY0MDY0MiAyLjkyNTUzOSAwLjE2MDgwNgordiAwLjY0MDY0MiAyLjkzMDcwNSAwLjE1ODUyNQordiAwLjkyODM3NiAyLjkyNTUzOSAwLjE2MDgwNwordiAwLjkyOTA1OSAyLjkzMDcwNSAwLjE1ODUyNQordiAxLjA1MTI4NCAyLjkwNTEzMyAwLjE1ODUyNQordiAxLjA0OTI0OSAyLjkwMDI3NCAwLjE2MDgwNwordiAxLjE1MTY4OSAyLjgzNzM4NCAwLjE1ODUyNQordiAxLjE0Nzk2OCAyLjgzMzY2MyAwLjE2MDgwNwordiAxLjIxOTE5NSAyLjczNjk3MiAwLjE1ODUyNQordiAxLjIxNDMzNiAyLjczNDkzOCAwLjE2MDgwNwordiAxLjI0NDA3NyAyLjYxNDgzMiAwLjE1ODUyNQordiAxLjIzODkxMSAyLjYxNDMzMyAwLjE2MDgwNwordiAxLjI0NDA3NyAyLjQyODA3NSAwLjE1ODUyNQordiAxLjIzODkxMSAyLjQyNzc0MiAwLjE2MDgwNwordiAxLjIzODkxMSAyLjM3MDA3NyAwLjE2MDgwNwordiAxLjI0NDA3NyAyLjM3MDA3NyAwLjE1ODUyNQordiAxLjA0NTMxMiAyLjg5MDg2NyAwLjE2MDgwNwordiAwLjkyODM3NSAyLjkxNDg0OCAwLjE2MDgwNwordiAxLjE0MDgzOSAyLjgyNjIzMCAwLjE2MDgwNwordiAxLjIwNDkyOSAyLjczMTAwMCAwLjE2MDgwNwordiAxLjIyODkxMSAyLjYxNDE1OCAwLjE2MDgwNwordiAxLjIyODkxMSAyLjQyNzA5OSAwLjE2MDgwNwordiAxLjIyODkxMSAyLjM3MDA3NyAwLjE2MDgwNwordiAwLjkyODM3NSAyLjM3MDA3NyAwLjE2MDgwNgordiAwLjkyODM3NSAyLjM5ODE5MiAwLjE2MDgwNgordiAxLjAzNDgwNyAyLjM5ODE5MiAwLjE2MDgwNwordiAxLjAzNDgwNyAyLjM3MDA3NyAwLjE2MDgwNwordiAxLjEyNjcwNCAyLjM5ODE5MiAwLjE2MDgwNwordiAxLjEyNjcwNCAyLjM3MDA3NyAwLjE2MDgwNwordiAwLjY0MDY0MiAyLjkzMTgzOCAwLjE1NzEwNwordiAwLjkyOTIxOCAyLjkzMTgzOCAwLjE1NzEwOAordiAxLjA1MTczMCAyLjkwNjE5OSAwLjE1NzEwOAordiAxLjE1MjUwNiAyLjgzODIwMCAwLjE1NzEwOAordiAxLjIyMDI2MSAyLjczNzQxOCAwLjE1NzEwOAordiAxLjI0NTIxMCAyLjYxNDg5MSAwLjE1NzEwOAordiAxLjI0NTIxMCAyLjQyODE0OCAwLjE1NzEwOAordiAxLjI0NTIxMCAyLjM3MDA3NyAwLjE1NzEwOAordiAtMC4xNDc2MzQgMi45MzA3MDUgMC4xNTg1MjQKK3YgMC4yODg3ODggMi45MzA3MDUgMC4xNTg1MjQKK3YgMC4yODg3ODggMi45MjU1MzkgMC4xNjA4MDYKK3YgLTAuMTQ3NjM0IDIuOTI1NTM5IDAuMTYwODA2Cit2IDAuMjg4Nzg4IDIuOTE0ODQ4IDAuMTYwODA2Cit2IC0wLjE0NzYzNCAyLjkxNDg0OCAwLjE2MDgwNgordiAtMC4xNDc2MzQgMi42MTQxMzcgMC4xNjA4MDYKK3YgMC4yODg3ODggMi40MjcxMDAgMC4xNjA4MDYKK3YgLTAuMTQ3NjM0IDIuNDI3MTAwIDAuMTYwODA2Cit2IDAuMjg4Nzg4IDIuNjY5NTIyIDAuMTYwODA2Cit2IC0wLjE0NzYzNCAyLjY2OTUyMiAwLjE2MDgwNgordiAtMC4xNDc2MzQgMi4zNzAwNzggMC4xNjA4MDYKK3YgMC4yODg3ODggMi4zNzAwNzcgMC4xNjA4MDYKK3YgLTAuMTQ3NjM0IDIuOTMxODM5IDAuMTU3MTA3Cit2IDAuMjg4Nzg4IDIuOTMxODM4IDAuMTU3MTA3Cit2IDAuMzMwNTM4IDIuODU0OTkwIDAuMTYwODA2Cit2IDAuMzMwNTM4IDIuNzgzMjE4IDAuMTYwODA2Cit2IDAuMjg4Nzg4IDIuNzgzNzQ4IDAuMTYwODA2Cit2IDAuMjg4Nzg4IDIuODU0OTkwIDAuMTYwODA2Cit2IDAuMzMwNTM4IDIuOTMwNzA1IDAuMTU4NTI1Cit2IDAuNDQyMzgwIDIuOTMwNzA1IDAuMTU4NTI1Cit2IDAuNDQyMzgwIDIuOTI1NTM5IDAuMTYwODA2Cit2IDAuMzMwNTM4IDIuOTI1NTM5IDAuMTYwODA2Cit2IDAuNDQyMzgwIDIuOTE0ODQ4IDAuMTYwODA2Cit2IDAuMzMwNTM4IDIuOTE0ODQ4IDAuMTYwODA2Cit2IDAuNDQyMzgwIDIuNjE0MTU5IDAuMTYwODA2Cit2IDAuNDQyMzgwIDIuNDI3MTAwIDAuMTYwODA2Cit2IDAuMzMwNTk4IDIuNDI3MTAwIDAuMTYwODA2Cit2IDAuMzMwNTk4IDIuMzcwMDc3IDAuMTYwODA2Cit2IDAuNDQyMzgwIDIuMzcwMDc3IDAuMTYwODA2Cit2IDAuMzMwNTM4IDIuOTMxODM4IDAuMTU3MTA3Cit2IDAuNDQyMzgwIDIuOTMxODM4IDAuMTU3MTA3Cit2IDAuNjQwNjgyIDIuNzI2NDkzIDAuMTYwODA2Cit2IDAuNjQwNjQyIDIuODU0OTkwIDAuMTYwODA2Cit2IC0wLjE0NzYzNCAyLjg1NDk5MCAwLjE2MDgwNgordiAwLjQ0MjM4MCAyLjg1NDk5MCAwLjE2MDgwNgordiAwLjMzMDU5OCAyLjY2OTUyMiAwLjE2MDgwNgordiAtMC4xNDc2MzQgMi43ODM2NDggMC4xNjA4MDYKK3YgMC42NDA2NDIgMi45MTQ4NDggMC4xNjA4MDYKK3YgMC42NDA1NzEgMi42MTQxNTkgMC4xNjA4MDYKK3YgMC42NDA1NzEgMi40MjcxMDAgMC4xNjA4MDYKK3YgMC40NDIzODAgMi43MjY0OTMgMC4xNjA4MDYKK3YgMC42NDA1NzEgMi4zNzAwNzcgMC4xNjA4MDYKK3YgMC4zMzA1MzggMi43NzI5NzQgMC4xNjA4MDYKK3YgMC4yODg3ODggMi43NzI5NTMgMC4xNjA4MDYKK3YgLTAuMTQ3NjM0IDIuNzcyOTE4IDAuMTYwODA2Cit2IC0wLjE0NzYzNCAyLjY4MDE0MSAwLjE2MDgwNgordiAwLjI4ODc4OCAyLjY4MDE3NyAwLjE2MDgwNgordiAwLjMzMDU5OCAyLjY4MDEwMSAwLjE2MDgwNgordiAwLjM4NDkyMyAyLjcyNjQ5MyAwLjE2MDgwNgordiAwLjM2ODUxNiAyLjY4NjIyNCAwLjE2MDgwNgordiAwLjM2ODUxNiAyLjc2NjcwMCAwLjE2MDgwNgordiAwLjM2MTA2MyAyLjc1OTMxMSAwLjE2MDgwNgordiAwLjM3NDQyNSAyLjcyNjQ5MyAwLjE2MDgwNgordiAwLjM2MDk0OSAyLjY5MzY3MCAwLjE2MDgwNgordiAwLjkyODM3MSAyLjg1NTE5NyAwLjE2MDgwNwordiAwLjkyODM2NSAyLjcyNjYzMiAwLjE2MDgwNwordiAxLjE5NDg4NyAyLjYxNDE1OSAwLjE2MDgwNwordiAxLjE3NjkwMCAyLjcyNjcwNSAwLjE2MDgwNwordiAwLjkyODM3NSAyLjYxNDE1OSAwLjE2MDgwNgordiAxLjI0NDA3NyAyLjM5ODk1MSAwLjE1ODUyNQordiAxLjIzODkxMSAyLjM5ODY5MiAwLjE2MDgwNwordiAxLjIyODkxMSAyLjM5ODE5MSAwLjE2MDgwNwordiAwLjkyODM3NSAyLjQyNzEwMCAwLjE2MDgwNgordiAxLjAzNDgwNyAyLjQyNzEwMCAwLjE2MDgwNwordiAxLjE5NTE4NyAyLjQyNzEwMCAwLjE2MDgwNwordiAxLjEyNjYyOSAyLjQyNzEwMCAwLjE2MDgwNwordiAxLjEyNjUyOSAyLjYxNDE1OSAwLjE2MDgwNwordiAxLjI0NTIxMCAyLjM5OTAwOCAwLjE1NzEwOAordiAwLjI4ODc4OCAyLjM5ODE5MiAwLjE2MDgwNgordiAtMC4xNDc2MzQgMi4zOTgxOTIgMC4xNjA4MDYKK3YgMC40NDIzODAgMi4zOTgxOTIgMC4xNjA4MDYKK3YgMC4zMzA1OTggMi4zOTgxOTIgMC4xNjA4MDYKK3YgMC42NDA1NzEgMi4zOTgxOTIgMC4xNjA4MDYKK3YgMS4xOTUzMDYgMi4zOTgxOTIgMC4xNjA4MDcKK3YgMS4xOTUzMDYgMi4zNzAwNzcgMC4xNjA4MDcKK3YgMS4xMjY1MjcgMi43MjY2MDIgMC4xNjA4MDcKK3YgMS4wMzQ4MDcgMi44NTQ4ODcgMC4xNjA4MDcKK3YgMS4xMjYxNTQgMi44MDEyNTEgMC4xNjA4MDcKK3YgMS4wMzQ4MDcgMi43Mjk0OTMgMC4xNjA4MDcKK3YgMS4wMzQ4MDcgMi42MTQxNTkgMC4xNjA4MDcKK3YgMC4zMzA1MzggMi43NzA5MjUgMC4xNTg4MzgKK3YgMC4zNTk1NTEgMi43NTc4MTIgMC4xNTg4MzgKK3YgMC4zNTk1NTEgMi43NTc4MTIgMC4xNTYzMDEKK3YgMC4zMzA1MzggMi43NzA5MjUgMC4xNTYzMDEKK3YgMC4yODg3ODggMi43NzA5ODQgMC4xNTg4MzcKK3YgMC4yODg3ODggMi43NzA5ODQgMC4xNTYzMDEKK3YgLTAuMTQ3NjM0IDIuNzcwOTQ5IDAuMTU4ODM3Cit2IC0wLjE0NzYzNCAyLjc3MDk0OSAwLjE1NjMwMAordiAwLjI4ODc4OCAyLjY4MjE0NSAwLjE1ODgzNwordiAtMC4xNDc2MzQgMi42ODIxMTAgMC4xNTg4MzcKK3YgLTAuMTQ3NjM0IDIuNjgyMTEwIDAuMTU2MzAwCit2IDAuMjg4Nzg4IDIuNjgyMTQ1IDAuMTU2MzAxCit2IDAuMzMwNTk4IDIuNjgyMTQ5IDAuMTU4ODM4Cit2IDAuMzMwNTk4IDIuNjgyMTQ5IDAuMTU2MzAxCit2IDAuMzU5NDM2IDIuNjk1MTcwIDAuMTU4ODM4Cit2IDAuMzU5NDM2IDIuNjk1MTcwIDAuMTU2MzAxCit2IDAuMzcyMjk2IDIuNzI2NDkzIDAuMTU4ODM4Cit2IDAuMzcyMjk2IDIuNzI2NDkzIDAuMTU2MzAxCit2IC0xLjIyMzY0NCAwLjA3Mzc0MCAwLjE2MDgwNQordiAtMS41MzkzNDUgMC4wNzM3NDAgMC4xNTg1MjMKK3YgMC4yODg3ODYgMC4wNzM3NDAgMC4xNjA4MDUKK3YgMS4xMjY3MDMgMC4wNzM3NDAgMC4xNjA4MDYKK3YgLTEuNTQwNDc4IDAuMDczNzQwIDAuMTU3MTA1Cit2IC0xLjQ5MDU3NCAwLjA3Mzc0MCAwLjE2MDgwNAordiAtMS40MjE5NzIgMC4wNzM3NDAgMC4xNjA4MDUKK3YgMC42NDA2NDEgMC4wNzM3NDAgMC4xNjA4MDYKK3YgLTEuMzMwMDc2IDAuMDczNzQwIDAuMTYwODA1Cit2IC0xLjUyNDE3OSAwLjA3Mzc0MCAwLjE2MDgwNAordiAtMC41ODQwNTUgMC4wNzM3NDAgMC4xNjA4MDUKK3YgLTAuMTQ3NjM0IDAuMDczNzQwIDAuMTYwODA1Cit2IC0wLjYyNTg2NiAwLjA3Mzc0MCAwLjE2MDgwNQordiAtMS4wNDI1MzMgMC4wNzM3NDAgMC4xNjA4MDUKK3YgMS4yNDUyMDkgMC4wNzM3NDAgMC4xNTcxMDcKK3YgMC4zMzA1OTcgMC4wNzM3NDAgMC4xNjA4MDYKK3YgMS4xNjMwOTAgMi40MjcxMDAgMC4xNjA4MDcKK3YgMS4xNjI2MTkgMi4zOTgxOTIgMC4xNjA4MDcKK3YgMS4xNjI2MTkgMi4zNzAwNzcgMC4xNjA4MDcKK3YgMS4xNjI2MTggMC4wNzM3NDAgMC4xNjA4MDYKK3YgLTEuNTM0MTc5IDIuMzI1Mzg5IDAuMTYwODA1Cit2IC0xLjU0MDQ3OCAyLjMyNTM4OSAwLjE1NzEwNgordiAtMS41MjQxNzkgMi4zMjUzODkgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IDIuMzI1Mzg5IDAuMTYwODA1Cit2IC0xLjMzMDA3NiAyLjMyNTM4OSAwLjE2MDgwNQordiAtMS41MzkzNDUgMi4zMjUzODkgMC4xNTg1MjMKK3YgLTAuNjI1ODY3IDIuMzI1Mzg5IDAuMTYwODA1Cit2IC0wLjU4NDA1NiAyLjMyNTM4OSAwLjE2MDgwNQordiAtMC43OTM1NzcgMi4zMjUzODkgMC4xNjA4MDUKK3YgLTAuODczOTk1IDIuMzI1Mzg5IDAuMTYwODA1Cit2IC0xLjQ5MDU3NSAyLjMyNTM4OSAwLjE2MDgwNQordiAtMS4wNDI1MzQgMi4zMjUzODkgMC4xNjA4MDUKK3YgLTEuNDIxOTcyIDIuMzI1Mzg5IDAuMTYwODA1Cit2IC0wLjE0NzYzNCAyLjMyNTM5MCAwLjE2MDgwNgordiAxLjI0NDA3NyAyLjMyNTM4OSAwLjE1ODUyNQordiAxLjIzODkxMSAyLjMyNTM4OSAwLjE2MDgwNwordiAxLjIyODkxMSAyLjMyNTM4OSAwLjE2MDgwNwordiAxLjI0NTIxMCAyLjMyNTM4OSAwLjE1NzEwOAordiAwLjI4ODc4OCAyLjMyNTM4OSAwLjE2MDgwNgordiAwLjQ0MjM4MCAyLjMyNTM4OSAwLjE2MDgwNgordiAwLjMzMDU5OCAyLjMyNTM4OSAwLjE2MDgwNgordiAwLjY0MDU3MSAyLjMyNTM4OSAwLjE2MDgwNgordiAxLjE5NTMwNiAyLjMyNTM4OSAwLjE2MDgwNwordiAwLjkyODM3NSAyLjMyNTM4OSAwLjE2MDgwNgordiAxLjAzNDgwNyAyLjMyNTM4OSAwLjE2MDgwNwordiAxLjEyNjcwNCAyLjMyNTM4OSAwLjE2MDgwNwordiAxLjE2MjYxOSAyLjMyNTM4OSAwLjE2MDgwNwordiAtMS41MzQxNzkgMi40OTA5MTMgMC4xNjA4MDUKK3YgLTEuNTQwNDc5IDIuNDkxMzk1IDAuMTU3MTA2Cit2IC0xLjUyNDE3OSAyLjQ5MDE0OSAwLjE2MDgwNQordiAtMS4yMjM2NDQgMi40OTAxNDkgMC4xNjA4MDUKK3YgLTEuMzMwMDc2IDIuNDkwMTQ5IDAuMTYwODA1Cit2IC0xLjUzOTM0NiAyLjQ5MTMwOCAwLjE1ODUyMwordiAtMC42MjU4NjcgMi40OTAxNDkgMC4xNjA4MDUKK3YgLTAuNTg0MDU2IDIuNDkwMTQ5IDAuMTYwODA1Cit2IC0wLjc5MzU3NyAyLjQ5MDE0OSAwLjE2MDgwNQordiAtMC44NzM5OTUgMi40OTAxNDkgMC4xNjA4MDUKK3YgLTEuNDkwMzUzIDIuNDkwMTQ5IDAuMTYwODA1Cit2IC0xLjA0MjUzNCAyLjQ5MDE0OSAwLjE2MDgwNQordiAtMS40MjIwMzMgMi40OTAxNDkgMC4xNjA4MDUKK3YgMS4yNDQwNzcgMi40OTEzMDggMC4xNTg1MjUKK3YgMS4yMzg5MTEgMi40OTA5MTIgMC4xNjA4MDcKK3YgMS4yMjg5MTEgMi40OTAxNDggMC4xNjA4MDcKK3YgMS4yNDUyMTAgMi40OTEzOTUgMC4xNTcxMDgKK3YgMC4yODg3ODggMi40OTAxNDkgMC4xNjA4MDYKK3YgLTAuMTQ3NjM0IDIuNDkwMTQ5IDAuMTYwODA2Cit2IDAuNDQyMzgwIDIuNDkwMTQ5IDAuMTYwODA2Cit2IDAuMzMwNTk4IDIuNDkwMTQ5IDAuMTYwODA2Cit2IDAuNjQwNTYwIDIuNDkwODkxIDAuMTYwODA2Cit2IDEuMTk1MDg1IDIuNDkwMTQ5IDAuMTYwODA3Cit2IDEuMTI2NDg3IDIuNDkwMTQ5IDAuMTYwODA3Cit2IDAuOTI3OTM3IDIuNDkwODkxIDAuMTYwODA2Cit2IDEuMDM0ODA3IDIuNDkwMTQ5IDAuMTYwODA3Cit2IDEuMTYyMjU2IDIuNDkwMTQ5IDAuMTYwODA3Cit2IC0xLjQ1MzYzMSAyLjM3MDA3NyAwLjE2MDgwNQordiAtMS40NTM2MzEgMi4zOTgxOTIgMC4xNjA4MDUKK3YgLTEuNDUzNTI3IDIuNDI3MTAwIDAuMTYwODA1Cit2IC0xLjQ1MzYzMSAwLjA3Mzc0MCAwLjE2MDgwNAordiAtMS40NTM2MzEgMi4zMjUzODkgMC4xNjA4MDUKK3YgLTEuNDUzNjg1IDIuNDkwMTQ5IDAuMTYwODA1Cit2IC0wLjg3Mzk5NiAtMi43NzczNjggMC4xNjA4MDUKK3YgLTAuODczOTk2IC0yLjc4MjUzNCAwLjE1ODUyNAordiAtMS4wNDMwOTAgLTIuNzgyNTM0IDAuMTU4NTI0Cit2IC0xLjA0MzA5MCAtMi43NzczNjggMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IC0yLjc3NzM2OCAwLjE2MDgwNQordiAtMS4yMjM2NDUgLTIuNzgyNTM0IDAuMTU4NTI0Cit2IC0xLjM0NjI3MSAtMi43NTc2OTMgMC4xNTg1MjQKK3YgLTEuMzQ0MjM2IC0yLjc1MjgzNCAwLjE2MDgwNQordiAtMS40NDY3MTEgLTIuNjg5OTI2IDAuMTU4NTI0Cit2IC0xLjQ0MzMxMSAtMi42ODU5NTMgMC4xNjA4MDUKK3YgLTEuNTE0NDY0IC0yLjU4OTQ5MiAwLjE1ODUyMwordiAtMS41MDk2MDQgLTIuNTg3NDU4IDAuMTYwODA1Cit2IC0xLjUzOTM0NiAtMi40NjY3MjggMC4xNTg1MjMKK3YgLTEuNTM0MTgwIC0yLjQ2NjcyNyAwLjE2MDgwNQordiAtMS41MzkzNDYgLTIuMzQzODI4IDAuMTU4NTIzCit2IC0xLjUzNDE4MCAtMi4zNDM0MzMgMC4xNjA4MDUKK3YgLTEuNTM0MTgwIC0yLjIyMjU5NyAwLjE2MDgwNQordiAtMS41MzkzNDYgLTIuMjIyNTk3IDAuMTU4NTIzCit2IC0xLjUzOTM0NiAtMi4xODI2NzQgMC4xNTg1MjMKK3YgLTEuNTM0MTgwIC0yLjE4MjY3NCAwLjE2MDgwNQordiAtMS4zNDAyOTkgLTIuNzQzNDI4IDAuMTYwODA1Cit2IC0xLjIyMzY0NCAtMi43NjczNjggMC4xNjA4MDUKK3YgLTEuNDM2MTA4IC0yLjY3ODc1MCAwLjE2MDgwNQordiAtMS41MDAxOTggLTIuNTgzNTIwIDAuMTYwODA1Cit2IC0xLjUyNDE4MCAtMi40NjY3NTQgMC4xNjA4MDUKK3YgLTEuNTI0MTgwIC0yLjM0MjY2OCAwLjE2MDgwNQordiAtMS41MjQxODAgLTIuMTgyNjc0IDAuMTYwODA1Cit2IC0xLjUyNDE4MCAtMi4yMjI1OTcgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IC0yLjIyMjU5NyAwLjE2MDgwNQordiAtMS4yMjM2NDQgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0xLjMzMDA3NiAtMi4yNTA3MTIgMC4xNjA4MDUKK3YgLTEuMzMwMDc2IC0yLjIyMjU5NyAwLjE2MDgwNQordiAtMS40MjIwMzggLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0xLjQyMTk3MyAtMi4yMjI1OTcgMC4xNjA4MDUKK3YgLTAuODczOTk2IC0yLjc4Mjg4MyAwLjE1NzEwNgordiAtMS4wNDMwOTAgLTIuNzgyODgzIDAuMTU3MTA2Cit2IC0xLjIyMzY0NSAtMi43ODI4ODIgMC4xNTcxMDYKK3YgLTEuMzQ2NzE3IC0yLjc1ODc1OSAwLjE1NzEwNgordiAtMS40NDc1MjcgLTIuNjkwNzQyIDAuMTU3MTA2Cit2IC0xLjUxNTUzMCAtMi41ODk5MzggMC4xNTcxMDYKK3YgLTEuNTQwNDc5IC0yLjQ2NjcyOCAwLjE1NzEwNgordiAtMS41NDA0NzkgLTIuMzQzOTE1IDAuMTU3MTA2Cit2IC0xLjU0MDQ3OSAtMi4yMjI1OTcgMC4xNTcxMDYKK3YgLTEuNTQwNDc5IC0yLjE4MjY3NCAwLjE1NzEwNgordiAtMC4xNDc2MzUgLTIuNzgyNTM0IDAuMTU4NTI0Cit2IC0wLjU4NDA1NyAtMi43ODI1MzQgMC4xNTg1MjQKK3YgLTAuNTg0MDU3IC0yLjc3NzM2OCAwLjE2MDgwNQordiAtMC4xNDc2MzUgLTIuNzc3MzY4IDAuMTYwODA2Cit2IC0wLjU4NDA1NyAtMi43NjczNjggMC4xNjA4MDUKK3YgLTAuMTQ3NjM1IC0yLjc2NzM2OCAwLjE2MDgwNgordiAtMC4xNDc2MzUgLTIuNDY2NzU1IDAuMTYwODA2Cit2IC0wLjU4NDA1NyAtMi40NjY3NTUgMC4xNjA4MDUKK3YgLTAuNTg0MDU3IC0yLjM0MjY2OSAwLjE2MDgwNQordiAtMC4xNDc2MzUgLTIuMzQyNjY5IDAuMTYwODA2Cit2IC0wLjU4NDA1NyAtMi41MjIwNDIgMC4xNjA4MDUKK3YgLTAuMTQ3NjM1IC0yLjUyMjA0MyAwLjE2MDgwNgordiAtMC4xNDc2MzUgLTIuMjIyNTk4IDAuMTYwODA2Cit2IC0wLjU4NDA1NyAtMi4yMjI1OTcgMC4xNjA4MDUKK3YgLTAuNTg0MDU3IC0yLjE4MjY3NSAwLjE2MDgwNQordiAtMC4xNDc2MzUgLTIuMTgyNjc1IDAuMTYwODA2Cit2IC0wLjE0NzYzNSAtMi43ODI4ODMgMC4xNTcxMDcKK3YgLTAuNTg0MDU3IC0yLjc4Mjg4MyAwLjE1NzEwNgordiAtMC42MjU4MDcgLTIuNzA3NTEwIDAuMTYwODA1Cit2IC0wLjYyNTgwNyAtMi42MzU3MzggMC4xNjA4MDUKK3YgLTAuNTg0MDU3IC0yLjYzNjI2OCAwLjE2MDgwNQordiAtMC41ODQwNTcgLTIuNzA3NTEwIDAuMTYwODA1Cit2IC0wLjYyNTgwNyAtMi43ODI1MzQgMC4xNTg1MjQKK3YgLTAuNzkzNTc4IC0yLjc4MjUzNCAwLjE1ODUyNAordiAtMC43OTM1NzcgLTIuNzc3MzY4IDAuMTYwODA1Cit2IC0wLjYyNTgwNyAtMi43NzczNjggMC4xNjA4MDUKK3YgLTAuNzkzNTc3IC0yLjc2NzM2OCAwLjE2MDgwNQordiAtMC42MjU4MDcgLTIuNzY3MzY4IDAuMTYwODA1Cit2IC0wLjYyNTg2NyAtMi40NjY3NTUgMC4xNjA4MDUKK3YgLTAuNzkzNTc3IC0yLjQ2Njc1NSAwLjE2MDgwNQordiAtMC43OTM1NzcgLTIuMzQyNjY5IDAuMTYwODA1Cit2IC0wLjYyNTg2NyAtMi4zNDI2NjkgMC4xNjA4MDUKK3YgLTAuNjI1ODY3IC0yLjIyMjU5NyAwLjE2MDgwNQordiAtMC43OTM1NzcgLTIuMjIyNTk3IDAuMTYwODA1Cit2IC0wLjc5MzU3NyAtMi4xODI2NzUgMC4xNjA4MDUKK3YgLTAuNjI1ODY3IC0yLjE4MjY3NSAwLjE2MDgwNQordiAtMC42MjU4MDcgLTIuNzgyODgzIDAuMTU3MTA2Cit2IC0wLjc5MzU3OCAtMi43ODI4ODMgMC4xNTcxMDYKK3YgLTAuODc0MDM1IC0yLjU3OTAxMyAwLjE2MDgwNQordiAtMC44NzM5OTYgLTIuNzA3NTEwIDAuMTYwODA1Cit2IC0wLjE0NzYzNSAtMi43MDc1MTAgMC4xNjA4MDYKK3YgLTAuNzkzNTc3IC0yLjcwNzUxMCAwLjE2MDgwNQordiAtMC42MjU4NjcgLTIuNTIyMDQyIDAuMTYwODA1Cit2IC0wLjE0NzYzNSAtMi42MzYxNjggMC4xNjA4MDYKK3YgLTAuODczOTk2IC0yLjc2NzM2OCAwLjE2MDgwNQordiAtMC44NzM5OTYgLTIuNDY2NzU1IDAuMTYwODA1Cit2IC0wLjg3Mzk5NiAtMi4zNDI2NjkgMC4xNjA4MDUKK3YgLTAuNzkzNTc3IC0yLjU3OTAxMyAwLjE2MDgwNQordiAtMC44NzM5OTUgLTIuMjIyNTk3IDAuMTYwODA1Cit2IC0wLjg3Mzk5NiAtMi4xODI2NzUgMC4xNjA4MDUKK3YgLTAuNjI1ODA3IC0yLjYyNTQ5NCAwLjE2MDgwNQordiAtMC41ODQwNTcgLTIuNjI1NDczIDAuMTYwODA1Cit2IC0wLjE0NzYzNSAtMi42MjU0MzggMC4xNjA4MDYKK3YgLTAuMTQ3NjM1IC0yLjUzMjY2MSAwLjE2MDgwNgordiAtMC41ODQwNTcgLTIuNTMyNjk3IDAuMTYwODA1Cit2IC0wLjYyNTg2NyAtMi41MzI2MjEgMC4xNjA4MDUKK3YgLTAuNjgwMTkyIC0yLjU3OTAxMyAwLjE2MDgwNQordiAtMC42NjM3ODUgLTIuNTM4NzQ0IDAuMTYwODA1Cit2IC0wLjY2Mzc4NSAtMi42MTkyMjAgMC4xNjA4MDUKK3YgLTAuNjU2MzMxIC0yLjYxMTgzMSAwLjE2MDgwNQordiAtMC42Njk2OTQgLTIuNTc5MDEzIDAuMTYwODA1Cit2IC0wLjY1NjIxOCAtMi41NDYxOTEgMC4xNjA4MDUKK3YgLTEuMDQyNTM0IC0yLjQ2Njc1NSAwLjE2MDgwNQordiAtMS4wNDI3ODAgLTIuNzA3NTEwIDAuMTYwODA1Cit2IC0xLjIyMzY0MCAtMi43MDc3MTcgMC4xNjA4MDUKK3YgLTEuMjIzNjM0IC0yLjU3NzkzNiAwLjE2MDgwNQordiAtMS40OTAzNDEgLTIuNDY2NzU1IDAuMTYwODA1Cit2IC0xLjQ3MjE2OCAtMi41Nzc5MzYgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IC0yLjQ2Njc1NSAwLjE2MDgwNQordiAtMS4wNDMwOTAgLTIuNzY3MzY4IDAuMTYwODA1Cit2IC0xLjA0MjUzNCAtMi4zNDI2NjkgMC4xNjA4MDUKK3YgLTEuMDQyNTM0IC0yLjIyMjU5NyAwLjE2MDgwNQordiAtMS4wNDI1MzQgLTIuMTgyNjc1IDAuMTYwODA1Cit2IC0xLjUzOTM0NiAtMi4yNTE0NzEgMC4xNTg1MjMKK3YgLTEuNTM0MTgwIC0yLjI1MTIxMiAwLjE2MDgwNQordiAtMS41MjQxODAgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0xLjIyMzY0NCAtMi4yNzk2MjAgMC4xNjA4MDUKK3YgLTEuMzMwMDc2IC0yLjI3OTYyMCAwLjE2MDgwNQordiAtMS40OTAzNTQgLTIuMzQyNjY4IDAuMTYwODA1Cit2IC0xLjQ1MzY4NiAtMi4zNDI2NjggMC4xNjA4MDUKK3YgLTEuNTQwNDc5IC0yLjI1MTUyOCAwLjE1NzEwNgordiAtMC41ODQwNTcgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0wLjE0NzYzNSAtMi4yNTA3MTMgMC4xNjA4MDYKK3YgLTAuNzkzNTc3IC0yLjI1MDcxMiAwLjE2MDgwNQordiAtMC42MjU4NjcgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAtMi4yNTA3MTIgMC4xNjA4MDUKK3YgLTEuMDQyNTM0IC0yLjI1MDcxMyAwLjE2MDgwNQordiAtMS40OTA1NzUgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0xLjQ5MDU3NSAtMi4yMjI1OTcgMC4xNjA4MDUKK3YgLTEuNDkwNTc1IC0yLjE4MjY3NCAwLjE2MDgwNQordiAtMS40MjIwNTUgLTIuNDY2NzU1IDAuMTYwODA1Cit2IC0xLjQyMjAzNCAtMi41Nzc5MzUgMC4xNjA4MDUKK3YgLTEuMzMwMDc2IC0yLjcwNzQwNyAwLjE2MDgwNQordiAtMS40MjI3MTcgLTIuNjUzNzcxIDAuMTYwODA1Cit2IC0xLjMzMDA3NiAtMi41Nzc5NDAgMC4xNjA4MDUKK3YgLTEuNTM5MzQ2IC0yLjI4MDU5NSAwLjE1ODUyMwordiAtMS41MzQxODAgLTIuMjgwMjYyIDAuMTYwODA1Cit2IC0xLjUyNDE4MCAtMi4yNzk2MTkgMC4xNjA4MDUKK3YgLTEuNTQwNDc5IC0yLjI4MDY2OCAwLjE1NzEwNgordiAtMC41ODQwNTcgLTIuMjc5NjIwIDAuMTYwODA1Cit2IC0wLjE0NzYzNSAtMi4yNzk2MjAgMC4xNjA4MDYKK3YgLTAuNzkzNTc3IC0yLjI3OTYyMCAwLjE2MDgwNQordiAtMC42MjU4NjcgLTIuMjc5NjIwIDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAtMi4yNzk2MjAgMC4xNjA4MDUKK3YgLTEuMDQyNTM0IC0yLjI3OTYyMCAwLjE2MDgwNQordiAtMS4yMjM2NDQgLTIuMzQyNjY4IDAuMTYwODA1Cit2IC0xLjMzMDA3NiAtMi4zNDI2NjggMC4xNjA4MDUKK3YgLTEuNDkwNDU2IC0yLjI3OTYyMCAwLjE2MDgwNQordiAtMS40NTM2MzIgLTIuMjUwNzEyIDAuMTYwODA1Cit2IC0xLjQ1MzUyNyAtMi4yNzk2MjAgMC4xNjA4MDUKK3YgLTEuNDIyMDMzIC0yLjM0MjY2OCAwLjE2MDgwNQordiAtMS40MjIwMzYgLTIuMjc5NjIwIDAuMTYwODA1Cit2IC0wLjYyNTgwNyAtMi42MjM0NDUgMC4xNTg4MzcKK3YgLTAuNjU0ODIwIC0yLjYxMDMzMiAwLjE1ODgzNwordiAtMC42NTQ4MjAgLTIuNjEwMzMyIDAuMTU2MzAwCit2IC0wLjYyNTgwNyAtMi42MjM0NDUgMC4xNTYzMDAKK3YgLTAuNTg0MDU3IC0yLjYyMzUwNCAwLjE1ODgzNwordiAtMC41ODQwNTcgLTIuNjIzNTA0IDAuMTU2MzAwCit2IC0wLjE0NzYzNSAtMi42MjM0NjkgMC4xNTg4MzcKK3YgLTAuMTQ3NjM1IC0yLjYyMzQ2OSAwLjE1NjMwMAordiAtMC41ODQwNTcgLTIuNTM0NjY1IDAuMTU4ODM3Cit2IC0wLjE0NzYzNSAtMi41MzQ2MzAgMC4xNTg4MzcKK3YgLTAuMTQ3NjM1IC0yLjUzNDYzMCAwLjE1NjMwMAordiAtMC41ODQwNTcgLTIuNTM0NjY1IDAuMTU2MzAwCit2IC0wLjYyNTg2NyAtMi41MzQ2NjkgMC4xNTg4MzcKK3YgLTAuNjI1ODY3IC0yLjUzNDY2OSAwLjE1NjMwMAordiAtMC42NTQ3MDUgLTIuNTQ3NjkwIDAuMTU4ODM3Cit2IC0wLjY1NDcwNSAtMi41NDc2OTAgMC4xNTYzMDAKK3YgLTAuNjY3NTY1IC0yLjU3OTAxMyAwLjE1ODgzNwordiAtMC42Njc1NjUgLTIuNTc5MDEzIDAuMTU2MzAwCit2IC0xLjMzMDA3NiAtMi40NjY3NTUgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IC0yLjE4MjY3NSAwLjE2MDgwNQordiAtMS40NTM2MzIgLTIuMjIyNTk3IDAuMTYwODA1Cit2IC0xLjQ1MzYzMiAtMi4xODI2NzQgMC4xNjA4MDUKK3YgLTEuNDIxOTczIC0yLjE4MjY3NSAwLjE2MDgwNQordiAwLjY0MDY0MiAtMi43NzczNjggMC4xNjA4MDYKK3YgMC45Mjg5NTggLTIuNzc3MzY4IDAuMTYwODA3Cit2IDAuOTI5NzgyIC0yLjc4MjUzNCAwLjE1ODUyNQordiAwLjY0MDY0MiAtMi43ODI1MzQgMC4xNTg1MjUKK3YgMS4wNDg5NjcgLTIuNzUyODM0IDAuMTYwODA3Cit2IDEuMDUxMDAxIC0yLjc1NzY5MyAwLjE1ODUyNQordiAxLjE0ODY5MyAtMi42ODYwNzAgMC4xNjA4MDcKK3YgMS4xNTIyODEgLTIuNjg5OTA1IDAuMTU4NTI1Cit2IDEuMjE0NDUwIC0yLjU4NzQwMSAwLjE2MDgwNwordiAxLjIxOTMwOSAtMi41ODk0MzYgMC4xNTg1MjUKK3YgMS4yMzg5MTAgLTIuNDY2NzcyIDAuMTYwODA3Cit2IDEuMjQ0MDc2IC0yLjQ2Njc4MCAwLjE1ODUyNQordiAxLjIzODkxMCAtMi4zNDM0MzMgMC4xNjA4MDcKK3YgMS4yNDQwNzYgLTIuMzQzODI4IDAuMTU4NTI1Cit2IDEuMjM4OTEwIC0yLjIyMjU5NyAwLjE2MDgwNwordiAxLjIzODkxMCAtMi4xODI2NzUgMC4xNjA4MDcKK3YgMS4yNDQwNzYgLTIuMTgyNjc1IDAuMTU4NTI1Cit2IDEuMjQ0MDc2IC0yLjIyMjU5NyAwLjE1ODUyNQordiAwLjkyODM3NSAtMi43NjczNjggMC4xNjA4MDcKK3YgMS4wNDUwMjkgLTIuNzQzNDI4IDAuMTYwODA3Cit2IDEuMTQxMzg3IC0yLjY3ODc1MCAwLjE2MDgwNwordiAxLjIwNTA0MyAtMi41ODM0NjMgMC4xNjA4MDcKK3YgMS4yMjg5MTAgLTIuNDY2NzU1IDAuMTYwODA3Cit2IDEuMjI4OTEwIC0yLjM0MjY2OSAwLjE2MDgwNwordiAxLjIyODkxMCAtMi4yMjI1OTcgMC4xNjA4MDcKK3YgMS4yMjg5MTAgLTIuMTgyNjc1IDAuMTYwODA3Cit2IDAuOTI4Mzc1IC0yLjIyMjU5NyAwLjE2MDgwNgordiAxLjAzNDgwNiAtMi4yMjI1OTcgMC4xNjA4MDcKK3YgMS4wMzQ4MDYgLTIuMjUwNzEyIDAuMTYwODA3Cit2IDAuOTI4Mzc1IC0yLjI1MDcxMiAwLjE2MDgwNgordiAxLjEyNjcwMyAtMi4yMjI1OTcgMC4xNjA4MDcKK3YgMS4xMjY3MDMgLTIuMjUwNzEyIDAuMTYwODA3Cit2IDAuOTI5ODYxIC0yLjc4Mjg4MiAwLjE1NzEwOAordiAwLjY0MDY0MiAtMi43ODI4ODMgMC4xNTcxMDcKK3YgMS4wNTE0NDcgLTIuNzU4NzU5IDAuMTU3MTA4Cit2IDEuMTUzMDk3IC0yLjY5MDcyMiAwLjE1NzEwOAordiAxLjIyMDM3NSAtMi41ODk4ODIgMC4xNTcxMDgKK3YgMS4yNDUyMTAgLTIuNDY2NzgyIDAuMTU3MTA4Cit2IDEuMjQ1MjEwIC0yLjM0MzkxNSAwLjE1NzEwOAordiAxLjI0NTIxMCAtMi4xODI2NzUgMC4xNTcxMDgKK3YgMS4yNDUyMTAgLTIuMjIyNTk3IDAuMTU3MTA4Cit2IDAuMjg4Nzg3IC0yLjc3NzM2OCAwLjE2MDgwNgordiAwLjI4ODc4NyAtMi43ODI1MzQgMC4xNTg1MjQKK3YgMC4yODg3ODcgLTIuNzY3MzY4IDAuMTYwODA2Cit2IDAuMjg4Nzg3IC0yLjM0MjY2OSAwLjE2MDgwNgordiAwLjI4ODc4NyAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC4yODg3ODcgLTIuNTIyMDQyIDAuMTYwODA2Cit2IDAuMjg4Nzg3IC0yLjE4MjY3NSAwLjE2MDgwNgordiAwLjI4ODc4NyAtMi4yMjI1OTcgMC4xNjA4MDYKK3YgMC4yODg3ODggLTIuNzgyODgzIDAuMTU3MTA3Cit2IDAuMzMwNTM3IC0yLjcwNzUxMCAwLjE2MDgwNgordiAwLjI4ODc4NyAtMi43MDc1MTAgMC4xNjA4MDYKK3YgMC4yODg3ODcgLTIuNjM2MjY4IDAuMTYwODA2Cit2IDAuMzMwNTM3IC0yLjYzNTczOCAwLjE2MDgwNgordiAwLjMzMDUzNyAtMi43ODI1MzQgMC4xNTg1MjUKK3YgMC4zMzA1MzcgLTIuNzc3MzY4IDAuMTYwODA2Cit2IDAuNDQyMzc5IC0yLjc3NzM2OCAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMi43ODI1MzQgMC4xNTg1MjUKK3YgMC4zMzA1MzcgLTIuNzY3MzY4IDAuMTYwODA2Cit2IDAuNDQyMzc5IC0yLjc2NzM2OCAwLjE2MDgwNgordiAwLjMzMDU5OCAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC4zMzA1OTggLTIuMzQyNjY5IDAuMTYwODA2Cit2IDAuNDQyMzc5IC0yLjM0MjY2OSAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC4zMzA1OTggLTIuMjIyNTk3IDAuMTYwODA2Cit2IDAuMzMwNTk4IC0yLjE4MjY3NSAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMi4xODI2NzUgMC4xNjA4MDYKK3YgMC40NDIzNzkgLTIuMjIyNTk3IDAuMTYwODA2Cit2IDAuMzMwNTM3IC0yLjc4Mjg4MyAwLjE1NzEwNwordiAwLjQ0MjM4MCAtMi43ODI4ODMgMC4xNTcxMDcKK3YgMC40NDIzNzkgLTIuNzA3NTEwIDAuMTYwODA2Cit2IDAuMzMwNTk4IC0yLjUyMjA0MiAwLjE2MDgwNgordiAwLjY0MDY0MiAtMi43NjczNjggMC4xNjA4MDYKK3YgMC42NDA2NDIgLTIuMzQyNjY5IDAuMTYwODA2Cit2IDAuNjQwNjQyIC0yLjQ2Njc1NSAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMi41NzkwMTMgMC4xNjA4MDYKK3YgMC42NDA2ODEgLTIuNTc5MDEzIDAuMTYwODA2Cit2IDAuNjQwNjQyIC0yLjE4MjY3NSAwLjE2MDgwNgordiAwLjY0MDY0MiAtMi4yMjI1OTcgMC4xNjA4MDYKK3YgMC42NDA2NDIgLTIuNzA3NTEwIDAuMTYwODA2Cit2IDAuMjg4Nzg3IC0yLjYyNTQ3MyAwLjE2MDgwNgordiAwLjMzMDUzNyAtMi42MjU0OTQgMC4xNjA4MDYKK3YgMC4yODg3ODcgLTIuNTMyNjk3IDAuMTYwODA2Cit2IDAuMzMwNTk4IC0yLjUzMjYyMSAwLjE2MDgwNgordiAwLjM4NDkyMyAtMi41NzkwMTMgMC4xNjA4MDYKK3YgMC4zNjg1MTYgLTIuNTM4NzQ0IDAuMTYwODA2Cit2IDAuMzY4NTE1IC0yLjYxOTIyMCAwLjE2MDgwNgordiAwLjM2MTA2MiAtMi42MTE4MzEgMC4xNjA4MDYKK3YgMC4zNzQ0MjQgLTIuNTc5MDEzIDAuMTYwODA2Cit2IDAuMzYwOTQ4IC0yLjU0NjE5MSAwLjE2MDgwNgordiAxLjE3Njg5OSAtMi41Nzk3NTMgMC4xNjA4MDcKK3YgMS4xOTQ4ODYgLTIuNDY2NzU1IDAuMTYwODA3Cit2IDAuOTI4Mzc1IC0yLjM0MjY2OCAwLjE2MDgwNgordiAwLjkyODM3NSAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC45MjgzNzUgLTIuMTgyNjc1IDAuMTYwODA2Cit2IDAuOTI4MzcxIC0yLjcwNzcxNyAwLjE2MDgwNwordiAxLjI0NDA3NiAtMi4yNTE0NzEgMC4xNTg1MjUKK3YgMS4yMzg5MTAgLTIuMjUxMjEzIDAuMTYwODA3Cit2IDEuMjI4OTEwIC0yLjI1MDcxMiAwLjE2MDgwNwordiAxLjAzNDgwNiAtMi4yNzk2MjAgMC4xNjA4MDcKK3YgMC45MjgzNzUgLTIuMjc5NjIwIDAuMTYwODA2Cit2IDEuMTYyMjU1IC0yLjM0MjY2OCAwLjE2MDgwNwordiAxLjE5NTA4NCAtMi4zNDI2NjggMC4xNjA4MDcKK3YgMS4yNDUyMTAgLTIuMjUxNTI4IDAuMTU3MTA4Cit2IDAuMjg4Nzg3IC0yLjI1MDcxMiAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMi4yNTA3MTIgMC4xNjA4MDYKK3YgMC4zMzA1OTggLTIuMjUwNzEyIDAuMTYwODA2Cit2IDAuNjQwNjQyIC0yLjI1MDcxMiAwLjE2MDgwNgordiAxLjE5NTMwNiAtMi4yNTA3MTIgMC4xNjA4MDcKK3YgMS4xOTUzMDYgLTIuMjIyNTk3IDAuMTYwODA3Cit2IDEuMTk1MzA2IC0yLjE4MjY3NCAwLjE2MDgwNwordiAxLjEyNjUyNiAtMi41Nzk3MzQgMC4xNjA4MDcKK3YgMS4xMjYyMTAgLTIuNDY2NzU1IDAuMTYwODA3Cit2IDEuMDM0ODA2IC0yLjcwNzQwNyAwLjE2MDgwNwordiAxLjEyNjE1NCAtMi42NTM3NzEgMC4xNjA4MDcKK3YgMS4wMzQ4MDcgLTIuNTgwMjg0IDAuMTYwODA3Cit2IDEuMjQ0MDc2IC0yLjI4MDU5NSAwLjE1ODUyNQordiAxLjIzODkxMCAtMi4yODAyNjMgMC4xNjA4MDcKK3YgMS4yMjg5MTAgLTIuMjc5NjIwIDAuMTYwODA3Cit2IDEuMjQ1MjEwIC0yLjI4MDY2OCAwLjE1NzEwOAordiAwLjI4ODc4NyAtMi4yNzk2MjAgMC4xNjA4MDYKK3YgMC40NDIzNzkgLTIuMjc5NjIwIDAuMTYwODA2Cit2IDAuMzMwNTk4IC0yLjI3OTYyMCAwLjE2MDgwNgordiAwLjY0MDY0MiAtMi4yNzk2MjAgMC4xNjA4MDYKK3YgMS4wMzQ4MDYgLTIuMzQyNjY4IDAuMTYwODA3Cit2IDEuMTk1MTg2IC0yLjI3OTYyMCAwLjE2MDgwNwordiAxLjE2MjYxOSAtMi4yNTA3MTIgMC4xNjA4MDcKK3YgMS4xMjY2MjggLTIuMjc5NjIwIDAuMTYwODA3Cit2IDEuMTI2NDg2IC0yLjM0MjY2OCAwLjE2MDgwNwordiAwLjkyODM2NCAtMi41Nzk3NDAgMC4xNjA4MDcKK3YgMC4zMzA1MzcgLTIuNjIzNDQ1IDAuMTU4ODM4Cit2IDAuMzMwNTM3IC0yLjYyMzQ0NSAwLjE1NjMwMQordiAwLjM1OTU1MCAtMi42MTAzMzIgMC4xNTYzMDEKK3YgMC4zNTk1NTAgLTIuNjEwMzMyIDAuMTU4ODM4Cit2IDAuMjg4Nzg3IC0yLjYyMzUwNCAwLjE1ODgzNwordiAwLjI4ODc4NyAtMi42MjM1MDQgMC4xNTYzMDEKK3YgMC4yODg3ODcgLTIuNTM0NjY1IDAuMTU4ODM3Cit2IDAuMjg4Nzg3IC0yLjUzNDY2NSAwLjE1NjMwMQordiAwLjMzMDU5OCAtMi41MzQ2NjkgMC4xNTg4MzgKK3YgMC4zMzA1OTggLTIuNTM0NjY5IDAuMTU2MzAxCit2IDAuMzU5NDM2IC0yLjU0NzY5MCAwLjE1ODgzOAordiAwLjM1OTQzNiAtMi41NDc2OTAgMC4xNTYzMDEKK3YgMC4zNzIyOTUgLTIuNTc5MDEzIDAuMTU4ODM4Cit2IDAuMzcyMjk1IC0yLjU3OTAxMyAwLjE1NjMwMQordiAxLjAzNDgwNiAtMi40NjY3NTUgMC4xNjA4MDcKK3YgMS4xMjY3MDMgLTIuMTgyNjc1IDAuMTYwODA3Cit2IDEuMTYyNjE5IC0yLjE4MjY3NCAwLjE2MDgwNwordiAxLjE2MjYxOSAtMi4yMjI1OTcgMC4xNjA4MDcKK3YgLTEuMzMwMDc2IC0yLjE4MjY3NSAwLjE2MDgwNQordiAxLjAzNDgwNyAwLjA3Mzc0MCAwLjE2MDgwNgordiAxLjAzNDgwNiAtMi4xODI2NzUgMC4xNjA4MDcKK3YgMC45MjgzNzUgMC4wNzM3NDAgMC4xNjA4MDYKK3YgMS4xNjMwODkgLTIuMjc5NjIwIDAuMTYwODA3Cit2IDEuMTk1MzA1IDAuMDczNzQwIDAuMTYwODA2Cit2IC0xLjUzNDE3OCAwLjA3Mzc0MCAwLjE2MDgwNAordiAtMC43OTM1NzYgMC4wNzM3NDAgMC4xNjA4MDUKK3YgLTAuODczOTk0IDAuMDczNzQwIDAuMTYwODA1Cit2IDEuMjM4OTA5IDAuMDczNzQwIDAuMTYwODA2Cit2IDEuMjQ0MDc2IDAuMDczNzQwIDAuMTU4NTI1Cit2IDEuMjI4OTA5IDAuMDczNzQwIDAuMTYwODA2Cit2IDAuNDQyMzc4IDAuMDczNzQwIDAuMTYwODA2Cit2IC0xLjA0MjY1MCAtMi41Nzg0OTQgMC4xNjA4MDUKK3YgLTEuMjIzNjQ0IC0xLjA1NDQ2NyAwLjE2MDgwNQordiAtMS4zMzAwNzYgLTEuMDU0NDY3IDAuMTYwODA1Cit2IC0xLjQyMTk3MiAtMS4wNTQ0NjcgMC4xNjA4MDUKK3YgMS4wMzQ4MDcgLTEuMDU0NDY4IDAuMTYwODA2Cit2IDAuOTI4Mzc1IC0xLjA1NDQ2NyAwLjE2MDgwNgordiAxLjEyNjcwMyAtMS4wNTQ0NjcgMC4xNjA4MDYKK3YgMS4xOTUzMDUgLTEuMDU0NDY3IDAuMTYwODA2Cit2IDEuMTYyNjE4IC0xLjA1NDQ2NyAwLjE2MDgwNgordiAtMS41MzkzNDUgLTEuMDU0NDY3IDAuMTU4NTIzCit2IC0xLjUzNDE3OSAtMS4wNTQ0NjcgMC4xNjA4MDUKK3YgLTEuNTI0MTc5IC0xLjA1NDQ2NyAwLjE2MDgwNQordiAtMS41NDA0NzggLTEuMDU0NDY3IDAuMTU3MTA2Cit2IC0wLjU4NDA1NiAtMS4wNTQ0NjcgMC4xNjA4MDUKK3YgLTAuMTQ3NjM1IC0xLjA1NDQ2OCAwLjE2MDgwNQordiAtMC43OTM1NzcgLTEuMDU0NDY3IDAuMTYwODA1Cit2IC0wLjYyNTg2NiAtMS4wNTQ0NjcgMC4xNjA4MDUKK3YgLTAuODczOTk1IC0xLjA1NDQ2NyAwLjE2MDgwNQordiAtMS4wNDI1MzQgLTEuMDU0NDY3IDAuMTYwODA1Cit2IC0xLjQ5MDU3NSAtMS4wNTQ0NjcgMC4xNjA4MDUKK3YgLTEuNDUzNjMxIC0xLjA1NDQ2NyAwLjE2MDgwNQordiAxLjIzODkxMCAtMS4wNTQ0NjcgMC4xNjA4MDYKK3YgMS4yNDQwNzYgLTEuMDU0NDY3IDAuMTU4NTI1Cit2IDEuMjI4OTEwIC0xLjA1NDQ2NyAwLjE2MDgwNgordiAxLjI0NTIwOSAtMS4wNTQ0NjcgMC4xNTcxMDcKK3YgMC4yODg3ODcgLTEuMDU0NDY3IDAuMTYwODA2Cit2IDAuMzMwNTk3IC0xLjA1NDQ2NyAwLjE2MDgwNgordiAwLjQ0MjM3OSAtMS4wNTQ0NjcgMC4xNjA4MDYKK3YgMC42NDA2NDEgLTEuMDU0NDY4IDAuMTYwODA2Cit2IDEuMjQ0MDc2IDEuMTk5NTY0IDAuMTU4NTI1Cit2IDEuMjM4OTEwIDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMjI4OTEwIDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMjQ1MjA5IDEuMTk5NTY0IDAuMTU3MTA3Cit2IDAuMjg4Nzg3IDEuMTk5NTY1IDAuMTYwODA2Cit2IDAuNDQyMzc5IDEuMTk5NTY1IDAuMTYwODA2Cit2IDAuMzMwNTk3IDEuMTk5NTY1IDAuMTYwODA2Cit2IDAuNjQwNjQxIDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMTk1MzA2IDEuMTk5NTY0IDAuMTYwODA2Cit2IDAuOTI4Mzc1IDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMDM0ODA3IDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMTI2NzAzIDEuMTk5NTY0IDAuMTYwODA2Cit2IDEuMTYyNjE5IDEuMTk5NTY0IDAuMTYwODA2Cit2IC0xLjUzNDE3OSAxLjE5OTU2NCAwLjE2MDgwNQordiAtMS41NDA0NzggMS4xOTk1NjQgMC4xNTcxMDYKK3YgLTEuNTI0MTc5IDEuMTk5NTY0IDAuMTYwODA1Cit2IC0xLjIyMzY0NCAxLjE5OTU2NSAwLjE2MDgwNQordiAtMS4zMzAwNzYgMS4xOTk1NjUgMC4xNjA4MDUKK3YgLTEuNTM5MzQ1IDEuMTk5NTY0IDAuMTU4NTIzCit2IC0wLjYyNTg2NiAxLjE5OTU2NSAwLjE2MDgwNQordiAtMC41ODQwNTYgMS4xOTk1NjUgMC4xNjA4MDUKK3YgLTAuNzkzNTc2IDEuMTk5NTY1IDAuMTYwODA1Cit2IC0wLjg3Mzk5NSAxLjE5OTU2NSAwLjE2MDgwNQordiAtMS40OTA1NzQgMS4xOTk1NjQgMC4xNjA4MDUKK3YgLTEuMDQyNTMzIDEuMTk5NTY1IDAuMTYwODA1Cit2IC0xLjQyMTk3MiAxLjE5OTU2NSAwLjE2MDgwNQordiAtMC4xNDc2MzQgMS4xOTk1NjUgMC4xNjA4MDUKK3YgLTEuNDUzNjMxIDEuMTk5NTY0IDAuMTYwODA1Cit2IDAuMjQyMDA3IDIuNjAxODI5IDAuMTYwODA2Cit2IDAuMjg4NzkyIDIuNjAxODI5IDAuMTYwODA2Cit2IDAuMzMwNTg4IDIuNjAxODI5IDAuMTYwODA2Cit2IDAuMzYxNTU2IDIuNTg5MDc4IDAuMTYwODA2Cit2IDAuMzc0NTAzIDIuNTU3ODM5IDAuMTYwODA2Cit2IDAuMzYxNjcyIDIuNTI2NzIxIDAuMTYwODA2Cit2IDAuMzMwMzg4IDIuNTEzMzUyIDAuMTYwODA2Cit2IDAuMjg4NzkyIDIuNTEzMzUyIDAuMTYwODA2Cit2IDAuMjQxNzgxIDIuNTEzMzUyIDAuMTYwODA2Cit2IDAuMjEwOTkwIDIuNTI2NDk2IDAuMTYwODA2Cit2IDAuMTk3ODEzIDIuNTU3ODM5IDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuNDI3MTAwIDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuNjY5NTIyIDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuMzcwMDc3IDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuNjgwMTY3IDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuMzk4MTkyIDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuNjgyMTM2IDAuMTU4ODM3Cit2IDAuMTUxMDc4IDIuNjgyMTM2IDAuMTU2MzAxCit2IDAuMTUxMDc3IDAuMDczNzQwIDAuMTYwODA1Cit2IDAuMTUxMDc4IDIuMzI1Mzg5IDAuMTYwODA2Cit2IDAuMTUxMDc4IDIuNDkwMTQ5IDAuMTYwODA2Cit2IDAuMTUxMDc4IC0yLjM0MjY2OSAwLjE2MDgwNgordiAwLjE1MTA3OCAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC4xNTEwNzggLTIuNTIyMDQyIDAuMTYwODA2Cit2IDAuMTUxMDc4IC0yLjE4MjY3NSAwLjE2MDgwNgordiAwLjE1MTA3OCAtMi4yMjI1OTcgMC4xNjA4MDYKK3YgMC4xNTEwNzggLTIuNTMyNjg3IDAuMTYwODA2Cit2IDAuMTUxMDc4IC0yLjI1MDcxMiAwLjE2MDgwNgordiAwLjE1MTA3OCAtMi4yNzk2MjAgMC4xNjA4MDYKK3YgMC4xNTEwNzggLTIuNTM0NjU1IDAuMTU2MzAxCit2IDAuMTUxMDc4IC0yLjUzNDY1NSAwLjE1ODgzNwordiAwLjE1MTA3NyAtMS4wNTQ0NjcgMC4xNjA4MDYKK3YgMC4xNTEwNzcgMS4xOTk1NjUgMC4xNjA4MDYKK3YgMC4yMTA5NzEgMi41ODkwOTcgMC4xNjA4MDYKK3YgMC4xNTEwNzggMi42MTQxNTkgMC4xNjA4MDYKK3YgMC4yNDE5OTQgMi42Njk1MjIgMC4xNjA4MDYKK3YgMC4yNDE5OTQgMi42ODAxNzMgMC4xNjA4MDYKK3YgMC4yNDE5OTQgMi42ODIxNDEgMC4xNTg4MzcKK3YgMC4yNDE5OTQgMi42ODIxNDEgMC4xNTYzMDEKK3YgMC4yNDE3OTkgMi4zNzAwNzcgMC4xNjA4MDYKK3YgMC4yNDE3OTkgLTIuMzQyNjY5IDAuMTYwODA2Cit2IDAuMjQxNzk5IC0yLjE4MjY3NSAwLjE2MDgwNgordiAwLjI0MTc5OSAtMi4yNTA3MTIgMC4xNjA4MDYKK3YgMC4yNDE3OTkgLTIuMjc5NjIwIDAuMTYwODA2Cit2IDAuMjQxNzk4IC0xLjA1NDQ2NyAwLjE2MDgwNgordiAwLjI0MTc5OSAyLjQyNzEwMCAwLjE2MDgwNgordiAwLjI0MTc5OSAyLjM5ODE5MiAwLjE2MDgwNgordiAwLjI0MTc5OCAwLjA3Mzc0MCAwLjE2MDgwNQordiAwLjI0MTc5OSAyLjMyNTM4OSAwLjE2MDgwNgordiAwLjI0MTc5OSAyLjQ5MDE0OSAwLjE2MDgwNgordiAwLjI0MTc5OSAtMi40NjY3NTUgMC4xNjA4MDYKK3YgMC4yNDE3OTkgLTIuNTIyMDQyIDAuMTYwODA2Cit2IDAuMjQxNzk5IC0yLjIyMjU5NyAwLjE2MDgwNgordiAwLjI0MTc5OSAtMi41MzI2OTMgMC4xNjA4MDYKK3YgMC4yNDE3OTkgLTIuNTM0NjYyIDAuMTU2MzAxCit2IDAuMjQxNzk5IC0yLjUzNDY2MiAwLjE1ODgzNwordiAwLjI0MTc5OSAxLjE5OTU2NSAwLjE2MDgwNgordiAwLjQ0MjM4MCAyLjU1NzgxNyAwLjE2MDgwNgordiAwLjE1MTA3OCAyLjU1Nzg3MyAwLjE2MDgwNgordiAwLjI4ODc5MiAyLjYwMDA3MiAwLjE2MDgwNgordiAwLjI0MjExMSAyLjYwMDA3MiAwLjE2MDgwNgordiAwLjIxMjU2NCAyLjU4NzYxMSAwLjE2MDgwNgordiAwLjIwMDI1MyAyLjU1Nzg0MSAwLjE2MDgwNgordiAwLjIxMjU0MiAyLjUyODA1NSAwLjE2MDgwNgordiAwLjI0MjEwMCAyLjUxNTU1NSAwLjE2MDgwNgordiAwLjI4ODc5MiAyLjUxNTU1NSAwLjE2MDgwNgordiAwLjMzMDA3OSAyLjUxNTU1NSAwLjE2MDgwNgordiAwLjM1OTg3MiAyLjUyNzkzMSAwLjE2MDgwNgordiAwLjM3MjAxNiAyLjU1NzgzMyAwLjE2MDgwNgordiAwLjM1OTc2MyAyLjU4NzU5NSAwLjE2MDgwNgordiAwLjMzMDI3NiAyLjYwMDA3MiAwLjE2MDgwNgordiAwLjI4ODc5MiAyLjU5NzcwMyAwLjE2MDgwNgordiAwLjI0MjcxNSAyLjU5NzcwMyAwLjE2MDgwNgordiAwLjIxNDA3OSAyLjU4NjEwOSAwLjE2MDgwNgordiAwLjIwMjM3OSAyLjU1Nzg0NCAwLjE2MDgwNgordiAwLjIxNDA1NiAyLjUyOTU1MiAwLjE2MDgwNgordiAwLjI0MjQ5OSAyLjUxNzUyNCAwLjE2MDgwNgordiAwLjI4ODc5MiAyLjUxNzUyNCAwLjE2MDgwNgordiAwLjMyOTY5MiAyLjUxNzUyNCAwLjE2MDgwNgordiAwLjM1ODM3MCAyLjUyOTQ0NCAwLjE2MDgwNgordiAwLjM3MDE3OSAyLjU1NzgyNSAwLjE2MDgwNgordiAwLjM1ODE3NSAyLjU4NjA2MSAwLjE2MDgwNgordiAwLjMyOTg4NyAyLjU5NzcwMyAwLjE2MDgwNgordiAwLjI0MjYwOCAyLjU1NzgzOSAwLjE2MDgwNgordiAwLjI4ODc5MiAyLjU1NzgzNCAwLjE2MDgwNgordiAwLjMyOTc5MCAyLjU1NzgyOSAwLjE2MDgwNgordiAtMC4xMDUzMzAgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMTE3NDEzIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjEyMzQ3NCAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4wOTkyNjkgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMDk5MjY5IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjEyMzQ3NSAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4xMTc0MTMgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMTA1MzMwIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjEyMzY0MiAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4wOTk0NDIgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMTIzNjQyIDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjA5OTQ0MiAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4xMjM0NzQgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMDk5MjY5IDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjA5OTI2OSAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4xMjM0NzUgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMTIzNjUzIDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjEzNTc5MCAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4xMzU3OTAgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMTIzNjUzIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjEwNTY5MyAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4xMTc3NTkgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMDk5NDU4IDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjA5OTQ1OCAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4wODczMzEgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMDg3MzMxIDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjA2OTAxOCAyLjc1NTY1NCAwLjE1NjYzNgordiAtMC4wODExMDEgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMDg3MTYzIDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjA2Mjk1NyAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4wNjI5NTcgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMDg3MTYzIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjA4MTEwMSAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4wNjkwMTggMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMDYzMTM0IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjA2MzEzNCAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4wODcxNjMgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMDYyOTU3IDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjA4NzE2MyAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4wNjI5NTcgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMDg3MzQxIDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjA4NzM0MSAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4wNjkzODEgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMDgxNDQ4IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjA2MzE0MiAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4wNjMxNDIgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMDUxMDE4IDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjA1MTAxOCAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4wMzI3MDYgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMDQ0Nzg5IDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjA1MDg1MSAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4wMjY2NDUgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMDI2NjQ1IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjA1MDg1MSAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4wNDQ3ODkgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMDMyNzA2IDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjAyNjgyMCAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4wMjY4MjAgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMDUwODUxIDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjAyNjY0NSAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4wNTA4NTEgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMDI2NjQ1IDIuNjgyMjUxIDAuMTU2NjM2Cit2IC0wLjA1MTAzMCAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4wNTEwMzAgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMDMzMDY5IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjA0NTEzNSAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4wMjY4MzIgMi43MzcwMDkgMC4xNTY2MzYKK3YgLTAuMDI2ODMyIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjAxNDcwMyAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4wMTQ3MjEgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wMDk1MDQgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wMjE2MjYgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wMDk0ODkgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wMDMyNjUgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMDA4ODI0IDIuNzI2NTEwIDAuMTU2NjM2Cit2IDAuMDA5NDg5IDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjAxNDcyMSAyLjcxNjAxMiAwLjE1NjYzNgordiAwLjAyMTYyNiAyLjcwNzYyMiAwLjE1NjYzNgordiAwLjAwOTUwNCAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4wMTQ3MDMgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wMDM2MDYgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMDA4NDc4IDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjAxNDUzOSAyLjc2NjE1MiAwLjE1NjYzNgordiAwLjAwOTY2NyAyLjc2NjE1MiAwLjE1NjYzNgordiAwLjAwOTY2NyAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4wMTQ1MzkgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMDA4NDc4IDIuNjk3MTI0IDAuMTU2NjM2Cit2IDAuMDAzNjA2IDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjAxNDUzOSAyLjc3MDc3OSAwLjE1NjYzNgordiAwLjAwOTY2NyAyLjc3MDc3OSAwLjE1NjYzNgordiAwLjAyMTc5NCAyLjc3MDc3OSAwLjE1NjYzNgordiAwLjAyMTc5NCAyLjc2NjE1MiAwLjE1NjYzNgordiAwLjAyMTc5NCAyLjY4NjYyNSAwLjE1NjYzNgordiAwLjAyMTc5NCAyLjY4MjI1MSAwLjE1NjYzNgordiAwLjAwOTY2NyAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4wMTQ1MzkgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4wMzk5MzkgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4wMjc4NTYgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4wNDYwMDAgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4wNDYwMDAgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4wMjc4NTYgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4wMzk5MzkgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4wNDU4MjYgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wNDU4MjYgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4wNDYwMDAgMi43NzA3NzkgMC4xNTY2MzYKK3YgMC4wNDYwMDAgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4wMjE2MTcgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wMjE2MTcgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4wMzk1NzYgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4wMjc1MTAgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4wNDU4MTIgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wNDU4MTIgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4wNTc5MzkgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4wNTc5MzkgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wNzYyNTEgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4wNjQxNjcgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4wNTgxMDYgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4wODIzMTIgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4wODIzMTIgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4wNTgxMDYgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4wNjQxNjcgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4wNzYyNTEgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4wODIxMzcgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4wODIxMzcgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4wNTgxMDYgMi43NzA3NzkgMC4xNTY2MzYKK3YgMC4wODIzMTIgMi43NzA3NzkgMC4xNTY2MzYKK3YgMC4wNTgxMDYgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4wODIzMTIgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4wNTc5MjcgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wNTc5MjcgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4wNzU4ODggMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4wNjM4MjEgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4wODIxMjQgMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wODIxMjQgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4wOTQyNTIgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4wOTQyNTIgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xMTI1NjMgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4xMDA0NzkgMi43NTU2NTQgMC4xNTY2MzYKK3YgMC4wOTQ0MTggMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xMTg2MjQgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xMTg2MjQgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4wOTQ0MTggMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4xMDA0NzkgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xMTI1NjMgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xMTg0NTAgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xMTg0NTAgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4wOTQ0MTggMi43NzA3NzkgMC4xNTY2MzYKK3YgMC4xMTg2MjQgMi43NzA3NzkgMC4xNTY2MzYKK3YgMC4wOTQ0MTggMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4xMTg2MjQgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4wOTQyMzggMi43MzcwMDkgMC4xNTY2MzYKK3YgMC4wOTQyMzggMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4xMTIyMDAgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xMDAxMzMgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xMTg0MzUgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4xMTg0MzUgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4xMzA1NzEgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4xMzA1NzEgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xNDg4NzQgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4xMzY3OTEgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4xMzA3MzAgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xNTQ5MzYgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xNTQ5MzUgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4xMzA3MzAgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4xMzY3OTEgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xNDg4NzQgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xNTQ3NjcgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xNTQ3NjcgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4xMzA3MzAgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4xNTQ5MzYgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4xMzA3MzAgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4xNTQ5MzUgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4xMzA1NDMgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4xMzA1NDMgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4xNDg1MTkgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xMzY0NDUgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xNTQ3NDkgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4xNTQ3NDkgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4xNjY4ODUgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4xNjY4ODUgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xODUxOTQgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4xNzMxMTEgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4xNjcwNTAgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4xNjcwNDkgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4xNzMxMTEgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xODUxOTQgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4xNjcwNTAgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4xNjcwNDkgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4xOTEyNTUgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4xNjY4NjggMi43MzcwMDggMC4xNTY2MzYKK3YgMC4xNjY4NjggMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4xODQ4MzEgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xNzI3NjUgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4xOTA4OTIgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4xOTA4OTIgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yMDMxOTQgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yMDMxOTQgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4yMjE1MDYgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yMDk0MjIgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yMDMzNjEgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4yMjc1NjcgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4yMjc1NjcgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yMDMzNjEgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yMDk0MjIgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yMjE1MDUgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yMjczOTYgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4yMjczOTYgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yMDMzNjEgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4yMjc1NjcgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4yMDMzNjEgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4yMjc1NjcgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4yMDMxODIgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4yMDMxODIgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yMjExNDMgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4yMDkwNzYgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4yMjczNzUgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4yMjczNzUgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yMzk1MDYgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yMzk1MDYgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4yNTg0ODUgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yNDY2OTUgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yMzk2NzMgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yMzk2NzMgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yNDY2OTUgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yNTg0ODUgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yMzk2NzMgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4yMzk2NzMgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4yNjQ1NDYgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4yMzk0OTQgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4yMzk0OTQgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yNTg0MTUgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4yNDYzNDkgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4yNjQ0NzcgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4yNjQ0NzcgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yNzY2NTEgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yNzY1OTkgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4zMDA4MTAgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4yOTQ3NDggMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4yODI2NjAgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4zMDA4MTAgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4yNzY1OTkgMi43MTYwMTIgMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi43MDc2MjIgMC4xNTY2MzYKK3YgMC4yNzY2NTEgMi43NDUxNTUgMC4xNTY2MzYKK3YgMC4yOTQ3OTYgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yODI3MTMgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4yNzY2NTEgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yNzY2NTEgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4yODI3MTMgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yOTQ3OTYgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4yNzY2NTEgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi43NzA3NzggMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi43NjYxNTIgMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi42ODY2MjUgMC4xNTY2MzYKK3YgMC4zMTI5ODUgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4zMDA4NTcgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4yNzY2NTIgMi42ODIyNTAgMC4xNTY2MzYKK3YgMC4zNTM0MzIgMi43NTU3MjQgMC4xNTY2MzYKK3YgMC4zNjc1OTkgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4zNTUwNTkgMi42OTcxMDEgMC4xNTY2MzYKK3YgMC4zMTkwNDYgMi42OTcxMjQgMC4xNTY2MzYKK3YgMC4zNTk0NjcgMi43NTc3MTUgMC4xNTY2MzYKK3YgMC4zNTkzMzUgMi42OTUyNjkgMC4xNTY2MzYKK3YgMC4zNzIxMTkgMi43MjY0OTAgMC4xNTY2MzYKK3YgMC4zMTkwNDYgMi43NTU2NTMgMC4xNTY2MzYKK3YgMC4zMTI5MzIgMi43MzcwMDggMC4xNTY2MzYKK3YgMC4zMTg5OTQgMi43MjY1MTAgMC4xNTY2MzYKK3YgMC4zMTI5MzIgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMTQyMDA0IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjEzNTc4MyAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4xMzU2MzAgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMTQxNjkxIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjE0MTY5MSAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4xMzU2MzAgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMTM1NzgzIDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjEzNTYzMCAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4xMzU2MzAgMi42ODIyNTEgMC4xNTY2MzYKK3YgMC4zMzUyMzkgMi43NTE5MDYgMC4xNTY2MzYKK3YgMC4zNDczNjYgMi43NTE5MDYgMC4xNTY2MzYKK3YgMC4zNTM0MjggMi43NDE0MDggMC4xNTY2MzYKK3YgMC4zNDczNjYgMi43MzA5MDkgMC4xNTY2MzYKK3YgMC4zMzUyMzkgMi43MzA5MDkgMC4xNTY2MzYKK3YgMC4zMjkxNzggMi43NDE0MDggMC4xNTY2MzYKK3YgMC4zMzUyMzkgMi43MjIyMjcgMC4xNTY2MzYKK3YgMC4zNDczNjYgMi43MjIyMjcgMC4xNTY2MzYKK3YgMC4zNTM0MjggMi43MTE3MjkgMC4xNTY2MzYKK3YgMC4zNDczNjYgMi43MDEyMzAgMC4xNTY2MzYKK3YgMC4zMzUyMzkgMi43MDEyMzAgMC4xNTY2MzYKK3YgMC4zMjkxNzggMi43MTE3MjkgMC4xNTY2MzYKK3YgMC4zMzA2NDIgMi43NzA4MDYgMC4xNTY2MzYKK3YgMC4zMzA2MzYgMi43NjYxNzQgMC4xNTY2MzYKK3YgMC4zMzA1NzEgMi42ODY3MDYgMC4xNTY2MzYKK3YgMC4zMzA1NzYgMi42ODIzMjMgMC4xNTY2MzYKK3YgMC4zNjEzMjkgMi43MTE4MDUgMC4xNTY2MzYKK3YgMC4zNjU3MjcgMi43MTA4NzkgMC4xNTY2MzYKK3YgMC4zNjEzOTUgMi43NDE0NzYgMC4xNTY2MzYKK3YgMC4zNjU3OTMgMi43NDI0NjIgMC4xNTY2MzYKK3YgLTAuMTA0NDU5IDIuNzU1NjU0IDAuMTU2MzAxCit2IC0wLjExODI5NCAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4xMjM5MTcgMi43NjUzOTQgMC4xNTYzMDEKK3YgLTAuMDk4ODM1IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjA5ODgzNSAyLjY4NzM4NyAwLjE1NjMwMQordiAtMC4xMjM5MTggMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMTE4Mjk0IDIuNjk3MTI0IDAuMTU2MzAxCit2IC0wLjEwNDQ1OSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4xMjQwNzMgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMDk4OTk2IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjEyNDA3MyAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4wOTg5OTYgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMTI0MDk2IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjEzNTM1NSAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4xMzUzNTUgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMTI0MDk2IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjEwNDgwOSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4xMTg2MjggMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuMDk5MDI0IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjA5OTAyNCAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4wODc3NjAgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMDg3NzYwIDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjA2ODE0NyAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4wODE5ODEgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMDg3NjA0IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjA2MjUyNCAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4wNjI1MjQgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMDg3NjA0IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjA4MTk4MSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4wNjgxNDcgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuMDYyNjg4IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjA2MjY4OCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4wODc3ODMgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMDg3NzgzIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjA2ODQ5NiAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4wODIzMTUgMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuMDYyNzA5IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjA2MjcwOSAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4wNTE0NDcgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMDUxNDQ3IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjAzMTgzNSAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4wNDU2NjkgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMDUxMjkyIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjAyNjIxMiAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4wMjYyMTIgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMDUxMjkyIDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjA0NTY2OSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4wMzE4MzUgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuMDI2Mzc0IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjAyNjM3NCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4wNTE0NzIgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMDUxNDcyIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjAzMjE4NSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4wNDYwMDMgMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuMDI2Mzk5IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjAyNjM5OSAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4wMTUxMzMgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMDE1MTYyIDIuNzM2MjUxIDAuMTU2MzAxCit2IDAuMDA5OTUwIDIuNzQ1OTE0IDAuMTU2MzAxCit2IDAuMDIxMTk2IDIuNzQ1OTE0IDAuMTU2MzAxCit2IDAuMDA5OTIzIDIuNzM2MjUxIDAuMTU2MzAxCit2IDAuMDA0MTQ5IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjAwOTY5MSAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjAwOTkyMyAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4wMTUxNjIgMi43MTY3NzEgMC4xNTYzMDEKK3YgMC4wMjExOTYgMi43MDY4NjUgMC4xNTYzMDEKK3YgMC4wMDk5NTAgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMDE1MTMzIDIuNzQ1OTE0IDAuMTU2MzAxCit2IDAuMDA0NDc4IDIuNzU1NjU0IDAuMTU2MzAxCit2IC0wLjAwOTM1NyAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4wMTQ5ODEgMi43NjUzOTQgMC4xNTYzMDEKK3YgMC4wMTAxMDEgMi43NjUzOTQgMC4xNTYzMDEKK3YgMC4wMTAxMDEgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMDE0OTgxIDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjAwOTM1NyAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjAwNDQ3OCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjAyMTM1MiAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjAyMTM1MiAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjA0MDgxMCAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjAyNjk3NiAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjA0NjQzMyAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjA0NjQzMyAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjAyNjk3NiAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjA0MDgxMCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjA0NjI3MSAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjA0NjI3MSAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjAyMTE3NSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjAyMTE3NSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjA0MDQ2MCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjAyNjY0MiAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjA0NjI0NSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjA0NjI0NSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjA1NzUwOSAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjA1NzUwOSAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjA3NzEyMiAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjA2MzI4OCAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjA1NzY2NCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjA4Mjc0NSAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjA4Mjc0NSAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjA1NzY2NCAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjA2MzI4OCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjA3NzEyMiAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjA4MjU4MyAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjA4MjU4MyAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjA1NzQ4NSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjA1NzQ4NSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjA3Njc3MiAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjA2Mjk1MyAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjA4MjU1OCAyLjczNjI1MSAwLjE1NjMwMQordiAwLjA4MjU1OCAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjA5MzgyMiAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjA5MzgyMiAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjExMzQzNCAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjA5OTU5OSAyLjc1NTY1NCAwLjE1NjMwMQordiAwLjA5Mzk3NiAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjExOTA1OCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjExOTA1OCAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjA5Mzk3NiAyLjY4NzM4NyAwLjE1NjMwMQordiAwLjA5OTU5OSAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjExMzQzNCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjExODg5NiAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjExODg5NiAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjA5Mzc5NiAyLjczNjI1MSAwLjE1NjMwMQordiAwLjA5Mzc5NiAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjExMzA4NCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjA5OTI2NSAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjExODg2OSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjExODg2OSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjEzMDE0MSAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjEzMDE0MSAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjE0OTc0NiAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjEzNTkxMiAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjEzMDI4OCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjE1NTM2OSAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjE1NTM2OSAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjEzMDI4OCAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjEzNTkxMiAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjE0OTc0NiAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjE1NTIxMiAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjE1NTIxMiAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjEzMDEwMSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjEzMDEwMSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjE0OTQwMyAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjEzNTU3NyAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjE1NTE4MyAyLjczNjI1MSAwLjE1NjMwMQordiAwLjE1NTE4MyAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjE2NjQ1NSAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjE2NjQ1NSAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjE4NjA2OCAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjE3MjIzMSAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjE2NjYwOCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjE5MTY5MSAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjE5MTY5MSAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjE2NjYwOCAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjE3MjIzMSAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjE4NjA2NyAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjE5MTY5MSAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjE5MTY5MSAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjE2NjQyNiAyLjczNjI1MSAwLjE1NjMwMQordiAwLjE2NjQyNiAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjE4NTcxMSAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjE3MTg5NyAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjE5MTMzNCAyLjczNjI1MSAwLjE1NjMwMQordiAwLjE5MTMzNCAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjIwMjc2NyAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjIwMjc2NyAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjIyMjM4OSAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjIwODU0NSAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjIwMjkyMSAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjIyODAxMiAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjIyODAxMiAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjIwMjkyMSAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjIwODU0NSAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjIyMjM4OCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjIyNzg1MyAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjIyNzg1MyAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjIwMjczNiAyLjczNjI1MSAwLjE1NjMwMQordiAwLjIwMjczNiAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjIyMjAzOSAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjIwODIwNCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjIyNzgyMSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjIyNzgyMSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjIzOTA4OCAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjIzOTA4OCAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjI1OTM2MCAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjI0NTc1OCAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjIzOTI0NCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjI2NDk4MyAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjI2NDk4MyAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjIzOTI0NCAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjI0NTc1NyAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjI1OTM2MCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjI2NDk4MyAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjI2NDk4MyAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjIzOTA2NCAyLjczNjI1MSAwLjE1NjMwMQordiAwLjIzOTA2NCAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjI1OTI5MSAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjI0NTQyMyAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjI2NDkxNSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjI2NDkxNSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjI3NjIxNCAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjI3NjE2MSAyLjczNjI1MSAwLjE1NjMwMQordiAwLjMwMTI5NiAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjMxMjU0NyAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjMwMTI0OCAyLjczNjI1MSAwLjE1NjMwMQordiAwLjI5NTYyNCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjI4MTc4NCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjMwMTI0OCAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjI3NjE2MSAyLjcxNjc3MSAwLjE1NjMwMQordiAwLjMxMjU0NyAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjMwMTI5NiAyLjcwNjg2NSAwLjE1NjMwMQordiAwLjI3NjIxNCAyLjc0NTkxNCAwLjE1NjMwMQordiAwLjI5NTY3MiAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjI4MTgzNyAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjI3NjIxNCAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjMwMTI5NiAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjMwMTI5NiAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjI3NjIxNCAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjI4MTgzNyAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjI5NTY3MiAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjMxMjU0NyAyLjc2NTM5NCAwLjE1NjMwMQordiAwLjMxMjU0NyAyLjY4NzM4NiAwLjE1NjMwMQordiAwLjMxODE3MCAyLjY5NzEyNCAwLjE1NjMwMQordiAwLjMxODE3MCAyLjc1NTY1MyAwLjE1NjMwMQordiAwLjMxMjQ5NCAyLjczNjI1MSAwLjE1NjMwMQordiAwLjMxODExOCAyLjcyNjUxMCAwLjE1NjMwMQordiAwLjMxMjQ5NCAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4xNDExMjEgMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuMTM1MzM2IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjEzNTE5NCAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4xNDA4MTggMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMTQwODE4IDIuNjk3MTI0IDAuMTU2MzAxCit2IC0wLjEzNTE5NCAyLjY4NzM4NyAwLjE1NjMwMQordiAtMC4xMzUzMzYgMi43NDU5MTQgMC4xNTYzMDEKK3YgMC4zMzU2NzcgMi43NTExNDcgMC4xNTYzMDEKK3YgMC4zNDY5MjggMi43NTExNDcgMC4xNTYzMDEKK3YgMC4zNTI1NTEgMi43NDE0MDggMC4xNTYzMDEKK3YgMC4zNDY5MjggMi43MzE2NjggMC4xNTYzMDEKK3YgMC4zMzU2NzcgMi43MzE2NjggMC4xNTYzMDEKK3YgMC4zMzAwNTQgMi43NDE0MDggMC4xNTYzMDEKK3YgMC4zMzU2NzcgMi43MjE0NzAgMC4xNTYzMDEKK3YgMC4zNDY5MjggMi43MjE0NzAgMC4xNTYzMDEKK3YgMC4zNTI1NTEgMi43MTE3MjkgMC4xNTYzMDEKK3YgMC4zNDY5MjggMi43MDE5OTAgMC4xNTYzMDEKK3YgMC4zMzU2NzcgMi43MDE5OTAgMC4xNTYzMDEKK3YgMC4zMzAwNTQgMi43MTE3MjkgMC4xNTYzMDEKK3YgLTAuMTg5MTYxIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjE5NTIyMiAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4xNzEwMTcgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMTc3MDc4IDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjE5NTIyMiAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4xODkxNjEgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMTc3MDc4IDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjE3MTAxNyAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4xNzA4NDkgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMTk1MDQ5IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjE5NTA0OSAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4xNzA4NDkgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMTk1MjIyIDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjE3MTAxNyAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4xNzEwMTcgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMTk1MjIyIDIuNjgyMjUxIDAuMTU2NjM2Cit2IC0wLjE4ODc5OCAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4xOTUwMzMgMi43MzcwMDkgMC4xNTY2MzYKK3YgLTAuMTcwODM4IDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjE3NjczMiAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4xOTUwMzMgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMTcwODM4IDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjIyNTQ3MyAyLjc1NTY1NCAwLjE1NjYzNgordiAtMC4yMzE1MzQgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMjA3MzI4IDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjIxMzM5MCAyLjc1NTY1NCAwLjE1NjYzNgordiAtMC4yMzE1MzQgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMjI1NDczIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjIxMzM5MCAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4yMDczMjggMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMjA3MTYwIDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjIzMTM1NyAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4yMzEzNTcgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMjA3MTYwIDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjIwNzMyOCAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4yMzE1MzQgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMjA3MzI4IDIuNjgyMjUxIDAuMTU2NjM2Cit2IC0wLjIzMTUzNCAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4yMjUxMTAgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMjMxMzQ5IDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjIwNzE1MCAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4yMTMwNDQgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMjMxMzQ5IDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjIwNzE1MCAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4yNjE3ODUgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMjY3ODQ2IDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjI0MzY0MCAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4yNDk3MDIgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMjY3ODQ2IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjI2MTc4NSAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4yNDk3MDIgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMjQzNjQwIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjI0MzQ3NCAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4yNjc2NzEgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMjY3NjcxIDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjI0MzQ3NCAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4yNDM2NDAgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMjY3ODQ2IDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjI0MzY0MCAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4yNjc4NDYgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMjYxNDIyIDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjI2NzY1OSAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4yNDM0NjEgMi43MzcwMDkgMC4xNTY2MzYKK3YgLTAuMjQ5MzU2IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjI2NzY1OSAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4yNDM0NjEgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMjc5NzcwIDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjI4NTY2NyAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4yOTc3NTYgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMzAzOTgwIDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjI3OTc3MCAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4zMDM5ODAgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMjk4MDk3IDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjMwNDE1OCAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4yNzk5NTIgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMjg2MDEzIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjMwNDE1OCAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4yOTgwOTcgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMjg2MDEzIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjI3OTk1MiAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4yNzk3ODggMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMzAzOTk1IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjMwMzk5NSAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4yNzk3ODggMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMjc5OTUyIDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjMxNjI4NSAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4zMTYyODUgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMzA0MTU4IDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjMwNDE1OCAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4zMTYyODUgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMzE2Mjg1IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjI3OTk1MiAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4zMzQ0MzAgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMzQwNDkxIDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjMyMjM0NyAyLjc1NTY1NCAwLjE1NjYzNgordiAtMC4zNDA0OTEgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuMzM0NDMwIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjMyMjM0NyAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4zMTYxMTcgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMzQwMzE3IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjM0MDMxNyAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4zMTYxMTcgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMzQwNDkxIDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjM0MDQ5MSAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4zMzQwNjcgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMzQwMzAzIDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjMxNjEwOCAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4zMjIwMDEgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuMzQwMzAzIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjMxNjEwOCAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4zNzA3NDIgMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMzc2ODAzIDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjM1MjU5NyAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4zNTg2NTggMi43NTU2NTQgMC4xNTY2MzYKK3YgLTAuMzc2ODAzIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjM3MDc0MiAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4zNTg2NTggMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMzUyNTk3IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjM1MjQzMCAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC4zNzY2MjggMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMzc2NjI4IDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjM1MjQzMCAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4zNTI1OTcgMi43NzA3NzkgMC4xNTY2MzYKK3YgLTAuMzc2ODAzIDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjM1MjU5NyAyLjY4MjI1MSAwLjE1NjYzNgordiAtMC4zNzY4MDMgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMzcwMzc5IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjM3NjYxNiAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4zNTI0MTggMi43MzcwMDkgMC4xNTY2MzYKK3YgLTAuMzU4MzEyIDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjM3NjYxNiAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC4zNTI0MTggMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuNDA3MDU0IDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjQxMzExNSAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC4zODg5MDkgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuMzk0OTcwIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjQxMzExNSAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC40MDcwNTQgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuMzk0OTcwIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjM4ODkwOSAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC4zODg3NDMgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuNDEyOTQxIDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjQxMjk0MSAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC4zODg3NDMgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMzg4OTA5IDIuNzcwNzc5IDAuMTU2NjM2Cit2IC0wLjQxMzExNSAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4zODg5MDkgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuNDEzMTE1IDIuNjgyMjUxIDAuMTU2NjM2Cit2IC0wLjQwNjY5MSAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC40MTI5MjYgMi43MzcwMDggMC4xNTY2MzYKK3YgLTAuMzg4NzI5IDIuNzM3MDA5IDAuMTU2NjM2Cit2IC0wLjM5NDYyNCAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC40MTI5MjYgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuMzg4NzI5IDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjQ0MzM2NiAyLjc1NTY1MyAwLjE1NjYzNgordiAtMC40NDk0MjcgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuNDI1MjIxIDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjQzMTI4MiAyLjc1NTY1MyAwLjE1NjYzNgordiAtMC40NDk0MjcgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuNDQzMzY1IDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjQzMTI4MiAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC40MjUyMjEgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuNDI1MDYyIDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjQ0OTI1OCAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC40NDkyNTggMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuNDI1MDYyIDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjQyNTIyMSAyLjc3MDc3OCAwLjE1NjYzNgordiAtMC40NDk0MjcgMi43NzA3NzggMC4xNTY2MzYKK3YgLTAuNDI1MjIxIDIuNjgyMjUwIDAuMTU2NjM2Cit2IC0wLjQ0OTQyNyAyLjY4MjI1MCAwLjE1NjYzNgordiAtMC40NDMwMTAgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuNDQ5MjQxIDIuNzM3MDA4IDAuMTU2NjM2Cit2IC0wLjQyNTAzNCAyLjczNzAwOCAwLjE1NjYzNgordiAtMC40MzA5MzYgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuNDQ5MjQxIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjQyNTAzNCAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC40Nzk2ODUgMi43NTU2NTMgMC4xNTY2MzYKK3YgLTAuNDg1NzQ2IDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjQ2MTU0MSAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC40Njc2MDIgMi43NTU2NTMgMC4xNTY2MzYKK3YgLTAuNDg1NzQ2IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjQ3OTY4NSAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC40Njc2MDIgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuNDYxNTQxIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjQ2MTM3NiAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC40ODU3NDYgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuNDg1NzQ2IDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjQ2MTM3NiAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC40NjE1NDEgMi43NzA3NzggMC4xNTY2MzYKK3YgLTAuNDg1NzQ2IDIuNzcwNzc4IDAuMTU2NjM2Cit2IC0wLjQ2MTU0MSAyLjY4MjI1MCAwLjE1NjYzNgordiAtMC40ODU3NDYgMi42ODIyNTAgMC4xNTY2MzYKK3YgLTAuNDc5MzIyIDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjQ4NTM4MyAyLjczNzAwOCAwLjE1NjYzNgordiAtMC40NjEzNTkgMi43MzcwMDggMC4xNTY2MzYKK3YgLTAuNDY3MjU2IDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjQ4NTM4MyAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC40NjEzNTkgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuNTE1OTk3IDIuNzU1NjUzIDAuMTU2NjM2Cit2IC0wLjUyMjA1OCAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC40OTc4NTIgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuNTAzOTEzIDIuNzU1NjUzIDAuMTU2NjM2Cit2IC0wLjUyMjA1OCAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC41MTU5OTcgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuNTAzOTEzIDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjQ5Nzg1MiAyLjY4NjYyNSAwLjE1NjYzNgordiAtMC40OTc2ODUgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuNTIxODg3IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjUyMTg4NyAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC40OTc2ODUgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuNDk3ODUyIDIuNzcwNzc4IDAuMTU2NjM2Cit2IC0wLjUyMjA1OCAyLjc3MDc3OCAwLjE1NjYzNgordiAtMC40OTc4NTIgMi42ODIyNTAgMC4xNTY2MzYKK3YgLTAuNTIyMDU4IDIuNjgyMjUwIDAuMTU2NjM2Cit2IC0wLjUxNTYzNCAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC41MjE4NjYgMi43MzcwMDggMC4xNTY2MzYKK3YgLTAuNDk3NjczIDIuNzM3MDA4IDAuMTU2NjM2Cit2IC0wLjUwMzU2NyAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC41MjE4NjYgMi43MTYwMTIgMC4xNTY2MzYKK3YgLTAuNDk3NjczIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjU1Mjk3NiAyLjc1NTY1MyAwLjE1NjYzNgordiAtMC41NTkwMzcgMi43NjYxNTIgMC4xNTY2MzYKK3YgLTAuNTM0MTY0IDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjU0MTE4NiAyLjc1NTY1MyAwLjE1NjYzNgordiAtMC41NTkwMzcgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuNTUyOTc2IDIuNjk3MTI0IDAuMTU2NjM2Cit2IC0wLjU0MTE4NiAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC41MzQxNjQgMi42ODY2MjUgMC4xNTY2MzYKK3YgLTAuNTMzOTk3IDIuNzQ1MTU1IDAuMTU2NjM2Cit2IC0wLjU1OTAzNyAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC41NTkwMzcgMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuNTMzOTk3IDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjUzNDE2NCAyLjc3MDc3OCAwLjE1NjYzNgordiAtMC41NTkwMzcgMi43NzA3NzggMC4xNTY2MzYKK3YgLTAuNTM0MTY0IDIuNjgyMjUwIDAuMTU2NjM2Cit2IC0wLjU1OTAzNyAyLjY4MjI1MCAwLjE1NjYzNgordiAtMC41NTI5MDYgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuNTU4OTY4IDIuNzM3MDA4IDAuMTU2NjM2Cit2IC0wLjUzMzk4NiAyLjczNzAwOCAwLjE1NjYzNgordiAtMC41NDA4NDAgMi43MjY1MTAgMC4xNTY2MzYKK3YgLTAuNTU4OTY4IDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjUzMzk4NiAyLjcxNjAxMiAwLjE1NjYzNgordiAtMC41NzEwOTAgMi43MzcwMDggMC4xNTY2MzYKK3YgLTAuNTc3MTUxIDIuNzI2NTEwIDAuMTU2NjM2Cit2IC0wLjU4OTIzOSAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC41OTUzMDEgMi43MzcwMDggMC4xNTY2MzUKK3YgLTAuNTcxMDkwIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjU5NTMwMSAyLjcxNjAxMiAwLjE1NjYzNQordiAtMC41ODkyODcgMi43NTU2NTMgMC4xNTY2MzYKK3YgLTAuNTk1MzQ5IDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjU3MTE0MiAyLjc2NjE1MiAwLjE1NjYzNgordiAtMC41NzcyMDQgMi43NTU2NTMgMC4xNTY2MzYKK3YgLTAuNTk1MzQ5IDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjU4OTI4NyAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC41NzcyMDQgMi42OTcxMjQgMC4xNTY2MzYKK3YgLTAuNTcxMTQyIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjU3MTE0MiAyLjc0NTE1NSAwLjE1NjYzNgordiAtMC41OTUzNDkgMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuNTk1MzQ5IDIuNzA3NjIyIDAuMTU2NjM2Cit2IC0wLjU3MTE0MiAyLjcwNzYyMiAwLjE1NjYzNgordiAtMC41NzExNDIgMi43NzA3NzggMC4xNTY2MzYKK3YgLTAuNjA3NDc2IDIuNzY2MTUyIDAuMTU2NjM1Cit2IC0wLjYwNzQ3NiAyLjc3MDc3OCAwLjE1NjYzNQordiAtMC41OTUzNDkgMi43NzA3NzggMC4xNTY2MzYKK3YgLTAuNTk1MzQ5IDIuNjgyMjUwIDAuMTU2NjM2Cit2IC0wLjYwNzQ3NiAyLjY4MjI1MCAwLjE1NjYzNQordiAtMC42MDc0NzYgMi42ODY2MjUgMC4xNTY2MzUKK3YgLTAuNTcxMTQzIDIuNjgyMjUwIDAuMTU2NjM2Cit2IC0wLjY1MDg1NyAyLjY5NzExNyAwLjE1NjYzNQordiAtMC42NDA3MDEgMi43MDEyMzAgMC4xNTY2MzUKK3YgLTAuNjI4NTc0IDIuNzAxMjMwIDAuMTU2NjM1Cit2IC0wLjYyNTkwOCAyLjY4NjYyOSAwLjE1NjYzNQordiAtMC42MjU3MjkgMi43NjYxNzQgMC4xNTY2MzUKK3YgLTAuNjI1NzM1IDIuNzcwODA2IDAuMTU2NjM1Cit2IC0wLjYyNTkxNCAyLjY4MjI0NyAwLjE1NjYzNQordiAtMC42NTQ1MzEgMi42OTUyODUgMC4xNTY2MzUKK3YgLTAuNjYxMDc3IDIuNzExMDUzIDAuMTU2NjM1Cit2IC0wLjY1NjY3OSAyLjcxMTk3OSAwLjE1NjYzNQordiAtMC42NjI5MDIgMi43MjY1MTAgMC4xNTY2MzUKK3YgLTAuNjY3NDIyIDIuNzI2NTA5IDAuMTU2NjM1Cit2IC0wLjY2MDk2NCAyLjc0MjQ2MiAwLjE1NjYzNQordiAtMC42NTY1NzIgMi43NDE0NzYgMC4xNTY2MzUKK3YgLTAuNjEzNTM4IDIuNzU1NjUzIDAuMTU2NjM1Cit2IC0wLjYyODU3NCAyLjc1MTkwNiAwLjE1NjYzNQordiAtMC4xNTg3MDggMi43NDUxNTUgMC4xNTY2MzYKK3YgLTAuMTUyODAwIDIuNzU1NjU0IDAuMTU2NjM2Cit2IC0wLjE1MjgwMCAyLjY5NzEyNCAwLjE1NjYzNgordiAtMC4xNTg3MDggMi43MDc2MjIgMC4xNTY2MzYKK3YgLTAuMTU4ODYxIDIuNzY2MTUyIDAuMTU2NjM2Cit2IC0wLjE1ODg2MSAyLjc3MDc3OSAwLjE1NjYzNgordiAtMC4xNTg4NjEgMi42ODIyNTEgMC4xNTY2MzYKK3YgLTAuMTU4ODYxIDIuNjg2NjI1IDAuMTU2NjM2Cit2IC0wLjYyMjUxMyAyLjc0MTQwOCAwLjE1NjYzNQordiAtMC42MDc0MjMgMi43MzcwMDggMC4xNTY2MzUKK3YgLTAuNjEzNDg1IDIuNzI2NTEwIDAuMTU2NjM1Cit2IC0wLjYyODU3NCAyLjczMDkwOSAwLjE1NjYzNQordiAtMC42MjI1MTMgMi43MTE3MjkgMC4xNTY2MzUKK3YgLTAuNjA3NDc2IDIuNzA3NjIyIDAuMTU2NjM1Cit2IC0wLjYxMzUzOCAyLjY5NzEyNCAwLjE1NjYzNQordiAtMC42MDc0MjMgMi43MTYwMTIgMC4xNTY2MzUKK3YgLTAuNjI4NTc0IDIuNzIyMjI3IDAuMTU2NjM1Cit2IC0wLjY0MDcwMSAyLjcyMjIyNyAwLjE1NjYzNQordiAtMC42NDA3MDEgMi43MzA5MDkgMC4xNTY2MzUKK3YgLTAuNjUwNDk0IDIuNzU1NzI0IDAuMTU2NjM1Cit2IC0wLjY1NDc3MCAyLjc1NzcxNSAwLjE1NjYzNQordiAtMC42MDc0NzYgMi43NDUxNTUgMC4xNTY2MzUKK3YgLTAuNjQwNzAxIDIuNzUxOTA2IDAuMTU2NjM1Cit2IC0wLjY0Njc2MyAyLjc0MTQwOCAwLjE1NjYzNQordiAtMC42NDY3NjMgMi43MTE3MjkgMC4xNTY2MzUKK3YgLTAuMTU4NzAxIDIuNzE2MDEyIDAuMTU2NjM2Cit2IC0wLjE1ODcwMSAyLjczNzAwOSAwLjE1NjYzNgordiAtMC4xNzA1NzQgMi43NjUzOTQgMC4xNTYzMDEKK3YgLTAuMTc2MTk3IDIuNzU1NjU0IDAuMTU2MzAxCit2IC0wLjE5MDAzMiAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4xOTU2NTYgMi43NjUzOTQgMC4xNTYzMDEKK3YgLTAuMTc2MTk3IDIuNjk3MTI0IDAuMTU2MzAxCit2IC0wLjE3MDU3NCAyLjY4NzM4NyAwLjE1NjMwMQordiAtMC4xOTU2NTYgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMTkwMDMyIDIuNjk3MTI0IDAuMTU2MzAxCit2IC0wLjE3MDQxOCAyLjc0NTkxNCAwLjE1NjMwMQordiAtMC4xOTU0OTUgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMTcwNDE4IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjE5NTQ5NSAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4xNTkxMzYgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMTcwMzk2IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjE3MDM5NiAyLjcxNjc3MSAwLjE1NjMwMQordiAtMC4xNTkxMzYgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMTc1ODYzIDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjE4OTY4MiAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4xOTU0NjcgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMTk1NDY3IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjIwNjczMSAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4yMDY3MzEgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMjA2ODg3IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjIxMjUxMCAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4yMjYzNDQgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMjMxOTY3IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjIxMjUxMCAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4yMDY4ODcgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMjMxOTY3IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjIyNjM0NCAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4yMzE4MDMgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMjMxODAzIDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjIwNjcwOCAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4yMDY3MDggMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMjEyMTc2IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjIyNTk5NSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4yMzE3ODIgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMjMxNzgyIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjI0MzA0NCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4yNDMwNDQgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMjQzMTk5IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjI0ODgyMiAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4yNjI2NTYgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMjY4MjgwIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjI0ODgyMiAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4yNDMxOTkgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMjY4MjgwIDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjI2MjY1NiAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4yNjgxMTcgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMjY4MTE3IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjI0MzAxOSAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4yNDMwMTkgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMjQ4NDg4IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjI2MjMwNyAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4yNjgwOTIgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMjY4MDkyIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjI3OTM1OCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4zMTU2ODcgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMzA0NDQxIDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjI5ODY0MCAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4zMDQ0MTQgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMjc5MzI5IDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjI4NDgwMCAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4zMDQ0MTQgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMjc5MzI5IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjMwNDQ0MSAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4zMTU2ODcgMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuMjc5MzU4IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjI3OTUxMCAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4yODUxMzQgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMjk4OTY5IDIuNzU1NjU0IDAuMTU2MzAxCit2IC0wLjMwNDU5MiAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4yODUxMzQgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuMjc5NTEwIDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjMwNDU5MiAyLjY4NzM4NyAwLjE1NjMwMQordiAtMC4yOTg5NjkgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuMzE1ODQzIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjMxNTg0MyAyLjY4NzM4NyAwLjE1NjMwMQordiAtMC4zMjE0NjcgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMzM1MzAxIDIuNzU1NjU0IDAuMTU2MzAxCit2IC0wLjM0MDkyNCAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC4zMjE0NjcgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuMzQwOTI0IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjMzNTMwMSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4zNDA3NjMgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMzQwNzYzIDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjMxNTY2NiAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4zMTU2NjYgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMzIxMTMzIDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjMzNDk1MiAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4zNDA3MzYgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMzQwNzM2IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjM1MjAwMCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4zNTIwMDAgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMzUyMTU2IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjM1Nzc3OSAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4zNzE2MTMgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuMzc3MjM2IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjM1Nzc3OSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4zNTIxNTUgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuMzc3MjM2IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjM3MTYxMyAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4zNzcwNzQgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMzc3MDc0IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjM1MTk3NiAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4zNTE5NzYgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMzU3NDQ1IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjM3MTI2MyAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC4zNzcwNDkgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuMzc3MDQ5IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjM4ODMxNCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC4zODgzMTQgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuMzg4NDY3IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjM5NDA5MSAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC40MDc5MjUgMi43NTU2NTQgMC4xNTYzMDEKK3YgLTAuNDEzNTQ5IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjM5NDA5MSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4zODg0NjcgMi42ODczODcgMC4xNTYzMDEKK3YgLTAuNDEzNTQ5IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjQwNzkyNSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40MTMzODcgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDEzMzg3IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjM4ODI4NyAyLjczNjI1MSAwLjE1NjMwMQordiAtMC4zODgyODcgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuMzkzNzU2IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjQwNzU3NSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC40MTMzNjAgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNDEzMzYwIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjQyNDYzMiAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC40MjQ2MzIgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDI0Nzc5IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjQzMDQwMyAyLjc1NTY1MyAwLjE1NjMwMQordiAtMC40NDQyMzcgMi43NTU2NTMgMC4xNTYzMDEKK3YgLTAuNDQ5ODYwIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjQzMDQwMyAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40MjQ3NzkgMi42ODczODYgMC4xNTYzMDEKK3YgLTAuNDQ5ODYwIDIuNjg3Mzg2IDAuMTU2MzAxCit2IC0wLjQ0NDIzNyAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40NDk3MDMgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDQ5NzAzIDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjQyNDU5MyAyLjczNjI1MSAwLjE1NjMwMQordiAtMC40MjQ1OTMgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuNDMwMDY4IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjQ0Mzg5NCAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC40NDk2NzQgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNDQ5Njc0IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjQ2MDk0NiAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC40NjA5NDYgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDYxMDk5IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjQ2NjcyMiAyLjc1NTY1MyAwLjE1NjMwMQordiAtMC40ODA1NTkgMi43NTU2NTMgMC4xNTYzMDEKK3YgLTAuNDg2MTgyIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjQ2NjcyMiAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40NjEwOTkgMi42ODczODYgMC4xNTYzMDEKK3YgLTAuNDg2MTgyIDIuNjg3Mzg2IDAuMTU2MzAxCit2IC0wLjQ4MDU1OSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40ODYxODIgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDg2MTgyIDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjQ2MDkxNyAyLjczNjI1MSAwLjE1NjMwMQordiAtMC40NjA5MTcgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuNDY2Mzg4IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjQ4MDIwMiAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC40ODU4MjYgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNDg1ODI2IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjQ5NzI1OCAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC40OTcyNTggMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNDk3NDEzIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjUwMzAzNiAyLjc1NTY1MyAwLjE1NjMwMQordiAtMC41MTY4ODAgMi43NTU2NTMgMC4xNTYzMDEKK3YgLTAuNTIyNTAzIDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjUwMzAzNiAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC40OTc0MTIgMi42ODczODYgMC4xNTYzMDEKK3YgLTAuNTIyNTAzIDIuNjg3Mzg2IDAuMTU2MzAxCit2IC0wLjUxNjg4MCAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC41MjIzNDQgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNTIyMzQ0IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjQ5NzIyNyAyLjczNjI1MSAwLjE1NjMwMQordiAtMC40OTcyMjcgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuNTAyNjk1IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjUxNjUzMCAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC41MjIzMTIgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNTIyMzEyIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjUzMzU3OSAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC41MzM1NzkgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNTMzNzM1IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjU0MDI0OSAyLjc1NTY1MyAwLjE1NjMwMQordiAtMC41NTM4NTEgMi43NTU2NTMgMC4xNTYzMDEKK3YgLTAuNTU5NDc0IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjU0MDI0OSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC41MzM3MzUgMi42ODczODYgMC4xNTYzMDEKK3YgLTAuNTU5NDc0IDIuNjg3Mzg2IDAuMTU2MzAxCit2IC0wLjU1Mzg1MSAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC41NTk0NzQgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNTU5NDc0IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjUzMzU1NiAyLjczNjI1MSAwLjE1NjMwMQordiAtMC41MzM1NTYgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuNTM5OTE0IDIuNzI2NTEwIDAuMTU2MzAxCit2IC0wLjU1Mzc4MiAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC41NTk0MDYgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNTU5NDA2IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjU3MDcwNSAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC42MDcwMzggMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNTk1Nzg3IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjU5MDExNSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC41OTU3MzkgMi43MzYyNTEgMC4xNTYzMDEKK3YgLTAuNTcwNjUyIDIuNzM2MjUxIDAuMTU2MzAxCit2IC0wLjU3NjI3NSAyLjcyNjUxMCAwLjE1NjMwMQordiAtMC41OTU3MzkgMi43MTY3NzEgMC4xNTYzMDEKK3YgLTAuNTcwNjUyIDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjU5NTc4NyAyLjcwNjg2NSAwLjE1NjMwMQordiAtMC42MDcwMzggMi43MDY4NjUgMC4xNTYzMDEKK3YgLTAuNTcwNzA1IDIuNzQ1OTE0IDAuMTU2MzAxCit2IC0wLjU3MDcwNSAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC41NzYzMjkgMi43NTU2NTMgMC4xNTYzMDEKK3YgLTAuNTkwMTY0IDIuNzU1NjUzIDAuMTU2MzAxCit2IC0wLjU5NTc4NyAyLjc2NTM5NCAwLjE1NjMwMQordiAtMC41NzYzMjkgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuNTcwNzA1IDIuNjg3Mzg2IDAuMTU2MzAxCit2IC0wLjU5NTc4NyAyLjY4NzM4NiAwLjE1NjMwMQordiAtMC41OTAxNjMgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuNjA3MDM4IDIuNzY1Mzk0IDAuMTU2MzAxCit2IC0wLjYwNzAzOCAyLjY4NzM4NiAwLjE1NjMwMQordiAtMC42MTI2NjIgMi42OTcxMjQgMC4xNTYzMDEKK3YgLTAuNjEyNjYyIDIuNzU1NjUzIDAuMTU2MzAxCit2IC0wLjYwNjk4NSAyLjczNjI1MSAwLjE1NjMwMQordiAtMC42MTI2MDkgMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuNjA2OTg1IDIuNzE2NzcxIDAuMTU2MzAxCit2IC0wLjE1MjQ4NyAyLjcyNjUxMCAwLjE1NjYzNgordiAtMC4xNTMzNzAgMi43MjY1MTAgMC4xNTYzMDEKK3YgLTAuMTU5MTU1IDIuNzA2ODY1IDAuMTU2MzAxCit2IC0wLjE1MzY3MyAyLjc1NTY1NCAwLjE1NjMwMQordiAtMC4xNTkyOTcgMi43NjUzOTQgMC4xNTYzMDEKK3YgLTAuMTU5Mjk3IDIuNjg3Mzg3IDAuMTU2MzAxCit2IC0wLjE1MzY3MyAyLjY5NzEyNCAwLjE1NjMwMQordiAtMC4xNTkxNTUgMi43NDU5MTQgMC4xNTYzMDEKK3YgLTAuNjI5MDEyIDIuNzUxMTQ3IDAuMTU2MzAxCit2IC0wLjY0MDI2MyAyLjc1MTE0NyAwLjE1NjMwMQordiAtMC42NDU4ODYgMi43NDE0MDggMC4xNTYzMDEKK3YgLTAuNjQwMjYzIDIuNzMxNjY4IDAuMTU2MzAxCit2IC0wLjYyOTAxMiAyLjczMTY2OCAwLjE1NjMwMQordiAtMC42MjMzODggMi43NDE0MDggMC4xNTYzMDEKK3YgLTAuNjI5MDEyIDIuNzIxNDcwIDAuMTU2MzAxCit2IC0wLjY0MDI2MyAyLjcyMTQ3MCAwLjE1NjMwMQordiAtMC42NDU4ODYgMi43MTE3MjkgMC4xNTYzMDEKK3YgLTAuNjQwMjYzIDIuNzAxOTkwIDAuMTU2MzAxCit2IC0wLjYyOTAxMiAyLjcwMTk5MCAwLjE1NjMwMQordiAtMC42MjMzODggMi43MTE3MjkgMC4xNTYzMDEKK3YgLTAuMTA1MzMwIC0yLjU0OTkwMSAwLjE1NjYzNgordiAtMC4xMTc0MTQgLTIuNTQ5OTAxIDAuMTU2NjM2Cit2IC0wLjEyMzQ3NSAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgLTAuMDk5MjY5IC0yLjUzOTQwMyAwLjE1NjYzNgordiAtMC4wOTkyNjkgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IC0wLjEyMzQ3NSAtMi42MTg5MzAgMC4xNTY2MzYKK3YgLTAuMTE3NDE0IC0yLjYwODQzMiAwLjE1NjYzNgordiAtMC4xMDUzMzAgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IC0wLjEyMzY0MiAtMi41NjA0MDAgMC4xNTY2MzYKK3YgLTAuMDk5NDQyIC0yLjU2MDQwMCAwLjE1NjYzNgordiAtMC4xMjM2NDIgLTIuNTk3OTMzIDAuMTU2NjM2Cit2IC0wLjA5OTQ0MiAtMi41OTc5MzMgMC4xNTY2MzYKK3YgLTAuMTIzNDc1IC0yLjUzNDc3NyAwLjE1NjYzNgordiAtMC4wOTkyNjkgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IC0wLjA5OTI2OSAtMi42MjMzMDUgMC4xNTY2MzYKK3YgLTAuMTIzNDc1IC0yLjYyMzMwNSAwLjE1NjYzNgordiAtMC4xMjM2NTQgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IC0wLjEzNTc5MCAtMi41Njg1NDcgMC4xNTY2MzYKK3YgLTAuMTM1NzkxIC0yLjU4OTU0NCAwLjE1NjYzNgordiAtMC4xMjM2NTQgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IC0wLjEwNTY5MyAtMi41NzkwNDUgMC4xNTY2MzYKK3YgLTAuMTE3NzYwIC0yLjU3OTA0NSAwLjE1NjYzNgordiAtMC4wOTk0NTkgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IC0wLjA5OTQ1OSAtMi41ODk1NDQgMC4xNTY2MzYKK3YgLTAuMDg3MzMxIC0yLjU5NzkzMyAwLjE1NjYzNgordiAtMC4wODczMzEgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IC0wLjA2OTAxOSAtMi41NDk5MDEgMC4xNTY2MzYKK3YgLTAuMDgxMTAyIC0yLjU0OTkwMSAwLjE1NjYzNgordiAtMC4wODcxNjMgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IC0wLjA2Mjk1OCAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgLTAuMDYyOTU4IC0yLjYxODkzMCAwLjE1NjYzNgordiAtMC4wODcxNjMgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IC0wLjA4MTEwMiAtMi42MDg0MzIgMC4xNTY2MzYKK3YgLTAuMDY5MDE5IC0yLjYwODQzMiAwLjE1NjYzNgordiAtMC4wNjMxMzUgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IC0wLjA2MzEzNSAtMi41OTc5MzMgMC4xNTY2MzYKK3YgLTAuMDg3MTYzIC0yLjUzNDc3NyAwLjE1NjYzNgordiAtMC4wNjI5NTggLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IC0wLjA4NzE2MyAtMi42MjMzMDUgMC4xNTY2MzYKK3YgLTAuMDYyOTU4IC0yLjYyMzMwNSAwLjE1NjYzNgordiAtMC4wODczNDEgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IC0wLjA4NzM0MSAtMi41ODk1NDQgMC4xNTY2MzYKK3YgLTAuMDY5MzgxIC0yLjU3OTA0NSAwLjE1NjYzNgordiAtMC4wODE0NDggLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IC0wLjA2MzE0MyAtMi41Njg1NDcgMC4xNTY2MzYKK3YgLTAuMDYzMTQzIC0yLjU4OTU0NCAwLjE1NjYzNgordiAtMC4wNTEwMTggLTIuNTk3OTMzIDAuMTU2NjM2Cit2IC0wLjA1MTAxOCAtMi41NjA0MDAgMC4xNTY2MzYKK3YgLTAuMDMyNzA3IC0yLjU0OTkwMSAwLjE1NjYzNgordiAtMC4wNDQ3OTAgLTIuNTQ5OTAxIDAuMTU2NjM2Cit2IC0wLjA1MDg1MSAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgLTAuMDI2NjQ1IC0yLjUzOTQwMyAwLjE1NjYzNgordiAtMC4wMjY2NDUgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IC0wLjA1MDg1MSAtMi42MTg5MzAgMC4xNTY2MzYKK3YgLTAuMDQ0NzkwIC0yLjYwODQzMiAwLjE1NjYzNgordiAtMC4wMzI3MDcgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IC0wLjAyNjgyMSAtMi41NjA0MDAgMC4xNTY2MzYKK3YgLTAuMDI2ODIxIC0yLjU5NzkzMyAwLjE1NjYzNgordiAtMC4wNTA4NTEgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IC0wLjAyNjY0NSAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgLTAuMDUwODUxIC0yLjYyMzMwNSAwLjE1NjYzNgordiAtMC4wMjY2NDUgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IC0wLjA1MTAzMCAtMi41Njg1NDcgMC4xNTY2MzYKK3YgLTAuMDUxMDMwIC0yLjU4OTU0NCAwLjE1NjYzNgordiAtMC4wMzMwNjkgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IC0wLjA0NTEzNiAtMi41NzkwNDUgMC4xNTY2MzYKK3YgLTAuMDI2ODMzIC0yLjU2ODU0NyAwLjE1NjYzNgordiAtMC4wMjY4MzMgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IC0wLjAxNDcwNCAtMi41OTc5MzMgMC4xNTY2MzYKK3YgLTAuMDE0NzIxIC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjAwOTUwMyAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4wMjE2MjUgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IDAuMDA5NDg5IC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjAwMzI2NCAtMi41NzkwNDUgMC4xNTY2MzYKK3YgLTAuMDA4ODI0IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjAwOTQ4OCAtMi41ODk1NDQgMC4xNTY2MzYKK3YgLTAuMDE0NzIxIC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjAyMTYyNSAtMi41OTc5MzMgMC4xNTY2MzYKK3YgMC4wMDk1MDMgLTIuNTk3OTMzIDAuMTU2NjM2Cit2IC0wLjAxNDcwNCAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4wMDM2MDUgLTIuNTQ5OTAxIDAuMTU2NjM2Cit2IC0wLjAwODQ3OCAtMi41NDk5MDEgMC4xNTY2MzYKK3YgLTAuMDE0NTQwIC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjAwOTY2NiAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4wMDk2NjYgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IC0wLjAxNDU0MCAtMi42MTg5MzAgMC4xNTY2MzYKK3YgLTAuMDA4NDc4IC0yLjYwODQzMiAwLjE1NjYzNgordiAwLjAwMzYwNSAtMi42MDg0MzIgMC4xNTY2MzYKK3YgLTAuMDE0NTQwIC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjAwOTY2NiAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4wMjE3OTQgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMDIxNzk0IC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjAyMTc5NCAtMi42MTg5MzAgMC4xNTY2MzYKK3YgMC4wMjE3OTQgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMDA5NjY2IC0yLjYyMzMwNSAwLjE1NjYzNgordiAtMC4wMTQ1NDAgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMDM5OTM4IC0yLjU0OTkwMSAwLjE1NjYzNgordiAwLjAyNzg1NSAtMi41NDk5MDEgMC4xNTY2MzYKK3YgMC4wNDYwMDAgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IDAuMDQ2MDAwIC0yLjYxODkzMCAwLjE1NjYzNgordiAwLjAyNzg1NSAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4wMzk5MzggLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMDQ1ODI1IC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjA0NTgyNSAtMi41OTc5MzMgMC4xNTY2MzYKK3YgMC4wNDYwMDAgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMDQ2MDAwIC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjAyMTYxNyAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4wMjE2MTYgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMDM5NTc2IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjAyNzUwOSAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4wNDU4MTEgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMDQ1ODExIC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjA1NzkzOCAtMi41OTc5MzMgMC4xNTY2MzYKK3YgMC4wNTc5MzggLTIuNTYwNDAwIDAuMTU2NjM2Cit2IDAuMDc2MjUwIC0yLjU0OTkwMSAwLjE1NjYzNgordiAwLjA2NDE2NyAtMi41NDk5MDEgMC4xNTY2MzYKK3YgMC4wNTgxMDUgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IDAuMDgyMzExIC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjA4MjMxMSAtMi42MTg5MzAgMC4xNTY2MzYKK3YgMC4wNTgxMDUgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IDAuMDY0MTY3IC0yLjYwODQzMiAwLjE1NjYzNgordiAwLjA3NjI1MCAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4wODIxMzcgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IDAuMDgyMTM2IC0yLjU5NzkzMyAwLjE1NjYzNgordiAwLjA1ODEwNSAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4wODIzMTEgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMDU4MTA1IC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjA4MjMxMSAtMi42MjMzMDUgMC4xNTY2MzYKK3YgMC4wNTc5MjYgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMDU3OTI2IC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjA3NTg4OCAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4wNjM4MjEgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IDAuMDgyMTI0IC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjA4MjEyNCAtMi41ODk1NDQgMC4xNTY2MzYKK3YgMC4wOTQyNTIgLTIuNTk3OTMzIDAuMTU2NjM2Cit2IDAuMDk0MjUyIC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjExMjU2MiAtMi41NDk5MDEgMC4xNTY2MzYKK3YgMC4xMDA0NzkgLTIuNTQ5OTAxIDAuMTU2NjM2Cit2IDAuMDk0NDE3IC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjExODYyNCAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4xMTg2MjQgLTIuNjE4OTMwIDAuMTU2NjM2Cit2IDAuMDk0NDE3IC0yLjYxODkzMCAwLjE1NjYzNgordiAwLjEwMDQ3OSAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4xMTI1NjIgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMTE4NDUwIC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjExODQ1MCAtMi41OTc5MzMgMC4xNTY2MzYKK3YgMC4wOTQ0MTggLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMTE4NjI0IC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjA5NDQxNyAtMi42MjMzMDUgMC4xNTY2MzYKK3YgMC4xMTg2MjQgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMDk0MjM3IC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjA5NDIzNyAtMi41ODk1NDQgMC4xNTY2MzYKK3YgMC4xMTIyMDAgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IDAuMTAwMTMzIC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjExODQzNCAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4xMTg0MzQgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMTMwNTcwIC0yLjU5NzkzNCAwLjE1NjYzNgordiAwLjEzMDU3MCAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4xNDg4NzQgLTIuNTQ5OTAyIDAuMTU2NjM2Cit2IDAuMTM2NzkxIC0yLjU0OTkwMiAwLjE1NjYzNgordiAwLjEzMDcyOSAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4xNTQ5MzUgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IDAuMTU0OTM1IC0yLjYxODkzMSAwLjE1NjYzNgordiAwLjEzMDcyOSAtMi42MTg5MzEgMC4xNTY2MzYKK3YgMC4xMzY3OTEgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMTQ4ODc0IC0yLjYwODQzMiAwLjE1NjYzNgordiAwLjE1NDc2NiAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4xNTQ3NjYgLTIuNTk3OTM0IDAuMTU2NjM2Cit2IDAuMTMwNzI5IC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjE1NDkzNSAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4xMzA3MjkgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMTU0OTM1IC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjEzMDU0MiAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4xMzA1NDIgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMTQ4NTE5IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjEzNjQ0NCAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4xNTQ3NDkgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMTU0NzQ5IC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjE2Njg4NSAtMi41OTc5MzQgMC4xNTY2MzYKK3YgMC4xNjY4ODUgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IDAuMTg1MTk0IC0yLjU0OTkwMiAwLjE1NjYzNgordiAwLjE3MzExMCAtMi41NDk5MDIgMC4xNTY2MzYKK3YgMC4xNjcwNDkgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IDAuMTkxMjU1IC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjE5MTI1NSAtMi42MTg5MzEgMC4xNTY2MzYKK3YgMC4xNjcwNDkgLTIuNjE4OTMxIDAuMTU2NjM2Cit2IDAuMTczMTEwIC0yLjYwODQzMiAwLjE1NjYzNgordiAwLjE4NTE5NCAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4xOTEyNTUgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IDAuMTkxMjU1IC0yLjU5NzkzNCAwLjE1NjYzNgordiAwLjE2NzA0OSAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4xOTEyNTUgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMTY3MDQ5IC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjE5MTI1NSAtMi42MjMzMDUgMC4xNTY2MzYKK3YgMC4xNjY4NjcgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMTY2ODY3IC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjE4NDgzMSAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4xNzI3NjQgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IDAuMTkwODkyIC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjE5MDg5MiAtMi41ODk1NDQgMC4xNTY2MzYKK3YgMC4yMDMxOTQgLTIuNTk3OTM0IDAuMTU2NjM2Cit2IDAuMjAzMTk0IC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjIyMTUwNSAtMi41NDk5MDIgMC4xNTY2MzYKK3YgMC4yMDk0MjIgLTIuNTQ5OTAyIDAuMTU2NjM2Cit2IDAuMjAzMzYwIC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjIyNzU2NiAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4yMjc1NjYgLTIuNjE4OTMxIDAuMTU2NjM2Cit2IDAuMjAzMzYwIC0yLjYxODkzMSAwLjE1NjYzNgordiAwLjIwOTQyMiAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4yMjE1MDUgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMjI3Mzk1IC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjIyNzM5NSAtMi41OTc5MzQgMC4xNTY2MzYKK3YgMC4yMDMzNjAgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMjI3NTY2IC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjIwMzM2MSAtMi42MjMzMDUgMC4xNTY2MzYKK3YgMC4yMjc1NjYgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMjAzMTgxIC0yLjU2ODU0NyAwLjE1NjYzNgordiAwLjIwMzE4MSAtMi41ODk1NDQgMC4xNTY2MzYKK3YgMC4yMjExNDMgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IDAuMjA5MDc2IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjIyNzM3NSAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4yMjczNzUgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMjM5NTA1IC0yLjU5NzkzNCAwLjE1NjYzNgordiAwLjIzOTUwNSAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4yNTg0ODQgLTIuNTQ5OTAyIDAuMTU2NjM2Cit2IDAuMjQ2Njk0IC0yLjU0OTkwMiAwLjE1NjYzNgordiAwLjIzOTY3MyAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4yNjQ1NDUgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IDAuMjY0NTQ1IC0yLjYxODkzMSAwLjE1NjYzNgordiAwLjIzOTY3MyAtMi42MTg5MzEgMC4xNTY2MzYKK3YgMC4yNDY2OTQgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMjU4NDg0IC0yLjYwODQzMiAwLjE1NjYzNgordiAwLjI2NDU0NSAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4yNjQ1NDUgLTIuNTk3OTM0IDAuMTU2NjM2Cit2IDAuMjM5NjczIC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjI2NDU0NSAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4yMzk2NzMgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMjY0NTQ1IC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjIzOTQ5NCAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4yMzk0OTQgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMjU4NDE1IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjI0NjM0OCAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4yNjQ0NzYgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMjY0NDc2IC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjI3NjY1MSAtMi41OTc5MzQgMC4xNTY2MzYKK3YgMC4yNzY1OTkgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMzAwODU3IC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjMxMjk4NCAtMi41NjA0MDAgMC4xNTY2MzYKK3YgMC4zMDA4MDkgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IDAuMjk0NzQ4IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjI4MjY2MCAtMi41NzkwNDUgMC4xNTY2MzYKK3YgMC4zMDA4MDkgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IDAuMjc2NTk5IC0yLjU4OTU0NCAwLjE1NjYzNgordiAwLjMxMjk4NCAtMi41OTc5MzQgMC4xNTY2MzYKK3YgMC4zMDA4NTcgLTIuNTk3OTM0IDAuMTU2NjM2Cit2IDAuMjc2NjUxIC0yLjU2MDQwMCAwLjE1NjYzNgordiAwLjI5NDc5NiAtMi41NDk5MDIgMC4xNTY2MzYKK3YgMC4yODI3MTIgLTIuNTQ5OTAyIDAuMTU2NjM2Cit2IDAuMjc2NjUxIC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjMwMDg1NyAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgMC4zMDA4NTcgLTIuNjE4OTMxIDAuMTU2NjM2Cit2IDAuMjc2NjUxIC0yLjYxODkzMSAwLjE1NjYzNgordiAwLjI4MjcxMiAtMi42MDg0MzIgMC4xNTY2MzYKK3YgMC4yOTQ3OTYgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMjc2NjUxIC0yLjUzNDc3NyAwLjE1NjYzNgordiAwLjMwMDg1NyAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgMC4zMTI5ODQgLTIuNTM0Nzc3IDAuMTU2NjM2Cit2IDAuMzEyOTg0IC0yLjUzOTQwMyAwLjE1NjYzNgordiAwLjMxMjk4NCAtMi42MTg5MzEgMC4xNTY2MzYKK3YgMC4zMTI5ODQgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IDAuMzAwODU3IC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjI3NjY1MSAtMi42MjMzMDUgMC4xNTY2MzYKK3YgMC4zNTM0MzIgLTIuNTQ5ODMxIDAuMTU2NjM2Cit2IDAuMzY3NTk5IC0yLjU3OTA0NSAwLjE1NjYzNgordiAwLjM1NTA1OCAtMi42MDg0NTUgMC4xNTY2MzYKK3YgMC4zMTkwNDYgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IDAuMzU5NDY2IC0yLjU0Nzg0MCAwLjE1NjYzNgordiAwLjM1OTMzNSAtMi42MTAyODYgMC4xNTY2MzYKK3YgMC4zNzIxMTkgLTIuNTc5MDY1IDAuMTU2NjM2Cit2IDAuMzE5MDQ2IC0yLjU0OTkwMiAwLjE1NjYzNgordiAwLjMxMjkzMiAtMi41Njg1NDcgMC4xNTY2MzYKK3YgMC4zMTg5OTMgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IDAuMzEyOTMyIC0yLjU4OTU0NCAwLjE1NjYzNgordiAtMC4xNDIwMDUgLTIuNTc5MDQ1IDAuMTU2NjM2Cit2IC0wLjEzNTc4MyAtMi41OTc5MzMgMC4xNTY2MzYKK3YgLTAuMTM1NjMwIC0yLjUzOTQwMyAwLjE1NjYzNgordiAtMC4xNDE2OTIgLTIuNTQ5OTAxIDAuMTU2NjM2Cit2IC0wLjE0MTY5MiAtMi42MDg0MzIgMC4xNTY2MzYKK3YgLTAuMTM1NjMwIC0yLjYxODkzMCAwLjE1NjYzNgordiAtMC4xMzU3ODMgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IC0wLjEzNTYzMCAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgLTAuMTM1NjMwIC0yLjYyMzMwNSAwLjE1NjYzNgordiAwLjMzNTIzOSAtMi41NTM2NDkgMC4xNTY2MzYKK3YgMC4zNDczNjYgLTIuNTUzNjQ5IDAuMTU2NjM2Cit2IDAuMzUzNDI3IC0yLjU2NDE0NyAwLjE1NjYzNgordiAwLjM0NzM2NiAtMi41NzQ2NDYgMC4xNTY2MzYKK3YgMC4zMzUyMzkgLTIuNTc0NjQ2IDAuMTU2NjM2Cit2IDAuMzI5MTc3IC0yLjU2NDE0NyAwLjE1NjYzNgordiAwLjMzNTIzOSAtMi41ODMzMjggMC4xNTY2MzYKK3YgMC4zNDczNjYgLTIuNTgzMzI4IDAuMTU2NjM2Cit2IDAuMzUzNDI3IC0yLjU5MzgyNiAwLjE1NjYzNgordiAwLjM0NzM2NiAtMi42MDQzMjUgMC4xNTY2MzYKK3YgMC4zMzUyMzkgLTIuNjA0MzI1IDAuMTU2NjM2Cit2IDAuMzI5MTc3IC0yLjU5MzgyNiAwLjE1NjYzNgordiAwLjMzMDY0MSAtMi41MzQ3NDkgMC4xNTY2MzYKK3YgMC4zMzA2MzUgLTIuNTM5MzgxIDAuMTU2NjM2Cit2IDAuMzMwNTcwIC0yLjYxODg1MCAwLjE1NjYzNgordiAwLjMzMDU3NiAtMi42MjMyMzIgMC4xNTY2MzYKK3YgMC4zNjEzMjkgLTIuNTkzNzUwIDAuMTU2NjM2Cit2IDAuMzY1NzI3IC0yLjU5NDY3NiAwLjE1NjYzNgordiAwLjM2MTM5NCAtMi41NjQwNzkgMC4xNTY2MzYKK3YgMC4zNjU3OTMgLTIuNTYzMDk0IDAuMTU2NjM2Cit2IC0wLjEwNDQ1OSAtMi41NDk5MDEgMC4xNTYzMDEKK3YgLTAuMTE4Mjk1IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4xMjM5MTggLTIuNTQwMTYxIDAuMTU2MzAxCit2IC0wLjA5ODgzNiAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMDk4ODM2IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4xMjM5MTggLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjExODI5NSAtMi42MDg0MzIgMC4xNTYzMDEKK3YgLTAuMTA0NDU5IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4xMjQwNzMgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjA5ODk5NiAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMTI0MDczIC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4wOTg5OTYgLTIuNTk4NjkwIDAuMTU2MzAxCit2IC0wLjEyNDA5NiAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMTM1MzU2IC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4xMzUzNTYgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjEyNDA5NiAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMTA0ODA5IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4xMTg2MjggLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjA5OTAyNSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMDk5MDI1IC0yLjU4ODc4NCAwLjE1NjMwMQordiAtMC4wODc3NjAgLTIuNTk4NjkwIDAuMTU2MzAxCit2IC0wLjA4Nzc2MCAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMDY4MTQ4IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4wODE5ODEgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjA4NzYwNSAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMDYyNTI0IC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4wNjI1MjQgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjA4NzYwNSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMDgxOTgxIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4wNjgxNDggLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjA2MjY4OSAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMDYyNjg5IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4wODc3ODMgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjA4Nzc4MyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMDY4NDk3IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4wODIzMTYgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjA2MjcwOSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMDYyNzA5IC0yLjU4ODc4NCAwLjE1NjMwMQordiAtMC4wNTE0NDggLTIuNTk4NjkwIDAuMTU2MzAxCit2IC0wLjA1MTQ0OCAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMDMxODM1IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4wNDU2NjkgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjA1MTI5MyAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMDI2MjEyIC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4wMjYyMTIgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjA1MTI5MyAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMDQ1NjY5IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4wMzE4MzUgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjAyNjM3NSAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMDI2Mzc1IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4wNTE0NzIgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjA1MTQ3MiAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMDMyMTg1IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4wNDYwMDQgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjAyNjM5OSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMDI2Mzk5IC0yLjU4ODc4NCAwLjE1NjMwMQordiAtMC4wMTUxMzQgLTIuNTk4NjkwIDAuMTU2MzAxCit2IC0wLjAxNTE2MyAtMi41NjkzMDQgMC4xNTYzMDEKK3YgMC4wMDk5NDkgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMDIxMTk1IC0yLjU1OTY0MSAwLjE1NjMwMQordiAwLjAwOTkyMyAtMi41NjkzMDQgMC4xNTYzMDEKK3YgMC4wMDQxNDggLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjAwOTY5MiAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4wMDk5MjMgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjAxNTE2MyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgMC4wMjExOTUgLTIuNTk4NjkwIDAuMTU2MzAxCit2IDAuMDA5OTQ5IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4wMTUxMzQgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMDA0NDc3IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4wMDkzNTggLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjAxNDk4MSAtMi41NDAxNjEgMC4xNTYzMDEKK3YgMC4wMTAxMDEgLTIuNTQwMTYxIDAuMTU2MzAxCit2IDAuMDEwMTAxIC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4wMTQ5ODEgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjAwOTM1OCAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4wMDQ0NzcgLTIuNjA4NDMyIDAuMTU2MzAxCit2IDAuMDIxMzUyIC0yLjU0MDE2MSAwLjE1NjMwMQordiAwLjAyMTM1MiAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4wNDA4MTAgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IDAuMDI2OTc1IC0yLjU0OTkwMSAwLjE1NjMwMQordiAwLjA0NjQzMyAtMi41NDAxNjEgMC4xNTYzMDEKK3YgMC4wNDY0MzMgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMDI2OTc1IC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjA0MDgxMCAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4wNDYyNzEgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMDQ2MjcxIC0yLjU5ODY5MCAwLjE1NjMwMQordiAwLjAyMTE3NCAtMi41NjkzMDQgMC4xNTYzMDEKK3YgMC4wMjExNzQgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMDQwNDYwIC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjAyNjY0MSAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4wNDYyNDUgLTIuNTY5MzA0IDAuMTU2MzAxCit2IDAuMDQ2MjQ1IC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjA1NzUwOSAtMi41OTg2OTAgMC4xNTYzMDEKK3YgMC4wNTc1MDkgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMDc3MTIxIC0yLjU0OTkwMSAwLjE1NjMwMQordiAwLjA2MzI4NyAtMi41NDk5MDEgMC4xNTYzMDEKK3YgMC4wNTc2NjQgLTIuNTQwMTYxIDAuMTU2MzAxCit2IDAuMDgyNzQ1IC0yLjU0MDE2MSAwLjE1NjMwMQordiAwLjA4Mjc0NCAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4wNTc2NjQgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMDYzMjg3IC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjA3NzEyMSAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4wODI1ODIgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMDgyNTgyIC0yLjU5ODY5MCAwLjE1NjMwMQordiAwLjA1NzQ4NSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgMC4wNTc0ODUgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMDc2NzcyIC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjA2Mjk1MyAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4wODI1NTcgLTIuNTY5MzA0IDAuMTU2MzAxCit2IDAuMDgyNTU3IC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjA5MzgyMiAtMi41OTg2OTAgMC4xNTYzMDEKK3YgMC4wOTM4MjIgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMTEzNDMzIC0yLjU0OTkwMSAwLjE1NjMwMQordiAwLjA5OTU5OSAtMi41NDk5MDEgMC4xNTYzMDEKK3YgMC4wOTM5NzYgLTIuNTQwMTYxIDAuMTU2MzAxCit2IDAuMTE5MDU3IC0yLjU0MDE2MSAwLjE1NjMwMQordiAwLjExOTA1NyAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4wOTM5NzYgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMDk5NTk5IC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjExMzQzMyAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4xMTg4OTYgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMTE4ODk2IC0yLjU5ODY5MCAwLjE1NjMwMQordiAwLjA5Mzc5NSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgMC4wOTM3OTUgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMTEzMDg0IC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjA5OTI2NSAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4xMTg4NjggLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMTE4ODY4IC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjEzMDE0MCAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4xMzAxNDAgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMTQ5NzQ1IC0yLjU0OTkwMiAwLjE1NjMwMQordiAwLjEzNTkxMSAtMi41NDk5MDIgMC4xNTYzMDEKK3YgMC4xMzAyODggLTIuNTQwMTYyIDAuMTU2MzAxCit2IDAuMTU1MzY5IC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjE1NTM2OSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4xMzAyODggLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMTM1OTExIC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjE0OTc0NSAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4xNTUyMTIgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMTU1MjEyIC0yLjU5ODY5MSAwLjE1NjMwMQordiAwLjEzMDEwMSAtMi41NjkzMDUgMC4xNTYzMDEKK3YgMC4xMzAxMDEgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMTQ5NDAzIC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjEzNTU3NyAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4xNTUxODMgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMTU1MTgzIC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjE2NjQ1NSAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4xNjY0NTUgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMTg2MDY3IC0yLjU0OTkwMiAwLjE1NjMwMQordiAwLjE3MjIzMCAtMi41NDk5MDIgMC4xNTYzMDEKK3YgMC4xNjY2MDcgLTIuNTQwMTYyIDAuMTU2MzAxCit2IDAuMTkxNjkwIC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjE5MTY5MCAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4xNjY2MDcgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMTcyMjMwIC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjE4NjA2NyAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4xOTE2OTAgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMTkxNjkwIC0yLjU5ODY5MSAwLjE1NjMwMQordiAwLjE2NjQyNSAtMi41NjkzMDUgMC4xNTYzMDEKK3YgMC4xNjY0MjUgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMTg1NzExIC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjE3MTg5NiAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4xOTEzMzQgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMTkxMzM0IC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjIwMjc2NiAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4yMDI3NjYgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMjIyMzg4IC0yLjU0OTkwMiAwLjE1NjMwMQordiAwLjIwODU0NCAtMi41NDk5MDIgMC4xNTYzMDEKK3YgMC4yMDI5MjEgLTIuNTQwMTYyIDAuMTU2MzAxCit2IDAuMjI4MDExIC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjIyODAxMSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4yMDI5MjEgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMjA4NTQ0IC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjIyMjM4OCAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4yMjc4NTMgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMjI3ODUzIC0yLjU5ODY5MSAwLjE1NjMwMQordiAwLjIwMjczNSAtMi41NjkzMDUgMC4xNTYzMDEKK3YgMC4yMDI3MzUgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMjIyMDM5IC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjIwODIwNCAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4yMjc4MjEgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMjI3ODIxIC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjIzOTA4OCAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4yMzkwODggLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMjU5MzYwIC0yLjU0OTkwMiAwLjE1NjMwMQordiAwLjI0NTc1NyAtMi41NDk5MDIgMC4xNTYzMDEKK3YgMC4yMzkyNDMgLTIuNTQwMTYyIDAuMTU2MzAxCit2IDAuMjY0OTgzIC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjI2NDk4MyAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4yMzkyNDMgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMjQ1NzU3IC0yLjYwODQzMiAwLjE1NjMwMQordiAwLjI1OTM2MCAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4yNjQ5ODMgLTIuNTU5NjQyIDAuMTU2MzAxCit2IDAuMjY0OTgzIC0yLjU5ODY5MSAwLjE1NjMwMQordiAwLjIzOTA2NCAtMi41NjkzMDUgMC4xNTYzMDEKK3YgMC4yMzkwNjQgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMjU5MjkxIC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjI0NTQyMyAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4yNjQ5MTQgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMjY0OTE0IC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjI3NjIxMyAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4yNzYxNjEgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMzAxMjk1IC0yLjU1OTY0MiAwLjE1NjMwMQordiAwLjMxMjU0NiAtMi41NTk2NDIgMC4xNTYzMDEKK3YgMC4zMDEyNDcgLTIuNTY5MzA1IDAuMTU2MzAxCit2IDAuMjk1NjI0IC0yLjU3OTA0NSAwLjE1NjMwMQordiAwLjI4MTc4NCAtMi41NzkwNDUgMC4xNTYzMDEKK3YgMC4zMDEyNDcgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IDAuMjc2MTYxIC0yLjU4ODc4NCAwLjE1NjMwMQordiAwLjMxMjU0NiAtMi41OTg2OTEgMC4xNTYzMDEKK3YgMC4zMDEyOTUgLTIuNTk4NjkxIDAuMTU2MzAxCit2IDAuMjc2MjEzIC0yLjU1OTY0MiAwLjE1NjMwMQordiAwLjI5NTY3MiAtMi41NDk5MDIgMC4xNTYzMDEKK3YgMC4yODE4MzcgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IDAuMjc2MjEzIC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjMwMTI5NSAtMi41NDAxNjIgMC4xNTYzMDEKK3YgMC4zMDEyOTUgLTIuNjE4MTY5IDAuMTU2MzAxCit2IDAuMjc2MjEzIC0yLjYxODE2OSAwLjE1NjMwMQordiAwLjI4MTgzNyAtMi42MDg0MzIgMC4xNTYzMDEKK3YgMC4yOTU2NzIgLTIuNjA4NDMyIDAuMTU2MzAxCit2IDAuMzEyNTQ2IC0yLjU0MDE2MiAwLjE1NjMwMQordiAwLjMxMjU0NiAtMi42MTgxNjkgMC4xNTYzMDEKK3YgMC4zMTgxNzAgLTIuNjA4NDMyIDAuMTU2MzAxCit2IDAuMzE4MTcwIC0yLjU0OTkwMiAwLjE1NjMwMQordiAwLjMxMjQ5NCAtMi41NjkzMDUgMC4xNTYzMDEKK3YgMC4zMTgxMTcgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IDAuMzEyNDk0IC0yLjU4ODc4NCAwLjE1NjMwMQordiAtMC4xNDExMjEgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjEzNTMzNyAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMTM1MTk1IC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4xNDA4MTggLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjE0MDgxOCAtMi42MDg0MzIgMC4xNTYzMDEKK3YgLTAuMTM1MTk1IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4xMzUzMzcgLTIuNTU5NjQxIDAuMTU2MzAxCit2IDAuMzM1Njc2IC0yLjU1NDQwOCAwLjE1NjMwMQordiAwLjM0NjkyNyAtMi41NTQ0MDggMC4xNTYzMDEKK3YgMC4zNTI1NTEgLTIuNTY0MTQ3IDAuMTU2MzAxCit2IDAuMzQ2OTI3IC0yLjU3Mzg4OCAwLjE1NjMwMQordiAwLjMzNTY3NiAtMi41NzM4ODggMC4xNTYzMDEKK3YgMC4zMzAwNTMgLTIuNTY0MTQ3IDAuMTU2MzAxCit2IDAuMzM1Njc2IC0yLjU4NDA4NiAwLjE1NjMwMQordiAwLjM0NjkyNyAtMi41ODQwODYgMC4xNTYzMDEKK3YgMC4zNTI1NTEgLTIuNTkzODI2IDAuMTU2MzAxCit2IDAuMzQ2OTI3IC0yLjYwMzU2NiAwLjE1NjMwMQordiAwLjMzNTY3NiAtMi42MDM1NjYgMC4xNTYzMDEKK3YgMC4zMzAwNTMgLTIuNTkzODI2IDAuMTU2MzAxCit2IC0wLjE4OTE2MiAtMi41NDk5MDEgMC4xNTY2MzYKK3YgLTAuMTk1MjIzIC0yLjUzOTQwMyAwLjE1NjYzNgordiAtMC4xNzEwMTcgLTIuNTM5NDAzIDAuMTU2NjM2Cit2IC0wLjE3NzA3OCAtMi41NDk5MDEgMC4xNTY2MzYKK3YgLTAuMTk1MjIzIC0yLjYxODkzMCAwLjE1NjYzNgordiAtMC4xODkxNjIgLTIuNjA4NDMyIDAuMTU2NjM2Cit2IC0wLjE3NzA3OCAtMi42MDg0MzIgMC4xNTY2MzYKK3YgLTAuMTcxMDE3IC0yLjYxODkzMCAwLjE1NjYzNgordiAtMC4xNzA4NTAgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IC0wLjE5NTA1MCAtMi41NjA0MDAgMC4xNTY2MzYKK3YgLTAuMTk1MDUwIC0yLjU5NzkzMyAwLjE1NjYzNgordiAtMC4xNzA4NTAgLTIuNTk3OTMzIDAuMTU2NjM2Cit2IC0wLjE5NTIyMyAtMi41MzQ3NzcgMC4xNTY2MzYKK3YgLTAuMTcxMDE3IC0yLjUzNDc3NyAwLjE1NjYzNgordiAtMC4xNzEwMTcgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IC0wLjE5NTIyMyAtMi42MjMzMDUgMC4xNTY2MzYKK3YgLTAuMTg4Nzk5IC0yLjU3OTA0NSAwLjE1NjYzNgordiAtMC4xOTUwMzMgLTIuNTY4NTQ3IDAuMTU2NjM2Cit2IC0wLjE3MDgzOCAtMi41Njg1NDcgMC4xNTY2MzYKK3YgLTAuMTc2NzMyIC0yLjU3OTA0NSAwLjE1NjYzNgordiAtMC4xOTUwMzMgLTIuNTg5NTQ0IDAuMTU2NjM2Cit2IC0wLjE3MDgzOCAtMi41ODk1NDQgMC4xNTY2MzYKK3YgLTAuMjI1NDczIC0yLjU0OTkwMSAwLjE1NjYzNQordiAtMC4yMzE1MzUgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjIwNzMyOSAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuMjEzMzkwIC0yLjU0OTkwMSAwLjE1NjYzNQordiAtMC4yMzE1MzQgLTIuNjE4OTMwIDAuMTU2NjM1Cit2IC0wLjIyNTQ3MyAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuMjEzMzkwIC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC4yMDczMjkgLTIuNjE4OTMwIDAuMTU2NjM1Cit2IC0wLjIwNzE2MSAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuMjMxMzU4IC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC4yMzEzNTggLTIuNTk3OTMzIDAuMTU2NjM1Cit2IC0wLjIwNzE2MSAtMi41OTc5MzMgMC4xNTY2MzUKK3YgLTAuMjA3MzI5IC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC4yMzE1MzQgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjIwNzMyOSAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuMjMxNTM0IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4yMjUxMTEgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjIzMTM0OSAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuMjA3MTUxIC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC4yMTMwNDQgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjIzMTM0OSAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuMjA3MTUxIC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC4yNjE3ODUgLTIuNTQ5OTAxIDAuMTU2NjM1Cit2IC0wLjI2Nzg0NyAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuMjQzNjQxIC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC4yNDk3MDIgLTIuNTQ5OTAxIDAuMTU2NjM1Cit2IC0wLjI2Nzg0NyAtMi42MTg5MzAgMC4xNTY2MzUKK3YgLTAuMjYxNzg1IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC4yNDk3MDIgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjI0MzY0MSAtMi42MTg5MzAgMC4xNTY2MzUKK3YgLTAuMjQzNDc0IC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC4yNjc2NzEgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjI2NzY3MSAtMi41OTc5MzMgMC4xNTY2MzUKK3YgLTAuMjQzNDc0IC0yLjU5NzkzMyAwLjE1NjYzNQordiAtMC4yNDM2NDEgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjI2Nzg0NyAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuMjQzNjQxIC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4yNjc4NDcgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjI2MTQyMyAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuMjY3NjU5IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC4yNDM0NjIgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjI0OTM1NiAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuMjY3NjU5IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC4yNDM0NjIgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjI3OTc3MSAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuMjg1NjY4IC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC4yOTc3NTYgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjMwMzk4MSAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuMjc5NzcxIC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC4zMDM5ODEgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjI5ODA5NyAtMi41NDk5MDEgMC4xNTY2MzUKK3YgLTAuMzA0MTU4IC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC4yNzk5NTIgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjI4NjAxNCAtMi41NDk5MDEgMC4xNTY2MzUKK3YgLTAuMzA0MTU4IC0yLjYxODkzMCAwLjE1NjYzNQordiAtMC4yOTgwOTcgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjI4NjAxNCAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuMjc5OTUyIC0yLjYxODkzMCAwLjE1NjYzNQordiAtMC4yNzk3ODggLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjMwMzk5NSAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuMzAzOTk1IC0yLjU5NzkzMyAwLjE1NjYzNQordiAtMC4yNzk3ODggLTIuNTk3OTMzIDAuMTU2NjM1Cit2IC0wLjI3OTk1MiAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuMzE2Mjg2IC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC4zMTYyODYgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjMwNDE1OCAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuMzA0MTU4IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4zMTYyODYgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjMxNjI4NiAtMi42MTg5MzAgMC4xNTY2MzUKK3YgLTAuMjc5OTUyIC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4zMzQ0MzAgLTIuNTQ5OTAxIDAuMTU2NjM1Cit2IC0wLjM0MDQ5MiAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuMzIyMzQ3IC0yLjU0OTkwMSAwLjE1NjYzNQordiAtMC4zNDA0OTIgLTIuNjE4OTMwIDAuMTU2NjM1Cit2IC0wLjMzNDQzMCAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuMzIyMzQ3IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC4zMTYxMTcgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjM0MDMxNyAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuMzQwMzE3IC0yLjU5NzkzMyAwLjE1NjYzNQordiAtMC4zMTYxMTcgLTIuNTk3OTMzIDAuMTU2NjM1Cit2IC0wLjM0MDQ5MiAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuMzQwNDkyIC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4zMzQwNjggLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjM0MDMwMyAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuMzE2MTA5IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC4zMjIwMDEgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjM0MDMwMyAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuMzE2MTA5IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC4zNzA3NDIgLTIuNTQ5OTAxIDAuMTU2NjM1Cit2IC0wLjM3NjgwMyAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuMzUyNTk3IC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC4zNTg2NTkgLTIuNTQ5OTAxIDAuMTU2NjM1Cit2IC0wLjM3NjgwMyAtMi42MTg5MzAgMC4xNTY2MzUKK3YgLTAuMzcwNzQyIC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC4zNTg2NTkgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjM1MjU5NyAtMi42MTg5MzAgMC4xNTY2MzUKK3YgLTAuMzUyNDMwIC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC4zNzY2MjkgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjM3NjYyOSAtMi41OTc5MzMgMC4xNTY2MzUKK3YgLTAuMzUyNDMwIC0yLjU5NzkzMyAwLjE1NjYzNQordiAtMC4zNTI1OTcgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjM3NjgwMyAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuMzUyNTk3IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC4zNzY4MDMgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjM3MDM4MCAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuMzc2NjE2IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC4zNTI0MTggLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjM1ODMxMyAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuMzc2NjE2IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC4zNTI0MTggLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjQwNzA1NCAtMi41NDk5MDEgMC4xNTY2MzUKK3YgLTAuNDEzMTE2IC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC4zODg5MDkgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjM5NDk3MSAtMi41NDk5MDEgMC4xNTY2MzUKK3YgLTAuNDEzMTE2IC0yLjYxODkzMCAwLjE1NjYzNQordiAtMC40MDcwNTQgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjM5NDk3MSAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuMzg4OTEwIC0yLjYxODkzMCAwLjE1NjYzNQordiAtMC4zODg3NDQgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjQxMjk0MiAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuNDEyOTQyIC0yLjU5NzkzMyAwLjE1NjYzNQordiAtMC4zODg3NDQgLTIuNTk3OTMzIDAuMTU2NjM1Cit2IC0wLjM4ODkxMCAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuNDEzMTE2IC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC4zODg5MTAgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjQxMzExNiAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNDA2NjkyIC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC40MTI5MjcgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjM4ODcyOSAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuMzk0NjI1IC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC40MTI5MjcgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjM4ODcyOSAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuNDQzMzY2IC0yLjU0OTkwMiAwLjE1NjYzNQordiAtMC40NDk0MjcgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjQyNTIyMSAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuNDMxMjgzIC0yLjU0OTkwMiAwLjE1NjYzNQordiAtMC40NDk0MjcgLTIuNjE4OTMxIDAuMTU2NjM1Cit2IC0wLjQ0MzM2NiAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuNDMxMjgzIC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC40MjUyMjEgLTIuNjE4OTMxIDAuMTU2NjM1Cit2IC0wLjQyNTA2MiAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuNDQ5MjU4IC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC40NDkyNTggLTIuNTk3OTM0IDAuMTU2NjM1Cit2IC0wLjQyNTA2MiAtMi41OTc5MzQgMC4xNTY2MzUKK3YgLTAuNDI1MjIxIC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC40NDk0MjcgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjQyNTIyMSAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNDQ5NDI3IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC40NDMwMTEgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjQ0OTI0MSAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuNDI1MDM0IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC40MzA5MzYgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjQ0OTI0MSAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuNDI1MDM0IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC40Nzk2ODYgLTIuNTQ5OTAyIDAuMTU2NjM1Cit2IC0wLjQ4NTc0NyAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuNDYxNTQxIC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC40Njc2MDIgLTIuNTQ5OTAyIDAuMTU2NjM1Cit2IC0wLjQ4NTc0NyAtMi42MTg5MzEgMC4xNTY2MzUKK3YgLTAuNDc5Njg2IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC40Njc2MDIgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjQ2MTU0MSAtMi42MTg5MzEgMC4xNTY2MzUKK3YgLTAuNDYxMzc3IC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC40ODU3NDcgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjQ4NTc0NyAtMi41OTc5MzQgMC4xNTY2MzUKK3YgLTAuNDYxMzc3IC0yLjU5NzkzNCAwLjE1NjYzNQordiAtMC40NjE1NDEgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjQ4NTc0NyAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuNDYxNTQxIC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC40ODU3NDcgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjQ3OTMyMyAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuNDg1Mzg0IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC40NjEzNTkgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjQ2NzI1NiAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuNDg1Mzg0IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC40NjEzNTkgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjUxNTk5NyAtMi41NDk5MDIgMC4xNTY2MzUKK3YgLTAuNTIyMDU4IC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC40OTc4NTIgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjUwMzkxNCAtMi41NDk5MDIgMC4xNTY2MzUKK3YgLTAuNTIyMDU4IC0yLjYxODkzMSAwLjE1NjYzNQordiAtMC41MTU5OTcgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjUwMzkxNCAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuNDk3ODUyIC0yLjYxODkzMSAwLjE1NjYzNQordiAtMC40OTc2ODYgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjUyMTg4NyAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuNTIxODg3IC0yLjU5NzkzNCAwLjE1NjYzNQordiAtMC40OTc2ODYgLTIuNTk3OTM0IDAuMTU2NjM1Cit2IC0wLjQ5Nzg1MiAtMi41MzQ3NzcgMC4xNTY2MzUKK3YgLTAuNTIyMDU4IC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC40OTc4NTMgLTIuNjIzMzA1IDAuMTU2NjM1Cit2IC0wLjUyMjA1OCAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNTE1NjM1IC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC41MjE4NjcgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjQ5NzY3MyAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuNTAzNTY4IC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC41MjE4NjcgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjQ5NzY3MyAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuNTUyOTc2IC0yLjU0OTkwMiAwLjE1NjYzNQordiAtMC41NTkwMzcgLTIuNTM5NDAzIDAuMTU2NjM1Cit2IC0wLjUzNDE2NSAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuNTQxMTg2IC0yLjU0OTkwMiAwLjE1NjYzNQordiAtMC41NTkwMzcgLTIuNjE4OTMxIDAuMTU2NjM1Cit2IC0wLjU1Mjk3NiAtMi42MDg0MzIgMC4xNTY2MzUKK3YgLTAuNTQxMTg2IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC41MzQxNjUgLTIuNjE4OTMxIDAuMTU2NjM1Cit2IC0wLjUzMzk5NyAtMi41NjA0MDAgMC4xNTY2MzUKK3YgLTAuNTU5MDM3IC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC41NTkwMzcgLTIuNTk3OTM0IDAuMTU2NjM1Cit2IC0wLjUzMzk5NyAtMi41OTc5MzQgMC4xNTY2MzUKK3YgLTAuNTM0MTY1IC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC41NTkwMzcgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjUzNDE2NSAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNTU5MDM3IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC41NTI5MDcgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjU1ODk2OCAtMi41Njg1NDcgMC4xNTY2MzUKK3YgLTAuNTMzOTg2IC0yLjU2ODU0NyAwLjE1NjYzNQordiAtMC41NDA4NDAgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjU1ODk2OCAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuNTMzOTg2IC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC41NzEwOTEgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjU3NzE1MiAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuNTg5MjQwIC0yLjU3OTA0NSAwLjE1NjYzNQordiAtMC41OTUzMDEgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjU3MTA5MSAtMi41ODk1NDQgMC4xNTY2MzUKK3YgLTAuNTk1MzAxIC0yLjU4OTU0NCAwLjE1NjYzNQordiAtMC41ODkyODggLTIuNTQ5OTAyIDAuMTU2NjM1Cit2IC0wLjU5NTM0OSAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuNTcxMTQzIC0yLjUzOTQwMyAwLjE1NjYzNQordiAtMC41NzcyMDQgLTIuNTQ5OTAyIDAuMTU2NjM1Cit2IC0wLjU5NTM0OSAtMi42MTg5MzEgMC4xNTY2MzUKK3YgLTAuNTg5Mjg4IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC41NzcyMDQgLTIuNjA4NDMyIDAuMTU2NjM1Cit2IC0wLjU3MTE0MyAtMi42MTg5MzEgMC4xNTY2MzUKK3YgLTAuNTcxMTQzIC0yLjU2MDQwMCAwLjE1NjYzNQordiAtMC41OTUzNDkgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjU5NTM0OSAtMi41OTc5MzQgMC4xNTY2MzUKK3YgLTAuNTcxMTQzIC0yLjU5NzkzNCAwLjE1NjYzNQordiAtMC41NzExNDMgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjYwNzQ3NiAtMi41Mzk0MDMgMC4xNTY2MzUKK3YgLTAuNjA3NDc2IC0yLjUzNDc3NyAwLjE1NjYzNQordiAtMC41OTUzNDkgLTIuNTM0Nzc3IDAuMTU2NjM1Cit2IC0wLjU5NTM0OSAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNjA3NDc2IC0yLjYyMzMwNSAwLjE1NjYzNQordiAtMC42MDc0NzYgLTIuNjE4OTMxIDAuMTU2NjM1Cit2IC0wLjU3MTE0MyAtMi42MjMzMDUgMC4xNTY2MzUKK3YgLTAuNjUwODU4IC0yLjYwODQzOSAwLjE1NjYzNQordiAtMC42NDA3MDIgLTIuNjA0MzI1IDAuMTU2NjM1Cit2IC0wLjYyODU3NCAtMi42MDQzMjUgMC4xNTY2MzUKK3YgLTAuNjI1OTA5IC0yLjYxODkyNiAwLjE1NjYzNQordiAtMC42MjU3MzAgLTIuNTM5MzgxIDAuMTU2NjM1Cit2IC0wLjYyNTczNiAtMi41MzQ3NDkgMC4xNTY2MzUKK3YgLTAuNjI1OTE1IC0yLjYyMzMwOCAwLjE1NjYzNQordiAtMC42NTQ1MzIgLTIuNjEwMjcwIDAuMTU2NjM1Cit2IC0wLjY2MTA3NyAtMi41OTQ1MDIgMC4xNTY2MzUKK3YgLTAuNjU2Njc5IC0yLjU5MzU3NiAwLjE1NjYzNQordiAtMC42NjI5MDMgLTIuNTc5MDQ1IDAuMTU2NjM1Cit2IC0wLjY2NzQyMyAtMi41NzkwNDYgMC4xNTY2MzUKK3YgLTAuNjYwOTY1IC0yLjU2MzA5NCAwLjE1NjYzNQordiAtMC42NTY1NzMgLTIuNTY0MDc5IDAuMTU2NjM1Cit2IC0wLjYxMzUzOCAtMi41NDk5MDIgMC4xNTY2MzUKK3YgLTAuNjI4NTc0IC0yLjU1MzY0OSAwLjE1NjYzNQordiAtMC4xNTg3MDkgLTIuNTYwNDAwIDAuMTU2NjM2Cit2IC0wLjE1MjgwMCAtMi41NDk5MDEgMC4xNTY2MzYKK3YgLTAuMTUyODAwIC0yLjYwODQzMiAwLjE1NjYzNgordiAtMC4xNTg3MDkgLTIuNTk3OTMzIDAuMTU2NjM2Cit2IC0wLjE1ODg2MiAtMi41Mzk0MDMgMC4xNTY2MzYKK3YgLTAuMTU4ODYyIC0yLjUzNDc3NyAwLjE1NjYzNgordiAtMC4xNTg4NjIgLTIuNjIzMzA1IDAuMTU2NjM2Cit2IC0wLjE1ODg2MiAtMi42MTg5MzAgMC4xNTY2MzYKK3YgLTAuNjIyNTEzIC0yLjU2NDE0NyAwLjE1NjYzNQordiAtMC42MDc0MjQgLTIuNTY4NTQ3IDAuMTU2NjM1Cit2IC0wLjYxMzQ4NSAtMi41NzkwNDUgMC4xNTY2MzUKK3YgLTAuNjI4NTc0IC0yLjU3NDY0NiAwLjE1NjYzNQordiAtMC42MjI1MTMgLTIuNTkzODI2IDAuMTU2NjM1Cit2IC0wLjYwNzQ3NiAtMi41OTc5MzQgMC4xNTY2MzUKK3YgLTAuNjEzNTM4IC0yLjYwODQzMiAwLjE1NjYzNQordiAtMC42MDc0MjQgLTIuNTg5NTQ0IDAuMTU2NjM1Cit2IC0wLjYyODU3NCAtMi41ODMzMjggMC4xNTY2MzUKK3YgLTAuNjQwNzAyIC0yLjU4MzMyOCAwLjE1NjYzNQordiAtMC42NDA3MDIgLTIuNTc0NjQ2IDAuMTU2NjM1Cit2IC0wLjY1MDQ5NCAtMi41NDk4MzEgMC4xNTY2MzUKK3YgLTAuNjU0NzcxIC0yLjU0Nzg0MCAwLjE1NjYzNQordiAtMC42MDc0NzYgLTIuNTYwNDAwIDAuMTU2NjM1Cit2IC0wLjY0MDcwMiAtMi41NTM2NDkgMC4xNTY2MzUKK3YgLTAuNjQ2NzYzIC0yLjU2NDE0NyAwLjE1NjYzNQordiAtMC42NDY3NjMgLTIuNTkzODI2IDAuMTU2NjM1Cit2IC0wLjE1ODcwMiAtMi41ODk1NDQgMC4xNTY2MzYKK3YgLTAuMTU4NzAyIC0yLjU2ODU0NyAwLjE1NjYzNgordiAtMC4xNzA1NzQgLTIuNTQwMTYxIDAuMTU2MzAxCit2IC0wLjE3NjE5NyAtMi41NDk5MDEgMC4xNTYzMDEKK3YgLTAuMTkwMDMzIC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4xOTU2NTYgLTIuNTQwMTYxIDAuMTU2MzAxCit2IC0wLjE3NjE5NyAtMi42MDg0MzIgMC4xNTYzMDEKK3YgLTAuMTcwNTc0IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4xOTU2NTYgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjE5MDAzMyAtMi42MDg0MzIgMC4xNTYzMDEKK3YgLTAuMTcwNDE5IC0yLjU1OTY0MSAwLjE1NjMwMQordiAtMC4xOTU0OTYgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjE3MDQxOSAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMTk1NDk2IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4xNTkxMzYgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjE3MDM5NiAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMTcwMzk2IC0yLjU4ODc4NCAwLjE1NjMwMQordiAtMC4xNTkxMzYgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjE3NTg2NCAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuMTg5NjgzIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4xOTU0NjcgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjE5NTQ2NyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMjA2NzMyIC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4yMDY3MzIgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjIwNjg4NyAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMjEyNTExIC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4yMjYzNDQgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjIzMTk2OCAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMjEyNTExIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4yMDY4ODcgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjIzMTk2OCAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMjI2MzQ0IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4yMzE4MDQgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjIzMTgwNCAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMjA2NzA5IC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4yMDY3MDkgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjIxMjE3NiAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuMjI1OTk1IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4yMzE3ODMgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjIzMTc4MyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMjQzMDQ0IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4yNDMwNDQgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjI0MzE5OSAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMjQ4ODIzIC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4yNjI2NTcgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjI2ODI4MCAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMjQ4ODIzIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4yNDMxOTkgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjI2ODI4MCAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMjYyNjU3IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4yNjgxMTcgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjI2ODExNyAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMjQzMDIwIC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4yNDMwMjAgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjI0ODQ4OCAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuMjYyMzA3IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4yNjgwOTMgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjI2ODA5MyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMjc5MzU5IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4zMTU2ODcgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjMwNDQ0MSAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMjk4NjQwIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4zMDQ0MTUgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjI3OTMyOSAtMi41NjkzMDQgMC4xNTYzMDEKK3YgLTAuMjg0ODAwIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4zMDQ0MTUgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjI3OTMyOSAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMzA0NDQxIC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4zMTU2ODcgLTIuNTk4NjkwIDAuMTU2MzAxCit2IC0wLjI3OTM1OCAtMi41NTk2NDEgMC4xNTYzMDEKK3YgLTAuMjc5NTExIC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4yODUxMzQgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjI5ODk2OSAtMi41NDk5MDEgMC4xNTYzMDEKK3YgLTAuMzA0NTkzIC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4yODUxMzQgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjI3OTUxMSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMzA0NTkzIC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4yOTg5NjkgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjMxNTg0NCAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMzE1ODQ0IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC4zMjE0NjcgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjMzNTMwMiAtMi41NDk5MDEgMC4xNTYzMDEKK3YgLTAuMzQwOTI1IC0yLjU0MDE2MSAwLjE1NjMwMQordiAtMC4zMjE0NjcgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjM0MDkyNSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMzM1MzAyIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4zNDA3NjMgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjM0MDc2MyAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMzE1NjY2IC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4zMTU2NjYgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjMyMTEzMyAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuMzM0OTUyIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4zNDA3MzcgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjM0MDczNyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMzUyMDAxIC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4zNTIwMDEgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjM1MjE1NiAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMzU3Nzc5IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4zNzE2MTMgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjM3NzIzNyAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMzU3Nzc5IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4zNTIxNTYgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjM3NzIzNiAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMzcxNjEzIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4zNzcwNzQgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjM3NzA3NCAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMzUxOTc3IC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4zNTE5NzcgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjM1NzQ0NSAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuMzcxMjY0IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC4zNzcwNDkgLTIuNTY5MzA0IDAuMTU2MzAxCit2IC0wLjM3NzA0OSAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMzg4MzE0IC0yLjU5ODY5MCAwLjE1NjMwMQordiAtMC4zODgzMTQgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjM4ODQ2OCAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMzk0MDkxIC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC40MDc5MjUgLTIuNTQ5OTAxIDAuMTU2MzAxCit2IC0wLjQxMzU0OSAtMi41NDAxNjEgMC4xNTYzMDEKK3YgLTAuMzk0MDkxIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4zODg0NjggLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjQxMzU0OSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNDA3OTI1IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40MTMzODggLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjQxMzM4OCAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMzg4Mjg3IC0yLjU2OTMwNCAwLjE1NjMwMQordiAtMC4zODgyODcgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjM5Mzc1NyAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuNDA3NTc2IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC40MTMzNjAgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjQxMzM2MCAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNDI0NjMyIC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC40MjQ2MzIgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjQyNDc4MCAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNDMwNDAzIC0yLjU0OTkwMiAwLjE1NjMwMQordiAtMC40NDQyMzcgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IC0wLjQ0OTg2MSAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNDMwNDAzIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40MjQ3ODAgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjQ0OTg2MSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNDQ0MjM3IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40NDk3MDQgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjQ0OTcwNCAtMi41OTg2OTEgMC4xNTYzMDEKK3YgLTAuNDI0NTkzIC0yLjU2OTMwNSAwLjE1NjMwMQordiAtMC40MjQ1OTMgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjQzMDA2OSAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuNDQzODk1IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC40NDk2NzUgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjQ0OTY3NSAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNDYwOTQ3IC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC40NjA5NDcgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjQ2MTA5OSAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNDY2NzIyIC0yLjU0OTkwMiAwLjE1NjMwMQordiAtMC40ODA1NTkgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IC0wLjQ4NjE4MiAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNDY2NzIyIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40NjEwOTkgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjQ4NjE4MiAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNDgwNTU5IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40ODYxODIgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjQ4NjE4MiAtMi41OTg2OTEgMC4xNTYzMDEKK3YgLTAuNDYwOTE3IC0yLjU2OTMwNSAwLjE1NjMwMQordiAtMC40NjA5MTcgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjQ2NjM4OCAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuNDgwMjAzIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC40ODU4MjYgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjQ4NTgyNiAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNDk3MjU4IC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC40OTcyNTggLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjQ5NzQxMyAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNTAzMDM2IC0yLjU0OTkwMiAwLjE1NjMwMQordiAtMC41MTY4ODAgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IC0wLjUyMjUwMyAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNTAzMDM2IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC40OTc0MTMgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjUyMjUwMyAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNTE2ODgwIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC41MjIzNDUgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjUyMjM0NSAtMi41OTg2OTEgMC4xNTYzMDEKK3YgLTAuNDk3MjI3IC0yLjU2OTMwNSAwLjE1NjMwMQordiAtMC40OTcyMjcgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjUwMjY5NiAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuNTE2NTMxIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC41MjIzMTMgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjUyMjMxMyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNTMzNTgwIC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC41MzM1ODAgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjUzMzczNSAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNTQwMjQ5IC0yLjU0OTkwMiAwLjE1NjMwMQordiAtMC41NTM4NTIgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IC0wLjU1OTQ3NSAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNTQwMjQ5IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC41MzM3MzUgLTIuNjE4MTY5IDAuMTU2MzAxCit2IC0wLjU1OTQ3NSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNTUzODUyIC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC41NTk0NzUgLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjU1OTQ3NSAtMi41OTg2OTEgMC4xNTYzMDEKK3YgLTAuNTMzNTU2IC0yLjU2OTMwNSAwLjE1NjMwMQordiAtMC41MzM1NTYgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjUzOTkxNSAtMi41NzkwNDUgMC4xNTYzMDEKK3YgLTAuNTUzNzgzIC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC41NTk0MDYgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjU1OTQwNiAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNTcwNzA1IC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC42MDcwMzggLTIuNTU5NjQyIDAuMTU2MzAxCit2IC0wLjU5NTc4NyAtMi41NTk2NDIgMC4xNTYzMDEKK3YgLTAuNTkwMTE2IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC41OTU3MzkgLTIuNTY5MzA1IDAuMTU2MzAxCit2IC0wLjU3MDY1MyAtMi41NjkzMDUgMC4xNTYzMDEKK3YgLTAuNTc2Mjc2IC0yLjU3OTA0NSAwLjE1NjMwMQordiAtMC41OTU3MzkgLTIuNTg4Nzg0IDAuMTU2MzAxCit2IC0wLjU3MDY1MyAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuNTk1Nzg3IC0yLjU5ODY5MSAwLjE1NjMwMQordiAtMC42MDcwMzggLTIuNTk4NjkxIDAuMTU2MzAxCit2IC0wLjU3MDcwNSAtMi41NTk2NDIgMC4xNTYzMDEKK3YgLTAuNTcwNzA1IC0yLjU0MDE2MiAwLjE1NjMwMQordiAtMC41NzYzMjkgLTIuNTQ5OTAyIDAuMTU2MzAxCit2IC0wLjU5MDE2NCAtMi41NDk5MDIgMC4xNTYzMDEKK3YgLTAuNTk1Nzg3IC0yLjU0MDE2MiAwLjE1NjMwMQordiAtMC41NzYzMjkgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjU3MDcwNSAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuNTk1Nzg3IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC41OTAxNjQgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjYwNzAzOCAtMi41NDAxNjIgMC4xNTYzMDEKK3YgLTAuNjA3MDM4IC0yLjYxODE2OSAwLjE1NjMwMQordiAtMC42MTI2NjIgLTIuNjA4NDMyIDAuMTU2MzAxCit2IC0wLjYxMjY2MiAtMi41NDk5MDIgMC4xNTYzMDEKK3YgLTAuNjA2OTg2IC0yLjU2OTMwNSAwLjE1NjMwMQordiAtMC42MTI2MDkgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjYwNjk4NiAtMi41ODg3ODQgMC4xNTYzMDEKK3YgLTAuMTUyNDg3IC0yLjU3OTA0NSAwLjE1NjYzNgordiAtMC4xNTMzNzEgLTIuNTc5MDQ1IDAuMTU2MzAxCit2IC0wLjE1OTE1NSAtMi41OTg2OTAgMC4xNTYzMDEKK3YgLTAuMTUzNjc0IC0yLjU0OTkwMSAwLjE1NjMwMQordiAtMC4xNTkyOTcgLTIuNTQwMTYxIDAuMTU2MzAxCit2IC0wLjE1OTI5NyAtMi42MTgxNjkgMC4xNTYzMDEKK3YgLTAuMTUzNjc0IC0yLjYwODQzMiAwLjE1NjMwMQordiAtMC4xNTkxNTUgLTIuNTU5NjQxIDAuMTU2MzAxCit2IC0wLjYyOTAxMiAtMi41NTQ0MDggMC4xNTYzMDEKK3YgLTAuNjQwMjYzIC0yLjU1NDQwOCAwLjE1NjMwMQordiAtMC42NDU4ODcgLTIuNTY0MTQ3IDAuMTU2MzAxCit2IC0wLjY0MDI2MyAtMi41NzM4ODggMC4xNTYzMDEKK3YgLTAuNjI5MDEyIC0yLjU3Mzg4OCAwLjE1NjMwMQordiAtMC42MjMzODkgLTIuNTY0MTQ3IDAuMTU2MzAxCit2IC0wLjYyOTAxMiAtMi41ODQwODYgMC4xNTYzMDEKK3YgLTAuNjQwMjYzIC0yLjU4NDA4NiAwLjE1NjMwMQordiAtMC42NDU4ODcgLTIuNTkzODI2IDAuMTU2MzAxCit2IC0wLjY0MDI2MyAtMi42MDM1NjYgMC4xNTYzMDEKK3YgLTAuNjI5MDEyIC0yLjYwMzU2NiAwLjE1NjMwMQordiAtMC42MjMzODkgLTIuNTkzODI2IDAuMTU2MzAxCit2IDEuMjk3OTA4IDEuMDgwNDc1IC0wLjAxMDUwNQordiAxLjMwMzc0NSAxLjA4MzEzNCAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS4wODgxNzcgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuNDg0NTc2IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjQ5MDg4MiAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS40OTA4ODAgLTAuMDA2NTE4Cit2IDEuMjY5NDg3IDEuMDgwNDc1IC0wLjAxMDUwNQordiAxLjI2OTQ4NyAxLjA4MDQ0MyAtMC4wMTc1MjIKK3YgMS4yNjk0ODcgMS4wODgxNzcgLTAuMDE3NTIyCit2IDEuMjY5NDg3IDEuNDg0NTc2IC0wLjAxNzUyMgordiAxLjI2OTQ4NyAxLjQ5MjM1MiAtMC4wMTc1MjIKK3YgMS4yNjk0ODcgMS40OTIzMzggLTAuMDEwNTA1Cit2IDEuMjk3OTA5IDEuMDgwNDc1IDAuMDQxNzIzCit2IDEuMjk3OTA5IDEuMDgwNDgxIDAuMDUwOTE1Cit2IDEuMjk3OTA5IDEuMDg4MTc3IDAuMDUwOTE1Cit2IDEuMjk3OTA5IDEuNDg0NTc2IDAuMDUwOTE1Cit2IDEuMjk3OTA5IDEuNDkyMzMwIDAuMDUwOTE1Cit2IDEuMzAzNzQ1IDEuNDkwODgwIDAuMDM4MTM2Cit2IDEuMjY5NDg3IDEuMDgwNDc1IDAuMDQxNzIzCit2IDEuMjY5NDg3IDEuMDgwNDgyIDAuMDUwOTE1Cit2IDEuMjY5NDg3IDEuMDg4MTc3IDAuMDUwOTE1Cit2IDEuMjY5NDg3IDEuNDg0NTc3IDAuMDUwOTE1Cit2IDEuMjY5NDg3IDEuNDkyMzMwIDAuMDUwOTE1Cit2IDEuMjY5NDg3IDEuNDkyMzM5IDAuMDQxNzIyCit2IDEuMzAzNzQ1IDEuNDg0NTc2IDAuMDM4MTM2Cit2IDEuMzAzNzQ1IDEuNDg0NTc2IC0wLjAwNjUxOAordiAxLjMwMzc0NSAxLjA4ODE3NiAwLjAzODEzNgordiAxLjMwMzc0NSAxLjA4ODE3NyAtMC4wMDY1MTgKK3YgMS4zMDM3NDUgMS4wODMxNTggLTAuMDA2NTE4Cit2IDEuMjk3OTA5IDEuMDgwNDQzIC0wLjAxNzUyMgordiAxLjI5NzkwOSAxLjA4ODE3NyAtMC4wMTc1MjIKK3YgMS4yOTc5MDkgMS40ODQ1NzYgLTAuMDE3NTIyCit2IDEuMjk3OTA5IDEuNDkyMzUyIC0wLjAxNzUyMgordiAxLjI5NzkwOSAxLjQ5MjMzOCAtMC4wMTA1MDUKK3YgMS4zMDM3NDUgMS4wODMxNTggMC4wMzgxMzYKK3YgMS4zMDM3NDUgMS4wODMxNzMgMC4wNDM4MjIKK3YgMS4zMDM3NDUgMS4wODgxNzcgMC4wNDM4MjIKK3YgMS4zMDM3NDUgMS40ODQ1NzYgMC4wNDM4MjIKK3YgMS4zMDM3NDUgMS40OTA4ODAgMC4wNDM4MjIKK3YgMS4yOTc5MDkgMS40OTIzMzkgMC4wNDE3MjIKK3YgMS4zMDM3NDUgMS40NjkzODIgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuMTAyODU3IC0wLjAxMDgyOAordiAxLjI2OTQ4NyAxLjQ2OTM4MiAtMC4wMTc1MjIKK3YgMS4yNjk0ODcgMS4xMDI4NTcgLTAuMDE3NTIyCit2IDEuMzAzNzQ1IDEuMTAyODU3IDAuMDQzODIyCit2IDEuMzAzNzQ1IDEuNDY5MzgyIDAuMDQzODIyCit2IDEuMjY5NDg3IDEuMTAyODU3IDAuMDUwOTE1Cit2IDEuMjY5NDg3IDEuNDY5MzgzIDAuMDUwOTE1Cit2IDEuMzAzNzQ1IDEuNDY5MzgyIDAuMDM4MTM2Cit2IDEuMzAzNzQ1IDEuMTAyODU2IDAuMDM4MTM2Cit2IDEuMzAzNzQ1IDEuMTAyODU3IC0wLjAwNjUxOAordiAxLjMwMzc0NSAxLjQ2OTM4MiAtMC4wMDY1MTgKK3YgMS4yOTc5MDkgMS40NjkzODIgLTAuMDE3NTIyCit2IDEuMjk3OTA5IDEuMTAyODU3IC0wLjAxNzUyMgordiAxLjI5NzkwOSAxLjEwMjg1NyAwLjA1MDkxNQordiAxLjI5NzkwOSAxLjQ2OTM4MiAwLjA1MDkxNQordiAxLjI5NzkwOSAxLjQ5MjMzOSAwLjAyMDc3MAordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjQ4NDU3NiAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjA4ODE3NyAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAyMDIyMgordiAxLjI5NzkwOCAxLjA4MDQ3NSAwLjAyMDc3MAordiAxLjMwMzc0NSAxLjQ2OTM4MiAwLjAyMDIyMgordiAxLjI2OTQ4NyAxLjQ5MjMzOSAwLjAyMDc3MAordiAxLjI2OTQ4NyAxLjA4MDQ3NSAwLjAyMDc3MAordiAxLjMwMzc0NSAxLjEwMjg1NyAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjI4NTY3MCAtMC4wMTA4MjgKK3YgMS4yNjk0ODcgMS4yODU2NzAgLTAuMDE3NTIyCit2IDEuMzAzNzQ1IDEuMjg1NjcwIDAuMDQzODIyCit2IDEuMjY5NDg3IDEuMjg1NjcxIDAuMDUwOTE1Cit2IDEuMzAzNzQ1IDEuMjg1NjcwIDAuMDM4MTM2Cit2IDEuMzAzNzQ1IDEuMjg1NjcwIC0wLjAwNjUxOAordiAxLjI5NzkwOSAxLjI4NTY3MCAtMC4wMTc1MjIKK3YgMS4yOTc5MDkgMS4yODU2NzAgMC4wNTA5MTUKK3YgMS4zMDM3NDUgMS4yODU2NzAgMC4wMjAyMjIKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IC0wLjAwNjU0OQordiAxLjMwMzc0NSAtMC4yMjE2ODAgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IC0wLjIxNjYzNyAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgLTAuMjE2NjM3IC0wLjAwNjU0OQordiAxLjI5NzkwOCAtMC4yMjQzMzkgLTAuMDEwNTM2Cit2IDEuMjY5NDg2IC0wLjIyNDMzOSAtMC4wMTA1MzYKK3YgMS4yNjk0ODcgLTAuMjI0MzcxIC0wLjAxNzU1MwordiAxLjI5NzkwOCAtMC4yMjQzNzEgLTAuMDE3NTUzCit2IDEuMjY5NDg3IC0wLjIxNjYzOCAtMC4wMTc1NTMKK3YgMS4yOTc5MDggLTAuMjE2NjM4IC0wLjAxNzU1MwordiAxLjI5NzkwOCAtMC4yMDE5NTggLTAuMDE3NTUzCit2IDEuMjY5NDg3IC0wLjIwMTk1OCAtMC4wMTc1NTMKK3YgMS4yOTc5MDkgMC42NjQ0MTUgLTAuMDE3NTUzCit2IDEuMjY5NDg3IDAuNjY0NDE1IC0wLjAxNzU1MwordiAxLjI2OTQ4NyAwLjY3MTgyOSAtMC4wMTc1NTMKK3YgMS4yOTc5MDkgMC42NzE4MjkgLTAuMDE3NTUzCit2IDEuMjY5NDg3IDAuNjcxODE1IC0wLjAxMDUzNgordiAxLjI5NzkwOSAwLjY3MTgxNSAtMC4wMTA1MzYKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IDAuMDM4MTA2Cit2IDEuMzAzNzQ1IC0wLjIxNjYzOCAwLjAzODEwNgordiAxLjMwMzc0NSAtMC4yMTY2MzcgMC4wNDQwMzkKK3YgMS4zMDM3NDUgLTAuMjIxNjYxIDAuMDQ0MDM5Cit2IDEuMjk3OTA4IC0wLjIyNDMzOSAwLjA0MTY5MgordiAxLjI5NzkwOSAtMC4yMjQzNTIgMC4wNTExNzQKK3YgMS4yNjk0ODcgLTAuMjI0MzUxIDAuMDUxMTc0Cit2IDEuMjY5NDg2IC0wLjIyNDMzOSAwLjA0MTY5MgordiAxLjI5NzkwOSAtMC4yMTY2MzcgMC4wNTExNzQKK3YgMS4yNjk0ODcgLTAuMjE2NjM3IDAuMDUxMTc0Cit2IDEuMjY5NDg3IC0wLjIwMTk1NyAwLjA1MTE3NAordiAxLjI5NzkwOSAtMC4yMDE5NTcgMC4wNTExNzQKK3YgMS4yOTc5MDkgMC42NjQ0MTUgMC4wNTExNzQKK3YgMS4yOTc5MDkgMC42NzE4MDYgMC4wNTExNzQKK3YgMS4yNjk0ODcgMC42NzE4MDYgMC4wNTExNzQKK3YgMS4yNjk0ODcgMC42NjQ0MTUgMC4wNTExNzQKK3YgMS4yOTc5MDkgMC42NzE4MTUgMC4wNDE2OTIKK3YgMS4yNjk0ODcgMC42NzE4MTUgMC4wNDE2OTIKK3YgMS4zMDM3NDUgMC42NjQ0MTUgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NjQ0MTUgMC4wMzgxMDYKK3YgMS4zMDM3NDUgMC42NzAzNTcgMC4wMzgxMDYKK3YgMS4zMDM3NDUgMC42NzAzNTYgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NjQ0MTUgLTAuMDA2NTQ5Cit2IDEuMzAzNzQ1IDAuNjY0NDE1IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjY3MDM1OCAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgMC42NzAzNTcgLTAuMDA2NTQ5Cit2IDEuMzAzNzQ1IC0wLjIwMTk1NyAwLjA0NDAzOQordiAxLjMwMzc0NSAtMC4yMDE5NTggMC4wMzgxMDYKK3YgMS4zMDM3NDUgLTAuMjAxOTU3IC0wLjAwNjU0OQordiAxLjMwMzc0NSAtMC4yMDE5NTcgLTAuMDEwODU4Cit2IDEuMjk3OTA5IDAuNjQ4ODU5IC0wLjAxNzU1MwordiAxLjMwMzc0NSAwLjY0ODg1OSAtMC4wMTA4NTgKK3YgMS4yNjk0ODcgMC42NDg4NTkgLTAuMDE3NTUzCit2IDEuMjY5NDg3IDAuNjQ4ODYwIDAuMDUxMTc0Cit2IDEuMjk3OTA5IDAuNjQ4ODU5IDAuMDUxMTc0Cit2IDEuMzAzNzQ1IDAuNjQ4ODU5IDAuMDQ0MDM5Cit2IDEuMzAzNzQ1IDAuNjQ4ODU5IDAuMDM4MTA2Cit2IDEuMzAzNzQ1IDAuNjQ4ODU5IC0wLjAwNjU0OQordiAxLjI2OTQ4NyAtMC4wNjAxNTUgLTAuMDE3NTUzCit2IDEuMjk3OTA4IC0wLjA2MDE1NSAtMC4wMTc1NTMKK3YgMS4zMDM3NDUgLTAuMDYwMTU1IDAuMDM4MTA2Cit2IDEuMzAzNzQ1IC0wLjA2MDE1NSAtMC4wMTA4NTgKK3YgMS4yOTc5MDkgMC41MDcwNTYgMC4wNTExNzQKK3YgMS4yNjk0ODcgMC41MDcwNTcgMC4wNTExNzQKK3YgMS4zMDM3NDUgMC41MDcwNTYgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC41MDcwNTYgLTAuMDA2NTQ5Cit2IDEuMjY5NDg3IDAuNTA3MDU2IC0wLjAxNzU1MwordiAxLjI5NzkwOSAwLjUwNzA1NiAtMC4wMTc1NTMKK3YgMS4zMDM3NDUgMC41MDcwNTYgMC4wMzgxMDYKK3YgMS4zMDM3NDUgMC41MDcwNTYgLTAuMDEwODU4Cit2IDEuMjk3OTA5IC0wLjA2MDE1NCAwLjA1MTE3NAordiAxLjI2OTQ4NyAtMC4wNjAxNTQgMC4wNTExNzQKK3YgMS4zMDM3NDUgLTAuMDYwMTU1IDAuMDQ0MDM5Cit2IDEuMzAzNzQ1IC0wLjA2MDE1NSAtMC4wMDY1NDkKK3YgMS4yNjk0ODYgLTAuMjI0MzM5IDAuMDE1NTc4Cit2IDEuMzAzNzQ1IDAuNjY0NDE1IDAuMDE1Nzc4Cit2IDEuMzAzNzQ1IDAuNjcwMzU3IDAuMDE1Nzc4Cit2IDEuMjk3OTA5IDAuNjcxODE1IDAuMDE1NTc4Cit2IDEuMzAzNzQ1IC0wLjIyMTY1NyAwLjAxNTc3OAordiAxLjI5NzkwOCAtMC4yMjQzMzkgMC4wMTU1NzgKK3YgMS4zMDM3NDUgMC42NDg4NTkgMC4wMTU3NzgKK3YgMS4zMDM3NDUgLTAuMjAxOTU3IDAuMDE1Nzc4Cit2IDEuMzAzNzQ1IC0wLjIxNjYzNyAwLjAxNTc3OAordiAxLjI2OTQ4NyAwLjY3MTgxNSAwLjAxNTU3OAordiAxLjMwMzc0NSAtMC4wNjAxNTUgMC4wMTU3NzgKK3YgMS4zMDM3NDUgMC41MDcwNTYgMC4wMTU3NzgKK3YgMS4yOTU5MzggMS4wODA0NzUgLTAuMDEwNTA1Cit2IDEuMjk1OTM4IDEuMDgwNDgxIDAuMDUwOTE1Cit2IDEuMjk1OTM4IDEuMDg4MTc3IDAuMDUwOTE1Cit2IDEuMjk1OTM4IDEuNDg0NTc2IDAuMDUwOTE1Cit2IDEuMjk1OTM4IDEuNDkyMzMwIDAuMDUwOTE1Cit2IDEuMjk1OTM4IDEuNDkyMzM5IDAuMDQxNzIyCit2IDEuMjk1OTM4IDEuMTAyODU3IC0wLjAxNzUyMgordiAxLjI5NTkzOCAxLjQ2OTM4MiAwLjA1MDkxNQordiAxLjI5NTkzOCAxLjQ5MjMzOSAwLjAyMDc3MAordiAxLjI5NTkzOCAxLjI4NTY3MCAwLjA1MDkxNQordiAxLjI5NTkzOCAtMC4yMjQzMzkgLTAuMDEwNTM2Cit2IDEuMjk1OTM4IC0wLjIwMTk1OCAtMC4wMTc1NTMKK3YgMS4yOTU5MzggLTAuMjI0MzUyIDAuMDUxMTc0Cit2IDEuMjk1OTM4IC0wLjIxNjYzNyAwLjA1MTE3NAordiAxLjI5NTkzOCAwLjY3MTgwNiAwLjA1MTE3NAordiAxLjI5NTkzOCAwLjY2NDQxNSAwLjA1MTE3NAordiAxLjI5NTkzOCAwLjY3MTgxNSAwLjA0MTY5MgordiAxLjI5NTkzOCAwLjY0ODg1OSAwLjA1MTE3NAordiAxLjI5NTkzOCAxLjA4MDQ0MyAtMC4wMTc1MjIKK3YgMS4yOTU5MzggMS4wODgxNzcgLTAuMDE3NTIyCit2IDEuMjk1OTM4IDEuNDg0NTc2IC0wLjAxNzUyMgordiAxLjI5NTkzOCAxLjQ5MjM1MiAtMC4wMTc1MjIKK3YgMS4yOTU5MzggMS40OTIzMzggLTAuMDEwNTA1Cit2IDEuMjk1OTM4IDEuMDgwNDc1IDAuMDQxNzIzCit2IDEuMjk1OTM4IDEuNDY5MzgyIC0wLjAxNzUyMgordiAxLjI5NTkzOCAxLjEwMjg1NyAwLjA1MDkxNQordiAxLjI5NTkzOCAxLjA4MDQ3NSAwLjAyMDc3MAordiAxLjI5NTkzOCAxLjI4NTY3MCAtMC4wMTc1MjIKK3YgMS4yOTU5MzggLTAuMjI0MzcxIC0wLjAxNzU1MwordiAxLjI5NTkzOCAtMC4yMTY2MzggLTAuMDE3NTUzCit2IDEuMjk1OTM4IDAuNjY0NDE1IC0wLjAxNzU1MwordiAxLjI5NTkzOCAwLjY3MTgyOSAtMC4wMTc1NTMKK3YgMS4yOTU5MzggMC42NzE4MTUgLTAuMDEwNTM2Cit2IDEuMjk1OTM4IC0wLjIyNDMzOSAwLjA0MTY5MgordiAxLjI5NTkzOCAtMC4yMDE5NTcgMC4wNTExNzQKK3YgMS4yOTU5MzggMC42NDg4NTkgLTAuMDE3NTUzCit2IDEuMjk1OTM4IDAuNTA3MDU2IC0wLjAxNzU1MwordiAxLjI5NTkzOCAtMC4wNjAxNTQgMC4wNTExNzQKK3YgMS4yOTU5MzggLTAuMDYwMTU1IC0wLjAxNzU1MwordiAxLjI5NTkzOCAwLjUwNzA1NiAwLjA1MTE3NAordiAxLjI5NTkzOCAwLjY3MTgxNSAwLjAxNTU3OAordiAxLjI5NTkzOCAtMC4yMjQzMzkgMC4wMTU1NzgKK3YgMS4yNjk0ODcgMS4wODA0NDMgLTAuMDE3NTIyCit2IDEuMjk1OTM4IDEuMDgwNDQzIC0wLjAxNzUyMgordiAxLjI2OTQ4NyAxLjA4MDQ0MyAtMC4wMTc1MjIKK3YgMS4yNjk0ODcgMS40OTIzNTIgLTAuMDE3NTIyCit2IDEuMjk1OTM4IDEuNDkyMzUyIC0wLjAxNzUyMgordiAxLjI2OTQ4NyAxLjQ5MjM1MiAtMC4wMTc1MjIKK3YgMS4yNjk0ODcgMS4wODA0ODIgMC4wNTA5MTUKK3YgMS4yOTU5MzggMS4wODA0ODEgMC4wNTA5MTUKK3YgMS4yNjk0ODcgMS4wODA0ODIgMC4wNTA5MTUKK3YgMS4yNjk0ODcgMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4yOTU5MzggMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4yNjk0ODcgMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4zMDM3NDUgMS4wODMxMzQgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuMDgzMTU4IC0wLjAwNjUxOAordiAxLjMwMzc0NSAxLjA4MzEzNCAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS4wODgxNzcgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuMDgzMTM0IC0wLjAxMDgyOAordiAxLjI5NzkwOSAxLjA4MDQ0MyAtMC4wMTc1MjIKK3YgMS4yOTc5MDkgMS4wODA0NDMgLTAuMDE3NTIyCit2IDEuMzAzNzQ1IDEuMDg4MTc3IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjI4NTY3MCAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS40OTA4ODIgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuNDg0NTc2IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjQ5MDg4MiAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS40OTA4ODAgLTAuMDA2NTE4Cit2IDEuMzAzNzQ1IDEuNDkwODgyIC0wLjAxMDgyOAordiAxLjI5NzkwOSAxLjQ5MjM1MiAtMC4wMTc1MjIKK3YgMS4yOTc5MDkgMS40OTIzNTIgLTAuMDE3NTIyCit2IDEuMzAzNzQ1IDEuNDkwODgwIC0wLjAwNjUxOAordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAzODEzNgordiAxLjMwMzc0NSAxLjA4MzE3MyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAzODEzNgordiAxLjMwMzc0NSAxLjA4MzE3MyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjA4ODE3NyAwLjA0MzgyMgordiAxLjI5NzkwOSAxLjA4MDQ4MSAwLjA1MDkxNQordiAxLjMwMzc0NSAxLjA4MzE3MyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjEwMjg1NyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjI4NTY3MCAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjEwMjg1NyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ4NDU3NiAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ4NDU3NiAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAzODEzNgordiAxLjI5NzkwOSAxLjQ5MjMzMCAwLjA1MDkxNQordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAtMC4wMDY1MTgKK3YgMS4zMDM3NDUgMS40OTA4ODAgLTAuMDA2NTE4Cit2IDEuMzAzNzQ1IDEuMDgzMTU4IDAuMDIwMjIyCit2IDEuMzAzNzQ1IDEuMDgzMTU4IC0wLjAwNjUxOAordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjQ2OTM4MiAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS40NjkzODIgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuMDg4MTc3IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjEwMjg1NyAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS4wODgxNzcgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuNDg0NTc2IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjQ4NDU3NiAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ2OTM4MiAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ4NDU3NiAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjEwMjg1NyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjA4ODE3NyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjEwMjg1NyAwLjA0MzgyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAzODEzNgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjQ5MDg4MCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAzODEzNgordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAyMDIyMgordiAxLjMwMzc0NSAxLjA4MzE1OCAwLjAzODEzNgordiAxLjMwMzc0NSAxLjQ2OTM4MiAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS40NjkzODIgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuMTAyODU3IC0wLjAxMDgyOAordiAxLjMwMzc0NSAxLjI4NTY3MCAtMC4wMTA4MjgKK3YgMS4zMDM3NDUgMS4xMDI4NTcgLTAuMDEwODI4Cit2IDEuMzAzNzQ1IDEuNDY5MzgyIDAuMDQzODIyCit2IDEuMzAzNzQ1IDEuMjg1NjcwIDAuMDQzODIyCit2IDEuMzAzNzQ1IDEuNDY5MzgyIDAuMDQzODIyCit2IDEuMjY5NDg3IC0wLjIyNDM3MSAtMC4wMTc1NTMKK3YgMS4yOTU5MzggLTAuMjI0MzcxIC0wLjAxNzU1MwordiAxLjI2OTQ4NyAtMC4yMjQzNzEgLTAuMDE3NTUzCit2IDEuMjY5NDg3IDAuNjcxODI5IC0wLjAxNzU1MwordiAxLjI5NTkzOCAwLjY3MTgyOSAtMC4wMTc1NTMKK3YgMS4yNjk0ODcgMC42NzE4MjkgLTAuMDE3NTUzCit2IDEuMjY5NDg3IC0wLjIyNDM1MSAwLjA1MTE3NAordiAxLjI5NTkzOCAtMC4yMjQzNTIgMC4wNTExNzQKK3YgMS4yNjk0ODcgLTAuMjI0MzUxIDAuMDUxMTc0Cit2IDEuMjY5NDg3IDAuNjcxODA2IDAuMDUxMTc0Cit2IDEuMjk1OTM4IDAuNjcxODA2IDAuMDUxMTc0Cit2IDEuMjY5NDg3IDAuNjcxODA2IDAuMDUxMTc0Cit2IDEuMzAzNzQ1IC0wLjIyMTY4MCAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IC0wLjAwNjU0OQordiAxLjMwMzc0NSAtMC4yMjE2ODAgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IC0wLjIxNjYzNyAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgLTAuMjIxNjgwIC0wLjAxMDg1OAordiAxLjI5NzkwOCAtMC4yMjQzNzEgLTAuMDE3NTUzCit2IDEuMjk3OTA4IC0wLjIyNDM3MSAtMC4wMTc1NTMKK3YgMS4zMDM3NDUgLTAuMjE2NjM3IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjY3MDM1OCAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgMC42NjQ0MTUgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IDAuNjcwMzU4IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjY3MDM1NyAtMC4wMDY1NDkKK3YgMS4zMDM3NDUgMC42NzAzNTggLTAuMDEwODU4Cit2IDEuMjk3OTA5IDAuNjcxODI5IC0wLjAxNzU1MwordiAxLjI5NzkwOSAwLjY3MTgyOSAtMC4wMTc1NTMKK3YgMS4zMDM3NDUgMC42NzAzNTcgLTAuMDA2NTQ5Cit2IDEuMzAzNzQ1IC0wLjIyMTY1NyAwLjAzODEwNgordiAxLjMwMzc0NSAtMC4yMjE2NjEgMC4wNDQwMzkKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IDAuMDM4MTA2Cit2IDEuMzAzNzQ1IC0wLjIyMTY2MSAwLjA0NDAzOQordiAxLjMwMzc0NSAtMC4yMTY2MzcgMC4wNDQwMzkKK3YgMS4yOTc5MDkgLTAuMjI0MzUyIDAuMDUxMTc0Cit2IDEuMzAzNzQ1IC0wLjIyMTY2MSAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY2NDQxNSAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY3MDM1NiAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY2NDQxNSAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY3MDM1NiAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY3MDM1NyAwLjAzODEwNgordiAxLjI5NzkwOSAwLjY3MTgwNiAwLjA1MTE3NAordiAxLjMwMzc0NSAwLjY3MDM1NiAwLjA0NDAzOQordiAxLjMwMzc0NSAwLjY3MDM1NyAwLjAxNTc3OAordiAxLjMwMzc0NSAwLjY3MDM1NyAtMC4wMDY1NDkKK3YgMS4zMDM3NDUgMC42NzAzNTcgLTAuMDA2NTQ5Cit2IDEuMzAzNzQ1IC0wLjIyMTY1NyAtMC4wMDY1NDkKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IDAuMDE1Nzc4Cit2IDEuMzAzNzQ1IC0wLjIyMTY1NyAtMC4wMDY1NDkKK3YgMS4zMDM3NDUgLTAuMjE2NjM3IC0wLjAxMDg1OAordiAxLjMwMzc0NSAtMC4yMDE5NTcgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IC0wLjIxNjYzNyAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgMC42NDg4NTkgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IDAuNjY0NDE1IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjY0ODg1OSAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgMC42NjQ0MTUgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NDg4NTkgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NjQ0MTUgMC4wNDQwMzkKK3YgMS4zMDM3NDUgLTAuMjAxOTU3IDAuMDQ0MDM5Cit2IDEuMzAzNzQ1IC0wLjIxNjYzNyAwLjA0NDAzOQordiAxLjMwMzc0NSAtMC4yMDE5NTcgMC4wNDQwMzkKK3YgMS4zMDM3NDUgLTAuMDYwMTU1IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjUwNzA1NiAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgLTAuMDYwMTU1IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjUwNzA1NiAwLjA0NDAzOQordiAxLjMwMzc0NSAtMC4wNjAxNTUgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC41MDcwNTYgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NDg4NTkgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IDAuNTA3MDU2IC0wLjAxMDg1OAordiAxLjMwMzc0NSAwLjUwNzA1NiAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgLTAuMjAxOTU3IDAuMDQ0MDM5Cit2IDEuMzAzNzQ1IC0wLjA2MDE1NSAwLjA0NDAzOQordiAxLjMwMzc0NSAtMC4wNjAxNTUgMC4wNDQwMzkKK3YgMS4zMDM3NDUgLTAuMjAxOTU3IC0wLjAxMDg1OAordiAxLjMwMzc0NSAtMC4wNjAxNTUgLTAuMDEwODU4Cit2IDEuMzAzNzQ1IC0wLjIwMTk1NyAtMC4wMTA4NTgKK3YgMS4zMDM3NDUgMC42NDg4NTkgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC41MDcwNTYgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NDg4NTkgMC4wNDQwMzkKK3YgMS4zMDM3NDUgMC42NzAzNTcgMC4wMzgxMDYKK3YgMS4zMDM3NDUgMC42NzAzNTcgMC4wMzgxMDYKK3YgMS4zMDM3NDUgMC42NzAzNTcgMC4wMTU3NzgKK3YgMS4zMDM3NDUgLTAuMjIxNjU3IDAuMDM4MTA2Cit2IDEuMzAzNzQ1IC0wLjIyMTY1NyAwLjAxNTc3OAordiAxLjMwMzc0NSAtMC4yMjE2NTcgMC4wMzgxMDYKK3YgMS4yOTc5MDkgMS4wODA0NDMgLTAuMDE3NTIyCit2IDEuMjk1OTM4IDEuMDgwNDQzIC0wLjAxNzUyMgordiAxLjI5NzkwOSAxLjA4MDQ0MyAtMC4wMTc1MjIKK3YgMS4yOTc5MDkgMS40OTIzNTIgLTAuMDE3NTIyCit2IDEuMjk1OTM4IDEuNDkyMzUyIC0wLjAxNzUyMgordiAxLjI5NzkwOSAxLjQ5MjM1MiAtMC4wMTc1MjIKK3YgMS4yOTU5MzggMS4wODA0ODEgMC4wNTA5MTUKK3YgMS4yOTU5MzggMS4wODA0ODEgMC4wNTA5MTUKK3YgMS4yOTc5MDkgMS4wODA0ODEgMC4wNTA5MTUKK3YgMS4yOTU5MzggMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4yOTU5MzggMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4yOTc5MDkgMS40OTIzMzAgMC4wNTA5MTUKK3YgMS4yOTc5MDggLTAuMjI0MzcxIC0wLjAxNzU1MwordiAxLjI5NTkzOCAtMC4yMjQzNzEgLTAuMDE3NTUzCit2IDEuMjk3OTA4IC0wLjIyNDM3MSAtMC4wMTc1NTMKK3YgMS4yOTc5MDkgMC42NzE4MjkgLTAuMDE3NTUzCit2IDEuMjk1OTM4IDAuNjcxODI5IC0wLjAxNzU1MwordiAxLjI5NzkwOSAwLjY3MTgyOSAtMC4wMTc1NTMKK3YgMS4yOTU5MzggLTAuMjI0MzUyIDAuMDUxMTc0Cit2IDEuMjk1OTM4IC0wLjIyNDM1MiAwLjA1MTE3NAordiAxLjI5NzkwOSAtMC4yMjQzNTIgMC4wNTExNzQKK3YgMS4yOTU5MzggMC42NzE4MDYgMC4wNTExNzQKK3YgMS4yOTU5MzggMC42NzE4MDYgMC4wNTExNzQKK3YgMS4yOTc5MDkgMC42NzE4MDYgMC4wNTExNzQKK3YgMC42MDc2MjQgMi4wNTk2NTkgLTAuMTM4OTQ3Cit2IDAuNTk1ODg3IDIuMDE5MjExIC0wLjEzODk0NwordiAwLjU2NTIxNiAxLjk5MDQxMiAtMC4xMzg5NDcKK3YgMC41MjI0MjIgMS45Nzk0NDAgLTAuMTM4OTQ3Cit2IDAuNDc5NjI3IDEuOTkwNDEyIC0wLjEzODk0NwordiAwLjQ0ODk1NiAyLjAxOTIxMiAtMC4xMzg5NDcKK3YgMC40MzcyMTkgMi4wNTk2NjAgLTAuMTM4OTQ3Cit2IDAuNjA3NjI0IDIuMDU5NjU5IC0wLjA5NDMxNQordiAwLjU5NTg4NyAyLjAxOTIxMSAtMC4wOTQzMTUKK3YgMC41NjUyMTYgMS45OTA0MTIgLTAuMDk0MzE1Cit2IDAuNTIyNDIxIDEuOTc5NDQwIC0wLjA5NDMxNQordiAwLjQ3OTYyNyAxLjk5MDQxMiAtMC4wOTQzMTUKK3YgMC40NDg5NTYgMi4wMTkyMTIgLTAuMDk0MzE1Cit2IDAuNDM3MjE5IDIuMDU5NjYwIC0wLjA5NDMxNQordiAwLjQzNzIxOCAyLjA3MDcyNiAtMC4xMzg5NDcKK3YgMC42MDc2MjQgMi4wNzA3MjUgLTAuMDk0MzE1Cit2IDAuNjA3NjI0IDIuMDcwNzI1IC0wLjEzODk0NwordiAwLjQ0MzI3MiAyLjA3MDcyNiAtMC4wODg1NTYKK3YgMC40MzcyMTggMi4xNTQ4NzMgLTAuMDk0MzE1Cit2IDAuNjA3NjI0IDIuMTU0ODczIC0wLjA5NDMxNQordiAwLjUyMjQyMiAyLjE1NDg3MyAtMC4wODg1NTYKK3YgMC42MDc2MjQgMi4xNTQ4NzMgLTAuMTM4OTQ3Cit2IDAuNDM3MjE4IDIuMTU0ODczIC0wLjEzODk0NwordiAwLjQ4NDc0MSAyLjAwOTM4NiAtMC4wODg1NTYKK3YgMC40NTc5NTEgMi4wMzQ4OTMgLTAuMDg4NTU2Cit2IDAuNDQ3NzU5IDIuMDcwNzI2IC0wLjA4ODU1NgordiAwLjQ1Nzk1MyAyLjEwNjYxNyAtMC4wODg1NTYKK3YgMC40ODQ3NDEgMi4xMzIxMjkgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMTQxODQ4IC0wLjA4ODU1NgordiAwLjU2MDA2NSAyLjEzMjEzMCAtMC4wODg1NTYKK3YgMC41ODY4NTMgMi4xMDY2MTkgLTAuMDg4NTU2Cit2IDAuNTk3MDYzIDIuMDcwNzI1IC0wLjA4ODU1NgordiAwLjU4Njg1MyAyLjAzNDg5NSAtMC4wODg1NTYKK3YgMC41NjAwNjIgMi4wMDkzODYgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDEuOTk5Njc5IC0wLjA4ODU1NgordiAwLjQ4NzQ0NSAyLjAxMzc5MSAtMC4wODg1NTYKK3YgMC40NjI1NzcgMi4wMzc0NjkgLTAuMDg4NTU2Cit2IDAuNDUzMTE4IDIuMDcwNzI2IC0wLjA4ODU1NgordiAwLjQ2MjU3NyAyLjEwNDA0NyAtMC4wODg1NTYKK3YgMC40ODc0NDQgMi4xMjc3MjUgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMTM2NzQ2IC0wLjA4ODU1NgordiAwLjU1NzM2MSAyLjEyNzcyNSAtMC4wODg1NTYKK3YgMC41ODIyMjggMi4xMDQwNDYgLTAuMDg4NTU2Cit2IDAuNTkxNzA2IDIuMDcwNzI1IC0wLjA4ODU1NgordiAwLjU4MjIyOCAyLjAzNzQ2OSAtMC4wODg1NTYKK3YgMC41NTczNjAgMi4wMTM3OTEgLTAuMDg4NTU1Cit2IDAuNTIyNDIyIDIuMDA0NzgwIC0wLjA4ODU1NgordiAwLjQ3NzEyMyAyLjE1NDg3MyAtMC4wODg1NTYKK3YgMC41Njc2ODEgMi4xNTQ4NzMgLTAuMDg4NTU2Cit2IDAuNjA3NjI0IDIuMTEyNzk5IC0wLjA5NDMxNQordiAwLjQzNzIxOCAyLjExMjgwMCAtMC4xMzg5NDcKK3YgMC40NDMyNzIgMi4xMTA5OTUgLTAuMDg4NTU2Cit2IDAuNjA3NjI0IDIuMTEyNzk5IC0wLjEzODk0NwordiAwLjYwMTQ1OSAyLjA1OTY1OSAtMC4wODg1NTYKK3YgMC41OTIzNzcgMi4wMjUzMDQgLTAuMDg4NTU2Cit2IDAuNTYzNTkxIDEuOTk2Mzk2IC0wLjA4ODU1NgordiAwLjUyMjQyMSAxLjk4NTQxMCAtMC4wODg1NTYKK3YgMC40ODEyNDIgMS45OTY0MDMgLTAuMDg4NTU2Cit2IDAuNDUyNDU4IDIuMDI1MzE3IC0wLjA4ODU1NgordiAwLjQ0MzM4NCAyLjA1OTY2MCAtMC4wODg1NTYKK3YgMC42MDE1NzAgMi4wNzA3MjUgLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMDcwNzI2IC0wLjA5NDMxNQordiAwLjQ0MzI3MiAyLjE1NDg3MyAtMC4wODg1NTYKK3YgMC42MDE1NzAgMi4xNTQ4NzMgLTAuMDg4NTU2Cit2IDAuNjAxNTcwIDIuMTEwOTk4IC0wLjA4ODU1NgordiAwLjQzNzIxOCAyLjExMjgwMCAtMC4wOTQzMTUKK3YgMC40NTc5NTIgMi4xNTQ4NzMgLTAuMDg4NTU2Cit2IDAuNTg2ODUzIDIuMTU0ODczIC0wLjA4ODU1NgordiAwLjQ2NjUzNiAyLjAzOTYzNiAtMC4wNjc0NDkKK3YgMC40ODk3MTkgMi4wMTc1NjIgLTAuMDY3NDQ5Cit2IDAuNTIyNDIxIDIuMDA5MTM3IC0wLjA2NzQ0OQordiAwLjU1NTA4NSAyLjAxNzU2MSAtMC4wNjc0NDkKK3YgMC41NzgyNzAgMi4wMzk2MzggLTAuMDY3NDQ5Cit2IDAuNTg3MTMwIDIuMDcwNzI2IC0wLjA2NzQ0OQordiAwLjU3ODI2OSAyLjEwMTg4MCAtMC4wNjc0NDkKK3YgMC41NTUwODUgMi4xMjM5NTYgLTAuMDY3NDQ5Cit2IDAuNTIyNDIxIDIuMTMyMzg5IC0wLjA2NzQ0OAordiAwLjQ4OTcxOCAyLjEyMzk1NiAtMC4wNjc0NDkKK3YgMC40NjY1MzcgMi4xMDE4ODIgLTAuMDY3NDQ5Cit2IDAuNDU3NjkyIDIuMDcwNzI2IC0wLjA2NzQ0OQordiAwLjQ3Njk4NyAyLjA0NTQwMCAtMC4wNzAwODcKK3YgMC40OTU3NzAgMi4wMjc1MTUgLTAuMDcwMDg3Cit2IDAuNTIyNDIwIDIuMDIwNjQ5IC0wLjA3MDA4NgordiAwLjU0OTAzMiAyLjAyNzUxMyAtMC4wNzAwODcKK3YgMC41Njc4MjIgMi4wNDU0MDMgLTAuMDcwMDg3Cit2IDAuNTc1MDM5IDIuMDcwNzI5IC0wLjA3MDA4NwordiAwLjU2NzgxOCAyLjA5NjExNyAtMC4wNzAwODcKK3YgMC41NDkwMzEgMi4xMTQwMDUgLTAuMDcwMDg2Cit2IDAuNTIyNDE5IDIuMTIwODc2IC0wLjA3MDA4NgordiAwLjQ5NTc3MSAyLjExNDAwNCAtMC4wNzAwODcKK3YgMC40NzY5OTAgMi4wOTYxMjAgLTAuMDcwMDg3Cit2IDAuNDY5NzgyIDIuMDcwNzI5IC0wLjA3MDA4NwordiAwLjQ5NDIwMSAyLjA1NDg5NCAtMC4wNzM2MTUKK3YgMC41MDU3MzcgMi4wNDM5MTAgLTAuMDczNjE1Cit2IDAuNTIyNDE3IDIuMDM5NjEyIC0wLjA3MzYxNQordiAwLjUzOTA2MyAyLjA0MzkwNiAtMC4wNzM2MTUKK3YgMC41NTA2MTEgMi4wNTQ5MDEgLTAuMDczNjE1Cit2IDAuNTU1MTIzIDIuMDcwNzMzIC0wLjA3MzYxNQordiAwLjU1MDYwNCAyLjA4NjYyMiAtMC4wNzM2MTUKK3YgMC41MzkwNjAgMi4wOTc2MTQgLTAuMDczNjE1Cit2IDAuNTIyNDE2IDIuMTAxOTEyIC0wLjA3MzYxNQordiAwLjUwNTc0MCAyLjA5NzYxMSAtMC4wNzM2MTUKK3YgMC40OTQyMDggMi4wODY2MzAgLTAuMDczNjE1Cit2IDAuNDg5Njk1IDIuMDcwNzMzIC0wLjA3MzYxNQordiAwLjUyMjQxNyAyLjA1NDg5NyAtMC4wNzM2MTUKK3YgMC41MjI0MTcgMi4wNzA3MzMgLTAuMDczNjE1Cit2IDAuNTIyNDE3IDIuMDg2NjI2IC0wLjA3MzYxNQordiAwLjQ3MDg4MiAyLjA0MjAzMyAtMC4wNjY2NTEKK3YgMC40OTIyMzUgMi4wMjE3MDEgLTAuMDY2NjUxCit2IDAuNTIyNDIxIDIuMDEzOTI1IC0wLjA2NjY1MQordiAwLjU1MjU2OCAyLjAyMTcwMCAtMC4wNjY2NTEKK3YgMC41NzM5MjUgMi4wNDIwMzUgLTAuMDY2NjUxCit2IDAuNTgyMTAyIDIuMDcwNzI3IC0wLjA2NjY1MQordiAwLjU3MzkyMyAyLjA5OTQ4MyAtMC4wNjY2NTEKK3YgMC41NTI1NjggMi4xMTk4MTcgLTAuMDY2NjUxCit2IDAuNTIyNDIwIDIuMTI3NjAyIC0wLjA2NjY1MQordiAwLjQ5MjIzNSAyLjExOTgxNyAtMC4wNjY2NTEKK3YgMC40NzA4ODQgMi4wOTk0ODYgLTAuMDY2NjUxCit2IDAuNDYyNzIwIDIuMDcwNzI3IC0wLjA2NjY1MQordiAwLjYwNzYyNCAyLjE1Mzg5NyAtMC4wOTQzMTUKK3YgMC41MjI0MjIgMi4xNTM5MTEgLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMTUzODk3IC0wLjEzODk0NwordiAwLjQ3NzMxMyAyLjE1MzkwNyAtMC4wODg1NTYKK3YgMC41Njc0OTEgMi4xNTM5MDcgLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMTUzODk3IC0wLjA5NDMxNQordiAwLjYwNzYyNCAyLjE1Mzg5NyAtMC4xMzg5NDcKK3YgMC42MDE1NzAgMi4xNTM4OTYgLTAuMDg4NTU2Cit2IDAuNDQzMjcyIDIuMTUzODk2IC0wLjA4ODU1NgordiAwLjQ1Nzk1MiAyLjE1Mzg5NCAtMC4wODg1NTYKK3YgMC41ODY4NTMgMi4xNTM4OTQgLTAuMDg4NTU2Cit2IDAuNTIyNDIxIDIuMTU0ODczIC0wLjA5NDMxNQordiAwLjUyMjQyMSAyLjE1NDg3MyAtMC4xMzg5NDcKK3YgMC40NDQwMzQgMi4xNTQ4NzMgLTAuMTM4OTQ3Cit2IDAuNDQ0MDM0IDIuMTU0ODczIC0wLjA5NDMxNQordiAwLjYwMDgwOCAyLjE1NDg3MyAtMC4wOTQzMTUKK3YgMC42MDA4MDggMi4xNTQ4NzMgLTAuMTM4OTQ3Cit2IDAuNTg3MDkwIDIuMTU0ODczIC0wLjEzODk0NwordiAwLjU4NzA5MCAyLjE1NDg3MyAtMC4wOTQzMTUKK3YgMC40NTc3NTIgMi4xNTQ4NzMgLTAuMDk0MzE1Cit2IDAuNDU3NzUyIDIuMTU0ODczIC0wLjEzODk0NwordiAwLjQ3NTUzNiAyLjE1NDg3MyAtMC4wOTQzMTUKK3YgMC40NzU1MzYgMi4xNTQ4NzMgLTAuMTM4OTQ3Cit2IDAuNTY5MzA2IDIuMTU0ODczIC0wLjEzODk0NwordiAwLjU2OTMwNiAyLjE1NDg3MyAtMC4wOTQzMTUKK3YgMC41MjI0MjEgMS45OTM2MzUgLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDEuOTk3MDgwIC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjAwODkwNCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wMTY3NzAgLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMDIwOTA5IC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjAwMDYyNCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMS45ODg3NzUgLTAuMTI4NTc1Cit2IDAuNTIyNDIxIDIuMTM2MDg3IC0wLjEyMzQ3NgordiAwLjUyMjQyMSAyLjEwODgxMiAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4xMTcwOTIgLTAuMTI4NTU2Cit2IDAuNTY1NDMwIDEuOTg5OTE0IC0wLjEyMzQ3NQordiAwLjU5NjI1NSAyLjAxODg1NyAtMC4xMjM0NzUKK3YgMC42MDgwNTAgMi4wNTk1MDggLTAuMTIzNDc2Cit2IDAuNTYwMjA4IDIuMDAzMzc4IC0wLjEyMzQ3NQordiAwLjU4NzIxNCAyLjAyOTAzNyAtMC4xMjM0NzUKK3YgMC41NTg0MzcgMi4wMDYzNjkgLTAuMTI4NTU2Cit2IDAuNTg0MDg4IDIuMDMwNzc3IC0wLjEyODU1NgordiAwLjU1NDQxNiAyLjAxMzAxNyAtMC4xMjM0NzUKK3YgMC41NzcxMTYgMi4wMzQ2MzEgLTAuMTIzNDc1Cit2IDAuNTUyMjQwIDIuMDE2NTk2IC0wLjEyODU1NgordiAwLjU3MzM1OCAyLjAzNjcwMyAtMC4xMjg1NTYKK3YgMC41NDgxMDUgMi4wMjMzOTQgLTAuMTIzNDc1Cit2IDAuNTY2MjE4IDIuMDQwNjQxIC0wLjEyMzQ3NQordiAwLjU0NTkyOCAyLjAyNjk3MyAtMC4xMjg1NTYKK3YgMC41NjI0NjAgMi4wNDI3MTQgLTAuMTI4NTU2Cit2IDAuNTQxNzk1IDIuMDMzNzcxIC0wLjEyMzQ3NQordiAwLjUyMjQyMSAyLjAyODc3NSAtMC4xMjM0NzUKK3YgMC41NTUzMjEgMi4wNDY2NTEgLTAuMTIzNDc1Cit2IDAuNTM5NjE4IDIuMDM3MzUwIC0wLjEyODU1NgordiAwLjU1MTU2MyAyLjA0ODcyNCAtMC4xMjg1NTUKK3YgMC41MzU0ODMgMi4wNDQxNDggLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMDQwNzgxIC0wLjEyMzQ3NQordiAwLjU0NDQyNCAyLjA1MjY2MiAtMC4xMjM0NzUKK3YgMC41NTY1OTMgMi4wMDk0MzkgLTAuMTI4NTU2Cit2IDAuNTgwODc0IDIuMDMyNTU4IC0wLjEyODU1NgordiAwLjU1MDI4MSAyLjAxOTgxNSAtMC4xMjg1NTUKK3YgMC41Njk5NzYgMi4wMzg1NjkgLTAuMTI4NTU2Cit2IDAuNTQzOTcwIDIuMDMwMTkzIC0wLjEyODU1NgordiAwLjU1OTA3OSAyLjA0NDU3OCAtMC4xMjg1NTUKK3YgMC41Mzc2NjAgMi4wNDA1NjkgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMDM2NjQwIC0wLjEyODU1NgordiAwLjU0ODE4MiAyLjA1MDU4OSAtMC4xMjg1NTUKK3YgMC41MzIzMjggMi4wNDkzMzcgLTAuMTI4NTU2Cit2IDAuNTM4OTc2IDIuMDU1NjY2IC0wLjEyODU1NgordiAwLjYwMjI1OSAyLjA2NTAxNSAtMC4xMjg1NzUKK3YgMC41OTEzNjEgMi4wMjY0NDIgLTAuMTI4NTc1Cit2IDAuNTYyNjI2IDEuOTk5MTQzIC0wLjEyODU3NQordiAwLjYwODA1MSAyLjA3MDU5NiAtMC4xMjM0NzUKK3YgMC41NjAyMDggMi4xMjYzNDIgLTAuMTIzNDc1Cit2IDAuNTg3MjE0IDIuMTAwNjg1IC0wLjEyMzQ3NQordiAwLjU5NzQ1NyAyLjA2NTAxNSAtMC4xMjM0NzUKK3YgMC41NTg0MzYgMi4xMjMzNTMgLTAuMTI4NTU2Cit2IDAuNTg0MDg4IDIuMDk4OTQ0IC0wLjEyODU1NgordiAwLjU5MzgzNyAyLjA2NTAxNSAtMC4xMjg1NTYKK3YgMC41NTQ0MTYgMi4xMTY3MDQgLTAuMTIzNDc1Cit2IDAuNTg1NzY4IDIuMDY1MDE1IC0wLjEyMzQ3NgordiAwLjU3NzExNiAyLjA5NTA5MSAtMC4xMjM0NzUKK3YgMC41NTIyNDAgMi4xMTMxMjYgLTAuMTI4NTU2Cit2IDAuNTgxNDIxIDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjU3MzM1NyAyLjA5MzAxOCAtMC4xMjg1NTYKK3YgMC41NDgxMDUgMi4xMDYzMjggLTAuMTIzNDc2Cit2IDAuNTczMTYyIDIuMDY1MDE1IC0wLjEyMzQ3NgordiAwLjU2NjIxOCAyLjA4OTA4MSAtMC4xMjM0NzUKK3YgMC41NDU5MjggMi4xMDI3NTAgLTAuMTI4NTU2Cit2IDAuNTY4ODE1IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjU2MjQ2MCAyLjA4NzAwOCAtMC4xMjg1NTYKK3YgMC41NDE3OTUgMi4wOTU5NTEgLTAuMTIzNDc2Cit2IDAuNTIyNDIxIDIuMTAwOTQ2IC0wLjEyMzQ3NgordiAwLjU2MDU1NiAyLjA2NTAxNSAtMC4xMjM0NzUKK3YgMC41NTUzMjEgMi4wODMwNzAgLTAuMTIzNDc1Cit2IDAuNTM5NjE4IDIuMDkyMzcyIC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjA5NjgwNyAtMC4xMjg1NTYKK3YgMC41NTYyMDkgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNTUxNTYzIDIuMDgwOTk4IC0wLjEyODU1NgordiAwLjUzNTQ4MyAyLjA4NTU3MyAtMC4xMjM0NzUKK3YgMC41NDc5NTAgMi4wNjUwMTUgLTAuMTIzNDc2Cit2IDAuNTQ0NDI0IDIuMDc3MDYwIC0wLjEyMzQ3NgordiAwLjU1NjU5MyAyLjEyMDI4MyAtMC4xMjg1NTYKK3YgMC41ODA4NzQgMi4wOTcxNjQgLTAuMTI4NTU2Cit2IDAuNTkwMTE1IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjU1MDI4MSAyLjEwOTkwNiAtMC4xMjg1NTYKK3YgMC41Nzc1MDkgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNTY5OTc2IDIuMDkxMTUzIC0wLjEyODU1NgordiAwLjU0Mzk3MCAyLjA5OTUyOSAtMC4xMjg1NTYKK3YgMC41NjQ5MDMgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNTU5MDc5IDIuMDg1MTQyIC0wLjEyODU1NgordiAwLjUzNzY2MCAyLjA4OTE1MSAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wOTMwODEgLTAuMTI4NTU2Cit2IDAuNTUyMjk3IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjU0ODE4MiAyLjA3OTEzMyAtMC4xMjg1NTYKK3YgMC41MzIzMjggMi4wODAzODUgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMDgyOTM4IC0wLjEyODU1NgordiAwLjU0MTY0NyAyLjA2NTAxNSAtMC4xMjg1NTYKK3YgMC41Mzg5NzYgMi4wNzQwNTUgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMDc0MDU1IC0wLjEyODU1NgordiAwLjU5MTM2MSAyLjEwMzI4MCAtMC4xMjg1NzYKK3YgMC41NjI2MjYgMi4xMzA1NzkgLTAuMTI4NTc1Cit2IDAuNjA4MDQ5IDIuMTU1NTI4IC0wLjEyODU3NQordiAwLjYwMjI1OSAyLjEwOTQ0NSAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4xMTI3MjAgLTAuMTIzNDc1Cit2IDAuNTc3NDA4IDIuMTU1NTI4IC0wLjEyMzQ3NQordiAwLjU5NTMzNSAyLjEwNTU2NCAtMC4xMjg1NzYKK3YgMC41NjQ5NjkgMi4xMzQ0NDkgLTAuMTI4NTc1Cit2IDAuNTk5Mjk2IDIuMTA3ODUzIC0wLjEyMzQ3NgordiAwLjU2NzAxNyAyLjEzNzc2NCAtMC4xMjM0NzUKK3YgMC41Njg4MjAgMi4xNDA2MTcgLTAuMTI4NTc2Cit2IDAuNTIyNDIxIDIuMTUxNDE0IC0wLjEyODU3NgordiAwLjUzNzE3OSAyLjE1NTUyOCAtMC4xMjM0NzUKK3YgMC41NzI5NTEgMi4xNDcyNjkgLTAuMTIzNDc1Cit2IDAuNTc0OTUyIDIuMTUwNTk5IC0wLjEyODU3NQordiAwLjU1MjcxNCAyLjE1NTUyOCAtMC4xMjg1NzUKK3YgMC41NjM2MDUgMi4xNTU1MjggLTAuMTI4NTc1Cit2IDAuNTc2MDczIDIuMTUyNTM5IC0wLjEyODU3NQordiAwLjU4MTU1OCAyLjE1NTUyOCAtMC4xMjg1NzUKK3YgMC41ODY3MTkgMi4xNTU1MjggLTAuMTI4NTc1Cit2IDAuNTkxNDkyIDIuMTU1NTI4IC0wLjEyMzQ3NQordiAwLjU5Njg3NSAyLjE1NTUyOCAtMC4xMjg1NzUKK3YgMC41MjI0MjEgMS45ODM4MzAgLTAuMTI4NTc1Cit2IDAuNjA1MTU0IDIuMDYyMjYyIC0wLjEyODU3NQordiAwLjU5MzgwNyAyLjAyMjg4NiAtMC4xMjg1NzUKK3YgMC41NjQwMjcgMS45OTQ1MjggLTAuMTI4NTc1Cit2IDAuNjA1MTU1IDIuMDY3ODA1IC0wLjEyMzQ3NQordiAwLjYwNTE1NCAyLjExMTA4MiAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4xMTgwNzEgLTAuMTI4NTc1Cit2IDAuNjA4MDUwIDIuMTIyNTA3IC0wLjEyODU3NQordiAwLjYwODA1MCAyLjEyNjg3MSAtMC4xMjM0NzUKK3YgMC42MDgwNTAgMi4xMzA1OTggLTAuMTI4NTc1Cit2IDAuNjA4MDUwIDIuMTM0NjQxIC0wLjEyODU3NQordiAwLjYwODA1MCAyLjEzODQ0NiAtMC4xMjM0NzUKK3YgMC42MDgwNDkgMi4xNDM5OTYgLTAuMTI4NTc1Cit2IDAuNjA4MDUxIDIuMDg4NzUyIC0wLjEyODU3NQordiAwLjYwODA1MCAyLjA5OTc0MSAtMC4xMjg1NzUKK3YgMC41MjI0MjEgMS45Nzg4ODcgLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMDA0NzYzIC0wLjEyMzQ3NQordiAwLjUyMjQyMSAyLjAxMjYzMCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wMjQ2MzUgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMTMyNjQxIC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjEyNDk1OCAtMC4xMjM0NzYKK3YgMC41MjI0MjEgMi4xMjA4MTggLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMTEyOTUzIC0wLjEyMzQ3NgordiAwLjUyMjQyMSAyLjEyOTA5OCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4xMDUwODcgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMTQwOTQ3IC0wLjEyODU3NgordiAwLjUyMjQyMSAyLjE1NTUyOCAtMC4xMjg1NzYKK3YgMC40Nzk0MTMgMS45ODk5MTQgLTAuMTIzNDc1Cit2IDAuNDQ4NTg5IDIuMDE4ODU3IC0wLjEyMzQ3NQordiAwLjQzNjc5MyAyLjA1OTUwOCAtMC4xMjM0NzUKK3YgMC40ODQ2MzQgMi4wMDMzNzggLTAuMTIzNDc1Cit2IDAuNDU3NjI4IDIuMDI5MDM3IC0wLjEyMzQ3NQordiAwLjQ4NjQwNSAyLjAwNjM2OSAtMC4xMjg1NTYKK3YgMC40NjA3NTQgMi4wMzA3NzcgLTAuMTI4NTU2Cit2IDAuNDkwNDI2IDIuMDEzMDE3IC0wLjEyMzQ3NQordiAwLjQ2NzcyNiAyLjAzNDYzMSAtMC4xMjM0NzUKK3YgMC40OTI2MDIgMi4wMTY1OTYgLTAuMTI4NTU2Cit2IDAuNDcxNDg0IDIuMDM2NzAzIC0wLjEyODU1NgordiAwLjQ5NjczNiAyLjAyMzM5NCAtMC4xMjM0NzUKK3YgMC40Nzg2MjMgMi4wNDA2NDEgLTAuMTIzNDc1Cit2IDAuNDk4OTEzIDIuMDI2OTczIC0wLjEyODU1NgordiAwLjQ4MjM4MSAyLjA0MjcxNCAtMC4xMjg1NTYKK3YgMC41MDMwNDggMi4wMzM3NzEgLTAuMTIzNDc1Cit2IDAuNDg5NTIwIDIuMDQ2NjUxIC0wLjEyMzQ3NQordiAwLjUwNTIyNCAyLjAzNzM1MCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wMzI5MTYgLTAuMTI4NTU2Cit2IDAuNDkzMjc5IDIuMDQ4NzI0IC0wLjEyODU1NgordiAwLjUwOTM1OCAyLjA0NDE0OCAtMC4xMjM0NzUKK3YgMC41MDA0MTggMi4wNTI2NjIgLTAuMTIzNDc1Cit2IDAuNDg4MjUwIDIuMDA5NDM5IC0wLjEyODU1NgordiAwLjQ2Mzk2OCAyLjAzMjU1OCAtMC4xMjg1NTYKK3YgMC40OTQ1NjAgMi4wMTk4MTUgLTAuMTI4NTU2Cit2IDAuNDc0ODY2IDIuMDM4NTY5IC0wLjEyODU1NgordiAwLjUwMDg3MSAyLjAzMDE5MyAtMC4xMjg1NTYKK3YgMC40ODU3NjMgMi4wNDQ1NzggLTAuMTI4NTU2Cit2IDAuNTA3MTgzIDIuMDQwNTY5IC0wLjEyODU1NgordiAwLjQ5NjY2MCAyLjA1MDU4OSAtMC4xMjg1NTYKK3YgMC41MTI1MTQgMi4wNDkzMzcgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMDQ2NzgzIC0wLjEyODU1NgordiAwLjUwNTg2NyAyLjA1NTY2NiAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wNTU2NjYgLTAuMTI4NTU2Cit2IDAuNDQyNTgzIDIuMDY1MDE1IC0wLjEyODU3NQordiAwLjQ1MzQ4MSAyLjAyNjQ0MiAtMC4xMjg1NzUKK3YgMC40ODIyMTUgMS45OTkxNDMgLTAuMTI4NTc1Cit2IDAuNDM2NzkxIDIuMDcwNTk2IC0wLjEyMzQ3NQordiAwLjQ4NDYzNCAyLjEyNjM0MiAtMC4xMjM0NzYKK3YgMC40NTc2MjggMi4xMDA2ODUgLTAuMTIzNDc2Cit2IDAuNDQ3Mzg1IDIuMDY1MDE1IC0wLjEyMzQ3NQordiAwLjQ4NjQwNSAyLjEyMzM1MyAtMC4xMjg1NTYKK3YgMC40NjA3NTQgMi4wOTg5NDQgLTAuMTI4NTU2Cit2IDAuNDUxMDA1IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjQ5MDQyNiAyLjExNjcwNCAtMC4xMjM0NzYKK3YgMC40NTkwNzMgMi4wNjUwMTUgLTAuMTIzNDc2Cit2IDAuNDY3NzI2IDIuMDk1MDkxIC0wLjEyMzQ3NQordiAwLjQ5MjYwMiAyLjExMzEyNiAtMC4xMjg1NTYKK3YgMC40NjM0MjAgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNDcxNDg0IDIuMDkzMDE4IC0wLjEyODU1NgordiAwLjQ5NjczNiAyLjEwNjMyOCAtMC4xMjM0NzYKK3YgMC40NzE2NzkgMi4wNjUwMTUgLTAuMTIzNDc2Cit2IDAuNDc4NjIzIDIuMDg5MDgxIC0wLjEyMzQ3NgordiAwLjQ5ODkxMyAyLjEwMjc1MCAtMC4xMjg1NTYKK3YgMC40NzYwMjcgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNDgyMzgxIDIuMDg3MDA4IC0wLjEyODU1NgordiAwLjUwMzA0OCAyLjA5NTk1MSAtMC4xMjM0NzYKK3YgMC40ODQyODYgMi4wNjUwMTUgLTAuMTIzNDc2Cit2IDAuNDg5NTIwIDIuMDgzMDcwIC0wLjEyMzQ3NgordiAwLjUwNTIyNCAyLjA5MjM3MiAtMC4xMjg1NTYKK3YgMC40ODg2MzMgMi4wNjUwMTUgLTAuMTI4NTU2Cit2IDAuNDkzMjc5IDIuMDgwOTk4IC0wLjEyODU1NgordiAwLjUwOTM1OCAyLjA4NTU3MyAtMC4xMjM0NzYKK3YgMC41MjI0MjEgMi4wODg5NDEgLTAuMTIzNDc2Cit2IDAuNDk2ODkyIDIuMDY1MDE1IC0wLjEyMzQ3NgordiAwLjUwMDQxOCAyLjA3NzA2MCAtMC4xMjM0NzYKK3YgMC40ODgyNDkgMi4xMjAyODMgLTAuMTI4NTU2Cit2IDAuNDYzOTY4IDIuMDk3MTY0IC0wLjEyODU1NgordiAwLjQ1NDcyNiAyLjA2NTAxNSAtMC4xMjg1NTYKK3YgMC40OTQ1NjAgMi4xMDk5MDYgLTAuMTI4NTU2Cit2IDAuNDY3MzMyIDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjQ3NDg2NiAyLjA5MTE1MyAtMC4xMjg1NTYKK3YgMC41MDA4NzEgMi4wOTk1MjkgLTAuMTI4NTU2Cit2IDAuNDc5OTM4IDIuMDY1MDE1IC0wLjEyODU1NwordiAwLjQ4NTc2MyAyLjA4NTE0MiAtMC4xMjg1NTYKK3YgMC41MDcxODIgMi4wODkxNTEgLTAuMTI4NTU2Cit2IDAuNDkyNTQ1IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjQ5NjY2MCAyLjA3OTEzMyAtMC4xMjg1NTYKK3YgMC41MTI1MTQgMi4wODAzODUgLTAuMTI4NTU2Cit2IDAuNTAzMTk1IDIuMDY1MDE1IC0wLjEyODU1NgordiAwLjUwNTg2NyAyLjA3NDA1NSAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4wNjUwMTUgLTAuMTI4NTU3Cit2IDAuNDUzNDgxIDIuMTAzMjgwIC0wLjEyODU3NgordiAwLjQ4MjIxNSAyLjEzMDU3OSAtMC4xMjg1NzYKK3YgMC40MzY3OTIgMi4xNTU1MjggLTAuMTI4NTc0Cit2IDAuNDQyNTgzIDIuMTA5NDQ1IC0wLjEyODU3NQordiAwLjQzNjc5MSAyLjExMjcyMCAtMC4xMjM0NzQKK3YgMC40Njc0MzQgMi4xNTU1MjggLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMTQ0ODE3IC0wLjEyODU3NgordiAwLjQ0OTUwOCAyLjEwNTU2NCAtMC4xMjg1NzYKK3YgMC40Nzk4NzMgMi4xMzQ0NDkgLTAuMTI4NTc2Cit2IDAuNDQ1NTQ2IDIuMTA3ODUzIC0wLjEyMzQ3NQordiAwLjQ3NzgyNSAyLjEzNzc2NCAtMC4xMjM0NzcKK3YgMC41MjI0MjEgMi4xNDgxMzQgLTAuMTIzNDc2Cit2IDAuNDc2MDIyIDIuMTQwNjE3IC0wLjEyODU3NwordiAwLjQ3Mzk0MiAyLjE0Mzg0NiAtMC4xMjg1NzYKK3YgMC41MDc2NjIgMi4xNTU1MjggLTAuMTIzNDc1Cit2IDAuNDcxODkxIDIuMTQ3MjY5IC0wLjEyMzQ3NgordiAwLjQ2OTg5MCAyLjE1MDU5OSAtMC4xMjg1NzYKK3YgMC40OTIxMjcgMi4xNTU1MjggLTAuMTI4NTc2Cit2IDAuNDgxMjM3IDIuMTU1NTI4IC0wLjEyODU3NgordiAwLjQ2ODc2OSAyLjE1MjUzOSAtMC4xMjg1NzYKK3YgMC40NjMyODQgMi4xNTU1MjggLTAuMTI4NTc1Cit2IDAuNDU4MTIyIDIuMTU1NTI4IC0wLjEyODU3NQordiAwLjQ1MzM0OSAyLjE1NTUyOCAtMC4xMjM0NzUKK3YgMC40NDc5NjYgMi4xNTU1MjggLTAuMTI4NTc1Cit2IDAuNDM5Njg4IDIuMDYyMjYyIC0wLjEyODU3NQordiAwLjQ1MTAzNSAyLjAyMjg4NiAtMC4xMjg1NzUKK3YgMC40ODA4MTQgMS45OTQ1MjggLTAuMTI4NTc1Cit2IDAuNDM5Njg3IDIuMDY3ODA1IC0wLjEyMzQ3NQordiAwLjQzOTY4OCAyLjExMTA4MiAtMC4xMjg1NzUKK3YgMC40MzY3OTIgMi4xMTgwNzEgLTAuMTI4NTc0Cit2IDAuNDM2NzkyIDIuMTIyNTA3IC0wLjEyODU3NAordiAwLjQzNjc5MiAyLjEyNjg3MCAtMC4xMjM0NzQKK3YgMC40MzY3OTIgMi4xMzA1OTggLTAuMTI4NTc0Cit2IDAuNDM2NzkyIDIuMTM0NjQxIC0wLjEyODU3NAordiAwLjQzNjc5MiAyLjEzODQ0NiAtMC4xMjM0NzQKK3YgMC40MzY3OTIgMi4xNDM5OTYgLTAuMTI4NTc0Cit2IDAuNDM2NzkxIDIuMDg4NzUyIC0wLjEyODU3NQordiAwLjQzNjc5MSAyLjA5OTc0MSAtMC4xMjg1NzUKK3YgMC41NjU0MzAgMS45ODk5MTQgLTAuMTE3OTk1Cit2IDAuNTk2MjU1IDIuMDE4ODU3IC0wLjExNzk5NQordiAwLjYwODA1MCAyLjA1OTUwOCAtMC4xMTc5OTYKK3YgMC42MDgwNTEgMi4wNzA1OTYgLTAuMTE3OTk2Cit2IDAuNjA4MDQ5IDIuMTU1NTI4IC0wLjExNzk5NwordiAwLjYwODA1MCAyLjExMjcyMCAtMC4xMTc5OTYKK3YgMC41Nzc0MDggMi4xNTU1MjggLTAuMTE3OTk1Cit2IDAuNTM3MTc5IDIuMTU1NTI4IC0wLjExNzk5NQordiAwLjU1MjcxNCAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC41NjM2MDUgMi4xNTU1MjggLTAuMTE3OTk2Cit2IDAuNTgxNTU4IDIuMTU1NTI4IC0wLjExNzk5NgordiAwLjU4NjcxOSAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC41OTE0OTIgMi4xNTU1MjggLTAuMTE3OTk1Cit2IDAuNTk2ODc1IDIuMTU1NTI4IC0wLjExNzk5NgordiAwLjYwODA1MCAyLjExODA3MSAtMC4xMTc5OTcKK3YgMC42MDgwNTAgMi4xMjI1MDcgLTAuMTE3OTk3Cit2IDAuNjA4MDUwIDIuMTI2ODcxIC0wLjExNzk5NgordiAwLjYwODA1MCAyLjEzMDU5OCAtMC4xMTc5OTcKK3YgMC42MDgwNTAgMi4xMzQ2NDEgLTAuMTE3OTk3Cit2IDAuNjA4MDUwIDIuMTM4NDQ2IC0wLjExNzk5NQordiAwLjYwODA0OSAyLjE0Mzk5NiAtMC4xMTc5OTcKK3YgMC42MDgwNTEgMi4wODg3NTIgLTAuMTE3OTk3Cit2IDAuNjA4MDUwIDIuMDk5NzQxIC0wLjExNzk5NwordiAwLjUyMjQyMSAxLjk3ODg4NyAtMC4xMTc5OTUKK3YgMC41MjI0MjEgMi4xNTU1MjggLTAuMTE3OTk3Cit2IDAuNDc5NDEzIDEuOTg5OTE0IC0wLjExNzk5NQordiAwLjQ0ODU4OSAyLjAxODg1NyAtMC4xMTc5OTUKK3YgMC40MzY3OTMgMi4wNTk1MDggLTAuMTE3OTk1Cit2IDAuNDM2NzkxIDIuMDcwNTk2IC0wLjExNzk5NQordiAwLjQzNjc5MiAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC40MzY3OTEgMi4xMTI3MjAgLTAuMTE3OTk1Cit2IDAuNDY3NDM0IDIuMTU1NTI4IC0wLjExNzk5NQordiAwLjUwNzY2MiAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC40OTIxMjcgMi4xNTU1MjggLTAuMTE3OTk3Cit2IDAuNDgxMjM3IDIuMTU1NTI4IC0wLjExNzk5NwordiAwLjQ2MzI4NCAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC40NTgxMjIgMi4xNTU1MjggLTAuMTE3OTk2Cit2IDAuNDUzMzQ5IDIuMTU1NTI4IC0wLjExNzk5NQordiAwLjQ0Nzk2NiAyLjE1NTUyOCAtMC4xMTc5OTYKK3YgMC40MzY3OTIgMi4xMTgwNzEgLTAuMTE3OTk2Cit2IDAuNDM2NzkyIDIuMTIyNTA3IC0wLjExNzk5NgordiAwLjQzNjc5MiAyLjEyNjg3MCAtMC4xMTc5OTUKK3YgMC40MzY3OTIgMi4xMzA1OTggLTAuMTE3OTk2Cit2IDAuNDM2NzkyIDIuMTM0NjQxIC0wLjExNzk5NgordiAwLjQzNjc5MiAyLjEzODQ0NiAtMC4xMTc5OTUKK3YgMC40MzY3OTIgMi4xNDM5OTYgLTAuMTE3OTk2Cit2IDAuNDM2NzkxIDIuMDg4NzUyIC0wLjExNzk5NgordiAwLjQzNjc5MSAyLjA5OTc0MSAtMC4xMTc5OTYKK3YgMC41NjU0MzAgMS45ODk5MTQgLTAuMTIyODM0Cit2IDAuNTk2MjU1IDIuMDE4ODU3IC0wLjEyMjgzNAordiAwLjYwODA1MCAyLjA1OTUwOCAtMC4xMjI4MzQKK3YgMC42MDgwNTEgMi4wNzA1OTYgLTAuMTIyODM0Cit2IDAuNjA4MDQ5IDIuMTU1NTI4IC0wLjEyNzcwNQordiAwLjYwODA1MCAyLjExMjcyMCAtMC4xMjI4MzQKK3YgMC41Nzc0MDggMi4xNTU1MjggLTAuMTIyODM0Cit2IDAuNTM3MTc5IDIuMTU1NTI4IC0wLjEyMjgzNAordiAwLjU1MjcxNCAyLjE1NTUyOCAtMC4xMjc3MDUKK3YgMC41NjM2MDUgMi4xNTU1MjggLTAuMTI3NzA1Cit2IDAuNTgxNTU4IDIuMTU1NTI4IC0wLjEyNzcwNQordiAwLjU4NjcxOSAyLjE1NTUyOCAtMC4xMjc3MDUKK3YgMC41OTE0OTIgMi4xNTU1MjggLTAuMTIyODMzCit2IDAuNTk2ODc1IDIuMTU1NTI4IC0wLjEyNzcwNQordiAwLjYwODA1MCAyLjExODA3MSAtMC4xMjc3MDUKK3YgMC42MDgwNTAgMi4xMjI1MDcgLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMTI2ODcxIC0wLjEyMjgzNAordiAwLjYwODA1MCAyLjEzMDU5OCAtMC4xMjc3MDUKK3YgMC42MDgwNTAgMi4xMzQ2NDEgLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMTM4NDQ2IC0wLjEyMjgzNAordiAwLjYwODA0OSAyLjE0Mzk5NiAtMC4xMjc3MDUKK3YgMC42MDgwNTEgMi4wODg3NTIgLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMDk5NzQxIC0wLjEyNzcwNQordiAwLjUyMjQyMSAxLjk3ODg4NyAtMC4xMjI4MzQKK3YgMC41MjI0MjEgMi4xNTU1MjggLTAuMTI3NzA2Cit2IDAuNDc5NDEzIDEuOTg5OTE0IC0wLjEyMjgzNAordiAwLjQ0ODU4OSAyLjAxODg1NyAtMC4xMjI4MzQKK3YgMC40MzY3OTMgMi4wNTk1MDggLTAuMTIyODM0Cit2IDAuNDM2NzkxIDIuMDcwNTk2IC0wLjEyMjgzNAordiAwLjQzNjc5MiAyLjE1NTUyOCAtMC4xMjc3MDQKK3YgMC40MzY3OTEgMi4xMTI3MjAgLTAuMTIyODMzCit2IDAuNDY3NDM0IDIuMTU1NTI4IC0wLjEyMjgzNAordiAwLjUwNzY2MiAyLjE1NTUyOCAtMC4xMjI4MzQKK3YgMC40OTIxMjcgMi4xNTU1MjggLTAuMTI3NzA2Cit2IDAuNDgxMjM3IDIuMTU1NTI4IC0wLjEyNzcwNgordiAwLjQ2MzI4NCAyLjE1NTUyOCAtMC4xMjc3MDUKK3YgMC40NTgxMjIgMi4xNTU1MjggLTAuMTI3NzA1Cit2IDAuNDUzMzQ5IDIuMTU1NTI4IC0wLjEyMjgzMwordiAwLjQ0Nzk2NiAyLjE1NTUyOCAtMC4xMjc3MDUKK3YgMC40MzY3OTIgMi4xMTgwNzEgLTAuMTI3NzA0Cit2IDAuNDM2NzkyIDIuMTIyNTA3IC0wLjEyNzcwNAordiAwLjQzNjc5MiAyLjEyNjg3MCAtMC4xMjI4MzMKK3YgMC40MzY3OTIgMi4xMzA1OTggLTAuMTI3NzA0Cit2IDAuNDM2NzkyIDIuMTM0NjQxIC0wLjEyNzcwNAordiAwLjQzNjc5MiAyLjEzODQ0NiAtMC4xMjI4MzMKK3YgMC40MzY3OTIgMi4xNDM5OTYgLTAuMTI3NzA0Cit2IDAuNDM2NzkxIDIuMDg4NzUyIC0wLjEyNzcwNgordiAwLjQzNjc5MSAyLjA5OTc0MSAtMC4xMjc3MDUKK3YgMC42MDc2MjQgMi4yNTE5NjkgLTAuMTM4OTQ3Cit2IDAuNTk1ODg3IDIuMjkyNDE4IC0wLjEzODk0NwordiAwLjU2NTIxNiAyLjMyMTIxNyAtMC4xMzg5NDcKK3YgMC41MjI0MjEgMi4zMzIxODkgLTAuMTM4OTQ3Cit2IDAuNDc5NjI3IDIuMzIxMjE3IC0wLjEzODk0NwordiAwLjQ0ODk1NiAyLjI5MjQxNyAtMC4xMzg5NDcKK3YgMC40MzcyMTkgMi4yNTIwMjUgLTAuMTM4OTQ3Cit2IDAuNjA3NjI0IDIuMjUxOTY5IC0wLjA5NDMxNQordiAwLjU5NTg4NyAyLjI5MjQxOCAtMC4wOTQzMTUKK3YgMC41NjUyMTYgMi4zMjEyMTcgLTAuMDk0MzE1Cit2IDAuNTIyNDIxIDIuMzMyMTg5IC0wLjA5NDMxNQordiAwLjQ3OTYyNyAyLjMyMTIxNyAtMC4wOTQzMTUKK3YgMC40NDg5NTYgMi4yOTI0MTcgLTAuMDk0MzE1Cit2IDAuNDM3MjE5IDIuMjUxOTY5IC0wLjA5NDMxNQordiAwLjQzNzIxOCAyLjI0MDg5OCAtMC4xMzg5NDcKK3YgMC42MDc2MjQgMi4yNDA5MDQgLTAuMDk0MzE1Cit2IDAuNjA3NjI0IDIuMjQwOTA0IC0wLjEzODk0NwordiAwLjQ0MzI3MiAyLjI0MDkwMyAtMC4wODg1NTcKK3YgMC40MzcyMTggMi4xNTY3NTUgLTAuMDk0MzE1Cit2IDAuNjA3NjI0IDIuMTU2NzU2IC0wLjA5NDMxNQordiAwLjUyMjQyMiAyLjE1Njc1NSAtMC4wODg1NTYKK3YgMC42MDc2MjQgMi4xNTY3ODYgLTAuMTM4OTQ3Cit2IDAuNDM3MjE4IDIuMTU2Nzg1IC0wLjEzODk0NwordiAwLjQ4NDc0MSAyLjMwMjI0MyAtMC4wODg1NTYKK3YgMC40NTc5NTEgMi4yNzY3MzYgLTAuMDg4NTU2Cit2IDAuNDQ3NzU5IDIuMjQwOTAzIC0wLjA4ODU1NwordiAwLjQ1Nzk1MyAyLjIwNTAxMSAtMC4wODg1NTYKK3YgMC40ODQ3NDEgMi4xNzk1MDAgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMTY5NzgxIC0wLjA4ODU1NgordiAwLjU2MDA2NSAyLjE3OTQ5OSAtMC4wODg1NTYKK3YgMC41ODY4NTMgMi4yMDUwMTAgLTAuMDg4NTU2Cit2IDAuNTk3MDYzIDIuMjQwOTA0IC0wLjA4ODU1NgordiAwLjU4Njg1MyAyLjI3NjczNCAtMC4wODg1NTYKK3YgMC41NjAwNjIgMi4zMDIyNDMgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMzExOTUwIC0wLjA4ODU1NgordiAwLjQ4NzQ0NSAyLjI5NzgzOCAtMC4wODg1NTYKK3YgMC40NjI1NzcgMi4yNzQxNjAgLTAuMDg4NTU2Cit2IDAuNDUzMTE3IDIuMjQwOTAzIC0wLjA4ODU1NgordiAwLjQ2MjU3NyAyLjIwNzU4MiAtMC4wODg1NTYKK3YgMC40ODc0NDQgMi4xODM5MDQgLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMTc0ODgzIC0wLjA4ODU1NgordiAwLjU1NzM2MSAyLjE4MzkwNCAtMC4wODg1NTYKK3YgMC41ODIyMjggMi4yMDc1ODIgLTAuMDg4NTU2Cit2IDAuNTkxNzA2IDIuMjQwOTA0IC0wLjA4ODU1NgordiAwLjU4MjIyOCAyLjI3NDE2MCAtMC4wODg1NTYKK3YgMC41NTczNjAgMi4yOTc4MzggLTAuMDg4NTU2Cit2IDAuNTIyNDIyIDIuMzA2ODQ5IC0wLjA4ODU1NgordiAwLjQ3NzEyMyAyLjE1Njc1NSAtMC4wODg1NTYKK3YgMC41Njc2ODEgMi4xNTY3NTUgLTAuMDg4NTU2Cit2IDAuNjA3NjI0IDIuMTk4ODMwIC0wLjA5NDMxNQordiAwLjQzNzIxOCAyLjE5ODc1NyAtMC4xMzg5NDcKK3YgMC40NDMyNzIgMi4yMDA2MzQgLTAuMDg4NTU2Cit2IDAuNjA3NjI0IDIuMTk4ODMwIC0wLjEzODk0NwordiAwLjYwMTQ1OSAyLjI1MTk2OSAtMC4wODg1NTYKK3YgMC41OTIzNzcgMi4yODYzMjUgLTAuMDg4NTU2Cit2IDAuNTYzNTkxIDIuMzE1MjMzIC0wLjA4ODU1NgordiAwLjUyMjQyMSAyLjMyNjIxOSAtMC4wODg1NTYKK3YgMC40ODEyNDIgMi4zMTUyMjYgLTAuMDg4NTU2Cit2IDAuNDUyNDU4IDIuMjg2MzEyIC0wLjA4ODU1NgordiAwLjQ0MzM4NCAyLjI1MTk2OSAtMC4wODg1NTYKK3YgMC42MDE1NzAgMi4yNDA5MDQgLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMjQwOTAzIC0wLjA5NDMxNQordiAwLjQ0MzI3MiAyLjE1Njc1NSAtMC4wODg1NTYKK3YgMC42MDE1NzAgMi4xNTY3NTYgLTAuMDg4NTU2Cit2IDAuNjAxNTcwIDIuMjAwNjMxIC0wLjA4ODU1NgordiAwLjQzNzIxOCAyLjE5ODgyOSAtMC4wOTQzMTUKK3YgMC40NTc5NTIgMi4xNTY3NTUgLTAuMDg4NTU2Cit2IDAuNTg2ODUzIDIuMTU2NzU2IC0wLjA4ODU1NgordiAwLjQ2NjUzNiAyLjI3MTk5MyAtMC4wNjc0NDkKK3YgMC40ODk3MTkgMi4yOTQwNjYgLTAuMDY3NDQ5Cit2IDAuNTIyNDIxIDIuMzAyNDkyIC0wLjA2NzQ0OQordiAwLjU1NTA4NSAyLjI5NDA2OCAtMC4wNjc0NDkKK3YgMC41NzgyNzAgMi4yNzE5OTEgLTAuMDY3NDQ5Cit2IDAuNTg3MTMwIDIuMjQwOTAzIC0wLjA2NzQ0OQordiAwLjU3ODI2OSAyLjIwOTc0OSAtMC4wNjc0NTAKK3YgMC41NTUwODUgMi4xODc2NzMgLTAuMDY3NDUwCit2IDAuNTIyNDIxIDIuMTc5MjM5IC0wLjA2NzQ0OQordiAwLjQ4OTcxOCAyLjE4NzY3MyAtMC4wNjc0NTAKK3YgMC40NjY1MzcgMi4yMDk3NDcgLTAuMDY3NDQ5Cit2IDAuNDU3NjkyIDIuMjQwOTAzIC0wLjA2NzQ0OQordiAwLjQ3Njk4NyAyLjI2NjIyOSAtMC4wNzAwODcKK3YgMC40OTU3NzAgMi4yODQxMTQgLTAuMDcwMDg3Cit2IDAuNTIyNDE5IDIuMjkwOTgwIC0wLjA3MDA4NwordiAwLjU0OTAzMiAyLjI4NDExNiAtMC4wNzAwODcKK3YgMC41Njc4MjIgMi4yNjYyMjYgLTAuMDcwMDg3Cit2IDAuNTc1MDM5IDIuMjQwOTAxIC0wLjA3MDA4NwordiAwLjU2NzgxOCAyLjIxNTUxMyAtMC4wNzAwODcKK3YgMC41NDkwMzEgMi4xOTc2MjQgLTAuMDcwMDg3Cit2IDAuNTIyNDE5IDIuMTkwNzUzIC0wLjA3MDA4NwordiAwLjQ5NTc3MSAyLjE5NzYyNSAtMC4wNzAwODgKK3YgMC40NzY5OTAgMi4yMTU1MDkgLTAuMDcwMDg3Cit2IDAuNDY5NzgyIDIuMjQwOTAwIC0wLjA3MDA4NwordiAwLjQ5NDIwMSAyLjI1NjczNSAtMC4wNzM2MTUKK3YgMC41MDU3MzcgMi4yNjc3MTkgLTAuMDczNjE2Cit2IDAuNTIyNDE3IDIuMjcyMDE3IC0wLjA3MzYxNQordiAwLjUzOTA2MyAyLjI2NzcyMyAtMC4wNzM2MTUKK3YgMC41NTA2MTEgMi4yNTY3MjggLTAuMDczNjE1Cit2IDAuNTU1MTIzIDIuMjQwODk2IC0wLjA3MzYxNQordiAwLjU1MDYwNCAyLjIyNTAwNyAtMC4wNzM2MTUKK3YgMC41MzkwNjAgMi4yMTQwMTUgLTAuMDczNjE1Cit2IDAuNTIyNDE2IDIuMjA5NzE3IC0wLjA3MzYxNQordiAwLjUwNTc0MCAyLjIxNDAxOCAtMC4wNzM2MTYKK3YgMC40OTQyMDggMi4yMjQ5OTkgLTAuMDczNjE2Cit2IDAuNDg5Njk1IDIuMjQwODk2IC0wLjA3MzYxNQordiAwLjUyMjQxNyAyLjI1NjczMiAtMC4wNzM2MTUKK3YgMC41MjI0MTcgMi4yNDA4OTYgLTAuMDczNjE1Cit2IDAuNTIyNDE3IDIuMjI1MDAzIC0wLjA3MzYxNQordiAwLjQ3MDg4MiAyLjI2OTU5NiAtMC4wNjY2NTEKK3YgMC40OTIyMzUgMi4yODk5MjcgLTAuMDY2NjUxCit2IDAuNTIyNDIwIDIuMjk3NzA0IC0wLjA2NjY1MQordiAwLjU1MjU2OCAyLjI4OTkyOSAtMC4wNjY2NTEKK3YgMC41NzM5MjUgMi4yNjk1OTMgLTAuMDY2NjUxCit2IDAuNTgyMTAyIDIuMjQwOTAyIC0wLjA2NjY1MgordiAwLjU3MzkyMyAyLjIxMjE0NiAtMC4wNjY2NTIKK3YgMC41NTI1NjggMi4xOTE4MTIgLTAuMDY2NjUxCit2IDAuNTIyNDIwIDIuMTg0MDI3IC0wLjA2NjY1MQordiAwLjQ5MjIzNSAyLjE5MTgxMiAtMC4wNjY2NTIKK3YgMC40NzA4ODQgMi4yMTIxNDMgLTAuMDY2NjUxCit2IDAuNDYyNzIwIDIuMjQwOTAxIC0wLjA2NjY1MQordiAwLjYwNzYyNCAyLjE1NzczMiAtMC4wOTQzMTUKK3YgMC41MjI0MjIgMi4xNTc3MTggLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMTU3NzYyIC0wLjEzODk0NwordiAwLjQ3NzMxMyAyLjE1NzcyMiAtMC4wODg1NTcKK3YgMC41Njc0OTEgMi4xNTc3MjIgLTAuMDg4NTU2Cit2IDAuNDM3MjE4IDIuMTU3NzMyIC0wLjA5NDMxNQordiAwLjYwNzYyNCAyLjE1Nzc2MiAtMC4xMzg5NDcKK3YgMC42MDE1NzAgMi4xNTc3MzMgLTAuMDg4NTU2Cit2IDAuNDQzMjcyIDIuMTU3NzMyIC0wLjA4ODU1NwordiAwLjQ1Nzk1MiAyLjE1NzczNSAtMC4wODg1NTYKK3YgMC41ODY4NTMgMi4xNTc3MzUgLTAuMDg4NTU2Cit2IDAuNTIyNDIxIDIuMTU2NzU1IC0wLjA5NDMxNgordiAwLjUyMjQyMSAyLjE1Njc4NSAtMC4xMzg5NDcKK3YgMC40NDQwMzQgMi4xNTY3ODUgLTAuMTM4OTQ3Cit2IDAuNDQ0MDM0IDIuMTU2NzU1IC0wLjA5NDMxNQordiAwLjYwMDgwOCAyLjE1Njc1NiAtMC4wOTQzMTUKK3YgMC42MDA4MDggMi4xNTY3ODYgLTAuMTM4OTQ3Cit2IDAuNTg3MDkwIDIuMTU2Nzg2IC0wLjEzODk0NwordiAwLjU4NzA5MCAyLjE1Njc1NiAtMC4wOTQzMTUKK3YgMC40NTc3NTIgMi4xNTY3NTUgLTAuMDk0MzE1Cit2IDAuNDU3NzUyIDIuMTU2Nzg1IC0wLjEzODk0NwordiAwLjQ3NTUzNiAyLjE1Njc1NSAtMC4wOTQzMTUKK3YgMC40NzU1MzYgMi4xNTY3ODUgLTAuMTM4OTQ3Cit2IDAuNTY5MzA2IDIuMTU2Nzg2IC0wLjEzODk0NwordiAwLjU2OTMwNiAyLjE1Njc1NiAtMC4wOTQzMTUKK3YgMC41MjI0MjEgMi4zMTc5OTMgLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMzE0NTQ4IC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjMwMjcyNCAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4yOTQ4NTkgLTAuMTIzNDc1Cit2IDAuNTIyNDIxIDIuMjkwNzIwIC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjMxMTAwNSAtMC4xMjg1NTYKK3YgMC41MjI0MjEgMi4zMjI4NTQgLTAuMTI4NTc1Cit2IDAuNTIyNDIxIDIuMTc1NTQyIC0wLjEyMzQ3NwordiAwLjUyMjQyMSAyLjIwMjgxNiAtMC4xMjg1NTcKK3YgMC41MjI0MjEgMi4xOTQ1MzcgLTAuMTI4NTU3Cit2IDAuNTY1NDI5IDIuMzIxNzE1IC0wLjEyMzQ3NQordiAwLjU5NjI1NSAyLjI5Mjc3MSAtMC4xMjM0NzUKK3YgMC42MDgwNDkgMi4yNTIxMjAgLTAuMTIzNDc1Cit2IDAuNTYwMjA4IDIuMzA4MjUwIC0wLjEyMzQ3NQordiAwLjU4NzIxNCAyLjI4MjU5MiAtMC4xMjM0NzUKK3YgMC41NTg0MzYgMi4zMDUyNjAgLTAuMTI4NTU2Cit2IDAuNTg0MDg4IDIuMjgwODUxIC0wLjEyODU1NgordiAwLjU1NDQxNiAyLjI5ODYxMiAtMC4xMjM0NzUKK3YgMC41NzcxMTYgMi4yNzY5OTcgLTAuMTIzNDc1Cit2IDAuNTUyMjQwIDIuMjk1MDMzIC0wLjEyODU1NgordiAwLjU3MzM1NyAyLjI3NDkyNiAtMC4xMjg1NTYKK3YgMC41NDgxMDUgMi4yODgyMzUgLTAuMTIzNDc2Cit2IDAuNTY2MjE4IDIuMjcwOTg4IC0wLjEyMzQ3NQordiAwLjU0NTkyOCAyLjI4NDY1NiAtMC4xMjg1NTcKK3YgMC41NjI0NjAgMi4yNjg5MTUgLTAuMTI4NTU2Cit2IDAuNTQxNzk0IDIuMjc3ODU3IC0wLjEyMzQ3NgordiAwLjUyMjQyMSAyLjI4Mjg1NCAtMC4xMjM0NzUKK3YgMC41NTUzMjEgMi4yNjQ5NzcgLTAuMTIzNDc1Cit2IDAuNTM5NjE4IDIuMjc0Mjc5IC0wLjEyODU1NwordiAwLjU1MTU2MyAyLjI2MjkwNSAtMC4xMjg1NTYKK3YgMC41MzU0ODMgMi4yNjc0NzkgLTAuMTIzNDc2Cit2IDAuNTIyNDIxIDIuMjcwODQ4IC0wLjEyMzQ3NQordiAwLjU0NDQyMyAyLjI1ODk2NyAtMC4xMjM0NzYKK3YgMC41NTY1OTMgMi4zMDIxOTAgLTAuMTI4NTU2Cit2IDAuNTgwODczIDIuMjc5MDcwIC0wLjEyODU1NgordiAwLjU1MDI4MSAyLjI5MTgxMyAtMC4xMjg1NTYKK3YgMC41Njk5NzYgMi4yNzMwNjAgLTAuMTI4NTU2Cit2IDAuNTQzOTcwIDIuMjgxNDM2IC0wLjEyODU1NwordiAwLjU1OTA3OSAyLjI2NzA1MCAtMC4xMjg1NTYKK3YgMC41Mzc2NjAgMi4yNzEwNTkgLTAuMTI4NTU3Cit2IDAuNTIyNDIxIDIuMjc0OTg4IC0wLjEyODU1NgordiAwLjU0ODE4MiAyLjI2MTA0MCAtMC4xMjg1NTYKK3YgMC41MzIzMjggMi4yNjIyOTEgLTAuMTI4NTU3Cit2IDAuNTM4OTc1IDIuMjU1OTYyIC0wLjEyODU1NwordiAwLjYwMjI1OSAyLjI0NjYxNCAtMC4xMjg1NzUKK3YgMC41OTEzNjEgMi4yODUxODcgLTAuMTI4NTc1Cit2IDAuNTYyNjI2IDIuMzEyNDg3IC0wLjEyODU3NQordiAwLjYwODA1MSAyLjI0MTAzMyAtMC4xMjM0NzUKK3YgMC41NjAyMDggMi4xODUyODYgLTAuMTIzNDc1Cit2IDAuNTg3MjE0IDIuMjEwOTQzIC0wLjEyMzQ3NQordiAwLjU5NzQ1NyAyLjI0NjYxNCAtMC4xMjM0NzUKK3YgMC41NTg0MzYgMi4xODgyNzYgLTAuMTI4NTU2Cit2IDAuNTg0MDg4IDIuMjEyNjg0IC0wLjEyODU1NgordiAwLjU5MzgzNiAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC41NTQ0MTYgMi4xOTQ5MjQgLTAuMTIzNDc1Cit2IDAuNTg1NzY4IDIuMjQ2NjE0IC0wLjEyMzQ3NQordiAwLjU3NzExNiAyLjIxNjUzNyAtMC4xMjM0NzUKK3YgMC41NTIyNDAgMi4xOTg1MDMgLTAuMTI4NTU2Cit2IDAuNTgxNDIxIDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjU3MzM1NyAyLjIxODYxMCAtMC4xMjg1NTYKK3YgMC41NDgxMDUgMi4yMDUzMDEgLTAuMTIzNDc2Cit2IDAuNTczMTYyIDIuMjQ2NjE0IC0wLjEyMzQ3NQordiAwLjU2NjIxOCAyLjIyMjU0OCAtMC4xMjM0NzUKK3YgMC41NDU5MjggMi4yMDg4NzkgLTAuMTI4NTU3Cit2IDAuNTY4ODE1IDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjU2MjQ2MCAyLjIyNDYyMCAtMC4xMjg1NTYKK3YgMC41NDE3OTUgMi4yMTU2NzggLTAuMTIzNDc2Cit2IDAuNTIyNDIxIDIuMjEwNjgyIC0wLjEyMzQ3NwordiAwLjU2MDU1NiAyLjI0NjYxNCAtMC4xMjM0NzUKK3YgMC41NTUzMjEgMi4yMjg1NTkgLTAuMTIzNDc1Cit2IDAuNTM5NjE4IDIuMjE5MjU3IC0wLjEyODU1NwordiAwLjUyMjQyMSAyLjIxNDgyMiAtMC4xMjg1NTcKK3YgMC41NTYyMDkgMi4yNDY2MTQgLTAuMTI4NTU2Cit2IDAuNTUxNTYzIDIuMjMwNjMwIC0wLjEyODU1NgordiAwLjUzNTQ4MyAyLjIyNjA1NSAtMC4xMjM0NzYKK3YgMC41NDc5NTAgMi4yNDY2MTQgLTAuMTIzNDc2Cit2IDAuNTQ0NDI0IDIuMjM0NTY4IC0wLjEyMzQ3NgordiAwLjU1NjU5MyAyLjE5MTM0NiAtMC4xMjg1NTYKK3YgMC41ODA4NzMgMi4yMTQ0NjUgLTAuMTI4NTU2Cit2IDAuNTkwMTE1IDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjU1MDI4MSAyLjIwMTcyMyAtMC4xMjg1NTYKK3YgMC41Nzc1MDkgMi4yNDY2MTQgLTAuMTI4NTU2Cit2IDAuNTY5OTc2IDIuMjIwNDc2IC0wLjEyODU1NgordiAwLjU0Mzk3MCAyLjIxMjEwMCAtMC4xMjg1NTcKK3YgMC41NjQ5MDMgMi4yNDY2MTQgLTAuMTI4NTU2Cit2IDAuNTU5MDc5IDIuMjI2NDg2IC0wLjEyODU1NgordiAwLjUzNzY2MCAyLjIyMjQ3NiAtMC4xMjg1NTcKK3YgMC41MjI0MjEgMi4yMTg1NDggLTAuMTI4NTU3Cit2IDAuNTUyMjk3IDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjU0ODE4MiAyLjIzMjQ5NiAtMC4xMjg1NTYKK3YgMC41MzIzMjggMi4yMzEyNDQgLTAuMTI4NTU3Cit2IDAuNTIyNDIxIDIuMjI4NjkxIC0wLjEyODU1NwordiAwLjU0MTY0NyAyLjI0NjYxNCAtMC4xMjg1NTcKK3YgMC41Mzg5NzUgMi4yMzc1NzMgLTAuMTI4NTU3Cit2IDAuNTIyNDIxIDIuMjM3NTczIC0wLjEyODU1NwordiAwLjU5MTM2MSAyLjIwODM0OSAtMC4xMjg1NzUKK3YgMC41NjI2MjYgMi4xODEwNTAgLTAuMTI4NTc1Cit2IDAuNjA4MDQ5IDIuMTU2MDk5IC0wLjEyODU3NQordiAwLjYwMjI1OSAyLjIwMjE4NCAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4xOTg5MDkgLTAuMTIzNDc1Cit2IDAuNTc3NDA4IDIuMTU2MDk5IC0wLjEyMzQ3NQordiAwLjU5NTMzNSAyLjIwNjA2NCAtMC4xMjg1NzUKK3YgMC41NjQ5NjkgMi4xNzcxODAgLTAuMTI4NTc1Cit2IDAuNTk5Mjk2IDIuMjAzNzc1IC0wLjEyMzQ3NQordiAwLjU2NzAxNyAyLjE3Mzg2MyAtMC4xMjM0NzUKK3YgMC41Njg4MjAgMi4xNzEwMTIgLTAuMTI4NTc2Cit2IDAuNTIyNDIxIDIuMTYwMjE1IC0wLjEyODU3NwordiAwLjU3MDkwMCAyLjE2Nzc4NCAtMC4xMjg1NzYKK3YgMC41MzcxNzkgMi4xNTYwOTkgLTAuMTIzNDc2Cit2IDAuNTcyOTUxIDIuMTY0MzYxIC0wLjEyMzQ3NQordiAwLjU3NDk1MiAyLjE2MTAzMCAtMC4xMjg1NzUKK3YgMC41NTI3MTQgMi4xNTYwOTkgLTAuMTI4NTc1Cit2IDAuNTYzNjA1IDIuMTU2MDk5IC0wLjEyODU3NQordiAwLjU3NjA3MyAyLjE1OTA4OSAtMC4xMjg1NzUKK3YgMC41ODE1NTggMi4xNTYwOTkgLTAuMTI4NTc1Cit2IDAuNTg2NzE5IDIuMTU2MDk5IC0wLjEyODU3NQordiAwLjU5MTQ5MiAyLjE1NjA5OSAtMC4xMjM0NzUKK3YgMC41OTY4NzUgMi4xNTYwOTkgLTAuMTI4NTc1Cit2IDAuNTIyNDIxIDIuMzI3Nzk4IC0wLjEyODU3NQordiAwLjYwNTE1NCAyLjI0OTM2OCAtMC4xMjg1NzUKK3YgMC41OTM4MDcgMi4yODg3NDMgLTAuMTI4NTc1Cit2IDAuNTY0MDI3IDIuMzE3MTAxIC0wLjEyODU3NQordiAwLjYwNTE1NSAyLjI0MzgyNCAtMC4xMjM0NzUKK3YgMC42MDUxNTQgMi4yMDA1NDYgLTAuMTI4NTc1Cit2IDAuNjA4MDUwIDIuMTkzNTU4IC0wLjEyODU3NQordiAwLjYwODA1MCAyLjE4OTEyMiAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4xODQ3NTggLTAuMTIzNDc1Cit2IDAuNjA4MDUwIDIuMTgxMDMxIC0wLjEyODU3NQordiAwLjYwODA1MCAyLjE3Njk4OCAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4xNzMxODMgLTAuMTIzNDc1Cit2IDAuNjA4MDQ5IDIuMTY3NjMyIC0wLjEyODU3NQordiAwLjYwODA1MSAyLjIyMjg3NiAtMC4xMjg1NzUKK3YgMC42MDgwNTAgMi4yMTE4ODcgLTAuMTI4NTc1Cit2IDAuNTIyNDIxIDIuMzMyNzQxIC0wLjEyMzQ3NQordiAwLjUyMjQyMSAyLjMwNjg2NSAtMC4xMjM0NzUKK3YgMC41MjI0MjEgMi4yOTg5OTkgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMjg2OTk0IC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjE3ODk4NyAtMC4xMjg1NTcKK3YgMC41MjI0MjEgMi4xODY2NzEgLTAuMTIzNDc3Cit2IDAuNTIyNDIxIDIuMTkwODExIC0wLjEyODU1NwordiAwLjUyMjQyMSAyLjE5ODY3NyAtMC4xMjM0NzcKK3YgMC41MjI0MjEgMi4xODI1MzEgLTAuMTI4NTU3Cit2IDAuNTIyNDIxIDIuMjA2NTQyIC0wLjEyODU1NwordiAwLjUyMjQyMSAyLjE3MDY4MSAtMC4xMjg1NzcKK3YgMC41MjI0MjEgMi4xNTYwOTkgLTAuMTI4NTc3Cit2IDAuNDc5NDEzIDIuMzIxNzE1IC0wLjEyMzQ3NQordiAwLjQ0ODU4OSAyLjI5Mjc3MSAtMC4xMjM0NzUKK3YgMC40MzY3OTMgMi4yNTIxMjAgLTAuMTIzNDc1Cit2IDAuNDg0NjM0IDIuMzA4MjUwIC0wLjEyMzQ3NQordiAwLjQ1NzYyNyAyLjI4MjU5MiAtMC4xMjM0NzUKK3YgMC40ODY0MDUgMi4zMDUyNTkgLTAuMTI4NTU2Cit2IDAuNDYwNzU0IDIuMjgwODUxIC0wLjEyODU1NgordiAwLjQ5MDQyNiAyLjI5ODYxMiAtMC4xMjM0NzUKK3YgMC40Njc3MjYgMi4yNzY5OTcgLTAuMTIzNDc1Cit2IDAuNDkyNjAyIDIuMjk1MDMzIC0wLjEyODU1NgordiAwLjQ3MTQ4NCAyLjI3NDkyNiAtMC4xMjg1NTYKK3YgMC40OTY3MzYgMi4yODgyMzUgLTAuMTIzNDc1Cit2IDAuNDc4NjIzIDIuMjcwOTg4IC0wLjEyMzQ3NQordiAwLjQ5ODkxMyAyLjI4NDY1NiAtMC4xMjg1NTYKK3YgMC40ODIzODEgMi4yNjg5MTUgLTAuMTI4NTU2Cit2IDAuNTAzMDQ4IDIuMjc3ODU3IC0wLjEyMzQ3NQordiAwLjQ4OTUyMCAyLjI2NDk3NyAtMC4xMjM0NzUKK3YgMC41MDUyMjQgMi4yNzQyNzkgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMjc4NzEzIC0wLjEyODU1NgordiAwLjQ5MzI3OSAyLjI2MjkwNSAtMC4xMjg1NTYKK3YgMC41MDkzNTggMi4yNjc0NzkgLTAuMTIzNDc1Cit2IDAuNTAwNDE4IDIuMjU4OTY3IC0wLjEyMzQ3NQordiAwLjQ4ODI0OSAyLjMwMjE5MCAtMC4xMjg1NTYKK3YgMC40NjM5NjggMi4yNzkwNzAgLTAuMTI4NTU2Cit2IDAuNDk0NTYwIDIuMjkxODEzIC0wLjEyODU1NgordiAwLjQ3NDg2NiAyLjI3MzA2MCAtMC4xMjg1NTYKK3YgMC41MDA4NzEgMi4yODE0MzUgLTAuMTI4NTU2Cit2IDAuNDg1NzYzIDIuMjY3MDUwIC0wLjEyODU1NgordiAwLjUwNzE4MiAyLjI3MTA1OSAtMC4xMjg1NTYKK3YgMC40OTY2NjAgMi4yNjEwNDAgLTAuMTI4NTU2Cit2IDAuNTEyNTE0IDIuMjYyMjkxIC0wLjEyODU1NgordiAwLjUyMjQyMSAyLjI2NDg0NSAtMC4xMjg1NTYKK3YgMC41MDU4NjcgMi4yNTU5NjIgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMjU1OTYyIC0wLjEyODU1NwordiAwLjQ0MjU4MyAyLjI0NjYxNCAtMC4xMjg1NzUKK3YgMC40NTM0ODEgMi4yODUxODYgLTAuMTI4NTc1Cit2IDAuNDgyMjE1IDIuMzEyNDg3IC0wLjEyODU3NQordiAwLjQzNjc5MSAyLjI0MTAzMyAtMC4xMjM0NzUKK3YgMC40ODQ2MzQgMi4xODUyODYgLTAuMTIzNDc1Cit2IDAuNDU3NjI4IDIuMjEwOTQzIC0wLjEyMzQ3NQordiAwLjQ0NzM4NCAyLjI0NjYxNCAtMC4xMjM0NzUKK3YgMC40ODY0MDUgMi4xODgyNzYgLTAuMTI4NTU2Cit2IDAuNDYwNzU0IDIuMjEyNjg0IC0wLjEyODU1NgordiAwLjQ1MTAwNSAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC40OTA0MjYgMi4xOTQ5MjQgLTAuMTIzNDc2Cit2IDAuNDU5MDczIDIuMjQ2NjE0IC0wLjEyMzQ3NQordiAwLjQ2NzcyNiAyLjIxNjUzNyAtMC4xMjM0NzUKK3YgMC40OTI2MDIgMi4xOTg1MDMgLTAuMTI4NTU2Cit2IDAuNDYzNDIwIDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjQ3MTQ4NCAyLjIxODYxMCAtMC4xMjg1NTYKK3YgMC40OTY3MzYgMi4yMDUzMDEgLTAuMTIzNDc2Cit2IDAuNDcxNjc5IDIuMjQ2NjE0IC0wLjEyMzQ3NQordiAwLjQ3ODYyMyAyLjIyMjU0OCAtMC4xMjM0NzUKK3YgMC40OTg5MTMgMi4yMDg4NzkgLTAuMTI4NTU2Cit2IDAuNDc2MDI2IDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjQ4MjM4MSAyLjIyNDYyMCAtMC4xMjg1NTYKK3YgMC41MDMwNDggMi4yMTU2NzggLTAuMTIzNDc2Cit2IDAuNDg0Mjg2IDIuMjQ2NjE0IC0wLjEyMzQ3NQordiAwLjQ4OTUyMCAyLjIyODU1OSAtMC4xMjM0NzUKK3YgMC41MDUyMjQgMi4yMTkyNTcgLTAuMTI4NTU2Cit2IDAuNDg4NjMzIDIuMjQ2NjE0IC0wLjEyODU1NgordiAwLjQ5MzI3OSAyLjIzMDYzMCAtMC4xMjg1NTYKK3YgMC41MDkzNTggMi4yMjYwNTUgLTAuMTIzNDc2Cit2IDAuNTIyNDIxIDIuMjIyNjg3IC0wLjEyMzQ3NwordiAwLjQ5Njg5MiAyLjI0NjYxNCAtMC4xMjM0NzUKK3YgMC41MDA0MTggMi4yMzQ1NjggLTAuMTIzNDc2Cit2IDAuNDg4MjQ5IDIuMTkxMzQ2IC0wLjEyODU1NgordiAwLjQ2Mzk2OCAyLjIxNDQ2NSAtMC4xMjg1NTYKK3YgMC40NTQ3MjYgMi4yNDY2MTQgLTAuMTI4NTU2Cit2IDAuNDk0NTYwIDIuMjAxNzIzIC0wLjEyODU1NgordiAwLjQ2NzMzMiAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC40NzQ4NjYgMi4yMjA0NzYgLTAuMTI4NTU2Cit2IDAuNTAwODcxIDIuMjEyMTAwIC0wLjEyODU1NgordiAwLjQ3OTkzOCAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC40ODU3NjMgMi4yMjY0ODYgLTAuMTI4NTU2Cit2IDAuNTA3MTgyIDIuMjIyNDc2IC0wLjEyODU1NgordiAwLjQ5MjU0NSAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC40OTY2NjAgMi4yMzI0OTYgLTAuMTI4NTU2Cit2IDAuNTEyNTE0IDIuMjMxMjQ0IC0wLjEyODU1NwordiAwLjUwMzE5NSAyLjI0NjYxNCAtMC4xMjg1NTYKK3YgMC41MDU4NjcgMi4yMzc1NzMgLTAuMTI4NTU2Cit2IDAuNTIyNDIxIDIuMjQ2NjE0IC0wLjEyODU1NwordiAwLjQ1MzQ4MSAyLjIwODM0OSAtMC4xMjg1NzUKK3YgMC40ODIyMTUgMi4xODEwNTAgLTAuMTI4NTc2Cit2IDAuNDM2NzkyIDIuMTU2MDk5IC0wLjEyODU3NAordiAwLjQ0MjU4MyAyLjIwMjE4NCAtMC4xMjg1NzUKK3YgMC40MzY3OTEgMi4xOTg5MDkgLTAuMTIzNDc0Cit2IDAuNDY3NDM0IDIuMTU2MDk5IC0wLjEyMzQ3NQordiAwLjUyMjQyMSAyLjE2NjgxMSAtMC4xMjg1NzcKK3YgMC40NDk1MDcgMi4yMDYwNjQgLTAuMTI4NTc2Cit2IDAuNDc5ODczIDIuMTc3MTgwIC0wLjEyODU3NgordiAwLjQ0NTU0NiAyLjIwMzc3NSAtMC4xMjM0NzUKK3YgMC40Nzc4MjUgMi4xNzM4NjMgLTAuMTIzNDc2Cit2IDAuNTIyNDIxIDIuMTYzNDk1IC0wLjEyMzQ3NwordiAwLjQ3NjAyMiAyLjE3MTAxMiAtMC4xMjg1NzcKK3YgMC41MDc2NjIgMi4xNTYwOTkgLTAuMTIzNDc2Cit2IDAuNDcxODkxIDIuMTY0MzYxIC0wLjEyMzQ3NgordiAwLjQ2OTg5MCAyLjE2MTAzMCAtMC4xMjg1NzYKK3YgMC40OTIxMjcgMi4xNTYwOTkgLTAuMTI4NTc3Cit2IDAuNDgxMjM3IDIuMTU2MDk5IC0wLjEyODU3NgordiAwLjQ2ODc2OSAyLjE1OTA4OSAtMC4xMjg1NzYKK3YgMC40NjMyODQgMi4xNTYwOTkgLTAuMTI4NTc1Cit2IDAuNDU4MTIyIDIuMTU2MDk5IC0wLjEyODU3NQordiAwLjQ1MzM0OSAyLjE1NjA5OSAtMC4xMjM0NzUKK3YgMC40NDc5NjYgMi4xNTYwOTkgLTAuMTI4NTc1Cit2IDAuNDM5Njg4IDIuMjQ5MzY4IC0wLjEyODU3NQordiAwLjQ1MTAzNSAyLjI4ODc0MyAtMC4xMjg1NzUKK3YgMC40ODA4MTQgMi4zMTcxMDEgLTAuMTI4NTc1Cit2IDAuNDM5Njg3IDIuMjQzODI0IC0wLjEyMzQ3NQordiAwLjQzOTY4OCAyLjIwMDU0NiAtMC4xMjg1NzQKK3YgMC40MzY3OTIgMi4xOTM1NTggLTAuMTI4NTc0Cit2IDAuNDM2NzkyIDIuMTg5MTIxIC0wLjEyODU3NAordiAwLjQzNjc5MiAyLjE4NDc1OCAtMC4xMjM0NzQKK3YgMC40MzY3OTIgMi4xODEwMzEgLTAuMTI4NTc0Cit2IDAuNDM2NzkyIDIuMTc2OTg4IC0wLjEyODU3NAordiAwLjQzNjc5MiAyLjE3MzE4MyAtMC4xMjM0NzQKK3YgMC40MzY3OTIgMi4xNjc2MzIgLTAuMTI4NTc0Cit2IDAuNDM2NzkxIDIuMjIyODc2IC0wLjEyODU3NQordiAwLjQzNjc5MSAyLjIxMTg4NyAtMC4xMjg1NzQKK3YgMC41NjU0MjkgMi4zMjE3MTUgLTAuMTE3OTk1Cit2IDAuNTk2MjU1IDIuMjkyNzcxIC0wLjExNzk5NQordiAwLjYwODA0OSAyLjI1MjEyMCAtMC4xMTc5OTUKK3YgMC42MDgwNTEgMi4yNDEwMzMgLTAuMTE3OTk1Cit2IDAuNjA4MDQ5IDIuMTU2MDk5IC0wLjExNzk5NwordiAwLjYwODA1MCAyLjE5ODkwOSAtMC4xMTc5OTUKK3YgMC41Nzc0MDggMi4xNTYwOTkgLTAuMTE3OTk1Cit2IDAuNTM3MTc5IDIuMTU2MDk5IC0wLjExNzk5NgordiAwLjU1MjcxNCAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC41NjM2MDUgMi4xNTYwOTkgLTAuMTE3OTk2Cit2IDAuNTgxNTU4IDIuMTU2MDk5IC0wLjExNzk5NgordiAwLjU4NjcxOSAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC41OTE0OTIgMi4xNTYwOTkgLTAuMTE3OTk1Cit2IDAuNTk2ODc1IDIuMTU2MDk5IC0wLjExNzk5NgordiAwLjYwODA1MCAyLjE5MzU1OCAtMC4xMTc5OTYKK3YgMC42MDgwNTAgMi4xODkxMjIgLTAuMTE3OTk2Cit2IDAuNjA4MDUwIDIuMTg0NzU4IC0wLjExNzk5NQordiAwLjYwODA1MCAyLjE4MTAzMSAtMC4xMTc5OTYKK3YgMC42MDgwNTAgMi4xNzY5ODggLTAuMTE3OTk2Cit2IDAuNjA4MDUwIDIuMTczMTgzIC0wLjExNzk5NQordiAwLjYwODA0OSAyLjE2NzYzMiAtMC4xMTc5OTcKK3YgMC42MDgwNTEgMi4yMjI4NzYgLTAuMTE3OTk2Cit2IDAuNjA4MDUwIDIuMjExODg3IC0wLjExNzk5NgordiAwLjUyMjQyMSAyLjMzMjc0MSAtMC4xMTc5OTUKK3YgMC41MjI0MjEgMi4xNTYwOTkgLTAuMTE3OTk4Cit2IDAuNDc5NDEzIDIuMzIxNzE1IC0wLjExNzk5NQordiAwLjQ0ODU4OSAyLjI5Mjc3MSAtMC4xMTc5OTUKK3YgMC40MzY3OTMgMi4yNTIxMjAgLTAuMTE3OTk1Cit2IDAuNDM2NzkxIDIuMjQxMDMzIC0wLjExNzk5NQordiAwLjQzNjc5MyAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC40MzY3OTEgMi4xOTg5MDkgLTAuMTE3OTk1Cit2IDAuNDY3NDM0IDIuMTU2MDk5IC0wLjExNzk5NQordiAwLjUwNzY2MiAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC40OTIxMjcgMi4xNTYwOTkgLTAuMTE3OTk4Cit2IDAuNDgxMjM3IDIuMTU2MDk5IC0wLjExNzk5NwordiAwLjQ2MzI4NCAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC40NTgxMjIgMi4xNTYwOTkgLTAuMTE3OTk2Cit2IDAuNDUzMzQ5IDIuMTU2MDk5IC0wLjExNzk5NQordiAwLjQ0Nzk2NiAyLjE1NjA5OSAtMC4xMTc5OTYKK3YgMC40MzY3OTIgMi4xOTM1NTggLTAuMTE3OTk2Cit2IDAuNDM2NzkyIDIuMTg5MTIxIC0wLjExNzk5NgordiAwLjQzNjc5MiAyLjE4NDc1OCAtMC4xMTc5OTUKK3YgMC40MzY3OTIgMi4xODEwMzEgLTAuMTE3OTk2Cit2IDAuNDM2NzkyIDIuMTc2OTg4IC0wLjExNzk5NgordiAwLjQzNjc5MiAyLjE3MzE4MyAtMC4xMTc5OTUKK3YgMC40MzY3OTIgMi4xNjc2MzIgLTAuMTE3OTk2Cit2IDAuNDM2NzkxIDIuMjIyODc2IC0wLjExNzk5NgordiAwLjQzNjc5MSAyLjIxMTg4NyAtMC4xMTc5OTYKK3YgMC41NjU0MjkgMi4zMjE3MTUgLTAuMTIyODM0Cit2IDAuNTk2MjU1IDIuMjkyNzcxIC0wLjEyMjgzNAordiAwLjYwODA0OSAyLjI1MjEyMCAtMC4xMjI4MzQKK3YgMC42MDgwNTEgMi4yNDEwMzMgLTAuMTIyODM0Cit2IDAuNjA4MDQ5IDIuMTU2MDk5IC0wLjEyNzcwNQordiAwLjYwODA1MCAyLjE5ODkwOSAtMC4xMjI4MzMKK3YgMC41Nzc0MDggMi4xNTYwOTkgLTAuMTIyODM0Cit2IDAuNTM3MTc5IDIuMTU2MDk5IC0wLjEyMjgzNQordiAwLjU1MjcxNCAyLjE1NjA5OSAtMC4xMjc3MDUKK3YgMC41NjM2MDUgMi4xNTYwOTkgLTAuMTI3NzA1Cit2IDAuNTgxNTU4IDIuMTU2MDk5IC0wLjEyNzcwNQordiAwLjU4NjcxOSAyLjE1NjA5OSAtMC4xMjc3MDUKK3YgMC41OTE0OTIgMi4xNTYwOTkgLTAuMTIyODMzCit2IDAuNTk2ODc1IDIuMTU2MDk5IC0wLjEyNzcwNQordiAwLjYwODA1MCAyLjE5MzU1OCAtMC4xMjc3MDUKK3YgMC42MDgwNTAgMi4xODkxMjIgLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMTg0NzU4IC0wLjEyMjgzMwordiAwLjYwODA1MCAyLjE4MTAzMSAtMC4xMjc3MDUKK3YgMC42MDgwNTAgMi4xNzY5ODggLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMTczMTgzIC0wLjEyMjgzMwordiAwLjYwODA0OSAyLjE2NzYzMiAtMC4xMjc3MDUKK3YgMC42MDgwNTEgMi4yMjI4NzYgLTAuMTI3NzA1Cit2IDAuNjA4MDUwIDIuMjExODg3IC0wLjEyNzcwNQordiAwLjUyMjQyMSAyLjMzMjc0MSAtMC4xMjI4MzQKK3YgMC41MjI0MjEgMi4xNTYwOTkgLTAuMTI3NzA3Cit2IDAuNDc5NDEzIDIuMzIxNzE1IC0wLjEyMjgzNAordiAwLjQ0ODU4OSAyLjI5Mjc3MSAtMC4xMjI4MzQKK3YgMC40MzY3OTMgMi4yNTIxMjAgLTAuMTIyODM0Cit2IDAuNDM2NzkxIDIuMjQxMDMzIC0wLjEyMjgzNAordiAwLjQzNjc5MiAyLjE1NjA5OSAtMC4xMjc3MDQKK3YgMC40MzY3OTEgMi4xOTg5MDkgLTAuMTIyODMzCit2IDAuNDY3NDM0IDIuMTU2MDk5IC0wLjEyMjgzNAordiAwLjUwNzY2MiAyLjE1NjA5OSAtMC4xMjI4MzUKK3YgMC40OTIxMjcgMi4xNTYwOTkgLTAuMTI3NzA3Cit2IDAuNDgxMjM3IDIuMTU2MDk5IC0wLjEyNzcwNgordiAwLjQ2MzI4NCAyLjE1NjA5OSAtMC4xMjc3MDUKK3YgMC40NTgxMjIgMi4xNTYwOTkgLTAuMTI3NzA1Cit2IDAuNDUzMzQ5IDIuMTU2MDk5IC0wLjEyMjgzMwordiAwLjQ0Nzk2NiAyLjE1NjA5OSAtMC4xMjc3MDUKK3YgMC40MzY3OTIgMi4xOTM1NTggLTAuMTI3NzA0Cit2IDAuNDM2NzkyIDIuMTg5MTIxIC0wLjEyNzcwNAordiAwLjQzNjc5MiAyLjE4NDc1OCAtMC4xMjI4MzMKK3YgMC40MzY3OTIgMi4xODEwMzEgLTAuMTI3NzA0Cit2IDAuNDM2NzkyIDIuMTc2OTg4IC0wLjEyNzcwNAordiAwLjQzNjc5MiAyLjE3MzE4MyAtMC4xMjI4MzMKK3YgMC40MzY3OTIgMi4xNjc2MzIgLTAuMTI3NzA0Cit2IDAuNDM2NzkxIDIuMjIyODc2IC0wLjEyNzcwNQordiAwLjQzNjc5MSAyLjIxMTg4NyAtMC4xMjc3MDQKK3YgMC41NzA5MDAgMi4xNDM4NDYgLTAuMTI4NTc2Cit2IDAuNDczOTQyIDIuMTY3Nzg0IC0wLjEyODU3NgordiAwLjUzMDQ2OSAyLjE1MjY4NiAtMC4xMjg1NzYKK3YgMC41MTQ1MTQgMi4xNTI2ODcgLTAuMTI4NTc2Cit2IDAuNTIyNDIxIDIuMTUyNjg2IC0wLjEyODU3NgordiAwLjUxNDIxMCAyLjE1ODg2NyAtMC4xMjc5MjgKK3YgMC41MzAxNzUgMi4xNTg4ODcgLTAuMTI4NTc2Cit2IDAuNTIyNDIxIDIuMTU4ODcxIC0wLjEyODU3NwordiAwLjUxNzk2NSAyLjE1MDM3NyAtMC4xMjg1NzYKK3YgMC41MTcxMzEgMi4xNjE0NDYgLTAuMTI4NTc3Cit2IDAuNDY5NjE4IDIuMDQxMzUyIC0wLjA2NDY2MwordiAwLjQ5MTUyMiAyLjAyMDQ5NiAtMC4wNjQ2NjQKK3YgMC41MjI0MjEgMi4wMTI1MzYgLTAuMDY0NjYzCit2IDAuNTUzMjgyIDIuMDIwNDk1IC0wLjA2NDY2NAordiAwLjU3NTE4OSAyLjA0MTM1NCAtMC4wNjQ2NjMKK3YgMC41ODM1NjAgMi4wNzA3MjggLTAuMDY0NjYzCit2IDAuNTc1MTg3IDIuMTAwMTYzIC0wLjA2NDY2MwordiAwLjU1MzI4MyAyLjEyMTAyMSAtMC4wNjQ2NjMKK3YgMC41MjI0MjEgMi4xMjg5ODkgLTAuMDY0NjYzCit2IDAuNDkxNTIxIDIuMTIxMDIxIC0wLjA2NDY2MwordiAwLjQ2OTYyMCAyLjEwMDE2NSAtMC4wNjQ2NjMKK3YgMC40NjEyNjIgMi4wNzA3MjggLTAuMDY0NjYzCit2IDAuNDY5NjE4IDIuMjcwMjc2IC0wLjA2NDY2NAordiAwLjQ5MTUyMiAyLjI5MTEzMiAtMC4wNjQ2NjQKK3YgMC41MjI0MjAgMi4yOTkwOTMgLTAuMDY0NjYzCit2IDAuNTUzMjgyIDIuMjkxMTMzIC0wLjA2NDY2NAordiAwLjU3NTE4OCAyLjI3MDI3NSAtMC4wNjQ2NjQKK3YgMC41ODM1NjAgMi4yNDA5MDEgLTAuMDY0NjYzCit2IDAuNTc1MTg3IDIuMjExNDY2IC0wLjA2NDY2NAordiAwLjU1MzI4MyAyLjE5MDYwOCAtMC4wNjQ2NjQKK3YgMC41MjI0MjAgMi4xODI2NDAgLTAuMDY0NjY0Cit2IDAuNDkxNTIxIDIuMTkwNjA4IC0wLjA2NDY2NAordiAwLjQ2OTYxOSAyLjIxMTQ2NCAtMC4wNjQ2NjQKK3YgMC40NjEyNjIgMi4yNDA5MDEgLTAuMDY0NjY0Cit2IDAuNDM3MjE4IDIuMDcwNzI2IC0wLjE0MjQxNgordiAwLjQzNzIxOCAyLjExMjgwMCAtMC4xNDI0MTYKK3YgMC40MzcyMTggMi4xNTU4MjkgLTAuMTQyNDE2Cit2IDAuNDM3MjE4IDIuMTk4NzU3IC0wLjE0MjQxNgordiAwLjQ0ODk1NiAyLjI5MjQxNyAtMC4xNDI0MTYKK3YgMC41NjUyMTYgMi4zMjEyMTcgLTAuMTQyNDE2Cit2IDAuNTk1ODg3IDIuMjkyNDE4IC0wLjE0MjQxNgordiAwLjYwNzYyNCAyLjI1MTk2OSAtMC4xNDI0MTYKK3YgMC42MDc2MjQgMi4yNDA5MDQgLTAuMTQyNDE2Cit2IDAuNjA3NjI0IDIuMTk4ODMwIC0wLjE0MjQxNgordiAwLjYwNzYyNCAyLjExMjc5OSAtMC4xNDI0MTYKK3YgMC42MDc2MjQgMi4wNzA3MjUgLTAuMTQyNDE2Cit2IDAuNjA3NjI0IDIuMDU5NjU5IC0wLjE0MjQxNgordiAwLjU5NTg4NyAyLjAxOTIxMSAtMC4xNDI0MTYKK3YgMC41MjI0MjIgMS45Nzk0NDAgLTAuMTQyNDE2Cit2IDAuNDc5NjI3IDEuOTkwNDEyIC0wLjE0MjQxNgordiAwLjQ1NDM5OSAyLjAyMjI0MCAtMC4xNDU1ODgKK3YgMC40MzcyMTkgMi4wNTk2NjAgLTAuMTM5OTAzCit2IDAuNDM3MjE5IDIuMjUyMDI1IC0wLjEzOTkwMwordiAwLjQ0ODk1NiAyLjI5MjQxNyAtMC4xMzk5MDMKK3YgMC40Nzk2MjcgMi4zMjEyMTcgLTAuMTM5OTAyCit2IDAuNjA3NjI0IDIuMjUxOTY5IC0wLjEzOTkwMgordiAwLjYwNzYyNCAyLjE5ODgzMCAtMC4xMzk5MDIKK3YgMC42MDc2MjQgMi4xMTI3OTkgLTAuMTM5OTAyCit2IDAuNjA3NjI0IDIuMDU5NjU5IC0wLjEzOTkwMgordiAwLjQ3OTYyNyAxLjk5MDQxMiAtMC4xMzk5MDMKK3YgMC40NDg5NTYgMi4wMTkyMTIgLTAuMTM5OTAzCit2IDAuNDQzMzEyIDIuMDcwNzI2IC0wLjE0NTU4OAordiAwLjQ0MzMxMyAyLjE1NTgyOSAtMC4xNDU1ODgKK3YgMC40NDMzMTMgMi4xOTg3NTcgLTAuMTQ1NTg4Cit2IDAuNDgyNzY4IDIuMzE2MDI3IC0wLjE0NTU4OAordiAwLjUyMjQyMSAyLjMyNjE5MyAtMC4xNDU1ODgKK3YgMC41NjIwNzUgMi4zMTYwMjcgLTAuMTQ1NTg4Cit2IDAuNTkwNDQ0IDIuMjg5Mzg5IC0wLjE0NTU4OAordiAwLjYwMTUyOSAyLjI1MTE4NiAtMC4xNDU1ODgKK3YgMC42MDE1MjkgMi4xOTg4MzAgLTAuMTQ1NTg4Cit2IDAuNjAxNTI5IDIuMTEyNzk5IC0wLjE0NTU4OAordiAwLjU5MDQ0NCAyLjAyMjI0MCAtMC4xNDU1ODgKK3YgMC41MjI0MjIgMS45ODU0MzUgLTAuMTQ1NTg4Cit2IDAuNDgyNzY4IDEuOTk1NjAyIC0wLjE0NTU4OAordiAwLjQ0ODk1NiAyLjAxOTIxMiAtMC4xNDI0MTYKK3YgMC40NTg3OTQgMi4wNjI0MzMgLTAuMTQ1NTg4Cit2IDAuNDU4NzkzIDIuMDcwNzI3IC0wLjE0NTU4OAordiAwLjQ1ODc5MyAyLjExMjgwMCAtMC4xNDU1ODgKK3YgMC40NTg3OTMgMi4xNTU4MjkgLTAuMTQ1NTg4Cit2IDAuNDU4NzkzIDIuMTk4NzU3IC0wLjE0NTU4OAordiAwLjQ1ODc5NCAyLjI0OTI0OCAtMC4xNDU1ODgKK3YgMC40NjgyMjIgMi4yODE2OTMgLTAuMTQ1NTg4Cit2IDAuNTIyNDIxIDIuMzEwOTY2IC0wLjE0NTU4OAordiAwLjU3NjYxOCAyLjI4MTY5NyAtMC4xNDU1ODgKK3YgMC41ODYwNDkgMi4yNDkxOTcgLTAuMTQ1NTg4Cit2IDAuNTg2MDQ5IDIuMjQwOTA0IC0wLjE0NTU4OAordiAwLjU4NjA0OSAyLjE1NTgyOSAtMC4xNDU1ODgKK3YgMC41ODYwNDkgMi4wNzA3MjUgLTAuMTQ1NTg4Cit2IDAuNTg2MDQ5IDIuMDYyNDMxIC0wLjE0NTU4OAordiAwLjU3NjYxOCAyLjAyOTkzMiAtMC4xNDU1ODgKK3YgMC41MjI0MjIgMi4wMDA2NjMgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMDA4Nzg0IC0wLjE0NTU4OAordiAwLjQ2ODIyNSAyLjAyOTkzMiAtMC4xNDU1ODgKK3YgMC41MjI0MjIgMi4wNjI0MzIgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMDcwNzI3IC0wLjE0NTU4OAordiAwLjUyMjQyMiAyLjA3MDcyNiAtMC4xNDU1ODgKK3YgMC40OTA3NDcgMi4xNTU4MjkgLTAuMTQ1NTg4Cit2IDAuNTIyNDIyIDIuMTU1ODI5IC0wLjE0NTU4OAordiAwLjU1NDA5NiAyLjE1NTgyOSAtMC4xNDU1ODgKK3YgMC41MjI0MjIgMi4xOTg3OTQgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMjQwODk4IC0wLjE0NTU4OAordiAwLjUyMjQyMiAyLjI0MDkwMCAtMC4xNDU1ODgKK3YgMC40NDMzMTQgMi4wNjA0NDMgLTAuMTQ1NTg4Cit2IDAuNDM3MjE4IDIuMjQwODk4IC0wLjE0MjQxNgordiAwLjQzNzIxOSAyLjI1MjAyNSAtMC4xNDI0MTYKK3YgMC40Nzk2MjcgMi4zMjEyMTcgLTAuMTQyNDE2Cit2IDAuNTIyNDIxIDIuMzMyMTg5IC0wLjE0MjQxNgordiAwLjYwNzYyNCAyLjE1NTgyOSAtMC4xNDI0MTYKK3YgMC41NjUyMTYgMS45OTA0MTIgLTAuMTQyNDE2Cit2IDAuNDM3MjE4IDIuMDcwNzI2IC0wLjEzOTkwMwordiAwLjQzNzIxOCAyLjExMjgwMCAtMC4xMzk5MDMKK3YgMC40MzcyMTggMi4xNTU4MjkgLTAuMTM5OTAzCit2IDAuNDM3MjE4IDIuMTk4NzU3IC0wLjEzOTkwMwordiAwLjQzNzIxOCAyLjI0MDg5OCAtMC4xMzk5MDMKK3YgMC41MjI0MjEgMi4zMzIxODkgLTAuMTM5OTAyCit2IDAuNTY1MjE2IDIuMzIxMjE3IC0wLjEzOTkwMgordiAwLjU5NTg4NyAyLjI5MjQxOCAtMC4xMzk5MDIKK3YgMC42MDc2MjQgMi4yNDA5MDQgLTAuMTM5OTAyCit2IDAuNjA3NjI0IDIuMTU1ODI5IC0wLjEzOTkwMgordiAwLjYwNzYyNCAyLjA3MDcyNSAtMC4xMzk5MDIKK3YgMC41OTU4ODcgMi4wMTkyMTEgLTAuMTM5OTAyCit2IDAuNTY1MjE2IDEuOTkwNDEyIC0wLjEzOTkwMgordiAwLjUyMjQyMiAxLjk3OTQ0MCAtMC4xMzk5MDIKK3YgMC40MzcyMTkgMi4wNTk2NjAgLTAuMTQyNDE2Cit2IDAuNDQzMzEzIDIuMTEyODAwIC0wLjE0NTU4OAordiAwLjQ0MzMxMiAyLjI0MDg5NyAtMC4xNDU1ODgKK3YgMC40NDMzMTQgMi4yNTEyNDAgLTAuMTQ1NTg4Cit2IDAuNDU0Mzk4IDIuMjg5Mzg4IC0wLjE0NTU4OAordiAwLjYwMTUyOSAyLjI0MDkwNCAtMC4xNDU1ODgKK3YgMC42MDE1MjkgMi4xNTU4MjkgLTAuMTQ1NTg4Cit2IDAuNjAxNTI5IDIuMDcwNzI1IC0wLjE0NTU4OAordiAwLjYwMTUyOSAyLjA2MDQ0MiAtMC4xNDU1ODgKK3YgMC41NjIwNzUgMS45OTU2MDIgLTAuMTQ1NTg4Cit2IDAuNDU4NzkzIDIuMjQwODk2IC0wLjE0NTU4OAordiAwLjQ5MDc0NyAyLjMwMjg0NSAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4zMDI4NDUgLTAuMTQ1NTg4Cit2IDAuNTg2MDQ5IDIuMTk4ODMwIC0wLjE0NTU4OAordiAwLjU4NjA0OSAyLjExMjc5OSAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4wMDg3ODMgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMDYyNDMyIC0wLjE0NTU4OAordiAwLjU1NDA5NiAyLjA2MjQzMSAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4wNzA3MjYgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMTEyODAwIC0wLjE0NTU4OAordiAwLjUyMjQyMiAyLjExMjgwMCAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4xMTI3OTkgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMTk4Nzc2IC0wLjE0NTU4OAordiAwLjU1NDA5NiAyLjE5ODgxMiAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4yNDA5MDIgLTAuMTQ1NTg4Cit2IDAuNDkwNzQ3IDIuMjQ5MjM2IC0wLjE0NTU4OAordiAwLjUyMjQyMiAyLjI0OTIyMyAtMC4xNDU1ODgKK3YgMC41NTQwOTYgMi4yNDkyMTAgLTAuMTQ1NTg4Cit2IC0xLjQ5MTQxNCAyLjQzOTc4MyAwLjE1NDY3MgordiAtMS40OTE0MTQgLTIuMzYyODczIDAuMTU0NjYwCit2IDEuMTg2MDg0IDIuNDM5Nzg0IDAuMTU0NjgyCit2IDEuMTg2MDg0IC0yLjM2Mjg3MiAwLjE1NDY3MQordiAtMS40OTE0MTQgLTEuMTU0MzM0IDAuMTU0NjYzCit2IC0xLjQ5MTQxNCAwLjAzODQ1NSAwLjE1NDY2NgordiAtMS40OTE0MTQgMS4yMzEyNDUgMC4xNTQ2NjkKK3YgMS4xODYwODQgMS4yMzEyNDYgMC4xNTQ2NzkKK3YgMS4xODYwODQgMC4wMzg0NTUgMC4xNTQ2NzcKK3YgMS4xODYwODQgLTEuMTU0MzM0IDAuMTU0Njc0Cit2IC0wLjU5MzY2NSAyLjQzOTc4MyAwLjE1NDY3NQordiAwLjI4ODMzNiAyLjQzOTc4MyAwLjE1NDY3OQordiAwLjI4ODMzNiAtMi4zNjI4NzIgMC4xNTQ2NjcKK3YgLTAuNTkzNjY1IC0yLjM2Mjg3MiAwLjE1NDY2NAordiAwLjI4ODMzNiAtMS4xNTQzMzQgMC4xNTQ2NzAKK3YgLTAuNTkzNjY1IC0xLjE1NDMzNSAwLjE1NDY2NwordiAwLjI4ODMzNiAwLjAzODQ1NSAwLjE1NDY3MwordiAtMC41OTM2NjUgMC4wMzg0NTUgMC4xNTQ2NzAKK3YgLTAuNTkzNjY1IDEuMjMxMjQ1IDAuMTU0NjczCit2IDAuMjg4MzM2IDEuMjMxMjQ2IDAuMTU0Njc2Cit2IC0wLjk5ODI5OCAyLjc3MTAwMCAwLjEzODY4NwordiAtMS4wNDI2NzUgMi43ODkzOTggMC4xMzg2ODcKK3YgLTEuMDg3MDUxIDIuNzcxMDAwIDAuMTM4Njg3Cit2IC0xLjEwNTQ0OSAyLjcyNjYyNCAwLjEzODY4NwordiAtMS4wODcwNTEgMi42ODIyNDggMC4xMzg2ODcKK3YgLTEuMDQyNjc1IDIuNjYzODUwIDAuMTM4Njg3Cit2IC0wLjk5ODI5OCAyLjY4MjI0OCAwLjEzODY4NwordiAtMC45Nzk4OTUgMi43MjY2MTEgMC4xMzg2ODcKK3YgLTEuMDE4MzAzIDIuNzUwOTk1IDAuMTM4Njg3Cit2IC0xLjA0MjY3NSAyLjc2MTA5OSAwLjEzODY4NwordiAtMS4wNjcwNDYgMi43NTA5OTUgMC4xMzg2ODcKK3YgLTEuMDc3MTUwIDIuNzI2NjI0IDAuMTM4Njg3Cit2IC0xLjA2NzA0NiAyLjcwMjI1MiAwLjEzODY4NwordiAtMS4wNDI2NzUgMi42OTIxNDggMC4xMzg2ODcKK3YgLTEuMDE4MzAzIDIuNzAyMjUyIDAuMTM4Njg3Cit2IC0xLjAwODE5NiAyLjcyNjYxNSAwLjEzODY4NwordiAtMS4wMTczNjAgMi43NTE5MzggMC4xMjU5MDEKK3YgLTEuMDQyNjc1IDIuNzYyNDMzIDAuMTI1OTAxCit2IC0xLjA2Nzk4OSAyLjc1MTkzOCAwLjEyNTkwMQordiAtMS4wNzg0ODUgMi43MjY2MjQgMC4xMjU5MDEKK3YgLTEuMDY3OTg5IDIuNzAxMzA5IDAuMTI1OTAxCit2IC0xLjA0MjY3NSAyLjY5MDgxNCAwLjEyNTkwMQordiAtMS4wMTczNjAgMi43MDEzMDkgMC4xMjU5MDEKK3YgLTEuMDA2ODYyIDIuNzI2NjE1IDAuMTI1OTAxCit2IC0xLjAyNzE4NCAyLjc0MjExMyAwLjEyNTkwMQordiAtMS4wNDI2NzUgMi43NDg1MzUgMC4xMjU5MDEKK3YgLTEuMDU4MTY0IDIuNzQyMTEzIDAuMTI1OTAxCit2IC0xLjA2NDU4NiAyLjcyNjYyMyAwLjEyNTkwMQordiAtMS4wNTgxNjQgMi43MTExMzMgMC4xMjU5MDEKK3YgLTEuMDQyNjc1IDIuNzA0NzExIDAuMTI1OTAxCit2IC0xLjAyNzE4NCAyLjcxMTEzMyAwLjEyNTkwMQordiAtMS4wMjA3NjEgMi43MjY2MTggMC4xMjU5MDEKK3YgLTEuMDI5NDY3IDIuNzM5ODMwIDAuMTE4MzE0Cit2IC0xLjA0MjY3NSAyLjc0NTMwNiAwLjExODMxNAordiAtMS4wNTU4ODIgMi43Mzk4MzAgMC4xMTgzMTQKK3YgLTEuMDYxMzU3IDIuNzI2NjIzIDAuMTE4MzE0Cit2IC0xLjA1NTg4MiAyLjcxMzQxNiAwLjExODMxNAordiAtMS4wNDI2NzUgMi43MDc5NDEgMC4xMTgzMTQKK3YgLTEuMDI5NDY3IDIuNzEzNDE2IDAuMTE4MzE0Cit2IC0xLjAyMzk5MCAyLjcyNjYxOSAwLjExODMxNAordiAtMS4wMzE2OTggMi43Mzc1OTkgMC4xMjA2NzUKK3YgLTEuMDQyNjc1IDIuNzQyMTUwIDAuMTIwNjc1Cit2IC0xLjA1MzY1MSAyLjczNzU5OSAwLjEyMDY3NQordiAtMS4wNTgyMDIgMi43MjY2MjMgMC4xMjA2NzUKK3YgLTEuMDUzNjUxIDIuNzE1NjQ2IDAuMTIwNjc1Cit2IC0xLjA0MjY3NSAyLjcxMTA5NSAwLjEyMDY3NQordiAtMS4wMzE2OTggMi43MTU2NDYgMC4xMjA2NzUKK3YgLTEuMDI3MTQ1IDIuNzI2NjIwIDAuMTIwNjc1Cit2IC0xLjAzNTI3MCAyLjczNDAyNiAwLjEyMTg5MAordiAtMS4wNDI2NzUgMi43MzcwOTYgMC4xMjE4OTAKK3YgLTEuMDUwMDc4IDIuNzM0MDI2IDAuMTIxODg5Cit2IC0xLjA1MzE0OCAyLjcyNjYyMyAwLjEyMTg4OQordiAtMS4wNTAwNzggMi43MTkyMTkgMC4xMjE4ODkKK3YgLTEuMDQyNjc1IDIuNzE2MTQ5IDAuMTIxODg5Cit2IC0xLjAzNTI3MCAyLjcxOTIxOSAwLjEyMTg4OQordiAtMS4wMzIyMDAgMi43MjY2MjEgMC4xMjE4OTAKK3YgLTEuMDM4MDA2IDIuNzMxMjkxIDAuMTIyMjk3Cit2IC0xLjA0MjY3NSAyLjczMzIyNyAwLjEyMjI5NwordiAtMS4wNDczNDMgMi43MzEyOTEgMC4xMjIyOTcKK3YgLTEuMDQ5Mjc5IDIuNzI2NjIzIDAuMTIyMjk3Cit2IC0xLjA0NzM0MyAyLjcyMTk1NCAwLjEyMjI5NwordiAtMS4wNDI2NzUgMi43MjAwMTggMC4xMjIyOTcKK3YgLTEuMDM4MDA2IDIuNzIxOTU0IDAuMTIyMjk3Cit2IC0xLjAzNjA2OSAyLjcyNjYyMSAwLjEyMjI5NwordiAtMS4wNDI2NzUgMi43MjY2MjIgMC4xMjIyOTcKK3YgLTEuMDI5NzExIDIuNzM5NTg2IDAuMTE4MTgwCit2IC0xLjA0MjY3NSAyLjc0NDk2MCAwLjExODE4MAordiAtMS4wNTU2MzggMi43Mzk1ODYgMC4xMTgxODAKK3YgLTEuMDYxMDEyIDIuNzI2NjIzIDAuMTE4MTgwCit2IC0xLjA1NTYzOCAyLjcxMzY2MCAwLjExODE4MAordiAtMS4wNDI2NzUgMi43MDgyODUgMC4xMTgxODAKK3YgLTEuMDI5NzExIDIuNzEzNjYwIDAuMTE4MTgwCit2IC0xLjAyNDMzNSAyLjcyNjYxOSAwLjExODE4MAordiAtMS4wMjk3MTEgMi43Mzk1ODYgMC4xMjI1OTkKK3YgLTEuMDQyNjc1IDIuNzQ0OTYwIDAuMTIyNTk5Cit2IC0xLjA1NTYzOCAyLjczOTU4NiAwLjEyMjU5OQordiAtMS4wNjEwMTIgMi43MjY2MjMgMC4xMjI1OTkKK3YgLTEuMDU1NjM4IDIuNzEzNjYwIDAuMTIyNTk5Cit2IC0xLjA0MjY3NSAyLjcwODI4NSAwLjEyMjU5OQordiAtMS4wMjk3MTEgMi43MTM2NjAgMC4xMjI1OTkKK3YgLTEuMDI0MzM1IDIuNzI2NjE5IDAuMTIyNTk5Cit2IC0xLjAyOTM2OCAyLjczOTkyOSAwLjEyMzA0NwordiAtMS4wMjc1MjcgMi43NDE3NzAgMC4xMjU0NTMKK3YgLTEuMDQyNjc1IDIuNzQ1NDQ1IDAuMTIzMDQ3Cit2IC0xLjA0MjY3NSAyLjc0ODA1MCAwLjEyNTQ1MwordiAtMS4wNTU5ODAgMi43Mzk5MjkgMC4xMjMwNDcKK3YgLTEuMDU3ODIyIDIuNzQxNzcwIDAuMTI1NDUzCit2IC0xLjA2MTQ5NyAyLjcyNjYyMyAwLjEyMzA0NwordiAtMS4wNjQxMDIgMi43MjY2MjMgMC4xMjU0NTMKK3YgLTEuMDU1OTgwIDIuNzEzMzE3IDAuMTIzMDQ3Cit2IC0xLjA1NzgyMiAyLjcxMTQ3NiAwLjEyNTQ1MwordiAtMS4wNDI2NzUgMi43MDc4MDAgMC4xMjMwNDcKK3YgLTEuMDQyNjc1IDIuNzA1MTk2IDAuMTI1NDUzCit2IC0xLjAyOTM2OCAyLjcxMzMxNyAwLjEyMzA0NwordiAtMS4wMjc1MjcgMi43MTE0NzYgMC4xMjU0NTMKK3YgLTEuMDIzODUwIDIuNzI2NjE5IDAuMTIzMDQ3Cit2IC0xLjAyMTI0NSAyLjcyNjYxOCAwLjEyNTQ1MwordiAtMS4wMTgzMDMgMi43NTA5OTUgMC4xMjgzNjYKK3YgLTEuMDQyNjc1IDIuNzYxMDk5IDAuMTI4MzY2Cit2IC0xLjA2NzA0NiAyLjc1MDk5NSAwLjEyODM2NgordiAtMS4wNzcxNTAgMi43MjY2MjQgMC4xMjgzNjYKK3YgLTEuMDY3MDQ2IDIuNzAyMjUyIDAuMTI4MzY2Cit2IC0xLjA0MjY3NSAyLjY5MjE0OCAwLjEyODM2NgordiAtMS4wMTgzMDMgMi43MDIyNTIgMC4xMjgzNjYKK3YgLTEuMDA4MTk2IDIuNzI2NjE1IDAuMTI4MzY2Cit2IDAuMzMwMjIwIDIuNjAwMDY1IDAuMTYwMzkxCit2IDAuMzMwMjIwIDIuNjAwMDY1IDAuMTQ3ODU3Cit2IDAuMzU5NzgyIDIuNTg3NTk4IDAuMTQ3ODU3Cit2IDAuMzU5NzgyIDIuNTg3NTk4IDAuMTYwMzkxCit2IDAuMjg4NzI1IDIuNjAwMDY1IDAuMTYwMzkxCit2IDAuMjg4NzI1IDIuNjAwMDY1IDAuMTQ3ODU3Cit2IDAuMjQyMTA1IDIuNjAwMDY1IDAuMTYwMzkxCit2IDAuMjQyMTA1IDIuNjAwMDY1IDAuMTQ3ODU3Cit2IDAuMjEyNTQyIDIuNTg3NTk4IDAuMTYwMzkxCit2IDAuMjEyNTQyIDIuNTg3NTk4IDAuMTQ3ODU3Cit2IDAuMjAwMjc5IDIuNTU3ODQxIDAuMTYwMzkxCit2IDAuMjAwMjc5IDIuNTU3ODQxIDAuMTQ3ODU3Cit2IDAuMjEyNTQyIDIuNTI4MDUxIDAuMTYwMzkxCit2IDAuMjEyNTQyIDIuNTI4MDUxIDAuMTQ3ODU3Cit2IDAuMjQyMTA1IDIuNTE1NTgzIDAuMTYwMzkxCit2IDAuMjQyMTA1IDIuNTE1NTgzIDAuMTQ3ODU3Cit2IDAuMjg4NzI1IDIuNTE1NTgzIDAuMTYwMzkxCit2IDAuMjg4NzI1IDIuNTE1NTgzIDAuMTQ3ODU3Cit2IDAuMzMwMjIwIDIuNTE1NTgzIDAuMTYwMzkxCit2IDAuMzMwMjIwIDIuNTE1NTgzIDAuMTQ3ODU3Cit2IDAuMzU5NzgyIDIuNTI4MDUwIDAuMTYwMzkxCit2IDAuMzU5NzgyIDIuNTI4MDUwIDAuMTQ3ODU3Cit2IDAuMzcyMDM4IDIuNTU3ODQxIDAuMTYwMzkxCit2IDAuMzcyMDM4IDIuNTU3ODQxIDAuMTQ3ODU3Cit2IDAuMzY4NjYzIDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzU3Njc1IDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzQ5MzM4IDIuNTM4MDkxIDAuMTQ3ODU3Cit2IDAuMzU3Mzg1IDIuNTMwNDI2IDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTk2OTQ0IDAuMTQ3ODU3Cit2IDAuMzU3Mzg2IDIuNTg1MjIyIDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTE4NzA0IDAuMTQ3ODU3Cit2IDAuMjg4NzI1IDIuNTE4NzA0IDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTE4NzA0IDAuMTQ3ODU3Cit2IDAuMjE0OTM5IDIuNTMwNDI3IDAuMTQ3ODU3Cit2IDAuMjAzNjU0IDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMjE0OTM4IDIuNTg1MjIyIDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTk2OTQ0IDAuMTQ3ODU3Cit2IDAuMjg4NzI1IDIuNTk2OTQ0IDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTI5NzU0IDAuMTQ3ODU3Cit2IDAuMjIyOTg2IDIuNTM4MDkxIDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTI5NzU0IDAuMTQ3ODU3Cit2IDAuMzA5ODM5IDIuNTM4MDkxIDAuMTQ3ODU3Cit2IDAuMjE0NjUwIDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMjIyOTg2IDIuNTc3NTkwIDAuMTQ3ODU3Cit2IDAuMzA5ODM5IDIuNTc3NTkwIDAuMTQ3ODU3Cit2IDAuMjYyNDg1IDIuNTc3NTkwIDAuMTQ3ODU3Cit2IDAuMjcwODIyIDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzAxNTAyIDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzQ5MzM4IDIuNTc3NTkwIDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTg1OTI2IDAuMTQ3ODU3Cit2IDAuMjYyNDg1IDIuNTM4MDkxIDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTg1OTI2IDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTMxMTA4IDAuMTQ3ODU3Cit2IDAuMjIzOTM5IDIuNTM5MDQzIDAuMTQ3ODU3Cit2IDAuMjE2MDA0IDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMjIzOTM5IDIuNTc2NjM2IDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTg0NTcxIDAuMTQ3ODU3Cit2IDAuMjYxNTMyIDIuNTc2NjM2IDAuMTQ3ODU3Cit2IDAuMjY5NDY3IDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMjYxNTMyIDIuNTM5MDQzIDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTg0NTcxIDAuMTQ3ODU3Cit2IDAuMzQ4Mzg1IDIuNTc2NjM2IDAuMTQ3ODU3Cit2IDAuMzU2MzIwIDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzQ4Mzg1IDIuNTM5MDQzIDAuMTQ3ODU3Cit2IDAuMzI5NTg4IDIuNTMxMTA4IDAuMTQ3ODU3Cit2IDAuMzEwNzkyIDIuNTM5MDQzIDAuMTQ3ODU3Cit2IDAuMzAyODU3IDIuNTU3ODQwIDAuMTQ3ODU3Cit2IDAuMzEwNzkyIDIuNTc2NjM2IDAuMTQ3ODU3Cit2IDAuMjQyNzM2IDIuNTM4NTEzIDAuMTM4MTk0Cit2IDAuMjI5MTQ1IDIuNTQ0MjUwIDAuMTM4MTk0Cit2IDAuMjIzNDA4IDIuNTU3ODQwIDAuMTM4MTk0Cit2IDAuMjI5MTQ1IDIuNTcxNDMwIDAuMTM4MTk0Cit2IDAuMjQyNzM2IDIuNTc3MTY3IDAuMTM4MTk0Cit2IDAuMjU2MzI2IDIuNTcxNDMwIDAuMTM4MTk0Cit2IDAuMjYyMDYzIDIuNTU3ODQwIDAuMTM4MTk0Cit2IDAuMjU2MzI2IDIuNTQ0MjUwIDAuMTM4MTk0Cit2IDAuMzI5NTg4IDIuNTc3MTY3IDAuMTM4MTk0Cit2IDAuMzQzMTc5IDIuNTcxNDMwIDAuMTM4MTk0Cit2IDAuMzQ4OTE2IDIuNTU3ODQwIDAuMTM4MTk0Cit2IDAuMzQzMTc5IDIuNTQ0MjQ5IDAuMTM4MTk0Cit2IDAuMzI5NTg4IDIuNTM4NTEzIDAuMTM4MTk0Cit2IDAuMzE1OTk4IDIuNTQ0MjQ5IDAuMTM4MTk0Cit2IDAuMzEwMjYxIDIuNTU3ODQwIDAuMTM4MTk0Cit2IDAuMzE1OTk4IDIuNTcxNDMwIDAuMTM4MTk0Cit2IDAuMjQyODY1IDIuNTM3Mzg5IDAuMTQxMTk0Cit2IDAuMjQyODY1IDIuNTQxOTg4IDAuMTQ0MTQ2Cit2IDAuMjMxNzIwIDIuNTQ2NjkzIDAuMTQ0MTQ2Cit2IDAuMjI4NDg2IDIuNTQzNDU5IDAuMTQxMTk0Cit2IDAuMjI3MDE2IDIuNTU3ODM3IDAuMTQ0MTQ2Cit2IDAuMjIyNDE2IDIuNTU3ODM3IDAuMTQxMTk0Cit2IDAuMjMxNzIwIDIuNTY4OTgyIDAuMTQ0MTQ2Cit2IDAuMjI4NDg2IDIuNTcyMjE3IDAuMTQxMTk0Cit2IDAuMjQyODY1IDIuNTczNjg3IDAuMTQ0MTQ2Cit2IDAuMjQyODY1IDIuNTc4Mjg3IDAuMTQxMTk0Cit2IDAuMjU0MDEwIDIuNTY4OTgyIDAuMTQ0MTQ2Cit2IDAuMjU3MjQ0IDIuNTcyMjE3IDAuMTQxMTk0Cit2IDAuMjU4NzE0IDIuNTU3ODM4IDAuMTQ0MTQ2Cit2IDAuMjYzMzE0IDIuNTU3ODM4IDAuMTQxMTk0Cit2IDAuMjU0MDEwIDIuNTQ2NjkzIDAuMTQ0MTQ2Cit2IDAuMjU3MjQ0IDIuNTQzNDU5IDAuMTQxMTk0Cit2IDAuMzI5NTg1IDIuNTc4Mjg3IDAuMTQxMTk0Cit2IDAuMzI5NTg1IDIuNTczNjg3IDAuMTQ0MTQ2Cit2IDAuMzQwNzMwIDIuNTY4OTgyIDAuMTQ0MTQ2Cit2IDAuMzQzOTY0IDIuNTcyMjE3IDAuMTQxMTk0Cit2IDAuMzQ1NDM0IDIuNTU3ODM4IDAuMTQ0MTQ2Cit2IDAuMzUwMDM0IDIuNTU3ODM4IDAuMTQxMTk0Cit2IDAuMzQwNzMwIDIuNTQ2NjkzIDAuMTQ0MTQ3Cit2IDAuMzQzOTY0IDIuNTQzNDU4IDAuMTQxMTk0Cit2IDAuMzI5NTg1IDIuNTQxOTg5IDAuMTQ0MTQ2Cit2IDAuMzI5NTg1IDIuNTM3Mzg5IDAuMTQxMTk0Cit2IDAuMzE4NDQwIDIuNTQ2NjkzIDAuMTQ0MTQ2Cit2IDAuMzE1MjA2IDIuNTQzNDU4IDAuMTQxMTk0Cit2IDAuMzEzNzM2IDIuNTU3ODM4IDAuMTQ0MTQ2Cit2IDAuMzA5MTM2IDIuNTU3ODM4IDAuMTQxMTk0Cit2IDAuMzE4NDQwIDIuNTY4OTgyIDAuMTQ0MTQ2Cit2IDAuMzE1MjA2IDIuNTcyMjE3IDAuMTQxMTk0Cit2IDAuMjQyODY1IDIuNTQ3MzkwIDAuMTQ1MzgwCit2IDAuMjM1NTE4IDIuNTUwNDkwIDAuMTQ1MzgwCit2IDAuMjMyNDE2IDIuNTU3ODM3IDAuMTQ1MzgwCit2IDAuMjM1NTE4IDIuNTY1MTg1IDAuMTQ1MzgwCit2IDAuMjQyODY1IDIuNTY4Mjg3IDAuMTQ1MzgwCit2IDAuMjUwMjEyIDIuNTY1MTg1IDAuMTQ1MzgwCit2IDAuMjUzMzE0IDIuNTU3ODM4IDAuMTQ1MzgwCit2IDAuMjUwMjEyIDIuNTUwNDkwIDAuMTQ1MzgwCit2IDAuMzI5NTg1IDIuNTY4Mjg2IDAuMTQ1MzgwCit2IDAuMzM2OTMyIDIuNTY1MTg0IDAuMTQ1MzgwCit2IDAuMzQwMDM0IDIuNTU3ODM3IDAuMTQ1MzgwCit2IDAuMzM2OTMyIDIuNTUwNDg5IDAuMTQ1MzgwCit2IDAuMzI5NTg1IDIuNTQ3Mzg4IDAuMTQ1MzgwCit2IDAuMzIyMjM4IDIuNTUwNDg5IDAuMTQ1MzgwCit2IDAuMzE5MTM2IDIuNTU3ODM3IDAuMTQ1MzgwCit2IDAuMzIyMjM4IDIuNTY1MTg0IDAuMTQ1MzgwCit2IDAuMjQyODY1IDIuNTU3ODM3IDAuMTQ1MzgwCit2IDAuMzI5NTg1IDIuNTU3ODM3IDAuMTQ1MzgwCit2IC0wLjk5ODI5OCAyLjc3MTAwMCAwLjE2MDM5MwordiAtMS4wNDI2NzUgMi43ODkzOTggMC4xNjAzOTMKK3YgLTEuMDg3MDUxIDIuNzcxMDAwIDAuMTYwMzkzCit2IC0xLjEwNTQ0OSAyLjcyNjYyNCAwLjE2MDM5MwordiAtMS4wODcwNTEgMi42ODIyNDggMC4xNjAzOTMKK3YgLTEuMDQyNjc1IDIuNjYzODUwIDAuMTYwMzkzCit2IC0wLjk5ODI5OCAyLjY4MjI0OCAwLjE2MDM5MwordiAtMC45Nzk4OTUgMi43MjY2MTEgMC4xNjAzOTMKK3YgLTAuMjY3MTA0IDIuMTU2MDY4IC0wLjE0OTkyMAordiAtMC4yNTc2OTcgMi4yMDI1OTQgLTAuMTQ5OTIwCit2IC0wLjIzMjA5NCAyLjI0MDU1MSAtMC4xNDk5MjAKK3YgLTAuMTk0MTM2IDIuMjY2MTU1IC0wLjE0OTkyMAordiAtMC4xNDc2MTYgMi4yNzU1NjAgLTAuMTQ5OTIwCit2IC0wLjEwMTA5NSAyLjI2NjE1NSAtMC4xNDk5MjAKK3YgLTAuMDYzMTM4IDIuMjQwNTUxIC0wLjE0OTkyMAordiAtMC4wMzc1MzQgMi4yMDI1OTQgLTAuMTQ5OTIwCit2IC0wLjAyODEyOSAyLjE1NjA2OCAtMC4xNDk5MjAKK3YgLTAuMDM3NTM0IDIuMTA5NTUyIC0wLjE0OTkyMQordiAtMC4wNjMxMzggMi4wNzE1OTUgLTAuMTQ5OTIxCit2IC0wLjEwMTA5NSAyLjA0NTk5MSAtMC4xNDk5MjEKK3YgLTAuMTQ3NjE2IDIuMDM2NTg2IC0wLjE0OTkyMQordiAtMC4xOTQxMzYgMi4wNDU5OTEgLTAuMTQ5OTIxCit2IC0wLjIzMjA5NCAyLjA3MTU5NSAtMC4xNDk5MjAKK3YgLTAuMjU3Njk4IDIuMTA5NTUzIC0wLjE0OTkyMAordiAtMC4yMTUzNDcgMi4xNTYwNzAgLTAuMTQ5OTIwCit2IC0wLjIxMDAwNCAyLjE4MjQzOSAtMC4xNDk5MjAKK3YgLTAuMTk1NDg1IDIuMjAzOTQyIC0wLjE0OTkyMAordiAtMC4xNzM5ODEgMi4yMTg0NjEgLTAuMTQ5OTIwCit2IC0wLjE0NzYxNiAyLjIyMzgwNCAtMC4xNDk5MjAKK3YgLTAuMTIxMjUxIDIuMjE4NDYxIC0wLjE0OTkyMAordiAtMC4wOTk3NDcgMi4yMDM5NDIgLTAuMTQ5OTIwCit2IC0wLjA4NTIyOCAyLjE4MjQzOSAtMC4xNDk5MjAKK3YgLTAuMDc5ODg1IDIuMTU2MDcwIC0wLjE0OTkyMAordiAtMC4wODUyMjggMi4xMjk3MDggLTAuMTQ5OTIwCit2IC0wLjA5OTc0NyAyLjEwODIwNCAtMC4xNDk5MjAKK3YgLTAuMTIxMjUwIDIuMDkzNjg1IC0wLjE0OTkyMAordiAtMC4xNDc2MTYgMi4wODgzNDIgLTAuMTQ5OTIwCit2IC0wLjE3Mzk4MSAyLjA5MzY4NSAtMC4xNDk5MjAKK3YgLTAuMTk1NDg1IDIuMTA4MjA0IC0wLjE0OTkyMAordiAtMC4yMTAwMDQgMi4xMjk3MDggLTAuMTQ5OTIwCit2IC0wLjIwMTg3NSAyLjE1NjA2NyAtMC4xMjI0NTAKK3YgLTAuMTk2NDI2IDIuMTc2NzAxIC0wLjExODk4NQordiAtMC4xODUwNzMgMi4xOTM1MzEgLTAuMTE4OTg1Cit2IC0wLjE2ODI0MyAyLjIwNDg4MyAtMC4xMTg5ODUKK3YgLTAuMTQ3NjE2IDIuMjA5MDU0IC0wLjExODk4NQordiAtMC4xMjY5ODkgMi4yMDQ4ODMgLTAuMTE4OTg1Cit2IC0wLjExMDE1OCAyLjE5MzUzMSAtMC4xMTg5ODUKK3YgLTAuMDk4ODA2IDIuMTc2NzAxIC0wLjExODk4NQordiAtMC4wOTQ2MzYgMi4xNTYwNzEgLTAuMTE4OTg1Cit2IC0wLjA5ODgwNiAyLjEzNTQ0NiAtMC4xMTg5ODUKK3YgLTAuMTEwMTU4IDIuMTE4NjE2IC0wLjExODk4NQordiAtMC4xMjY5ODkgMi4xMDcyNjMgLTAuMTE4OTg1Cit2IC0wLjE0NzYxNiAyLjEwMzA5MyAtMC4xMTg5ODUKK3YgLTAuMTY4MjQzIDIuMTA3MjYzIC0wLjExODk4NQordiAtMC4xODUwNzMgMi4xMTg2MTYgLTAuMTE4OTg1Cit2IC0wLjE5NzYwMyAyLjEzNDk0MiAtMC4xMjI0NTAKK3YgLTAuMTkzODM5IDIuMTU2MDY4IC0wLjEyOTM5NgordiAtMC4xOTAxOTkgMi4xNzQwNjkgLTAuMTI5Mzk2Cit2IC0wLjE4MDI5MyAyLjE4ODc1NSAtMC4xMjkzOTYKK3YgLTAuMTY1NjA3IDIuMTk4NjYxIC0wLjEyOTM5NgordiAtMC4xNDc2MDggMi4yMDIzMDEgLTAuMTI5Mzk2Cit2IC0wLjEyOTYwOCAyLjE5ODY2MSAtMC4xMjkzOTYKK3YgLTAuMTE0OTIyIDIuMTg4NzU2IC0wLjEyOTM5NgordiAtMC4xMDUwMTYgMi4xNzQwNjkgLTAuMTI5Mzk2Cit2IC0wLjEwMTM3NyAyLjE1NjA2OCAtMC4xMjkzOTYKK3YgLTAuMTA1MDE2IDIuMTM4MDcxIC0wLjEyOTM5NgordiAtMC4xMTQ5MjIgMi4xMjMzODQgLTAuMTI5Mzk2Cit2IC0wLjEyOTYwOCAyLjExMzQ3OCAtMC4xMjkzOTYKK3YgLTAuMTQ3NjA4IDIuMTA5ODM5IC0wLjEyOTM5NgordiAtMC4xNjU2MDcgMi4xMTM0NzggLTAuMTI5Mzk2Cit2IC0wLjE4MDI5MyAyLjEyMzM4NCAtMC4xMjkzOTYKK3YgLTAuMTkwMTk5IDIuMTM4MDcxIC0wLjEyOTM5NgordiAtMC4xODA5NjIgMi4xNTYwNjggLTAuMTM1MTQ3Cit2IC0wLjE3ODMzNiAyLjE2OTA1NiAtMC4xMzUxNDcKK3YgLTAuMTcxMTg5IDIuMTc5NjUxIC0wLjEzNTE0NwordiAtMC4xNjA1OTQgMi4xODY3OTggLTAuMTM1MTQ3Cit2IC0wLjE0NzYwOCAyLjE4OTQyNCAtMC4xMzUxNDYKK3YgLTAuMTM0NjIyIDIuMTg2Nzk4IC0wLjEzNTE0NwordiAtMC4xMjQwMjYgMi4xNzk2NTEgLTAuMTM1MTQ3Cit2IC0wLjExNjg3OSAyLjE2OTA1NiAtMC4xMzUxNDcKK3YgLTAuMTE0MjU0IDIuMTU2MDY4IC0wLjEzNTE0NwordiAtMC4xMTY4NzkgMi4xNDMwODQgLTAuMTM1MTQ3Cit2IC0wLjEyNDAyNiAyLjEzMjQ4OCAtMC4xMzUxNDcKK3YgLTAuMTM0NjIyIDIuMTI1MzQxIC0wLjEzNTE0NwordiAtMC4xNDc2MDggMi4xMjI3MTUgLTAuMTM1MTQ3Cit2IC0wLjE2MDU5NCAyLjEyNTM0MSAtMC4xMzUxNDcKK3YgLTAuMTcxMTg5IDIuMTMyNDg4IC0wLjEzNTE0NwordiAtMC4xNzgzMzYgMi4xNDMwODQgLTAuMTM1MTQ3Cit2IC0wLjE2OTg3NCAyLjE1NjA2OCAtMC4xMzc0MDAKK3YgLTAuMTY4MTIxIDIuMTY0NzM5IC0wLjEzNzQwMAordiAtMC4xNjMzNTAgMi4xNzE4MTIgLTAuMTM3NDAwCit2IC0wLjE1NjI3NyAyLjE3NjU4MyAtMC4xMzc0MDAKK3YgLTAuMTQ3NjA4IDIuMTc4MzM2IC0wLjEzNzM5OQordiAtMC4xMzg5MzkgMi4xNzY1ODMgLTAuMTM3Mzk5Cit2IC0wLjEzMTg2NSAyLjE3MTgxMiAtMC4xMzc0MDAKK3YgLTAuMTI3MDk0IDIuMTY0NzM5IC0wLjEzNzQwMAordiAtMC4xMjUzNDIgMi4xNTYwNjggLTAuMTM3NDAwCit2IC0wLjEyNzA5NCAyLjE0NzQwMCAtMC4xMzc0MDAKK3YgLTAuMTMxODY1IDIuMTQwMzI3IC0wLjEzNzQwMAordiAtMC4xMzg5MzkgMi4xMzU1NTYgLTAuMTM3NDAwCit2IC0wLjE0NzYwOCAyLjEzMzgwMyAtMC4xMzc0MDAKK3YgLTAuMTU2Mjc3IDIuMTM1NTU2IC0wLjEzNzQwMAordiAtMC4xNjMzNTAgMi4xNDAzMjcgLTAuMTM3NDAwCit2IC0wLjE2ODEyMSAyLjE0NzQwMCAtMC4xMzc0MDAKK3YgLTAuMTM4OTM5IDIuMTY0NzM5IC0wLjEzNzQwMAordiAtMC4xNDc2MDggMi4xNjQ3MzkgLTAuMTM3NDAwCit2IC0wLjE1NjI3NyAyLjE2NDczOSAtMC4xMzc0MDAKK3YgLTAuMTU2Mjc3IDIuMTU2MDY4IC0wLjEzNzQwMAordiAtMC4xNDc2MDggMi4xNTYwNjggLTAuMTM3NDAwCit2IC0wLjEzODkzOSAyLjE1NjA2OCAtMC4xMzc0MDAKK3YgLTAuMTU2Mjc3IDIuMTQ3NDAwIC0wLjEzNzQwMAordiAtMC4xNDc2MDggMi4xNDc0MDAgLTAuMTM3NDAwCit2IC0wLjEzODkzOSAyLjE0NzQwMCAtMC4xMzc0MDAKK3YgLTAuMjAwNTk3IDIuMTU2MDcxIC0wLjEzMzIzNQordiAtMC4xOTY0MjYgMi4xNzY3MDEgLTAuMTMzMjM1Cit2IC0wLjE4NTA3MyAyLjE5MzUzMSAtMC4xMzMyMzUKK3YgLTAuMTY4MjQzIDIuMjA0ODgzIC0wLjEzMzIzNQordiAtMC4xNDc2MTYgMi4yMDkwNTQgLTAuMTMzMjM1Cit2IC0wLjEyNjk4OSAyLjIwNDg4MyAtMC4xMzMyMzUKK3YgLTAuMTEwMTU4IDIuMTkzNTMxIC0wLjEzMzIzNQordiAtMC4wOTg4MDYgMi4xNzY3MDEgLTAuMTMzMjM1Cit2IC0wLjA5NDYzNiAyLjE1NjA3MSAtMC4xMzMyMzUKK3YgLTAuMDk4ODA2IDIuMTM1NDQ2IC0wLjEzMzIzNQordiAtMC4xMTAxNTggMi4xMTg2MTYgLTAuMTMzMjM1Cit2IC0wLjEyNjk4OSAyLjEwNzI2MyAtMC4xMzMyMzUKK3YgLTAuMTQ3NjE2IDIuMTAzMDkzIC0wLjEzMzIzNQordiAtMC4xNjgyNDMgMi4xMDcyNjMgLTAuMTMzMjM1Cit2IC0wLjE4NTA3MyAyLjExODYxNiAtMC4xMzMyMzUKK3YgLTAuMTk2NDI2IDIuMTM1NDQ2IC0wLjEzMzIzNQordiAtMC4yMDIxMTUgMi4xNTYwNzEgLTAuMTM1MDY2Cit2IC0wLjIxMzkxOSAyLjE1NjA3MCAtMC4xNDgwODkKK3YgLTAuMTk3ODI0IDIuMTc3MjkxIC0wLjEzNTA2NgordiAtMC4yMDg2ODkgMi4xODE4ODMgLTAuMTQ4MDg5Cit2IC0wLjE4NjE0NSAyLjE5NDYwMiAtMC4xMzUwNjYKK3YgLTAuMTk0NDc2IDIuMjAyOTMzIC0wLjE0ODA4OQordiAtMC4xNjg4MzQgMi4yMDYyODEgLTAuMTM1MDY2Cit2IC0wLjE3MzQyNSAyLjIxNzE0NiAtMC4xNDgwODkKK3YgLTAuMTQ3NjE2IDIuMjEwNTcyIC0wLjEzNTA2NQordiAtMC4xNDc2MTYgMi4yMjIzNzUgLTAuMTQ4MDg5Cit2IC0wLjEyNjM5OCAyLjIwNjI4MSAtMC4xMzUwNjUKK3YgLTAuMTIxODA2IDIuMjE3MTQ2IC0wLjE0ODA4OQordiAtMC4xMDkwODcgMi4xOTQ2MDIgLTAuMTM1MDY1Cit2IC0wLjEwMDc1NiAyLjIwMjkzMyAtMC4xNDgwODkKK3YgLTAuMDk3NDA4IDIuMTc3MjkxIC0wLjEzNTA2NgordiAtMC4wODY1NDMgMi4xODE4ODMgLTAuMTQ4MDg5Cit2IC0wLjA5MzExOCAyLjE1NjA3MSAtMC4xMzUwNjYKK3YgLTAuMDgxMzE0IDIuMTU2MDcwIC0wLjE0ODA4OQordiAtMC4wOTc0MDggMi4xMzQ4NTUgLTAuMTM1MDY2Cit2IC0wLjA4NjU0MyAyLjEzMDI2NCAtMC4xNDgwOTAKK3YgLTAuMTA5MDg3IDIuMTE3NTQ0IC0wLjEzNTA2NgordiAtMC4xMDA3NTYgMi4xMDkyMTMgLTAuMTQ4MDkwCit2IC0wLjEyNjM5OCAyLjEwNTg2NSAtMC4xMzUwNjYKK3YgLTAuMTIxODA2IDIuMDk1MDAwIC0wLjE0ODA5MAordiAtMC4xNDc2MTYgMi4xMDE1NzUgLTAuMTM1MDY2Cit2IC0wLjE0NzYxNiAyLjA4OTc3MSAtMC4xNDgwOTAKK3YgLTAuMTY4ODM0IDIuMTA1ODY1IC0wLjEzNTA2NgordiAtMC4xNzM0MjUgMi4wOTUwMDAgLTAuMTQ4MDkwCit2IC0wLjE4NjE0NSAyLjExNzU0NCAtMC4xMzUwNjYKK3YgLTAuMTk0NDc2IDIuMTA5MjEzIC0wLjE0ODA5MAordiAtMC4xOTc4MjQgMi4xMzQ4NTUgLTAuMTM1MDY2Cit2IC0wLjIwODY4OSAyLjEzMDI2NCAtMC4xNDgwOTAKK3YgLTAuMjAwNTk3IDIuMTU2MDcxIC0wLjExODk4NQordiAtMC4xOTc2MDMgMi4xNzcxOTggLTAuMTIyNDUwCit2IC0wLjE4NTk3NSAyLjE5NDQzNyAtMC4xMjI0NTAKK3YgLTAuMTY4NzM2IDIuMjA2MDY1IC0wLjEyMjQ1MAordiAtMC4xNDc2MDggMi4yMTAzMzcgLTAuMTIyNDUwCit2IC0wLjEyNjQ3OSAyLjIwNjA2NSAtMC4xMjI0NTAKK3YgLTAuMTA5MjQwIDIuMTk0NDM3IC0wLjEyMjQ1MAordiAtMC4wOTc2MTIgMi4xNzcxOTggLTAuMTIyNDUwCit2IC0wLjA5MzM0MSAyLjE1NjA2NyAtMC4xMjI0NTAKK3YgLTAuMDk3NjEyIDIuMTM0OTQyIC0wLjEyMjQ1MAordiAtMC4xMDkyNDAgMi4xMTc3MDIgLTAuMTIyNDUwCit2IC0wLjEyNjQ3OSAyLjEwNjA3NCAtMC4xMjI0NTAKK3YgLTAuMTQ3NjA4IDIuMTAxODAyIC0wLjEyMjQ1MAordiAtMC4xNjg3MzYgMi4xMDYwNzQgLTAuMTIyNDUwCit2IC0wLjE4NTk3NSAyLjExNzcwMiAtMC4xMjI0NTAKK3YgLTAuMTk2NDI2IDIuMTM1NDQ2IC0wLjExODk4NQordiAtMC40MzkyNjUgMi4xNTYwNjIgLTAuMTcyMzYzCit2IC0wLjQxNjMwNSAyLjI2OTYyMyAtMC4xNzIzNjMKK3YgLTAuMzUzODExIDIuMzYyMjY4IC0wLjE3MjM2MgordiAtMC4yNjExNjQgMi40MjQ3NjMgLTAuMTcyMzYxCit2IC0wLjE0NzYxNiAyLjQ0NzcyMCAtMC4xNzIzNjEKK3YgLTAuMDM0MDY4IDIuNDI0NzYzIC0wLjE3MjM2MgordiAwLjA1ODU3OSAyLjM2MjI2OSAtMC4xNzIzNjIKK3YgMC4xMjEwNzIgMi4yNjk2MjMgLTAuMTcyMzYyCit2IDAuMTQ0MDI3IDIuMTU2MDYyIC0wLjE3MjM2MwordiAwLjEyMTA3MyAyLjA0MjUyNyAtMC4xNzIzNjMKK3YgMC4wNTg1NzkgMS45NDk4NzkgLTAuMTcyMzYzCit2IC0wLjAzNDA2NyAxLjg4NzM4NSAtMC4xNzIzNjQKK3YgLTAuMTQ3NjE2IDEuODY0NDI4IC0wLjE3MjM2MwordiAtMC4yNjExNjQgMS44ODczODUgLTAuMTcyMzYzCit2IC0wLjM1MzgxMSAxLjk0OTg3OSAtMC4xNzIzNjMKK3YgLTAuNDE2MzA1IDIuMDQyNTI3IC0wLjE3MjM2MwordiAtMC4yNjM2MjIgMi4xNTYwNjggLTAuMTcyMzYyCit2IC0wLjI1NDQ4NyAyLjIwMTIzOCAtMC4xNzIzNjIKK3YgLTAuMjI5NjI5IDIuMjM4MDg2IC0wLjE3MjM2MgordiAtMC4xOTI3ODAgMi4yNjI5NDUgLTAuMTcyMzYyCit2IC0wLjE0NzYxNiAyLjI3MjA3OSAtMC4xNzIzNjIKK3YgLTAuMTAyNDUyIDIuMjYyOTQ1IC0wLjE3MjM2MgordiAtMC4wNjU2MDMgMi4yMzgwODYgLTAuMTcyMzYyCit2IC0wLjA0MDc0NSAyLjIwMTIzOCAtMC4xNzIzNjMKK3YgLTAuMDMxNjEyIDIuMTU2MDY4IC0wLjE3MjM2MwordiAtMC4wNDA3NDUgMi4xMTA5MTAgLTAuMTcyMzYzCit2IC0wLjA2NTYwMyAyLjA3NDA2MSAtMC4xNzIzNjMKK3YgLTAuMTAyNDUyIDIuMDQ5MjAyIC0wLjE3MjM2MwordiAtMC4xNDc2MTYgMi4wNDAwNjkgLTAuMTcyMzYzCit2IC0wLjE5Mjc4MCAyLjA0OTIwMiAtMC4xNzIzNjMKK3YgLTAuMjI5NjI5IDIuMDc0MDYxIC0wLjE3MjM2MwordiAtMC4yNTQ0ODcgMi4xMTA5MTAgLTAuMTcyMzYzCit2IC0wLjI1OTkzMSAyLjE1NjA2OCAtMC4xNTQ0MTUKK3YgLTAuMjUxMDg5IDIuMTk5ODAyIC0wLjE1NDQxNQordiAtMC4yMjcwMjMgMi4yMzU0ODAgLTAuMTU0NDE1Cit2IC0wLjE5MTM0NCAyLjI1OTU0NyAtMC4xNTQ0MTUKK3YgLTAuMTQ3NjE2IDIuMjY4Mzg4IC0wLjE1NDQxNQordiAtMC4xMDM4ODggMi4yNTk1NDcgLTAuMTU0NDE1Cit2IC0wLjA2ODIwOSAyLjIzNTQ4MCAtMC4xNTQ0MTUKK3YgLTAuMDQ0MTQzIDIuMTk5ODAyIC0wLjE1NDQxNQordiAtMC4wMzUzMDMgMi4xNTYwNjkgLTAuMTU0NDE1Cit2IC0wLjA0NDE0MyAyLjExMjM0NiAtMC4xNTQ0MTUKK3YgLTAuMDY4MjA5IDIuMDc2NjY3IC0wLjE1NDQxNgordiAtMC4xMDM4ODggMi4wNTI2MDAgLTAuMTU0NDE2Cit2IC0wLjE0NzYxNiAyLjA0Mzc1OSAtMC4xNTQ0MTUKK3YgLTAuMTkxMzQ0IDIuMDUyNjAwIC0wLjE1NDQxNQordiAtMC4yMjcwMjMgMi4wNzY2NjcgLTAuMTU0NDE1Cit2IC0wLjI1MTA5MCAyLjExMjM0NiAtMC4xNTQ0MTUKK3YgLTAuMjYwMDQ0IDIuMTU2MDY5IC0wLjE2ODMyNgordiAtMC4yNTExOTMgMi4xOTk4NDUgLTAuMTY4MzI2Cit2IC0wLjIyNzEwMiAyLjIzNTU1OSAtMC4xNjgzMjYKK3YgLTAuMTkxMzg4IDIuMjU5NjUxIC0wLjE2ODMyNgordiAtMC4xNDc2MTYgMi4yNjg1MDAgLTAuMTY4MzI2Cit2IC0wLjEwMzg0NCAyLjI1OTY1MSAtMC4xNjgzMjYKK3YgLTAuMDY4MTMwIDIuMjM1NTU5IC0wLjE2ODMyNgordiAtMC4wNDQwMzkgMi4xOTk4NDYgLTAuMTY4MzI3Cit2IC0wLjAzNTE5MCAyLjE1NjA2OSAtMC4xNjgzMjcKK3YgLTAuMDQ0MDM5IDIuMTEyMzAyIC0wLjE2ODMyNwordiAtMC4wNjgxMzAgMi4wNzY1ODcgLTAuMTY4MzI3Cit2IC0wLjEwMzg0NCAyLjA1MjQ5NiAtMC4xNjgzMjcKK3YgLTAuMTQ3NjE2IDIuMDQzNjQ3IC0wLjE2ODMyNwordiAtMC4xOTEzODggMi4wNTI0OTYgLTAuMTY4MzI3Cit2IC0wLjIyNzEwMiAyLjA3NjU4NyAtMC4xNjgzMjcKK3YgLTAuMjUxMTkzIDIuMTEyMzAyIC0wLjE2ODMyNwordiAtMC4wMjM1NzkgMi40NDk4MjggLTAuMTk0ODcxCit2IC0wLjE0NzYxNiAyLjQ3NDkwNSAtMC4xOTQ4NzAKK3YgLTAuMjcxNjUyIDIuNDQ5ODI4IC0wLjE5NDg3MAordiAtMC4zNzMwMDQgMi4zODE0NjIgLTAuMTk0ODcxCit2IC0wLjQ0MTM2OSAyLjI4MDExMSAtMC4xOTQ4NzEKK3YgLTAuNDY2NDQ5IDIuMTU2MDYxIC0wLjE5NDg3MgordiAtMC40NDEzNjkgMi4wMzIwMzggLTAuMTk0ODcyCit2IC0wLjM3MzAwNCAxLjkzMDY4NiAtMC4xOTQ4NzIKK3YgLTAuMjcxNjUyIDEuODYyMzIwIC0wLjE5NDg3MgordiAtMC4xNDc2MTUgMS44MzcyNDMgLTAuMTk0ODcyCit2IC0wLjAyMzU3OSAxLjg2MjMyMCAtMC4xOTQ4NzIKK3YgMC4wNzc3NzMgMS45MzA2ODYgLTAuMTk0ODcyCit2IDAuMTQ2MTM4IDIuMDMyMDM5IC0wLjE5NDg3MgordiAwLjE3MTIxMyAyLjE1NjA2MSAtMC4xOTQ4NzEKK3YgMC4xNDYxMzggMi4yODAxMTAgLTAuMTk0ODcxCit2IDAuMDc3NzcyIDIuMzgxNDYyIC0wLjE5NDg3MAordiAtMC40MzU4NzggMi4xNTYwNjIgLTAuMTk2OTQ0Cit2IC0wLjQxMzE4NSAyLjI2ODMwNCAtMC4xOTY5NDQKK3YgLTAuMzUxNDE3IDIuMzU5ODc1IC0wLjE5Njk0NAordiAtMC4yNTk4NDUgMi40MjE2NDMgLTAuMTk2OTQzCit2IC0wLjE0NzYxNiAyLjQ0NDMzMyAtMC4xOTY5NDQKK3YgLTAuMDM1Mzg2IDIuNDIxNjQzIC0wLjE5Njk0NAordiAwLjA1NjE4NSAyLjM1OTg3NSAtMC4xOTY5NDMKK3YgMC4xMTc5NTMgMi4yNjgzMDQgLTAuMTk2OTQ0Cit2IDAuMTQwNjQxIDIuMTU2MDYyIC0wLjE5Njk0NAordiAwLjExNzk1MyAyLjA0Mzg0NSAtMC4xOTY5NDUKK3YgMC4wNTYxODUgMS45NTIyNzQgLTAuMTk2OTQ1Cit2IC0wLjAzNTM4NiAxLjg5MDUwNSAtMC4xOTY5NDUKK3YgLTAuMTQ3NjE1IDEuODY3ODE1IC0wLjE5Njk0NQordiAtMC4yNTk4NDUgMS44OTA1MDUgLTAuMTk2OTQ1Cit2IC0wLjM1MTQxNiAxLjk1MjI3MyAtMC4xOTY5NDUKK3YgLTAuNDEzMTg1IDIuMDQzODQ1IC0wLjE5Njk0NQordiAtMC40NjQ4NTUgMi4xNTYwNjEgLTAuMjAwMjEwCit2IC0wLjQ0MDU4NyAyLjE1NjA2MiAtMC4yMDAyMDkKK3YgLTAuNDM5ODk3IDIuMjc5NTA1IC0wLjIwMDIwOQordiAtMC40MTc1MjcgMi4yNzAxMjIgLTAuMjAwMjA5Cit2IC0wLjM3MTg4MCAyLjM4MDMzOSAtMC4yMDAyMDkKK3YgLTAuMzU0NzQyIDIuMzYzMjAwIC0wLjIwMDIwOQordiAtMC4yNzEwNDYgMi40NDgzNTUgLTAuMjAwMjA4Cit2IC0wLjI2MTY2MyAyLjQyNTk4NCAtMC4yMDAyMDgKK3YgLTAuMTQ3NjE2IDIuNDczMzEwIC0wLjIwMDIwOAordiAtMC4xNDc2MTYgMi40NDkwNDIgLTAuMjAwMjA5Cit2IC0wLjAyNDE4NSAyLjQ0ODM1NSAtMC4yMDAyMDkKK3YgLTAuMDMzNTY4IDIuNDI1OTg1IC0wLjIwMDIwOQordiAwLjA3NjY0OSAyLjM4MDMzOSAtMC4yMDAyMDgKK3YgMC4wNTk1MTAgMi4zNjMyMDAgLTAuMjAwMjA4Cit2IDAuMTQ0NjY2IDIuMjc5NTA1IC0wLjIwMDIwOQordiAwLjEyMjI5NSAyLjI3MDEyMiAtMC4yMDAyMDkKK3YgMC4xNjk2MTggMi4xNTYwNjIgLTAuMjAwMjA5Cit2IDAuMTQ1MzUxIDIuMTU2MDYyIC0wLjIwMDIwOQordiAwLjE0NDY2NiAyLjAzMjY0NCAtMC4yMDAyMTAKK3YgMC4xMjIyOTUgMi4wNDIwMjcgLTAuMjAwMjEwCit2IDAuMDc2NjQ5IDEuOTMxODEwIC0wLjIwMDIxMAordiAwLjA1OTUxMCAxLjk0ODk0OSAtMC4yMDAyMTAKK3YgLTAuMDI0MTg1IDEuODYzNzkzIC0wLjIwMDIxMAordiAtMC4wMzM1NjggMS44ODYxNjMgLTAuMjAwMjEwCit2IC0wLjE0NzYxNSAxLjgzODgzOCAtMC4yMDAyMTAKK3YgLTAuMTQ3NjE1IDEuODYzMTA1IC0wLjIwMDIxMAordiAtMC4yNzEwNDYgMS44NjM3OTMgLTAuMjAwMjEwCit2IC0wLjI2MTY2MyAxLjg4NjE2MyAtMC4yMDAyMTAKK3YgLTAuMzcxODgwIDEuOTMxODA5IC0wLjIwMDIxMAordiAtMC4zNTQ3NDIgMS45NDg5NDggLTAuMjAwMjEwCit2IC0wLjQzOTg5NyAyLjAzMjY0NCAtMC4yMDAyMTAKK3YgLTAuNDE3NTI3IDIuMDQyMDI3IC0wLjIwMDIxMAordiAtMC40MzU4NzggMi4xNTYwNjIgLTAuMTg0MTY4Cit2IC0wLjQxMzE4NSAyLjI2ODMwNCAtMC4xODQxNjgKK3YgLTAuMzUxNDE3IDIuMzU5ODc0IC0wLjE4NDE2NwordiAtMC4yNTk4NDUgMi40MjE2NDIgLTAuMTg0MTY3Cit2IC0wLjE0NzYxNiAyLjQ0NDMzMyAtMC4xODQxNjcKK3YgLTAuMDM1Mzg2IDIuNDIxNjQyIC0wLjE4NDE2NwordiAwLjA1NjE4NSAyLjM1OTg3NCAtMC4xODQxNjcKK3YgMC4xMTc5NTMgMi4yNjgzMDQgLTAuMTg0MTY4Cit2IDAuMTQwNjQxIDIuMTU2MDYyIC0wLjE4NDE2OAordiAwLjExNzk1MyAyLjA0Mzg0NSAtMC4xODQxNjgKK3YgMC4wNTYxODUgMS45NTIyNzMgLTAuMTg0MTY4Cit2IC0wLjAzNTM4NiAxLjg5MDUwNSAtMC4xODQxNjkKK3YgLTAuMTQ3NjE1IDEuODY3ODE1IC0wLjE4NDE2OAordiAtMC4yNTk4NDUgMS44OTA1MDUgLTAuMTg0MTY4Cit2IC0wLjM1MTQxNyAxLjk1MjI3MyAtMC4xODQxNjkKK3YgLTAuNDEzMTg1IDIuMDQzODQ1IC0wLjE4NDE2OAordiAtMC40NjIwMTQgMi4xNTYwNjEgLTAuMjAwMjA5Cit2IC0wLjQ0MjQ1MiAyLjE1NjA2MiAtMC4yMDAyMDkKK3YgLTAuNDM3Mjc4IDIuMjc4NDA1IC0wLjIwMDIwOQordiAtMC40MTkyNDUgMi4yNzA4NDIgLTAuMjAwMjA5Cit2IC0wLjM2OTg3NCAyLjM3ODMzMiAtMC4yMDAyMDkKK3YgLTAuMzU2MDU4IDIuMzY0NTE2IC0wLjIwMDIwOQordiAtMC4yNjk5NDcgMi40NDU3MzcgLTAuMjAwMjA4Cit2IC0wLjI2MjM4MyAyLjQyNzcwMyAtMC4yMDAyMDgKK3YgLTAuMTQ3NjE2IDIuNDcwNDY5IC0wLjIwMDIwOAordiAtMC4xNDc2MTYgMi40NTA5MDcgLTAuMjAwMjA5Cit2IC0wLjAyNTI4NCAyLjQ0NTczNyAtMC4yMDAyMDkKK3YgLTAuMDMyODQ5IDIuNDI3NzAzIC0wLjIwMDIwOQordiAwLjA3NDY0MyAyLjM3ODMzMiAtMC4yMDAyMDgKK3YgMC4wNjA4MjYgMi4zNjQ1MTYgLTAuMjAwMjA4Cit2IDAuMTQyMDQ3IDIuMjc4NDA1IC0wLjIwMDIwOQordiAwLjEyNDAxMyAyLjI3MDg0MSAtMC4yMDAyMDkKK3YgMC4xNjY3NzcgMi4xNTYwNjIgLTAuMjAwMjA5Cit2IDAuMTQ3MjE1IDIuMTU2MDYyIC0wLjIwMDIwOQordiAwLjE0MjA0NyAyLjAzMzc0MyAtMC4yMDAyMTAKK3YgMC4xMjQwMTQgMi4wNDEzMDggLTAuMjAwMjEwCit2IDAuMDc0NjQzIDEuOTMzODE2IC0wLjIwMDIxMAordiAwLjA2MDgyNyAxLjk0NzYzMiAtMC4yMDAyMTAKK3YgLTAuMDI1Mjg0IDEuODY2NDEyIC0wLjIwMDIxMAordiAtMC4wMzI4NDggMS44ODQ0NDUgLTAuMjAwMjEwCit2IC0wLjE0NzYxNSAxLjg0MTY3OSAtMC4yMDAyMTAKK3YgLTAuMTQ3NjE1IDEuODYxMjQxIC0wLjIwMDIxMAordiAtMC4yNjk5NDcgMS44NjY0MTIgLTAuMjAwMjEwCit2IC0wLjI2MjM4MiAxLjg4NDQ0NCAtMC4yMDAyMTAKK3YgLTAuMzY5ODc0IDEuOTMzODE2IC0wLjIwMDIxMAordiAtMC4zNTYwNTggMS45NDc2MzIgLTAuMjAwMjEwCit2IC0wLjQzNzI3OCAyLjAzMzc0MyAtMC4yMDAyMTAKK3YgLTAuNDE5MjQ2IDIuMDQxMzA4IC0wLjIwMDIxMAordiAtMC40MTM2NzYgMi4yNjg1MTIgLTAuMTk0OTU5Cit2IC0wLjQzNjQxMSAyLjE1NjA2MiAtMC4xOTQ5NTkKK3YgLTAuNDEzNjc2IDIuMDQzNjM4IC0wLjE5NDk2MAordiAtMC4zNTE3OTQgMS45NTE4OTcgLTAuMTk0OTYwCit2IC0wLjI2MDA1MyAxLjg5MDAxNCAtMC4xOTQ5NjAKK3YgLTAuMTQ3NjE1IDEuODY3MjgxIC0wLjE5NDk2MAordiAtMC4wMzUxNzggMS44OTAwMTQgLTAuMTk0OTYwCit2IDAuMDU2NTYyIDEuOTUxODk3IC0wLjE5NDk2MAordiAwLjExODQ0NSAyLjA0MzYzOCAtMC4xOTQ5NjAKK3YgMC4xNDExNzUgMi4xNTYwNjIgLTAuMTk0OTU5Cit2IDAuMTE4NDQ0IDIuMjY4NTEyIC0wLjE5NDk1OQordiAwLjA1NjU2MiAyLjM2MDI1MiAtMC4xOTQ5NTgKK3YgLTAuMDM1MTc4IDIuNDIyMTM0IC0wLjE5NDk1OQordiAtMC4xNDc2MTYgMi40NDQ4NjYgLTAuMTk0OTU4Cit2IC0wLjI2MDA1MyAyLjQyMjEzNCAtMC4xOTQ5NTgKK3YgLTAuMzUxNzk0IDIuMzYwMjUyIC0wLjE5NDk1OQordiAtMC4zODU4NjIgMi4xNTYwNjMgLTAuMTk0OTU5Cit2IC0wLjM2NzA3MCAyLjI0OTAwOSAtMC4xOTQ5NTkKK3YgLTAuMzE2MTA2IDIuMzI0NTY0IC0wLjE5NDk1OQordiAtMC4yNDA1NTAgMi4zNzU1MjkgLTAuMTk0OTU4Cit2IC0wLjE0NzYxNiAyLjM5NDMxOSAtMC4xOTQ5NTkKK3YgLTAuMDU0NjgxIDIuMzc1NTI5IC0wLjE5NDk1OQordiAwLjAyMDg3NCAyLjMyNDU2NCAtMC4xOTQ5NTgKK3YgMC4wNzE4MzggMi4yNDkwMTAgLTAuMTk0OTU5Cit2IDAuMDkwNjI2IDIuMTU2MDYzIC0wLjE5NDk1OQordiAwLjA3MTgzOSAyLjA2MzE0MCAtMC4xOTQ5NjAKK3YgMC4wMjA4NzUgMS45ODc1ODUgLTAuMTk0OTU5Cit2IC0wLjA1NDY4MSAxLjkzNjYyMCAtMC4xOTQ5NjAKK3YgLTAuMTQ3NjE1IDEuOTE3ODMwIC0wLjE5NDk2MAordiAtMC4yNDA1NTAgMS45MzY2MjAgLTAuMTk0OTYwCit2IC0wLjMxNjEwNSAxLjk4NzU4NSAtMC4xOTQ5NjAKK3YgLTAuMzY3MDcxIDIuMDYzMTQxIC0wLjE5NDk2MAordiAtMC4yNDA1NTAgMi4xNTYwNjMgLTAuMTk0OTU5Cit2IC0wLjE0NzYxNiAyLjE1NjA2MyAtMC4xOTQ5NTkKK3YgLTAuMDU0NjgxIDIuMTU2MDYzIC0wLjE5NDk1OQordiAtMC4yNDA1NTAgMi4yNDkwMDkgLTAuMTk0OTU5Cit2IC0wLjE0NzYxNiAyLjI0OTAxMCAtMC4xOTQ5NTkKK3YgLTAuMDU0NjgxIDIuMjQ5MDEwIC0wLjE5NDk1OQordiAtMC4yNDA1NTAgMi4wNjMxNDEgLTAuMTk0OTU5Cit2IC0wLjE0NzYxNSAyLjA2MzE0MCAtMC4xOTQ5NTkKK3YgLTAuMDU0NjgxIDIuMDYzMTQwIC0wLjE5NDk2MAordiAtMC4zMDE4NTEgLTIuNjYyNzY0IC0wLjAzNzM2NQordiAtMC4zMzE5MTcgLTIuNjYzMDAyIDAuMDE5ODMwCit2IC0wLjMyMDEyOSAtMi42NjMwMDMgMC4wNTg2MjcKK3YgLTAuMjk1MzE4IC0yLjY2MzAwNiAwLjA3MjI0NwordiAtMC4zMjUwMDAgLTIuNjYzMDAzIC0wLjAxMjI2MwordiAwLjAzNTMwMyAtMi42NjQ2NjAgMC4wMTk4NzgKK3YgLTAuMTQ3NjE5IC0yLjY2MzAwNiAwLjAxOTc0NQordiAtMC4xNDc2MTkgLTIuNjYzMDA3IDAuMDU4NTM3Cit2IDAuMDIzNDczIC0yLjY2NDY2MSAwLjA1ODYyNwordiAtMC4xNDc2MTkgLTIuNjYzMDA3IDAuMDcyMjU3Cit2IC0wLjAwNDY5MSAtMi42NjQ2NjUgMC4wNzIyNDcKK3YgLTAuMTQ3NjE5IC0yLjY2MzAwNiAtMC4wMTIyMTkKK3YgMC4wMjgzNDQgLTIuNjY0NjYxIC0wLjAxMjI2MgordiAtMC4xNDc2MTkgLTIuNjYyNzY1IC0wLjAzNzQ2NQordiAwLjAwNjYxNCAtMi42NjQ0MjMgLTAuMDM3MzI2Cit2IC0wLjAyMjY2NiAtMi43NjQ3MTIgMC4wMTM4MzgKK3YgLTAuMDIyNjczIC0yLjc2NDcyMCAwLjAxMDcwMgordiAtMC4wMjI2MjUgLTIuNzY3MDA0IDAuMDA3NTczCit2IC0wLjAyNDUwOCAtMi43Njg2NDcgMC4wMDc1NzgKK3YgLTAuMDI0NTUwIC0yLjc2NzA0MCAwLjAwNTgzMgordiAtMC4wMjQ1MjQgLTIuNzY3MDA3IDAuMDE4NzI0Cit2IC0wLjAyNDQ4OSAtMi43Njg2MjMgMC4wMTY5ODcKK3YgLTAuMDIyNjA2IC0yLjc2Njk4MCAwLjAxNjk4MQordiAtMC4wMjI2MTkgLTIuNzY2OTk2IDAuMDEwNzA5Cit2IC0wLjAyMjYxMyAtMi43NjY5ODggMC4wMTM4NDUKK3YgLTAuMDI0NDk2IC0yLjc2ODYzMSAwLjAxMzg1MAordiAtMC4wMjQ1MDIgLTIuNzY4NjM5IDAuMDEwNzE0Cit2IC0wLjAyNzkwNyAtMi43NjcwNjIgMC4wMTg3MjUKK3YgLTAuMDI3ODcyIC0yLjc2ODY3OCAwLjAxNjk4OAordiAtMC4wMjI2NzkgLTIuNzY0NzI4IDAuMDA3NTY2Cit2IC0wLjAyNDYwNCAtMi43NjQ3NjQgMC4wMDU4MjUKK3YgLTAuMDI0NTc4IC0yLjc2NDczMCAwLjAxODcxNwordiAtMC4wMjI2NjAgLTIuNzY0NzA0IDAuMDE2OTc0Cit2IC0wLjAyNzg3OSAtMi43Njg2ODYgMC4wMTM4NTIKK3YgLTAuMDI3ODg1IC0yLjc2ODY5NCAwLjAxMDcxNgordiAtMC4wMjc5ODcgLTIuNzY0ODE5IDAuMDA1ODI2Cit2IC0wLjAyNzk2MSAtMi43NjQ3ODUgMC4wMTg3MTgKK3YgLTAuMDI3OTMzIC0yLjc2NzA5NSAwLjAwNTgzMwordiAtMC4wMjc4OTEgLTIuNzY4NzAzIDAuMDA3NTgwCit2IC0wLjAyMjEzMiAtMi42Nzc2NzUgMC4wMTA1MzUKK3YgLTAuMDIyMTI2IC0yLjY3NzY3NSAwLjAxMzY3MQordiAtMC4wMjQwNjMgLTIuNjc3Njc1IDAuMDA1NjU4Cit2IC0wLjAyMjEzOCAtMi42Nzc2NzUgMC4wMDczOTkKK3YgLTAuMDIyMTE5IC0yLjY3NzY3NSAwLjAxNjgwNwordiAtMC4wMjQwMzcgLTIuNjc3Njc1IDAuMDE4NTUwCit2IC0wLjAyNzQ0NiAtMi42Nzc2NzUgMC4wMDU2NTkKK3YgLTAuMDI3NDIwIC0yLjY3NzY3NSAwLjAxODU1MQordiAtMC4wMzMxNjAgLTIuNzYyNzA5IDAuMDA2MDc0Cit2IC0wLjA0NDc1MSAtMi43NjI4OTggMC4wMDYwODEKK3YgLTAuMDQ1MjcxIC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4wNDUyNzEgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjAzMjY1MCAtMi43NjIxODYgMC4wMDYwNzMKK3YgLTAuMDMyNjUwIC0yLjc2MjcwMSAwLjAwNjA3NAordiAtMC4wMzMxNjEgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjA0NDc1MSAtMi43NjI0NDEgMC4wMDM3NDAKK3YgLTAuMDQ1MjcxIC0yLjc2MjQ0OSAwLjAwMzc0MAordiAtMC4wNDUyNzEgLTIuNzYxOTM1IDAuMDAzNzQwCit2IC0wLjAzMjY1MCAtMi43NjE3MjkgMC4wMDM3MzgKK3YgLTAuMDMyNjUwIC0yLjc2MjI0NCAwLjAwMzczOQordiAtMC4wMzMxNjEgLTIuNzYwNTU2IDAuMDAxOTg1Cit2IC0wLjA0NDc1MiAtMi43NjA3MTIgMC4wMDE5ODMKK3YgLTAuMDQ1MjcxIC0yLjc2MDcxOSAwLjAwMTk4MwordiAtMC4wNDUyNzEgLTIuNzYwMzA0IDAuMDAyMjA4Cit2IC0wLjAzMjY1MCAtMi43NjAxMzQgMC4wMDIzMTIKK3YgLTAuMDMyNjUwIC0yLjc2MDU0OSAwLjAwMTk4NQordiAtMC4wMzMxNjEgLTIuNzU3Mjg4IDAuMDAxMzM3Cit2IC0wLjA0NDc1MiAtMi43NTc0NzYgMC4wMDEzMzgKK3YgLTAuMDQ1MjcxIC0yLjc1NzQ4NSAwLjAwMTMzOAordiAtMC4wNDUyNzEgLTIuNzU3MTk3IDAuMDAxNzQ4Cit2IC0wLjAzMjY1MCAtMi43NTY5OTIgMC4wMDE3NDEKK3YgLTAuMDMyNjUwIC0yLjc1NzI3OSAwLjAwMTMzNwordiAtMC4wMzMxNjIgLTIuNjc3Njc2IDAuMDA0ODAxCit2IC0wLjA0NDc1MyAtMi42Nzc2NzcgMC4wMDQ4MDgKK3YgLTAuMDQ1MjcxIC0yLjY3NzY3NyAwLjAwNDgwOAordiAtMC4wNDUyNzEgLTIuNjc3Njc3IDAuMDA1Mjk5Cit2IC0wLjAzMjY1MCAtMi42Nzc2NzYgMC4wMDUyOTIKK3YgLTAuMDMyNjUwIC0yLjY3NzY3NiAwLjAwNDgwMQordiAtMC4wNjQ1MjMgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjA2NDUyMyAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMDc2MTE0IC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4wNzYxMTQgLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjA3NjYzNCAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMDc2NjM0IC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4wNzY2MzQgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjA3NjYzNCAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMDY0MDEyIC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4wNjQwMTIgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjA2NDAxMiAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMDY0MDEyIC0yLjc2MjI0NCAwLjAwMzczOQordiAtMC4wNzYxMTQgLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjA2NDUyMyAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMDc2NjM0IC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4wNzY2MzQgLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjA2NDAxMiAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMDY0MDEyIC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4wNzYxMTUgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjA2NDUyNCAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMDc2NjM0IC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4wNzY2MzQgLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjA2NDAxMiAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMDY0MDEyIC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4wNzYxMTYgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjA2NDUyNSAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMDc2NjM0IC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4wNzY2MzQgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjA2NDAxMiAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMDY0MDEyIC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4wOTYwMTcgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjA5NjAxNyAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMTA3NjA3IC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4xMDc2MDggLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjEwODEyOCAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMTA4MTI4IC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4xMDgxMjggLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjEwODEyOCAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMDk1NTA2IC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4wOTU1MDYgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjA5NTUwNiAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMDk1NTA2IC0yLjc2MjI0NCAwLjAwMzczOQordiAtMC4xMDc2MDggLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjA5NjAxNyAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMTA4MTI4IC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4xMDgxMjggLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjA5NTUwNiAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMDk1NTA2IC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4xMDc2MDkgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjA5NjAxOCAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMTA4MTI4IC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4xMDgxMjggLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjA5NTUwNiAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMDk1NTA2IC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4xMDc2MTAgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjA5NjAxOSAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTA4MTI4IC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4xMDgxMjggLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjA5NTUwNiAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMDk1NTA2IC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4xMjYwNTIgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjEyNjA1MiAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMTM3NjQyIC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4xMzc2NDMgLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjEzODE2MyAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMTM4MTYzIC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4xMzgxNjMgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjEzODE2MyAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMTI1NTQxIC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4xMjU1NDEgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjEyNTU0MSAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMTI1NTQxIC0yLjc2MjI0NCAwLjAwMzczOQordiAtMC4xMzc2NDMgLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjEyNjA1MiAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMTM4MTYzIC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4xMzgxNjMgLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjEyNTU0MSAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMTI1NTQxIC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4xMzc2NDMgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjEyNjA1MyAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMTM4MTYzIC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4xMzgxNjMgLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjEyNTU0MSAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMTI1NTQxIC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4xMzc2NDQgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjEyNjA1NCAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTM4MTYzIC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4xMzgxNjMgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjEyNTU0MSAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTI1NTQxIC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4yNzI2MTIgLTIuNzY3MDA0IDAuMDA3NTczCit2IC0wLjI3MDcyOSAtMi43Njg2NDcgMC4wMDc1NzgKK3YgLTAuMjcwNjg3IC0yLjc2NzA0MCAwLjAwNTgzMgordiAtMC4yNzA3MTMgLTIuNzY3MDA3IDAuMDE4NzI0Cit2IC0wLjI3MDc0OCAtMi43Njg2MjMgMC4wMTY5ODYKK3YgLTAuMjcyNjMxIC0yLjc2Njk4MCAwLjAxNjk4MQordiAtMC4yNzI2MTggLTIuNzY2OTk2IDAuMDEwNzA5Cit2IC0wLjI3MjYyNSAtMi43NjY5ODggMC4wMTM4NDUKK3YgLTAuMjcwNzQyIC0yLjc2ODYzMSAwLjAxMzg1MAordiAtMC4yNzA3MzUgLTIuNzY4NjM5IDAuMDEwNzE0Cit2IC0wLjI2NzM1OCAtMi43Njg2ODYgMC4wMTM4NTIKK3YgLTAuMjY3MzUyIC0yLjc2ODY5NCAwLjAxMDcxNgordiAtMC4yNjczMDQgLTIuNzY3MDk1IDAuMDA1ODMzCit2IC0wLjI2NzM0NiAtMi43Njg3MDIgMC4wMDc1ODAKK3YgLTAuMjY3MzY1IC0yLjc2ODY3OCAwLjAxNjk4OAordiAtMC4yNjczMzAgLTIuNzY3MDYyIDAuMDE4NzI1Cit2IC0wLjI3MjU3MSAtMi43NjQ3MTIgMC4wMTM4MzgKK3YgLTAuMjcyNTY0IC0yLjc2NDcyMCAwLjAxMDcwMgordiAtMC4yNzI1NTggLTIuNzY0NzI4IDAuMDA3NTY2Cit2IC0wLjI3MDYzNCAtMi43NjQ3NjQgMC4wMDU4MjUKK3YgLTAuMjcwNjU5IC0yLjc2NDczMCAwLjAxODcxNwordiAtMC4yNzI1NzcgLTIuNzY0NzA0IDAuMDE2OTc0Cit2IC0wLjI2NzI1MCAtMi43NjQ4MTkgMC4wMDU4MjYKK3YgLTAuMjY3Mjc2IC0yLjc2NDc4NSAwLjAxODcxOAordiAtMC4yNzMxMDUgLTIuNjc3Njc1IDAuMDEwNTM1Cit2IC0wLjI3MzExMiAtMi42Nzc2NzUgMC4wMTM2NzEKK3YgLTAuMjcxMTc0IC0yLjY3NzY3NSAwLjAwNTY1OAordiAtMC4yNzMwOTkgLTIuNjc3Njc1IDAuMDA3Mzk5Cit2IC0wLjI3MzExOCAtMi42Nzc2NzUgMC4wMTY4MDcKK3YgLTAuMjcxMjAwIC0yLjY3NzY3NSAwLjAxODU1MAordiAtMC4yNjc3OTEgLTIuNjc3Njc1IDAuMDA1NjU5Cit2IC0wLjI2NzgxNyAtMi42Nzc2NzUgMC4wMTg1NTEKK3YgLTAuMjYyMDc2IC0yLjc2MjI1MiAwLjAwMzczOQordiAtMC4yNjIwNzcgLTIuNzYyNzA5IDAuMDA2MDc0Cit2IC0wLjI1MDQ4NiAtMi43NjI4OTggMC4wMDYwODEKK3YgLTAuMjUwNDg2IC0yLjc2MjQ0MSAwLjAwMzc0MAordiAtMC4yNDk5NjYgLTIuNzYyNDQ5IDAuMDAzNzQwCit2IC0wLjI0OTk2NiAtMi43NjI5MDYgMC4wMDYwODEKK3YgLTAuMjQ5OTY2IC0yLjc2MjM5MiAwLjAwNjA4MAordiAtMC4yNDk5NjYgLTIuNzYxOTM1IDAuMDAzNzQwCit2IC0wLjI2MjU4NyAtMi43NjE3MjkgMC4wMDM3MzgKK3YgLTAuMjYyNTg3IC0yLjc2MjE4NiAwLjAwNjA3MwordiAtMC4yNjI1ODcgLTIuNzYyNzAxIDAuMDA2MDc0Cit2IC0wLjI2MjU4NyAtMi43NjIyNDQgMC4wMDM3MzgKK3YgLTAuMjUwNDg1IC0yLjc2MDcxMiAwLjAwMTk4MwordiAtMC4yNjIwNzYgLTIuNzYwNTU2IDAuMDAxOTg1Cit2IC0wLjI0OTk2NiAtMi43NjAzMDQgMC4wMDIyMDgKK3YgLTAuMjQ5OTY2IC0yLjc2MDcxOSAwLjAwMTk4MwordiAtMC4yNjI1ODcgLTIuNzYwNTQ5IDAuMDAxOTg1Cit2IC0wLjI2MjU4NyAtMi43NjAxMzQgMC4wMDIzMTIKK3YgLTAuMjUwNDg1IC0yLjc1NzQ3NiAwLjAwMTMzOAordiAtMC4yNjIwNzYgLTIuNzU3Mjg4IDAuMDAxMzM3Cit2IC0wLjI0OTk2NiAtMi43NTcxOTcgMC4wMDE3NDgKK3YgLTAuMjQ5OTY2IC0yLjc1NzQ4NSAwLjAwMTMzOAordiAtMC4yNjI1ODcgLTIuNzU3Mjc5IDAuMDAxMzM3Cit2IC0wLjI2MjU4NyAtMi43NTY5OTIgMC4wMDE3NDEKK3YgLTAuMjUwNDg0IC0yLjY3NzY3NyAwLjAwNDgwOAordiAtMC4yNjIwNzUgLTIuNjc3Njc2IDAuMDA0ODAxCit2IC0wLjI0OTk2NiAtMi42Nzc2NzcgMC4wMDUyOTkKK3YgLTAuMjQ5OTY2IC0yLjY3NzY3NyAwLjAwNDgwOAordiAtMC4yNjI1ODcgLTIuNjc3Njc2IDAuMDA0ODAxCit2IC0wLjI2MjU4NyAtMi42Nzc2NzYgMC4wMDUyOTIKK3YgLTAuMTQ3NjE5IC0yLjY3NzY3NSAwLjAxODU3NwordiAtMC4xNDc2MTkgLTIuNzY0Nzc5IDAuMDE4NzQ0Cit2IC0wLjE0NzYxOSAtMi43NjcwNTYgMC4wMTg3NTAKK3YgLTAuMTQ3NjE5IC0yLjc2ODY3MiAwLjAxNzAxMwordiAtMC4xNDc2MTkgLTIuNzY4NjgwIDAuMDEzODc3Cit2IC0wLjE0NzYxOSAtMi43Njg2ODggMC4wMTA3NDEKK3YgLTAuMTQ3NjE5IC0yLjc2ODY5NyAwLjAwNzYwNQordiAtMC4xNDc2MTkgLTIuNzY3MDg5IDAuMDA1ODU4Cit2IC0wLjE0NzYxOSAtMi43NjQ4MTMgMC4wMDU4NTIKK3YgLTAuMTQ3NjE5IC0yLjY3NzY3NSAwLjAwNTY4NQordiAtMC4yMzA3MTQgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjIzMDcxNCAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMjE5MTI0IC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4yMTkxMjMgLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjIxODYwMyAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMjE4NjAzIC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4yMTg2MDMgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjIxODYwMyAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMjMxMjI1IC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4yMzEyMjUgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjIzMTIyNSAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMjMxMjI1IC0yLjc2MjI0NCAwLjAwMzczOAordiAtMC4yMTkxMjMgLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjIzMDcxNCAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMjE4NjAzIC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4yMTg2MDMgLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjIzMTIyNSAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMjMxMjI1IC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4yMTkxMjMgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjIzMDcxMyAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMjE4NjAzIC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4yMTg2MDMgLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjIzMTIyNSAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMjMxMjI1IC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4yMTkxMjEgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjIzMDcxMiAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMjE4NjAzIC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4yMTg2MDMgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjIzMTIyNSAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMjMxMjI1IC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4xOTkyMjAgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjE5OTIyMCAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMTg3NjMwIC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4xODc2MjkgLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjE4NzEwOSAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMTg3MTA5IC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4xODcxMDkgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjE4NzEwOSAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMTk5NzMxIC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4xOTk3MzEgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjE5OTczMSAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMTk5NzMxIC0yLjc2MjI0NCAwLjAwMzczOAordiAtMC4xODc2MjkgLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjE5OTIyMCAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMTg3MTA5IC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4xODcxMDkgLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjE5OTczMSAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMTk5NzMxIC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4xODc2MjkgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjE5OTIxOSAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMTg3MTA5IC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4xODcxMDkgLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjE5OTczMSAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMTk5NzMxIC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4xODc2MjggLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjE5OTIxOCAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTg3MTA5IC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4xODcxMDkgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjE5OTczMSAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTk5NzMxIC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4xNjkxODUgLTIuNzYyMjUyIDAuMDAzNzM5Cit2IC0wLjE2OTE4NiAtMi43NjI3MDkgMC4wMDYwNzQKK3YgLTAuMTU3NTk1IC0yLjc2Mjg5OCAwLjAwNjA4MQordiAtMC4xNTc1OTUgLTIuNzYyNDQxIDAuMDAzNzQwCit2IC0wLjE1NzA3NSAtMi43NjI0NDkgMC4wMDM3NDAKK3YgLTAuMTU3MDc1IC0yLjc2MjkwNiAwLjAwNjA4MQordiAtMC4xNTcwNzUgLTIuNzYyMzkyIDAuMDA2MDgwCit2IC0wLjE1NzA3NSAtMi43NjE5MzUgMC4wMDM3NDAKK3YgLTAuMTY5Njk2IC0yLjc2MTcyOSAwLjAwMzczOAordiAtMC4xNjk2OTYgLTIuNzYyMTg2IDAuMDA2MDczCit2IC0wLjE2OTY5NiAtMi43NjI3MDEgMC4wMDYwNzQKK3YgLTAuMTY5Njk2IC0yLjc2MjI0NCAwLjAwMzczOQordiAtMC4xNTc1OTQgLTIuNzYwNzEyIDAuMDAxOTgzCit2IC0wLjE2OTE4NSAtMi43NjA1NTYgMC4wMDE5ODUKK3YgLTAuMTU3MDc1IC0yLjc2MDMwNCAwLjAwMjIwOAordiAtMC4xNTcwNzUgLTIuNzYwNzE5IDAuMDAxOTgzCit2IC0wLjE2OTY5NiAtMi43NjA1NDkgMC4wMDE5ODUKK3YgLTAuMTY5Njk2IC0yLjc2MDEzNCAwLjAwMjMxMgordiAtMC4xNTc1OTQgLTIuNzU3NDc2IDAuMDAxMzM4Cit2IC0wLjE2OTE4NSAtMi43NTcyODggMC4wMDEzMzcKK3YgLTAuMTU3MDc0IC0yLjc1NzE5NyAwLjAwMTc0OAordiAtMC4xNTcwNzUgLTIuNzU3NDg1IDAuMDAxMzM4Cit2IC0wLjE2OTY5NiAtMi43NTcyNzkgMC4wMDEzMzcKK3YgLTAuMTY5Njk2IC0yLjc1Njk5MiAwLjAwMTc0MQordiAtMC4xNTc1OTMgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjE2OTE4NCAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTU3MDc0IC0yLjY3NzY3NyAwLjAwNTI5OQordiAtMC4xNTcwNzQgLTIuNjc3Njc3IDAuMDA0ODA4Cit2IC0wLjE2OTY5NiAtMi42Nzc2NzYgMC4wMDQ4MDEKK3YgLTAuMTY5Njk2IC0yLjY3NzY3NiAwLjAwNTI5MgordiAtMC4yMTUyMzEgLTIuNzAxNDg4IDAuMDY5NTEyCit2IC0wLjIxNTIzNyAtMi43NjQ4MzUgMC4wNjk1MjQKK3YgLTAuMjE2Mzk4IC0yLjc2NDgzNSAwLjA2MzU3MgordiAtMC4yMTYzOTggLTIuNzAxNDg4IDAuMDYzNTYwCit2IC0wLjIxODU1MSAtMi43MDE0ODggMC4wNTg2MTkKK3YgLTAuMjE4NTUxIC0yLjc2NDgzNSAwLjA1ODYzMQordiAtMC4yMjE5MTYgLTIuNzY0ODM1IDAuMDU0MDg4Cit2IC0wLjIyMTkxNiAtMi43MDE0ODggMC4wNTQwNzYKK3YgLTAuMjI4NTYwIC0yLjc2NDgzNSAwLjA1MjE0MQordiAtMC4yMjg1NjAgLTIuNzAxNDg4IDAuMDUyMTI5Cit2IC0wLjIzNTIwNCAtMi43NjQ4MzUgMC4wNTQwODgKK3YgLTAuMjM1MjA0IC0yLjcwMTQ4OCAwLjA1NDA3NgordiAtMC4yMzg3NDcgLTIuNzY0ODM1IDAuMDU4NjMxCit2IC0wLjIzODc0NyAtMi43MDE0ODggMC4wNTg2MTkKK3YgLTAuMjQwNzIyIC0yLjc2NDgzNSAwLjA2MzU3MgordiAtMC4yNDA3MjIgLTIuNzAxNDg4IDAuMDYzNTYwCit2IC0wLjIxNzU3OCAtMi43NjU1NTggMC4wNjk1MjEKK3YgLTAuMjE4MDE3IC0yLjc2NTU1OCAwLjA2NjY1MQordiAtMC4yMTcwMjUgLTIuNzY1NTU4IDAuMDY0MzI3Cit2IC0wLjIxNjE0NyAtMi43NjU1NTggMC4wNjk1MjAKK3YgLTAuMjE5MzM4IC0yLjc2NTU1OCAwLjA1ODU3MgordiAtMC4yMjEwNzMgLTIuNzY1NTU4IDAuMDU4ODM2Cit2IC0wLjIyMzczMSAtMi43NjU1NTggMC4wNTU3NDUKK3YgLTAuMjIyNTY4IC0yLjc2NTU1OCAwLjA1NDUzNgordiAtMC4yMjg1NjAgLTIuNzY1NTU4IDAuMDU0MzMzCit2IC0wLjIyODU2MCAtMi43NjU1NTggMC4wNTI4OTMKK3YgLTAuMjMzMzg4IC0yLjc2NTU1OCAwLjA1NTc0NQordiAtMC4yMzQ1NTIgLTIuNzY1NTU4IDAuMDU0NTM2Cit2IC0wLjIzNjIyNSAtMi43NjU1NTggMC4wNTg4MzYKK3YgLTAuMjM3OTYwIC0yLjc2NTU1OCAwLjA1ODU3MgordiAtMC4yMzY5OTIgLTIuNzY1NTU4IDAuMDY0NDE5Cit2IC0wLjI0MDA5NSAtMi43NjU1NTggMC4wNjQzMjcKK3YgLTAuMjM2NjQ5IC0yLjc2NTU1OCAwLjA2OTUyNgordiAtMC4yMzkxMDMgLTIuNzY1NTU4IDAuMDY2NjUxCit2IC0wLjIzNTQ4NyAtMi43NjU1NTggMC4wNjcyMjUKK3YgLTAuMjMzMzg1IC0yLjc2NTU1OCAwLjA2OTUyNwordiAtMC4yMzI4NjUgLTIuNzY1NTU4IDAuMDY0NzMwCit2IC0wLjIzMTEzNSAtMi43NjU1NTggMC4wNjY1NDkKK3YgLTAuMjI4NTYwIC0yLjc2NTU1OCAwLjA2NzMxMwordiAtMC4yMjg1NjAgLTIuNzY1NTU4IDAuMDY5NTI3Cit2IC0wLjIyNTk4NSAtMi43NjU1NTggMC4wNjY1NDkKK3YgLTAuMjIzNzM1IC0yLjc2NTU1OCAwLjA2OTUyNwordiAtMC4yMjA0NzEgLTIuNzY1NTU4IDAuMDY5NTI2Cit2IC0wLjIyMTYzMyAtMi43NjU1NTggMC4wNjcyMjUKK3YgLTAuMjQwMDA3IC0yLjc2NTU1OCAwLjA2OTUyMQordiAtMC4yMjAxMjggLTIuNzY1NTU4IDAuMDY0Mzc3Cit2IC0wLjIyNDc4NiAtMi43NjQ4MzUgMC4wNjE3NTIKK3YgLTAuMjI0Nzg2IC0yLjc2MzQ0OCAwLjA2MTc1MgordiAtMC4yMjUyOTIgLTIuNzYzNDQ4IDAuMDU5Njg5Cit2IC0wLjIyNTI5MiAtMi43NjQ4MzUgMC4wNTk2ODkKK3YgLTAuMjI2NjczIC0yLjc2MzQ0OCAwLjA1ODE3OAordiAtMC4yMjY2NzMgLTIuNzY0ODM1IDAuMDU4MTc4Cit2IC0wLjIyODU2MCAtMi43NjM0NDggMC4wNTc2MjUKK3YgLTAuMjI4NTYwIC0yLjc2NDgzNSAwLjA1NzYyNQordiAtMC4yMzA0NDcgLTIuNzYzNDQ4IDAuMDU4MTc4Cit2IC0wLjIzMDQ0NyAtMi43NjQ4MzUgMC4wNTgxNzgKK3YgLTAuMjMxODI4IC0yLjc2MzQ0OCAwLjA1OTY4OQordiAtMC4yMzE4MjggLTIuNzY0ODM1IDAuMDU5Njg5Cit2IC0wLjIzMjMzNCAtMi43NjM0NDggMC4wNjE3NTIKK3YgLTAuMjMyMzM0IC0yLjc2NDgzNSAwLjA2MTc1MgordiAtMC4yMzE4MjggLTIuNzYzNDQ4IDAuMDYzODE2Cit2IC0wLjIzMTgyOCAtMi43NjQ4MzUgMC4wNjM4MTYKK3YgLTAuMjMwNDQ3IC0yLjc2MzQ0OCAwLjA2NTMyNwordiAtMC4yMzA0NDcgLTIuNzY0ODM1IDAuMDY1MzI3Cit2IC0wLjIyODU2MCAtMi43NjM0NDggMC4wNjU4ODAKK3YgLTAuMjI4NTYwIC0yLjc2NDgzNSAwLjA2NTg4MAordiAtMC4yMjY2NzMgLTIuNzYzNDQ4IDAuMDY1MzI3Cit2IC0wLjIyNjY3MyAtMi43NjQ4MzUgMC4wNjUzMjcKK3YgLTAuMjI1MjkyIC0yLjc2MzQ0OCAwLjA2MzgxNgordiAtMC4yMjUyOTIgLTIuNzY0ODM1IDAuMDYzODE2Cit2IC0wLjIyMzk1MyAtMi43NjU1NTggMC4wNTkzMjAKK3YgLTAuMjIzNDY0IC0yLjc2NTU1OCAwLjA2MTk1MQordiAtMC4yMjU3NDggLTIuNzY1NTU4IDAuMDU3MDc5Cit2IC0wLjIyODU2MCAtMi43NjU1NTggMC4wNTYxNjYKK3YgLTAuMjMxMzcyIC0yLjc2NTU1OCAwLjA1NzA3OQordiAtMC4yMzMxNjcgLTIuNzY1NTU4IDAuMDU5MzIwCit2IC0wLjIzMzY1NiAtMi43NjU1NTggMC4wNjIwMTkKK3YgLTAuMjI0MjU0IC0yLjc2NTU1OCAwLjA2NDczMAordiAtMC4yNDE4ODMgLTIuNzY0ODM1IDAuMDY5NTI0Cit2IC0wLjI0MTg4OSAtMi43MDE0ODggMC4wNjk1MTMKK3YgLTAuMjQxMDUzIC0yLjc2NTU1OCAwLjA2OTUyMAordiAtMC4yMjcyOTIgLTIuNzY2MTUxIDAuMDYyMTk5Cit2IC0wLjIyNzU4NiAtMi43NjYxNTEgMC4wNjI3MDEKK3YgLTAuMjI3NzQ2IC0yLjc2NjE2NiAwLjA2MjUyNgordiAtMC4yMjc1MjkgLTIuNzY2MTY1IDAuMDYyMTk5Cit2IC0wLjIyNzkwNiAtMi43NjYxODEgMC4wNjIzNTIKK3YgLTAuMjI4MDQ1IC0yLjc2NjE2NSAwLjA2Mjc2MwordiAtMC4yMjgwNDUgLTIuNzY2MTgwIDAuMDYyNTA0Cit2IC0wLjIyNTQ4MCAtMi43NjU5MDIgMC4wNjIyMDUKK3YgLTAuMjI2MzY4IC0yLjc2NTkxMiAwLjA2NDAzMwordiAtMC4yMjgwNjkgLTIuNzY1OTEyIDAuMDY0OTA5Cit2IC0wLjIyODA0NSAtMi43NjYxNTEgMC4wNjMwMjMKK3YgLTAuMjI1MTMzIC0yLjc2NTgyMyAwLjA2MjIzNgordiAtMC4yMjYwNzEgLTIuNzY1ODIzIDAuMDY0MzU4Cit2IC0wLjIyODA4MSAtMi43NjU4MjMgMC4wNjUzOTQKK3YgLTAuMjI1MTMzIC0yLjc2NTgyMyAwLjA2MTEzMgordiAtMC4yMjQ3MTggLTIuNzY1NjM3IDAuMDYwODY5Cit2IC0wLjIyNDcxOCAtMi43NjU2MzcgMC4wNjI0OTcKK3YgLTAuMjI1NzY2IC0yLjc2NTYzNyAwLjA2NDY5MgordiAtMC4yMjc3MzYgLTIuNzY1NjM3IDAuMDY1ODQ4Cit2IC0wLjIyNDM0MCAtMi43NjUxMjUgMC4wNjI1NzkKK3YgLTAuMjI0MzQwIC0yLjc2NTEyNSAwLjA2MDc4NwordiAtMC4yMjQzNDEgLTIuNzY0NTM5IDAuMDYwNzg3Cit2IC0wLjIyNDM0MSAtMi43NjQ1MzkgMC4wNjI1NzkKK3YgLTAuMjI1NDg4IC0yLjc2NTEyNSAwLjA2NDk5NgordiAtMC4yMjU0ODggLTIuNzY0NTM5IDAuMDY0OTk2Cit2IC0wLjIyNzY2MSAtMi43NjQ1MzkgMC4wNjYyNjEKK3YgLTAuMjI3NjYxIC0yLjc2NTEyNSAwLjA2NjI2MQordiAtMC4yMjU0NzkgLTIuNzY1OTA0IDAuMDYxOTY3Cit2IC0wLjIyNzI5MiAtMi43NjYxNTEgMC4wNjExNjcKK3YgLTAuMjI3NTI5IC0yLjc2NjE2NSAwLjA2MTE2NwordiAtMC4yMjc3NDYgLTIuNzY2MTY2IDAuMDYwODQwCit2IC0wLjIyNzU4NiAtMi43NjYxNTEgMC4wNjA2NjYKK3YgLTAuMjI3OTA2IC0yLjc2NjE4MSAwLjA2MTAxNQordiAtMC4yMjgwNDUgLTIuNzY2MTgwIDAuMDYwODYzCit2IC0wLjIyODA0NSAtMi43NjYxNjUgMC4wNjA2MDMKK3YgLTAuMjI2MzY4IC0yLjc2NTkxMiAwLjA1OTMzMwordiAtMC4yMjU0OTAgLTIuNzY1OTExIDAuMDYxMTU1Cit2IC0wLjIyODA0NSAtMi43NjYxNTEgMC4wNjAzNDMKK3YgLTAuMjI4MDY5IC0yLjc2NTkxMiAwLjA1ODQ1OAordiAtMC4yMjYwNzEgLTIuNzY1ODIzIDAuMDU5MDA4Cit2IC0wLjIyODEwMyAtMi43NjU4MjMgMC4wNTc5NjUKK3YgLTAuMjI3NzczIC0yLjc2NTYzNyAwLjA1NzUxMQordiAtMC4yMjU3NjYgLTIuNzY1NjM3IDAuMDU4Njc1Cit2IC0wLjIyNTQ4OCAtMi43NjUxMjUgMC4wNTgzNzEKK3YgLTAuMjI3Njk4IC0yLjc2NTEyNSAwLjA1NzA5OAordiAtMC4yMjc2OTggLTIuNzY0NTM5IDAuMDU3MDk4Cit2IC0wLjIyNTQ4OCAtMi43NjQ1MzkgMC4wNTgzNzEKK3YgLTAuMjI1NDg1IC0yLjc2NTkxMSAwLjA2MTQxNAordiAtMC4yMjk3NDMgLTIuNzY2MTUxIDAuMDYyMTk5Cit2IC0wLjIyOTUwNSAtMi43NjYxNjUgMC4wNjIxOTkKK3YgLTAuMjI5Mjg4IC0yLjc2NjE2NiAwLjA2MjUyNgordiAtMC4yMjk0NDggLTIuNzY2MTUxIDAuMDYyNzAxCit2IC0wLjIyOTEyOSAtMi43NjYxODEgMC4wNjIzNTIKK3YgLTAuMjI4OTg5IC0yLjc2NjE4MCAwLjA2MjUwNAordiAtMC4yMjg5ODkgLTIuNzY2MTY1IDAuMDYyNzYzCit2IC0wLjIzMDY2NiAtMi43NjU5MTIgMC4wNjQwMzMKK3YgLTAuMjMxNTUyIC0yLjc2NTkyNyAwLjA2MjIyNwordiAtMC4yMjg5ODkgLTIuNzY2MTUxIDAuMDYzMDIzCit2IC0wLjIyODk2NSAtMi43NjU5MTIgMC4wNjQ5MDkKK3YgLTAuMjMwOTYzIC0yLjc2NTgyMyAwLjA2NDM1OAordiAtMC4yMzE4OTYgLTIuNzY1ODIzIDAuMDYyMjM2Cit2IC0wLjIyODkwNiAtMi43NjU4MjMgMC4wNjUzOTQKK3YgLTAuMjMxODk2IC0yLjc2NTgyMyAwLjA2MTEzMgordiAtMC4yMzIzMTEgLTIuNzY1NjM3IDAuMDYyNDk3Cit2IC0wLjIzMjMxMSAtMi43NjU2MzcgMC4wNjA4NjkKK3YgLTAuMjI5MjI1IC0yLjc2NTYzNyAwLjA2NTg0OAordiAtMC4yMzEyNjggLTIuNzY1NjM3IDAuMDY0NjkyCit2IC0wLjIzMjY4OSAtMi43NjUxMjUgMC4wNjA3ODcKK3YgLTAuMjMyNjg5IC0yLjc2NTEyNSAwLjA2MjU3OQordiAtMC4yMzI2ODkgLTIuNzY0NTM5IDAuMDYyNTgwCit2IC0wLjIzMjY4OSAtMi43NjQ1MzkgMC4wNjA3ODcKK3YgLTAuMjMxNTQ2IC0yLjc2NTEyNSAwLjA2NDk5NgordiAtMC4yMjkzMDEgLTIuNzY1MTI1IDAuMDY2MjYxCit2IC0wLjIyOTMwMCAtMi43NjQ1MzkgMC4wNjYyNjEKK3YgLTAuMjMxNTQ2IC0yLjc2NDUzOSAwLjA2NDk5NgordiAtMC4yMzE1NTQgLTIuNzY1OTMxIDAuMDYxOTYyCit2IC0wLjIyOTc0MyAtMi43NjYxNTEgMC4wNjExNjcKK3YgLTAuMjI5NDQ4IC0yLjc2NjE1MSAwLjA2MDY2NgordiAtMC4yMjkyODggLTIuNzY2MTY2IDAuMDYwODQwCit2IC0wLjIyOTUwNSAtMi43NjYxNjUgMC4wNjExNjcKK3YgLTAuMjI5MTI5IC0yLjc2NjE4MSAwLjA2MTAxNQordiAtMC4yMjg5ODkgLTIuNzY2MTY1IDAuMDYwNjAzCit2IC0wLjIyODk4OSAtMi43NjYxODAgMC4wNjA4NjMKK3YgLTAuMjMxNTQ5IC0yLjc2NTkyMyAwLjA2MTE4NQordiAtMC4yMzA2NjYgLTIuNzY1OTEyIDAuMDU5MzMzCit2IC0wLjIyODk2NiAtMi43NjU5MTIgMC4wNTg0NTgKK3YgLTAuMjI4OTg5IC0yLjc2NjE1MSAwLjA2MDM0MwordiAtMC4yMzA5NjMgLTIuNzY1ODIzIDAuMDU5MDA4Cit2IC0wLjIyODkyOCAtMi43NjU4MjMgMC4wNTc5NjUKK3YgLTAuMjMxMjY4IC0yLjc2NTYzNyAwLjA1ODY3NQordiAtMC4yMjkyNjIgLTIuNzY1NjM3IDAuMDU3NTExCit2IC0wLjIzMTU0NiAtMi43NjUxMjUgMC4wNTgzNzEKK3YgLTAuMjMxNTQ2IC0yLjc2NDUzOSAwLjA1ODM3MQordiAtMC4yMjkzMzcgLTIuNzY0NTM5IDAuMDU3MDk4Cit2IC0wLjIyOTMzNyAtMi43NjUxMjUgMC4wNTcwOTgKK3YgLTAuMjMxNTUzIC0yLjc2NTkyOCAwLjA2MTQ0MQordiAtMC4yMjU3MzYgLTIuNzY1MjA1IDAuMDYxODU5Cit2IC0wLjIyNzI3OCAtMi43NjUyMDYgMC4wNjE4NTkKK3YgLTAuMjI3Mjc4IC0yLjc2NTIwNiAwLjA2MTUwOQordiAtMC4yMjU3MzYgLTIuNzY1MjA1IDAuMDYxNTA4Cit2IC0wLjIyNzQ4MyAtMi43NjUyMDYgMC4wNjE4NTkKK3YgLTAuMjI3NzY3IC0yLjc2NjE4MCAwLjA2MjE5OQordiAtMC4yMjgxMTYgLTIuNzY1MjA2IDAuMDYxODU5Cit2IC0wLjIyODI1MCAtMi43NjUyMDYgMC4wNjIxNDkKK3YgLTAuMjI4Mzg1IC0yLjc2NTIwNiAwLjA2MjM4NQordiAtMC4yMjgzODUgLTIuNzY1MjA2IDAuMDYyODE0Cit2IC0wLjIyODM4NSAtMi43NjUyMDYgMC4wNjMwMzgKK3YgLTAuMjI4Mzc5IC0yLjc2NTIwNCAwLjA2NDY3OQordiAtMC4yMjgzMTIgLTIuNzY1OTEyIDAuMDY0OTM1Cit2IC0wLjIyODY5MiAtMi43NjU5MTIgMC4wNjQ5NDUKK3YgLTAuMjI4NjUyIC0yLjc2NTIwNCAwLjA2NDY3OQordiAtMC4yMjg2NDcgLTIuNzY1MjA2IDAuMDYzMDM4Cit2IC0wLjIyODY0NyAtMi43NjUyMDYgMC4wNjI4MTQKK3YgLTAuMjI4NjQ2IC0yLjc2NTIwNiAwLjA2MjM4NQordiAtMC4yMjg3ODEgLTIuNzY1MjA2IDAuMDYyMTQ5Cit2IC0wLjIyOTI2OCAtMi43NjYxODAgMC4wNjIxOTkKK3YgLTAuMjI4OTE2IC0yLjc2NTIwNiAwLjA2MTg1OQordiAtMC4yMjk1NTIgLTIuNzY1MjA2IDAuMDYxODU5Cit2IC0wLjIyOTc1NiAtMi43NjUyMDYgMC4wNjE4NTkKK3YgLTAuMjMxMjk4IC0yLjc2NTIwNSAwLjA2MTg1OQordiAtMC4yMzEyOTggLTIuNzY1MjA1IDAuMDYxNTA4Cit2IC0wLjIyOTc1NiAtMi43NjUyMDYgMC4wNjE1MDkKK3YgLTAuMjI5NTUyIC0yLjc2NTIwNiAwLjA2MTUwOQordiAtMC4yMjkyNjggLTIuNzY2MTgwIDAuMDYxMTY3Cit2IC0wLjIyODkxNiAtMi43NjUyMDYgMC4wNjE1MDkKK3YgLTAuMjI4NzgxIC0yLjc2NTIwNiAwLjA2MTIxOAordiAtMC4yMjg2NDYgLTIuNzY1MjA2IDAuMDYwOTgxCit2IC0wLjIyODY0NyAtMi43NjUyMDYgMC4wNjA1NTIKK3YgLTAuMjI4NjQ3IC0yLjc2NTIwNiAwLjA2MDMyOQordiAtMC4yMjg2NTIgLTIuNzY1MjA1IDAuMDU4Njg4Cit2IC0wLjIyODcyOSAtMi43NjU5MTIgMC4wNTg0MzUKK3YgLTAuMjI4MzAyIC0yLjc2NTkxMiAwLjA1ODQzNQordiAtMC4yMjgzNzkgLTIuNzY1MjA1IDAuMDU4Njg4Cit2IC0wLjIyODM4NSAtMi43NjUyMDYgMC4wNjAzMjkKK3YgLTAuMjI4Mzg1IC0yLjc2NTIwNiAwLjA2MDU1MgordiAtMC4yMjgzODUgLTIuNzY1MjA2IDAuMDYwOTgxCit2IC0wLjIyODI1MCAtMi43NjUyMDYgMC4wNjEyMTgKK3YgLTAuMjI3NzY3IC0yLjc2NjE4MCAwLjA2MTE2NwordiAtMC4yMjgxMTYgLTIuNzY1MjA2IDAuMDYxNTA5Cit2IC0wLjIyNzQ4MyAtMi43NjUyMDYgMC4wNjE1MDkKK3YgLTAuMDUxNDA5IC0yLjcwMTQ4OCAwLjA2OTUxMwordiAtMC4wNTE0MTUgLTIuNzY0ODM1IDAuMDY5NTI0Cit2IC0wLjA1MjU3NiAtMi43NjQ4MzUgMC4wNjM1NzIKK3YgLTAuMDUyNTc2IC0yLjcwMTQ4OCAwLjA2MzU2MAordiAtMC4wNTQ3MjkgLTIuNzAxNDg4IDAuMDU4NjIwCit2IC0wLjA1NDcyOSAtMi43NjQ4MzUgMC4wNTg2MzEKK3YgLTAuMDU4MDk0IC0yLjc2NDgzNSAwLjA1NDA4OAordiAtMC4wNTgwOTQgLTIuNzAxNDg4IDAuMDU0MDc2Cit2IC0wLjA2NDczOCAtMi43NjQ4MzUgMC4wNTIxNDEKK3YgLTAuMDY0NzM4IC0yLjcwMTQ4OCAwLjA1MjEyOQordiAtMC4wNzEzODIgLTIuNzY0ODM1IDAuMDU0MDg4Cit2IC0wLjA3MTM4MiAtMi43MDE0ODggMC4wNTQwNzYKK3YgLTAuMDc0OTI1IC0yLjc2NDgzNSAwLjA1ODYzMQordiAtMC4wNzQ5MjUgLTIuNzAxNDg4IDAuMDU4NjIwCit2IC0wLjA3NjkwMCAtMi43NjQ4MzUgMC4wNjM1NzIKK3YgLTAuMDc2OTAwIC0yLjcwMTQ4OCAwLjA2MzU2MAordiAtMC4wNTM3NTYgLTIuNzY1NTU4IDAuMDY5NTIxCit2IC0wLjA1NDE5NSAtMi43NjU1NTggMC4wNjY2NTEKK3YgLTAuMDUzMjAzIC0yLjc2NTU1OCAwLjA2NDMyNwordiAtMC4wNTIzMjYgLTIuNzY1NTU4IDAuMDY5NTIwCit2IC0wLjA1NTUxNyAtMi43NjU1NTggMC4wNTg1NzIKK3YgLTAuMDU3MjUxIC0yLjc2NTU1OCAwLjA1ODgzNgordiAtMC4wNTk5MDkgLTIuNzY1NTU4IDAuMDU1NzQ1Cit2IC0wLjA1ODc0NiAtMi43NjU1NTggMC4wNTQ1MzYKK3YgLTAuMDY0NzM4IC0yLjc2NTU1OCAwLjA1NDMzMwordiAtMC4wNjQ3MzggLTIuNzY1NTU4IDAuMDUyODkzCit2IC0wLjA2OTU2NiAtMi43NjU1NTggMC4wNTU3NDUKK3YgLTAuMDcwNzMwIC0yLjc2NTU1OCAwLjA1NDUzNgordiAtMC4wNzI0MDQgLTIuNzY1NTU4IDAuMDU4ODM2Cit2IC0wLjA3NDEzOCAtMi43NjU1NTggMC4wNTg1NzIKK3YgLTAuMDczMTcwIC0yLjc2NTU1OCAwLjA2NDQxOQordiAtMC4wNzYyNzMgLTIuNzY1NTU4IDAuMDY0MzI3Cit2IC0wLjA3MjgyNyAtMi43NjU1NTggMC4wNjk1MjYKK3YgLTAuMDc1MjgxIC0yLjc2NTU1OCAwLjA2NjY1MQordiAtMC4wNzE2NjUgLTIuNzY1NTU4IDAuMDY3MjI1Cit2IC0wLjA2OTU2MyAtMi43NjU1NTggMC4wNjk1MjcKK3YgLTAuMDY5MDQ0IC0yLjc2NTU1OCAwLjA2NDczMAordiAtMC4wNjczMTMgLTIuNzY1NTU4IDAuMDY2NTQ5Cit2IC0wLjA2NDczOCAtMi43NjU1NTggMC4wNjczMTMKK3YgLTAuMDY0NzM4IC0yLjc2NTU1OCAwLjA2OTUyNwordiAtMC4wNjIxNjMgLTIuNzY1NTU4IDAuMDY2NTQ5Cit2IC0wLjA1OTkxMyAtMi43NjU1NTggMC4wNjk1MjcKK3YgLTAuMDU2NjQ5IC0yLjc2NTU1OCAwLjA2OTUyNgordiAtMC4wNTc4MTEgLTIuNzY1NTU4IDAuMDY3MjI1Cit2IC0wLjA3NjE4NSAtMi43NjU1NTggMC4wNjk1MjEKK3YgLTAuMDU2MzA2IC0yLjc2NTU1OCAwLjA2NDM3NwordiAtMC4wNjA5NjQgLTIuNzY0ODM1IDAuMDYxNzUyCit2IC0wLjA2MDk2NCAtMi43NjM0NDggMC4wNjE3NTIKK3YgLTAuMDYxNDcwIC0yLjc2MzQ0OCAwLjA1OTY4OQordiAtMC4wNjE0NzAgLTIuNzY0ODM1IDAuMDU5Njg5Cit2IC0wLjA2Mjg1MSAtMi43NjM0NDggMC4wNTgxNzgKK3YgLTAuMDYyODUxIC0yLjc2NDgzNSAwLjA1ODE3OAordiAtMC4wNjQ3MzggLTIuNzYzNDQ4IDAuMDU3NjI1Cit2IC0wLjA2NDczOCAtMi43NjQ4MzUgMC4wNTc2MjUKK3YgLTAuMDY2NjI1IC0yLjc2MzQ0OCAwLjA1ODE3OAordiAtMC4wNjY2MjUgLTIuNzY0ODM1IDAuMDU4MTc4Cit2IC0wLjA2ODAwNiAtMi43NjM0NDggMC4wNTk2ODkKK3YgLTAuMDY4MDA2IC0yLjc2NDgzNSAwLjA1OTY4OQordiAtMC4wNjg1MTIgLTIuNzYzNDQ4IDAuMDYxNzUyCit2IC0wLjA2ODUxMiAtMi43NjQ4MzUgMC4wNjE3NTIKK3YgLTAuMDY4MDA2IC0yLjc2MzQ0OCAwLjA2MzgxNgordiAtMC4wNjgwMDYgLTIuNzY0ODM1IDAuMDYzODE2Cit2IC0wLjA2NjYyNSAtMi43NjM0NDggMC4wNjUzMjcKK3YgLTAuMDY2NjI1IC0yLjc2NDgzNSAwLjA2NTMyNwordiAtMC4wNjQ3MzggLTIuNzYzNDQ4IDAuMDY1ODgwCit2IC0wLjA2NDczOCAtMi43NjQ4MzUgMC4wNjU4ODAKK3YgLTAuMDYyODUxIC0yLjc2MzQ0OCAwLjA2NTMyNwordiAtMC4wNjI4NTEgLTIuNzY0ODM1IDAuMDY1MzI3Cit2IC0wLjA2MTQ3MCAtMi43NjM0NDggMC4wNjM4MTYKK3YgLTAuMDYxNDcwIC0yLjc2NDgzNSAwLjA2MzgxNgordiAtMC4wNjAxMzEgLTIuNzY1NTU4IDAuMDU5MzIwCit2IC0wLjA1OTY0MiAtMi43NjU1NTggMC4wNjE5NTEKK3YgLTAuMDYxOTI2IC0yLjc2NTU1OCAwLjA1NzA3OQordiAtMC4wNjQ3MzggLTIuNzY1NTU4IDAuMDU2MTY2Cit2IC0wLjA2NzU1MCAtMi43NjU1NTggMC4wNTcwNzkKK3YgLTAuMDY5MzQ1IC0yLjc2NTU1OCAwLjA1OTMyMAordiAtMC4wNjk4MzQgLTIuNzY1NTU4IDAuMDYyMDIwCit2IC0wLjA2MDQzMiAtMi43NjU1NTggMC4wNjQ3MzAKK3YgLTAuMDc4MDYxIC0yLjc2NDgzNSAwLjA2OTUyNAordiAtMC4wNzgwNjcgLTIuNzAxNDg4IDAuMDY5NTEzCit2IC0wLjA3NzIzMiAtMi43NjU1NTggMC4wNjk1MjAKK3YgLTAuMDYzNDcwIC0yLjc2NjE1MSAwLjA2MjE5OQordiAtMC4wNjM3NjUgLTIuNzY2MTUxIDAuMDYyNzAxCit2IC0wLjA2MzkyNCAtMi43NjYxNjYgMC4wNjI1MjYKK3YgLTAuMDYzNzA3IC0yLjc2NjE2NSAwLjA2MjE5OQordiAtMC4wNjQwODQgLTIuNzY2MTgxIDAuMDYyMzUyCit2IC0wLjA2NDIyMyAtMi43NjYxNjUgMC4wNjI3NjQKK3YgLTAuMDY0MjIzIC0yLjc2NjE4MCAwLjA2MjUwNAordiAtMC4wNjE2NTggLTIuNzY1OTAyIDAuMDYyMjA2Cit2IC0wLjA2MjU0NiAtMi43NjU5MTIgMC4wNjQwMzMKK3YgLTAuMDY0MjQ3IC0yLjc2NTkxMiAwLjA2NDkwOQordiAtMC4wNjQyMjMgLTIuNzY2MTUxIDAuMDYzMDIzCit2IC0wLjA2MTMxMSAtMi43NjU4MjMgMC4wNjIyMzYKK3YgLTAuMDYyMjQ5IC0yLjc2NTgyMyAwLjA2NDM1OAordiAtMC4wNjQyNTkgLTIuNzY1ODIzIDAuMDY1Mzk0Cit2IC0wLjA2MTMxMSAtMi43NjU4MjMgMC4wNjExMzIKK3YgLTAuMDYwODk2IC0yLjc2NTYzNyAwLjA2MDg2OQordiAtMC4wNjA4OTYgLTIuNzY1NjM3IDAuMDYyNDk3Cit2IC0wLjA2MTk0NCAtMi43NjU2MzcgMC4wNjQ2OTIKK3YgLTAuMDYzOTE0IC0yLjc2NTYzNyAwLjA2NTg0OAordiAtMC4wNjA1MTggLTIuNzY1MTI1IDAuMDYyNTgwCit2IC0wLjA2MDUxOCAtMi43NjUxMjUgMC4wNjA3ODcKK3YgLTAuMDYwNTE5IC0yLjc2NDUzOSAwLjA2MDc4NwordiAtMC4wNjA1MTkgLTIuNzY0NTM5IDAuMDYyNTgwCit2IC0wLjA2MTY2NiAtMi43NjUxMjUgMC4wNjQ5OTYKK3YgLTAuMDYxNjY3IC0yLjc2NDUzOSAwLjA2NDk5NgordiAtMC4wNjM4MzkgLTIuNzY0NTM5IDAuMDY2MjYxCit2IC0wLjA2MzgzOSAtMi43NjUxMjUgMC4wNjYyNjEKK3YgLTAuMDYxNjU3IC0yLjc2NTkwNCAwLjA2MTk2NwordiAtMC4wNjM0NzAgLTIuNzY2MTUxIDAuMDYxMTY3Cit2IC0wLjA2MzcwNyAtMi43NjYxNjUgMC4wNjExNjcKK3YgLTAuMDYzOTI0IC0yLjc2NjE2NiAwLjA2MDg0MAordiAtMC4wNjM3NjUgLTIuNzY2MTUxIDAuMDYwNjY2Cit2IC0wLjA2NDA4NCAtMi43NjYxODEgMC4wNjEwMTUKK3YgLTAuMDY0MjIzIC0yLjc2NjE4MCAwLjA2MDg2MwordiAtMC4wNjQyMjMgLTIuNzY2MTY1IDAuMDYwNjAzCit2IC0wLjA2MjU0NiAtMi43NjU5MTIgMC4wNTkzMzMKK3YgLTAuMDYxNjY4IC0yLjc2NTkxMSAwLjA2MTE1NQordiAtMC4wNjQyMjMgLTIuNzY2MTUxIDAuMDYwMzQzCit2IC0wLjA2NDI0NyAtMi43NjU5MTIgMC4wNTg0NTgKK3YgLTAuMDYyMjQ5IC0yLjc2NTgyMyAwLjA1OTAwOAordiAtMC4wNjQyODEgLTIuNzY1ODIzIDAuMDU3OTY1Cit2IC0wLjA2Mzk1MSAtMi43NjU2MzcgMC4wNTc1MTEKK3YgLTAuMDYxOTQ0IC0yLjc2NTYzNyAwLjA1ODY3NQordiAtMC4wNjE2NjYgLTIuNzY1MTI1IDAuMDU4MzcxCit2IC0wLjA2Mzg3NiAtMi43NjUxMjUgMC4wNTcwOTgKK3YgLTAuMDYzODc2IC0yLjc2NDUzOSAwLjA1NzA5OAordiAtMC4wNjE2NjcgLTIuNzY0NTM5IDAuMDU4MzcxCit2IC0wLjA2MTY2MyAtMi43NjU5MTEgMC4wNjE0MTQKK3YgLTAuMDY1OTIxIC0yLjc2NjE1MSAwLjA2MjE5OQordiAtMC4wNjU2ODMgLTIuNzY2MTY1IDAuMDYyMTk5Cit2IC0wLjA2NTQ2NiAtMi43NjYxNjYgMC4wNjI1MjYKK3YgLTAuMDY1NjI2IC0yLjc2NjE1MSAwLjA2MjcwMQordiAtMC4wNjUzMDcgLTIuNzY2MTgxIDAuMDYyMzUyCit2IC0wLjA2NTE2OCAtMi43NjYxODAgMC4wNjI1MDQKK3YgLTAuMDY1MTY4IC0yLjc2NjE2NSAwLjA2Mjc2NAordiAtMC4wNjY4NDQgLTIuNzY1OTEyIDAuMDY0MDMzCit2IC0wLjA2NzczMCAtMi43NjU5MjcgMC4wNjIyMjcKK3YgLTAuMDY1MTY4IC0yLjc2NjE1MSAwLjA2MzAyMwordiAtMC4wNjUxNDQgLTIuNzY1OTEyIDAuMDY0OTA5Cit2IC0wLjA2NzE0MSAtMi43NjU4MjMgMC4wNjQzNTgKK3YgLTAuMDY4MDc0IC0yLjc2NTgyMyAwLjA2MjIzNgordiAtMC4wNjUwODQgLTIuNzY1ODIzIDAuMDY1Mzk0Cit2IC0wLjA2ODA3NCAtMi43NjU4MjMgMC4wNjExMzIKK3YgLTAuMDY4NDg5IC0yLjc2NTYzNyAwLjA2MjQ5NwordiAtMC4wNjg0ODkgLTIuNzY1NjM3IDAuMDYwODY5Cit2IC0wLjA2NTQwNCAtMi43NjU2MzcgMC4wNjU4NDgKK3YgLTAuMDY3NDQ2IC0yLjc2NTYzNyAwLjA2NDY5MgordiAtMC4wNjg4NjcgLTIuNzY1MTI1IDAuMDYwNzg3Cit2IC0wLjA2ODg2NyAtMi43NjUxMjUgMC4wNjI1ODAKK3YgLTAuMDY4ODY3IC0yLjc2NDUzOSAwLjA2MjU4MAordiAtMC4wNjg4NjcgLTIuNzY0NTM5IDAuMDYwNzg3Cit2IC0wLjA2NzcyNCAtMi43NjUxMjUgMC4wNjQ5OTYKK3YgLTAuMDY1NDc5IC0yLjc2NTEyNSAwLjA2NjI2MQordiAtMC4wNjU0NzggLTIuNzY0NTM5IDAuMDY2MjYxCit2IC0wLjA2NzcyNCAtMi43NjQ1MzkgMC4wNjQ5OTYKK3YgLTAuMDY3NzMyIC0yLjc2NTkzMSAwLjA2MTk2MgordiAtMC4wNjU5MjEgLTIuNzY2MTUxIDAuMDYxMTY3Cit2IC0wLjA2NTYyNiAtMi43NjYxNTEgMC4wNjA2NjYKK3YgLTAuMDY1NDY2IC0yLjc2NjE2NiAwLjA2MDg0MAordiAtMC4wNjU2ODMgLTIuNzY2MTY1IDAuMDYxMTY3Cit2IC0wLjA2NTMwNyAtMi43NjYxODEgMC4wNjEwMTUKK3YgLTAuMDY1MTY4IC0yLjc2NjE2NSAwLjA2MDYwMwordiAtMC4wNjUxNjggLTIuNzY2MTgwIDAuMDYwODYzCit2IC0wLjA2NzcyNyAtMi43NjU5MjMgMC4wNjExODUKK3YgLTAuMDY2ODQ0IC0yLjc2NTkxMiAwLjA1OTMzMwordiAtMC4wNjUxNDQgLTIuNzY1OTEyIDAuMDU4NDU4Cit2IC0wLjA2NTE2OCAtMi43NjYxNTEgMC4wNjAzNDMKK3YgLTAuMDY3MTQxIC0yLjc2NTgyMyAwLjA1OTAwOAordiAtMC4wNjUxMDYgLTIuNzY1ODIzIDAuMDU3OTY1Cit2IC0wLjA2NzQ0NiAtMi43NjU2MzcgMC4wNTg2NzUKK3YgLTAuMDY1NDQwIC0yLjc2NTYzNyAwLjA1NzUxMQordiAtMC4wNjc3MjQgLTIuNzY1MTI1IDAuMDU4MzcxCit2IC0wLjA2NzcyNCAtMi43NjQ1MzkgMC4wNTgzNzEKK3YgLTAuMDY1NTE1IC0yLjc2NDUzOSAwLjA1NzA5OAordiAtMC4wNjU1MTUgLTIuNzY1MTI1IDAuMDU3MDk4Cit2IC0wLjA2NzczMSAtMi43NjU5MjggMC4wNjE0NDEKK3YgLTAuMDYxOTE1IC0yLjc2NTIwNSAwLjA2MTg2MAordiAtMC4wNjM0NTYgLTIuNzY1MjA2IDAuMDYxODU5Cit2IC0wLjA2MzQ1NiAtMi43NjUyMDYgMC4wNjE1MDkKK3YgLTAuMDYxOTE1IC0yLjc2NTIwNSAwLjA2MTUwOAordiAtMC4wNjM2NjEgLTIuNzY1MjA2IDAuMDYxODU5Cit2IC0wLjA2Mzk0NSAtMi43NjYxODAgMC4wNjIxOTkKK3YgLTAuMDY0Mjk0IC0yLjc2NTIwNiAwLjA2MTg1OQordiAtMC4wNjQ0MjggLTIuNzY1MjA2IDAuMDYyMTQ5Cit2IC0wLjA2NDU2MyAtMi43NjUyMDYgMC4wNjIzODUKK3YgLTAuMDY0NTYzIC0yLjc2NTIwNiAwLjA2MjgxNAordiAtMC4wNjQ1NjMgLTIuNzY1MjA2IDAuMDYzMDM4Cit2IC0wLjA2NDU1NyAtMi43NjUyMDQgMC4wNjQ2NzkKK3YgLTAuMDY0NDkwIC0yLjc2NTkxMiAwLjA2NDkzNQordiAtMC4wNjQ4NzAgLTIuNzY1OTEyIDAuMDY0OTQ1Cit2IC0wLjA2NDgzMCAtMi43NjUyMDQgMC4wNjQ2NzkKK3YgLTAuMDY0ODI1IC0yLjc2NTIwNiAwLjA2MzAzOAordiAtMC4wNjQ4MjUgLTIuNzY1MjA2IDAuMDYyODE0Cit2IC0wLjA2NDgyNSAtMi43NjUyMDYgMC4wNjIzODUKK3YgLTAuMDY0OTU5IC0yLjc2NTIwNiAwLjA2MjE0OQordiAtMC4wNjU0NDYgLTIuNzY2MTgwIDAuMDYyMTk5Cit2IC0wLjA2NTA5NCAtMi43NjUyMDYgMC4wNjE4NTkKK3YgLTAuMDY1NzMwIC0yLjc2NTIwNiAwLjA2MTg1OQordiAtMC4wNjU5MzQgLTIuNzY1MjA2IDAuMDYxODU5Cit2IC0wLjA2NzQ3NiAtMi43NjUyMDUgMC4wNjE4NjAKK3YgLTAuMDY3NDc2IC0yLjc2NTIwNSAwLjA2MTUwOAordiAtMC4wNjU5MzQgLTIuNzY1MjA2IDAuMDYxNTA5Cit2IC0wLjA2NTczMCAtMi43NjUyMDYgMC4wNjE1MDkKK3YgLTAuMDY1NDQ2IC0yLjc2NjE4MCAwLjA2MTE2NwordiAtMC4wNjUwOTQgLTIuNzY1MjA2IDAuMDYxNTA5Cit2IC0wLjA2NDk1OSAtMi43NjUyMDYgMC4wNjEyMTgKK3YgLTAuMDY0ODI1IC0yLjc2NTIwNiAwLjA2MDk4MQordiAtMC4wNjQ4MjUgLTIuNzY1MjA2IDAuMDYwNTUyCit2IC0wLjA2NDgyNSAtMi43NjUyMDYgMC4wNjAzMjkKK3YgLTAuMDY0ODMwIC0yLjc2NTIwNSAwLjA1ODY4OAordiAtMC4wNjQ5MDggLTIuNzY1OTEyIDAuMDU4NDM1Cit2IC0wLjA2NDQ4MCAtMi43NjU5MTIgMC4wNTg0MzUKK3YgLTAuMDY0NTU3IC0yLjc2NTIwNSAwLjA1ODY4OAordiAtMC4wNjQ1NjMgLTIuNzY1MjA2IDAuMDYwMzI5Cit2IC0wLjA2NDU2MyAtMi43NjUyMDYgMC4wNjA1NTIKK3YgLTAuMDY0NTYzIC0yLjc2NTIwNiAwLjA2MDk4MQordiAtMC4wNjQ0MjggLTIuNzY1MjA2IDAuMDYxMjE4Cit2IC0wLjA2Mzk0NSAtMi43NjYxODAgMC4wNjExNjcKK3YgLTAuMDY0Mjk0IC0yLjc2NTIwNiAwLjA2MTUwOQordiAtMC4wNjM2NjEgLTIuNzY1MjA2IDAuMDYxNTA5Cit2IDAuMDMwMzA4IC0yLjgwNDUwOCAwLjAxOTg2MQordiAwLjAzMDc5MCAtMi44MDUwNzAgMC4wMTk4NjEKK3YgMC4wMzQwNzEgLTIuODExNTA0IDAuMDE5ODYxCit2IDAuMDQxNDI4IC0yLjgxMTMxNiAwLjAxOTg2MQordiAwLjAzMDMwOCAtMi42NjA5MDIgMC4wMTk4NjEKK3YgLTAuMTQ3NjE5IC0yLjgxMjE1NyAwLjA3OTM3MgordiAtMC4xNDc2MTkgLTIuODEzMTk0IDAuMDc2MDEyCit2IC0wLjE0NzYxOSAtMi44MDUwNDYgMC4wNjg4OTgKK3YgLTAuMTQ3NjE5IC0yLjc5NTE0OSAwLjA2ODY1NQordiAtMC4xNDc2MTkgLTIuNjYwOTA2IDAuMDY4NjU0Cit2IC0wLjE0NzYxOSAtMi44MDkzMDQgMC4wNzkzNzIKK3YgMC4wMTU4OTkgLTIuODEyMTU3IDAuMDcwNjExCit2IDAuMDEzNjc1IC0yLjgxMzE5NCAwLjA2ODMxMwordiAtMC4wMTQ4OTEgLTIuODEzMTk0IDAuMDc1OTkzCit2IC0wLjAxMzMxMCAtMi44MTIxNTcgMC4wNzkzNTMKK3YgLTAuMDMzODU0IC0yLjgxMzE5NCAwLjA3NjAxMgordiAtMC4wMzM4NDIgLTIuODEyMTU3IDAuMDc5MzcyCit2IDAuMDI1NDg2IC0yLjgwNDUwNiAwLjA0NTg3OAordiAwLjAyNTQ4NiAtMi43OTUxNzIgMC4wNDU4NzgKK3YgLTAuMDE4NDcwIC0yLjgwNDQ4MiAwLjA2ODY0NgordiAwLjAwODM0OSAtMi44MDQ0OTAgMC4wNjI2MjIKK3YgMC4wMDgzNDkgLTIuNzk1MTU3IDAuMDYyNjIyCit2IC0wLjAxODQ3MCAtMi43OTUxNDkgMC4wNjg2NDYKK3YgLTAuMDMzODkyIC0yLjgwNDQ4MiAwLjA2ODY1NAordiAtMC4wMzM4OTIgLTIuNzk1MTQ5IDAuMDY4NjU1Cit2IDAuMDMyMzI4IC0yLjgxMzE5NSAwLjA0OTM0MwordiAwLjAyOTMxNyAtMi44MTIwNjYgMC4wNDc4NDEKK3YgMC4wMTEyNjggLTIuODEyMDY1IDAuMDY1NjQ3Cit2IC0wLjAxNjUyNSAtMi44MTIwNjUgMC4wNzIyMTIKK3YgLTAuMDMzODcyIC0yLjgxMjA2NSAwLjA3MjIwNgordiAwLjAzNDgzOCAtMi44MTIxNTcgMC4wNTA1OTEKK3YgLTAuMDE2NzcwIC0yLjgxMTUwMSAwLjA3MTQ1NAordiAwLjAxMDkxNCAtMi44MTE1MDIgMC4wNjUyMjQKK3YgMC4wMDg3MDMgLTIuODA1MDUzIDAuMDYzMDQ1Cit2IC0wLjAxODI4NSAtMi44MDUwNDYgMC4wNjg4OTAKK3YgLTAuMDMzODc0IC0yLjgxMTUwMSAwLjA3MTQ0OQordiAtMC4wMzM4OTAgLTIuODA1MDQ2IDAuMDY4ODk4Cit2IDAuMDI4ODkzIC0yLjgxMTUwNCAwLjA0NzU5NwordiAwLjAyNTkxMCAtMi44MDUwNjggMC4wNDYxMjMKK3YgMC4wMDgzNDkgLTIuNjYwOTA2IDAuMDYyNjIyCit2IDAuMDI1NDg2IC0yLjY2MDkwMyAwLjA0NTg3OAordiAtMC4wMTMzMTAgLTIuODExMzE2IDAuMDc5MzUzCit2IDAuMDE1ODk5IC0yLjgxMTMxNiAwLjA3MDYxMQordiAtMC4wMzM4NDIgLTIuODExMzE2IDAuMDc5MzcyCit2IDAuMDM0ODM4IC0yLjgxMTMxNiAwLjA1MDU5MQordiAtMC4wMTg0NzAgLTIuNjYwOTA2IDAuMDY4NjQ2Cit2IC0wLjAzMzg5MiAtMi42NjA5MDYgMC4wNjg2NTQKK3YgLTAuMDEzMzEwIC0yLjgwOTMwNCAwLjA3OTM1MwordiAwLjAxNTg5OSAtMi44MDkzMDQgMC4wNzA2MTEKK3YgLTAuMDMzODQyIC0yLjgwOTMwNCAwLjA3OTM3MgordiAwLjAzNDgzOCAtMi44MDkzMDQgMC4wNTA1OTEKK3YgLTAuMzExMDE5IC0yLjgxMjE1NyAwLjA3MDc3MgordiAtMC4yODE0MzIgLTIuODEyMTU3IDAuMDc5MzgzCit2IC0wLjI3OTg1MSAtMi44MTMxOTQgMC4wNzYwMTgKK3YgLTAuMzA4Nzk0IC0yLjgxMzE5NCAwLjA2ODQ3NAordiAtMC4yNjEzOTYgLTIuODEyMTU3IDAuMDc5MzcyCit2IC0wLjI2MTM4MyAtMi44MTMxOTQgMC4wNzYwMTIKK3YgLTAuMzIwNzIzIC0yLjgwNDUwNiAwLjA0NTk1NgordiAtMC4zMjA3MjMgLTIuNzk1MTcyIDAuMDQ1OTU2Cit2IC0wLjI3NjA4NSAtMi44MDQ0ODIgMC4wNjg2NDYKK3YgLTAuMjc2MDg1IC0yLjc5NTE0OSAwLjA2ODY0NgordiAtMC4zMDM0NjggLTIuNzk1MTU3IDAuMDYyNzgzCit2IC0wLjMwMzQ2OCAtMi44MDQ0ODkgMC4wNjI3ODMKK3YgLTAuMjYxMzQ1IC0yLjgwNDQ4MiAwLjA2ODY1NAordiAtMC4yNjEzNDUgLTIuNzk1MTQ5IDAuMDY4NjU0Cit2IC0wLjMyNzU2NSAtMi44MTMxOTUgMC4wNDk0MjEKK3YgLTAuMzI0NTU0IC0yLjgxMjA2NiAwLjA0NzkxOQordiAtMC4zMjk3NDkgLTIuODEyMDY2IDAuMDE5ODMzCit2IC0wLjMzMzgzOCAtMi44MTMxOTUgMC4wMTk4MzMKK3YgLTAuMjc4MjE3IC0yLjgxMjA2NSAwLjA3MjIxMQordiAtMC4zMDYzODggLTIuODEyMDY1IDAuMDY1ODA4Cit2IC0wLjI2MTM2NiAtMi44MTIwNjUgMC4wNzIyMDYKK3YgLTAuMzMwMTI0IC0yLjgxMjE1NyAwLjA1MDUzNwordiAtMC4yNzc4NDUgLTIuODExNTAxIDAuMDcxNDUzCit2IC0wLjI3NjI3MSAtMi44MDUwNDYgMC4wNjg4OTAKK3YgLTAuMzAzODIyIC0yLjgwNTA1MyAwLjA2MzIwNgordiAtMC4zMDYwMzQgLTIuODExNTAyIDAuMDY1Mzg0Cit2IC0wLjI2MTM2NCAtMi44MTE1MDEgMC4wNzE0NDkKK3YgLTAuMjYxMzQ3IC0yLjgwNTA0NiAwLjA2ODg5OAordiAtMC4zMjExNDcgLTIuODA1MDY4IDAuMDQ2MjAxCit2IC0wLjMyNDEzMCAtMi44MTE1MDQgMC4wNDc2NzQKK3YgLTAuMzAzNDY4IC0yLjY2MDkwNiAwLjA2Mjc4MwordiAtMC4zMjA3MjMgLTIuNjYwOTAzIDAuMDQ1OTU2Cit2IC0wLjE0NzYxOSAtMi44MTIwNjUgMC4wNzIyMDYKK3YgLTAuMTQ3NjE5IC0yLjgxMTUwMSAwLjA3MTQ0OQordiAtMC4xNDc2MTkgLTIuODA0NDgyIDAuMDY4NjU1Cit2IC0wLjMyOTI2NyAtMi44MTE1MDQgMC4wMTk4MzMKK3YgLTAuMzExMDE5IC0yLjgxMTMxNiAwLjA3MDc3MgordiAtMC4yODE0MzIgLTIuODExMzE2IDAuMDc5MzgzCit2IC0wLjI2MTM5NiAtMi44MTEzMTYgMC4wNzkzNzIKK3YgLTAuMzMwMTI0IC0yLjgxMTMxNiAwLjA1MDUzNwordiAtMC4zMzY2MjMgLTIuODExMzE2IDAuMDE5ODMzCit2IC0wLjE0NzYxOSAtMi44MTEzMTYgMC4wNzkzNzIKK3YgLTAuMzI1NTAzIC0yLjY2MDkwMiAwLjAxOTgzMwordiAtMC4yNzYwODUgLTIuNjYwOTA2IDAuMDY4NjQ1Cit2IC0wLjI2MTM0NSAtMi42NjA5MDYgMC4wNjg2NTQKK3YgLTAuMzExMDE5IC0yLjgwOTMwNCAwLjA3MDc3MgordiAtMC4yODE0MzIgLTIuODA5MzA0IDAuMDc5MzgzCit2IC0wLjI2MTM5NiAtMi44MDkzMDQgMC4wNzkzNzIKK3YgLTAuMzMwMTI0IC0yLjgwOTMwNCAwLjA1MDUzNwordiAwLjAyMTI5MCAtMi44MTIxNTcgLTAuMDM0MzM1Cit2IC0wLjAwNjkyMSAtMi44MTIxNTcgLTAuMDQ2MDAzCit2IC0wLjAwODQ0NSAtMi44MTMxOTQgLTAuMDQyNjE4Cit2IDAuMDE5MDY1IC0yLjgxMzE5NCAtMC4wMzIwMzgKK3YgLTAuMDMzODQyIC0yLjgxMjE1NyAtMC4wNDU5OTgKK3YgLTAuMDMzODU0IC0yLjgxMzE5NCAtMC4wNDI2MzgKK3YgMC4wMjY2MzUgLTIuODA0NTA2IC0wLjAwNzk1MgordiAwLjAyNjYzNSAtMi43OTUxNzIgLTAuMDA3OTUyCit2IDAuMDMwMzA4IC0yLjc5NTE3NCAwLjAxOTg2MQordiAtMC4wMTIwMjMgLTIuODA0NDgyIC0wLjAzNTI3MQordiAtMC4wMTIwMjMgLTIuNzk1MTQ5IC0wLjAzNTI3MQordiAwLjAxMzczOSAtMi43OTUxNTcgLTAuMDI2MzQ3Cit2IDAuMDEzNzM5IC0yLjgwNDQ5MCAtMC4wMjYzNDcKK3YgLTAuMDMzODkyIC0yLjgwNDQ4MiAtMC4wMzUyODAKK3YgLTAuMDMzODkyIC0yLjc5NTE0OSAtMC4wMzUyODAKK3YgMC4wMzM0NzYgLTIuODEzMTk1IC0wLjAxMTQxNwordiAwLjAzMDQ2NSAtMi44MTIwNjYgLTAuMDA5OTE1Cit2IDAuMDM0NTUzIC0yLjgxMjA2NiAwLjAxOTg2MQordiAwLjAzODY0MiAtMi44MTMxOTUgMC4wMTk4NjEKK3YgLTAuMDEwMDc5IC0yLjgxMjA2NSAtMC4wMzg4MzcKK3YgMC4wMTY2NTkgLTIuODEyMDY1IC0wLjAyOTM3MgordiAtMC4wMzM4NzIgLTIuODEyMDY1IC0wLjAzODgzMQordiAwLjAzNjEzNCAtMi44MTIxNTcgLTAuMDEyNTAyCit2IC0wLjAxMDI2NCAtMi44MTE1MDEgLTAuMDM4MDc5Cit2IC0wLjAxMTgzOCAtMi44MDUwNDYgLTAuMDM1NTE2Cit2IDAuMDE0MDkzIC0yLjgwNTA1MyAtMC4wMjY3NzAKK3YgMC4wMTYzMDUgLTIuODExNTAyIC0wLjAyODk0OAordiAtMC4wMzM4NzQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4wMzM4OTAgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAwLjAyNzA1OSAtMi44MDUwNjggLTAuMDA4MTk3Cit2IDAuMDMwMDQxIC0yLjgxMTUwNCAtMC4wMDk2NzAKK3YgMC4wMTM3MzkgLTIuNjYwOTA2IC0wLjAyNjM0NwordiAwLjAyNjYzNSAtMi42NjA5MDMgLTAuMDA3OTUyCit2IC0wLjE0NzYxOSAtMi44MTIxNTcgLTAuMDQ1OTk4Cit2IC0wLjE0NzYxOSAtMi44MTMxOTQgLTAuMDQyNjM4Cit2IC0wLjE0NzYxOSAtMi44MTIwNjUgLTAuMDM4ODMxCit2IC0wLjE0NzYxOSAtMi44MTE1MDEgLTAuMDM4MDc1Cit2IC0wLjE0NzYxOSAtMi44MDUwNDYgLTAuMDM1NTIzCit2IC0wLjE0NzYxOSAtMi44MDQ0ODIgLTAuMDM1MjgwCit2IC0wLjE0NzYxOSAtMi43OTUxNDkgLTAuMDM1MjgwCit2IDAuMDIxMjkwIC0yLjgxMTMxNiAtMC4wMzQzMzUKK3YgLTAuMDA2OTIxIC0yLjgxMTMxNiAtMC4wNDYwMDMKK3YgLTAuMDMzODQyIC0yLjgxMTMxNiAtMC4wNDU5OTgKK3YgMC4wMzYxMzQgLTIuODExMzE2IC0wLjAxMjUwMgordiAwLjA0MTQyOCAtMi44MTIxNTcgMC4wMTk4NjEKK3YgLTAuMTQ3NjE5IC0yLjgxMTMxNiAtMC4wNDU5OTgKK3YgLTAuMDEyMDIzIC0yLjY2MDkwNiAtMC4wMzUyNzEKK3YgLTAuMDMzODkyIC0yLjY2MDkwNiAtMC4wMzUyODAKK3YgLTAuMTQ3NjE5IC0yLjY2MDkwNiAtMC4wMzUyODAKK3YgMC4wMjEyOTAgLTIuODA5MzA0IC0wLjAzNDMzNQordiAtMC4wMDY5MjEgLTIuODA5MzA0IC0wLjA0NjAwMwordiAtMC4wMzM4NDIgLTIuODA5MzA0IC0wLjA0NTk5OAordiAwLjAzNjEzNCAtMi44MDkzMDQgLTAuMDEyNTAyCit2IC0wLjE0NzYxOSAtMi44MDkzMDQgLTAuMDQ1OTk4Cit2IDAuMDQxNDI4IC0yLjgwOTMwNCAwLjAxOTg2MQordiAtMC4zMTY2NTYgLTIuODEyMTU3IC0wLjAzNDM0OAordiAtMC4zMTQ0MzIgLTIuODEzMTk0IC0wLjAzMjA1MAordiAtMC4yODY3OTIgLTIuODEzMTk0IC0wLjA0MjYxOAordiAtMC4yODgzNzMgLTIuODEyMTU3IC0wLjA0NjAwMwordiAtMC4yNjEzNjQgLTIuODEzMTk0IC0wLjA0MjYzOAordiAtMC4yNjEzNTcgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4zMjE4OTQgLTIuODA0NTA2IC0wLjAwNzY0MAordiAtMC4zMjU1MDMgLTIuODA0NTA4IDAuMDE5ODMzCit2IC0wLjMyNTUwMyAtMi43OTUxNzQgMC4wMTk4MzMKK3YgLTAuMzIxODk0IC0yLjc5NTE3MiAtMC4wMDc2NDAKK3YgLTAuMjgzMDU2IC0yLjgwNDQ4MiAtMC4wMzUyNzEKK3YgLTAuMzA5MTA2IC0yLjgwNDQ5MCAtMC4wMjYzNTkKK3YgLTAuMzA5MTA2IC0yLjc5NTE1NyAtMC4wMjYzNTkKK3YgLTAuMjgzMDU2IC0yLjc5NTE0OSAtMC4wMzUyNzEKK3YgLTAuMjYxMzQ1IC0yLjgwNDQ4MiAtMC4wMzUyODAKK3YgLTAuMjYxMzQ1IC0yLjc5NTE0OSAtMC4wMzUyODAKK3YgLTAuMzI4NzM2IC0yLjgxMzE5NSAtMC4wMTExMDUKK3YgLTAuMzI1NzI1IC0yLjgxMjA2NiAtMC4wMDk2MDMKK3YgLTAuMzEyMDI1IC0yLjgxMjA2NSAtMC4wMjkzODQKK3YgLTAuMjg1MTU4IC0yLjgxMjA2NSAtMC4wMzg4MzcKK3YgLTAuMjYxMzY2IC0yLjgxMjA2NSAtMC4wMzg4MzEKK3YgLTAuMzMxMjk1IC0yLjgxMjE1NyAtMC4wMTI0OTMKK3YgLTAuMjg0ODE2IC0yLjgxMTUwMSAtMC4wMzgwNzkKK3YgLTAuMzExNjcxIC0yLjgxMTUwMiAtMC4wMjg5NjEKK3YgLTAuMzA5NDYwIC0yLjgwNTA1MyAtMC4wMjY3ODMKK3YgLTAuMjgzMjQxIC0yLjgwNTA0NiAtMC4wMzU1MTYKK3YgLTAuMjYxMzY0IC0yLjgxMTUwMSAtMC4wMzgwNzUKK3YgLTAuMjYxMzQ3IC0yLjgwNTA0NiAtMC4wMzU1MjMKK3YgLTAuMzI1MzAxIC0yLjgxMTUwNCAtMC4wMDkzNTgKK3YgLTAuMzIyMzE4IC0yLjgwNTA2OCAtMC4wMDc4ODUKK3YgLTAuMzA5MTA2IC0yLjY2MDkwNiAtMC4wMjYzNTkKK3YgLTAuMzIxODk0IC0yLjY2MDkwMyAtMC4wMDc2NDAKK3YgLTAuMzI1OTg2IC0yLjgwNTA3MCAwLjAxOTgzMwordiAtMC4yODgzNzMgLTIuODExMzE1IC0wLjA0NjAwMwordiAtMC4zMTY2NTYgLTIuODExMzE2IC0wLjAzNDM0OAordiAtMC4yNjEzNTcgLTIuODExMzE1IC0wLjA0NTk5OAordiAtMC4zMzEyOTUgLTIuODExMzE2IC0wLjAxMjQ5MwordiAtMC4zMzY2MjMgLTIuODEyMTU3IDAuMDE5ODMzCit2IC0wLjI4MzA1NiAtMi42NjA5MDYgLTAuMDM1MjcxCit2IC0wLjI2MTM0NSAtMi42NjA5MDYgLTAuMDM1MjgwCit2IC0wLjI4ODM3MyAtMi44MDkzMDQgLTAuMDQ2MDAzCit2IC0wLjMxNjY1NiAtMi44MDkzMDQgLTAuMDM0MzQ4Cit2IC0wLjI2MTM1NyAtMi44MDkzMDQgLTAuMDQ1OTk4Cit2IC0wLjMzMTI5NSAtMi44MDkzMDQgLTAuMDEyNDkzCit2IC0wLjMzNjYyMyAtMi44MDkzMDQgMC4wMTk4MzMKK3YgLTAuMjI4NTYwIC0yLjcwMTQ4OCAwLjA1MjEyOQordiAtMC4yMjg1NjAgLTIuNzY0ODM1IDAuMDUyMTQxCit2IC0wLjIyODU2MCAtMi43MDE0ODggMC4wNTIxMjkKK3YgLTAuMjI4NTYwIC0yLjc2NTU1OCAwLjA1Mjg5MwordiAtMC4yMjg1NjAgLTIuNzY1NTU4IDAuMDUyODkzCit2IC0wLjIyODU2MCAtMi43NjU1NTggMC4wNTQzMzMKK3YgLTAuMjI4NTYwIC0yLjc2NTU1OCAwLjA1NDMzMwordiAtMC4wNjQ3MzggLTIuNzAxNDg4IDAuMDUyMTI5Cit2IC0wLjA2NDczOCAtMi43NjQ4MzUgMC4wNTIxNDEKK3YgLTAuMDY0NzM4IC0yLjcwMTQ4OCAwLjA1MjEyOQordiAtMC4wNjQ3MzggLTIuNzY1NTU4IDAuMDUyODkzCit2IC0wLjA2NDczOCAtMi43NjU1NTggMC4wNTI4OTMKK3YgLTAuMDY0NzM4IC0yLjc2NTU1OCAwLjA1NDMzMwordiAtMC4wNjQ3MzggLTIuNzY1NTU4IDAuMDU0MzMzCit2IC0wLjAzMzg0MiAtMi44MTIxNTcgMC4wNzkzNzIKK3YgLTAuMDMzODQyIC0yLjgxMjE1NyAwLjA3OTM3MgordiAtMC4wMzM4OTAgLTIuODA1MDQ2IDAuMDY4ODk4Cit2IC0wLjAzMzg5MCAtMi44MDUwNDYgMC4wNjg4OTgKK3YgLTAuMDMzODc0IC0yLjgxMTUwMSAwLjA3MTQ0OQordiAtMC4wMzM4OTIgLTIuNzk1MTQ5IDAuMDY4NjU1Cit2IC0wLjAzMzg5MiAtMi44MDQ0ODIgMC4wNjg2NTQKK3YgLTAuMDMzODkyIC0yLjgwNDQ4MiAwLjA2ODY1NAordiAtMC4wMzM4NDIgLTIuODExMzE2IDAuMDc5MzcyCit2IC0wLjAzMzg0MiAtMi44MTIxNTcgMC4wNzkzNzIKK3YgLTAuMDMzODQyIC0yLjgxMTMxNiAwLjA3OTM3MgordiAtMC4wMzM4OTIgLTIuNjYwOTA2IDAuMDY4NjU0Cit2IC0wLjAzMzg5MiAtMi43OTUxNDkgMC4wNjg2NTUKK3YgLTAuMDMzODkyIC0yLjc5NTE0OSAwLjA2ODY1NQordiAtMC4wMzM4OTIgLTIuODA0NDgyIDAuMDY4NjU0Cit2IC0wLjAzMzg5MCAtMi44MDUwNDYgMC4wNjg4OTgKK3YgLTAuMDMzODkyIC0yLjgwNDQ4MiAwLjA2ODY1NAordiAtMC4wMzM4NzQgLTIuODExNTAxIDAuMDcxNDQ5Cit2IC0wLjAzMzg3NCAtMi44MTE1MDEgMC4wNzE0NDkKK3YgLTAuMDMzODQyIC0yLjgwOTMwNCAwLjA3OTM3MgordiAtMC4wMzM4NDIgLTIuODExMzE2IDAuMDc5MzcyCit2IC0wLjAzMzg0MiAtMi44MDkzMDQgMC4wNzkzNzIKK3YgLTAuMjYxMzk2IC0yLjgxMjE1NyAwLjA3OTM3MgordiAtMC4yNjEzOTYgLTIuODEyMTU3IDAuMDc5MzcyCit2IC0wLjI2MTM2NCAtMi44MTE1MDEgMC4wNzE0NDkKK3YgLTAuMjYxMzQ3IC0yLjgwNTA0NiAwLjA2ODg5OAordiAtMC4yNjEzNDcgLTIuODA1MDQ2IDAuMDY4ODk4Cit2IC0wLjI2MTM0NSAtMi44MDQ0ODIgMC4wNjg2NTQKK3YgLTAuMjYxMzQ1IC0yLjgwNDQ4MiAwLjA2ODY1NAordiAtMC4yNjEzNDUgLTIuNzk1MTQ5IDAuMDY4NjU0Cit2IC0wLjI2MTM5NiAtMi44MTEzMTYgMC4wNzkzNzIKK3YgLTAuMjYxMzk2IC0yLjgxMjE1NyAwLjA3OTM3MgordiAtMC4yNjEzOTYgLTIuODExMzE2IDAuMDc5MzcyCit2IC0wLjI2MTM0NSAtMi43OTUxNDkgMC4wNjg2NTQKK3YgLTAuMjYxMzQ1IC0yLjc5NTE0OSAwLjA2ODY1NAordiAtMC4yNjEzNDUgLTIuNjYwOTA2IDAuMDY4NjU0Cit2IC0wLjI2MTM0NSAtMi44MDQ0ODIgMC4wNjg2NTQKK3YgLTAuMjYxMzQ3IC0yLjgwNTA0NiAwLjA2ODg5OAordiAtMC4yNjEzNDUgLTIuODA0NDgyIDAuMDY4NjU0Cit2IC0wLjI2MTM2NCAtMi44MTE1MDEgMC4wNzE0NDkKK3YgLTAuMjYxMzY0IC0yLjgxMTUwMSAwLjA3MTQ0OQordiAtMC4yNjEzOTYgLTIuODA5MzA0IDAuMDc5MzcyCit2IC0wLjI2MTM5NiAtMi44MTEzMTYgMC4wNzkzNzIKK3YgLTAuMjYxMzk2IC0yLjgwOTMwNCAwLjA3OTM3MgordiAtMC4wMzM4NDIgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4wMzM4NDIgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4wMzM4NzQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4wMzM4OTAgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4wMzM4OTAgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4wMzM4OTIgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4wMzM4OTIgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4wMzM4OTIgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4wMzM4NDIgLTIuODExMzE2IC0wLjA0NTk5OAordiAtMC4wMzM4NDIgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4wMzM4NDIgLTIuODExMzE2IC0wLjA0NTk5OAordiAtMC4wMzM4OTIgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4wMzM4OTIgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4wMzM4OTIgLTIuNjYwOTA2IC0wLjAzNTI4MAordiAtMC4wMzM4OTIgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4wMzM4OTAgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4wMzM4OTIgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4wMzM4NzQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4wMzM4NzQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4wMzM4NDIgLTIuODA5MzA0IC0wLjA0NTk5OAordiAtMC4wMzM4NDIgLTIuODExMzE2IC0wLjA0NTk5OAordiAtMC4wMzM4NDIgLTIuODA5MzA0IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4yNjEzNDcgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4yNjEzNDcgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4yNjEzNjQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4yNjEzNDUgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4yNjEzNDUgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4yNjEzNDUgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4yNjEzNTcgLTIuODExMzE1IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODEyMTU3IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODExMzE1IC0wLjA0NTk5OAordiAtMC4yNjEzNDUgLTIuNjYwOTA2IC0wLjAzNTI4MAordiAtMC4yNjEzNDUgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4yNjEzNDUgLTIuNzk1MTQ5IC0wLjAzNTI4MAordiAtMC4yNjEzNDUgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4yNjEzNDcgLTIuODA1MDQ2IC0wLjAzNTUyMwordiAtMC4yNjEzNDUgLTIuODA0NDgyIC0wLjAzNTI4MAordiAtMC4yNjEzNjQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4yNjEzNjQgLTIuODExNTAxIC0wLjAzODA3NQordiAtMC4yNjEzNTcgLTIuODA5MzA0IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODExMzE1IC0wLjA0NTk5OAordiAtMC4yNjEzNTcgLTIuODA5MzA0IC0wLjA0NTk5OAordnQgMC4zNTcyNjcgMC43MzY0NTgKK3Z0IDAuMzU4Njg4IDAuNzM4ODQ5Cit2dCAwLjM1ODQ1MSAwLjczOTEzNwordnQgMC4zNTY5MDUgMC43MzY1NjEKK3Z0IDAuMzYxMjYxIDAuNzQwMjc1Cit2dCAwLjM2MTE2MSAwLjc0MDY3OAordnQgMC4zNjQxNjYgMC43NDAyNjIKK3Z0IDAuMzY2NjY0IDAuNzM4ODExCit2dCAwLjM2Njk0MyAwLjczOTA2MQordnQgMC4zNjQyODAgMC43NDA2MjIKK3Z0IDAuMzY4MDAxIDAuNzM2MzI1Cit2dCAwLjM2ODQwOCAwLjczNjQyMAordnQgMC4zNjgwNTUgMC43MzMwODAKK3Z0IDAuMzY2NjcyIDAuNzMwNTc0Cit2dCAwLjM2Njk2MSAwLjczMDI5NgordnQgMC4zNjg0MjMgMC43MzI5ODgKK3Z0IDAuMzY0MDY4IDAuNzI5MTgyCit2dCAwLjM2NDE2NyAwLjcyODc3OQordnQgMC4zNjEwNjEgMC43MjkyMTUKK3Z0IDAuMzU4NzIxIDAuNzMwNzUzCit2dCAwLjM1ODQ0NSAwLjczMDQ5NgordnQgMC4zNjA5NzQgMC43Mjg4MDgKK3Z0IDAuMzU3MjcyIDAuNzMzNjUwCit2dCAwLjM1Njg2NCAwLjczMzU0OAordnQgMC4zMzMwNDcgMC43MzM0OTMKK3Z0IDAuMzMxMTIyIDAuNzMzNTY0Cit2dCAwLjMzMDk2NCAwLjczMzMyOAordnQgMC4zNTc0MzkgMC43MzY0MDYKK3Z0IDAuMzU2NzM4IDAuNzM2NjA5Cit2dCAwLjM1NjY4MyAwLjczMzUwMgordnQgMC4xODg4NDUgMC43Njc1ODEKK3Z0IDAuMTkxNjA1IDAuNzY3NTg2Cit2dCAwLjE5MTYwNSAwLjc2NzgyMQordnQgMC4xODg3NjQgMC43Njc4MTUKK3Z0IDAuMzY0MTEzIDAuNzQwMDg5Cit2dCAwLjM2NjUzMyAwLjczODY4OAordnQgMC4zNjQzMzEgMC43NDA3ODcKK3Z0IDAuMzYxMTE2IDAuNzQwODU3Cit2dCAwLjcxODQ3OCAwLjc2NTAwMQordnQgMC43MjExMTkgMC43NjUwMjEKK3Z0IDAuNzIxMTE1IDAuNzY1MjU3Cit2dCAwLjcxODM4OSAwLjc2NTIzNgordnQgMC43MjQxOTkgMC43NjUwMjEKK3Z0IDAuNzI2MjU0IDAuNzYzOTU5Cit2dCAwLjcyNjQwNyAwLjc2NDE5NAordnQgMC43MjQyODcgMC43NjUyNTcKK3Z0IDAuMzY4NTg5IDAuNzMyOTM3Cit2dCAwLjM2ODU4OSAwLjczNjQ2NAordnQgMC4yODExNTkgMC43OTQ0NzQKK3Z0IDAuMjgxMTU5IDAuNzk0NzA3Cit2dCAwLjI3ODI5NyAwLjc5NTU2MQordnQgMC4yNzgzODYgMC43OTUzMjcKK3Z0IDAuMzQwNzI1IDAuNzM0NjAzCit2dCAwLjMzODc1NSAwLjczMzQ5NAordnQgMC4zMzg4NDUgMC43MzMyNTUKK3Z0IDAuMzQwODgxIDAuNzM0MzY3Cit2dCAwLjg3Nzc4NSAwLjE1Mzk3NAordnQgMC44NzY4MjggMC4xNTA3OTkKK3Z0IDAuODc3MDYwIDAuMTUwNzk5Cit2dCAwLjg3Nzk2MyAwLjE1Mzg5MgordnQgMC4zMzU2ODggMC43MzM0NjgKK3Z0IDAuMzM1NjkwIDAuNzMzMjI4Cit2dCAwLjMzNTY4OSAwLjczNzAwNAordnQgMC4zMzMwNDggMC43MzcwMjkKK3Z0IDAuMTkxNjA1IDAuNzY0MDQ4Cit2dCAwLjE5NDMyOSAwLjc2NDA0MwordnQgMC4xOTQzMjkgMC43Njc1ODIKK3Z0IDAuNzIxMTMxIDAuNzYxNDgzCit2dCAwLjcyNDIxMSAwLjc2MTQ4MwordnQgMC4yODExNTkgMC43OTI4MzEKK3Z0IDAuMjgzOTgzIDAuNzkyODI5Cit2dCAwLjI4Mzk4MyAwLjc5NTMyNwordnQgMC4zMzU2ODYgMC43Mzc1NzQKK3Z0IDAuMzMzMjEyIDAuNzM3NTk1Cit2dCAwLjMzMzA3OSAwLjczNzEwNQordnQgMC4zMzU2ODkgMC43MzcwODEKK3Z0IDAuMTkxNjA0IDAuNzYzNDkwCit2dCAwLjE5NDE1MyAwLjc2MzQ4NgordnQgMC43MjExMzIgMC43NjA5MjEKK3Z0IDAuNzI0MDY2IDAuNzYwOTIyCit2dCAwLjcyNDE4MCAwLjc2MTQwOAordnQgMC43MjExMzIgMC43NjE0MDgKK3Z0IDAuMjgxMTU4IDAuNzkyMjc1Cit2dCAwLjI4MzgyMyAwLjc5MjI3MwordnQgMC4zMzI5NTggMC43MzMyNTQKK3Z0IDAuMzU4MzM3IDAuNzM5MjY2Cit2dCAwLjMzMTEyMyAwLjczNzEwMAordnQgMC4zMzE0MjEgMC43Mzc2NjEKK3Z0IDAuMzMxMTc4IDAuNzM3MTc1Cit2dCAwLjk0OTE4OSAwLjE2NzU3OAordnQgMC45NDkxOTEgMC4xNjQ5MzEKK3Z0IDAuOTQ5MjUwIDAuMTY0OTExCit2dCAwLjk0OTI1MCAwLjE2NzU5MwordnQgMC4xODg4NDUgMC43NjQwNDMKK3Z0IDAuMTg4ODczIDAuNzYzOTY4Cit2dCAwLjE4ODk4NyAwLjc2MzQ4NQordnQgMC4xOTQ0MjEgMC43Njc4MTYKK3Z0IDAuMzY3MDcwIDAuNzM5MTc4Cit2dCAwLjE5NjMzOCAwLjc2NDAyOQordnQgMC4xOTYzMzggMC43Njc1NjgKK3Z0IDAuMTk2MDQ0IDAuNzYzNDczCit2dCAwLjk0NTk1NiAwLjc1Nzc2MQordnQgMC45NDU5NTcgMC43NTQ5OTgKK3Z0IDAuNzE4NDkwIDAuNzYxNDYzCit2dCAwLjcxODUyMSAwLjc2MTM4OAordnQgMC43MTg2NTEgMC43NjA5MDMKK3Z0IDAuMzY3MDc4IDAuNzMwMTY5Cit2dCAwLjcyNjI2MyAwLjc2MTQ2MQordnQgMC43MjU5MzMgMC43NjA5MDEKK3Z0IDAuNzI2MjA5IDAuNzYxMzg2Cit2dCAwLjk0Njg4NCAwLjgzOTUwNAordnQgMC45NDY4ODYgMC44MzY3NzIKK3Z0IDAuODc3OTYzIDAuMTQ3NzI0Cit2dCAwLjg3Nzc4NiAwLjE0NzY0MQordnQgMC4yNzgzODYgMC43OTI4MjkKK3Z0IDAuMjc4NTgyIDAuNzkyMjcyCit2dCAwLjI4NDA3MSAwLjc5NTU2MQordnQgMC4zNTgzMjAgMC43MzAzNzQKK3Z0IDAuMzYwOTMxIDAuNzI4NjQxCit2dCAwLjMzODc1NyAwLjczNzAzMAordnQgMC4zNDA3MjYgMC43MzcwOTkKK3Z0IDAuMzQwNDM3IDAuNzM3NjYxCit2dCAwLjMzODU5MiAwLjczNzU5NgordnQgMC4zMzg3MjUgMC43MzcxMDYKK3Z0IDAuMzQwNjcxIDAuNzM3MTc1Cit2dCAwLjk0OTEwMSAwLjc3NDIwOQordnQgMC45NDkxMDAgMC43NzE1MzkKK3Z0IDAuOTQ5MTYxIDAuNzcxNTI1Cit2dCAwLjk0OTE2MSAwLjc3NDIyOAordnQgMC4wNTAzNzAgMC44MDc4NzQKK3Z0IDAuMDUwMzY5IDAuODA3NzMyCit2dCAwLjA1MDUwMiAwLjgwNzcyOAordnQgMC4wNDk1MjQgMC44MDc3MzAKK3Z0IDAuMDQ5NjU1IDAuODA3NzMzCit2dCAwLjA0OTY1NiAwLjgwNzg3NgordnQgMC4wNDk4OTQgMC44MDc4NzUKK3Z0IDAuMDQ5ODkzIDAuODA3NzMzCit2dCAwLjA1MDEzMSAwLjgwNzczMgordnQgMC4wNTAxMzIgMC44MDc4NzUKK3Z0IDAuMDQ5ODkzIDAuODA3NDc2Cit2dCAwLjA1MDEzMSAwLjgwNzQ3NQordnQgMC4wNTAzNjkgMC44MDc0NzUKK3Z0IDAuMDUwNTAyIDAuODA3NDcxCit2dCAwLjA0OTUyNCAwLjgwNzQ3MwordnQgMC4wNDk2NTUgMC44MDc0NzYKK3Z0IDAuMzk5NzM3IDAuODgxNDQzCit2dCAwLjM5OTQ5OSAwLjg4MTQ0MwordnQgMC4zOTk0OTkgMC44ODEyNzAKK3Z0IDAuMzk5NzM3IDAuODgxMjcwCit2dCAwLjczOTg1MyAwLjYyNTgxNAordnQgMC43Mzk4NTEgMC42MjU2NjgKK3Z0IDAuNzQwMDI0IDAuNjI1NjY0Cit2dCAwLjc0MDAyNiAwLjYyNTgxMAordnQgMC4xNjk4NjcgMC43MjgyNjIKK3Z0IDAuMTY5ODY4IDAuNzI4MTE3Cit2dCAwLjE3MDA0MSAwLjcyODEyMQordnQgMC4xNzAwNDAgMC43MjgyNjYKK3Z0IDAuNzM5ODQ3IDAuNjI1NDExCit2dCAwLjc0MDAyMCAwLjYyNTQwNwordnQgMC4xNjk4NjMgMC43Mjg1MTkKK3Z0IDAuMTcwMDM1IDAuNzI4NTIzCit2dCAwLjM5OTk3NSAwLjg4MTQ0MgordnQgMC4zOTk5NzUgMC44ODEyNzAKK3Z0IDAuMzk5MjYxIDAuODgxNDQzCit2dCAwLjM5OTI2MSAwLjg4MTI3MAordnQgMC4zOTk0OTkgMC44NzQ2NjcKK3Z0IDAuMzk5NzM3IDAuODc0NjY4Cit2dCAwLjc0NjYzNSAwLjYyNTcwNQordnQgMC43NDY2MzQgMC42MjU4NTEKK3Z0IDAuMTc2NjQ3IDAuNzI4MDgwCit2dCAwLjE3NjY0OCAwLjcyODIyNQordnQgMC43NDY2MzUgMC42MjU0NDgKK3Z0IDAuMTc2NjQ4IDAuNzI4NDgyCit2dCAwLjM5OTk3NSAwLjg3NDY2OAordnQgMC4zOTkyNjEgMC44NzQ2NjcKK3Z0IDAuMTc2NjQ4IDAuNzM3NjA0Cit2dCAwLjE3MDAzNiAwLjczNzYwNAordnQgMC4xNjk4NjMgMC43Mzc2MDQKK3Z0IDAuMDQ5NTIyIDAuNzk4Mzg4Cit2dCAwLjA0OTY1MyAwLjc5ODM4OAordnQgMC4wNDk4OTEgMC43OTgzODgKK3Z0IDAuMDUwMTI5IDAuNzk4Mzg4Cit2dCAwLjA1MDM2NyAwLjc5ODM4OAordnQgMC4wNTA1MDAgMC43OTgzODgKK3Z0IDAuNzM5ODQ3IDAuNjE2MzI3Cit2dCAwLjc0MDAyMCAwLjYxNjMyNwordnQgMC43NDY2MzUgMC42MTYzMjcKK3Z0IDAuMDUwMzcwIDAuNzg4OTAyCit2dCAwLjA1MDUwMiAwLjc4OTA0OAordnQgMC4wNTAzNjkgMC43ODkwNDUKK3Z0IDAuMDQ5NTI0IDAuNzg5MDQ2Cit2dCAwLjA0OTY1NiAwLjc4ODkwMAordnQgMC4wNDk2NTUgMC43ODkwNDMKK3Z0IDAuMDQ5ODk0IDAuNzg4OTAxCit2dCAwLjA1MDEzMiAwLjc4ODkwMQordnQgMC4wNTAxMzEgMC43ODkwNDQKK3Z0IDAuMDQ5ODkzIDAuNzg5MDQ0Cit2dCAwLjA1MDEzMSAwLjc4OTMwMQordnQgMC4wNDk4OTMgMC43ODkzMDEKK3Z0IDAuMDUwNTAyIDAuNzg5MzA0Cit2dCAwLjA1MDM2OSAwLjc4OTMwMgordnQgMC4wNDk2NTUgMC43ODkzMDAKK3Z0IDAuMDQ5NTI0IDAuNzg5MzAyCit2dCAwLjg4MTM1OSAwLjU3NTc4NgordnQgMC44ODEzNTkgMC41NzU5NTkKK3Z0IDAuODgxMTIxIDAuNTc1OTU5Cit2dCAwLjg4MTEyMSAwLjU3NTc4NgordnQgMC43Mzk4NTMgMC42MDY4NDEKK3Z0IDAuNzQwMDI2IDAuNjA2ODQ1Cit2dCAwLjc0MDAyNCAwLjYwNjk5MQordnQgMC43Mzk4NTEgMC42MDY5ODcKK3Z0IDAuMTY5ODY3IDAuNzQ2OTQ3Cit2dCAwLjE3MDA0MCAwLjc0Njk0MwordnQgMC4xNzAwNDEgMC43NDcwODgKK3Z0IDAuMTY5ODY4IDAuNzQ3MDkyCit2dCAwLjc0MDAyMCAwLjYwNzI0OAordnQgMC43Mzk4NDcgMC42MDcyNDQKK3Z0IDAuMTY5ODYzIDAuNzQ2NjkwCit2dCAwLjE3MDAzNSAwLjc0NjY4NgordnQgMC44ODE1OTcgMC41NzU3ODcKK3Z0IDAuODgxNTk3IDAuNTc1OTU5Cit2dCAwLjg4MDg4MyAwLjU3NTk1OQordnQgMC44ODA4ODMgMC41NzU3ODYKK3Z0IDAuODgxMzU5IDAuNTgyNTY0Cit2dCAwLjg4MTEyMSAwLjU4MjU2NQordnQgMC43NDY2MzQgMC42MDY4MDQKK3Z0IDAuNzQ2NjM1IDAuNjA2OTUwCit2dCAwLjE3NjY0OCAwLjc0Njk4NAordnQgMC4xNzY2NDcgMC43NDcxMjkKK3Z0IDAuNzQ2NjM1IDAuNjA3MjA3Cit2dCAwLjE3NjY0OCAwLjc0NjcyNwordnQgMC44ODE1OTcgMC41ODI1NjQKK3Z0IDAuODgwODgzIDAuNTgyNTY1Cit2dCAwLjIxNDM2MyAwLjg5ODU5OAordnQgMC4yMTM5MTAgMC44OTg2MDEKK3Z0IDAuMjEzOTEwIDAuODkzNzk3Cit2dCAwLjIxNDM2MyAwLjg5Mzc5NAordnQgMC4yMTQ3MzkgMC44OTg1OTIKK3Z0IDAuMjE0NzM5IDAuODkzNzg4Cit2dCAwLjIxNTA4NiAwLjg5Mzc3OAordnQgMC4yMTUwODYgMC44OTg1ODMKK3Z0IDAuOTA3NDcxIDAuMDUwNzQwCit2dCAwLjkwNzQ3MSAwLjA0NTkzMgordnQgMC45MDc5NzUgMC4wNDU5MzMKK3Z0IDAuOTA3OTc1IDAuMDUwNzQxCit2dCAwLjkwODE5MSAwLjAxMDE0OAordnQgMC45MDc2OTAgMC4wMDUzNjYKK3Z0IDAuOTA4MTkxIDAuMDA1MzEzCit2dCAwLjAzNjMzMyAwLjkwMzAxOAordnQgMC4wMzY4MzQgMC45MDc3OTkKK3Z0IDAuMDM2MzMzIDAuOTA3ODUzCit2dCAwLjIyODA5MyAwLjg5ODcwMQordnQgMC4yMjgwOTMgMC44OTM4OTQKK3Z0IDAuMjI4NDM0IDAuODkzODk4Cit2dCAwLjIyODQzNCAwLjg5ODcwNQordnQgMC4yMjg4MDcgMC44OTg3MDcKK3Z0IDAuMjI4ODA3IDAuODkzOTAwCit2dCAwLjQyNjc0OSAwLjkyNjk1MwordnQgMC40MjY1NzMgMC45MjY4NzgKK3Z0IDAuNDI2OTY3IDAuOTI2ODExCit2dCAwLjQyNjk2NyAwLjkyNjkyMAordnQgMC40MjU5MjEgMC45MjczODcKK3Z0IDAuNDI1ODMwIDAuOTI3Mjk4Cit2dCAwLjQyNjEzNiAwLjkyNzA1MwordnQgMC40MjYxNTYgMC45MjcxODUKK3Z0IDAuNDI1ODE0IDAuOTI3NzUzCit2dCAwLjQyNTcwNSAwLjkyNzc1MwordnQgMC40MjU5MjEgMC45MjgxMjAKK3Z0IDAuNDI1ODMwIDAuOTI4MjA4Cit2dCAwLjk4OTczOCAwLjY0MDI0MgordnQgMC45ODk2NDQgMC42NDAxODcKK3Z0IDAuOTg5NzM4IDAuNjM5ODE3Cit2dCAwLjQyNjE1NiAwLjkyODMzNQordnQgMC40MjYxMzYgMC45Mjg0NjYKK3Z0IDAuNDI2NTgwIDAuOTI4MzkzCit2dCAwLjQyNjU3MyAwLjkyODYyOQordnQgMC40MjY3OTMgMC45MjgyNzkKK3Z0IDAuNDI2OTY4IDAuOTI4MzY3Cit2dCAwLjQyNjc0OSAwLjkyODU1MwordnQgMC40MjY5NjggMC45MjgxMTkKK3Z0IDAuNDI2NjA0IDAuOTI4MDgwCit2dCAwLjQyNjc0MiAwLjkyNzk0OQordnQgMC40MjY4MDAgMC45Mjc3NTMKK3Z0IDAuNDI2OTY4IDAuOTI3NzUzCit2dCAwLjQyNjc0MiAwLjkyNzU1OAordnQgMC40MjY5NjggMC45MjczODcKK3Z0IDAuNDI2OTY4IDAuOTI3MTM5Cit2dCAwLjQyNjc5MyAwLjkyNzIyNwordnQgMC40MjY5NjcgMC45Mjg2MjIKK3Z0IDAuNDI2NTc3IDAuOTI3MTEzCit2dCAwLjk4NjA4OSAwLjMzNDE3NAordnQgMC45ODYxOTQgMC4zMzQxNzQKK3Z0IDAuOTg2MTk1IDAuMzM0MzMyCit2dCAwLjk4NjA4OSAwLjMzNDMzMgordnQgMC45ODYxOTYgMC4zMzQ0NDgKK3Z0IDAuOTg2MDkxIDAuMzM0NDQ4Cit2dCAwLjk5MDE2OSAwLjYxNDUxMAordnQgMC45OTAwNjQgMC42MTQ1MTAKK3Z0IDAuOTkwMDY0IDAuNjE0MzY3Cit2dCAwLjk5MDE2OSAwLjYxNDM2NwordnQgMC45OTAwNjQgMC42MTQyMjQKK3Z0IDAuOTkwMTY5IDAuNjE0MjI0Cit2dCAwLjM5OTI2NiAwLjk4NTQ1NAordnQgMC4zOTkzNzIgMC45ODU0NTQKK3Z0IDAuMzk5MzY4IDAuOTg1NTY4Cit2dCAwLjM5OTI2MiAwLjk4NTU2OAordnQgMC4zOTkzNjYgMC45ODU3MjQKK3Z0IDAuMzk5MjYxIDAuOTg1NzI0Cit2dCAwLjM5OTM2OCAwLjk4NTg4MQordnQgMC4zOTkyNjIgMC45ODU4ODEKK3Z0IDAuMzk5MzcyIDAuOTg1OTk3Cit2dCAwLjM5OTI2NiAwLjk4NTk5NwordnQgMC44NDc4MjggMC45ODk4ODEKK3Z0IDAuODQ3NzIzIDAuOTg5ODgxCit2dCAwLjg0NzcyMyAwLjk4OTczNwordnQgMC44NDc4MjkgMC45ODk3MzcKK3Z0IDAuODQ3NzIzIDAuOTg5NTk0Cit2dCAwLjg0NzgyOCAwLjk4OTU5NAordnQgMC45ODYwOTEgMC4zMzM5MDUKK3Z0IDAuOTg2MTk2IDAuMzMzOTA1Cit2dCAwLjk4NjE5NSAwLjMzNDAxOAordnQgMC45ODYwODkgMC4zMzQwMTgKK3Z0IDAuNDI2Mzc3IDAuOTI3NDY3Cit2dCAwLjQyNjIyMSAwLjkyNzUwNQordnQgMC40MjYxOTMgMC45Mjc0MDMKK3Z0IDAuNDI2MzkzIDAuOTI3MzY2Cit2dCAwLjQyNjEwNiAwLjkyNzYxMAordnQgMC40MjYwMjMgMC45Mjc1NDAKK3Z0IDAuNDI2MDY0IDAuOTI3NzUzCit2dCAwLjQyNTk1MyAwLjkyNzc1MwordnQgMC40MjYxMDYgMC45Mjc4OTYKK3Z0IDAuNDI2MDIzIDAuOTI3OTY3Cit2dCAwLjQyNjIyMSAwLjkyODAwMQordnQgMC40MjYxOTMgMC45MjgxMDMKK3Z0IDAuNDI2Mzc3IDAuOTI4MDQwCit2dCAwLjQyNjM5OCAwLjkyODE0MAordnQgMC40MjY1MzQgMC45MjgwMDEKK3Z0IDAuNDI2NjQ4IDAuOTI3ODk3Cit2dCAwLjQyNjY5MCAwLjkyNzc1MwordnQgMC40MjY2NDggMC45Mjc2MTAKK3Z0IDAuNDI2NTM0IDAuOTI3NTA1Cit2dCAwLjQyNjYwNCAwLjkyNzQyNgordnQgMC4yMjkyNTggMC44OTg3MDkKK3Z0IDAuMjI5MjU4IDAuODkzOTAyCit2dCAwLjQyNjk2NyAwLjkyODcwMQordnQgMC40MjY1MTUgMC45MjY4MzAKK3Z0IDAuNDI2OTY3IDAuOTI2NzQyCit2dCAwLjQyNTc5NSAwLjkyNzI0OQordnQgMC4yMTQ3NDQgMC44OTM3MzEKK3Z0IDAuNDI1NjQ4IDAuOTI3NzUzCit2dCAwLjk4ODk4NSAwLjgxMzA2MgordnQgMC45ODg5MzYgMC44MTI2MTAKK3Z0IDAuOTg4OTg1IDAuODEyNTU1Cit2dCAwLjQyNTc5NSAwLjkyODI1OAordnQgMC40MjY1MTUgMC45Mjg2NzYKK3Z0IDAuNDI2MTQwIDAuOTI2OTk0Cit2dCAwLjQyNjk2NyAwLjkyODc2NAordnQgMC4xMDI5NjIgMC45NzU3MjgKK3Z0IDAuMTAyOTQ5IDAuOTc1NzU0Cit2dCAwLjEwMjk0MSAwLjk3NTczNgordnQgMC4xMDMxMDcgMC45NzU2MzEKK3Z0IDAuMTAzMTA2IDAuOTc1Nzg2Cit2dCAwLjEwMjk1OCAwLjk3NTc3MQordnQgMC4xMDMwMTggMC45NzU5MDEKK3Z0IDAuMTAzMTY4IDAuOTc1NjI2Cit2dCAwLjEwMzA5NSAwLjk3NTU0NgordnQgMC4xMDMxNjggMC45NzU4MTEKK3Z0IDAuMTAzMDcxIDAuOTc1OTU1Cit2dCAwLjkzNzAzMyAwLjk4NzQ2OQordnQgMC45MzcwMzMgMC45ODc2MDUKK3Z0IDAuOTg5NDcxIDAuNTUwNzg1Cit2dCAwLjk4OTQyNiAwLjU1MDc4NQordnQgMC45ODk0MjYgMC41NTA2MjAKK3Z0IDAuOTg5NDcwIDAuNTUwNjIwCit2dCAwLjkzNzA3MyAwLjk4NzQ3NQordnQgMC45MzcwNzMgMC45ODc1OTkKK3Z0IDAuMTAyOTA3IDAuOTc1NjEyCit2dCAwLjEwMjk1MiAwLjk3NTQ2NAordnQgMC4xMDI4MDcgMC45NzU0NTkKK3Z0IDAuMTAyOTYyIDAuOTc1NDMyCit2dCAwLjEwMjc4OCAwLjk3NTQyNwordnQgMC45ODk0MTIgMC42NTE2NzkKK3Z0IDAuOTg5NDU3IDAuNjUxNjc5Cit2dCAwLjk4OTQ1NiAwLjY1MTg0NgordnQgMC45ODk0MTIgMC42NTE4NDYKK3Z0IDAuOTg5NDk1IDAuNjUxODUyCit2dCAwLjEwMjgxNSAwLjk3NTc3MAordnQgMC4xMDI4MTEgMC45NzU5MjYKK3Z0IDAuMTAyNjkyIDAuOTc1ODMyCit2dCAwLjEwMjgwMiAwLjk3NTk1OAordnQgMC4xMDI5NzYgMC45NzU5NjIKK3Z0IDAuMTAyNTk1IDAuOTc1NzYzCit2dCAwLjEwMjY0OCAwLjk3NTg3NQordnQgMC45ODg0MjAgMC43MDQ0MDYKK3Z0IDAuOTg4NDIwIDAuNzA0NTQzCit2dCAwLjk4OTQyNiAwLjU1MDMyNQordnQgMC45ODk0NzEgMC41NTAzMjUKK3Z0IDAuOTg5NDcwIDAuNTUwNDk2Cit2dCAwLjk4OTQyNiAwLjU1MDQ5NgordnQgMC45ODg0NjAgMC43MDQ0MTMKK3Z0IDAuOTg4NDYwIDAuNzA0NTM3Cit2dCAwLjEwMjgwMSAwLjk3NTY2MwordnQgMC4xMDI4MTQgMC45NzU2MzYKK3Z0IDAuMTAyNjU4IDAuOTc1NjA0Cit2dCAwLjEwMjc0NSAwLjk3NTQ4OQordnQgMC4xMDI2MjcgMC45NzU1OTIKK3Z0IDAuMTAyNjk0IDAuOTc1NDM0Cit2dCAwLjk4OTQ1NyAwLjY1MjEzOAordnQgMC45ODk0MTIgMC42NTIxMzgKK3Z0IDAuOTg5NDEyIDAuNjUxOTcxCit2dCAwLjk4OTQ1NiAwLjY1MTk3MQordnQgMC42ODUzNTIgMC43MTcwMzIKK3Z0IDAuNjg1MzM0IDAuNzE3MDEzCit2dCAwLjY4NTQxOSAwLjcxNjkzMwordnQgMC45OTQ1ODIgMC4yOTAwOTEKK3Z0IDAuMzg1MTc2IDAuOTkzNTU3Cit2dCAwLjM4NTE3NiAwLjk5MzY3NAordnQgMC4zODUxMjMgMC45OTM2OTMKK3Z0IDAuMzg1MTA0IDAuOTkzNTU2Cit2dCAwLjM4NTEwMyAwLjk5MzUzOAordnQgMC4zODUxNzYgMC45OTM1NDEKK3Z0IDAuOTkxNTQwIDAuOTIyNzM3Cit2dCAwLjk5MTU0MCAwLjkyMjY0OAordnQgMC45OTE0ODUgMC45MjI1MDYKK3Z0IDAuOTk0NjMyIDAuMDQ1OTAxCit2dCAwLjk5NDY4NiAwLjA0NTg3NwordnQgMC45OTEzMjYgMC45NDk0NzEKK3Z0IDAuOTkxMjU1IDAuOTQ5MzQ0Cit2dCAwLjk5MzY2NSAwLjIzNDYwNAordnQgMC45OTM1OTAgMC4yMzQ1NzcKK3Z0IDAuOTkzNjY1IDAuMjM0NTQwCit2dCAwLjk5MzU5MyAwLjIzNDU0MQordnQgMC45OTM2MDkgMC4yMzQ0MDQKK3Z0IDAuOTkzNjY1IDAuMjM0NDIzCit2dCAwLjgyOTQxMSAwLjI5NzEwNwordnQgMC44Mjk0NjYgMC4yOTcwNzkKK3Z0IDAuODI5NDY2IDAuMjk3MTU4Cit2dCAwLjk5NDAyMCAwLjEyNzk4MAordnQgMC45OTQwMjAgMC4xMjgwOTcKK3Z0IDAuOTkzOTQ4IDAuMTI3OTc5Cit2dCAwLjk5NDAyMCAwLjEyNzkxNgordnQgMC45OTM5NDYgMC4xMjc5NDMKK3Z0IDAuOTkxMjQ1IDAuODkzNTEyCit2dCAwLjk5MTE3MSAwLjg5MzQ0NAordnQgMC45OTExODcgMC44OTMyODEKK3Z0IDAuMzczNDMzIDAuOTk0NTg2Cit2dCAwLjM3MzQ4NiAwLjk5NDU2MgordnQgMC45OTE0NDQgMC45NzM4MTEKK3Z0IDAuOTkxMzczIDAuOTczNjg1Cit2dCAwLjk5MTQ0NSAwLjk3MzYzNwordnQgMC45OTQzNDggMC4wNjY5MzIKK3Z0IDAuOTk0Mjk0IDAuMDY2NzMzCit2dCAwLjk5NDM0OCAwLjA2Njc1MgordnQgMC42ODU0MzQgMC43MTY3OTcKK3Z0IDAuNjg1MzM0IDAuNzE2NzIwCit2dCAwLjY4NTQ1MyAwLjcxNjg0NgordnQgMC42ODU0NTggMC43MTY4NjYKK3Z0IDAuNjg1NTYzIDAuNzE2OTM0Cit2dCAwLjY4NTU2MCAwLjcxNjk2MAordnQgMC42ODU2NjAgMC43MTcwMzcKK3Z0IDAuNjg1NjQ1IDAuNzE3MDUxCit2dCAwLjY4NTU3NCAwLjcxNjgyNAordnQgMC42ODU2NDIgMC43MTY3MjQKK3Z0IDAuNjg1NjYwIDAuNzE2NzQ0Cit2dCAwLjk4ODQyMiAwLjcwNDcyNwordnQgMC45ODg0NjEgMC43MDQ3MDQKK3Z0IDAuOTg4Mzc3IDAuNzA0MjI0Cit2dCAwLjk4ODQ2MSAwLjcwNDI0OAordnQgMC45MzY5OTIgMC45ODcyODYKK3Z0IDAuOTM3MDc2IDAuOTg3MzEwCit2dCAwLjkzNzAzNiAwLjk4Nzc4OQordnQgMC45MzcwNzYgMC45ODc3NjYKK3Z0IDAuMjU5NjgxIDAuODk4NTg2Cit2dCAwLjI1OTIyOCAwLjg5ODU4OQordnQgMC4yNTkyMjggMC44OTM3ODUKK3Z0IDAuMjU5NjgxIDAuODkzNzgyCit2dCAwLjI2MDA1NyAwLjg5ODU4MAordnQgMC4yNjAwNTcgMC44OTM3NzYKK3Z0IDAuMjYwNDA0IDAuODkzNzY2Cit2dCAwLjI2MDQwNCAwLjg5ODU3MQordnQgMC42ODMyNzkgMC45MDc4NzAKK3Z0IDAuNjgzMjc5IDAuOTAzMDYyCit2dCAwLjY4Mzc4NCAwLjkwMzA2MwordnQgMC42ODM3ODQgMC45MDc4NzEKK3Z0IDAuMzE2NzYyIDAuOTA4MTMwCit2dCAwLjMxNjI2MCAwLjkwMzM0OQordnQgMC4zMTY3NjIgMC45MDMyOTUKK3Z0IDAuMTY3MTI4IDAuOTA4MjExCit2dCAwLjE2NjYyNyAwLjkwMzQzMAordnQgMC4xNjcxMjggMC45MDMzNzYKK3Z0IDAuMDE5NzU4IDAuODk0MDk4Cit2dCAwLjAxOTc1OCAwLjg5ODkwNgordnQgMC4wMTk0MTcgMC44OTg5MDEKK3Z0IDAuMDE5NDE3IDAuODk0MDk0Cit2dCAwLjAxOTA0NCAwLjg5NDA5MgordnQgMC4wMTkwNDQgMC44OTg4OTkKK3Z0IDAuMTg5ODY2IDAuOTI3MDIzCit2dCAwLjE4OTY5MCAwLjkyNjk0OAordnQgMC4xOTAwODQgMC45MjY4ODIKK3Z0IDAuMTkwMDg0IDAuOTI2OTkwCit2dCAwLjE4OTAzOCAwLjkyNzQ1NwordnQgMC4xODg5NDYgMC45MjczNjkKK3Z0IDAuMTg5MjUzIDAuOTI3MTI0Cit2dCAwLjE4OTI3MyAwLjkyNzI1NQordnQgMC4xODg5MzEgMC45Mjc4MjQKK3Z0IDAuMTg4ODIyIDAuOTI3ODI0Cit2dCAwLjE4OTAzOCAwLjkyODE5MAordnQgMC4xODg5NDYgMC45MjgyNzgKK3Z0IDAuOTg5Njg4IDAuMzcyODY2Cit2dCAwLjk4OTU5NCAwLjM3MjgxMAordnQgMC45ODk2ODggMC4zNzI0NDAKK3Z0IDAuMTg5MjczIDAuOTI4NDA1Cit2dCAwLjE4OTI1MyAwLjkyODUzNwordnQgMC4xODk2OTYgMC45Mjg0NjQKK3Z0IDAuMTg5Njg5IDAuOTI4Njk5Cit2dCAwLjE4OTkwOSAwLjkyODM0OQordnQgMC4xOTAwODQgMC45Mjg0MzcKK3Z0IDAuMTg5ODY2IDAuOTI4NjI0Cit2dCAwLjE5MDA4NCAwLjkyODE5MAordnQgMC4xODk3MjAgMC45MjgxNTAKK3Z0IDAuMTg5ODU4IDAuOTI4MDE5Cit2dCAwLjE4OTkxNiAwLjkyNzgyNAordnQgMC4xOTAwODQgMC45Mjc4MjQKK3Z0IDAuMTg5ODU4IDAuOTI3NjI4Cit2dCAwLjE5MDA4NCAwLjkyNzQ1NwordnQgMC4xOTAwODQgMC45MjcyMTAKK3Z0IDAuMTg5OTA5IDAuOTI3Mjk4Cit2dCAwLjE5MDA4NCAwLjkyODY5MgordnQgMC4xODk2OTMgMC45MjcxODQKK3Z0IDAuOTg2MDg5IDAuMzQ1MzQyCit2dCAwLjk4NjE5NCAwLjM0NTM0MgordnQgMC45ODYxOTQgMC4zNDU0OTkKK3Z0IDAuOTg2MDg5IDAuMzQ1NDk5Cit2dCAwLjk4NjE5NiAwLjM0NTYxNQordnQgMC45ODYwOTEgMC4zNDU2MTUKK3Z0IDAuOTkwMDk1IDAuNTM2ODQ1Cit2dCAwLjk4OTk5MCAwLjUzNjg0NQordnQgMC45ODk5OTAgMC41MzY3MDIKK3Z0IDAuOTkwMDk1IDAuNTM2NzAyCit2dCAwLjk4OTk5MCAwLjUzNjU1OAordnQgMC45OTAwOTUgMC41MzY1NTgKK3Z0IDAuOTgwNjY3IDAuOTg1MTgyCit2dCAwLjk4MDc3MiAwLjk4NTE4MgordnQgMC45ODA3NjkgMC45ODUyOTYKK3Z0IDAuOTgwNjYzIDAuOTg1Mjk2Cit2dCAwLjk4MDc2NyAwLjk4NTQ1MgordnQgMC45ODA2NjIgMC45ODU0NTIKK3Z0IDAuOTgwNzY5IDAuOTg1NjA5Cit2dCAwLjk4MDY2MyAwLjk4NTYwOQordnQgMC45ODA3NzIgMC45ODU3MjQKK3Z0IDAuOTgwNjY3IDAuOTg1NzI0Cit2dCAwLjk4OTk0MSAwLjc5OTM0MAordnQgMC45ODk4MzYgMC43OTkzNDAKK3Z0IDAuOTg5ODM2IDAuNzk5MTk3Cit2dCAwLjk4OTk0MSAwLjc5OTE5NwordnQgMC45ODk4MzYgMC43OTkwNTMKK3Z0IDAuOTg5OTQxIDAuNzk5MDUzCit2dCAwLjk4NjA5MSAwLjM0NTA3MwordnQgMC45ODYxOTYgMC4zNDUwNzMKK3Z0IDAuOTg2MTk1IDAuMzQ1MTg2Cit2dCAwLjk4NjA4OSAwLjM0NTE4NgordnQgMC4xODk0OTQgMC45Mjc1MzcKK3Z0IDAuMTg5MzM3IDAuOTI3NTc2Cit2dCAwLjE4OTMwOSAwLjkyNzQ3NAordnQgMC4xODk1MDkgMC45Mjc0MzcKK3Z0IDAuMTg5MjIyIDAuOTI3NjgxCit2dCAwLjE4OTEzOSAwLjkyNzYxMAordnQgMC4xODkxODAgMC45Mjc4MjQKK3Z0IDAuMTg5MDcwIDAuOTI3ODI0Cit2dCAwLjE4OTIyMiAwLjkyNzk2NwordnQgMC4xODkxMzkgMC45MjgwMzcKK3Z0IDAuMTg5MzM3IDAuOTI4MDcyCit2dCAwLjE4OTMwOSAwLjkyODE3MwordnQgMC4xODk0OTQgMC45MjgxMTAKK3Z0IDAuMTg5NTE0IDAuOTI4MjEwCit2dCAwLjE4OTY1MCAwLjkyODA3MgordnQgMC4xODk3NjUgMC45Mjc5NjcKK3Z0IDAuMTg5ODA3IDAuOTI3ODI0Cit2dCAwLjE4OTc2NSAwLjkyNzY4MQordnQgMC4xODk2NTAgMC45Mjc1NzYKK3Z0IDAuMTg5NzIwIDAuOTI3NDk3Cit2dCAwLjAxODU5NCAwLjg5NDA5MQordnQgMC4wMTg1OTQgMC44OTg4OTgKK3Z0IDAuMTkwMDg0IDAuOTI4NzcyCit2dCAwLjE4OTYzMiAwLjkyNjkwMQordnQgMC4xOTAwODQgMC45MjY4MTMKK3Z0IDAuMTg4OTEyIDAuOTI3MzE5Cit2dCAwLjI2MDA2MiAwLjg5MzcxOQordnQgMC42ODMzMjkgMC45MDMwMDcKK3Z0IDAuMDE4NjQzIDAuOTg4NzcwCit2dCAwLjAxODU5NCAwLjk4ODMxOAordnQgMC4xODkyNTcgMC45Mjg1OTcKK3Z0IDAuMTg5NjMyIDAuOTI4NzQ3Cit2dCAwLjkyNTMxNCAwLjU5MDE0OAordnQgMC45MjUzMzAgMC41OTAxNTQKK3Z0IDAuOTI1NDU4IDAuNTkwMDUxCit2dCAwLjkyNTQ1NyAwLjU5MDIwNgordnQgMC45MjUzNjkgMC41OTAzMjEKK3Z0IDAuOTI1NDgzIDAuNTkwMDQyCit2dCAwLjkyNTM4NCAwLjU5MDM1NQordnQgMC45MjU0NDcgMC41ODk5NjcKK3Z0IDAuOTI1NDY3IDAuNTg5OTM1Cit2dCAwLjkwMzUxMiAwLjk4NzQ4NwordnQgMC45MDM1MTIgMC45ODc2MjMKK3Z0IDAuOTg5NTMzIDAuNzMwOTU3Cit2dCAwLjk4OTQ4OCAwLjczMDc5MgordnQgMC45MDM1NTIgMC45ODc0OTMKK3Z0IDAuOTAzNTUyIDAuOTg3NjE3Cit2dCAwLjk4OTU3MiAwLjczMDkzNgordnQgMC45ODk1NzIgMC43MzA3ODYKK3Z0IDAuOTI1MjU4IDAuNTkwMDMyCit2dCAwLjkyNTIzMCAwLjU5MDAyNgordnQgMC45MjUzMDMgMC41ODk4ODQKK3Z0IDAuOTI1MTU4IDAuNTg5ODc5Cit2dCAwLjkyNTE0MCAwLjU4OTg0NwordnQgMC45MjUzMjMgMC41ODk4MTkKK3Z0IDAuOTg5Mzc3IDAuNzQxNzc5Cit2dCAwLjk4OTQyMSAwLjc0MTk0NgordnQgMC45ODk0NjEgMC43NDE4MDAKK3Z0IDAuOTg5NDYwIDAuNzQxOTUyCit2dCAwLjkyNTIwOCAwLjU5MDE5OAordnQgMC45MjUxNjMgMC41OTAzNDYKK3Z0IDAuOTI1MDQzIDAuNTkwMjUyCit2dCAwLjkyNTMwOCAwLjU5MDM1MQordnQgMC45MjUxNTMgMC41OTAzNzgKK3Z0IDAuOTI0OTQ2IDAuNTkwMTgzCit2dCAwLjkyNDk4NCAwLjU5MDE4OAordnQgMC45MjUxNDMgMC41OTA0MTEKK3Z0IDAuOTg4NjE4IDAuMzU2NDkwCit2dCAwLjk4ODYxOCAwLjM1NjYyNwordnQgMC45ODk0ODggMC43MzA0OTcKK3Z0IDAuOTg5NTMzIDAuNzMwNjY3Cit2dCAwLjk4ODY1OCAwLjM1NjQ5NwordnQgMC45ODg2NTggMC4zNTY2MjEKK3Z0IDAuOTg5NTcyIDAuNzMwNTE4Cit2dCAwLjk4OTU3MiAwLjczMDY3MwordnQgMC45MjUxNTMgMC41OTAwODMKK3Z0IDAuOTI1MTQ5IDAuNTkwMTEyCit2dCAwLjkyNTAwOSAwLjU5MDAyNAordnQgMC45MjUwOTcgMC41ODk5MDkKK3Z0IDAuOTI0OTQ2IDAuNTg5OTk5Cit2dCAwLjkyNTA0NSAwLjU4OTg1NAordnQgMC45ODk0MjEgMC43NDIyMzgKK3Z0IDAuOTg5Mzc2IDAuNzQyMDcxCit2dCAwLjk4OTQ2MSAwLjc0MjIxNwordnQgMC45ODk0NjAgMC43NDIwNjUKK3Z0IDAuNjc0Mzk4IDAuNzE3MDMyCit2dCAwLjY3NDQ2NiAwLjcxNjkzMwordnQgMC42NzQ0ODQgMC43MTY5NTIKK3Z0IDAuNDQzMjczIDAuOTk0Mzg5Cit2dCAwLjk5Mzk4NiAwLjAyNDQ4NAordnQgMC45OTM5ODYgMC4wMjQ2MDIKK3Z0IDAuOTkzOTMzIDAuMDI0NjIxCit2dCAwLjk5MzkxNCAwLjAyNDQ4MwordnQgMC45OTM5ODYgMC4wMjQ0MjEKK3Z0IDAuOTkzOTEyIDAuMDI0NDQ3Cit2dCAwLjk5MTQ3NCAwLjk4NTQxMwordnQgMC45OTE0MDAgMC45ODUzODcKK3Z0IDAuOTkxNDAxIDAuOTg1MzQ1Cit2dCAwLjk5MTQ3NCAwLjk4NTM0MQordnQgMC45OTE0MTkgMC45ODUxODIKK3Z0IDAuOTkxNDczIDAuOTg1MTk5Cit2dCAwLjY0MjYxMSAwLjk5NDU2NAordnQgMC42NDI2NjQgMC45OTQ1NDAKK3Z0IDAuNjQyNjY0IDAuOTk0NTU5Cit2dCAwLjk5MTMyMSAwLjkzNjU3OQordnQgMC45OTEyNTEgMC45MzY0NTIKK3Z0IDAuOTkxMjUwIDAuOTM2NDMyCit2dCAwLjk5MTMyNCAwLjkzNjQzOAordnQgMC45OTM2MzAgMC4wODcyNjkKK3Z0IDAuOTkzNTU2IDAuMDg3MjQyCit2dCAwLjk5MzU3NSAwLjA4NzA2OQordnQgMC45MTMwMTUgMC42MTYyMzIKK3Z0IDAuOTEzMDcxIDAuNjE2MjA0Cit2dCAwLjkxMzAxNSAwLjYxNjI1OQordnQgMC45MTMwNzEgMC42MTYyNjMKK3Z0IDAuMDM2NDA3IDAuOTkzNjk0Cit2dCAwLjAzNjQwNyAwLjk5MzgxMQordnQgMC4wMzYzMzUgMC45OTM2OTIKK3Z0IDAuMDM2NDA3IDAuOTkzNjMwCit2dCAwLjA0OTU5NyAwLjk5MDk4MwordnQgMC4wNDk1MjIgMC45OTA5NTgKK3Z0IDAuMDQ5NTIyIDAuOTkwOTQ3Cit2dCAwLjA0OTU5NyAwLjk5MDk0MwordnQgMC4wNDk1MzkgMC45OTA3NTIKK3Z0IDAuMDQ5NTk0IDAuOTkwNzY5Cit2dCAwLjI3ODI5NyAwLjk5NDY0MwordnQgMC4yNzgzNTEgMC45OTQ2MTkKK3Z0IDAuMjc4Mjk3IDAuOTk0NjY0Cit2dCAwLjI3ODM1MSAwLjk5NDY3MAordnQgMC43MzY2NzQgMC45OTEzNjEKK3Z0IDAuNzM2NjIwIDAuOTkxMzc3Cit2dCAwLjczNjYwMyAwLjk5MTIzNAordnQgMC43MzY2NzUgMC45OTEyMzYKK3Z0IDAuNzM2Njc2IDAuOTkxMTQ2Cit2dCAwLjk5NDMxMyAwLjEwODEzOQordnQgMC45OTQyMzkgMC4xMDgxMTIKK3Z0IDAuOTk0MjU5IDAuMTA3OTM5Cit2dCAwLjk5NDMxMyAwLjEwNzk1OAordnQgMC42NzQ0ODAgMC43MTY3OTcKK3Z0IDAuNjc0MzgwIDAuNzE2NzIwCit2dCAwLjY3NDU1NiAwLjcxNjg0OAordnQgMC42NzQ1ODIgMC43MTY4OTAKK3Z0IDAuNjc0NjA2IDAuNzE2OTYwCit2dCAwLjY3NDcwNiAwLjcxNzAzNwordnQgMC42NzQ2OTEgMC43MTcwNTEKK3Z0IDAuNjc0Njg4IDAuNzE2NzI0Cit2dCAwLjkyNTMyOCAwLjU5MDM0NAordnQgMC45ODg2MjAgMC4zNTY4MTEKK3Z0IDAuOTg4NjU5IDAuMzU2Nzg4Cit2dCAwLjk4ODU3NSAwLjM1NjMwOAordnQgMC45ODg2NTkgMC4zNTYzMzIKK3Z0IDAuOTAzNDcxIDAuOTg3MzA0Cit2dCAwLjkwMzU1NSAwLjk4NzMyOAordnQgMC45MDM1MTUgMC45ODc4MDcKK3Z0IDAuOTAzNTU1IDAuOTg3Nzg0Cit2dCAwLjMzMDk2NiAwLjY5NDQ3MQordnQgMC4zMzEyMjEgMC42OTQzNTEKK3Z0IDAuMzMxODA0IDAuNjk2NTE5Cit2dCAwLjMzMTYzMCAwLjY5NjY4NwordnQgMC4zMzA5NjUgMC42OTI5MTIKK3Z0IDAuMzMxMjE5IDAuNjkyOTEyCit2dCAwLjIzMTgxMCAwLjc4NzE3MgordnQgMC4yMzM3ODAgMC43ODcxODMKK3Z0IDAuMjMzNzc5IDAuNzg3ODkxCit2dCAwLjIzMTgwOSAwLjc4Nzg4MAordnQgMC4xMDYxODYgMC43OTI5NjEKK3Z0IDAuMTA0MTUxIDAuNzkyOTU4Cit2dCAwLjEwNDE1MyAwLjc5MjI1MAordnQgMC4xMDYxODggMC43OTIyNTMKK3Z0IDAuMTA3MzU3IDAuNzkyOTY0Cit2dCAwLjEwNzM1OSAwLjc5MjI1NgordnQgMC4zMzU0ODIgMC42OTg0MTQKK3Z0IDAuMzMzMjQ0IDAuNjk3OTM0Cit2dCAwLjMzMzM1OCAwLjY5NzcwNgordnQgMC4zMzU0ODIgMC42OTgxMDMKK3Z0IDAuMzMxNTA4IDAuNjk0MjI3Cit2dCAwLjMzMjAwNyAwLjY5NjMzNgordnQgMC4zMzE1MDkgMC42OTI5MTAKK3Z0IDAuMzMzMTUwIDAuNjk4MTI1Cit2dCAwLjEwNjA2MSAwLjc5MTcxOAordnQgMC4xMDYxNzQgMC43OTIyMTAKK3Z0IDAuMTA0MTI2IDAuNzkyMjA3Cit2dCAwLjEwMzk1OSAwLjc5MTcxNgordnQgMC4xMDczNTkgMC43OTE3MjIKK3Z0IDAuMTA3MzU5IDAuNzkyMjEzCit2dCAwLjEwMjgyMCAwLjc5MjIxMQordnQgMC4xMDI1OTUgMC43OTE3MjEKK3Z0IDAuMTAyODIyIDAuODAzMTUzCit2dCAwLjEwMjg1MCAwLjc5Mjk2MgordnQgMC4xMDQxMjIgMC44MDMxNDcKK3Z0IDAuODE4NjY3IDAuMTI3OTE2Cit2dCAwLjgxODY2NyAwLjEzNjU1MQordnQgMC44MTg0MTIgMC4xMzY1NTEKK3Z0IDAuMzMxMjE5IDAuNjg0Mjc3Cit2dCAwLjMzMTUwOSAwLjY4NDI3NwordnQgMC44MTgyOTMgMC4wMTM5NDQKK3Z0IDAuODE4Nzg0IDAuMDEzOTQ0Cit2dCAwLjgxODc4NCAwLjAyMjU3NQordnQgMC4xMzU2NTQgMC44NjkwNzAKK3Z0IDAuMTM1MTYzIDAuODY5MDQzCit2dCAwLjEzNTY1NCAwLjg2MDQyNQordnQgMC4wMTkzMDIgMC44NTc5MDgKK3Z0IDAuMDE5MzAyIDAuODY2NTM5Cit2dCAwLjAxODU5NCAwLjg2NjUzOQordnQgMC44MTg4OTYgMC4yMzQ0MDQKK3Z0IDAuODE4ODk2IDAuMjQzMDM1Cit2dCAwLjgxODE4OCAwLjI0MzAzNQordnQgMC4yMzE4MTUgMC43ODY2MzcKK3Z0IDAuMjMzOTE1IDAuNzg2NjQ4Cit2dCAwLjIzMzgwMCAwLjc4NzEzOQordnQgMC4yMzE4MTEgMC43ODcxMjkKK3Z0IDAuOTIzNjUxIDAuNjMwNzIwCit2dCAwLjkyMzY1MSAwLjYyODUwMwordnQgMC45MjM2NTEgMC42MjY5NDUKK3Z0IDAuNjA4MTUyIDAuODY5ODcyCit2dCAwLjYwODIwNCAwLjg2ODM2NQordnQgMC42MDgyNjggMC44NjgzNjUKK3Z0IDAuNjA4MTM4IDAuODcyMjAwCit2dCAwLjYwODIwMiAwLjg3MjIwMAordnQgMC4yMDMyNjYgMC43OTg1ODQKK3Z0IDAuMjAzMjY2IDAuODA3MjE5Cit2dCAwLjIwMzIwMiAwLjgwNzIxOQordnQgMC41ODM0ODMgMC44NjczMDQKK3Z0IDAuNTgzNDgzIDAuODc1OTM5Cit2dCAwLjU4MzQxOSAwLjg3NTkzOQordnQgMC4yMzM3NTYgMC43OTgwODAKK3Z0IDAuMjMxNzg2IDAuNzk4MDY5Cit2dCAwLjEwNjE1OCAwLjgwMzE0OQordnQgMC4xMDczMjkgMC44MDMxNTMKK3Z0IDAuMTAyODUyIDAuNzkyMjU0Cit2dCAwLjA2OTczNCAwLjc4NTQ0MQordnQgMC4wNjMxNDcgMC43Nzk4NjEKK3Z0IDAuMDY5NzM0IDAuNzcyMDg4Cit2dCAwLjM0NDEzOCAwLjcyMjYwMwordnQgMC4zMzc1NTEgMC43MTcwMjQKK3Z0IDAuMzQ0MTM4IDAuNzA5MjUwCit2dCAwLjk1ODc5NiAwLjk0OTI4NAordnQgMC45NTg4MzkgMC45NTEzNjYKK3Z0IDAuMzMxNTY2IDAuNjk0MjA4Cit2dCAwLjMzMTU2NyAwLjY5MjkxMAordnQgMC45NjQ3NDUgMC4zMzM5MTUKK3Z0IDAuOTY0NzgxIDAuMzMzOTA1Cit2dCAwLjk2NDc4MSAwLjMzNTczNwordnQgMC45NjQ3MzkgMC4zMzU3MzMKK3Z0IDAuNDQzMzE2IDAuODc2NDc4Cit2dCAwLjQ0MzMwNCAwLjg2Nzg0NgordnQgMC44MjUxMTEgMC40MjA3MjEKK3Z0IDAuODI1MTU0IDAuNDIwNzIxCit2dCAwLjgyNTE1NCAwLjQyOTM1MgordnQgMC44MjUxMTEgMC4zNjQ5NDEKK3Z0IDAuODI1MTY5IDAuMzY0OTQxCit2dCAwLjgyNTE2OSAwLjM3MzU3NAordnQgMC45MjM0OTggMC42Mjg1MDMKK3Z0IDAuOTIzNDk5IDAuNjMwNzIwCit2dCAwLjkyMzQ5OSAwLjYyNjk0NQordnQgMC42MDgwNTEgMC44NjgzNjYKK3Z0IDAuNjA4MDAwIDAuODY5ODczCit2dCAwLjgxOTMzMSAwLjA4NzA2OQordnQgMC44MTkzMzEgMC4wOTU3MDQKK3Z0IDAuODE5MTc4IDAuMDk1NzA0Cit2dCAwLjY5NDg3OSAwLjg2NjY4NwordnQgMC42OTQ4NzkgMC44NzUzMjIKK3Z0IDAuNjk0NzI2IDAuODc1MzIyCit2dCAwLjMzNTQ4MiAwLjY5ODYyNQordnQgMC42MDc5ODUgMC44NzIyMDEKK3Z0IDAuMzMwOTY0IDAuNjc0MTIyCit2dCAwLjMzMTYxOCAwLjY3MTg3NgordnQgMC4zMzE3OTIgMC42NzIwNDUKK3Z0IDAuMzMxMjE5IDAuNjc0MjQyCit2dCAwLjMzMTIxOSAwLjY3NTY0MwordnQgMC4zMzA5NjUgMC42NzU2NDIKK3Z0IDAuNzY3MTc4IDAuNzcyNjU1Cit2dCAwLjc2NzE4MiAwLjc3MzM2MwordnQgMC43NjUxOTYgMC43NzMzODkKK3Z0IDAuNzY1MTkyIDAuNzcyNjgxCit2dCAwLjI2MDM0NyAwLjc5MzM2NwordnQgMC4yNjAzNDcgMC43OTI2NTkKK3Z0IDAuMjYyNDI2IDAuNzkyNjYyCit2dCAwLjI2MjQyNiAwLjc5MzM3MAordnQgMC4yNTkyMjggMC43OTMzNjcKK3Z0IDAuMjU5MjI4IDAuNzkyNjU5Cit2dCAwLjMzNTQ4NCAwLjY3MDE0NQordnQgMC4zMzU0ODQgMC42NzA0NTUKK3Z0IDAuMzMzMzUyIDAuNjcwODQ5Cit2dCAwLjMzMzIzOCAwLjY3MDYyMQordnQgMC4zMzE5OTUgMC42NzIyMjgKK3Z0IDAuMzMxNTA4IDAuNjc0MzY2Cit2dCAwLjMzMTUwOSAwLjY3NTY0NAordnQgMC4zMzMxNTQgMC42NzA0MjYKK3Z0IDAuMjYwNDgxIDAuNzkyMTI1Cit2dCAwLjI2MjYyMSAwLjc5MjEyOAordnQgMC4yNjI0NTMgMC43OTI2MTkKK3Z0IDAuMjYwMzYxIDAuNzkyNjE2Cit2dCAwLjI1OTIzMCAwLjc5MjEyNQordnQgMC4yNTkyMjggMC43OTI2MTYKK3Z0IDAuNzYzNzA0IDAuNzcyMjAxCit2dCAwLjc2NTA2MCAwLjc3MjE0MQordnQgMC43NjUxNzMgMC43NzI2MzcKK3Z0IDAuNzYzODcxIDAuNzcyNjk2Cit2dCAwLjI2MzczNiAwLjgwMzU2OAordnQgMC4yNjI0MjYgMC44MDM1NTkKK3Z0IDAuMjYzNzM2IDAuNzkzMzc4Cit2dCAwLjgxODY2NyAwLjE0NTE4NgordnQgMC44Njk0MDcgMC42MDEyMTgKK3Z0IDAuODY5NDI5IDAuNjA5ODUwCit2dCAwLjg2ODkzOCAwLjYwOTg1MAordnQgMC44MTg3ODQgMC4wMDUzMTMKK3Z0IDAuODE4ODk2IDAuMjUxNjY2Cit2dCAwLjgwNDE5NiAwLjg2Njk2NQordnQgMC44MDM0ODggMC44NjY5NjUKK3Z0IDAuODAzNDg4IDAuODU4MzMzCit2dCAwLjc2NzE3NyAwLjc3MjExMwordnQgMC43NjcxNzggMC43NzI2MTEKK3Z0IDAuOTIzNjgxIDAuNTIyNzg0Cit2dCAwLjkyMzc0NCAwLjUyNTAzMAordnQgMC45MjM3NDUgMC41MjY1NTAKK3Z0IDAuMjAyOTc5IDAuODc1MzIwCit2dCAwLjIwMzA2NCAwLjg3Njg3NQordnQgMC4yMDMwMDAgMC44NzY4NzUKK3Z0IDAuMjAyOTczIDAuODcyOTg0Cit2dCAwLjY2NTgzNiAwLjg2NzMzMgordnQgMC42NjU5MDAgMC44NjczMzIKK3Z0IDAuNjY1OTAwIDAuODc1OTY4Cit2dCAwLjIwMzI2NiAwLjgxNTg1NAordnQgMC43NjcyNDcgMC43ODM1NDYKK3Z0IDAuNzY1MjYxIDAuNzgzNTcxCit2dCAwLjI2MDM0NyAwLjgwMzU1NQordnQgMC4yNTkyMjggMC44MDM1NTUKK3Z0IDAuMjYzNzM2IDAuNzkyNjY5Cit2dCAwLjMzMDk2NCAwLjcxMTQ0NAordnQgMC4zODI5NTcgMC43NzUzNjEKK3Z0IDAuMzgyOTU3IDAuNzg1NTQ5Cit2dCAwLjM3NDMyNCAwLjc4NTU0OQordnQgMC4zMzIwMjcgMC42NzIyNTQKK3Z0IDAuMzMxNTY2IDAuNjc0Mzk0Cit2dCAwLjk1ODQzMiAwLjUwOTM0NgordnQgMC45NTg0MzIgMC41MTE0ODQKK3Z0IDAuMzMxNTY3IDAuNjc1NjQ0Cit2dCAwLjk0NzcxOCAwLjk2Mzg0MwordnQgMC45NDc3MTIgMC45NjIwMTQKK3Z0IDAuOTQ3NzU0IDAuOTYyMDEwCit2dCAwLjk0Nzc1NCAwLjk2Mzg1MgordnQgMC4zMzMzNzEgMC42NzA4ODEKK3Z0IDAuODI1MTU0IDAuNDEyMDg5Cit2dCAwLjM3MzQ0NiAwLjg2NzgwNwordnQgMC4zNzM0NzUgMC44NzY0MzgKK3Z0IDAuMzczNDMzIDAuODc2NDM4Cit2dCAwLjgyNTE2OSAwLjM1NjMwOAordnQgMC45MjM1MjggMC41MjUwMzAKK3Z0IDAuOTIzNTI4IDAuNTIyNzg0Cit2dCAwLjkyMzUyOCAwLjUyNjU1MAordnQgMC4yMDI4NDcgMC44NzY4NzUKK3Z0IDAuMjAyODI2IDAuODc1MzIwCit2dCAwLjg3NDYzNCAwLjA3NTM2OAordnQgMC44NzQ0ODEgMC4wNzUzNjgKK3Z0IDAuODc0NDgxIDAuMDY2NzMzCit2dCAwLjgxOTMzMSAwLjEwNDMzOQordnQgMC4zMzU0ODQgMC42Njk5MzMKK3Z0IDAuNzY1MDQxIDAuNzcyMDk3Cit2dCAwLjIwMjgyMCAwLjg3Mjk4NAordnQgMC4zNDA0ODIgMC42OTQ5NTYKK3Z0IDAuMzM5NTk2IDAuNjk3MDk3Cit2dCAwLjMzOTQyMSAwLjY5NjkyOAordnQgMC4zNDAyMjQgMC42OTQ4NDAKK3Z0IDAuMzQwMjI2IDAuNjkyOTEyCit2dCAwLjM0MDQ4MSAwLjY5MjkxMgordnQgMC4yMjk2OTQgMC43ODc4NzkKK3Z0IDAuMjI5Njk2IDAuNzg3MTcxCit2dCAwLjE5MDQyNSAwLjc5OTgyNgordnQgMC4xOTA0MjQgMC43OTkxMTcKK3Z0IDAuMTkyMzgwIDAuNzk5MTE4Cit2dCAwLjE5MjM4MSAwLjc5OTgyNgordnQgMC4xODg3NjUgMC43OTk4MjcKK3Z0IDAuMTg4NzY0IDAuNzk5MTE4Cit2dCAwLjMzNzc0MyAwLjY5Nzc5MwordnQgMC4zMzc4NTYgMC42OTgwMjIKK3Z0IDAuMzM5MjE5IDAuNjk2NzQ1Cit2dCAwLjMzOTkzOCAwLjY5NDcxNgordnQgMC4zMzk5MzcgMC42OTI5MTAKK3Z0IDAuMzM3OTM5IDAuNjk4MjIzCit2dCAwLjE5MDU1NyAwLjc5ODU4NAordnQgMC4xOTI1NzQgMC43OTg1ODUKK3Z0IDAuMTg4NzY1IDAuNzk4NTg1Cit2dCAwLjIyODA5MyAwLjc4NjY0OAordnQgMC4yMjk1NzAgMC43ODY2MzYKK3Z0IDAuMjI5Njc4IDAuNzg3MTI4Cit2dCAwLjIyODI1NSAwLjc4NzE0MQordnQgMC4yMjk2NzEgMC43OTgwNjkKK3Z0IDAuMjI4MjYyIDAuNzk4MDgwCit2dCAwLjIyODI4NSAwLjc4Nzg5MgordnQgMC4zNDAyMjYgMC42ODQyNzgKK3Z0IDAuODE4NDQ4IDAuMzE2NDc3Cit2dCAwLjgxODcwNCAwLjMxNjQ3NwordnQgMC44MTg3MDQgMC4zMjUxMTIKK3Z0IDAuMzM5OTM3IDAuNjg0Mjc3Cit2dCAwLjE4OTIzNCAwLjg2MDY4MAordnQgMC4xODkyNTUgMC44NjkzMTIKK3Z0IDAuMTg4NzY0IDAuODY5MzEyCit2dCAwLjgxODc4NCAwLjI3MTQwOAordnQgMC44MTg3ODQgMC4yODAwMzkKK3Z0IDAuODE4MjkzIDAuMjgwMDM5Cit2dCAwLjgxODE4OCAwLjE3MzU0MgordnQgMC44MTg4OTYgMC4xNzM1NDIKK3Z0IDAuODE4ODk2IDAuMTgyMTc0Cit2dCAwLjg1OTg5NCAwLjg2NjI5MQordnQgMC44NTkxODUgMC44NjYyOTEKK3Z0IDAuODU5MTg1IDAuODU3NjYwCit2dCAwLjkxODc1OCAwLjA0NTg3NwordnQgMC45MTg4MTkgMC4wNDgwMTkKK3Z0IDAuOTE4ODIyIDAuMDUwMDYyCit2dCAwLjYwODE1OCAwLjg3NDY2MAordnQgMC42MDgyNjggMC44NzYzMjYKK3Z0IDAuNjA4MjA0IDAuODc2MzI2Cit2dCAwLjg3NTc4MSAwLjIxMDU0MgordnQgMC44NzU3MTcgMC4yMTA1NDIKK3Z0IDAuODc1NzE3IDAuMjAxOTA2Cit2dCAwLjAwNTMxNCAwLjgxNTI4OAordnQgMC4wMDUzNzggMC44MTUyODgKK3Z0IDAuMDA1Mzc4IDAuODIzOTIzCit2dCAwLjE5MDQzMSAwLjgxMDAxNAordnQgMC4xOTIzODcgMC44MTAwMTUKK3Z0IDAuMTg4NzcxIDAuODEwMDE1Cit2dCAwLjIyODI4NiAwLjc4NzE4NAordnQgMC4zNjk4NTcgMC43MTgwMTUKK3Z0IDAuMzYzMjcwIDAuNzEwMjQyCit2dCAwLjM2OTg1NyAwLjcwNDY2MgordnQgMC4xNTQxODYgMC43ODM3MTIKK3Z0IDAuMTQ3NTk5IDAuNzc1OTM4Cit2dCAwLjE1NDE4NiAwLjc3MDM1OQordnQgMC45NjE2NTIgMC4wMjQ0MjEKK3Z0IDAuOTYxNjUyIDAuMDI2NDUxCit2dCAwLjk2MTYwOSAwLjAyNjQyNAordnQgMC45NjYwNzAgMC40MzUyMTUKK3Z0IDAuOTY2MDY2IDAuNDMzNTEwCit2dCAwLjgyNTE1NCAwLjQzOTk3NwordnQgMC44MjUxNTQgMC40NDg2MDgKK3Z0IDAuODI1MTExIDAuNDQ4NjA4Cit2dCAwLjY1NDYwMSAwLjg2Nzg3MQordnQgMC42NTQ2MjkgMC44NzY1MDMKK3Z0IDAuODI1MTY5IDAuMzg0MTk5Cit2dCAwLjgyNTE2OSAwLjM5MjgzMQordnQgMC44MjUxMTEgMC4zOTI4MzEKK3Z0IDAuOTE4NjAzIDAuMDQ4MDE5Cit2dCAwLjkxODYwNiAwLjA0NTg3OAordnQgMC45MTg2MDYgMC4wNTAwNjIKK3Z0IDAuNjA4MDUxIDAuODc2MzI3Cit2dCAwLjYwODAwNSAwLjg3NDY2MAordnQgMC4zODUyNTUgMC44NzUzMDgKK3Z0IDAuMzg1MTAyIDAuODc1MzA4Cit2dCAwLjM4NTEwMiAwLjg2NjY3MwordnQgMC4zNDUwMDAgMC44MTEwOTIKK3Z0IDAuMzQ1MTUzIDAuODExMDkyCit2dCAwLjM0NTE1MyAwLjgxOTcyNwordnQgMC4zNDA0ODIgMC42NzM1OTUKK3Z0IDAuMzQwMjI0IDAuNjczNzE1Cit2dCAwLjMzOTQyMiAwLjY3MTYxNwordnQgMC4zMzk1OTcgMC42NzE0NDgKK3Z0IDAuMzQwNDgxIDAuNjc1NjQ1Cit2dCAwLjM0MDIyNiAwLjY3NTY0NQordnQgMC43NjkyNjEgMC43NzI2NTMKK3Z0IDAuNzY5MjY1IDAuNzczMzYxCit2dCAwLjcyMDU2MCAwLjc5NzI2MgordnQgMC43MTg1ODMgMC43OTcyNjIKK3Z0IDAuNzE4NTgzIDAuNzk2NTU0Cit2dCAwLjcyMDU2MCAwLjc5NjU1MwordnQgMC43MjIyMDggMC43OTcyNjMKK3Z0IDAuNzIyMjA4IDAuNzk2NTU0Cit2dCAwLjMzNzgzMiAwLjY3MDUzMgordnQgMC4zMzc3MTkgMC42NzA3NjAKK3Z0IDAuMzM5OTM4IDAuNjczODM5Cit2dCAwLjMzOTIyMCAwLjY3MTgwMAordnQgMC4zMzk5MzcgMC42NzU2NDUKK3Z0IDAuMzM3OTM4IDAuNjcwMzM3Cit2dCAwLjcyMDQyNyAwLjc5NjAyMAordnQgMC43MjA1NDYgMC43OTY1MTAKK3Z0IDAuNzE4NTU3IDAuNzk2NTExCit2dCAwLjcxODM4OSAwLjc5NjAyMQordnQgMC43MjIyMDcgMC43OTYwMjEKK3Z0IDAuNzIyMjA4IDAuNzk2NTExCit2dCAwLjc3MDg2OSAwLjc3MjE0MgordnQgMC43NzA3MDYgMC43NzI2MzgKK3Z0IDAuNzY5Mjc5IDAuNzcyNjA5Cit2dCAwLjc2OTM5MCAwLjc3MjExMQordnQgMC43NjkzMzAgMC43ODM1NDMKK3Z0IDAuNzcwNjc4IDAuNzczMzkwCit2dCAwLjc3MDc0MyAwLjc4MzU3MQordnQgMC44MTg3MDQgMC4zMDc4NDUKK3Z0IDAuODE4Nzg0IDAuMjg4NjcwCit2dCAwLjc1MjA2NCAwLjg2OTMzMgordnQgMC43NTE1NzMgMC44NjkzMzIKK3Z0IDAuNzUxNTk4IDAuODYwNjk5Cit2dCAwLjIxNDYxOCAwLjg1NzU0OAordnQgMC4yMTQ2MTggMC44NjYxNzkKK3Z0IDAuMjEzOTEwIDAuODY2MTc5Cit2dCAwLjgxODg5NiAwLjE2NDkxMQordnQgMC45MTg1ODAgMC4wNzA5MzAKK3Z0IDAuOTE4NTc3IDAuMDY4Nzg0Cit2dCAwLjkxODU4MCAwLjA2NjczMwordnQgMC4yMDI5ODEgMC44NzA1MzYKK3Z0IDAuMjAzMDAwIDAuODY4ODkyCit2dCAwLjIwMzA2NCAwLjg2ODg5MgordnQgMC4wMDUzNzggMC44MDY2NTYKK3Z0IDAuNzkyMzQyIDAuODY3NjYzCit2dCAwLjc5MjM0MiAwLjg3NjI5NQordnQgMC43MjA1NTQgMC44MDc0NTAKK3Z0IDAuNzE4NTc3IDAuODA3NDUxCit2dCAwLjcyMjIwMiAwLjgwNzQ1MQordnQgMC43NzA2NzQgMC43NzI2ODIKK3Z0IDAuNDQ5ODYwIDAuNzgyOTQ5Cit2dCAwLjQ0MzI3MyAwLjc3NzM3MAordnQgMC40NDk4NjAgMC43Njk1OTYKK3Z0IDAuMzU2NjgzIDAuNzE1ODIxCit2dCAwLjk2MTE2MCAwLjIzNDQzMQordnQgMC45NjEyMDMgMC4yMzY0NDIKK3Z0IDAuMzM5ODgxIDAuNjczODY1Cit2dCAwLjkzNzAyNiAwLjk2MzI2MQordnQgMC45MzcwNjIgMC45NjMyNTgKK3Z0IDAuOTM3MDYyIDAuOTY0OTkzCit2dCAwLjkzNzAyMiAwLjk2NDk4MQordnQgMC4yNzgzNDAgMC44NzY0OTYKK3Z0IDAuMjc4MzI5IDAuODY3ODY1Cit2dCAwLjgyNTE1NCAwLjQ1NzI0MAordnQgMC44MjUxNjkgMC40MDE0NjQKK3Z0IDAuOTE4NDI0IDAuMDY4NzgzCit2dCAwLjkxODQyNyAwLjA3MDkzMAordnQgMC45MTg0MjcgMC4wNjY3MzMKK3Z0IDAuMjAyODQ3IDAuODY4ODkyCit2dCAwLjIwMjgyOSAwLjg3MDUzNgordnQgMC4zNDUxNTMgMC44MDI0NjAKK3Z0IDAuMDM2NDg1IDAuODY2Nzg1Cit2dCAwLjAzNjQ4NSAwLjg3NTQxNwordnQgMC4wMzYzMzMgMC44NzU0MTcKK3Z0IDAuOTY5MTM2IDAuNDUyMDIxCit2dCAwLjk2OTEzNiAwLjQ1MTU3MgordnQgMC45NjkzMTQgMC40NTE1NzIKK3Z0IDAuOTY5MzE0IDAuNDUyMDIxCit2dCAwLjkwMjI0OCAwLjQ5NTUyMgordnQgMC45MDI2NDggMC40OTU1MTkKK3Z0IDAuOTAyNjYzIDAuNDk1ODUyCit2dCAwLjkwMjI2NCAwLjQ5NTg1NQordnQgMC45Njg4NjggMC40NTIwMjAKK3Z0IDAuOTY4OTgxIDAuNDUxNTcyCit2dCAwLjkwMjE5OCAwLjQ5NTMyNwordnQgMC45MDE4NDkgMC40OTU1MjYKK3Z0IDAuOTAxNzk4IDAuNDk1MzI2Cit2dCAwLjkwMjYzOCAwLjQ5NjM5OAordnQgMC45MDIyMzkgMC40OTY0MDEKK3Z0IDAuOTAyNTQ4IDAuNDk2OTQ3Cit2dCAwLjkwMjE0OCAwLjQ5Njk1MQordnQgMC45MDIxMzEgMC40OTczMTkKK3Z0IDAuOTAyNTgzIDAuNDk3MzE1Cit2dCAwLjkwMjEyNSAwLjQ5Nzc0OAordnQgMC45MDI2MzEgMC40OTc3NDUKK3Z0IDAuOTAyNjUzIDAuNDk5Nzg2Cit2dCAwLjkwMjE2NiAwLjQ5OTc5MAordnQgMC45Nzg5NjkgMC4zODgwOTgKK3Z0IDAuOTc5MDY1IDAuMzg3NjQ5Cit2dCAwLjk2OTMxNCAwLjQ1MjQ2OQordnQgMC45NjkxMzYgMC40NTI1MTMKK3Z0IDAuOTY5MTM2IDAuNDUxNTI4Cit2dCAwLjk2OTMxNCAwLjQ1MTUyOAordnQgMC45MDE4NjQgMC40OTU4NTgKK3Z0IDAuOTAxODI2IDAuNDk1ODU4Cit2dCAwLjkwMjY4NyAwLjQ5NTUxOQordnQgMC45Njg5ODEgMC40NTI1MTIKK3Z0IDAuOTY4OTgxIDAuNDUxNTI4Cit2dCAwLjkwMjU5NyAwLjQ5NTMyNwordnQgMC45MDE4MzkgMC40OTY0MDQKK3Z0IDAuOTAyNjc3IDAuNDk2Mzk4Cit2dCAwLjkwMTc0OCAwLjQ5Njk1NAordnQgMC45MDI1ODcgMC40OTY5NDcKK3Z0IDAuOTAxNjgwIDAuNDk3MzIyCit2dCAwLjkwMTY0MiAwLjQ5NzMyMwordnQgMC45MDE2MjAgMC40OTc3NTIKK3Z0IDAuOTAyNjgxIDAuNDk3NzQ0Cit2dCAwLjkwMTY3OSAwLjQ5OTc5NAordnQgMC45MDE2MjkgMC40OTk3OTUKK3Z0IDAuOTc5MDY1IDAuMzg4NTkxCit2dCAwLjk3OTA2NSAwLjM4ODU0NwordnQgMC45NDYyODYgMC43NDM5MDgKK3Z0IDAuOTQ2MTYyIDAuNzQ0MjcwCit2dCAwLjk0NjAxOSAwLjc0NDIyMQordnQgMC45NDYxNDMgMC43NDM4NTkKK3Z0IDAuMjQyNTkxIDAuOTA4NTcwCit2dCAwLjI0Mjg4NSAwLjkwODU2OQordnQgMC4yNDI4OTcgMC45MDg4NTIKK3Z0IDAuMjQyNjA0IDAuOTA4ODUyCit2dCAwLjk0NjU0NyAwLjc0NDAxNQordnQgMC45NDYyODggMC43NDQzMTMKK3Z0IDAuOTQ1OTU1IDAuNzQzODA0Cit2dCAwLjk0NjE3MCAwLjc0MzQ2MwordnQgMC4yNDIxOTggMC45MDg1NjYKK3Z0IDAuMjQyMTU3IDAuOTA4Mzk4Cit2dCAwLjI0MjUwMSAwLjkwODQwMwordnQgMC4yNDI4NzYgMC45MDkzMTgKK3Z0IDAuMjQyNTgyIDAuOTA5MzE4Cit2dCAwLjI0MjgwMSAwLjkwOTc4OQordnQgMC4yNDI0NTggMC45MDk3ODcKK3Z0IDAuMjQyNDQ0IDAuOTEwMTAyCit2dCAwLjI0MjgzMiAwLjkxMDEwNAordnQgMC4yNDI0MzkgMC45MTA0NjgKK3Z0IDAuMjQyODc0IDAuOTEwNDcxCit2dCAwLjI0Mjg4OCAwLjkxMjIwNwordnQgMC4yNDI0NzAgMC45MTIyMDYKK3Z0IDAuOTgyNzc5IDAuMDg3NTA1Cit2dCAwLjk4MjkxNCAwLjA4NzEwNgordnQgMC45NDYyNjYgMC43NDM0OTcKK3Z0IDAuOTQ2NDIxIDAuNzQzNTEyCit2dCAwLjk0NjE1MCAwLjc0NDMwNQordnQgMC45NDYwMDcgMC43NDQyNTYKK3Z0IDAuMjQyMjEwIDAuOTA4ODQ4Cit2dCAwLjk0NjU0NyAwLjc0MzU1NAordnQgMC4yNDI4NDQgMC45MDg0MDgKK3Z0IDAuMjQyODc4IDAuOTA4NDA4Cit2dCAwLjI0MjEyNCAwLjkwODM5NwordnQgMC4yNDIxODkgMC45MDkzMTUKK3Z0IDAuMjQyMTE0IDAuOTA5Nzg2Cit2dCAwLjI0MjA1NiAwLjkxMDEwMAordnQgMC4yNDIwMjMgMC45MTAxMDAKK3Z0IDAuMjQyODcwIDAuOTEwMTA0Cit2dCAwLjI0MjAwNCAwLjkxMDQ2NgordnQgMC4yNDIwNTEgMC45MTIyMDQKK3Z0IDAuMjQyMDA4IDAuOTEyMjA0Cit2dCAwLjk4MjkxNCAwLjA4NzkwOAordnQgMC45NzM4MTAgMC4zMDc4ODQKK3Z0IDAuOTczOTg3IDAuMzA3ODg0Cit2dCAwLjk3Mzk4NyAwLjMwODc2MwordnQgMC45NzM4MDkgMC4zMDg3NjMKK3Z0IDAuMTc3OTM0IDAuODg2NDM3Cit2dCAwLjE3ODExMiAwLjg4NjQwMAordnQgMC4xNzc5MzUgMC44ODY0NzYKK3Z0IDAuMjc4NDc3IDAuODkzNDk1Cit2dCAwLjI3ODY1MyAwLjg5MzUzMQordnQgMC4yNzg2NTMgMC44OTM1NzAKK3Z0IDAuOTczODEwIDAuMzA3ODQ1Cit2dCAwLjk3Mzk4NyAwLjMwNzg0NQordnQgMC45NzM2NzUgMC4zMDg3NjQKK3Z0IDAuOTczNjc2IDAuMzA3ODg0Cit2dCAwLjE3NzgxOSAwLjg4NjYwMQordnQgMC4yNzgzNDQgMC44OTM0MDQKK3Z0IDAuMjc4MzY5IDAuODkzMzczCit2dCAwLjk3MzY3NiAwLjMwNzg0NQordnQgMC4wMTg2MzMgMC44ODM0NjUKK3Z0IDAuMDE4NjMzIDAuODgzMjE5Cit2dCAwLjAxOTUxMyAwLjg4MzIwNQordnQgMC4wMTk1MTMgMC44ODM0NTMKK3Z0IDAuMTc3Nzg3IDAuODg2ODM3Cit2dCAwLjI3ODI5NyAwLjg5MzE1NgordnQgMC4yNzgzMjggMC44OTMxMzQKK3Z0IDAuMDE5NTUyIDAuODgzMjA0Cit2dCAwLjAxOTU1MiAwLjg4MzQ1MgordnQgMC4wMTg2MzMgMC44NzcxNjQKK3Z0IDAuMDE5NTEzIDAuODc3MTY0Cit2dCAwLjE3ODExMiAwLjg5Mjg2OAordnQgMC4yNzg2MTYgMC44ODcxMjEKK3Z0IDAuMjc4NjUzIDAuODg3MTIyCit2dCAwLjAxOTU1MiAwLjg3NzE2NAordnQgMC4xNzc4NjggMC45NzI2OTAKK3Z0IDAuMTc4MDQ1IDAuOTcyNjkwCit2dCAwLjE3ODA0NSAwLjk3MzU3MAordnQgMC4xNzc4NjcgMC45NzM1NzAKK3Z0IDAuNjY2MDE1IDAuODg2NjI5Cit2dCAwLjY2NjE5MiAwLjg4NjU5MwordnQgMC42NjYwMTUgMC44ODY2NjgKK3Z0IDAuNjU0NzY2IDAuODkzNTAyCit2dCAwLjY1NDk0MyAwLjg5MzUzOAordnQgMC42NTQ5NDIgMC44OTM1NzcKK3Z0IDAuMTc3NzMzIDAuOTczNTcwCit2dCAwLjE3NzczNCAwLjk3MjY5MQordnQgMC42NjU5MDAgMC44ODY3OTMKK3Z0IDAuNjU0NjMzIDAuODkzNDExCit2dCAwLjY1NDY1OCAwLjg5MzM4MAordnQgMC44MDQ0MDcgMC44Nzc1OTAKK3Z0IDAuODA0NDA3IDAuODc3ODM2Cit2dCAwLjgwMzUyNyAwLjg3Nzg1MQordnQgMC44MDM1MjcgMC44Nzc2MDIKK3Z0IDAuNjY1ODY3IDAuODg3MDI5Cit2dCAwLjY2NTgzNiAwLjg4NzAwNwordnQgMC42NTQ1ODYgMC44OTMxNjIKK3Z0IDAuNjU0NjE3IDAuODkzMTQxCit2dCAwLjgwNDQwNyAwLjg4Mzg5MQordnQgMC44MDM1MjcgMC44ODM4OTEKK3Z0IDAuNjY2MTkyIDAuODkzMDYxCit2dCAwLjY1NDkwNSAwLjg4NzEyOAordnQgMC45NzQxMjQgMC4yMDE5NDUKK3Z0IDAuOTc0MzAyIDAuMjAxOTQ1Cit2dCAwLjk3NDMwMiAwLjIwMjgyNQordnQgMC45NzQxMjQgMC4yMDI4MjUKK3Z0IDAuNjQzMzE2IDAuODg2ODkzCit2dCAwLjY0MzQ5NCAwLjg4Njg1NwordnQgMC42MTkyMDEgMC44OTM3MzkKK3Z0IDAuNjE5Mzc4IDAuODkzNzc1Cit2dCAwLjYxOTIwMCAwLjg5Mzc3OAordnQgMC45NzQzMDIgMC4yMDI4NjQKK3Z0IDAuOTc0MTI0IDAuMjAyODY0Cit2dCAwLjk3Mzk5MCAwLjIwMjgyNQordnQgMC45NzM5OTAgMC4yMDE5NDYKK3Z0IDAuNjQzMjAyIDAuODg3MDU3Cit2dCAwLjY0MzE4NCAwLjg4NzAyNgordnQgMC42MTkwNjkgMC44OTM2NDgKK3Z0IDAuOTczOTkwIDAuMjAyODY1Cit2dCAwLjcxOTMwOCAwLjg3NzUxMAordnQgMC43MTkzMDggMC44Nzc3NTYKK3Z0IDAuNzE4NDI4IDAuODc3NzcwCit2dCAwLjcxODQyOCAwLjg3NzUyMgordnQgMC42NDMxNjkgMC44ODcyOTMKK3Z0IDAuNjQzMTM4IDAuODg3MjcxCit2dCAwLjYxOTAyMiAwLjg5MzM5OQordnQgMC42MTkwNTMgMC44OTMzNzgKK3Z0IDAuNzE5MzA4IDAuODgzODEwCit2dCAwLjcxODQyOCAwLjg4MzgxMAordnQgMC42NDM0OTQgMC44OTMzMjUKK3Z0IDAuNjE5MzQwIDAuODg3MzY1Cit2dCAwLjYxOTM3OCAwLjg4NzM2NgordnQgMC45NzQzMzUgMC4zMjEwNzMKK3Z0IDAuOTc0NTEzIDAuMzIxMDczCit2dCAwLjk3NDUxMyAwLjMyMTk1MwordnQgMC45NzQzMzUgMC4zMjE5NTMKK3Z0IDAuNzgxNDczIDAuODg2NzYxCit2dCAwLjc4MTY1MCAwLjg4NjcyNQordnQgMC43ODE2NTEgMC44ODY3NjQKK3Z0IDAuMjAzMDAwIDAuODkzODc0Cit2dCAwLjIwMzE3NiAwLjg5MzkxMQordnQgMC45NzQzMzYgMC4zMjEwMzQKK3Z0IDAuOTc0NTEzIDAuMzIxMDM0Cit2dCAwLjk3NDIwMSAwLjMyMTk1MwordnQgMC45NzQyMDIgMC4zMjEwNzQKK3Z0IDAuNzgxMzU4IDAuODg2OTI1Cit2dCAwLjc4MTM0MSAwLjg4Njg5MwordnQgMC4yMDI4NjcgMC44OTM3ODMKK3Z0IDAuOTc0MjAyIDAuMzIxMDM1Cit2dCAwLjgyNDU5MiAwLjg4NDE3MgordnQgMC44MjQ1OTIgMC44ODM5MjYKK3Z0IDAuODI1NDcyIDAuODgzOTExCit2dCAwLjgyNTQ3MiAwLjg4NDE2MAordnQgMC43ODEzMjYgMC44ODcxNjEKK3Z0IDAuNzgxMjk0IDAuODg3MTM5Cit2dCAwLjIwMjgyMCAwLjg5MzUzNQordnQgMC4yMDI4NTEgMC44OTM1MTMKK3Z0IDAuODI0NTkyIDAuODc3ODcxCit2dCAwLjgyNTQ3MiAwLjg3Nzg3MQordnQgMC43ODE2NTEgMC44OTMxOTMKK3Z0IDAuNzgxNjE0IDAuODkzMTkzCit2dCAwLjIwMzEzOSAwLjg4NzUwMQordnQgMC4yMDMxNzYgMC44ODc1MDEKK3Z0IDAuMDA1NDkyIDAuOTcyNjI1Cit2dCAwLjAwNTQ5MiAwLjk3MzUwNAordnQgMC4wMDUzMTQgMC45NzM1MDUKK3Z0IDAuMDA1MzE0IDAuOTcyNjI1Cit2dCAwLjM1Njg2MiAwLjg5MzQ4MQordnQgMC4zNTY4NjMgMC44OTM0NDIKK3Z0IDAuMzU3MDQwIDAuODkzNDc5Cit2dCAwLjM3MzYxMiAwLjg4NzEzOQordnQgMC4zNzM3ODggMC44ODcwNjQKK3Z0IDAuMDA1NjI2IDAuOTcyNjI0Cit2dCAwLjAwNTYyNiAwLjk3MzUwNAordnQgMC4zNTY3MzAgMC44OTMzNDkKK3Z0IDAuMzczNTA1IDAuODg3MjYxCit2dCAwLjM3MzQ3OSAwLjg4NzIzMAordnQgMC44MzYxNzcgMC44Nzc0NjUKK3Z0IDAuODM3MDU3IDAuODc3NDc2Cit2dCAwLjgzNzA1NyAwLjg3NzcyNQordnQgMC44MzYxNzcgMC44Nzc3MTAKK3Z0IDAuMzU2NjgzIDAuODkzMTAzCit2dCAwLjM3MzQ2MyAwLjg4NzUwMAordnQgMC4zNzM0MzMgMC44ODc0NzgKK3Z0IDAuODM2MTM4IDAuODc3NDY0Cit2dCAwLjgzNjEzOCAwLjg3NzcxMAordnQgMC44MzcwNTcgMC44ODM3NjUKK3Z0IDAuODM2MTc3IDAuODgzNzY1Cit2dCAwLjM1NzAwMyAwLjg4NzA1MwordnQgMC4zNzM3ODkgMC44OTM1MTYKK3Z0IDAuODM2MTM4IDAuODgzNzY1Cit2dCAwLjM1Njg2MiAwLjk3MjUwNgordnQgMC4zNTY4NjEgMC45NzMzODYKK3Z0IDAuMzU2NjgzIDAuOTczMzg2Cit2dCAwLjM1NjY4NCAwLjk3MjUwNgordnQgMC43OTI0NTcgMC44OTMzNDgKK3Z0IDAuNzkyNjM1IDAuODkzMzQ2Cit2dCAwLjc5MjYzNCAwLjg5MzM4NQordnQgMC40NDM0NTMgMC44ODcxNzgKK3Z0IDAuNDQzNDUyIDAuODg3MTM5Cit2dCAwLjQ0MzYyOSAwLjg4NzEwMwordnQgMC4zNTY5OTYgMC45NzI1MDYKK3Z0IDAuMzU2OTk2IDAuOTczMzg2Cit2dCAwLjc5MjMyNSAwLjg5MzIxNgordnQgMC40NDMzNDUgMC44ODczMDAKK3Z0IDAuODU5ODU0IDAuODgzMjE3Cit2dCAwLjg1ODk3NSAwLjg4MzIwNQordnQgMC44NTg5NzUgMC44ODI5NTcKK3Z0IDAuODU5ODU0IDAuODgyOTcxCit2dCAwLjc5MjI3OCAwLjg5Mjk3MAordnQgMC43OTIzMDkgMC44OTI5NDkKK3Z0IDAuNDQzMzA0IDAuODg3NTM5Cit2dCAwLjg1ODkzNiAwLjg4MzIwNAordnQgMC44NTg5MzYgMC44ODI5NTYKK3Z0IDAuODU4OTc1IDAuODc2OTE2Cit2dCAwLjg1OTg1NCAwLjg3NjkxNwordnQgMC43OTI1OTcgMC44ODY5MjAKK3Z0IDAuNDQzNjI5IDAuODkzNTU1Cit2dCAwLjg1ODkzNiAwLjg3NjkxNgordnQgMC42NTQ3NjUgMC45NzI0MTYKK3Z0IDAuNjU0NzY0IDAuOTczMjk2Cit2dCAwLjY1NDU4NiAwLjk3MzI5NgordnQgMC42NTQ1ODcgMC45NzI0MTYKK3Z0IDAuNzA3NDk1IDAuODkzMzQzCit2dCAwLjcwNzY3MyAwLjg5MzM0MAordnQgMC43MDc2NzIgMC44OTMzNzkKK3Z0IDAuNDE0NTYxIDAuODg3MTQ2Cit2dCAwLjQxNDczNyAwLjg4NzA3MQordnQgMC42NTQ4OTkgMC45NzI0MTYKK3Z0IDAuNjU0ODk5IDAuOTczMjk1Cit2dCAwLjcwNzM2MyAwLjg5MzIxMAordnQgMC40MTQ0NTMgMC44ODcyNjgKK3Z0IDAuNDE0NDI4IDAuODg3MjM3Cit2dCAwLjI2MDE0NyAwLjg4MzA5MwordnQgMC4yNTkyNjcgMC44ODMwODEKK3Z0IDAuMjU5MjY3IDAuODgyODMzCit2dCAwLjI2MDE0NyAwLjg4Mjg0NwordnQgMC43MDczMTYgMC44OTI5NjQKK3Z0IDAuNzA3MzQ3IDAuODkyOTQzCit2dCAwLjQxNDQxMiAwLjg4NzUwNwordnQgMC4yNjAxODYgMC44ODMwOTQKK3Z0IDAuMjYwMTg2IDAuODgyODQ4Cit2dCAwLjI1OTIyOCAwLjg4MzA4MQordnQgMC4yNTkyMjggMC44ODI4MzIKK3Z0IDAuMjU5MjY3IDAuODc2NzkzCit2dCAwLjI2MDE0NyAwLjg3Njc5MwordnQgMC43MDc2MzUgMC44ODY5MTQKK3Z0IDAuNzA3NjczIDAuODg2OTE1Cit2dCAwLjQxNDczNyAwLjg5MzUyMwordnQgMC4yNjAxODYgMC44NzY3OTMKK3Z0IDAuMjU5MjI4IDAuODc2NzkzCit2dCAwLjYxOTE1MSAwLjk3MjMwNAordnQgMC42MTkxNTEgMC45NzMxODMKK3Z0IDAuNjE4OTczIDAuOTczMTg0Cit2dCAwLjYxODk3NCAwLjk3MjMwNAordnQgMC42MDgxNjQgMC44OTMzODAKK3Z0IDAuNjA4MTY1IDAuODkzMzQxCit2dCAwLjYwODM0MiAwLjg5MzM3NwordnQgMC4zNDMyMDIgMC44ODcxNDgKK3Z0IDAuMzQzMzc4IDAuODg3MDcyCit2dCAwLjYxOTI4NSAwLjk3MjMwMwordnQgMC42MTkyODUgMC45NzMxODMKK3Z0IDAuNjA4MDMyIDAuODkzMjQ4Cit2dCAwLjM0MzA5NSAwLjg4NzI3MAordnQgMC4zNDMwNjkgMC44ODcyMzkKK3Z0IDAuMjE0ODI5IDAuODgzMTA1Cit2dCAwLjIxMzk0OSAwLjg4MzA5MwordnQgMC4yMTM5NDkgMC44ODI4NDUKK3Z0IDAuMjE0ODI5IDAuODgyODU5Cit2dCAwLjYwNzk4NSAwLjg5MzAwMgordnQgMC4zNDMwNTMgMC44ODc1MDkKK3Z0IDAuMzQzMDIzIDAuODg3NDg3Cit2dCAwLjIxNDg2OCAwLjg4MzEwNgordnQgMC4yMTQ4NjggMC44ODI4NjAKK3Z0IDAuMjEzOTQ5IDAuODc2ODA1Cit2dCAwLjIxNDgyOSAwLjg3NjgwNQordnQgMC42MDgzMDUgMC44ODY5NTIKK3Z0IDAuMzQzMzc5IDAuODkzNTI1Cit2dCAwLjM0MzM0MSAwLjg5MzUyNQordnQgMC4yMTQ4NjggMC44NzY4MDUKK3Z0IDAuMzM1Njg5IDAuNzQ2ODQzCit2dCAwLjMzMzI2OSAwLjc0Njg2NAordnQgMC4zMzMyNDUgMC43Mzc2NzEKK3Z0IDAuMzM1Njg2IDAuNzM3NjUwCit2dCAwLjE5MTYwNCAwLjc1NDIxNgordnQgMC4xOTQxMTkgMC43NTQyMTIKK3Z0IDAuMTk0MTIwIDAuNzYzNDExCit2dCAwLjE5MTYwNCAwLjc2MzQxNQordnQgMC43MjExNjQgMC43NTE2NDgKK3Z0IDAuNzI0MDY1IDAuNzUxNjQ5Cit2dCAwLjcyNDAzNCAwLjc2MDg0OAordnQgMC43MjExMzMgMC43NjA4NDYKK3Z0IDAuMjgxMTU4IDAuNzgzMDAxCit2dCAwLjI4Mzc5MSAwLjc4Mjk5OQordnQgMC4yODM3OTEgMC43OTIxOTgKK3Z0IDAuMjgxMTU4IDAuNzkyMjAwCit2dCAwLjk1NDY5OCAwLjE0OTU0MQordnQgMC45NTQ3MDAgMC4xNDcwOTQKK3Z0IDAuOTU0NzYwIDAuMTQ3MDczCit2dCAwLjk1NDc2MCAwLjE0OTU1NgordnQgMC4xODkwMTYgMC43NjM0MTEKK3Z0IDAuOTUwOTE4IDAuMDI3MDI3Cit2dCAwLjk1MDkxOSAwLjAyNDQ0MAordnQgMC45NTA5ODEgMC4wMjQ0MjEKK3Z0IDAuOTUwOTgxIDAuMDI3MDQyCit2dCAwLjcxODY4MyAwLjc2MDgyOQordnQgMC45NTE1NTIgMC4wNDg0MjkKK3Z0IDAuOTUxNTUzIDAuMDQ1ODk1Cit2dCAwLjI3ODYxNCAwLjc5MjE5OAordnQgMC45MzcwMjQgMC45NTI2MTMKK3Z0IDAuOTM3MDIyIDAuOTUwMTI3Cit2dCAwLjkzNzA4NSAwLjk1MDExMgordnQgMC45MzcwODUgMC45NTI2MzMKK3Z0IDAuMzM4NTYwIDAuNzM3NjcyCit2dCAwLjMzMTQ4MSAwLjc0NjkyOAordnQgMC4zMzE0NzggMC43Mzc3MzYKK3Z0IDAuMTg5MDE2IDAuNzU0MjEyCit2dCAwLjE5NTk4NyAwLjc1NDIwMAordnQgMC4xOTU5ODcgMC43NjMzOTkKK3Z0IDAuNzE4NzE0IDAuNzUxNjMxCit2dCAwLjcyNTkwOSAwLjc1MTYyOQordnQgMC43MjU4NzggMC43NjA4MjcKK3Z0IDAuMjc4NjE0IDAuNzgyOTk5Cit2dCAwLjMzODU2MyAwLjc0Njg2NQordnQgMC4zNDAzODQgMC43NDY5MjgKK3Z0IDAuMDI1ODg4IDAuNzAyNjUzCit2dCAwLjAyMjk0MyAwLjcwMzU0NwordnQgMC4wMjI5MzYgMC42ODk1NjAKK3Z0IDAuMDI1ODgxIDAuNjg5NTYwCit2dCAwLjAyNjkyMiAwLjcwMDc3MAordnQgMC4wMjY5MjIgMC42ODk1NjAKK3Z0IDAuMDIwNTA3IDAuNzAzMDIyCit2dCAwLjAyMDUxMCAwLjY4OTU2MAordnQgMC4wMTg2MDEgMC43MDEyNjYKK3Z0IDAuMDE4NTk0IDAuNjg5NTYwCit2dCAwLjAyNTg4OCAwLjY3NjU3NQordnQgMC4wMjI5NDcgMC42NzU2NzcKK3Z0IDAuMDI2OTIyIDAuNjc4NzEyCit2dCAwLjAyMDUwNyAwLjY3NjIwNQordnQgMC4wMTg2MDUgMC42Nzc4NTQKK3Z0IDAuNjgyNDQ5IDAuNDIwMzMxCit2dCAwLjY4Mjg2NyAwLjQyMDMzMQordnQgMC42ODI5NDMgMC40Mjg3NzEKK3Z0IDAuNjgyNTI1IDAuNDI4NzcxCit2dCAwLjY4MjQyMSAwLjQwOTk4NgordnQgMC42ODI4MzkgMC40MDk5ODYKK3Z0IDAuODc0MzE1IDAuMDMyODY3Cit2dCAwLjg3Mzg5NyAwLjAzMjg2NwordnQgMC44NzM5MzggMC4wMjQ0MjEKK3Z0IDAuMzU3MjY3IDAuNDYzNDY0Cit2dCAwLjM1Njg0OSAwLjQ2MzQ2NAordnQgMC4zNTY4OTEgMC40NTUwMTgKK3Z0IDAuMzU3MjUwIDAuNDczNzg2Cit2dCAwLjM1NjgzMiAwLjQ3Mzc4NgordnQgMC4zNTcyNDcgMC40ODc2MTcKK3Z0IDAuMzU2ODI5IDAuNDg3NjE3Cit2dCAwLjM1Njc5OSAwLjYzNzI1MgordnQgMC4zNTcyMTcgMC42MzcyNTIKK3Z0IDAuMzU3MjMwIDAuNjQ3NjE2Cit2dCAwLjM1NjgxMiAwLjY0NzYxNgordnQgMC4zNTcyNjkgMC42NTYyMTYKK3Z0IDAuMzU2ODUxIDAuNjU2MjE2Cit2dCAwLjg3NDQ2MSAwLjA1NDE5MQordnQgMC44NzQwNDMgMC4wNTQxNjgKK3Z0IDAuODc0NDYxIDAuMDQ1ODc3Cit2dCAwLjcyMDMyMyAwLjQyMDIyOQordnQgMC43MjA3NDEgMC40MjAyMjkKK3Z0IDAuNzIwNzkwIDAuNDI4NTMwCit2dCAwLjcyMDMwNSAwLjQwOTk0MQordnQgMC43MjA3MjMgMC40MDk5NDEKK3Z0IDAuNzIwMzA1IDAuMzk0ODk0Cit2dCAwLjcyMDcyMyAwLjM5NDg5NQordnQgMC42ODI0MjEgMC4zOTQ5MzMKK3Z0IDAuNjgyODM5IDAuMzk0OTMzCit2dCAwLjcyMDcyMyAwLjE5MTMyNQordnQgMC43MjAzMDUgMC4xOTEzMjUKK3Z0IDAuNzIwMzA2IDAuMDM5MzQ5Cit2dCAwLjcyMDcyNCAwLjAzOTM0OQordnQgMC4zNTY4MDQgMC42MTA3NjIKK3Z0IDAuMzU3MjIyIDAuNjEwNzYyCit2dCAwLjM1NzIyMiAwLjYxNDc2NQordnQgMC4zNTY4MDQgMC42MTQ3NjUKK3Z0IDAuNjk0MTIyIDAuNDIwMzMzCit2dCAwLjY5NjI0OCAwLjQxOTgyMwordnQgMC42OTYzMjEgMC40Mjc4OTUKK3Z0IDAuNjk0MTk4IDAuNDI4Nzc0Cit2dCAwLjY5NDA5NCAwLjQwOTk4OAordnQgMC42OTYyMjIgMC40MDk5NjUKK3Z0IDAuNjk0MDk0IDAuMzk0OTM2Cit2dCAwLjY5NjIyMiAwLjM5NDkxNwordnQgMC42OTQwOTQgMC4zNTA2MzYKK3Z0IDAuNjk0MDk0IDAuMzQ3MjEyCit2dCAwLjY5NjIyMiAwLjM0NzE5NAordnQgMC42OTYyMjIgMC4zNTA2MTcKK3Z0IDAuNzA5MDUwIDAuMTkxMzIxCit2dCAwLjcwNjk0OSAwLjE5MTI3MwordnQgMC43MDY5NDkgMC4wMzkyOTcKK3Z0IDAuNzA5MDUwIDAuMDM5MzQ1Cit2dCAwLjcwOTA0OSAwLjM5NDg5MQordnQgMC43MDkwNDkgMC40MDk5MzcKK3Z0IDAuNzA2OTQ5IDAuNDA5ODg3Cit2dCAwLjcwNjk0OSAwLjM5NDg0MgordnQgMC43MDkwNjcgMC40MjAyMjYKK3Z0IDAuNzA2OTY2IDAuNDE5Njg4Cit2dCAwLjcwOTExNyAwLjQyODUyNgordnQgMC43MDcwMTIgMC40Mjc2MzYKK3Z0IDAuMzY4NDg2IDAuNjQ3NjE3Cit2dCAwLjM3MDYwNiAwLjY0NzE2NwordnQgMC4zNzA2NDIgMC42NTUzODAKK3Z0IDAuODQwMDc1IDAuMTI4NzQzCit2dCAwLjg0MjE5NyAwLjEyNzkxNgordnQgMC44NDIxOTcgMC4xMzY1MTYKK3Z0IDAuMzY4NDczIDAuNjM3MjUzCit2dCAwLjM3MDU5MyAwLjYzNzI1MwordnQgMC4zNjg0NzggMC42MTQ3NjYKK3Z0IDAuMzcwNTk4IDAuNjE0NzgyCit2dCAwLjM2ODQ3OCAwLjYxMDc2MgordnQgMC4zNzA1OTkgMC42MTA3NzkKK3Z0IDAuMzY4NTAzIDAuNDg3NjE4Cit2dCAwLjM2ODUwNiAwLjQ3Mzc4OAordnQgMC4zNzA2MjYgMC40NzM5ODQKK3Z0IDAuMzcwNjIzIDAuNDg3NjM0Cit2dCAwLjM2ODUyMyAwLjQ2MzQ2NQordnQgMC4zNzA2NDIgMC40NjM5NTYKK3Z0IDAuMzg2OTY1IDAuODM0OTA0Cit2dCAwLjM4NTEwMiAwLjgzMzU2NwordnQgMC4zODY5NjUgMC44MjU3MjkKK3Z0IDAuMzY4NTY1IDAuNDU1MDE5Cit2dCAwLjg0NzQxNiAwLjYyNzEyMAordnQgMC44NDgzMTIgMC42MjY5NDUKK3Z0IDAuODQ4MzEyIDAuNjM2NzgwCit2dCAwLjI5Mzk5NyAwLjQ1NTAxOAordnQgMC4yOTQzNTEgMC40NTU4NjEKK3Z0IDAuMjg2NDkwIDAuNDYxMTY1Cit2dCAwLjAxODU5NCAwLjgzNzM3NwordnQgMC4wMTk0OTAgMC44MzcxOTcKK3Z0IDAuMDE5NDkwIDAuODQ3MjgzCit2dCAwLjgwNDM0OCAwLjg0NzcwOAordnQgMC44MDM0ODggMC44NDc0NTUKK3Z0IDAuODA0MzQ4IDAuODM3NzYyCit2dCAwLjI5ODQ1NCAwLjgyMzk0OQordnQgMC4yOTc1NTcgMC44MjM5NDkKK3Z0IDAuMjk3NTc0IDAuODA4ODk5Cit2dCAwLjA0OTUyMiAwLjY1MzA2MwordnQgMC4wNTA0MTggMC42NTMwNzkKK3Z0IDAuMDUwMTQxIDAuNjY4MTI2Cit2dCAwLjc3MzgzOCAwLjMwMjkyMwordnQgMC43NzM4NDcgMC4zMDMzODAKK3Z0IDAuNzcyOTUxIDAuMzAzMzk3Cit2dCAwLjc3Mjk0MiAwLjMwMjk0MAordnQgMC4xMjA4NjIgMC42NjEyNjUKK3Z0IDAuMTE5OTY1IDAuNjYxMjU5Cit2dCAwLjEyMDg2MiAwLjUwOTE3NwordnQgMC43Njc0ODMgMC41ODQ5NjIKK3Z0IDAuNzY4MzgwIDAuNTg0OTYyCit2dCAwLjc2ODM4MSAwLjczNzA0NwordnQgMC4yMjg5ODggMC44MjM3ODYKK3Z0IDAuMjI4MDkzIDAuODA4NzU4Cit2dCAwLjIyODk4OCAwLjgwODcwNQordnQgMC43NjgzNzggMC4zNjYxOTIKK3Z0IDAuNzY4Mzc4IDAuMzgxMjQ3Cit2dCAwLjc2NzQ4MSAwLjM4MTI0NwordnQgMC44NDY1NzMgMC43NTUxNTUKK3Z0IDAuODQ3NDUyIDAuNzU0OTc5Cit2dCAwLjg0NzQ1MiAwLjc2NTA1OQordnQgMC43Njk0NjQgMC4zNTYzMDgKK3Z0IDAuNzcwMzA3IDAuMzU2NjYxCit2dCAwLjgyNDYxMyAwLjgzODc4NAordnQgMC44MjU1MTAgMC44Mzg2MDgKK3Z0IDAuODI1NTEwIDAuODQ4NDMyCit2dCAwLjc1MjQ0MCAwLjg1MDA3NAordnQgMC43NTE1NzMgMC44NDk4MTAKK3Z0IDAuNzUyNDQwIDAuODQwMzg1Cit2dCAwLjg0NzkwNyAwLjU3NTk1MwordnQgMC44NDg3OTggMC41NzU3ODYKK3Z0IDAuODQ4Nzk4IDAuNTg1NTk5Cit2dCAwLjI4MDU4MSAwLjY1MTg4MAordnQgMC4yODE0MjQgMC42NTE1MjcKK3Z0IDAuMjg2NzEyIDAuNjU5MzgxCit2dCAwLjgzNjEzOCAwLjgzNjkyOQordnQgMC44MzcwMzUgMC44MzY3NTQKK3Z0IDAuODM3MDM1IDAuODQ2ODUxCit2dCAwLjI3ODUzMSAwLjY0MTk5MwordnQgMC4yNzk0MjcgMC42NDIwMDQKK3Z0IDAuNzk3NTcxIDAuMDY4NzAxCit2dCAwLjc5NjY3NSAwLjA2ODY1MwordnQgMC43OTc1NzEgMC4wNDYxOTkKK3Z0IDAuMjc4NTA1IDAuNjE5NTIxCit2dCAwLjI3OTQwMiAwLjYxOTUyMAordnQgMC40NjEzODEgMC45MDgzNjQKK3Z0IDAuNDYwNTA2IDAuOTA4MTY5Cit2dCAwLjQ2MTM4MSAwLjkwNDI2MQordnQgMC4yNzg1MDEgMC42MTU1MTcKK3Z0IDAuMjc5Mzk3IDAuNjE1NTE2Cit2dCAwLjEzNjA2OSAwLjgxNTc1NQordnQgMC4xMzYwNjkgMC44Mjk0MDYKK3Z0IDAuMTM1MTYzIDAuODI5MjgyCit2dCAwLjI3OTI1MyAwLjQ3ODgzNQordnQgMC4yNzkyNTkgMC40OTIzNjIKK3Z0IDAuMjc4MzYyIDAuNDkyMzYzCit2dCAwLjg0MTc5OSAwLjA1NjQzNgordnQgMC44NDA4ODUgMC4wNTY0MzYKK3Z0IDAuODQxNTI4IDAuMDQ2MTk5Cit2dCAwLjI4MDM2NSAwLjQ2ODY1NAordnQgMC4yODEyMDkgMC40Njg5OTkKK3Z0IDAuODQ3OTE1IDAuNTUwNTEwCit2dCAwLjg0ODgwNyAwLjU1MDMyNQordnQgMC44NDg4MDcgMC41NjAxMzEKK3Z0IDAuMjg1ODQ0IDAuNDYwNTIwCit2dCAwLjY5MzgyNCAwLjQyODc3MwordnQgMC42OTM3NDggMC40MjAzMzMKK3Z0IDAuNjkzNzIwIDAuNDA5OTg4Cit2dCAwLjM2ODE0OSAwLjQ2MzQ2NQordnQgMC44NzQzNDMgMC4xMTYzOTYKK3Z0IDAuODczOTY5IDAuMTA3OTU4Cit2dCAwLjg3NDM0MyAwLjEwNzkzOQordnQgMC4zNjgxMzIgMC40NzM3ODgKK3Z0IDAuMzY4MTI5IDAuNDg3NjE4Cit2dCAwLjM2ODExMiAwLjY0NzYxNwordnQgMC4zNjgwOTkgMC42MzcyNTMKK3Z0IDAuMzY4NTI1IDAuNjU2MjE3Cit2dCAwLjM2ODE1MSAwLjY1NjIxNwordnQgMC43MDk0NDEgMC40MjAyMjYKK3Z0IDAuNzA5NDkxIDAuNDI4NTI2Cit2dCAwLjcwOTQyMyAwLjQwOTkzNwordnQgMC43MDk0MjMgMC4zOTQ4OTEKK3Z0IDAuNjk0MDk0IDAuMDM5MTc3Cit2dCAwLjY5NDA5NCAwLjIxNzA1NgordnQgMC42OTM3MjAgMC4yMTcwNTYKK3Z0IDAuNjkzNzIwIDAuMDM5MTc3Cit2dCAwLjY5MzcyMCAwLjM5NDkzNgordnQgMC43MDkwNTAgMC4zMjQyNzYKK3Z0IDAuNzA5MDUwIDAuMjk0MDcyCit2dCAwLjcwOTQyNCAwLjI5NDA3MgordnQgMC43MDk0MjQgMC4zMjQyNzYKK3Z0IDAuMzY4NTAyIDAuNDkyMDIwCit2dCAwLjM2ODEyOCAwLjQ5MjAyMAordnQgMC4zNjgxMDQgMC42MTQ3NjYKK3Z0IDAuMjk0NTg3IDAuNDU2NDIyCit2dCAwLjI4NjkyMiAwLjQ2MTU5NQordnQgMC42ODM4NjkgMC44NTYyMTgKK3Z0IDAuNjgzMjc5IDAuODQ2NzQzCit2dCAwLjY4Mzg2OSAwLjg0NjU4NwordnQgMC4wNTE4OTMgMC42Nzc2OTcKK3Z0IDAuMDUwNzM5IDAuNjY4MTM2Cit2dCAwLjA1MTAxNiAwLjY1MzA5MAordnQgMC43NjkyNjQgMC4wMzc2NzAKK3Z0IDAuNzcyNzMyIDAuMjE1NTM2Cit2dCAwLjc3MjEzNCAwLjIxNTU0OQordnQgMC43Njg2NjYgMC4wMzc2ODIKK3Z0IDAuNzY4OTc2IDAuNDUxOTEzCit2dCAwLjc2ODk3NyAwLjQ4MjEzOAordnQgMC43NjgzNzkgMC40ODIxMzcKK3Z0IDAuNzY4Mzc4IDAuNDUxOTEyCit2dCAwLjc2ODk3NSAwLjM2NjE5NAordnQgMC43Njg5NzYgMC4zODEyNDcKK3Z0IDAuNzcwODY5IDAuMzU2ODk3Cit2dCAwLjI5ODE0NyAwLjg2NDUwNAordnQgMC4yOTc1NTcgMC44NTUzMDAKK3Z0IDAuMjk4MTQ3IDAuODU1MTQ1Cit2dCAwLjI5NDU4OCAwLjY2NDYzMgordnQgMC4yODcxNTggMC42NTg5MzcKK3Z0IDAuMjgxOTg3IDAuNjUxMjkwCit2dCAwLjI4MDAyNCAwLjY0MTk5NgordnQgMC4yNzk5OTkgMC42MTk1MTkKK3Z0IDAuMjc5ODU1IDAuNDkyMzYxCit2dCAwLjI3OTg2MCAwLjQ5Njc2MwordnQgMC4yNzkyNjQgMC40OTY3NjMKK3Z0IDAuMjc5ODQxIDAuNDc4OTEyCit2dCAwLjI4MTc3MiAwLjQ2OTIzMwordnQgMC4wNDM1OTYgMC41MTI5ODQKK3Z0IDAuMDQzODMzIDAuNTEzMTgxCit2dCAwLjAzODk4MSAwLjUyMjA1NgordnQgMC4wMzg2ODYgMC41MjE5NjQKK3Z0IDAuNDA4Njk1IDAuNjQ3NjcwCit2dCAwLjQwODk3OSAwLjY0NzU1MAordnQgMC40MTQ2NDYgMC42NTU5MDQKK3Z0IDAuNjY1ODM2IDAuODQ2NTUzCit2dCAwLjY2NjEzOSAwLjg0NjQ5NAordnQgMC42NjYxMzkgMC44NTY3MDcKK3Z0IDAuNDA2NTAxIDAuNjM3Mzc5Cit2dCAwLjQwNjgwMyAwLjYzNzM0MAordnQgMC40MDY0NDcgMC42MjM1NTgKK3Z0IDAuNDA2NzUwIDAuNjIzNTU3Cit2dCAwLjQwNjQzMCAwLjYxOTE1NgordnQgMC40MDY3MzMgMC42MTkxNTUKK3Z0IDAuNDA1ODcwIDAuNDczOTEyCit2dCAwLjQwNjE3MyAwLjQ3MzkxNAordnQgMC40MDYyNjAgMC40OTYzOTkKK3Z0IDAuNDA1OTU3IDAuNDk2NDAxCit2dCAwLjQwNzk4NCAwLjQ2MzYyNQordnQgMC40MDgyNzkgMC40NjM3NDMKK3Z0IDAuNDEzNjczIDAuNDU1MTI4Cit2dCAwLjQxMzg5MiAwLjQ1NTM0MgordnQgMC4xMDM5ODUgMC42MDQ1MDIKK3Z0IDAuMTA0Mjc3IDAuNjA0NDAzCit2dCAwLjEwOTMzOCAwLjYxMzE0MAordnQgMC41ODM0MTkgMC44NDY1MjEKK3Z0IDAuNTgzNzIwIDAuODQ2NDYxCit2dCAwLjU4MzcyMCAwLjg1NjY3OAordnQgMC4xMDI1OTUgMC41OTQwNjUKK3Z0IDAuMTAyODk3IDAuNTk0MDg2Cit2dCAwLjEwMzYyNiAwLjU3OTA0NAordnQgMC4xMDM5MjggMC41NzkwNjUKK3Z0IDAuMTA4NzE4IDAuNTA5MzM1Cit2dCAwLjEwODY2NyAwLjUxMDA3MAordnQgMC4xMDgzNjUgMC41MTAwNDkKK3Z0IDAuMTA4NDE2IDAuNTA5MzE0Cit2dCAwLjMxODk5NSAwLjQ1NTAxOAordnQgMC4zMTkyOTcgMC40NTUwNDAKK3Z0IDAuMzA2NTc1IDAuNjMyNDgxCit2dCAwLjMwNjI3NCAwLjYzMjQ1OQordnQgMC4wMzc1NTAgMC41MzI0MzMKK3Z0IDAuMDM3ODUxIDAuNTMyNDA2Cit2dCAwLjAzOTIzOCAwLjU0NzM5NQordnQgMC4wMzg5MzcgMC41NDc0MjMKK3Z0IDAuODU4MTYxIDAuNjAxMjQ4Cit2dCAwLjg1ODMxMCAwLjYwMTIxOAordnQgMC44NTgzMTAgMC42MTE1MDQKK3Z0IDAuODU5NTc5IDAuNTYwNTgyCit2dCAwLjg1OTQzNCAwLjU2MDU1NwordnQgMC44NTk1NzkgMC41NTAzMjUKK3Z0IDAuMDYzMTQ3IDAuODQ0NTczCit2dCAwLjA2MzI5MyAwLjg0NDU0MwordnQgMC4wNjMyOTMgMC44NTUxMzMKK3Z0IDAuMDM2NDgyIDAuODU2MTYwCit2dCAwLjAzNjMzMyAwLjg1NjEyOQordnQgMC4wMzY0ODIgMC44NDU1OTkKK3Z0IDAuNDgyMTI2IDAuODQ5MTA5Cit2dCAwLjQ4MjI2OSAwLjg0OTA3NgordnQgMC40ODIyNjkgMC44NTkzNDkKK3Z0IDAuODYzMjcwIDAuMDM0NjYyCit2dCAwLjg2MzEyMCAwLjAzNDYzMwordnQgMC44NjMyNzAgMC4wMjQ0MjEKK3Z0IDAuODU1NDc4IDAuMzMzOTM3Cit2dCAwLjg1NTYyNyAwLjMzMzkwNQordnQgMC44NTU2MjcgMC4zNDQ0NzkKK3Z0IDAuMzE2NDA3IDAuODU2MTg3Cit2dCAwLjMxNjI2MCAwLjg1NjE2NAordnQgMC4zMTY0MDcgMC44NDU2NDMKK3Z0IDAuMzU2NjgzIDAuNDczNzk4Cit2dCAwLjE3NzQ2NCAwLjgyNDQzOAordnQgMC4xNzc2MTMgMC44MjQ0MzYKK3Z0IDAuMTc3NjEzIDAuODM4MjU3Cit2dCAwLjg1Nzc4MyAwLjUzMzE0NwordnQgMC44NTc2MzUgMC41MzMxNDcKK3Z0IDAuODU3NzgzIDAuNTIyNzg0Cit2dCAwLjg1Nzg2OSAwLjQyMjQ1MwordnQgMC44NTc3MjIgMC40MjIzOTQKK3Z0IDAuODU3ODY5IDAuNDEyMDg5Cit2dCAwLjg1OTE4NSAwLjgzNjc4MQordnQgMC44NTkzMzEgMC44MzY3NTQKK3Z0IDAuODU5MzMxIDAuODQ3MDM1Cit2dCAwLjQxMzU1OSAwLjQ1NTAxOAordnQgMC44NTgxMDQgMC40OTUzNTgKK3Z0IDAuODU4MjYwIDAuNDk1MzI2Cit2dCAwLjg1ODI2MCAwLjUwNTYwNgordnQgMC4zNDMxNzEgMC44NTk4MzEKK3Z0IDAuMzQzMDIzIDAuODU5Nzk4Cit2dCAwLjM0MzE3MSAwLjg0OTU4MgordnQgMC41NzA0MzYgMC44NDQyMzkKK3Z0IDAuNTcwNTg1IDAuODQ0MjEwCit2dCAwLjU3MDU4NSAwLjg1NDc5OQordnQgMC44NjMyNjUgMC4wNDU4ODMKK3Z0IDAuODYzNDE2IDAuMDQ1ODc3Cit2dCAwLjg2MzQxNiAwLjA1NjEwOAordnQgMC44Mjk0MTEgMC4yNzE0MTMKK3Z0IDAuODI5NTYyIDAuMjcxNDA4Cit2dCAwLjgyOTU2MiAwLjI4NjQ1NAordnQgMC44Mjk2NzQgMC4xNzk5NTcKK3Z0IDAuODI5NTI0IDAuMTY0OTE3Cit2dCAwLjgyOTY3NCAwLjE2NDkxMQordnQgMC4wODEyODcgMC41MDkxNzcKK3Z0IDAuMDgxMjg3IDAuNjg3MDc0Cit2dCAwLjA4MTEzOCAwLjY4NzA3NQordnQgMC42ODYwNTMgMC40NDk1NDEKK3Z0IDAuNjg2MDUzIDAuNjI3NDM4Cit2dCAwLjY4NTkwNCAwLjYyNzQzOQordnQgMC44MjkzMzEgMC4zMDc4NDYKK3Z0IDAuODI5NDgwIDAuMzA3ODQ1Cit2dCAwLjgyOTQ4MCAwLjMyMjg5OQordnQgMC44Mjk1NjEgMC4wMjAzNjYKK3Z0IDAuODI5NDEyIDAuMDIwMzY2Cit2dCAwLjgyOTQ5NiAwLjAwNTMxMwordnQgMC43MTgyOTEgMC42MTc2NTIKK3Z0IDAuNzE4MjkxIDAuNjE2OTE1Cit2dCAwLjcxODQ0MSAwLjYxNjkxMAordnQgMC43MTg0NDEgMC42MTc2NDcKK3Z0IDAuNzI5MjA5IDAuNDQ5NTQxCit2dCAwLjcyOTIwOSAwLjQ1Mzk0MwordnQgMC43MjkwNjEgMC40NTM5NDUKK3Z0IDAuODI5NTYwIDAuMDM1Mzk3Cit2dCAwLjgyOTQxMiAwLjAzMDk5OAordnQgMC44Mjk1NjAgMC4wMzA5OTEKK3Z0IDAuNzk2Njc5IDAuMjcxNDA4Cit2dCAwLjc5NjgyNyAwLjI3MTQwOAordnQgMC43OTY4MjcgMC4yOTM4OTYKK3Z0IDAuNDA1NzIyIDAuNDczOTEyCit2dCAwLjY4NTMyMSAwLjQyMDMzMQordnQgMC42ODUzOTcgMC40Mjg3NzIKK3Z0IDAuNjg1MjkzIDAuNDA5OTg2Cit2dCAwLjM1OTc2MyAwLjQ1NTAxOAordnQgMC4zNTk3MjEgMC40NjM0NjQKK3Z0IDAuNTk3MzU4IDAuODMzNDY5Cit2dCAwLjU5NTAwNCAwLjgyNTM1NwordnQgMC41OTczNTggMC44MjQ2NjIKK3Z0IDAuMzU5NzA0IDAuNDczNzg3Cit2dCAwLjM1OTcwMSAwLjQ4NzYxNwordnQgMC4zNTk2NzEgMC42MzcyNTIKK3Z0IDAuMzU5Njg0IDAuNjQ3NjE2Cit2dCAwLjM1OTcyMyAwLjY1NjIxNgordnQgMC43MTc5MTggMC40Mjg1MjkKK3Z0IDAuNzE3ODY5IDAuNDIwMjI4Cit2dCAwLjA2NTU0OSAwLjgyNTYxNgordnQgMC4wNjU2MDEgMC44MzM5MTcKK3Z0IDAuMDYzMTQ3IDAuODMzOTE3Cit2dCAwLjcxNzg1MSAwLjQwOTk0MAordnQgMC43MTc4NTEgMC4zOTQ4OTQKK3Z0IDAuNjg1MjkyIDAuMDM5MTc1Cit2dCAwLjY4NTI5MyAwLjIxNzA1NAordnQgMC42ODI4MzkgMC4yMTcwNTQKK3Z0IDAuNjgyODM5IDAuMDM5MTc0Cit2dCAwLjY4NTI5MyAwLjM5NDkzNAordnQgMC43MTc4NTEgMC4zMjUwNDcKK3Z0IDAuNzIwMzA1IDAuMzI1MDQ4Cit2dCAwLjcyMDMwNSAwLjMyNTc4NQordnQgMC43MTc4NTEgMC4zMjU3ODUKK3Z0IDAuMzU5NzAwIDAuNDkyMDE5Cit2dCAwLjM1NzI0NiAwLjQ5MjAxOAordnQgMC4zNTk2NzYgMC42MTQ3NjUKK3Z0IDAuNjkyMTk1IDAuNDIwMzMzCit2dCAwLjY5MjI3MSAwLjQyODc3MwordnQgMC42ODkwODMgMC40Mjg3NzIKK3Z0IDAuNjg5MDA3IDAuNDIwMzMyCit2dCAwLjY5MjE2NyAwLjQwOTk4OAordnQgMC42ODg5NzkgMC40MDk5ODcKK3Z0IDAuMzY2NjM3IDAuNDU1MDE5Cit2dCAwLjM2NjU5NiAwLjQ2MzQ2NQordnQgMC4zNjM0MDcgMC40NjM0NjUKK3Z0IDAuNzY2NjgzIDAuODMyODExCit2dCAwLjc2MzcwNCAwLjgyNDkwNwordnQgMC43NjY2ODMgMC44MjM3NjgKK3Z0IDAuMzY2NTc4IDAuNDczNzg3Cit2dCAwLjM2MzM5MCAwLjQ3Mzc4NwordnQgMC4zNjY1NzYgMC40ODc2MTgKK3Z0IDAuMzYzMzg3IDAuNDg3NjE4Cit2dCAwLjM2NjU0NiAwLjYzNzI1MwordnQgMC4zNjY1NTkgMC42NDc2MTcKK3Z0IDAuMzYzMzcxIDAuNjQ3NjE3Cit2dCAwLjM2MzM1NyAwLjYzNzI1MgordnQgMC4zNjY1OTcgMC42NTYyMTcKK3Z0IDAuMzYzNDA5IDAuNjU2MjE2Cit2dCAwLjcxMTA0NCAwLjQyODUyNwordnQgMC43MTA5OTUgMC40MjAyMjYKK3Z0IDAuNzE0MTgzIDAuNDIwMjI3Cit2dCAwLjUwNjcyMyAwLjgyNDY2MgordnQgMC41MDY3NzUgMC44MzI5NjMKK3Z0IDAuNTAzNTg2IDAuODMyOTYzCit2dCAwLjcxMDk3NyAwLjQwOTkzOAordnQgMC43MTQxNjUgMC40MDk5MzkKK3Z0IDAuNzEwOTc3IDAuMzk0ODkxCit2dCAwLjcxNDE2NSAwLjM5NDg5MgordnQgMC42OTIxNjcgMC4wMzkxNzYKK3Z0IDAuNjkyMTY3IDAuMjE3MDU2Cit2dCAwLjY4ODk3OSAwLjIxNzA1NQordnQgMC42ODg5NzkgMC4wMzkxNzYKK3Z0IDAuNjkyMTY3IDAuMzk0OTM1Cit2dCAwLjY4ODk3OSAwLjM5NDkzNQordnQgMC4zNjY1NzUgMC40OTIwMTkKK3Z0IDAuMzYzMzg3IDAuNDkyMDE5Cit2dCAwLjM2NjU1MCAwLjYxNDc2NgordnQgMC4zNjMzNjIgMC42MTQ3NjUKK3Z0IDAuMzY4NDkwIDAuNTUxMzM5Cit2dCAwLjM2ODExNiAwLjU1MTMzOAordnQgMC4zNjgxMjcgMC40OTYyODgKK3Z0IDAuMzY4NTAxIDAuNDk2Mjg4Cit2dCAwLjI3OTkyNyAwLjU1NjA4NwordnQgMC4yNzkzMzAgMC41NTYwODcKK3Z0IDAuMjc5MjY4IDAuNTAxMDMyCit2dCAwLjI3OTg2NSAwLjUwMTAzMgordnQgMC40MDYyMDIgMC41NTk4MzMKK3Z0IDAuNDA2NTA0IDAuNTU5ODMyCit2dCAwLjQwNjcxNyAwLjYxNDg4NgordnQgMC40MDY0MTQgMC42MTQ4ODcKK3Z0IDAuNDA2MDUzIDAuNTU5ODMzCit2dCAwLjcyOTA2MSAwLjQ1ODIxMwordnQgMC43MjkyMDkgMC40NTgyMTEKK3Z0IDAuNzI5MjA5IDAuNTEzMjYyCit2dCAwLjM2MzM3NSAwLjU1MTMzOAordnQgMC4zNTk2ODggMC41NTEzMzgKK3Z0IDAuMzU5Njk5IDAuNDk2Mjg3Cit2dCAwLjM2MzM4NiAwLjQ5NjI4NwordnQgMC4zNjY1NjMgMC41NTEzMzgKK3Z0IDAuMzY2NTc0IDAuNDk2Mjg4Cit2dCAwLjM1NjgyOCAwLjQ5MjAxOAordnQgMC4zNTcyNDUgMC40OTYyODcKK3Z0IDAuMTE4ODk2IDAuOTEzNTA4Cit2dCAwLjExODQ3OCAwLjkxMzUwOAordnQgMC4xMTg0NzkgMC45MDkyNDAKK3Z0IDAuMzcwNjIyIDAuNDkyMDM2Cit2dCAwLjM3MDYyMiAwLjQ5NjMwNAordnQgMC45MDExNzAgMC4zNzI1ODMKK3Z0IDAuOTAyMDY2IDAuMzcyNTgzCit2dCAwLjkwMjA2NiAwLjM3Njg1MgordnQgMC4yNzgzNjcgMC40OTY3NjUKK3Z0IDAuMzg1OTk5IDAuOTAyNTUyCit2dCAwLjM4NTk5OSAwLjkwNjk1NAordnQgMC4zODUxMDIgMC45MDY5NTQKK3Z0IDAuMzYzNDQ5IDAuNDU1MDE5Cit2dCAwLjgwNjg2MSAwLjgyNzEzNwordnQgMC44MDM0ODggMC44MTkzOTMKK3Z0IDAuODA2ODYxIDAuODE3OTA1Cit2dCAwLjcxNDIzMiAwLjQyODUyOAordnQgMC4xOTIxNDEgMC44Mjk3MDIKK3Z0IDAuMTg4NzY0IDAuODIyMTE4Cit2dCAwLjE5MjE0MSAwLjgyMDY0MAordnQgMC4zNTk2NzYgMC42MTA3NjIKK3Z0IDAuMzU3MjIzIDAuNjA2Mzg4Cit2dCAwLjM1NzIzNCAwLjU1MTMzNwordnQgMC4zNTk2NzcgMC42MDYzODgKK3Z0IDAuMzY4MTkxIDAuNDU1MDE5Cit2dCAwLjg0NjkwMCAwLjA3NTgwNQordnQgMC44NDUzNzQgMC4wNjc0OTgKK3Z0IDAuODQ2OTAwIDAuMDY3MjEwCit2dCAwLjUwNTA4OCAwLjg0MzU4OAordnQgMC41MDUxNDAgMC44NTE4ODkKK3Z0IDAuNTAzNTg2IDAuODUxODg5Cit2dCAwLjcxMDk3NyAwLjI5NDA3MwordnQgMC43MTA5NzcgMC4zMjQyNzYKK3Z0IDAuMzYzMzY0IDAuNjA2Mzg5Cit2dCAwLjM2NjU1MiAwLjYwNjM4OQordnQgMC4zNTY4MTYgMC41NTEzMzcKK3Z0IDAuMzU2ODA1IDAuNjA2Mzg4Cit2dCAwLjM3MDYxMSAwLjU1MTM1NQordnQgMC4zNzA2MDAgMC42MDY0MDUKK3Z0IDAuMzY4NDc5IDAuNjA2Mzg5Cit2dCAwLjI3ODQzNCAwLjU1NjA4OAordnQgMC4yNzkzOTIgMC42MTExNDIKK3Z0IDAuMjc4MzYyIDAuNjc1MjU3Cit2dCAwLjI3OTI1OSAwLjY3NTI1NwordnQgMC4yNzkyNTkgMC43MzAzMTIKK3Z0IDAuMzY4MTA0IDAuNjEwNzYyCit2dCAwLjM2ODEwNSAwLjYwNjM4OQordnQgMC4yNzk5OTQgMC42MTU1MTUKK3Z0IDAuMjc5OTg5IDAuNjExMTQyCit2dCAwLjQwNTk3MyAwLjUwMDQwNAordnQgMC40MDYyNzUgMC41MDA0MDIKK3Z0IDAuNDA2MjkyIDAuNTA0Nzc3Cit2dCAwLjQwNTk4OSAwLjUwNDc3OAordnQgMC40MDU4MjQgMC41MDA0MDQKK3Z0IDAuOTE2NzE4IDAuMTY0OTExCit2dCAwLjkxNjg2NiAwLjE2NDkxMQordnQgMC45MTY4NjYgMC4xNjkyODYKK3Z0IDAuMzY2NTUxIDAuNjEwNzYyCit2dCAwLjM2MjAwNCAwLjYwOTQxNAordnQgMC4zNjE0NjcgMC42MTA3NjIKK3Z0IDAuMzY0NzA1IDAuNjEyMTA0Cit2dCAwLjM2MzM2MiAwLjYxMjY1NgordnQgMC4zNjIwMjMgMC42MTIxMDQKK3Z0IDAuMzY0NTcxIDAuNjExOTcwCit2dCAwLjM2NTA3MiAwLjYxMDc2MgordnQgMC4zNjUyNjIgMC42MTA3NjIKK3Z0IDAuMzYzMzYyIDAuNjEyNDcwCit2dCAwLjM2MzM2MyAwLjYwODg2NgordnQgMC4zNjQ3MDYgMC42MDk0MjIKK3Z0IDAuMzY0NTcyIDAuNjA5NTU2Cit2dCAwLjM2MzM2MyAwLjYwOTA1NQordnQgMC4zNjIxNTcgMC42MTE5NzAKK3Z0IDAuMzYyMTU2IDAuNjA5NTU3Cit2dCAwLjM2MTY1NyAwLjYxMDc2MgordnQgMC41OTU4ODMgMC45MDYzNjQKK3Z0IDAuNTk1MDA0IDAuOTA2MTg0Cit2dCAwLjU5NTg4MyAwLjkwMTg5OQordnQgMC4yNzg0OTYgMC42MTExNDMKK3Z0IDAuNDA1ODA5IDAuNDk2NDAxCit2dCAwLjcyOTI2OCAwLjcxMjgzMgordnQgMC43Mjk0MTYgMC43MTI4MzIKK3Z0IDAuNzI5NDE2IDAuNzE2ODM1Cit2dCAwLjkyMzk2NCAwLjY5MzM3MAordnQgMC45MjM5NjQgMC42OTIyMDkKK3Z0IDAuOTI1MTkxIDAuNjkyMjA2Cit2dCAwLjkyNTE5MSAwLjY5MzI1MgordnQgMC45NDc1ODggMC41OTAzMjEKK3Z0IDAuOTQ2Njk3IDAuNTg5NTY3Cit2dCAwLjk0NzU4OCAwLjU4ODcyMQordnQgMC45MjQyMjMgMC40ODIwNzcKK3Z0IDAuOTI0MjU3IDAuNDgzMTI4Cit2dCAwLjkyMzAzNSAwLjQ4MzE0OAordnQgMC45MjMwMzUgMC40ODQzMDQKK3Z0IDAuOTI0MjU3IDAuNDg0MTcwCit2dCAwLjc1MDcyOSAwLjY4NDk0MAordnQgMC43NTE4ODUgMC42ODQ4MzAKK3Z0IDAuNzUxODg1IDAuNjg2MDYzCit2dCAwLjkyNTYyOCAwLjUwOTM0NgordnQgMC45MjU2MzEgMC41MTAzOTIKK3Z0IDAuOTI0NDAzIDAuNTEwMzk0Cit2dCAwLjkyNDQwMyAwLjUxMTU1NgordnQgMC45MjU2MzEgMC41MTE0NDAKK3Z0IDAuOTAyNDU3IDAuNTEyMDMyCit2dCAwLjkwMTU3MCAwLjUxMTI3NAordnQgMC45MDI0NTcgMC41MTA0MjAKK3Z0IDAuOTIzNTQxIDAuNTM5Mzk0Cit2dCAwLjkyMzUyOCAwLjUzODM0MwordnQgMC45MjQ3NTMgMC41MzgzMzIKK3Z0IDAuOTI0NzUzIDAuNTM3MTc2Cit2dCAwLjkyMzUyOCAwLjUzNzMwMQordnQgMC45NDcxMTEgMC41NjQ5MjYKK3Z0IDAuOTQ2MjI1IDAuNTY0MTczCit2dCAwLjk0NzExMSAwLjU2MzMxNQordnQgMC45MjUxODUgMC42OTExNTgKK3Z0IDAuOTczMzUzIDAuMDQ3MTU5Cit2dCAwLjk3MzI5NSAwLjA0NzEzMgordnQgMC45NzMzNTMgMC4wNDU4NzcKK3Z0IDAuMzMwOTY0IDAuOTcxMjA3Cit2dCAwLjMzMTAyNCAwLjk3MjQ4NwordnQgMC45NzMxMDQgMC4wMDY1OTcKK3Z0IDAuOTczMDQ1IDAuMDA2NTcwCit2dCAwLjk3MzEwNCAwLjAwNTMxMwordnQgMC45NzE4MzAgMC4yMzQ0MjkKK3Z0IDAuOTcxODkwIDAuMjM0NDA0Cit2dCAwLjk3MTg5MCAwLjIzNTcxMgordnQgMC45NzMzMDMgMC4yOTEzNDYKK3Z0IDAuOTczMjQ0IDAuMjkxMzE4Cit2dCAwLjk3MzMwMyAwLjI5MDA2NAordnQgMC45NzIwNzcgMC4wODcwOTUKK3Z0IDAuOTcyMTM3IDAuMDg4Mzc2Cit2dCAwLjIwMjQyNyAwLjk3MzEwOQordnQgMC4yMDI0MjcgMC45NzE4MjcKK3Z0IDAuMzE2MzE5IDAuOTcyOTk0Cit2dCAwLjMxNjMxOSAwLjk3MTcxMAordnQgMC42ODI4ODcgMC45NzA5OTEKK3Z0IDAuNjgyOTQ3IDAuOTcyMjc0Cit2dCAwLjQ5Mjg2OSAwLjk3MzE1MwordnQgMC40OTI4MTEgMC45NzMxMjUKK3Z0IDAuNDkyODY5IDAuOTcxODcwCit2dCAwLjk3Mjc5MSAwLjEwNzk2MwordnQgMC45NzI4NTAgMC4xMDc5MzkKK3Z0IDAuOTcyODUwIDAuMTA5MjQ1Cit2dCAwLjE2NjY4NCAwLjk3MzA3NgordnQgMC4xNjY2MjcgMC45NzMwNDkKK3Z0IDAuMTY2Njg0IDAuOTcxNzkxCit2dCAwLjk3MjI3OSAwLjAyNDQ0NgordnQgMC45NzIzMzggMC4wMjU3MjkKK3Z0IDAuNDgyMTg0IDAuOTczMTU0Cit2dCAwLjQ4MjEyNiAwLjk3MzEyNwordnQgMC40ODIxODQgMC45NzE4NzAKK3Z0IDAuOTcyNTEzIDAuMTI3OTQxCit2dCAwLjk3MjU3MiAwLjEyNzkxNgordnQgMC45NzI1NzIgMC4xMjkyMjMKK3Z0IDAuNzA5MDUwIDAuMjYyMTMwCit2dCAwLjcwNjk0OSAwLjI2MjA4MgordnQgMC43MDY5NDkgMC4xOTUwMjAKK3Z0IDAuNzA5MDUwIDAuMTk1MDY4Cit2dCAwLjE3MDc1OSAwLjcxNzQ1NAordnQgMC4xNjk4NjMgMC43MTc0NDMKK3Z0IDAuMTcwNzU5IDAuNjUwMzM5Cit2dCAwLjc2NzQ4MyAwLjUxNDEwMwordnQgMC43NjgzNzkgMC41MTQxMDMKK3Z0IDAuNzY4MzgwIDAuNTgxMjEyCit2dCAwLjcwOTQyNCAwLjE5MTMyMQordnQgMC43MDk0MjQgMC4xOTMyOTgKK3Z0IDAuNzA5MDUwIDAuMTkzMjk4Cit2dCAwLjc2ODk3OCAwLjU4NDk2MwordnQgMC43NjgzODAgMC41ODI5ODQKK3Z0IDAuNzY4OTc4IDAuNTgyOTg1Cit2dCAwLjQ0NTUzNSAwLjYzMjE2OAordnQgMC40NDU4MzggMC42MzIxNjQKK3Z0IDAuNDQ1ODY1IDAuNjM0MTQyCit2dCAwLjQ0NTU2MiAwLjYzNDE0NgordnQgMC45NTg5NDAgMC45MjI1MDYKK3Z0IDAuOTU4OTQwIDAuOTI0NDgzCit2dCAwLjk1ODc4OSAwLjkyNDQ4OQordnQgMC45NTg3ODkgMC45MjI1MTIKK3Z0IDAuNzE3ODUyIDAuMTkxMzI0Cit2dCAwLjcyMDMwNSAwLjE5MzMwMQordnQgMC43MTc4NTIgMC4xOTMzMDEKK3Z0IDAuNzEwOTc3IDAuMTkzMjk4Cit2dCAwLjcxMDk3NyAwLjE5MTMyMgordnQgMC43MTQxNjUgMC4xOTEzMjMKK3Z0IDAuNzE0MTY4IDAuMTkzMjk5Cit2dCAwLjcwOTQyNCAwLjE5NTA2OQordnQgMC43MDk0MjQgMC4yNjIxMzAKK3Z0IDAuNzY4OTc4IDAuNTgxMjEzCit2dCAwLjc2ODk3NyAwLjUxNDEwMwordnQgMC43MTA5NzcgMC4xOTUwNjkKK3Z0IDAuNzEwOTc3IDAuMjYyMTMwCit2dCAwLjcyMDcyMyAwLjMyNTA0OQordnQgMC44MDM5MDYgMC45NzY4MDAKK3Z0IDAuODAzOTA2IDAuOTc3NTM3Cit2dCAwLjgwMzQ4OCAwLjk3NzUzNwordnQgMC43MDY5NDkgMC4zMjQyMjcKK3Z0IDAuNzA2OTQ5IDAuMjk0MDI0Cit2dCAwLjMwNTYzMyAwLjc3OTU3NQordnQgMC4zMDQ3MzcgMC43Nzk1NDgKK3Z0IDAuMzA1NjMzIDAuNzQ5MzM2Cit2dCAwLjc2NzQ4MiAwLjQ1MTkxMgordnQgMC43MTQxNjggMC4yNjIxMzIKK3Z0IDAuNzE0MTY4IDAuMjYzMzQxCit2dCAwLjcxMDk3NyAwLjI2MzM0MQordnQgMC43MjAzMDUgMC4xOTQyOTkKK3Z0IDAuNzE3ODUyIDAuMTk0Mjk4Cit2dCAwLjg2OTI0NyAwLjc3NTgzNgordnQgMC44Njg4NjEgMC43NzQ5MTYKK3Z0IDAuODY5MjQ3IDAuNzc0NzU1Cit2dCAwLjcyMDcyMyAwLjE5MzMwMgordnQgMC45Nzc5NDcgMC4zNTczMjIKK3Z0IDAuOTc3Nzk3IDAuMzU2MzM2Cit2dCAwLjk3Nzk0NyAwLjM1NjMwOAordnQgMC45NzgzMDggMC44MTM1NjkKK3Z0IDAuOTc4MTYwIDAuODEyNTgzCit2dCAwLjk3ODMwOCAwLjgxMjU1NQordnQgMC43MDkwNTAgMC4zMjcxODgKK3Z0IDAuNzA5MDUwIDAuMzI1NzgyCit2dCAwLjcwOTQyNCAwLjMyNTc4MgordnQgMC43MDk0MjQgMC4zMjcxODgKK3Z0IDAuNzY4OTc2IDAuNDQ4OTk4Cit2dCAwLjc2ODk3NiAwLjQ1MDQwNgordnQgMC43NjgzNzggMC40NTA0MDUKK3Z0IDAuNzY4Mzc4IDAuNDQ4OTk4Cit2dCAwLjEwOTE5MSAwLjUxMTUxNwordnQgMC4xMDg1NzEgMC41MTE0NzQKK3Z0IDAuMTA5Mjg4IDAuNTEwMTEzCit2dCAwLjcxODQ0MSAwLjYxNTUwMwordnQgMC43MTgyOTEgMC42MTU1MDkKK3Z0IDAuNzIwMzA1IDAuMzI3MTkyCit2dCAwLjcxNzg1MSAwLjMyNzE5MQordnQgMC43MTQxNjUgMC4zMjcxOTAKK3Z0IDAuNzE2MTI5IDAuMzI1Nzg0Cit2dCAwLjcxMDk3NyAwLjMyNzE4OQordnQgMC43MTA5NzcgMC4zMjU3ODIKK3Z0IDAuNzIwNzIzIDAuMzI1Nzg1Cit2dCAwLjI0MjM4MCAwLjk2Mjc5MAordnQgMC4yNDIzODAgMC45NjQxOTYKK3Z0IDAuMjQxOTYyIDAuOTY0MTk2Cit2dCAwLjcwNjk0OSAwLjMyNzE0MAordnQgMC43MDY5NDkgMC4zMjU3MzMKK3Z0IDAuODM2MTM4IDAuOTUyMjM1Cit2dCAwLjgzNjg5NCAwLjk1MzQyMgordnQgMC44MzYxMzggMC45NTM5MDMKK3Z0IDAuNzY3NDgyIDAuNDUwNDA1Cit2dCAwLjQ0NTg3OCAwLjYzNTE0MAordnQgMC40NDU1NzYgMC42MzUxNDQKK3Z0IDAuNzA5MDUwIDAuMjY0ODk1Cit2dCAwLjcwOTQyNCAwLjI2NDg5NQordnQgMC43MDk0MjQgMC4yOTEyNTgKK3Z0IDAuNzA5MDUwIDAuMjkxMjU4Cit2dCAwLjc2ODk3NyAwLjUxMTMzNgordnQgMC43NjgzNzkgMC41MTEzMzUKK3Z0IDAuNzY4Mzc5IDAuNDg0OTU0Cit2dCAwLjc2ODk3NyAwLjQ4NDk1NAordnQgMC43MTA5NzcgMC4yNjQ4OTYKK3Z0IDAuNzEwOTc3IDAuMjkxMjU4Cit2dCAwLjcwNjk0OSAwLjI2NDg0NwordnQgMC43MDY5NDkgMC4yOTEyMDkKK3Z0IDAuOTQ1NTMwIDAuNjY0Njk4Cit2dCAwLjk0NjMwMCAwLjY2NTk5NAordnQgMC45NDU1MzAgMC42NjY0NTIKK3Z0IDAuMDM4NDQ2IDAuNzgyNTgwCit2dCAwLjAzNzU1MCAwLjc4MjU4MAordnQgMC4wMzc1NTAgMC43NTYxOTgKK3Z0IDAuNzY3NDgyIDAuNDg0OTU0Cit2dCAwLjcwNjk0OSAwLjE5MzI0OQordnQgMC44Mjk1MjMgMC4yNjA3NjEKK3Z0IDAuODI5NTIzIDAuMjU4OTg5Cit2dCAwLjgzMDQyMCAwLjI1ODk4OQordnQgMC43Njc0ODMgMC41ODI5ODQKK3Z0IDAuOTM0MTQyIDAuNzE5NzM5Cit2dCAwLjkzNDE0MiAwLjcxNzc2MQordnQgMC45MzUwMzkgMC43MTc3NjEKK3Z0IDAuNzA5NDI0IDAuMDM5MzQ1Cit2dCAwLjc2ODk3OSAwLjczNzA0NwordnQgMC40NDM0NzQgMC40ODAxMDAKK3Z0IDAuNDQzNzc3IDAuNDgwMDk2Cit2dCAwLjAwNTMxNCAwLjUxMjk5MAordnQgMC4wMDU0NjQgMC41MTI5ODQKK3Z0IDAuMDA1NDY0IDAuNjY0OTYxCit2dCAwLjAxNjA5MiAwLjUxMjk5MAordnQgMC4wMTYyNDIgMC41MTI5ODQKK3Z0IDAuMDE2MjQyIDAuNjY0OTYxCit2dCAwLjcxNzg1MiAwLjAzOTM0OAordnQgMC43MTA5NzcgMC4wMzkzNDYKK3Z0IDAuNzE0MTY1IDAuMDM5MzQ3Cit2dCAwLjcwOTQyNCAwLjM0NjU0MgordnQgMC43MDkwNTAgMC4zNDY1NDEKK3Z0IDAuNzY4Mzc4IDAuNDI5NjMxCit2dCAwLjc2ODk3NiAwLjQyOTYzMQordnQgMC4xMDc4NjQgMC41MzA4MzgKK3Z0IDAuMTA3MjQ0IDAuNTMwNzk2Cit2dCAwLjcxODI5MSAwLjU5NjE1NQordnQgMC43MTg0NDEgMC41OTYxNTAKK3Z0IDAuNzIwMzA1IDAuMzQ2NTQ1Cit2dCAwLjcxNzg1MSAwLjM0NjU0NAordnQgMC43MTQxNjUgMC4zNDY1NDMKK3Z0IDAuNzEwOTc3IDAuMzQ2NTQyCit2dCAwLjcyMDcyMyAwLjM0NjU0NQordnQgMC44MDg1NTEgMC4xMDY0MjcKK3Z0IDAuODA4MTMzIDAuMTA2NDE4Cit2dCAwLjgwODU1MSAwLjA4NzA2OQordnQgMC43MDY5NDkgMC4zNDY0OTMKK3Z0IDAuNzY3NDgyIDAuNDI5NjMxCit2dCAwLjIxNDgwNiAwLjgwNjMxMQordnQgMC4yMTM5MTAgMC44MDYyNjkKK3Z0IDAuMjE0ODA2IDAuNzg2OTIzCit2dCAwLjY4MjQyMSAwLjAzOTE3NAordnQgMC42ODI0MjEgMC4yMTcwNTQKK3Z0IDAuNjk2MjIyIDAuMDM5MTU4Cit2dCAwLjY5NjIyMiAwLjIxNzAzNwordnQgMC42NzUyNzcgMC40NDk1NDEKK3Z0IDAuNjc1Mjc3IDAuNjI3NDQxCit2dCAwLjY3NDM4MCAwLjYyNzQ0MQordnQgMC43NzEyMzggMC4yMTU1NjYKK3Z0IDAuNjk0MDk0IDAuMzIxODIwCit2dCAwLjY5NDA5NCAwLjM0NjQ5NAordnQgMC42OTM3MjAgMC4zNDY0OTQKK3Z0IDAuNjkzNzIwIDAuMzIxODIwCit2dCAwLjc3NDc3NSAwLjMyMDI5MgordnQgMC43NzUyNTYgMC4zNDQ5NjQKK3Z0IDAuNzc0NjU4IDAuMzQ0OTc2Cit2dCAwLjc3NDE3NyAwLjMyMDMwNQordnQgMC42OTIxNjcgMC4zMjE4MjAKK3Z0IDAuNjkyMTY3IDAuMzQ2NDkzCit2dCAwLjY4ODk3OSAwLjM0NjQ5MwordnQgMC42ODg5NzkgMC4zMjE4MTkKK3Z0IDAuNjg4NTY3IDAuMzIxODE5Cit2dCAwLjY4ODU2MyAwLjM0NjQ5MQordnQgMC42ODgzMjUgMC4zNDY0OTEKK3Z0IDAuNjg4MzIzIDAuMzIxODE5Cit2dCAwLjY4MjQyMSAwLjI5ODc3NgordnQgMC42ODI4MzkgMC4yOTg3NzYKK3Z0IDAuNjgyODM5IDAuMzAxOTE3Cit2dCAwLjY4MjQyMSAwLjMwMTkxNgordnQgMC42ODI4MzkgMC4zNTMwMjkKK3Z0IDAuNjgyNDIxIDAuMzUzMDI5Cit2dCAwLjY4MjQyMSAwLjM1MDYzNAordnQgMC42ODI4MzkgMC4zNTA2MzQKK3Z0IDAuNjk0MDk0IDAuMjk4Nzc4Cit2dCAwLjY5NjIyMiAwLjI5ODc1OQordnQgMC42OTYyMjIgMC4zMDE5MDAKK3Z0IDAuNjk0MDk0IDAuMzAxOTE5Cit2dCAwLjY5NjIyMiAwLjM1MzAxMgordnQgMC42OTQwOTQgMC4zNTMwMzEKK3Z0IDAuNzcyODMyIDAuMjk3MjgyCit2dCAwLjc3MzcyOCAwLjI5NzI2NQordnQgMC43NzM3ODkgMC4zMDA0MDUKK3Z0IDAuMzMwOTY0IDAuOTE5MDQ5Cit2dCAwLjMzMTg2MSAwLjkxOTA0OQordnQgMC4zMzE4NjEgMC45MjIxOTAKK3Z0IDAuMDUxMjMzIDAuNjA4NzgyCit2dCAwLjA1MTE4OSAwLjYxMTE3NwordnQgMC4wNTAyOTIgMC42MTExNjEKK3Z0IDAuNTcwNDM2IDAuOTMzODk0Cit2dCAwLjU3MDQzNiAwLjkzMTQ5OAordnQgMC41NzEzMzIgMC45MzE0OTgKK3Z0IDAuNjkzNzIwIDAuMzUzMDMxCit2dCAwLjY5MzcyMCAwLjM1MDYzNgordnQgMC42OTM3MjAgMC4yOTg3NzgKK3Z0IDAuNjkzNzIwIDAuMzAxOTE5Cit2dCAwLjA1MTc4NiAwLjYxMTE4NwordnQgMC4wNTE4MzAgMC42MDg3OTIKK3Z0IDAuNzc0MzI1IDAuMjk3MjUzCit2dCAwLjc3NDM4NyAwLjMwMDM5MwordnQgMC4wNDI4MDAgMC41ODkxNTMKK3Z0IDAuMDQzMTAxIDAuNTg5MTI1Cit2dCAwLjA0MzMyMiAwLjU5MTUxMAordnQgMC4wNDMwMjAgMC41OTE1MzgKK3Z0IDAuMDM4ODk0IDAuNjExMzA5Cit2dCAwLjAzNzg1MiAwLjYxMTMwOQordnQgMC4wMzc4NTIgMC42MDgxNjkKK3Z0IDAuMDM4ODk0IDAuNjA4MTY5Cit2dCAwLjkxNTA0MCAwLjk1MzMyNwordnQgMC45MTQ4OTEgMC45NTMzMjcKK3Z0IDAuOTE0OTA4IDAuOTUwOTMyCit2dCAwLjk1NDExMiAwLjMzNjMwMAordnQgMC45NTM5NjMgMC4zMzYzMDAKK3Z0IDAuOTUzOTc5IDAuMzMzOTA1Cit2dCAwLjY5NjY4MSAwLjUzMTI3MQordnQgMC42OTY4MzAgMC41MzEyNzAKK3Z0IDAuNjk2ODMwIDAuNTM0NDExCit2dCAwLjY5NjY4MSAwLjUzNDQxMgordnQgMC42ODUyOTMgMC4zNTMwMzAKK3Z0IDAuNjg1MjkzIDAuMzUwNjM0Cit2dCAwLjY4NTI5MyAwLjI5ODc3NwordnQgMC42ODUyOTMgMC4zMDE5MTcKK3Z0IDAuNjkyMTY3IDAuMzUzMDMxCit2dCAwLjY4ODk3OSAwLjM1MzAzMAordnQgMC42ODg5NzkgMC4zNTA2MzUKK3Z0IDAuNjkyMTY3IDAuMzUwNjM2Cit2dCAwLjY4ODk3OSAwLjI5ODc3NwordnQgMC42OTIxNjcgMC4yOTg3NzgKK3Z0IDAuNjkyMTY3IDAuMzAxOTE4Cit2dCAwLjY4ODk3OSAwLjMwMTkxOAordnQgMC42ODgwNjggMC4zNTA2MzUKK3Z0IDAuNjg3ODY1IDAuMzAxOTE4Cit2dCAwLjY4MjgzOSAwLjMwNDQzOAordnQgMC42ODI4MzkgMC4zMDQ2ODAKK3Z0IDAuNjgyNDIxIDAuMzA0Njc5Cit2dCAwLjY4MjQyMSAwLjMwNDQzNwordnQgMC42OTYyMjIgMC4zMDQ0MTgKK3Z0IDAuNjk0MDk0IDAuMzA0NDM3Cit2dCAwLjc3Mjg5MyAwLjMwMDQyMwordnQgMC42OTM3MjAgMC4zMDQ0MzcKK3Z0IDAuNzc0NDM2IDAuMzAyOTExCit2dCAwLjAzNzg1MiAwLjYwNTY0OAordnQgMC4wMzg4OTQgMC42MDU2NDgKK3Z0IDAuNjk2ODMwIDAuNTM2OTMyCit2dCAwLjY5NjgzMCAwLjUzNzE3NAordnQgMC42OTY2ODEgMC41MzcxNzUKK3Z0IDAuNjk2NjgxIDAuNTM2OTMzCit2dCAwLjY5MjE2NyAwLjMwNDQzNwordnQgMC42ODg5NzkgMC4zMDQ0MzYKK3Z0IDAuNjg1MjkzIDAuMzA0NDM1Cit2dCAwLjY4ODU2MiAwLjM0Nzc0MgordnQgMC42ODg1NjIgMC4zNDcyMTEKK3Z0IDAuNjg4OTc5IDAuMzQ3MjExCit2dCAwLjY4MjQyMSAwLjM0NzczOQordnQgMC42ODI4MzkgMC4zNDc3NDAKK3Z0IDAuOTM1MjkyIDAuNjA0NDM5Cit2dCAwLjkzNTI5MiAwLjYwMTU0NAordnQgMC45MzU0NDEgMC42MDE1NDMKK3Z0IDAuNDI1NjQ4IDAuOTM5MzkwCit2dCAwLjQyNTc5NyAwLjk0MjI4MQordnQgMC40MjU2NDggMC45NDIyODkKK3Z0IDAuNjg4MDY5IDAuMzQ3NzQxCit2dCAwLjY4ODA2OSAwLjM0NzQ5MAordnQgMC42ODgzMjUgMC4zNDc0OTAKK3Z0IDAuOTM1MjkyIDAuNjAxMjk0Cit2dCAwLjkzNTQ0MSAwLjYwMTI5MgordnQgMC4wMzc4NTIgMC42MDU0MDYKK3Z0IDAuMDM3NTUwIDAuNjA1NjQ4Cit2dCAwLjgwMzY3NyAwLjk4ODU1MAordnQgMC44MDM0ODggMC45ODgzOTkKK3Z0IDAuODAzNjc3IDAuOTg4MTYyCit2dCAwLjA0MzU4OSAwLjU5NDM5MgordnQgMC4wNDM2MTIgMC41OTQ2NDIKK3Z0IDAuMDQzMzEwIDAuNTk0NjcwCit2dCAwLjgzNjMzMSAwLjk4ODIxNQordnQgMC44MzYxMzggMC45ODgwNTUKK3Z0IDAuODM2MzMxIDAuOTg3ODIyCit2dCAwLjA0MzI4NyAwLjU5NDQyMAordnQgMC4zOTk2NDggMC42OTUzNjIKK3Z0IDAuMzk5MzI2IDAuNjk1MzYyCit2dCAwLjM5OTMyNiAwLjY5NTE1OAordnQgMC4zOTk2NDggMC42OTUxNTgKK3Z0IDAuODI0NzE5IDAuOTg5Mjk1Cit2dCAwLjgyNDU1MiAwLjk4OTE5NAordnQgMC44MjQ3MTkgMC45ODg5MTgKK3Z0IDAuODc3NzA0IDAuMjU0NDk4Cit2dCAwLjg3NzcwNCAwLjI1NDY5MgordnQgMC44NzczODIgMC4yNTQ2OTIKK3Z0IDAuMzQ0NDU4IDAuODczNDc4Cit2dCAwLjM0NDEzNSAwLjg3MzQ3OAordnQgMC4zNDQxMzUgMC44NzEwMjQKK3Z0IDAuMzQ0NDU4IDAuODcxMDI0Cit2dCAwLjM0NDEyOCAwLjg3MDYwNgordnQgMC4zNDQ0NDkgMC44NzA2MDYKK3Z0IDAuMzQ0MDQ1IDAuODcwNDU2Cit2dCAwLjM0NDM0MiAwLjg3MDQ1NgordnQgMC44NzczMTggMC4yNjA0ODkKK3Z0IDAuODc2Mjc1IDAuMjYwNDg4Cit2dCAwLjg3NjI3NCAwLjI2MDMzOQordnQgMC44NzczODIgMC4yNjAzMzkKK3Z0IDAuMjc4NjA4IDAuNzQwOTM4Cit2dCAwLjI3ODYwOCAwLjc0MTU0MgordnQgMC4yNzgyOTcgMC43NDE1NDIKK3Z0IDAuMjc4Mjk3IDAuNzQwOTM4Cit2dCAwLjQ4Mjc3NiAwLjg5MzMzNQordnQgMC40ODI3NzYgMC44OTE2MTIKK3Z0IDAuNDgzMDg3IDAuODkxNjEyCit2dCAwLjQ4MzA4NyAwLjg5MzMzNQordnQgMC40ODI3NzYgMC44ODkxNTgKK3Z0IDAuNDgzMDg3IDAuODg5MTU4Cit2dCAwLjQ4Mjc3NiAwLjg4ODc0MAordnQgMC40ODMwODcgMC44ODg3NDAKK3Z0IDAuNTUwMDM3IDAuODkzMjQwCit2dCAwLjU0OTcyNiAwLjg5MzI0MAordnQgMC41NDk3MjYgMC44OTA3ODYKK3Z0IDAuNTUwMDM3IDAuODkwNzg2Cit2dCAwLjU0OTcyNiAwLjg5MzY1OAordnQgMC41NTAwMzcgMC44OTM2NTgKK3Z0IDAuMjc4NjA4IDAuNzcxNzY1Cit2dCAwLjI3ODI5NyAwLjc3MTc2NQordnQgMC4yNzg2MDggMC43NzIzNzQKK3Z0IDAuMjc4Mjk3IDAuNzcyMzc0Cit2dCAwLjk3OTE0MCAwLjYwMjA0MwordnQgMC45Nzg4NTIgMC42MDEzMzUKK3Z0IDAuOTc5MTQwIDAuNjAxMjE4Cit2dCAwLjU1MDAzNyAwLjg4ODMwMgordnQgMC41NTAwMzcgMC44ODkwNjcKK3Z0IDAuNTQ5NzI2IDAuODg5MDY3Cit2dCAwLjQ4MjY4OCAwLjg4ODU5MQordnQgMC40ODI5NzMgMC44ODg1OTEKK3Z0IDAuNTQ5NjM4IDAuODkzODA3Cit2dCAwLjU0OTA3NyAwLjg5MzgwNwordnQgMC41NDkwNzYgMC44OTM2NTgKK3Z0IDAuNDQzOTI0IDAuNzE0MjE5Cit2dCAwLjQ0MzkyNCAwLjcxMzYxMgordnQgMC40NDQyMzUgMC43MTM2MTIKK3Z0IDAuNDQ0MjM1IDAuNzE0MjE5Cit2dCAwLjQ2MTE1NyAwLjg5Mjg2OQordnQgMC40NjExNTcgMC44OTExNTAKK3Z0IDAuNDYxNDY4IDAuODkxMTUwCit2dCAwLjQ2MTQ2OCAwLjg5Mjg2OQordnQgMC40NjExNTcgMC44ODg2OTYKK3Z0IDAuNDYxNDY4IDAuODg4Njk2Cit2dCAwLjQ2MTE1NyAwLjg4ODI3OAordnQgMC40NjE0NjggMC44ODgyNzgKK3Z0IDAuODkyNTk3IDAuNDU2NDY3Cit2dCAwLjg5MjI4NiAwLjQ1NjQ2NwordnQgMC44OTIyODYgMC40NTQwMTQKK3Z0IDAuODkyNTk3IDAuNDU0MDE0Cit2dCAwLjg5MjI4NiAwLjQ1Njg4NQordnQgMC44OTI1OTcgMC40NTY4ODUKK3Z0IDAuNDQzOTI0IDAuNjQ2NTA5Cit2dCAwLjQ0NDIzNSAwLjY0NjUwOQordnQgMC40NDM5MjQgMC42NDU5MzUKK3Z0IDAuNDQ0MjM1IDAuNjQ1OTM1Cit2dCAwLjk3ODk2NyAwLjM3MzI3MQordnQgMC45Nzg2NzkgMC4zNzI1NTcKK3Z0IDAuOTc4OTY3IDAuMzcyNDQwCit2dCAwLjg5MjU5NyAwLjQ1MTUyOAordnQgMC44OTI1OTcgMC40NTIyOTcKK3Z0IDAuODkyMjg2IDAuNDUyMjk3Cit2dCAwLjg5MjE5NyAwLjQ1NzAzNgordnQgMC44OTE2MzUgMC40NTcwMzYKK3Z0IDAuODkxNjM1IDAuNDU2ODg1Cit2dCAwLjQ2MTA2OSAwLjg4ODEyOQordnQgMC40NjEzNTQgMC44ODgxMjkKK3Z0IDAuOTgzNjExIDAuMTA4NzMzCit2dCAwLjk4MzQ3NyAwLjEwODUzMQordnQgMC45ODM2MTEgMC4xMDc5MzkKK3Z0IDAuNzE1MzY2IDAuMTk1MDcxCit2dCAwLjcxNTE5MCAwLjE5NTA3NQordnQgMC43MTUxOTAgMC4xOTQyOTcKK3Z0IDAuODgwMDUwIDAuNzc1ODA5Cit2dCAwLjg3OTg3NCAwLjc3NTc5NQordnQgMC44ODAwNTAgMC43NzMzNDgKK3Z0IDAuNzIwMzA2IDAuMjYyNzAzCit2dCAwLjcyMDMwNSAwLjI2Mjg3OQordnQgMC43MTc4NTIgMC4yNjI4NzgKK3Z0IDAuODkyNDQ2IDAuOTg3MDM0Cit2dCAwLjg5MjI4NCAwLjk4Njk2NQordnQgMC44OTI0NDYgMC45ODY1ODAKK3Z0IDAuNzIwNzI0IDAuMjYyNzAzCit2dCAwLjcyMDcyMyAwLjI2Mjg3OQordnQgMC45MTI3NDIgMC43MTk4MzkKK3Z0IDAuOTEyNjMwIDAuNzE5NzAzCit2dCAwLjkxMjc0MiAwLjcxOTYwMwordnQgMC44NzAyNDIgMC45OTAyNzAKK3Z0IDAuODcwMTMwIDAuOTkwMTM1Cit2dCAwLjg3MDI0MiAwLjk5MDAzNAordnQgMC43MTYxMzYgMC4xOTQ0NjQKK3Z0IDAuNzE2MTM1IDAuMTk0Mjk3Cit2dCAwLjk2MzM2MyAwLjIwMzYzMAordnQgMC45NjMxOTcgMC4yMDM2MTUKK3Z0IDAuOTYzMzYzIDAuMjAxOTA2Cit2dCAwLjk1MTU2NCAwLjI5MjUyMgordnQgMC45NTEzOTggMC4yOTI1MTEKK3Z0IDAuOTUxNTY0IDAuMjkwMDY0Cit2dCAwLjcxNzg1MyAwLjE5NDQ2NAordnQgMC44NTg5MzYgMC45ODgxNDAKK3Z0IDAuODU5MTAyIDAuOTg4MTM5Cit2dCAwLjg1OTEwMiAwLjk4ODU1NwordnQgMC44NjkxODEgMC43NzQ2MDEKK3Z0IDAuOTkwNTYwIDAuNTc2MDE1Cit2dCAwLjk5MDQ0OSAwLjU3NTg4OQordnQgMC45OTA1NjAgMC41NzU3ODYKK3Z0IDAuODQ2NjA5IDAuNzc1Njg1Cit2dCAwLjg0NjcyMiAwLjc3NTg1NQordnQgMC44NDY1NzMgMC43NzU4NTUKK3Z0IDAuNzQ5NzA1IDAuOTg5MzczCit2dCAwLjc0OTU3NCAwLjk4OTI0NAordnQgMC43NDk3MDUgMC45ODg5NzEKK3Z0IDAuNDI1NzcwIDAuOTg5Mzg4Cit2dCAwLjQyNTY0OCAwLjk4OTI0NAordnQgMC40MjU3NzAgMC45ODg5ODYKK3Z0IDAuNDQ1OTQwIDAuNjM1MzEwCit2dCAwLjQ0NjUwMCAwLjYzNTEzMQordnQgMC4zNTY4NTQgMC45ODQ2MTMKK3Z0IDAuMzU2NjgzIDAuOTg0NjEzCit2dCAwLjM1NjY4NCAwLjk4NDA1MQordnQgMC4xNTI1MTMgMC42NTA3NDkKK3Z0IDAuMTUyNjg4IDAuNjUwNzQ1Cit2dCAwLjE1MjY4OCAwLjcxNzgwMgordnQgMC43MTUzNjYgMC4yNjIxMjcKK3Z0IDAuNzE1MTkwIDAuMjYyMTMyCit2dCAwLjU0OTI0NSAwLjk4NDMzNgordnQgMC41NDkwNzYgMC45ODQyODgKK3Z0IDAuNTQ5MjQ1IDAuOTgzNzQxCit2dCAwLjcxNTM2NiAwLjI2MjcwMQordnQgMC43MTUxOTAgMC4yNjI4NzcKK3Z0IDAuNzE2MTMzIDAuMjYyNzAxCit2dCAwLjcxNjEzMiAwLjI2Mjg3OAordnQgMC45NzkxNzUgMC42NjU2MzIKK3Z0IDAuOTc5MDM0IDAuNjY1NDI4Cit2dCAwLjk3OTE3NSAwLjY2NDY3NAordnQgMC45ODMzMTggMC4xMjg3NTcKK3Z0IDAuOTgzMTk5IDAuMTI4NTA4Cit2dCAwLjk4MzMxOCAwLjEyNzkxNgordnQgMC43MTUzNjggMC4yOTQwNzAKK3Z0IDAuNzE1MjAyIDAuMjk0MDc1Cit2dCAwLjcxNTIwMiAwLjI5MzI0NgordnQgMC45NTEzNjUgMC4wMDc3NzMKK3Z0IDAuOTUxMjAwIDAuMDA3NzYxCit2dCAwLjk1MTM2NSAwLjAwNTMxMwordnQgMC43MjAzMDYgMC4zMjQ4ODIKK3Z0IDAuMjI4MjQ3IDAuOTg3MjkxCit2dCAwLjIyODA5MyAwLjk4NzIyOQordnQgMC4yMjgyNDcgMC45ODY4NDAKK3Z0IDAuMTAyNzQ5IDAuOTg3MDc5Cit2dCAwLjEwMjU5NSAwLjk4NzAxNwordnQgMC4xMDI3NDkgMC45ODY2MjkKK3Z0IDAuMDYzMjU3IDAuOTkwNDE0Cit2dCAwLjA2MzE0NyAwLjk5MDI5MAordnQgMC4wNjMyNTcgMC45OTAxODcKK3Z0IDAuOTkwNjM0IDAuODc2MTE1Cit2dCAwLjk5MDUyNSAwLjg3NTk5MgordnQgMC45OTA2MzQgMC44NzU4ODcKK3Z0IDAuNzE2MTMzIDAuMjkzNDY3Cit2dCAwLjcxNjEzMiAwLjI5MzI0NwordnQgMC43MTc4NTIgMC4yOTMyNDcKK3Z0IDAuOTYyMTYzIDAuMTA5NjcyCit2dCAwLjk2MTk0NSAwLjEwOTY0NQordnQgMC45NjIxNjMgMC4xMDc5MzkKK3Z0IDAuMTc3NzMzIDAuOTQ3MjI5Cit2dCAwLjE3Nzk1MyAwLjk0NzIyOAordnQgMC4xNzc5NTMgMC45NDk2ODEKK3Z0IDAuNzE3ODUyIDAuMjkzNDY3Cit2dCAwLjcyMDMwNSAwLjI5MzI0OAordnQgMC45NDc3MTIgMC45ODU5NDkKK3Z0IDAuOTQ3OTMyIDAuOTg1OTQ3Cit2dCAwLjk0NzkzMiAwLjk4NjM2NQordnQgMC43MjAzMDYgMC4yOTM0NjgKK3Z0IDAuNzIwNzIzIDAuMjkzMjQ4Cit2dCAwLjkwMTMwOSAwLjQ4NDY5OAordnQgMC45MDExODYgMC40ODQ1MTMKK3Z0IDAuOTAxMzA5IDAuNDg0NDI3Cit2dCAwLjgwODE2OCAwLjExNzA1MgordnQgMC44MDgyODMgMC4xMTcyNzYKK3Z0IDAuODA4MTMzIDAuMTE3Mjc2Cit2dCAwLjM5OTYyNCAwLjc3OTI0NgordnQgMC4zOTk1NjQgMC43NzkwMjEKK3Z0IDAuNDAwMTg1IDAuNzc5MDIxCit2dCAwLjI3ODUwNiAwLjk4Mzk5NAordnQgMC4yNzgyOTcgMC45ODM5MTEKK3Z0IDAuMjc4NTA2IDAuOTgzMzkwCit2dCAwLjEwODc4OSAwLjUwOTE3NwordnQgMC45ODk3NzcgMC42Nzc0OTcKK3Z0IDAuOTg5NjYxIDAuNjc3MzYwCit2dCAwLjk4OTc3NyAwLjY3NzEwMAordnQgMC42OTQ3MjYgMC43NTE3MTAKK3Z0IDAuNjk0ODkyIDAuNzUxNzA2Cit2dCAwLjY5NDg5MiAwLjc4MTkwNwordnQgMC43MTUzNjggMC4zMjQyNzIKK3Z0IDAuNzE1MjAyIDAuMzI0Mjc3Cit2dCAwLjg2ODY4MSAwLjM3Njk2NAordnQgMC44Njg1MTQgMC4zNzY5NjQKK3Z0IDAuODY4NTMxIDAuMzc2MzU2Cit2dCAwLjcxNTM2OCAwLjMyNDg4MQordnQgMC43MTUyMDIgMC4zMjUwNDYKK3Z0IDAuNzE2MTI5IDAuMzI0ODgxCit2dCAwLjcxNjEyOCAwLjMyNTA0NwordnQgMC45ODAyNjUgMC41MTAyODgKK3Z0IDAuOTgwMTMyIDAuNTEwMDk1Cit2dCAwLjk4MDI2NiAwLjUwOTM0NgordnQgMC42ODI4NDAgMC4zNDc0MTMKK3Z0IDAuNjgyODM5IDAuMzQ3NDg4Cit2dCAwLjY4MjQyMSAwLjM0NzQ4OAordnQgMC42ODI0MjIgMC4zNDc0MTMKK3Z0IDAuMzMwOTY0IDAuOTk0Mjc2Cit2dCAwLjMzMTAzOSAwLjk5NDQyMwordnQgMC45MzUzNzYgMC42MDEyMTgKK3Z0IDAuNjg3NzI2IDAuMzA0NzQyCit2dCAwLjY4Nzc3NiAwLjMwNDY4MAordnQgMC42ODgzMjQgMC4zMDQ2ODAKK3Z0IDAuOTg5NzM1IDAuNzE3NjE0Cit2dCAwLjk4OTc5NiAwLjcxNzYxNAordnQgMC45ODk3OTYgMC43MTgwMzEKK3Z0IDAuOTg5Nzk2IDAuNTIzMjA3Cit2dCAwLjk4OTcyOSAwLjUyMzE5NgordnQgMC45ODk3OTYgMC41MjI3ODQKK3Z0IDAuOTkzNDgyIDAuMjcxNjM4Cit2dCAwLjk5MzQzOCAwLjI3MTU4NwordnQgMC45OTM0ODIgMC4yNzE0MDgKK3Z0IDAuOTk0NTU1IDAuMDA1NTAwCit2dCAwLjk5NDUwNSAwLjAwNTQ1MwordnQgMC45OTQ1NTUgMC4wMDUzMTMKK3Z0IDAuOTkwMjU5IDAuODM3MDgzCit2dCAwLjk5MDIwMSAwLjgzNzA1MQordnQgMC45OTAyNTkgMC44MzY3NTQKK3Z0IDAuOTkwMjkxIDAuNDk1NjU1Cit2dCAwLjk5MDIzMyAwLjQ5NTYxNwordnQgMC45OTAyOTEgMC40OTUzMjYKK3Z0IDAuMDQzNjE4IDAuNTk0NzE3Cit2dCAwLjA0NDY1MCAwLjU5NDU0NwordnQgMC45MzcwNjIgMC45NzY2NjEKK3Z0IDAuOTM2OTg4IDAuOTc2NjYxCit2dCAwLjkzNjk5NCAwLjk3NTYxOAordnQgMC45ODA0NzggMC44OTQwMDEKK3Z0IDAuOTgwNTQzIDAuODk0MjgxCit2dCAwLjM5OTI2MSAwLjY5NTA4MwordnQgMC43MjA3NDIgMC4wMTQwNTAKK3Z0IDAuNzIwNzI0IDAuMDI0NTUwCit2dCAwLjcyMDMwNiAwLjAyNDU1MAordnQgMC43MjAzMjQgMC4wMTQwNTAKK3Z0IDAuNzIwNzkwIDAuMDA1MzE2Cit2dCAwLjcyMDM3MiAwLjAwNTMxNgordnQgMC4wNDk5MDIgMC44NjUxNzQKK3Z0IDAuMDQ5OTQwIDAuODczNzQzCit2dCAwLjA0OTUyMiAwLjg3Mzc0MwordnQgMC4zOTQ3MTYgMC42NTYyNjAKK3Z0IDAuMzk0Njc3IDAuNjQ3NjkyCit2dCAwLjM5NTA5NSAwLjY0NzY5MgordnQgMC4zOTUwNzkgMC42Mzc4MjYKK3Z0IDAuMzk0NjYxIDAuNjM3ODI2Cit2dCAwLjM5NTA0NyAwLjQ3NDA3NgordnQgMC4zOTUwNTAgMC40ODc3MzQKK3Z0IDAuMzk0NjMyIDAuNDg3NzM0Cit2dCAwLjM5NDYyOSAwLjQ3NDA3NgordnQgMC4zOTUwNTggMC40NjM1NDIKK3Z0IDAuMzk0NjQwIDAuNDYzNTQyCit2dCAwLjY4MjQyMSAwLjAyNDM3MAordnQgMC42ODI0NDkgMC4wMTM5MTYKK3Z0IDAuNjgyODY3IDAuMDEzOTE2Cit2dCAwLjY4MjgzOSAwLjAyNDM3MAordnQgMC42ODI1MjUgMC4wMDUzMTMKK3Z0IDAuNjgyOTQzIDAuMDA1MzEzCit2dCAwLjM5NTA5NSAwLjQ1NTAxOAordnQgMC41OTU0MjIgMC44NzM4NjAKK3Z0IDAuNTk1MDA0IDAuODY1MzQ2Cit2dCAwLjU5NTQyMiAwLjg2NTMyMwordnQgMC4zOTUwNzUgMC42MTQ4OTAKK3Z0IDAuMzk1MDc2IDAuNjE2OTcxCit2dCAwLjM5NDY1NyAwLjYxNzAyOAordnQgMC4zOTQ2NTcgMC42MTQ4OTAKK3Z0IDAuMzk0NjYwIDAuNjI5NjU5Cit2dCAwLjM5NTA3OCAwLjYyOTc3NQordnQgMC4zOTUwNzggMC42MzAzMDQKK3Z0IDAuMzk0NjYwIDAuNjMwMTY2Cit2dCAwLjcwOTA1MCAwLjAyNDU0NgordnQgMC43MDY5NDkgMC4wMjQ0OTkKK3Z0IDAuNzA2OTY2IDAuMDE0NDkwCit2dCAwLjcwOTA2OCAwLjAxNDA0NwordnQgMC43MDkxMTYgMC4wMDUzMTMKK3Z0IDAuNzA3MDEyIDAuMDA2MTQzCit2dCAwLjg0MjIxMCAwLjMwNzg0NQordnQgMC44NDIyMTAgMC4zMTY0MTMKK3Z0IDAuODQwMTA4IDAuMzE1NTUzCit2dCAwLjM4MTM1NCAwLjY1NTQxMQordnQgMC4zODEzMTYgMC42NDcyMjEKK3Z0IDAuMzgzNDIxIDAuNjQ3Njk0Cit2dCAwLjM4MzQwNSAwLjYzNzgyOAordnQgMC4zODEzMDIgMC42Mzc2NTAKK3Z0IDAuMzgzNDAyIDAuNjIzNTQ1Cit2dCAwLjM4MTI5OSAwLjYyMzU0MgordnQgMC4zODM0MDEgMC42MTQ4OTIKK3Z0IDAuMzgxMjk3IDAuNjE0ODg5Cit2dCAwLjM4MzM3NiAwLjQ4NzczNgordnQgMC4zODEyNzIgMC40ODc3MzIKK3Z0IDAuMzgxMjcwIDAuNDc0MTk2Cit2dCAwLjM4MzM3MyAwLjQ3NDA3OAordnQgMC4zODEyODAgMC40NjQwMzcKK3Z0IDAuMzgzMzg0IDAuNDYzNTQ0Cit2dCAwLjM4MzQyMSAwLjQ1NTAyMAordnQgMC4zODEzMTUgMC40NTU4ODQKK3Z0IDAuMzQ1MTUzIDAuODMwMzUyCit2dCAwLjM0NTE1MyAwLjgzODk1NgordnQgMC4zNDMwMjMgMC44MzgxMjYKK3Z0IDAuNjk2MzIxIDAuMDA2MTY1Cit2dCAwLjY5NjI0OCAwLjAxNDQyOQordnQgMC42OTQxMjIgMC4wMTM5MTkKK3Z0IDAuNjk0MDk0IDAuMDI0MzcyCit2dCAwLjY5NjIyMiAwLjAyNDM1MwordnQgMC43Njc0ODUgMC43NTE4NTUKK3Z0IDAuNzY4MzgxIDAuNzUxODU1Cit2dCAwLjc3MDMwNyAwLjc2MTQ0MgordnQgMC4yNTkyMjggMC44MzU2MzcKK3Z0IDAuMjYwMTI0IDAuODM1NDU0Cit2dCAwLjI2MDEyNCAwLjg0NTU5MAordnQgMC4yNDI4NjAgMC44Mzk5MDgKK3Z0IDAuMjQyODYwIDAuODQ5Njk5Cit2dCAwLjI0MTk2MiAwLjg0OTUyNgordnQgMC41MzQxMTQgMC44NTA3NTUKK3Z0IDAuNTMzMjM5IDAuODQxMzU2Cit2dCAwLjUzNDExNCAwLjg0MTA5NQordnQgMC44NDc5MjggMC43MzA0OTcKK3Z0IDAuODQ3OTI4IDAuNzQwMzczCit2dCAwLjg0NzAzMiAwLjc0MDE5NgordnQgMC4zMzgzOTYgMC40NjA1MzQKK3Z0IDAuMzMzMzk3IDAuNDY4NjM0Cit2dCAwLjMzMjUzNSAwLjQ2ODMxNQordnQgMC4xMzYwNjUgMC44NDAwMzEKK3Z0IDAuMTM2MDY1IDAuODQ5ODAwCit2dCAwLjEzNTE2MyAwLjg0OTYyMwordnQgMC4zMzE4NjUgMC40NzgwNzIKK3Z0IDAuMzMwOTY0IDAuNDc3OTU2Cit2dCAwLjgyNjAwOCAwLjYyNjk0NQordnQgMC44MjYwMDggMC42NDEwNTMKK3Z0IDAuODI1MTExIDAuNjQwOTA1Cit2dCAwLjMzMjM3NSAwLjQ5MjAyMwordnQgMC4zMzE0NzkgMC40OTIwNTUKK3Z0IDAuNDAwMTU3IDAuODU1Mzg4Cit2dCAwLjQwMDE1NyAwLjg2NDA0MQordnQgMC4zOTkyNjEgMC44NjQwNDEKK3Z0IDAuMzMyNjkwIDAuNTAwNjcwCit2dCAwLjMzMTc5NCAwLjUwMDcwMwordnQgMC4zMzY0MzMgMC42Mjc3NzUKK3Z0IDAuMzM3MzI5IDAuNjI3NzQzCit2dCAwLjMzNzgxOSAwLjY0MTE3NwordnQgMC43NTE1NzMgMC44MTYzMTYKK3Z0IDAuNzUyNDcwIDAuODE2MjI0Cit2dCAwLjc1MjQ3MCAwLjgyOTc2MAordnQgMC44NDE1ODIgMC4yMzQ0MDQKK3Z0IDAuODQxNTgyIDAuMjQ0NzM1Cit2dCAwLjg0MDY4NCAwLjI0NDY2MAordnQgMC4zNDAwMzcgMC42NTA5OTUKK3Z0IDAuMzM5MjA3IDAuNjUxMzc5Cit2dCAwLjg0ODU1OCAwLjgzNjc1NAordnQgMC44NDg1NTggMC44NDY1ODUKK3Z0IDAuODQ3NjYyIDAuODQ2NDA0Cit2dCAwLjM0NTY0MiAwLjY1ODYzOQordnQgMC4zNDUwMjAgMC42NTkzMDgKK3Z0IDAuODQ4MTA3IDAuNzg2NTAxCit2dCAwLjg0ODEwNyAwLjc5NjM2MwordnQgMC44NDcyMTAgMC43OTYxODgKK3Z0IDAuMTg5NjQwIDAuODUwMDU0Cit2dCAwLjE4ODc2NCAwLjg0MDU4OAordnQgMC4xODk2NDAgMC44NDAzMjcKK3Z0IDAuMjE0ODA2IDAuODM2ODM0Cit2dCAwLjIxNDgwNiAwLjg0NjkyMwordnQgMC4yMTM5MTAgMC44NDY3NDMKK3Z0IDAuNzcwMTE0IDAuMDEzMzAxCit2dCAwLjc2ODM3OCAwLjAyMjg3OQordnQgMC43Njc0ODEgMC4wMjI4OTYKK3Z0IDAuNzA5NDQyIDAuMDE0MDQ3Cit2dCAwLjcwOTQyNCAwLjAyNDU0NgordnQgMC43MDk0OTAgMC4wMDUzMTMKK3Z0IDAuMzgzNzk1IDAuNjQ3Njk0Cit2dCAwLjM4MzgzNCAwLjY1NjI2MgordnQgMC41NzA4MDkgMC44NzQwMDIKK3Z0IDAuNTcwNDM2IDAuODczOTg0Cit2dCAwLjU3MDgwOSAwLjg2NTQyNAordnQgMC4zODM3NzkgMC42Mzc4MjgKK3Z0IDAuMzgzNzQ3IDAuNDc0MDc4Cit2dCAwLjM4Mzc1MCAwLjQ4NzczNgordnQgMC4zODM3NTggMC40NjM1NDQKK3Z0IDAuNjkzNzIwIDAuMDI0MzcyCit2dCAwLjY5Mzc0OCAwLjAxMzkxOQordnQgMC42OTM4MjQgMC4wMDUzMTUKK3Z0IDAuNjk0MTk4IDAuMDA1MzE1Cit2dCAwLjM4Mzc5NSAwLjQ1NTAyMAordnQgMC4zODM3NzYgMC42MjM1NDUKK3Z0IDAuNzcwODY5IDAuNzYxMjA5Cit2dCAwLjc2ODk3OSAwLjc1MTg1NQordnQgMC4zMzg4NDEgMC40NjA5NDkKK3Z0IDAuMzQ2MDU2IDAuNDU1MDE4Cit2dCAwLjg2MzM0MiAwLjExNzI3OAordnQgMC44NjI3NTMgMC4xMTcxMjMKK3Z0IDAuODYzMzQyIDAuMTA3OTM5Cit2dCAwLjMzMzk2NiAwLjQ2ODg0OQordnQgMC4zMzI0NjUgMC40NzgxMzgKK3Z0IDAuMzMyOTcxIDAuNDkyMDAxCit2dCAwLjMzODQxNCAwLjY0MTA5OAordnQgMC4zMzc5MjUgMC42Mjc3MjEKK3Z0IDAuMzQwNTg5IDAuNjUwNzQwCit2dCAwLjM0NjA1NiAwLjY1ODE5MwordnQgMC43NzA2ODAgMC4wMTM1MjYKK3Z0IDAuNzc1MjcwIDAuMDA1MzEzCit2dCAwLjg2Mzg1NCAwLjA3NjE0MQordnQgMC44NjMyNjUgMC4wNzU5ODcKK3Z0IDAuODYzODU0IDAuMDY2NzMzCit2dCAwLjc2ODk3NSAwLjAyMjg2NgordnQgMC4zMDU1MTcgMC42NDcyNDkKK3Z0IDAuMzA2ODU2IDAuNjU3NjAyCit2dCAwLjMwNjU2MyAwLjY1NzcwNwordnQgMC4zMDUyMTUgMC42NDcyMjcKK3Z0IDAuMzExOTA3IDAuNjY2MzU4Cit2dCAwLjMxMTY3NCAwLjY2NjU1NQordnQgMC4zMTk3MDAgMC42NzI4OTcKK3Z0IDAuMzE5ODQ1IDAuNjcyNjExCit2dCAwLjE3Mjc1NCAwLjU3MTY2MwordnQgMC4xNzIzODIgMC41NzE2MjIKK3Z0IDAuMTc0NzE1IDAuNTYxMjI0Cit2dCAwLjg1MTU3MyAwLjI4MjAyOQordnQgMC44NTEyNjIgMC4yODE5NTEKK3Z0IDAuODUxNTczIDAuMjcxNDA4Cit2dCAwLjE3MjI5MCAwLjU4NTI4MgordnQgMC4xNzE5MTggMC41ODUyNjkKK3Z0IDAuMjE0MDYzIDAuNjgwMjA2Cit2dCAwLjIxNjYwNCAwLjY3MDUxNAordnQgMC4yMTY5NjYgMC42NzA2MjQKK3Z0IDAuMjE0Mjg2IDAuNjgwMTgzCit2dCAwLjIxNTc1MyAwLjY5MDI5NgordnQgMC4yMTU0NjIgMC42OTAzOTYKK3Z0IDAuMjIwODA0IDAuNjk5MDE2Cit2dCAwLjIyMDU3MiAwLjY5OTIxOQordnQgMC40NDU1MTQgMC40NTUwMTgKK3Z0IDAuNDQzNTc2IDAuNDY1Mjg4Cit2dCAwLjQ0MzI3MyAwLjQ2NTI5MgordnQgMC44NTE3MDkgMC4xNjQ5MTEKK3Z0IDAuODUxNzA5IDAuMTc1NDgzCit2dCAwLjg1MTQwNyAwLjE3NTQyMwordnQgMC4yNzg0NDggMC44NTcyNDAKK3Z0IDAuMjc4Mjk3IDAuODQ2ODA2Cit2dCAwLjI3ODQ0OCAwLjg0Njc5OAordnQgMC44NTI5ODggMC4zMDc4NDUKK3Z0IDAuODUyOTg4IDAuMzE4NDgyCit2dCAwLjg1MjgzNyAwLjMxODQ0NQordnQgMC4yMjA0NTEgMC42OTkzMTcKK3Z0IDAuODU5MDk3IDAuNjI2OTQ1Cit2dCAwLjg1OTA5NyAwLjYzNzIwNQordnQgMC44NTg5NDAgMC42MzcxNjQKK3Z0IDAuMjE1MzA1IDAuNjkwNDM5Cit2dCAwLjg1NzkxMiAwLjY1MTY3OQordnQgMC44NTc5MTIgMC42NjIwMTYKK3Z0IDAuODU3NzYxIDAuNjYxOTg1Cit2dCAwLjIxMzkxMCAwLjY4MDE5NwordnQgMC44NjM4MjQgMC4zMDc4NDUKK3Z0IDAuODYzODI0IDAuMzE3OTI3Cit2dCAwLjg2MzYxNSAwLjMxNzg5MwordnQgMC4xNzE3MDYgMC41ODUyNjIKK3Z0IDAuNDcxNDk5IDAuODI0NjYyCit2dCAwLjQ3MTQ5OSAwLjgzODMyMAordnQgMC40NzEyODcgMC44MzgzMTcKK3Z0IDAuODUyNDE3IDAuMjQ1MDk4Cit2dCAwLjg1MjIxMCAwLjIzNDQ0NAordnQgMC44NTI0MTcgMC4yMzQ0MDQKK3Z0IDAuODUyNDkzIDAuMDI0NDIxCit2dCAwLjg1MjQ5MyAwLjAzNTE0NQordnQgMC44NTIzNDMgMC4wMzUxMTQKK3Z0IDAuNTk1MTU1IDAuODU0Njk4Cit2dCAwLjU5NTAwNCAwLjg0NDEzMwordnQgMC41OTUxNTUgMC44NDQwOTQKK3Z0IDAuNjMwMjAzIDAuODQzODEyCit2dCAwLjYzMDIwMyAwLjg1NDQ0MwordnQgMC42MzAwNTcgMC44NTQ0MTUKK3Z0IDAuMzExNTU4IDAuNjY2NjY4Cit2dCAwLjg1ODMwNyAwLjY3NzEwMAordnQgMC44NTgzMDcgMC42ODczODIKK3Z0IDAuODU4MTU0IDAuNjg3MzU3Cit2dCAwLjMxOTYzMSAwLjY3MzAzNAordnQgMC44NTgyNDggMC43MDQyMjQKK3Z0IDAuODU4MjQ4IDAuNzE0NTA0Cit2dCAwLjg1ODA4NyAwLjcxNDQ4MwordnQgMC4yMDI1NjAgMC45ODQzMTUKK3Z0IDAuMjAyMzY3IDAuOTg0MjI3Cit2dCAwLjIwMjU2MCAwLjk4MzczNAordnQgMC4yMTk5NTAgMC42NjMxOTgKK3Z0IDAuMjIwMTIxIDAuNjYzMzI5Cit2dCAwLjIxOTkwMiAwLjY2Mzc3NgordnQgMC43MTc4NzAgMC4wMTQwNDkKK3Z0IDAuNzE3ODUyIDAuMDI0NTQ5Cit2dCAwLjcxNzkxOSAwLjAwNTMxNgordnQgMC4zOTIyMjMgMC42NDc2OTIKK3Z0IDAuNTcyNzkyIDAuODMzNTg1Cit2dCAwLjU3MDQzNiAwLjgzMjkwMAordnQgMC41NzI3OTIgMC44MjQ2NjIKK3Z0IDAuMzkyMjA4IDAuNjM3ODI3Cit2dCAwLjM5MjE3NSAwLjQ3NDA3NgordnQgMC4zOTIxNzggMC40ODc3MzQKK3Z0IDAuMzkyMTg3IDAuNDYzNTQzCit2dCAwLjY4NTI5MiAwLjAyNDM3MAordnQgMC42ODUzMjAgMC4wMTM5MTcKK3Z0IDAuNjg1Mzk3IDAuMDA1MzEzCit2dCAwLjYzMDA1NyAwLjgyNDY3MwordnQgMC42MzI1MTAgMC44MjQ2NjIKK3Z0IDAuNjMyNTEwIDAuODMzMTg2Cit2dCAwLjM5MjIyMyAwLjQ1NTAxOAordnQgMC4zOTIyMDYgMC42Mjk0ODkKK3Z0IDAuMzkyMjA2IDAuNjI4OTg0Cit2dCAwLjcxMDk5NSAwLjAxNDA0NwordnQgMC43MTQxODMgMC4wMTQwNDgKK3Z0IDAuNzE0MTY1IDAuMDI0NTQ4Cit2dCAwLjcxMDk3NyAwLjAyNDU0NwordnQgMC43MTEwNDQgMC4wMDUzMTMKK3Z0IDAuNzE0MjMyIDAuMDA1MzE0Cit2dCAwLjM4NTM0OCAwLjY0NzY5NAordnQgMC4zODg1MzYgMC42NDc2OTMKK3Z0IDAuMzg4NTc2IDAuNjU2MjYxCit2dCAwLjQyODYzMSAwLjgzMjczNAordnQgMC40MjU2NDggMC44MzE2MTEKK3Z0IDAuNDI4NjMxIDAuODIzNTc5Cit2dCAwLjM4NTMzMyAwLjYzNzgyOAordnQgMC4zODg1MjEgMC42Mzc4MjcKK3Z0IDAuMzg1MzAwIDAuNDc0MDc3Cit2dCAwLjM4ODQ4OSAwLjQ3NDA3NwordnQgMC4zODg0OTEgMC40ODc3MzUKK3Z0IDAuMzg1MzAzIDAuNDg3NzM1Cit2dCAwLjM4NTMxMiAwLjQ2MzU0NAordnQgMC4zODg1MDAgMC40NjM1NDMKK3Z0IDAuNjkyMTY3IDAuMDI0MzcyCit2dCAwLjY4ODk3OSAwLjAyNDM3MQordnQgMC42ODkwMDcgMC4wMTM5MTgKK3Z0IDAuNjkyMTk1IDAuMDEzOTE4Cit2dCAwLjY4OTA4MyAwLjAwNTMxNAordnQgMC42OTIyNzEgMC4wMDUzMTUKK3Z0IDAuMTQ3NTk5IDAuODIzOTEwCit2dCAwLjE1MDc4NyAwLjgyMzg5NgordnQgMC4xNTA3ODcgMC44MzI0MjEKK3Z0IDAuMzg1MzQ4IDAuNDU1MDIwCit2dCAwLjM5MjI2MyAwLjY1NjI2MAordnQgMC44MjE4MjkgMC4zNDUwODAKK3Z0IDAuODE4NDQ4IDAuMzQzNjEwCit2dCAwLjgyMTgyOSAwLjMzNTczNwordnQgMC4yMTcyOTkgMC44MjYyMDgKK3Z0IDAuMjEzOTEwIDAuODI0NzU4Cit2dCAwLjIxNzI5OSAwLjgxNjkzNgordnQgMC4zODg1MzYgMC40NTUwMTkKK3Z0IDAuMzgzNzc1IDAuNjE0ODkyCit2dCAwLjMzMzI4NyAwLjUwMDY0OAordnQgMC4wMDY1OTggMC42NzgxNTQKK3Z0IDAuMDA2NTk5IDAuNjc2MDY5Cit2dCAwLjAwNjk3MSAwLjY3NjA4MwordnQgMC4wMDY5NzEgMC42NzgxNTQKK3Z0IDAuOTU3MTgyIDAuODAxMTQ0Cit2dCAwLjk1Njk3MSAwLjc5OTA3NQordnQgMC45NTcxODIgMC43OTkwNTMKK3Z0IDAuMDA3MTgyIDAuNjc2MDc0Cit2dCAwLjM4NTMyOCAwLjYxNDg5MgordnQgMC4zODg1MTYgMC42MTQ4OTEKK3Z0IDAuMzg4NTEzIDAuNjIzNTQzCit2dCAwLjM4NTMzMCAwLjYyMzU0NQordnQgMC4zOTIyMDMgMC42MTQ4OTEKK3Z0IDAuMzkyMjAzIDAuNjE3NzUwCit2dCAwLjM4OTY0OSAwLjYyMDE3NgordnQgMC4zOTQ2NTcgMC42MTc1MzkKK3Z0IDAuMzkyMjAzIDAuNjE4MjA4Cit2dCAwLjM5NTA3NSAwLjYxNzQxNwordnQgMC45Njk4MDQgMC45ODU0NzIKK3Z0IDAuOTY5NTg5IDAuOTg1NDcyCit2dCAwLjk2OTY2OSAwLjk4NTAzMgordnQgMC4wMDY5NzEgMC42NzU2NjYKK3Z0IDAuMzg5NjMwIDAuNjI2OTM4Cit2dCAwLjIxOTcxNyAwLjY2MzY3MwordnQgMC4yOTc1NTcgMC44NzUxMzkKK3Z0IDAuMjk3NzY5IDAuODc1MTMwCit2dCAwLjI5Nzc2OSAwLjg4MjY1MgordnQgMC4yMjAyMzYgMC42NjM5NDAKK3Z0IDAuMjIwNDU1IDAuNjYzNDkyCit2dCAwLjAwNjU5OSAwLjY3NTY2NgordnQgMC4zODUzODggMC42NTYyNjIKK3Z0IDAuODQxNzE2IDAuMDM1MTQ1Cit2dCAwLjg0MDE4OCAwLjAzNDg2MgordnQgMC44NDE3MTYgMC4wMjY0MzEKK3Z0IDAuNTE3NDAyIDAuODQxMTEyCit2dCAwLjUxODk1NSAwLjg0MTEwNQordnQgMC41MTg5NTUgMC44NDk2MzAKK3Z0IDAuMjQyMDg2IDAuODYwNzI5Cit2dCAwLjI0MjA4NiAwLjg2MDMyNAordnQgMC4yNDI1MDIgMC44NjAzMjUKK3Z0IDAuMjQyNTAyIDAuODYwNzMxCit2dCAwLjA4NTg4OCAwLjgxMjIxNQordnQgMC4wODU4ODIgMC44MDkxMDMKK3Z0IDAuMDg2Mjg3IDAuODA5MTAzCit2dCAwLjA4NjI5MyAwLjgxMjIxNQordnQgMC44NTE5NTAgMC4xOTA4NDgKK3Z0IDAuODU0NDA5IDAuMTkwODI0Cit2dCAwLjg1NDQwOSAwLjE5MTIyOQordnQgMC44NTE5NTAgMC4xOTEyNTMKK3Z0IDAuODUxNTMxIDAuMTkxMjU3Cit2dCAwLjg1MTUzMSAwLjE5MDg1MgordnQgMC4yNDE5NjIgMC44NjA4NjYKK3Z0IDAuMjQyMDg2IDAuODYyMTI2Cit2dCAwLjI0MTk2MiAwLjg2MjEyNQordnQgMC44NTE0MDcgMC4xOTA3MTYKK3Z0IDAuODUxNDA3IDAuMTkxMDgyCit2dCAwLjk5MjY5NCAwLjc3MTUyNQordnQgMC45OTI2OTQgMC43NzE3NDEKK3Z0IDAuOTkyNjEyIDAuNzcxNjk2Cit2dCAwLjIyMDAzNSAwLjY2MzE1OQordnQgMC4yMjAxODEgMC42NjMyNjYKK3Z0IDAuMzk0NjYwIDAuNjI5NTkzCit2dCAwLjk4OTYyMiAwLjE4Mzc4MQordnQgMC45ODk1NTYgMC4xODMzNTQKK3Z0IDAuOTg5NjIyIDAuMTgzMzI2Cit2dCAwLjk1MjUxNSAwLjIyMDM5MQordnQgMC45NTI0NTIgMC4yMTc4NjIKK3Z0IDAuOTUyNTE1IDAuMjE3ODQzCit2dCAwLjgyNDYxMyAwLjk1MjYwOAordnQgMC44MjQ2MTMgMC45NTUwNTIKK3Z0IDAuODI0NTUyIDAuOTU1MDQwCit2dCAwLjM5MDAxMyAwLjYyMDQ1NwordnQgMC4zODkxMzUgMC42MjM1NDIKK3Z0IDAuMzg5OTYwIDAuNjIwNDI3Cit2dCAwLjM5NTA3NiAwLjYxNzQ4OQordnQgMC45ODk3NjggMC43NTQ5NzkKK3Z0IDAuOTg5NzY4IDAuNzU1NDEzCit2dCAwLjk4OTcwNSAwLjc1NTM5NgordnQgMC41MDM2NjAgMC45OTA4MzYKK3Z0IDAuNTAzNTg2IDAuOTkwNjM0Cit2dCAwLjUwMzY2MCAwLjk5MDU5NQordnQgMC41NzA0OTcgMC45OTIzNzgKK3Z0IDAuNTcwNDM2IDAuOTkyMjA4Cit2dCAwLjU3MDQ5NyAwLjk5MjEzNwordnQgMC4zNDMxMDYgMC45NzI4ODcKK3Z0IDAuMzQzMDIzIDAuOTcxNjMxCit2dCAwLjM0MzEwNiAwLjk3MTYyNQordnQgMC4yMjE2MDQgMC42NjQwNTYKK3Z0IDAuMjIwNTA5IDAuNjYzNDI3Cit2dCAwLjk4OTg0MCAwLjYwMTYxNwordnQgMC45ODk3NjggMC42MDEyNTkKK3Z0IDAuOTg5ODQwIDAuNjAxMjE4Cit2dCAwLjAwNjU3OSAwLjY3NTU4NwordnQgMC4wNDk2NzIgMC44MzMzMDYKK3Z0IDAuMDQ5NTIyIDAuODE4NTA4Cit2dCAwLjA0OTY3MiAwLjgxODUwMQordnQgMC44MzIxODkgMC4yMTY3MTIKK3Z0IDAuODMyMDM5IDAuMjAxOTE0Cit2dCAwLjgzMjE4OSAwLjIwMTkwNgordnQgMC44MjYwMDYgMC41NjUxNjEKK3Z0IDAuODI1MTExIDAuNTUwMzc5Cit2dCAwLjgyNjAwNiAwLjU1MDMyNQordnQgMC44MjYwMDggMC41NzU3ODYKK3Z0IDAuODI2MDA4IDAuNTkwNTkzCit2dCAwLjgyNTExMSAwLjU5MDU5MwordnQgMC43Njc3NzAgMC4wMzc3MDAKK3Z0IDAuODM1OTMxIDAuNDI2ODk3Cit2dCAwLjgzNTc4MiAwLjQxMjA5MgordnQgMC44MzU5MzEgMC40MTIwODkKK3Z0IDAuODM1NzgyIDAuNDM3NTIzCit2dCAwLjgzNTkzMSAwLjQ1MjMyOAordnQgMC44MzU3ODIgMC40NTIzMzEKK3Z0IDAuMzA3NjE1IDAuNjMyNTU1Cit2dCAwLjMwNjU1NiAwLjY0NzMyNAordnQgMC4wMDY5NzEgMC43MjMxODMKK3Z0IDAuMDA2NTk4IDAuNzIzMTg0Cit2dCAwLjAwNjU5OCAwLjcxNTU2MAordnQgMC4wMDY5NzEgMC43MTU1NjAKK3Z0IDAuMDA3MTgyIDAuNzE1NTYwCit2dCAwLjAwNzE4MiAwLjcyMzEwOQordnQgMC4zOTUwNjcgMC41Nzc0ODUKK3Z0IDAuMzk0NjQ5IDAuNTc3NDg1Cit2dCAwLjM5NDY0OCAwLjU3MDE4MgordnQgMC40NjA1MDYgMC44NzAyMDEKK3Z0IDAuNDYwOTIzIDAuODY5OTU0Cit2dCAwLjQ2MDkyMyAwLjg3NzUwMwordnQgMC4zOTIxOTUgMC41Nzc0ODUKK3Z0IDAuMzkyMTk0IDAuNTcwNTk3Cit2dCAwLjAwNzE4MiAwLjcyMzY3NgordnQgMC4wMDY5NzEgMC43MjM3NjQKK3Z0IDAuMzk0NjQ4IDAuNTY5NjQ5Cit2dCAwLjM5NTA2NiAwLjU2OTM2OAordnQgMC45NzczMTcgMC40Njg3ODAKK3Z0IDAuOTc3MDU5IDAuNDY4Mjc1Cit2dCAwLjk3NzMxNyAwLjQ2Nzg2NQordnQgMC4zOTIxOTQgMC41NzAwNDkKK3Z0IDAuMzg5ODI0IDAuNTY5NTM4Cit2dCAwLjM4OTU3MSAwLjU3MDA0OAordnQgMC4wMDY1OTggMC43MjM3NjQKK3Z0IDAuMzgzMzkxIDAuNTY1ODE0Cit2dCAwLjM4Mzc2NSAwLjU2NTgxNAordnQgMC4zODM3NjYgMC41NjkwMzQKK3Z0IDAuMzgzMzkyIDAuNTY5MDM0Cit2dCAwLjMzNTA3NyAwLjU0OTY5NAordnQgMC4zMzQ0ODEgMC41NDk3MTYKK3Z0IDAuMzM0MzYzIDAuNTQ2NDk4Cit2dCAwLjMzNDk2MCAwLjU0NjQ3NgordnQgMC4zODUzMTggMC41NjU4MTQKK3Z0IDAuMzg1MzE5IDAuNTY5MDM0Cit2dCAwLjM4MTI4OCAwLjU2NTgxMQordnQgMC4zODEyODggMC41NjkwMzAKK3Z0IDAuNjgyODg3IDAuOTE4NDk2Cit2dCAwLjY4Mzc4NCAwLjkxODQ5NgordnQgMC42ODM3ODQgMC45MjE3MTYKK3Z0IDAuMzMzNDY3IDAuNTQ2NTMxCit2dCAwLjM4NzAwMSAwLjU2NTgxMwordnQgMC4zODc3NDYgMC41NjgzNTQKK3Z0IDAuMjQxOTYzIDAuODIzOTI0Cit2dCAwLjI0MzEwOCAwLjgyMzkyMQordnQgMC4yNDMxMDcgMC44MjYyNTAKK3Z0IDAuMjQxOTYyIDAuODI2MjUzCit2dCAwLjI0MzEyMCAwLjgyODcwOAordnQgMC4yNDE5NzUgMC44Mjg3MTIKK3Z0IDAuMjQzMTI2IDAuODI5MTMwCit2dCAwLjI0MTk4MSAwLjgyOTEzMwordnQgMC4yNDMyNjMgMC44MjkyNTAKK3Z0IDAuMjQyMTU4IDAuODI5MjUzCit2dCAwLjM4ODMyNCAwLjU2ODA0MgordnQgMC4zODgyNjUgMC41NjgwNzYKK3Z0IDAuMzg3NTk3IDAuNTY1ODEzCit2dCAwLjk1NzI1NSAwLjU1MDMyNQordnQgMC45NTczMTUgMC41NTI1NTQKK3Z0IDAuOTU0NTI0IDAuMjU2MDcyCit2dCAwLjk1NDUyNCAwLjI1MzU3NQordnQgMC45ODc5OTQgMC40Njg0MTAKK3Z0IDAuOTg3OTQ1IDAuNDY4MzY4Cit2dCAwLjk4Nzk5NCAwLjQ2Nzg2NQordnQgMC45ODc4NjAgMC40MzQwNDQKK3Z0IDAuOTg3ODA3IDAuNDM0MDAwCit2dCAwLjk4Nzg2MCAwLjQzMzQ5OQordnQgMC42MzAwOTQgMC45OTI2NDYKK3Z0IDAuNjMwMDk0IDAuOTkyMzg1Cit2dCAwLjk5MTUyNiAwLjk2MjI1OQordnQgMC45OTE0ODggMC45NjIyNDkKK3Z0IDAuOTkxNTI2IDAuOTYxOTkyCit2dCAwLjA5MTk0OSAwLjg1OTEzNQordnQgMC4wOTE5NDAgMC44NTgzNzYKK3Z0IDAuMDkxOTQ5IDAuODU4MDAzCit2dCAwLjI0MjEzMiAwLjgyOTI4MgordnQgMC4yMTc4NTQgMC43MDk5NDIKK3Z0IDAuMjE3ODU5IDAuNzEyMTcxCit2dCAwLjIxMzkxNSAwLjcxMjE3MQordnQgMC4yMTM5MTAgMC43MDk5NDIKK3Z0IDAuMzg5ODU4IDAuNTY5NDg3Cit2dCAwLjQyNzA1NSAwLjkwMjAzNwordnQgMC40MjU2NDggMC45MDE0NzUKK3Z0IDAuNDI3MDU1IDAuODk3NzkyCit2dCAwLjI0NzA3MCAwLjgyMjM5NQordnQgMC4yNDcwNTEgMC44MjM5MDkKK3Z0IDAuNzQ5NTc0IDAuOTUyNjU0Cit2dCAwLjc0OTYzNyAwLjk1MjY0MQordnQgMC43NDk2MzcgMC45NTUwNjYKK3Z0IDAuMTM1MjIzIDAuOTU2MDYwCit2dCAwLjEzNTE2MyAwLjk1NjAyNAordnQgMC4xMzUyMjMgMC45NTM2OTYKK3Z0IDAuMzgzMzkzIDAuNTc3NDg3Cit2dCAwLjM4Mzc2NyAwLjU3NzQ4NwordnQgMC4zMzQ2NTEgMC41MzgwMjkKK3Z0IDAuMzM0MDU1IDAuNTM4MDUxCit2dCAwLjM4NTMyMSAwLjU3NzQ4NgordnQgMC4zODEyOTAgMC41Nzc0ODMKK3Z0IDAuODUyNjQ3IDAuMDA1MzEzCit2dCAwLjg1MjY0NyAwLjAxMzc2NQordnQgMC44NTE3NTEgMC4wMTM3NjUKK3Z0IDAuMzg4NTA5IDAuNTc3NDg2Cit2dCAwLjE3MDcyMiAwLjYzMTM0NAordnQgMC4xNzA0NjUgMC42Mzg4OTYKK3Z0IDAuMTcwMDkyIDAuNjM4ODgzCit2dCAwLjE3MDM0OSAwLjYzMTMzMQordnQgMC4xNjk4ODQgMC42Mzg3ODcKK3Z0IDAuMTcwMTM4IDAuNjMxMzI0Cit2dCAwLjg3OTUwOSAwLjUyMjc4NAordnQgMC44Nzk1MDkgMC41MzAyNTEKK3Z0IDAuODc5MDkxIDAuNTMwMDIxCit2dCAwLjM5NDY0MiAwLjU0MTA1OQordnQgMC4zOTQ2NDEgMC41MzM4MjIKK3Z0IDAuMzk1MDU5IDAuNTMzODIyCit2dCAwLjM5MjE4OCAwLjU0MDYyNQordnQgMC4zOTIxODcgMC41MzM4MjMKK3Z0IDAuMTcwMDcxIDAuNjM5NDk4Cit2dCAwLjE2OTg2MyAwLjYzOTQwMgordnQgMC41MTc2NzQgMC45NzU0OTkKK3Z0IDAuNTE3NDAyIDAuOTc1MTA3Cit2dCAwLjUxNzY3NCAwLjk3NDU1NgordnQgMC4zOTUwNjAgMC41NDE5MDUKK3Z0IDAuMzk0NjQyIDAuNTQxNjM4Cit2dCAwLjM5MjE4OCAwLjU0MTIzMgordnQgMC4zODk4MjkgMC41NDE3MzgKK3Z0IDAuMzg5NTQxIDAuNTQxMTc4Cit2dCAwLjE3MTE4MiAwLjYzOTUzNgordnQgMC4zODMzODcgMC41NDU0OTEKK3Z0IDAuMzgzMzg2IDAuNTQyNDY2Cit2dCAwLjM4Mzc2MCAwLjU0MjQ2NgordnQgMC4zODM3NjEgMC41NDU0OTEKK3Z0IDAuMzM1ODE4IDAuNTcwMDA0Cit2dCAwLjMzNTkyOSAwLjU3MzAyNwordnQgMC4zMzUzMzIgMC41NzMwNDgKK3Z0IDAuMzM1MjIyIDAuNTcwMDI1Cit2dCAwLjM4NTMxNCAwLjU0MjQ2NgordnQgMC4zODUzMDQgMC41NDU0OTEKK3Z0IDAuMzgxMjg0IDAuNTQ1NDg3Cit2dCAwLjM4MTI4MyAwLjU0MjQ2MgordnQgMC4zMzQzMjYgMC41NzAwNTgKK3Z0IDAuMjAyMzY3IDAuOTE5ODQ2Cit2dCAwLjIwMzI2NCAwLjkxOTg0NgordnQgMC4yMDMyNjQgMC45MjI4NzEKK3Z0IDAuMzg3Nzg2IDAuNTQyODMzCit2dCAwLjM4Njk5NyAwLjU0NTQ5MQordnQgMC43MTk1MzMgMC44MjEwNjYKK3Z0IDAuNzE5NTM2IDAuODIzNDA0Cit2dCAwLjcxODM5MiAwLjgyMzM5NgordnQgMC43MTgzODkgMC44MjEwNTgKK3Z0IDAuNzE5NTY1IDAuODE4NjE2Cit2dCAwLjcxODQyMSAwLjgxODYwOQordnQgMC43MTg0MzQgMC44MTgxOTMKK3Z0IDAuNzE5NTc4IDAuODE4MjAwCit2dCAwLjcxOTcxOCAwLjgxODA4MwordnQgMC43MTg2MTQgMC44MTgwNzYKK3Z0IDAuOTU3MTUyIDAuNjAxMjE4Cit2dCAwLjk1NzE1MiAwLjYwMzQ2NAordnQgMC45NTcwOTIgMC42MDM0NjQKK3Z0IDAuMzg3NTkzIDAuNTQ1NDkxCit2dCAwLjM4ODI1NyAwLjU0MzIxMAordnQgMC4zOTQ2NDMgMC41NDE3MDIKK3Z0IDAuMjk3NjIwIDAuOTU0MzE5Cit2dCAwLjI5NzU1NyAwLjk1MTgzMwordnQgMC45MTQ2MjEgMC45ODc3NDkKK3Z0IDAuOTE0NTY1IDAuOTg3MjU3Cit2dCAwLjkxNDYyMSAwLjk4NzIxMAordnQgMC45ODg3MjkgMC40MTI2MjgKK3Z0IDAuOTg4NjgwIDAuNDEyMTMwCit2dCAwLjk5MTA2OCAwLjU4ODk5MAordnQgMC45OTEwMjcgMC41ODg3MzMKK3Z0IDAuOTkxMDY4IDAuNTg4NzIxCit2dCAwLjk5MTA2NiAwLjg1NzkzNAordnQgMC45OTEwMzMgMC44NTc3NDkKK3Z0IDAuOTkxMDY2IDAuODU3NjYwCit2dCAwLjcxODMzNyAwLjYyOTQwOQordnQgMC43MTgyOTEgMC42MjgzMDUKK3Z0IDAuMTcxMjAwIDAuNjM5NTg0Cit2dCAwLjIxMzkxNSAwLjczMjQ5NAordnQgMC4yMTc4NTkgMC43MzI0OTQKK3Z0IDAuMjE3ODU0IDAuNzM0NzQwCit2dCAwLjIxMzkxMCAwLjczNDc0MAordnQgMC4zODk4NTUgMC41NDE3OTQKK3Z0IDAuMTM2NTkwIDAuOTAxNTc5Cit2dCAwLjEzNTE2MyAwLjg5NzkwNgordnQgMC4xMzY1OTAgMC44OTcyOTQKK3Z0IDAuNzIzNDc4IDAuODIzNDI4Cit2dCAwLjcyMzUyMiAwLjgyNDk4MAordnQgMC44NDc3ODQgMC45NTU5MjMKK3Z0IDAuODQ3NzIzIDAuOTUzNTg2Cit2dCAwLjg0Nzc4NCAwLjk1MzU2MAordnQgMC4zOTIxODkgMC41NDEyOTYKK3Z0IDAuMzgzMzg1IDAuNTMzODI0Cit2dCAwLjM4Mzc1OSAwLjUzMzgyNAordnQgMC4zMzYyNDQgMC41ODE2NjMKK3Z0IDAuMzM1NjQ3IDAuNTgxNjg0Cit2dCAwLjM4NTMxMiAwLjUzMzgyNAordnQgMC4zODEyODEgMC41MzM4MjEKK3Z0IDAuMzM0NDM2IDAuNTczMDgxCit2dCAwLjEwMjU5NSAwLjg1NTQzNwordnQgMC4xMDM0OTEgMC44NTU0MzcKK3Z0IDAuMTAzNDkxIDAuODY0MDc5Cit2dCAwLjM4ODUwMCAwLjUzMzgyMwordnQgMC4wMDY1OTggMC42OTU1NTgKK3Z0IDAuMDA2OTcxIDAuNjk1NTU4Cit2dCAwLjAwNzE4MiAwLjY5NTU1OAordnQgMC44MDc3ODUgMC4xNDc5MjIKK3Z0IDAuODA3MzY3IDAuMTI3OTI1Cit2dCAwLjgwNzc4NSAwLjEyNzkxNgordnQgMC4zOTQ2NTMgMC41OTc0ODYKK3Z0IDAuMzkyMTk5IDAuNTk3NDg3Cit2dCAwLjM4ODUxMyAwLjU5NzQ4OAordnQgMC4zODUzMjUgMC41OTc0ODgKK3Z0IDAuMzgzNzcxIDAuNTk3NDg4Cit2dCAwLjM4MzM5NyAwLjU5NzQ4OAordnQgMC4zODEyOTQgMC41OTc0ODUKK3Z0IDAuMTM2MDU5IDAuODA1MTMwCit2dCAwLjEzNTE2MyAwLjc4NTE0OAordnQgMC4xMzYwNTkgMC43ODUxMDgKK3Z0IDAuMzMzMzI1IDAuNTE4MDYyCit2dCAwLjMzMzE1OSAwLjUzODA4MwordnQgMC4zMzM5MjIgMC41MTgwNDEKK3Z0IDAuMTczNTc0IDAuNTg1MzI1Cit2dCAwLjE3MjAwNSAwLjYzMTM4NwordnQgMC4yMzM4MDcgMC42ODgzNDAKK3Z0IDAuMjMzODA3IDAuNzM0NDI5Cit2dCAwLjIzMjkxMCAwLjczNDQyOQordnQgMC4yMTc4NTkgMC43MjIzNDQKK3Z0IDAuMjE5MDA0IDAuNzIyMzQ0Cit2dCAwLjIxOTAwNCAwLjczMjQ5NAordnQgMC44MDgyNTggMC4wNDYxOTkKK3Z0IDAuODA4MjU4IDAuMDU2MzQ4Cit2dCAwLjgwODE5OCAwLjA1NjM0OAordnQgMC4yMjgxNTMgMC44NTUzOTYKK3Z0IDAuMjI4MTUzIDAuODY1NTQ1Cit2dCAwLjIyODA5MyAwLjg2NTU0NQordnQgMC4zODc1OTUgMC41NTU2NDAKK3Z0IDAuMzg2OTk5IDAuNTU1NjQwCit2dCAwLjM4NTMxNiAwLjU1NTY0MQordnQgMC4zODM3NjMgMC41NTU2NDEKK3Z0IDAuMzgzMzg5IDAuNTU1NjQxCit2dCAwLjM4MTI4NiAwLjU1NTYzNwordnQgMC4zMzQ4NTIgMC41NTk4ODIKK3Z0IDAuMTAzNDkxIDAuODM0NjYxCit2dCAwLjEwMzQ5MSAwLjg0NDgxMQordnQgMC4xMDI1OTUgMC44NDQ4MTEKK3Z0IDAuMzM1NDQ4IDAuNTU5ODYwCit2dCAwLjIxMzkxNSAwLjcyMjM0NAordnQgMC40OTI5NTkgMC44NTkzMzIKK3Z0IDAuNDkyODk5IDAuODU5MzMyCit2dCAwLjQ5Mjg5OSAwLjg0OTE1OQordnQgMC44MDgyNTggMC4wNjY1MjEKK3Z0IDAuMDA2MjEwIDAuODQ0NzIxCit2dCAwLjAwNTMxNCAwLjg0NDcyMQordnQgMC4wMDUzMTQgMC44MzQ1NDgKK3Z0IDAuMzMzNTg1IDAuNTQ5NzQ4Cit2dCAwLjc5Mjc2NSAwLjM2NDE2OQordnQgMC43OTI4MDggMC4zNTYzMDgKK3Z0IDAuNzkyODYxIDAuMzU2MzA4Cit2dCAwLjcyOTEyMSAwLjYyOTEzNgordnQgMC43MjkwNjkgMC42MjEyNzUKK3Z0IDAuNzkyNzUwIDAuMzczNTM3Cit2dCAwLjg2OTM4NSAwLjczOTg2NQordnQgMC44NjkzMzIgMC43MzA0OTcKK3Z0IDAuODY5Mzg1IDAuNzMwNDk3Cit2dCAwLjc5MjgwNSAwLjM4ODU3NQordnQgMC44MzU3OTEgMC41MjI3ODQKK3Z0IDAuODM1ODQ0IDAuNTM3ODIyCit2dCAwLjc5Mjg1OCAwLjc0NDEyMAordnQgMC43OTI4MDYgMC43NDQxMjEKK3Z0IDAuNzkyNzc5IDAuNTY2MzQ4Cit2dCAwLjA5MTkxNSAwLjUwOTE3NwordnQgMC4wOTE5NjcgMC41MDkxNzcKK3Z0IDAuMDkxOTY3IDAuNjg2OTUwCit2dCAwLjc4MTQ5NyAwLjQzNjgwMAordnQgMC43ODE1NDkgMC40NTYxNjUKK3Z0IDAuMzE2MzEzIDAuODEyMzI5Cit2dCAwLjMxNjI2MCAwLjc5Mjk2NAordnQgMC43ODE0OTcgMC4zNzMzNjkKK3Z0IDAuNzgxNTQ5IDAuMzg4NDIxCit2dCAwLjgyOTk1OCAwLjA4NzA2OQordnQgMC44MzAwMTEgMC4xMDIxMjEKK3Z0IDAuNzgxNTc0IDAuMzY0MDQ1Cit2dCAwLjg2OTU2MSAwLjc5NTgyNgordnQgMC44Njk1MDggMC43ODY1MDIKK3Z0IDAuODY5NTYxIDAuNzg2NTAxCit2dCAwLjc4MTY0MyAwLjM1NjMwOAordnQgMC43ODE1MjIgMC4zNjQwNDUKK3Z0IDAuODgzODEwIDAuMjc5MTQ1Cit2dCAwLjg4Mzc1OCAwLjI3MTQwOAordnQgMC44ODQ5OTUgMC4wMzIwOTAKK3Z0IDAuODg0OTQzIDAuMDI0NDIyCit2dCAwLjg4NDk5NSAwLjAyNDQyMQordnQgMC44ODUwMjMgMC4xMTU2MDkKK3Z0IDAuODg0OTcwIDAuMTA3OTQwCit2dCAwLjE5OTk3NCAwLjQ3MjEzMwordnQgMC4xOTk5ODYgMC40NjI4MzAKK3Z0IDAuODcwMjU1IDAuNTc1Nzg2Cit2dCAwLjg3MDI1NSAwLjU4NTA4OQordnQgMC44NzAyMDMgMC41ODUwODkKK3Z0IDAuMjAwMDI4IDAuNDk0NjEwCit2dCAwLjc1MTYyNiAwLjgwNTU5OQordnQgMC43NTE2MjYgMC43ODMxMjIKK3Z0IDAuMTk5OTg1IDAuNjIxNzY3Cit2dCAwLjE5OTk4NCAwLjYxNzM2NQordnQgMC45MTg2NjAgMC4xMjc5MTYKK3Z0IDAuOTE4NjYwIDAuMTMyMzE4Cit2dCAwLjkxODYwOCAwLjEzMjMxOAordnQgMC4yMDAwMzggMC42MzUyMTYKK3Z0IDAuNTQ5MTI4IDAuODM4MTExCit2dCAwLjU0OTEyOCAwLjgyNDY2MgordnQgMC4xOTk5OTkgMC42NDQ4ODYKK3Z0IDAuODY4NTQzIDAuNDMzNDk5Cit2dCAwLjg2ODU1NiAwLjQ0MzE3MAordnQgMC44Njg1MDQgMC40NDMxNzAKK3Z0IDAuNTAzNjA1IDAuODc5ODcxCit2dCAwLjUwMzYzOSAwLjg4NzQ4NwordnQgMC44NzA1NzQgMC44ODUxMTkKK3Z0IDAuODcwNTIxIDAuODc3NTAzCit2dCAwLjg3MDU3NCAwLjg3NzUwMwordnQgMC4yMDAwMzMgMC41NTgwNDIKK3Z0IDAuMTk5OTc2IDAuNTAyOTg3Cit2dCAwLjczOTgzNiAwLjQ0OTU0MQordnQgMC43Mzk4ODkgMC40NDk1NDEKK3Z0IDAuNzM5ODg5IDAuNTA0NTk2Cit2dCAwLjE5OTk4NCAwLjYxMzA5NwordnQgMC45MjI5NjIgMC40MzM0OTkKK3Z0IDAuOTIyOTYyIDAuNDM3NzY4Cit2dCAwLjkyMjkwOSAwLjQzNzc2OAordnQgMC4xOTk5NzUgMC40OTg2MTMKK3Z0IDAuOTE4ODcxIDAuMDA5Njg3Cit2dCAwLjkxODgxOSAwLjAwNTMxMwordnQgMC45MTg4NzEgMC4wMDUzMTMKK3Z0IDAuOTIzNTE1IDAuNzA4MjI4Cit2dCAwLjkyMzQ2MiAwLjcwNDIyNQordnQgMC43ODE1NTAgMC41OTAxMzUKK3Z0IDAuNzgxNTUwIDAuNTkyMTEzCit2dCAwLjk2MTg4NSAwLjEyNzkxNgordnQgMC45NjE4ODUgMC4xMjk4OTQKK3Z0IDAuOTYxODMzIDAuMTI5ODk0Cit2dCAwLjc4MTQ5NyAwLjQ5MjExNwordnQgMC43ODE1NDkgMC41MTg0OTUKK3Z0IDAuNzg1ODk3IDAuMjM0NDA0Cit2dCAwLjc4NTk1MCAwLjI2MDc4MgordnQgMC43ODE1NDkgMC40NTc1NzIKK3Z0IDAuNzgxNTQ5IDAuNDU5MDc5Cit2dCAwLjk2Nzk5NSAwLjU1MDMyNQordnQgMC45Njc5OTUgMC41NTE4MzIKK3Z0IDAuOTY3OTQzIDAuNTUxODMyCit2dCAwLjc4MTU0OSAwLjQ4OTMwMAordnQgMC43ODU4OTcgMC4wODcwNjkKK3Z0IDAuNzg1OTUwIDAuMTE3MjkxCit2dCAwLjc4MTQ5NyAwLjUyMTI2MgordnQgMC43ODE1NTAgMC41ODgzNjMKK3Z0IDAuNzE4NTg4IDAuNjQwMDk5Cit2dCAwLjcxODY0MSAwLjcwNzIwMQordnQgMC45NjUyMDQgMC4yNTM1NzUKK3Z0IDAuOTY1MjA0IDAuMjU1MzQ3Cit2dCAwLjc4MTU1MCAwLjc0NDE4MAordnQgMC4wMjY4NzAgMC41MTI5ODQKK3Z0IDAuMDI2OTIyIDAuNjY1MDUyCit2dCAwLjc4NTk1MCAwLjM0NDI3MwordnQgMC43ODU5NTAgMC4zNDU2ODAKK3Z0IDAuNzkyNzY3IDAuNDg0Njc0Cit2dCAwLjc5Mjc2NiAwLjQ4MTUzNgordnQgMC45MzkxNjQgMC4wODcwNjkKK3Z0IDAuOTM5MTY1IDAuMDkwMjA4Cit2dCAwLjkzOTExMiAwLjA5MDIwOAordnQgMC43OTI3NjYgMC40NzkwMTkKK3Z0IDAuNzk2NzI4IDAuMzQzMTI5Cit2dCAwLjc5NjcyOCAwLjM0NTY0NgordnQgMC43OTI4MTIgMC40MzA0NTQKK3Z0IDAuNzUwNTI3IDAuNTQ3ODAxCit2dCAwLjc1MDU4MCAwLjU0NzgwMQordnQgMC43NTA1ODAgMC41ODk2ODAKK3Z0IDAuNzkyNzYwIDAuNDM2MjY5Cit2dCAwLjc5Mjc1OSAwLjQzMjg0OAordnQgMC43ODE1NTAgMC43NTg5ODcKK3Z0IDAuNzgxNTc1IDAuNzY4MzEwCit2dCAwLjc4MTUyMiAwLjc2ODMxMAordnQgMC44Njk3NzcgMC42MjY5NDUKK3Z0IDAuODY5Nzc3IDAuNjM2MjY4Cit2dCAwLjg2OTcyNCAwLjYzNjI2OAordnQgMC43ODE2NDMgMC43NzU4ODgKK3Z0IDAuMTg4NzY0IDAuODg3NTE2Cit2dCAwLjE4ODc2NCAwLjg3OTkzOAordnQgMC44ODUyMzEgMC4xMjc5MTYKK3Z0IDAuODg1MjMxIDAuMTM1NTYwCit2dCAwLjg4NTE0MSAwLjA0NTg3NwordnQgMC44ODUxNDEgMC4wNTM1MjgKK3Z0IDAuMTg4ODMwIDAuNDYyODA1Cit2dCAwLjE4ODgxNyAwLjQ3MjAwOQordnQgMC44NzM1ODIgMC4wODcwNjkKK3Z0IDAuODczNTgyIDAuMDk2MjczCit2dCAwLjg3MzUyOSAwLjA5NjI3MwordnQgMC4xODg4MTcgMC40ODU4ODAKK3Z0IDAuNDkyOTU5IDAuODM4NTMzCit2dCAwLjQ5MjkwNiAwLjgzODUzMwordnQgMC40OTI5MDggMC44MjQ2NjIKK3Z0IDAuMTg4NzY0IDAuNjIxNjc5Cit2dCAwLjE4ODgxNyAwLjYzNTA2NAordnQgMC41NTk4MDggMC44MzgwNDcKK3Z0IDAuNTU5ODA4IDAuODI0NjYyCit2dCAwLjE4ODgzMCAwLjY0NDgwMQordnQgMC44Njg0NjMgMC41MzI1MjEKK3Z0IDAuODY4NDExIDAuNTIyNzg0Cit2dCAwLjg2ODQ2MyAwLjUyMjc4NAordnQgMC4xODg4NjYgMC42NTI1MTUKK3Z0IDAuMTg4ODEzIDAuNjUyNTE1Cit2dCAwLjg4NDI2MiAwLjA4NzA2OQordnQgMC44ODQyNjIgMC4wOTQ3ODMKK3Z0IDAuODg0MjA5IDAuMDk0NzgyCit2dCAwLjg5MDU1OSAwLjQ2Nzg2NQordnQgMC44OTA1NTkgMC40NzUzNTYKK3Z0IDAuODkwNTA2IDAuNDc1MzU1Cit2dCAwLjg5MDU1MiAwLjgxMjU1NQordnQgMC44OTA1NTIgMC44MjAwNDYKK3Z0IDAuODkwNDk5IDAuODIwMDQ1Cit2dCAwLjc5MjgyNSAwLjc2ODE0NAordnQgMC43OTI4MDggMC43NTg5MTYKK3Z0IDAuNzkyODYxIDAuNzU4OTE2Cit2dCAwLjg3MzE2NSAwLjE3NDEzOAordnQgMC44NzMxMTIgMC4xNjQ5MTEKK3Z0IDAuODczMTY1IDAuMTY0OTExCit2dCAwLjE4ODgxNyAwLjQ5NDUzMgordnQgMC42NDMxOTAgMC44NzYyMzEKK3Z0IDAuNjQzMTM4IDAuODY3NTc5Cit2dCAwLjY0MzE5MCAwLjg2NzU3OQordnQgMC44MzU4OTMgMC43NTQ5NzkKK3Z0IDAuODM1OTQ2IDAuNzY5Nzg2Cit2dCAwLjgzNTk5NSAwLjY2NjQ3NQordnQgMC44MzU5NDIgMC42NjY0NzUKK3Z0IDAuODM1OTQyIDAuNjUxNjc5Cit2dCAwLjE4ODgxNyAwLjU0MDM4NwordnQgMC4xODg4MTcgMC41NDM2MDcKK3Z0IDAuOTM3MDgzIDAuODkzMjgxCit2dCAwLjkzNzA4MyAwLjg5NjUwMQordnQgMC45MzcwMzAgMC44OTY1MDEKK3Z0IDAuMTg4ODE3IDAuNTMxOTM1Cit2dCAwLjQxNDQzNCAwLjg2Nzk5MwordnQgMC40MTQ0MzQgMC44NzY0NDYKK3Z0IDAuMTg4ODE3IDAuNTYzOTI4Cit2dCAwLjE4ODgxNyAwLjU2Njk1MwordnQgMC45NDE4ODAgMC4yMDE5MDYKK3Z0IDAuOTQxODgwIDAuMjA0OTMxCit2dCAwLjk0MTgyNyAwLjIwNDkzMQordnQgMC4xODg4MTcgMC41NzU1OTQKK3Z0IDAuMzU2NzM2IDAuODY3Nzg3Cit2dCAwLjM1NjczNiAwLjg3NjQyOAordnQgMC4xODg3NjQgMC41MTE5MzUKK3Z0IDAuODEwNDYxIDAuMjIxOTA3Cit2dCAwLjgxMDQwOCAwLjIyMTkwNwordnQgMC44MTA0MTAgMC4yMDE5MDYKK3Z0IDAuNzQwMTAyIDAuNjg2MTg0Cit2dCAwLjc0MDA0OSAwLjY4NjE4NAordnQgMC43NDAxMDIgMC42NDAwOTkKK3Z0IDAuMTg4ODE3IDAuNTUzNzc5Cit2dCAwLjg2NTA5MCAwLjIxMjA3OQordnQgMC44NjUwMzcgMC4yMDE5MDcKK3Z0IDAuODY1MDkwIDAuMjAxOTA2Cit2dCAwLjg2NjMwNyAwLjM0NDA1NAordnQgMC44NjYyNTUgMC4zMzM5MDUKK3Z0IDAuNzkyNTI1IDAuMzY0MTY5Cit2dCAwLjc5MjU2OCAwLjM1NjMwOAordnQgMC43OTI1MTAgMC4zNzM1MzcKK3Z0IDAuNzkyNTEyIDAuMzg4NTc1Cit2dCAwLjc5MjU2NiAwLjc0NDEyMAordnQgMC43OTI1MzkgMC41NjYzNDgKK3Z0IDAuNzgxNzg5IDAuMzg4NDIxCit2dCAwLjc4MTc4OSAwLjQzNjgwMAordnQgMC43ODE3ODkgMC4zNzMzNjkKK3Z0IDAuNzgxODE1IDAuMzY0MDQ1Cit2dCAwLjc4MTg4MyAwLjM1NjMwOAordnQgMC44Nzk4NzIgMC44MjAyMjkKK3Z0IDAuODc5NjMyIDAuODEyNTYzCit2dCAwLjg3OTg3MiAwLjgxMjU1NQordnQgMC4yMDAwMTkgMC40NTUxNjEKK3Z0IDAuMTk5NzQ2IDAuNDYyODMwCit2dCAwLjE5OTczMyAwLjQ3MjEzMwordnQgMC4xOTk3MzUgMC40OTQ2MTAKK3Z0IDAuMTk5NzQ0IDAuNjIxNzY3Cit2dCAwLjE5OTc0NCAwLjYxNzM2NQordnQgMC4xOTk3NDUgMC42MzUyMTYKK3Z0IDAuMTk5NzU5IDAuNjQ0ODg2Cit2dCAwLjE5OTc5NCAwLjY1MjUwMgordnQgMC44ODAyNjMgMC42MDEyMTgKK3Z0IDAuODgwMjk2IDAuNjA4ODMzCit2dCAwLjg4MDA1NiAwLjYwODgzMwordnQgMC4xOTk3NDQgMC42MTMwOTcKK3Z0IDAuMTk5NzQwIDAuNTU4MDQyCit2dCAwLjE5OTczNiAwLjUwMjk4NwordnQgMC4xOTk3MzUgMC40OTg2MTMKK3Z0IDAuNzgxNzkwIDAuNTkyMTEzCit2dCAwLjc4MTc5MCAwLjU5MDEzNQordnQgMC43ODE3OTAgMC40NTkwNzkKK3Z0IDAuNzgxNzkwIDAuNDU3NTcyCit2dCAwLjc4MTc5MCAwLjQ4OTMwMQordnQgMC43ODE3OTAgMC40OTIxMTcKK3Z0IDAuNzgxNzkwIDAuNTE4NDk1Cit2dCAwLjc4MTc5MCAwLjUyMTI2MgordnQgMC43ODE3OTAgMC41ODgzNjQKK3Z0IDAuNzgxNzkwIDAuNzQ0MTgwCit2dCAwLjc4MTc5MCAwLjQ1NjE2NQordnQgMC43OTI1MjcgMC40ODQ2NzQKK3Z0IDAuNzkyNTI2IDAuNDgxNTM2Cit2dCAwLjc5MjUyNiAwLjQ3OTAxOQordnQgMC43OTI1MTkgMC40MzI4NDgKK3Z0IDAuNzkyNTE5IDAuNDMwNDU0Cit2dCAwLjc5MjUyMyAwLjQ2MTY0NwordnQgMC43OTI1MjAgMC40MzY5ODgKK3Z0IDAuNzkyNzYwIDAuNDM2OTg4Cit2dCAwLjc5Mjc2MyAwLjQ2MTY0NwordnQgMC43OTI1MjYgMC40Nzg1NjMKK3Z0IDAuNzkyNzY2IDAuNDc4NTYzCit2dCAwLjc4MTc5MCAwLjc1ODk4NwordnQgMC43ODE4MTUgMC43NjgzMTAKK3Z0IDAuNzgxODgzIDAuNzc1ODg4Cit2dCAwLjE4OTEwNiAwLjQ1NTE2MQordnQgMC4xODkwNzAgMC40NjI4MDUKK3Z0IDAuODc5OTE5IDAuMzk1MjU1Cit2dCAwLjg3OTY3OSAwLjM4NzYxNQordnQgMC44Nzk5MTkgMC4zODc2MDYKK3Z0IDAuMTg5MDU3IDAuNDcyMDA5Cit2dCAwLjE4OTA1NyAwLjQ4NTg4MAordnQgMC4xODkwNTcgMC42MjE2NzkKK3Z0IDAuMTg5MDU3IDAuNjM1MDY0Cit2dCAwLjE4OTA3MCAwLjY0NDgwMQordnQgMC4xODkxMDYgMC42NTI1MTUKK3Z0IDAuNzkyNjMxIDAuNzc1NjM0Cit2dCAwLjc5MjU4NSAwLjc2ODE0NAordnQgMC4xMDI3ODggMC44NzQ3MDQKK3Z0IDAuMTAyODM1IDAuODgyMTk0Cit2dCAwLjEwMjU5NSAwLjg4MjE5NAordnQgMC43OTI1NjggMC43NTg5MTYKK3Z0IDAuMTg5MDU3IDAuNDk0NTMyCit2dCAwLjE4OTA1NyAwLjU0MDM4NwordnQgMC4xODkwNTcgMC41NDM2MDcKK3Z0IDAuMTg5MDU3IDAuNTMxOTM1Cit2dCAwLjE4OTA1NyAwLjU2MzkyOAordnQgMC4xODkwNTcgMC41NjY5NTMKK3Z0IDAuMTg5MDU3IDAuNTc1NTk0Cit2dCAwLjE4OTA1NyAwLjUwMjkwOAordnQgMC4xODg4MTcgMC41MDI5MDgKK3Z0IDAuMTg5MDU3IDAuNTUzNzc5Cit2dCAwLjY4Nzg2NSAwLjMwNDQzNgordnQgMC42ODg1NjcgMC4zMDQ0MzYKK3Z0IDAuMzQ0NDU4IDAuODc1OTEwCit2dCAwLjM0NDEzNSAwLjg3NTkxMAordnQgMC42ODUyOTMgMC4zMDQ2ODAKK3Z0IDAuNTMzMzAxIDAuOTU0ODQ5Cit2dCAwLjUzMzIzOSAwLjk1MjM5NgordnQgMC41MzMzMDEgMC45NTIzOTQKK3Z0IDAuNjg1MjkzIDAuMzQ3NDg5Cit2dCAwLjY4NTI5MyAwLjM0Nzc0MQordnQgMC44Nzc3MDQgMC4yNTk5MjEKK3Z0IDAuODc3MzgyIDAuMjU5OTIxCit2dCAwLjg3NzM4MiAwLjI1NzQ2OAordnQgMC44Nzc3MDQgMC4yNTc0NjgKK3Z0IDAuNjg1Mjk0IDAuMzQ3NDEzCit2dCAwLjk0NjEyMyAwLjY3NzEwMAordnQgMC45NDYxMjMgMC42Nzk4NzUKK3Z0IDAuOTQ2MDQ3IDAuNjc5ODc1Cit2dCAwLjMxNjUxNSAwLjk4NDE0NwordnQgMC4zMTYyNjAgMC45ODM4MTUKK3Z0IDAuMzE2NTE1IDAuOTgzNjE5Cit2dCAwLjY5NDA5NCAwLjMwNDg5NAordnQgMC42OTYyMjIgMC4zMDQ4NzUKK3Z0IDAuNjk2MjIyIDAuMzIxODAxCit2dCAwLjI2MDE2NSAwLjc4MDc0NwordnQgMC4yNTkyNzAgMC43ODA2OTUKK3Z0IDAuMjYwNzIwIDAuNzU2MDYxCit2dCAwLjc3MzI4MSAwLjMyMDMyMgordnQgMC42OTM3MjAgMC4zMDQ4OTMKK3Z0IDAuNzc0NDQ1IDAuMzAzMzY3Cit2dCAwLjY4ODk3OSAwLjMwNDg5MwordnQgMC42OTIxNjcgMC4zMDQ4OTMKK3Z0IDAuNjg4MzI0IDAuMzA1MTI4Cit2dCAwLjY4ODU2NyAwLjMwNDg5MgordnQgMC40MDA3NTYgMC43MzczODUKK3Z0IDAuMzk5NjQ0IDAuNzM3Mzg1Cit2dCAwLjM5OTY0NCAwLjcyMDc1NwordnQgMC40MDA3NTYgMC43MjA3NTcKK3Z0IDAuNjg4MjYzIDAuMzA1MTkxCit2dCAwLjgyNTExMSAwLjUyMjc4NAordnQgMC44MjUxNjQgMC41MjI3ODQKK3Z0IDAuODI1MTY0IDAuNTM5NzAwCit2dCAwLjY5NjIyMiAwLjM0NjQ3NQordnQgMC42OTM3MjAgMC4zNDcyMTIKK3Z0IDAuMjYwNzIwIDAuNzgxNTAwCit2dCAwLjI2MDEyMyAwLjc4MTQ2NQordnQgMC43NzUyNzAgMC4zNDU2ODMKK3Z0IDAuNjkyMTY3IDAuMzQ3MjEyCit2dCAwLjY4ODMyNSAwLjM0NzIxMQordnQgMC4zOTk2NDcgMC42OTYwODIKK3Z0IDAuNDAwNzU2IDAuNjk2MDgyCit2dCAwLjc5NjczNSAwLjE4OTU4NAordnQgMC43OTY3MzUgMC4xNjQ5MTEKK3Z0IDAuNzk2Njc1IDAuMTI3OTE2Cit2dCAwLjc5Njc0MCAwLjE1MjU5MAordnQgMC43OTY2NzUgMC4zMDc4NDUKK3Z0IDAuNzk2NzI4IDAuMzMyNTA0Cit2dCAwLjc5MjUxOSAwLjQzNjI2OQordnQgMC4yNTkyMjggMC43ODE0MTIKK3Z0IDAuNzQwMDQ5IDAuNjk2ODA5Cit2dCAwLjc0MDk0NiAwLjY5NjgwOQordnQgMC43NDA5NDYgMC43Mzg3MTkKK3Z0IDAuNzUwNjY2IDAuNDkxNDQ5Cit2dCAwLjc1MDUxNiAwLjQ5MTQ0OQordnQgMC43NTA2NjYgMC40NDk1NDEKK3Z0IDAuMDM3NTUwIDAuNzAzNjY2Cit2dCAwLjAzNzY5OSAwLjcwMzY2NQordnQgMC4wMzc2OTkgMC43NDU1NzMKK3Z0IDAuOTU1NzA5IDAuNDY3ODY1Cit2dCAwLjk1NTcwOSAwLjQ3MDI1OAordnQgMC42ODgwNjkgMC4zNDc0MTQKK3Z0IDAuOTkwNjg3IDAuNDUxNzk0Cit2dCAwLjk5MDYzMiAwLjQ1MTYwNwordnQgMC45OTA2ODcgMC40NTE1MjgKK3Z0IDAuNDAwNzU2IDAuNjk1MzYyCit2dCAwLjk4MDU0MyAwLjg5MzI4MQordnQgMC4zOTkzMjUgMC42OTYwODIKK3Z0IDAuMDUxMjk2IDAuNjA1MzU5Cit2dCAwLjA1MTg5MyAwLjYwNTM2OQordnQgMC4xNDg0NjcgMC45MTQ0OTQKK3Z0IDAuMTQ3NTk5IDAuOTE0MjY3Cit2dCAwLjE0ODQ2NyAwLjkxMDk1NAordnQgMC4wNTAzOTkgMC42MDUzNDIKK3Z0IDAuOTQ4MTUwIDAuOTQ5MjU3Cit2dCAwLjk0ODE2OSAwLjk1MTM4NQordnQgMC45NDc3MTIgMC45NTEzODUKK3Z0IDAuMzk5NjQ0IDAuNzM3ODM0Cit2dCAwLjQwMDc1NiAwLjczNzgzNAordnQgMC45ODk3NjIgMC4zODgwNjUKK3Z0IDAuOTg5NzA5IDAuMzg3NjEyCit2dCAwLjk4OTc2MiAwLjM4NzYwNgordnQgMC4zMzEyODcgMC45ODMxMTIKK3Z0IDAuMzMxMjg3IDAuOTgzNjQ5Cit2dCAwLjMzMDk2NCAwLjk4MzY0OQordnQgMC40NDM1OTYgMC45ODMxOTkKK3Z0IDAuNDQzNTk2IDAuOTgzNzM2Cit2dCAwLjQ0MzI3MyAwLjk4MzczNgordnQgMC4yNDg2MDEgMC42OTE3OTkKK3Z0IDAuMjQ3NzA0IDAuNjkxNzg5Cit2dCAwLjI0ODYwMSAwLjYxMDA2MwordnQgMC4wMzg4OTQgMC42OTMwMzkKK3Z0IDAuMDM3ODUyIDAuNjkzMDM5Cit2dCAwLjcwNzQ1NyAwLjQ0OTU0MgordnQgMC43MDc2MDcgMC40NDk1NDEKK3Z0IDAuNzA3NjA3IDAuNTMxMjcxCit2dCAwLjY5NjY4MSAwLjQ0OTU0MQordnQgMC43MDc2MTEgMC41NDc4MDEKK3Z0IDAuNzA3NjYzIDAuNTQ3ODAxCit2dCAwLjcwNzY2MyAwLjYyOTQ3NAordnQgMC43MTQxNjggMC4yNjQ4OTYKK3Z0IDAuNzE2MTMyIDAuMjY0ODk3Cit2dCAwLjcxNjEzMiAwLjI5MTI2MQordnQgMC43MTQxNjggMC4yOTEyNjAKK3Z0IDAuNzE3ODUyIDAuMjY0ODk3Cit2dCAwLjcyMDMwNSAwLjI2NDg5OAordnQgMC43MjAzMDUgMC4yOTEyNjIKK3Z0IDAuNzE3ODUyIDAuMjkxMjYxCit2dCAwLjcyMDcyMyAwLjI2NDg5OAordnQgMC43MjA3MjMgMC4yOTEyNjIKK3Z0IDAuNzg2MDQ4IDAuMTkxMjgxCit2dCAwLjc4NTg5NyAwLjE2NDkxOAordnQgMC43ODYwNDggMC4xNjQ5MTEKK3Z0IDAuNzg2MDQ4IDAuMTU0Mjg2Cit2dCAwLjc4NTg5NyAwLjEyNzkyMgordnQgMC43ODYwNDggMC4xMjc5MTYKK3Z0IDAuMzk5MjYxIDAuNzUwNjUyCit2dCAwLjM5OTU2MyAwLjc1MDY1MgordnQgMC4zOTk1NjQgMC43NzcwMzQKK3Z0IDAuMzk5MjYyIDAuNzc3MDM0Cit2dCAwLjcxNjEzMiAwLjI2MzM0MgordnQgMC43MTc4NTIgMC4yOTI4MTYKK3Z0IDAuNzE2MTMyIDAuMjkyODE2Cit2dCAwLjcyMDMwNSAwLjI2MzM0MwordnQgMC43MTc4NTIgMC4yNjMzNDIKK3Z0IDAuNzIwMzA1IDAuMjkyODE3Cit2dCAwLjcyMDcyMyAwLjI2MzM0MwordnQgMC43MjA3MjMgMC4yOTI4MTcKK3Z0IDAuMjQyMTAzIDAuOTg2NzY3Cit2dCAwLjI0MTk2MiAwLjk4NjMyNQordnQgMC4yNDIxMDMgMC45ODYyNzQKK3Z0IDAuOTg2OTc0IDAuMjU0MDY4Cit2dCAwLjk4NjgzMiAwLjI1MzYyNgordnQgMC45ODY5NzQgMC4yNTM1NzUKK3Z0IDAuMjE0MDUxIDAuOTg3MzI0Cit2dCAwLjIxMzkxMCAwLjk4NjkxNwordnQgMC4yMTQwNTEgMC45ODY4NjIKK3Z0IDAuMTE4NjE5IDAuOTg3Njc4Cit2dCAwLjExODQ3OCAwLjk4NzI3MQordnQgMC4xMTg2MTkgMC45ODcyMTcKK3Z0IDAuMzk5NTYzIDAuNzQ4NjMyCit2dCAwLjM5OTU2MyAwLjc0OTA5NgordnQgMC4zOTkyNjEgMC43NDkwOTYKK3Z0IDAuMzk5MjYxIDAuNzQ4NjMxCit2dCAwLjM5OTU2NCAwLjc3ODU5MAordnQgMC40MDAxODUgMC43Nzg1OTAKK3Z0IDAuNzA5NDI0IDAuMjYzMzQwCit2dCAwLjcwOTA1MCAwLjI2MzM0MAordnQgMC43MDkwNTAgMC4yOTI4MTMKK3Z0IDAuNzA5NDI0IDAuMjkyODEzCit2dCAwLjc2ODM3OSAwLjUxMjg5MgordnQgMC43Njg5NzcgMC41MTI4OTIKK3Z0IDAuNzY4OTc3IDAuNDgzMzk4Cit2dCAwLjc2ODM3OSAwLjQ4MzM5OAordnQgMC43MTA5NzcgMC4yOTI4MTMKK3Z0IDAuNzA2OTQ5IDAuMjYzMjkyCit2dCAwLjcwNjk0OSAwLjI5Mjc2NAordnQgMC45MjQwODUgMC42MTUwNzIKK3Z0IDAuOTI0OTgyIDAuNjE1MDcyCit2dCAwLjkyNDk4MiAwLjYxNjI4MwordnQgMC43Njc0ODMgMC41MTI4OTIKK3Z0IDAuNzY3NDgyIDAuNDgyMTM3Cit2dCAwLjkyNTA1MiAwLjgwMTc4MgordnQgMC45MjQxNTUgMC44MDE3ODIKK3Z0IDAuOTI0MTU1IDAuODAwNTIyCit2dCAwLjc4MTU0OSAwLjQ5MDU2MQordnQgMC4wODExOTEgMC45NzIyMjkKK3Z0IDAuMDgxMTkxIDAuOTczNDkwCit2dCAwLjA4MTEzOCAwLjk3MzQ5MAordnQgMC45NzU0NjEgMC4zMzUxMTcKK3Z0IDAuOTc1NDA5IDAuMzMzOTA3Cit2dCAwLjk3NTQ2MSAwLjMzMzkwNQordnQgMC43ODE1NDkgMC41MjAwNTEKK3Z0IDAuNzgxNzkwIDAuNTIwMDUxCit2dCAwLjc4MTc5MCAwLjQ5MDU2MQordnQgMC43MTQxNjggMC4zMjU3ODMKK3Z0IDAuNzE0MTY4IDAuMzI0Mjc3Cit2dCAwLjcxNjEzNSAwLjE5MzMwMAordnQgMC43MTQxNjggMC4xOTUwNzMKK3Z0IDAuNzE0MTY4IDAuMjkyODE1Cit2dCAwLjcxNDE2OCAwLjI5NDA3NAordnQgMC40NjExNTcgMC44OTM2MzYKK3Z0IDAuOTc5ODA5IDAuNTYzMzE1Cit2dCAwLjk3OTgwOSAwLjU2NDA4MgordnQgMC45Nzk0OTggMC41NjQwODIKK3Z0IDAuMTc3OTEwIDAuOTYwMzA3Cit2dCAwLjE3NzkxMCAwLjk2MjAyNgordnQgMC4xNzc3MzMgMC45NjIwMjUKK3Z0IDAuOTc4Nzk5IDAuNTUxMjgxCit2dCAwLjk3ODYyMyAwLjU1MDUzNwordnQgMC45Nzg3OTkgMC41NTAzMjUKK3Z0IDAuMjI4MDkzIDAuOTUxMjc3Cit2dCAwLjIyODk4OSAwLjk1MTI3NwordnQgMC4yMjg5ODkgMC45NTI4MzMKK3Z0IDAuNzY3NDgyIDAuNTExMzM1Cit2dCAwLjc2NzQ4MiAwLjQ4MzM5OAordnQgMC4xMDM0OTEgMC45NTI4NDkKK3Z0IDAuMTAyNTk1IDAuOTUyODQ5Cit2dCAwLjEwMjU5NSAwLjk1MTI5MwordnQgMC45Njc3NjEgMC43NDI2NzkKK3Z0IDAuOTY3NzYxIDAuNzQ0MjM1Cit2dCAwLjk2NzcwOCAwLjc0NDIzNQordnQgMC45Njc3NjEgMC43MzIwNTQKK3Z0IDAuOTY3NzA4IDAuNzMwNDk5Cit2dCAwLjk2Nzc2MSAwLjczMDQ5NwordnQgMC4xODg5MTQgMC45NjY4NzkKK3Z0IDAuMTg4NzY0IDAuOTY1MzMxCit2dCAwLjE4ODkxNCAwLjk2NTMxMQordnQgMC43MTg1MzggMC45NjcwMjkKK3Z0IDAuNzE4Mzg5IDAuOTY1NDgxCit2dCAwLjcxODUzOCAwLjk2NTQ2MQordnQgMC45NjY4NzggMC43MDU3OTIKK3Z0IDAuOTY2NzI5IDAuNzA0MjQ0Cit2dCAwLjk2Njg3OCAwLjcwNDIyNAordnQgMC41MzMzODkgMC45NjcwNDIKK3Z0IDAuNTMzMjM5IDAuOTY1NDk0Cit2dCAwLjUzMzM4OSAwLjk2NTQ3NAordnQgMC40MDAxODUgMC43NzcwMzQKK3Z0IDAuNDgyNzc2IDAuODk0MDk1Cit2dCAwLjk4MDAwMyAwLjQ4MTg5NwordnQgMC45ODAwMDMgMC40ODI2NTgKK3Z0IDAuOTc5NjkyIDAuNDgyNjU4Cit2dCAwLjk1ODk2MiAwLjk2MTk5MgordnQgMC45NTg5NjIgMC45NjM3MTUKK3Z0IDAuOTU4Nzk2IDAuOTYzNzE0Cit2dCAwLjEwNDU0OSAwLjU3OTEwNwordnQgMC43MTgyOTEgMC41NDc4MDYKK3Z0IDAuNzE4NDQxIDAuNTQ3ODAxCit2dCAwLjA1MDQxOCAwLjczNjcxNQordnQgMC4wNDk1MjIgMC43MzY2OTgKK3Z0IDAuMDUwNDE4IDAuNjg4MzIzCit2dCAwLjczOTg0NyAwLjU0NzgwMQordnQgMC43Mzk5MDAgMC41NDc4MDEKK3Z0IDAuNzM5OTAwIDAuNTk2MTc5Cit2dCAwLjk3OTM2MiAwLjUzNzUxOAordnQgMC45NzkyMjggMC41MzY3NjAKK3Z0IDAuOTc5MzYyIDAuNTM2NTU4Cit2dCAwLjM4ODcyMiAwLjYyMzU0MwordnQgMC4zODk5MzIgMC42MjY2ODUKK3Z0IDAuMjQyNTAyIDAuODYyMTI3Cit2dCAwLjI0NDkzNiAwLjg2MDc0MgordnQgMC4yNDQ5MzYgMC44NjIxMzgKK3Z0IDAuOTM3MDg5IDAuOTIyNTA2Cit2dCAwLjkzNzA4OSAwLjkyNTc0MAordnQgMC45MzcwMzAgMC45MjU3MjUKK3Z0IDAuMzU2NzI5IDAuOTM3MDcyCit2dCAwLjM1NjY4MyAwLjkzMzg4NAordnQgMC40ODMzMTMgMC45MjI2ODAKK3Z0IDAuNDgyMTI2IDAuOTIxOTQzCit2dCAwLjQ4MzMxMyAwLjkyMDAwMQordnQgMC4wODQ0ODUgMC44MDkxMDMKK3Z0IDAuMDg0NDY5IDAuODA2ODI3Cit2dCAwLjkzNjQ4NiAwLjQ1NDc2OQordnQgMC45MzY0MjcgMC40NTE1NDUKK3Z0IDAuOTM2NDg2IDAuNDUxNTI4Cit2dCAwLjg4MDQ4MCAwLjM3Njk2NgordnQgMC44NzkzMjAgMC4zNzYxOTAKK3Z0IDAuODgwNDgwIDAuMzc0MzA2Cit2dCAwLjA0OTUyMiAwLjg4ODMwNwordnQgMC4wNTAyOTggMC44ODcxNDcKK3Z0IDAuMDUyMTgyIDAuODg4MzA3Cit2dCAwLjcxODQ1MSAwLjk1MjM3NwordnQgMC43MTg0NTEgMC45NTQ4MzYKK3Z0IDAuNzE4Mzg5IDAuOTU0ODM1Cit2dCAwLjk1MjU2OSAwLjIwMTkwNgordnQgMC45NTI1NjkgMC4yMDQ0NDkKK3Z0IDAuOTUyNTA3IDAuMjA0NDMzCit2dCAwLjA4NDQ5MSAwLjgxMjIxNQordnQgMC4wODU4ODIgMC44MTUzMDAKK3Z0IDAuMjYwNjI1IDAuOTEyMjk5Cit2dCAwLjI1OTIyOCAwLjkxMjI5OQordnQgMC4yNTkyMzQgMC45MDkyMTUKK3Z0IDAuOTU3MDgxIDAuNzMyNzYwCit2dCAwLjk1NzAxOSAwLjczMDQ5NwordnQgMC45NTcwODEgMC43MzA0OTcKK3Z0IDAuOTM5NDYwIDAuMjM3NTIzCit2dCAwLjkzOTQwMSAwLjIzNDQyMQordnQgMC45Mzk0NjAgMC4yMzQ0MDQKK3Z0IDAuMDA1MzE0IDAuNjkwOTIyCit2dCAwLjAwNjU5OCAwLjY5MDkyMgordnQgMC4wMDUzMTQgMC42OTU1NTgKK3Z0IDAuMDA2OTcxIDAuNjkwOTIyCit2dCAwLjAwNzE4MiAwLjY5MDkyMgordnQgMC4zOTUwNzIgMC42MDIxMjIKK3Z0IDAuMzk0NjU0IDAuNjAyMTIyCit2dCAwLjQ4MjU0MiAwLjkwOTM3NgordnQgMC40ODIxMjYgMC45MDkzMzgKK3Z0IDAuNDgyNTQyIDAuOTA0NzIxCit2dCAwLjM5MjIwMCAwLjYwMjEyMwordnQgMC4zODUzMjYgMC42MDIxMDkKK3Z0IDAuMzgzNzcyIDAuNjAyMTA5Cit2dCAwLjM4MzM5OCAwLjYwMjEwOQordnQgMC4zODEyOTUgMC42MDIxMDYKK3Z0IDAuMzMyMjYxIDAuNTEzNDc3Cit2dCAwLjMzMzE1NyAwLjUxMzQ0NAordnQgMC4xODk2NjEgMC45MDI3NjIKK3Z0IDAuMTg4NzY0IDAuOTAyNzYyCit2dCAwLjE4ODc2NCAwLjg5ODE0MQordnQgMC4zMzM3NTMgMC41MTM0MjMKK3Z0IDAuMTg4ODE3IDAuNTA3MzE0Cit2dCAwLjkxNDQyNiAwLjg4MDUwOAordnQgMC45MTQzNzMgMC44NzU4ODgKK3Z0IDAuMTg5MDU3IDAuNTExOTM1Cit2dCAwLjE4OTA1NyAwLjUwNzMxNAordnQgMC4wMDUzMTQgMC42NzgxNTQKK3Z0IDAuMDA2NTk4IDAuNjg2NTMxCit2dCAwLjAwNTMxNCAwLjY4NjUzMQordnQgMC4wMDcxODIgMC42NzgxNTQKK3Z0IDAuMDA3MTgyIDAuNjg2NTMxCit2dCAwLjAwNjk3MSAwLjY4NjUzMQordnQgMC4zOTQ2NTUgMC42MDY1MTQKK3Z0IDAuMzk1MDczIDAuNjA2NTE0Cit2dCAwLjM5MjIwMSAwLjYwNjUxNAordnQgMC4zODg1MTUgMC42MDY1MTUKK3Z0IDAuMzg1MzI2IDAuNjA2NTE2Cit2dCAwLjM4Mzc3MyAwLjYwNjUxNgordnQgMC4zODMzOTkgMC42MDY1MTYKK3Z0IDAuMzgxMjk2IDAuNjA2NTEyCit2dCAwLjMzMjk5NiAwLjUwOTA0MQordnQgMC44NjMyNzQgMC4wMDUzMTMKK3Z0IDAuODY0MTcxIDAuMDA1MzEzCit2dCAwLjg2NDE3MSAwLjAxMzY4OQordnQgMC4zMzM1OTMgMC41MDkwMTkKK3Z0IDAuNjE5MDc0IDAuODY4MzY0Cit2dCAwLjYxOTA3NCAwLjg3Njc0MAordnQgMC42MTkwMjIgMC44NzY3NDAKK3Z0IDAuMzg3NDkwIDAuNjAxMTA2Cit2dCAwLjM4ODUxNCAwLjYwMDY3NgordnQgMC4zODk1MjMgMC42MDExMDcKK3Z0IDAuMzg3NDkxIDAuNjAzMTM5Cit2dCAwLjM4ODUxNCAwLjYwMzU2OQordnQgMC4zODcwNzAgMC42MDIxMDkKK3Z0IDAuMzg5OTU0IDAuNjAyMTIzCit2dCAwLjM4OTUyMyAwLjYwMzEzNwordnQgMC4zODcxNzggMC42MDIxMDkKK3Z0IDAuMzg3NTgwIDAuNjAzMDY2Cit2dCAwLjM4ODUxMyAwLjYwMDc3OQordnQgMC4zODc1ODAgMC42MDExNzkKK3Z0IDAuMzg5NDMzIDAuNjAxMTgwCit2dCAwLjM4OTg0NiAwLjYwMjEyMwordnQgMC4zODg1MTQgMC42MDM0NjUKK3Z0IDAuMzg5NDMzIDAuNjAzMDY1Cit2dCAwLjY4MzE3MiAwLjk1OTQ4NQordnQgMC42ODMxNzEgMC45NTg2MDEKK3Z0IDAuMDgxMTYzIDAuOTYwNzQ5Cit2dCAwLjA4MTE3NyAwLjk2MTU5NQordnQgMC4wODExMzggMC45NjA3NDkKK3Z0IDAuMDgxMTc3IDAuOTU5OTIyCit2dCAwLjA5MTk2NCAwLjg3MDYzOQordnQgMC4wOTE5NDAgMC44Njk3NjkKK3Z0IDAuMDkxOTY0IDAuODY5NzYwCit2dCAwLjA5MTk2NCAwLjg0NzM3OAordnQgMC4wOTE5NDAgMC44NDY1MDAKK3Z0IDAuMDkxOTY0IDAuODQ2NDk5Cit2dCAwLjY1NDg3MiAwLjk2MDkxNAordnQgMC42NTQ4NzIgMC45NjAwNzkKK3Z0IDAuNjU0ODYwIDAuOTYxNzUyCit2dCAwLjk4NDAwNSAwLjA0NTg3NwordnQgMC45ODQwMDUgMC4wNDY3MjQKK3Z0IDAuMzg3Mjc2IDAuNjAyMTA5Cit2dCAwLjk4MDQwNSAwLjg1ODYzOAordnQgMC45ODAzMDggMC44NTg2MDEKK3Z0IDAuOTgwNDA1IDAuODU3NjYwCit2dCAwLjk4MDYyMiAwLjkzNzMzNQordnQgMC45ODA1NDAgMC45MzcyOTEKK3Z0IDAuOTgwNjIyIDAuOTM2MzY1Cit2dCAwLjM4NzY2MSAwLjYwMTI0NQordnQgMC45ODA2MjYgMC45NTAyMjYKK3Z0IDAuOTgwNTM5IDAuOTUwMTcxCit2dCAwLjk4MDYyNiAwLjk0OTI1NwordnQgMC4zODg1MTMgMC42MDA4NzMKK3Z0IDAuMzg5NzQ5IDAuNjAyMTIzCit2dCAwLjk3OTYwNiAwLjQ5NjMxOQordnQgMC45Nzk1MDkgMC40OTYyODIKK3Z0IDAuOTc5NjA2IDAuNDk1MzI2Cit2dCAwLjk4MDc0MyAwLjk3NDU1NwordnQgMC45ODA2NjIgMC45NzQ1MTEKK3Z0IDAuOTgwNzQzIDAuOTczNTk3Cit2dCAwLjM4OTM1MyAwLjYwMjk5OQordnQgMC45ODA0MDAgMC41ODk3MDMKK3Z0IDAuOTgwMzEyIDAuNTg5NjQ3Cit2dCAwLjk4MDQwMCAwLjU4ODcyMQordnQgMC4zODg1MTQgMC42MDMzNzIKK3Z0IDAuNjgyODg3IDAuOTU5NDg0Cit2dCAwLjY4MzE2NiAwLjk2MDM0MgordnQgMC45Nzg0NzIgMC42Mjc4NDYKK3Z0IDAuOTc4MjI5IDAuNjI3Njc2Cit2dCAwLjk3ODQ3MiAwLjYyNjk0NQordnQgMC4wODE0NjQgMC45NjE0ODkKK3Z0IDAuMDgxNDUxIDAuOTYwNzUxCit2dCAwLjA4MTQ2NCAwLjk2MDAyOQordnQgMC43ODEyMDUgMC45NjA3MTUKK3Z0IDAuNzgxNDg5IDAuOTYwNzE1Cit2dCAwLjc4MTQ4NyAwLjk2MTU4NAordnQgMC45NzgwNTIgMC40MTMwMDMKK3Z0IDAuOTc3ODA5IDAuNDEyODMzCit2dCAwLjk3ODA1MiAwLjQxMjA4OQordnQgMC42NTQ1ODYgMC45NjAxODIKK3Z0IDAuNTE3NDAyIDAuOTYzMTQ2Cit2dCAwLjUxNzY3MiAwLjk2MzIzOAordnQgMC41MTc0NDcgMC45NjM5MzAKK3Z0IDAuNTE3NjcyIDAuOTYyMzUzCit2dCAwLjk3ODkyOSAwLjE4NDIxMAordnQgMC45Nzg2OTMgMC4xODQwMTgKK3Z0IDAuOTc4OTI5IDAuMTgzMzI2Cit2dCAwLjE0MTE0MCAwLjY5MzA0MAordnQgMC4xNDExNDAgMC42OTMzODMKK3Z0IDAuMTQxMDIwIDAuNjkzMzA5Cit2dCAwLjE0MTAyMCAwLjY5MzA0MQordnQgMC4xNDEwMjAgMC42ODk2NTgKK3Z0IDAuMTQxMDIyIDAuNjg2OTI2Cit2dCAwLjE0MTE0MCAwLjY4NjkyNQordnQgMC4xNDExNDAgMC42ODk2NTYKK3Z0IDAuMTY4MDgyIDAuODc1MjQ2Cit2dCAwLjE2ODA4MiAwLjg3MjgxMQordnQgMC4xNjgxNzAgMC44NzI4MTEKK3Z0IDAuMTY4MTcxIDAuODc1MjQ3Cit2dCAwLjE0MTE0MCAwLjY4MzU4NAordnQgMC4xNDEwMjIgMC42ODM1ODUKK3Z0IDAuMDE4Njk3IDAuOTU0MzY0Cit2dCAwLjAxODU5NCAwLjk1NDM2NAordnQgMC4wMTg1OTQgMC45NTE5MjkKK3Z0IDAuMTM4MTc0IDAuNjkzMzA5Cit2dCAwLjEzODE3NCAwLjY5MzIwNQordnQgMC4xNDA2MTAgMC42OTMyMDYKK3Z0IDAuMTQwODQ4IDAuNjkzMDQxCit2dCAwLjE0MDg0NyAwLjY5MzIwNgordnQgMC4xNDA4NDYgMC42ODk2NTgKK3Z0IDAuMTQwODQ4IDAuNjg2OTI2Cit2dCAwLjE0MDg0OSAwLjY4MzU4NQordnQgMC4xMzg4OTYgMC42OTAzMjMKK3Z0IDAuMTM5MTY5IDAuNjg5NjU3Cit2dCAwLjEzOTI5OCAwLjY4OTY1NwordnQgMC4xMzg5ODIgMC42OTA0MjAKK3Z0IDAuMTM4ODkyIDAuNjg4OTkxCit2dCAwLjEzODk4NSAwLjY4ODkwNAordnQgMC4xMzgxNzQgMC42OTA2MDMKK3Z0IDAuMTM4MTc0IDAuNjkwNzM2Cit2dCAwLjEzODE3NCAwLjY4ODU5MAordnQgMC4xMzgxNzQgMC42ODg3MjMKK3Z0IDAuOTI1OTU3IDAuOTYzNTc1Cit2dCAwLjkyNjM4MCAwLjk2MzU3NQordnQgMC45MjYzODEgMC45NjQyMDcKK3Z0IDAuOTI1OTU4IDAuOTY0Mjc1Cit2dCAwLjkwMzkwNCAwLjk2NDQ2MwordnQgMC45MDM0ODEgMC45NjQ0NzMKK3Z0IDAuOTAzNDY4IDAuOTYzOTE1Cit2dCAwLjkwMzg4OCAwLjk2MzgxNwordnQgMC45Nzk4MjEgMC41NzY1NTYKK3Z0IDAuOTc5NTE2IDAuNTc2MjUxCit2dCAwLjk3OTgyMSAwLjU3NTc4NgordnQgMC45MDM5MTkgMC45NjUxMDcKK3Z0IDAuOTc4NTQ3IDAuODI1Mjc1Cit2dCAwLjk3ODIyMyAwLjgyNDk5NQordnQgMC45Nzg1NDcgMC44MjQ0NTcKK3Z0IDAuMjU5MjI4IDAuOTYzMjE3Cit2dCAwLjI1OTY0OSAwLjk2MzIxOAordnQgMC4yNTk2NTMgMC45NjM5MTYKK3Z0IDAuNDcxMTk1IDAuOTgzNTIzCit2dCAwLjQ3MTE5NSAwLjk4NDI5NwordnQgMC42MDc1MTEgMC45ODQ0MDEKK3Z0IDAuNjA3NDgxIDAuOTgzNjUyCit2dCAwLjYwNzUxMSAwLjk4MzYzOAordnQgMC4wODExNzAgMC45ODQ3ODAKK3Z0IDAuMDgxMTM4IDAuOTg0MTE3Cit2dCAwLjA4MTE3MCAwLjk4NDExNQordnQgMC40ODIxNTYgMC45ODM3NzkKK3Z0IDAuNDgyMTU2IDAuOTg0NDk5Cit2dCAwLjQ4MjEyNiAwLjk4NDQ4NgordnQgMC4wOTE4NTAgMC45ODQ3ODQKK3Z0IDAuMDkxODE4IDAuOTg0MTQwCit2dCAwLjY2NTg2NyAwLjk4Mzc5NQordnQgMC42NjU4NjcgMC45ODQ1MTEKK3Z0IDAuNjY1ODM2IDAuOTg0NDkzCit2dCAwLjY5NDc1NiAwLjk4NDQxNQordnQgMC42OTQ3MjYgMC45ODM2NzEKK3Z0IDAuNjk0NzU2IDAuOTgzNjU4Cit2dCAwLjE0MDYwOCAwLjY4NjkyNgordnQgMC4xNDA2MDggMC42ODM1ODUKK3Z0IDAuMTQwNjEwIDAuNjg5NjU3Cit2dCAwLjE0MDYxMCAwLjY5MzA0MQordnQgMC4xMzgxNzQgMC42ODY5MjUKK3Z0IDAuMTM4MTc0IDAuNjgzNTg0Cit2dCAwLjE2ODA4MiAwLjg3NTc3NQordnQgMC45NTY0NzkgMC44MjYxMjQKK3Z0IDAuOTU2NDExIDAuODI1NzIwCit2dCAwLjk1NjQ3OSAwLjgyNTU4OQordnQgMC4xNDA2MTAgMC42OTMzMDkKK3Z0IDAuMTM4MTc0IDAuNjkzMDQxCit2dCAwLjkyODc3NCAwLjIzNDQwNAordnQgMC45Mjg3NzQgMC4yMzc3ODgKK3Z0IDAuOTI4NTcxIDAuMjM3Nzg4Cit2dCAwLjQxNTA2OSAwLjczNDE2OQordnQgMC40MTUwNjkgMC43Mzc1NTMKK3Z0IDAuNDE0ODY2IDAuNzM3NTUzCit2dCAwLjk0NTAyOSAwLjQ2Nzg2NQordnQgMC45NDUwMjkgMC40NzA1OTcKK3Z0IDAuOTQ0ODI2IDAuNDcwNTk3Cit2dCAwLjQxNTA2OSAwLjczMTQzNwordnQgMC40MTQ4NjYgMC43MzQxNjkKK3Z0IDAuMTY3ODc5IDAuODc1Nzc1Cit2dCAwLjE2Nzg3OSAwLjg3NTI0NgordnQgMC45Mjk0OTEgMC4xMjc5MTYKK3Z0IDAuOTI5NDkxIDAuMTMxMjU3Cit2dCAwLjkyOTI4OCAwLjEzMTI1NwordnQgMC40MTUwNjkgMC43MjgwOTYKK3Z0IDAuNDE0ODY2IDAuNzMxNDM3Cit2dCAwLjE0NzgwMiAwLjk4ODUyMAordnQgMC4xNDc4MDIgMC45ODg4NjIKK3Z0IDAuMTQ3NTk5IDAuOTg4ODYyCit2dCAwLjk4OTMwMyAwLjYyNjk0NQordnQgMC45ODkzMDMgMC42MjcyODcKK3Z0IDAuOTg5MTAwIDAuNjI3Mjg3Cit2dCAwLjE2Nzg3OSAwLjg3MjgxMQordnQgMC40MTYyNjUgMC43MzQxNjkKK3Z0IDAuNDE2MjY0IDAuNzM3NTUzCit2dCAwLjQxNjI2NSAwLjczMTQzNwordnQgMC4xNjY2ODQgMC44NzU3NzUKK3Z0IDAuMTY2Njg0IDAuODc1MjQ2Cit2dCAwLjQxNjI2NSAwLjcyODA5NgordnQgMC45NjgwNDUgMC42NzgzNDMKK3Z0IDAuOTY3NzE2IDAuNjc3MTk0Cit2dCAwLjk2ODA0NSAwLjY3NzEwMAordnQgMC40MTYyNjQgMC43Mzc4OTUKK3Z0IDAuMTY2Njg0IDAuODcyODExCit2dCAwLjEzNTE2MyAwLjY5MzAzOQordnQgMC4xMzUyODEgMC42OTMwNDAKK3Z0IDAuMTM1MjgyIDAuNjkzMzA5Cit2dCAwLjEzNTE2NCAwLjY5MzM4MQordnQgMC4xMzUyODEgMC42ODk2NTcKK3Z0IDAuMTM1MTYzIDAuNjg5NjU1Cit2dCAwLjEzNTE2MyAwLjY4NjkyNAordnQgMC4xMzUyNzggMC42ODY5MjUKK3Z0IDAuMTY4MDgyIDAuODcwMzQ0Cit2dCAwLjE2ODE3MSAwLjg3MDM0NAordnQgMC4xMzUxNjMgMC42ODM1ODMKK3Z0IDAuMTM1Mjc4IDAuNjgzNTg0Cit2dCAwLjEzNTcwNyAwLjY5MzIwNQordnQgMC4xMTg1ODIgMC45NTA4MjEKK3Z0IDAuMTE4NTgyIDAuOTUzMjg4Cit2dCAwLjExODQ3OCAwLjk1MzI4OAordnQgMC4xMzU0NjggMC42OTMwNDAKK3Z0IDAuMTM1NDY5IDAuNjkzMjAzCit2dCAwLjEzNTQ2OCAwLjY4NjkyNQordnQgMC4xMzU0NzAgMC42ODk2NTcKK3Z0IDAuMTM1NDY4IDAuNjgzNTg0Cit2dCAwLjEzNzQ1MiAwLjY5MDMyMwordnQgMC4xMzczNjYgMC42OTA0MjAKK3Z0IDAuMTM3MDUxIDAuNjg5NjU3Cit2dCAwLjEzNzE3OSAwLjY4OTY1NwordnQgMC4xMzczNjQgMC42ODg5MDQKK3Z0IDAuMTM3NDU2IDAuNjg4OTkxCit2dCAwLjkyNTk1OCAwLjk2Mjg3OAordnQgMC45MjYzODEgMC45NjI5NDcKK3Z0IDAuMjE0MzQ2IDAuOTY0MTI2Cit2dCAwLjIxNDMzMCAwLjk2NDc3MgordnQgMC4yMTM5MTAgMC45NjQ2NzUKK3Z0IDAuMjEzOTI0IDAuOTY0MTE1Cit2dCAwLjIxNDM2MiAwLjk2MzQ4MgordnQgMC45Nzk4OTggMC44NzY2NTcKK3Z0IDAuOTc5NTkzIDAuODc2MTkzCit2dCAwLjk3OTg5OCAwLjg3NTg4NwordnQgMC4yNTk2NTMgMC45NjI1MTUKK3Z0IDAuNzQ5ODk5IDAuOTc4MzQ2Cit2dCAwLjc0OTU3NCAwLjk3NzgwNQordnQgMC43NDk4OTkgMC45Nzc1MjYKK3Z0IDAuNzkyMzA4IDAuOTg0MzU4Cit2dCAwLjc5MjI3OCAwLjk4NDM0NAordnQgMC43OTIzMDggMC45ODM1OTUKK3Z0IDAuNDYwNTA2IDAuOTgzNTM0Cit2dCAwLjQ2MDUzNyAwLjk4NDI5NwordnQgMC4yMTQzNjIgMC45NjQ3OTEKK3Z0IDAuOTg0OTI5IDAuMjAxOTA2Cit2dCAwLjk4NDk2MSAwLjIwMTkwNwordnQgMC45ODQ5NjEgMC4yMDI1NzIKK3Z0IDAuOTg1MDU3IDAuMjE4NDg4Cit2dCAwLjk4NTAyNiAwLjIxODQ4NgordnQgMC45ODUwNTcgMC4yMTc4NDMKK3Z0IDAuOTg0NjE0IDAuMzA3ODU4Cit2dCAwLjk4NDY0NSAwLjMwNzg0NQordnQgMC45ODQ2NDUgMC4zMDg1NjUKK3Z0IDAuMTY2NjU3IDAuOTg0NDU3Cit2dCAwLjE2NjYyNyAwLjk4NDQ0NgordnQgMC4xNjY2NTcgMC45ODM3MDEKK3Z0IDAuNDkyODExIDAuOTgzNzk1Cit2dCAwLjQ5Mjg0MiAwLjk4NDQ5OAordnQgMC4xMzU3MDkgMC42ODY5MjUKK3Z0IDAuMTM1NzA4IDAuNjgzNTg0Cit2dCAwLjEzNTcwNyAwLjY4OTY1NgordnQgMC4xMzU3MDcgMC42OTMwNDAKK3Z0IDAuNzYzNzczIDAuOTg2OTIwCit2dCAwLjc2MzcwNCAwLjk4Njc4NwordnQgMC43NjM3NzMgMC45ODYzNjgKK3Z0IDAuMTY4MDgyIDAuODY5ODAwCit2dCAwLjEzNTcwNyAwLjY5MzMwOAordnQgMC40MjgyOTAgMC43Mzc1NTEKK3Z0IDAuNDI4MDg3IDAuNzM3NTUxCit2dCAwLjQyODA4NyAwLjczNDE2NwordnQgMC41MzM0NDIgMC45Mjg1OTAKK3Z0IDAuNTMzMjM5IDAuOTI4NTc3Cit2dCAwLjUzMzQ0MiAwLjkyNTE5OQordnQgMC40MjgyOTAgMC43MzQxNjcKK3Z0IDAuNDI4MDg3IDAuNzMxNDM1Cit2dCAwLjk0NTQxOCAwLjcwNjk1NgordnQgMC45NDUyMTUgMC43MDY5NTYKK3Z0IDAuOTQ1MjE1IDAuNzA0MjI0Cit2dCAwLjE2Nzg3OSAwLjg3MDM0NAordnQgMC4xNjc4NzkgMC44Njk4MDAKK3Z0IDAuNDI4MjkwIDAuNzMxNDM1Cit2dCAwLjQyODA4NyAwLjcyODA5NAordnQgMC44NDc3MjMgMC45MjYwMDEKK3Z0IDAuODQ3OTI2IDAuOTI2MDAxCit2dCAwLjg0NzkyNiAwLjkyOTM0MwordnQgMC45ODkxNzQgMC44MjQ0NTcKK3Z0IDAuOTg5Mzc3IDAuODI0NDU3Cit2dCAwLjk4OTM3NyAwLjgyNDc5OQordnQgMC4xODg5NjcgMC45ODkyNTIKK3Z0IDAuMTg4NzY0IDAuOTg5MjUyCit2dCAwLjE4ODc2NCAwLjk4ODkxMAordnQgMC40MjY4OTIgMC43MzQxNjcKK3Z0IDAuNDI2ODkyIDAuNzM3NTUxCit2dCAwLjQyNjg5MiAwLjczMTQzNQordnQgMC4xNjY2ODQgMC44Njk3OTkKK3Z0IDAuMTY2Njg0IDAuODcwMzQ0Cit2dCAwLjQyNjg5MiAwLjcyODA5NAordnQgMC40MjY4OTIgMC43Mzc4OTMKK3Z0IDAuOTY4MDUxIDAuMzczNjg0Cit2dCAwLjk2NzcyMyAwLjM3MzU4OQordnQgMC45NjgwNTEgMC4zNzI0NDAKK3Z0IDAuMTQxMTQwIDAuNjUxMTgwCit2dCAwLjE0MTAyMCAwLjY1MTE4MQordnQgMC4xNDEwMjAgMC42NTA4MjEKK3Z0IDAuMTQxMTQwIDAuNjUwNzQ1Cit2dCAwLjE0MTE0MCAwLjY1MjI5NQordnQgMC4xNDEwMjEgMC42NTIyOTYKK3Z0IDAuODc0Mzc1IDAuMjkxNjIwCit2dCAwLjg3NDQ2NSAwLjI5MTYyMAordnQgMC44NzQ0NjUgMC4yOTQwMzkKK3Z0IDAuODc0Mzc1IDAuMjk0MDM5Cit2dCAwLjE0MTE0MCAwLjY2NzkzOQordnQgMC4xNDEwMjIgMC42Njc5NDEKK3Z0IDAuMTQwNTk0IDAuNjUwOTI0Cit2dCAwLjEzODE3NCAwLjY1MDkyMwordnQgMC4xMzgxNzQgMC42NTA4MjAKK3Z0IDAuMTQ3NzAyIDAuOTU0NjUwCit2dCAwLjE0NzU5OSAwLjk1MjIzMwordnQgMC4xNDc3MDIgMC45NTIyMjkKK3Z0IDAuMTQwODQ4IDAuNjUxMTgxCit2dCAwLjE0MDg0NyAwLjY1MDkyNAordnQgMC4xNDA2MDEgMC42Njc5NDEKK3Z0IDAuMTQwODQ4IDAuNjY3OTQxCit2dCAwLjEzODE3NCAwLjY2Nzk0MAordnQgMC4xNDA4NDggMC42NTIyOTYKK3Z0IDAuMTQwNTk0IDAuNjUxMTgxCit2dCAwLjk4NzA5NCAwLjE0NzYyNgordnQgMC45ODcwMjQgMC4xNDc0OTQKK3Z0IDAuOTg3MDk0IDAuMTQ3MDczCit2dCAwLjg3NDM3NiAwLjI5MTA3NQordnQgMC4xNDA1OTQgMC42NTA4MjEKK3Z0IDAuMTM4MTc0IDAuNjUxMTgwCit2dCAwLjYwNzQ4MSAwLjk3MTg5NwordnQgMC42MDc2ODQgMC45NzE4OTcKK3Z0IDAuNjA3Njg0IDAuOTczMDEzCit2dCAwLjQxNDg2NiAwLjY5NTY4OAordnQgMC40MTUwNjkgMC42OTU2ODgKK3Z0IDAuNDE1MDY5IDAuNjk2ODAzCit2dCAwLjg3NDE3MiAwLjI5MTYyMAordnQgMC44NzQxNzIgMC4yOTEwNzUKK3Z0IDAuMjU5NDMxIDAuOTg2NDQ2Cit2dCAwLjI1OTIyOCAwLjk4NjQ0NgordnQgMC4yNTkyMjggMC45ODYwMTEKK3Z0IDAuOTg1MzI0IDAuMzIxNTE0Cit2dCAwLjk4NTE0MCAwLjMyMTQyOAordnQgMC45ODUzMjQgMC4zMjEwMzQKK3Z0IDAuODc0MTcyIDAuMjk0MDM5Cit2dCAwLjQxNjI2NCAwLjY5NTY4OAordnQgMC40MTYyNjQgMC42OTY4MDMKK3Z0IDAuODcyOTc3IDAuMjkxMDc1Cit2dCAwLjg3Mjk3NyAwLjI5MTYyMAordnQgMC40MTYyNjQgMC42OTUyNTMKK3Z0IDAuOTM0ODcxIDAuNjY2NDY0Cit2dCAwLjkzNDQ2MyAwLjY2NjMxNQordnQgMC45MzQ4NzEgMC42NjUxOTIKK3Z0IDAuODcyOTc3IDAuMjk0MDM5Cit2dCAwLjEzNTE2MyAwLjY1MTE3OAordnQgMC4xMzUxNjQgMC42NTA3NDUKK3Z0IDAuMTM1MjgxIDAuNjUwODIwCit2dCAwLjEzNTI4MSAwLjY1MTE4MAordnQgMC44NzQzNzYgMC4yOTY1MDYKK3Z0IDAuODc0NDY1IDAuMjk2NTA3Cit2dCAwLjEzNTE2MyAwLjY2NzkzOAordnQgMC4xMzUyNzkgMC42Njc5NDAKK3Z0IDAuOTAzOTE5IDAuOTUzMTczCit2dCAwLjkwMzgxNiAwLjk1MzE2OAordnQgMC45MDM5MTkgMC45NTA3MDMKK3Z0IDAuMTM1NzA3IDAuNjUwOTIzCit2dCAwLjEzNTQ2OCAwLjY1MTE4MAordnQgMC4xMzU0NjkgMC42NTA5MjMKK3Z0IDAuMTM1NzA3IDAuNjUyMjk1Cit2dCAwLjEzNTcwOCAwLjY2Nzk0MAordnQgMC4xMzU0NjggMC42Njc5NDAKK3Z0IDAuMTM1NDY4IDAuNjUyMjk1Cit2dCAwLjEzODE3NCAwLjY1MjI5NgordnQgMC4xMzUyODAgMC42NTIyOTUKK3Z0IDAuMTM1NzA3IDAuNjUxMTgwCit2dCAwLjg3NDM3NiAwLjI5NzA1MAordnQgMC45MjYwMjcgMC45ODY5MDQKK3Z0IDAuOTI1OTU3IDAuOTg2NDg0Cit2dCAwLjkyNjAyNyAwLjk4NjM1MwordnQgMC4xMzU3MDcgMC42NTA4MjAKK3Z0IDAuNDI4MDg3IDAuNjk2ODAyCit2dCAwLjQyODA4NyAwLjY5NTY4NgordnQgMC40MjgyOTAgMC42OTU2ODYKK3Z0IDAuMTE4NjgyIDAuODA3ODUyCit2dCAwLjExODY4MiAwLjgwODk2NwordnQgMC4xMTg0NzggMC44MDg5NjcKK3Z0IDAuODc0MTcyIDAuMjk3MDUwCit2dCAwLjg3NDE3MiAwLjI5NjUwNgordnQgMC45NTg5NjIgMC45ODYwMzMKK3Z0IDAuOTU4OTYyIDAuOTg2NDY2Cit2dCAwLjk1ODc1OCAwLjk4NjQ2NgordnQgMC41MTc2MDUgMC45ODYxMjQKK3Z0IDAuNTE3NjA1IDAuOTg2NTU3Cit2dCAwLjUxNzQwMiAwLjk4NjU1NwordnQgMC40MjY4OTIgMC43MTI0NDgKK3Z0IDAuNDI4MDg3IDAuNzEyNDQ4Cit2dCAwLjg3Mjk3NyAwLjI5NzA1MAordnQgMC44NzI5NzcgMC4yOTY1MDYKK3Z0IDAuNDI2MDU1IDAuOTY3MDUxCit2dCAwLjQyNTY0OCAwLjk2NTkyOAordnQgMC40MjYwNTUgMC45NjU3ODAKK3Z0IDAuNDI2ODkyIDAuNjk1Njg2Cit2dCAwLjQyNjg5MiAwLjY5NTI1MwordnQgMC4xNDA1OTMgMC42NTIyOTYKK3Z0IDAuODI1MzE1IDAuNjY3MzI2Cit2dCAwLjgyNTExMSAwLjY2NzMyNAordnQgMC44MjUzMTUgMC42NTE2NzkKK3Z0IDAuNDE0ODY2IDAuNjk2ODAzCit2dCAwLjQxNTA2OSAwLjcxMjQ0OQordnQgMC40MTYyNjQgMC43MTI0NDkKK3Z0IDAuMTM1MTYzIDAuNjUyMjk0Cit2dCAwLjQyODI5MCAwLjcxMjQ0OAordnQgMC4xMTg2ODIgMC44MjQ2MTMKK3Z0IDAuNDI2ODkyIDAuNjk2ODAyCit2dCAwLjgyNTMxNSAwLjY5MzU5OQordnQgMC44MjUxMTEgMC42OTM1OTYKK3Z0IDAuODI1MzE1IDAuNjc3OTUxCit2dCAwLjQxNDg2NiAwLjcxMjQ0OQordnQgMC40MjgyOTAgMC43MjgwOTQKK3Z0IDAuODI1MzE1IDAuNzE5ODcyCit2dCAwLjgyNTExMSAwLjcxOTg2OQordnQgMC44MjUzMTUgMC43MDQyMjQKK3Z0IDAuOTEzMTEwIDAuMzc2ODUyCit2dCAwLjkxMjY5NCAwLjM3NjgxMgordnQgMC45MTMxMTAgMC4zNzI0NDAKK3Z0IDAuMzMyMTAwIDAuNTA5MDczCit2dCAwLjU3MTMzMiAwLjkwNjQzMwordnQgMC41NzA0MzYgMC45MDY0MzMKK3Z0IDAuNTcwNDM2IDAuOTAyMDI3Cit2dCAwLjgzMDAxMSAwLjExNzE1MwordnQgMC44Mjk5NTggMC4xMTI3NDcKK3Z0IDAuOTgzOTU1IDAuMjkwMDY0Cit2dCAwLjk4Mzk1NSAwLjI5MDkyOAordnQgMC45ODM5MzAgMC4yOTA5MjAKK3Z0IDAuMDkxOTQyIDAuODQ1NjMxCit2dCAwLjk4MzY0NyAwLjA2NjczMwordnQgMC45ODM2NDcgMC4wNjc2MDkKK3Z0IDAuOTc5MTUyIDAuNDAxMTYxCit2dCAwLjk3OTA1NSAwLjQwMDE5NAordnQgMC45NzkxNTIgMC40MDAxNTYKK3Z0IDAuOTc5NDM3IDAuNjE1MjE5Cit2dCAwLjk3OTM0MCAwLjYxNDI2MAordnQgMC45Nzk0MzcgMC42MTQyMjQKK3Z0IDAuNjgyODg3IDAuOTU4Njg3Cit2dCAwLjc4MTQ4OSAwLjk1OTg0NAordnQgMC45Nzc3NDkgMC43MDUxNDAKK3Z0IDAuOTc3NTA1IDAuNzA0Mzk0Cit2dCAwLjk3Nzc0OSAwLjcwNDIyNAordnQgMC4yNDI1MDIgMC44NjU0NzMKK3Z0IDAuMjQyMDg2IDAuODY1NDcxCit2dCAwLjA4MTE0NCAwLjgxMjIxNQordnQgMC4wODExMzggMC44MDkxMDMKK3Z0IDAuODU0NDA5IDAuMTg5NDI4Cit2dCAwLjg1MTk1MCAwLjE4OTQ1MgordnQgMC44NTE5NTAgMC4xODYxMDgKK3Z0IDAuMDA3MzA0IDAuODk0NDU2Cit2dCAwLjAwNTMxNCAwLjg5MzAxMgordnQgMC4wMDczMDQgMC44OTAzMjUKK3Z0IDAuODUxNTMxIDAuMTg5NDU2Cit2dCAwLjg1MTUzMSAwLjE4NjExMwordnQgMC4yNDE5NjIgMC44NjU0NzEKK3Z0IDAuODUxNDA3IDAuMTg5NDU4Cit2dCAwLjg1MTQwNyAwLjE4NjExNAordnQgMC4yNDQ5MzYgMC44NjU0ODQKK3Z0IDAuMTQ3NTk5IDAuODk2OTk4Cit2dCAwLjE0OTg3NiAwLjg5Njk4MwordnQgMC4xNDk4NzYgMC45MDAzMjkKK3Z0IDAuMDUyMTU3IDAuODg0MzY4Cit2dCAwLjI0MzgzOCAwLjg5Nzc3MgordnQgMC4yNDE5NjIgMC44OTY2MDAKK3Z0IDAuMjQzODM4IDAuODkzODMzCit2dCAwLjg1MzUyOCAwLjI5NzIxMAordnQgMC44NTEyNjIgMC4yOTUxMTcKK3Z0IDAuODUzNTI4IDAuMjkyNjU1Cit2dCAwLjA4MTEzOCAwLjgxNTMwMAordnQgMC4wNDQ2NTAgMC41MTM4NjAKK3Z0IDAuMDM5OTk1IDAuNTIyMzc0Cit2dCAwLjI5ODU3MiAwLjg0NDUxOQordnQgMC4yOTc1NTcgMC44MzQ4ODcKK3Z0IDAuMjk4NTcyIDAuODM0NTc1Cit2dCAwLjQwOTk1NSAwLjY0NzEzNAordnQgMC40MDc4NDUgMC42MzcyMDQKK3Z0IDAuNDA3NzkyIDAuNjIzNTUzCit2dCAwLjQwNzc3NSAwLjYxOTE1MQordnQgMC40MDcyMTUgMC40NzM5MTkKK3Z0IDAuNDA3MzAyIDAuNDk2Mzk1Cit2dCAwLjQwOTI5NCAwLjQ2NDE0OQordnQgMC40MTQ2NDYgMC40NTYwODEKK3Z0IDAuMTE5NDg2IDAuODQ1MTgyCit2dCAwLjExODQ3OCAwLjgzNTU1MwordnQgMC4xMTk0ODYgMC44MzUyMzgKK3Z0IDAuMTA1MjgzIDAuNjA0MDYxCit2dCAwLjEwMzUxNyAwLjU5NDEyNwordnQgMC4xMDkzMzggMC41MDkzNzgKK3Z0IDAuMzIwMzM3IDAuNDU1MTE0Cit2dCAwLjAzODg4OSAwLjUzMjMxMQordnQgMC4wNDAyNzYgMC41NDcyOTkKK3Z0IDAuNDA3MzM0IDAuNTA0NzczCit2dCAwLjQwNzU0NiAwLjU1OTgyOAordnQgMC40MDc3NTkgMC42MTQ4ODIKK3Z0IDAuNDA3MzE3IDAuNTAwMzk4Cit2dCAwLjQ0NjQ2MCAwLjYzMjE1NQordnQgMC40NDY0ODYgMC42MzQxMzMKK3Z0IDAuMTA4MjY5IDAuNTExNDUzCit2dCAwLjQ0NDM5OCAwLjQ4MDA4OAordnQgMC4xMDY5NDIgMC41MzA3NzUKK3Z0IDAuMDQ0MTM5IDAuNTg5MDI5Cit2dCAwLjA0NDM2MCAwLjU5MTQxNAordnQgMC4wNDk4MjMgMC45MzE3NjgKK3Z0IDAuMDQ5NTIyIDAuOTI4NjQyCit2dCAwLjA0OTgyMyAwLjkyODYxMwordnQgMC4wMzc1NTAgMC42MTEzMDkKK3Z0IDAuOTQ2MTMwIDAuMzcyNDQwCit2dCAwLjk0NjEzMCAwLjM3NDk2MgordnQgMC45NDU4MjcgMC4zNzQ5NjIKK3Z0IDAuMDM3NTUwIDAuNjA4MTY5Cit2dCAwLjAzODg5NCAwLjYwNTQwNgordnQgMC4wNDQ2MjYgMC41OTQyOTYKK3Z0IDAuNDAwNzU2IDAuNjk1MTU4Cit2dCAwLjY2NjAyOCAwLjk3MzE2OQordnQgMC42NjU4MzYgMC45NzIwNzgKK3Z0IDAuNjY2MDI4IDAuOTcyMDQ0Cit2dCAwLjg3NjI3NCAwLjI1NDY5MgordnQgMC44NzYyNzQgMC4yNTQ0OTgKK3Z0IDAuMzQzMDIzIDAuODczNDc4Cit2dCAwLjM0MzAyMyAwLjg3MTAyNAordnQgMC4zNDMwMjMgMC44NzA2MDYKK3Z0IDAuMzQzMDIzIDAuODcwNDU2Cit2dCAwLjg3NzYyMSAwLjI2MDQ4OQordnQgMC45MzUwMDggMC40MDE0NTMKK3Z0IDAuOTM0ODM3IDAuNDAxMTgxCit2dCAwLjkzNTAwOCAwLjQwMTE3MgordnQgMC4yNzkyNTkgMC43NDA5MzgKK3Z0IDAuMjc5MjU5IDAuNzQxNTQyCit2dCAwLjQ4MjEyNiAwLjg5MzMzNQordnQgMC40ODIxMjYgMC44OTE2MTIKK3Z0IDAuNDgyMTI2IDAuODg5MTU4Cit2dCAwLjQ4MjEyNiAwLjg4ODc0MAordnQgMC41NDkwNzYgMC44OTMyNDAKK3Z0IDAuNTQ5MDc2IDAuODkwNzg2Cit2dCAwLjI3OTI1OSAwLjc3MTc2NQordnQgMC4yNzkyNTkgMC43NzIzNzQKK3Z0IDAuODQzNDY3IDAuMjIyOTI0Cit2dCAwLjg0MzQ2NyAwLjIyMzY4OQordnQgMC44NDI4MTYgMC4yMjM2ODkKK3Z0IDAuNTQ5NzI2IDAuODg4MzAyCit2dCAwLjU0OTA3NiAwLjg4OTA2NwordnQgMC40ODIxMjYgMC44ODg1OTEKK3Z0IDAuNTQ5OTIzIDAuODkzODA3Cit2dCAwLjQ0MzI3MyAwLjcxNDIxOQordnQgMC40NDMyNzMgMC43MTM2MTIKK3Z0IDAuNDYwNTA2IDAuODkyODY5Cit2dCAwLjQ2MDUwNiAwLjg5MTE1MAordnQgMC40NjA1MDYgMC44ODg2OTYKK3Z0IDAuNDYwNTA2IDAuODg4Mjc4Cit2dCAwLjg5MTYzNSAwLjQ1NjQ2NwordnQgMC44OTE2MzUgMC40NTQwMTQKK3Z0IDAuNDQzMjczIDAuNjQ2NTA5Cit2dCAwLjQ0MzI3MyAwLjY0NTkzNQordnQgMC45MDE3MDUgMC41Mzk2NTcKK3Z0IDAuOTAxMjA4IDAuNTM5MDY5Cit2dCAwLjkwMTcwNSAwLjUzODY0OQordnQgMC44OTIyODYgMC40NTE1MjgKK3Z0IDAuODkxNjM1IDAuNDUyMjk3Cit2dCAwLjg5MjQ4MyAwLjQ1NzAzNgordnQgMC40NjA1MDcgMC44ODgxMjkKK3Z0IDAuNDAwMTg1IDAuNzQ4NjM1Cit2dCAwLjM5OTYyMyAwLjc0ODQ1OQordnQgMC43ODEzNzQgMC45ODQzMjgKK3Z0IDAuNzgxMjA1IDAuOTgzNzkyCit2dCAwLjc4MTM3NCAwLjk4MzczOQordnQgMC41MzMzNjggMC45ODkzNzgKK3Z0IDAuNTMzMjM5IDAuOTg5MTA0Cit2dCAwLjUzMzM2OCAwLjk4ODk3NwordnQgMC43MTg1MTEgMC45ODkzOTIKK3Z0IDAuNzE4Mzg5IDAuOTg5MTM0Cit2dCAwLjcxODUxMSAwLjk4ODk5MQordnQgMC44ODEzMjcgMC45ODgyNzEKK3Z0IDAuODgxMTY4IDAuOTg4MDE0Cit2dCAwLjg4MTMyNyAwLjk4Nzg0NQordnQgMC4yOTc3MDggMC45ODg2NjAKK3Z0IDAuMjk3NTU3IDAuOTg4NDE3Cit2dCAwLjI5NzcwOCAwLjk4ODIzMwordnQgMC42MTkxMjkgMC45ODQ0MzMKK3Z0IDAuNjE4OTczIDAuOTgzODkzCit2dCAwLjYxOTEyOSAwLjk4Mzg0OAordnQgMC4wMzc4NzMgMC42MDUzNDIKK3Z0IDAuOTc5OTk5IDAuNDUxNTI4Cit2dCAwLjk4MDAwNCAwLjQ1MjU0OQordnQgMC45Nzk5NDEgMC40NTI1NDkKK3Z0IDAuOTkwNTExIDAuNTYzMzE1Cit2dCAwLjk5MDUxMSAwLjU2MzYxOAordnQgMC45OTA0MzYgMC41NjM2MTcKK3Z0IDAuMTM1MjM1IDAuOTg5ODYwCit2dCAwLjEzNTIzOSAwLjk5MDE2MwordnQgMC4zMDc4NjUgMC42NTcyNDEKK3Z0IDAuMzEyNzA4IDAuNjY1NjgxCit2dCAwLjMyMDMzNyAwLjY3MTczMwordnQgMC4xNzQwMzQgMC41NzE4MDYKK3Z0IDAuMTc1MDA3IDAuNTYxMzU4Cit2dCAwLjg0MTEyMyAwLjAxNTgwNQordnQgMC44NDAxODggMC4wMTU0MzIKK3Z0IDAuODQxMTIzIDAuMDA1MzEzCit2dCAwLjIxODIxMCAwLjY3MTAwMgordnQgMC4yMTUyNDAgMC42ODAxOTMKK3Z0IDAuMjE2NzU2IDAuNjg5OTUxCit2dCAwLjIyMTYwNCAwLjY5ODMxNgordnQgMC40NDY1MDAgMC40NTU0MTUKK3Z0IDAuNDQ0MTk4IDAuNDY1MjgwCit2dCAwLjM3NDQ3NSAwLjgyNTczMwordnQgMC4zNzQ0NzUgMC44MzYxODUKK3Z0IDAuMzczNDMzIDAuODM1OTc3Cit2dCAwLjAwNTMxOSAwLjY3NjAyMgordnQgMC4yMjEzODUgMC42NjQ1MDMKK3Z0IDAuMDA1MzE5IDAuNjc1NjY2Cit2dCAwLjI0MTk2MiAwLjg2MDUwMAordnQgMC45NzI5OTUgMC4wNjgwMTUKK3Z0IDAuOTcyOTE3IDAuMDY2NzU4Cit2dCAwLjk3Mjk5NSAwLjA2NjczMwordnQgMC4wMDUzMTkgMC42NzU1ODYKK3Z0IDAuMDA1MzE0IDAuNzIzMTg2Cit2dCAwLjAwNTMxNCAwLjcxNTU2MAordnQgMC4wMDUzMTQgMC43MjM3NjQKK3Z0IDAuMjQ3MDUwIDAuODI2MjM4Cit2dCAwLjI0NzA2MyAwLjgyODY5NgordnQgMC4yNDcwNjkgMC44MjkxMTgKK3Z0IDAuMjQ3MDcwIDAuODI5MjM5Cit2dCAwLjA5MTg0NyAwLjk3MjIyOQordnQgMC4wOTE4NDcgMC45NzM1MTMKK3Z0IDAuMDkxODE4IDAuOTcyNzU1Cit2dCAwLjI0Mzc4OSAwLjgyOTI3OAordnQgMC43NTA3MTUgMC45MjY2NjMKK3Z0IDAuNzUwNzE5IDAuOTI4ODkyCit2dCAwLjc0OTU3NCAwLjkyODg5MgordnQgMC4yMTg5OTkgMC43MDk5NDIKK3Z0IDAuNzM3NTA4IDAuOTQ1Mjg3Cit2dCAwLjczNjYwMSAwLjk0NDA3NAordnQgMC43Mzc1MDggMC45NDMzNzUKK3Z0IDAuMjQzMTI2IDAuODIyNDA2Cit2dCAwLjE3MTc0OCAwLjYzODk0MgordnQgMC4xNzUwMDcgMC42Mzk2NjYKK3Z0IDAuNzIzNDc0IDAuODIxMDkwCit2dCAwLjcyMzUwNiAwLjgxODY0MQordnQgMC43MjM1MTkgMC44MTgyMjUKK3Z0IDAuNzIzNTIyIDAuODE4MTA3Cit2dCAwLjQ5Mjk1OSAwLjg3Mzc4MwordnQgMC40OTI5MTIgMC44Njk5NzcKK3Z0IDAuNDkyOTU5IDAuODY5OTU3Cit2dCAwLjg3NjczNiAwLjIyMzY5MAordnQgMC44NzU3MTcgMC4yMjE2ODgKK3Z0IDAuODc2NzM2IDAuMjIxMTY3Cit2dCAwLjcxODQzNyAwLjgyNDk0OAordnQgMC45NDE0NDggMC4zMjI5MzAKK3Z0IDAuOTQwNTExIDAuMzIxNjkyCit2dCAwLjk0MTQ0OCAwLjMyMTAzNAordnQgMC4yMTkwMDQgMC43MTIxNzEKK3Z0IDAuMzQzMDIzIDAuODc1OTEwCit2dCAwLjg3NjI3NCAwLjI1OTkyMQordnQgMC44NzYyNzQgMC4yNTc0NjgKK3Z0IDAuODIxNDExIDAuMjAxOTA2Cit2dCAwLjgyMTQxMSAwLjIxODUzNQordnQgMC44MjEwODggMC4yMTg1MzUKK3Z0IDAuMzk5MzIxIDAuNzM3Mzg1Cit2dCAwLjM5OTMyMSAwLjcyMDc1NgordnQgMC4zNzM2OTUgMC45ODM5MzcKK3Z0IDAuMzczNDMzIDAuOTgzNzQ4Cit2dCAwLjM3MzY5NSAwLjk4MzM4NAordnQgMC4zNDMwMjMgMC44NzY0NDcKK3Z0IDAuMDE5MDc3IDAuOTY2MjI0Cit2dCAwLjAxODU5NCAwLjk2NTk5MAordnQgMC4wMTkwNzcgMC45NjQ5ODkKK3Z0IDAuNjk2OTgzIDAuNTQ3ODAxCit2dCAwLjY5Njk4MyAwLjYyOTUzMQordnQgMC42OTY2ODEgMC42Mjk1MzEKK3Z0IDAuMjU5NTMxIDAuNjEwMDYzCit2dCAwLjI1OTUzMSAwLjY5MTc5MwordnQgMC4yNTkyMjggMC42OTE3OTMKK3Z0IDAuNDAwMTg1IDAuNzUwNjUyCit2dCAwLjQwMDE4NSAwLjc0OTA5NgordnQgMC4zOTkyNjIgMC43Nzg1OTAKK3Z0IDAuMzk5MjYyIDAuNzc5MDIxCit2dCAwLjQ2MDUwNiAwLjg5MzYzNgordnQgMC4wNjM2NDMgMC45NjgzODMKK3Z0IDAuMDYzMTQ3IDAuOTY3Nzk4Cit2dCAwLjA2MzY0MyAwLjk2NzM3OAordnQgMC40ODIxMjYgMC44OTQwOTUKK3Z0IDAuOTI1MTI1IDAuNTY0MzQ0Cit2dCAwLjkyNTEyNSAwLjU2NTEwNQordnQgMC45MjQ0NzQgMC41NjUxMDUKK3Z0IDAuMjQ0OTM2IDAuODYwMzM2Cit2dCAwLjA4NjI3MiAwLjgwNjgyNwordnQgMC42NjYyNDIgMC45NDY4OTMKK3Z0IDAuNjY2MjQyIDAuOTQ5MTcwCit2dCAwLjY2NTgzNiAwLjk0OTE2NwordnQgMC45NTEyMzUgMC4xMDc5MzkKK3Z0IDAuOTUxMzE3IDAuMTEwMTUwCit2dCAwLjk1MDkxMiAwLjExMDE1MAordnQgMC45NTEyMDUgMC4xMjc5MTYKK3Z0IDAuOTUxMjA1IDAuMTMwMTI4Cit2dCAwLjk1MDgwMCAwLjEzMDExMwordnQgMC45MjkyMTIgMC4xMTEwNTIKK3Z0IDAuOTI4ODEwIDAuMTA3OTkzCit2dCAwLjkyOTIxMiAwLjEwNzkzOQordnQgMC40MDU4NDEgMC41MDQ3NzkKK3Z0IDAuMzU2ODI3IDAuNDk2Mjg3Cit2dCAwLjMwNTYzMyAwLjczODcxMQordnQgMC4zMDUyMTUgMC43Mzg3MDgKK3Z0IDAuMzA1NjMzIDAuNjgzNjU5Cit2dCAwLjI3ODM3MiAwLjUwMTAzMwordnQgMC4xMTk5NjUgMC42NzE4OTAKK3Z0IDAuMTIwODYyIDAuNjcxODkwCit2dCAwLjEyMDg2MiAwLjcyNjk0NQordnQgMC4zMTYzMTMgMC43Mzg3MTQKK3Z0IDAuMzE2MzEzIDAuNjgzNjU5Cit2dCAwLjA4NDk1OSAwLjY5ODA4MgordnQgMC4wODQ5NTkgMC42OTc3MDIKK3Z0IDAuMDg1Mjg2IDAuNjk3NzAwCit2dCAwLjA4NTI4NiAwLjY5ODA4MwordnQgMC43MzkyMDEgMC44NzA3NTgKK3Z0IDAuNzM5MjAxIDAuODcxMjkxCit2dCAwLjczNzE5MyAwLjg3MTI5MQordnQgMC43MzcxOTMgMC44NzA3NTkKK3Z0IDAuMDE4NTk0IDAuNzQ1NDM0Cit2dCAwLjAxODU5NCAwLjc0NDg0NwordnQgMC4wMjA2MDEgMC43NDQ4NDcKK3Z0IDAuMjAyOTMxIDAuOTQ4OTkxCit2dCAwLjIwMjM2NyAwLjk0ODgyNwordnQgMC4yMDI5MzEgMC45NDY5MDAKK3Z0IDAuMDE4NTk0IDAuNzQzNzMzCit2dCAwLjAxODU5NCAwLjcyOTg1OAordnQgMC4wMjA2MDEgMC43Mjk4NTgKK3Z0IDAuMDIwNjAxIDAuNzQzNzMzCit2dCAwLjAxODU5NCAwLjcxNDc2MwordnQgMC4wMTg1OTQgMC43MTQxNzMKK3Z0IDAuMDIwNjAxIDAuNzE0MTczCit2dCAwLjAyMDYwMSAwLjcxNDc2MwordnQgMC44Njc2MzggMC4xODYwNjMKK3Z0IDAuODY3NjM4IDAuMTg2NTk2Cit2dCAwLjg2NTYzMSAwLjE4NjU5NgordnQgMC41MTc5MzUgMC45NTE3MjgKK3Z0IDAuNTE3NDAyIDAuOTUxNzI4Cit2dCAwLjUxNzQwMiAwLjk0OTcyMQordnQgMC4wODExMzggMC42OTc3MDIKK3Z0IDAuMDgxNTcwIDAuNjk3NzAxCit2dCAwLjA4MTU3MCAwLjY5ODA4MQordnQgMC4wODExMzggMC42OTgwODEKK3Z0IDAuNzM5MjAxIDAuODY2Nzk1Cit2dCAwLjczNzE5MyAwLjg2Njc5NQordnQgMC43MzcxOTMgMC44NjYwOTcKK3Z0IDAuNzM5MjAxIDAuODY2MDk3Cit2dCAwLjU0OTYzNyAwLjk0OTQwNAordnQgMC41NDkwNzYgMC45NDc0NzcKK3Z0IDAuNTQ5NjM3IDAuOTQ3MzEzCit2dCAwLjc1MjUyNCAwLjUwMjY1OQordnQgMC43NTA1MTYgMC41MDI2NTkKK3Z0IDAuNzUwNTE2IDAuNTAyMDc1Cit2dCAwLjc1MDUxNiAwLjUzMjc0MwordnQgMC43NTI1MjQgMC41MzI3NDMKK3Z0IDAuNzUyNTI0IDAuNTMzMzMyCit2dCAwLjc1MDUxNiAwLjUzMzMzMgordnQgMC45NDYzMjUgMC43MTk3MzkKK3Z0IDAuOTQ1NjY2IDAuNzE3ODQzCit2dCAwLjk0NjMyNSAwLjcxNzYxNAordnQgMC44NjU2MzEgMC4xOTA1NTkKK3Z0IDAuODY3NjM4IDAuMTkwNTU5Cit2dCAwLjg2NzYzOCAwLjE5MTI1NwordnQgMC44Njc2MzggMC4xODg5NjkKK3Z0IDAuODY1NjMxIDAuMTg4OTY5Cit2dCAwLjA4MjkyOSAwLjY5ODA4MgordnQgMC4wODI5MjkgMC42OTc3MDEKK3Z0IDAuMDgxMTM4IDAuNzI4NjIyCit2dCAwLjA4MTEzOCAwLjcyODE0NAordnQgMC4wODE1NzAgMC43MjgxNDQKK3Z0IDAuMDgxNTcwIDAuNzI4NjIyCit2dCAwLjA4MjkyOSAwLjcyODYyMwordnQgMC4wODI5MjkgMC43MjgxNDUKK3Z0IDAuMDg0OTU5IDAuNzI4NjIzCit2dCAwLjA4NDk1OSAwLjcyODE0NQordnQgMC4wODUyODYgMC43MjgxNDUKK3Z0IDAuMDg1Mjg2IDAuNzI4NjI0Cit2dCAwLjA4MTU3MCAwLjY5OTE5NQordnQgMC4wODE1NzAgMC43MTMwNTkKK3Z0IDAuMDgxMTM4IDAuNzEzMDU5Cit2dCAwLjA4MTEzOCAwLjY5OTE5NAordnQgMC4wODI5MjkgMC42OTkxOTUKK3Z0IDAuMDgyOTI5IDAuNzEzMDYwCit2dCAwLjA4NTI4NiAwLjY5OTE5NgordnQgMC4wODUyODYgMC43MTMwNjAKK3Z0IDAuMDg0OTU5IDAuNzEzMDYwCit2dCAwLjA4NDk1OSAwLjY5OTE5NgordnQgMC45MTM0MTEgMC44MDE0NzEKK3Z0IDAuOTEzNDExIDAuODAxOTE0Cit2dCAwLjkxMzA4NSAwLjgwMTg5NQordnQgMC43MzcwNDMgMC44NzA3NTkKK3Z0IDAuNzM3MDQzIDAuODcxMjkxCit2dCAwLjczNjYwMSAwLjg3MDc4NAordnQgMC45ODA4NjEgMC45NjI3ODMKK3Z0IDAuOTgwNjEzIDAuOTYyNDkxCit2dCAwLjk4MDg2MSAwLjk2MTk5MgordnQgMC44MzY1MTcgMC45NzcxOTcKK3Z0IDAuODM2MTM4IDAuOTc2NzUwCit2dCAwLjgzNjUxNyAwLjk3NjQwNgordnQgMC44MjUxMTEgMC42MTUxNjcKK3Z0IDAuODI1MTExIDAuNjAxMjM0Cit2dCAwLjgyNTYyMyAwLjYwMTIxOAordnQgMC44MjU2MjMgMC42MTUxNTEKK3Z0IDAuNTAzOTMwIDAuOTc5OTY5Cit2dCAwLjUwMzU4NiAwLjk3OTYzNwordnQgMC41MDM5MzAgMC45NzkyNTgKK3Z0IDAuNzE4ODEzIDAuOTc4MzY2Cit2dCAwLjcxODM4OSAwLjk3Nzk1NgordnQgMC43MTg4MTMgMC45Nzc2NTQKK3Z0IDAuOTc5MTA3IDAuNzE4NTYwCit2dCAwLjk3ODk1NCAwLjcxODI3MQordnQgMC45NzkxMDcgMC43MTc2MTQKK3Z0IDAuOTc2Mzk3IDAuMTQ4MDIwCit2dCAwLjk3NjE0NyAwLjE0NzU1MAordnQgMC45NzYzOTcgMC4xNDcwNzMKK3Z0IDAuOTU4OTYyIDAuOTc1NDA3Cit2dCAwLjk1ODc4MyAwLjk3NTAxNQordnQgMC45NTg5NjIgMC45NzQzNDAKK3Z0IDAuNzM3MDQzIDAuODY2MDk3Cit2dCAwLjczNzA0MyAwLjg2Njc5NQordnQgMC43MzY2MDEgMC44NjcwNjgKK3Z0IDAuOTQ1NzgzIDAuODI2MTIzCit2dCAwLjk0NTQwNCAwLjgyNjEyMwordnQgMC45NDU0MjEgMC44MjU1ODkKK3Z0IDAuODQ4MjU4IDAuOTc4Mzg1Cit2dCAwLjg0ODI1OCAwLjk3ODk2OQordnQgMC44NDc3MjMgMC45Nzg3NDgKK3Z0IDAuODM1OTg2IDAuNDY3ODY1Cit2dCAwLjgzNjQyNyAwLjQ4MTcyMgordnQgMC44MzU4OTIgMC40ODE3MjIKK3Z0IDAuODM2MzMxIDAuNDAxNDY0Cit2dCAwLjgzNTc5NiAwLjM4NzYxMAordnQgMC44MzYzMzEgMC4zODc2MDYKK3Z0IDAuOTc5MjA4IDAuNzk5ODM2Cit2dCAwLjk3ODg4MiAwLjc5OTQ4NwordnQgMC45NzkyMDggMC43OTkwNTMKK3Z0IDAuMTE4ODgwIDAuOTc2NTkxCit2dCAwLjExODQ3OCAwLjk3NjE2MgordnQgMC4xMTg4ODAgMC45NzU4MDkKK3Z0IDAuOTAyMjI4IDAuNjkzNTgxCit2dCAwLjkwMTgyMSAwLjY5MzQzNQordnQgMC45MDIyMjggMC42OTMxMDkKK3Z0IDAuOTc4Mzg4IDAuNzMxMTUzCit2dCAwLjk3ODYyNSAwLjczMDQ5NwordnQgMC45Nzg4NjEgMC43MzExNTMKK3Z0IDAuOTUyNTAxIDAuMzIzMTUyCit2dCAwLjk1MjA3NSAwLjMyMzAxOQordnQgMC45NTI1MDEgMC4zMjEwMzQKK3Z0IDAuODY1MDM3IDAuMTg2ODk5Cit2dCAwLjg2NTQ4MSAwLjE4NjU5NgordnQgMC44NjU0ODEgMC4xODg5NjkKK3Z0IDAuNzM2NjAxIDAuODY4NDI4Cit2dCAwLjczNzA0MyAwLjg2ODM4NQordnQgMC45NDc1ODEgMC44NjAwMzIKK3Z0IDAuOTQ3MjAzIDAuODU5NjU0Cit2dCAwLjk0NzU4MSAwLjg1NzY2MAordnQgMC4wMTg1OTQgMC43MTU5MTYKK3Z0IDAuMDIwNjAxIDAuNzE1OTE2Cit2dCAwLjc1MjUyNCAwLjUwMzc3MwordnQgMC43NTA1MTYgMC41MDM3NzMKK3Z0IDAuMDgxMTM4IDAuNzI2OTkyCit2dCAwLjA4MTU3MCAwLjcyNjk5MgordnQgMC4wODI5MjkgMC43MjY5OTIKK3Z0IDAuMDg0OTU5IDAuNzI2OTkzCit2dCAwLjA4NTI4NiAwLjcyNjk5MwordnQgMC45NTY0NzQgMC42Mzk5MzIKK3Z0IDAuOTU2OTg2IDAuNjM5OTE1Cit2dCAwLjk1Njk4NiAwLjY0MTAyOAordnQgMC44MjUwMjMgMC45NjY4ODcKK3Z0IDAuODI0NTUyIDAuOTY2Njg2Cit2dCAwLjgyNTAyMyAwLjk2NTY3NwordnQgMC44MjU2MjMgMC42MTYzMDMKK3Z0IDAuODI1MTExIDAuNjE2MzIwCit2dCAwLjk1NzM5NCAwLjQwMTQ0MgordnQgMC45NTY5MTUgMC40MDEyMDQKK3Z0IDAuOTU3Mzk0IDAuNDAwMTU2Cit2dCAwLjEwMzA3NCAwLjk2NDc2MAordnQgMC4xMDI1OTUgMC45NjQ1MjIKK3Z0IDAuMTAzMDc0IDAuOTYzNDc0Cit2dCAwLjgwMzk2NCAwLjk2NjE3NQordnQgMC44MDM0ODggMC45NjU5MzEKK3Z0IDAuODAzOTY0IDAuOTY0OTI1Cit2dCAwLjI5ODAzMyAwLjk2NjE5NQordnQgMC4yOTc1NTcgMC45NjU5NTEKK3Z0IDAuMjk4MDMzIDAuOTY0OTQ0Cit2dCAwLjkyOTg1MCAwLjMyMzIzNwordnQgMC45Mjk0OTIgMC4zMjI4NTgKK3Z0IDAuOTI5ODUwIDAuMzIxNTQ2Cit2dCAwLjg2NTAzNyAwLjE4ODkyOAordnQgMC44NjU0ODEgMC4xOTA1NTkKK3Z0IDAuNzYzNzA0IDAuOTYyOTc0Cit2dCAwLjc2NDE0NyAwLjk2MjkzMQordnQgMC43NjQxNDcgMC45NjQyOTAKK3Z0IDAuNzUwNTE2IDAuNTMxNTkwCit2dCAwLjc1MDUxNiAwLjUxNzY0NwordnQgMC43NTI1MjQgMC41MTc2NDcKK3Z0IDAuNzUyNTI0IDAuNTMxNTkwCit2dCAwLjgzNjQwNSAwLjc0NDM1NAordnQgMC44MzU4OTMgMC43NDQzNTQKK3Z0IDAuODM2MzQ0IDAuNzMwNDk3Cit2dCAwLjgzNjQwNCAwLjUwOTE4MwordnQgMC44MzU4OTIgMC41MDkxODMKK3Z0IDAuODM2MzQzIDAuNDk1MzI2Cit2dCAwLjgzMDI1OCAwLjA2MDE1OQordnQgMC44Mjk3MjQgMC4wNjAxMjEKK3Z0IDAuODMwMjU4IDAuMDQ2MTk5Cit2dCAwLjgzMDA1NyAwLjI0ODM2NAordnQgMC44Mjk1MjMgMC4yNDgzMjYKK3Z0IDAuODMwMDU3IDAuMjM0NDA0Cit2dCAwLjIzNjc1MCAwLjYxMDQ0NQordnQgMC4yMzY3NTAgMC42MTAwNjQKK3Z0IDAuMjM3MDc3IDAuNjEwMDYzCit2dCAwLjIzNzA3NyAwLjYxMDQ0NQordnQgMC44NjM2MDEgMC4xNDkyOTAKK3Z0IDAuODYzNjAxIDAuMTQ4NzU4Cit2dCAwLjg2NTYwOSAwLjE0ODc1OAordnQgMC44NjU2MDkgMC4xNDkyOTAKK3Z0IDAuMTA0NzUyIDAuNjIzNzY2Cit2dCAwLjEwNDc1MiAwLjYyNDM1MwordnQgMC4xMDI3NDQgMC42MjQzNTMKK3Z0IDAuMzU3MjcwIDAuOTQ5NzA1Cit2dCAwLjM1NjY4MyAwLjk0OTcwNQordnQgMC4zNTY2ODMgMC45NDc2OTcKK3Z0IDAuMTA0NzUyIDAuNjkxMjE4Cit2dCAwLjEwNDc1MiAwLjY5MTc4MQordnQgMC4xMDI3NDQgMC42OTE3ODEKK3Z0IDAuMTAyNzQ0IDAuNjkxMjE4Cit2dCAwLjg2NTY0NiAwLjI1NTI3MwordnQgMC44NjU2NDYgMC4yNTU4MDYKK3Z0IDAuODYzNjM5IDAuMjU1ODA1Cit2dCAwLjM5OTc3NiAwLjk1MTI4OQordnQgMC4zOTkyNjEgMC45NTExNTIKK3Z0IDAuMzk5Nzc2IDAuOTQ5MjEyCit2dCAwLjIzMjkxMCAwLjYxMDA2MwordnQgMC4yMzMzNjAgMC42MTAwNjMKK3Z0IDAuMjMzMzYwIDAuNjEwNDQ0Cit2dCAwLjIzMjkxMCAwLjYxMDQ0NAordnQgMC44NjM2MDEgMC4xNTMyNTQKK3Z0IDAuODY1NjA5IDAuMTUzMjU0Cit2dCAwLjg2NTYwOSAwLjE1Mzk3NAordnQgMC44NjM2MDEgMC4xNTM5NzQKK3Z0IDAuOTUwMzc3IDAuMDg3MDY5Cit2dCAwLjk1MDM3NyAwLjA4OTA3NgordnQgMC45NDk3OTIgMC4wODkwNzYKK3Z0IDAuNjc2Mzg4IDAuNjM4NjUyCit2dCAwLjY3NDM4MCAwLjYzODY1MgordnQgMC42NzQzODAgMC42MzgwNjcKK3Z0IDAuNjc0MzgwIDAuNzA1NTE5Cit2dCAwLjY3NjM4OCAwLjcwNTUxOQordnQgMC42NzYzODggMC43MDYwODAKK3Z0IDAuNjc0MzgwIDAuNzA2MDgwCit2dCAwLjk0NjA0MiAwLjUyNDkxNgordnQgMC45NDUzNjUgMC41MjMwMjcKK3Z0IDAuOTQ2MDQyIDAuNTIyNzg0Cit2dCAwLjg2MzYzOSAwLjI1OTc2OQordnQgMC44NjU2NDYgMC4yNTk3NjkKK3Z0IDAuODY1NjQ2IDAuMjYwNDg5Cit2dCAwLjg2NTY0NiAwLjI1Nzc4NwordnQgMC44NjM2MzkgMC4yNTc3ODcKK3Z0IDAuMjM1MDU1IDAuNjEwMDY0Cit2dCAwLjIzNTA1NSAwLjYxMDQ0NAordnQgMC4yMzI5MTAgMC42Nzc3MTQKK3Z0IDAuMjMyOTEwIDAuNjc3MjYzCit2dCAwLjIzMzM2MCAwLjY3NzI2MwordnQgMC4yMzMzNjAgMC42Nzc3MTQKK3Z0IDAuMjM1MDU1IDAuNjc3MjY0Cit2dCAwLjIzNTA1NSAwLjY3NzcxNAordnQgMC4yMzY3NTAgMC42Nzc3MTUKK3Z0IDAuMjM2NzUwIDAuNjc3MjY0Cit2dCAwLjIzNzA3NyAwLjY3NzI2NAordnQgMC4yMzcwNzcgMC42Nzc3MTUKK3Z0IDAuMzQzMDIzIDAuOTgzNjk3Cit2dCAwLjM0MzI5MyAwLjk4MzUxMwordnQgMC4zNDMyOTMgMC45ODQwNDgKK3Z0IDAuODY1NzU4IDAuMTQ5MjkwCit2dCAwLjg2NTc1OCAwLjE0ODc1OAordnQgMC44NjYyMDEgMC4xNDkyNjQKK3Z0IDAuOTgwODM4IDAuOTIzMjk3Cit2dCAwLjk4MDU5MSAwLjkyMzAwNgordnQgMC45ODA4MzggMC45MjI1MDYKK3Z0IDAuODgxNTQ3IDAuOTc3MjE5Cit2dCAwLjg4MTE2OCAwLjk3Njc3MgordnQgMC44ODE1NDcgMC45NzY0MjgKK3Z0IDAuNTcwNzY5IDAuOTgxNTEyCit2dCAwLjU3MDQzNiAwLjk4MTIwOAordnQgMC41NzA3NjkgMC45ODA4MTkKK3Z0IDAuMDYzNTY1IDAuOTc5MDA4Cit2dCAwLjA2MzY2OCAwLjk3OTU2MQordnQgMC4wNjMxNDcgMC45Nzk1NjEKK3Z0IDAuOTc5MTU5IDAuNzg3NDQ4Cit2dCAwLjk3OTAwNSAwLjc4NzE1OQordnQgMC45NzkxNTkgMC43ODY1MDEKK3Z0IDAuOTAzNzE4IDAuOTc2Njc5Cit2dCAwLjkwMzQ2OCAwLjk3NjIwOQordnQgMC45MDM3MTggMC45NzU3MzMKK3Z0IDAuOTc0Mzk4IDAuMjE4OTMwCit2dCAwLjk3NDIxNSAwLjIxODUxOQordnQgMC45NzQzOTggMC4yMTc4NDMKK3Z0IDAuODY1NzU4IDAuMTUzOTc0Cit2dCAwLjg2NTc1OCAwLjE1MzI1NAordnQgMC44NjYyMDEgMC4xNTI5ODAKK3Z0IDAuOTM0NzI0IDAuNjQxMDA1Cit2dCAwLjkzNDM0MyAwLjY0MTAwNQordnQgMC45MzQzNjAgMC42NDA0NjcKK3Z0IDAuODU0MjYxIDAuMjIzMzkzCit2dCAwLjg1NDgwMiAwLjIyMzE3MAordnQgMC44NTQ4MDIgMC4yMjM3NTEKK3Z0IDAuOTc5NTczIDAuODM3NTE5Cit2dCAwLjk3OTI1NiAwLjgzNzE5OAordnQgMC45Nzk1NzMgMC44MzY3NTQKK3Z0IDAuODU5MzMwIDAuOTc3NTE0Cit2dCAwLjg1ODkzNiAwLjk3NzExNQordnQgMC44NTkzMzAgMC45NzY3NDkKK3Z0IDAuNjgyODg3IDAuOTgzMTM0Cit2dCAwLjY4MzI3MSAwLjk4Mjg5OQordnQgMC42ODMyNzEgMC45ODM0MjAKK3Z0IDAuMTQ3NTk5IDAuOTc3ODk1Cit2dCAwLjE0Nzg2OCAwLjk3NzIyNwordnQgMC4xNDgwNzggMC45Nzc4OTUKK3Z0IDAuOTU4NjUzIDAuODU5MzUzCit2dCAwLjk1ODIwOSAwLjg1OTM1MwordnQgMC45NTgyNjkgMC44NTc2NjAKK3Z0IDAuODYzMDQ1IDAuMjU2MTA5Cit2dCAwLjg2MzQ4OSAwLjI1NTgwNQordnQgMC44NjM0ODkgMC4yNTc3ODcKK3Z0IDAuOTU4NjA1IDAuNTg4NzIxCit2dCAwLjk1ODY1OCAwLjU5MDQxNQordnQgMC45NTgyMTUgMC41OTA0MTUKK3Z0IDAuODY1NzU4IDAuMTUxMjcyCit2dCAwLjg2NjIwMSAwLjE0OTU5MQordnQgMC4xMDI3NDQgMC42OTAwMzgKK3Z0IDAuMTA0NzUyIDAuNjkwMDM4Cit2dCAwLjY3NjM4OCAwLjYzOTc2NgordnQgMC42NzQzODAgMC42Mzk3NjYKK3Z0IDAuMjMyOTEwIDAuNjc2MDgzCit2dCAwLjIzMzM2MCAwLjY3NjA4MwordnQgMC4yMzMzNjAgMC42MTE1NTcKK3Z0IDAuMjMyOTEwIDAuNjExNTU3Cit2dCAwLjIzNTA1NSAwLjY3NjA4NAordnQgMC4yMzUwNTUgMC42MTE1NTgKK3Z0IDAuMjM2NzUwIDAuNjExNTU4Cit2dCAwLjIzNjc1MCAwLjY3NjA4NAordnQgMC4yMzcwNzcgMC42NzYwODUKK3Z0IDAuMjM3MDc3IDAuNjExNTU4Cit2dCAwLjc1MDA0NSAwLjk2NjkwMQordnQgMC43NDk1NzQgMC45NjY3MDAKK3Z0IDAuNzUwMDQ1IDAuOTY1NjkxCit2dCAwLjk2NzI4NSAwLjY1MTY5NQordnQgMC45Njc3OTcgMC42NTE2NzkKK3Z0IDAuOTY3Nzk3IDAuNjUyNzkyCit2dCAwLjExODk1NCAwLjk2NTE4NAordnQgMC4xMTg0NzggMC45NjQ5OTMKK3Z0IDAuMTE4OTU0IDAuOTYzOTEzCit2dCAwLjkxNTA0MCAwLjk2NTIyMwordnQgMC45MTQ1NjUgMC45NjUwMzMKK3Z0IDAuOTE1MDQwIDAuOTYzOTUzCit2dCAwLjg5Mjc2OCAwLjk2NDU4NAordnQgMC44OTIyODQgMC45NjQzNDgKK3Z0IDAuODkyNzY4IDAuOTYzMjcyCit2dCAwLjIyODU3NiAwLjk2NDc3MAordnQgMC4yMjgwOTMgMC45NjQ1MzQKK3Z0IDAuMjI4NTc2IDAuOTYzNDU4Cit2dCAwLjgzNjYxNiAwLjk2NTc4MAordnQgMC44MzYxMzggMC45NjU1MzQKK3Z0IDAuODM2NjE2IDAuOTY0NTI5Cit2dCAwLjg4MTY0NiAwLjk2NTgwMwordnQgMC44ODExNjggMC45NjU1NTcKK3Z0IDAuODgxNjQ2IDAuOTY0NTUxCit2dCAwLjczOTIwMSAwLjg2ODM4NQordnQgMC43MzcxOTMgMC44NjgzODUKK3Z0IDAuODYzNjAxIDAuMTUxMjcyCit2dCAwLjg2NTYwOSAwLjE1MTI3MgordnQgMC4xMDQ3NTIgMC42MjU0NjcKK3Z0IDAuMTAyNzQ0IDAuNjI1NDY3Cit2dCAwLjY3NjM4OCAwLjcwNDMzOQordnQgMC42NzQzODAgMC43MDQzMzkKK3Z0IDAuMTA0NzUyIDAuNjc5Mjc2Cit2dCAwLjEwMjc0NCAwLjY3OTI3NgordnQgMC4xMDI3NDQgMC42MzYyMjgKK3Z0IDAuMTA0NzUyIDAuNjM2MjI4Cit2dCAwLjIzMzM2MCAwLjY2NTMyOQordnQgMC4yMzI5MTAgMC42NjUzMjkKK3Z0IDAuMjMyOTEwIDAuNjIyMzExCit2dCAwLjIzMzM2MCAwLjYyMjMxMgordnQgMC4yMzUwNTUgMC42NjUzMzAKK3Z0IDAuMjM1MDU1IDAuNjIyMzEyCit2dCAwLjIzNjc1MCAwLjYyMjMxMwordnQgMC4yMzY3NTAgMC42NjUzMzAKK3Z0IDAuMjM3MDc3IDAuNjY1MzMwCit2dCAwLjIzNzA3NyAwLjYyMjMxMwordnQgMC4yNTkyMjggMC43MDI0MzUKK3Z0IDAuMjU5NzQwIDAuNzAyNDE4Cit2dCAwLjI1OTc0MCAwLjc0NTQzNQordnQgMC4xMDI1OTUgMC43MDI0MjMKK3Z0IDAuMTAzMTA3IDAuNzAyNDA2Cit2dCAwLjEwMzEwNyAwLjc0NTQyNAordnQgMC4yMDA0NjYgMC43NDM1NzQKK3Z0IDAuMTk5OTI5IDAuNzQzNTUxCit2dCAwLjIwMDQ2NiAwLjcwMDUzNwordnQgMC4xODkzMDIgMC43NDM1NzQKK3Z0IDAuMTg4NzY0IDAuNzQzNTUxCit2dCAwLjE4OTMwMiAwLjcwMDUzNwordnQgMC42NzQzODAgMC42NTA1MjgKK3Z0IDAuNjc2Mzg4IDAuNjUwNTI4Cit2dCAwLjY3NjM4OCAwLjY5MzU3NwordnQgMC42NzQzODAgMC42OTM1NzcKK3Z0IDAuMTAyNTk1IDAuNjc5Mjc2Cit2dCAwLjEwMjU5NSAwLjYzNjIyOAordnQgMC42NzY1MzggMC42NTA1MjgKK3Z0IDAuNjc2NTM4IDAuNjkzNTc2Cit2dCAwLjg0NzEzNCAwLjY2MjQyOAordnQgMC44NDY2MjIgMC42NjI0MjEKK3Z0IDAuODQ3MTM0IDAuNjUxNjc5Cit2dCAwLjg0NzQ3MCAwLjM5ODM1NgordnQgMC44NDY5NTggMC4zOTgzNDgKK3Z0IDAuODQ3NDcwIDAuMzg3NjA2Cit2dCAwLjg0NzA5NSAwLjQ0ODMwNwordnQgMC44NDY1NTggMC40NDgyNjQKK3Z0IDAuODQ3MDk1IDAuNDM3NTIzCit2dCAwLjg0NzA5NSAwLjQyMjg3NAordnQgMC44NDY1NTggMC40MjI4MzAKK3Z0IDAuODQ3MDk1IDAuNDEyMDg5Cit2dCAwLjg0NjU5OCAwLjM1NjMyNQordnQgMC44NDcxMTAgMC4zNTYzMDgKK3Z0IDAuODQ3MTEwIDAuMzY3MDYzCit2dCAwLjg0NzUyNyAwLjY4Nzg0OQordnQgMC44NDcwMTUgMC42ODc4NDkKK3Z0IDAuODQ3MzY1IDAuNjc3MTAwCit2dCAwLjg0NzAwOCAwLjUzMzU2OAordnQgMC44NDY0NzEgMC41MzM1MjUKK3Z0IDAuODQ3MDA4IDAuNTIyNzg0Cit2dCAwLjcxODkyNSAwLjg0NjM5MAordnQgMC43MTgzODkgMC44NDYzNDYKK3Z0IDAuNzE4OTI1IDAuODM1NjA1Cit2dCAwLjEwMjU5NSAwLjYyNTQ2NwordnQgMC42NzY1MzggMC43MDQzMzkKK3Z0IDAuODYzNDg5IDAuMjU5NzY5Cit2dCAwLjg2MzA0NSAwLjI1OTQ5OAordnQgMC45NTgwMjIgMC42MTU5OTEKK3Z0IDAuOTU3NTk2IDAuNjE0MzUxCit2dCAwLjk1ODAyMiAwLjYxNDIyNAordnQgMC45NTgwMzQgMC40ODM2NjIKK3Z0IDAuOTU3NjA5IDAuNDgzNTM4Cit2dCAwLjk1ODAzNCAwLjQ4MTg5NwordnQgMC44Mjk0NDQgMC4xNTQyNzkKK3Z0IDAuODI5Mjk0IDAuMTU0Mjc5Cit2dCAwLjgyOTI5NCAwLjE1MzY5MgordnQgMC4wMjA3NTEgMC43NDQ4NDcKK3Z0IDAuMDIwNzUxIDAuNzQ1NDM0Cit2dCAwLjAyMDc1MSAwLjcyOTg1OAordnQgMC4wMjA3NTEgMC43NDM3MzMKK3Z0IDAuMDIwNzUxIDAuNzE0NzYzCit2dCAwLjAyMDc1MSAwLjcxNDE3MwordnQgMC4xNzc3MzMgMC45ODQyMzUKK3Z0IDAuMTc3ODgzIDAuOTg0MjM1Cit2dCAwLjE3Nzg4MyAwLjk4NDc2NwordnQgMC44NjU0ODEgMC4xODYwNjMKK3Z0IDAuNzUyNjc0IDAuNTAyNjU5Cit2dCAwLjc1MjUyNCAwLjUwMjA3NQordnQgMC40MTQ1MjYgMC45ODQzNjMKK3Z0IDAuNDE0MzgxIDAuOTg0MzI2Cit2dCAwLjQxNDUyNiAwLjk4Mzc2MAordnQgMC43NTI2NzQgMC41MzMzMzIKK3Z0IDAuNzUyNjc0IDAuNTMyNzQzCit2dCAwLjg2NTYzMSAwLjE5MTI1NwordnQgMC42NDI3NTcgMC45ODM5MTUKK3Z0IDAuNjQyNjExIDAuOTgzODgzCit2dCAwLjY0Mjc1NyAwLjk4MzIwMQordnQgMC4wMjA3NTEgMC43MTU5MTYKK3Z0IDAuNzUyNjc0IDAuNTAzNzczCit2dCAwLjc1MjY3NCAwLjUxNzY0NwordnQgMC43NTI2NzQgMC41MzE1OTAKK3Z0IDAuODI5NjY5IDAuMTkxMTg4Cit2dCAwLjgyOTUyNCAwLjE5MTE1MQordnQgMC44Mjk2NjkgMC4xOTA1ODIKK3Z0IDAuMTAyNTk1IDAuNjI0MzUzCit2dCAwLjEwMjU5NSAwLjYyMzc2NgordnQgMC4xMDI1OTUgMC42OTEyMTgKK3Z0IDAuMTAyNTk1IDAuNjkxNzgxCit2dCAwLjAwNTMxNCAwLjk4NDE2OQordnQgMC4wMDU0NjMgMC45ODQxNjkKK3Z0IDAuMDA1NDYzIDAuOTg0NzAyCit2dCAwLjg2MzQ4OSAwLjI1NTI3MwordnQgMC42NzY1MzggMC42Mzg2NTIKK3Z0IDAuNjc2Mzg4IDAuNjM4MDY3Cit2dCAwLjY1NDczNiAwLjk4NDU0NgordnQgMC42NTQ1ODYgMC45ODQ1NDYKK3Z0IDAuNjU0NTg2IDAuOTgzOTYxCit2dCAwLjY3NjUzOCAwLjcwNjA4MAordnQgMC42NzY1MzggMC43MDU1MTkKK3Z0IDAuODYzNjM5IDAuMjYwNDg5Cit2dCAwLjk4Mzg3OCAwLjAwNjA0OAordnQgMC45ODM3MzEgMC4wMDYwMTcKK3Z0IDAuOTgzODc4IDAuMDA1MzEzCit2dCAwLjEwMjU5NSAwLjY5MDAzOAordnQgMC42NzY1MzggMC42Mzk3NjYKK3Z0IDAuNzM1MjkzIDAuMTU1NTc1Cit2dCAwLjczNTczOSAwLjE1NTU3NQordnQgMC43MzU3NDAgMC4xNzQ0ODgKK3Z0IDAuNzM1Mjk0IDAuMTc0NDg4Cit2dCAwLjc0OTQ4OCAwLjE1NTQ0MgordnQgMC43NTI1MzMgMC4xNTU0ODkKK3Z0IDAuNzUyNTMzIDAuMTc0NDE0Cit2dCAwLjc0OTQ4OCAwLjE3NDM3MwordnQgMC4yMTkyMzkgMC4yNjc2OTMKK3Z0IDAuMjE5MjM5IDAuMjg2NjI2Cit2dCAwLjIxNDcyOSAwLjI4NjYxNAordnQgMC4yMTQ3MjkgMC4yNjc2NzEKK3Z0IDAuNzMxNTcyIDAuMTU1NTczCit2dCAwLjczMTc0NiAwLjE1NTU3NAordnQgMC43MzE3NDcgMC4xNzQ0ODcKK3Z0IDAuNzMxNTczIDAuMTc0NDg3Cit2dCAwLjAxNDg0NCAwLjI4NjYwOAordnQgMC4wMTE0NjMgMC4yODY2MTQKK3Z0IDAuMDExNDYzIDAuMjY3NjcxCit2dCAwLjAxNDg0NCAwLjI2NzY1NwordnQgMC4yMTAyNDIgMC4yODY2MDgKK3Z0IDAuMjA2NDQ2IDAuMjg2NjA4Cit2dCAwLjIwNjQ0NiAwLjI2NzY1NwordnQgMC4yMTAyNDIgMC4yNjc2NTcKK3Z0IDAuMTgxNzY1IDAuMjg2NjA4Cit2dCAwLjE3MzcyMSAwLjI4NjYwOAordnQgMC4xNzM3MjEgMC4yNjc2NTcKK3Z0IDAuMTgxNzY1IDAuMjY3NjU3Cit2dCAwLjc1Mjk3OSAwLjE3NDQxNAordnQgMC43NTI5NzkgMC4xNTU0ODkKK3Z0IDAuNzM4ODUwIDAuMTU1NDYwCit2dCAwLjczODg1MSAwLjE3NDM4MAordnQgMC4wMDgzNTMgMC4yNjc2OTMKK3Z0IDAuMDA4MzUzIDAuMjg2NjI2Cit2dCAwLjc1NjcwMCAwLjE3NDQxNQordnQgMC43NTY1MjUgMC4xNzQ0MTUKK3Z0IDAuNzU2NTI1IDAuMTU1NDkwCit2dCAwLjc1NjcwMCAwLjE1NTQ5MAordnQgMC4wMTg2NDAgMC4yNjc2NTcKK3Z0IDAuMDE4NjQwIDAuMjg2NjA4Cit2dCAwLjAyNzkyNiAwLjI2NzY1NwordnQgMC4wMjc5MjYgMC4yODY2MDgKK3Z0IDAuMDMzNjIyIDAuMjY3NjU3Cit2dCAwLjAzMzYyMiAwLjI4NjYwOAordnQgMC4wNDY5NDggMC4yNjc2NTcKK3Z0IDAuMDQ2OTQ4IDAuMjg2NjA4Cit2dCAwLjA1Mzg0NSAwLjI2NzY1NwordnQgMC4wNTM4NDUgMC4yODY2MDgKK3Z0IDAuMTkzOTc0IDAuMjY3NjU3Cit2dCAwLjE5Mzk3NCAwLjI4NjYwOAordnQgMC4xOTk2NjkgMC4yNjc2NTcKK3Z0IDAuMTk5NjY5IDAuMjg2NjA4Cit2dCAwLjEwOTU5NyAwLjIyNjU5MQordnQgMC4xMTAyNDMgMC4yMjYxNTYKK3Z0IDAuMTEwMTc2IDAuMjI4MjM5Cit2dCAwLjEwOTU1MSAwLjIyODAxNAordnQgMC4xMDk1MDQgMC4yMjk0MzgKK3Z0IDAuMTEwMTA5IDAuMjMwMzIxCit2dCAwLjEwOTIwMyAwLjIzMDAwMgordnQgMC4xMDg3NzIgMC4yMjkxODAKK3Z0IDAuMTAyMDI0IDAuMjIzNzc1Cit2dCAwLjEwNTMxNiAwLjIyNzk2MgordnQgMC4xMDQ5MzMgMC4yMjg0OTgKK3Z0IDAuMTAxNDMwIDAuMjI0MDQ0Cit2dCAwLjEwMDc0OCAwLjIxNjg3NwordnQgMC4xMDAxMDIgMC4yMTY4NTgKK3Z0IDAuMTAyMzkxIDAuMjEwMTU5Cit2dCAwLjEwMTgyNiAwLjIwOTgxMQordnQgMC4xMDYwODQgMC4yMDcwMDUKK3Z0IDAuMTA1ODgyIDAuMjA2MzQ1Cit2dCAwLjExMDI5OSAwLjIwNzQ5MQordnQgMC4xMTA1OTIgMC4yMDY4ODgKK3Z0IDAuMTEyOTkxIDAuMjEwMjAzCit2dCAwLjExMzUzNyAwLjIwOTg1NgordnQgMC4xMTQyODYgMC4yMTM3NTAKK3Z0IDAuMTE0OTAyIDAuMjEzNTkzCit2dCAwLjExNDg3NyAwLjIxNzYyOQordnQgMC4xMTU1MDMgMC4yMTc1MzUKK3Z0IDAuMTE1MzcyIDAuMjIwOTg3Cit2dCAwLjExNTk5MCAwLjIyMDgzOQordnQgMC4xMTYzMjEgMC4yMjM4MzIKK3Z0IDAuMTE2ODc3IDAuMjIzNTAxCit2dCAwLjExODE5MCAwLjIyNTgyOQordnQgMC4xMTg0ODAgMC4yMjUyMTMKK3Z0IDAuMTIwNjAwIDAuMjI1OTc4Cit2dCAwLjEyMDM1MiAwLjIyNTMyOQordnQgMC4xMjI4NTUgMC4yMjM2OTkKK3Z0IDAuMTIyMjczIDAuMjIzMzg3Cit2dCAwLjEyMzg5OCAwLjIxODY2MwordnQgMC4xMjMyNTIgMC4yMTg2NjEKK3Z0IDAuMTIyOTM0IDAuMjEzODI2Cit2dCAwLjEyMjM0MiAwLjIxNDA5MgordnQgMC4xMjA0NTkgMC4yMTA1NTIKK3Z0IDAuMTIwMDY2IDAuMjExMDgyCit2dCAwLjExNzkwMyAwLjIwOTYxNQordnQgMC4xMTcyOTcgMC4yMTAwNjcKK3Z0IDAuMTE3MzYxIDAuMjA5NDE3Cit2dCAwLjExNjcxMCAwLjIwOTg1MQordnQgMC4xMTY3OTggMC4yMDc3NzEKK3Z0IDAuMTE3NDIxIDAuMjA3OTk0Cit2dCAwLjExNzQ4MSAwLjIwNjU3MQordnQgMC4xMTY4ODUgMC4yMDU2OTEKK3Z0IDAuMTE3ODE4IDAuMjA2MDE5Cit2dCAwLjExODI0NCAwLjIwNjg0MAordnQgMC4xMjUzMzIgMC4yMTIzOTIKK3Z0IDAuMTIxODM5IDAuMjA4MTA3Cit2dCAwLjEyMjIxNiAwLjIwNzU3MAordnQgMC4xMjU5MTggMC4yMTIxMTAKK3Z0IDAuMTI2NzA0IDAuMjE4NzAyCit2dCAwLjEyNzM1MyAwLjIxODcxMgordnQgMC4xMjUwMDQgMC4yMjU1NzkKK3Z0IDAuMTI1NTY5IDAuMjI1OTMwCit2dCAwLjEyMTE3NiAwLjIyODgxNgordnQgMC4xMjEzNzUgMC4yMjk0NzYKK3Z0IDAuMTE2NzkwIDAuMjI4Mjk4Cit2dCAwLjExNjQ5NyAwLjIyODkwMAordnQgMC4xMTQwMjEgMC4yMjU1MTkKK3Z0IDAuMTEzNDc1IDAuMjI1ODY3Cit2dCAwLjExMjY5MiAwLjIyMTkwNQordnQgMC4xMTIwNzcgMC4yMjIwNjMKK3Z0IDAuMTEyMDkyIDAuMjE3OTc2Cit2dCAwLjExMTQ2NyAwLjIxODA3MAordnQgMC4xMTE2MDcgMC4yMTQ2NjgKK3Z0IDAuMTEwOTg5IDAuMjE0ODE0Cit2dCAwLjExMDY5MiAwLjIxMTg4OQordnQgMC4xMTAxMzUgMC4yMTIyMTgKK3Z0IDAuMTA4ODk5IDAuMjA5OTYwCit2dCAwLjEwODYxMCAwLjIxMDU3NwordnQgMC4xMDY2NTggMC4yMDk4NDAKK3Z0IDAuMTA2OTEzIDAuMjEwNDg3Cit2dCAwLjEwNDU0MCAwLjIxMjAzNwordnQgMC4xMDUxMjMgMC4yMTIzNDMKK3Z0IDAuMTAzNTU0IDAuMjE2OTE2Cit2dCAwLjEwNDE5NyAwLjIxNjkyOQordnQgMC4xMDQ0MTUgMC4yMjIzMzkKK3Z0IDAuMTA1MDE2IDAuMjIyMDkzCit2dCAwLjEwNjY3NiAwLjIyNTUxMgordnQgMC4xMDcwNzggMC4yMjQ5ODYKK3Z0IDAuMTA5MDg1IDAuMjI2NDAyCit2dCAwLjEwOTY4OSAwLjIyNTk1MQordnQgMC4xMDU0MTYgMC4yMzczNjAKK3Z0IDAuMTA1MDM5IDAuMjM2NzI3Cit2dCAwLjEwNzI5NyAwLjIzNjcyNwordnQgMC4xMDY5MjggMC4yMzczNjAKK3Z0IDAuMTA4NDQwIDAuMjM3MzYwCit2dCAwLjEwOTU1NiAwLjIzNjcyNwordnQgMC4xMDg5OTMgMC4yMzc2ODUKK3Z0IDAuMTA3OTMyIDAuMjM4MjI2Cit2dCAwLjEwNDE5NiAwLjI0ODc0NAordnQgMC4xMDQ3NDQgMC4yNDM2NjAKK3Z0IDAuMTA1MzU4IDAuMjQzODYzCit2dCAwLjEwNDg0NCAwLjI0ODYzNQordnQgMC4xMDU4NDQgMC4yNTIyMTUKK3Z0IDAuMTA2MzIyIDAuMjUxNzQ4Cit2dCAwLjEwODczNyAwLjI1MzY3MQordnQgMC4xMDg4ODcgMC4yNTMwMzgKK3Z0IDAuMTEwOTA0IDAuMjUzNjYyCit2dCAwLjExMDkwNCAwLjI1MzAyOQordnQgMC4xMjU3MDggMC4yNTM2NDMKK3Z0IDAuMTI2MzE2IDAuMjUzMDEwCit2dCAwLjEyNjMxNiAwLjI1NTIyOAordnQgMC4xMjU3MDggMC4yNTUyMjgKK3Z0IDAuMTI1NzA4IDAuMjU2ODEzCit2dCAwLjEyNjMxNiAwLjI1NzQ0NgordnQgMC4xMjUwNDYgMC4yNTc0NDUKK3Z0IDAuMTI0NTgxIDAuMjU2ODEyCit2dCAwLjEwMzQwMyAwLjI1NDg0NQordnQgMC4xMDcxNzYgMC4yNTY3ODgKK3Z0IDAuMTA3MDIyIDAuMjU3NDIwCit2dCAwLjEwMjkyNCAwLjI1NTMxMAordnQgMC4xMDEyMzQgMC4yNTAzMDIKK3Z0IDAuMTAwNTkzIDAuMjUwNDI3Cit2dCAwLjEwMTU5NiAwLjI0NDE0NQordnQgMC4xMDA5NzMgMC4yNDM5NjIKK3Z0IDAuMTA1MDk4IDAuMjM3OTI0Cit2dCAwLjEwNDY5NCAwLjIzNzM0MAordnQgMC4xMDE2MTEgMC4yMzI5MjMKK3Z0IDAuMTAwOTc5IDAuMjMyMjkxCit2dCAwLjEwMjA1MyAwLjIzMjI5MQordnQgMC4xMDI1MTggMC4yMzI5MjMKK3Z0IDAuMTI1NjUzIDAuMjMyOTIzCit2dCAwLjEyNjMxMSAwLjIzMjI5MQordnQgMC4xMjYzMTEgMC4yMzQ1MDkKK3Z0IDAuMTI1NjUzIDAuMjM0NTA5Cit2dCAwLjEyNTY1MyAwLjIzNjA5NAordnQgMC4xMjYzMTEgMC4yMzY3MjYKK3Z0IDAuMTI1MTUxIDAuMjM2NzI2Cit2dCAwLjEyNDc4MCAwLjIzNjA5NAordnQgMC4xMDE2MTEgMC4yMzYwOTQKK3Z0IDAuMTAwOTc5IDAuMjM2NzI2Cit2dCAwLjEwMDk3OSAwLjIzNDUwOQordnQgMC4xMDE2MTEgMC4yMzQ1MDkKK3Z0IDAuMTEyNTcyIDAuMjc1NTczCit2dCAwLjExMzE2NSAwLjI3NTg4OQordnQgMC4xMTI0NDggMC4yNzY1NDAKK3Z0IDAuMTExOTQ1IDAuMjc2MTQzCit2dCAwLjEwMTYxMCAwLjI4NTUzMAordnQgMC4xMDA5NzggMC4yODY5NTkKK3Z0IDAuMTAwOTc4IDAuMjgzODc4Cit2dCAwLjEwMTYxMCAwLjI4MzMwMwordnQgMC4xMDE2MTAgMC4yODEwNzcKK3Z0IDAuMTAwOTc4IDAuMjgwNzk3Cit2dCAwLjEwMTgyNSAwLjI4MDAyOAordnQgMC4xMDI0MjMgMC4yODAzMzkKK3Z0IDAuMTEyOTQ3IDAuMjczMDE5Cit2dCAwLjExMDE2NyAwLjI3MzMwNQordnQgMC4xMDk4OTYgMC4yNzI2OTcKK3Z0IDAuMTEzNjEwIDAuMjcyMzgzCit2dCAwLjEwMTkwMCAwLjI2MTIwMwordnQgMC4xMDE5MDAgMC4yNjM1MDMKK3Z0IDAuMTAxMjY4IDAuMjYzNzc0Cit2dCAwLjEwMTI2OCAwLjI2MDYwMQordnQgMC4xMDE5MDAgMC4yNTg5MDQKK3Z0IDAuMTAxMjY4IDAuMjU3NDI4Cit2dCAwLjEwMjQwMSAwLjI1ODUwNwordnQgMC4xMDI4NzAgMC4yNTk4MjkKK3Z0IDAuMTEyOTY5IDAuMjcxNjE5Cit2dCAwLjExMjY2OCAwLjI2OTE2NgordnQgMC4xMTMyNjggMC4yNjg4NjQKK3Z0IDAuMTEzNjExIDAuMjcyMjMyCit2dCAwLjExMDE5OCAwLjI3MTQxMQordnQgMC4xMDk5MjUgMC4yNzIwMjQKK3Z0IDAuMTA5Mjk5IDAuMjcxNDI3Cit2dCAwLjEwOTUwNyAwLjI3MDc1MgordnQgMC4xMTQ2OTUgMC4yNjkxOTIKK3Z0IDAuMTE0MDk0IDAuMjY4ODg0Cit2dCAwLjExNDc0NiAwLjI2ODI5MAordnQgMC4xMTUzMDQgMC4yNjg2MzcKK3Z0IDAuMTI1NTQ4IDAuMjU5MzA4Cit2dCAwLjEyNjE4MCAwLjI1Nzg3NgordnQgMC4xMjYxODAgMC4yNjA5NTgKK3Z0IDAuMTI1NTQ4IDAuMjYxNTM0Cit2dCAwLjEyNTU0OCAwLjI2Mzc2MQordnQgMC4xMjYxODAgMC4yNjQwNDAKK3Z0IDAuMTI1NjkzIDAuMjY0NDg0Cit2dCAwLjEyNTA3OSAwLjI2NDE4OAordnQgMC4xMTQ0MDcgMC4yNzE2MzEKK3Z0IDAuMTE3MDkwIDAuMjcxNDcwCit2dCAwLjExNzM1MSAwLjI3MjA4NwordnQgMC4xMTM3NjkgMC4yNzIyMzIKK3Z0IDAuMTI1NjA4IDAuMjgzNTUxCit2dCAwLjEyNTYwOCAwLjI4MTI1MgordnQgMC4xMjYyNDAgMC4yODA5NzUKK3Z0IDAuMTI2MjQwIDAuMjg0MTM5Cit2dCAwLjEyNTYwOCAwLjI4NTg1MAordnQgMC4xMjYyNDAgMC4yODczMDMKK3Z0IDAuMTI1MTA3IDAuMjg2MjQ4Cit2dCAwLjEyNDU3NCAwLjI4NDg4OAordnQgMC4xMTQzODQgMC4yNzMwMjgKK3Z0IDAuMTE0NTk2IDAuMjc1NjAyCit2dCAwLjExMzk4NiAwLjI3NTg5OAordnQgMC4xMTM3NjYgMC4yNzIzODYKK3Z0IDAuMTE3MDU4IDAuMjczMzUwCit2dCAwLjExNzMzNyAwLjI3Mjc0NgordnQgMC4xMTgwODYgMC4yNzM0MzkKK3Z0IDAuMTE3NzA0IDAuMjczOTQ3Cit2dCAwLjEwNTI4NyAwLjI4Njg5NwordnQgMC4xMDMyMTYgMC4yODkyMTAKK3Z0IDAuMTAyNjcxIDAuMjg4ODcxCit2dCAwLjEwNTE2MSAwLjI4NjA4OQordnQgMC4xMDU4ODggMC4yODYyMjUKK3Z0IDAuMTA1ODg0IDAuMjg1MjgxCit2dCAwLjEwNzIxNSAwLjI4Njc0NQordnQgMC4xMDY4MDAgMC4yODcyMjgKK3Z0IDAuMTA3NzEzIDAuMjg4MjMxCit2dCAwLjEwODU0NyAwLjI4ODIwOAordnQgMC4xMDgwMDAgMC4yODg4ODEKK3Z0IDAuMTA3MjI4IDAuMjg4ODI4Cit2dCAwLjEwNDMxMSAwLjI5NDM4MwordnQgMC4xMDU1NTggMC4yOTA4ODUKK3Z0IDAuMTA2MTE3IDAuMjkxMTk5Cit2dCAwLjEwNDkzMCAwLjI5NDUyOQordnQgMC4xMDM5NjEgMC4yOTkzNjgKK3Z0IDAuMTA0NTY0IDAuMjk5MTE0Cit2dCAwLjEwNjkzOCAwLjMwNDE1MgordnQgMC4xMDY1MDQgMC4zMDQ1OTgKK3Z0IDAuMTE3MDUwIDAuMzA3NTcyCit2dCAwLjExNjc1NyAwLjMwNjkwNgordnQgMC4xMjExNjEgMC4zMDM1NjUKK3Z0IDAuMTIxNjU0IDAuMzAzOTk1Cit2dCAwLjEyMzY5NCAwLjI5ODUxNAordnQgMC4xMjMwNDMgMC4yOTg0NDgKK3Z0IDAuMTIyNTk2IDAuMjkzNDkzCit2dCAwLjEyMjAyMiAwLjI5Mzc5OAordnQgMC4xMTk4MjIgMC4yOTAzNDkKK3Z0IDAuMTE5NDY2IDAuMjkwOTAxCit2dCAwLjExNzU2NiAwLjI5MDMxNQordnQgMC4xMTcyMzAgMC4yODk1NTAKK3Z0IDAuMTE2MTE5IDAuMjkwMzE2Cit2dCAwLjExNjExOSAwLjI4OTIwNwordnQgMC4xMTY3NTIgMC4yOTAwNjQKK3Z0IDAuMTE2NzUyIDAuMjkxMDcwCit2dCAwLjExMzE0OCAwLjMwNjI3MQordnQgMC4xMTYxMTkgMC4zMDYyNzMKK3Z0IDAuMTEyNTE4IDAuMzA2OTAxCit2dCAwLjExMjUxOCAwLjMwNTg4NwordnQgMC4xMTMxNDggMC4zMDUzMzIKK3Z0IDAuMTEzMTQ4IDAuMjg2MTIzCit2dCAwLjExMjUxNiAwLjI4NTQ5MQordnQgMC4xMTQwNzQgMC4yODU0OTIKK3Z0IDAuMTE0MzQ0IDAuMjg2MTI1Cit2dCAwLjExNjEyMyAwLjI4NjEyNgordnQgMC4xMTYyMTQgMC4yODU0OTQKK3Z0IDAuMTIwOTU5IDAuMjg2ODg4Cit2dCAwLjEyMDY0NSAwLjI4NzQ1NQordnQgMC4xMjUxNzIgMC4yOTE0NzAKK3Z0IDAuMTI1NzM5IDAuMjkxMTI4Cit2dCAwLjEyNjY4MyAwLjI5ODgwNgordnQgMC4xMjczMzIgMC4yOTg4NzcKK3Z0IDAuMTIzOTA2IDAuMzA1OTgxCit2dCAwLjEyNDM5OCAwLjMwNjQxMgordnQgMC4xMTg3MTUgMC4zMTA1NjIKK3Z0IDAuMTE4MzU4IDAuMzEwMDA3Cit2dCAwLjExMTQ0MyAwLjMxMDQxNAordnQgMC4xMTEwNTUgMC4zMTA5MzkKK3Z0IDAuMTA0MDc1IDAuMzA3MDkxCit2dCAwLjEwNDUwOSAwLjMwNjY0NQordnQgMC4xMDE1MDggMC4yOTM0NjgKK3Z0IDAuMTAxMTk5IDAuMzAwNTQ1Cit2dCAwLjEwMDU5NSAwLjMwMDgwMAordnQgMC4xMDA4OTIgMC4yOTMzMDQKK3Z0IDAuMTAxNjExIDAuMzM4NjUwCit2dCAwLjEwMDk3OSAwLjMzOTI4MgordnQgMC4xMDA5NzkgMC4zMzcwNjUKK3Z0IDAuMTAxNjExIDAuMzM3MDY1Cit2dCAwLjEwMTYxMSAwLjMzNTQ4MAordnQgMC4xMDA5NzkgMC4zMzQ4NDcKK3Z0IDAuMTAyMDM5IDAuMzM0ODQ4Cit2dCAwLjEwMjQ3NSAwLjMzNTQ4MAordnQgMC4xMjU2NTMgMC4zMzU0ODAKK3Z0IDAuMTI2Mjg2IDAuMzM0ODQ3Cit2dCAwLjEyNjI4NiAwLjMzNzA2NQordnQgMC4xMjU2NTMgMC4zMzcwNjUKK3Z0IDAuMTI1NjUzIDAuMzM4NjUwCit2dCAwLjEyNjI4NiAwLjMzOTI4MgordnQgMC4xMjUxNDcgMC4zMzkyODIKK3Z0IDAuMTI0NjY4IDAuMzM4NjUwCit2dCAwLjEyMTkwMyAwLjMzNDIxNgordnQgMC4xMjIyNzMgMC4zMzQ4NDgKK3Z0IDAuMTIwMDI0IDAuMzM0ODQ4Cit2dCAwLjEyMDM5MSAwLjMzNDIxNgordnQgMC4xMTg4NzkgMC4zMzQyMTYKK3Z0IDAuMTE3Nzc0IDAuMzM0ODQ4Cit2dCAwLjExODQ3MSAwLjMzMzY2MgordnQgMC4xMTkzMzEgMC4zMzM0NDcKK3Z0IDAuMTIzMTIzIDAuMzIyODMyCit2dCAwLjEyMjU3NSAwLjMyNzkxNwordnQgMC4xMjE5NjEgMC4zMjc3MTQKK3Z0IDAuMTIyNDc1IDAuMzIyOTQyCit2dCAwLjEyMTQ3NSAwLjMxOTM2MQordnQgMC4xMjA5OTcgMC4zMTk4MjkKK3Z0IDAuMTE4NTgyIDAuMzE3OTA2Cit2dCAwLjExODQzMiAwLjMxODUzOAordnQgMC4xMTYwMzQgMC4zMTc5MTkKK3Z0IDAuMTE2MDM0IDAuMzE4NTUyCit2dCAwLjEwMTYxMSAwLjMxNzkzNAordnQgMC4xMDA5NzkgMC4zMTg1NjcKK3Z0IDAuMTAwOTc5IDAuMzE2Mzg3Cit2dCAwLjEwMTYxMSAwLjMxNjM4NwordnQgMC4xMDE2MTEgMC4zMTQ3NjMKK3Z0IDAuMTAwOTc5IDAuMzE0MTMwCit2dCAwLjEwMjAzNCAwLjMxNDEzMQordnQgMC4xMDI0NTggMC4zMTQ3NjQKK3Z0IDAuMTIzOTE2IDAuMzE2NzMyCit2dCAwLjEyMDE0NCAwLjMxNDc4OAordnQgMC4xMjAyOTcgMC4zMTQxNTcKK3Z0IDAuMTI0Mzk1IDAuMzE2MjY3Cit2dCAwLjEyNjA4NSAwLjMyMTI3NQordnQgMC4xMjY3MjYgMC4zMjExNDkKK3Z0IDAuMTI1NzIzIDAuMzI3NDMyCit2dCAwLjEyNjM0NiAwLjMyNzYxNQordnQgMC4xMjI3MjEgMC4zMzQwNTQKK3Z0IDAuMTIyMjI0IDAuMzMzNjQ2Cit2dCAwLjExMjIzNCAwLjMwNzU1MAordnQgMC4xMTc3NzMgMC4zMzU0ODAKK3Z0IDAuMTIwMDIzIDAuMzM1NDgwCit2dCAwLjEyNDY2OCAwLjMzNTQ4MAordnQgMC4xMjIyNzMgMC4zMzU0ODAKK3Z0IDAuMTI1MTQ3IDAuMzM0ODQ4Cit2dCAwLjExMzc1NiAwLjIzMjkyMwordnQgMC4xMDk1NjggMC4yMzI5MjMKK3Z0IDAuMTA5NTY4IDAuMjMyMjkxCit2dCAwLjExMzc1NiAwLjIzMjI5MQordnQgMC4xMDczMDEgMC4yMzYwOTQKK3Z0IDAuMTA5NTY4IDAuMjM2MDk0Cit2dCAwLjEwNTAzMyAwLjIzMjkyMwordnQgMC4xMDUwMzIgMC4yMzIyOTEKK3Z0IDAuMTA3MzAwIDAuMjMyMjkxCit2dCAwLjEwNzMwMSAwLjIzMjkyMwordnQgMC4xMDI1MTggMC4yMzYwOTQKK3Z0IDAuMTA1MDMzIDAuMjM2MDk0Cit2dCAwLjEwMjA1NSAwLjIzNjcyNgordnQgMC4xMDI0NTggMC4zMTc5MzMKK3Z0IDAuMTAyMDM5IDAuMzE4NTY2Cit2dCAwLjExNjAzNCAwLjMxNDc3NwordnQgMC4xMTYwMzQgMC4zMTQxNDQKK3Z0IDAuMTE3ODA2IDAuMjUzNjUzCit2dCAwLjExNzgwNiAwLjI1MzAyMAordnQgMC4xMTA5MDQgMC4yNTY3OTgKK3Z0IDAuMTEwOTA0IDAuMjU3NDMxCit2dCAwLjExMzc5OCAwLjMzOTI4MgordnQgMC4xMTM3OTggMC4zMzg2NTAKK3Z0IDAuMTE2MDM1IDAuMzM0ODQ4Cit2dCAwLjExNjAzNSAwLjMzNTQ4MAordnQgMC4xMDI0NzUgMC4zMzg2NTAKK3Z0IDAuMTAyMDQ0IDAuMzM5MjgyCit2dCAwLjEzMTEzNCAwLjMzMDM5MQordnQgMC4xMTYwMzUgMC4zMjgzNTQKK3Z0IDAuMTAyMDM5IDAuMzMzMzI3Cit2dCAwLjEwMjAzOSAwLjMyMTEzMwordnQgMC4xMTYwMzQgMC4zMjM1MTAKK3Z0IDAuMDk2MzEwIDAuMzMzMzI4Cit2dCAwLjA5NjMxMCAwLjMyMTEzMwordnQgMC4xMTYwMzQgMC4zMjExMzMKK3Z0IDAuMTE2MDM1IDAuMzMzMzI0Cit2dCAwLjExNjc1NyAwLjMwNTg5MQordnQgMC4xMTYxMTkgMC4zMDUzMzQKK3Z0IDAuMTE2MTE5IDAuMjk4NDQ5Cit2dCAwLjExNjc1NCAwLjI5ODQ0OQordnQgMC4xMTMxNDggMC4yOTg0NDgKK3Z0IDAuMTEyNTE3IDAuMjk4NDQ4Cit2dCAwLjExMjUxNyAwLjI5NDg3MgordnQgMC4xMTMxNDggMC4yOTQ4NzIKK3Z0IDAuMTE2NzUzIDAuMjk0ODczCit2dCAwLjExMzE0OCAwLjI4NzE2NwordnQgMC4xMTI1MTYgMC4yODY2NzYKK3Z0IDAuMTEzMTE4IDAuMjc2NTgwCit2dCAwLjExNjExOSAwLjI5MjMyMQordnQgMC4xMTY3NTIgMC4yOTI0MzYKK3Z0IDAuMTEzMTQ4IDAuMjg4ODk1Cit2dCAwLjExMjUxNiAwLjI4ODg5NQordnQgMC4xMTI1MTcgMC4yOTIxMDQKK3Z0IDAuMTEzMTQ4IDAuMjkyMTA0Cit2dCAwLjExNjExOSAwLjI5NDg3MwordnQgMC4xMDI2NTIgMC4yODQ1ODQKK3Z0IDAuMTAyMTM2IDAuMjg1OTA3Cit2dCAwLjEwNTUyOSAwLjI3NjY2MwordnQgMC4xMDU1MzEgMC4yNzc1MTYKK3Z0IDAuMTE1MzMyIDAuMjc2Mjg3Cit2dCAwLjExNDgyNyAwLjI3NjY4MAordnQgMC4xMjQ5MjQgMC4yODA2MTkKK3Z0IDAuMTI1NTI4IDAuMjgwMzE3Cit2dCAwLjEzMTEzNCAwLjI5MTAwMwordnQgMC4xMzExMzQgMC4yODU5ODkKK3Z0IDAuMTIwMzE1IDAuMjc2MzU5Cit2dCAwLjEyMDMxNyAwLjI3NTUwMAordnQgMC4xMDU1MzcgMC4yODE5NjMKK3Z0IDAuMTA1NTM3IDAuMjgyODE4Cit2dCAwLjEwOTU5OSAwLjI3MzgyMQordnQgMC4xMDkyMjEgMC4yNzMzMTAKK3Z0IDAuMDk2MzEwIDAuMjkzMzA3Cit2dCAwLjExNDAxNSAwLjI3NjYzMwordnQgMC4xMjA2OTEgMC4yNjM3MzIKK3Z0IDAuMTIwNjkyIDAuMjYyODc1Cit2dCAwLjExNzczNiAwLjI3MDg4MQordnQgMC4xMTgwNTggMC4yNzE0NDMKK3Z0IDAuMTExOTU1IDAuMjY4NDg2Cit2dCAwLjExMjY3OCAwLjI2ODMwMgordnQgMC4xMDYyMjIgMC4yNjg0OTUKK3Z0IDAuMTA2MjIzIDAuMjY3NjIxCit2dCAwLjA5NjMxMCAwLjMwMzE3OQordnQgMC4xMzExMzQgMC4zMTA4NDQKK3Z0IDAuMTEzNzU5IDAuMjI4NTc2Cit2dCAwLjA5NjMxMCAwLjIzOTk4MQordnQgMC4xMTc4MDYgMC4yMzY3MjcKK3Z0IDAuMTE3ODA2IDAuMjM2MDk0Cit2dCAwLjEyNDc4MCAwLjIzMjkyMwordnQgMC4xMjUyNDUgMC4yMzIyOTEKK3Z0IDAuMTE3ODA2IDAuMjMyOTIzCit2dCAwLjExNzgwNiAwLjIzMjI5MQordnQgMC4xMTM3NTYgMC4yMzYwOTQKK3Z0IDAuMTEzNzU2IDAuMjM2NzI3Cit2dCAwLjExNzgwNiAwLjI1NzQzOAordnQgMC4xMTc4MDYgMC4yNTY4MDUKK3Z0IDAuMTI0NTgxIDAuMjUzNjQ0Cit2dCAwLjEyNTEzNyAwLjI1MzAxMQordnQgMC4xMTc4MDYgMC4yNTEzNTYKK3Z0IDAuMTI1MTM5IDAuMjUxMzQ5Cit2dCAwLjExNzgwNiAwLjI0NjE3MQordnQgMC4xMjUxNDMgMC4yNDYxNjcKK3Z0IDAuMTE3ODA2IDAuMjM3NzkzCit2dCAwLjExMzc1NiAwLjIzNzc5NQordnQgMC4xMTA5MDQgMC4yNDM5MDEKK3Z0IDAuMTMxMTM0IDAuMjM3NzkwCit2dCAwLjEyNTE1MCAwLjIzNzc5MQordnQgMC4xMzExMzQgMC4yNDYxNjYKK3Z0IDAuMTMxMTM0IDAuMjUxMzQ4Cit2dCAwLjExMDkwNCAwLjI1MTM2NAordnQgMC4xMTA5MDQgMC4yNDg0NTEKK3Z0IDAuMTMxMTM0IDAuMjI1OTIyCit2dCAwLjEyMDY5MyAwLjI2OTA0MQordnQgMC4xMjA2OTIgMC4yNjgxODcKK3Z0IDAuMTI0OTMzIDAuMjU5ODY3Cit2dCAwLjEyNTQ5NCAwLjI1ODUwMQordnQgMC4xMDYyMjIgMC4yNjIxNDkKK3Z0IDAuMTA2MjIyIDAuMjYzMDIzCit2dCAwLjEwMjU3NyAwLjI2NDE0NwordnQgMC4xMDE5OTUgMC4yNjQ0NjcKK3Z0IDAuMDk2MzEwIDAuMjcxNTQyCit2dCAwLjEwMTkxOCAwLjI3MTU0MgordnQgMC4xMDE5MDIgMC4yNzMwODMKK3Z0IDAuMTA1ODE0IDAuMjczMDkxCit2dCAwLjEwNTk0NSAwLjI3MTU0OQordnQgMC4xMzExMzQgMC4yNzY4NzAKK3Z0IDAuMTI1NjEwIDAuMjcyNDY5Cit2dCAwLjEyMDQ5NiAwLjI3MjQ2OQordnQgMC4xMzExMzQgMC4xOTk0NzUKK3Z0IDAuMTMxMTM0IDAuMjEyMTA5Cit2dCAwLjEzMTEzNCAwLjIxODcyNwordnQgMC4xMzExMzQgMC4yNTUyMjgKK3Z0IDAuMTMxMTM0IDAuMjM0NTA5Cit2dCAwLjEzMTEzNCAwLjI1NzQ0NgordnQgMC4xMzExMzQgMC4yOTg4NzcKK3Z0IDAuMTMxMTM0IDAuMzM3MDY1Cit2dCAwLjEzMTEzNCAwLjMyMDIyNAordnQgMC4xMzExMzQgMC4zNDM4OTQKK3Z0IDAuMDk2MzEwIDAuMjI4MjQ0Cit2dCAwLjA5NjMxMCAwLjIxNjg1OAordnQgMC4wOTYzMTAgMC4yNTIxOTcKK3Z0IDAuMDk2MzEwIDAuMjM0NTA5Cit2dCAwLjA5NjMxMCAwLjI4Mzg3OAordnQgMC4wOTYzMTAgMC4yNjA1MTgKK3Z0IDAuMDk2MzEwIDAuMzQzODk0Cit2dCAwLjA5NjMxMCAwLjMzNzA2NAordnQgMC4wOTYzMTAgMC4zMTYzODgKK3Z0IDAuMTI1MTQ3IDAuMzQzODk0Cit2dCAwLjExMzc5OCAwLjM0Mzg5NAordnQgMC4xMDI3MDYgMC4zNDM4OTQKK3Z0IDAuMTMxMTM0IDAuMjY4MzYzCit2dCAwLjA5NjMxMCAwLjI3MzA4MwordnQgMC4xMTc3ODcgMC4xOTk0NzUKK3Z0IDAuMTEwNjE1IDAuMTk5NDc1Cit2dCAwLjEwMjcxMyAwLjE5OTQ3NgordnQgMC4wOTYzMTAgMC4yMDk4MDQKK3Z0IDAuMTM2OTM1IDAuMzMzNzI1Cit2dCAwLjEzNjk0OCAwLjM0ODc1MAordnQgMC4xMzY5MzUgMC4yMzU5MTMKK3Z0IDAuMTM2OTM1IDAuMjQ5NzEyCit2dCAwLjEzNjkzNSAwLjI5NDk0MAordnQgMC4xMzY5MzUgMC4zMTUzMDUKK3Z0IDAuMTM2OTM1IDAuMjgwOTc1Cit2dCAwLjEzNjkzNSAwLjI2ODM2NgordnQgMC4xMzY5MzUgMC4yNTYyNjcKK3Z0IDAuMTM2OTM1IDAuMjE1MDg1Cit2dCAwLjEzNjkzNSAwLjIyNTkyMgordnQgMC4xMzY5MzUgMC4xOTk0NzUKK3Z0IDAuOTYzNTg4IDAuMjE3ODQzCit2dCAwLjk2MzU4OCAwLjIxOTI2NgordnQgMC45NjMxNDIgMC4yMTkyNjUKK3Z0IDAuOTYzNTczIDAuMzIxMDM0Cit2dCAwLjk2MzU3NCAwLjMyMjQ1NwordnQgMC45NjMxMjggMC4zMjI0NTcKK3Z0IDAuOTE1MDA5IDAuOTc1ODQ5Cit2dCAwLjkxNTAxMCAwLjk3NjU4NQordnQgMC45MTQ1NjUgMC45NzY1ODUKK3Z0IDAuOTc3MTc4IDAuNDMzNDk5Cit2dCAwLjk3NzE4MCAwLjQzNDIzNQordnQgMC45NzY3MzQgMC40MzQyMzUKK3Z0IDAuOTE1MzMwIDAuOTEzMTA5Cit2dCAwLjkxNDg4NyAwLjkwOTA3NAordnQgMC45MTUzMzAgMC45MDkwMjgKK3Z0IDAuNzUwMDIwIDAuOTExOTc5Cit2dCAwLjc1MDAyMCAwLjkxNjAzOAordnQgMC43NDk1NzQgMC45MTYwMzUKK3Z0IDAuODkwOTkyIDAuMzg3NjA2Cit2dCAwLjg5MDk5MiAwLjM5NDQ1MgordnQgMC44OTA1NDcgMC4zOTQ0NTEKK3Z0IDAuODkxMTI1IDAuNzU0OTc5Cit2dCAwLjg5MTEyNSAwLjc2MTgyNQordnQgMC44OTA2NzkgMC43NjE4MjQKK3Z0IDAuODkxMjk1IDAuNzM3Mjg3Cit2dCAwLjg5MDg1MSAwLjczMDUyNwordnQgMC44OTEyOTUgMC43MzA0OTcKK3Z0IDAuODkxMTk0IDAuNjgzODkwCit2dCAwLjg5MDc1MCAwLjY3NzEzMAordnQgMC44OTExOTQgMC42NzcxMDAKK3Z0IDAuNTgzODYyIDAuOTIyNzUxCit2dCAwLjU4MzQxOSAwLjkxOTA5NgordnQgMC41ODM4NjIgMC45MTkwNDUKK3Z0IDAuNjk1MTUxIDAuOTE5Mzc4Cit2dCAwLjY5NTE3MiAwLjkyMzA1OQordnQgMC42OTQ3MjYgMC45MjMwNTkKK3Z0IDAuMjE0MzUzIDAuOTEzNDY3Cit2dCAwLjIxMzkxMCAwLjkwOTI3NAordnQgMC4yMTQzNTMgMC45MDkyMjYKK3Z0IDAuODkyNzI3IDAuOTEzNDU1Cit2dCAwLjg5MjI4NCAwLjkwOTI2MgordnQgMC44OTI3MjcgMC45MDkyMTUKK3Z0IDAuNTgzODU4IDAuOTM2MTcxCit2dCAwLjU4MzQxOSAwLjkzMzQ1MwordnQgMC41ODM4NTggMC45MzMzNzYKK3Z0IDAuNDYwOTQ1IDAuOTM2MjEwCit2dCAwLjQ2MDUwNiAwLjkzMzQ5MQordnQgMC40NjA5NDUgMC45MzM0MTQKK3Z0IDAuNTQ5NTE4IDAuOTIzMzAxCit2dCAwLjU0OTA3NiAwLjkxOTc2MQordnQgMC41NDk1MTggMC45MTk3MDMKK3Z0IDAuNjU1MDI4IDAuOTIzMjU3Cit2dCAwLjY1NDU4NiAwLjkxOTcxNwordnQgMC42NTUwMjggMC45MTk2NjAKK3Z0IDAuNTA0MDI5IDAuOTE3OTQxCit2dCAwLjUwMzU4NiAwLjkxNDA3OQordnQgMC41MDQwMjkgMC45MTQwMjcKK3Z0IDAuMDQ5OTY0IDAuOTE3OTg4Cit2dCAwLjA0OTUyMiAwLjkxNDEyNgordnQgMC4wNDk5NjQgMC45MTQwNzQKK3Z0IDAuOTI0NTk3IDAuNzg5ODk2Cit2dCAwLjkyNDE1NSAwLjc4NjU2MQordnQgMC45MjQ1OTcgMC43ODY1MDEKK3Z0IDAuOTI0ODQ0IDAuNDk4NzIxCit2dCAwLjkyNDQwMyAwLjQ5NTM4NQordnQgMC45MjQ4NDQgMC40OTUzMjYKK3Z0IDAuOTM0NzgzIDAuNjI5ODQyCit2dCAwLjkzNDM0MyAwLjYyNzAxNQordnQgMC45MzQ3ODMgMC42MjY5NDUKK3Z0IDAuOTM0Nzc3IDAuODE1NDUyCit2dCAwLjkzNDMzNyAwLjgxMjYyNQordnQgMC45MzQ3NzcgMC44MTI1NTUKK3Z0IDAuNzY0MTM4IDAuOTUyMzA1Cit2dCAwLjc2MzcwNCAwLjk1MDMyNwordnQgMC43NjQxMzggMC45NTAyMjYKK3Z0IDAuODkyNzE4IDAuOTUyNjQ3Cit2dCAwLjg5MjI4NCAwLjk1MDY2OAordnQgMC44OTI3MTggMC45NTA1NjgKK3Z0IDAuMDQ5OTYwIDAuOTQ0ODQ1Cit2dCAwLjA0OTUyMiAwLjk0MjQ3NQordnQgMC4wNDk5NjAgMC45NDIzOTQKK3Z0IDAuNTA0MDI1IDAuOTQ0NzI0Cit2dCAwLjUwMzU4NiAwLjk0MjM1NQordnQgMC41MDQwMjUgMC45NDIyNzMKK3Z0IDAuOTQ1ODQ3IDAuNjI5MzUzCit2dCAwLjk0NTQxMCAwLjYyNzAzMQordnQgMC45NDU4NDcgMC42MjY5NDUKK3Z0IDAuOTQ1ODQxIDAuODE0OTYzCit2dCAwLjk0NTQwNCAwLjgxMjY0MQordnQgMC45NDU4NDEgMC44MTI1NTUKK3Z0IDAuOTA2OTIzIDAuMjM5NDk1Cit2dCAwLjkwNjQ4MCAwLjIzNDQ0MwordnQgMC45MDY5MjMgMC4yMzQ0MDQKK3Z0IDAuOTA3MTM5IDAuMDI5NTEzCit2dCAwLjkwNjY5NiAwLjAyNDQ2MQordnQgMC45MDcxMzkgMC4wMjQ0MjEKK3Z0IDAuNjA4MzQyIDAuOTA4ODU5Cit2dCAwLjYwNzg5OCAwLjkwNDA4MgordnQgMC42MDgzNDIgMC45MDQwNDIKK3Z0IDAuMzczODY4IDAuOTA0MTQxCit2dCAwLjM3Mzg3OCAwLjkwODkzOQordnQgMC4zNzM0MzMgMC45MDg5MzkKK3Z0IDAuMTAzMDM2IDAuOTI3NDU2Cit2dCAwLjEwMjU5NSAwLjkyNDMxMAordnQgMC4xMDMwMzYgMC45MjQyNTEKK3Z0IDAuODgxNjU3IDAuOTI0ODkzCit2dCAwLjg4MTY1NyAwLjkyODA3MAordnQgMC44ODEyMTEgMC45MjgwNjcKK3Z0IDAuOTQwMjkxIDAuMDI3MDI1Cit2dCAwLjkzOTg1MSAwLjAyNDQ5NgordnQgMC45NDAyOTEgMC4wMjQ0MjEKK3Z0IDAuMjI4NTMyIDAuOTM4MDg1Cit2dCAwLjIyODUzOCAwLjk0MDY1MQordnQgMC4yMjgwOTMgMC45NDA2NTEKK3Z0IDAuOTYzMDQ4IDAuMzA3ODQ1Cit2dCAwLjk2MzA0OCAwLjMwOTI2OQordnQgMC45NjI2MDIgMC4zMDkyNjkKK3Z0IDAuOTEzMzE5IDAuNjkzNTg0Cit2dCAwLjkxMjg5NCAwLjY5MjIyNQordnQgMC45MTMzMTkgMC42OTIwOTIKK3Z0IDAuNDE0NzY2IDAuOTczMTM1Cit2dCAwLjQxNDM4MSAwLjk3MjQ3NQordnQgMC40MTQ3NjYgMC45NzIyNTAKK3Z0IDAuNTQ5NDYwIDAuOTczMTE1Cit2dCAwLjU0OTA3NiAwLjk3MjQ1NgordnQgMC41NDk0NjAgMC45NzIyMzEKK3Z0IDAuOTEzMjY4IDAuNzU5MzQ2Cit2dCAwLjkxMjgyNSAwLjc1NTAyOQordnQgMC45MTMyNjggMC43NTQ5NzkKK3Z0IDAuOTEzMzM3IDAuNjgxNDY2Cit2dCAwLjkxMjg5NCAwLjY3NzE1MAordnQgMC45MTMzMzcgMC42NzcxMDAKK3Z0IDAuNTgzODYzIDAuODkyOTEyCit2dCAwLjU4MzQxOSAwLjg4NjU5NwordnQgMC41ODM4NjMgMC44ODY1NjQKK3Z0IDAuMzMxNDA4IDAuODkyOTAyCit2dCAwLjMzMDk2NCAwLjg4NjU4NgordnQgMC4zMzE0MDggMC44ODY1NTQKK3Z0IDAuODkwOTMxIDAuNzA0MjI0Cit2dCAwLjg5MDkzMSAwLjcxMTA3NAordnQgMC44OTA0ODYgMC43MTEwNzMKK3Z0IDAuODkwOTE5IDAuNDk1MzI2Cit2dCAwLjg5MDk0MyAwLjUwMjE3NgordnQgMC44OTA0OTcgMC41MDIxNzYKK3Z0IDAuNTk1NDQ3IDAuOTIwODAzCit2dCAwLjU5NTAwNCAwLjkxNzA0NAordnQgMC41OTU0NDcgMC45MTY5ODkKK3Z0IDAuNTcwODc4IDAuOTIwODczCit2dCAwLjU3MDQzNiAwLjkxNzExMwordnQgMC41NzA4NzggMC45MTcwNTkKK3Z0IDAuNTE3ODQ1IDAuOTEyODcxCit2dCAwLjUxNzQwMiAwLjkwODUwMQordnQgMC41MTc4NDUgMC45MDg0NTcKK3Z0IDAuOTEzMTMzIDAuMzg3NjA2Cit2dCAwLjkxMzEzNyAwLjM5MTk5OAordnQgMC45MTI2OTEgMC4zOTE5OTgKK3Z0IDAuOTM1ODk4IDAuNDgxODk3Cit2dCAwLjkzNTkxNyAwLjQ4NDcwMQordnQgMC45MzU0NzIgMC40ODQ3MDEKK3Z0IDAuOTM1ODIxIDAuNTM5Mzk0Cit2dCAwLjkzNTM4MSAwLjUzNjYyNQordnQgMC45MzU4MjEgMC41MzY1NTgKK3Z0IDAuOTIzNjQwIDAuMzU2MzA4Cit2dCAwLjkyMzY0MCAwLjM1OTg2OQordnQgMC45MjMxOTUgMC4zNTk4NjcKK3Z0IDAuOTIzNDc4IDAuNDcxNDUyCit2dCAwLjkyMzAzNSAwLjQ2NzkxOQordnQgMC45MjM0NzggMC40Njc4NjUKK3Z0IDAuOTE4ODY1IDAuMzA3ODQ1Cit2dCAwLjkxODg2NSAwLjMxMTc0OAordnQgMC45MTg0MTkgMC4zMTE3NDcKK3Z0IDAuOTE4NzA1IDAuMjkwMDY0Cit2dCAwLjkxODcwNSAwLjI5Mzk2NwordnQgMC45MTgyNTkgMC4yOTM5NjYKK3Z0IDAuMzk5NzA2IDAuOTIyMDE2Cit2dCAwLjM5OTcwNiAwLjkyNTMwNAordnQgMC4zOTkyNjEgMC45MjUzMDMKK3Z0IDAuOTI1NTc1IDAuODM2NzU0Cit2dCAwLjkyNTU3NSAwLjg0MDA0MgordnQgMC45MjUxMjkgMC44NDAwNDEKK3Z0IDAuNzkyNzI0IDAuOTMzNzAzCit2dCAwLjc5MjcyNCAwLjkzNjQ0NQordnQgMC43OTIyNzggMC45MzY0NDQKK3Z0IDAuMDgxNTc4IDAuOTM2NDM2Cit2dCAwLjA4MTEzOCAwLjkzMzczMAordnQgMC4wODE1NzggMC45MzM2NTkKK3Z0IDAuOTEzNzU5IDAuNTEwMTgwCit2dCAwLjkxMzc3NSAwLjUxMjA0MQordnQgMC45MTMzMzAgMC41MTIwNDEKK3Z0IDAuMDYzNTc3IDAuOTU0ODkyCit2dCAwLjA2MzU5MyAwLjk1Njc1MgordnQgMC4wNjMxNDcgMC45NTY3NTIKK3Z0IDAuNTgzODY0IDAuOTQ2Nzk2Cit2dCAwLjU4Mzg2NSAwLjk0OTAzOQordnQgMC41ODM0MTkgMC45NDkwMzkKK3Z0IDAuNDgyNTcxIDAuOTQ2NzkzCit2dCAwLjQ4MjU3MSAwLjk0OTAzNQordnQgMC40ODIxMjYgMC45NDkwMzUKK3Z0IDAuMDA1NzUxIDAuOTQ5ODIzCit2dCAwLjAwNTMxNCAwLjk0NzcwNQordnQgMC4wMDU3NTEgMC45NDc2MjAKK3Z0IDAuOTQ5NjYxIDAuMjczNjExCit2dCAwLjk0OTIyNCAwLjI3MTQ5MgordnQgMC45NDk2NjEgMC4yNzE0MDgKK3Z0IDAuNjY2MjgyIDAuOTAzNjg2Cit2dCAwLjY2NjI4MiAwLjkwODU1MAordnQgMC42NjU4MzYgMC45MDg1NDgKK3Z0IDAuNTgzODYzIDAuOTA4NDIwCit2dCAwLjU4MzQxOSAwLjkwMzU3NwordnQgMC41ODM4NjMgMC45MDM1MzcKK3Z0IDAuOTAyMDAyIDAuNzA5NjgwCit2dCAwLjkwMTU1OCAwLjcwNDI2MgordnQgMC45MDIwMDIgMC43MDQyMjQKK3Z0IDAuOTAxOTMzIDAuNjU3MTM0Cit2dCAwLjkwMTQ4OSAwLjY1MTcxNgordnQgMC45MDE5MzMgMC42NTE2NzkKK3Z0IDAuOTI1ODAwIDAuNDU0NzcwCit2dCAwLjkyNTM1OSAwLjQ1MTU5MwordnQgMC45MjU4MDAgMC40NTE1MjgKK3Z0IDAuMjQyNDAyIDAuOTI2MDc2Cit2dCAwLjI0MTk2MiAwLjkyMjg5OAordnQgMC4yNDI0MDIgMC45MjI4MzMKK3Z0IDAuOTQ0MDcwIDAuMTQ5NTI3Cit2dCAwLjk0MzYzMyAwLjE0NzE1NQordnQgMC45NDQwNzAgMC4xNDcwNzMKK3Z0IDAuMDYzNTg1IDAuOTQ0MjY3Cit2dCAwLjA2MzE0NyAwLjk0MTg5NQordnQgMC4wNjM1ODUgMC45NDE4MTMKK3Z0IDAuNzkyNzA1IDAuOTYxNDk4Cit2dCAwLjc5MjI3OCAwLjk2MDA0OAordnQgMC43OTI3MDUgMC45NTk5MjIKK3Z0IDAuMDA1NzU5IDAuOTYwNDQ5Cit2dCAwLjAwNTc1OSAwLjk2MTk2MAordnQgMC4wMDUzMTQgMC45NjE5NjAKK3Z0IDAuNzA3MzQ0IDAuOTcxOTM1Cit2dCAwLjcwNzM1MSAwLjk3Mjc5MwordnQgMC43MDY5MDYgMC45NzI3OTMKK3Z0IDAuNDYwOTQ1IDAuOTcyMDQwCit2dCAwLjQ2MDk1MiAwLjk3Mjg5NwordnQgMC40NjA1MDYgMC45NzI4OTcKK3Z0IDAuODUyOTczIDAuMTU0MjgyCit2dCAwLjg1MjUzMCAwLjE0OTIyNQordnQgMC44NTI5NzMgMC4xNDkxODcKK3Z0IDAuOTA2NDA1IDAuMDkyMTYzCit2dCAwLjkwNTk2MSAwLjA4NzEwNwordnQgMC45MDY0MDUgMC4wODcwNjkKK3Z0IDAuOTIzNzA5IDAuODE2MDgyCit2dCAwLjkyMzI2OCAwLjgxMjYxNAordnQgMC45MjM3MDkgMC44MTI1NTUKK3Z0IDAuOTIzNzA5IDAuNDE1NjE3Cit2dCAwLjkyMzI2OCAwLjQxMjE0OAordnQgMC45MjM3MDkgMC40MTIwODkKK3Z0IDAuNTk1NDQ1IDAuOTM0MzYxCit2dCAwLjU5NTAwNCAwLjkzMTQ5OAordnQgMC41OTU0NDUgMC45MzE0MjkKK3Z0IDAuNjMwNDk3IDAuOTM0MTU2Cit2dCAwLjYzMDA1NyAwLjkzMTI5MgordnQgMC42MzA0OTcgMC45MzEyMjMKK3Z0IDAuOTUwNTMzIDAuMjM0NDA0Cit2dCAwLjk1MDUzMyAwLjIzNjU3MAordnQgMC45NTAwODcgMC4yMzY1NzAKK3Z0IDAuOTUxMjE3IDAuMDY2NzMzCit2dCAwLjk1MTIxNyAwLjA2ODg5OQordnQgMC45NTA3NzIgMC4wNjg4OTkKK3Z0IDAuMTY3MDcyIDAuOTU5NTgxCit2dCAwLjE2NzA3MiAwLjk2MTE2NgordnQgMC4xNjY2MjcgMC45NjExNjYKK3Z0IDAuNjQzMDU2IDAuOTU5NDkzCit2dCAwLjY0MzA1NiAwLjk2MTA3OAordnQgMC42NDI2MTEgMC45NjEwNzgKK3Z0IDAuOTY4MDI4IDAuNjQxMDI4Cit2dCAwLjk2NzYxMyAwLjYzOTk4MQordnQgMC45NjgwMjggMC42Mzk4MTcKK3Z0IDAuODQ4MTM3IDAuOTY3NzYwCit2dCAwLjg0NzcyMyAwLjk2NjcxMgordnQgMC44NDgxMzcgMC45NjY1NDkKK3Z0IDAuODQwNjMyIDAuMjk3MTc0Cit2dCAwLjg0MDE4OSAwLjI5MzQwMwordnQgMC44NDA2MzIgMC4yOTMzNTIKK3Z0IDAuOTIxOTQ1IDAuMjUzNTc1Cit2dCAwLjkyMTk0NSAwLjI1NzM3MQordnQgMC45MjE1MDAgMC4yNTczNzAKK3Z0IDAuOTEyODgwIDAuNTIyNzg0Cit2dCAwLjkxMjkwMCAwLjUyNzI0MgordnQgMC45MTI0NTUgMC41MjcyNDEKK3Z0IDAuODQwNzQ3IDAuMTg2NzQxCit2dCAwLjg0MDc0NyAwLjE5MTE5OQordnQgMC44NDAzMDIgMC4xOTExOTcKK3Z0IDAuODk0ODgyIDAuMjc3NTkwCit2dCAwLjg5NDQzOCAwLjI3MTQ0MAordnQgMC44OTQ4ODIgMC4yNzE0MDgKK3Z0IDAuODk1MDc1IDAuMTcxMDk0Cit2dCAwLjg5NDYzMSAwLjE2NDk0MwordnQgMC44OTUwNzUgMC4xNjQ5MTEKK3Z0IDAuNjgzNzI0IDAuODkyMzgyCit2dCAwLjY4MzI3OSAwLjg4NjA0OAordnQgMC42ODM3MjQgMC44ODYwMTUKK3Z0IDAuODA3ODAwIDAuMzQ1NTk5Cit2dCAwLjgwNzM1NSAwLjMzOTI2NQordnQgMC44MDc4MDAgMC4zMzkyMzEKK3Z0IDAuOTcxMjkwIDAuNzcxNTI1Cit2dCAwLjk3MTI5MCAwLjc3MjQzMgordnQgMC45NzA4NDQgMC43NzI0MzIKK3Z0IDAuOTE4ODY1IDAuMzIyMzczCit2dCAwLjkxODg2NSAwLjMyMzI4MAordnQgMC45MTg0MTkgMC4zMjMyODAKK3Z0IDAuMjAyODEzIDAuOTU5NjE3Cit2dCAwLjIwMjgxMyAwLjk2MTIwMgordnQgMC4yMDIzNjcgMC45NjEyMDIKK3Z0IDAuNDQzNzE5IDAuOTU5NDkxCit2dCAwLjQ0MzcxOSAwLjk2MTA3NgordnQgMC40NDMyNzMgMC45NjEwNzYKK3Z0IDAuOTY5OTY0IDAuOTIzNDg2Cit2dCAwLjk2OTU2NyAwLjkyMjcwOQordnQgMC45Njk5NjQgMC45MjI1MDYKK3Z0IDAuOTY5OTg2IDAuOTYyOTcyCit2dCAwLjk2OTU4OSAwLjk2MjE5NAordnQgMC45Njk5ODYgMC45NjE5OTIKK3Z0IDAuOTU5ODQwIDAuOTEwNjc0Cit2dCAwLjk1OTQxMSAwLjkwOTE0OQordnQgMC45NTk4NDAgMC45MDkwMjgKK3Z0IDAuOTYxNDUwIDAuMDg3MDY5Cit2dCAwLjk2MTQ1MCAwLjA4ODY1MwordnQgMC45NjEwMDUgMC4wODg2NTMKK3Z0IDAuOTc4Nzg0IDAuNjUyNDQ0Cit2dCAwLjk3ODQyNCAwLjY1MTk0MAordnQgMC45Nzg3ODQgMC42NTE2NzkKK3Z0IDAuOTc4NzQ5IDAuNzQyNTQ0Cit2dCAwLjk3ODM4OCAwLjc0MjA0MAordnQgMC45Nzg3NDkgMC43NDE3NzgKK3Z0IDAuNDE0ODI2IDAuOTQ3MTk5Cit2dCAwLjQxNDgyNyAwLjk0OTQyNAordnQgMC40MTQzODEgMC45NDk0MjQKK3Z0IDAuNjk1MTcyIDAuOTQ3MDc2Cit2dCAwLjY5NTE3MiAwLjk0OTMwMQordnQgMC42OTQ3MjYgMC45NDkzMDEKK3Z0IDAuNTgzODExIDAuOTcyNzk2Cit2dCAwLjU4MzQxOSAwLjk3MjA4NwordnQgMC41ODM4MTEgMC45NzE4NzQKK3Z0IDAuOTcwMDM1IDAuOTczNTk3Cit2dCAwLjk3MDAzNSAwLjk3NDQwNwordnQgMC45Njk1ODkgMC45NzQ0MDQKK3Z0IDAuMjAyODExIDAuOTMzNDk2Cit2dCAwLjIwMjgxMyAwLjkzNjI3NQordnQgMC4yMDIzNjcgMC45MzYyNzUKK3Z0IDAuNjY2MjgyIDAuOTMzNDkwCit2dCAwLjY2NjI4MiAwLjkzNjI2OAordnQgMC42NjU4MzYgMC45MzYyNjgKK3Z0IDAuMTE4OTE3IDAuOTQwMTk1Cit2dCAwLjExODQ3OCAwLjkzNzY4NQordnQgMC4xMTg5MTcgMC45Mzc2MTAKK3Z0IDAuOTE1MzMwIDAuOTQwMzA3Cit2dCAwLjkxNDg5MSAwLjkzNzc5NwordnQgMC45MTUzMzAgMC45Mzc3MjEKK3Z0IDAuOTQ3NTU4IDAuNDUxNTI4Cit2dCAwLjk0NzU1OSAwLjQ1MzgyNQordnQgMC45NDcxMTMgMC40NTM4MjUKK3Z0IDAuOTQ2MzkyIDAuNzMyODM3Cit2dCAwLjk0NTk1NSAwLjczMDU4MgordnQgMC45NDYzOTIgMC43MzA0OTcKK3Z0IDAuOTY5MDY1IDAuNDgyOTcwCit2dCAwLjk2ODY2MSAwLjQ4MjA4NQordnQgMC45NjkwNjUgMC40ODE4OTcKK3Z0IDAuOTQ1ODE0IDAuNjQxMDUxCit2dCAwLjk0NTQxMCAwLjY0MDE2NgordnQgMC45NDU4MTQgMC42Mzk5NzkKK3Z0IDAuNzUwMDEzIDAuOTQyMDE2Cit2dCAwLjc0OTU3NCAwLjkzOTU5OAordnQgMC43NTAwMTMgMC45Mzk1MTgKK3Z0IDAuODI0OTkxIDAuOTQxOTgyCit2dCAwLjgyNDU1MiAwLjkzOTU2NAordnQgMC44MjQ5OTEgMC45Mzk0ODQKK3Z0IDAuOTM2NTc2IDAuODU3NjYwCit2dCAwLjkzNjU3NiAwLjg2MDQzMwordnQgMC45MzYxMzAgMC44NjA0MzIKK3Z0IDAuNzgxNjUxIDAuOTMzNTk1Cit2dCAwLjc4MTY1MSAwLjkzNjM2NwordnQgMC43ODEyMDUgMC45MzYzNjcKK3Z0IDAuOTI2MzM0IDAuOTc1NzI4Cit2dCAwLjkyNTk1NyAwLjk3NTEzOAordnQgMC45MjYzMzQgMC45NzQ5MDEKK3Z0IDAuMjQyMzM5IDAuOTc1NjQ5Cit2dCAwLjI0MTk2MiAwLjk3NTA1OQordnQgMC4yNDIzMzkgMC45NzQ4MjEKK3Z0IDAuOTc5MTAxIDAuNTIzNTM1Cit2dCAwLjk3ODc0MSAwLjUyMzA0NgordnQgMC45NzkxMDEgMC41MjI3ODQKK3Z0IDAuOTc5MDc4IDAuNzU1NzMwCit2dCAwLjk3ODcxOCAwLjc1NTI0MgordnQgMC45NzkwNzggMC43NTQ5NzkKK3Z0IDAuMDgxNTg0IDAuOTQ3MDYyCit2dCAwLjA4MTU4NCAwLjk0OTI4OAordnQgMC4wODExMzggMC45NDkyODgKK3Z0IDAuNzgxNjUwIDAuOTQ2OTkzCit2dCAwLjc4MTY1MSAwLjk0OTIxOQordnQgMC43ODEyMDUgMC45NDkyMTkKK3Z0IDAuOTIzNzEzIDAuNjY2NDUzCit2dCAwLjkyMzM5MyAwLjY2NjExOAordnQgMC45MjM3MTMgMC42NjU4MDgKK3Z0IDAuOTgzMjg1IDAuMDI1MDY2Cit2dCAwLjk4Mjk2NSAwLjAyNDczMQordnQgMC45ODMyODUgMC4wMjQ0MjEKK3Z0IDAuOTM2Njk3IDAuNTEyMDY0Cit2dCAwLjkzNjI1OCAwLjUwOTQyMAordnQgMC45MzY2OTcgMC41MDkzNDYKK3Z0IDAuNDE0ODIxIDAuOTM2NTczCit2dCAwLjQxNDM4MSAwLjkzMzkyOQordnQgMC40MTQ4MjEgMC45MzM4NTYKK3Z0IDAuOTQzODMzIDAuMjU2MDYzCit2dCAwLjk0MzM5NSAwLjI1MzY1NQordnQgMC45NDM4MzMgMC4yNTM1NzUKK3Z0IDAuMTM1NjAyIDAuOTQzMDcxCit2dCAwLjEzNTE2MyAwLjk0MDY2MwordnQgMC4xMzU2MDIgMC45NDA1ODMKK3Z0IDAuOTQ3MjUwIDAuODc1ODg3Cit2dCAwLjk0NzI1MCAwLjg3ODE4NwordnQgMC45NDY4MDUgMC44NzgxODYKK3Z0IDAuODE4NzMwIDAuMDM1NTQzCit2dCAwLjgxODI5MyAwLjAzMzI4NQordnQgMC44MTg3MzAgMC4wMzMyMDEKK3Z0IDAuOTY4ODc1IDAuNDk1MzI2Cit2dCAwLjk2ODg4MiAwLjQ5NjM3MgordnQgMC45Njg0MzYgMC40OTYzNzIKK3Z0IDAuNTA0MDMyIDAuOTY3NTg2Cit2dCAwLjUwNDAzMiAwLjk2ODYzMgordnQgMC41MDM1ODYgMC45Njg2MjkKK3Z0IDAuOTQwOTIyIDAuMDQ1ODc3Cit2dCAwLjk0MDkyNSAwLjA0ODQ0MgordnQgMC45NDA0NzkgMC4wNDg0NDIKK3Z0IDAuOTQwOTU3IDAuMzA3ODQ1Cit2dCAwLjk0MDk1NyAwLjMxMDQwOQordnQgMC45NDA1MTEgMC4zMTA0MDkKK3Z0IDAuNjU1MDI2IDAuOTM2NTk1Cit2dCAwLjY1NDU4NiAwLjkzMzk1NgordnQgMC42NTUwMjYgMC45MzM4ODMKK3Z0IDAuNjE5NDEzIDAuOTM2NTg4Cit2dCAwLjYxODk3MyAwLjkzMzk0OQordnQgMC42MTk0MTMgMC45MzM4NzYKK3Z0IDAuMDE4OTYwIDAuOTc3NjM4Cit2dCAwLjAxODU5NCAwLjk3NzEwNAordnQgMC4wMTg5NjAgMC45NzY4NTAKK3Z0IDAuMjk3OTIzIDAuOTc3NjA4Cit2dCAwLjI5NzU1NyAwLjk3NzA3NAordnQgMC4yOTc5MjMgMC45NzY4MjAKK3Z0IDAuOTQ1NzkxIDAuNDE0NTI0Cit2dCAwLjk0NTM1NCAwLjQxMjE3NAordnQgMC45NDU3OTEgMC40MTIwODkKK3Z0IDAuOTQ1Nzc4IDAuMzU4NzQzCit2dCAwLjk0NTM0MCAwLjM1NjM5MwordnQgMC45NDU3NzggMC4zNTYzMDgKK3Z0IDAuOTY4Mzc4IDAuNzg3NjE2Cit2dCAwLjk2Nzk3MSAwLjc4NjY4NAordnQgMC45NjgzNzggMC43ODY1MDEKK3Z0IDAuOTY4NDA3IDAuNjY1Nzg5Cit2dCAwLjk2ODAwMCAwLjY2NDg1NwordnQgMC45Njg0MDcgMC42NjQ2NzQKK3Z0IDAuMDQ5OTYxIDAuOTc5NTM4Cit2dCAwLjA0OTk2NyAwLjk4MDEyNwordnQgMC4wNDk1MjIgMC45ODAxMjcKK3Z0IDAuNzM3MDQwIDAuOTc5OTMxCit2dCAwLjczNzA0NyAwLjk4MDUyMQordnQgMC43MzY2MDEgMC45ODA1MjEKK3Z0IDAuOTIzODM1IDAuNjU1MTgzCit2dCAwLjkyMzM5MyAwLjY1MTczMwordnQgMC45MjM4MzUgMC42NTE2NzkKK3Z0IDAuOTIzOTAwIDAuMTgzMzI2Cit2dCAwLjkyMzkxNyAwLjE4NjgwNAordnQgMC45MjM0NzEgMC4xODY4MDQKK3Z0IDAuOTA3Nzg2IDAuMzA3ODQ1Cit2dCAwLjkwNzc5MiAwLjMxMjgyNQordnQgMC45MDczNDYgMC4zMTI4MjUKK3Z0IDAuOTA3NjI2IDAuMjkwMDY0Cit2dCAwLjkwNzYzMiAwLjI5NTA0MwordnQgMC45MDcxODYgMC4yOTUwNDMKK3Z0IDAuOTAzNDg3IDAuODQyMDQ0Cit2dCAwLjkwMzA0NCAwLjgzNjc5NAordnQgMC45MDM0ODcgMC44MzY3NTQKK3Z0IDAuNTA0MDMwIDAuOTAzNDAyCit2dCAwLjUwMzU4NiAwLjg5ODE1MgordnQgMC41MDQwMzAgMC44OTgxMTIKK3Z0IDAuODM2NTgyIDAuOTAwMTQ2Cit2dCAwLjgzNjEzOCAwLjg5NDQyNgordnQgMC44MzY1ODIgMC44OTQzOTAKK3Z0IDAuOTAwMTA3IDAuMTUyODMwCit2dCAwLjg5OTY2MyAwLjE0NzEwOQordnQgMC45MDAxMDcgMC4xNDcwNzMKK3Z0IDAuOTExMTU2IDAuMTQ3MDczCit2dCAwLjkxMTE4MCAwLjE1MTY2NQordnQgMC45MTA3MzQgMC4xNTE2NjUKK3Z0IDAuOTEwODQ5IDAuMjUzNTc1Cit2dCAwLjkxMDg3MyAwLjI1ODE2NgordnQgMC45MTA0MjcgMC4yNTgxNjYKK3Z0IDAuODQ4MTY3IDAuOTAwNjc3Cit2dCAwLjg0NzcyMyAwLjg5NTE0MAordnQgMC44NDgxNjcgMC44OTUxMDMKK3Z0IDAuODcwNTc0IDAuOTAxMzE4Cit2dCAwLjg3MDEzMCAwLjg5NTc4MQordnQgMC44NzA1NzQgMC44OTU3NDQKK3Z0IDAuOTA3Nzg2IDAuMDY2NzMzCit2dCAwLjkwNzc5NyAwLjA3MTcxMAordnQgMC45MDczNTEgMC4wNzE3MTAKK3Z0IDAuOTA3MTY3IDAuMTEyOTM1Cit2dCAwLjkwNjcyMyAwLjEwNzk3OAordnQgMC45MDcxNjcgMC4xMDc5MzkKK3Z0IDAuODI0OTk0IDAuOTI4ODU5Cit2dCAwLjgyNDU1MiAwLjkyNTg1NQordnQgMC44MjQ5OTQgMC45MjU3OTQKK3Z0IDAuOTI5MjI0IDAuMDI3NDg2Cit2dCAwLjkyODc4MyAwLjAyNDQ4MgordnQgMC45MjkyMjQgMC4wMjQ0MjEKK3Z0IDAuOTQwMjg1IDAuMTA3OTM5Cit2dCAwLjk0MDI4NSAwLjExMDU0MQordnQgMC45Mzk4MzkgMC4xMTA1NDAKK3Z0IDAuOTA0MjYyIDAuOTM3NDc2Cit2dCAwLjkwNDI2MiAwLjk0MDA3OAordnQgMC45MDM4MTYgMC45NDAwNzcKK3Z0IDAuMTM1NTc3IDAuOTY3ODgwCit2dCAwLjEzNTE2MyAwLjk2Njg1MQordnQgMC4xMzU1NzcgMC45NjY2ODUKK3Z0IDAuOTY4MDY2IDAuMTg0NTIxCit2dCAwLjk2NzY1MiAwLjE4MzQ5MgordnQgMC45NjgwNjYgMC4xODMzMjYKK3Z0IDAuOTMxMjAwIDAuMjA0OTEwCit2dCAwLjkzMDc1OSAwLjIwMTk3MwordnQgMC45MzEyMDAgMC4yMDE5MDYKK3Z0IDAuMDYzNTg4IDAuOTMxMTg4Cit2dCAwLjA2MzE0NyAwLjkyODI1MAordnQgMC4wNjM1ODggMC45MjgxODQKK3Z0IDAuOTY5OTEyIDAuOTQ5MjU3Cit2dCAwLjk2OTkxMiAwLjk1MDE5NQordnQgMC45Njk0NjYgMC45NTAxOTUKK3Z0IDAuOTY5OTEzIDAuOTM2MzY1Cit2dCAwLjk2OTkxMyAwLjkzNzMwMwordnQgMC45Njk0NjcgMC45MzczMDMKK3Z0IDAuOTY3NjAyIDAuNjI2OTQ1Cit2dCAwLjk2NzYwMiAwLjYyODE0MAordnQgMC45NjcxNTYgMC42MjgxNDAKK3Z0IDAuOTY3NTk2IDAuODI0NDU3Cit2dCAwLjk2NzU5NiAwLjgyNTY1MgordnQgMC45NjcxNTEgMC44MjU2NTIKK3Z0IDAuOTEyNDA4IDAuNDcyNDE0Cit2dCAwLjkxMTk2NSAwLjQ2NzkwOQordnQgMC45MTI0MDggMC40Njc4NjUKK3Z0IDAuNzY0MTQ4IDAuOTEyMzk2Cit2dCAwLjc2MzcwNCAwLjkwNzg5MQordnQgMC43NjQxNDggMC45MDc4NDcKK3Z0IDAuOTEyMjgyIDAuNDM4MDYzCit2dCAwLjkxMTgzOSAwLjQzMzU0NQordnQgMC45MTIyODIgMC40MzM0OTkKK3Z0IDAuMzk5NzA0IDAuOTExMzkxCit2dCAwLjM5OTI2MSAwLjkwNjg3MwordnQgMC4zOTk3MDQgMC45MDY4MjcKK3Z0IDAuODc5NzY0IDAuMzYzNjgxCit2dCAwLjg3OTMyMCAwLjM1NjMzNgordnQgMC44Nzk3NjQgMC4zNTYzMDgKK3Z0IDAuODc5Nzg5IDAuNjU5MDUxCit2dCAwLjg3OTM0NCAwLjY1MTcwNwordnQgMC44Nzk3ODkgMC42NTE2NzkKK3Z0IDAuMTE4OTI0IDAuODc1NTQ5Cit2dCAwLjExODkyNCAwLjg4MjY4MQordnQgMC4xMTg0NzggMC44ODI2NzkKK3Z0IDAuODgxNjU3IDAuODc1ODg3Cit2dCAwLjg4MTY1NyAwLjg4MzAxOQordnQgMC44ODEyMTEgMC44ODMwMTYKK3Z0IDAuOTAxNjIzIDAuNDE3NjA0Cit2dCAwLjkwMTE3OSAwLjQxMjEyOAordnQgMC45MDE2MjMgMC40MTIwODkKK3Z0IDAuOTAxNjIzIDAuODE4MDcwCit2dCAwLjkwMTE3OSAwLjgxMjU5MwordnQgMC45MDE2MjMgMC44MTI1NTUKK3Z0IDAuODg1NzA3IDAuMDY2NzMzCit2dCAwLjg4NTcwNyAwLjA3MzcxMwordnQgMC44ODUyNjEgMC4wNzM3MTEKK3Z0IDAuODg2MDIwIDAuMDA1MzEzCit2dCAwLjg4NjA0NSAwLjAxMjI5MwordnQgMC44ODU2MDAgMC4wMTIyOTMKK3Z0IDAuMjQyNDA2IDAuODgzMjA3Cit2dCAwLjI0MTk2MiAwLjg3NjEzNwordnQgMC4yNDI0MDYgMC44NzYxMDkKK3Z0IDAuMjI4NTM3IDAuODgzMjY4Cit2dCAwLjIyODA5MyAwLjg3NjE5OQordnQgMC4yMjg1MzcgMC44NzYxNzEKK3Z0IDAuOTEzNTI4IDAuNzkwODQ2Cit2dCAwLjkxMzA4NSAwLjc4NjU0OAordnQgMC45MTM1MjggMC43ODY1MDEKK3Z0IDAuOTA0MjU5IDAuOTEzMzczCit2dCAwLjkwMzgxNiAwLjkwOTA3NQordnQgMC45MDQyNTkgMC45MDkwMjgKK3Z0IDAuNjA3OTI2IDAuOTU5Njg4Cit2dCAwLjYwNzkyNiAwLjk2MTI3MgordnQgMC42MDc0ODEgMC45NjEyNzIKK3Z0IDAuNzA3MzUxIDAuOTU5NzI2Cit2dCAwLjcwNzM1MSAwLjk2MTMxMAordnQgMC43MDY5MDYgMC45NjEzMTAKK3Z0IDAuMzczODc4IDAuOTcxODk1Cit2dCAwLjM3Mzg3OCAwLjk3Mjc1OQordnQgMC4zNzM0MzMgMC45NzI3NTkKK3Z0IDAuNTcwODMyIDAuOTcwMTkzCit2dCAwLjU3MDQzNiAwLjk2OTQyNQordnQgMC41NzA4MzIgMC45NjkyMjEKK3Z0IDAuOTEyMzk0IDAuNDg0Njg1Cit2dCAwLjkxMTk2NSAwLjQ4MzE1OQordnQgMC45MTIzOTQgMC40ODMwMzkKK3Z0IDAuMzMxNDA5IDAuOTU4OTcxCit2dCAwLjMzMTQxMCAwLjk2MDU1NgordnQgMC4zMzA5NjQgMC45NjA1NTYKK3Z0IDAuOTY4OTY2IDAuODc2OTY4Cit2dCAwLjk2ODU2MCAwLjg3NjA3MQordnQgMC45Njg5NjYgMC44NzU4ODcKK3Z0IDAuOTY5MDQ2IDAuNjkxNzkzCit2dCAwLjk2ODY0MCAwLjY5MDg5NQordnQgMC45NjkwNDYgMC42OTA3MTIKK3Z0IDAuNDE0ODA5IDAuOTYxNjI1Cit2dCAwLjQxNDM4MSAwLjk2MDE3NQordnQgMC40MTQ4MDkgMC45NjAwNDkKK3Z0IDAuNjE5NDAxIDAuOTYxNjM5Cit2dCAwLjYxODk3MyAwLjk2MDE4OQordnQgMC42MTk0MDEgMC45NjAwNjMKK3Z0IDAuNjk1MTEzIDAuOTczMDMzCit2dCAwLjY5NDcyNiAwLjk3MjM0OAordnQgMC42OTUxMTMgMC45NzIxMjcKK3Z0IDAuNzgxNTkyIDAuOTczMTE0Cit2dCAwLjc4MTIwNSAwLjk3MjQzMAordnQgMC43ODE1OTIgMC45NzIyMDkKK3Z0IDAuOTAzNzQ2IDAuODgxMDA5Cit2dCAwLjkwMzMwMiAwLjg3NTkyNgordnQgMC45MDM3NDYgMC44NzU4ODcKK3Z0IDAuOTA0MjYwIDAuODk4NDAzCit2dCAwLjkwMzgxNiAwLjg5MzMyMAordnQgMC45MDQyNjAgMC44OTMyODEKK3Z0IDAuOTI0NDA2IDAuNjgwNTMzCit2dCAwLjkyMzk2NCAwLjY3NzE1NgordnQgMC45MjQ0MDYgMC42NzcxMDAKK3Z0IDAuOTI0MzM3IDAuNzU4NDEyCit2dCAwLjkyMzg5NSAwLjc1NTAzNQordnQgMC45MjQzMzcgMC43NTQ5NzkKK3Z0IDAuOTM0NTc4IDAuNzA0MjI0Cit2dCAwLjkzNDU4OCAwLjcwNzEzNQordnQgMC45MzQxNDIgMC43MDcxMzUKK3Z0IDAuOTM0NzAzIDAuMzU2MzA4Cit2dCAwLjkzNDcxMyAwLjM1OTIxOQordnQgMC45MzQyNjcgMC4zNTkyMTkKK3Z0IDAuMTAzMDM0IDAuOTQwNjY3Cit2dCAwLjEwMjU5NSAwLjkzODE1OAordnQgMC4xMDMwMzQgMC45MzgwODIKK3Z0IDAuOTQwNzcwIDAuMjkyNjQ5Cit2dCAwLjk0MDMzMSAwLjI5MDE0MAordnQgMC45NDA3NzAgMC4yOTAwNjQKK3Z0IDAuMDM2NzYxIDAuOTYwMjMwCit2dCAwLjAzNjMzMyAwLjk1ODc0NAordnQgMC4wMzY3NjEgMC45NTg2MjEKK3Z0IDAuOTYwNzE3IDAuMjczMDE3Cit2dCAwLjk2MDI4OSAwLjI3MTUzMQordnQgMC45NjA3MTcgMC4yNzE0MDgKK3Z0IDAuNzkyNzI0IDAuOTcyMTI0Cit2dCAwLjc5MjcyNCAwLjk3Mjk3MAordnQgMC43OTIyNzggMC45NzI5NzAKK3Z0IDAuOTcxMzQ1IDAuMTY1ODY4Cit2dCAwLjk3MDk1MCAwLjE2NTExOQordnQgMC45NzEzNDUgMC4xNjQ5MTEKK3Z0IDAuOTIxNTg2IDAuMzM3NzExCit2dCAwLjkyMTE0NCAwLjMzMzk1OQordnQgMC45MjE1ODYgMC4zMzM5MDUKK3Z0IDAuMzg1NTQ1IDAuOTIxMzg1Cit2dCAwLjM4NTEwMiAwLjkxNzYzMwordnQgMC4zODU1NDUgMC45MTc1NzkKK3Z0IDAuMDA1NzU3IDAuOTA5NjgyCit2dCAwLjAwNTMxNCAwLjkwNTEyNwordnQgMC4wMDU3NTcgMC45MDUwODEKK3Z0IDAuOTEwNTE2IDAuMzM4NTA2Cit2dCAwLjkxMDA3MyAwLjMzMzk1MQordnQgMC45MTA1MTYgMC4zMzM5MDUKK3Z0IDAuODk2MDk1IDAuMTA3OTM5Cit2dCAwLjg5NjA5NSAwLjExNDA5MAordnQgMC44OTU2NTAgMC4xMTQwOTAKK3Z0IDAuODk1MzM0IDAuMDkzMjM1Cit2dCAwLjg5NDg4OSAwLjA4NzEwMQordnQgMC44OTUzMzQgMC4wODcwNjkKK3Z0IDAuODk1ODUyIDAuMjM0NDA0Cit2dCAwLjg5NTg1MiAwLjI0MDU2NAordnQgMC44OTU0MDcgMC4yNDA1NjAKK3Z0IDAuODk2MDY4IDAuMDI0NDIxCit2dCAwLjg5NjA2OCAwLjAzMDU4MQordnQgMC44OTU2MjMgMC4wMzA1NzcKK3Z0IDAuNzgxNjUxIDAuOTA4NjU1Cit2dCAwLjc4MTIwNyAwLjkwMzg1OQordnQgMC43ODE2NTEgMC45MDM4MTgKK3Z0IDAuNzkyNzI0IDAuOTA0MDEwCit2dCAwLjc5MjcyNCAwLjkwODgyNgordnQgMC43OTIyNzggMC45MDg4MjYKK3Z0IDAuODg4Mzc1IDAuMzQwODI4Cit2dCAwLjg4NzkzMCAwLjMzMzkzNAordnQgMC44ODgzNzUgMC4zMzM5MDUKK3Z0IDAuNDI2MDkyIDAuODg3MTY3Cit2dCAwLjQyNTY0OCAwLjg4MDI3MwordnQgMC40MjYwOTIgMC44ODAyNDQKK3Z0IDAuMjk3OTczIDAuODkzMjc3Cit2dCAwLjI5ODAwMyAwLjg5OTI0NwordnQgMC4yOTc1NTcgMC44OTkyNDcKK3Z0IDAuMTAzMDQwIDAuODkyODIwCit2dCAwLjEwMzA0MCAwLjg5ODc4OQordnQgMC4xMDI1OTUgMC44OTg3ODcKK3Z0IDAuOTQ3NzYyIDAuNTExNjM5Cit2dCAwLjk0NzMyNSAwLjUwOTQzMwordnQgMC45NDc3NjIgMC41MDkzNDYKK3Z0IDAuNjQzMDU2IDAuOTQ2NjE4Cit2dCAwLjY0MzA1NiAwLjk0ODg2OAordnQgMC42NDI2MTEgMC45NDg4NjgKK3Z0IDAuODQ3NDYwIDAuNzE1MTAwCit2dCAwLjg0NzAxNCAwLjcxNTA4MgordnQgMC44NDc0NjAgMC43MDQyMjQKK3Z0IDAuODQ3MDMyIDAuNDk1MzI2Cit2dCAwLjg0NzQ3NyAwLjQ5NTMyNgordnQgMC44NDc0NzcgMC41MDYxOTMKK3Z0IDAuOTQ1OTc1IDAuNjUxNjc5Cit2dCAwLjk0NTk3NSAwLjY1NDA3MwordnQgMC45NDU1MzAgMC42NTQwNzMKK3Z0IDAuOTQ2MDU3IDAuMTgzMzI2Cit2dCAwLjk0NjA1NyAwLjE4NTcyMAordnQgMC45NDU2MTEgMC4xODU3MjAKK3Z0IDAuMTAzMDM4IDAuOTEzNjI2Cit2dCAwLjEwMjU5NSAwLjkwOTQ2MgordnQgMC4xMDMwMzggMC45MDk0MTUKK3Z0IDAuMjk4MDAzIDAuOTA5ODcyCit2dCAwLjI5ODAwMyAwLjkxNDA1OQordnQgMC4yOTc1NTcgMC45MTQwNTkKK3Z0IDAuOTQ2NzUwIDAuNDk3NjM2Cit2dCAwLjk0NjMxMyAwLjQ5NTQxMgordnQgMC45NDY3NTAgMC40OTUzMjYKK3Z0IDAuOTQ2OTgxIDAuNDg0MjA3Cit2dCAwLjk0NjU0NCAwLjQ4MTk4MwordnQgMC45NDY5ODEgMC40ODE4OTcKK3Z0IDAuOTQ4MTU4IDAuOTM2MzY1Cit2dCAwLjk0ODE1OCAwLjkzODYzMgordnQgMC45NDc3MTIgMC45Mzg2MzIKK3Z0IDAuOTQ4Nzg0IDAuOTA5MDI4Cit2dCAwLjk0ODc4NCAwLjkxMTI5NQordnQgMC45NDgzMzkgMC45MTEyOTUKK3Z0IDAuNzE4ODI4IDAuOTQxNzUyCit2dCAwLjcxODM4OSAwLjkzOTI3NgordnQgMC43MTg4MjggMC45MzkxOTgKK3Z0IDAuNTMzNjc4IDAuOTQxNzY4Cit2dCAwLjUzMzIzOSAwLjkzOTI5MwordnQgMC41MzM2NzggMC45MzkyMTUKK3Z0IDAuODM2NTgzIDAuODAwMDgxCit2dCAwLjgzNjEzOCAwLjc4NjUxNgordnQgMC44MzY1ODMgMC43ODY1MDEKK3Z0IDAuODM2Mzg3IDAuNzE3ODA0Cit2dCAwLjgzNTk0MiAwLjcwNDIzOQordnQgMC44MzYzODcgMC43MDQyMjQKK3Z0IDAuODU5Mzc5IDAuOTE0NDI4Cit2dCAwLjg1ODkzNiAwLjkxMDM0MwordnQgMC44NTkzNzkgMC45MTAyOTUKK3Z0IDAuOTE0NzMyIDAuNDUxNTI4Cit2dCAwLjkxNDczMiAwLjQ1NTYzNgordnQgMC45MTQyODcgMC40NTU2MzYKK3Z0IDAuNjMwNTAyIDAuODgzMzYyCit2dCAwLjYzMDUwMiAwLjg5MDI2MgordnQgMC42MzAwNTcgMC44OTAyNjIKK3Z0IDAuODg5MDM2IDAuMTQ3MDczCit2dCAwLjg4OTAzNiAwLjE1Mzk3NAordnQgMC44ODg1OTAgMC4xNTM5NzQKK3Z0IDAuMTY3MDY5IDAuOTIyNTkxCit2dCAwLjE2NjYyNyAwLjkxODg4OQordnQgMC4xNjcwNjkgMC45MTg4MzYKK3Z0IDAuMzE2NzAyIDAuOTIyNTA5Cit2dCAwLjMxNjI2MCAwLjkxODgwOAordnQgMC4zMTY3MDIgMC45MTg3NTUKK3Z0IDAuNzM3MDQ3IDAuOTY4MzIxCit2dCAwLjczNzA0NyAwLjk2OTMwNgordnQgMC43MzY2MDEgMC45NjkzMDYKK3Z0IDAuOTY5NTA1IDAuNTA5MzQ2Cit2dCAwLjk2OTUwNSAwLjUxMDMzMQordnQgMC45NjkwNTkgMC41MTAzMzEKK3Z0IDAuODM2Njk2IDAuNjAxMjE4Cit2dCAwLjgzNjY5NiAwLjYxNDc3NQordnQgMC44MzYyNTEgMC42MTQ3NzUKK3Z0IDAuNzA3NzYyIDAuODIzMzQ2Cit2dCAwLjcwNzc2MiAwLjgzNjkwMwordnQgMC43MDczMTYgMC44MzY5MDMKK3Z0IDAuNjMwNDUyIDAuOTcwNDU1Cit2dCAwLjYzMDA1NyAwLjk2OTY4NwordnQgMC42MzA0NTIgMC45Njk0ODMKK3Z0IDAuNTk1NDAwIDAuOTcwNjYxCit2dCAwLjU5NTAwNCAwLjk2OTg5MwordnQgMC41OTU0MDAgMC45Njk2ODgKK3Z0IDAuNTk1NDMzIDAuOTU5MDYzCit2dCAwLjU5NTAwNCAwLjk1NzUzOAordnQgMC41OTU0MzMgMC45NTc0MTgKK3Z0IDAuNjMwNDg1IDAuOTU4ODU3Cit2dCAwLjYzMDA1NyAwLjk1NzMzMgordnQgMC42MzA0ODUgMC45NTcyMTIKK3Z0IDAuNDgyNTcxIDAuOTU5NjYwCit2dCAwLjQ4MjU3MSAwLjk2MTI0NQordnQgMC40ODIxMjYgMC45NjEyNDUKK3Z0IDAuNTgzODY0IDAuOTU5NjY0Cit2dCAwLjU4Mzg2NSAwLjk2MTI0OQordnQgMC41ODM0MTkgMC45NjEyNDkKK3Z0IDAuODAzOTMyIDAuOTAwMTg1Cit2dCAwLjgwMzQ4OCAwLjg5NDU1MwordnQgMC44MDM5MzIgMC44OTQ1MTYKK3Z0IDAuODI0OTk2IDAuOTAwNDY2Cit2dCAwLjgyNDU1MiAwLjg5NDgzNQordnQgMC44MjQ5OTYgMC44OTQ3OTcKK3Z0IDAuOTgyODA3IDAuMjcxNDA4Cit2dCAwLjk4MjgxMSAwLjI3MTk3MgordnQgMC45ODIzNjYgMC4yNzE5NzIKK3Z0IDAuOTgyOTU5IDAuMjM0NDA0Cit2dCAwLjk4Mjk2MyAwLjIzNDk2OQordnQgMC45ODI1MTggMC4yMzQ5NjkKK3Z0IDAuNjk1MTUzIDAuOTYxNTAyCit2dCAwLjY5NDcyNiAwLjk2MDA1MgordnQgMC42OTUxNTMgMC45NTk5MjYKK3Z0IDAuNTQ5NTAzIDAuOTYxNjA1Cit2dCAwLjU0OTA3NiAwLjk2MDE1NQordnQgMC41NDk1MDMgMC45NjAwMjkKK3Z0IDAuOTYwMzIzIDAuMTY0OTExCit2dCAwLjk2MDMyMyAwLjE2NjUzMwordnQgMC45NTk4NzggMC4xNjY1MzMKK3Z0IDAuMzg1NTQ4IDAuOTU4NDk1Cit2dCAwLjM4NTU0OCAwLjk2MDExNwordnQgMC4zODUxMDIgMC45NjAxMTcKK3Z0IDAuMzE2NzA2IDAuOTQ2NjI1Cit2dCAwLjMxNjcwNiAwLjk0ODg3NAordnQgMC4zMTYyNjAgMC45NDg4NzQKK3Z0IDAuMzg1NTM5IDAuOTQ3ODcwCit2dCAwLjM4NTEwMiAwLjk0NTY2MwordnQgMC4zODU1MzkgMC45NDU1NzcKK3Z0IDAuOTU4MTgzIDAuNTYzMzE1Cit2dCAwLjk1ODE4MyAwLjU2NTA1NAordnQgMC45NTc3MzggMC41NjUwNTQKK3Z0IDAuOTEyODg2IDAuNTM5NjYxCit2dCAwLjkxMjQ1NSAwLjUzNzk3NwordnQgMC45MTI4ODYgMC41Mzc4NjcKK3Z0IDAuMzg1NDk3IDAuOTcxNjk4Cit2dCAwLjM4NTEwMiAwLjk3MDk1MAordnQgMC4zODU0OTcgMC45NzA3NDIKK3Z0IDAuOTcxNzM4IDAuMjcyMzY0Cit2dCAwLjk3MTM0NCAwLjI3MTYxNQordnQgMC45NzE3MzggMC4yNzE0MDgKK3Z0IDAuODkwNDMzIDAuNDQwMzk4Cit2dCAwLjg4OTk4OSAwLjQzMzUyOAordnQgMC44OTA0MzMgMC40MzM0OTkKK3Z0IDAuODkwNTUyIDAuNDE4OTg4Cit2dCAwLjg5MDEwNyAwLjQxMjExOAordnQgMC44OTA1NTIgMC40MTIwODkKK3Z0IDAuNjE5NDE1IDAuOTIzMjUxCit2dCAwLjYxODk3MyAwLjkxOTcwNQordnQgMC42MTk0MTUgMC45MTk2NTAKK3Z0IDAuNDE0ODI0IDAuOTIzMjMxCit2dCAwLjQxNDM4MSAwLjkxOTY4NQordnQgMC40MTQ4MjQgMC45MTk2MzAKK3Z0IDAuOTc2MjA1IDAuMjU0NDAyCit2dCAwLjk3NTgzMSAwLjI1MzgxNwordnQgMC45NzYyMDUgMC4yNTM1NzUKK3Z0IDAuNzY0MDc4IDAuOTc1NzQzCit2dCAwLjc2MzcwNCAwLjk3NTE1OAordnQgMC43NjQwNzggMC45NzQ5MTYKK3Z0IDAuODU5MzU5IDAuOTUyMDk3Cit2dCAwLjg1OTM4MSAwLjk1NDEyNwordnQgMC44NTg5MzYgMC45NTQxMjcKK3Z0IDAuMjE0MzQ2IDAuOTUyODU3Cit2dCAwLjIxMzkxMCAwLjk1MDg3NAordnQgMC4yMTQzNDYgMC45NTA3ODMKK3Z0IDAuOTY4ODg5IDAuNTc1Nzg2Cit2dCAwLjk2ODg4OSAwLjU3NjgyOAordnQgMC45Njg0NDQgMC41NzY4MjgKK3Z0IDAuODcwNTQwIDAuOTY4MDU0Cit2dCAwLjg3MDEzMCAwLjk2NzA5NQordnQgMC44NzA1NDAgMC45NjY5MjAKK3Z0IDAuODAzOTMzIDAuOTUyMjk0Cit2dCAwLjgwMzkzMyAwLjk1NDI5OQordnQgMC44MDM0ODggMC45NTQyOTkKK3Z0IDAuODgxNjQ2IDAuOTUzOTI2Cit2dCAwLjg4MTIxMSAwLjk1MTk2OQordnQgMC44ODE2NDYgMC45NTE4NzIKK3Z0IDAuNzM3MDMzIDAuOTU3Njk2Cit2dCAwLjczNjYwMSAwLjk1NjAyMwordnQgMC43MzcwMzMgMC45NTU5MTIKK3Z0IDAuOTU3ODA5IDAuNDk3MTA5Cit2dCAwLjk1NzM3NyAwLjQ5NTQzNwordnQgMC45NTc4MDkgMC40OTUzMjYKK3Z0IDAuODkwODYwIDAuNjUxNjc5Cit2dCAwLjg5MDg2MiAwLjY1ODU1OAordnQgMC44OTA0MTYgMC42NTg1NTgKK3Z0IDAuODkwNTgxIDAuNTI5Njc3Cit2dCAwLjg5MDEzNiAwLjUyMjgxMgordnQgMC44OTA1ODEgMC41MjI3ODQKK3Z0IDAuOTY5ODUxIDAuODkzMjgxCit2dCAwLjk2OTg1MSAwLjg5NDIyMAordnQgMC45Njk0MDUgMC44OTQyMjAKK3Z0IDAuMDQ5OTI0IDAuOTY4OTEyCit2dCAwLjA0OTUyMiAwLjk2ODA2NAordnQgMC4wNDk5MjQgMC45Njc4NzMKK3Z0IDAuOTY4MjI1IDAuNjAxMjE4Cit2dCAwLjk2ODIyNSAwLjYwMjMzMwordnQgMC45Njc3ODAgMC42MDIzMzIKK3Z0IDAuOTY4MjUyIDAuNzk5MDUzCit2dCAwLjk2ODI1NCAwLjgwMDE2OQordnQgMC45Njc4MDkgMC44MDAxNjkKK3Z0IDAuNjk1MTcwIDAuOTMzNjg0Cit2dCAwLjY5NTE3MiAwLjkzNjQ1MQordnQgMC42OTQ3MjYgMC45MzY0NTEKK3Z0IDAuMTY3MDY3IDAuOTM2MDE4Cit2dCAwLjE2NjYyNyAwLjkzMzI4NwordnQgMC4xNjcwNjcgMC45MzMyMTYKK3Z0IDAuMzczODc1IDAuOTIzMTY4Cit2dCAwLjM3MzQzMyAwLjkxOTYxOQordnQgMC4zNzM4NzUgMC45MTk1NjQKK3Z0IDAuMzU3MTI2IDAuOTIzMjI4Cit2dCAwLjM1NjY4MyAwLjkxOTY3OQordnQgMC4zNTcxMjYgMC45MTk2MjQKK3Z0IDAuMjE0MzQ5IDAuOTQwMTU4Cit2dCAwLjIxMzkxMCAwLjkzNzY0NQordnQgMC4yMTQzNDkgMC45Mzc1NjgKK3Z0IDAuODgxNjU2IDAuOTM4Njk2Cit2dCAwLjg4MTY1NyAwLjk0MTI0NwordnQgMC44ODEyMTEgMC45NDEyNDcKK3Z0IDAuOTI2NDAxIDAuOTIyNTA2Cit2dCAwLjkyNjQwMyAwLjkyNTcxNAordnQgMC45MjU5NTcgMC45MjU3MTQKK3Z0IDAuOTI2NDAzIDAuODkzMjgxCit2dCAwLjkyNjQwMyAwLjg5NjQ4OAordnQgMC45MjU5NTggMC44OTY0ODgKK3Z0IDAuOTY4MzI1IDAuMzg4NzMwCit2dCAwLjk2NzkxNyAwLjM4Nzc4NQordnQgMC45NjgzMjUgMC4zODc2MDYKK3Z0IDAuOTY4MzI3IDAuNzE4NzM4Cit2dCAwLjk2NzkxOSAwLjcxNzc5MwordnQgMC45NjgzMjcgMC43MTc2MTQKK3Z0IDAuODM2NTc5IDAuOTI4MjIzCit2dCAwLjgzNjEzOCAwLjkyNTE1NwordnQgMC44MzY1NzkgMC45MjUwOTYKK3Z0IDAuMTQ4MDQ1IDAuOTI1MTE5Cit2dCAwLjE0ODA0NSAwLjkyODIxNwordnQgMC4xNDc1OTkgMC45MjgyMTQKK3Z0IDAuODQ4MTA3IDAuODY2NTczCit2dCAwLjg0NzY2MiAwLjg2NjU0OQordnQgMC44NDgxMDcgMC44NTcyMTEKK3Z0IDAuODM2NTgzIDAuODY2ODM5Cit2dCAwLjgzNjEzOCAwLjg2NjgxNQordnQgMC44MzY1ODMgMC44NTc0NzYKK3Z0IDAuMjI4NDY1IDAuOTc2MjE1Cit2dCAwLjIyODA5MyAwLjk3NTYzOQordnQgMC4yMjg0NjUgMC45NzUzOTUKK3Z0IDAuMjE0MjgzIDAuOTc2MjM3Cit2dCAwLjIxMzkxMCAwLjk3NTY2MQordnQgMC4yMTQyODMgMC45NzU0MTcKK3Z0IDAuMjAzMjY0IDAuOTA5MjIxCit2dCAwLjIwMjgyMCAwLjkwNDYyMAordnQgMC4yMDMyNjQgMC45MDQ1NzUKK3Z0IDAuNTQ5NTE5IDAuOTA5MDc4Cit2dCAwLjU0OTA3NiAwLjkwNDQ3OAordnQgMC41NDk1MTkgMC45MDQ0MzIKK3Z0IDAuOTM0OTAyIDAuNjU0NTY3Cit2dCAwLjkzNDQ2MyAwLjY1MTc1MAordnQgMC45MzQ5MDIgMC42NTE2NzkKK3Z0IDAuOTM0OTg0IDAuMTg2MjE0Cit2dCAwLjkzNDU0NCAwLjE4MzM5NwordnQgMC45MzQ5ODQgMC4xODMzMjYKK3Z0IDAuOTE1MzMwIDAuODk3MzU4Cit2dCAwLjkxNDg4NyAwLjg5MzMyNwordnQgMC45MTUzMzAgMC44OTMyODEKK3Z0IDAuODI0OTk2IDAuOTE1MTY4Cit2dCAwLjgyNDU1MiAwLjkxMTEzOAordnQgMC44MjQ5OTYgMC45MTEwOTIKK3Z0IDAuMDQ5OTY3IDAuOTU1NDcwCit2dCAwLjA0OTk2NyAwLjk1NzI0OAordnQgMC4wNDk1MjIgMC45NTcyNDgKK3Z0IDAuOTU3MzczIDAuNjY0Njc0Cit2dCAwLjk1NzM3MyAwLjY2NjQ1MgordnQgMC45NTY5MjcgMC42NjY0NTIKK3Z0IDAuOTY4NjAxIDAuNTM3NjczCit2dCAwLjk2ODE5NSAwLjUzNjc0MQordnQgMC45Njg2MDEgMC41MzY1NTgKK3Z0IDAuOTY4NDI3IDAuNDAxMjcxCit2dCAwLjk2ODAyMSAwLjQwMDMzOQordnQgMC45Njg0MjcgMC40MDAxNTYKK3Z0IDAuMTY3MTI4IDAuODkyNzUxCit2dCAwLjE2NjY4NCAwLjg4NjQzNQordnQgMC4xNjcxMjggMC44ODY0MDAKK3Z0IDAuMDM2Nzc3IDAuODkyMzkzCit2dCAwLjAzNjMzMyAwLjg4NjA3NwordnQgMC4wMzY3NzcgMC44ODYwNDIKK3Z0IDAuOTgwMDI0IDAuNjkxNDMxCit2dCAwLjk3OTY3MyAwLjY5MDk4NgordnQgMC45ODAwMjQgMC42OTA3MTIKK3Z0IDAuOTgyNDE0IDAuMTY0OTExCit2dCAwLjk4MjQxOCAwLjE2NTQ3OAordnQgMC45ODE5NzIgMC4xNjU0NzgKK3Z0IDAuMzk5NzAwIDAuOTM4NTg3Cit2dCAwLjM5OTI2MSAwLjkzNjAwNgordnQgMC4zOTk3MDAgMC45MzU5MjkKK3Z0IDAuOTM2MjU4IDAuNjkzMzcwCit2dCAwLjkzNTgxOSAwLjY5MDc4OQordnQgMC45MzYyNTggMC42OTA3MTIKK3Z0IDAuODkyNzI1IDAuOTc1MjA5Cit2dCAwLjg5MjczMCAwLjk3NTk1NAordnQgMC44OTIyODQgMC45NzU5NTQKK3Z0IDAuMzk5NjQ0IDAuOTc0ODI5Cit2dCAwLjM5OTI2MSAwLjk3NDE5MAordnQgMC4zOTk2NDQgMC45NzM5NjMKK3Z0IDAuOTAyMzY4IDAuNzMwNDk3Cit2dCAwLjkwMjM2OCAwLjczNTg2NwordnQgMC45MDE5MjMgMC43MzU4NjUKK3Z0IDAuOTAyMDY0IDAuMzkyOTkyCit2dCAwLjkwMTYyMCAwLjM4NzY0MAordnQgMC45MDIwNjQgMC4zODc2MDYKK3Z0IDAuODI0OTE3IDAuOTc4MjkzCit2dCAwLjgyNDU1MiAwLjk3Nzc2OQordnQgMC44MjQ5MTcgMC45Nzc1MTMKK3Z0IDAuMTg5MTI4IDAuOTc4Mjg1Cit2dCAwLjE4ODc2NCAwLjk3Nzc2MQordnQgMC4xODkxMjggMC45Nzc1MDQKK3Z0IDAuOTQ4MDg5IDAuOTc1MzIyCit2dCAwLjk0NzcxMiAwLjk3NDcxNQordnQgMC45NDgwODkgMC45NzQ0NzgKK3Z0IDAuMjU5NjA1IDAuOTc1Mzg2Cit2dCAwLjI1OTIyOCAwLjk3NDc3OQordnQgMC4yNTk2MDUgMC45NzQ1NDIKK3Z0IDAuOTI1NDk1IDAuODc5MjM3Cit2dCAwLjkyNTA1MyAwLjg3NTk0NAordnQgMC45MjU0OTUgMC44NzU4ODcKK3Z0IDAuOTI1NDgxIDAuODU3NjYwCit2dCAwLjkyNTUwMyAwLjg2MDk4MwordnQgMC45MjUwNTcgMC44NjA5ODMKK3Z0IDAuNjU1MDMxIDAuOTQ3MjIwCit2dCAwLjY1NTAzMiAwLjk0OTQ0NQordnQgMC42NTQ1ODYgMC45NDk0NDUKK3Z0IDAuNjE5NDE5IDAuOTQ3MjEzCit2dCAwLjYxOTQxOSAwLjk0OTQzOAordnQgMC42MTg5NzMgMC45NDk0MzgKK3Z0IDAuOTQ2MzQ0IDAuNzg4ODQyCit2dCAwLjk0NTkwNiAwLjc4NjU4NgordnQgMC45NDYzNDQgMC43ODY1MDEKK3Z0IDAuOTQ2MzQ0IDAuODAxODA4Cit2dCAwLjk0NTkwNiAwLjc5OTU1MgordnQgMC45NDYzNDQgMC43OTk0NjcKK3Z0IDAuMzQzNDU5IDAuOTQ4Nzg5Cit2dCAwLjM0MzAyMyAwLjk0NjYwNgordnQgMC4zNDM0NTkgMC45NDY1MTkKK3Z0IDAuNzkyNzIzIDAuOTQ3MDcxCit2dCAwLjc5MjcyNCAwLjk0OTI5NwordnQgMC43OTIyNzggMC45NDkyOTcKK3Z0IDAuOTQ3MzMwIDAuNjkwNzEyCit2dCAwLjk0NzMzMCAwLjY5MzAxMQordnQgMC45NDY4ODUgMC42OTMwMTEKK3Z0IDAuOTQ2Mjg3IDAuMzg5OTQ4Cit2dCAwLjk0NTg1MCAwLjM4NzY5MQordnQgMC45NDYyODcgMC4zODc2MDYKK3Z0IDAuODM2Mzg3IDAuNjkwNjgxCit2dCAwLjgzNTk0MiAwLjY3NzExNQordnQgMC44MzYzODcgMC42NzcxMDAKK3Z0IDAuODM2NTgzIDAuODEyNTU1Cit2dCAwLjgzNjU4MyAwLjgyNjEyOQordnQgMC44MzYxMzggMC44MjYxMjkKK3Z0IDAuOTYyNjE2IDAuMjkxNTU0Cit2dCAwLjk2MjE5MSAwLjI5MDE5NgordnQgMC45NjI2MTYgMC4yOTAwNjQKK3Z0IDAuOTYyNjY3IDAuMDQ3MzY4Cit2dCAwLjk2MjI0MiAwLjA0NjAxMAordnQgMC45NjI2NjcgMC4wNDU4NzcKK3Z0IDAuOTYyNDE4IDAuMDA2ODA1Cit2dCAwLjk2MTk5MiAwLjAwNTQ0NgordnQgMC45NjI0MTggMC4wMDUzMTMKK3Z0IDAuMzk5NzA2IDAuOTYxOTE0Cit2dCAwLjM5OTcwNiAwLjk2MzMzOAordnQgMC4zOTkyNjEgMC45NjMzMzgKK3Z0IDAuMzg1NTQ3IDAuOTgyMzI0Cit2dCAwLjM4NTU0OCAwLjk4Mjg2OAordnQgMC4zODUxMDIgMC45ODI4NjgKK3Z0IDAuMDM2Nzc4IDAuOTgyNDYwCit2dCAwLjAzNjc3OCAwLjk4MzAwNAordnQgMC4wMzYzMzMgMC45ODMwMDMKK3Z0IDAuMDgxNTgwIDAuOTIzMDM0Cit2dCAwLjA4MTEzOCAwLjkxOTQ2MwordnQgMC4wODE1ODAgMC45MTk0MDgKK3Z0IDAuNzkyNzIwIDAuOTIzMDc4Cit2dCAwLjc5MjI3OCAwLjkxOTUwNwordnQgMC43OTI3MjAgMC45MTk0NTEKK3Z0IDAuOTI0MTc1IDAuMzcyNDQwCit2dCAwLjkyNDE4MyAwLjM3NTkxMQordnQgMC45MjM3MzcgMC4zNzU5MTAKK3Z0IDAuOTI0MjAxIDAuMzg3NjA2Cit2dCAwLjkyNDIwOSAwLjM5MTA3NgordnQgMC45MjM3NjQgMC4zOTEwNzYKK3Z0IDAuNTk1MzQwIDAuOTgxOTY1Cit2dCAwLjU5NTAwNCAwLjk4MTU3OQordnQgMC41OTUzNDAgMC45ODEyODYKK3Z0IDAuNjMwMzkyIDAuOTgxNzU5Cit2dCAwLjYzMDA1NyAwLjk4MTM3MwordnQgMC42MzAzOTIgMC45ODEwODAKK3Z0IDAuMzQzNDY4IDAuOTU5NDE1Cit2dCAwLjM0MzQ2OCAwLjk2MTAwMAordnQgMC4zNDMwMjMgMC45NjEwMDAKK3Z0IDAuMjc4NzQzIDAuOTU5Mzk1Cit2dCAwLjI3ODc0MyAwLjk2MDk4MAordnQgMC4yNzgyOTcgMC45NjA5ODAKK3Z0IDAuMzczODc4IDAuOTU5Njg2Cit2dCAwLjM3Mzg3OCAwLjk2MTI3MAordnQgMC4zNzM0MzMgMC45NjEyNzAKK3Z0IDAuOTYwMjE3IDAuNzczMTcwCit2dCAwLjk1OTc4OCAwLjc3MTY0NQordnQgMC45NjAyMTcgMC43NzE1MjUKK3Z0IDAuMzU3MTI5IDAuOTYwMzMwCit2dCAwLjM1NzEyOSAwLjk2MTg0MgordnQgMC4zNTY2ODMgMC45NjE4NDIKK3Z0IDAuOTYyMjkwIDAuMDY2NzMzCit2dCAwLjk2MjI5MCAwLjA2ODI0NQordnQgMC45NjE4NDQgMC4wNjgyNDUKK3Z0IDAuNTcwODY1IDAuOTU4NTk2Cit2dCAwLjU3MDQzNiAwLjk1NzA3MAordnQgMC41NzA4NjUgMC45NTY5NTAKK3Z0IDAuMzE2NzA2IDAuOTU5NDk5Cit2dCAwLjMxNjcwNiAwLjk2MTA4NAordnQgMC4zMTYyNjAgMC45NjEwODQKK3Z0IDAuOTQ3MTM0IDAuNTc4MDk2Cit2dCAwLjk0NjY5NyAwLjU3NTg3MgordnQgMC45NDcxMzQgMC41NzU3ODYKK3Z0IDAuOTQ2ODg1IDAuNTM4ODY4Cit2dCAwLjk0NjQ0OCAwLjUzNjY0NAordnQgMC45NDY4ODUgMC41MzY1NTgKK3Z0IDAuOTQ4MTYyIDAuOTIyNTA2Cit2dCAwLjk0ODE2MiAwLjkyNDc3MwordnQgMC45NDc3MTYgMC45MjQ3NzMKK3Z0IDAuMzMxNDEwIDAuOTQ2MDc5Cit2dCAwLjMzMTQxMCAwLjk0ODM0NQordnQgMC4zMzA5NjQgMC45NDgzNDUKK3Z0IDAuOTAyMjI0IDAuNjc3MTAwCit2dCAwLjkwMjI2NyAwLjY4MjQ4NAordnQgMC45MDE4MjEgMC42ODI0ODQKK3Z0IDAuOTAyMTk4IDAuNzU0OTc5Cit2dCAwLjkwMjE5OCAwLjc2MDM2MwordnQgMC45MDE3NTIgMC43NjAzNjAKK3Z0IDAuODcwNDgxIDAuOTc5NDA4Cit2dCAwLjg3MDEzMCAwLjk3ODk1MwordnQgMC44NzA0ODEgMC45Nzg2NzkKK3Z0IDAuMTM1NTE1IDAuOTc5MjM1Cit2dCAwLjEzNTE2MyAwLjk3ODc3OQordnQgMC4xMzU1MTUgMC45Nzg1MDYKK3Z0IDAuMTg5MjEwIDAuOTM5NDYwCit2dCAwLjE4OTIxMCAwLjk0MTk3NQordnQgMC4xODg3NjQgMC45NDE5NzUKK3Z0IDAuODU5Mzc0IDAuOTQxNDcyCit2dCAwLjg1ODkzNiAwLjkzODk5NgordnQgMC44NTkzNzQgMC45Mzg5MTgKK3Z0IDAuOTY5NjgxIDAuODU4NjcwCit2dCAwLjk2OTI4MSAwLjg1Nzg1NgordnQgMC45Njk2ODEgMC44NTc2NjAKK3Z0IDAuOTY5Njg1IDAuNTg5NzMxCit2dCAwLjk2OTI4NSAwLjU4ODkxOAordnQgMC45Njk2ODUgMC41ODg3MjEKK3Z0IDAuODg1NTM3IDAuMjk3MDUwCit2dCAwLjg4NTA5MyAwLjI5MDA5MgordnQgMC44ODU1MzcgMC4yOTAwNjQKK3Z0IDAuODg1Njk3IDAuMzE0ODMyCit2dCAwLjg4NTI1MyAwLjMwNzg3MwordnQgMC44ODU2OTcgMC4zMDc4NDUKK3Z0IDAuNDQzNzE5IDAuOTcxNzAxCit2dCAwLjQ0MzcxOSAwLjk3MjU3NAordnQgMC40NDMyNzMgMC45NzI1NzQKK3Z0IDAuNjQzMDU2IDAuOTcxNzAzCit2dCAwLjY0MzA1NiAwLjk3MjU3NgordnQgMC42NDI2MTEgMC45NzI1NzYKK3Z0IDAuOTE2NDQxIDAuNzcxNTI1Cit2dCAwLjkxNjQ0MSAwLjc3NTU3NAordnQgMC45MTU5OTYgMC43NzU1NzQKK3Z0IDAuMTM1NjA5IDAuOTEyMjA0Cit2dCAwLjEzNTYwOSAwLjkxNjI1NAordnQgMC4xMzUxNjMgMC45MTYyNTQKK3Z0IDAuMDE5MDM3IDAuOTEzNzQyCit2dCAwLjAxODU5NCAwLjkwOTU3OAordnQgMC4wMTkwMzcgMC45MDk1MzEKK3Z0IDAuOTEzODQ3IDAuNTU0NTM2Cit2dCAwLjkxMzQwNCAwLjU1MDM3MgordnQgMC45MTM4NDcgMC41NTAzMjUKK3Z0IDAuODkxNDM4IDAuNzkzMjkwCit2dCAwLjg5MDk5MyAwLjc4NjUzMQordnQgMC44OTE0MzggMC43ODY1MDEKK3Z0IDAuNTk1NDQ5IDAuODkxMjc0Cit2dCAwLjU5NTAwNCAwLjg4NDUxNQordnQgMC41OTU0NDkgMC44ODQ0ODUKK3Z0IDAuOTY4MDkxIDAuNzU0OTc5Cit2dCAwLjk2ODA5MSAwLjc1NjEwNgordnQgMC45Njc2NDUgMC43NTYxMDYKK3Z0IDAuOTY4MTE0IDAuNTIyNzg0Cit2dCAwLjk2ODExNCAwLjUyMzkxMAordnQgMC45Njc2NjggMC41MjM5MTAKK3Z0IDAuNTcwODgxIDAuODg0NjI3Cit2dCAwLjU3MDg4MSAwLjg5MTQwMQordnQgMC41NzA0MzYgMC44OTE0MDEKK3Z0IDAuODkxMzY4IDAuNjA4MDA3Cit2dCAwLjg5MDkyNCAwLjYwMTI0NwordnQgMC44OTEzNjggMC42MDEyMTgKK3Z0IDAuODQ4MTY2IDAuOTE1Mzc2Cit2dCAwLjg0NzcyMyAwLjkxMTM1MQordnQgMC44NDgxNjYgMC45MTEzMDMKK3Z0IDAuODcwNTczIDAuOTE2MDE3Cit2dCAwLjg3MDEzMCAwLjkxMTk5MgordnQgMC44NzA1NzMgMC45MTE5NDMKK3Z0IDAuMTM1NjA5IDAuODc5Njk1Cit2dCAwLjEzNTYwOSAwLjg4NjY2OAordnQgMC4xMzUxNjMgMC44ODY2NjgKK3Z0IDAuMTQ4MDQ1IDAuODc5Mzg0Cit2dCAwLjE0ODA0NSAwLjg4NjM1NwordnQgMC4xNDc1OTkgMC44ODYzNTcKK3Z0IDAuODg4Nzc2IDAuMjYwNDg5Cit2dCAwLjg4ODMzMSAwLjI1MzYwMwordnQgMC44ODg3NzYgMC4yNTM1NzUKK3Z0IDAuNzM3MDQ2IDAuODg4ODMxCit2dCAwLjczNjYwMSAwLjg4MTk0NQordnQgMC43MzcwNDYgMC44ODE5MTYKK3Z0IDAuOTEzNDU4IDAuNjA1NTc5Cit2dCAwLjkxMzAxNSAwLjYwMTI2NgordnQgMC45MTM0NTggMC42MDEyMTgKK3Z0IDAuOTEzNDM4IDAuNzM0ODU4Cit2dCAwLjkxMjk5NSAwLjczMDU0NQordnQgMC45MTM0MzggMC43MzA0OTcKK3Z0IDAuOTc5MDE2IDAuNjQwNTcyCit2dCAwLjk3ODY1NSAwLjY0MDA3NwordnQgMC45NzkwMTYgMC42Mzk4MTcKK3Z0IDAuOTc5MDM0IDAuNjc3ODU1Cit2dCAwLjk3ODY3MyAwLjY3NzM2MAordnQgMC45NzkwMzQgMC42NzcxMDAKK3Z0IDAuOTI1Mzg3IDAuNTc5MTgwCit2dCAwLjkyNDk0NiAwLjU3NTg0NwordnQgMC45MjUzODcgMC41NzU3ODYKK3Z0IDAuOTI0OTE2IDAuNTUzNzE5Cit2dCAwLjkyNDQ3NCAwLjU1MDM4NgordnQgMC45MjQ5MTYgMC41NTAzMjUKK3Z0IDAuNTMzNjg1IDAuOTc3NjY3Cit2dCAwLjUzMzY4NSAwLjk3ODM1MgordnQgMC41MzMyMzkgMC45NzgzNDkKK3Z0IDAuNDI2MDg5IDAuOTc3Njc3Cit2dCAwLjQyNjA5MyAwLjk3ODM2MQordnQgMC40MjU2NDggMC45NzgzNjEKK3Z0IDAuNzgxNjUxIDAuOTE5MjgwCit2dCAwLjc4MTY1MSAwLjkyMjk3MAordnQgMC43ODEyMDUgMC45MjI5NjcKK3Z0IDAuNjY2MjgyIDAuOTE5MTc1Cit2dCAwLjY2NjI4MiAwLjkyMjg2NAordnQgMC42NjU4MzYgMC45MjI4NjIKK3Z0IDAuODgxNjU1IDAuODk5NDE0Cit2dCAwLjg4MTIxMSAwLjg5MzY4MQordnQgMC44ODE2NTUgMC44OTM2NDQKK3Z0IDAuODk5NDQ2IDAuMzM5Njc1Cit2dCAwLjg5OTAwMiAwLjMzMzk0MgordnQgMC44OTk0NDYgMC4zMzM5MDUKK3Z0IDAuMjI4NTM4IDAuOTA5MzM0Cit2dCAwLjIyODUzOCAwLjkxMzU2MwordnQgMC4yMjgwOTMgMC45MTM1NjEKK3Z0IDAuOTEzNzUwIDAuNDk1MzI2Cit2dCAwLjkxMzc3NSAwLjQ5OTU1NQordnQgMC45MTMzMzAgMC40OTk1NTUKK3Z0IDAuOTMyNjUzIDAuMzM2ODYzCit2dCAwLjkzMjIxMyAwLjMzMzk3NQordnQgMC45MzI2NTMgMC4zMzM5MDUKK3Z0IDAuNzM3MDQxIDAuOTMyNzQ5Cit2dCAwLjczNjYwMSAwLjkyOTg2MgordnQgMC43MzcwNDEgMC45Mjk3OTIKK3Z0IDAuMjAzMjY2IDAuODM3ODA4Cit2dCAwLjIwMjgyMCAwLjgzNzc5MAordnQgMC4yMDMyNjYgMC44MjY0NzkKK3Z0IDAuODQwMTg5IDAuMjcxNDA4Cit2dCAwLjg0MDYzNCAwLjI3MTQwOAordnQgMC44NDA2MzQgMC4yODI3MjcKK3Z0IDAuMDkyMDI3IDAuMjYwNTE3Cit2dCAwLjA5MjAyOCAwLjI1MjE3NgordnQgMC4wOTIwMjggMC4yMzk4ODMKK3Z0IDAuMDkyMDI4IDAuMjM0NTU1Cit2dCAwLjA5MjAyOCAwLjIyODMyMQordnQgMC4wOTIwMjggMC4yMTY4NzEKK3Z0IDAuMTI1MTQ3IDAuMzQ4NzUwCit2dCAwLjExMzc5OCAwLjM0ODc1MAordnQgMC4xMDI3MDYgMC4zNDg3NDkKK3Z0IDAuMDkyMDI3IDAuMzQ4NzUwCit2dCAwLjA5MjAyNyAwLjMzNTM3MwordnQgMC4wOTIwMjcgMC4zMDMxNzYKK3Z0IDAuMDkyMDI3IDAuMjkzMzA2Cit2dCAwLjA5MjAyNyAwLjI4Mzg4MAordnQgMC4wOTIwMjcgMC4yNzI0ODYKK3Z0IDAuMDkyMDI3IDAuMzE4NzYxCit2dCAwLjA5MjAyOCAwLjIwOTgxMAordnQgMC4xMTM3OTggMC4zNjkyODUKK3Z0IDAuMDkxOTQ3IDAuMzY5Mjg1Cit2dCAwLjA5MjAyOCAwLjE5OTQ3NQordnQgMC4wNzE4ODkgMC4yMTA3MDEKK3Z0IDAuMDcxODg5IDAuMTc5MTU1Cit2dCAwLjEzNTY0OSAwLjM2OTI4NQordnQgMC4xNTU3MDggMC4zNjkyODUKK3Z0IDAuMDcxODg5IDAuMzY5Mjg1Cit2dCAwLjE1NTcwOCAwLjIxMDcwMQordnQgMC4xNTU3MDcgMC4xNzkxNTUKK3Z0IDAuNzM1Mjg5IDAuMDcyOTM3Cit2dCAwLjczNTczNSAwLjA3MjkzNwordnQgMC43MzU3MzYgMC4wOTg3MzQKK3Z0IDAuNzM1MjkwIDAuMDk4NzM0Cit2dCAwLjczNTczNyAwLjExNzcxMQordnQgMC43MzUyOTEgMC4xMTc3MTEKK3Z0IDAuNzM1NzM4IDAuMTM2NjQ3Cit2dCAwLjczNTI5MiAwLjEzNjY0NwordnQgMC43MzU3NDMgMC4yNjI5MzMKK3Z0IDAuNzM1Mjk3IDAuMjYyOTMzCit2dCAwLjczNTI5NiAwLjIzMTQyNAordnQgMC43MzU3NDIgMC4yMzE0MjQKK3Z0IDAuNzM1Mjk1IDAuMjEyMzUxCit2dCAwLjczNTc0MSAwLjIxMjM1MQordnQgMC43MzUyOTQgMC4xOTM0MjkKK3Z0IDAuNzM1NzQwIDAuMTkzNDI5Cit2dCAwLjc0OTQ4OCAwLjA3Mjc1OQordnQgMC43NTI1MzMgMC4wNzI4MDIKK3Z0IDAuNzUyNTMzIDAuMDk4NjE0Cit2dCAwLjc0OTQ4OCAwLjA5ODU5MwordnQgMC43NTI1MzMgMC4xMTc2MDMKK3Z0IDAuNzQ5NDg4IDAuMTE3NTU5Cit2dCAwLjc1MjUzMyAwLjEzNjU1MAordnQgMC43NDk0ODggMC4xMzY1MDMKK3Z0IDAuNzUyNTMzIDAuMjYyOTMzCit2dCAwLjc0OTQ4OCAwLjI2Mjg4NQordnQgMC43NDk0ODggMC4yMzEzNDMKK3Z0IDAuNzUyNTMzIDAuMjMxMzkxCit2dCAwLjc0OTQ4OCAwLjIxMjI1NQordnQgMC43NTI1MzMgMC4yMTIzMDAKK3Z0IDAuNzQ5NDg4IDAuMTkzMzE5Cit2dCAwLjc1MjUzMyAwLjE5MzM2NgordnQgMC4yMTkyMzkgMC4zNDM0NzkKK3Z0IDAuMjE5MjM5IDAuMzY5MzE2Cit2dCAwLjIxNDcyOSAwLjM2OTI5OAordnQgMC4yMTQ3MjkgMC4zNDM0MjgKK3Z0IDAuMjE5MjM5IDAuMzI0NTExCit2dCAwLjIxNDcyOSAwLjMyNDQ5NAordnQgMC4yMTkyMzkgMC4zMDU1NjYKK3Z0IDAuMjE0NzI5IDAuMzA1NTU0Cit2dCAwLjIxOTIzOSAwLjE3OTE4OAordnQgMC4yMTQ3MzAgMC4yMTA3MDgKK3Z0IDAuMjE0NzMwIDAuMTc5MTY4Cit2dCAwLjIxOTIzOSAwLjIxMDcyMgordnQgMC4yMTQ3MzAgMC4yMjk3OTEKK3Z0IDAuMjE5MjM5IDAuMjI5ODA3Cit2dCAwLjIxNDcyOSAwLjI0ODczMwordnQgMC4yMTkyMzkgMC4yNDg3NDUKK3Z0IDAuNzMxNTY5IDAuMDcyOTM2Cit2dCAwLjczMTc0MyAwLjA3MjkzNgordnQgMC43MzE3NDQgMC4wOTg3MzMKK3Z0IDAuNzMxNTcwIDAuMDk4NzMzCit2dCAwLjczMTc0NSAwLjExNzcxMAordnQgMC43MzE1NzEgMC4xMTc3MTAKK3Z0IDAuNzMxNzQ2IDAuMTM2NjQ2Cit2dCAwLjczMTU3MSAwLjEzNjY0NgordnQgMC43MzE3NTEgMC4yNjI5MzIKK3Z0IDAuNzMxNzUwIDAuMjMxNDIzCit2dCAwLjczMTc0OSAwLjIxMjM1MAordnQgMC43MzE3NDggMC4xOTM0MjgKK3Z0IDAuMDE0ODQ0IDAuMzY5Mjg1Cit2dCAwLjAxMTQ2MiAwLjM2OTI5OAordnQgMC4wMTE0NjIgMC4zNDM0MjgKK3Z0IDAuMDE0ODQ0IDAuMzQzMzgzCit2dCAwLjAxMTQ2MiAwLjMyNDQ5NAordnQgMC4wMTQ4NDQgMC4zMjQ0ODMKK3Z0IDAuMDExNDYzIDAuMzA1NTU0Cit2dCAwLjAxNDg0NCAwLjMwNTU0OQordnQgMC4wMTE0NjMgMC4xNzkxNjEKK3Z0IDAuMDE0ODQ0IDAuMTc5MTU1Cit2dCAwLjAxNDg0NCAwLjIxMDcwMQordnQgMC4wMTE0NjMgMC4yMTA3MDUKK3Z0IDAuMDE0ODQ0IDAuMjI5NzgyCit2dCAwLjAxMTQ2MyAwLjIyOTc5MQordnQgMC4wMTQ4NDQgMC4yNDg3MjcKK3Z0IDAuMDExNDYzIDAuMjQ4NzMzCit2dCAwLjIxMDI0MiAwLjM2OTI4NgordnQgMC4yMDY0NDYgMC4zNjkyODYKK3Z0IDAuMjA2NDQ2IDAuMzQzMzgzCit2dCAwLjIxMDI0MiAwLjM0MzM4MwordnQgMC4yMDY0NDYgMC4zMjQ0ODMKK3Z0IDAuMjEwMjQyIDAuMzI0NDgzCit2dCAwLjIwNjQ0NiAwLjMwNTU0OQordnQgMC4yMTAyNDIgMC4zMDU1NDkKK3Z0IDAuMjA2NDQ3IDAuMTc5MTU1Cit2dCAwLjIxMDI0MiAwLjE3OTE1NQordnQgMC4yMTAyNDIgMC4yMTA3MDEKK3Z0IDAuMjA2NDQ3IDAuMjEwNzAxCit2dCAwLjIxMDI0MiAwLjIyOTc4MgordnQgMC4yMDY0NDcgMC4yMjk3ODIKK3Z0IDAuMjEwMjQyIDAuMjQ4NzI3Cit2dCAwLjIwNjQ0NiAwLjI0ODcyNwordnQgMC4xODE3NjUgMC4zNjkyODYKK3Z0IDAuMTczNzIxIDAuMzY5Mjg2Cit2dCAwLjE3MzcyMSAwLjM0MzM4MwordnQgMC4xODE3NjUgMC4zNDMzODMKK3Z0IDAuMTczNzIxIDAuMzI0NDgzCit2dCAwLjE4MTc2NSAwLjMyNDQ4MwordnQgMC4xNzM3MjEgMC4zMDU1NDkKK3Z0IDAuMTgxNzY1IDAuMzA1NTQ5Cit2dCAwLjE2NDY2MiAwLjE3OTE1NQordnQgMC4xNjQ2NjIgMC4yMTA3MDEKK3Z0IDAuMTY0NjYyIDAuMjI5NzgyCit2dCAwLjE1NTcwOCAwLjIyOTc4MgordnQgMC4xNjQ2NjIgMC4yNDg3MjcKK3Z0IDAuMTU1NzA4IDAuMjQ4NzI3Cit2dCAwLjE2NDY2MiAwLjI2NzY1NwordnQgMC4xNTU3MDggMC4yNjc2NTcKK3Z0IDAuNzUyOTc5IDAuMjYyOTMzCit2dCAwLjc1Mjk3OSAwLjIzMTM5MQordnQgMC43NTI5NzkgMC4yMTIzMDAKK3Z0IDAuNzUyOTc5IDAuMTkzMzY2Cit2dCAwLjc1Mjk3OSAwLjA3MjgwMgordnQgMC43NTI5NzkgMC4wOTg2MTQKK3Z0IDAuNzUyOTc5IDAuMTE3NjAzCit2dCAwLjc1Mjk3OSAwLjEzNjU1MAordnQgMC43Mzg4NTMgMC4yMzEzMTEKK3Z0IDAuNzM4ODU1IDAuMjYyODI0Cit2dCAwLjczODg1MyAwLjIxMjI0MAordnQgMC43Mzg4NTIgMC4xOTMzMTUKK3Z0IDAuNzM4ODQ3IDAuMDcyODI4Cit2dCAwLjczODg0OCAwLjA5ODY0NgordnQgMC43Mzg4NDkgMC4xMTc2MDEKK3Z0IDAuNzM4ODQ5IDAuMTM2NTMzCit2dCAwLjAwODM1MyAwLjE3OTE3MgordnQgMC4wMDgzNTMgMC4yMTA3MTcKK3Z0IDAuMDA4MzUzIDAuMjI5ODA3Cit2dCAwLjAwODM1MyAwLjI0ODc0NQordnQgMC4wMDgzNTMgMC4zNjkzMTYKK3Z0IDAuMDA4MzUzIDAuMzQzNDc5Cit2dCAwLjAwODM1MyAwLjMyNDUxMQordnQgMC4wMDgzNTMgMC4zMDU1NjYKK3Z0IDAuNzU2NzAwIDAuMjYyOTM0Cit2dCAwLjc1NjUyNSAwLjI2MjkzNAordnQgMC43NTY1MjUgMC4yMzEzOTIKK3Z0IDAuNzU2NzAwIDAuMjMxMzkyCit2dCAwLjc1NjUyNSAwLjIxMjMwMAordnQgMC43NTY3MDAgMC4yMTIzMDAKK3Z0IDAuNzU2NTI1IDAuMTkzMzY3Cit2dCAwLjc1NjcwMCAwLjE5MzM2NwordnQgMC43NTY1MjUgMC4wNzI4MDMKK3Z0IDAuNzU2NTI1IDAuMDk4NjE1Cit2dCAwLjc1NjUyNSAwLjExNzYwNAordnQgMC43NTY1MjUgMC4xMzY1NTEKK3Z0IDAuMDE4NjQwIDAuMTc5MTU1Cit2dCAwLjAxODY0MCAwLjIxMDcwMQordnQgMC4wMTg2NDAgMC4yMjk3ODIKK3Z0IDAuMDE4NjQwIDAuMjQ4NzI3Cit2dCAwLjAxODYzOSAwLjM2OTI4NQordnQgMC4wMTg2NDAgMC4zNDMzODMKK3Z0IDAuMDE4NjQwIDAuMzI0NDgzCit2dCAwLjAxODY0MCAwLjMwNTU0OQordnQgMC4wMjc5MjYgMC4xNzkxNTUKK3Z0IDAuMDI3OTI2IDAuMjEwNzAxCit2dCAwLjAyNzkyNiAwLjIyOTc4MgordnQgMC4wMjc5MjYgMC4yNDg3MjcKK3Z0IDAuMDI3OTI1IDAuMzY5Mjg1Cit2dCAwLjAyNzkyNSAwLjM0MzM4MwordnQgMC4wMjc5MjUgMC4zMjQ0ODMKK3Z0IDAuMDI3OTI2IDAuMzA1NTQ5Cit2dCAwLjAzMzYyMyAwLjE3OTE1NQordnQgMC4wMzM2MjMgMC4yMTA3MDEKK3Z0IDAuMDMzNjIyIDAuMjI5NzgyCit2dCAwLjAzMzYyMiAwLjI0ODcyNwordnQgMC4wMzM2MjIgMC4zNjkyODUKK3Z0IDAuMDMzNjIyIDAuMzQzMzgzCit2dCAwLjAzMzYyMiAwLjMyNDQ4MwordnQgMC4wMzM2MjIgMC4zMDU1NDkKK3Z0IDAuMDQ2OTQ4IDAuMTc5MTU1Cit2dCAwLjA0Njk0OCAwLjIxMDcwMQordnQgMC4wNDY5NDggMC4yMjk3ODIKK3Z0IDAuMDQ2OTQ4IDAuMjQ4NzI3Cit2dCAwLjA0Njk0OCAwLjM2OTI4NQordnQgMC4wNDY5NDggMC4zNDMzODMKK3Z0IDAuMDQ2OTQ4IDAuMzI0NDgzCit2dCAwLjA0Njk0OCAwLjMwNTU0OQordnQgMC4wNTM4NDUgMC4xNzkxNTUKK3Z0IDAuMDUzODQ1IDAuMjEwNzAxCit2dCAwLjA1Mzg0NSAwLjIyOTc4MgordnQgMC4wNTM4NDUgMC4yNDg3MjcKK3Z0IDAuMDYxMzgzIDAuMzY5Mjg1Cit2dCAwLjA2MTM4MyAwLjM0MzM4MwordnQgMC4wNzE4ODkgMC4zNDMzODMKK3Z0IDAuMDYxMzgzIDAuMzI0NDgzCit2dCAwLjA3MTg4OSAwLjMyNDQ4MwordnQgMC4wNjEzODMgMC4zMDU1NDkKK3Z0IDAuMDcxODg5IDAuMzA1NTQ5Cit2dCAwLjA2MTM4MyAwLjI4NjYwOAordnQgMC4wNzE4ODkgMC4yODY2MDgKK3Z0IDAuMTgxNzY1IDAuMTc5MTU1Cit2dCAwLjE5Mzk3NCAwLjE3OTE1NQordnQgMC4xOTM5NzQgMC4yMTA3MDEKK3Z0IDAuMTgxNzY1IDAuMjEwNzAxCit2dCAwLjE5Mzk3NCAwLjIyOTc4MgordnQgMC4xODE3NjUgMC4yMjk3ODIKK3Z0IDAuMTkzOTc0IDAuMjQ4NzI3Cit2dCAwLjE4MTc2NSAwLjI0ODcyNwordnQgMC4xOTM5NzQgMC4zNjkyODYKK3Z0IDAuMTkzOTc0IDAuMzQzMzgzCit2dCAwLjE5Mzk3NCAwLjMyNDQ4MwordnQgMC4xOTM5NzQgMC4zMDU1NDkKK3Z0IDAuMTk5NjY5IDAuMTc5MTU1Cit2dCAwLjE5OTY2OSAwLjIxMDcwMQordnQgMC4xOTk2NjkgMC4yMjk3ODIKK3Z0IDAuMTk5NjY5IDAuMjQ4NzI3Cit2dCAwLjE5OTY2OSAwLjM2OTI4NgordnQgMC4xOTk2NjkgMC4zNDMzODMKK3Z0IDAuMTk5NjY5IDAuMzI0NDgzCit2dCAwLjE5OTY2OSAwLjMwNTU0OQordnQgMC4xNTU3MDggMC4yODY2MDgKK3Z0IDAuMTU1NzA4IDAuMzA1NTQ5Cit2dCAwLjE1NTcwOCAwLjMyNDQ4MwordnQgMC4xNTU3MDggMC4zNDMzODMKK3Z0IDAuMDcxODg5IDAuMjI5NzgyCit2dCAwLjA3MTg4OSAwLjI0ODcyNwordnQgMC4wNzE4ODkgMC4yNjc2NTcKK3Z0IDAuMDk2MzEwIDAuMTk5NDc1Cit2dCAwLjEzMTEzOCAwLjE3OTE1NQordnQgMC4wOTYyMDUgMC4xNzkxNTUKK3Z0IDAuMTEzNzk4IDAuMTc5MTU1Cit2dCAwLjA2MTM4MyAwLjI2NzY1NwordnQgMC4wNjEzODMgMC4yMTA3MDEKK3Z0IDAuMDYxMzgzIDAuMTc5MTU1Cit2dCAwLjA2MTM4MyAwLjIyOTc4MgordnQgMC4wNjEzODMgMC4yNDg3MjcKK3Z0IDAuMDUzODQ1IDAuMzY5Mjg1Cit2dCAwLjA1Mzg0NSAwLjM0MzM4MwordnQgMC4wNTM4NDUgMC4zMjQ0ODMKK3Z0IDAuMDUzODQ1IDAuMzA1NTQ5Cit2dCAwLjQ0OTcyOSAwLjE3OTA0NgordnQgMC40NDk3MjkgMC4yMTA1OTIKK3Z0IDAuNDQ4MzYxIDAuMjEwNTkyCit2dCAwLjQ0ODM2MSAwLjE3OTA0NgordnQgMC40NDk3MjkgMC4yMjk2ODYKK3Z0IDAuNDQ4MzYxIDAuMjI5Njg2Cit2dCAwLjQ0OTcyOSAwLjI0ODYyMQordnQgMC40NDgzNjEgMC4yNDg2MjEKK3Z0IDAuNDQ5NzI5IDAuMjY3NTc1Cit2dCAwLjQ0ODM2MSAwLjI2NzU3NQordnQgMC40NDk3MjkgMC4yODY1MDMKK3Z0IDAuNDQ4MzYxIDAuMjg2NTAzCit2dCAwLjQ0OTcyOSAwLjMwNTQ0MwordnQgMC40NDgzNjEgMC4zMDU0NDMKK3Z0IDAuNDQ5NzI5IDAuMzI0MzkzCit2dCAwLjQ0ODM2MCAwLjMyNDM5MwordnQgMC40NDk3MjkgMC4zNDMzODQKK3Z0IDAuNDQ4MzYwIDAuMzQzMzg0Cit2dCAwLjQ0OTcyOSAwLjM2OTE5OQordnQgMC40NDgzNjAgMC4zNjkxOTkKK3Z0IDAuMjMzMDU5IDAuMzY5MTk5Cit2dCAwLjIzMzA1OSAwLjM0MzM4NAordnQgMC4yMzQ0MzEgMC4zNDMzODQKK3Z0IDAuMjM0NDMxIDAuMzY5MTk5Cit2dCAwLjIzMzA1OSAwLjMyNDM5MwordnQgMC4yMzQ0MzEgMC4zMjQzOTMKK3Z0IDAuMjMzMDU5IDAuMzA1NDQzCit2dCAwLjIzNDQzMSAwLjMwNTQ0MwordnQgMC4yMzMwNTkgMC4yODY1MDMKK3Z0IDAuMjM0NDMxIDAuMjg2NTAzCit2dCAwLjIzMzA1OSAwLjI2NzU3NQordnQgMC4yMzQ0MzEgMC4yNjc1NzUKK3Z0IDAuMjMzMDU5IDAuMjQ4NjIyCit2dCAwLjIzNDQzMSAwLjI0ODYyMgordnQgMC4yMzMwNTkgMC4yMjk2ODYKK3Z0IDAuMjM0NDMxIDAuMjI5Njg2Cit2dCAwLjIzMzA1OSAwLjIxMDU5OQordnQgMC4yMzQ0MzEgMC4yMTA1OTkKK3Z0IDAuMjMzMDU5IDAuMTc5MDY3Cit2dCAwLjIzNDQzMSAwLjE3OTA2NwordnQgMC43MzE0MjQgMC4yMzE0MTcKK3Z0IDAuNzMxNTc1IDAuMjMxNDIzCit2dCAwLjczMTU3NyAwLjI2MjkzMgordnQgMC43MDc3NjIgMC43ODMxNDQKK3Z0IDAuNzA3NjExIDAuNzgzMTM3Cit2dCAwLjcwNzc2MiAwLjc1MTYyOQordnQgMC43NTY4NTQgMC4wOTg2MTMKK3Z0IDAuNzU2NzAwIDAuMDk4NjE1Cit2dCAwLjc1NjcwMCAwLjA3MjgwMwordnQgMC43ODU4OTcgMC4yNzE0MTAKK3Z0IDAuNzg2MDUxIDAuMjcxNDA4Cit2dCAwLjc4NjA1MSAwLjI5NzIyMAordnQgMC43MzE0MjMgMC4yMTIzNDQKK3Z0IDAuNzMxNTc0IDAuMjEyMzUwCit2dCAwLjAzNzcwMSAwLjgxMjI4NQordnQgMC4wMzc1NTAgMC44MTIyNzgKK3Z0IDAuMDM3NzAxIDAuNzkzMjA1Cit2dCAwLjczMTQyMyAwLjE5MzQyMgordnQgMC43MzE1NzQgMC4xOTM0MjcKK3Z0IDAuMzg1MjUzIDAuODE1MTAzCit2dCAwLjM4NTEwMiAwLjgxNTA5NgordnQgMC4zODUyNTMgMC43OTYxNzUKK3Z0IDAuNzMxNDIyIDAuMTc0NDgxCit2dCAwLjc2Mzg1NSAwLjgxMzE0MwordnQgMC43NjM3MDQgMC44MTMxMzYKK3Z0IDAuNzYzODU1IDAuNzk0MTk3Cit2dCAwLjczMTQyMSAwLjE1NTU2OAordnQgMC4zNTY4MzQgMC44MTYzODIKK3Z0IDAuMzU2NjgzIDAuODE2Mzc1Cit2dCAwLjM1NjgzNCAwLjc5NzQ2MgordnQgMC43MzE0MjAgMC4xMzY2NDEKK3Z0IDAuMzc0NDc1IDAuODE1MTA4Cit2dCAwLjM3NDMyNCAwLjgxNTEwMQordnQgMC4zNzQ0NzUgMC43OTYxNzUKK3Z0IDAuNzMxNDE5IDAuMTE3NzA1Cit2dCAwLjgxNDczMiAwLjgwNTQ0NAordnQgMC44MTQ1ODEgMC44MDU0MzcKK3Z0IDAuODE0NzMyIDAuNzg2NTAxCit2dCAwLjczMTQxOSAwLjA5ODcyNwordnQgMC40NDM0MjQgMC44MTI1NTgKK3Z0IDAuNDQzMjczIDAuODEyNTUxCit2dCAwLjQ0MzQyNCAwLjc5MzU3NAordnQgMC43MzE0MTggMC4wNzI5MzAKK3Z0IDAuNzg2MDQ4IDAuMzMzNjQ3Cit2dCAwLjc4NTg5NyAwLjMzMzY0MQordnQgMC43ODYwNDggMC4zMDc4NDUKK3Z0IDAuNzU2ODU0IDAuMTE3NjAyCit2dCAwLjc1NjcwMCAwLjExNzYwNAordnQgMC42ODM5NDUgMC43OTMzNDQKK3Z0IDAuNjg0MDk5IDAuNzkzMzQyCit2dCAwLjY4NDA5OSAwLjgxMjMzMQordnQgMC43NTY4NTQgMC4xMzY1NDkKK3Z0IDAuNzU2NzAwIDAuMTM2NTUxCit2dCAwLjQxNDg2NiAwLjc5NDAxNwordnQgMC40MTUwMjAgMC43OTQwMTUKK3Z0IDAuNDE1MDIwIDAuODEyOTYyCit2dCAwLjc1Njg1NCAwLjE1NTQ4OAordnQgMC40MjU2NDggMC43OTQwMTcKK3Z0IDAuNDI1ODAyIDAuNzk0MDE1Cit2dCAwLjQyNTgwMiAwLjgxMjk1NAordnQgMC43NTY4NTQgMC4xNzQ0MTMKK3Z0IDAuMDYzMTQ3IDAuNzk2MDY4Cit2dCAwLjA2MzMwMSAwLjc5NjA2NgordnQgMC4wNjMzMDEgMC44MTQ5OTEKK3Z0IDAuNzU2ODU0IDAuMTkzMzY0Cit2dCAwLjcwNzYwNyAwLjc5Mzc3MQordnQgMC43MDc3NjIgMC43OTM3NjkKK3Z0IDAuNzA3NzYyIDAuODEyNzIxCit2dCAwLjc1Njg1NCAwLjIxMjI5OAordnQgMC4xNDc1OTkgMC43OTQzNDAKK3Z0IDAuMTQ3NzU0IDAuNzk0MzM3Cit2dCAwLjE0Nzc1NCAwLjgxMzI3MQordnQgMC43NTY4NTQgMC4yMzEzOTAKK3Z0IDAuNzQwMDQ5IDAuNzkyOTQ4Cit2dCAwLjc0MDIwNCAwLjc5Mjk0NgordnQgMC43NDAyMDQgMC44MTIwMzcKK3Z0IDAuNzU2ODU0IDAuMjYyOTMyCit2dCAwLjI0NjkxNiAwLjc1MDQ3OQordnQgMC4yNDcwNzAgMC43NTA0NzcKK3Z0IDAuMjQ3MDcwIDAuNzgyMDE5Cit2dCAwLjIzMzA1OSAwLjQwMjE5OQordnQgMC4yMzQ0MzEgMC40MDIxOTkKK3Z0IDAuNDQ4MzYwIDAuNDAyMTk5Cit2dCAwLjQ0OTcyOSAwLjQwMjE5OQordnQgMC43NTI1MzMgMC4wMzk4MDYKK3Z0IDAuNzUyOTc5IDAuMDM5ODA2Cit2dCAwLjMxNjQxNCAwLjc4MjMzOAordnQgMC4zMTYyNjAgMC43NDkzNDIKK3Z0IDAuMzE2NDE0IDAuNzQ5MzM5Cit2dCAwLjc1NjcwMCAwLjAzOTgwNwordnQgMC43NTY4NTQgMC4wMzk4MDQKK3Z0IDAuNzU2NTI1IDAuMDM5ODA3Cit2dCAwLjc0OTQ4OCAwLjAzOTc2MAordnQgMC4wMTE0NjIgMC40MDIzMDUKK3Z0IDAuMDA4MzUzIDAuNDAyMzE5Cit2dCAwLjAxNDg0NCAwLjQwMjI5OAordnQgMC4wMTg2MzkgMC40MDIyOTgKK3Z0IDAuMDI3OTI1IDAuNDAyMjk4Cit2dCAwLjAzMzYyMiAwLjQwMjI5OAordnQgMC4wNDY5NDggMC40MDIyOTgKK3Z0IDAuMDUzODYzIDAuNDAyMjk4Cit2dCAwLjA3MTg4NyAwLjQwMjI5OAordnQgMC4wNjEzNTYgMC40MDIyOTgKK3Z0IDAuMTEzNzk4IDAuNDAyMjk4Cit2dCAwLjA5MTk0NiAwLjQwMjI5OAordnQgMC4xNTU3MDYgMC40MDIyOTgKK3Z0IDAuMTM1NjQ4IDAuNDAyMjk4Cit2dCAwLjE2NDY2MiAwLjM2OTI4NQordnQgMC4xNjQ2NjEgMC40MDIyOTgKK3Z0IDAuMTkzOTc0IDAuNDAyMjk4Cit2dCAwLjE4MTc2NSAwLjQwMjI5OAordnQgMC4xOTk2NjkgMC40MDIyOTgKK3Z0IDAuMjA2NDQ2IDAuNDAyMjk4Cit2dCAwLjIxMDI0MiAwLjQwMjI5OAordnQgMC4yMTQ3MjkgMC40MDIzMDUKK3Z0IDAuMjE5MjM5IDAuNDAyMzE5Cit2dCAwLjczNTczNCAwLjAzOTk2MQordnQgMC43Mzg4NDUgMC4wMzk4NDgKK3Z0IDAuNzM1Mjg4IDAuMDM5OTYxCit2dCAwLjczMTc0MiAwLjAzOTk2MAordnQgMC43MzE1NjcgMC4wMzk5NjAKK3Z0IDAuNzQwMjAwIDAuNzQ5MzQ0Cit2dCAwLjc0MDIwMCAwLjc4MjMyMAordnQgMC43NDAwNDkgMC43ODIzMTUKK3Z0IDAuMTY0NjYyIDAuMjg2NjA4Cit2dCAwLjE2NDY2MiAwLjM0MzM4MwordnQgMC4xNjQ2NjIgMC4zMjQ0ODMKK3Z0IDAuMTY0NjYyIDAuMzA1NTQ5Cit2dCAwLjE3MzcyMSAwLjIxMDcwMQordnQgMC4xNzM3MzYgMC4xNzkxNTUKK3Z0IDAuMTczNzIxIDAuMjI5NzgyCit2dCAwLjE3MzcyMSAwLjI0ODcyNwordnQgMC4xNzM3MjEgMC40MDIyOTgKK3Z0IDAuNzUzMDA3IDAuMDEzOTEwCit2dCAwLjc1Mjk3OSAwLjAyNDM2OAordnQgMC43NTI1MzMgMC4wMjQzNjgKK3Z0IDAuNzUyNTYxIDAuMDEzOTA5Cit2dCAwLjc1MzA4MyAwLjAwNTMxMwordnQgMC43NTI2MzcgMC4wMDUzMTMKK3Z0IDAuMDY2OTM4IDAuNDYzNzA2Cit2dCAwLjA2Njk3OSAwLjQ1NTE2MgordnQgMC4wNjc0MjUgMC40NTUxNjMKK3Z0IDAuMDY3Mzg0IDAuNDYzNzA2Cit2dCAwLjA2NjkyMSAwLjQ3NDIyNAordnQgMC4wNjczNjggMC40NzQyMjQKK3Z0IDAuMzg0ODk5IDAuNzAzNjQ5Cit2dCAwLjM4NDkxMyAwLjcxMzUxOAordnQgMC4zODQ0NjUgMC43MTM1MTgKK3Z0IDAuMzg0NDUzIDAuNzAzNjQ5Cit2dCAwLjczNTI4NyAwLjAyNDUzMgordnQgMC43MzUzMDUgMC4wMTQwMzIKK3Z0IDAuNzM1NzUxIDAuMDE0MDMyCit2dCAwLjczNTczMyAwLjAyNDUzMwordnQgMC43MzUzNTMgMC4wMDUzMTQKK3Z0IDAuNzM1Nzk5IDAuMDA1MzE0Cit2dCAwLjM4NDg2MSAwLjY5NTA4MwordnQgMC4zODQ0MTUgMC42OTUwODMKK3Z0IDAuMDIxMTk3IDAuODI2NTcyCit2dCAwLjAxODU5NCAwLjgxNzE2MgordnQgMC4wMjExOTcgMC44MTUxNTUKK3Z0IDAuMjYyMzI4IDAuODE0MTkzCit2dCAwLjI2MjMyOCAwLjgyNDgyOQordnQgMC4yNTkyMjggMC44MjQ4MjQKK3Z0IDAuMDEwMjA4IDAuNDI2OTA5Cit2dCAwLjAxNTM1OCAwLjQzNDUwNgordnQgMC4wMTMxNjggMC40MzY3MTcKK3Z0IDAuMDA3NDEzIDAuNDI4MjA4Cit2dCAwLjAyMjg5MiAwLjQzOTYwMQordnQgMC4wMjE2OTUgMC40NDI0ODQKK3Z0IDAuMDcwNDg4IDAuNDY0ODk1Cit2dCAwLjA3MDUxMSAwLjQ3NDUxOQordnQgMC4wMzIyMDggMC40NDQ1MzYKK3Z0IDAuMDcwNTA1IDAuNDg4OTU2Cit2dCAwLjA3MDUwMyAwLjQ5NTg3OAordnQgMC4wNjczNjAgMC40OTU4ODYKK3Z0IDAuMDY3MzYzIDAuNDg4OTU5Cit2dCAwLjE5NTU0NyAwLjQ0MTUyMAordnQgMC4yMDQ2ODIgMC40Mzk2MDUKK3Z0IDAuMjA1ODgwIDAuNDQyNDg0Cit2dCAwLjM4MTMyMyAwLjcxMzk4MgordnQgMC4yMTIyNzUgMC40MzQ1MDUKK3Z0IDAuMjE0NDY2IDAuNDM2NzE3Cit2dCAwLjIxNzMyNCAwLjQyNjkyMQordnQgMC4yMjAxNzYgMC40MjgyMDkKK3Z0IDAuMjE5MjM5IDAuNDE3MTc1Cit2dCAwLjIyMjI4MiAwLjQxNzc4MQordnQgMC43Mzg4NjEgMC4wMTUxOTAKK3Z0IDAuMDA4MzUzIDAuNDE3MTc1Cit2dCAwLjAxMTQ2MiAwLjQxNjcxMgordnQgMC4wMTMzNzUgMC40MjUwOTUKK3Z0IDAuMDE3Njg5IDAuNDMxNTU5Cit2dCAwLjAyNDU3NSAwLjQzNTM1NQordnQgMC4wMzI1MTIgMC40NDE1MjAKK3Z0IDAuMDMyOTMwIDAuNDM3MDUyCit2dCAwLjE3NjMwOSAwLjQ0MTQ5MwordnQgMC4xNzMwNDIgMC40NDE1MjAKK3Z0IDAuMTczNzQzIDAuNDM3MDUyCit2dCAwLjE5NDgwMyAwLjQzNzA1MgordnQgMC4yMDI5MDcgMC40MzUzNTUKK3Z0IDAuMjA5NDIwIDAuNDMxNTU4Cit2dCAwLjIxMzA4MiAwLjQyNTA5NQordnQgMC4yMTQ3MjkgMC40MTY3MTIKK3Z0IDAuNzU2NTUzIDAuMDEzOTEwCit2dCAwLjc1NjUyNSAwLjAyNDM2OQordnQgMC43NTY2MzAgMC4wMDUzMTMKK3Z0IDAuMDYzMzkyIDAuNDYzNzA1Cit2dCAwLjA2MzQzMyAwLjQ1NTE2MQordnQgMC4wNjMzNzQgMC40NzQyMjIKK3Z0IDAuMDYzMzIyIDAuNjE1MDMwCit2dCAwLjA2MzMyMSAwLjYxNzE0NgordnQgMC4wNjMxNDcgMC42MTcxMjUKK3Z0IDAuMDYzMTQ4IDAuNjE1MDI5Cit2dCAwLjM4ODQ0NiAwLjcwMzY0OQordnQgMC4zODg0NTkgMC43MTM1MTgKK3Z0IDAuNzMxNzQxIDAuMDI0NTMxCit2dCAwLjczMTc1OCAwLjAxNDAzMQordnQgMC43MzE4MDcgMC4wMDUzMTMKK3Z0IDAuMzg4NDA4IDAuNjk1MDgzCit2dCAwLjA1Mzg3NCAwLjQyODcyOQordnQgMC4wNDY5NDggMC40Mjg3MjkKK3Z0IDAuMDQ2OTQ4IDAuNDIxOTM5Cit2dCAwLjA1Mzg3NCAwLjQyMTkzOQordnQgMC4wNjY5MTUgMC40ODg5NTkKK3Z0IDAuMTgxNzYyIDAuNDQxNDgyCit2dCAwLjE4ODE1MSAwLjQ0MTQ5MwordnQgMC4xODUxODYgMC40NDI5MDUKK3Z0IDAuMTgxNzYyIDAuNDQxOTg1Cit2dCAwLjA0Njk1MSAwLjQ0MTUyMAordnQgMC4wNDY5NjIgMC40MzcwNTIKK3Z0IDAuMTk0MzU0IDAuNDMyNTIzCit2dCAwLjE4MTc2MyAwLjQzNzA1NAordnQgMC4xODE3NjUgMC40MzI1MjMKK3Z0IDAuMDE0ODQ0IDAuNDE2MzAzCit2dCAwLjAxNjY3MiAwLjQyMzQzMwordnQgMC4wMjA1ODAgMC40MjgwMzIKK3Z0IDAuMDI2NDMxIDAuNDMwOTI5Cit2dCAwLjAzMzQxMiAwLjQzMjUyMwordnQgMC4wNTM4NzQgMC40MzcwNTIKK3Z0IDAuMDQ2OTQ4IDAuNDMyNTIzCit2dCAwLjA1Mzg3NCAwLjQzMjUyMwordnQgMC4yMDExNjMgMC40MzA5MzQKK3Z0IDAuMjA2MTg4IDAuNDI3OTg3Cit2dCAwLjIwODg2MSAwLjQyMzQzNAordnQgMC4yMTAyNDIgMC40MTYzMDMKK3Z0IDAuMjA1MjkxIDAuNDIxOTM5Cit2dCAwLjIwNjQ0NiAwLjQxNTg3OQordnQgMC4yMDM0NTQgMC40MjUyNTQKK3Z0IDAuMTk5NjY4IDAuNDI3MzYyCit2dCAwLjE5Mzk3NCAwLjQyODcyOQordnQgMC4xODE3NjUgMC40Mjg3MjkKK3Z0IDAuMTczNzM2IDAuNDMyNTIzCit2dCAwLjE3Mzc1NCAwLjQyODcyOQordnQgMC4wMzM2MjIgMC40Mjg3MjkKK3Z0IDAuMDI3OTI1IDAuNDI3MTI2Cit2dCAwLjAyMzMxNCAwLjQyNTI5OQordnQgMC4wMjAyNDIgMC40MjE5MzkKK3Z0IDAuMDE4NjM5IDAuNDE1ODc5Cit2dCAwLjE4MTc2NSAwLjQyMTkzOQordnQgMC4xOTM5NzQgMC40MjE5MzkKK3Z0IDAuMTk5NjY4IDAuNDIxOTM5Cit2dCAwLjAzMzYyMiAwLjQyMTkzOQordnQgMC4wMjc5MjUgMC40MjE5MzkKK3Z0IDAuMDI3OTI1IDAuNDE1ODc5Cit2dCAwLjAzMzYyMiAwLjQxNTg3OQordnQgMC4wNDY5NDggMC40MTU4NzkKK3Z0IDAuMDUzODc0IDAuNDE1ODc5Cit2dCAwLjE4MTc2NSAwLjQxNTg3OQordnQgMC4xOTM5NzQgMC40MTU4NzkKK3Z0IDAuMTk5NjY4IDAuNDE1ODc5Cit2dCAwLjA2MzM1MiAwLjUzMzk0NwordnQgMC4wNjMzNDkgMC41NDE3MDUKK3Z0IDAuMDYzMTc1IDAuNTQxNjEyCit2dCAwLjA2MzE3OCAwLjUzMzk0NwordnQgMC4wNzA0ODkgMC41MzM5NDEKK3Z0IDAuMDY3MzQ2IDAuNTMzOTQ5Cit2dCAwLjA2NzM1NCAwLjUxMzg5MgordnQgMC4wNzA0OTYgMC41MTM4ODUKK3Z0IDAuMDkxOTQ3IDAuNDIxOTM5Cit2dCAwLjA5MTk0NyAwLjQyODcyOQordnQgMC4wNzE4ODkgMC40Mjg3MjkKK3Z0IDAuMDcxODg5IDAuNDIxOTM5Cit2dCAwLjA5MTk0NyAwLjQzMjUyMwordnQgMC4wOTE5NDYgMC40MzcwNTIKK3Z0IDAuMDcxODg3IDAuNDM3MDUyCit2dCAwLjA3MTg4OSAwLjQzMjUyMwordnQgMC4wOTE5NDcgMC40MTU4NzkKK3Z0IDAuMDcxODg5IDAuNDE1ODc5Cit2dCAwLjA2NjkxMCAwLjUwMzMzNQordnQgMC4wNjczNTggMC41MDMzMzUKK3Z0IDAuMDY2OTA2IDAuNTEzODkyCit2dCAwLjA2MTMyNSAwLjQ0MTUyMAordnQgMC4wNjEzMjYgMC40MzcwNTIKK3Z0IDAuMDcxODg1IDAuNDQxNTIwCit2dCAwLjA2MzE4OSAwLjUwMzMzNAordnQgMC4wNjMzNjQgMC41MDMzMzQKK3Z0IDAuMDYzMzYwIDAuNTEzODkxCit2dCAwLjA2MzE4NSAwLjUxMzg5MAordnQgMC4wNjEzMjcgMC40MzI1MjMKK3Z0IDAuMDYxMzI3IDAuNDI4NzI5Cit2dCAwLjA2Njg4MiAwLjU3NzY0NgordnQgMC4wNjczMzAgMC41Nzc2NDYKK3Z0IDAuMDY3MzIzIDAuNTk3NjYzCit2dCAwLjA2Njg3NSAwLjU5NzY2MwordnQgMC4xMzU2NTAgMC40NDE1MjAKK3Z0IDAuMTM1NjQ5IDAuNDM3MDUyCit2dCAwLjE1NTY3MCAwLjQzNzA1MgordnQgMC4xNTU2NzAgMC40NDE1MjAKK3Z0IDAuMDYzMTYyIDAuNTc3NjQ0Cit2dCAwLjA2MzMzNiAwLjU3NzY0NQordnQgMC4wNjMzMjkgMC41OTc2NjEKK3Z0IDAuMDYzMTU0IDAuNTk3NjYxCit2dCAwLjEzNTY0OSAwLjQzMjUyMwordnQgMC4xMzU2NDkgMC40Mjg3MjkKK3Z0IDAuMTU1NjY5IDAuNDI4NzI5Cit2dCAwLjE1NTY2OSAwLjQzMjUyMwordnQgMC4wNzA0NjIgMC42MDY2NjgKK3Z0IDAuMDY3MzIwIDAuNjA2Njc4Cit2dCAwLjA3MDQ2NSAwLjU5NzY1NAordnQgMC4xNjQ2NjUgMC40MjE5MzkKK3Z0IDAuMTY0NjY1IDAuNDI4NzI5Cit2dCAwLjE1NTY2OSAwLjQyMTkzOQordnQgMC4xNjQ2NjUgMC40MzI1MjMKK3Z0IDAuMTY0NjgyIDAuNDM3MDUyCit2dCAwLjE2NDY3MSAwLjQxNTg3OQordnQgMC4xNTU2NjkgMC40MTU4NzkKK3Z0IDAuMDY2ODk5IDAuNTMzOTQ4Cit2dCAwLjA3MDQ3MyAwLjU3NzYzOAordnQgMC4wOTE5NDUgMC40NDE1MjAKK3Z0IDAuMTM1NjQ5IDAuNDIxOTM5Cit2dCAwLjEzNTY0OSAwLjQxNTg3OQordnQgMC4wNzA0ODUgMC41NDUxMjQKK3Z0IDAuMDY3MzQyIDAuNTQ1MTMyCit2dCAwLjEwMzEzMSAwLjQyMTkzOQordnQgMC4xMDMxMzEgMC40Mjg3MjkKK3Z0IDAuMTAzMTMxIDAuNDMyNTIzCit2dCAwLjEwMzEzMCAwLjQzNzA1MgordnQgMC4xMDMxMzEgMC40MTU4NzkKK3Z0IDAuMDY2ODcyIDAuNTY2NDcxCit2dCAwLjA2NzMzNCAwLjU2NjQ3MQordnQgMC4xMjQ0NzIgMC40NDE1MjAKK3Z0IDAuMTI0NDcyIDAuNDM3MDUyCit2dCAwLjA2MzE2NSAwLjU2OTk0MgordnQgMC4wNjMzMzkgMC41Njk4MzEKK3Z0IDAuMTI0NDcyIDAuNDMyNTIzCit2dCAwLjEyNDQ3MiAwLjQyODcyOQordnQgMC40NDk3MjkgMC40MTc2MzkKK3Z0IDAuNDQ3NjM5IDAuNDI4MDA2Cit2dCAwLjQ0NjM1MSAwLjQyNzM5NgordnQgMC40NDgzNjAgMC40MTc2MzgKK3Z0IDAuNDQxOTE2IDAuNDM2NDY3Cit2dCAwLjQ0MDkzMCAwLjQzNTUwMwordnQgMC40MzM0MzggMC40NDIyMDEKK3Z0IDAuNDMyODk5IDAuNDQwOTEyCit2dCAwLjQyMjk2OSAwLjQ0NDE4MQordnQgMC40MjI4MzIgMC40NDI1NDIKK3Z0IDAuNDA4MjQ2IDAuNDQ0MTgxCit2dCAwLjQwODI0NiAwLjQ0MjU0MgordnQgMC4zODMzMDggMC40NDQxODEKK3Z0IDAuMzYzMjQ3IDAuNDQ0MTgxCit2dCAwLjM2MzI0NyAwLjQ0MjU0MgordnQgMC4zODMzMDggMC40NDI1NDIKK3Z0IDAuMjg5ODg2IDAuNjgzNTUwCit2dCAwLjI4OTg4NiAwLjY3NTkyOAordnQgMC4yOTE1MjYgMC42NzU5MzEKK3Z0IDAuMjkxNTI2IDAuNjgzNTUwCit2dCAwLjI5MTUyNiAwLjcwMzU2NwordnQgMC4yODk4ODYgMC43MDM1NjcKK3Z0IDAuMjkxNTI2IDAuNzEyNTgyCit2dCAwLjI4OTg4NiAwLjcxMjU4MgordnQgMC4yNTkxOTggMC40NDQxODEKK3Z0IDAuMjQ5MzcxIDAuNDQyMjAyCit2dCAwLjI0OTkxMCAwLjQ0MDkxNgordnQgMC4yNTk0NjEgMC40NDI1NDIKK3Z0IDAuMjQwODM0IDAuNDM2NDY2Cit2dCAwLjI0MTgyMCAwLjQzNTQ1OAordnQgMC4yMzUxNTcgMC40MjgwMDgKK3Z0IDAuMjM2NDM2IDAuNDI3NDcwCit2dCAwLjIzMzA1OSAwLjQxNzYzOQordnQgMC4yMzQ0MzEgMC40MTc2MzgKK3Z0IDAuNzgxNDk3IDAuODQ2NTgzCit2dCAwLjc4MTY1MSAwLjg0NjU4MQordnQgMC43ODE2NTEgMC44NTcwMzkKK3Z0IDAuNzkyNDMyIDAuODU3MDM4Cit2dCAwLjc5MjI3OCAwLjg1Njk3OAordnQgMC43OTI0MzIgMC44NDY1ODEKK3Z0IDAuMTY2Njg0IDAuODQ4OTMxCit2dCAwLjE2NjgzNCAwLjg0ODkwMwordnQgMC4xNjY4MzQgMC44NTkxNzQKK3Z0IDAuODYzMTk0IDAuMjQ0NjQ4Cit2dCAwLjg2MzA0NSAwLjI0NDYxNwordnQgMC44NjMxOTQgMC4yMzQ0MDQKK3Z0IDAuODU4MDk3IDAuMzg3NjM1Cit2dCAwLjg1ODI0NyAwLjM4NzYwNgordnQgMC44NTgyNDcgMC4zOTc4OTkKK3Z0IDAuNDcxNDM3IDAuODU5MjEwCit2dCAwLjQ3MTI4NyAwLjg1OTE3OAordnQgMC40NzE0MzcgMC44NDg5NDUKK3Z0IDAuNDMzNDk3IDAuNDQyMzQyCit2dCAwLjQyMjk4NCAwLjQ0NDM5MwordnQgMC4yNTkxOTAgMC40NDQzOTMKK3Z0IDAuMjQ5MzEyIDAuNDQyMzQzCit2dCAwLjg1NDI2MSAwLjIwMTkzNgordnQgMC44NTQ0MTAgMC4yMDE5MDYKK3Z0IDAuODU0NDEwIDAuMjEyNTQ1Cit2dCAwLjM1NjgzNCAwLjg1NzE2MQordnQgMC4zNTY2ODMgMC44NTcxNTQKK3Z0IDAuMzU2ODM0IDAuODQ2NzEzCit2dCAwLjg2MjIwMCAwLjI3MTQzOAordnQgMC44NjIzNTAgMC4yNzE0MDgKK3Z0IDAuODYyMzUwIDAuMjgxNjUzCit2dCAwLjg2Mzc0OSAwLjEzODEzMgordnQgMC44NjM2MDEgMC4xMzgxMDAKK3Z0IDAuODYzNzQ5IDAuMTI3OTE2Cit2dCAwLjg1NzczNyAwLjM1NjMzOAordnQgMC44NTc4ODcgMC4zNTYzMDgKK3Z0IDAuODU3ODg3IDAuMzY2NjUwCit2dCAwLjg1ODE5OSAwLjgyMjg2OAordnQgMC44NTgwNTAgMC44MjI4MzcKK3Z0IDAuODU4MTk5IDAuODEyNTU1Cit2dCAwLjgxOTA5NyAwLjA0NjE5OQordnQgMC44MTkwOTcgMC4wNTUyMTMKK3Z0IDAuODE4ODg2IDAuMDU1MjE0Cit2dCAwLjI5MTczNyAwLjcwMzU2NwordnQgMC4zNTU2NjUgMC40NDQxODEKK3Z0IDAuMzYzMjQ3IDAuNDQ0MzkzCit2dCAwLjg4MDIyNCAwLjczMDQ5NwordnQgMC44ODAyMjQgMC43MzgxNjIKK3Z0IDAuODgwMDEyIDAuNzM4MDc4Cit2dCAwLjgwNzQ1NCAwLjI3MTQwOAordnQgMC44MDc2NjYgMC4yNzE0MDgKK3Z0IDAuODA3NjY2IDAuMjkxNDI0Cit2dCAwLjgwNzY2NiAwLjAyNTM2OQordnQgMC44MDc0NTQgMC4wMjUzNjkKK3Z0IDAuODA3NDY0IDAuMDA1MzEzCit2dCAwLjg3OTY2OCAwLjQ2Nzk0OAordnQgMC44Nzk4NzkgMC40Njc4NjUKK3Z0IDAuODc5ODc5IDAuNDc1NTY3Cit2dCAwLjI5MTczNyAwLjY4MzU1MAordnQgMC44NTI2MzggMC4wNTY0MzYKK3Z0IDAuODUyNDI3IDAuMDU2NDMyCit2dCAwLjg1MjYzOCAwLjA0NTg3NwordnQgMC4zODMzMDggMC40NDQzOTMKK3Z0IDAuMzkzODY3IDAuNDQ0MTgxCit2dCAwLjY0MzMxMiAwLjg1Njk1NAordnQgMC42NDMxMzggMC44NDY0OTcKK3Z0IDAuNjQzMzEyIDAuODQ2NDkzCit2dCAwLjc1NjcyNyAwLjAxMzkxMAordnQgMC44NzQ2MjYgMC4zMTY0NDUKK3Z0IDAuODc0NDUxIDAuMzA3ODUwCit2dCAwLjg3NDYyNiAwLjMwNzg0NQordnQgMC43NTY4MDQgMC4wMDUzMTQKK3Z0IDAuNjgzNDU0IDAuODc1MzkwCit2dCAwLjY4MzI3OSAwLjg2Njg0OAordnQgMC42ODM0NTQgMC44NjY4NDMKK3Z0IDAuMDYzMjE3IDAuNDYzNzA1Cit2dCAwLjM4NTI3NyAwLjg1NjA0OAordnQgMC4zODUxMDIgMC44NDU1MzIKK3Z0IDAuMzg1Mjc3IDAuODQ1NTI5Cit2dCAwLjA2MzIwMCAwLjQ3NDIyMgordnQgMC4wNjY4NzIgMC42MDY2NzgKK3Z0IDAuMDYzMzI1IDAuNjA2Njc2Cit2dCAwLjcxODU2MyAwLjg1NzAxNQordnQgMC43MTg1NjMgMC44NjY4ODQKK3Z0IDAuNzE4Mzg5IDAuODY2ODg0Cit2dCAwLjM4ODYyMCAwLjcwMzY0OQordnQgMC4wODEzMTIgMC44NTYxMzMKK3Z0IDAuMDgxMTM4IDAuODQ1NjM0Cit2dCAwLjA4MTMxMiAwLjg0NTYzMQordnQgMC43MzE1NjcgMC4wMjQ1MzEKK3Z0IDAuODc0NTUxIDAuMTM2NjM3Cit2dCAwLjg3NDM3NyAwLjEyNzkyMAordnQgMC44NzQ1NTEgMC4xMjc5MTYKK3Z0IDAuNzMxNTg0IDAuMDE0MDMxCit2dCAwLjMxNjQzNCAwLjg2NjgxMgordnQgMC4zMTY0MzQgMC44NzUzNzgKK3Z0IDAuMzE2MjYwIDAuODc1Mzc3Cit2dCAwLjM4ODU4MiAwLjY5NTA4MwordnQgMC4zODg2MzQgMC43MTM1MTgKK3Z0IDAuMzg4NjM0IDAuNzIxMDAwCit2dCAwLjM4ODQ1OSAwLjcyMTAyNgordnQgMC40MDgyNDYgMC40NDQzOTMKK3Z0IDAuMDYzMzY5IDAuNDg4OTU3Cit2dCAwLjA2MzE5NCAwLjQ4ODk1NwordnQgMC44MzU5NzAgMC4zNTYzMDgKK3Z0IDAuODM1OTcxIDAuMzcxMDQzCit2dCAwLjgzNTc5NiAwLjM3MTA0MwordnQgMC40MDEzMTcgMC40NDQxODEKK3Z0IDAuNDAxMzE3IDAuNDQyNTQyCit2dCAwLjA2Njg2OSAwLjYxNTAzMQordnQgMC4wNjczMTcgMC42MTUwMzEKK3Z0IDAuMTY0Njg1IDAuNDQxNTIwCit2dCAwLjA2MzE1MSAwLjYwNjY3NgordnQgMC4xNzgzNjYgMC40NDI5MDYKK3Z0IDAuMTczMDQyIDAuNDQ0NTM2Cit2dCAwLjA3MDQ1OSAwLjYxNTAyMwordnQgMC4wNzA1MTEgMC42MTgyODkKK3Z0IDAuMTczNzU0IDAuNDIxOTM5Cit2dCAwLjE3Mzc2NSAwLjQxNTg3OQordnQgMC4yOTE1MjYgMC43MjA5MzUKK3Z0IDAuMjkxNTI2IDAuNzIzMDI3Cit2dCAwLjI4OTg4NiAwLjcyMzAyOQordnQgMC4yODk4ODYgMC43MjA5MzUKK3Z0IDAuMjkxNzM3IDAuNzIzNDY4Cit2dCAwLjI5MTUyNiAwLjcyMzQzOQordnQgMC4yOTE3MzcgMC43MjMwMzEKK3Z0IDAuMDY2ODY4IDAuNjE3OTc1Cit2dCAwLjA3MDUwMCAwLjUwMzMyNwordnQgMC4wNjEzMjcgMC40MjE5MzkKK3Z0IDAuMDYxMzI3IDAuNDE1ODc5Cit2dCAwLjA2NjkxMyAwLjQ5NTg4NgordnQgMC4wNTM4NzQgMC40NDE1MjAKK3Z0IDAuMDYzMTkyIDAuNDk1ODg1Cit2dCAwLjA2MzM2NiAwLjQ5NTg4NQordnQgMC40MDEzMTcgMC40NDQzOTMKK3Z0IDAuMzkzODY3IDAuNDQyNTQyCit2dCAwLjM1NDkzOSAwLjQ0NDM5MwordnQgMC4zNTUwNTEgMC40NDQxODEKK3Z0IDAuMzU1NTgxIDAuNDQ0MzkzCit2dCAwLjA2MzM0OSAwLjU0MjM4NwordnQgMC4wNjMxNzUgMC41NDIyNTQKK3Z0IDAuMDY0NTc3IDAuNTY4OTcwCit2dCAwLjA2NTYxMyAwLjU2NjQ2NgordnQgMC4wNjMxNjUgMC41NjkzNDQKK3Z0IDAuMDYzMzM5IDAuNTY5MjIxCit2dCAwLjcwNjkwNiAwLjk4MzUyMQordnQgMC43MDcxMTcgMC45ODM0MTgKK3Z0IDAuNzA3MTE3IDAuOTg0MDE2Cit2dCAwLjI5MTczNyAwLjY3NTg0NwordnQgMC4yOTE1MjYgMC42NzUzNTIKK3Z0IDAuMDY0MTczIDAuNTY4NjU5Cit2dCAwLjA2NTA2MyAwLjU2NjQ2NgordnQgMC4zNTUwNTMgMC40NDI1NDIKK3Z0IDAuMzU1NjYzIDAuNDQyNTQyCit2dCAwLjI4OTg4NiAwLjY3NTM1MQordnQgMC4wNjQ1MDkgMC41NDI1NDMKK3Z0IDAuMDY0MTY1IDAuNTQyOTIwCit2dCAwLjA2NTYxMiAwLjU0NTEyNQordnQgMC4wNjUwNjggMC41NDUxMjUKK3Z0IDAuMDY1MDY0IDAuNTY1MDE1Cit2dCAwLjA2NTA2NiAwLjU1NTc5OAordnQgMC4wNjU2MTQgMC41NTU3OTgKK3Z0IDAuMDY1NjIyIDAuNTY1MDE1Cit2dCAwLjA2Njg4MCAwLjU0NTEzMgordnQgMC4wNzA0NzcgMC41NjY0NjIKK3Z0IDAuMTAzMTMwIDAuNDQxNTIwCit2dCAwLjEyNDQ3MiAwLjQyMTkzOQordnQgMC4xMjQ0NzIgMC40MTU4NzkKK3Z0IDAuMDY3MzQyIDAuNTQ2NTQ4Cit2dCAwLjA3MDQ4MSAwLjU1NTc5MAordnQgMC4wNjczMzggMC41NTU3OTkKK3Z0IDAuMTEzNzk4IDAuNDIxOTM5Cit2dCAwLjExMzc5OCAwLjQyODcyOQordnQgMC4xMTM3OTggMC40MzI1MjMKK3Z0IDAuMTEzNzk4IDAuNDM3MDUyCit2dCAwLjExMzc5OCAwLjQxNTg3OQordnQgMC4wNjY4NzIgMC41NjUwMTYKK3Z0IDAuMDY2ODc2IDAuNTU1Nzk4Cit2dCAwLjA2NzMzNSAwLjU2NTAxNgordnQgMC4xMTM3OTggMC40NDE1MjAKK3Z0IDAuMDY1NjE0IDAuNTQ2NTQ3Cit2dCAwLjA2NTA2OCAwLjU0NjU0NwordnQgMC4wNjY4NzkgMC41NDY1NDgKK3Z0IDAuODk2MTQzIDAuMTI3OTIxCit2dCAwLjg5NjE0MyAwLjEyOTcxMQordnQgMC44OTU5NzEgMC4xMjk3MDYKK3Z0IDAuODk1OTcwIDAuMTI3OTE2Cit2dCAwLjg5NjkxOCAwLjEyNzk0MQordnQgMC44OTY5MTcgMC4xMjk3MzEKK3Z0IDAuMTM1MTY2IDAuNzI3NDk2Cit2dCAwLjEzNjk1NyAwLjcyNzQ5NgordnQgMC4xMzY5NjAgMC43Mjk2NDYKK3Z0IDAuMTkwMTM5IDAuOTE2MTg3Cit2dCAwLjE4ODc2NCAwLjkxNTA0MAordnQgMC4xOTAxMzkgMC45MTMzODgKK3Z0IDAuMTM1MTY2IDAuNzI2MDc0Cit2dCAwLjEzNjk1NyAwLjcyNjA3NAordnQgMC4xMzUxNjYgMC43MDQwMDgKK3Z0IDAuMTM2OTU3IDAuNzA0MDA4Cit2dCAwLjEzNjk1NCAwLjcwNjE1NQordnQgMC4xMzUxNjMgMC43MDYxNTUKK3Z0IDAuODk2NTU0IDAuMDQ1ODgwCit2dCAwLjg5NjU1NCAwLjA0NzY3MQordnQgMC44OTU3NjggMC4wNDc2NzkKK3Z0IDAuMDM3MDUwIDAuOTQ3OTk2Cit2dCAwLjAzNjMzMyAwLjk0NjM1NQordnQgMC4wMzcwNTAgMC45NDYwMzMKK3Z0IDAuODk2NzMwIDAuMDQ1ODc3Cit2dCAwLjg5NjczMCAwLjA0NzY2OQordnQgMC4xMzY5NTUgMC43MDc2MDYKK3Z0IDAuMTM2OTU2IDAuNzE2ODI0Cit2dCAwLjEzNTE2NSAwLjcxNjgyNAordnQgMC4xMzUxNjMgMC43MDc2MDYKK3Z0IDAuODk2ODQzIDAuMDQ3NjY3Cit2dCAwLjg5Njg0NCAwLjA0NjAyOAordnQgMC44OTU4NTggMC4xMjgwNjUKK3Z0IDAuODk1ODU5IDAuMTI5NzA0Cit2dCAwLjM1NDg1OSAwLjQ0NDMzNAordnQgMC45OTA3MTMgMC40ODIxNDIKK3Z0IDAuOTkwNjMwIDAuNDgyMDAxCit2dCAwLjk5MDcxMyAwLjQ4MTg5NwordnQgMC45OTIyMDAgMC45MDkyOTEKK3Z0IDAuOTkyMTU4IDAuOTA5MDc2Cit2dCAwLjk5MjIwMCAwLjkwOTAyOAordnQgMC45OTA5NDYgMC41MDk2MDkKK3Z0IDAuOTkwODkzIDAuNTA5NDA2Cit2dCAwLjk5MDk0NiAwLjUwOTM0NgordnQgMC45ODE1MTMgMC45MDkwMjgKK3Z0IDAuOTgxNTMxIDAuOTEwMDAyCit2dCAwLjkyMzUxMyAwLjcxOTgyOQordnQgMC45MjM0NjIgMC43MTg4OTIKK3Z0IDAuOTU2MTAxIDAuNzA0MjI0Cit2dCAwLjk1NjEwMSAwLjcwNjYwNwordnQgMC45NTYwNDYgMC43MDY1ODQKK3Z0IDAuOTU3NjMxIDAuODM4OTU5Cit2dCAwLjk1NzU3MyAwLjgzNjgxMAordnQgMC4wNjUwMDggMC41NDY1NDcKK3Z0IDAuOTY4ODY2IDAuNTYzMzE1Cit2dCAwLjk2ODg3MSAwLjU2NDczNwordnQgMC45Njg4MTEgMC41NjQ3MzcKK3Z0IDAuMDY0MTE5IDAuNTY4NjEyCit2dCAwLjg3MDE4OCAwLjk1NjI5NQordnQgMC44NzAxMzAgMC45NTM5NzYKK3Z0IDAuODcwMTg4IDAuOTUzOTUxCit2dCAwLjA2MzM0MCAwLjU2OTE0NAordnQgMC45ODE5ODUgMC43NzI0OTAKK3Z0IDAuOTgxOTE3IDAuNzcxNTQ4Cit2dCAwLjk4MTk4NSAwLjc3MTUyNQordnQgMC42ODI5NTAgMC45OTQwNDUKK3Z0IDAuNjgyOTUwIDAuOTk0MjU1Cit2dCAwLjY4Mjg4NyAwLjk5NDIxMgordnQgMC45OTA3MzcgMC42OTA3MTIKK3Z0IDAuOTkwNzM3IDAuNjkwOTQ3Cit2dCAwLjk5MzEyOSAwLjE2NTEyMgordnQgMC45OTMwNDUgMC4xNjQ5NjcKK3Z0IDAuOTkzMTI5IDAuMTY0OTExCit2dCAwLjM1NDkxOCAwLjQ0NDE4MgordnQgMC45NjU1MTkgMC4xNDg3MTkKK3Z0IDAuOTY1Mzg4IDAuMTQ3MDg0Cit2dCAwLjk2NTUxOSAwLjE0NzA3MwordnQgMC4yODk4ODYgMC42NzUyNTcKK3Z0IDAuOTY2NDIxIDAuNDY3ODY1Cit2dCAwLjk2NjQzMiAwLjQ2OTUwNQordnQgMC45NjYzMzcgMC40Njk1MDUKK3Z0IDAuODcwMjY4IDAuNTU5NTc2Cit2dCAwLjg3MDIwNiAwLjU1OTU3NQordnQgMC44NzAyNjggMC41NTAzMjUKK3Z0IDAuMDY1MDAwIDAuNTY2NDY2Cit2dCAwLjk2ODcwOCAwLjYxNDIyNAordnQgMC45Njg3MTMgMC42MTU2NzUKK3Z0IDAuOTY4NjUwIDAuNjE1Njc1Cit2dCAwLjczODg0NSAwLjAyNTAwMgordnQgMC44MjU1MTAgMC43ODY1MDEKK3Z0IDAuODI1NTEwIDAuODAxOTMwCit2dCAwLjgyNTM1OSAwLjgwMTkyNAordnQgMC44MjU1MTAgMC44MTI1NTUKK3Z0IDAuODI1NTEwIDAuODI3OTgzCit2dCAwLjgyNTM1OSAwLjgyNzk3NwordnQgMC44MjUyNjYgMC43NzIwMDQKK3Z0IDAuODI1MTExIDAuNzU2NTY3Cit2dCAwLjgyNTI2NiAwLjc1NjU2MwordnQgMC44MjUyNjYgMC43NDU5MzgKK3Z0IDAuODI1MTExIDAuNzMwNTAxCit2dCAwLjgyNTI2NiAwLjczMDQ5NwordnQgMC43NTY3MDAgMC4wMjQzNjkKK3Z0IDAuNzQ5NDg4IDAuMDI0OTA1Cit2dCAwLjg4Mzc5MiAwLjE2NDkxMQordnQgMC44ODQwMDQgMC4xNjQ5MTEKK3Z0IDAuODg0MDA0IDAuMTcyMzYwCit2dCAwLjM5Mzg2NyAwLjQ0NDM5MwordnQgMC4yOTE3MzcgMC43MjA5MzUKK3Z0IDAuODE5MDk3IDAuMDYzNTY3Cit2dCAwLjc1MzAwNyAwLjQyMDMzMgordnQgMC43NTMwODMgMC40Mjg3NjYKK3Z0IDAuNzUyNjM3IDAuNDI4NzY2Cit2dCAwLjc1MjU2MSAwLjQyMDMzMgordnQgMC43NTI5NzkgMC40MDk5ODcKK3Z0IDAuNzUyNTMzIDAuNDA5OTg3Cit2dCAwLjQyODQ0MiAwLjQ1NTAyNwordnQgMC40Mjg0MjIgMC40NjM0NzEKK3Z0IDAuNDI3OTc2IDAuNDYzNDczCit2dCAwLjQyNzk5NiAwLjQ1NTAyOAordnQgMC40Mjg0MzEgMC40NzM3ODgKK3Z0IDAuNDI3OTg5IDAuNDczNzg5Cit2dCAwLjQyODQ4NCAwLjQ5NTYxMwordnQgMC40MjgwNDIgMC40OTU2MTQKK3Z0IDAuNDI4MDIyIDAuNDg3NjI3Cit2dCAwLjQyODQ2NSAwLjQ4NzYyNgordnQgMC4wMTUyMDggMC4wMTU0MjIKK3Z0IDAuMDEwMjgwIDAuMDIzMDEyCit2dCAwLjAwNzQyMSAwLjAyMTc0NwordnQgMC4wMTMxNzIgMC4wMTMyMjMKK3Z0IDAuMDA4MzU0IDAuMDMyNTE3Cit2dCAwLjAwNTMxNCAwLjAzMjEyNgordnQgMC4wMzI0OTMgMC4wMDgzODcKK3Z0IDAuMDIyODg5IDAuMDEwMzE1Cit2dCAwLjAyMTY5MiAwLjAwNzQ3NwordnQgMC4wMzIwMzkgMC4wMDUzMTQKK3Z0IDAuMDE3Nzg4IDAuMDE4NDI1Cit2dCAwLjAxMzM2NCAwLjAyNDU1NAordnQgMC4wMTE0NjMgMC4wMzMxNDgKK3Z0IDAuMDUzODgyIDAuMDA4Mzg3Cit2dCAwLjA1Mzg5OSAwLjAxMjg4NQordnQgMC4wNDY1NTAgMC4wMTI4ODUKK3Z0IDAuMDQ2MTUwIDAuMDA4Mzg3Cit2dCAwLjAzMzExNCAwLjAxMjg4NQordnQgMC4wMjQ3NzMgMC4wMTQ1NDQKK3Z0IDAuNzU2NTUzIDAuNDIwMzMyCit2dCAwLjc1NjYzMCAwLjQyODc2NwordnQgMC43NTY1MjUgMC40MDk5ODgKK3Z0IDAuNDMxOTg4IDAuNDU1MDE4Cit2dCAwLjQzMTk2OCAwLjQ2MzQ2MwordnQgMC40MzE5NzggMC40NzM3NzkKK3Z0IDAuNDMyMjA1IDAuNDk1NjA0Cit2dCAwLjQzMjAzMCAwLjQ5NTYwNAordnQgMC40MzIwMTEgMC40ODc2MTcKK3Z0IDAuNDMyMTg1IDAuNDg3NjE2Cit2dCAwLjc1MjUzMyAwLjM5NDgyMQordnQgMC43NTI5NzkgMC4zOTQ4MjEKK3Z0IDAuNzQ5NDg4IDAuNDA5NTI2Cit2dCAwLjc0OTQ4OCAwLjM5NDc2MwordnQgMC4wMDgzNTQgMC4wNDcyODIKK3Z0IDAuMDExNDYzIDAuMDQ3Mjg1Cit2dCAwLjc1NjcwMCAwLjQwOTk4OAordnQgMC43NTY1MjUgMC4zOTQ4MjEKK3Z0IDAuNzU2NzAwIDAuMzk0ODIxCit2dCAwLjA0NTg4MSAwLjAwNTMxNAordnQgMC4wMzM1NjkgMC4wMTczNjYKK3Z0IDAuMDQ2OTQ4IDAuMDE3MzY2Cit2dCAwLjAyMDYyMSAwLjAyMTI2OAordnQgMC4wMTY2NzIgMC4wMjYyNzQKK3Z0IDAuMDE0ODQ0IDAuMDMzODkyCit2dCAwLjAyNjU0MCAwLjAxODM3OQordnQgMC4wMTQ4NDQgMC4wNDcyOTUKK3Z0IDAuMDE4NjQwIDAuMDM0NTcyCit2dCAwLjAxODY0MCAwLjA0NzI5NQordnQgMC4wMjAyNDIgMC4wMjc2MzYKK3Z0IDAuMDIyOTA2IDAuMDIzNjk4Cit2dCAwLjAyNzkyNiAwLjAyMTgwOAordnQgMC4wMzM2MzcgMC4wMjA2ODMKK3Z0IDAuMDQ2OTQ4IDAuMDIwNjgzCit2dCAwLjA1Mzg0NSAwLjAxNzM2NgordnQgMC4wNTM4NDUgMC4wMjA2ODMKK3Z0IDAuMDI3OTI2IDAuMDM0NTcyCit2dCAwLjAyNzkyNiAwLjA0NzI5NQordnQgMC4wMzM2MzcgMC4wMzQ1NzIKK3Z0IDAuMDMzNjM3IDAuMDQ3Mjk1Cit2dCAwLjA0Njk0OCAwLjAzNDU3MgordnQgMC4wNDY5NDggMC4wNDcyOTUKK3Z0IDAuMDUzODU0IDAuMDM0NTcyCit2dCAwLjA1Mzg0NSAwLjA0NzI5NQordnQgMC4wMjc5MjYgMC4wMjc2MzYKK3Z0IDAuMDMzNjM3IDAuMDI3NjM2Cit2dCAwLjA0Njk0OCAwLjAyNzYzNgordnQgMC4wNTM4NDUgMC4wMjc2MzYKK3Z0IDAuMDk2OTYxIDAuMDA4Mzg3Cit2dCAwLjA5Njk2MSAwLjAwNTMxNAordnQgMC4xMTM3OTkgMC4wMDUzMTQKK3Z0IDAuMTEzNzk5IDAuMDA4Mzg3Cit2dCAwLjA5Njk2MiAwLjAxNzM2NgordnQgMC4wOTY5NjIgMC4wMTI4ODUKK3Z0IDAuMTEzNzk4IDAuMDEyODg1Cit2dCAwLjExMzc5OCAwLjAxNzM2NgordnQgMC40Mjg1ODggMC41Mzg2OTIKK3Z0IDAuNDI4MTQ1IDAuNTM4NjkzCit2dCAwLjQyODA4NSAwLjUxMzYyNAordnQgMC40Mjg1MjcgMC41MTM2MjIKK3Z0IDAuMDcxODg3IDAuMDEyODg1Cit2dCAwLjA3MTg4NSAwLjAwODM4NwordnQgMC40MzIzMDggMC41Mzg2ODMKK3Z0IDAuNDMyMTM0IDAuNTM4NjgzCit2dCAwLjQzMjA3NCAwLjUxMzYxMwordnQgMC40MzIyNDggMC41MTM2MTMKK3Z0IDAuMDk2OTYyIDAuMDIwNjgzCit2dCAwLjA3MTg4OSAwLjAyMDY4MwordnQgMC4wNzE4ODkgMC4wMTczNjYKK3Z0IDAuMDk2OTYyIDAuMDI0NzIyCit2dCAwLjA3MTg4OSAwLjAyNzYzNgordnQgMC4wNjEzMjggMC4wMDgzODcKK3Z0IDAuMDYxMzIwIDAuMDA1MzE0Cit2dCAwLjA3MTg4NCAwLjAwNTMxNAordnQgMC4wNjEzNTAgMC4wMTczNjYKK3Z0IDAuMDYxMzM5IDAuMDEyODg1Cit2dCAwLjc1Mjk3OSAwLjMyNTA0MQordnQgMC43NTI1MzMgMC4zMjUwNDEKK3Z0IDAuMDA4MzU0IDAuMTE3MDU4Cit2dCAwLjAxMTQ2MyAwLjExNzA0NgordnQgMC43NTY3MDAgMC4zMjUwMzkKK3Z0IDAuNzU2NTI1IDAuMzI1MDQwCit2dCAwLjAxNDg0NCAwLjExNzA0MgordnQgMC4wMTg2NDAgMC4xMTYyODkKK3Z0IDAuMDI3OTI2IDAuMTE2Mjg5Cit2dCAwLjAzMzYyMyAwLjExNjI4OQordnQgMC4wNDY5NDggMC4xMTYyODkKK3Z0IDAuMDUzODQ1IDAuMTE2Mjg5Cit2dCAwLjQyODYyOCAwLjU1NTUyNQordnQgMC40MjgxODYgMC41NTU1MjcKK3Z0IDAuNDMyMzQ5IDAuNTU1NTE2Cit2dCAwLjQzMjE3NCAwLjU1NTUxNwordnQgMC4xMTM3OTggMC4wMjA2ODMKK3Z0IDAuMDg3NDM2IDAuMDQwNDkzCit2dCAwLjA4NTgwMyAwLjAzOTAyNAordnQgMC4wOTgzNzMgMC4wMzA0ODYKK3Z0IDAuMDk5Mjk4IDAuMDMyNDc4Cit2dCAwLjExMzc5OCAwLjAyNDcyMgordnQgMC4wNzE4ODkgMC4xMTYyODkKK3Z0IDAuMDk2MjA1IDAuMTE2MzI5Cit2dCAwLjc0OTQ4OCAwLjMyNDk5MwordnQgMC43NTI1MzMgMC4zNTYwNTAKK3Z0IDAuNzQ5NDg4IDAuMzU2MDAyCit2dCAwLjAxMTQ2MyAwLjA4NjAzNQordnQgMC4wMTQ4NDQgMC4wODYwMzAKK3Z0IDAuMDkwNTA4IDAuMDU3MDQzCit2dCAwLjA4ODUyMSAwLjA2Njg3OQordnQgMC4wODc4MDggMC4wNjY4ODIKK3Z0IDAuMDg5ODUyIDAuMDU2NzY5Cit2dCAwLjA5MDUwNyAwLjA3NjcwOAordnQgMC4wODk4NTEgMC4wNzY5ODkKK3Z0IDAuMDk1OTI2IDAuMDQ5MDExCit2dCAwLjA5NjYwMiAwLjA0OTY4NwordnQgMC4wOTEzOTAgMC4wNTc0MTUKK3Z0IDAuMTEzNzk4IDAuMDkxMTkxCit2dCAwLjExMzc5OCAwLjA5MjE0OAordnQgMC4xMDQwMTYgMC4wOTAxNjgKK3Z0IDAuMTA0MzM1IDAuMDg5Mjg3Cit2dCAwLjA5NjAxMSAwLjA4NDY2NwordnQgMC4wOTY2MDIgMC4wODQwNjkKK3Z0IDAuMDkxMzg5IDAuMDc2MzM2Cit2dCAwLjEwMzY4NSAwLjA0MjkzNwordnQgMC4xMDM5NjMgMC4wNDM1OTEKK3Z0IDAuMDk1NDIyIDAuMDQ4NTEwCit2dCAwLjExMzc5OCAwLjA0MDg4NAordnQgMC4xMTM3OTggMC4wNDE1OTQKK3Z0IDAuMDc0MzMxIDAuMDY2OTA2Cit2dCAwLjA3NzYxNiAwLjA1MTAzMgordnQgMC4wNzk0NTggMC4wNTIzMTQKK3Z0IDAuMDc2NTI2IDAuMDY2OTA2Cit2dCAwLjA4NDY1NSAwLjA1NDU0NQordnQgMC4wODIxNjcgMC4wNjY4OTgKK3Z0IDAuMDg0NjU0IDAuMDc5MTUyCit2dCAwLjA3OTQ1OCAwLjA4MTMwOAordnQgMC4xMTM3OTggMC4xMDYyNzAKK3Z0IDAuMDk4NDgzIDAuMTAzMTgyCit2dCAwLjA5OTI5OCAwLjEwMTE0NAordnQgMC4xMTM3OTggMC4xMDQwNzUKK3Z0IDAuMTEzNzk4IDAuMDI5NTQ3Cit2dCAwLjExMzc5OCAwLjAzNTIxOQordnQgMC4xMDE0OTIgMC4wMzc3MTEKK3Z0IDAuMDkxNDI5IDAuMDQ0NTA1Cit2dCAwLjA5NTUwOCAwLjA4NTE3MwordnQgMC4wOTEyMTggMC4wODk0NzUKK3Z0IDAuMTAzNzM5IDAuMDkwODI3Cit2dCAwLjEwMTUxOSAwLjA5NTk4OQordnQgMC4xMTM3OTggMC4wOTI4NjQKK3Z0IDAuMTEzNzk4IDAuMDk4NDczCit2dCAwLjA4NjkyOCAwLjA5Mzc3MAordnQgMC4wODU0MDYgMC4wOTUzMTkKK3Z0IDAuMDc3NTQ2IDAuMDgyNDI0Cit2dCAwLjA3MTg4OSAwLjA0NzI5NQordnQgMC4wNzE4MDQgMC4wMzQ1NzIKK3Z0IDAuMTEzNzk4IDAuMDI3MzUyCit2dCAwLjExMzc5OCAwLjExNjMyOQordnQgMC4wNzE4ODkgMC4wODYwMzAKK3Z0IDAuNDI4MDYwIDAuNTAzMDYyCit2dCAwLjQyODUwMiAwLjUwMzA2MQordnQgMC40MzIwNDggMC41MDMwNTIKK3Z0IDAuNDMyMjIzIDAuNTAzMDUyCit2dCAwLjA2MTM4NCAwLjAyMDY4MwordnQgMC4wNjEzODQgMC4wNDcyOTUKK3Z0IDAuMDYxMjgzIDAuMDM0NTcyCit2dCAwLjA2MTM4NCAwLjAyNzYzNgordnQgMC4wNTM4NzAgMC4wMDUzMTQKK3Z0IDAuMDYxMzg0IDAuMDg2MDMwCit2dCAwLjA2MTM4NCAwLjExNjI4OQordnQgMC4wNTM4NDUgMC4wODYwMzAKK3Z0IDAuMTEzNzk4IDAuMDQyNTU5Cit2dCAwLjExMzc5OCAwLjA0MjczOQordnQgMC4xMDQ0MDQgMC4wNDQ2MzkKK3Z0IDAuMTA0MzM1IDAuMDQ0NDczCit2dCAwLjA5NjcyOSAwLjA0OTgxNQordnQgMC4wOTE1NTUgMC4wNTc0ODYKK3Z0IDAuMDg5NjU3IDAuMDY2ODgwCit2dCAwLjA4OTQ3OCAwLjA2Njg3OQordnQgMC4wOTE1NTQgMC4wNzYyNjgKK3Z0IDAuMDk2NzI4IDAuMDgzOTQ0Cit2dCAwLjEwNDQwNSAwLjA4OTEyMwordnQgMC4xMTM3OTggMC4wOTEwMTQKK3Z0IDAuNDQxOTIxIDAuMDEzMTg3Cit2dCAwLjQ0NzYzMiAwLjAyMTY1NgordnQgMC40NDYzNDQgMC4wMjIxOTQKK3Z0IDAuNDQxMDA0IDAuMDE0MjM3Cit2dCAwLjQ0OTczMCAwLjAzMTk5MAordnQgMC40NDgzNjEgMC4wMzIyMzYKK3Z0IDAuNDQ5NzMwIDAuMDQ3MTQzCit2dCAwLjQ0ODM2MSAwLjA0NzE0MwordnQgMC4zNDEzOTQgMC4wMDUzMTMKK3Z0IDAuMzU4MjMyIDAuMDA1MzEzCit2dCAwLjM1ODIzMiAwLjAwNjczNgordnQgMC4zNDEzOTQgMC4wMDY3MzYKK3Z0IDAuMzgzMzA5IDAuMDA1MzEzCit2dCAwLjM4MzMwOSAwLjAwNjczNgordnQgMC4zOTM4NzIgMC4wMDUzMTMKK3Z0IDAuMzkzODcyIDAuMDA2NzM2Cit2dCAwLjQwMTMyMiAwLjAwNTMxMwordnQgMC40MDEzMjIgMC4wMDY3MzYKK3Z0IDAuNDA5MzEyIDAuMDA1MzEzCit2dCAwLjQwOTMxMiAwLjAwNjczNgordnQgMC40MjMxMzkgMC4wMDUzMTMKK3Z0IDAuNDIzMDAyIDAuMDA2NzM2Cit2dCAwLjQzMzQ0MiAwLjAwNzQ2NwordnQgMC40MzI5MDMgMC4wMDg3NTQKK3Z0IDAuODU4NzM0IDAuNzg2NTQwCit2dCAwLjg1ODg4MSAwLjc4NjUwMQordnQgMC44NTg4ODEgMC43OTY3ODQKK3Z0IDAuODYyOTAyIDAuMDk3MzE0Cit2dCAwLjg2Mjc1MyAwLjA5NzI4MgordnQgMC44NjI5MDIgMC4wODcwNjkKK3Z0IDAuODU3NzIyIDAuNDMzNTYwCit2dCAwLjg1Nzg3NiAwLjQzMzQ5OQordnQgMC44NTc4NzYgMC40NDM4NDQKK3Z0IDAuODU4MDgwIDAuNzU0OTk2Cit2dCAwLjg1ODIzNCAwLjc1NDk3OQordnQgMC44NTgyMzQgMC43NjUyODEKK3Z0IDAuNTQ5MDc2IDAuODQ4NzY2Cit2dCAwLjU0OTIyNSAwLjg0ODczNgordnQgMC41NDkyMjUgMC44NTkwMTEKK3Z0IDAuODU5NTc1IDAuNTg2MDMzCit2dCAwLjg1OTQyNSAwLjU4NjAxMQordnQgMC44NTk1NzUgMC41NzU3ODYKK3Z0IDAuNjE5MTc1IDAuODU3NzM5Cit2dCAwLjYxOTAyMiAwLjg1NzcyMAordnQgMC42MTkxNzUgMC44NDc0MDUKK3Z0IDAuNjA4MTM4IDAuODU3NzQwCit2dCAwLjYwNzk4NSAwLjg1NzY3NwordnQgMC42MDgxMzggMC44NDc0MDYKK3Z0IDAuODM2Nzg5IDAuNjQwNzg2Cit2dCAwLjgzNjYzNSAwLjY0MDc4MgordnQgMC44MzY3ODkgMC42MjY5NDUKK3Z0IDAuMTY2ODM3IDAuODM4Mjc3Cit2dCAwLjE2NjY4NCAwLjgzODI1OQordnQgMC4xNjY4MzcgMC44MjQ0MzYKK3Z0IDAuNzU2ODU0IDAuNDA5OTcwCit2dCAwLjgyOTI5NCAwLjEyNzkxOAordnQgMC44Mjk0NDggMC4xMjc5MTYKK3Z0IDAuODI5NDQ4IDAuMTQzMDY3Cit2dCAwLjQzMjM1OCAwLjQ5NTYwNgordnQgMC40ODIyNzkgMC44Nzc5NjYKK3Z0IDAuNDgyMTI2IDAuODc3OTYxCit2dCAwLjQ4MjI3OSAwLjg2OTk3NAordnQgMC40MzI0NjIgMC41Mzg2ODQKK3Z0IDAuNzk2NzMwIDAuMjU5NDc2Cit2dCAwLjc5NjU3NyAwLjI1OTQ3MwordnQgMC43OTY3MzAgMC4yMzQ0MDQKK3Z0IDAuNDMyNTAyIDAuNTU1NTE4Cit2dCAwLjgyNTI2NSAwLjQ4NDcwMQordnQgMC44MjUxMTEgMC40ODQ2OTcKK3Z0IDAuODI1MjY1IDAuNDY3ODY1Cit2dCAwLjQzMjQwMSAwLjUxMzYxNQordnQgMC42OTQ4NzkgMC44NTYwNjIKK3Z0IDAuNjk0NzI2IDAuODU2MDU4Cit2dCAwLjY5NDg3OSAwLjg0NTQ5OAordnQgMC40MzIzNzYgMC41MDMwNTMKK3Z0IDAuODg2NTYxIDAuMjA5MzU4Cit2dCAwLjg4NjQwOCAwLjIwOTM1MwordnQgMC44ODY1NjEgMC4yMDE5MDYKK3Z0IDAuNzgxNjUxIDAuODc2MDk5Cit2dCAwLjc4MTQ3NiAwLjg2NzY2NgordnQgMC43ODE2NTEgMC44Njc2NjQKK3Z0IDAuNzU2NzI3IDAuNDIwMzMyCit2dCAwLjg3NDk3MiAwLjAxMzc2MAordnQgMC44NzQ3OTggMC4wMDUzMTcKK3Z0IDAuODc0OTcyIDAuMDA1MzEzCit2dCAwLjQzMjE2MiAwLjQ1NTAxOAordnQgMC40MTQ1NTYgMC44NTczNjgKK3Z0IDAuNDE0MzgxIDAuODQ3MDUzCit2dCAwLjQxNDU1NiAwLjg0NzA1MAordnQgMC40MzIxNDIgMC40NjM0NjIKK3Z0IDAuNDMyMTUyIDAuNDczNzc4Cit2dCAwLjc1Mjk3OSAwLjM3NTE3MgordnQgMC43NTI1MzMgMC4zNzUxNzIKK3Z0IDAuNzUyOTc5IDAuMzU2MDUwCit2dCAwLjc0OTQ4OCAwLjM3NTEyNAordnQgMC4wMDgzNTQgMC4wNjY5MjMKK3Z0IDAuMDExNDYzIDAuMDY2OTExCit2dCAwLjAwODM1NCAwLjA4NjA0NgordnQgMC4wMTQ4NDQgMC4wNjY5MDcKK3Z0IDAuMDE4NjQwIDAuMDY2OTA3Cit2dCAwLjAxODY0MCAwLjA4NjAzMAordnQgMC4wMjc5MjYgMC4wNjY5MDcKK3Z0IDAuMDI3OTI2IDAuMDg2MDMwCit2dCAwLjAzMzYyOSAwLjA2NjkwNwordnQgMC4wMzM2MjMgMC4wODYwMzAKK3Z0IDAuMDcxODg5IDAuMDY2OTA3Cit2dCAwLjQ0OTczMCAwLjA2Njc5NQordnQgMC40NDgzNjEgMC4wNjY3OTUKK3Z0IDAuNzU2ODU0IDAuMzk0ODE5Cit2dCAwLjc1NjcwMCAwLjM3NTE3MgordnQgMC42OTQ3MjYgMC43OTI1MzUKK3Z0IDAuNjk0ODgwIDAuNzkyNTMzCit2dCAwLjY5NDg4MCAwLjgxMjE4MgordnQgMC43NTY1MjUgMC4zNzUxNzIKK3Z0IDAuMDQ2ODU2IDAuMDY2OTA3Cit2dCAwLjA2MTM4NCAwLjA2NjkwNwordnQgMC4wNTM4NDUgMC4wNjY5MDcKK3Z0IDAuMDQ2OTQ4IDAuMDg2MDMwCit2dCAwLjczNTMyMiAwLjQyMDIxNAordnQgMC43MzU3NjggMC40MjAyMTQKK3Z0IDAuNzM1ODE3IDAuNDI4NTEyCit2dCAwLjczNTM3MSAwLjQyODUxMgordnQgMC43MzUzMDMgMC40MDk4NjYKK3Z0IDAuNzM1NzQ5IDAuNDA5ODY2Cit2dCAwLjQyODkyNSAwLjY1NjIyNAordnQgMC40Mjg0NzkgMC42NTYyMjYKK3Z0IDAuNDI4NDE5IDAuNjQ3NjM0Cit2dCAwLjQyODg2NSAwLjY0NzYzMwordnQgMC40MjgzODIgMC42MzcyNjUKK3Z0IDAuNDI4ODI1IDAuNjM3MjY0Cit2dCAwLjQyODc3MiAwLjYxNTQzMwordnQgMC40Mjg3ODEgMC42MjM0NzQKK3Z0IDAuNDI4MzUxIDAuNjIzNDcyCit2dCAwLjQyODMzMCAwLjYxNTQzNAordnQgMC4yMTIyMzQgMC4wMTU0MTcKK3Z0IDAuMjE0NDI0IDAuMDEzMjIyCit2dCAwLjIyMDE3NCAwLjAyMTc0NAordnQgMC4yMTczMTQgMC4wMjI5MTkKK3Z0IDAuMjIyMjgzIDAuMDMyMTc5Cit2dCAwLjIxOTIzOSAwLjAzMjQ2MgordnQgMC4xOTUyNTUgMC4wMDgzODcKK3Z0IDAuMTk1NTU5IDAuMDA1MzE0Cit2dCAwLjIwNTkwNCAwLjAwNzQ3NwordnQgMC4yMDQ3MDYgMC4wMTAzMTUKK3Z0IDAuMjEzMDcyIDAuMDI0NTc0Cit2dCAwLjIwODk4NSAwLjAxODQyOAordnQgMC4yMTQ3MzAgMC4wMzMyMDIKK3Z0IDAuMTczNzE5IDAuMDA4Mzg3Cit2dCAwLjE4MTc2MyAwLjAwODM4NwordnQgMC4xODE3NjMgMC4wMTI4ODUKK3Z0IDAuMTczNzE0IDAuMDEyODg1Cit2dCAwLjIwMjkzMCAwLjAxNDU0NAordnQgMC4xOTQ4MDMgMC4wMTI4ODUKK3Z0IDAuNzMxNzc1IDAuNDIwMjEzCit2dCAwLjczMTgyNSAwLjQyODUxMQordnQgMC43MzE3NTcgMC40MDk4NjUKK3Z0IDAuNDMyNDcyIDAuNjU2MjE1Cit2dCAwLjQzMjQxMSAwLjY0NzYyNAordnQgMC40MzIzNzEgMC42MzcyNTUKK3Z0IDAuNDMyNDkzIDAuNjE1NDI0Cit2dCAwLjQzMjUxMiAwLjYyMzQ2NQordnQgMC40MzIzMzggMC42MjM0NjUKK3Z0IDAuNDMyMzE4IDAuNjE1NDI0Cit2dCAwLjczNTMwMyAwLjM5ODU1OQordnQgMC43MzU3NDkgMC4zOTg1NjAKK3Z0IDAuNzM4ODYwIDAuMzk4MTU2Cit2dCAwLjczODg2MSAwLjQwOTQ0OAordnQgMC4yMTkyMzkgMC4wNDM3NjEKK3Z0IDAuMjE0NzMwIDAuMDQ0MTc5Cit2dCAwLjczMTU4MyAwLjQwOTg2NQordnQgMC43MzE1ODIgMC4zOTg1NTgKK3Z0IDAuNzMxNzU3IDAuMzk4NTU4Cit2dCAwLjQyNTMxNCAwLjYzNzAwOAordnQgMC40MjUyNzMgMC42MjM1MTkKK3Z0IDAuMTgxNzYzIDAuMDA1MzEzCit2dCAwLjE5NDM1NCAwLjAxNzM2NgordnQgMC4xODE3NjUgMC4wMTczNjYKK3Z0IDAuMjA1ODIxIDAuMDIxNTQ2Cit2dCAwLjIwODg1MSAwLjAyNjMxMgordnQgMC4yMTAyNDIgMC4wMzM5NDYKK3Z0IDAuMjAxMTYzIDAuMDE4NzU5Cit2dCAwLjIxMDI0MiAwLjA0NDYwMQordnQgMC4yMDY0NDcgMC4wNDQ2MDEKK3Z0IDAuMjA2NDQ3IDAuMDM0NjI1Cit2dCAwLjIwNTI4MSAwLjAyNzk0MAordnQgMC4yMDI2ODcgMC4wMjQ0ODAKK3Z0IDAuMTk5NjY5IDAuMDIyMzUxCit2dCAwLjE5Mzk3NCAwLjAyMDY4MwordnQgMC4xODE3NjUgMC4wMjA2ODMKK3Z0IDAuMTczNzUxIDAuMDE3MzY2Cit2dCAwLjE3Mzc1MSAwLjAyMDY4MwordnQgMC4xOTk2NjkgMC4wNDQ2MDEKK3Z0IDAuMTk5NjY5IDAuMDM0NjI1Cit2dCAwLjE5Mzk3NCAwLjA0NDYwMQordnQgMC4xOTM5NzQgMC4wMzQ2MjUKK3Z0IDAuMTgxNzY1IDAuMDQ0NjAxCit2dCAwLjE4MTc2NSAwLjAzNDYyNQordnQgMC4xNzM3NTEgMC4wNDQ2MDEKK3Z0IDAuMTczNzQyIDAuMDM0NjI1Cit2dCAwLjE5OTY2OSAwLjAyODIzNAordnQgMC4xOTM5NzQgMC4wMjgyMzQKK3Z0IDAuMTgxNzY1IDAuMDI4MjM0Cit2dCAwLjE3Mzc1MSAwLjAyODIzNAordnQgMC4xMzA2MzUgMC4wMDgzODcKK3Z0IDAuMTMwNjM2IDAuMDA1MzE0Cit2dCAwLjEzMDYzNCAwLjAxNzM2NgordnQgMC4xMzA2MzQgMC4wMTI4ODUKK3Z0IDAuNDI4NjY4IDAuNTcyMzU4Cit2dCAwLjQyODcyOSAwLjU5NzQyOAordnQgMC40MjgyODYgMC41OTc0MjkKK3Z0IDAuNDI4MjI2IDAuNTcyMzU5Cit2dCAwLjE1NTcxMSAwLjAwODM4NwordnQgMC4xNTU3MDkgMC4wMTI4ODUKK3Z0IDAuNDMyMzg5IDAuNTcyMzQ4Cit2dCAwLjQzMjQ0OSAwLjU5NzQxOAordnQgMC40MzIyNzUgMC41OTc0MTkKK3Z0IDAuNDMyMjE1IDAuNTcyMzQ5Cit2dCAwLjE1NTcwNiAwLjAxNzM2NgordnQgMC4xNTU3MDYgMC4wMjA2ODMKK3Z0IDAuMTMwNjM0IDAuMDIwNjgzCit2dCAwLjE1NTcwNiAwLjAyODIzNAordnQgMC4xMzA2MzQgMC4wMjQ3MjIKK3Z0IDAuMTY0Njc2IDAuMDA4Mzg3Cit2dCAwLjE1NTcxMyAwLjAwNTMxNAordnQgMC4xNjQ2NzggMC4wMDUzMTQKK3Z0IDAuMTY0NjYyIDAuMDE3MzY2Cit2dCAwLjE2NDY3MyAwLjAxMjg4NQordnQgMC43MzU3NDYgMC4zMjU3NzYKK3Z0IDAuNzM1MzAwIDAuMzI1Nzc2Cit2dCAwLjIxNDczMCAwLjExNjI5NQordnQgMC4yMTkyMzkgMC4xMTYzMDYKK3Z0IDAuNzMxNzUzIDAuMzI1Nzc1Cit2dCAwLjczMTU3OSAwLjMyNTc3NQordnQgMC4yMDY0NDcgMC4xMTYyODkKK3Z0IDAuMjEwMjQyIDAuMTE2Mjg5Cit2dCAwLjE5OTY2OSAwLjExNjI4OQordnQgMC4xOTM5NzQgMC4xMTYyODkKK3Z0IDAuMTgxNzY1IDAuMTE2Mjg5Cit2dCAwLjE3Mzc1MCAwLjExNjI4OQordnQgMC4xNDAxNjAgMC4wNDA0OTMKK3Z0IDAuMTI4Mjk4IDAuMDMyNDc4Cit2dCAwLjEyOTIyMyAwLjAzMDQ4NgordnQgMC4xNDE3OTMgMC4wMzkwMjQKK3Z0IDAuMTMxMTM4IDAuMTE2MzI5Cit2dCAwLjE1NTcwNiAwLjExNjI4OQordnQgMC43MzU3NDcgMC4zNTYwMTUKK3Z0IDAuNzM4ODU3IDAuMzI1NjYyCit2dCAwLjczODg1OSAwLjM1NTkwMAordnQgMC4yMTQ3MzAgMC4wODYwMzUKK3Z0IDAuMjEwMjQyIDAuMDg2MDMwCit2dCAwLjEzNzA5MSAwLjA1NzA0MwordnQgMC4xMzc3NDggMC4wNTY3NjkKK3Z0IDAuMTM5NzA2IDAuMDY2ODgyCit2dCAwLjEzODk5NSAwLjA2Njg3OQordnQgMC4xMzc3NDMgMC4wNzY5ODkKK3Z0IDAuMTM3MDg2IDAuMDc2NzA5Cit2dCAwLjEzNjIwOSAwLjA1NzQxNgordnQgMC4xMzA5OTIgMC4wNDk2ODYKK3Z0IDAuMTMxNjY5IDAuMDQ5MDA5Cit2dCAwLjEyMzI2NSAwLjA4OTI4NwordnQgMC4xMjM2MzcgMC4wOTAxNjgKK3Z0IDAuMTMwOTkyIDAuMDg0MDY4Cit2dCAwLjEzMTY2OSAwLjA4NDc0NAordnQgMC4xMzYyMDQgMC4wNzYzMzcKK3Z0IDAuMTIzOTEwIDAuMDQyOTM3Cit2dCAwLjEzMjE3MyAwLjA0ODUwOAordnQgMC4xMjM2MzMgMC4wNDM1OTEKK3Z0IDAuMTUzMjY1IDAuMDY2OTA2Cit2dCAwLjE1MTA3MCAwLjA2NjkwNgordnQgMC4xNDgxMzggMC4wNTIzMTQKK3Z0IDAuMTQ5OTgwIDAuMDUxMDMyCit2dCAwLjE0NTM4OCAwLjA2Njg5OAordnQgMC4xNDI5NDMgMC4wNTQ1NDUKK3Z0IDAuMTQ4MTM4IDAuMDgxMzA4Cit2dCAwLjE0Mjk0MSAwLjA3OTE1MgordnQgMC4xMjgyOTggMC4xMDExNDQKK3Z0IDAuMTI5MTEzIDAuMTAzMTgyCit2dCAwLjEyNjEwNCAwLjAzNzcxMQordnQgMC4xMzYxNjYgMC4wNDQ1MDQKK3Z0IDAuMTM2Mzk1IDAuMDg5NTExCit2dCAwLjEzMjE3MyAwLjA4NTI1MQordnQgMC4xMjYxMDYgMC4wOTU5ODkKK3Z0IDAuMTIzOTE1IDAuMDkwODI3Cit2dCAwLjE0MDYxNyAwLjA5Mzc2NAordnQgMC4xNDE5NzAgMC4wOTUzMTUKK3Z0IDAuMTUwMDUwIDAuMDgyNDI0Cit2dCAwLjE1NTcwNiAwLjA0NDYwMQordnQgMC4xNTU2NjkgMC4wMzQ2MjUKK3Z0IDAuMTU1NzA2IDAuMDg2MDMwCit2dCAwLjQyODc1MCAwLjYwNjM5MQordnQgMC40MjgzMDggMC42MDYzOTIKK3Z0IDAuNDMyNDcxIDAuNjA2MzgyCit2dCAwLjQzMjI5NyAwLjYwNjM4MgordnQgMC4xNjQ2NjIgMC4wMjA2ODMKK3Z0IDAuMTY0NjQwIDAuMDM0NjI1Cit2dCAwLjE2NDY2MiAwLjA0NDYwMQordnQgMC4xNjQ2NjIgMC4wMjgyMzQKK3Z0IDAuMTczNzIzIDAuMDA1MzE0Cit2dCAwLjE2NDY2MSAwLjA4NjAzMAordnQgMC4xNjQ2NjEgMC4xMTYyODkKK3Z0IDAuMTczNzUxIDAuMDg2MDMwCit2dCAwLjEyMzI2MSAwLjA0NDQ3MwordnQgMC4xMjMxOTEgMC4wNDQ2MzkKK3Z0IDAuMTMwODY2IDAuMDQ5ODE0Cit2dCAwLjEzNjA0NSAwLjA1NzQ4NgordnQgMC4xMzgxMjMgMC4wNjY4NzkKK3Z0IDAuMTM3OTQ1IDAuMDY2ODgwCit2dCAwLjEzNjAzOSAwLjA3NjI2OQordnQgMC4xMzA4NjYgMC4wODM5NDMKK3Z0IDAuMTIzMTk1IDAuMDg5MTIzCit2dCAwLjI0MDg3NiAwLjAxMzE3OQordnQgMC4yNDE4NTIgMC4wMTQxNjUKK3Z0IDAuMjM2NDQ3IDAuMDIyMTkxCit2dCAwLjIzNTE1OSAwLjAyMTY1MwordnQgMC4yMzQ0MzEgMC4wMzIxODEKK3Z0IDAuMjMzMDU5IDAuMDMyMDQ0Cit2dCAwLjIzNDQzMSAwLjA0MzM0NAordnQgMC4yMzMwNTkgMC4wNDMzNDQKK3Z0IDAuMjMzMDU5IDAuMDg1OTE5Cit2dCAwLjIzNDQzMSAwLjA4NTkxOQordnQgMC4yMzQ0MzEgMC4xMTYxODAKK3Z0IDAuMjMzMDU5IDAuMTE2MTgwCit2dCAwLjMyNDU1NyAwLjAwNjczNgordnQgMC4zMjQ1NTcgMC4wMDUzMTMKK3Z0IDAuMjk5NDgwIDAuMDA2NzM3Cit2dCAwLjI5OTQ4MCAwLjAwNTMxMwordnQgMC4yOTA1MTUgMC4wMDY3MzcKK3Z0IDAuMjkwNTE1IDAuMDA1MzEzCit2dCAwLjI4MTQ3MCAwLjAwNjczNwordnQgMC4yODE0NzAgMC4wMDUzMTMKK3Z0IDAuMjczNDI3IDAuMDA2NzM2Cit2dCAwLjI3MzQyNyAwLjAwNTMxMwordnQgMC4yNTk3ODYgMC4wMDY3MzcKK3Z0IDAuMjU5NjQ5IDAuMDA1MzEzCit2dCAwLjI0OTg4NyAwLjAwODc1NAordnQgMC4yNDkzNDggMC4wMDc0NjcKK3Z0IDAuNDYwNjU1IDAuODU5MzI5Cit2dCAwLjQ2MDUwNiAwLjg0OTEwOQordnQgMC40NjA2NTUgMC44NDkwNzcKK3Z0IDAuODU4NzA1IDAuNzMwNDk3Cit2dCAwLjg1ODcwNSAwLjc0MDc3NwordnQgMC44NTg1NTYgMC43NDA3NDgKK3Z0IDAuMDQ5NjcxIDAuODU0NTQ5Cit2dCAwLjA0OTUyMiAwLjg0Mzk0OQordnQgMC4wNDk2NzEgMC44NDM5MzEKK3Z0IDAuODUyOTczIDAuMTI3OTE2Cit2dCAwLjg1Mjk3MyAwLjEzODU2MgordnQgMC44NTI4MjQgMC4xMzg1MzMKK3Z0IDAuODYyNDg1IDAuMTc1MTU4Cit2dCAwLjg2MjMzNiAwLjE2NDk0MwordnQgMC44NjI0ODUgMC4xNjQ5MTEKK3Z0IDAuMTc3NjEzIDAuODQ4ODgyCit2dCAwLjE3NzYxMyAwLjg1OTE1NwordnQgMC4xNzc0NjQgMC44NTkxMjgKK3Z0IDAuNjU0NzM5IDAuODU3MjQ2Cit2dCAwLjY1NDU4NiAwLjg0NjkyMgordnQgMC42NTQ3MzkgMC44NDY4NjMKK3Z0IDAuNDQzNDI3IDAuODU3MjIxCit2dCAwLjQ0MzI3MyAwLjg0Njg1MwordnQgMC40NDM0MjcgMC44NDY4MzgKK3Z0IDAuNDgyMjc5IDAuODM4NDUwCit2dCAwLjQ4MjEyNiAwLjgyNDY3NwordnQgMC40ODIyNzkgMC44MjQ2NjIKK3Z0IDAuNDYwNjYwIDAuODI0NjYyCit2dCAwLjQ2MDY2MCAwLjgzODQ1MgordnQgMC40NjA1MDYgMC44Mzg0NTAKK3Z0IDAuODQ3MjA1IDAuNDY3ODY1Cit2dCAwLjg0NzIwNSAwLjQ3OTE1NwordnQgMC44NDcwNTQgMC40NzkxNTEKK3Z0IDAuNzMxNDMyIDAuNDA5ODQ1Cit2dCAwLjU0OTIyOSAwLjg3NzY3NwordnQgMC41NDkwNzYgMC44Njk2MzgKK3Z0IDAuNTQ5MjI5IDAuODY5NjM3Cit2dCAwLjQzMjY0NiAwLjYxNTQyNgordnQgMC43OTY4MjcgMC4wMDUzMTMKK3Z0IDAuNzk2ODI3IDAuMDMwMzgzCit2dCAwLjc5NjY3NCAwLjAzMDM4MQordnQgMC40MzI1NDMgMC41NzIzNTAKK3Z0IDAuNzg2MDQ2IDAuMDM1NTczCit2dCAwLjc4NTg5NyAwLjAzNTU3MwordnQgMC43ODYwNDYgMC4wMDUzMTMKK3Z0IDAuNzg2MDQ4IDAuMDc2NDQ0Cit2dCAwLjc4NTg5NyAwLjA3NjQzNwordnQgMC43ODYwNDggMC4wNDYxOTkKK3Z0IDAuODI1MjY1IDAuNDk1MzI2Cit2dCAwLjgyNTI2NSAwLjUxMjE1OAordnQgMC44MjUxMTEgMC41MTIxNTYKK3Z0IDAuODczOTc0IDAuMjQzMzY2Cit2dCAwLjg3MzgyMSAwLjIzNDQwNAordnQgMC44NzM5NzQgMC4yMzQ0MDQKK3Z0IDAuNDMyNjAzIDAuNTk3NDIwCit2dCAwLjg3MzEzMCAwLjI4MDQ1MAordnQgMC44NzI5NzcgMC4yNzE0MDgKK3Z0IDAuODczMTMwIDAuMjcxNDA4Cit2dCAwLjQzMjYyNCAwLjYwNjM4MwordnQgMC43MzE2MDEgMC40MjAyMTMKK3Z0IDAuNzA3NDkwIDAuODc2Mjg5Cit2dCAwLjcwNzMxNiAwLjg3NjI4NAordnQgMC43MDc0OTAgMC44Njc5ODgKK3Z0IDAuNDMyNjQ2IDAuNjU2MjE1Cit2dCAwLjA4MTMxMiAwLjg3NTM1MgordnQgMC4wODExMzggMC44NzUzNDgKK3Z0IDAuMDgxMzEyIDAuODY2NzU4Cit2dCAwLjQzMjU4NSAwLjY0NzYyNAordnQgMC4zNzM2MDcgMC44NTcxODIKK3Z0IDAuMzczNDMzIDAuODU3MTc4Cit2dCAwLjM3MzYwNyAwLjg0NjgxMAordnQgMC40MzI1NDUgMC42MzcyNTQKK3Z0IDAuNzM1MzAxIDAuMzU2MDE1Cit2dCAwLjczMTc1NSAwLjM1NjAxNAordnQgMC4yMzQ0MzEgMC4wNjY3OTUKK3Z0IDAuMjM0NDMxIDAuMDc0MTY0Cit2dCAwLjIzMzA1OSAwLjA3NDE2NAordnQgMC4yMzMwNTkgMC4wNjY3OTUKK3Z0IDAuODkwNTQzIDAuMzU2MzA4Cit2dCAwLjg5MDU0MyAwLjM2MzY3MgordnQgMC44OTAzOTIgMC4zNjM2NjcKK3Z0IDAuNzMxNTgxIDAuMzY3NzYwCit2dCAwLjczMTU4MSAwLjM3NTEyNAordnQgMC43MzE0MzAgMC4zNzUxMTkKK3Z0IDAuNzMxNzU1IDAuMzY3NzYwCit2dCAwLjczMTc1NSAwLjM3NTEyNAordnQgMC43MzUzMDIgMC4zNjc3NjEKK3Z0IDAuNzM1MzAyIDAuMzc1MTI1Cit2dCAwLjczNTc0OCAwLjM2Nzc2MgordnQgMC43MzU3NDggMC4zNzUxMjUKK3Z0IDAuNzM4ODU5IDAuMzY3Njk2Cit2dCAwLjczODg1OSAwLjM3NTAxMQordnQgMC4yMTkyMzkgMC4wNzQyNDMKK3Z0IDAuMjE0NzMwIDAuMDc0MjU0Cit2dCAwLjIxNDczMCAwLjA2NjkxMQordnQgMC4yMTkyMzkgMC4wNjY5MjMKK3Z0IDAuMjA2NDQ3IDAuMDY2OTA3Cit2dCAwLjIwNjQ0NyAwLjA3NDI2MgordnQgMC4xOTk2NjkgMC4wNzQyNjIKK3Z0IDAuMTk5NjY5IDAuMDY2OTA3Cit2dCAwLjE5NDAzNSAwLjA3NDI2MgordnQgMC4xOTQwMzUgMC4wNjY5MDcKK3Z0IDAuMTg4Mzc4IDAuMDc0MjQ0Cit2dCAwLjE4ODM3NyAwLjA2NjkwNwordnQgMC4xNzM3NTEgMC4wNjY5MDcKK3Z0IDAuMTc1MTMyIDAuMDY2OTA3Cit2dCAwLjE3NTEzNCAwLjA3NDI0NAordnQgMC4xNzM3NTEgMC4wNzQyNDQKK3Z0IDAuMTU1NzA2IDAuMDU0MDU1Cit2dCAwLjIzNDQzMSAwLjA1MzMwMwordnQgMC4yMzQ0MzEgMC4wNTkzNzkKK3Z0IDAuMjMzMDU5IDAuMDU5Mzc5Cit2dCAwLjIzMzA1OSAwLjA1MzMwMwordnQgMC4yMzMwNTkgMC4wODAxMDUKK3Z0IDAuMjM0NDMxIDAuMDgwMTA1Cit2dCAwLjkwMTIxMiAwLjQzMzQ5OQordnQgMC45MDEyMTIgMC40Mzk1NzEKK3Z0IDAuOTAxMDYxIDAuNDM5NTY1Cit2dCAwLjczMTU4MiAwLjM4MjUzNQordnQgMC43MzE1ODIgMC4zODg2MDcKK3Z0IDAuNzMxNDMxIDAuMzg4NjAxCit2dCAwLjc1MTcyNCAwLjg3OTk1NwordnQgMC43NTE3MjQgMC44ODczNjgKK3Z0IDAuNzUxNTczIDAuODg3MzYyCit2dCAwLjczMTQzMCAwLjM4MjUyOQordnQgMC43MzE1ODEgMC4zNjE4MjQKK3Z0IDAuNzMxNDMwIDAuMzY3NzU1Cit2dCAwLjkwMTMzOCAwLjQ2Nzg2NQordnQgMC45MDEzMzggMC40NzM4MDEKK3Z0IDAuOTAxMTg2IDAuNDczNzk2Cit2dCAwLjczMTc1NiAwLjM4MjUzNQordnQgMC43MzE3NTYgMC4zODg2MDcKK3Z0IDAuNzMxNzU1IDAuMzYxODI0Cit2dCAwLjczNTMwMiAwLjM4MjUzNgordnQgMC43MzUzMDIgMC4zODg2MDgKK3Z0IDAuNzM1MzAxIDAuMzYxODI1Cit2dCAwLjczNTc0OCAwLjM4MjUzNgordnQgMC43MzU3NDggMC4zODg2MDgKK3Z0IDAuNzM1NzQ3IDAuMzYxODI1Cit2dCAwLjczODg2MCAwLjM4MjQxOAordnQgMC43Mzg4NjAgMC4zODg0NzEKK3Z0IDAuNzM4ODU5IDAuMzYxNzAxCit2dCAwLjIxOTIzOSAwLjA1OTUxMAordnQgMC4yMTQ3MzAgMC4wNTk1MDMKK3Z0IDAuMjE0NzMwIDAuMDUzNDc2Cit2dCAwLjIxOTIzOSAwLjA1MzQ1NAordnQgMC4yMTkyMzkgMC4wODAyNDIKK3Z0IDAuMjE0NzMwIDAuMDgwMjQ0Cit2dCAwLjIwNjQ0NyAwLjA1MzUwNAordnQgMC4yMDY0NDcgMC4wNTk1MDMKK3Z0IDAuMTk5NjY5IDAuMDU5NTAzCit2dCAwLjE5OTY2OSAwLjA1MzUwNAordnQgMC4xOTk2NjkgMC4wODAyNTMKK3Z0IDAuMjA2NDQ3IDAuMDgwMjUzCit2dCAwLjE5NDAzNSAwLjA1OTUwMwordnQgMC4xOTQwMzUgMC4wNTM1MDQKK3Z0IDAuMTk0MDM1IDAuMDgwMjUzCit2dCAwLjE4ODM3NiAwLjA1OTYxMAordnQgMC4xNzM3NTEgMC4wNTk2MTEKK3Z0IDAuMTc1MTMxIDAuMDU5NjEwCit2dCAwLjE1NTcwNiAwLjA2NjkwNwordnQgMC4xNTU3MDYgMC4wNzg0NDcKK3Z0IDAuMTcwNjY4IDAuMDU2MDI2Cit2dCAwLjE3MDQ0MSAwLjA1NjM1MgordnQgMC4xNjgwNDYgMC4wNTQxMjcKK3Z0IDAuMTY4MjE0IDAuMDUzODE1Cit2dCAwLjE1ODg1NiAwLjA1NjM4OAordnQgMC4xNTc5MjMgMC4wNTk2MTQKK3Z0IDAuMTU3NTEzIDAuMDU5NjEzCit2dCAwLjE1ODYxMCAwLjA1NjE3NwordnQgMC4xNTg1NTUgMC4wNzc2NDAKK3Z0IDAuMTU4ODUyIDAuMDc3NDQ0Cit2dCAwLjE2MTI0NCAwLjA3OTcwMAordnQgMC4xNjA5NjAgMC4wNzk5OTcKK3Z0IDAuMTcwNDM5IDAuMDc3NDk3Cit2dCAwLjE3MTM5NCAwLjA3NDI0NAordnQgMC4xNzE4MDYgMC4wNzQyNDQKK3Z0IDAuMTcwNjQ4IDAuMDc3NzA2Cit2dCAwLjE3MTgwNiAwLjA2NjkwNwordnQgMC4xNzE4MDYgMC4wNTk2MTIKK3Z0IDAuMTU3OTI0IDAuMDY2OTA3Cit2dCAwLjE1NzUxMyAwLjA2NjkwNwordnQgMC4xNTc5MjMgMC4wNzQyNDgKK3Z0IDAuMTU3NTEzIDAuMDc0MjQ5Cit2dCAwLjI1OTM3OSAwLjg1NjIxNgordnQgMC4yNTkzNzkgMC44NjYxNjcKK3Z0IDAuMjU5MjI4IDAuODY2MTYyCit2dCAwLjczMTQzMSAwLjM5ODU1MwordnQgMC45MDIwMTYgMC4xODMzMjYKK3Z0IDAuOTAyMDE2IDAuMTg5MTM2Cit2dCAwLjkwMTg2NSAwLjE4OTEzMAordnQgMC45MDIwNDMgMC42MjY5NDUKK3Z0IDAuOTAyMDQzIDAuNjMyNzU1Cit2dCAwLjkwMTg5MSAwLjYzMjc0OQordnQgMC43MzE1ODAgMC4zNTYwMTQKK3Z0IDAuMjE5MjM5IDAuMDg2MDQ2Cit2dCAwLjE5OTY2OSAwLjA4NjAzMAordnQgMC4yMDY0NDcgMC4wODYwMzAKK3Z0IDAuMTkzOTc0IDAuMDg2MDMwCit2dCAwLjE2MTI1NiAwLjA1NDE0MwordnQgMC4xNjEwMjYgMC4wNTM4MzgKK3Z0IDAuMTcxMzk0IDAuMDU5NjEzCit2dCAwLjE2ODA1MyAwLjA3OTcxNgordnQgMC4xNjgyNjIgMC4wODAwMjMKK3Z0IDAuMTY0NjYyIDAuMDUyOTA1Cit2dCAwLjE2NDY2MiAwLjA1MzI2MgordnQgMC4xNjQ2NjEgMC4wODA5NDcKK3Z0IDAuMTY0NjYxIDAuMDgwNTkwCit2dCAwLjE3Mzc1MSAwLjA1MTQ2MwordnQgMC4xNzM3NTEgMC4wNzgxMjAKK3Z0IDAuMTczNzUxIDAuMDU0Nzc4Cit2dCAwLjE3Mzc1MSAwLjA4MTY5NwordnQgMC4xNzEzOTEgMC4wNjY5MDcKK3Z0IDAuMTg3MjU4IDAuMDc3NzY5Cit2dCAwLjE4NzI0OSAwLjA1NTgxMAordnQgMC4xODc5NjQgMC4wNTk2MTAKK3Z0IDAuMTg3OTYzIDAuMDY2OTA3Cit2dCAwLjE4Nzk2NSAwLjA3NDI0NAordnQgMC4xODE3NjUgMC4wODA5NTIKK3Z0IDAuMTgxNzY1IDAuMDgwNTk1Cit2dCAwLjE4NDg3NyAwLjA3OTc0NQordnQgMC4xODUwODYgMC4wODAwNTIKK3Z0IDAuMTc2MDczIDAuMDc3NzM2Cit2dCAwLjE3NTU0NCAwLjA3NDI0NAordnQgMC4xNzYzNzAgMC4wNzc1NDAKK3Z0IDAuMTc1NTQ1IDAuMDY2OTA3Cit2dCAwLjE3NTU0MSAwLjA1OTYxMAordnQgMC4xNzgzNjMgMC4wNTM2NjgKK3Z0IDAuMTgxNzY1IDAuMDUyNzYyCit2dCAwLjE4MTc2NSAwLjA1MzExOQordnQgMC4xNzg1OTMgMC4wNTM5NzMKK3Z0IDAuMTg1MDE1IDAuMDUzNjg3Cit2dCAwLjE4NDg0NyAwLjA1Mzk5OQordnQgMC4xODcwNDIgMC4wNTYxMzgKK3Z0IDAuMTg3MDU5IDAuMDc3NTQ5Cit2dCAwLjE3ODI5NCAwLjA4MDAyOQordnQgMC4xNzg1NzcgMC4wNzk3MzIKK3Z0IDAuMTc2MTM0IDAuMDU1OTQ3Cit2dCAwLjE3NjM4MCAwLjA1NjE1NwordnQgMC4xODE3NjUgMC4wODYwMzAKK3Z0IDAuMTcxMTUyIDAuMDU5NjI3Cit2dCAwLjE3MDI2NCAwLjA1NjUzOQordnQgMC4xNjc5MjcgMC4wNTQzNDQKK3Z0IDAuMTY0NjYxIDAuMDUzNTExCit2dCAwLjE2MTM5NiAwLjA1NDM0OQordnQgMC4xNTkwNTcgMC4wNTY1MzcKK3Z0IDAuMTU4MTY1IDAuMDU5NjI3Cit2dCAwLjE1ODE2MyAwLjA2NjkwOAordnQgMC4xNTgxNjUgMC4wNzQyMzcKK3Z0IDAuMTU5MDYyIDAuMDc3MzEzCit2dCAwLjE2MTQwMCAwLjA3OTUwNgordnQgMC4xNjQ2NjEgMC4wODAzNDQKK3Z0IDAuMTY3OTE4IDAuMDc5NTA4Cit2dCAwLjE3MDI2MCAwLjA3NzMyMAordnQgMC4xNzExNTIgMC4wNzQyMzIKK3Z0IDAuMTcxMTUyIDAuMDY2OTA4Cit2dCAwLjE4NDcyOCAwLjA1NDIxNgordnQgMC4xODE3NjUgMC4wNTMzNjgKK3Z0IDAuMTc4NzMzIDAuMDU0MTc5Cit2dCAwLjE3NjU4MCAwLjA1NjMwNwordnQgMC4xNzU3ODMgMC4wNTk2MjIKK3Z0IDAuMTc1Nzg0IDAuMDY2OTA4Cit2dCAwLjE3NTc4NiAwLjA3NDIzNAordnQgMC4xNzY1ODAgMC4wNzc0MTAKK3Z0IDAuMTc4NzMzIDAuMDc5NTM4Cit2dCAwLjE4MTc2NSAwLjA4MDM0OQordnQgMC4xODQ3NDMgMC4wNzk1MzgKK3Z0IDAuMTg2ODcwIDAuMDc3MzgzCit2dCAwLjE4NzcyMyAwLjA3NDIzMwordnQgMC4xODc3MjMgMC4wNjY5MDgKK3Z0IDAuMTg3NzIyIDAuMDU5NjIzCit2dCAwLjE4Njg3MCAwLjA1NjMzNAordnQgMC44MDM4OTEgMC43ODk2MDMKK3Z0IDAuODAzODk5IDAuNzg2NTAxCit2dCAwLjgwMzk1NCAwLjc4NjUwMQordnQgMC43NjM3NTkgMC45Mzk2MDEKK3Z0IDAuNzYzNzA0IDAuOTM2NTAwCit2dCAwLjc2Mzc1OSAwLjkzNjQ5OQordnQgMC45NTY1MjMgMC44MTQ5MDAKK3Z0IDAuOTU2NDY4IDAuODEyNTU3Cit2dCAwLjk1NjUyOSAwLjYyOTI5MAordnQgMC45NTY0NzQgMC42MjY5NDYKK3Z0IDAuODQwMzYyIDAuMTY3MjU1Cit2dCAwLjg0MDM1NyAwLjE3MDUyMwordnQgMC44NDAzMDIgMC4xNzA1MjMKK3Z0IDAuOTM2MTc3IDAuODc5MTU1Cit2dCAwLjkzNjEyMyAwLjg3NTg4OAordnQgMC45MzYxNzcgMC44NzU4ODcKK3Z0IDAuODQwMzYyIDAuMTczNzg0Cit2dCAwLjg0MDMwNyAwLjE3Mzc4NAordnQgMC45MzYyNTEgMC44MzY3NTQKK3Z0IDAuOTM2MjU3IDAuODQwMDE1Cit2dCAwLjkzNjIwMiAwLjg0MDAxNQordnQgMC44NDAzNzYgMC4xNzYxMTYKK3Z0IDAuODQwMzIyIDAuMTc2MTE2Cit2dCAwLjk1NjY1NyAwLjY1NDAxMQordnQgMC45NTY2MDIgMC42NTE2ODAKK3Z0IDAuOTU2NjU3IDAuNjUxNjc5Cit2dCAwLjkzNzA4NSAwLjkzOTQ4NwordnQgMC45MzcwMzAgMC45MzYzNjYKK3Z0IDAuOTM3MDg1IDAuOTM2MzY1Cit2dCAwLjkyNjAxMiAwLjkzOTQ2MQordnQgMC45MjU5NTcgMC45MzYzNDAKK3Z0IDAuODA3NDEwIDAuMzEwOTY2Cit2dCAwLjgwNzQxMCAwLjMxODI0MgordnQgMC4wOTE4NzUgMC44ODU5NzgKK3Z0IDAuMDkxODc1IDAuODkzMjUzCit2dCAwLjA5MTgyMCAwLjg5MzI1MwordnQgMC44MDc0MTAgMC4zMjU1NjYKK3Z0IDAuODkxNzU1IDAuNTUwMzI1Cit2dCAwLjg5MTc1NSAwLjU1NzY0OQordnQgMC44OTE3MDAgMC41NTc2NDkKK3Z0IDAuODA3NDE4IDAuMzI4NjA2Cit2dCAwLjAxODY0MSAwLjkzODI2MwordnQgMC4wMTg2NDggMC45NDEzMDMKK3Z0IDAuOTU2NDU4IDAuNDEyMDg5Cit2dCAwLjk1NjQ3MyAwLjQxNDQ1NAordnQgMC45NTY0MTggMC40MTQ0NTQKK3Z0IDAuOTU2NDYwIDAuMzU4Njc0Cit2dCAwLjk1NjQwNSAwLjM1NjMwOQordnQgMC45NTY0NjAgMC4zNTYzMDgKK3Z0IDAuODQxMDY2IDAuMDk1ODk5Cit2dCAwLjg0MTA0NyAwLjA5MjYyNwordnQgMC44NDExMDIgMC4wOTI2MjcKK3Z0IDAuOTM2MDY0IDAuNTc1Nzg2Cit2dCAwLjkzNjA3MCAwLjU3OTA1OAordnQgMC45MzYwMTUgMC41NzkwNTgKK3Z0IDAuODQxMDQxIDAuMDg5MzgyCit2dCAwLjg0MTA5NiAwLjA4OTM4MgordnQgMC4xNzc3ODggMC45MzY2MDIKK3Z0IDAuMTc3NzMzIDAuOTMzMzU4Cit2dCAwLjE3Nzc4OCAwLjkzMzM1NwordnQgMC44NDEwNDcgMC4wODcwNjkKK3Z0IDAuODQxMTAyIDAuMDg3MDY5Cit2dCAwLjgxOTIzMyAwLjExNzI3OAordnQgMC44MTkxNzggMC4xMTQ5NjYKK3Z0IDAuOTQwMTQ0IDAuMDY2NzMzCit2dCAwLjk0MDE0NCAwLjA2OTgwNgordnQgMC45NDAxNzMgMC4xMjc5MTYKK3Z0IDAuOTQwMTczIDAuMTMwOTg5Cit2dCAwLjk0MDExOCAwLjEzMDk4OQordnQgMC44MDM5MDcgMC44MDQyMDcKK3Z0IDAuODAzODk5IDAuNzk2ODgyCit2dCAwLjgwMzk1NCAwLjc5Njg4MgordnQgMC44OTEyNjIgMC42MjY5NDUKK3Z0IDAuODkxMjY0IDAuNjM0MjY5Cit2dCAwLjg5MTIwOSAwLjYzNDI2OQordnQgMC4wODExOTMgMC44ODU5NzgKK3Z0IDAuMDgxMTkzIDAuODkzMjU3Cit2dCAwLjA4MTEzOCAwLjg5MzI1NwordnQgMC4zODUxNjMgMC44ODU5MzQKK3Z0IDAuMzg1MTU3IDAuODg4ODk4Cit2dCAwLjM4NTEwMiAwLjg4ODg5OAordnQgMC45NDMzMzUgMC4zMzY4NzAKK3Z0IDAuOTQzMjgwIDAuMzMzOTA2Cit2dCAwLjM4NTE2MyAwLjg5MTkyNwordnQgMC4zODUxMDggMC44OTE5MjcKK3Z0IDAuOTQxODE5IDAuMjE3ODQzCit2dCAwLjk0MTgyNCAwLjIyMDg3MgordnQgMC42NDI2NjYgMC45MzM3ODQKK3Z0IDAuNjQyNjY2IDAuOTM1OTkyCit2dCAwLjY0MjYxMSAwLjkzNTk5MwordnQgMC45NTc1NjggMC41Mzg3NjgKK3Z0IDAuOTU3NTEzIDAuNTM2NTYwCit2dCAwLjk1NzU2OCAwLjUzNjU1OAordnQgMC45MzUyNzkgMC43ODk4NDUKK3Z0IDAuOTM1MjI0IDAuNzg2NTAyCit2dCAwLjkzNTI3OSAwLjc4NjUwMQordnQgMC45MzUzMjcgMC43MzM4NDEKK3Z0IDAuOTM1MjczIDAuNzMwNDk4Cit2dCAwLjAwNTM2OSAwLjc3ODI4NgordnQgMC4wMDUzNjkgMC43ODU1NjYKK3Z0IDAuMDA1MzE0IDAuNzg1NTY2Cit2dCAwLjY5NDc4MSAwLjg4NTk0NwordnQgMC42OTQ3ODEgMC44OTMyMjcKK3Z0IDAuNjk0NzI2IDAuODkzMjI3Cit2dCAwLjAwNTM2OSAwLjc5Mjg4NwordnQgMC4wMDUzMTQgMC43OTI4ODcKK3Z0IDAuODkyMjc5IDAuNTc1Nzg2Cit2dCAwLjg5MjI3OSAwLjU4MzEwNwordnQgMC44OTIyMjQgMC41ODMxMDcKK3Z0IDAuMDA1Mzc1IDAuNzk2MDMwCit2dCAwLjAwNTMyMCAwLjc5NjAzMAordnQgMC45Mzg1NTQgMC4xNjQ5MTEKK3Z0IDAuOTM4NTYyIDAuMTY4MDU1Cit2dCAwLjkzODUwNyAwLjE2ODA1NQordnQgMC45NTc5MTggMC44NzU4ODcKK3Z0IDAuOTU3OTMzIDAuODc4MDY3Cit2dCAwLjk1NzgwMiAwLjU3NTc4NgordnQgMC45NTc4MTYgMC41Nzc5NjUKK3Z0IDAuODI0NjM0IDAuODYxMjM4Cit2dCAwLjgyNDY0NiAwLjg2NDI4MAordnQgMC45NDA1NjcgMC4wMDUzMTMKK3Z0IDAuOTQwNTczIDAuMDA4MzU1Cit2dCAwLjk0MDUxOCAwLjAwODM1NQordnQgMC44MjQ2NDYgMC44NjcyNDYKK3Z0IDAuODQ3Nzc4IDAuOTQyOTM1Cit2dCAwLjg0NzcyMyAwLjkzOTk2OQordnQgMC44NDc3NzggMC45Mzk5NjgKK3Z0IDAuOTU4ODExIDAuOTM2MzY1Cit2dCAwLjk1ODg0MCAwLjkzODQ4NgordnQgMC45NTg3NTAgMC44OTMyODEKK3Z0IDAuOTU4Nzc4IDAuODk1NDAzCit2dCAwLjk1ODcyMyAwLjg5NTQwMwordnQgMC43OTc0NjQgMC4xMDgxMTYKK3Z0IDAuNzk3NDUxIDAuMTA0OTgwCit2dCAwLjkzODU5NyAwLjI3MTQwOAordnQgMC45Mzg1OTcgMC4yNzQ1NDQKK3Z0IDAuOTM4NTQyIDAuMjc0NTQ0Cit2dCAwLjc5NzQ0NiAwLjA5NzY1NQordnQgMC43OTc1MDEgMC4wOTc2NTUKK3Z0IDAuODkxMjM1IDAuMTgzMzI2Cit2dCAwLjg5MTIzOCAwLjE5MDY1MAordnQgMC43OTc0NDIgMC4wOTAzNzEKK3Z0IDAuNzk3NDk3IDAuMDkwMzcxCit2dCAwLjg5MjQxMiAwLjgzNjc1NAordnQgMC44OTI0MTYgMC44NDQwMzgKK3Z0IDAuNzk3NDUxIDAuMDg3MDY5Cit2dCAwLjkzNTU5OCAwLjU1MzYyOAordnQgMC45MzU1NDMgMC41NTAzMjYKK3Z0IDAuOTM1NTk4IDAuNTUwMzI1Cit2dCAwLjk1ODI0MSAwLjQ1MzY4MQordnQgMC45NTgxODYgMC40NTE1MzAKK3Z0IDAuOTU4MDEzIDAuNjkyODY1Cit2dCAwLjk1Nzk1OCAwLjY5MDcxNAordnQgMC44MDM0ODggMC43ODk2MDMKK3Z0IDAuODAzNDk2IDAuNzg2NTAyCit2dCAwLjg0MDc3OSAwLjE2NDkxMQordnQgMC44NDA3NjUgMC4xNjcyNTUKK3Z0IDAuOTQ2NDY1IDAuNjAzNTk4Cit2dCAwLjk0NjA2OCAwLjYwMTI4OAordnQgMC45NDY0NjUgMC42MDEyMTgKK3Z0IDAuODQwNzU5IDAuMTcwNTIzCit2dCAwLjg0MDc2NSAwLjE3Mzc4NAordnQgMC44NDA3NzkgMC4xNzYxMTYKK3Z0IDAuODA3ODIxIDAuMzA3ODQ1Cit2dCAwLjgwNzgxMyAwLjMxMDk2NgordnQgMC44MDM4ODcgMC45MjgyODMKK3Z0IDAuODAzNDg4IDAuOTI1MTg3Cit2dCAwLjgwMzg4NyAwLjkyNTEzNQordnQgMC44MDc4MTMgMC4zMTgyNDIKK3Z0IDAuODA3ODEzIDAuMzI1NTY2Cit2dCAwLjgwNzgyMSAwLjMyODYwNgordnQgMC44NDA2ODcgMC4wOTgyNjYKK3Z0IDAuODQwNjYzIDAuMDk1OTAxCit2dCAwLjk0NjYxMyAwLjU1MDMyNQordnQgMC45NDY2MjggMC41NTI2OTAKK3Z0IDAuOTQ2MjI1IDAuNTUyNjkwCit2dCAwLjg0MDY0NSAwLjA5MjYyOQordnQgMC44NDA2MzggMC4wODkzODQKK3Z0IDAuODQwNjQ1IDAuMDg3MDcxCit2dCAwLjgwMzUyMCAwLjgwNzI4MAordnQgMC44MDM1MDUgMC44MDQyMDcKK3Z0IDAuOTI5ODQwIDAuMDQ1ODc3Cit2dCAwLjkyOTg1MiAwLjA0ODk1MAordnQgMC45Mjk0NDkgMC4wNDg5NTAKK3Z0IDAuODAzNDk2IDAuNzk2ODgzCit2dCAwLjM4NjAyNyAwLjg4NTkzNAordnQgMC4zODYwMjIgMC44ODg5MDAKK3Z0IDAuMzg2MDI3IDAuODkxOTI3Cit2dCAwLjY0MzUzMCAwLjkzMzc3NwordnQgMC42NDM1MzAgMC45MzU5ODYKK3Z0IDAuMDA2MjQwIDAuNzc0OTQyCit2dCAwLjAwNjIzMyAwLjc3ODI4NgordnQgMC40MjY0ODQgMC45MTYxMTcKK3Z0IDAuNDI1NjQ4IDAuOTEyODgwCit2dCAwLjQyNjQ4NCAwLjkxMjY2MgordnQgMC4wMDYyMzMgMC43ODU1NjYKK3Z0IDAuMDA2MjMzIDAuNzkyODg3Cit2dCAwLjAwNjI0MCAwLjc5NjAzMAordnQgMC44MjU0ODAgMC44NTkwNTcKK3Z0IDAuODI1NDk5IDAuODYxMjM2Cit2dCAwLjYwODI4NiAwLjkzNjEyNQordnQgMC42MDc0ODEgMC45MzQwOTkKK3Z0IDAuNjA4Mjg2IDAuOTMzNzg1Cit2dCAwLjgyNTUxMCAwLjg2NDI3NgordnQgMC44MjU1MTAgMC44NjcyNDQKK3Z0IDAuNzk2NjI5IDAuMTEwMjM4Cit2dCAwLjc5NjYwMCAwLjEwODExNgordnQgMC41MTgyMzggMC45MzY5NzQKK3Z0IDAuNTE4MjY2IDAuOTM5MDk2Cit2dCAwLjUxNzQwMiAwLjkzOTA5NgordnQgMC43OTY1ODYgMC4xMDQ5ODAKK3Z0IDAuNzk2NTgyIDAuMDk3NjU1Cit2dCAwLjc5NjU3NyAwLjA5MDM3MgordnQgMC43OTY1ODYgMC4wODcwNjkKK3Z0IDAuNzA3NzA0IDAuOTM2MTYzCit2dCAwLjcwNjkwNiAwLjkzNDE2NQordnQgMC43MDc3MDQgMC45MzM4MzMKK3Z0IDAuMzc0MjMxIDAuOTM2MTIyCit2dCAwLjM3MzQzMyAwLjkzNDEyNAordnQgMC4zNzQyMzEgMC45MzM3OTMKK3Z0IDAuNzU2NTI1IDAuMzU2MDUwCit2dCAwLjQ0OTczMCAwLjExNjkzNAordnQgMC40NDk4NzkgMC4xMTY5MzQKK3Z0IDAuNzI5NDIyIDAuNzAyMjA3Cit2dCAwLjcyOTI2OCAwLjY0MDEwMgordnQgMC43Mjk0MjIgMC42NDAwOTkKK3Z0IDAuNDQ4MzYxIDAuMTE2OTM0Cit2dCAwLjc1MTU3MyAwLjcxMzg5NwordnQgMC43NTE3NTEgMC43MTM4OTcKK3Z0IDAuNzUxNzY0IDAuNzIzMjgyCit2dCAwLjg2OTA0MCAwLjQ3NzI1MwordnQgMC44Njg4NjMgMC40NzcyNDkKK3Z0IDAuODY5MDQwIDAuNDY3ODY1Cit2dCAwLjc1MTU4NiAwLjcyMzI4MgordnQgMC43NTE3OTggMC43MzA5NDAKK3Z0IDAuODgwNTgyIDAuNjM0NjA1Cit2dCAwLjg4MDQwNCAwLjYzNDYwMAordnQgMC44ODA1ODIgMC42MjY5NDUKK3Z0IDAuODc5MTg0IDAuNDMzNTAwCit2dCAwLjg3OTM2MiAwLjQzMzQ5OQordnQgMC44NzkzNjIgMC40NDEzNjIKK3Z0IDAuODc5NDgwIDAuNDE5OTUyCit2dCAwLjg3OTMwMiAwLjQxOTk1MgordnQgMC44NzkzNDQgMC40MTIwODkKK3Z0IDAuNzUwNzQ2IDAuNjQ3OTYxCit2dCAwLjc1MDkyNCAwLjY0Nzk2MQordnQgMC43NTA5MDcgMC42NTc0MjEKK3Z0IDAuODY4Njc1IDAuNDIxNTQ5Cit2dCAwLjg2ODQ5NyAwLjQyMTU0OQordnQgMC44Njg1MDkgMC40MTIwODkKK3Z0IDAuNzUwNzI5IDAuNjU3NDIxCit2dCAwLjc1MDkyNCAwLjY2NjczMAordnQgMC44NjkwNjUgMC41MDQ2MzcKK3Z0IDAuODY4ODg3IDAuNTA0NjM0Cit2dCAwLjg2OTA2NSAwLjQ5NTMyNgordnQgMC43NTA3NDYgMC42NjY3MzAKK3Z0IDAuNzUwOTY4IDAuNjc0MjA1Cit2dCAwLjg4NDc4MCAwLjI0MTg4MgordnQgMC44ODQ2MDIgMC4yNDE4NzYKK3Z0IDAuODg0NzgwIDAuMjM0NDA0Cit2dCAwLjg4MDEyMiAwLjY4NDg0NAordnQgMC44Nzk5NDUgMC42ODQ4MzkKK3Z0IDAuODgwMTIyIDAuNjc3MTAwCit2dCAwLjg4MDA1MiAwLjc2MjcyMwordnQgMC44Nzk4NzQgMC43NjI3MTgKK3Z0IDAuODgwMDUyIDAuNzU0OTc5Cit2dCAwLjA2NDI5NSAwLjc1MzcyMwordnQgMC4wNjQxMTcgMC43NTM3MjMKK3Z0IDAuMDY0MTE3IDAuNzQ0MzA4Cit2dCAwLjg2ODcxNyAwLjY2MTA5NgordnQgMC44Njg1MzkgMC42NjEwOTIKK3Z0IDAuODY4NzE3IDAuNjUxNjc5Cit2dCAwLjc1MTU4NiAwLjcwNDQ5OQordnQgMC43NTE3NjQgMC43MDQ0OTkKK3Z0IDAuODY5MDA1IDAuODIxOTUyCit2dCAwLjg2ODgyNyAwLjgyMTk1MgordnQgMC44Njg4MzkgMC44MTI1NTUKK3Z0IDAuNzUxNjIwIDAuNjk2ODA5Cit2dCAwLjc1MTc5OCAwLjY5NjgwOQordnQgMC44ODAxODggMC43ODY1MDIKK3Z0IDAuODgwMzY2IDAuNzg2NTAxCit2dCAwLjg4MDM2NiAwLjc5NDE5MQordnQgMC44Nzk2ODAgMC43MDQyMjYKK3Z0IDAuODc5ODU4IDAuNzA0MjI0Cit2dCAwLjg3OTg1OCAwLjcxMTk3NwordnQgMC44Nzk2OTIgMC40OTUzMjgKK3Z0IDAuODc5ODcwIDAuNDk1MzI2Cit2dCAwLjg3OTg3MCAwLjUwMzA3OQordnQgMC40NDQ0NDUgMC43NDIwMjAKK3Z0IDAuNDQ0MjY3IDAuNzQyMDE5Cit2dCAwLjQ0NDM0MiAwLjczMjU5NwordnQgMC44Njg2OTIgMC4zNjU3MzEKK3Z0IDAuODY4NTE0IDAuMzY1NzMxCit2dCAwLjg2ODUzOCAwLjM1NjMwOAordnQgMC40NDQ0MjIgMC43NTEzNzgKK3Z0IDAuNDQ0MjQ0IDAuNzUxMzc3Cit2dCAwLjg2OTA1MyAwLjcxMzU4NQordnQgMC44Njg4NzUgMC43MTM1ODEKK3Z0IDAuODY5MDUzIDAuNzA0MjI0Cit2dCAwLjQ0NDQ1MSAwLjc1ODk3MQordnQgMC40NDQyNzMgMC43NTg5NzAKK3Z0IDAuODgxNzM0IDAuODQ0MzUxCit2dCAwLjg4MTU1NiAwLjg0NDM0NQordnQgMC44ODE3MzQgMC44MzY3NTQKK3Z0IDAuODgxMjExIDAuODU3NjYxCit2dCAwLjg4MTM4OSAwLjg1NzY2MAordnQgMC44ODEzODkgMC44NjUyNjIKK3Z0IDAuODgxMDczIDAuNTU3OTI4Cit2dCAwLjg4MDg5NSAwLjU1NzkyNQordnQgMC44ODEwNzMgMC41NTAzMjUKK3Z0IDAuMDY0Mjk1IDAuNzQ0MzA4Cit2dCAwLjA2NDE0NCAwLjczNDkzNwordnQgMC44Njg4NzQgMC4zODc2MDYKK3Z0IDAuODY5MDUyIDAuMzg3NjA2Cit2dCAwLjg2OTA1MiAwLjM5Njk3NwordnQgMC4wNjMzMjEgMC42MTc2MTEKK3Z0IDAuMDYzMTQ3IDAuNjE3NTYyCit2dCAwLjA2OTIzNSAwLjYyMDM0OQordnQgMC4wNjg3NjYgMC42MjA1NTIKK3Z0IDAuMDY2NDUxIDAuNjE4Mzk3Cit2dCAwLjA2OTY1MCAwLjYyMzc0MwordnQgMC4wNzAyMzEgMC42MjM3NDMKK3Z0IDAuMDY5MjQ3IDAuNjI3MTY4Cit2dCAwLjA2ODc2NyAwLjYyNjkzMAordnQgMC4zODg2MzQgMC43MjE1NjYKK3Z0IDAuMzg4NDU5IDAuNzIxNjAyCit2dCAwLjI2NjY2MyAwLjQ0NDE4MQordnQgMC4yNjY2NTQgMC40NDI1NDIKK3Z0IDAuMjY2NjczIDAuNDQ0MzkzCit2dCAwLjI2NzE5OCAwLjQ0MjU0MgordnQgMC4yNjcxOTcgMC40NDQxODEKK3Z0IDAuMjY3MjM5IDAuNDQ0MzkzCit2dCAwLjU4MzYxNCAwLjk4NDAzNQordnQgMC41ODM0MTkgMC45ODM1MDUKK3Z0IDAuNTgzNjE0IDAuOTgzNDIyCit2dCAwLjI4OTg4NiAwLjcyMzQ0MAordnQgMC44MTkwOTcgMC4wNzQxOTIKK3Z0IDAuODE5MDk3IDAuMDc2Mjg4Cit2dCAwLjgxODg4NiAwLjA3NjI4NAordnQgMC43MTg2MTEgMC45Mjg1NzMKK3Z0IDAuNzE4Mzg5IDAuOTI1MzAxCit2dCAwLjcxODYxMSAwLjkyNTIxNAordnQgMC45Mjk0NjIgMC4wNzAwOTIKK3Z0IDAuOTI5MjcxIDAuMDY2Nzk2Cit2dCAwLjkyOTQ2MiAwLjA2NjczMwordnQgMC41Mzg0NDggMC44MzAzMjAKK3Z0IDAuNTM4MjM2IDAuODMwNDcwCit2dCAwLjUzODIzNiAwLjgzMDE0MwordnQgMC45ODk5MzcgMC42NjQ5NTAKK3Z0IDAuOTg5ODAzIDAuNjY0Nzg1Cit2dCAwLjk4OTkzNyAwLjY2NDY3NAordnQgMC41MzgyMzUgMC44MjcwMzMKK3Z0IDAuNTM4NDQ4IDAuODI3MDExCit2dCAwLjUzODQ0OCAwLjgzMDE0NQordnQgMC41OTUwODYgMC45OTI4MDYKK3Z0IDAuNTk1MDA0IDAuOTkyNzkwCit2dCAwLjU5NTA4NiAwLjk5MjU5MAordnQgMC41MTc1ODMgMC44MjcwNjIKK3Z0IDAuNTE3NjE2IDAuODMwMTU1Cit2dCAwLjUxNzQwMiAwLjgzMDE1OQordnQgMC45MzU2ODYgMC40OTUzMjYKK3Z0IDAuOTM1Njg2IDAuNDk4NDQ5Cit2dCAwLjkzNTQ3MiAwLjQ5ODQyMQordnQgMC4yMTAyNDIgMC4wNTM0ODkKK3Z0IDAuMjEwMjQyIDAuMDgwMjQ3Cit2dCAwLjIxMDI0MiAwLjA3NDI1NgordnQgMC4yMTAyNDIgMC4wNjY5MDcKK3Z0IDAuMjEwMjQyIDAuMDU5NTAxCit2dCAwLjg3MDU4NCAwLjg2Njg3OAordnQgMC44NzA1MjEgMC44NjY4NzcKK3Z0IDAuODcwNTg0IDAuODU3NjYwCit2dCAwLjA2NTAwNCAwLjU1NTc5NwordnQgMC40NDk3MzAgMC4wODU5MTkKK3Z0IDAuNDQ4MzYxIDAuMDg1OTE5Cit2dCAwLjI0NzA3MCAwLjgxMTc2OQordnQgMC4yNDY5MTYgMC43OTI2NDgKK3Z0IDAuMjQ3MDcwIDAuNzkyNjQ0Cit2dCAwLjc1NjcwMCAwLjM1NjA1MAordnQgMC43NTY4NTQgMC4zNTYwNDgKK3Z0IDAuNzI5MjIwIDAuNjEwNjQ5Cit2dCAwLjcyOTA2OSAwLjYxMDY0MwordnQgMC43MjkyMjAgMC41NDc4MDEKK3Z0IDAuMjMyOTEwIDAuMTE2MTgwCit2dCAwLjY4Mzk0NSAwLjc1MTcwOAordnQgMC42ODQwOTkgMC43NTE3MDYKK3Z0IDAuNjg0MDk5IDAuNzgyNzE2Cit2dCAwLjUzNjc1MiAwLjgyNDY4NAordnQgMC41MzY5ODQgMC44MjQ2NjIKK3Z0IDAuMzg0OTE0IDAuNzIxOTM3Cit2dCAwLjM4NTMzNSAwLjcyMjM5OAordnQgMC4zODI1MzAgMC43MjQzMzcKK3Z0IDAuMDY2NDQxIDAuNjI5MTA2Cit2dCAwLjkzMjc2OCAwLjI1MzU3NQordnQgMC45MzI3NjggMC4yNTY4MzkKK3Z0IDAuOTMyNTczIDAuMjU2Nzg5Cit2dCAwLjg3MDM0OSAwLjkyNjY0MgordnQgMC44NzAzNDkgMC45Mjk5MzYKK3Z0IDAuODcwMTMwIDAuOTI5ODU1Cit2dCAwLjk0NDQwNCAwLjQzMzU5MwordnQgMC45NDQ1OTkgMC40MzM0OTkKK3Z0IDAuOTQ0NTk5IDAuNDM2MjQ3Cit2dCAwLjg3MDEzMCAwLjk0MDY3NAordnQgMC44NzAzNDEgMC45NDA1NjEKK3Z0IDAuODcwMzQxIDAuOTQzMzI2Cit2dCAwLjM4MTI3MCAwLjcyMTM3NwordnQgMC4xOTYwMDMgMC40NDQ1MzYKK3Z0IDAuNTE5MjU4IDAuODMwNDQ3Cit2dCAwLjUxNzYyMCAwLjgzMDQ4MAordnQgMC41MTkyNTQgMC44MzAxMjIKK3Z0IDAuNTE5MjIxIDAuODI3MDI4Cit2dCAwLjkyNDY2NCAwLjYwNDQ0NwordnQgMC45MjQwODUgMC42MDEzMzQKK3Z0IDAuOTI0NjY0IDAuNjAxMjE4Cit2dCAwLjkzMzc3NyAwLjQzMzQ5OQordnQgMC45MzM3NzcgMC40MzY3NjQKK3Z0IDAuOTMzNTg5IDAuNDM2NzIyCit2dCAwLjUzNjU5NyAwLjgzMDEzNwordnQgMC41MzY1OTcgMC44MzA0NjQKK3Z0IDAuMzk5MjYxIDAuODk1MDA1Cit2dCAwLjM5OTM1OSAwLjg5NDg0OAordnQgMC40MDEyMTggMC44OTYyMDIKK3Z0IDAuNTE5MDgzIDAuODI0NzM5Cit2dCAwLjUzNjU5NiAwLjgyNzAyNwordnQgMC41MzY1NjAgMC44MjQ2NzgKK3Z0IDAuOTI0NjQ1IDAuNzMzNzQyCit2dCAwLjkyNDA2NiAwLjczMzYzMAordnQgMC45MjQ2NDUgMC43MzA0OTcKK3Z0IDAuOTMyODI0IDAuMTQ3MTE1Cit2dCAwLjkzMzAwNSAwLjE0NzA3MwordnQgMC45MzMwMDUgMC4xNTAzNTMKK3Z0IDAuMjY3Mjc5IDAuNDQyNTQyCit2dCAwLjk2NzE3MCAwLjM1Nzk1MAordnQgMC45NjcwODcgMC4zNTYzMTMKK3Z0IDAuOTY3MTcwIDAuMzU2MzA4Cit2dCAwLjI5MTUyNiAwLjcyMzUyMQordnQgMC45NjcxMDEgMC40MTIwODkKK3Z0IDAuOTY3MTgyIDAuNDEyMDg5Cit2dCAwLjk2NzE4MiAwLjQxMzcyOQordnQgMC4yODk4ODYgMC43MjM1MjEKK3Z0IDAuNTE3NDA0IDAuODMwMzMzCit2dCAwLjk4OTkyMCAwLjc4Njc3OAordnQgMC45ODk3ODYgMC43ODY2NjgKK3Z0IDAuOTg5OTIwIDAuNzg2NTAxCit2dCAwLjc1MjcyMiAwLjcxMzg5NwordnQgMC43NTI3MzQgMC43MjMyODIKK3Z0IDAuNzUyNzY4IDAuNzMwOTQwCit2dCAwLjc1MTkzOCAwLjY0MDA5OQordnQgMC43NTE4OTQgMC42NDc5NjEKK3Z0IDAuNTE4MzY0IDAuODY4MTgzCit2dCAwLjUxNzQwMiAwLjg2MDM3OQordnQgMC41MTgzNjQgMC44NjAyNTUKK3Z0IDAuNzUxODc4IDAuNjU3NDIxCit2dCAwLjc1MTg5NCAwLjY2NjczMAordnQgMC43NTE5MzggMC42NzQyMDUKK3Z0IDAuMDYzMTcyIDAuNzYxNDYzCit2dCAwLjA2MzE0NyAwLjc1MzcyMgordnQgMC44NzA5MjkgMC44MzY3NTQKK3Z0IDAuODcwOTI5IDAuODQ0NDk1Cit2dCAwLjg2OTk1OSAwLjg0NDQ5MAordnQgMC4wNjMxNDcgMC43NDQzMDcKK3Z0IDAuNzUyNzM0IDAuNzA0NDk5Cit2dCAwLjc1Mjc2OCAwLjY5NjgwOQordnQgMC4xNDg1NjEgMC44Njg3NTkKK3Z0IDAuMTQ3NTk5IDAuODYxMDY2Cit2dCAwLjE0ODU2MSAwLjg2MDkzNwordnQgMC40NDQ0NTEgMC43MjQ4NDUKK3Z0IDAuNDQzMzcxIDAuNzMyNTkxCit2dCAwLjQ0MzI5NyAwLjc0MjAxNAordnQgMC40NDMyNzMgMC43NTEzNzIKK3Z0IDAuNDQzMzAzIDAuNzU4OTY1Cit2dCAwLjYzMTAxOCAwLjg3MjczNwordnQgMC42MzAwNTcgMC44NjUxOTYKK3Z0IDAuNjMxMDE4IDAuODY1MDY4Cit2dCAwLjA2NDE5MSAwLjcyNzMzNgordnQgMC4wNjMxNzMgMC43MzQ5MzYKK3Z0IDAuNTIyNjA4IDAuODMwMDU1Cit2dCAwLjUyMjYxMiAwLjgzMDM4MAordnQgMC44NTE1NzMgMC4yNjA3ODIKK3Z0IDAuODQ5Mjg1IDAuMjU4NTY1Cit2dCAwLjg1MTU3MyAwLjI1NjE2NAordnQgMC4wNjMxNDcgMC44ODQ0NTgKK3Z0IDAuMDY2MzMzIDAuODg0NDU1Cit2dCAwLjA2NjMzMyAwLjg4NzgwMgordnQgMC41MzMyNDAgMC44MzA0NTMKK3Z0IDAuNTMzMjQwIDAuODMwMTI2Cit2dCAwLjUzMzIzOSAwLjgyNzAxNgordnQgMC41MjI1NzYgMC44MjY5NjEKK3Z0IDAuNTE3NDAyIDAuODk0NTE5Cit2dCAwLjUxOTc1MiAwLjg5NDQ4NQordnQgMC41MTk3NTIgMC44OTc4MzEKK3Z0IDAuMDA3NjI0IDAuODc5NzAwCit2dCAwLjAwNTMxNCAwLjg3NzUzMwordnQgMC4wMDc2MjQgMC44NzUxMTIKK3Z0IDAuODgwNTU1IDAuMTkwNjUwCit2dCAwLjg3ODI2NiAwLjE4ODQ2MgordnQgMC44ODA1NTUgMC4xODYwNjMKK3Z0IDAuNDAxMjE4IDAuODkyMDY4Cit2dCAwLjUyMjYxMiAwLjgyNDY2MgordnQgMC44OTYxNDMgMC4xMzMwNjkKK3Z0IDAuODk1OTcxIDAuMTMzMDY0Cit2dCAwLjg5NjkxOCAwLjEzMzA4OQordnQgMC4xNDAzMTggMC43Mjc0OTYKK3Z0IDAuNzQ5NTc0IDAuODk3OTk2Cit2dCAwLjc1MTcyNCAwLjg5Nzk5MwordnQgMC43NTE3MjQgMC45MDEzNTMKK3Z0IDAuMTQwMzE4IDAuNzI2MDc0Cit2dCAwLjE0MDMxOCAwLjcwNDAwOAordnQgMC4xNDAzMTUgMC43MDYxNTQKK3Z0IDAuODk2NTU1IDAuMDUxMDMwCit2dCAwLjAzNzExOSAwLjkyMTgzOAordnQgMC4wMzYzMzMgMC45MjE4MzgKK3Z0IDAuMDM2MzY4IDAuOTE4NDc4Cit2dCAwLjg5NjczMCAwLjA1MTAyOQordnQgMC4xNDAzMTYgMC43MDc2MDYKK3Z0IDAuMTQwMzE3IDAuNzE2ODIzCit2dCAwLjg5Njg0NCAwLjA1MTAyNwordnQgMC44OTU4NTkgMC4xMzMwNjIKK3Z0IDAuOTM0MTk5IDAuNDcxMjI3Cit2dCAwLjkzNDEwNSAwLjQ3MTIyNAordnQgMC45MzQxOTkgMC40Njc4NjUKK3Z0IDAuOTE1MzMwIDAuOTI3MDk2Cit2dCAwLjkxNTIzNiAwLjkyNzA5MwordnQgMC45MTUzMzAgMC45MjM3MzQKK3Z0IDAuMjMyOTEwIDAuNDU1MDE4Cit2dCAwLjI2NzczNSAwLjQ1NTAxOAordnQgMC4yNjc3MzUgMC41OTk0MzcKK3Z0IDAuMjMyOTEwIDAuNTk5NDM3Cit2dCAwLjQxNTAzNiAwLjc4MzAzOAordnQgMC40MTUyMTEgMC43ODMwMzgKK3Z0IDAuNDE1MjExIDAuNzgzMjIxCit2dCAwLjQxNTAzNiAwLjc4MzIyMQordnQgMC4zMzExNDcgMC45MzMzMzEKK3Z0IDAuMzMwOTY0IDAuOTMzMzI5Cit2dCAwLjMzMDk2NCAwLjkzMjk3NwordnQgMC4zMzExNDcgMC45MzI4MTUKK3Z0IDAuOTAxMzkyIDAuNTIzMjk4Cit2dCAwLjkwMTIwOCAwLjUyMzMwMAordnQgMC45MDEyMDggMC41MjI5NTUKK3Z0IDAuOTAxMzkyIDAuNTIyNzg0Cit2dCAwLjExODkxNCAwLjg2NDc0NwordnQgMC4xMTg5MTQgMC44NjQ1MzgKK3Z0IDAuMTE5MDk3IDAuODY0NTQxCit2dCAwLjExOTA5NyAwLjg2NDkyNAordnQgMC4wMDU3NDkgMC45MjMxMDYKK3Z0IDAuMDA1OTMzIDAuOTIzMTA0Cit2dCAwLjAwNTkzMyAwLjkyMzQzNQordnQgMC4wMDU3NDkgMC45MjM2MDgKK3Z0IDAuNjU0NzczIDAuODI1MTYzCit2dCAwLjY1NDU4NyAwLjgyNTE3MAordnQgMC42NTQ1ODcgMC44MjQ4NDEKK3Z0IDAuNjU0NzczIDAuODI0NjYyCit2dCAwLjQyNTgzNCAwLjg2MTc2MQordnQgMC40MjU2NDggMC44NjE3NjIKK3Z0IDAuNDI1NjQ4IDAuODYxNDIwCit2dCAwLjQyNTgzNCAwLjg2MTI1MAordnQgMC40MTk2MjggMC43ODEyNTQKK3Z0IDAuNDE5NjI5IDAuNzgxNDI2Cit2dCAwLjQxNTIxMSAwLjc4MTQyNwordnQgMC40MTUyMTEgMC43ODEyNTUKK3Z0IDAuOTAxMzkyIDAuNTI3NzExCit2dCAwLjkwMTIwOCAwLjUyNzcxNAordnQgMC40MjU4MzQgMC44NjkxMDUKK3Z0IDAuNDI1ODM0IDAuODY5NjE4Cit2dCAwLjQyNTY0OCAwLjg2OTQ0OQordnQgMC40MjU2NDggMC44NjkxMDUKK3Z0IDAuNDE1MDM2IDAuNzgxMjU1Cit2dCAwLjQxNTAzNiAwLjc4MTQyNwordnQgMC4zMzExNDcgMC45MzQ5NDMKK3Z0IDAuMzMxMTQ3IDAuOTM1NDUzCit2dCAwLjMzMDk2NCAwLjkzNTI4MQordnQgMC4zMzA5NjQgMC45MzQ5NDAKK3Z0IDAuNjU0NzczIDAuODM1NzIxCit2dCAwLjY1NDU4NiAwLjgzNTcyOAordnQgMC42NTQ1ODYgMC44MzQxMTcKK3Z0IDAuNjU0NzczIDAuODM0MTEwCit2dCAwLjQyMjcyOCAwLjc4MzAzOAordnQgMC40MjI1NTYgMC43ODMwMzgKK3Z0IDAuNDIyNTU2IDAuNzgxNDI2Cit2dCAwLjQyMjcyOCAwLjc4MTQyNgordnQgMC42NTQ3NzMgMC44MzYyMzcKK3Z0IDAuNjU0NTg2IDAuODM2MDc5Cit2dCAwLjQyMjcyOCAwLjc4MzIyMQordnQgMC40MjI1NTYgMC43ODMyMjEKK3Z0IDAuNDI1NjQ4IDAuODY0Njc0Cit2dCAwLjQyNTgzNCAwLjg2NDY3MgordnQgMC40MjAxMDcgMC43ODEyNTQKK3Z0IDAuNDIwMjY3IDAuNzgxNDI2Cit2dCAwLjkwMTM5MiAwLjUyNzg1MgordnQgMC45MDEyMDggMC41MjgwMjQKK3Z0IDAuNDE5NjQwIDAuNzgzMDM4Cit2dCAwLjQxOTY0MiAwLjc4MzIyMQordnQgMC4wMDU3NDkgMC45MjA4MTgKK3Z0IDAuMDA1OTMzIDAuOTIwODE2Cit2dCAwLjQyNTY0OCAwLjg2NDA1MAordnQgMC40MjU4MzQgMC44NjQwNDkKK3Z0IDAuNDIwMjY3IDAuNzgzMDM4Cit2dCAwLjQyMDI2NyAwLjc4MzIyMQordnQgMC40MjI1NTUgMC43NzIzMDcKK3Z0IDAuNDIyNTU1IDAuNzcyNDczCit2dCAwLjQyMDI2NiAwLjc3MjQ3MwordnQgMC40MjAyNjYgMC43NzIzMTgKK3Z0IDAuMTE4OTE0IDAuODU2MzA5Cit2dCAwLjExODkxNCAwLjg1NTgwNwordnQgMC4xMTkwOTcgMC44NTU5ODMKK3Z0IDAuMTE5MDk3IDAuODU2MzEyCit2dCAwLjY1NDc3MyAwLjgzMzM4NwordnQgMC42NTQ1ODYgMC44MzMzOTQKK3Z0IDAuNDIwMTA1IDAuNzcyNDczCit2dCAwLjQyMDEwNSAwLjc3MjMxOQordnQgMC40MjI3MjggMC43ODA3MDIKK3Z0IDAuNDIyNTU2IDAuNzgwNzAyCit2dCAwLjQyMjcyNyAwLjc3MjQ3MgordnQgMC4wMDU3NDkgMC45MjAzMDcKK3Z0IDAuMDA1OTMzIDAuOTIwNDc0Cit2dCAwLjQyMjcyNyAwLjc3MjMwNgordnQgMC40MjAyNjcgMC43ODA3MDMKK3Z0IDAuNDIwMTA2IDAuNzgwNzAzCit2dCAwLjM5MjM4NSAwLjY3NjM1NwordnQgMC4zOTE0MTcgMC42NzU2OTkKK3Z0IDAuMzkyNTc0IDAuNjczOTk3Cit2dCAwLjM5MzU0MiAwLjY3NDY1NgordnQgMC4zOTE3MzAgMC42ODQzMjgKK3Z0IDAuMzkxNTEzIDAuNjgyODM3Cit2dCAwLjM5MzkwOCAwLjY4MTg5NgordnQgMC4zOTQ4NTggMC42ODMwNDYKK3Z0IDAuMzk3MzQ0IDAuNjgwNTc2Cit2dCAwLjM5NjE1NSAwLjY3OTc2NgordnQgMC4zOTg2ODggMC42NzczMzkKK3Z0IDAuMzk3MzI0IDAuNjc2OTQzCit2dCAwLjM5ODY4OCAwLjY3Mzk1OQordnQgMC4zOTczMzIgMC42NzQzMjkKK3Z0IDAuMzk3NDA5IDAuNjcwODIxCit2dCAwLjM5NjIyMiAwLjY3MTU5MAordnQgMC4zOTQ5NTQgMC42NjgzMzgKK3Z0IDAuMzk0MTc5IDAuNjY5NDkwCit2dCAwLjM5MTcyNSAwLjY2NzAwOQordnQgMC4zOTEzNTYgMC42NjgzMjgKK3Z0IDAuMzg4MzQ4IDAuNjY3MDI0Cit2dCAwLjM4ODY2MiAwLjY2ODI5MwordnQgMC4zODUyMjAgMC42NjgzMDcKK3Z0IDAuMzg1OTkxIDAuNjY5NDU5Cit2dCAwLjM4MjczMSAwLjY3MDc3NQordnQgMC4zODM5NDUgMC42NzEzMzcKK3Z0IDAuMzgzNjUzIDAuNjcxNjgyCit2dCAwLjM4NDM5NSAwLjY3MjE4NgordnQgMC4zODQ2NzkgMC42NzIzODAKK3Z0IDAuMzg0MzQwIDAuNjczOTQ1Cit2dCAwLjM4Mzg1MSAwLjY3Mzk0OAordnQgMC4zODE0MTEgMC42NzM5NjYKK3Z0IDAuMzgyNjU0IDAuNjczOTI3Cit2dCAwLjM4MjU3OCAwLjY3NzAzNgordnQgMC4zODEzOTEgMC42NzczOTUKK3Z0IDAuMzg2MDY2IDAuNjgwMjg2Cit2dCAwLjM4NTcyOCAwLjY4MDc4MwordnQgMC4zODQyODMgMC42Nzk0NTMKK3Z0IDAuMzg0NjcxIDAuNjc5MTIwCit2dCAwLjM4MzkwMSAwLjY3OTc0OQordnQgMC4zODI2NTggMC42ODA1MjQKK3Z0IDAuMzg1NDI3IDAuNjgxMjI1Cit2dCAwLjM4NDY4NiAwLjY4MjY4MAordnQgMC4zODg3NTAgMC42ODI3OTAKK3Z0IDAuMzg4MzQyIDAuNjg0MzM2Cit2dCAwLjM4NjMxNCAwLjY4MzY0MwordnQgMC4zODY4NDkgMC42ODIyNTYKK3Z0IDAuMzg5NTk2IDAuNjc4Mjg0Cit2dCAwLjM5MDgyNCAwLjY3ODcwMAordnQgMC4zODkxMTkgMC42ODE0MTcKK3Z0IDAuMzg3Njk4IDAuNjgxMDcyCit2dCAwLjM5NTExMSAwLjY3OTA2OQordnQgMC4zOTM0OTUgMC42Nzc1NzYKK3Z0IDAuMzkzNzEwIDAuNjc3MjU5Cit2dCAwLjM5NjA2OSAwLjY3Njc3NAordnQgMC4zOTA0MzcgMC42NzUwMzIKK3Z0IDAuMzg5ODA2IDAuNjczNDEwCit2dCAwLjM5MDc2NSAwLjY3Mjc2NgordnQgMC4zOTE1OTQgMC42NzMzMzAKK3Z0IDAuMzkwOTg4IDAuNjcxNjQ4Cit2dCAwLjM5MzQ3MiAwLjY3MDU2OQordnQgMC4zOTUxODggMC42NzIzMDYKK3Z0IDAuMzk2MDc0IDAuNjc0NDk4Cit2dCAwLjM5NDczMSAwLjY3NTU5MAordnQgMC4zOTMzODQgMC42NzcwMzcKK3Z0IDAuMzkyODEzIDAuNjc4NTgwCit2dCAwLjM5MTEyMCAwLjY2OTU1MAordnQgMC4zOTAzNTYgMC42NzA2OTQKK3Z0IDAuMzg5MjMzIDAuNjcwNDcxCit2dCAwLjM4ODk3NyAwLjY2OTU1MwordnQgMC4zODgyNzkgMC42NzExMDgKK3Z0IDAuMzg2NjY3IDAuNjcwNTc4Cit2dCAwLjM4NzQ3MyAwLjY3MzAxNQordnQgMC4zODgwNTEgMC42NzIyMzMKK3Z0IDAuMzg4NjAwIDAuNjczMzEwCit2dCAwLjM4ODM4MiAwLjY3MzYzMwordnQgMC45NzA2NTAgMC45MDkyNzYKK3Z0IDAuOTcwODM4IDAuOTA5MjcyCit2dCAwLjk3MDgzOCAwLjkwOTY1MwordnQgMC45NzA2NTAgMC45MDk2NTcKK3Z0IDAuNjU0Nzc2IDAuOTA0MzIzCit2dCAwLjY1NDc3NSAwLjkwNDU4NgordnQgMC42NTQ1ODkgMC45MDQ1NzgKK3Z0IDAuNjU0NTkwIDAuOTA0MjAyCit2dCAwLjY1NDc3NiAwLjkwOTAzNAordnQgMC42NTQ1ODkgMC45MDg5NDgKK3Z0IDAuNjU0NTg2IDAuOTA2NzQzCit2dCAwLjY1NDc3MyAwLjkwNjc4OQordnQgMC44NjkwNDggMC43NjIxNzUKK3Z0IDAuODY5MjM2IDAuNzYyMTE5Cit2dCAwLjg2OTI0NyAwLjc2Mzg3OQordnQgMC44NjkwNTkgMC43NjM5NzUKK3Z0IDAuODY5MDQ0IDAuNzU5NTc5Cit2dCAwLjg2OTIzMiAwLjc1OTU3NAordnQgMC44NjkwNDggMC43NTcwOTMKK3Z0IDAuODY5MjM2IDAuNzU3MTMyCit2dCAwLjg2OTA1OSAwLjc1NDk3OQordnQgMC44NjkyNDcgMC43NTUwNTkKK3Z0IDAuODY5MTIxIDAuNjg0MDQyCit2dCAwLjg2OTMwOCAwLjY4Mzk5MwordnQgMC44NjkzMTcgMC42ODU5MTIKK3Z0IDAuODY5MTI5IDAuNjg2MDAwCit2dCAwLjg2OTExNyAwLjY4MTUwNAordnQgMC44NjkzMDUgMC42ODE1MDYKK3Z0IDAuODY5MTIxIDAuNjc4OTAxCit2dCAwLjg2OTMwOSAwLjY3ODk1NgordnQgMC44NjkxMjkgMC42NzcxMDAKK3Z0IDAuODY5MzE3IDAuNjc3MTkwCit2dCAwLjQ2MDY5MiAwLjkyMDk0MgordnQgMC40NjA2OTQgMC45MjIzNTcKK3Z0IDAuNDYwNTA4IDAuOTIyMzIwCit2dCAwLjQ2MDUwNiAwLjkyMDk0MQordnQgMC45MTY4OTcgMC4yNzE3MzUKK3Z0IDAuOTE2ODk3IDAuMjc0OTI2Cit2dCAwLjkxNjcxMSAwLjI3NDkyOQordnQgMC45MTY3MTEgMC4yNzE3MzgKK3Z0IDAuMTQ3Nzg1IDAuOTY2MzY3Cit2dCAwLjE0NzU5OSAwLjk2NjM2NQordnQgMC4xNDc1OTkgMC45NjU1NjkKK3Z0IDAuMTQ3Nzg1IDAuOTY1NTcxCit2dCAwLjE3Nzk0MyAwLjkwMzYxNQordnQgMC4xNzc5NDMgMC45MDM4MjkKK3Z0IDAuMTc3NzU1IDAuOTAzODI5Cit2dCAwLjE3Nzc1NSAwLjkwMzQ5NAordnQgMC4xNzc5NDMgMC45MDc5ODcKK3Z0IDAuMTc3NzU1IDAuOTA4MDE3Cit2dCAwLjE3Nzc1NSAwLjkwNzQ1OAordnQgMC4xNzc5NDMgMC45MDc0NzAKK3Z0IDAuOTAxMzY0IDAuMzU2NDIwCit2dCAwLjkwMTM2MiAwLjM1Njc1MAordnQgMC45MDExNzQgMC4zNTY3NzMKK3Z0IDAuOTAxMTc2IDAuMzU2MzA4Cit2dCAwLjkwMTM2NCAwLjM2MTg2NQordnQgMC45MDExNzYgMC4zNjE5NTgKK3Z0IDAuOTAxMTcwIDAuMzU5NzQ0Cit2dCAwLjkwMTM1OCAwLjM1OTY5MQordnQgMC43MzkwMDUgMC44NTMzMTcKK3Z0IDAuNzM5MTkxIDAuODUzMzY3Cit2dCAwLjczOTIwMSAwLjg1NTQ3MgordnQgMC43MzkwMTQgMC44NTUzODMKK3Z0IDAuNzM5MDAwIDAuODUwMzg2Cit2dCAwLjczOTE4NyAwLjg1MDM4NQordnQgMC43MzkwMDQgMC44NDc1MDEKK3Z0IDAuNzM5MTkxIDAuODQ3NDUxCit2dCAwLjczOTAxNCAwLjg0NTQzNAordnQgMC43MzkyMDEgMC44NDUzNDQKK3Z0IDAuODUxOTE5IDAuMDk1MDA4Cit2dCAwLjg1MjEwNSAwLjA5NTA2MQordnQgMC44NTIxMjYgMC4wOTc0NTQKK3Z0IDAuODUxOTQwIDAuMDk3MzYwCit2dCAwLjg1MTkxMiAwLjA5MjI0MgordnQgMC44NTIwOTggMC4wOTIyNDcKK3Z0IDAuODUxOTIxIDAuMDg5MzQyCit2dCAwLjg1MjEwNiAwLjA4OTI5OQordnQgMC44NTE5NDAgMC4wODcxNTAKK3Z0IDAuODUyMTI2IDAuMDg3MDY5Cit2dCAwLjkwMzIyNiAwLjg2MDEzOAordnQgMC45MDMwMzggMC44NjAwOTIKK3Z0IDAuOTAzMDQxIDAuODU3NjYwCit2dCAwLjkwMzIyOSAwLjg1Nzc0NgordnQgMC45MDMyMjkgMC44NjI3NDcKK3Z0IDAuOTAzMDQxIDAuODYyNzQ5Cit2dCAwLjgzNjgyNiAwLjU2MDI1OAordnQgMC44MzY2NDMgMC41NjAyMDYKK3Z0IDAuODM2NjM0IDAuNTU3Mjc5Cit2dCAwLjgzNjgxNyAwLjU1NzI4MQordnQgMC44MzY4NTIgMC41NjMxMTcKK3Z0IDAuODM2NjY4IDAuNTYzMDI0Cit2dCAwLjMzMTE1MyAwLjgyNzA4MwordnQgMC4zMzA5NjkgMC44MjcxNTkKK3Z0IDAuMzMwOTgyIDAuODI0MzI1Cit2dCAwLjMzMTE2NyAwLjgyNDIzNgordnQgMC4zMzExNDggMC44MzA2MDEKK3Z0IDAuMzMwOTY0IDAuODMwNjAzCit2dCAwLjMzMTE1MyAwLjgzNDE0NwordnQgMC4zMzA5NjkgMC44MzQxMDEKK3Z0IDAuMzMxMTY3IDAuODM3MDcxCit2dCAwLjMzMDk4MiAwLjgzNjk4NQordnQgMC44MzcwNzcgMC41ODU3NzkKK3Z0IDAuODM3MjYzIDAuNTg1NzI0Cit2dCAwLjgzNzI4MCAwLjU4ODQ2OQordnQgMC44MzcwOTQgMC41ODg1NjMKK3Z0IDAuODM3MDcxIDAuNTgyMjk2Cit2dCAwLjgzNzI1NyAwLjU4MjI4OQordnQgMC44MzcwNzcgMC41Nzg3NTQKK3Z0IDAuODM3MjYzIDAuNTc4NzkyCit2dCAwLjgzNzA5MyAwLjU3NTc4NgordnQgMC44MzcyODAgMC41NzU4NTkKK3Z0IDAuNDE0ODIyIDAuODMzNTU4Cit2dCAwLjQxNTAwOCAwLjgzMzUwOQordnQgMC40MTUwMjAgMC44MzYzMzYKK3Z0IDAuNDE0ODM0IDAuODM2NDI1Cit2dCAwLjQxNDgxNyAwLjgzMDAzMwordnQgMC40MTUwMDMgMC44MzAwMzIKK3Z0IDAuNDE0ODIyIDAuODI2NDk0Cit2dCAwLjQxNTAwOCAwLjgyNjU0MAordnQgMC40MTQ4MzQgMC44MjM1ODgKK3Z0IDAuNDE1MDIwIDAuODIzNjc0Cit2dCAwLjgzNjgyNiAwLjU1MzIyNAordnQgMC44MzY2NDMgMC41NTMyNjgKK3Z0IDAuODM2NjY4IDAuNTUwNDAxCit2dCAwLjgzNjg1MiAwLjU1MDMyNgordnQgMC44MzY4MTkgMC41NTUzNDgKK3Z0IDAuODM2NjM1IDAuNTU1MzY2Cit2dCAwLjMxNjQ0MiAwLjg5MjU1OAordnQgMC4zMTY0NDIgMC44OTIzOTgKK3Z0IDAuMzE2NjMxIDAuODkyMzg3Cit2dCAwLjMxNjYzMSAwLjg5MjY3MAordnQgMC4xODg5NDYgMC45NTI4ODYKK3Z0IDAuMTg5MTM1IDAuOTUyODg1Cit2dCAwLjE4OTEzNSAwLjk1MzIzMAordnQgMC4xODg5NDYgMC45NTMyMzAKK3Z0IDAuOTY4NDQxIDAuODM3Nzc4Cit2dCAwLjk2ODQ0MSAwLjgzNzYxMAordnQgMC45Njg2MjkgMC44Mzc2MDUKK3Z0IDAuOTY4NjI5IDAuODM3ODg5Cit2dCAwLjAzNjUxOSAwLjkzMjU4NAordnQgMC4wMzY1MTkgMC45MzI3MDYKK3Z0IDAuMDM2MzMzIDAuOTMyNzA4Cit2dCAwLjAzNjMzMyAwLjkzMjQ2MwordnQgMC4wMzY1MTkgMC45MzUyODQKK3Z0IDAuMDM2MzMzIDAuOTM1NDA3Cit2dCAwLjAzNjMzMyAwLjkzNTE2NAordnQgMC4wMzY1MTkgMC45MzUxNjIKK3Z0IDAuODc3MTIwIDAuMzM0MDMzCit2dCAwLjg3NzEyMCAwLjMzNDE4MAordnQgMC44NzY5MzUgMC4zMzQxNzgKK3Z0IDAuODc2OTM1IDAuMzMzOTA1Cit2dCAwLjg3NzEyMCAwLjMzNjU1OQordnQgMC44NzY5MzUgMC4zMzY1NTcKK3Z0IDAuODc2OTM1IDAuMzM1Mzg3Cit2dCAwLjg3NzEyMCAwLjMzNTM4OQordnQgMC44NzcxMjAgMC4zNDAyMzIKK3Z0IDAuODc2OTM1IDAuMzQwMjI3Cit2dCAwLjg3NjkzNSAwLjMzNzc0MgordnQgMC44NzcxMjAgMC4zMzc3NDUKK3Z0IDAuODc3MTIwIDAuMzQxMzMxCit2dCAwLjg3NjkzNSAwLjM0MTMyNgordnQgMC4wMzY1MTUgMC45NzExMDMKK3Z0IDAuMDM2NzAzIDAuOTcxMTAyCit2dCAwLjAzNjcwMyAwLjk3MTUzOQordnQgMC4wMzY1MTUgMC45NzE1NDAKK3Z0IDAuOTU2ODUyIDAuNTIzNzM2Cit2dCAwLjk1NzAzOCAwLjUyMzczNQordnQgMC45NTcwNDEgMC41MjQ3MTgKK3Z0IDAuOTU2ODU1IDAuNTI0NjI3Cit2dCAwLjk1Njg1NSAwLjUyMjg3OQordnQgMC45NTcwNDEgMC41MjI3ODQKK3Z0IDAuOTU3MTUzIDAuNzg3NDYzCit2dCAwLjk1NzMzOSAwLjc4NzQ2OAordnQgMC45NTczNDQgMC43ODg0MjgKK3Z0IDAuOTU3MTU4IDAuNzg4MzMxCit2dCAwLjk1NzE1OCAwLjc4NjU5MAordnQgMC45NTczNDQgMC43ODY1MDEKK3Z0IDAuOTU2ODMzIDAuNzU1OTUwCit2dCAwLjk1NjY0NSAwLjc1NTk1MQordnQgMC45NTY2NDggMC43NTQ5NzkKK3Z0IDAuOTU2ODM1IDAuNzU1MDcyCit2dCAwLjk1NjgzNSAwLjc1NjgyMAordnQgMC45NTY2NDggMC43NTY5MTUKK3Z0IDAuOTU3MTAzIDAuMzg4NTgzCit2dCAwLjk1NjkxNSAwLjM4ODU5MgordnQgMC45NTY5MTkgMC4zODc2MDYKK3Z0IDAuOTU3MTA4IDAuMzg3NjkxCit2dCAwLjk1NzEwOCAwLjM4OTQzMQordnQgMC45NTY5MTkgMC4zODk1MzEKK3Z0IDAuMzgzNjg5IDAuNjc2NjM4Cit2dCAwLjM4MzA5MyAwLjY3Njg4MAordnQgMC4zODMyMjEgMC42NzM5MjMKK3Z0IDAuMTc3OTQzIDAuOTA4MzI3Cit2dCAwLjE3Nzc1NSAwLjkwODQzMgordnQgMC45MDEzNTkgMC4zNTc4NzYKK3Z0IDAuOTAxMTcwIDAuMzU3OTEzCit2dCAwLjM4NTg5MSAwLjY4MTYwNwordnQgMC4zODk0OTEgMC42NzU4OTEKK3Z0IDAuMzg5Mzc4IDAuNjc2MDU3Cit2dCAwLjM4ODA1NyAwLjY3NTE1NwordnQgMC4zODgxNjkgMC42NzQ5OTEKK3Z0IDAuMzE2NDQyIDAuODg2NDM4Cit2dCAwLjMxNjYzMSAwLjg4NjQzMwordnQgMC4zMTY2MzEgMC44ODc2ODEKK3Z0IDAuMzE2NDQyIDAuODg3Njg2Cit2dCAwLjg3NzEyMCAwLjM0MTQ4NAordnQgMC44NzY5MzUgMC4zNDE2MDAKK3Z0IDAuMzg3MTQ3IDAuNjcyNzkzCit2dCAwLjkwMzIyOSAwLjg2Mjk1NAordnQgMC45MDMwNDIgMC44NjMwNzcKK3Z0IDAuMDM2NTE1IDAuOTcwOTc4Cit2dCAwLjAzNjcwMyAwLjk3MDg1NQordnQgMC4zODY5MDEgMC42NzMxNTUKK3Z0IDAuMzg3MTY4IDAuNjcyOTc4Cit2dCAwLjM4NzAwMSAwLjY3MzIyMgordnQgMC4zODY2NTUgMC42NzM1MTcKK3Z0IDAuMzg1MDQ5IDAuNjcyMDQwCit2dCAwLjM4NjQ0OSAwLjY3MzgyMAordnQgMC45NzA2NTAgMC45MDkxMzcKK3Z0IDAuOTcwODM4IDAuOTA5MDI4Cit2dCAwLjM4NDA4MCAwLjY3MTk3MgordnQgMC4zODM4NDMgMC42NzE2NjQKK3Z0IDAuMzg0MTQ4IDAuNjcxODcxCit2dCAwLjM4NTY3NSAwLjY3NTQ2NQordnQgMC4zODcxNjAgMC42NzY0NzYKK3Z0IDAuMzg4MTAxIDAuNjc3Mjk3Cit2dCAwLjE0Nzc4NSAwLjk2NjQ4NwordnQgMC4xNDc1OTkgMC45NjY2MDIKK3Z0IDAuMzg5MzE2IDAuNjc3NTYzCit2dCAwLjM4OTY2NyAwLjY3NzgwMgordnQgMC4zODk0ODcgMC42Nzc4MzUKK3Z0IDAuMzg5MjQ0IDAuNjc3NjY5Cit2dCAwLjM4ODIzOCAwLjY3NDg5MQordnQgMC4zODk1NjAgMC42NzU3OTAKK3Z0IDAuMzg4NjU4IDAuNjc3MTE1Cit2dCAwLjM5MDAzNyAwLjY3NjUwNQordnQgMC4zOTAyMTggMC42NzYyMzgKK3Z0IDAuMzkwMTQ5IDAuNjc2MzM5Cit2dCAwLjM4Njc4MyAwLjY3NDA0OAordnQgMC4zODY4NTEgMC42NzM5NDcKK3Z0IDAuMzg2NjcwIDAuNjc0MjE0Cit2dCAwLjkxNjcxMSAwLjI3MTUzMQordnQgMC45MTY4OTcgMC4yNzE0MDgKK3Z0IDAuMzg3NDkzIDAuNjgxMDAxCit2dCAwLjM4NzI3OSAwLjY4MTA3NwordnQgMC4zODc1MDYgMC42ODA3NDMKK3Z0IDAuMzg3NjE1IDAuNjgwODE2Cit2dCAwLjE4ODk0NiAwLjk1MjcyMgordnQgMC4xODkxMzUgMC45NTI2MDAKK3Z0IDAuMzkxODczIDAuNjc3NTEzCit2dCAwLjM5MjA0MiAwLjY3NzQ3OQordnQgMC4zOTE4NjAgMC42Nzc3NDYKK3Z0IDAuMzkxNzYwIDAuNjc3Njc4Cit2dCAwLjM4OTg0MyAwLjY3NzkyMgordnQgMC4zOTEwMjYgMC42Nzg0MDMKK3Z0IDAuMzE2NDQyIDAuODg2MDAzCit2dCAwLjMxNjYzMSAwLjg4NjExNAordnQgMC40NjA2OTUgMC45MjI3ODkKK3Z0IDAuNDYwNTA5IDAuOTIyNjYyCit2dCAwLjM4OTQxMSAwLjY3ODE3OAordnQgMC4zOTA1MDAgMC42NzY1NzgKK3Z0IDAuMzkwNTY5IDAuNjc2NDc3Cit2dCAwLjM5MDc0NSAwLjY3NjU5NwordnQgMC4zOTA2NzYgMC42NzY2OTgKK3Z0IDAuMzkwMzg4IDAuNjc2NzQ0Cit2dCAwLjM5MDU2NCAwLjY3Njg2MwordnQgMC4zOTE1OTYgMC42Nzc1NjYKK3Z0IDAuMzkxMjkxIDAuNjc4NTgzCit2dCAwLjM5MTE5MCAwLjY3ODUxNQordnQgMC45Njg0NDEgMC44MzcwMzQKK3Z0IDAuOTY4NjI5IDAuODM3MDI5Cit2dCAwLjM5MTEwMyAwLjY3OTM2NAordnQgMC4zOTE1ODAgMC42Nzk2ODgKK3Z0IDAuMzkxMTk2IDAuNjgxNTEzCit2dCAwLjM4OTgyMiAwLjY4MTQ2MAordnQgMC4zOTEyMTQgMC42ODE2MzQKK3Z0IDAuMzg5NzQwIDAuNjgxNTgxCit2dCAwLjM5MDk5NiAwLjY3ODgwMAordnQgMC4zOTA3NjggMC42NzkxMzYKK3Z0IDAuMzg5MDM3IDAuNjgxNTM3Cit2dCAwLjk2ODQ0MSAwLjgzNjg4NQordnQgMC45Njg2MjkgMC44MzY3NTQKK3Z0IDAuMzkxOTA4IDAuNjc5OTExCit2dCAwLjM5MzIyMiAwLjY4MDgwMwordnQgMC4wMzY1MTkgMC45MzM5NDkKK3Z0IDAuMDM2MzMzIDAuOTMzOTUxCit2dCAwLjM5MjExNCAwLjY3OTYwOAordnQgMC4zMzE1ODMgMC45MzI4MTUKK3Z0IDAuMzMxNTgzIDAuOTMzMzMyCit2dCAwLjkwMTgyNyAwLjUyMjc4NAordnQgMC45MDE4MjcgMC41MjMyOTcKK3Z0IDAuNDI2MjcwIDAuODYxMjUwCit2dCAwLjQyNjI3MCAwLjg2MTc2MQordnQgMC42NTUyMDkgMC44MjQ2NjIKK3Z0IDAuNjU1MjA5IDAuODI1MTYzCit2dCAwLjExODQ3OCAwLjg2NDc0NgordnQgMC4xMTg0NzggMC44NjQ1MzgKK3Z0IDAuMDA1MzE0IDAuOTIzNjA4Cit2dCAwLjAwNTMxNCAwLjkyMzEwNgordnQgMC45MDE4MjcgMC41Mjc3MTEKK3Z0IDAuNDI2MjcwIDAuODY5MTA1Cit2dCAwLjQyNjI2OSAwLjg2OTYxOAordnQgMC4zMzE1ODMgMC45MzQ5NDMKK3Z0IDAuMzMxNTgzIDAuOTM1NDUzCit2dCAwLjY1NTIwOSAwLjgzNDExMAordnQgMC42NTUyMDkgMC44MzU3MjEKK3Z0IDAuNjU1MjA5IDAuODM2MjM3Cit2dCAwLjQyNjI3MCAwLjg2NDY3MgordnQgMC45MDE4MjcgMC41Mjc4NTIKK3Z0IDAuNDI2MjcwIDAuODY0MDQ5Cit2dCAwLjAwNTMxNCAwLjkyMDgxOAordnQgMC42NTUyMDkgMC44MzMzODcKK3Z0IDAuMTE4NDc5IDAuODU2MzA5Cit2dCAwLjExODQ3OSAwLjg1NTgwNwordnQgMC4wMDUzMTQgMC45MjAzMDcKK3Z0IDAuODM3MjUzIDAuNTU3MjgxCit2dCAwLjgzNzI2MiAwLjU2MDI1OAordnQgMC44MzcyNjIgMC41NTMyMjQKK3Z0IDAuODM3MjU0IDAuNTU1MzQ5Cit2dCAwLjgzNzI4OCAwLjU1MDMyNQordnQgMC40MTQzODYgMC44MjY0OTQKK3Z0IDAuNDE0Mzk5IDAuODIzNTg4Cit2dCAwLjQxNDM4MSAwLjgzMDAzMwordnQgMC40MTQzODYgMC44MzM1NTgKK3Z0IDAuNDE0Mzk5IDAuODM2NDI1Cit2dCAwLjgzNjY0MSAwLjU3ODc1NAordnQgMC44MzY2NTggMC41NzU3ODYKK3Z0IDAuODM2NjM1IDAuNTgyMjk2Cit2dCAwLjgzNjY0MSAwLjU4NTc3OQordnQgMC44MzY2NTggMC41ODg1NjQKK3Z0IDAuMzMxNTg5IDAuODM0MTQ3Cit2dCAwLjMzMTYwMiAwLjgzNzA3MQordnQgMC4zMzE1ODQgMC44MzA2MDEKK3Z0IDAuMzMxNTg5IDAuODI3MDgzCit2dCAwLjgzNzI4OCAwLjU2MzExOAordnQgMC4zMzE2MDIgMC44MjQyMzYKK3Z0IDAuNDE0ODY2IDAuNzgzMDM5Cit2dCAwLjQxNDg2NyAwLjc4MzM5MAordnQgMC40MTUyMTEgMC43ODEwODYKK3Z0IDAuNDE0ODY2IDAuNzgxMDg2Cit2dCAwLjQxOTkzNiAwLjc4MTA4NgordnQgMC40MTk5MzYgMC43ODA3MDMKK3Z0IDAuNDIwMjY2IDAuNzcyMTQ0Cit2dCAwLjQxOTkzNSAwLjc3MjE0NAordnQgMC40MjI4OTcgMC43NzI0NzIKK3Z0IDAuNDIyODk3IDAuNzcyMTQ0Cit2dCAwLjQyMjU1NiAwLjc4MzM4OQordnQgMC40MjI4OTcgMC43ODMzODkKK3Z0IDAuNDE5NjI3IDAuNzgxMDg2Cit2dCAwLjQxNTIxMSAwLjc4MzM5MAordnQgMC40MTQ4NjYgMC43ODE0MjcKK3Z0IDAuNDIyODk3IDAuNzgxNDI2Cit2dCAwLjQyMjg5NyAwLjc4MzAzOAordnQgMC40MTk2NDMgMC43ODMzODkKK3Z0IDAuNDIyNTU1IDAuNzcyMTQ0Cit2dCAwLjQyMDI2NyAwLjc4MzM4OQordnQgMC40MTk5MzUgMC43NzI0NzMKK3Z0IDAuNDIyODk3IDAuNzgwNzAyCit2dCAwLjM4NDQ2NCAwLjY3MjA4NgordnQgMC4zODQ2NjUgMC42NzIyMjMKK3Z0IDAuMzg2NjEwIDAuNjcwNDgzCit2dCAwLjM4ODk1MyAwLjY2OTQzMQordnQgMC4zOTExNDQgMC42Njk0MjkKK3Z0IDAuMzkzNTQxIDAuNjcwNDY2Cit2dCAwLjM5NTI3NyAwLjY3MjIyNwordnQgMC4zOTYxOTUgMC42NzQ0NzQKK3Z0IDAuMzk2MTkxIDAuNjc2Nzk4Cit2dCAwLjM5NTIxMyAwLjY3OTE0MgordnQgMC4zOTMyODQgMC42ODA5MTIKK3Z0IDAuMzg3NjE0IDAuNjgxMTkxCit2dCAwLjM4OTMwMiAwLjY3ODEwNQordnQgMC4zODg1ODUgMC42NzcyMjEKK3Z0IDAuMzg4MzYyIDAuNjc2OTE0Cit2dCAwLjM4ODM5MCAwLjY3NzA4OAordnQgMC4zODgyMDEgMC42NzczNjUKK3Z0IDAuMzg1ODQ1IDAuNjgwODI3Cit2dCAwLjM4NjE1OSAwLjY4MDM2NQordnQgMC4zODU2MTEgMC42ODExNzEKK3Z0IDAuMzg1OTQ4IDAuNjgxNDk3Cit2dCAwLjM4ODc3NiAwLjY4MjY2OQordnQgMC4zOTE0OTQgMC42ODI3MTUKK3Z0IDAuMzkzODQ0IDAuNjgxNzkwCit2dCAwLjM5NjA1MyAwLjY3OTY5NgordnQgMC4zOTcyMDMgMC42NzY5MTkKK3Z0IDAuMzk3MjEwIDAuNjc0MzUzCit2dCAwLjM5NjExOSAwLjY3MTY1OQordnQgMC4zOTQxMTAgMC42Njk1OTMKK3Z0IDAuMzkxMzMyIDAuNjY4NDUwCit2dCAwLjM4ODY4NSAwLjY2ODQxNAordnQgMC4zODYwNDcgMC42Njk1NTQKK3Z0IDAuMzg0MDQ4IDAuNjcxNDA2Cit2dCAwLjM4NDYxNyAwLjY4Mjc4NAordnQgMC4zODI1NTQgMC42ODA1OTIKK3Z0IDAuMzgxMjcwIDAuNjc3NDE5Cit2dCAwLjM4MTI4MCAwLjY3Mzk2NgordnQgMC4zODI2MjggMC42NzA3MDYKK3Z0IDAuMzg1MTUyIDAuNjY4MjAzCit2dCAwLjM4ODMyNSAwLjY2NjkwMwordnQgMC4zOTE3NDkgMC42NjY4ODcKK3Z0IDAuMzk1MDIzIDAuNjY4MjM1Cit2dCAwLjM5NzUxMiAwLjY3MDc1MwordnQgMC4zOTg4MDkgMC42NzM5MzQKK3Z0IDAuMzk4ODA5IDAuNjc3MzYyCit2dCAwLjM5NzQ0NyAwLjY4MDY0NQordnQgMC4zOTQ5MjYgMC42ODMxNTAKK3Z0IDAuMzkxNzU1IDAuNjg0NDUxCit2dCAwLjM4ODMxOCAwLjY4NDQ1OAordnQgMC4zODYyNjggMC42ODM3NTUKK3Z0IDAuMzg2NjE4IDAuNjczNzg4Cit2dCAwLjM5MTA5NyAwLjY3ODg2OAordnQgMC4zOTA5MzYgMC42NzkxMDMKK3Z0IDAuMzkxMTcyIDAuNjc5MjYzCit2dCAwLjM5MTg3NiAwLjY3OTc0MgordnQgMC4zOTIwMTMgMC42Nzk1NDAKK3Z0IDAuMzkzNTMxIDAuNjc3MzA4Cit2dCAwLjM5MzM5NCAwLjY3NzUwOQordnQgMC4zOTMzMDUgMC42NzcxNTQKK3Z0IDAuMzkxMzM4IDAuNjc1ODE1Cit2dCAwLjM5MDM1OCAwLjY3NTE0OAordnQgMC4zODgzMDMgMC42NzM3NTAKK3Z0IDAuMzg3Mzk0IDAuNjczMTMyCit2dCAwLjM4Njc1NiAwLjY3MzU4NAordnQgMC4zODk3ODEgMC42NzMyODEKK3Z0IDAuMzkwNjU3IDAuNjcyNjkzCit2dCAwLjM5MDg1OSAwLjY3MTY3NAordnQgMC4zOTAyODIgMC42NzA4MDQKK3Z0IDAuMzg5MjU5IDAuNjcwNjAwCit2dCAwLjM4ODM4OCAwLjY3MTE4MQordnQgMC4zODgxODAgMC42NzIyMDcKK3Z0IDAuMzg4NjczIDAuNjczMjAwCit2dCAwLjM4Njg5MCAwLjY4MjE0MAordnQgMC4zOTE3MDkgMC42Nzc0MDEKK3Z0IDAuMzkxNzc4IDAuNjc3MzAwCit2dCAwLjAzNjUxNSAwLjk3MTcxNAordnQgMC4wMzY3MDMgMC45NzE4MzUKK3Z0IDAuOTcwNjUwIDAuOTA5ODgzCit2dCAwLjk3MDgzOCAwLjkxMDAyMQordnQgMC4xNDc3ODUgMC45NjU0MDIKK3Z0IDAuMTQ3NTk5IDAuOTY1Mjc1Cit2dCAwLjMxNjQ0MiAwLjg5MDcxNwordnQgMC4zMTY0NDIgMC44ODkxMTkKK3Z0IDAuMzE2NjMxIDAuODg5MTE0Cit2dCAwLjMxNjYzMSAwLjg5MDcxMgordnQgMC4zMTY0NDIgMC44ODgzMjMKK3Z0IDAuMzE2NjMxIDAuODg4MzE5Cit2dCAwLjkxNjg5NyAwLjI3NTMzMAordnQgMC45MTY3MTEgMC4yNzU1MTUKK3Z0IDAuMTg5MTM1IDAuOTU0NTY1Cit2dCAwLjE4ODk0NiAwLjk1NDY4NgordnQgMC4xODg5NDYgMC45NTQyNDMKK3Z0IDAuMTg5MTM1IDAuOTU0MjQyCit2dCAwLjMxNjQ0MiAwLjg4Nzg5OAordnQgMC4zMTY2MzEgMC44ODc4OTQKK3Z0IDAuMzkxNjQ4IDAuNjc5NTg4Cit2dCAwLjQ2MDY5NSAwLjkxODk5MAordnQgMC40NjA2OTIgMC45MjAzMzIKK3Z0IDAuNDYwNTA3IDAuOTIwMzMwCit2dCAwLjQ2MDUwOSAwLjkxOTA2OQordnQgMC4zOTI3MTIgMC42Nzg1MTIKK3Z0IDAuMzkyMzA1IDAuNjc2NDc0Cit2dCAwLjk3MDQ2OCAwLjkwOTY1OAordnQgMC45NzA0NjggMC45MDkyNzYKK3Z0IDAuNjU0OTU4IDAuOTA0MzI0Cit2dCAwLjY1NDk1OCAwLjkwNDU4NgordnQgMC42NTQ5NTUgMC45MDY3OTAKK3Z0IDAuNjU0OTU4IDAuOTA5MDM1Cit2dCAwLjg2ODg3NyAwLjc2Mzk3NgordnQgMC44Njg4NjYgMC43NjIxNzkKK3Z0IDAuODY4ODYxIDAuNzU5NTc5Cit2dCAwLjg2ODg2NSAwLjc1NzA5NwordnQgMC44Njg4NzcgMC43NTQ5ODAKK3Z0IDAuODY4OTQ3IDAuNjg2MDAwCit2dCAwLjg2ODkzOCAwLjY4NDA0MgordnQgMC44Njg5MzUgMC42ODE1MDQKK3Z0IDAuODY4OTM4IDAuNjc4OTAxCit2dCAwLjg2ODk0NyAwLjY3NzEwMAordnQgMC40NjA4NzQgMC45MjA5NDEKK3Z0IDAuNDYwODc2IDAuOTIyMzYwCit2dCAwLjkxNjUyOSAwLjI3NDkyOQordnQgMC45MTY1MjkgMC4yNzE3MzgKK3Z0IDAuMTQ3OTY3IDAuOTY1NTcxCit2dCAwLjE0Nzk2NyAwLjk2NjM2NwordnQgMC4xNzgxMjYgMC45MDM2MTUKK3Z0IDAuMTc4MTI2IDAuOTAzODI5Cit2dCAwLjE3ODEyNiAwLjkwNzQ3MAordnQgMC4xNzgxMjYgMC45MDc5ODcKK3Z0IDAuOTAxNTQ2IDAuMzU2NDIxCit2dCAwLjkwMTU0NSAwLjM1Njc1MAordnQgMC45MDE1NDEgMC4zNTk2ODgKK3Z0IDAuOTAxNTQ2IDAuMzYxODYzCit2dCAwLjczODgzMiAwLjg1NTM4MwordnQgMC43Mzg4MjIgMC44NTMzMTcKK3Z0IDAuNzM4ODE4IDAuODUwMzg1Cit2dCAwLjczODgyMiAwLjg0NzUwMQordnQgMC43Mzg4MzIgMC44NDU0MzQKK3Z0IDAuODUxNzU4IDAuMDk3MzU3Cit2dCAwLjg1MTczNyAwLjA5NTAwNQordnQgMC44NTE3MzAgMC4wOTIyMzkKK3Z0IDAuODUxNzM4IDAuMDg5MzM5Cit2dCAwLjg1MTc1OCAwLjA4NzE1MAordnQgMC45MDM0MTIgMC44NTc3NDYKK3Z0IDAuOTAzNDA4IDAuODYwMTM3Cit2dCAwLjkwMzQxMSAwLjg2Mjc0NwordnQgMC4zMTYyNjAgMC44OTI1NTgKK3Z0IDAuMzE2MjYwIDAuODkyMzkzCit2dCAwLjE4ODc2NCAwLjk1MzIzMAordnQgMC4xODg3NjQgMC45NTI4ODYKK3Z0IDAuOTY4MjU4IDAuODM3Nzc4Cit2dCAwLjk2ODI1OCAwLjgzNzYxMAordnQgMC4wMzY3MDIgMC45MzI1ODQKK3Z0IDAuMDM2NzAyIDAuOTMyNzA2Cit2dCAwLjAzNjcwMiAwLjkzNTE2MgordnQgMC4wMzY3MDIgMC45MzUyODQKK3Z0IDAuODc3MzAzIDAuMzM0MDMzCit2dCAwLjg3NzMwMyAwLjMzNDE4MAordnQgMC44NzczMDMgMC4zMzUzOTAKK3Z0IDAuODc3MzAzIDAuMzM2NTYwCit2dCAwLjg3NzMwMyAwLjMzNzc0NQordnQgMC44NzczMDMgMC4zNDAyMzYKK3Z0IDAuODc3MzAzIDAuMzQxMzM1Cit2dCAwLjAzNjMzMyAwLjk3MTU0MAordnQgMC4wMzYzMzMgMC45NzExMDMKK3Z0IDAuOTU2NjcyIDAuNTI0NjI3Cit2dCAwLjk1NjY3MCAwLjUyMzczNgordnQgMC45NTY2NzIgMC41MjI4NzkKK3Z0IDAuOTU2OTc2IDAuNzg4MzI4Cit2dCAwLjk1Njk3MSAwLjc4NzQ2MAordnQgMC45NTY5NzYgMC43ODY1ODYKK3Z0IDAuOTU3MDE4IDAuNzU1MDcxCit2dCAwLjk1NzAxNSAwLjc1NTk1MAordnQgMC45NTcwMTggMC43NTY4MjAKK3Z0IDAuOTU3MjkwIDAuMzg3Njg4Cit2dCAwLjk1NzI4NiAwLjM4ODU3OQordnQgMC45NTcyOTAgMC4zODk0MjcKK3Z0IDAuMTc4MTI2IDAuOTA4MzI3Cit2dCAwLjkwMTU0MSAwLjM1Nzg3MwordnQgMC4zMTYyNjAgMC44ODc2ODYKK3Z0IDAuMzE2MjYwIDAuODg2NDM4Cit2dCAwLjg3NzMwMyAwLjM0MTQ4NAordnQgMC45MDM0MTIgMC44NjI5NTQKK3Z0IDAuMDM2MzMzIDAuOTcwOTc4Cit2dCAwLjk3MDQ2OCAwLjkwOTEzOAordnQgMC4xNDc5NjcgMC45NjY0ODgKK3Z0IDAuOTE2NTI5IDAuMjcxNTMxCit2dCAwLjE4ODc2NCAwLjk1MjcyMgordnQgMC4zMTYyNjAgMC44ODYwMDMKK3Z0IDAuNDYwODc3IDAuOTIyNzg4Cit2dCAwLjk2ODI1OCAwLjgzNzAzNAordnQgMC45NjgyNTggMC44MzY4ODYKK3Z0IDAuMDM2NzAyIDAuOTMzOTQ5Cit2dCAwLjk3MDQ2OCAwLjkwOTg4NAordnQgMC45MTY1MjkgMC4yNzU1MTUKK3Z0IDAuNDYwODc3IDAuOTE4OTkwCit2dCAwLjQ2MDg3NSAwLjkyMDMzMQordnQgMC4xODg3NjQgMC45NTQ2ODYKK3Z0IDAuMTg4NzY0IDAuOTU0MjQzCit2dCAwLjAzNjMzMyAwLjk3MTcxNAordnQgMC4xNDc5NjcgMC45NjU0MDIKK3Z0IDAuMzE2MjYwIDAuODkwNzE3Cit2dCAwLjMxNjI2MCAwLjg4OTExOQordnQgMC4zMTYyNjAgMC44ODgzMjMKK3Z0IDAuMzE2MjYwIDAuODg3ODk4Cit2dCAwLjM2NjI0NiAwLjc1NzkzNwordnQgMC4zNjYyNDYgMC43NTc1MTEKK3Z0IDAuMzY2NjE1IDAuNzU3NTExCit2dCAwLjM2NjYxNSAwLjc1NzkzNwordnQgMC4zNjYwMTQgMC43NjIwNTAKK3Z0IDAuMzY1ODg0IDAuNzYxOTA5Cit2dCAwLjM2NjQ4NiAwLjc2MTI0MwordnQgMC4zNjY3OTIgMC43NjExODIKK3Z0IDAuMzY1MjIzIDAuNzYyNTUyCit2dCAwLjM2NTE0OCAwLjc2MjM3MgordnQgMC4zNjM4MzUgMC43NjMwMDkKK3Z0IDAuMzYzNzgzIDAuNzYyODI0Cit2dCAwLjM2MjE1OCAwLjc2MzE3NgordnQgMC4zNjIxNTIgMC43NjI5ODUKK3Z0IDAuMzYwMzA5IDAuNzYyOTAzCit2dCAwLjM2MDM2MSAwLjc2MjcxNQordnQgMC4zNTgyNDYgMC43NjE1NDkKK3Z0IDAuMzU4Mzg2IDAuNzYxNDA4Cit2dCAwLjM1NzAzMCAwLjc1OTcxMAordnQgMC4zNTcyMTIgMC43NTk2NTUKK3Z0IDAuMzU2NjgzIDAuNzU3NzU4Cit2dCAwLjM1Njg3MiAwLjc1Nzc2MAordnQgMC4wNjMzMzQgMC44Njk0ODgKK3Z0IDAuMDYzMzM0IDAuODcxNjQ5Cit2dCAwLjA2MzE0NyAwLjg3MTYwMwordnQgMC4zNTcwOTMgMC43NTU2NTgKK3Z0IDAuMzU2OTEzIDAuNzU1NjA0Cit2dCAwLjM1Nzg0NiAwLjc1MzQ1NwordnQgMC4zNTc5ODYgMC43NTM1ODkKK3Z0IDAuMzU5MzkyIDAuNzUyMTY1Cit2dCAwLjM1OTQ0OCAwLjc1MjM0NwordnQgMC4zNjA5OTMgMC43NTE1ODIKK3Z0IDAuMzYxMDQ1IDAuNzUxNzYyCit2dCAwLjM2MjYzMCAwLjc1MTQ4MwordnQgMC4zNjI2MjYgMC43NTE2NzEKK3Z0IDAuMDA1OTQwIDAuODYxMjkzCit2dCAwLjAwNTc1MyAwLjg2MTM0NwordnQgMC4wMDU3NTAgMC44NTk3MTAKK3Z0IDAuMzY0MDQ4IDAuNzUxNjg0Cit2dCAwLjM2NDAxNiAwLjc1MTg3OQordnQgMC4zNjQ5OTIgMC43NTE5ODAKK3Z0IDAuMDA1NzUwIDAuODU3MzQ3Cit2dCAwLjAwNTkzNiAwLjg1NzM0NgordnQgMC4wMDU5MzYgMC44NTgzMjMKK3Z0IDAuMzY2ODAxIDAuNzUzMjQxCit2dCAwLjM2Njk4OSAwLjc1MzE2NwordnQgMC4zNjY5ODkgMC43NTM0NTQKK3Z0IDAuMzY2ODAxIDAuNzUzNDU1Cit2dCAwLjM2NjI0NiAwLjc1ODMxMwordnQgMC4zNjYyNDYgMC43NTgxMjMKK3Z0IDAuMzY2ODAyIDAuNzU4MTIzCit2dCAwLjM2Njk4OSAwLjc1ODMxMwordnQgMC4zNjIwNTIgMC43NTc1MTAKK3Z0IDAuMzYyMjQxIDAuNzU3NTExCit2dCAwLjM2MjI0MSAwLjc1ODEyNAordnQgMC4zNjIwNTIgMC43NTgzMTQKK3Z0IDAuNjgzMzIyIDAuOTQ3NDA4Cit2dCAwLjY4MzUwOSAwLjk0NzQwOAordnQgMC42ODM1MDkgMC45NDc3ODIKK3Z0IDAuNjgzMzIyIDAuOTQ3OTY4Cit2dCAwLjUwNDAyMiAwLjk1Njc4NgordnQgMC41MDQwMjIgMC45NTYyNjMKK3Z0IDAuNTA0MjA5IDAuOTU2MjU3Cit2dCAwLjUwNDIwOSAwLjk1Njk2MQordnQgMC4zNjI5OTkgMC43NTM5NjkKK3Z0IDAuMzYzMDgxIDAuNzUzNzkwCit2dCAwLjM2NDEyMSAwLjc1NDUwMQordnQgMC4zNjM5NDYgMC43NTQ1ODQKK3Z0IDAuMzYxNTAxIDAuNzUzNzUwCit2dCAwLjM1OTk5NiAwLjc1NDU5MQordnQgMC4zNTk4NDggMC43NTQ0NTkKK3Z0IDAuMzYxNDc5IDAuNzUzNTQxCit2dCAwLjM1OTM0MSAwLjc1NjE5OAordnQgMC4zNTkxNTUgMC43NTYxNTQKK3Z0IDAuMzU5Mjg2IDAuNzU3NzA5Cit2dCAwLjM1OTA5OCAwLjc1NzcxMAordnQgMC4zNTk3ODIgMC43NTk0OTEKK3Z0IDAuMzU5NjA1IDAuNzU5NTY3Cit2dCAwLjM2MDgzMCAwLjc2MDUxOQordnQgMC4zNjA3MjQgMC43NjA2ODQKK3Z0IDAuMzYyMjgyIDAuNzYwODk0Cit2dCAwLjM2MjI0MCAwLjc2MTA4NAordnQgMC4zNjMzNDMgMC43NjA3NzYKK3Z0IDAuMzYzNDAwIDAuNzYwOTYwCit2dCAwLjI3ODQ4NCAwLjk3MTYwNQordnQgMC4yNzg0ODQgMC45NzI3NjUKK3Z0IDAuMjc4Mjk3IDAuOTcyNzI0Cit2dCAwLjM2NTE2NyAwLjc1OTkxMwordnQgMC4zNjQyNTIgMC43NjA1ODIKK3Z0IDAuMzY0MTg0IDAuNzYwNDA3Cit2dCAwLjM2NTE4OCAwLjc1OTY4MwordnQgMC4zNjI0MjYgMC43NTY1NjYKK3Z0IDAuMzYyNDI2IDAuNzU2Mjk0Cit2dCAwLjM2MjYxMiAwLjc1NjI5NAordnQgMC4zNjI2MTIgMC43NTY1NjYKK3Z0IDAuMzY2OTg5IDAuNzU3NTA5Cit2dCAwLjM2NjgwMiAwLjc1NzUxMQordnQgMC4zNjY4MDIgMC43NTY1NjYKK3Z0IDAuMzY2OTg5IDAuNzU2NTY1Cit2dCAwLjg5MjQ3MSAwLjkzOTMwNgordnQgMC44OTI0NzEgMC45Mzk5NDIKK3Z0IDAuODkyMjg0IDAuOTM5NzY2Cit2dCAwLjg5MjI4NCAwLjkzOTMxMwordnQgMC4zNjI2MTIgMC43NTc1MTEKK3Z0IDAuMzYyNDI2IDAuNzU3NTExCit2dCAwLjg5MjI4NCAwLjkzODM2OQordnQgMC4zNjIwNTEgMC43NTY1NjUKK3Z0IDAuMzYzMzYyIDAuNzU3OTM3Cit2dCAwLjM2MzM2MiAwLjc1NzUxMQordnQgMC4zNjQ5OTMgMC43NTc1MTEKK3Z0IDAuMzY0OTkzIDAuNzU3OTM3Cit2dCAwLjM2NjI0NSAwLjc1MjU3NQordnQgMC4zNjYyNDUgMC43NTI3NzMKK3Z0IDAuMzY0OTkyIDAuNzUyMTY0Cit2dCAwLjAwNTc1MiAwLjg1NjA5MgordnQgMC4zNjMzNjMgMC43NTgzMTMKK3Z0IDAuMzYzMzYzIDAuNzU4MTI0Cit2dCAwLjM2NDk5MyAwLjc1ODEyNAordnQgMC4zNjQ5OTMgMC43NTgzMTMKK3Z0IDAuMzY2MjQ1IDAuNzUyOTY3Cit2dCAwLjM2NDk5MiAwLjc1MjM1NAordnQgMC4zNjYyNDUgMC43NTY1NjYKK3Z0IDAuMzY0OTkzIDAuNzU2NTY2Cit2dCAwLjM2NjcwNiAwLjc1MjkxOAordnQgMC45ODk4NjkgMC40MDA1MzAKK3Z0IDAuOTg5Nzc5IDAuNDAwMzcwCit2dCAwLjk4OTg2OSAwLjQwMDE1NgordnQgMC4zNjY2NTkgMC43NTMwNjAKK3Z0IDAuMzY2NjE0IDAuNzUzMjgzCit2dCAwLjM2NjYxNCAwLjc1NjU2NgordnQgMC4zNjY5ODkgMC43NTQyNjMKK3Z0IDAuMzY2ODAxIDAuNzU0MjY1Cit2dCAwLjM2NjI0NSAwLjc1NDI2MwordnQgMC4zNjQ5OTIgMC43NTQyNjEKK3Z0IDAuMzY2NjE0IDAuNzU0MjY0Cit2dCAwLjY4MzMyMiAwLjk0NjY1OAordnQgMC42ODM1MDkgMC45NDY2NTgKK3Z0IDAuMzYzMzYyIDAuNzU2Mjk0Cit2dCAwLjM2MzM2MiAwLjc1NjU2NgordnQgMC4zNjI0MjYgMC43NTc5MzcKK3Z0IDAuMzYyNjEyIDAuNzU3OTM3Cit2dCAwLjM2MjYxMiAwLjc1ODMxNAordnQgMC4zNjI2MTIgMC43NTgxMjQKK3Z0IDAuNjgzMzIyIDAuOTQ2MDc4Cit2dCAwLjY4MzUwOSAwLjk0NTg5NQordnQgMC4zNjQzNjEgMC43NTYyOTQKK3Z0IDAuNTA0MDIyIDAuOTU1NDQxCit2dCAwLjUwNDIwOSAwLjk1NTM1MAordnQgMC4zNjY4MDIgMC43NTU0MDgKK3Z0IDAuMzY2OTg5IDAuNzU1NDA3Cit2dCAwLjM2NDk5MyAwLjc1NTQwOAordnQgMC4zNjYyNDUgMC43NTU0MDgKK3Z0IDAuMzY2NjE0IDAuNzU1NDA4Cit2dCAwLjM2NDM1NyAwLjc1NTQwOAordnQgMC4zNjQzNTUgMC43NTQ0MjcKK3Z0IDAuMzYxNDU3IDAuNzUzMzM2Cit2dCAwLjM2MTA5OSAwLjc1MTk0NAordnQgMC4zNjI2MjIgMC43NTE4NjAKK3Z0IDAuMzYzMTY5IDAuNzUzNjE1Cit2dCAwLjM1OTcwMCAwLjc1NDMzMQordnQgMC4zNTk1MDQgMC43NTI1MjkKK3Z0IDAuMzU4OTY5IDAuNzU2MTEyCit2dCAwLjM1NzI3NCAwLjc1NTcxNQordnQgMC4zNTgxMjYgMC43NTM3MjUKK3Z0IDAuMzU4OTA5IDAuNzU3NzMzCit2dCAwLjM1NzA2MSAwLjc1Nzc2MgordnQgMC4zNTk0MjkgMC43NTk2NDUKK3Z0IDAuMzU3Mzk1IDAuNzU5NjAyCit2dCAwLjM2MzQ1NiAwLjc2MTE0NwordnQgMC4zNjM3MzEgMC43NjI2NDMKK3Z0IDAuMzYyMTQ1IDAuNzYyNzk4Cit2dCAwLjM2MjE5OCAwLjc2MTI3OAordnQgMC4zNTg1MjcgMC43NjEyNzEKK3Z0IDAuMzYwNDEzIDAuNzYyNTMyCit2dCAwLjM2MDYxOCAwLjc2MDg1MgordnQgMC4zNjUwNzEgMC43NjIxOTUKK3Z0IDAuMzY1MTU0IDAuNzYwMjI0Cit2dCAwLjM2NjE3OSAwLjc2MTMwNQordnQgMC4zNjU3NTMgMC43NjE3NzEKK3Z0IDAuOTQ1ODUwIDAuNDAxNDI4Cit2dCAwLjk0NTg1MCAwLjQwMDU3MwordnQgMC45NDYyODUgMC40MDA1NzkKK3Z0IDAuOTQ2Mjg1IDAuNDAxNDM1Cit2dCAwLjMzMDk3MCAwLjg2ODk0MAordnQgMC4zMzA5NzQgMC44NjgxNTYKK3Z0IDAuMzMxNDA5IDAuODY4MTU4Cit2dCAwLjMzMTQwNSAwLjg2ODk0MQordnQgMC4zMzA5NjYgMC44NzAzMjMKK3Z0IDAuMzMxNDAxIDAuODcwMzIzCit2dCAwLjMzMDk2NCAwLjg3MTk5NgordnQgMC4zMzE0MDAgMC44NzE5OTcKK3Z0IDAuMzMwOTY1IDAuODczODQ5Cit2dCAwLjMzMTQwMSAwLjg3Mzg0OQordnQgMC4zMzA5NzQgMC44NzU5MjgKK3Z0IDAuMzMxNDA5IDAuODc1OTI5Cit2dCAwLjA2MzMyOSAwLjg2NzU1MAordnQgMC4wNjMzMTcgMC44NjU3NTgKK3Z0IDAuMDYzNzUzIDAuODY1NzU4Cit2dCAwLjA2Mzc2NSAwLjg2NzU1MAordnQgMC4wNjM3NjkgMC44Njk0ODYKK3Z0IDAuMDYzNzY5IDAuODcxNjQ4Cit2dCAwLjA2MzMyOCAwLjg3MzgzMAordnQgMC4wNjM3NjMgMC44NzM4MjgKK3Z0IDAuMDA1NzU5IDAuODYyOTQ1Cit2dCAwLjAwNTc3MCAwLjg2NDQ4NgordnQgMC4wMDUzMzUgMC44NjQ0ODcKK3Z0IDAuMDA1MzI0IDAuODYyOTQ2Cit2dCAwLjAwNTMxOCAwLjg2MTM0NwordnQgMC4wMDUzMTQgMC44NTk3MTAKK3Z0IDAuMDA1NzQ5IDAuODU4MjkxCit2dCAwLjAwNTMxNCAwLjg1ODI5MgordnQgMC45MDM2NTkgMC40NTE1MjgKK3Z0IDAuOTAzNjU5IDAuNDUxODE4Cit2dCAwLjkwMzIyNCAwLjQ1MTgxNwordnQgMC45MDMyMjQgMC40NTE1MzAKK3Z0IDAuMDA1MzE0IDAuODU3MzQ3Cit2dCAwLjkwMzIyNCAwLjQ1NTg3MgordnQgMC45MDMyMjQgMC40NTQ5MjcKK3Z0IDAuOTAzNjU5IDAuNDU0OTI3Cit2dCAwLjkwMzY1OSAwLjQ1NTg3MgordnQgMC45MDMyMjQgMC40NTY2NzUKK3Z0IDAuOTAzNjU5IDAuNDU2Njc1Cit2dCAwLjAwNTMxNiAwLjg1NjA5MgordnQgMC4wMDU3NTMgMC44NTU2MzAKK3Z0IDAuMDA1MzE4IDAuODU1NjMxCit2dCAwLjkwMzIyNCAwLjQ1Mzc2OQordnQgMC45MDM2NTkgMC40NTM3NzAKK3Z0IDAuOTAzMjI0IDAuNDUyNjI2Cit2dCAwLjkwMzY1OSAwLjQ1MjYyNgordnQgMC4zNjM5NzkgMC43NTIwNzYKK3Z0IDAuMzYyNjEyIDAuNzU2MTEzCit2dCAwLjM2MjIzOCAwLjc1NjExMwordnQgMC4zNjQxMjQgMC43NTYxMTMKK3Z0IDAuMzY0MTIyIDAuNzU1NDA4Cit2dCAwLjM2NDM1MiAwLjc2MDc2OAordnQgMC4zNjIyMzYgMC43NTY1NjYKK3Z0IDAuMzYzMzYyIDAuNzU2MTEyCit2dCAwLjkwNzU0NSAwLjEzMjg1MgordnQgMC45MDc1NDUgMC4xMzIxMDkKK3Z0IDAuOTA3OTgwIDAuMTMyMTA5Cit2dCAwLjkwNzk4MCAwLjEzMjg1MgordnQgMC44OTI5MDcgMC45Mzc1NTkKK3Z0IDAuODkyOTA3IDAuOTM4MzYyCit2dCAwLjg5MjQ3MSAwLjkzODM2MgordnQgMC44OTI0NzEgMC45Mzc1NTkKK3Z0IDAuNjgyODg3IDAuOTQ3OTY4Cit2dCAwLjY4Mjg4NyAwLjk0NzQwOAordnQgMC41MDM1ODYgMC45NTY3ODcKK3Z0IDAuNTAzNTg2IDAuOTU2MjYzCit2dCAwLjkxNzAzNCAwLjA5MDA2MwordnQgMC45MTcwMzIgMC4wODg1NjIKK3Z0IDAuOTE3NDY4IDAuMDg4NTYyCit2dCAwLjkxNzQ2OSAwLjA5MDA2MwordnQgMC45MTcwMzggMC4wODcwNjkKK3Z0IDAuOTE3NDczIDAuMDg3MDY5Cit2dCAwLjMzMDk3MiAwLjkwODQyMwordnQgMC4zMzA5NjQgMC45MDY4MjUKK3Z0IDAuMzMxMzk5IDAuOTA2ODI2Cit2dCAwLjMzMTQwNyAwLjkwODQyNAordnQgMC4zMzA5NjQgMC45MDUzMTcKK3Z0IDAuMzMxNDAwIDAuOTA1MzE3Cit2dCAwLjMzMDk3MiAwLjkwMzUyNwordnQgMC4zMzE0MDcgMC45MDM1MjcKK3Z0IDAuODQ3NzI0IDAuODg0NDc4Cit2dCAwLjg0NzczMCAwLjg4MzQyNwordnQgMC44NDgxNjYgMC44ODM0MjYKK3Z0IDAuODQ4MTYwIDAuODg0NDc4Cit2dCAwLjg0NzczMiAwLjg4MTk3NgordnQgMC44NDgxNjggMC44ODE5NzQKK3Z0IDAuODQ3NzMxIDAuODgwOTE1Cit2dCAwLjg0ODE2NyAwLjg4MDkxMwordnQgMC44NDc3MjMgMC44NzkwNzMKK3Z0IDAuODQ4MTU5IDAuODc5MDcyCit2dCAwLjg0ODE2NCAwLjg4MDA3NAordnQgMC44NDc3MjggMC44ODAwNzUKK3Z0IDAuODkyOTA3IDAuOTM5MzA2Cit2dCAwLjg5MjkwNyAwLjkzOTk0MgordnQgMC45MDc1NDUgMC4xMzA4NTYKK3Z0IDAuOTA3NTQ1IDAuMTI5MjI3Cit2dCAwLjkwNzk4MCAwLjEyOTIyNwordnQgMC45MDc5ODAgMC4xMzA4NTYKK3Z0IDAuNjgyODg3IDAuOTQ2NjU4Cit2dCAwLjkwNzU0NSAwLjEyODQ3NgordnQgMC45MDc1NDUgMC4xMjc5MTYKK3Z0IDAuOTA3OTgwIDAuMTI3OTE2Cit2dCAwLjkwNzk4MCAwLjEyODQ3NgordnQgMC42ODI4ODcgMC45NDYwNzgKK3Z0IDAuNTAzNTg2IDAuOTU1NDQxCit2dCAwLjg0ODE2OCAwLjg3NzQ2NAordnQgMC44NDc3MzIgMC44Nzc0NjUKK3Z0IDAuMDA1OTQwIDAuODU1Njc3Cit2dCAwLjAwNTc1NCAwLjg1NTM0NwordnQgMC4wMDUzMTkgMC44NTUzNDcKK3Z0IDAuOTE3MDM4IDAuMDkxMDE4Cit2dCAwLjkxNzQ3MyAwLjA5MTAxOAordnQgMC4zNjE3NTggMC42ODc1NDUKK3Z0IDAuMzYyNjg1IDAuNjg3NTU0Cit2dCAwLjM2MjY4NCAwLjY5MDY2NAordnQgMC4zNjE0NDcgMC42OTAyODMKK3Z0IDAuMzU5NzAwIDAuNjkzMTg2Cit2dCAwLjM2MDA0MCAwLjY5MjQ5MgordnQgMC4zNjI2ODMgMC42OTMyMzMKK3Z0IDAuMzYyNjg1IDAuNjk0MDM3Cit2dCAwLjM1NzU0MyAwLjY5MTA2MQordnQgMC4zNTgxMjIgMC42OTA2NDMKK3Z0IDAuMzU2NjgzIDAuNjg3NzUyCit2dCAwLjM1NzMzMSAwLjY4NzYzMAordnQgMC4zNTY2ODQgMC42ODAzODgKK3Z0IDAuMzU3MzMyIDAuNjgwMzkzCit2dCAwLjM1NjY4NSAwLjY3Mjk4MwordnQgMC4zNTczMzMgMC42NzMxMTUKK3Z0IDAuMzU3NTQ3IDAuNjY5ODE1Cit2dCAwLjM1ODEyOCAwLjY3MDIzOAordnQgMC4zNTk2OTAgMC42Njc2NTUKK3Z0IDAuMzYwMDMwIDAuNjY4MzYwCit2dCAwLjM2MjY5MSAwLjY2Njg0MgordnQgMC4zNjI2ODggMC42Njc2NTQKK3Z0IDAuMzY1NzQyIDAuNjY3NjU2Cit2dCAwLjM2NTQwNyAwLjY2ODM2MgordnQgMC4zNjc5MDkgMC42Njk3OTEKK3Z0IDAuMzY3MzI0IDAuNjcwMjEyCit2dCAwLjM2ODcxMCAwLjY3Mjk4NAordnQgMC4zNjgwNjIgMC42NzMxMDgKK3Z0IDAuMzY4NzEwIDAuNjgwMzkxCit2dCAwLjM2ODA2MiAwLjY4MDM5NQordnQgMC4zNjg3MTAgMC42ODc3NTYKK3Z0IDAuMzY4MDYyIDAuNjg3NjQxCit2dCAwLjM2NzkwNSAwLjY5MTA5MQordnQgMC4zNjczMjEgMC42OTA2NzgKK3Z0IDAuMzY1NzM3IDAuNjkzMjI0Cit2dCAwLjM2NTQwMiAwLjY5MjUyNwordnQgMC4zNjA2MTMgMC42OTE0NTgKK3Z0IDAuMzYyNjgyIDAuNjkyMDIyCit2dCAwLjM1OTA5OSAwLjY5MDA2OQordnQgMC4zNTg0MTUgMC42ODc2MDcKK3Z0IDAuMzU4NDE2IDAuNjgwMzk2Cit2dCAwLjM1ODQxNyAwLjY3MzA5NQordnQgMC4zNTkxMDcgMC42NzA4MDkKK3Z0IDAuMzYwNjA0IDAuNjY5NDAzCit2dCAwLjM2MjY4NiAwLjY2ODg3NQordnQgMC4zNjQ4NDMgMC42Njk0MDcKK3Z0IDAuMzY2MzM4IDAuNjcwNzgwCit2dCAwLjM2Njk3NyAwLjY3MzA3NAordnQgMC4zNjY5NzcgMC42ODAzOTgKK3Z0IDAuMzY2OTc3IDAuNjg3NjMxCit2dCAwLjM2NjMzNiAwLjY5MDExNAordnQgMC4zNjQ4MzkgMC42OTE0ODcKK3Z0IDAuMzY0MDA4IDAuNjkwMzA1Cit2dCAwLjM2MzY5OCAwLjY4NzU2NAordnQgMC4zNjQ4OTcgMC42ODk0MjMKK3Z0IDAuMzY1MzU1IDAuNjg3NTIzCit2dCAwLjM2MDUyNyAwLjY4OTM3MAordnQgMC4zNjAwMzkgMC42ODc0ODYKK3Z0IDAuMzYwMDM5IDAuNjgwMzk5Cit2dCAwLjM2MDA0MSAwLjY3MzE3NAordnQgMC4zNjE3NTQgMC42NzMwNzcKK3Z0IDAuMzYxNzU2IDAuNjgwMzk5Cit2dCAwLjM2MjY4NyAwLjY3MzA2OAordnQgMC4zNjI2ODYgMC42ODA0MDAKK3Z0IDAuMzYzNzAxIDAuNjczMDU4Cit2dCAwLjM2MzcwMCAwLjY4MDQwMAordnQgMC4zNjUzNTUgMC42NzMxMzgKK3Z0IDAuMzY1MzU1IDAuNjgwNDAwCit2dCAwLjM2MDUzNyAwLjY3MTUwNQordnQgMC4zNjE0NDAgMC42NzA1ODUKK3Z0IDAuMzYyNjg4IDAuNjcwMjQxCit2dCAwLjM2NDAxMiAwLjY3MDU5MQordnQgMC4zNjQ4OTkgMC42NzE0NzMKK3Z0IDAuMTY5MjEwIDAuNTQzMDA4Cit2dCAwLjE3NDE0NiAwLjUzNDU2NQordnQgMC4xNzY0MjIgMC41MzUxODIKK3Z0IDAuMTcwODY1IDAuNTQ0Njg2Cit2dCAwLjE2MDk4MyAwLjU0NzcyNwordnQgMC4xNjE1OTcgMC41NTAwMDIKK3Z0IDAuMTUxMjAzIDAuNTQ3NzI3Cit2dCAwLjE1MDU4NiAwLjU1MDAwMgordnQgMC4xNDI3NTkgMC41NDI3OTIKK3Z0IDAuMTQxMDgxIDAuNTQ0NDQ2Cit2dCAwLjEzODAzOSAwLjUzNDU2NwordnQgMC4xMzU3NjQgMC41MzUxODAKK3Z0IDAuMTM4MDM5IDAuNTI0Nzg4Cit2dCAwLjEzNTc2NCAwLjUyNDE3MQordnQgMC4xNDI5NzUgMC41MTYzNDUKK3Z0IDAuMTQxMzIxIDAuNTE0NjY3Cit2dCAwLjE1MTIwMiAwLjUxMTYyNgordnQgMC4xNTA1ODggMC41MDkzNTEKK3Z0IDAuMTYwOTgzIDAuNTExNjI2Cit2dCAwLjE2MTU5OSAwLjUwOTM1MQordnQgMC4xNjk0MjYgMC41MTY1NjEKK3Z0IDAuMTcxMTA1IDAuNTE0OTA3Cit2dCAwLjE3NDE0NiAwLjUyNDc4NgordnQgMC4xNzY0MjIgMC41MjQxNzMKK3Z0IDAuMTY4ODA5IDAuNTQyNjA1Cit2dCAwLjE3MzU5NiAwLjUzNDQxNgordnQgMC4xNzcwMTcgMC41MzUzNDMKK3Z0IDAuMTcxMjk4IDAuNTQ1MTI0Cit2dCAwLjE2MDgzNSAwLjU0NzE3OQordnQgMC4xNjE3NTQgMC41NTA1OTkKK3Z0IDAuMTUxMzQ4IDAuNTQ3MTc5Cit2dCAwLjE1MDQyMiAwLjU1MDU5OQordnQgMC4xNDMxNTggMC41NDIzOTIKK3Z0IDAuMTQwNjM5IDAuNTQ0ODgxCit2dCAwLjEzODU4MyAwLjUzNDQyMAordnQgMC4xMzUxNjMgMC41MzUzMzkKK3Z0IDAuMTM4NTg0IDAuNTI0OTM1Cit2dCAwLjEzNTE2MyAwLjUyNDAwOQordnQgMC4xNDMzNzEgMC41MTY3NDYKK3Z0IDAuMTQwODgyIDAuNTE0MjI4Cit2dCAwLjE1MTM0NSAwLjUxMjE3MgordnQgMC4xNTA0MjYgMC41MDg3NTMKK3Z0IDAuMTYwODMyIDAuNTEyMTcyCit2dCAwLjE2MTc1OCAwLjUwODc1MwordnQgMC4xNjkwMjIgMC41MTY5NTkKK3Z0IDAuMTcxNTQxIDAuNTE0NDcxCit2dCAwLjE3MzU5NiAwLjUyNDkzMQordnQgMC4xNzcwMTcgMC41MjQwMTMKK3Z0IDAuMjQ2OTM2IDAuNzMxOTc0Cit2dCAwLjI0NjkxNiAwLjcyMTAwMQordnQgMC4yNDg1MjYgMC43MjEwMDAKK3Z0IDAuMjQ4NTQ3IDAuNzMxOTc0Cit2dCAwLjI0NjkzNiAwLjcxMDEwNAordnQgMC4yNDg1NDcgMC43MTAxMDMKK3Z0IDAuMjQ2OTkxIDAuNzM5ODUyCit2dCAwLjI0ODYwMSAwLjczOTg1MgordnQgMC4wMDY5MjQgMC43NTM0OTgKK3Z0IDAuMDA2OTczIDAuNzY0MzE0Cit2dCAwLjAwNTM2MyAwLjc2NDMxNwordnQgMC4wMDUzMTQgMC43NTM1MDEKK3Z0IDAuMDA2OTI1IDAuNzQyNDU4Cit2dCAwLjAwNTMxNCAwLjc0MjQ2MQordnQgMC4wMDY5NzMgMC43MzQzODkKK3Z0IDAuMDA1MzYzIDAuNzM0MzkyCit2dCAwLjc4NzUwNyAwLjIxMjg1MgordnQgMC43ODc1MjcgMC4yMjM3NzgKK3Z0IDAuNzg1OTE3IDAuMjIzNzc4Cit2dCAwLjc4NTg5NyAwLjIxMjg1MgordnQgMC43ODc1MjcgMC4yMDE5MDcKK3Z0IDAuNzg1OTE3IDAuMjAxOTA2Cit2dCAwLjM4MTI3MSAwLjc0Mjg2NwordnQgMC4zODEzNDcgMC43MzQ5NjcKK3Z0IDAuMzgyOTU3IDAuNzM0OTYyCit2dCAwLjM4Mjg4MSAwLjc0Mjg2MQordnQgMC4zODEyNzAgMC43NTM4NDcKK3Z0IDAuMzgyODgwIDAuNzUzODQyCit2dCAwLjM4MTM0NyAwLjc2NDczNgordnQgMC4zODI5NTcgMC43NjQ3MzEKK3Z0IDAuMjQ2OTkxIDAuNzAyNDI1Cit2dCAwLjI0ODYwMSAwLjcwMjQyNQordnQgMC43OTgxNTQgMC4yMTEwNzAKK3Z0IDAuNzk4MTcxIDAuMjAxOTA2Cit2dCAwLjc5OTc4MSAwLjIwMTkwNwordnQgMC43OTk3NjUgMC4yMTEwNzAKK3Z0IDAuMDIwMjY4IDAuNzU2MDU5Cit2dCAwLjAyMDIwNSAwLjc2MjY1OQordnQgMC4wMTg1OTUgMC43NjI2NjQKK3Z0IDAuMDE4NjU4IDAuNzU2MDY0Cit2dCAwLjAyMDIwNCAwLjc3MTg1MQordnQgMC4wMTg1OTQgMC43NzE4NTcKK3Z0IDAuMDIwMjY4IDAuNzgwOTY3Cit2dCAwLjAxODY1OCAwLjc4MDk3MgordnQgMC4xNTQxODYgMC43Mjg0MjcKK3Z0IDAuMTU0MTQxIDAuNzM0ODQzCit2dCAwLjE1MjUzMCAwLjczNDg0MwordnQgMC4xNTI1NzYgMC43Mjg0MjcKK3Z0IDAuMTU0MTIzIDAuNzQzOTY1Cit2dCAwLjE1MjUxMyAwLjc0Mzk2NQordnQgMC4xNTQxNDEgMC43NTMxNTIKK3Z0IDAuMTUyNTMwIDAuNzUzMTUyCit2dCAwLjE1NDE4NiAwLjc1OTczNAordnQgMC4xNTI1NzYgMC43NTk3MzQKK3Z0IDAuMTAyNjM2IDAuNzgxMDkwCit2dCAwLjEwMjU5NSAwLjc3MjAzNgordnQgMC4xMDQyMDUgMC43NzIwMzMKK3Z0IDAuMTA0MjQ2IDAuNzgxMDg3Cit2dCAwLjEwMjU5NSAwLjc2Mjc5MwordnQgMC4xMDQyMDYgMC43NjI3OTAKK3Z0IDAuMTAyNjM2IDAuNzU2MDUyCit2dCAwLjEwNDI0NiAwLjc1NjA0OQordnQgMC43OTgxNzEgMC4yMjAyMTcKK3Z0IDAuNzk5NzgxIDAuMjIwMjE3Cit2dCAwLjYyMTI4NyAwLjAwNTMxMwordnQgMC42MzQxMjMgMC4wMDUzMTMKK3Z0IDAuNjM0MTIzIDAuMDA1NzA0Cit2dCAwLjYyMTI4NyAwLjAwNTcwNAordnQgMC42NDc1MTYgMC4wMDUzMTMKK3Z0IDAuNjU3MTYxIDAuMDA3MjQyCit2dCAwLjY1NzAwNiAwLjAwNzYxMAordnQgMC42NDc1MTYgMC4wMDU3MDQKK3Z0IDAuNjY0NzYzIDAuMDEyMzk1Cit2dCAwLjY2NDUwMSAwLjAxMjY4OQordnQgMC42Njk5MDUgMC4wMjAwMTYKK3Z0IDAuNjY5NTM2IDAuMDIwMTcwCit2dCAwLjY3MTc5NCAwLjAyOTI5MwordnQgMC42NzE0MDEgMC4wMjkzMTgKK3Z0IDAuNjcxNzk0IDAuMDM4NjYwCit2dCAwLjY3MTQwMSAwLjAzODY5MAordnQgMC42NzE3OTQgMC4wNDc4NjEKK3Z0IDAuNjcxNzk0IDAuMDUxMjUzCit2dCAwLjY3MTQwMSAwLjA1MTI1MgordnQgMC42NzE0MDEgMC4wNDc4NjEKK3Z0IDAuNjU2Njg0IDAuMDA4MzMyCit2dCAwLjY0NzUxNiAwLjAwNjUxNgordnQgMC42NjM5NzkgMC4wMTMzNTEKK3Z0IDAuNjY4ODIyIDAuMDIwNDY4Cit2dCAwLjY3MDY0MiAwLjAyOTMzNgordnQgMC42NzA2NDIgMC4wMzg3NDgKK3Z0IDAuNjcwNjQyIDAuMDUxMjUyCit2dCAwLjY3MDY0MiAwLjA0Nzg2MQordnQgMC4yMTA2NjYgMC40OTg1OTYKK3Z0IDAuMjEwNjY2IDAuNDg1NzYzCit2dCAwLjIxMDc3NCAwLjQ4NTc2NQordnQgMC4yMTA3NzQgMC40OTg1OTcKK3Z0IDAuMjEwNjY2IDAuNDcyMzc1Cit2dCAwLjIxMDY3OSAwLjQ2MjcyMwordnQgMC4yMTA3ODcgMC40NjI3NTgKK3Z0IDAuMjEwNzc0IDAuNDcyMzc2Cit2dCAwLjIxMDcxNSAwLjQ1NTE2MQordnQgMC4yMTA4MjMgMC40NTUyMjQKK3Z0IDAuODAzNTgyIDAuNzc1ODc2Cit2dCAwLjgwMzUxMyAwLjc2ODMwOAordnQgMC44MDM2MjIgMC43NjgyNzMKK3Z0IDAuODAzNjkwIDAuNzc1ODEzCit2dCAwLjgwMzQ4OCAwLjc1OTAzMQordnQgMC44MDM1OTcgMC43NTkwMjYKK3Z0IDAuODAzNDg4IDAuNzQ5NjY4Cit2dCAwLjgwMzU5NyAwLjc0OTY2MAordnQgMC44MDM0ODggMC43NDA0NjIKK3Z0IDAuODAzNDg4IDAuNzM3MDcxCit2dCAwLjgwMzU5NyAwLjczNzA2OQordnQgMC44MDM1OTcgMC43NDA0NjAKK3Z0IDAuNTk5Mjc4IDAuMDA1MzEzCit2dCAwLjU5OTI3OCAwLjAwNTcwNAordnQgMC41NjYxNTAgMC4wMDU3MDQKK3Z0IDAuNTY2MTUwIDAuMDA1MzEzCit2dCAwLjU5OTI3OCAwLjAwNjUxNgordnQgMC41NjYxNTAgMC4wMDY1MTYKK3Z0IDAuNTk5Mjc4IDAuMDI5MzM2Cit2dCAwLjU5OTI3OCAwLjAzODc0OAordnQgMC41NjYxNTAgMC4wMzg3NDgKK3Z0IDAuNTY2MTUwIDAuMDI5MzM4Cit2dCAwLjU2NjE1MCAwLjAyNTEzNQordnQgMC41OTkyNzggMC4wMjUxMzQKK3Z0IDAuMjEwNjY2IDAuNTIwNTk5Cit2dCAwLjIxMDc3NCAwLjUyMDYwMAordnQgMC4yMTA3NzQgMC41NTM3MTkKK3Z0IDAuMjEwNjY2IDAuNTUzNzE4Cit2dCAwLjYwMjQ0NyAwLjAxNjUwNgordnQgMC41OTkyNzggMC4wMTY0NjUKK3Z0IDAuNTk5Mjc4IDAuMDExMDU4Cit2dCAwLjYwMjQ0NyAwLjAxMTA1OAordnQgMC42MTUxODMgMC4wMDUzMTMKK3Z0IDAuNjE1MTgzIDAuMDA1NzA0Cit2dCAwLjYwMjQ0NyAwLjAwNTcwNAordnQgMC42MDI0NDggMC4wMDUzMTMKK3Z0IDAuNjE1MTgzIDAuMDA2NTE2Cit2dCAwLjYwMjQ0NyAwLjAwNjUxNgordnQgMC42MTUxODMgMC4wMjkzMzYKK3Z0IDAuNjE1MTgzIDAuMDM4NzQ4Cit2dCAwLjYwMjQ1MiAwLjAzODc0OAordnQgMC42MDI0NTIgMC4wMjkzMzYKK3Z0IDAuMjEwNjY2IDAuNTA0Njk5Cit2dCAwLjIxMDc3NCAwLjUwNDcwMAordnQgMC4yMTA3NzQgMC41MTc0MzIKK3Z0IDAuMjEwNjY2IDAuNTE3NDMxCit2dCAwLjYyODg2NSAwLjAyMDgxNAordnQgMC42MjEyOTAgMC4wMjA4MTEKK3Z0IDAuNjIxMjg3IDAuMDExMDU4Cit2dCAwLjYzMDM5NyAwLjAxNzEyMAordnQgMC41NjYxNTAgMC4wMTEwNTkKK3Z0IDAuNjE1MTgzIDAuMDExMDU4Cit2dCAwLjYwMjQ1MiAwLjAyNTEzNAordnQgMC41NjYxNTAgMC4wMTY0NzMKK3Z0IDAuNjIxMjg3IDAuMDA2NTE2Cit2dCAwLjYyMTI4NyAwLjAyOTMzNgordnQgMC42MjEyODcgMC4wMzg3NDgKK3Z0IDAuNjE1MTgzIDAuMDIwODExCit2dCAwLjYwMjQ0NyAwLjAxNzI4MwordnQgMC41OTkyNzggMC4wMTcyODUKK3Z0IDAuNTY2MTUwIDAuMDE3Mjg3Cit2dCAwLjU2NjE1MCAwLjAyNDMyOQordnQgMC41OTkyNzggMC4wMjQzMjYKK3Z0IDAuNjAyNDUyIDAuMDI0MzMyCit2dCAwLjYwNTMzMCAwLjAyMzg2NwordnQgMC42MDY1NzYgMC4wMjA4MTEKK3Z0IDAuNjA1MzMwIDAuMDE3NzU5Cit2dCAwLjYwNDc2NSAwLjAxODMyMAordnQgMC42MDQ3NTYgMC4wMjMzMDIKK3Z0IDAuNjA1Nzc5IDAuMDIwODExCit2dCAwLjYzMDc4MSAwLjAxNzUwNQordnQgMC42Mjk0MDkgMC4wMjA4MTQKK3Z0IDAuNjM0MDgxIDAuMDI5MzM2Cit2dCAwLjYzMDM5NyAwLjAyNDUwNgordnQgMC42MzQwOTEgMC4wMjYwMzcKK3Z0IDAuNjM0MDkxIDAuMDI1NDk0Cit2dCAwLjYzNzQwMCAwLjAyNDEyMgordnQgMC42Mzc3ODQgMC4wMjQ1MDYKK3Z0IDAuNjM4NzcyIDAuMDIwODEzCit2dCAwLjYzOTMxNSAwLjAyMDgxMwordnQgMC42MzQwOTEgMC4wMTU1ODkKK3Z0IDAuNjM0MDkxIDAuMDE2MTMzCit2dCAwLjYzNzc4NCAwLjAxNzEyMAordnQgMC42Mzc0MDAgMC4wMTc1MDUKK3Z0IDAuNjMwNzgxIDAuMDI0MTIyCit2dCAwLjYzNDEwMCAwLjAxMTA1OAordnQgMC42NDc1MTUgMC4wMTEwNDMKK3Z0IDAuNjQ3ODI4IDAuMDIwODkzCit2dCAwLjY2ODE1OCAwLjAyOTMzNgordnQgMC42NjY2OTQgMC4wMjA4OTIKK3Z0IDAuNjQ3ODI5IDAuMDI5MzM2Cit2dCAwLjYzNDEyMyAwLjAwNjUxNgordnQgMC42MzQwODEgMC4wMzg3NDgKK3Z0IDAuNjcxNDAxIDAuMDQ1Njg5Cit2dCAwLjY3MTc5NCAwLjA0NTY3MAordnQgMC42NzA2NDIgMC4wNDU3MjcKK3Z0IDAuNjQ3ODI5IDAuMDQzNTMzCit2dCAwLjY1NTkwOCAwLjA0MzUzMwordnQgMC42NTU5MDggMC4wNDU3MjcKK3Z0IDAuNjQ3ODI5IDAuMDQ1NzI3Cit2dCAwLjY2ODA3NCAwLjAzODc0OAordnQgMC42NjUyOTEgMC4wMzg3NDgKK3Z0IDAuODAzNTk3IDAuNzQyNjUyCit2dCAwLjgwMzQ4OCAwLjc0MjY1NwordnQgMC42NjgwOTEgMC4wNDc4NjEKK3Z0IDAuNjY4MDkxIDAuMDQ1NzI3Cit2dCAwLjY2ODA5MSAwLjA1MTI1MgordnQgMC42NjI4OTAgMC4wMjkzMzYKK3Z0IDAuNjYyODg4IDAuMDIwODk0Cit2dCAwLjY1NTkwOCAwLjAxMTA2NgordnQgMC42NjI5NDAgMC4wMTUxMzcKK3Z0IDAuNjU1OTA4IDAuMDIwODkwCit2dCAwLjY3MTQwMSAwLjA0MzQ4NAordnQgMC42NzE3OTQgMC4wNDM0NTkKK3Z0IDAuNjcwNjQyIDAuMDQzNTMzCit2dCAwLjgwMzU5NyAwLjc0NDg2MgordnQgMC44MDM0ODggMC43NDQ4NjgKK3Z0IDAuNTk5Mjc4IDAuMDQ1NzI3Cit2dCAwLjU2NjE1MCAwLjA0NTcyNwordnQgMC41NjYxNTAgMC4wNDM1MzMKK3Z0IDAuNTk5Mjc4IDAuMDQzNTMzCit2dCAwLjYxNTE4MyAwLjA0NTcyNwordnQgMC42MDI0NTIgMC4wNDU3MjcKK3Z0IDAuNjAyNDUyIDAuMDQzNTMzCit2dCAwLjYxNTE4MyAwLjA0MzUzMwordnQgMC42MjEyODcgMC4wNDU3MjcKK3Z0IDAuNjIxMjg3IDAuMDQzNTMzCit2dCAwLjYzNDA4MSAwLjA0NTcyNwordnQgMC42MzQwODEgMC4wNDM1MzMKK3Z0IDAuNjQ3ODI5IDAuMDM4NzQ4Cit2dCAwLjY1NTkwOCAwLjAzODc0OAordnQgMC42NjgwODIgMC4wNDM1MzMKK3Z0IDAuNjY1Mjg3IDAuMDQ1NzI3Cit2dCAwLjY2NTI3OSAwLjA0MzUzMwordnQgMC42NjI4ODggMC4wMzg3NDgKK3Z0IDAuNjYyODg5IDAuMDQzNTMzCit2dCAwLjY5Njg3MyAwLjcxNDk0MgordnQgMC42OTY4ODAgMC43MTcxNDEKK3Z0IDAuNjk2Njg3IDAuNzE3MTQxCit2dCAwLjY5NjY4MSAwLjcxNDk0MgordnQgMC42OTY4NzMgMC43MTE3NzQKK3Z0IDAuNjk2NjgxIDAuNzExNzc0Cit2dCAwLjY5Njg3MyAwLjY3ODY1MgordnQgMC42OTY2ODEgMC42Nzg2NTIKK3Z0IDAuNzA3NzYxIDAuNzExNjg3Cit2dCAwLjcwNzc2MSAwLjY3ODU2NwordnQgMC43MDc5NTQgMC42Nzg1NjcKK3Z0IDAuNzA3OTU0IDAuNzExNjg3Cit2dCAwLjcwNzc2MSAwLjcxNDg2MAordnQgMC43MDc5NTQgMC43MTQ4NjAKK3Z0IDAuNzA3NzY4IDAuNzE3MDYxCit2dCAwLjcwNzk2MSAwLjcxNzA2MQordnQgMC45MTI4NjIgMC42MjkzNTcKK3Z0IDAuOTEyODcxIDAuNjMxNjk1Cit2dCAwLjkxMjY3OCAwLjYzMTY5NQordnQgMC45MTI2NzAgMC42MjkzNTcKK3Z0IDAuOTEyODcxIDAuNjI2OTQ1Cit2dCAwLjkxMjY3OCAwLjYyNjk0NQordnQgMC42MDQ2NTAgMC4wMTg0MzQKK3Z0IDAuNjAyNDQ4IDAuMDE3NDM5Cit2dCAwLjU5OTI3OCAwLjAxNzQzNQordnQgMC41NjYxNTAgMC4wMTc0MzcKK3Z0IDAuNzA3NjExIDAuNjc4NTY1Cit2dCAwLjcwNzYxMSAwLjcxMTY4NQordnQgMC42MDI0NTIgMC4wMjQxNzcKK3Z0IDAuNjA0NjQxIDAuMDIzMTg4Cit2dCAwLjYwNTYxNyAwLjAyMDgxMQordnQgMC42NTU5MDggMC4wMjkzMzYKK3Z0IDAuNjYyODg5IDAuMDQ1NzI3Cit2dCAwLjUwNjMxMiAwLjAwNTcwNAordnQgMC40ODQ0NzEgMC4wMDU3MDQKK3Z0IDAuNDg0NDE5IDAuMDA1MzEzCit2dCAwLjUwNjMxMyAwLjAwNTMxMwordnQgMC40NzUyOTUgMC4wMDc2MjIKK3Z0IDAuNDc1MTQxIDAuMDA3MjU0Cit2dCAwLjQ2NzgwMiAwLjAxMjY3NwordnQgMC40Njc1MTkgMC4wMTIzOTYKK3Z0IDAuNDYyNzY0IDAuMDIwMTcwCit2dCAwLjQ2MjM5NSAwLjAyMDAxNgordnQgMC40NjA4OTggMC4wMjkzMjMKK3Z0IDAuNDYwNTA2IDAuMDI5Mjg2Cit2dCAwLjQ2MDg5OCAwLjAzODY5MAordnQgMC40NjA1MDYgMC4wMzg2NjEKK3Z0IDAuNDYwODk4IDAuMDUxMjUzCit2dCAwLjQ2MDUwNiAwLjA1MTI1MwordnQgMC40NjA1MDYgMC4wNDc4NjIKK3Z0IDAuNDYwODk4IDAuMDQ3ODYxCit2dCAwLjQ4NDQ3MSAwLjAwNjUxNgordnQgMC40NzU1OTQgMC4wMDgzMzYKK3Z0IDAuNDY4MzQzIDAuMDEzMjQxCit2dCAwLjQ2MzQ3OCAwLjAyMDQ2OQordnQgMC40NjE2NTcgMC4wMjkzMzcKK3Z0IDAuNDYxNjU3IDAuMDM4NzQ4Cit2dCAwLjQ2MTY1NyAwLjA0Nzg2MQordnQgMC40NjE2NTcgMC4wNTEyNTMKK3Z0IDAuMjEwNzc0IDAuNjEzNTQxCit2dCAwLjIxMDc3NCAwLjYzNTQyOAordnQgMC4yMTA2NjYgMC42MzU0MzkKK3Z0IDAuMjEwNjY2IDAuNjEzNTQwCit2dCAwLjIxMDc4NyAwLjY0NDcyOQordnQgMC4yMTA2NzkgMC42NDQ3NjEKK3Z0IDAuMjEwODIzIDAuNjUyNDE0Cit2dCAwLjIxMDcxNSAwLjY1MjQ3NQordnQgMC44MTQ0ODQgMC43NzU2MjEKK3Z0IDAuODE0Mzc3IDAuNzc1NTU3Cit2dCAwLjgxNDMzMyAwLjc2ODEzNgordnQgMC44MTQ0NDAgMC43NjgxNzMKK3Z0IDAuODE0MzE3IDAuNzU4OTQ1Cit2dCAwLjgxNDQyNCAwLjc1ODk1MgordnQgMC44MTQzMTcgMC43NDk1NzYKK3Z0IDAuODE0NDI0IDAuNzQ5NTg2Cit2dCAwLjgxNDMxNyAwLjczNjk5MwordnQgMC44MTQ0MjQgMC43MzY5OTYKK3Z0IDAuODE0NDI0IDAuNzQwMzg2Cit2dCAwLjgxNDMxNyAwLjc0MDM4MgordnQgMC41MzMwMjIgMC4wMDUzMTMKK3Z0IDAuNTMzMDIxIDAuMDA1NzA0Cit2dCAwLjUzMzAyMSAwLjAwNjUxNgordnQgMC41MzY1NzQgMC4wMjUxMzUKK3Z0IDAuNTM2NTczIDAuMDMwMjcyCit2dCAwLjUzMzAyMSAwLjAzMDI3MgordnQgMC41MzMwMjEgMC4wMjUxMzUKK3Z0IDAuMjEwNjY2IDAuNTg2ODM4Cit2dCAwLjIxMDc3NCAwLjU4NjgzOQordnQgMC41Mjk4NTIgMC4wMTY1MDYKK3Z0IDAuNTI5ODUyIDAuMDExMDU5Cit2dCAwLjUzMzAyMSAwLjAxMTA1OQordnQgMC41MzMwMjEgMC4wMTY0NjYKK3Z0IDAuNTIxMzYyIDAuMDA1MzEzCit2dCAwLjUyOTg1MiAwLjAwNTMxMwordnQgMC41Mjk4NTIgMC4wMDU3MDQKK3Z0IDAuNTIxMzYyIDAuMDA1NzA0Cit2dCAwLjUyOTg1MiAwLjAwNjUxNgordnQgMC41MjEzNjIgMC4wMDY1MTYKK3Z0IDAuMjEwNjY2IDAuNTk4NDk0Cit2dCAwLjIxMDY2NiAwLjU5MDAwNgordnQgMC4yMTA3NzQgMC41OTAwMDcKK3Z0IDAuMjEwNzc0IDAuNTk4NDk1Cit2dCAwLjUyMTM2MiAwLjAxMTA1OQordnQgMC41Mjk4NDggMC4wMzAyNzIKK3Z0IDAuNTI5ODQ4IDAuMDI1MTM1Cit2dCAwLjUwNjMxMiAwLjAwNjUxNgordnQgMC41MjEzNjIgMC4wMjkzMzYKK3Z0IDAuNTIxMzYyIDAuMDMzNjEyCit2dCAwLjUwNjMxOCAwLjAyOTMzNgordnQgMC41MDYzMDkgMC4wMjA4MTEKK3Z0IDAuNTIxMzYyIDAuMDIwODExCit2dCAwLjUwNjMxMiAwLjAxMTA1OQordnQgMC41Mjk4NTIgMC4wMTcyODMKK3Z0IDAuNTMzMDIxIDAuMDE3Mjg1Cit2dCAwLjU0MzQ3NSAwLjAyNTEzNQordnQgMC41NDM0NzUgMC4wMjQzMjcKK3Z0IDAuNTMzMDIxIDAuMDI0MzI2Cit2dCAwLjUyOTg0OCAwLjAyNDMzMgordnQgMC41MjY5NjkgMC4wMjM4NjcKK3Z0IDAuNTI1NzI0IDAuMDIwODExCit2dCAwLjUyNjk2OSAwLjAxNzc1OQordnQgMC41Mjc1MzUgMC4wMTgzMjAKK3Z0IDAuNTI2NTIxIDAuMDIwODExCit2dCAwLjUyNzU0NCAwLjAyMzMwMgordnQgMC40NjU2MDYgMC4wMjA3OTUKK3Z0IDAuNDY0MjQwIDAuMDI5MzM3Cit2dCAwLjUwNjMxOSAwLjAzODY5MgordnQgMC40ODQ1MDQgMC4wMzg2OTIKK3Z0IDAuNDg0NDcxIDAuMDI5MzM2Cit2dCAwLjQ4NDQ3MSAwLjAxMTA0MwordnQgMC40NjA1MDYgMC4wNDU2NzAKK3Z0IDAuNDYwODk4IDAuMDQ1Njg5Cit2dCAwLjQ2MTY1NyAwLjA0NTcyNwordnQgMC40ODQ0NzEgMC4wNDM1MzMKK3Z0IDAuNDg0NDcxIDAuMDQ1NzI3Cit2dCAwLjQ3NjM5MiAwLjA0NTcyNwordnQgMC40NzYzOTIgMC4wNDM1MzMKK3Z0IDAuNDY2NzE3IDAuMDM4NzQ4Cit2dCAwLjQ2NDIyNSAwLjAzODc0OAordnQgMC44MTQ0MjQgMC43NDI1ODAKK3Z0IDAuODE0MzE3IDAuNzQyNTcyCit2dCAwLjQ2NDIwOCAwLjA0NTcyNwordnQgMC40NjQyMDggMC4wNDc4NjEKK3Z0IDAuNDY0MjA4IDAuMDUxMjUzCit2dCAwLjQ2OTQyOSAwLjAyMDgwMwordnQgMC40Njk0MjkgMC4wMjkzMzYKK3Z0IDAuNDc2MzkyIDAuMDExMDY3Cit2dCAwLjQ2OTQ1OCAwLjAxNTEzNwordnQgMC40NzYzOTIgMC4wMjA1ODMKK3Z0IDAuNDYwNTA2IDAuMDQzNDYwCit2dCAwLjQ2MDg5OCAwLjA0MzQ4NAordnQgMC40NjE2NTcgMC4wNDM1MzMKK3Z0IDAuODE0NDI0IDAuNzQ0NzkwCit2dCAwLjgxNDMxNyAwLjc0NDc4MQordnQgMC41MzY1ODggMC4wNDM1MzMKK3Z0IDAuNTM2NTg4IDAuMDQ1NzI3Cit2dCAwLjUzMzAyMSAwLjA0NTcyNwordnQgMC41MzMwMjEgMC4wNDM1MzMKK3Z0IDAuNTIxMzYyIDAuMDQ1NzI3Cit2dCAwLjUyMTM2MiAwLjA0MzUzMwordnQgMC41Mjk4NDggMC4wNDM1MzMKK3Z0IDAuNTI5ODQ4IDAuMDQ1NzI3Cit2dCAwLjUwNjMxOCAwLjA0NTcyNwordnQgMC41MDYzMTggMC4wNDM1MzMKK3Z0IDAuNDc2MzkyIDAuMDM4NzQ4Cit2dCAwLjQ2NDIxNyAwLjA0MzUzMwordnQgMC40NjY2NTQgMC4wNDM1MzMKK3Z0IDAuNDY2NjkwIDAuMDQ1NzI3Cit2dCAwLjQ2OTQyMiAwLjA0MzUzMwordnQgMC40Njk0MzIgMC4wMzg3NDgKK3Z0IDAuNDg0NDcyIDAuMDIwODAwCit2dCAwLjY5Njg3MyAwLjY0MjM2MQordnQgMC42OTY2ODEgMC42NDIzNjEKK3Z0IDAuNjk2Njg3IDAuNjQwMTU2Cit2dCAwLjY5Njg4MCAwLjY0MDE1NgordnQgMC42OTY4NzMgMC42NDU1MzAKK3Z0IDAuNjk2NjgxIDAuNjQ1NTMwCit2dCAwLjcwNzk1NCAwLjY0NTQ0OAordnQgMC43MDc5NTQgMC42NDg5OTkKK3Z0IDAuNzA3NzYxIDAuNjQ4OTk5Cit2dCAwLjcwNzc2MSAwLjY0NTQ0OAordnQgMC43MDc3NjEgMC42NDIyNzUKK3Z0IDAuNzA3OTU0IDAuNjQyMjc1Cit2dCAwLjcwNzc2OCAwLjY0MDA5OQordnQgMC43MDc5NjEgMC42NDAwOTkKK3Z0IDAuOTEyNjMwIDAuNzA2NjE2Cit2dCAwLjkxMjgyMiAwLjcwNjYxNgordnQgMC45MTI4MzUgMC43MDg5NzgKK3Z0IDAuOTEyNjQzIDAuNzA4OTc4Cit2dCAwLjkxMjY0MyAwLjcwNDIyNAordnQgMC45MTI4MzUgMC43MDQyMjQKK3Z0IDAuNTI5ODUyIDAuMDE3NDM5Cit2dCAwLjUyNzY1MCAwLjAxODQzNAordnQgMC41MzMwMjIgMC4wMTc0MzUKK3Z0IDAuNzA3NjExIDAuNjU1ODk3Cit2dCAwLjcwNzc2MSAwLjY1NTg5OAordnQgMC41Mjk4NDggMC4wMjQxNzcKK3Z0IDAuNzA3NjExIDAuNjQ1NDQ2Cit2dCAwLjUyNzY1OSAwLjAyMzE4OQordnQgMC41MjY2ODIgMC4wMjA4MTEKK3Z0IDAuNDc2MzkyIDAuMDI5MzM2Cit2dCAwLjQ2OTQxNiAwLjA0NTcyNwordnQgMC40NjY2OTAgMC4wNDc4NjEKK3Z0IDAuNDY0MjA4IDAuMjIyMTQwCit2dCAwLjQ2NDIwOCAwLjEzNjY5NgordnQgMC40NjY2OTAgMC4xMzY2OTYKK3Z0IDAuNDY2NjkwIDAuMjIyMTQwCit2dCAwLjY3MTc5MyAwLjEzNjY5NwordnQgMC42NzE0MDEgMC4xMzY2OTYKK3Z0IDAuNjcwNjQyIDAuMTM2Njk2Cit2dCAwLjgwMzQ4OCAwLjY1MTYzNwordnQgMC44MDM1OTcgMC42NTE2MzUKK3Z0IDAuNjY4MDkxIDAuMTM2Njk2Cit2dCAwLjY2NTI4NyAwLjEzNjY5NgordnQgMC42NjUyODcgMC4wNTEyNTIKK3Z0IDAuNDYwODk4IDAuMTM2Njk2Cit2dCAwLjQ2MDUwNiAwLjEzNjY5NwordnQgMC40NjE2NTggMC4xMzY2OTYKK3Z0IDAuODE0MzE3IDAuNjUxNjEwCit2dCAwLjgxNDQyNCAwLjY1MTYxNAordnQgMC40NjY2OTAgMC4wNTEyNTMKK3Z0IDAuNTQzNDc1IDAuMDQzNTMzCit2dCAwLjU0MzQ3NSAwLjAzODc0OAordnQgMC41MjEzNjIgMC4wMzg3NDgKK3Z0IDAuNTI5ODQ4IDAuMDM4NzQ4Cit2dCAwLjUzMzAyMSAwLjAzODc0OAordnQgMC42NjUyODcgMC4wNDc4NjEKK3Z0IDAuNjIxMjg3IDAuNDM4OTE2Cit2dCAwLjYyMTI4NyAwLjQzODUyMwordnQgMC42MzQxMjMgMC40Mzg1MjMKK3Z0IDAuNjM0MTIzIDAuNDM4OTE2Cit2dCAwLjY0NzgyOSAwLjQzODkxNgordnQgMC42NDc4MjkgMC40Mzg1MjMKK3Z0IDAuNjU2OTgzIDAuNDM2NjYxCit2dCAwLjY1NzEzNyAwLjQzNzAzMAordnQgMC42NjQ1MDMgMC40MzE1ODUKK3Z0IDAuNjY0NzYyIDAuNDMxODg3Cit2dCAwLjY2OTUzNiAwLjQyNDExMAordnQgMC42Njk5MDUgMC40MjQyNjUKK3Z0IDAuNjcxNDAxIDAuNDE0OTQ3Cit2dCAwLjY3MTc5MyAwLjQxNDk0OAordnQgMC42NzE0MDEgMC40MDU1OTAKK3Z0IDAuNjcxNzk0IDAuNDA1NjIwCit2dCAwLjY3MTc5NCAwLjM5NjQyMAordnQgMC42NzE0MDEgMC4zOTY0MTkKK3Z0IDAuNjcxNDAxIDAuMzkzMzg5Cit2dCAwLjY3MTc5MyAwLjM5MzM5MAordnQgMC42NDc4MjkgMC40Mzc3NjQKK3Z0IDAuNjU2Njg0IDAuNDM1OTQ3Cit2dCAwLjY2Mzk1NyAwLjQzMTAzOQordnQgMC42Njg4MjIgMC40MjM4MTEKK3Z0IDAuNjcwNjQyIDAuNDE0OTQ5Cit2dCAwLjY3MDY0MiAwLjQwNTUzMgordnQgMC42NzA2NDIgMC4zOTY0MTkKK3Z0IDAuNjcwNjQyIDAuMzkzMzg5Cit2dCAwLjIyMTU1OCAwLjQ5ODcxMQordnQgMC4yMjE0NTEgMC40OTg3MTEKK3Z0IDAuMjIxNDUxIDAuNDg1ODc4Cit2dCAwLjIyMTU1OCAwLjQ4NTg3OAordnQgMC4yMjE1NTggMC40NzIxNzUKK3Z0IDAuMjIxNDUxIDAuNDcyMTc1Cit2dCAwLjIyMTQ2MyAwLjQ2Mjg2MgordnQgMC4yMjE1NzAgMC40NjI4MjgKK3Z0IDAuMjIxNDk3IDAuNDU1MjIzCit2dCAwLjIyMTYwNCAwLjQ1NTE2MQordnQgMC44MDM1ODIgMC4zNTYzMDgKK3Z0IDAuODAzNjkwIDAuMzU2MzY5Cit2dCAwLjgwMzYyMiAwLjM2NDA3MQordnQgMC44MDM1MTMgMC4zNjQwMzgKK3Z0IDAuODAzNTk3IDAuMzczNDE2Cit2dCAwLjgwMzQ4OCAwLjM3MzQxNwordnQgMC44MDM1OTcgMC4zODI3NDIKK3Z0IDAuODAzNDg4IDAuMzgyNzM3Cit2dCAwLjgwMzQ4OCAwLjM5MTk0MwordnQgMC44MDM1OTcgMC4zOTE5NDIKK3Z0IDAuODAzNTk3IDAuMzk0OTcyCit2dCAwLjgwMzQ4OCAwLjM5NDk3MwordnQgMC41OTkyNzggMC40Mzg5MTYKK3Z0IDAuNTY2MTUwIDAuNDM4OTE2Cit2dCAwLjU2NjE1MCAwLjQzODUyMwordnQgMC41OTkyNzggMC40Mzg1MjMKK3Z0IDAuNTY2MTUwIDAuNDM3NzY0Cit2dCAwLjU5OTI3OCAwLjQzNzc2NAordnQgMC41OTkyNzggMC40MTQ5NDkKK3Z0IDAuNTY2MTUwIDAuNDE0OTQ5Cit2dCAwLjU2NjE1MCAwLjQwNTUzMgordnQgMC41OTkyNzggMC40MDU1MzIKK3Z0IDAuNTk5Mjc4IDAuNDE5MTQ1Cit2dCAwLjU2NjE1MCAwLjQxOTE0NQordnQgMC4yMjE1NTggMC41MjA3MTYKK3Z0IDAuMjIxNTU4IDAuNTUzODM4Cit2dCAwLjIyMTQ1MSAwLjU1MzgzOAordnQgMC4yMjE0NTEgMC41MjA3MTYKK3Z0IDAuNjAyNDQ3IDAuNDI3Nzc0Cit2dCAwLjYwMjQ0NyAwLjQzMzIyMQordnQgMC41OTkyNzggMC40MzMyMjEKK3Z0IDAuNTk5Mjc4IDAuNDI3ODE0Cit2dCAwLjYxNTE4MyAwLjQzODkxNgordnQgMC42MDI0NDggMC40Mzg5MTYKK3Z0IDAuNjAyNDQ3IDAuNDM4NTIzCit2dCAwLjYxNTE4MyAwLjQzODUyMwordnQgMC42MDI0NDcgMC40Mzc3NjQKK3Z0IDAuNjE1MTgzIDAuNDM3NzY0Cit2dCAwLjYxNTE4MyAwLjQxNDk0OQordnQgMC42MDI0NTIgMC40MTQ5NDkKK3Z0IDAuNjAyNDUyIDAuNDA1NTMyCit2dCAwLjYxNTE4MyAwLjQwNTUzMgordnQgMC4yMjE1NTggMC41MDQ4MTUKK3Z0IDAuMjIxNTU4IDAuNTE3NTQ3Cit2dCAwLjIyMTQ1MSAwLjUxNzU0NwordnQgMC4yMjE0NTEgMC41MDQ4MTQKK3Z0IDAuNTY2MTUwIDAuNDMzMjIxCit2dCAwLjYxNTE4MyAwLjQzMzIyMQordnQgMC42MDI0NTIgMC40MTkxNDUKK3Z0IDAuNTY2MTUwIDAuNDI3ODA3Cit2dCAwLjYyMTI4NyAwLjQzNzc2NAordnQgMC42MjEyODcgMC40MTQ5NDkKK3Z0IDAuNjIxMjg3IDAuNDA1NTMyCit2dCAwLjYyMTI5MCAwLjQyMzQ2OQordnQgMC42MTUxODMgMC40MjM0NjkKK3Z0IDAuNjIxMjg3IDAuNDMzMjIxCit2dCAwLjYwMjQ0NyAwLjQyNjk5NwordnQgMC41OTkyNzggMC40MjY5OTUKK3Z0IDAuNTY2MTUwIDAuNDI2OTkzCit2dCAwLjU2NjE1MCAwLjQxOTk1MQordnQgMC41OTkyNzggMC40MTk5NTQKK3Z0IDAuNjAyNDUyIDAuNDE5OTQ4Cit2dCAwLjYwNjU3NiAwLjQyMzQ2OQordnQgMC42MDUzMzAgMC40MjA0MTMKK3Z0IDAuNjA1MzMwIDAuNDI2NTIxCit2dCAwLjYwNDc2NSAwLjQyNTk2MAordnQgMC42MDU3NzkgMC40MjM0NjkKK3Z0IDAuNjA0NzU2IDAuNDIwOTc4Cit2dCAwLjY2NjY5NCAwLjQyMzM4NwordnQgMC42NjgwNzMgMC40MTQ5NDkKK3Z0IDAuNjM0MTIzIDAuNDM3NzY0Cit2dCAwLjYzNDA4MSAwLjQxNDk0OQordnQgMC42MzQwODEgMC40MDU1MzIKK3Z0IDAuNjM0MTAwIDAuNDMzMjIxCit2dCAwLjY3MTc5NCAwLjM5ODYxMQordnQgMC42NzE0MDEgMC4zOTg1OTEKK3Z0IDAuNjcwNjQyIDAuMzk4NTUzCit2dCAwLjY0NzgyOSAwLjQwMDc0NwordnQgMC42NDc4MjkgMC4zOTg1NTMKK3Z0IDAuNjU1OTA4IDAuMzk4NTUzCit2dCAwLjY1NTkwOCAwLjQwMDc0NwordnQgMC42NjUyOTEgMC40MDU1MzIKK3Z0IDAuNjY4MDc0IDAuNDA1NTMyCit2dCAwLjgwMzQ4OCAwLjM4OTc0OAordnQgMC44MDM1OTcgMC4zODk3NTEKK3Z0IDAuNjY4MDkxIDAuMzk4NTUzCit2dCAwLjY2ODA5MSAwLjM5NjQxOQordnQgMC42NjgwOTEgMC4zOTMzODkKK3Z0IDAuNjYyODg4IDAuNDIzMzg3Cit2dCAwLjY2Mjg5MCAwLjQxNDk0OQordnQgMC42NTU5MDggMC40MzMyMTMKK3Z0IDAuNjYyOTQwIDAuNDI5MTQzCit2dCAwLjY1NTkwOCAwLjQyMzM4OAordnQgMC42NzE3OTQgMC40MDA4MjEKK3Z0IDAuNjcxNDAxIDAuNDAwNzk2Cit2dCAwLjY3MDY0MiAwLjQwMDc0NwordnQgMC44MDM0ODggMC4zODc1MzcKK3Z0IDAuODAzNTk3IDAuMzg3NTQxCit2dCAwLjU5OTI3OCAwLjM5ODU1MwordnQgMC41OTkyNzggMC40MDA3NDcKK3Z0IDAuNTY2MTUwIDAuNDAwNzQ3Cit2dCAwLjU2NjE1MCAwLjM5ODU1MwordnQgMC42MTUxODMgMC4zOTg1NTMKK3Z0IDAuNjE1MTgzIDAuNDAwNzQ3Cit2dCAwLjYwMjQ1MiAwLjQwMDc0NwordnQgMC42MDI0NTIgMC4zOTg1NTMKK3Z0IDAuNjIxMjg3IDAuMzk4NTUzCit2dCAwLjYyMTI4NyAwLjQwMDc0NwordnQgMC42MzQwODEgMC40MDA3NDcKK3Z0IDAuNjM0MDgxIDAuMzk4NTUzCit2dCAwLjY0NzgyOSAwLjQwNTUzMgordnQgMC42NTU5MDggMC40MDU1MzIKK3Z0IDAuNjY1Mjg3IDAuMzk4NTUzCit2dCAwLjY2ODA4MiAwLjQwMDc0NwordnQgMC42NjUyNzkgMC40MDA3NDcKK3Z0IDAuNjYyODg5IDAuNDAwNzQ3Cit2dCAwLjY2Mjg4OCAwLjQwNTUzMgordnQgMC42MzQwOTAgMC40MjM0MzAKK3Z0IDAuMDYzMzQ2IDAuNjQxOTQ2Cit2dCAwLjA2MzE1NCAwLjY0MTk0NgordnQgMC4wNjMxNDcgMC42Mzk3MzEKK3Z0IDAuMDYzMzQwIDAuNjM5NzMxCit2dCAwLjA2MzM0NyAwLjY0NTExNAordnQgMC4wNjMxNTQgMC42NDUxMTQKK3Z0IDAuMDYzMzQ3IDAuNjc4MjMzCit2dCAwLjA2MzE1NCAwLjY3ODIzMwordnQgMC43MTg0MjcgMC41MjExNTAKK3Z0IDAuNzE4MjM0IDAuNTIxMTUwCit2dCAwLjcxODIzNCAwLjQ4ODAyOAordnQgMC43MTg0MjcgMC40ODgwMjgKK3Z0IDAuNzE4NDI3IDAuNTI0MzI0Cit2dCAwLjcxODIzNCAwLjUyNDMyNAordnQgMC43MTg0MzMgMC41MjY1MDkKK3Z0IDAuNzE4MjQxIDAuNTI2NTA5Cit2dCAwLjkxMjgzNiAwLjE4NTczOAordnQgMC45MTI2NDMgMC4xODU3MzgKK3Z0IDAuOTEyNjUxIDAuMTgzMzI2Cit2dCAwLjkxMjg0NCAwLjE4MzMyNgordnQgMC45MTI4NDQgMC4xODgwNzcKK3Z0IDAuOTEyNjUxIDAuMTg4MDc3Cit2dCAwLjYwMjQ0OCAwLjQyNjg0MgordnQgMC42MDQ2NTAgMC40MjU4NDcKK3Z0IDAuMDYzNDk3IDAuNjQxOTQ4Cit2dCAwLjA2MzQ5NyAwLjY0NTExNgordnQgMC41OTkyNzggMC40MjY4NDYKK3Z0IDAuMDYzNDk3IDAuNjc4MjM1Cit2dCAwLjU5OTI3OCAwLjQyMDEwNAordnQgMC41NjYxNTAgMC40MjAxMDEKK3Z0IDAuNjAyNDUyIDAuNDIwMTA0Cit2dCAwLjYwNDY0MSAwLjQyMTA5MgordnQgMC42MDU2MTcgMC40MjM0NzAKK3Z0IDAuNjQ3ODI4IDAuNDMzMjM3Cit2dCAwLjY0NzgyOCAwLjQyMzM4NwordnQgMC42NDc4MjkgMC40MTQ5NDkKK3Z0IDAuNjU1OTA4IDAuNDE0OTQ5Cit2dCAwLjY2Mjg4OSAwLjM5ODU1MwordnQgMC41MDYzMTIgMC40Mzg1MjMKK3Z0IDAuNTA2MzEzIDAuNDM4OTE2Cit2dCAwLjQ4NDM2NCAwLjQzODkxNgordnQgMC40ODQ0MjcgMC40Mzg1MjMKK3Z0IDAuNDc1MTYzIDAuNDM3MDMxCit2dCAwLjQ3NTMxNyAwLjQzNjY2MQordnQgMC40Njc0NzQgMC40MzE4ODYKK3Z0IDAuNDY3NzQ3IDAuNDMxNTk0Cit2dCAwLjQ2MjM4NiAwLjQyNDI2MQordnQgMC40NjI3NTUgMC40MjQxMDYKK3Z0IDAuNDYwNTA2IDAuNDE0OTUyCit2dCAwLjQ2MDg5OCAwLjQxNDk1MQordnQgMC40NjA1MDYgMC40MDU2MjEKK3Z0IDAuNDYwODk4IDAuNDA1NTkwCit2dCAwLjQ2MDg5OCAwLjM5MzM5MAordnQgMC40NjA4OTggMC4zOTY0MTkKK3Z0IDAuNDYwNTA2IDAuMzk2NDIwCit2dCAwLjQ2MDUwNiAwLjM5MzM5MAordnQgMC40NzU2MTYgMC40MzU5NDgKK3Z0IDAuNDg0NDcxIDAuNDM3NzY0Cit2dCAwLjQ2ODMwMSAwLjQzMTAzOQordnQgMC40NjM0NjkgMC40MjM4MDcKK3Z0IDAuNDYxNjU3IDAuNDE0OTUwCit2dCAwLjQ2MTY1NyAwLjQwNTUzMgordnQgMC40NjE2NTcgMC4zOTY0MTkKK3Z0IDAuNDYxNjU3IDAuMzkzMzkwCit2dCAwLjIyMTQ1MSAwLjYxMzY2NAordnQgMC4yMjE1NTggMC42MTM2NjQKK3Z0IDAuMjIxNTU4IDAuNjM1NjE0Cit2dCAwLjIyMTQ1MSAwLjYzNTYwOAordnQgMC4yMjE1NzAgMC42NDQ4MzYKK3Z0IDAuMjIxNDYzIDAuNjQ0ODAyCit2dCAwLjIyMTYwNCAwLjY1MjUzNAordnQgMC4yMjE0OTcgMC42NTI0NzIKK3Z0IDAuODE0NDg0IDAuMzU2MzA4Cit2dCAwLjgxNDQ0MSAwLjM2NDE1MAordnQgMC44MTQzMzQgMC4zNjQxODEKK3Z0IDAuODE0Mzc3IDAuMzU2MzY4Cit2dCAwLjgxNDQyNSAwLjM3MzU1NwordnQgMC44MTQzMTggMC4zNzM1NTQKK3Z0IDAuODE0MzE4IDAuMzgyODc5Cit2dCAwLjgxNDQyNSAwLjM4Mjg3NgordnQgMC44MTQzMTggMC4zOTUxMDEKK3Z0IDAuODE0MzE4IDAuMzkyMDczCit2dCAwLjgxNDQyNSAwLjM5MjA3NgordnQgMC44MTQ0MjUgMC4zOTUxMDQKK3Z0IDAuNTMzMDIyIDAuNDM4OTE2Cit2dCAwLjUzMzAyMSAwLjQzODUyMwordnQgMC41MzMwMjEgMC40Mzc3NjQKK3Z0IDAuNTQzNDc1IDAuNDE0OTUwCit2dCAwLjU0MzQ3NSAwLjQwNTUzMgordnQgMC41MzMwMjEgMC40MTQ5NTAKK3Z0IDAuNTM2NTg4IDAuNDE0OTUwCit2dCAwLjUzNjU4OCAwLjQxOTE0NgordnQgMC41MzMwMjEgMC40MTkxNDYKK3Z0IDAuMjIxNTU4IDAuNTg2OTYwCit2dCAwLjIyMTQ1MSAwLjU4Njk2MAordnQgMC41Mjk4NTIgMC40Mjc3NzQKK3Z0IDAuNTMzMDIxIDAuNDI3ODE1Cit2dCAwLjUzMzAyMSAwLjQzMzIyMgordnQgMC41Mjk4NTIgMC40MzMyMjIKK3Z0IDAuNTIxMzYyIDAuNDM4OTE2Cit2dCAwLjUyMTM2MiAwLjQzODUyMwordnQgMC41Mjk4NTIgMC40Mzg1MjMKK3Z0IDAuNTI5ODUyIDAuNDM4OTE2Cit2dCAwLjUyMTM2MiAwLjQzNzc2NAordnQgMC41Mjk4NTIgMC40Mzc3NjQKK3Z0IDAuNTI5ODQ4IDAuNDA1NTMyCit2dCAwLjUyOTg0OCAwLjQxNDk1MAordnQgMC41MjEzNjIgMC40MTQ5NTAKK3Z0IDAuNTIxMzYyIDAuNDA1NTMyCit2dCAwLjIyMTU1OCAwLjU5ODYxNwordnQgMC4yMjE0NTEgMC41OTg2MTcKK3Z0IDAuMjIxNDUxIDAuNTkwMTI5Cit2dCAwLjIyMTU1OCAwLjU5MDEyOQordnQgMC41MjEzNjIgMC40MzMyMjIKK3Z0IDAuNTMzMDIxIDAuNDA1NTMyCit2dCAwLjUyOTg0OCAwLjQxOTE0NgordnQgMC41MDYzMTIgMC40Mzc3NjQKK3Z0IDAuNTA2MzEyIDAuNDE0OTUwCit2dCAwLjUwNjMxMiAwLjQwNTUzMgordnQgMC41MDYzMDkgMC40MjM0NjkKK3Z0IDAuNTIxMzYyIDAuNDIzNDY5Cit2dCAwLjUwNjMxMiAwLjQzMzIyMgordnQgMC41Mjk4NTIgMC40MjY5OTcKK3Z0IDAuNTMzMDIxIDAuNDI2OTk1Cit2dCAwLjU0MzQ3NSAwLjQxOTk1MwordnQgMC41NDM0NzUgMC40MTkxNDYKK3Z0IDAuNTMzMDIxIDAuNDE5OTU0Cit2dCAwLjUyOTg0OCAwLjQxOTk0OAordnQgMC41MjY5NjkgMC40MjA0MTMKK3Z0IDAuNTI1NzI0IDAuNDIzNDY5Cit2dCAwLjUyNjk2OSAwLjQyNjUyMQordnQgMC41Mjc1MzUgMC40MjU5NjAKK3Z0IDAuNTI3NTQ0IDAuNDIwOTc4Cit2dCAwLjUyNjUyMSAwLjQyMzQ2OQordnQgMC40NjQyNDAgMC40MTQ5NTAKK3Z0IDAuNDY1NjA2IDAuNDIzNTI2Cit2dCAwLjQ4NDQ3MSAwLjQxNDk1MAordnQgMC40ODQ0NzEgMC40MDU1MzIKK3Z0IDAuNDg0NDcxIDAuNDMzMjM3Cit2dCAwLjQ2MDg5OCAwLjM5ODU5MQordnQgMC40NjA1MDYgMC4zOTg2MTEKK3Z0IDAuNDYxNjU3IDAuMzk4NTUzCit2dCAwLjQ4NDQ3MSAwLjQwMDc0NwordnQgMC40NzYzOTIgMC40MDA3NDcKK3Z0IDAuNDc2MzkyIDAuMzk4NTUzCit2dCAwLjQ4NDQ3MSAwLjM5ODU1MwordnQgMC40NjQyMjUgMC40MDU1MzIKK3Z0IDAuNDY2NzE3IDAuNDA1NTMyCit2dCAwLjgxNDMxOCAwLjM4OTg4MwordnQgMC44MTQ0MjUgMC4zODk4ODIKK3Z0IDAuNDY0MjA4IDAuMzk2NDE5Cit2dCAwLjQ2NDIwOCAwLjM5ODU1MwordnQgMC40NjQyMDggMC4zOTMzOTAKK3Z0IDAuNDY5NDUzIDAuNDE0OTUwCit2dCAwLjQ2OTQyOSAwLjQyMzUyNAordnQgMC40NzYzOTIgMC40MzMyMTQKK3Z0IDAuNDY5NDU4IDAuNDI5MTQzCit2dCAwLjQ3NjM5MiAwLjQyMzU2NgordnQgMC40NjA4OTggMC40MDA3OTYKK3Z0IDAuNDYwNTA2IDAuNDAwODIyCit2dCAwLjQ2MTY1NyAwLjQwMDc0NwordnQgMC44MTQzMTggMC4zODc2NzQKK3Z0IDAuODE0NDI1IDAuMzg3NjcyCit2dCAwLjUzMzAyMSAwLjM5ODU1MwordnQgMC41MzY1ODggMC4zOTg1NTMKK3Z0IDAuNTM2NTg4IDAuNDAwNzQ3Cit2dCAwLjUzMzAyMSAwLjQwMDc0NwordnQgMC41MjEzNjIgMC4zOTg1NTMKK3Z0IDAuNTI5ODQ4IDAuMzk4NTUzCit2dCAwLjUyOTg0OCAwLjQwMDc0NwordnQgMC41MjEzNjIgMC40MDA3NDcKK3Z0IDAuNTA2MzEyIDAuMzk4NTUzCit2dCAwLjUwNjMxMiAwLjQwMDc0NwordnQgMC40NzYzOTIgMC40MDU1MzIKK3Z0IDAuNDY2NjkwIDAuMzk4NTUzCit2dCAwLjQ2NjY1NCAwLjQwMDc0NwordnQgMC40NjQyMTcgMC40MDA3NDcKK3Z0IDAuNDY5NDIyIDAuNDAwNzQ3Cit2dCAwLjQ2OTQzMiAwLjQwNTUzMgordnQgMC40ODQ0NzIgMC40MjM1MjUKK3Z0IDAuMDYzMzQ2IDAuNzE0NTIxCit2dCAwLjA2MzM0MCAwLjcxNjcxMAordnQgMC4wNjMxNDcgMC43MTY3MTAKK3Z0IDAuMDYzMTU0IDAuNzE0NTIxCit2dCAwLjA2MzM0NyAwLjcxMTM1MwordnQgMC4wNjMxNTQgMC43MTEzNTMKK3Z0IDAuNzE4NDI3IDAuNDU4NDczCit2dCAwLjcxODIzNCAwLjQ1ODQ3MwordnQgMC43MTgyMzQgMC40NTQ5MDYKK3Z0IDAuNzE4NDI3IDAuNDU0OTA2Cit2dCAwLjcxODQyNyAwLjQ1MTczMwordnQgMC43MTgyMzQgMC40NTE3MzMKK3Z0IDAuNzE4NDMzIDAuNDQ5NTQxCit2dCAwLjcxODI0MSAwLjQ0OTU0MQordnQgMC45MTI1NjAgMC42NTQwNzEKK3Z0IDAuOTEyNTczIDAuNjUxNjc5Cit2dCAwLjkxMjc2NiAwLjY1MTY3OQordnQgMC45MTI3NTMgMC42NTQwNzEKK3Z0IDAuOTEyNTczIDAuNjU2NDMyCit2dCAwLjkxMjc2NiAwLjY1NjQzMgordnQgMC41Mjc2NTAgMC40MjU4NDcKK3Z0IDAuNTI5ODUyIDAuNDI2ODQyCit2dCAwLjUzMzAyMiAwLjQyNjg0NgordnQgMC4wNjM0OTcgMC43MTEzNTUKK3Z0IDAuMDYzNDk3IDAuNzE0NTIzCit2dCAwLjU0MzQ3NSAwLjQyMDEwMwordnQgMC41MzMwMjIgMC40MjAxMDQKK3Z0IDAuNTI5ODQ4IDAuNDIwMTA0Cit2dCAwLjUyNzY1OSAwLjQyMTA5MwordnQgMC41MjY2ODIgMC40MjM0NzAKK3Z0IDAuNDc2MzkyIDAuNDE0OTUwCit2dCAwLjQ2OTQxNiAwLjM5ODU1MwordnQgMC40NjY2OTAgMC4zOTY0MTkKK3Z0IDAuNDY2NjkwIDAuMzA3NzY1Cit2dCAwLjQ2NDIwOCAwLjMwNzc2NQordnQgMC42NzE0MDEgMC4zMDc3NjQKK3Z0IDAuNjcxNzkzIDAuMzA3NzY1Cit2dCAwLjY3MDY0MiAwLjMwNzc2NAordnQgMC44MDM1OTcgMC40ODA1ODYKK3Z0IDAuODAzNDg4IDAuNDgwNTg4Cit2dCAwLjY2ODA5MSAwLjMwNzc2NAordnQgMC42NjUyODcgMC4zOTMzODkKK3Z0IDAuNjY1Mjg3IDAuMzA3NzY0Cit2dCAwLjQ2MDUwNiAwLjMwNzc2NQordnQgMC40NjA4OTggMC4zMDc3NjUKK3Z0IDAuNDYxNjU4IDAuMzA3NzY1Cit2dCAwLjgxNDQyNCAwLjQ4MDY2NwordnQgMC44MTQzMTggMC40ODA2NjQKK3Z0IDAuNDY2NjkwIDAuMzkzMzkwCit2dCAwLjU0MzQ3NSAwLjQwMDc0NwordnQgMC42NjUyODcgMC4zOTY0MTkKK3Z0IDAuNjcxNDAxIDAuMjIyMTQwCit2dCAwLjY3MTc5MyAwLjIyMjE0MAordnQgMC42NzA2NDIgMC4yMjIxNDAKK3Z0IDAuODAzNTk3IDAuNTY2MjAxCit2dCAwLjgwMzQ4OCAwLjU2NjIwMwordnQgMC42NjgwOTEgMC4yMjIxNDAKK3Z0IDAuNjY1Mjg3IDAuMjIyMTQwCit2dCAwLjQ2MDUwNiAwLjIyMjE0MQordnQgMC40NjA4OTggMC4yMjIxNDAKK3Z0IDAuNDYxNjU4IDAuMjIyMTQwCit2dCAwLjgxNDQyNCAwLjU2NjIzMQordnQgMC44MTQzMTggMC41NjYyMjgKK3Z0IDAuNTM2NTkwIDAuMDM2OTg3Cit2dCAwLjUzNjU4OCAwLjAzODc0OAordnQgMC41MzMwMjEgMC4wMzY5ODcKK3Z0IDAuNTI5ODY0IDAuMDM2OTg3Cit2dCAwLjUyNzQ4OSAwLjAzNTk3MgordnQgMC41NDM0NzUgMC4wMjkzMzYKK3Z0IDAuNTM2NTc0IDAuMDI0MzI2Cit2dCAwLjU0MzQ3NSAwLjA0NTcyNwordnQgMC43MDc5NTQgMC42NTU4OTgKK3Z0IDAuNzA3NjExIDAuNjQ4OTk3Cit2dCAwLjUzNjU4OCAwLjQwNTUzMgordnQgMC41MzY1ODggMC40MTk5NTQKK3Z0IDAuNTQzNDc1IDAuMzk4NTUzCit2dCAwLjcxODIzNCAwLjQ2NTM1OAordnQgMC43MTg0MjcgMC40NjUzNTgKK3Z0IDAuNTM2NTg4IDAuNDIwMTA0Cit2dCAwLjU0MzQ3NSAwLjAzMzYwOAordnQgMC41Mzg5MjcgMC4wMzU5ODkKK3Z0IDAuNTM5OTI3IDAuMDMzNjExCit2dCAwLjUzODkyOCAwLjAzMTIzOAordnQgMC41Mjc0OTggMC4wMzEyNDAKK3Z0IDAuNTI2NTE1IDAuMDMzNjExCit2dCAwLjUzNjU2NSAwLjAzMDQwNQordnQgMC41MzMwMjEgMC4wMzA0MDUKK3Z0IDAuNTM4ODA4IDAuMDMxMzUxCit2dCAwLjUzOTc0MiAwLjAzMzYxMQordnQgMC41Mzg4MDkgMC4wMzU4NzEKK3Z0IDAuNTM2NTY1IDAuMDM2ODIwCit2dCAwLjUzMzAyMSAwLjAzNjgyMAordnQgMC41Mjk4ODcgMC4wMzY4MjAKK3Z0IDAuNTI3NjI1IDAuMDM1ODgxCit2dCAwLjUyNjcwNCAwLjAzMzYxMQordnQgMC41Mjc2MzQgMC4wMzEzNTIKK3Z0IDAuNTI5ODcyIDAuMDMwNDA1Cit2dCAwLjY1NTkwOCAwLjA0Nzg2MQordnQgMC42NDc4MjkgMC4wNDc4NjEKK3Z0IDAuNjYyODg0IDAuMDQ3ODYxCit2dCAwLjU5OTI3OCAwLjA0Nzg2MQordnQgMC41OTkyNzggMC4wNTEyNTIKK3Z0IDAuNTY2MTUwIDAuMDUxMjUyCit2dCAwLjU2NjE1MCAwLjA0Nzg2MQordnQgMC42MTUxODMgMC4wNDc4NjEKK3Z0IDAuNjE1MTgzIDAuMDUxMjUyCit2dCAwLjYwMjQ1MiAwLjA1MTI1MgordnQgMC42MDI0NTIgMC4wNDc4NjEKK3Z0IDAuNjIxMjg3IDAuMDQ3ODYxCit2dCAwLjYyMTI4NyAwLjA1MTI1MgordnQgMC42MzA5NzMgMC4wMjM5MzAKK3Z0IDAuNjI5NjgxIDAuMDIwODE0Cit2dCAwLjYzNDA5MSAwLjAyMDgxNAordnQgMC42MzQwOTEgMC4wMjUyMjIKK3Z0IDAuNjMwOTczIDAuMDE3Njk3Cit2dCAwLjYzNDA5MSAwLjAxNjQwNQordnQgMC42MzcyMDggMC4wMTc2OTcKK3Z0IDAuNjM4NTAwIDAuMDIwODEzCit2dCAwLjYzNzIwOCAwLjAyMzkzMAordnQgMC42MzQwODEgMC4wNDc4NjEKK3Z0IDAuNjM0MDgxIDAuMDUxMjUyCit2dCAwLjY0NzgyOSAwLjA1MTI1MgordnQgMC42NjI4ODQgMC4wNTEyNTIKK3Z0IDAuNDg0NDcxIDAuMDQ3ODYxCit2dCAwLjQ3NjM5MiAwLjA0Nzg2MQordnQgMC40Njk0MTYgMC4wNDc4NjEKK3Z0IDAuNTQzNDc1IDAuMDUxMjUyCit2dCAwLjU0MzQ3NSAwLjA0Nzg2MQordnQgMC41Mjk4NDggMC4wNTEyNTIKK3Z0IDAuNTIxMzYyIDAuMDUxMjUyCit2dCAwLjUyMTM2MiAwLjA0Nzg2MQordnQgMC41Mjk4NDggMC4wNDc4NjEKK3Z0IDAuNTMzMDIxIDAuMDUxMjUyCit2dCAwLjUzMzAyMSAwLjA0Nzg2MQordnQgMC41MDYzMTggMC4wNTEyNTIKK3Z0IDAuNTA2MzE4IDAuMDQ3ODYxCit2dCAwLjQ4NDQ3MSAwLjA1MTI1MgordnQgMC41MzY1ODggMC4wNDc4NjEKK3Z0IDAuNDY5NDE2IDAuMDUxMjUzCit2dCAwLjY0NzgyOSAwLjEzNjY5NgordnQgMC42NTU5MDggMC4xMzY2OTYKK3Z0IDAuNjU1OTA4IDAuMjIyMTQwCit2dCAwLjY0NzgyOSAwLjIyMjE0MAordnQgMC42NjI4ODQgMC4xMzY2OTYKK3Z0IDAuNjYyODg0IDAuMjIyMTQwCit2dCAwLjQ3NjM5MiAwLjEzNjY5NgordnQgMC40ODQ0NzEgMC4xMzY2OTYKK3Z0IDAuNDg0NDcxIDAuMjIyMTQwCit2dCAwLjQ3NjM5MiAwLjIyMjE0MAordnQgMC40Njk0MTYgMC4xMzY2OTYKK3Z0IDAuNDY5NDE2IDAuMjIyMTQwCit2dCAwLjU5OTI3OCAwLjEzNjY5NgordnQgMC41NjYxNTAgMC4xMzY2OTYKK3Z0IDAuNjE1MTgzIDAuMTM2Njk2Cit2dCAwLjYwMjQ1MiAwLjEzNjY5NgordnQgMC42MjEyODcgMC4xMzY2OTYKK3Z0IDAuNjM0MDgxIDAuMTM2Njk2Cit2dCAwLjU0MzQ3NSAwLjEzNjY5NgordnQgMC41Mjk4NDggMC4xMzY2OTYKK3Z0IDAuNTIxMzYyIDAuMTM2Njk2Cit2dCAwLjUzMzAyMSAwLjEzNjY5NgordnQgMC41MDYzMTIgMC4xMzY2OTYKK3Z0IDAuNjU1OTA4IDAuMDUxMjUyCit2dCAwLjQ3NjM5MiAwLjA1MTI1MgordnQgMC42NDc4MjkgMC4zOTY0MTkKK3Z0IDAuNjU1OTA4IDAuMzk2NDE5Cit2dCAwLjY2Mjg4NCAwLjM5NjQxOQordnQgMC41OTkyNzggMC4zOTY0MTkKK3Z0IDAuNTY2MTUwIDAuMzk2NDE5Cit2dCAwLjU2NjE1MCAwLjM5MzM4OQordnQgMC41OTkyNzggMC4zOTMzODkKK3Z0IDAuNjE1MTgzIDAuMzk2NDE5Cit2dCAwLjYwMjQ1MiAwLjM5NjQxOQordnQgMC42MDI0NTIgMC4zOTMzODkKK3Z0IDAuNjE1MTgzIDAuMzkzMzg5Cit2dCAwLjYyMTI4NyAwLjM5NjQxOQordnQgMC42MjEyODcgMC4zOTMzODkKK3Z0IDAuNjM0MDgxIDAuMzk2NDE5Cit2dCAwLjYzNDA4MSAwLjM5MzM4OQordnQgMC42NDc4MjkgMC4zOTMzODkKK3Z0IDAuNjYyODg0IDAuMzkzMzg5Cit2dCAwLjQ3NjM5MiAwLjM5NjQxOQordnQgMC40ODQ0NzEgMC4zOTY0MTkKK3Z0IDAuNDY5NDE2IDAuMzk2NDE5Cit2dCAwLjU0MzQ3NSAwLjM5NjQxOQordnQgMC41NDM0NzUgMC4zOTMzODkKK3Z0IDAuNTI5ODQ4IDAuMzkzMzg5Cit2dCAwLjUyOTg0OCAwLjM5NjQxOQordnQgMC41MjEzNjIgMC4zOTY0MTkKK3Z0IDAuNTIxMzYyIDAuMzkzMzg5Cit2dCAwLjUzMzAyMSAwLjM5MzM4OQordnQgMC41MzMwMjEgMC4zOTY0MTkKK3Z0IDAuNTA2MzEyIDAuMzk2NDE5Cit2dCAwLjUwNjMxMiAwLjM5MzM4OQordnQgMC40ODQ0NzEgMC4zOTMzODkKK3Z0IDAuNTM2NTg4IDAuMzk2NDE5Cit2dCAwLjQ2OTQxNiAwLjM5MzM5MAordnQgMC42NTU5MDggMC4zMDc3NjUKK3Z0IDAuNjQ3ODI5IDAuMzA3NzY1Cit2dCAwLjY2Mjg4NCAwLjMwNzc2NAordnQgMC40ODQ0NzEgMC4zMDc3NjUKK3Z0IDAuNDc2MzkyIDAuMzA3NzY1Cit2dCAwLjQ2OTQxNiAwLjMwNzc2NQordnQgMC41NjYxNTAgMC4zMDc3NjUKK3Z0IDAuNTk5Mjc4IDAuMzA3NzY1Cit2dCAwLjYwMjQ1MiAwLjMwNzc2NQordnQgMC42MTUxODMgMC4zMDc3NjUKK3Z0IDAuNjIxMjg3IDAuMzA3NzY1Cit2dCAwLjYzNDA4MSAwLjMwNzc2NQordnQgMC41NDM0NzUgMC4zMDc3NjUKK3Z0IDAuNTIxMzYyIDAuMzA3NzY1Cit2dCAwLjUyOTg0OCAwLjMwNzc2NQordnQgMC41MzMwMjEgMC4zMDc3NjUKK3Z0IDAuNTA2MzEyIDAuMzA3NzY1Cit2dCAwLjY1NTkwOCAwLjM5MzM4OQordnQgMC40NzYzOTIgMC4zOTMzOTAKK3Z0IDAuNTY2MTUwIDAuMjIyMTQwCit2dCAwLjU5OTI3OCAwLjIyMjE0MAordnQgMC42MDI0NTIgMC4yMjIxNDAKK3Z0IDAuNjE1MTgzIDAuMjIyMTQwCit2dCAwLjYyMTI4NyAwLjIyMjE0MAordnQgMC42MzQwODEgMC4yMjIxNDAKK3Z0IDAuNTMzMDIyIDAuMjIyMTQwCit2dCAwLjUzNjU4OCAwLjIyMjE0MAordnQgMC41MzY1ODggMC4zMDc3NjUKK3Z0IDAuNTIxMzYyIDAuMjIyMTQwCit2dCAwLjUyOTg0OCAwLjIyMjE0MAordnQgMC41MDYzMTMgMC4yMjIxNDAKK3Z0IDAuNTQzNDc1IDAuMjIyMTQwCit2dCAwLjUzNjU4OCAwLjA1MTI1MgordnQgMC41MzY1ODggMC4xMzY2OTYKK3Z0IDAuNTM2NTg4IDAuMzkzMzg5Cit2dCAwLjEzNTUxNyAwLjYwNDM0NAordnQgMC4xMzU1MTcgMC42MDI1MDcKK3Z0IDAuMTM2MzE0IDAuNjAyOTY3Cit2dCAwLjEzNjMxNCAwLjYwMzg4NAordnQgMC4xNDA3NTcgMC42MDM4ODQKK3Z0IDAuMTQwNzU3IDAuNjAyOTY3Cit2dCAwLjE0MTU1NCAwLjYwMjUwNwordnQgMC4xNDE1NTQgMC42MDQzNDQKK3Z0IDAuMTM3MTExIDAuNjA0MzMxCit2dCAwLjEzNzExMSAwLjYwMjQ5NAordnQgMC4xMzk5NjAgMC42MDQzMzEKK3Z0IDAuMTM5OTYwIDAuNjAyNDk0Cit2dCAwLjEzNTE2NiAwLjYwNDM0NAordnQgMC4xMzUxNjYgMC42MDI1MDcKK3Z0IDAuMTQxODg2IDAuNjAyNTA3Cit2dCAwLjE0MTg4NiAwLjYwNDM0NAordnQgMC4xMzg1MjYgMC42MDM4NTcKK3Z0IDAuMTM3NzI5IDAuNjA0MzMwCit2dCAwLjEzNzcyOSAwLjYwMjQ5MwordnQgMC4xMzg1MjYgMC42MDI5NDEKK3Z0IDAuMTM5MzIzIDAuNjAyNDkzCit2dCAwLjEzOTMyMyAwLjYwNDMzMAordnQgMC4xMzU1MTcgMC42MDcxMDAKK3Z0IDAuMTM1NTE3IDAuNjA1MjYzCit2dCAwLjEzNjMxNCAwLjYwNTcyMwordnQgMC4xMzYzMTQgMC42MDY2NDAKK3Z0IDAuMTQwNzU3IDAuNjA2NjQwCit2dCAwLjE0MDc1NyAwLjYwNTcyMwordnQgMC4xNDE1NTQgMC42MDUyNjMKK3Z0IDAuMTQxNTU0IDAuNjA3MTAwCit2dCAwLjEzNzExMSAwLjYwNzA4NwordnQgMC4xMzcxMTEgMC42MDUyNTAKK3Z0IDAuMTM5OTYwIDAuNjA3MDg3Cit2dCAwLjEzOTk2MCAwLjYwNTI1MAordnQgMC4xMzUxNjYgMC42MDUyNjMKK3Z0IDAuMTM1MTY2IDAuNjA3MTAwCit2dCAwLjE0MTg4NiAwLjYwNTI2MwordnQgMC4xNDE4ODYgMC42MDcxMDAKK3Z0IDAuMTM4NTI2IDAuNjA2NjEzCit2dCAwLjEzNzcyOSAwLjYwNzA4NgordnQgMC4xMzc3MjkgMC42MDUyNDkKK3Z0IDAuMTM4NTI2IDAuNjA1Njk3Cit2dCAwLjEzOTMyMyAwLjYwNTI0OQordnQgMC4xMzkzMjMgMC42MDcwODYKK3Z0IDAuMTM1NTE3IDAuNjA5ODU2Cit2dCAwLjEzNTUxNyAwLjYwODAxOQordnQgMC4xMzYzMTQgMC42MDg0NzkKK3Z0IDAuMTM2MzE0IDAuNjA5Mzk2Cit2dCAwLjE0MDc1NyAwLjYwOTM5NgordnQgMC4xNDA3NTcgMC42MDg0NzkKK3Z0IDAuMTQxNTU0IDAuNjA4MDE5Cit2dCAwLjE0MTU1NCAwLjYwOTg1NgordnQgMC4xMzcxMTEgMC42MDk4NDMKK3Z0IDAuMTM3MTExIDAuNjA4MDA2Cit2dCAwLjEzOTk2MCAwLjYwOTg0MwordnQgMC4xMzk5NjAgMC42MDgwMDYKK3Z0IDAuMTM1MTY2IDAuNjA4MDE5Cit2dCAwLjEzNTE2NiAwLjYwOTg1NgordnQgMC4xNDE4ODYgMC42MDgwMTkKK3Z0IDAuMTQxODg2IDAuNjA5ODU2Cit2dCAwLjEzODUyNiAwLjYwOTM2OAordnQgMC4xMzc3MjkgMC42MDk4NDIKK3Z0IDAuMTM3NzI5IDAuNjA4MDA1Cit2dCAwLjEzODUyNiAwLjYwODQ1MwordnQgMC4xMzkzMjMgMC42MDgwMDUKK3Z0IDAuMTM5MzIzIDAuNjA5ODQyCit2dCAwLjEzODUyNiAwLjYxMTIwOAordnQgMC4xMzg1MjYgMC42MTIxMjYKK3Z0IDAuMTM3NzI5IDAuNjEyNTk4Cit2dCAwLjEzNzcyOSAwLjYxMDc2MQordnQgMC4xMzkzMjMgMC42MTA3NjEKK3Z0IDAuMTM5MzIzIDAuNjEyNTk4Cit2dCAwLjEzNTUxNyAwLjYxMjYxMgordnQgMC4xMzU1MTcgMC42MTA3NzUKK3Z0IDAuMTM2MzE0IDAuNjExMjM1Cit2dCAwLjEzNjMxNCAwLjYxMjE1MgordnQgMC4xNDA3NTcgMC42MTIxNTIKK3Z0IDAuMTQwNzU3IDAuNjExMjM1Cit2dCAwLjE0MTU1NCAwLjYxMDc3NQordnQgMC4xNDE1NTQgMC42MTI2MTIKK3Z0IDAuMTM3MTExIDAuNjEyNTk5Cit2dCAwLjEzNzExMSAwLjYxMDc2MgordnQgMC4xMzk5NjAgMC42MTI1OTkKK3Z0IDAuMTM5OTYwIDAuNjEwNzYyCit2dCAwLjEzNTE2NiAwLjYxMDc3NQordnQgMC4xMzU1MTcgMC42MTM1MzIKK3Z0IDAuMTM1MTY2IDAuNjEzNTMyCit2dCAwLjEzNTE2NiAwLjYxMjYxMgordnQgMC4xNDE4ODYgMC42MTI2MTIKK3Z0IDAuMTQxODg2IDAuNjEzNTMyCit2dCAwLjE0MTU1NCAwLjYxMzUzMgordnQgMC4xNDE4ODYgMC42MTA3NzUKK3Z0IDAuMTM1NTE3IDAuNjE1MzY5Cit2dCAwLjEzNjMxNCAwLjYxMzk5MgordnQgMC4xMzYzMTQgMC42MTQ5MDkKK3Z0IDAuMTQwNzU3IDAuNjE0OTA5Cit2dCAwLjE0MDc1NyAwLjYxMzk5MgordnQgMC4xNDE1NTQgMC42MTUzNjkKK3Z0IDAuMTM3MTExIDAuNjE1MzU2Cit2dCAwLjEzNzExMSAwLjYxMzUxOQordnQgMC4xMzk5NjAgMC42MTUzNTYKK3Z0IDAuMTM5OTYwIDAuNjEzNTE5Cit2dCAwLjEzNTE2NiAwLjYxNTM2OQordnQgMC4xNDE4ODYgMC42MTUzNjkKK3Z0IDAuMTM4NTI2IDAuNjE0ODgyCit2dCAwLjEzNzcyOSAwLjYxNTM1NQordnQgMC4xMzc3MjkgMC42MTM1MTkKK3Z0IDAuMTM4NTI2IDAuNjEzOTY2Cit2dCAwLjEzOTMyMyAwLjYxMzUxOQordnQgMC4xMzkzMjMgMC42MTUzNTUKK3Z0IDAuMTM1NTE3IDAuNjE4MTI1Cit2dCAwLjEzNTUxNyAwLjYxNjI4OAordnQgMC4xMzYzMTQgMC42MTY3NDgKK3Z0IDAuMTM2MzE0IDAuNjE3NjY1Cit2dCAwLjE0MDc1NyAwLjYxNzY2NQordnQgMC4xNDA3NTcgMC42MTY3NDgKK3Z0IDAuMTQxNTU0IDAuNjE2Mjg4Cit2dCAwLjE0MTU1NCAwLjYxODEyNQordnQgMC4xMzcxMTEgMC42MTgxMTIKK3Z0IDAuMTM3MTExIDAuNjE2Mjc1Cit2dCAwLjEzOTk2MCAwLjYxODExMgordnQgMC4xMzk5NjAgMC42MTYyNzUKK3Z0IDAuMTM1MTY2IDAuNjE2Mjg4Cit2dCAwLjEzNTE2NiAwLjYxODEyNQordnQgMC4xNDE4ODYgMC42MTYyODgKK3Z0IDAuMTQxODg2IDAuNjE4MTI1Cit2dCAwLjEzODUyNiAwLjYxNzYzOAordnQgMC4xMzc3MjkgMC42MTgxMTEKK3Z0IDAuMTM3NzI5IDAuNjE2Mjc0Cit2dCAwLjEzODUyNiAwLjYxNjcyMgordnQgMC4xMzkzMjMgMC42MTYyNzQKK3Z0IDAuMTM5MzIzIDAuNjE4MTExCit2dCAwLjEzNTUxNyAwLjYyMDg4MQordnQgMC4xMzU1MTcgMC42MTkwNDQKK3Z0IDAuMTM2MzE0IDAuNjE5NTA0Cit2dCAwLjEzNjMxNCAwLjYyMDQyMQordnQgMC4xNDA3NTcgMC42MjA0MjEKK3Z0IDAuMTQwNzU3IDAuNjE5NTA0Cit2dCAwLjE0MTU1NCAwLjYxOTA0NAordnQgMC4xNDE1NTQgMC42MjA4ODEKK3Z0IDAuMTM3MTExIDAuNjIwODY4Cit2dCAwLjEzNzExMSAwLjYxOTAzMQordnQgMC4xMzk5NjAgMC42MjA4NjgKK3Z0IDAuMTM5OTYwIDAuNjE5MDMxCit2dCAwLjEzNTE2NiAwLjYxOTA0NAordnQgMC4xMzUxNjYgMC42MjA4ODEKK3Z0IDAuMTQxODg2IDAuNjE5MDQ0Cit2dCAwLjE0MTg4NiAwLjYyMDg4MQordnQgMC4xMzg1MjYgMC42MjAzOTQKK3Z0IDAuMTM3NzI5IDAuNjIwODY3Cit2dCAwLjEzNzcyOSAwLjYxOTAzMAordnQgMC4xMzg1MjYgMC42MTk0NzgKK3Z0IDAuMTM5MzIzIDAuNjE5MDMwCit2dCAwLjEzOTMyMyAwLjYyMDg2NwordnQgMC4xMzU1MTcgMC42MjM2MzcKK3Z0IDAuMTM1NTE3IDAuNjIxODAwCit2dCAwLjEzNjMxNCAwLjYyMjI2MAordnQgMC4xMzYzMTQgMC42MjMxNzcKK3Z0IDAuMTQwNzU3IDAuNjIzMTc3Cit2dCAwLjE0MDc1NyAwLjYyMjI2MAordnQgMC4xNDE1NTQgMC42MjE4MDAKK3Z0IDAuMTQxNTU0IDAuNjIzNjM3Cit2dCAwLjEzNzExMSAwLjYyMzYyNAordnQgMC4xMzcxMTEgMC42MjE3ODgKK3Z0IDAuMTM5OTYwIDAuNjIzNjI0Cit2dCAwLjEzOTk2MCAwLjYyMTc4OAordnQgMC4xMzUxNjYgMC42MjE4MDAKK3Z0IDAuMTM1MTY2IDAuNjIzNjM3Cit2dCAwLjE0MTg4NiAwLjYyMTgwMAordnQgMC4xNDE4ODYgMC42MjM2MzcKK3Z0IDAuMTM4NTI2IDAuNjIzMTUwCit2dCAwLjEzNzcyOSAwLjYyMzYyMwordnQgMC4xMzc3MjkgMC42MjE3ODYKK3Z0IDAuMTM4NTI2IDAuNjIyMjM0Cit2dCAwLjEzOTMyMyAwLjYyMTc4NgordnQgMC4xMzkzMjMgMC42MjM2MjMKK3Z0IDAuMTM1NTE3IDAuNjI2MzkzCit2dCAwLjEzNTUxNyAwLjYyNDU1NgordnQgMC4xMzYzMTQgMC42MjUwMTYKK3Z0IDAuMTM2MzE0IDAuNjI1OTMzCit2dCAwLjE0MDc1NyAwLjYyNTkzMwordnQgMC4xNDA3NTcgMC42MjUwMTYKK3Z0IDAuMTQxNTU0IDAuNjI0NTU2Cit2dCAwLjE0MTU1NCAwLjYyNjM5MwordnQgMC4xMzcxMTEgMC42MjYzOTMKK3Z0IDAuMTM3MTExIDAuNjI0NTQ0Cit2dCAwLjEzOTk2MCAwLjYyNjM5MwordnQgMC4xMzk5NjAgMC42MjQ1NDQKK3Z0IDAuMTM1MTY2IDAuNjI0NTU2Cit2dCAwLjEzNTE2NiAwLjYyNjM5MwordnQgMC4xNDE4ODYgMC42MjQ1NTYKK3Z0IDAuMTQxODg2IDAuNjI2MzkzCit2dCAwLjEzODUyNiAwLjYyNTkwNgordnQgMC4xMzc3MjkgMC42MjYzNjYKK3Z0IDAuMTM3NzI5IDAuNjI0NTQzCit2dCAwLjEzODUyNiAwLjYyNDk5MAordnQgMC4xMzkzMjMgMC42MjQ1NDMKK3Z0IDAuMTM5MzIzIDAuNjI2MzY2Cit2dCAwLjEzNTUxNyAwLjYyOTE0OQordnQgMC4xMzU1MTcgMC42MjczMTIKK3Z0IDAuMTM2MzE0IDAuNjI3NzcyCit2dCAwLjEzNjMxNCAwLjYyODY4OQordnQgMC4xNDA3NTcgMC42Mjg2ODkKK3Z0IDAuMTQwNzU3IDAuNjI3NzcyCit2dCAwLjE0MTU1NCAwLjYyNzMxMgordnQgMC4xNDE1NTQgMC42MjkxNDkKK3Z0IDAuMTM3MTExIDAuNjI5MTM2Cit2dCAwLjEzNzExMSAwLjYyNzMwMAordnQgMC4xMzk5NjAgMC42MjkxMzYKK3Z0IDAuMTM5OTYwIDAuNjI3Mjk5Cit2dCAwLjEzNTE2NiAwLjYyNzMxMgordnQgMC4xMzUxNjYgMC42MjkxNDkKK3Z0IDAuMTQxODg2IDAuNjI3MzEyCit2dCAwLjE0MTg4NiAwLjYyOTE0OQordnQgMC4xMzg1MjYgMC42Mjg2NjIKK3Z0IDAuMTM3NzI5IDAuNjI5MTM1Cit2dCAwLjEzNzcyOSAwLjYyNzI5OQordnQgMC4xMzg1MjYgMC42Mjc3NDYKK3Z0IDAuMTM5MzIzIDAuNjI3Mjk5Cit2dCAwLjEzOTMyMyAwLjYyOTEzNQordnQgMC4xMzU1MTcgMC42MzE5NTYKK3Z0IDAuMTM1NTE3IDAuNjMwMDY4Cit2dCAwLjEzNjMxNCAwLjYzMDYwMQordnQgMC4xMzYzMTQgMC42MzE0OTYKK3Z0IDAuMTQwNzU3IDAuNjMxNDk2Cit2dCAwLjE0MDc1NyAwLjYzMDYwMQordnQgMC4xNDE1NTQgMC42MzAwNjgKK3Z0IDAuMTQxNTU0IDAuNjMxOTU2Cit2dCAwLjEzNzExMSAwLjYzMTk1NgordnQgMC4xMzcxMTEgMC42MzAwNTUKK3Z0IDAuMTM5OTYwIDAuNjMxOTU2Cit2dCAwLjEzOTk2MCAwLjYzMDA1NQordnQgMC4xMzUxNjYgMC42MzAwNjgKK3Z0IDAuMTM1MTY2IDAuNjMxOTU2Cit2dCAwLjE0MTg4NiAwLjYzMDA2OAordnQgMC4xNDE4ODYgMC42MzE5NTYKK3Z0IDAuMTM4NTI2IDAuNjMxNDkxCit2dCAwLjEzNzcyOSAwLjYzMTk1MQordnQgMC4xMzc3MjkgMC42MzAwNTUKK3Z0IDAuMTM4NTI2IDAuNjMwNTc1Cit2dCAwLjEzOTMyMyAwLjYzMDA1NQordnQgMC4xMzkzMjMgMC42MzE5NTEKK3Z0IDAuMTM4NTI2IDAuNjMzMzMxCit2dCAwLjEzODUyNiAwLjYzNDI0OAordnQgMC4xMzc3MjkgMC42MzQ3MDgKK3Z0IDAuMTM3NzI5IDAuNjMyODcxCit2dCAwLjEzOTMyMyAwLjYzMjg3MQordnQgMC4xMzkzMjMgMC42MzQ3MDgKK3Z0IDAuMTM1NTE3IDAuNjM0NzEyCit2dCAwLjEzNTUxNyAwLjYzMjg3NQordnQgMC4xMzYzMTQgMC42MzMzMzUKK3Z0IDAuMTM2MzE0IDAuNjM0MjUyCit2dCAwLjE0MDc1NyAwLjYzNDI1MgordnQgMC4xNDA3NTcgMC42MzMzMzUKK3Z0IDAuMTQxNTU0IDAuNjMyODc1Cit2dCAwLjE0MTU1NCAwLjYzNDcxMgordnQgMC4xMzcxMTEgMC42MzQ3MTIKK3Z0IDAuMTM3MTExIDAuNjMyODc1Cit2dCAwLjEzOTk2MCAwLjYzNDcxMgordnQgMC4xMzk5NjAgMC42MzI4NzUKK3Z0IDAuMTM1MTY2IDAuNjMyODc1Cit2dCAwLjEzNTUxNyAwLjYzNTYzMgordnQgMC4xMzUxNjYgMC42MzU2MzIKK3Z0IDAuMTM1MTY2IDAuNjM0NzEyCit2dCAwLjE0MTg4NiAwLjYzNDcxMgordnQgMC4xNDE4ODYgMC42MzU2MzIKK3Z0IDAuMTQxNTU0IDAuNjM1NjMyCit2dCAwLjE0MTg4NiAwLjYzMjg3NQordnQgMC4xNDA0NDUgMC42MzczMjEKK3Z0IDAuMTQxNTQ4IDAuNjM2OTY3Cit2dCAwLjE0MDc1OCAwLjYzODgyNQordnQgMC4xNDA0NDUgMC42MzgyNDEKK3Z0IDAuMTM1NTE1IDAuNjM2OTcyCit2dCAwLjEzNTE2NCAwLjYzNjk3MgordnQgMC4xNDE4ODAgMC42MzY5NjcKK3Z0IDAuMTM5NzEzIDAuNjM5NjM1Cit2dCAwLjEzOTY0MiAwLjYzOTMwMQordnQgMC4xNDA4OTggMC42MzkxNTAKK3Z0IDAuMTM3MzE1IDAuNjM5NjQwCit2dCAwLjEzNzM5MCAwLjYzOTMwNgordnQgMC4xMzg1MjYgMC42Mzk3NzcKK3Z0IDAuMTM4NTI4IDAuNjQwMTIwCit2dCAwLjEzNjU5OCAwLjYzNzMyMQordnQgMC4xMzYzMTQgMC42MzYwOTIKK3Z0IDAuMTM3MTExIDAuNjAxNTczCit2dCAwLjEzNjMxNCAwLjYwMTEyNQordnQgMC4xMzYzMTQgMC42MDAyODEKK3Z0IDAuMTM3MTExIDAuNTk5ODMzCit2dCAwLjE0MDc1NyAwLjYwMTEyNQordnQgMC4xMzk5NjAgMC42MDE1NzMKK3Z0IDAuMTM5OTYwIDAuNTk5ODMzCit2dCAwLjE0MDc1NyAwLjYwMDI4MQordnQgMC4xMzU1MTcgMC42MDE1ODUKK3Z0IDAuMTM1MTY2IDAuNjAxNTg1Cit2dCAwLjEzNTE2NiAwLjU5OTgyMQordnQgMC4xMzU1MTcgMC41OTk4MjEKK3Z0IDAuMTQxODg2IDAuNjAxNTg1Cit2dCAwLjE0MTU1NCAwLjYwMTU4NQordnQgMC4xMzczOTUgMC42MzY4NjEKK3Z0IDAuMTM3NzI5IDAuNjM1NjI4Cit2dCAwLjEzODUyNiAwLjYzNjA4OAordnQgMC4xMzgxOTIgMC42MzczMjEKK3Z0IDAuMTM5NjQ4IDAuNjM2ODYxCit2dCAwLjEzOTk2MCAwLjYzNTYzMgordnQgMC4xNDA3NTcgMC42MzYwOTIKK3Z0IDAuMTM4ODUxIDAuNjM3MzIxCit2dCAwLjEzOTMyMyAwLjYzNTYyOAordnQgMC4xMzg4NTEgMC42MzgyNDEKK3Z0IDAuMTM4MTkyIDAuNjM4MjQxCit2dCAwLjEzNjE1NyAwLjYzOTE2MAordnQgMC4xMzYzMDggMC42Mzg3MDIKK3Z0IDAuMTM3MTExIDAuNjM1NjMyCit2dCAwLjEzNjU5OCAwLjYzODI0MQordnQgMC4xMzczOTUgMC42Mzg3MDEKK3Z0IDAuMTM5NjQ4IDAuNjM4NzAxCit2dCAwLjEzOTMyMyAwLjYwMTU3MgordnQgMC4xMzc3MjkgMC42MDE1NzIKK3Z0IDAuMTM1NTc0IDAuNjAyNDczCit2dCAwLjEzNjMxNCAwLjYwMjkwMAordnQgMC4xMzYzMTQgMC42MDM5NTAKK3Z0IDAuMTM1NTc0IDAuNjA0Mzc3Cit2dCAwLjE0MDc1NyAwLjYwMjkwMAordnQgMC4xNDE0OTYgMC42MDI0NzMKK3Z0IDAuMTQxNDk2IDAuNjA0Mzc3Cit2dCAwLjE0MDc1NyAwLjYwMzk1MAordnQgMC4xMzcwNTMgMC42MDQzNjUKK3Z0IDAuMTQwMDE3IDAuNjA0MzY1Cit2dCAwLjEzNzc4NyAwLjYwMTYwNQordnQgMC4xMzc3ODcgMC42MDI0NjAKK3Z0IDAuMTM3Nzg3IDAuNjA0MzYzCit2dCAwLjEzOTI2NSAwLjYwNDM2MwordnQgMC4xNDAwMTcgMC42MDUyMTgKK3Z0IDAuMTM3MDUzIDAuNjA1MjE4Cit2dCAwLjEzNTU3NCAwLjYwNTIyOQordnQgMC4xMzYzMTQgMC42MDY3MDYKK3Z0IDAuMTM1NTc0IDAuNjA3MTMzCit2dCAwLjE0MTQ5NiAwLjYwNTIyOQordnQgMC4xNDE0OTYgMC42MDcxMzMKK3Z0IDAuMTQwNzU3IDAuNjA2NzA2Cit2dCAwLjEzNzc4NyAwLjYwNTIxNgordnQgMC4xMzg1MjYgMC42MDU2MzEKK3Z0IDAuMTM4NTI2IDAuNjA2NjgwCit2dCAwLjEzNzc4NyAwLjYwNzExOQordnQgMC4xMzU1NzQgMC42MDc5ODUKK3Z0IDAuMTM2MzE0IDAuNjA4NDEyCit2dCAwLjEzNjMxNCAwLjYwOTQ2MgordnQgMC4xMzU1NzQgMC42MDk4ODkKK3Z0IDAuMTQwNzU3IDAuNjA4NDEyCit2dCAwLjE0MTQ5NiAwLjYwNzk4NQordnQgMC4xNDE0OTYgMC42MDk4ODkKK3Z0IDAuMTQwNzU3IDAuNjA5NDYyCit2dCAwLjEzNzA1MyAwLjYwOTg3NgordnQgMC4xNDAwMTcgMC42MDk4NzYKK3Z0IDAuMTM3Nzg3IDAuNjA3OTcyCit2dCAwLjEzODUyNiAwLjYwODM4NwordnQgMC4xMzc3ODcgMC42MDk4NzUKK3Z0IDAuMTM5MjY1IDAuNjA5ODc1Cit2dCAwLjE0MDAxNyAwLjYxMDczMAordnQgMC4xMzg1MjYgMC42MTIxOTMKK3Z0IDAuMTM3Nzg3IDAuNjEyNjMxCit2dCAwLjEzNzc4NyAwLjYxMDcyNwordnQgMC4xMzg1MjYgMC42MTExNDMKK3Z0IDAuMTM5MjY1IDAuNjEwNzI3Cit2dCAwLjEzNzA1MyAwLjYxMDczMAordnQgMC4xMzU1NzQgMC42MTA3NDEKK3Z0IDAuMTM1NTc0IDAuNjEyNjQ1Cit2dCAwLjE0MTQ5NiAwLjYxMDc0MQordnQgMC4xNDE0OTYgMC42MTI2NDUKK3Z0IDAuMTM1NTc0IDAuNjEzNDk5Cit2dCAwLjE0MTQ5NiAwLjYxMzQ5OQordnQgMC4xMzYzMTQgMC42MTM5MjUKK3Z0IDAuMTM2MzE0IDAuNjE0OTc1Cit2dCAwLjEzNTU3NCAwLjYxNTQwMgordnQgMC4xNDA3NTcgMC42MTM5MjUKK3Z0IDAuMTQxNDk2IDAuNjE1NDAyCit2dCAwLjE0MDc1NyAwLjYxNDk3NQordnQgMC4xMzc3ODcgMC42MTM0ODUKK3Z0IDAuMTM4NTI2IDAuNjEzOTAwCit2dCAwLjEzNzc4NyAwLjYxNTM4OAordnQgMC4xNDAwMTcgMC42MTYyNDMKK3Z0IDAuMTM3MDUzIDAuNjE2MjQzCit2dCAwLjEzNTU3NCAwLjYxNjI1NQordnQgMC4xMzU1NzQgMC42MTgxNTgKK3Z0IDAuMTQxNDk2IDAuNjE2MjU1Cit2dCAwLjE0MTQ5NiAwLjYxODE1OAordnQgMC4xMzc3ODcgMC42MTYyNDEKK3Z0IDAuMTM5MjY1IDAuNjE2MjQxCit2dCAwLjEzODUyNiAwLjYxNzcwNQordnQgMC4xMzc3ODcgMC42MTgxNDQKK3Z0IDAuMTM1NTc0IDAuNjE5MDEwCit2dCAwLjEzNjMxNCAwLjYxOTQzNwordnQgMC4xMzYzMTQgMC42MjA0ODcKK3Z0IDAuMTM1NTc0IDAuNjIwOTE0Cit2dCAwLjE0MDc1NyAwLjYxOTQzNwordnQgMC4xNDE0OTYgMC42MTkwMTAKK3Z0IDAuMTQxNDk2IDAuNjIwOTE0Cit2dCAwLjE0MDc1NyAwLjYyMDQ4NwordnQgMC4xMzc3ODcgMC42MTg5OTcKK3Z0IDAuMTM4NTI2IDAuNjE5NDEyCit2dCAwLjEzODUyNiAwLjYyMDQ2MQordnQgMC4xMzc3ODcgMC42MjA5MDAKK3Z0IDAuMTM1NTc0IDAuNjIxNzY2Cit2dCAwLjEzNjMxNCAwLjYyMjE5MwordnQgMC4xMzU1NzQgMC42MjM2NzAKK3Z0IDAuMTQwNzU3IDAuNjIyMTkzCit2dCAwLjE0MTQ5NiAwLjYyMTc2NgordnQgMC4xNDE0OTYgMC42MjM2NzAKK3Z0IDAuMTM3MDUzIDAuNjIzNjU4Cit2dCAwLjE0MDAxNyAwLjYyMzY1OAordnQgMC4xMzc3ODcgMC42MjE3NTIKK3Z0IDAuMTM4NTI2IDAuNjIzMjE3Cit2dCAwLjEzNzc4NyAwLjYyMzY1NgordnQgMC4xMzkyNjUgMC42MjM2NTYKK3Z0IDAuMTM1NTc0IDAuNjI0NTIzCit2dCAwLjEzNjMxNCAwLjYyNDk1MAordnQgMC4xMzYzMTQgMC42MjYwMDAKK3Z0IDAuMTM1NTc0IDAuNjI2NDI2Cit2dCAwLjE0MDc1NyAwLjYyNDk1MAordnQgMC4xNDE0OTYgMC42MjQ1MjMKK3Z0IDAuMTQxNDk2IDAuNjI2NDI2Cit2dCAwLjE0MDc1NyAwLjYyNjAwMAordnQgMC4xMzc3ODcgMC42MjQ1MDkKK3Z0IDAuMTM4NTI2IDAuNjI0OTI0Cit2dCAwLjEzODUyNiAwLjYyNTk3MwordnQgMC4xMzc3ODcgMC42MjYzOTkKK3Z0IDAuMTM1NTc0IDAuNjI3Mjc5Cit2dCAwLjEzNjMxNCAwLjYyNzcwNgordnQgMC4xMzYzMTQgMC42Mjg3NTYKK3Z0IDAuMTM1NTc0IDAuNjI5MTgzCit2dCAwLjE0MDc1NyAwLjYyNzcwNgordnQgMC4xNDE0OTYgMC42MjcyNzkKK3Z0IDAuMTQxNDk2IDAuNjI5MTgzCit2dCAwLjE0MDc1NyAwLjYyODc1NgordnQgMC4xMzcwNTMgMC42MjkxNzEKK3Z0IDAuMTQwMDE3IDAuNjI5MTcxCit2dCAwLjEzNzc4NyAwLjYyNzI2NQordnQgMC4xMzc3ODcgMC42MjkxNjkKK3Z0IDAuMTM5MjY1IDAuNjI5MTY5Cit2dCAwLjE0MDAxNyAwLjYzMDAyNAordnQgMC4xMzcwNTMgMC42MzAwMjQKK3Z0IDAuMTM1NTc0IDAuNjMwMDM1Cit2dCAwLjEzNjMxNCAwLjYzMDUzMAordnQgMC4xMzYzMTQgMC42MzE1NjIKK3Z0IDAuMTM1NTc1IDAuNjMxOTg5Cit2dCAwLjE0MDc1NyAwLjYzMDUzMAordnQgMC4xNDE0OTYgMC42MzAwMzUKK3Z0IDAuMTQxNDk2IDAuNjMxOTg5Cit2dCAwLjE0MDc1NyAwLjYzMTU2MgordnQgMC4xMzc3ODcgMC42MzAwMjIKK3Z0IDAuMTM5MjY1IDAuNjMwMDIyCit2dCAwLjEzODUyNiAwLjYzMDUwNAordnQgMC4xMzg1MjYgMC42MzE1NTcKK3Z0IDAuMTM3Nzg3IDAuNjMxOTg0Cit2dCAwLjE0MDAxNyAwLjYzMjg0MQordnQgMC4xMzg1MjYgMC42MzQzMTQKK3Z0IDAuMTM3Nzg3IDAuNjM0NzQxCit2dCAwLjEzNzc4NyAwLjYzMjgzNwordnQgMC4xMzkyNjUgMC42MzI4MzcKK3Z0IDAuMTM3MDUzIDAuNjMyODQxCit2dCAwLjEzNTU3NCAwLjYzMjg0MQordnQgMC4xMzU1NzQgMC42MzQ3NDUKK3Z0IDAuMTQxNDk2IDAuNjMyODQxCit2dCAwLjE0MTQ5NiAwLjYzNDc0NQordnQgMC4xMzU1NzQgMC42MzU1OTkKK3Z0IDAuMTQxNDk2IDAuNjM1NTk5Cit2dCAwLjE0MDc1NyAwLjYzNjAyNgordnQgMC4xMzYzMTQgMC42MzYwMjYKK3Z0IDAuMTM3Nzg3IDAuNjM1NTk1Cit2dCAwLjEzODUyNiAwLjYzNjAyMgordnQgMC4xMzg1MjYgMC42MDExMDEKK3Z0IDAuMTM4NTI2IDAuNjAxMTY4Cit2dCAwLjEzNjMxNCAwLjYwMTE5MQordnQgMC4xMzU1NzQgMC42MDE2MTgKK3Z0IDAuMTQxNDk2IDAuNjAxNjE4Cit2dCAwLjE0MDc1NyAwLjYwMTE5MQordnQgMC4xMzY2NTYgMC42MzczNTQKK3Z0IDAuMTM2NjU2IDAuNjM4MjA4Cit2dCAwLjEzNzM5NSAwLjYzODYzNQordnQgMC4xMzgxMzUgMC42MzgyMDgKK3Z0IDAuMTM4MTM1IDAuNjM3MzU0Cit2dCAwLjEzODkwOSAwLjYzNzM1NAordnQgMC4xMzk2NDggMC42Mzg2MzUKK3Z0IDAuMTQwMzg3IDAuNjM3MzU0Cit2dCAwLjEzODUyNiAwLjYwMDMwNQordnQgMC4xMzkzMjMgMC41OTk4MzQKK3Z0IDAuMTQxNTU0IDAuNTk5ODIxCit2dCAwLjE0MTg4NiAwLjU5OTgyMQordnQgMC4xMzc3MjkgMC41OTk4MzQKK3Z0IDAuMTM1NTE3IDAuNTk3MDYyCit2dCAwLjEzNjMxNCAwLjU5NzUyMgordnQgMC4xMzYzMTQgMC41OTg0MzkKK3Z0IDAuMTM1NTE3IDAuNTk4ODk5Cit2dCAwLjE0MDc1NyAwLjU5NzUyMgordnQgMC4xNDE1NTQgMC41OTcwNjIKK3Z0IDAuMTQxNTU0IDAuNTk4ODk5Cit2dCAwLjE0MDc1NyAwLjU5ODQzOQordnQgMC4xMzcxMTEgMC41OTcwNzUKK3Z0IDAuMTM3MTExIDAuNTk4OTEyCit2dCAwLjEzOTk2MCAwLjU5ODkxMgordnQgMC4xMzk5NjAgMC41OTcwNzUKK3Z0IDAuMTM1MTY2IDAuNTk4ODk5Cit2dCAwLjEzNTE2NiAwLjU5NzA2MgordnQgMC4xNDE4ODYgMC41OTcwNjIKK3Z0IDAuMTQxODg2IDAuNTk4ODk5Cit2dCAwLjEzODUyNiAwLjU5NzU0OQordnQgMC4xMzg1MjYgMC41OTg0NjUKK3Z0IDAuMTM3NzI5IDAuNTk4OTEyCit2dCAwLjEzNzcyOSAwLjU5NzA3NgordnQgMC4xMzkzMjMgMC41OTcwNzYKK3Z0IDAuMTM5MzIzIDAuNTk4OTEyCit2dCAwLjEzNTUxNyAwLjU5NDMwNgordnQgMC4xMzYzMTQgMC41OTQ3NjYKK3Z0IDAuMTM2MzE0IDAuNTk1NjgzCit2dCAwLjEzNTUxNyAwLjU5NjE0MwordnQgMC4xNDA3NTcgMC41OTQ3NjYKK3Z0IDAuMTQxNTU0IDAuNTk0MzA2Cit2dCAwLjE0MTU1NCAwLjU5NjE0MwordnQgMC4xNDA3NTcgMC41OTU2ODMKK3Z0IDAuMTM3MTExIDAuNTk0MzE5Cit2dCAwLjEzNzExMSAwLjU5NjE1NgordnQgMC4xMzk5NjAgMC41OTYxNTYKK3Z0IDAuMTM5OTYwIDAuNTk0MzE5Cit2dCAwLjEzNTE2NiAwLjU5NjE0MwordnQgMC4xMzUxNjYgMC41OTQzMDYKK3Z0IDAuMTQxODg2IDAuNTk2MTQzCit2dCAwLjE0MTg4NiAwLjU5NDMwNgordnQgMC4xMzg1MjYgMC41OTQ3OTMKK3Z0IDAuMTM4NTI2IDAuNTk1NzA5Cit2dCAwLjEzNzcyOSAwLjU5NjE1NgordnQgMC4xMzc3MjkgMC41OTQzMjAKK3Z0IDAuMTM5MzIzIDAuNTk0MzIwCit2dCAwLjEzOTMyMyAwLjU5NjE1NgordnQgMC4xMzU1MTcgMC41OTE1NTAKK3Z0IDAuMTM2MzE0IDAuNTkyMDEwCit2dCAwLjEzNjMxNCAwLjU5MjkyNwordnQgMC4xMzU1MTcgMC41OTMzODcKK3Z0IDAuMTQwNzU3IDAuNTkyMDEwCit2dCAwLjE0MTU1NCAwLjU5MTU1MAordnQgMC4xNDE1NTQgMC41OTMzODcKK3Z0IDAuMTQwNzU3IDAuNTkyOTI3Cit2dCAwLjEzNzExMSAwLjU5MTU2MwordnQgMC4xMzcxMTEgMC41OTM0MDAKK3Z0IDAuMTM5OTYwIDAuNTkzNDAwCit2dCAwLjEzOTk2MCAwLjU5MTU2MwordnQgMC4xMzUxNjYgMC41OTMzODcKK3Z0IDAuMTM1MTY2IDAuNTkxNTUwCit2dCAwLjE0MTg4NiAwLjU5MzM4NwordnQgMC4xNDE4ODYgMC41OTE1NTAKK3Z0IDAuMTM4NTI2IDAuNTkyMDM3Cit2dCAwLjEzODUyNiAwLjU5Mjk1MwordnQgMC4xMzc3MjkgMC41OTM0MDEKK3Z0IDAuMTM3NzI5IDAuNTkxNTY0Cit2dCAwLjEzOTMyMyAwLjU5MTU2NAordnQgMC4xMzkzMjMgMC41OTM0MDEKK3Z0IDAuMTM4NTI2IDAuNTkwMTk3Cit2dCAwLjEzNzcyOSAwLjU5MDY0NQordnQgMC4xMzc3MjkgMC41ODg4MDgKK3Z0IDAuMTM4NTI2IDAuNTg5MjgwCit2dCAwLjEzOTMyMyAwLjU4ODgwOAordnQgMC4xMzkzMjMgMC41OTA2NDUKK3Z0IDAuMTM1NTE3IDAuNTg4Nzk0Cit2dCAwLjEzNjMxNCAwLjU4OTI1NAordnQgMC4xMzYzMTQgMC41OTAxNzEKK3Z0IDAuMTM1NTE3IDAuNTkwNjMxCit2dCAwLjE0MDc1NyAwLjU4OTI1NAordnQgMC4xNDE1NTQgMC41ODg3OTQKK3Z0IDAuMTQxNTU0IDAuNTkwNjMxCit2dCAwLjE0MDc1NyAwLjU5MDE3MQordnQgMC4xMzcxMTEgMC41ODg4MDcKK3Z0IDAuMTM3MTExIDAuNTkwNjQ0Cit2dCAwLjEzOTk2MCAwLjU5MDY0NAordnQgMC4xMzk5NjAgMC41ODg4MDcKK3Z0IDAuMTM1MTY2IDAuNTkwNjMxCit2dCAwLjEzNTUxNyAwLjU4Nzg3NAordnQgMC4xMzUxNjYgMC41ODg3OTQKK3Z0IDAuMTM1MTY2IDAuNTg3ODc0Cit2dCAwLjE0MTU1NCAwLjU4Nzg3NAordnQgMC4xNDE4ODYgMC41ODc4NzQKK3Z0IDAuMTQxODg2IDAuNTg4Nzk0Cit2dCAwLjE0MTg4NiAwLjU5MDYzMQordnQgMC4xMzU1MTcgMC41ODYwMzcKK3Z0IDAuMTM2MzE0IDAuNTg2NDk3Cit2dCAwLjEzNjMxNCAwLjU4NzQxNAordnQgMC4xNDA3NTcgMC41ODY0OTcKK3Z0IDAuMTQxNTU0IDAuNTg2MDM3Cit2dCAwLjE0MDc1NyAwLjU4NzQxNAordnQgMC4xMzcxMTEgMC41ODYwNTAKK3Z0IDAuMTM3MTExIDAuNTg3ODg3Cit2dCAwLjEzOTk2MCAwLjU4Nzg4NwordnQgMC4xMzk5NjAgMC41ODYwNTAKK3Z0IDAuMTM1MTY2IDAuNTg2MDM3Cit2dCAwLjE0MTg4NiAwLjU4NjAzNwordnQgMC4xMzg1MjYgMC41ODY1MjQKK3Z0IDAuMTM4NTI2IDAuNTg3NDQwCit2dCAwLjEzNzcyOSAwLjU4Nzg4NwordnQgMC4xMzc3MjkgMC41ODYwNTEKK3Z0IDAuMTM5MzIzIDAuNTg2MDUxCit2dCAwLjEzOTMyMyAwLjU4Nzg4NwordnQgMC4xMzU1MTcgMC41ODMyODEKK3Z0IDAuMTM2MzE0IDAuNTgzNzQxCit2dCAwLjEzNjMxNCAwLjU4NDY1OAordnQgMC4xMzU1MTcgMC41ODUxMTgKK3Z0IDAuMTQwNzU3IDAuNTgzNzQxCit2dCAwLjE0MTU1MyAwLjU4MzI4MQordnQgMC4xNDE1NTMgMC41ODUxMTgKK3Z0IDAuMTQwNzU3IDAuNTg0NjU4Cit2dCAwLjEzNzExMSAwLjU4MzI5NAordnQgMC4xMzcxMTEgMC41ODUxMzEKK3Z0IDAuMTM5OTYwIDAuNTg1MTMxCit2dCAwLjEzOTk2MCAwLjU4MzI5NAordnQgMC4xMzUxNjUgMC41ODUxMTgKK3Z0IDAuMTM1MTY1IDAuNTgzMjgxCit2dCAwLjE0MTg4NiAwLjU4NTExOAordnQgMC4xNDE4ODYgMC41ODMyODEKK3Z0IDAuMTM4NTI2IDAuNTgzNzY4Cit2dCAwLjEzODUyNiAwLjU4NDY4NAordnQgMC4xMzc3MjkgMC41ODUxMzEKK3Z0IDAuMTM3NzI5IDAuNTgzMjk1Cit2dCAwLjEzOTMyMyAwLjU4MzI5NQordnQgMC4xMzkzMjMgMC41ODUxMzEKK3Z0IDAuMTM1NTE3IDAuNTgwNTI1Cit2dCAwLjEzNjMxNCAwLjU4MDk4NQordnQgMC4xMzYzMTQgMC41ODE5MDIKK3Z0IDAuMTM1NTE3IDAuNTgyMzYyCit2dCAwLjE0MDc1NyAwLjU4MDk4NQordnQgMC4xNDE1NTMgMC41ODA1MjUKK3Z0IDAuMTQxNTUzIDAuNTgyMzYyCit2dCAwLjE0MDc1NyAwLjU4MTkwMgordnQgMC4xMzcxMTEgMC41ODA1MzgKK3Z0IDAuMTM3MTExIDAuNTgyMzc1Cit2dCAwLjEzOTk2MCAwLjU4MjM3NQordnQgMC4xMzk5NjAgMC41ODA1MzgKK3Z0IDAuMTM1MTY1IDAuNTgyMzYyCit2dCAwLjEzNTE2NSAwLjU4MDUyNQordnQgMC4xNDE4ODYgMC41ODIzNjIKK3Z0IDAuMTQxODg2IDAuNTgwNTI1Cit2dCAwLjEzODUyNiAwLjU4MTAxMgordnQgMC4xMzg1MjYgMC41ODE5MjgKK3Z0IDAuMTM3NzI5IDAuNTgyMzc2Cit2dCAwLjEzNzcyOSAwLjU4MDUzOQordnQgMC4xMzkzMjMgMC41ODA1MzkKK3Z0IDAuMTM5MzIzIDAuNTgyMzc2Cit2dCAwLjEzNTUxNyAwLjU3Nzc2OQordnQgMC4xMzYzMTQgMC41NzgyMjkKK3Z0IDAuMTM2MzE0IDAuNTc5MTQ2Cit2dCAwLjEzNTUxNyAwLjU3OTYwNgordnQgMC4xNDA3NTcgMC41NzgyMjkKK3Z0IDAuMTQxNTU0IDAuNTc3NzY5Cit2dCAwLjE0MTU1NCAwLjU3OTYwNgordnQgMC4xNDA3NTcgMC41NzkxNDYKK3Z0IDAuMTM3MTExIDAuNTc3NzgyCit2dCAwLjEzNzExMSAwLjU3OTYxOAordnQgMC4xMzk5NjAgMC41Nzk2MTgKK3Z0IDAuMTM5OTYwIDAuNTc3NzgyCit2dCAwLjEzNTE2NiAwLjU3OTYwNgordnQgMC4xMzUxNjUgMC41Nzc3NjkKK3Z0IDAuMTQxODg2IDAuNTc5NjA2Cit2dCAwLjE0MTg4NiAwLjU3Nzc2OQordnQgMC4xMzg1MjYgMC41NzgyNTYKK3Z0IDAuMTM4NTI2IDAuNTc5MTcyCit2dCAwLjEzNzcyOSAwLjU3OTYyMAordnQgMC4xMzc3MjkgMC41Nzc3ODMKK3Z0IDAuMTM5MzIzIDAuNTc3NzgzCit2dCAwLjEzOTMyMyAwLjU3OTYyMAordnQgMC4xMzU1MTcgMC41NzUwMTMKK3Z0IDAuMTM2MzE0IDAuNTc1NDcyCit2dCAwLjEzNjMxNCAwLjU3NjM5MAordnQgMC4xMzU1MTcgMC41NzY4NTAKK3Z0IDAuMTQwNzU3IDAuNTc1NDcyCit2dCAwLjE0MTU1NCAwLjU3NTAxMwordnQgMC4xNDE1NTMgMC41NzY4NTAKK3Z0IDAuMTQwNzU3IDAuNTc2MzkwCit2dCAwLjEzNzExMSAwLjU3NTAxMwordnQgMC4xMzcxMTEgMC41NzY4NjIKK3Z0IDAuMTM5OTYwIDAuNTc2ODYyCit2dCAwLjEzOTk2MCAwLjU3NTAxMwordnQgMC4xMzUxNjUgMC41NzY4NTAKK3Z0IDAuMTM1MTY1IDAuNTc1MDEzCit2dCAwLjE0MTg4NiAwLjU3Njg1MAordnQgMC4xNDE4ODYgMC41NzUwMTMKK3Z0IDAuMTM4NTI2IDAuNTc1NTAwCit2dCAwLjEzODUyNiAwLjU3NjQxNgordnQgMC4xMzc3MjkgMC41NzY4NjMKK3Z0IDAuMTM3NzI5IDAuNTc1MDQwCit2dCAwLjEzOTMyMyAwLjU3NTA0MAordnQgMC4xMzkzMjMgMC41NzY4NjMKK3Z0IDAuMTM1NTE3IDAuNTcyMjU3Cit2dCAwLjEzNjMxNCAwLjU3MjcxNwordnQgMC4xMzYzMTQgMC41NzM2MzQKK3Z0IDAuMTM1NTE3IDAuNTc0MDk0Cit2dCAwLjE0MDc1NyAwLjU3MjcxNwordnQgMC4xNDE1NTQgMC41NzIyNTcKK3Z0IDAuMTQxNTU0IDAuNTc0MDk0Cit2dCAwLjE0MDc1NyAwLjU3MzYzNAordnQgMC4xMzcxMTAgMC41NzIyNzAKK3Z0IDAuMTM3MTExIDAuNTc0MTA2Cit2dCAwLjEzOTk2MCAwLjU3NDEwNgordnQgMC4xMzk5NjAgMC41NzIyNzAKK3Z0IDAuMTM1MTY1IDAuNTc0MDk0Cit2dCAwLjEzNTE2NSAwLjU3MjI1NwordnQgMC4xNDE4ODYgMC41NzQwOTQKK3Z0IDAuMTQxODg2IDAuNTcyMjU3Cit2dCAwLjEzODUyNiAwLjU3Mjc0NAordnQgMC4xMzg1MjYgMC41NzM2NjAKK3Z0IDAuMTM3NzI5IDAuNTc0MTA3Cit2dCAwLjEzNzcyOSAwLjU3MjI3MQordnQgMC4xMzkzMjMgMC41NzIyNzEKK3Z0IDAuMTM5MzIzIDAuNTc0MTA3Cit2dCAwLjEzNTUxNyAwLjU2OTQ1MAordnQgMC4xMzYzMTQgMC41Njk5MTAKK3Z0IDAuMTM2MzE0IDAuNTcwODA1Cit2dCAwLjEzNTUxNyAwLjU3MTMzOAordnQgMC4xNDA3NTcgMC41Njk5MTAKK3Z0IDAuMTQxNTUzIDAuNTY5NDUwCit2dCAwLjE0MTU1MyAwLjU3MTMzOAordnQgMC4xNDA3NTcgMC41NzA4MDUKK3Z0IDAuMTM3MTEwIDAuNTY5NDUwCit2dCAwLjEzNzExMCAwLjU3MTM1MQordnQgMC4xMzk5NjAgMC41NzEzNTEKK3Z0IDAuMTM5OTYwIDAuNTY5NDUwCit2dCAwLjEzNTE2NSAwLjU3MTMzOAordnQgMC4xMzUxNjUgMC41Njk0NTAKK3Z0IDAuMTQxODg2IDAuNTcxMzM4Cit2dCAwLjE0MTg4NiAwLjU2OTQ1MAordnQgMC4xMzg1MjYgMC41Njk5MTUKK3Z0IDAuMTM4NTI2IDAuNTcwODMxCit2dCAwLjEzNzcyOSAwLjU3MTM1MQordnQgMC4xMzc3MjkgMC41Njk0NTUKK3Z0IDAuMTM5MzIzIDAuNTY5NDU1Cit2dCAwLjEzOTMyMyAwLjU3MTM1MQordnQgMC4xMzg1MjYgMC41NjgwNzUKK3Z0IDAuMTM3NzI5IDAuNTY4NTM1Cit2dCAwLjEzNzcyOSAwLjU2NjY5OAordnQgMC4xMzg1MjYgMC41NjcxNTgKK3Z0IDAuMTM5MzIzIDAuNTY2Njk4Cit2dCAwLjEzOTMyMyAwLjU2ODUzNQordnQgMC4xMzU1MTcgMC41NjY2OTQKK3Z0IDAuMTM2MzE0IDAuNTY3MTU0Cit2dCAwLjEzNjMxNCAwLjU2ODA3MQordnQgMC4xMzU1MTcgMC41Njg1MzEKK3Z0IDAuMTQwNzU3IDAuNTY3MTU0Cit2dCAwLjE0MTU1MyAwLjU2NjY5NAordnQgMC4xNDE1NTMgMC41Njg1MzEKK3Z0IDAuMTQwNzU3IDAuNTY4MDcxCit2dCAwLjEzNzExMCAwLjU2NjY5NAordnQgMC4xMzcxMTAgMC41Njg1MzEKK3Z0IDAuMTM5OTYwIDAuNTY4NTMxCit2dCAwLjEzOTk2MCAwLjU2NjY5NAordnQgMC4xMzUxNjUgMC41Njg1MzEKK3Z0IDAuMTM1NTE3IDAuNTY1Nzc0Cit2dCAwLjEzNTE2NSAwLjU2NjY5NAordnQgMC4xMzUxNjUgMC41NjU3NzQKK3Z0IDAuMTQxNTUzIDAuNTY1Nzc0Cit2dCAwLjE0MTg4NSAwLjU2NTc3NAordnQgMC4xNDE4ODUgMC41NjY2OTQKK3Z0IDAuMTQxODg2IDAuNTY4NTMxCit2dCAwLjE0MDQ0NSAwLjU2NDE3MwordnQgMC4xNDA0NDUgMC41NjMyNTIKK3Z0IDAuMTQwNzU3IDAuNTYyNDgxCit2dCAwLjE0MTU1MyAwLjU2NDM3NQordnQgMC4xMzU1MTUgMC41NjQzODkKK3Z0IDAuMTM1MTYzIDAuNTY0Mzg4Cit2dCAwLjE0MTg4NiAwLjU2NDM3NAordnQgMC4xMzk2OTkgMC41NjE3MDYKK3Z0IDAuMTQwODk2IDAuNTYyMjAzCit2dCAwLjEzOTYyOSAwLjU2MjA0MAordnQgMC4xMzczMTUgMC41NjE3MTQKK3Z0IDAuMTM4NTI2IDAuNTYxMjI0Cit2dCAwLjEzODUyNiAwLjU2MTU2NwordnQgMC4xMzczOTAgMC41NjIwNDgKK3Z0IDAuMTM2NTk4IDAuNTY0MTczCit2dCAwLjEzNjMxNCAwLjU2NTMxNAordnQgMC4xMzczOTUgMC41NjQ2MzMKK3Z0IDAuMTM4MTkyIDAuNTY0MTczCit2dCAwLjEzODUyNiAwLjU2NTMxOAordnQgMC4xMzc3MjkgMC41NjU3NzgKK3Z0IDAuMTM5NjQ4IDAuNTY0NjMzCit2dCAwLjE0MDc1NyAwLjU2NTMxNAordnQgMC4xMzk5NjAgMC41NjU3NzQKK3Z0IDAuMTM4ODUxIDAuNTY0MTczCit2dCAwLjEzOTMyMyAwLjU2NTc3OAordnQgMC4xMzgxOTIgMC41NjMyNTIKK3Z0IDAuMTM4ODUxIDAuNTYzMjUyCit2dCAwLjEzNjE1NyAwLjU2MjE4NAordnQgMC4xMzYzMDggMC41NjI1MDkKK3Z0IDAuMTM3MTEwIDAuNTY1Nzc0Cit2dCAwLjEzNjU5OCAwLjU2MzI1MgordnQgMC4xMzczOTUgMC41NjI3OTIKK3Z0IDAuMTM5NjQ4IDAuNTYyNzkyCit2dCAwLjEzNjMxNCAwLjU5ODUwNgordnQgMC4xMzU1NzQgMC41OTg5MzIKK3Z0IDAuMTM1NTc0IDAuNTk3MDI5Cit2dCAwLjE0MTQ5NiAwLjU5ODkzMgordnQgMC4xNDA3NTcgMC41OTg1MDYKK3Z0IDAuMTQxNDk2IDAuNTk3MDI5Cit2dCAwLjEzNzA1MyAwLjU5NzA0MQordnQgMC4xNDAwMTcgMC41OTcwNDEKK3Z0IDAuMTM3Nzg3IDAuNTk4OTQ2Cit2dCAwLjEzNzc4NyAwLjU5OTgwMQordnQgMC4xMzc3ODcgMC41OTcwNDMKK3Z0IDAuMTM5MjY1IDAuNTk3MDQzCit2dCAwLjEzNTU3NCAwLjU5NjE3NgordnQgMC4xMzU1NzQgMC41OTQyNzMKK3Z0IDAuMTM2MzE0IDAuNTk0NzAwCit2dCAwLjE0MTQ5NiAwLjU5NjE3NgordnQgMC4xNDA3NTcgMC41OTQ3MDAKK3Z0IDAuMTQxNDk2IDAuNTk0MjczCit2dCAwLjEzNzc4NyAwLjU5NjE5MAordnQgMC4xMzg1MjYgMC41OTU3NzUKK3Z0IDAuMTM3Nzg3IDAuNTk0Mjg3Cit2dCAwLjEzODUyNiAwLjU5NDcyNgordnQgMC4xMzYzMTQgMC41OTI5OTQKK3Z0IDAuMTM1NTc0IDAuNTkzNDIxCit2dCAwLjEzNTU3NCAwLjU5MTUxNwordnQgMC4xMzYzMTQgMC41OTE5NDQKK3Z0IDAuMTQxNDk2IDAuNTkzNDIxCit2dCAwLjE0MDc1NyAwLjU5Mjk5NAordnQgMC4xNDA3NTcgMC41OTE5NDQKK3Z0IDAuMTQxNDk2IDAuNTkxNTE3Cit2dCAwLjEzNzA1MyAwLjU5MTUyOQordnQgMC4xNDAwMTcgMC41OTE1MjkKK3Z0IDAuMTM3Nzg3IDAuNTkzNDM0Cit2dCAwLjEzNzc4NyAwLjU5MTUzMQordnQgMC4xMzkyNjUgMC41OTE1MzEKK3Z0IDAuMTQwMDE3IDAuNTkwNjc2Cit2dCAwLjEzNzc4NyAwLjU4ODc3NQordnQgMC4xMzg1MjYgMC41ODkyMTMKK3Z0IDAuMTM4NTI2IDAuNTkwMjYzCit2dCAwLjEzNzc4NyAwLjU5MDY3OQordnQgMC4xMzkyNjUgMC41OTA2NzkKK3Z0IDAuMTM3MDUzIDAuNTkwNjc2Cit2dCAwLjEzNTU3NCAwLjU5MDY2NQordnQgMC4xMzU1NzQgMC41ODg3NjEKK3Z0IDAuMTM2MzE0IDAuNTg5MTg4Cit2dCAwLjE0MTQ5NiAwLjU5MDY2NQordnQgMC4xNDA3NTcgMC41ODkxODgKK3Z0IDAuMTQxNDk2IDAuNTg4NzYxCit2dCAwLjEzNTU3NCAwLjU4NzkwNwordnQgMC4xNDE0OTYgMC41ODc5MDcKK3Z0IDAuMTM2MzE0IDAuNTg3NDgwCit2dCAwLjEzNTU3NCAwLjU4NjAwNAordnQgMC4xMzYzMTQgMC41ODY0MzAKK3Z0IDAuMTQwNzU3IDAuNTg3NDgwCit2dCAwLjE0MDc1NyAwLjU4NjQzMAordnQgMC4xNDE0OTYgMC41ODYwMDQKK3Z0IDAuMTM3Nzg3IDAuNTg3OTIxCit2dCAwLjEzODUyNiAwLjU4NzUwNgordnQgMC4xMzc3ODcgMC41ODYwMTgKK3Z0IDAuMTM5MjY1IDAuNTg2MDE4Cit2dCAwLjE0MDAxNyAwLjU4NTE2MwordnQgMC4xMzcwNTMgMC41ODUxNjMKK3Z0IDAuMTM1NTc0IDAuNTg1MTUxCit2dCAwLjEzNTU3NCAwLjU4MzI0OAordnQgMC4xNDE0OTYgMC41ODUxNTEKK3Z0IDAuMTQxNDk2IDAuNTgzMjQ4Cit2dCAwLjEzNzc4NyAwLjU4NTE2NQordnQgMC4xMzkyNjUgMC41ODUxNjUKK3Z0IDAuMTM3Nzg3IDAuNTgzMjYyCit2dCAwLjEzODUyNiAwLjU4MzcwMQordnQgMC4xMzYzMTQgMC41ODE5NjkKK3Z0IDAuMTM1NTc0IDAuNTgyMzk1Cit2dCAwLjEzNTU3NCAwLjU4MDQ5MgordnQgMC4xMzYzMTQgMC41ODA5MTkKK3Z0IDAuMTQxNDk2IDAuNTgyMzk1Cit2dCAwLjE0MDc1NyAwLjU4MTk2OQordnQgMC4xNDA3NTcgMC41ODA5MTkKK3Z0IDAuMTQxNDk2IDAuNTgwNDkyCit2dCAwLjEzNzc4NyAwLjU4MjQwOQordnQgMC4xMzg1MjYgMC41ODE5OTQKK3Z0IDAuMTM3Nzg3IDAuNTgwNTA2Cit2dCAwLjEzODUyNiAwLjU4MDk0NQordnQgMC4xNDAwMTcgMC41Nzk2NTEKK3Z0IDAuMTM3MDUzIDAuNTc5NjUxCit2dCAwLjEzNjMxNCAwLjU3OTIxMwordnQgMC4xMzU1NzQgMC41Nzk2NDAKK3Z0IDAuMTM1NTc0IDAuNTc3NzM2Cit2dCAwLjE0MTQ5NiAwLjU3OTY0MAordnQgMC4xNDA3NTcgMC41NzkyMTMKK3Z0IDAuMTQxNDk2IDAuNTc3NzM2Cit2dCAwLjEzNzA1MyAwLjU3Nzc0OAordnQgMC4xNDAwMTcgMC41Nzc3NDgKK3Z0IDAuMTM3Nzg3IDAuNTc5NjU0Cit2dCAwLjEzOTI2NSAwLjU3OTY1NAordnQgMC4xMzc3ODcgMC41Nzc3NTAKK3Z0IDAuMTM4NTI2IDAuNTc4MTg5Cit2dCAwLjEzNjMxNCAwLjU3NjQ1NgordnQgMC4xMzU1NzQgMC41NzY4ODMKK3Z0IDAuMTM1NTc0IDAuNTc0OTc5Cit2dCAwLjEzNjMxNCAwLjU3NTQwNgordnQgMC4xNDE0OTYgMC41NzY4ODMKK3Z0IDAuMTQwNzU3IDAuNTc2NDU2Cit2dCAwLjE0MDc1NyAwLjU3NTQwNgordnQgMC4xNDE0OTYgMC41NzQ5NzkKK3Z0IDAuMTM3Nzg3IDAuNTc2ODk3Cit2dCAwLjEzODUyNiAwLjU3NjQ4MgordnQgMC4xMzc3ODcgMC41NzUwMDYKK3Z0IDAuMTM4NTI2IDAuNTc1NDMzCit2dCAwLjEzNjMxNCAwLjU3MzcwMAordnQgMC4xMzU1NzQgMC41NzQxMjcKK3Z0IDAuMTM1NTc0IDAuNTcyMjIzCit2dCAwLjEzNjMxNCAwLjU3MjY1MAordnQgMC4xNDE0OTYgMC41NzQxMjcKK3Z0IDAuMTQwNzU3IDAuNTczNzAwCit2dCAwLjE0MDc1NyAwLjU3MjY1MAordnQgMC4xNDE0OTYgMC41NzIyMjMKK3Z0IDAuMTM3MDUzIDAuNTcyMjM1Cit2dCAwLjE0MDAxNyAwLjU3MjIzNQordnQgMC4xMzc3ODcgMC41NzQxNDEKK3Z0IDAuMTM3Nzg3IDAuNTcyMjM3Cit2dCAwLjEzOTI2NSAwLjU3MjIzNwordnQgMC4xMzYzMTQgMC41NzA4NzYKK3Z0IDAuMTM1NTc0IDAuNTcxMzcwCit2dCAwLjEzNTU3NCAwLjU2OTQxNwordnQgMC4xMzYzMTQgMC41Njk4NDQKK3Z0IDAuMTQxNDk2IDAuNTcxMzcwCit2dCAwLjE0MDc1NyAwLjU3MDg3NgordnQgMC4xNDA3NTcgMC41Njk4NDQKK3Z0IDAuMTQxNDk2IDAuNTY5NDE3Cit2dCAwLjEzNzA1MyAwLjU2OTQxNwordnQgMC4xNDAwMTcgMC41Njk0MTcKK3Z0IDAuMTM3Nzg3IDAuNTcxMzg0Cit2dCAwLjEzODUyNiAwLjU3MDkwMQordnQgMC4xMzc3ODcgMC41Njk0MjIKK3Z0IDAuMTM4NTI2IDAuNTY5ODQ5Cit2dCAwLjEzOTI2NSAwLjU2OTQyMgordnQgMC4xNDAwMTcgMC41Njg1NjUKK3Z0IDAuMTM3Nzg2IDAuNTY2NjY1Cit2dCAwLjEzODUyNiAwLjU2NzA5MQordnQgMC4xMzc3ODcgMC41Njg1NjkKK3Z0IDAuMTM5MjY1IDAuNTY4NTY5Cit2dCAwLjEzNzA1MyAwLjU2ODU2NQordnQgMC4xMzU1NzQgMC41Njg1NjUKK3Z0IDAuMTM1NTc0IDAuNTY2NjYxCit2dCAwLjEzNjMxNCAwLjU2NzA4OAordnQgMC4xNDE0OTYgMC41Njg1NjUKK3Z0IDAuMTQwNzU3IDAuNTY3MDg4Cit2dCAwLjE0MTQ5NiAwLjU2NjY2MQordnQgMC4xMzU1NzQgMC41NjU4MDcKK3Z0IDAuMTQxNDk2IDAuNTY1ODA3Cit2dCAwLjE0MDc1NyAwLjU2NTM4MAordnQgMC4xMzYzMTQgMC41NjUzODAKK3Z0IDAuMTM3Nzg2IDAuNTY1ODExCit2dCAwLjEzODUyNiAwLjU2NTM4NAordnQgMC4xMzg1MjYgMC42MDAyMzgKK3Z0IDAuMTM1NTc0IDAuNTk5Nzg4Cit2dCAwLjEzNjMxNCAwLjYwMDIxNQordnQgMC4xNDA3NTcgMC42MDAyMTUKK3Z0IDAuMTQxNDk2IDAuNTk5Nzg4Cit2dCAwLjEzNjY1NiAwLjU2MzI4NQordnQgMC4xMzY2NTYgMC41NjQxMzkKK3Z0IDAuMTM3Mzk1IDAuNTYyODU5Cit2dCAwLjEzODEzNCAwLjU2MzI4NQordnQgMC4xMzgxMzQgMC41NjQxMzkKK3Z0IDAuMTM4OTA4IDAuNTY0MTM5Cit2dCAwLjEzOTY0OCAwLjU2Mjg1OQordnQgMC4xNDAzODcgMC41NjQxMzkKK3Z0IDAuMTUyODY2IDAuNjA0MzQ0Cit2dCAwLjE1Mjg2NiAwLjYwMjUwNwordnQgMC4xNTM2NjMgMC42MDI5NjcKK3Z0IDAuMTUzNjYzIDAuNjAzODg0Cit2dCAwLjE1ODEwNiAwLjYwMzg4NAordnQgMC4xNTgxMDYgMC42MDI5NjcKK3Z0IDAuMTU4OTAzIDAuNjAyNTA3Cit2dCAwLjE1ODkwMyAwLjYwNDM0NAordnQgMC4xNTQ0NjAgMC42MDQzMzEKK3Z0IDAuMTU0NDYwIDAuNjAyNDk0Cit2dCAwLjE1NzMwOSAwLjYwNDMzMQordnQgMC4xNTczMDkgMC42MDI0OTQKK3Z0IDAuMTUyNTE1IDAuNjA0MzQ0Cit2dCAwLjE1MjUxNSAwLjYwMjUwNwordnQgMC4xNTkyMzUgMC42MDI1MDcKK3Z0IDAuMTU5MjM1IDAuNjA0MzQ0Cit2dCAwLjE1NTg3NiAwLjYwMzg1NwordnQgMC4xNTUwNzkgMC42MDQzMzAKK3Z0IDAuMTU1MDc5IDAuNjAyNDk0Cit2dCAwLjE1NTg3NiAwLjYwMjk0MQordnQgMC4xNTY2NzIgMC42MDI0OTMKK3Z0IDAuMTU2NjcyIDAuNjA0MzMwCit2dCAwLjE1Mjg2NiAwLjYwNzEwMAordnQgMC4xNTI4NjYgMC42MDUyNjMKK3Z0IDAuMTUzNjYzIDAuNjA1NzIzCit2dCAwLjE1MzY2MyAwLjYwNjY0MAordnQgMC4xNTgxMDYgMC42MDY2NDAKK3Z0IDAuMTU4MTA2IDAuNjA1NzIzCit2dCAwLjE1ODkwMyAwLjYwNTI2MwordnQgMC4xNTg5MDMgMC42MDcxMDAKK3Z0IDAuMTU0NDYwIDAuNjA3MDg3Cit2dCAwLjE1NDQ2MCAwLjYwNTI1MAordnQgMC4xNTczMDkgMC42MDcwODcKK3Z0IDAuMTU3MzA5IDAuNjA1MjUwCit2dCAwLjE1MjUxNSAwLjYwNTI2MwordnQgMC4xNTI1MTUgMC42MDcxMDAKK3Z0IDAuMTU5MjM1IDAuNjA1MjYzCit2dCAwLjE1OTIzNSAwLjYwNzEwMAordnQgMC4xNTU4NzYgMC42MDY2MTMKK3Z0IDAuMTU1MDc5IDAuNjA3MDg2Cit2dCAwLjE1NTA3OSAwLjYwNTI0OQordnQgMC4xNTU4NzYgMC42MDU2OTcKK3Z0IDAuMTU2NjcyIDAuNjA1MjQ5Cit2dCAwLjE1NjY3MiAwLjYwNzA4NgordnQgMC4xNTI4NjYgMC42MDk4NTYKK3Z0IDAuMTUyODY2IDAuNjA4MDE5Cit2dCAwLjE1MzY2MyAwLjYwODQ3OQordnQgMC4xNTM2NjMgMC42MDkzOTYKK3Z0IDAuMTU4MTA2IDAuNjA5Mzk2Cit2dCAwLjE1ODEwNiAwLjYwODQ3OQordnQgMC4xNTg5MDMgMC42MDgwMTkKK3Z0IDAuMTU4OTAzIDAuNjA5ODU2Cit2dCAwLjE1NDQ2MCAwLjYwOTg0MwordnQgMC4xNTQ0NjAgMC42MDgwMDYKK3Z0IDAuMTU3MzA5IDAuNjA5ODQzCit2dCAwLjE1NzMwOSAwLjYwODAwNgordnQgMC4xNTI1MTUgMC42MDgwMTkKK3Z0IDAuMTUyNTE1IDAuNjA5ODU2Cit2dCAwLjE1OTIzNSAwLjYwODAxOQordnQgMC4xNTkyMzUgMC42MDk4NTYKK3Z0IDAuMTU1ODc2IDAuNjA5MzY4Cit2dCAwLjE1NTA3OSAwLjYwOTg0MgordnQgMC4xNTUwNzkgMC42MDgwMDUKK3Z0IDAuMTU1ODc2IDAuNjA4NDUzCit2dCAwLjE1NjY3MyAwLjYwODAwNQordnQgMC4xNTY2NzMgMC42MDk4NDIKK3Z0IDAuMTU1ODc2IDAuNjExMjA4Cit2dCAwLjE1NTg3NiAwLjYxMjEyNgordnQgMC4xNTUwNzkgMC42MTI1OTgKK3Z0IDAuMTU1MDc5IDAuNjEwNzYxCit2dCAwLjE1NjY3MiAwLjYxMDc2MQordnQgMC4xNTY2NzIgMC42MTI1OTgKK3Z0IDAuMTUyODY2IDAuNjEyNjEyCit2dCAwLjE1Mjg2NiAwLjYxMDc3NQordnQgMC4xNTM2NjMgMC42MTEyMzUKK3Z0IDAuMTUzNjYzIDAuNjEyMTUyCit2dCAwLjE1ODEwNiAwLjYxMjE1MgordnQgMC4xNTgxMDYgMC42MTEyMzUKK3Z0IDAuMTU4OTAzIDAuNjEwNzc1Cit2dCAwLjE1ODkwMyAwLjYxMjYxMgordnQgMC4xNTQ0NjAgMC42MTI1OTkKK3Z0IDAuMTU0NDYwIDAuNjEwNzYyCit2dCAwLjE1NzMwOSAwLjYxMjU5OQordnQgMC4xNTczMDkgMC42MTA3NjIKK3Z0IDAuMTUyNTE1IDAuNjEwNzc1Cit2dCAwLjE1Mjg2NiAwLjYxMzUzMgordnQgMC4xNTI1MTUgMC42MTM1MzIKK3Z0IDAuMTUyNTE1IDAuNjEyNjEyCit2dCAwLjE1OTIzNSAwLjYxMjYxMgordnQgMC4xNTkyMzUgMC42MTM1MzIKK3Z0IDAuMTU4OTAzIDAuNjEzNTMyCit2dCAwLjE1OTIzNSAwLjYxMDc3NQordnQgMC4xNTI4NjYgMC42MTUzNjkKK3Z0IDAuMTUzNjYzIDAuNjEzOTkyCit2dCAwLjE1MzY2MyAwLjYxNDkwOQordnQgMC4xNTgxMDYgMC42MTQ5MDkKK3Z0IDAuMTU4MTA2IDAuNjEzOTkyCit2dCAwLjE1ODkwMyAwLjYxNTM2OQordnQgMC4xNTQ0NjAgMC42MTUzNTYKK3Z0IDAuMTU0NDYwIDAuNjEzNTE5Cit2dCAwLjE1NzMwOSAwLjYxNTM1NgordnQgMC4xNTczMDkgMC42MTM1MTkKK3Z0IDAuMTUyNTE1IDAuNjE1MzY5Cit2dCAwLjE1OTIzNSAwLjYxNTM2OQordnQgMC4xNTU4NzYgMC42MTQ4ODIKK3Z0IDAuMTU1MDc5IDAuNjE1MzU1Cit2dCAwLjE1NTA3OSAwLjYxMzUxOQordnQgMC4xNTU4NzYgMC42MTM5NjYKK3Z0IDAuMTU2NjcyIDAuNjEzNTE5Cit2dCAwLjE1NjY3MyAwLjYxNTM1NQordnQgMC4xNTI4NjYgMC42MTgxMjUKK3Z0IDAuMTUyODY2IDAuNjE2Mjg4Cit2dCAwLjE1MzY2MyAwLjYxNjc0OAordnQgMC4xNTM2NjMgMC42MTc2NjUKK3Z0IDAuMTU4MTA2IDAuNjE3NjY1Cit2dCAwLjE1ODEwNiAwLjYxNjc0OAordnQgMC4xNTg5MDMgMC42MTYyODgKK3Z0IDAuMTU4OTAzIDAuNjE4MTI1Cit2dCAwLjE1NDQ2MCAwLjYxODExMgordnQgMC4xNTQ0NjAgMC42MTYyNzUKK3Z0IDAuMTU3MzA5IDAuNjE4MTEyCit2dCAwLjE1NzMwOSAwLjYxNjI3NQordnQgMC4xNTI1MTUgMC42MTYyODgKK3Z0IDAuMTUyNTE1IDAuNjE4MTI1Cit2dCAwLjE1OTIzNSAwLjYxNjI4OAordnQgMC4xNTkyMzUgMC42MTgxMjUKK3Z0IDAuMTU1ODc2IDAuNjE3NjM4Cit2dCAwLjE1NTA3OSAwLjYxODExMQordnQgMC4xNTUwNzkgMC42MTYyNzQKK3Z0IDAuMTU1ODc2IDAuNjE2NzIyCit2dCAwLjE1NjY3MyAwLjYxNjI3NAordnQgMC4xNTY2NzMgMC42MTgxMTEKK3Z0IDAuMTUyODY2IDAuNjIwODgxCit2dCAwLjE1Mjg2NiAwLjYxOTA0NAordnQgMC4xNTM2NjMgMC42MTk1MDQKK3Z0IDAuMTUzNjYzIDAuNjIwNDIxCit2dCAwLjE1ODEwNiAwLjYyMDQyMQordnQgMC4xNTgxMDYgMC42MTk1MDQKK3Z0IDAuMTU4OTAzIDAuNjE5MDQ0Cit2dCAwLjE1ODkwMyAwLjYyMDg4MQordnQgMC4xNTQ0NjAgMC42MjA4NjgKK3Z0IDAuMTU0NDYwIDAuNjE5MDMxCit2dCAwLjE1NzMwOSAwLjYyMDg2OAordnQgMC4xNTczMDkgMC42MTkwMzEKK3Z0IDAuMTUyNTE1IDAuNjE5MDQ0Cit2dCAwLjE1MjUxNSAwLjYyMDg4MQordnQgMC4xNTkyMzUgMC42MTkwNDQKK3Z0IDAuMTU5MjM1IDAuNjIwODgxCit2dCAwLjE1NTg3NiAwLjYyMDM5NAordnQgMC4xNTUwNzkgMC42MjA4NjcKK3Z0IDAuMTU1MDc5IDAuNjE5MDMwCit2dCAwLjE1NTg3NiAwLjYxOTQ3OAordnQgMC4xNTY2NzMgMC42MTkwMzAKK3Z0IDAuMTU2NjczIDAuNjIwODY3Cit2dCAwLjE1Mjg2NiAwLjYyMzYzNwordnQgMC4xNTI4NjYgMC42MjE4MDAKK3Z0IDAuMTUzNjYzIDAuNjIyMjYwCit2dCAwLjE1MzY2MyAwLjYyMzE3NwordnQgMC4xNTgxMDYgMC42MjMxNzcKK3Z0IDAuMTU4MTA2IDAuNjIyMjYwCit2dCAwLjE1ODkwMyAwLjYyMTgwMAordnQgMC4xNTg5MDMgMC42MjM2MzcKK3Z0IDAuMTU0NDYwIDAuNjIzNjI0Cit2dCAwLjE1NDQ2MCAwLjYyMTc4OAordnQgMC4xNTczMDkgMC42MjM2MjQKK3Z0IDAuMTU3MzA5IDAuNjIxNzg4Cit2dCAwLjE1MjUxNSAwLjYyMTgwMAordnQgMC4xNTI1MTUgMC42MjM2MzcKK3Z0IDAuMTU5MjM1IDAuNjIxODAwCit2dCAwLjE1OTIzNSAwLjYyMzYzNwordnQgMC4xNTU4NzYgMC42MjMxNTAKK3Z0IDAuMTU1MDc5IDAuNjIzNjIzCit2dCAwLjE1NTA3OSAwLjYyMTc4NgordnQgMC4xNTU4NzYgMC42MjIyMzQKK3Z0IDAuMTU2NjczIDAuNjIxNzg2Cit2dCAwLjE1NjY3MyAwLjYyMzYyMwordnQgMC4xNTI4NjYgMC42MjYzOTMKK3Z0IDAuMTUyODY2IDAuNjI0NTU2Cit2dCAwLjE1MzY2MyAwLjYyNTAxNgordnQgMC4xNTM2NjMgMC42MjU5MzMKK3Z0IDAuMTU4MTA2IDAuNjI1OTMzCit2dCAwLjE1ODEwNiAwLjYyNTAxNgordnQgMC4xNTg5MDMgMC42MjQ1NTYKK3Z0IDAuMTU4OTAzIDAuNjI2MzkzCit2dCAwLjE1NDQ2MCAwLjYyNjM5MwordnQgMC4xNTQ0NjAgMC42MjQ1NDQKK3Z0IDAuMTU3MzA5IDAuNjI2MzkzCit2dCAwLjE1NzMwOSAwLjYyNDU0NAordnQgMC4xNTI1MTUgMC42MjQ1NTYKK3Z0IDAuMTUyNTE1IDAuNjI2MzkzCit2dCAwLjE1OTIzNSAwLjYyNDU1NgordnQgMC4xNTkyMzUgMC42MjYzOTMKK3Z0IDAuMTU1ODc2IDAuNjI1OTA2Cit2dCAwLjE1NTA3OSAwLjYyNjM2NgordnQgMC4xNTUwNzkgMC42MjQ1NDMKK3Z0IDAuMTU1ODc2IDAuNjI0OTkwCit2dCAwLjE1NjY3MyAwLjYyNDU0MwordnQgMC4xNTY2NzMgMC42MjYzNjYKK3Z0IDAuMTUyODY2IDAuNjI5MTQ5Cit2dCAwLjE1Mjg2NiAwLjYyNzMxMgordnQgMC4xNTM2NjMgMC42Mjc3NzIKK3Z0IDAuMTUzNjYzIDAuNjI4Njg5Cit2dCAwLjE1ODEwNiAwLjYyODY4OQordnQgMC4xNTgxMDYgMC42Mjc3NzIKK3Z0IDAuMTU4OTAzIDAuNjI3MzEyCit2dCAwLjE1ODkwMyAwLjYyOTE0OQordnQgMC4xNTQ0NjAgMC42MjkxMzYKK3Z0IDAuMTU0NDYwIDAuNjI3MzAwCit2dCAwLjE1NzMwOSAwLjYyOTEzNgordnQgMC4xNTczMDkgMC42MjczMDAKK3Z0IDAuMTUyNTE1IDAuNjI3MzEyCit2dCAwLjE1MjUxNSAwLjYyOTE0OQordnQgMC4xNTkyMzUgMC42MjczMTIKK3Z0IDAuMTU5MjM1IDAuNjI5MTQ5Cit2dCAwLjE1NTg3NiAwLjYyODY2MgordnQgMC4xNTUwNzkgMC42MjkxMzUKK3Z0IDAuMTU1MDc5IDAuNjI3Mjk5Cit2dCAwLjE1NTg3NiAwLjYyNzc0NgordnQgMC4xNTY2NzMgMC42MjcyOTkKK3Z0IDAuMTU2NjczIDAuNjI5MTM1Cit2dCAwLjE1Mjg2NiAwLjYzMTk1NgordnQgMC4xNTI4NjYgMC42MzAwNjgKK3Z0IDAuMTUzNjYzIDAuNjMwNjAxCit2dCAwLjE1MzY2MyAwLjYzMTQ5NgordnQgMC4xNTgxMDYgMC42MzE0OTYKK3Z0IDAuMTU4MTA2IDAuNjMwNjAxCit2dCAwLjE1ODkwMyAwLjYzMDA2OAordnQgMC4xNTg5MDMgMC42MzE5NTYKK3Z0IDAuMTU0NDYwIDAuNjMxOTU2Cit2dCAwLjE1NDQ2MCAwLjYzMDA1NQordnQgMC4xNTczMDkgMC42MzE5NTYKK3Z0IDAuMTU3MzA5IDAuNjMwMDU1Cit2dCAwLjE1MjUxNSAwLjYzMDA2OAordnQgMC4xNTI1MTUgMC42MzE5NTYKK3Z0IDAuMTU5MjM1IDAuNjMwMDY4Cit2dCAwLjE1OTIzNSAwLjYzMTk1NgordnQgMC4xNTU4NzYgMC42MzE0OTEKK3Z0IDAuMTU1MDc5IDAuNjMxOTUxCit2dCAwLjE1NTA3OSAwLjYzMDA1NQordnQgMC4xNTU4NzYgMC42MzA1NzUKK3Z0IDAuMTU2NjczIDAuNjMwMDU1Cit2dCAwLjE1NjY3MyAwLjYzMTk1MQordnQgMC4xNTU4NzYgMC42MzMzMzEKK3Z0IDAuMTU1ODc2IDAuNjM0MjQ4Cit2dCAwLjE1NTA3OSAwLjYzNDcwOAordnQgMC4xNTUwNzkgMC42MzI4NzEKK3Z0IDAuMTU2NjczIDAuNjMyODcxCit2dCAwLjE1NjY3MyAwLjYzNDcwOAordnQgMC4xNTI4NjcgMC42MzQ3MTIKK3Z0IDAuMTUyODY2IDAuNjMyODc1Cit2dCAwLjE1MzY2MyAwLjYzMzMzNQordnQgMC4xNTM2NjMgMC42MzQyNTIKK3Z0IDAuMTU4MTA2IDAuNjM0MjUyCit2dCAwLjE1ODEwNiAwLjYzMzMzNQordnQgMC4xNTg5MDMgMC42MzI4NzUKK3Z0IDAuMTU4OTAzIDAuNjM0NzEyCit2dCAwLjE1NDQ2MCAwLjYzNDcxMgordnQgMC4xNTQ0NjAgMC42MzI4NzUKK3Z0IDAuMTU3MzA5IDAuNjM0NzEyCit2dCAwLjE1NzMwOSAwLjYzMjg3NQordnQgMC4xNTI1MTUgMC42MzI4NzUKK3Z0IDAuMTUyODY3IDAuNjM1NjMyCit2dCAwLjE1MjUxNSAwLjYzNTYzMgordnQgMC4xNTI1MTUgMC42MzQ3MTIKK3Z0IDAuMTU5MjM1IDAuNjM0NzEyCit2dCAwLjE1OTIzNSAwLjYzNTYzMgordnQgMC4xNTg5MDMgMC42MzU2MzIKK3Z0IDAuMTU5MjM1IDAuNjMyODc1Cit2dCAwLjE1Nzc5NSAwLjYzNzMyMQordnQgMC4xNTg4OTcgMC42MzY5NjcKK3Z0IDAuMTU4MTA4IDAuNjM4ODI1Cit2dCAwLjE1Nzc5NSAwLjYzODI0MQordnQgMC4xNTI4NjUgMC42MzY5NzIKK3Z0IDAuMTUyNTEzIDAuNjM2OTcyCit2dCAwLjE1OTIzMCAwLjYzNjk2NwordnQgMC4xNTcwNjIgMC42Mzk2MzUKK3Z0IDAuMTU2OTkyIDAuNjM5MzAxCit2dCAwLjE1ODI0NyAwLjYzOTE1MAordnQgMC4xNTQ2NjUgMC42Mzk2NDAKK3Z0IDAuMTU0NzQwIDAuNjM5MzA2Cit2dCAwLjE1NTg3NiAwLjYzOTc3NwordnQgMC4xNTU4NzcgMC42NDAxMjAKK3Z0IDAuMTUzOTQ4IDAuNjM3MzIxCit2dCAwLjE1MzY2MyAwLjYzNjA5MgordnQgMC4xNTQ0NjAgMC42MDE1NzMKK3Z0IDAuMTUzNjYzIDAuNjAxMTI1Cit2dCAwLjE1MzY2MyAwLjYwMDI4MQordnQgMC4xNTQ0NjAgMC41OTk4MzMKK3Z0IDAuMTU4MTA2IDAuNjAxMTI1Cit2dCAwLjE1NzMwOSAwLjYwMTU3MwordnQgMC4xNTczMDkgMC41OTk4MzMKK3Z0IDAuMTU4MTA2IDAuNjAwMjgxCit2dCAwLjE1Mjg2NiAwLjYwMTU4NQordnQgMC4xNTI1MTUgMC42MDE1ODUKK3Z0IDAuMTUyNTE1IDAuNTk5ODIxCit2dCAwLjE1Mjg2NiAwLjU5OTgyMQordnQgMC4xNTkyMzUgMC42MDE1ODUKK3Z0IDAuMTU4OTAzIDAuNjAxNTg1Cit2dCAwLjE1NDc0NSAwLjYzNjg2MQordnQgMC4xNTUwNzkgMC42MzU2MjgKK3Z0IDAuMTU1ODc2IDAuNjM2MDg4Cit2dCAwLjE1NTU0MiAwLjYzNzMyMQordnQgMC4xNTY5OTggMC42MzY4NjEKK3Z0IDAuMTU3MzA5IDAuNjM1NjMyCit2dCAwLjE1ODEwNiAwLjYzNjA5MgordnQgMC4xNTYyMDEgMC42MzczMjEKK3Z0IDAuMTU2NjczIDAuNjM1NjI4Cit2dCAwLjE1NjIwMSAwLjYzODI0MQordnQgMC4xNTU1NDIgMC42MzgyNDEKK3Z0IDAuMTUzNTA3IDAuNjM5MTYwCit2dCAwLjE1MzY1OCAwLjYzODcwMgordnQgMC4xNTQ0NjAgMC42MzU2MzIKK3Z0IDAuMTUzOTQ4IDAuNjM4MjQxCit2dCAwLjE1NDc0NSAwLjYzODcwMQordnQgMC4xNTY5OTggMC42Mzg3MDEKK3Z0IDAuMTU2NjcyIDAuNjAxNTcyCit2dCAwLjE1NTA3OSAwLjYwMTU3MgordnQgMC4xNTM2NjMgMC42MDI5MDAKK3Z0IDAuMTUzNjYzIDAuNjAzOTUwCit2dCAwLjE1MjkyNCAwLjYwNDM3NwordnQgMC4xNTgxMDYgMC42MDI5MDAKK3Z0IDAuMTU4ODQ2IDAuNjAyNDczCit2dCAwLjE1ODg0NiAwLjYwNDM3NwordnQgMC4xNTgxMDYgMC42MDM5NTAKK3Z0IDAuMTU0NDAzIDAuNjAyNDYyCit2dCAwLjE1NDQwMyAwLjYwNDM2NQordnQgMC4xNTczNjcgMC42MDI0NjIKK3Z0IDAuMTU3MzY3IDAuNjA0MzY1Cit2dCAwLjE1NjYxNSAwLjYwMjQ2MAordnQgMC4xNTY2MTUgMC42MDE2MDUKK3Z0IDAuMTU1MTM2IDAuNjA0MzYzCit2dCAwLjE1NjYxNSAwLjYwNDM2MwordnQgMC4xNTczNjcgMC42MDUyMTgKK3Z0IDAuMTU0NDAzIDAuNjA1MjE4Cit2dCAwLjE1MjkyNCAwLjYwNTIyOQordnQgMC4xNTM2NjMgMC42MDY3MDYKK3Z0IDAuMTU4ODQ2IDAuNjA1MjI5Cit2dCAwLjE1ODg0NiAwLjYwNzEzMwordnQgMC4xNTgxMDYgMC42MDY3MDYKK3Z0IDAuMTU0NDAzIDAuNjA3MTIwCit2dCAwLjE1NzM2NyAwLjYwNzEyMAordnQgMC4xNTY2MTUgMC42MDUyMTYKK3Z0IDAuMTU1ODc2IDAuNjA1NjMxCit2dCAwLjE1NTg3NiAwLjYwNjY4MAordnQgMC4xNTY2MTUgMC42MDcxMTkKK3Z0IDAuMTU3MzY3IDAuNjA3OTc0Cit2dCAwLjE1NDQwMyAwLjYwNzk3NAordnQgMC4xNTM2NjMgMC42MDg0MTIKK3Z0IDAuMTUzNjYzIDAuNjA5NDYyCit2dCAwLjE1ODEwNiAwLjYwODQxMgordnQgMC4xNTg4NDYgMC42MDc5ODUKK3Z0IDAuMTU4ODQ2IDAuNjA5ODg5Cit2dCAwLjE1ODEwNiAwLjYwOTQ2MgordnQgMC4xNTQ0MDMgMC42MDk4NzYKK3Z0IDAuMTU3MzY3IDAuNjA5ODc2Cit2dCAwLjE1NjYxNSAwLjYwNzk3MgordnQgMC4xNTU4NzYgMC42MDgzODcKK3Z0IDAuMTU1MTM2IDAuNjA5ODc1Cit2dCAwLjE1NjYxNSAwLjYwOTg3NQordnQgMC4xNTczNjcgMC42MTA3MzAKK3Z0IDAuMTU0NDAzIDAuNjEzNDg3Cit2dCAwLjE1NDQwMyAwLjYxMjYzMwordnQgMC4xNTU4NzYgMC42MTIxOTMKK3Z0IDAuMTU1MTM2IDAuNjEwNzI3Cit2dCAwLjE1NTg3NiAwLjYxMTE0MwordnQgMC4xNTY2MTUgMC42MTI2MzEKK3Z0IDAuMTU2NjE1IDAuNjEwNzI3Cit2dCAwLjE1NzM2NyAwLjYxMjYzMwordnQgMC4xNTczNjcgMC42MTM0ODcKK3Z0IDAuMTU0NDAzIDAuNjEwNzMwCit2dCAwLjE1MjkyNCAwLjYxMDc0MQordnQgMC4xNTg4NDYgMC42MTA3NDEKK3Z0IDAuMTU4ODQ2IDAuNjEyNjQ1Cit2dCAwLjE1ODg0NiAwLjYxMzQ5OQordnQgMC4xNTM2NjMgMC42MTM5MjUKK3Z0IDAuMTUzNjYzIDAuNjE0OTc1Cit2dCAwLjE1ODEwNiAwLjYxMzkyNQordnQgMC4xNTg4NDYgMC42MTU0MDIKK3Z0IDAuMTU4MTA2IDAuNjE0OTc1Cit2dCAwLjE1NDQwMyAwLjYxNTM5MAordnQgMC4xNTczNjcgMC42MTUzOTAKK3Z0IDAuMTU2NjE1IDAuNjEzNDg1Cit2dCAwLjE1NTg3NiAwLjYxMzkwMAordnQgMC4xNTY2MTUgMC42MTUzODgKK3Z0IDAuMTU3MzY3IDAuNjE2MjQzCit2dCAwLjE1NDQwMyAwLjYxNjI0MwordnQgMC4xNTI5MjQgMC42MTgxNTgKK3Z0IDAuMTU4ODQ2IDAuNjE2MjU1Cit2dCAwLjE1ODg0NiAwLjYxODE1OAordnQgMC4xNTQ0MDMgMC42MTgxNDYKK3Z0IDAuMTU3MzY3IDAuNjE4MTQ2Cit2dCAwLjE1NTEzNiAwLjYxNjI0MQordnQgMC4xNTY2MTUgMC42MTYyNDEKK3Z0IDAuMTU1ODc2IDAuNjE3NzA1Cit2dCAwLjE1NjYxNSAwLjYxODE0NAordnQgMC4xNTczNjcgMC42MTg5OTkKK3Z0IDAuMTU0NDAzIDAuNjE4OTk5Cit2dCAwLjE1MzY2MyAwLjYxOTQzNwordnQgMC4xNTM2NjMgMC42MjA0ODcKK3Z0IDAuMTU4MTA2IDAuNjE5NDM3Cit2dCAwLjE1ODg0NiAwLjYxOTAxMAordnQgMC4xNTg4NDYgMC42MjA5MTQKK3Z0IDAuMTU4MTA2IDAuNjIwNDg3Cit2dCAwLjE1NDQwMyAwLjYyMDkwMgordnQgMC4xNTczNjcgMC42MjA5MDIKK3Z0IDAuMTU2NjE1IDAuNjE4OTk3Cit2dCAwLjE1NTg3NiAwLjYxOTQxMgordnQgMC4xNTU4NzYgMC42MjA0NjEKK3Z0IDAuMTU2NjE1IDAuNjIwOTAwCit2dCAwLjE1NzM2NyAwLjYyMTc1NQordnQgMC4xNTQ0MDMgMC42MjE3NTUKK3Z0IDAuMTUzNjY0IDAuNjIyMTkzCit2dCAwLjE1MjkyNCAwLjYyMzY3MAordnQgMC4xNTgxMDYgMC42MjIxOTMKK3Z0IDAuMTU4ODQ2IDAuNjIxNzY2Cit2dCAwLjE1ODg0NiAwLjYyMzY3MAordnQgMC4xNTQ0MDMgMC42MjM2NTgKK3Z0IDAuMTU3MzY3IDAuNjIzNjU4Cit2dCAwLjE1NjYxNSAwLjYyMTc1MgordnQgMC4xNTU4NzYgMC42MjMyMTcKK3Z0IDAuMTU1MTM2IDAuNjIzNjU2Cit2dCAwLjE1NjYxNSAwLjYyMzY1NgordnQgMC4xNTczNjcgMC42MjQ1MTEKK3Z0IDAuMTU0NDAzIDAuNjI0NTExCit2dCAwLjE1MjkyNCAwLjYyNDUyMwordnQgMC4xNTM2NjQgMC42MjQ5NTAKK3Z0IDAuMTUzNjYzIDAuNjI2MDAwCit2dCAwLjE1ODEwNiAwLjYyNDk1MAordnQgMC4xNTg4NDYgMC42MjQ1MjMKK3Z0IDAuMTU4ODQ2IDAuNjI2NDI2Cit2dCAwLjE1ODEwNiAwLjYyNjAwMAordnQgMC4xNTQ0MDMgMC42MjY0MjYKK3Z0IDAuMTU3MzY3IDAuNjI2NDI2Cit2dCAwLjE1NjYxNSAwLjYyNDUwOQordnQgMC4xNTU4NzYgMC42MjQ5MjQKK3Z0IDAuMTU1ODc2IDAuNjI1OTczCit2dCAwLjE1NjYxNSAwLjYyNjM5OQordnQgMC4xNTczNjcgMC42MjcyNjcKK3Z0IDAuMTU0NDAzIDAuNjI3MjY3Cit2dCAwLjE1MzY2MyAwLjYyNzcwNgordnQgMC4xNTM2NjQgMC42Mjg3NTYKK3Z0IDAuMTUyOTI0IDAuNjI5MTgzCit2dCAwLjE1ODEwNiAwLjYyNzcwNgordnQgMC4xNTg4NDYgMC42MjcyNzkKK3Z0IDAuMTU4ODQ2IDAuNjI5MTgzCit2dCAwLjE1ODEwNiAwLjYyODc1NgordnQgMC4xNTQ0MDMgMC42MjkxNzEKK3Z0IDAuMTU3MzY3IDAuNjI5MTcxCit2dCAwLjE1NjYxNSAwLjYyNzI2NQordnQgMC4xNTUxMzYgMC42MjkxNjkKK3Z0IDAuMTU2NjE1IDAuNjI5MTY5Cit2dCAwLjE1NzM2NyAwLjYzMDAyNAordnQgMC4xNTQ0MDMgMC42MzAwMjQKK3Z0IDAuMTUyOTI0IDAuNjMwMDM1Cit2dCAwLjE1MzY2MyAwLjYzMDUzMAordnQgMC4xNTM2NjQgMC42MzE1NjIKK3Z0IDAuMTU4MTA2IDAuNjMwNTMwCit2dCAwLjE1ODg0NiAwLjYzMDAzNQordnQgMC4xNTg4NDYgMC42MzE5ODkKK3Z0IDAuMTU4MTA2IDAuNjMxNTYyCit2dCAwLjE1NDQwMyAwLjYzMTk4OQordnQgMC4xNTczNjcgMC42MzE5ODkKK3Z0IDAuMTU1MTM2IDAuNjMwMDIyCit2dCAwLjE1NjYxNSAwLjYzMDAyMgordnQgMC4xNTU4NzYgMC42MzA1MDQKK3Z0IDAuMTU1ODc2IDAuNjMxNTU3Cit2dCAwLjE1NjYxNSAwLjYzMTk4NAordnQgMC4xNTczNjcgMC42MzI4NDEKK3Z0IDAuMTU0NDAzIDAuNjM1NTk5Cit2dCAwLjE1NDQwMyAwLjYzNDc0NQordnQgMC4xNTU4NzYgMC42MzQzMTQKK3Z0IDAuMTU1MTM2IDAuNjMyODM3Cit2dCAwLjE1NjYxNSAwLjYzNDc0MQordnQgMC4xNTY2MTUgMC42MzI4MzcKK3Z0IDAuMTU3MzY3IDAuNjM0NzQ1Cit2dCAwLjE1NzM2NyAwLjYzNTU5OQordnQgMC4xNTQ0MDMgMC42MzI4NDEKK3Z0IDAuMTUyOTI0IDAuNjMyODQxCit2dCAwLjE1ODg0NiAwLjYzMjg0MQordnQgMC4xNTg4NDYgMC42MzQ3NDUKK3Z0IDAuMTU4ODQ2IDAuNjM1NTk5Cit2dCAwLjE1ODEwNiAwLjYzNjAyNgordnQgMC4xNTM2NjQgMC42MzYwMjYKK3Z0IDAuMTU1ODc2IDAuNjM2MDIyCit2dCAwLjE1NjYxNSAwLjYzNTU5NQordnQgMC4xNTU4NzYgMC42MDExMDEKK3Z0IDAuMTU1ODc2IDAuNjAxMTY4Cit2dCAwLjE1NzM2NyAwLjYwMTYwNwordnQgMC4xNTM2NjMgMC42MDExOTEKK3Z0IDAuMTU4ODQ1IDAuNjAxNjE4Cit2dCAwLjE1ODEwNiAwLjYwMTE5MQordnQgMC4xNTQ0MDMgMC42MDE2MDcKK3Z0IDAuMTU0MDA2IDAuNjM3MzU0Cit2dCAwLjE1NDAwNiAwLjYzODIwOAordnQgMC4xNTQ3NDUgMC42Mzg2MzUKK3Z0IDAuMTU1NDg0IDAuNjM3MzU0Cit2dCAwLjE1NjI1OCAwLjYzNzM1NAordnQgMC4xNTYyNTggMC42MzgyMDgKK3Z0IDAuMTU2OTk4IDAuNjM4NjM1Cit2dCAwLjE1NzczNyAwLjYzODIwOAordnQgMC4xNTc3MzcgMC42MzczNTQKK3Z0IDAuMTU1ODc2IDAuNjAwMzA1Cit2dCAwLjE1NjY3MiAwLjU5OTgzNAordnQgMC4xNTg5MDMgMC41OTk4MjEKK3Z0IDAuMTU5MjM1IDAuNTk5ODIxCit2dCAwLjE1NTA3OSAwLjU5OTgzNAordnQgMC4xNTI4NjYgMC41OTcwNjIKK3Z0IDAuMTUzNjYzIDAuNTk3NTIyCit2dCAwLjE1MzY2MyAwLjU5ODQzOQordnQgMC4xNTI4NjYgMC41OTg4OTkKK3Z0IDAuMTU4MTA2IDAuNTk3NTIyCit2dCAwLjE1ODkwMyAwLjU5NzA2MgordnQgMC4xNTg5MDMgMC41OTg4OTkKK3Z0IDAuMTU4MTA2IDAuNTk4NDM5Cit2dCAwLjE1NDQ2MCAwLjU5NzA3NQordnQgMC4xNTQ0NjAgMC41OTg5MTIKK3Z0IDAuMTU3MzA5IDAuNTk4OTEyCit2dCAwLjE1NzMwOSAwLjU5NzA3NQordnQgMC4xNTI1MTUgMC41OTg4OTkKK3Z0IDAuMTUyNTE1IDAuNTk3MDYyCit2dCAwLjE1OTIzNSAwLjU5NzA2MgordnQgMC4xNTkyMzUgMC41OTg4OTkKK3Z0IDAuMTU1ODc2IDAuNTk3NTQ5Cit2dCAwLjE1NTg3NiAwLjU5ODQ2NQordnQgMC4xNTUwNzkgMC41OTg5MTIKK3Z0IDAuMTU1MDc5IDAuNTk3MDc2Cit2dCAwLjE1NjY3MiAwLjU5NzA3NgordnQgMC4xNTY2NzIgMC41OTg5MTIKK3Z0IDAuMTUyODY2IDAuNTk0MzA2Cit2dCAwLjE1MzY2MyAwLjU5NDc2NgordnQgMC4xNTM2NjMgMC41OTU2ODMKK3Z0IDAuMTUyODY2IDAuNTk2MTQzCit2dCAwLjE1ODEwNiAwLjU5NDc2NgordnQgMC4xNTg5MDMgMC41OTQzMDYKK3Z0IDAuMTU4OTAzIDAuNTk2MTQzCit2dCAwLjE1ODEwNiAwLjU5NTY4MwordnQgMC4xNTQ0NjAgMC41OTQzMTkKK3Z0IDAuMTU0NDYwIDAuNTk2MTU2Cit2dCAwLjE1NzMwOSAwLjU5NjE1NgordnQgMC4xNTczMDkgMC41OTQzMTkKK3Z0IDAuMTUyNTE1IDAuNTk2MTQzCit2dCAwLjE1MjUxNSAwLjU5NDMwNgordnQgMC4xNTkyMzUgMC41OTYxNDMKK3Z0IDAuMTU5MjM1IDAuNTk0MzA2Cit2dCAwLjE1NTg3NiAwLjU5NDc5MwordnQgMC4xNTU4NzYgMC41OTU3MDkKK3Z0IDAuMTU1MDc5IDAuNTk2MTU2Cit2dCAwLjE1NTA3OSAwLjU5NDMyMAordnQgMC4xNTY2NzIgMC41OTQzMjAKK3Z0IDAuMTU2NjcyIDAuNTk2MTU2Cit2dCAwLjE1Mjg2NiAwLjU5MTU1MAordnQgMC4xNTM2NjMgMC41OTIwMTAKK3Z0IDAuMTUzNjYzIDAuNTkyOTI3Cit2dCAwLjE1Mjg2NiAwLjU5MzM4NwordnQgMC4xNTgxMDYgMC41OTIwMTAKK3Z0IDAuMTU4OTAzIDAuNTkxNTUwCit2dCAwLjE1ODkwMyAwLjU5MzM4NwordnQgMC4xNTgxMDYgMC41OTI5MjcKK3Z0IDAuMTU0NDYwIDAuNTkxNTYzCit2dCAwLjE1NDQ2MCAwLjU5MzQwMAordnQgMC4xNTczMDkgMC41OTM0MDAKK3Z0IDAuMTU3MzA5IDAuNTkxNTYzCit2dCAwLjE1MjUxNSAwLjU5MzM4NwordnQgMC4xNTI1MTUgMC41OTE1NTAKK3Z0IDAuMTU5MjM1IDAuNTkzMzg3Cit2dCAwLjE1OTIzNSAwLjU5MTU1MAordnQgMC4xNTU4NzYgMC41OTIwMzgKK3Z0IDAuMTU1ODc2IDAuNTkyOTUzCit2dCAwLjE1NTA3OSAwLjU5MzQwMQordnQgMC4xNTUwNzkgMC41OTE1NjQKK3Z0IDAuMTU2NjcyIDAuNTkxNTY0Cit2dCAwLjE1NjY3MiAwLjU5MzQwMQordnQgMC4xNTU4NzYgMC41OTAxOTcKK3Z0IDAuMTU1MDc5IDAuNTkwNjQ1Cit2dCAwLjE1NTA3OSAwLjU4ODgwOAordnQgMC4xNTU4NzYgMC41ODkyODAKK3Z0IDAuMTU2NjcyIDAuNTg4ODA4Cit2dCAwLjE1NjY3MiAwLjU5MDY0NQordnQgMC4xNTI4NjYgMC41ODg3OTQKK3Z0IDAuMTUzNjYzIDAuNTg5MjU0Cit2dCAwLjE1MzY2MyAwLjU5MDE3MQordnQgMC4xNTI4NjYgMC41OTA2MzEKK3Z0IDAuMTU4MTA2IDAuNTg5MjU0Cit2dCAwLjE1ODkwMyAwLjU4ODc5NAordnQgMC4xNTg5MDMgMC41OTA2MzEKK3Z0IDAuMTU4MTA2IDAuNTkwMTcxCit2dCAwLjE1NDQ2MCAwLjU4ODgwNwordnQgMC4xNTQ0NjAgMC41OTA2NDQKK3Z0IDAuMTU3MzA5IDAuNTkwNjQ0Cit2dCAwLjE1NzMwOSAwLjU4ODgwNwordnQgMC4xNTI1MTUgMC41OTA2MzEKK3Z0IDAuMTUyODY2IDAuNTg3ODc0Cit2dCAwLjE1MjUxNSAwLjU4ODc5NAordnQgMC4xNTI1MTUgMC41ODc4NzQKK3Z0IDAuMTU4OTAzIDAuNTg3ODc0Cit2dCAwLjE1OTIzNSAwLjU4Nzg3NAordnQgMC4xNTkyMzUgMC41ODg3OTQKK3Z0IDAuMTU5MjM1IDAuNTkwNjMxCit2dCAwLjE1Mjg2NiAwLjU4NjAzNwordnQgMC4xNTM2NjMgMC41ODY0OTcKK3Z0IDAuMTUzNjYzIDAuNTg3NDE0Cit2dCAwLjE1ODEwNiAwLjU4NjQ5NwordnQgMC4xNTg5MDMgMC41ODYwMzcKK3Z0IDAuMTU4MTA2IDAuNTg3NDE0Cit2dCAwLjE1NDQ2MCAwLjU4NjA1MAordnQgMC4xNTQ0NjAgMC41ODc4ODcKK3Z0IDAuMTU3MzA5IDAuNTg3ODg3Cit2dCAwLjE1NzMwOSAwLjU4NjA1MAordnQgMC4xNTI1MTUgMC41ODYwMzcKK3Z0IDAuMTU5MjM1IDAuNTg2MDM3Cit2dCAwLjE1NTg3NiAwLjU4NjUyNAordnQgMC4xNTU4NzYgMC41ODc0NDAKK3Z0IDAuMTU1MDc5IDAuNTg3ODg3Cit2dCAwLjE1NTA3OSAwLjU4NjA1MQordnQgMC4xNTY2NzIgMC41ODYwNTEKK3Z0IDAuMTU2NjcyIDAuNTg3ODg3Cit2dCAwLjE1Mjg2NiAwLjU4MzI4MQordnQgMC4xNTM2NjMgMC41ODM3NDEKK3Z0IDAuMTUzNjYzIDAuNTg0NjU4Cit2dCAwLjE1Mjg2NiAwLjU4NTExOAordnQgMC4xNTgxMDYgMC41ODM3NDEKK3Z0IDAuMTU4OTAzIDAuNTgzMjgxCit2dCAwLjE1ODkwMyAwLjU4NTExOAordnQgMC4xNTgxMDYgMC41ODQ2NTgKK3Z0IDAuMTU0NDYwIDAuNTgzMjk0Cit2dCAwLjE1NDQ2MCAwLjU4NTEzMQordnQgMC4xNTczMDkgMC41ODUxMzEKK3Z0IDAuMTU3MzA5IDAuNTgzMjk0Cit2dCAwLjE1MjUxNSAwLjU4NTExOAordnQgMC4xNTI1MTUgMC41ODMyODEKK3Z0IDAuMTU5MjM1IDAuNTg1MTE4Cit2dCAwLjE1OTIzNSAwLjU4MzI4MQordnQgMC4xNTU4NzUgMC41ODM3NjgKK3Z0IDAuMTU1ODc1IDAuNTg0Njg0Cit2dCAwLjE1NTA3OSAwLjU4NTEzMQordnQgMC4xNTUwNzkgMC41ODMyOTUKK3Z0IDAuMTU2NjcyIDAuNTgzMjk1Cit2dCAwLjE1NjY3MiAwLjU4NTEzMQordnQgMC4xNTI4NjYgMC41ODA1MjUKK3Z0IDAuMTUzNjYzIDAuNTgwOTg1Cit2dCAwLjE1MzY2MyAwLjU4MTkwMgordnQgMC4xNTI4NjYgMC41ODIzNjIKK3Z0IDAuMTU4MTA2IDAuNTgwOTg1Cit2dCAwLjE1ODkwMyAwLjU4MDUyNQordnQgMC4xNTg5MDMgMC41ODIzNjIKK3Z0IDAuMTU4MTA2IDAuNTgxOTAyCit2dCAwLjE1NDQ2MCAwLjU4MDUzOAordnQgMC4xNTQ0NjAgMC41ODIzNzUKK3Z0IDAuMTU3MzA5IDAuNTgyMzc1Cit2dCAwLjE1NzMwOSAwLjU4MDUzOAordnQgMC4xNTI1MTUgMC41ODIzNjIKK3Z0IDAuMTUyNTE1IDAuNTgwNTI1Cit2dCAwLjE1OTIzNSAwLjU4MjM2MgordnQgMC4xNTkyMzUgMC41ODA1MjUKK3Z0IDAuMTU1ODc2IDAuNTgxMDEyCit2dCAwLjE1NTg3NSAwLjU4MTkyOAordnQgMC4xNTUwNzkgMC41ODIzNzYKK3Z0IDAuMTU1MDc5IDAuNTgwNTM5Cit2dCAwLjE1NjY3MiAwLjU4MDUzOQordnQgMC4xNTY2NzIgMC41ODIzNzYKK3Z0IDAuMTUyODY2IDAuNTc3NzY5Cit2dCAwLjE1MzY2MyAwLjU3ODIyOQordnQgMC4xNTM2NjMgMC41NzkxNDYKK3Z0IDAuMTUyODY2IDAuNTc5NjA2Cit2dCAwLjE1ODEwNiAwLjU3ODIyOQordnQgMC4xNTg5MDMgMC41Nzc3NjkKK3Z0IDAuMTU4OTAzIDAuNTc5NjA2Cit2dCAwLjE1ODEwNiAwLjU3OTE0NgordnQgMC4xNTQ0NjAgMC41Nzc3ODIKK3Z0IDAuMTU0NDYwIDAuNTc5NjE4Cit2dCAwLjE1NzMwOSAwLjU3OTYxOAordnQgMC4xNTczMDkgMC41Nzc3ODIKK3Z0IDAuMTUyNTE1IDAuNTc5NjA2Cit2dCAwLjE1MjUxNSAwLjU3Nzc2OQordnQgMC4xNTkyMzUgMC41Nzk2MDYKK3Z0IDAuMTU5MjM1IDAuNTc3NzY5Cit2dCAwLjE1NTg3NiAwLjU3ODI1NgordnQgMC4xNTU4NzYgMC41NzkxNzIKK3Z0IDAuMTU1MDc5IDAuNTc5NjIwCit2dCAwLjE1NTA3OSAwLjU3Nzc4MwordnQgMC4xNTY2NzIgMC41Nzc3ODMKK3Z0IDAuMTU2NjcyIDAuNTc5NjIwCit2dCAwLjE1Mjg2NiAwLjU3NTAxMwordnQgMC4xNTM2NjMgMC41NzU0NzIKK3Z0IDAuMTUzNjYzIDAuNTc2MzkwCit2dCAwLjE1Mjg2NiAwLjU3Njg1MAordnQgMC4xNTgxMDYgMC41NzU0NzIKK3Z0IDAuMTU4OTAzIDAuNTc1MDEzCit2dCAwLjE1ODkwMyAwLjU3Njg1MAordnQgMC4xNTgxMDYgMC41NzYzOTAKK3Z0IDAuMTU0NDYwIDAuNTc1MDEzCit2dCAwLjE1NDQ2MCAwLjU3Njg2MgordnQgMC4xNTczMDkgMC41NzY4NjIKK3Z0IDAuMTU3MzA5IDAuNTc1MDEzCit2dCAwLjE1MjUxNSAwLjU3Njg1MAordnQgMC4xNTI1MTUgMC41NzUwMTMKK3Z0IDAuMTU5MjM1IDAuNTc2ODUwCit2dCAwLjE1OTIzNSAwLjU3NTAxMwordnQgMC4xNTU4NzYgMC41NzU1MDAKK3Z0IDAuMTU1ODc2IDAuNTc2NDE2Cit2dCAwLjE1NTA3OSAwLjU3Njg2MwordnQgMC4xNTUwNzkgMC41NzUwNDAKK3Z0IDAuMTU2NjcyIDAuNTc1MDQwCit2dCAwLjE1NjY3MiAwLjU3Njg2MwordnQgMC4xNTI4NjYgMC41NzIyNTcKK3Z0IDAuMTUzNjYzIDAuNTcyNzE3Cit2dCAwLjE1MzY2MyAwLjU3MzYzNAordnQgMC4xNTI4NjYgMC41NzQwOTQKK3Z0IDAuMTU4MTA2IDAuNTcyNzE3Cit2dCAwLjE1ODkwMyAwLjU3MjI1NwordnQgMC4xNTg5MDMgMC41NzQwOTQKK3Z0IDAuMTU4MTA2IDAuNTczNjM0Cit2dCAwLjE1NDQ2MCAwLjU3MjI3MAordnQgMC4xNTQ0NjAgMC41NzQxMDYKK3Z0IDAuMTU3MzA5IDAuNTc0MTA2Cit2dCAwLjE1NzMwOSAwLjU3MjI3MAordnQgMC4xNTI1MTUgMC41NzQwOTQKK3Z0IDAuMTUyNTE1IDAuNTcyMjU3Cit2dCAwLjE1OTIzNSAwLjU3NDA5NAordnQgMC4xNTkyMzUgMC41NzIyNTcKK3Z0IDAuMTU1ODc1IDAuNTcyNzQ0Cit2dCAwLjE1NTg3NSAwLjU3MzY2MAordnQgMC4xNTUwNzkgMC41NzQxMDcKK3Z0IDAuMTU1MDc5IDAuNTcyMjcxCit2dCAwLjE1NjY3MiAwLjU3MjI3MQordnQgMC4xNTY2NzIgMC41NzQxMDcKK3Z0IDAuMTUyODY2IDAuNTY5NDUwCit2dCAwLjE1MzY2MyAwLjU2OTkxMAordnQgMC4xNTM2NjMgMC41NzA4MDUKK3Z0IDAuMTUyODY2IDAuNTcxMzM4Cit2dCAwLjE1ODEwNiAwLjU2OTkxMAordnQgMC4xNTg5MDMgMC41Njk0NTAKK3Z0IDAuMTU4OTAzIDAuNTcxMzM4Cit2dCAwLjE1ODEwNiAwLjU3MDgwNQordnQgMC4xNTQ0NjAgMC41Njk0NTAKK3Z0IDAuMTU0NDYwIDAuNTcxMzUxCit2dCAwLjE1NzMwOSAwLjU3MTM1MQordnQgMC4xNTczMDkgMC41Njk0NTAKK3Z0IDAuMTUyNTE1IDAuNTcxMzM4Cit2dCAwLjE1MjUxNSAwLjU2OTQ1MAordnQgMC4xNTkyMzUgMC41NzEzMzgKK3Z0IDAuMTU5MjM1IDAuNTY5NDUwCit2dCAwLjE1NTg3NSAwLjU2OTkxNQordnQgMC4xNTU4NzYgMC41NzA4MzEKK3Z0IDAuMTU1MDc5IDAuNTcxMzUxCit2dCAwLjE1NTA3OSAwLjU2OTQ1NQordnQgMC4xNTY2NzIgMC41Njk0NTUKK3Z0IDAuMTU2NjcyIDAuNTcxMzUxCit2dCAwLjE1NTg3NSAwLjU2ODA3NQordnQgMC4xNTUwNzkgMC41Njg1MzUKK3Z0IDAuMTU1MDc5IDAuNTY2Njk4Cit2dCAwLjE1NTg3NSAwLjU2NzE1OAordnQgMC4xNTY2NzIgMC41NjY2OTgKK3Z0IDAuMTU2NjcyIDAuNTY4NTM1Cit2dCAwLjE1Mjg2NiAwLjU2NjY5NAordnQgMC4xNTM2NjMgMC41NjcxNTQKK3Z0IDAuMTUzNjYzIDAuNTY4MDcxCit2dCAwLjE1Mjg2NiAwLjU2ODUzMQordnQgMC4xNTgxMDYgMC41NjcxNTQKK3Z0IDAuMTU4OTAzIDAuNTY2Njk0Cit2dCAwLjE1ODkwMyAwLjU2ODUzMQordnQgMC4xNTgxMDYgMC41NjgwNzEKK3Z0IDAuMTU0NDYwIDAuNTY2Njk0Cit2dCAwLjE1NDQ2MCAwLjU2ODUzMQordnQgMC4xNTczMDkgMC41Njg1MzEKK3Z0IDAuMTU3MzA5IDAuNTY2Njk0Cit2dCAwLjE1MjUxNSAwLjU2ODUzMQordnQgMC4xNTI4NjYgMC41NjU3NzQKK3Z0IDAuMTUyNTE1IDAuNTY2Njk0Cit2dCAwLjE1MjUxNSAwLjU2NTc3NAordnQgMC4xNTg5MDMgMC41NjU3NzQKK3Z0IDAuMTU5MjM1IDAuNTY1Nzc0Cit2dCAwLjE1OTIzNSAwLjU2NjY5NAordnQgMC4xNTkyMzUgMC41Njg1MzEKK3Z0IDAuMTU3Nzk0IDAuNTY0MTczCit2dCAwLjE1Nzc5NCAwLjU2MzI1MgordnQgMC4xNTgxMDcgMC41NjI0ODEKK3Z0IDAuMTU4OTAzIDAuNTY0Mzc1Cit2dCAwLjE1Mjg2NSAwLjU2NDM4OQordnQgMC4xNTI1MTMgMC41NjQzODgKK3Z0IDAuMTU5MjM1IDAuNTY0Mzc0Cit2dCAwLjE1NzA0OSAwLjU2MTcwNgordnQgMC4xNTgyNDYgMC41NjIyMDMKK3Z0IDAuMTU2OTc4IDAuNTYyMDQwCit2dCAwLjE1NDY2NSAwLjU2MTcxNAordnQgMC4xNTU4NzYgMC41NjEyMjQKK3Z0IDAuMTU1ODc1IDAuNTYxNTY3Cit2dCAwLjE1NDczOSAwLjU2MjA0OAordnQgMC4xNTM5NDggMC41NjQxNzMKK3Z0IDAuMTUzNjYzIDAuNTY1MzE0Cit2dCAwLjE1NDc0NSAwLjU2NDYzMwordnQgMC4xNTU1NDEgMC41NjQxNzMKK3Z0IDAuMTU1ODc1IDAuNTY1MzE4Cit2dCAwLjE1NTA3OSAwLjU2NTc3OAordnQgMC4xNTY5OTcgMC41NjQ2MzMKK3Z0IDAuMTU4MTA2IDAuNTY1MzE0Cit2dCAwLjE1NzMwOSAwLjU2NTc3NAordnQgMC4xNTYyMDEgMC41NjQxNzMKK3Z0IDAuMTU2NjcyIDAuNTY1Nzc4Cit2dCAwLjE1NTU0MSAwLjU2MzI1MgordnQgMC4xNTYyMDEgMC41NjMyNTIKK3Z0IDAuMTUzNTA3IDAuNTYyMTg0Cit2dCAwLjE1MzY1OCAwLjU2MjUwOQordnQgMC4xNTQ0NjAgMC41NjU3NzQKK3Z0IDAuMTUzOTQ4IDAuNTYzMjUyCit2dCAwLjE1NDc0NSAwLjU2Mjc5MgordnQgMC4xNTY5OTcgMC41NjI3OTIKK3Z0IDAuMTUzNjYzIDAuNTk4NTA2Cit2dCAwLjE1MjkyNCAwLjU5NzAyOQordnQgMC4xNTg4NDUgMC41OTg5MzIKK3Z0IDAuMTU4MTA2IDAuNTk4NTA2Cit2dCAwLjE1ODg0NSAwLjU5NzAyOQordnQgMC4xNTQ0MDMgMC41OTg5NDQKK3Z0IDAuMTU0NDAzIDAuNTk3MDQxCit2dCAwLjE1NzM2NyAwLjU5ODk0NAordnQgMC4xNTczNjcgMC41OTcwNDEKK3Z0IDAuMTU2NjE1IDAuNTk5ODAxCit2dCAwLjE1NjYxNSAwLjU5ODk0NgordnQgMC4xNTUxMzYgMC41OTcwNDMKK3Z0IDAuMTU2NjE1IDAuNTk3MDQzCit2dCAwLjE1NzM2NyAwLjU5NjE4OAordnQgMC4xNTQ0MDMgMC41OTYxODgKK3Z0IDAuMTUyOTI0IDAuNTk2MTc2Cit2dCAwLjE1MzY2MyAwLjU5NDcwMAordnQgMC4xNTg4NDUgMC41OTYxNzYKK3Z0IDAuMTU4MTA2IDAuNTk0NzAwCit2dCAwLjE1ODg0NSAwLjU5NDI3MwordnQgMC4xNTQ0MDMgMC41OTQyODUKK3Z0IDAuMTU3MzY3IDAuNTk0Mjg1Cit2dCAwLjE1NjYxNSAwLjU5NjE5MAordnQgMC4xNTU4NzYgMC41OTU3NzUKK3Z0IDAuMTU1ODc2IDAuNTk0NzI2Cit2dCAwLjE1NjYxNSAwLjU5NDI4NwordnQgMC4xNTczNjcgMC41OTM0MzIKK3Z0IDAuMTU0NDAzIDAuNTkzNDMyCit2dCAwLjE1MzY2MyAwLjU5Mjk5NAordnQgMC4xNTM2NjMgMC41OTE5NDQKK3Z0IDAuMTU4ODQ1IDAuNTkzNDIxCit2dCAwLjE1ODEwNiAwLjU5Mjk5NAordnQgMC4xNTgxMDYgMC41OTE5NDQKK3Z0IDAuMTU4ODQ1IDAuNTkxNTE3Cit2dCAwLjE1NDQwMyAwLjU5MTUyOQordnQgMC4xNTczNjcgMC41OTE1MjkKK3Z0IDAuMTU2NjE1IDAuNTkzNDM0Cit2dCAwLjE1NTEzNiAwLjU5MTUzMQordnQgMC4xNTY2MTUgMC41OTE1MzEKK3Z0IDAuMTU3MzY3IDAuNTkwNjc2Cit2dCAwLjE1NDQwMyAwLjU4ODc3MwordnQgMC4xNTQ0MDMgMC41ODc5MTkKK3Z0IDAuMTU1ODc2IDAuNTg5MjEzCit2dCAwLjE1NTg3NiAwLjU5MDI2MwordnQgMC4xNTUxMzYgMC41OTA2NzkKK3Z0IDAuMTU2NjE1IDAuNTg4Nzc1Cit2dCAwLjE1NjYxNSAwLjU5MDY3OQordnQgMC4xNTczNjcgMC41ODc5MTkKK3Z0IDAuMTU3MzY3IDAuNTg4NzczCit2dCAwLjE1NDQwMyAwLjU5MDY3NgordnQgMC4xNTI5MjQgMC41OTA2NjUKK3Z0IDAuMTUzNjYzIDAuNTg5MTg4Cit2dCAwLjE1ODg0NSAwLjU5MDY2NQordnQgMC4xNTgxMDYgMC41ODkxODgKK3Z0IDAuMTU4ODQ1IDAuNTg4NzYxCit2dCAwLjE1ODg0NSAwLjU4NzkwNwordnQgMC4xNTM2NjMgMC41ODc0ODAKK3Z0IDAuMTUzNjYzIDAuNTg2NDMwCit2dCAwLjE1ODEwNiAwLjU4NzQ4MAordnQgMC4xNTgxMDYgMC41ODY0MzAKK3Z0IDAuMTU4ODQ1IDAuNTg2MDA0Cit2dCAwLjE1NDQwMyAwLjU4NjAxNgordnQgMC4xNTczNjcgMC41ODYwMTYKK3Z0IDAuMTU2NjE1IDAuNTg3OTIxCit2dCAwLjE1NTg3NiAwLjU4NzUwNgordnQgMC4xNTUxMzYgMC41ODYwMTgKK3Z0IDAuMTU2NjE1IDAuNTg2MDE4Cit2dCAwLjE1NzM2NyAwLjU4NTE2MwordnQgMC4xNTQ0MDMgMC41ODUxNjMKK3Z0IDAuMTUyOTI0IDAuNTg1MTUxCit2dCAwLjE1MjkyNCAwLjU4MzI0OAordnQgMC4xNTg4NDUgMC41ODUxNTEKK3Z0IDAuMTU4ODQ1IDAuNTgzMjQ4Cit2dCAwLjE1NDQwMyAwLjU4MzI2MAordnQgMC4xNTczNjcgMC41ODMyNjAKK3Z0IDAuMTU1MTM2IDAuNTg1MTY1Cit2dCAwLjE1NjYxNSAwLjU4NTE2NQordnQgMC4xNTU4NzYgMC41ODM3MDEKK3Z0IDAuMTU2NjE1IDAuNTgzMjYyCit2dCAwLjE1NzM2NyAwLjU4MjQwNwordnQgMC4xNTQ0MDMgMC41ODI0MDcKK3Z0IDAuMTUzNjYzIDAuNTgxOTY5Cit2dCAwLjE1MzY2MyAwLjU4MDkxOQordnQgMC4xNTg4NDUgMC41ODIzOTUKK3Z0IDAuMTU4MTA2IDAuNTgxOTY5Cit2dCAwLjE1ODEwNiAwLjU4MDkxOQordnQgMC4xNTg4NDUgMC41ODA0OTIKK3Z0IDAuMTU0NDAzIDAuNTgwNTA0Cit2dCAwLjE1NzM2NyAwLjU4MDUwNAordnQgMC4xNTY2MTUgMC41ODI0MDkKK3Z0IDAuMTU1ODc2IDAuNTgxOTk0Cit2dCAwLjE1NTg3NiAwLjU4MDk0NQordnQgMC4xNTY2MTUgMC41ODA1MDYKK3Z0IDAuMTU3MzY3IDAuNTc5NjUxCit2dCAwLjE1NDQwMyAwLjU3OTY1MQordnQgMC4xNTM2NjMgMC41NzkyMTMKK3Z0IDAuMTUyOTI0IDAuNTc3NzM2Cit2dCAwLjE1ODg0NSAwLjU3OTY0MAordnQgMC4xNTgxMDYgMC41NzkyMTMKK3Z0IDAuMTU4ODQ1IDAuNTc3NzM2Cit2dCAwLjE1NDQwMyAwLjU3Nzc0OAordnQgMC4xNTczNjcgMC41Nzc3NDgKK3Z0IDAuMTU1MTM2IDAuNTc5NjU0Cit2dCAwLjE1NjYxNSAwLjU3OTY1NAordnQgMC4xNTU4NzYgMC41NzgxODkKK3Z0IDAuMTU2NjE1IDAuNTc3NzUwCit2dCAwLjE1NzM2NyAwLjU3Njg5NQordnQgMC4xNTQ0MDMgMC41NzY4OTUKK3Z0IDAuMTUzNjYzIDAuNTc2NDU2Cit2dCAwLjE1MjkyNCAwLjU3Njg4MwordnQgMC4xNTM2NjMgMC41NzU0MDYKK3Z0IDAuMTU4ODQ1IDAuNTc2ODgzCit2dCAwLjE1ODEwNiAwLjU3NjQ1NgordnQgMC4xNTgxMDYgMC41NzU0MDYKK3Z0IDAuMTU4ODQ1IDAuNTc0OTc5Cit2dCAwLjE1NDQwMyAwLjU3NDk3OQordnQgMC4xNTczNjcgMC41NzQ5NzkKK3Z0IDAuMTU2NjE1IDAuNTc2ODk3Cit2dCAwLjE1NTg3NiAwLjU3NjQ4MgordnQgMC4xNTU4NzYgMC41NzU0MzMKK3Z0IDAuMTU2NjE1IDAuNTc1MDA2Cit2dCAwLjE1NzM2NyAwLjU3NDEzOQordnQgMC4xNTQ0MDMgMC41NzQxMzkKK3Z0IDAuMTUzNjYzIDAuNTczNzAwCit2dCAwLjE1MjkyNCAwLjU3MjIyMwordnQgMC4xNTM2NjMgMC41NzI2NTAKK3Z0IDAuMTU4ODQ1IDAuNTc0MTI3Cit2dCAwLjE1ODEwNiAwLjU3MzcwMAordnQgMC4xNTgxMDYgMC41NzI2NTAKK3Z0IDAuMTU4ODQ1IDAuNTcyMjIzCit2dCAwLjE1NDQwMyAwLjU3MjIzNQordnQgMC4xNTczNjcgMC41NzIyMzUKK3Z0IDAuMTU2NjE1IDAuNTc0MTQxCit2dCAwLjE1NTEzNiAwLjU3MjIzNwordnQgMC4xNTY2MTUgMC41NzIyMzcKK3Z0IDAuMTU3MzY3IDAuNTcxMzgyCit2dCAwLjE1NDQwMyAwLjU3MTM4MgordnQgMC4xNTM2NjMgMC41NzA4NzYKK3Z0IDAuMTUyOTI0IDAuNTcxMzcwCit2dCAwLjE1MjkyNCAwLjU2OTQxNwordnQgMC4xNTM2NjMgMC41Njk4NDQKK3Z0IDAuMTU4ODQ1IDAuNTcxMzcwCit2dCAwLjE1ODEwNiAwLjU3MDg3NgordnQgMC4xNTgxMDYgMC41Njk4NDQKK3Z0IDAuMTU4ODQ1IDAuNTY5NDE3Cit2dCAwLjE1NDQwMyAwLjU2OTQxNwordnQgMC4xNTczNjcgMC41Njk0MTcKK3Z0IDAuMTU2NjE1IDAuNTcxMzg0Cit2dCAwLjE1NTg3NiAwLjU3MDkwMQordnQgMC4xNTUxMzYgMC41Njk0MjIKK3Z0IDAuMTU1ODc2IDAuNTY5ODQ5Cit2dCAwLjE1NjYxNSAwLjU2OTQyMgordnQgMC4xNTczNjcgMC41Njg1NjUKK3Z0IDAuMTU0NDAzIDAuNTY2NjYxCit2dCAwLjE1NDQwMyAwLjU2NTgwNwordnQgMC4xNTU4NzYgMC41NjcwOTEKK3Z0IDAuMTU1MTM2IDAuNTY4NTY5Cit2dCAwLjE1NjYxNSAwLjU2NjY2NQordnQgMC4xNTY2MTUgMC41Njg1NjkKK3Z0IDAuMTU3MzY3IDAuNTY1ODA3Cit2dCAwLjE1NzM2NyAwLjU2NjY2MQordnQgMC4xNTQ0MDMgMC41Njg1NjUKK3Z0IDAuMTUyOTI0IDAuNTY4NTY1Cit2dCAwLjE1MzY2MyAwLjU2NzA4OAordnQgMC4xNTg4NDUgMC41Njg1NjUKK3Z0IDAuMTU4MTA2IDAuNTY3MDg4Cit2dCAwLjE1ODg0NSAwLjU2NjY2MQordnQgMC4xNTg4NDUgMC41NjU4MDcKK3Z0IDAuMTU4MTA2IDAuNTY1MzgwCit2dCAwLjE1MzY2MyAwLjU2NTM4MAordnQgMC4xNTU4NzYgMC41NjUzODQKK3Z0IDAuMTU2NjE1IDAuNTY1ODExCit2dCAwLjE1NTg3NiAwLjYwMDIzOAordnQgMC4xNTczNjcgMC41OTk3OTkKK3Z0IDAuMTUzNjYzIDAuNjAwMjE1Cit2dCAwLjE1ODEwNiAwLjYwMDIxNQordnQgMC4xNTg4NDUgMC41OTk3ODgKK3Z0IDAuMTU0NDAzIDAuNTk5Nzk5Cit2dCAwLjE1NDAwNSAwLjU2MzI4NQordnQgMC4xNTQwMDUgMC41NjQxMzkKK3Z0IDAuMTU0NzQ1IDAuNTYyODU5Cit2dCAwLjE1NTQ4NCAwLjU2NDEzOQordnQgMC4xNTYyNTggMC41NjMyODUKK3Z0IDAuMTU2MjU4IDAuNTY0MTM5Cit2dCAwLjE1Njk5OCAwLjU2Mjg1OQordnQgMC4xNTc3MzcgMC41NjMyODUKK3Z0IDAuMTU3NzM3IDAuNTY0MTM5Cit2dCAwLjUzNjUyNyAwLjAzMzYxMQordnQgMC41MzY1MTkgMC4wMzA1ODUKK3Z0IDAuNTM4NjkzIDAuMDMxNDY1Cit2dCAwLjUzOTU4MSAwLjAzMzYxMAordnQgMC41MzMwMjEgMC4wMzA1ODUKK3Z0IDAuNTM4Njk0IDAuMDM1NzU4Cit2dCAwLjUzNjUzNSAwLjAzNjY3MAordnQgMC41MzMwMjEgMC4wMzY2NzAKK3Z0IDAuNTI5OTE2IDAuMDM2NjcwCit2dCAwLjUyNzc0MCAwLjAzNTc2NgordnQgMC41MjY4NDMgMC4wMzM2MTIKK3Z0IDAuNTI3NzU0IDAuMDMxNDY5Cit2dCAwLjUyOTkwMiAwLjAzMDU4NQordnQgMC41Mjk5MDkgMC4wMzM2MTEKK3Z0IDAuNTMzMDIxIDAuMDMzNjExCit2dCAwLjEwMjU5NSAwLjgyMDk5OQordnQgMC4xMDI1OTUgMC44MjAxNjAKK3Z0IDAuMTA1OTgzIDAuODIwMTYzCit2dCAwLjEwNTk4MyAwLjgyMTAwMgordnQgMC4yNzgzMTAgMC44MDkyNDIKK3Z0IDAuMjc4Mjk3IDAuODA2MTg2Cit2dCAwLjI4MTY4NSAwLjgwNjE4NgordnQgMC4yODE2OTggMC44MDkyNDIKK3Z0IDAuMTAyNjAwIDAuODI0MDMzCit2dCAwLjEwNTk4OCAwLjgyNDAzNgordnQgMC4zMzQzNTggMC44MTEyNTUKK3Z0IDAuMzM0MzczIDAuODEzNjEwCit2dCAwLjMzMDk4NSAwLjgxMzYxMAordnQgMC4zMzA5NzAgMC44MTEyNTUKK3Z0IDAuMzM0MzUyIDAuODA3OTk2Cit2dCAwLjMzMDk2NCAwLjgwNzk5NwordnQgMC4zMzQzNTggMC44MDQ3NTkKK3Z0IDAuMzMwOTcwIDAuODA0NzYwCit2dCAwLjMzNDM3MyAwLjgwMjQ2MAordnQgMC4zMzA5ODUgMC44MDI0NjAKK3Z0IDAuNjk2NDEyIDAuNzMzODUxCit2dCAwLjY5NjQyMCAwLjczNDY5MQordnQgMC42OTYwODAgMC43MzQ2OTEKK3Z0IDAuMTAyNTk4IDAuODE2OTY5Cit2dCAwLjEwNTk4NiAwLjgxNjk3MgordnQgMC4yODE2OTggMC44MTAwODIKK3Z0IDAuMjc4MzEwIDAuODEwMDgyCit2dCAwLjY4NDQwNCAwLjczNDY5MQordnQgMC42ODQ0MTIgMC43MzM4NTEKK3Z0IDAuNjg0NzQ2IDAuNzM0NjkxCit2dCAwLjI4MTY5OSAwLjgxNjM5MwordnQgMC4yODE2OTkgMC44MTY0NjcKK3Z0IDAuMjc4MzExIDAuODE2NDY3Cit2dCAwLjI3ODMxMSAwLjgxNjM5MwordnQgMC42OTQ5NTUgMC43MzIxNjcKK3Z0IDAuNjk1MzA2IDAuNzMxOTcyCit2dCAwLjY5NTY3MyAwLjczNDY5MQordnQgMC42OTY0MjAgMC43NDEwMDMKK3Z0IDAuNjk2NDIwIDAuNzQxMDc3Cit2dCAwLjY5NTMwNiAwLjc0MTA3NwordnQgMC42OTUzMDYgMC43NDEwMDMKK3Z0IDAuNjkwNDEyIDAuNzQxMDA0Cit2dCAwLjY5MDQxMiAwLjc0MTA3NwordnQgMC42ODY5NzYgMC43NDEwNzcKK3Z0IDAuNjg2OTkxIDAuNzQxMDA0Cit2dCAwLjY4NTUyMSAwLjczMTk3MgordnQgMC42ODU4NzIgMC43MzIxNjcKK3Z0IDAuNjg1MTUzIDAuNzM0NjkxCit2dCAwLjY5MDQxMiAwLjcyODIxNgordnQgMC42OTA0MTIgMC43MjkyOTkKK3Z0IDAuNjg3NTU1IDAuNzMwMDM2Cit2dCAwLjY4NzI4NyAwLjcyOTA1MAordnQgMC42OTMyNzIgMC43MzAwMzYKK3Z0IDAuNjkzMDY3IDAuNzMwMzcwCit2dCAwLjY5MDQxMiAwLjcyOTY4NgordnQgMC42OTA0MTIgMC43NDAwODkKK3Z0IDAuNjkwNDEyIDAuNzM5NzAyCit2dCAwLjY5MzA2NyAwLjczOTAxNwordnQgMC42OTMyNzIgMC43MzkzNTEKK3Z0IDAuNjg1ODcyIDAuNzM3MjIwCit2dCAwLjY4NTUyMSAwLjczNzQxNQordnQgMC42ODc3NjAgMC43MzAzNzAKK3Z0IDAuNjk1MzA2IDAuNzM3NDE1Cit2dCAwLjY5NDk1NSAwLjczNzIyMAordnQgMC42ODc1NTUgMC43MzkzNTEKK3Z0IDAuNjg3NzYwIDAuNzM5MDE3Cit2dCAwLjY4NTEwMiAwLjczMTI0NAordnQgMC42OTM1MzggMC43MjkwNTAKK3Z0IDAuNjk1NzIzIDAuNzMxMjQ1Cit2dCAwLjY5MzgzNiAwLjc0MTAwNAordnQgMC42ODU1MjEgMC43NDEwMDMKK3Z0IDAuMTAyNjAwIDAuODEzODUyCit2dCAwLjEwNTk4OCAwLjgxMzg1NQordnQgMC4yODE2OTggMC44MTMyNzQKK3Z0IDAuMjc4MzExIDAuODEzMjc0Cit2dCAwLjY4NDQwNCAwLjczNzc0NwordnQgMC42OTY0MjAgMC43Mzc3NDcKK3Z0IDAuNjgzOTQ1IDAuNzM0Njk0Cit2dCAwLjY4Mzk0NSAwLjczMzg1NAordnQgMC4yODIxMTkgMC44MDY2NTMKK3Z0IDAuNjk1OTg5IDAuNzMwNzg1Cit2dCAwLjY5Njg4MCAwLjczMzg1NAordnQgMC41MDM5NTUgMC45MzE2NDgKK3Z0IDAuNTAzNTg2IDAuOTI5MDk2Cit2dCAwLjUwMzk1NSAwLjkyODU2NgordnQgMC42OTM2NjEgMC43Mjg1OTkKK3Z0IDAuNjkwNDEyIDAuNzI3NzY2Cit2dCAwLjY4NzE2NCAwLjcyODU5OQordnQgMC42ODQ4MzUgMC43MzA3ODUKK3Z0IDAuNjg0NDA0IDAuNzQxMDAzCit2dCAwLjY4NDQwNCAwLjc0MTA3NwordnQgMC42ODM5NDUgMC43NDEwODAKK3Z0IDAuNjgzOTQ1IDAuNzQxMDA2Cit2dCAwLjY5Njg4MCAwLjczNDY5NAordnQgMC42OTY4ODAgMC43Mzc4ODcKK3Z0IDAuNjgzOTQ1IDAuNzM3ODg3Cit2dCAwLjY5Njg4MCAwLjc0MTAwNgordnQgMC4yNzgzMDIgMC44MzM5NjAKK3Z0IDAuMjgwMTEyIDAuODM0MjYyCit2dCAwLjI4MDEyNCAwLjgzNjE3MwordnQgMC4yNzgzMTMgMC44MzU2NDIKK3Z0IDAuMjc4Mjk3IDAuODMxNjA3Cit2dCAwLjI4MDEwNyAwLjgzMTU5OQordnQgMC4yNzgzMDIgMC44MjkyNzMKK3Z0IDAuMjgwMTEyIDAuODI4OTU3Cit2dCAwLjI3ODMxMyAwLjgyNzYzMQordnQgMC4yODAxMjQgMC44MjcwOTIKK3Z0IDAuNTE3NDAyIDAuODgxMzM3Cit2dCAwLjUxOTIwNyAwLjg4MTM0OAordnQgMC41MTkyMTcgMC44ODM4NjAKK3Z0IDAuNTE3NDEwIDAuODgzNTU3Cit2dCAwLjUxNzQxMCAwLjg3OTA5NAordnQgMC41MTkyMTcgMC44Nzg4MDgKK3Z0IDAuMDgyOTYwIDAuODI4MTI2Cit2dCAwLjA4MTE0MyAwLjgyNzgxOAordnQgMC4wODExNTQgMC44MjU5MjUKK3Z0IDAuMDgyOTcwIDAuODI2NDU4Cit2dCAwLjA4Mjk1NiAwLjgzMDQ3MAordnQgMC4wODExMzggMC44MzA0NzIKK3Z0IDAuMDgyOTYwIDAuODMyODEzCit2dCAwLjA4MTE0MyAwLjgzMzEyNAordnQgMC4wODI5NzAgMC44MzQ0NzAKK3Z0IDAuMDgxMTU0IDAuODM1MDA2Cit2dCAwLjc2NTUyMyAwLjg4MTIxOQordnQgMC43NjM3MDQgMC44ODEyNDIKK3Z0IDAuNzYzNzExIDAuODc4Njg4Cit2dCAwLjc2NTUyOSAwLjg3ODk2MgordnQgMC43NjU1MjkgMC44ODM0MjMKK3Z0IDAuNzYzNzExIDAuODgzNzM3Cit2dCAwLjQwMzA4NiAwLjc5MDM4OAordnQgMC4zOTk2OTggMC43OTAzODgKK3Z0IDAuMzk5Njk4IDAuNzg5ODcxCit2dCAwLjQwMzA4NiAwLjc4OTg3MQordnQgMC4zOTk2OTggMC44MDEyNDYKK3Z0IDAuMzk5MjYxIDAuODAxMjI4Cit2dCAwLjM5OTI2MSAwLjc5OTc3MwordnQgMC4zOTk2OTggMC43OTk4OTYKK3Z0IDAuNjkzODUxIDAuNzQxMDc3Cit2dCAwLjY4NTUyMSAwLjc0MTA3NwordnQgMC4xMDU5ODggMC44MTM3ODEKK3Z0IDAuMTAyNjAwIDAuODEzNzc4Cit2dCAwLjY5Njg4MCAwLjc0MTA4MAordnQgMC40MDMwODYgMC43OTk4OTYKK3Z0IDAuMzk5Njk4IDAuNzk2MzM4Cit2dCAwLjQwMzA4NiAwLjc5NjMzOAordnQgMC4zOTkyNjEgMC43OTI5MDAKK3Z0IDAuMzk5Njk4IDAuNzkyNzc5Cit2dCAwLjM5OTI2MSAwLjc5NjMzOAordnQgMC40MDMwODYgMC43OTE0MzAKK3Z0IDAuMzk5Njk4IDAuNzkxNDMwCit2dCAwLjM5OTI2MSAwLjc5MDMzMQordnQgMC40MDMwODYgMC44MDI4MDQKK3Z0IDAuMzk5Njk4IDAuODAyODA0Cit2dCAwLjM5OTY5OCAwLjgwMjI4NwordnQgMC40MDMwODYgMC44MDIyODcKK3Z0IDAuMzk5MjYxIDAuODAyMzQ1Cit2dCAwLjQwMzA4NiAwLjgwMTI0NgordnQgMC40MDMwODYgMC43OTI3NzkKK3Z0IDAuMzk5MjYxIDAuNzkxNDQ1Cit2dCAwLjM5OTI2MSAwLjgxNjUyOAordnQgMC40MDI2NDkgMC44MTY1MzEKK3Z0IDAuNDAyNjQ5IDAuODE3MzcwCit2dCAwLjM5OTI2MiAwLjgxNzM3MgordnQgMC43ODE1MDggMC44MTMxNjYKK3Z0IDAuNzg0ODk1IDAuODEzMTY2Cit2dCAwLjc4NDg4NCAwLjgxNjI0OQordnQgMC43ODE0OTcgMC44MTYyNDkKK3Z0IDAuMzk5MjY2IDAuODEzNDMxCit2dCAwLjQwMjY1NCAwLjgxMzQyOQordnQgMC4xNjY2ODkgMC44MTE0OTAKK3Z0IDAuMTcwMDc3IDAuODExNDkwCit2dCAwLjE3MDA5MiAwLjgxMzgxMQordnQgMC4xNjY3MDQgMC44MTM4MTEKK3Z0IDAuMTY2Njg0IDAuODA4MjQ1Cit2dCAwLjE3MDA3MiAwLjgwODI0NQordnQgMC4xNjY2ODkgMC44MDQ5OTUKK3Z0IDAuMTcwMDc3IDAuODA0OTk1Cit2dCAwLjE2NjcwNCAwLjgwMjY2MAordnQgMC4xNzAwOTIgMC44MDI2NjAKK3Z0IDAuNzIwMDc4IDAuNzM0OTEyCit2dCAwLjcxOTc0NiAwLjczNDA3MgordnQgMC43MjAwODYgMC43MzQwNzIKK3Z0IDAuNDAyNjUyIDAuODIwNTYxCit2dCAwLjM5OTI2NCAwLjgyMDU2OAordnQgMC43ODE1MDcgMC44MTIzMjYKK3Z0IDAuNzg0ODk1IDAuODEyMzI2Cit2dCAwLjcwODA3MCAwLjczNDA3MgordnQgMC43MDg0MTIgMC43MzQwNzIKK3Z0IDAuNzA4MDc5IDAuNzM0OTEyCit2dCAwLjc4NDg5NCAwLjgwNjAxNQordnQgMC43ODE1MDYgMC44MDYwMTcKK3Z0IDAuNzgxNTA2IDAuODA1OTQzCit2dCAwLjc4NDg5NCAwLjgwNTk0MQordnQgMC43MTg2MjEgMC43MzY1OTYKK3Z0IDAuNzE5MzM5IDAuNzM0MDcyCit2dCAwLjcxODk3MiAwLjczNjc5MgordnQgMC43MjAwODYgMC43Mjc3NjAKK3Z0IDAuNzE4OTcyIDAuNzI3NzYwCit2dCAwLjcxODk3MiAwLjcyNzY4NgordnQgMC43MjAwODYgMC43Mjc2ODYKK3Z0IDAuNzE0MDc4IDAuNzI3NzU5Cit2dCAwLjcxMDY1NyAwLjcyNzc2MAordnQgMC43MTA2NDMgMC43Mjc2ODYKK3Z0IDAuNzE0MDc4IDAuNzI3Njg2Cit2dCAwLjcwODgxOSAwLjczNDA3MgordnQgMC43MDk1MzggMC43MzY1OTYKK3Z0IDAuNzA5MTg3IDAuNzM2NzkyCit2dCAwLjcxNDA3OCAwLjc0MDU0NwordnQgMC43MTA5NTMgMC43Mzk3MTMKK3Z0IDAuNzExMjIxIDAuNzM4NzI4Cit2dCAwLjcxNDA3OCAwLjczOTQ2NAordnQgMC43MTQwNzggMC43MzkwNzcKK3Z0IDAuNzE2NzMzIDAuNzM4MzkzCit2dCAwLjcxNjkzOCAwLjczODcyOAordnQgMC43MTQwNzggMC43Mjg2NzUKK3Z0IDAuNzE2OTM4IDAuNzI5NDEyCit2dCAwLjcxNjczMyAwLjcyOTc0NwordnQgMC43MTQwNzggMC43MjkwNjIKK3Z0IDAuNzA5MTg3IDAuNzMxMzQ4Cit2dCAwLjcwOTUzOCAwLjczMTU0NAordnQgMC43MTE0MjYgMC43MzgzOTMKK3Z0IDAuNzE4NjIxIDAuNzMxNTQ0Cit2dCAwLjcxODk3MiAwLjczMTM0OAordnQgMC43MTE0MjYgMC43Mjk3NDcKK3Z0IDAuNzExMjIxIDAuNzI5NDEyCit2dCAwLjcwODc2OCAwLjczNzUyMAordnQgMC43MTcyMDQgMC43Mzk3MTMKK3Z0IDAuNzE5Mzg5IDAuNzM3NTE5Cit2dCAwLjcxNzUwMiAwLjcyNzc2MAordnQgMC43MDkxODcgMC43Mjc3NjAKK3Z0IDAuNDAyNjU0IDAuODIzNjc4Cit2dCAwLjM5OTI2NiAwLjgyMzY3NwordnQgMC43ODQ4OTUgMC44MDkxMzMKK3Z0IDAuNzgxNTA3IDAuODA5MTMzCit2dCAwLjcwODA3MCAwLjczMTAxNgordnQgMC43MjAwODYgMC43MzEwMTYKK3Z0IDAuNzA3NjExIDAuNzM0MDc2Cit2dCAwLjcwNzYxMSAwLjczNDkxNQordnQgMC43ODUzMTggMC44MTU3OTEKK3Z0IDAuOTI5NzA0IDAuMjkzMTc4Cit2dCAwLjkyOTMzMiAwLjI5MjY2OAordnQgMC45Mjk3MDQgMC4yOTAwNjQKK3Z0IDAuNzIwNTQ2IDAuNzM0OTE1Cit2dCAwLjcxOTY1NSAwLjczNzk4NQordnQgMC43MTczMjcgMC43NDAxNzEKK3Z0IDAuNzE0MDc4IDAuNzQxMDAzCit2dCAwLjcxMDgzMCAwLjc0MDE3MQordnQgMC43MDg1MDIgMC43Mzc5ODUKK3Z0IDAuNzA4MDcwIDAuNzI3NzYwCit2dCAwLjcwNzYxMSAwLjcyNzc2MwordnQgMC43MDc2MTEgMC43Mjc2ODkKK3Z0IDAuNzA4MDcwIDAuNzI3Njg2Cit2dCAwLjcyMDU0NiAwLjczNDA3NQordnQgMC43MjA1NDYgMC43MzA4ODIKK3Z0IDAuNzA3NjExIDAuNzMwODgyCit2dCAwLjcyMDU0NiAwLjcyNzc2MwordnQgMC43ODE1MTMgMC44MzU5NTUKK3Z0IDAuNzgxNTAxIDAuODM0MDc0Cit2dCAwLjc4MzMxOCAwLjgzMzc2MwordnQgMC43ODMzMjggMC44MzU0MjAKK3Z0IDAuNzgxNDk3IDAuODMxNDIxCit2dCAwLjc4MzMxNCAwLjgzMTQyMAordnQgMC43ODE1MDEgMC44Mjg3NjgKK3Z0IDAuNzgzMzE4IDAuODI5MDc2Cit2dCAwLjc4MTUxMyAwLjgyNjg3NQordnQgMC43ODMzMjggMC44Mjc0MDgKK3Z0IDAuNTM1MDU0IDAuODc4NzQxCit2dCAwLjUzNTA0NCAwLjg4MTI3NgordnQgMC41MzMyMzkgMC44ODEyNjYKK3Z0IDAuNTMzMjQ4IDAuODc5MDI3Cit2dCAwLjUzNTA1NCAwLjg4Mzc5MwordnQgMC41MzMyNDggMC44ODM0OTAKK3Z0IDAuMzU4NTEwIDAuODI3MDA4Cit2dCAwLjM1ODQ5OCAwLjgyODg3MgordnQgMC4zNTY2ODggMC44MjkxODgKK3Z0IDAuMzU2Njk5IDAuODI3NTQ2Cit2dCAwLjM1ODQ5MyAwLjgzMTUxNAordnQgMC4zNTY2ODMgMC44MzE1MjIKK3Z0IDAuMzU4NDk4IDAuODM0MTc4Cit2dCAwLjM1NjY4OCAwLjgzMzg3NQordnQgMC4zNTg1MTAgMC44MzYwODgKK3Z0IDAuMzU2Njk5IDAuODM1NTU3Cit2dCAwLjg3OTE5MCAwLjQ1NzAzNgordnQgMC44NzkxODQgMC40NTQ1MzcKK3Z0IDAuODgxMDAyIDAuNDU0NTE0Cit2dCAwLjg4MTAwOCAwLjQ1NjcyMgordnQgMC44NzkxOTAgMC40NTE5ODcKK3Z0IDAuODgxMDA4IDAuNDUyMjYyCit2dCAwLjAxODU5NCAwLjc5MjExNQordnQgMC4wMTg1OTQgMC43OTE1OTgKK3Z0IDAuMDIxOTgxIDAuNzkxNTk3Cit2dCAwLjAyMTk4MSAwLjc5MjExNQordnQgMC4wMjE5ODEgMC44MDI5NzEKK3Z0IDAuMDIxOTgxIDAuODAxNjIxCit2dCAwLjAyMjQxOSAwLjgwMTQ5OAordnQgMC4wMjI0MTkgMC44MDI5NTMKK3Z0IDAuNzE3NTE3IDAuNzI3Njg2Cit2dCAwLjcwOTE4NyAwLjcyNzY4NgordnQgMC40MDI2NTQgMC44MjM3NTIKK3Z0IDAuMzk5MjY2IDAuODIzNzUxCit2dCAwLjcyMDU0NiAwLjcyNzY4OQordnQgMC4wMTg1OTQgMC44MDE2MjIKK3Z0IDAuMDE4NTk0IDAuNzk4MDY0Cit2dCAwLjAyMTk4MSAwLjc5ODA2MwordnQgMC4wMjI0MTkgMC43OTQ2MjYKK3Z0IDAuMDIyNDE5IDAuNzk4MDYzCit2dCAwLjAyMTk4MSAwLjc5NDUwNQordnQgMC4wMTg1OTQgMC43OTMxNTYKK3Z0IDAuMDIxOTgxIDAuNzkzMTU2Cit2dCAwLjAyMjQxOSAwLjc5MjA1NwordnQgMC4wMTg1OTQgMC44MDQ1MjkKK3Z0IDAuMDE4NTk0IDAuODA0MDEyCit2dCAwLjAyMTk4MSAwLjgwNDAxMgordnQgMC4wMjE5ODEgMC44MDQ1MjkKK3Z0IDAuMDIyNDE5IDAuODA0MDcwCit2dCAwLjAxODU5NCAwLjgwMjk3MQordnQgMC4wMTg1OTQgMC43OTQ1MDUKK3Z0IDAuMDIyNDE5IDAuNzkzMTcxCit2dCAwLjIwMDA2MiAwLjY2OTQ0MQordnQgMC4xOTc2MzYgMC42Njk0NDEKK3Z0IDAuMTk3NjM2IDAuNjY1MzY5Cit2dCAwLjE5OTM0NiAwLjY2Njk3NAordnQgMC44MDczNTggMC4yMzgzMjcKK3Z0IDAuODA3MzU4IDAuMjM3NDg3Cit2dCAwLjgwNzU0OSAwLjIzNzQ4NwordnQgMC44MDc1NDkgMC4yMzgzMjcKK3Z0IDAuODA3MzU4IDAuMjQxNTIwCit2dCAwLjgwNzU0OSAwLjI0MTUyMAordnQgMC44MDczNTggMC4yNDQ3ODUKK3Z0IDAuODA3NTQ5IDAuMjQ0Nzg1Cit2dCAwLjgwNzM1OCAwLjI0ODA0MgordnQgMC44MDc1NDkgMC4yNDgwNDMKK3Z0IDAuODA3MzU4IDAuMjUxMjQwCit2dCAwLjgwNzU0OSAwLjI1MTI0MAordnQgMC44MDczNTggMC4yNTIwODUKK3Z0IDAuODA3NTQ5IDAuMjUyMDg1Cit2dCAwLjgwNzM3MCAwLjI1NTEzNgordnQgMC44MDc1NjAgMC4yNTUxMzYKK3Z0IDAuODQ3MjE2IDAuODE0ODU0Cit2dCAwLjg0NzIzMiAwLjgxMjU1NQordnQgMC44NDc0MjIgMC44MTI1NTUKK3Z0IDAuODQ3NDA3IDAuODE0ODU0Cit2dCAwLjg0NzIxMSAwLjgxODA5MQordnQgMC44NDc0MDEgMC44MTgwOTEKK3Z0IDAuODQ3MjE2IDAuODIxMzUwCit2dCAwLjg0NzQwNyAwLjgyMTM1MAordnQgMC44NDcyMzIgMC44MjM3MDUKK3Z0IDAuODQ3NDIyIDAuODIzNzA1Cit2dCAwLjgwNzU1MyAwLjE4MjU5NwordnQgMC44MDc1NjEgMC4xODU2MzEKK3Z0IDAuODA3MzcwIDAuMTg1NjMxCit2dCAwLjgwNzM2MiAwLjE4MjU5NwordnQgMC44MDc1NTMgMC4xODE3NTgKK3Z0IDAuODA3MzYyIDAuMTgxNzU4Cit2dCAwLjgwNzU1MyAwLjE3ODU2NwordnQgMC44MDczNjIgMC4xNzg1NjcKK3Z0IDAuODA3NTUzIDAuMTc1MzA2Cit2dCAwLjgwNzM2MiAwLjE3NTMwNgordnQgMC44MDc1NTMgMC4xNzIwNDMKK3Z0IDAuODA3MzYyIDAuMTcyMDQzCit2dCAwLjgwNzU1MyAwLjE2ODg1MgordnQgMC44MDczNjIgMC4xNjg4NTIKK3Z0IDAuODA3NTUzIDAuMTY4MDEzCit2dCAwLjgwNzM2MiAwLjE2ODAxMwordnQgMC44MDc1NjEgMC4xNjQ5MTEKK3Z0IDAuODA3MzcwIDAuMTY0OTExCit2dCAwLjg0NzUyMCAwLjYxMDA0OAordnQgMC44NDc1MzQgMC42MTIzNjkKK3Z0IDAuODQ3MzQzIDAuNjEyMzY5Cit2dCAwLjg0NzMyOSAwLjYxMDA0OAordnQgMC44NDc1MTQgMC42MDY4MDMKK3Z0IDAuODQ3MzIzIDAuNjA2ODAzCit2dCAwLjg0NzUyMCAwLjYwMzU1MwordnQgMC44NDczMjkgMC42MDM1NTMKK3Z0IDAuODQ3NTM0IDAuNjAxMjE4Cit2dCAwLjg0NzM0MyAwLjYwMTIxOAordnQgMC44MDczNzAgMC4yMzQ0MDQKK3Z0IDAuODA3NTYwIDAuMjM0NDA0Cit2dCAwLjIwMTIzNyAwLjY2OTI5MAordnQgMC4yMDE2OTkgMC42NjkyMjgKK3Z0IDAuMjAxNzAwIDAuNjcwMDY4Cit2dCAwLjIwMTIzNyAwLjY3MDA3MAordnQgMC4yMDE2OTkgMC42NzMyNjEKK3Z0IDAuMjAxMjM3IDAuNjczMjYzCit2dCAwLjIwMTY5OSAwLjY3NjUyNwordnQgMC4yMDEyMzcgMC42NzY1MjkKK3Z0IDAuMjAxNjk5IDAuNjc5Nzg1Cit2dCAwLjIwMTIzNyAwLjY3OTc4NwordnQgMC4yMDE3MDAgMC42ODI5ODMKK3Z0IDAuMjAxMjM3IDAuNjgyOTg1Cit2dCAwLjIwMTY5OSAwLjY4MzgyOAordnQgMC4yMDEyMzcgMC42ODM3NzAKK3Z0IDAuMjAwODA4IDAuNjg2ODkzCit2dCAwLjIwMDM5NSAwLjY4NjY2NQordnQgMC4xOTg0ODAgMC42ODkwNzkKK3Z0IDAuMTk4MjQyIDAuNjg4Njg3Cit2dCAwLjE5NTIzMiAwLjY4OTkxMQordnQgMC4xOTUyMzIgMC42ODk0NTgKK3Z0IDAuMTkxOTgzIDAuNjg5MDc5Cit2dCAwLjE5MjIyMiAwLjY4ODY4NwordnQgMC4xODk2NTUgMC42ODY4OTMKK3Z0IDAuMTkwMDY4IDAuNjg2NjY1Cit2dCAwLjE4ODc2NCAwLjY4MzgyMwordnQgMC4xODkyMjcgMC42ODM3NjYKK3Z0IDAuMTg4NzY0IDAuNjgyOTg0Cit2dCAwLjE4OTIyNyAwLjY4Mjk4NQordnQgMC4xODg3NjQgMC42Nzk3OTAKK3Z0IDAuMTg5MjI3IDAuNjc5NzkyCit2dCAwLjE4ODc2NCAwLjY3NjUyNwordnQgMC4xODkyMjcgMC42NzY1MjkKK3Z0IDAuMTg4NzY0IDAuNjczMjYxCit2dCAwLjE4OTIyNyAwLjY3MzI2MwordnQgMC4xODg3NjQgMC42NzAwNjgKK3Z0IDAuMTg5MjI3IDAuNjcwMDcwCit2dCAwLjE4ODc2NCAwLjY2OTIyOAordnQgMC4xODkyMjcgMC42NjkyODkKK3Z0IDAuMTg5NjU1IDAuNjY2MTU5Cit2dCAwLjE5MDA2OCAwLjY2NjM5MAordnQgMC4xOTE5ODMgMC42NjM5NzMKK3Z0IDAuMTkyMjIyIDAuNjY0MzY5Cit2dCAwLjE5NTIzMiAwLjY2MzE0MAordnQgMC4xOTUyMzIgMC42NjM1OTcKK3Z0IDAuMTk4NDgwIDAuNjYzOTczCit2dCAwLjE5ODI0MiAwLjY2NDM2OQordnQgMC4yMDA4MDggMC42NjYxNTkKK3Z0IDAuMjAwMzk1IDAuNjY2MzkwCit2dCAwLjIwMDA2MiAwLjY3MDA3MAordnQgMC4yMDAwNjIgMC42NzMyNjMKK3Z0IDAuMjAwMDYyIDAuNjc2NTI5Cit2dCAwLjIwMDA2MiAwLjY3OTc4NwordnQgMC4yMDAwNjIgMC42ODI5ODUKK3Z0IDAuMjAwMDYyIDAuNjgzNjE4Cit2dCAwLjE5OTM0NiAwLjY4NjA4MQordnQgMC4xOTc2MzYgMC42ODc2ODYKK3Z0IDAuMTk1MjMyIDAuNjg4MzAyCit2dCAwLjE5MjgyNyAwLjY4NzY4NgordnQgMC4xOTExMTggMC42ODYwODEKK3Z0IDAuMTkwNDAyIDAuNjgzNjE1Cit2dCAwLjE5MDQwMiAwLjY4Mjk4NQordnQgMC4xOTA0MDIgMC42Nzk3OTIKK3Z0IDAuMTkwNDAyIDAuNjc2NTI5Cit2dCAwLjE5MDQwMiAwLjY3MzI2MwordnQgMC4xOTA0MDIgMC42NzAwNzAKK3Z0IDAuMTkwNDAyIDAuNjY5NDQwCit2dCAwLjE5MTExOCAwLjY2Njk3NAordnQgMC4xOTI4MjcgMC42NjUzNjkKK3Z0IDAuMTk1MjMyIDAuNjY0NzUzCit2dCAwLjE5NTIzMiAwLjY2OTQ0MAordnQgMC4xOTI4MjcgMC42Njk0NDAKK3Z0IDAuMTk3NjM2IDAuNjcwMDcwCit2dCAwLjE5NTIzMiAwLjY3MDA3MAordnQgMC4xOTI4MjcgMC42NzAwNzAKK3Z0IDAuMTk3NjM2IDAuNjczMjYzCit2dCAwLjE5NTIzMiAwLjY3MzI2MwordnQgMC4xOTI4MjcgMC42NzMyNjMKK3Z0IDAuMTk3NjM2IDAuNjc2NTI5Cit2dCAwLjE5NTIzMiAwLjY3NjUyOQordnQgMC4xOTI4MjcgMC42NzY1MjkKK3Z0IDAuMTk3NjM2IDAuNjc5Nzg4Cit2dCAwLjE5NTIzMiAwLjY3OTc4OQordnQgMC4xOTI4MjcgMC42Nzk3OTEKK3Z0IDAuMTk3NjM2IDAuNjgyOTg1Cit2dCAwLjE5NTIzMiAwLjY4Mjk4NQordnQgMC4xOTI4MjcgMC42ODI5ODUKK3Z0IDAuMTk3NjM2IDAuNjgzNjE4Cit2dCAwLjE5NTIzMiAwLjY4MzYxNwordnQgMC4xOTI4MjcgMC42ODM2MTYKK3Z0IDAuODQ0NDU4IDAuMzM3ODYzCit2dCAwLjg0NDQ1NyAwLjMzNzAyMgordnQgMC44NDQ4NDYgMC4zMzcyMjIKK3Z0IDAuNDIwODE5IDAuNzYxMjk4Cit2dCAwLjQyMTIzOCAwLjc2MTI5OQordnQgMC40MjE0NDkgMC43NjE1MTgKK3Z0IDAuNzE4NzcxIDAuODk3MzUyCit2dCAwLjcxODc4MiAwLjkwMDI2NwordnQgMC43MTgzOTkgMC45MDAwNjUKK3Z0IDAuNzE4Mzg5IDAuODk3MzQ2Cit2dCAwLjkwMjkwNiAwLjU3ODU0NAordnQgMC45MDI5MTMgMC41NzU3ODYKK3Z0IDAuOTAzMzAxIDAuNTc1OTA5Cit2dCAwLjkwMzI5NCAwLjU3ODUzNAordnQgMC43MDc3MDggMC44NTUxODUKK3Z0IDAuNzA3MzIxIDAuODU1MzIwCit2dCAwLjcwNzMxNiAwLjg1MjQ1NAordnQgMC43MDc3MDMgMC44NTI0NTQKK3Z0IDAuNzA3MzM0IDAuODU3MzYzCit2dCAwLjcwNzcyMCAwLjg1NzEyNgordnQgMC40MTUzMjUgMC43NTgyODQKK3Z0IDAuNDE1Njc4IDAuNzU4MTc3Cit2dCAwLjQxNzgzMSAwLjc2MDQzNwordnQgMC40MTc1MjIgMC43NjA2MjMKK3Z0IDAuNjY2NjQyIDAuODMwMjc0Cit2dCAwLjY2NjY0NyAwLjgzMzQyOQordnQgMC42NjYyNTggMC44MzM1MzcKK3Z0IDAuNjY2MjUyIDAuODMwMjc1Cit2dCAwLjkwNjA5MSAwLjE2NDkxMQordnQgMC45MDYwODYgMC4xNjc0OTYKK3Z0IDAuOTA1NzAzIDAuMTY3NTAwCit2dCAwLjkwNTcwNyAwLjE2NTA4MAordnQgMC42NDM1MTkgMC45MDY0MDEKK3Z0IDAuNjQzNTI4IDAuOTA4ODUzCit2dCAwLjY0MzE0NiAwLjkwODY5MQordnQgMC42NDMxMzggMC45MDYzOTYKK3Z0IDAuMzM3MjEyIDAuNzU3ODkxCit2dCAwLjMzOTM3MiAwLjc1OTIzNwordnQgMC4zMzkxNTMgMC43NTk0NjQKK3Z0IDAuMzM3MTM0IDAuNzU4MjA2Cit2dCAwLjkwODcyNiAwLjIwNjc2MwordnQgMC45MDg3MjIgMC4yMDQzMzcKK3Z0IDAuOTA5MTEwIDAuMjA0MzM2Cit2dCAwLjkwOTExNCAwLjIwNjU5NwordnQgMC42MTkwMjIgMC45MDY3NjkKK3Z0IDAuNjE5MDI3IDAuOTA0NDM5Cit2dCAwLjYxOTQxNSAwLjkwNDU4NgordnQgMC42MTk0MTAgMC45MDY3NTYKK3Z0IDAuMzM4OTI4IDAuNzU5NjkzCit2dCAwLjMzNzA1MCAwLjc1ODUyMgordnQgMC44ODE1OTkgMC45MTAwMzkKK3Z0IDAuODgxNTk1IDAuOTEyMTQ2Cit2dCAwLjg4MTIxMSAwLjkxMjE1MAordnQgMC44ODEyMTUgMC45MTAyMDgKK3Z0IDAuOTE4MTc1IDAuMTA5OTMyCit2dCAwLjkxODE4MyAwLjExMTkzMAordnQgMC45MTc4MDEgMC4xMTE3NjgKK3Z0IDAuOTE3Nzk0IDAuMTA5OTI3Cit2dCAwLjMzNjk3NyAwLjc1ODgwNgordnQgMC4zMzg3MjkgMC43NTk4OTgKK3Z0IDAuMzM4NTEwIDAuNzYwMTI1Cit2dCAwLjMzNjg5OSAwLjc1OTEyMAordnQgMC43MzY2MDQgMC45MTkxNjcKK3Z0IDAuNzM2NjAxIDAuOTE3MjE5Cit2dCAwLjczNjk4OSAwLjkxNzIxOAordnQgMC43MzY5OTIgMC45MTkwMDEKK3Z0IDAuNjQzMTM4IDAuOTIxMzQ3Cit2dCAwLjY0MzE0MiAwLjkxOTQ3OAordnQgMC42NDM1MzAgMC45MTk2MjUKK3Z0IDAuNjQzNTI2IDAuOTIxMzM0Cit2dCAwLjMzODI4NSAwLjc2MDM1MwordnQgMC4zMzY4MTUgMC43NTk0MzcKK3Z0IDAuMDE4OTgwIDAuOTI0MzY3Cit2dCAwLjAxODk3NyAwLjkyNTk5NwordnQgMC4wMTg1OTQgMC45MjYwMDEKK3Z0IDAuMDE4NTk2IDAuOTI0NTM1Cit2dCAwLjEzNTU0NSAwLjkyODQxMwordnQgMC4xMzU1NTAgMC45Mjk5NTcKK3Z0IDAuMTM1MTY5IDAuOTI5Nzk2Cit2dCAwLjEzNTE2MyAwLjkyODQwOAordnQgMC4zMzY3NDIgMC43NTk3MjEKK3Z0IDAuMzM4MDg2IDAuNzYwNTU4Cit2dCAwLjMzNzg2NyAwLjc2MDc4NQordnQgMC4zMzY2NjMgMC43NjAwMzUKK3Z0IDAuMzg1MTA1IDAuOTM0OTUxCit2dCAwLjM4NTEwMiAwLjkzMzQ4MgordnQgMC4zODU0OTAgMC45MzM0ODEKK3Z0IDAuMzg1NDkyIDAuOTM0Nzg1Cit2dCAwLjAwNTMxNCAwLjkzNTY0MQordnQgMC4wMDUzMTcgMC45MzQyMzMKK3Z0IDAuMDA1NzA1IDAuOTM0MzgwCit2dCAwLjAwNTcwMiAwLjkzNTYyOAordnQgMC4zMzc2NDIgMC43NjEwMTQKK3Z0IDAuMzM2NTgwIDAuNzYwMzUxCit2dCAwLjYwNzg2NiAwLjk0Njc1MAordnQgMC42MDc4NjQgMC45NDc5MDMKK3Z0IDAuNjA3NDgxIDAuOTQ3OTA3Cit2dCAwLjYwNzQ4MyAwLjk0NjkxOQordnQgMC4yNDIzNDMgMC45NTEwNzUKK3Z0IDAuMjQyMzQ3IDAuOTUyMTY1Cit2dCAwLjI0MTk2NSAwLjk1MjAwMwordnQgMC4yNDE5NjIgMC45NTEwNjkKK3Z0IDAuMzM2NTA3IDAuNzYwNjM1Cit2dCAwLjMzNzQ0MyAwLjc2MTIxOQordnQgMC4zMzcyMjQgMC43NjE0NDYKK3Z0IDAuMzM2NDI4IDAuNzYwOTUwCit2dCAwLjMzOTU2MyAwLjc1OTA0NAordnQgMC4zNDA5MjggMC43NjE1MTQKK3Z0IDAuMzQwNjY4IDAuNzYxNTgxCit2dCAwLjMzNzI4MiAwLjc1NzYyMQordnQgMC4zMzQ2NTEgMC43NTc4MjcKK3Z0IDAuMzM0NTgxIDAuNzU3NTU0Cit2dCAwLjM0MDA1OSAwLjc2MTczOAordnQgMC4zMzk3ODUgMC43NjE4MDkKK3Z0IDAuMzM0ODkwIDAuNzU4NzUzCit2dCAwLjMzNDgxNiAwLjc1ODQ2NgordnQgMC4zMzkxNzcgMC43NjE5NjYKK3Z0IDAuMzM4OTAzIDAuNzYyMDM3Cit2dCAwLjMzNTEyOSAwLjc1OTY4MAordnQgMC4zMzUwNTUgMC43NTkzOTIKK3Z0IDAuMzM4Mjk0IDAuNzYyMTkzCit2dCAwLjMzODAyMCAwLjc2MjI2NAordnQgMC4zMzUzNjggMC43NjA2MDYKK3Z0IDAuMzM1Mjk0IDAuNzYwMzE5Cit2dCAwLjMzNzcxOSAwLjc2MjM0MgordnQgMC4zMzcyNzUgMC43NjI0NTYKK3Z0IDAuMzM2ODk5IDAuNzYxNzc3Cit2dCAwLjMzNTQ1MyAwLjc2MDkyNQordnQgMC4zMzYzMDggMC43NjE0MDgKK3Z0IDAuMzM1NTcwIDAuNzYxMzg5Cit2dCAwLjMzNjYyMiAwLjc2MjYyNQordnQgMC4zMzU5MzUgMC43NjI4MDIKK3Z0IDAuNDE4MTAxIDAuNzYwMjUyCit2dCAwLjQyMTAyOCAwLjc2MTA3OQordnQgMC40MTYzNDcgMC43NTc4ODcKK3Z0IDAuNDE4Mjk1IDAuNzU5OTM3Cit2dCAwLjQxNjAyOCAwLjc1ODA3MQordnQgMC44OTYzMzQgMC4wNjk3NzkKK3Z0IDAuODk2MzM5IDAuMDY2OTIxCit2dCAwLjg5NjcyNCAwLjA2NjczMwordnQgMC44OTY3MTggMC4wNjk3NzQKK3Z0IDAuODQ0NDYxIDAuMzQxMDU4Cit2dCAwLjg0NDg0NyAwLjM0MDA3MwordnQgMC44NDQ4NTAgMC4zNDA5MjUKK3Z0IDAuNzE4Mzk5IDAuODk0NjI4Cit2dCAwLjcxODc4MiAwLjg5NDQzNgordnQgMC45MDMzMDEgMC41ODEwNzkKK3Z0IDAuOTAyOTEzIDAuNTgxMjIwCit2dCAwLjIwMjgyNSAwLjg1NjA2MQordnQgMC4yMDI4MjAgMC44NTMzMTkKK3Z0IDAuMjAzMjA0IDAuODUzMzE1Cit2dCAwLjIwMzIwOSAwLjg1NjE5MwordnQgMC4yMDMyMjMgMC44NTgyNjcKK3Z0IDAuMjAyODM4IDAuODU4MDMxCit2dCAwLjkwNTUxNCAwLjI3MTQwOAordnQgMC45MDU5MDEgMC4yNzE1NzIKK3Z0IDAuOTA1ODk3IDAuMjc0MDAyCit2dCAwLjkwNTUwOSAwLjI3NDAwMwordnQgMC42NDMxNDYgMC45MDQxMDMKK3Z0IDAuNjQzNTI4IDAuOTAzOTUwCit2dCAwLjMzMjQ2NCAwLjc1OTExNgordnQgMC4zMzI2OTAgMC43NTkzNTIKK3Z0IDAuMzMxNTMyIDAuNzYxNDMwCit2dCAwLjMzMTIyNSAwLjc2MTMzOAordnQgMC40MTQ3NjkgMC45MDkwMDUKK3Z0IDAuNDE0Mzg1IDAuOTA4ODQzCit2dCAwLjQxNDM4MSAwLjkwNjU3MwordnQgMC40MTQ3NjUgMC45MDY1NjkKK3Z0IDAuNjE5NDE1IDAuOTA4ODU3Cit2dCAwLjYxOTAyNyAwLjkwOTAyNQordnQgMC4zMzI5MTEgMC43NTk1ODkKK3Z0IDAuMzMxODMzIDAuNzYxNTIyCit2dCAwLjkxMzkzMSAwLjU3NTc4NgordnQgMC45MTQzMTkgMC41NzU5NTAKK3Z0IDAuOTE0MzE2IDAuNTc3OTAxCit2dCAwLjkxMzkyOCAwLjU3NzkwMgordnQgMC45MTc4MDEgMC4xMDgwOTIKK3Z0IDAuOTE4MTgzIDAuMTA3OTM5Cit2dCAwLjMzMzExMiAwLjc1OTgwMgordnQgMC4zMzMzMzggMC43NjAwMzkKK3Z0IDAuMzMyNDE0IDAuNzYxNjk3Cit2dCAwLjMzMjEwNyAwLjc2MTYwNQordnQgMC45MjAxMjggMC4yMjE3NDEKK3Z0IDAuOTE5NzQ0IDAuMjIxNTgwCit2dCAwLjkxOTc0MSAwLjIxOTc5MAordnQgMC45MjAxMjQgMC4yMTk3ODYKK3Z0IDAuNjQzNTMwIDAuOTIyOTg0Cit2dCAwLjY0MzE0MiAwLjkyMzE1MgordnQgMC4zMzM1NTkgMC43NjAyNzYKK3Z0IDAuMzMyNzE2IDAuNzYxNzkwCit2dCAwLjkyNzA3MSAwLjc3MTUyNQordnQgMC45Mjc0NTkgMC43NzE2ODkKK3Z0IDAuOTI3NDU2IDAuNzczMTYxCit2dCAwLjkyNzA2OSAwLjc3MzE2MgordnQgMC4xMzUxNjkgMC45MjcwMzIKK3Z0IDAuMTM1NTUwIDAuOTI2ODc5Cit2dCAwLjMzMzc2MCAwLjc2MDQ4OQordnQgMC4zMzM5ODcgMC43NjA3MjUKK3Z0IDAuMzMzMjk2IDAuNzYxOTY0Cit2dCAwLjMzMjk4OSAwLjc2MTg3MgordnQgMC45MzUyMjMgMC4zOTA1NDcKK3Z0IDAuOTM0ODM5IDAuMzkwMzg1Cit2dCAwLjkzNDgzNyAwLjM4OTA3NQordnQgMC45MzUyMjAgMC4zODkwNzEKK3Z0IDAuMDA1NzA1IDAuOTM2ODI3Cit2dCAwLjAwNTMxNyAwLjkzNjk5NQordnQgMC4zMzQyMDcgMC43NjA5NjMKK3Z0IDAuMzMzNTk4IDAuNzYyMDU3Cit2dCAwLjE2NjYyOSAwLjk0NjY0MwordnQgMC4xNjcwMTYgMC45NDY4MDcKK3Z0IDAuMTY3MDE0IDAuOTQ3Nzk5Cit2dCAwLjE2NjYyNyAwLjk0NzgwMAordnQgMC4yNDE5NjUgMC45NTAxNTEKK3Z0IDAuMjQyMzQ3IDAuOTQ5OTk4Cit2dCAwLjMzNDQwOSAwLjc2MTE3NgordnQgMC4zMzQ2MzUgMC43NjE0MTIKK3Z0IDAuMzM0MTc5IDAuNzYyMjMxCit2dCAwLjMzMzg3MiAwLjc2MjEzOQordnQgMC4zMzEyMjQgMC43NjQwMTYKK3Z0IDAuMzMwOTY0IDAuNzY0MDg0Cit2dCAwLjMzMDk2NCAwLjc2MTI2MQordnQgMC4zMzIyNzIgMC43NTg5MTMKK3Z0IDAuMzMyMTA3IDAuNzYzNzg5Cit2dCAwLjMzMTgzMyAwLjc2Mzg2MAordnQgMC4zMzI5ODkgMC43NjM1NjEKK3Z0IDAuMzMyNzE2IDAuNzYzNjMyCit2dCAwLjMzMzg3MiAwLjc2MzMzNAordnQgMC4zMzM1OTggMC43NjM0MDQKK3Z0IDAuMzM0NjE3IDAuNzYyMzY1Cit2dCAwLjMzNDYxNyAwLjc2MzE0MgordnQgMC4zMzQxNzkgMC43NjMyNTUKK3Z0IDAuMzM0OTU2IDAuNzYxNzU3Cit2dCAwLjMzNTI3MCAwLjc2Mjk3MwordnQgMC4wODI1NDMgMC43ODcyNzQKK3Z0IDAuMDgyMjE5IDAuNzg3MDkxCit2dCAwLjA4NDI5MSAwLjc4NDkxMAordnQgMC4wODQ0OTEgMC43ODUyMjUKK3Z0IDAuODk2NTU0IDAuMjkzMTE2Cit2dCAwLjg5NjE2NSAwLjI5MzExNwordnQgMC44OTYxNzAgMC4yOTAwNjQKK3Z0IDAuODk2NTU5IDAuMjkwMjQ2Cit2dCAwLjA4NDExOCAwLjc4NDYwOQordnQgMC4wODE5MjUgMC43ODY5MTMKK3Z0IDAuMzMzNjUyIDAuNzc5NDI0Cit2dCAwLjMzMTU2OCAwLjc4MjE5OAordnQgMC4zMzEzMDcgMC43ODIwNjcKK3Z0IDAuMzMzNTA2IDAuNzc5MjE5Cit2dCAwLjA4MTQzMiAwLjc5MDE0MgordnQgMC4wODExMzggMC43OTAxNDIKK3Z0IDAuMDgxNjc2IDAuNzg2NzU4Cit2dCAwLjA4Mzk0NyAwLjc4NDMwOAordnQgMC44OTIyODQgMC44NzkyNjUKK3Z0IDAuODkyNjY5IDAuODc5MjYyCit2dCAwLjg5MjY3NSAwLjg4MjY1NgordnQgMC44OTIyOTAgMC44ODI1MDQKK3Z0IDAuNjA4Mzc0IDAuODMwNzMxCit2dCAwLjYwNzk4NSAwLjgzMDczMQordnQgMC42MDc5OTEgMC44MjcyMDcKK3Z0IDAuNjA4Mzc5IDAuODI3MzQzCit2dCAwLjYwODAwNiAwLjgyNDY2MgordnQgMC42MDgzOTQgMC44MjQ4ODYKK3Z0IDAuMzQzNDEyIDAuOTM1ODk0Cit2dCAwLjM0MzAyMyAwLjkzNTc0MwordnQgMC4zNDMwMjMgMC45MzMwMjYKK3Z0IDAuMzQzNDEyIDAuOTM0MjA1Cit2dCAwLjM0MzQwOCAwLjkxOTY3OAordnQgMC4zNDMwMjMgMC45MTkxNzEKK3Z0IDAuMzQzMDI0IDAuOTE4NTYxCit2dCAwLjQyNTY0OCAwLjk1NDAzNQordnQgMC40MjU4NjMgMC45NTQwMzUKK3Z0IDAuNDI1ODYzIDAuOTU1MTU1Cit2dCAwLjQ0MzI3NSAwLjgzMzc1NgordnQgMC40NDMyNzQgMC44MzI4MDcKK3Z0IDAuNDQzNjYxIDAuODMzODU1Cit2dCAwLjg5NzM1NyAwLjIwNTY1NAordnQgMC44OTgwOTUgMC4yMDcyMTgKK3Z0IDAuODk3NTg5IDAuMjA2NTY0Cit2dCAwLjg5NzE4OSAwLjIwNTY3NwordnQgMC40MTUyNDEgMC43NTUwMTkKK3Z0IDAuNDE0ODY2IDAuNzU1MDE5Cit2dCAwLjg0NDQ2MiAwLjMzMzkwNQordnQgMC44NDQ4NTEgMC4zMzQyMDMKK3Z0IDAuNjMwNjY2IDAuOTQ1MDg2Cit2dCAwLjYzMDY2NSAwLjk0NjMwNAordnQgMC42MzAwNTcgMC45NDU3MTQKK3Z0IDAuMjU5NjEzIDAuOTM2NDAzCit2dCAwLjI1OTYxMyAwLjkzOTEwMAordnQgMC4yNTkyMjggMC45Mzg4NzkKK3Z0IDAuMzMxMDM1IDAuNzgxOTM5Cit2dCAwLjg5Nzc3MiAwLjIwMjE1NwordnQgMC44OTgwOTUgMC4yMDE5MDYKK3Z0IDAuODk3NjUyIDAuMjA1NjE4Cit2dCAwLjg5NzUwNSAwLjIwMjM2MwordnQgMC40NDM2NzYgMC44MzYyMDgKK3Z0IDAuNDQzMjkxIDAuODM2MjEyCit2dCAwLjI3ODY4NiAwLjk0ODc3MAordnQgMC4yNzgyOTcgMC45NDg0NTcKK3Z0IDAuMjc4Mjk3IDAuOTQ2NDQwCit2dCAwLjI3ODY4NiAwLjk0NjQzNwordnQgMC44MzY0MDYgMC45NDE2MTAKK3Z0IDAuODM2MTM4IDAuOTQxMzI0Cit2dCAwLjgzNjE4MyAwLjkzOTA1OQordnQgMC44MzY0MDYgMC45Mzg4NDkKK3Z0IDAuNDQzMjc0IDAuODM0NTYxCit2dCAwLjQ0MzY2MSAwLjgzNDkyNAordnQgMC42MzA5NjEgMC45NDY1ODcKK3Z0IDAuNjMwOTYxIDAuOTQ0NzgxCit2dCAwLjg1ODkzNiAwLjkyNTIzOAordnQgMC44NTkzMjYgMC45MjgwNzMKK3Z0IDAuODU4OTM2IDAuOTI4MjkzCit2dCAwLjA4NzE5NiAwLjc4NDA4MwordnQgMC40MjQyNzcgMC43NjA4NTQKK3Z0IDAuODU5MzI2IDAuOTI1MDUzCit2dCAwLjMzNTE2OCAwLjc3ODgyMQordnQgMC4zMzY1NDEgMC43Nzg2NzUKK3Z0IDAuOTM0NzM4IDAuNTI1NzY0Cit2dCAwLjkzNDM3MiAwLjUyMjk1MAordnQgMC45MzQ3MzggMC41MjI3ODQKK3Z0IDAuMzM0MzM4IDAuNzc4OTEwCit2dCAwLjQyMTQ0OSAwLjc0ODUyMQordnQgMC40MjEyMzggMC43NDg3NDAKK3Z0IDAuNDIwODIwIDAuNzQ4NzQwCit2dCAwLjM5OTI2MiAwLjgzNzY4MgordnQgMC4zOTk2NDUgMC44Mzc0NzYKK3Z0IDAuMzk5NjQ2IDAuODM4MzE4Cit2dCAwLjg5OTQwMyAwLjI1NjUwOAordnQgMC44OTk3OTMgMC4yNTY0OTQKK3Z0IDAuODk5ODAwIDAuMjU5MTk0Cit2dCAwLjg5OTQxMCAwLjI1OTQwMgordnQgMC45MDIzNzggMC42MDM5NjAKK3Z0IDAuOTAxOTk2IDAuNjAzOTU2Cit2dCAwLjkwMjAwNSAwLjYwMTM0NgordnQgMC45MDIzODggMC42MDEyMTgKK3Z0IDAuNzA3NzA4IDAuODQ5NzE4Cit2dCAwLjcwNzMyMSAwLjg0OTU4NAordnQgMC43MDczMzQgMC44NDc1MjgKK3Z0IDAuNzA3NzIwIDAuODQ3NzY1Cit2dCAwLjQxNTMyNSAwLjc1MTc1NQordnQgMC40MTc1MjIgMC43NDk0MTYKK3Z0IDAuNDE3ODMxIDAuNzQ5NjAyCit2dCAwLjQxNTY3OCAwLjc1MTg2MgordnQgMC42NjYyNTggMC44MjcwMDgKK3Z0IDAuNjY2NjQ3IDAuODI3MTE0Cit2dCAwLjkwNjA5MSAwLjE3MDA5OAordnQgMC45MDU3MDcgMC4xNjk5MzYKK3Z0IDAuNjk0NzI2IDAuOTA2MzE4Cit2dCAwLjY5NTExNSAwLjkwNjMwNQordnQgMC42OTUxMjAgMC45MDg1ODUKK3Z0IDAuNjk0NzMyIDAuOTA4NzUyCit2dCAwLjMzOTQyOCAwLjc2NjQ4MgordnQgMC4zMzkyMDggMC43NjYyNDUKK3Z0IDAuMzQwMzY2IDAuNzY0MTY3Cit2dCAwLjM0MDY2NyAwLjc2NDI2MAordnQgMC45MDg3MjYgMC4yMDE5MDYKK3Z0IDAuOTA5MTE0IDAuMjAyMDcxCit2dCAwLjkxMjYzMiAwLjQxNDQwNQordnQgMC45MTIyNTAgMC40MTQ0MDAKK3Z0IDAuOTEyMjU4IDAuNDEyMjQyCit2dCAwLjkxMjY0MCAwLjQxMjA4OQordnQgMC4zMzg5ODEgMC43NjYwMDkKK3Z0IDAuMzQwMDU5IDAuNzY0MDc2Cit2dCAwLjg4MTU5OSAwLjkxNDI2OAordnQgMC44ODEyMTUgMC45MTQxMDYKK3Z0IDAuMDYzMTQ3IDAuOTE1NTc1Cit2dCAwLjA2MzUzNSAwLjkxNTU2MwordnQgMC4wNjM1NDAgMC45MTczOTEKK3Z0IDAuMDYzMTUyIDAuOTE3NTU5Cit2dCAwLjMzODc4MCAwLjc2NTc5NQordnQgMC4zMzg1NTkgMC43NjU1NTgKK3Z0IDAuMzM5NDg0IDAuNzYzOTAwCit2dCAwLjMzOTc4NSAwLjc2Mzk5MwordnQgMC43MzY2MDQgMC45MTUyNjgKK3Z0IDAuNzM2OTkyIDAuOTE1NDMyCit2dCAwLjYwODI3OSAwLjkyMTM0MgordnQgMC42MDc4OTggMC45MjEzMzcKK3Z0IDAuNjA3OTA1IDAuOTE5NjM3Cit2dCAwLjYwODI4NiAwLjkxOTQ4NAordnQgMC4zMzgzMzMgMC43NjUzMjIKK3Z0IDAuMzM5MTc3IDAuNzYzODA4Cit2dCAwLjAxODk4MCAwLjkyNzYzOAordnQgMC4wMTg1OTYgMC45Mjc0NzYKK3Z0IDAuOTI5NDkyIDAuMzA5Mzg4Cit2dCAwLjkyOTg4MSAwLjMwOTM3NgordnQgMC45Mjk4ODQgMC4zMTA3NTMKK3Z0IDAuOTI5NDk2IDAuMzEwOTIxCit2dCAwLjMzODEzMiAwLjc2NTEwOAordnQgMC4zMzc5MTEgMC43NjQ4NzEKK3Z0IDAuMzM4NjAxIDAuNzYzNjMzCit2dCAwLjMzODkwMyAwLjc2MzcyNgordnQgMC4zODUxMDUgMC45MzIwMTEKK3Z0IDAuMzg1NDkyIDAuOTMyMTc1Cit2dCAwLjkzNzcwNiAwLjkxMDQyOAordnQgMC45MzczMjUgMC45MTA0MjMKK3Z0IDAuOTM3MzI5IDAuOTA5MTgxCit2dCAwLjkzNzcxMSAwLjkwOTAyOAordnQgMC4zMzc2ODUgMC43NjQ2MzUKK3Z0IDAuMzM4Mjk0IDAuNzYzNTQxCit2dCAwLjYwNzg2NiAwLjk0OTA2MwordnQgMC42MDc0ODMgMC45NDg5MDEKK3Z0IDAuOTUxNTg0IDAuMzA4OTI3Cit2dCAwLjk1MTk3MyAwLjMwODkxNQordnQgMC45NTE5NzUgMC4zMDk4NDIKK3Z0IDAuOTUxNTg3IDAuMzEwMDEwCit2dCAwLjMzNzQ4MyAwLjc2NDQyMgordnQgMC4zMzcyNjIgMC43NjQxODQKK3Z0IDAuMzM3NzE5IDAuNzYzMzY2Cit2dCAwLjMzODAyMCAwLjc2MzQ1OAordnQgMC4zNDA5MjggMC43NjQzMzcKK3Z0IDAuMzM5NjIwIDAuNzY2Njg1Cit2dCAwLjMzNzIxOCAwLjc2Nzc3NwordnQgMC4zMzcyODkgMC43NjgwNTAKK3Z0IDAuMzM2OTc5IDAuNzY2ODUwCit2dCAwLjMzNzA1MyAwLjc2NzEzOAordnQgMC4zMzY3NDAgMC43NjU5MjQKK3Z0IDAuMzM2ODE0IDAuNzY2MjExCit2dCAwLjMzNjUwMSAwLjc2NDk5NwordnQgMC4zMzY1NzUgMC43NjUyODUKK3Z0IDAuMzM3Mjc1IDAuNzYzMjMzCit2dCAwLjMzNjQyMSAwLjc2NDY3NwordnQgMC4zMzYyOTkgMC43NjQyMTUKK3Z0IDAuMzM2OTM2IDAuNzYzODQxCit2dCAwLjQyMTAyOCAwLjc0ODk2MAordnQgMC40MTgxMDEgMC43NDk3ODcKK3Z0IDAuNDE2MzQ3IDAuNzUyMTUyCit2dCAwLjQxNjAyOCAwLjc1MTk2OAordnQgMC40MTgyOTUgMC43NTAxMDIKK3Z0IDAuODk2NzI0IDAuMDcyODM1Cit2dCAwLjg5NjMzOSAwLjA3MjY1NgordnQgMC4zOTk2NTAgMC44NDE1MTQKK3Z0IDAuMzk5MjY2IDAuODQxMzg3Cit2dCAwLjM5OTI2MiAwLjg0MDUzMAordnQgMC44OTk0MTAgMC4yNTM1NzUKK3Z0IDAuODk5ODAwIDAuMjUzNzYwCit2dCAwLjkwMjM4OCAwLjYwNjY1NQordnQgMC45MDIwMDUgMC42MDY1MTkKK3Z0IDAuMjAyODI1IDAuODUwNTk1Cit2dCAwLjIwMzIwOSAwLjg1MDQ1NwordnQgMC4yMDMyMjMgMC44NDg0MzMKK3Z0IDAuMjAyODM4IDAuODQ4NjcyCit2dCAwLjkwNTUxNCAwLjI3NjU5NAordnQgMC45MDU5MDEgMC4yNzY0MjgKK3Z0IDAuNjk0NzMyIDAuOTAzODUzCit2dCAwLjY5NTEyMCAwLjkwMzk5OQordnQgMC4zMzQ2ODAgMC43Njc3MDcKK3Z0IDAuMzMyNTIwIDAuNzY2MzYxCit2dCAwLjMzMjc0NSAwLjc2NjEzMgordnQgMC4zMzQ3NjQgMC43NjczOTEKK3Z0IDAuNDE0NzY5IDAuOTA0MTQ5Cit2dCAwLjQxNDM4NiAwLjkwNDMxOAordnQgMC45MTI2NDAgMC40MTY2NzcKK3Z0IDAuOTEyMjU4IDAuNDE2NTE2Cit2dCAwLjMzMjk2NCAwLjc2NTkwNQordnQgMC4zMzQ4NDIgMC43NjcwNzYKK3Z0IDAuOTEzOTMxIDAuNTgwMDE1Cit2dCAwLjkxNDMxOSAwLjU3OTg0OQordnQgMC4wNjMxNTIgMC45MTM1NzEKK3Z0IDAuMDYzNTQwIDAuOTEzNzE4Cit2dCAwLjMzNDkxNSAwLjc2Njc5MgordnQgMC4zMzMxNjMgMC43NjU3MDAKK3Z0IDAuMzMzMzg4IDAuNzY1NDcyCit2dCAwLjMzNDk5OSAwLjc2NjQ3NgordnQgMC45MjAxMjggMC4yMTc4NDMKK3Z0IDAuOTE5NzQ0IDAuMjE4MDEyCit2dCAwLjYwODI4NiAwLjkyMzE2MAordnQgMC42MDc5MDUgMC45MjI5OTgKK3Z0IDAuMzMzNjA3IDAuNzY1MjQ1Cit2dCAwLjMzNTA3NyAwLjc2NjE2MQordnQgMC45MjcwNzEgMC43NzQ3OTYKK3Z0IDAuOTI3NDU5IDAuNzc0NjMwCit2dCAwLjkyOTQ5NiAwLjMwNzg0NQordnQgMC45Mjk4ODQgMC4zMDc5OTEKK3Z0IDAuMzM1MTUwIDAuNzY1ODc3Cit2dCAwLjMzMzgwNiAwLjc2NTA0MAordnQgMC4zMzQwMzEgMC43NjQ4MTEKK3Z0IDAuMzM1MjM0IDAuNzY1NTYxCit2dCAwLjkzNTIyMyAwLjM4NzYwNgordnQgMC45MzQ4MzkgMC4zODc3NzUKK3Z0IDAuOTM3NzExIDAuOTExNzkyCit2dCAwLjkzNzMyOSAwLjkxMTYzMAordnQgMC4zMzQyNTAgMC43NjQ1ODQKK3Z0IDAuMzM1MzEyIDAuNzY1MjQ2Cit2dCAwLjE2NjYyOSAwLjk0ODk1NgordnQgMC4xNjcwMTYgMC45NDg3OTAKK3Z0IDAuOTUxNTg3IDAuMzA3ODQ1Cit2dCAwLjk1MTk3NSAwLjMwNzk5MQordnQgMC4zMzUzODUgMC43NjQ5NjMKK3Z0IDAuMzM0NDUwIDAuNzY0Mzc5Cit2dCAwLjMzNDY3NCAwLjc2NDE1MQordnQgMC4zMzU0NjkgMC43NjQ2NDYKK3Z0IDAuMzMyMzMwIDAuNzY2NTU0Cit2dCAwLjMzNDYxMCAwLjc2Nzk3NwordnQgMC4zMzQ5OTMgMC43NjM4MjEKK3Z0IDAuMzM1NTg0IDAuNzY0MTkwCit2dCAwLjA4MjU0MyAwLjc5MzAxMAordnQgMC4wODQ0OTEgMC43OTUwNjAKK3Z0IDAuMDg0MjkxIDAuNzk1Mzc1Cit2dCAwLjA4MjIxOSAwLjc5MzE5NAordnQgMC44OTY1NTkgMC4yOTU5ODIKK3Z0IDAuODk2MTcwIDAuMjk2MTY2Cit2dCAwLjA4NDExOCAwLjc5NTY3NgordnQgMC4wODE5MjUgMC43OTMzNzIKK3Z0IDAuMzM0OTMzIDAuNzkxNDc1Cit2dCAwLjMzNDgzMiAwLjc5MTcwNwordnQgMC4zMzIwODUgMC43ODkzODQKK3Z0IDAuMzMyMzEyIDAuNzg5MjAxCit2dCAwLjA4MTY3NiAwLjc5MzUyNwordnQgMC4wODM5NDcgMC43OTU5NzcKK3Z0IDAuODkyMjkwIDAuODc2MDQ2Cit2dCAwLjg5MjY3NSAwLjg3NTg4NwordnQgMC42MDc5OTEgMC44MzQyNTAKK3Z0IDAuNjA3OTg2IDAuODMxMDY5Cit2dCAwLjYwODM3OSAwLjgzNDExMwordnQgMC42MDgzOTQgMC44MzY1NTUKK3Z0IDAuNjA4MDA2IDAuODM2NzgwCit2dCAwLjMxNjY0OSAwLjkzMzEzNQordnQgMC4zMTY2NDkgMC45MzQ4MjEKK3Z0IDAuMzE2MjYwIDAuOTM2MDAwCit2dCAwLjMxNjI2MCAwLjkzMzI4NwordnQgMC4yNzg2ODMgMC45MjEzMTIKK3Z0IDAuMjc4Mjk4IDAuOTIxODM2Cit2dCAwLjI3ODI5NyAwLjkxODc2NgordnQgMC4yNzg2ODMgMC45MTg2MDYKK3Z0IDAuNDQzMjc1IDAuODI1NjEzCit2dCAwLjQ0MzY2MSAwLjgyNTUwOQordnQgMC40NDMyNzMgMC44MjY1NTcKK3Z0IDAuODk3MzU3IDAuMjE5NDA3Cit2dCAwLjg5NzE4OSAwLjIxOTM4NAordnQgMC44OTc1ODkgMC4yMTg0OTcKK3Z0IDAuODk4MDk1IDAuMjE3ODQzCit2dCAwLjM5OTI3MCAwLjgzNDY4MQordnQgMC4zOTk2NTQgMC44MzQzNzcKK3Z0IDAuNTcxMDQ1IDAuOTQ2MDIwCit2dCAwLjU3MDQzNiAwLjk0NTM5MgordnQgMC41NzEwNDUgMC45NDQ4MDEKK3Z0IDAuMzMxODQ1IDAuNzg5NTY2Cit2dCAwLjI5NzU1NyAwLjkzODc4OQordnQgMC4yOTc5NDIgMC45Mzg1NjUKK3Z0IDAuMjk3OTQyIDAuOTQxMTk1Cit2dCAwLjg5NzY1MiAwLjIxOTQ0MwordnQgMC44OTgwOTUgMC4yMjMxNTQKK3Z0IDAuODk3NzcxIDAuMjIyOTA0Cit2dCAwLjg5NzUwNSAwLjIyMjY5OAordnQgMC40NDMyOTEgMC44MjMyMTYKK3Z0IDAuNDQzNjc2IDAuODIzMjExCit2dCAwLjQ0MzY2MyAwLjk0NjU0NwordnQgMC40NDM2NjMgMC45NDg4NjUKK3Z0IDAuNDQzMjc0IDAuOTQ4ODY0Cit2dCAwLjQ0MzI3MyAwLjk0Njg1OQordnQgMC44MDM3NTYgMC45Mzg5MDgKK3Z0IDAuODAzNzU2IDAuOTQxNjY5Cit2dCAwLjgwMzUzMyAwLjk0MTQ1OQordnQgMC44MDM0ODggMC45MzkxOTMKK3Z0IDAuNDYwODc5IDAuOTYxNDE0Cit2dCAwLjQ2MDUwNiAwLjk1OTg2MAordnQgMC40NjA4NzkgMC45NTk3NjQKK3Z0IDAuOTY3NDk3IDAuODEyNTU1Cit2dCAwLjk2NzUzMyAwLjgxMzgzMQordnQgMC45NjcxNTEgMC44MTM4MzEKK3Z0IDAuNTcxMzQwIDAuOTQ0NTE5Cit2dCAwLjU3MTM0MCAwLjk0NjMyNAordnQgMC4wODcxOTYgMC43OTYyMDIKK3Z0IDAuOTI4NDg0IDAuMDkwMzE3Cit2dCAwLjkyODEwMSAwLjA5MDEwMQordnQgMC45Mjg0ODQgMC4wODcyNDgKK3Z0IDAuOTI4MTAyIDAuMDg3MDY5Cit2dCAwLjQyNDI3NyAwLjc0OTE4NQordnQgMC45MzQzMzcgMC40MTIwODkKK3Z0IDAuOTM0NzI2IDAuNDEyMjAxCit2dCAwLjkzNDcyNiAwLjQxNTA1MgordnQgMC45MzQzMzYgMC40MTM2NzUKK3Z0IDAuMzM2NTQxIDAuNzkxNzQ2Cit2dCAwLjMzNTcxMiAwLjc5MTgzNAordnQgMC44NDQ0MDkgMC4zMzc4NjMKK3Z0IDAuODQ0NDA5IDAuMzM3MDIyCit2dCAwLjg0NDQxMyAwLjMzMzkwNQordnQgMC42NjYyMjMgMC44MzU4NjkKK3Z0IDAuNjY2MjA5IDAuODMzNTM3Cit2dCAwLjY2NjI3MiAwLjgzNTg2OQordnQgMC42NjYyMDMgMC44MzAyNzUKK3Z0IDAuODQ0NzgyIDAuMzQxNDYzCit2dCAwLjg0NDQxMiAwLjM0MTA1OAordnQgMC40NDMzNDAgMC44MzUzMzIKK3Z0IDAuODQ0NzgwIDAuMzM5MjQwCit2dCAwLjQ0MzMzOSAwLjgyOTY4MgordnQgMC40NDM3MDkgMC44MzA4MDIKK3Z0IDAuNDQzMzQwIDAuODMxOTgxCit2dCAwLjQ0MzM0MCAwLjgzNDE3MAordnQgMC44NDQ3ODMgMC4zNDE4MDAKK3Z0IDAuODQ0NDEzIDAuMzQyMTMxCit2dCAwLjg0NDQ2MiAwLjM0MjEzMQordnQgMC44NDQ3ODMgMC4zNDI0MTMKK3Z0IDAuODQ0NzgzIDAuMzQyNzIwCit2dCAwLjg0NDQxNCAwLjM0MzAwOQordnQgMC44NDQ0NjMgMC4zNDMwMDkKK3Z0IDAuODQ0Nzg0IDAuMzQzNDI5Cit2dCAwLjg0NDg1MCAwLjM0MzQyOQordnQgMC44NDQ3ODUgMC4zNDQzMDQKK3Z0IDAuODQ0ODUxIDAuMzQ0MzA0Cit2dCAwLjM5OTY5NCAwLjgzNzQ3NgordnQgMC4zOTk2OTUgMC44MzgzMTgKK3Z0IDAuNjY2MjA5IDAuODI3MDA4Cit2dCAwLjY2NjIyMyAwLjgyNDY2MgordnQgMC42NjYyNzIgMC44MjQ2NjIKK3Z0IDAuMzk5MzMwIDAuODQxOTIxCit2dCAwLjQ0MzI3NCAwLjgyNDAzMgordnQgMC4zOTkzMjcgMC44Mzk2OTYKK3Z0IDAuNDQzNzA5IDAuODI4NTYyCit2dCAwLjQ0MzMzOSAwLjgyNzM4MwordnQgMC40NDMzNDAgMC44MjUxOTQKK3Z0IDAuNDQzMzQwIDAuODI0ODAyCit2dCAwLjQ0MzcwOSAwLjgyNDQ0MAordnQgMC4zOTkzMzAgMC44NDIyNTcKK3Z0IDAuMzk5NzAwIDAuODQyNTg4Cit2dCAwLjM5OTMzMSAwLjg0Mjg3MQordnQgMC4zOTkzMzEgMC44NDMxNzgKK3Z0IDAuMzk5NzAxIDAuODQzNDY2Cit2dCAwLjM5OTMzMiAwLjg0Mzg4OAordnQgMC4zOTkzMzMgMC44NDQ3NjMKK3Z0IDAuODQ0MDQxIDAuMzM3MDIyCit2dCAwLjg0NDA0MiAwLjMzNzg2MwordnQgMC44NDQwNDYgMC4zMzM5MDUKK3Z0IDAuNjY1ODU2IDAuODM1ODY5Cit2dCAwLjY2NTg0MiAwLjgzMzUzNwordnQgMC42NjU4MzYgMC44MzAyNzUKK3Z0IDAuODQ0MDQ1IDAuMzQxMDU4Cit2dCAwLjg0NDA0NSAwLjM0MTQ2NAordnQgMC40NDQwNzYgMC44MzYxODAKK3Z0IDAuNDQ0MDc3IDAuODM1MzMyCit2dCAwLjQ0NDA3NyAwLjgzMjgwNwordnQgMC40NDQwNzcgMC44MzM4NTUKK3Z0IDAuODQ0MDQzIDAuMzM5MjQwCit2dCAwLjQ0NDA3NiAwLjgyOTY4MgordnQgMC40NDQwNzcgMC44MzA4MDIKK3Z0IDAuNDQ0MDc3IDAuODMxOTgxCit2dCAwLjQ0NDA3NyAwLjgzNDE3MAordnQgMC40NDQwNzcgMC44MzQ1NjEKK3Z0IDAuNDQ0MDc3IDAuODM0OTI0Cit2dCAwLjg0NDA0NiAwLjM0MTgwMAordnQgMC44NDQwNDYgMC4zNDIxMzEKK3Z0IDAuODQ0MDQ2IDAuMzQyNDE0Cit2dCAwLjg0NDA0NyAwLjM0MjcyMAordnQgMC44NDQwNDcgMC4zNDMwMDkKK3Z0IDAuODQ0MDQ3IDAuMzQzNDMwCit2dCAwLjg0NDA0OCAwLjM0NDMwNAordnQgMC44NDQwNDQgMC4zNDAwNzQKK3Z0IDAuNDAwMDYyIDAuODM4MzE3Cit2dCAwLjQwMDA2MSAwLjgzNzQ3NgordnQgMC40MDAwNzAgMC44MzQzNzcKK3Z0IDAuNjY1ODQyIDAuODI3MDA4Cit2dCAwLjY2NTg1NiAwLjgyNDY2MgordnQgMC40MDAwNjYgMC44NDE5MjAKK3Z0IDAuNDAwMDY2IDAuODQxNTE0Cit2dCAwLjQ0NDA3NyAwLjgyNDAzMgordnQgMC40NDQwNzcgMC44MjMxODQKK3Z0IDAuNDQ0MDc2IDAuODI2NTU2Cit2dCAwLjQ0NDA3NyAwLjgyNTUwOQordnQgMC40MDAwNjQgMC44Mzk2OTUKK3Z0IDAuNDQ0MDc3IDAuODI4NTYyCit2dCAwLjQ0NDA3NiAwLjgyNzM4MwordnQgMC40NDQwNzcgMC44MjUxOTQKK3Z0IDAuNDQ0MDc3IDAuODI0ODAyCit2dCAwLjQ0NDA3NyAwLjgyNDQ0MAordnQgMC40MDAwNjcgMC44NDIyNTcKK3Z0IDAuNDAwMDY3IDAuODQyNTg4Cit2dCAwLjQwMDA2OCAwLjg0Mjg3MQordnQgMC40MDAwNjggMC44NDMxNzcKK3Z0IDAuNDAwMDY4IDAuODQzNDY2Cit2dCAwLjQwMDA2OSAwLjg0Mzg4NwordnQgMC40MDAwNzAgMC44NDQ3NjIKK3Z0IDAuNDAwMDY1IDAuODQwNTI5Cit2dCAwLjczNTY0OSAwLjUyMzg4NwordnQgMC43MzU0MzggMC41MjQxMDcKK3Z0IDAuNzM1MDE0IDAuNTI0MTA3Cit2dCAwLjg0MzYyMyAwLjIwOTAzMwordnQgMC44NDMyMzQgMC4yMDkyNTAKK3Z0IDAuODQzMjM0IDAuMjA4NDA5Cit2dCAwLjUzMzYyMSAwLjg5NzM1OQordnQgMC41MzMyMzkgMC44OTczNTMKK3Z0IDAuNTMzMjQ5IDAuODk0NjExCit2dCAwLjUzMzYzMiAwLjg5NDQxOQordnQgMC45MDIzODIgMC41NTMwNjAKK3Z0IDAuOTAyNzcwIDAuNTUzMDUwCit2dCAwLjkwMjc3NyAwLjU1NTYxOAordnQgMC45MDIzODkgMC41NTU3NTkKK3Z0IDAuODU3ODM3IDAuNDc1NDkzCit2dCAwLjg1NzgzMyAwLjQ3Mjc1MQordnQgMC44NTgyMTYgMC40NzI3NDcKK3Z0IDAuODU4MjIyIDAuNDc1NjI1Cit2dCAwLjg1ODIzNSAwLjQ3NzY5OQordnQgMC44NTc4NTAgMC40Nzc0NjMKK3Z0IDAuNzI5NTI1IDAuNTI3MTIyCit2dCAwLjczMTcyMiAwLjUyNDc4MgordnQgMC43MzIwMjUgMC41MjQ5NjgKK3Z0IDAuNzI5ODczIDAuNTI3MjI4Cit2dCAwLjY0MzEzOCAwLjgzMDIzMQordnQgMC42NDM1MjIgMC44MzAyMjYKK3Z0IDAuNjQzNTI4IDAuODMzNTAxCit2dCAwLjY0MzE0MyAwLjgzMzM5OQordnQgMC43MzY2MDYgMC44OTk0NTYKK3Z0IDAuNzM2OTkzIDAuODk5NjIwCit2dCAwLjczNjk4OSAwLjkwMjA1MAordnQgMC43MzY2MDEgMC45MDIwNTEKK3Z0IDAuNzA3Njk3IDAuOTA2NDc4Cit2dCAwLjcwNzMxNiAwLjkwNjQ3MwordnQgMC43MDczMjUgMC45MDQxNTcKK3Z0IDAuNzA3NzA3IDAuOTA0MDA0Cit2dCAwLjE3MjkzMiAwLjc2NzkxNAordnQgMC4xNzI4NDggMC43Njc1OTgKK3Z0IDAuMTc0ODY3IDAuNzY2MzM5Cit2dCAwLjE3NTA5MiAwLjc2NjU2OAordnQgMC4zNTcwNzEgMC45MDg5OTkKK3Z0IDAuMzU2Njg4IDAuOTA4ODM3Cit2dCAwLjM1NjY4MyAwLjkwNjU2NwordnQgMC4zNTcwNjcgMC45MDY1NjMKK3Z0IDAuOTEyMTc0IDAuMzU4NjE0Cit2dCAwLjkxMjU2MiAwLjM1ODYwMgordnQgMC45MTI1NjcgMC4zNjA3MjYKK3Z0IDAuOTEyMTc5IDAuMzYwODk0Cit2dCAwLjE3Mjc3MCAwLjc2NzI4MwordnQgMC4xNzQ2NDggMC43NjYxMTIKK3Z0IDAuOTE0MDQzIDAuODU3NjYwCit2dCAwLjkxNDQzMCAwLjg1NzgyNAordnQgMC45MTQ0MjcgMC44NTk3NzUKK3Z0IDAuOTE0MDM5IDAuODU5Nzc2Cit2dCAwLjkxODE0OCAwLjAyNjQzNwordnQgMC45MTc3NjcgMC4wMjY0MzEKK3Z0IDAuOTE3Nzc0IDAuMDI0NTc0Cit2dCAwLjkxODE1NSAwLjAyNDQyMQordnQgMC4xNzI2OTcgMC43NjY5OTkKK3Z0IDAuMTcyNjEzIDAuNzY2NjgzCit2dCAwLjE3NDIyNCAwLjc2NTY3OQordnQgMC4xNzQ0NDkgMC43NjU5MDcKK3Z0IDAuNjMwNDQzIDAuOTIwNTk4Cit2dCAwLjYzMDA2MCAwLjkyMDQzNgordnQgMC42MzAwNTcgMC45MTg2NDYKK3Z0IDAuNjMwNDQwIDAuOTE4NjQyCit2dCAwLjE3NzczMyAwLjkyMDkwMwordnQgMC4xNzgxMjIgMC45MjA4OTAKK3Z0IDAuMTc4MTI2IDAuOTIyNTYzCit2dCAwLjE3NzczOCAwLjkyMjczMQordnQgMC4xNzI1MzUgMC43NjYzNjgKK3Z0IDAuMTc0MDA1IDAuNzY1NDUyCit2dCAwLjIyODA5NiAwLjkyNDE4OAordnQgMC4yMjg0ODMgMC45MjQzNTMKK3Z0IDAuMjI4NDgxIDAuOTI1ODI0Cit2dCAwLjIyODA5MyAwLjkyNTgyNQordnQgMC45MzExMzYgMC4yMTk0MDEKK3Z0IDAuOTMwNzU1IDAuMjE5Mzk2Cit2dCAwLjkzMDc2MSAwLjIxNzk5NgordnQgMC45MzExNDIgMC4yMTc4NDMKK3Z0IDAuMTcyNDYyIDAuNzY2MDg0Cit2dCAwLjE3MjM3OCAwLjc2NTc2OAordnQgMC4xNzM1ODEgMC43NjUwMTgKK3Z0IDAuMTczODA2IDAuNzY1MjQ3Cit2dCAwLjkzNTQyMCAwLjY4MDA0MAordnQgMC45MzUwMzYgMC42Nzk4NzkKK3Z0IDAuOTM1MDM0IDAuNjc4NTY5Cit2dCAwLjkzNTQxNyAwLjY3ODU2NQordnQgMC41NDkwNzYgMC45MzUzMTAKK3Z0IDAuNTQ5NDY0IDAuOTM1Mjk4Cit2dCAwLjU0OTQ2NyAwLjkzNjUyMAordnQgMC41NDkwNzkgMC45MzY2ODgKK3Z0IDAuMTcyMzAwIDAuNzY1NDUzCit2dCAwLjE3MzM2MiAwLjc2NDc5MQordnQgMC4zNzM0MzQgMC45NDY3NDcKK3Z0IDAuMzczODIyIDAuOTQ2OTEyCit2dCAwLjM3MzgyMCAwLjk0NzkwNAordnQgMC4zNzM0MzMgMC45NDc5MDUKK3Z0IDAuOTI2MzM4IDAuOTUxMTg2Cit2dCAwLjkyNTk1NyAwLjk1MTE4MQordnQgMC45MjU5NjEgMC45NTAyMzkKK3Z0IDAuOTI2MzQyIDAuOTUwMDg2Cit2dCAwLjE3MjIyNyAwLjc2NTE3MAordnQgMC4xNzIxNDMgMC43NjQ4NTMKK3Z0IDAuMTcyOTM4IDAuNzY0MzU4Cit2dCAwLjE3MzE2MiAwLjc2NDU4NgordnQgMC4xNzYzODcgMC43NjQyMjMKK3Z0IDAuMTc2NjQ4IDAuNzY0MjkxCit2dCAwLjE3NTI4MiAwLjc2Njc2MQordnQgMC4xNzMwMDIgMC43NjgxODQKK3Z0IDAuMTcwMzcxIDAuNzY3OTc4Cit2dCAwLjE3MDMwMSAwLjc2ODI1MQordnQgMC4xNzU1MDUgMC43NjM5OTYKK3Z0IDAuMTc1Nzc5IDAuNzY0MDY2Cit2dCAwLjE3MDYxMCAwLjc2NzA1MQordnQgMC4xNzA1MzYgMC43NjczMzkKK3Z0IDAuMTc0NjIzIDAuNzYzNzY4Cit2dCAwLjE3NDg5NiAwLjc2MzgzOQordnQgMC4xNzA4NDkgMC43NjYxMjUKK3Z0IDAuMTcwNzc1IDAuNzY2NDEyCit2dCAwLjE3Mzc0MCAwLjc2MzU0MQordnQgMC4xNzQwMTQgMC43NjM2MTEKK3Z0IDAuMTcxMDg4IDAuNzY1MTk5Cit2dCAwLjE3MTAxNCAwLjc2NTQ4NgordnQgMC4xNzI2MTkgMC43NjQwMjgKK3Z0IDAuMTcyOTk1IDAuNzYzMzQ5Cit2dCAwLjE3MzQzMyAwLjc2MzQ2MgordnQgMC4xNzExNjggMC43NjQ4NzgKK3Z0IDAuMTcxMjkwIDAuNzY0NDE2Cit2dCAwLjE3MjAyOCAwLjc2NDM5NwordnQgMC4xNzIzNDIgMC43NjMxODAKK3Z0IDAuMTcxNjU1IDAuNzYzMDAzCit2dCAwLjczNTIyMyAwLjUyNDMyNwordnQgMC43MzIyOTUgMC41MjUxNTQKK3Z0IDAuNzMwNTQ3IDAuNTI3NTE4Cit2dCAwLjczMDIyMyAwLjUyNzMzNQordnQgMC43MzI0OTUgMC41MjU0NjgKK3Z0IDAuODk2NzE0IDAuMzEwODk3Cit2dCAwLjg5NjMyNSAwLjMxMDg5OQordnQgMC44OTYzMzAgMC4zMDc4NDUKK3Z0IDAuODk2NzE5IDAuMzA4MDI3Cit2dCAwLjg0MzIzMyAwLjIwNTIxNQordnQgMC44NDM2MjIgMC4yMDUzMzEKK3Z0IDAuODQzNjIwIDAuMjA2MTk5Cit2dCAwLjUzMzYzMiAwLjkwMDI1MAordnQgMC41MzMyNDkgMC45MDAwNDgKK3Z0IDAuOTAyMzg5IDAuNTUwMzI1Cit2dCAwLjkwMjc3NyAwLjU1MDQ0OAordnQgMC4zMzEzNTYgMC44NTUzNTMKK3Z0IDAuMzMwOTY5IDAuODU1NDg4Cit2dCAwLjMzMDk2NCAwLjg1MjYyMgordnQgMC4zMzEzNTEgMC44NTI2MjIKK3Z0IDAuMzMwOTgyIDAuODU3NTMxCit2dCAwLjMzMTM2OCAwLjg1NzI5NAordnQgMC42MzA0NDUgMC45MDA4ODgKK3Z0IDAuNjMwNDQwIDAuOTAzNDcyCit2dCAwLjYzMDA1NyAwLjkwMzQ3NgordnQgMC42MzAwNjEgMC45MDEwNTYKK3Z0IDAuNzA3NzA3IDAuOTA4OTA3Cit2dCAwLjcwNzMyNSAwLjkwODc0NQordnQgMC4xNjgxODMgMC43NjY2ODkKK3Z0IDAuMTY2OTQ0IDAuNzY0NDY3Cit2dCAwLjE2NzI0NiAwLjc2NDM3NAordnQgMC4xNjg0MDQgMC43NjY0NTIKK3Z0IDAuOTA4NzI2IDAuMjIyNzAwCit2dCAwLjkwODcyMiAwLjIyMDI3MwordnQgMC45MDkxMTAgMC4yMjAyNzIKK3Z0IDAuOTA5MTE0IDAuMjIyNTM0Cit2dCAwLjkxMjE3OSAwLjM1NjMwOAordnQgMC45MTI1NjcgMC4zNTY0NTUKK3Z0IDAuMTY3NTUzIDAuNzY0MjgyCit2dCAwLjE2ODYzMSAwLjc2NjIxNgordnQgMC45MTQ1MDIgMC44MzY3NTQKK3Z0IDAuOTE0NDk4IDAuODM4ODYxCit2dCAwLjkxNDExNSAwLjgzODg2NQordnQgMC45MTQxMTggMC44MzY5MjMKK3Z0IDAuOTE4MTU1IDAuMDI4NDExCit2dCAwLjkxNzc3NCAwLjAyODI1MAordnQgMC4xNjg4MzIgMC43NjYwMDIKK3Z0IDAuMTY3ODI3IDAuNzY0MjAwCit2dCAwLjE2ODEyOCAwLjc2NDEwNwordnQgMC4xNjkwNTMgMC43NjU3NjUKK3Z0IDAuOTE5NzQ0IDAuMjA1ODA1Cit2dCAwLjkxOTc0MSAwLjIwMzg1NwordnQgMC45MjAxMjkgMC4yMDM4NTYKK3Z0IDAuOTIwMTMyIDAuMjA1NjM5Cit2dCAwLjE3NzczOCAwLjkxOTA1OAordnQgMC4xNzgxMjYgMC45MTkyMDQKK3Z0IDAuMTY4NDM1IDAuNzY0MDE1Cit2dCAwLjE2OTI3OSAwLjc2NTUyOQordnQgMC45Mjc4ODAgMC4xNjQ5MTEKK3Z0IDAuOTI3ODc3IDAuMTY2NTQxCit2dCAwLjkyNzQ5NCAwLjE2NjU0NQordnQgMC45Mjc0OTYgMC4xNjUwODAKK3Z0IDAuOTMxMTQyIDAuMjIwOTIxCit2dCAwLjkzMDc2MSAwLjIyMDc2MAordnQgMC4xNjk0ODAgMC43NjUzMTUKK3Z0IDAuMTY4NzA5IDAuNzYzOTMyCit2dCAwLjE2OTAxMSAwLjc2Mzg0MAordnQgMC4xNjk3MDEgMC43NjUwNzgKK3Z0IDAuOTM0ODEyIDAuMzc1MzgxCit2dCAwLjkzNDgxMCAwLjM3MzkxMgordnQgMC45MzUxOTggMC4zNzM5MTEKK3Z0IDAuOTM1MjAwIDAuMzc1MjE1Cit2dCAwLjU0OTA3OSAwLjkzMzkyNgordnQgMC41NDk0NjcgMC45MzQwNzIKK3Z0IDAuMTY5MzE4IDAuNzYzNzQ4Cit2dCAwLjE2OTkyNyAwLjc2NDg0MgordnQgMC43MDcyOTEgMC45NDY3ODgKK3Z0IDAuNzA3Mjg5IDAuOTQ3OTQwCit2dCAwLjcwNjkwNiAwLjk0Nzk0NAordnQgMC43MDY5MDggMC45NDY5NTcKK3Z0IDAuOTI2MzQyIDAuOTUyMjUyCit2dCAwLjkyNTk2MSAwLjk1MjA5MQordnQgMC4xNzAxMjggMC43NjQ2MjkKK3Z0IDAuMTY5NTkyIDAuNzYzNjY1Cit2dCAwLjE2OTg5MyAwLjc2MzU3MwordnQgMC4xNzAzNDkgMC43NjQzOTEKK3Z0IDAuMTY2Njg0IDAuNzY0NTQ0Cit2dCAwLjE2NjY4NCAwLjc2MTcyMQordnQgMC4xNjY5NDQgMC43NjE3ODgKK3Z0IDAuMTY3OTkyIDAuNzY2ODkyCit2dCAwLjE2NzU1MyAwLjc2MTk0NQordnQgMC4xNjc4MjcgMC43NjIwMTYKK3Z0IDAuMTY4NDM1IDAuNzYyMTczCit2dCAwLjE2ODcwOSAwLjc2MjI0MwordnQgMC4xNjkzMTggMC43NjI0MDAKK3Z0IDAuMTY5NTkyIDAuNzYyNDcxCit2dCAwLjE2OTg5MyAwLjc2MjU0OQordnQgMC4xNzAzMzcgMC43NjI2NjMKK3Z0IDAuMTcwMzM3IDAuNzYzNDQwCit2dCAwLjE3MDY3NiAwLjc2NDA0OAordnQgMC4xNzA5OTAgMC43NjI4MzIKK3Z0IDAuMTE5ODc4IDAuNzk0MDM1Cit2dCAwLjEyMTgyNiAwLjc5NjA4NAordnQgMC4xMjE2MzEgMC43OTYzOTkKK3Z0IDAuMTE5NTU5IDAuNzk0MjE4Cit2dCAwLjg5NjY3MyAwLjAwODM1OAordnQgMC44OTY2NzggMC4wMDU1MDAKK3Z0IDAuODk3MDYyIDAuMDA1MzEzCit2dCAwLjg5NzA1NyAwLjAwODM1NAordnQgMC4xMjE0NTggMC43OTY3MDEKK3Z0IDAuMTE5MjY1IDAuNzk0Mzk2Cit2dCAwLjE2OTM3NiAwLjc5MTI4OAordnQgMC4xNjkyMzAgMC43OTE0OTMKK3Z0IDAuMTY3MDMwIDAuNzg4NjQ2Cit2dCAwLjE2NzI5MSAwLjc4ODUxNQordnQgMC4xMTg0NzggMC43OTExNjcKK3Z0IDAuMTE4NzcyIDAuNzkxMTY3Cit2dCAwLjExOTAxMSAwLjc5NDU1MgordnQgMC4xMjEyODIgMC43OTcwMDEKK3Z0IDAuODkyNDA1IDAuODYxMDQ2Cit2dCAwLjg5MjQxMCAwLjg2NDI3MwordnQgMC44OTIwMjIgMC44NjQ0MjkKK3Z0IDAuODkyMDE3IDAuODYxMDQ3Cit2dCAwLjYxOTAyMiAwLjgzMDY4MwordnQgMC42MTkwMjcgMC44MjczMDkKK3Z0IDAuNjE5NDEzIDAuODI3MTY5Cit2dCAwLjYxOTQwNyAwLjgzMDY4MAordnQgMC42MTkwNDMgMC44MjQ4ODgKK3Z0IDAuNjE5NDI5IDAuODI0NjYyCit2dCAwLjQ4MjEyNiAwLjkzNjE2NwordnQgMC40ODIxMjYgMC45MzQ0ODUKK3Z0IDAuNDgyNTExIDAuOTMzMzA1Cit2dCAwLjQ4MjUxMSAwLjkzNjAxMgordnQgMC40NDMyNzMgMC45MTk3MTEKK3Z0IDAuNDQzNjYzIDAuOTE5MTgwCit2dCAwLjQ0MzY2MyAwLjkyMjI2OAordnQgMC40NDMyNzQgMC45MjI0MjQKK3Z0IDAuNjgzMjk0IDAuODI1Mzg0Cit2dCAwLjY4MzY4MyAwLjgyNTI4MgordnQgMC42ODMyOTYgMC44MjYzMjkKK3Z0IDAuODkyNDUzIDAuODk0ODQ1Cit2dCAwLjg5MjI4NCAwLjg5NDgyMwordnQgMC44OTI2ODMgMC44OTM5MzUKK3Z0IDAuODkzMTg5IDAuODkzMjgxCit2dCAwLjcyOTQzNiAwLjUzMDM4NgordnQgMC43MjkwNjEgMC41MzAzODYKK3Z0IDAuODQzNjMxIDAuMjExOTg3Cit2dCAwLjg0MzI0MyAwLjIxMjI5OQordnQgMC41OTU2MTQgMC45NDY0OTIKK3Z0IDAuNTk1MDA0IDAuOTQ1ODYzCit2dCAwLjU5NTYxNCAwLjk0NTI3MwordnQgMC4xNjY3NTMgMC43ODg3NzMKK3Z0IDAuODQzMjU1IDAuMjAyNDkzCit2dCAwLjg5Mjc0MyAwLjg5NDg3OAordnQgMC44OTMxODkgMC44OTg1ODkKK3Z0IDAuODkyODcwIDAuODk4MzQzCit2dCAwLjg5MjYwMyAwLjg5ODEzNwordnQgMC42ODMyNzkgMC44MjI5NjQKK3Z0IDAuNjgzNjY5IDAuODIyOTYzCit2dCAwLjQ2MDg5MSAwLjk0NjgzNQordnQgMC40NjA4OTEgMC45NDkxMzIKK3Z0IDAuNDYwNTA2IDAuOTQ5MTM5Cit2dCAwLjQ2MDUwNiAwLjk0NzE1MgordnQgMC4yNzg1NDAgMC45MzMwNjEKK3Z0IDAuMjc4NzgxIDAuOTM1ODEyCit2dCAwLjI3ODU0MCAwLjkzNTYyMgordnQgMC4yNzgyOTcgMC45MzMzNjkKK3Z0IDAuODQzNjMzIDAuMjAxOTA2Cit2dCAwLjg0MzYyMCAwLjIwMzU1MgordnQgMC44NDMyMzMgMC4yMDMyNjQKK3Z0IDAuODQzMjQzIDAuMjAxOTIwCit2dCAwLjU5NTkwNSAwLjk0NDk4NwordnQgMC41OTU5MDUgMC45NDY3OTIKK3Z0IDAuMTI0NTM2IDAuNzk3MjI2Cit2dCAwLjkyNzUyNSAwLjI3MTQwOAordnQgMC45Mjc5MTUgMC4yNzE2MTEKK3Z0IDAuOTI3NTI1IDAuMjc0NTAzCit2dCAwLjkyNzkxNSAwLjI3NDY2NQordnQgMC43Mzg0NzggMC41MjQ1NTIKK3Z0IDAuOTM1MzI5IDAuNzU3OTQ3Cit2dCAwLjkzNDk2NCAwLjc1Nzc3MwordnQgMC45MzUzMjkgMC43NTQ5NzkKK3Z0IDAuMTcyMjYwIDAuNzkyMDM1Cit2dCAwLjE3MDg5MiAwLjc5MTg5MAordnQgMC4xNzAwNjMgMC43OTE4MDIKK3Z0IDAuMjI4NDc4IDAuODQwODU3Cit2dCAwLjIyODQ3NyAwLjg0MTY5OQordnQgMC4yMjgwOTMgMC44NDE0ODYKK3Z0IDAuNzM1MDE0IDAuNTM2NjY1Cit2dCAwLjczNTQzOCAwLjUzNjY2NQordnQgMC43MzU2NDkgMC41MzY4ODUKK3Z0IDAuODU4OTM2IDAuODk2Nzk5Cit2dCAwLjg1ODk0MyAwLjg5Mzg0MwordnQgMC44NTkzMzMgMC44OTQwMjcKK3Z0IDAuODU5MzI2IDAuODk2Nzg2Cit2dCAwLjkwMjQ0NyAwLjc4OTIyMAordnQgMC45MDI0NTggMC43OTE5MzgKK3Z0IDAuOTAyMDc1IDAuNzkxODAzCit2dCAwLjkwMjA2NSAwLjc4OTIxNgordnQgMC44NTc4MzcgMC40NzAwMjcKK3Z0IDAuODU4MjIyIDAuNDY5ODg5Cit2dCAwLjg1ODIzNSAwLjQ2Nzg2NQordnQgMC44NTc4NTAgMC40NjgxMDQKK3Z0IDAuNzI5NTI1IDAuNTMzNjUwCit2dCAwLjcyOTg3MyAwLjUzMzU0NAordnQgMC43MzIwMjUgMC41MzU4MDQKK3Z0IDAuNzMxNzIyIDAuNTM1OTg5Cit2dCAwLjY0MzE0MyAwLjgyNzA4NAordnQgMC42NDM1MjggMC44MjY5NzMKK3Z0IDAuNzM2NjA2IDAuOTA0NjQzCit2dCAwLjczNjk5MyAwLjkwNDQ3NwordnQgMC4wODExMzggMC45MDYzNzEKK3Z0IDAuMDgxMTQ0IDAuOTAzODgzCit2dCAwLjA4MTUzMiAwLjkwNDAyOQordnQgMC4wODE1MjYgMC45MDYzNTgKK3Z0IDAuMTc1MTQ4IDAuNzU5MzIyCit2dCAwLjE3NjM4NyAwLjc2MTU0NQordnQgMC4xNzYwODAgMC43NjE2MzYKK3Z0IDAuMTc0OTIyIDAuNzU5NTU5Cit2dCAwLjM1NzA3MSAwLjkwNDE0MwordnQgMC4zNTY2ODggMC45MDQzMTIKK3Z0IDAuOTEyNjMyIDAuODE0ODQ3Cit2dCAwLjkxMjY0MCAwLjgxNzE0MwordnQgMC45MTIyNTkgMC44MTY5ODEKK3Z0IDAuOTEyMjUwIDAuODE0ODQyCit2dCAwLjE3NTc3OSAwLjc2MTcyOQordnQgMC4xNzQ3MDEgMC43NTk3OTYKK3Z0IDAuOTE0MDQzIDAuODYxODg5Cit2dCAwLjkxNDQzMCAwLjg2MTcyMwordnQgMC45MTc1NTEgMC4yMzY0MzEKK3Z0IDAuOTE3NTU2IDAuMjM0NDA0Cit2dCAwLjkxNzk0NCAwLjIzNDU1MAordnQgMC45MTc5MzkgMC4yMzY0MTkKK3Z0IDAuMTc0NTAwIDAuNzYwMDA5Cit2dCAwLjE3NTUwNSAwLjc2MTgxMgordnQgMC4xNzUxOTggMC43NjE5MDQKK3Z0IDAuMTc0Mjc0IDAuNzYwMjQ2Cit2dCAwLjYzMDQ0MyAwLjkxNjY5OQordnQgMC42MzAwNjAgMC45MTY4NjgKK3Z0IDAuNzA3Njk3IDAuOTIxMzY3Cit2dCAwLjcwNzcwNCAwLjkyMzIwOAordnQgMC43MDczMjIgMC45MjMwNDYKK3Z0IDAuNzA3MzE2IDAuOTIxMzYxCit2dCAwLjE3NDg5NiAwLjc2MTk5NgordnQgMC4xNzQwNTMgMC43NjA0ODMKK3Z0IDAuMjI4MDk2IDAuOTI3NDU5Cit2dCAwLjIyODQ4MyAwLjkyNzI5MwordnQgMC45Mjk0OTkgMC4wMDY4NzkKK3Z0IDAuOTI5NTAyIDAuMDA1MzEzCit2dCAwLjkyOTg5MCAwLjAwNTQ1OQordnQgMC45Mjk4ODcgMC4wMDY4NjcKK3Z0IDAuMTczODUyIDAuNzYwNjk2Cit2dCAwLjE3NDYyMyAwLjc2MjA3OQordnQgMC4xNzQzMTYgMC43NjIxNzEKK3Z0IDAuMTczNjI1IDAuNzYwOTMzCit2dCAwLjkzNTQyMCAwLjY3NzEwMAordnQgMC45MzUwMzYgMC42NzcyNjkKK3Z0IDAuOTM4NDY3IDAuNzcyOTAxCit2dCAwLjkzODQ3MyAwLjc3NDI4OQordnQgMC45MzgwOTEgMC43NzQxMjcKK3Z0IDAuOTM4MDg2IDAuNzcyODk2Cit2dCAwLjE3NDAxNCAwLjc2MjI2MwordnQgMC4xNzM0MDQgMC43NjExNzAKK3Z0IDAuMzczNDM0IDAuOTQ5MDYwCit2dCAwLjM3MzgyMiAwLjk0ODg5NAordnQgMC4yNTkyMjggMC45NTA4MzEKK3Z0IDAuMjU5MjMxIDAuOTQ5NzI1Cit2dCAwLjI1OTYxOSAwLjk0OTg3MgordnQgMC4yNTk2MTcgMC45NTA4MTkKK3Z0IDAuMTczMjAzIDAuNzYxMzgzCit2dCAwLjE3Mzc0MCAwLjc2MjM0NgordnQgMC4xNzM0MzMgMC43NjI0MzgKK3Z0IDAuMTcyOTc3IDAuNzYxNjE5Cit2dCAwLjE3NjY0OCAwLjc2MTQ2OAordnQgMC4xNzUzNDAgMC43NTkxMjAKK3Z0IDAuMTcyOTM4IDAuNzU4MDI4Cit2dCAwLjE3MzAwOCAwLjc1Nzc1NQordnQgMC4xNzI2OTkgMC43NTg5NTQKK3Z0IDAuMTcyNzczIDAuNzU4NjY3Cit2dCAwLjE3MjQ2MCAwLjc1OTg4MQordnQgMC4xNzI1MzQgMC43NTk1OTMKK3Z0IDAuMTcyMjIxIDAuNzYwODA3Cit2dCAwLjE3MjI5NSAwLjc2MDUyMAordnQgMC4xNzI5OTUgMC43NjI1NzIKK3Z0IDAuMTcyMTM2IDAuNzYxMTI2Cit2dCAwLjE3MjY1NiAwLjc2MTk2NAordnQgMC4xNzIwMTkgMC43NjE1OTAKK3Z0IDAuNzMyMjk1IDAuNTM1NjE4Cit2dCAwLjczNTIyMyAwLjUzNjQ0NQordnQgMC43MzA1NDcgMC41MzMyNTQKK3Z0IDAuNzMyNDk1IDAuNTM1MzAzCit2dCAwLjczMDIyMyAwLjUzMzQzNwordnQgMC44OTY3MTkgMC4zMTM3NjMKK3Z0IDAuODk2MzMwIDAuMzEzOTQ4Cit2dCAwLjIyODQ4MiAwLjgzNzY2MQordnQgMC4yMjgwOTQgMC44Mzg2NDUKK3Z0IDAuMjI4MDk4IDAuODM3NzgxCit2dCAwLjg1OTMzMyAwLjg5OTQ2MQordnQgMC44NTg5NDMgMC44OTk2NzAKK3Z0IDAuOTAyMDc1IDAuNzg2NjMwCit2dCAwLjkwMjQ1OCAwLjc4NjUwMQordnQgMC4zMzEzNTYgMC44NDk4ODYKK3Z0IDAuMzMwOTY5IDAuODQ5NzUyCit2dCAwLjMzMDk4MiAwLjg0NzY5NgordnQgMC4zMzEzNjggMC44NDc5MzMKK3Z0IDAuNjMwNDQ1IDAuOTA2MDc0Cit2dCAwLjYzMDA2MSAwLjkwNTkxMwordnQgMC4wODE1MzIgMC45MDg2MTQKK3Z0IDAuMDgxMTQ0IDAuOTA4NzgyCit2dCAwLjE3MDQwMCAwLjc1ODA5OAordnQgMC4xNzA0NzggMC43NTg0MTMKK3Z0IDAuMTY4NDU5IDAuNzU5NjcxCit2dCAwLjE2ODI0MCAwLjc1OTQ0NAordnQgMC45MDg3MjYgMC4yMTc4NDMKK3Z0IDAuOTA5MTE0IDAuMjE4MDA3Cit2dCAwLjkxMjI1OSAwLjgxMjcwOAordnQgMC45MTI2NDAgMC44MTI1NTUKK3Z0IDAuMTcwNTYyIDAuNzU4NzI5Cit2dCAwLjE2ODY4NCAwLjc1OTkwMAordnQgMC45MTQ1MDIgMC44NDA5ODMKK3Z0IDAuOTE0MTE4IDAuODQwODIxCit2dCAwLjkxNzk0NCAwLjIzODIyNAordnQgMC45MTc1NTYgMC4yMzgzOTIKK3Z0IDAuMTcwNjM1IDAuNzU5MDEzCit2dCAwLjE3MDcxMyAwLjc1OTMyNwordnQgMC4xNjkxMDIgMC43NjAzMzIKK3Z0IDAuMTY4ODgzIDAuNzYwMTA1Cit2dCAwLjkxOTc0NCAwLjIwMTkwNgordnQgMC45MjAxMzIgMC4yMDIwNzEKK3Z0IDAuNzA3MzIyIDAuOTE5Njg1Cit2dCAwLjcwNzcwNCAwLjkxOTUzMgordnQgMC4xNzA3OTcgMC43NTk2NDQKK3Z0IDAuMTY5MzI3IDAuNzYwNTYwCit2dCAwLjkyNzg4MCAwLjE2ODE4MgordnQgMC45Mjc0OTYgMC4xNjgwMjAKK3Z0IDAuOTI5ODkwIDAuMDA4MjIxCit2dCAwLjkyOTUwMiAwLjAwODM4OQordnQgMC4xNzA4NzAgMC43NTk5MjcKK3Z0IDAuMTcwOTQ5IDAuNzYwMjQyCit2dCAwLjE2OTc0NSAwLjc2MDk5MgordnQgMC4xNjk1MjYgMC43NjA3NjUKK3Z0IDAuOTM0ODEyIDAuMzcyNDQwCit2dCAwLjkzNTIwMCAwLjM3MjYwNQordnQgMC45MzgwOTEgMC43NzE2NzgKK3Z0IDAuOTM4NDczIDAuNzcxNTI1Cit2dCAwLjE3MTAzMiAwLjc2MDU1OAordnQgMC4xNjk5NzAgMC43NjEyMjEKK3Z0IDAuNzA3MjkxIDAuOTQ5MTAxCit2dCAwLjcwNjkwOCAwLjk0ODkzOQordnQgMC4yNTk2MTkgMC45NTE3MjIKK3Z0IDAuMjU5MjMxIDAuOTUxODkwCit2dCAwLjE3MTEwNSAwLjc2MDg0MgordnQgMC4xNzExODQgMC43NjExNTcKK3Z0IDAuMTcwMzg4IDAuNzYxNjUzCit2dCAwLjE3MDE2OSAwLjc2MTQyNgordnQgMC4xNjgwNDkgMC43NTkyNTAKK3Z0IDAuMTcwMzMwIDAuNzU3ODI4Cit2dCAwLjE3MDcxMyAwLjc2MTk4NAordnQgMC4xNzEzMDQgMC43NjE2MTUKK3Z0IDAuMTE5ODc4IDAuNzg4Mjk5Cit2dCAwLjExOTU1OSAwLjc4ODExNgordnQgMC4xMjE2MzEgMC43ODU5MzUKK3Z0IDAuMTIxODI2IDAuNzg2MjUwCit2dCAwLjg5NzA2MiAwLjAxMTQxNQordnQgMC44OTY2NzggMC4wMTEyMzYKK3Z0IDAuMTIxNDU4IDAuNzg1NjMzCit2dCAwLjExOTI2NSAwLjc4NzkzOAordnQgMC4xNzA2NTIgMC43NzkyMzYKK3Z0IDAuMTY4MDMyIDAuNzgxNTExCit2dCAwLjE2NzgwNSAwLjc4MTMyOAordnQgMC4xNzA1NTEgMC43NzkwMDUKK3Z0IDAuMTE5MDExIDAuNzg3NzgyCit2dCAwLjEyMTI4MiAwLjc4NTMzMwordnQgMC44OTIwMjIgMC44NTc2NjAKK3Z0IDAuODkyNDEwIDAuODU3ODE1Cit2dCAwLjYxOTQwOCAwLjgzMTA4MwordnQgMC42MTk0MTMgMC44MzQyMTIKK3Z0IDAuNjE5NDI5IDAuODM2Nzc5Cit2dCAwLjYxOTA0MyAwLjgzNjU1NgordnQgMC42MTkwMjcgMC44MzQwNzgKK3Z0IDAuNDQzMjc0IDAuOTMzMDUwCit2dCAwLjQ0MzY1OSAwLjkzMzE5OQordnQgMC40NDM2NTkgMC45MzU5MjEKK3Z0IDAuNDQzMjczIDAuOTM0NzQyCit2dCAwLjkyMTgwNyAwLjE0OTc5MAordnQgMC45MjIxNDcgMC4xNTAyODYKK3Z0IDAuOTIyMTk3IDAuMTUwOTA5Cit2dCAwLjk1NTIyNiAwLjQzNDYxOQordnQgMC45NTU0MzYgMC40MzQ2MTkKK3Z0IDAuOTU1NDM5IDAuNDM1NzM5Cit2dCAwLjY4MzI5NCAwLjgzMzUyNwordnQgMC42ODMyOTYgMC44MzI1ODAKK3Z0IDAuNjgzNjgzIDAuODMzNjI4Cit2dCAwLjExODY0NyAwLjg5NzA1MAordnQgMC4xMTkzODMgMC44OTg2MTQKK3Z0IDAuMTE4ODc4IDAuODk3OTYwCit2dCAwLjExODQ3OCAwLjg5NzA3MwordnQgMC4yMjg0ODYgMC44NDQ3NzAKK3Z0IDAuMjI4MTAxIDAuODQ0NDYxCit2dCAwLjk0NjY3OCAwLjYxNDUyNAordnQgMC45NDY2NzcgMC42MTU3NDMKK3Z0IDAuOTQ2MDY4IDAuNjE1MTUzCit2dCAwLjI0MjM1MSAwLjkzNjcwMQordnQgMC4yNDIzNTEgMC45MzkzNzMKK3Z0IDAuMjQxOTYyIDAuOTM5MTU2Cit2dCAwLjE2NzU2MCAwLjc4MTE0NgordnQgMC4xMTkwNjQgMC44OTM1NTMKK3Z0IDAuMTE5MzgzIDAuODkzMzA2Cit2dCAwLjExODkzOCAwLjg5NzAxNwordnQgMC4xMTg3OTggMC44OTM3NTkKK3Z0IDAuNjgzNjY5IDAuODM1OTYxCit2dCAwLjY4MzI3OSAwLjgzNTk2MgordnQgMC45NDc3MTEgMC44OTMyODEKK3Z0IDAuOTQ4MDk2IDAuODkzNTk5Cit2dCAwLjk0ODA5NiAwLjg5NTYzMwordnQgMC45NDc3MTEgMC44OTU2MzUKK3Z0IDAuMTQ3ODY4IDAuOTQxNjAzCit2dCAwLjE0NzU5OSAwLjk0MTMxOAordnQgMC4xNDc2NDQgMC45MzkwNTMKK3Z0IDAuMTQ3ODY4IDAuOTM4ODQyCit2dCAwLjg1OTMwMyAwLjk2NjEyNAordnQgMC44NTg5MzYgMC45NjYwMTYKK3Z0IDAuODU5MzAzIDAuOTY0NzUyCit2dCAwLjY2NTgzNiAwLjk1OTc5OAordnQgMC42NjYyMjUgMC45NTk3OTUKK3Z0IDAuNjY2MjI1IDAuOTYxNDE5Cit2dCAwLjk0Njk2OSAwLjYxNjAyOQordnQgMC45NDY5NjkgMC42MTQyMjQKK3Z0IDAuMjk3OTQxIDAuOTI3NzcwCit2dCAwLjI5NzU1NyAwLjkyNDg5NAordnQgMC4yOTc5NDEgMC45MjQ2ODUKK3Z0IDAuMTI0NTM2IDAuNzg1MTA4Cit2dCAwLjczODQ3OCAwLjUzNjIyMAordnQgMC4yOTc1NTggMC45Mjc5NDAKK3Z0IDAuNjgyODg4IDAuOTM1MjcwCit2dCAwLjY4Mjg4NyAwLjkzMzcxNwordnQgMC42ODMyNzcgMC45MzIzNDEKK3Z0IDAuNjgzMjc3IDAuOTM1MTQyCit2dCAwLjE3MTQzMCAwLjc3ODg3NwordnQgMC4xNzIyNjAgMC43Nzg5NjQKK3Z0IDAuNjQzNTkyIDAuODM1ODY4Cit2dCAwLjY0MzU0MyAwLjgzNTg2OAordnQgMC42NDM1NzcgMC44MzM1MDEKK3Z0IDAuNjQzNTcxIDAuODMwMjI2Cit2dCAwLjg0MzU1NCAwLjIwNDgwOQordnQgMC42ODMzNjIgMC44MjM4MDQKK3Z0IDAuNjgzMjk2IDAuODIzODA0Cit2dCAwLjY4MzM2MiAwLjgyNjMyOQordnQgMC44NDM1NTUgMC4yMDcwMzIKK3Z0IDAuNjgzMzYyIDAuODI5NDU1Cit2dCAwLjY4MzI5NiAwLjgyOTQ1NQordnQgMC42ODM2ODMgMC44MjgzMzUKK3Z0IDAuNjgzMjk2IDAuODI3MTU2Cit2dCAwLjY4MzM2MiAwLjgyNzE1NgordnQgMC42ODMyOTYgMC44MjQ5NjcKK3Z0IDAuNjgzMzYyIDAuODI0OTY3Cit2dCAwLjY4MzI5NiAwLjgyNDU3NQordnQgMC42ODMzNjIgMC44MjQ1NzUKK3Z0IDAuNjgzNjgzIDAuODI0MjEzCit2dCAwLjg0MzU1NCAwLjIwNDQ3MgordnQgMC44NDMxODQgMC4yMDQxNDEKK3Z0IDAuODQzNTU0IDAuMjAzODU5Cit2dCAwLjg0MzU1NCAwLjIwMjg0MwordnQgMC44NDM1NTMgMC4yMDE5NjgKK3Z0IDAuNjQzNTc3IDAuODI2OTczCit2dCAwLjY0MzU0MyAwLjgyNDY2MgordnQgMC42NDM1OTIgMC44MjQ2NjIKK3Z0IDAuMjI4MDk1IDAuODM3MjU0Cit2dCAwLjIyODE2MSAwLjgzNzI1NAordnQgMC42ODMyOTYgMC44MzUxMDUKK3Z0IDAuNjgzMzYyIDAuODM1MTA1Cit2dCAwLjY4MzM2MiAwLjgzMjU4MAordnQgMC4yMjgwOTMgMC44Mzk0NzkKK3Z0IDAuMjI4MTU5IDAuODM5NDc5Cit2dCAwLjY4MzczMSAwLjgzMDU3NQordnQgMC42ODMzNjIgMC44MzE3NTQKK3Z0IDAuNjgzMjk2IDAuODMxNzU0Cit2dCAwLjY4MzM2MiAwLjgzMzk0MwordnQgMC42ODMyOTYgMC44MzM5NDMKK3Z0IDAuNjgzMzYyIDAuODM0MzM1Cit2dCAwLjY4MzI5NiAwLjgzNDMzNQordnQgMC42ODM3MzIgMC44MzQ2OTcKK3Z0IDAuMjI4MDk2IDAuODM2OTE4Cit2dCAwLjIyODE2MiAwLjgzNjkxOAordnQgMC4yMjg0ODMgMC44MzY1ODcKK3Z0IDAuMjI4MDk3IDAuODM2MzA0Cit2dCAwLjIyODE2MyAwLjgzNjMwNAordnQgMC4yMjgwOTcgMC44MzU5OTcKK3Z0IDAuMjI4MTYzIDAuODM1OTk3Cit2dCAwLjIyODQ4NCAwLjgzNTcwOQordnQgMC4yMjgwOTggMC44MzUyODcKK3Z0IDAuMjI4MTY0IDAuODM1Mjg3Cit2dCAwLjIyODA5OSAwLjgzNDQxMgordnQgMC4yMjgxNjUgMC44MzQ0MTIKK3Z0IDAuMjI4MTYwIDAuODM4NjQ1Cit2dCAwLjg0MjgxOCAwLjIwOTI1MAordnQgMC44NDI4MTggMC4yMDg0MDkKK3Z0IDAuODQyODI3IDAuMjEyMjk5Cit2dCAwLjY0Mzk1OSAwLjgzNTg2OAordnQgMC42NDM5NDQgMC44MzM1MDEKK3Z0IDAuNjQzOTM4IDAuODMwMjI2Cit2dCAwLjg0MjgxNyAwLjIwNTIxNQordnQgMC44NDI4MTcgMC4yMDQ4MDkKK3Z0IDAuNjg0MDk5IDAuODIyOTU2Cit2dCAwLjY4NDA5OSAwLjgyMzgwNAordnQgMC42ODMzNjIgMC44MjI5NTYKK3Z0IDAuNjg0MDk5IDAuODI1MjgyCit2dCAwLjY4NDA5OSAwLjgyNjMyOQordnQgMC44NDI4MTggMC4yMDcwMzIKK3Z0IDAuNjg0MDk5IDAuODI4MzM1Cit2dCAwLjY4NDA5OSAwLjgyOTQ1NQordnQgMC42ODQwOTkgMC44MjcxNTYKK3Z0IDAuNjg0MDk5IDAuODI0OTY3Cit2dCAwLjY4NDA5OSAwLjgyNDU3NQordnQgMC42ODQwOTkgMC44MjQyMTMKK3Z0IDAuODQyODE3IDAuMjA0NDcyCit2dCAwLjg0MjgxNyAwLjIwNDE0MQordnQgMC44NDI4MTcgMC4yMDM4NTkKK3Z0IDAuODQyODE3IDAuMjAzNTUyCit2dCAwLjg0MjgxNyAwLjIwMzI2NAordnQgMC44NDI4MTcgMC4yMDI4NDMKK3Z0IDAuODQyODE2IDAuMjAxOTY4Cit2dCAwLjg0MjgxNyAwLjIwNjE5OQordnQgMC4yMjg4OTQgMC44NDA4NTgKK3Z0IDAuMjI4ODkzIDAuODQxNjk5Cit2dCAwLjIyODkwMiAwLjg0NDc3MAordnQgMC42NDM5NDQgMC44MjY5NzMKK3Z0IDAuNjQzOTU5IDAuODI0NjYyCit2dCAwLjIyODg5OCAwLjgzNzI1NQordnQgMC4yMjg4OTggMC44Mzc2NjEKK3Z0IDAuNjg0MDk5IDAuODM1MTA1Cit2dCAwLjY4NDA5OSAwLjgzNTk1MwordnQgMC42ODMzNjIgMC44MzU5NTMKK3Z0IDAuNjg0MDk5IDAuODMyNTgwCit2dCAwLjY4NDA5OSAwLjgzMzYyOAordnQgMC4yMjg4OTYgMC44Mzk0ODAKK3Z0IDAuNjg0MDk5IDAuODMwNTc1Cit2dCAwLjY4NDA5OSAwLjgzMTc1NAordnQgMC42ODQwOTkgMC44MzM5NDMKK3Z0IDAuNjg0MDk5IDAuODM0MzM1Cit2dCAwLjY4NDA5OSAwLjgzNDY5NwordnQgMC4yMjg4OTkgMC44MzY5MTkKK3Z0IDAuMjI4ODk5IDAuODM2NTg4Cit2dCAwLjIyODg5OSAwLjgzNjMwNQordnQgMC4yMjg5MDAgMC44MzU5OTgKK3Z0IDAuMjI4OTAwIDAuODM1NzA5Cit2dCAwLjIyODkwMSAwLjgzNTI4OAordnQgMC4yMjg5MDIgMC44MzQ0MTMKK3Z0IDAuMjI4ODk3IDAuODM4NjQ2Cit2dCAwLjMzMTA5MiAwLjc4NjM5MwordnQgMC4zMzEyMzkgMC43ODYxMTQKK3Z0IDAuMTY2ODQ2IDAuNzg0OTI3Cit2dCAwLjE2NjY4NCAwLjc4NTUwMQordnQgMC4xNjY3NDUgMC43ODQ5MTYKK3Z0IDAuMTY2ODEwIDAuNzg0Mjk2Cit2dCAwLjE2Njk4MSAwLjc4NDUzNwordnQgMC4zNDM0MDggMC45MjI0MDEKK3Z0IDAuMzQzMDIzIDAuOTIyMjQ4Cit2dCAwLjQyNTg1OCAwLjk1MjkxNQordnQgMC4yNzgyOTkgMC45MjI0MzYKK3Z0IDAuMzMwOTY0IDAuNzg1MTg5Cit2dCAwLjMzMTEyNSAwLjc4NTc4NgordnQgMC4zMzEwMjkgMC43ODU3OTYKK3Z0IDAuOTIxODA4IDAuMTQ3MDczCit2dCAwLjkyMjE5NyAwLjE0NzIyOAordnQgMC45NTU0MzkgMC40MzM0OTkKK3Z0IDAuNDQzNjYzIDAuOTE4NTkxCit2dCAwLjcyNDA4OCAwLjc4MDMzOAordnQgMC43MjM1NTMgMC43NzgyNjQKK3Z0IDAuNzI0NTc5IDAuNzc4OTA0Cit2dCAwLjcyNTIxMSAwLjc4MDA0OAordnQgMC43MjQwNTMgMC43NzYzMDgKK3Z0IDAuNzI1OTUyIDAuNzc3NDkyCit2dCAwLjcyNTU5NCAwLjc3Nzg2MQordnQgMC43MjM5MjMgMC43NzY4MjAKK3Z0IDAuNzI3MDk2IDAuNzc5NTYyCit2dCAwLjcyNjYwMyAwLjc3OTY4OQordnQgMC43MjcwOTYgMC43ODE5MjUKK3Z0IDAuNzI2NjAzIDAuNzgxNzc1Cit2dCAwLjcyNjAwNiAwLjc4Mzg4MAordnQgMC43MjU2NDUgMC43ODM0OTUKK3Z0IDAuNzI0MDUyIDAuNzg1MDI1Cit2dCAwLjcyMzkyMCAwLjc4NDUwNgordnQgMC43MjE3ODQgMC43ODQ5NjkKK3Z0IDAuNzIxOTE3IDAuNzg0NDU2Cit2dCAwLjcxOTg4NCAwLjc4Mzc4NQordnQgMC43MjAyNDYgMC43ODM0MTQKK3Z0IDAuNzE4NzQwIDAuNzgxNzE3Cit2dCAwLjcxOTIzNyAwLjc4MTU4OQordnQgMC43MTg3NDAgMC43NzkzNTEKK3Z0IDAuNzE5MjM3IDAuNzc5NTAwCit2dCAwLjcxOTgzMCAwLjc3NzM5NwordnQgMC43MjAxOTUgMC43Nzc3ODEKK3Z0IDAuNzIxNzg5IDAuNzc2MjUyCit2dCAwLjcyMTkyNSAwLjc3Njc3MAordnQgMC43MjUyMTEgMC43ODEzNTMKK3Z0IDAuNzI0NjIyIDAuNzgyNDEwCit2dCAwLjcyMzU0NCAwLjc4MzA0MgordnQgMC43MjIyOTAgMC43ODMwMTEKK3Z0IDAuNzIxMjY0IDAuNzgyMzcxCit2dCAwLjcyMDYzMiAwLjc4MTIyOQordnQgMC43MjA2MzIgMC43Nzk5MjIKK3Z0IDAuNzIxMjIxIDAuNzc4ODY2Cit2dCAwLjcyMjMwNCAwLjc3ODIzMwordnQgMC43MjI5MjQgMC43ODA2MzgKK3Z0IDAuNzIxNzU2IDAuNzgwOTM5Cit2dCAwLjcyNDE0NyAwLjc3NTk0MwordnQgMC43MjYyMDkgMC43NzcyMjgKK3Z0IDAuNzI3NDQ4IDAuNzc5NDcyCit2dCAwLjcyNzQ0OCAwLjc4MjAzMgordnQgMC43MjYyNjUgMC43ODQxNTQKK3Z0IDAuNzI0MTQ4IDAuNzg1Mzk0Cit2dCAwLjcyMTY5MCAwLjc4NTMzNAordnQgMC43MTk2MjggMC43ODQwNDgKK3Z0IDAuNzE4Mzg5IDAuNzgxODA4Cit2dCAwLjcxODM4OSAwLjc3OTI0NAordnQgMC43MTk1NzIgMC43NzcxMjMKK3Z0IDAuNzIxNjk0IDAuNzc1ODgyCit2dCAwLjE5NDQ1NyAwLjc4MzUwMQordnQgMC4xOTU1ODAgMC43ODM3OTEKK3Z0IDAuMTk0OTQ4IDAuNzg0OTM1Cit2dCAwLjE5MzkyMiAwLjc4NTU3NQordnQgMC4xOTQ0MjkgMC43ODc1MzMKK3Z0IDAuMTk0Mjk1IDAuNzg3MDIwCit2dCAwLjE5NTk2NiAwLjc4NTk3OQordnQgMC4xOTYzMjggMC43ODYzNDkKK3Z0IDAuMTk2OTc2IDAuNzg0MTUwCit2dCAwLjE5NzQ3MiAwLjc4NDI3OAordnQgMC4xOTY5NzYgMC43ODIwNjUKK3Z0IDAuMTk3NDcyIDAuNzgxOTE1Cit2dCAwLjE5NjAxNyAwLjc4MDM0NQordnQgMC4xOTYzODIgMC43Nzk5NjAKK3Z0IDAuMTk0MjkyIDAuNzc5MzM0Cit2dCAwLjE5NDQyOCAwLjc3ODgxNgordnQgMC4xOTIyOTAgMC43NzkzODQKK3Z0IDAuMTkyMTYwIDAuNzc4ODcyCit2dCAwLjE5MDYxOSAwLjc4MDQyNQordnQgMC4xOTAyNjAgMC43ODAwNTYKK3Z0IDAuMTg5NjA5IDAuNzgyMjUxCit2dCAwLjE4OTExNiAwLjc4MjEyNAordnQgMC4xODk2MDkgMC43ODQzNDAKK3Z0IDAuMTg5MTE2IDAuNzg0NDkwCit2dCAwLjE5MDU2NyAwLjc4NjA1OQordnQgMC4xOTAyMDYgMC43ODY0NDQKK3Z0IDAuMTkyMjk3IDAuNzg3MDcwCit2dCAwLjE5MjE2NSAwLjc4NzU4OQordnQgMC4xOTU1ODAgMC43ODI0ODYKK3Z0IDAuMTk0OTkxIDAuNzgxNDI5Cit2dCAwLjE5MzkxMyAwLjc4MDc5NwordnQgMC4xOTI2NTkgMC43ODA4MjgKK3Z0IDAuMTkxNjMyIDAuNzgxNDY4Cit2dCAwLjE5MTAwMSAwLjc4MjYxMAordnQgMC4xOTEwMDEgMC43ODM5MTcKK3Z0IDAuMTkxNTkwIDAuNzg0OTczCit2dCAwLjE5MjY3MiAwLjc4NTYwNgordnQgMC4xOTMyOTMgMC43ODMyMDEKK3Z0IDAuMTkyMTI1IDAuNzgyOTAwCit2dCAwLjE5NjU4NCAwLjc4NjYxMgordnQgMC4xOTQ1MjIgMC43ODc4OTgKK3Z0IDAuMTk3ODI0IDAuNzg0MzY5Cit2dCAwLjE5NzgyNCAwLjc4MTgwOQordnQgMC4xOTY2NDAgMC43Nzk2ODYKK3Z0IDAuMTk0NTIzIDAuNzc4NDQ2Cit2dCAwLjE5MjA2NSAwLjc3ODUwNwordnQgMC4xOTAwMDMgMC43Nzk3OTIKK3Z0IDAuMTg4NzY0IDAuNzgyMDMzCit2dCAwLjE4ODc2NCAwLjc4NDU5NgordnQgMC4xODk5NDcgMC43ODY3MTgKK3Z0IDAuMTkyMDY5IDAuNzg3OTU5Cit2dCAwLjUyODY1NCAwLjYzMTc4OQordnQgMC41OTU2MDYgMC42MzE3ODkKK3Z0IDAuNTk1NjA2IDAuNzIyMzE1Cit2dCAwLjUyODY1NCAwLjcyMjMxNQordnQgMC41Mjg2NTQgMC40NDk1NDIKK3Z0IDAuNTk1NjA2IDAuNDQ5NTQxCit2dCAwLjU5NTYwNiAwLjU0MTI2MwordnQgMC41Mjg2NTQgMC41NDEyNjMKK3Z0IDAuNTk1NjA2IDAuODE0MDM2Cit2dCAwLjUyODY1NCAwLjgxNDAzNgordnQgMC40NjA1MDYgMC42MzE3ODkKK3Z0IDAuNDYwNTA2IDAuNzIyMzE1Cit2dCAwLjY2Mzc1MyAwLjcyMjMxNQordnQgMC42NjM3NTMgMC42MzE3ODkKK3Z0IDAuNDYwNTA2IDAuNDQ5NTQyCit2dCAwLjQ2MDUwNiAwLjU0MTI2MwordnQgMC42NjM3NTMgMC41NDEyNjMKK3Z0IDAuNjYzNzUzIDAuNDQ5NTQxCit2dCAwLjY2Mzc1MyAwLjgxNDAzNgordnQgMC40NjA1MDYgMC44MTQwMzcKK3Z0IDAuODMzNDA4IDAuMzM2MTUyCit2dCAwLjgzMjQ1NiAwLjMzNjE1MgordnQgMC44MzI0NjMgMC4zMzM5MDUKK3Z0IDAuODMzNDE0IDAuMzMzOTA1Cit2dCAwLjgzMzQwOCAwLjMzOTMwMQordnQgMC44MzI0NTYgMC4zMzkzMDEKK3Z0IDAuODMzNDA4IDAuMzQyODM5Cit2dCAwLjgzMjQ1NiAwLjM0MjgzOQordnQgMC44MzM0MTQgMC4zNDUwODAKK3Z0IDAuODMyNDYzIDAuMzQ1MDgwCit2dCAwLjA1MDQ3MyAwLjkwMTIyNQordnQgMC4wNDk1MjIgMC45MDEyMjUKK3Z0IDAuMDQ5NTMwIDAuODk4OTMzCit2dCAwLjA1MDQ4MSAwLjg5ODkzMwordnQgMC4wNTA0ODEgMC45MDM0NDkKK3Z0IDAuMDQ5NTMwIDAuOTAzNDQ5Cit2dCAwLjU4MzQxOSAwLjgzMzU4MAordnQgMC41ODQzNzEgMC44MzM1ODAKK3Z0IDAuNTg0Mzc3IDAuODM1ODM2Cit2dCAwLjU4MzQyNiAwLjgzNTgzNgordnQgMC41ODM0MTkgMC44MzAwNDIKK3Z0IDAuNTg0MzcxIDAuODMwMDQyCit2dCAwLjU4MzQxOSAwLjgyNjg5MwordnQgMC41ODQzNzEgMC44MjY4OTMKK3Z0IDAuNTgzNDI2IDAuODI0NjYyCit2dCAwLjU4NDM3NyAwLjgyNDY2MgordnQgMC4wNjMxNDcgMC45MDA2OTkKK3Z0IDAuMDY0MDk4IDAuOTAwNzAwCit2dCAwLjA2NDExMSAwLjkwMjk0NgordnQgMC4wNjMxNTkgMC45MDI5NDYKK3Z0IDAuMDYzMTU5IDAuODk4NDI3Cit2dCAwLjA2NDExMSAwLjg5ODQyNwordnQgMC4zNTk4OTEgMC43NzQ4OTEKK3Z0IDAuMzU4MzkyIDAuNzc1NTI0Cit2dCAwLjM1NzgxMCAwLjc3NDkxMwordnQgMC4zNTk4OTEgMC43NzQwNTgKK3Z0IDAuMzYzMDk2IDAuNzc2OTc1Cit2dCAwLjM2Mjg1OSAwLjc3NzAyMwordnQgMC4zNjE5NzAgMC43NzQ5MTMKK3Z0IDAuMzYyMTUwIDAuNzc0NzMyCit2dCAwLjM1OTg5MSAwLjc3MzgwMQordnQgMC4zNTc2MzAgMC43NzQ3MzIKK3Z0IDAuMzU2OTIwIDAuNzc3MDIzCit2dCAwLjM1NjY4MyAwLjc3Njk3NQordnQgMC4zNTY5MjAgMC43ODAxMjQKK3Z0IDAuMzU2NjgzIDAuNzgwMTI0Cit2dCAwLjM1NjkyMCAwLjc4MzYxNQordnQgMC4zNTY2ODMgMC43ODM2NjMKK3Z0IDAuMzU3ODEwIDAuNzg1NzI0Cit2dCAwLjM1NzYzMCAwLjc4NTkwNgordnQgMC4zNTk4OTEgMC43ODY1ODEKK3Z0IDAuMzU5ODkxIDAuNzg2ODM3Cit2dCAwLjM2MTk3MCAwLjc4NTcyNAordnQgMC4zNjIxNTAgMC43ODU5MDYKK3Z0IDAuMzYyODU5IDAuNzgzNjE1Cit2dCAwLjM2MzA5NiAwLjc4MzY2MwordnQgMC4zNjI4NTkgMC43ODAxMjQKK3Z0IDAuMzYzMDk2IDAuNzgwMTI0Cit2dCAwLjM1Nzc1OSAwLjc4MzYxNQordnQgMC4zNTgzOTIgMC43ODUxMTQKK3Z0IDAuMzU3NzU5IDAuNzc3MDIzCit2dCAwLjM1ODM5MiAwLjc3ODUyMgordnQgMC4zNTk4OTEgMC43ODU3NDYKK3Z0IDAuMzYxMzkwIDAuNzg1MTE0Cit2dCAwLjM2MTM5MCAwLjc3ODUyMgordnQgMC4zNjEzOTAgMC43ODIxMTYKK3Z0IDAuMzU5ODkxIDAuNzgxNDgzCit2dCAwLjM1OTg5MSAwLjc3OTE1NQordnQgMC4zNjEzOTAgMC43NzU1MjQKK3Z0IDAuMzYyMDIzIDAuNzgzNjE1Cit2dCAwLjM1ODM5MiAwLjc4MjExNgordnQgMC4zNjIwMjMgMC43NzcwMjMKK3Z0IDAuMzU3ODYyIDAuNzgzNjE1Cit2dCAwLjM1ODQ2NCAwLjc4NTA0MQordnQgMC4zNTk4OTEgMC43ODU2NDQKK3Z0IDAuMzYxMzE4IDAuNzg1MDQxCit2dCAwLjM2MTkyMCAwLjc4MzYxNQordnQgMC4zNjEzMTggMC43ODIxODgKK3Z0IDAuMzU5ODkxIDAuNzgxNTg2Cit2dCAwLjM1ODQ2NCAwLjc4MjE4OAordnQgMC4zNjE5MjAgMC43NzcwMjMKK3Z0IDAuMzYxMzE4IDAuNzc1NTk2Cit2dCAwLjM1OTg5MSAwLjc3NDk5NAordnQgMC4zNTg0NjQgMC43NzU1OTYKK3Z0IDAuMzU3ODYyIDAuNzc3MDIzCit2dCAwLjM1ODQ2NCAwLjc3ODQ1MAordnQgMC4zNTk4OTEgMC43NzkwNTIKK3Z0IDAuMzYxMzE4IDAuNzc4NDUwCit2dCAwLjUxNzQwMiAwLjkyNDkxNQordnQgMC41MTgxMzkgMC45MjQ5MjIKK3Z0IDAuNTE4MTQyIDAuOTI1OTU5Cit2dCAwLjUxNzQwNiAwLjkyNjM0OQordnQgMC4yMTQ2NDQgMC45MjY5NDMKK3Z0IDAuMjEzOTE0IDAuOTI2NTMzCit2dCAwLjIxMzkxMCAwLjkyNTUxOQordnQgMC4yMTQ2MzkgMC45MjU1NDAKK3Z0IDAuMjEzOTE0IDAuOTI0NDcyCit2dCAwLjIxNDY0NCAwLjkyNDA5MgordnQgMC44OTMwMTggMC45MjY5MzMKK3Z0IDAuODkyMjg3IDAuOTI2NTM3Cit2dCAwLjg5MjI4NCAwLjkyNTUwNwordnQgMC44OTMwMTQgMC45MjU1MDkKK3Z0IDAuODkyMjg3IDAuOTI0NDc0Cit2dCAwLjg5MzAxOCAwLjkyNDA4MAordnQgMC4yNTkyMzYgMC45MjI5MjUKK3Z0IDAuMjU5OTc1IDAuOTIzMzE0Cit2dCAwLjI1OTk2OSAwLjkyNDM1MgordnQgMC4yNTkyMjggMC45MjQzNjAKK3Z0IDAuMjU5OTc1IDAuOTI1Mzc2Cit2dCAwLjI1OTIzNiAwLjkyNTc3NwordnQgMC41MTc0MDYgMC45MjM0OTYKK3Z0IDAuNTE4MTQyIDAuOTIzODk2Cit2dCAwLjkwNDU0NiAwLjkyNTQyNgordnQgMC45MDM4MTYgMC45MjU0MjUKK3Z0IDAuOTAzODE5IDAuOTI0MzkyCit2dCAwLjkwNDU1MCAwLjkyMzk5OAordnQgMC43NjM3MTIgMC45MjMwMjEKK3Z0IDAuNzY0NDUxIDAuOTIzNDEwCit2dCAwLjc2NDQ0NSAwLjkyNDQ0OAordnQgMC43NjM3MDQgMC45MjQ0NTcKK3Z0IDAuNzY0NDUxIDAuOTI1NDczCit2dCAwLjc2MzcxMiAwLjkyNTg3NAordnQgMC45MjU5NjEgMC45MDkwMjgKK3Z0IDAuOTI2Njk3IDAuOTA5NDI4Cit2dCAwLjkyNjY5NCAwLjkxMDQ1NAordnQgMC45MjU5NTcgMC45MTA0NDcKK3Z0IDAuOTI2Njk3IDAuOTExNDkxCit2dCAwLjkyNTk2MSAwLjkxMTg4MQordnQgMC4xMTkyMTIgMC45MjY5ODQKK3Z0IDAuMTE4NDgyIDAuOTI2NTc0Cit2dCAwLjExODQ3OCAwLjkyNTU2MAordnQgMC4xMTkyMDcgMC45MjU1ODIKK3Z0IDAuMTE4NDgyIDAuOTI0NTEzCit2dCAwLjExOTIxMiAwLjkyNDEzMwordnQgMC45MDQ1NTAgMC45MjY4NTEKK3Z0IDAuOTAzODE5IDAuOTI2NDU1Cit2dCAwLjc5MDMwMCAwLjc4OTA5MAordnQgMC43ODgzMTYgMC43ODk5MTIKK3Z0IDAuNzg2ODk5IDAuNzg4NDk3Cit2dCAwLjc4NzcyMCAwLjc4NjUxMwordnQgMC43OTAzMDAgMC43OTI3MzYKK3Z0IDAuNzg4MzE2IDAuNzkxOTE1Cit2dCAwLjc4NzcyMyAwLjc5NTMxNQordnQgMC43ODY5MDEgMC43OTMzMzEKK3Z0IDAuNzg0MDc3IDAuNzk1MzE1Cit2dCAwLjc4NDg5OCAwLjc5MzMzMQordnQgMC43ODE0OTcgMC43OTI3MzkKK3Z0IDAuNzgzNDgxIDAuNzkxOTE2Cit2dCAwLjc4MTQ5NyAwLjc4OTA5MwordnQgMC43ODM0ODEgMC43ODk5MTQKK3Z0IDAuNzg0MDcyIDAuNzg2NTEzCit2dCAwLjc4NDg5NSAwLjc4ODQ5NwordnQgMC41MzQwMjggMC45MTA4NzUKK3Z0IDAuNTM0MDIzIDAuOTEyNzI3Cit2dCAwLjUzMzIzOSAwLjkxMjcyNwordnQgMC41MzMyNDQgMC45MTA4NzUKK3Z0IDAuNTM0MDI4IDAuOTE0NTc0Cit2dCAwLjUzMzI0NCAwLjkxNDU3NAordnQgMC43MTkxNzkgMC45MTA4OTIKK3Z0IDAuNzE5MTcyIDAuOTEyNzY5Cit2dCAwLjcxODM4OSAwLjkxMjc2OQordnQgMC43MTgzOTUgMC45MTA4OTIKK3Z0IDAuNzE5MTc5IDAuOTE0NTg5Cit2dCAwLjcxODM5NSAwLjkxNDU4OAordnQgMC44MDM0OTMgMC45MTQ1MDkKK3Z0IDAuODAzNDg4IDAuOTEyNjUwCit2dCAwLjgwNDI3MSAwLjkxMjY1MAordnQgMC44MDQyNzcgMC45MTQ1MDkKK3Z0IDAuODAzNDkzIDAuOTEwODEwCit2dCAwLjgwNDI3NyAwLjkxMDgxMAordnQgMC44MzYxNDggMC45MTQ0NzEKK3Z0IDAuODM2MTM4IDAuOTEyNjM0Cit2dCAwLjgzNjkyMSAwLjkxMjYzNAordnQgMC44MzY5MzEgMC45MTQ0NzEKK3Z0IDAuODM2MTQ4IDAuOTEwNzcyCit2dCAwLjgzNjkzMSAwLjkxMDc3MgordnQgMC44MzMyNzQgMC4wNzA3ODQKK3Z0IDAuODM0NzQ2IDAuMDcyMjUzCit2dCAwLjgzMzc3MiAwLjA3MjY1NwordnQgMC44MzI4NzEgMC4wNzE3NTgKK3Z0IDAuODM0NzQ2IDAuMDc0MzMzCit2dCAwLjgzMzc3MiAwLjA3MzkzMAordnQgMC44MzMyNzYgMC4wNzU4MDUKK3Z0IDAuODMyODcyIDAuMDc0ODMxCit2dCAwLjgzMTE5NiAwLjA3NTgwNQordnQgMC44MzE1OTkgMC4wNzQ4MzEKK3Z0IDAuODI5NzI0IDAuMDc0MzM1Cit2dCAwLjgzMDY5OSAwLjA3MzkzMQordnQgMC44Mjk3MjQgMC4wNzIyNTUKK3Z0IDAuODMwNjk5IDAuMDcyNjU5Cit2dCAwLjgzMTE5NCAwLjA3MDc4NAordnQgMC44MzE1OTggMC4wNzE3NTgKK3Z0IDAuOTU3MDk1IDAuMzcyNDQwCit2dCAwLjk1NzA5MyAwLjM3MzQyNgordnQgMC45NTY3NTcgMC4zNzM0MjYKK3Z0IDAuOTU2NzYwIDAuMzcyNDQwCit2dCAwLjk1NzA5NSAwLjM3NDQwOAordnQgMC45NTY3NjAgMC4zNzQ0MDgKK3Z0IDAuOTU3MjkxIDAuNzE3NjE0Cit2dCAwLjk1NzI4OCAwLjcxODYxMgordnQgMC45NTY5NTMgMC43MTg2MTIKK3Z0IDAuOTU2OTU2IDAuNzE3NjE0Cit2dCAwLjk1NzI5MSAwLjcxOTU4MAordnQgMC45NTY5NTYgMC43MTk1ODAKK3Z0IDAuOTU2NzUzIDAuNjc5MDY3Cit2dCAwLjk1Njc1MCAwLjY3ODA3OQordnQgMC45NTcwODYgMC42NzgwNzgKK3Z0IDAuOTU3MDg5IDAuNjc5MDY3Cit2dCAwLjk1Njc1MyAwLjY3NzEwMAordnQgMC45NTcwODkgMC42NzcxMDAKK3Z0IDAuOTU2Njg5IDAuMTg1MjkzCit2dCAwLjk1NjY4NCAwLjE4NDMxNgordnQgMC45NTcwMTkgMC4xODQzMTYKK3Z0IDAuOTU3MDI1IDAuMTg1MjkzCit2dCAwLjk1NjY4OSAwLjE4MzMyNgordnQgMC45NTcwMjUgMC4xODMzMjYKK3Z0IDAuODMyNzgxIDAuMDcxOTc1Cit2dCAwLjgzMzczOCAwLjA3MjY3MgordnQgMC44MzM1NTQgMC4wNzI3NDgKK3Z0IDAuODMzNzM4IDAuMDczOTE2Cit2dCAwLjgzMzU1NCAwLjA3Mzg0MQordnQgMC44MzI3ODIgMC4wNzQ2MTQKK3Z0IDAuODMxNjg4IDAuMDc0NjE0Cit2dCAwLjgzMDkxNSAwLjA3Mzg0MgordnQgMC44MzA5MTUgMC4wNzI3NDkKK3Z0IDAuODMxNjg3IDAuMDcxOTc1Cit2dCAwLjgzMzUyMCAwLjA3Mjc2MgordnQgMC44MzM1MjAgMC4wNzM4MjcKK3Z0IDAuODMwOTQ5IDAuMDcyNzYzCit2dCAwLjUzMzIzOSAwLjg2NDc1MgordnQgMC41MzMyNDggMC44NjEzODAKK3Z0IDAuNTM0ODk2IDAuODYxMzgwCit2dCAwLjUzNDg4NyAwLjg2NDc1MgordnQgMC41MzMyNDggMC44NjgxMTYKK3Z0IDAuNTM0ODk2IDAuODY4MTE2Cit2dCAwLjUwMzU4NiAwLjg2NTkzMwordnQgMC41MDM1OTggMC44NjI1MTQKK3Z0IDAuNTA1MjQ2IDAuODYyNTE1Cit2dCAwLjUwNTIzNCAwLjg2NTkzMwordnQgMC41MDM1OTggMC44NjkyNDUKK3Z0IDAuNTA1MjQ2IDAuODY5MjQ2Cit2dCAwLjc2NTM1MiAwLjg2NDY3NwordnQgMC43NjUzNjIgMC44NjgwNjIKK3Z0IDAuNzYzNzE0IDAuODY4MDYyCit2dCAwLjc2MzcwNCAwLjg2NDY3NwordnQgMC43NjUzNjIgMC44NjEzMjcKK3Z0IDAuNzYzNzE0IDAuODYxMzI3Cit2dCAwLjg0MTcyMyAwLjE1MDUzMgordnQgMC44NDE3NDIgMC4xNTM4NzYKK3Z0IDAuODQwMDk0IDAuMTUzODc2Cit2dCAwLjg0MDA3NSAwLjE1MDUzMQordnQgMC44NDE3NDIgMC4xNDcxNDEKK3Z0IDAuODQwMDk0IDAuMTQ3MTQxCit2dCAwLjg2MDM0MiAwLjQ1NjMyMQordnQgMC44NTk1NzUgMC40NTcwODkKK3Z0IDAuODU5NDg0IDAuNDU2ODY4Cit2dCAwLjg2MDEyMSAwLjQ1NjIzMAordnQgMC44NTg0OTAgMC40NTcwODkKK3Z0IDAuODU4NTgyIDAuNDU2ODY4Cit2dCAwLjg1NzcyMiAwLjQ1NjMyMgordnQgMC44NTc5NDMgMC40NTYyMzEKK3Z0IDAuODU3NzIyIDAuNDU1MjM3Cit2dCAwLjg1Nzk0NCAwLjQ1NTMyOQordnQgMC44NTg0ODkgMC40NTQ0NjkKK3Z0IDAuODU4NTgxIDAuNDU0NjkxCit2dCAwLjg1OTU3NCAwLjQ1NDQ2OQordnQgMC44NTk0ODMgMC40NTQ2OTEKK3Z0IDAuODYwMzQyIDAuNDU1MjM2Cit2dCAwLjg2MDEyMSAwLjQ1NTMyOAordnQgMC44NTkzMzcgMC40NTY1MTQKK3Z0IDAuODU5NzY3IDAuNDU2MDg0Cit2dCAwLjg1ODcyOSAwLjQ1NjUxNAordnQgMC44NTgyOTggMC40NTYwODQKK3Z0IDAuODU4Mjk4IDAuNDU1NDc2Cit2dCAwLjg1ODcyOCAwLjQ1NTA0NgordnQgMC44NTkzMzYgMC40NTUwNDYKK3Z0IDAuODU5NzY3IDAuNDU1NDc1Cit2dCAwLjg1OTIyNSAwLjQ1NjI0MwordnQgMC44NTk0OTYgMC40NTU5NzIKK3Z0IDAuODU4ODQxIDAuNDU2MjQzCit2dCAwLjg1ODU2OSAwLjQ1NTk3MgordnQgMC44NTg1NjkgMC40NTU1ODgKK3Z0IDAuODU4ODQxIDAuNDU1MzE3Cit2dCAwLjg1OTIyNCAwLjQ1NTMxNwordnQgMC44NTk0OTYgMC40NTU1ODgKK3Z0IDAuODU5MDMzIDAuNDU1NzgwCit2dCAwLjc2NTczOCAwLjg5NDM2MgordnQgMC43NjU2MDIgMC44OTQ2ODQKK3Z0IDAuNzY0Njg0IDAuODk0Njg0Cit2dCAwLjc2NDU1MyAwLjg5NDM2MgordnQgMC43NjQwMjYgMC44OTUzMjUKK3Z0IDAuNzYzNzA0IDAuODk1MTg4Cit2dCAwLjc2NDAyNiAwLjg5NjI0MwordnQgMC43NjM3MDQgMC44OTYzNzMKK3Z0IDAuNzY0NjY2IDAuODk2OTAxCit2dCAwLjc2NDUzMSAwLjg5NzIyMgordnQgMC43NjU1ODUgMC44OTY5MDEKK3Z0IDAuNzY1NzE2IDAuODk3MjIyCit2dCAwLjc2NjI0MyAwLjg5NjI2MAordnQgMC43NjY1NjUgMC44OTYzOTYKK3Z0IDAuNzY2MjQzIDAuODk1MzQyCit2dCAwLjc2NjU2NSAwLjg5NTIxMQordnQgMC43NjU0NDMgMC44OTUwNjIKK3Z0IDAuNzY0ODM3IDAuODk1MDYyCit2dCAwLjc2NDQwNCAwLjg5NTQ4NQordnQgMC43NjQ0MDQgMC44OTYwOTAKK3Z0IDAuNzY0ODI2IDAuODk2NTI0Cit2dCAwLjc2NTQzMSAwLjg5NjUyNAordnQgMC43NjU4NjUgMC44OTYxMDEKK3Z0IDAuNzY1ODY1IDAuODk1NDk2Cit2dCAwLjc2NTEzNCAwLjg5NTc5MwordnQgMC44OTA2NzkgMC43NzMyNzcKK3Z0IDAuODkxMDAwIDAuNzczNDEyCit2dCAwLjg5MTAwMCAwLjc3NDMzMAordnQgMC44OTA2NzkgMC43NzQ0NjEKK3Z0IDAuODkxNjQxIDAuNzc0OTg4Cit2dCAwLjg5MTUwNiAwLjc3NTMxMAordnQgMC44OTI1NTkgMC43NzQ5ODgKK3Z0IDAuODkyNjkxIDAuNzc1MzEwCit2dCAwLjg5MzIxNyAwLjc3NDM0OAordnQgMC44OTM1NDAgMC43NzQ0ODQKK3Z0IDAuODkzMjE3IDAuNzczNDMwCit2dCAwLjg5MzU0MCAwLjc3MzI5OQordnQgMC44OTI1NzcgMC43NzI3NzIKK3Z0IDAuODkyNzEzIDAuNzcyNDUwCit2dCAwLjg5MTY1OCAwLjc3Mjc3MgordnQgMC44OTE1MjggMC43NzI0NTAKK3Z0IDAuODkxMzc4IDAuNzczNTcxCit2dCAwLjg5MTM3OCAwLjc3NDE3NwordnQgMC44OTE4MDAgMC43NzQ2MTAKK3Z0IDAuODkyNDA1IDAuNzc0NjEwCit2dCAwLjg5MjgzOSAwLjc3NDE4OAordnQgMC44OTI4MzkgMC43NzM1ODMKK3Z0IDAuODkyNDE3IDAuNzczMTQ5Cit2dCAwLjg5MTgxMiAwLjc3MzE0OQordnQgMC44OTIxMDkgMC43NzM4ODAKK3Z0IDAuMDI0NDY0IDAuNTAwNjkzCit2dCAwLjAzMzM1MyAwLjUwMDY5MwordnQgMC4wMzM2NDcgMC41MDIxNDgKK3Z0IDAuMDI0MTcyIDAuNTAyMTQ4Cit2dCAwLjAxNjU0NCAwLjQ5NzQwMQordnQgMC4wMTU3MjQgMC40OTg2MzcKK3Z0IDAuMDEwNDMzIDAuNDkxMzgzCit2dCAwLjAwOTIwNiAwLjQ5MjIxNwordnQgMC4wMDY5ODEgMC40ODMxOTQKK3Z0IDAuMDA1NTI1IDAuNDgzNDg5Cit2dCAwLjAwNjk4MCAwLjQ3NDMwOAordnQgMC4wMDU1MjUgMC40NzQwMTYKK3Z0IDAuMDEwMjczIDAuNDY2Mzg5Cit2dCAwLjAwOTAzNyAwLjQ2NTU2OQordnQgMC4wMTYyOTIgMC40NjAyODAKK3Z0IDAuMDE1NDU4IDAuNDU5MDUyCit2dCAwLjAyNDQ4MiAwLjQ1NjgyOAordnQgMC4wMjQxODggMC40NTUzNzIKK3Z0IDAuMDMzMzY5IDAuNDU2ODI4Cit2dCAwLjAzMzY2MSAwLjQ1NTM3MgordnQgMC4wNDEyODkgMC40NjAxMTkKK3Z0IDAuMDQyMTEwIDAuNDU4ODg0Cit2dCAwLjA0NzQwMCAwLjQ2NjEzNwordnQgMC4wNDg2MjggMC40NjUzMDMKK3Z0IDAuMDUwODUzIDAuNDc0MzI2Cit2dCAwLjA1MjMwOCAwLjQ3NDAzMgordnQgMC4wNTA4NTMgMC40ODMyMTIKK3Z0IDAuMDUyMzA4IDAuNDgzNTA0Cit2dCAwLjA0NzU2MSAwLjQ5MTEzMQordnQgMC4wNDg3OTcgMC40OTE5NTEKK3Z0IDAuMDQxNTQyIDAuNDk3MjQwCit2dCAwLjA0MjM3NiAwLjQ5ODQ2OAordnQgMC4wMjQ1NjMgMC41MDAyMDMKK3Z0IDAuMDMzMjU2IDAuNTAwMjAzCit2dCAwLjAzMzMyNSAwLjUwMDU1NAordnQgMC4wMjQ0OTIgMC41MDA1NTQKK3Z0IDAuMjkwMjkwIDAuNzUxMzU5Cit2dCAwLjI5MDMxNSAwLjc2MDc0MwordnQgMC4yODk5MTEgMC43NjA2OTUKK3Z0IDAuMjg5ODg2IDAuNzUxMzU3Cit2dCAwLjAxNjgyMSAwLjQ5Njk4NgordnQgMC4wMTY2MjIgMC40OTcyODMKK3Z0IDAuMjkwMzg0IDAuNzY4MzU0Cit2dCAwLjI4OTk4MCAwLjc2ODI2NwordnQgMC4wMTA4NDggMC40OTExMDMKK3Z0IDAuMDEwNTUxIDAuNDkxMzAzCit2dCAwLjA4MTU5MiAwLjczOTI0OQordnQgMC4wODE1NTYgMC43NDY4NzQKK3Z0IDAuMDgxMTUxIDAuNzQ2OTIxCit2dCAwLjA4MTE4NyAwLjczOTMzNQordnQgMC4wMDc0NzEgMC40ODMwOTUKK3Z0IDAuMDA3MTE5IDAuNDgzMTY2Cit2dCAwLjA4MTU0MiAwLjc1NjI2MwordnQgMC4wODExMzggMC43NTYyNjQKK3Z0IDAuMDA3NDcxIDAuNDc0NDA1Cit2dCAwLjAwNzExOSAwLjQ3NDMzNgordnQgMC4wODE1NTYgMC43NjU3MDAKK3Z0IDAuMDgxMTUxIDAuNzY1NjU1Cit2dCAwLjAxMDY4OSAwLjQ2NjY2NAordnQgMC4wMTAzOTAgMC40NjY0NjcKK3Z0IDAuMDgxNTkyIDAuNzczNDU4Cit2dCAwLjA4MTE4NyAwLjc3MzM3NAordnQgMC4wMTY1NzMgMC40NjA2OTIKK3Z0IDAuMDE2MzcxIDAuNDYwMzk3Cit2dCAwLjEyMDAyNiAwLjc3MTc1NwordnQgMC4xMTk5ODIgMC43NjQyNjgKK3Z0IDAuMTIwMzg4IDAuNzY0MjE4Cit2dCAwLjEyMDQzMiAwLjc3MTY2OQordnQgMC4wMjQ1ODMgMC40NTczMTYKK3Z0IDAuMDI0NTEwIDAuNDU2OTY2Cit2dCAwLjExOTk2NSAwLjc1NDkzMgordnQgMC4xMjAzNzEgMC43NTQ5MjgKK3Z0IDAuMDMzMjczIDAuNDU3MzE2Cit2dCAwLjAzMzM0MiAwLjQ1Njk2NgordnQgMC4xMTk5ODIgMC43NDU0NTQKK3Z0IDAuMTIwMzg4IDAuNzQ1NDk2Cit2dCAwLjA0MTAxNiAwLjQ2MDUzNAordnQgMC4wNDEyMTEgMC40NjAyMzcKK3Z0IDAuMTIwMDI2IDAuNzM3NTcwCit2dCAwLjEyMDQzMiAwLjczNzY1MgordnQgMC4wNDY5ODkgMC40NjY0MTcKK3Z0IDAuMDQ3MjgzIDAuNDY2MjE3Cit2dCAwLjEzNTIxMCAwLjc3NDQ4MgordnQgMC4xMzUxNzYgMC43NjY4MDcKK3Z0IDAuMTM1NTgyIDAuNzY2NzYxCit2dCAwLjEzNTYxNiAwLjc3NDM5NwordnQgMC4wNTAzNjUgMC40NzQ0MjQKK3Z0IDAuMDUwNzE0IDAuNDc0MzU0Cit2dCAwLjEzNTE2MyAwLjc1NzM5OQordnQgMC4xMzU1NjkgMC43NTczOTkKK3Z0IDAuMDUwMzY1IDAuNDgzMTE0Cit2dCAwLjA1MDcxNCAwLjQ4MzE4NQordnQgMC4xMzUxNzYgMC43NDc5ODAKK3Z0IDAuMTM1NTgyIDAuNzQ4MDI1Cit2dCAwLjA0NzE0NyAwLjQ5MDg1NQordnQgMC4wNDc0NDMgMC40OTEwNTMKK3Z0IDAuMTM1MjEwIDAuNzQwMjcxCit2dCAwLjEzNTYxNiAwLjc0MDM1NgordnQgMC4wNDEyNjMgMC40OTY4MjcKK3Z0IDAuMDQxNDYyIDAuNDk3MTIzCit2dCAwLjI5MDM4NCAwLjczNDE0NgordnQgMC4yOTAzMTUgMC43NDE5MTgKK3Z0IDAuMjg5OTExIDAuNzQxOTYyCit2dCAwLjI4OTk4MCAwLjczNDIzMAordnQgMC4yMzI5MTAgMC43NjA3NTUKK3Z0IDAuMjMyOTI1IDAuNzUyMTc3Cit2dCAwLjIzMzg5NSAwLjc1MjE3NwordnQgMC4yMzM4ODAgMC43NjA3NTUKK3Z0IDAuMjMyOTY1IDAuNzQ1MDU0Cit2dCAwLjIzMzkzNSAwLjc0NTA1NQordnQgMC4wNDk1NjQgMC43NzgyNzUKK3Z0IDAuMDQ5NTMzIDAuNzcxMzQwCit2dCAwLjA1MDUwMyAwLjc3MTM0MAordnQgMC4wNTA1MzQgMC43NzgyNzUKK3Z0IDAuMDQ5NTIyIDAuNzYyODI4Cit2dCAwLjA1MDQ5MiAwLjc2MjgyOAordnQgMC4wNDk1MzMgMC43NTQzMDUKK3Z0IDAuMDUwNTAzIDAuNzU0MzA1Cit2dCAwLjA0OTU2NCAwLjc0NzM0MAordnQgMC4wNTA1MzQgMC43NDczNDAKK3Z0IDAuNzUyNjI4IDAuNzQxNTY2Cit2dCAwLjc1MjU2NiAwLjc0ODU4NwordnQgMC43NTE1OTYgMC43NDg1ODcKK3Z0IDAuNzUxNjU4IDAuNzQxNTY1Cit2dCAwLjc1MjU0MyAwLjc1NzEzMgordnQgMC43NTE1NzMgMC43NTcxMzEKK3Z0IDAuNzUyNTY2IDAuNzY1NjIxCit2dCAwLjc1MTU5NiAwLjc2NTYyMAordnQgMC43NTI2MjggMC43NzI0OTcKK3Z0IDAuNzUxNjU4IDAuNzcyNDk2Cit2dCAwLjIxNDkyNSAwLjc0NTM2NQordnQgMC4yMTQ4OTIgMC43NTIyNTQKK3Z0IDAuMjEzOTIyIDAuNzUyMjU0Cit2dCAwLjIxMzk1NSAwLjc0NTM2NQordnQgMC4yMTQ4ODAgMC43NjA3NDkKK3Z0IDAuMjEzOTEwIDAuNzYwNzQ5Cit2dCAwLjIxNDg5MiAwLjc2OTI4OAordnQgMC4yMTM5MjIgMC43NjkyODgKK3Z0IDAuMjE0OTI1IDAuNzc2Mjk3Cit2dCAwLjIxMzk1NSAwLjc3NjI5OAordnQgMC4yMzI5NjUgMC43NzU5NjcKK3Z0IDAuMjMyOTI1IDAuNzY5MjAwCit2dCAwLjIzMzg5NSAwLjc2OTIwMAordnQgMC4yMzM5MzUgMC43NzU5NjcKK3Z0IDAuMDMzNjkwIDAuNTAyMzU5Cit2dCAwLjAyNDEzMCAwLjUwMjM1OQordnQgMC4wMTU2MDUgMC40OTg4MTYKK3Z0IDAuMDA5MDI3IDAuNDkyMzM4Cit2dCAwLjAwNTMxNCAwLjQ4MzUzMQordnQgMC4wMDUzMTQgMC40NzM5NzQKK3Z0IDAuMDA4ODU3IDAuNDY1NDUwCit2dCAwLjAxNTMzNiAwLjQ1ODg3NAordnQgMC4wMjQxNDUgMC40NTUxNjEKK3Z0IDAuMDMzNzAzIDAuNDU1MTYxCit2dCAwLjA0MjIyOSAwLjQ1ODcwNAordnQgMC4wNDg4MDYgMC40NjUxODIKK3Z0IDAuMDUyNTIwIDAuNDczOTg5Cit2dCAwLjA1MjUyMCAwLjQ4MzU0NgordnQgMC4wNDg5NzYgMC40OTIwNzAKK3Z0IDAuMDQyNDk3IDAuNDk4NjQ2Cit2dCAwLjE2NDk2MyAwLjQ4MjE2MAordnQgMC4xNzQzNzYgMC40ODAyNTcKK3Z0IDAuMTcxNzIxIDAuNDg2NjQ0Cit2dCAwLjE2Njg2NiAwLjQ5MTU3MgordnQgMC4xNjA5OTUgMC40OTgxMjcKK3Z0IDAuMTUyMjg3IDAuNDk4MTI3Cit2dCAwLjE1MzAzNyAwLjQ5NDM2NwordnQgMC4xNjAyMzUgMC40OTQzNjcKK3Z0IDAuMTQ0NTMwIDAuNDk0OTA0Cit2dCAwLjE0NjY0OSAwLjQ5MTcxMgordnQgMC4xMzg1NDYgMC40ODkwMTAKK3Z0IDAuMTQxNzIwIDAuNDg2ODU4Cit2dCAwLjEzNTE2MyAwLjQ4MDk4OAordnQgMC4xMzg5MjQgMC40ODAyMjcKK3Z0IDAuMTM1MTYzIDAuNDcyMjgyCit2dCAwLjEzODkyNCAwLjQ3MzAzMQordnQgMC4xMzgzODcgMC40NjQ1MjYKK3Z0IDAuMTQxNTc5IDAuNDY2NjQ0Cit2dCAwLjE0NDI4MiAwLjQ1ODU0MwordnQgMC4xNDY0MzQgMC40NjE3MTcKK3Z0IDAuMTUyMzA3IDAuNDU1MTYxCit2dCAwLjE1MzA2NyAwLjQ1ODkyMQordnQgMC4xNjEwMTMgMC40NTUxNjEKK3Z0IDAuMTYwMjYzIDAuNDU4OTIxCit2dCAwLjE2ODc3MCAwLjQ1ODM4NQordnQgMC4xNjY2NTEgMC40NjE1NzYKK3Z0IDAuMTc0NzU0IDAuNDY0Mjc4Cit2dCAwLjE3MTU4MCAwLjQ2NjQzMAordnQgMC4xNzgxMzcgMC40NzIzMDEKK3Z0IDAuMTc0Mzc2IDAuNDczMDYxCit2dCAwLjE3ODEzNyAwLjQ4MTAwNwordnQgMC4xNzQ5MTMgMC40ODg3NjIKK3Z0IDAuMTY5MDE4IDAuNDk0NzQ1Cit2dCAwLjE2MzU2NCAwLjQ3NTI0NgordnQgMC4xNjIxNjYgMC40NjgzMzMKK3Z0IDAuMTUxMTM0IDAuNDg0OTU1Cit2dCAwLjE1ODA0OSAwLjQ4MzU1NwordnQgMC4xNDk3MzUgMC40NzgwNDIKK3Z0IDAuMTU2NjUxIDAuNDc2NjQ0Cit2dCAwLjE0ODMzNyAwLjQ3MTEyOQordnQgMC4xNTUyNTMgMC40Njk3MzEKK3Z0IDAuMTA3MjI1IDAuNDk4NTUyCit2dCAwLjA5ODQzMSAwLjQ5ODU1MgordnQgMC4xMDEwODQgMC40ODU0ODYKK3Z0IDAuMTA0NTgyIDAuNDg1NDg2Cit2dCAwLjA5MDU5NyAwLjQ5NTI5NgordnQgMC4wOTc5NjkgMC40ODQxOTEKK3Z0IDAuMDg0NTU0IDAuNDg5MzQ0Cit2dCAwLjA5NTU2NSAwLjQ4MTgyMwordnQgMC4wODExMzggMC40ODEyNDMKK3Z0IDAuMDk0MjA2IDAuNDc4NjAxCit2dCAwLjA4MTEzOCAwLjQ3MjQ1MAordnQgMC4wOTQyMDYgMC40NzUxMDQKK3Z0IDAuMDg0Mzk0IDAuNDY0NjE5Cit2dCAwLjA5NTUwMSAwLjQ3MTk4OQordnQgMC4wOTAzNDcgMC40NTg1NzYKK3Z0IDAuMDk3ODY5IDAuNDY5NTg2Cit2dCAwLjA5ODQ1MSAwLjQ1NTE2MQordnQgMC4xMDEwOTIgMC40NjgyMjcKK3Z0IDAuMTA3MjQzIDAuNDU1MTYxCit2dCAwLjEwNDU5MCAwLjQ2ODIyNwordnQgMC4xMTUwNzcgMC40NTg0MTcKK3Z0IDAuMTA3NzA1IDAuNDY5NTIyCit2dCAwLjEyMTEyMCAwLjQ2NDM2OQordnQgMC4xMTAxMDkgMC40NzE4ODkKK3Z0IDAuMTI0NTM2IDAuNDcyNDcwCit2dCAwLjExMTQ2OCAwLjQ3NTExMgordnQgMC4xMjQ1MzYgMC40ODEyNjIKK3Z0IDAuMTExNDY4IDAuNDc4NjA5Cit2dCAwLjEyMTI4MCAwLjQ4OTA5NAordnQgMC4xMTAxNzMgMC40ODE3MjQKK3Z0IDAuMTE1MzI3IDAuNDk1MTM2Cit2dCAwLjEwNzgwNSAwLjQ4NDEyNwordnQgMC43NDAxODggMC44MjU0NDQKK3Z0IDAuNzQwMTgyIDAuODI4Nzg2Cit2dCAwLjczOTEyNiAwLjgyODc4NgordnQgMC43MzkxMzIgMC44MjU0NDAKK3Z0IDAuNzQwMjA0IDAuODIyNjY5Cit2dCAwLjczOTE0OCAwLjgyMjY2MwordnQgMC42OTYwOTUgMC44MzIxNjQKK3Z0IDAuNjk2MTA3IDAuODM0ODY2Cit2dCAwLjY5NTA1MSAwLjgzNDg3MgordnQgMC42OTUwMzkgMC44MzIxNjgKK3Z0IDAuNjk2MDkwIDAuODI4ODQ4Cit2dCAwLjY5NTAzNCAwLjgyODg0OAordnQgMC42OTYwOTUgMC44MjU1MjcKK3Z0IDAuNjk1MDM5IDAuODI1NTIzCit2dCAwLjY5NjEwNyAwLjgyMjgxMwordnQgMC42OTUwNTEgMC44MjI4MDcKK3Z0IDAuMDM2MzQyIDAuODI1NjUyCit2dCAwLjAzNjM2NiAwLjgyMjkxNgordnQgMC4wMzc0MjIgMC44MjI5MTAKK3Z0IDAuMDM3Mzk4IDAuODI1NjQ4Cit2dCAwLjAzNjMzMyAwLjgyODk4MQordnQgMC4wMzczODkgMC44Mjg5ODEKK3Z0IDAuMDM2MzQyIDAuODMyMjg4Cit2dCAwLjAzNzM5OCAwLjgzMjI5MgordnQgMC4wMzYzNjYgMC44MzQ5NjcKK3Z0IDAuMDM3NDIyIDAuODM0OTc0Cit2dCAwLjMxNjI2NSAwLjgyNTY0NAordnQgMC4zMTYyNzggMC44MjI5NjAKK3Z0IDAuMzE3MzMzIDAuODIyOTU0Cit2dCAwLjMxNzMyMSAwLjgyNTY0MQordnQgMC4zMTYyNjAgMC44Mjg5NTQKK3Z0IDAuMzE3MzE2IDAuODI4OTU0Cit2dCAwLjMxNjI2NSAwLjgzMjI4MQordnQgMC4zMTczMjEgMC44MzIyODQKK3Z0IDAuMzE2Mjc4IDAuODM1MDEyCit2dCAwLjMxNzMzMyAwLjgzNTAxOAordnQgMC43NDAxODggMC44MzIwNzcKK3Z0IDAuNzQwMjA0IDAuODM0NzEzCit2dCAwLjczOTE0OCAwLjgzNDcxOQordnQgMC43MzkxMzIgMC44MzIwODAKK3Z0IDAuNzM4ODI0IDAuODI1MzQ0Cit2dCAwLjczODgxOCAwLjgyODc5NgordnQgMC4wOTgxMjEgMC40ODM5NjQKK3Z0IDAuMTAxMTQxIDAuNDg1MjE5Cit2dCAwLjA5NTc5MSAwLjQ4MTY3MAordnQgMC42OTQ3MjYgMC44Mjg4NDkKK3Z0IDAuNjk0NzMxIDAuODMyMjc0Cit2dCAwLjY5NDczMSAwLjgyNTQxOQordnQgMC4wOTU3MzAgMC40NzIxMzgKK3Z0IDAuMDk0NDc0IDAuNDc1MTU4Cit2dCAwLjA5ODAyNCAwLjQ2OTgwOQordnQgMC4wMzc2OTEgMC44Mjg5ODUKK3Z0IDAuMDM3NzAxIDAuODI1NTQ3Cit2dCAwLjAzNzcwMSAwLjgzMjQwMQordnQgMC4xMDc1NTcgMC40Njk3NDgKK3Z0IDAuMTA0NTM4IDAuNDY4NDkzCit2dCAwLjEwOTg4NyAwLjQ3MjA0MgordnQgMC4zMTc2MjAgMC44Mjg5NTAKK3Z0IDAuMzE3NjI1IDAuODI1NTMyCit2dCAwLjMxNzYyNSAwLjgzMjM4NwordnQgMC4xMDk5NDkgMC40ODE1NzMKK3Z0IDAuMTExMjA0IDAuNDc4NTU0Cit2dCAwLjEwNzY1NCAwLjQ4MzkwMwordnQgMC43Mzg4MjQgMC44MzIxOTUKK3Z0IDAuNDIxOTU4IDAuNjY2ODUxCit2dCAwLjQyNTU2MSAwLjY2Njg1MQordnQgMC40MjQ3NzkgMC42NzA3MDIKK3Z0IDAuNDIyNzM3IDAuNjcwNzAxCit2dCAwLjQyODc3MSAwLjY2ODE4NQordnQgMC40MjY1OTggMC42NzE0NTgKK3Z0IDAuNDMxMjQ3IDAuNjcwNjIzCit2dCAwLjQyODAwMSAwLjY3Mjg0MAordnQgMC40MzI2NDYgMC42NzM5NDIKK3Z0IDAuNDI4Nzk1IDAuNjc0NzIxCit2dCAwLjQzMjY0NiAwLjY3NzU0NAordnQgMC40Mjg3OTQgMC42NzY3NjIKK3Z0IDAuNDMxMzEyIDAuNjgwNzUzCit2dCAwLjQyODAzOCAwLjY3ODU4MAordnQgMC40Mjg4NzMgMC42ODMyMjkKK3Z0IDAuNDI2NjU2IDAuNjc5OTg0Cit2dCAwLjQyNTU1MyAwLjY4NDYyOAordnQgMC40MjQ3NzUgMC42ODA3NzgKK3Z0IDAuNDIxOTUxIDAuNjg0NjI4Cit2dCAwLjQyMjczMyAwLjY4MDc3NwordnQgMC40MTg3NDIgMC42ODMyOTQKK3Z0IDAuNDIwOTE1IDAuNjgwMDIwCit2dCAwLjQxNjI2NiAwLjY4MDg1NgordnQgMC40MTk1MTEgMC42Nzg2MzkKK3Z0IDAuNDE0ODY2IDAuNjc3NTM2Cit2dCAwLjQxODcxNyAwLjY3Njc1OAordnQgMC40MTQ4NjYgMC42NzM5MzQKK3Z0IDAuNDE4NzE4IDAuNjc0NzE2Cit2dCAwLjQxNjIwMCAwLjY3MDcyNgordnQgMC40MTk0NzQgMC42NzI4OTgKK3Z0IDAuNDE4NjM5IDAuNjY4MjUwCit2dCAwLjQyMDg1NiAwLjY3MTQ5NQordnQgMC44NDE5MTQgMC4xMTI1MzcKK3Z0IDAuODQxOTE3IDAuMTEwOTYwCit2dCAwLjg0Mjk5OSAwLjExMDk2MAordnQgMC44NDI5OTYgMC4xMTI1MzcKK3Z0IDAuODQxOTI0IDAuMTA5NjUxCit2dCAwLjg0MzAwNiAwLjEwOTY1MQordnQgMC4xNDg4ODEgMC44NDk1MTkKK3Z0IDAuMTQ4ODc1IDAuODQ4MjQ1Cit2dCAwLjE0OTk1NyAwLjg0ODI0NQordnQgMC4xNDk5NjMgMC44NDk1MTkKK3Z0IDAuMTQ4ODczIDAuODQ2NjgwCit2dCAwLjE0OTk1NSAwLjg0NjY4MAordnQgMC4xNDg4NzUgMC44NDUxMTQKK3Z0IDAuMTQ5OTU3IDAuODQ1MTE0Cit2dCAwLjE0ODg4MSAwLjg0MzgzNAordnQgMC4xNDk5NjMgMC44NDM4MzQKK3Z0IDAuNDI2NzQ1IDAuODQ0MTM3Cit2dCAwLjQyNjczMyAwLjg0NTQyOAordnQgMC40MjU2NTIgMC44NDU0MjcKK3Z0IDAuNDI1NjYzIDAuODQ0MTM3Cit2dCAwLjQyNjcyOSAwLjg0Njk5OAordnQgMC40MjU2NDggMC44NDY5OTgKK3Z0IDAuNDI2NzMzIDAuODQ4NTU4Cit2dCAwLjQyNTY1MiAwLjg0ODU1OAordnQgMC40MjY3NDUgMC44NDk4MjIKK3Z0IDAuNDI1NjYzIDAuODQ5ODIyCit2dCAwLjc2NDc5NCAwLjg0NDIzNgordnQgMC43NjQ3ODggMC44NDU1MDMKK3Z0IDAuNzYzNzA3IDAuODQ1NTAzCit2dCAwLjc2MzcxMyAwLjg0NDIzNwordnQgMC43NjQ3ODYgMC44NDcwNjQKK3Z0IDAuNzYzNzA0IDAuODQ3MDY0Cit2dCAwLjc2NDc4OCAwLjg0ODYzMwordnQgMC43NjM3MDcgMC44NDg2MzMKK3Z0IDAuNzY0Nzk0IDAuODQ5OTIyCit2dCAwLjc2MzcxMyAwLjg0OTkyMgordnQgMC44NDE5MjQgMC4xMTUzMzMKK3Z0IDAuODQxOTE3IDAuMTE0MDg5Cit2dCAwLjg0Mjk5OSAwLjExNDA4OQordnQgMC44NDMwMDYgMC4xMTUzMzMKK3Z0IDAuODQwNzgyIDAuMTEwNjAyCit2dCAwLjg0MTc3NyAwLjExMDkxOQordnQgMC44NDE3NzQgMC4xMTI1NDEKK3Z0IDAuODQwNzc4IDAuMTEyNTc1Cit2dCAwLjkwNDE2NyAwLjc3MzQxNwordnQgMC45MDUwNjYgMC43NzM0MjIKK3Z0IDAuOTA1MzY5IDAuNzc0OTc4Cit2dCAwLjkwNDUzNCAwLjc3NTMxMAordnQgMC45MDQ1MzQgMC43NzE1MjUKK3Z0IDAuOTA1MzY5IDAuNzcxODY3Cit2dCAwLjE0NzczOSAwLjg0NjY4NAordnQgMC4xNDg3MzMgMC44NDY2ODEKK3Z0IDAuMTQ4NzM2IDAuODQ4MjkwCit2dCAwLjE0Nzc0MiAwLjg0ODY0MQordnQgMC4xNDc3NDIgMC44NDQ3MjQKK3Z0IDAuMTQ4NzM2IDAuODQ1MDY5Cit2dCAwLjM0MzAyMyAwLjkwNjA0MwordnQgMC4zNDM5MjIgMC45MDYwMzgKK3Z0IDAuMzQ0MjI0IDAuOTA3NTk0Cit2dCAwLjM0MzM5MCAwLjkwNzkzNQordnQgMC4zNDMzOTAgMC45MDQxNTAKK3Z0IDAuMzQ0MjI0IDAuOTA0NDgyCit2dCAwLjQyNzg0MyAwLjg0NzAxNAordnQgMC40MjY4NjcgMC44NDcwMDAKK3Z0IDAuNDI2ODcxIDAuODQ1Mzg0Cit2dCAwLjQyNzg0OSAwLjg0NTA0OQordnQgMC40Mjc4NDkgMC44NDg5NjYKK3Z0IDAuNDI2ODcxIDAuODQ4NjA1Cit2dCAwLjI3ODI5NyAwLjkwNjA4OAordnQgMC4yNzkxODcgMC45MDYwODMKK3Z0IDAuMjc5NDg5IDAuOTA3NjM5Cit2dCAwLjI3ODY2NCAwLjkwNzk4MQordnQgMC4yNzg2NjQgMC45MDQxOTYKK3Z0IDAuMjc5NDg5IDAuOTA0NTI3Cit2dCAwLjc2NTkwNyAwLjg0NzA1MQordnQgMC43NjQ5MjQgMC44NDcwNjIKK3Z0IDAuNzY0OTI3IDAuODQ1NDU2Cit2dCAwLjc2NTkwOSAwLjg0NTA5NwordnQgMC43NjU5MDkgMC44NDkwMTUKK3Z0IDAuNzY0OTI3IDAuODQ4Njc3Cit2dCAwLjQ0MzI3MyAwLjkwNjA3MwordnQgMC40NDQxNjMgMC45MDYwNzkKK3Z0IDAuNDQ0NDY1IDAuOTA3NjM0Cit2dCAwLjQ0MzY0MCAwLjkwNzk2NgordnQgMC40NDM2NDEgMC45MDQxODEKK3Z0IDAuNDQ0NDY1IDAuOTA0NTIzCit2dCAwLjg0MTc3NyAwLjExNDEzOAordnQgMC44NDA3ODIgMC4xMTQ1MTcKK3Z0IDAuODQwNjM4IDAuMTEyNTc5Cit2dCAwLjg0MDY0MiAwLjExMDU2NAordnQgMC44NDE3ODUgMC4xMDk1NzMKK3Z0IDAuODQwNjUxIDAuMTA4ODkxCit2dCAwLjg0MDc5MSAwLjEwODk2NQordnQgMC4xNDg3NDEgMC44NDk2MDEKK3Z0IDAuMTQ3NzQ5IDAuODUwMjM1Cit2dCAwLjE0NzYwOSAwLjg1MDMxMgordnQgMC4xNDc2MDIgMC44NDg2ODQKK3Z0IDAuMTQ3NTk5IDAuODQ2Njg0Cit2dCAwLjE0NzYwMiAwLjg0NDY4MgordnQgMC4xNDg3NDEgMC44NDM3NTMKK3Z0IDAuMTQ3NjA5IDAuODQzMDQ2Cit2dCAwLjE0Nzc0OSAwLjg0MzEyMgordnQgMC40MjY4ODMgMC44NDQwNTcKK3Z0IDAuNDI3ODYzIDAuODQzNDM1Cit2dCAwLjQyODAwMSAwLjg0MzM1OQordnQgMC40Mjc5ODYgMC44NDUwMDgKK3Z0IDAuNDI3OTgxIDAuODQ3MDE2Cit2dCAwLjQyNzk4NiAwLjg0OTAxMAordnQgMC40MjY4ODMgMC44NDk5MDUKK3Z0IDAuNDI4MDAxIDAuODUwNjI1Cit2dCAwLjQyNzg2MyAwLjg1MDU0NwordnQgMC43NjQ5MzMgMC44NDQxNTQKK3Z0IDAuNzY1OTE3IDAuODQzNTE0Cit2dCAwLjc2NjA1NSAwLjg0MzQzNgordnQgMC43NjYwNDggMC44NDUwNTQKK3Z0IDAuNzY2MDQ1IDAuODQ3MDQ5Cit2dCAwLjc2NjA0OCAwLjg0OTA1NgordnQgMC43NjQ5MzMgMC44NTAwMDIKK3Z0IDAuNzY2MDU1IDAuODUwNzAyCit2dCAwLjc2NTkxNyAwLjg1MDYyNgordnQgMC44NDE3ODUgMC4xMTU0MTcKK3Z0IDAuODQwNzkxIDAuMTE2MDcyCit2dCAwLjg0MDY1MSAwLjExNjE1MgordnQgMC44NDA2NDIgMC4xMTQ1NjMKK3Z0IDAuMjk3NTU3IDAuNzk1MDUzCit2dCAwLjI5NzU1NyAwLjc5MzQxNwordnQgMC4yOTgxNTUgMC43OTM1MzUKK3Z0IDAuMjk4MTU1IDAuNzk0OTI5Cit2dCAwLjI5ODE2MyAwLjc5MTk2MAordnQgMC4yOTg2NzEgMC43OTIyOTQKK3Z0IDAuMjk5MjcxIDAuNzkwODM2Cit2dCAwLjI5OTYxNCAwLjc5MTMzNgordnQgMC4zMDA3NzkgMC43OTAyMDAKK3Z0IDAuMzAwODk5IDAuNzkwNzk0Cit2dCAwLjMwMjQxNSAwLjc5MDIwMAordnQgMC4zMDIyOTMgMC43OTA3OTQKK3Z0IDAuMzAzODczIDAuNzkwODA2Cit2dCAwLjMwMzUzNSAwLjc5MTMxMAordnQgMC4zMDQ5OTcgMC43OTE5MTMKK3Z0IDAuMzA0NDkzIDAuNzkyMjU0Cit2dCAwLjMwNTYzMyAwLjc5MzQyMQordnQgMC4zMDUwMzQgMC43OTM1MzgKK3Z0IDAuMzA1NjMzIDAuNzk1MDU3Cit2dCAwLjMwNTAzNCAwLjc5NDkzMgordnQgMC4zMDUwMjcgMC43OTY1MTQKK3Z0IDAuMzA0NTE4IDAuNzk2MTczCit2dCAwLjMwMzkxOSAwLjc5NzYzOAordnQgMC4zMDM1NzQgMC43OTcxMzEKK3Z0IDAuMzAyNDExIDAuNzk4Mjc0Cit2dCAwLjMwMjI5MCAwLjc5NzY3MgordnQgMC4zMDA3NzUgMC43OTgyNzQKK3Z0IDAuMzAwODk2IDAuNzk3NjcyCit2dCAwLjI5OTMxOCAwLjc5NzY2OAordnQgMC4yOTk2NTQgMC43OTcxNTYKK3Z0IDAuMjk4MTkzIDAuNzk2NTYxCit2dCAwLjI5ODY5NiAwLjc5NjIxMwordnQgMC4yOTkxMTIgMC43OTM3MjcKK3Z0IDAuMjk5MTEyIDAuNzk0NzMyCit2dCAwLjI5OTQ4NCAwLjc5MjgzMQordnQgMC4zMDAxNjUgMC43OTIxNDAKK3Z0IDAuMzAxMDkyIDAuNzkxNzQ5Cit2dCAwLjMwMjA5OCAwLjc5MTc0OQordnQgMC4zMDI5OTQgMC43OTIxMjIKK3Z0IDAuMzAzNjg1IDAuNzkyODAyCit2dCAwLjMwNDA3NSAwLjc5MzcyOQordnQgMC4zMDQwNzUgMC43OTQ3MzQKK3Z0IDAuMzAzNzAzIDAuNzk1NjMwCit2dCAwLjMwMzAyMiAwLjc5NjMyMQordnQgMC4zMDIwOTUgMC43OTY3MTIKK3Z0IDAuMzAxMDkwIDAuNzk2NzEyCit2dCAwLjMwMDE5NCAwLjc5NjMzOQordnQgMC4yOTk1MDMgMC43OTU2NTkKK3Z0IDAuMjk5OTM3IDAuNzkzODkzCit2dCAwLjI5OTkzNyAwLjc5NDU2NAordnQgMC4zMDAxODUgMC43OTMyOTUKK3Z0IDAuMzAwNjQwIDAuNzkyODM0Cit2dCAwLjMwMTI1OCAwLjc5MjU3MwordnQgMC4zMDE5MzAgMC43OTI1NzMKK3Z0IDAuMzAyNTI4IDAuNzkyODIxCit2dCAwLjMwMjk4OSAwLjc5MzI3NgordnQgMC4zMDMyNTAgMC43OTM4OTQKK3Z0IDAuMzAzMjUwIDAuNzk0NTY2Cit2dCAwLjMwMzAwMiAwLjc5NTE2NAordnQgMC4zMDI1NDcgMC43OTU2MjUKK3Z0IDAuMzAxOTI4IDAuNzk1ODg2Cit2dCAwLjMwMTI1NyAwLjc5NTg4NgordnQgMC4zMDA2NTkgMC43OTU2MzcKK3Z0IDAuMzAwMTk4IDAuNzk1MTgzCit2dCAwLjMwMDgxOCAwLjc5MzcxNQordnQgMC4zMDIxMDggMC43OTM0NTQKK3Z0IDAuMzAxNDYzIDAuNzkzNTg0Cit2dCAwLjMwMjM2OSAwLjc5NDc0NAordnQgMC4zMDE3MjQgMC43OTQ4NzQKK3Z0IDAuMzAxMDc5IDAuNzk1MDA0Cit2dCAwLjMwMDk0OCAwLjc5NDM2MAordnQgMC4zMDE1OTMgMC43OTQyMjkKK3Z0IDAuMzAyMjM4IDAuNzk0MDk5Cit2biAtMC4wMjU4MDAgLTAuOTk5MzAwIDAuMDI1NjAwCit2biAtMC4wMjQ4MDAgLTAuOTk5NDAwIDAuMDI0ODAwCit2biAtMC4wMDkwMDAgLTAuOTk5NDAwIDAuMDMzNjAwCit2biAtMC4wMDg2MDAgLTAuOTk5NTAwIDAuMDMwODAwCit2biAwLjAyNDkwMCAtMC45OTk0MDAgMC4wMjU2MDAKK3ZuIDAuMDI0MzAwIC0wLjk5OTQwMCAwLjAyNDkwMAordm4gMC4wMzQwMDAgLTAuOTk5NDAwIDAuMDA4NzAwCit2biAwLjAzMDcwMCAtMC45OTk1MDAgMC4wMDgyMDAKK3ZuIDAuMDYzODAwIC0wLjg2ODYwMCAtMC40OTE1MDAKK3ZuIC0wLjE0MzMwMCAtMC45MTgxMDAgLTAuMzY5NDAwCit2biAtMC4xMDMwMDAgLTAuODE3OTAwIC0wLjU2NjEwMAordm4gLTAuMTE2MDAwIC0wLjg0OTUwMCAtMC41MTQ3MDAKK3ZuIDAuMTM2MzAwIC0wLjkyODgwMCAtMC4zNDQ2MDAKK3ZuIC0wLjAwOTEwMCAtMC44NzI5MDAgLTAuNDg3ODAwCit2biAtMC4wNTI3MDAgLTAuOTk4NTAwIC0wLjAxMTgwMAordm4gLTAuMDMwNTAwIC0wLjk5OTUwMCAtMC4wMDkzMDAKK3ZuIDAuNTc2OTAwIC0wLjU4NTkwMCAtMC41NjkxMDAKK3ZuIDAuNTcwNzAwIC0wLjU5NjEwMCAtMC41NjQ4MDAKK3ZuIC0wLjYxMzEwMCAtMC43NzI4MDAgMC4xNjQyMDAKK3ZuIC0wLjY0MDIwMCAtMC43NDk1MDAgMC4xNjg2MDAKK3ZuIDAuMTk5ODAwIC0wLjYyMjIwMCAtMC43NTY5MDAKK3ZuIDAuMjA3NzAwIC0wLjU5NzYwMCAtMC43NzQ0MDAKK3ZuIC0wLjU2MTYwMCAtMC41ODk5MDAgLTAuNTgwMjAwCit2biAtMC41NTc5MDAgLTAuNTk4ODAwIC0wLjU3NDYwMAordm4gMC4xNjcwMDAgLTAuNzcyNDAwIDAuNjEyODAwCit2biAwLjE3MTYwMCAtMC43NDk1MDAgMC42Mzk0MDAKK3ZuIC0wLjc1ODYwMCAtMC42MjM1MDAgLTAuMTg5MTAwCit2biAtMC43NzkzMDAgLTAuNTk0NTAwIC0wLjE5ODMwMAordm4gLTAuNzM1MzAwIC0wLjU0NjMwMCAwLjQwMTIwMAordm4gLTAuNzA5NDAwIC0wLjYwNzYwMCAwLjM1NzIwMAordm4gMC42MTQwMDAgLTAuNzc0MDAwIC0wLjE1NDUwMAordm4gMC42NDQ0MDAgLTAuNzQ3OTAwIC0wLjE1OTMwMAordm4gLTAuMzU4MTAwIC0wLjU5MjkwMCAwLjcyMTMwMAordm4gLTAuMzYxMTAwIC0wLjYwNzMwMCAwLjcwNzcwMAordm4gMC43MTY0MDAgLTAuNjA2OTAwIDAuMzQ0MjAwCit2biAwLjczNDMwMCAtMC41NDUxMDAgMC40MDQ2MDAKK3ZuIC0wLjAxNTEwMCAtMC42Mjg2MDAgLTAuNzc3NjAwCit2biAtMC4wMDY0MDAgLTAuNjUwNjAwIC0wLjc1OTQwMAordm4gMC43NjEyMDAgLTAuNjI1OTAwIDAuMTY5OTAwCit2biAwLjc4OTIwMCAtMC41ODk3MDAgMC4xNzE3MDAKK3ZuIDAuOTcyMDAwIDAuMDAwMDAwIC0wLjIzNTEwMAordm4gLTAuMjQxMDAwIC0wLjAwMDAwMCAtMC45NzA1MDAKK3ZuIC0wLjk3NTMwMCAtMC4wMDAwMDAgMC4yMjA3MDAKK3ZuIDAuMjQ2MjAwIDAuMDAwMDAwIDAuOTY5MjAwCit2biAwLjg1ODMwMCAtMC40NzU2MDAgLTAuMTkyNjAwCit2biAwLjgyNjUwMCAtMC41MjY5MDAgLTAuMTk4MjAwCit2biAtMC4xOTkzMDAgLTAuNDcxNjAwIC0wLjg1OTAwMAordm4gLTAuMjA0MTAwIC0wLjUyMTAwMCAtMC44Mjg4MDAKK3ZuIC0wLjg2NjcwMCAtMC40NjUwMDAgMC4xODA2MDAKK3ZuIC0wLjgyODcwMCAtMC41MjgwMDAgMC4xODU5MDAKK3ZuIDAuMjA1NDAwIC0wLjQ3MDUwMCAwLjg1ODIwMAordm4gMC4yMDk0MDAgLTAuNTE3MzAwIDAuODI5ODAwCit2biAwLjcyODAwMCAtMC42NjI2MDAgLTAuMTc2MDAwCit2biAwLjc1NDgwMCAtMC42MzA2MDAgLTAuMTgxMDAwCit2biAtMC4xODA2MDAgLTAuNjYyMDAwIC0wLjcyNzQwMAordm4gLTAuMTg1NzAwIC0wLjYzMDUwMCAtMC43NTM3MDAKK3ZuIC0wLjcyOTUwMCAtMC42NjM4MDAgMC4xNjUwMDAKK3ZuIC0wLjc1OTEwMCAtMC42MjgzMDAgMC4xNzAzMDAKK3ZuIDAuMTg0NzAwIC0wLjY2MTYwMCAwLjcyNjgwMAordm4gMC4xODk0MDAgLTAuNjMyNTAwIDAuNzUxMTAwCit2biAtMC4wMzA1MDAgLTAuOTk5NTAwIDAuMDA4MDAwCit2biAtMC4wMzQyMDAgLTAuOTk5NDAwIDAuMDA4NTAwCit2biAwLjc4MjAwMCAtMC41OTI1MDAgLTAuMTkzNjAwCit2biAwLjc1OTMwMCAtMC42MjQzMDAgLTAuMTgzNzAwCit2biAtMC40NzI4MDAgLTAuNzQzMjAwIDAuNDczNDAwCit2biAtMC40Njc0MDAgLTAuNzUwOTAwIDAuNDY2NTAwCit2biAwLjcxMTkwMCAwLjAwMDAwMCAtMC43MDIzMDAKK3ZuIDAuNjMzOTAwIC0wLjQ2MzUwMCAtMC42MTkxMDAKK3ZuIDAuNjI1MDAwIC0wLjQ3OTcwMCAtMC42MTU4MDAKK3ZuIDAuNTU2MzAwIC0wLjYyNDgwMCAtMC41NDc4MDAKK3ZuIDAuNTQ5OTAwIC0wLjYzNTEwMCAtMC41NDI1MDAKK3ZuIC0wLjE3OTMwMCAtMC43NTM0MDAgMC42MzI3MDAKK3ZuIC0wLjE3MTQwMCAtMC43NzE4MDAgMC42MTIzMDAKK3ZuIDAuMjU1MjAwIC0wLjAwMDAwMCAtMC45NjY5MDAKK3ZuIDAuMjE2OTAwIC0wLjUxOTEwMCAtMC44MjY3MDAKK3ZuIDAuMjEzODAwIC0wLjQ4MDkwMCAtMC44NTAzMDAKK3ZuIDAuMTk2OTAwIC0wLjYzNjAwMCAtMC43NDYxMDAKK3ZuIDAuMTkwNTAwIC0wLjY2MDcwMCAtMC43MjYxMDAKK3ZuIDAuMDA4MjAwIC0wLjk5OTUwMCAwLjAzMDcwMAordm4gMC4wMDg3MDAgLTAuOTk5NDAwIDAuMDM0NDAwCit2biAtMC4xOTIzMDAgLTAuNjIzMjAwIC0wLjc1ODEwMAordm4gLTAuMTk0MzAwIC0wLjU5MTgwMCAtMC43ODIzMDAKK3ZuIDAuNDY1NzAwIC0wLjc0NjYwMCAwLjQ3NTEwMAordm4gMC40NjAwMDAgLTAuNzUzMzAwIDAuNDcwMTAwCit2biAtMC42OTU1MDAgLTAuMDAwMDAwIC0wLjcxODUwMAordm4gLTAuNjExNTAwIC0wLjQ2OTQwMCAtMC42MzcwMDAKK3ZuIC0wLjYwODUwMCAtMC40ODM0MDAgLTAuNjI5MzAwCit2biAtMC41NDA2MDAgLTAuNjI4ODAwIC0wLjU1ODkwMAordm4gLTAuNTM1ODAwIC0wLjYzNzcwMCAtMC41NTM0MDAKK3ZuIDAuNjM2NzAwIC0wLjc1MTMwMCAwLjE3MzYwMAordm4gMC42MTMxMDAgLTAuNzcyNzAwIDAuMTY0NjAwCit2biAtMC45NzAzMDAgMC4wMDAwMDAgLTAuMjQxOTAwCit2biAtMC44Mjc2MDAgLTAuNTIyNzAwIC0wLjIwNDcwMAordm4gLTAuODU1NjAwIC0wLjQ3NzMwMCAtMC4yMDAwMDAKK3ZuIC0wLjc1MTMwMCAtMC42MzI5MDAgLTAuMTg3MzAwCit2biAtMC43Mjc2MDAgLTAuNjYyMDAwIC0wLjE4MDAwMAordm4gMC4wMzA0MDAgLTAuOTk5NTAwIC0wLjAwOTUwMAordm4gMC4wNTI0MDAgLTAuOTk4NjAwIC0wLjAxMjEwMAordm4gLTAuNzYwNTAwIC0wLjYyNTAwMCAwLjE3NjIwMAordm4gLTAuNzg3NzAwIC0wLjU4OTcwMCAwLjE3ODIwMAordm4gMC4yOTczMDAgLTAuNjk2OTAwIC0wLjY1MjYwMAordm4gMC4zMDAxMDAgLTAuNjk0NDAwIC0wLjY1NDAwMAordm4gLTAuNzMzNDAwIDAuMDAwMDAwIDAuNjc5ODAwCit2biAtMC42MDIwMDAgLTAuNTQ1MTAwIDAuNTgzNjAwCit2biAtMC42NTAxMDAgLTAuNDYzNzAwIDAuNjAxOTAwCit2biAtMC41NzA1MDAgLTAuNjI4NzAwIDAuNTI4NTAwCit2biAtMC41NjQ2MDAgLTAuNjM4NDAwIDAuNTIzMjAwCit2biAwLjAxNjIwMCAtMC42Mjg2MDAgLTAuNzc3NTAwCit2biAwLjAwMjcwMCAtMC42NTAxMDAgLTAuNzU5OTAwCit2biAtMC4yMzgxMDAgMC4wMDAwMDAgMC45NzEyMDAKK3ZuIC0wLjIwMjIwMCAtMC41MTc3MDAgMC44MzEzMDAKK3ZuIC0wLjIwNDQwMCAtMC41NDMyMDAgMC44MTQzMDAKK3ZuIC0wLjE4NDcwMCAtMC42MzE2MDAgMC43NTMwMDAKK3ZuIC0wLjE3NzEwMCAtMC42NjIxMDAgMC43MjgyMDAKK3ZuIDAuMTE0MDAwIC0wLjg0OTYwMCAtMC41MTUwMDAKK3ZuIDAuMTEwNjAwIC0wLjg0MTYwMCAtMC41Mjg2MDAKK3ZuIDAuMzYxNzAwIC0wLjYwNzIwMCAwLjcwNzQwMAordm4gMC4zNjI0MDAgLTAuNTkxOTAwIDAuNzIwMDAwCit2biAtMC4zMDI4MDAgLTAuNjkxMzAwIC0wLjY1NjEwMAordm4gLTAuMjk3ODAwIC0wLjY5NTIwMCAtMC42NTQyMDAKK3ZuIDAuNzM0MjAwIDAuMDAwMDAwIDAuNjc4OTAwCit2biAwLjY0NjQwMCAtMC40ODE1MDAgMC41OTE5MDAKK3ZuIDAuNjUwMTAwIC0wLjQ2NTYwMCAwLjYwMDQwMAordm4gMC41NjY0MDAgLTAuNjM2ODAwIDAuNTIzMjAwCit2biAwLjU3MTgwMCAtMC42MjczMDAgMC41Mjg3MDAKK3ZuIC0wLjY0NDQwMCAtMC43NDgzMDAgLTAuMTU3NjAwCit2biAtMC42MTQ3MDAgLTAuNzc0ODAwIC0wLjE0NzgwMAordm4gMC45NzcxMDAgMC4wMDAwMDAgMC4yMTI2MDAKK3ZuIDAuODI5NTAwIC0wLjUyOTAwMCAwLjE3ODgwMAordm4gMC44NjI2MDAgLTAuNDc1MDAwIDAuMTc0MTAwCit2biAwLjc2MDAwMCAtMC42Mjg1MDAgMC4xNjU0MDAKK3ZuIDAuNzMwMjAwIC0wLjY2NDgwMCAwLjE1NzUwMAordm4gMC41MzUyMDAgLTAuNjE1MjAwIC0wLjU3ODkwMAordm4gMC41MzYzMDAgLTAuNjEyNjAwIDAuNTgwNTAwCit2biAwLjY1NzUwMCAtMC43NTM1MDAgMC4wMDA2MDAKK3ZuIDAuNjU3NTAwIC0wLjc1MzUwMCAwLjAwMDcwMAordm4gMC4wMTYzMDAgLTAuOTk5OTAwIDAuMDAyNzAwCit2biAwLjAxNjMwMCAtMC45OTk5MDAgMC4wMDI0MDAKK3ZuIDAuMDExNzAwIC0wLjczNTkwMCAtMC42NzcwMDAKK3ZuIDAuMDExNzAwIC0wLjczNTUwMCAtMC42Nzc0MDAKK3ZuIDAuMDEyMjAwIC0wLjczMjAwMCAwLjY4MTIwMAordm4gMC42NTc1MDAgLTAuNzUzNDAwIDAuMDAwNjAwCit2biAwLjAxNjMwMCAtMC45OTk5MDAgMC4wMDI1MDAKK3ZuIDAuMDE2MzAwIC0wLjk5OTkwMCAwLjAwMjYwMAordm4gMC45OTk3MDAgMC4wMjM2MDAgLTAuMDAyMTAwCit2biAwLjk5OTcwMCAwLjAyMzcwMCAtMC4wMDIxMDAKK3ZuIDAuNjcwNzAwIDAuMDEzNzAwIC0wLjc0MTYwMAordm4gMC42NzIzMDAgMC4wMTgxMDAgMC43NDAxMDAKK3ZuIDAuNjcyNDAwIDAuMDE4MTAwIDAuNzQwMDAwCit2biAtMC4wMDA0MDAgLTAuMDAzMDAwIC0xLjAwMDAwMAordm4gMC4wMDA0MDAgMC4wMDMwMDAgMS4wMDAwMDAKK3ZuIDAuOTk5NzAwIDAuMDIzNzAwIC0wLjAwMjAwMAordm4gMS4wMDAwMDAgLTAuMDA2MjAwIC0wLjAwMjAwMAordm4gMC42NzA5MDAgLTAuMDA1NjAwIC0wLjc0MTUwMAordm4gMC42NzA5MDAgLTAuMDA1NjAwIC0wLjc0MTYwMAordm4gMC42NzI1MDAgLTAuMDAyODAwIDAuNzQwMTAwCit2biAwLjY3MjYwMCAtMC4wMDI4MDAgMC43NDAwMDAKK3ZuIC0wLjAwMDQwMCAtMC4wMDE5MDAgLTEuMDAwMDAwCit2biAwLjAwMDQwMCAwLjAwMTkwMCAxLjAwMDAwMAordm4gMC4wMDAyMDAgMC4wMDE5MDAgMS4wMDAwMDAKK3ZuIDAuMDAwMjAwIDAuMDAyOTAwIDEuMDAwMDAwCit2biAwLjAwMDIwMCAwLjAwMzAwMCAxLjAwMDAwMAordm4gMC4wMDAxMDAgLTAuNzMyMDAwIDAuNjgxMzAwCit2biAwLjAwMDEwMCAtMC43MzIxMDAgMC42ODEyMDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDI0MDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDI3MDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDI5MDAKK3ZuIC0wLjAwMDIwMCAtMC43MzU4MDAgLTAuNjc3MjAwCit2biAtMC4wMDAyMDAgLTAuNzM1OTAwIC0wLjY3NzEwMAordm4gLTAuMDAwMjAwIC0wLjAwMjkwMCAtMS4wMDAwMDAKK3ZuIC0wLjAwMDIwMCAtMC4wMDMwMDAgLTEuMDAwMDAwCit2biAtMC4wMDAyMDAgLTAuMDAxOTAwIC0xLjAwMDAwMAordm4gLTAuNTM1MTAwIC0wLjYxNTIwMCAtMC41Nzg5MDAKK3ZuIC0wLjUzNjMwMCAtMC42MTI2MDAgMC41ODA2MDAKK3ZuIC0wLjY1NzUwMCAtMC43NTM0MDAgMC4wMDA3MDAKK3ZuIC0wLjY1NzUwMCAtMC43NTM1MDAgMC4wMDA3MDAKK3ZuIC0wLjAxNjMwMCAtMC45OTk5MDAgMC4wMDIzMDAKK3ZuIC0wLjAxNjMwMCAtMC45OTk5MDAgMC4wMDI4MDAKK3ZuIC0wLjAxMTcwMCAtMC43MzU3MDAgLTAuNjc3MjAwCit2biAtMC4wMTE2MDAgLTAuNzM1NzAwIC0wLjY3NzMwMAordm4gLTAuMDEyMjAwIC0wLjczMjAwMCAwLjY4MTIwMAordm4gLTAuMDEyMjAwIC0wLjczMTgwMCAwLjY4MTQwMAordm4gLTAuNjU3NTAwIC0wLjc1MzUwMCAwLjAwMDYwMAordm4gLTAuNjU3NTAwIC0wLjc1MzQwMCAwLjAwMDYwMAordm4gLTAuMDE2MzAwIC0wLjk5OTkwMCAwLjAwMjUwMAordm4gLTAuMDE2MzAwIC0wLjk5OTkwMCAwLjAwMjYwMAordm4gLTAuMDE2MjAwIC0wLjk5OTkwMCAwLjAwMjUwMAordm4gLTAuOTk5NzAwIDAuMDIzNzAwIC0wLjAwMjEwMAordm4gLTAuOTk5NzAwIDAuMDIzNjAwIC0wLjAwMjEwMAordm4gLTAuNjcwNzAwIDAuMDEzNzAwIC0wLjc0MTYwMAordm4gLTAuNjcyMzAwIDAuMDE4MTAwIDAuNzQwMDAwCit2biAtMC42NzIzMDAgMC4wMTgxMDAgMC43NDAxMDAKK3ZuIDAuMDAwNDAwIC0wLjAwMzAwMCAtMS4wMDAwMDAKK3ZuIC0wLjAwMDQwMCAwLjAwMzAwMCAxLjAwMDAwMAordm4gLTAuOTk5NzAwIDAuMDIzNzAwIC0wLjAwMjAwMAordm4gLTEuMDAwMDAwIC0wLjAwNjIwMCAtMC4wMDIwMDAKK3ZuIC0wLjY3MDkwMCAtMC4wMDU2MDAgLTAuNzQxNjAwCit2biAtMC42NzA5MDAgLTAuMDA1NjAwIC0wLjc0MTUwMAordm4gLTAuNjcyNjAwIC0wLjAwMjgwMCAwLjc0MDAwMAordm4gLTAuNjcyNTAwIC0wLjAwMjgwMCAwLjc0MDEwMAordm4gMC4wMDA0MDAgLTAuMDAxOTAwIC0xLjAwMDAwMAordm4gLTAuMDAwNDAwIDAuMDAxOTAwIDEuMDAwMDAwCit2biAtMC4wMDAyMDAgMC4wMDE5MDAgMS4wMDAwMDAKK3ZuIC0wLjAwMDIwMCAwLjAwMjkwMCAxLjAwMDAwMAordm4gLTAuMDAwMTAwIC0wLjczMjAwMCAwLjY4MTMwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAyNTAwCit2biAwLjAwMDIwMCAtMC43MzU5MDAgLTAuNjc3MTAwCit2biAwLjAwMDIwMCAtMC43MzU4MDAgLTAuNjc3MjAwCit2biAwLjAwMDIwMCAtMC4wMDMwMDAgLTEuMDAwMDAwCit2biAwLjAwMDIwMCAtMC4wMDI5MDAgLTEuMDAwMDAwCit2biAwLjAwMDIwMCAtMC4wMDE5MDAgLTEuMDAwMDAwCit2biAwLjk4MTMwMCAtMC4wMDAxMDAgLTAuMTkyNDAwCit2biAwLjk4MTUwMCAtMC4wMDAwMDAgLTAuMTkxNTAwCit2biAwLjgwMzYwMCAtMC4wMDAxMDAgLTAuNTk1MjAwCit2biAwLjI4MTIwMCAtMC4wMDAyMDAgLTAuOTU5NjAwCit2biAtMC4yODEyMDAgLTAuMDAwMjAwIC0wLjk1OTYwMAordm4gLTAuNzg4NTAwIC0wLjAwMDEwMCAtMC42MTUwMDAKK3ZuIC0wLjkyODYwMCAtMC4wMDAxMDAgLTAuMzcxMTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAwMTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDAxMDAKK3ZuIDAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuOTcxMzAwIDAuMDAwMDAwIDAuMjM3OTAwCit2biAtMC45NzEzMDAgMC4wMDAxMDAgMC4yMzgwMDAKK3ZuIC0wLjczODAwMCAwLjAwMDEwMCAwLjY3NDgwMAordm4gLTAuNzM4MDAwIC0wLjAwMDAwMCAwLjY3NDgwMAordm4gLTAuMjgxMjAwIC0wLjAwMDAwMCAwLjk1OTYwMAordm4gMC4yODExMDAgLTAuMDAwMDAwIDAuOTU5NzAwCit2biAwLjI4MTIwMCAwLjAwMDAwMCAwLjk1OTYwMAordm4gMC43MzgwMDAgMC4wMDAwMDAgMC42NzQ4MDAKK3ZuIDAuOTcxMzAwIDAuMDAwMDAwIDAuMjM4MDAwCit2biAwLjk3MTMwMCAtMC4wMDAwMDAgLTAuMjM3OTAwCit2biAwLjk3MTMwMCAwLjAwMDAwMCAtMC4yMzgwMDAKK3ZuIDAuNzM4MDAwIDAuMDAwMDAwIC0wLjY3NDgwMAordm4gMC4yODEyMDAgLTAuMDAwMDAwIC0wLjk1OTYwMAordm4gMC4yODExMDAgLTAuMDAwMDAwIC0wLjk1OTcwMAordm4gLTAuMjgxMjAwIDAuMDAwMDAwIC0wLjk1OTYwMAordm4gLTAuMjgxMjAwIC0wLjAwMDAwMCAtMC45NTk3MDAKK3ZuIC0wLjczNzkwMCAtMC4wMDAwMDAgLTAuNjc0OTAwCit2biAtMC43MzgwMDAgMC4wMDAxMDAgLTAuNjc0ODAwCit2biAtMC45NzEzMDAgMC4wMDAxMDAgLTAuMjM4MDAwCit2biAtMC45NzEzMDAgMC4wMDAwMDAgLTAuMjM4MDAwCit2biAtMC40NDgyMDAgLTAuODg3MjAwIDAuMTA5ODAwCit2biAtMC40ODc4MDAgLTAuODY4MjAwIDAuMDkwNzAwCit2biAtMC4zMzM4MDAgLTAuODkxOTAwIDAuMzA1MTAwCit2biAtMC4zODQ0MDAgLTAuODcwMjAwIDAuMzA4MTAwCit2biAtMC4xMjg5MDAgLTAuODg4ODAwIDAuNDM5ODAwCit2biAtMC4xNDczMDAgLTAuODc4ODAwIDAuNDUzODAwCit2biAwLjEzNTQwMCAtMC44NzY1MDAgMC40NjE5MDAKK3ZuIDAuMTQyNjAwIC0wLjg4NzAwMCAwLjQzOTEwMAordm4gMC4zNzIxMDAgLTAuODYzNzAwIDAuMzQwMDAwCit2biAwLjM1NjAwMCAtMC44ODk5MDAgMC4yODUzMDAKK3ZuIDAuNDk0NTAwIC0wLjg2MDYwMCAwLjEyMTMwMAordm4gMC40NTUzMDAgLTAuODg2NTAwIDAuMDgyNDAwCit2biAwLjQ5MzMwMCAtMC44NjE0MDAgLTAuMTIwODAwCit2biAwLjQ1NDMwMCAtMC44ODA5MDAgLTAuMTMyNjAwCit2biAwLjM1MTYwMCAtMC44NzkyMDAgLTAuMzIxNDAwCit2biAwLjMzNTUwMCAtMC44ODYyMDAgLTAuMzE5MzAwCit2biAwLjEzMDgwMCAtMC44ODU0MDAgLTAuNDQ2MDAwCit2biAwLjEzMjgwMCAtMC44ODQyMDAgLTAuNDQ3OTAwCit2biAtMC4xMzE0MDAgLTAuODg0MzAwIC0wLjQ0ODEwMAordm4gLTAuMTMyMzAwIC0wLjg4NTEwMCAtMC40NDYyMDAKK3ZuIC0wLjM0MTcwMCAtMC44ODY0MDAgLTAuMzEyMzAwCit2biAtMC4zNDM0MDAgLTAuODgwNDAwIC0wLjMyNzEwMAordm4gLTAuNDYzMDAwIC0wLjg3OTAwMCAtMC4xMTM2MDAKK3ZuIC0wLjQ4MTgwMCAtMC44NjU1MDAgLTAuMTM3MDAwCit2biAwLjkxNjgwMCAtMC4wMDAxMDAgLTAuMzk5NDAwCit2biAtMC45ODEzMDAgLTAuMDAwMDAwIC0wLjE5MjQwMAordm4gLTAuOTgxNTAwIC0wLjAwMDEwMCAtMC4xOTE0MDAKK3ZuIDAuNjg2OTAwIC0wLjcxNzQwMCAtMC4xMTYxMDAKK3ZuIDAuNjE3MjAwIC0wLjc3NzUwMCAtMC4xMjA0MDAKK3ZuIDAuNTI3MTAwIC0wLjczNzcwMCAtMC40MjE4MDAKK3ZuIDAuNjE5MDAwIC0wLjYzNzcwMCAtMC40NTg1MDAKK3ZuIDAuMTg2NTAwIC0wLjcwODYwMCAtMC42ODA1MDAKK3ZuIDAuMjE0NDAwIC0wLjY0NzUwMCAtMC43MzEyMDAKK3ZuIC0wLjIwMjcwMCAtMC42NDE3MDAgLTAuNzM5NzAwCit2biAtMC4xOTkwMDAgLTAuNzA3MjAwIC0wLjY3ODQwMAordm4gLTAuNjAyMjAwIC0wLjYxNTMwMCAtMC41MDg3MDAKK3ZuIC0wLjUzMjEwMCAtMC43MzgwMDAgLTAuNDE1MTAwCit2biAtMC42MDY5MDAgLTAuNzYyMTAwIC0wLjIyNTQwMAordm4gLTAuNjYyNDAwIC0wLjcwMDkwMCAtMC4yNjQ0MDAKK3ZuIDAuNjYyMjAwIC0wLjcwMDQwMCAtMC4yNjYzMDAKK3ZuIDAuNTgzMTAwIC0wLjc3MTcwMCAtMC4yNTM5MDAKK3ZuIC0wLjY1MjMwMCAtMC43NDg0MDAgLTAuMTIwNDAwCit2biAtMC42NzYzMDAgLTAuNzI0ODAwIC0wLjEzMTgwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIC0wLjAwMDIwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAwMjAwCit2biAwLjA2MDEwMCAtMC45OTc0MDAgMC4wNDA0MDAKK3ZuIDAuMDU2MzAwIC0wLjk5NzkwMCAwLjAzMjMwMAordm4gMC4wNTMyMDAgLTAuOTk3MTAwIDAuMDU0NjAwCit2biAwLjAzODAwMCAtMC45OTgwMDAgMC4wNTAzMDAKK3ZuIDAuMTM2MTAwIC0wLjk4ODgwMCAwLjA2MDUwMAordm4gMC4xMTgzMDAgLTAuOTkwNTAwIDAuMDY5NTAwCit2biAwLjA3NjIwMCAtMC45OTEzMDAgMC4xMDc2MDAKK3ZuIDAuMDY1MTAwIC0wLjk4OTgwMCAwLjEyNjcwMAordm4gMC4xOTQzMDAgLTAuOTc2OTAwIDAuMDg5MTAwCit2biAwLjIxMDkwMCAtMC45NzMwMDAgMC4wOTM1MDAKK3ZuIDAuMDkzNTAwIC0wLjk3ODgwMCAwLjE4MjAwMAordm4gMC4wOTM0MDAgLTAuOTc5MjAwIDAuMTgwMjAwCit2biAwLjQwOTQwMCAtMC45MTIzMDAgMC4wMDAwMDAKK3ZuIDAuNDA5NTAwIC0wLjkxMjMwMCAwLjAwMDAwMAordm4gMC4xOTY1MDAgLTAuOTIxNTAwIDAuMzM0OTAwCit2biAwLjE0NDMwMCAtMC45NDkxMDAgMC4yODAxMDAKK3ZuIDEuMDAwMDAwIDAuMDAwNDAwIC0wLjAwMDEwMAordm4gMS4wMDAwMDAgMC4wMDA2MDAgMC4wMDAwMDAKK3ZuIDAuNTAzMjAwIDAuMDAwMjAwIDAuODY0MjAwCit2biAwLjUwMzIwMCAwLjAwMDEwMCAwLjg2NDIwMAordm4gMC44MDUxMDAgLTAuNTkzMjAwIDAuMDAwMDAwCit2biAwLjgwNTAwMCAtMC41OTMzMDAgLTAuMDAwMjAwCit2biAwLjM5NTkwMCAtMC42MTc1MDAgMC42Nzk3MDAKK3ZuIDAuNDAxMTAwIC0wLjYxMDEwMCAwLjY4MzMwMAordm4gMC4yMTg3MDAgLTAuOTc1NzAwIDAuMDExMDAwCit2biAwLjA1NjMwMCAtMC45OTc5MDAgLTAuMDMyNzAwCit2biAwLjA2MDEwMCAtMC45OTc0MDAgLTAuMDQwNDAwCit2biAwLjAzNzkwMCAtMC45OTgwMDAgLTAuMDQ5NjAwCit2biAwLjA1MzIwMCAtMC45OTcwMDAgLTAuMDU2MjAwCit2biAwLjExODMwMCAtMC45OTA1MDAgLTAuMDY5NDAwCit2biAwLjEzMTYwMCAtMC45ODkzMDAgLTAuMDYyNDAwCit2biAwLjA4ODkwMCAtMC45ODgwMDAgLTAuMTI2NDAwCit2biAwLjA2MjMwMCAtMC45OTA3MDAgLTAuMTIxMDAwCit2biAwLjE5MTMwMCAtMC45NzcyMDAgLTAuMDkxODAwCit2biAwLjIzMDMwMCAtMC45Njc4MDAgLTAuMTAxNjAwCit2biAwLjA5NDIwMCAtMC45Nzg2MDAgLTAuMTgyODAwCit2biAwLjA5MzMwMCAtMC45Nzg4MDAgLTAuMTgyMTAwCit2biAwLjE0NTQwMCAtMC45NDgyMDAgLTAuMjgyNDAwCit2biAwLjE5NDkwMCAtMC45MjEyMDAgLTAuMzM2ODAwCit2biAwLjQ5OTEwMCAwLjAwMDIwMCAtMC44NjY1MDAKK3ZuIDAuNDk5NDAwIDAuMDAwMDAwIC0wLjg2NjQwMAordm4gMC4zOTcyMDAgLTAuNjEwNzAwIC0wLjY4NTAwMAordm4gMC4zOTI4MDAgLTAuNjE3MDAwIC0wLjY4MjAwMAordm4gMC4yMzczMDAgLTAuOTcxNDAwIC0wLjAwNjEwMAordm4gLTAuMDU2MzAwIC0wLjk5NzkwMCAwLjAzMjcwMAordm4gLTAuMDYwMTAwIC0wLjk5NzQwMCAwLjA0MDQwMAordm4gLTAuMDM4MDAwIC0wLjk5ODAwMCAwLjA1MDMwMAordm4gLTAuMDUzMTAwIC0wLjk5NzEwMCAwLjA1NDUwMAordm4gLTAuMTE4NDAwIC0wLjk5MDUwMCAwLjA2OTQwMAordm4gLTAuMTIxNTAwIC0wLjk5MDMwMCAwLjA2ODEwMAordm4gLTAuMDg4OTAwIC0wLjk4ODAwMCAwLjEyNjEwMAordm4gLTAuMDYyMzAwIC0wLjk5MDcwMCAwLjEyMTEwMAordm4gLTAuMjgyNjAwIC0wLjk0ODAwMCAwLjE0NjYwMAordm4gLTAuMTk2ODAwIC0wLjk3NjcwMCAwLjA4NjIwMAordm4gLTAuMDk4MjAwIC0wLjk3NjgwMCAwLjE5MDQwMAordm4gLTAuMDkyMDAwIC0wLjk3ODgwMCAwLjE4MjkwMAordm4gLTAuNDA5NTAwIC0wLjkxMjMwMCAwLjAwMDAwMAordm4gLTAuNDA5NDAwIC0wLjkxMjMwMCAwLjAwMDAwMAordm4gLTAuMTQ0NDAwIC0wLjk0NzEwMCAwLjI4NjcwMAordm4gLTAuMTkxODAwIC0wLjkyMDkwMCAwLjMzOTMwMAordm4gLTEuMDAwMDAwIDAuMDAwNDAwIDAuMDAwMDAwCit2biAtMC40OTExMDAgMC4wMDAxMDAgMC44NzExMDAKK3ZuIC0wLjQ5MDgwMCAwLjAwMDIwMCAwLjg3MTMwMAordm4gLTAuODA0OTAwIC0wLjU5MzMwMCAwLjAwMDAwMAordm4gLTAuODA1MDAwIC0wLjU5MzMwMCAwLjAwMDAwMAordm4gLTAuMzg5NDAwIC0wLjYxMjEwMCAwLjY4ODIwMAordm4gLTAuMzg2NzAwIC0wLjYxNjMwMCAwLjY4NjAwMAordm4gLTAuMjg4ODAwIC0wLjk1NzMwMCAwLjAxNDYwMAordm4gLTAuMDYwMTAwIC0wLjk5NzQwMCAtMC4wNDA0MDAKK3ZuIC0wLjA1NjIwMCAtMC45OTc5MDAgLTAuMDMyNzAwCit2biAtMC4wNTMyMDAgLTAuOTk3MTAwIC0wLjA1NDYwMAordm4gLTAuMDM3OTAwIC0wLjk5ODAwMCAtMC4wNTAzMDAKK3ZuIC0wLjEyNTcwMCAtMC45ODk5MDAgLTAuMDY1NTAwCit2biAtMC4xMTg0MDAgLTAuOTkwNTAwIC0wLjA2OTQwMAordm4gLTAuMDc2MTAwIC0wLjk5MTIwMCAtMC4xMDg1MDAKK3ZuIC0wLjA2NTEwMCAtMC45ODk4MDAgLTAuMTI2NDAwCit2biAtMC4xODc1MDAgLTAuOTc3NjAwIC0wLjA5NTYwMAordm4gLTAuMjU3OTAwIC0wLjk1OTUwMCAtMC4xMTM1MDAKK3ZuIC0wLjA5MzIwMCAtMC45Nzg5MDAgLTAuMTgxOTAwCit2biAtMC4wOTQ1MDAgLTAuOTc4NzAwIC0wLjE4MjMwMAordm4gLTAuMTk0OTAwIC0wLjkyMTIwMCAtMC4zMzY4MDAKK3ZuIC0wLjE0NDkwMCAtMC45NDgyMDAgLTAuMjgyNzAwCit2biAtMC40OTk0MDAgMC4wMDAxMDAgLTAuODY2NDAwCit2biAtMC40OTkxMDAgMC4wMDAxMDAgLTAuODY2NTAwCit2biAtMC4zOTI5MDAgLTAuNjE3MTAwIC0wLjY4MTgwMAordm4gLTAuMzk3MzAwIC0wLjYxMDcwMCAtMC42ODUwMDAKK3ZuIC0wLjI3MjcwMCAtMC45NjE5MDAgLTAuMDIxNDAwCit2biAwLjAwMDYwMCAtMS4wMDAwMDAgMC4wMDAwMDAKK3ZuIC0wLjk0MTMwMCAtMC4zMzczMDAgMC4wMTQ3MDAKK3ZuIC0wLjkzODMwMCAtMC4zNDU4MDAgMC4wMDAwMDAKK3ZuIC0wLjkzODIwMCAtMC4zNDYyMDAgLTAuMDAxNDAwCit2biAwLjAwMDYwMCAtMC40NDQ1MDAgLTAuODk1ODAwCit2biAwLjA0OTkwMCAtMC4zMzg5MDAgLTAuOTM5NTAwCit2biAwLjAyMDQwMCAtMC4zMzkwMDAgLTAuOTQwNjAwCit2biAwLjAwMDAwMCAtMC4zMzQzMDAgLTAuOTQyNTAwCit2biAwLjAxOTUwMCAtMC4zMjM3MDAgLTAuOTQ2MDAwCit2biAtMC42NTkwMDAgLTAuNDQ3NDAwIC0wLjYwNDYwMAordm4gLTAuODM5NzAwIC0wLjM3NzkwMCAtMC4zODk5MDAKK3ZuIC0wLjY4NTcwMCAtMC4zNzI1MDAgLTAuNjI1MzAwCit2biAtMC44MTYzMDAgLTAuMzQxNzAwIC0wLjQ2NTcwMAordm4gLTAuOTQ0NjAwIC0wLjMyNzYwMCAwLjAxODEwMAordm4gLTAuOTQyNjAwIC0wLjMzNDAwMCAwLjAwMDAwMAordm4gLTAuOTQwNzAwIC0wLjMzODcwMCAwLjAxODcwMAordm4gLTAuOTQwNDAwIC0wLjMzODcwMCAwLjAzMTEwMAordm4gLTAuOTE2MzAwIC0wLjQwMDUwMCAwLjAwMzcwMAordm4gLTAuMTAxNjAwIC0wLjM0NzMwMCAtMC45MzIyMDAKK3ZuIDAuMDAwMDAwIC0wLjM0MDYwMCAtMC45NDAyMDAKK3ZuIC0wLjAyNDIwMCAtMC4zNTA5MDAgLTAuOTM2MTAwCit2biAwLjEyMjgwMCAtMC4zNTU0MDAgLTAuOTI2NjAwCit2biAwLjkxODQwMCAtMC4zOTM4MDAgMC4wMzgzMDAKK3ZuIDAuOTQwMTAwIC0wLjM0MDkwMCAwLjAwMzYwMAordm4gMC45Mzk5MDAgLTAuMzQxMDAwIDAuMDE4NzAwCit2biAwLjk0MTcwMCAtMC4zMzY0MDAgMC4wMDAwMDAKK3ZuIDAuOTQxNzAwIC0wLjMzNjQwMCAwLjAwMDMwMAordm4gMC45NDM4MDAgLTAuMzMwMDAwIDAuMDE4MTAwCit2biAwLjgxNTcwMCAtMC4zNDM5MDAgLTAuNDY1MjAwCit2biAwLjY4NTMwMCAtMC4zNzQyMDAgLTAuNjI0NzAwCit2biAwLjY4MzcwMCAtMC4zNzQwMDAgLTAuNjI2NzAwCit2biAwLjgxOTMwMCAtMC40Mjg5MDAgLTAuMzgwNTAwCit2biAtMC4wMTk1MDAgLTAuMzIzODAwIC0wLjk0NTkwMAordm4gLTAuMDIwNTAwIC0wLjMzOTAwMCAtMC45NDA2MDAKK3ZuIC0wLjA1NjQwMCAtMC4zMzkwMDAgLTAuOTM5MTAwCit2biAtMC4wMDA2MDAgLTAuNDUzNTAwIC0wLjg5MTIwMAordm4gMC45NDI3MDAgLTAuMzMzNjAwIC0wLjAwMzEwMAordm4gMC45NDI5MDAgLTAuMzMzMjAwIDAuMDAwMDAwCit2biAwLjk0MzEwMCAtMC4zMzI0MDAgMC4wMDEyMDAKK3ZuIDAuOTQyOTAwIC0wLjMzMjkwMCAwLjAwNzMwMAordm4gLTAuMDAwNjAwIC0wLjQwOTcwMCAwLjkxMjIwMAordm4gLTAuMDMzNDAwIC0wLjM0MDUwMCAwLjkzOTcwMAordm4gLTAuMDIwNTAwIC0wLjM0MDIwMCAwLjk0MDEwMAordm4gMC4wMDAwMDAgLTAuMzM1NTAwIDAuOTQyMDAwCit2biAwLjAwMDAwMCAtMC4zMzU2MDAgMC45NDIwMDAKK3ZuIC0wLjAxOTYwMCAtMC4zMjUwMDAgMC45NDU1MDAKK3ZuIDAuNjU4MDAwIC0wLjQ0OTcwMCAwLjYwNDAwMAordm4gMC44Mzk3MDAgLTAuMzc5ODAwIDAuMzg4MDAwCit2biAwLjY4NTYwMCAtMC4zNzQxMDAgMC42MjQ1MDAKK3ZuIDAuODE1NjAwIC0wLjM0MzkwMCAwLjQ2NTMwMAordm4gMC45NDM4MDAgLTAuMzMwMTAwIC0wLjAxODEwMAordm4gMC45NDE3MDAgLTAuMzM2MzAwIC0wLjAwMDIwMAordm4gMC45NDE3MDAgLTAuMzM2MzAwIDAuMDAwMDAwCit2biAwLjkzOTgwMCAtMC4zNDExMDAgLTAuMDE4NzAwCit2biAwLjkzOTUwMCAtMC4zNDExMDAgLTAuMDMxNDAwCit2biAwLjkxNDcwMCAtMC40MDQyMDAgLTAuMDAzNDAwCit2biAwLjA5MTIwMCAtMC4zNDQ1MDAgMC45MzQzMDAKK3ZuIDAuMDAwMDAwIC0wLjMzNzIwMCAwLjk0MTUwMAordm4gMC4wMDAwMDAgLTAuMzM3MzAwIDAuOTQxNDAwCit2biAtMC4wOTIzMDAgLTAuMzQ0MzAwIDAuOTM0MzAwCit2biAtMC45MTk1MDAgLTAuMzkxMzAwIC0wLjAzODAwMAordm4gLTAuOTQxMDAwIC0wLjMzODUwMCAtMC4wMDM0MDAKK3ZuIC0wLjk0MDcwMCAtMC4zMzg3MDAgLTAuMDE4NzAwCit2biAtMC45NDQ2MDAgLTAuMzI3NjAwIC0wLjAxODEwMAordm4gLTAuODE2MjAwIC0wLjM0MTcwMCAwLjQ2NTkwMAordm4gLTAuNjg2MzAwIC0wLjM3MjQwMCAwLjYyNDcwMAordm4gLTAuNjgzNjAwIC0wLjM3MTkwMCAwLjYyODAwMAordm4gLTAuODIwOTAwIC0wLjQyNzIwMCAwLjM3OTAwMAordm4gMC4wMTk2MDAgLTAuMzI0OTAwIDAuOTQ1NTAwCit2biAwLjAyMDUwMCAtMC4zNDAyMDAgMC45NDAxMDAKK3ZuIDAuMDUxOTAwIC0wLjM0MDYwMCAwLjkzODgwMAordm4gMC4wMDA2MDAgLTAuNDQ3NDAwIDAuODk0MzAwCit2biAtMC45NDEyMDAgLTAuMzM3NTAwIDAuMDE2NzAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDExMDAKK3ZuIDAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwMTMwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIC0wLjAwMTkwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAxNTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAxMTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAwOTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDE0MDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAwNjAwCit2biAtMC4wMDA2MDAgLTEuMDAwMDAwIDAuMDAwMDAwCit2biAwLjA1NDQwMCAtMC45OTc5MDAgLTAuMDM0ODAwCit2biAwLjA2MDEwMCAtMC45OTcwMDAgLTAuMDQ4MjAwCit2biAwLjAzODAwMCAtMC45OTgxMDAgLTAuMDQ5MDAwCit2biAwLjAzODcwMCAtMC45OTc4MDAgLTAuMDU0NjAwCit2biAwLjA2MDEwMCAtMC45OTc1MDAgMC4wMzc0MDAKK3ZuIDAuMDQ5NzAwIC0wLjk5ODAwMCAwLjAzOTUwMAordm4gMC4wNDIwMDAgLTAuOTk3NzAwIDAuMDUzOTAwCit2biAwLjAzNjIwMCAtMC45OTgwMDAgMC4wNTEzMDAKK3ZuIC0wLjA1NDUwMCAtMC45OTgwMDAgMC4wMzM1MDAKK3ZuIC0wLjA2MDAwMCAtMC45OTcwMDAgMC4wNDgxMDAKK3ZuIC0wLjAzNzkwMCAtMC45OTgwMDAgMC4wNTAzMDAKK3ZuIC0wLjAzODYwMCAtMC45OTc4MDAgMC4wNTQ2MDAKK3ZuIC0wLjA2MDEwMCAtMC45OTc1MDAgLTAuMDM3NDAwCit2biAtMC4wNDk2MDAgLTAuOTk4MDAwIC0wLjAzODMwMAordm4gLTAuMDQyMDAwIC0wLjk5NzcwMCAtMC4wNTM5MDAKK3ZuIC0wLjAzNjIwMCAtMC45OTc5MDAgLTAuMDUzMDAwCit2biAwLjAwMDAwMCAtMC45MjUwMDAgMC4zODAwMDAKK3ZuIDAuMDAwMDAwIC0wLjkyNTAwMCAwLjM3OTkwMAordm4gMC4wMDAwMDAgLTAuMDAwMTAwIDEuMDAwMDAwCit2biAwLjAwMDAwMCAtMC42Mjc2MDAgMC43Nzg1MDAKK3ZuIDAuMDAwMDAwIC0wLjYyNzcwMCAwLjc3ODQwMAordm4gMC4wMTc2MDAgLTAuOTgzNTAwIDAuMTgwMDAwCit2biAtMC4wMjIzMDAgLTAuOTgyOTAwIDAuMTgyOTAwCit2biAtMC4zNzYwMDAgLTAuOTExODAwIDAuMTY1MTAwCit2biAtMC4zMjI2MDAgLTAuOTMzOTAwIDAuMTUzOTAwCit2biAtMC45MDM5MDAgMC4wMDA0MDAgMC40Mjc3MDAKK3ZuIC0wLjkwNDEwMCAwLjAwMDQwMCAwLjQyNzQwMAordm4gLTAuNzI0NzAwIC0wLjU5NzAwMCAwLjM0NDIwMAordm4gLTAuNzI4NDAwIC0wLjU5MjEwMCAwLjM0NDgwMAordm4gLTAuMzIyMjAwIC0wLjkzNDEwMCAtMC4xNTM1MDAKK3ZuIC0wLjM3NjEwMCAtMC45MTE3MDAgLTAuMTY1MjAwCit2biAtMC45MDQwMDAgMC4wMDA0MDAgLTAuNDI3NTAwCit2biAtMC45MDQwMDAgMC4wMDAzMDAgLTAuNDI3NjAwCit2biAtMC43Mjg0MDAgLTAuNTkyMTAwIC0wLjM0NDgwMAordm4gLTAuNzI0NzAwIC0wLjU5NzAwMCAtMC4zNDQxMDAKK3ZuIDAuMDAwMDAwIC0wLjkyNTEwMCAtMC4zNzk4MDAKK3ZuIDAuMDAwMDAwIC0wLjkyNTAwMCAtMC4zODAwMDAKK3ZuIDAuMDAwMDAwIC0wLjAwMDEwMCAtMS4wMDAwMDAKK3ZuIDAuMDAwMDAwIC0wLjYyNzcwMCAtMC43Nzg0MDAKK3ZuIDAuMDAwMDAwIC0wLjYyNzYwMCAtMC43Nzg1MDAKK3ZuIDAuMDE1NTAwIC0wLjk4MzgwMCAtMC4xNzg2MDAKK3ZuIC0wLjAxNTMwMCAtMC45ODQwMDAgLTAuMTc3NjAwCit2biAwLjMyMjMwMCAtMC45MzQwMDAgMC4xNTQyMDAKK3ZuIDAuMzc1NDAwIC0wLjkxMjAwMCAwLjE2NTUwMAordm4gMC45MDMyMDAgMC4wMDA0MDAgMC40MjkyMDAKK3ZuIDAuOTAzMjAwIDAuMDAwNTAwIDAuNDI5MjAwCit2biAwLjcyNzkwMCAtMC41OTIwMDAgMC4zNDU5MDAKK3ZuIDAuNzIzODAwIC0wLjU5NzEwMCAwLjM0NTgwMAordm4gMC4zNzU1MDAgLTAuOTExOTAwIC0wLjE2NTYwMAordm4gMC4zMjE5MDAgLTAuOTM0MjAwIC0wLjE1MzkwMAordm4gMC45MDMxMDAgMC4wMDA0MDAgLTAuNDI5NDAwCit2biAwLjkwMzMwMCAwLjAwMDQwMCAtMC40MjkxMDAKK3ZuIDAuNzIzODAwIC0wLjU5NzEwMCAtMC4zNDU5MDAKK3ZuIDAuNzI4MDAwIC0wLjU5MjAwMCAtMC4zNDU3MDAKK3ZuIDAuMDAwMDAwIC0wLjk4MTQwMCAwLjE5MjEwMAordm4gMC4wMDQ4MDAgLTAuOTgyMzAwIDAuMTg3MjAwCit2biAwLjI0NzMwMCAtMC45Njg5MDAgMC4wMDkyMDAKK3ZuIDAuMjI3MDAwIC0wLjk3MzkwMCAwLjAwMDAwMAordm4gLTAuMjkwNzAwIC0wLjk1NjgwMCAwLjAwMDAwMAordm4gLTAuMzAzOTAwIC0wLjk1MjcwMCAtMC4wMDU2MDAKK3ZuIDAuMDAwMDAwIC0wLjk4MjkwMCAtMC4xODQyMDAKK3ZuIC0wLjAwMDAwMCAtMC45ODI4MDAgLTAuMTg0NjAwCit2biAtMC45NzEzMDAgMC4wMDAwMDAgMC4yMzgwMDAKK3ZuIC0wLjI4MTIwMCAtMC4wMDAxMDAgMC45NTk3MDAKK3ZuIDAuNzM3OTAwIC0wLjAwMDAwMCAtMC42NzQ5MDAKK3ZuIDAuMjgxMzAwIC0wLjAwMDAwMCAtMC45NTk2MDAKK3ZuIC0wLjk3MTMwMCAwLjAwMDAwMCAtMC4yMzc5MDAKK3ZuIC0wLjM4NDUwMCAtMC44NzAyMDAgMC4zMDgxMDAKK3ZuIDAuMTM1NDAwIC0wLjg3NjUwMCAwLjQ2MjAwMAordm4gMC4zNTU5MDAgLTAuODg5OTAwIDAuMjg1NDAwCit2biAwLjQ5NDYwMCAtMC44NjA3MDAgMC4xMjEwMDAKK3ZuIDAuNDU1MzAwIC0wLjg4NjUwMCAwLjA4MjUwMAordm4gMC40OTMzMDAgLTAuODYxNTAwIC0wLjEyMDgwMAordm4gMC40NTQzMDAgLTAuODgwOTAwIC0wLjEzMjUwMAordm4gMC4zNTE2MDAgLTAuODc5MzAwIC0wLjMyMTMwMAordm4gMC4zMzU1MDAgLTAuODg2MjAwIC0wLjMxOTYwMAordm4gMC4xMzA3MDAgLTAuODg1MzAwIC0wLjQ0NjIwMAordm4gMC4xMzI4MDAgLTAuODg0MjAwIC0wLjQ0NzgwMAordm4gLTAuMTMxNDAwIC0wLjg4NDIwMCAtMC40NDgzMDAKK3ZuIC0wLjM0MTcwMCAtMC44ODY1MDAgLTAuMzEyMTAwCit2biAtMC4zNDM0MDAgLTAuODgwNDAwIC0wLjMyNjkwMAordm4gLTAuNDYzMDAwIC0wLjg3OTEwMCAtMC4xMTMzMDAKK3ZuIC0wLjQ4MTcwMCAtMC44NjU1MDAgLTAuMTM3MjAwCit2biAwLjUyNzEwMCAtMC43Mzc2MDAgLTAuNDIyMTAwCit2biAwLjYxOTEwMCAtMC42Mzc4MDAgLTAuNDU4MjAwCit2biAwLjIxNDQwMCAtMC42NDc2MDAgLTAuNzMxMjAwCit2biAtMC4yMDI3MDAgLTAuNjQxODAwIC0wLjczOTYwMAordm4gLTAuMTk5MDAwIC0wLjcwNzIwMCAtMC42Nzg1MDAKK3ZuIC0wLjUzMjIwMCAtMC43MzgxMDAgLTAuNDE0NzAwCit2biAtMC42MDY5MDAgLTAuNzYyMjAwIC0wLjIyNTMwMAordm4gLTAuNjYyNDAwIC0wLjcwMDkwMCAtMC4yNjQ2MDAKK3ZuIDAuNjYyMTAwIC0wLjcwMDQwMCAtMC4yNjY0MDAKK3ZuIC0wLjY1MjMwMCAtMC43NDg0MDAgLTAuMTIwMzAwCit2biAtMC42NzYzMDAgLTAuNzI0NzAwIC0wLjEzMTkwMAordm4gMC4wNjAxMDAgLTAuOTk3NDAwIDAuMDM4OTAwCit2biAwLjA1MzEwMCAtMC45OTcwMDAgMC4wNTYxMDAKK3ZuIDAuMDM4MDAwIC0wLjk5ODEwMCAwLjA0OTAwMAordm4gMC4xMzYxMDAgLTAuOTg4ODAwIDAuMDYwNzAwCit2biAwLjExODMwMCAtMC45OTA2MDAgMC4wNjkzMDAKK3ZuIDAuMDc2MjAwIC0wLjk5MTIwMCAwLjEwODEwMAordm4gMC4xOTQzMDAgLTAuOTc2OTAwIDAuMDg4NjAwCit2biAwLjA5MzUwMCAtMC45NzkwMDAgMC4xODExMDAKK3ZuIDAuMDkzMzAwIC0wLjk3OTAwMCAwLjE4MTMwMAordm4gMC4xOTY0MDAgLTAuOTIxMzAwIDAuMzM1NzAwCit2biAwLjE0NDQwMCAtMC45NDkyMDAgMC4yNzk1MDAKK3ZuIDAuNTAzNTAwIDAuMDAwMjAwIDAuODY0MDAwCit2biAwLjUwMjkwMCAwLjAwMDAwMCAwLjg2NDMwMAordm4gMC4yMTg4MDAgLTAuOTc1NzAwIDAuMDExMDAwCit2biAwLjA2MDEwMCAtMC45OTc0MDAgLTAuMDM4OTAwCit2biAwLjAzNzkwMCAtMC45OTgwMDAgLTAuMDUwMzAwCit2biAwLjA1MzIwMCAtMC45OTcxMDAgLTAuMDU0NjAwCit2biAwLjA2MjMwMCAtMC45OTA3MDAgLTAuMTIxMTAwCit2biAwLjE5MTMwMCAtMC45NzcyMDAgLTAuMDkxOTAwCit2biAwLjIzMDIwMCAtMC45Njc4MDAgLTAuMTAxNTAwCit2biAwLjA5NDIwMCAtMC45Nzg4MDAgLTAuMTgyMDAwCit2biAwLjE0NTQwMCAtMC45NDgxMDAgLTAuMjgyOTAwCit2biAwLjE5NDkwMCAtMC45MjE0MDAgLTAuMzM2MzAwCit2biAwLjQ5OTQwMCAwLjAwMDEwMCAtMC44NjY0MDAKK3ZuIDAuMzk3MTAwIC0wLjYxMDYwMCAtMC42ODUyMDAKK3ZuIDAuMzkyOTAwIC0wLjYxNzAwMCAtMC42ODE5MDAKK3ZuIDAuMjM3NDAwIC0wLjk3MTQwMCAtMC4wMDYxMDAKK3ZuIC0wLjA2MDEwMCAtMC45OTc0MDAgMC4wMzg5MDAKK3ZuIC0wLjAzODAwMCAtMC45OTgwMDAgMC4wNDk3MDAKK3ZuIC0wLjA1MzIwMCAtMC45OTcxMDAgMC4wNTQ2MDAKK3ZuIC0wLjE5NjgwMCAtMC45NzY2MDAgMC4wODY2MDAKK3ZuIC0wLjA5ODIwMCAtMC45NzY3MDAgMC4xOTA5MDAKK3ZuIC0wLjA5MjAwMCAtMC45Nzg5MDAgMC4xODI0MDAKK3ZuIC0wLjE0NDQwMCAtMC45NDcxMDAgMC4yODY1MDAKK3ZuIC0wLjE5MTgwMCAtMC45MjA4MDAgMC4zMzk1MDAKK3ZuIC0wLjM4OTQwMCAtMC42MTIxMDAgMC42ODgzMDAKK3ZuIC0wLjM4NjcwMCAtMC42MTY0MDAgMC42ODU5MDAKK3ZuIC0wLjI4ODgwMCAtMC45NTczMDAgMC4wMTU5MDAKK3ZuIC0wLjA2MDEwMCAtMC45OTc0MDAgLTAuMDM4OTAwCit2biAtMC4xMjU3MDAgLTAuOTg5OTAwIC0wLjA2NTgwMAordm4gLTAuMTE4NDAwIC0wLjk5MDUwMCAtMC4wNjk3MDAKK3ZuIC0wLjA3NjIwMCAtMC45OTEyMDAgLTAuMTA4MTAwCit2biAtMC4wNjUxMDAgLTAuOTg5OTAwIC0wLjEyNjMwMAordm4gLTAuMTg3NTAwIC0wLjk3NzcwMCAtMC4wOTUxMDAKK3ZuIC0wLjA5MzIwMCAtMC45NzkwMDAgLTAuMTgxMTAwCit2biAtMC4wOTQ0MDAgLTAuOTc4NTAwIC0wLjE4MzQwMAordm4gLTAuMTk0OTAwIC0wLjkyMTQwMCAtMC4zMzYxMDAKK3ZuIC0wLjQ5OTcwMCAwLjAwMDIwMCAtMC44NjYyMDAKK3ZuIC0wLjQ5ODkwMCAwLjAwMDEwMCAtMC44NjY3MDAKK3ZuIC0wLjM5MzAwMCAtMC42MTczMDAgLTAuNjgxNTAwCit2biAtMC4zOTcxMDAgLTAuNjEwNTAwIC0wLjY4NTMwMAordm4gMC4wMDA2MDAgLTAuNDQ0ODAwIC0wLjg5NTYwMAordm4gMC4wNDk4MDAgLTAuMzM4ODAwIC0wLjkzOTUwMAordm4gMC4wMDAwMDAgLTAuMzM0MjAwIC0wLjk0MjUwMAordm4gLTAuMDAwMTAwIC0wLjMzNDMwMCAtMC45NDI1MDAKK3ZuIDAuMDE5NTAwIC0wLjMyMzYwMCAtMC45NDYwMDAKK3ZuIC0wLjY1OTAwMCAtMC40NDc1MDAgLTAuNjA0NjAwCit2biAtMC42ODU3MDAgLTAuMzcyNDAwIC0wLjYyNTQwMAordm4gLTAuODE2MzAwIC0wLjM0MTgwMCAtMC40NjU3MDAKK3ZuIC0wLjk0MDQwMCAtMC4zMzg3MDAgMC4wMzEwMDAKK3ZuIC0wLjkxNjMwMCAtMC40MDA1MDAgMC4wMDM2MDAKK3ZuIDAuMDAwMDAwIC0wLjM0MDUwMCAtMC45NDAyMDAKK3ZuIDAuOTM5OTAwIC0wLjM0MTEwMCAwLjAxODcwMAordm4gMC44MTkzMDAgLTAuNDI4OTAwIC0wLjM4MDQwMAordm4gLTAuMDIwNDAwIC0wLjMzODkwMCAtMC45NDA2MDAKK3ZuIC0wLjA1NjMwMCAtMC4zMzg4MDAgLTAuOTM5MjAwCit2biAwLjk0MjkwMCAtMC4zMzMxMDAgMC4wMDAwMDAKK3ZuIC0wLjAzMzQwMCAtMC4zNDA0MDAgMC45Mzk3MDAKK3ZuIC0wLjAyMDUwMCAtMC4zNDAzMDAgMC45NDAxMDAKK3ZuIDAuMDAwMTAwIC0wLjMzNTUwMCAwLjk0MjAwMAordm4gMC44Mzk3MDAgLTAuMzc5OTAwIDAuMzg4MDAwCit2biAwLjY4NTQwMCAtMC4zNzQxMDAgMC42MjQ3MDAKK3ZuIDAuODE1NjAwIC0wLjM0MzkwMCAwLjQ2NTQwMAordm4gMC45NDM4MDAgLTAuMzMwMDAwIC0wLjAxODEwMAordm4gMC45NDE3MDAgLTAuMzM2NDAwIC0wLjAwMDIwMAordm4gMC45Mzk5MDAgLTAuMzQxMTAwIC0wLjAxODcwMAordm4gMC45MTQ2MDAgLTAuNDA0MzAwIC0wLjAwMzQwMAordm4gMC4wMDAwMDAgLTAuMzM3MjAwIDAuOTQxNDAwCit2biAtMC42ODM1MDAgLTAuMzcxOTAwIDAuNjI4MTAwCit2biAwLjAxOTYwMCAtMC4zMjQ5MDAgMC45NDU2MDAKK3ZuIDAuMDUxOTAwIC0wLjM0MDQwMCAwLjkzODgwMAordm4gMC4wMDA2MDAgLTAuNDQ3NzAwIDAuODk0MjAwCit2biAtMC45NDEyMDAgLTAuMzM3NjAwIDAuMDE2NzAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDEyMDAKK3ZuIDAuMDYwMTAwIC0wLjk5NzAwMCAtMC4wNDk4MDAKK3ZuIC0wLjA1NDUwMCAtMC45OTc5MDAgMC4wMzQ4MDAKK3ZuIC0wLjAzNzkwMCAtMC45OTgxMDAgMC4wNDkwMDAKK3ZuIC0wLjAzODYwMCAtMC45OTc3MDAgMC4wNTY2MDAKK3ZuIC0wLjA0MjAwMCAtMC45OTc2MDAgLTAuMDU1NDAwCit2biAwLjAwMDAwMCAtMC45MjU0MDAgMC4zNzg5MDAKK3ZuIC0wLjM3NjEwMCAtMC45MTE4MDAgMC4xNjQ5MDAKK3ZuIC0wLjkwNDAwMCAwLjAwMDQwMCAwLjQyNzYwMAordm4gLTAuNzI0NjAwIC0wLjU5NzAwMCAwLjM0NDQwMAordm4gLTAuNzI4NTAwIC0wLjU5MjEwMCAwLjM0NDYwMAordm4gLTAuMzIyMzAwIC0wLjkzNDEwMCAtMC4xNTM1MDAKK3ZuIC0wLjM3NjEwMCAtMC45MTE4MDAgLTAuMTY0ODAwCit2biAtMC45MDM4MDAgMC4wMDA0MDAgLTAuNDI3OTAwCit2biAtMC43Mjg0MDAgLTAuNTkyMjAwIC0wLjM0NDYwMAordm4gLTAuNzI0NjAwIC0wLjU5NzAwMCAtMC4zNDQ0MDAKK3ZuIDAuMDAwMDAwIC0wLjkyNTUwMCAtMC4zNzg4MDAKK3ZuIDAuMDAwMDAwIC0wLjYyNzUwMCAtMC43Nzg2MDAKK3ZuIDAuMDAwMDAwIC0wLjYyNzgwMCAtMC43Nzg0MDAKK3ZuIDAuMzIyMzAwIC0wLjkzNDAwMCAwLjE1MzkwMAordm4gMC45MDMyMDAgMC4wMDA2MDAgMC40MjkyMDAKK3ZuIDAuNzIzODAwIC0wLjU5NzEwMCAtMC4zNDU3MDAKK3ZuIDAuNzI4MDAwIC0wLjU5MTkwMCAtMC4zNDU5MDAKK3ZuIC0wLjMwMzkwMCAtMC45NTI3MDAgLTAuMDA2MjAwCit2biAwLjAwMDAwMCAtMC45ODI5MDAgLTAuMTg0MzAwCit2biAwLjA3MDkwMCAtMC45NjIwMDAgMC4yNjM3MDAKK3ZuIDAuMDk4NDAwIC0wLjkzOTMwMCAwLjMyODcwMAordm4gMC4wMDAzMDAgLTAuOTU1NTAwIDAuMjk1MDAwCit2biAwLjAwMDMwMCAtMC45NTU1MDAgMC4yOTQ4MDAKK3ZuIC0wLjk4MzMwMCAtMC4wMDAwMDAgLTAuMTgyMjAwCit2biAtMC4yMTkxMDAgMC4wMDAwMDAgLTAuOTc1NzAwCit2biAtMC4yMTkyMDAgMC4wMDAwMDAgLTAuOTc1NzAwCit2biAtMC4wMDA2MDAgMC4wMDAwMDAgLTEuMDAwMDAwCit2biAtMC4zMjAxMDAgLTAuOTQ0OTAwIC0wLjA2ODYwMAordm4gLTAuMjY1ODAwIC0wLjk2MjcwMCAtMC4wNDk3MDAKK3ZuIC0wLjA2MTYwMCAtMC45NjM0MDAgLTAuMjYwOTAwCit2biAtMC4wODY0MDAgLTAuOTQzMDAwIC0wLjMyMTQwMAordm4gMC4wMDAxMDAgLTAuOTU4ODAwIC0wLjI4NDIwMAordm4gLTAuMDAwMzAwIC0wLjk1ODIwMCAtMC4yODYwMDAKK3ZuIDAuMjI0NDAwIC0wLjk1MTEwMCAwLjIxMjIwMAordm4gMC4yNTg3MDAgLTAuOTMxOTAwIDAuMjU0MzAwCit2biAtMC4yMTQyMDAgLTAuOTUzOTAwIC0wLjIxMDUwMAordm4gLTAuMjM0NzAwIC0wLjk0MjUwMCAtMC4yMzc4MDAKK3ZuIC0wLjE5NDAwMCAtMC40MDEwMDAgLTAuODk1MzAwCit2biAtMC4yMDM1MDAgLTAuMzc1MjAwIC0wLjkwNDMwMAordm4gLTAuMDAwNDAwIC0wLjM2NzYwMCAtMC45MzAwMDAKK3ZuIDAuMDAwMjAwIC0wLjM2OTAwMCAtMC45Mjk0MDAKK3ZuIC0wLjYzMjAwMCAtMC40MzM2MDAgLTAuNjQyMzAwCit2biAtMC42MjkyMDAgLTAuNDM4NTAwIC0wLjY0MTcwMAordm4gLTAuNjk4ODAwIC0wLjAwMDAwMCAtMC43MTUzMDAKK3ZuIC0wLjAwMDAwMCAtMC45NTU1MDAgMC4yOTUwMDAKK3ZuIDAuMDAwMDAwIC0wLjk1ODcwMCAtMC4yODQzMDAKK3ZuIDAuMDAwMDAwIC0wLjk1ODcwMCAtMC4yODQ0MDAKK3ZuIC0wLjAwMDAwMCAtMC4zNjc2MDAgLTAuOTMwMDAwCit2biAtMC4wMDAwMDAgMC4wMDAwMDAgLTEuMDAwMDAwCit2biAtMC44ODAxMDAgLTAuNDQ1NDAwIC0wLjE2NDMwMAordm4gLTAuODc4OTAwIC0wLjQ0ODIwMCAtMC4xNjMzMDAKK3ZuIDAuMjg2ODAwIDAuMDAwMDAwIDAuOTU4MDAwCit2biAwLjI4NjYwMCAwLjAwMDAwMCAwLjk1ODAwMAordm4gMC4wMDA5MDAgMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIDAuNzI2NjAwIDAuMDAwMDAwIDAuNjg3MTAwCit2biAwLjcyNjIwMCAwLjAwMDAwMCAwLjY4NzQwMAordm4gMC45Nzc4MDAgMC4wMDAwMDAgMC4yMDk2MDAKK3ZuIDAuOTc3ODAwIDAuMDAwMDAwIDAuMjA5ODAwCit2biAtMC4wMDAwMDAgMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIC0wLjE2MDAwMCAtMC42NTUxMDAgLTAuNzM4NDAwCit2biAtMC4xOTY1MDAgLTAuNDQzODAwIC0wLjg3NDMwMAordm4gLTAuMTcyOTAwIC0wLjY1ODgwMCAtMC43MzIxMDAKK3ZuIC0wLjEyNzIwMCAtMC44MTQ3MDAgLTAuNTY1NzAwCit2biAtMC4wMDA0MDAgLTAuMzk4MjAwIC0wLjkxNzMwMAordm4gLTAuMDAwNTAwIC0wLjM5NjIwMCAtMC45MTgyMDAKK3ZuIDAuMDAwMjAwIC0wLjgwMjEwMCAtMC41OTcyMDAKK3ZuIDAuMDAwMTAwIC0wLjgwMTcwMCAtMC41OTc3MDAKK3ZuIC0wLjUzNzAwMCAtMC42NDMzMDAgLTAuNTQ1NzAwCit2biAtMC41MDAzMDAgLTAuNjk4NzAwIC0wLjUxMTMwMAordm4gLTAuNTM3NjAwIC0wLjY0MzQwMCAtMC41NDUwMDAKK3ZuIC0wLjUwMDgwMCAtMC42OTg2MDAgLTAuNTExMDAwCit2biAtMC4wMDAwMDAgLTAuMzk2MTAwIC0wLjkxODIwMAordm4gMC4wMDAwMDAgLTAuODAxOTAwIC0wLjU5NzUwMAordm4gMC4wMDAwMDAgLTAuODAxNjAwIC0wLjU5NzgwMAordm4gLTAuNzUxNTAwIC0wLjY0NDgwMCAtMC4xMzk2MDAKK3ZuIC0wLjc1OTYwMCAtMC42MzQ5MDAgLTAuMTQwNzAwCit2biAwLjI4NjcwMCAwLjAwMDAwMCAwLjk1ODAwMAordm4gMC43MjY1MDAgMC4wMDAwMDAgMC42ODcyMDAKK3ZuIDAuMzQ4MTAwIC0wLjkzNDUwMCAwLjA3NDYwMAordm4gMC4zNDg5MDAgLTAuOTM0MjAwIDAuMDc0ODAwCit2biAtMC43NTkzMDAgLTAuNjM1MTAwIC0wLjE0MTgwMAordm4gLTAuNzUxMzAwIC0wLjY0NDgwMCAtMC4xNDA2MDAKK3ZuIDAuOTc3ODAwIDAuMDAwMDAwIDAuMjA5NzAwCit2biAtMC4wOTYzMDAgLTAuOTM4OTAwIDAuMzMwNjAwCit2biAtMC4wNjg4MDAgLTAuOTYyMDAwIDAuMjY0MzAwCit2biAwLjAwMDEwMCAtMC45NTU2MDAgMC4yOTQ3MDAKK3ZuIDAuMDAwMjAwIC0wLjk1NTUwMCAwLjI5NDgwMAordm4gMC45ODM3MDAgLTAuMDAwMDAwIC0wLjE4MDAwMAordm4gMC4yMDk0MDAgMC4wMDAwMDAgLTAuOTc3ODAwCit2biAwLjAwMDYwMCAwLjAwMDAwMCAtMS4wMDAwMDAKK3ZuIDAuMjY1ODAwIC0wLjk2MjgwMCAtMC4wNDkyMDAKK3ZuIDAuMzIwNDAwIC0wLjk0NDgwMCAtMC4wNjgwMDAKK3ZuIDAuMDg0MjAwIC0wLjk0MjUwMCAtMC4zMjMzMDAKK3ZuIDAuMDU5MjAwIC0wLjk2MzcwMCAtMC4yNjAzMDAKK3ZuIC0wLjAwMDEwMCAtMC45NTg3MDAgLTAuMjg0NDAwCit2biAtMC4wMDAxMDAgLTAuOTU4NzAwIC0wLjI4NDMwMAordm4gLTAuMjYzNTAwIC0wLjkyOTEwMCAwLjI1OTcwMAordm4gLTAuMjI0NjAwIC0wLjk1MTEwMCAwLjIxMTkwMAordm4gMC4yMzQ2MDAgLTAuOTQyNTAwIC0wLjIzODIwMAordm4gMC4yMTM5MDAgLTAuOTUzODAwIC0wLjIxMDgwMAordm4gMC4xOTUzMDAgLTAuMzczMzAwIC0wLjkwNjkwMAordm4gMC4xODUyMDAgLTAuNDAxMzAwIC0wLjg5NzAwMAordm4gLTAuMDAwMjAwIC0wLjM2OTAwMCAtMC45Mjk0MDAKK3ZuIDAuMDAwNTAwIC0wLjM2NzYwMCAtMC45MzAwMDAKK3ZuIDAuNjI4NzAwIC0wLjQzODQwMCAtMC42NDIzMDAKK3ZuIDAuNjMxNDAwIC0wLjQzMzYwMCAtMC42NDI5MDAKK3ZuIDAuNjk4MjAwIC0wLjAwMDAwMCAtMC43MTU5MDAKK3ZuIC0wLjAwMDAwMCAtMC45NTU1MDAgMC4yOTQ4MDAKK3ZuIDAuODc5MjAwIC0wLjQ0ODMwMCAtMC4xNjEzMDAKK3ZuIDAuODgwNjAwIC0wLjQ0NTIwMCAtMC4xNjI1MDAKK3ZuIC0wLjI3OTIwMCAwLjAwMDAwMCAwLjk2MDIwMAordm4gLTAuMjc5NTAwIDAuMDAwMDAwIDAuOTYwMTAwCit2biAwLjAwMDUwMCAwLjAwMDAwMCAxLjAwMDAwMAordm4gLTAuNzI3MDAwIDAuMDAwMDAwIDAuNjg2NjAwCit2biAtMC43MjcyMDAgMC4wMDAwMDAgMC42ODY0MDAKK3ZuIC0wLjk3ODMwMCAwLjAwMDEwMCAwLjIwNzEwMAordm4gLTAuOTc4MzAwIDAuMDAwMDAwIDAuMjA3MTAwCit2biAwLjE4NzkwMCAtMC40NDIwMDAgLTAuODc3MTAwCit2biAwLjE1MzEwMCAtMC42NTM0MDAgLTAuNzQxNDAwCit2biAwLjExOTQwMCAtMC44MjM1MDAgLTAuNTU0NjAwCit2biAwLjE2NzEwMCAtMC42NTc1MDAgLTAuNzM0NzAwCit2biAwLjAwMDUwMCAtMC4zOTYxMDAgLTAuOTE4MjAwCit2biAwLjAwMDUwMCAtMC4zOTc5MDAgLTAuOTE3NDAwCit2biAtMC4wMDAyMDAgLTAuODAxNzAwIC0wLjU5NzcwMAordm4gLTAuMDAwMjAwIC0wLjgwMjMwMCAtMC41OTY5MDAKK3ZuIDAuNDk5NzAwIC0wLjY5ODcwMCAtMC41MTIwMDAKK3ZuIDAuNTM2OTAwIC0wLjY0MzMwMCAtMC41NDU5MDAKK3ZuIDAuNTAwNDAwIC0wLjY5ODYwMCAtMC41MTE1MDAKK3ZuIDAuNTM3MjAwIC0wLjY0MzMwMCAtMC41NDU1MDAKK3ZuIDAuMDAwMDAwIC0wLjM5NTgwMCAtMC45MTgzMDAKK3ZuIDAuMDAwMDAwIC0wLjM5NjIwMCAtMC45MTgyMDAKK3ZuIDAuMDAwMDAwIC0wLjgwMjAwMCAtMC41OTczMDAKK3ZuIDAuNzYwMzAwIC0wLjYzNDUwMCAtMC4xMzkxMDAKK3ZuIDAuNzUxNjAwIC0wLjY0NTAwMCAtMC4xMzc4MDAKK3ZuIC0wLjI3OTUwMCAwLjAwMDAwMCAwLjk2MDIwMAordm4gLTAuNzI3MjAwIDAuMDAwMDAwIDAuNjg2NTAwCit2biAtMC4zNDcwMDAgLTAuOTM1MDAwIDAuMDczNTAwCit2biAtMC4zNDgyMDAgLTAuOTM0NTAwIDAuMDczODAwCit2biAwLjc1MTUwMCAtMC42NDQ5MDAgLTAuMTM5MDAwCit2biAwLjc1OTgwMCAtMC42MzQ4MDAgLTAuMTQwMTAwCit2biAwLjEyNTkwMCAtMC45NDQyMDAgLTAuMzA0NDAwCit2biAwLjA5NjgwMCAtMC45NjMwMDAgLTAuMjUxNjAwCit2biAwLjAwMDIwMCAtMC45NTYxMDAgLTAuMjkzMDAwCit2biAtMC4wMDAxMDAgLTAuOTU1NTAwIC0wLjI5NTAwMAordm4gLTAuOTkxNDAwIC0wLjAwMDAwMCAwLjEzMDkwMAordm4gLTAuOTkxNDAwIC0wLjAwMDAwMCAwLjEzMTAwMAordm4gLTAuMzI3MzAwIDAuMDAwMDAwIDAuOTQ0OTAwCit2biAtMC4wMDA0MDAgMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIC0wLjI2NjAwMCAtMC45NjMzMDAgMC4wMzY1MDAKK3ZuIC0wLjMyNjkwMCAtMC45NDM1MDAgMC4wNTQwMDAKK3ZuIC0wLjExNDYwMCAtMC45NDc3MDAgMC4yOTc5MDAKK3ZuIC0wLjA4ODQwMCAtMC45NjQzMDAgMC4yNDk2MDAKK3ZuIC0wLjAwMDIwMCAtMC45NTgyMDAgMC4yODYwMDAKK3ZuIDAuMDAwMTAwIC0wLjk1ODcwMCAwLjI4NDMwMAordm4gMC4yODQ4MDAgLTAuOTM3NzAwIC0wLjE5OTAwMAordm4gMC4yNjAxMDAgLTAuOTQ5MzAwIC0wLjE3NjcwMAordm4gLTAuMjYyMjAwIC0wLjk0NjkwMCAwLjE4NjEwMAordm4gLTAuMjUxNjAwIC0wLjk1MTcwMCAwLjE3NTcwMAordm4gLTAuMjk4NTAwIC0wLjM5NTcwMCAwLjg2ODUwMAordm4gLTAuMjkxMTAwIC0wLjQxMzUwMCAwLjg2MjcwMAordm4gMC4wMDAyMDAgLTAuMzY5MDAwIDAuOTI5NDAwCit2biAtMC4wMDAzMDAgLTAuMzY3NjAwIDAuOTMwMDAwCit2biAtMC43MjU0MDAgLTAuNDU0NTAwIDAuNTE2OTAwCit2biAtMC43NDEwMDAgLTAuNDI4NzAwIDAuNTE2OTAwCit2biAtMC44MTg4MDAgLTAuMDAwMDAwIDAuNTc0MDAwCit2biAwLjAwMDAwMCAtMC45NTU1MDAgLTAuMjk1MTAwCit2biAwLjAwMDAwMCAtMC45NTU1MDAgLTAuMjk1MDAwCit2biAtMC4wMDAwMDAgLTAuOTU4NzAwIDAuMjg0NDAwCit2biAtMC4wMDAwMDAgLTAuOTU4NzAwIDAuMjg0MzAwCit2biAtMC4wMDAwMDAgLTAuMzY3NjAwIDAuOTMwMDAwCit2biAtMC44ODQ3MDAgLTAuNDUxMTAwIDAuMTE3NjAwCit2biAtMC44ODk3MDAgLTAuNDQwMTAwIDAuMTIxNDAwCit2biAwLjM4MjIwMCAwLjAwMDAwMCAtMC45MjQxMDAKK3ZuIC0wLjAwMDIwMCAwLjAwMDAwMCAtMS4wMDAwMDAKK3ZuIDAuODI2OTAwIDAuMDAwMDAwIC0wLjU2MjQwMAordm4gMC44MjcyMDAgMC4wMDAwMDAgLTAuNTYxOTAwCit2biAwLjk4NjkwMCAwLjAwMDAwMCAtMC4xNjE1MDAKK3ZuIDAuOTg2OTAwIDAuMDAwMDAwIC0wLjE2MTQwMAordm4gLTAuMjkwOTAwIC0wLjQ1OTYwMCAwLjgzOTEwMAordm4gLTAuMjM2MTAwIC0wLjY3NDEwMCAwLjY5OTgwMAordm4gLTAuMTkwOTAwIC0wLjgwODkwMCAwLjU1NjEwMAordm4gLTAuMjQ1OTAwIC0wLjY3NjUwMCAwLjY5NDIwMAordm4gLTAuMDAwNDAwIC0wLjM5NjIwMCAwLjkxODIwMAordm4gLTAuMDAwMzAwIC0wLjM5NzgwMCAwLjkxNzUwMAordm4gMC4wMDAxMDAgLTAuODAxODAwIDAuNTk3NzAwCit2biAwLjAwMDEwMCAtMC44MDIyMDAgMC41OTcwMDAKK3ZuIC0wLjU5NTMwMCAtMC42ODcyMDAgMC40MTY0MDAKK3ZuIC0wLjYxOTIwMCAtMC42NTU3MDAgMC40MzIwMDAKK3ZuIC0wLjU5MTEwMCAtMC42ODc5MDAgMC40MjEyMDAKK3ZuIC0wLjYxNTkwMCAtMC42NTU2MDAgMC40MzY5MDAKK3ZuIC0wLjAwMDAwMCAtMC4zOTYxMDAgMC45MTgyMDAKK3ZuIC0wLjAwMDAwMCAtMC4zOTYwMDAgMC45MTgzMDAKK3ZuIC0wLjAwMDAwMCAtMC44MDE2MDAgMC41OTc5MDAKK3ZuIC0wLjAwMDAwMCAtMC44MDE4MDAgMC41OTc2MDAKK3ZuIC0wLjc3MjAwMCAtMC42Mjc0MDAgMC4xMDE5MDAKK3ZuIC0wLjc1NTEwMCAtMC42NDc5MDAgMC4xMDAzMDAKK3ZuIDAuMzgyMzAwIDAuMDAwMDAwIC0wLjkyNDAwMAordm4gMC4zODIxMDAgLTAuMDAwMDAwIC0wLjkyNDEwMAordm4gMC44MjcwMDAgMC4wMDAwMDAgLTAuNTYyMjAwCit2biAwLjM0MzEwMCAtMC45Mzc2MDAgLTAuMDU2MTAwCit2biAwLjM0ODUwMCAtMC45MzU1MDAgLTAuMDU3NjAwCit2biAtMC43NTQ4MDAgLTAuNjQ3ODAwIDAuMTAzNzAwCit2biAtMC43NzEwMDAgLTAuNjI4MTAwIDAuMTA1MjAwCit2biAtMC4wOTU3MDAgLTAuOTYzMzAwIC0wLjI1MDYwMAordm4gLTAuMTI1NjAwIC0wLjk0NDEwMCAtMC4zMDQ3MDAKK3ZuIDAuMDAwMTAwIC0wLjk1NTUwMCAtMC4yOTUwMDAKK3ZuIC0wLjAwMDIwMCAtMC45NTYxMDAgLTAuMjkyOTAwCit2biAwLjk5MTUwMCAwLjAwMDAwMCAwLjEzMDMwMAordm4gMC45OTE1MDAgLTAuMDAwMDAwIDAuMTMwMjAwCit2biAwLjMyMzcwMCAwLjAwMDAwMCAwLjk0NjIwMAordm4gMC4wMDA0MDAgMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIDAuMzI2OTAwIC0wLjk0MzUwMCAwLjA1MzkwMAordm4gMC4yNjYwMDAgLTAuOTYzMzAwIDAuMDM2NDAwCit2biAwLjA4NzkwMCAtMC45NjQzMDAgMC4yNDk5MDAKK3ZuIDAuMTE0MTAwIC0wLjk0NzYwMCAwLjI5ODQwMAordm4gLTAuMDAwMTAwIC0wLjk1ODcwMCAwLjI4NDMwMAordm4gMC4wMDAyMDAgLTAuOTU4MjAwIDAuMjg2MTAwCit2biAtMC4yNjE2MDAgLTAuOTQ5MTAwIC0wLjE3NTIwMAordm4gLTAuMjc4NTAwIC0wLjk0MTQwMCAtMC4xOTAyMDAKK3ZuIDAuMjU0MTAwIC0wLjk1MTUwMCAwLjE3MzUwMAordm4gMC4yNjM5MDAgLTAuOTQ3MTAwIDAuMTgyNzAwCit2biAwLjI4NzkwMCAtMC40MTMzMDAgMC44NjM5MDAKK3ZuIDAuMjk1NDAwIC0wLjM5NTEwMCAwLjg2OTkwMAordm4gMC4wMDAzMDAgLTAuMzY3NjAwIDAuOTMwMDAwCit2biAtMC4wMDAyMDAgLTAuMzY5MDAwIDAuOTI5NDAwCit2biAwLjc0NzQwMCAtMC40Mjc5MDAgMC41MDgyMDAKK3ZuIDAuNzMxMTAwIC0wLjQ1NTIwMCAwLjUwODMwMAordm4gMC44MjU3MDAgLTAuMDAwMDAwIDAuNTY0MTAwCit2biAwLjAwMDAwMCAtMC45NTU1MDAgLTAuMjk0OTAwCit2biAwLjg4OTgwMCAtMC40NDAwMDAgMC4xMjA5MDAKK3ZuIDAuODg0NzAwIC0wLjQ1MTIwMCAwLjExNzAwMAordm4gLTAuMzgxMTAwIDAuMDAwMDAwIC0wLjkyNDUwMAordm4gLTAuMzgxMDAwIDAuMDAwMDAwIC0wLjkyNDYwMAordm4gMC4wMDAyMDAgMC4wMDAwMDAgLTEuMDAwMDAwCit2biAtMC44MzA5MDAgMC4wMDAwMDAgLTAuNTU2NTAwCit2biAtMC45ODY3MDAgMC4wMDAwMDAgLTAuMTYyNjAwCit2biAwLjIzMzYwMCAtMC42NzM1MDAgMC43MDEzMDAKK3ZuIDAuMjg3OTAwIC0wLjQ1OTMwMCAwLjg0MDMwMAordm4gMC4yNDQ1MDAgLTAuNjc2MDAwIDAuNjk1MTAwCit2biAwLjE4MTAwMCAtMC44MjYxMDAgMC41MzM2MDAKK3ZuIDAuMDAwMzAwIC0wLjM5ODEwMCAwLjkxNzMwMAordm4gMC4wMDA0MDAgLTAuMzk2MDAwIDAuOTE4MzAwCit2biAtMC4wMDAxMDAgLTAuODAyMTAwIDAuNTk3MTAwCit2biAtMC4wMDAxMDAgLTAuODAxNzAwIDAuNTk3ODAwCit2biAwLjYyNDQwMCAtMC42NTYxMDAgMC40MjM5MDAKK3ZuIDAuNjAxMDAwIC0wLjY4NTkwMCAwLjQxMDMwMAordm4gMC42MjA2MDAgLTAuNjU1ODAwIDAuNDI5ODAwCit2biAwLjU5NjcwMCAtMC42ODY4MDAgMC40MTUwMDAKK3ZuIDAuMDAwMDAwIC0wLjM5NTgwMCAwLjkxODMwMAordm4gLTAuMDAwMDAwIC0wLjgwMTYwMCAwLjU5NzgwMAordm4gLTAuMDAwMDAwIC0wLjgwMTkwMCAwLjU5NzUwMAordm4gMC43NTUxMDAgLTAuNjQ4MDAwIDAuMDk5ODAwCit2biAwLjc3MjMwMCAtMC42MjcxMDAgMC4xMDE0MDAKK3ZuIC0wLjgzMDgwMCAwLjAwMDAwMCAtMC41NTY2MDAKK3ZuIC0wLjM0ODUwMCAtMC45MzU1MDAgLTAuMDU3NTAwCit2biAtMC4zNDgyMDAgLTAuOTM1NzAwIC0wLjA1NzQwMAordm4gMC43NzEyMDAgLTAuNjI3OTAwIDAuMTA0ODAwCit2biAwLjc1NDgwMCAtMC42NDc4MDAgMC4xMDMxMDAKK3ZuIC0wLjk4NjcwMCAwLjAwMDAwMCAtMC4xNjI3MDAKK3ZuIDAuMDgwNDAwIC0wLjk5NTkwMCAtMC4wNDE5MDAKK3ZuIDAuMDgxMzAwIC0wLjk5NTgwMCAtMC4wNDIwMDAKK3ZuIDAuODc2ODAwIC0wLjE0NzQwMCAtMC40NTc3MDAKK3ZuIDAuODc2ODAwIC0wLjE0NzIwMCAtMC40NTc3MDAKK3ZuIC0wLjExNjkwMCAtMC45OTI3MDAgMC4wMjgzMDAKK3ZuIC0wLjE3NTkwMCAtMC45ODAxMDAgMC4wOTIxMDAKK3ZuIDAuNzUxOTAwIC0wLjUzMjgwMCAtMC4zODgzMDAKK3ZuIDAuNzUzOTAwIC0wLjUyNTUwMCAtMC4zOTQzMDAKK3ZuIDAuODg0NDAwIDAuMDUzNzAwIC0wLjQ2MzYwMAordm4gMC44ODQ0MDAgMC4wNTM3MDAgLTAuNDYzNzAwCit2biAwLjg0NTEwMCAwLjI5NTQwMCAtMC40NDU1MDAKK3ZuIDAuODQ1MTAwIDAuMjk1MzAwIC0wLjQ0NTYwMAordm4gMC44Nzc4MDAgMC4xMzAzMDAgLTAuNDYxMDAwCit2biAwLjg4NTUwMCAwLjAyMzYwMCAtMC40NjQwMDAKK3ZuIDAuODgyODAwIC0wLjA4NzcwMCAtMC40NjE0MDAKK3ZuIDAuODgyOTAwIC0wLjA4NzcwMCAtMC40NjE0MDAKK3ZuIC0wLjE4MzkwMCAwLjk2OTEwMCAwLjE2NDUwMAordm4gLTAuMTgzNDAwIDAuOTY5NjAwIDAuMTYyMTAwCit2biAwLjA4MjEwMCAtMC45OTU3MDAgLTAuMDQzMjAwCit2biAwLjA4MjEwMCAtMC45OTU3MDAgLTAuMDQyNTAwCit2biAwLjA4MDUwMCAtMC45OTU5MDAgLTAuMDQxMDAwCit2biAwLjA4MDYwMCAtMC45OTU5MDAgLTAuMDQyMzAwCit2biAwLjg3NzEwMCAtMC4xNDczMDAgLTAuNDU3MjAwCit2biAwLjg3NzQwMCAtMC4xNDczMDAgLTAuNDU2NjAwCit2biAwLjg3NzEwMCAtMC4xNDc0MDAgLTAuNDU3MjAwCit2biAtMC4xNzY0MDAgLTAuOTgwMTAwIDAuMDkxNTAwCit2biAtMC4xNzYwMDAgLTAuOTgwMTAwIDAuMDkyMzAwCit2biAtMC4xNzU3MDAgLTAuOTgwMDAwIDAuMDkzNDAwCit2biAtMC4xNzYxMDAgLTAuOTgwMTAwIDAuMDkxOTAwCit2biAwLjc0NTEwMCAtMC41NDEyMDAgLTAuMzg5ODAwCit2biAwLjc0ODQwMCAtMC41NDAzMDAgLTAuMzg0NzAwCit2biAwLjc1NjIwMCAtMC41MjQ4MDAgLTAuMzkwODAwCit2biAwLjc1NDMwMCAtMC41MjU1MDAgLTAuMzkzNjAwCit2biAwLjg4NDYwMCAwLjA1MzcwMCAtMC40NjMyMDAKK3ZuIDAuODg0ODAwIDAuMDUzNzAwIC0wLjQ2MzAwMAordm4gMC44ODQ2MDAgMC4wNTM2MDAgLTAuNDYzMzAwCit2biAwLjg4NDgwMCAwLjA1MzcwMCAtMC40NjI5MDAKK3ZuIDAuODQ1MzAwIDAuMjk1MjAwIC0wLjQ0NTIwMAordm4gMC44NDU0MDAgMC4yOTUyMDAgLTAuNDQ1MjAwCit2biAwLjg0NTYwMCAwLjI5NTMwMCAtMC40NDQ3MDAKK3ZuIDAuODQ1OTAwIDAuMjk1NDAwIC0wLjQ0NDIwMAordm4gMC44NzgxMDAgMC4xMzA0MDAgLTAuNDYwNDAwCit2biAwLjg3NzUwMCAwLjEzMDMwMCAtMC40NjE1MDAKK3ZuIDAuODc4MDAwIDAuMTMwMzAwIC0wLjQ2MDYwMAordm4gMC44Nzg2MDAgMC4xMzA3MDAgLTAuNDU5NDAwCit2biAwLjg4NTMwMCAwLjAyMzYwMCAtMC40NjQ0MDAKK3ZuIDAuODg1ODAwIDAuMDIzNjAwIC0wLjQ2MzQwMAordm4gMC44ODU5MDAgMC4wMjM3MDAgLTAuNDYzNDAwCit2biAwLjg4MzEwMCAtMC4wODc3MDAgLTAuNDYwOTAwCit2biAwLjg4MzAwMCAtMC4wODc3MDAgLTAuNDYxMTAwCit2biAwLjg4MzEwMCAtMC4wODc3MDAgLTAuNDYxMDAwCit2biAtMC4yMTE4MDAgMC45NzExMDAgMC4xMTA0MDAKK3ZuIC0wLjIxMTcwMCAwLjk3MTEwMCAwLjExMDMwMAordm4gLTAuMjExNDAwIDAuOTcxMjAwIDAuMTA5ODAwCit2biAtMC4yMTExMDAgMC45NzEwMDAgMC4xMTIzMDAKK3ZuIDAuMDgxOTAwIC0wLjk5NTcwMCAtMC4wNDI4MDAKK3ZuIDAuODc2OTAwIC0wLjE0NzMwMCAtMC40NTc2MDAKK3ZuIDAuODc2ODAwIC0wLjE0NzMwMCAtMC40NTc3MDAKK3ZuIC0wLjE1MjgwMCAtMC45Nzg3MDAgMC4xMzY4MDAKK3ZuIC0wLjEwMzQwMCAtMC45OTMyMDAgMC4wNTQzMDAKK3ZuIDAuNzQ3NjAwIC0wLjU0MDIwMCAtMC4zODYzMDAKK3ZuIDAuNzQ5ODAwIC0wLjUzMjgwMCAtMC4zOTIzMDAKK3ZuIDAuODg0NDAwIDAuMDUzNjAwIC0wLjQ2MzYwMAordm4gMC44NDUyMDAgMC4yOTUzMDAgLTAuNDQ1NDAwCit2biAwLjg0NTIwMCAwLjI5NTIwMCAtMC40NDU2MDAKK3ZuIDAuODc3ODAwIDAuMTMwNDAwIC0wLjQ2MTAwMAordm4gMC44Nzc4MDAgMC4xMzAzMDAgLTAuNDYwOTAwCit2biAwLjg4NTYwMCAwLjAyMzYwMCAtMC40NjM5MDAKK3ZuIC0wLjIzOTUwMCAwLjk2OTIwMCAwLjA1NjcwMAordm4gLTAuMjM5NTAwIDAuOTY5MjAwIDAuMDU3OTAwCit2biAtMC4wODE5MDAgLTAuOTk1ODAwIDAuMDQxMTAwCit2biAtMC4wODE3MDAgLTAuOTk1ODAwIDAuMDQxMjAwCit2biAtMC43NDg3MDAgLTAuMTQzMTAwIDAuNjQ3MzAwCit2biAtMC43NDg4MDAgLTAuMTQzMDAwIDAuNjQ3MjAwCit2biAwLjA5OTcwMCAtMC45OTUwMDAgLTAuMDA4MjAwCit2biAwLjE3NzMwMCAtMC45ODAxMDAgLTAuMDg5NjAwCit2biAtMC42Mzc4MDAgLTAuNzU2NjAwIDAuMTQ0NTAwCit2biAtMC43NTk3MDAgLTAuNTI1MjAwIDAuMzgzNTAwCit2biAtMC43NTQ0MDAgMC4wNTIwMDAgMC42NTQ0MDAKK3ZuIC0wLjc1NDMwMCAwLjA1MjAwMCAwLjY1NDQwMAordm4gLTAuNzIyMzAwIDAuMjg3MDAwIDAuNjI5MzAwCit2biAtMC43OTQ0MDAgMC40NTE5MDAgMC40MDU5MDAKK3ZuIC0wLjg4NDQwMCAwLjEzMDMwMCAwLjQ0ODEwMAordm4gLTAuODg0NTAwIDAuMTMwMzAwIDAuNDQ4MTAwCit2biAtMC44OTIyMDAgMC4wMjM2MDAgMC40NTEwMDAKK3ZuIC0wLjg4OTUwMCAtMC4wODc3MDAgMC40NDg0MDAKK3ZuIDAuMTcxNTAwIDAuOTY3NzAwIC0wLjE4NDcwMAordm4gMC4xNzIzMDAgMC45NjY5MDAgLTAuMTg4MTAwCit2biAtMC4wODE3MDAgLTAuOTk1ODAwIDAuMDQxMzAwCit2biAtMC4wODE2MDAgLTAuOTk1ODAwIDAuMDQwNDAwCit2biAtMC4wODIxMDAgLTAuOTk1ODAwIDAuMDQxNDAwCit2biAtMC4wODE5MDAgLTAuOTk1NzAwIDAuMDQyNDAwCit2biAtMC44ODM1MDAgLTAuMTQ3MzAwIDAuNDQ0NjAwCit2biAtMC44ODM2MDAgLTAuMTQ3MzAwIDAuNDQ0NTAwCit2biAtMC44ODM4MDAgLTAuMTQ3NDAwIDAuNDQ0MDAwCit2biAtMC44ODM4MDAgLTAuMTQ3NDAwIDAuNDQ0MTAwCit2biAwLjE3NzMwMCAtMC45ODAxMDAgLTAuMDg5NTAwCit2biAwLjE3NzMwMCAtMC45ODAyMDAgLTAuMDg4NDAwCit2biAwLjE3NzEwMCAtMC45ODAxMDAgLTAuMDg5NzAwCit2biAwLjE3NzQwMCAtMC45ODAwMDAgLTAuMDg5NzAwCit2biAtMC43NTA3MDAgLTAuNTQxNTAwIDAuMzc4NTAwCit2biAtMC43NTMzMDAgLTAuNTQwNjAwIDAuMzc0NTAwCit2biAtMC43NjIzMDAgLTAuNTI0NTAwIDAuMzc5MjAwCit2biAtMC43NjAxMDAgLTAuNTI1MzAwIDAuMzgyNTAwCit2biAtMC44OTEyMDAgMC4wNTM3MDAgMC40NTA1MDAKK3ZuIC0wLjg5MTMwMCAwLjA1MzcwMCAwLjQ1MDIwMAordm4gLTAuODkxNDAwIDAuMDUzNzAwIDAuNDUwMTAwCit2biAtMC44OTE1MDAgMC4wNTM3MDAgMC40NDk5MDAKK3ZuIC0wLjg1MTcwMCAwLjI5NTIwMCAwLjQzMzAwMAordm4gLTAuODUxODAwIDAuMjk1MzAwIDAuNDMyNzAwCit2biAtMC44NTIxMDAgMC4yOTUzMDAgMC40MzIyMDAKK3ZuIC0wLjg1MjMwMCAwLjI5NTQwMCAwLjQzMTcwMAordm4gLTAuODg0NTAwIDAuMTMwNDAwIDAuNDQ3OTAwCit2biAtMC44ODQzMDAgMC4xMzAzMDAgMC40NDgzMDAKK3ZuIC0wLjg4NDYwMCAwLjEzMDMwMCAwLjQ0NzcwMAordm4gLTAuODg1MDAwIDAuMTMwNjAwIDAuNDQ3MDAwCit2biAtMC44OTIyMDAgMC4wMjM2MDAgMC40NTExMDAKK3ZuIC0wLjg5MjYwMCAwLjAyMzYwMCAwLjQ1MDIwMAordm4gLTAuODkyNjAwIDAuMDIzNzAwIDAuNDUwMjAwCit2biAtMC44OTI0MDAgMC4wMjM2MDAgMC40NTA3MDAKK3ZuIC0wLjg4OTkwMCAtMC4wODc3MDAgMC40NDc3MDAKK3ZuIC0wLjg4OTYwMCAtMC4wODc3MDAgMC40NDgyMDAKK3ZuIC0wLjg4OTgwMCAtMC4wODc3MDAgMC40NDc5MDAKK3ZuIDAuMjEzNzAwIDAuOTcwODAwIC0wLjEwOTAwMAordm4gMC4yMTM0MDAgMC45NzExMDAgLTAuMTA2NTAwCit2biAwLjIxMjkwMCAwLjk3MTAwMCAtMC4xMDg1MDAKK3ZuIDAuMjEyODAwIDAuOTcxMzAwIC0wLjEwNjAwMAordm4gLTAuMDgxNzAwIC0wLjk5NTgwMCAwLjA0MTEwMAordm4gLTAuMDgxODAwIC0wLjk5NTgwMCAwLjA0MTEwMAordm4gLTAuOTYzMzAwIC0wLjE0MzMwMCAwLjIyNzAwMAordm4gLTAuOTYzMzAwIC0wLjE0MzIwMCAwLjIyNzIwMAordm4gMC4xNDM0MDAgLTAuOTc3NDAwIC0wLjE1NTQwMAordm4gMC4wODQ3MDAgLTAuOTk1NTAwIC0wLjA0MzAwMAordm4gLTAuNjQ0MTAwIC0wLjUyOTQwMCAwLjU1MjIwMAordm4gLTAuNTY5NjAwIC0wLjc3MDAwMCAwLjI4NzUwMAordm4gLTAuOTcxNjAwIDAuMDUyMjAwIDAuMjMwODAwCit2biAtMC45NzE2MDAgMC4wNTIzMDAgMC4yMzA3MDAKK3ZuIC0wLjg3MzQwMCAwLjQzOTAwMCAwLjIxMDgwMAordm4gLTAuODUxNjAwIDAuMjk1MzAwIDAuNDMzMTAwCit2biAtMC44ODQ1MDAgMC4xMzAzMDAgMC40NDgwMDAKK3ZuIC0wLjg5MjMwMCAwLjAyMzYwMCAwLjQ1MDkwMAordm4gMC4yNTY2MDAgMC45NjYzMDAgLTAuMDIwNjAwCit2biAwLjI1NDYwMCAwLjk2NjgwMCAtMC4wMjAzMDAKK3ZuIDAuMDE1OTAwIC0wLjk4MTMwMCAtMC4xOTIwMDAKK3ZuIDAuMDE1OTAwIC0wLjk4MTMwMCAtMC4xOTE5MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAwMDAgLTAuMDAwMDAwCit2biAxLjAwMDAwMCAwLjAwMDAwMCAwLjAwMDAwMAordm4gMC4wMTU2MDAgLTAuOTgxMzAwIC0wLjE5MTkwMAordm4gMC4wMTU3MDAgLTAuOTgxNDAwIC0wLjE5MTUwMAordm4gMC4wMTU5MDAgLTAuOTgxMzAwIC0wLjE5MjEwMAordm4gMC4wMTYwMDAgLTAuOTgxMzAwIC0wLjE5MTkwMAordm4gMC4wMDk3MDAgLTAuNzEyNzAwIC0wLjcwMTQwMAordm4gMC4wMTE2MDAgLTAuNzE4ODAwIC0wLjY5NTEwMAordm4gMC4wMDk2MDAgLTAuNzEyMzAwIC0wLjcwMTgwMAordm4gMC4wMTEzMDAgLTAuNzEyNzAwIC0wLjcwMTQwMAordm4gMC4wMDk4MDAgLTAuNzE4ODAwIC0wLjY5NTIwMAordm4gMC4wMTE3MDAgLTAuNzE5MDAwIC0wLjY5NDkwMAordm4gMC4wMDMxMDAgLTAuMTk1NjAwIC0wLjk4MDcwMAordm4gMC4wMDI3MDAgLTAuMTk0NDAwIC0wLjk4MDkwMAordm4gMC4wMDI3MDAgLTAuMTk1NjAwIC0wLjk4MDcwMAordm4gMC4wMDMyMDAgLTAuMTk0NTAwIC0wLjk4MDkwMAordm4gMC4wMDI4MDAgLTAuMTk0MzAwIC0wLjk4MDkwMAordm4gLTAuMDAwNjAwIDAuMDQzNDAwIC0wLjk5OTEwMAordm4gLTAuMDAwODAwIDAuMDQzNTAwIC0wLjk5OTEwMAordm4gLTAuMDAwODAwIDAuMDQzNDAwIC0wLjk5OTEwMAordm4gLTAuMDAwNjAwIDAuMDQzNTAwIC0wLjk5OTEwMAordm4gMC4wMTU5MDAgLTAuOTgxMjAwIC0wLjE5MjEwMAordm4gLTEuMDAwMDAwIC0wLjAwMDEwMCAtMC4wMDAwMDAKK3ZuIDAuMDA5NzAwIC0wLjcxMjUwMCAtMC43MDE2MDAKK3ZuIDAuMDExNzAwIC0wLjcxOTAwMCAtMC42OTUwMDAKK3ZuIDAuMDAyNzAwIC0wLjE5NDUwMCAtMC45ODA5MDAKK3ZuIDAuMDAzMjAwIC0wLjE5NDQwMCAtMC45ODA5MDAKK3ZuIDAuMDE1OTAwIC0wLjk4MTMwMCAtMC4xOTE3MDAKK3ZuIDAuMDA5ODAwIC0wLjcxODkwMCAtMC42OTUxMDAKK3ZuIDAuMDExNzAwIC0wLjcxODkwMCAtMC42OTUwMDAKK3ZuIDAuMDAzMTAwIC0wLjE5NTUwMCAtMC45ODA3MDAKK3ZuIDAuMDExNjAwIC0wLjcxODcwMCAtMC42OTUyMDAKK3ZuIDAuMDA5NjAwIC0wLjcxMjQwMCAtMC43MDE3MDAKK3ZuIDAuMDA5ODAwIC0wLjcxODgwMCAtMC42OTUxMDAKK3ZuIDAuMDExNzAwIC0wLjcxODkwMCAtMC42OTUxMDAKK3ZuIC0wLjAxNTkwMCAtMC45ODEzMDAgLTAuMTkxOTAwCit2biAtMC4wMTU5MDAgLTAuOTgxMzAwIC0wLjE5MTcwMAordm4gMS4wMDAwMDAgLTAuMDAwMTAwIDAuMDAwMDAwCit2biAtMS4wMDAwMDAgMC4wMDAxMDAgLTAuMDAwMDAwCit2biAtMC4wMTU3MDAgLTAuOTgxNDAwIC0wLjE5MTUwMAordm4gLTAuMDE1NjAwIC0wLjk4MTMwMCAtMC4xOTE5MDAKK3ZuIC0wLjAxNjAwMCAtMC45ODEzMDAgLTAuMTkyMDAwCit2biAtMC4wMTU5MDAgLTAuOTgxMzAwIC0wLjE5MTgwMAordm4gLTAuMDExNjAwIC0wLjcxODcwMCAtMC42OTUyMDAKK3ZuIC0wLjAwOTcwMCAtMC43MTI2MDAgLTAuNzAxNTAwCit2biAxLjAwMDAwMCAwLjAwMDEwMCAwLjAwMDAwMAordm4gLTEuMDAwMDAwIDAuMDAwMDAwIDAuMDAwMTAwCit2biAtMC4wMTEzMDAgLTAuNzEyODAwIC0wLjcwMTMwMAordm4gLTAuMDA5NjAwIC0wLjcxMjMwMCAtMC43MDE4MDAKK3ZuIC0wLjAxMTcwMCAtMC43MTkwMDAgLTAuNjk1MDAwCit2biAtMC4wMDk4MDAgLTAuNzE4ODAwIC0wLjY5NTIwMAordm4gLTAuMDAyNzAwIC0wLjE5NDQwMCAtMC45ODA5MDAKK3ZuIC0wLjAwMzEwMCAtMC4xOTU2MDAgLTAuOTgwNzAwCit2biAxLjAwMDAwMCAtMC4wMDAwMDAgLTAuMDAwMTAwCit2biAtMC4wMDI3MDAgLTAuMTk1NjAwIC0wLjk4MDcwMAordm4gLTAuMDAyODAwIC0wLjE5NDMwMCAtMC45ODA5MDAKK3ZuIC0wLjAwMzEwMCAtMC4xOTQ0MDAgLTAuOTgwOTAwCit2biAwLjAwMDgwMCAwLjA0MzUwMCAtMC45OTkxMDAKK3ZuIDAuMDAwNjAwIDAuMDQzNDAwIC0wLjk5OTEwMAordm4gLTEuMDAwMDAwIDAuMDAwMDAwIC0wLjAwMDEwMAordm4gMC4wMDA4MDAgMC4wNDM0MDAgLTAuOTk5MTAwCit2biAwLjAwMDYwMCAwLjA0MzUwMCAtMC45OTkxMDAKK3ZuIC0wLjAxNTkwMCAtMC45ODEzMDAgLTAuMTkyMDAwCit2biAtMC4wMTU2MDAgLTAuOTgxMzAwIC0wLjE5MjAwMAordm4gLTAuMDE2MDAwIC0wLjk4MTMwMCAtMC4xOTE5MDAKK3ZuIC0wLjAwOTcwMCAtMC43MTI3MDAgLTAuNzAxNDAwCit2biAtMC4wMTEzMDAgLTAuNzEyNzAwIC0wLjcwMTQwMAordm4gLTAuMDExNzAwIC0wLjcxOTAwMCAtMC42OTQ5MDAKK3ZuIC0wLjAwMjcwMCAtMC4xOTQ1MDAgLTAuOTgwOTAwCit2biAtMC4wMDMyMDAgLTAuMTk0NTAwIC0wLjk4MDkwMAordm4gMS4wMDAwMDAgLTAuMDAwMDAwIDAuMDAwMTAwCit2biAtMC4wMTE2MDAgLTAuNzE4OTAwIC0wLjY5NTAwMAordm4gLTAuMDA5ODAwIC0wLjcxODcwMCAtMC42OTUyMDAKK3ZuIC0wLjAwMzIwMCAtMC4xOTQ0MDAgLTAuOTgwOTAwCit2biAtMC4wMTYwMDAgLTAuOTgxMzAwIC0wLjE5MTgwMAordm4gLTAuMDExNzAwIC0wLjcxODkwMCAtMC42OTUwMDAKK3ZuIC0wLjAwOTgwMCAtMC43MTg4MDAgLTAuNjk1MTAwCit2biAtMC4wMDI3MDAgLTAuMTk0MzAwIC0wLjk4MDkwMAordm4gMC45NzQyMDAgLTAuMDAyNTAwIC0wLjIyNTcwMAordm4gMC45NzYzMDAgMC4wMDAwMDAgLTAuMjE2NjAwCit2biAtMC4yMjM4MDAgMC4wMDAwMDAgLTAuOTc0NjAwCit2biAtMC45Nzk0MDAgLTAuMDAwMDAwIDAuMjAxODAwCit2biAwLjIzMDkwMCAtMC4wMDAwMDAgMC45NzMwMDAKK3ZuIDAuNTUzNTAwIC0wLjYzNDQwMCAtMC41Mzk3MDAKK3ZuIDAuNTQ2MzAwIC0wLjY0NTcwMCAtMC41MzM1MDAKK3ZuIDAuMTc5MzAwIC0wLjY3MTgwMCAtMC43MTg3MDAKK3ZuIDAuMTg2MzAwIC0wLjY0NTIwMCAtMC43NDA5MDAKK3ZuIC0wLjUzMjcwMCAtMC42Mzg0MDAgLTAuNTU1NjAwCit2biAtMC41Mjc0MDAgLTAuNjQ4MjAwIC0wLjU0OTIwMAordm4gLTAuNzIwMzAwIC0wLjY3MzMwMCAtMC4xNjY4MDAKK3ZuIC0wLjc0NzEwMCAtMC42NDE0MDAgLTAuMTc0NzAwCit2biAtMC41NTA5MDAgLTAuNjQxNjAwIDAuNTMzNzAwCit2biAtMC41NDc3MDAgLTAuNjQ2NTAwIDAuNTMxMDAwCit2biAtMC4xNzkwMDAgLTAuNjcxOTAwIDAuNzE4NzAwCit2biAtMC4xODY2MDAgLTAuNjQyMzAwIDAuNzQzNDAwCit2biAwLjU2MjMwMCAtMC42NDc1MDAgMC41MTQzMDAKK3ZuIDAuNTY4NjAwIC0wLjYzNzEwMCAwLjUyMDQwMAordm4gMC43MjI4MDAgLTAuNjc1OTAwIDAuMTQ0MTAwCit2biAwLjc1NTYwMCAtMC42MzcxMDAgMC4xNTI1MDAKK3ZuIDAuNzE2MDAwIDAuMDAwMDAwIC0wLjY5ODEwMAordm4gMC43MjQxMDAgLTAuMDAzMTAwIC0wLjY4OTcwMAordm4gMC43NTEyMDAgLTAuNjM4NzAwIC0wLjE2NjYwMAordm4gMC43MjA3MDAgLTAuNjc0MTAwIC0wLjE2MTcwMAordm4gMC4yNDIxMDAgMC4wMDAwMDAgLTAuOTcwMjAwCit2biAtMC42OTIxMDAgMC4wMDAwMDAgLTAuNzIxODAwCit2biAtMC4xNzIyMDAgLTAuNjM4ODAwIC0wLjc0OTgwMAordm4gLTAuMTY3MTAwIC0wLjY3MzQwMCAtMC43MjAyMDAKK3ZuIC0wLjk3NDIwMCAtMC4wMDAwMDAgLTAuMjI1NTAwCit2biAtMC43MTgyMDAgLTAuMDAwMDAwIDAuNjk1ODAwCit2biAtMC43NTU1MDAgLTAuNjM2NDAwIDAuMTU1NzAwCit2biAtMC43MjIzMDAgLTAuNjc1MDAwIDAuMTUwNTAwCit2biAtMC4yNDE2MDAgLTAuMDAwMDAwIDAuOTcwNDAwCit2biAwLjE3NzEwMCAtMC42NDE1MDAgMC43NDY0MDAKK3ZuIDAuMTcyMjAwIC0wLjY3MjcwMCAwLjcxOTUwMAordm4gMC45ODA3MDAgMC4wMDAwMDAgMC4xOTU2MDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDA5NjAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIC0wLjAwOTUwMAordm4gLTAuMDA5NzAwIC0xLjAwMDAwMCAtMC4wMDAwMDAKK3ZuIC0wLjAwOTAwMCAtMS4wMDAwMDAgLTAuMDAyODAwCit2biAtMC4wMTE2MDAgLTAuOTk5OTAwIDAuMDAwMDAwCit2biAtMC4wMDk3MDAgLTAuOTk5NzAwIC0wLjAyMDIwMAordm4gLTAuMDA5MDAwIC0xLjAwMDAwMCAwLjAwMjAwMAordm4gLTAuMDA5NDAwIC0xLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuMDA5NDAwIC0xLjAwMDAwMCAtMC4wMDE0MDAKK3ZuIC0wLjAxMDcwMCAtMC45OTk5MDAgLTAuMDA5NjAwCit2biAtMC44MjkzMDAgMC41NTg4MDAgMC4wMDAwMDAKK3ZuIC0wLjk4MDAwMCAwLjE5ODgwMCAwLjAwMDAwMAordm4gLTAuNTU4NzAwIDAuODI5NDAwIDAuMDAwMDAwCit2biAtMC4yMDQ2MDAgMC45Nzg5MDAgMC4wMDAwMDAKK3ZuIC0wLjAwMDAwMCAxLjAwMDAwMCAwLjAwMDAwMAordm4gMC4yMDUwMDAgMC45Nzg4MDAgMC4wMDAwMDAKK3ZuIDAuNTU4NzAwIDAuODI5NDAwIDAuMDAwMDAwCit2biAwLjgyOTIwMCAwLjU1ODkwMCAwLjAwMDAwMAordm4gMC45Nzk5MDAgMC4xOTkzMDAgMC4wMDAwMDAKK3ZuIDAuOTc5OTAwIDAuMTk5NDAwIDAuMDAwMDAwCit2biAtMC43MjAwMDAgMC40ODQ4MDAgMC40OTY1MDAKK3ZuIC0wLjcyMDMwMCAwLjQ4NTQwMCAwLjQ5NTYwMAordm4gLTAuODQ4MTAwIDAuMTY5ODAwIDAuNTAyMDAwCit2biAtMC44NTIxMDAgMC4xNzI4MDAgMC40OTM5MDAKK3ZuIC0wLjg2MDcwMCAwLjAwMDAwMCAwLjUwOTEwMAordm4gLTAuODYwNzAwIDAuMDAwMDAwIDAuNTA5MjAwCit2biAwLjg1OTYwMCAtMC4wMDAwMDAgMC41MTEwMDAKK3ZuIDAuODUxNTAwIDAuMTczMjAwIDAuNDk0OTAwCit2biAwLjg0NzAwMCAwLjE2OTkwMCAwLjUwMzcwMAordm4gMC43MjQ5MDAgMC40ODU2MDAgMC40ODg3MDAKK3ZuIDAuNzE5NDAwIDAuNDg0ODAwIDAuNDk3NTAwCit2biAwLjQ4NTYwMCAwLjcyMjMwMCAwLjQ5MjUwMAordm4gMC40ODcxMDAgMC43MjMxMDAgMC40ODk3MDAKK3ZuIDAuMTc0NTAwIDAuODQ2MTAwIDAuNTAzNjAwCit2biAwLjE3ODMwMCAwLjg1MTIwMCAwLjQ5MzYwMAordm4gLTAuMDAwMDAwIDAuODU5OTAwIDAuNTEwNDAwCit2biAtMC4wMDAwMDAgMC44NjAwMDAgMC41MTA0MDAKK3ZuIC0wLjE3ODEwMCAwLjg1MjIwMCAwLjQ5MjAwMAordm4gLTAuMTY5ODAwIDAuODQxMDAwIDAuNTEzNjAwCit2biAtMC40ODYwMDAgMC43MjAwMDAgMC40OTU0MDAKK3ZuIC0wLjQ4NjMwMCAwLjcyMTkwMCAwLjQ5MjQwMAordm4gMC4yNjY2MDAgLTAuMTc5NTAwIDAuOTQ2OTAwCit2biAwLjI2NjUwMCAtMC4xNzk1MDAgMC45NDcwMDAKK3ZuIDAuMzE0ODAwIC0wLjA2NDAwMCAwLjk0NzAwMAordm4gMC4zMjA2MDAgLTAuMDY0ODAwIDAuOTQ1MDAwCit2biAwLjMyMTMwMCAtMC4wMDAwMDAgMC45NDcwMDAKK3ZuIC0wLjMyMTMwMCAwLjAwMDAwMCAwLjk0NzAwMAordm4gLTAuMzIxNDAwIDAuMDAwMDAwIDAuOTQ3MDAwCit2biAtMC4zMjA2MDAgLTAuMDY1MzAwIDAuOTQ1MDAwCit2biAtMC4zMTQ5MDAgLTAuMDYzNzAwIDAuOTQ3MDAwCit2biAtMC4yNjY3MDAgLTAuMTc5MDAwIDAuOTQ3MDAwCit2biAtMC4yNTk3MDAgLTAuMTczNjAwIDAuOTQ5OTAwCit2biAtMC4xNzQ0MDAgLTAuMjU4NTAwIDAuOTUwMTAwCit2biAtMC4xNzkxMDAgLTAuMjY2NzAwIDAuOTQ3MDAwCit2biAtMC4wNjU5MDAgLTAuMzE0MTAwIDAuOTQ3MTAwCit2biAtMC4wNjY5MDAgLTAuMzIwNzAwIDAuOTQ0ODAwCit2biAwLjAwMDAwMCAtMC4zMjIyMDAgMC45NDY3MDAKK3ZuIDAuMDAwMjAwIC0wLjMyNjUwMCAwLjk0NTIwMAordm4gMC4wNjM5MDAgLTAuMzE4MzAwIDAuOTQ1ODAwCit2biAwLjA2MzAwMCAtMC4zMTUyMDAgMC45NDY5MDAKK3ZuIDAuMTc5OTAwIC0wLjI2NjMwMCAwLjk0NzAwMAordm4gMC4xNzk5MDAgLTAuMjY2MjAwIDAuOTQ3MDAwCit2biAtMC41ODY0MDAgMC4zOTUxMDAgLTAuNzA3MTAwCit2biAtMC41OTQ0MDAgMC40MDAyMDAgLTAuNjk3NTAwCit2biAtMC42OTk5MDAgMC4xNDIwMDAgLTAuNzAwMDAwCit2biAtMC42OTI5MDAgMC4xNDA3MDAgLTAuNzA3MjAwCit2biAtMC40MDI5MDAgMC41OTgxMDAgLTAuNjkyODAwCit2biAtMC4zOTI1MDAgMC41ODM1MDAgLTAuNzExMDAwCit2biAtMC4xNDQyMDAgMC42OTAyMDAgLTAuNzA5MTAwCit2biAtMC4xNDUzMDAgMC42OTQ4MDAgLTAuNzA0NDAwCit2biAtMC4wMDAwMDAgMC43MDczMDAgLTAuNzA2OTAwCit2biAtMC4wMDAwMDAgMC43MDcxMDAgLTAuNzA3MTAwCit2biAwLjE0NjUwMCAwLjY5OTQwMCAtMC42OTk2MDAKK3ZuIDAuMTQ2NDAwIDAuNjk4NjAwIC0wLjcwMDQwMAordm4gMC4zOTg0MDAgMC41OTE1MDAgLTAuNzAxMDAwCit2biAwLjM4NTgwMCAwLjU3MTYwMCAtMC43MjQxMDAKK3ZuIDAuNTc0MTAwIDAuMzg2OTAwIC0wLjcyMTYwMAordm4gMC41ODYyMDAgMC4zOTU2MDAgLTAuNzA3MTAwCit2biAwLjY5MjkwMCAwLjE0MDkwMCAtMC43MDcyMDAKK3ZuIDAuNjk5ODAwIDAuMTQyNjAwIC0wLjcwMDAwMAordm4gMC43MDcxMDAgLTAuMDAwMDAwIC0wLjcwNzEwMAordm4gLTAuNzA3MTAwIDAuMDAwMDAwIC0wLjcwNzEwMAordm4gMC4wMDAwMDAgMC43MDcyMDAgLTAuNzA3MDAwCit2biAwLjAwMDAwMCAwLjcwNzAwMCAtMC43MDcyMDAKK3ZuIDAuMDAwMDAwIDEuMDAwMDAwIDAuMDAwMTAwCit2biAwLjAwMDAwMCAxLjAwMDAwMCAtMC4wMDAxMDAKK3ZuIDAuMzgwNDAwIDAuMTIyMDAwIC0wLjkxNjcwMAordm4gMC45MTY5MDAgMC4xMjE1MDAgLTAuMzgwMjAwCit2biAwLjkxNjkwMCAwLjEyMTUwMCAtMC4zODAxMDAKK3ZuIDAuOTE2NzAwIDAuMTIwNzAwIDAuMzgxMDAwCit2biAwLjM4MDMwMCAwLjEyMDIwMCAwLjkxNzAwMAordm4gLTAuMzgwMTAwIDAuMTIwMjAwIDAuOTE3MTAwCit2biAtMC45MTY4MDAgMC4xMjA3MDAgMC4zODA2MDAKK3ZuIC0wLjkxNzEwMCAwLjEyMTUwMCAtMC4zNzk3MDAKK3ZuIC0wLjkxNzEwMCAwLjEyMTQwMCAtMC4zNzk3MDAKK3ZuIC0wLjM3OTgwMCAwLjEyMjAwMCAtMC45MTcwMDAKK3ZuIDAuMjcxMDAwIDAuNzA3MDAwIC0wLjY1MzIwMAordm4gMC4yNzEwMDAgMC43MDcyMDAgLTAuNjUzMDAwCit2biAwLjY1MzIwMCAwLjcwNzIwMCAtMC4yNzA3MDAKK3ZuIDAuNjUzMTAwIDAuNzA3MjAwIC0wLjI3MDcwMAordm4gMC42NTMwMDAgMC43MDcxMDAgMC4yNzEzMDAKK3ZuIDAuNjU2NjAwIDAuNzAzMDAwIDAuMjczMzAwCit2biAwLjI2OTIwMCAwLjcxMTMwMCAwLjY0OTMwMAordm4gMC4yNzA1MDAgMC43MDczMDAgMC42NTMxMDAKK3ZuIC0wLjI3MDcwMCAwLjcwNzIwMCAwLjY1MzEwMAordm4gLTAuMjcwNzAwIDAuNzA3MTAwIDAuNjUzMjAwCit2biAtMC42NTMwMDAgMC43MDcyMDAgMC4yNzExMDAKK3ZuIC0wLjY1MzAwMCAwLjcwNzEwMCAwLjI3MTIwMAordm4gLTAuNjUzMjAwIDAuNzA3MjAwIC0wLjI3MDUwMAordm4gLTAuNjUzMzAwIDAuNzA3MTAwIC0wLjI3MDYwMAordm4gLTAuMjcwNTAwIDAuNzA3MDAwIC0wLjY1MzQwMAordm4gLTAuMjcwNjAwIDAuNzA3MjAwIC0wLjY1MzIwMAordm4gMC43MTAzMDAgLTAuMDAxMDAwIC0wLjcwMzkwMAordm4gMC4wMDAwMDAgLTAuMDAxNDAwIC0xLjAwMDAwMAordm4gMC4wMDAwMDAgMC4wMDAyMDAgLTEuMDAwMDAwCit2biAwLjAwMDAwMCAxLjAwMDAwMCAwLjAwMTkwMAordm4gMC4wMDAxMDAgMS4wMDAwMDAgLTAuMDAxNjAwCit2biAtMC4wMDAwMDAgMS4wMDAwMDAgLTAuMDAxOTAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDAzMDAKK3ZuIDAuMDAwMDAwIDEuMDAwMDAwIDAuMDAwMjAwCit2biAtMC4wMDA4MDAgLTEuMDAwMDAwIC0wLjAwMDEwMAordm4gLTAuMDAwNTAwIC0xLjAwMDAwMCAtMC4wMDAxMDAKK3ZuIC0wLjAwMDgwMCAtMS4wMDAwMDAgMC4wMDAxMDAKK3ZuIDAuODM5ODAwIC0wLjAwMDAwMCAtMC41NDI5MDAKK3ZuIDAuODM2NzAwIC0wLjU0NzYwMCAtMC4wMDAwMDAKK3ZuIDAuODM2ODAwIC0wLjU0NzUwMCAtMC4wMDAwMDAKK3ZuIDAuNzA1NTAwIC0wLjQ2MTcwMCAtMC41Mzc3MDAKK3ZuIDAuNjc0MTAwIC0wLjMwMTcwMCAtMC42NzQyMDAKK3ZuIDAuODM1MTAwIDAuNTUwMjAwIDAuMDAwMDAwCit2biAwLjgzNDkwMCAwLjU1MDQwMCAtMC4wMDAxMDAKK3ZuIDAuODM0OTAwIDAuNTUwNDAwIDAuMDAwMDAwCit2biAwLjgzNTAwMCAwLjU1MDIwMCAwLjAwMDEwMAordm4gMC43NTA5MDAgMC4zMzg3MDAgLTAuNTY2OTAwCit2biAwLjY0MzQwMCAwLjQyMzkwMCAtMC42Mzc1MDAKK3ZuIDAuMDAwMDAwIDAuMDAxMjAwIC0xLjAwMDAwMAordm4gLTAuMDAwMDAwIC0wLjAwMTMwMCAtMS4wMDAwMDAKK3ZuIDAuODM5ODAwIC0wLjAwMDAwMCAtMC41NDMwMDAKK3ZuIDAuODM2OTAwIC0wLjU0NzQwMCAtMC4wMDAwMDAKK3ZuIDAuODM3MTAwIC0wLjU0NzAwMCAtMC4wMDAxMDAKK3ZuIDAuODI1ODAwIDAuMDAwMDAwIC0wLjU2NDAwMAordm4gMC44MTk5MDAgLTAuNTcyNTAwIC0wLjAwMDAwMAordm4gMC44MjAyMDAgLTAuNTcyMTAwIC0wLjAwMDEwMAordm4gMC44MjAyMDAgLTAuNTcyMDAwIC0wLjAwMDEwMAordm4gMC44MjAyMDAgLTAuNTcyMTAwIC0wLjAwMDAwMAordm4gMC42OTUyMDAgLTAuNDg1MDAwIC0wLjUzMDYwMAordm4gMC42Njk3MDAgLTAuMzIwNjAwIC0wLjY2OTkwMAordm4gMC44OTM3MDAgMC40NDg3MDAgMC4wMDAwMDAKK3ZuIDAuODkzNzAwIDAuNDQ4NjAwIDAuMDAwMDAwCit2biAwLjg5MzYwMCAwLjQ0ODgwMCAtMC4wMDAxMDAKK3ZuIDAuNzY2NjAwIDAuMjY0MzAwIC0wLjU4NTIwMAordm4gMC42NjYzMDAgMC4zMzQ2MDAgLTAuNjY2NDAwCit2biAwLjgyNjIwMCAwLjAwMDAwMCAtMC41NjMzMDAKK3ZuIDAuODIwMDAwIC0wLjU3MjMwMCAtMC4wMDA0MDAKK3ZuIDAuODE5MjAwIC0wLjU3MzUwMCAtMC4wMDAxMDAKK3ZuIC0wLjc0OTkwMCAtMC42NjE1MDAgMC4wMDAyMDAKK3ZuIC0wLjc0OTIwMCAtMC42NjI0MDAgLTAuMDAwMTAwCit2biAtMC44NzQwMDAgMC4wMTEyMDAgLTAuNDg1OTAwCit2biAtMC41OTgwMDAgLTAuNTI4NzAwIC0wLjYwMjQwMAordm4gLTAuNzI1ODAwIDAuNjg3OTAwIDAuMDAwNjAwCit2biAtMC43Mjg2MDAgMC42ODUwMDAgMC4wMDAwMDAKK3ZuIC0wLjcyMzEwMCAwLjY5MDYwMCAtMC4wMTQ0MDAKK3ZuIC0wLjY3OTAwMCAwLjczNDIwMCAtMC4wMDA0MDAKK3ZuIC0wLjYxMDgwMCAwLjY2MDQwMCAtMC40MzY5MDAKK3ZuIC0wLjY3OTUwMCAwLjI3NjQwMCAtMC42Nzk2MDAKK3ZuIDAuMDAwMDAwIC0wLjAxMDMwMCAtMC45OTk5MDAKK3ZuIC0wLjAwMDAwMCAtMC4wMTAxMDAgLTAuOTk5OTAwCit2biAtMC4wMDAwMDAgLTAuMDAxMDAwIC0xLjAwMDAwMAordm4gMC4wMDA5MDAgLTAuMDEzOTAwIC0wLjk5OTkwMAordm4gLTAuNjkxNTAwIC0wLjAwMTcwMCAtMC43MjI0MDAKK3ZuIC0wLjY4NTEwMCAwLjAwMTAwMCAtMC43Mjg0MDAKK3ZuIDAuOTgwMzAwIC0wLjE5NzgwMCAwLjAwMDAwMAordm4gMC44MzA3MDAgLTAuNTU2NzAwIDAuMDAwMDAwCit2biAwLjU1NjgwMCAtMC44MzA3MDAgMC4wMDAwMDAKK3ZuIDAuMjAzMTAwIC0wLjk3OTEwMCAwLjAwMDAwMAordm4gLTAuMTkwOTAwIC0wLjk4MTYwMCAwLjAwMDAwMAordm4gLTAuOTgwMjAwIC0wLjE5NzgwMCAwLjAwMDAwMAordm4gLTAuODI4MjAwIC0wLjU2MDUwMCAwLjAwMDAwMAordm4gLTAuNTYxNTAwIC0wLjgyNzUwMCAwLjAwMDAwMAordm4gMC44NDcyMDAgLTAuMTY4NjAwIDAuNTAzODAwCit2biAwLjg1MTYwMCAtMC4xNzE4MDAgMC40OTUzMDAKK3ZuIDAuNzIwODAwIC0wLjQ4MzEwMCAwLjQ5NzEwMAordm4gMC43MjU2MDAgLTAuNDgzNzAwIDAuNDg5NDAwCit2biAwLjQ4NTEwMCAtMC43MjM3MDAgMC40OTA5MDAKK3ZuIDAuNDgzOTAwIC0wLjcyMzAwMCAwLjQ5MzEwMAordm4gMC4xNzY3MDAgLTAuODUxNzAwIDAuNDkzNDAwCit2biAwLjE2ODgwMCAtMC44NDE1MDAgMC41MTMyMDAKK3ZuIC0wLjAwMDAwMCAtMC44NjAxMDAgMC41MTAyMDAKK3ZuIC0wLjE1OTAwMCAtMC44NDUxMDAgMC41MTA1MDAKK3ZuIC0wLjE2NjQwMCAtMC44NTUyMDAgMC40OTA5MDAKK3ZuIC0wLjQ4ODEwMCAtMC43MTkyMDAgMC40OTQ2MDAKK3ZuIC0wLjQ4ODEwMCAtMC43MTk0MDAgMC40OTQyMDAKK3ZuIC0wLjcxOTkwMCAtMC40ODcyMDAgMC40OTQ0MDAKK3ZuIC0wLjcxNzQwMCAtMC40ODMwMDAgMC41MDIwMDAKK3ZuIC0wLjg1MTUwMCAtMC4xNzE4MDAgMC40OTU0MDAKK3ZuIC0wLjg0ODIwMCAtMC4xNjk0MDAgMC41MDE4MDAKK3ZuIDAuMjAzMjAwIC0wLjk3OTEwMCAwLjAwMDAwMAordm4gLTAuMzE1MzAwIDAuMDYzMzAwIDAuOTQ2OTAwCit2biAtMC4zMjA3MDAgMC4wNjQ4MDAgMC45NDUwMDAKK3ZuIC0wLjI2NzcwMCAwLjE3ODQwMCAwLjk0NjkwMAordm4gLTAuMjY3NTAwIDAuMTc4MjAwIDAuOTQ2OTAwCit2biAtMC4xNzg1MDAgMC4yNjY5MDAgMC45NDcwMDAKK3ZuIC0wLjE3ODcwMCAwLjI2NzMwMCAwLjk0NjkwMAordm4gLTAuMDYyNTAwIDAuMzEyNDAwIDAuOTQ3OTAwCit2biAtMC4wNjI4MDAgMC4zMTUzMDAgMC45NDY5MDAKK3ZuIC0wLjAwMDAwMCAwLjMyMTMwMCAwLjk0NzAwMAordm4gLTAuMDAwMDAwIDAuMzIxNDAwIDAuOTQ3MDAwCit2biAwLjA1OTUwMCAwLjMxNjYwMCAwLjk0NjcwMAordm4gMC4wNTkyMDAgMC4zMTU2MDAgMC45NDcwMDAKK3ZuIDAuMTgwNDAwIDAuMjY1ODAwIDAuOTQ3MDAwCit2biAwLjE4MDYwMCAwLjI2NjEwMCAwLjk0NjkwMAordm4gMC4yNjYxMDAgMC4xNzkyMDAgMC45NDcxMDAKK3ZuIDAuMjY2NjAwIDAuMTc5NTAwIDAuOTQ2OTAwCit2biAwLjMyMDcwMCAwLjA2NDYwMCAwLjk0NTAwMAordm4gMC4zMTQ4MDAgMC4wNjM4MDAgMC45NDcwMDAKK3ZuIDAuNzAwMDAwIC0wLjE0MTUwMCAtMC43MDAwMDAKK3ZuIDAuNjkwNTAwIC0wLjEzOTMwMCAtMC43MDk3MDAKK3ZuIDAuNTgwODAwIC0wLjM4OTYwMCAtMC43MTQ4MDAKK3ZuIDAuNTczMzAwIC0wLjM4NDIwMCAtMC43MjM2MDAKK3ZuIDAuMzgwMjAwIC0wLjU2NjAwMCAtMC43MzE1MDAKK3ZuIDAuMzkzNDAwIC0wLjU4NjkwMCAtMC43MDc3MDAKK3ZuIDAuMTM5NTAwIC0wLjY5MjgwMCAtMC43MDc1MDAKK3ZuIDAuMTE4NTAwIC0wLjU3MTIwMCAtMC44MTIyMDAKK3ZuIDAuMDAwMDAwIC0wLjU3ODcwMCAtMC44MTU2MDAKK3ZuIDAuMDAwMDAwIC0wLjU3ODcwMCAtMC44MTU1MDAKK3ZuIC0wLjEwODQwMCAtMC41NzQyMDAgLTAuODExNTAwCit2biAtMC4xMzUyMDAgLTAuNjk0OTAwIC0wLjcwNjMwMAordm4gLTAuNjkwNDAwIC0wLjEzOTYwMCAtMC43MDk5MDAKK3ZuIC0wLjcwMDAwMCAtMC4xNDEyMDAgLTAuNzAwMDAwCit2biAtMC41NzE0MDAgLTAuMzg3MDAwIC0wLjcyMzYwMAordm4gLTAuNTc5MzAwIC0wLjM5MjAwMCAtMC43MTQ3MDAKK3ZuIC0wLjM5ODAwMCAtMC41ODUxMDAgLTAuNzA2NTAwCit2biAtMC4zODMyMDAgLTAuNTY0NjAwIC0wLjczMTAwMAordm4gMC4wMDAwMDAgLTAuNTc4ODAwIC0wLjgxNTUwMAordm4gLTAuMDAwMjAwIC0wLjU3ODgwMCAtMC44MTU1MDAKK3ZuIC0wLjAwMDAwMCAtMC41NzczMDAgLTAuODE2NTAwCit2biAtMC4wMDAxMDAgLTEuMDAwMDAwIC0wLjAwMDEwMAordm4gMC4wMDExMDAgLTAuNTc4NzAwIC0wLjgxNTYwMAordm4gMC4wMDAwMDAgLTAuNTc3MjAwIC0wLjgxNjYwMAordm4gLTAuOTY2OTAwIDAuMDAwMDAwIC0wLjI1NTMwMAordm4gLTAuOTY2ODAwIC0wLjAwMDEwMCAtMC4yNTU0MDAKK3ZuIC0wLjI2MzAwMCAtMC4wMDAwMDAgLTAuOTY0ODAwCit2biAtMC4yNjMxMDAgLTAuMDAwMDAwIC0wLjk2NDgwMAordm4gMC45NjYwMDAgLTAuMDAwMDAwIC0wLjI1ODYwMAordm4gMC45NjYwMDAgLTAuMDAwMTAwIC0wLjI1ODYwMAordm4gMC45NjQ1MDAgLTAuMDAwMTAwIC0wLjI2MzkwMAordm4gMC45NjQ3MDAgLTAuMDAwNzAwIC0wLjI2MzQwMAordm4gLTAuOTY4MTAwIC0wLjAwMDAwMCAtMC4yNTA1MDAKK3ZuIC0wLjk2ODAwMCAwLjAwMDEwMCAtMC4yNTExMDAKK3ZuIDAuOTY4NTAwIC0wLjAwMDcwMCAtMC4yNDkyMDAKK3ZuIDAuOTY4NTAwIC0wLjAwMDYwMCAtMC4yNDg5MDAKK3ZuIC0wLjM5NzEwMCAtMC40NzY5MDAgLTAuNzg0MjAwCit2biAtMC4zOTA4MDAgLTAuNDgyMDAwIC0wLjc4NDIwMAordm4gLTAuNjYwMjAwIC0wLjcyODEwMCAtMC4xODQzMDAKK3ZuIC0wLjYzMDkwMCAtMC43NTc3MDAgLTAuMTY3MTAwCit2biAtMC42NjA3MDAgLTAuNzI4OTAwIC0wLjE3OTQwMAordm4gLTAuNzExOTAwIC0wLjY3NDMwMCAtMC4xOTYwMDAKK3ZuIDAuMTg5NTAwIC0wLjcyMTUwMCAtMC42NjYwMDAKK3ZuIDAuMTk2NDAwIC0wLjY5OTUwMCAtMC42ODcxMDAKK3ZuIDAuNjI4MDAwIC0wLjc1NjQwMCAtMC4xODMyMDAKK3ZuIDAuNjY2MjAwIC0wLjcyMzAwMCAtMC4xODI4MDAKK3ZuIDAuNDA0NjAwIC0wLjQ3OTAwMCAtMC43NzkwMDAKK3ZuIDAuMzk4MTAwIC0wLjQ3OTYwMCAtMC43ODIwMDAKK3ZuIC0wLjI4NTQwMCAwLjAwMDAwMCAtMC45NTg0MDAKK3ZuIC0wLjI4ODMwMCAwLjAwMDIwMCAtMC45NTc2MDAKK3ZuIDAuMzAwNDAwIC0wLjAwMDIwMCAtMC45NTM4MDAKK3ZuIDAuMjk5NTAwIC0wLjAwMDAwMCAtMC45NTQxMDAKK3ZuIC0wLjAwMDEwMCAtMC41Nzg3MDAgLTAuODE1NTAwCit2biAtMC4wMDAwMDAgLTAuNTgxMzAwIC0wLjgxMzcwMAordm4gMC4wMDE0MDAgLTAuNTc4MzAwIC0wLjgxNTgwMAordm4gLTAuOTc4MDAwIDAuMDAwMDAwIC0wLjIwODUwMAordm4gLTAuOTg3MDAwIDAuMDAwMDAwIDAuMTYwOTAwCit2biAtMC44MjY0MDAgMC4wMDAwMDAgMC41NjMxMDAKK3ZuIC0wLjk1MDYwMCAtMC4wMDAzMDAgMC4zMTAzMDAKK3ZuIC0wLjk0OTYwMCAwLjAwMDAwMCAwLjMxMzUwMAordm4gLTAuMTg5MzAwIC0wLjc0MjgwMCAtMC42NDIxMDAKK3ZuIC0wLjIwODEwMCAtMC42ODc4MDAgLTAuNjk1NDAwCit2biAtMC42NzY1MDAgLTAuNzI4MTAwIDAuMTEwNDAwCit2biAtMC42NzYzMDAgLTAuNzI4MzAwIDAuMTEwMjAwCit2biAtMC42MTc1MDAgLTAuNjY0OTAwIDAuNDIwMjAwCit2biAtMC42MDE0MDAgLTAuNjg5OTAwIDAuNDAzMDAwCit2biAtMC40ODk0MDAgLTAuNTYxNDAwIC0wLjY2NzMwMAordm4gLTAuODU3MTAwIC0wLjQ4MjkwMCAtMC4xNzk1MDAKK3ZuIC0wLjgxMjgwMCAtMC4wMDAwMDAgLTAuNTgyNTAwCit2biAtMC44MTc1MDAgLTAuMDAwMzAwIC0wLjU3NTkwMAordm4gLTAuMjg2NzAwIDAuMDAwMDAwIC0wLjk1ODAwMAordm4gLTAuNDkwODAwIC0wLjczODUwMCAtMC40NjIzMDAKK3ZuIC0wLjUxMzQwMCAtMC43MTAzMDAgLTAuNDgxNTAwCit2biAtMC43Mjc4MDAgLTAuMDAwMDAwIC0wLjY4NTgwMAordm4gLTAuNjczNDAwIC0wLjcyNDgwMCAtMC4xNDU1MDAKK3ZuIC0wLjcxMDYwMCAtMC42ODcwMDAgLTAuMTUxNTAwCit2biAwLjAwMDAwMCAtMC41Nzg2MDAgLTAuODE1NjAwCit2biAwLjk3ODAwMCAwLjAwMDAwMCAtMC4yMDg0MDAKK3ZuIDAuOTg2NjAwIDAuMDAwMDAwIDAuMTYzNDAwCit2biAwLjgzNDUwMCAwLjAwMDAwMCAwLjU1MTAwMAordm4gMC44ODE4MDAgMC4wMDAwMDAgMC40NzE2MDAKK3ZuIDAuODgxOTAwIC0wLjAwMDAwMCAwLjQ3MTQwMAordm4gMC4yMDU3MDAgLTAuNjg4MTAwIC0wLjY5NTgwMAordm4gMC4xODY5MDAgLTAuNzQzMjAwIC0wLjY0MjUwMAordm4gMC42NzYyMDAgLTAuNzI4MjAwIDAuMTExOTAwCit2biAwLjY3NjQwMCAtMC43MjgwMDAgMC4xMTIxMDAKK3ZuIDAuNTg3OTAwIC0wLjcxNjQwMCAwLjM3NTYwMAordm4gMC42MjA4MDAgLTAuNjY4NjAwIDAuNDA5NDAwCit2biAwLjYzODgwMCAtMC42MDY0MDAgLTAuNDczNTAwCit2biAwLjQ5MjgwMCAtMC42MDA1MDAgLTAuNjI5NzAwCit2biAwLjU0MzQwMCAtMC4wMDAwMDAgLTAuODM5NTAwCit2biAwLjU0MzEwMCAtMC4wMDAwMDAgLTAuODM5NzAwCit2biAwLjI4MzYwMCAwLjAwMDAwMCAtMC45NTkwMDAKK3ZuIDAuNTIyNDAwIC0wLjY5ODQwMCAtMC40ODkzMDAKK3ZuIDAuNDkwMzAwIC0wLjczOTEwMCAtMC40NjE4MDAKK3ZuIDAuNzI3ODAwIDAuMDAwMDAwIC0wLjY4NTgwMAordm4gMC42ODk4MDAgLTAuNzA4OTAwIC0wLjE0NzAwMAordm4gMC42NzM2MDAgLTAuNzI0OTAwIC0wLjE0NDMwMAordm4gMC4wMDAwMDAgLTAuNzAzMjAwIC0wLjcxMTAwMAordm4gMC4wMDAwMDAgLTAuNzAzMzAwIC0wLjcxMDkwMAordm4gMC44Mjk1MDAgLTAuNTU4NTAwIDAuMDAwMDAwCit2biAwLjk4MDAwMCAtMC4xOTkyMDAgMC4wMDAwMDAKK3ZuIC0wLjk3OTkwMCAtMC4xOTk2MDAgMC4wMDAwMDAKK3ZuIC0wLjgzMDIwMCAtMC41NTc0MDAgMC4wMDAwMDAKK3ZuIC0wLjU1OTIwMCAtMC44MjkwMDAgMC4wMDAwMDAKK3ZuIC0wLjIwNTUwMCAtMC45Nzg3MDAgMC4wMDAwMDAKK3ZuIDAuMTk2ODAwIC0wLjk4MDUwMCAwLjAwMDAwMAordm4gMC41NTk5MDAgLTAuODI4NjAwIDAuMDAwMDAwCit2biAtMC45ODAyMDAgMC4xOTgwMDAgMC4wMDAwMDAKK3ZuIC0wLjgyODMwMCAwLjU1MjQwMCAwLjA5MzgwMAordm4gLTAuODMyMjAwIDAuNTU0NDAwIDAuMDAwMDAwCit2biAtMC41NTYwMDAgMC44MzEyMDAgMC4wMDAwMDAKK3ZuIC0wLjU1NDcwMCAwLjgyOTgwMCAwLjA2MjIwMAordm4gLTAuMTk1NDAwIDAuOTgwNzAwIDAuMDAwMDAwCit2biAwLjE4NDMwMCAwLjk4MjkwMCAwLjAwMDAwMAordm4gMC41NjE2MDAgMC44Mjc0MDAgMC4wMDAwMDAKK3ZuIDAuODI5NjAwIDAuNTU4NDAwIDAuMDAwMDAwCit2biAwLjk4MDEwMCAwLjE5ODcwMCAwLjAwMDAwMAordm4gMC4wMDAwMDAgMS4wMDAwMDAgLTAuMDAwNTAwCit2biAtMC4yMDU1MDAgLTAuOTc4NzAwIC0wLjAwMDIwMAordm4gMC4wMDAwMDAgLTEuMDAwMDAwIC0wLjAwMDMwMAordm4gLTAuODMxOTAwIDAuNTU0OTAwIDAuMDAwMDAwCit2biAwLjE4NDQwMCAwLjk4MjkwMCAwLjAwMDAwMAordm4gMC44Mjk2MDAgMC41NTg0MDAgMC4wMDAxMDAKK3ZuIC0wLjcyNDEwMCAwLjY4OTcwMCAwLjAwMDAwMAordm4gLTAuNzIzMjAwIDAuNjkwNjAwIDAuMDAwMDAwCit2biAtMC43NTMzMDAgLTAuNjU3NzAwIDAuMDAwMjAwCit2biAtMC43NTYzMDAgLTAuNjU0MzAwIC0wLjAwMDAwMAordm4gLTAuNzQ5OTAwIC0wLjY2MTYwMCAwLjAwMDIwMAordm4gLTAuNzUzMzAwIC0wLjY1NzYwMCAtMC4wMDAwMDAKK3ZuIC0wLjcxODEwMCAtMC4wMDAwMDAgLTAuNjk1OTAwCit2biAtMC43MTI5MDAgLTAuMDAwMDAwIC0wLjcwMTIwMAordm4gLTAuNjkwMDAwIDAuMDAwMjAwIC0wLjcyMzgwMAordm4gLTAuNzU2MzAwIC0wLjY1NDMwMCAwLjAwMDEwMAordm4gLTAuNzU2NDAwIC0wLjY1NDEwMCAwLjAwMDAwMAordm4gMC4wMDAwMDAgMC4wMDAxMDAgLTEuMDAwMDAwCit2biAtMC42OTE0MDAgMC4wMDA1MDAgLTAuNzIyNDAwCit2biAtMC42OTAwMDAgMC4wMDAzMDAgLTAuNzIzODAwCit2biAtMC43MTgxMDAgLTAuMDAwMTAwIC0wLjY5NjAwMAordm4gLTAuNzE4NDAwIDAuMDAwMDAwIC0wLjY5NTYwMAordm4gLTAuNzI2MTAwIDAuNjg3NjAwIDAuMDAwMTAwCit2biAtMC43MjQyMDAgMC42ODk2MDAgMC4wMDAwMDAKK3ZuIDAuNzA3MTAwIDAuMDAwMDAwIC0wLjcwNzIwMAordm4gLTAuMDAwNTAwIC0xLjAwMDAwMCAtMC4wMDA0MDAKK3ZuIDAuODIwMTAwIC0wLjU3MjMwMCAwLjAwMDAwMAordm4gMC44MzUxMDAgMC41NTAxMDAgLTAuMDAwMDAwCit2biAwLjgzNTIwMCAwLjU0OTkwMCAtMC4wMDAxMDAKK3ZuIC0wLjk2NTEwMCAtMC4wMDAxMDAgLTAuMjYyMDAwCit2biAtMC45NjUxMDAgLTAuMDAwMDAwIC0wLjI2MjAwMAordm4gLTAuNTAyMjAwIC0wLjY5OTkwMCAtMC41MDc4MDAKK3ZuIC0wLjU1NzMwMCAtMC42MDUxMDAgLTAuNTY4NjAwCit2biAtMC43MDAxMDAgLTAuMDAwMDAwIC0wLjcxNDAwMAordm4gLTAuMTg4NTAwIC0wLjY5NzQwMCAtMC42OTE1MDAKK3ZuIC0wLjE4MjcwMCAtMC43MjI1MDAgLTAuNjY2ODAwCit2biAwLjcwNjQwMCAwLjAwMDAwMCAtMC43MDc4MDAKK3ZuIDAuNzMzMDAwIC0wLjY1MTMwMCAtMC4xOTYzMDAKK3ZuIDAuNjY2NDAwIC0wLjcyMzEwMCAtMC4xODE2MDAKK3ZuIDAuMjczODAwIDAuMDAwMDAwIC0wLjk2MTgwMAordm4gMC41OTk1MDAgLTAuNTM3NDAwIC0wLjU5MzIwMAordm4gMC41MDUyMDAgLTAuNjk5MDAwIC0wLjUwNjEwMAordm4gLTAuMzYxMTAwIC0wLjQyMzMwMCAtMC44MzA5MDAKK3ZuIC0wLjM2NjYwMCAtMC4zODQ0MDAgLTAuODQ3MzAwCit2biAwLjg0MTMwMCAtMC4zOTUxMDAgLTAuMzY5MDAwCit2biAwLjg1MjAwMCAtMC4zNjkyMDAgLTAuMzcxMjAwCit2biAwLjg0OTIwMCAtMC4zNjkwMDAgMC4zNzc3MDAKK3ZuIDAuODM5NTAwIC0wLjM5NTUwMCAwLjM3MjcwMAordm4gMC4zNzM1MDAgLTAuNDIzMzAwIDAuODI1NDAwCit2biAwLjM4MDMwMCAtMC4zODExMDAgMC44NDI3MDAKK3ZuIC0wLjgzODkwMCAtMC4zOTU2MDAgMC4zNzM5MDAKK3ZuIC0wLjg0OTYwMCAtMC4zNjkxMDAgMC4zNzY4MDAKK3ZuIC0wLjg1MTUwMCAtMC4zNjkwMDAgLTAuMzcyNTAwCit2biAtMC44NDE4MDAgLTAuMzk1MTAwIC0wLjM2NzcwMAordm4gMC4yMTA4MDAgLTAuODQ3NTAwIC0wLjQ4NzIwMAordm4gMC4xOTgyMDAgLTAuODc0MTAwIC0wLjQ0MzUwMAordm4gMC41MDIxMDAgLTAuODM2NTAwIC0wLjIxOTQwMAordm4gMC40NzY5MDAgLTAuODU0OTAwIC0wLjIwNDIwMAordm4gMC40NzMxMDAgLTAuODU1NjAwIDAuMjEwMDAwCit2biAwLjUwMTQwMCAtMC44MzcyMDAgMC4yMTg0MDAKK3ZuIC0wLjIxMzUwMCAtMC44NDY4MDAgMC40ODcxMDAKK3ZuIC0wLjIwMDQwMCAtMC44NzM3MDAgMC40NDMyMDAKK3ZuIC0wLjUwMDkwMCAtMC44MzY1MDAgMC4yMjIzMDAKK3ZuIC0wLjQ3NTkwMCAtMC44NTQ4MDAgMC4yMDcyMDAKK3ZuIC0wLjQ3NDEwMCAtMC44NTU4MDAgLTAuMjA3MDAwCit2biAtMC41MDI2MDAgLTAuODM3MzAwIC0wLjIxNTMwMAordm4gMC4zNzgwMDAgLTAuMzgyNDAwIC0wLjg0MzEwMAordm4gMC4zODUxMDAgLTAuNDI1ODAwIC0wLjgxODgwMAordm4gMC44NDE1MDAgLTAuMzk1MzAwIC0wLjM2ODIwMAordm4gMC44NDc2MDAgLTAuMzY3MzAwIC0wLjM4MjkwMAordm4gMC44NDkxMDAgLTAuMzY5MTAwIDAuMzc3ODAwCit2biAwLjgzMzcwMCAtMC4zOTc3MDAgMC4zODMwMDAKK3ZuIC0wLjM3NzcwMCAtMC40MDYyMDAgMC44MzIxMDAKK3ZuIC0wLjM4MDUwMCAtMC40MjQyMDAgMC44MjE3MDAKK3ZuIC0wLjgzOTEwMCAtMC4zOTU3MDAgMC4zNzM0MDAKK3ZuIC0wLjg0NTIwMCAtMC4zNjc0MDAgMC4zODgyMDAKK3ZuIC0wLjg1MTUwMCAtMC4zNjkwMDAgLTAuMzcyNjAwCit2biAtMC44MzY0MDAgLTAuMzk3MjAwIC0wLjM3NzgwMAordm4gLTAuNzk2NzAwIDAuMDAwNjAwIDAuNjA0NDAwCit2biAtMC43OTc2MDAgLTAuMDAwMzAwIDAuNjAzMjAwCit2biAtMC43OTI5MDAgMC4wMDA1MDAgMC42MDkzMDAKK3ZuIC0wLjc5ODYwMCAwLjAwMDAwMCAwLjYwMTkwMAordm4gLTAuNjM1MTAwIDAuNzcyNDAwIC0wLjAwMDEwMAordm4gLTAuNjM1NTAwIDAuNzcyMTAwIC0wLjAwMDEwMAordm4gLTAuNzkyOTAwIDAuMDAwMDAwIDAuNjA5MzAwCit2biAtMS4wMDAwMDAgLTAuMDAyOTAwIC0wLjAwMDIwMAordm4gLTEuMDAwMDAwIDAuMDAxNTAwIC0wLjAwMDAwMAordm4gLTEuMDAwMDAwIC0wLjAwMDcwMCAtMC4wMDMzMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAtMC4wMDA4MDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAtMC4wMDEwMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAtMC4wMDA5MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAxMDAgMC4wMDAxMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDEwMCAwLjAwMDMwMAordm4gLTEuMDAwMDAwIDAuMDAwMTAwIDAuMDAwMTAwCit2biAtMS4wMDAwMDAgMC4wMDA1MDAgLTAuMDAwMDAwCit2biAtMC4yNjkxMDAgLTAuOTAzMTAwIC0wLjMzNDUwMAordm4gLTAuMjQ2NDAwIC0wLjkwMzcwMCAtMC4zNTAxMDAKK3ZuIC0wLjIxMzEwMCAwLjM4MzcwMCAtMC44OTg1MDAKK3ZuIC0wLjIyODEwMCAwLjM3MjkwMCAtMC44OTk0MDAKK3ZuIC0wLjIyNjkwMCAtMC4zODU0MDAgLTAuODk0NDAwCit2biAtMC4yMTM2MDAgLTAuMzc4NDAwIC0wLjkwMDcwMAordm4gLTAuMjQxOTAwIDAuOTE5NTAwIC0wLjMwOTcwMAordm4gLTAuMjc1NzAwIDAuOTAzODAwIC0wLjMyNzMwMAordm4gLTAuNjkwOTAwIC0wLjY3NDIwMCAtMC4yNjExMDAKK3ZuIC0wLjY5MTQwMCAtMC42NzM2MDAgLTAuMjYxMDAwCit2biAtMC41OTkwMDAgMC4zMDc1MDAgLTAuNzM5MzAwCit2biAtMC41ODc5MDAgMC4zMDk5MDAgLTAuNzQ3MjAwCit2biAtMC42OTA4MDAgLTAuMjczODAwIC0wLjY2OTIwMAordm4gLTAuNTk4NTAwIC0wLjMxMDIwMCAtMC43Mzg3MDAKK3ZuIC0wLjU5MTUwMCAwLjc1NTMwMCAtMC4yODIzMDAKK3ZuIC0wLjY5ODQwMCAwLjY3MjkwMCAtMC4yNDM4MDAKK3ZuIC0wLjc5NzYwMCAtMC4wMDAxMDAgMC42MDMyMDAKK3ZuIC0wLjc5ODYwMCAtMC4wMDAxMDAgMC42MDE5MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAyMDAgLTAuMDAzMzAwCit2biAtMS4wMDAwMDAgLTAuMDAwMTAwIC0wLjAwMDEwMAordm4gLTEuMDAwMDAwIC0wLjAwMDYwMCAwLjAwMDMwMAordm4gLTAuNjM1NjAwIDAuNzcyMTAwIC0wLjAwMTQwMAordm4gLTAuNjQxMDAwIDAuNzY3NTAwIDAuMDAwMjAwCit2biAtMS4wMDAwMDAgLTAuMDAzMTAwIC0wLjAwMDgwMAordm4gLTEuMDAwMDAwIC0wLjAwNjAwMCAtMC4wMDAxMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAwMDAgMC4wMDA1MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAwMDAgMC4wMDAzMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDIwMCAtMC4wMDAwMDAKK3ZuIDAuMDAwMDAwIDEuMDAwMDAwIC0wLjAwMTgwMAordm4gMC4wMDAwMDAgMC4wMDA1MDAgMS4wMDAwMDAKK3ZuIC0wLjAwMDgwMCAtMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIC0wLjc5NzYwMCAwLjAwMjkwMCAtMC42MDMyMDAKK3ZuIC0wLjc5OTkwMCAwLjAwMDkwMCAtMC42MDAyMDAKK3ZuIC0wLjc5ODYwMCAwLjAwMDAwMCAtMC42MDE5MDAKK3ZuIC0wLjc5MjkwMCAwLjAwMDUwMCAtMC42MDkzMDAKK3ZuIC0wLjYzNTYwMCAwLjc3MjAwMCAwLjAwMDEwMAordm4gLTAuNjM1MzAwIDAuNzcyMzAwIDAuMDAwMTAwCit2biAtMC43OTI5MDAgMC4wMDAwMDAgLTAuNjA5MzAwCit2biAtMS4wMDAwMDAgMC4wMDE3MDAgMC4wMDAwMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDMwMDAgMC4wMDAyMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDA3MDAgMC4wMDMwMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDA2MDAgMC4wMDMwMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAwLjAwMTAwMAordm4gLTEuMDAwMDAwIDAuMDAwMDAwIDAuMDAwODAwCit2biAtMS4wMDAwMDAgLTAuMDAwMDAwIDAuMDAwOTAwCit2biAtMS4wMDAwMDAgMC4wMDAyMDAgLTAuMDAwMzAwCit2biAtMS4wMDAwMDAgMC4wMDAxMDAgLTAuMDAwMTAwCit2biAtMS4wMDAwMDAgLTAuMDAwMjAwIDAuMDAwMDAwCit2biAtMC4yNDY0MDAgLTAuOTAzNzAwIDAuMzUwMTAwCit2biAtMC4yNjkxMDAgLTAuOTAzMTAwIDAuMzM0NTAwCit2biAtMC4yMjgxMDAgMC4zNzI5MDAgMC44OTk0MDAKK3ZuIC0wLjIxMzEwMCAwLjM4MzcwMCAwLjg5ODUwMAordm4gLTAuMjEzNjAwIC0wLjM3ODMwMCAwLjkwMDcwMAordm4gLTAuMjI2OTAwIC0wLjM4NTQwMCAwLjg5NDQwMAordm4gLTAuMjc1NzAwIDAuOTAzODAwIDAuMzI3MzAwCit2biAtMC4yNDIwMDAgMC45MTk1MDAgMC4zMDk4MDAKK3ZuIC0wLjY5MTIwMCAtMC42NzM5MDAgMC4yNjEwMDAKK3ZuIC0wLjY5MTAwMCAtMC42NzQwMDAgMC4yNjEyMDAKK3ZuIC0wLjU4NzkwMCAwLjMwOTkwMCAwLjc0NzIwMAordm4gLTAuNTk5MDAwIDAuMzA3NTAwIDAuNzM5MzAwCit2biAtMC41OTg1MDAgLTAuMzEwMjAwIDAuNzM4NzAwCit2biAtMC42OTA4MDAgLTAuMjczODAwIDAuNjY5MjAwCit2biAtMC42OTgzMDAgMC42NzMwMDAgMC4yNDM4MDAKK3ZuIC0wLjU5MTUwMCAwLjc1NTMwMCAwLjI4MjMwMAordm4gLTAuNzk4NjAwIC0wLjAwMDEwMCAtMC42MDE5MDAKK3ZuIC0wLjc5NzYwMCAtMC4wMDAxMDAgLTAuNjAzMjAwCit2biAtMS4wMDAwMDAgLTAuMDAwMjAwIDAuMDAzMDAwCit2biAtMS4wMDAwMDAgLTAuMDAwNjAwIC0wLjAwMDMwMAordm4gLTAuNjMwOTAwIDAuNzc1OTAwIDAuMDAxNzAwCit2biAtMC42MzU1MDAgMC43NzIxMDAgMC4wMDA1MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDU5MDAgMC4wMDAxMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDMyMDAgMC4wMDA4MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDAwMDAgLTAuMDAwMzAwCit2biAtMS4wMDAwMDAgLTAuMDAwMDAwIC0wLjAwMDUwMAordm4gMC4wMDAwMDAgMS4wMDAwMDAgMC4wMDEwMDAKK3ZuIC0wLjAwMDcwMCAxLjAwMDAwMCAwLjAwMDYwMAordm4gLTAuMDAwNTAwIDAuMDAwNzAwIC0xLjAwMDAwMAordm4gMC4wMDAwMDAgMC4wMDEwMDAgLTEuMDAwMDAwCit2biAwLjAwMDAwMCAxLjAwMDAwMCAwLjAwMDkwMAordm4gMC4wMDAwMDAgMC4wMDA2MDAgLTEuMDAwMDAwCit2biAtMC4wMDAwMDAgMC4wMDA3MDAgLTEuMDAwMDAwCit2biAtMC43OTc2MDAgMC4wMDAyMDAgMC42MDMyMDAKK3ZuIC0wLjc5NjcwMCAtMC4wMDA1MDAgMC42MDQ0MDAKK3ZuIC0wLjc5NjYwMCAtMC4wMDAyMDAgMC42MDQ1MDAKK3ZuIC0wLjc5NzYwMCAwLjAwMDAwMCAwLjYwMzIwMAordm4gLTAuNjM1NTAwIC0wLjc3MjEwMCAtMC4wMDAxMDAKK3ZuIC0wLjYzNTAwMCAtMC43NzI1MDAgLTAuMDAwMTAwCit2biAtMC43OTQ4MDAgMC4wMDAwMDAgMC42MDY5MDAKK3ZuIC0wLjc5NjYwMCAtMC4wMDAwMDAgMC42MDQ1MDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDE1MDAgLTAuMDAwMDAwCit2biAtMS4wMDAwMDAgMC4wMDMwMDAgLTAuMDAwMjAwCit2biAtMS4wMDAwMDAgMC4wMDA0MDAgLTAuMDAzNDAwCit2biAtMS4wMDAwMDAgMC4wMDA1MDAgLTAuMDAzMzAwCit2biAtMS4wMDAwMDAgMC4wMDAwMDAgLTAuMDAyODAwCit2biAtMS4wMDAwMDAgMC4wMDAxMDAgLTAuMDAzMzAwCit2biAtMS4wMDAwMDAgMC4wMDA0MDAgMC4wMDAzMDAKK3ZuIC0wLjYzNzMwMCAtMC43NzA2MDAgMC4wMDAyMDAKK3ZuIC0wLjYzNTYwMCAtMC43NzIxMDAgLTAuMDAwMzAwCit2biAtMS4wMDAwMDAgMC4wMDYwMDAgLTAuMDAwMTAwCit2biAtMS4wMDAwMDAgMC4wMDMyMDAgLTAuMDAwODAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAwNDAwCit2biAwLjAwMDAwMCAtMC4wMDA0MDAgMS4wMDAwMDAKK3ZuIC0wLjc5NjQwMCAtMC4wMDA2MDAgLTAuNjA0ODAwCit2biAtMC43OTc2MDAgMC4wMDAyMDAgLTAuNjAzMjAwCit2biAtMC42MzUwMDAgLTAuNzcyNTAwIDAuMDAwMTAwCit2biAtMC42MzU3MDAgLTAuNzcxOTAwIDAuMDAwMTAwCit2biAtMC43OTQ4MDAgMC4wMDAwMDAgLTAuNjA2OTAwCit2biAtMS4wMDAwMDAgMC4wMDMwMDAgMC4wMDAyMDAKK3ZuIC0xLjAwMDAwMCAtMC4wMDE3MDAgMC4wMDAwMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDUwMCAwLjAwMzAwMAordm4gLTEuMDAwMDAwIDAuMDAwNDAwIDAuMDAzMTAwCit2biAtMS4wMDAwMDAgMC4wMDAwMDAgLTAuMDAwMjAwCit2biAtMS4wMDAwMDAgMC4wMDAxMDAgMC4wMDMwMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDEwMCAwLjAwMjYwMAordm4gLTEuMDAwMDAwIDAuMDAwNTAwIC0wLjAwMDMwMAordm4gLTAuNjM1NzAwIC0wLjc3MTkwMCAtMC4wMDE0MDAKK3ZuIC0wLjYzMzQwMCAtMC43NzM4MDAgLTAuMDAwODAwCit2biAtMS4wMDAwMDAgMC4wMDI5MDAgMC4wMDA4MDAKK3ZuIC0xLjAwMDAwMCAwLjAwNjIwMCAwLjAwMDEwMAordm4gMC4wMDAwMDAgLTAuMDAwNjAwIC0xLjAwMDAwMAordm4gLTAuMDAwMDAwIC0xLjAwMDAwMCAtMC4wMDE4MDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAtMC4wMDE5MDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAwLjAwMDIwMAordm4gLTAuNzk2NjAwIC0wLjAwMDIwMCAtMC42MDQ1MDAKK3ZuIC0wLjc5NzYwMCAwLjAwMDAwMCAtMC42MDMyMDAKK3ZuIC0xLjAwMDAwMCAwLjAwMDAwMCAwLjAwMTcwMAordm4gLTEuMDAwMDAwIDAuMDAwMDAwIDAuMDAyNjAwCit2biAtMC43OTY2MDAgLTAuMDAwMDAwIC0wLjYwNDUwMAordm4gMC4zNzc5MDAgLTAuMzgyMzAwIC0wLjg0MzMwMAordm4gMC4zNjkyMDAgLTAuNDI0MDAwIC0wLjgyNzAwMAordm4gLTAuMzgyMTAwIC0wLjM4MDIwMCAwLjg0MjMwMAordm4gLTAuMzczNjAwIC0wLjQyMzgwMCAwLjgyNTEwMAordm4gLTAuMjA0OTAwIC0wLjg0ODYwMCAtMC40ODc4MDAKK3ZuIC0wLjE5MzUwMCAtMC44NzM0MDAgLTAuNDQ2OTAwCit2biAwLjIxMzAwMCAtMC44NDY4MDAgMC40ODc0MDAKK3ZuIDAuMjAwMDAwIC0wLjg3MzYwMCAwLjQ0MzYwMAordm4gLTAuMzY3NzAwIC0wLjM4NDEwMCAtMC44NDY5MDAKK3ZuIC0wLjM3NDMwMCAtMC40MjQ2MDAgLTAuODI0NDAwCit2biAwLjM3NjcwMCAtMC40MDYzMDAgMC44MzI1MDAKK3ZuIDAuMzc5NTAwIC0wLjQyNDEwMCAwLjgyMjIwMAordm4gLTAuOTY2ODAwIDAuMDAwMDAwIC0wLjI1NTUwMAordm4gMC45NjUyMDAgLTAuMDAwMDAwIC0wLjI2MTMwMAordm4gLTAuOTY4MDAwIDAuMDAwMDAwIC0wLjI1MTEwMAordm4gMC45NjgzMDAgLTAuMDAwMDAwIC0wLjI0OTkwMAordm4gMC4wMDAxMDAgMS4wMDAwMDAgLTAuMDAxOTAwCit2biAtMC4wMDAwMDAgMS4wMDAwMDAgLTAuMDAyOTAwCit2biAtMC4wMDAxMDAgMS4wMDAwMDAgMC4wMDAyMDAKK3ZuIC0wLjAwMDEwMCAtMS4wMDAwMDAgLTAuMDAwMDAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAwNTAwCit2biAtMC4wMDEzMDAgLTEuMDAwMDAwIC0wLjAwMDMwMAordm4gLTAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwMDQwMAordm4gLTAuMDAxMzAwIC0xLjAwMDAwMCAwLjAwMDEwMAordm4gLTAuMDAwMTAwIC0xLjAwMDAwMCAwLjAwMDEwMAordm4gLTAuMDAwMDAwIC0wLjAxMTAwMCAtMC45OTk5MDAKK3ZuIDAuMDAwOTAwIDAuMDAyNjAwIC0xLjAwMDAwMAordm4gMC45NjQ3MDAgLTAuMDAwNzAwIC0wLjI2MzMwMAordm4gLTAuOTY4MTAwIDAuMDAwMDAwIC0wLjI1MDYwMAordm4gLTAuOTY4MjAwIDAuMDAwMTAwIC0wLjI1MDMwMAordm4gMC45NjgzMDAgLTAuMDAwNjAwIC0wLjI0OTgwMAordm4gLTAuMjg4MzAwIDAuMDAwMDAwIC0wLjk1NzYwMAordm4gLTAuMjg5MTAwIDAuMDAwMjAwIC0wLjk1NzMwMAordm4gMC4yOTk2MDAgLTAuMDAwMjAwIC0wLjk1NDEwMAordm4gMC4yOTY5MDAgLTAuMDAwMDAwIC0wLjk1NDkwMAordm4gLTAuOTQ5NzAwIC0wLjAwMDMwMCAwLjMxMzIwMAordm4gLTAuOTQ2NTAwIDAuMDAwMDAwIDAuMzIyODAwCit2biAtMC44MTA3MDAgLTAuMDAwMzAwIC0wLjU4NTUwMAordm4gMC44ODE1MDAgLTAuMDAwMDAwIDAuNDcyMzAwCit2biAwLjU0MjEwMCAtMC4wMDAwMDAgLTAuODQwMzAwCit2biAwLjI4MzYwMCAwLjAwMDAwMCAtMC45NTg5MDAKK3ZuIC0wLjAwMDgwMCAtMS4wMDAwMDAgLTAuMDAxMTAwCit2biAwLjAwMDAwMCAwLjcwNzAwMCAtMC43MDczMDAKK3ZuIDAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwNDYwMAordm4gLTAuMDAwMDAwIDEuMDAwMDAwIDAuMDAyMDAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDA3MDAKK3ZuIDAuNDE0OTAwIC0wLjkwOTkwMCAwLjAwNDkwMAordm4gMC40MTQ4MDAgLTAuOTA5OTAwIDAuMDA0MjAwCit2biAwLjc1MzgwMCAwLjAwMDAwMCAtMC42NTcxMDAKK3ZuIDAuNzUzODAwIDAuMDAwMDAwIC0wLjY1NzIwMAordm4gMC43NTM3MDAgMC4wMDAwMDAgLTAuNjU3MjAwCit2biAwLjI0MzgwMCAwLjk2OTgwMCAwLjAwMDQwMAordm4gMC4yNDEyMDAgMC45NzA1MDAgMC4wMDE5MDAKK3ZuIDAuNDIxMTAwIC0wLjkwNzAwMCAwLjAwMjQwMAordm4gMC40MTgwMDAgLTAuOTA4NTAwIDAuMDAwNjAwCit2biAwLjc3MjIwMCAwLjAwMDAwMCAwLjYzNTQwMAordm4gMC4yNDI1MDAgMC45NzAxMDAgMC4wMDAxMDAKK3ZuIDAuMjQyMjAwIDAuOTcwMjAwIDAuMDAwOTAwCit2biAwLjI0MjUwMCAwLjk3MDIwMCAwLjAwMDAwMAordm4gMC4yNDI0MDAgMC45NzAyMDAgLTAuMDAwMDAwCit2biAwLjQxNzYwMCAtMC45MDg2MDAgMC4wMDAwMDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgLTAuMDAxNDAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIC0wLjAwMTMwMAordm4gMC4yNDEzMDAgMC45NzA1MDAgMC4wMDE5MDAKK3ZuIDAuNDE4MjAwIC0wLjkwODQwMCAtMC4wMDA2MDAKK3ZuIDAuNDE3MDAwIC0wLjkwODkwMCAtMC4wMDEyMDAKK3ZuIDAuNzc0MDAwIDAuMDAwMDAwIDAuNjMzMjAwCit2biAwLjQxNzcwMCAtMC45MDg2MDAgMC4wMDAwMDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDQ1MDAKK3ZuIC0wLjcxMjMwMCAtMC4wMDAwMDAgLTAuNzAxOTAwCit2biAwLjMzMTUwMCAwLjAwMDAwMCAtMC45NDM0MDAKK3ZuIC0wLjE5OTUwMCAtMC4wMDAwMDAgLTAuOTc5OTAwCit2biAwLjcxMjAwMCAwLjAwMDAwMCAtMC43MDIyMDAKK3ZuIC0wLjQ1NDEwMCAwLjAwMDAwMCAtMC44OTEwMDAKK3ZuIDAuMTUxNjAwIDAuMDAwMDAwIC0wLjk4ODQwMAordm4gLTAuOTk5NTAwIDAuMDMyMzAwIC0wLjAwMDAwMAordm4gMC4zMzIzMDAgMC45NDMyMDAgMC4wMDAwMDAKK3ZuIDAuNzg2MTAwIDAuNjE4MTAwIDAuMDAwMDAwCit2biAwLjk4MzMwMCAwLjE4MTgwMCAwLjAwMDAwMAordm4gMC45NzE0MDAgLTAuMjM3NjAwIDAuMDAwMDAwCit2biAwLjY0OTYwMCAtMC43NjAzMDAgMC4wMDAwMDAKK3ZuIC0wLjExNDUwMCAtMC45OTM0MDAgLTAuMDAwMDAwCit2biAtMC43MDk5MDAgLTAuNzA0MzAwIC0wLjAwMDAwMAordm4gLTAuOTM5MzAwIC0wLjM0MzAwMCAtMC4wMDAwMDAKK3ZuIC0wLjk4ODYwMCAtMC4xNTA2MDAgLTAuMDAwMDAwCit2biAtMC45ODkzMDAgLTAuMTQ1ODAwIC0wLjAwMDAwMAordm4gLTAuOTQ4NzAwIC0wLjMxNjEwMCAtMC4wMDAwMDAKK3ZuIC0wLjczMDEwMCAtMC42ODMzMDAgLTAuMDAwMDAwCit2biAtMC4wNjE4MDAgLTAuOTk4MTAwIDAuMDAwMDAwCit2biAwLjcxMTAwMCAtMC43MDMyMDAgLTAuMDAwMDAwCit2biAwLjcxMTAwMCAtMC43MDMyMDAgLTAuMDAwMTAwCit2biAwLjk3OTIwMCAtMC4yMDI4MDAgLTAuMDAwMDAwCit2biAwLjk4MDcwMCAwLjE5NTQwMCAwLjAwMDAwMAordm4gMC43OTc3MDAgMC42MDMwMDAgMC4wMDAwMDAKK3ZuIDAuMzQ0MzAwIDAuOTM4OTAwIDAuMDAwMDAwCit2biAwLjk5OTEwMCAtMC4wNDIxMDAgMC4wMDAwMDAKK3ZuIC0wLjMzMjUwMCAtMC45NDMxMDAgLTAuMDAwMDAwCit2biAtMC43NzUxMDAgLTAuNjMxOTAwIC0wLjAwMDAwMAordm4gLTAuOTc3MjAwIC0wLjIxMjQwMCAtMC4wMDAwMDAKK3ZuIC0wLjk3NzIwMCAtMC4yMTIzMDAgLTAuMDAwMDAwCit2biAtMC45NzA4MDAgMC4yMzk5MDAgLTAuMDAwMDAwCit2biAtMC42NDU3MDAgMC43NjM2MDAgLTAuMDAwMDAwCit2biAwLjExNzMwMCAwLjk5MzEwMCAwLjAwMDAwMAordm4gMC43MDg1MDAgMC43MDU3MDAgMC4wMDAwMDAKK3ZuIDAuOTM4NjAwIDAuMzQ1MDAwIDAuMDAwMDAwCit2biAwLjk4ODUwMCAwLjE1MTAwMCAwLjAwMDAwMAordm4gMC45ODk0MDAgMC4xNDUwMDAgMC4wMDAwMDAKK3ZuIDAuOTQ5OTAwIDAuMzEyNzAwIDAuMDAwMDAwCit2biAwLjczMjcwMCAwLjY4MDYwMCAwLjAwMDAwMAordm4gMC4wNTMyMDAgMC45OTg2MDAgLTAuMDAwMDAwCit2biAtMC43MTk5MDAgMC42OTQxMDAgMC4wMDAwMDAKK3ZuIC0wLjk4NzYwMCAtMC4xNTY3MDAgLTAuMDAwMDAwCit2biAtMC44MTQ1MDAgLTAuNTgwMjAwIC0wLjAwMDAwMAordm4gLTAuMzQ2NzAwIC0wLjkzODAwMCAtMC4wMDAwMDAKK3ZuIC0wLjg2MjYwMCAwLjUwNTkwMCAtMC4wMDAwMDAKK3ZuIC0wLjg2MjYwMCAwLjUwNjAwMCAwLjAwMDAwMAordm4gLTAuOTk0MzAwIDAuMTA3MTAwIC0wLjAwMDAwMAordm4gLTAuOTAzNDAwIC0wLjQyODgwMCAwLjAwMDAwMAordm4gLTAuNDQ5NTAwIC0wLjg5MzMwMCAtMC4wMDAwMDAKK3ZuIDAuMDA0MjAwIC0xLjAwMDAwMCAtMC4wMDAwMDAKK3ZuIDAuMDAxMTAwIDEuMDAwMDAwIC0wLjAwMDAwMAordm4gMC40NTc5MDAgMC44ODkwMDAgMC4wMDAwMDAKK3ZuIDAuOTAyNTAwIDAuNDMwNzAwIDAuMDAwMDAwCit2biAwLjk5ODMwMCAtMC4wNTg3MDAgMC4wMDAwMDAKK3ZuIDAuODcxNDAwIC0wLjQ5MDUwMCAwLjAwMDAwMAordm4gLTAuNjcyNDAwIDAuNzQwMjAwIC0wLjAwMDAwMAordm4gMC42NzI1MDAgLTAuNzQwMTAwIDAuMDAwMDAwCit2biAwLjEwMjMwMCAtMC45OTQ4MDAgMC4wMDAwMDAKK3ZuIC0wLjk4OTQwMCAwLjE0NTAwMCAtMC4wMDAwMDAKK3ZuIC0wLjY5MDAwMCAtMC43MjM4MDAgMC4wMDAwMDAKK3ZuIC0wLjk5MjYwMCAtMC4xMjE3MDAgLTAuMDAwMDAwCit2biAwLjA3NDkwMCAwLjk5NzIwMCAtMC4wMDAwMDAKK3ZuIDAuNjkwMDAwIDAuNzIzODAwIC0wLjAwMDAwMAordm4gMC42NzM1MDAgLTAuNzM5MjAwIDAuMDAwMDAwCit2biAtMC42NzM3MDAgMC43MzkwMDAgMC4wMDAwMDAKK3ZuIC0wLjA1OTkwMCAwLjk5ODIwMCAtMC4wMDAwMDAKK3ZuIDAuOTkzMTAwIC0wLjExNzIwMCAwLjAwMDAwMAordm4gMC42ODE0MDAgMC43MzE5MDAgLTAuMDAwMDAwCit2biAwLjk5NjYwMCAwLjA4MjAwMCAwLjAwMDAwMAordm4gLTAuMTE5NjAwIC0wLjk5MjgwMCAtMC4wMDAwMDAKK3ZuIC0wLjY3ODgwMCAtMC43MzQzMDAgMC4wMDAwMDAKK3ZuIDAuNzQ1MzAwIC0wLjY2NjgwMCAwLjAwMDAwMAordm4gLTAuNzM5NzAwIC0wLjY3MzAwMCAtMC4wMDAwMDAKK3ZuIC0wLjc3NjQwMCAwLjYzMDIwMCAtMC4wMDAwMDAKK3ZuIC0wLjc3NjQwMCAwLjYzMDMwMCAwLjAwMDAwMAordm4gLTAuOTQxOTAwIDAuMzM1OTAwIC0wLjAwMDAwMAordm4gLTAuOTk3NTAwIDAuMDcwMDAwIC0wLjAwMDAwMAordm4gLTAuODk5MzAwIC0wLjQzNzQwMCAtMC4wMDAwMDAKK3ZuIC0wLjQ1ODIwMCAtMC44ODg4MDAgLTAuMDAwMDAwCit2biAwLjYxMzYwMCAtMC43ODk2MDAgMC4wMDAwMDAKK3ZuIDAuOTM3MjAwIC0wLjM0ODgwMCAwLjAwMDAwMAordm4gMC45NzY5MDAgMC4yMTM2MDAgMC4wMDAwMDAKK3ZuIDAuNzQ5OTAwIDAuNjYxNTAwIDAuMDAwMDAwCit2biAwLjI5NDcwMCAwLjk1NTYwMCAtMC4wMDAwMDAKK3ZuIDAuMDAwNzAwIDEuMDAwMDAwIC0wLjAwMDAwMAordm4gLTAuMDAxMDAwIC0xLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuMDAxMTAwIC0xLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuMjgxOTAwIC0wLjk1OTQwMCAwLjAwMDAwMAordm4gLTAuNjYzNzAwIC0wLjc0ODAwMCAwLjAwMDAwMAordm4gLTAuOTc5NDAwIC0wLjIwMTcwMCAtMC4wMDAwMDAKK3ZuIC0wLjkzMjYwMCAwLjM2MDkwMCAtMC4wMDAwMDAKK3ZuIC0wLjU4NzQwMCAwLjgwOTMwMCAwLjAwMDAwMAordm4gMC40Nzc3MDAgMC44Nzg1MDAgMC4wMDAwMDAKK3ZuIDAuOTk5MDAwIC0wLjA0MzYwMCAwLjAwMDAwMAordm4gMC45MjgxMDAgLTAuMzcyNDAwIDAuMDAwMDAwCit2biAwLjg2MjUwMCAtMC41MDYwMDAgMC4wMDAwMDAKK3ZuIDAuOTk0MzAwIC0wLjEwNzEwMCAwLjAwMDAwMAordm4gMC45MDM0MDAgMC40Mjg4MDAgMC4wMDAwMDAKK3ZuIDAuNDQ5NTAwIDAuODkzMzAwIDAuMDAwMDAwCit2biAtMC4wMDUxMDAgMS4wMDAwMDAgLTAuMDAwMDAwCit2biAtMC4wMDA5MDAgLTEuMDAwMDAwIC0wLjAwMDEwMAordm4gLTAuMDAwOTAwIC0xLjAwMDAwMCAtMC4wMDAwMDAKK3ZuIC0wLjQ1ODAwMCAtMC44ODkwMDAgMC4wMDAwMDAKK3ZuIC0wLjkwMjUwMCAtMC40MzA4MDAgMC4wMDAwMDAKK3ZuIC0wLjk5ODMwMCAwLjA1ODcwMCAtMC4wMDAwMDAKK3ZuIC0wLjg3MTQwMCAwLjQ5MDUwMCAtMC4wMDAwMDAKK3ZuIC0wLjAwNDUwMCAtMS4wMDAwMDAgMC4wMDAwMDAKK3ZuIC0wLjA1ODkwMCAwLjk5ODMwMCAwLjAwMDAwMAordm4gMC44Nzg5MDAgMC40NzcwMDAgLTAuMDAwMDAwCit2biAtMC4wMDEwMDAgMS4wMDAwMDAgLTAuMDAwMDAwCit2biAtMC4wMDI5MDAgLTEuMDAwMDAwIC0wLjAwMDAwMAordm4gMC4wMDEzMDAgLTEuMDAwMDAwIDAuMDAwMDAwCit2biAwLjAwMjYwMCAxLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuODcxNDAwIDAuNDkwNjAwIC0wLjAwMDAwMAordm4gLTAuODcxNDAwIDAuNDkwNzAwIC0wLjAwMDAwMAordm4gLTAuMDAxMTAwIDEuMDAwMDAwIC0wLjAwMDAwMAordm4gLTAuNzc2MzAwIDAuNjMwNDAwIDAuMDAwMDAwCit2biAtMC43NzYzMDAgMC42MzA0MDAgLTAuMDAwMTAwCit2biAwLjY3MjQwMCAtMC43NDAyMDAgMC4wMDAwMDAKK3ZuIC0wLjY3MjQwMCAwLjc0MDEwMCAtMC4wMDAwMDAKK3ZuIC0wLjY3MjUwMCAwLjc0MDEwMCAtMC4wMDAwMDAKK3ZuIC0wLjAwMDcwMCAtMS4wMDAwMDAgMC4wMDAxMDAKK3ZuIC0wLjAwMDcwMCAtMS4wMDAwMDAgLTAuMDAwMDAwCit2biAtMC43Mzk2MDAgLTAuNjczMDAwIC0wLjAwMDAwMAordm4gMC42NzM0MDAgLTAuNzM5MzAwIDAuMDAwMDAwCit2biAtMC42ODk5MDAgLTAuNzIzOTAwIC0wLjAwMDAwMAordm4gMC4zNDQyMDAgMC45Mzg5MDAgMC4wMDAwMDAKK3ZuIC0wLjM0NjYwMCAtMC45MzgwMDAgLTAuMDAwMDAwCit2biAtMC44NjI1MDAgMC41MDYwMDAgMC4wMDAwMDAKK3ZuIDAuODcxNDAwIC0wLjQ5MDYwMCAwLjAwMDAwMAordm4gMC4wMDEwMDAgMS4wMDAwMDAgMC4wMDAwMDAKK3ZuIDAuNjkwMDAwIDAuNzIzOTAwIDAuMDAwMDAwCit2biAwLjY4OTkwMCAwLjcyMzkwMCAwLjAwMDAwMAordm4gMC43MTM5MDAgMC4wMDAwMDAgMC43MDAzMDAKK3ZuIDAuNzEzODAwIDAuMDAwMDAwIDAuNzAwMzAwCit2biAtMC43MTM4MDAgMC4wMDAwMDAgMC43MDAzMDAKK3ZuIC0wLjcxMzkwMCAwLjAwMDAwMCAwLjcwMDMwMAordm4gLTAuOTgwMzAwIC0wLjE5NzMwMCAwLjAwMDAwMAordm4gLTAuODI4MzAwIC0wLjU2MDIwMCAwLjAwMDAwMAordm4gLTAuNTYwNDAwIC0wLjgyODMwMCAwLjAwMDAwMAordm4gLTAuMTkxNjAwIC0wLjk4MTUwMCAwLjAwMDAwMAordm4gMC4yMDM0MDAgLTAuOTc5MTAwIDAuMDAwMTAwCit2biAwLjIwMzQwMCAtMC45NzkxMDAgMC4wMDAwMDAKK3ZuIDAuOTgwMjAwIC0wLjE5ODAwMCAwLjAwMDAwMAordm4gMC44MzA0MDAgLTAuNTU3MjAwIDAuMDAwMDAwCit2biAwLjU1NzcwMCAtMC44MzAwMDAgMC4wMDAwMDAKK3ZuIC0wLjcwNjAwMCAtMC4xMzQ1MDAgLTAuNjk1MzAwCit2biAtMC42OTIwMDAgLTAuMTM5MzAwIC0wLjcwODMwMAordm4gLTAuNTg5NTAwIC0wLjM5OTYwMCAtMC43MDIwMDAKK3ZuIC0wLjU5MDkwMCAtMC4zOTk2MDAgLTAuNzAwODAwCit2biAtMC4zOTkxMDAgLTAuNTg5OTAwIC0wLjcwMTkwMAordm4gLTAuMTQzOTAwIC0wLjcwNzMwMCAtMC42OTIyMDAKK3ZuIC0wLjEzNjYwMCAtMC42OTk0MDAgLTAuNzAxNjAwCit2biAwLjAwMDAwMCAtMC43MjE4MDAgLTAuNjkyMTAwCit2biAwLjE0ODkwMCAtMC42OTYwMDAgLTAuNzAyNDAwCit2biAwLjE0NjIwMCAtMC43MDMzMDAgLTAuNjk1NzAwCit2biAwLjM5NzMwMCAtMC41OTE0MDAgLTAuNzAxODAwCit2biAwLjM5NzMwMCAtMC41OTEzMDAgLTAuNzAxODAwCit2biAwLjU4OTcwMCAtMC4zOTI0MDAgLTAuNzA1OTAwCit2biAwLjU5MTYwMCAtMC4zOTcwMDAgLTAuNzAxNzAwCit2biAwLjY5MjMwMCAtMC4xMzYwMDAgLTAuNzA4NjAwCit2biAwLjY5NzYwMCAtMC4xNDA5MDAgLTAuNzAyNTAwCit2biAtMC40NDAyMDAgLTAuMTAwNDAwIC0wLjg5MjMwMAordm4gLTAuNDEwMjAwIC0wLjA3ODEwMCAtMC45MDg3MDAKK3ZuIC0wLjMzMjQwMCAtMC4yMjE4MDAgLTAuOTE2NzAwCit2biAtMC4zMzUyMDAgLTAuMjI3MjAwIC0wLjkxNDMwMAordm4gLTAuMTkwMzAwIC0wLjM0NDkwMCAtMC45MTkxMDAKK3ZuIC0wLjE4ODAwMCAtMC4yNzc4MDAgLTAuOTQyMTAwCit2biAtMC4wNjg3MDAgLTAuMzI1NTAwIC0wLjk0MzAwMAordm4gLTAuMDY1MzAwIC0wLjMyMTUwMCAtMC45NDQ2MDAKK3ZuIC0wLjAxMjcwMCAtMC4zMjU5MDAgLTAuOTQ1MzAwCit2biAwLjA2NjQwMCAtMC4zMTcxMDAgLTAuOTQ2MTAwCit2biAwLjA3MTcwMCAtMC4zMjI5MDAgLTAuOTQzNzAwCit2biAwLjE2NTYwMCAtMC4yODM4MDAgLTAuOTQ0NTAwCit2biAwLjIwNDEwMCAtMC4zMDM4MDAgLTAuOTMwNjAwCit2biAwLjMyNTMwMCAtMC4xODQzMDAgLTAuOTI3NTAwCit2biAwLjI3NDUwMCAtMC4xODI3MDAgLTAuOTQ0MTAwCit2biAwLjMyNTEwMCAtMC4wNjM5MDAgLTAuOTQzNTAwCit2biAtMC45ODAzMDAgLTAuMTk3MzAwIC0wLjAwMDEwMAordm4gLTAuODI4MzAwIC0wLjU2MDIwMCAtMC4wMDAxMDAKK3ZuIC0wLjE5MTUwMCAtMC45ODE1MDAgMC4wMDAwMDAKK3ZuIC0wLjE5MTYwMCAtMC45ODE1MDAgMC4wMDAzMDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDIxMDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDE5MDAKK3ZuIDAuMjAzMzAwIC0wLjk3OTEwMCAwLjAwMDMwMAordm4gMC4wMDA2MDAgLTAuNjY2MjAwIC0wLjc0NTgwMAordm4gMC4xMTI3MDAgLTAuNDk3MjAwIC0wLjg2MDMwMAordm4gMC4wMDAwMDAgLTAuMzI3NzAwIC0wLjk0NDgwMAordm4gMC4wMDAwMDAgLTAuMTUwMjAwIC0wLjk4ODcwMAordm4gMC4wMDAwMDAgLTAuMTUwMTAwIC0wLjk4ODcwMAordm4gLTAuMTkzNTAwIC0wLjA0OTYwMCAtMC45Nzk4MDAKK3ZuIC0wLjE4MzkwMCAtMC4wNDIwMDAgLTAuOTgyMDAwCit2biAtMC4xMTU2MDAgLTAuMDk4MzAwIC0wLjk4ODQwMAordm4gLTAuMTUzNjAwIC0wLjEwMjUwMCAtMC45ODI4MDAKK3ZuIC0wLjA2MzEwMCAtMC4xMjc1MDAgLTAuOTg5ODAwCit2biAtMC4wNzM0MDAgLTAuMTMyOTAwIC0wLjk4ODQwMAordm4gLTAuMDMzNTAwIC0wLjE0NjcwMCAtMC45ODg2MDAKK3ZuIC0wLjAyODgwMCAtMC4xNDE4MDAgLTAuOTg5NTAwCit2biAwLjAwMDAwMCAtMC4xNTAzMDAgLTAuOTg4NjAwCit2biAwLjAzNDMwMCAtMC4xNDY4MDAgLTAuOTg4NjAwCit2biAwLjAyOTgwMCAtMC4xNDIyMDAgLTAuOTg5NDAwCit2biAwLjA3MzEwMCAtMC4xMjQ2MDAgLTAuOTg5NTAwCit2biAwLjA3MzEwMCAtMC4xMjUyMDAgLTAuOTg5NDAwCit2biAwLjEzMTAwMCAtMC4wNzY5MDAgLTAuOTg4NDAwCit2biAwLjEyOTYwMCAtMC4wNzM0MDAgLTAuOTg4OTAwCit2biAwLjE0OTAwMCAtMC4wMjg4MDAgLTAuOTg4NDAwCit2biAwLjE0OTYwMCAtMC4wMjk0MDAgLTAuOTg4MzAwCit2biAwLjAwMTcwMCAtMC4zMjE2MDAgLTAuOTQ2OTAwCit2biAwLjAwMDEwMCAtMC4zMTc0MDAgLTAuOTQ4MzAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAyMzAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAxNzAwCit2biAwLjAwMDAwMCAtMC4xNTAyMDAgLTAuOTg4NjAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAyMjAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAyMDAwCit2biAtMC4wMDAwMDAgLTEuMDAwMDAwIDAuMDAxODAwCit2biAwLjAwMDEwMCAtMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIC0wLjAwMDEwMCAtMC4wMDAwMDAgMS4wMDAwMDAKK3ZuIC0wLjcwNjYwMCAtMC4xNDIyMDAgMC42OTMxMDAKK3ZuIC0wLjY5OTQwMCAtMC4xNDEwMDAgMC43MDA2MDAKK3ZuIC0wLjU5MDQwMCAtMC4zOTkzMDAgMC43MDE0MDAKK3ZuIC0wLjU5MTkwMCAtMC40MDAzMDAgMC42OTk2MDAKK3ZuIC0wLjQwMDYwMCAtMC41OTIyMDAgMC42OTkyMDAKK3ZuIC0wLjM5OTgwMCAtMC41OTEwMDAgMC43MDA3MDAKK3ZuIC0wLjEzNjcwMCAtMC43MDA3MDAgMC43MDAzMDAKK3ZuIC0wLjEwODYwMCAtMC41NzQ2MDAgMC44MTEyMDAKK3ZuIDAuMTE5NTAwIC0wLjU3NTcwMCAwLjgwODkwMAordm4gMC4xNDEwMDAgLTAuNzAwNTAwIDAuNjk5NjAwCit2biAwLjcwMDIwMCAtMC4xNDE1MDAgMC42OTk4MDAKK3ZuIDAuNzA2NTAwIC0wLjE0MjkwMCAwLjY5MzEwMAordm4gMC41OTIzMDAgLTAuMzk3NDAwIDAuNzAwODAwCit2biAwLjU5MzYwMCAtMC4zOTg0MDAgMC42OTkyMDAKK3ZuIDAuMzk4MzAwIC0wLjU5MjgwMCAwLjcwMDAwMAordm4gMC4zOTc2MDAgLTAuNTkxNzAwIDAuNzAxMzAwCit2biAtMC4wMDAwMDAgLTAuNTgzMDAwIDAuODEyNTAwCit2biAtMC4wMDAwMDAgLTAuNTgzMTAwIDAuODEyNDAwCit2biAtMC4wMDAwMDAgLTAuNTgzMDAwIDAuODEyNDAwCit2biAtMC4wMDAwMDAgLTAuNTgzMjAwIDAuODEyNDAwCit2biAtMC4xOTE0MDAgLTAuOTgxNTAwIDAuMDAwMDAwCit2biAtMC4xOTE1MDAgLTAuOTgxNTAwIDAuMDAyMDAwCit2biAwLjIwMzIwMCAtMC45NzkxMDAgMC4wMDE4MDAKK3ZuIDAuMjAzMzAwIC0wLjk3OTEwMCAwLjAwMDAwMAordm4gMC4wMDAwMDAgLTAuMzI3ODAwIC0wLjk0NDgwMAordm4gLTAuMDQxODAwIC0wLjcwMjEwMCAtMC43MTA5MDAKK3ZuIC0wLjAwNTQwMCAtMC43MjE4MDAgLTAuNjkyMTAwCit2biAtMC4wMDAzMDAgLTEuMDAwMDAwIDAuMDAwODAwCit2biAwLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDA1MDAKK3ZuIDAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwMDgwMAordm4gMC4wMDAxMDAgLTEuMDAwMDAwIDAuMDAwMjAwCit2biAwLjgyOTQwMCAtMC4wMDAwMDAgMC41NTg3MDAKK3ZuIDAuODMwNjAwIDAuMDAwMjAwIDAuNTU2OTAwCit2biAwLjgyOTcwMCAtMC4wMDAxMDAgMC41NTgyMDAKK3ZuIDAuODI5ODAwIC0wLjAwMDAwMCAwLjU1ODEwMAordm4gMC4zNzkxMDAgLTAuMDAwMDAwIDAuOTI1NDAwCit2biAwLjM3OTAwMCAtMC4wMDAxMDAgMC45MjU0MDAKK3ZuIC0wLjM3OTQwMCAtMC4wMDAxMDAgMC45MjUyMDAKK3ZuIC0wLjM3OTQwMCAtMC4wMDAyMDAgMC45MjUyMDAKK3ZuIC0wLjgyNTQwMCAtMC4wMDAwMDAgMC41NjQ1MDAKK3ZuIC0wLjgyNTUwMCAtMC4wMDAxMDAgMC41NjQ0MDAKK3ZuIC0wLjgyOTAwMCAwLjAwMDIwMCAwLjU1OTMwMAordm4gLTAuODMwMDAwIC0wLjAwMDAwMCAwLjU1NzgwMAordm4gMC4wMDAwMDAgLTAuMDAwMjAwIDEuMDAwMDAwCit2biAtMC43ODA3MDAgMC4wMDAyMDAgMC42MjQ5MDAKK3ZuIC0wLjc4MDIwMCAwLjAwMDIwMCAwLjYyNTUwMAordm4gMC44ODQ3MDAgMC4wMDAyMDAgMC40NjYxMDAKK3ZuIDAuODc4NDAwIDAuMDAxMjAwIDAuNDc4MDAwCit2biAwLjMxOTIwMCAtMC40MzUxMDAgMC44NDE5MDAKK3ZuIDAuMjQxOTAwIC0wLjUxMzUwMCAwLjgyMzMwMAordm4gMC42MDY1MDAgLTAuNjQ1MTAwIDAuNDY0NzAwCit2biAwLjU1MDcwMCAtMC43NTAyMDAgMC4zNjU4MDAKK3ZuIDAuNTYyNzAwIC0wLjc0MDMwMCAwLjM2NzgwMAordm4gMC42MjIyMDAgLTAuNjYxODAwIDAuNDE4MzAwCit2biAwLjI3NjgwMCAtMC42ODM4MDAgMC42NzUxMDAKK3ZuIDAuMjc4OTAwIC0wLjY3NzQwMCAwLjY4MDcwMAordm4gMC4wMDAwMDAgLTAuNzExOTAwIDAuNzAyMzAwCit2biAtMC4wMDAwMDAgLTAuNzExNzAwIDAuNzAyNTAwCit2biAtMC4yNDgxMDAgLTAuNzUwOTAwIDAuNjEyMDAwCit2biAtMC4yNzEwMDAgLTAuNzAwMjAwIDAuNjYwNTAwCit2biAtMC41NzAxMDAgLTAuNzI2MDAwIDAuMzg0NTAwCit2biAtMC41Mzg4MDAgLTAuNzU3NzAwIDAuMzY4MzAwCit2biAtMC41Mzc0MDAgLTAuNzUyMzAwIDAuMzgxMDAwCit2biAtMC41NzExMDAgLTAuNzI3MzAwIDAuMzgwNzAwCit2biAtMC4zNDIyMDAgLTAuNDMyMTAwIDAuODM0NDAwCit2biAtMC4zMTI3MDAgLTAuNDM3NzAwIDAuODQzMDAwCit2biAwLjI4MzQwMCAwLjAwMDMwMCAwLjk1OTAwMAordm4gMC4yODU3MDAgMC4wMDA1MDAgMC45NTgzMDAKK3ZuIC0wLjM4NzEwMCAtMC4wMDAyMDAgMC45MjIwMDAKK3ZuIC0wLjM4MTQwMCAwLjAwMDIwMCAwLjkyNDQwMAordm4gMC4wMDAwMDAgLTAuNzE5MzAwIDAuNjk0NzAwCit2biAwLjAwMDEwMCAtMC43MTE5MDAgMC43MDIzMDAKK3ZuIC0wLjAwMDAwMCAtMC43MjcyMDAgMC42ODY0MDAKK3ZuIC0wLjAwMDAwMCAtMC43Mjc0MDAgMC42ODYyMDAKK3ZuIC0wLjcxMjMwMCAtMC4wMDAwMDAgLTAuNzAxODAwCit2biAtMC44MjkwMDAgMC41NTkyMDAgMC4wMDAwMDAKK3ZuIC0wLjk4MDAwMCAwLjE5ODkwMCAwLjAwMDAwMAordm4gLTAuNTU5MjAwIDAuODI5MDAwIDAuMDAwMDAwCit2biAtMC4yMDQ3MDAgMC45Nzg4MDAgLTAuMDAwMTAwCit2biAtMC4yMDQ3MDAgMC45Nzg4MDAgMC4wMDAwMDAKK3ZuIC0wLjU5MTgwMCAwLjM4NDEwMCAtMC43MDg3MDAKK3ZuIC0wLjYwMTIwMCAwLjQwNTUwMCAtMC42ODg2MDAKK3ZuIC0wLjY5NTcwMCAwLjE0MTAwMCAtMC43MDQ0MDAKK3ZuIC0wLjY5NjAwMCAwLjE0MTMwMCAtMC43MDQwMDAKK3ZuIC0wLjE0MDIwMCAwLjY5ODUwMCAtMC43MDE4MDAKK3ZuIC0wLjE0MzcwMCAwLjY4ODQwMCAtMC43MTA5MDAKK3ZuIC0wLjM5ODUwMCAwLjU5OTMwMCAtMC42OTQzMDAKK3ZuIC0wLjM5ODMwMCAwLjU5MDUwMCAtMC43MDE5MDAKK3ZuIC0wLjMwODEwMCAwLjIyMjQwMCAtMC45MjUwMDAKK3ZuIC0wLjM1MTUwMCAwLjIyODIwMCAtMC45MDgwMDAKK3ZuIC0wLjQyMDkwMCAwLjA4NTMwMCAtMC45MDMxMDAKK3ZuIC0wLjQzNjAwMCAwLjA5NjUwMCAtMC44OTQ3MDAKK3ZuIDAuMDAwMDAwIDAuMzMxNTAwIC0wLjk0MzQwMAordm4gLTAuMDY0MzAwIDAuMzIyOTAwIC0wLjk0NDIwMAordm4gLTAuMDY1MDAwIDAuMzIzODAwIC0wLjk0MzkwMAordm4gLTAuMTU3NTAwIDAuMjgzNDAwIC0wLjk0NjAwMAordm4gLTAuMjA2NjAwIDAuMzEwNzAwIC0wLjkyNzgwMAordm4gMC4wMDAwMDAgMS4wMDAwMDAgLTAuMDAwMjAwCit2biAtMS4wMDAwMDAgLTAuMDAwMDAwIDAuMDAwNjAwCit2biAwLjAwMDAwMCAwLjcwNjQwMCAtMC43MDc4MDAKK3ZuIDAuMDAwMDAwIDAuMTUxNjAwIC0wLjk4ODQwMAordm4gLTAuMTQ0OTAwIDAuMTE0MzAwIC0wLjk4MjgwMAordm4gLTAuMTM4NzAwIDAuMTAwMTAwIC0wLjk4NTMwMAordm4gLTAuMTg5NjAwIDAuMDQ1NTAwIC0wLjk4MDgwMAordm4gLTAuMTgzMjAwIDAuMDQwNTAwIC0wLjk4MjIwMAordm4gLTAuMDIxNTAwIDAuMTQ5NDAwIC0wLjk4ODUwMAordm4gLTAuMDMyMjAwIDAuMTYxOTAwIC0wLjk4NjMwMAordm4gLTAuMDc4MTAwIDAuMTYwMTAwIC0wLjk4NDAwMAordm4gLTAuMDc4MzAwIDAuMTQwOTAwIC0wLjk4NjkwMAordm4gMC4wMDAwMDAgMC43MDY0MDAgLTAuNzA3OTAwCit2biAtMC41MDIyMDAgMC4xMDE1MDAgLTAuODU4ODAwCit2biAtMC41MDIyMDAgLTAuMTAxNTAwIC0wLjg1ODgwMAordm4gLTAuNTAyMTAwIC0wLjEwMTUwMCAtMC44NTg4MDAKK3ZuIC0wLjI4NjIwMCAwLjQyNDQwMCAtMC44NTkxMDAKK3ZuIC0wLjI4NjIwMCAwLjQyNDMwMCAtMC44NTkxMDAKK3ZuIC0wLjEwMjAwMCAwLjUwMjEwMCAtMC44NTg4MDAKK3ZuIC0wLjIxMzIwMCAwLjA0MjkwMCAtMC45NzYxMDAKK3ZuIC0wLjIxMjkwMCAwLjA0MjgwMCAtMC45NzYxMDAKK3ZuIC0wLjIxMzUwMCAtMC4wNDMzMDAgLTAuOTc2MDAwCit2biAtMC4yMTMyMDAgLTAuMDQzNDAwIC0wLjk3NjEwMAordm4gLTAuMDQyOTAwIDAuMjExNzAwIC0wLjk3NjQwMAordm4gLTAuMDQyODAwIDAuMjExNTAwIC0wLjk3NjQwMAordm4gLTAuMTIwODAwIDAuMTc4OTAwIC0wLjk3NjQwMAordm4gLTAuMTIxMDAwIDAuMTc5MDAwIC0wLjk3NjQwMAordm4gLTAuMTc5NDAwIDAuMTIxMDAwIC0wLjk3NjMwMAordm4gLTAuMTc5MzAwIDAuMTIxMDAwIC0wLjk3NjMwMAordm4gLTAuMzAxNTAwIC0wLjE5MTEwMCAtMC45MzQxMDAKK3ZuIC0wLjMxMzgwMCAtMC4yMTY5MDAgLTAuOTI0NDAwCit2biAtMC4yMTU5MDAgLTAuMzE0MjAwIC0wLjkyNDUwMAordm4gLTAuMTkwNTAwIC0wLjMwMjEwMCAtMC45MzQxMDAKK3ZuIC0wLjA3NTgwMCAtMC4zNzQ2MDAgLTAuOTI0MTAwCit2biAtMC4wNzU4MDAgLTAuMzc0NTAwIC0wLjkyNDEwMAordm4gMC4wMDA4MDAgLTAuMDAwMzAwIC0xLjAwMDAwMAordm4gLTAuMDAzMTAwIC0wLjAwNTIwMCAtMS4wMDAwMDAKK3ZuIC0wLjAwNTIwMCAtMC4wMDMyMDAgLTEuMDAwMDAwCit2biAtMC4wMDA0MDAgMC4wMDA4MDAgLTEuMDAwMDAwCit2biAwLjAwMDAwMCAxLjAwMDAwMCAwLjAwMDMwMAordm4gMC4wMDAwMDAgMS4wMDAwMDAgLTAuMDAwMzAwCit2biAwLjEzOTIwMCAtMC42ODgyMDAgLTAuNzEyMDAwCit2biAwLjEzOTMwMCAtMC42ODg3MDAgLTAuNzExNTAwCit2biAwLjM5MjYwMCAtMC41ODIxMDAgLTAuNzEyMDAwCit2biAwLjM5MjcwMCAtMC41ODIzMDAgLTAuNzExODAwCit2biAwLjU4MjQwMCAtMC4zOTI3MDAgLTAuNzExODAwCit2biAwLjU4MjAwMCAtMC4zOTI1MDAgLTAuNzEyMjAwCit2biAwLjY4ODYwMCAtMC4xMzkxMDAgLTAuNzExNzAwCit2biAwLjY4ODQwMCAtMC4xMzkxMDAgLTAuNzExOTAwCit2biAwLjY4ODQwMCAwLjEzOTEwMCAtMC43MTE5MDAKK3ZuIDAuNjg4NjAwIDAuMTM5MTAwIC0wLjcxMTYwMAordm4gMC41ODIyMDAgMC4zOTI0MDAgLTAuNzEyMTAwCit2biAwLjU4MjQwMCAwLjM5MjYwMCAtMC43MTE4MDAKK3ZuIDAuMzkyOTAwIDAuNTgyMjAwIC0wLjcxMTgwMAordm4gMC4zOTI4MDAgMC41ODIxMDAgLTAuNzEyMDAwCit2biAwLjEzODcwMCAwLjY4ODkwMCAtMC43MTE1MDAKK3ZuIDAuMTM4NjAwIDAuNjg4NTAwIC0wLjcxMTkwMAordm4gLTAuNDI0NDAwIDAuMjg2MjAwIC0wLjg1OTEwMAordm4gLTAuMTAxNzAwIC0wLjUwMjEwMCAtMC44NTg4MDAKK3ZuIC0wLjI5MDEwMCAtMC40MjIxMDAgLTAuODU4OTAwCit2biAtMC4yOTA0MDAgLTAuNDIyNTAwIC0wLjg1ODYwMAordm4gLTAuNDIxNzAwIC0wLjI5MTUwMCAtMC44NTg2MDAKK3ZuIC0wLjQyMTEwMCAtMC4yOTEyMDAgLTAuODU5MDAwCit2biAtMC41OTYzMDAgMC40MDIzMDAgMC42OTQ3MDAKK3ZuIC0wLjU5MTkwMCAwLjM5OTAwMCAwLjcwMDMwMAordm4gLTAuNjk5NjAwIDAuMTQyMDAwIDAuNzAwMzAwCit2biAtMC4zOTkyMDAgMC41OTE5MDAgMC43MDAyMDAKK3ZuIC0wLjM5NzIwMCAwLjU4ODcwMCAwLjcwNDEwMAordm4gLTAuMTQ2MTAwIDAuNjk4NzAwIDAuNzAwMzAwCit2biAtMC4xNDYxMDAgMC42OTg0MDAgMC43MDA3MDAKK3ZuIC0wLjAwMDAwMCAwLjcxMzYwMCAwLjcwMDUwMAordm4gLTAuMDAwMDAwIDAuNzEzNzAwIDAuNzAwNDAwCit2biAtMC4wMDAwMDAgMC43MTM2MDAgMC43MDA2MDAKK3ZuIC0wLjAwMDAwMCAwLjcxMzcwMCAwLjcwMDUwMAordm4gLTEuMDAwMDAwIC0wLjAwMDAwMCAwLjAwMDcwMAordm4gMC44MjkwMDAgMC41NTkzMDAgMC4wMDAwMDAKK3ZuIDAuOTgwMjAwIDAuMTk4MDAwIDAuMDAwMDAwCit2biAwLjU1OTIwMCAwLjgyOTEwMCAwLjAwMDAwMAordm4gMC4yMDQ3MDAgMC45Nzg4MDAgMC4wMDAwMDAKK3ZuIC0wLjAwMDIwMCAxLjAwMDAwMCAwLjAwMDAwMAordm4gMC41ODkxMDAgMC4zOTc0MDAgLTAuNzAzNjAwCit2biAwLjU4OTkwMCAwLjM5OTQwMCAtMC43MDE3MDAKK3ZuIDAuNjk4MjAwIDAuMTQxMTAwIC0wLjcwMTkwMAordm4gMC42OTc5MDAgMC4xNDA4MDAgLTAuNzAyMjAwCit2biAwLjE0NDUwMCAwLjY5MTgwMCAtMC43MDc1MDAKK3ZuIDAuMTQyMzAwIDAuNjk3ODAwIC0wLjcwMjAwMAordm4gMC4zOTgzMDAgMC41OTA1MDAgLTAuNzAxOTAwCit2biAwLjM5ODIwMCAwLjU4NzMwMCAtMC43MDQ2MDAKK3ZuIDAuMjc4MDAwIDAuMTg4MjAwIC0wLjk0MjAwMAordm4gMC4yODM0MDAgMC4xODg0MDAgLTAuOTQwMzAwCit2biAwLjMyMTcwMCAwLjA2MTgwMCAtMC45NDQ4MDAKK3ZuIDAuMzI2NDAwIDAuMDY1ODAwIC0wLjk0MjkwMAordm4gLTAuMDAxMDAwIDAuMzI5OTAwIC0wLjk0NDAwMAordm4gMC4wNjYyMDAgMC4zMjQ3MDAgLTAuOTQzNTAwCit2biAwLjA2NjQwMCAwLjMyNDkwMCAtMC45NDM0MDAKK3ZuIDAuMTkzMTAwIDAuMjg0ODAwIC0wLjkzOTAwMAordm4gMC4xNzgzMDAgMC4yNzgwMDAgLTAuOTQzOTAwCit2biAwLjAwMDEwMCAxLjAwMDAwMCAtMC4wMDAwMDAKK3ZuIDAuMDAwNTAwIDAuNzA3NDAwIC0wLjcwNjgwMAordm4gMC4wMDAxMDAgMS4wMDAwMDAgMC4wMDA0MDAKK3ZuIDAuMTI5NzAwIDAuMDg2MjAwIC0wLjk4NzgwMAordm4gMC4xMjc3MDAgMC4wODEyMDAgLTAuOTg4NTAwCit2biAwLjE0OTMwMCAwLjAyODcwMCAtMC45ODg0MDAKK3ZuIDAuMTQ3MjAwIDAuMDI2ODAwIC0wLjk4ODcwMAordm4gMC4wMzAzMDAgMC4xNDg1MDAgLTAuOTg4NDAwCit2biAwLjAzMDQwMCAwLjE0ODYwMCAtMC45ODg0MDAKK3ZuIDAuMDgxNTAwIDAuMTI3MTAwIC0wLjk4ODUwMAordm4gMC4wODExMDAgMC4xMzU1MDAgLTAuOTg3NTAwCit2biAwLjAwMDAwMCAwLjMyOTkwMCAtMC45NDQwMDAKK3ZuIDAuMDAwNjAwIDAuMzMxNTAwIC0wLjk0MzUwMAordm4gMC41MDM2MDAgMC4wOTc1MDAgLTAuODU4NDAwCit2biAwLjUwMzIwMCAwLjA5NzQwMCAtMC44NTg3MDAKK3ZuIDAuNTAzMTAwIC0wLjA5NzcwMCAtMC44NTg3MDAKK3ZuIDAuNTAzNjAwIC0wLjA5NzgwMCAtMC44NTg0MDAKK3ZuIDAuMjg2MjAwIDAuNDI0NDAwIC0wLjg1OTAwMAordm4gMC4xMDIwMDAgMC41MDIxMDAgLTAuODU4ODAwCit2biAwLjIxMTcwMCAwLjA0MTkwMCAtMC45NzY0MDAKK3ZuIDAuMjEzMDAwIDAuMDQyODAwIC0wLjk3NjEwMAordm4gMC4yMTM3MDAgLTAuMDQyNzAwIC0wLjk3NjAwMAordm4gMC4yMTE3MDAgLTAuMDQzMTAwIC0wLjk3NjQwMAordm4gMC4wNDI5MDAgMC4yMTE3MDAgLTAuOTc2NDAwCit2biAwLjA0MjgwMCAwLjIxMTUwMCAtMC45NzY0MDAKK3ZuIDAuMTIwODAwIDAuMTc4OTAwIC0wLjk3NjQwMAordm4gMC4xMjEwMDAgMC4xNzkwMDAgLTAuOTc2NDAwCit2biAwLjE3OTQwMCAwLjEyMTAwMCAtMC45NzYzMDAKK3ZuIDAuMTc5MzAwIDAuMTIxMDAwIC0wLjk3NjMwMAordm4gMC4zMDYyMDAgLTAuMTkzNDAwIC0wLjkzMjEwMAordm4gMC4zMTU2MDAgLTAuMjEyNzAwIC0wLjkyNDcwMAordm4gMC4xOTI4MDAgLTAuMzA2MjAwIC0wLjkzMjIwMAordm4gMC4yMTM2MDAgLTAuMzE2MzAwIC0wLjkyNDMwMAordm4gMC4wNzU2MDAgLTAuMzc0NjAwIC0wLjkyNDEwMAordm4gMC4wNzU1MDAgLTAuMzc1MDAwIC0wLjkyNDAwMAordm4gLTAuMDAwODAwIDAuNzA2NDAwIC0wLjcwNzkwMAordm4gMC4wMDAwMDAgMC43MDc0MDAgLTAuNzA2ODAwCit2biAtMC4xMzkzMDAgLTAuNjg4NjAwIC0wLjcxMTYwMAordm4gLTAuMTM5MjAwIC0wLjY4ODMwMCAtMC43MTIwMDAKK3ZuIC0wLjM5MjcwMCAtMC41ODIzMDAgLTAuNzExOTAwCit2biAtMC4zOTI2MDAgLTAuNTgyMTAwIC0wLjcxMjAwMAordm4gLTAuNTgyMDAwIC0wLjM5MjcwMCAtMC43MTIxMDAKK3ZuIC0wLjU4MjIwMCAtMC4zOTI5MDAgLTAuNzExOTAwCit2biAtMC42ODg1MDAgLTAuMTM5MjAwIC0wLjcxMTcwMAordm4gLTAuNjg4NjAwIC0wLjEzOTMwMCAtMC43MTE2MDAKK3ZuIC0wLjY4ODUwMCAwLjEzOTcwMCAtMC43MTE2MDAKK3ZuIC0wLjY4ODUwMCAwLjEzOTcwMCAtMC43MTE3MDAKK3ZuIC0wLjU4MjUwMCAwLjM5MjYwMCAtMC43MTE4MDAKK3ZuIC0wLjU4MjIwMCAwLjM5MjQwMCAtMC43MTIwMDAKK3ZuIC0wLjM5MzEwMCAwLjU4MTkwMCAtMC43MTIwMDAKK3ZuIC0wLjM5MzEwMCAwLjU4MjAwMCAtMC43MTE5MDAKK3ZuIC0wLjEzODYwMCAwLjY4ODUwMCAtMC43MTE4MDAKK3ZuIC0wLjEzODYwMCAwLjY4ODkwMCAtMC43MTE1MDAKK3ZuIDAuNDI0MzAwIDAuMjg2MzAwIC0wLjg1OTAwMAordm4gMC40MjQzMDAgMC4yODYzMDAgLTAuODU5MTAwCit2biAwLjEwMTEwMCAtMC41MDIyMDAgLTAuODU4ODAwCit2biAwLjI4NjUwMCAtMC40MjQxMDAgLTAuODU5MTAwCit2biAwLjI4NjQwMCAtMC40MjQxMDAgLTAuODU5MTAwCit2biAwLjQyNDQwMCAtMC4yODYxMDAgLTAuODU5MTAwCit2biAtMC4wMDAwMDAgLTAuMDAwMzAwIDEuMDAwMDAwCit2biAwLjU5MTgwMCAwLjM5OTIwMCAwLjcwMDMwMAordm4gMC41OTE4MDAgMC4zOTkzMDAgMC43MDAyMDAKK3ZuIDAuNjk5NzAwIDAuMTQxNDAwIDAuNzAwMzAwCit2biAwLjM5OTIwMCAwLjU5MTkwMCAwLjcwMDIwMAordm4gMC4zOTkxMDAgMC41OTE4MDAgMC43MDAzMDAKK3ZuIDAuMTQ2MTAwIDAuNjk4MjAwIDAuNzAwODAwCit2biAwLjE0NjIwMCAwLjY5ODgwMCAwLjcwMDIwMAordm4gMC42OTQxMDAgLTAuMDAwMDAwIDAuNzE5OTAwCit2biAwLjcxMzkwMCAtMC4wMDAyMDAgMC43MDAzMDAKK3ZuIC0wLjAwMDIwMCAxLjAwMDAwMCAwLjAwMDQwMAordm4gMC43MTM5MDAgMC4wMDAwMDAgMC43MDAyMDAKK3ZuIC0wLjUxMzcwMCAtMC4xNTAxMDAgLTAuODQ0ODAwCit2biAtMC41Mzc1MDAgLTAuMTU0NjAwIC0wLjgyOTAwMAordm4gLTAuMzQyNDAwIC0wLjM2ODMwMCAtMC44NjQ0MDAKK3ZuIC0wLjM2MjUwMCAtMC4zODU5MDAgLTAuODQ4MzAwCit2biAtMC4xMzE0MDAgLTAuNTEzOTAwIC0wLjg0NzcwMAordm4gLTAuMTMwNTAwIC0wLjUxMTMwMCAtMC44NDk0MDAKK3ZuIDAuMTMyNDAwIC0wLjUxMTYwMCAtMC44NDg5MDAKK3ZuIDAuMTM0MjAwIC0wLjUyMjcwMCAtMC44NDE5MDAKK3ZuIDAuMzU1NTAwIC0wLjM4MDAwMCAtMC44NTM5MDAKK3ZuIDAuMzU1MzAwIC0wLjM3OTcwMCAtMC44NTQyMDAKK3ZuIDAuNTE3NjAwIC0wLjE0OTcwMCAtMC44NDI1MDAKK3ZuIDAuNTE0ODAwIC0wLjE0ODYwMCAtMC44NDQzMDAKK3ZuIDAuNTI2MTAwIDAuMDAwMTAwIC0wLjg1MDQwMAordm4gMC41MzAwMDAgLTAuMDAwMTAwIC0wLjg0ODAwMAordm4gMC41MTQ3MDAgMC4xNDk2MDAgLTAuODQ0MjAwCit2biAwLjUwOTcwMCAwLjE0ODYwMCAtMC44NDc0MDAKK3ZuIDAuMzYyNzAwIDAuMzg0NDAwIC0wLjg0ODkwMAordm4gMC4zNTE3MDAgMC4zNzQ5MDAgLTAuODU3ODAwCit2biAwLjEzODAwMCAwLjUyOTYwMCAtMC44MzY5MDAKK3ZuIDAuMTMxNjAwIDAuNTEyMjAwIC0wLjg0ODcwMAordm4gLTAuMTMyMTAwIDAuNTEyMTAwIC0wLjg0ODcwMAordm4gLTAuMTMzMjAwIDAuNTE5MzAwIC0wLjg0NDIwMAordm4gLTAuMzU1NjAwIDAuMzgyNDAwIC0wLjg1MjgwMAordm4gLTAuMzQ3ODAwIDAuMzcyMDAwIC0wLjg2MDYwMAordm4gLTAuNTM1MzAwIDAuMTU3MTAwIC0wLjgyOTkwMAordm4gLTAuNTEzOTAwIDAuMTQ4NTAwIC0wLjg0NDkwMAordm4gLTAuNTI1MzAwIC0wLjAwMDIwMCAtMC44NTA5MDAKK3ZuIC0wLjUzMDAwMCAwLjAwMDAwMCAtMC44NDgwMDAKK3ZuIC0wLjUzMDAwMCAwLjAwMDIwMCAtMC44NDgwMDAKK3ZuIC0wLjUyNTQwMCAwLjAwMDAwMCAtMC44NTA5MDAKK3ZuIC0wLjE0NDkwMCAtMC41MDc1MDAgLTAuODQ5NDAwCit2biAtMC4xNDYxMDAgLTAuNTEwNTAwIC0wLjg0NzQwMAordm4gMC4xMzc3MDAgLTAuNTExMTAwIC0wLjg0ODQwMAordm4gMC4xMzkxMDAgLTAuNTIwMDAwIC0wLjg0MjgwMAordm4gMC4zNjY4MDAgLTAuMzcxNTAwIC0wLjg1MjkwMAordm4gMC4zNjQ1MDAgLTAuMzY4NjAwIC0wLjg1NTIwMAordm4gMC41MzAxMDAgLTAuMTI4ODAwIC0wLjgzODEwMAordm4gMC41MTc1MDAgLTAuMTI0NDAwIC0wLjg0NjYwMAordm4gMC41MjYwMDAgMC4wMDAzMDAgLTAuODUwNTAwCit2biAwLjUzMDAwMCAwLjAwMDEwMCAtMC44NDgwMDAKK3ZuIDAuNTI2MDAwIDAuMDAwMTAwIC0wLjg1MDUwMAordm4gMC41MTcwMDAgMC4xMjk1MDAgLTAuODQ2MTAwCit2biAwLjUxOTQwMCAwLjEyOTkwMCAtMC44NDQ2MDAKK3ZuIDAuMzcwODAwIDAuMzczMjAwIC0wLjg1MDQwMAordm4gMC4zNjIxMDAgMC4zNjYyMDAgLTAuODU3MjAwCit2biAwLjE0MjYwMCAwLjUyNjcwMCAtMC44MzgwMDAKK3ZuIDAuMTM2OTAwIDAuNTExODAwIC0wLjg0ODEwMAordm4gLTAuMTM5ODAwIDAuNTExNjAwIC0wLjg0NzgwMAordm4gLTAuMTQwNDAwIDAuNTE1NTAwIC0wLjg0NTMwMAordm4gLTAuMzcyNzAwIDAuMzcwMTAwIC0wLjg1MTAwMAordm4gLTAuMzYzOTAwIDAuMzU5MjAwIC0wLjg1OTQwMAordm4gLTAuNTMyMzAwIDAuMTQ2MTAwIC0wLjgzMzkwMAordm4gLTAuNTE0OTAwIDAuMTM5NDAwIC0wLjg0NTgwMAordm4gLTAuNTMwMDAwIDAuMDAwMTAwIC0wLjg0ODAwMAordm4gLTAuNTI1MzAwIC0wLjAwMDEwMCAtMC44NTA5MDAKK3ZuIC0wLjUxNTIwMCAtMC4xMzY4MDAgLTAuODQ2MTAwCit2biAtMC41NTIwMDAgLTAuMTQyOTAwIC0wLjgyMTUwMAordm4gLTAuMzQ4NTAwIC0wLjM1NzUwMCAtMC44NjY1MDAKK3ZuIC0wLjM3NDEwMCAtMC4zNzg0MDAgLTAuODQ2NzAwCit2biAtMC45NjEwMDAgLTAuMjc2NDAwIDAuMDAwMDAwCit2biAtMC42ODQ3MDAgLTAuNzI4ODAwIDAuMDAwMDAwCit2biAtMC4yNDczMDAgLTAuOTY4OTAwIDAuMDAwMDAwCit2biAwLjI0ODcwMCAtMC45Njg2MDAgMC4wMDAwMDAKK3ZuIDAuNjgzMzAwIC0wLjczMDIwMCAwLjAwMDAwMAordm4gMC42ODMyMDAgLTAuNzMwMjAwIDAuMDAwMDAwCit2biAwLjk2MDgwMCAtMC4yNzczMDAgMC4wMDAwMDAKK3ZuIDEuMDAwMDAwIC0wLjAwMDIwMCAwLjAwMDAwMAordm4gMS4wMDAwMDAgMC4wMDAyMDAgMC4wMDAwMDAKK3ZuIDAuOTYwMDAwIDAuMjgwMDAwIDAuMDAwMDAwCit2biAwLjY4NDEwMCAwLjcyOTQwMCAwLjAwMDAwMAordm4gMC4yNDg5MDAgMC45Njg1MDAgMC4wMDAwMDAKK3ZuIC0wLjI0ODUwMCAwLjk2ODYwMCAwLjAwMDAwMAordm4gLTAuNjgyOTAwIDAuNzMwNTAwIDAuMDAwMDAwCit2biAtMC42ODMwMDAgMC43MzA1MDAgMC4wMDAwMDAKK3ZuIC0wLjk2MDcwMCAwLjI3NzYwMCAwLjAwMDAwMAordm4gLTAuOTYwNzAwIDAuMjc3NTAwIDAuMDAwMDAwCit2biAtMC4yNzUyMDAgLTAuOTYxNDAwIDAuMDAwMDAwCit2biAwLjI1ODQwMCAtMC45NjYwMDAgMC4wMDAwMDAKK3ZuIDAuNzAzMTAwIC0wLjcxMTEwMCAwLjAwMDAwMAordm4gMC45NzIzMDAgLTAuMjMzODAwIDAuMDAwMDAwCit2biAwLjk3MDEwMCAwLjI0MjYwMCAwLjAwMDAwMAordm4gMC43MDMxMDAgMC43MTExMDAgMC4wMDAwMDAKK3ZuIDAuMjU4NDAwIDAuOTY2MDAwIDAuMDAwMDAwCit2biAtMC4yNjI4MDAgMC45NjQ4MDAgMC4wMDAwMDAKK3ZuIC0wLjcxMTYwMCAwLjcwMjUwMCAwLjAwMDAwMAordm4gLTAuNzExNjAwIDAuNzAyNjAwIDAuMDAwMDAwCit2biAtMC45NjUyMDAgMC4yNjE0MDAgMC4wMDAwMDAKK3ZuIC0wLjk2ODEwMCAtMC4yNTA3MDAgMC4wMDAwMDAKK3ZuIC0wLjcwMzEwMCAtMC43MTExMDAgMC4wMDAwMDAKK3ZuIC0wLjI3NTAwMCAtMC45NjE0MDAgLTAuMDAwODAwCit2biAwLjI1ODYwMCAtMC45NjYwMDAgMC4wMDAwMDAKK3ZuIDAuMjU4NDAwIC0wLjk2NjAwMCAwLjAwMDgwMAordm4gMC4yNTg2MDAgMC45NjYwMDAgMC4wMDA4MDAKK3ZuIC0wLjI2MjYwMCAwLjk2NDkwMCAwLjAwMDAwMAordm4gLTAuMjYyODAwIDAuOTY0ODAwIC0wLjAwMDgwMAordm4gLTAuNjk0MTAwIDAuMDAwMTAwIDAuNzE5ODAwCit2biAwLjAwMDAwMCAwLjAwMDEwMCAxLjAwMDAwMAordm4gMC4xOTgyMDAgLTAuOTgwMjAwIDAuMDAwMDAwCit2biAwLjU1OTIwMCAtMC44MjkxMDAgMC4wMDAwMDAKK3ZuIDAuNTU5MjAwIC0wLjgyOTEwMCAwLjAwMDEwMAordm4gMC44MjkxMDAgLTAuNTU5MTAwIDAuMDAwMDAwCit2biAwLjgyOTMwMCAwLjU1ODkwMCAwLjAwMDAwMAordm4gMC41NTk0MDAgMC44Mjg5MDAgMC4wMDAwMDAKK3ZuIDAuMTk3NDAwIDAuOTgwMzAwIDAuMDAwMDAwCit2biAtMC4xOTgyMDAgLTAuOTgwMjAwIDAuMDAwMDAwCit2biAtMC41NTkxMDAgLTAuODI5MTAwIDAuMDAwMDAwCit2biAtMC44Mjg5MDAgLTAuNTU5NDAwIDAuMDAwMDAwCit2biAtMC44Mjg5MDAgLTAuNTU5NDAwIDAuMDAwMTAwCit2biAtMC45ODAyMDAgLTAuMTk4MjAwIDAuMDAwMDAwCit2biAtMC44MjkyMDAgMC41NTg5MDAgMC4wMDAxMDAKK3ZuIC0wLjgyOTIwMCAwLjU1ODkwMCAwLjAwMDAwMAordm4gLTAuNTU5ODAwIDAuODI4NjAwIDAuMDAwMDAwCit2biAtMC4xOTczMDAgMC45ODAzMDAgMC4wMDAwMDAKK3ZuIDAuMTg5ODAwIC0wLjg4ODUwMCAtMC40MTc3MDAKK3ZuIDAuMjkxNDAwIC0wLjkwOTkwMCAtMC4yOTUzMDAKK3ZuIC0wLjEzMTkwMCAtMC45MTE0MDAgLTAuMzg5ODAwCit2biAtMC4xMjk1MDAgLTAuOTA2NTAwIC0wLjQwMTkwMAordm4gLTAuMDAwMjAwIC0xLjAwMDAwMCAwLjAwMjcwMAordm4gMC4wMDAwMDAgLTAuNTgzMjAwIDAuODEyMzAwCit2biAtMC4wMDAxMDAgLTAuNTgzMjAwIDAuODEyNDAwCit2biAwLjI3OTQwMCAtMC4xMTYxMDAgMC45NTMxMDAKK3ZuIDAuMzI3NDAwIC0wLjMwOTkwMCAwLjg5MjYwMAordm4gLTAuOTE5NDAwIC0wLjMzMTAwMCAwLjIxMjcwMAordm4gLTAuOTE3OTAwIC0wLjM0NzYwMCAwLjE5MTUwMAordm4gLTAuOTI4NzAwIC0wLjI4ODcwMCAwLjIzMjYwMAordm4gLTAuOTA5NjAwIC0wLjM0NDYwMCAwLjIzMjAwMAordm4gLTAuMDAwODAwIC0wLjU4MzIwMCAwLjgxMjMwMAordm4gLTAuMDAwMjAwIC0xLjAwMDAwMCAwLjAwMDIwMAordm4gMC45MDg1MDAgLTAuMzU1NzAwIDAuMjE5MzAwCit2biAwLjk0MjIwMCAtMC4yMzc0MDAgMC4yMzY0MDAKK3ZuIC0wLjAwMDAwMCAtMS4wMDAwMDAgMC4wMDA5MDAKK3ZuIDAuMDAwMTAwIC0wLjcxOTEwMCAwLjY5NDkwMAordm4gMC42OTQxMDAgMC4wMDAxMDAgMC43MTk5MDAKK3ZuIC0wLjY5NDEwMCAtMC4wMDAyMDAgMC43MTk4MDAKK3ZuIC0wLjc2MzYwMCAtMC4xMzc3MDAgMC42MzA4MDAKK3ZuIC0wLjc4NzUwMCAtMC4yODM4MDAgMC41NDcxMDAKK3ZuIDAuMDAwMjAwIC0xLjAwMDAwMCAwLjAwMDMwMAordm4gLTAuMjkxNjAwIC0wLjkwMTQwMCAtMC4zMjAwMDAKK3ZuIC0wLjE1NTkwMCAtMC44OTc4MDAgLTAuNDExODAwCit2biAtMC4zMTQ5MDAgLTAuMzEwOTAwIDAuODk2ODAwCit2biAtMC4yOTMzMDAgLTAuMTIzNTAwIDAuOTQ4MDAwCit2biAwLjEzMTUwMCAtMC45MTE1MDAgLTAuMzg5NzAwCit2biAwLjEyOTcwMCAtMC45MDc3MDAgLTAuMzk5MDAwCit2biAwLjc3OTcwMCAtMC4yNDg0MDAgMC41NzQ4MDAKK3ZuIDAuNzY1NDAwIC0wLjExMTMwMCAwLjYzMzkwMAordm4gLTAuMDAwMDAwIC0wLjgyNDgwMCAtMC41NjU1MDAKK3ZuIDAuMjkwNjAwIC0wLjk1NjkwMCAtMC4wMDAxMDAKK3ZuIC0wLjAwMjAwMCAtMC4zMTc0MDAgLTAuOTQ4MzAwCit2biAtMC4wMDAxMDAgLTAuMzE5NDAwIC0wLjk0NzYwMAordm4gLTAuMTE3MTAwIC0wLjQ5NzAwMCAtMC44NTk4MDAKK3ZuIC0wLjAwMDcwMCAtMC42NzAxMDAgLTAuNzQyMzAwCit2biAwLjAwNTYwMCAtMC4zMjY5MDAgLTAuOTQ1MDAwCit2biAwLjAwMjQwMCAtMC43MjE2MDAgLTAuNjkyMzAwCit2biAwLjAyNDQwMCAtMC42OTM1MDAgLTAuNzIwMDAwCit2biAtMC4wMDAxMDAgLTAuODI2NDAwIC0wLjU2MzEwMAordm4gLTAuMTQ3OTAwIC0wLjk4OTAwMCAtMC4wMDAwMDAKK3ZuIDAuOTcyNTAwIC0wLjAwMDEwMCAwLjIzMjgwMAordm4gMC45NzI2MDAgLTAuMDAwMDAwIDAuMjMyNTAwCit2biAwLjk3MTgwMCAtMC4wMDAwMDAgMC4yMzU5MDAKK3ZuIDAuOTcyMTAwIC0wLjAwMjUwMCAwLjIzNDYwMAordm4gMC4yMjgxMDAgLTAuMTE4MTAwIC0wLjk2NjUwMAordm4gLTAuMjQ0ODAwIDAuMDM2MTAwIDAuOTY4OTAwCit2biAtMC45NzQzMDAgMC4wMDE2MDAgMC4yMjU0MDAKK3ZuIC0wLjk3NTkwMCAwLjAwMDEwMCAwLjIxODIwMAordm4gMC43MzczMDAgMC4wMzgwMDAgMC42NzQ1MDAKK3ZuIDAuNzM2MzAwIC0wLjAwMTcwMCAwLjY3NjYwMAordm4gLTAuOTcwODAwIDAuMDA3OTAwIDAuMjM5ODAwCit2biAtMC45NzAwMDAgMC4wMDE2MDAgMC4yNDMwMDAKK3ZuIC0wLjczNDIwMCAwLjA0MzEwMCAwLjY3NzYwMAordm4gLTAuNzMzNDAwIDAuMDA1OTAwIDAuNjc5ODAwCit2biAtMC4yMjgyMDAgLTAuMTE5MjAwIC0wLjk2NjMwMAordm4gMC4yNDUxMDAgMC4wMzU2MDAgMC45Njg4MDAKK3ZuIDAuMDAwMTAwIC0wLjU4MzEwMCAwLjgxMjQwMAordm4gMC44OTkzMDAgLTAuMzgwOTAwIDAuMjE1MTAwCit2biAwLjkwMTQwMCAtMC4zNTMwMDAgMC4yNTA3MDAKK3ZuIDAuMjMwNjAwIDAuMDI0NTAwIDAuOTcyNzAwCit2biAwLjI1NDgwMCAwLjAwMDAwMCAwLjk2NzAwMAordm4gLTAuOTc1OTAwIDAuMDAwMDAwIDAuMjE4MjAwCit2biAtMC45NzA4MDAgMC4wMDAwMDAgMC4yMzk4MDAKK3ZuIC0wLjczNTAwMCAwLjAwMDAwMCAwLjY3ODEwMAordm4gLTAuMjMwODAwIDAuMDAwMDAwIDAuOTczMDAwCit2biAtMC4yNTQ4MDAgMC4wMjQzMDAgMC45NjY3MDAKK3ZuIDAuNzM3OTAwIDAuMDAwMDAwIDAuNjc0OTAwCit2biAwLjgyOTQwMCAwLjAwMDAwMCAwLjU1ODYwMAordm4gMC44Mjk3MDAgMC4wMDAwMDAgMC41NTgyMDAKK3ZuIC0wLjM3OTQwMCAtMC4wMDAwMDAgMC45MjUzMDAKK3ZuIC0wLjgyOTAwMCAwLjAwMDAwMCAwLjU1OTMwMAordm4gLTAuNzgwNzAwIDAuMDAwMDAwIDAuNjI0OTAwCit2biAwLjg3ODQwMCAwLjAwMDAwMCAwLjQ3ODAwMAordm4gLTAuMzg3MTAwIDAuMDAwMDAwIDAuOTIyMDAwCit2biAtMC4zNzE5MDAgMC4wNzUxMDAgLTAuOTI1MjAwCit2biAtMC4zNzE2MDAgMC4wNzQ4MDAgLTAuOTI1NDAwCit2biAtMC4zNzI1MDAgLTAuMDc1MzAwIC0wLjkyNTAwMAordm4gLTAuMzcxOTAwIC0wLjA3NTUwMCAtMC45MjUyMDAKK3ZuIC0wLjA3NTAwMCAwLjM2OTMwMCAtMC45MjYzMDAKK3ZuIC0wLjA3NDkwMCAwLjM2OTYwMCAtMC45MjYyMDAKK3ZuIC0wLjIxMTAwMCAwLjMxMjgwMCAtMC45MjYxMDAKK3ZuIC0wLjIxMDkwMCAwLjMxMjQwMCAtMC45MjYyMDAKK3ZuIC0wLjMxMzEwMCAwLjIxMTEwMCAtMC45MjYwMDAKK3ZuIC0wLjMxMzEwMCAwLjIxMTIwMCAtMC45MjU5MDAKK3ZuIC0wLjE3NTUwMCAtMC4xMDQyMDAgLTAuOTc4OTAwCit2biAtMC4xODM1MDAgLTAuMTE2MDAwIC0wLjk3NjIwMAordm4gLTAuMTAzOTAwIC0wLjE3NTkwMCAtMC45Nzg5MDAKK3ZuIC0wLjExNTYwMCAtMC4xODM4MDAgLTAuOTc2MTAwCit2biAtMC4wNDM0MDAgLTAuMjE0ODAwIC0wLjk3NTcwMAordm4gLTAuMDQzNTAwIC0wLjIxNDkwMCAtMC45NzU3MDAKK3ZuIDAuMzY5ODAwIDAuMDcxNjAwIC0wLjkyNjQwMAordm4gMC4zNzIyMDAgMC4wNzM2MDAgLTAuOTI1MjAwCit2biAwLjM2OTgwMCAtMC4wNzE4MDAgLTAuOTI2MzAwCit2biAwLjM3MjgwMCAtMC4wNzQ1MDAgLTAuOTI0OTAwCit2biAwLjA3NTEwMCAwLjM2OTYwMCAtMC45MjYxMDAKK3ZuIDAuMDc0ODAwIDAuMzY5MzAwIC0wLjkyNjMwMAordm4gMC4yMTA3MDAgMC4zMTI1MDAgLTAuOTI2MzAwCit2biAwLjIxMTEwMCAwLjMxMjcwMCAtMC45MjYxMDAKK3ZuIDAuMzEzMTAwIDAuMjExMzAwIC0wLjkyNTkwMAordm4gMC4xNzc2MDAgLTAuMTA3MjAwIC0wLjk3ODIwMAordm4gMC4xODM1MDAgLTAuMTE1OTAwIC0wLjk3NjIwMAordm4gMC4xMDY2MDAgLTAuMTc3OTAwIC0wLjk3ODMwMAordm4gMC4xMTYwMDAgLTAuMTg0MjAwIC0wLjk3NjAwMAordm4gMC4wNDM0MDAgLTAuMjE0OTAwIC0wLjk3NTcwMAordm4gMC4wNDM0MDAgLTAuMjE1MTAwIC0wLjk3NTYwMAordm4gLTAuNzM4MDAwIC0wLjAwMDIwMCAtMC42NzQ5MDAKK3ZuIC0wLjczNzkwMCAtMC4wMDAxMDAgLTAuNjc0OTAwCit2biAtMC4wMDAxMDAgMC43MzcxMDAgLTAuNjc1ODAwCit2biAtMC4wMDExMDAgMC43MzgwMDAgLTAuNjc0ODAwCit2biAtMC43Mzc1MDAgLTAuMDAwMjAwIC0wLjY3NTQwMAordm4gLTAuNzM3NTAwIC0wLjAwMDEwMCAtMC42NzUzMDAKK3ZuIC0wLjAwMDEwMCAwLjczMDkwMCAtMC42ODI1MDAKK3ZuIC0wLjAwMDEwMCAwLjczMDgwMCAtMC42ODI2MDAKK3ZuIDAuNzM5MTAwIDAuMDAwMDAwIC0wLjY3MzYwMAordm4gMC43MzkyMDAgMC4wMDAxMDAgLTAuNjczNTAwCit2biAwLjAwMDAwMCAtMC43NDcyMDAgLTAuNjY0NjAwCit2biAwLjAwMDEwMCAtMC43NDcyMDAgLTAuNjY0NjAwCit2biAtMC4wMDAxMDAgMC43Mjc4MDAgLTAuNjg1ODAwCit2biAtMC4wMDA5MDAgMC43MzcwMDAgLTAuNjc1OTAwCit2biAwLjAwMDEwMCAtMC43NDcwMDAgLTAuNjY0OTAwCit2biAwLjAwMDEwMCAtMC43NDcwMDAgLTAuNjY0ODAwCit2biAtMC43MzgyMDAgLTAuMDAwMTAwIC0wLjY3NDYwMAordm4gLTAuNzM4MjAwIC0wLjAwMDIwMCAtMC42NzQ2MDAKK3ZuIDAuNzM2OTAwIDAuMDAwMDAwIC0wLjY3NjAwMAordm4gMC4wMDAxMDAgLTAuNzQ3MTAwIC0wLjY2NDgwMAordm4gLTAuMDAwMTAwIDAuNzI3MzAwIC0wLjY4NjMwMAordm4gLTAuMDAxMjAwIDAuNzI3NzAwIC0wLjY4NTkwMAordm4gMC4wMDAxMDAgLTAuNzQ3MTAwIC0wLjY2NDcwMAordm4gLTAuNzM2MjAwIC0wLjAwMDIwMCAtMC42NzY3MDAKK3ZuIC0wLjczNjIwMCAtMC4wMDAxMDAgLTAuNjc2NzAwCit2biAwLjczOTEwMCAwLjAwMDEwMCAtMC42NzM2MDAKK3ZuIDAuMDAwMDAwIC0wLjc0NzMwMCAtMC42NjQ1MDAKK3ZuIC0wLjAwMDEwMCAwLjczMDcwMCAtMC42ODI3MDAKK3ZuIC0wLjczNjMwMCAtMC4wMDAxMDAgLTAuNjc2NzAwCit2biAwLjczNjkwMCAwLjAwMDAwMCAtMC42NzYxMDAKK3ZuIDAuODM4MTAwIDAuMDAwNDAwIC0wLjU0NTYwMAordm4gMC44MzgxMDAgMC4wMDAzMDAgLTAuNTQ1NjAwCit2biAwLjEzMTkwMCAwLjc2OTMwMCAtMC42MjUxMDAKK3ZuIDAuMTkzMzAwIDAuNzk3NTAwIC0wLjU3MTUwMAordm4gMC40MzU4MDAgMC43MDkwMDAgLTAuNTU0NDAwCit2biAwLjQ0NDAwMCAwLjcyOTAwMCAtMC41MjExMDAKK3ZuIDAuNjg5MDAwIDAuNDcwMzAwIC0wLjU1MTQwMAordm4gMC42ODgyMDAgMC40Njk1MDAgLTAuNTUzMTAwCit2biAwLjgyMjYwMCAwLjE1NzUwMCAtMC41NDY0MDAKK3ZuIDAuODIyOTAwIDAuMTU3NjAwIC0wLjU0NTkwMAordm4gMC44MjM4MDAgLTAuMTYyNzAwIC0wLjU0MzAwMAordm4gMC44MjI0MDAgLTAuMTYyNjAwIC0wLjU0NTIwMAordm4gMC43MDI3MDAgLTAuNDY1NDAwIC0wLjUzODIwMAordm4gMC43MDI1MDAgLTAuNDY1MzAwIC0wLjUzODUwMAordm4gMC40NzYyMDAgLTAuNzAyMjAwIC0wLjUyOTQwMAordm4gMC40NzQwMDAgLTAuNjk5OTAwIC0wLjUzNDMwMAordm4gMC4xNzM5MDAgLTAuODQ2MzAwIC0wLjUwMzYwMAordm4gMC4xNjkyMDAgLTAuODMzOTAwIC0wLjUyNTMwMAordm4gLTAuMTk0ODAwIC0wLjgyOTcwMCAtMC41MjMyMDAKK3ZuIC0wLjE5NTUwMCAtMC44NDA0MDAgLTAuNTA1NDAwCit2biAtMC41MDM2MDAgLTAuNjgwNTAwIC0wLjUzMjMwMAordm4gLTAuNTAzOTAwIC0wLjY4MTAwMCAtMC41MzE0MDAKK3ZuIC0wLjc4MzEwMCAtMC4yODU4MDAgLTAuNTUyNDAwCit2biAtMC43NTY1MDAgLTAuMjgzNzAwIC0wLjU4OTIwMAordm4gLTAuMDAwMTAwIDAuODMxNjAwIC0wLjU1NTQwMAordm4gLTAuMDAwMTAwIDAuODMxNDAwIC0wLjU1NTcwMAordm4gLTAuODM4NzAwIC0wLjAwMDEwMCAtMC41NDQ1MDAKK3ZuIC0wLjgzODcwMCAtMC4wMDAxMDAgLTAuNTQ0NjAwCit2biAwLjAwMDEwMCAtMC44NDk2MDAgLTAuNTI3NDAwCit2biAwLjAwMDIwMCAtMC44NDk2MDAgLTAuNTI3NDAwCit2biAwLjAwMDIwMCAtMC44NTA5MDAgLTAuNTI1MzAwCit2biAwLjAwMDEwMCAtMC44NTA3MDAgLTAuNTI1NjAwCit2biAwLjgzMjcwMCAtMC4xNTg4MDAgLTAuNTMwNDAwCit2biAwLjgyMjQwMCAtMC4xNDIzMDAgLTAuNTUwODAwCit2biAwLjY5NTMwMCAwLjQ1NjcwMCAtMC41NTQ5MDAKK3ZuIDAuNjk3NzAwIDAuNDU4ODAwIC0wLjU1MDEwMAordm4gMC40NzQxMDAgMC42OTU3MDAgLTAuNTM5NjAwCit2biAwLjQ2OTQwMCAwLjY4NTcwMCAtMC41NTYzMDAKK3ZuIDAuMTc5NTAwIDAuODI1NDAwIC0wLjUzNTIwMAordm4gMC4xNzk0MDAgMC44MjUzMDAgLTAuNTM1NDAwCit2biAtMC4xNzIwMDAgMC44MjcwMDAgLTAuNTM1MjAwCit2biAtMC4xNzIxMDAgMC44Mjc0MDAgLTAuNTM0NjAwCit2biAtMC40NjUyMDAgMC42ODczMDAgLTAuNTU3ODAwCit2biAtMC40NzQ4MDAgMC42OTc0MDAgLTAuNTM2OTAwCit2biAtMC42OTQ1MDAgMC40NjMxMDAgLTAuNTUwNjAwCit2biAtMC42OTI1MDAgMC40NjIxMDAgLTAuNTU0MDAwCit2biAtMC44MjA2MDAgMC4xNjc4MDAgLTAuNTQ2MzAwCit2biAtMC44MTk4MDAgMC4xNjc3MDAgLTAuNTQ3NjAwCit2biAtMC44MjIxMDAgLTAuMTcyOTAwIC0wLjU0MjQwMAordm4gLTAuODIyMjAwIC0wLjE3MjkwMCAtMC41NDIzMDAKK3ZuIC0wLjcwNTIwMCAtMC40NjY0MDAgLTAuNTMzOTAwCit2biAtMC43MDI2MDAgLTAuNDY0MDAwIC0wLjUzOTYwMAordm4gLTAuNDY1NTAwIC0wLjczNDMwMCAtMC40OTQwMDAKK3ZuIC0wLjQ1NzAwMCAtMC43MTUyMDAgLTAuNTI4ODAwCit2biAtMC4xOTA3MDAgLTAuODI5NzAwIC0wLjUyNDYwMAordm4gLTAuMTkyMzAwIC0wLjg1MjUwMCAtMC40ODYxMDAKK3ZuIC0wLjgxMzkwMCAwLjE4MDIwMCAtMC41NTIzMDAKK3ZuIC0wLjgxNzAwMCAwLjE4MDUwMCAtMC41NDc3MDAKK3ZuIC0wLjY5MTEwMCAwLjQ2MTIwMCAtMC41NTY0MDAKK3ZuIC0wLjY5MzEwMCAwLjQ2MjIwMCAtMC41NTMyMDAKK3ZuIC0wLjQ1MjYwMCAwLjY2ODkwMCAtMC41ODk4MDAKK3ZuIC0wLjQ2NjQwMCAwLjY4NDkwMCAtMC41NTk4MDAKK3ZuIC0wLjE2ODkwMCAwLjgwOTkwMCAtMC41NjE3MDAKK3ZuIC0wLjE2OTAwMCAwLjgxMDAwMCAtMC41NjE1MDAKK3ZuIDAuMTU3NjAwIDAuODExOTAwIC0wLjU2MjEwMAordm4gMC4xNTc2MDAgMC44MTIzMDAgLTAuNTYxNjAwCit2biAwLjQ1ODQwMCAwLjY5MzcwMCAtMC41NTU1MDAKK3ZuIDAuNDU2OTAwIDAuNjkwODAwIC0wLjU2MDQwMAordm4gMC42ODYyMDAgMC40NzE5MDAgLTAuNTUzNjAwCit2biAwLjY4NjEwMCAwLjQ3MTgwMCAtMC41NTM4MDAKK3ZuIDAuODE3MzAwIDAuMTcxOTAwIC0wLjU0OTkwMAordm4gMC44MTY3MDAgMC4xNzE3MDAgLTAuNTUwOTAwCit2biAwLjgyMjEwMCAtMC4xNjEwMDAgLTAuNTQ2MTAwCit2biAwLjgyMDcwMCAtMC4xNjA5MDAgLTAuNTQ4MjAwCit2biAwLjcwNjIwMCAtMC40Njg4MDAgLTAuNTMwNjAwCit2biAwLjcwMDYwMCAtMC40NjYwMDAgLTAuNTQwMzAwCit2biAwLjQ2ODkwMCAtMC42ODg3MDAgLTAuNTUzMTAwCit2biAwLjQ4MjMwMCAtMC43MDQwMDAgLTAuNTIxMzAwCit2biAwLjE2OTIwMCAtMC44MTU1MDAgLTAuNTUzNTAwCit2biAwLjE2OTIwMCAtMC44MTU2MDAgLTAuNTUzNDAwCit2biAtMC4xNTc5MDAgLTAuODE4MDAwIC0wLjU1MzIwMAordm4gLTAuMTU3ODAwIC0wLjgxNzcwMCAtMC41NTM1MDAKK3ZuIC0wLjQ3MjEwMCAtMC43MTQ4MDAgLTAuNTE2MDAwCit2biAtMC40NjE2MDAgLTAuNjk0MDAwIC0wLjU1MjYwMAordm4gLTAuNjkyOTAwIC0wLjQ3MzkwMCAtMC41NDM0MDAKK3ZuIC0wLjcwMDkwMCAtMC40ODA4MDAgLTAuNTI2ODAwCit2biAtMC44MDkyMDAgLTAuMjIxODAwIC0wLjU0NDAwMAordm4gLTAuODA1NjAwIC0wLjIyMDEwMCAtMC41NTAxMDAKK3ZuIDAuODM3MTAwIDAuMDAwMDAwIC0wLjU0NzAwMAordm4gMC44MzcxMDAgMC4wMDAyMDAgLTAuNTQ3MTAwCit2biAwLjAwMDMwMCAtMC44NTA4MDAgLTAuNTI1NjAwCit2biAwLjAwMDMwMCAtMC44NTA3MDAgLTAuNTI1NzAwCit2biAwLjgzODEwMCAwLjAwMDEwMCAtMC41NDU1MDAKK3ZuIDAuODM4MDAwIDAuMDAwMjAwIC0wLjU0NTYwMAordm4gLTAuMDAwMjAwIDAuODI3OTAwIC0wLjU2MDgwMAordm4gLTAuMDAwNTAwIDAuODI3OTAwIC0wLjU2MDgwMAordm4gLTAuMDAwNTAwIDAuODI5ODAwIC0wLjU1ODEwMAordm4gLTAuMDAwMTAwIDAuODI5NjAwIC0wLjU1ODQwMAordm4gLTAuODM3OTAwIC0wLjAwMDEwMCAtMC41NDU5MDAKK3ZuIC0wLjgzNzgwMCAtMC4wMDAyMDAgLTAuNTQ1OTAwCit2biAtMC44Mzg1MDAgLTAuMDAwMjAwIC0wLjU0NDkwMAordm4gLTAuODM4MjAwIC0wLjAwMDEwMCAtMC41NDUzMDAKK3ZuIC0wLjgzOTMwMCAtMC4wMDAyMDAgLTAuNTQzNzAwCit2biAtMC44Mzk1MDAgLTAuMDAwMjAwIC0wLjU0MzMwMAordm4gLTAuODM5MzAwIC0wLjAwMDEwMCAtMC41NDM3MDAKK3ZuIDAuMDAyMTAwIC0wLjg0OTEwMCAtMC41MjgzMDAKK3ZuIDAuMDAwMTAwIC0wLjg0NzAwMCAtMC41MzE2MDAKK3ZuIDAuMzA5NzAwIDAuNzcxODAwIC0wLjU1NTQwMAordm4gMC4zMDk2MDAgMC43NzMxMDAgLTAuNTUzNTAwCit2biAtMC4zMjU1MDAgMC43NjYyMDAgLTAuNTU0MTAwCit2biAtMC4zMjY1MDAgMC43NjcxMDAgLTAuNTUyMzAwCit2biAtMC43NzQwMDAgMC4zMTYwMDAgLTAuNTQ4ODAwCit2biAtMC43NzQwMDAgMC4zMTYwMDAgLTAuNTQ4NzAwCit2biAtMC43NzQ3MDAgLTAuMzI4OTAwIC0wLjU0MDAwMAordm4gLTAuNzc0ODAwIC0wLjMyODkwMCAtMC41NDAwMDAKK3ZuIC0wLjMyMTgwMCAtMC43OTUwMDAgLTAuNTE0MjAwCit2biAtMC4zMjE5MDAgLTAuNzgyMDAwIC0wLjUzMzYwMAordm4gMC4zMjgyMDAgLTAuNzc5NzAwIC0wLjUzMzIwMAordm4gMC4zMzc2MDAgLTAuNzg4ODAwIC0wLjUxMzYwMAordm4gMC43NDY4MDAgLTAuNDIwMDAwIC0wLjUxNTcwMAordm4gMC43MTg4MDAgLTAuNDE2MDAwIC0wLjU1NzAwMAordm4gMC43MTI5MDAgMC40MTMzMDAgLTAuNTY2NTAwCit2biAwLjczMTAwMCAwLjQzNTgwMCAtMC41MjUxMDAKK3ZuIDAuMDAwMjAwIC0wLjg1MTAwMCAtMC41MjUxMDAKK3ZuIDAuMDAwMDAwIC0wLjg1MDkwMCAtMC41MjUzMDAKK3ZuIDAuODQ0NDAwIC0wLjAwMTIwMCAtMC41MzU4MDAKK3ZuIDAuODM2MTAwIC0wLjAwNDMwMCAtMC41NDg1MDAKK3ZuIDAuMDAwMzAwIC0wLjg1MDgwMCAtMC41MjU1MDAKK3ZuIDAuMDAwMTAwIC0wLjg0OTcwMCAtMC41MjcyMDAKK3ZuIDAuODM5NzAwIDAuMDAwMjAwIC0wLjU0MzEwMAordm4gMC44MzkyMDAgMC4wMDAwMDAgLTAuNTQzODAwCit2biAtMC44Mzk2MDAgLTAuMDAwMjAwIC0wLjU0MzIwMAordm4gLTAuODM5NjAwIC0wLjAwMDEwMCAtMC41NDMyMDAKK3ZuIDAuMjA2ODAwIDAuODMwMDAwIC0wLjUxODAwMAordm4gMC4yMDE0MDAgMC43NTg2MDAgLTAuNjE5NzAwCit2biAtMC4wNTg2MDAgLTAuODEyODAwIC0wLjU3OTYwMAordm4gLTAuMDAwMDAwIC0wLjg0NDcwMCAtMC41MzUyMDAKK3ZuIDAuMDAxMjAwIC0wLjg0OTQwMCAtMC41Mjc3MDAKK3ZuIDAuMDAwMTAwIC0wLjg0OTAwMCAtMC41Mjg1MDAKK3ZuIDAuODM4MTAwIDAuMDAwMjAwIC0wLjU0NTYwMAordm4gMC44MzgwMDAgMC4wMDAyMDAgLTAuNTQ1NzAwCit2biAtMC44Mzg4MDAgLTAuMDAwMTAwIC0wLjU0NDUwMAordm4gLTAuMDAwMTAwIDAuODMxMzAwIC0wLjU1NTcwMAordm4gLTAuMDAwMjAwIDAuODMxNDAwIC0wLjU1NTYwMAordm4gMC4wMDAyMDAgLTAuODUwNzAwIC0wLjUyNTYwMAordm4gLTAuNzY5MjAwIC0wLjIzNzEwMCAtMC41OTM0MDAKK3ZuIC0wLjc5MDkwMCAtMC4yMTk4MDAgLTAuNTcxMTAwCit2biAwLjgzODMwMCAwLjAwMDQwMCAtMC41NDUyMDAKK3ZuIDAuODM4MTAwIDAuMDAwMjAwIC0wLjU0NTUwMAordm4gMC44MzgzMDAgMC4wMDAyMDAgLTAuNTQ1MjAwCit2biAwLjgzODMwMCAwLjAwMDEwMCAtMC41NDUyMDAKK3ZuIC0wLjAwMDcwMCAwLjgyODgwMCAtMC41NTk1MDAKK3ZuIC0wLjAwMDQwMCAwLjgyODAwMCAtMC41NjA3MDAKK3ZuIC0wLjgzODIwMCAtMC4wMDAyMDAgLTAuNTQ1MzAwCit2biAtMC4wMDE0MDAgMS4wMDAwMDAgLTAuMDAxNjAwCit2biAtMC4wMDE0MDAgMS4wMDAwMDAgLTAuMDAxNzAwCit2biAtMS4wMDAwMDAgLTAuMDAwMzAwIDAuMDAwMDAwCit2biAtMC4wMDAxMDAgMS4wMDAwMDAgLTAuMDAwMTAwCit2biAtMC4wMDAyMDAgMS4wMDAwMDAgLTAuMDAwMzAwCit2biAtMC4wMDEyMDAgMS4wMDAwMDAgLTAuMDAxNzAwCit2biAtMC4wMDEyMDAgMS4wMDAwMDAgLTAuMDAxNjAwCit2biAwLjAwMDEwMCAtMS4wMDAwMDAgMC4wMDAxMDAKK3ZuIC0wLjAwMTcwMCAxLjAwMDAwMCAtMC4wMDE3MDAKK3ZuIDAuMDAwMTAwIC0xLjAwMDAwMCAwLjAwMDAwMAordm4gLTAuMDAwMTAwIDEuMDAwMDAwIC0wLjAwMDIwMAordm4gLTAuMDAwMjAwIDEuMDAwMDAwIC0wLjAwMDIwMAordm4gLTAuOTc2NTAwIDAuMjE1NzAwIDAuMDAwMzAwCit2biAtMC45NzY1MDAgMC4yMTU3MDAgMC4wMDAxMDAKK3ZuIC0wLjk2NDcwMCAtMC4yNjM1MDAgMC4wMDAxMDAKK3ZuIC0wLjk2NDcwMCAtMC4yNjM0MDAgMC4wMDA2MDAKK3ZuIC0wLjgyNDYwMCAtMC41NjU3MDAgLTAuMDAxNDAwCit2biAtMC44MjQ3MDAgLTAuNTY1NjAwIC0wLjAwMDEwMAordm4gLTAuNTUzODAwIC0wLjgzMjYwMCAtMC4wMDAxMDAKK3ZuIC0wLjU1MzYwMCAtMC44MzI4MDAgLTAuMDAyMzAwCit2biAtMC4xODk1MDAgLTAuOTgxOTAwIDAuMDA2ODAwCit2biAtMC4xODg3MDAgLTAuOTgyMDAwIC0wLjAwMDMwMAordm4gMC4yMDMxMDAgLTAuOTc5MjAwIC0wLjAwMDIwMAordm4gMC4yMDIzMDAgLTAuOTc5MzAwIDAuMDA2NjAwCit2biAwLjU2NTIwMCAtMC44MjUwMDAgMC4wMDA5MDAKK3ZuIDAuNTY1MzAwIC0wLjgyNDkwMCAtMC4wMDAzMDAKK3ZuIDAuODMyNjAwIC0wLjU1MzgwMCAwLjAwMDEwMAordm4gMC44MzI2MDAgLTAuNTUzOTAwIDAuMDAwNDAwCit2biAwLjk4MTMwMCAtMC4xOTI0MDAgLTAuMDAwMzAwCit2biAwLjk4MTMwMCAtMC4xOTI0MDAgLTAuMDAwMTAwCit2biAwLjk3ODYwMCAwLjIwNTcwMCAtMC4wMDAzMDAKK3ZuIDAuOTc4NjAwIDAuMjA1NzAwIC0wLjAwMDEwMAordm4gMC44MjQwMDAgMC41NjY2MDAgLTAuMDAxMjAwCit2biAwLjgyNDEwMCAwLjU2NjUwMCAtMC4wMDA0MDAKK3ZuIDAuNTUxNzAwIDAuODM0MTAwIC0wLjAwMTAwMAordm4gMC41NTE2MDAgMC44MzQxMDAgLTAuMDAxNjAwCit2biAwLjE5MDUwMCAwLjk4MTcwMCAtMC4wMDE0MDAKK3ZuIDAuMTkwNTAwIDAuOTgxNzAwIC0wLjAwMTIwMAordm4gLTAuMjA0MjAwIDAuOTc4OTAwIC0wLjAwMTYwMAordm4gLTAuMjA0MTAwIDAuOTc4OTAwIC0wLjAwMTIwMAordm4gLTAuODMyMDAwIDAuNTU0ODAwIC0wLjAwMDAwMAordm4gLTAuODMyMDAwIDAuNTU0ODAwIC0wLjAwMDUwMAordm4gLTAuNTYyODAwIDAuODI2NjAwIC0wLjAwMDkwMAordm4gLTAuNTYyOTAwIDAuODI2NTAwIC0wLjAwMTIwMAordm4gMC4wMDAxMDAgLTAuODQ3MTAwIC0wLjUzMTQwMAordm4gMC4wMDEwMDAgLTAuODQ2NjAwIC0wLjUzMjIwMAordm4gMC44MzgwMDAgMC4wMDAxMDAgLTAuNTQ1NjAwCit2biAtMC44Mzg3MDAgLTAuMDAwMTAwIC0wLjU0NDcwMAordm4gMC44Mzg1MDAgMC4wMDAwMDAgLTAuNTQ0ODAwCit2biAwLjgzNzkwMCAwLjAwMDIwMCAtMC41NDU4MDAKK3ZuIDAuODM4OTAwIDAuMDAwMDAwIC0wLjU0NDIwMAordm4gMC44Mzg1MDAgMC4wMDAyMDAgLTAuNTQ0OTAwCit2biAwLjgzNzkwMCAwLjAwMDAwMCAtMC41NDU4MDAKK3ZuIDAuODM3MTAwIDAuMDAwMjAwIC0wLjU0NzAwMAordm4gLTAuMDAwMTAwIDAuODMxNzAwIC0wLjU1NTMwMAordm4gMC4wMDAyMDAgLTAuODUwNzAwIC0wLjUyNTcwMAordm4gMC4wMDAyMDAgLTAuODUwODAwIC0wLjUyNTUwMAordm4gMC44MzkwMDAgMC4wMDAyMDAgLTAuNTQ0MTAwCit2biAwLjgzOTEwMCAwLjAwMDAwMCAtMC41NDQwMDAKK3ZuIDAuODM5MDAwIDAuMDAwMjAwIC0wLjU0NDIwMAordm4gLTAuNzA1NzAwIC0wLjQ0NjkwMCAtMC41NDk4MDAKK3ZuIC0wLjcxNDYwMCAtMC40NDk2MDAgLTAuNTM2MDAwCit2biAtMC43MTQ0MDAgLTAuNDI0MTAwIC0wLjU1NjUwMAordm4gLTAuNzE0MzAwIC0wLjQyNDIwMCAtMC41NTY2MDAKK3ZuIC0wLjAwMDcwMCAwLjgyOTcwMCAtMC41NTgzMDAKK3ZuIC0wLjAwMDQwMCAwLjgyODcwMCAtMC41NTk3MDAKK3ZuIC0wLjgzODcwMCAtMC4wMDAyMDAgLTAuNTQ0NTAwCit2biAtMC44Mzg1MDAgLTAuMDAwMTAwIC0wLjU0NDkwMAordm4gMS4wMDAwMDAgMC4wMDA0MDAgLTAuMDAwMDAwCit2biAwLjE2ODkwMCAwLjk4NTYwMCAtMC4wMDYzMDAKK3ZuIDAuMTcwNjAwIDAuOTg1MzAwIC0wLjAwMzcwMAordm4gMC41MjAyMDAgMC44NTQxMDAgLTAuMDAzMDAwCit2biAwLjUyMDEwMCAwLjg1NDEwMCAtMC4wMDM2MDAKK3ZuIDAuODI2MTAwIDAuNTYzNjAwIC0wLjAwMjcwMAordm4gMC44MjU2MDAgMC41NjQxMDAgLTAuMDExMDAwCit2biAwLjk4MjEwMCAwLjE4ODEwMCAtMC4wMDQwMDAKK3ZuIDAuOTgyMjAwIDAuMTg3OTAwIC0wLjAwMDkwMAordm4gMC45ODEwMDAgLTAuMTk0MDAwIDAuMDAwMTAwCit2biAwLjk4MDkwMCAtMC4xOTQyMDAgMC4wMDMzMDAKK3ZuIDAuODMzNzAwIC0wLjU1MjIwMCAwLjAxMDIwMAordm4gMC44MzQwMDAgLTAuNTUxNzAwIDAuMDAxNjAwCit2biAwLjU2MDcwMCAtMC44MjgwMDAgMC4wMDIzMDAKK3ZuIDAuNTYwMzAwIC0wLjgyODIwMCAwLjAwODgwMAordm4gMC4xOTg4MDAgLTAuOTgwMDAwIDAuMDEwNDAwCit2biAwLjE5NTYwMCAtMC45NzkyMDAgMC4wNTM2MDAKK3ZuIC0wLjIyNjMwMCAtMC45NzI2MDAgMC4wNTM2MDAKK3ZuIC0wLjIyMzcwMCAtMC45NzQ2MDAgMC4wMTAxMDAKK3ZuIC0wLjU5NDgwMCAtMC44MDM5MDAgMC4wMDg2MDAKK3ZuIC0wLjU5NDQwMCAtMC44MDQxMDAgMC4wMDM0MDAKK3ZuIC0wLjkzOTQwMCAtMC4zNDI4MDAgMC4wMDA1MDAKK3ZuIC0wLjkzOTYwMCAtMC4zNDIxMDAgMC4wMDcxMDAKK3ZuIC0wLjAwMDEwMCAxLjAwMDAwMCAtMC4wMDAzMDAKK3ZuIC0wLjAwMDEwMCAxLjAwMDAwMCAtMC4wMDA0MDAKK3ZuIDAuMDAwMTAwIC0xLjAwMDAwMCAwLjAwMDQwMAordm4gMC4wMDAyMDAgLTEuMDAwMDAwIDAuMDAwNTAwCit2biAwLjk4MjMwMCAtMC4xODczMDAgLTAuMDAwMzAwCit2biAwLjk4MjIwMCAtMC4xODc3MDAgMC4wMDA0MDAKK3ZuIDAuODM1NTAwIDAuNTQ5NDAwIC0wLjAxMTIwMAordm4gMC44MzU2MDAgMC41NDkyMDAgLTAuMDA4NTAwCit2biAwLjU2NDgwMCAwLjgyNTEwMCAtMC4wMTI2MDAKK3ZuIDAuNTY2MzAwIDAuODI0MTAwIDAuMDEyNDAwCit2biAwLjIxMjQwMCAwLjk3NzEwMCAwLjAxNTEwMAordm4gMC4yMTIzMDAgMC45NzcxMDAgMC4wMTI4MDAKK3ZuIC0wLjIwMzcwMCAwLjk3ODkwMCAwLjAxMzEwMAordm4gLTAuMjAzNzAwIDAuOTc4OTAwIDAuMDEzODAwCit2biAtMC41NjI3MDAgMC44MjY2MDAgMC4wMTE5MDAKK3ZuIC0wLjU2NDEwMCAwLjgyNTYwMCAtMC4wMTIyMDAKK3ZuIC0wLjgzMTgwMCAwLjU1NTEwMCAtMC4wMDgwMDAKK3ZuIC0wLjgzMTgwMCAwLjU1NTAwMCAtMC4wMTAxMDAKK3ZuIC0wLjk3OTcwMCAwLjIwMDQwMCAtMC4wMDMzMDAKK3ZuIC0wLjk3OTcwMCAwLjIwMDQwMCAtMC4wMDM0MDAKK3ZuIC0wLjk3ODYwMCAtMC4yMDU4MDAgMC4wMDQ0MDAKK3ZuIC0wLjgzNDQwMCAtMC41NTEwMDAgMC4wMTExMDAKK3ZuIC0wLjgzNDEwMCAtMC41NTE2MDAgMC4wMDI1MDAKK3ZuIC0wLjUzODQwMCAtMC44NDI3MDAgMC4wMDMyMDAKK3ZuIC0wLjUzODQwMCAtMC44NDI3MDAgMC4wMDI5MDAKK3ZuIC0wLjIyMDAwMCAtMC45NzU1MDAgMC4wMDMzMDAKK3ZuIC0wLjIyMDEwMCAtMC45NzU1MDAgMC4wMDQwMDAKK3ZuIDAuMDAwMzAwIC0xLjAwMDAwMCAwLjAwMTAwMAordm4gMC4wMDAzMDAgLTEuMDAwMDAwIDAuMDAwODAwCit2biAtMC4wMDAzMDAgMS4wMDAwMDAgLTAuMDAxMzAwCit2biAtMC4wMDAxMDAgMS4wMDAwMDAgLTAuMDAxMjAwCit2biAtMC4wMDAzMDAgMS4wMDAwMDAgLTAuMDAxNDAwCit2biAwLjAwMDIwMCAtMS4wMDAwMDAgMC4wMDAyMDAKK3ZuIDAuMzcxNzAwIDAuOTI4MjAwIC0wLjAxNzkwMAordm4gMC4zNzE3MDAgMC45MjgyMDAgLTAuMDE4MDAwCit2biAtMC4zOTE2MDAgMC45MjAwMDAgLTAuMDE4MjAwCit2biAtMC4zOTE1MDAgMC45MjAwMDAgLTAuMDE3MjAwCit2biAtMC45MjU4MDAgMC4zNzgwMDAgLTAuMDA2ODAwCit2biAtMC45MjU4MDAgMC4zNzc5MDAgLTAuMDA3MDAwCit2biAtMC45MjA1MDAgLTAuMzkwODAwIDAuMDA4MTAwCit2biAtMC45MjA1MDAgLTAuMzkwODAwIDAuMDA3OTAwCit2biAtMC4zODA2MDAgLTAuOTI0NjAwIDAuMDE4MjAwCit2biAtMC4zNzc4MDAgLTAuOTI1OTAwIDAuMDAyMDAwCit2biAwLjM5MzQwMCAtMC45MTk0MDAgMC4wMDE3MDAKK3ZuIDAuMzkwNjAwIC0wLjkyMDQwMCAwLjAxNzMwMAordm4gMC44NjU0MDAgLTAuNTAwOTAwIDAuMDA5MTAwCit2biAwLjg2NTQwMCAtMC41MDEwMDAgMC4wMDk0MDAKK3ZuIDAuODU4OTAwIDAuNTEyMTAwIC0wLjAxMDMwMAordm4gMC44NTg5MDAgMC41MTIxMDAgLTAuMDEwMjAwCit2biAwLjAwMDEwMCAtMS4wMDAwMDAgMC4wMDA1MDAKK3ZuIDEuMDAwMDAwIC0wLjAwNTEwMCAtMC4wMDA0MDAKK3ZuIDEuMDAwMDAwIC0wLjAwNTEwMCAtMC4wMDAzMDAKK3ZuIDAuMDAwMjAwIC0xLjAwMDAwMCAwLjAwMDQwMAordm4gMC4yNTY2MDAgMC45NjY1MDAgLTAuMDAzODAwCit2biAwLjI1NjcwMCAwLjk2NjUwMCAtMC4wMDMxMDAKK3ZuIDAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwNDAwMAordm4gLTAuMDAwMDAwIC0xLjAwMDAwMCAwLjAwNDEwMAordm4gMS4wMDAwMDAgMC4wMDAzMDAgLTAuMDAwMDAwCit2biAtMC4wMDAyMDAgMS4wMDAwMDAgLTAuMDAwNDAwCit2biAwLjAwMDIwMCAtMS4wMDAwMDAgMC4wMDEwMDAKK3ZuIDAuMDAwMjAwIC0xLjAwMDAwMCAwLjAwMDkwMAordm4gLTAuOTU1NjAwIC0wLjI5NDYwMCAwLjAwNjIwMAordm4gLTAuOTU1MDAwIC0wLjI5NjgwMCAwLjAwMDUwMAordm4gLTAuMDAwNTAwIDEuMDAwMDAwIC0wLjAwMTQwMAordm4gLTAuMDAwNTAwIDEuMDAwMDAwIC0wLjAwMTMwMAordm4gLTAuODQ0ODAwIC0wLjUzNTAwMCAwLjAwMjMwMAordm4gLTAuODQ0ODAwIC0wLjUzNTEwMCAwLjAwMTYwMAordm4gMC4wMDAzMDAgLTEuMDAwMDAwIDAuMDAxMjAwCit2biAwLjAwMDEwMCAtMS4wMDAwMDAgMC4wMDAzMDAKK3ZuIDAuMDAwMzAwIC0xLjAwMDAwMCAwLjAwMDkwMAordm4gLTAuODU5OTAwIC0wLjUxMDUwMCAwLjAwMTYwMAordm4gLTAuODU5ODAwIC0wLjUxMDcwMCAwLjAwMDYwMAordm4gLTAuMDAwNTAwIDEuMDAwMDAwIC0wLjAwMTEwMAordm4gLTAuNTE2MDAwIDAuNDY2MjAwIC0wLjcxODYwMAordm4gLTAuNTIyNzAwIDAuNDY4NzAwIC0wLjcxMjEwMAordm4gLTAuMzcxMDAwIDAuNTgzMTAwIC0wLjcyMjcwMAordm4gLTAuMzcyNjAwIDAuNTkyMjAwIC0wLjcxNDUwMAordm4gLTAuMjE2NTAwIDAuNjU5MDAwIC0wLjcyMDMwMAordm4gLTAuMjE2MDAwIDAuNjUxOTAwIC0wLjcyNjkwMAordm4gLTAuMDY5MTAwIDAuNjkxNjAwIC0wLjcxOTAwMAordm4gLTAuMDY4NzAwIDAuNjk1NDAwIC0wLjcxNTMwMAordm4gMC4xMDA3MDAgMC42ODE3MDAgLTAuNzI0NjAwCit2biAwLjEwNDYwMCAwLjY5MjUwMCAtMC43MTM4MDAKK3ZuIDAuMzc3NDAwIDAuNTc0ODAwIC0wLjcyNjEwMAordm4gMC4zODkwMDAgMC41ODc2MDAgLTAuNzA5NTAwCit2biAwLjU5MTEwMCAwLjM5NTgwMCAtMC43MDI4MDAKK3ZuIDAuNTc0MTAwIDAuMzc5NzAwIC0wLjcyNTQwMAordm4gMC42OTU2MDAgMC4xMjQ5MDAgLTAuNzA3NDAwCit2biAwLjY4NzgwMCAwLjEyMTkwMCAtMC43MTU2MDAKK3ZuIDAuNzAzMzAwIC0wLjA3NDkwMCAtMC43MDY5MDAKK3ZuIDAuNjk4NTAwIC0wLjA3MzUwMCAtMC43MTE4MDAKK3ZuIDAuNjU2OTAwIC0wLjI4NTYwMCAtMC42OTc4MDAKK3ZuIDAuNjQ2ODAwIC0wLjI3OTEwMCAtMC43MDk4MDAKK3ZuIDAuNDczMDAwIC0wLjU1NjEwMCAtMC42ODM0MDAKK3ZuIDAuNDQ3NDAwIC0wLjUzNTIwMCAtMC43MTY1MDAKK3ZuIDAuMjQyNDAwIC0wLjY2MjIwMCAtMC43MDkwMDAKK3ZuIDAuMjQwMzAwIC0wLjY1ODkwMCAtMC43MTI4MDAKK3ZuIDAuMDQwOTAwIC0wLjcwNDgwMCAtMC43MDgyMDAKK3ZuIDAuMDQzMDAwIC0wLjcxMjIwMCAtMC43MDA2MDAKK3ZuIC0wLjEwMTcwMCAtMC42NzkwMDAgLTAuNzI3MTAwCit2biAtMC4wOTkzMDAgLTAuNzAwMzAwIC0wLjcwNjkwMAordm4gLTAuMjA2NjAwIC0wLjY1ODMwMCAtMC43MjM5MDAKK3ZuIC0wLjIwMzcwMCAtMC42OTc3MDAgLTAuNjg2ODAwCit2biAtMC43MDMwMDAgLTAuMDAwMDAwIC0wLjcxMTIwMAordm4gLTAuNzAzNDAwIC0wLjAwMDUwMCAtMC43MTA4MDAKK3ZuIC0wLjAwMDAwMCAwLjY5NjUwMCAtMC43MTc2MDAKK3ZuIC0wLjAwMDEwMCAwLjY5NjUwMCAtMC43MTc1MDAKK3ZuIDAuNjk5NzAwIDAuMDAwNjAwIC0wLjcxNDQwMAordm4gMC42OTg4MDAgMC4wMDAwMDAgLTAuNzE1MzAwCit2biAwLjAwMDkwMCAtMC43MDkzMDAgLTAuNzA0OTAwCit2biAwLjAwMTEwMCAtMC43MDk0MDAgLTAuNzA0ODAwCit2biAwLjcyMDUwMCAtMC4wMDE2MDAgLTAuNjkzNDAwCit2biAwLjcxNTEwMCAwLjAwMjIwMCAtMC42OTkwMDAKK3ZuIDAuMzg4ODAwIDAuNTY5MTAwIC0wLjcyNDUwMAordm4gMC40MDU2MDAgMC42MjQ3MDAgLTAuNjY3MjAwCit2biAtMC4zNDI0MDAgMC42MTI0MDAgLTAuNzEyNjAwCit2biAtMC4zMzk1MDAgMC42MDMxMDAgLTAuNzIxODAwCit2biAtMC42NDc0MDAgMC4yNjM2MDAgLTAuNzE1MTAwCit2biAtMC42NTExMDAgMC4yNjYxMDAgLTAuNzEwOTAwCit2biAtMC43MDA5MDAgMC4wMjU0MDAgLTAuNzEyODAwCit2biAtMC43MDIzMDAgMC4wMjU4MDAgLTAuNzExNDAwCit2biAtMC42NzM1MDAgLTAuMTgzOTAwIC0wLjcxNjAwMAordm4gLTAuNjg4MjAwIC0wLjE5MTMwMCAtMC42OTk5MDAKK3ZuIC0wLjQ5MTQwMCAtMC40OTIwMDAgLTAuNzE4NzAwCit2biAtMC41MDYxMDAgLTAuNTE2MTAwIC0wLjY5MTAwMAordm4gLTAuMTc2NDAwIC0wLjY2ODUwMCAtMC43MjI1MDAKK3ZuIC0wLjE3NjcwMCAtMC42ODMzMDAgLTAuNzA4NTAwCit2biAwLjA3NzUwMCAtMC42OTcxMDAgLTAuNzEyNzAwCit2biAwLjA3NTUwMCAtMC43MDU4MDAgLTAuNzA0NDAwCit2biAwLjQyMjgwMCAtMC41Nzc3MDAgLTAuNjk4MjAwCit2biAwLjQyNzQwMCAtMC41OTI0MDAgLTAuNjgyOTAwCit2biAtMC43MDQ0MDAgLTAuMDAwMTAwIC0wLjcwOTgwMAordm4gLTAuNzA0MTAwIDAuMDAwMDAwIC0wLjcxMDEwMAordm4gMC43MDU4MDAgLTAuMDAwMDAwIC0wLjcwODUwMAordm4gMC43MDc5MDAgLTAuMDAxNzAwIC0wLjcwNjMwMAordm4gMC43MDc5MDAgMC4wMDMzMDAgLTAuNzA2MzAwCit2biAwLjY5OTcwMCAwLjAwMDEwMCAtMC43MTQ0MDAKK3ZuIC0wLjcwNDUwMCAwLjAwMDAwMCAtMC43MDk3MDAKK3ZuIC0wLjMxNjUwMCAtMC42NTEyMDAgLTAuNjg5ODAwCit2biAtMC4zMjA2MDAgLTAuNjc1MDAwIC0wLjY2NDUwMAordm4gLTAuMDAwMDAwIDAuNjk1ODAwIC0wLjcxODIwMAordm4gLTAuMDAwMTAwIDAuNjk2MjAwIC0wLjcxNzkwMAordm4gLTAuMDAwMDAwIDAuNjk2MjAwIC0wLjcxNzgwMAordm4gLTAuMDAwMTAwIDAuNjk2NTAwIC0wLjcxNzYwMAordm4gLTAuNDc2MzAwIC0wLjU0MDMwMCAtMC42OTM3MDAKK3ZuIC0wLjY1MzYwMCAtMC41MTM0MDAgLTAuNTU2MTAwCit2biAtMC43MDM2MDAgMC4wMDAwMDAgLTAuNzEwNjAwCit2biAtMC43MDMzMDAgLTAuMDAwMTAwIC0wLjcxMDkwMAordm4gMC4wMDEyMDAgLTAuNzA4NTAwIC0wLjcwNTcwMAordm4gMC4wMDE2MDAgLTAuNzA5MzAwIC0wLjcwNDkwMAordm4gLTAuMDAwMTAwIDAuNjk1NTAwIC0wLjcxODUwMAordm4gLTAuMDAwMDAwIDAuNjk1NzAwIC0wLjcxODQwMAordm4gLTAuMDAwMTAwIDAuNjk1NjAwIC0wLjcxODQwMAordm4gLTAuMDAwMjAwIDAuNjk2MDAwIC0wLjcxODEwMAordm4gLTAuMDAxNDAwIC0wLjcxNDgwMCAtMC42OTkzMDAKK3ZuIC0wLjAwNTUwMCAtMC43MDg2MDAgLTAuNzA1NjAwCit2biAwLjcyNzEwMCAwLjAwMDcwMCAtMC42ODY1MDAKK3ZuIDAuNzIwNTAwIC0wLjAwMjIwMCAtMC42OTM0MDAKK3ZuIC0wLjcwNDEwMCAtMC4wMDAxMDAgLTAuNzEwMTAwCit2biAtMC43MDM5MDAgLTAuMDAwMDAwIC0wLjcxMDMwMAordm4gLTAuNDEzODAwIC0wLjQxMDMwMCAtMC44MTI3MDAKK3ZuIC0wLjQ4ODUwMCAtMC41MjIzMDAgLTAuNjk5MDAwCit2biAtMC43NDQ1MDAgMC42Njc2MDAgMC4wMDA1MDAKK3ZuIC0wLjc0NDQwMCAwLjY2NzcwMCAwLjAwMDkwMAordm4gLTAuNTM2ODAwIDAuODQzNzAwIC0wLjAwMDIwMAordm4gLTAuNTM2NTAwIDAuODQzOTAwIDAuMDAwNjAwCit2biAtMC4zMTIyMDAgMC45NTAwMDAgLTAuMDAwMTAwCit2biAtMC4zMTI1MDAgMC45NDk5MDAgLTAuMDAxMzAwCit2biAtMC4wOTk1MDAgMC45OTUwMDAgLTAuMDAxMzAwCit2biAtMC4wOTkzMDAgMC45OTUxMDAgLTAuMDAwNjAwCit2biAwLjE0NjEwMCAwLjk4OTMwMCAtMC4wMDA3MDAKK3ZuIDAuMTQ2NjAwIDAuOTg5MjAwIDAuMDAxNjAwCit2biAwLjU0ODkwMCAwLjgzNTkwMCAwLjAwMTMwMAordm4gMC41NDg2MDAgMC44MzYxMDAgLTAuMDAwNTAwCit2biAwLjgzNDEwMCAwLjU1MTYwMCAtMC4wMDA0MDAKK3ZuIDAuODM0MTAwIDAuNTUxNjAwIC0wLjAwMDEwMAordm4gMC45ODQ3MDAgMC4xNzQ1MDAgLTAuMDAwMjAwCit2biAwLjk4NDYwMCAwLjE3NDcwMCAtMC4wMDEwMDAKK3ZuIDAuOTk0NDAwIC0wLjEwNTgwMCAwLjAwMDMwMAordm4gMC45OTQ0MDAgLTAuMTA1ODAwIC0wLjAwMDAwMAordm4gMC45MTcxMDAgLTAuMzk4ODAwIDAuMDAwNDAwCit2biAwLjkxNzAwMCAtMC4zOTg5MDAgMC4wMDA5MDAKK3ZuIDAuNjQxMzAwIC0wLjc2NzIwMCAwLjAwMjAwMAordm4gMC42NDIwMDAgLTAuNzY2NzAwIC0wLjAwMTkwMAordm4gMC4zNDI3MDAgLTAuOTM5NTAwIC0wLjAwMjMwMAordm4gMC4zNDE5MDAgLTAuOTM5NzAwIDAuMDAwNzAwCit2biAwLjA2MDMwMCAtMC45OTgyMDAgMC4wMDA3MDAKK3ZuIDAuMDU5OTAwIC0wLjk5ODIwMCAwLjAwMjMwMAordm4gLTAuMTQwNTAwIC0wLjk5MDEwMCAwLjAwMjEwMAordm4gLTAuMTQwNjAwIC0wLjk5MDEwMCAwLjAwMjYwMAordm4gLTAuMjk1ODAwIC0wLjk1NTIwMCAtMC4wMDYyMDAKK3ZuIC0wLjI5OTQwMCAtMC45NTQxMDAgMC4wMDI1MDAKK3ZuIC0wLjQyOTAwMCAtMC45MDMzMDAgLTAuMDA1ODAwCit2biAtMC40MjkwMDAgLTAuOTAzMzAwIC0wLjAwNTkwMAordm4gLTAuNTk3NzAwIC0wLjgwMTcwMCAtMC4wMDUyMDAKK3ZuIDAuMDAwMTAwIDAuMDAwMDAwIC0xLjAwMDAwMAordm4gMC4wMDE1MDAgLTEuMDAwMDAwIDAuMDAxNzAwCit2biAwLjAwMTUwMCAtMS4wMDAwMDAgMC4wMDE2MDAKK3ZuIDEuMDAwMDAwIC0wLjAwMjMwMCAtMC4wMDAyMDAKK3ZuIDAuMTQ0OTAwIDAuOTg5NDAwIC0wLjAwMTYwMAordm4gMC4xNDQ5MDAgMC45ODk0MDAgLTAuMDAxNzAwCit2biAtMC40ODc5MDAgMC44NzI5MDAgLTAuMDAwODAwCit2biAtMC40ODgwMDAgMC44NzI4MDAgLTAuMDAxNDAwCit2biAtMC45MjYyMDAgMC4zNzcwMDAgLTAuMDAwNTAwCit2biAtMC45MjYyMDAgMC4zNzcxMDAgLTAuMDAwMjAwCit2biAtMC45OTkzMDAgMC4wMzYyMDAgMC4wMDAyMDAKK3ZuIC0wLjk2MzUwMCAtMC4yNjc4MDAgMC4wMDAxMDAKK3ZuIC0wLjk2MzUwMCAtMC4yNjc4MDAgMC4wMDAyMDAKK3ZuIC0wLjcwMDEwMCAtMC43MTQwMDAgMC4wMDAwMDAKK3ZuIC0wLjcwMDEwMCAtMC43MTQwMDAgLTAuMDAwMTAwCit2biAtMC4yNDk5MDAgLTAuOTY4MzAwIC0wLjAwMTcwMAordm4gLTAuMjUwMzAwIC0wLjk2ODIwMCAtMC4wMDAyMDAKK3ZuIDAuMTA5MDAwIC0wLjk5NDAwMCAwLjAwMDcwMAordm4gMC4xMTA0MDAgLTAuOTkzOTAwIC0wLjAwMzAwMAordm4gMC41ODUxMDAgLTAuODExMDAwIC0wLjAwMjgwMAordm4gMC41ODU4MDAgLTAuODEwNDAwIC0wLjAwMDMwMAordm4gMC4wMDIyMDAgLTEuMDAwMDAwIDAuMDAxNjAwCit2biAwLjAwMjIwMCAtMS4wMDAwMDAgMC4wMDE3MDAKK3ZuIC0wLjAwMDMwMCAxLjAwMDAwMCAtMC4wMDAzMDAKK3ZuIC0wLjAwMDMwMCAxLjAwMDAwMCAtMC4wMDAyMDAKK3ZuIC0wLjAwNzgwMCAtMS4wMDAwMDAgMC4wMDE2MDAKK3ZuIC0wLjAwNzgwMCAtMS4wMDAwMDAgMC4wMDE1MDAKK3ZuIDEuMDAwMDAwIC0wLjAwMjkwMCAtMC4wMDA3MDAKK3ZuIDEuMDAwMDAwIC0wLjAwMzEwMCAtMC4wMDAyMDAKK3ZuIC0wLjY4MzAwMCAtMC43MzA0MDAgLTAuMDAyMTAwCit2biAtMC42ODM1MDAgLTAuNzMwMDAwIDAuMDAwODAwCit2biAtMC44Mjk3MDAgLTAuMDU0NzAwIC0wLjU1NTUwMAordm4gLTAuODM3MTAwIC0wLjA1NjcwMCAtMC41NDQxMDAKK3ZuIDAuNzg4OTAwIDAuMjY1MzAwIC0wLjU1NDQwMAordm4gMC43OTEyMDAgMC4yNjY2MDAgLTAuNTUwNDAwCit2biAtMC45OTc3MDAgLTAuMDY3NjAwIDAuMDAwMjAwCit2biAtMC45OTc3MDAgLTAuMDY3NjAwIDAuMDAwMzAwCit2biAwLjk0NzYwMCAwLjMxOTMwMCAtMC4wMDY3MDAKK3ZuIDAuOTQ3NjAwIDAuMzE5MzAwIC0wLjAwNjYwMAordm4gMC4yODAzMDAgLTAuNjM4MjAwIC0wLjcxNzAwMAordm4gMC4yODYwMDAgLTAuNjQzODAwIC0wLjcwOTcwMAordm4gMC40MDE4MDAgLTAuOTE1NzAwIC0wLjAwMDgwMAordm4gMC40MDIyMDAgLTAuOTE1NjAwIDAuMDAwMTAwCit2biAtMC40NzU3MDAgLTAuNjM4MTAwIC0wLjYwNTQwMAordm4gLTAuNDMxMTAwIC0wLjYxOTQwMCAtMC42NTYxMDAKK3ZuIC0wLjY2MTMwMCAtMC43NTAxMDAgLTAuMDA0ODAwCit2biAtMC42NjEzMDAgLTAuNzUwMTAwIC0wLjAwNDkwMAordm4gLTAuNzAzOTAwIC0wLjAwMDEwMCAtMC43MTAzMDAKK3ZuIDAuMTA3MDAwIDAuNjg5MDAwIC0wLjcxNjgwMAordm4gMC4wOTc0MDAgMC42NjUyMDAgLTAuNzQwMzAwCit2biAwLjU0NDYwMCAwLjgzODcwMCAtMC4wMDE1MDAKK3ZuIDAuNTQ0NTAwIDAuODM4NzAwIC0wLjAwMTcwMAordm4gMC4wMDAyMDAgMC4wMTkxMDAgLTAuOTk5ODAwCit2biAwLjAwNjQwMCAwLjAyMDkwMCAtMC45OTk4MDAKK3ZuIDAuMTcxNDAwIDAuNjExNzAwIC0wLjc3MjMwMAordm4gMC4xNzI0MDAgMC42MDUwMDAgLTAuNzc3NDAwCit2biAwLjQ2MTQwMCAwLjQ3ODUwMCAtMC43NDcxMDAKK3ZuIDAuNDU1ODAwIDAuNDYyODAwIC0wLjc2MDMwMAordm4gMC42Njc1MDAgMC4xNzUzMDAgLTAuNzIzNjAwCit2biAwLjY2MzYwMCAwLjE3MjQwMCAtMC43Mjc5MDAKK3ZuIDAuNjk2MzAwIDAuMDAwMTAwIC0wLjcxNzgwMAordm4gMC42OTYyMDAgMC4wMDAxMDAgLTAuNzE3ODAwCit2biAwLjY5NjIwMCAwLjAwMDAwMCAtMC43MTc4MDAKK3ZuIDAuNjk2MzAwIC0wLjAwMDAwMCAtMC43MTc4MDAKK3ZuIDAuNjYwMTAwIC0wLjE3OTQwMCAtMC43Mjk0MDAKK3ZuIDAuNjY1NjAwIC0wLjE4MzcwMCAtMC43MjM0MDAKK3ZuIDAuNDU1ODAwIC0wLjQ2MTQwMCAtMC43NjExMDAKK3ZuIDAuNDcxOTAwIC0wLjQ2NzgwMCAtMC43NDczMDAKK3ZuIDAuMTYxNDAwIC0wLjYwNjgwMCAtMC43NzgzMDAKK3ZuIDAuMTY2MTAwIC0wLjYxMjYwMCAtMC43NzI4MDAKK3ZuIC0wLjE2MDIwMCAtMC42MTUwMDAgLTAuNzcyMTAwCit2biAtMC4xNjE2MDAgLTAuNjA2MDAwIC0wLjc3ODkwMAordm4gLTAuNDYxNTAwIC0wLjQ3ODYwMCAtMC43NDY5MDAKK3ZuIC0wLjQ1NTkwMCAtMC40NjMwMDAgLTAuNzYwMTAwCit2biAtMC42Njk1MDAgLTAuMTcwNjAwIC0wLjcyMzAwMAordm4gLTAuNjY0MzAwIC0wLjE2NjcwMCAtMC43Mjg3MDAKK3ZuIC0wLjY5NjEwMCAtMC4wMDAyMDAgLTAuNzE4MDAwCit2biAtMC42OTYxMDAgLTAuMDAwMTAwIC0wLjcxNzkwMAordm4gLTAuNjk2MTAwIC0wLjAwMDEwMCAtMC43MTgwMDAKK3ZuIC0wLjY2NzIwMCAwLjE2MTAwMCAtMC43MjczMDAKK3ZuIC0wLjY3MTAwMCAwLjE2MzYwMCAtMC43MjMyMDAKK3ZuIC0wLjQ1MDEwMCAwLjQ2NjcwMCAtMC43NjEzMDAKK3ZuIC0wLjQ2NjEwMCAwLjQ3MzMwMCAtMC43NDc1MDAKK3ZuIC0wLjE2MTQwMCAwLjYwNTQwMCAtMC43Nzk0MDAKK3ZuIC0wLjE1OTkwMCAwLjYxNTAwMCAtMC43NzIxMDAKK3ZuIDAuMDgzODAwIDAuMzA3ODAwIC0wLjk0NzgwMAordm4gMC4wODQ5MDAgMC4zMDMwMDAgLTAuOTQ5MjAwCit2biAwLjIzMTkwMCAwLjI0MDUwMCAtMC45NDI1MDAKK3ZuIDAuMjE1NjAwIDAuMjM1MDAwIC0wLjk0NzgwMAordm4gMC4zMzM0MDAgMC4wODc2MDAgLTAuOTM4NzAwCit2biAwLjMyMTMwMCAwLjA4OTMwMCAtMC45NDI4MDAKK3ZuIDAuMzM2NjAwIDAuMDAwMTAwIC0wLjk0MTYwMAordm4gMC4zMzY2MDAgMC4wMDAxMDAgLTAuOTQxNzAwCit2biAwLjMzNjYwMCAwLjAwMDAwMCAtMC45NDE2MDAKK3ZuIDAuMzE3NjAwIC0wLjA5NTgwMCAtMC45NDM0MDAKK3ZuIDAuMzM2OTAwIC0wLjA5MzAwMCAtMC45MzcwMDAKK3ZuIDAuMjE4NjAwIC0wLjIzMjQwMCAtMC45NDc3MDAKK3ZuIDAuMjM0ODAwIC0wLjIzNzcwMCAtMC45NDI1MDAKK3ZuIDAuMDc2NzAwIC0wLjMwMjEwMCAtMC45NTAyMDAKK3ZuIDAuMDgxOTAwIC0wLjMwNzgwMCAtMC45NDc5MDAKK3ZuIC0wLjA4MDQwMCAtMC4zMDg3MDAgLTAuOTQ3ODAwCit2biAtMC4wNzQ1MDAgLTAuMzAyMDAwIC0wLjk1MDQwMAordm4gLTAuMjMyMTAwIC0wLjI0MDcwMCAtMC45NDI0MDAKK3ZuIC0wLjIxNjAwMCAtMC4yMzUzMDAgLTAuOTQ3NjAwCit2biAtMC4zMzc1MDAgLTAuMDg2MDAwIC0wLjkzNzQwMAordm4gLTAuMzE5NjAwIC0wLjA4OTAwMCAtMC45NDM0MDAKK3ZuIC0wLjMzNjIwMCAtMC4wMDAxMDAgLTAuOTQxODAwCit2biAtMC4zMjI4MDAgMC4wODMzMDAgLTAuOTQyODAwCit2biAtMC4zMzQyMDAgMC4wODE1MDAgLTAuOTM5MDAwCit2biAtMC4yMTU5MDAgMC4yMzUzMDAgLTAuOTQ3NjAwCit2biAtMC4yMzIxMDAgMC4yNDA3MDAgLTAuOTQyNDAwCit2biAtMC4wNzUzMDAgMC4zMDMwMDAgLTAuOTUwMDAwCit2biAtMC4wODAyMDAgMC4zMDg3MDAgLTAuOTQ3ODAwCit2biAtMC4wMDUyMDAgMC4wMTkxMDAgLTAuOTk5ODAwCit2biAwLjAwMDIwMCAwLjAyMTcwMCAtMC45OTk4MDAKK3ZuIC0wLjAxOTMwMCAwLjAxOTUwMCAtMC45OTk2MDAKK3ZuIC0wLjAzNjAwMCAwLjAwODcwMCAtMC45OTkzMDAKK3ZuIDAuMDM0ODAwIDAuMDA5MDAwIC0wLjk5OTQwMAordm4gMC4wMTkzMDAgMC4wMTk1MDAgLTAuOTk5NjAwCit2biAwLjAzNDYwMCAtMC4wMDAwMDAgLTAuOTk5NDAwCit2biAtMC4wMzU5MDAgLTAuMDAwMDAwIC0wLjk5OTQwMAordm4gLTAuMDM1ODAwIDAuMDAwMDAwIC0wLjk5OTQwMAordm4gMC4wMzQ1MDAgMC4wMDAwMDAgLTAuOTk5NDAwCit2biAwLjAyMTUwMCAtMC4wMjExMDAgLTAuOTk5NTAwCit2biAwLjAzNTIwMCAtMC4wMTA1MDAgLTAuOTk5MzAwCit2biAwLjAwNTgwMCAtMC4wMjEwMDAgLTAuOTk5ODAwCit2biAwLjAwMDIwMCAtMC4wMjM4MDAgLTAuOTk5NzAwCit2biAtMC4wMDU2MDAgLTAuMDIxMDAwIC0wLjk5OTgwMAordm4gMC4wMDAyMDAgLTAuMDI0MTAwIC0wLjk5OTcwMAordm4gLTAuMDIxMzAwIC0wLjAyMTQwMCAtMC45OTk1MDAKK3ZuIC0wLjAzNjQwMCAtMC4wMTAwMDAgLTAuOTk5MzAwCit2biAwLjA2MzMwMCAwLjIwNTkwMCAtMC45NzY1MDAKK3ZuIDAuMDU0NDAwIDAuMTk5OTAwIC0wLjk3ODMwMAordm4gMC4xMzkzMDAgMC4xNDAzMDAgLTAuOTgwMzAwCit2biAwLjEyODUwMCAwLjE0MDAwMCAtMC45ODE4MDAKK3ZuIDAuMTc1MzAwIDAuMDQ1NTAwIC0wLjk4MzUwMAordm4gMC4xNzA1MDAgMC4wNDc0MDAgLTAuOTg0MjAwCit2biAwLjE3NDEwMCAwLjAwMDAwMCAtMC45ODQ3MDAKK3ZuIDAuMTcyNjAwIC0wLjA1MTMwMCAtMC45ODM3MDAKK3ZuIDAuMTcxNTAwIC0wLjA1MTcwMCAtMC45ODM4MDAKK3ZuIDAuMTQxMDAwIC0wLjEzODQwMCAtMC45ODAzMDAKK3ZuIDAuMTMwMDAwIC0wLjEzODMwMCAtMC45ODE4MDAKK3ZuIDAuMDU2NzAwIC0wLjIwNTUwMCAtMC45NzcwMDAKK3ZuIDAuMDUxMjAwIC0wLjIwMTYwMCAtMC45NzgxMDAKK3ZuIC0wLjA1NDQwMCAtMC4yMDU3MDAgLTAuOTc3MTAwCit2biAtMC4wNDk5MDAgLTAuMjAyNDAwIC0wLjk3ODAwMAordm4gLTAuMTM5MzAwIC0wLjE0MDEwMCAtMC45ODAzMDAKK3ZuIC0wLjEyODUwMCAtMC4xNDAwMDAgLTAuOTgxODAwCit2biAtMC4xNzMzMDAgLTAuMDQ3NTAwIC0wLjk4MzcwMAordm4gLTAuMTcyMzAwIC0wLjA0ODAwMCAtMC45ODM5MDAKK3ZuIC0wLjE3NDMwMCAtMC4wMDAwMDAgLTAuOTg0NzAwCit2biAtMC4xNzU4MDAgMC4wNDI0MDAgLTAuOTgzNTAwCit2biAtMC4xNzEyMDAgMC4wNDQyMDAgLTAuOTg0MjAwCit2biAtMC4xMzkxMDAgMC4xNDAxMDAgLTAuOTgwMzAwCit2biAtMC4xMjg0MDAgMC4xNDAwMDAgLTAuOTgxODAwCit2biAtMC4wNTQxMDAgMC4xOTkzMDAgLTAuOTc4NDAwCit2biAtMC4wNTEyMDAgMC4yMDYyMDAgLTAuOTc3MjAwCit2biAtMC4xNTMyMDAgLTAuNTY1NjAwIC0wLjgxMDMwMAordm4gMC4xNDQzMDAgMC41MzI2MDAgLTAuODM0MDAwCit2biAtMC40MTQzMDAgLTAuNDE0MzAwIC0wLjgxMDMwMAordm4gMC4zOTAyMDAgMC4zOTAyMDAgLTAuODM0MDAwCit2biAtMC41NjU2MDAgLTAuMTUzMjAwIC0wLjgxMDMwMAordm4gMC41MzI2MDAgMC4xNDQzMDAgLTAuODM0MDAwCit2biAtMC41NjU2MDAgMC4xNTMyMDAgLTAuODEwMzAwCit2biAwLjUzMjYwMCAtMC4xNDQzMDAgLTAuODM0MDAwCit2biAtMC40MTQzMDAgMC40MTQzMDAgLTAuODEwMzAwCit2biAwLjM5MDIwMCAtMC4zOTAyMDAgLTAuODM0MDAwCit2biAtMC4xNTMyMDAgMC41NjU2MDAgLTAuODEwMzAwCit2biAwLjE0NDMwMCAtMC41MzI2MDAgLTAuODM0MDAwCit2biAwLjE1MzIwMCAwLjU2NTYwMCAtMC44MTAzMDAKK3ZuIC0wLjE0NDMwMCAtMC41MzI2MDAgLTAuODM0MDAwCit2biAtMC4xNDQyMDAgLTAuNTMyNjAwIC0wLjgzNDAwMAordm4gMC40MTQzMDAgMC40MTQzMDAgLTAuODEwMzAwCit2biAtMC4zOTAyMDAgLTAuMzkwMjAwIC0wLjgzNDAwMAordm4gMC41NjU2MDAgMC4xNTMyMDAgLTAuODEwMzAwCit2biAtMC41MzI2MDAgLTAuMTQ0MzAwIC0wLjgzNDAwMAordm4gMC41NjU2MDAgLTAuMTUzMjAwIC0wLjgxMDMwMAordm4gLTAuNTMyNjAwIDAuMTQ0MzAwIC0wLjgzNDAwMAordm4gMC40MTQzMDAgLTAuNDE0MzAwIC0wLjgxMDMwMAordm4gMC40MTQ0MDAgLTAuNDE0NDAwIC0wLjgxMDMwMAordm4gLTAuMzkwMjAwIDAuMzkwMjAwIC0wLjgzNDAwMAordm4gMC4xNTMyMDAgLTAuNTY1NjAwIC0wLjgxMDMwMAordm4gLTAuMTQ0MzAwIDAuNTMyNjAwIC0wLjgzNDAwMAordm4gMC4yNjE0MDAgMC45NjUyMDAgMC4wMDAwMDAKK3ZuIC0wLjI2MTQwMCAwLjk2NTIwMCAwLjAwMDAwMAordm4gMC43MDcxMDAgMC43MDcxMDAgMC4wMDAwMDAKK3ZuIDAuOTY1MjAwIDAuMjYxNDAwIDAuMDAwMDAwCit2biAwLjk2NTIwMCAtMC4yNjE0MDAgMC4wMDAwMDAKK3ZuIDAuNzA3MTAwIC0wLjcwNzEwMCAtMC4wMDAwMDAKK3ZuIDAuMjYxNDAwIC0wLjk2NTIwMCAtMC4wMDAwMDAKK3ZuIC0wLjI2MTQwMCAtMC45NjUyMDAgLTAuMDAwMDAwCit2biAtMC43MDcxMDAgLTAuNzA3MTAwIC0wLjAwMDAwMAordm4gLTAuOTY1MjAwIC0wLjI2MTQwMCAtMC4wMDAwMDAKK3ZuIC0wLjcwNzEwMCAwLjcwNzEwMCAwLjAwMDAwMAordm4gLTAuMDAwMDAwIDAuNDA0MDAwIDAuOTE0ODAwCit2biAtMC4wNzkzMDAgMC4zOTYzMDAgMC45MTQ3MDAKK3ZuIC0wLjA4MDkwMCAwLjQwMjcwMCAwLjkxMTgwMAordm4gLTAuMjI3MTAwIDAuMzM1MDAwIDAuOTE0NDAwCit2biAtMC4yMjY4MDAgMC4zMzQ1MDAgMC45MTQ3MDAKK3ZuIC0wLjM0MjIwMCAwLjIzMDgwMCAwLjkxMDgwMAordm4gLTAuMzM1MTAwIDAuMjI1NTAwIDAuOTE0ODAwCit2biAtMC4zOTgzMDAgMC4wODExMDAgMC45MTM2MDAKK3ZuIC0wLjM5NTcwMCAwLjA4MDcwMCAwLjkxNDgwMAordm4gLTAuNDA0MDAwIDAuMDAwMDAwIDAuOTE0ODAwCit2biAtMC4wMDAwMDAgMC43ODExMDAgMC42MjQ0MDAKK3ZuIC0wLjAwMDAwMCAwLjc4MTIwMCAwLjYyNDMwMAordm4gLTAuMTUzMTAwIDAuNzY2MDAwIDAuNjI0MzAwCit2biAtMC4xNTQ0MDAgMC43NzE4MDAgMC42MTY4MDAKK3ZuIC0wLjQzODIwMCAwLjY0NjQwMCAwLjYyNDYwMAordm4gLTAuNDM4MzAwIDAuNjQ2NTAwIDAuNjI0NDAwCit2biAtMC42NDc2MDAgMC40MzY4MDAgMC42MjQ0MDAKK3ZuIC0wLjY0NzUwMCAwLjQzNjgwMCAwLjYyNDQwMAordm4gLTAuNzY1MzAwIDAuMTU1NzAwIDAuNjI0NTAwCit2biAtMC43Njg5MDAgMC4xNTY1MDAgMC42MTk5MDAKK3ZuIC0wLjc4MTEwMCAwLjAwMDAwMCAwLjYyNDQwMAordm4gLTAuNzgxMDAwIDAuMDAwMDAwIDAuNjI0NTAwCit2biAtMC4wMDAwMDAgMC43ODEwMDAgMC42MjQ2MDAKK3ZuIC0wLjAwMDAwMCAwLjc4MTEwMCAwLjYyNDMwMAordm4gMC40MTE4MDAgLTAuOTExMzAwIDAuMDAwMDAwCit2biAwLjAwMTQwMCAtMS4wMDAwMDAgMC4wMDAwMDAKK3ZuIDAuNDExNTAwIDAuOTExNDAwIDAuMDAwMDAwCit2biAwLjkyNTEwMCAwLjM3OTgwMCAwLjAwMDAwMAordm4gMC45MjYyMDAgLTAuMzc2OTAwIDAuMDAwMDAwCit2biAwLjI4OTgwMCAtMC42NDExMDAgMC43MTA2MDAKK3ZuIDAuMjk2MjAwIC0wLjY2MTcwMCAwLjY4ODcwMAordm4gMC4wMDEwMDAgLTAuNjkyODAwIDAuNzIxMTAwCit2biAtMC4wMDA0MDAgLTAuNzA3MTAwIDAuNzA3MjAwCit2biAtMC4wMDAxMDAgLTAuNzA3MDAwIDAuNzA3MjAwCit2biAtMC4wMDAxMDAgLTAuNzA3MTAwIDAuNzA3MTAwCit2biAwLjAwMDEwMCAwLjcwNzAwMCAwLjcwNzIwMAordm4gMC4wMDAxMDAgMC43MDcxMDAgMC43MDcxMDAKK3ZuIC0wLjAwMTIwMCAwLjY5MjkwMCAwLjcyMTAwMAordm4gMC4yOTg2MDAgMC42NjE0MDAgMC42ODgwMDAKK3ZuIDAuMjg3MzAwIDAuNjQyNjAwIDAuNzEwMzAwCit2biAwLjY1NDEwMCAwLjI2ODUwMCAwLjcwNzEwMAordm4gMC42NTQwMDAgMC4yNjg1MDAgMC43MDcyMDAKK3ZuIDAuNjU0NDAwIC0wLjI2NjMwMCAwLjcwNzcwMAordm4gMC42NTU1MDAgLTAuMjY2OTAwIDAuNzA2NTAwCit2biAtMC4wMDAwMDAgMC40MDQwMDAgMC45MTQ3MDAKK3ZuIC0wLjAwMDAwMCAwLjc4MTMwMCAwLjYyNDIwMAordm4gMC4wODIyMDAgMC4zOTM1MDAgMC45MTU3MDAKK3ZuIDAuMDgyNjAwIDAuMzk1MDAwIDAuOTE0OTAwCit2biAwLjIyNjAwMCAwLjMzNDkwMCAwLjkxNDcwMAordm4gMC4yMjYwMDAgMC4zMzQ5MDAgMC45MTQ4MDAKK3ZuIDAuMzM1MjAwIDAuMjI1NDAwIDAuOTE0ODAwCit2biAwLjMzNTQwMCAwLjIyNTUwMCAwLjkxNDcwMAordm4gMC4zOTU4MDAgMC4wODA2MDAgMC45MTQ4MDAKK3ZuIDAuMzk2MjAwIDAuMDgwNzAwIDAuOTE0NjAwCit2biAwLjQwNDAwMCAwLjAwMDAwMCAwLjkxNDgwMAordm4gMC4xNTk1MDAgMC43NjI0MDAgMC42MjcxMDAKK3ZuIDAuMTU5OTAwIDAuNzY0MTAwIDAuNjI1MDAwCit2biAwLjQzNjkwMCAwLjY0NzYwMCAwLjYyNDMwMAordm4gMC40MzY4MDAgMC42NDc0MDAgMC42MjQ1MDAKK3ZuIDAuNjQ4MzAwIDAuNDM1ODAwIDAuNjI0NDAwCit2biAwLjY0ODEwMCAwLjQzNTcwMCAwLjYyNDYwMAordm4gMC43NjgyMDAgMC4xNTY1MDAgMC42MjA4MDAKK3ZuIDAuNzY1MjAwIDAuMTU1ODAwIDAuNjI0NjAwCit2biAwLjc4MTEwMCAwLjAwMDAwMCAwLjYyNDQwMAordm4gMC43ODEwMDAgMC4wMDAwMDAgMC42MjQ1MDAKK3ZuIC0wLjAwMDAwMCAwLjc4MTAwMCAwLjYyNDUwMAordm4gLTAuMDAwMDAwIDAuNzgxMjAwIDAuNjI0MjAwCit2biAtMC40MTE4MDAgLTAuOTExMzAwIDAuMDAwMDAwCit2biAtMC4wMDE0MDAgLTEuMDAwMDAwIDAuMDAwMDAwCit2biAtMC4wMDAxMDAgMS4wMDAwMDAgMC4wMDAwMDAKK3ZuIC0wLjQxMTUwMCAwLjkxMTQwMCAwLjAwMDAwMAordm4gLTAuOTI1MTAwIDAuMzc5ODAwIDAuMDAwMDAwCit2biAtMC45MjYyMDAgLTAuMzc2OTAwIDAuMDAwMDAwCit2biAtMC4yOTYyMDAgLTAuNjYxNzAwIDAuNjg4NzAwCit2biAtMC4yODk4MDAgLTAuNjQxMjAwIDAuNzEwNjAwCit2biAwLjAwMDQwMCAtMC43MDcxMDAgMC43MDcyMDAKK3ZuIC0wLjAwMTAwMCAtMC42OTI4MDAgMC43MjExMDAKK3ZuIDAuMDAwMTAwIC0wLjcwNzEwMCAwLjcwNzEwMAordm4gMC4wMDAxMDAgLTAuNzA3MDAwIDAuNzA3MjAwCit2biAtMC4wMDAxMDAgMC43MDcwMDAgMC43MDcyMDAKK3ZuIC0wLjAwMDEwMCAwLjcwNzEwMCAwLjcwNzEwMAordm4gMC4wMDEyMDAgMC42OTI5MDAgMC43MjEwMDAKK3ZuIC0wLjI4NzMwMCAwLjY0MjYwMCAwLjcxMDMwMAordm4gLTAuMjk4NjAwIDAuNjYxMzAwIDAuNjg4MTAwCit2biAtMC42NTQwMDAgMC4yNjg1MDAgMC43MDcyMDAKK3ZuIC0wLjY1NDEwMCAwLjI2ODUwMCAwLjcwNzEwMAordm4gLTAuNjU1NDAwIC0wLjI2NjkwMCAwLjcwNjUwMAordm4gLTAuNjU0NDAwIC0wLjI2NjMwMCAwLjcwNzcwMAordm4gLTAuMDAwMDAwIC0wLjQwNDAwMCAwLjkxNDgwMAordm4gLTAuMDgxOTAwIC0wLjQwMjYwMCAwLjkxMTcwMAordm4gLTAuMDgwMjAwIC0wLjM5NTkwMCAwLjkxNDgwMAordm4gLTAuMjI2MTAwIC0wLjMzNDkwMCAwLjkxNDcwMAordm4gLTAuMjI0OTAwIC0wLjMzMzMwMCAwLjkxNTYwMAordm4gLTAuMzM1MTAwIC0wLjIyNTYwMCAwLjkxNDgwMAordm4gLTAuMzQxOTAwIC0wLjIzMDYwMCAwLjkxMTAwMAordm4gLTAuMzk1ODAwIC0wLjA4MDYwMCAwLjkxNDgwMAordm4gLTAuNDAyNzAwIC0wLjA4MTYwMCAwLjkxMTcwMAordm4gLTAuMDAwMDAwIC0wLjk3MTEwMCAwLjIzODgwMAordm4gLTAuMTkzMDAwIC0wLjk1MjgwMCAwLjIzNDMwMAordm4gLTAuMTUwMzAwIC0wLjc2NjkwMCAwLjYyMzkwMAordm4gLTAuNDM2OTAwIC0wLjY0NzYwMCAwLjYyNDMwMAordm4gLTAuNDM2ODAwIC0wLjY0NzQwMCAwLjYyNDYwMAordm4gLTAuNjQ3NDAwIC0wLjQzNjgwMCAwLjYyNDUwMAordm4gLTAuNjQ3NTAwIC0wLjQzNjgwMCAwLjYyNDQwMAordm4gLTAuNzcxNDAwIC0wLjE1NjMwMCAwLjYxNjgwMAordm4gLTAuNzY1NTAwIC0wLjE1NTAwMCAwLjYyNDUwMAordm4gLTAuMDAwMDAwIC0wLjk3MTIwMCAwLjIzODQwMAordm4gLTAuMDAwMDAwIC0wLjk3MTAwMCAwLjIzOTIwMAordm4gLTAuMDAwMDAwIC0wLjk3MTEwMCAwLjIzODcwMAordm4gMC40MTE4MDAgMC45MTEzMDAgMC4wMDAwMDAKK3ZuIDAuMDAxNDAwIDEuMDAwMDAwIDAuMDAwMDAwCit2biAwLjQxMTUwMCAtMC45MTE0MDAgMC4wMDAwMDAKK3ZuIDAuOTI1MTAwIC0wLjM3OTgwMCAwLjAwMDAwMAordm4gMC45MjYyMDAgMC4zNzY5MDAgMC4wMDAwMDAKK3ZuIDAuMjk2MjAwIDAuNjYxNzAwIDAuNjg4ODAwCit2biAwLjI4OTgwMCAwLjY0MTIwMCAwLjcxMDUwMAordm4gLTAuMDAwNDAwIDAuNzA3MTAwIDAuNzA3MjAwCit2biAwLjAwMTAwMCAwLjY5MjgwMCAwLjcyMTEwMAordm4gLTAuMDAwMTAwIDAuNzA2OTAwIDAuNzA3MzAwCit2biAtMC4wMDEyMDAgLTAuNjkzMDAwIDAuNzIwOTAwCit2biAwLjI4NzMwMCAtMC42NDI2MDAgMC43MTAzMDAKK3ZuIDAuMjk4NjAwIC0wLjY2MTQwMCAwLjY4ODAwMAordm4gMC42NTQwMDAgLTAuMjY4NTAwIDAuNzA3MjAwCit2biAwLjY1NDEwMCAtMC4yNjg1MDAgMC43MDcxMDAKK3ZuIDAuNjU1NTAwIDAuMjY2OTAwIDAuNzA2NTAwCit2biAwLjY1NDQwMCAwLjI2NjMwMCAwLjcwNzcwMAordm4gLTAuMDAwMDAwIC0wLjk3MTAwMCAwLjIzOTEwMAordm4gMC4wODExMDAgLTAuMzk1NjAwIDAuOTE0ODAwCit2biAwLjA4MDEwMCAtMC4zOTIwMDAgMC45MTY1MDAKK3ZuIDAuMjI0MTAwIC0wLjMzNDgwMCAwLjkxNTIwMAordm4gMC4yMjQ2MDAgLTAuMzM1NTAwIDAuOTE0OTAwCit2biAwLjMzOTAwMCAtMC4yMjYyMDAgMC45MTMyMDAKK3ZuIDAuMzM1OTAwIC0wLjIyMzgwMCAwLjkxNDkwMAordm4gMC40MDI1MDAgLTAuMDgxMzAwIDAuOTExODAwCit2biAwLjM5NTkwMCAtMC4wODAzMDAgMC45MTQ4MDAKK3ZuIDAuMTUyMTAwIC0wLjc2NjQwMCAwLjYyNDEwMAordm4gMC4xOTQ3MDAgLTAuOTUwMDAwIDAuMjQ0MzAwCit2biAwLjQzNDUwMCAtMC42NDkyMDAgMC42MjQyMDAKK3ZuIDAuNDM0MzAwIC0wLjY0ODkwMCAwLjYyNDgwMAordm4gMC42NDk1MDAgLTAuNDMzMzAwIDAuNjI0OTAwCit2biAwLjY0OTkwMCAtMC40MzM2MDAgMC42MjQyMDAKK3ZuIDAuNzY1NjAwIC0wLjE1NDUwMCAwLjYyNDUwMAordm4gMC43NzE1MDAgLTAuMTU1ODAwIDAuNjE2OTAwCit2biAtMC4wMDAwMDAgLTAuOTcxMTAwIDAuMjM4NjAwCit2biAwLjAwMDAwMCAtMC45NzA5MDAgMC4yMzkzMDAKK3ZuIC0wLjAwMDAwMCAtMC45NzExMDAgMC4yMzg1MDAKK3ZuIC0wLjQxMTgwMCAwLjkxMTMwMCAwLjAwMDAwMAordm4gLTAuMDAxNDAwIDEuMDAwMDAwIDAuMDAwMDAwCit2biAtMC40MTE1MDAgLTAuOTExNDAwIDAuMDAwMDAwCit2biAtMC45MjUxMDAgLTAuMzc5ODAwIDAuMDAwMDAwCit2biAtMC45MjYyMDAgMC4zNzY5MDAgMC4wMDAwMDAKK3ZuIC0wLjI4OTgwMCAwLjY0MTIwMCAwLjcxMDUwMAordm4gLTAuMjk2MjAwIDAuNjYxNzAwIDAuNjg4ODAwCit2biAtMC4wMDEwMDAgMC42OTI4MDAgMC43MjExMDAKK3ZuIDAuMDAwNDAwIDAuNzA3MTAwIDAuNzA3MjAwCit2biAwLjAwMDEwMCAwLjcwNjkwMCAwLjcwNzMwMAordm4gLTAuMDAwMTAwIC0wLjcwNzIwMCAwLjcwNzEwMAordm4gMC4wMDEyMDAgLTAuNjkzMDAwIDAuNzIwOTAwCit2biAtMC4yOTg2MDAgLTAuNjYxMzAwIDAuNjg4MTAwCit2biAtMC4yODczMDAgLTAuNjQyNzAwIDAuNzEwMjAwCit2biAtMC42NTQxMDAgLTAuMjY4NTAwIDAuNzA3MTAwCit2biAtMC42NTQwMDAgLTAuMjY4NTAwIDAuNzA3MjAwCit2biAtMC42NTQ0MDAgMC4yNjYzMDAgMC43MDc3MDAKK3ZuIC0wLjY1NTUwMCAwLjI2NjkwMCAwLjcwNjUwMAordm4gLTAuMDAwMDAwIDAuNzA3MTAwIDAuNzA3MTAwCit2biAtMC4wMDAwMDAgMC43MDcxMDAgMC43MDcyMDAKK3ZuIC0wLjAwMDAwMCAtMC43MDcwMDAgMC43MDcyMDAKK3ZuIC0wLjAwMDAwMCAtMC43MDcyMDAgMC43MDcwMDAKK3ZuIC0wLjAwMDEwMCAwLjcwNzIwMCAwLjcwNzAwMAordm4gLTAuMzQ3OTAwIC0wLjIwMDkwMCAwLjkxNTcwMAordm4gLTAuMzQ3ODAwIC0wLjIwMDcwMCAwLjkxNTgwMAordm4gMC4zNTEwMDAgLTAuMjAyNzAwIDAuOTE0MjAwCit2biAtMC4zNDc3MDAgMC4yMDA4MDAgMC45MTU4MDAKK3ZuIC0wLjM0NzIwMCAwLjIwMDUwMCAwLjkxNjEwMAordm4gMC4zNTA1MDAgMC4yMDI0MDAgMC45MTQ0MDAKK3ZuIDAuMzUxMDAwIDAuMjAyNzAwIDAuOTE0MjAwCit2biAtMC4zNDc0MDAgMC4yMDYxMDAgMC45MTQ4MDAKK3ZuIDAuMzUxNDAwIDAuMTk3MTAwIDAuOTE1MzAwCit2biAwLjM1MTUwMCAwLjE5NzEwMCAwLjkxNTIwMAordm4gLTAuMzQ3NzAwIC0wLjIwNjMwMCAwLjkxNDYwMAordm4gLTAuMzQ3NDAwIC0wLjIwNjEwMCAwLjkxNDgwMAordm4gMC4zNTE0MDAgLTAuMTk3MTAwIDAuOTE1MzAwCit2biAwLjM1MTgwMCAtMC4xOTczMDAgMC45MTUwMDAKK3ZuIDAuMDAwMDAwIC0wLjQwMzgwMCAwLjkxNDgwMAordm4gMC4wMDAwMDAgMC40MDMzMDAgMC45MTUxMDAKK3ZuIDAuMDAwMDAwIDAuNDAzNDAwIDAuOTE1MDAwCit2biAtMC4zNTI2MDAgLTAuMTk4MDAwIDAuOTE0NjAwCit2biAtMC4zNTI1MDAgLTAuMTk3OTAwIDAuOTE0NzAwCit2biAwLjM0NjMwMCAtMC4yMDU3MDAgMC45MTUzMDAKK3ZuIDAuMzQ2NTAwIC0wLjIwNTgwMCAwLjkxNTIwMAordm4gLTAuMzUyMzAwIDAuMTk3ODAwIDAuOTE0NzAwCit2biAwLjM0NjIwMCAwLjIwNTYwMCAwLjkxNTQwMAordm4gMC4zNDYzMDAgMC4yMDU3MDAgMC45MTUzMDAKK3ZuIDAuMDAwMDAwIC0wLjQwNDUwMCAwLjkxNDUwMAordm4gMC4wMDAwMDAgLTAuNDA0MTAwIDAuOTE0NzAwCit2biAwLjAwMDAwMCAwLjQwMzUwMCAwLjkxNTAwMAordm4gMC4wMDAwMDAgMC40MDM2MDAgMC45MTQ5MDAKK3ZuIC0wLjM0ODQwMCAtMC4yMDExMDAgMC45MTU1MDAKK3ZuIC0wLjM0ODIwMCAtMC4yMDEwMDAgMC45MTU2MDAKK3ZuIDAuMzUxMTAwIC0wLjIwMjcwMCAwLjkxNDEwMAordm4gLTAuMzQ4MjAwIDAuMjAxMTAwIDAuOTE1NjAwCit2biAtMC4zNDc2MDAgMC4yMDA4MDAgMC45MTU5MDAKK3ZuIDAuMzUwNDAwIDAuMjAyMzAwIDAuOTE0NTAwCit2biAwLjM1MTEwMCAwLjIwMjgwMCAwLjkxNDEwMAordm4gLTAuMzQ3OTAwIDAuMjA2NDAwIDAuOTE0NTAwCit2biAwLjM1MTUwMCAwLjE5NzAwMCAwLjkxNTIwMAordm4gMC4zNTE0MDAgMC4xOTcwMDAgMC45MTUzMDAKK3ZuIC0wLjM0ODMwMCAtMC4yMDY2MDAgMC45MTQzMDAKK3ZuIC0wLjM0NzgwMCAtMC4yMDY0MDAgMC45MTQ2MDAKK3ZuIDAuMzUxNTAwIC0wLjE5NzAwMCAwLjkxNTIwMAordm4gMC4zNTE4MDAgLTAuMTk3MTAwIDAuOTE1MTAwCit2biAwLjAwMDAwMCAtMC40MDM2MDAgMC45MTQ5MDAKK3ZuIDAuMDAwMDAwIC0wLjQwMzcwMCAwLjkxNDkwMAordm4gMC4wMDAwMDAgMC40MDI0MDAgMC45MTU1MDAKK3ZuIDAuMDAwMDAwIDAuNDAyMTAwIDAuOTE1NjAwCit2biAwLjAwMDAwMCAtMC40MDM5MDAgMC45MTQ4MDAKK3ZuIDAuMDAwMDAwIDAuNDAzMjAwIDAuOTE1MTAwCit2biAtMC4zNTI4MDAgLTAuMTk4MTAwIDAuOTE0NTAwCit2biAtMC4zNTI2MDAgLTAuMTk3OTAwIDAuOTE0NjAwCit2biAwLjM0NjIwMCAtMC4yMDU3MDAgMC45MTUzMDAKK3ZuIDAuMzQ2NTAwIC0wLjIwNTkwMCAwLjkxNTIwMAordm4gLTAuMzUyNjAwIDAuMTk3OTAwIDAuOTE0NjAwCit2biAtMC4zNTI1MDAgMC4xOTc5MDAgMC45MTQ3MDAKK3ZuIDAuMzQ2MjAwIDAuMjA1NzAwIDAuOTE1MzAwCit2biAwLjAwMDAwMCAtMC40MDQyMDAgMC45MTQ2MDAKK3ZuIDAuMDAwMDAwIC0wLjQwNDQwMCAwLjkxNDYwMAordm4gMC4wMDAwMDAgMC40MDM3MDAgMC45MTQ5MDAKK3ZuIC0wLjM0ODMwMCAtMC4yMDExMDAgMC45MTU2MDAKK3ZuIC0wLjM0ODIwMCAwLjIwMTAwMCAwLjkxNTYwMAordm4gLTAuMzQ3NzAwIDAuMjAwODAwIDAuOTE1OTAwCit2biAwLjM1MDkwMCAwLjIwMjcwMCAwLjkxNDIwMAordm4gLTAuMzQ3ODAwIDAuMjA2MzAwIDAuOTE0NjAwCit2biAtMC4zNDc4MDAgMC4yMDY0MDAgMC45MTQ2MDAKK3ZuIDAuMzUxNDAwIDAuMTk3MDAwIDAuOTE1MjAwCit2biAtMC4zNDgyMDAgLTAuMjA2NjAwIDAuOTE0NDAwCit2biAtMC4zNDc5MDAgLTAuMjA2MzAwIDAuOTE0NjAwCit2biAwLjM1MTQwMCAtMC4xOTcwMDAgMC45MTUzMDAKK3ZuIDAuMzUxODAwIC0wLjE5NzIwMCAwLjkxNTEwMAordm4gMC4wMDAwMDAgLTAuNDAzODAwIDAuOTE0OTAwCit2biAwLjAwMDAwMCAwLjQwMjAwMCAwLjkxNTYwMAordm4gMC4wMDAwMDAgMC40MDIzMDAgMC45MTU1MDAKK3ZuIDAuMDAwMDAwIDAuNDAzMzAwIDAuOTE1MDAwCit2biAwLjM0NjYwMCAtMC4yMDU5MDAgMC45MTUyMDAKK3ZuIC0wLjM1MjcwMCAwLjE5ODAwMCAwLjkxNDUwMAordm4gLTAuMzUyNTAwIDAuMTk3OTAwIDAuOTE0NjAwCit2biAwLjAwMDAwMCAtMC40MDQzMDAgMC45MTQ2MDAKK3ZuIDAuMzQ2MzAwIC0wLjIwNTMwMCAwLjkxNTQwMAordm4gMC4zNDY3MDAgLTAuMjA1NTAwIDAuOTE1MjAwCit2biAwLjM0NjMwMCAwLjIwNTMwMCAwLjkxNTQwMAordm4gMC4zNDYzMDAgMC4yMDU0MDAgMC45MTU0MDAKK3ZuIC0wLjM1MjYwMCAwLjE5ODAwMCAwLjkxNDYwMAordm4gLTAuMzUyNTAwIDAuMTk4MDAwIDAuOTE0NjAwCit2biAwLjM1MDcwMCAtMC4yMDI1MDAgMC45MTQ0MDAKK3ZuIDAuMzUwODAwIC0wLjIwMjUwMCAwLjkxNDMwMAordm4gLTAuMzQ4MzAwIDAuMjAxMTAwIDAuOTE1NjAwCit2biAwLjM1MDEwMCAwLjIwMjEwMCAwLjkxNDcwMAordm4gMC4zNTA4MDAgMC4yMDI1MDAgMC45MTQzMDAKK3ZuIC0wLjM0NzkwMCAwLjIwNjMwMCAwLjkxNDYwMAordm4gMC4zNTExMDAgMC4xOTcyMDAgMC45MTU0MDAKK3ZuIDAuMzUxMTAwIDAuMTk3MjAwIDAuOTE1MzAwCit2biAtMC4zNDgzMDAgLTAuMjA2NTAwIDAuOTE0NDAwCit2biAtMC4zNDc4MDAgLTAuMjA2MjAwIDAuOTE0NjAwCit2biAwLjM1MTEwMCAtMC4xOTcyMDAgMC45MTUzMDAKK3ZuIDAuMzUxNDAwIC0wLjE5NzQwMCAwLjkxNTIwMAordm4gMC4wMDAwMDAgMC40MDIyMDAgMC45MTU1MDAKK3ZuIDAuMDAwMDAwIDAuNDAyMjAwIDAuOTE1NjAwCit2biAtMC4zNDgxMDAgLTAuMjAxMDAwIDAuOTE1NjAwCit2biAtMC4zNDgxMDAgMC4yMDEwMDAgMC45MTU3MDAKK3ZuIC0wLjM0NzUwMCAwLjIwMDcwMCAwLjkxNjAwMAordm4gMC4zNTA1MDAgMC4yMDIzMDAgMC45MTQ0MDAKK3ZuIC0wLjM0NzcwMCAwLjIwNjMwMCAwLjkxNDYwMAordm4gLTAuMzQ3NjAwIDAuMjA2MzAwIDAuOTE0NzAwCit2biAtMC4zNDgwMDAgLTAuMjA2NTAwIDAuOTE0NTAwCit2biAwLjM1MTUwMCAtMC4xOTcxMDAgMC45MTUyMDAKK3ZuIDAuMzUxNzAwIC0wLjE5NzIwMCAwLjkxNTEwMAordm4gMC4wMDAwMDAgMC40MDMxMDAgMC45MTUyMDAKK3ZuIC0wLjM1MjcwMCAtMC4xOTgwMDAgMC45MTQ1MDAKK3ZuIC0wLjM1MjUwMCAtMC4xOTc4MDAgMC45MTQ2MDAKK3ZuIDAuMzQ2MTAwIDAuMjA1NjAwIDAuOTE1NDAwCit2biAwLjM1MTIwMCAtMC4yMDI3MDAgMC45MTQxMDAKK3ZuIDAuMzUwNTAwIDAuMjAyMzAwIDAuOTE0NTAwCit2biAtMC4zNDc5MDAgMC4yMDY0MDAgMC45MTQ2MDAKK3ZuIC0wLjM0NzkwMCAtMC4yMDY0MDAgMC45MTQ1MDAKK3ZuIDAuMzUxOTAwIC0wLjE5NzMwMCAwLjkxNTAwMAordm4gMC4wMDAwMDAgLTAuNDAzNTAwIDAuOTE1MDAwCit2biAtMC4zNTI1MDAgLTAuMTk3OTAwIDAuOTE0NjAwCit2biAwLjM0NjcwMCAtMC4yMDU5MDAgMC45MTUxMDAKK3ZuIDAuMzUxMDAwIC0wLjIwMjYwMCAwLjkxNDIwMAordm4gLTAuMzQ3NjAwIDAuMjAwNzAwIDAuOTE1OTAwCit2biAwLjM1MTQwMCAwLjE5NzEwMCAwLjkxNTIwMAordm4gLTAuMzQ4MjAwIC0wLjIwNjUwMCAwLjkxNDQwMAordm4gMC4wMDAwMDAgMC40MDI1MDAgMC45MTU0MDAKK3ZuIC0wLjM1MjcwMCAtMC4xOTgxMDAgMC45MTQ1MDAKK3ZuIDAuMzQ2NjAwIC0wLjIwNTgwMCAwLjkxNTEwMAordm4gLTAuMzUyNDAwIDAuMTk3OTAwIDAuOTE0NzAwCit2biAwLjM0NjEwMCAwLjIwNTUwMCAwLjkxNTQwMAordm4gMC4zNDY0MDAgMC4yMDU3MDAgMC45MTUzMDAKK3ZuIDAuMDAwMDAwIDAuNDAzOTAwIDAuOTE0ODAwCit2biAwLjM1MDkwMCAtMC4yMDI2MDAgMC45MTQyMDAKK3ZuIDAuMzUwMzAwIDAuMjAyMzAwIDAuOTE0NTAwCit2biAtMC4zNDc5MDAgMC4yMDYxMDAgMC45MTQ2MDAKK3ZuIC0wLjM0ODAwMCAwLjIwNjIwMCAwLjkxNDUwMAordm4gMC4zNTE0MDAgMC4xOTcyMDAgMC45MTUyMDAKK3ZuIDAuMzUxNTAwIDAuMTk3MjAwIDAuOTE1MjAwCit2biAtMC4zNDgyMDAgLTAuMjA2MzAwIDAuOTE0NDAwCit2biAtMC4zNDgwMDAgLTAuMjA2MTAwIDAuOTE0NjAwCit2biAwLjM1MTQwMCAtMC4xOTcyMDAgMC45MTUyMDAKK3ZuIDAuMzUxODAwIC0wLjE5NzQwMCAwLjkxNTAwMAordm4gLTAuMDAwMDAwIC0wLjQwNDIwMCAwLjkxNDcwMAordm4gLTAuMDAwMDAwIDAuNDAzMDAwIDAuOTE1MjAwCit2biAtMC4wMDAwMDAgMC40MDMxMDAgMC45MTUxMDAKK3ZuIC0wLjM1MjgwMCAtMC4xOTg0MDAgMC45MTQ0MDAKK3ZuIC0wLjM1MjYwMCAtMC4xOTgyMDAgMC45MTQ2MDAKK3ZuIDAuMzQ2NDAwIC0wLjIwNTYwMCAwLjkxNTMwMAordm4gMC4zNDY3MDAgLTAuMjA1NzAwIDAuOTE1MTAwCit2biAtMC4zNTI2MDAgMC4xOTgyMDAgMC45MTQ1MDAKK3ZuIC0wLjM1MjMwMCAwLjE5ODEwMCAwLjkxNDcwMAordm4gMC4zNDYzMDAgMC4yMDU1MDAgMC45MTU0MDAKK3ZuIDAuMzQ2NDAwIDAuMjA1NjAwIDAuOTE1MzAwCit2biAwLjAwMDAwMCAtMC40MDQ1MDAgMC45MTQ2MDAKK3ZuIDAuMDAwMDAwIDAuNDAzODAwIDAuOTE0OTAwCit2biAwLjM1MDMwMCAtMC4yMDIyMDAgMC45MTQ2MDAKK3ZuIDAuMzQ5NzAwIDAuMjAxOTAwIDAuOTE0ODAwCit2biAwLjM1MDIwMCAwLjIwMjIwMCAwLjkxNDYwMAordm4gLTAuMzQ4MTAwIC0wLjIwNjQwMCAwLjkxNDUwMAordm4gLTAuMzQ3NzAwIC0wLjIwNjIwMCAwLjkxNDcwMAordm4gMC4zNTAzMDAgLTAuMjAyMzAwIDAuOTE0NTAwCit2biAwLjM1MDYwMCAtMC4yMDI0MDAgMC45MTQ0MDAKK3ZuIDAuMDAwMDAwIC0wLjQwMzQwMCAwLjkxNTAwMAordm4gLTAuMzUyNTAwIC0wLjE5ODAwMCAwLjkxNDYwMAordm4gMC4zNDgxMDAgLTAuMjAxMDAwIDAuOTE1NzAwCit2biAwLjM0ODQwMCAtMC4yMDExMDAgMC45MTU1MDAKK3ZuIC0wLjM1MjMwMCAwLjE5NzkwMCAwLjkxNDcwMAordm4gMC4zNDc5MDAgMC4yMDA4MDAgMC45MTU4MDAKK3ZuIDAuMzQ4MDAwIDAuMjAxMDAwIDAuOTE1NzAwCit2biAtMC4zNDkwMDAgLTAuMjAxNTAwIDAuOTE1MjAwCit2biAwLjM0NzEwMCAtMC4yMDA0MDAgMC45MTYyMDAKK3ZuIC0wLjM0OTAwMCAwLjIwMTUwMCAwLjkxNTIwMAordm4gLTAuMzQ4NDAwIDAuMjAxMjAwIDAuOTE1NTAwCit2biAwLjM0NjQwMCAwLjIwMDAwMCAwLjkxNjUwMAordm4gMC4zNDcyMDAgMC4yMDA1MDAgMC45MTYxMDAKK3ZuIC0wLjM0ODYwMCAwLjIwNjgwMCAwLjkxNDIwMAordm4gLTAuMzQ4NzAwIDAuMjA2OTAwIDAuOTE0MTAwCit2biAwLjM0NzYwMCAwLjE5NTAwMCAwLjkxNzEwMAordm4gMC4zNDc1MDAgMC4xOTUwMDAgMC45MTcyMDAKK3ZuIC0wLjM0ODkwMCAtMC4yMDcwMDAgMC45MTQwMDAKK3ZuIC0wLjM0ODYwMCAtMC4yMDY3MDAgMC45MTQyMDAKK3ZuIDAuMzQ3NTAwIC0wLjE5NTAwMCAwLjkxNzIwMAordm4gMC4zNDc5MDAgLTAuMTk1MjAwIDAuOTE3MDAwCit2biAtMC4zNTE1MDAgLTAuMTk3NDAwIDAuOTE1MTAwCit2biAtMC4zNTEyMDAgLTAuMTk3MjAwIDAuOTE1MzAwCit2biAwLjM0MjUwMCAtMC4yMDMzMDAgMC45MTczMDAKK3ZuIDAuMzQyOTAwIC0wLjIwMzUwMCAwLjkxNzEwMAordm4gLTAuMzUxMjAwIDAuMTk3MjAwIDAuOTE1MzAwCit2biAtMC4zNTEwMDAgMC4xOTcxMDAgMC45MTU0MDAKK3ZuIDAuMzQyMzAwIDAuMjAzMjAwIDAuOTE3MzAwCit2biAwLjM0MjUwMCAwLjIwMzMwMCAwLjkxNzMwMAordm4gLTAuMzI4MDAwIC0wLjIxOTQwMCAwLjkxODgwMAordm4gLTAuMzI4MDAwIC0wLjIxOTMwMCAwLjkxODkwMAordm4gMC4zNDk3MDAgLTAuMjAxOTAwIDAuOTE0OTAwCit2biAtMC4zMjgwMDAgMC4yMTk0MDAgMC45MTg4MDAKK3ZuIC0wLjMyNzQwMCAwLjIxOTAwMCAwLjkxOTIwMAordm4gMC4zNDkyMDAgMC4yMDE2MDAgMC45MTUxMDAKK3ZuIDAuMzQ5NjAwIDAuMjAxOTAwIDAuOTE0OTAwCit2biAtMC4zMjc3MDAgMC4yMjQ0MDAgMC45MTc3MDAKK3ZuIDAuMzQ5ODAwIDAuMjAyMDAwIDAuOTE0ODAwCit2biAtMC4zMjgwMDAgLTAuMjI0NjAwIDAuOTE3NjAwCit2biAtMC4zMjc2MDAgLTAuMjI0MzAwIDAuOTE3ODAwCit2biAwLjM0OTYwMCAtMC4yMDE4MDAgMC45MTQ5MDAKK3ZuIDAuMzUwMDAwIC0wLjIwMjEwMCAwLjkxNDcwMAordm4gMC4wMDAwMDAgLTAuNDAzMjAwIDAuOTE1MTAwCit2biAwLjAwMDAwMCAtMC40MDM2MDAgMC45MTUwMDAKK3ZuIDAuMDAwMDAwIDAuNDAyOTAwIDAuOTE1MzAwCit2biAtMC4zMzIyMDAgLTAuMjE2OTAwIDAuOTE3OTAwCit2biAtMC4zMzE5MDAgLTAuMjE2NzAwIDAuOTE4MTAwCit2biAwLjM0OTUwMCAtMC4yMDE4MDAgMC45MTQ5MDAKK3ZuIDAuMzQ5NzAwIC0wLjIwMTkwMCAwLjkxNDgwMAordm4gLTAuMzMxOTAwIDAuMjE2NjAwIDAuOTE4MTAwCit2biAtMC4zMzE3MDAgMC4yMTY2MDAgMC45MTgyMDAKK3ZuIDAuMzQ5NDAwIDAuMjAxNzAwIDAuOTE1MDAwCit2biAwLjM0OTQwMCAwLjIwMTgwMCAwLjkxNTAwMAordm4gMC4zNDk1MDAgLTAuMjAxODAwIDAuOTE1MDAwCit2biAwLjM0OTgwMCAtMC4yMDE5MDAgMC45MTQ4MDAKK3ZuIC0wLjM0OTcwMCAtMC4yMDE5MDAgMC45MTQ5MDAKK3ZuIC0wLjM0OTUwMCAtMC4yMDE4MDAgMC45MTUwMDAKK3ZuIDAuMzQ5MzAwIDAuMjAxNzAwIDAuOTE1MDAwCit2biAtMC4zNDk1MDAgMC4yMDE4MDAgMC45MTUwMDAKK3ZuIC0wLjM0OTIwMCAwLjIwMTYwMCAwLjkxNTEwMAordm4gLTAuMzQ5NjAwIC0wLjIwMTgwMCAwLjkxNDkwMAordm4gMC4zNDkzMDAgLTAuMjAxNzAwIDAuOTE1MDAwCit2biAwLjM0OTMwMCAtMC4yMDE3MDAgMC45MTUxMDAKK3ZuIC0wLjM0OTYwMCAwLjIwMTkwMCAwLjkxNDkwMAordm4gMC4zNDg4MDAgMC4yMDE0MDAgMC45MTUzMDAKK3ZuIC0wLjM0OTcwMCAwLjIwMTkwMCAwLjkxNDgwMAordm4gLTAuMzUwMDAwIC0wLjIwMjEwMCAwLjkxNDcwMAordm4gMC4zNDk0MDAgLTAuMjAxNzAwIDAuOTE1MDAwCit2biAtMC4zNDg4MDAgMC4yMDE0MDAgMC45MTUzMDAKK3ZuIC0wLjM0OTQwMCAtMC4yMDE3MDAgMC45MTUwMDAKK3ZuIC0wLjM0OTgwMCAtMC4yMDIwMDAgMC45MTQ4MDAKK3ZuIC0wLjM0OTQwMCAwLjIwMTcwMCAwLjkxNTAwMAordm4gLTAuMzQ5MjAwIDAuMjAxNzAwIDAuOTE1MTAwCit2biAwLjM0NjQwMCAtMC4yMDUxMDAgMC45MTU0MDAKK3ZuIDAuMzQ2NzAwIC0wLjIwNTIwMCAwLjkxNTIwMAordm4gMC4zNDY0MDAgMC4yMDUxMDAgMC45MTU0MDAKK3ZuIDAuMzQ2NTAwIDAuMjA1MTAwIDAuOTE1MzAwCit2biAwLjM1MDQwMCAtMC4yMDIzMDAgMC45MTQ1MDAKK3ZuIDAuMzQ5NzAwIDAuMjAxOTAwIDAuOTE0OTAwCit2biAwLjM1MDQwMCAwLjIwMjQwMCAwLjkxNDUwMAordm4gMC4zNTA2MDAgMC4xOTczMDAgMC45MTU1MDAKK3ZuIDAuMzUwNzAwIDAuMTk3NDAwIDAuOTE1NDAwCit2biAwLjM1MDYwMCAtMC4xOTczMDAgMC45MTU1MDAKK3ZuIDAuMzUxMTAwIC0wLjE5NzUwMCAwLjkxNTMwMAordm4gMC4wMDAwMDAgLTAuNDAzMzAwIDAuOTE1MTAwCit2biAtMC4zNDkyMDAgLTAuMjAxNjAwIDAuOTE1MTAwCit2biAtMC4zNDkzMDAgLTAuMjAxNzAwIDAuOTE1MDAwCit2biAtMC4zNDkzMDAgMC4yMDE3MDAgMC45MTUxMDAKK3ZuIDAuMzQ5NjAwIDAuMjAxODAwIDAuOTE0OTAwCit2biAtMC4zNDk1MDAgLTAuMjAxODAwIDAuOTE0OTAwCit2biAtMC4zNDkzMDAgLTAuMjAxNzAwIDAuOTE1MTAwCit2biAtMC4zNDkxMDAgMC4yMDE1MDAgMC45MTUyMDAKK3ZuIDAuMzQ5MzAwIDAuMjAxNjAwIDAuOTE1MTAwCit2biAwLjM0NzcwMCAtMC4yMDA3MDAgMC45MTU5MDAKK3ZuIDAuMzQ4MDAwIC0wLjIwMDkwMCAwLjkxNTcwMAordm4gLTAuMzUxMTAwIC0wLjIwMjcwMCAwLjkxNDEwMAordm4gLTAuMzUxMDAwIC0wLjIwMjcwMCAwLjkxNDIwMAordm4gMC4zNDcxMDAgMC4yMDA1MDAgMC45MTYxMDAKK3ZuIDAuMzQ3NzAwIDAuMjAwODAwIDAuOTE1ODAwCit2biAtMC4zNTEwMDAgMC4yMDI3MDAgMC45MTQyMDAKK3ZuIC0wLjM1MDUwMCAwLjIwMjMwMCAwLjkxNDUwMAordm4gMC4zNDczMDAgMC4yMDYxMDAgMC45MTQ4MDAKK3ZuIDAuMzQ3NDAwIDAuMjA2MTAwIDAuOTE0ODAwCit2biAtMC4zNTE0MDAgMC4xOTcxMDAgMC45MTUyMDAKK3ZuIC0wLjM1MTMwMCAwLjE5NzEwMCAwLjkxNTMwMAordm4gMC4zNDc0MDAgLTAuMjA2MDAwIDAuOTE0ODAwCit2biAwLjM0NzcwMCAtMC4yMDYzMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MTgwMCAtMC4xOTczMDAgMC45MTUwMDAKK3ZuIC0wLjM1MTUwMCAtMC4xOTcxMDAgMC45MTUyMDAKK3ZuIDAuMzUyNTAwIC0wLjE5NzkwMCAwLjkxNDcwMAordm4gMC4zNTI3MDAgLTAuMTk4MDAwIDAuOTE0NjAwCit2biAtMC4zNDY2MDAgLTAuMjA1ODAwIDAuOTE1MjAwCit2biAtMC4zNDYzMDAgLTAuMjA1NjAwIDAuOTE1MzAwCit2biAwLjM1MjMwMCAwLjE5NzgwMCAwLjkxNDcwMAordm4gMC4zNTI0MDAgMC4xOTc4MDAgMC45MTQ3MDAKK3ZuIC0wLjM0NjQwMCAwLjIwNTcwMCAwLjkxNTMwMAordm4gLTAuMzQ2MjAwIDAuMjA1NjAwIDAuOTE1NDAwCit2biAtMC4wMDAwMDAgMC40MDM4MDAgMC45MTQ4MDAKK3ZuIDAuMzQ4MzAwIC0wLjIwMTEwMCAwLjkxNTYwMAordm4gMC4zNDgzMDAgLTAuMjAxMTAwIDAuOTE1NTAwCit2biAtMC4zNTEwMDAgLTAuMjAyNjAwIDAuOTE0MjAwCit2biAwLjM0NzcwMCAwLjIwMDgwMCAwLjkxNTkwMAordm4gMC4zNDgyMDAgMC4yMDEwMDAgMC45MTU2MDAKK3ZuIC0wLjM1MDUwMCAwLjIwMjMwMCAwLjkxNDQwMAordm4gMC4zNDc5MDAgMC4yMDY0MDAgMC45MTQ1MDAKK3ZuIDAuMzQ3ODAwIDAuMjA2NDAwIDAuOTE0NjAwCit2biAtMC4zNTE0MDAgMC4xOTcwMDAgMC45MTUzMDAKK3ZuIC0wLjM1MTUwMCAwLjE5NzAwMCAwLjkxNTIwMAordm4gMC4zNDc5MDAgLTAuMjA2NDAwIDAuOTE0NTAwCit2biAwLjM0ODMwMCAtMC4yMDY3MDAgMC45MTQzMDAKK3ZuIC0wLjM1MTgwMCAtMC4xOTcxMDAgMC45MTUxMDAKK3ZuIC0wLjM1MTUwMCAtMC4xOTcwMDAgMC45MTUyMDAKK3ZuIC0wLjAwMDAwMCAwLjQwMjYwMCAwLjkxNTQwMAordm4gMC4zNTI2MDAgLTAuMTk3OTAwIDAuOTE0NjAwCit2biAwLjM1MjgwMCAtMC4xOTgwMDAgMC45MTQ1MDAKK3ZuIC0wLjM0NjUwMCAtMC4yMDU5MDAgMC45MTUyMDAKK3ZuIC0wLjM0NjIwMCAtMC4yMDU3MDAgMC45MTUzMDAKK3ZuIDAuMzUyNDAwIDAuMTk3OTAwIDAuOTE0NzAwCit2biAwLjM1MjcwMCAwLjE5ODAwMCAwLjkxNDYwMAordm4gLTAuMzQ2MTAwIDAuMjA1NzAwIDAuOTE1NDAwCit2biAtMC4zNDYzMDAgMC4yMDU4MDAgMC45MTUzMDAKK3ZuIDAuMzQ4MjAwIC0wLjIwMTAwMCAwLjkxNTYwMAordm4gLTAuMzUxMjAwIC0wLjIwMjcwMCAwLjkxNDEwMAordm4gMC4zNDc2MDAgMC4yMDA3MDAgMC45MTU5MDAKK3ZuIC0wLjM1MDkwMCAwLjIwMjcwMCAwLjkxNDIwMAordm4gMC4zNDc4MDAgMC4yMDYzMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MTUwMCAwLjE5NzEwMCAwLjkxNTIwMAordm4gMC4zNDc4MDAgLTAuMjA2MzAwIDAuOTE0NjAwCit2biAwLjM0ODMwMCAtMC4yMDY2MDAgMC45MTQzMDAKK3ZuIC0wLjM1MTgwMCAtMC4xOTcyMDAgMC45MTUwMDAKK3ZuIC0wLjM1MTQwMCAtMC4xOTcwMDAgMC45MTUzMDAKK3ZuIDAuMzUyNjAwIC0wLjE5ODAwMCAwLjkxNDYwMAordm4gMC4zNTI4MDAgLTAuMTk4MTAwIDAuOTE0NTAwCit2biAtMC4zNDY2MDAgLTAuMjA1OTAwIDAuOTE1MjAwCit2biAtMC4zNDYzMDAgLTAuMjA1NzAwIDAuOTE1MzAwCit2biAwLjM1MjUwMCAwLjE5NzkwMCAwLjkxNDYwMAordm4gLTAuMzQ2MjAwIDAuMjA1NzAwIDAuOTE1MzAwCit2biAwLjAwMDAwMCAwLjQwMzYwMCAwLjkxNTAwMAordm4gLTAuMzQ2NjAwIC0wLjIwNTUwMCAwLjkxNTIwMAordm4gLTAuMzQ2MzAwIC0wLjIwNTMwMCAwLjkxNTQwMAordm4gMC4zNTI2MDAgLTAuMTk4MTAwIDAuOTE0NjAwCit2biAtMC4zNDYzMDAgMC4yMDUzMDAgMC45MTU0MDAKK3ZuIDAuMzUyNTAwIDAuMTk4MDAwIDAuOTE0NjAwCit2biAtMC4zNTA4MDAgLTAuMjAyNTAwIDAuOTE0MzAwCit2biAtMC4zNTA3MDAgLTAuMjAyNTAwIDAuOTE0MzAwCit2biAtMC4zNTA3MDAgMC4yMDI2MDAgMC45MTQzMDAKK3ZuIC0wLjM1MDEwMCAwLjIwMjEwMCAwLjkxNDYwMAordm4gMC4zNDc5MDAgMC4yMDYzMDAgMC45MTQ1MDAKK3ZuIDAuMzQ3OTAwIDAuMjA2MzAwIDAuOTE0NjAwCit2biAtMC4zNTExMDAgMC4xOTcyMDAgMC45MTUzMDAKK3ZuIDAuMzQ3OTAwIC0wLjIwNjIwMCAwLjkxNDYwMAordm4gMC4zNDgzMDAgLTAuMjA2NTAwIDAuOTE0MzAwCit2biAtMC4zNTExMDAgLTAuMTk3MjAwIDAuOTE1MzAwCit2biAwLjM0ODEwMCAtMC4yMDEwMDAgMC45MTU2MDAKK3ZuIDAuMzQ4MjAwIC0wLjIwMTEwMCAwLjkxNTYwMAordm4gMC4zNDc0MDAgMC4yMDA2MDAgMC45MTYwMDAKK3ZuIDAuMzQ4MTAwIDAuMjAxMDAwIDAuOTE1NzAwCit2biAwLjM0NzYwMCAwLjIwNjMwMCAwLjkxNDcwMAordm4gMC4zNDc3MDAgMC4yMDYzMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MTQwMCAwLjE5NzEwMCAwLjkxNTMwMAordm4gMC4zNDgwMDAgLTAuMjA2NTAwIDAuOTE0NDAwCit2biAtMC4zNTE4MDAgLTAuMTk3MjAwIDAuOTE1MTAwCit2biAwLjM1MjcwMCAtMC4xOTc5MDAgMC45MTQ2MDAKK3ZuIC0wLjM0NjQwMCAtMC4yMDU3MDAgMC45MTUyMDAKK3ZuIC0wLjM0NjMwMCAwLjIwNTcwMCAwLjkxNTMwMAordm4gMC4zNDgzMDAgMC4yMDExMDAgMC45MTU1MDAKK3ZuIC0wLjM1MTEwMCAwLjIwMjgwMCAwLjkxNDEwMAordm4gLTAuMzUxNjAwIDAuMTk3MTAwIDAuOTE1MjAwCit2biAwLjM0NzkwMCAtMC4yMDYzMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MTkwMCAtMC4xOTcyMDAgMC45MTUwMDAKK3ZuIDAuMzUyNjAwIDAuMTk4MDAwIDAuOTE0NjAwCit2biAtMC4zNDY0MDAgMC4yMDU4MDAgMC45MTUzMDAKK3ZuIC0wLjM1MDkwMCAtMC4yMDI2MDAgMC45MTQyMDAKK3ZuIC0wLjM1MDUwMCAwLjIwMjQwMCAwLjkxNDUwMAordm4gLTAuMzUxMzAwIDAuMTk3MDAwIDAuOTE1MzAwCit2biAwLjM0ODIwMCAtMC4yMDY1MDAgMC45MTQ0MDAKK3ZuIC0wLjM1MTMwMCAtMC4xOTcwMDAgMC45MTUzMDAKK3ZuIDAuMzUyNTAwIC0wLjE5NzkwMCAwLjkxNDYwMAordm4gLTAuMzQ2NzAwIC0wLjIwNTkwMCAwLjkxNTEwMAordm4gLTAuMzQ2NDAwIC0wLjIwNTcwMCAwLjkxNTMwMAordm4gMC4zNDc4MDAgMC4yMDA4MDAgMC45MTU4MDAKK3ZuIC0wLjM1MDQwMCAwLjIwMjMwMCAwLjkxNDUwMAordm4gMC4zNDgxMDAgMC4yMDYyMDAgMC45MTQ1MDAKK3ZuIDAuMzQ3OTAwIDAuMjA2MjAwIDAuOTE0NjAwCit2biAtMC4zNTE0MDAgMC4xOTcyMDAgMC45MTUyMDAKK3ZuIC0wLjM1MTUwMCAwLjE5NzMwMCAwLjkxNTIwMAordm4gMC4zNDc5MDAgLTAuMjA2MTAwIDAuOTE0NjAwCit2biAwLjM0ODMwMCAtMC4yMDY0MDAgMC45MTQ0MDAKK3ZuIC0wLjM1MTgwMCAtMC4xOTc0MDAgMC45MTUwMDAKK3ZuIC0wLjM1MTUwMCAtMC4xOTczMDAgMC45MTUyMDAKK3ZuIDAuMDAwMDAwIDAuNDAyOTAwIDAuOTE1MjAwCit2biAwLjM1MjYwMCAtMC4xOTgyMDAgMC45MTQ1MDAKK3ZuIDAuMzUyOTAwIC0wLjE5ODQwMCAwLjkxNDQwMAordm4gLTAuMzQ2NzAwIC0wLjIwNTcwMCAwLjkxNTEwMAordm4gLTAuMzQ2NDAwIC0wLjIwNTYwMCAwLjkxNTMwMAordm4gMC4zNTIzMDAgMC4xOTgxMDAgMC45MTQ3MDAKK3ZuIDAuMzUyNjAwIDAuMTk4MjAwIDAuOTE0NTAwCit2biAtMC4zNDY0MDAgMC4yMDU2MDAgMC45MTUzMDAKK3ZuIC0wLjM0NjMwMCAwLjIwNTUwMCAwLjkxNTMwMAordm4gMC4wMDAwMDAgLTAuNDA0NjAwIDAuOTE0NTAwCit2biAtMC4zNTAzMDAgLTAuMjAyMjAwIDAuOTE0NTAwCit2biAtMC4zNTAyMDAgLTAuMjAyMjAwIDAuOTE0NjAwCit2biAtMC4zNTAzMDAgMC4yMDIzMDAgMC45MTQ1MDAKK3ZuIDAuMzQ4MDAwIDAuMjA2MzAwIDAuOTE0NTAwCit2biAtMC4zNTAzMDAgMC4yMDIyMDAgMC45MTQ2MDAKK3ZuIDAuMzQ3NzAwIC0wLjIwNjIwMCAwLjkxNDYwMAordm4gMC4zNDgwMDAgLTAuMjA2NDAwIDAuOTE0NTAwCit2biAtMC4zNTA3MDAgLTAuMjAyNDAwIDAuOTE0NDAwCit2biAtMC4zNTAzMDAgLTAuMjAyMzAwIDAuOTE0NTAwCit2biAwLjAwMDAwMCAtMC40MDMzMDAgMC45MTUwMDAKK3ZuIDAuMzUyNTAwIC0wLjE5ODAwMCAwLjkxNDYwMAordm4gMC4zNTI4MDAgLTAuMTk4MjAwIDAuOTE0NTAwCit2biAtMC4zNDgxMDAgLTAuMjAxMDAwIDAuOTE1NzAwCit2biAtMC4zNDgwMDAgMC4yMDA5MDAgMC45MTU3MDAKK3ZuIC0wLjM0NzgwMCAwLjIwMDgwMCAwLjkxNTgwMAordm4gMC4zNDkwMDAgLTAuMjAxNTAwIDAuOTE1MjAwCit2biAwLjM0OTEwMCAtMC4yMDE1MDAgMC45MTUyMDAKK3ZuIC0wLjM0NzEwMCAtMC4yMDA0MDAgMC45MTYyMDAKK3ZuIC0wLjM0NzAwMCAtMC4yMDA0MDAgMC45MTYyMDAKK3ZuIDAuMzQ4NDAwIDAuMjAxMjAwIDAuOTE1NTAwCit2biAwLjM0OTEwMCAwLjIwMTUwMCAwLjkxNTIwMAordm4gLTAuMzQ2NTAwIDAuMjAwMDAwIDAuOTE2NTAwCit2biAwLjM0ODcwMCAwLjIwNjkwMCAwLjkxNDEwMAordm4gMC4zNDg3MDAgMC4yMDY4MDAgMC45MTQxMDAKK3ZuIC0wLjM0NzUwMCAwLjE5NTAwMCAwLjkxNzIwMAordm4gMC4zNDg1MDAgLTAuMjA2NzAwIDAuOTE0MjAwCit2biAwLjM0OTAwMCAtMC4yMDcwMDAgMC45MTQwMDAKK3ZuIC0wLjM0NzkwMCAtMC4xOTUyMDAgMC45MTcwMDAKK3ZuIC0wLjM0NzUwMCAtMC4xOTUwMDAgMC45MTcyMDAKK3ZuIDAuMzUxMjAwIC0wLjE5NzIwMCAwLjkxNTMwMAordm4gMC4zNTE1MDAgLTAuMTk3MzAwIDAuOTE1MjAwCit2biAtMC4zNDI5MDAgLTAuMjAzNTAwIDAuOTE3MTAwCit2biAtMC4zNDI1MDAgLTAuMjAzMzAwIDAuOTE3MzAwCit2biAwLjM1MTAwMCAwLjE5NzEwMCAwLjkxNTQwMAordm4gMC4zNTEyMDAgMC4xOTcyMDAgMC45MTUzMDAKK3ZuIC0wLjM0MjQwMCAwLjIwMzMwMCAwLjkxNzMwMAordm4gLTAuMzQyNDAwIDAuMjAzMjAwIDAuOTE3MzAwCit2biAwLjMyNzkwMCAtMC4yMTkzMDAgMC45MTg5MDAKK3ZuIDAuMzI4MDAwIC0wLjIxOTQwMCAwLjkxODkwMAordm4gMC4zMjc0MDAgMC4yMTkwMDAgMC45MTkxMDAKK3ZuIDAuMzI4MDAwIDAuMjE5NDAwIDAuOTE4OTAwCit2biAwLjMyNzgwMCAwLjIyNDQwMCAwLjkxNzcwMAordm4gMC4zMjc3MDAgMC4yMjQ0MDAgMC45MTc3MDAKK3ZuIC0wLjM0OTYwMCAwLjIwMTgwMCAwLjkxNDkwMAordm4gLTAuMzQ5OTAwIDAuMjAyMDAwIDAuOTE0ODAwCit2biAwLjMyNzYwMCAtMC4yMjQzMDAgMC45MTc4MDAKK3ZuIDAuMzI3OTAwIC0wLjIyNDYwMCAwLjkxNzYwMAordm4gLTAuMzQ5NjAwIC0wLjIwMTkwMCAwLjkxNDkwMAordm4gMC4wMDAwMDAgLTAuNDAzMTAwIDAuOTE1MTAwCit2biAwLjAwMDAwMCAtMC40MDQwMDAgMC45MTQ3MDAKK3ZuIDAuMzMyMDAwIC0wLjIxNjcwMCAwLjkxODEwMAordm4gMC4zMzIyMDAgLTAuMjE2OTAwIDAuOTE3OTAwCit2biAtMC4zNDk3MDAgLTAuMjAxOTAwIDAuOTE0ODAwCit2biAwLjMzMTcwMCAwLjIxNjYwMCAwLjkxODIwMAordm4gMC4zMzE5MDAgMC4yMTY3MDAgMC45MTgxMDAKK3ZuIC0wLjM0OTgwMCAtMC4yMDE5MDAgMC45MTQ4MDAKK3ZuIDAuMzQ5MDAwIDAuMjAxNjAwIDAuOTE1MjAwCit2biAtMC4zNDk0MDAgMC4yMDE4MDAgMC45MTUwMDAKK3ZuIC0wLjM0OTMwMCAwLjIwMTcwMCAwLjkxNTAwMAordm4gMC4zNDk5MDAgLTAuMjAyMDAwIDAuOTE0NzAwCit2biAwLjM0OTUwMCAwLjIwMTgwMCAwLjkxNTAwMAordm4gMC4zNDk1MDAgMC4yMDE4MDAgMC45MTQ5MDAKK3ZuIDAuMzQ5MjAwIDAuMjAxNzAwIDAuOTE1MTAwCit2biAtMC4zNDY3MDAgLTAuMjA1MjAwIDAuOTE1MjAwCit2biAtMC4zNDY1MDAgLTAuMjA1MTAwIDAuOTE1NDAwCit2biAtMC4zNDY1MDAgMC4yMDUyMDAgMC45MTUzMDAKK3ZuIC0wLjM0NjUwMCAwLjIwNTEwMCAwLjkxNTQwMAordm4gLTAuMzUwNDAwIC0wLjIwMjMwMCAwLjkxNDUwMAordm4gLTAuMzUwNzAwIDAuMTk3NDAwIDAuOTE1NDAwCit2biAtMC4zNTA2MDAgMC4xOTczMDAgMC45MTU1MDAKK3ZuIC0wLjM1MTAwMCAtMC4xOTc1MDAgMC45MTUzMDAKK3ZuIC0wLjM1MDcwMCAtMC4xOTc0MDAgMC45MTU0MDAKK3ZuIDAuMzQ5MjAwIC0wLjIwMTcwMCAwLjkxNTEwMAordm4gLTAuMzQ5NTAwIDAuMjAxODAwIDAuOTE0OTAwCit2biAwLjM0OTMwMCAtMC4yMDE2MDAgMC45MTUxMDAKK3ZuIDAuMzQ5NjAwIC0wLjIwMTkwMCAwLjkxNDkwMAordm4gMC4zNDkxMDAgMC4yMDE2MDAgMC45MTUyMDAKK3ZuIDAuMzQ5MzAwIDAuMjAxNzAwIDAuOTE1MTAwCit2biAtMC4zNDc3MDAgLTAuMjAwODAwIDAuOTE1ODAwCit2biAtMC4zNDc4MDAgLTAuMjAwODAwIDAuOTE1ODAwCit2biAwLjM1MTEwMCAtMC4yMDI3MDAgMC45MTQyMDAKK3ZuIC0wLjM0NzgwMCAtMC4yMDYzMDAgMC45MTQ2MDAKK3ZuIDAuMzUxODAwIC0wLjE5NzMwMCAwLjkxNTEwMAordm4gMC4zNDYzMDAgLTAuMjA1NjAwIDAuOTE1MzAwCit2biAwLjM0NjQwMCAtMC4yMDU3MDAgMC45MTUyMDAKK3ZuIC0wLjM1MjIwMCAwLjE5NzcwMCAwLjkxNDgwMAordm4gLTAuMzQ4NDAwIDAuMjAxMTAwIDAuOTE1NTAwCit2biAwLjM1MTEwMCAwLjIwMjcwMCAwLjkxNDEwMAordm4gLTAuMzQ4MzAwIC0wLjIwNjcwMCAwLjkxNDMwMAordm4gMC4zNDYzMDAgLTAuMjA1ODAwIDAuOTE1MzAwCit2biAwLjM0NjQwMCAtMC4yMDU4MDAgMC45MTUzMDAKK3ZuIDAuMzQ2MzAwIDAuMjA1ODAwIDAuOTE1MzAwCit2biAwLjM1MTMwMCAwLjE5NzAwMCAwLjkxNTMwMAordm4gLTAuMzUyNzAwIC0wLjE5ODAwMCAwLjkxNDYwMAordm4gLTAuMzUyNzAwIDAuMTk4MDAwIDAuOTE0NjAwCit2biAwLjM0NjQwMCAtMC4yMDU0MDAgMC45MTUzMDAKK3ZuIDAuMzQ2NTAwIC0wLjIwNTQwMCAwLjkxNTMwMAordm4gMC4zNDYxMDAgMC4yMDUyMDAgMC45MTU1MDAKK3ZuIDAuMzQ2NTAwIDAuMjA1NDAwIDAuOTE1MzAwCit2biAtMC4zNTI3MDAgMC4xOTgxMDAgMC45MTQ1MDAKK3ZuIDAuMzUwNzAwIC0wLjIwMjUwMCAwLjkxNDMwMAordm4gMC4zNTA3MDAgLTAuMjAyNDAwIDAuOTE0NDAwCit2biAwLjM1MDYwMCAwLjIwMjUwMCAwLjkxNDQwMAordm4gLTAuMzQ3ODAwIDAuMjA2MjAwIDAuOTE0NjAwCit2biAtMC4zNDc5MDAgMC4yMDYzMDAgMC45MTQ1MDAKK3ZuIDAuMzUxMDAwIDAuMTk3MjAwIDAuOTE1NDAwCit2biAwLjM1MTEwMCAwLjE5NzMwMCAwLjkxNTMwMAordm4gLTAuMzQ4NDAwIC0wLjIwNjYwMCAwLjkxNDMwMAordm4gMC4zNTEwMDAgLTAuMTk3MjAwIDAuOTE1NDAwCit2biAwLjM1MTUwMCAtMC4xOTc0MDAgMC45MTUxMDAKK3ZuIC0wLjM0ODAwMCAtMC4yMDA5MDAgMC45MTU3MDAKK3ZuIDAuMzUxNDAwIC0wLjE5NzEwMCAwLjkxNTIwMAordm4gMC4zNDY0MDAgLTAuMjA1NzAwIDAuOTE1MzAwCit2biAtMC4zNTI0MDAgMC4xOTc4MDAgMC45MTQ3MDAKK3ZuIC0wLjM0ODMwMCAtMC4yMDEwMDAgMC45MTU2MDAKK3ZuIDAuMzUwNjAwIDAuMjAyNDAwIDAuOTE0NDAwCit2biAtMC4zNDc5MDAgLTAuMjA2NDAwIDAuOTE0NjAwCit2biAwLjAwMDAwMCAwLjQwMjQwMCAwLjkxNTQwMAordm4gMC4zNDY0MDAgMC4yMDU4MDAgMC45MTUyMDAKK3ZuIC0wLjM0ODEwMCAwLjIwMTAwMCAwLjkxNTYwMAordm4gMC4zNTA1MDAgMC4yMDI0MDAgMC45MTQ1MDAKK3ZuIC0wLjM0ODEwMCAtMC4yMDY1MDAgMC45MTQ0MDAKK3ZuIC0wLjM0NzcwMCAtMC4yMDYyMDAgMC45MTQ2MDAKK3ZuIDAuMzQ2NjAwIC0wLjIwNTgwMCAwLjkxNTIwMAordm4gLTAuMzQ4MzAwIC0wLjIwMTEwMCAwLjkxNTUwMAordm4gLTAuMzQ3ODAwIDAuMjAwOTAwIDAuOTE1ODAwCit2biAtMC4zNDgxMDAgLTAuMjA2MzAwIDAuOTE0NTAwCit2biAwLjM1MTcwMCAtMC4xOTczMDAgMC45MTUxMDAKK3ZuIC0wLjM1MjUwMCAtMC4xOTgyMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MjUwMCAwLjE5ODIwMCAwLjkxNDYwMAordm4gLTAuMzUyNDAwIDAuMTk4MTAwIDAuOTE0NjAwCit2biAwLjM1MDMwMCAtMC4yMDIyMDAgMC45MTQ1MDAKK3ZuIDAuMzQ5OTAwIDAuMjAyMDAwIDAuOTE0ODAwCit2biAtMC4zNDc3MDAgMC4yMDYyMDAgMC45MTQ3MDAKK3ZuIDAuMzUwMzAwIDAuMjAyMjAwIDAuOTE0NTAwCit2biAtMC4zNTI4MDAgLTAuMTk4MjAwIDAuOTE0NTAwCit2biAtMC4zNTI0MDAgLTAuMTk3OTAwIDAuOTE0NzAwCit2biAwLjM0ODEwMCAtMC4yMDA5MDAgMC45MTU3MDAKK3ZuIDAuMzQ4MTAwIDAuMjAxMDAwIDAuOTE1NjAwCit2biAtMC4zNDkxMDAgLTAuMjAxNTAwIDAuOTE1MjAwCit2biAwLjM0NzMwMCAtMC4yMDA1MDAgMC45MTYxMDAKK3ZuIC0wLjM0ODUwMCAwLjIwMTMwMCAwLjkxNTUwMAordm4gMC4zNDY2MDAgMC4yMDAxMDAgMC45MTY0MDAKK3ZuIC0wLjM0ODgwMCAtMC4yMDY5MDAgMC45MTQxMDAKK3ZuIC0wLjM0ODcwMCAtMC4yMDY4MDAgMC45MTQyMDAKK3ZuIDAuMzQ3OTAwIC0wLjE5NTEwMCAwLjkxNzAwMAordm4gLTAuMzUxNDAwIC0wLjE5NzQwMCAwLjkxNTIwMAordm4gMC4zNDI1MDAgLTAuMjAzMzAwIDAuOTE3MjAwCit2biAwLjM0MjcwMCAtMC4yMDM0MDAgMC45MTcxMDAKK3ZuIDAuMzQyMzAwIDAuMjAzMjAwIDAuOTE3NDAwCit2biAwLjM0MjYwMCAwLjIwMzQwMCAwLjkxNzIwMAordm4gLTAuMzI4MTAwIC0wLjIxOTQwMCAwLjkxODgwMAordm4gLTAuMzI4MDAwIC0wLjIxOTQwMCAwLjkxODkwMAordm4gLTAuMzI3NTAwIDAuMjE5MTAwIDAuOTE5MTAwCit2biAtMC4zMjc3MDAgMC4yMjQ0MDAgMC45MTc4MDAKK3ZuIC0wLjMyNzUwMCAwLjIyNDMwMCAwLjkxNzgwMAordm4gLTAuMzI3OTAwIC0wLjIyNDUwMCAwLjkxNzcwMAordm4gLTAuMzI3NzAwIC0wLjIyNDQwMCAwLjkxNzgwMAordm4gMC4zNTAwMDAgLTAuMjAyMDAwIDAuOTE0NzAwCit2biAtMC4zMzIyMDAgLTAuMjE2OTAwIDAuOTE4MDAwCit2biAtMC4zMzIwMDAgLTAuMjE2NzAwIDAuOTE4MTAwCit2biAtMC4zMzE5MDAgMC4yMTY3MDAgMC45MTgxMDAKK3ZuIC0wLjM0OTUwMCAtMC4yMDE3MDAgMC45MTUwMDAKK3ZuIC0wLjM0OTEwMCAwLjIwMTYwMCAwLjkxNTEwMAordm4gMC4zNDg5MDAgMC4yMDE0MDAgMC45MTUzMDAKK3ZuIDAuMzQ2NzAwIC0wLjIwNTIwMCAwLjkxNTMwMAordm4gMC4zNDYzMDAgMC4yMDUwMDAgMC45MTU1MDAKK3ZuIDAuMzUwMzAwIDAuMjAyMzAwIDAuOTE0NjAwCit2biAwLjM1MDcwMCAwLjE5NzQwMCAwLjkxNTUwMAordm4gMC4zNTA2MDAgLTAuMTk3NDAwIDAuOTE1NTAwCit2biAwLjAwMDAwMCAtMC40MDMxMDAgMC45MTUyMDAKK3ZuIC0wLjAwMDAwMCAtMC40MDI5MDAgMC45MTUyMDAKK3ZuIDAuMzQ3ODAwIC0wLjIwMDgwMCAwLjkxNTgwMAordm4gLTAuMzUxMTAwIDAuMjAyNzAwIDAuOTE0MTAwCit2biAwLjM0NzMwMCAtMC4yMDYwMDAgMC45MTQ4MDAKK3ZuIC0wLjM1MTkwMCAtMC4xOTczMDAgMC45MTUwMDAKK3ZuIC0wLjM1MTQwMCAtMC4xOTcxMDAgMC45MTUzMDAKK3ZuIDAuMzUyMjAwIDAuMTk3ODAwIDAuOTE0ODAwCit2biAtMC4zNDYxMDAgMC4yMDU1MDAgMC45MTU0MDAKK3ZuIC0wLjM1MTEwMCAtMC4yMDI3MDAgMC45MTQyMDAKK3ZuIDAuMzQ4MjAwIC0wLjIwNjYwMCAwLjkxNDQwMAordm4gLTAuMzQ2NDAwIC0wLjIwNTgwMCAwLjkxNTIwMAordm4gLTAuMzQ2MzAwIC0wLjIwNTgwMCAwLjkxNTMwMAordm4gMC4zNTI2MDAgMC4xOTc5MDAgMC45MTQ2MDAKK3ZuIC0wLjM0NjIwMCAwLjIwNTgwMCAwLjkxNTMwMAordm4gLTAuMzUxMDAwIDAuMjAyNzAwIDAuOTE0MTAwCit2biAtMC4zNDYyMDAgMC4yMDU2MDAgMC45MTUzMDAKK3ZuIC0wLjM0NjUwMCAtMC4yMDU0MDAgMC45MTUzMDAKK3ZuIDAuMzUyNzAwIC0wLjE5ODEwMCAwLjkxNDUwMAordm4gLTAuMzQ2NDAwIDAuMjA1NDAwIDAuOTE1NDAwCit2biAtMC4zNDYyMDAgMC4yMDUzMDAgMC45MTU0MDAKK3ZuIDAuMzUyNDAwIDAuMTk4MDAwIDAuOTE0NzAwCit2biAtMC4zNTA3MDAgMC4yMDI1MDAgMC45MTQzMDAKK3ZuIC0wLjM1MDIwMCAwLjIwMjIwMCAwLjkxNDYwMAordm4gLTAuMzUxMjAwIDAuMTk3MzAwIDAuOTE1MzAwCit2biAtMC4zNTEwMDAgMC4xOTcyMDAgMC45MTU0MDAKK3ZuIDAuMzQ3NTAwIDAuMjAwNzAwIDAuOTE2MDAwCit2biAwLjM0ODAwMCAwLjIwMDkwMCAwLjkxNTcwMAordm4gMC4zNDc2MDAgLTAuMjA2MzAwIDAuOTE0NzAwCit2biAtMC4zNTE0MDAgLTAuMTk3MDAwIDAuOTE1MjAwCit2biAtMC4zNTA2MDAgMC4yMDI0MDAgMC45MTQ0MDAKK3ZuIC0wLjM1MjAwMCAtMC4xOTczMDAgMC45MTUwMDAKK3ZuIDAuMzUyNzAwIC0wLjE5ODAwMCAwLjkxNDUwMAordm4gLTAuMzQ2NTAwIC0wLjIwNTgwMCAwLjkxNTIwMAordm4gLTAuMzQ2NDAwIDAuMjA1ODAwIDAuOTE1MjAwCit2biAwLjM0NzUwMCAwLjIwMDcwMCAwLjkxNTkwMAordm4gMC4zNDc3MDAgMC4yMDYyMDAgMC45MTQ2MDAKK3ZuIC0wLjM1MTcwMCAtMC4xOTcyMDAgMC45MTUxMDAKK3ZuIC0wLjM1MTQwMCAtMC4xOTcxMDAgMC45MTUyMDAKK3ZuIC0wLjM0NjYwMCAtMC4yMDU4MDAgMC45MTUxMDAKK3ZuIDAuMzQ4NDAwIC0wLjIwMTIwMCAwLjkxNTUwMAordm4gMC4zNDc5MDAgMC4yMDA5MDAgMC45MTU4MDAKK3ZuIDAuMzQ3OTAwIDAuMjA2MTAwIDAuOTE0NjAwCit2biAtMC4zNTEzMDAgMC4xOTcyMDAgMC45MTUzMDAKK3ZuIDAuMzQ4MjAwIC0wLjIwNjMwMCAwLjkxNDQwMAordm4gLTAuMzUxNzAwIC0wLjE5NzMwMCAwLjkxNTEwMAordm4gLTAuMzUxNDAwIC0wLjE5NzIwMCAwLjkxNTIwMAordm4gMC4zNTI2MDAgLTAuMTk4MjAwIDAuOTE0NjAwCit2biAwLjM1MjgwMCAtMC4xOTg0MDAgMC45MTQ0MDAKK3ZuIDAuMzUyNDAwIDAuMTk4MTAwIDAuOTE0NjAwCit2biAwLjM1MjUwMCAwLjE5ODIwMCAwLjkxNDYwMAordm4gLTAuMzQ2MjAwIDAuMjA1NDAwIDAuOTE1NDAwCit2biAtMC4zNTAzMDAgLTAuMjAyMjAwIDAuOTE0NjAwCit2biAtMC4zNDk4MDAgMC4yMDIwMDAgMC45MTQ4MDAKK3ZuIDAuMzQ3ODAwIDAuMjA2MjAwIDAuOTE0NjAwCit2biAwLjM0NzcwMCAwLjIwNjIwMCAwLjkxNDcwMAordm4gMC4zNDc4MDAgLTAuMjA2MjAwIDAuOTE0NjAwCit2biAtMC4zNTA2MDAgLTAuMjAyNDAwIDAuOTE0NDAwCit2biAwLjM1MjMwMCAwLjE5NzkwMCAwLjkxNDcwMAordm4gLTAuMzQ3MjAwIC0wLjIwMDUwMCAwLjkxNjEwMAordm4gMC4zNDg1MDAgMC4yMDEzMDAgMC45MTU1MDAKK3ZuIDAuMzQ4OTAwIDAuMjAxNTAwIDAuOTE1MjAwCit2biAtMC4zNDY2MDAgMC4yMDAxMDAgMC45MTY0MDAKK3ZuIDAuMzQ4NjAwIDAuMjA2ODAwIDAuOTE0MjAwCit2biAtMC4zNDc2MDAgMC4xOTUwMDAgMC45MTcyMDAKK3ZuIDAuMzQ4NjAwIC0wLjIwNjgwMCAwLjkxNDIwMAordm4gMC4zNDg4MDAgLTAuMjA2OTAwIDAuOTE0MTAwCit2biAtMC4zNDc4MDAgLTAuMTk1MTAwIDAuOTE3MTAwCit2biAwLjM1MTMwMCAtMC4xOTcyMDAgMC45MTUzMDAKK3ZuIC0wLjM0MjgwMCAtMC4yMDM1MDAgMC45MTcxMDAKK3ZuIDAuMzUxMzAwIDAuMTk3MjAwIDAuOTE1MzAwCit2biAtMC4zNDI1MDAgMC4yMDMzMDAgMC45MTczMDAKK3ZuIC0wLjM0MjMwMCAwLjIwMzIwMCAwLjkxNzQwMAordm4gMC4zMjgwMDAgLTAuMjE5NDAwIDAuOTE4ODAwCit2biAwLjMyODEwMCAtMC4yMTk0MDAgMC45MTg4MDAKK3ZuIDAuMzI3NTAwIDAuMjE5MTAwIDAuOTE5MTAwCit2biAwLjMyNzUwMCAwLjIyNDMwMCAwLjkxNzgwMAordm4gMC4zMjc2MDAgMC4yMjQ0MDAgMC45MTc4MDAKK3ZuIDAuMzI3NzAwIC0wLjIyNDQwMCAwLjkxNzgwMAordm4gMC4zMjc4MDAgLTAuMjI0NTAwIDAuOTE3NzAwCit2biAtMC4zNTAwMDAgLTAuMjAyMDAwIDAuOTE0NzAwCit2biAwLjMzMTgwMCAtMC4yMTY2MDAgMC45MTgxMDAKK3ZuIDAuMzMyMzAwIC0wLjIxNzAwMCAwLjkxNzkwMAordm4gLTAuMzQ5NDAwIC0wLjIwMTgwMCAwLjkxNTAwMAordm4gLTAuMzQ4OTAwIDAuMjAxNTAwIDAuOTE1MjAwCit2biAwLjM0OTUwMCAtMC4yMDE3MDAgMC45MTUwMDAKK3ZuIC0wLjM0NjcwMCAtMC4yMDUyMDAgMC45MTUzMDAKK3ZuIC0wLjM0OTkwMCAwLjIwMjAwMCAwLjkxNDcwMAordm4gLTAuMzUwNzAwIDAuMTk3MzAwIDAuOTE1NTAwCit2biAtMC4zNTA3MDAgLTAuMTk3MzAwIDAuOTE1NTAwCit2biAwLjAwMDAwMCAtMC40MDMwMDAgMC45MTUyMDAKK3ZuIC0wLjk2MDQwMCAwLjI3ODcwMCAwLjAwMDAwMAordm4gMC45NjA0MDAgMC4yNzg3MDAgMC4wMDAwMDAKK3ZuIDAuNjg0NTAwIDAuNzI5MDAwIDAuMDAwMDAwCit2biAwLjI0ODMwMCAwLjk2ODcwMCAwLjAwMDAwMAordm4gLTAuMjQ4MzAwIDAuOTY4NzAwIC0wLjAwMDAwMAordm4gLTAuNjg0NTAwIDAuNzI5MDAwIDAuMDAwMDAwCit2biAtMC4wMDAxMDAgMC4wMDAwMDAgLTEuMDAwMDAwCit2biAtMC4wMDAxMDAgMC4wMDAxMDAgLTEuMDAwMDAwCit2biAtMC42ODI2MDAgMC4wMDAwMDAgLTAuNzMwODAwCit2biAtMC42ODkyMDAgMC4wMDY5MDAgLTAuNzI0NTAwCit2biAtMC43MjA5MDAgMC4yMDkyMDAgLTAuNjYwNzAwCit2biAtMC42NzE4MDAgMC4xNzc2MDAgLTAuNzE5MjAwCit2biAwLjY2OTYwMCAwLjE5NDMwMCAtMC43MTY5MDAKK3ZuIDAuNzMzNTAwIDAuMTkzODAwIC0wLjY1MTUwMAordm4gMC40NDA2MDAgMC40NjkyMDAgLTAuNzY1MzAwCit2biAwLjUxODMwMCAwLjUxNTkwMCAtMC42ODIwMDAKK3ZuIDAuMTY5MDAwIDAuNjU5MDAwIC0wLjczMjkwMAordm4gMC4xODIyMDAgMC42ODI2MDAgLTAuNzA3NzAwCit2biAtMC4xNzUyMDAgMC42ODM1MDAgLTAuNzA4NjAwCit2biAtMC4xNzU1MDAgMC42NTc1MDAgLTAuNzMyNzAwCit2biAtMC40OTYxMDAgMC41MjgzMDAgLTAuNjg5MDAwCit2biAtMC40NTg1MDAgMC40NTY2MDAgLTAuNzYyNTAwCit2biAtMC42ODkzMDAgMC4wMDAxMDAgLTAuNzI0NTAwCit2biAtMC42ODkzMDAgMC4wMDAwMDAgLTAuNzI0NTAwCit2biAwLjY4OTIwMCAwLjAwMDEwMCAtMC43MjQ1MDAKK3ZuIDAuNjgyNjAwIDAuMDA3MDAwIC0wLjczMDgwMAordm4gMC42ODkyMDAgLTAuMDAwMDAwIC0wLjcyNDUwMAordm4gMC42NTY2MDAgMC42ODk2MDAgLTAuMzA1NjAwCit2biAwLjIzODAwMCAwLjkyMzgwMCAtMC4yOTk5MDAKK3ZuIC0wLjIzODMwMCAwLjkyMzcwMCAtMC4yOTk5MDAKK3ZuIC0wLjY1NjYwMCAwLjY4OTYwMCAtMC4zMDU2MDAKK3ZuIC0wLjkxMzgwMCAwLjI2MDQwMCAtMC4zMTE2MDAKK3ZuIC0wLjkxNDAwMCAtMC4yNjAwMDAgLTAuMzExNjAwCit2biAtMC42NTY2MDAgLTAuNjg5NjAwIC0wLjMwNTYwMAordm4gLTAuMjM4NTAwIC0wLjkyMzcwMCAtMC4yOTk5MDAKK3ZuIDAuMjM4MjAwIC0wLjkyMzgwMCAtMC4yOTk5MDAKK3ZuIDAuNjU2NjAwIC0wLjY4OTYwMCAtMC4zMDU2MDAKK3ZuIDAuOTE0MTAwIC0wLjI1OTUwMCAtMC4zMTE2MDAKK3ZuIDAuOTE0MDAwIDAuMjYwMDAwIC0wLjMxMTYwMAordm4gMC42ODkyMDAgMC4wMDAxMDAgLTAuNzI0NjAwCit2biAwLjY4OTMwMCAwLjAwMDAwMCAtMC43MjQ1MDAKK3ZuIC0wLjk2MDQwMCAtMC4yNzg3MDAgMC4wMDAwMDAKK3ZuIDAuOTYwNDAwIC0wLjI3ODcwMCAwLjAwMDAwMAordm4gMC45NjAzMDAgLTAuMjc5MDAwIC0wLjAwMDMwMAordm4gMC42ODQ1MDAgLTAuNzI5MDAwIDAuMDAwMDAwCit2biAwLjI0ODQwMCAtMC45Njg3MDAgMC4wMDAwMDAKK3ZuIC0wLjI0ODMwMCAtMC45Njg3MDAgMC4wMDAwMDAKK3ZuIC0wLjY4NDUwMCAtMC43MjkwMDAgMC4wMDAwMDAKK3ZuIC0wLjY4OTIwMCAtMC4wMDY5MDAgLTAuNzI0NTAwCit2biAtMC42NzE4MDAgLTAuMTc3NjAwIC0wLjcxOTIwMAordm4gLTAuNzIwOTAwIC0wLjIwOTIwMCAtMC42NjA3MDAKK3ZuIDAuNzMzNTAwIC0wLjE5MzgwMCAtMC42NTE1MDAKK3ZuIDAuNjY5NjAwIC0wLjE5NDMwMCAtMC43MTY5MDAKK3ZuIDAuNTE4MzAwIC0wLjUxNTkwMCAtMC42ODIxMDAKK3ZuIDAuNDQwNjAwIC0wLjQ2OTIwMCAtMC43NjU0MDAKK3ZuIDAuMTgyMjAwIC0wLjY4MjYwMCAtMC43MDc3MDAKK3ZuIDAuMTY5MDAwIC0wLjY1OTAwMCAtMC43MzI5MDAKK3ZuIC0wLjE3NTQwMCAtMC42NTc1MDAgLTAuNzMyODAwCit2biAtMC4xNzUyMDAgLTAuNjgzNTAwIC0wLjcwODYwMAordm4gLTAuNDU4NTAwIC0wLjQ1NjYwMCAtMC43NjI1MDAKK3ZuIC0wLjQ5NjEwMCAtMC41MjgzMDAgLTAuNjg5MDAwCit2biAtMC42ODkzMDAgLTAuMDAwMTAwIC0wLjcyNDUwMAordm4gMC42ODI2MDAgLTAuMDA2OTAwIC0wLjczMDgwMAordm4gMC42ODkyMDAgLTAuMDAwMTAwIC0wLjcyNDYwMAordm4gMC42ODkyMDAgMC4wMDAwMDAgLTAuNzI0NjAwCit2biAtMC42ODkyMDAgMC4wMDAwMDAgLTAuNzI0NTAwCit2biAwLjIzODAwMCAtMC45MjM4MDAgLTAuMjk5OTAwCit2biAtMC4yMzgzMDAgLTAuOTIzNzAwIC0wLjI5OTkwMAordm4gLTAuMjM4MjAwIC0wLjkyMzcwMCAtMC4yOTk5MDAKK3ZuIC0wLjkxMzgwMCAtMC4yNjA0MDAgLTAuMzExNjAwCit2biAtMC45MTM4MDAgLTAuMjYwNTAwIC0wLjMxMTYwMAordm4gLTAuOTE0MDAwIDAuMjYwMDAwIC0wLjMxMTYwMAordm4gLTAuMjM4NTAwIDAuOTIzNzAwIC0wLjI5OTkwMAordm4gMC4yMzgyMDAgMC45MjM4MDAgLTAuMjk5OTAwCit2biAwLjIzODIwMCAwLjkyMzcwMCAtMC4yOTk5MDAKK3ZuIDAuOTE0MTAwIDAuMjU5NTAwIC0wLjMxMTYwMAordm4gMC45MTQwMDAgLTAuMjYwMDAwIC0wLjMxMTYwMAordm4gMC4wMDAwMDAgMS4wMDAwMDAgMC4wMDA3MDAKK3ZuIC0wLjY4OTIwMCAwLjAwMDAwMCAtMC43MjQ2MDAKK3ZuIDAuNjg5MjAwIC0wLjAwMDEwMCAtMC43MjQ1MDAKK3ZuIC0wLjk2MDMwMCAwLjI3OTAwMCAwLjAwMDAwMAordm4gLTAuNjg0NTAwIDAuNzI5MDAwIC0wLjAwMDEwMAordm4gLTAuMjQ4NDAwIDAuOTY4NzAwIC0wLjAwMDEwMAordm4gLTAuMjQ4NDAwIDAuOTY4NzAwIDAuMDAwMDAwCit2biAwLjI0ODMwMCAtMC45Njg3MDAgMC4wMDAwMDAKK3ZuIC0wLjQ2MTYwMCAtMC4wMDAxMDAgLTAuODg3MTAwCit2biAtMC40NjE2MDAgMC4wMDAwMDAgLTAuODg3MTAwCit2biAtMC40NjE2MDAgMC4wMDAxMDAgLTAuODg3MTAwCit2biAtMC40NDQ2MDAgMC4xMjkyMDAgLTAuODg2MzAwCit2biAtMC4zMjI3MDAgMC4zNDM3MDAgLTAuODgxOTAwCit2biAtMC4xMTkwMDAgMC40NjQzMDAgLTAuODc3NjAwCit2biAwLjExOTAwMCAwLjQ2NDMwMCAtMC44Nzc2MDAKK3ZuIDAuMzIyNzAwIDAuMzQzNzAwIC0wLjg4MTkwMAordm4gMC40NDQ3MDAgMC4xMjkwMDAgLTAuODg2MzAwCit2biAwLjQ2MTYwMCAwLjAwMDAwMCAtMC44ODcxMDAKK3ZuIDAuNDQ0NzAwIC0wLjEyOTAwMCAtMC44ODYzMDAKK3ZuIDAuMzIyNzAwIC0wLjM0MzcwMCAtMC44ODE5MDAKK3ZuIDAuMTE5MDAwIC0wLjQ2NDMwMCAtMC44Nzc2MDAKK3ZuIC0wLjExOTAwMCAtMC40NjQzMDAgLTAuODc3NjAwCit2biAtMC4zMjI3MDAgLTAuMzQzNzAwIC0wLjg4MTkwMAordm4gLTAuNDQ0NzAwIC0wLjEyOTAwMCAtMC44ODYzMDAKK3ZuIDAuODY5NjAwIC0wLjAwMDEwMCAtMC40OTM3MDAKK3ZuIC0wLjU0NjQwMCAwLjU2NzEwMCAtMC42MTYzMDAKK3ZuIC0wLjcwNzkwMCAwLjIwMDAwMCAtMC42Nzc0MDAKK3ZuIC0wLjcxMjkwMCAwLjIwMjkwMCAtMC42NzEyMDAKK3ZuIDAuNzkzMzAwIC0wLjIyNTgwMCAtMC41NjU0MDAKK3ZuIDAuNzkzNDAwIC0wLjIyNTkwMCAtMC41NjUzMDAKK3ZuIDAuMjA4NzAwIC0wLjgwOTMwMCAtMC41NDkxMDAKK3ZuIDAuMjA4ODAwIC0wLjgwOTQwMCAtMC41NDg4MDAKK3ZuIDAuNTczMDAwIC0wLjYwMzEwMCAtMC41NTQ5MDAKK3ZuIDAuNTcyMTAwIC0wLjYwMTIwMCAtMC41NTc5MDAKK3ZuIDAuNTI2ODAwIC0wLjU1MzIwMCAtMC42NDU0MDAKK3ZuIDAuNTA3NjAwIC0wLjU0MDcwMCAtMC42NzA4MDAKK3ZuIDAuMTgxMDAwIC0wLjcwNDAwMCAtMC42ODY3MDAKK3ZuIDAuMTgxMTAwIC0wLjcwNjIwMCAtMC42ODQ1MDAKK3ZuIC0wLjE5NjEwMCAwLjc2MDIwMCAtMC42MTkzMDAKK3ZuIC0wLjE5NjEwMCAwLjc2MDIwMCAtMC42MTk0MDAKK3ZuIC0wLjc0MjYwMCAwLjIxMTQwMCAtMC42MzU1MDAKK3ZuIC0wLjc0MjcwMCAwLjIxMTUwMCAtMC42MzU0MDAKK3ZuIC0wLjUzNzAwMCAwLjU2NDAwMCAtMC42MjczMDAKK3ZuIDAuMTk2MTAwIC0wLjc2MDEwMCAtMC42MTk1MDAKK3ZuIDAuMTk2MTAwIC0wLjc2MDIwMCAtMC42MTk0MDAKK3ZuIDAuNzQyNjAwIC0wLjIxMTUwMCAtMC42MzU1MDAKK3ZuIDAuNzQyNjAwIC0wLjIxMTUwMCAtMC42MzU0MDAKK3ZuIDAuNTM3MDAwIC0wLjU2NDAwMCAtMC42MjczMDAKK3ZuIC0wLjE5NjEwMCAwLjc2MDIwMCAtMC42MTk1MDAKK3ZuIC0wLjc0MjYwMCAwLjIxMTUwMCAtMC42MzU1MDAKK3ZuIC0wLjc0MjYwMCAwLjIxMTUwMCAtMC42MzU0MDAKK3ZuIC0wLjUzNzEwMCAwLjU2NDAwMCAtMC42MjczMDAKK3ZuIC0wLjUzNzEwMCAwLjU2NDAwMCAtMC42MjcyMDAKK3ZuIDAuNzQyNTAwIC0wLjIxMTUwMCAtMC42MzU2MDAKK3ZuIDAuNzQyNjAwIC0wLjIxMTYwMCAtMC42MzU0MDAKK3ZuIDAuNTM3MDAwIC0wLjU2NDAwMCAtMC42Mjc0MDAKK3ZuIC0wLjc0MjUwMCAwLjIxMTYwMCAtMC42MzU2MDAKK3ZuIC0wLjc0MjcwMCAwLjIxMTcwMCAtMC42MzUzMDAKK3ZuIC0wLjUzNzAwMCAwLjU2NDEwMCAtMC42MjcyMDAKK3ZuIDAuMTk2MDAwIC0wLjc2MDEwMCAtMC42MTk1MDAKK3ZuIDAuMTk2MDAwIC0wLjc2MDIwMCAtMC42MTk0MDAKK3ZuIDAuNzQyNTAwIC0wLjIxMTcwMCAtMC42MzU1MDAKK3ZuIDAuNzQyNjAwIC0wLjIxMTgwMCAtMC42MzU0MDAKK3ZuIC0wLjE5NjAwMCAwLjc2MDEwMCAtMC42MTk1MDAKK3ZuIC0wLjE5NjAwMCAwLjc2MDIwMCAtMC42MTk1MDAKK3ZuIC0wLjc0MjQwMCAwLjIxMTgwMCAtMC42MzU2MDAKK3ZuIC0wLjc0MjUwMCAwLjIxMjAwMCAtMC42MzU0MDAKK3ZuIC0wLjUzNzAwMCAwLjU2MzkwMCAtMC42Mjc0MDAKK3ZuIDAuMTY0MzAwIC0wLjYzNzMwMCAtMC43NTI5MDAKK3ZuIDAuNjE3NjAwIC0wLjE3NjQwMCAtMC43NjY1MDAKK3ZuIDAuNjE3NzAwIC0wLjE3NjUwMCAtMC43NjY0MDAKK3ZuIDAuNDQ4NTAwIC0wLjQ3MTAwMCAtMC43NTk2MDAKK3ZuIDAuNDQ4NTAwIC0wLjQ3MTIwMCAtMC43NTk1MDAKK3ZuIDAuMDAwMTAwIC0wLjAwMDIwMCAtMS4wMDAwMDAKK3ZuIC0wLjUwNDYwMCAwLjUzMTIwMCAtMC42ODA2MDAKK3ZuIC0wLjUwNDcwMCAwLjUzMTMwMCAtMC42ODA1MDAKK3ZuIC0wLjE4MzUwMCAwLjcxMTcwMCAtMC42NzgxMDAKK3ZuIC0wLjE4MzUwMCAwLjcxMTYwMCAtMC42NzgyMDAKK3ZuIDAuODE5OTAwIDAuMjA5NDAwIC0wLjUzMjgwMAordm4gLTAuNzEyNjAwIC0wLjIwNDYwMCAtMC42NzEwMDAKK3ZuIC0wLjcwNzMwMCAtMC4yMDE0MDAgLTAuNjc3NjAwCit2biAwLjc5MzAwMCAwLjIyNzgwMCAtMC41NjUwMDAKK3ZuIDAuNzkyNjAwIDAuMjI3NjAwIC0wLjU2NTYwMAordm4gMC4yMDg3MDAgMC44MDkzMDAgLTAuNTQ5MDAwCit2biAwLjIwODcwMCAwLjgwOTQwMCAtMC41NDkwMDAKK3ZuIDAuNTcyMTAwIDAuNjAxMjAwIC0wLjU1NzkwMAordm4gMC41NzMxMDAgMC42MDMyMDAgLTAuNTU0ODAwCit2biAtMC4xOTYxMDAgLTAuNzYwMjAwIC0wLjYxOTUwMAordm4gLTAuMTk2MTAwIC0wLjc2MDEwMCAtMC42MTk1MDAKK3ZuIC0wLjc0MjMwMCAtMC4yMTM1MDAgLTAuNjM1MTAwCit2biAtMC43NDE5MDAgLTAuMjEzMzAwIC0wLjYzNTcwMAordm4gLTAuNTM3MDAwIC0wLjU2NDAwMCAtMC42MjczMDAKK3ZuIDAuMTk2MTAwIDAuNzYwMjAwIC0wLjYxOTQwMAordm4gMC43NDIzMDAgMC4yMTM4MDAgLTAuNjM1MTAwCit2biAwLjc0MTgwMCAwLjIxMzQwMCAtMC42MzU4MDAKK3ZuIDAuNTM3MDAwIDAuNTY0MDAwIC0wLjYyNzMwMAordm4gMC41MzcwMDAgMC41NjQwMDAgLTAuNjI3MjAwCit2biAtMC4xOTYxMDAgLTAuNzYwMjAwIC0wLjYxOTQwMAordm4gLTAuMTk2MTAwIC0wLjc2MDMwMCAtMC42MTkzMDAKK3ZuIC0wLjc0MjIwMCAtMC4yMTQxMDAgLTAuNjM1MDAwCit2biAtMC43NDE3MDAgLTAuMjEzODAwIC0wLjYzNTcwMAordm4gLTAuNTM3MTAwIC0wLjU2NDAwMCAtMC42MjcyMDAKK3ZuIC0wLjUzNzEwMCAtMC41NjQwMDAgLTAuNjI3MzAwCit2biAwLjE5NjAwMCAwLjc2MDIwMCAtMC42MTk0MDAKK3ZuIDAuMTk2MTAwIDAuNzYwMTAwIC0wLjYxOTUwMAordm4gMC43NDIxMDAgMC4yMTQ0MDAgLTAuNjM1MDAwCit2biAwLjc0MTYwMCAwLjIxNDAwMCAtMC42MzU4MDAKK3ZuIDAuNTM3MTAwIDAuNTY0MDAwIC0wLjYyNzMwMAordm4gLTAuMTk2MDAwIC0wLjc2MDMwMCAtMC42MTkzMDAKK3ZuIC0wLjc0MjEwMCAtMC4yMTUyMDAgLTAuNjM0ODAwCit2biAtMC43NDE0MDAgLTAuMjE0NTAwIC0wLjYzNTkwMAordm4gLTAuNTM3MTAwIC0wLjU2NDEwMCAtMC42MjcyMDAKK3ZuIDAuMTk2MDAwIDAuNzYwMzAwIC0wLjYxOTMwMAordm4gMC43NDE5MDAgMC4yMTU3MDAgLTAuNjM0ODAwCit2biAwLjc0MTIwMCAwLjIxNDkwMCAtMC42MzU5MDAKK3ZuIDAuNTM3MTAwIDAuNTY0MTAwIC0wLjYyNzIwMAordm4gLTAuMTk2MDAwIC0wLjc2MDIwMCAtMC42MTk0MDAKK3ZuIC0wLjc0MTcwMCAtMC4yMTcyMDAgLTAuNjM0NjAwCit2biAtMC43NDA4MDAgLTAuMjE2MDAwIC0wLjYzNjEwMAordm4gMC4wMDAxMDAgMC4wMDAxMDAgLTEuMDAwMDAwCit2biAwLjE2NDMwMCAwLjYzNzQwMCAtMC43NTI4MDAKK3ZuIDAuMTY0MzAwIDAuNjM3MzAwIC0wLjc1MjkwMAordm4gMC42MTcwMDAgMC4xODIzMDAgLTAuNzY1NTAwCit2biAwLjYxNTgwMCAwLjE4MDMwMCAtMC43NjcwMDAKK3ZuIDAuNDQ4NTAwIDAuNDcxMDAwIC0wLjc1OTYwMAordm4gMC40NDg1MDAgMC40NzExMDAgLTAuNzU5NTAwCit2biAtMC41MDQ3MDAgLTAuNTMxMjAwIC0wLjY4MDUwMAordm4gLTAuNTA0NzAwIC0wLjUzMTIwMCAtMC42ODA2MDAKK3ZuIC0wLjE4MzUwMCAtMC43MTE3MDAgLTAuNjc4MTAwCit2biAtMC4xODM1MDAgLTAuNzExNjAwIC0wLjY3ODIwMAordm4gMC41MTYwMDAgMC41NTY5MDAgLTAuNjUwODAwCit2biAwLjU1MTkwMCAwLjU4MDIwMCAtMC41OTkwMDAKK3ZuIDAuMTkxMzAwIDAuODIyODAwIC0wLjUzNTEwMAordm4gMC4xOTE1MDAgMC43ODU5MDAgLTAuNTg3OTAwCit2biAtMC4xOTIxMDAgLTAuODI1NDAwIC0wLjUzMDgwMAordm4gLTAuMTkyMTAwIC0wLjgyNjEwMCAtMC41Mjk4MDAKK3ZuIC0wLjU3ODQwMCAtMC42MjA1MDAgLTAuNTI5NjAwCit2biAtMC41Njk4MDAgLTAuNjE0OTAwIC0wLjU0NTIwMAordm4gLTAuMTgyMjAwIC0wLjc4OTEwMCAtMC41ODY2MDAKK3ZuIC0wLjE4MDcwMCAtMC44MTUxMDAgLTAuNTUwNTAwCit2biAwLjAwMDAwMCAwLjg3MzYwMCAtMC40ODY3MDAKK3ZuIDAuMzI2NzAwIC0wLjAwMDEwMCAtMC45NDUxMDAKK3ZuIDAuMTk3MTAwIDAuODIyNTAwIC0wLjUzMzUwMAordm4gMC41NDEzMDAgMC41NjkzMDAgLTAuNjE4ODAwCit2biAwLjc5MzcwMCAtMC4yMzAzMDAgLTAuNTYzMDAwCit2biAwLjc4OTAwMCAtMC4yMjc0MDAgLTAuNTcwNzAwCit2biAwLjU5NDMwMCAwLjYwMzcwMCAtMC41MzEzMDAKK3ZuIDAuNTQ5NTAwIDAuNTc0NTAwIC0wLjYwNjYwMAordm4gLTAuNTYxMjAwIC0wLjU3MTEwMCAtMC41OTkxMDAKK3ZuIC0wLjU2MzgwMCAtMC41NzI3MDAgLTAuNTk1MTAwCit2biAwLjU3OTIwMCAwLjYxOTQwMCAtMC41MzAwMDAKK3ZuIDAuNTg1NDAwIDAuNjIzMzAwIC0wLjUxODUwMAordm4gLTAuNTk4NTAwIC0wLjYzNjAwMCAtMC40ODcxMDAKK3ZuIC0wLjYwMjYwMCAtMC42NDQzMDAgLTAuNDcwODAwCit2biAwLjU5NjAwMCAwLjU3NzgwMCAtMC41NTc2MDAKK3ZuIDAuNjE3NDAwIDAuNjMwNTAwIC0wLjQ3MDQwMAordm4gLTAuNTcyMzAwIC0wLjU1NDUwMCAtMC42MDQxMDAKK3ZuIC0wLjU3MjQwMCAtMC41NTQ5MDAgLTAuNjAzNzAwCit2biAwLjgyNTgwMCAwLjE0MTAwMCAtMC41NDYxMDAKK3ZuIDAuNzYwMTAwIDAuMTExMjAwIC0wLjY0MDMwMAordm4gLTAuNjk0ODAwIC0wLjE5NDUwMCAtMC42OTI0MDAKK3ZuIC0wLjgyMTEwMCAtMC4xOTI5MDAgLTAuNTM3MjAwCit2biAwLjU0NjMwMCAwLjU2NzEwMCAtMC42MTY0MDAKK3ZuIC0wLjg2OTYwMCAtMC4wMDAxMDAgLTAuNDkzNzAwCit2biAwLjcxMzAwMCAwLjIwMzAwMCAtMC42NzEyMDAKK3ZuIDAuNzA3OTAwIDAuMjAwMDAwIC0wLjY3NzQwMAordm4gLTAuNzkzNDAwIC0wLjIyNTkwMCAtMC41NjUyMDAKK3ZuIC0wLjc5MzIwMCAtMC4yMjU4MDAgLTAuNTY1NTAwCit2biAtMC4yMDg4MDAgLTAuODA5NTAwIC0wLjU0ODgwMAordm4gLTAuMjA4NzAwIC0wLjgwOTMwMCAtMC41NDkxMDAKK3ZuIC0wLjU3MjAwMCAtMC42MDEyMDAgLTAuNTU4MDAwCit2biAtMC41NzMxMDAgLTAuNjAzMjAwIC0wLjU1NDgwMAordm4gLTAuNTA3NzAwIC0wLjU0MDcwMCAtMC42NzA3MDAKK3ZuIC0wLjUyNjgwMCAtMC41NTMyMDAgLTAuNjQ1MzAwCit2biAtMC4xODExMDAgLTAuNzA2MjAwIC0wLjY4NDUwMAordm4gLTAuMTgxMDAwIC0wLjcwNDEwMCAtMC42ODY3MDAKK3ZuIDAuMTk2MTAwIDAuNzYwMzAwIC0wLjYxOTMwMAordm4gMC43NDI2MDAgMC4yMTE1MDAgLTAuNjM1NDAwCit2biAwLjc0MjYwMCAwLjIxMTQwMCAtMC42MzU1MDAKK3ZuIC0wLjc0MjYwMCAtMC4yMTE1MDAgLTAuNjM1NDAwCit2biAtMC43NDI2MDAgLTAuMjExNTAwIC0wLjYzNTUwMAordm4gLTAuNTM3MDAwIC0wLjU2NDAwMCAtMC42MjcyMDAKK3ZuIDAuNzQyNjAwIDAuMjExNTAwIC0wLjYzNTUwMAordm4gLTAuNzQyNjAwIC0wLjIxMTYwMCAtMC42MzU0MDAKK3ZuIC0wLjc0MjUwMCAtMC4yMTE1MDAgLTAuNjM1NTAwCit2biAtMC41MzcwMDAgLTAuNTY0MDAwIC0wLjYyNzQwMAordm4gMC43NDI2MDAgMC4yMTE3MDAgLTAuNjM1NDAwCit2biAwLjc0MjUwMCAwLjIxMTYwMCAtMC42MzU1MDAKK3ZuIC0wLjE5NjAwMCAtMC43NjAxMDAgLTAuNjE5NTAwCit2biAtMC43NDI2MDAgLTAuMjExODAwIC0wLjYzNTQwMAordm4gLTAuNzQyNTAwIC0wLjIxMTcwMCAtMC42MzU2MDAKK3ZuIC0wLjUzNzAwMCAtMC41NjM5MDAgLTAuNjI3NDAwCit2biAwLjE5NjAwMCAwLjc2MDEwMCAtMC42MTk1MDAKK3ZuIDAuNzQyNjAwIDAuMjExOTAwIC0wLjYzNTMwMAordm4gMC43NDI0MDAgMC4yMTE3MDAgLTAuNjM1NjAwCit2biAwLjUzNzAwMCAwLjU2MzkwMCAtMC42Mjc0MDAKK3ZuIC0wLjE2NDMwMCAtMC42MzczMDAgLTAuNzUyOTAwCit2biAtMC42MTc4MDAgLTAuMTc2NjAwIC0wLjc2NjMwMAordm4gLTAuNjE3NjAwIC0wLjE3NjMwMCAtMC43NjY1MDAKK3ZuIC0wLjQ0ODUwMCAtMC40NzEyMDAgLTAuNzU5NTAwCit2biAtMC40NDg1MDAgLTAuNDcxMDAwIC0wLjc1OTYwMAordm4gMC41MDQ3MDAgMC41MzEyMDAgLTAuNjgwNTAwCit2biAwLjUwNDcwMCAwLjUzMTIwMCAtMC42ODA2MDAKK3ZuIDAuMTgzNTAwIDAuNzExNzAwIC0wLjY3ODEwMAordm4gLTAuODE5OTAwIDAuMjA5NDAwIC0wLjUzMjkwMAordm4gMC43MDczMDAgLTAuMjAxNTAwIC0wLjY3NzYwMAordm4gMC43MTI3MDAgLTAuMjA0NzAwIC0wLjY3MTAwMAordm4gLTAuNzkyNjAwIDAuMjI3NjAwIC0wLjU2NTcwMAordm4gLTAuNzkzMDAwIDAuMjI3OTAwIC0wLjU2NTAwMAordm4gLTAuMjA4NzAwIDAuODA5NDAwIC0wLjU0OTAwMAordm4gLTAuMjA4NzAwIDAuODA5MzAwIC0wLjU0OTAwMAordm4gLTAuNTczMTAwIDAuNjAzMjAwIC0wLjU1NDcwMAordm4gLTAuNTcyMDAwIDAuNjAxMTAwIC0wLjU1ODAwMAordm4gMC43NDE4MDAgLTAuMjEzMjAwIC0wLjYzNTgwMAordm4gMC43NDIzMDAgLTAuMjEzNjAwIC0wLjYzNTEwMAordm4gLTAuNzQxODAwIDAuMjEzNDAwIC0wLjYzNTcwMAordm4gLTAuNzQyMzAwIDAuMjEzNzAwIC0wLjYzNTEwMAordm4gMC4xOTYxMDAgLTAuNzYwMzAwIC0wLjYxOTMwMAordm4gMC43NDE3MDAgLTAuMjEzODAwIC0wLjYzNTcwMAordm4gMC43NDIyMDAgLTAuMjE0MTAwIC0wLjYzNTAwMAordm4gMC41MzcxMDAgLTAuNTY0MDAwIC0wLjYyNzIwMAordm4gLTAuMTk2MTAwIDAuNzYwMTAwIC0wLjYxOTUwMAordm4gLTAuMTk2MDAwIDAuNzYwMjAwIC0wLjYxOTQwMAordm4gLTAuNzQxNjAwIDAuMjE0MDAwIC0wLjYzNTgwMAordm4gLTAuNzQyMjAwIDAuMjE0NDAwIC0wLjYzNTAwMAordm4gMC43NDE0MDAgLTAuMjE0NTAwIC0wLjYzNTgwMAordm4gMC43NDIwMDAgLTAuMjE1MTAwIC0wLjYzNDkwMAordm4gMC41MzcxMDAgLTAuNTY0MDAwIC0wLjYyNzMwMAordm4gLTAuMTk2MDAwIDAuNzYwMzAwIC0wLjYxOTMwMAordm4gLTAuNzQxMjAwIDAuMjE0OTAwIC0wLjYzNTkwMAordm4gLTAuNzQyMDAwIDAuMjE1NzAwIC0wLjYzNDgwMAordm4gMC43NDA4MDAgLTAuMjE1OTAwIC0wLjYzNjAwMAordm4gMC43NDE3MDAgLTAuMjE3MTAwIC0wLjYzNDYwMAordm4gLTAuMTY0MzAwIDAuNjM3MzAwIC0wLjc1MjkwMAordm4gLTAuMTY0MzAwIDAuNjM3NDAwIC0wLjc1MjgwMAordm4gLTAuNjE1ODAwIDAuMTgwMzAwIC0wLjc2NzAwMAordm4gLTAuNjE3MTAwIDAuMTgyNDAwIC0wLjc2NTUwMAordm4gLTAuNDQ4NTAwIDAuNDcxMDAwIC0wLjc1OTYwMAordm4gMC41MDQ3MDAgLTAuNTMxMjAwIC0wLjY4MDYwMAordm4gMC4xODM1MDAgLTAuNzExNjAwIC0wLjY3ODIwMAordm4gMC4xODM1MDAgLTAuNzExNzAwIC0wLjY3ODEwMAordm4gMC4wMDAxMDAgLTAuMDAwMTAwIC0xLjAwMDAwMAordm4gLTAuMDAwMjAwIDAuMDAwMTAwIC0xLjAwMDAwMAordm4gLTAuNTUxOTAwIDAuNTgwMjAwIC0wLjU5ODkwMAordm4gLTAuNTE2MTAwIDAuNTU2OTAwIC0wLjY1MDcwMAordm4gLTAuMTkxNTAwIDAuNzg1OTAwIC0wLjU4NzkwMAordm4gLTAuMTkxMzAwIDAuODIyODAwIC0wLjUzNTEwMAordm4gMC4xOTIxMDAgLTAuODI1NDAwIC0wLjUzMDgwMAordm4gMC4xOTIxMDAgLTAuODI2MTAwIC0wLjUyOTgwMAordm4gMC41Njk4MDAgLTAuNjE0OTAwIC0wLjU0NTIwMAordm4gMC41NzgzMDAgLTAuNjIwNDAwIC0wLjUyOTcwMAordm4gMC4xODA3MDAgLTAuODE1MTAwIC0wLjU1MDMwMAordm4gMC4xODIyMDAgLTAuNzg5MTAwIC0wLjU4NjcwMAordm4gLTAuMTYzODAwIDAuNzUxNzAwIC0wLjYzODgwMAordm4gLTAuMTgwNTAwIDAuNzgxNjAwIC0wLjU5NzIwMAordm4gLTAuMTk3MTAwIDAuODIyNDAwIC0wLjUzMzYwMAordm4gLTAuNTQxMzAwIDAuNTY5MzAwIC0wLjYxODgwMAordm4gLTAuNzg5MDAwIC0wLjIyNzQwMCAtMC41NzA3MDAKK3ZuIC0wLjc5MzkwMCAtMC4yMzA0MDAgLTAuNTYyNzAwCit2biAtMC41NDk1MDAgMC41NzQ1MDAgLTAuNjA2NjAwCit2biAtMC41OTQzMDAgMC42MDM3MDAgLTAuNTMxNDAwCit2biAwLjU2MzcwMCAtMC41NzI3MDAgLTAuNTk1MTAwCit2biAwLjU2MTIwMCAtMC41NzExMDAgLTAuNTk5MTAwCit2biAtMC41ODU0MDAgMC42MjMzMDAgLTAuNTE4NTAwCit2biAtMC41NzkzMDAgMC42MTk0MDAgLTAuNTI5OTAwCit2biAwLjYwMjYwMCAtMC42NDQzMDAgLTAuNDcwOTAwCit2biAwLjU5ODUwMCAtMC42MzYwMDAgLTAuNDg3MTAwCit2biAtMC42MTc0MDAgMC42MzA1MDAgLTAuNDcwNDAwCit2biAtMC41OTYwMDAgMC41Nzc3MDAgLTAuNTU3NzAwCit2biAwLjU3MjQwMCAtMC41NTQ4MDAgLTAuNjAzODAwCit2biAwLjU3MjMwMCAtMC41NTQ2MDAgLTAuNjA0MTAwCit2biAtMC44MjU4MDAgMC4xNDEwMDAgLTAuNTQ2MTAwCit2biAtMC43NjAxMDAgMC4xMTEyMDAgLTAuNjQwMjAwCit2biAwLjgyMTEwMCAtMC4xOTMwMDAgLTAuNTM3MjAwCit2biAwLjY5NDkwMCAtMC4xOTQ1MDAgLTAuNjkyMzAwCit2biAtMC4wMDAzMDAgMC4wMDAxMDAgLTEuMDAwMDAwCit2biAwLjk2MDQwMCAtMC4yNzg2MDAgMC4wMDAwMDAKK3ZuIDEuMDAwMDAwIC0wLjAwMDEwMCAtMC4wMDAyMDAKK3ZuIDEuMDAwMDAwIC0wLjAwMDAwMCAtMC4wMDAyMDAKK3ZuIDEuMDAwMDAwIDAuMDAwMjAwIC0wLjAwMDIwMAordm4gMS4wMDAwMDAgLTAuMDAwMjAwIC0wLjAwMDIwMAordm4gLTEuMDAwMDAwIC0wLjAwMDIwMCAtMC4wMDAxMDAKK3ZuIC0wLjk2MDQwMCAtMC4yNzg3MDAgLTAuMDAwMTAwCit2biAtMC4yNDg0MDAgLTAuOTY4NzAwIDAuMDAwMDAwCit2biAtMC41NDY0MDAgLTAuNTY3MDAwIC0wLjYxNjMwMAordm4gMC44Njk2MDAgMC4wMDAxMDAgLTAuNDkzODAwCit2biAtMC43MTI5MDAgLTAuMjAzMDAwIC0wLjY3MTMwMAordm4gLTAuNzA3OTAwIC0wLjIwMDAwMCAtMC42Nzc0MDAKK3ZuIDAuNzkzNDAwIDAuMjI1OTAwIC0wLjU2NTMwMAordm4gMC43OTMzMDAgMC4yMjU4MDAgLTAuNTY1NDAwCit2biAwLjIwODgwMCAwLjgwOTUwMCAtMC41NDg4MDAKK3ZuIDAuMjA4NzAwIDAuODA5MzAwIC0wLjU0OTEwMAordm4gMC41NzIxMDAgMC42MDEyMDAgLTAuNTU4MDAwCit2biAwLjU3MzAwMCAwLjYwMzEwMCAtMC41NTQ4MDAKK3ZuIDAuNTA3NzAwIDAuNTQwNzAwIC0wLjY3MDgwMAordm4gMC41MjY4MDAgMC41NTMyMDAgLTAuNjQ1NDAwCit2biAwLjE4MTAwMCAwLjcwNjIwMCAtMC42ODQ1MDAKK3ZuIDAuMTgxMDAwIDAuNzA0MDAwIC0wLjY4NjgwMAordm4gLTAuNzQyNjAwIC0wLjIxMTQwMCAtMC42MzU1MDAKK3ZuIDAuNTM3MTAwIDAuNTY0MDAwIC0wLjYyNzIwMAordm4gLTAuNTM3MDAwIC0wLjU2NDEwMCAtMC42MjcyMDAKK3ZuIDAuNzQyNjAwIDAuMjExNjAwIC0wLjYzNTQwMAordm4gMC43NDI1MDAgMC4yMTE1MDAgLTAuNjM1NTAwCit2biAtMC43NDI2MDAgLTAuMjExNzAwIC0wLjYzNTQwMAordm4gLTAuNzQyNTAwIC0wLjIxMTYwMCAtMC42MzU2MDAKK3ZuIC0wLjUzNzAwMCAtMC41NjQxMDAgLTAuNjI3MzAwCit2biAwLjc0MjYwMCAwLjIxMTgwMCAtMC42MzU0MDAKK3ZuIDAuNzQyNTAwIDAuMjExNzAwIC0wLjYzNTUwMAordm4gMC41MzcwMDAgMC41NjM5MDAgLTAuNjI3MzAwCit2biAtMC43NDI1MDAgLTAuMjEyMDAwIC0wLjYzNTUwMAordm4gLTAuNzQyNDAwIC0wLjIxMTgwMCAtMC42MzU2MDAKK3ZuIDAuMTY0MjAwIDAuNjM3NDAwIC0wLjc1MjgwMAordm4gMC4xNjQzMDAgMC42MzcyMDAgLTAuNzUyOTAwCit2biAwLjYxNzcwMCAwLjE3NjUwMCAtMC43NjY0MDAKK3ZuIDAuNjE3NjAwIDAuMTc2MzAwIC0wLjc2NjUwMAordm4gMC40NDg1MDAgMC40NzExMDAgLTAuNzU5NjAwCit2biAtMC4wMDAxMDAgLTAuMDAwMTAwIC0xLjAwMDAwMAordm4gLTAuNTA0NjAwIC0wLjUzMTIwMCAtMC42ODA2MDAKK3ZuIDAuODE5OTAwIC0wLjIwOTQwMCAtMC41MzI4MDAKK3ZuIC0wLjcwNzMwMCAwLjIwMTQwMCAtMC42Nzc2MDAKK3ZuIC0wLjcxMjYwMCAwLjIwNDYwMCAtMC42NzEwMDAKK3ZuIDAuNzkyNjAwIC0wLjIyNzYwMCAtMC41NjU2MDAKK3ZuIDAuNzkzMDAwIC0wLjIyNzgwMCAtMC41NjUwMDAKK3ZuIDAuMjA4ODAwIC0wLjgwOTQwMCAtMC41NDg5MDAKK3ZuIDAuNTczMDAwIC0wLjYwMzIwMCAtMC41NTQ4MDAKK3ZuIC0wLjc0MTkwMCAwLjIxMzMwMCAtMC42MzU3MDAKK3ZuIC0wLjc0MjMwMCAwLjIxMzUwMCAtMC42MzUxMDAKK3ZuIDAuNzQxODAwIC0wLjIxMzQwMCAtMC42MzU4MDAKK3ZuIDAuNzQyMzAwIC0wLjIxMzcwMCAtMC42MzUxMDAKK3ZuIC0wLjc0MTcwMCAwLjIxMzgwMCAtMC42MzU3MDAKK3ZuIC0wLjc0MjIwMCAwLjIxNDEwMCAtMC42MzUwMDAKK3ZuIC0wLjUzNzEwMCAwLjU2NDEwMCAtMC42MjcyMDAKK3ZuIDAuNzQxNjAwIC0wLjIxNDAwMCAtMC42MzU4MDAKK3ZuIDAuNzQyMTAwIC0wLjIxNDQwMCAtMC42MzUwMDAKK3ZuIC0wLjc0MTQwMCAwLjIxNDUwMCAtMC42MzU5MDAKK3ZuIC0wLjc0MjEwMCAwLjIxNTIwMCAtMC42MzQ5MDAKK3ZuIDAuNzQxMzAwIC0wLjIxNDkwMCAtMC42MzU5MDAKK3ZuIDAuNzQxOTAwIC0wLjIxNTYwMCAtMC42MzQ4MDAKK3ZuIDAuNTM3MTAwIC0wLjU2NDEwMCAtMC42MjcyMDAKK3ZuIC0wLjc0MDcwMCAwLjIxNjAwMCAtMC42MzYxMDAKK3ZuIC0wLjc0MTYwMCAwLjIxNzEwMCAtMC42MzQ3MDAKK3ZuIC0wLjUzNzAwMCAwLjU2NDAwMCAtMC42Mjc0MDAKK3ZuIDAuMTY0MzAwIC0wLjYzNzIwMCAtMC43NTMwMDAKK3ZuIDAuMTY0MjAwIC0wLjYzNzMwMCAtMC43NTI5MDAKK3ZuIDAuNjE1ODAwIC0wLjE4MDMwMCAtMC43NjcwMDAKK3ZuIDAuNjE3MDAwIC0wLjE4MjMwMCAtMC43NjU1MDAKK3ZuIC0wLjUwNDcwMCAwLjUzMTIwMCAtMC42ODA1MDAKK3ZuIDAuNTUxOTAwIC0wLjU4MDIwMCAtMC41OTkwMDAKK3ZuIDAuNTE2MTAwIC0wLjU1NjkwMCAtMC42NTA4MDAKK3ZuIDAuMTkxNTAwIC0wLjc4NTgwMCAtMC41ODgwMDAKK3ZuIDAuMTkxMzAwIC0wLjgyMjkwMCAtMC41MzUxMDAKK3ZuIC0wLjE5MjEwMCAwLjgyNjEwMCAtMC41Mjk4MDAKK3ZuIC0wLjE5MjEwMCAwLjgyNTQwMCAtMC41MzA4MDAKK3ZuIC0wLjU2OTgwMCAwLjYxNDkwMCAtMC41NDUxMDAKK3ZuIC0wLjU3ODQwMCAwLjYyMDUwMCAtMC41Mjk2MDAKK3ZuIC0wLjE4MDcwMCAwLjgxNTAwMCAtMC41NTA2MDAKK3ZuIC0wLjE4MjIwMCAwLjc4OTAwMCAtMC41ODY4MDAKK3ZuIDAuMTY0NTAwIC0wLjc1MjgwMCAtMC42Mzc0MDAKK3ZuIDAuMTgwNTAwIC0wLjc4MTUwMCAtMC41OTcyMDAKK3ZuIDAuMTk3MjAwIC0wLjgyMjMwMCAtMC41MzM3MDAKK3ZuIDAuNTQxMzAwIC0wLjU2OTIwMCAtMC42MTg4MDAKK3ZuIDAuNzg5MTAwIDAuMjI3NDAwIC0wLjU3MDcwMAordm4gMC43OTM3MDAgMC4yMzAzMDAgLTAuNTYzMDAwCit2biAwLjU0OTUwMCAtMC41NzQ1MDAgLTAuNjA2NzAwCit2biAwLjU5NDMwMCAtMC42MDM4MDAgLTAuNTMxMzAwCit2biAtMC41NjM3MDAgMC41NzI3MDAgLTAuNTk1MTAwCit2biAtMC41NjEyMDAgMC41NzEwMDAgLTAuNTk5MTAwCit2biAwLjU4NTQwMCAtMC42MjMyMDAgLTAuNTE4NjAwCit2biAwLjU3OTMwMCAtMC42MTk0MDAgLTAuNTI5OTAwCit2biAtMC42MDI2MDAgMC42NDQzMDAgLTAuNDcwODAwCit2biAtMC41OTg2MDAgMC42MzYwMDAgLTAuNDg3MTAwCit2biAwLjYxNzUwMCAtMC42MzA1MDAgLTAuNDcwMzAwCit2biAwLjU5NjAwMCAtMC41Nzc3MDAgLTAuNTU3NzAwCit2biAtMC41NzI0MDAgMC41NTQ4MDAgLTAuNjAzNzAwCit2biAtMC41NzIzMDAgMC41NTQ1MDAgLTAuNjA0MTAwCit2biAwLjgyNTgwMCAtMC4xNDEwMDAgLTAuNTQ2MTAwCit2biAwLjc2MDEwMCAtMC4xMTEyMDAgLTAuNjQwMzAwCit2biAtMC44MjExMDAgMC4xOTI5MDAgLTAuNTM3MjAwCit2biAtMC42OTQ4MDAgMC4xOTQ1MDAgLTAuNjkyNDAwCit2biAtMC44Njk2MDAgMC4wMDAxMDAgLTAuNDkzODAwCit2biAwLjU0NjQwMCAtMC41NjcxMDAgLTAuNjE2NDAwCit2biAwLjcwNzkwMCAtMC4yMDAwMDAgLTAuNjc3NDAwCit2biAwLjcxMjkwMCAtMC4yMDMwMDAgLTAuNjcxMjAwCit2biAtMC43OTMyMDAgMC4yMjU4MDAgLTAuNTY1NTAwCit2biAtMC43OTM0MDAgMC4yMjU5MDAgLTAuNTY1MzAwCit2biAtMC4yMDg3MDAgMC44MDkzMDAgLTAuNTQ5MTAwCit2biAtMC4yMDg4MDAgMC44MDk1MDAgLTAuNTQ4ODAwCit2biAtMC41NzMxMDAgMC42MDMyMDAgLTAuNTU0ODAwCit2biAtMC41MjY4MDAgMC41NTMyMDAgLTAuNjQ1MzAwCit2biAtMC41MDc4MDAgMC41NDA3MDAgLTAuNjcwNjAwCit2biAtMC4xODEwMDAgMC43MDQwMDAgLTAuNjg2ODAwCit2biAtMC4xODEwMDAgMC43MDYyMDAgLTAuNjg0NTAwCit2biAwLjc0MjUwMCAtMC4yMTE0MDAgLTAuNjM1NjAwCit2biAtMC43NDI1MDAgMC4yMTE1MDAgLTAuNjM1NTAwCit2biAtMC43NDI2MDAgMC4yMTE2MDAgLTAuNjM1NDAwCit2biAwLjc0MjUwMCAtMC4yMTE2MDAgLTAuNjM1NTAwCit2biAwLjc0MjYwMCAtMC4yMTE3MDAgLTAuNjM1NDAwCit2biAwLjUzNzAwMCAtMC41NjQwMDAgLTAuNjI3MjAwCit2biAtMC43NDI2MDAgMC4yMTE4MDAgLTAuNjM1NDAwCit2biAtMC41MzcwMDAgMC41NjQwMDAgLTAuNjI3MjAwCit2biAwLjc0MjQwMCAtMC4yMTE4MDAgLTAuNjM1NjAwCit2biAwLjc0MjYwMCAtMC4yMTE5MDAgLTAuNjM1MzAwCit2biAtMC4xNjQzMDAgMC42Mzc0MDAgLTAuNzUyOTAwCit2biAtMC42MTc2MDAgMC4xNzYzMDAgLTAuNzY2NTAwCit2biAtMC42MTc4MDAgMC4xNzY2MDAgLTAuNzY2MzAwCit2biAtMC40NDg1MDAgMC40NzExMDAgLTAuNzU5NjAwCit2biAtMC44MTk5MDAgLTAuMjA5NDAwIC0wLjUzMjgwMAordm4gMC43MTI3MDAgMC4yMDQ3MDAgLTAuNjcwOTAwCit2biAwLjcwNzMwMCAwLjIwMTUwMCAtMC42Nzc2MDAKK3ZuIC0wLjc5MzAwMCAtMC4yMjc5MDAgLTAuNTY1MDAwCit2biAtMC43OTI2MDAgLTAuMjI3NjAwIC0wLjU2NTcwMAordm4gLTAuMjA4ODAwIC0wLjgwOTQwMCAtMC41NDg5MDAKK3ZuIC0wLjU3MzAwMCAtMC42MDMyMDAgLTAuNTU0ODAwCit2biAwLjc0MjMwMCAwLjIxMzYwMCAtMC42MzUyMDAKK3ZuIDAuNzQxODAwIDAuMjEzMzAwIC0wLjYzNTgwMAordm4gLTAuNzQyMzAwIC0wLjIxMzcwMCAtMC42MzUxMDAKK3ZuIC0wLjc0MTkwMCAtMC4yMTM0MDAgLTAuNjM1NzAwCit2biAwLjc0MjIwMCAwLjIxNDEwMCAtMC42MzUxMDAKK3ZuIDAuNzQxNzAwIDAuMjEzODAwIC0wLjYzNTcwMAordm4gLTAuNzQyMTAwIC0wLjIxNDQwMCAtMC42MzUwMDAKK3ZuIC0wLjc0MTYwMCAtMC4yMTQwMDAgLTAuNjM1ODAwCit2biAwLjc0MjAwMCAwLjIxNTEwMCAtMC42MzQ5MDAKK3ZuIDAuNzQxNDAwIDAuMjE0NjAwIC0wLjYzNTgwMAordm4gLTAuNzQyMDAwIC0wLjIxNTYwMCAtMC42MzQ4MDAKK3ZuIC0wLjc0MTMwMCAtMC4yMTQ5MDAgLTAuNjM1OTAwCit2biAwLjc0MTcwMCAwLjIxNzEwMCAtMC42MzQ2MDAKK3ZuIDAuNzQwODAwIDAuMjE1OTAwIC0wLjYzNjEwMAordm4gLTAuMTY0MzAwIC0wLjYzNzQwMCAtMC43NTI4MDAKK3ZuIC0wLjE2NDQwMCAtMC42MzcyMDAgLTAuNzUzMDAwCit2biAtMC42MTcxMDAgLTAuMTgyNDAwIC0wLjc2NTQwMAordm4gLTAuNjE1ODAwIC0wLjE4MDIwMCAtMC43NjcwMDAKK3ZuIC0wLjQ0ODYwMCAtMC40NzEwMDAgLTAuNzU5NjAwCit2biAwLjAwMDEwMCAwLjAwMDIwMCAtMS4wMDAwMDAKK3ZuIDAuMTgzNTAwIDAuNzExNjAwIC0wLjY3ODIwMAordm4gLTAuMDAwMjAwIC0wLjAwMDEwMCAtMS4wMDAwMDAKK3ZuIC0wLjUxNjEwMCAtMC41NTY5MDAgLTAuNjUwODAwCit2biAtMC41NTE5MDAgLTAuNTgwMjAwIC0wLjU5OTAwMAordm4gLTAuMTkxMzAwIC0wLjgyMjkwMCAtMC41MzUxMDAKK3ZuIC0wLjE5MTUwMCAtMC43ODU5MDAgLTAuNTg4MDAwCit2biAwLjE5MjAwMCAwLjgyNTQwMCAtMC41MzA5MDAKK3ZuIDAuNTc4NDAwIDAuNjIwNTAwIC0wLjUyOTYwMAordm4gMC41Njk4MDAgMC42MTQ5MDAgLTAuNTQ1MTAwCit2biAwLjE4MjIwMCAwLjc4OTAwMCAtMC41ODY4MDAKK3ZuIDAuMTgwNzAwIDAuODE1MTAwIC0wLjU1MDQwMAordm4gLTAuMDQ1MDAwIC0wLjgxNzMwMCAtMC41NzQ1MDAKK3ZuIC0wLjMyNjcwMCAwLjAwMDAwMCAtMC45NDUxMDAKK3ZuIC0wLjE5NzIwMCAtMC44MjI0MDAgLTAuNTMzNzAwCit2biAtMC4wMDAxMDAgLTAuMDAwMzAwIC0xLjAwMDAwMAordm4gLTAuNTQxNDAwIC0wLjU2OTIwMCAtMC42MTg4MDAKK3ZuIC0wLjc5MzkwMCAwLjIzMDQwMCAtMC41NjI3MDAKK3ZuIC0wLjc4OTAwMCAwLjIyNzQwMCAtMC41NzA3MDAKK3ZuIC0wLjU5NDMwMCAtMC42MDM3MDAgLTAuNTMxMzAwCit2biAtMC41NDk1MDAgLTAuNTc0NTAwIC0wLjYwNjYwMAordm4gMC41NjEyMDAgMC41NzExMDAgLTAuNTk5MTAwCit2biAwLjU2MzcwMCAwLjU3MjcwMCAtMC41OTUyMDAKK3ZuIC0wLjU3OTMwMCAtMC42MTk0MDAgLTAuNTI5OTAwCit2biAtMC41ODU0MDAgLTAuNjIzMjAwIC0wLjUxODYwMAordm4gMC41OTg1MDAgMC42MzYwMDAgLTAuNDg3MTAwCit2biAwLjYwMjYwMCAwLjY0NDMwMCAtMC40NzA4MDAKK3ZuIC0wLjU5NjAwMCAtMC41Nzc2MDAgLTAuNTU3NzAwCit2biAtMC42MTc1MDAgLTAuNjMwNTAwIC0wLjQ3MDMwMAordm4gMC41NzIzMDAgMC41NTQ1MDAgLTAuNjA0MTAwCit2biAwLjU3MjQwMCAwLjU1NDgwMCAtMC42MDM4MDAKK3ZuIC0wLjgyNTgwMCAtMC4xNDEwMDAgLTAuNTQ2MDAwCit2biAtMC43NjAxMDAgLTAuMTExMjAwIC0wLjY0MDMwMAordm4gMC42OTQ4MDAgMC4xOTQ1MDAgLTAuNjkyNDAwCit2biAwLjgyMTEwMCAwLjE5MjkwMCAtMC41MzcyMDAKK3ZuIC0wLjAwMDMwMCAtMC4wMDAxMDAgLTEuMDAwMDAwCit2biAwLjk2MDQwMCAwLjI3ODYwMCAwLjAwMDAwMAordm4gMS4wMDAwMDAgMC4wMDAxMDAgLTAuMDAwMjAwCit2biAtMC4wNzc3MDAgLTAuMTU5NzAwIC0wLjk4NDEwMAordm4gMC4xODA0MDAgMC43ODE2MDAgLTAuNTk3MjAwCit2biAwLjE2NDcwMCAwLjc1MzQwMCAtMC42MzY1MDAKK3ZuIC0wLjMyNjYwMCAwLjAwMDAwMCAtMC45NDUyMDAKK3ZuIDAuMDAwMTAwIDAuODczNzAwIC0wLjQ4NjUwMAordm4gLTAuMTgwNTAwIC0wLjc4MTUwMCAtMC41OTcyMDAKK3ZuIC0wLjE0OTkwMCAtMC43MjU2MDAgLTAuNjcxNjAwCit2biAwLjMyNjYwMCAwLjAwMDAwMCAtMC45NDUyMDAKK3ZuIDAuMDAxODAwIC0wLjg3NjQwMCAtMC40ODE1MDAKK3ZuIC0wLjA0NTQwMCAtMC4xOTUxMDAgLTAuOTc5NzAwCit2biAwLjAxNDAwMCAtMC4wMDkzMDAgLTAuOTk5OTAwCit2biAwLjE5MjEwMCAwLjgyNTQwMCAtMC41MzA5MDAKK3ZuIDAuMTkyMTAwIDAuODI2MTAwIC0wLjUyOTgwMAordm4gLTAuMzE2NjAwIDAuMzMyNTAwIC0wLjg4ODQwMAordm4gLTAuMTE2NDAwIDAuNDUxOTAwIC0wLjg4NDQwMAordm4gMC4xMTY1MDAgMC40NTE5MDAgLTAuODg0NDAwCit2biAwLjMxNjYwMCAwLjMzMjUwMCAtMC44ODg0MDAKK3ZuIDAuNDM0MDAwIDAuMTIzNzAwIC0wLjg5MjQwMAordm4gMC40MzQxMDAgLTAuMTIzNTAwIC0wLjg5MjQwMAordm4gMC4zMTY2MDAgLTAuMzMyNTAwIC0wLjg4ODQwMAordm4gMC4xMTY2MDAgLTAuNDUxODAwIC0wLjg4NDUwMAordm4gMC4xMTY3MDAgLTAuNDUxOTAwIC0wLjg4NDQwMAordm4gLTAuMTE2NTAwIC0wLjQ1MTgwMCAtMC44ODQ1MDAKK3ZuIC0wLjMxNjYwMCAtMC4zMzI1MDAgLTAuODg4NDAwCit2biAtMC40MzQyMDAgLTAuMTIzMzAwIC0wLjg5MjQwMAordm4gLTAuNDM0MTAwIDAuMTIzNTAwIC0wLjg5MjQwMAordm4gLTAuMTI3NjAwIDAuMTM0MDAwIC0wLjk4MjcwMAordm4gLTAuMTI3NjAwIDAuMTMzOTAwIC0wLjk4MjcwMAordm4gLTAuMDQ3MTAwIDAuMTgyNzAwIC0wLjk4MjAwMAordm4gLTAuMDQ3MDAwIDAuMTgyODAwIC0wLjk4MjAwMAordm4gMC4wNDcxMDAgMC4xODI3MDAgLTAuOTgyMDAwCit2biAwLjEyNzUwMCAwLjEzNDAwMCAtMC45ODI3MDAKK3ZuIDAuMTc0MjAwIDAuMDQ5NzAwIC0wLjk4MzUwMAordm4gMC4xNzQyMDAgLTAuMDQ5NjAwIC0wLjk4MzUwMAordm4gMC4xMjc1MDAgLTAuMTMzOTAwIC0wLjk4MjcwMAordm4gMC4wNDcyMDAgLTAuMTgyNzAwIC0wLjk4MjAwMAordm4gLTAuMDQ3MTAwIC0wLjE4MjcwMCAtMC45ODIwMDAKK3ZuIC0wLjEyNzYwMCAtMC4xMzM5MDAgLTAuOTgyNzAwCit2biAtMC4xNzQzMDAgLTAuMDQ5NTAwIC0wLjk4MzUwMAordm4gLTAuMTc0MjAwIDAuMDQ5NjAwIC0wLjk4MzUwMAordm4gMC4xMTQ2MDAgLTAuMTIwNDAwIC0wLjk4NjEwMAordm4gMC4wNDIzMDAgLTAuMTY0MzAwIC0wLjk4NTUwMAordm4gMC4wNDIzMDAgLTAuMTY0MjAwIC0wLjk4NTUwMAordm4gLTAuMDQyNDAwIC0wLjE2NDIwMCAtMC45ODU1MDAKK3ZuIC0wLjExNDYwMCAtMC4xMjA0MDAgLTAuOTg2MTAwCit2biAtMC4xNTY1MDAgLTAuMDQ0NjAwIC0wLjk4NjcwMAordm4gLTAuMTU2NDAwIC0wLjA0NDYwMCAtMC45ODY3MDAKK3ZuIC0wLjE1NjQwMCAwLjA0NDUwMCAtMC45ODY3MDAKK3ZuIC0wLjE1NjYwMCAwLjA0NDUwMCAtMC45ODY3MDAKK3ZuIC0wLjExNDYwMCAwLjEyMDQwMCAtMC45ODYxMDAKK3ZuIC0wLjExNDcwMCAwLjEyMDQwMCAtMC45ODYxMDAKK3ZuIC0wLjA0MjQwMCAwLjE2NDMwMCAtMC45ODU1MDAKK3ZuIC0wLjA0MjQwMCAwLjE2NDIwMCAtMC45ODU1MDAKK3ZuIDAuMDQyNDAwIDAuMTY0MjAwIC0wLjk4NTUwMAordm4gMC4xMTQ2MDAgMC4xMjA0MDAgLTAuOTg2MTAwCit2biAwLjE1NjYwMCAwLjA0NDUwMCAtMC45ODY3MDAKK3ZuIDAuMTU2NjAwIC0wLjA0NDUwMCAtMC45ODY3MDAKK3ZuIC0wLjExNjQwMCAtMC40NTE5MDAgLTAuODg0NDAwCit2biAtMC4xMTY0MDAgLTAuNDUxOTAwIC0wLjg4NDUwMAordm4gMC4xMTY1MDAgLTAuNDUxODAwIC0wLjg4NDUwMAordm4gMC40MzQxMDAgLTAuMTIzNzAwIC0wLjg5MjMwMAordm4gMC40MzQxMDAgMC4xMjM1MDAgLTAuODkyNDAwCit2biAwLjQzNDEwMCAwLjEyMzUwMCAtMC44OTIzMDAKK3ZuIDAuMTE2NzAwIDAuNDUxODAwIC0wLjg4NDQwMAordm4gMC4xMTY3MDAgMC40NTE4MDAgLTAuODg0NTAwCit2biAtMC4xMTY1MDAgMC40NTE5MDAgLTAuODg0NDAwCit2biAtMC40MzQyMDAgMC4xMjMzMDAgLTAuODkyNDAwCit2biAtMC40MzQxMDAgLTAuMTIzNTAwIC0wLjg5MjQwMAordm4gLTAuMTI3NjAwIC0wLjEzNDAwMCAtMC45ODI3MDAKK3ZuIDAuMDQ3MTAwIC0wLjE4MjcwMCAtMC45ODIwMDAKK3ZuIDAuMTI3NTAwIC0wLjEzNDAwMCAtMC45ODI3MDAKK3ZuIDAuMTc0MjAwIC0wLjA0OTcwMCAtMC45ODM1MDAKK3ZuIDAuMTc0MjAwIDAuMDQ5NjAwIC0wLjk4MzUwMAordm4gMC4xMjc2MDAgMC4xMzQwMDAgLTAuOTgyNzAwCit2biAwLjA0NzIwMCAwLjE4MjcwMCAtMC45ODIwMDAKK3ZuIC0wLjE3NDMwMCAwLjA0OTUwMCAtMC45ODM1MDAKK3ZuIC0wLjE3NDIwMCAtMC4wNDk2MDAgLTAuOTgzNTAwCit2biAtMC4xNzQzMDAgLTAuMDQ5NjAwIC0wLjk4MzUwMAordm4gMC4wNDIzMDAgMC4xNjQyMDAgLTAuOTg1NTAwCit2biAtMC4xNTY1MDAgMC4wNDQ2MDAgLTAuOTg2NzAwCit2biAtMC4xNTY2MDAgLTAuMDQ0NTAwIC0wLjk4NjcwMAordm4gLTAuMTU2NTAwIC0wLjA0NDUwMCAtMC45ODY3MDAKK3ZuIDAuMDQyNDAwIC0wLjE2NDIwMCAtMC45ODU1MDAKK3ZuIDAuMDQyNDAwIC0wLjE2NDMwMCAtMC45ODU1MDAKK3ZuIC0wLjM4ODYwMCAtMC45MjE0MDAgMC4wMDAwMDAKK3ZuIDAuMzg4NjAwIC0wLjkyMTQwMCAwLjAwMDAwMAordm4gMC45MjQ2MDAgLTAuMzgxMDAwIDAuMDAwMDAwCit2biAwLjkyNDcwMCAwLjM4MDcwMCAwLjAwMDAwMAordm4gMC4zODg2MDAgMC45MjE0MDAgMC4wMDAwMDAKK3ZuIC0wLjM4ODYwMCAwLjkyMTQwMCAwLjAwMDAwMAordm4gLTAuOTI0ODAwIDAuMzgwNTAwIDAuMDAwMDAwCit2biAtMC45MjQ2MDAgLTAuMzgwODAwIDAuMDAwMDAwCit2biAwLjMxNzcwMCAwLjc1MjYwMCAwLjU3NjcwMAordm4gMC43NTI2MDAgMC4zMTc3MDAgMC41NzY3MDAKK3ZuIDAuNzUyNjAwIC0wLjMxNzcwMCAwLjU3NjcwMAordm4gMC4zMTc3MDAgLTAuNzUyNjAwIDAuNTc2NzAwCit2biAtMC4zMTc3MDAgLTAuNzUyNjAwIDAuNTc2NzAwCit2biAtMC43NTI2MDAgLTAuMzE3NzAwIDAuNTc2NzAwCit2biAtMC43NTI2MDAgMC4zMTc3MDAgMC41NzY3MDAKK3ZuIC0wLjMxNzcwMCAwLjc1MjcwMCAwLjU3NjcwMAordm4gLTAuMzE3NzAwIDAuNzUyNjAwIDAuNTc2NzAwCit2biAtMC4zMTc3MDAgMC43NTI3MDAgMC41NzY2MDAKK3ZuIDAuMzE3NzAwIDAuNzUyNzAwIDAuNTc2NzAwCit2biAwLjc1MjcwMCAwLjMxNzcwMCAwLjU3NjcwMAordm4gMC43NTI3MDAgLTAuMzE3NzAwIDAuNTc2NzAwCit2biAwLjMxNzcwMCAtMC43NTI3MDAgMC41NzY3MDAKK3ZuIC0wLjM4MzAwMCAtMC45MjM4MDAgMC4wMDAwMDAKK3ZuIDAuMzgzMDAwIC0wLjkyMzgwMCAwLjAwMDAwMAordm4gMC45MjM4MDAgLTAuMzgzMDAwIDAuMDAwMDAwCit2biAwLjkyMzgwMCAwLjM4MzAwMCAwLjAwMDAwMAordm4gMC4zODMwMDAgMC45MjM4MDAgMC4wMDAwMDAKK3ZuIC0wLjM4MzAwMCAwLjkyMzgwMCAwLjAwMDAwMAordm4gLTAuOTIzNzAwIDAuMzgzMjAwIDAuMDAwMDAwCit2biAtMC45MjM4MDAgLTAuMzgzMDAwIDAuMDAwMDAwCit2biAtMC4yNzA4MDAgLTAuNjUzMjAwIDAuNzA3MTAwCit2biAwLjI3MDgwMCAtMC42NTMxMDAgMC43MDcxMDAKK3ZuIDAuMjcwODAwIC0wLjY1MzIwMCAwLjcwNzEwMAordm4gMC42NTMyMDAgLTAuMjcwODAwIDAuNzA3MTAwCit2biAwLjY1MzIwMCAwLjI3MDgwMCAwLjcwNzEwMAordm4gMC4yNzA4MDAgMC42NTMyMDAgMC43MDcyMDAKK3ZuIDAuMjcwODAwIDAuNjUzMjAwIDAuNzA3MTAwCit2biAtMC4yNzA4MDAgMC42NTMyMDAgMC43MDcxMDAKK3ZuIC0wLjY1MzEwMCAwLjI3MTAwMCAwLjcwNzEwMAordm4gLTAuNjUzMTAwIDAuMjcwOTAwIDAuNzA3MTAwCit2biAtMC42NTMyMDAgLTAuMjcwODAwIDAuNzA3MTAwCit2biAtMC4yNzA4MDAgLTAuNjUzMTAwIDAuNzA3MjAwCit2biAtMC4yNzA3MDAgLTAuNjUzMDAwIDAuNzA3NDAwCit2biAtMC4yNzA5MDAgLTAuNjUzNDAwIDAuNzA2OTAwCit2biAtMC4yNzA5MDAgLTAuNjUzNTAwIDAuNzA2ODAwCit2biAwLjI3MDgwMCAtMC42NTMxMDAgMC43MDcyMDAKK3ZuIDAuMjcwNzAwIC0wLjY1MzAwMCAwLjcwNzMwMAordm4gMC4yNzA5MDAgLTAuNjUzNDAwIDAuNzA2OTAwCit2biAwLjY1MzEwMCAtMC4yNzA4MDAgMC43MDcyMDAKK3ZuIDAuNjUzMzAwIC0wLjI3MDkwMCAwLjcwNzAwMAordm4gMC42NTMzMDAgLTAuMjcwOTAwIDAuNzA2OTAwCit2biAwLjY1MzMwMCAwLjI3MDgwMCAwLjcwNzAwMAordm4gMC42NTMwMDAgMC4yNzA3MDAgMC43MDczMDAKK3ZuIDAuNjUzMTAwIDAuMjcwODAwIDAuNzA3MjAwCit2biAwLjI3MDgwMCAwLjY1MzEwMCAwLjcwNzIwMAordm4gMC4yNzA5MDAgMC42NTM0MDAgMC43MDY5MDAKK3ZuIDAuMjcwNzAwIDAuNjUzMDAwIDAuNzA3MzAwCit2biAtMC4yNzA4MDAgMC42NTMxMDAgMC43MDcyMDAKK3ZuIC0wLjI3MTAwMCAwLjY1MzcwMCAwLjcwNjUwMAordm4gLTAuMjcwODAwIDAuNjUzMDAwIDAuNzA3MzAwCit2biAtMC42NTMyMDAgMC4yNzEwMDAgMC43MDcwMDAKK3ZuIC0wLjY1MzAwMCAwLjI3MDkwMCAwLjcwNzIwMAordm4gLTAuNjUzMjAwIDAuMjcxMDAwIDAuNzA3MTAwCit2biAtMC42NTMzMDAgLTAuMjcwODAwIDAuNzA3MDAwCit2biAtMC42NTM0MDAgLTAuMjcwOTAwIDAuNzA2OTAwCit2biAwLjI0MTEwMCAwLjU4MTUwMCAwLjc3NzAwMAordm4gMC4yNDExMDAgMC41ODE0MDAgMC43NzcxMDAKK3ZuIC0wLjI0MTEwMCAwLjU4MTUwMCAwLjc3NzAwMAordm4gLTAuNTgxNDAwIDAuMjQxMTAwIDAuNzc3MTAwCit2biAtMC41ODE1MDAgMC4yNDExMDAgMC43NzcwMDAKK3ZuIC0wLjU4MTUwMCAtMC4yNDExMDAgMC43NzcwMDAKK3ZuIC0wLjI0MTEwMCAtMC41ODE1MDAgMC43NzcwMDAKK3ZuIDAuMjQxMTAwIC0wLjU4MTUwMCAwLjc3NzAwMAordm4gMC41ODE0MDAgLTAuMjQxMjAwIDAuNzc3MDAwCit2biAwLjU4MTUwMCAwLjI0MTEwMCAwLjc3NzAwMAordm4gMC4wOTY0MDAgMC4yMzI1MDAgMC45Njc4MDAKK3ZuIC0wLjA5NjQwMCAwLjIzMjUwMCAwLjk2NzgwMAordm4gLTAuMjMyNTAwIDAuMDk2NDAwIDAuOTY3ODAwCit2biAtMC4yMzI1MDAgLTAuMDk2NDAwIDAuOTY3ODAwCit2biAtMC4wOTY0MDAgLTAuMjMyNTAwIDAuOTY3ODAwCit2biAwLjA5NjQwMCAtMC4yMzI1MDAgMC45Njc4MDAKK3ZuIDAuMjMyNTAwIC0wLjA5NjUwMCAwLjk2NzgwMAordm4gMC4yMzI1MDAgMC4wOTY0MDAgMC45Njc4MDAKK3ZuIDAuMDQzNDAwIDAuMTA0NzAwIDAuOTkzNjAwCit2biAtMC4wNDM0MDAgMC4xMDQ3MDAgMC45OTM2MDAKK3ZuIC0wLjEwNDcwMCAwLjA0MzQwMCAwLjk5MzYwMAordm4gLTAuMTA0NzAwIC0wLjA0MzQwMCAwLjk5MzYwMAordm4gLTAuMDQzNDAwIC0wLjEwNDcwMCAwLjk5MzYwMAordm4gMC4wNDM0MDAgLTAuMTA0NzAwIDAuOTkzNjAwCit2biAwLjEwNDcwMCAtMC4wNDM0MDAgMC45OTM2MDAKK3ZuIDAuMTA0NzAwIDAuMDQzNDAwIDAuOTkzNjAwCit2biAtMC4yMjIzMDAgLTAuNTI2NjAwIDAuODIwNTAwCit2biAtMC4yMjIzMDAgLTAuNTI2NzAwIDAuODIwNTAwCit2biAtMC41MjY2MDAgLTAuMjIyMzAwIDAuODIwNTAwCit2biAtMC41MjY2MDAgLTAuMjIyMzAwIDAuODIwNjAwCit2biAtMC41MjY2MDAgMC4yMjIzMDAgMC44MjA2MDAKK3ZuIC0wLjUyNjYwMCAwLjIyMjMwMCAwLjgyMDUwMAordm4gLTAuMjIyMzAwIDAuNTI2NjAwIDAuODIwNTAwCit2biAtMC4yMjIzMDAgMC41MjY2MDAgMC44MjA2MDAKK3ZuIDAuMjIyMzAwIDAuNTI2NjAwIDAuODIwNjAwCit2biAwLjIyMjMwMCAwLjUyNjYwMCAwLjgyMDUwMAordm4gMC41MjY2MDAgMC4yMjIzMDAgMC44MjA1MDAKK3ZuIDAuNTI2NjAwIDAuMjIyMzAwIDAuODIwNjAwCit2biAwLjUyNjYwMCAtMC4yMjIzMDAgMC44MjA2MDAKK3ZuIDAuNTI2NjAwIC0wLjIyMjMwMCAwLjgyMDUwMAordm4gMC4yMjIzMDAgLTAuNTI2NjAwIDAuODIwNTAwCit2biAtMC4wOTM2MDAgLTAuMjIxNzAwIDAuOTcwNjAwCit2biAtMC4wOTM2MDAgLTAuMjIxODAwIDAuOTcwNjAwCit2biAtMC4yMjE4MDAgLTAuMDkzNjAwIDAuOTcwNjAwCit2biAtMC4yMjE4MDAgMC4wOTM2MDAgMC45NzA2MDAKK3ZuIC0wLjA5MzYwMCAwLjIyMTcwMCAwLjk3MDYwMAordm4gLTAuMDkzNjAwIDAuMjIxODAwIDAuOTcwNjAwCit2biAwLjA5MzcwMCAwLjIyMTgwMCAwLjk3MDYwMAordm4gMC4wOTM2MDAgMC4yMjE4MDAgMC45NzA2MDAKK3ZuIDAuMjIxODAwIDAuMDkzNjAwIDAuOTcwNjAwCit2biAwLjIyMTgwMCAtMC4wOTM2MDAgMC45NzA2MDAKK3ZuIDAuMDkzNjAwIC0wLjIyMTgwMCAwLjk3MDYwMAordm4gMC4wOTM2MDAgLTAuMjIxNzAwIDAuOTcwNjAwCit2biAwLjIyMjMwMCAwLjUyNjUwMCAwLjgyMDYwMAordm4gLTAuMjIyMzAwIC0wLjUyNjYwMCAwLjgyMDYwMAordm4gLTAuMjIyMzAwIDAuNTI2NzAwIDAuODIwNTAwCit2biAwLjA5MzYwMCAwLjIyMTcwMCAwLjk3MDYwMAordm4gMC4yMjE3MDAgMC4wOTM2MDAgMC45NzA2MDAKK3ZuIC0wLjIyMTcwMCAwLjA5MzYwMCAwLjk3MDYwMAordm4gMC41NjYwMDAgLTAuMTE0NDAwIC0wLjgxNjQwMAordm4gLTAuOTQwNzAwIDAuMTkwMjAwIC0wLjI4MTEwMAordm4gMC40Nzg3MDAgLTAuMzIyOTAwIC0wLjgxNjQwMAordm4gLTAuNzk1ODAwIDAuNTM2ODAwIC0wLjI4MDUwMAordm4gLTAuNzk1ODAwIDAuNTM2ODAwIC0wLjI4MDQwMAordm4gMC4zMjI5MDAgLTAuNDc4NzAwIC0wLjgxNjQwMAordm4gMC4zMjMwMDAgLTAuNDc4ODAwIC0wLjgxNjQwMAordm4gLTAuNTM2ODAwIDAuNzk1ODAwIC0wLjI4MDUwMAordm4gMC4xMTQ0MDAgLTAuNTY2MTAwIC0wLjgxNjQwMAordm4gMC4xMTQ0MDAgLTAuNTY2MDAwIC0wLjgxNjQwMAordm4gLTAuMTkwMjAwIDAuOTQwNzAwIC0wLjI4MTEwMAordm4gLTAuMTE0NDAwIC0wLjU2NjAwMCAtMC44MTY0MDAKK3ZuIDAuMTkwMjAwIDAuOTQwNzAwIC0wLjI4MTAwMAordm4gMC4xOTAyMDAgMC45NDA2MDAgLTAuMjgxMTAwCit2biAtMC4zMjI5MDAgLTAuNDc4NzAwIC0wLjgxNjQwMAordm4gMC41MzY4MDAgMC43OTU4MDAgLTAuMjgwNDAwCit2biAtMC40Nzg4MDAgLTAuMzIyOTAwIC0wLjgxNjQwMAordm4gLTAuNDc4NzAwIC0wLjMyMjkwMCAtMC44MTY0MDAKK3ZuIDAuNzk1ODAwIDAuNTM2ODAwIC0wLjI4MDUwMAordm4gMC43OTU4MDAgMC41MzY4MDAgLTAuMjgwNDAwCit2biAtMC41NjYwMDAgLTAuMTE0NDAwIC0wLjgxNjQwMAordm4gMC45NDA3MDAgMC4xOTAxMDAgLTAuMjgxMTAwCit2biAtMC41NjYwMDAgMC4xMTQ0MDAgLTAuODE2NDAwCit2biAwLjk0MDcwMCAtMC4xOTAyMDAgLTAuMjgxMTAwCit2biAwLjk0MDYwMCAtMC4xOTAyMDAgLTAuMjgxMTAwCit2biAtMC40Nzg3MDAgMC4zMjI5MDAgLTAuODE2NDAwCit2biAwLjc5NTgwMCAtMC41MzY4MDAgLTAuMjgwNDAwCit2biAwLjc5NTgwMCAtMC41MzY4MDAgLTAuMjgwNTAwCit2biAtMC4zMjI5MDAgMC40Nzg4MDAgLTAuODE2NDAwCit2biAtMC4zMjI5MDAgMC40Nzg3MDAgLTAuODE2NDAwCit2biAwLjUzNjgwMCAtMC43OTU3MDAgLTAuMjgwNTAwCit2biAwLjUzNjgwMCAtMC43OTU4MDAgLTAuMjgwNDAwCit2biAtMC4xMTQ0MDAgMC41NjYwMDAgLTAuODE2NDAwCit2biAwLjE5MDIwMCAtMC45NDA2MDAgLTAuMjgxMTAwCit2biAwLjExNDQwMCAwLjU2NjAwMCAtMC44MTY0MDAKK3ZuIC0wLjE5MDIwMCAtMC45NDA3MDAgLTAuMjgxMDAwCit2biAtMC4xOTAyMDAgLTAuOTQwNjAwIC0wLjI4MTEwMAordm4gMC4zMjI5MDAgMC40Nzg3MDAgLTAuODE2NDAwCit2biAtMC41MzY4MDAgLTAuNzk1ODAwIC0wLjI4MDQwMAordm4gMC40Nzg3MDAgMC4zMjI5MDAgLTAuODE2NDAwCit2biAtMC43OTU4MDAgLTAuNTM2ODAwIC0wLjI4MDQwMAordm4gMC41NjYwMDAgMC4xMTQ1MDAgLTAuODE2NDAwCit2biAtMC45NDA3MDAgLTAuMTkwMjAwIC0wLjI4MTAwMAordm4gLTAuOTQwNzAwIC0wLjE5MDIwMCAtMC4yODExMDAKK3ZuIDAuOTgwMjAwIC0wLjE5ODIwMCAwLjAwMDAwMAordm4gMC44MjkwMDAgLTAuNTU5MjAwIC0wLjAwMDAwMAordm4gMC41NTkyMDAgLTAuODI5MDAwIC0wLjAwMDAwMAordm4gLTAuODI5MDAwIC0wLjU1OTIwMCAtMC4wMDAwMDAKK3ZuIC0wLjk4MDIwMCAtMC4xOTgxMDAgMC4wMDAwMDAKK3ZuIC0wLjk4MDIwMCAwLjE5ODIwMCAtMC4wMDAwMDAKK3ZuIC0wLjE5ODIwMCAwLjk4MDIwMCAwLjAwMDAwMAordm4gMC4xOTgyMDAgMC45ODAyMDAgMC4wMDAwMDAKK3ZuIDAuNTU5MjAwIDAuODI5MDAwIDAuMDAwMTAwCit2biAwLjU1OTIwMCAwLjgyOTAwMCAwLjAwMDAwMAordm4gMC44MjkwMDAgMC41NTkyMDAgMC4wMDAwMDAKK3ZuIDAuOTgwMjAwIDAuMTk4MjAwIDAuMDAwMDAwCit2biAwLjk4MDEwMCAtMC4xOTgyMDAgLTAuMDA3OTAwCit2biAwLjgyOTAwMCAtMC41NTkyMDAgLTAuMDA3OTAwCit2biAwLjU1OTIwMCAtMC44MjkwMDAgLTAuMDA3OTAwCit2biAwLjU1OTIwMCAtMC44MjkwMDAgLTAuMDA4MDAwCit2biAwLjE5ODIwMCAtMC45ODAxMDAgLTAuMDA3OTAwCit2biAtMC4xOTgyMDAgLTAuOTgwMTAwIC0wLjAwNzkwMAordm4gLTAuNTU5MjAwIC0wLjgyOTAwMCAtMC4wMDgwMDAKK3ZuIC0wLjU1OTIwMCAtMC44MjkwMDAgLTAuMDA3OTAwCit2biAtMC44MjkwMDAgLTAuNTU5MjAwIC0wLjAwNzkwMAordm4gLTAuOTgwMTAwIC0wLjE5ODEwMCAtMC4wMDc5MDAKK3ZuIC0wLjk4MDEwMCAwLjE5ODIwMCAtMC4wMDc5MDAKK3ZuIC0wLjgyOTAwMCAwLjU1OTIwMCAtMC4wMDc5MDAKK3ZuIC0wLjU1OTIwMCAwLjgyOTAwMCAtMC4wMDc5MDAKK3ZuIC0wLjE5ODIwMCAwLjk4MDEwMCAtMC4wMDc5MDAKK3ZuIDAuMTk4MjAwIDAuOTgwMTAwIC0wLjAwNzkwMAordm4gMC41NTkyMDAgMC44MjkwMDAgLTAuMDA3OTAwCit2biAwLjgyOTAwMCAwLjU1OTIwMCAtMC4wMDc5MDAKK3ZuIDAuOTgwMTAwIDAuMTk4MjAwIC0wLjAwNzkwMAordm4gMC43NDAxMDAgLTAuMTQ5NjAwIC0wLjY1NTcwMAordm4gMC43Mzk5MDAgLTAuMTQ5NjAwIC0wLjY1NTkwMAordm4gMC42MjU4MDAgLTAuNDIyMTAwIC0wLjY1NTkwMAordm4gMC42MjU1MDAgLTAuNDIyMDAwIC0wLjY1NjIwMAordm4gMC40MjIwMDAgLTAuNjI1NjAwIC0wLjY1NjIwMAordm4gMC40MjIxMDAgLTAuNjI1NzAwIC0wLjY1NjAwMAordm4gMC4xNDk2MDAgLTAuNzM5OTAwIC0wLjY1NTkwMAordm4gMC4xNDk3MDAgLTAuNzQwMDAwIC0wLjY1NTcwMAordm4gLTAuMTQ5NjAwIC0wLjc0MDEwMCAtMC42NTU3MDAKK3ZuIC0wLjE0OTYwMCAtMC43Mzk4MDAgLTAuNjU2MDAwCit2biAtMC40MjIxMDAgLTAuNjI1NzAwIC0wLjY1NjAwMAordm4gLTAuNDIyMDAwIC0wLjYyNTYwMCAtMC42NTYyMDAKK3ZuIC0wLjYyNTYwMCAtMC40MjIwMDAgLTAuNjU2MjAwCit2biAtMC42MjU3MDAgLTAuNDIyMTAwIC0wLjY1NjAwMAordm4gLTAuNzM5OTAwIC0wLjE0OTUwMCAtMC42NTU5MDAKK3ZuIC0wLjc0MDEwMCAtMC4xNDk2MDAgLTAuNjU1NzAwCit2biAtMC43NDAxMDAgMC4xNDk2MDAgLTAuNjU1NzAwCit2biAtMC43Mzk4MDAgMC4xNDk2MDAgLTAuNjU1OTAwCit2biAtMC42MjU4MDAgMC40MjIxMDAgLTAuNjU1OTAwCit2biAtMC42MjU2MDAgMC40MjIwMDAgLTAuNjU2MjAwCit2biAtMC40MjIwMDAgMC42MjU2MDAgLTAuNjU2MTAwCit2biAtMC40MjIxMDAgMC42MjU3MDAgLTAuNjU1OTAwCit2biAtMC4xNDk2MDAgMC43Mzk4MDAgLTAuNjU1OTAwCit2biAtMC4xNDk3MDAgMC43NDAxMDAgLTAuNjU1NjAwCit2biAwLjE0OTYwMCAwLjc0MDAwMCAtMC42NTU3MDAKK3ZuIDAuMTQ5NjAwIDAuNzM5OTAwIC0wLjY1NTkwMAordm4gMC40MjIxMDAgMC42MjU4MDAgLTAuNjU1OTAwCit2biAwLjQyMjAwMCAwLjYyNTYwMCAtMC42NTYyMDAKK3ZuIDAuNjI1NjAwIDAuNDIyMDAwIC0wLjY1NjIwMAordm4gMC42MjU3MDAgMC40MjIxMDAgLTAuNjU1OTAwCit2biAwLjczOTgwMCAwLjE0OTYwMCAtMC42NTU5MDAKK3ZuIDAuNzQwMDAwIDAuMTQ5NzAwIC0wLjY1NTcwMAordm4gMC43MzMwMDAgLTAuMTQ4MjAwIC0wLjY2MzgwMAordm4gMC43MzI4MDAgLTAuMTQ4NTAwIC0wLjY2NDEwMAordm4gMC42MTk5MDAgLTAuNDE4MjAwIC0wLjY2NDAwMAordm4gMC42MTk1MDAgLTAuNDE4MzAwIC0wLjY2NDMwMAordm4gMC40MTgwMDAgLTAuNjE5NjAwIC0wLjY2NDMwMAordm4gMC40MTg0MDAgLTAuNjE5NzAwIC0wLjY2NDAwMAordm4gMC4xNDgyMDAgLTAuNzMyODAwIC0wLjY2NDEwMAordm4gMC4xNDg1MDAgLTAuNzMzMDAwIC0wLjY2MzkwMAordm4gLTAuMTQ4MzAwIC0wLjczMzAwMCAtMC42NjM4MDAKK3ZuIC0wLjE0ODUwMCAtMC43MzI3MDAgLTAuNjY0MTAwCit2biAtMC40MTgyMDAgLTAuNjE5OTAwIC0wLjY2NDAwMAordm4gLTAuNDE4MzAwIC0wLjYxOTUwMCAtMC42NjQzMDAKK3ZuIC0wLjYxOTYwMCAtMC40MTgwMDAgLTAuNjY0MzAwCit2biAtMC42MTk3MDAgLTAuNDE4NDAwIC0wLjY2NDAwMAordm4gLTAuNzMyODAwIC0wLjE0ODIwMCAtMC42NjQxMDAKK3ZuIC0wLjczMzAwMCAtMC4xNDg1MDAgLTAuNjYzODAwCit2biAtMC43MzMxMDAgMC4xNDgyMDAgLTAuNjYzODAwCit2biAtMC43MzI3MDAgMC4xNDg1MDAgLTAuNjY0MTAwCit2biAtMC42MTk5MDAgMC40MTgyMDAgLTAuNjY0MDAwCit2biAtMC42MTk1MDAgMC40MTgzMDAgLTAuNjY0MzAwCit2biAtMC40MTgwMDAgMC42MTk2MDAgLTAuNjY0MzAwCit2biAtMC40MTg0MDAgMC42MTk3MDAgLTAuNjY0MDAwCit2biAtMC4xNDgyMDAgMC43MzI4MDAgLTAuNjY0MTAwCit2biAtMC4xNDg1MDAgMC43MzMwMDAgLTAuNjYzODAwCit2biAwLjE0ODIwMCAwLjczMzEwMCAtMC42NjM4MDAKK3ZuIDAuMTQ4NTAwIDAuNzMyODAwIC0wLjY2NDEwMAordm4gMC40MTgyMDAgMC42MTk5MDAgLTAuNjY0MDAwCit2biAwLjQxODMwMCAwLjYxOTUwMCAtMC42NjQzMDAKK3ZuIDAuNjE5NjAwIDAuNDE4MDAwIC0wLjY2NDMwMAordm4gMC42MTk3MDAgMC40MTg0MDAgLTAuNjY0MDAwCit2biAwLjczMjgwMCAwLjE0ODIwMCAtMC42NjQxMDAKK3ZuIDAuNzMzMDAwIDAuMTQ4NTAwIC0wLjY2MzgwMAordm4gMC43NjA3MDAgLTAuMTUzODAwIC0wLjYzMDcwMAordm4gMC43NjA5MDAgLTAuMTUzODAwIC0wLjYzMDQwMAordm4gMC43Nzg0MDAgLTAuMTU3NzAwIC0wLjYwNzYwMAordm4gMC43Nzg2MDAgLTAuMTU3NzAwIC0wLjYwNzQwMAordm4gMC42NDMyMDAgLTAuNDMzOTAwIC0wLjYzMDkwMAordm4gMC42NDMzMDAgLTAuNDM0MDAwIC0wLjYzMDcwMAordm4gMC42NTgxMDAgLTAuNDQ0MzAwIC0wLjYwNzgwMAordm4gMC42NTgyMDAgLTAuNDQ0NDAwIC0wLjYwNzYwMAordm4gMC40MzQwMDAgLTAuNjQzMzAwIC0wLjYzMDcwMAordm4gMC40MzM4MDAgLTAuNjQzMTAwIC0wLjYzMTEwMAordm4gMC40NDQ0MDAgLTAuNjU4MzAwIC0wLjYwNzYwMAordm4gMC40NDQzMDAgLTAuNjU4MTAwIC0wLjYwNzgwMAordm4gMC4xNTM5MDAgLTAuNzYwODAwIC0wLjYzMDUwMAordm4gMC4xNTM4MDAgLTAuNzYwNjAwIC0wLjYzMDcwMAordm4gMC4xNTc4MDAgLTAuNzc4NzAwIC0wLjYwNzMwMAordm4gMC4xNTc4MDAgLTAuNzc4NTAwIC0wLjYwNzUwMAordm4gLTAuMTUzODAwIC0wLjc2MDUwMCAtMC42MzA4MDAKK3ZuIC0wLjE1MzgwMCAtMC43NjA4MDAgLTAuNjMwNTAwCit2biAtMC4xNTc4MDAgLTAuNzc4NTAwIC0wLjYwNzYwMAordm4gLTAuMTU3ODAwIC0wLjc3ODcwMCAtMC42MDcyMDAKK3ZuIC0wLjQzMzkwMCAtMC42NDMxMDAgLTAuNjMxMDAwCit2biAtMC40MzM5MDAgLTAuNjQzMzAwIC0wLjYzMDgwMAordm4gLTAuNDQ0NDAwIC0wLjY1ODIwMCAtMC42MDc4MDAKK3ZuIC0wLjQ0NDQwMCAtMC42NTgyMDAgLTAuNjA3NzAwCit2biAtMC42NDMzMDAgLTAuNDM0MDAwIC0wLjYzMDcwMAordm4gLTAuNjQzMjAwIC0wLjQzMzkwMCAtMC42MzA5MDAKK3ZuIC0wLjY1ODIwMCAtMC40NDQ0MDAgLTAuNjA3NzAwCit2biAtMC42NTgxMDAgLTAuNDQ0MzAwIC0wLjYwNzgwMAordm4gLTAuNzYwODAwIC0wLjE1MzgwMCAtMC42MzA0MDAKK3ZuIC0wLjc2MDcwMCAtMC4xNTM4MDAgLTAuNjMwNzAwCit2biAtMC43Nzg2MDAgLTAuMTU3NzAwIC0wLjYwNzQwMAordm4gLTAuNzc4NTAwIC0wLjE1NzcwMCAtMC42MDc2MDAKK3ZuIC0wLjc2MDYwMCAwLjE1MzgwMCAtMC42MzA3MDAKK3ZuIC0wLjc2MDgwMCAwLjE1MzgwMCAtMC42MzA0MDAKK3ZuIC0wLjc3ODQwMCAwLjE1NzcwMCAtMC42MDc2MDAKK3ZuIC0wLjc3ODYwMCAwLjE1NzgwMCAtMC42MDc0MDAKK3ZuIC0wLjY0MzEwMCAwLjQzMzkwMCAtMC42MzEwMDAKK3ZuIC0wLjY0MzMwMCAwLjQzMzkwMCAtMC42MzA3MDAKK3ZuIC0wLjY1ODEwMCAwLjQ0NDMwMCAtMC42MDc4MDAKK3ZuIC0wLjY1ODIwMCAwLjQ0NDQwMCAtMC42MDc3MDAKK3ZuIC0wLjQzMzkwMCAwLjY0MzMwMCAtMC42MzA4MDAKK3ZuIC0wLjQzMzgwMCAwLjY0MzIwMCAtMC42MzEwMDAKK3ZuIC0wLjQ0NDQwMCAwLjY1ODIwMCAtMC42MDc3MDAKK3ZuIC0wLjQ0NDMwMCAwLjY1ODEwMCAtMC42MDc4MDAKK3ZuIC0wLjE1MzkwMCAwLjc2MDgwMCAtMC42MzA0MDAKK3ZuIC0wLjE1MzgwMCAwLjc2MDcwMCAtMC42MzA3MDAKK3ZuIC0wLjE1NzcwMCAwLjc3ODUwMCAtMC42MDc1MDAKK3ZuIC0wLjE1NzcwMCAwLjc3ODQwMCAtMC42MDc2MDAKK3ZuIDAuMTUzODAwIDAuNzYwNzAwIC0wLjYzMDYwMAordm4gMC4xNTM4MDAgMC43NjA4MDAgLTAuNjMwNTAwCit2biAwLjE1NzcwMCAwLjc3ODQwMCAtMC42MDc2MDAKK3ZuIDAuMTU3NzAwIDAuNzc4NjAwIC0wLjYwNzQwMAordm4gMC40MzM4MDAgMC42NDMxMDAgLTAuNjMxMTAwCit2biAwLjQzNDAwMCAwLjY0MzMwMCAtMC42MzA3MDAKK3ZuIDAuNDQ0MzAwIDAuNjU4MTAwIC0wLjYwNzgwMAordm4gMC40NDQ0MDAgMC42NTgyMDAgLTAuNjA3NzAwCit2biAwLjY0MzMwMCAwLjQzNDAwMCAtMC42MzA3MDAKK3ZuIDAuNjQzMTAwIDAuNDMzODAwIC0wLjYzMTAwMAordm4gMC42NTgyMDAgMC40NDQ0MDAgLTAuNjA3NzAwCit2biAwLjY1ODEwMCAwLjQ0NDMwMCAtMC42MDc4MDAKK3ZuIDAuNzYwODAwIDAuMTUzOTAwIC0wLjYzMDUwMAordm4gMC43NjA2MDAgMC4xNTM4MDAgLTAuNjMwNzAwCit2biAwLjc3ODYwMCAwLjE1NzgwMCAtMC42MDc0MDAKK3ZuIDAuNzc4NTAwIDAuMTU3ODAwIC0wLjYwNzUwMAordm4gLTAuNjQ4MzAwIDAuMTMxMTAwIC0wLjc1MDAwMAordm4gLTAuNTQ3OTAwIDAuMzY5NjAwIC0wLjc1MDUwMAordm4gLTAuMzY5NjAwIDAuNTQ3OTAwIC0wLjc1MDUwMAordm4gLTAuMTMxMTAwIDAuNjQ4MzAwIC0wLjc1MDAwMAordm4gMC4xMzExMDAgMC42NDgzMDAgLTAuNzUwMDAwCit2biAwLjM2OTYwMCAwLjU0NzkwMCAtMC43NTA1MDAKK3ZuIDAuNTQ3OTAwIDAuMzY5NjAwIC0wLjc1MDUwMAordm4gMC42NDgzMDAgMC4xMzEwMDAgLTAuNzUwMDAwCit2biAwLjY0ODMwMCAtMC4xMzExMDAgLTAuNzUwMDAwCit2biAwLjU0NzkwMCAtMC4zNjk2MDAgLTAuNzUwNTAwCit2biAwLjM2OTYwMCAtMC41NDc5MDAgLTAuNzUwNTAwCit2biAwLjEzMTEwMCAtMC42NDgzMDAgLTAuNzUwMDAwCit2biAtMC4xMzExMDAgLTAuNjQ4MzAwIC0wLjc1MDAwMAordm4gLTAuMzY5NjAwIC0wLjU0NzkwMCAtMC43NTA1MDAKK3ZuIC0wLjU0NzkwMCAtMC4zNjk2MDAgLTAuNzUwNTAwCit2biAtMC42NDgzMDAgLTAuMTMxMTAwIC0wLjc1MDAwMAordm4gLTAuNDA2NDAwIDAuMDgyMjAwIC0wLjkxMDAwMAordm4gLTAuMzQzNDAwIDAuMjMxNjAwIC0wLjkxMDIwMAordm4gLTAuMjMxNjAwIDAuMzQzNDAwIC0wLjkxMDIwMAordm4gLTAuMDgyMjAwIDAuNDA2NDAwIC0wLjkxMDAwMAordm4gMC4wODIyMDAgMC40MDY0MDAgLTAuOTEwMDAwCit2biAwLjIzMTYwMCAwLjM0MzQwMCAtMC45MTAyMDAKK3ZuIDAuMzQzNDAwIDAuMjMxNjAwIC0wLjkxMDIwMAordm4gMC4zNDMzMDAgMC4yMzE2MDAgLTAuOTEwMjAwCit2biAwLjQwNjQwMCAwLjA4MjIwMCAtMC45MTAwMDAKK3ZuIDAuNDA2NDAwIC0wLjA4MjIwMCAtMC45MTAwMDAKK3ZuIDAuMzQzNDAwIC0wLjIzMTYwMCAtMC45MTAyMDAKK3ZuIDAuMjMxNjAwIC0wLjM0MzMwMCAtMC45MTAyMDAKK3ZuIDAuMjMxNjAwIC0wLjM0MzQwMCAtMC45MTAyMDAKK3ZuIDAuMDgyMjAwIC0wLjQwNjQwMCAtMC45MTAwMDAKK3ZuIC0wLjA4MjIwMCAtMC40MDY0MDAgLTAuOTEwMDAwCit2biAtMC4yMzE2MDAgLTAuMzQzNDAwIC0wLjkxMDIwMAordm4gLTAuMjMxNjAwIC0wLjM0MzMwMCAtMC45MTAyMDAKK3ZuIC0wLjM0MzQwMCAtMC4yMzE2MDAgLTAuOTEwMjAwCit2biAtMC40MDY0MDAgLTAuMDgyMjAwIC0wLjkxMDAwMAordm4gLTAuMTk5MDAwIDAuMDQwMjAwIC0wLjk3OTIwMAordm4gLTAuMTY4MTAwIDAuMTEzNDAwIC0wLjk3OTIwMAordm4gLTAuMTEzNDAwIDAuMTY4MTAwIC0wLjk3OTIwMAordm4gLTAuMDQwMjAwIDAuMTk5MDAwIC0wLjk3OTIwMAordm4gMC4wNDAyMDAgMC4xOTkwMDAgLTAuOTc5MjAwCit2biAwLjExMzQwMCAwLjE2ODEwMCAtMC45NzkyMDAKK3ZuIDAuMTEzMzAwIDAuMTY4MTAwIC0wLjk3OTIwMAordm4gMC4xNjgxMDAgMC4xMTM0MDAgLTAuOTc5MjAwCit2biAwLjE5OTAwMCAwLjA0MDIwMCAtMC45NzkyMDAKK3ZuIDAuMTk5MDAwIC0wLjA0MDIwMCAtMC45NzkyMDAKK3ZuIDAuMTY4MTAwIC0wLjExMzQwMCAtMC45NzkyMDAKK3ZuIDAuMTEzNDAwIC0wLjE2ODEwMCAtMC45NzkyMDAKK3ZuIDAuMDQwMjAwIC0wLjE5OTAwMCAtMC45NzkyMDAKK3ZuIC0wLjA0MDIwMCAtMC4xOTkwMDAgLTAuOTc5MjAwCit2biAtMC4xMTM0MDAgLTAuMTY4MTAwIC0wLjk3OTIwMAordm4gLTAuMTY4MTAwIC0wLjExMzQwMCAtMC45NzkyMDAKK3ZuIC0wLjE5OTAwMCAtMC4wNDAyMDAgLTAuOTc5MjAwCitmIDc1MTAvMS8xIDc1MTkvMi8xIDc1MjAvMy8xCitmIDc1MjAvMy8yIDc1MTEvNC8yIDc1MTAvMS8yCitmIDc1MjAvMy8zIDc1MTkvMi8zIDczNzMvNS8zCitmIDczNzMvNS80IDczNzIvNi80IDc1MjAvMy80CitmIDc1MjgvNy81IDc1MzcvOC81IDc1MzgvOS81CitmIDc1MzgvOS82IDc1MjkvMTAvNiA3NTI4LzcvNgorZiA3NTM4LzkvNyA3NTM3LzgvNyA3Mzc1LzExLzcKK2YgNzM3NS8xMS84IDczNzQvMTIvOCA3NTM4LzkvOAorZiA3NTQ2LzEzLzkgNzU1NS8xNC85IDc1NTYvMTUvOQorZiA3NTU2LzE1LzEwIDc1NDcvMTYvMTAgNzU0Ni8xMy8xMAorZiA3NTU2LzE1LzExIDc1NTUvMTQvMTEgNzM3Ny8xNy8xMQorZiA3Mzc3LzE3LzEyIDczNzYvMTgvMTIgNzU1Ni8xNS8xMgorZiA3NTY0LzE5LzEzIDc1NzMvMjAvMTMgNzU3NC8yMS8xMworZiA3NTc0LzIxLzE0IDc1NjUvMjIvMTQgNzU2NC8xOS8xNAorZiA3NTc0LzIxLzE1IDc1NzMvMjAvMTUgNzM3MS8yMy8xNQorZiA3MzcxLzIzLzE2IDczNzAvMjQvMTYgNzU3NC8yMS8xNgorZiA3NTA5LzI1LzE3IDc1MTgvMjYvMTcgNzUxOS8yNy8xNworZiA3NTE5LzIvMTggNzUxMC8xLzE4IDc1MDkvMjgvMTgKK2YgNzUwOC8yOS8xOSA3MzYzLzMwLzE5IDczNzAvMjQvMTkKK2YgNzM3MC8yNC8yMCA3NTExLzQvMjAgNzUwOC8yOS8yMAorZiA3NTE4LzMxLzIxIDczNjcvMzIvMjEgNzM3My8zMy8yMQorZiA3MzczLzMzLzIyIDc1MTkvMzQvMjIgNzUxOC8zMS8yMgorZiA3NTI3LzM1LzIzIDc1MzYvMzYvMjMgNzUzNy84LzIzCitmIDc1MzcvOC8yNCA3NTI4LzcvMjQgNzUyNy8zNS8yNAorZiA3NTI2LzM3LzI1IDczNjIvMzgvMjUgNzM3Mi82LzI1CitmIDczNzIvNi8yNiA3NTI5LzEwLzI2IDc1MjYvMzcvMjYKK2YgNzUzNi8zOS8yNyA3MzY4LzQwLzI3IDczNzUvNDEvMjcKK2YgNzM3NS80MS8yOCA3NTM3LzQyLzI4IDc1MzYvMzkvMjgKK2YgNzU0NS80My8yOSA3NTU0LzQ0LzI5IDc1NTUvNDUvMjkKK2YgNzU1NS80NS8zMCA3NTQ2LzQ2LzMwIDc1NDUvNDMvMzAKK2YgNzU0NC80Ny8zMSA3MzY1LzQ4LzMxIDczNzQvMTIvMzEKK2YgNzM3NC8xMi8zMiA3NTQ3LzE2LzMyIDc1NDQvNDcvMzIKK2YgNzM2OS80OS8zMyA3Mzc3LzUwLzMzIDc1NTUvNTEvMzMKK2YgNzU1NS81MS8zNCA3NTU0LzUyLzM0IDczNjkvNDkvMzQKK2YgNzU2My81My8zNSA3NTcyLzU0LzM1IDc1NzMvNTUvMzUKK2YgNzU3My81NS8zNiA3NTY0LzU2LzM2IDc1NjMvNTMvMzYKK2YgNzU2Mi81Ny8zNyA3MzY0LzU4LzM3IDczNzYvNTkvMzcKK2YgNzM3Ni81OS8zOCA3NTY1LzYwLzM4IDc1NjIvNTcvMzgKK2YgNzM2Ni82MS8zOSA3MzcxLzYyLzM5IDc1NzMvNTUvMzkKK2YgNzU3My81NS80MCA3NTcyLzU0LzQwIDczNjYvNjEvNDAKK2YgNzM3OC82My80MSA3NTEyLzY0LzQxIDc1MDkvMjUvNDEKK2YgNzUwOS8yNS80MSA3MzY2LzYxLzQxIDczNzgvNjMvNDEKK2YgNzM3OS82NS80MiA3NTMwLzY2LzQyIDc1MjcvNjcvNDIKK2YgNzUyNy82Ny80MiA3MzY3LzMyLzQyIDczNzkvNjUvNDIKK2YgNzM4MC82OC80MyA3NTQ4LzY5LzQzIDc1NDUvNDMvNDMKK2YgNzU0NS80My80MyA3MzY4LzQwLzQzIDczODAvNjgvNDMKK2YgNzM4MS83MC80NCA3NTY2LzcxLzQ0IDc1NjMvNzIvNDQKK2YgNzU2My83Mi80NCA3MzY5LzQ5LzQ0IDczODEvNzAvNDQKK2YgNzM5MS83My80NSA3NTE2Lzc0LzQ1IDc1MTUvNzUvNDUKK2YgNzUxNS83NS80NiA3MzkwLzc2LzQ2IDczOTEvNzMvNDYKK2YgNzM5My83Ny80NyA3NTM0Lzc4LzQ3IDc1MzMvNjYvNDcKK2YgNzUzMy82Ni80OCA3MzkyLzY1LzQ4IDczOTMvNzcvNDgKK2YgNzM5NS83OS80OSA3NTUyLzgwLzQ5IDc1NTEvODEvNDkKK2YgNzU1MS84MS81MCA3Mzk0LzgyLzUwIDczOTUvNzkvNTAKK2YgNzM5Ny84My81MSA3NTcwLzg0LzUxIDc1NjkvNzEvNTEKK2YgNzU2OS83MS81MiA3Mzk2LzcwLzUyIDczOTcvODMvNTIKK2YgNzUxMi82NC81MyA3Mzc4LzYzLzUzIDczOTAvNzYvNTMKK2YgNzM5MC83Ni81NCA3NTE1Lzc1LzU0IDc1MTIvNjQvNTQKK2YgNzUzMC82Ni81NSA3Mzc5LzY1LzU1IDczOTIvNjUvNTUKK2YgNzM5Mi82NS81NiA3NTMzLzY2LzU2IDc1MzAvNjYvNTYKK2YgNzU0OC82OS81NyA3MzgwLzY4LzU3IDczOTQvODIvNTcKK2YgNzM5NC84Mi81OCA3NTUxLzgxLzU4IDc1NDgvNjkvNTgKK2YgNzU2Ni83MS81OSA3MzgxLzcwLzU5IDczOTYvNzAvNTkKK2YgNzM5Ni83MC82MCA3NTY5LzcxLzYwIDc1NjYvNzEvNjAKK2YgNzUxMS80LzYxIDczNzAvMjQvNjEgNzM3MS8yMy82MQorZiA3MzcxLzIzLzYyIDc1MTAvMS82MiA3NTExLzQvNjIKK2YgNzUwOS8yNS82MyA3NTEwLzg1LzYzIDczNzEvNjIvNjMKK2YgNzM3MS82Mi82NCA3MzY2LzYxLzY0IDc1MDkvMjUvNjQKK2YgNzUyMC8zLzY1IDc1MTcvODYvNjUgNzUwOC8yOS82NQorZiA3NTA4LzI5LzY2IDc1MTEvNC82NiA3NTIwLzMvNjYKK2YgNzUyMS84Ny82NyA3NTE4LzI2LzY3IDc1MDkvMjUvNjcKK2YgNzUwOS8yNS82NyA3NTEyLzY0LzY3IDc1MjEvODcvNjcKK2YgNzUxNi83NC82OCA3NTI1Lzg4LzY4IDc1MjQvODkvNjgKK2YgNzUyNC84OS82OSA3NTE1Lzc1LzY5IDc1MTYvNzQvNjkKK2YgNzUxNS85MC83MCA3NTI0LzkxLzcwIDc1MjEvOTIvNzAKK2YgNzUyMS85Mi83MSA3NTEyLzkzLzcxIDc1MTUvOTAvNzEKK2YgNzM2Mi8zOC83MiA3NTE3Lzg2LzcyIDc1MjAvMy83MgorZiA3MzYyLzM4LzczIDc1MjAvMy83MyA3MzcyLzYvNzMKK2YgNzM3OS82NS83NCA3MzY3LzMyLzc0IDc1MTgvMzEvNzQKK2YgNzUxOC8zMS83NCA3NTIxLzk0Lzc0IDczNzkvNjUvNzQKK2YgNzM5My83Ny83NSA3MzkyLzY1Lzc1IDc1MjQvOTUvNzUKK2YgNzUyNC85NS83NiA3NTI1Lzk2Lzc2IDczOTMvNzcvNzYKK2YgNzM3OS82NS83NyA3NTIxLzk0Lzc3IDc1MjQvOTUvNzcKK2YgNzUyNC85NS83OCA3MzkyLzY1Lzc4IDczNzkvNjUvNzgKK2YgNzUyOS8xMC83OSA3MzcyLzYvNzkgNzM3My81Lzc5CitmIDczNzMvNS84MCA3NTI4LzcvODAgNzUyOS8xMC84MAorZiA3NTI4Lzk3LzgxIDczNzMvMzMvODEgNzM2Ny8zMi84MQorZiA3MzY3LzMyLzgyIDc1MjcvNjcvODIgNzUyOC85Ny84MgorZiA3NTM4LzkvODMgNzUzNS85OC84MyA3NTI2LzM3LzgzCitmIDc1MjYvMzcvODQgNzUyOS8xMC84NCA3NTM4LzkvODQKK2YgNzUzOS85OS84NSA3NTM2LzEwMC84NSA3NTI3LzY3Lzg1CitmIDc1MjcvNjcvODUgNzUzMC82Ni84NSA3NTM5Lzk5Lzg1CitmIDc1MzQvNzgvODYgNzU0My8xMDEvODYgNzU0Mi85OS84NgorZiA3NTQyLzk5Lzg3IDc1MzMvNjYvODcgNzUzNC83OC84NworZiA3NTMzLzEwMi84OCA3NTQyLzEwMy84OCA3NTM5LzEwMy84OAorZiA3NTM5LzEwMy84OSA3NTMwLzEwMi84OSA3NTMzLzEwMi84OQorZiA3MzY1LzQ4LzkwIDc1MzUvOTgvOTAgNzUzOC85LzkwCitmIDc1MzgvOS85MSA3Mzc0LzEyLzkxIDczNjUvNDgvOTEKK2YgNzM4MC82OC85MiA3MzY4LzQwLzkyIDc1MzYvMzkvOTIKK2YgNzUzNi8zOS85MiA3NTM5LzEwNC85MiA3MzgwLzY4LzkyCitmIDczOTUvNzkvOTMgNzM5NC84Mi85MyA3NTQyLzEwNS85MworZiA3NTQyLzEwNS85NCA3NTQzLzEwNi85NCA3Mzk1Lzc5Lzk0CitmIDczODAvNjgvOTUgNzUzOS8xMDQvOTUgNzU0Mi8xMDUvOTUKK2YgNzU0Mi8xMDUvOTYgNzM5NC84Mi85NiA3MzgwLzY4Lzk2CitmIDc1NDcvMTYvOTcgNzM3NC8xMi85NyA3Mzc1LzExLzk3CitmIDczNzUvMTEvOTggNzU0Ni8xMy85OCA3NTQ3LzE2Lzk4CitmIDc1NDYvNDYvOTkgNzM3NS80MS85OSA3MzY4LzQwLzk5CitmIDczNjgvNDAvMTAwIDc1NDUvNDMvMTAwIDc1NDYvNDYvMTAwCitmIDc1NTYvMTUvMTAxIDc1NTMvMTA3LzEwMSA3NTQ0LzQ3LzEwMQorZiA3NTQ0LzQ3LzEwMiA3NTQ3LzE2LzEwMiA3NTU2LzE1LzEwMgorZiA3NTU3LzEwOC8xMDMgNzU1NC80NC8xMDMgNzU0NS80My8xMDMKK2YgNzU0NS80My8xMDMgNzU0OC82OS8xMDMgNzU1Ny8xMDgvMTAzCitmIDc1NTIvODAvMTA0IDc1NjEvMTA5LzEwNCA3NTYwLzExMC8xMDQKK2YgNzU2MC8xMTAvMTA1IDc1NTEvODEvMTA1IDc1NTIvODAvMTA1CitmIDc1NTEvMTExLzEwNiA3NTYwLzExMi8xMDYgNzU1Ny8xMTIvMTA2CitmIDc1NTcvMTEyLzEwNyA3NTQ4LzExMS8xMDcgNzU1MS8xMTEvMTA3CitmIDc1NTYvMTEzLzEwOCA3Mzc2LzU5LzEwOCA3MzY0LzU4LzEwOAorZiA3MzY0LzU4LzEwOSA3NTUzLzExNC8xMDkgNzU1Ni8xMTMvMTA5CitmIDczODEvNzAvMTEwIDczNjkvNDkvMTEwIDc1NTQvNTIvMTEwCitmIDc1NTQvNTIvMTEwIDc1NTcvMTE1LzExMCA3MzgxLzcwLzExMAorZiA3Mzk3LzgzLzExMSA3Mzk2LzcwLzExMSA3NTYwLzExNS8xMTEKK2YgNzU2MC8xMTUvMTEyIDc1NjEvMTE2LzExMiA3Mzk3LzgzLzExMgorZiA3MzgxLzcwLzExMyA3NTU3LzExNS8xMTMgNzU2MC8xMTUvMTEzCitmIDc1NjAvMTE1LzExNCA3Mzk2LzcwLzExNCA3MzgxLzcwLzExNAorZiA3NTY1LzIyLzExNSA3Mzc2LzE4LzExNSA3Mzc3LzE3LzExNQorZiA3Mzc3LzE3LzExNiA3NTY0LzE5LzExNiA3NTY1LzIyLzExNgorZiA3NTYzLzcyLzExNyA3NTY0LzExNy8xMTcgNzM3Ny81MC8xMTcKK2YgNzM3Ny81MC8xMTggNzM2OS80OS8xMTggNzU2My83Mi8xMTgKK2YgNzU3NC8yMS8xMTkgNzU3MS8xMTgvMTE5IDc1NjIvMTE5LzExOQorZiA3NTYyLzExOS8xMjAgNzU2NS8yMi8xMjAgNzU3NC8yMS8xMjAKK2YgNzU3NS8xMjAvMTIxIDc1NzIvNTQvMTIxIDc1NjMvNTMvMTIxCitmIDc1NjMvNTMvMTIxIDc1NjYvMTIxLzEyMSA3NTc1LzEyMC8xMjEKK2YgNzU3MC8xMjIvMTIyIDc1NzkvMTIzLzEyMiA3NTc4LzEyNC8xMjIKK2YgNzU3OC8xMjQvMTIzIDc1NjkvMTI1LzEyMyA3NTcwLzEyMi8xMjMKK2YgNzU2OS8xMjYvMTI0IDc1NzgvMTI3LzEyNCA3NTc1LzEyOC8xMjQKK2YgNzU3NS8xMjgvMTI1IDc1NjYvMTI5LzEyNSA3NTY5LzEyNi8xMjUKK2YgNzM2My8zMC8xMjYgNzU3MS8xMTgvMTI2IDc1NzQvMjEvMTI2CitmIDc1NzQvMjEvMTI3IDczNzAvMjQvMTI3IDczNjMvMzAvMTI3CitmIDczNzgvNjMvMTI4IDczNjYvNjEvMTI4IDc1NzIvNTQvMTI4CitmIDc1NzIvNTQvMTI4IDc1NzUvMTIwLzEyOCA3Mzc4LzYzLzEyOAorZiA3MzkxLzczLzEyOSA3MzkwLzc2LzEyOSA3NTc4LzEyNC8xMjkKK2YgNzU3OC8xMjQvMTMwIDc1NzkvMTIzLzEzMCA3MzkxLzczLzEzMAorZiA3Mzc4LzYzLzEzMSA3NTc1LzEyMC8xMzEgNzU3OC8xMjQvMTMxCitmIDc1NzgvMTI0LzEzMiA3MzkwLzc2LzEzMiA3Mzc4LzYzLzEzMgorZiAxMjg4Mi8xMzAvMTMzIDEyODgzLzEzMS8xMzMgMTI4ODQvMTMyLzEzMworZiAxMjg4NS8xMzMvMTM0IDEyODg2LzEzNC8xMzQgMTI4ODcvMTM1LzEzNAorZiAxMjg4OS8xMzYvMTM1IDEyODkwLzEzNy8xMzUgMTI4OTEvMTM4LzEzNQorZiAxMjg5MS8xMzgvMTM2IDEyODg4LzEzOS8xMzYgMTI4ODkvMTM2LzEzNgorZiAxMjg5MC8xMzcvMTM3IDEyODk4LzE0MC8xMzcgMTI4OTkvMTQxLzEzNworZiAxMjg5OS8xNDEvMTM4IDEyODkxLzEzOC8xMzggMTI4OTAvMTM3LzEzOAorZiAxMjg4NC8xMzIvMTM5IDEyODgzLzEzMS8xMzkgMTI5MDMvMTQyLzEzOQorZiAxMjkwMy8xNDIvMTQwIDEyOTAyLzE0My8xNDAgMTI4ODQvMTMyLzE0MAorZiAxMjg4Ni8xMzQvMTQxIDEyODg1LzEzMy8xNDEgMTI4OTIvMTQ0LzE0MQorZiAxMjg5Mi8xNDQvMTQxIDEyODkzLzE0NS8xNDEgMTI4ODYvMTM0LzE0MQorZiAxMjg4Ny8xMzUvMTQyIDEyODg2LzEzNC8xNDIgMTI4OTAvMTM3LzE0MgorZiAxMjg5MC8xMzcvMTM1IDEyODg5LzEzNi8xMzUgMTI4ODcvMTM1LzEzNQorZiAxMjg4My8xMzEvMTQyIDEyODgyLzEzMC8xNDIgMTI4ODgvMTM5LzE0MgorZiAxMjg4OC8xMzkvMTM1IDEyODkxLzEzOC8xMzUgMTI4ODMvMTMxLzEzNQorZiAxMjg4Ni8xMzQvMTM3IDEyODkzLzE0NS8xMzcgMTI4OTgvMTQwLzEzNworZiAxMjg5OC8xNDAvMTQzIDEyODkwLzEzNy8xNDMgMTI4ODYvMTM0LzE0MworZiAxMjkwMy8xNDIvMTM4IDEyODgzLzEzMS8xMzggMTI4OTEvMTM4LzEzOAorZiAxMjg5MS8xMzgvMTQ0IDEyODk5LzE0MS8xNDQgMTI5MDMvMTQyLzE0NAorZiAxMjg4OS8xNDYvMTQ1IDEyODg4LzE0Ny8xNDUgMTI4ODEvMTQ4LzE0NQorZiAxMjg4MS8xNDgvMTQ2IDEyODgwLzE0OS8xNDYgMTI4ODkvMTQ2LzE0NgorZiAxMjg4Mi8xNTAvMTQ3IDEyODg0LzE1MS8xNDcgMTI4OTUvMTUyLzE0NworZiAxMjg5NS8xNTIvMTQ3IDEyODk0LzE1My8xNDcgMTI4ODIvMTUwLzE0NworZiAxMjg4NS8xNTQvMTQ4IDEyODg3LzE1NS8xNDggMTI4OTcvMTU2LzE0OAorZiAxMjg5Ny8xNTYvMTQ5IDEyODk2LzE1Ny8xNDkgMTI4ODUvMTU0LzE0OQorZiAxMjg4NC8xNTEvMTUwIDEyOTAyLzE1OC8xNTAgMTI5MDAvMTU5LzE1MAorZiAxMjkwMC8xNTkvMTUwIDEyODk1LzE1Mi8xNTAgMTI4ODQvMTUxLzE1MAorZiAxMjg5Mi8xNjAvMTUxIDEyODg1LzE1NC8xNTEgMTI4OTYvMTU3LzE1MQorZiAxMjg5Ni8xNTcvMTUxIDEyOTAxLzE2MS8xNTEgMTI4OTIvMTYwLzE1MQorZiAxMjg4Ny8xNjIvMTUyIDEyODg5LzE0Ni8xNTIgMTI4ODAvMTQ5LzE1MgorZiAxMjg4MC8xNDkvMTQ1IDEyODk3LzE2My8xNDUgMTI4ODcvMTYyLzE0NQorZiAxMjg4OC8xNDcvMTQ1IDEyODgyLzE2NC8xNDUgMTI4OTQvMTY1LzE0NQorZiAxMjg5NC8xNjUvMTQ1IDEyODgxLzE0OC8xNDUgMTI4ODgvMTQ3LzE0NQorZiAxMjg4MS8xNDgvMTUzIDEyOTA0LzE2Ni8xNTMgMTI5MDUvMTY3LzE1MworZiAxMjkwNS8xNjcvMTUzIDEyODgwLzE0OS8xNTMgMTI4ODEvMTQ4LzE1MworZiAxMjg5NC8xNTMvMTU0IDEyODk1LzE1Mi8xNTQgMTI5MDYvMTY4LzE1NAorZiAxMjkwNi8xNjgvMTU1IDEyOTA3LzE2OS8xNTUgMTI4OTQvMTUzLzE1NQorZiAxMjg5Ny8xNTYvMTU2IDEyOTA4LzE3MC8xNTYgMTI5MDkvMTcxLzE1NgorZiAxMjkwOS8xNzEvMTU3IDEyODk2LzE1Ny8xNTcgMTI4OTcvMTU2LzE1NworZiAxMjkwMC8xNTkvMTU4IDEyOTEwLzE3Mi8xNTggMTI5MDYvMTY4LzE1OAorZiAxMjkwNi8xNjgvMTU4IDEyODk1LzE1Mi8xNTggMTI5MDAvMTU5LzE1OAorZiAxMjkwMS8xNjEvMTU5IDEyODk2LzE1Ny8xNTkgMTI5MDkvMTcxLzE1OQorZiAxMjkwOS8xNzEvMTU5IDEyOTExLzE3My8xNTkgMTI5MDEvMTYxLzE1OQorZiAxMjg4MC8xNDkvMTUzIDEyOTA1LzE2Ny8xNTMgMTI5MDgvMTc0LzE1MworZiAxMjkwOC8xNzQvMTUzIDEyODk3LzE2My8xNTMgMTI4ODAvMTQ5LzE1MworZiAxMjg5NC8xNjUvMTUzIDEyOTA3LzE3NS8xNTMgMTI5MDQvMTY2LzE1MworZiAxMjkwNC8xNjYvMTUzIDEyODgxLzE0OC8xNTMgMTI4OTQvMTY1LzE1MworZiAxMjkxMS8xNzMvMTYwIDEzMDk0LzE3Ni8xNjAgMTMwOTUvMTc3LzE2MAorZiAxMzA5NS8xNzcvMTYwIDEyOTAxLzE2MS8xNjAgMTI5MTEvMTczLzE2MAorZiAxMjkwMS8xNjEvMTYxIDEzMDk1LzE3Ny8xNjEgMTMwOTYvMTc4LzE2MQorZiAxMzA5Ni8xNzgvMTYyIDEyODkyLzE2MC8xNjIgMTI5MDEvMTYxLzE2MgorZiAxMjg5Mi8xNDQvMTYzIDEzMDk2LzE3OS8xNjMgMTMwOTcvMTgwLzE2MworZiAxMzA5Ny8xODAvMTY0IDEyODkzLzE0NS8xNjQgMTI4OTIvMTQ0LzE2NAorZiAxMjg5My8xNDUvMTY1IDEzMDk3LzE4MC8xNjUgMTMwOTgvMTgxLzE2NQorZiAxMzA5OC8xODEvMTY2IDEyODk4LzE0MC8xNjYgMTI4OTMvMTQ1LzE2NgorZiAxMjg5OC8xNDAvMTY1IDEzMDk4LzE4MS8xNjUgMTMwOTkvMTgyLzE2NQorZiAxMzA5OS8xODIvMTY3IDEyODk5LzE0MS8xNjcgMTI4OTgvMTQwLzE2NworZiAxMjg5OS8xNDEvMTY1IDEzMDk5LzE4Mi8xNjUgMTMxMDAvMTgzLzE2NQorZiAxMzEwMC8xODMvMTY2IDEyOTAzLzE0Mi8xNjYgMTI4OTkvMTQxLzE2NgorZiAxMjkwMy8xNDIvMTY4IDEzMTAwLzE4My8xNjggMTMxMDEvMTg0LzE2OAorZiAxMzEwMS8xODQvMTY5IDEyOTAyLzE0My8xNjkgMTI5MDMvMTQyLzE2OQorZiAxMjkwMi8xNTgvMTcwIDEzMTAxLzE4NS8xNzAgMTMxMDIvMTg2LzE3MAorZiAxMzEwMi8xODYvMTcxIDEyOTAwLzE1OS8xNzEgMTI5MDIvMTU4LzE3MQorZiAxMjkwMC8xNTkvMTcyIDEzMTAyLzE4Ni8xNzIgMTMxMDMvMTg3LzE3MgorZiAxMzEwMy8xODcvMTcyIDEyOTEwLzE3Mi8xNzIgMTI5MDAvMTU5LzE3MgorZiAxMzAzMi8xODgvMTczIDEzMDM0LzE4OS8xNzMgMTMwMzMvMTkwLzE3MworZiAxMzAzNS8xOTEvMTc0IDEzMDM3LzE5Mi8xNzQgMTMwMzYvMTkzLzE3NAorZiAxMzAzOS8xOTQvMTc1IDEzMDM4LzE5NS8xNzUgMTMwNDEvMTk2LzE3NQorZiAxMzA0MS8xOTYvMTc2IDEzMDQwLzE5Ny8xNzYgMTMwMzkvMTk0LzE3NgorZiAxMzA0MC8xOTcvMTc3IDEzMDQxLzE5Ni8xNzcgMTMwNDMvMTk4LzE3NworZiAxMzA0My8xOTgvMTc4IDEzMDQyLzE5OS8xNzggMTMwNDAvMTk3LzE3OAorZiAxMzAzNC8xODkvMTc5IDEzMDQ0LzIwMC8xNzkgMTMwNDUvMjAxLzE3OQorZiAxMzA0NS8yMDEvMTgwIDEzMDMzLzE5MC8xODAgMTMwMzQvMTg5LzE4MAorZiAxMzAzNi8xOTMvMTgxIDEzMDQ2LzIwMi8xODEgMTMwNDcvMjAzLzE4MQorZiAxMzA0Ny8yMDMvMTgyIDEzMDM1LzE5MS8xODIgMTMwMzYvMTkzLzE4MgorZiAxMzAzNy8xOTIvMTgzIDEzMDM5LzE5NC8xODMgMTMwNDAvMTk3LzE4MworZiAxMzA0MC8xOTcvMTgzIDEzMDM2LzE5My8xODMgMTMwMzcvMTkyLzE4MworZiAxMzAzMy8xOTAvMTgzIDEzMDQxLzE5Ni8xODMgMTMwMzgvMTk1LzE4MworZiAxMzAzOC8xOTUvMTg0IDEzMDMyLzE4OC8xODQgMTMwMzMvMTkwLzE4NAorZiAxMzAzNi8xOTMvMTg1IDEzMDQwLzE5Ny8xODUgMTMwNDIvMTk5LzE4NQorZiAxMzA0Mi8xOTkvMTg2IDEzMDQ2LzIwMi8xODYgMTMwMzYvMTkzLzE4NgorZiAxMzA0NS8yMDEvMTg2IDEzMDQzLzE5OC8xODYgMTMwNDEvMTk2LzE4NgorZiAxMzA0MS8xOTYvMTg3IDEzMDMzLzE5MC8xODcgMTMwNDUvMjAxLzE4NworZiAxMzAzOS8yMDQvMTg4IDEzMDQ4LzIwNS8xODggMTMwNDkvMjA2LzE4OAorZiAxMzA0OS8yMDYvMTg5IDEzMDM4LzIwNy8xODkgMTMwMzkvMjA0LzE4OQorZiAxMzAzMi8yMDgvMTkwIDEzMDUwLzIwOS8xOTAgMTMwNTEvMjEwLzE5MAorZiAxMzA1MS8yMTAvMTkwIDEzMDM0LzIxMS8xOTAgMTMwMzIvMjA4LzE5MAorZiAxMzAzNS8yMTIvMTkxIDEzMDUyLzIxMy8xOTEgMTMwNTMvMjE0LzE5MQorZiAxMzA1My8yMTQvMTkyIDEzMDM3LzIxNS8xOTIgMTMwMzUvMjEyLzE5MgorZiAxMzAzNC8yMTEvMTkzIDEzMDUxLzIxMC8xOTMgMTMwNTQvMjE2LzE5MworZiAxMzA1NC8yMTYvMTkzIDEzMDQ0LzIxNy8xOTMgMTMwMzQvMjExLzE5MworZiAxMzA0Ny8yMTgvMTk0IDEzMDU1LzIxOS8xOTQgMTMwNTIvMjEzLzE5NAorZiAxMzA1Mi8yMTMvMTk0IDEzMDM1LzIxMi8xOTQgMTMwNDcvMjE4LzE5NAorZiAxMzAzNy8yMjAvMTg5IDEzMDUzLzIyMS8xODkgMTMwNDgvMjA1LzE4OQorZiAxMzA0OC8yMDUvMTk1IDEzMDM5LzIwNC8xOTUgMTMwMzcvMjIwLzE5NQorZiAxMzAzOC8yMDcvMTg4IDEzMDQ5LzIwNi8xODggMTMwNTAvMjIyLzE4OAorZiAxMzA1MC8yMjIvMTg5IDEzMDMyLzIyMy8xODkgMTMwMzgvMjA3LzE4OQorZiAxMzA0OS8yMDYvMTk2IDEzMDQ4LzIwNS8xOTYgMTMwNTcvMjI0LzE5NgorZiAxMzA1Ny8yMjQvMTk2IDEzMDU2LzIyNS8xOTYgMTMwNDkvMjA2LzE5NgorZiAxMzA1MC8yMDkvMTk3IDEzMDU5LzIyNi8xOTcgMTMwNTgvMjI3LzE5NworZiAxMzA1OC8yMjcvMTk4IDEzMDUxLzIxMC8xOTggMTMwNTAvMjA5LzE5OAorZiAxMzA1My8yMTQvMTk5IDEzMDUyLzIxMy8xOTkgMTMwNjEvMjI4LzE5OQorZiAxMzA2MS8yMjgvMjAwIDEzMDYwLzIyOS8yMDAgMTMwNTMvMjE0LzIwMAorZiAxMzA1NC8yMTYvMjAxIDEzMDUxLzIxMC8yMDEgMTMwNTgvMjI3LzIwMQorZiAxMzA1OC8yMjcvMjAxIDEzMDYyLzIzMC8yMDEgMTMwNTQvMjE2LzIwMQorZiAxMzA1NS8yMTkvMjAyIDEzMDYzLzIzMS8yMDIgMTMwNjEvMjI4LzIwMgorZiAxMzA2MS8yMjgvMjAyIDEzMDUyLzIxMy8yMDIgMTMwNTUvMjE5LzIwMgorZiAxMzA0OC8yMDUvMTk2IDEzMDUzLzIyMS8xOTYgMTMwNjAvMjMyLzE5NgorZiAxMzA2MC8yMzIvMTk2IDEzMDU3LzIyNC8xOTYgMTMwNDgvMjA1LzE5NgorZiAxMzA1MC8yMjIvMTk2IDEzMDQ5LzIwNi8xOTYgMTMwNTYvMjI1LzE5NgorZiAxMzA1Ni8yMjUvMTk2IDEzMDU5LzIzMy8xOTYgMTMwNTAvMjIyLzE5NgorZiAxMzA2My8yMzEvMjAzIDEzMDU1LzIxOS8yMDMgMTMwOTUvMTc3LzIwMworZiAxMzA5NS8xNzcvMjAzIDEzMDk0LzE3Ni8yMDMgMTMwNjMvMjMxLzIwMworZiAxMzA1NS8yMTkvMjA0IDEzMDQ3LzIxOC8yMDQgMTMwOTYvMTc4LzIwNAorZiAxMzA5Ni8xNzgvMjA0IDEzMDk1LzE3Ny8yMDQgMTMwNTUvMjE5LzIwNAorZiAxMzA0Ny8yMDMvMjA1IDEzMDQ2LzIwMi8yMDUgMTMwOTcvMTgwLzIwNQorZiAxMzA5Ny8xODAvMjA1IDEzMDk2LzE3OS8yMDUgMTMwNDcvMjAzLzIwNQorZiAxMzA0Ni8yMDIvMTY2IDEzMDQyLzE5OS8xNjYgMTMwOTgvMTgxLzE2NgorZiAxMzA5OC8xODEvMTY1IDEzMDk3LzE4MC8xNjUgMTMwNDYvMjAyLzE2NQorZiAxMzA0Mi8xOTkvMTY2IDEzMDQzLzE5OC8xNjYgMTMwOTkvMTgyLzE2NgorZiAxMzA5OS8xODIvMjA2IDEzMDk4LzE4MS8yMDYgMTMwNDIvMTk5LzIwNgorZiAxMzA0My8xOTgvMjA2IDEzMDQ1LzIwMS8yMDYgMTMxMDAvMTgzLzIwNgorZiAxMzEwMC8xODMvMjA2IDEzMDk5LzE4Mi8yMDYgMTMwNDMvMTk4LzIwNgorZiAxMzA0NS8yMDEvMjA3IDEzMDQ0LzIwMC8yMDcgMTMxMDEvMTg0LzIwNworZiAxMzEwMS8xODQvMjA4IDEzMTAwLzE4My8yMDggMTMwNDUvMjAxLzIwOAorZiAxMzA0NC8yMTcvMjA5IDEzMDU0LzIxNi8yMDkgMTMxMDIvMTg2LzIwOQorZiAxMzEwMi8xODYvMjEwIDEzMTAxLzE4NS8yMTAgMTMwNDQvMjE3LzIxMAorZiAxMzA1NC8yMTYvMjExIDEzMDYyLzIzMC8yMTEgMTMxMDMvMTg3LzIxMQorZiAxMzEwMy8xODcvMjExIDEzMTAyLzE4Ni8yMTEgMTMwNTQvMjE2LzIxMQorZiAxMzE5Ny8yMzQvMjEyIDEzMTk0LzIzNS8yMTIgMTMxOTUvMjM2LzIxMgorZiAxMzE5NS8yMzYvMjEzIDEzMTk2LzIzNy8yMTMgMTMxOTcvMjM0LzIxMworZiAxMzE5OC8yMzgvMjE0IDEzMTk5LzIzOS8yMTQgMTMyMDAvMjQwLzIxNAorZiAxMzIwMC8yNDAvMjE0IDEzMjAxLzI0MS8yMTQgMTMxOTgvMjM4LzIxNAorZiAxMzIwMS8yNDIvMjE1IDEzMjAwLzI0My8yMTUgMTMyMDIvMjQ0LzIxNQorZiAxMzIwMi8yNDQvMjE1IDEzMjAzLzI0NS8yMTUgMTMyMDEvMjQyLzIxNQorZiAxMzgzNi8yNDYvMjE2IDEzODM3LzI0Ny8yMTYgMTMyMDQvMjQ4LzIxNgorZiAxMzIwNC8yNDkvMjE2IDEzMjA1LzI1MC8yMTYgMTM4MzgvMjUxLzIxNgorZiAxMzIwNS8yNTIvMjE3IDEzMjA0LzI1My8yMTcgMTMyMDYvMjU0LzIxNworZiAxMzIwNi8yNTQvMjE3IDEzMjA3LzI1NS8yMTcgMTMyMDUvMjUyLzIxNworZiAxMzIwOS8yNTYvMjE4IDEzMjA3LzI1NS8yMTggMTMyMDYvMjU0LzIxOAorZiAxMzIwNi8yNTQvMjE4IDEzMjA4LzI1Ny8yMTggMTMyMDkvMjU2LzIxOAorZiAxMzIxMS8yNTgvMjE5IDEzMjEyLzI1OS8yMTkgMTMyMTMvMjYwLzIxOQorZiAxMzIxMy8yNjAvMjIwIDEzMjEwLzI2MS8yMjAgMTMyMTEvMjU4LzIyMAorZiAxMzIxNi8yNjIvMjIxIDEzMjE3LzI2My8yMjEgMTMyMTQvMjY0LzIyMQorZiAxMzIxNC8yNjQvMjIxIDEzMjE1LzI2NS8yMjEgMTMyMTYvMjYyLzIyMQorZiAxMzIxOC8yNjYvMjIxIDEzMjE5LzI2Ny8yMjEgMTMyMTcvMjYzLzIyMQorZiAxMzIxNy8yNjMvMjIxIDEzMjE2LzI2Mi8yMjEgMTMyMTgvMjY2LzIyMQorZiAxMzIyMC8yNjgvMjIxIDEzMjIxLzI2OS8yMjEgMTM4MzkvMjY3LzIyMQorZiAxMzg0MC8yNzAvMjIxIDEzODQxLzI3MS8yMjEgMTMyMjAvMjcyLzIyMQorZiAxMzIyMi8yNzMvMjIxIDEzMjIzLzI3NC8yMjEgMTMyMjEvMjY5LzIyMQorZiAxMzIyMS8yNjkvMjIxIDEzMjIwLzI2OC8yMjEgMTMyMjIvMjczLzIyMQorZiAxMzIyMy8yNzQvMjIxIDEzMjIyLzI3My8yMjEgMTMyMjQvMjc1LzIyMQorZiAxMzIyNC8yNzUvMjIxIDEzMjI1LzI3Ni8yMjEgMTMyMjMvMjc0LzIyMQorZiAxMzIyNC8yNzUvMjIxIDEzMjI4LzI3Ny8yMjEgMTMyMjYvMjc4LzIyMQorZiAxMzIyNi8yNzgvMjIxIDEzMjI3LzI3OS8yMjEgMTMyMjQvMjc1LzIyMQorZiAxMzIyOS8yODAvMjIxIDEzMjI4LzI3Ny8yMjEgMTMyMzAvMjgxLzIyMQorZiAxMzIzMC8yODEvMjIxIDEzMjMxLzI4Mi8yMjEgMTMyMjkvMjgwLzIyMQorZiAxMzIzMi8yODMvMjIxIDEzMjMzLzI4NC8yMjEgMTMyMjkvMjgwLzIyMQorZiAxMzIyOS8yODAvMjE5IDEzMjMxLzI4Mi8yMTkgMTMyMzIvMjgzLzIxOQorZiAxMzIzMi8yODMvMjE5IDEzMjM0LzI4NS8yMTkgMTMyMzUvMjg2LzIxOQorZiAxMzIzNS8yODYvMjIxIDEzMjMzLzI4NC8yMjEgMTMyMzIvMjgzLzIyMQorZiAxMzIzNi8yODcvMjE5IDEzMjM1LzI4Ni8yMTkgMTMyMzcvMjg4LzIxOQorZiAxMzIyNy8yNzkvMjIxIDEzMjI2LzI3OC8yMjEgMTMyMzgvMjg5LzIyMQorZiAxMzIzNy8yODgvMjIxIDEzMjM5LzI5MC8yMjEgMTMyMTEvMjU4LzIyMQorZiAxMzIxMS8yNTgvMjIxIDEzMjM2LzI4Ny8yMjEgMTMyMzcvMjg4LzIyMQorZiAxMzIxMC8yNjEvMjIxIDEzMjM2LzI4Ny8yMjEgMTMyMTEvMjU4LzIyMQorZiAxMzI0MC8yOTEvMjIyIDEzMjQxLzI5Mi8yMjIgMTMyNDIvMjkzLzIyMgorZiAxMzI0Mi8yOTMvMjIzIDEzMjQzLzI5NC8yMjMgMTMyNDAvMjkxLzIyMworZiAxMzI0My8yOTQvMjI0IDEzMjQyLzI5My8yMjQgMTMyNDQvMjk1LzIyNAorZiAxMzI0NC8yOTUvMjI1IDEzMjQ1LzI5Ni8yMjUgMTMyNDMvMjk0LzIyNQorZiAxMzI0NS8yOTcvMjI2IDEzMjQ0LzI5OC8yMjYgMTMyNDYvMjk5LzIyNgorZiAxMzI0Ni8yOTkvMjI2IDEzMjQ3LzMwMC8yMjYgMTMyNDUvMjk3LzIyNgorZiAxMzI0Ny8zMDAvMjI3IDEzMjQ2LzI5OS8yMjcgMTMyNDgvMzAxLzIyNworZiAxMzI0OC8zMDEvMjI4IDEzMjQ5LzMwMi8yMjggMTMyNDcvMzAwLzIyOAorZiAxMzI0OS8zMDMvMjI5IDEzMjQ4LzMwNC8yMjkgMTMyNTAvMzA1LzIyOQorZiAxMzI1MC8zMDUvMjI5IDEzMjUxLzMwNi8yMjkgMTMyNDkvMzAzLzIyOQorZiAxMzI1MS8zMDYvMjMwIDEzMjUwLzMwNS8yMzAgMTMyNTIvMzA3LzIzMAorZiAxMzI1Mi8zMDcvMjMwIDEzMjUzLzMwOC8yMzAgMTMyNTEvMzA2LzIzMAorZiAxMzI1My8zMDgvMjMxIDEzMjUyLzMwNy8yMzEgMTMyNTQvMzA5LzIzMQorZiAxMzI1NC8zMDkvMjMyIDEzMjU1LzMxMC8yMzIgMTMyNTMvMzA4LzIzMgorZiAxMzI1NS8zMTAvMjMzIDEzMjU0LzMwOS8yMzMgMTMyNTYvMzExLzIzMworZiAxMzI1Ni8zMTEvMjMzIDEzMjU3LzMxMi8yMzMgMTMyNTUvMzEwLzIzMworZiAxMzI1Ny8zMTMvMjM0IDEzMjU2LzMxNC8yMzQgMTMyNTgvMzE1LzIzNAorZiAxMzI1OC8zMTUvMjM1IDEzMjU5LzMxNi8yMzUgMTMyNTcvMzEzLzIzNQorZiAxMzI1OS8zMTYvMjM2IDEzMjU4LzMxNS8yMzYgMTMyNjAvMzE3LzIzNgorZiAxMzI2MC8zMTcvMjM3IDEzMjYxLzMxOC8yMzcgMTMyNTkvMzE2LzIzNworZiAxMzI2MS8zMTkvMjM4IDEzMjYwLzMyMC8yMzggMTMyNjIvMzIxLzIzOAorZiAxMzI2Mi8zMjEvMjM5IDEzMjYzLzMyMi8yMzkgMTMyNjEvMzE5LzIzOQorZiAxMzI2My8zMjIvMjQwIDEzMjYyLzMyMS8yNDAgMTMyNDEvMjkyLzI0MAorZiAxMzI0MS8yOTIvMjQxIDEzMjQwLzI5MS8yNDEgMTMyNjMvMzIyLzI0MQorZiAxMzI0MC8zMjMvMjQyIDEzMjQzLzMyNC8yNDIgMTMyNjQvMzI1LzI0MgorZiAxMzI2NC8zMjUvMjQzIDEzMjY1LzMyNi8yNDMgMTMyNDAvMzIzLzI0MworZiAxMzI0My8zMjQvMjQ0IDEzMjQ1LzMyNy8yNDQgMTMyNjYvMzI4LzI0NAorZiAxMzI2Ni8zMjgvMjQ1IDEzMjY0LzMyNS8yNDUgMTMyNDMvMzI0LzI0NQorZiAxMzI0NS8zMjcvMjQ2IDEzMjQ3LzMyOS8yNDYgMTMyNjcvMzMwLzI0NgorZiAxMzI2Ny8zMzAvMjQ3IDEzMjY2LzMyOC8yNDcgMTMyNDUvMzI3LzI0NworZiAxMzI0Ny8zMjkvMjQ4IDEzMjQ5LzMzMS8yNDggMTMyNjgvMzMyLzI0OAorZiAxMzI2OC8zMzIvMjQ5IDEzMjY3LzMzMC8yNDkgMTMyNDcvMzI5LzI0OQorZiAxMzI0OS8zMzEvMjUwIDEzMjUxLzMzMy8yNTAgMTMyNjkvMzM0LzI1MAorZiAxMzI2OS8zMzQvMjUxIDEzMjY4LzMzMi8yNTEgMTMyNDkvMzMxLzI1MQorZiAxMzI1MS8zMzMvMjUyIDEzMjUzLzMzNS8yNTIgMTMyNzAvMzM2LzI1MgorZiAxMzI3MC8zMzYvMjUzIDEzMjY5LzMzNC8yNTMgMTMyNTEvMzMzLzI1MworZiAxMzI1My8zMzUvMjU0IDEzMjU1LzMzNy8yNTQgMTMyMzAvMjgxLzI1NAorZiAxMzIzMC8yODEvMjU1IDEzMjcwLzMzNi8yNTUgMTMyNTMvMzM1LzI1NQorZiAxMzI1NS8zMzcvMjU2IDEzMjU3LzMzOC8yNTYgMTMyMzEvMjgyLzI1NgorZiAxMzIzMS8yODIvMjU3IDEzMjMwLzI4MS8yNTcgMTMyNTUvMzM3LzI1NworZiAxMzI1Ny8zMzgvMjU4IDEzMjU5LzMzOS8yNTggMTMyMzIvMjgzLzI1OAorZiAxMzIzMi8yODMvMjU5IDEzMjMxLzI4Mi8yNTkgMTMyNTcvMzM4LzI1OQorZiAxMzI1OS8zMzkvMjYwIDEzMjYxLzM0MC8yNjAgMTMyMzQvMjg1LzI2MAorZiAxMzIzNC8yODUvMjYxIDEzMjMyLzI4My8yNjEgMTMyNTkvMzM5LzI2MQorZiAxMzI2MS8zNDAvMjYyIDEzMjYzLzM0MS8yNjIgMTMyNzEvMzQyLzI2MgorZiAxMzI3MS8zNDIvMjYzIDEzMjM0LzI4NS8yNjMgMTMyNjEvMzQwLzI2MworZiAxMzI2My8zNDEvMjY0IDEzMjQwLzMyMy8yNjQgMTMyNjUvMzI2LzI2NAorZiAxMzI2NS8zMjYvMjY1IDEzMjcxLzM0Mi8yNjUgMTMyNjMvMzQxLzI2NQorZiAxMzE5OC8yMzgvMjY2IDEzMTk3LzIzNC8yNjYgMTMxOTYvMjM3LzI2NgorZiAxMzE5Ni8yMzcvMjY2IDEzMTk5LzIzOS8yNjYgMTMxOTgvMjM4LzI2NgorZiAxMzI3My8zNDMvMjY3IDEzMjA5LzI1Ni8yNjcgMTMyMDgvMjU3LzI2NworZiAxMzIwOC8yNTcvMjY4IDEzMjcyLzM0NC8yNjggMTMyNzMvMzQzLzI2OAorZiAxMzIzOS8yOTAvMjIwIDEzMjE1LzI2NS8yMjAgMTMyMTQvMjY0LzIyMAorZiAxMzIxNC8yNjQvMjE5IDEzMjEyLzI1OS8yMTkgMTMyMzkvMjkwLzIxOQorZiAxMzIyNS8yNzYvMjIxIDEzMjI3LzI3OS8yMjEgMTMyMzgvMjg5LzIyMQorZiAxMzIzOC8yODkvMjE5IDEzMjc0LzM0NS8yMTkgMTMyMjUvMjc2LzIxOQorZiAxMzIxMy8yNjAvMjY5IDEzMjEyLzI1OS8yNjkgMTMxOTYvMzQ2LzI2OQorZiAxMzE5Ni8zNDYvMjcwIDEzMTk1LzM0Ny8yNzAgMTMyMTMvMjYwLzI3MAorZiAxMzIxNC8yNjQvMjcxIDEzMjE3LzI2My8yNzEgMTMyMDAvMzQ4LzI3MQorZiAxMzIwMC8yNDAvMjcyIDEzMTk5LzIzOS8yNzIgMTMyMTQvMzQ5LzI3MgorZiAxMzIxNy8yNjMvMjczIDEzMjE5LzI2Ny8yNzMgMTMyMDIvMzUwLzI3MworZiAxMzIwMi8yNDQvMjc0IDEzMjAwLzI0My8yNzQgMTMyMTcvMjQzLzI3NAorZiAxMzIxOS8zNTEvMjc1IDEzMjIxLzM1Mi8yNzUgMTMyMDQvMzUzLzI3NQorZiAxMzIwNC8zNTQvMjc2IDEzMjAyLzM1MC8yNzYgMTMyMTkvMjY3LzI3NgorZiAxMzIyMS8yNjkvMjc3IDEzMjIzLzI3NC8yNzcgMTMyMDYvMjc0LzI3NworZiAxMzIwNi8yNzQvMjc4IDEzMjA0LzM1NC8yNzggMTMyMjEvMjY5LzI3OAorZiAxMzIyMy8yNzQvMjc5IDEzMjI1LzI3Ni8yNzkgMTMyMDgvMzU1LzI3OQorZiAxMzIwOC8zNTUvMjgwIDEzMjA2LzI3NC8yODAgMTMyMjMvMjc0LzI4MAorZiAxMzIxMi8yNTkvMjgxIDEzMjE0LzI2NC8yODEgMTMxOTkvMzU2LzI4MQorZiAxMzE5OS8zNTYvMjgyIDEzMTk2LzM0Ni8yODIgMTMyMTIvMjU5LzI4MgorZiAxMzIyNS8yNzYvMjgzIDEzMjc0LzM0NS8yODMgMTMyNzIvMzU3LzI4MworZiAxMzI3Mi8zNTcvMjg0IDEzMjA4LzM1NS8yODQgMTMyMjUvMjc2LzI4NAorZiAxMzI2NC8zMjUvMjIxIDEzMjY2LzMyOC8yMjEgMTMyMTYvMjYyLzIyMQorZiAxMzIxNi8yNjIvMjIxIDEzMjE1LzI2NS8yMjEgMTMyNjQvMzI1LzIyMQorZiAxMzI2Ni8zMjgvMjIwIDEzMjY3LzMzMC8yMjAgMTMyMTgvMjY2LzIyMAorZiAxMzIxOC8yNjYvMjE5IDEzMjE2LzI2Mi8yMTkgMTMyNjYvMzI4LzIxOQorZiAxMzI2Ny8zMzAvMjIxIDEzMjY4LzMzMi8yMjEgMTMyMjAvMjY4LzIyMQorZiAxMzIyMC8yNjgvMjIwIDEzODQyLzI2Ni8yMjAgMTMyNjcvMzMwLzIyMAorZiAxMzI2OC8zMzIvMjIxIDEzMjY5LzMzNC8yMjEgMTMyMjIvMjczLzIyMQorZiAxMzIyMi8yNzMvMjIxIDEzMjIwLzI2OC8yMjEgMTMyNjgvMzMyLzIyMQorZiAxMzI2OS8zMzQvMjIxIDEzMjcwLzMzNi8yMjEgMTMyMjQvMjc1LzIyMQorZiAxMzIyNC8yNzUvMjIxIDEzMjIyLzI3My8yMjEgMTMyNjkvMzM0LzIyMQorZiAxMzI3MC8zMzYvMjIxIDEzMjMwLzI4MS8yMjEgMTMyMjgvMjc3LzIyMQorZiAxMzIyOC8yNzcvMjIxIDEzMjI0LzI3NS8yMjEgMTMyNzAvMzM2LzIyMQorZiAxMzI3MS8zNDIvMjg1IDEzMjY1LzMyNi8yODUgMTMyMzkvMjkwLzI4NQorZiAxMzIzOS8yOTAvMjIwIDEzMjM3LzI4OC8yMjAgMTMyNzEvMzQyLzIyMAorZiAxMzIzOS8yOTAvMjg2IDEzMjY1LzMyNi8yODYgMTMyNjQvMzI1LzI4NgorZiAxMzI2NC8zMjUvMjE5IDEzMjE1LzI2NS8yMTkgMTMyMzkvMjkwLzIxOQorZiAxMzIzNC8yODUvMjIxIDEzMjcxLzM0Mi8yMjEgMTMyMzcvMjg4LzIyMQorZiAxMzIzNy8yODgvMjIwIDEzMjM1LzI4Ni8yMjAgMTMyMzQvMjg1LzIyMAorZiAxMzIyOC8yNzcvMjIxIDEzMjI5LzI4MC8yMjEgMTMyMjYvMjc4LzIyMQorZiAxMzIxMi8yNTkvMjIwIDEzMjExLzI1OC8yMjAgMTMyMzkvMjkwLzIyMAorZiAxMzIyNC8yNzUvMjIwIDEzMjI3LzI3OS8yMjAgMTMyMjUvMjc2LzIyMAorZiAxMzI3Ny8zNTgvMjg3IDEzMjc4LzM1OC8yODcgMTMyNzUvMzU4LzI4NworZiAxMzI3NS8zNTgvMjg4IDEzMjc2LzM1OC8yODggMTMyNzcvMzU4LzI4OAorZiAxMzI4MC8zNTkvMjg5IDEzMjgxLzM2MC8yODkgMTMyNzkvMzYwLzI4OQorZiAxMzI3OS8zNjAvMjkwIDEzMjc3LzM1OC8yOTAgMTMyODAvMzU5LzI5MAorZiAxMzI3NS8zNTgvMjkxIDEzMjgyLzM2MS8yOTEgMTMyODMvMzYyLzI5MQorZiAxMzI4My8zNjIvMjkyIDEzMjc2LzM1OC8yOTIgMTMyNzUvMzU4LzI5MgorZiAxMzI4NS8zNjMvMjkzIDEzMjc2LzM1OC8yOTMgMTMyODMvMzYyLzI5MworZiAxMzI4My8zNjIvMjk0IDEzMjg0LzM2NC8yOTQgMTMyODUvMzYzLzI5NAorZiAxMzI4Ny8zNjIvMjk1IDEzMjgzLzM2Mi8yOTUgMTMyODIvMzYxLzI5NQorZiAxMzI4Mi8zNjEvMjk2IDEzMjg2LzM2MS8yOTYgMTMyODcvMzYyLzI5NgorZiAxMzI4My8zNjIvMjk3IDEzMjg3LzM2Mi8yOTcgMTMyODgvMzY0LzI5NworZiAxMzI4OC8zNjQvMjk4IDEzMjg0LzM2NC8yOTggMTMyODMvMzYyLzI5OAorZiAxMzI5MS8zNjUvMjk5IDEzMjg2LzM2MS8yOTkgMTMyODkvMzY2LzI5OQorZiAxMzI4OS8zNjYvMzAwIDEzMjkwLzM2Ni8zMDAgMTMyOTEvMzY1LzMwMAorZiAxMzI4Ny8zNjIvMzAxIDEzMjkyLzM2Ny8zMDEgMTMyOTMvMzY4LzMwMQorZiAxMzI5My8zNjgvMzAyIDEzMjg4LzM2NC8zMDIgMTMyODcvMzYyLzMwMgorZiAxMzI5NC8zNjkvMzAzIDEzMjk1LzM3MC8zMDMgMTMyOTYvMzcwLzMwMworZiAxMzI5Ni8zNzAvMzA0IDEzMjk3LzM2OS8zMDQgMTMyOTQvMzY5LzMwNAorZiAxMzI5OC8zNzEvMzA1IDEzMjk5LzM3Mi8zMDUgMTMzMDAvMzczLzMwNQorZiAxMzMwMC8zNzMvMzA2IDEzMzAxLzM3NC8zMDYgMTMyOTgvMzcxLzMwNgorZiAxMzI5MS8zNzUvMzA3IDEzMjkwLzM3Ni8zMDcgMTMyOTUvMzcwLzMwNworZiAxMzI5NS8zNzAvMzA4IDEzMjk0LzM2OS8zMDggMTMyOTEvMzc1LzMwOAorZiAxMzI5Mi8zNzEvMzA5IDEzMjk4LzM3MS8zMDkgMTMzMDEvMzc0LzMwOQorZiAxMzMwMS8zNzQvMzEwIDEzMjkzLzM3NC8zMTAgMTMyOTIvMzcxLzMxMAorZiAxMzI4Mi8zNjEvMzExIDEzMzAyLzM2MS8zMTEgMTMyODYvMzYxLzMxMQorZiAxMzMwNS8zNzcvMzEyIDEzMzA2LzM3Ny8zMTIgMTMzMDMvMzc3LzMxMgorZiAxMzMwMy8zNzcvMzEzIDEzMzA0LzM3Ny8zMTMgMTMzMDUvMzc3LzMxMworZiAxMzMwOS8zNzcvMzE0IDEzMzA1LzM3Ny8zMTQgMTMzMDcvMzc3LzMxNAorZiAxMzMwNy8zNzcvMzE1IDEzMzA4LzM3Ny8zMTUgMTMzMDkvMzc3LzMxNQorZiAxMzMwMy8zNzcvMzE2IDEzMzA2LzM3Ny8zMTYgMTMzMTAvMzc4LzMxNgorZiAxMzMxMC8zNzgvMzE3IDEzMzExLzM2MS8zMTcgMTMzMDMvMzc3LzMxNworZiAxMzMwNi8zNzcvMzE4IDEzMzEyLzM3Ny8zMTggMTMzMTMvMzc5LzMxOAorZiAxMzMxMy8zNzkvMzE5IDEzMzEwLzM3OC8zMTkgMTMzMDYvMzc3LzMxOQorZiAxMzMxMS8zNjEvMzIwIDEzMzEwLzM3OC8zMjAgMTMzMTQvMzgwLzMyMAorZiAxMzMxNC8zODAvMzIxIDEzMjg5LzM2Ni8zMjEgMTMzMTEvMzYxLzMyMQorZiAxMzMxMC8zNzgvMzIyIDEzMzEzLzM3OS8zMjIgMTMzMTUvMzgxLzMyMgorZiAxMzMxNS8zODEvMzIzIDEzMzE0LzM4MC8zMjMgMTMzMTAvMzc4LzMyMworZiAxMzMxNC8zODAvMzI0IDEzMzE1LzM4MS8zMjQgMTMzMTYvMzgxLzMyNAorZiAxMzMxNi8zODEvMzI1IDEzMzE3LzM4MC8zMjUgMTMzMTQvMzgwLzMyNQorZiAxMzMyMS8zODIvMzI2IDEzMzE4LzM4My8zMjYgMTMzMTkvMzg0LzMyNgorZiAxMzMxOS8zODQvMzI3IDEzMzIwLzM4NS8zMjcgMTMzMjEvMzgyLzMyNworZiAxMzMxNy8zODMvMzI4IDEzMzE2LzM4Ni8zMjggMTMzMTkvMzg0LzMyOAorZiAxMzMxOS8zODQvMzI5IDEzMzE4LzM4My8zMjkgMTMzMTcvMzgzLzMyOQorZiAxMzMxMS8zNjEvMzMwIDEzMjg5LzM2Ni8zMzAgMTMzMjIvMzYxLzMzMAorZiAxMzMyNS8zNTkvMzMxIDEzMzI2LzM1OS8zMzEgMTMzMjMvMzg3LzMzMQorZiAxMzMyMy8zODcvMzMyIDEzMzI0LzM4Ny8zMzIgMTMzMjUvMzU5LzMzMgorZiAxMzMyOS8zNTkvMzMzIDEzMzI1LzM1OS8zMzMgMTMzMjcvMzU5LzMzMworZiAxMzMyNy8zNTkvMzM0IDEzMzI4LzM1OS8zMzQgMTMzMjkvMzU5LzMzNAorZiAxMzMyMy8zODcvMzM1IDEzMzI2LzM1OS8zMzUgMTMzMzAvMzg4LzMzNQorZiAxMzMzMC8zODgvMzM2IDEzMzMxLzM4OS8zMzYgMTMzMjMvMzg3LzMzNgorZiAxMzMyNi8zNTkvMzM3IDEzMzMyLzM1OS8zMzcgMTMzMzMvMzY0LzMzNworZiAxMzMzMy8zNjQvMzM4IDEzMzMwLzM4OC8zMzggMTMzMjYvMzU5LzMzOAorZiAxMzMzNS8zODkvMzM5IDEzMzMxLzM4OS8zMzkgMTMzMzAvMzg4LzMzOQorZiAxMzMzMC8zODgvMzQwIDEzMzM0LzM5MC8zNDAgMTMzMzUvMzg5LzM0MAorZiAxMzMzMC8zODgvMzQxIDEzMzMzLzM2NC8zNDEgMTMzMzYvMzkxLzM0MQorZiAxMzMzNi8zOTEvMzQyIDEzMzM0LzM5MC8zNDIgMTMzMzAvMzg4LzM0MgorZiAxMzMzOS8zOTIvMzQzIDEzMzM3LzM5Mi8zNDMgMTMzMzUvMzg5LzM0MworZiAxMzMzNS8zODkvMzQ0IDEzMzM4LzM5My8zNDQgMTMzMzkvMzkyLzM0NAorZiAxMzMzNC8zOTAvMzQ1IDEzMzM2LzM5MS8zNDUgMTMzNDAvMzkxLzM0NQorZiAxMzM0MC8zOTEvMzQ2IDEzMzQxLzM5MC8zNDYgMTMzMzQvMzkwLzM0NgorZiAxMzM0Mi8zOTQvMzQ3IDEzMzQzLzM5NS8zNDcgMTMzNDQvMzk1LzM0NworZiAxMzM0NC8zOTUvMzQ3IDEzMzQ1LzM5NC8zNDcgMTMzNDIvMzk0LzM0NworZiAxMzM0OS8zOTYvMzQ4IDEzMzQ2LzM5Ny8zNDggMTMzNDcvMzk4LzM0OAorZiAxMzM0Ny8zOTgvMzQ5IDEzMzQ4LzM5OS8zNDkgMTMzNDkvMzk2LzM0OQorZiAxMzMzOS80MDAvMzUwIDEzMzM4LzQwMS8zNTAgMTMzNDMvMzk1LzM1MAorZiAxMzM0My8zOTUvMzUxIDEzMzQyLzM5NC8zNTEgMTMzMzkvNDAwLzM1MQorZiAxMzM0MS8zOTcvMzUyIDEzMzQwLzM5OC8zNTIgMTMzNDcvMzk4LzM1MgorZiAxMzM0Ny8zOTgvMzUzIDEzMzQ2LzM5Ny8zNTMgMTMzNDEvMzk3LzM1MworZiAxMzMzMS8zODkvMzU0IDEzMzM1LzM4OS8zNTQgMTMzNTAvMzg5LzM1NAorZiAxMzM1My80MDIvMzU1IDEzMzU0LzQwMi8zNTUgMTMzNTEvNDAyLzM1NQorZiAxMzM1MS80MDIvMzU2IDEzMzUyLzQwMi8zNTYgMTMzNTMvNDAyLzM1NgorZiAxMzM1Ni80MDMvMzU3IDEzMzU3LzQwMi8zNTcgMTMzNTUvNDAyLzM1NworZiAxMzM1NS80MDIvMzU4IDEzMzUzLzQwMi8zNTggMTMzNTYvNDAzLzM1OAorZiAxMzM1MS80MDIvMzU5IDEzMzU4LzM4OS8zNTkgMTMzNTkvNDA0LzM1OQorZiAxMzM1OS80MDQvMzYwIDEzMzUyLzQwMi8zNjAgMTMzNTEvNDAyLzM2MAorZiAxMzM2MS80MDMvMzYxIDEzMzUyLzQwMi8zNjEgMTMzNTkvNDA0LzM2MQorZiAxMzM1OS80MDQvMzYyIDEzMzYwLzQwNS8zNjIgMTMzNjEvNDAzLzM2MgorZiAxMzM2Mi80MDYvMzYzIDEzMzU5LzQwNC8zNjMgMTMzNTgvMzg5LzM2MworZiAxMzM1OC8zODkvMzY0IDEzMzM3LzM5Mi8zNjQgMTMzNjIvNDA2LzM2NAorZiAxMzM1OS80MDQvMzY1IDEzMzYyLzQwNi8zNjUgMTMzNjMvNDA1LzM2NQorZiAxMzM2My80MDUvMzY2IDEzMzYwLzQwNS8zNjYgMTMzNTkvNDA0LzM2NgorZiAxMzM2Mi80MDYvMzY3IDEzMzY0LzQwNi8zNjcgMTMzNjUvNDA3LzM2NworZiAxMzM2NS80MDcvMzY4IDEzMzYzLzQwNS8zNjggMTMzNjIvNDA2LzM2OAorZiAxMzM2Ni80MDgvMzY5IDEzMzY3LzQwOS8zNjkgMTMzNjgvNDEwLzM2OQorZiAxMzM2OC80MTAvMzcwIDEzMzY5LzQxMS8zNzAgMTMzNjYvNDA4LzM3MAorZiAxMzM2NC80MDgvMzcxIDEzMzY2LzQwOC8zNzEgMTMzNjkvNDExLzM3MQorZiAxMzM2OS80MTEvMzcyIDEzMzY1LzQxMS8zNzIgMTMzNjQvNDA4LzM3MgorZiAxMzM1OC8zODkvMzczIDEzMzcwLzM4OS8zNzMgMTMzMzcvMzkyLzM3MworZiAxMzM3NC80MTIvMzc0IDEzMzcxLzQxMy8zNzQgMTMzNzIvNDE0LzM3NAorZiAxMzM3Mi80MTQvMzc0IDEzMzczLzQxMi8zNzQgMTMzNzQvNDEyLzM3NAorZiAxMzM3NC80MTUvMzc1IDEzMzIyLzQxNS8zNzUgMTMzMDIvNDE1LzM3NQorZiAxMzMwMi80MTUvMzc2IDEzMzcxLzQxNS8zNzYgMTMzNzQvNDE1LzM3NgorZiAxMzM3MS80MTUvMzc3IDEzMzAyLzQxNS8zNzcgMTMyODIvNDE1LzM3NworZiAxMzM3Mi80MTYvMzc4IDEzMzcxLzQxNy8zNzggMTMyODIvNDE4LzM3OAorZiAxMzI4Mi80MTgvMzc5IDEzMjc1LzQxOS8zNzkgMTMzNzIvNDE2LzM3OQorZiAxMzM3Mi80MTYvMzgwIDEzMjc1LzQxOS8zODAgMTMyNzgvNDIwLzM4MAorZiAxMzI3OC80MjAvMzgxIDEzMzc1LzQyMS8zODEgMTMzNzIvNDE2LzM4MQorZiAxMzM3Ny80MjEvMzgxIDEzMzc1LzQyMS8zODEgMTMyNzgvNDIwLzM4MQorZiAxMzI3OC80MjAvMzgyIDEzMzc2LzQyMC8zODIgMTMzNzcvNDIxLzM4MgorZiAxMzM3Ny80MjIvMzgzIDEzMzc2LzQyMi8zODMgMTMyNzkvNDIyLzM4MworZiAxMzI3OS80MjIvMzg0IDEzMzc4LzQyMi8zODQgMTMzNzcvNDIyLzM4NAorZiAxMzM3OC80MjIvMzg1IDEzMjc5LzQyMi8zODUgMTMyODEvNDIyLzM4NQorZiAxMzI4MS80MjIvMzg2IDEzMzc5LzQyMi8zODYgMTMzNzgvNDIyLzM4NgorZiAxMzM3OS80MjIvMzg3IDEzMjgxLzQyMi8zODcgMTMyODAvNDIyLzM4NworZiAxMzI4MC80MjIvMzg4IDEzMzgwLzQyMi8zODggMTMzNzkvNDIyLzM4OAorZiAxMzM4MS80MjMvMzg4IDEzMzgwLzQyMi8zODggMTMyODAvNDIyLzM4OAorZiAxMzI4MC80MjIvMzg5IDEzMjg1LzQyMy8zODkgMTMzODEvNDIzLzM4OQorZiAxMzM4MS80MjMvMzkwIDEzMjg1LzQyMy8zOTAgMTMyODQvNDI0LzM5MAorZiAxMzI4NC80MjQvMzkxIDEzMzgyLzQyNC8zOTEgMTMzODEvNDIzLzM5MQorZiAxMzM4Mi80MjUvMzkyIDEzMjg0LzQyNi8zOTIgMTMzODMvNDI2LzM5MgorZiAxMzM4NS80MjUvMzkzIDEzMzgyLzQyNS8zOTMgMTMzODMvNDI2LzM5MworZiAxMzM4My80MjYvMzk0IDEzMzg0LzQyNi8zOTQgMTMzODUvNDI1LzM5NAorZiAxMzM4NS80MjUvMzk1IDEzMzg0LzQyNi8zOTUgMTMzMzMvNDI2LzM5NQorZiAxMzM4NS80MjcvMzk2IDEzMzMzLzQyNy8zOTYgMTMzMzIvNDI4LzM5NgorZiAxMzMzMi80MjgvMzk3IDEzMzg2LzQyOC8zOTcgMTMzODUvNDI3LzM5NworZiAxMzM4Ni80MjgvMzk4IDEzMzMyLzQyOC8zOTggMTMzMjkvNDI4LzM5OAorZiAxMzMyOS80MjgvMzk5IDEzMzg3LzQyOC8zOTkgMTMzODYvNDI4LzM5OQorZiAxMzM4OC80MjgvNDAwIDEzMzg3LzQyOC80MDAgMTMzMjkvNDI4LzQwMAorZiAxMzMyOS80MjgvNDAxIDEzMzI4LzQyOC80MDEgMTMzODgvNDI4LzQwMQorZiAxMzM4OS80MjgvNDAyIDEzMzg4LzQyOC80MDIgMTMzMjgvNDI4LzQwMgorZiAxMzMyOC80MjgvNDAzIDEzMzI3LzQyOC80MDMgMTMzODkvNDI4LzQwMworZiAxMzM4OS80MjgvNDA0IDEzMzI3LzQyOC80MDQgMTMzOTAvNDI4LzQwNAorZiAxMzM5MC80MjgvNDA1IDEzMzkxLzQyOC80MDUgMTMzODkvNDI4LzQwNQorZiAxMzM5MS80MjkvNDA2IDEzMzkwLzQzMC80MDYgMTMzMjQvNDMwLzQwNgorZiAxMzMyNC80MzAvMzgxIDEzMzkyLzQyOS8zODEgMTMzOTEvNDI5LzM4MQorZiAxMzM5My80MzEvMzgxIDEzMzkyLzQyOS8zODEgMTMzMjQvNDMwLzM4MQorZiAxMzMyNC80MzAvNDA3IDEzMzIzLzQzMi80MDcgMTMzOTMvNDMxLzQwNworZiAxMzM5My80MzEvNDA4IDEzMzIzLzQzMi80MDggMTMzMzEvNDMzLzQwOAorZiAxMzMzMS80MzMvNDA5IDEzMzk0LzQzNC80MDkgMTMzOTMvNDMxLzQwOQorZiAxMzM5NC80MzUvNDEwIDEzMzMxLzQzNi80MTAgMTMzNTAvNDM2LzQxMAorZiAxMzM5NS80MzUvNDExIDEzMzk0LzQzNS80MTEgMTMzNTAvNDM2LzQxMQorZiAxMzM1MC80MzYvNDEyIDEzMzcwLzQzNi80MTIgMTMzOTUvNDM1LzQxMgorZiAxMzM5NS80MzUvNDEzIDEzMzcwLzQzNi80MTMgMTMzNTgvNDM3LzQxMworZiAxMzM5Ni80MzgvNDE0IDEzMzk1LzQzOS80MTQgMTMzNTgvNDM5LzQxNAorZiAxMzM1OC80MzkvNDE1IDEzMzUxLzQ0MC80MTUgMTMzOTYvNDM4LzQxNQorZiAxMzM5Ni80MzgvNDE2IDEzMzUxLzQ0MC80MTYgMTMzNTQvNDQwLzQxNgorZiAxMzM1NC80NDAvNDE3IDEzMzk3LzQzOC80MTcgMTMzOTYvNDM4LzQxNworZiAxMzM5OS80NDEvNDE4IDEzMzk3LzQzOC80MTggMTMzNTQvNDQwLzQxOAorZiAxMzM1NC80NDAvNDE5IDEzMzk4LzQ0Mi80MTkgMTMzOTkvNDQxLzQxOQorZiAxMzM5OS80NDMvNDIwIDEzMzk4LzQ0My80MjAgMTMzNTUvNDQzLzQyMAorZiAxMzM1NS80NDMvNDIxIDEzNDAwLzQ0My80MjEgMTMzOTkvNDQzLzQyMQorZiAxMzQwMC80NDMvNDIyIDEzMzU1LzQ0My80MjIgMTMzNTcvNDQzLzQyMgorZiAxMzM1Ny80NDMvNDIzIDEzNDAxLzQ0My80MjMgMTM0MDAvNDQzLzQyMworZiAxMzQwMS80NDMvNDI0IDEzMzU3LzQ0My80MjQgMTMzNTYvNDQ0LzQyNAorZiAxMzM1Ni80NDQvNDI1IDEzNDAyLzQ0NC80MjUgMTM0MDEvNDQzLzQyNQorZiAxMzQwMy80NDQvNDI2IDEzNDAyLzQ0NC80MjYgMTMzNTYvNDQ0LzQyNgorZiAxMzM1Ni80NDQvNDI3IDEzMzYxLzQ0NC80MjcgMTM0MDMvNDQ0LzQyNworZiAxMzQwMy80NDQvNDI4IDEzMzYxLzQ0NC80MjggMTMzNjAvNDQ1LzQyOAorZiAxMzM2MC80NDUvNDI5IDEzNDA0LzQ0NS80MjkgMTM0MDMvNDQ0LzQyOQorZiAxMzQwNC80NDYvNDMwIDEzMzYwLzQ0Ny80MzAgMTM0MDUvNDQ3LzQzMAorZiAxMzQwNy80NDYvNDMxIDEzNDA0LzQ0Ni80MzEgMTM0MDUvNDQ3LzQzMQorZiAxMzQwNS80NDcvNDMyIDEzNDA2LzQ0Ny80MzIgMTM0MDcvNDQ2LzQzMgorZiAxMzQwNy80NDYvNDMzIDEzNDA2LzQ0Ny80MzMgMTMzMTMvNDQ3LzQzMworZiAxMzQwNy80NDgvNDM0IDEzMzEzLzQ0OC80MzQgMTMzMTIvNDQ5LzQzNAorZiAxMzMxMi80NDkvNDM1IDEzNDA4LzQ0OS80MzUgMTM0MDcvNDQ4LzQzNQorZiAxMzQwOC80NDkvNDM2IDEzMzEyLzQ0OS80MzYgMTMzMDkvNDQ5LzQzNgorZiAxMzMwOS80NDkvMzg4IDEzNDA5LzQ0OS8zODggMTM0MDgvNDQ5LzM4OAorZiAxMzQxMC80NTAvMzg4IDEzNDA5LzQ0OS8zODggMTMzMDkvNDQ5LzM4OAorZiAxMzMwOS80NDkvNDM3IDEzMzA4LzQ1MC80MzcgMTM0MTAvNDUwLzQzNworZiAxMzQxMS80NTAvNDM4IDEzNDEwLzQ1MC80MzggMTMzMDgvNDUwLzQzOAorZiAxMzMwOC80NTAvNDM5IDEzMzA3LzQ1MC80MzkgMTM0MTEvNDUwLzQzOQorZiAxMzQxMS80NTAvNDQwIDEzMzA3LzQ1MC80NDAgMTM0MTIvNDUwLzQ0MAorZiAxMzQxMi80NTAvNDQxIDEzNDEzLzQ1MC80NDEgMTM0MTEvNDUwLzQ0MQorZiAxMzQxMy80NTEvNDQyIDEzNDEyLzQ1MS80NDIgMTMzMDQvNDUxLzQ0MgorZiAxMzMwNC80NTEvNDE3IDEzNDE0LzQ1MS80MTcgMTM0MTMvNDUxLzQxNworZiAxMzM3My80NTEvNDE3IDEzNDE0LzQ1MS80MTcgMTMzMDQvNDUxLzQxNworZiAxMzMwNC80NTEvNDQzIDEzMzAzLzQ1MS80NDMgMTMzNzMvNDUxLzQ0MworZiAxMzM3My80NTEvNDQ0IDEzMzAzLzQ1MS80NDQgMTMzMTEvNDUyLzQ0NAorZiAxMzMxMS80NTIvNDQ1IDEzMzc0LzQ1My80NDUgMTMzNzMvNDUxLzQ0NQorZiAxMzM3NC80MTUvNDQ2IDEzMzExLzQxNS80NDYgMTMzMjIvNDE1LzQ0NgorZiAxMzM4Ni80NTQvNDQ3IDEzMzgxLzQ1NC80NDcgMTMzODIvNDU1LzQ0NworZiAxMzM4Mi80NTUvNDQ4IDEzMzg1LzQ1NS80NDggMTMzODYvNDU0LzQ0OAorZiAxMzM4MC80NTQvMjIxIDEzMzgxLzQ1NC8yMjEgMTMzODYvNDU0LzIyMQorZiAxMzM4Ni80NTQvMjIxIDEzMzg3LzQ1NC8yMjEgMTMzODAvNDU0LzIyMQorZiAxMzM3OS80NTYvMjIxIDEzMzgwLzQ1NC8yMjEgMTMzODcvNDU0LzIyMQorZiAxMzM4Ny80NTQvMjIxIDEzMzg4LzQ1Ni8yMjEgMTMzNzkvNDU2LzIyMQorZiAxMzM3OC80NTcvMjIxIDEzMzc5LzQ1Ni8yMjEgMTMzODgvNDU2LzIyMQorZiAxMzM4OC80NTYvNDQ5IDEzMzg5LzQ1Ni80NDkgMTMzNzgvNDU3LzQ0OQorZiAxMzM3Ny80NTcvNDUwIDEzMzc4LzQ1Ny80NTAgMTMzODkvNDU2LzQ1MAorZiAxMzM4OS80NTYvMjIxIDEzMzkxLzQ1Ni8yMjEgMTMzNzcvNDU3LzIyMQorZiAxMzQwMC80NTcvNDUxIDEzNDExLzQ1Ny80NTEgMTM0MTMvNDU3LzQ1MQorZiAxMzQxMy80NTcvMjg2IDEzMzk5LzQ1Ny8yODYgMTM0MDAvNDU3LzI4NgorZiAxMzQwMS80NTcvNDUyIDEzNDEwLzQ1Ny80NTIgMTM0MTEvNDU3LzQ1MgorZiAxMzQxMS80NTcvNDUzIDEzNDAwLzQ1Ny80NTMgMTM0MDEvNDU3LzQ1MworZiAxMzQwMi80NTgvMjIxIDEzNDA5LzQ1Ny8yMjEgMTM0MTAvNDU3LzIyMQorZiAxMzQxMC80NTcvMjE5IDEzNDAxLzQ1Ny8yMTkgMTM0MDIvNDU4LzIxOQorZiAxMzQwMy80NTgvMjIxIDEzNDA4LzQ1OS8yMjEgMTM0MDkvNDU3LzIyMQorZiAxMzQwOS80NTcvMjIxIDEzNDAyLzQ1OC8yMjEgMTM0MDMvNDU4LzIyMQorZiAxMzQwOC80NTkvNDU0IDEzNDAzLzQ1OC80NTQgMTM0MDQvNDYwLzQ1NAorZiAxMzQwNC80NjAvNDU0IDEzNDA3LzQ2MS80NTQgMTM0MDgvNDU5LzQ1NAorZiAxMzQxMy80NTcvMjIxIDEzMzc3LzQ1Ny8yMjEgMTMzOTEvNDU2LzIyMQorZiAxMzM5MS80NTYvMjIxIDEzMzk5LzQ1Ny8yMjEgMTM0MTMvNDU3LzIyMQorZiAxMzM5Ni80NjIvNDU1IDEzMzkzLzQ2Mi80NTUgMTMzOTQvNDYzLzQ1NQorZiAxMzM5NC80NjMvNDU1IDEzMzk1LzQ2NC80NTUgMTMzOTYvNDYyLzQ1NQorZiAxMzM5Mi80NTYvMjIxIDEzMzkzLzQ2Mi8yMjEgMTMzOTYvNDYyLzIyMQorZiAxMzM5Ni80NjIvMjIxIDEzMzk3LzQ2Mi8yMjEgMTMzOTIvNDU2LzIyMQorZiAxMzM5MS80NTYvMjIxIDEzMzkyLzQ1Ni8yMjEgMTMzOTcvNDYyLzIyMQorZiAxMzM5Ny80NjIvMjIxIDEzMzk5LzQ1Ny8yMjEgMTMzOTEvNDU2LzIyMQorZiAxMzM3NS80MTQvMjIxIDEzMzc3LzQ1Ny8yMjEgMTM0MTMvNDU3LzIyMQorZiAxMzQxMy80NTcvMjIxIDEzNDE0LzQxNC8yMjEgMTMzNzUvNDE0LzIyMQorZiAxMzM3Mi80MTQvMjIxIDEzMzc1LzQxNC8yMjEgMTM0MTQvNDE0LzIyMQorZiAxMzQxNC80MTQvMjIxIDEzMzczLzQxMi8yMjEgMTMzNzIvNDE0LzIyMQorZiAxMzMwNy8zNzcvNDU2IDEzMzA1LzM3Ny80NTYgMTMzMDQvMzc3LzQ1NgorZiAxMzMwNC8zNzcvNDU3IDEzNDEyLzM3Ny80NTcgMTMzMDcvMzc3LzQ1NworZiAxMzMwNi8zNzcvNDU4IDEzMzA1LzM3Ny80NTggMTMzMDkvMzc3LzQ1OAorZiAxMzMwOS8zNzcvNDU5IDEzMzEyLzM3Ny80NTkgMTMzMDYvMzc3LzQ1OQorZiAxMzM3Ni8zNTgvNDYwIDEzMjc4LzM1OC80NjAgMTMyNzcvMzU4LzQ2MAorZiAxMzI3Ny8zNTgvNDYxIDEzMjc5LzM2MC80NjEgMTMzNzYvMzU4LzQ2MQorZiAxMzI4NS8zNjMvNDYyIDEzMjgwLzM1OS80NjIgMTMyNzcvMzU4LzQ2MgorZiAxMzI3Ny8zNTgvNDYzIDEzMjc2LzM1OC80NjMgMTMyODUvMzYzLzQ2MworZiAxMzMyNy8zNTkvNDY0IDEzMzI1LzM1OS80NjQgMTMzMjQvMzg3LzQ2NAorZiAxMzMyNC8zODcvNDY1IDEzMzkwLzM4Ny80NjUgMTMzMjcvMzU5LzQ2NQorZiAxMzMyNi8zNTkvNDY2IDEzMzI1LzM1OS80NjYgMTMzMjkvMzU5LzQ2NgorZiAxMzMyOS8zNTkvNDY3IDEzMzMyLzM1OS80NjcgMTMzMjYvMzU5LzQ2NworZiAxMzM5OC80MDIvNDY4IDEzMzU0LzQwMi80NjggMTMzNTMvNDAyLzQ2OAorZiAxMzM1My80MDIvNDY5IDEzMzU1LzQwMi80NjkgMTMzOTgvNDAyLzQ2OQorZiAxMzM2MS80MDMvNDcwIDEzMzU2LzQwMy80NzAgMTMzNTMvNDAyLzQ3MAorZiAxMzM1My80MDIvNDcxIDEzMzUyLzQwMi80NzEgMTMzNjEvNDAzLzQ3MQorZiAxMzI4OC8zNjQvNDcyIDEzMjkzLzM2OC80NzIgMTMzNDAvMzkxLzQ3MgorZiAxMzM0MC8zOTEvNDczIDEzMzM2LzM5MS80NzMgMTMyODgvMzY0LzQ3MworZiAxMzMwMC8zNzMvNDc0IDEzMzQ4LzM5OS80NzQgMTMzNDcvMzk4LzQ3NAorZiAxMzM0Ny8zOTgvNDc0IDEzMzAxLzM3NC80NzQgMTMzMDAvMzczLzQ3NAorZiAxMzMwMS8zNzQvNDc1IDEzMzQ3LzM5OC80NzUgMTMzNDAvMzk4LzQ3NQorZiAxMzM0MC8zOTgvNDc2IDEzMjkzLzM3NC80NzYgMTMzMDEvMzc0LzQ3NgorZiAxMzI4OC8zNjQvNDc3IDEzMzgzLzM2NC80NzcgMTMyODQvMzY0LzQ3NworZiAxMzMzMy8zNjQvNDc4IDEzMzg0LzM2NC80NzggMTMzMzYvMzkxLzQ3OAorZiAxMzMzNS8zODkvNDc5IDEzMzM0LzM5MC80NzkgMTMzNDEvMzkwLzQ3OQorZiAxMzM0MS8zOTAvNDgwIDEzMzM4LzM5My80ODAgMTMzMzUvMzg5LzQ4MAorZiAxMzM0My8zOTUvNDgxIDEzMzQ2LzQ2NS80ODEgMTMzNDkvNDY1LzQ4MQorZiAxMzM0OS80NjUvNDgyIDEzMzQ0LzM5NS80ODIgMTMzNDMvMzk1LzQ4MgorZiAxMzMzOC80MDEvNDgzIDEzMzQxLzQ2Ni80ODMgMTMzNDYvNDY1LzQ4MworZiAxMzM0Ni80NjUvNDg0IDEzMzQzLzM5NS80ODQgMTMzMzgvNDAxLzQ4NAorZiAxMzMzNy8zOTIvNDg1IDEzMzM5LzM5Mi80ODUgMTMzNjQvNDA2LzQ4NQorZiAxMzM2NC80MDYvNDg2IDEzMzYyLzQwNi80ODYgMTMzMzcvMzkyLzQ4NgorZiAxMzM0NS8zOTQvNDg3IDEzMzY3LzQ2Ny80ODcgMTMzNjYvNDY3LzQ4NworZiAxMzM2Ni80NjcvNDg4IDEzMzQyLzM5NC80ODggMTMzNDUvMzk0LzQ4OAorZiAxMzMzOS80MDAvNDg5IDEzMzQyLzM5NC80ODkgMTMzNjYvNDY3LzQ4OQorZiAxMzM2Ni80NjcvNDkwIDEzMzY0LzQ2OC80OTAgMTMzMzkvNDAwLzQ5MAorZiAxMzMxNi8zODEvNDkxIDEzMzE1LzM4MS80OTEgMTMzNjMvNDA1LzQ5MQorZiAxMzM2My80MDUvNDkyIDEzMzY1LzQwNy80OTIgMTMzMTYvMzgxLzQ5MgorZiAxMzMxOS8zODQvNDkzIDEzMzY5LzQxMS80OTMgMTMzNjgvNDEwLzQ5MworZiAxMzM2OC80MTAvNDkzIDEzMzIwLzM4NS80OTMgMTMzMTkvMzg0LzQ5MworZiAxMzMxNi8zODYvNDk0IDEzMzY1LzQxMS80OTQgMTMzNjkvNDExLzQ5NAorZiAxMzM2OS80MTEvNDk1IDEzMzE5LzM4NC80OTUgMTMzMTYvMzg2LzQ5NQorZiAxMzMxMy8zNzkvNDk2IDEzNDA2LzM3OS80OTYgMTMzMTUvMzgxLzQ5NgorZiAxMzM2My80MDUvNDk3IDEzNDA1LzM3OS80OTcgMTMzNjAvNDA1LzQ5NworZiAxMzI4Ni8zNjEvNDk4IDEzMjkxLzM2NS80OTggMTMyOTIvMzY3LzQ5OAorZiAxMzI5Mi8zNjcvNDk5IDEzMjg3LzM2Mi80OTkgMTMyODYvMzYxLzQ5OQorZiAxMzI5Ny8zNjkvNTAwIDEzMjk5LzQ2OS81MDAgMTMyOTgvNDY5LzUwMAorZiAxMzI5OC80NjkvNTAxIDEzMjk0LzM2OS81MDEgMTMyOTcvMzY5LzUwMQorZiAxMzI5MS8zNzUvNTAyIDEzMjk0LzM2OS81MDIgMTMyOTgvNDY5LzUwMgorZiAxMzI5OC80NjkvNTAzIDEzMjkyLzQ3MC81MDMgMTMyOTEvMzc1LzUwMworZiAxMzI4OS8zNjYvNTA0IDEzMzE0LzM4MC81MDQgMTMzMTcvMzgwLzUwNAorZiAxMzMxNy8zODAvNTA1IDEzMjkwLzM2Ni81MDUgMTMyODkvMzY2LzUwNQorZiAxMzI5NS8zNzAvNTA2IDEzMzE4LzQ3MS81MDYgMTMzMjEvNDcxLzUwNgorZiAxMzMyMS80NzEvNTA3IDEzMjk2LzM3MC81MDcgMTMyOTUvMzcwLzUwNworZiAxMzI5MC8zNzYvNTA4IDEzMzE3LzQ3Mi81MDggMTMzMTgvNDcxLzUwOAorZiAxMzMxOC80NzEvNTA5IDEzMjk1LzM3MC81MDkgMTMyOTAvMzc2LzUwOQorZiAxMzI4OC8zNjQvNTEwIDEzMzM2LzM5MS81MTAgMTMzODQvMzY0LzUxMAorZiAxMzM4NC8zNjQvNTExIDEzMzgzLzM2NC81MTEgMTMyODgvMzY0LzUxMQorZiAxMzMwMi8zNjEvNTEyIDEzMzIyLzM2MS81MTIgMTMyODkvMzY2LzUxMgorZiAxMzI4OS8zNjYvNTEzIDEzMjg2LzM2MS81MTMgMTMzMDIvMzYxLzUxMworZiAxMzMzNS8zODkvNTE0IDEzMzM3LzM5Mi81MTQgMTMzNzAvMzg5LzUxNAorZiAxMzM3MC8zODkvNTE1IDEzMzUwLzM4OS81MTUgMTMzMzUvMzg5LzUxNQorZiAxMzM2My80MDUvNTE2IDEzMzE1LzM4MS81MTYgMTM0MDYvMzc5LzUxNgorZiAxMzQwNi8zNzkvNTE3IDEzNDA1LzM3OS81MTcgMTMzNjMvNDA1LzUxNworZiAxMzQxOC80NzMvMjEyIDEzNDE1LzQ3NC8yMTIgMTM0MTYvNDc1LzIxMgorZiAxMzQxNi80NzUvMjEzIDEzNDE3LzQ3Ni8yMTMgMTM0MTgvNDczLzIxMworZiAxMzQxOS80NzcvMjE0IDEzNDIwLzQ3OC8yMTQgMTM0MjEvNDc5LzIxNAorZiAxMzQyMS80NzkvMjE0IDEzNDIyLzQ4MC8yMTQgMTM0MTkvNDc3LzIxNAorZiAxMzQyMi80ODEvMjE1IDEzNDIxLzQ4Mi8yMTUgMTM0MjMvNDgzLzIxNQorZiAxMzQyMy80ODMvMjE1IDEzNDI0LzQ4NC8yMTUgMTM0MjIvNDgxLzIxNQorZiAxMzg0My80ODUvMjE2IDEzODQ0LzQ4Ni8yMTYgMTM0MjUvNDg3LzIxNgorZiAxMzQyNS80ODgvMjE2IDEzNDI2LzQ4OS8yMTYgMTM4NDUvNDkwLzIxNgorZiAxMzQyNi80OTEvMjE3IDEzNDI1LzQ5Mi8yMTcgMTM0MjcvNDkzLzIxNworZiAxMzQyNy80OTMvMjE3IDEzNDI4LzQ5NC8yMTcgMTM0MjYvNDkxLzIxNworZiAxMzQzMC80OTUvMjE4IDEzNDI4LzQ5NC8yMTggMTM0MjcvNDkzLzIxOAorZiAxMzQyNy80OTMvMjE4IDEzNDI5LzQ5Ni8yMTggMTM0MzAvNDk1LzIxOAorZiAxMzQzMi80OTcvMjIxIDEzNDMzLzQ5OC8yMjEgMTM0MzQvNDk5LzIyMQorZiAxMzQzNC80OTkvMjIxIDEzNDMxLzUwMC8yMjEgMTM0MzIvNDk3LzIyMQorZiAxMzQzNy81MDEvMjIxIDEzNDM4LzUwMi8yMjEgMTM0MzUvNTAzLzIyMQorZiAxMzQzNS81MDMvMjIxIDEzNDM2LzUwNC8yMjEgMTM0MzcvNTAxLzIyMQorZiAxMzQzOS81MDUvMjIxIDEzNDQwLzUwNi8yMjEgMTM0MzgvNTAyLzIyMQorZiAxMzQzOC81MDIvMjIxIDEzNDM3LzUwMS8yMjEgMTM0MzkvNTA1LzIyMQorZiAxMzQ0MS81MDcvMjIxIDEzNDQyLzUwOC8yMjEgMTM4NDYvNTA2LzIyMQorZiAxMzg0Ny81MDkvMjIxIDEzODQ4LzUxMC8yMjEgMTM0NDEvNTExLzIyMQorZiAxMzQ0My81MTIvMjg1IDEzNDQ0LzUxMy8yODUgMTM0NDIvNTA4LzI4NQorZiAxMzQ0Mi81MDgvMjIxIDEzNDQxLzUwNy8yMjEgMTM0NDMvNTEyLzIyMQorZiAxMzQ0NC81MTMvMjIxIDEzNDQzLzUxMi8yMjEgMTM0NDUvNTE0LzIyMQorZiAxMzQ0NS81MTQvMjE5IDEzNDQ2LzUxNS8yMTkgMTM0NDQvNTEzLzIxOQorZiAxMzQ0NS81MTQvMjIxIDEzNDQ5LzUxNi8yMjEgMTM0NDcvNTE3LzIyMQorZiAxMzQ0Ny81MTcvMjE5IDEzNDQ4LzUxOC8yMTkgMTM0NDUvNTE0LzIxOQorZiAxMzQ1MC81MTkvMjE5IDEzNDQ5LzUxNi8yMTkgMTM0NTEvNTIwLzIxOQorZiAxMzQ1MS81MjAvMjIxIDEzNDUyLzUyMS8yMjEgMTM0NTAvNTE5LzIyMQorZiAxMzQ1My81MjIvMjg1IDEzNDU0LzUyMy8yODUgMTM0NTAvNTE5LzI4NQorZiAxMzQ1MC81MTkvMjIwIDEzNDUyLzUyMS8yMjAgMTM0NTMvNTIyLzIyMAorZiAxMzQ1My81MjIvMjIxIDEzNDU1LzUyNC8yMjEgMTM0NTYvNTI1LzIyMQorZiAxMzQ1Ni81MjUvMjIxIDEzNDU0LzUyMy8yMjEgMTM0NTMvNTIyLzIyMQorZiAxMzQ1Ny81MjYvMjIxIDEzNDU2LzUyNS8yMjEgMTM0NTgvNTI3LzIyMQorZiAxMzQ0OC81MTgvMjIxIDEzNDQ3LzUxNy8yMjEgMTM0NTkvNTI4LzIyMQorZiAxMzQ1OC81MjcvMjIxIDEzNDYwLzUyOS8yMjEgMTM0MzIvNDk3LzIyMQorZiAxMzQzMi80OTcvMjIwIDEzNDU3LzUyNi8yMjAgMTM0NTgvNTI3LzIyMAorZiAxMzQzMS81MDAvMjIwIDEzNDU3LzUyNi8yMjAgMTM0MzIvNDk3LzIyMAorZiAxMzQ2MS81MzAvNTE4IDEzNDYyLzUzMS81MTggMTM0NjMvNTMyLzUxOAorZiAxMzQ2My81MzIvMjIzIDEzNDY0LzUzMy8yMjMgMTM0NjEvNTMwLzIyMworZiAxMzQ2NC81MzMvMjI0IDEzNDYzLzUzMi8yMjQgMTM0NjUvNTM0LzIyNAorZiAxMzQ2NS81MzQvMjI1IDEzNDY2LzUzNS8yMjUgMTM0NjQvNTMzLzIyNQorZiAxMzQ2Ni81MzYvNTE5IDEzNDY1LzUzNy81MTkgMTM0NjcvNTM4LzUxOQorZiAxMzQ2Ny81MzgvMjI2IDEzNDY4LzUzOS8yMjYgMTM0NjYvNTM2LzIyNgorZiAxMzQ2OC81MzkvMjI3IDEzNDY3LzUzOC8yMjcgMTM0NjkvNTQwLzIyNworZiAxMzQ2OS81NDAvMjI4IDEzNDcwLzU0MS8yMjggMTM0NjgvNTM5LzIyOAorZiAxMzQ3MC81NDIvMjI5IDEzNDY5LzU0My8yMjkgMTM0NzEvNTQ0LzIyOQorZiAxMzQ3MS81NDQvMjI5IDEzNDcyLzU0NS8yMjkgMTM0NzAvNTQyLzIyOQorZiAxMzQ3Mi81NDUvMjMwIDEzNDcxLzU0NC8yMzAgMTM0NzMvNTQ2LzIzMAorZiAxMzQ3My81NDYvMjMwIDEzNDc0LzU0Ny8yMzAgMTM0NzIvNTQ1LzIzMAorZiAxMzQ3NC81NDcvMjMyIDEzNDczLzU0Ni8yMzIgMTM0NzUvNTQ4LzIzMgorZiAxMzQ3NS81NDgvMjMyIDEzNDc2LzU0OS8yMzIgMTM0NzQvNTQ3LzIzMgorZiAxMzQ3Ni81NDkvMjMzIDEzNDc1LzU0OC8yMzMgMTM0NzcvNTUwLzIzMworZiAxMzQ3Ny81NTAvNTIwIDEzNDc4LzU1MS81MjAgMTM0NzYvNTQ5LzUyMAorZiAxMzQ3OC81NTIvNTIxIDEzNDc3LzU1My81MjEgMTM0NzkvNTU0LzUyMQorZiAxMzQ3OS81NTQvMjM1IDEzNDgwLzU1NS8yMzUgMTM0NzgvNTUyLzIzNQorZiAxMzQ4MC81NTUvMjM2IDEzNDc5LzU1NC8yMzYgMTM0ODEvNTU2LzIzNgorZiAxMzQ4MS81NTYvMjM2IDEzNDgyLzU1Ny8yMzYgMTM0ODAvNTU1LzIzNgorZiAxMzQ4Mi81NTgvMjM4IDEzNDgxLzU1OS8yMzggMTM0ODMvNTYwLzIzOAorZiAxMzQ4My81NjAvMjM5IDEzNDg0LzU2MS8yMzkgMTM0ODIvNTU4LzIzOQorZiAxMzQ4NC81NjEvMjQwIDEzNDgzLzU2MC8yNDAgMTM0NjIvNTMxLzI0MAorZiAxMzQ2Mi81MzEvNTIyIDEzNDYxLzUzMC81MjIgMTM0ODQvNTYxLzUyMgorZiAxMzQ2MS81NjIvMjQyIDEzNDY0LzU2My8yNDIgMTM0ODUvNTY0LzI0MgorZiAxMzQ4NS81NjQvMjQzIDEzNDg2LzU2NS8yNDMgMTM0NjEvNTYyLzI0MworZiAxMzQ2NC81NjMvMjQ0IDEzNDY2LzU2Ni8yNDQgMTM0ODcvNTY3LzI0NAorZiAxMzQ4Ny81NjcvNTIzIDEzNDg1LzU2NC81MjMgMTM0NjQvNTYzLzUyMworZiAxMzQ2Ni81NjYvMjQ2IDEzNDY4LzU2OC8yNDYgMTM0ODgvNTY5LzI0NgorZiAxMzQ4OC81NjkvMjQ3IDEzNDg3LzU2Ny8yNDcgMTM0NjYvNTY2LzI0NworZiAxMzQ2OC81NjgvNTI0IDEzNDcwLzU3MC81MjQgMTM0ODkvNTcxLzUyNAorZiAxMzQ4OS81NzEvMjQ5IDEzNDg4LzU2OS8yNDkgMTM0NjgvNTY4LzI0OQorZiAxMzQ3MC81NzAvMjUwIDEzNDcyLzU3Mi8yNTAgMTM0OTAvNTczLzI1MAorZiAxMzQ5MC81NzMvNTI1IDEzNDg5LzU3MS81MjUgMTM0NzAvNTcwLzUyNQorZiAxMzQ3Mi81NzIvNTI2IDEzNDc0LzU3NC81MjYgMTM0OTEvNTc1LzUyNgorZiAxMzQ5MS81NzUvNTI3IDEzNDkwLzU3My81MjcgMTM0NzIvNTcyLzUyNworZiAxMzQ3NC81NzQvNTI4IDEzNDc2LzU3Ni81MjggMTM0NTEvNTIwLzUyOAorZiAxMzQ1MS81MjAvNTI5IDEzNDkxLzU3NS81MjkgMTM0NzQvNTc0LzUyOQorZiAxMzQ3Ni81NzYvNTMwIDEzNDc4LzU3Ny81MzAgMTM0NTIvNTIxLzUzMAorZiAxMzQ1Mi81MjEvNTMxIDEzNDUxLzUyMC81MzEgMTM0NzYvNTc2LzUzMQorZiAxMzQ3OC81NzcvNTMyIDEzNDgwLzU3OC81MzIgMTM0NTMvNTIyLzUzMgorZiAxMzQ1My81MjIvNTMzIDEzNDUyLzUyMS81MzMgMTM0NzgvNTc3LzUzMworZiAxMzQ4MC81NzgvNTM0IDEzNDgyLzU3OS81MzQgMTM0NTUvNTI0LzUzNAorZiAxMzQ1NS81MjQvMjYxIDEzNDUzLzUyMi8yNjEgMTM0ODAvNTc4LzI2MQorZiAxMzQ4Mi81NzkvNTM1IDEzNDg0LzU4MC81MzUgMTM0OTIvNTgxLzUzNQorZiAxMzQ5Mi81ODEvNTM2IDEzNDU1LzUyNC81MzYgMTM0ODIvNTc5LzUzNgorZiAxMzQ4NC81ODAvNTM3IDEzNDYxLzU2Mi81MzcgMTM0ODYvNTY1LzUzNworZiAxMzQ4Ni81NjUvNTM4IDEzNDkyLzU4MS81MzggMTM0ODQvNTgwLzUzOAorZiAxMzQxOS80NzcvMjY2IDEzNDE4LzQ3My8yNjYgMTM0MTcvNDc2LzI2NgorZiAxMzQxNy80NzYvMjY2IDEzNDIwLzQ3OC8yNjYgMTM0MTkvNDc3LzI2NgorZiAxMzQ5NC81ODIvMjY3IDEzNDMwLzQ5NS8yNjcgMTM0MjkvNDk2LzI2NworZiAxMzQyOS80OTYvMjY4IDEzNDkzLzU4My8yNjggMTM0OTQvNTgyLzI2OAorZiAxMzQ2MC81MjkvMjIxIDEzNDM2LzUwNC8yMjEgMTM0MzUvNTAzLzIyMQorZiAxMzQzNS81MDMvMjIxIDEzNDMzLzQ5OC8yMjEgMTM0NjAvNTI5LzIyMQorZiAxMzQ0Ni81MTUvMjIxIDEzNDQ4LzUxOC8yMjEgMTM0NTkvNTI4LzIyMQorZiAxMzQ1OS81MjgvMjE5IDEzNDk1LzU4NC8yMTkgMTM0NDYvNTE1LzIxOQorZiAxMzQzNC80OTkvMjY5IDEzNDMzLzQ5OC8yNjkgMTM0MTcvNTg1LzI2OQorZiAxMzQxNy81ODUvMjcwIDEzNDE2LzU4Ni8yNzAgMTM0MzQvNDk5LzI3MAorZiAxMzQzNS81MDMvNTM5IDEzNDM4LzUwMi81MzkgMTM0MjEvNTg3LzUzOQorZiAxMzQyMS80NzkvNTQwIDEzNDIwLzQ3OC81NDAgMTM0MzUvNTg4LzU0MAorZiAxMzQzOC81MDIvMjczIDEzNDQwLzUwNi8yNzMgMTM0MjMvNTA2LzI3MworZiAxMzQyMy80ODMvNTQxIDEzNDIxLzQ4Mi81NDEgMTM0MzgvNTg5LzU0MQorZiAxMzQ0MC81OTAvNTQyIDEzNDQyLzU5MS81NDIgMTM0MjUvNTkxLzU0MgorZiAxMzQyNS81MDgvNTQzIDEzNDIzLzUwNi81NDMgMTM0NDAvNTA2LzU0MworZiAxMzQ0Mi81MDgvMjc3IDEzNDQ0LzUxMy8yNzcgMTM0MjcvNTkyLzI3NworZiAxMzQyNy81OTIvNTQ0IDEzNDI1LzUwOC81NDQgMTM0NDIvNTA4LzU0NAorZiAxMzQ0NC81MTMvNTQ1IDEzNDQ2LzUxNS81NDUgMTM0MjkvNTkzLzU0NQorZiAxMzQyOS81OTMvNTQ2IDEzNDI3LzU5Mi81NDYgMTM0NDQvNTEzLzU0NgorZiAxMzQzMy80OTgvNTQ3IDEzNDM1LzUwMy81NDcgMTM0MjAvNTAzLzU0NworZiAxMzQyMC81MDMvMjgyIDEzNDE3LzU4NS8yODIgMTM0MzMvNDk4LzI4MgorZiAxMzQ0Ni81MTUvNTQ4IDEzNDk1LzU4NC81NDggMTM0OTMvNTg0LzU0OAorZiAxMzQ5My81ODQvNTQ5IDEzNDI5LzU5My81NDkgMTM0NDYvNTE1LzU0OQorZiAxMzQ4NS81NjQvMjIwIDEzNDg3LzU2Ny8yMjAgMTM0MzcvNTAxLzIyMAorZiAxMzQzNy81MDEvMjIxIDEzNDM2LzUwNC8yMjEgMTM0ODUvNTY0LzIyMQorZiAxMzQ4Ny81NjcvMjIxIDEzNDg4LzU2OS8yMjEgMTM0MzkvNTA1LzIyMQorZiAxMzQzOS81MDUvMjIxIDEzNDM3LzUwMS8yMjEgMTM0ODcvNTY3LzIyMQorZiAxMzQ4OC81NjkvMjIxIDEzNDg5LzU3MS8yMjEgMTM0NDEvNTA3LzIyMQorZiAxMzQ0MS81MDcvMjIxIDEzODQ5LzUwNS8yMjEgMTM0ODgvNTY5LzIyMQorZiAxMzQ4OS81NzEvMjIxIDEzNDkwLzU3My8yMjEgMTM0NDMvNTEyLzIyMQorZiAxMzQ0My81MTIvMjIxIDEzNDQxLzUwNy8yMjEgMTM0ODkvNTcxLzIyMQorZiAxMzQ5MC81NzMvMjIxIDEzNDkxLzU3NS8yMjEgMTM0NDUvNTE0LzIyMQorZiAxMzQ0NS81MTQvMjIxIDEzNDQzLzUxMi8yMjEgMTM0OTAvNTczLzIyMQorZiAxMzQ5MS81NzUvMjIwIDEzNDUxLzUyMC8yMjAgMTM0NDkvNTE2LzIyMAorZiAxMzQ0OS81MTYvMjIxIDEzNDQ1LzUxNC8yMjEgMTM0OTEvNTc1LzIyMQorZiAxMzQ5Mi81ODEvMjg1IDEzNDg2LzU2NS8yODUgMTM0NjAvNTI5LzI4NQorZiAxMzQ2MC81MjkvMjIxIDEzNDU4LzUyNy8yMjEgMTM0OTIvNTgxLzIyMQorZiAxMzQ2MC81MjkvMjIwIDEzNDg2LzU2NS8yMjAgMTM0ODUvNTY0LzIyMAorZiAxMzQ4NS81NjQvMjIwIDEzNDM2LzUwNC8yMjAgMTM0NjAvNTI5LzIyMAorZiAxMzQ1NS81MjQvMjIxIDEzNDkyLzU4MS8yMjEgMTM0NTgvNTI3LzIyMQorZiAxMzQ1OC81MjcvMjIxIDEzNDU2LzUyNS8yMjEgMTM0NTUvNTI0LzIyMQorZiAxMzQ0OS81MTYvMjIxIDEzNDUwLzUxOS8yMjEgMTM0NDcvNTE3LzIyMQorZiAxMzQzMy80OTgvMjIwIDEzNDMyLzQ5Ny8yMjAgMTM0NjAvNTI5LzIyMAorZiAxMzQ0NS81MTQvMjIwIDEzNDQ4LzUxOC8yMjAgMTM0NDYvNTE1LzIyMAorZiAxMzQ5OC81OTQvNTUwIDEzNDk5LzU5NC81NTAgMTM0OTYvNTk0LzU1MAorZiAxMzQ5Ni81OTQvMjg4IDEzNDk3LzU5NS8yODggMTM0OTgvNTk0LzI4OAorZiAxMzUwMS81OTUvNTUxIDEzNTAyLzU5NS81NTEgMTM1MDAvNTk0LzU1MQorZiAxMzUwMC81OTQvNTUyIDEzNDk4LzU5NC81NTIgMTM1MDEvNTk1LzU1MgorZiAxMzQ5Ni81OTQvNTUzIDEzNTAzLzU5Ni81NTMgMTM1MDQvNTk3LzU1MworZiAxMzUwNC81OTcvNTU0IDEzNDk3LzU5NS81NTQgMTM0OTYvNTk0LzU1NAorZiAxMzUwNi81OTUvNTU1IDEzNDk3LzU5NS81NTUgMTM1MDQvNTk3LzU1NQorZiAxMzUwNC81OTcvMjk0IDEzNTA1LzU5OC8yOTQgMTM1MDYvNTk1LzI5NAorZiAxMzUwOC81OTcvNTU2IDEzNTA0LzU5Ny81NTYgMTM1MDMvNTk2LzU1NgorZiAxMzUwMy81OTYvMjk2IDEzNTA3LzU5OS8yOTYgMTM1MDgvNTk3LzI5NgorZiAxMzUwNC81OTcvNTU3IDEzNTA4LzU5Ny81NTcgMTM1MDkvNjAwLzU1NworZiAxMzUwOS82MDAvNTU4IDEzNTA1LzU5OC81NTggMTM1MDQvNTk3LzU1OAorZiAxMzUxMi81OTkvMjk5IDEzNTA3LzU5OS8yOTkgMTM1MTAvNjAxLzI5OQorZiAxMzUxMC82MDEvMzAwIDEzNTExLzYwMi8zMDAgMTM1MTIvNTk5LzMwMAorZiAxMzUwOC81OTcvNTU5IDEzNTEzLzU5Ny81NTkgMTM1MTQvNjAwLzU1OQorZiAxMzUxNC82MDAvNTYwIDEzNTA5LzYwMC81NjAgMTM1MDgvNTk3LzU2MAorZiAxMzUxNS82MDMvMzAzIDEzNTE2LzYwNC8zMDMgMTM1MTcvNjA0LzMwMworZiAxMzUxNy82MDQvMzA0IDEzNTE4LzYwMy8zMDQgMTM1MTUvNjAzLzMwNAorZiAxMzUxOS82MDUvNTYxIDEzNTIwLzYwNS81NjEgMTM1MjEvNjA2LzU2MQorZiAxMzUyMS82MDYvNTYyIDEzNTIyLzYwNi81NjIgMTM1MTkvNjA1LzU2MgorZiAxMzUxMi82MDcvMzA3IDEzNTExLzYwOC8zMDcgMTM1MTYvNjA0LzMwNworZiAxMzUxNi82MDQvMzA4IDEzNTE1LzYwMy8zMDggMTM1MTIvNjA3LzMwOAorZiAxMzUxMy82MDkvMzA5IDEzNTE5LzYwNS8zMDkgMTM1MjIvNjA2LzMwOQorZiAxMzUyMi82MDYvMzEwIDEzNTE0LzYxMC8zMTAgMTM1MTMvNjA5LzMxMAorZiAxMzUwMy81OTYvNTYzIDEzNTIzLzU5OS81NjMgMTM1MDcvNTk5LzU2MworZiAxMzUyNi82MTEvMzEyIDEzNTI3LzYxMS8zMTIgMTM1MjQvNjExLzMxMgorZiAxMzUyNC82MTEvNTY0IDEzNTI1LzYxMS81NjQgMTM1MjYvNjExLzU2NAorZiAxMzUzMC82MTIvNTY1IDEzNTI2LzYxMS81NjUgMTM1MjgvNjExLzU2NQorZiAxMzUyOC82MTEvNTY2IDEzNTI5LzYxMi81NjYgMTM1MzAvNjEyLzU2NgorZiAxMzUyNC82MTEvMzE2IDEzNTI3LzYxMS8zMTYgMTM1MzEvNjEzLzMxNgorZiAxMzUzMS82MTMvMzE3IDEzNTMyLzYwMS8zMTcgMTM1MjQvNjExLzMxNworZiAxMzUyNy82MTEvMzE4IDEzNTMzLzYxMi8zMTggMTM1MzQvNjE0LzMxOAorZiAxMzUzNC82MTQvNTY3IDEzNTMxLzYxMy81NjcgMTM1MjcvNjExLzU2NworZiAxMzUzMi82MDEvNTY4IDEzNTMxLzYxMy81NjggMTM1MzUvNjEzLzU2OAorZiAxMzUzNS82MTMvNTY5IDEzNTEwLzYwMS81NjkgMTM1MzIvNjAxLzU2OQorZiAxMzUzMS82MTMvNTcwIDEzNTM0LzYxNC81NzAgMTM1MzYvNjE1LzU3MAorZiAxMzUzNi82MTUvMzIzIDEzNTM1LzYxMy8zMjMgMTM1MzEvNjEzLzMyMworZiAxMzUzNS82MTMvNTcxIDEzNTM2LzYxNS81NzEgMTM1MzcvNjE1LzU3MQorZiAxMzUzNy82MTUvNTcyIDEzNTM4LzYxNi81NzIgMTM1MzUvNjEzLzU3MgorZiAxMzU0Mi82MTcvMzI2IDEzNTM5LzYxNy8zMjYgMTM1NDAvNjE4LzMyNgorZiAxMzU0MC82MTgvNTczIDEzNTQxLzYxOC81NzMgMTM1NDIvNjE3LzU3MworZiAxMzUzOC82MTkvNTc0IDEzNTM3LzYyMC81NzQgMTM1NDAvNjE4LzU3NAorZiAxMzU0MC82MTgvNTc1IDEzNTM5LzYxNy81NzUgMTM1MzgvNjE5LzU3NQorZiAxMzUzMi82MDEvNTc2IDEzNTEwLzYwMS81NzYgMTM1NDMvNjAxLzU3NgorZiAxMzU0Ni82MjEvMzMxIDEzNTQ3LzYyMS8zMzEgMTM1NDQvNjIxLzMzMQorZiAxMzU0NC82MjEvNTc3IDEzNTQ1LzYyMS81NzcgMTM1NDYvNjIxLzU3NworZiAxMzU1MC82MjEvNTc4IDEzNTQ2LzYyMS81NzggMTM1NDgvNjIxLzU3OAorZiAxMzU0OC82MjEvNTc5IDEzNTQ5LzYyMS81NzkgMTM1NTAvNjIxLzU3OQorZiAxMzU0NC82MjEvMzM1IDEzNTQ3LzYyMS8zMzUgMTM1NTEvNjIyLzMzNQorZiAxMzU1MS82MjIvMzM2IDEzNTUyLzYyMy8zMzYgMTM1NDQvNjIxLzMzNgorZiAxMzU0Ny82MjEvMzM3IDEzNTUzLzYyMS8zMzcgMTM1NTQvNjI0LzMzNworZiAxMzU1NC82MjQvMzM4IDEzNTUxLzYyMi8zMzggMTM1NDcvNjIxLzMzOAorZiAxMzU1Ni82MjMvMzM5IDEzNTUyLzYyMy8zMzkgMTM1NTEvNjIyLzMzOQorZiAxMzU1MS82MjIvNTgwIDEzNTU1LzYyNS81ODAgMTM1NTYvNjIzLzU4MAorZiAxMzU1MS82MjIvNTgxIDEzNTU0LzYyNC81ODEgMTM1NTcvNjI0LzU4MQorZiAxMzU1Ny82MjQvNTgyIDEzNTU1LzYyNS81ODIgMTM1NTEvNjIyLzU4MgorZiAxMzU2MC82MjYvMzQzIDEzNTU4LzYyNy8zNDMgMTM1NTYvNjIzLzM0MworZiAxMzU1Ni82MjMvMzQzIDEzNTU5LzYyMy8zNDMgMTM1NjAvNjI2LzM0MworZiAxMzU1NS82MjUvNTgzIDEzNTU3LzYyNC81ODMgMTM1NjEvNjI0LzU4MworZiAxMzU2MS82MjQvNTg0IDEzNTYyLzYyOC81ODQgMTM1NTUvNjI1LzU4NAorZiAxMzU2My82MjkvMzQ3IDEzNTY0LzYzMC8zNDcgMTM1NjUvNjMwLzM0NworZiAxMzU2NS82MzAvMzQ3IDEzNTY2LzYyOS8zNDcgMTM1NjMvNjI5LzM0NworZiAxMzU3MC82MzEvMzQ5IDEzNTY3LzYzMS8zNDkgMTM1NjgvNjMyLzM0OQorZiAxMzU2OC82MzIvMzQ4IDEzNTY5LzYzMi8zNDggMTM1NzAvNjMxLzM0OAorZiAxMzU2MC82MzMvMzUxIDEzNTU5LzYzNC8zNTEgMTM1NjQvNjMwLzM1MQorZiAxMzU2NC82MzAvMzUxIDEzNTYzLzYyOS8zNTEgMTM1NjAvNjMzLzM1MQorZiAxMzU2Mi82MzUvNTg1IDEzNTYxLzYzNi81ODUgMTM1NjgvNjMyLzU4NQorZiAxMzU2OC82MzIvNTg2IDEzNTY3LzYzMS81ODYgMTM1NjIvNjM1LzU4NgorZiAxMzU1Mi82MjMvNTg3IDEzNTU2LzYyMy81ODcgMTM1NzEvNjI3LzU4NworZiAxMzU3NC82MzcvNTg4IDEzNTc1LzYzOC81ODggMTM1NzIvNjM4LzU4OAorZiAxMzU3Mi82MzgvMzU2IDEzNTczLzYzOC8zNTYgMTM1NzQvNjM3LzM1NgorZiAxMzU3Ny82MzcvMzU3IDEzNTc4LzYzNy8zNTcgMTM1NzYvNjM3LzM1NworZiAxMzU3Ni82MzcvMzU4IDEzNTc0LzYzNy8zNTggMTM1NzcvNjM3LzM1OAorZiAxMzU3Mi82MzgvNTg5IDEzNTc5LzYyNy81ODkgMTM1ODAvNjM5LzU4OQorZiAxMzU4MC82MzkvNTkwIDEzNTczLzYzOC81OTAgMTM1NzIvNjM4LzU5MAorZiAxMzU4Mi82MTIvNTkxIDEzNTczLzYzOC81OTEgMTM1ODAvNjM5LzU5MQorZiAxMzU4MC82MzkvNTkyIDEzNTgxLzY0MC81OTIgMTM1ODIvNjEyLzU5MgorZiAxMzU4My82MzkvNTkzIDEzNTgwLzYzOS81OTMgMTM1NzkvNjI3LzU5MworZiAxMzU3OS82MjcvMzY0IDEzNTU4LzYyNy8zNjQgMTM1ODMvNjM5LzM2NAorZiAxMzU4MC82MzkvNTk0IDEzNTgzLzYzOS81OTQgMTM1ODQvNjQwLzU5NAorZiAxMzU4NC82NDAvNTk1IDEzNTgxLzY0MC81OTUgMTM1ODAvNjM5LzU5NQorZiAxMzU4My82MzkvNTk2IDEzNTg1LzY0MS81OTYgMTM1ODYvNjQyLzU5NgorZiAxMzU4Ni82NDIvMzY4IDEzNTg0LzY0MC8zNjggMTM1ODMvNjM5LzM2OAorZiAxMzU4Ny82NDMvNTk3IDEzNTg4LzY0My81OTcgMTM1ODkvNjQ0LzU5NworZiAxMzU4OS82NDQvNTk4IDEzNTkwLzY0NC81OTggMTM1ODcvNjQzLzU5OAorZiAxMzU4NS82NDUvNTk5IDEzNTg3LzY0My81OTkgMTM1OTAvNjQ0LzU5OQorZiAxMzU5MC82NDQvNjAwIDEzNTg2LzY0Ni82MDAgMTM1ODUvNjQ1LzYwMAorZiAxMzU3OS82MjcvMzczIDEzNTkxLzYyNy8zNzMgMTM1NTgvNjI3LzM3MworZiAxMzU5NS82NDcvMzc0IDEzNTkyLzY0Ny8zNzQgMTM1OTMvNjQ4LzM3NAorZiAxMzU5My82NDgvMzc0IDEzNTk0LzY0OS8zNzQgMTM1OTUvNjQ3LzM3NAorZiAxMzU5NS82NTAvMzc1IDEzNTQzLzY1MC8zNzUgMTM1MjMvNjUwLzM3NQorZiAxMzUyMy82NTAvMzc2IDEzNTkyLzY1MC8zNzYgMTM1OTUvNjUwLzM3NgorZiAxMzU5Mi82NTAvMzc3IDEzNTIzLzY1MC8zNzcgMTM1MDMvNjUwLzM3NworZiAxMzU5My82NTEvNjAxIDEzNTkyLzY1Mi82MDEgMTM1MDMvNjUzLzYwMQorZiAxMzUwMy82NTMvNjAyIDEzNDk2LzY1NC82MDIgMTM1OTMvNjUxLzYwMgorZiAxMzU5My82NTEvMzgwIDEzNDk2LzY1NC8zODAgMTM0OTkvNjU0LzM4MAorZiAxMzQ5OS82NTQvNjAzIDEzNTk2LzY1MS82MDMgMTM1OTMvNjUxLzYwMworZiAxMzU5OC82NTUvNjA0IDEzNTk2LzY1MS82MDQgMTM0OTkvNjU0LzYwNAorZiAxMzQ5OS82NTQvNjA1IDEzNTk3LzY1Ni82MDUgMTM1OTgvNjU1LzYwNQorZiAxMzU5OC82NTcvNjA2IDEzNTk3LzY1OC82MDYgMTM1MDAvNjU4LzYwNgorZiAxMzUwMC82NTgvMzg0IDEzNTk5LzY1Ny8zODQgMTM1OTgvNjU3LzM4NAorZiAxMzU5OS82NTcvNjA3IDEzNTAwLzY1OC82MDcgMTM1MDIvNjU4LzYwNworZiAxMzUwMi82NTgvNjA4IDEzNjAwLzY1Ny82MDggMTM1OTkvNjU3LzYwOAorZiAxMzYwMC82NTcvMzg3IDEzNTAyLzY1OC8zODcgMTM1MDEvNjU5LzM4NworZiAxMzUwMS82NTkvMzg4IDEzNjAxLzY2MC8zODggMTM2MDAvNjU3LzM4OAorZiAxMzYwMi82NjAvMzg4IDEzNjAxLzY2MC8zODggMTM1MDEvNjU5LzM4OAorZiAxMzUwMS82NTkvMzg5IDEzNTA2LzY1OS8zODkgMTM2MDIvNjYwLzM4OQorZiAxMzYwMi82NjAvNjA5IDEzNTA2LzY1OS82MDkgMTM1MDUvNjYxLzYwOQorZiAxMzUwNS82NjEvNjEwIDEzNjAzLzY2Mi82MTAgMTM2MDIvNjYwLzYxMAorZiAxMzYwMy82NjMvMzkyIDEzNTA1LzY2NC8zOTIgMTM2MDQvNjY1LzM5MgorZiAxMzYwNi82NjMvNjExIDEzNjAzLzY2My82MTEgMTM2MDQvNjY1LzYxMQorZiAxMzYwNC82NjUvMzk0IDEzNjA1LzY2NS8zOTQgMTM2MDYvNjYzLzM5NAorZiAxMzYwNi82NjMvMzk1IDEzNjA1LzY2NS8zOTUgMTM1NTQvNjY1LzM5NQorZiAxMzYwNi82NjYvMzk2IDEzNTU0LzY2Ni8zOTYgMTM1NTMvNjY3LzM5NgorZiAxMzU1My82NjcvMzk3IDEzNjA3LzY2Ny8zOTcgMTM2MDYvNjY2LzM5NworZiAxMzYwNy82NjcvNjEyIDEzNTUzLzY2Ny82MTIgMTM1NTAvNjY4LzYxMgorZiAxMzU1MC82NjgvMzk5IDEzNjA4LzY2OS8zOTkgMTM2MDcvNjY3LzM5OQorZiAxMzYwOS82NjkvNDAwIDEzNjA4LzY2OS80MDAgMTM1NTAvNjY4LzQwMAorZiAxMzU1MC82NjgvNDAxIDEzNTQ5LzY2OC80MDEgMTM2MDkvNjY5LzQwMQorZiAxMzYxMC82NjkvNDAyIDEzNjA5LzY2OS80MDIgMTM1NDkvNjY4LzQwMgorZiAxMzU0OS82NjgvNDAzIDEzNTQ4LzY2OC80MDMgMTM2MTAvNjY5LzQwMworZiAxMzYxMC82NjkvNDA0IDEzNTQ4LzY2OC80MDQgMTM2MTEvNjY4LzQwNAorZiAxMzYxMS82NjgvNjEzIDEzNjEyLzY2OS82MTMgMTM2MTAvNjY5LzYxMworZiAxMzYxMi82NzAvNDA2IDEzNjExLzY3MS80MDYgMTM1NDUvNjcxLzQwNgorZiAxMzU0NS82NzEvMzgxIDEzNjEzLzY3MS8zODEgMTM2MTIvNjcwLzM4MQorZiAxMzYxNC82NzEvMzgxIDEzNjEzLzY3MS8zODEgMTM1NDUvNjcxLzM4MQorZiAxMzU0NS82NzEvNjE0IDEzNTQ0LzY3MS82MTQgMTM2MTQvNjcxLzYxNAorZiAxMzYxNC82NzEvNjE1IDEzNTQ0LzY3MS82MTUgMTM1NTIvNjcyLzYxNQorZiAxMzU1Mi82NzIvNDA5IDEzNjE1LzY3Mi80MDkgMTM2MTQvNjcxLzQwOQorZiAxMzYxNS82NzMvNDEwIDEzNTUyLzY3NC80MTAgMTM1NzEvNjc0LzQxMAorZiAxMzYxNi82NzUvNjE2IDEzNjE1LzY3My82MTYgMTM1NzEvNjc0LzYxNgorZiAxMzU3MS82NzQvNDEyIDEzNTkxLzY3Ni80MTIgMTM2MTYvNjc1LzQxMgorZiAxMzYxNi82NzUvNDEzIDEzNTkxLzY3Ni80MTMgMTM1NzkvNjc2LzQxMworZiAxMzYxNy82NzcvNDE0IDEzNjE2LzY3OC80MTQgMTM1NzkvNjc4LzQxNAorZiAxMzU3OS82NzgvNjE3IDEzNTcyLzY3OS82MTcgMTM2MTcvNjc3LzYxNworZiAxMzYxNy82NzcvNjE4IDEzNTcyLzY3OS82MTggMTM1NzUvNjc5LzYxOAorZiAxMzU3NS82NzkvNjE5IDEzNjE4LzY3Ny82MTkgMTM2MTcvNjc3LzYxOQorZiAxMzYyMC82ODAvNDE4IDEzNjE4LzY3Ny80MTggMTM1NzUvNjc5LzQxOAorZiAxMzU3NS82NzkvNDE5IDEzNjE5LzY3OS80MTkgMTM2MjAvNjgwLzQxOQorZiAxMzYyMC82ODEvNDIwIDEzNjE5LzY4Mi80MjAgMTM1NzYvNjgzLzQyMAorZiAxMzU3Ni82ODMvNjIwIDEzNjIxLzY4MS82MjAgMTM2MjAvNjgxLzYyMAorZiAxMzYyMS82ODEvNjIxIDEzNTc2LzY4My82MjEgMTM1NzgvNjgzLzYyMQorZiAxMzU3OC82ODMvNjIyIDEzNjIyLzY4NC82MjIgMTM2MjEvNjgxLzYyMgorZiAxMzYyMi82ODQvNjIzIDEzNTc4LzY4My82MjMgMTM1NzcvNjgzLzYyMworZiAxMzU3Ny82ODMvNjI0IDEzNjIzLzY4NC82MjQgMTM2MjIvNjg0LzYyNAorZiAxMzYyNC82ODQvMzk5IDEzNjIzLzY4NC8zOTkgMTM1NzcvNjgzLzM5OQorZiAxMzU3Ny82ODMvNjI1IDEzNTgyLzY4My82MjUgMTM2MjQvNjg0LzYyNQorZiAxMzYyNC82ODQvNDI4IDEzNTgyLzY4My80MjggMTM1ODEvNjg1LzQyOAorZiAxMzU4MS82ODUvNjI2IDEzNjI1LzY4Ni82MjYgMTM2MjQvNjg0LzYyNgorZiAxMzYyNS82ODcvNDMwIDEzNTgxLzY4OC80MzAgMTM2MjYvNjg4LzQzMAorZiAxMzYyOC82ODkvNjI3IDEzNjI1LzY4Ny82MjcgMTM2MjYvNjg4LzYyNworZiAxMzYyNi82ODgvNDMyIDEzNjI3LzY5MC80MzIgMTM2MjgvNjg5LzQzMgorZiAxMzYyOC82ODkvNDMzIDEzNjI3LzY5MC80MzMgMTM1MzQvNjkwLzQzMworZiAxMzYyOC82OTEvNDM0IDEzNTM0LzY5Mi80MzQgMTM1MzMvNjkzLzQzNAorZiAxMzUzMy82OTMvNDM1IDEzNjI5LzY5NC80MzUgMTM2MjgvNjkxLzQzNQorZiAxMzYyOS82OTQvNDM2IDEzNTMzLzY5My80MzYgMTM1MzAvNjkzLzQzNgorZiAxMzUzMC82OTMvMzg4IDEzNjMwLzY5NC8zODggMTM2MjkvNjk0LzM4OAorZiAxMzYzMS82OTQvMzg4IDEzNjMwLzY5NC8zODggMTM1MzAvNjkzLzM4OAorZiAxMzUzMC82OTMvNDM3IDEzNTI5LzY5My80MzcgMTM2MzEvNjk0LzQzNworZiAxMzYzMi82OTQvNDM4IDEzNjMxLzY5NC80MzggMTM1MjkvNjkzLzQzOAorZiAxMzUyOS82OTMvNDM5IDEzNTI4LzY5My80MzkgMTM2MzIvNjk0LzQzOQorZiAxMzYzMi82OTQvNjI4IDEzNTI4LzY5My82MjggMTM2MzMvNjkzLzYyOAorZiAxMzYzMy82OTMvNDQxIDEzNjM0LzY5NS80NDEgMTM2MzIvNjk0LzQ0MQorZiAxMzYzNC82OTYvNjI5IDEzNjMzLzY5Ny82MjkgMTM1MjUvNjk3LzYyOQorZiAxMzUyNS82OTcvNDE4IDEzNjM1LzY5Ni80MTggMTM2MzQvNjk2LzQxOAorZiAxMzU5NC82OTYvNDE3IDEzNjM1LzY5Ni80MTcgMTM1MjUvNjk3LzQxNworZiAxMzUyNS82OTcvNDQzIDEzNTI0LzY5Ny80NDMgMTM1OTQvNjk2LzQ0MworZiAxMzU5NC82OTYvNjMwIDEzNTI0LzY5Ny82MzAgMTM1MzIvNjk4LzYzMAorZiAxMzUzMi82OTgvNjMxIDEzNTk1LzY5OS82MzEgMTM1OTQvNjk2LzYzMQorZiAxMzU5NS82NTAvNjMyIDEzNTMyLzY1MC82MzIgMTM1NDMvNjUwLzYzMgorZiAxMzYwNy83MDAvNjMzIDEzNjAyLzcwMC82MzMgMTM2MDMvNzAxLzYzMworZiAxMzYwMy83MDEvNDQ4IDEzNjA2LzcwMS80NDggMTM2MDcvNzAwLzQ0OAorZiAxMzYwMS83MDAvMjIxIDEzNjAyLzcwMC8yMjEgMTM2MDcvNzAwLzIyMQorZiAxMzYwNy83MDAvMjIxIDEzNjA4LzcwMC8yMjEgMTM2MDEvNzAwLzIyMQorZiAxMzYwMC83MDAvMjIxIDEzNjAxLzcwMC8yMjEgMTM2MDgvNzAwLzIyMQorZiAxMzYwOC83MDAvMjIxIDEzNjA5LzcwMC8yMjEgMTM2MDAvNzAwLzIyMQorZiAxMzU5OS82NDgvMjIxIDEzNjAwLzcwMC8yMjEgMTM2MDkvNzAwLzIyMQorZiAxMzYwOS83MDAvNDQ5IDEzNjEwLzcwMC80NDkgMTM1OTkvNjQ4LzQ0OQorZiAxMzU5OC82NDgvNDUwIDEzNTk5LzY0OC80NTAgMTM2MTAvNzAwLzQ1MAorZiAxMzYxMC83MDAvMjIxIDEzNjEyLzcwMi8yMjEgMTM1OTgvNjQ4LzIyMQorZiAxMzYyMS83MDMvNDUxIDEzNjMyLzcwMy80NTEgMTM2MzQvNjQ4LzQ1MQorZiAxMzYzNC82NDgvMjg2IDEzNjIwLzcwMy8yODYgMTM2MjEvNzAzLzI4NgorZiAxMzYyMi83MDMvNDUyIDEzNjMxLzcwMy80NTIgMTM2MzIvNzAzLzQ1MgorZiAxMzYzMi83MDMvNDUzIDEzNjIxLzcwMy80NTMgMTM2MjIvNzAzLzQ1MworZiAxMzYyMy83MDMvMjIxIDEzNjMwLzcwMy8yMjEgMTM2MzEvNzAzLzIyMQorZiAxMzYzMS83MDMvMjE5IDEzNjIyLzcwMy8yMTkgMTM2MjMvNzAzLzIxOQorZiAxMzYyNC83MDMvMjIxIDEzNjI5LzcwNC8yMjEgMTM2MzAvNzAzLzIyMQorZiAxMzYzMC83MDMvMjIxIDEzNjIzLzcwMy8yMjEgMTM2MjQvNzAzLzIyMQorZiAxMzYyOS83MDQvNDU0IDEzNjI0LzcwMy80NTQgMTM2MjUvNzA1LzQ1NAorZiAxMzYyNS83MDUvNDU0IDEzNjI4LzcwNi80NTQgMTM2MjkvNzA0LzQ1NAorZiAxMzYzNC82NDgvMjIxIDEzNTk4LzY0OC8yMjEgMTM2MTIvNzAyLzIyMQorZiAxMzYxMi83MDIvMjIxIDEzNjIwLzcwMy8yMjEgMTM2MzQvNjQ4LzIyMQorZiAxMzYxNy83MDIvNDU1IDEzNjE0LzcwMi80NTUgMTM2MTUvNzA3LzQ1NQorZiAxMzYxNS83MDcvNDU1IDEzNjE2LzcwNy80NTUgMTM2MTcvNzAyLzQ1NQorZiAxMzYxMy83MDIvMjIxIDEzNjE0LzcwMi8yMjEgMTM2MTcvNzAyLzIyMQorZiAxMzYxNy83MDIvMjIxIDEzNjE4LzcwMi8yMjEgMTM2MTMvNzAyLzIyMQorZiAxMzYxMi83MDIvMjIxIDEzNjEzLzcwMi8yMjEgMTM2MTgvNzAyLzIyMQorZiAxMzYxOC83MDIvMjIxIDEzNjIwLzcwMy8yMjEgMTM2MTIvNzAyLzIyMQorZiAxMzU5Ni82NDgvMjIxIDEzNTk4LzY0OC8yMjEgMTM2MzQvNjQ4LzIyMQorZiAxMzYzNC82NDgvMjIxIDEzNjM1LzY0OC8yMjEgMTM1OTYvNjQ4LzIyMQorZiAxMzU5My82NDgvMjIxIDEzNTk2LzY0OC8yMjEgMTM2MzUvNjQ4LzIyMQorZiAxMzYzNS82NDgvMjIxIDEzNTk0LzY0OS8yMjEgMTM1OTMvNjQ4LzIyMQorZiAxMzUyOC82MTEvNDU2IDEzNTI2LzYxMS80NTYgMTM1MjUvNjExLzQ1NgorZiAxMzUyNS82MTEvNjM0IDEzNjMzLzU5NC82MzQgMTM1MjgvNjExLzYzNAorZiAxMzUyNy82MTEvNDU4IDEzNTI2LzYxMS80NTggMTM1MzAvNjEyLzQ1OAorZiAxMzUzMC82MTIvNDU5IDEzNTMzLzYxMi80NTkgMTM1MjcvNjExLzQ1OQorZiAxMzU5Ny81OTQvNTUwIDEzNDk5LzU5NC81NTAgMTM0OTgvNTk0LzU1MAorZiAxMzQ5OC81OTQvNDYxIDEzNTAwLzU5NC80NjEgMTM1OTcvNTk0LzQ2MQorZiAxMzUwNi81OTUvNDYyIDEzNTAxLzU5NS80NjIgMTM0OTgvNTk0LzQ2MgorZiAxMzQ5OC81OTQvNDYzIDEzNDk3LzU5NS80NjMgMTM1MDYvNTk1LzQ2MworZiAxMzU0OC82MjEvNjM1IDEzNTQ2LzYyMS82MzUgMTM1NDUvNjIxLzYzNQorZiAxMzU0NS82MjEvNDY1IDEzNjExLzYyMS80NjUgMTM1NDgvNjIxLzQ2NQorZiAxMzU0Ny82MjEvNjM2IDEzNTQ2LzYyMS82MzYgMTM1NTAvNjIxLzYzNgorZiAxMzU1MC82MjEvNjM3IDEzNTUzLzYyMS82MzcgMTM1NDcvNjIxLzYzNworZiAxMzYxOS82MzcvNTg4IDEzNTc1LzYzOC81ODggMTM1NzQvNjM3LzU4OAorZiAxMzU3NC82MzcvNDY5IDEzNTc2LzYzNy80NjkgMTM2MTkvNjM3LzQ2OQorZiAxMzU4Mi82MTIvNjM4IDEzNTc3LzYzNy82MzggMTM1NzQvNjM3LzYzOAorZiAxMzU3NC82MzcvNDcxIDEzNTczLzYzOC80NzEgMTM1ODIvNjEyLzQ3MQorZiAxMzUwOS82MDAvNDcyIDEzNTE0LzYwMC80NzIgMTM1NjEvNjI0LzQ3MgorZiAxMzU2MS82MjQvNjM5IDEzNTU3LzYyNC82MzkgMTM1MDkvNjAwLzYzOQorZiAxMzUyMS82MDYvNDc0IDEzNTY5LzYzMi80NzQgMTM1NjgvNjMyLzQ3NAorZiAxMzU2OC82MzIvNDc0IDEzNTIyLzYwNi80NzQgMTM1MjEvNjA2LzQ3NAorZiAxMzUyMi82MDYvNDc2IDEzNTY4LzYzMi80NzYgMTM1NjEvNjM2LzQ3NgorZiAxMzU2MS82MzYvNDc1IDEzNTE0LzYxMC80NzUgMTM1MjIvNjA2LzQ3NQorZiAxMzUwOS82MDAvNDc3IDEzNjA0LzU5OC80NzcgMTM1MDUvNTk4LzQ3NworZiAxMzU1NC82MjQvNDc4IDEzNjA1LzcwOC80NzggMTM1NTcvNjI0LzQ3OAorZiAxMzU1Ni82MjMvNjQwIDEzNTU1LzYyNS82NDAgMTM1NjIvNjI4LzY0MAorZiAxMzU2Mi82MjgvNDgwIDEzNTU5LzYyMy80ODAgMTM1NTYvNjIzLzQ4MAorZiAxMzU2NC82MzAvNDgxIDEzNTY3LzcwOS80ODEgMTM1NzAvNzA5LzQ4MQorZiAxMzU3MC83MDkvNjQxIDEzNTY1LzYzMC82NDEgMTM1NjQvNjMwLzY0MQorZiAxMzU1OS82MzQvNjQyIDEzNTYyLzcxMC82NDIgMTM1NjcvNzA5LzY0MgorZiAxMzU2Ny83MDkvNjQzIDEzNTY0LzYzMC82NDMgMTM1NTkvNjM0LzY0MworZiAxMzU1OC82MjcvNjQ0IDEzNTYwLzYyNi82NDQgMTM1ODUvNjQxLzY0NAorZiAxMzU4NS82NDEvNjQ1IDEzNTgzLzYzOS82NDUgMTM1NTgvNjI3LzY0NQorZiAxMzU2Ni82MjkvNDg3IDEzNTg4LzcxMS80ODcgMTM1ODcvNzExLzQ4NworZiAxMzU4Ny83MTEvNjQ2IDEzNTYzLzYyOS82NDYgMTM1NjYvNjI5LzY0NgorZiAxMzU2MC82MzMvNjQ3IDEzNTYzLzYyOS82NDcgMTM1ODcvNzExLzY0NworZiAxMzU4Ny83MTEvNjQ4IDEzNTg1LzcxMi82NDggMTM1NjAvNjMzLzY0OAorZiAxMzUzNy82MTUvNjQ5IDEzNTM2LzYxNS82NDkgMTM1ODQvNjQwLzY0OQorZiAxMzU4NC82NDAvNDkyIDEzNTg2LzY0Mi80OTIgMTM1MzcvNjE1LzQ5MgorZiAxMzU0MC82MTgvNDkzIDEzNTkwLzY0NC80OTMgMTM1ODkvNjQ0LzQ5MworZiAxMzU4OS82NDQvNDkzIDEzNTQxLzYxOC80OTMgMTM1NDAvNjE4LzQ5MworZiAxMzUzNy82MjAvNjUwIDEzNTg2LzY0Ni82NTAgMTM1OTAvNjQ0LzY1MAorZiAxMzU5MC82NDQvNjUxIDEzNTQwLzYxOC82NTEgMTM1MzcvNjIwLzY1MQorZiAxMzUzNC82MTQvNDk2IDEzNjI3LzY0MC80OTYgMTM1MzYvNjE1LzQ5NgorZiAxMzU4NC82NDAvNDk3IDEzNjI2LzY0MC80OTcgMTM1ODEvNjQwLzQ5NworZiAxMzUwNy81OTkvNjUyIDEzNTEyLzU5OS82NTIgMTM1MTMvNTk3LzY1MgorZiAxMzUxMy81OTcvNDk5IDEzNTA4LzU5Ny80OTkgMTM1MDcvNTk5LzQ5OQorZiAxMzUxOC82MDMvNTAwIDEzNTIwLzcxMy81MDAgMTM1MTkvNzEzLzUwMAorZiAxMzUxOS83MTMvNjUzIDEzNTE1LzYwMy82NTMgMTM1MTgvNjAzLzY1MworZiAxMzUxMi82MDcvNTAyIDEzNTE1LzYwMy81MDIgMTM1MTkvNzEzLzUwMgorZiAxMzUxOS83MTMvNTAzIDEzNTEzLzcxNC81MDMgMTM1MTIvNjA3LzUwMworZiAxMzUxMC82MDEvNTA0IDEzNTM1LzYxMy81MDQgMTM1MzgvNjE2LzUwNAorZiAxMzUzOC82MTYvNTA1IDEzNTExLzYwMi81MDUgMTM1MTAvNjAxLzUwNQorZiAxMzUxNi82MDQvNTA2IDEzNTM5LzcxNS81MDYgMTM1NDIvNzE1LzUwNgorZiAxMzU0Mi83MTUvNTA3IDEzNTE3LzYwNC81MDcgMTM1MTYvNjA0LzUwNworZiAxMzUxMS82MDgvNjU0IDEzNTM4LzcxNi82NTQgMTM1MzkvNzE1LzY1NAorZiAxMzUzOS83MTUvNjU1IDEzNTE2LzYwNC82NTUgMTM1MTEvNjA4LzY1NQorZiAxMzUwOS82MDAvNTEwIDEzNTU3LzYyNC81MTAgMTM2MDUvNzA4LzUxMAorZiAxMzYwNS83MDgvNTExIDEzNjA0LzU5OC81MTEgMTM1MDkvNjAwLzUxMQorZiAxMzUyMy81OTkvNTEyIDEzNTQzLzYwMS81MTIgMTM1MTAvNjAxLzUxMgorZiAxMzUxMC82MDEvNTEzIDEzNTA3LzU5OS81MTMgMTM1MjMvNTk5LzUxMworZiAxMzU1Ni82MjMvNTE0IDEzNTU4LzYyNy81MTQgMTM1OTEvNjI3LzUxNAorZiAxMzU5MS82MjcvNjU2IDEzNTcxLzYyNy82NTYgMTM1NTYvNjIzLzY1NgorZiAxMzU4NC82NDAvNjU3IDEzNTM2LzYxNS82NTcgMTM2MjcvNjQwLzY1NworZiAxMzYyNy82NDAvNTE3IDEzNjI2LzY0MC81MTcgMTM1ODQvNjQwLzUxNworZiAxMzY1MC83MTcvNjU4IDEzNjQ5LzcxOC82NTggMTM2NDgvNzE5LzY1OAorZiAxMzY0OC83MTkvNjU5IDEzNjQ3LzcyMC82NTkgMTM2NTAvNzE3LzY1OQorZiAxMzY1MC83MTcvNjYwIDEzNjUyLzcyMS82NjAgMTM2NTEvNzIyLzY2MAorZiAxMzY1MS83MjIvNjYxIDEzNjQ5LzcxOC82NjEgMTM2NTAvNzE3LzY2MQorZiAxMzYzNi83MjMvNjYyIDEzNjUzLzcyNC82NjIgMTM2NTQvNzI1LzY2MgorZiAxMzY1NC83MjUvNjYyIDEzNzQ0LzcyNi82NjIgMTM2MzYvNzIzLzY2MgorZiAxMzY1OC83MjcvNjYzIDEzNjU3LzcyOC82NjMgMTM2NTYvNzI5LzY2MworZiAxMzY1Ni83MjkvNjY0IDEzNjU1LzczMC82NjQgMTM2NTgvNzI3LzY2NAorZiAxMzY2MC83MzEvNjY1IDEzNjU4LzcyNy82NjUgMTM2NTUvNzMwLzY2NQorZiAxMzY1NS83MzAvNjY1IDEzNjU5LzczMi82NjUgMTM2NjAvNzMxLzY2NQorZiAxMzc1NC83MzMvNjY2IDEzNjYxLzczNC82NjYgMTM2NjIvNzM1LzY2NgorZiAxMzY2Mi83MzUvNjY3IDEzNzUzLzczNi82NjcgMTM3NTQvNzMzLzY2NworZiAxMzY0OS83MTgvNjY4IDEzNjY0LzczNy82NjggMTM2NjMvNzM4LzY2OAorZiAxMzY2My83MzgvNjY5IDEzNjQ4LzcxOS82NjkgMTM2NDkvNzE4LzY2OQorZiAxMzY1MS83MjIvNjcwIDEzNjY1LzczOS82NzAgMTM2NjQvNzM3LzY3MAorZiAxMzY2NC83MzcvNjcxIDEzNjQ5LzcxOC82NzEgMTM2NTEvNzIyLzY3MQorZiAxMzY2Ni83NDAvNjcyIDEzNjQ3LzcyMC82NzIgMTM2NDgvNzE5LzY3MgorZiAxMzY0OC83MTkvNjczIDEzNjYxLzczNC82NzMgMTM2NjYvNzQwLzY3MworZiAxMzY2MS83MzQvNjc0IDEzNjQ4LzcxOS82NzQgMTM2NjMvNzM4LzY3NAorZiAxMzY2My83MzgvNjc1IDEzNjYyLzczNS82NzUgMTM2NjEvNzM0LzY3NQorZiAxMzY2Ny83NDEvNjc2IDEzNjcwLzc0Mi82NzYgMTM2NjkvNzQzLzY3NgorZiAxMzY2OS83NDMvNjc3IDEzNjY4Lzc0NC82NzcgMTM2NjcvNzQxLzY3NworZiAxMzY3MS83NDUvNjc4IDEzNjcyLzc0Ni82NzggMTM2NzAvNzQyLzY3OAorZiAxMzY3MC83NDIvNjc5IDEzNjY3Lzc0MS82NzkgMTM2NzEvNzQ1LzY3OQorZiAxMzY2OC83NDQvNjgwIDEzNjY5Lzc0My82ODAgMTM2NzQvNzQ3LzY4MAorZiAxMzY3NC83NDcvNjgxIDEzNjczLzc0OC82ODEgMTM2NjgvNzQ0LzY4MQorZiAxMzY3Ni83NDkvNjgyIDEzNjU0Lzc1MC82ODIgMTM2NTcvNzI4LzY4MgorZiAxMzY1Ny83MjgvNjgyIDEzNjc1Lzc1MS82ODIgMTM2NzYvNzQ5LzY4MgorZiAxMzg1MC83NTIvNjgzIDEzNjQxLzc1My82ODMgMTM2NDIvNzU0LzY4MworZiAxMzY0Mi83NTUvNjgzIDEzNjUxLzcyMi82ODMgMTM4NTEvNzIxLzY4MworZiAxMzcxOS83NTYvNjg0IDEzNjY1LzczOS82ODQgMTM2NTEvNzIyLzY4NAorZiAxMzY1MS83MjIvNjg1IDEzNjQyLzc1NS82ODUgMTM3MTkvNzU2LzY4NQorZiAxMzcyMC83NTcvNjg2IDEzNjQzLzc1OC82ODYgMTM4NTIvNzU5LzY4NgorZiAxMzg1My83NjAvNjg2IDEzODU0Lzc2MS82ODYgMTM3MjAvNzYyLzY4NgorZiAxMzY0NC83NjMvNjg3IDEzODU1Lzc2NC82ODcgMTM4NTYvNzY1LzY4NworZiAxMzg1Ny83NjYvNjg3IDEzNzIxLzc2Ny82ODcgMTM2NDQvNzY4LzY4NworZiAxMzYzOC83NjkvNjg4IDEzNjczLzc3MC82ODggMTM2NzQvNzcxLzY4OAorZiAxMzY3NC83NzEvNjg5IDEzNjM3Lzc3Mi82ODkgMTM2MzgvNzY5LzY4OQorZiAxMzY3OC83NzMvNjkwIDEzNjc3Lzc3NC82OTAgMTM2NTAvNzc0LzY5MAorZiAxMzY1MC83NzQvNjkxIDEzNjQ3Lzc3My82OTEgMTM2NzgvNzczLzY5MQorZiAxMzY3Ny83NzQvNjkyIDEzNjc5Lzc3NS82OTIgMTM2NTIvNzc1LzY5MgorZiAxMzY1Mi83NzUvNjkyIDEzNjUwLzc3NC82OTIgMTM2NzcvNzc0LzY5MgorZiAxMzY4MC83NzYvNjkzIDEzNjc4Lzc3Ny82OTMgMTM2NDcvNzc4LzY5MworZiAxMzY0Ny83NzgvNjk0IDEzNjY2Lzc3Ni82OTQgMTM2ODAvNzc2LzY5NAorZiAxMzYzOS83NzkvNjk1IDEzNjgwLzc3Ni82OTUgMTM2NjYvNzc2LzY5NQorZiAxMzY2Ni83NzYvNjk2IDEzNzgwLzc4MC82OTYgMTM2MzkvNzc5LzY5NgorZiAxMzg1OC83ODEvNjk3IDEzNzI4Lzc4Mi82OTcgMTM2NDEvNzgzLzY5NworZiAxMzY0MS83ODQvNjk3IDEzODU5Lzc4NS82OTcgMTM4NjAvNzg2LzY5NworZiAxMzc0NC83MjYvNjYyIDEzNjU0LzcyNS82NjIgMTM2NzYvNzg3LzY2MgorZiAxMzY3Ni83ODcvNjYyIDEzNjQwLzc4OC82NjIgMTM3NDQvNzI2LzY2MgorZiAxMzY4MS83ODkvNjYzIDEzNjc1Lzc1MS82NjMgMTM2NTcvNzI4LzY2MworZiAxMzY1Ny83MjgvNjYzIDEzNjU4LzcyNy82NjMgMTM2ODEvNzg5LzY2MworZiAxMzY4Mi83OTAvNjY1IDEzNjgxLzc4OS82NjUgMTM2NTgvNzI3LzY2NQorZiAxMzY1OC83MjcvNjY1IDEzNjYwLzczMS82NjUgMTM2ODIvNzkwLzY2NQorZiAxMzY1My83OTEvNjgyIDEzNjU2LzcyOS82ODIgMTM2NTcvNzI4LzY4MgorZiAxMzY1Ny83MjgvNjgyIDEzNjU0Lzc1MC82ODIgMTM2NTMvNzkxLzY4MgorZiAxMzY0NS83OTIvNjg3IDEzODYxLzc5My82ODcgMTM4NjIvNzk0LzY4NworZiAxMzg2My83OTUvNjg3IDEzNjQ0Lzc5Ni82ODcgMTM2NDUvNzk3LzY4NworZiAxMzY1Ni83MjkvNjk4IDEzNjY5Lzc0My82OTggMTM2NzAvNzQyLzY5OAorZiAxMzY3MC83NDIvNjk5IDEzNjU1LzczMC82OTkgMTM2NTYvNzI5LzY5OQorZiAxMzY2OC83OTgvNzAwIDEzNjYzLzc5OC83MDAgMTM2NjQvNzk5LzcwMAorZiAxMzY2NC83MzcvNzAxIDEzNjY3LzgwMC83MDEgMTM2NjgvNzM4LzcwMQorZiAxMzY1NS83MzAvNzAyIDEzNjcwLzc0Mi83MDIgMTM2NzIvNzQ2LzcwMgorZiAxMzY3Mi83NDYvNzAzIDEzNjU5LzczMi83MDMgMTM2NTUvNzMwLzcwMworZiAxMzY2Ny84MDAvNzA0IDEzNjY0LzczNy83MDQgMTM2NjUvNzM5LzcwNAorZiAxMzY2NS83MzkvNzA1IDEzNjcxLzgwMS83MDUgMTM2NjcvODAwLzcwNQorZiAxMzY1My84MDIvNzA2IDEzNjc0LzgwMy83MDYgMTM2NjkvODA0LzcwNgorZiAxMzY2OS84MDQvNzA3IDEzNjU2LzgwNS83MDcgMTM2NTMvODAyLzcwNworZiAxMzY3My83MzUvNzA4IDEzNjYyLzczNS83MDggMTM2NjMvNzM4LzcwOAorZiAxMzY2My83MzgvNzA5IDEzNjY4LzczOC83MDkgMTM2NzMvNzM1LzcwOQorZiAxMzg2NC84MDYvNzEwIDEzODY1LzgwNi83MTAgMTM2NDMvODA3LzcxMAorZiAxMzY0My84MDgvNzEwIDEzNzIxLzgwOS83MTAgMTM4NjYvODEwLzcxMAorZiAxMzg2Ny84MDEvNzExIDEzNjY1LzczOS83MTEgMTM3MTkvNzU2LzcxMQorZiAxMzcxOS84MTEvNzEyIDEzNzIwLzgxMi83MTIgMTM4NjgvODEzLzcxMgorZiAxMzYzNi83MjMvNzEzIDEzNjM3Lzc3Mi83MTMgMTM2NzQvNzcxLzcxMworZiAxMzY3NC83NzEvNzE0IDEzNjUzLzcyNC83MTQgMTM2MzYvNzIzLzcxNAorZiAxMzY4My84MTQvNzE1IDEzNjc3Lzc3NC83MTUgMTM2NzgvNzczLzcxNQorZiAxMzY3OC83NzMvNzE1IDEzNjg0LzgxNS83MTUgMTM2ODMvODE0LzcxNQorZiAxMzY4NS84MTYvNjkyIDEzNjc5Lzc3NS82OTIgMTM2NzcvNzc0LzY5MgorZiAxMzY3Ny83NzQvNjkyIDEzNjgzLzgxNC82OTIgMTM2ODUvODE2LzY5MgorZiAxMzY4NC84MTcvNzE2IDEzNjc4Lzc3Ny83MTYgMTM2ODAvNzc2LzcxNgorZiAxMzY4MC83NzYvNzE2IDEzNjg2LzgxOC83MTYgMTM2ODQvODE3LzcxNgorZiAxMzg2OS84MTkvNjk3IDEzNjQ2LzgyMC82OTcgMTM3MjgvODIxLzY5NworZiAxMzcyOC84MjIvNjk3IDEzODcwLzgyMy82OTcgMTM4NzEvODI0LzY5NworZiAxMzY2MS83MzQvNzE3IDEzNzU0LzczMy83MTcgMTM3ODAvODI1LzcxNworZiAxMzc4MC84MjUvNzE4IDEzNjY2Lzc0MC83MTggMTM2NjEvNzM0LzcxOAorZiAxMzY2Mi83NzAvNzE5IDEzNjczLzc3MC83MTkgMTM2MzgvNzY5LzcxOQorZiAxMzYzOC83NjkvNzIwIDEzNzUzLzc2OS83MjAgMTM2NjIvNzcwLzcyMAorZiAxMzY4Ni84MTgvNzIxIDEzNjgwLzc3Ni83MjEgMTM2MzkvNzc5LzcyMQorZiAxMzYzOS83NzkvNzIxIDEzNzkwLzgyNi83MjEgMTM2ODYvODE4LzcyMQorZiAxMzY4OC84MjcvNzIyIDEzNjg3LzgyOC83MjIgMTM2OTAvODI5LzcyMgorZiAxMzY5MC84MjkvNzIzIDEzNjg5LzgzMC83MjMgMTM2ODgvODI3LzcyMworZiAxMzY4OC84MjcvNzI0IDEzNjg5LzgzMC83MjQgMTM2OTIvODMxLzcyNAorZiAxMzY5Mi84MzEvNzI1IDEzNjkxLzgzMi83MjUgMTM2ODgvODI3LzcyNQorZiAxMzc5OC84MzMvNzI2IDEzNzk5LzgzNC83MjYgMTM2OTQvODM1LzcyNgorZiAxMzY5NC84MzUvNzI2IDEzNjkzLzgzNi83MjYgMTM3OTgvODMzLzcyNgorZiAxMzY5Ni84MzcvNzI3IDEzNjk1LzgzOC83MjcgMTM2OTgvODM5LzcyNworZiAxMzY5OC84MzkvNzI3IDEzNjk3Lzg0MC83MjcgMTM2OTYvODM3LzcyNworZiAxMzcwMC84NDEvNzI4IDEzNjk5Lzg0Mi83MjggMTM2OTUvODM4LzcyOAorZiAxMzY5NS84MzgvNzI4IDEzNjk2LzgzNy83MjggMTM3MDAvODQxLzcyOAorZiAxMzcwNC84NDMvNzI5IDEzNzAzLzg0NC83MjkgMTM3MDIvODQ1LzcyOQorZiAxMzcwMi84NDUvNzMwIDEzNzAxLzg0Ni83MzAgMTM3MDQvODQzLzczMAorZiAxMzY4OS84MzAvNzMxIDEzNjkwLzgyOS83MzEgMTM3MDYvODQ3LzczMQorZiAxMzcwNi84NDcvNzMyIDEzNzA1Lzg0OC83MzIgMTM2ODkvODMwLzczMgorZiAxMzY5Mi84MzEvNzMzIDEzNjg5LzgzMC83MzMgMTM3MDUvODQ4LzczMworZiAxMzcwNS84NDgvNzM0IDEzNzA3Lzg0OS83MzQgMTM2OTIvODMxLzczNAorZiAxMzcwOC84NTAvNzM1IDEzNzAxLzg0Ni83MzUgMTM2OTAvODI5LzczNQorZiAxMzY5MC84MjkvNzM2IDEzNjg3LzgyOC83MzYgMTM3MDgvODUwLzczNgorZiAxMzcwMS84NDYvNzM3IDEzNzAyLzg0NS83MzcgMTM3MDYvODQ3LzczNworZiAxMzcwNi84NDcvNzM4IDEzNjkwLzgyOS83MzggMTM3MDEvODQ2LzczOAorZiAxMzcwOS84NTEvNzM5IDEzNzEyLzg1Mi83MzkgMTM3MTEvODUzLzczOQorZiAxMzcxMS84NTMvNzQwIDEzNzEwLzg1NC83NDAgMTM3MDkvODUxLzc0MAorZiAxMzcxMy84NTUvNzQxIDEzNzA5Lzg1MS83NDEgMTM3MTAvODU0Lzc0MQorZiAxMzcxMC84NTQvNzQyIDEzNzE0Lzg1Ni83NDIgMTM3MTMvODU1Lzc0MgorZiAxMzcxMi84NTcvNzQzIDEzNzE2Lzg1OC83NDMgMTM3MTUvODU5Lzc0MworZiAxMzcxNS84NTkvNzQ0IDEzNzExLzg2MC83NDQgMTM3MTIvODU3Lzc0NAorZiAxMzcxOC84NjEvNzQ1IDEzNzE3Lzg2Mi83NDUgMTM2OTcvODQwLzc0NQorZiAxMzY5Ny84NDAvNzQ1IDEzNjk0Lzg2My83NDUgMTM3MTgvODYxLzc0NQorZiAxMzg3Mi84MzIvNjgzIDEzNjkyLzgzMS82ODMgMTM2NDIvNzU1LzY4MworZiAxMzY0Mi83NTQvNzQ2IDEzNjQxLzc1My83NDYgMTM4NzMvODY0Lzc0NgorZiAxMzcxOS83NTYvNjg1IDEzNjQyLzc1NS82ODUgMTM2OTIvODMxLzY4NQorZiAxMzY5Mi84MzEvNjg0IDEzNzA3Lzg0OS82ODQgMTM3MTkvNzU2LzY4NAorZiAxMzcyMC84NjUvNjg2IDEzODc0Lzg2Ni82ODYgMTM4NzUvODY3LzY4NgorZiAxMzg3Ni84NjgvNjg2IDEzNjQzLzc1OC82ODYgMTM3MjAvNzU3LzY4NgorZiAxMzY0NC83NjgvNjg3IDEzNzIxLzc2Ny82ODcgMTM4NzcvODY5LzY4NworZiAxMzg3OC84NzAvNjg3IDEzODc5Lzg3MS82ODcgMTM2NDQvODcyLzY4NworZiAxMzcyMi84NzMvNzQ3IDEzODIzLzg3NC83NDcgMTM3MTUvODU5Lzc0NworZiAxMzcxNS84NTkvNzQ4IDEzNzE2Lzg1OC83NDggMTM3MjIvODczLzc0OAorZiAxMzcyMy84NzUvNzQ5IDEzNjg3Lzg3NS83NDkgMTM2ODgvODc2Lzc0OQorZiAxMzY4OC84NzYvNzUwIDEzNzI0Lzg3Ni83NTAgMTM3MjMvODc1Lzc1MAorZiAxMzcyNC84NzYvNzUxIDEzNjg4Lzg3Ni83NTEgMTM2OTEvODc3Lzc1MQorZiAxMzY5MS84NzcvNzUxIDEzNzI1Lzg3Ny83NTEgMTM3MjQvODc2Lzc1MQorZiAxMzcyNi84NzgvNzUyIDEzNzA4Lzg3OC83NTIgMTM2ODcvODc5Lzc1MgorZiAxMzY4Ny84NzkvNzUzIDEzNzIzLzg4MC83NTMgMTM3MjYvODc4Lzc1MworZiAxMzcyNy84ODEvNzU0IDEzODI4Lzg4MS83NTQgMTM3MDgvODc4Lzc1NAorZiAxMzcwOC84NzgvNzU1IDEzNzI2Lzg3OC83NTUgMTM3MjcvODgxLzc1NQorZiAxMzg4MC84ODIvNjk3IDEzODgxLzg4My82OTcgMTM2NDEvODg0LzY5NworZiAxMzY0MS83ODMvNjk3IDEzNzI4Lzc4Mi82OTcgMTM4ODIvODg1LzY5NworZiAxMzc5OS84MzQvNzI2IDEzNzI5Lzg4Ni83MjYgMTM3MTgvODg3LzcyNgorZiAxMzcxOC84ODcvNzI2IDEzNjk0LzgzNS83MjYgMTM3OTkvODM0LzcyNgorZiAxMzczMC84ODgvNzI3IDEzNjk2LzgzNy83MjcgMTM2OTcvODQwLzcyNworZiAxMzY5Ny84NDAvNzI3IDEzNzE3Lzg2Mi83MjcgMTM3MzAvODg4LzcyNworZiAxMzczMS84ODkvNzI4IDEzNzAwLzg0MS83MjggMTM2OTYvODM3LzcyOAorZiAxMzY5Ni84MzcvNzI4IDEzNzMwLzg4OC83MjggMTM3MzEvODg5LzcyOAorZiAxMzY5My84OTAvNzQ1IDEzNjk0Lzg2My83NDUgMTM2OTcvODQwLzc0NQorZiAxMzY5Ny84NDAvNzQ1IDEzNjk4LzgzOS83NDUgMTM2OTMvODkwLzc0NQorZiAxMzY0NS83OTcvNjg3IDEzNjQ0Lzc5Ni82ODcgMTM4ODMvODkxLzY4NworZiAxMzg4NC84OTIvNjg3IDEzODg1Lzg5My82ODcgMTM2NDUvODk0LzY4NworZiAxMzY5OC84MzkvNzU2IDEzNjk1LzgzOC83NTYgMTM3MTAvODU0Lzc1NgorZiAxMzcxMC84NTQvNzU3IDEzNzExLzg1My83NTcgMTM2OTgvODM5Lzc1NworZiAxMzcxMi84OTUvNzU4IDEzNzA5Lzg5Ni83NTggMTM3MDUvODQ4Lzc1OAorZiAxMzcwNS84OTcvNzU5IDEzNzA2Lzg5OC83NTkgMTM3MTIvODk4Lzc1OQorZiAxMzY5NS84MzgvNzYwIDEzNjk5Lzg0Mi83NjAgMTM3MTQvODU2Lzc2MAorZiAxMzcxNC84NTYvNzYxIDEzNzEwLzg1NC83NjEgMTM2OTUvODM4Lzc2MQorZiAxMzcwOS84OTYvNzYyIDEzNzEzLzg5OS83NjIgMTM3MDcvODQ5Lzc2MgorZiAxMzcwNy84NDkvNzYzIDEzNzA1Lzg0OC83NjMgMTM3MDkvODk2Lzc2MworZiAxMzY5My85MDAvNzY0IDEzNjk4LzkwMS83NjQgMTM3MTEvOTAyLzc2NAorZiAxMzcxMS85MDIvNzY1IDEzNzE1LzkwMy83NjUgMTM2OTMvOTAwLzc2NQorZiAxMzcxNi85MDQvNzY2IDEzNzEyLzg5NS83NjYgMTM3MDYvODQ3Lzc2NgorZiAxMzcwNi84NDcvNzY3IDEzNzAyLzg0NS83NjcgMTM3MTYvOTA0Lzc2NworZiAxMzg4Ni85MDUvNzY4IDEzNzIxLzgwOS83NjggMTM2NDMvODA4Lzc2OAorZiAxMzY0My85MDYvNzY5IDEzODg3LzkwNy83NjkgMTM4ODgvOTA4Lzc2OQorZiAxMzg4OS85MDkvNzEyIDEzNzIwLzgxMi83MTIgMTM3MTkvODExLzcxMgorZiAxMzcxOS83NTYvNzcwIDEzNzA3Lzg0OS83NzAgMTM4OTAvODk5Lzc3MAorZiAxMzc5OC84MzMvNzcxIDEzNjkzLzgzNi83NzEgMTM3MTUvODU5Lzc3MQorZiAxMzcxNS84NTkvNzcyIDEzODIzLzg3NC83NzIgMTM3OTgvODMzLzc3MgorZiAxMzczMy85MTAvNzczIDEzNzMyLzkxMS83NzMgMTM3MjMvODc1Lzc3MworZiAxMzcyMy84NzUvNzczIDEzNzI0Lzg3Ni83NzMgMTM3MzMvOTEwLzc3MworZiAxMzczNC85MTIvNzUxIDEzNzMzLzkxMC83NTEgMTM3MjQvODc2Lzc1MQorZiAxMzcyNC84NzYvNzUxIDEzNzI1Lzg3Ny83NTEgMTM3MzQvOTEyLzc1MQorZiAxMzczMi85MTMvNzc0IDEzNzM1LzkxNC83NzQgMTM3MjYvODc4Lzc3NAorZiAxMzcyNi84NzgvNzUyIDEzNzIzLzg4MC83NTIgMTM3MzIvOTEzLzc1MgorZiAxMzg5MS85MTUvNjk3IDEzODkyLzkxNi82OTcgMTM3MjgvOTE3LzY5NworZiAxMzcyOC84MjEvNjk3IDEzNjQ2LzgyMC82OTcgMTM4OTMvOTE4LzY5NworZiAxMzcwMS84NDYvNzc1IDEzNzA4Lzg1MC83NzUgMTM4MjgvOTE5Lzc3NQorZiAxMzgyOC85MTkvNzc2IDEzNzA0Lzg0My83NzYgMTM3MDEvODQ2Lzc3NgorZiAxMzcwMi85MjAvNzc3IDEzNzAzLzg3My83NzcgMTM3MjIvODczLzc3NworZiAxMzcyMi84NzMvNzc4IDEzNzE2Lzg1OC83NzggMTM3MDIvOTIwLzc3OAorZiAxMzczNS85MTQvNzU1IDEzODM1LzkyMS83NTUgMTM3MjcvODgxLzc1NQorZiAxMzcyNy84ODEvNzU1IDEzNzI2Lzg3OC83NTUgMTM3MzUvOTE0Lzc1NQorZiAxMzczNy85MjIvNzc5IDEzNzM2LzkyMy83NzkgMTM3MzkvOTI0Lzc3OQorZiAxMzczOS85MjQvNzgwIDEzNzM4LzkyNS83ODAgMTM3MzcvOTIyLzc4MAorZiAxMzczNy85MjIvNzgxIDEzNzM4LzkyNS83ODEgMTM3NDEvOTI2Lzc4MQorZiAxMzc0MS85MjYvNzgyIDEzNzQwLzkyNy83ODIgMTM3MzcvOTIyLzc4MgorZiAxMzYzNi83MjMvNzgzIDEzNzQ0LzcyNi83ODMgMTM3NDMvOTI4Lzc4MworZiAxMzc0My85MjgvNzg0IDEzNzQyLzkyOS83ODQgMTM2MzYvNzIzLzc4NAorZiAxMzc0Ni85MzAvNzg1IDEzNzQ1LzkzMS83ODUgMTM3NDgvOTMyLzc4NQorZiAxMzc0OC85MzIvNzg1IDEzNzQ3LzkzMy83ODUgMTM3NDYvOTMwLzc4NQorZiAxMzc1MC85MzQvNzg2IDEzNzQ5LzkzNS83ODYgMTM3NDUvOTMxLzc4NgorZiAxMzc0NS85MzEvNzg2IDEzNzQ2LzkzMC83ODYgMTM3NTAvOTM0Lzc4NgorZiAxMzc1NC83MzMvNzg3IDEzNzUzLzczNi83ODcgMTM3NTIvOTM2Lzc4NworZiAxMzc1Mi85MzYvNzg4IDEzNzUxLzkzNy83ODggMTM3NTQvNzMzLzc4OAorZiAxMzczOC85MjUvNzg5IDEzNzM5LzkyNC83ODkgMTM3NTYvOTM4Lzc4OQorZiAxMzc1Ni85MzgvNzkwIDEzNzU1LzkzOS83OTAgMTM3MzgvOTI1Lzc5MAorZiAxMzc0MS85MjYvNzkxIDEzNzM4LzkyNS83OTEgMTM3NTUvOTM5Lzc5MQorZiAxMzc1NS85MzkvNzkyIDEzNzU3Lzk0MC83OTIgMTM3NDEvOTI2Lzc5MgorZiAxMzc1OC85NDEvNzkzIDEzNzUxLzkzNy83OTMgMTM3MzkvOTI0Lzc5MworZiAxMzczOS85MjQvNzk0IDEzNzM2LzkyMy83OTQgMTM3NTgvOTQxLzc5NAorZiAxMzc1MS85MzcvNzk1IDEzNzUyLzkzNi83OTUgMTM3NTYvOTM4Lzc5NQorZiAxMzc1Ni85MzgvNzk2IDEzNzM5LzkyNC83OTYgMTM3NTEvOTM3Lzc5NgorZiAxMzc1OS85NDIvNzk3IDEzNzYyLzk0My83OTcgMTM3NjEvOTMyLzc5NworZiAxMzc2MS85MzIvNzk4IDEzNzYwLzkzMS83OTggMTM3NTkvOTQyLzc5OAorZiAxMzc2My85NDQvNzk5IDEzNzU5Lzk0Mi83OTkgMTM3NjAvOTMxLzc5OQorZiAxMzc2MC85MzEvODAwIDEzNzY0LzkzNS84MDAgMTM3NjMvOTQ0LzgwMAorZiAxMzc2Mi85NDUvODAxIDEzNzY2Lzk0Ni84MDEgMTM3NjUvOTQ3LzgwMQorZiAxMzc2NS85NDcvODAyIDEzNzYxLzk0OC84MDIgMTM3NjIvOTQ1LzgwMgorZiAxMzc2OC85NDkvODAzIDEzNzY3Lzk1MC84MDMgMTM3NDcvOTUxLzgwMworZiAxMzc0Ny85NTEvODAzIDEzNzQzLzkyOC84MDMgMTM3NjgvOTQ5LzgwMworZiAxMzg5NC85MjcvODA0IDEzNzQxLzkyNi84MDQgMTM3NzAvOTUyLzgwNAorZiAxMzc3MC85NTMvODA1IDEzNzY5Lzk1NC84MDUgMTM4OTUvOTU1LzgwNQorZiAxMzc3MS85NTYvODA2IDEzNzcwLzk1Mi84MDYgMTM3NDEvOTI2LzgwNgorZiAxMzc0MS85MjYvODA3IDEzNzU3Lzk0MC84MDcgMTM3NzEvOTU2LzgwNworZiAxMzc3Mi85NTcvODA4IDEzODk2Lzk1OC84MDggMTM4OTcvOTU5LzgwOAorZiAxMzg5OC85NjAvODA4IDEzNzczLzk2MS84MDggMTM3NzIvOTYyLzgwOAorZiAxMzc3NS85NjMvNjk3IDEzNzc0Lzk2NC82OTcgMTM4OTkvOTY1LzY5NworZiAxMzkwMC85NjYvNjk3IDEzOTAxLzk2Ny82OTcgMTM3NzUvOTY4LzY5NworZiAxMzYzOC83NjkvODA5IDEzNjM3Lzc3Mi84MDkgMTM3NjUvOTQ3LzgwOQorZiAxMzc2NS85NDcvODEwIDEzNzY2Lzk0Ni84MTAgMTM2MzgvNzY5LzgxMAorZiAxMzc3Ni85NjkvODExIDEzNzM2Lzk2OS84MTEgMTM3MzcvOTcwLzgxMQorZiAxMzczNy85NzAvODExIDEzNzc3Lzk3MC84MTEgMTM3NzYvOTY5LzgxMQorZiAxMzc3Ny85NzAvODEyIDEzNzM3Lzk3MC84MTIgMTM3NDAvOTcxLzgxMgorZiAxMzc0MC85NzEvODEyIDEzNzc4Lzk3MS84MTIgMTM3NzcvOTcwLzgxMgorZiAxMzc3OS85NzIvODEzIDEzNzU4Lzk3Mi84MTMgMTM3MzYvOTczLzgxMworZiAxMzczNi85NzMvODE0IDEzNzc2Lzk3NC84MTQgMTM3NzkvOTcyLzgxNAorZiAxMzYzOS83NzkvODE1IDEzNzgwLzc4MC84MTUgMTM3NTgvOTcyLzgxNQorZiAxMzc1OC85NzIvODE2IDEzNzc5Lzk3Mi84MTYgMTM2MzkvNzc5LzgxNgorZiAxMzkwMi85NzUvNjg3IDEzOTAzLzk3Ni82ODcgMTM3NjkvOTc3LzY4NworZiAxMzc2OS85NzgvNjg3IDEzNzgxLzk3OS82ODcgMTM5MDQvOTgwLzY4NworZiAxMzc0NC83MjYvNzgzIDEzNjQwLzc4OC83ODMgMTM3NjgvOTQ5Lzc4MworZiAxMzc2OC85NDkvNzgzIDEzNzQzLzkyOC83ODMgMTM3NDQvNzI2Lzc4MworZiAxMzc4Mi85ODEvNzg1IDEzNzQ2LzkzMC83ODUgMTM3NDcvOTMzLzc4NQorZiAxMzc0Ny85MzMvNzg1IDEzNzY3Lzk4Mi83ODUgMTM3ODIvOTgxLzc4NQorZiAxMzc4My85ODMvNzg2IDEzNzUwLzkzNC83ODYgMTM3NDYvOTMwLzc4NgorZiAxMzc0Ni85MzAvNzg2IDEzNzgyLzk4MS83ODYgMTM3ODMvOTgzLzc4NgorZiAxMzc0Mi85MjkvODAzIDEzNzQzLzkyOC84MDMgMTM3NDcvOTUxLzgwMworZiAxMzc0Ny85NTEvODAzIDEzNzQ4Lzk4NC84MDMgMTM3NDIvOTI5LzgwMworZiAxMzc4NC85ODUvNjk3IDEzNzc1Lzk4Ni82OTcgMTM5MDUvOTg3LzY5NworZiAxMzkwNi85ODgvNjk3IDEzOTA3Lzk4OS82OTcgMTM3ODQvOTkwLzY5NworZiAxMzc0OC85MzIvODE3IDEzNzQ1LzkzMS84MTcgMTM3NjAvOTMxLzgxNworZiAxMzc2MC85MzEvODE4IDEzNzYxLzkzMi84MTggMTM3NDgvOTMyLzgxOAorZiAxMzc2Mi85MzgvODE5IDEzNzU5LzkzOS84MTkgMTM3NTUvOTM5LzgxOQorZiAxMzc1NS85OTEvODIwIDEzNzU2Lzk5Mi84MjAgMTM3NjIvOTkzLzgyMAorZiAxMzc0NS85MzEvODIxIDEzNzQ5LzkzNS84MjEgMTM3NjQvOTM1LzgyMQorZiAxMzc2NC85MzUvODIyIDEzNzYwLzkzMS84MjIgMTM3NDUvOTMxLzgyMgorZiAxMzc1OS85MzkvODIzIDEzNzYzLzk0MC84MjMgMTM3NTcvOTQwLzgyMworZiAxMzc1Ny85NDAvODI0IDEzNzU1LzkzOS84MjQgMTM3NTkvOTM5LzgyNAorZiAxMzc0Mi85OTQvODI1IDEzNzQ4Lzk5NS84MjUgMTM3NjEvOTk1LzgyNQorZiAxMzc2MS85OTUvODI2IDEzNzY1Lzk5NC84MjYgMTM3NDIvOTk0LzgyNgorZiAxMzc2Ni85MzYvODI3IDEzNzYyLzkzOC84MjcgMTM3NTYvOTM4LzgyNworZiAxMzc1Ni85MzgvODI4IDEzNzUyLzkzNi84MjggMTM3NjYvOTM2LzgyOAorZiAxMzkwOC85OTYvODI5IDEzNzc0Lzk5Ny84MjkgMTM3NzMvOTk4LzgyOQorZiAxMzc3My85OTkvODMwIDEzOTA5LzEwMDAvODMwIDEzOTEwLzEwMDAvODMwCitmIDEzOTExLzEwMDEvODMxIDEzNzcyLzEwMDIvODMxIDEzNzcxLzEwMDMvODMxCitmIDEzNzcxLzk1Ni84MzIgMTM3NTcvOTQwLzgzMiAxMzkxMi85NDAvODMyCitmIDEzNjM2LzcyMy84MzMgMTM3NDIvOTI5LzgzMyAxMzc2NS85NDcvODMzCitmIDEzNzY1Lzk0Ny84MzQgMTM2MzcvNzcyLzgzNCAxMzYzNi83MjMvODM0CitmIDEzNzg2LzEwMDQvODM1IDEzNzg1LzEwMDUvODM1IDEzNzc2Lzk2OS84MzUKK2YgMTM3NzYvOTY5LzgzNiAxMzc3Ny85NzAvODM2IDEzNzg2LzEwMDQvODM2CitmIDEzNzg3LzEwMDYvODEyIDEzNzg2LzEwMDQvODEyIDEzNzc3Lzk3MC84MTIKK2YgMTM3NzcvOTcwLzgxMiAxMzc3OC85NzEvODEyIDEzNzg3LzEwMDYvODEyCitmIDEzNzg1LzEwMDcvODM3IDEzNzg4LzEwMDgvODM3IDEzNzc5Lzk3Mi84MzcKK2YgMTM3NzkvOTcyLzgxMyAxMzc3Ni85NzQvODEzIDEzNzg1LzEwMDcvODEzCitmIDEzOTEzLzEwMDkvNjg3IDEzOTE0LzEwMTAvNjg3IDEzNzgxLzEwMTEvNjg3CitmIDEzNzgxLzEwMTIvNjg3IDEzNzg5LzEwMTMvNjg3IDEzOTE1LzEwMTQvNjg3CitmIDEzNzUxLzkzNy84MzggMTM3NTgvOTQxLzgzOCAxMzc4MC84MjUvODM4CitmIDEzNzgwLzgyNS84MzkgMTM3NTQvNzMzLzgzOSAxMzc1MS85MzcvODM5CitmIDEzNzUyLzk0Ni84NDAgMTM3NTMvNzY5Lzg0MCAxMzYzOC83NjkvODQwCitmIDEzNjM4Lzc2OS84NDEgMTM3NjYvOTQ2Lzg0MSAxMzc1Mi85NDYvODQxCitmIDEzNzg4LzEwMDgvODE2IDEzNzkwLzgyNi84MTYgMTM2MzkvNzc5LzgxNgorZiAxMzYzOS83NzkvODE1IDEzNzc5Lzk3Mi84MTUgMTM3ODgvMTAwOC84MTUKK2YgMTM3OTQvMTAxNS84NDIgMTM3OTMvMTAxNi84NDIgMTM3OTIvMTAxNy84NDIKK2YgMTM3OTIvMTAxNy84NDMgMTM3OTEvMTAxOC84NDMgMTM3OTQvMTAxNS84NDMKK2YgMTM3OTQvMTAxNS84NDQgMTM3OTYvMTAxOS84NDQgMTM3OTUvMTAyMC84NDQKK2YgMTM3OTUvMTAyMC84NDUgMTM3OTMvMTAxNi84NDUgMTM3OTQvMTAxNS84NDUKK2YgMTM3OTgvODMzLzg0NiAxMzc5Ny8xMDIxLzg0NiAxMzgwMC8xMDIyLzg0NgorZiAxMzgwMC8xMDIyLzg0NyAxMzc5OS84MzQvODQ3IDEzNzk4LzgzMy84NDcKK2YgMTM4MDQvMTAyMy84NDggMTM4MDMvMTAyNC84NDggMTM4MDIvMTAyNS84NDgKK2YgMTM4MDIvMTAyNS84NDggMTM4MDEvMTAyNi84NDggMTM4MDQvMTAyMy84NDgKK2YgMTM4MDYvMTAyNy84NDkgMTM4MDQvMTAyMy84NDkgMTM4MDEvMTAyNi84NDkKK2YgMTM4MDEvMTAyNi84NDkgMTM4MDUvMTAyOC84NDkgMTM4MDYvMTAyNy84NDkKK2YgMTM3MDQvODQzLzg1MCAxMzgwNy8xMDI5Lzg1MCAxMzgwOC8xMDMwLzg1MAorZiAxMzgwOC8xMDMwLzg1MSAxMzcwMy84NDQvODUxIDEzNzA0Lzg0My84NTEKK2YgMTM3OTMvMTAxNi84NTIgMTM4MTAvMTAzMS84NTIgMTM4MDkvMTAzMi84NTIKK2YgMTM4MDkvMTAzMi84NTMgMTM3OTIvMTAxNy84NTMgMTM3OTMvMTAxNi84NTMKK2YgMTM3OTUvMTAyMC84NTQgMTM4MTEvMTAzMy84NTQgMTM4MTAvMTAzMS84NTQKK2YgMTM4MTAvMTAzMS84NTUgMTM3OTMvMTAxNi84NTUgMTM3OTUvMTAyMC84NTUKK2YgMTM4MTIvMTAzNC84NTYgMTM3OTEvMTAxOC84NTYgMTM3OTIvMTAxNy84NTYKK2YgMTM3OTIvMTAxNy84NTcgMTM4MDcvMTAyOS84NTcgMTM4MTIvMTAzNC84NTcKK2YgMTM4MDcvMTAyOS84NTggMTM3OTIvMTAxNy84NTggMTM4MDkvMTAzMi84NTgKK2YgMTM4MDkvMTAzMi84NTkgMTM4MDgvMTAzMC84NTkgMTM4MDcvMTAyOS84NTkKK2YgMTM4MTMvMTAzNS84NjAgMTM4MTYvMTAzNi84NjAgMTM4MTUvMTAzNy84NjAKK2YgMTM4MTUvMTAzNy84NjEgMTM4MTQvMTAzOC84NjEgMTM4MTMvMTAzNS84NjEKK2YgMTM4MTcvMTAzOS84NjIgMTM4MTgvMTA0MC84NjIgMTM4MTYvMTAzNi84NjIKK2YgMTM4MTYvMTAzNi84NjMgMTM4MTMvMTAzNS84NjMgMTM4MTcvMTAzOS84NjMKK2YgMTM4MTQvMTA0MS84NjQgMTM4MTUvMTA0Mi84NjQgMTM4MjAvMTA0My84NjQKK2YgMTM4MjAvMTA0My84NjUgMTM4MTkvMTA0NC84NjUgMTM4MTQvMTA0MS84NjUKK2YgMTM4MjIvMTA0NS84NjYgMTM4MDAvMTAyMi84NjYgMTM4MDMvMTA0Ni84NjYKK2YgMTM4MDMvMTA0Ni84NjYgMTM4MjEvMTA0Ny84NjYgMTM4MjIvMTA0NS84NjYKK2YgMTM5MTYvMTA0OC84NjcgMTM3NjkvOTU0Lzg2NyAxMzc3MC85NTMvODY3CitmIDEzNzcwLzk1Mi84MDQgMTM3OTUvMTAyMC84MDQgMTM5MTcvMTAxOS84MDQKK2YgMTM3NzEvOTU2LzgwNyAxMzgxMS8xMDMzLzgwNyAxMzc5NS8xMDIwLzgwNworZiAxMzc5NS8xMDIwLzgwNiAxMzc3MC85NTIvODA2IDEzNzcxLzk1Ni84MDYKK2YgMTM3NzIvOTYyLzgwOCAxMzc3My85NjEvODA4IDEzOTE4LzEwNDkvODA4CitmIDEzOTE5LzEwNTAvODA4IDEzOTIwLzEwNTEvODA4IDEzNzcyLzEwNTIvODA4CitmIDEzNzc1LzEwNTMvNjk3IDEzOTIxLzEwNTQvNjk3IDEzOTIyLzEwNTUvNjk3CitmIDEzOTIzLzEwNTYvNjk3IDEzNzc0Lzk2NC82OTcgMTM3NzUvOTYzLzY5NworZiAxMzcyMi84NzMvODY4IDEzODE5LzEwNDQvODY4IDEzODIwLzEwNDMvODY4CitmIDEzODIwLzEwNDMvODY5IDEzODIzLzg3NC84NjkgMTM3MjIvODczLzg2OQorZiAxMzgyNS8xMDU3Lzg3MCAxMzgyNC8xMDU4Lzg3MCAxMzc5NC8xMDU4Lzg3MAorZiAxMzc5NC8xMDU4Lzg3MSAxMzc5MS8xMDU3Lzg3MSAxMzgyNS8xMDU3Lzg3MQorZiAxMzgyNC8xMDU4Lzg3MiAxMzgyNi8xMDU5Lzg3MiAxMzc5Ni8xMDU5Lzg3MgorZiAxMzc5Ni8xMDU5Lzg3MiAxMzc5NC8xMDU4Lzg3MiAxMzgyNC8xMDU4Lzg3MgorZiAxMzgyNy8xMDYwLzg3MyAxMzgyNS8xMDYxLzg3MyAxMzc5MS8xMDYyLzg3MworZiAxMzc5MS8xMDYyLzg3MyAxMzgxMi8xMDYwLzg3MyAxMzgyNy8xMDYwLzg3MworZiAxMzcyNy84ODEvODc0IDEzODI3LzEwNjAvODc0IDEzODEyLzEwNjAvODc0CitmIDEzODEyLzEwNjAvODc0IDEzODI4Lzg4MS84NzQgMTM3MjcvODgxLzg3NAorZiAxMzkyNC8xMDYzLzY4NyAxMzc4MS85NzkvNjg3IDEzNzY5Lzk3OC82ODcKK2YgMTM3NjkvMTA2NC82ODcgMTM5MjUvMTA2NS82ODcgMTM5MjYvMTA2NS82ODcKK2YgMTM3OTkvODM0Lzg0NiAxMzgwMC8xMDIyLzg0NiAxMzgyMi8xMDQ1Lzg0NgorZiAxMzgyMi8xMDQ1Lzg0NiAxMzcyOS84ODYvODQ2IDEzNzk5LzgzNC84NDYKK2YgMTM4MjkvMTA2Ni84NDggMTM4MjEvMTA2Ny84NDggMTM4MDMvMTAyNC84NDgKK2YgMTM4MDMvMTAyNC84NDggMTM4MDQvMTAyMy84NDggMTM4MjkvMTA2Ni84NDgKK2YgMTM4MzAvMTA2OC84NDkgMTM4MjkvMTA2Ni84NDkgMTM4MDQvMTAyMy84NDkKK2YgMTM4MDQvMTAyMy84NDkgMTM4MDYvMTAyNy84NDkgMTM4MzAvMTA2OC84NDkKK2YgMTM3OTcvMTAyMS84NjYgMTM4MDIvMTA2OS84NjYgMTM4MDMvMTA0Ni84NjYKK2YgMTM4MDMvMTA0Ni84NjYgMTM4MDAvMTAyMi84NjYgMTM3OTcvMTAyMS84NjYKK2YgMTM3ODQvMTA3MC82OTcgMTM5MjcvMTA3MS82OTcgMTM5MjgvMTA3Mi82OTcKK2YgMTM5MjkvMTA3My82OTcgMTM3NzUvOTg2LzY5NyAxMzc4NC85ODUvNjk3CitmIDEzODAyLzEwMjUvODc1IDEzODE1LzEwMzcvODc1IDEzODE2LzEwMzYvODc1CitmIDEzODE2LzEwMzYvODc2IDEzODAxLzEwMjYvODc2IDEzODAyLzEwMjUvODc2CitmIDEzODE0LzEwNzQvODc3IDEzODA5LzEwNzQvODc3IDEzODEwLzEwNzUvODc3CitmIDEzODEwLzEwMzEvODc4IDEzODEzLzEwNzYvODc4IDEzODE0LzEwMzIvODc4CitmIDEzODAxLzEwMjYvODc5IDEzODE2LzEwMzYvODc5IDEzODE4LzEwNDAvODc5CitmIDEzODE4LzEwNDAvODgwIDEzODA1LzEwMjgvODgwIDEzODAxLzEwMjYvODgwCitmIDEzODEzLzEwNzYvODgxIDEzODEwLzEwMzEvODgxIDEzODExLzEwMzMvODgxCitmIDEzODExLzEwMzMvODgyIDEzODE3LzEwMzMvODgyIDEzODEzLzEwNzYvODgyCitmIDEzNzk3LzEwNzcvODgzIDEzODIwLzEwNzgvODgzIDEzODE1LzEwNzkvODgzCitmIDEzODE1LzEwNzkvODg0IDEzODAyLzEwODAvODg0IDEzNzk3LzEwNzcvODg0CitmIDEzODE5LzEwMzAvODg1IDEzODA4LzEwMzAvODg1IDEzODA5LzEwMzIvODg1CitmIDEzODA5LzEwMzIvODg2IDEzODE0LzEwMzIvODg2IDEzODE5LzEwMzAvODg2CitmIDEzOTMwLzEwODEvODg3IDEzOTMxLzEwODEvODg3IDEzNzczLzEwODIvODg3CitmIDEzNzczLzk5OC84MjkgMTM3NzQvOTk3LzgyOSAxMzkzMi8xMDgzLzgyOQorZiAxMzkzMy8xMDMzLzg4OCAxMzgxMS8xMDMzLzg4OCAxMzc3MS85NTYvODg4CitmIDEzNzcxLzEwMDMvODg5IDEzNzcyLzEwMDIvODg5IDEzOTM0LzEwODQvODg5CitmIDEzNzk4LzgzMy84OTAgMTM4MjMvODc0Lzg5MCAxMzgyMC8xMDQzLzg5MAorZiAxMzgyMC8xMDQzLzg5MSAxMzc5Ny8xMDIxLzg5MSAxMzc5OC84MzMvODkxCitmIDEzODMxLzEwODUvODcxIDEzODI0LzEwNTgvODcxIDEzODI1LzEwNTcvODcxCitmIDEzODI1LzEwNTcvODcxIDEzODMyLzEwODYvODcxIDEzODMxLzEwODUvODcxCitmIDEzODMzLzEwODcvODcyIDEzODI2LzEwNTkvODcyIDEzODI0LzEwNTgvODcyCitmIDEzODI0LzEwNTgvODcyIDEzODMxLzEwODUvODcyIDEzODMzLzEwODcvODcyCitmIDEzODMyLzEwODgvODkyIDEzODI1LzEwNjEvODkyIDEzODI3LzEwNjAvODkyCitmIDEzODI3LzEwNjAvODczIDEzODM0LzEwODkvODczIDEzODMyLzEwODgvODczCitmIDEzOTM1LzEwOTAvNjg3IDEzNzg5LzEwMTMvNjg3IDEzNzgxLzEwMTIvNjg3CitmIDEzNzgxLzEwOTEvNjg3IDEzOTM2LzEwOTIvNjg3IDEzOTM3LzEwOTMvNjg3CitmIDEzODA3LzEwMjkvODkzIDEzNzA0Lzg0My84OTMgMTM4MjgvOTE5Lzg5MworZiAxMzgyOC85MTkvODk0IDEzODEyLzEwMzQvODk0IDEzODA3LzEwMjkvODk0CitmIDEzODA4LzEwNDQvODk1IDEzODE5LzEwNDQvODk1IDEzNzIyLzg3My84OTUKK2YgMTM3MjIvODczLzg5NiAxMzcwMy84NzMvODk2IDEzODA4LzEwNDQvODk2CitmIDEzODM0LzEwODkvODk3IDEzODI3LzEwNjAvODk3IDEzNzI3Lzg4MS84OTcKK2YgMTM3MjcvODgxLzg3NCAxMzgzNS85MjEvODc0IDEzODM0LzEwODkvODc0CitmIDc0NDQvMTA5NC84OTggNzQwMy8xMDk1Lzg5OCA3Mzk4LzEwOTYvODk4CitmIDczOTgvMTA5Ni84OTkgNzQ0Mi8xMDk3Lzg5OSA3NDQ0LzEwOTQvODk5CitmIDc0NDYvMTA5OC85MDAgNzQwNy8xMDk5LzkwMCA3NDAwLzExMDAvOTAwCitmIDc0MDAvMTEwMC85MDEgNzQ0My8xMTAxLzkwMSA3NDQ2LzEwOTgvOTAxCitmIDc0NDQvMTA5NC85MDIgNzQ0NS8xMTAyLzkwMiA3NDAyLzExMDMvOTAyCitmIDc0MDIvMTEwMy85MDMgNzQwMy8xMDk1LzkwMyA3NDQ0LzEwOTQvOTAzCitmIDc0NDIvMTEwNC85MDQgNzQ0Ni8xMDk4LzkwNCA3NDA2LzExMDUvOTA0CitmIDc0MDYvMTEwNS85MDUgNzM5OS8xMTA2LzkwNSA3NDQyLzExMDQvOTA1CitmIDc0NDMvMTEwMS85MDYgNzQwMC8xMTAwLzkwNiA3NDA4LzExMDcvOTA2CitmIDc0MDgvMTEwNy85MDcgNzQ0Ny8xMTA4LzkwNyA3NDQzLzExMDEvOTA3CitmIDc0NDcvMTEwOC85MDggNzQwOC8xMTA3LzkwOCA3NDEwLzExMDkvOTA4CitmIDc0MTAvMTEwOS85MDkgNzQ0OC8xMTEwLzkwOSA3NDQ3LzExMDgvOTA5CitmIDc0NDkvMTExMS85MTAgNzQ0OC8xMTEwLzkxMCA3NDEwLzExMDkvOTEwCitmIDc0MTAvMTEwOS85MTAgNzQxMi8xMTEyLzkxMCA3NDQ5LzExMTEvOTEwCitmIDc0NTAvMTExMy85MTEgNzQ0OS8xMTExLzkxMSA3NDEyLzExMTIvOTExCitmIDc0MTIvMTExMi85MTEgNzQxNC8xMTE0LzkxMSA3NDUwLzExMTMvOTExCitmIDc0NTAvMTExMy85MTIgNzQxNC8xMTE0LzkxMiA3NDE2LzExMTUvOTEyCitmIDc0MTYvMTExNS85MTMgNzQ1MS8xMTE2LzkxMyA3NDUwLzExMTMvOTEzCitmIDc0NTIvMTExNy85MTQgNzQ0NS8xMTE3LzkxNCA3NDA1LzExMTgvOTE0CitmIDc0MDUvMTExOC85MTUgNzQxOC8xMTE4LzkxNSA3NDUyLzExMTcvOTE1CitmIDczOTkvMTExOS85MTYgNzQyMS8xMTE5LzkxNiA3NDI3LzExMjAvOTE2CitmIDc0MjcvMTEyMC85MTcgNzQwNC8xMTIwLzkxNyA3Mzk5LzExMTkvOTE3CitmIDc0MDMvMTA5NS85MTggNzQyNi8xMTIxLzkxOCA3NDIwLzExMjIvOTE4CitmIDc0MjAvMTEyMi85MTkgNzM5OC8xMDk2LzkxOSA3NDAzLzEwOTUvOTE5CitmIDc0MDEvMTEyMy85MjAgNzQyMy8xMTI0LzkyMCA3NDMwLzExMDUvOTIwCitmIDc0MzAvMTEwNS85MDAgNzQwNi8xMTA1LzkwMCA3NDAxLzExMjMvOTAwCitmIDc0MDcvMTA5OS85MjEgNzQzMS8xMTI1LzkyMSA3NDIyLzExMDAvOTIxCitmIDc0MjIvMTEwMC85MjIgNzQwMC8xMTAwLzkyMiA3NDA3LzEwOTkvOTIyCitmIDc0MjkvMTEyNi85MjMgNzQwNS8xMTI2LzkyMyA3NDA0LzExMjAvOTIzCitmIDc0MDQvMTEyMC85MjQgNzQyNy8xMTIwLzkyNCA3NDI5LzExMjYvOTI0CitmIDc0MjYvMTEyMS85MjUgNzQwMy8xMDk1LzkyNSA3NDAyLzExMDMvOTI1CitmIDc0MDIvMTEwMy85MjYgNzQyNC8xMTI3LzkyNiA3NDI2LzExMjEvOTI2CitmIDczOTgvMTEyOC85MjcgNzQyMC8xMTI4LzkyNyA3NDMxLzExMjUvOTI3CitmIDc0MzEvMTEyNS85MjggNzQwNy8xMDk5LzkyOCA3Mzk4LzExMjgvOTI4CitmIDc0MDYvMTEwNS85MjkgNzQzMC8xMTA1LzkyOSA3NDIxLzExMDYvOTI5CitmIDc0MjEvMTEwNi85MzAgNzM5OS8xMTA2LzkzMCA3NDA2LzExMDUvOTMwCitmIDc0MDkvMTEyOS85MzEgNzQzMi8xMTI5LzkzMSA3NDIzLzExMjQvOTMxCitmIDc0MjMvMTEyNC85MzIgNzQwMS8xMTIzLzkzMiA3NDA5LzExMjkvOTMyCitmIDc0MDAvMTEwMC85MzMgNzQyMi8xMTAwLzkzMyA3NDMzLzExMzAvOTMzCitmIDc0MzMvMTEzMC85MzQgNzQwOC8xMTA3LzkzNCA3NDAwLzExMDAvOTM0CitmIDc0MTEvMTEzMS85MzUgNzQzNC8xMTMxLzkzNSA3NDMyLzExMjkvOTM1CitmIDc0MzIvMTEyOS85MzYgNzQwOS8xMTI5LzkzNiA3NDExLzExMzEvOTM2CitmIDc0MDgvMTEwNy85MzcgNzQzMy8xMTMwLzkzNyA3NDM1LzExMzIvOTM3CitmIDc0MzUvMTEzMi85MzggNzQxMC8xMTA5LzkzOCA3NDA4LzExMDcvOTM4CitmIDc0MzQvMTEzMS85MzkgNzQxMS8xMTMxLzkzOSA3NDEzLzExMzMvOTM5CitmIDc0MTMvMTEzMy85NDAgNzQzNi8xMTM0Lzk0MCA3NDM0LzExMzEvOTQwCitmIDc0MzcvMTExMi85NDEgNzQxMi8xMTEyLzk0MSA3NDEwLzExMDkvOTQxCitmIDc0MTAvMTEwOS85NDIgNzQzNS8xMTMyLzk0MiA3NDM3LzExMTIvOTQyCitmIDc0MzYvMTEzNC85NDMgNzQxMy8xMTMzLzk0MyA3NDE1LzExMzUvOTQzCitmIDc0MTUvMTEzNS85NDQgNzQzOC8xMTM1Lzk0NCA3NDM2LzExMzQvOTQ0CitmIDc0MzkvMTEzNi85NDUgNzQxNC8xMTE0Lzk0NSA3NDEyLzExMTIvOTQ1CitmIDc0MTIvMTExMi85NDQgNzQzNy8xMTEyLzk0NCA3NDM5LzExMzYvOTQ0CitmIDc0MzgvMTEzNS85NDYgNzQxNS8xMTM1Lzk0NiA3NDE3LzExMzcvOTQ2CitmIDc0MTcvMTEzNy85NDcgNzQ0MC8xMTM4Lzk0NyA3NDM4LzExMzUvOTQ3CitmIDc0NDEvMTExNS85NDggNzQxNi8xMTE1Lzk0OCA3NDE0LzExMTQvOTQ4CitmIDc0MTQvMTExNC85NDYgNzQzOS8xMTM2Lzk0NiA3NDQxLzExMTUvOTQ2CitmIDc0MjQvMTEzOS85NDkgNzQwMi8xMTQwLzk0OSA3NDE5LzExNDAvOTQ5CitmIDc0MTkvMTE0MC85NTAgNzQyNS8xMTM5Lzk1MCA3NDI0LzExMzkvOTUwCitmIDc0MjgvMTExOC85NTEgNzQxOC8xMTE4Lzk1MSA3NDA1LzExMTgvOTUxCitmIDc0MDUvMTExOC85NTIgNzQyOS8xMTE4Lzk1MiA3NDI4LzExMTgvOTUyCitmIDczOTkvMTExOS85NTMgNzQwNC8xMTIwLzk1MyA3NDQ0LzEwOTQvOTUzCitmIDc0NDQvMTA5NC84OTkgNzQ0Mi8xMDk3Lzg5OSA3Mzk5LzExMTkvODk5CitmIDc0MDEvMTEyMy85NTQgNzQwNi8xMTA1Lzk1NCA3NDQ2LzEwOTgvOTU0CitmIDc0NDYvMTA5OC85NTUgNzQ0My8xMTAxLzk1NSA3NDAxLzExMjMvOTU1CitmIDc0MDQvMTEyMC85NTYgNzQwNS8xMTI2Lzk1NiA3NDQ1LzExMDIvOTU2CitmIDc0NDUvMTEwMi85NTcgNzQ0NC8xMDk0Lzk1NyA3NDA0LzExMjAvOTU3CitmIDczOTgvMTEyOC85NTggNzQwNy8xMDk5Lzk1OCA3NDQ2LzEwOTgvOTU4CitmIDc0NDYvMTA5OC85NTkgNzQ0Mi8xMTA0Lzk1OSA3Mzk4LzExMjgvOTU5CitmIDc0MDEvMTEyMy85NjAgNzQ0My8xMTAxLzk2MCA3NDQ3LzExMDgvOTYwCitmIDc0NDcvMTEwOC85MDYgNzQwOS8xMTI5LzkwNiA3NDAxLzExMjMvOTA2CitmIDc0MDkvMTEyOS85NjEgNzQ0Ny8xMTA4Lzk2MSA3NDQ4LzExMTAvOTYxCitmIDc0NDgvMTExMC85NjIgNzQxMS8xMTMxLzk2MiA3NDA5LzExMjkvOTYyCitmIDc0MTMvMTEzMy85NjMgNzQxMS8xMTMxLzk2MyA3NDQ4LzExMTAvOTYzCitmIDc0NDgvMTExMC85NjQgNzQ0OS8xMTExLzk2NCA3NDEzLzExMzMvOTY0CitmIDc0MTUvMTEzNS85NjUgNzQxMy8xMTMzLzk2NSA3NDQ5LzExMTEvOTY1CitmIDc0NDkvMTExMS85MTEgNzQ1MC8xMTEzLzkxMSA3NDE1LzExMzUvOTExCitmIDc0MTUvMTEzNS85MTIgNzQ1MC8xMTEzLzkxMiA3NDUxLzExMTYvOTEyCitmIDc0NTEvMTExNi85MTMgNzQxNy8xMTM3LzkxMyA3NDE1LzExMzUvOTEzCitmIDc0MTkvMTE0MC85NjYgNzQwMi8xMTQwLzk2NiA3NDQ1LzExMTcvOTY2CitmIDc0NDUvMTExNy85NjcgNzQ1Mi8xMTE3Lzk2NyA3NDE5LzExNDAvOTY3CitmIDc0NTUvMTE0MS85NjggNzQ1NC8xMTQyLzk2OCA3NDUzLzExNDMvOTY4CitmIDc0NTMvMTE0My85NjkgNzQ1Ni8xMTQ0Lzk2OSA3NDU1LzExNDEvOTY5CitmIDc0NTkvMTE0NS85NzAgNzQ1OC8xMTQ2Lzk3MCA3NDU3LzExNDcvOTcwCitmIDc0NTcvMTE0Ny85NzEgNzQ2MC8xMTQ4Lzk3MSA3NDU5LzExNDUvOTcxCitmIDc0NTUvMTE0MS85NzIgNzQ2Mi8xMTQ5Lzk3MiA3NDYxLzExNTAvOTcyCitmIDc0NjEvMTE1MC85NzMgNzQ1NC8xMTQyLzk3MyA3NDU1LzExNDEvOTczCitmIDc0NTYvMTE0NC85NzQgNzQ1OS8xMTUxLzk3NCA3NDYzLzExNTIvOTc0CitmIDc0NjMvMTE1My85NzUgNzQ2NC8xMTU0Lzk3NSA3NDU2LzExNTUvOTc1CitmIDc0NjAvMTE0OC85NzYgNzQ1Ny8xMTQ3Lzk3NiA3NDY2LzExNTYvOTc2CitmIDc0NjYvMTE1Ni85NzcgNzQ2NS8xMTU3Lzk3NyA3NDYwLzExNDgvOTc3CitmIDc0NjUvMTE1Ny85NzggNzQ2Ni8xMTU2Lzk3OCA3NDY4LzExNTgvOTc4CitmIDc0NjgvMTE1OC85NzkgNzQ2Ny8xMTU5Lzk3OSA3NDY1LzExNTcvOTc5CitmIDc0NjkvMTE2MC85ODAgNzQ2Ny8xMTU5Lzk4MCA3NDY4LzExNTgvOTgwCitmIDc0NjgvMTE1OC85ODEgNzQ3MC8xMTYxLzk4MSA3NDY5LzExNjAvOTgxCitmIDc0NzEvMTE2Mi85ODIgNzQ2OS8xMTYwLzk4MiA3NDcwLzExNjEvOTgyCitmIDc0NzAvMTE2MS85ODIgNzQ3Mi8xMTYzLzk4MiA3NDcxLzExNjIvOTgyCitmIDc0NzEvMTE2Mi85ODMgNzQ3Mi8xMTYzLzk4MyA3NDc0LzExNjQvOTgzCitmIDc0NzQvMTE2NC85ODMgNzQ3My8xMTY1Lzk4MyA3NDcxLzExNjIvOTgzCitmIDc0NzYvMTE2Ni85ODQgNzQ2Mi8xMTY2Lzk4NCA3NDc1LzExNjcvOTg0CitmIDc0NzUvMTE2Ny85ODUgNzQ3Ny8xMTY3Lzk4NSA3NDc2LzExNjYvOTg1CitmIDc0NjQvMTE2OC85ODYgNzQ4MC8xMTY4Lzk4NiA3NDc5LzExNjkvOTg2CitmIDc0NzkvMTE2OS85ODcgNzQ3OC8xMTY5Lzk4NyA3NDY0LzExNjgvOTg3CitmIDc0NTQvMTE0Mi85ODggNzQ4Mi8xMTcwLzk4OCA3NDgxLzExNzEvOTg4CitmIDc0ODEvMTE3MS85ODkgNzQ1My8xMTQzLzk4OSA3NDU0LzExNDIvOTg5CitmIDc0ODMvMTE3Mi85OTAgNzQ4NS8xMTcyLzk5MCA3NDg0LzExNTMvOTkwCitmIDc0ODQvMTE1My85OTEgNzQ2My8xMTUzLzk5MSA3NDgzLzExNzIvOTkxCitmIDc0NTgvMTE0Ni85OTIgNzQ4Ny8xMTQ2Lzk5MiA3NDg2LzExNDcvOTkyCitmIDc0ODYvMTE0Ny85OTMgNzQ1Ny8xMTQ3Lzk5MyA3NDU4LzExNDYvOTkzCitmIDc0ODgvMTE3My85OTQgNzQ3NS8xMTczLzk5NCA3NDc4LzExNjkvOTk0CitmIDc0NzgvMTE2OS85OTUgNzQ3OS8xMTY5Lzk5NSA3NDg4LzExNzMvOTk1CitmIDc0ODIvMTE3MC85OTYgNzQ1NC8xMTQyLzk5NiA3NDYxLzExNTAvOTk2CitmIDc0NjEvMTE1MC85OTcgNzQ4OS8xMTUwLzk5NyA3NDgyLzExNzAvOTk3CitmIDc0NTMvMTE3NC85OTggNzQ4MS8xMTc1Lzk5OCA3NDg3LzExNDYvOTk4CitmIDc0ODcvMTE0Ni85OTkgNzQ1OC8xMTQ2Lzk5OSA3NDUzLzExNzQvOTk5CitmIDc0NjMvMTE1My8xMDAwIDc0ODQvMTE1My8xMDAwIDc0ODAvMTE3Ni8xMDAwCitmIDc0ODAvMTE3Ni8xMDAxIDc0NjQvMTE1NC8xMDAxIDc0NjMvMTE1My8xMDAxCitmIDc0OTEvMTE3Ny8xMDAyIDc0OTAvMTE3Ny8xMDAyIDc0ODUvMTE3Mi8xMDAyCitmIDc0ODUvMTE3Mi8xMDAzIDc0ODMvMTE3Mi8xMDAzIDc0OTEvMTE3Ny8xMDAzCitmIDc0NTcvMTE0Ny8xMDA0IDc0ODYvMTE0Ny8xMDA0IDc0OTIvMTE1Ni8xMDA0CitmIDc0OTIvMTE1Ni8xMDA1IDc0NjYvMTE1Ni8xMDA1IDc0NTcvMTE0Ny8xMDA1CitmIDc0OTQvMTE3OC8xMDA2IDc0OTMvMTE3OC8xMDA2IDc0OTAvMTE3Ny8xMDA2CitmIDc0OTAvMTE3Ny8xMDA3IDc0OTEvMTE3Ny8xMDA3IDc0OTQvMTE3OC8xMDA3CitmIDc0NjYvMTE1Ni8xMDA4IDc0OTIvMTE1Ni8xMDA4IDc0OTUvMTE1OC8xMDA4CitmIDc0OTUvMTE1OC8xMDA5IDc0NjgvMTE1OC8xMDA5IDc0NjYvMTE1Ni8xMDA5CitmIDc0OTMvMTE3OC8xMDEwIDc0OTQvMTE3OC8xMDEwIDc0OTcvMTE3OS8xMDEwCitmIDc0OTcvMTE3OS8xMDExIDc0OTYvMTE4MC8xMDExIDc0OTMvMTE3OC8xMDExCitmIDc0OTgvMTE4MS8xMDEyIDc0NzAvMTE2MS8xMDEyIDc0NjgvMTE1OC8xMDEyCitmIDc0NjgvMTE1OC8xMDEzIDc0OTUvMTE1OC8xMDEzIDc0OTgvMTE4MS8xMDEzCitmIDc0OTYvMTE4MC8xMDE0IDc0OTcvMTE3OS8xMDE0IDc1MDAvMTE4Mi8xMDE0CitmIDc1MDAvMTE4Mi8xMDE1IDc0OTkvMTE4Mi8xMDE1IDc0OTYvMTE4MC8xMDE1CitmIDc1MDEvMTE2My8xMDE2IDc0NzIvMTE2My8xMDE2IDc0NzAvMTE2MS8xMDE2CitmIDc0NzAvMTE2MS8xMDE3IDc0OTgvMTE4MS8xMDE3IDc1MDEvMTE2My8xMDE3CitmIDc0OTkvMTE4Mi8xMDE4IDc1MDAvMTE4Mi8xMDE4IDc1MDMvMTE4My8xMDE4CitmIDc1MDMvMTE4My8xMDE5IDc1MDIvMTE4NC8xMDE5IDc0OTkvMTE4Mi8xMDE5CitmIDc1MDQvMTE2NC8xMDE4IDc0NzQvMTE2NC8xMDE4IDc0NzIvMTE2My8xMDE4CitmIDc0NzIvMTE2My8xMDIwIDc1MDEvMTE2My8xMDIwIDc1MDQvMTE2NC8xMDIwCitmIDc0ODkvMTE4NS8xMDIxIDc0NjEvMTE4NS8xMDIxIDc1MDYvMTE4NS8xMDIxCitmIDc1MDYvMTE4NS8xMDIyIDc1MDUvMTE4NS8xMDIyIDc0ODkvMTE4NS8xMDIyCitmIDc1MDcvMTE2Ny8xMDIzIDc0NzcvMTE2Ny8xMDIzIDc0NzUvMTE2Ny8xMDIzCitmIDc0NzUvMTE2Ny8xMDI0IDc0ODgvMTE2Ny8xMDI0IDc1MDcvMTE2Ny8xMDI0CitmIDc0NjQvMTE2OC8xMDI1IDc0NzgvMTE2OS8xMDI1IDc0NTUvMTE0MS8xMDI1CitmIDc0NTUvMTE0MS8xMDI2IDc0NTYvMTE0NC8xMDI2IDc0NjQvMTE2OC8xMDI2CitmIDc0ODMvMTE3Mi8xMDI3IDc0NjMvMTE1My8xMDI3IDc0NTkvMTE0NS8xMDI3CitmIDc0NTkvMTE0NS8xMDI4IDc0NjAvMTE0OC8xMDI4IDc0ODMvMTE3Mi8xMDI4CitmIDc0NzgvMTE2OS8xMDI5IDc0NzUvMTE3My8xMDI5IDc0NjIvMTE0OS8xMDI5CitmIDc0NjIvMTE0OS8xMDMwIDc0NTUvMTE0MS8xMDMwIDc0NzgvMTE2OS8xMDMwCitmIDc0NTMvMTE3NC8xMDMxIDc0NTgvMTE0Ni8xMDMxIDc0NTkvMTE0NS8xMDMxCitmIDc0NTkvMTE1MS8xMDMyIDc0NTYvMTE0NC8xMDMyIDc0NTMvMTE0My8xMDMyCitmIDc0ODMvMTE3Mi8xMDMzIDc0NjAvMTE0OC8xMDMzIDc0NjUvMTE1Ny8xMDMzCitmIDc0NjUvMTE1Ny8xMDM0IDc0OTEvMTE3Ny8xMDM0IDc0ODMvMTE3Mi8xMDM0CitmIDc0OTEvMTE3Ny8xMDM1IDc0NjUvMTE1Ny8xMDM1IDc0NjcvMTE1OS8xMDM1CitmIDc0NjcvMTE1OS8xMDM2IDc0OTQvMTE3OC8xMDM2IDc0OTEvMTE3Ny8xMDM2CitmIDc0OTcvMTE3OS85ODAgNzQ5NC8xMTc4Lzk4MCA3NDY3LzExNTkvOTgwCitmIDc0NjcvMTE1OS8xMDM3IDc0NjkvMTE2MC8xMDM3IDc0OTcvMTE3OS8xMDM3CitmIDc1MDAvMTE4Mi8xMDM4IDc0OTcvMTE3OS8xMDM4IDc0NjkvMTE2MC8xMDM4CitmIDc0NjkvMTE2MC85ODIgNzQ3MS8xMTYyLzk4MiA3NTAwLzExODIvOTgyCitmIDc1MDAvMTE4Mi85ODMgNzQ3MS8xMTYyLzk4MyA3NDczLzExNjUvOTgzCitmIDc0NzMvMTE2NS85ODMgNzUwMy8xMTgzLzk4MyA3NTAwLzExODIvOTgzCitmIDc1MDYvMTE4NS8xMDM5IDc0NjEvMTE4NS8xMDM5IDc0NjIvMTE2Ni8xMDM5CitmIDc0NjIvMTE2Ni8xMDQwIDc0NzYvMTE2Ni8xMDQwIDc1MDYvMTE4NS8xMDQwCitmIDEyOTE4LzExODYvMTA0MSAxMjkxMi8xMTg3LzEwNDEgMTI5MTMvMTE4OC8xMDQxCitmIDEyOTEzLzExODgvMTA0MiAxMjkxOS8xMTg5LzEwNDIgMTI5MTgvMTE4Ni8xMDQyCitmIDEyOTIwLzExOTAvMTA0MyAxMjkxNC8xMTkxLzEwNDMgMTI5MTUvMTE5MS8xMDQzCitmIDEyOTE1LzExOTEvMTA0MyAxMjkyMS8xMTkyLzEwNDMgMTI5MjAvMTE5MC8xMDQzCitmIDEyOTIyLzExOTMvMTA0NCAxMjkxNi8xMTk0LzEwNDQgMTI5MTcvMTE5NS8xMDQ0CitmIDEyOTE3LzExOTUvMTA0NCAxMjkyMy8xMTkzLzEwNDQgMTI5MjIvMTE5My8xMDQ0CitmIDEyOTE5LzExODkvMTA0NSAxMjkxMy8xMTg4LzEwNDUgMTI5MTQvMTE4OC8xMDQ1CitmIDEyOTE0LzExODgvMTA0NiAxMjkyMC8xMTg5LzEwNDYgMTI5MTkvMTE4OS8xMDQ2CitmIDEyOTIzLzExOTYvMTA0NyAxMjkxNy8xMTk3LzEwNDcgMTI5MTIvMTE4Ny8xMDQ3CitmIDEyOTEyLzExODcvMTA0OCAxMjkxOC8xMTg2LzEwNDggMTI5MjMvMTE5Ni8xMDQ4CitmIDEyOTE5LzExODkvMTA0OSAxMjkyNS8xMTk4LzEwNDkgMTI5MjQvMTE5OS8xMDQ5CitmIDEyOTI0LzExOTkvMTA1MCAxMjkxOC8xMTg2LzEwNTAgMTI5MTkvMTE4OS8xMDUwCitmIDEyOTIxLzExOTIvMTA0MyAxMjkyNy8xMjAwLzEwNDMgMTI5MjYvMTIwMC8xMDQzCitmIDEyOTI2LzEyMDAvMTA0MyAxMjkyMC8xMTkwLzEwNDMgMTI5MjEvMTE5Mi8xMDQzCitmIDEyOTIzLzExOTMvMTA0NCAxMjkyOS8xMjAxLzEwNDQgMTI5MjgvMTIwMi8xMDQ0CitmIDEyOTI4LzEyMDIvMTA0NCAxMjkyMi8xMTkzLzEwNDQgMTI5MjMvMTE5My8xMDQ0CitmIDEyOTIwLzExODkvMTA1MSAxMjkyNi8xMTk4LzEwNTEgMTI5MjUvMTE5OC8xMDUxCitmIDEyOTI1LzExOTgvMTA1MiAxMjkxOS8xMTg5LzEwNTIgMTI5MjAvMTE4OS8xMDUyCitmIDEyOTE4LzExODYvMTA1MyAxMjkyNC8xMTk5LzEwNTMgMTI5MjkvMTIwMy8xMDUzCitmIDEyOTI5LzEyMDMvMTA1NCAxMjkyMy8xMTk2LzEwNTQgMTI5MTgvMTE4Ni8xMDU0CitmIDEyOTI1LzEyMDQvMTA1NSAxMjkzMS8xMjA1LzEwNTUgMTI5MzAvMTIwNi8xMDU1CitmIDEyOTMwLzEyMDYvMTA1NiAxMjkyNC8xMjA3LzEwNTYgMTI5MjUvMTIwNC8xMDU2CitmIDEyOTI3LzEyMDAvMTA0MyAxMjkzMy8xMjA4LzEwNDMgMTI5MzIvMTIwOC8xMDQzCitmIDEyOTMyLzEyMDgvMTA0MyAxMjkyNi8xMjAwLzEwNDMgMTI5MjcvMTIwMC8xMDQzCitmIDEyOTI5LzEyMDEvMTA0NCAxMjkzNS8xMjA5LzEwNDQgMTI5MzQvMTIxMC8xMDQ0CitmIDEyOTM0LzEyMTAvMTA0NCAxMjkyOC8xMjAyLzEwNDQgMTI5MjkvMTIwMS8xMDQ0CitmIDEyOTI2LzEyMDQvMTA1NSAxMjkzMi8xMjA1LzEwNTUgMTI5MzEvMTIwNS8xMDU1CitmIDEyOTMxLzEyMDUvMTA1NyAxMjkyNS8xMjA0LzEwNTcgMTI5MjYvMTIwNC8xMDU3CitmIDEyOTI0LzEyMDcvMTA1OCAxMjkzMC8xMjA2LzEwNTggMTI5MzUvMTIxMS8xMDU4CitmIDEyOTM1LzEyMTEvMTA1OSAxMjkyOS8xMjEyLzEwNTkgMTI5MjQvMTIwNy8xMDU5CitmIDEyOTMxLzEyMDUvMTA2MCAxMjkzNy8xMjEzLzEwNjAgMTI5MzYvMTIxNC8xMDYwCitmIDEyOTM2LzEyMTQvMTA2MSAxMjkzMC8xMjA2LzEwNjEgMTI5MzEvMTIwNS8xMDYxCitmIDEyOTMzLzEyMDgvMTA0MyAxMjkzOS8xMjE1LzEwNDMgMTI5MzgvMTIxNS8xMDQzCitmIDEyOTM4LzEyMTUvMTA0MyAxMjkzMi8xMjA4LzEwNDMgMTI5MzMvMTIwOC8xMDQzCitmIDEyOTM1LzEyMDkvMTA0NCAxMjk0MS8xMjE2LzEwNDQgMTI5NDAvMTIxNy8xMDQ0CitmIDEyOTQwLzEyMTcvMTA0NCAxMjkzNC8xMjEwLzEwNDQgMTI5MzUvMTIwOS8xMDQ0CitmIDEyOTMyLzEyMDUvMTA2MCAxMjkzOC8xMjEzLzEwNjAgMTI5MzcvMTIxMy8xMDYwCitmIDEyOTM3LzEyMTMvMTA2MiAxMjkzMS8xMjA1LzEwNjIgMTI5MzIvMTIwNS8xMDYyCitmIDEyOTMwLzEyMDYvMTA2MyAxMjkzNi8xMjE0LzEwNjMgMTI5NDEvMTIxOC8xMDYzCitmIDEyOTQxLzEyMTgvMTA2MSAxMjkzNS8xMjExLzEwNjEgMTI5MzAvMTIwNi8xMDYxCitmIDEyOTQyLzEyMTkvMTA0MSAxMjk0My8xMjIwLzEwNDEgMTI5NDQvMTIyMS8xMDQxCitmIDEyOTQ0LzEyMjEvMTA2NCAxMjk0NS8xMjIyLzEwNjQgMTI5NDIvMTIxOS8xMDY0CitmIDEyOTQ2LzEyMjMvMTA2NSAxMjk0Ny8xMjI0LzEwNjUgMTI5NDgvMTIyNC8xMDY1CitmIDEyOTQ4LzEyMjQvMTA0MyAxMjk0OS8xMjI1LzEwNDMgMTI5NDYvMTIyMy8xMDQzCitmIDEyOTUwLzEyMjYvMTA0NCAxMjk1MS8xMjI3LzEwNDQgMTI5NTIvMTIyOC8xMDQ0CitmIDEyOTUyLzEyMjgvMTA0NCAxMjk1My8xMjI2LzEwNDQgMTI5NTAvMTIyNi8xMDQ0CitmIDEyOTQ1LzEyMjIvMTA0NSAxMjk0NC8xMjIxLzEwNDUgMTI5NDcvMTIyMS8xMDQ1CitmIDEyOTQ3LzEyMjEvMTA0NiAxMjk0Ni8xMjIyLzEwNDYgMTI5NDUvMTIyMi8xMDQ2CitmIDEyOTUzLzEyMTkvMTA0NyAxMjk1Mi8xMjIwLzEwNDcgMTI5NDMvMTIyMC8xMDQ3CitmIDEyOTQzLzEyMjAvMTA0OCAxMjk0Mi8xMjE5LzEwNDggMTI5NTMvMTIxOS8xMDQ4CitmIDEyOTQ1LzEyMjIvMTA2NiAxMjk1NC8xMjI5LzEwNjYgMTI5NTUvMTIzMC8xMDY2CitmIDEyOTU1LzEyMzAvMTA1MCAxMjk0Mi8xMjE5LzEwNTAgMTI5NDUvMTIyMi8xMDUwCitmIDEyOTQ5LzEyMjUvMTA0MyAxMjk1Ni8xMjMxLzEwNDMgMTI5NTcvMTIzMS8xMDQzCitmIDEyOTU3LzEyMzEvMTA2NSAxMjk0Ni8xMjIzLzEwNjUgMTI5NDkvMTIyNS8xMDY1CitmIDEyOTUzLzEyMjYvMTA0NCAxMjk1OC8xMjMyLzEwNDQgMTI5NTkvMTIzMy8xMDQ0CitmIDEyOTU5LzEyMzMvMTA0NCAxMjk1MC8xMjI2LzEwNDQgMTI5NTMvMTIyNi8xMDQ0CitmIDEyOTQ2LzEyMjIvMTA1MSAxMjk1Ny8xMjI5LzEwNTEgMTI5NTQvMTIyOS8xMDUxCitmIDEyOTU0LzEyMjkvMTA1MiAxMjk0NS8xMjIyLzEwNTIgMTI5NDYvMTIyMi8xMDUyCitmIDEyOTQyLzEyMTkvMTA1MyAxMjk1NS8xMjMwLzEwNTMgMTI5NTgvMTIzMC8xMDUzCitmIDEyOTU4LzEyMzAvMTA2NyAxMjk1My8xMjE5LzEwNjcgMTI5NDIvMTIxOS8xMDY3CitmIDEyOTU0LzEyMzQvMTA1NSAxMjk2MC8xMjM1LzEwNTUgMTI5NjEvMTIzNi8xMDU1CitmIDEyOTYxLzEyMzYvMTA2OCAxMjk1NS8xMjM3LzEwNjggMTI5NTQvMTIzNC8xMDY4CitmIDEyOTU2LzEyMzEvMTA0MyAxMjk2Mi8xMjM4LzEwNDMgMTI5NjMvMTIzOS8xMDQzCitmIDEyOTYzLzEyMzkvMTA0MyAxMjk1Ny8xMjMxLzEwNDMgMTI5NTYvMTIzMS8xMDQzCitmIDEyOTU4LzEyMzIvMTA0NCAxMjk2NC8xMjQwLzEwNDQgMTI5NjUvMTI0MS8xMDQ0CitmIDEyOTY1LzEyNDEvMTA0NCAxMjk1OS8xMjMzLzEwNDQgMTI5NTgvMTIzMi8xMDQ0CitmIDEyOTU3LzEyMzQvMTA1NSAxMjk2My8xMjM1LzEwNTUgMTI5NjAvMTIzNS8xMDU1CitmIDEyOTYwLzEyMzUvMTA1NyAxMjk1NC8xMjM0LzEwNTcgMTI5NTcvMTIzNC8xMDU3CitmIDEyOTU1LzEyMzcvMTA2OSAxMjk2MS8xMjM2LzEwNjkgMTI5NjQvMTIzNi8xMDY5CitmIDEyOTY0LzEyMzYvMTA1OSAxMjk1OC8xMjM3LzEwNTkgMTI5NTUvMTIzNy8xMDU5CitmIDEyOTYwLzEyMzUvMTA2MCAxMjk2Ni8xMjQyLzEwNjAgMTI5NjcvMTI0My8xMDYwCitmIDEyOTY3LzEyNDMvMTA2MSAxMjk2MS8xMjM2LzEwNjEgMTI5NjAvMTIzNS8xMDYxCitmIDEyOTYyLzEyMzgvMTA0MyAxMjk2OC8xMjQ0LzEwNDMgMTI5NjkvMTI0NC8xMDQzCitmIDEyOTY5LzEyNDQvMTA0MyAxMjk2My8xMjM5LzEwNDMgMTI5NjIvMTIzOC8xMDQzCitmIDEyOTY0LzEyNDAvMTA0NCAxMjk3MC8xMjQ1LzEwNDQgMTI5NzEvMTI0NS8xMDQ0CitmIDEyOTcxLzEyNDUvMTA0NCAxMjk2NS8xMjQxLzEwNDQgMTI5NjQvMTI0MC8xMDQ0CitmIDEyOTYzLzEyMzUvMTA2MCAxMjk2OS8xMjQyLzEwNjAgMTI5NjYvMTI0Mi8xMDYwCitmIDEyOTY2LzEyNDIvMTA2MiAxMjk2MC8xMjM1LzEwNjIgMTI5NjMvMTIzNS8xMDYyCitmIDEyOTYxLzEyMzYvMTA2MyAxMjk2Ny8xMjQzLzEwNjMgMTI5NzAvMTI0My8xMDYzCitmIDEyOTcwLzEyNDMvMTA2MSAxMjk2NC8xMjM2LzEwNjEgMTI5NjEvMTIzNi8xMDYxCitmIDEyOTcyLzEyNDYvMTA0MSAxMjk3My8xMjQ3LzEwNDEgMTI5NzQvMTI0OC8xMDQxCitmIDEyOTc0LzEyNDgvMTA0MiAxMjk3NS8xMjQ5LzEwNDIgMTI5NzIvMTI0Ni8xMDQyCitmIDEyOTc2LzEyNTAvMTA0MyAxMjk3Ny8xMjUxLzEwNDMgMTI5NzgvMTI1MS8xMDQzCitmIDEyOTc4LzEyNTEvMTA0MyAxMjk3OS8xMjUwLzEwNDMgMTI5NzYvMTI1MC8xMDQzCitmIDEyOTgwLzEyNTIvMTA0NCAxMjk4MS8xMjUzLzEwNDQgMTI5ODIvMTI1My8xMDQ0CitmIDEyOTgyLzEyNTMvMTA0NCAxMjk4My8xMjU0LzEwNDQgMTI5ODAvMTI1Mi8xMDQ0CitmIDEyOTc1LzEyNDkvMTA0NSAxMjk3NC8xMjQ4LzEwNDUgMTI5NzcvMTI1NS8xMDQ1CitmIDEyOTc3LzEyNTUvMTA0NiAxMjk3Ni8xMjU2LzEwNDYgMTI5NzUvMTI0OS8xMDQ2CitmIDEyOTgzLzEyNDYvMTA3MCAxMjk4Mi8xMjQ3LzEwNzAgMTI5NzMvMTI0Ny8xMDcwCitmIDEyOTczLzEyNDcvMTA0OCAxMjk3Mi8xMjQ2LzEwNDggMTI5ODMvMTI0Ni8xMDQ4CitmIDEyOTc1LzEyNDkvMTA0OSAxMjk4NC8xMjU3LzEwNDkgMTI5ODUvMTI1OC8xMDQ5CitmIDEyOTg1LzEyNTgvMTA1MCAxMjk3Mi8xMjQ2LzEwNTAgMTI5NzUvMTI0OS8xMDUwCitmIDEyOTc5LzEyNTAvMTA0MyAxMjk4Ni8xMjU5LzEwNDMgMTI5ODcvMTI2MC8xMDQzCitmIDEyOTg3LzEyNjAvMTA0MyAxMjk3Ni8xMjUwLzEwNDMgMTI5NzkvMTI1MC8xMDQzCitmIDEyOTgzLzEyNTQvMTA0NCAxMjk4OC8xMjYxLzEwNDQgMTI5ODkvMTI2MS8xMDQ0CitmIDEyOTg5LzEyNjEvMTA0NCAxMjk4MC8xMjUyLzEwNDQgMTI5ODMvMTI1NC8xMDQ0CitmIDEyOTc2LzEyNTYvMTA1MSAxMjk4Ny8xMjYyLzEwNTEgMTI5ODQvMTI1Ny8xMDUxCitmIDEyOTg0LzEyNTcvMTA1MiAxMjk3NS8xMjQ5LzEwNTIgMTI5NzYvMTI1Ni8xMDUyCitmIDEyOTcyLzEyNDYvMTA3MSAxMjk4NS8xMjU4LzEwNzEgMTI5ODgvMTI1OC8xMDcxCitmIDEyOTg4LzEyNTgvMTA3MiAxMjk4My8xMjQ2LzEwNzIgMTI5NzIvMTI0Ni8xMDcyCitmIDEyOTg0LzEyNjMvMTA3MyAxMjk5MC8xMjY0LzEwNzMgMTI5OTEvMTI2NS8xMDczCitmIDEyOTkxLzEyNjUvMTA1NiAxMjk4NS8xMjY2LzEwNTYgMTI5ODQvMTI2My8xMDU2CitmIDEyOTg2LzEyNTkvMTA0MyAxMjk5Mi8xMjY3LzEwNDMgMTI5OTMvMTI2OC8xMDQzCitmIDEyOTkzLzEyNjgvMTA0MyAxMjk4Ny8xMjYwLzEwNDMgMTI5ODYvMTI1OS8xMDQzCitmIDEyOTg4LzEyNjEvMTA0NCAxMjk5NC8xMjY5LzEwNDQgMTI5OTUvMTI3MC8xMDQ0CitmIDEyOTk1LzEyNzAvMTA0NCAxMjk4OS8xMjYxLzEwNDQgMTI5ODgvMTI2MS8xMDQ0CitmIDEyOTg3LzEyNjMvMTA1NSAxMjk5My8xMjY0LzEwNTUgMTI5OTAvMTI2NC8xMDU1CitmIDEyOTkwLzEyNjQvMTA1NyAxMjk4NC8xMjYzLzEwNTcgMTI5ODcvMTI2My8xMDU3CitmIDEyOTg1LzEyNjYvMTA1OCAxMjk5MS8xMjY1LzEwNTggMTI5OTQvMTI2NS8xMDU4CitmIDEyOTk0LzEyNjUvMTA1OSAxMjk4OC8xMjY2LzEwNTkgMTI5ODUvMTI2Ni8xMDU5CitmIDEyOTkwLzEyNjQvMTA2MCAxMjk5Ni8xMjcxLzEwNjAgMTI5OTcvMTI3Mi8xMDYwCitmIDEyOTk3LzEyNzIvMTA2MSAxMjk5MS8xMjY1LzEwNjEgMTI5OTAvMTI2NC8xMDYxCitmIDEyOTkyLzEyNjcvMTA0MyAxMjk5OC8xMjczLzEwNDMgMTI5OTkvMTI3My8xMDQzCitmIDEyOTk5LzEyNzMvMTA0MyAxMjk5My8xMjY4LzEwNDMgMTI5OTIvMTI2Ny8xMDQzCitmIDEyOTk0LzEyNjkvMTA0NCAxMzAwMC8xMjc0LzEwNDQgMTMwMDEvMTI3NS8xMDQ0CitmIDEzMDAxLzEyNzUvMTA0NCAxMjk5NS8xMjcwLzEwNDQgMTI5OTQvMTI2OS8xMDQ0CitmIDEyOTkzLzEyNjQvMTA2MCAxMjk5OS8xMjcxLzEwNjAgMTI5OTYvMTI3MS8xMDYwCitmIDEyOTk2LzEyNzEvMTA2MiAxMjk5MC8xMjY0LzEwNjIgMTI5OTMvMTI2NC8xMDYyCitmIDEyOTkxLzEyNjUvMTA2MyAxMjk5Ny8xMjcyLzEwNjMgMTMwMDAvMTI3Mi8xMDYzCitmIDEzMDAwLzEyNzIvMTA2MSAxMjk5NC8xMjY1LzEwNjEgMTI5OTEvMTI2NS8xMDYxCitmIDEzMDAyLzEyNzYvMTA0MSAxMzAwMy8xMjc3LzEwNDEgMTMwMDQvMTI3OC8xMDQxCitmIDEzMDA0LzEyNzgvMTA0MiAxMzAwNS8xMjc5LzEwNDIgMTMwMDIvMTI3Ni8xMDQyCitmIDEzMDA2LzEyODAvMTA0MyAxMzAwNy8xMjgxLzEwNDMgMTMwMDgvMTI4Mi8xMDQzCitmIDEzMDA4LzEyODIvMTA2NSAxMzAwOS8xMjgwLzEwNjUgMTMwMDYvMTI4MC8xMDY1CitmIDEzMDEwLzEyODMvMTA0NCAxMzAxMS8xMjg0LzEwNDQgMTMwMTIvMTI4NC8xMDQ0CitmIDEzMDEyLzEyODQvMTA0NCAxMzAxMy8xMjgzLzEwNDQgMTMwMTAvMTI4My8xMDQ0CitmIDEzMDA1LzEyNzkvMTA0NSAxMzAwNC8xMjc4LzEwNDUgMTMwMDcvMTI3OC8xMDQ1CitmIDEzMDA3LzEyNzgvMTA0NiAxMzAwNi8xMjc5LzEwNDYgMTMwMDUvMTI3OS8xMDQ2CitmIDEzMDEzLzEyODUvMTA0MiAxMzAxMi8xMjg2LzEwNDIgMTMwMDMvMTI3Ny8xMDQyCitmIDEzMDAzLzEyNzcvMTA0OCAxMzAwMi8xMjc2LzEwNDggMTMwMTMvMTI4NS8xMDQ4CitmIDEzMDA1LzEyNzkvMTA0OSAxMzAxNC8xMjg3LzEwNDkgMTMwMTUvMTI4OC8xMDQ5CitmIDEzMDE1LzEyODgvMTA3NCAxMzAwMi8xMjc2LzEwNzQgMTMwMDUvMTI3OS8xMDc0CitmIDEzMDA5LzEyODAvMTA0MyAxMzAxNi8xMjg5LzEwNDMgMTMwMTcvMTI5MC8xMDQzCitmIDEzMDE3LzEyOTAvMTA2NSAxMzAwNi8xMjgwLzEwNjUgMTMwMDkvMTI4MC8xMDY1CitmIDEzMDEzLzEyODMvMTA0NCAxMzAxOC8xMjkxLzEwNDQgMTMwMTkvMTI5MS8xMDQ0CitmIDEzMDE5LzEyOTEvMTA0NCAxMzAxMC8xMjgzLzEwNDQgMTMwMTMvMTI4My8xMDQ0CitmIDEzMDA2LzEyNzkvMTA3NSAxMzAxNy8xMjg3LzEwNzUgMTMwMTQvMTI4Ny8xMDc1CitmIDEzMDE0LzEyODcvMTA1MiAxMzAwNS8xMjc5LzEwNTIgMTMwMDYvMTI3OS8xMDUyCitmIDEzMDAyLzEyNzYvMTA3NiAxMzAxNS8xMjg4LzEwNzYgMTMwMTgvMTI5Mi8xMDc2CitmIDEzMDE4LzEyOTIvMTA3NyAxMzAxMy8xMjg1LzEwNzcgMTMwMDIvMTI3Ni8xMDc3CitmIDEzMDE0LzEyOTMvMTA3MyAxMzAyMC8xMjk0LzEwNzMgMTMwMjEvMTI5NS8xMDczCitmIDEzMDIxLzEyOTUvMTA2OCAxMzAxNS8xMjk2LzEwNjggMTMwMTQvMTI5My8xMDY4CitmIDEzMDE2LzEyODkvMTA0MyAxMzAyMi8xMjk3LzEwNDMgMTMwMjMvMTI5OC8xMDQzCitmIDEzMDIzLzEyOTgvMTA0MyAxMzAxNy8xMjkwLzEwNDMgMTMwMTYvMTI4OS8xMDQzCitmIDEzMDE4LzEyOTEvMTA0NCAxMzAyNC8xMjk5LzEwNDQgMTMwMjUvMTMwMC8xMDQ0CitmIDEzMDI1LzEzMDAvMTA0NCAxMzAxOS8xMjkxLzEwNDQgMTMwMTgvMTI5MS8xMDQ0CitmIDEzMDE3LzEyOTMvMTA1NSAxMzAyMy8xMjk0LzEwNTUgMTMwMjAvMTI5NC8xMDU1CitmIDEzMDIwLzEyOTQvMTA1NyAxMzAxNC8xMjkzLzEwNTcgMTMwMTcvMTI5My8xMDU3CitmIDEzMDE1LzEyOTYvMTA1OCAxMzAyMS8xMjk1LzEwNTggMTMwMjQvMTI5NS8xMDU4CitmIDEzMDI0LzEyOTUvMTA1OSAxMzAxOC8xMjk2LzEwNTkgMTMwMTUvMTI5Ni8xMDU5CitmIDEzMDIwLzEyOTQvMTA2MCAxMzAyNi8xMzAxLzEwNjAgMTMwMjcvMTMwMi8xMDYwCitmIDEzMDI3LzEzMDIvMTA2MSAxMzAyMS8xMjk1LzEwNjEgMTMwMjAvMTI5NC8xMDYxCitmIDEzMDIyLzEyOTcvMTA0MyAxMzAyOC8xMzAzLzEwNDMgMTMwMjkvMTMwNC8xMDQzCitmIDEzMDI5LzEzMDQvMTA0MyAxMzAyMy8xMjk4LzEwNDMgMTMwMjIvMTI5Ny8xMDQzCitmIDEzMDI0LzEyOTkvMTA0NCAxMzAzMC8xMzA1LzEwNDQgMTMwMzEvMTMwNi8xMDQ0CitmIDEzMDMxLzEzMDYvMTA0NCAxMzAyNS8xMzAwLzEwNDQgMTMwMjQvMTI5OS8xMDQ0CitmIDEzMDIzLzEyOTQvMTA2MCAxMzAyOS8xMzAxLzEwNjAgMTMwMjYvMTMwMS8xMDYwCitmIDEzMDI2LzEzMDEvMTA2MiAxMzAyMC8xMjk0LzEwNjIgMTMwMjMvMTI5NC8xMDYyCitmIDEzMDIxLzEyOTUvMTA2MyAxMzAyNy8xMzAyLzEwNjMgMTMwMzAvMTMwMi8xMDYzCitmIDEzMDMwLzEzMDIvMTA2MSAxMzAyNC8xMjk1LzEwNjEgMTMwMjEvMTI5NS8xMDYxCitmIDEzMDY0LzEzMDcvMTA3OCAxMzA2Ny8xMzA4LzEwNzggMTMwNjYvMTMwOS8xMDc4CitmIDEzMDY2LzEzMDkvMTA3OSAxMzA2NS8xMzEwLzEwNzkgMTMwNjQvMTMwNy8xMDc5CitmIDEzMDY4LzEzMTEvMTA4MCAxMzA3MS8xMzEyLzEwODAgMTMwNzAvMTMxMy8xMDgwCitmIDEzMDcwLzEzMTMvMTA0NCAxMzA2OS8xMzEzLzEwNDQgMTMwNjgvMTMxMS8xMDQ0CitmIDEzMDcyLzEzMTQvMTA4MSAxMzA3NS8xMzE0LzEwODEgMTMwNzQvMTMxNS8xMDgxCitmIDEzMDc0LzEzMTUvMTA0MyAxMzA3My8xMzE1LzEwNDMgMTMwNzIvMTMxNC8xMDQzCitmIDEzMDY3LzEzMDgvMTA4MiAxMzA2OC8xMzA4LzEwODIgMTMwNjkvMTMwOS8xMDgyCitmIDEzMDY5LzEzMDkvMTA4MyAxMzA2Ni8xMzA5LzEwODMgMTMwNjcvMTMwOC8xMDgzCitmIDEzMDc1LzEzMDcvMTA4NCAxMzA2NC8xMzA3LzEwODQgMTMwNjUvMTMxMC8xMDg0CitmIDEzMDY1LzEzMTAvMTA4NSAxMzA3NC8xMzEwLzEwODUgMTMwNzUvMTMwNy8xMDg1CitmIDEzMDY3LzEzMDgvMTA4NiAxMzA2NC8xMzA3LzEwODYgMTMwNzcvMTMxNi8xMDg2CitmIDEzMDc3LzEzMTYvMTA4NyAxMzA3Ni8xMzE3LzEwODcgMTMwNjcvMTMwOC8xMDg3CitmIDEzMDcxLzEzMTIvMTA4OCAxMzA2OC8xMzExLzEwODggMTMwNzkvMTMxOC8xMDg4CitmIDEzMDc5LzEzMTgvMTA4MCAxMzA3OC8xMzE4LzEwODAgMTMwNzEvMTMxMi8xMDgwCitmIDEzMDc1LzEzMTQvMTA4OSAxMzA3Mi8xMzE0LzEwODkgMTMwODEvMTMxOS8xMDg5CitmIDEzMDgxLzEzMTkvMTA0MyAxMzA4MC8xMzIwLzEwNDMgMTMwNzUvMTMxNC8xMDQzCitmIDEzMDY4LzEzMDgvMTA5MCAxMzA2Ny8xMzA4LzEwOTAgMTMwNzYvMTMxNy8xMDkwCitmIDEzMDc2LzEzMTcvMTA5MSAxMzA3OS8xMzE3LzEwOTEgMTMwNjgvMTMwOC8xMDkxCitmIDEzMDY0LzEzMDcvMTA5MiAxMzA3NS8xMzA3LzEwOTIgMTMwODAvMTMxNi8xMDkyCitmIDEzMDgwLzEzMTYvMTA5MyAxMzA3Ny8xMzE2LzEwOTMgMTMwNjQvMTMwNy8xMDkzCitmIDEzMDc2LzEzMjEvMTA5NCAxMzA3Ny8xMzIyLzEwOTQgMTMwODMvMTMyMy8xMDk0CitmIDEzMDgzLzEzMjMvMTA5NSAxMzA4Mi8xMzI0LzEwOTUgMTMwNzYvMTMyMS8xMDk1CitmIDEzMDc4LzEzMTgvMTA0NCAxMzA3OS8xMzE4LzEwNDQgMTMwODUvMTMyNS8xMDQ0CitmIDEzMDg1LzEzMjUvMTA5NiAxMzA4NC8xMzI1LzEwOTYgMTMwNzgvMTMxOC8xMDk2CitmIDEzMDgwLzEzMjAvMTA0MyAxMzA4MS8xMzE5LzEwNDMgMTMwODcvMTMyNi8xMDQzCitmIDEzMDg3LzEzMjYvMTA0MyAxMzA4Ni8xMzI3LzEwNDMgMTMwODAvMTMyMC8xMDQzCitmIDEzMDc5LzEzMjgvMTA5NyAxMzA3Ni8xMzIxLzEwOTcgMTMwODIvMTMyNC8xMDk3CitmIDEzMDgyLzEzMjQvMTA5NSAxMzA4NS8xMzI5LzEwOTUgMTMwNzkvMTMyOC8xMDk1CitmIDEzMDc3LzEzMjIvMTA5OCAxMzA4MC8xMzIyLzEwOTggMTMwODYvMTMyMy8xMDk4CitmIDEzMDg2LzEzMjMvMTA5OSAxMzA4My8xMzIzLzEwOTkgMTMwNzcvMTMyMi8xMDk5CitmIDEzMDgyLzEzMjQvMTEwMCAxMzA4My8xMzIzLzExMDAgMTMwODkvMTMzMC8xMTAwCitmIDEzMDg5LzEzMzAvMTEwMSAxMzA4OC8xMzMxLzExMDEgMTMwODIvMTMyNC8xMTAxCitmIDEzMDg0LzEzMjUvMTA5NiAxMzA4NS8xMzI1LzEwOTYgMTMwOTEvMTMzMi8xMDk2CitmIDEzMDkxLzEzMzIvMTA0NCAxMzA5MC8xMzMyLzEwNDQgMTMwODQvMTMyNS8xMDQ0CitmIDEzMDg2LzEzMjcvMTA0MyAxMzA4Ny8xMzI2LzEwNDMgMTMwOTMvMTMzMy8xMDQzCitmIDEzMDkzLzEzMzMvMTEwMiAxMzA5Mi8xMzMzLzExMDIgMTMwODYvMTMyNy8xMTAyCitmIDEzMDg1LzEzMjkvMTEwMyAxMzA4Mi8xMzI0LzExMDMgMTMwODgvMTMzMS8xMTAzCitmIDEzMDg4LzEzMzEvMTEwMSAxMzA5MS8xMzM0LzExMDEgMTMwODUvMTMyOS8xMTAxCitmIDEzMDgzLzEzMjMvMTEwMCAxMzA4Ni8xMzIzLzExMDAgMTMwOTIvMTMzMC8xMTAwCitmIDEzMDkyLzEzMzAvMTEwNCAxMzA4OS8xMzMwLzExMDQgMTMwODMvMTMyMy8xMTA0CitmIDEzMTA0LzEzMzUvMTEwNSAxMzEwNy8xMzM2LzExMDUgMTMxMDYvMTMzNy8xMTA1CitmIDEzMTA2LzEzMzcvMTA3OCAxMzEwNS8xMzM4LzEwNzggMTMxMDQvMTMzNS8xMDc4CitmIDEzMTA4LzEzMzkvMTA4MCAxMzExMS8xMzM5LzEwODAgMTMxMTAvMTM0MC8xMDgwCitmIDEzMTEwLzEzNDAvMTA0NCAxMzEwOS8xMzQxLzEwNDQgMTMxMDgvMTMzOS8xMDQ0CitmIDEzMTEyLzEzNDIvMTA0MyAxMzExNS8xMzQzLzEwNDMgMTMxMTQvMTM0NC8xMDQzCitmIDEzMTE0LzEzNDQvMTA0MyAxMzExMy8xMzQ0LzEwNDMgMTMxMTIvMTM0Mi8xMDQzCitmIDEzMTA3LzEzMzYvMTA4MiAxMzEwOC8xMzM2LzEwODIgMTMxMDkvMTMzNy8xMDgyCitmIDEzMTA5LzEzMzcvMTEwNiAxMzEwNi8xMzM3LzExMDYgMTMxMDcvMTMzNi8xMTA2CitmIDEzMTE1LzEzMzUvMTEwNyAxMzEwNC8xMzM1LzExMDcgMTMxMDUvMTMzOC8xMTA3CitmIDEzMTA1LzEzMzgvMTEwNSAxMzExNC8xMzM4LzExMDUgMTMxMTUvMTMzNS8xMTA1CitmIDEzMTA3LzEzMzYvMTA4NiAxMzEwNC8xMzM1LzEwODYgMTMxMTcvMTM0NS8xMDg2CitmIDEzMTE3LzEzNDUvMTEwOCAxMzExNi8xMzQ2LzExMDggMTMxMDcvMTMzNi8xMTA4CitmIDEzMTExLzEzMzkvMTA4MCAxMzEwOC8xMzM5LzEwODAgMTMxMTkvMTM0Ny8xMDgwCitmIDEzMTE5LzEzNDcvMTA0NCAxMzExOC8xMzQ3LzEwNDQgMTMxMTEvMTMzOS8xMDQ0CitmIDEzMTE1LzEzNDMvMTA2NSAxMzExMi8xMzQyLzEwNjUgMTMxMjEvMTM0OC8xMDY1CitmIDEzMTIxLzEzNDgvMTA0MyAxMzEyMC8xMzQ4LzEwNDMgMTMxMTUvMTM0My8xMDQzCitmIDEzMTA4LzEzMzYvMTEwOSAxMzEwNy8xMzM2LzExMDkgMTMxMTYvMTM0Ni8xMTA5CitmIDEzMTE2LzEzNDYvMTA5MSAxMzExOS8xMzQ2LzEwOTEgMTMxMDgvMTMzNi8xMDkxCitmIDEzMTA0LzEzMzUvMTExMCAxMzExNS8xMzM1LzExMTAgMTMxMjAvMTM0NS8xMTEwCitmIDEzMTIwLzEzNDUvMTA5MyAxMzExNy8xMzQ1LzEwOTMgMTMxMDQvMTMzNS8xMDkzCitmIDEzMTE2LzEzNDkvMTExMSAxMzExNy8xMzUwLzExMTEgMTMxMjMvMTM1MS8xMTExCitmIDEzMTIzLzEzNTEvMTA5NSAxMzEyMi8xMzUyLzEwOTUgMTMxMTYvMTM0OS8xMDk1CitmIDEzMTE4LzEzNDcvMTA0NCAxMzExOS8xMzQ3LzEwNDQgMTMxMjUvMTM1My8xMDQ0CitmIDEzMTI1LzEzNTMvMTA0NCAxMzEyNC8xMzU0LzEwNDQgMTMxMTgvMTM0Ny8xMDQ0CitmIDEzMTIwLzEzNDgvMTA0MyAxMzEyMS8xMzQ4LzEwNDMgMTMxMjcvMTM1NS8xMDQzCitmIDEzMTI3LzEzNTUvMTA0MyAxMzEyNi8xMzU1LzEwNDMgMTMxMjAvMTM0OC8xMDQzCitmIDEzMTE5LzEzNDkvMTA5NyAxMzExNi8xMzQ5LzEwOTcgMTMxMjIvMTM1Mi8xMDk3CitmIDEzMTIyLzEzNTIvMTA5NSAxMzEyNS8xMzUyLzEwOTUgMTMxMTkvMTM0OS8xMDk1CitmIDEzMTE3LzEzNTAvMTA5OCAxMzEyMC8xMzU2LzEwOTggMTMxMjYvMTM1Ny8xMDk4CitmIDEzMTI2LzEzNTcvMTExMiAxMzEyMy8xMzUxLzExMTIgMTMxMTcvMTM1MC8xMTEyCitmIDEzMTIyLzEzNTIvMTEwMCAxMzEyMy8xMzUxLzExMDAgMTMxMjkvMTM1OC8xMTAwCitmIDEzMTI5LzEzNTgvMTEwMSAxMzEyOC8xMzU5LzExMDEgMTMxMjIvMTM1Mi8xMTAxCitmIDEzMTI0LzEzNTQvMTA0NCAxMzEyNS8xMzUzLzEwNDQgMTMxMzEvMTM2MC8xMDQ0CitmIDEzMTMxLzEzNjAvMTExMyAxMzEzMC8xMzYwLzExMTMgMTMxMjQvMTM1NC8xMTEzCitmIDEzMTI2LzEzNTUvMTA0MyAxMzEyNy8xMzU1LzEwNDMgMTMxMzMvMTM2MS8xMDQzCitmIDEzMTMzLzEzNjEvMTA0MyAxMzEzMi8xMzYxLzEwNDMgMTMxMjYvMTM1NS8xMDQzCitmIDEzMTI1LzEzNTIvMTEwMyAxMzEyMi8xMzUyLzExMDMgMTMxMjgvMTM1OS8xMTAzCitmIDEzMTI4LzEzNTkvMTEwMSAxMzEzMS8xMzU5LzExMDEgMTMxMjUvMTM1Mi8xMTAxCitmIDEzMTIzLzEzNTEvMTEwMCAxMzEyNi8xMzU3LzExMDAgMTMxMzIvMTM2Mi8xMTAwCitmIDEzMTMyLzEzNjIvMTEwNCAxMzEyOS8xMzU4LzExMDQgMTMxMjMvMTM1MS8xMTA0CitmIDEzMTM0LzEzNjMvMTA3OCAxMzEzNy8xMzY0LzEwNzggMTMxMzYvMTM2NS8xMDc4CitmIDEzMTM2LzEzNjUvMTA3OSAxMzEzNS8xMzY2LzEwNzkgMTMxMzQvMTM2My8xMDc5CitmIDEzMTM4LzEzNjcvMTA0NCAxMzE0MS8xMzY3LzEwNDQgMTMxNDAvMTM2OC8xMDQ0CitmIDEzMTQwLzEzNjgvMTA0NCAxMzEzOS8xMzY5LzEwNDQgMTMxMzgvMTM2Ny8xMDQ0CitmIDEzMTQyLzEzNzAvMTA0MyAxMzE0NS8xMzcwLzEwNDMgMTMxNDQvMTM3MS8xMDQzCitmIDEzMTQ0LzEzNzEvMTA4MSAxMzE0My8xMzcxLzEwODEgMTMxNDIvMTM3MC8xMDgxCitmIDEzMTM3LzEzNjQvMTA4MiAxMzEzOC8xMzY0LzEwODIgMTMxMzkvMTM2NS8xMDgyCitmIDEzMTM5LzEzNjUvMTA4MyAxMzEzNi8xMzY1LzEwODMgMTMxMzcvMTM2NC8xMDgzCitmIDEzMTQ1LzEzNjMvMTEwNyAxMzEzNC8xMzYzLzExMDcgMTMxMzUvMTM2Ni8xMTA3CitmIDEzMTM1LzEzNjYvMTA3OCAxMzE0NC8xMzY2LzEwNzggMTMxNDUvMTM2My8xMDc4CitmIDEzMTM3LzEzNjQvMTA4NiAxMzEzNC8xMzYzLzEwODYgMTMxNDcvMTM3Mi8xMDg2CitmIDEzMTQ3LzEzNzIvMTEwOCAxMzE0Ni8xMzczLzExMDggMTMxMzcvMTM2NC8xMTA4CitmIDEzMTQxLzEzNjcvMTA0NCAxMzEzOC8xMzY3LzEwNDQgMTMxNDkvMTM3NC8xMDQ0CitmIDEzMTQ5LzEzNzQvMTA0NCAxMzE0OC8xMzc0LzEwNDQgMTMxNDEvMTM2Ny8xMDQ0CitmIDEzMTQ1LzEzNzAvMTA4MSAxMzE0Mi8xMzcwLzEwODEgMTMxNTEvMTM3NS8xMDgxCitmIDEzMTUxLzEzNzUvMTA0MyAxMzE1MC8xMzc2LzEwNDMgMTMxNDUvMTM3MC8xMDQzCitmIDEzMTM4LzEzNjQvMTEwOSAxMzEzNy8xMzY0LzExMDkgMTMxNDYvMTM3My8xMTA5CitmIDEzMTQ2LzEzNzMvMTA5MSAxMzE0OS8xMzczLzEwOTEgMTMxMzgvMTM2NC8xMDkxCitmIDEzMTM0LzEzNjMvMTExNCAxMzE0NS8xMzYzLzExMTQgMTMxNTAvMTM3Mi8xMTE0CitmIDEzMTUwLzEzNzIvMTExNSAxMzE0Ny8xMzcyLzExMTUgMTMxMzQvMTM2My8xMTE1CitmIDEzMTQ2LzEzNzcvMTExMSAxMzE0Ny8xMzc4LzExMTEgMTMxNTMvMTM3OS8xMTExCitmIDEzMTUzLzEzNzkvMTA5NSAxMzE1Mi8xMzgwLzEwOTUgMTMxNDYvMTM3Ny8xMDk1CitmIDEzMTQ4LzEzNzQvMTA0NCAxMzE0OS8xMzc0LzEwNDQgMTMxNTUvMTM4MS8xMDQ0CitmIDEzMTU1LzEzODEvMTA0NCAxMzE1NC8xMzgyLzEwNDQgMTMxNDgvMTM3NC8xMDQ0CitmIDEzMTUwLzEzNzYvMTA0MyAxMzE1MS8xMzc1LzEwNDMgMTMxNTcvMTM4My8xMDQzCitmIDEzMTU3LzEzODMvMTA0MyAxMzE1Ni8xMzgzLzEwNDMgMTMxNTAvMTM3Ni8xMDQzCitmIDEzMTQ5LzEzODQvMTA5NyAxMzE0Ni8xMzc3LzEwOTcgMTMxNTIvMTM4MC8xMDk3CitmIDEzMTUyLzEzODAvMTA5NSAxMzE1NS8xMzg1LzEwOTUgMTMxNDkvMTM4NC8xMDk1CitmIDEzMTQ3LzEzNzgvMTA5OCAxMzE1MC8xMzg2LzEwOTggMTMxNTYvMTM4Ny8xMDk4CitmIDEzMTU2LzEzODcvMTExNiAxMzE1My8xMzc5LzExMTYgMTMxNDcvMTM3OC8xMTE2CitmIDEzMTUyLzEzODAvMTEwMCAxMzE1My8xMzc5LzExMDAgMTMxNTkvMTM4OC8xMTAwCitmIDEzMTU5LzEzODgvMTEwMSAxMzE1OC8xMzg5LzExMDEgMTMxNTIvMTM4MC8xMTAxCitmIDEzMTU0LzEzODIvMTA0NCAxMzE1NS8xMzgxLzEwNDQgMTMxNjEvMTM5MC8xMDQ0CitmIDEzMTYxLzEzOTAvMTA0NCAxMzE2MC8xMzkxLzEwNDQgMTMxNTQvMTM4Mi8xMDQ0CitmIDEzMTU2LzEzODMvMTA0MyAxMzE1Ny8xMzgzLzEwNDMgMTMxNjMvMTM5Mi8xMDQzCitmIDEzMTYzLzEzOTIvMTA0MyAxMzE2Mi8xMzkyLzEwNDMgMTMxNTYvMTM4My8xMDQzCitmIDEzMTU1LzEzODUvMTEwMyAxMzE1Mi8xMzgwLzExMDMgMTMxNTgvMTM4OS8xMTAzCitmIDEzMTU4LzEzODkvMTEwMSAxMzE2MS8xMzkzLzExMDEgMTMxNTUvMTM4NS8xMTAxCitmIDEzMTUzLzEzNzkvMTEwMCAxMzE1Ni8xMzg3LzExMDAgMTMxNjIvMTM5NC8xMTAwCitmIDEzMTYyLzEzOTQvMTEwNCAxMzE1OS8xMzg4LzExMDQgMTMxNTMvMTM3OS8xMTA0CitmIDEzMTY0LzEzOTUvMTA3OCAxMzE2Ny8xMzk2LzEwNzggMTMxNjYvMTM5Ny8xMDc4CitmIDEzMTY2LzEzOTcvMTA3OSAxMzE2NS8xMzk4LzEwNzkgMTMxNjQvMTM5NS8xMDc5CitmIDEzMTY4LzEzOTkvMTA0NCAxMzE3MS8xNDAwLzEwNDQgMTMxNzAvMTQwMS8xMDQ0CitmIDEzMTcwLzE0MDEvMTA0NCAxMzE2OS8xNDAxLzEwNDQgMTMxNjgvMTM5OS8xMDQ0CitmIDEzMTcyLzE0MDIvMTA0MyAxMzE3NS8xNDAyLzEwNDMgMTMxNzQvMTQwMy8xMDQzCitmIDEzMTc0LzE0MDMvMTA4MSAxMzE3My8xNDAzLzEwODEgMTMxNzIvMTQwMi8xMDgxCitmIDEzMTY3LzEzOTYvMTA4MiAxMzE2OC8xMzk2LzEwODIgMTMxNjkvMTM5Ny8xMDgyCitmIDEzMTY5LzEzOTcvMTA4MyAxMzE2Ni8xMzk3LzEwODMgMTMxNjcvMTM5Ni8xMDgzCitmIDEzMTc1LzEzOTUvMTExNyAxMzE2NC8xMzk1LzExMTcgMTMxNjUvMTM5OC8xMTE3CitmIDEzMTY1LzEzOTgvMTA3OCAxMzE3NC8xMzk4LzEwNzggMTMxNzUvMTM5NS8xMDc4CitmIDEzMTY3LzEzOTYvMTA4NiAxMzE2NC8xMzk1LzEwODYgMTMxNzcvMTQwNC8xMDg2CitmIDEzMTc3LzE0MDQvMTEwOCAxMzE3Ni8xNDA1LzExMDggMTMxNjcvMTM5Ni8xMTA4CitmIDEzMTcxLzE0MDAvMTA0NCAxMzE2OC8xMzk5LzEwNDQgMTMxNzkvMTQwNi8xMDQ0CitmIDEzMTc5LzE0MDYvMTA0NCAxMzE3OC8xNDA2LzEwNDQgMTMxNzEvMTQwMC8xMDQ0CitmIDEzMTc1LzE0MDIvMTA0MyAxMzE3Mi8xNDAyLzEwNDMgMTMxODEvMTQwNy8xMDQzCitmIDEzMTgxLzE0MDcvMTA0MyAxMzE4MC8xNDA4LzEwNDMgMTMxNzUvMTQwMi8xMDQzCitmIDEzMTY4LzEzOTYvMTEwOSAxMzE2Ny8xMzk2LzExMDkgMTMxNzYvMTQwNS8xMTA5CitmIDEzMTc2LzE0MDUvMTA5MSAxMzE3OS8xNDA1LzEwOTEgMTMxNjgvMTM5Ni8xMDkxCitmIDEzMTY0LzEzOTUvMTExOCAxMzE3NS8xMzk1LzExMTggMTMxODAvMTQwNC8xMTE4CitmIDEzMTgwLzE0MDQvMTExOSAxMzE3Ny8xNDA0LzExMTkgMTMxNjQvMTM5NS8xMTE5CitmIDEzMTc2LzE0MDkvMTExMSAxMzE3Ny8xNDEwLzExMTEgMTMxODMvMTQxMS8xMTExCitmIDEzMTgzLzE0MTEvMTA5NSAxMzE4Mi8xNDEyLzEwOTUgMTMxNzYvMTQwOS8xMDk1CitmIDEzMTc4LzE0MDYvMTA0NCAxMzE3OS8xNDA2LzEwNDQgMTMxODUvMTQxMy8xMDQ0CitmIDEzMTg1LzE0MTMvMTA5NiAxMzE4NC8xNDEzLzEwOTYgMTMxNzgvMTQwNi8xMDk2CitmIDEzMTgwLzE0MDgvMTA0MyAxMzE4MS8xNDA3LzEwNDMgMTMxODcvMTQxNC8xMDQzCitmIDEzMTg3LzE0MTQvMTA0MyAxMzE4Ni8xNDE1LzEwNDMgMTMxODAvMTQwOC8xMDQzCitmIDEzMTc5LzE0MTYvMTA5NyAxMzE3Ni8xNDA5LzEwOTcgMTMxODIvMTQxMi8xMDk3CitmIDEzMTgyLzE0MTIvMTA5NSAxMzE4NS8xNDE3LzEwOTUgMTMxNzkvMTQxNi8xMDk1CitmIDEzMTc3LzE0MTAvMTEyMCAxMzE4MC8xNDEwLzExMjAgMTMxODYvMTQxMS8xMTIwCitmIDEzMTg2LzE0MTEvMTExMiAxMzE4My8xNDExLzExMTIgMTMxNzcvMTQxMC8xMTEyCitmIDEzMTgyLzE0MTIvMTEwMCAxMzE4My8xNDExLzExMDAgMTMxODkvMTQxOC8xMTAwCitmIDEzMTg5LzE0MTgvMTEwMSAxMzE4OC8xNDE5LzExMDEgMTMxODIvMTQxMi8xMTAxCitmIDEzMTg0LzE0MTMvMTA5NiAxMzE4NS8xNDEzLzEwOTYgMTMxOTEvMTQyMC8xMDk2CitmIDEzMTkxLzE0MjAvMTA0NCAxMzE5MC8xNDIwLzEwNDQgMTMxODQvMTQxMy8xMDQ0CitmIDEzMTg2LzE0MTUvMTA0MyAxMzE4Ny8xNDE0LzEwNDMgMTMxOTMvMTQyMS8xMDQzCitmIDEzMTkzLzE0MjEvMTA0MyAxMzE5Mi8xNDIyLzEwNDMgMTMxODYvMTQxNS8xMDQzCitmIDEzMTg1LzE0MTcvMTEwMyAxMzE4Mi8xNDEyLzExMDMgMTMxODgvMTQxOS8xMTAzCitmIDEzMTg4LzE0MTkvMTEwMSAxMzE5MS8xNDIzLzExMDEgMTMxODUvMTQxNy8xMTAxCitmIDEzMTgzLzE0MTEvMTEwMCAxMzE4Ni8xNDExLzExMDAgMTMxOTIvMTQxOC8xMTAwCitmIDEzMTkyLzE0MTgvMTEwNCAxMzE4OS8xNDE4LzExMDQgMTMxODMvMTQxMS8xMTA0CitmIDczODYvMTQyNC8xMTIxIDc1MTQvMTQyNS8xMTIxIDc1MTMvMTQyNi8xMTIxCitmIDc1MTMvMTQyNi8xMTIyIDczODIvMTQyNy8xMTIyIDczODYvMTQyNC8xMTIyCitmIDczODcvMTQyOC8xMTIzIDc1MzIvMTQyOS8xMTIzIDc1MzEvMTQzMC8xMTIzCitmIDc1MzEvMTQzMC8xMTIzIDczODMvMTQzMS8xMTIzIDczODcvMTQyOC8xMTIzCitmIDczODgvMTQzMi8xMTI0IDc1NTAvMTQzMy8xMTI0IDc1NDkvMTQzNC8xMTI0CitmIDc1NDkvMTQzNC8xMTI0IDczODQvMTQzNS8xMTI0IDczODgvMTQzMi8xMTI0CitmIDczODkvMTQzNi8xMTI1IDc1NjgvMTQzNy8xMTI1IDc1NjcvMTQzOC8xMTI1CitmIDc1NjcvMTQzOC8xMTI1IDczODUvMTQzOS8xMTI1IDczODkvMTQzNi8xMTI1CitmIDc1MTMvMTQ0MC8xMTI2IDc1MjIvMTQ0MS8xMTI2IDc1MjUvMTQ0Mi8xMTI2CitmIDc1MjUvMTQ0Mi8xMTI3IDc1MTYvMTQ0My8xMTI3IDc1MTMvMTQ0MC8xMTI3CitmIDc1MjIvMTQ0NC8xMTI4IDczODMvMTQzMS8xMTI4IDczOTMvNzcvMTEyOAorZiA3MzkzLzc3LzExMjkgNzUyNS85Ni8xMTI5IDc1MjIvMTQ0NC8xMTI5CitmIDc1MzEvMTQ0NS8xMTMwIDc1NDAvMTQ0Ni8xMTMwIDc1NDMvMTQ0Ny8xMTMwCitmIDc1NDMvMTQ0Ny8xMTMxIDc1MzQvMTQ0OC8xMTMxIDc1MzEvMTQ0NS8xMTMxCitmIDc1NDAvMTQ0OS8xMTMyIDczODQvMTQzNS8xMTMyIDczOTUvNzkvMTEzMgorZiA3Mzk1Lzc5LzExMzMgNzU0My8xMDYvMTEzMyA3NTQwLzE0NDkvMTEzMworZiA3NTQ5LzE0NTAvMTEzNCA3NTU4LzE0NTEvMTEzNCA3NTYxLzE0NTEvMTEzNAorZiA3NTYxLzE0NTEvMTEzNSA3NTUyLzE0NTAvMTEzNSA3NTQ5LzE0NTAvMTEzNQorZiA3NTU4LzE0NTIvMTEzNiA3Mzg1LzE0MzkvMTEzNiA3Mzk3LzgzLzExMzYKK2YgNzM5Ny84My8xMTM3IDc1NjEvMTE2LzExMzcgNzU1OC8xNDUyLzExMzcKK2YgNzU2Ny8xNDUzLzExMzggNzU3Ni8xNDU0LzExMzggNzU3OS8xNDU1LzExMzgKK2YgNzU3OS8xNDU1LzExMzkgNzU3MC8xNDU2LzExMzkgNzU2Ny8xNDUzLzExMzkKK2YgNzU3Ni8xNDU3LzExNDAgNzM4Mi8xNDI3LzExNDAgNzM5MS83My8xMTQwCitmIDczOTEvNzMvMTE0MSA3NTc5LzEyMy8xMTQxIDc1NzYvMTQ1Ny8xMTQxCitmIDc1MjMvMTQ1OC8xMTQyIDc1MjIvMTQ1OS8xMTQyIDc1MTMvMTQyNi8xMTQyCitmIDc1MTMvMTQyNi8xMTQzIDc1MTQvMTQyNS8xMTQzIDc1MjMvMTQ1OC8xMTQzCitmIDczODIvMTQyNy8xMTQ0IDc1MTMvMTQyNi8xMTQ0IDc1MTYvNzQvMTE0NAorZiA3NTE2Lzc0LzExNDUgNzM5MS83My8xMTQ1IDczODIvMTQyNy8xMTQ1CitmIDczODcvMTQyOC8xMTQ2IDczODMvMTQzMS8xMTQ2IDc1MjIvMTQ0NC8xMTQ2CitmIDc1MjIvMTQ0NC8xMTQ2IDc1MjMvMTQ2MC8xMTQ2IDczODcvMTQyOC8xMTQ2CitmIDc1NDEvMTQ2MS8xMTQ3IDc1NDAvMTQ2Mi8xMTQ3IDc1MzEvMTQzMC8xMTQ3CitmIDc1MzEvMTQzMC8xMTQ3IDc1MzIvMTQyOS8xMTQ3IDc1NDEvMTQ2MS8xMTQ3CitmIDczODMvMTQzMS8xMTQ4IDc1MzEvMTQzMC8xMTQ4IDc1MzQvNzgvMTE0OAorZiA3NTM0Lzc4LzExNDkgNzM5My83Ny8xMTQ5IDczODMvMTQzMS8xMTQ5CitmIDczODgvMTQzMi8xMTUwIDczODQvMTQzNS8xMTUwIDc1NDAvMTQ0OS8xMTUwCitmIDc1NDAvMTQ0OS8xMTUwIDc1NDEvMTQ2My8xMTUwIDczODgvMTQzMi8xMTUwCitmIDc1NTkvMTQ2NC8xMTUxIDc1NTgvMTQ2NS8xMTUxIDc1NDkvMTQzNC8xMTUxCitmIDc1NDkvMTQzNC8xMTUxIDc1NTAvMTQzMy8xMTUxIDc1NTkvMTQ2NC8xMTUxCitmIDczODQvMTQzNS8xMTUyIDc1NDkvMTQzNC8xMTUyIDc1NTIvODAvMTE1MgorZiA3NTUyLzgwLzExNTMgNzM5NS83OS8xMTUzIDczODQvMTQzNS8xMTUzCitmIDczODkvMTQzNi8xMTU0IDczODUvMTQzOS8xMTU0IDc1NTgvMTQ1Mi8xMTU0CitmIDc1NTgvMTQ1Mi8xMTU0IDc1NTkvMTQ2Ni8xMTU0IDczODkvMTQzNi8xMTU0CitmIDc1NzcvMTQ2Ny8yMjkgNzU3Ni8xNDU3LzIyOSA3NTY3LzEyMi8yMjkKK2YgNzU2Ny8xMjIvMjI5IDc1NjgvMTQ2OC8yMjkgNzU3Ny8xNDY3LzIyOQorZiA3Mzg1LzE0MzkvMTE1NSA3NTY3LzE0MzgvMTE1NSA3NTcwLzg0LzExNTUKK2YgNzU3MC84NC8xMTU2IDczOTcvODMvMTE1NiA3Mzg1LzE0MzkvMTE1NgorZiA3Mzg2LzE0MjQvMTE1NyA3MzgyLzE0MjcvMTE1NyA3NTc2LzE0NTcvMTE1NworZiA3NTc2LzE0NTcvMTE1NyA3NTc3LzE0NjcvMTE1NyA3Mzg2LzE0MjQvMTE1NworZiAxMjg2Ny8xNDY5LzIyMSAxMjg2Ni8xNDcwLzIyMSAxMjg3MS8xNDcxLzIyMQorZiAxMjg3MS8xNDcxLzIyMSAxMjg3Mi8xNDcyLzIyMSAxMjg2Ny8xNDY5LzIyMQorZiAxMjg2OC8xNDczLzI4NSAxMjg2Ny8xNDY5LzI4NSAxMjg3Mi8xNDcyLzI4NQorZiAxMjg3Mi8xNDcyLzIyMSAxMjg3NC8xNDc0LzIyMSAxMjg2OC8xNDczLzIyMQorZiAxMjg2OS8xNDc1LzIyMSAxMjg3Ni8xNDc2LzIyMSAxMjg3MS8xNDcxLzIyMQorZiAxMjg3MS8xNDcxLzIyMSAxMjg2Ni8xNDcwLzIyMSAxMjg2OS8xNDc1LzIyMQorZiAxMjg2NS8xNDc3LzExNTggMTI4NzgvMTQ3OC8xMTU4IDEyODc2LzE0NzYvMTE1OAorZiAxMjg2NS8xNDc3LzExNTkgMTI4NzYvMTQ3Ni8xMTU5IDEyODY5LzE0NzUvMTE1OQorZiAxMjg3My8xNDc5LzExNjAgMTI4NzIvMTQ3Mi8xMTYwIDEyODcxLzE0NzEvMTE2MAorZiAxMjg3MS8xNDcxLzExNjEgMTI4NzAvMTQ4MC8xMTYxIDEyODczLzE0NzkvMTE2MQorZiAxMjg3NS8xNDgxLzExNjIgMTI4NzQvMTQ3NC8xMTYyIDEyODcyLzE0NzIvMTE2MgorZiAxMjg3Mi8xNDcyLzExNjMgMTI4NzMvMTQ3OS8xMTYzIDEyODc1LzE0ODEvMTE2MworZiAxMjg3Ny8xNDgyLzExNjQgMTI4NzAvMTQ4MC8xMTY0IDEyODcxLzE0NzEvMTE2NAorZiAxMjg3MS8xNDcxLzExNjUgMTI4NzYvMTQ3Ni8xMTY1IDEyODc3LzE0ODIvMTE2NQorZiAxMjg3OS8xNDgzLzExNjYgMTI4NzcvMTQ4Mi8xMTY2IDEyODc2LzE0NzYvMTE2NgorZiAxMjg3Ni8xNDc2LzExNjcgMTI4NzgvMTQ3OC8xMTY3IDEyODc5LzE0ODMvMTE2NworZiAxMjQvMTQ4NC8xMTY4IDEzNy8xNDg1LzExNjggMTM2LzE0ODYvMTE2OAorZiAxMzYvMTQ4Ni8xMTY4IDEyMy8xNDg3LzExNjggMTI0LzE0ODQvMTE2OAorZiAxMjUvMTQ4OC8xMTY5IDEzOC8xNDg5LzExNjkgMTM3LzE0ODUvMTE2OQorZiAxMzcvMTQ4NS8xMTY5IDEyNC8xNDg0LzExNjkgMTI1LzE0ODgvMTE2OQorZiAxNTI2LzE0OTAvMTE3MCAxNTI3LzE0OTEvMTE3MCAxMzUvMTQ5Mi8xMTcwCitmIDEzNS8xNDkzLzExNzAgMTIyLzE0OTQvMTE3MCAxNTI4LzE0OTUvMTE3MAorZiAxMjIvMTQ5NC8xMTcxIDEzNS8xNDkzLzExNzEgMTM0LzE0OTYvMTE3MQorZiAxMzQvMTQ5Ni8xMTcxIDExNC8xNDk3LzExNzEgMTIyLzE0OTQvMTE3MQorZiAxMTQvMTQ5Ny8xMTcyIDEzNC8xNDk2LzExNzIgMTQzLzE0OTgvMTE3MgorZiAxNDMvMTQ5OC8xMTcyIDUvMTQ5OS8xMTcyIDExNC8xNDk3LzExNzIKK2YgMTIxLzE1MDAvMTE3MyAxMzMvMTUwMS8xMTczIDEzMi8xNTAyLzExNzMKK2YgMTMyLzE1MDIvMTE3MyAxMjAvMTUwMy8xMTczIDEyMS8xNTAwLzExNzMKK2YgMTIwLzE1MDMvMTE3NCAxMzIvMTUwMi8xMTc0IDEzMS8xNTA0LzExNzQKK2YgMTMxLzE1MDQvMTE3NCAxMTkvMTUwNS8xMTc0IDEyMC8xNTAzLzExNzQKK2YgMTUyOS8xNTA2LzExNzUgMTUzMC8xNTA3LzExNzUgMTMwLzE1MDgvMTE3NQorZiAxMzAvMTUwOS8xMTc1IDExOC8xNTEwLzExNzUgMTUzMS8xNTExLzExNzUKK2YgMTE4LzE1MTAvMTE3NiAxMzAvMTUwOS8xMTc2IDEyOS8xNTEyLzExNzYKK2YgMTI5LzE1MTIvMTE3NyAxMTMvMTUxMy8xMTc3IDExOC8xNTEwLzExNzcKK2YgMTEzLzE1MTMvMTA0NCAxMjkvMTUxMi8xMDQ0IDE0MS8xNTE0LzEwNDQKK2YgMTQxLzE1MTQvMTA0NCA0LzE1MTUvMTA0NCAxMTMvMTUxMy8xMDQ0CitmIDQ2LzE1MTYvMTA0MyAxNDAvMTUxNy8xMDQzIDEzOC8xNDg5LzEwNDMKK2YgMTM4LzE0ODkvMTA0MyAxMjUvMTQ4OC8xMDQzIDQ2LzE1MTYvMTA0MworZiAzNTMvMTUxOC8xMDQ0IDM1NC8xNTE5LzEwNDQgMTQyLzE1MjAvMTA0NAorZiAxNDIvMTUyMC8xMDQ0IDQ3LzE1MjEvMTA0NCAzNTMvMTUxOC8xMDQ0CitmIDI1NC8xNTIyLzExNzIgMjU1LzE1MjMvMTE3MiAxNDQvMTUyNC8xMTcyCitmIDE0NC8xNTI0LzExNzIgNDgvMTUyNS8xMTcyIDI1NC8xNTIyLzExNzIKK2YgNDgvMTUyNS8xMTcyIDE0NC8xNTI0LzExNzIgMTMzLzE1MDEvMTE3MgorZiAxMzMvMTUwMS8xMTcyIDEyMS8xNTAwLzExNzIgNDgvMTUyNS8xMTcyCitmIDE0LzE1MjYvMTE3OCAyMy8xNTI3LzExNzggMjIvMTUyOC8xMTc4CitmIDIyLzE1MjgvMTE3OSAxMy8xNTI5LzExNzkgMTQvMTUyNi8xMTc5CitmIDE1LzE1MzAvMTE4MCAyNC8xNTMxLzExODAgMjMvMTUyNy8xMTgwCitmIDIzLzE1MjcvMTE4MSAxNC8xNTI2LzExODEgMTUvMTUzMC8xMTgxCitmIDE3LzE1MzIvMTE4MiAyNS8xNTMzLzExODIgMjQvMTUzMS8xMTgyCitmIDI0LzE1MzEvMTE4MiAxNS8xNTMwLzExODIgMTcvMTUzMi8xMTgyCitmIDM4Ny8xNTM0LzExODMgOTU4LzE1MzUvMTE4MyA5NTMvMTUzNi8xMTgzCitmIDk1My8xNTM2LzExODIgMzgyLzE1MzcvMTE4MiAzODcvMTUzNC8xMTgyCitmIDM0OC8xNTM4LzExODQgMzQ2LzE1MzkvMTE4NCAyNy8xNTQwLzExODQKK2YgMjcvMTU0MC8xMTg0IDE5LzE1NDEvMTE4NCAzNDgvMTUzOC8xMTg0CitmIDE4LzE1NDIvMTE4NCA2LzE1NDMvMTE4NCAyOS8xNTQ0LzExODQKK2YgMjkvMTU0NC8xMTg0IDI4LzE1NDUvMTE4NCAxOC8xNTQyLzExODQKK2YgNi8xNTQzLzExODUgNy8xNTQ2LzExODUgMzAvMTU0Ny8xMTg1CitmIDMwLzE1NDcvMTE4NiAyOS8xNTQ0LzExODYgNi8xNTQzLzExODYKK2YgOC8xNTQ4LzExODcgMzEvMTU0OS8xMTg3IDMwLzE1NDcvMTE4NworZiAzMC8xNTQ3LzExODggNy8xNTQ2LzExODggOC8xNTQ4LzExODgKK2YgOS8xNTUwLzExODkgMzIvMTU1MS8xMTg5IDE1MzIvMTU1Mi8xMTg5CitmIDE1MzMvMTU1My8xMTkwIDE1MzQvMTU1NC8xMTkwIDkvMTU1NS8xMTkwCitmIDEwLzE1NTYvMTE5MSAzMy8xNTU3LzExOTEgMzIvMTU1MS8xMTkxCitmIDMyLzE1NTEvMTE5MiA5LzE1NTAvMTE5MiAxMC8xNTU2LzExOTIKK2YgMjEvMTU1OC8xMTkzIDM0LzE1NTkvMTE5MyAzMy8xNTU3LzExOTMKK2YgMzMvMTU1Ny8xMTkzIDEwLzE1NTYvMTE5MyAyMS8xNTU4LzExOTMKK2YgMjQ5LzE1NjAvMTE5MyAyNDUvMTU2MS8xMTkzIDM0LzE1NTkvMTE5MworZiAzNC8xNTU5LzExOTMgMjEvMTU1OC8xMTkzIDI0OS8xNTYwLzExOTMKK2YgMjAvMTU2Mi8xMTk0IDExLzE1NjMvMTE5NCAzNi8xNTY0LzExOTQKK2YgMzYvMTU2NC8xMTkzIDM1LzE1NjUvMTE5MyAyMC8xNTYyLzExOTMKK2YgMTEvMTU2My8xMTk1IDEyLzE1NjYvMTE5NSAzNy8xNTY3LzExOTUKK2YgMzcvMTU2Ny8xMTk2IDM2LzE1NjQvMTE5NiAxMS8xNTYzLzExOTYKK2YgMTUzNS8xNTY4LzExOTcgMTUzNi8xNTY5LzExOTcgMzcvMTU3MC8xMTk3CitmIDM3LzE1NjcvMTE5OCAxMi8xNTY2LzExOTggMTUzNy8xNTcxLzExOTgKK2YgNjUvMTU3Mi82OTcgMTUzOC8xNTczLzY5NyAxNTM5LzE1NzQvNjk3CitmIDE1NDAvMTU3NS82OTcgNjYvMTU3Ni82OTcgNjUvMTU3Ny82OTcKK2YgMTU0MS8xNTc4LzY5NyAxNTQyLzE1NzkvNjk3IDE1NDMvMTU4MC82OTcKK2YgMTU0NC8xNTgxLzY5NyA2Ny8xNTgyLzY5NyAxNTQ1LzE1ODMvNjk3CitmIDY3LzE1ODQvNjk3IDE1NDYvMTU4NS82OTcgMTU0Ny8xNTg2LzY5NworZiAxNTQ4LzE1ODcvNjk3IDY4LzE1ODgvNjk3IDY3LzE1ODkvNjk3CitmIDQwOS8xNTkwLzY5NyA5NzAvMTU5MS82OTcgOTc2LzE1OTIvNjk3CitmIDk3Ni8xNTkyLzY5NyA0MDYvMTU5My82OTcgNDA5LzE1OTAvNjk3CitmIDcwLzE1OTQvNjk3IDE1NDkvMTU5NS82OTcgMTU1MC8xNTk2LzY5NworZiAxNTUxLzE1OTcvNjk3IDM1MS8xNTk4LzY5NyA3MC8xNTk5LzY5NworZiAxNTUyLzE2MDAvNjk3IDE1NTMvMTYwMS82OTcgNzIvMTYwMi82OTcKK2YgNzIvMTYwMy82OTcgNzEvMTYwNC82OTcgMTU1NC8xNjA1LzY5NworZiA3Mi8xNjA2LzY5NyAxNTU1LzE2MDcvNjk3IDE1NTYvMTYwOC82OTcKK2YgMTU1Ny8xNjA5LzY5NyA3My8xNjEwLzY5NyA3Mi8xNjAzLzY5NworZiAxNTU4LzE2MTEvNjk3IDE1NTkvMTYxMi82OTcgMTU2MC8xNjEzLzY5NworZiAxNTYxLzE2MTQvNjk3IDc0LzE2MTUvNjk3IDE1NjIvMTYxNi82OTcKK2YgNzQvMTYxNy82OTcgMTU2My8xNjE4LzY5NyAxNTY0LzE2MTkvNjk3CitmIDE1NjUvMTYyMC82OTcgNzUvMTYyMS82OTcgNzQvMTYyMi82OTcKK2YgNzUvMTYyMy82OTcgMTU2Ni8xNjI0LzY5NyAxNTY3LzE2MjUvNjk3CitmIDE1NjgvMTYyNi82OTcgNzYvMTYyNy82OTcgNzUvMTYyMS82OTcKK2YgNzYvMTYyOC82OTcgMTU2OS8xNjI5LzY5NyAxNTcwLzE2MzAvNjk3CitmIDE1NzEvMTYzMS82OTcgNzcvMTYzMi82OTcgNzYvMTYyNy82OTcKK2YgNzcvMTYzMy82OTcgMTU3Mi8xNjM0LzY5NyAxNTczLzE2MzUvNjk3CitmIDE1NzQvMTYzNi82OTcgMjUyLzE2MzcvNjk3IDc3LzE2MzIvNjk3CitmIDE1NzUvMTYzOC82OTcgMTU3Ni8xNjM5LzY5NyA3OS8xNjQwLzY5NworZiA3OS8xNjQxLzY5NyA3OC8xNjQyLzY5NyAxNTc3LzE2NDMvNjk3CitmIDc5LzE2NDQvNjk3IDE1NzgvMTY0NS82OTcgMTU3OS8xNjQ2LzY5NworZiAxNTgwLzE2NDcvNjk3IDgwLzE2NDgvNjk3IDc5LzE2NDEvNjk3CitmIDgwLzE2NDkvNjk3IDE1ODEvMTY1MC82OTcgMTU4Mi8xNjUxLzY5NworZiAxNTgzLzE2NTIvNjk3IDY1LzE1NzcvNjk3IDgwLzE2NDgvNjk3CitmIDE0LzE1MjYvMTE2OCAxMy8xNTI5LzExNjggNTYvMTY1My8xMTY4CitmIDU2LzE2NTMvMTE2OCA1Ny8xNjU0LzExNjggMTQvMTUyNi8xMTY4CitmIDE1LzE1MzAvMTE2OSAxNC8xNTI2LzExNjkgNTcvMTY1NC8xMTY5CitmIDU3LzE2NTQvMTE2OSA1OC8xNjU1LzExNjkgMTUvMTUzMC8xMTY5CitmIDE1ODQvMTU3MS8xMTcwIDEyLzE1NjYvMTE3MCA1NS8xNjU2LzExNzAKK2YgNTUvMTY1Ny8xMTcwIDE1ODUvMTY1OC8xMTcwIDE1ODYvMTY1OS8xMTcwCitmIDEyLzE1NjYvMTE3MSAxMS8xNTYzLzExNzEgNTQvMTY2MC8xMTcxCitmIDU0LzE2NjAvMTE3MSA1NS8xNjU2LzExNzEgMTIvMTU2Ni8xMTcxCitmIDExLzE1NjMvMTE3MiAyMC8xNTYyLzExNzIgNjMvMTY2MS8xMTcyCitmIDYzLzE2NjEvMTE3MiA1NC8xNjYwLzExNzIgMTEvMTU2My8xMTcyCitmIDEwLzE1NTYvMTE3MyA5LzE1NTAvMTE3MyA1Mi8xNjYyLzExNzMKK2YgNTIvMTY2Mi8xMTczIDUzLzE2NjMvMTE3MyAxMC8xNTU2LzExNzMKK2YgOS8xNTUwLzExNzQgMTU4Ny8xNjY0LzExNzQgNTEvMTY2NS8xMTc0CitmIDUxLzE2NjUvMTE3NCA1Mi8xNjYyLzExNzQgOS8xNTUwLzExNzQKK2YgOC8xNTQ4LzExNzUgNy8xNTQ2LzExNzUgNTAvMTY2Ni8xMTc1CitmIDUwLzE2NjYvMTE3NSAxNTg4LzE2NjcvMTE3NSA4LzE1NDgvMTE3NQorZiA3LzE1NDYvMTE3NyA2LzE1NDMvMTE3NyA0OS8xNjY4LzExNzcKK2YgNDkvMTY2OC8xMTc3IDUwLzE2NjYvMTE3NyA3LzE1NDYvMTE3NworZiA2LzE1NDMvMTA0NCAxOC8xNTQyLzEwNDQgNjEvMTY2OS8xMDQ0CitmIDYxLzE2NjkvMTA0NCA0OS8xNjY4LzEwNDQgNi8xNTQzLzEwNDQKK2YgMTYvMTY3MC8xMDQzIDM3MC8xNjcxLzEwNDMgMzczLzE2NzIvMTA0MworZiAzNzMvMTY3Mi8xMDQzIDU5LzE2NzMvMTA0MyAxNi8xNjcwLzEwNDMKK2YgMTcvMTUzMi8xMDQzIDE1LzE1MzAvMTA0MyA1OC8xNjU1LzEwNDMKK2YgNTgvMTY1NS8xMDQzIDYwLzE2NzQvMTA0MyAxNy8xNTMyLzEwNDMKK2YgMzE4LzE2NzUvMTA0NCAzMTkvMTY3Ni8xMDQ0IDMyMS8xNjc3LzEwNDQKK2YgMzIxLzE2NzcvMTA0NCAzMjAvMTY3OC8xMDQ0IDMxOC8xNjc1LzEwNDQKK2YgMjAvMTU2Mi8xMTcyIDE3MS8xNjc5LzExNzIgMTczLzE2ODAvMTE3MgorZiAxNzMvMTY4MC8xMTcyIDYzLzE2NjEvMTE3MiAyMC8xNTYyLzExNzIKK2YgMjEvMTU1OC8xMTcyIDEwLzE1NTYvMTE3MiA1My8xNjYzLzExNzIKK2YgNTMvMTY2My8xMTcyIDY0LzE2ODEvMTE3MiAyMS8xNTU4LzExNzIKK2YgODIvMTY4Mi8xMTk5IDgxLzE2ODMvMTE5OSA2NS8xNTc3LzExOTkKK2YgNjUvMTU3Ny8xMjAwIDY2LzE1NzYvMTIwMCA4Mi8xNjgyLzEyMDAKK2YgODMvMTY4NC8xMjAxIDE1ODkvMTY4NS8xMjAxIDE1OTAvMTY4Ni8xMjAxCitmIDE1OTEvMTY4Ny8xMjAyIDY3LzE1ODkvMTIwMiA4My8xNjg4LzEyMDIKK2YgNjgvMTU4OC8xMjAzIDg0LzE2ODkvMTIwMyA4My8xNjg4LzEyMDMKK2YgODMvMTY4OC8xMjAzIDY3LzE1ODkvMTIwMyA2OC8xNTg4LzEyMDMKK2YgODUvMTY5MC8xMjAzIDM3NS8xNjkxLzEyMDMgMzc0LzE2OTIvMTIwMworZiAzNzQvMTY5Mi8xMjAzIDY5LzE2OTMvMTIwMyA4NS8xNjkwLzEyMDMKK2YgMzI0LzE2OTQvMTIwNCAzMjUvMTY5NS8xMjA0IDMyMy8xNjk2LzEyMDQKK2YgMzIzLzE2OTYvMTIwNCAzMjIvMTY5Ny8xMjA0IDMyNC8xNjk0LzEyMDQKK2YgODgvMTY5OC8xMjA1IDg3LzE2OTkvMTIwNSA3MS8xNjA0LzEyMDUKK2YgNzEvMTYwNC8xMjA1IDcyLzE2MDMvMTIwNSA4OC8xNjk4LzEyMDUKK2YgODkvMTcwMC8xMjA2IDg4LzE2OTgvMTIwNiA3Mi8xNjAzLzEyMDYKK2YgNzIvMTYwMy8xMjA3IDczLzE2MTAvMTIwNyA4OS8xNzAwLzEyMDcKK2YgOTAvMTcwMS8xMjA4IDE1OTIvMTcwMi8xMjA4IDE1OTMvMTcwMy8xMjA4CitmIDE1OTQvMTcwNC8xMjA5IDc0LzE2MjIvMTIwOSA5MC8xNzA1LzEyMDkKK2YgOTEvMTcwNi8xMjEwIDkwLzE3MDUvMTIxMCA3NC8xNjIyLzEyMTAKK2YgNzQvMTYyMi8xMjExIDc1LzE2MjEvMTIxMSA5MS8xNzA2LzEyMTEKK2YgOTIvMTcwNy8xMjEyIDkxLzE3MDYvMTIxMiA3NS8xNjIxLzEyMTIKK2YgNzUvMTYyMS8xMjEzIDc2LzE2MjcvMTIxMyA5Mi8xNzA3LzEyMTMKK2YgNzcvMTYzMi8xMjE0IDkzLzE3MDgvMTIxNCA5Mi8xNzA3LzEyMTQKK2YgOTIvMTcwNy8xMjE0IDc2LzE2MjcvMTIxNCA3Ny8xNjMyLzEyMTQKK2YgOTQvMTcwOS8xMjE0IDE3NS8xNzEwLzEyMTQgMTc0LzE3MTEvMTIxNAorZiAxNzQvMTcxMS8xMjE0IDc4LzE2NDIvMTIxNCA5NC8xNzA5LzEyMTQKK2YgOTUvMTcxMi8xMjE0IDk0LzE3MDkvMTIxNCA3OC8xNjQyLzEyMTQKK2YgNzgvMTY0Mi8xMjE1IDc5LzE2NDEvMTIxNSA5NS8xNzEyLzEyMTUKK2YgOTYvMTcxMy8xMjE2IDk1LzE3MTIvMTIxNiA3OS8xNjQxLzEyMTYKK2YgNzkvMTY0MS8xMjE3IDgwLzE2NDgvMTIxNyA5Ni8xNzEzLzEyMTcKK2YgODEvMTY4My8xMjE4IDk2LzE3MTMvMTIxOCA4MC8xNjQ4LzEyMTgKK2YgODAvMTY0OC8xMjE5IDY1LzE1NzcvMTIxOSA4MS8xNjgzLzEyMTkKK2YgNDMvMTcxNC82ODcgMTM3NS8xNzE1LzY4NyAxMzc0LzE3MTYvNjg3CitmIDEzNzQvMTcxNi82ODcgNDQvMTcxNy82ODcgNDMvMTcxNC82ODcKK2YgNDIvMTcxOC82ODcgMTM3Ni8xNzE5LzY4NyAxNTk1LzE3MjAvNjg3CitmIDE1OTYvMTcyMS82ODcgMTU5Ny8xNzIyLzY4NyA0Mi8xNzIzLzY4NworZiAyLzE3MjQvNjg3IDEzNzcvMTcyNS82ODcgMTM3Ni8xNzE5LzY4NworZiAxMzc2LzE3MTkvNjg3IDQyLzE3MTgvNjg3IDIvMTcyNC82ODcKK2YgMTE3LzE3MjYvNjg3IDEzNzgvMTcyNy82ODcgMTM3Ny8xNzI1LzY4NworZiAxMzc3LzE3MjUvNjg3IDIvMTcyNC82ODcgMTE3LzE3MjYvNjg3CitmIDE3Mi8xNzI4LzY4NyAxMzkxLzE3MjkvNjg3IDEzNzgvMTcyNy82ODcKK2YgMTM3OC8xNzI3LzY4NyAxMTcvMTcyNi82ODcgMTcyLzE3MjgvNjg3CitmIDQxLzE3MzAvNjg3IDEzODAvMTczMS82ODcgMTM3OS8xNzMyLzY4NworZiAxMzc5LzE3MzIvNjg3IDEyOC8xNzMzLzY4NyA0MS8xNzMwLzY4NworZiA0MC8xNzM0LzY4NyAxMzgxLzE3MzUvNjg3IDEzODAvMTczMS82ODcKK2YgMTM4MC8xNzMxLzY4NyA0MS8xNzMwLzY4NyA0MC8xNzM0LzY4NworZiAzOS8xNzM2LzY4NyAxMzgyLzE3MzcvNjg3IDEzODEvMTczNS82ODcKK2YgMTM4MS8xNzM1LzY4NyA0MC8xNzM0LzY4NyAzOS8xNzM2LzY4NworZiAzOC8xNzM4LzY4NyAxMzgzLzE3MzkvNjg3IDE1OTgvMTc0MC82ODcKK2YgMTU5OS8xNzQxLzY4NyAxNjAwLzE3NDIvNjg3IDM4LzE3NDMvNjg3CitmIDEvMTc0NC82ODcgMTM4NC8xNzQ1LzY4NyAxMzgzLzE3MzkvNjg3CitmIDEvMTc0NC82ODcgMTM4My8xNzM5LzY4NyAzOC8xNzM4LzY4NworZiAxMTYvMTc0Ni82ODcgMTM4NS8xNzQ3LzY4NyAxMzg0LzE3NDUvNjg3CitmIDEzODQvMTc0NS82ODcgMS8xNzQ0LzY4NyAxMTYvMTc0Ni82ODcKK2YgMTM5OS8xNzQ4LzY4NyAxMzk1LzE3NDkvNjg3IDI5NC8xNzUwLzY4NworZiAyOTQvMTc1MC82ODcgMzA5LzE3NTEvNjg3IDEzOTkvMTc0OC82ODcKK2YgMzcyLzE3NTIvNjg3IDE0MDIvMTc1My82ODcgMTM4Ny8xNzU0LzY4NworZiAxMzg3LzE3NTQvNjg3IDExNS8xNzU1LzY4NyAzNzIvMTc1Mi82ODcKK2YgNDUvMTc1Ni82ODcgMTM4OS8xNzU3LzY4NyAxMzg4LzE3NTgvNjg3CitmIDEzODgvMTc1OC82ODcgMTI2LzE3NTkvNjg3IDQ1LzE3NTYvNjg3CitmIDQ0LzE3MTcvNjg3IDEzNzQvMTcxNi82ODcgMTM4OS8xNzU3LzY4NworZiAxMzg5LzE3NTcvNjg3IDQ1LzE3NTYvNjg3IDQ0LzE3MTcvNjg3CitmIDE2MDEvMTc2MC8xMjIwIDE2MDIvMTc2MS8xMjIwIDE2MDMvMTc2Mi8xMjIwCitmIDE2MDQvMTc2My8xMjIxIDE2MDUvMTc2NC8xMjIxIDE2MDYvMTc2NS8xMjIxCitmIDE2MDcvMTc2Ni8xMjIyIDE2MDgvMTc2Ny8xMjIyIDE2MDkvMTc2OC8xMjIyCitmIDE2MTAvMTc2OS8xMjIzIDE2MTEvMTc3MC8xMjIzIDE2MTIvMTc3MS8xMjIzCitmIDE2MTMvMTc3Mi8xMjI0IDE2MTQvMTc3My8xMjI0IDE2MTUvMTc3NC8xMjI0CitmIDE2MTYvMTc3NS8xMjI1IDE2MTcvMTc3Ni8xMjI1IDE2MTgvMTc3Ny8xMjI1CitmIDE2MTkvMTc3OC8xMjI2IDE2MjAvMTc3OS8xMjI2IDE2MjEvMTc4MC8xMjI2CitmIDE2MjIvMTc4MS8xMjI3IDE2MjMvMTc4Mi8xMjI3IDE2MjQvMTc4My8xMjI3CitmIDE2MjUvMTc4NC8xMjI4IDExNC8xNDk3LzEyMjggNS8xNDk5LzEyMjgKK2YgNS8xNzg1LzEyMjkgMTYyNi8xNzg2LzEyMjkgMTYyNy8xNzg3LzEyMjkKK2YgMTYyOC8xNzg4LzEyMzAgMTYyOS8xNzg5LzEyMzAgMTYzMC8xNzkwLzEyMzAKK2YgMTYzMS8xNzkxLzEyMzEgMTYzMi8xNzkyLzEyMzEgMTYzMy8xNzkzLzEyMzEKK2YgNDAvMTc5NC8xMjMyIDE2MzQvMTc5NS8xMjMyIDE2MzUvMTc5Ni8xMjMyCitmIDE2MzYvMTc5Ny8xMjMzIDM5LzE3MzYvMTIzMyA0MC8xNzM0LzEyMzMKK2YgMTYzNy8xNzk4LzEyMzQgMTYzOC8xNzk5LzEyMzQgMTYzOS8xODAwLzEyMzQKK2YgMTY0MC8xODAxLzEyMzUgMzgvMTgwMi8xMjM1IDE2NDEvMTgwMy8xMjM1CitmIDE2NDIvMTgwNC8xMjM2IDE2NDMvMTgwNS8xMjM2IDE2NDQvMTgwNi8xMjM2CitmIDE2NDUvMTgwNy8xMjM3IDE2NDYvMTgwOC8xMjM3IDE2NDcvMTgwOS8xMjM3CitmIDEvMTgxMC8xMjM4IDE2NDgvMTgxMS8xMjM4IDE2NDkvMTgxMi8xMjM4CitmIDEvMTgxMy8xMjM4IDE2NTAvMTgxNC8xMjM4IDExNi8xODE1LzEyMzgKK2YgMy8xODE2LzEyMzkgMzc3LzE4MTcvMTIzOSAxNjUxLzE4MTgvMTIzOQorZiAxNjUyLzE4MTkvMTIzOSAxNjUzLzE4MjAvMTIzOSAzLzE4MjEvMTIzOQorZiAxNjU0LzE4MjIvMTIzOSA0Ni8xODIzLzEyMzkgMTI1LzE4MjQvMTIzOQorZiAxMjUvMTgyNS8xMjM5IDE2NTUvMTgyNi8xMjM5IDE2NTYvMTgyNy8xMjM5CitmIDMwOS8xODI4LzEyMzggMjk0LzE4MjkvMTIzOCAyOTgvMTgzMC8xMjM4CitmIDI5OC8xODMwLzEyMzggMzA4LzE4MzEvMTIzOCAzMDkvMTgyOC8xMjM4CitmIDE2NTcvMTgzMi8xMjQwIDE3Ni8xODMzLzEyNDAgMTcyLzE4MzQvMTI0MAorZiAxNzIvMTgzNS8xMjI5IDExNy8xODM2LzEyMjkgMTY1OC8xODM3LzEyMjkKK2YgMTI4LzE4MzgvMTI0MSAxNjU5LzE4MzkvMTI0MSAxNjYwLzE4NDAvMTI0MQorZiAxNjYxLzE4NDEvMTI0MSA0MS8xNzMwLzEyNDEgMTI4LzE3MzMvMTI0MQorZiAxODkvMTg0Mi8xMTY4IDE4OC8xODQzLzExNjggMTM2LzE0ODYvMTE2OAorZiAxMzYvMTQ4Ni8xMTY4IDEzNy8xNDg1LzExNjggMTg5LzE4NDIvMTE2OAorZiAxOTAvMTg0NC8xMTY5IDE4OS8xODQyLzExNjkgMTM3LzE0ODUvMTE2OQorZiAxMzcvMTQ4NS8xMTY5IDEzOC8xNDg5LzExNjkgMTkwLzE4NDQvMTE2OQorZiAxNjYyLzE4NDUvMTE3MCAxODcvMTg0Ni8xMTcwIDEzNS8xNDkzLzExNzAKK2YgMTM1LzE4NDcvMTE3MCAxNjYzLzE4NDgvMTE3MCAxNjY0LzE4NDkvMTE3MAorZiAxODcvMTg0Ni8xMTcxIDE4Ni8xODUwLzExNzEgMTM0LzE0OTYvMTE3MQorZiAxMzQvMTQ5Ni8xMTcxIDEzNS8xNDkzLzExNzEgMTg3LzE4NDYvMTE3MQorZiAxODYvMTg1MC8xMTcyIDE5NS8xODUxLzExNzIgMTQzLzE0OTgvMTE3MgorZiAxNDMvMTQ5OC8xMTcyIDEzNC8xNDk2LzExNzIgMTg2LzE4NTAvMTE3MgorZiAxODUvMTg1Mi8xMTczIDE4NC8xODUzLzExNzMgMTMyLzE1MDIvMTE3MworZiAxMzIvMTUwMi8xMTczIDEzMy8xNTAxLzExNzMgMTg1LzE4NTIvMTE3MworZiAxODQvMTg1My8xMTc0IDE4My8xODU0LzExNzQgMTMxLzE1MDQvMTE3NAorZiAxMzEvMTUwNC8xMTc0IDEzMi8xNTAyLzExNzQgMTg0LzE4NTMvMTE3NAorZiAxNjY1LzE4NTUvMTE3NSAxODIvMTg1Ni8xMTc1IDEzMC8xNTA5LzExNzUKK2YgMTMwLzE4NTcvMTE3NSAxNjY2LzE4NTgvMTE3NSAxNjY3LzE4NTkvMTE3NQorZiAxODIvMTg1Ni8xMTc2IDE4MS8xODYwLzExNzYgMTI5LzE1MTIvMTE3NgorZiAxMjkvMTUxMi8xMTc2IDEzMC8xNTA5LzExNzYgMTgyLzE4NTYvMTE3NgorZiAxODEvMTg2MC8xMDQ0IDE5My8xODYxLzEwNDQgMTQxLzE1MTQvMTA0NAorZiAxNDEvMTUxNC8xMDQ0IDEyOS8xNTEyLzEwNDQgMTgxLzE4NjAvMTA0NAorZiAxOTEvMTg2Mi8xMDQzIDM4MC8xODYzLzEwNDMgMzc4LzE4NjQvMTA0MworZiAzNzgvMTg2NC8xMDQzIDEzOS8xODY1LzEwNDMgMTkxLzE4NjIvMTA0MworZiAxOTIvMTg2Ni8xMDQzIDE5MC8xODQ0LzEwNDMgMTM4LzE0ODkvMTA0MworZiAxMzgvMTQ4OS8xMDQzIDE0MC8xNTE3LzEwNDMgMTkyLzE4NjYvMTA0MworZiAzMDYvMTg2Ny8xMDQ0IDMwNy8xODY4LzEwNDQgMjk5LzE4NjkvMTA0NAorZiAyOTkvMTg2OS8xMDQ0IDMwMC8xODcwLzEwNDQgMzA2LzE4NjcvMTA0NAorZiAxOTUvMTg1MS8xMTcyIDE5OC8xODcxLzExNzIgMTc3LzE4NzIvMTE3MgorZiAxNzcvMTg3Mi8xMTcyIDE0My8xNDk4LzExNzIgMTk1LzE4NTEvMTE3MgorZiAxOTYvMTg3My8xMTcyIDE4NS8xODUyLzExNzIgMTMzLzE1MDEvMTE3MgorZiAxMzMvMTUwMS8xMTcyIDE0NC8xNTI0LzExNzIgMTk2LzE4NzMvMTE3MgorZiAyMDcvMTg3NC8xMTY4IDIwNi8xODc1LzExNjggMTUyLzE4NzYvMTE2OAorZiAxNTIvMTg3Ni8xMTY4IDE1My8xODc3LzExNjggMjA3LzE4NzQvMTE2OAorZiAyMDgvMTg3OC8xMTY5IDIwNy8xODc0LzExNjkgMTUzLzE4NzcvMTE2OQorZiAxNTMvMTg3Ny8xMTY5IDE1NC8xODc5LzExNjkgMjA4LzE4NzgvMTE2OQorZiAxNjY4LzE4ODAvMTE3MCAyMDUvMTg4MS8xMTcwIDE1MS8xODgyLzExNzAKK2YgMTUxLzE4ODMvMTE3MCAxNjY5LzE4ODQvMTE3MCAxNjcwLzE4ODUvMTE3MAorZiAyMDUvMTg4MS8xMTcxIDIwNC8xODg2LzExNzEgMTUwLzE4ODcvMTE3MQorZiAxNTAvMTg4Ny8xMTcxIDE1MS8xODgyLzExNzEgMjA1LzE4ODEvMTE3MQorZiAyMDQvMTg4Ni8xMTcyIDIxMy8xODg4LzExNzIgMTU5LzE4ODkvMTE3MgorZiAxNTkvMTg4OS8xMTcyIDE1MC8xODg3LzExNzIgMjA0LzE4ODYvMTE3MgorZiAyMDMvMTg5MC8xMTczIDIwMi8xODkxLzExNzMgMTQ4LzE4OTIvMTE3MworZiAxNDgvMTg5Mi8xMTczIDE0OS8xODkzLzExNzMgMjAzLzE4OTAvMTE3MworZiAyMDIvMTg5MS8xMTc0IDIwMS8xODk0LzExNzQgMTQ3LzE4OTUvMTE3NAorZiAxNDcvMTg5NS8xMTc0IDE0OC8xODkyLzExNzQgMjAyLzE4OTEvMTE3NAorZiAxNjcxLzE4OTYvMTE3NSAyMDAvMTg5Ny8xMTc1IDE0Ni8xODk4LzExNzUKK2YgMTQ2LzE4OTkvMTE3NSAxNjcyLzE5MDAvMTE3NSAxNjczLzE5MDEvMTE3NQorZiAyMDAvMTg5Ny8xMTc2IDE5OS8xOTAyLzExNzYgMTQ1LzE5MDMvMTE3NgorZiAxNDUvMTkwMy8xMTc3IDE0Ni8xODk4LzExNzcgMjAwLzE4OTcvMTE3NworZiAxOTkvMTkwMi8xMDQ0IDIxMS8xOTA0LzEwNDQgMTU3LzE5MDUvMTA0NAorZiAxNTcvMTkwNS8xMDQ0IDE0NS8xOTAzLzEwNDQgMTk5LzE5MDIvMTA0NAorZiAyMDkvMTkwNi8xMDQzIDM4MS8xOTA3LzEwNDMgMzc5LzE5MDgvMTA0MworZiAzNzkvMTkwOC8xMDQzIDE1NS8xOTA5LzEwNDMgMjA5LzE5MDYvMTA0MworZiAyMTAvMTkxMC8xMDQzIDIwOC8xODc4LzEwNDMgMTU0LzE4NzkvMTA0MworZiAxNTQvMTg3OS8xMDQzIDE1Ni8xOTExLzEwNDMgMjEwLzE5MTAvMTA0MworZiAyMTMvMTg4OC8xMTcyIDIxNi8xOTEyLzExNzIgMTc4LzE5MTMvMTE3MgorZiAxNzgvMTkxMy8xMTcyIDE1OS8xODg5LzExNzIgMjEzLzE4ODgvMTE3MgorZiAyMTQvMTkxNC8xMTcyIDIwMy8xODkwLzExNzIgMTQ5LzE4OTMvMTE3MgorZiAxNDkvMTg5My8xMTcyIDE2MC8xOTE1LzExNzIgMjE0LzE5MTQvMTE3MgorZiAxNTExLzE5MTYvMTE3MiAxNTEzLzE5MTcvMTE3MiAxNjMvMTkxOC8xMTcyCitmIDE2My8xOTE4LzExNzIgMTYxLzE5MTkvMTE3MiAxNTExLzE5MTYvMTE3MgorZiAxNTE0LzE5MjAvMTIxNCAxNTE3LzE5MjEvMTIxNCAxNjQvMTkyMi8xMjE0CitmIDE2NC8xOTIyLzEyMTQgMTY1LzE5MjMvMTIxNCAxNTE0LzE5MjAvMTIxNAorZiAxNTE2LzE5MjQvNjg3IDE1MjUvMTkyNS82ODcgMTM5MC8xOTI2LzY4NworZiAxMzkwLzE5MjYvNjg3IDE2Mi8xOTI3LzY4NyAxNTE2LzE5MjQvNjg3CitmIDE1MTgvMTkyOC8xMjI5IDE1MTYvMTkyNC8xMjI5IDE2Mi8xOTI3LzEyMjkKK2YgMTYyLzE5MjkvMTI0MCAxNjYvMTkzMC8xMjQwIDE1MTgvMTkzMS8xMjQwCitmIDE1MjAvMTkzMi8xMTcyIDE1MTUvMTkzMy8xMTcyIDE5Ny8xOTM0LzExNzIKK2YgMTk3LzE5MzQvMTE3MiAxNjgvMTkzNS8xMTcyIDE1MjAvMTkzMi8xMTcyCitmIDE1MTMvMTkxNy8xMTcyIDE1MjIvMTkzNi8xMTcyIDIxNS8xOTM3LzExNzIKK2YgMjE1LzE5MzcvMTE3MiAxNjMvMTkxOC8xMTcyIDE1MTMvMTkxNy8xMTcyCitmIDE2NzQvMTkzOC8xMTcyIDE3Ny8xODcyLzExNzIgMTY3LzE5MzkvMTE3MgorZiAxNjcvMTk0MC8xMTcyIDE2NzUvMTk0MS8xMTcyIDE2NzYvMTk0Mi8xMTcyCitmIDE3MS8xNjc5LzExOTMgMTc5LzE5NDMvMTE5MyAxNjkvMTk0NC8xMTkzCitmIDE2OS8xOTQ0LzExOTMgMTYxLzE5MTkvMTE5MyAxNzEvMTY3OS8xMTkzCitmIDE2NC8xOTQ1LzY5NyAxNjc3LzE5NDYvNjk3IDE2NzgvMTk0Ny82OTcKK2YgMTY3OS8xOTQ4LzY5NyAxNzQvMTcxMS82OTcgMTY0LzE5MjIvNjk3CitmIDE2MS8xOTE5LzExNzIgMTYzLzE5MTgvMTE3MiAxNzMvMTY4MC8xMTcyCitmIDE3My8xNjgwLzExNzIgMTcxLzE2NzkvMTE3MiAxNjEvMTkxOS8xMTcyCitmIDE2NS8xOTIzLzEyMTQgMTY0LzE5MjIvMTIxNCAxNzQvMTcxMS8xMjE0CitmIDE3NC8xNzExLzEyMTQgMTc1LzE3MTAvMTIxNCAxNjUvMTkyMy8xMjE0CitmIDE2Mi8xOTI3LzY4NyAxMzkwLzE5MjYvNjg3IDEzOTEvMTcyOS82ODcKK2YgMTM5MS8xNzI5LzY4NyAxNzIvMTcyOC82ODcgMTYyLzE5MjcvNjg3CitmIDE2Ni8xOTMwLzEyMjkgMTYyLzE5MjkvMTIyOSAxNzIvMTgzNC8xMjI5CitmIDE3Mi8xODM0LzEyMjkgMTc2LzE4MzMvMTIyOSAxNjYvMTkzMC8xMjI5CitmIDE2OC8xOTM1LzExNzIgMTk3LzE5MzQvMTE3MiAxOTgvMTg3MS8xMTcyCitmIDE5OC8xODcxLzExNzIgMTc4LzE5MTMvMTE3MiAxNjgvMTkzNS8xMTcyCitmIDE2My8xOTE4LzExNzIgMjE1LzE5MzcvMTE3MiAyMTYvMTkxMi8xMTcyCitmIDIxNi8xOTEyLzExNzIgMTczLzE2ODAvMTE3MiAxNjMvMTkxOC8xMTcyCitmIDUvMTQ5OS8xMTcyIDE0My8xNDk4LzExNzIgMTc3LzE4NzIvMTE3MgorZiAxNzcvMTg3Mi8xMTcyIDE2ODAvMTkzOC8xMTcyIDUvMTQ5OS8xMTcyCitmIDIwLzE1NjIvMTE5MyAzNS8xNTY1LzExOTMgMTc5LzE5NDMvMTE5MworZiAxNzkvMTk0My8xMTkzIDE3MS8xNjc5LzExOTMgMjAvMTU2Mi8xMTkzCitmIDE2ODEvMTk0OS82OTcgMTY4Mi8xOTUwLzY5NyA3OC8xOTUxLzY5NworZiA3OC8xNjQyLzY5NyAxNzQvMTcxMS82OTcgMTY4My8xOTQ4LzY5NworZiAxNTMvMTg3Ny8xMTY4IDE1Mi8xODc2LzExNjggMTg4LzE4NDMvMTE2OAorZiAxODgvMTg0My8xMTY4IDE4OS8xODQyLzExNjggMTUzLzE4NzcvMTE2OAorZiAxNTQvMTg3OS8xMTY5IDE1My8xODc3LzExNjkgMTg5LzE4NDIvMTE2OQorZiAxODkvMTg0Mi8xMTY5IDE5MC8xODQ0LzExNjkgMTU0LzE4NzkvMTE2OQorZiAxNjg0LzE5NTIvMTE3MCAxNTEvMTg4Mi8xMTcwIDE4Ny8xODQ2LzExNzAKK2YgMTg3LzE5NTMvMTE3MCAxNjg1LzE5NTQvMTE3MCAxNjg2LzE5NTUvMTE3MAorZiAxNTEvMTg4Mi8xMTcxIDE1MC8xODg3LzExNzEgMTg2LzE4NTAvMTE3MQorZiAxODYvMTg1MC8xMTcxIDE4Ny8xODQ2LzExNzEgMTUxLzE4ODIvMTE3MQorZiAxNTAvMTg4Ny8xMTcyIDE1OS8xODg5LzExNzIgMTk1LzE4NTEvMTE3MgorZiAxOTUvMTg1MS8xMTcyIDE4Ni8xODUwLzExNzIgMTUwLzE4ODcvMTE3MgorZiAxNDkvMTg5My8xMTczIDE0OC8xODkyLzExNzMgMTg0LzE4NTMvMTE3MworZiAxODQvMTg1My8xMTczIDE4NS8xODUyLzExNzMgMTQ5LzE4OTMvMTE3MworZiAxNDgvMTg5Mi8xMTc0IDE0Ny8xODk1LzExNzQgMTgzLzE4NTQvMTE3NAorZiAxODMvMTg1NC8xMTc0IDE4NC8xODUzLzExNzQgMTQ4LzE4OTIvMTE3NAorZiAxNjg3LzE5NTYvMTE3NSAxNDYvMTg5OC8xMTc1IDE4Mi8xODU2LzExNzUKK2YgMTgyLzE5NTcvMTE3NSAxNjg4LzE5NTgvMTE3NSAxNjg5LzE5NTkvMTE3NQorZiAxNDYvMTg5OC8xMTc2IDE0NS8xOTAzLzExNzYgMTgxLzE4NjAvMTE3NgorZiAxODEvMTg2MC8xMTc2IDE4Mi8xODU2LzExNzYgMTQ2LzE4OTgvMTE3NgorZiAxNDUvMTkwMy8xMDQ0IDE1Ny8xOTA1LzEwNDQgMTkzLzE4NjEvMTA0NAorZiAxOTMvMTg2MS8xMDQ0IDE4MS8xODYwLzEwNDQgMTQ1LzE5MDMvMTA0NAorZiAxNTUvMTkwOS8xMDQzIDM3OS8xOTA4LzEwNDMgMzgwLzE4NjMvMTA0MworZiAzODAvMTg2My8xMDQzIDE5MS8xODYyLzEwNDMgMTU1LzE5MDkvMTA0MworZiAxNTYvMTkxMS8xMDQzIDE1NC8xODc5LzEwNDMgMTkwLzE4NDQvMTA0MworZiAxOTAvMTg0NC8xMDQzIDE5Mi8xODY2LzEwNDMgMTU2LzE5MTEvMTA0MworZiAxNTkvMTg4OS8xMTcyIDE3OC8xOTEzLzExNzIgMTk4LzE4NzEvMTE3MgorZiAxOTgvMTg3MS8xMTcyIDE5NS8xODUxLzExNzIgMTU5LzE4ODkvMTE3MgorZiAxNjAvMTkxNS8xMTcyIDE0OS8xODkzLzExNzIgMTg1LzE4NTIvMTE3MgorZiAxODUvMTg1Mi8xMTcyIDE5Ni8xODczLzExNzIgMTYwLzE5MTUvMTE3MgorZiAxNDQvMTUyNC8xMTcyIDI1NS8xNTIzLzExNzIgMjQ3LzE5NjAvMTE3MgorZiAyNDcvMTk2MC8xMTcyIDE5Ni8xODczLzExNzIgMTQ0LzE1MjQvMTE3MgorZiAyMjUvMTk2MS8xMTcyIDE1MTkvMTk2Mi8xMTcyIDE1MTUvMTkzMy8xMTcyCitmIDE1MTUvMTkzMy8xMTcyIDIyNy8xOTYzLzExNzIgMjI1LzE5NjEvMTE3MgorZiAxNjcvMTkzOS8xMTcyIDE3Ny8xODcyLzExNzIgMTk4LzE4NzEvMTE3MgorZiAxOTgvMTg3MS8xMTcyIDE5Ny8xOTM0LzExNzIgMTY3LzE5MzkvMTE3MgorZiA1Ny8xNjU0LzExNjggNTYvMTY1My8xMTY4IDIwNi8xODc1LzExNjgKK2YgMjA2LzE4NzUvMTE2OCAyMDcvMTg3NC8xMTY4IDU3LzE2NTQvMTE2OAorZiA1OC8xNjU1LzExNjkgNTcvMTY1NC8xMTY5IDIwNy8xODc0LzExNjkKK2YgMjA3LzE4NzQvMTE2OSAyMDgvMTg3OC8xMTY5IDU4LzE2NTUvMTE2OQorZiAxNjkwLzE5NjQvMTE3MCA1NS8xNjU2LzExNzAgMjA1LzE4ODEvMTE3MAorZiAyMDUvMTk2NS8xMTcwIDE2OTEvMTk2Ni8xMTcwIDE2OTIvMTk2Ny8xMTcwCitmIDU1LzE2NTYvMTE3MSA1NC8xNjYwLzExNzEgMjA0LzE4ODYvMTE3MQorZiAyMDQvMTg4Ni8xMTcxIDIwNS8xODgxLzExNzEgNTUvMTY1Ni8xMTcxCitmIDU0LzE2NjAvMTE3MiA2My8xNjYxLzExNzIgMjEzLzE4ODgvMTE3MgorZiAyMTMvMTg4OC8xMTcyIDIwNC8xODg2LzExNzIgNTQvMTY2MC8xMTcyCitmIDUzLzE2NjMvMTE3MyA1Mi8xNjYyLzExNzMgMjAyLzE4OTEvMTE3MworZiAyMDIvMTg5MS8xMTczIDIwMy8xODkwLzExNzMgNTMvMTY2My8xMTczCitmIDUyLzE2NjIvMTE3NCA1MS8xNjY1LzExNzQgMjAxLzE4OTQvMTE3NAorZiAyMDEvMTg5NC8xMTc0IDIwMi8xODkxLzExNzQgNTIvMTY2Mi8xMTc0CitmIDE2OTMvMTY2Ny8xMTc1IDUwLzE2NjYvMTE3NSAyMDAvMTg5Ny8xMTc1CitmIDIwMC8xOTY4LzExNzUgMTY5NC8xOTY5LzExNzUgMTY5NS8xOTcwLzExNzUKK2YgNTAvMTY2Ni8xMTc3IDQ5LzE2NjgvMTE3NyAxOTkvMTkwMi8xMTc3CitmIDE5OS8xOTAyLzExNzYgMjAwLzE4OTcvMTE3NiA1MC8xNjY2LzExNzYKK2YgNDkvMTY2OC8xMDQ0IDYxLzE2NjkvMTA0NCAyMTEvMTkwNC8xMDQ0CitmIDIxMS8xOTA0LzEwNDQgMTk5LzE5MDIvMTA0NCA0OS8xNjY4LzEwNDQKK2YgNTkvMTY3My8xMDQzIDM3My8xNjcyLzEwNDMgMzgxLzE5MDcvMTA0MworZiAzODEvMTkwNy8xMDQzIDIwOS8xOTA2LzEwNDMgNTkvMTY3My8xMDQzCitmIDYwLzE2NzQvMTA0MyA1OC8xNjU1LzEwNDMgMjA4LzE4NzgvMTA0MworZiAyMDgvMTg3OC8xMDQzIDIxMC8xOTEwLzEwNDMgNjAvMTY3NC8xMDQzCitmIDMyMS8xNjc3LzEwNDQgMzI3LzE5NzEvMTA0NCAzMjYvMTk3Mi8xMDQ0CitmIDMyNi8xOTcyLzEwNDQgMzIwLzE2NzgvMTA0NCAzMjEvMTY3Ny8xMDQ0CitmIDYzLzE2NjEvMTE3MiAxNzMvMTY4MC8xMTcyIDIxNi8xOTEyLzExNzIKK2YgMjE2LzE5MTIvMTE3MiAyMTMvMTg4OC8xMTcyIDYzLzE2NjEvMTE3MgorZiA2NC8xNjgxLzExNzIgNTMvMTY2My8xMTcyIDIwMy8xODkwLzExNzIKK2YgMjAzLzE4OTAvMTE3MiAyMTQvMTkxNC8xMTcyIDY0LzE2ODEvMTE3MgorZiAyMjYvMTk3My8xMTcyIDE1MjAvMTkzMi8xMTcyIDE1MjIvMTkzNi8xMTcyCitmIDE1MjIvMTkzNi8xMTcyIDIyOC8xOTc0LzExNzIgMjI2LzE5NzMvMTE3MgorZiAxNjgvMTkzNS8xMTcyIDE3OC8xOTEzLzExNzIgMjE2LzE5MTIvMTE3MgorZiAyMTYvMTkxMi8xMTcyIDIxNS8xOTM3LzExNzIgMTY4LzE5MzUvMTE3MgorZiAxNjk2LzE5NzUvMTE3MiAxNTE5LzE5NjIvMTE3MiAyMjUvMTk2MS8xMTcyCitmIDIyNS8xOTYxLzExNzIgMjI0LzE5NzYvMTE3MiAxNjk3LzE5NzUvMTE3MgorZiAxNTExLzE5MTYvMTE5MyAxNTEyLzE5NzcvMTE5MyAyMTcvMTk3OC8xMTkzCitmIDIxNy8xOTc4LzExOTMgMjE5LzE5NzkvMTE5MyAxNTExLzE5MTYvMTE5MworZiAxNjk4LzE5ODAvNjk3IDE1MTcvMTkyMS82OTcgMjIyLzE5ODEvNjk3CitmIDIyMi8xOTgyLzY5NyAxNjk5LzE5ODMvNjk3IDE3MDAvMTk4NC82OTcKK2YgMjQ5LzE1NjAvMTE3MiAyNTEvMTk4NS8xMTcyIDIyMS8xOTg2LzExNzIKK2YgMjIxLzE5ODYvMTE3MiAyMTkvMTk3OS8xMTcyIDI0OS8xNTYwLzExNzIKK2YgMjUzLzE5ODcvMTIxNCAyNTIvMTYzNy8xMjE0IDIyMi8xOTgxLzEyMTQKK2YgMjIyLzE5ODEvMTIxNCAyMjMvMTk4OC8xMjE0IDI1My8xOTg3LzEyMTQKK2YgMjUwLzE5ODkvNjg3IDEzOTMvMTk5MC82ODcgMTM5Mi8xOTkxLzY4NworZiAxMzkyLzE5OTEvNjg3IDIyMC8xOTkyLzY4NyAyNTAvMTk4OS82ODcKK2YgMTcwMS8xOTkzLzEyNDEgMjUwLzE5ODkvMTI0MSAyMjAvMTk5Mi8xMjQxCitmIDIyMC8xOTk0LzEyNDEgMTcwMi8xOTk1LzEyNDEgMTcwMy8xOTk2LzEyNDEKK2YgMjUxLzE5ODUvMTE3MiAyNDgvMTk5Ny8xMTcyIDIyOC8xOTc0LzExNzIKK2YgMjI4LzE5NzQvMTE3MiAyMjEvMTk4Ni8xMTcyIDI1MS8xOTg1LzExNzIKK2YgMjQ3LzE5NjAvMTE3MiAyMjcvMTk2My8xMTcyIDIzMC8xOTk4LzExNzIKK2YgMjMwLzE5OTgvMTE3MiAyMjkvMTk5OS8xMTcyIDI0Ny8xOTYwLzExNzIKK2YgMjM2LzIwMDAvMTE3MiAyMTQvMTkxNC8xMTcyIDE2MC8xOTE1LzExNzIKK2YgMTYwLzE5MTUvMTE3MiAyMzQvMjAwMS8xMTcyIDIzNi8yMDAwLzExNzIKK2YgMjM0LzIwMDEvMTE3MiAxNjAvMTkxNS8xMTcyIDE5Ni8xODczLzExNzIKK2YgMTk2LzE4NzMvMTE3MiAyMzUvMjAwMi8xMTcyIDIzNC8yMDAxLzExNzIKK2YgMjM2LzIwMDAvMTE3MiAyNDQvMjAwMy8xMTcyIDIzNy8yMDA0LzExNzIKK2YgMjM3LzIwMDQvMTE3MiAyMzMvMjAwNS8xMTcyIDIzNi8yMDAwLzExNzIKK2YgMjM2LzIwMDAvMTE3MiAyMzQvMjAwMS8xMTcyIDI0My8yMDA2LzExNzIKK2YgMjQzLzIwMDYvMTE3MiAyNDQvMjAwMy8xMTcyIDIzNi8yMDAwLzExNzIKK2YgMjMxLzIwMDcvMTE3MiAyMzIvMjAwOC8xMTcyIDIzOC8yMDA5LzExNzIKK2YgMjM4LzIwMDkvMTE3MiAyMzkvMjAxMC8xMTcyIDIzMS8yMDA3LzExNzIKK2YgMjM0LzIwMDEvMTE3MiAyMzUvMjAwMi8xMTcyIDI0Mi8yMDExLzExNzIKK2YgMjQyLzIwMTEvMTE3MiAyNDMvMjAwNi8xMTcyIDIzNC8yMDAxLzExNzIKK2YgMjMzLzIwMDUvMTE3MiAyMzIvMjAwOC8xMTcyIDIyOC8xOTc0LzExNzIKK2YgMjI4LzE5NzQvMTE3MiAyNDgvMTk5Ny8xMTcyIDIzMy8yMDA1LzExNzIKK2YgMjMzLzIwMDUvMTE3MiAyMzcvMjAwNC8xMTcyIDIzOC8yMDA5LzExNzIKK2YgMjM4LzIwMDkvMTE3MiAyMzIvMjAwOC8xMTcyIDIzMy8yMDA1LzExNzIKK2YgMjMxLzIwMDcvMTE3MiAyMzkvMjAxMC8xMTcyIDI0MC8yMDEyLzExNzIKK2YgMjQwLzIwMTIvMTE3MiAyMzAvMTk5OC8xMTcyIDIzMS8yMDA3LzExNzIKK2YgMjM1LzIwMDIvMTE3MiAyMjkvMTk5OS8xMTcyIDI0MS8yMDEzLzExNzIKK2YgMjQxLzIwMTMvMTI0MiAyNDIvMjAxMS8xMjQyIDIzNS8yMDAyLzEyNDIKK2YgMjI0LzE5NzYvMTE3MiAyMjUvMTk2MS8xMTcyIDI1NS8xNTIzLzExNzIKK2YgMjU1LzE1MjMvMTE3MiAyNTQvMTUyMi8xMTcyIDIyNC8xOTc2LzExNzIKK2YgMjE5LzE5NzkvMTE5MyAyMTcvMTk3OC8xMTkzIDI0NS8xNTYxLzExOTMKK2YgMjQ1LzE1NjEvMTE5MyAyNDkvMTU2MC8xMTkzIDIxOS8xOTc5LzExOTMKK2YgMjUyLzIwMTQvNjk3IDE3MDQvMjAxNS82OTcgMTcwNS8yMDE2LzY5NworZiAxNzA2LzIwMTcvNjk3IDIyMi8xOTgxLzY5NyAyNTIvMTYzNy82OTcKK2YgMjI1LzE5NjEvMTE3MiAyMjcvMTk2My8xMTcyIDI0Ny8xOTYwLzExNzIKK2YgMjQ3LzE5NjAvMTE3MiAyNTUvMTUyMy8xMTcyIDIyNS8xOTYxLzExNzIKK2YgMjEvMTU1OC8xMTcyIDY0LzE2ODEvMTE3MiAyNTEvMTk4NS8xMTcyCitmIDI1MS8xOTg1LzExNzIgMjQ5LzE1NjAvMTE3MiAyMS8xNTU4LzExNzIKK2YgOTMvMTcwOC8xMjE0IDc3LzE2MzIvMTIxNCAyNTIvMTYzNy8xMjE0CitmIDI1Mi8xNjM3LzEyMTQgMjUzLzE5ODcvMTIxNCA5My8xNzA4LzEyMTQKK2YgMTI4LzE3MzMvNjg3IDEzNzkvMTczMi82ODcgMTM5My8xOTkwLzY4NworZiAxMzkzLzE5OTAvNjg3IDI1MC8xOTg5LzY4NyAxMjgvMTczMy82ODcKK2YgMTcwNy8yMDE4LzEyNDEgMTI4LzE3MzMvMTI0MSAyNTAvMTk4OS8xMjQxCitmIDI1MC8yMDE5LzEyMjkgMTcwOC8yMDIwLzEyMjkgMTcwOS8yMDIxLzEyMjkKK2YgNjQvMTY4MS8xMTcyIDIxNC8xOTE0LzExNzIgMjQ4LzE5OTcvMTE3MgorZiAyNDgvMTk5Ny8xMTcyIDI1MS8xOTg1LzExNzIgNjQvMTY4MS8xMTcyCitmIDIyOS8xOTk5LzExNzIgMjM1LzIwMDIvMTE3MiAxOTYvMTg3My8xMTcyCitmIDE5Ni8xODczLzExNzIgMjQ3LzE5NjAvMTE3MiAyMjkvMTk5OS8xMTcyCitmIDIzMy8yMDA1LzExNzIgMjQ4LzE5OTcvMTE3MiAyMTQvMTkxNC8xMTcyCitmIDIxNC8xOTE0LzExNzIgMjM2LzIwMDAvMTE3MiAyMzMvMjAwNS8xMTcyCitmIDIzMi8yMDA4LzExNzIgMjMxLzIwMDcvMTE3MiAyMjYvMTk3My8xMTcyCitmIDIyNi8xOTczLzExNzIgMjI4LzE5NzQvMTE3MiAyMzIvMjAwOC8xMTcyCitmIDIyNi8xOTczLzExNzIgMjMxLzIwMDcvMTE3MiAyMzAvMTk5OC8xMTcyCitmIDIzMC8xOTk4LzExNzIgMjI3LzE5NjMvMTE3MiAyMjYvMTk3My8xMTcyCitmIDIyOS8xOTk5LzEyNDMgMjMwLzE5OTgvMTI0MyAyNDAvMjAxMi8xMjQzCitmIDI0MC8yMDEyLzExNzIgMjQxLzIwMTMvMTE3MiAyMjkvMTk5OS8xMTcyCitmIDI2NS8yMDIyLzEyNDQgMjY0LzIwMjMvMTI0NCAyNTYvMjAyNC8xMjQ0CitmIDI1Ni8yMDI0LzEyNDQgMjU3LzIwMjUvMTI0NCAyNjUvMjAyMi8xMjQ0CitmIDI2Ni8yMDI2LzEyNDUgMTcxMC8yMDI3LzEyNDUgMTcxMS8yMDI4LzEyNDUKK2YgMTcxMi8yMDI5LzEyNDYgMjU4LzIwMzAvMTI0NiAyNjYvMjAzMS8xMjQ2CitmIDI2Ny8yMDMyLzEyNDcgMjY2LzIwMzEvMTI0NyAyNTgvMjAzMC8xMjQ3CitmIDI1OC8yMDMwLzEyNDcgMjU5LzIwMzMvMTI0NyAyNjcvMjAzMi8xMjQ3CitmIDI2OC8yMDM0LzEyNDggMTcxMy8yMDM1LzEyNDggMTcxNC8yMDM2LzEyNDgKK2YgMTcxNS8yMDM3LzEyNDggMjYwLzIwMzgvMTI0OCAyNjgvMjAzOS8xMjQ4CitmIDI2OS8yMDQwLzEyNDkgMjY4LzIwMzkvMTI0OSAyNjAvMjAzOC8xMjQ5CitmIDI2MC8yMDM4LzEyNDkgMjYxLzIwNDEvMTI0OSAyNjkvMjA0MC8xMjQ5CitmIDI3MC8yMDQyLzEyNTAgMTcxNi8yMDQzLzEyNTAgMTcxNy8yMDQ0LzEyNTAKK2YgMTcxOC8yMDQ1LzEyNTAgMjYyLzIwNDYvMTI1MCAyNzAvMjA0Ny8xMjUwCitmIDI3MS8yMDQ4LzEyNTEgMjcwLzIwNDcvMTI1MSAyNjIvMjA0Ni8xMjUxCitmIDI2Mi8yMDQ2LzEyNTIgMjYzLzIwNDkvMTI1MiAyNzEvMjA0OC8xMjUyCitmIDI2NC8yMDUwLzEyNTMgMTcxOS8yMDUxLzEyNTMgMTcyMC8yMDUyLzEyNTMKK2YgMTcyMS8yMDUzLzEyNTMgMjU2LzIwMjQvMTI1MyAyNjQvMjAyMy8xMjUzCitmIDE3MjIvMjA1NC8xMjU0IDI2NC8yMDU1LzEyNTQgMjY1LzIwNTYvMTI1NAorZiAyNjUvMjA1Ny8xMjU1IDE3MjMvMjA1Ny8xMjU1IDE3MjQvMjA1OC8xMjU1CitmIDE3MjUvMjA1OS8xMjU2IDE3MjYvMjA2MC8xMjU2IDE3MjcvMjA2MS8xMjU2CitmIDE3MjgvMjA2Mi8xMjU3IDE3MjkvMjA2My8xMjU3IDE3MzAvMjA2NC8xMjU3CitmIDE3MzEvMjA2NS8xMjU4IDE3MzIvMjA2Ni8xMjU4IDE3MzMvMjA2Ny8xMjU4CitmIDE3MzQvMjA2OC8xMjU5IDE3MzUvMjA2OC8xMjU5IDE3MzYvMjA2OS8xMjU5CitmIDI0MC8yMDcwLzEyNjAgMTczNy8yMDcwLzEyNjAgMTczOC8yMDcxLzEyNjAKK2YgMTczOS8yMDEzLzEyNjEgMjQxLzIwMTMvMTI2MSAyNDAvMjAxMi8xMjYxCitmIDE3NDAvMjA3Mi8xMjYyIDE3NDEvMjA3Mi8xMjYyIDE3NDIvMjA3My8xMjYyCitmIDE3NDMvMjA3NC8xMjYzIDE3NDQvMjA3NC8xMjYzIDE3NDUvMjA3NS8xMjYzCitmIDE3NDYvMjA3Ni8xMjY0IDE3NDcvMjA3Ny8xMjY0IDE3NDgvMjA3OC8xMjY0CitmIDE3NDkvMjA3OS8xMjY1IDE3NTAvMjA4MC8xMjY1IDE3NTEvMjA4MS8xMjY1CitmIDE3NTIvMjA4Mi8xMjY2IDE3NTMvMjA4My8xMjY2IDE3NTQvMjA4NC8xMjY2CitmIDE3NTUvMjA4NS8xMjY3IDE3NTYvMjA4NS8xMjY3IDE3NTcvMjA4Ni8xMjY3CitmIDE3NTgvMjA4Ny8xMjY4IDE3NTkvMjA4OC8xMjY4IDE3NjAvMjA4OS8xMjY4CitmIDE3NjEvMjA5MC8xMjY5IDE3NjIvMjA5MS8xMjY5IDE3NjMvMjA5Mi8xMjY5CitmIDMzNC8yMDkzLzExODQgMzMzLzIwOTQvMTE4NCAzMzIvMjA5NS8xMTg0CitmIDMzMi8yMDk1LzExODQgMzM1LzIwOTYvMTE4NCAzMzQvMjA5My8xMTg0CitmIDMzOS8yMDk3LzY5NyAxNzY0LzIwOTgvNjk3IDE3NjUvMjA5OS82OTcKK2YgMTc2Ni8yMTAwLzY5NyAzMzgvMjEwMS82OTcgMzM5LzIxMDIvNjk3CitmIDM1MC8yMTAzLzEwNDQgMjc1LzIxMDQvMTA0NCAyNzIvMjEwNS8xMDQ0CitmIDI3Mi8yMTA1LzEwNDQgMzQ4LzE1MzgvMTA0NCAzNTAvMjEwMy8xMDQ0CitmIDM1Mi8yMTA2LzEyMDUgMzUxLzE1OTgvMTIwNSAyNzYvMjEwNy8xMjA1CitmIDI3Ni8yMTA3LzEyMDUgMjc3LzIxMDgvMTIwNSAzNTIvMjEwNi8xMjA1CitmIDM0OS8yMTA5LzY4NyAxNDAwLzIxMTAvNjg3IDEzOTQvMjExMS82ODcKK2YgMTM5NC8yMTExLzY4NyAyNzQvMjExMi82ODcgMzQ5LzIxMDkvNjg3CitmIDM0OS8yMTEzLzEyMzggMjc0LzIxMTQvMTIzOCAyNzkvMjExNS8xMjM4CitmIDI3OS8yMTE1LzEyMzggMTc2Ny8yMTE2LzEyMzggMzQ5LzIxMTMvMTIzOAorZiAzNTYvMjExNy8xMDQ0IDM1NC8xNTE5LzEwNDQgMjgwLzIxMTgvMTA0NAorZiAyODAvMjExOC8xMDQ0IDI4MS8yMTE5LzEwNDQgMzU2LzIxMTcvMTA0NAorZiAyODIvMjEyMC8xMDQ0IDM1Ny8yMTIxLzEwNDQgMzU1LzIxMjIvMTA0NAorZiAzNTUvMjEyMi8xMDQ0IDEwMjUvMjEyMy8xMDQ0IDI4Mi8yMTIwLzEwNDQKK2YgMzUwLzIxMDMvMTA0NCAzNTcvMjEyMS8xMDQ0IDI4Mi8yMTIwLzEwNDQKK2YgMjgyLzIxMjAvMTA0NCAyNzUvMjEwNC8xMDQ0IDM1MC8yMTAzLzEwNDQKK2YgMzM1LzIwOTYvMTA0NCAzMzcvMjEyNC8xMDQ0IDMzNi8yMTI1LzEwNDQKK2YgMzM2LzIxMjUvMTA0NCAzMzQvMjA5My8xMDQ0IDMzNS8yMDk2LzEwNDQKK2YgMzQxLzIxMjYvMTIwNSAzMzkvMjEwMi8xMjA1IDMzOC8yMTAxLzEyMDUKK2YgMzM4LzIxMDEvMTIwNSAzNDAvMjEyNy8xMjA1IDM0MS8yMTI2LzEyMDUKK2YgMzM3LzIxMjQvMTA0NCAzNDMvMjEyOC8xMDQ0IDM0Mi8yMTI5LzEwNDQKK2YgMzQyLzIxMjkvMTA0NCAzMzYvMjEyNS8xMDQ0IDMzNy8yMTI0LzEwNDQKK2YgMjk5LzE4NjkvMTA0NCAzMDcvMTg2OC8xMDQ0IDE3NjgvMjEzMC8xMDQ0CitmIDE3NjkvMjEzMS8xMDQ0IDE3NzAvMjEzMi8xMDQ0IDI5OS8yMTMzLzEwNDQKK2YgMzE4LzE2NzUvMTE4NCAzMjkvMjEzNC8xMTg0IDMyOC8yMTM1LzExODQKK2YgMzI4LzIxMzUvMTE4NCAzMTkvMTY3Ni8xMTg0IDMxOC8xNjc1LzExODQKK2YgMzIzLzIxMzYvNjk3IDE3NzEvMjEzNy82OTcgMTc3Mi8yMTM4LzY5NworZiAxNzczLzIxMzkvNjk3IDMyMi8xNjk3LzY5NyAzMjMvMTY5Ni82OTcKK2YgMzQyLzIxMjkvMTA0NCAxMDMwLzIxNDAvMTA0NCAxMDI4LzIxNDEvMTA0NAorZiAxMDI4LzIxNDEvMTA0NCAxMDEzLzIxNDIvMTA0NCAzNDIvMjEyOS8xMDQ0CitmIDI4MS8yMTE5LzEwNDQgMjgwLzIxMTgvMTA0NCAyOTAvMjE0My8xMDQ0CitmIDI5MC8yMTQzLzEwNDQgMjg5LzIxNDQvMTA0NCAyODEvMjExOS8xMDQ0CitmIDE3NzQvMjE0NS8xMDQ0IDI5MS8yMTQ2LzEwNDQgMjkwLzIxNDcvMTA0NAorZiAyOTAvMjE0My8xMDQ0IDI4MC8yMTE4LzEwNDQgMTc3NS8yMTQ4LzEwNDQKK2YgMTc3Ni8yMTQ5LzEyNzAgMjkyLzIxNTAvMTI3MCAyOTEvMjE1MS8xMjcwCitmIDI5MS8yMTUyLzEyMzggMTc3Ny8yMTUzLzEyMzggMTc3OC8yMTU0LzEyMzgKK2YgMzU4LzIxNTUvMTA0NCAyOTMvMjE1Ni8xMDQ0IDI5NS8yMTU3LzEwNDQKK2YgMjk1LzIxNTcvMTA0NCAzNjAvMjE1OC8xMDQ0IDM1OC8yMTU1LzEwNDQKK2YgMzYyLzIxNTkvMTIwNCAyOTcvMjE2MC8xMjA0IDI5Ni8yMTYxLzEyMDQKK2YgMjk2LzIxNjEvMTIwNCAzNjEvMjE2Mi8xMjA0IDM2Mi8yMTU5LzEyMDQKK2YgMzY5LzIxNjMvNjg3IDE0MDEvMjE2NC82ODcgMTM5NS8xNzQ5LzY4NworZiAxMzk1LzE3NDkvNjg3IDMwMy8yMTY1LzY4NyAzNjkvMjE2My82ODcKK2YgMzYzLzIxNjYvMTIzOCAyOTgvMTgzMC8xMjM4IDI5NC8xODI5LzEyMzgKK2YgMjk0LzE4MjkvMTIzOCAzNTkvMjE2Ny8xMjM4IDM2My8yMTY2LzEyMzgKK2YgMzY0LzIxNjgvMTA0NCAzNjYvMjE2OS8xMDQ0IDMwMC8xODcwLzEwNDQKK2YgMzAwLzE4NzAvMTA0NCAyOTkvMTg2OS8xMDQ0IDM2NC8yMTY4LzEwNDQKK2YgMzY2LzIxNjkvMTA0NCAzNjUvMjE3MC8xMDQ0IDEwNzEvMjE3MS8xMDQ0CitmIDEwNzEvMjE3MS8xMDQ0IDMwMC8xODcwLzEwNDQgMzY2LzIxNjkvMTA0NAorZiAzNjcvMjE3Mi8xMDQ0IDM2MC8yMTU4LzEwNDQgMjk1LzIxNTcvMTA0NAorZiAyOTUvMjE1Ny8xMDQ0IDMwMS8yMTczLzEwNDQgMzY3LzIxNzIvMTA0NAorZiAzNjQvMjE2OC8xMDQ0IDI5OS8xODY5LzEwNDQgMTc3OS8yMTc0LzEwNDQKK2YgMTc4MC8yMTc1LzEwNDQgMTc4MS8yMTc2LzEwNDQgMzY0LzIxNzcvMTA0NAorZiAzNTgvMjE1NS8xMTg0IDM2OC8yMTc4LzExODQgMzAyLzIxNzkvMTE4NAorZiAzMDIvMjE3OS8xMTg0IDI5My8yMTU2LzExODQgMzU4LzIxNTUvMTE4NAorZiAxNzgyLzIxODAvNjk3IDE3ODMvMjE4MS82OTcgMzYxLzIxODIvNjk3CitmIDM2MS8yMTYyLzY5NyAyOTYvMjE2MS82OTcgMTc4NC8yMTgzLzY5NworZiAxMzk0LzIxMTEvMTI3MSAxMzk3LzIxODQvMTI3MSAxNzg1LzIxODUvMTI3MQorZiAxNzg2LzIxODUvMTI3MSAyNzQvMjExMi8xMjcxIDEzOTQvMjExMS8xMjcxCitmIDEwNjEvMjE4Ni8xMDQ0IDEwNTEvMjE4Ny8xMDQ0IDEwNTAvMjE4OC8xMDQ0CitmIDEwNTAvMjE4OC8xMDQ0IDEwNjAvMjE4OS8xMDQ0IDEwNjEvMjE4Ni8xMDQ0CitmIDMyMC8xNjc4LzEwNDQgMjk1LzIxNTcvMTA0NCAyOTMvMjE1Ni8xMDQ0CitmIDI5My8yMTU2LzEwNDQgMzE4LzE2NzUvMTA0NCAzMjAvMTY3OC8xMDQ0CitmIDEwNjMvMjE5MC8xMjA1IDEwNTMvMjE5MS8xMjA1IDEwNTIvMjE5Mi8xMjA1CitmIDEwNTIvMjE5Mi8xMjA0IDEwNjIvMjE5My8xMjA0IDEwNjMvMjE5MC8xMjA0CitmIDMyMi8xNjk3LzEyMDQgMjk2LzIxNjEvMTIwNCAyOTcvMjE2MC8xMjA0CitmIDI5Ny8yMTYwLzEyMDQgMzI0LzE2OTQvMTIwNCAzMjIvMTY5Ny8xMjA0CitmIDEwNTEvMjE4Ny8xMDQ0IDEwNTQvMjE5NC8xMDQ0IDEwNTUvMjE5NS8xMDQ0CitmIDEwNTUvMjE5NS8xMDQ0IDEwNTAvMjE4OC8xMDQ0IDEwNTEvMjE4Ny8xMDQ0CitmIDMwMS8yMTczLzEwNDQgMjk1LzIxNTcvMTA0NCAzMjAvMTY3OC8xMDQ0CitmIDMyMC8xNjc4LzEwNDQgMzI2LzE5NzIvMTA0NCAzMDEvMjE3My8xMDQ0CitmIDI5My8yMTU2LzExODQgMzAyLzIxNzkvMTE4NCAzMjkvMjEzNC8xMTg0CitmIDMyOS8yMTM0LzExODQgMzE4LzE2NzUvMTE4NCAyOTMvMjE1Ni8xMTg0CitmIDEwNTYvMjE5Ni8xMTg0IDEwNjEvMjE4Ni8xMTg0IDEwNjAvMjE4OS8xMTg0CitmIDEwNjAvMjE4OS8xMTg0IDEwNTcvMjE5Ny8xMTg0IDEwNTYvMjE5Ni8xMTg0CitmIDE3ODcvMjE5OC82OTcgMTc4OC8yMTk5LzY5NyAyOTYvMjIwMC82OTcKK2YgMjk2LzIxNjEvNjk3IDMyMi8xNjk3LzY5NyAxNzg5LzIxMzkvNjk3CitmIDEwNTMvMjIwMS82OTcgMTc5MC8yMjAyLzY5NyAxNzkxLzIyMDMvNjk3CitmIDE3OTIvMjIwNC82OTcgMTA1Mi8yMTkyLzY5NyAxMDUzLzIxOTEvNjk3CitmIDI3My8yMjA1LzExODQgMjcyLzIxMDUvMTE4NCAzMzUvMjA5Ni8xMTg0CitmIDMzNS8yMDk2LzExODQgMzMyLzIwOTUvMTE4NCAyNzMvMjIwNS8xMTg0CitmIDE3OTMvMjIwNi82OTcgMTc5NC8yMjA3LzY5NyAzMzkvMjIwOC82OTcKK2YgMzM5LzIxMDIvNjk3IDI3Ni8yMTA3LzY5NyAxNzk1LzIyMDkvNjk3CitmIDI3NS8yMTA0LzEwNDQgMzM3LzIxMjQvMTA0NCAzMzUvMjA5Ni8xMDQ0CitmIDMzNS8yMDk2LzEwNDQgMjcyLzIxMDUvMTA0NCAyNzUvMjEwNC8xMDQ0CitmIDI3Ny8yMTA4LzEyMDQgMjc2LzIxMDcvMTIwNCAzMzkvMjEwMi8xMjA0CitmIDMzOS8yMTAyLzEyMDUgMzQxLzIxMjYvMTIwNSAyNzcvMjEwOC8xMjA1CitmIDI3NS8yMTA0LzEwNDQgMjgyLzIxMjAvMTA0NCAzNDMvMjEyOC8xMDQ0CitmIDM0My8yMTI4LzEwNDQgMzM3LzIxMjQvMTA0NCAyNzUvMjEwNC8xMDQ0CitmIDI4MC8yMTE4LzEwNDQgMzU0LzE1MTkvMTA0NCAzNTMvMTUxOC8xMDQ0CitmIDM1My8xNTE4LzEwNDQgMTc5Ni8yMTQ4LzEwNDQgMjgwLzIxMTgvMTA0NAorZiAyNzIvMjEwNS8xMTg0IDI3My8yMjA1LzExODQgMzQ2LzE1MzkvMTE4NAorZiAzNDYvMTUzOS8xMTg0IDM0OC8xNTM4LzExODQgMjcyLzIxMDUvMTE4NAorZiAxNzk3LzIyMTAvNjk3IDE3OTgvMjIxMS82OTcgMjc2LzIyMTIvNjk3CitmIDI3Ni8yMTA3LzY5NyAzNTEvMTU5OC82OTcgMTc5OS8xNTk3LzY5NworZiAxOS8xNTQxLzEwNDQgNjIvMjIxMy8xMDQ0IDM1MC8yMTAzLzEwNDQKK2YgMzUwLzIxMDMvMTA0NCAzNDgvMTUzOC8xMDQ0IDE5LzE1NDEvMTA0NAorZiA4Ni8yMjE0LzEyMDQgNzAvMTU5OS8xMjA0IDM1MS8xNTk4LzEyMDQKK2YgMzUxLzE1OTgvMTIwNSAzNTIvMjEwNi8xMjA1IDg2LzIyMTQvMTIwNQorZiAxMjcvMjIxNS82ODcgMTM4Ni8yMjE2LzY4NyAxNDAwLzIxMTAvNjg3CitmIDE0MDAvMjExMC82ODcgMzQ5LzIxMDkvNjg3IDEyNy8yMjE1LzY4NworZiAxODAwLzIyMTcvMTIzOCAxMjcvMjIxOC8xMjM4IDM0OS8yMjE5LzEyMzgKK2YgMzQ5LzIyMjAvMTIzOCAxODAxLzIyMjEvMTIzOCAxODAyLzIyMjIvMTIzOAorZiAxOTQvMjIyMy8xMDQ0IDE0Mi8xNTIwLzEwNDQgMzU0LzE1MTkvMTA0NAorZiAzNTQvMTUxOS8xMDQ0IDM1Ni8yMTE3LzEwNDQgMTk0LzIyMjMvMTA0NAorZiAyMTIvMjIyNC8xMDQ0IDE1OC8yMjI1LzEwNDQgMzU1LzIxMjIvMTA0NAorZiAzNTUvMjEyMi8xMDQ0IDM1Ny8yMTIxLzEwNDQgMjEyLzIyMjQvMTA0NAorZiAxNTgvMjIyNS8xMDQ0IDE5NC8yMjIzLzEwNDQgMzU2LzIxMTcvMTA0NAorZiAzNTYvMjExNy8xMDQ0IDM1NS8yMTIyLzEwNDQgMTU4LzIyMjUvMTA0NAorZiA2Mi8yMjEzLzEwNDQgMjEyLzIyMjQvMTA0NCAzNTcvMjEyMS8xMDQ0CitmIDM1Ny8yMTIxLzEwNDQgMzUwLzIxMDMvMTA0NCA2Mi8yMjEzLzEwNDQKK2YgMTA3Ny8yMjI2LzEwNDQgMTA3NS8yMjI3LzEwNDQgMzU4LzIxNTUvMTA0NAorZiAzNTgvMjE1NS8xMDQ0IDM2MC8yMTU4LzEwNDQgMTA3Ny8yMjI2LzEwNDQKK2YgMTA3OC8yMjI4LzEyMDQgMTA3OS8yMjI5LzEyMDQgMzYyLzIxNTkvMTIwNAorZiAzNjIvMjE1OS8xMjA0IDM2MS8yMTYyLzEyMDQgMTA3OC8yMjI4LzEyMDQKK2YgMTA4Ni8yMjMwLzY4NyAxNTAyLzIyMzEvNjg3IDE0MDEvMjE2NC82ODcKK2YgMTQwMS8yMTY0LzY4NyAzNjkvMjE2My82ODcgMTA4Ni8yMjMwLzY4NworZiAxMDc2LzIyMzIvMTIzOCAxMDgwLzIyMzMvMTIzOCAzNjMvMjE2Ni8xMjM4CitmIDM2My8yMTY2LzEyMzggMzU5LzIxNjcvMTIzOCAxMDc2LzIyMzIvMTIzOAorZiAxMDgxLzIyMzQvMTA0NCAxMDgzLzIyMzUvMTA0NCAzNjYvMjE2OS8xMDQ0CitmIDM2Ni8yMTY5LzEwNDQgMzY0LzIxNjgvMTA0NCAxMDgxLzIyMzQvMTA0NAorZiAxMDgyLzIyMzYvMTA0NCAxMDg0LzIyMzcvMTA0NCAzNjcvMjE3Mi8xMDQ0CitmIDM2Ny8yMTcyLzEwNDQgMzY1LzIxNzAvMTA0NCAxMDgyLzIyMzYvMTA0NAorZiAzNjYvMjE2OS8xMDQ0IDEwODMvMjIzNS8xMDQ0IDEwODIvMjIzNi8xMDQ0CitmIDEwODIvMjIzNi8xMDQ0IDM2NS8yMTcwLzEwNDQgMzY2LzIxNjkvMTA0NAorZiAxMDg0LzIyMzcvMTA0NCAxMDc3LzIyMjYvMTA0NCAzNjAvMjE1OC8xMDQ0CitmIDM2MC8yMTU4LzEwNDQgMzY3LzIxNzIvMTA0NCAxMDg0LzIyMzcvMTA0NAorZiAxODAzLzIyMzgvMTA0NCAxMDgxLzIyMzQvMTA0NCAzNjQvMjE2OC8xMDQ0CitmIDM2NC8yMjM5LzEwNDQgMTgwNC8yMjQwLzEwNDQgMTgwNS8yMjQxLzEwNDQKK2YgMTA3NS8yMjI3LzExODQgMTA4NS8yMjQyLzExODQgMzY4LzIxNzgvMTE4NAorZiAzNjgvMjE3OC8xMTg0IDM1OC8yMTU1LzExODQgMTA3NS8yMjI3LzExODQKK2YgMTgwNi8yMjQzLzY5NyAxMDc4LzIyMjgvNjk3IDM2MS8yMTYyLzY5NworZiAzNjEvMjI0NC82OTcgMTgwNy8yMjQ1LzY5NyAxODA4LzIyNDYvNjk3CitmIDMvMjI0Ny8xMDQzIDEzOS8xODY1LzEwNDMgMzc4LzE4NjQvMTA0MworZiAzNzgvMTg2NC8xMDQzIDM3Ny8yMjQ4LzEwNDMgMy8yMjQ3LzEwNDMKK2YgMTYvMTY3MC8xMTgyIDI2LzIyNDkvMTE4MiAzNzEvMjI1MC8xMTgyCitmIDM3MS8yMjUwLzExODMgMzcwLzE2NzEvMTE4MyAxNi8xNjcwLzExODMKK2YgMTgwOS8yMjUxLzY5NyAxODEwLzIyNTIvNjk3IDY5LzIyNTMvNjk3CitmIDY5LzE2OTMvNjk3IDM3NC8xNjkyLzY5NyAxODExLzIyNTQvNjk3CitmIDkxMC8yMjU1LzEwNDMgOTI3LzIyNTYvMTA0MyA5MjgvMjI1Ny8xMDQzCitmIDkyOC8yMjU3LzEwNDMgOTExLzIyNTgvMTA0MyA5MTAvMjI1NS8xMDQzCitmIDkwOS8yMjU5LzEyMDMgOTI2LzIyNjAvMTIwMyA5MjkvMjI2MS8xMjAzCitmIDkyOS8yMjYxLzEyMDMgOTEyLzIyNjIvMTIwMyA5MDkvMjI1OS8xMjAzCitmIDkxNC8yMjYzLzEwNDMgOTMxLzIyNjQvMTA0MyA5MzAvMjI2NS8xMDQzCitmIDkzMC8yMjY1LzEwNDMgOTEzLzIyNjYvMTA0MyA5MTQvMjI2My8xMDQzCitmIDkxNS8yMjY3LzExMDIgOTMyLzIyNjgvMTEwMiA5MjQvMjI2OS8xMTAyCitmIDkyNC8yMjY5LzEwNDMgOTE3LzIyNzAvMTA0MyA5MTUvMjI2Ny8xMDQzCitmIDkxMS8yMjU4LzEwNDMgOTI4LzIyNTcvMTA0MyA5MzEvMjI2NC8xMDQzCitmIDkzMS8yMjY0LzEwNDMgOTE0LzIyNjMvMTA0MyA5MTEvMjI1OC8xMDQzCitmIDk4OS8yMjcxLzEwNDMgOTkwLzIyNzIvMTA0MyAzOTgvMjI3My8xMDQzCitmIDM5OC8yMjczLzEwNDMgMzk2LzIyNzQvMTA0MyA5ODkvMjI3MS8xMDQzCitmIDk0My8yMjc1LzEwNDMgOTQyLzIyNzYvMTA0MyAzOTcvMjI3Ny8xMDQzCitmIDM5Ny8yMjc3LzEwNDMgMzk5LzIyNzgvMTA0MyA5NDMvMjI3NS8xMDQzCitmIDk4NC8yMjc5LzExODMgOTk0LzIyODAvMTE4MyAzODMvMjI4MS8xMTgzCitmIDM4My8yMjgxLzExODIgMzg2LzIyODIvMTE4MiA5ODQvMjI3OS8xMTgyCitmIDkzNS8yMjgzLzExODMgOTM3LzIyODQvMTE4MyAzODcvMTUzNC8xMTgzCitmIDM4Ny8xNTM0LzExODIgMzgyLzE1MzcvMTE4MiA5MzUvMjI4My8xMTgyCitmIDE4MTIvMjI4NS82OTcgOTg3LzIyODYvNjk3IDM5Mi8yMjg3LzY5NworZiAzOTIvMjI4OC82OTcgMTgxMy8yMjg5LzY5NyAxODE0LzIyOTAvNjk3CitmIDM5My8yMjkxLzY5NyA5NDAvMjI5Mi82OTcgMTgxNS8yMjkzLzY5NworZiAxODE2LzIyOTQvNjk3IDE4MTcvMjI5NS82OTcgMzkzLzIyOTYvNjk3CitmIDkzNy8yMjg0LzEwNDMgOTM5LzIyOTcvMTA0MyAzOTEvMjI5OC8xMDQzCitmIDM5MS8yMjk4LzEwNDMgMzg3LzE1MzQvMTA0MyA5MzcvMjI4NC8xMDQzCitmIDk4Ni8yMjk5LzEwNDMgOTg0LzIyNzkvMTA0MyAzODYvMjI4Mi8xMDQzCitmIDM4Ni8yMjgyLzEwNDMgMzkwLzIzMDAvMTA0MyA5ODYvMjI5OS8xMDQzCitmIDk0MS8yMzAxLzEyMDMgOTQwLzIyOTIvMTIwMyAzOTMvMjI5MS8xMjAzCitmIDM5My8yMjkxLzEyMDMgMzk1LzIzMDIvMTIwMyA5NDEvMjMwMS8xMjAzCitmIDk4Ny8yMjg2LzEyMDMgOTg4LzIzMDMvMTIwMyAzOTQvMjMwNC8xMjAzCitmIDM5NC8yMzA0LzEyMDMgMzkyLzIyODcvMTIwMyA5ODcvMjI4Ni8xMjAzCitmIDkzOC8yMzA1LzY4NyAxNDg5LzIzMDYvNjg3IDE0MDMvMjMwNy82ODcKK2YgMTQwMy8yMzA3LzY4NyAzODkvMjMwOC82ODcgOTM4LzIzMDUvNjg3CitmIDk5NS8yMzA5LzY4NyAxNDk0LzIzMTAvNjg3IDE0MDQvMjMxMS82ODcKK2YgMTQwNC8yMzExLzY4NyAzODUvMjMxMi82ODcgOTk1LzIzMDkvNjg3CitmIDk0Mi8yMzEzLzEyMzkgMTgxOC8yMzE0LzEyMzkgMTgxOS8yMzE1LzEyMzkKK2YgMTgyMC8yMzE2LzEyMzkgMzk3LzIzMTcvMTIzOSA5NDIvMjMxOC8xMjM5CitmIDk4NS8yMzE5LzEyMzkgOTg5LzIzMjAvMTIzOSAzOTYvMjMyMS8xMjM5CitmIDM5Ni8yMzIxLzEyMzkgMzg4LzIzMjIvMTIzOSA5ODUvMjMxOS8xMjM5CitmIDk0NS8yMzIzLzEwNDMgOTQzLzIyNzUvMTA0MyAzOTkvMjI3OC8xMDQzCitmIDM5OS8yMjc4LzEwNDMgNDAzLzIzMjQvMTA0MyA5NDUvMjMyMy8xMDQzCitmIDk5MC8yMjcyLzEwNDMgOTkyLzIzMjUvMTA0MyA0MDIvMjMyNi8xMDQzCitmIDQwMi8yMzI2LzEwNDMgMzk4LzIyNzMvMTA0MyA5OTAvMjI3Mi8xMDQzCitmIDk0Ni8yMzI3LzEwNDMgOTQ0LzIzMjgvMTA0MyA0MDEvMjMyOS8xMDQzCitmIDQwMS8yMzI5LzEwNDMgNDA1LzIzMzAvMTA0MyA5NDYvMjMyNy8xMDQzCitmIDk5MS8yMzMxLzEwNDMgOTkzLzIzMzIvMTA0MyA0MDQvMjMzMy8xMDQzCitmIDQwNC8yMzMzLzEwNDMgNDAwLzIzMzQvMTA0MyA5OTEvMjMzMS8xMDQzCitmIDQwMS8yMzI5LzEwNDMgOTQ0LzIzMjgvMTA0MyA5NjYvMjMzNS8xMDQzCitmIDk5MS8yMzMxLzEwNDMgNDAwLzIzMzQvMTA0MyA5OTgvMjMzNi8xMDQzCitmIDkzOS8yMjk3LzEwNDMgOTQ2LzIzMjcvMTA0MyA0MDUvMjMzMC8xMDQzCitmIDQwNS8yMzMwLzEwNDMgMzkxLzIyOTgvMTA0MyA5MzkvMjI5Ny8xMDQzCitmIDk5My8yMzMyLzEwNDMgOTg2LzIyOTkvMTA0MyAzOTAvMjMwMC8xMDQzCitmIDM5MC8yMzAwLzEwNDMgNDA0LzIzMzMvMTA0MyA5OTMvMjMzMi8xMDQzCitmIDQxNS8yMzM3LzEwNDMgNDI1LzIzMzgvMTA0MyA0MjYvMjMzOS8xMDQzCitmIDQyNi8yMzM5LzEwNDMgNDE0LzIzNDAvMTA0MyA0MTUvMjMzNy8xMDQzCitmIDM4Ni8yMjgyLzExODIgMzgzLzIyODEvMTE4MiAxODIxLzIzNDEvMTE4MgorZiAxODIyLzIzNDEvMTE4MiA0MDcvMjM0Mi8xMTgyIDM4Ni8yMjgyLzExODIKK2YgNDA5LzE1OTAvNjk3IDQwNi8xNTkzLzY5NyAxODIzLzIzNDMvNjk3CitmIDE4MjQvMjM0My82OTcgMzkyLzIyODcvNjk3IDQwOS8xNTkwLzY5NworZiAzOTAvMjMwMC8xMDQzIDM4Ni8yMjgyLzEwNDMgNDA3LzIzNDIvMTA0MworZiA0MDcvMjM0Mi8xMDQzIDQwOC8yMzQ0LzEwNDMgMzkwLzIzMDAvMTA0MworZiAzOTIvMjI4Ny8xMjAzIDM5NC8yMzA0LzEyMDMgNDEwLzIzNDUvMTIwMworZiA0MTAvMjM0NS8xMjAzIDQwOS8xNTkwLzEyMDMgMzkyLzIyODcvMTIwMworZiAzODUvMjMxMi82ODcgMTQwNC8yMzExLzY4NyAxNDA1LzIzNDYvNjg3CitmIDE0MDUvMjM0Ni82ODcgNDI4LzIzNDcvNjg3IDM4NS8yMzEyLzY4NworZiA0MTQvMjM0OC8xMjM5IDQyNi8yMzQ5LzEyMzkgNDI3LzIzNTAvMTIzOQorZiA0MjcvMjM1MC8xMjM5IDQxMy8yMzUxLzEyMzkgNDE0LzIzNDgvMTIzOQorZiA0MDAvMjMzNC8xMDQzIDQwNC8yMzMzLzEwNDMgNDEyLzIzNTIvMTA0MworZiA0MTIvMjM1Mi8xMDQzIDQxMS8yMzUzLzEwNDMgNDAwLzIzMzQvMTA0MworZiA0MDQvMjMzMy8xMDQzIDM5MC8yMzAwLzEwNDMgNDA4LzIzNDQvMTA0MworZiA0MDgvMjM0NC8xMDQzIDQxMi8yMzUyLzEwNDMgNDA0LzIzMzMvMTA0MworZiAzOTYvMjMyMS8xMjM5IDQxNC8yMzQ4LzEyMzkgNDEzLzIzNTEvMTIzOQorZiA0MTMvMjM1MS8xMjM5IDM4OC8yMzIyLzEyMzkgMzk2LzIzMjEvMTIzOQorZiA0MTQvMjM0MC8xMDQzIDM5Ni8yMjc0LzEwNDMgMzk4LzIyNzMvMTA0MworZiAzOTgvMjI3My8xMDQzIDQxNS8yMzM3LzEwNDMgNDE0LzIzNDAvMTA0MworZiA0MTUvMjMzNy8xMDQzIDM5OC8yMjczLzEwNDMgNDAyLzIzMjYvMTA0MworZiA0MDIvMjMyNi8xMDQzIDg5OC8yMzU0LzEwNDMgNDE1LzIzMzcvMTA0MworZiA0MDEvMjMyOS8xMDQzIDQxNy8yMzU1LzEwNDMgOTYzLzIzNTYvMTA0MworZiA5NjMvMjM1Ni8xMDQzIDk2MS8yMzU3LzEwNDMgNDAxLzIzMjkvMTA0MworZiAzOTkvMjI3OC8xMDQzIDM5Ny8yMjc3LzEwNDMgNDE5LzIzNTgvMTA0MworZiA0MTkvMjM1OC8xMDQzIDQxOC8yMzU5LzEwNDMgMzk5LzIyNzgvMTA0MworZiAxODI1LzIzNjAvMTIzOSA0MjAvMjM2MS8xMjM5IDQxOS8yMzYyLzEyMzkKK2YgNDE5LzIzNjMvMTIzOSAzOTcvMjM2NC8xMjM5IDE4MjYvMjM2NS8xMjM5CitmIDk0OS8yMzY2LzEwNjUgOTUwLzIzNjcvMTA2NSA0MjIvMjM2OC8xMDY1CitmIDQyMi8yMzY4LzEwNDMgNDE3LzIzNTUvMTA0MyA5NDkvMjM2Ni8xMDQzCitmIDQyMC8yMzYxLzEyMzkgNDI0LzIzNjkvMTIzOSA0MjMvMjM3MC8xMjM5CitmIDQyMy8yMzcwLzEyMzkgNDE5LzIzNjIvMTIzOSA0MjAvMjM2MS8xMjM5CitmIDE0MDYvMjM3MS82ODcgMTQwNS8yMzQ2LzY4NyAxODI3LzIzNzIvNjg3CitmIDE4MjgvMjM3My82ODcgMTgyOS8yMzc0LzY4NyAxNDA2LzIzNzUvNjg3CitmIDE0MDgvMjM3Ni82ODcgMTQwNy8yMzc3LzY4NyAxODMwLzIzNzgvNjg3CitmIDE4MzEvMjM3OS82ODcgMTgzMi8yMzgwLzY4NyAxNDA4LzIzODEvNjg3CitmIDM4OS8yMzA4LzY4NyAxNDAzLzIzMDcvNjg3IDE0MDgvMjM3Ni82ODcKK2YgMTQwOC8yMzc2LzY4NyAxODMzLzIzODIvNjg3IDM4OS8yMzA4LzY4NworZiAxNDkxLzIzODMvMTI3MiA5NTYvMjM4NC8xMjcyIDQ4Ni8yMzg1LzEyNzIKK2YgNDg2LzIzODUvMTI3MiAxNDEwLzIzODYvMTI3MiAxNDkxLzIzODMvMTI3MgorZiAxNDkwLzIzODcvMjIxIDE4MzQvMjM4OC8yMjEgMTgzNS8yMzg5LzIyMQorZiAxODM2LzIzOTAvMjIxIDk1Mi8yMzkxLzIyMSAxNDkwLzIzOTIvMjIxCitmIDkwMS8yMzkzLzExNzIgMTQ4NC8yMzk0LzExNzIgMTQxMi8yMzk1LzExNzIKK2YgMTQxMi8yMzk1LzExNzIgNDg5LzIzOTYvMTE3MiA5MDEvMjM5My8xMTcyCitmIDE0MTIvMjM5NS8xMjczIDE0MTMvMjM5Ny8xMjczIDQ5MC8yMzk4LzEyNzMKK2YgNDkwLzIzOTgvMTI3MyA0ODkvMjM5Ni8xMjczIDE0MTIvMjM5NS8xMjczCitmIDE0MzgvMjM5OS8xMjc0IDQ5MS8yNDAwLzEyNzQgNDkwLzIzOTgvMTI3NAorZiA0OTAvMjM5OC8xMjc1IDE0MTMvMjM5Ny8xMjc1IDE0MzgvMjM5OS8xMjc1CitmIDE0MzkvMjQwMS8yODYgNDMwLzI0MDIvMjg2IDQzNC8yNDAzLzI4NgorZiA0MzQvMjQwMy8xMjc2IDE0MTEvMjQwNC8xMjc2IDE0MzkvMjQwMS8xMjc2CitmIDE0MTUvMjQwNS82ODcgMTQyMi8yNDA2LzY4NyAzMzAvMjQwNy82ODcKK2YgMzMwLzI0MDcvNjg3IDQ3Mi8yNDA4LzY4NyAxNDE1LzI0MDUvNjg3CitmIDE1MDEvMjQwOS8yMjEgMTQxNi8yNDEwLzIyMSA0NzMvMjQxMS8yMjEKK2YgNDczLzI0MTEvMjIxIDEwNzQvMjQxMi8yMjEgMTUwMS8yNDA5LzIyMQorZiA0NzMvMjQxMS8yMjEgMTQxNi8yNDEwLzIyMSAxNDE3LzI0MTMvMjIxCitmIDE0MTcvMjQxMy8yMjEgNDc0LzI0MTQvMjIxIDQ3My8yNDExLzIyMQorZiAxNDE3LzI0MTMvMjIxIDE0MTgvMjQxNS8yMjEgNDc1LzI0MTYvMjIxCitmIDQ3NS8yNDE2LzIyMSA0NzQvMjQxNC8yMjEgMTQxNy8yNDEzLzIyMQorZiA0NzgvMjQxNy8xMTcyIDE0MjAvMjQxOC8xMTcyIDE0MTkvMjQxOS8xMTcyCitmIDE0MTkvMjQxOS8xMTcyIDQ3Ny8yNDIwLzExNzIgNDc4LzI0MTcvMTE3MgorZiAxNDIxLzI0MjEvMTE3MiAxNDIwLzI0MTgvMTE3MiA0NzgvMjQxNy8xMTcyCitmIDQ3OC8yNDE3LzExNzIgNDc5LzI0MjIvMTE3MiAxNDIxLzI0MjEvMTE3MgorZiAzMzAvMjQwNy82ODcgMTQyMi8yNDA2LzY4NyAxNDIzLzI0MjMvNjg3CitmIDE0MjMvMjQyMy82ODcgNDg0LzI0MjQvNjg3IDMzMC8yNDA3LzY4NworZiAxNDIzLzI0MjMvNjg3IDE0MTQvMjQyNS82ODcgNDcxLzI0MjYvNjg3CitmIDQ3MS8yNDI2LzY4NyA0ODQvMjQyNC82ODcgMTQyMy8yNDIzLzY4NworZiAxNDk3LzI0MjcvMTI0MiAxODM3LzI0MjgvMTI0MiAxODM4LzI0MjkvMTI0MgorZiAxODM5LzI0MzAvMTI0MiAxMDM3LzI0MzEvMTI0MiAxNDk3LzI0MzIvMTI0MgorZiAxNDM3LzI0MzMvMjIwIDQ3Ni8yNDM0LzIyMCA0NzUvMjQxNi8yMjAKK2YgNDc1LzI0MTYvMjE5IDE0MTgvMjQxNS8yMTkgMTQzNy8yNDMzLzIxOQorZiAxNDM2LzI0MzUvMTI0MyAzMTYvMjQzNi8xMjQzIDQ0NC8yNDM3LzEyNDMKK2YgNDQ0LzI0MzcvMTI3NyAxNDIxLzI0MjEvMTI3NyAxNDM2LzI0MzUvMTI3NworZiAxNDI1LzI0MzgvNjg3IDE0MzIvMjQzOS82ODcgMzQ0LzI0NDAvNjg3CitmIDM0NC8yNDQwLzY4NyA0NTgvMjQ0MS82ODcgMTQyNS8yNDM4LzY4NworZiAxNDk4LzI0NDIvMTI3OCAxNDI2LzI0NDMvMTI3OCA0NTkvMjQ0NC8xMjc4CitmIDQ1OS8yNDQ0LzEyNzkgMTAzNi8yNDQ1LzEyNzkgMTQ5OC8yNDQyLzEyNzkKK2YgNDU5LzI0NDQvMTI4MCAxNDI2LzI0NDMvMTI4MCAxNDI3LzI0NDYvMTI4MAorZiAxNDI3LzI0NDYvMjIxIDQ2MC8yNDQ3LzIyMSA0NTkvMjQ0NC8yMjEKK2YgMTQyNy8yNDQ2LzIxOSAxNDI4LzI0NDgvMjE5IDQ2MS8yNDQ5LzIxOQorZiA0NjEvMjQ0OS8yMjEgNDYwLzI0NDcvMjIxIDE0MjcvMjQ0Ni8yMjEKK2YgNDY0LzI0NTAvMTE3MiAxNDMwLzI0NTEvMTE3MiAxNDI5LzI0NTIvMTE3MgorZiAxNDI5LzI0NTIvMTE3MiA0NjMvMjQ1My8xMTcyIDQ2NC8yNDUwLzExNzIKK2YgMTQzMS8yNDU0LzExNzIgMTQzMC8yNDUxLzExNzIgNDY0LzI0NTAvMTE3MgorZiA0NjQvMjQ1MC8xMTcyIDQ2NS8yNDU1LzExNzIgMTQzMS8yNDU0LzExNzIKK2YgMzQ0LzI0NDAvNjg3IDE0MzIvMjQzOS82ODcgMTQzMy8yNDU2LzY4NworZiAxNDMzLzI0NTYvNjg3IDQ3MC8yNDU3LzY4NyAzNDQvMjQ0MC82ODcKK2YgMTQzMy8yNDU2LzY4NyAxNDI0LzI0NTgvNjg3IDQ1Ny8yNDU5LzY4NworZiA0NTcvMjQ1OS82ODcgNDcwLzI0NTcvNjg3IDE0MzMvMjQ1Ni82ODcKK2YgMTUwMy8yNDYwLzEyNDMgMTg0MC8yNDYxLzEyNDMgMTg0MS8yNDYyLzEyNDMKK2YgMTg0Mi8yNDYzLzEyNDMgMTA5MS8yNDY0LzEyNDMgMTUwMy8yNDY1LzEyNDMKK2YgMTQzNS8yNDY2LzExNzIgMzE1LzI0NjcvMTE3MiA0NTQvMjQ2OC8xMTcyCitmIDQ1NC8yNDY4LzExNzIgMTQzMS8yNDU0LzExNzIgMTQzNS8yNDY2LzExNzIKK2YgMTQzNC8yNDY5LzIyMSA0NjIvMjQ3MC8yMjEgNDYxLzI0NDkvMjIxCitmIDQ2MS8yNDQ5LzIyMSAxNDI4LzI0NDgvMjIxIDE0MzQvMjQ2OS8yMjEKK2YgMjg0LzI0NzEvMTI4MSAxODQzLzI0NzIvMTI4MSAxODQ0LzI0NzMvMTI4MQorZiAxODQ1LzI0NzQvMTI4MSA0NjkvMjQ3NS8xMjgxIDI4NC8yNDc2LzEyODEKK2YgMjg1LzI0NzcvMTI4MiAxODQ2LzI0NzgvMTI4MiAxODQ3LzI0NzkvMTI4MgorZiAxODQ4LzI0ODAvMTI4MiAyODYvMjQ4MS8xMjgyIDI4NS8yNDgyLzEyODIKK2YgMjg2LzI0ODMvMTI4MiAxODQ5LzI0ODQvMTI4MiAxODUwLzI0ODUvMTI4MgorZiAxODUxLzI0ODYvMTI4MyAyODcvMjQ4Ny8xMjgzIDI4Ni8yNDgxLzEyODMKK2YgMTg1Mi8yNDg4LzEyODQgMTg1My8yNDg5LzEyODQgMTg1NC8yNDkwLzEyODQKK2YgMTg1NS8yNDkxLzEyODUgMjg4LzI0OTIvMTI4NSAxODU2LzI0OTMvMTI4NQorZiAxODU3LzI0OTQvMTI4NiAxMDg5LzI0OTUvMTI4NiAyODkvMjE0NC8xMjg2CitmIDI4OS8yNDk2LzEyODcgMTg1OC8yNDk3LzEyODcgMTg1OS8yNDk4LzEyODcKK2YgMjkwLzI0OTkvMTI4OCAxODYwLzI1MDAvMTI4OCAxODYxLzI1MDEvMTI4OAorZiAxODYyLzI1MDIvMTI4OCAyODkvMjE0NC8xMjg4IDI5MC8yMTQzLzEyODgKK2YgMjkxLzI1MDMvMTI4OSAxODYzLzI1MDQvMTI4OSAxODY0LzI1MDUvMTI4OQorZiAxODY1LzI1MDYvMTI4OCAyOTAvMjE0Ny8xMjg4IDI5MS8yMTQ2LzEyODgKK2YgMTg2Ni8yNTA3LzEyOTAgNDY2LzI1MDgvMTI5MCAxODY3LzI1MDkvMTI5MAorZiAxODY4LzI1MTAvMTI5MSAxODY5LzI1MTEvMTI5MSAxODcwLzI1MTIvMTI5MQorZiAxODcxLzI1MTMvMTI5MiAxMzk2LzI1MTQvMTI5MiAxODcyLzI1MTUvMTI5MgorZiAxODczLzI1MTYvMTI5MiAxODc0LzI1MTcvMTI5MiAxODc1LzI1MTgvMTI5MgorZiAxODc2LzI1MTkvMTI5MyAxMzk3LzIxODQvMTI5MyA0NjgvMjUyMC8xMjkzCitmIDQ2OC8yNTIxLzEyOTMgMTg3Ny8yNTIyLzEyOTMgMTg3OC8yNTIzLzEyOTMKK2YgNDY5LzI1MjQvMTI4MSAxODc5LzI1MjUvMTI4MSAxODgwLzI1MjYvMTI4MQorZiAxODgxLzI1MjcvMTI4MSAzNDUvMjUyOC8xMjgxIDQ2OS8yNDc1LzEyODEKK2YgMzQ1LzI1MjkvMTI4MSAxODgyLzI1MzAvMTI4MSAxODgzLzI1MzEvMTI4MQorZiAxODg0LzI1MzIvMTI5NCAyODMvMjUzMy8xMjk0IDM0NS8yNTI4LzEyOTQKK2YgMTg4NS8yNTM0LzEyOTUgMTAzMi8yNTM1LzEyOTUgMjgzLzI1MzMvMTI5NQorZiAyODMvMjUzNi8xMjk2IDE4ODYvMjUzNy8xMjk2IDE4ODcvMjUzOC8xMjk2CitmIDMwNS8yNTM5LzEyOTcgMTg4OC8yNTQwLzEyOTcgMTg4OS8yNTQxLzEyOTcKK2YgMTg5MC8yNTQyLzEyOTcgNDgzLzI1NDMvMTI5NyAzMDUvMjU0NC8xMjk3CitmIDMwNi8yNTQ1LzEyOTggMTg5MS8yNTQ2LzEyOTggMTg5Mi8yNTQ3LzEyOTgKK2YgMTg5My8yNTQ4LzEyOTkgMzA3LzE4NjgvMTI5OSAzMDYvMTg2Ny8xMjk5CitmIDMwNy8yNTQ5LzEzMDAgMTg5NC8yNTUwLzEzMDAgMTg5NS8yNTUxLzEzMDAKK2YgMTg5Ni8yNTUyLzEzMDEgMTg5Ny8yNTUzLzEzMDEgMzA3LzI1NTQvMTMwMQorZiAxODk4LzI1NTUvMTMwMiAxODk5LzI1NTYvMTMwMiAxOTAwLzI1NTcvMTMwMgorZiAxOTAxLzI1NTgvMTMwMyAxOTAyLzI1NTkvMTMwMyAxOTAzLzI1NjAvMTMwMworZiAxOTA0LzI1NjEvMTMwNCAxMDMzLzI1NjIvMTMwNCAzMTAvMjU2My8xMzA0CitmIDMxMC8yNTY0LzEzMDUgMTkwNS8yNTY1LzEzMDUgMTkwNi8yNTY2LzEzMDUKK2YgMzExLzI1NjcvMTMwNCAxOTA3LzI1NjgvMTMwNCAxOTA4LzI1NjkvMTMwNAorZiAxOTA5LzI1NzAvMTMwNSAzMTAvMjU2My8xMzA1IDMxMS8yNTcxLzEzMDUKK2YgMzEyLzI1NzIvMTMwNiAxOTEwLzI1NzMvMTMwNiAxOTExLzI1NzQvMTMwNgorZiAxOTEyLzI1NzUvMTMwNCAzMTEvMjU3MS8xMzA0IDMxMi8yNTc2LzEzMDQKK2YgMzEzLzI1NzcvMTMwNyA0ODAvMjU3OC8xMzA3IDE5MTMvMjU3OS8xMzA3CitmIDE5MTQvMjU4MC8xMzA4IDMxMi8yNTgxLzEzMDggMzEzLzI1ODIvMTMwOAorZiAxOTE1LzI1ODMvMTI3MiAxMzk4LzI1ODQvMTI3MiA0ODEvMjU4NS8xMjcyCitmIDQ4MS8yNTg2LzEyNzIgMTkxNi8yNTg3LzEyNzIgMTkxNy8yNTg4LzEyNzIKK2YgMTkxOC8yNTg5LzQ5MyAxMzk5LzE3NDgvNDkzIDMwOS8xNzUxLzQ5MworZiAzMDkvMjU5MC80OTMgMTkxOS8yNTkxLzQ5MyAxOTIwLzI1OTIvNDkzCitmIDQ4My8yNTkzLzEyOTcgMTkyMS8yNTk0LzEyOTcgMTkyMi8yNTk1LzEyOTcKK2YgMTkyMy8yNTk2LzEzMDkgMzMxLzI1OTcvMTMwOSA0ODMvMjU0My8xMzA5CitmIDMzMS8yNTk4LzEzMDkgMTkyNC8yNTk5LzEzMDkgMTkyNS8yNjAwLzEzMDkKK2YgMTkyNi8yNjAxLzEzMDkgMzA0LzI2MDIvMTMwOSAzMzEvMjU5Ny8xMzA5CitmIDE5MjcvMjYwMy8xMzEwIDEwNzIvMjYwNC8xMzEwIDMwNC8yNjAyLzEzMTAKK2YgMzA0LzI2MDUvMTMxMSAxOTI4LzI2MDYvMTMxMSAxOTI5LzI2MDcvMTMxMQorZiA5MDgvMjYwOC8xMzEyIDkwNi8yNjA5LzEzMTIgNDIzLzI2MTAvMTMxMgorZiA0MjMvMjYxMC8xMzEzIDQ4Ny8yNjExLzEzMTMgOTA4LzI2MDgvMTMxMworZiA0MjQvMjYxMi8xMzE0IDQ4OC8yNjEyLzEzMTQgNDg3LzI2MTMvMTMxNAorZiA0ODcvMjYxNC8xMzE1IDQyMy8yMzcwLzEzMTUgNDI0LzIzNjkvMTMxNQorZiA5ODIvMjYxNS8xMzE2IDk4MC8yNjE2LzEzMTYgNDIxLzI2MTcvMTMxNgorZiA0MjEvMjYxNy8xMzE3IDQ4NS8yNjE3LzEzMTcgOTgyLzI2MTUvMTMxNworZiAxOTMwLzI2MTgvMTMxOCA0ODkvMjYxOS8xMzE4IDQ5MC8yNjIwLzEzMTgKK2YgNDkwLzI2MjEvMTMxOSAxOTMxLzI2MjIvMTMxOSAxOTMyLzI2MjMvMTMxOQorZiAxOTMzLzI2MjQvMTMyMCAxOTM0LzI2MjUvMTMyMCAxOTM1LzI2MjYvMTMyMAorZiAxOTM2LzI2MjcvMTMyMSAxOTM3LzI2MjgvMTMyMSAxOTM4LzI2MjkvMTMyMQorZiAxOTM5LzI2MzAvMTMyMiAxNDA2LzI2MzEvMTMyMiAxOTQwLzI2MzIvMTMyMgorZiAxOTQxLzI2MzMvMTMyMyAxOTQyLzI2MzQvMTMyMyAxOTQzLzI2MzUvMTMyMworZiAxOTQ0LzI2MzYvMTMyNCAxNDA3LzIzNzcvMTMyNCA0OTMvMjYzNy8xMzI0CitmIDQ5My8yNjM4LzEzMjUgMTk0NS8yNjM5LzEzMjUgMTk0Ni8yNjQwLzEzMjUKK2YgOTU2LzI2NDEvMTMyNiA5NTUvMjY0MS8xMzI2IDE5NDcvMjY0Mi8xMzI2CitmIDE5NDgvMjY0My8xMzI3IDQ4Ni8yMzg1LzEzMjcgOTU2LzIzODQvMTMyNworZiA1NzkvMjY0NC8xMzI4IDU3Ni8yNjQ1LzEzMjggNTg3LzI2NDYvMTMyOAorZiA1ODcvMjY0Ni8xMzI4IDU4OC8yNjQ3LzEzMjggNTc5LzI2NDQvMTMyOAorZiA1ODAvMjY0OC8xMzI5IDU3OS8yNjQ0LzEzMjkgNTg4LzI2NDcvMTMyOQorZiA1ODgvMjY0Ny8xMzI5IDU4OS8yNjQ5LzEzMjkgNTgwLzI2NDgvMTMyOQorZiA1ODEvMjY1MC8xMzMwIDE5NDkvMjY1MS8xMzMwIDE5NTAvMjY1Mi8xMzMwCitmIDE5NTEvMjY1My8xMzMwIDU5MC8yNjU0LzEzMzAgNTgxLzI2NTUvMTMzMAorZiA1ODIvMjY1Ni8xMzMxIDU4MS8yNjU1LzEzMzEgNTkwLzI2NTQvMTMzMQorZiA1OTAvMjY1NC8xMzMxIDU5MS8yNjU3LzEzMzEgNTgyLzI2NTYvMTMzMQorZiA1NzcvMjY1OC8yMjEgNDk2LzI2NTkvMjIxIDU5Ny8yNjYwLzIyMQorZiA1OTcvMjY2MC8yMjEgNTkyLzI2NjEvMjIxIDU3Ny8yNjU4LzIyMQorZiA1ODMvMjY2Mi8xMzMyIDU3Ny8yNjU4LzEzMzIgNTkyLzI2NjEvMTMzMgorZiA1OTIvMjY2MS8xMzMyIDU5My8yNjYzLzEzMzIgNTgzLzI2NjIvMTMzMgorZiA1ODYvMjY2NC8xMzMzIDU4NS8yNjY1LzEzMzMgNTk1LzI2NjYvMTMzMworZiA1OTUvMjY2Ni8xMzMzIDU5Ni8yNjY3LzEzMzMgNTg2LzI2NjQvMTMzMworZiA1ODUvMjY2NS8xMzM0IDU4NC8yNjY4LzEzMzQgNTk0LzI2NjkvMTMzNAorZiA1OTQvMjY2OS8xMzM0IDU5NS8yNjY2LzEzMzQgNTg1LzI2NjUvMTMzNAorZiAxOTUyLzI2NzAvMTMzNSA1ODMvMjY2Mi8xMzM1IDU5My8yNjYzLzEzMzUKK2YgNTkzLzI2NzEvMTMzNSAxOTUzLzI2NzIvMTMzNSAxOTU0LzI2NzMvMTMzNQorZiA2MjcvMjY3NC8yMTkgNjMzLzI2NzUvMjE5IDYzMi8yNjc2LzIxOQorZiA2MzIvMjY3Ni8yMjEgNjI4LzI2NzcvMjIxIDYyNy8yNjc0LzIyMQorZiA2NDAvMjY3OC8yMjEgNjM5LzI2NzkvMjIxIDYzNi8yNjgwLzIyMQorZiA2MzYvMjY4MC8yMjEgNjM1LzI2ODEvMjIxIDY0MC8yNjc4LzIyMQorZiA0OTcvMjY4Mi8xMzM2IDUwOS8yNjgzLzEzMzYgNTEwLzI2ODQvMTMzNgorZiA1MTAvMjY4NC8xMzM3IDQ5OC8yNjg1LzEzMzcgNDk3LzI2ODIvMTMzNworZiA0OTkvMjY4Ni8xMzM4IDQ5OC8yNjg1LzEzMzggNTEwLzI2ODQvMTMzOAorZiA1MTAvMjY4NC8xMzM5IDUxMS8yNjg3LzEzMzkgNDk5LzI2ODYvMTMzOQorZiA1MDAvMjY4OC8xMzQwIDE5NTUvMjY4OS8xMzQwIDE5NTYvMjY5MC8xMzQwCitmIDE5NTcvMjY5MS8xMzQxIDUxMi8yNjkyLzEzNDEgNTAwLzI2OTMvMTM0MQorZiA1MDEvMjY5NC8xMzQyIDUwMC8yNjkzLzEzNDIgNTEyLzI2OTIvMTM0MgorZiA1MTIvMjY5Mi8xMzQzIDUxMy8yNjk1LzEzNDMgNTAxLzI2OTQvMTM0MworZiA1MDgvMjY5Ni8xMzQ0IDUwMS8yNjk0LzEzNDQgNTEzLzI2OTUvMTM0NAorZiA1MTMvMjY5NS8xMzQ0IDUxNC8yNjk3LzEzNDQgNTA4LzI2OTYvMTM0NAorZiA2MjIvMjY5OC8xMzQ0IDUwOC8yNjk2LzEzNDQgNTE0LzI2OTcvMTM0NAorZiA1MTQvMjY5Ny8xMzQ0IDYyMC8yNjk5LzEzNDQgNjIyLzI2OTgvMTM0NAorZiA1MDcvMjcwMC8xMzQ0IDUxNS8yNzAxLzEzNDQgNTE2LzI3MDIvMTM0NAorZiA1MTYvMjcwMi8xMzQ0IDUwMi8yNzAzLzEzNDQgNTA3LzI3MDAvMTM0NAorZiA1MDIvMjcwMy8xMzQ1IDUxNi8yNzAyLzEzNDUgNTE3LzI3MDQvMTM0NQorZiA1MTcvMjcwNC8xMzQ2IDUwMy8yNzA1LzEzNDYgNTAyLzI3MDMvMTM0NgorZiA1MDQvMjcwNi8xMzQ3IDUwMy8yNzA1LzEzNDcgNTE3LzI3MDQvMTM0NworZiA1MTcvMjcwNC8xMzQ4IDUxOC8yNzA3LzEzNDggNTA0LzI3MDYvMTM0OAorZiA1MDUvMjcwOC8xMzQ5IDE5NTgvMjcwOS8xMzQ5IDE5NTkvMjcxMC8xMzQ5CitmIDE5NjAvMjcxMS8xMzUwIDUxOS8yNzEyLzEzNTAgNTA1LzI3MTMvMTM1MAorZiA1MDYvMjcxNC8xMzUxIDUwNS8yNzEzLzEzNTEgNTE5LzI3MTIvMTM1MQorZiA1MTkvMjcxMi8xMzUyIDUyMC8yNzE1LzEzNTIgNTA2LzI3MTQvMTM1MgorZiAxOTYxLzI3MTYvNjk3IDU0MS8yNzE3LzY5NyA1NDIvMjcxOC82OTcKK2YgNTQyLzI3MTkvNjk3IDE5NjIvMjcyMC82OTcgMTk2My8yNzIxLzY5NworZiAxOTY0LzI3MjIvNjk3IDE5NjUvMjcyMy82OTcgMTk2Ni8yNzI0LzY5NworZiAxOTY3LzI3MjUvNjk3IDU0My8yNzI2LzY5NyAxOTY4LzI3MjcvNjk3CitmIDE5NjkvMjcyOC82OTcgMTk3MC8yNzI5LzY5NyA1NDMvMjczMC82OTcKK2YgNTQzLzI3MzEvNjk3IDU0NC8yNzMyLzY5NyAxOTcxLzI3MzMvNjk3CitmIDE5NzIvMjczNC82OTcgMTk3My8yNzM1LzY5NyA1NDQvMjczNi82OTcKK2YgNTQ0LzI3MzIvNjk3IDU0NS8yNzM3LzY5NyAxOTc0LzI3MzgvNjk3CitmIDE5NzUvMjczOS82OTcgMTk3Ni8yNzQwLzY5NyA1NDUvMjc0MS82OTcKK2YgNTQ1LzI3MzcvNjk3IDU0Ni8yNzQyLzY5NyAxOTc3LzI3NDMvNjk3CitmIDE5NzgvMjc0NC82OTcgMTk3OS8yNzQ1LzY5NyA1NDYvMjc0Ni82OTcKK2YgNTQ2LzI3NDIvNjk3IDYyNS8yNzQ3LzY5NyAxOTgwLzI3NDgvNjk3CitmIDE5ODEvMjc0OS82OTcgNTQ3LzI3NTAvNjk3IDU0OC8yNzUxLzY5NworZiA1NDgvMjc1Mi82OTcgMTk4Mi8yNzUzLzY5NyAxOTgzLzI3NTQvNjk3CitmIDE5ODQvMjc1NS82OTcgMTk4NS8yNzU2LzY5NyA1NDgvMjc1Ny82OTcKK2YgNTQ4LzI3NTEvNjk3IDU0OS8yNzU4LzY5NyAxOTg2LzI3NTkvNjk3CitmIDE5ODcvMjc2MC82OTcgMTk4OC8yNzYxLzY5NyA1NDkvMjc2Mi82OTcKK2YgNTQ5LzI3NTgvNjk3IDU1MC8yNzYzLzY5NyAxOTg5LzI3NjQvNjk3CitmIDE5OTAvMjc2NS82OTcgMTk5MS8yNzY2LzY5NyAxOTkyLzI3NjcvNjk3CitmIDE5OTMvMjc2OC82OTcgNTUxLzI3NjkvNjk3IDE5OTQvMjc3MC82OTcKK2YgMTk5NS8yNzcxLzY5NyAxOTk2LzI3NzIvNjk3IDU1MS8yNzczLzY5NworZiA1NTEvMjc3NC82OTcgNTUyLzI3NzUvNjk3IDE5OTcvMjc3Ni82OTcKK2YgNDk4LzI2ODUvMTMyOCA1MzAvMjc3Ny8xMzI4IDUyOS8yNzc4LzEzMjgKK2YgNTI5LzI3NzgvMTMyOCA0OTcvMjY4Mi8xMzI4IDQ5OC8yNjg1LzEzMjgKK2YgNDk5LzI2ODYvMTMyOSA1MzEvMjc3OS8xMzI5IDUzMC8yNzc3LzEzMjkKK2YgNTMwLzI3NzcvMTMyOSA0OTgvMjY4NS8xMzI5IDQ5OS8yNjg2LzEzMjkKK2YgNTAwLzI2OTMvMTMzMCA1MzIvMjc4MC8xMzMwIDE5OTgvMjc4MS8xMzMwCitmIDE5OTkvMjc4Mi8xMzMwIDIwMDAvMjc4My8xMzMwIDUwMC8yNzg0LzEzMzAKK2YgNTAxLzI2OTQvMTM1MyA1MzMvMjc4NS8xMzUzIDUzMi8yNzgwLzEzNTMKK2YgNTMyLzI3ODAvMTM1MyA1MDAvMjY5My8xMzUzIDUwMS8yNjk0LzEzNTMKK2YgNTAyLzI3MDMvMjIxIDUzNC8yNzg2LzIyMSA1MzkvMjc4Ny8yMjEKK2YgNTM5LzI3ODcvMjIxIDUwNy8yNzAwLzIyMSA1MDIvMjcwMy8yMjEKK2YgNTAzLzI3MDUvMTMzMiA1MzUvMjc4OC8xMzMyIDUzNC8yNzg2LzEzMzIKK2YgNTM0LzI3ODYvMTMzMiA1MDIvMjcwMy8xMzMyIDUwMy8yNzA1LzEzMzIKK2YgNTA2LzI3MTQvMTMzMyA1MzgvMjc4OS8xMzMzIDUzNy8yNzkwLzEzMzMKK2YgNTM3LzI3OTAvMTMzMyA1MDUvMjcxMy8xMzMzIDUwNi8yNzE0LzEzMzMKK2YgNTA1LzI3MTMvMTMzNCA1MzcvMjc5MC8xMzM0IDUzNi8yNzkxLzEzMzQKK2YgNTM2LzI3OTEvMTMzNCAyMDAxLzI3OTIvMTMzNCA1MDUvMjcxMy8xMzM0CitmIDUwNC8yNzA2LzEzMzUgMjAwMi8yNzkzLzEzMzUgNTM1LzI3ODgvMTMzNQorZiA1MzUvMjc4OC8xMzM1IDUwMy8yNzA1LzEzMzUgNTA0LzI3MDYvMTMzNQorZiA1MDgvMjY5Ni8yMjEgNTQwLzI3OTQvMjIxIDUzMy8yNzg1LzIyMQorZiA1MzMvMjc4NS8yMjEgNTAxLzI2OTQvMjIxIDUwOC8yNjk2LzIyMQorZiA1NTQvMjc5NS8xMzU0IDU0Mi8yNzE4LzEzNTQgNTQxLzI3MTcvMTM1NAorZiA1NDEvMjcxNy8xMzU1IDU1My8yNzk2LzEzNTUgNTU0LzI3OTUvMTM1NQorZiA1NTUvMjc5Ny8xMzU2IDU0My8yNzMxLzEzNTYgMjAwMy8yNzk4LzEzNTYKK2YgMjAwNC8yNzk5LzEzNTcgMjAwNS8yODAwLzEzNTcgNTU1LzI4MDEvMTM1NworZiA1NTYvMjgwMi8xMzU4IDU0NC8yNzMyLzEzNTggNTQzLzI3MzEvMTM1OAorZiA1NDMvMjczMS8xMzU5IDU1NS8yNzk3LzEzNTkgNTU2LzI4MDIvMTM1OQorZiA1NTcvMjgwMy8xMzYwIDU0NS8yNzM3LzEzNjAgNTQ0LzI3MzIvMTM2MAorZiA1NDQvMjczMi8xMzYxIDU1Ni8yODAyLzEzNjEgNTU3LzI4MDMvMTM2MQorZiA1NDYvMjc0Mi8xMzYyIDU0NS8yNzM3LzEzNjIgNTU3LzI4MDMvMTM2MgorZiA1NTcvMjgwMy8xMzYyIDU1OC8yODA0LzEzNjIgNTQ2LzI3NDIvMTM2MgorZiA1NjAvMjgwNS8xMzYzIDU0OC8yNzUxLzEzNjMgNTQ3LzI3NTAvMTM2MworZiA1NDcvMjc1MC8xMzYyIDU1OS8yODA2LzEzNjIgNTYwLzI4MDUvMTM2MgorZiA1NjEvMjgwNy8xMzY0IDU0OS8yNzU4LzEzNjQgNTQ4LzI3NTEvMTM2NAorZiA1NDgvMjc1MS8xMzY1IDU2MC8yODA1LzEzNjUgNTYxLzI4MDcvMTM2NQorZiA1NjIvMjgwOC8xMzY2IDU1MC8yNzYzLzEzNjYgNTQ5LzI3NTgvMTM2NgorZiA1NDkvMjc1OC8xMzY3IDU2MS8yODA3LzEzNjcgNTYyLzI4MDgvMTM2NworZiA1NjMvMjgwOS8xMzY4IDU1MS8yNzc0LzEzNjggMjAwNi8yODEwLzEzNjgKK2YgMjAwNy8yODExLzEzNjkgMjAwOC8yODEyLzEzNjkgNTYzLzI4MTMvMTM2OQorZiA1NjQvMjgxNC8xMzcwIDU1Mi8yNzc1LzEzNzAgNTUxLzI3NzQvMTM3MAorZiA1NTEvMjc3NC8xMzcxIDU2My8yODA5LzEzNzEgNTY0LzI4MTQvMTM3MQorZiAxNDQwLzI4MTUvNjg3IDE0NDEvMjgxNi82ODcgNTI3LzI4MTcvNjg3CitmIDUyNy8yODE3LzY4NyA1MjgvMjgxOC82ODcgMTQ0MC8yODE1LzY4NworZiAxNDQxLzI4MTYvNjg3IDE0NDIvMjgxOS82ODcgNTI2LzI4MjAvNjg3CitmIDUyNi8yODIwLzY4NyA1MjcvMjgxNy82ODcgMTQ0MS8yODE2LzY4NworZiA1MjUvMjgyMS82ODcgNTI2LzI4MjAvNjg3IDE0NDIvMjgxOS82ODcKK2YgMTQ0Mi8yODE5LzY4NyAxNDQzLzI4MjIvNjg3IDUyNS8yODIxLzY4NworZiAxNDQ0LzI4MjMvNjg3IDQ5NS8yODI0LzY4NyAyMDA5LzI4MjUvNjg3CitmIDIwMTAvMjgyNi82ODcgMjAxMS8yODI3LzY4NyAxNDQ0LzI4MjgvNjg3CitmIDE0NDQvMjgyMy82ODcgMTQ0NS8yODI5LzY4NyA1NzgvMjgzMC82ODcKK2YgNTc4LzI4MzAvNjg3IDQ5NS8yODI0LzY4NyAxNDQ0LzI4MjMvNjg3CitmIDUyMy8yODMxLzY4NyA1MjQvMjgzMi82ODcgMTQ0Ni8yODMzLzY4NworZiAxNDQ2LzI4MzMvNjg3IDE0NDcvMjgzNC82ODcgNTIzLzI4MzEvNjg3CitmIDE0NDgvMjgzNS82ODcgNTIyLzI4MzYvNjg3IDUyMy8yODMxLzY4NworZiA1MjMvMjgzMS82ODcgMTQ0Ny8yODM0LzY4NyAxNDQ4LzI4MzUvNjg3CitmIDE0NDgvMjgzNS82ODcgMTQ0OS8yODM3LzY4NyA1MjEvMjgzOC82ODcKK2YgNTIxLzI4MzgvNjg3IDUyMi8yODM2LzY4NyAxNDQ4LzI4MzUvNjg3CitmIDIwMTIvMjgzOS82ODcgMTQ1MC8yODQwLzY4NyA0OTQvMjg0MS82ODcKK2YgNDk0LzI4NDIvNjg3IDIwMTMvMjg0My82ODcgMjAxNC8yODQ0LzY4NworZiAyMDE1LzI4NDUvMTM3MiAyMDE2LzI4NDYvMTM3MiAyMDE3LzI4NDcvMTM3MgorZiAyMDE4LzI4NDgvMTM3MyAyMDE5LzI4NDkvMTM3MyAyMDIwLzI4NTAvMTM3MworZiA1MjIvMjgzNi8xMzc0IDUyMS8yODM4LzEzNzQgMjAyMS8yODUxLzEzNzQKK2YgMjAyMi8yODUyLzEzNzUgMjAyMy8yODUzLzEzNzUgNTIyLzI4NTQvMTM3NQorZiA1MjMvMjgzMS8xMzc2IDUyMi8yODM2LzEzNzYgMjAyNC8yODU1LzEzNzYKK2YgMjAyNS8yODU2LzEzNzcgMjAyNi8yODU3LzEzNzcgNTIzLzI4NTgvMTM3NworZiA1MjQvMjgzMi8xMzc4IDUyMy8yODMxLzEzNzggMjAyNy8yODU5LzEzNzgKK2YgMjAyOC8yODYwLzEzNzkgMjAyOS8yODYxLzEzNzkgNTI0LzI4NjIvMTM3OQorZiA0OTUvMjgyNC8xMzgwIDU3OC8yODMwLzEzODAgMjAzMC8yODYzLzEzODAKK2YgMjAzMS8yODY0LzEzODEgMjAzMi8yODY1LzEzODEgNDk1LzI4NjYvMTM4MQorZiAyMDMzLzI4NjcvMTM4MiA0OTUvMjg2OC8xMzgyIDIwMzQvMjg2OS8xMzgyCitmIDIwMzUvMjg3MC8xMzgzIDIwMzYvMjg3MS8xMzgzIDIwMzcvMjg3Mi8xMzgzCitmIDIwMzgvMjg3My8xMzg0IDIwMzkvMjg3NC8xMzg0IDIwNDAvMjg3NS8xMzg0CitmIDIwNDEvMjg3Ni8xMzg1IDIwNDIvMjg3Ny8xMzg1IDIwNDMvMjg3OC8xMzg1CitmIDUyNy8yODE3LzEzODYgNTI2LzI4MjAvMTM4NiAyMDQ0LzI4NzkvMTM4NgorZiAyMDQ1LzI4ODAvMTM4NyAyMDQ2LzI4ODEvMTM4NyA1MjcvMjg4Mi8xMzg3CitmIDUyNi8yODIwLzEzODggNTI1LzI4MjEvMTM4OCAyMDQ3LzI4ODMvMTM4OAorZiAyMDQ4LzI4ODQvMTM4OSAyMDQ5LzI4ODUvMTM4OSA1MjYvMjg4Ni8xMzg5CitmIDYzNy8yODg3LzEzODEgMjA1MC8yODg4LzEzODEgMjA1MS8yODg5LzEzODEKK2YgMjA1Mi8yODkwLzEzOTAgNjM4LzI4OTEvMTM5MCA2MzcvMjg5Mi8xMzkwCitmIDYxMC8yODkzLzEzMjggNTg4LzI2NDcvMTMyOCA1ODcvMjY0Ni8xMzI4CitmIDU4Ny8yNjQ2LzEzMjggNjA5LzI4OTQvMTMyOCA2MTAvMjg5My8xMzI4CitmIDYxMS8yODk1LzEzMjkgNTg5LzI2NDkvMTMyOSA1ODgvMjY0Ny8xMzI5CitmIDU4OC8yNjQ3LzEzMjkgNjEwLzI4OTMvMTMyOSA2MTEvMjg5NS8xMzI5CitmIDYxMi8yODk2LzEzMzAgNTkwLzI2NTQvMTMzMCAyMDUzLzI2NTMvMTMzMAorZiAyMDU0LzI4OTcvMTMzMCAyMDU1LzI4OTgvMTMzMCA2MTIvMjg5OS8xMzMwCitmIDYxMy8yOTAwLzEzMzEgNTkxLzI2NTcvMTMzMSA1OTAvMjY1NC8xMzMxCitmIDU5MC8yNjU0LzEzNTMgNjEyLzI4OTYvMTM1MyA2MTMvMjkwMC8xMzUzCitmIDYxNC8yOTAxLzIyMSA1OTIvMjY2MS8yMjEgNTk3LzI2NjAvMjIxCitmIDU5Ny8yNjYwLzIyMSA2MTkvMjkwMi8yMjEgNjE0LzI5MDEvMjIxCitmIDYxNS8yOTAzLzEzMzIgNTkzLzI2NjMvMTMzMiA1OTIvMjY2MS8xMzMyCitmIDU5Mi8yNjYxLzEzMzIgNjE0LzI5MDEvMTMzMiA2MTUvMjkwMy8xMzMyCitmIDYxOC8yOTA0LzEzMzMgNTk2LzI2NjcvMTMzMyA1OTUvMjY2Ni8xMzMzCitmIDU5NS8yNjY2LzEzMzMgNjE3LzI5MDUvMTMzMyA2MTgvMjkwNC8xMzMzCitmIDYxNy8yOTA1LzEzMzQgNTk1LzI2NjYvMTMzNCA1OTQvMjY2OS8xMzM0CitmIDU5NC8yNjY5LzEzMzQgNjE2LzI5MDYvMTMzNCA2MTcvMjkwNS8xMzM0CitmIDIwNTYvMjkwNy8xMzM1IDIwNTcvMjkwOC8xMzM1IDU5My8yOTA5LzEzMzUKK2YgNTkzLzI2NjMvMTMzNSA2MTUvMjkwMy8xMzM1IDIwNTgvMjkxMC8xMzM1CitmIDY0MC8yNjc4LzIyMSA2MzUvMjY4MS8yMjEgMTA5NC8yOTExLzIyMQorZiAxMDk0LzI5MTEvMjIxIDEwOTUvMjkxMi8yMjEgNjQwLzI2NzgvMjIxCitmIDY1MC8yOTEzLzEzMjggNTk5LzI5MTQvMTMyOCA1OTgvMjkxNS8xMzI4CitmIDU5OC8yOTE1LzEzMjggNjQ5LzI5MTYvMTMyOCA2NTAvMjkxMy8xMzI4CitmIDY1MS8yOTE3LzEzMjkgNjAwLzI5MTgvMTMyOSA1OTkvMjkxNC8xMzI5CitmIDU5OS8yOTE0LzEzMjkgNjUwLzI5MTMvMTMyOSA2NTEvMjkxNy8xMzI5CitmIDY1Mi8yOTE5LzEzMzAgNjAxLzI5MjAvMTMzMCAyMDU5LzI5MjEvMTMzMAorZiAyMDYwLzI5MjIvMTMzMCAyMDYxLzI5MjMvMTMzMCA2NTIvMjkyNC8xMzMwCitmIDY1My8yOTI1LzEzNTMgNjAyLzI5MjYvMTM1MyA2MDEvMjkyMC8xMzUzCitmIDYwMS8yOTIwLzEzNTMgNjUyLzI5MTkvMTM1MyA2NTMvMjkyNS8xMzUzCitmIDY1NC8yOTI3LzIyMSA2MDMvMjkyOC8yMjEgNjA4LzI5MjkvMjIxCitmIDYwOC8yOTI5LzIyMSA2NTkvMjkzMC8yMjEgNjU0LzI5MjcvMjIxCitmIDY1NS8yOTMxLzEzMzIgNjA0LzI5MzIvMTMzMiA2MDMvMjkyOC8xMzMyCitmIDYwMy8yOTI4LzEzMzIgNjU0LzI5MjcvMTMzMiA2NTUvMjkzMS8xMzMyCitmIDY1OC8yOTMzLzEzMzMgNjA3LzI5MzQvMTMzMyA2MDYvMjkzNS8xMzMzCitmIDYwNi8yOTM1LzEzMzMgNjU3LzI5MzYvMTMzMyA2NTgvMjkzMy8xMzMzCitmIDY1Ny8yOTM2LzEzMzQgNjA2LzI5MzUvMTMzNCA2MDUvMjkzNy8xMzM0CitmIDYwNS8yOTM3LzEzMzQgNjU2LzI5MzgvMTMzNCA2NTcvMjkzNi8xMzM0CitmIDIwNjIvMjkzOS8xMzM1IDIwNjMvMjk0MC8xMzM1IDYwNC8yOTQxLzEzMzUKK2YgNjA0LzI5MzIvMTMzNSA2NTUvMjkzMS8xMzM1IDIwNjQvMjk0Mi8xMzM1CitmIDU5OS8yOTE0LzEzMjggNjEwLzI4OTMvMTMyOCA2MDkvMjg5NC8xMzI4CitmIDYwOS8yODk0LzEzMjggNTk4LzI5MTUvMTMyOCA1OTkvMjkxNC8xMzI4CitmIDYwMC8yOTE4LzEzMjkgNjExLzI4OTUvMTMyOSA2MTAvMjg5My8xMzI5CitmIDYxMC8yODkzLzEzMjkgNTk5LzI5MTQvMTMyOSA2MDAvMjkxOC8xMzI5CitmIDYwMS8yOTIwLzEzMzAgNjEyLzI4OTYvMTMzMCAyMDY1LzI5NDMvMTMzMAorZiAyMDY2LzI5NDQvMTMzMCAyMDY3LzI5NDUvMTMzMCA2MDEvMjk0Ni8xMzMwCitmIDYwMi8yOTI2LzEzNTMgNjEzLzI5MDAvMTM1MyA2MTIvMjg5Ni8xMzUzCitmIDYxMi8yODk2LzEzNTMgNjAxLzI5MjAvMTM1MyA2MDIvMjkyNi8xMzUzCitmIDYwMy8yOTI4LzIyMSA2MTQvMjkwMS8yMjEgNjE5LzI5MDIvMjIxCitmIDYxOS8yOTAyLzIyMSA2MDgvMjkyOS8yMjEgNjAzLzI5MjgvMjIxCitmIDYwNC8yOTMyLzEzMzIgNjE1LzI5MDMvMTMzMiA2MTQvMjkwMS8xMzMyCitmIDYxNC8yOTAxLzEzMzIgNjAzLzI5MjgvMTMzMiA2MDQvMjkzMi8xMzMyCitmIDYwNy8yOTM0LzEzMzMgNjE4LzI5MDQvMTMzMyA2MTcvMjkwNS8xMzMzCitmIDYxNy8yOTA1LzEzMzMgNjA2LzI5MzUvMTMzMyA2MDcvMjkzNC8xMzMzCitmIDYwNi8yOTM1LzEzMzQgNjE3LzI5MDUvMTMzNCA2MTYvMjkwNi8xMzM0CitmIDYxNi8yOTA2LzEzMzQgNjA1LzI5MzcvMTMzNCA2MDYvMjkzNS8xMzM0CitmIDIwNjgvMjk0Ny8xMzM1IDIwNjkvMjk0OC8xMzM1IDYxNS8yOTQ5LzEzMzUKK2YgNjE1LzI5MDMvMTMzNSA2MDQvMjkzMi8xMzM1IDIwNzAvMjk1MC8xMzM1CitmIDUwOC8yNjk2LzIyMSA2MjIvMjY5OC8yMjEgNjI0LzI5NTEvMjIxCitmIDYyNC8yOTUxLzIyMSA1NDAvMjc5NC8yMjEgNTA4LzI2OTYvMjIxCitmIDU1OC8yODA0LzEzNjIgNjI2LzI5NTIvMTM2MiA2MjUvMjc0Ny8xMzYyCitmIDYyNS8yNzQ3LzEzNjIgNTQ2LzI3NDIvMTM2MiA1NTgvMjgwNC8xMzYyCitmIDE0NTEvMjk1My82ODcgMTQ1NS8yOTU0LzY4NyA2MzQvMjk1NS82ODcKK2YgNjM0LzI5NTUvNjg3IDYyMy8yOTU2LzY4NyAxNDUxLzI5NTMvNjg3CitmIDIwNzEvMjk1Ny8xMzkxIDIwNzIvMjk1OC8xMzkxIDYyMy8yOTU5LzEzOTEKK2YgNjIzLzI5NTYvMTM5MiA2MzQvMjk1NS8xMzkyIDIwNzMvMjk2MC8xMzkyCitmIDY2MC8yOTYxLzIyMSA2MjkvMjk2Mi8yMjEgMTA5My8yOTYzLzIyMQorZiAxMDkzLzI5NjMvMjIxIDY2MS8yOTY0LzIyMSA2NjAvMjk2MS8yMjEKK2YgNjMwLzI5NjUvMjIxIDExMDIvMjk2Ni8yMjEgMTEwNi8yOTY3LzIyMQorZiAxMTA2LzI5NjcvMjIxIDYyOS8yOTYyLzIyMSA2MzAvMjk2NS8yMjEKK2YgNjQyLzI5NjgvMjIxIDExMDMvMjk2OS8yMjEgMTEwMi8yOTY2LzIyMQorZiAxMTAyLzI5NjYvMjIxIDYzMi8yNjc2LzIyMSA2NDIvMjk2OC8yMjEKK2YgNjQzLzI5NzAvMjIxIDY0Mi8yOTY4LzIyMSA2MzIvMjY3Ni8yMjEKK2YgNjMyLzI2NzYvMTM5MyA2MzMvMjY3NS8xMzkzIDY0My8yOTcwLzEzOTMKK2YgNjQ0LzI5NzEvMTM5NCAyMDc0LzI5NzIvMTM5NCAyMDc1LzI5NzMvMTM5NAorZiAyMDc2LzI5NjAvMTM5NSA2MzQvMjk1NS8xMzk1IDY0NC8yOTc0LzEzOTUKK2YgNjUzLzI5MjUvMjIxIDY2MS8yOTY0LzIyMSAxMDkzLzI5NjMvMjIxCitmIDEwOTMvMjk2My8yMjEgNjAyLzI5MjYvMjIxIDY1My8yOTI1LzIyMQorZiAxMDk0LzI5MTEvMjIxIDYxMy8yOTAwLzIyMSA2MDIvMjkyNi8yMjEKK2YgNjAyLzI5MjYvMjIxIDEwOTgvMjk3NS8yMjEgMTA5NC8yOTExLzIyMQorZiA2MzUvMjY4MS8yMjEgNTkxLzI2NTcvMjIxIDYxMy8yOTAwLzIyMQorZiA2MTMvMjkwMC8yMjEgMTA5NC8yOTExLzIyMSA2MzUvMjY4MS8yMjEKK2YgNjM1LzI2ODEvMjIxIDYzNi8yNjgwLzIyMSA1ODIvMjY1Ni8yMjEKK2YgNTgyLzI2NTYvMjIxIDU5MS8yNjU3LzIyMSA2MzUvMjY4MS8yMjEKK2YgMjA3Ny8yOTc2LzEzOTAgNjM3LzI4OTIvMTM5MCA1MjQvMjgzMi8xMzkwCitmIDUyNC8yOTc3LzEzOTAgMjA3OC8yOTc4LzEzOTAgMjA3OS8yOTc5LzEzOTAKK2YgNjM3LzI4OTIvNjg3IDE0NTIvMjk4MC82ODcgMTQ0Ni8yODMzLzY4NworZiAxNDQ2LzI4MzMvNjg3IDUyNC8yODMyLzY4NyA2MzcvMjg5Mi82ODcKK2YgMTQ1Mi8yOTgwLzY4NyA2MzcvMjg5Mi82ODcgNjM4LzI4OTEvNjg3CitmIDYzOC8yODkxLzY4NyAxNDUzLzI5ODEvNjg3IDE0NTIvMjk4MC82ODcKK2YgMTQ1NC8yOTgyLzY4NyA2NDQvMjk3NC82ODcgNjM0LzI5NTUvNjg3CitmIDYzNC8yOTU1LzY4NyAxNDU1LzI5NTQvNjg3IDE0NTQvMjk4Mi82ODcKK2YgNTMwLzI3NzcvMTMyOCA2NTAvMjkxMy8xMzI4IDY0OS8yOTE2LzEzMjgKK2YgNjQ5LzI5MTYvMTMyOCA1MjkvMjc3OC8xMzI4IDUzMC8yNzc3LzEzMjgKK2YgNTMxLzI3NzkvMTMyOSA2NTEvMjkxNy8xMzI5IDY1MC8yOTEzLzEzMjkKK2YgNjUwLzI5MTMvMTMyOSA1MzAvMjc3Ny8xMzI5IDUzMS8yNzc5LzEzMjkKK2YgNTMyLzI3ODAvMTMzMCA2NTIvMjkxOS8xMzMwIDIwODAvMjk4My8xMzMwCitmIDIwODEvMjk4NC8xMzMwIDIwODIvMjk4NS8xMzMwIDUzMi8yOTg2LzEzMzAKK2YgNTMzLzI3ODUvMTM1MyA2NTMvMjkyNS8xMzUzIDY1Mi8yOTE5LzEzNTMKK2YgNjUyLzI5MTkvMTM1MyA1MzIvMjc4MC8xMzUzIDUzMy8yNzg1LzEzNTMKK2YgNTM0LzI3ODYvMjIxIDY1NC8yOTI3LzIyMSA2NTkvMjkzMC8yMjEKK2YgNjU5LzI5MzAvMjIxIDUzOS8yNzg3LzIyMSA1MzQvMjc4Ni8yMjEKK2YgNTM1LzI3ODgvMTMzMiA2NTUvMjkzMS8xMzMyIDY1NC8yOTI3LzEzMzIKK2YgNjU0LzI5MjcvMTMzMiA1MzQvMjc4Ni8xMzMyIDUzNS8yNzg4LzEzMzIKK2YgNTM4LzI3ODkvMTMzMyA2NTgvMjkzMy8xMzMzIDY1Ny8yOTM2LzEzMzMKK2YgNjU3LzI5MzYvMTMzMyA1MzcvMjc5MC8xMzMzIDUzOC8yNzg5LzEzMzMKK2YgNTM3LzI3OTAvMTMzNCA2NTcvMjkzNi8xMzM0IDY1Ni8yOTM4LzEzMzQKK2YgNjU2LzI5MzgvMTMzNCA1MzYvMjc5MS8xMzM0IDUzNy8yNzkwLzEzMzQKK2YgMjA4My8yOTg3LzEzMzUgMjA4NC8yOTg4LzEzMzUgNjU1LzI5ODkvMTMzNQorZiA2NTUvMjkzMS8xMzM1IDUzNS8yNzg4LzEzMzUgMjA4NS8yNzkzLzEzMzUKK2YgNjI0LzI5NTEvMjIxIDY2MC8yOTYxLzIyMSA2NjEvMjk2NC8yMjEKK2YgNjYxLzI5NjQvMjIxIDU0MC8yNzk0LzIyMSA2MjQvMjk1MS8yMjEKK2YgNTQwLzI3OTQvMjIxIDY2MS8yOTY0LzIyMSA2NTMvMjkyNS8yMjEKK2YgNjUzLzI5MjUvMjIxIDUzMy8yNzg1LzIyMSA1NDAvMjc5NC8yMjEKK2YgMTQ1Ni8yOTkwLzEzOTYgNjY4LzI5OTEvMTM5NiA2NjkvMjk5Mi8xMzk2CitmIDY2OS8yOTkyLzEzOTcgMTQ1Ny8yOTkzLzEzOTcgMTQ1Ni8yOTkwLzEzOTcKK2YgMTQ1OC8yOTk0LzEzOTggMTUwNS8yOTk1LzEzOTggMTEwMS8yOTk2LzEzOTgKK2YgMTEwMS8yOTk2LzEzOTkgNjcwLzI5OTcvMTM5OSAxNDU4LzI5OTQvMTM5OQorZiAxNDU5LzI5OTgvMTQwMCAxNTA2LzI5OTkvMTQwMCAxMTA1LzMwMDAvMTQwMAorZiAxMTA1LzMwMDAvMTQwMSA2NzEvMzAwMS8xNDAxIDE0NTkvMjk5OC8xNDAxCitmIDE0NTkvMjk5OC8xNDAyIDY3MS8zMDAxLzE0MDIgNjcyLzMwMDIvMTQwMgorZiA2NzIvMzAwMi8xNDAzIDE0NjAvMzAwMy8xNDAzIDE0NTkvMjk5OC8xNDAzCitmIDE0NjEvMzAwNC8xNDA0IDE0NTYvMjk5MC8xNDA0IDY2Mi8zMDA1LzE0MDQKK2YgNjYyLzMwMDUvMTQwNSA2NDYvMzAwNi8xNDA1IDE0NjEvMzAwNC8xNDA1CitmIDE0NjIvMzAwNy8xNDA2IDE0NjAvMzAwMy8xNDA2IDY3Mi8zMDAyLzE0MDYKK2YgNjcyLzMwMDIvMTQwNyA2NzMvMzAwOC8xNDA3IDE0NjIvMzAwNy8xNDA3CitmIDYzOC8zMDA5LzE0MDggMjA4Ni8zMDEwLzE0MDggMjA4Ny8zMDExLzE0MDgKK2YgMjA4OC8zMDEyLzE0MDkgNjY3LzMwMTMvMTQwOSA2MzgvMjg5MS8xNDA5CitmIDYzOS8yNjc5LzE0MTAgNjQwLzI2NzgvMTQxMCAyMDg5LzMwMTQvMTQxMAorZiAyMDkwLzMwMTUvMTQxMSAyMDkxLzMwMTYvMTQxMSA2MzkvMzAxNy8xNDExCitmIDEwOTcvMzAxOC8xNDEyIDIwOTIvMzAxOS8xNDEyIDIwOTMvMzAyMC8xNDEyCitmIDIwOTQvMzAyMS8xNDEzIDIwOTUvMzAyMi8xNDEzIDEwOTcvMzAyMy8xNDEzCitmIDExMDkvMzAyNC8xNDE0IDIwOTYvMzAyNS8xNDE0IDY0MS8zMDI1LzE0MTQKK2YgNjQxLzMwMjUvMTQxNSAxMTA3LzMwMjYvMTQxNSAxMTA5LzMwMjQvMTQxNQorZiA2NDIvMjk2OC8xNDE2IDY0My8yOTcwLzE0MTYgMjA5Ny8zMDI3LzE0MTYKK2YgMjA5OC8zMDI4LzE0MTcgMjA5OS8zMDI5LzE0MTcgNjQyLzMwMzAvMTQxNworZiAyMTAwLzMwMzEvMTQxOCA2NDQvMzAzMi8xNDE4IDIxMDEvMzAzMy8xNDE4CitmIDIxMDIvMzAzNC8xNDE5IDIxMDMvMzAzNS8xNDE5IDIxMDQvMzAzNi8xNDE5CitmIDIxMDUvMzAzNy8xNDIwIDIxMDYvMzAzOC8xNDIwIDY3NC8zMDM5LzE0MjAKK2YgNjc0LzMwNDAvMTQyMSAxNDUzLzI5ODEvMTQyMSAyMTA3LzMwNDEvMTQyMQorZiAyMTA4LzMwNDIvMTQyMiAyMTA5LzMwNDMvMTQyMiA2NDQvMzA0NC8xNDIyCitmIDY0NC8yOTc0LzE0MjMgMTQ1NC8yOTgyLzE0MjMgMjExMC8zMDQ1LzE0MjMKK2YgMTQ1MC8yODQwLzY4NyAxMzg2LzIyMTYvNjg3IDEyNy8yMjE1LzY4NworZiAxMjcvMjIxNS82ODcgNDk0LzI4NDEvNjg3IDE0NTAvMjg0MC82ODcKK2YgNDk0LzMwNDYvMTIzOCAxMjcvMzA0Ny8xMjM4IDIxMTEvMzA0OC8xMjM4CitmIDIxMTIvMzA0OS8xMjM4IDIxMTMvMzA1MC8xMjM4IDQ5NC8zMDUxLzEyMzgKK2YgNTc2LzI2NDUvMTA0NCA0Ny8xNTIxLzEwNDQgMTQyLzE1MjAvMTA0NAorZiAxNDIvMTUyMC8xMDQ0IDU4Ny8yNjQ2LzEwNDQgNTc2LzI2NDUvMTA0NAorZiA1ODcvMjY0Ni8xMDQ0IDE0Mi8xNTIwLzEwNDQgMTk0LzIyMjMvMTA0NAorZiAxOTQvMjIyMy8xMDQ0IDYwOS8yODk0LzEwNDQgNTg3LzI2NDYvMTA0NAorZiA2MDkvMjg5NC8xMDQ0IDE5NC8yMjIzLzEwNDQgMTU4LzIyMjUvMTA0NAorZiAxNTgvMjIyNS8xMDQ0IDU5OC8yOTE1LzEwNDQgNjA5LzI4OTQvMTA0NAorZiA1OTgvMjkxNS8xMDQ0IDE1OC8yMjI1LzEwNDQgMjEyLzIyMjQvMTA0NAorZiAyMTIvMjIyNC8xMDQ0IDY0OS8yOTE2LzEwNDQgNTk4LzI5MTUvMTA0NAorZiA2NDkvMjkxNi8xMDQ0IDIxMi8yMjI0LzEwNDQgNjIvMjIxMy8xMDQ0CitmIDYyLzIyMTMvMTA0NCA1MjkvMjc3OC8xMDQ0IDY0OS8yOTE2LzEwNDQKK2YgNTI5LzI3NzgvMTA0NCA2Mi8yMjEzLzEwNDQgMTkvMTU0MS8xMDQ0CitmIDE5LzE1NDEvMTA0NCA0OTcvMjY4Mi8xMDQ0IDUyOS8yNzc4LzEwNDQKK2YgNTA5LzI2ODMvMTE4NCA0OTcvMjY4Mi8xMTg0IDE5LzE1NDEvMTE4NAorZiAxOS8xNTQxLzExODQgMjcvMTU0MC8xMTg0IDUwOS8yNjgzLzExODQKK2YgNzAvMTU5OS82OTcgNTQxLzI3MTcvNjk3IDIxMTQvMjcxNi82OTcKK2YgMjExNS8zMDUyLzY5NyAyMTE2LzMwNTMvNjk3IDcwLzMwNTQvNjk3CitmIDU1My8yNzk2LzEyMDUgNTQxLzI3MTcvMTIwNSA3MC8xNTk5LzEyMDUKK2YgNzAvMTU5OS8xMjA0IDg2LzIyMTQvMTIwNCA1NTMvMjc5Ni8xMjA0CitmIDU2NC8yODE0LzEyMDMgODUvMTY5MC8xMjAzIDY5LzE2OTMvMTIwMworZiA2OS8xNjkzLzEyMDMgNTUyLzI3NzUvMTIwMyA1NjQvMjgxNC8xMjAzCitmIDIxMTcvMzA1NS82OTcgMjExOC8zMDU2LzY5NyA1NTIvMzA1Ny82OTcKK2YgNTUyLzI3NzUvNjk3IDY5LzE2OTMvNjk3IDIxMTkvMzA1OC82OTcKK2YgNTIwLzI3MTUvMTE4MyAyNi8yMjQ5LzExODMgMTYvMTY3MC8xMTgzCitmIDE2LzE2NzAvMTE4MiA1MDYvMjcxNC8xMTgyIDUyMC8yNzE1LzExODIKK2YgNTA2LzI3MTQvMTA0MyAxNi8xNjcwLzEwNDMgNTkvMTY3My8xMDQzCitmIDU5LzE2NzMvMTA0MyA1MzgvMjc4OS8xMDQzIDUwNi8yNzE0LzEwNDMKK2YgNTM4LzI3ODkvMTA0MyA1OS8xNjczLzEwNDMgMjA5LzE5MDYvMTA0MworZiAyMDkvMTkwNi8xMDQzIDY1OC8yOTMzLzEwNDMgNTM4LzI3ODkvMTA0MworZiA2NTgvMjkzMy8xMDQzIDIwOS8xOTA2LzEwNDMgMTU1LzE5MDkvMTA0MworZiAxNTUvMTkwOS8xMDQzIDYwNy8yOTM0LzEwNDMgNjU4LzI5MzMvMTA0MworZiA2MDcvMjkzNC8xMDQzIDE1NS8xOTA5LzEwNDMgMTkxLzE4NjIvMTA0MworZiAxOTEvMTg2Mi8xMDQzIDYxOC8yOTA0LzEwNDMgNjA3LzI5MzQvMTA0MworZiA2MTgvMjkwNC8xMDQzIDE5MS8xODYyLzEwNDMgMTM5LzE4NjUvMTA0MworZiAxMzkvMTg2NS8xMDQzIDU5Ni8yNjY3LzEwNDMgNjE4LzI5MDQvMTA0MworZiA1OTYvMjY2Ny8xMDQzIDEzOS8xODY1LzEwNDMgMy8yMjQ3LzEwNDMKK2YgMy8yMjQ3LzEwNDMgNTg2LzI2NjQvMTA0MyA1OTYvMjY2Ny8xMDQzCitmIDU4Ni8zMDU5LzEyMzkgMy8zMDYwLzEyMzkgMjEyMC8zMDYxLzEyMzkKK2YgMjEyMS8zMDYyLzEyMzkgMjEyMi8zMDYzLzEyMzkgNTg2LzMwNjQvMTIzOQorZiAxNDQwLzI4MTUvNjg3IDEzODcvMTc1NC82ODcgMTEwLzMwNjUvNjg3CitmIDExMC8zMDY1LzY4NyA1NjUvMzA2Ni82ODcgMTQ0MC8yODE1LzY4NworZiA2ODgvMzA2Ny82ODcgMTQ2NS8zMDY4LzY4NyAxNDYzLzMwNjkvNjg3CitmIDE0NjMvMzA2OS82ODcgNjc4LzMwNzAvNjg3IDY4OC8zMDY3LzY4NworZiA2NzgvMzA3MC8xNDI0IDY4My8zMDcxLzE0MjQgNjg5LzMwNzIvMTQyNAorZiA2ODkvMzA3Mi8xNDI1IDY4OC8zMDY3LzE0MjUgNjc4LzMwNzAvMTQyNQorZiAyMTIzLzMwNzMvMjIxIDY4NC8zMDc0LzIyMSA2OTAvMzA3NS8yMjEKK2YgNjkwLzMwNzYvMjIxIDIxMjQvMzA3Ny8yMjEgMjEyNS8zMDc4LzIyMQorZiA2ODQvMzA3NC8yMjEgNjg2LzMwNzkvMjIxIDY5MS8zMDgwLzIyMQorZiA2OTEvMzA4MC8yMjEgNjkwLzMwNzUvMjIxIDY4NC8zMDc0LzIyMQorZiA2ODkvMzA3Mi8xNDI2IDY5Ni8zMDgxLzE0MjYgNjk3LzMwODIvMTQyNgorZiA2OTcvMzA4Mi8xNDI1IDY4OC8zMDY3LzE0MjUgNjg5LzMwNzIvMTQyNQorZiA2OTAvMzA3NS8yMjEgNjk1LzMwODMvMjIxIDIxMjYvMzA4NC8yMjEKK2YgMjEyNy8zMDg1LzIyMSAyMTI4LzMwODYvMjIxIDY5MC8zMDg3LzIyMQorZiA2OTAvMzA3NS8yMjEgNjkxLzMwODAvMjIxIDY5NC8zMDg4LzIyMQorZiA2OTQvMzA4OC8yMjEgNjk1LzMwODMvMjIxIDY5MC8zMDc1LzIyMQorZiA3MjEvMzA4OS8yMjEgNjk0LzMwODgvMjIxIDY5MS8zMDgwLzIyMQorZiA2OTEvMzA4MC8yMjEgNzIwLzMwOTAvMjIxIDcyMS8zMDg5LzIyMQorZiAxNDY0LzMwOTEvNjg3IDE0NjUvMzA2OC82ODcgNjg4LzMwNjcvNjg3CitmIDY4OC8zMDY3LzY4NyA2OTcvMzA4Mi82ODcgMTQ2NC8zMDkxLzY4NworZiA3MDAvMzA5Mi8yMjEgNzAxLzMwOTMvMjIxIDcyNS8zMDk0LzIyMQorZiA3MjUvMzA5NC8yMjEgNzI0LzMwOTUvMjIxIDcwMC8zMDkyLzIyMQorZiA3MDMvMzA5Ni8xMzYyIDcwMi8zMDk3LzEzNjIgNzI2LzMwOTgvMTM2MgorZiA3MjYvMzA5OC8xMzYyIDcyNy8zMDk5LzEzNjIgNzAzLzMwOTYvMTM2MgorZiA3MDEvMzA5My8yMjEgNzA1LzMxMDAvMjIxIDcyOS8zMTAxLzIyMQorZiA3MjkvMzEwMS8yMjEgNzI1LzMwOTQvMjIxIDcwMS8zMDkzLzIyMQorZiA3MDQvMzEwMi8xMzQ0IDcwMC8zMDkyLzEzNDQgNzI0LzMwOTUvMTM0NAorZiA3MjQvMzA5NS8xMzQ0IDcyOC8zMTAzLzEzNDQgNzA0LzMxMDIvMTM0NAorZiA3MDIvMzEwNC82OTcgMjEyOS8zMTA1LzY5NyAyMTMwLzMxMDYvNjk3CitmIDIxMzEvMzEwNy82OTcgNzI2LzMwOTgvNjk3IDcwMi8zMDk3LzY5NworZiA3MDUvMzEwMC8yMjEgNjkyLzMxMDgvMjIxIDcxNi8zMTA5LzIyMQorZiA3MTYvMzEwOS8yMjEgNzI5LzMxMDEvMjIxIDcwNS8zMTAwLzIyMQorZiA3MjMvMzExMC8xNDI3IDE0NzIvMzExMS8xNDI3IDE0NjcvMzExMi8xNDI3CitmIDE0NjcvMzExMi8xNDI3IDcxMS8zMTEzLzE0MjcgNzIzLzMxMTAvMTQyNworZiA3MTEvMzExMy8xNDI4IDE0NjcvMzExMi8xNDI4IDE0NjgvMzExNC8xNDI4CitmIDE0NjgvMzExNC8xNDI4IDcxMi8zMTE1LzE0MjggNzExLzMxMTMvMTQyOAorZiA3MTIvMzExNS8xNDI5IDE0NjgvMzExNC8xNDI5IDE0NjkvMzExNi8xNDI5CitmIDE0NjkvMzExNi8xNDI5IDcxMy8zMTE3LzE0MjkgNzEyLzMxMTUvMTQyOQorZiAxNDcwLzMxMTgvMTQzMCA3MTQvMzExOS8xNDMwIDcxMy8zMTE3LzE0MzAKK2YgNzEzLzMxMTcvMTQzMSAxNDY5LzMxMTYvMTQzMSAxNDcwLzMxMTgvMTQzMQorZiA3MTkvMzEyMC8xNDMyIDcxNy8zMTIxLzE0MzIgNjkzLzMxMjIvMTQzMgorZiA2OTMvMzEyMy8xNDMzIDcxMC8zMTIzLzE0MzMgNzE5LzMxMjQvMTQzMworZiA2OTQvMzEyNS8xNDM0IDIxMzIvMzEyNS8xNDM0IDIxMzMvMzEyNi8xNDM0CitmIDIxMzQvMzA4My8xNDM1IDY5NS8zMDgzLzE0MzUgNjk0LzMwODgvMTQzNQorZiAyMTM1LzMxMjcvMTQzNiAyMTM2LzMxMjgvMTQzNiAyMTM3LzMxMjkvMTQzNgorZiAyMTM4LzMxMzAvMTQzNyAyMTM5LzMxMzEvMTQzNyAyMTQwLzMxMzIvMTQzNworZiAyMTQxLzMxMzMvMTQzOCAyMTQyLzMxMzMvMTQzOCAyMTQzLzMxMzQvMTQzOAorZiAyMTQ0LzMxMzUvMTQzOSAyMTQ1LzMxMzYvMTQzOSAyMTQ2LzMxMzcvMTQzOQorZiAxNDcwLzMxMzgvMTQ0MCAyMTQ3LzMxMzkvMTQ0MCAyMTQ4LzMxNDAvMTQ0MAorZiAyMTQ5LzMxNDEvMTQ0MSA3MTQvMzExOS8xNDQxIDE0NzAvMzExOC8xNDQxCitmIDY5My8zMTIyLzIyMSA3MTcvMzEyMS8yMjEgNzE2LzMxMDkvMjIxCitmIDcxNi8zMTA5LzIyMSA2OTIvMzEwOC8yMjEgNjkzLzMxMjIvMjIxCitmIDE0NzEvMzE0Mi8xNDQyIDE0NjYvMzE0My8xNDQyIDcwNi8zMTQ0LzE0NDIKK2YgNzA2LzMxNDQvMTQ0MiA3MTgvMzE0NS8xNDQyIDE0NzEvMzE0Mi8xNDQyCitmIDcxNy8zMTIxLzE0NDMgNzE5LzMxMjAvMTQ0MyAyMTUwLzMxNDYvMTQ0MworZiAyMTUxLzMxNDYvMTQ0NCA3MjEvMzA4OS8xNDQ0IDcxNy8zMTIxLzE0NDQKK2YgNzIxLzMwODkvMjIxIDcyMC8zMDkwLzIyMSA3MTYvMzEwOS8yMjEKK2YgNzE2LzMxMDkvMjIxIDcxNy8zMTIxLzIyMSA3MjEvMzA4OS8yMjEKK2YgMTQ3Mi8zMTQ3LzE0NDUgMjE1Mi8zMTQ4LzE0NDUgMjE1My8zMTQ5LzE0NDUKK2YgMjE1NC8zMTUwLzE0NDUgNzIyLzMxNTEvMTQ0NSAxNDcyLzMxMTEvMTQ0NQorZiAyMTU1LzMxNTIvMTQ0NiAyMTU2LzMxNTMvMTQ0NiAyMTU3LzMxNTQvMTQ0NgorZiAyMTU4LzMxNTUvMTQ0NyAyMTU5LzMxNTYvMTQ0NyAyMTYwLzMxNTcvMTQ0NworZiA2NzYvMzE1OC8yMTkgNzI0LzMwOTUvMjE5IDcyNS8zMDk0LzIxOQorZiA3MjUvMzA5NC8yMjEgNjc5LzMxNTkvMjIxIDY3Ni8zMTU4LzIyMQorZiA2ODEvMzE2MC8xMzYyIDcyNy8zMDk5LzEzNjIgNzI2LzMwOTgvMTM2MgorZiA3MjYvMzA5OC8xMzYyIDY4MC8zMTYxLzEzNjIgNjgxLzMxNjAvMTM2MgorZiA2NzkvMzE1OS8yMjEgNzI1LzMwOTQvMjIxIDcyOS8zMTAxLzIyMQorZiA3MjkvMzEwMS8yMjEgNjg3LzMxNjIvMjIxIDY3OS8zMTU5LzIyMQorZiA2NzcvMzE2My8xMzQ0IDcyOC8zMTAzLzEzNDQgNzI0LzMwOTUvMTM0NAorZiA3MjQvMzA5NS8xMzQ0IDY3Ni8zMTU4LzEzNDQgNjc3LzMxNjMvMTM0NAorZiA2ODAvMzE2MS82OTcgNzI2LzMwOTgvNjk3IDIxNjEvMzEwNy82OTcKK2YgMjE2Mi8zMTY0LzY5NyAyMTYzLzMxNjUvNjk3IDY4MC8zMTY2LzY5NworZiA3MjkvMzEwMS8yMjEgNzE2LzMxMDkvMjIxIDY4NS8zMTY3LzIyMQorZiA2ODUvMzE2Ny8yMjEgNjg3LzMxNjIvMjIxIDcyOS8zMTAxLzIyMQorZiA2ODUvMzE2Ny8yMjEgNzIwLzMwOTAvMjIxIDY5MS8zMDgwLzIyMQorZiA2OTEvMzA4MC8yMjEgNjg2LzMwNzkvMjIxIDY4NS8zMTY3LzIyMQorZiAxNDczLzMxNjgvNjg3IDE0NzUvMzE2OS82ODcgNzQyLzMxNzAvNjg3CitmIDc0Mi8zMTcwLzY4NyA3MzIvMzE3MS82ODcgMTQ3My8zMTY4LzY4NworZiA3MzIvMzE3MS8xMzgxIDc0Mi8zMTcwLzEzODEgNzQzLzMxNzIvMTM4MQorZiA3NDMvMzE3Mi8xMzgxIDczNy8zMTczLzEzODEgNzMyLzMxNzEvMTM4MQorZiAyMTY0LzMxNzQvMjIxIDIxNjUvMzE3NS8yMjEgNzQ0LzMxNzYvMjIxCitmIDc0NC8zMTc3LzIyMSA3MzgvMzE3OC8yMjEgMjE2Ni8zMTc5LzIyMQorZiA3MzgvMzE3OC8yMjEgNzQ0LzMxNzcvMjIxIDc0NS8zMTgwLzIyMQorZiA3NDUvMzE4MC8yMjEgNzQwLzMxODEvMjIxIDczOC8zMTc4LzIyMQorZiA3NDMvMzE3Mi8xMzkwIDc0Mi8zMTcwLzEzOTAgNzUxLzMxODIvMTM5MAorZiA3NTEvMzE4Mi8xNDQ4IDc1MC8zMTgzLzE0NDggNzQzLzMxNzIvMTQ0OAorZiA3NDQvMzE4NC8yMjEgMjE2Ny8zMTg1LzIyMSAyMTY4LzMxODYvMjIxCitmIDIxNjkvMzE4Ny8yMjAgNzQ5LzMxODgvMjIwIDc0NC8zMTc3LzIyMAorZiA3NDQvMzE3Ny8yMjEgNzQ5LzMxODgvMjIxIDc0OC8zMTg5LzIyMQorZiA3NDgvMzE4OS8yMjEgNzQ1LzMxODAvMjIxIDc0NC8zMTc3LzIyMQorZiA3NzUvMzE5MC8yMjEgNzc0LzMxOTEvMjIxIDc0NS8zMTgwLzIyMQorZiA3NDUvMzE4MC8yMjEgNzQ4LzMxODkvMjIxIDc3NS8zMTkwLzIyMQorZiAxNDc0LzMxOTIvNjg3IDc1MS8zMTgyLzY4NyA3NDIvMzE3MC82ODcKK2YgNzQyLzMxNzAvNjg3IDE0NzUvMzE2OS82ODcgMTQ3NC8zMTkyLzY4NworZiA3NTQvMzE5My8yMjEgNzc4LzMxOTQvMjIxIDc3OS8zMTk1LzIyMQorZiA3NzkvMzE5NS8yMjEgNzU1LzMxOTYvMjIxIDc1NC8zMTkzLzIyMQorZiA3NTcvMzE5Ny8xMzYyIDc4MS8zMTk4LzEzNjIgNzgwLzMxOTkvMTM2MgorZiA3ODAvMzE5OS8xMzYyIDc1Ni8zMjAwLzEzNjIgNzU3LzMxOTcvMTM2MgorZiA3NTUvMzE5Ni8yMjEgNzc5LzMxOTUvMjIxIDc4My8zMjAxLzIyMQorZiA3ODMvMzIwMS8yMjEgNzU5LzMyMDIvMjIxIDc1NS8zMTk2LzIyMQorZiA3NTgvMzIwMy8xMzQ0IDc4Mi8zMjA0LzEzNDQgNzc4LzMxOTQvMTM0NAorZiA3NzgvMzE5NC8xMzQ0IDc1NC8zMTkzLzEzNDQgNzU4LzMyMDMvMTM0NAorZiAyMTcwLzMyMDUvNjk3IDc1Ni8zMjAwLzY5NyA3ODAvMzE5OS82OTcKK2YgNzgwLzMyMDYvNjk3IDIxNzEvMzIwNy82OTcgMjE3Mi8zMjA4LzY5NworZiA3NTkvMzIwMi8yMjEgNzgzLzMyMDEvMjIxIDc3MC8zMjA5LzIyMQorZiA3NzAvMzIwOS8yMjEgNzQ2LzMyMTAvMjIxIDc1OS8zMjAyLzIyMQorZiAxNDc3LzMyMTEvMTQ0OSAxNDgyLzMyMTIvMTQ0OSA3NzcvMzIxMy8xNDQ5CitmIDc3Ny8zMjEzLzE0NDkgNzY1LzMyMTQvMTQ0OSAxNDc3LzMyMTEvMTQ0OQorZiAxNDc4LzMyMTUvMTQ1MCAxNDc3LzMyMTEvMTQ1MCA3NjUvMzIxNC8xNDUwCitmIDc2NS8zMjE0LzE0NTAgNzY2LzMyMTYvMTQ1MCAxNDc4LzMyMTUvMTQ1MAorZiAxNDc4LzMyMTUvMTQ1MSA3NjYvMzIxNi8xNDUxIDc2Ny8zMjE3LzE0NTEKK2YgNzY3LzMyMTcvMTQ1MSAxNDc5LzMyMTgvMTQ1MSAxNDc4LzMyMTUvMTQ1MQorZiAxNDgwLzMyMTkvMTQ1MiAxNDc5LzMyMTgvMTQ1MiA3NjcvMzIxNy8xNDUyCitmIDc2Ny8zMjE3LzE0NTMgNzY4LzMyMjAvMTQ1MyAxNDgwLzMyMTkvMTQ1MworZiA3NzMvMzIyMS8xNDU0IDc2NC8zMjIyLzE0NTQgNzQ3LzMyMjMvMTQ1NAorZiA3NDcvMzIyNC8xNDU1IDc3MS8zMjI1LzE0NTUgNzczLzMyMjUvMTQ1NQorZiA3NDgvMzE4OS8xNDU2IDc0OS8zMTg4LzE0NTYgMjE3My8zMjI2LzE0NTYKK2YgMjE3NC8zMjI3LzE0NTcgMjE3NS8zMjI4LzE0NTcgNzQ4LzMyMjgvMTQ1NworZiAyMTc2LzMyMjkvMTQ1OCAyMTc3LzMyMzAvMTQ1OCAyMTc4LzMyMzEvMTQ1OAorZiAyMTc5LzMyMzIvMTQ1OSAyMTgwLzMyMzMvMTQ1OSAyMTgxLzMyMzMvMTQ1OQorZiAyMTgyLzMyMzQvMTQ2MCAyMTgzLzMyMzUvMTQ2MCAyMTg0LzMyMzYvMTQ2MAorZiAyMTg1LzMyMzcvMTQ2MSAyMTg2LzMyMzgvMTQ2MSAyMTg3LzMyMzkvMTQ2MQorZiAyMTg4LzMyNDAvMTQ2MiAyMTg5LzMyNDEvMTQ2MiA3NTEvMzI0MS8xNDYyCitmIDc1MS8zMTgyLzE0NjMgMTQ3NC8zMTkyLzE0NjMgMjE5MC8zMjQyLzE0NjMKK2YgNzQ3LzMyMjQvMjIxIDc0Ni8zMjEwLzIyMSA3NzAvMzIwOS8yMjEKK2YgNzcwLzMyMDkvMjIxIDc3MS8zMjI1LzIyMSA3NDcvMzIyNC8yMjEKK2YgNzYwLzMyNDMvMTQ2NCAxNDc2LzMyNDQvMTQ2NCAxNDgxLzMyNDUvMTQ2NAorZiAxNDgxLzMyNDUvMTQ2NCA3NzIvMzI0Ni8xNDY0IDc2MC8zMjQzLzE0NjQKK2YgNzcxLzMyMjUvMTQ2NSA3NzUvMzE5MC8xNDY1IDIxOTEvMzI0Ny8xNDY1CitmIDIxOTIvMzI0Ny8xNDY2IDc3My8zMjI1LzE0NjYgNzcxLzMyMjUvMTQ2NgorZiA3NzUvMzE5MC8yMjEgNzcxLzMyMjUvMjIxIDc3MC8zMjA5LzIyMQorZiA3NzAvMzIwOS8yMjEgNzc0LzMxOTEvMjIxIDc3NS8zMTkwLzIyMQorZiAyMTkzLzMyNDgvMTQ2NyAyMTk0LzMyNDkvMTQ2NyAxNDgyLzMyNTAvMTQ2NworZiAxNDgyLzMyMTIvMTQ2NyA3NzYvMzI1MS8xNDY3IDIxOTUvMzI1Mi8xNDY3CitmIDIxOTYvMzI1My8xNDY4IDIxOTcvMzI1NC8xNDY4IDc3NS8zMjU1LzE0NjgKK2YgNzc1LzMxOTAvMTQ2OSA3NDgvMzE4OS8xNDY5IDIxOTgvMzI1Ni8xNDY5CitmIDczMC8zMjU3LzIyMSA3MzMvMzI1OC8yMjEgNzc5LzMxOTUvMjIxCitmIDc3OS8zMTk1LzIyMSA3NzgvMzE5NC8yMjEgNzMwLzMyNTcvMjIxCitmIDczNS8zMjU5LzEzNjIgNzM0LzMyNjAvMTM2MiA3ODAvMzE5OS8xMzYyCitmIDc4MC8zMTk5LzEzNjIgNzgxLzMxOTgvMTM2MiA3MzUvMzI1OS8xMzYyCitmIDczMy8zMjU4LzIyMSA3NDEvMzI2MS8yMjEgNzgzLzMyMDEvMjIxCitmIDc4My8zMjAxLzIyMSA3NzkvMzE5NS8yMjEgNzMzLzMyNTgvMjIxCitmIDczMS8zMjYyLzEzNDQgNzMwLzMyNTcvMTM0NCA3NzgvMzE5NC8xMzQ0CitmIDc3OC8zMTk0LzEzNDQgNzgyLzMyMDQvMTM0NCA3MzEvMzI2Mi8xMzQ0CitmIDIxOTkvMzI2My82OTcgNzgwLzMxOTkvNjk3IDczNC8zMjYwLzY5NworZiA3MzQvMzI2NC82OTcgMjIwMC8zMjY1LzY5NyAyMjAxLzMyNjYvNjk3CitmIDc0MS8zMjYxLzIyMSA3MzkvMzI2Ny8yMjEgNzcwLzMyMDkvMjIxCitmIDc3MC8zMjA5LzIyMSA3ODMvMzIwMS8yMjEgNzQxLzMyNjEvMjIxCitmIDczOS8zMjY3LzIyMSA3NDAvMzE4MS8yMjEgNzQ1LzMxODAvMjIxCitmIDc0NS8zMTgwLzIyMSA3NzQvMzE5MS8yMjEgNzM5LzMyNjcvMjIxCitmIDE0NjMvMzA2OS82ODcgMTUwOC8zMjY4LzY4NyAxMTExLzMyNjkvNjg3CitmIDExMTEvMzI2OS82ODcgNjc4LzMwNzAvNjg3IDE0NjMvMzA2OS82ODcKK2YgNjc4LzMwNzAvMTM5MCAxMTExLzMyNjkvMTM5MCAxMTEyLzMyNzAvMTM5MAorZiAxMTEyLzMyNzAvMTM4MSA2ODMvMzA3MS8xMzgxIDY3OC8zMDcwLzEzODEKK2YgMjIwMi8zMjcxLzIyMSAyMjAzLzMyNzIvMjIxIDExMTMvMzI3My8yMjEKK2YgMTExMy8zMjc0LzIyMSA2ODQvMzA3NC8yMjEgMjIwNC8zMDczLzIyMQorZiA2ODQvMzA3NC8yMjEgMTExMy8zMjc0LzIyMSAxMTE0LzMyNzUvMjIxCitmIDExMTQvMzI3NS8yMjEgNjg2LzMwNzkvMjIxIDY4NC8zMDc0LzIyMQorZiA2ODYvMzA3OS8yMjEgMTExNC8zMjc1LzIyMSAxMTE1LzMyNzYvMjIxCitmIDExMTUvMzI3Ni8yMjEgNjg1LzMxNjcvMjIxIDY4Ni8zMDc5LzIyMQorZiA2ODUvMzE2Ny8yMjEgMTExNS8zMjc2LzIyMSAxMTE2LzMyNzcvMjIxCitmIDExMTYvMzI3Ny8yMjEgNjg3LzMxNjIvMjIxIDY4NS8zMTY3LzIyMQorZiA2ODcvMzE2Mi8yMjEgMTExNi8zMjc3LzIyMSAxMTE3LzMyNzgvMjIxCitmIDExMTcvMzI3OC8yMjEgNjc5LzMxNTkvMjIxIDY4Ny8zMTYyLzIyMQorZiA2NzkvMzE1OS8yMjEgMTExNy8zMjc4LzIyMSAxMTE4LzMyNzkvMjIxCitmIDExMTgvMzI3OS8yMjEgNjc2LzMxNTgvMjIxIDY3OS8zMTU5LzIyMQorZiA2NzYvMzE1OC8xMzQ0IDExMTgvMzI3OS8xMzQ0IDExMTkvMzI4MC8xMzQ0CitmIDExMTkvMzI4MC8xMzQ0IDY3Ny8zMTYzLzEzNDQgNjc2LzMxNTgvMTM0NAorZiAyMjA1LzMyODEvNjk3IDIyMDYvMzI4Mi82OTcgMTEyMC8zMjgzLzY5NworZiAxMTIwLzMyODQvNjk3IDY4MC8zMTYxLzY5NyAyMjA3LzMyODUvNjk3CitmIDY4MC8zMTYxLzEzNjIgMTEyMC8zMjg0LzEzNjIgMTEyMS8zMjg2LzEzNjIKK2YgMTEyMS8zMjg2LzEzNjIgNjgxLzMxNjAvMTM2MiA2ODAvMzE2MS8xMzYyCitmIDE0NzMvMzE2OC82ODcgMTQ0NS8yODI5LzY4NyA1NzAvMzI4Ny82ODcKK2YgNTcwLzMyODcvNjg3IDczNi8zMjg4LzY4NyAxNDczLzMxNjgvNjg3CitmIDczNS8zMjU5LzEzNjMgNTU5LzI4MDYvMTM2MyA1NDcvMjc1MC8xMzYzCitmIDU0Ny8yNzUwLzEzNjIgNzM0LzMyNjAvMTM2MiA3MzUvMzI1OS8xMzYyCitmIDQ5Ni8yNjU5LzIyMSAyMjA4LzMxNzkvMjIxIDczOC8zMTc4LzIyMQorZiA3MzgvMzE3OC8yMjEgNTk3LzI2NjAvMjIxIDQ5Ni8yNjU5LzIyMQorZiAyMjA5LzMyODkvNjk3IDIyMTAvMzI5MC82OTcgNzM0LzMyOTEvNjk3CitmIDczNC8zMjYwLzY5NyA1NDcvMjc1MC82OTcgMjIxMS8yNzQ5LzY5NworZiA3MzEvMzI2Mi8xMzQ0IDUxNS8yNzAxLzEzNDQgNTA3LzI3MDAvMTM0NAorZiA1MDcvMjcwMC8xMzQ0IDczMC8zMjU3LzEzNDQgNzMxLzMyNjIvMTM0NAorZiA3MzMvMzI1OC8yMjEgNzMwLzMyNTcvMjIxIDUwNy8yNzAwLzIyMQorZiA3MzMvMzI1OC8yMjEgNTA3LzI3MDAvMjIxIDUzOS8yNzg3LzIyMQorZiA3MzMvMzI1OC8yMjEgNTM5LzI3ODcvMjIxIDY1OS8yOTMwLzIyMQorZiA2NTkvMjkzMC8yMjEgNzQxLzMyNjEvMjIxIDczMy8zMjU4LzIyMQorZiA3NDEvMzI2MS8yMjEgNjU5LzI5MzAvMjIxIDYwOC8yOTI5LzIyMQorZiA2MDgvMjkyOS8yMjEgNzM5LzMyNjcvMjIxIDc0MS8zMjYxLzIyMQorZiA3MzkvMzI2Ny8yMjEgNjA4LzI5MjkvMjIxIDYxOS8yOTAyLzIyMQorZiA2MTkvMjkwMi8yMjEgNzQwLzMxODEvMjIxIDczOS8zMjY3LzIyMQorZiA3NDAvMzE4MS8yMjEgNjE5LzI5MDIvMjIxIDU5Ny8yNjYwLzIyMQorZiA1OTcvMjY2MC8yMjEgNzM4LzMxNzgvMjIxIDc0MC8zMTgxLzIyMQorZiAyMjEyLzI4NjMvMTQ0OCA1NzgvMjgzMC8xNDQ4IDczMi8zMTcxLzE0NDgKK2YgNzMyLzMxNzEvMTM4MSA3MzcvMzE3My8xMzgxIDIyMTMvMjg2My8xMzgxCitmIDE0NzYvMzI0NC82ODcgMTQ4My8zMjkyLzY4NyA3ODUvMzI5My82ODcKK2YgNzg1LzMyOTMvNjg3IDIyMTQvMzI5NC82ODcgMTQ3Ni8zMjQ0LzY4NworZiAyMjE1LzMyOTUvMTQ3MCA3ODUvMzI5Ni8xNDcwIDc4Ni8zMjk3LzE0NzAKK2YgNzg2LzMyOTgvMTQ3MSAyMjE2LzMyOTkvMTQ3MSAyMjE3LzMzMDAvMTQ3MQorZiA3NDcvMzIyNC8yMjEgMjIxOC8zMzAxLzIyMSA3ODcvMzMwMi8yMjEKK2YgNzg3LzMzMDIvMjIxIDc0Ni8zMjEwLzIyMSA3NDcvMzIyNC8yMjEKK2YgNzQ2LzMyMTAvMjIxIDc4Ny8zMzAyLzIyMSA3ODgvMzMwMy8yMjEKK2YgNzg4LzMzMDMvMjIxIDc1OS8zMjAyLzIyMSA3NDYvMzIxMC8yMjEKK2YgNzU5LzMyMDIvMjIxIDc4OC8zMzAzLzIyMSA3ODkvMzMwNC8yMjEKK2YgNzg5LzMzMDQvMjIxIDc1NS8zMTk2LzIyMSA3NTkvMzIwMi8yMjEKK2YgNzU1LzMxOTYvMjIxIDc4OS8zMzA0LzIyMSA3OTAvMzMwNS8yMjEKK2YgNzkwLzMzMDUvMjIxIDc1NC8zMTkzLzIyMSA3NTUvMzE5Ni8yMjEKK2YgNzU0LzMxOTMvMTM0NCA3OTAvMzMwNS8xMzQ0IDc5MS8zMzA2LzEzNDQKK2YgNzkxLzMzMDYvMTM0NCA3NTgvMzIwMy8xMzQ0IDc1NC8zMTkzLzEzNDQKK2YgNzkyLzMzMDcvNjk3IDc1Ni8zMjAwLzY5NyAyMjE5LzMyMDUvNjk3CitmIDIyMjAvMzMwOC82OTcgMjIyMS8zMzA5LzY5NyA3OTIvMzMxMC82OTcKK2YgNzU2LzMyMDAvMTM2MiA3OTIvMzMwNy8xMzYyIDc5My8zMzExLzEzNjIKK2YgNzkzLzMzMTEvMTM2MiA3NTcvMzE5Ny8xMzYyIDc1Ni8zMjAwLzEzNjIKK2YgNzA2LzMxNDQvNjg3IDE0NjYvMzE0My82ODcgMTQ4My8zMjkyLzY4NworZiAxNDgzLzMyOTIvNjg3IDc4NC8zMzEyLzY4NyA3MDYvMzE0NC82ODcKK2YgMjIyMi8zMzEzLzE0NzAgMjIyMy8zMzE0LzE0NzAgNzg2LzMzMTUvMTQ3MAorZiA3ODYvMzI5Ny8xNDcwIDc4NS8zMjk2LzE0NzAgMjIyNC8zMzE2LzE0NzAKK2YgNjkzLzMxMjIvMjIxIDY5Mi8zMTA4LzIyMSA3ODcvMzMwMi8yMjEKK2YgNzg3LzMzMDIvMjIxIDIyMjUvMzMwMS8yMjEgNjkzLzMxMjIvMjIxCitmIDY5Mi8zMTA4LzIyMSA3MDUvMzEwMC8yMjEgNzg4LzMzMDMvMjIxCitmIDc4OC8zMzAzLzIyMSA3ODcvMzMwMi8yMjEgNjkyLzMxMDgvMjIxCitmIDcwNS8zMTAwLzIyMSA3MDEvMzA5My8yMjEgNzg5LzMzMDQvMjIxCitmIDc4OS8zMzA0LzIyMSA3ODgvMzMwMy8yMjEgNzA1LzMxMDAvMjIxCitmIDcwMS8zMDkzLzIyMSA3MDAvMzA5Mi8yMjEgNzkwLzMzMDUvMjIxCitmIDc5MC8zMzA1LzIyMSA3ODkvMzMwNC8yMjEgNzAxLzMwOTMvMjIxCitmIDcwMC8zMDkyLzEzNDQgNzA0LzMxMDIvMTM0NCA3OTEvMzMwNi8xMzQ0CitmIDc5MS8zMzA2LzEzNDQgNzkwLzMzMDUvMTM0NCA3MDAvMzA5Mi8xMzQ0CitmIDc5Mi8zMzE3LzY5NyAyMjI2LzMzMTgvNjk3IDIyMjcvMzMxOS82OTcKK2YgMjIyOC8zMzIwLzY5NyA3MDIvMzA5Ny82OTcgNzkyLzMzMDcvNjk3CitmIDcwMi8zMDk3LzEzNjIgNzAzLzMwOTYvMTM2MiA3OTMvMzMxMS8xMzYyCitmIDc5My8zMzExLzEzNjIgNzkyLzMzMDcvMTM2MiA3MDIvMzA5Ny8xMzYyCitmIDg0Ny8zMzIxLzE0NzIgODQ2LzMzMjIvMTQ3MiAyMjI5LzMzMjMvMTQ3MgorZiAyMjMwLzMzMjQvMTQ3MiAyMjMxLzMzMjUvMTQ3MiA4NDcvMzMyNS8xNDcyCitmIDg0OC8zMzI2LzE0NzMgODQ3LzMzMjEvMTQ3MyAyMjMyLzMzMjEvMTQ3MworZiAyMjMzLzMzMjcvMTQ3MyAyMjM0LzMzMjgvMTQ3MyA4NDgvMzMyOS8xNDczCitmIDIyMzUvMzMzMC8xMDQ0IDg0OS8zMzMwLzEwNDQgODQ4LzMzMjYvMTA0NAorZiA4NDgvMzMzMS8xMDQ0IDIyMzYvMzMzMS8xMDQ0IDIyMzcvMzMzMi8xMDQ0CitmIDIyMzgvMzMzMy8xMDQ0IDg1MC8zMzM0LzEwNDQgODc0LzMzMzUvMTA0NAorZiA4NzQvMzMzNi8xMDQ0IDIyMzkvMzMzNy8xMDQ0IDIyNDAvMzMzOC8xMDQ0CitmIDIyNDEvMzMzOS8xMDQzIDEwODgvMzMzOS8xMDQzIDg3My8zMzQwLzEwNDMKK2YgODczLzMzNDEvMTA0MyAyMjQyLzMzNDEvMTA0MyAyMjQzLzMzNDIvMTA0MworZiAyMjQ0LzMzNDMvMTA0MyA4NTMvMzM0My8xMDQzIDg1Mi8zMzQ0LzEwNDMKK2YgODUyLzMzNDUvMTA0MyAyMjQ1LzMzNDUvMTA0MyAyMjQ2LzMzNDYvMTA0MworZiA4NTQvMzM0Ny8xNDc0IDg1My8zMzQzLzE0NzQgMjI0Ny8zMzQzLzE0NzQKK2YgMjI0OC8zMzQ4LzE0NzQgMjI0OS8zMzQ5LzE0NzQgODU0LzMzNTAvMTQ3NAorZiA4NTUvMzM1MS8xNDc1IDg1NC8zMzQ3LzE0NzUgMjI1MC8zMzUyLzE0NzUKK2YgMjI1MS8zMzUzLzE0NzUgMjI1Mi8zMzU0LzE0NzUgODU1LzMzNTQvMTQ3NQorZiA4NTYvMzM1NS8xNDc2IDIyNTMvMzM1Ni8xNDc2IDIyNTQvMzM1Ny8xNDc2CitmIDIyNTUvMzM1OC8xNDc2IDIyNTYvMzM1OS8xNDc2IDg1Ni8zMzU5LzE0NzYKK2YgODU3LzMzNjAvMTQ3NyA4NTYvMzM2MS8xNDc3IDIyNTcvMzM2MS8xNDc3CitmIDIyNTgvMzM2Mi8xNDc3IDIyNTkvMzM2My8xNDc3IDg1Ny8zMzY0LzE0NzcKK2YgMjI2MC8zMzY1LzIyMSA4NTgvMzM2NS8yMjEgODU3LzMzNjAvMjIxCitmIDg1Ny8zMzY2LzIyMSAyMjYxLzMzNjYvMjIxIDIyNjIvMzM2Ny8yMjEKK2YgODU5LzMzNjgvMjIxIDg2My8zMzY5LzIyMSAyMjYzLzMzNjkvMjIxCitmIDIyNjQvMzM3MC8yMjEgMjI2NS8zMzcxLzIyMSA4NTkvMzM3Mi8yMjEKK2YgMjI2Ni8zMzczLzIyMSA4NjAvMzM3My8yMjEgODU5LzMzNjgvMjIxCitmIDg1OS8zMzc0LzIyMSAyMjY3LzMzNzQvMjIxIDIyNjgvMzM3NS8yMjEKK2YgODYxLzMzNzYvMTQ3OCA4NjAvMzM3My8xNDc4IDIyNjkvMzM3My8xNDc4CitmIDIyNzAvMzM3Ny8xNDc4IDIyNzEvMzM3OC8xNDc4IDg2MS8zMzc5LzE0NzgKK2YgMjI3Mi8zMzgwLzE0NzkgODYxLzMzODEvMTQ3OSAyMjczLzMzODEvMTQ3OQorZiAyMjc0LzMzODIvMTQ3OSAyMjc1LzMzODMvMTQ3OSAyMjc2LzMzODQvMTQ3OQorZiAyMjc3LzMzODUvMjIxIDE1MjQvMzM4NS8yMjEgODY0LzMzODYvMjIxCitmIDg2NC8zMzg3LzIyMSAyMjc4LzMzODgvMjIxIDIyNzkvMzM4OS8yMjEKK2YgODYzLzMzNjkvMjIxIDg2Mi8zMzkwLzIyMSAyMjgwLzMzOTAvMjIxCitmIDIyODEvMzM5MS8yMjEgMjI4Mi8zMzkyLzIyMSA4NjMvMzM5My8yMjEKK2YgODY0LzMzODYvMjIxIDg2NS8zMzk0LzIyMSAyMjgzLzMzOTQvMjIxCitmIDIyODQvMzM5NS8yMjEgMjI4NS8zMzk2LzIyMSA4NjQvMzM5Ny8yMjEKK2YgODY1LzMzOTQvMjIxIDg1OC8zMzY1LzIyMSAyMjg2LzMzNjUvMjIxCitmIDIyODcvMzM5OC8yMjEgMjI4OC8zMzk5LzIyMSA4NjUvMzM5OS8yMjEKK2YgODY2LzM0MDAvMTA0MyA4NzIvMzQwMS8xMDQzIDIyODkvMzQwMS8xMDQzCitmIDIyOTAvMzQwMi8xMDQzIDIyOTEvMzQwMy8xMDQzIDg2Ni8zNDA0LzEwNDMKK2YgMjI5Mi8zNDA1LzEwNDMgMTA2NC8zNDA1LzEwNDMgMTA2NS8zNDA2LzEwNDMKK2YgMTA2NS8zNDA3LzEwNDMgMjI5My8zNDA3LzEwNDMgMjI5NC8zNDA4LzEwNDMKK2YgODY3LzM0MDkvMTA0MyA4NjgvMzQxMC8xMDQzIDIyOTUvMzQxMC8xMDQzCitmIDIyOTYvMzQxMS8xMDQzIDIyOTcvMzQxMi8xMDQzIDg2Ny8zNDEzLzEwNDMKK2YgMjI5OC8zNDEwLzEwNDMgODY4LzM0MTAvMTA0MyA4NjkvMzQxNC8xMDQzCitmIDg2OS8zNDE1LzEwNDMgMjI5OS8zNDE1LzEwNDMgMjMwMC8zNDE2LzEwNDMKK2YgMjMwMS8zNDE3LzEwNDMgODcwLzM0MTcvMTA0MyA4NzEvMzQxOC8xMDQzCitmIDg3MS8zNDE5LzEwNDMgMjMwMi8zNDE5LzEwNDMgMjMwMy8zNDIwLzEwNDMKK2YgODcxLzM0MTgvMTA0MyA4NjYvMzQwMC8xMDQzIDIzMDQvMzQwMC8xMDQzCitmIDIzMDUvMzQyMS8xMDQzIDIzMDYvMzQyMi8xMDQzIDg3MS8zNDIyLzEwNDMKK2YgMjMwNy8zNDAxLzEwNDMgODcyLzM0MDEvMTA0MyA4NTEvMzQyMy8xMDQzCitmIDg1MS8zNDI0LzEwNDMgMjMwOC8zNDI0LzEwNDMgMjMwOS8zNDI1LzEwNDMKK2YgODczLzMzNDAvMTA0MyA4NjcvMzQwOS8xMDQzIDIzMTAvMzQwOS8xMDQzCitmIDIzMTEvMzQyNi8xMDQzIDIzMTIvMzQyNy8xMDQzIDg3My8zNDI3LzEwNDMKK2YgOTk3LzM0MjgvMTA0NCA4NzUvMzQyOS8xMDQ0IDIzMTMvMzQyOS8xMDQ0CitmIDIzMTQvMzQzMC8xMDQ0IDIzMTUvMzQzMS8xMDQ0IDk5Ny8zNDMyLzEwNDQKK2YgODc1LzM0MjkvMTA0NCA4NzcvMzQzMy8xMDQ0IDIzMTYvMzQzMy8xMDQ0CitmIDIzMTcvMzQzNC8xMDQ0IDIzMTgvMzQzNS8xMDQ0IDg3NS8zNDM1LzEwNDQKK2YgMjMxOS8zNDM2LzEwNDQgOTQ4LzM0MzYvMTA0NCA4NDkvMzMzMC8xMDQ0CitmIDg0OS8zNDM3LzEwNDQgMjMyMC8zNDM4LzEwNDQgMjMyMS8zNDM5LzEwNDQKK2YgOTY1LzM0NDAvMTA0NCA4NzYvMzQ0MS8xMDQ0IDIzMjIvMzQ0MS8xMDQ0CitmIDIzMjMvMzQ0MS8xMDQ0IDk1Ny8zNDQwLzEwNDQgOTY1LzM0NDAvMTA0NAorZiA4NzgvMzQ0Mi8xNDgwIDg3OS8zNDQzLzE0ODAgMjMyNC8zNDQ0LzE0ODAKK2YgMjMyNS8zNDQ1LzE0ODAgMjMyNi8zNDQ2LzE0ODAgODc4LzM0NDcvMTQ4MAorZiA4NzkvMzQ0My8xNDgxIDg4MC8zNDQ4LzE0ODEgMjMyNy8zNDQ4LzE0ODEKK2YgMjMyOC8zNDQ5LzE0ODIgMjMyOS8zNDUwLzE0ODIgODc5LzM0NTAvMTQ4MgorZiAyMzMwLzM0NTEvMTQ4MyA4ODEvMzQ1Mi8xNDgzIDIzMzEvMzQ1Mi8xNDgzCitmIDIzMzIvMzQ1My8xNDg0IDIzMzMvMzQ1NC8xNDg0IDIzMzQvMzQ1NC8xNDg0CitmIDg4MS8zNDU1LzE0ODUgODgyLzM0NTYvMTQ4NSAyMzM1LzM0NTYvMTQ4NQorZiAyMzM2LzM0NTcvMTQ4NSAyMzM3LzM0NTgvMTQ4NSA4ODEvMzQ1OS8xNDg1CitmIDIzMzgvMzQ1Ni8xMTcyIDg4Mi8zNDU2LzExNzIgODgzLzM0NjAvMTE3MgorZiA4ODMvMzQ2MS8xMTcyIDIzMzkvMzQ2Mi8xMTcyIDIzNDAvMzQ2My8xMTcyCitmIDIzNDEvMzQ2NC8xMTcyIDg4NC8zNDY0LzExNzIgODg1LzM0NjUvMTE3MgorZiA4ODUvMzQ2Ni8xMTcyIDIzNDIvMzQ2Ni8xMTcyIDIzNDMvMzQ2Ny8xMTcyCitmIDg4NS8zNDY1LzE0ODYgODg2LzM0NjgvMTQ4NiAyMzQ0LzM0NjgvMTQ4NgorZiAyMzQ1LzM0NjkvMTQ4NiAyMzQ2LzM0NzAvMTQ4NiA4ODUvMzQ3MS8xNDg2CitmIDg4Ni8zNDY4LzE0ODcgODg3LzM0NzIvMTQ4NyAyMzQ3LzM0NzMvMTQ4NworZiAyMzQ4LzM0NzQvMTQ4NyAyMzQ5LzM0NzUvMTQ4NyA4ODYvMzQ3Ni8xNDg3CitmIDIzNTAvMzQ3Ny8xNDg4IDg4OC8zNDc4LzE0ODggMjM1MS8zNDc5LzE0ODgKK2YgMjM1Mi8zNDgwLzE0ODggMjM1My8zNDgxLzE0ODggMjM1NC8zNDgyLzE0ODgKK2YgODg4LzM0ODMvMTQ4OSA4ODkvMzQ4NC8xNDg5IDIzNTUvMzQ4NS8xNDg5CitmIDIzNTYvMzQ4Ni8xNDg5IDIzNTcvMzQ4Ny8xNDg5IDg4OC8zNDg4LzE0ODkKK2YgODgzLzM0NjAvMTE3MiA4OTAvMzQ4OS8xMTcyIDIzNTgvMzQ4OS8xMTcyCitmIDIzNTkvMzQ5MC8xMTcyIDIzNjAvMzQ5MS8xMTcyIDg4My8zNDkyLzExNzIKK2YgMjM2MS8zNDIzLzEwNDMgODUxLzM0MjMvMTA0MyA4NzgvMzQ0Mi8xMDQzCitmIDg3OC8zNDkzLzEwNDMgMjM2Mi8zNDkzLzEwNDMgMjM2My8zNDk0LzEwNDMKK2YgMjM2NC8zNDg1LzEwNDQgODg5LzM0ODQvMTA0NCA4NTAvMzMzNC8xMDQ0CitmIDg1MC8zNDk1LzEwNDQgMjM2NS8zNDk2LzEwNDQgMjM2Ni8zNDk3LzEwNDQKK2YgODkzLzM0OTgvMTE3MiA4OTIvMzQ5OS8xMTcyIDIzNjcvMzQ5OS8xMTcyCitmIDIzNjgvMzUwMC8xMTcyIDIzNjkvMzUwMS8xMTcyIDg5My8zNTAyLzExNzIKK2YgODkxLzM1MDMvMTE3MiA4OTMvMzQ5OC8xMTcyIDIzNzAvMzQ5OC8xMTcyCitmIDIzNzEvMzUwNC8xMTcyIDIzNzIvMzUwNS8xMTcyIDg5MS8zNTA1LzExNzIKK2YgODk1LzM1MDYvMTQ5MCA4OTYvMzUwNy8xNDkwIDIzNzMvMzUwNy8xNDkwCitmIDIzNzQvMzUwOC8xMTcyIDIzNzUvMzUwOS8xMTcyIDg5NS8zNTEwLzExNzIKK2YgODk2LzM1MDcvMTE3MiA4OTQvMzUxMS8xMTcyIDIzNzYvMzUxMS8xMTcyCitmIDIzNzcvMzUxMi8xMjc3IDIzNzgvMzUxMy8xMjc3IDg5Ni8zNTEzLzEyNzcKK2YgMjM3OS8zNTE0LzExNzIgMTEyMy8zNTE0LzExNzIgODkxLzM1MDMvMTE3MgorZiA4OTEvMzUxNS8xMTcyIDIzODAvMzUxNi8xMTcyIDIzODEvMzUxNy8xMTcyCitmIDIzODIvMzUxMS8xMTcyIDg5NC8zNTExLzExNzIgODg0LzM0NjQvMTE3MgorZiA4ODQvMzUxOC8xMTcyIDIzODMvMzUxOS8xMTcyIDIzODQvMzUyMC8xMTcyCitmIDg5Mi8zNDk5LzExNzIgODk3LzM1MjEvMTE3MiAyMzg1LzM1MjEvMTE3MgorZiAyMzg2LzM1MjIvMTE3MiAyMzg3LzM1MjMvMTE3MiA4OTIvMzUyNC8xMTcyCitmIDg5Ny8zNTIxLzExNzIgODk1LzM1MDYvMTE3MiAyMzg4LzM1MDYvMTE3MgorZiAyMzg5LzM1MjUvMTE3MiAyMzkwLzM1MjYvMTE3MiA4OTcvMzUyNi8xMTcyCitmIDc5NS8zNTI3LzE0NzIgNzk0LzM1MjgvMTQ3MiA4NDYvMzMyMi8xNDcyCitmIDg0Ni8zMzIyLzE0NzIgODQ3LzMzMjEvMTQ3MiA3OTUvMzUyNy8xNDcyCitmIDc5Ni8zNTI5LzE0NzMgNzk1LzM1MjcvMTQ3MyA4NDcvMzMyMS8xNDczCitmIDg0Ny8zMzIxLzE0NzMgODQ4LzMzMjYvMTQ3MyA3OTYvMzUyOS8xNDczCitmIDc5Ny8zNTMwLzEwNDQgNzk2LzM1MjkvMTA0NCA4NDgvMzMyNi8xMDQ0CitmIDg0OC8zMzI2LzEwNDQgODQ5LzMzMzAvMTA0NCA3OTcvMzUzMC8xMDQ0CitmIDc5OC8zNTMxLzEwNDQgODIyLzM1MzIvMTA0NCA4NzQvMzMzNS8xMDQ0CitmIDg3NC8zMzM1LzEwNDQgODUwLzMzMzQvMTA0NCA3OTgvMzUzMS8xMDQ0CitmIDgwMC8zNTMzLzEwNDMgMTA4Ny8zNTM0LzEwNDMgMTA4OC8zMzM5LzEwNDMKK2YgMTA4OC8zMzM5LzEwNDMgODUyLzMzNDQvMTA0MyA4MDAvMzUzMy8xMDQzCitmIDgwMS8zNTM1LzEwNDMgODAwLzM1MzMvMTA0MyA4NTIvMzM0NC8xMDQzCitmIDg1Mi8zMzQ0LzEwNDMgODUzLzMzNDMvMTA0MyA4MDEvMzUzNS8xMDQzCitmIDgwMi8zNTM2LzE0NzQgODAxLzM1MzUvMTQ3NCA4NTMvMzM0My8xNDc0CitmIDg1My8zMzQzLzE0NzQgODU0LzMzNDcvMTQ3NCA4MDIvMzUzNi8xNDc0CitmIDgwMy8zNTM3LzE0NzUgODAyLzM1MzYvMTQ3NSA4NTQvMzM0Ny8xNDc1CitmIDg1NC8zMzQ3LzE0NzUgODU1LzMzNTEvMTQ3NSA4MDMvMzUzNy8xNDc1CitmIDgwNC8zNTM4LzE0NzYgMjM5MS8zNTM5LzE0NzYgMjM5Mi8zNTQwLzE0NzYKK2YgMjM5My8zNTQxLzE0NzYgODU2LzMzNjEvMTQ3NiA4MDQvMzU0Mi8xNDc2CitmIDgwNS8zNTQzLzE0NzcgODA0LzM1NDIvMTQ3NyA4NTYvMzM2MS8xNDc3CitmIDg1Ni8zMzYxLzE0OTEgODU3LzMzNjAvMTQ5MSA4MDUvMzU0My8xNDkxCitmIDgwNi8zNTQ0LzE0OTIgODA1LzM1NDMvMTQ5MiA4NTcvMzM2MC8xNDkyCitmIDg1Ny8zMzYwLzIxOSA4NTgvMzM2NS8yMTkgODA2LzM1NDQvMjE5CitmIDgwNy8zNTQ1LzI4NSA4MTEvMzU0Ni8yODUgODYzLzMzNjkvMjg1CitmIDg2My8zMzY5LzI4NSA4NTkvMzM2OC8yODUgODA3LzM1NDUvMjg1CitmIDgwOC8zNTQ3LzI4NSA4MDcvMzU0NS8yODUgODU5LzMzNjgvMjg1CitmIDg1OS8zMzY4LzIyMSA4NjAvMzM3My8yMjEgODA4LzM1NDcvMjIxCitmIDgwOS8zNTQ4LzE0NzggODA4LzM1NDcvMTQ3OCA4NjAvMzM3My8xNDc4CitmIDg2MC8zMzczLzE0NzggODYxLzMzNzYvMTQ3OCA4MDkvMzU0OC8xNDc4CitmIDIzOTQvMzU0OS8xNDc5IDgwOS8zNTQ4LzE0NzkgODYxLzMzNzYvMTQ3OQorZiA4NjEvMzU1MC8xNDc5IDIzOTUvMzU1MS8xNDc5IDIzOTYvMzU1Mi8xNDc5CitmIDgxMC8zNTUzLzIxOSAxNTIzLzM1NTQvMjE5IDE1MjQvMzM4NS8yMTkKK2YgMTUyNC8zMzg1LzI4NSA4NjIvMzM5MC8yODUgODEwLzM1NTMvMjg1CitmIDgxMS8zNTQ2LzI4NSA4MTAvMzU1My8yODUgODYyLzMzOTAvMjg1CitmIDg2Mi8zMzkwLzI4NSA4NjMvMzM2OS8yODUgODExLzM1NDYvMjg1CitmIDgxMi8zNTU1LzI4NSA4MTMvMzU1Ni8yODUgODY1LzMzOTQvMjg1CitmIDg2NS8zMzk0LzIxOSA4NjQvMzM4Ni8yMTkgODEyLzM1NTUvMjE5CitmIDgxMy8zNTU2LzI4NSA4MDYvMzU0NC8yODUgODU4LzMzNjUvMjg1CitmIDg1OC8zMzY1LzIxOSA4NjUvMzM5NC8yMTkgODEzLzM1NTYvMjE5CitmIDgyMC8zNTU3LzEwNDMgODcyLzM0MDEvMTA0MyA4NjYvMzQwMC8xMDQzCitmIDg2Ni8zNDAwLzEwNDMgODE0LzM1NTgvMTA0MyA4MjAvMzU1Ny8xMDQzCitmIDgxNi8zNTU5LzEwNDMgODY4LzM0MTAvMTA0MyA4NjcvMzQwOS8xMDQzCitmIDg2Ny8zNDA5LzEwNDMgODE1LzM1NjAvMTA0MyA4MTYvMzU1OS8xMDQzCitmIDgxNi8zNTU5LzEwNDMgODE3LzM1NjEvMTA0MyA4NjkvMzQxNC8xMDQzCitmIDg2OS8zNDE0LzEwNDMgODY4LzM0MTAvMTA0MyA4MTYvMzU1OS8xMDQzCitmIDEwNTgvMzU2Mi8xMDQzIDEwNTkvMzU2My8xMDQzIDEwNjUvMzQwNi8xMDQzCitmIDEwNjUvMzQwNi8xMDQzIDEwNjQvMzQwNS8xMDQzIDEwNTgvMzU2Mi8xMDQzCitmIDgxOC8zNTY0LzEwNDMgODE5LzM1NjUvMTA0MyA4NzEvMzQxOC8xMDQzCitmIDg3MS8zNDE4LzEwNDMgODcwLzM0MTcvMTA0MyA4MTgvMzU2NC8xMDQzCitmIDgxNC8zNTU4LzEwNDMgODY2LzM0MDAvMTA0MyA4NzEvMzQxOC8xMDQzCitmIDg3MS8zNDE4LzEwNDMgODE5LzM1NjUvMTA0MyA4MTQvMzU1OC8xMDQzCitmIDgyMC8zNTU3LzEwNDMgNzk5LzM1NjYvMTA0MyA4NTEvMzQyMy8xMDQzCitmIDg1MS8zNDIzLzEwNDMgODcyLzM0MDEvMTA0MyA4MjAvMzU1Ny8xMDQzCitmIDgxNS8zNTYwLzEwNDMgODY3LzM0MDkvMTA0MyA4NzMvMzM0MC8xMDQzCitmIDg3My8zMzQwLzEwNDMgODIxLzM1NjcvMTA0MyA4MTUvMzU2MC8xMDQzCitmIDgyMi8zNTMyLzEwNDQgOTk2LzM1NjgvMTA0NCA5OTcvMzQyOC8xMDQ0CitmIDk5Ny8zNDI4LzEwNDQgODc0LzMzMzUvMTA0NCA4MjIvMzUzMi8xMDQ0CitmIDgyMy8zNTY5LzEwNDQgODI1LzM1NzAvMTA0NCA4NzcvMzQzMy8xMDQ0CitmIDg3Ny8zNDMzLzEwNDQgODc1LzM0MjkvMTA0NCA4MjMvMzU2OS8xMDQ0CitmIDgyNC8zNTcxLzEwNDQgOTQ3LzM1NzIvMTA0NCA5NDgvMzQzNi8xMDQ0CitmIDk0OC8zNDM2LzEwNDQgODc2LzM0NDEvMTA0NCA4MjQvMzU3MS8xMDQ0CitmIDkyMC8zNTczLzEwNDQgOTMzLzM1NzQvMTA0NCA5MzQvMzU3NS8xMDQ0CitmIDkzNC8zNTc1LzEwNDQgOTIxLzM1NzYvMTA0NCA5MjAvMzU3My8xMDQ0CitmIDk3NC8zNTc3LzEwNDQgOTc1LzM1NzgvMTA0NCA4NzcvMzQzMy8xMDQ0CitmIDg3Ny8zNDMzLzEwNDQgODI1LzM1NzAvMTA0NCA5NzQvMzU3Ny8xMDQ0CitmIDgyNi8zNTc5LzE0ODAgODI3LzM1ODAvMTQ4MCA4NzkvMzQ0My8xNDgwCitmIDg3OS8zNDQzLzE0ODAgODc4LzM0NDIvMTQ4MCA4MjYvMzU3OS8xNDgwCitmIDgyNy8zNTgwLzE0OTMgODI4LzM1ODEvMTQ5MyA4ODAvMzQ0OC8xNDkzCitmIDg4MC8zNDQ4LzE0OTMgODc5LzM0NDMvMTQ5MyA4MjcvMzU4MC8xNDkzCitmIDIzOTcvMzU4Mi8xNDgzIDgyOS8zNTgzLzE0ODMgODgxLzM0NTUvMTQ4MworZiA4ODEvMzU4NC8xNDgzIDIzOTgvMzU4NS8xNDgzIDIzOTkvMzU4Ni8xNDgzCitmIDgyOS8zNTgzLzE0ODUgODMwLzM1ODcvMTQ4NSA4ODIvMzQ1Ni8xNDg1CitmIDg4Mi8zNDU2LzE0ODUgODgxLzM0NTUvMTQ4NSA4MjkvMzU4My8xNDg1CitmIDgzMC8zNTg3LzExNzIgODMxLzM1ODgvMTE3MiA4ODMvMzQ2MC8xMTcyCitmIDg4My8zNDYwLzExNzIgODgyLzM0NTYvMTE3MiA4MzAvMzU4Ny8xMTcyCitmIDgzMi8zNTg5LzExNzIgODMzLzM1OTAvMTE3MiA4ODUvMzQ2NS8xMTcyCitmIDg4NS8zNDY1LzExNzIgODg0LzM0NjQvMTE3MiA4MzIvMzU4OS8xMTcyCitmIDgzMy8zNTkwLzE0ODYgODM0LzM1OTEvMTQ4NiA4ODYvMzQ2OC8xNDg2CitmIDg4Ni8zNDY4LzE0OTQgODg1LzM0NjUvMTQ5NCA4MzMvMzU5MC8xNDk0CitmIDgzNC8zNTkxLzE0ODcgODM1LzM1OTIvMTQ4NyA4ODcvMzQ3Mi8xNDg3CitmIDg4Ny8zNDcyLzE0ODcgODg2LzM0NjgvMTQ4NyA4MzQvMzU5MS8xNDg3CitmIDI0MDAvMzU5My8xNDk1IDgzNi8zNTk0LzE0OTUgODg4LzM0ODMvMTQ5NQorZiA4ODgvMzU5NS8xNDg4IDI0MDEvMzU5Ni8xNDg4IDI0MDIvMzU5Ny8xNDg4CitmIDgzNi8zNTk0LzE0ODkgODM3LzM1OTgvMTQ4OSA4ODkvMzQ4NC8xNDg5CitmIDg4OS8zNDg0LzE0ODkgODg4LzM0ODMvMTQ4OSA4MzYvMzU5NC8xNDg5CitmIDgzMS8zNTg4LzExNzIgODM4LzM1OTkvMTE3MiA4OTAvMzQ4OS8xMTcyCitmIDg5MC8zNDg5LzExNzIgODgzLzM0NjAvMTE3MiA4MzEvMzU4OC8xMTcyCitmIDc5OS8zNTY2LzEwNDMgODI2LzM1NzkvMTA0MyA4NzgvMzQ0Mi8xMDQzCitmIDg3OC8zNDQyLzEwNDMgODUxLzM0MjMvMTA0MyA3OTkvMzU2Ni8xMDQzCitmIDgzNy8zNTk4LzEwNDQgNzk4LzM1MzEvMTA0NCA4NTAvMzMzNC8xMDQ0CitmIDg1MC8zMzM0LzEwNDQgODg5LzM0ODQvMTA0NCA4MzcvMzU5OC8xMDQ0CitmIDg0MS8zNjAwLzExNzIgODQwLzM2MDEvMTE3MiA4OTIvMzQ5OS8xMTcyCitmIDg5Mi8zNDk5LzExNzIgODkzLzM0OTgvMTE3MiA4NDEvMzYwMC8xMTcyCitmIDgzOS8zNjAyLzExNzIgODQxLzM2MDAvMTE3MiA4OTMvMzQ5OC8xMTcyCitmIDg5My8zNDk4LzExNzIgODkxLzM1MDMvMTE3MiA4MzkvMzYwMi8xMTcyCitmIDg0My8zNjAzLzEyNDMgODQ0LzM2MDQvMTI0MyA4OTYvMzUwNy8xMjQzCitmIDg5Ni8zNTA3LzEyNDIgODk1LzM1MDYvMTI0MiA4NDMvMzYwMy8xMjQyCitmIDg0NC8zNjA0LzExNzIgODQyLzM2MDUvMTE3MiA4OTQvMzUxMS8xMTcyCitmIDg5NC8zNTExLzEyNDMgODk2LzM1MDcvMTI0MyA4NDQvMzYwNC8xMjQzCitmIDgzOC8zNTk5LzExNzIgMTEzNS8zNjA2LzExNzIgMTEzNi8zNjA3LzExNzIKK2YgMTEzNi8zNjA3LzExNzIgODkwLzM0ODkvMTE3MiA4MzgvMzU5OS8xMTcyCitmIDg0Mi8zNjA1LzExNzIgODMyLzM1ODkvMTE3MiA4ODQvMzQ2NC8xMTcyCitmIDg4NC8zNDY0LzExNzIgODk0LzM1MTEvMTE3MiA4NDIvMzYwNS8xMTcyCitmIDg0MC8zNjAxLzExNzIgODQ1LzM2MDgvMTE3MiA4OTcvMzUyMS8xMTcyCitmIDg5Ny8zNTIxLzExNzIgODkyLzM0OTkvMTE3MiA4NDAvMzYwMS8xMTcyCitmIDg0NS8zNjA4LzExNzIgODQzLzM2MDMvMTE3MiA4OTUvMzUwNi8xMTcyCitmIDg5NS8zNTA2LzExNzIgODk3LzM1MjEvMTE3MiA4NDUvMzYwOC8xMTcyCitmIDk4My8zNjA5LzEwNDMgNDE2LzM2MTAvMTA0MyA0MjEvMjYxNy8xMDQzCitmIDQyMS8yNjE3LzEwNDMgOTgwLzI2MTYvMTA0MyA5ODMvMzYwOS8xMDQzCitmIDI0MDMvMzYxMS8xMTcyIDE0OTMvMzYxMi8xMTcyIDE0ODQvMjM5NC8xMTcyCitmIDE0ODQvMjM5NC8xMTcyIDkwMS8yMzkzLzExNzIgMjQwNC8zNjExLzExNzIKK2YgNDI1LzIzMzgvMTQ5NiA4OTkvMzYxMy8xNDk2IDI0MDUvMzYxMy8xNDk2CitmIDI0MDYvMzYxNC8xNDk3IDI0MDcvMzYxNS8xNDk3IDQyNS8zNjE2LzE0OTcKK2YgODk5LzM2MTMvMTA0MyA0MjUvMjMzOC8xMDQzIDQxNS8yMzM3LzEwNDMKK2YgNDE1LzIzMzcvMTA0MyA4OTgvMjM1NC8xMDQzIDg5OS8zNjEzLzEwNDMKK2YgOTk4LzIzMzYvMTA0MyA0MDAvMjMzNC8xMDQzIDQxNi8zNjEwLzEwNDMKK2YgNDE2LzM2MTAvMTA0MyA5ODMvMzYwOS8xMDQzIDk5OC8yMzM2LzEwNDMKK2YgOTA2LzI2MDkvMTA0MyA5MDMvMzYxNy8xMDQzIDkwMi8zNjE4LzEwNDMKK2YgOTAyLzM2MTgvMTA4MSA0MTgvMjM1OS8xMDgxIDkwNi8yNjA5LzEwODEKK2YgMjQwOC8zNjE5LzIyMSAxNDg2LzM2MjAvMjIxIDE0ODUvMzYyMS8yMjEKK2YgMTQ4NS8zNjIxLzIyMSA5MDUvMzYyMi8yMjEgMjQwOS8zNjE5LzIyMQorZiA5NTAvMjM2Ny8xNDk4IDkwMy8zNjE3LzE0OTggMjQxMC8zNjIzLzE0OTgKK2YgMjQxMS8zNjI0LzE0OTkgMjQxMi8zNjI1LzE0OTkgOTUwLzM2MjYvMTQ5OQorZiA0MDMvMjMyNC8xMDQzIDM5OS8yMjc4LzEwNDMgNDE4LzIzNTkvMTA0MworZiA0MTgvMjM1OS8xMDQzIDkwMi8zNjE4LzEwNDMgNDAzLzIzMjQvMTA0MworZiA5MDMvMzYxNy8xNTAwIDkwNi8yNjA5LzE1MDAgOTA4LzI2MDgvMTUwMAorZiA5MDgvMjYwOC8xNTAxIDI0MTMvMzYyMy8xNTAxIDkwMy8zNjE3LzE1MDEKK2YgMTQxMS8yNDA0LzIyMSAxNDg2LzM2MjAvMjIxIDI0MTQvMzYxOS8yMjEKK2YgMjQxNS8zNjI3LzIyMSAyNDE2LzM2MjgvMjIxIDE0MTEvMzYyOS8yMjEKK2YgNDIzLzI2MTAvMTA0MyA5MDYvMjYwOS8xMDQzIDQxOC8yMzU5LzEwNDMKK2YgNDE4LzIzNTkvMTA2NSA0MTkvMjM1OC8xMDY1IDQyMy8yNjEwLzEwNjUKK2YgNDAwLzIzMzQvMTA0MyA0MTEvMjM1My8xMDQzIDQxNi8zNjEwLzEwNDMKK2YgOTY4LzM2MzAvMTE4MiAyNDE3LzM2MzEvMTE4MiA5MTYvMzYzMi8xMTgyCitmIDkxNi8zNjMyLzExODIgOTEwLzIyNTUvMTE4MiA5NjgvMzYzMC8xMTgyCitmIDkyOS8zNjMzLzY5NyA5MjIvMzYzNC82OTcgMjQxOC8zNjM1LzY5NworZiAyNDE5LzM2MzYvNjk3IDkxMi8yMjYyLzY5NyA5MjkvMjI2MS82OTcKK2YgOTY5LzM2MzcvMTA0MyA5NjgvMzYzMC8xMDQzIDkxMC8yMjU1LzEwNDMKK2YgOTEwLzIyNTUvMTA0MyA5MTEvMjI1OC8xMDQzIDk2OS8zNjM3LzEwNDMKK2YgOTcwLzE1OTEvMTIwMyA5NjcvMzYzOC8xMjAzIDkwOS8yMjU5LzEyMDMKK2YgOTA5LzIyNTkvMTIwMyA5MTIvMjI2Mi8xMjAzIDk3MC8xNTkxLzEyMDMKK2YgOTcxLzM2MzkvMTA0MyA5NzIvMzY0MC8xMDQzIDkxNC8yMjYzLzEwNDMKK2YgOTE0LzIyNjMvMTA0MyA5MTMvMjI2Ni8xMDQzIDk3MS8zNjM5LzEwNDMKK2YgOTc3LzM2NDEvMTA0MyA5NzMvMzY0Mi8xMDQzIDkxNS8yMjY3LzEwNDMKK2YgOTE1LzIyNjcvMTA0MyA5MTcvMjI3MC8xMDQzIDk3Ny8zNjQxLzEwNDMKK2YgOTcyLzM2NDAvMTA0MyA5NjkvMzYzNy8xMDQzIDkxMS8yMjU4LzEwNDMKK2YgOTExLzIyNTgvMTA0MyA5MTQvMjI2My8xMDQzIDk3Mi8zNjQwLzEwNDMKK2YgOTczLzM2NDIvMTA0MyA5NzEvMzYzOS8xMDQzIDkxMy8yMjY2LzEwNDMKK2YgOTEzLzIyNjYvMTA0MyA5MTUvMjI2Ny8xMDQzIDk3My8zNjQyLzEwNDMKK2YgOTc4LzM2NDMvNjg3IDE0OTIvMzY0NC82ODcgMTQ4Ny8zNjQ1LzY4NworZiAxNDg3LzM2NDUvNjg3IDkxOC8zNjQ2LzY4NyA5NzgvMzY0My82ODcKK2YgOTc5LzM2NDcvMTUwMiA5NzcvMzY0MS8xNTAyIDkxNy8yMjcwLzE1MDIKK2YgOTE3LzIyNzAvMTUwMyA5MTkvMjI3MC8xNTAzIDk3OS8zNjQ3LzE1MDMKK2YgMjQyMC8zNTc4LzEwNDQgOTc1LzM1NzgvMTA0NCA5MjEvMzU3Ni8xMDQ0CitmIDkyMS8zNjQ4LzEwNDQgMjQyMS8zNjQ5LzEwNDQgMjQyMi8zNjUwLzEwNDQKK2YgOTEwLzIyNTUvMTE4MiA5MTYvMzYzMi8xMTgyIDI0MjMvMzY1MS8xMTgyCitmIDI0MjQvMzY1MS8xMTgzIDkyNy8yMjU2LzExODMgOTEwLzIyNTUvMTE4MworZiA5NTgvMTUzNS8xMDQzIDk1OS8zNjUyLzEwNDMgOTI4LzIyNTcvMTA0MworZiA5MjgvMjI1Ny8xMDQzIDkyNy8yMjU2LzEwNDMgOTU4LzE1MzUvMTA0MworZiAyNDI1LzM2NTMvMTIwMyA5NjAvMzY1NC8xMjAzIDkyOS8zNjMzLzEyMDMKK2YgOTI5LzIyNjEvMTIwMyA5MjYvMjI2MC8xMjAzIDI0MjYvMzY1NS8xMjAzCitmIDk2Mi8zNjU2LzEwNDMgOTYxLzIzNTcvMTA0MyA5MzAvMjI2NS8xMDQzCitmIDkzMC8yMjY1LzEwNDMgOTMxLzIyNjQvMTA0MyA5NjIvMzY1Ni8xMDQzCitmIDI0MjcvMzY1Ny8xMTAyIDkyNC8yMjY5LzExMDIgOTMyLzIyNjgvMTEwMgorZiA5MzIvMjI2OC8xMTAyIDk2My8yMzU2LzExMDIgMjQyOC8zNjU3LzExMDIKK2YgOTU5LzM2NTIvMTA0MyA5NjIvMzY1Ni8xMDQzIDkzMS8yMjY0LzEwNDMKK2YgOTMxLzIyNjQvMTA0MyA5MjgvMjI1Ny8xMDQzIDk1OS8zNjUyLzEwNDMKK2YgOTMyLzIyNjgvMTA0MyA5MTUvMjI2Ny8xMDQzIDkxMy8yMjY2LzEwNDMKK2YgOTEzLzIyNjYvMTA0MyA5MzAvMjI2NS8xMDQzIDkzMi8yMjY4LzEwNDMKK2YgOTE4LzM2NDYvNjg3IDE0ODcvMzY0NS82ODcgMTQ4OC8zNjU4LzY4NworZiAxNDg4LzM2NTgvNjg3IDkyMy8zNjU5LzY4NyA5MTgvMzY0Ni82ODcKK2YgMjQyOS8zNjYwLzE1MDMgMjQzMC8zNjYwLzE1MDMgMjQzMS8zNjYxLzE1MDMKK2YgMjQzMi8zNjYyLzE1MDQgOTI1LzM2NjIvMTUwNCAyNDMzLzM2NjMvMTUwNAorZiAyNDM0LzM1NzYvMTA0NCA5MjEvMzU3Ni8xMDQ0IDkzNC8zNTc1LzEwNDQKK2YgOTM0LzM2NjQvMTA0NCAyNDM1LzM2NjQvMTA0NCAyNDM2LzM2NjUvMTA0NAorZiA5NjUvMzQ0MC8xMDQ0IDkzNC8zNTc1LzEwNDQgOTMzLzM1NzQvMTA0NAorZiA5MzMvMzU3NC8xMDQ0IDk2NC8zNjY2LzEwNDQgOTY1LzM0NDAvMTA0NAorZiA5NjAvMzY1NC82OTcgMjQzNy8zNjY3LzY5NyA5MjIvMzYzNC82OTcKK2YgOTIyLzM2MzQvNjk3IDkyOS8zNjMzLzY5NyA5NjAvMzY1NC82OTcKK2YgMTQwLzE1MTcvMTA0MyA0Ni8xNTE2LzEwNDMgOTQyLzIyNzYvMTA0MworZiA5NDIvMjI3Ni8xMDQzIDk0My8yMjc1LzEwNDMgMTQwLzE1MTcvMTA0MworZiAyNS8xNTMzLzExODIgMTcvMTUzMi8xMTgyIDkzNy8yMjg0LzExODIKK2YgOTM3LzIyODQvMTE4MiA5MzUvMjI4My8xMTgyIDI1LzE1MzMvMTE4MgorZiA2OC8zNjY4LzY5NyAyNDM4LzM2NjkvNjk3IDI0MzkvMzY3MC82OTcKK2YgMjQ0MC8yMjkzLzY5NyA5NDAvMjI5Mi82OTcgNjgvMTU4OC82OTcKK2YgMTcvMTUzMi8xMDQzIDYwLzE2NzQvMTA0MyA5MzkvMjI5Ny8xMDQzCitmIDkzOS8yMjk3LzEwNDMgOTM3LzIyODQvMTA0MyAxNy8xNTMyLzEwNDMKK2YgODQvMTY4OS8xMjAzIDY4LzE1ODgvMTIwMyA5NDAvMjI5Mi8xMjAzCitmIDk0MC8yMjkyLzEyMDMgOTQxLzIzMDEvMTIwMyA4NC8xNjg5LzEyMDMKK2YgMTI2LzE3NTkvNjg3IDEzODgvMTc1OC82ODcgMTQ4OS8yMzA2LzY4NworZiAxNDg5LzIzMDYvNjg3IDkzOC8yMzA1LzY4NyAxMjYvMTc1OS82ODcKK2YgNDYvMzY3MS8xMjM5IDI0NDEvMzY3Mi8xMjM5IDI0NDIvMzY3My8xMjM5CitmIDI0NDMvMzY3NC8xMjM5IDk0Mi8zNjc1LzEyMzkgNDYvMzY3Ni8xMjM5CitmIDE5Mi8xODY2LzEwNDMgMTQwLzE1MTcvMTA0MyA5NDMvMjI3NS8xMDQzCitmIDk0My8yMjc1LzEwNDMgOTQ1LzIzMjMvMTA0MyAxOTIvMTg2Ni8xMDQzCitmIDIxMC8xOTEwLzEwNDMgMTU2LzE5MTEvMTA0MyA5NDQvMjMyOC8xMDQzCitmIDk0NC8yMzI4LzEwNDMgOTQ2LzIzMjcvMTA0MyAyMTAvMTkxMC8xMDQzCitmIDE1Ni8xOTExLzEwNDMgMTkyLzE4NjYvMTA0MyA5NDUvMjMyMy8xMDQzCitmIDk0NS8yMzIzLzEwNDMgOTQ0LzIzMjgvMTA0MyAxNTYvMTkxMS8xMDQzCitmIDYwLzE2NzQvMTA0MyAyMTAvMTkxMC8xMDQzIDk0Ni8yMzI3LzEwNDMKK2YgOTQ2LzIzMjcvMTA0MyA5MzkvMjI5Ny8xMDQzIDYwLzE2NzQvMTA0MworZiA4NzYvMzQ0MS8xMDQ0IDk0OC8zNDM2LzEwNDQgMjQ0NC8zNDM2LzEwNDQKK2YgMjQ0NS8zNjc3LzEwNDQgMjQ0Ni8zNjc4LzEwNDQgODc2LzM2NzgvMTA0NAorZiA3OTcvMzUzMC8xMDQ0IDg0OS8zMzMwLzEwNDQgOTQ4LzM0MzYvMTA0NAorZiA5NDgvMzQzNi8xMDQ0IDk0Ny8zNTcyLzEwNDQgNzk3LzM1MzAvMTA0NAorZiA5MDIvMzYxOC8xMDY1IDkwMy8zNjE3LzEwNjUgOTUwLzIzNjcvMTA2NQorZiA5NTAvMjM2Ny8xMDY1IDk0OS8yMzY2LzEwNjUgOTAyLzM2MTgvMTA2NQorZiA5MDUvMzYyMi8yMjAgMTQ4NS8zNjIxLzIyMCAxNDkwLzIzOTIvMjIwCitmIDE0OTAvMjM5Mi8yMjAgOTUyLzIzOTEvMjIwIDkwNS8zNjIyLzIyMAorZiA0MjIvMjM2OC8xNTA1IDk1MC8yMzY3LzE1MDUgMjQ0Ny8zNjc5LzE1MDUKK2YgMjQ0OC8zNjgwLzE1MDYgMjQ0OS8zNjgxLzE1MDYgNDIyLzM2ODIvMTUwNgorZiA5MjcvMjI1Ni8xMTgzIDI0NTAvMzY1MS8xMTgzIDk1My8xNTM2LzExODMKK2YgOTUzLzE1MzYvMTE4MiA5NTgvMTUzNS8xMTgyIDkyNy8yMjU2LzExODIKK2YgOTMwLzIyNjUvMTA0MyA5NjEvMjM1Ny8xMDQzIDk2My8yMzU2LzEwNDMKK2YgOTYzLzIzNTYvMTA0MyA5MzIvMjI2OC8xMDQzIDkzMC8yMjY1LzEwNDMKK2YgOTIzLzM2NTkvMTUwNyAxNDg4LzM2NTgvMTUwNyAxNDkxLzIzODMvMTUwNworZiAxNDkxLzIzODMvMTUwNyA5NTQvMzY4My8xNTA3IDkyMy8zNjU5LzE1MDcKK2YgMjQ1MS8zNjg0LzE1MDggOTU1LzI2NDEvMTUwOCA5NTYvMjY0MS8xNTA4CitmIDk1Ni8yMzg0LzE1MDkgOTI1LzM2ODUvMTUwOSAyNDUyLzM2ODUvMTUwOQorZiA5MzQvMzU3NS8xMDQ0IDk2NS8zNDQwLzEwNDQgOTU3LzM0NDAvMTA0NAorZiA5NTcvMzQ0MC8xMDQ0IDI0NTMvMzU3NS8xMDQ0IDkzNC8zNTc1LzEwNDQKK2YgMzg3LzE1MzQvMTA0MyAzOTEvMjI5OC8xMDQzIDk1OS8zNjUyLzEwNDMKK2YgOTU5LzM2NTIvMTA0MyA5NTgvMTUzNS8xMDQzIDM4Ny8xNTM0LzEwNDMKK2YgMzk1LzIzMDIvMTIwMyAzOTMvMjI5MS8xMjAzIDk2MC8zNjg2LzEyMDMKK2YgOTYwLzM2ODYvMTIwMyAyNDU0LzM2ODcvMTIwMyAzOTUvMjMwMi8xMjAzCitmIDQwNS8yMzMwLzEwNDMgNDAxLzIzMjkvMTA0MyA5NjEvMjM1Ny8xMDQzCitmIDk2MS8yMzU3LzEwNDMgOTYyLzM2NTYvMTA0MyA0MDUvMjMzMC8xMDQzCitmIDQyMi8yMzY4LzExMDIgMjQ1NS8zNjU3LzExMDIgOTYzLzIzNTYvMTEwMgorZiA5NjMvMjM1Ni8xMTAyIDQxNy8yMzU1LzExMDIgNDIyLzIzNjgvMTEwMgorZiAzOTEvMjI5OC8xMDQzIDQwNS8yMzMwLzEwNDMgOTYyLzM2NTYvMTA0MworZiA5NjIvMzY1Ni8xMDQzIDk1OS8zNjUyLzEwNDMgMzkxLzIyOTgvMTA0MworZiA4NzYvMzQ0MS8xMDQ0IDk2NS8zNDQwLzEwNDQgOTY0LzM2NjYvMTA0NAorZiA5NjQvMzY2Ni8xMDQ0IDgyNC8zNTcxLzEwNDQgODc2LzM0NDEvMTA0NAorZiAzOTMvMzY4OC82OTcgMjQ1Ni8zNjg5LzY5NyAyNDU3LzM2OTAvNjk3CitmIDI0NTgvMzY5MS82OTcgOTYwLzM2ODYvNjk3IDM5My8yMjkxLzY5NworZiA0MDMvMjMyNC8xMDQzIDkwMi8zNjE4LzEwNDMgOTQ5LzIzNjYvMTA0MworZiA5NDkvMjM2Ni8xMDQzIDk2Ni8yMzM1LzEwNDMgNDAzLzIzMjQvMTA0MworZiA0MDEvMjMyOS8xMDQzIDk2Ni8yMzM1LzEwNDMgOTQ5LzIzNjYvMTA0MworZiA5NDkvMjM2Ni8xMDQzIDQxNy8yMzU1LzEwNDMgNDAxLzIzMjkvMTA0MworZiA5NDQvMjMyOC8xMDQzIDk0NS8yMzIzLzEwNDMgNDAzLzIzMjQvMTA0MworZiA0MDMvMjMyNC8xMDQzIDk2Ni8yMzM1LzEwNDMgOTQ0LzIzMjgvMTA0MworZiA5MTIvMjI2Mi82OTcgMjQ1OS8zNjM2LzY5NyA5NzYvMTU5Mi82OTcKK2YgOTc2LzE1OTIvNjk3IDk3MC8xNTkxLzY5NyA5MTIvMjI2Mi82OTcKK2YgOTIwLzM1NzMvMTA0NCA5MjEvMzU3Ni8xMDQ0IDk3NS8zNTc4LzEwNDQKK2YgOTc1LzM1NzgvMTA0NCA5NzQvMzU3Ny8xMDQ0IDkyMC8zNTczLzEwNDQKK2YgNDA3LzM2OTIvMTE4MiAyNDYwLzM2OTMvMTE4MiAyNDYxLzM2OTQvMTE4MgorZiAyNDYyLzM2MzEvMTE4MiA5NjgvMzYzMC8xMTgyIDQwNy8yMzQyLzExODIKK2YgNDA3LzIzNDIvMTA0MyA5NjgvMzYzMC8xMDQzIDk2OS8zNjM3LzEwNDMKK2YgOTY5LzM2MzcvMTA0MyA0MDgvMjM0NC8xMDQzIDQwNy8yMzQyLzEwNDMKK2YgNDA5LzE1OTAvMTIwMyA0MTAvMjM0NS8xMjAzIDk2Ny8zNjM4LzEyMDMKK2YgOTY3LzM2MzgvMTIwMyA5NzAvMTU5MS8xMjAzIDQwOS8xNTkwLzEyMDMKK2YgNDExLzIzNTMvMTA0MyA0MTIvMjM1Mi8xMDQzIDk3Mi8zNjQwLzEwNDMKK2YgOTcyLzM2NDAvMTA0MyA5NzEvMzYzOS8xMDQzIDQxMS8yMzUzLzEwNDMKK2YgNDE2LzM2MTAvMTA0MyA5NzMvMzY0Mi8xMDQzIDk3Ny8zNjQxLzEwNDMKK2YgOTc3LzM2NDEvMTA0MyA0MjEvMjYxNy8xMDQzIDQxNi8zNjEwLzEwNDMKK2YgNDEyLzIzNTIvMTA0MyA0MDgvMjM0NC8xMDQzIDk2OS8zNjM3LzEwNDMKK2YgOTY5LzM2MzcvMTA0MyA5NzIvMzY0MC8xMDQzIDQxMi8yMzUyLzEwNDMKK2YgNDExLzIzNTMvMTA0MyA5NzEvMzYzOS8xMDQzIDk3My8zNjQyLzEwNDMKK2YgOTczLzM2NDIvMTA0MyA0MTYvMzYxMC8xMDQzIDQxMS8yMzUzLzEwNDMKK2YgMTQwOS8zNjk1LzY4NyAxNDkyLzM2NDQvNjg3IDk3OC8zNjQzLzY4NworZiA5NzgvMzY0My82ODcgNDMyLzM2OTYvNjg3IDE0MDkvMzY5NS82ODcKK2YgNDIxLzI2MTcvMTUxMCA5NzcvMzY0MS8xNTEwIDk3OS8zNjQ3LzE1MTAKK2YgOTc5LzM2NDcvMTUxMSA0ODUvMjYxNy8xNTExIDQyMS8yNjE3LzE1MTEKK2YgODc3LzM0MzMvMTA0NCA5NzUvMzU3OC8xMDQ0IDI0NjMvMzU3OC8xMDQ0CitmIDI0NjQvMzY5Ny8xMDQ0IDI0NjUvMzY5OC8xMDQ0IDg3Ny8zNjk5LzEwNDQKK2YgODk5LzM2MTMvMTUxMiA5ODAvMjYxNi8xNTEyIDk4Mi8yNjE1LzE1MTIKK2YgOTgyLzI2MTUvMTUxMyAyNDY2LzM2MTMvMTUxMyA4OTkvMzYxMy8xNTEzCitmIDk4MC8yNjE2LzEwNDMgODk5LzM2MTMvMTA0MyA4OTgvMjM1NC8xMDQzCitmIDg5OC8yMzU0LzEwNDMgOTgzLzM2MDkvMTA0MyA5ODAvMjYxNi8xMDQzCitmIDI0NjcvMzcwMC8xMTcyIDE0OTMvMzcwMS8xMTcyIDI0NjgvMzcwMi8xMTcyCitmIDI0NjkvMzcwMy8xMTcyIDI0NzAvMzcwNC8xMTcyIDI0NzEvMzcwNS8xMTcyCitmIDM3Ny8yMjQ4LzEwNDMgMzc4LzE4NjQvMTA0MyA5OTAvMjI3Mi8xMDQzCitmIDk5MC8yMjcyLzEwNDMgOTg5LzIyNzEvMTA0MyAzNzcvMjI0OC8xMDQzCitmIDM3MC8xNjcxLzExODIgMzcxLzIyNTAvMTE4MiA5OTQvMjI4MC8xMTgyCitmIDk5NC8yMjgwLzExODIgOTg0LzIyNzkvMTE4MiAzNzAvMTY3MS8xMTgyCitmIDI0NzIvMjI1NC82OTcgMzc0LzE2OTIvNjk3IDk4Ny8yMjg2LzY5NworZiA5ODcvMzcwNi82OTcgMjQ3My8zNzA3LzY5NyAyNDc0LzM3MDgvNjk3CitmIDM3My8xNjcyLzEwNDMgMzcwLzE2NzEvMTA0MyA5ODQvMjI3OS8xMDQzCitmIDk4NC8yMjc5LzEwNDMgOTg2LzIyOTkvMTA0MyAzNzMvMTY3Mi8xMDQzCitmIDM3NC8xNjkyLzEyMDMgMzc1LzE2OTEvMTIwMyA5ODgvMjMwMy8xMjAzCitmIDk4OC8yMzAzLzEyMDMgOTg3LzIyODYvMTIwMyAzNzQvMTY5Mi8xMjAzCitmIDM3Ni8zNzA5LzY4NyAyNDc1LzM3MTAvNjg3IDE0OTQvMjMxMC82ODcKK2YgMTQ5NC8yMzEwLzY4NyA5OTUvMjMwOS82ODcgMzc2LzM3MDkvNjg3CitmIDI0NzYvMzcxMS8xMjM5IDM3Ny8zNzEyLzEyMzkgOTg5LzM3MTMvMTIzOQorZiA5ODkvMjMyMC8xMjM5IDk4NS8yMzE5LzEyMzkgMjQ3Ny8zNzE0LzEyMzkKK2YgMzc4LzE4NjQvMTA0MyAzODAvMTg2My8xMDQzIDk5Mi8yMzI1LzEwNDMKK2YgOTkyLzIzMjUvMTA0MyA5OTAvMjI3Mi8xMDQzIDM3OC8xODY0LzEwNDMKK2YgMzc5LzE5MDgvMTA0MyAzODEvMTkwNy8xMDQzIDk5My8yMzMyLzEwNDMKK2YgOTkzLzIzMzIvMTA0MyA5OTEvMjMzMS8xMDQzIDM3OS8xOTA4LzEwNDMKK2YgMzgwLzE4NjMvMTA0MyAzNzkvMTkwOC8xMDQzIDk5MS8yMzMxLzEwNDMKK2YgOTkxLzIzMzEvMTA0MyA5OTIvMjMyNS8xMDQzIDM4MC8xODYzLzEwNDMKK2YgMzgxLzE5MDcvMTA0MyAzNzMvMTY3Mi8xMDQzIDk4Ni8yMjk5LzEwNDMKK2YgOTg2LzIyOTkvMTA0MyA5OTMvMjMzMi8xMDQzIDM4MS8xOTA3LzEwNDMKK2YgMjQ3OC8zMzM1LzEwNDQgODc0LzMzMzUvMTA0NCA5OTcvMzQyOC8xMDQ0CitmIDk5Ny8zNzE1LzEwNDQgMjQ3OS8zNzE2LzEwNDQgMjQ4MC8zNzE3LzEwNDQKK2YgODIzLzM1NjkvMTA0NCA4NzUvMzQyOS8xMDQ0IDk5Ny8zNDI4LzEwNDQKK2YgOTk3LzM0MjgvMTA0NCA5OTYvMzU2OC8xMDQ0IDgyMy8zNTY5LzEwNDQKK2YgODk4LzIzNTQvMTA0MyA0MDIvMjMyNi8xMDQzIDk5OC8yMzM2LzEwNDMKK2YgOTk4LzIzMzYvMTA0MyA5ODMvMzYwOS8xMDQzIDg5OC8yMzU0LzEwNDMKK2YgOTk4LzIzMzYvMTA0MyA0MDIvMjMyNi8xMDQzIDk5Mi8yMzI1LzEwNDMKK2YgOTkyLzIzMjUvMTA0MyA5OTEvMjMzMS8xMDQzIDk5OC8yMzM2LzEwNDMKK2YgMTA2Ny8zNzE4LzEwNDQgMTA2OC8zNzE5LzEwNDQgMTA2OS8zNzIwLzEwNDQKK2YgMTA2OS8zNzIwLzEwNDQgMTA2Ni8zNzIxLzEwNDQgMTA2Ny8zNzE4LzEwNDQKK2YgMTA0MC8zNzIyLzEwNDQgMTA0Mi8zNzIzLzEwNDQgMTA0My8zNzI0LzEwNDQKK2YgMTA0My8zNzI0LzEwNDQgMTA0MS8zNzI1LzEwNDQgMTA0MC8zNzIyLzEwNDQKK2YgMTA0Mi8zNzIzLzEwNDQgMTA0NC8zNzI2LzEwNDQgMTA0NS8zNzI3LzEwNDQKK2YgMTA0NS8zNzI3LzEwNDQgMTA0My8zNzI0LzEwNDQgMTA0Mi8zNzIzLzEwNDQKK2YgMjQ4MS8zNzI4LzEyMzggMjQ4Mi8zNzI5LzEyMzggMTA0Ni8zNzMwLzEyMzgKK2YgMTA0Ni8zNzMxLzEyMzggMTA0Ny8zNzMyLzEyMzggMjQ4My8zNzMzLzEyMzgKK2YgMTA0Ni8zNzM0LzY4NyAxNDk5LzM3MzUvNjg3IDE1MDAvMzczNi82ODcKK2YgMTUwMC8zNzM2LzY4NyAxMDQ3LzM3MzcvNjg3IDEwNDYvMzczNC82ODcKK2YgMjgzLzI1MzMvMTA4MCAxMDMyLzI1MzUvMTA4MCAxMDM4LzM3MzgvMTA4MAorZiAxMDM4LzM3MzgvMTA0NCAxMDI4LzIxNDEvMTA0NCAyODMvMjUzMy8xMDQ0CitmIDEwMDAvMzczOS8xMDQ0IDMxMC8yNTYzLzEwNDQgMTAzMy8yNTYyLzEwNDQKK2YgMTAzMy8yNTYyLzEwNDQgMTAzOS8zNzQwLzEwNDQgMTAwMC8zNzM5LzEwNDQKK2YgMjg1LzI0ODIvMTA0NCAyODYvMjQ4MS8xMDQ0IDEwMDEvMzc0MS8xMDQ0CitmIDEwMDEvMzc0MS8xMDQ0IDk5OS8zNzQyLzEwNDQgMjg1LzI0ODIvMTA0NAorZiAzMTEvMjU3MS8xMDQ0IDMxMC8yNTYzLzEwNDQgMTAwMC8zNzM5LzEwNDQKK2YgMTAwMC8zNzM5LzEwNDQgMTAwMi8zNzQzLzEwNDQgMzExLzI1NzEvMTA0NAorZiAyODcvMjQ4Ny8xMDQ0IDEwMDMvMzc0NC8xMDQ0IDEwMDEvMzc0MS8xMDQ0CitmIDEwMDEvMzc0MS8xMDQ0IDI4Ni8yNDgxLzEwNDQgMjg3LzI0ODcvMTA0NAorZiAzMTEvMjU3MS8xMDgwIDEwMDIvMzc0My8xMDgwIDEwMDQvMzc0NS8xMDgwCitmIDEwMDQvMzc0NS8xMDQ0IDMxMi8yNTc2LzEwNDQgMzExLzI1NzEvMTA0NAorZiAyNDg0LzM3NDYvMTIzOCAxMDA1LzM3NDcvMTIzOCAyNDg1LzM3NDgvMTIzOAorZiAyNDg2LzM3NDkvMTIzOCAyNDg3LzM3NTAvMTIzOCAyNDg4LzM3NTEvMTIzOAorZiAyNDg5LzM3NTIvMTIzOCAyNDkwLzM3NTMvMTIzOCAxMDA2LzM3NTQvMTIzOAorZiAxMDA2LzM3NTUvMTUxNCAyNDkxLzM3NTYvMTUxNCAyNDkyLzM3NTcvMTUxNAorZiAxMzk2LzM3NTgvNjg3IDE0OTUvMzc1OS82ODcgMTAwNS8zNzYwLzY4NworZiAxMDA1LzM3NjAvNjg3IDI0OTMvMzc2MS82ODcgMTM5Ni8zNzU4LzY4NworZiAxMzk4LzI1ODQvNjg3IDE0OTYvMzc2Mi82ODcgMTAwOC8zNzYzLzY4NworZiAxMDA4LzM3NjMvNjg3IDQ4MS8yNTg1LzY4NyAxMzk4LzI1ODQvNjg3CitmIDMzNi8yMTI1LzEwNDQgMTAxMC8zNzY0LzEwNDQgMTAyMC8zNzY1LzEwNDQKK2YgMTAyMC8zNzY1LzEwNDQgMzM0LzIwOTMvMTA0NCAzMzYvMjEyNS8xMDQ0CitmIDMxOS8xNjc2LzEwNDQgMTAxOS8zNzY2LzEwNDQgMTAwOS8zNzY3LzEwNDQKK2YgMTAwOS8zNzY3LzEwNDQgMzIxLzE2NzcvMTA0NCAzMTkvMTY3Ni8xMDQ0CitmIDMzOC8yMTAxLzEyMDUgMTAxMi8zNzY4LzEyMDUgMTAyMi8zNzY5LzEyMDUKK2YgMTAyMi8zNzY5LzEyMDUgMzQwLzIxMjcvMTIwNSAzMzgvMjEwMS8xMjA1CitmIDMyNS8xNjk1LzEyMDQgMTAyMS8zNzcwLzEyMDQgMTAxMS8zNzcxLzEyMDQKK2YgMTAxMS8zNzcxLzEyMDQgMzIzLzE2OTYvMTIwNCAzMjUvMTY5NS8xMjA0CitmIDMzNi8yMTI1LzEwNDQgMzQyLzIxMjkvMTA0NCAxMDEzLzIxNDIvMTA0NAorZiAxMDEzLzIxNDIvMTA0NCAxMDEwLzM3NjQvMTA0NCAzMzYvMjEyNS8xMDQ0CitmIDMyNy8xOTcxLzEwNDQgMzIxLzE2NzcvMTA0NCAxMDA5LzM3NjcvMTA0NAorZiAxMDA5LzM3NjcvMTA0NCAxMDE0LzM3NzIvMTA0NCAzMjcvMTk3MS8xMDQ0CitmIDMzMy8yMDk0LzExODQgMzM0LzIwOTMvMTE4NCAxMDIwLzM3NjUvMTE4NAorZiAxMDIwLzM3NjUvMTE4NCAxMDE1LzM3NzMvMTE4NCAzMzMvMjA5NC8xMTg0CitmIDMxOS8xNjc2LzExODQgMzI4LzIxMzUvMTE4NCAxMDE2LzM3NzQvMTE4NAorZiAxMDE2LzM3NzQvMTE4NCAxMDE5LzM3NjYvMTE4NCAzMTkvMTY3Ni8xMTg0CitmIDMzOC8zNzc1LzY5NyAyNDk0LzM3NzYvNjk3IDI0OTUvMzc3Ny82OTcKK2YgMjQ5Ni8zNzc4LzY5NyAxMDEyLzM3NjgvNjk3IDMzOC8yMTAxLzY5NworZiAyNDk3LzM3NzkvNjk3IDMyMy8xNjk2LzY5NyAxMDExLzM3NzEvNjk3CitmIDEwMTEvMzc4MC82OTcgMjQ5OC8zNzgxLzY5NyAyNDk5LzM3ODIvNjk3CitmIDg2OS8zNDE0LzEwNDMgMTAyMy8zNzgzLzEwNDMgMjUwMC8zNzgzLzEwNDMKK2YgMjUwMS8zNzg0LzEwNDMgMjUwMi8zNzg1LzEwNDMgODY5LzM3ODYvMTA0MworZiAyNTAzLzM3ODcvMTA0MyAyNTA0LzM3ODgvMTA0MyAxMDI0LzM3ODkvMTA0MworZiAxMDI0LzM3OTAvMTA0MyA4NzAvMzQxNy8xMDQzIDI1MDUvMzQxNy8xMDQzCitmIDg3MC8zNDE3LzEwNDMgMTAyNC8zNzkwLzEwNDMgMTAxOC8zNzkxLzEwNDMKK2YgMTAxOC8zNzkxLzEwNDMgODE4LzM1NjQvMTA0MyA4NzAvMzQxNy8xMDQzCitmIDgxNy8zNTYxLzEwNDMgMTAxNy8zNzkyLzEwNDMgMTAyMy8zNzgzLzEwNDMKK2YgMTAyMy8zNzgzLzEwNDMgODY5LzM0MTQvMTA0MyA4MTcvMzU2MS8xMDQzCitmIDM0NS8yNTI4LzEwNDQgMjgzLzI1MzMvMTA0NCAxMDI4LzIxNDEvMTA0NAorZiAxMDI4LzIxNDEvMTA0NCAxMDMwLzIxNDAvMTA0NCAzNDUvMjUyOC8xMDQ0CitmIDEwMjYvMzc5My8xMDQ0IDMwMS8yMTczLzEwNDQgMzI2LzE5NzIvMTA0NAorZiAzMjYvMTk3Mi8xMDQ0IDEwNzAvMzc5NC8xMDQ0IDEwMjYvMzc5My8xMDQ0CitmIDEwNTQvMjE5NC8xMDQ0IDEwNjcvMzcxOC8xMDQ0IDEwNjYvMzcyMS8xMDQ0CitmIDEwNjYvMzcyMS8xMDQ0IDEwNTUvMjE5NS8xMDQ0IDEwNTQvMjE5NC8xMDQ0CitmIDM1NS8yMTIyLzEwNDQgMTA5Mi8zNzk1LzEwNDQgMTAyNS8yMTIzLzEwNDQKK2YgMzY1LzIxNzAvMTA0NCAzNjcvMjE3Mi8xMDQ0IDMwMS8yMTczLzEwNDQKK2YgMzAxLzIxNzMvMTA0NCAxMDI2LzM3OTMvMTA0NCAzNjUvMjE3MC8xMDQ0CitmIDEwOTIvMzc5NS8xMDQ0IDEwODkvMjQ5NS8xMDQ0IDI4NC8yNDc2LzEwNDQKK2YgMjg0LzI0NzYvMTA0NCAxMDI1LzIxMjMvMTA0NCAxMDkyLzM3OTUvMTA0NAorZiAzNDMvMjEyOC8xMDQ0IDI4Mi8yMTIwLzEwNDQgMTAyNS8yMTIzLzEwNDQKK2YgMTAyNS8yMTIzLzEwNDQgMTAyOS8zNzk2LzEwNDQgMzQzLzIxMjgvMTA0NAorZiAxMDI5LzM3OTYvMTA0NCAxMDI1LzIxMjMvMTA0NCAyODQvMjQ3Ni8xMDQ0CitmIDI4NC8yNDc2LzEwNDQgNDY5LzI0NzUvMTA0NCAxMDI5LzM3OTYvMTA0NAorZiAzNDIvMjEyOS8xMDQ0IDM0My8yMTI4LzEwNDQgMTAyOS8zNzk2LzEwNDQKK2YgMTAyOS8zNzk2LzEwNDQgMTAzMC8yMTQwLzEwNDQgMzQyLzIxMjkvMTA0NAorZiAxMDI5LzM3OTYvMTA0NCA0NjkvMjQ3NS8xMDQ0IDM0NS8yNTI4LzEwNDQKK2YgMzQ1LzI1MjgvMTA0NCAxMDMwLzIxNDAvMTA0NCAxMDI5LzM3OTYvMTA0NAorZiAzMzEvMjU5Ny8xMDQ0IDMwNC8yNjAyLzEwNDQgMTAyNi8zNzkzLzEwNDQKK2YgMTAyNi8zNzkzLzEwNDQgMTA3MC8zNzk0LzEwNDQgMzMxLzI1OTcvMTA0NAorZiAzMjcvMTk3MS8xMDQ0IDEwMTQvMzc3Mi8xMDQ0IDEwMjcvMzc5Ny8xMDQ0CitmIDEwMjcvMzc5Ny8xMDQ0IDEwMzEvMzc5OC8xMDQ0IDMyNy8xOTcxLzEwNDQKK2YgNDgzLzI1NDMvMTA0NCAxMDMxLzM3OTgvMTA0NCAxMDI3LzM3OTcvMTA0NAorZiAxMDI3LzM3OTcvMTA0NCAzMDUvMjU0NC8xMDQ0IDQ4My8yNTQzLzEwNDQKK2YgMTQxOS8yNDE5LzExNzIgMTQ5Ny8yNDMyLzExNzIgMTAzNy8yNDMxLzExNzIKK2YgMTAzNy8yNDMxLzExNzIgNDc3LzI0MjAvMTE3MiAxNDE5LzI0MTkvMTE3MgorZiAyNTA2LzM3OTkvMTUxNSAxNDk4LzI0NDIvMTUxNSAxMDM2LzI0NDUvMTUxNQorZiAxMDM2LzM4MDAvMjg1IDI1MDcvMzgwMS8yODUgMjUwOC8zODAyLzI4NQorZiAyODUvMjQ4Mi8xMjk1IDEwMzIvMjUzNS8xMjk1IDI1MDkvMjUzNC8xMjk1CitmIDI1MTAvMzgwMy8xMjgyIDI1MTEvMzgwNC8xMjgyIDI4NS8zODA1LzEyODIKK2YgMzA1LzI1NDQvMTMwNCAxMDMzLzI1NjIvMTMwNCAyNTEyLzI1NjEvMTMwNAorZiAyNTEzLzM4MDYvMTMwNCAyNTE0LzM4MDcvMTMwNCAzMDUvMzgwOC8xMzA0CitmIDEwNDEvMzcyNS8xMDQ0IDEwNjkvMzcyMC8xMDQ0IDEwNjgvMzcxOS8xMDQ0CitmIDEwNjgvMzcxOS8xMDQ0IDEwNDAvMzcyMi8xMDQ0IDEwNDEvMzcyNS8xMDQ0CitmIDEwMzIvMjUzNS8xMDQ0IDI4NS8yNDgyLzEwNDQgOTk5LzM3NDIvMTA0NAorZiA5OTkvMzc0Mi8xMDQ0IDEwMzgvMzczOC8xMDQ0IDEwMzIvMjUzNS8xMDQ0CitmIDMwNS8yNTQ0LzEwODAgMTAyNy8zNzk3LzEwODAgMTAzOS8zNzQwLzEwODAKK2YgMTAzOS8zNzQwLzEwNDQgMTAzMy8yNTYyLzEwNDQgMzA1LzI1NDQvMTA0NAorZiAxMDIwLzM3NjUvMTA0NCAxMDEwLzM3NjQvMTA0NCAxMDUxLzIxODcvMTA0NAorZiAxMDUxLzIxODcvMTA0NCAxMDYxLzIxODYvMTA0NCAxMDIwLzM3NjUvMTA0NAorZiAxMDA5LzM3NjcvMTA0NCAxMDE5LzM3NjYvMTA0NCAxMDYwLzIxODkvMTA0NAorZiAxMDYwLzIxODkvMTA0NCAxMDUwLzIxODgvMTA0NCAxMDA5LzM3NjcvMTA0NAorZiAxMDIyLzM3NjkvMTIwNSAxMDEyLzM3NjgvMTIwNSAxMDUzLzIxOTEvMTIwNQorZiAxMDUzLzIxOTEvMTIwNSAxMDYzLzIxOTAvMTIwNSAxMDIyLzM3NjkvMTIwNQorZiAxMDExLzM3NzEvMTIwNCAxMDIxLzM3NzAvMTIwNCAxMDYyLzIxOTMvMTIwNAorZiAxMDYyLzIxOTMvMTIwNCAxMDUyLzIxOTIvMTIwNCAxMDExLzM3NzEvMTIwNAorZiAxMDEwLzM3NjQvMTA0NCAxMDEzLzIxNDIvMTA0NCAxMDU0LzIxOTQvMTA0NAorZiAxMDU0LzIxOTQvMTA0NCAxMDUxLzIxODcvMTA0NCAxMDEwLzM3NjQvMTA0NAorZiAxMDE0LzM3NzIvMTA0NCAxMDA5LzM3NjcvMTA0NCAxMDUwLzIxODgvMTA0NAorZiAxMDUwLzIxODgvMTA0NCAxMDU1LzIxOTUvMTA0NCAxMDE0LzM3NzIvMTA0NAorZiAxMDE1LzM3NzMvMTE4NCAxMDIwLzM3NjUvMTE4NCAxMDYxLzIxODYvMTE4NAorZiAxMDYxLzIxODYvMTE4NCAxMDU2LzIxOTYvMTE4NCAxMDE1LzM3NzMvMTE4NAorZiAxMDE5LzM3NjYvMTE4NCAxMDE2LzM3NzQvMTE4NCAxMDU3LzIxOTcvMTE4NAorZiAxMDU3LzIxOTcvMTE4NCAxMDYwLzIxODkvMTE4NCAxMDE5LzM3NjYvMTE4NAorZiAxMDEyLzM4MDkvNjk3IDI1MTUvMzgxMC82OTcgMjUxNi8zODExLzY5NworZiAyNTE3LzM4MTIvNjk3IDEwNTMvMjE5MS82OTcgMTAxMi8zNzY4LzY5NworZiAyNTE4LzM4MTMvNjk3IDEwMTEvMzc3MS82OTcgMTA1Mi8yMTkyLzY5NworZiAxMDUyLzM4MTQvNjk3IDI1MTkvMzgxNS82OTcgMjUyMC8zODE2LzY5NworZiAxMDIzLzM3ODMvMTA0MyAxMDY0LzM0MDUvMTA0MyAyNTIxLzM0MDUvMTA0MworZiAyNTIyLzM4MTcvMTA0MyAyNTIzLzM4MTgvMTA0MyAxMDIzLzM4MTkvMTA0MworZiAxMDY1LzM0MDYvMTA0MyAxMDI0LzM3OTAvMTA0MyAyNTI0LzM3OTAvMTA0MworZiAyNTI1LzM4MjAvMTA0MyAyNTI2LzM4MjEvMTA0MyAxMDY1LzM4MjIvMTA0MworZiAxMDI0LzM3OTAvMTA0MyAxMDY1LzM0MDYvMTA0MyAxMDU5LzM1NjMvMTA0MworZiAxMDU5LzM1NjMvMTA0MyAxMDE4LzM3OTEvMTA0MyAxMDI0LzM3OTAvMTA0MworZiAxMDY0LzM0MDUvMTA0MyAxMDIzLzM3ODMvMTA0MyAxMDE3LzM3OTIvMTA0MworZiAxMDE3LzM3OTIvMTA0MyAxMDU4LzM1NjIvMTA0MyAxMDY0LzM0MDUvMTA0MworZiAxMDI4LzIxNDEvMTA0NCAxMDM4LzM3MzgvMTA0NCAxMDY4LzM3MTkvMTA0NAorZiAxMDY4LzM3MTkvMTA0NCAxMDY3LzM3MTgvMTA0NCAxMDI4LzIxNDEvMTA0NAorZiAxMDM5LzM3NDAvMTA0NCAxMDI3LzM3OTcvMTA0NCAxMDY2LzM3MjEvMTA0NAorZiAxMDY2LzM3MjEvMTA0NCAxMDY5LzM3MjAvMTA0NCAxMDM5LzM3NDAvMTA0NAorZiA5OTkvMzc0Mi8xMDQ0IDEwMDEvMzc0MS8xMDQ0IDEwNDIvMzcyMy8xMDQ0CitmIDEwNDIvMzcyMy8xMDQ0IDEwNDAvMzcyMi8xMDQ0IDk5OS8zNzQyLzEwNDQKK2YgMTAwMi8zNzQzLzEwNDQgMTAwMC8zNzM5LzEwNDQgMTA0MS8zNzI1LzEwNDQKK2YgMTA0MS8zNzI1LzEwNDQgMTA0My8zNzI0LzEwNDQgMTAwMi8zNzQzLzEwNDQKK2YgMTAwMS8zNzQxLzEwNDQgMTAwMy8zNzQ0LzEwNDQgMTA0NC8zNzI2LzEwNDQKK2YgMTA0NC8zNzI2LzEwNDQgMTA0Mi8zNzIzLzEwNDQgMTAwMS8zNzQxLzEwNDQKK2YgMTAwNC8zNzQ1LzEwNDQgMTAwMi8zNzQzLzEwNDQgMTA0My8zNzI0LzEwNDQKK2YgMTA0My8zNzI0LzEwNDQgMTA0NS8zNzI3LzEwNDQgMTAwNC8zNzQ1LzEwNDQKK2YgMTAwNS8zODIzLzEyMzggMTA0Ni8zODI0LzEyMzggMjUyNy8zODI1LzEyMzgKK2YgMjUyOC8zODI2LzEyMzggMjUyOS8zODI3LzEyMzggMTAwNS8zODI4LzEyMzgKK2YgMTA0Ny8zODI5LzEyMzggMTAwNi8zODMwLzEyMzggMjUzMC8zODMxLzEyMzgKK2YgMjUzMS8zODMyLzEyMzggMjUzMi8zODMzLzEyMzggMTA0Ny8zODM0LzEyMzgKK2YgMTQ5NS8zNzU5LzY4NyAxNDk5LzM3MzUvNjg3IDEwNDYvMzczNC82ODcKK2YgMTA0Ni8zNzM0LzY4NyAxMDA1LzM3NjAvNjg3IDE0OTUvMzc1OS82ODcKK2YgMTAwOC8zNzYzLzY4NyAxNDk2LzM3NjIvNjg3IDE1MDAvMzczNi82ODcKK2YgMTUwMC8zNzM2LzY4NyAxMDQ5LzM4MzUvNjg3IDEwMDgvMzc2My82ODcKK2YgMTAxMy8yMTQyLzEwNDQgMTAyOC8yMTQxLzEwNDQgMTA2Ny8zNzE4LzEwNDQKK2YgMTA2Ny8zNzE4LzEwNDQgMTA1NC8yMTk0LzEwNDQgMTAxMy8yMTQyLzEwNDQKK2YgMTAyNy8zNzk3LzEwNDQgMTAxNC8zNzcyLzEwNDQgMTA1NS8yMTk1LzEwNDQKK2YgMTA1NS8yMTk1LzEwNDQgMTA2Ni8zNzIxLzEwNDQgMTAyNy8zNzk3LzEwNDQKK2YgMTAwMC8zNzM5LzEwNDQgMTAzOS8zNzQwLzEwNDQgMTA2OS8zNzIwLzEwNDQKK2YgMTA2OS8zNzIwLzEwNDQgMTA0MS8zNzI1LzEwNDQgMTAwMC8zNzM5LzEwNDQKK2YgMTAzOC8zNzM4LzEwNDQgOTk5LzM3NDIvMTA0NCAxMDQwLzM3MjIvMTA0NAorZiAxMDQwLzM3MjIvMTA0NCAxMDY4LzM3MTkvMTA0NCAxMDM4LzM3MzgvMTA0NAorZiAzMjcvMTk3MS8xMDQ0IDEwMzEvMzc5OC8xMDQ0IDEwNzAvMzc5NC8xMDQ0CitmIDEwNzAvMzc5NC8xMDQ0IDMyNi8xOTcyLzEwNDQgMzI3LzE5NzEvMTA0NAorZiAxMDMxLzM3OTgvMTA0NCA0ODMvMjU0My8xMDQ0IDMzMS8yNTk3LzEwNDQKK2YgMzMxLzI1OTcvMTA0NCAxMDcwLzM3OTQvMTA0NCAxMDMxLzM3OTgvMTA0NAorZiAzMDQvMjYwMi8xMDQ0IDEwNzIvMjYwNC8xMDQ0IDEwNzEvMjE3MS8xMDQ0CitmIDEwNzEvMjE3MS8xMDQ0IDEwMjYvMzc5My8xMDQ0IDMwNC8yNjAyLzEwNDQKK2YgMjUzMy8zODM2LzIxOSAxNTAxLzI0MDkvMjE5IDEwNzQvMjQxMi8yMTkKK2YgMTA3NC8zODM3LzIxOSAyNTM0LzM4MzgvMjE5IDI1MzUvMzgzOS8yMTkKK2YgMzA2LzE4NjcvMTUxNiAxMDcyLzI2MDQvMTUxNiAyNTM2LzI2MDMvMTUxNgorZiAyNTM3LzM4NDAvMTI5OCAyNTM4LzM4NDEvMTI5OCAzMDYvMzg0Mi8xMjk4CitmIDEwNzIvMjYwNC8xMDQ0IDMwNi8xODY3LzEwNDQgMzAwLzE4NzAvMTA0NAorZiAzMDAvMTg3MC8xMDQ0IDEwNzEvMjE3MS8xMDQ0IDEwNzIvMjYwNC8xMDQ0CitmIDYxLzE2NjkvMTA0NCAxOC8xNTQyLzEwNDQgMTA3NS8yMjI3LzEwNDQKK2YgMTA3NS8yMjI3LzEwNDQgMTA3Ny8yMjI2LzEwNDQgNjEvMTY2OS8xMDQ0CitmIDcxLzE2MDQvMTIwNSA4Ny8xNjk5LzEyMDUgMTA3OS8yMjI5LzEyMDUKK2YgMTA3OS8yMjI5LzEyMDQgMTA3OC8yMjI4LzEyMDQgNzEvMTYwNC8xMjA0CitmIDEwOC8zODQzLzY4NyAxMzg1LzE3NDcvNjg3IDE1MDIvMjIzMS82ODcKK2YgMTUwMi8yMjMxLzY4NyAxMDg2LzIyMzAvNjg3IDEwOC8zODQzLzY4NworZiAxMTYvMzg0NC8xMjM4IDI1MzkvMzg0NS8xMjM4IDEwODAvMjIzMy8xMjM4CitmIDEwODAvMjIzMy8xMjM4IDEwNzYvMjIzMi8xMjM4IDExNi8zODQ0LzEyMzgKK2YgMTQxLzE1MTQvMTA0NCAxOTMvMTg2MS8xMDQ0IDEwODMvMjIzNS8xMDQ0CitmIDEwODMvMjIzNS8xMDQ0IDEwODEvMjIzNC8xMDQ0IDE0MS8xNTE0LzEwNDQKK2YgMTU3LzE5MDUvMTA0NCAyMTEvMTkwNC8xMDQ0IDEwODQvMjIzNy8xMDQ0CitmIDEwODQvMjIzNy8xMDQ0IDEwODIvMjIzNi8xMDQ0IDE1Ny8xOTA1LzEwNDQKK2YgMTkzLzE4NjEvMTA0NCAxNTcvMTkwNS8xMDQ0IDEwODIvMjIzNi8xMDQ0CitmIDEwODIvMjIzNi8xMDQ0IDEwODMvMjIzNS8xMDQ0IDE5My8xODYxLzEwNDQKK2YgMjExLzE5MDQvMTA0NCA2MS8xNjY5LzEwNDQgMTA3Ny8yMjI2LzEwNDQKK2YgMTA3Ny8yMjI2LzEwNDQgMTA4NC8yMjM3LzEwNDQgMjExLzE5MDQvMTA0NAorZiA0LzE1MTUvMTA0NCAxNDEvMTUxNC8xMDQ0IDEwODEvMjIzNC8xMDQ0CitmIDEwODEvMjIzNC8xMDQ0IDI1NDAvMjIzOC8xMDQ0IDQvMTUxNS8xMDQ0CitmIDE4LzE1NDIvMTE4NCAyOC8xNTQ1LzExODQgMTA4NS8yMjQyLzExODQKK2YgMTA4NS8yMjQyLzExODQgMTA3NS8yMjI3LzExODQgMTgvMTU0Mi8xMTg0CitmIDI1NDEvMTYwNS82OTcgNzEvMTYwNC82OTcgMTA3OC8yMjI4LzY5NworZiAxMDc4LzM4NDYvNjk3IDI1NDIvMzg0Ny82OTcgMjU0My8zODQ4LzY5NworZiAyNTQ0LzMzNDQvMTA0MyA4NTIvMzM0NC8xMDQzIDEwODgvMzMzOS8xMDQzCitmIDEwODgvMzg0OS8xMDQzIDI1NDUvMzg1MC8xMDQzIDI1NDYvMzg1MS8xMDQzCitmIDgyMS8zNTY3LzEwNDMgODczLzMzNDAvMTA0MyAxMDg4LzMzMzkvMTA0MworZiAxMDg4LzMzMzkvMTA0MyAxMDg3LzM1MzQvMTA0MyA4MjEvMzU2Ny8xMDQzCitmIDE0MjkvMjQ1Mi8xMjQzIDE1MDMvMjQ2NS8xMjQzIDEwOTEvMjQ2NC8xMjQzCitmIDEwOTEvMjQ2NC8xMjQzIDQ2My8yNDUzLzEyNDMgMTQyOS8yNDUyLzEyNDMKK2YgMjg0LzI0NzYvMTUxNyAxMDg5LzI0OTUvMTUxNyAyNTQ3LzI0OTQvMTUxNworZiAyNTQ4LzM4NTIvMTUxOCAyNTQ5LzM4NTMvMTUxOCAyODQvMzg1NC8xNTE4CitmIDI4MS8yMTE5LzEwNDQgMjg5LzIxNDQvMTA0NCAxMDg5LzI0OTUvMTA0NAorZiAxMDg5LzI0OTUvMTA0NCAxMDkyLzM3OTUvMTA0NCAyODEvMjExOS8xMDQ0CitmIDM1NS8yMTIyLzEwNDQgMzU2LzIxMTcvMTA0NCAyODEvMjExOS8xMDQ0CitmIDI4MS8yMTE5LzEwNDQgMTA5Mi8zNzk1LzEwNDQgMzU1LzIxMjIvMTA0NAorZiAzNjUvMjE3MC8xMDQ0IDEwMjYvMzc5My8xMDQ0IDEwNzEvMjE3MS8xMDQ0CitmIDExMDYvMjk2Ny8yMjEgNjMxLzM4NTUvMjIxIDEwOTMvMjk2My8yMjEKK2YgMTA5My8yOTYzLzIyMSA2MjkvMjk2Mi8yMjEgMTEwNi8yOTY3LzIyMQorZiAxMDk4LzI5NzUvMjIwIDEwOTkvMzg1Ni8yMjAgMTA5NS8yOTEyLzIyMAorZiAxMDk1LzI5MTIvMjE5IDEwOTQvMjkxMS8yMTkgMTA5OC8yOTc1LzIxOQorZiA2NjMvMzg1Ny8xNTE5IDE0NTcvMjk5My8xNTE5IDE1MDQvMzg1OC8xNTE5CitmIDE1MDQvMzg1OC8xNTIwIDEwOTYvMzg1OS8xNTIwIDY2My8zODU3LzE1MjAKK2YgMjU1MC8zODYwLzE1MjEgMjU1MS8zODYxLzE1MjEgMjU1Mi8zODYyLzE1MjEKK2YgMjU1My8zODYzLzE1MjIgMTA5Ny8zODY0LzE1MjIgMjU1NC8zODY0LzE1MjIKK2YgMTA5OC8yOTc1LzIyMSA2MzEvMzg1NS8yMjEgNjQxLzMwMjUvMjIxCitmIDY0MS8zMDI1LzIyMSAxMDk5LzM4NTYvMjIxIDEwOTgvMjk3NS8yMjEKK2YgMjU1NS8zODY1LzE1MjMgMjU1Ni8zODY2LzE1MjMgMTUwNS8zODY3LzE1MjMKK2YgMTUwNS8yOTk1LzE1MjMgMTEwMC8zODY4LzE1MjMgMjU1Ny8zODY5LzE1MjMKK2YgMjU1OC8zODcwLzE1MjQgMjU1OS8zODcxLzE1MjQgMTA5OS8zODcyLzE1MjQKK2YgMTA5OS8zODU2LzE1MjUgNjQxLzMwMjUvMTUyNSAyNTYwLzMwMjUvMTUyNQorZiAxMDkzLzI5NjMvMjIxIDYzMS8zODU1LzIyMSAxMDk4LzI5NzUvMjIxCitmIDEwOTgvMjk3NS8yMjEgNjAyLzI5MjYvMjIxIDEwOTMvMjk2My8yMjEKK2YgMTEwNy8zMDI2LzIxOSAxMTA2LzI5NjcvMjE5IDExMDIvMjk2Ni8yMTkKK2YgMTEwMi8yOTY2LzIyMSAxMTAzLzI5NjkvMjIxIDExMDcvMzAyNi8yMjEKK2YgMTEwOC8zODczLzE1MjYgMTUwNy8zODc0LzE1MjYgMjU2MS8zODc1LzE1MjYKK2YgMjU2Mi8zODc2LzE1MjYgMTEwNC8zODc3LzE1MjYgMTEwOC8zODc4LzE1MjYKK2YgMjU2My8zODc5LzE1MjcgMjU2NC8zODgwLzE1MjcgMjU2NS8zODgxLzE1MjcKK2YgMjU2Ni8zODgyLzE1MjggMjU2Ny8zODgzLzE1MjggMjU2OC8zODg0LzE1MjgKK2YgNjMwLzI5NjUvMjIxIDYyOC8yNjc3LzIyMSA2MzIvMjY3Ni8yMjEKK2YgNjMyLzI2NzYvMjIxIDExMDIvMjk2Ni8yMjEgNjMwLzI5NjUvMjIxCitmIDY0MS8zMDI1LzIyMSA2MzEvMzg1NS8yMjEgMTEwNi8yOTY3LzIyMQorZiAxMTA2LzI5NjcvMjIxIDExMDcvMzAyNi8yMjEgNjQxLzMwMjUvMjIxCitmIDY2NC8zODg1LzE1MjkgMTQ1OC8yOTk0LzE1MjkgMjU2OS8zODg2LzE1MjkKK2YgMjU3MC8zODg3LzE1MjkgMjU3MS8zODg4LzE1MjkgNjY0LzM4ODkvMTUyOQorZiAyNTcyLzM4OTAvMTUzMCAyNTczLzM4OTEvMTUzMCAyNTc0LzM4OTIvMTUzMAorZiAyNTc1LzM4OTMvMTUzMSAyNTc2LzM4OTQvMTUzMSAyNTc3LzM4OTUvMTUzMQorZiAxMzQwLzM4OTYvNjg3IDE1MTAvMzg5Ny82ODcgMTUwOC8zMjY4LzY4NworZiAxNTA4LzMyNjgvNjg3IDExMTAvMzg5OC82ODcgMTM0MC8zODk2LzY4NworZiAxMzQxLzM4OTkvMTM5MCAxMzQyLzM5MDAvMTM5MCAxMTEyLzMyNzAvMTM5MAorZiAxMTEyLzMyNzAvMTM4MSAxMTExLzMyNjkvMTM4MSAxMzQxLzM4OTkvMTM4MQorZiAyNTc4LzM5MDEvMjIxIDEzNDMvMzkwMi8yMjEgMTExMy8zMjc0LzIyMQorZiAxMTEzLzM5MDMvMjIxIDI1NzkvMzkwNC8yMjEgMjU4MC8zOTA1LzIyMQorZiAxMzQzLzM5MDIvMjIxIDEzNDQvMzkwNi8yMjEgMTExNC8zMjc1LzIyMQorZiAxMTE0LzMyNzUvMjIxIDExMTMvMzI3NC8yMjEgMTM0My8zOTAyLzIyMQorZiAxMzQ1LzM5MDcvMjIxIDEzNDYvMzkwOC8yMjEgMTExNy8zMjc4LzIyMQorZiAxMTE3LzMyNzgvMjIxIDExMTYvMzI3Ny8yMjEgMTM0NS8zOTA3LzIyMQorZiAxMzQ2LzM5MDgvMjIxIDEzNDcvMzkwOS8yMjEgMTExOC8zMjc5LzIyMQorZiAxMTE4LzMyNzkvMjIxIDExMTcvMzI3OC8yMjEgMTM0Ni8zOTA4LzIyMQorZiAxMzQ3LzM5MDkvMTM0NCAxMzQ4LzM5MTAvMTM0NCAxMTE5LzMyODAvMTM0NAorZiAxMTE5LzMyODAvMTM0NCAxMTE4LzMyNzkvMTM0NCAxMzQ3LzM5MDkvMTM0NAorZiAyNTgxLzM5MTEvNjk3IDEzNDkvMzkxMi82OTcgMTEyMC8zMjg0LzY5NworZiAxMTIwLzM5MTMvNjk3IDI1ODIvMzkxNC82OTcgMjU4My8zOTE1LzY5NworZiAxMzQ5LzM5MTIvMTM2MiAxMzUwLzM5MTYvMTM2MiAxMTIxLzMyODYvMTM2MgorZiAxMTIxLzMyODYvMTM2MiAxMTIwLzMyODQvMTM2MiAxMzQ5LzM5MTIvMTM2MgorZiAxMzUyLzM5MTcvMTE3MiAxMTIzLzM1MTQvMTE3MiAyNTg0LzM1MTQvMTE3MgorZiAyNTg1LzM5MTgvMTE3MiAyNTg2LzM5MTkvMTE3MiAxMzUyLzM5MTkvMTE3MgorZiA4MzkvMzYwMi8xMTcyIDg5MS8zNTAzLzExNzIgMTEyMy8zNTE0LzExNzIKK2YgMTEyMy8zNTE0LzExNzIgMTEyMi8zOTIwLzExNzIgODM5LzM2MDIvMTE3MgorZiAxMzUxLzM5MjEvMTE3MiAxMzUyLzM5MTcvMTE3MiAxMTM2LzM2MDcvMTE3MgorZiAxMTM2LzM2MDcvMTE3MiAxMTM1LzM2MDYvMTE3MiAxMzUxLzM5MjEvMTE3MgorZiA2MjEvMzkyMi82ODcgMTQ1MS8yOTUzLzY4NyAxNTA5LzM5MjMvNjg3CitmIDE1MDkvMzkyMy82ODcgMTEzNy8zOTI0LzY4NyA2MjEvMzkyMi82ODcKK2YgNjIzLzI5NTYvMTM5MCAyNTg3LzM5MjUvMTM5MCAxMTI1LzM5MjYvMTM5MAorZiAxMTI1LzM5MjYvMTM5MCAxMTI0LzM5MjcvMTM5MCA2MjMvMjk1Ni8xMzkwCitmIDYyNy8yNjc0LzIyMSA2MjgvMjY3Ny8yMjEgMTEyNi8zOTI4LzIyMQorZiAxMTI2LzM5MjgvMjIxIDI1ODgvMzkyOS8yMjEgNjI3LzI2NzQvMjIxCitmIDYyOC8yNjc3LzIyMSA2MzAvMjk2NS8yMjEgMTEyNy8zOTMwLzIyMQorZiAxMTI3LzM5MzAvMjIxIDExMjYvMzkyOC8yMjEgNjI4LzI2NzcvMjIxCitmIDYzMC8yOTY1LzIyMSA2MjkvMjk2Mi8yMjEgMTEyOC8zOTMxLzIyMQorZiAxMTI4LzM5MzEvMjIxIDExMjcvMzkzMC8yMjEgNjMwLzI5NjUvMjIxCitmIDYyOS8yOTYyLzIyMSA2NjAvMjk2MS8yMjEgMTEyOS8zOTMyLzIyMQorZiAxMTI5LzM5MzIvMjIxIDExMjgvMzkzMS8yMjEgNjI5LzI5NjIvMjIxCitmIDY2MC8yOTYxLzIyMSA2MjQvMjk1MS8yMjEgMTEzMC8zOTMzLzIyMQorZiAxMTMwLzM5MzMvMjIxIDExMjkvMzkzMi8yMjEgNjYwLzI5NjEvMjIxCitmIDYyNC8yOTUxLzIyMSA2MjIvMjY5OC8yMjEgMTEzMS8zOTM0LzIyMQorZiAxMTMxLzM5MzQvMjIxIDExMzAvMzkzMy8yMjEgNjI0LzI5NTEvMjIxCitmIDYyMi8yNjk4LzEzNDQgNjIwLzI2OTkvMTM0NCAxMTMyLzM5MzUvMTM0NAorZiAxMTMyLzM5MzUvMTM0NCAxMTMxLzM5MzQvMTM0NCA2MjIvMjY5OC8xMzQ0CitmIDI1ODkvMjc0OC82OTcgNjI1LzI3NDcvNjk3IDExMzMvMzkzNi82OTcKK2YgMTEzMy8zOTM3LzY5NyAyNTkwLzM5MzgvNjk3IDI1OTEvMzkzOS82OTcKK2YgNjI1LzI3NDcvMTM2MiA2MjYvMjk1Mi8xMzYyIDExMzQvMzk0MC8xMzYyCitmIDExMzQvMzk0MC8xMzYyIDExMzMvMzkzNi8xMzYyIDYyNS8yNzQ3LzEzNjIKK2YgODkwLzM0ODkvMTE3MiAxMTM2LzM2MDcvMTE3MiAyNTkyLzM2MDcvMTE3MgorZiAyNTkzLzM5NDEvMTE3MiAyNTk0LzM5NDIvMTE3MiA4OTAvMzk0My8xMTcyCitmIDExMzgvMzk0NC8yMjEgMTExNi8zMjc3LzIyMSAxMTE1LzMyNzYvMjIxCitmIDExMTUvMzI3Ni8yMjEgMTE0My8zOTQ1LzIyMSAxMTM4LzM5NDQvMjIxCitmIDExMTUvMzI3Ni8yMjEgMTExNC8zMjc1LzIyMSAxMTQyLzM5NDYvMjIxCitmIDExNDIvMzk0Ni8yMjEgMTE0My8zOTQ1LzIyMSAxMTE1LzMyNzYvMjIxCitmIDExMzkvMzk0Ny8yMjEgMTE0MC8zOTQ4LzIyMSAxMTI4LzM5MzEvMjIxCitmIDExMjgvMzkzMS8yMjEgMTEyOS8zOTMyLzIyMSAxMTM5LzM5NDcvMjIxCitmIDExMzgvMzk0NC8yMjEgMTM1My8zOTQ5LzIyMSAxMzQ1LzM5MDcvMjIxCitmIDEzNDUvMzkwNy8yMjEgMTExNi8zMjc3LzIyMSAxMTM4LzM5NDQvMjIxCitmIDEzNDQvMzkwNi8yMjEgMTM1NC8zOTUwLzIyMSAxMTQyLzM5NDYvMjIxCitmIDExNDIvMzk0Ni8yMjEgMTExNC8zMjc1LzIyMSAxMzQ0LzM5MDYvMjIxCitmIDExMjgvMzkzMS8yMjEgMTE0MC8zOTQ4LzIyMSAxMTQxLzM5NTEvMjIxCitmIDExNDEvMzk1MS8yMjEgMTEyNy8zOTMwLzIyMSAxMTI4LzM5MzEvMjIxCitmIDEzNTUvMzk1Mi8xNDkyIDExNDQvMzk1My8xNDkyIDExMzkvMzk0Ny8xNDkyCitmIDExMzkvMzk0Ny8yMjEgMTM1My8zOTQ5LzIyMSAxMzU1LzM5NTIvMjIxCitmIDExMzgvMzk0NC8yMTkgMTE0My8zOTQ1LzIxOSAxMTQ2LzM5NTQvMjE5CitmIDExNDYvMzk1NC8yMjEgMTE0NS8zOTU1LzIyMSAxMTM4LzM5NDQvMjIxCitmIDExNDMvMzk0NS8yMjAgMTE0Mi8zOTQ2LzIyMCAxMTQ3LzM5NTYvMjIwCitmIDExNDcvMzk1Ni8yMjEgMTE0Ni8zOTU0LzIyMSAxMTQzLzM5NDUvMjIxCitmIDEzNTYvMzk1Ny8yMTkgMTE0Ny8zOTU2LzIxOSAxMTQyLzM5NDYvMjE5CitmIDExNDIvMzk0Ni8yMjEgMTM1NC8zOTUwLzIyMSAxMzU2LzM5NTcvMjIxCitmIDExNDEvMzk1MS8yMjAgMTE0MC8zOTQ4LzIyMCAxMTQ5LzM5NTgvMjIwCitmIDExNDkvMzk1OC8yMjEgMTE0OC8zOTU5LzIyMSAxMTQxLzM5NTEvMjIxCitmIDExNDAvMzk0OC8yMjAgMTEzOS8zOTQ3LzIyMCAxMTQ0LzM5NTMvMjIwCitmIDExNDQvMzk1My8yMTkgMTE0OS8zOTU4LzIxOSAxMTQwLzM5NDgvMjE5CitmIDEzNjEvMzk2MC8xNTMyIDExNjIvMzk2MS8xNTMyIDExNTYvMzk2MS8xNTMyCitmIDExNTYvMzk2MS8xNTMzIDEzNTkvMzk2MC8xNTMzIDEzNjEvMzk2MC8xNTMzCitmIDExNjQvMzk2Mi8xNTM0IDExNjMvMzk2My8xNTM0IDExNTcvMzk2My8xNTM0CitmIDExNTcvMzk2My8xNTM1IDExNTgvMzk2NC8xNTM1IDExNjQvMzk2Mi8xNTM1CitmIDExNjUvMzk2NS8xNTM2IDExNjQvMzk2Mi8xNTM2IDExNTgvMzk2NC8xNTM2CitmIDExNTgvMzk2NC8xNTM3IDExNTkvMzk2NS8xNTM3IDExNjUvMzk2NS8xNTM3CitmIDEzNjIvMzk2Ni8xNTM4IDI1OTUvMzk2Ny8xNTM4IDI1OTYvMzk2OC8xNTM4CitmIDI1OTcvMzk2OS8xNTM5IDEzNjAvMzk3MC8xNTM5IDEzNjIvMzk3MS8xNTM5CitmIDExNjcvMzk3Mi8xNTQwIDExNjYvMzk3My8xNTQwIDExNjAvMzk3My8xNTQwCitmIDExNjAvMzk3My8xNTQxIDExNjEvMzk3Mi8xNTQxIDExNjcvMzk3Mi8xNTQxCitmIDI1OTgvMzk3NC8xNTQyIDExNjcvMzk3Mi8xNTQyIDExNjEvMzk3Mi8xNTQyCitmIDExNjEvMzk3NS8xNTQzIDI1OTkvMzk3Ni8xNTQzIDI2MDAvMzk3Ni8xNTQzCitmIDI2MDEvMzk3Ny8xNTQ0IDEzNTUvMzk1Mi8xNTQ0IDExNDUvMzk1NS8xNTQ0CitmIDExNDUvMzk3OC8xNTQ1IDI2MDIvMzk3OS8xNTQ1IDI2MDMvMzk4MC8xNTQ1CitmIDExNDYvMzk4MS8xNTQ2IDI2MDQvMzk4Mi8xNTQ2IDI2MDUvMzk4My8xNTQ2CitmIDI2MDYvMzk4NC8xNTQ3IDExNDUvMzk1NS8xNTQ3IDExNDYvMzk1NC8xNTQ3CitmIDExNDcvMzk4NS8xNTQ4IDI2MDcvMzk4Ni8xNTQ4IDI2MDgvMzk4Ny8xNTQ4CitmIDI2MDkvMzk4OC8xNTQ5IDExNDYvMzk1NC8xNTQ5IDExNDcvMzk1Ni8xNTQ5CitmIDI2MTAvMzk4OS8xNTUwIDEzNTYvMzk1Ny8xNTUwIDExNDgvMzk1OS8xNTUwCitmIDExNDgvMzk5MC8xNTUxIDI2MTEvMzk5MS8xNTUxIDI2MTIvMzk5Mi8xNTUxCitmIDExNDkvMzk5My8xNTUyIDI2MTMvMzk5NC8xNTUyIDI2MTQvMzk5NS8xNTUyCitmIDI2MTUvMzk5Ni8xNTUzIDExNDgvMzk1OS8xNTUzIDExNDkvMzk1OC8xNTUzCitmIDExNDQvMzk5Ny8xNTU0IDI2MTYvMzk5OC8xNTU0IDI2MTcvMzk5OS8xNTU0CitmIDI2MTgvNDAwMC8xNTU1IDExNDkvMzk1OC8xNTU1IDExNDQvMzk1My8xNTU1CitmIDEzNTcvNDAwMS8xNTU2IDEzNjEvMzk2MC8xNTU2IDI2MTkvNDAwMi8xNTU2CitmIDI2MjAvNDAwMy8xNTU3IDExNTEvNDAwNC8xNTU3IDEzNTcvNDAwNS8xNTU3CitmIDI2MjEvNDAwNi8xNTU4IDExNjMvMzk2My8xNTU4IDExNjQvMzk2Mi8xNTU4CitmIDExNjQvMzk2Mi8xNTU5IDExNTIvNDAwNy8xNTU5IDI2MjIvNDAwNi8xNTU5CitmIDExNTIvNDAwNy8xNTYwIDExNjQvMzk2Mi8xNTYwIDExNjUvMzk2NS8xNTYwCitmIDExNjUvMzk2NS8xNTYxIDExNTMvNDAwOC8xNTYxIDExNTIvNDAwNy8xNTYxCitmIDEzNTgvNDAwOS8xNTYyIDEzNjIvNDAxMC8xNTYyIDI2MjMvNDAxMS8xNTYyCitmIDI2MjQvNDAxMi8xNTYzIDExNTQvNDAxMy8xNTYzIDEzNTgvNDAxNC8xNTYzCitmIDI2MjUvNDAxNS8xNTY0IDExNjYvMzk3My8xNTY0IDExNjcvMzk3Mi8xNTY0CitmIDExNjcvNDAxNi8xNTY1IDExNTUvNDAxNy8xNTY1IDI2MjYvNDAxOC8xNTY1CitmIDExNTUvNDAxNy8xNTY2IDExNjcvNDAxNi8xNTY2IDI2MjcvNDAxOS8xNTY2CitmIDI2MjgvNDAyMC8xNTY3IDExNTAvNDAyMS8xNTY3IDExNTUvNDAyMi8xNTY3CitmIDExOTMvNDAyMy8xNTY4IDEyMTEvNDAyNC8xNTY4IDEyMTAvNDAyNS8xNTY4CitmIDEyMTAvNDAyNS8xNTY5IDExOTIvNDAyNi8xNTY5IDExOTMvNDAyMy8xNTY5CitmIDExNzAvNDAyNy8xNTcwIDExNzEvNDAyOC8xNTcwIDExNjkvNDAyOS8xNTcwCitmIDExNjkvNDAyOS8xNTcxIDExNjgvNDAzMC8xNTcxIDExNzAvNDAyNy8xNTcxCitmIDExOTYvNDAzMS8xNTcyIDEyMjQvNDAzMi8xNTcyIDEyMjEvNDAzMy8xNTcyCitmIDEyMjEvNDAzMy8xNTczIDExOTUvNDAzNC8xNTczIDExOTYvNDAzMS8xNTczCitmIDExODgvNDAzNS8xNTc0IDExNjkvNDAyOS8xNTc0IDExNzEvNDAyOC8xNTc0CitmIDExNzEvNDAyOC8xNTc0IDExODcvNDAzNi8xNTc0IDExODgvNDAzNS8xNTc0CitmIDExOTcvNDAzNy8xNTc1IDI2MjkvNDAzOC8xNTc1IDI2MzAvNDAzOS8xNTc1CitmIDI2MzEvNDA0MC8xNTc2IDEyMjcvNDA0MS8xNTc2IDExOTcvNDA0Mi8xNTc2CitmIDExOTQvNDA0My8xNTc3IDExOTIvNDAyNi8xNTc3IDEyMTAvNDAyNS8xNTc3CitmIDEyMTAvNDAyNS8xNTc3IDExNzIvNDA0NC8xNTc3IDExOTQvNDA0My8xNTc3CitmIDExNzAvNDAyNy8xNTc4IDExNzMvNDA0NS8xNTc4IDExNzQvNDA0Ni8xNTc4CitmIDExNzQvNDA0Ni8xNTc5IDExNzEvNDAyOC8xNTc5IDExNzAvNDAyNy8xNTc5CitmIDExNzQvNDA0Ni8xNTgwIDExODkvNDA0Ny8xNTgwIDExODcvNDAzNi8xNTgwCitmIDExODcvNDAzNi8xNTc5IDExNzEvNDAyOC8xNTc5IDExNzQvNDA0Ni8xNTc5CitmIDExNzYvNDA0OC8xNTgxIDExNzUvNDA0OS8xNTgxIDExNzgvNDA1MC8xNTgxCitmIDExNzgvNDA1MC8xNTgyIDExODAvNDA1MS8xNTgyIDExNzYvNDA0OC8xNTgyCitmIDExNzUvNDA0OS8xMDg5IDExNzcvNDA1Mi8xMDg5IDExNzkvNDA1My8xMDg5CitmIDExNzkvNDA1My8xNTgzIDExNzgvNDA1MC8xNTgzIDExNzUvNDA0OS8xNTgzCitmIDEyNDEvNDA1NC8xNTg0IDExNzYvNDA0OC8xNTg0IDExODAvNDA1MS8xNTg0CitmIDExODAvNDA1MS8xMTAyIDEyNDAvNDA1NS8xMTAyIDEyNDEvNDA1NC8xMTAyCitmIDEyNDIvNDA1Ni8xMDgxIDExNzkvNDA1My8xMDgxIDExNzcvNDA1Mi8xMDgxCitmIDExNzcvNDA1Mi8xMDY1IDEyNDMvNDA1Ny8xMDY1IDEyNDIvNDA1Ni8xMDY1CitmIDEyNDQvNDA1OC8xNTg1IDEyNDUvNDA1OS8xNTg1IDExODIvNDA2MC8xNTg1CitmIDExODIvNDA2MC8xNTg2IDExODUvNDA2MS8xNTg2IDEyNDQvNDA1OC8xNTg2CitmIDExODQvNDA2Mi8xNTg3IDExODEvNDA2My8xNTg3IDExODMvNDA2NC8xNTg3CitmIDExODMvNDA2NC8xNTg4IDExODYvNDA2NS8xNTg4IDExODQvNDA2Mi8xNTg4CitmIDI2MzIvNDA2Ni8xNTg5IDI2MzMvNDA2Ny8xNTg5IDExODEvNDA2OC8xNTg5CitmIDExODEvNDA2My8xNTkwIDExODQvNDA2Mi8xNTkwIDI2MzQvNDA2OS8xNTkwCitmIDI2MzUvNDA3MC8xNTkxIDI2MzYvNDA3MS8xNTkxIDEyNTIvNDA3Mi8xNTkxCitmIDEyNTIvNDA3My8xNTkyIDEyNTMvNDA3NC8xNTkyIDI2MzcvNDA3NS8xNTkyCitmIDI2MzgvNDA3Ni8xNTkzIDI2MzkvNDA3Ny8xNTkzIDI2NDAvNDA3Ny8xNTkzCitmIDI2NDEvNDA3OC8xNTk0IDI2NDIvNDA3OS8xNTk0IDI2NDMvNDA4MC8xNTk0CitmIDI2NDQvNDA4MS8xNTk1IDI2NDUvNDA4Mi8xNTk1IDExODQvNDA4My8xNTk1CitmIDExODQvNDA2Mi8xNTk2IDExODYvNDA2NS8xNTk2IDI2NDYvNDA2NS8xNTk2CitmIDI2NDcvNDA4NC8xNTk3IDI2NDgvNDA4NS8xNTk3IDI2NDkvNDA4Ni8xNTk3CitmIDI2NTAvNDA4Ny8xNTk4IDI2NTEvNDA4OC8xNTk4IDI2NTIvNDA4OC8xNTk4CitmIDI2NTMvNDA4OS8xNTk5IDI2NTQvNDA5MC8xNTk5IDI2NTUvNDA5MS8xNTk5CitmIDI2NTYvNDA5Mi8xNjAwIDEyNTMvNDA5My8xNjAwIDI2NTcvNDA5NC8xNjAwCitmIDExOTAvNDA5NS8xMDQzIDExOTEvNDA5Ni8xMDQzIDExODkvNDA0Ny8xMDQzCitmIDExODkvNDA0Ny8xMDQzIDExNzQvNDA0Ni8xMDQzIDExOTAvNDA5NS8xMDQzCitmIDExOTgvNDA5Ny8xMDQzIDExOTkvNDA5OC8xMDQzIDExODAvNDA1MS8xMDQzCitmIDExODAvNDA1MS8xMDY1IDExNzgvNDA1MC8xMDY1IDExOTgvNDA5Ny8xMDY1CitmIDEyNTgvNDA5OS8xMDY1IDExOTAvNDA5NS8xMDY1IDExNzkvNDA1My8xMDY1CitmIDExNzkvNDA1My8xMDY1IDEyNDIvNDA1Ni8xMDY1IDEyNTgvNDA5OS8xMDY1CitmIDEyNTgvNDA5OS8xMDQzIDEyNTkvNDEwMC8xMDQzIDExOTEvNDA5Ni8xMDQzCitmIDExOTEvNDA5Ni8xMDQzIDExOTAvNDA5NS8xMDQzIDEyNTgvNDA5OS8xMDQzCitmIDExNjgvNDAzMC8xNjAxIDExOTMvNDAyMy8xNjAxIDExOTIvNDAyNi8xNjAxCitmIDExOTIvNDAyNi8xNjAyIDExNzAvNDAyNy8xNjAyIDExNjgvNDAzMC8xNjAyCitmIDExNzAvNDAyNy8xNjAzIDExOTIvNDAyNi8xNjAzIDExOTQvNDA0My8xNjAzCitmIDExOTQvNDA0My8xNTc4IDExNzMvNDA0NS8xNTc4IDExNzAvNDAyNy8xNTc4CitmIDExNzIvNDA0NC8xNjA0IDExOTcvNDA0Mi8xNjA0IDExOTkvNDA5OC8xNjA0CitmIDExOTkvNDA5OC8xNjA1IDExOTQvNDA0My8xNjA1IDExNzIvNDA0NC8xNjA1CitmIDI2NTgvNDEwMS8xNjA2IDExOTYvNDAzMS8xNjA2IDExOTUvNDAzNC8xNjA2CitmIDExOTUvNDEwMi8xNjA3IDI2NTkvNDEwMy8xNjA3IDI2NjAvNDEwNC8xNjA3CitmIDEyMTAvNDAyNS8xNjA4IDI2NjEvNDEwNS8xNjA4IDExOTcvNDA0Mi8xNjA4CitmIDExOTcvNDA0Mi8xNjA5IDExNzIvNDA0NC8xNjA5IDEyMTAvNDAyNS8xNjA5CitmIDExOTgvNDA5Ny8xNjEwIDExNzMvNDA0NS8xNjEwIDExOTQvNDA0My8xNjEwCitmIDExOTQvNDA0My8xNjExIDExOTkvNDA5OC8xNjExIDExOTgvNDA5Ny8xNjExCitmIDEyMjcvNDA0MS8xNjEyIDEyNjEvNDEwNi8xNjEyIDExOTkvNDA5OC8xNjEyCitmIDExOTkvNDA5OC8xMDY1IDExOTcvNDA0Mi8xMDY1IDEyMjcvNDA0MS8xMDY1CitmIDExNzQvNDA0Ni8xNjEwIDExNzMvNDA0NS8xNjEwIDExOTgvNDA5Ny8xNjEwCitmIDExOTgvNDA5Ny8xMDQzIDExOTAvNDA5NS8xMDQzIDExNzQvNDA0Ni8xMDQzCitmIDEyNjEvNDEwNi8xMTAyIDEyNDAvNDA1NS8xMTAyIDExODAvNDA1MS8xMTAyCitmIDExODAvNDA1MS8xMDQzIDExOTkvNDA5OC8xMDQzIDEyNjEvNDEwNi8xMDQzCitmIDExOTgvNDA5Ny8xMDgxIDExNzgvNDA1MC8xMDgxIDExNzkvNDA1My8xMDgxCitmIDExNzkvNDA1My8xMDg5IDExOTAvNDA5NS8xMDg5IDExOTgvNDA5Ny8xMDg5CitmIDI2NjIvNDEwNy82OTcgMjY2My80MTA4LzY5NyAxMjA1LzQxMDkvNjk3CitmIDEyMDUvNDExMC82OTcgMTIwOC80MTExLzY5NyAyNjY0LzQxMTIvNjk3CitmIDI2NjUvNDExMy82OTcgMjY2Ni80MTE0LzY5NyAxMjA2LzQxMTUvNjk3CitmIDEyMDYvNDExNi82OTcgMTIwNS80MTEwLzY5NyAyNjY3LzQxMTcvNjk3CitmIDExOTYvNDAzMS8xNjEzIDI2NjgvNDEwMS8xNjEzIDEyMTMvNDExOC8xNjEzCitmIDEyMTMvNDExOC8xNjEzIDEyMDkvNDExOS8xNjEzIDExOTYvNDAzMS8xNjEzCitmIDI2NjkvNDEyMC82OTcgMjY3MC80MTIxLzY5NyAxMjA3LzQxMjIvNjk3CitmIDEyMDcvNDEyMy82OTcgMTIwNi80MTE2LzY5NyAyNjcxLzQxMjQvNjk3CitmIDI2NzIvNDEyNS8xNjE0IDI2NzMvNDEyNi8xNjE0IDEyMDgvNDEyNy8xNjE0CitmIDEyMDgvNDEyOC8xNjE1IDI2NzQvNDEyOS8xNjE1IDI2NzUvNDEzMC8xNjE1CitmIDEyMjQvNDAzMi8xMjQzIDExOTYvNDAzMS8xMjQzIDEyMDkvNDExOS8xMjQzCitmIDEyMDkvNDExOS8xMjQzIDEyNjgvNDEzMS8xMjQzIDEyMjQvNDAzMi8xMjQzCitmIDEyMDAvNDEzMi82OTcgMTIwMy80MTMzLzY5NyAxMjA4LzQxMTEvNjk3CitmIDEyMDgvNDExMS82OTcgMTIwNS80MTEwLzY5NyAxMjAwLzQxMzIvNjk3CitmIDEyMDEvNDEzNC82OTcgMTIwMC80MTMyLzY5NyAxMjA1LzQxMTAvNjk3CitmIDEyMDUvNDExMC82OTcgMTIwNi80MTE2LzY5NyAxMjAxLzQxMzQvNjk3CitmIDEyMTIvNDEzNS8xNjEzIDEyMDQvNDEzNi8xNjEzIDEyMDkvNDExOS8xNjEzCitmIDEyMDkvNDExOS8xNjEzIDEyMTMvNDExOC8xNjEzIDEyMTIvNDEzNS8xNjEzCitmIDEyMDIvNDEzNy82OTcgMTIwMS80MTM0LzY5NyAxMjA2LzQxMTYvNjk3CitmIDEyMDYvNDExNi82OTcgMTIwNy80MTIzLzY5NyAxMjAyLzQxMzcvNjk3CitmIDI2NzYvNDEzOC82OTcgMjY3Ny80MTM5LzY5NyAxMjA4LzQxNDAvNjk3CitmIDEyMDgvNDExMS82OTcgMTIwMy80MTMzLzY5NyAyNjc4LzQxNDEvNjk3CitmIDEyMDQvNDEzNi8xMjQzIDEyNzUvNDE0Mi8xMjQzIDEyNjgvNDEzMS8xMjQzCitmIDEyNjgvNDEzMS8xMjQzIDEyMDkvNDExOS8xMjQzIDEyMDQvNDEzNi8xMjQzCitmIDEyMTUvNDE0My8xNjE2IDEyMTQvNDE0NC8xNjE2IDEyNjAvNDE0NS8xNjE2CitmIDEyNjAvNDE0NS8xNjE3IDEyMTYvNDE0Ni8xNjE3IDEyMTUvNDE0My8xNjE3CitmIDEyMTcvNDE0Ny8xNjE4IDEyMjAvNDE0OC8xNjE4IDEyMTkvNDE0OS8xNjE4CitmIDEyMTkvNDE0OS8xNjE5IDEyMTgvNDE1MC8xNjE5IDEyMTcvNDE0Ny8xNjE5CitmIDEyMjMvNDE1MS8xNjIwIDEyMjIvNDE1Mi8xNjIwIDEyMjEvNDAzMy8xNjIwCitmIDEyMjEvNDAzMy8xNjIxIDEyMjQvNDAzMi8xNjIxIDEyMjMvNDE1MS8xNjIxCitmIDEyMjYvNDE1My8xNjIyIDEyMjUvNDE1NC8xNjIyIDEyMTgvNDE1MC8xNjIyCitmIDEyMTgvNDE1MC8xNjIyIDEyMTkvNDE0OS8xNjIyIDEyMjYvNDE1My8xNjIyCitmIDEyMjgvNDE1NS8xNjIzIDEyMjcvNDA0MS8xNjIzIDI2NzkvNDA0MC8xNjIzCitmIDI2ODAvNDE1Ni8xNjI0IDI2ODEvNDE1Ny8xNjI0IDEyMjgvNDE1OC8xNjI0CitmIDEyMzAvNDE1OS8xNjI1IDEyMjkvNDE2MC8xNjI1IDEyNjAvNDE0NS8xNjI1CitmIDEyNjAvNDE0NS8xNjI2IDEyMTQvNDE0NC8xNjI2IDEyMzAvNDE1OS8xNjI2CitmIDEyMTcvNDE0Ny8xNjI3IDEyMTgvNDE1MC8xNjI3IDEyMzIvNDE2MS8xNjI3CitmIDEyMzIvNDE2MS8xNjI4IDEyMzEvNDE2Mi8xNjI4IDEyMTcvNDE0Ny8xNjI4CitmIDEyMzIvNDE2MS8xNjI3IDEyMTgvNDE1MC8xNjI3IDEyMjUvNDE1NC8xNjI3CitmIDEyMjUvNDE1NC8xNjI5IDEyMzMvNDE2My8xNjI5IDEyMzIvNDE2MS8xNjI5CitmIDEyMzcvNDE2NC8xNjMwIDEyMzYvNDE2NS8xNjMwIDEyMzUvNDE2Ni8xNjMwCitmIDEyMzUvNDE2Ni8xNjA0IDEyMzQvNDE2Ny8xNjA0IDEyMzcvNDE2NC8xNjA0CitmIDEyMzQvNDE2Ny8xNjMxIDEyMzUvNDE2Ni8xNjMxIDEyMzkvNDE2OC8xNjMxCitmIDEyMzkvNDE2OC8xNjMxIDEyMzgvNDE2OS8xNjMxIDEyMzQvNDE2Ny8xNjMxCitmIDEyNDEvNDA1NC8xMDg5IDEyNDAvNDA1NS8xMDg5IDEyMzYvNDE2NS8xMDg5CitmIDEyMzYvNDE2NS8xNTg0IDEyMzcvNDE2NC8xNTg0IDEyNDEvNDA1NC8xNTg0CitmIDEyNDIvNDA1Ni8xMDY1IDEyNDMvNDA1Ny8xMDY1IDEyMzgvNDE2OS8xMDY1CitmIDEyMzgvNDE2OS8xNjMyIDEyMzkvNDE2OC8xNjMyIDEyNDIvNDA1Ni8xNjMyCitmIDEyNDQvNDA1OC8xNjMzIDEyNDcvNDE3MC8xNjMzIDEyNDYvNDE3MS8xNjMzCitmIDEyNDYvNDE3MS8xNjM0IDEyNDUvNDA1OS8xNjM0IDEyNDQvNDA1OC8xNjM0CitmIDEyNDgvNDE3Mi8xNjM1IDEyNTEvNDE3My8xNjM1IDEyNTAvNDE3NC8xNjM1CitmIDEyNTAvNDE3NC8xNjM2IDEyNDkvNDE3NS8xNjM2IDEyNDgvNDE3Mi8xNjM2CitmIDI2ODIvNDE3Ni8xNjM3IDEyNDgvNDE3Mi8xNjM3IDEyNDkvNDE3NS8xNjM3CitmIDEyNDkvNDE3Ny8xNjM4IDI2ODMvNDE3OC8xNjM4IDI2ODQvNDE3OS8xNjM4CitmIDI2ODUvNDE4MC8xNjM5IDEyNTMvNDA3NC8xNjM5IDEyNTIvNDA3My8xNjM5CitmIDEyNTIvNDE4MS8xNjQwIDI2ODYvNDE4Mi8xNjQwIDI2ODcvNDE4My8xNjQwCitmIDI2ODgvNDE4NC8xNjQxIDI2ODkvNDE4NS8xNjQxIDI2OTAvNDE4Ni8xNjQxCitmIDI2OTEvNDE4Ny8xNjQyIDI2OTIvNDE4Ny8xNjQyIDI2OTMvNDE4OC8xNjQyCitmIDI2OTQvNDE4OS8xNjQzIDEyNTEvNDE3My8xNjQzIDEyNDgvNDE3Mi8xNjQzCitmIDEyNDgvNDE5MC8xNjQ0IDI2OTUvNDE5MS8xNjQ0IDI2OTYvNDE5Mi8xNjQ0CitmIDI2OTcvNDE5My8xNjQ1IDI2OTgvNDE5NC8xNjQ1IDI2OTkvNDE5NS8xNjQ1CitmIDI3MDAvNDE5Ni8xNjQ2IDI3MDEvNDE5Ny8xNjQ2IDI3MDIvNDE5OC8xNjQ2CitmIDI3MDMvNDE5OS8xNjQ3IDEyNTMvNDIwMC8xNjQ3IDI3MDQvNDIwMS8xNjQ3CitmIDI3MDUvNDIwMi8xNjQ4IDI3MDYvNDIwMi8xNjQ4IDI3MDcvNDIwMy8xNjQ4CitmIDEyNTQvNDIwNC8xMDQzIDEyMzIvNDE2MS8xMDQzIDEyMzMvNDE2My8xMDQzCitmIDEyMzMvNDE2My8xMDQzIDEyNTUvNDIwNS8xMDQzIDEyNTQvNDIwNC8xMDQzCitmIDEyNTYvNDIwNi8xMDY1IDEyMzUvNDE2Ni8xMDY1IDEyMzYvNDE2NS8xMDY1CitmIDEyMzYvNDE2NS8xMDQzIDEyNTcvNDIwNy8xMDQzIDEyNTYvNDIwNi8xMDQzCitmIDEyNTgvNDA5OS8xMDY1IDEyNDIvNDA1Ni8xMDY1IDEyMzkvNDE2OC8xMDY1CitmIDEyMzkvNDE2OC8xMDY1IDEyNTQvNDIwNC8xMDY1IDEyNTgvNDA5OS8xMDY1CitmIDEyNTgvNDA5OS8xMDQzIDEyNTQvNDIwNC8xMDQzIDEyNTUvNDIwNS8xMDQzCitmIDEyNTUvNDIwNS8xMDQzIDEyNTkvNDEwMC8xMDQzIDEyNTgvNDA5OS8xMDQzCitmIDEyMjAvNDE0OC8xNjQ5IDEyMTcvNDE0Ny8xNjQ5IDEyMTQvNDE0NC8xNjQ5CitmIDEyMTQvNDE0NC8xNjUwIDEyMTUvNDE0My8xNjUwIDEyMjAvNDE0OC8xNjUwCitmIDEyMTcvNDE0Ny8xNjI4IDEyMzEvNDE2Mi8xNjI4IDEyMzAvNDE1OS8xNjI4CitmIDEyMzAvNDE1OS8xNjUxIDEyMTQvNDE0NC8xNjUxIDEyMTcvNDE0Ny8xNjUxCitmIDEyMjkvNDE2MC8xNjUyIDEyMzAvNDE1OS8xNjUyIDEyNTcvNDIwNy8xNjUyCitmIDEyNTcvNDIwNy8xNTgxIDEyMjgvNDE1NS8xNTgxIDEyMjkvNDE2MC8xNTgxCitmIDI3MDgvNDIwOC8xNjUzIDI3MDkvNDIwOS8xNjUzIDEyMjIvNDIxMC8xNjUzCitmIDEyMjIvNDE1Mi8xNjU0IDEyMjMvNDE1MS8xNjU0IDI3MTAvNDIxMS8xNjU0CitmIDEyNjAvNDE0NS8xNjU1IDEyMjkvNDE2MC8xNjU1IDEyMjgvNDE1NS8xNjU1CitmIDEyMjgvNDE1NS8xNjU2IDI3MTEvNDIxMi8xNjU2IDEyNjAvNDE0NS8xNjU2CitmIDEyNTYvNDIwNi8xNjU3IDEyNTcvNDIwNy8xNjU3IDEyMzAvNDE1OS8xNjU3CitmIDEyMzAvNDE1OS8xNjU4IDEyMzEvNDE2Mi8xNjU4IDEyNTYvNDIwNi8xNjU4CitmIDEyMjcvNDA0MS8xMDY1IDEyMjgvNDE1NS8xMDY1IDEyNTcvNDIwNy8xMDY1CitmIDEyNTcvNDIwNy8xNjEyIDEyNjEvNDEwNi8xNjEyIDEyMjcvNDA0MS8xNjEyCitmIDEyMzIvNDE2MS8xMDQzIDEyNTQvNDIwNC8xMDQzIDEyNTYvNDIwNi8xMDQzCitmIDEyNTYvNDIwNi8xNjU4IDEyMzEvNDE2Mi8xNjU4IDEyMzIvNDE2MS8xNjU4CitmIDEyNjEvNDEwNi8xMDQzIDEyNTcvNDIwNy8xMDQzIDEyMzYvNDE2NS8xMDQzCitmIDEyMzYvNDE2NS8xNTgxIDEyNDAvNDA1NS8xNTgxIDEyNjEvNDEwNi8xNTgxCitmIDEyNTYvNDIwNi8xMTAyIDEyNTQvNDIwNC8xMTAyIDEyMzkvNDE2OC8xMTAyCitmIDEyMzkvNDE2OC8xMDgxIDEyMzUvNDE2Ni8xMDgxIDEyNTYvNDIwNi8xMDgxCitmIDI3MTIvNDIxMy82ODcgMTI2My80MjE0LzY4NyAxMjYyLzQyMTUvNjg3CitmIDEyNjIvNDIxNi82ODcgMjcxMy80MjE3LzY4NyAyNzE0LzQyMTgvNjg3CitmIDI3MTUvNDIxOS82ODcgMTI2Mi80MjE1LzY4NyAxMjY0LzQyMjAvNjg3CitmIDEyNjQvNDIyMS82ODcgMjcxNi80MjIyLzY4NyAyNzE3LzQyMjMvNjg3CitmIDEyMjMvNDE1MS8xNjU5IDEyNjUvNDIyNC8xNjU5IDEyNjcvNDIyNS8xNjU5CitmIDEyNjcvNDIyNS8xNjYwIDI3MTgvNDIxMS8xNjYwIDEyMjMvNDE1MS8xNjYwCitmIDI3MTkvNDIyNi82ODcgMTI2NC80MjIwLzY4NyAxMjY2LzQyMjcvNjg3CitmIDEyNjYvNDIyOC82ODcgMjcyMC80MjI5LzY4NyAyNzIxLzQyMzAvNjg3CitmIDI3MjIvNDIzMS8xNjYxIDI3MjMvNDIzMi8xNjYxIDEyNjMvNDIzMy8xNjYxCitmIDEyNjMvNDIzNC8xNjYyIDI3MjQvNDIzNS8xNjYyIDI3MjUvNDIzNi8xNjYyCitmIDEyMjQvNDAzMi8xMjQyIDEyNjgvNDEzMS8xMjQyIDEyNjUvNDIyNC8xMjQyCitmIDEyNjUvNDIyNC8xMjQyIDEyMjMvNDE1MS8xMjQyIDEyMjQvNDAzMi8xMjQyCitmIDEyNjkvNDIzNy82ODcgMTI2Mi80MjE1LzY4NyAxMjYzLzQyMTQvNjg3CitmIDEyNjMvNDIxNC82ODcgMTI3MC80MjM4LzY4NyAxMjY5LzQyMzcvNjg3CitmIDEyNzEvNDIzOS82ODcgMTI2NC80MjIwLzY4NyAxMjYyLzQyMTUvNjg3CitmIDEyNjIvNDIxNS82ODcgMTI2OS80MjM3LzY4NyAxMjcxLzQyMzkvNjg3CitmIDEyNzIvNDI0MC8xNjYzIDEyNjcvNDIyNS8xNjYzIDEyNjUvNDIyNC8xNjYzCitmIDEyNjUvNDIyNC8xNjYzIDEyNzMvNDI0MS8xNjYzIDEyNzIvNDI0MC8xNjYzCitmIDEyNzQvNDI0Mi82ODcgMTI2Ni80MjI3LzY4NyAxMjY0LzQyMjAvNjg3CitmIDEyNjQvNDIyMC82ODcgMTI3MS80MjM5LzY4NyAxMjc0LzQyNDIvNjg3CitmIDI3MjYvNDI0My8xNjY0IDEyNzAvNDIzOC8xNjY0IDEyNjMvNDIxNC8xNjY0CitmIDEyNjMvNDI0NC8xNjY1IDI3MjcvNDI0NS8xNjY1IDI3MjgvNDI0Ni8xNjY1CitmIDEyNzMvNDI0MS8xMjQyIDEyNjUvNDIyNC8xMjQyIDEyNjgvNDEzMS8xMjQyCitmIDEyNjgvNDEzMS8xMjQyIDEyNzUvNDE0Mi8xMjQyIDEyNzMvNDI0MS8xMjQyCitmIDEyNzgvNDI0Ny8xNjY2IDEyNzcvNDI0OC8xNjY2IDEyNzYvNDI0OS8xNjY2CitmIDEyNzYvNDI0OS8xNjY3IDEyNzkvNDI1MC8xNjY3IDEyNzgvNDI0Ny8xNjY3CitmIDEzMTQvNDI1MS8xNjY4IDEzMTYvNDI1Mi8xNjY4IDEyNzcvNDI0OC8xNjY4CitmIDEyNzcvNDI0OC8xNjY5IDEyNzgvNDI0Ny8xNjY5IDEzMTQvNDI1MS8xNjY5CitmIDEyODIvNDI1My8xNjcwIDEyODEvNDI1NC8xNjcwIDEyODAvNDI1NS8xNjcwCitmIDEyODAvNDI1NS8xNjcxIDEyODMvNDI1Ni8xNjcxIDEyODIvNDI1My8xNjcxCitmIDEzMTQvNDI1MS8xNjcyIDEzMzUvNDI1Ny8xNjcyIDEzMzMvNDI1OC8xNjcyCitmIDEzMzMvNDI1OC8xNjczIDEzMTYvNDI1Mi8xNjczIDEzMTQvNDI1MS8xNjczCitmIDEyODUvNDI1OS8xNjc0IDEyODQvNDI2MC8xNjc0IDI3MjkvNDI2MS8xNjc0CitmIDI3MzAvNDI2Mi8xNjc1IDI3MzEvNDI2My8xNjc1IDEyODUvNDI2NC8xNjc1CitmIDEyODcvNDI2NS8xNjc2IDEyODYvNDI2Ni8xNjc2IDEyNzYvNDI0OS8xNjc2CitmIDEyNzYvNDI0OS8xNjc3IDEyNzcvNDI0OC8xNjc3IDEyODcvNDI2NS8xNjc3CitmIDExOTEvNDA5Ni8xMDg5IDEzMzQvNDI2Ny8xMDg5IDEzMjcvNDI2OC8xMDg5CitmIDEzMjcvNDI2OC8xMDQzIDExODkvNDA0Ny8xMDQzIDExOTEvNDA5Ni8xMDQzCitmIDEyNTkvNDEwMC8xMDQzIDEzMzgvNDI2OS8xMDQzIDEzMzQvNDI2Ny8xMDQzCitmIDEzMzQvNDI2Ny8xMDQzIDExOTEvNDA5Ni8xMDQzIDEyNTkvNDEwMC8xMDQzCitmIDEzMTYvNDI1Mi8xNjc4IDEzMTcvNDI3MC8xNjc4IDEyODcvNDI2NS8xNjc4CitmIDEyODcvNDI2NS8xNjc5IDEyNzcvNDI0OC8xNjc5IDEzMTYvNDI1Mi8xNjc5CitmIDEyODYvNDI2Ni8xNjgwIDEyODcvNDI2NS8xNjgwIDEyODgvNDI3MS8xNjgwCitmIDEyODgvNDI3MS8xNjMxIDEyODUvNDI1OS8xNjMxIDEyODYvNDI2Ni8xNjMxCitmIDI3MzIvNDI3Mi8xNjgxIDI3MzMvNDI3My8xNjgxIDEyODEvNDI3NC8xNjgxCitmIDEyODEvNDI1NC8xNjgyIDEyODIvNDI1My8xNjgyIDI3MzQvNDI3NS8xNjgyCitmIDEyNzYvNDI0OS8xNjgzIDEyODYvNDI2Ni8xNjgzIDEyODUvNDI1OS8xNjgzCitmIDEyODUvNDI1OS8xNjg0IDI3MzUvNDI3Ni8xNjg0IDEyNzYvNDI0OS8xNjg0CitmIDEyODQvNDI2MC8xMDQzIDEyODUvNDI1OS8xMDQzIDEyODgvNDI3MS8xMDQzCitmIDEyODgvNDI3MS8xMDY1IDEyODkvNDI3Ny8xMDY1IDEyODQvNDI2MC8xMDY1CitmIDEzMTgvNDI3OC82OTcgMjczNi80Mjc5LzY5NyAyNzM3LzQyODAvNjk3CitmIDI3MzgvNDI4MS82OTcgMTI5MC80MjgyLzY5NyAxMzE4LzQyODMvNjk3CitmIDEyODIvNDI1My8xNjg1IDEyOTIvNDI4NC8xNjg1IDEyOTEvNDI4NS8xNjg1CitmIDEyOTEvNDI4NS8xNjg1IDI3MzkvNDI3NS8xNjg1IDEyODIvNDI1My8xNjg1CitmIDI3NDAvNDI4Ni8xNjE1IDI3NDEvNDI4Ny8xNjE1IDEyOTAvNDI4OC8xNjE1CitmIDEyOTAvNDI4OS8xNjg2IDI3NDIvNDI5MC8xNjg2IDI3NDMvNDI5MS8xNjg2CitmIDEyODMvNDI1Ni8yODUgMTI5My80MjkyLzI4NSAxMjkyLzQyODQvMjg1CitmIDEyOTIvNDI4NC8yMTkgMTI4Mi80MjUzLzIxOSAxMjgzLzQyNTYvMjE5CitmIDEyOTQvNDI5My82OTcgMTMxOS80Mjk0LzY5NyAxMzE4LzQyODMvNjk3CitmIDEzMTgvNDI4My82OTcgMTI5MC80MjgyLzY5NyAxMjk0LzQyOTMvNjk3CitmIDEyOTUvNDI5NS8xNjg1IDEyOTEvNDI4NS8xNjg1IDEyOTIvNDI4NC8xNjg1CitmIDEyOTIvNDI4NC8xNjg1IDEyOTYvNDI5Ni8xNjg1IDEyOTUvNDI5NS8xNjg1CitmIDI3NDQvNDI5Ny82OTcgMTI5NC80MjkzLzY5NyAxMjkwLzQyODIvNjk3CitmIDEyOTAvNDI5OC82OTcgMjc0NS80Mjk5LzY5NyAyNzQ2LzQzMDAvNjk3CitmIDEyOTYvNDI5Ni8yMTkgMTI5Mi80Mjg0LzIxOSAxMjkzLzQyOTIvMjE5CitmIDEyOTMvNDI5Mi8yODUgMTI5Ny80MzAxLzI4NSAxMjk2LzQyOTYvMjg1CitmIDEzMDAvNDMwMi8xNjg3IDEyOTkvNDMwMy8xNjg3IDEyOTgvNDMwNC8xNjg3CitmIDEyOTgvNDMwNC8xNjg4IDEzMDEvNDMwNS8xNjg4IDEzMDAvNDMwMi8xNjg4CitmIDEzMDIvNDMwNi8xNjg5IDEyODMvNDI1Ni8xNjg5IDEyODAvNDI1NS8xNjg5CitmIDEyODAvNDI1NS8xNjkwIDEzMDMvNDMwNy8xNjkwIDEzMDIvNDMwNi8xNjkwCitmIDEyMjYvNDE1My8xNjkxIDEzMjkvNDMwOC8xNjkxIDEzMjgvNDMwOS8xNjkxCitmIDEzMjgvNDMwOS8xNjIyIDEyMjUvNDE1NC8xNjIyIDEyMjYvNDE1My8xNjIyCitmIDEzMDQvNDMxMC8xNjkyIDI3NDcvNDMxMS8xNjkyIDI3NDgvNDMxMi8xNjkyCitmIDI3NDkvNDI2MS8xNjkzIDEyODQvNDI2MC8xNjkzIDEzMDQvNDMxMy8xNjkzCitmIDEzMDUvNDMxNC8xNjk0IDEzMDEvNDMwNS8xNjk0IDEyOTgvNDMwNC8xNjk0CitmIDEyOTgvNDMwNC8xNjk1IDEzMDYvNDMxNS8xNjk1IDEzMDUvNDMxNC8xNjk1CitmIDEzMjMvNDMxNi8xMTAyIDEzMzAvNDMxNy8xMTAyIDEzMzcvNDMxOC8xMTAyCitmIDEzMzcvNDMxOC8xNjk2IDEzMjAvNDMxOS8xNjk2IDEzMjMvNDMxNi8xNjk2CitmIDEzMjYvNDMyMC8xMDQzIDEzMzgvNDI2OS8xMDQzIDEzMzAvNDMxNy8xMDQzCitmIDEzMzAvNDMxNy8xMDQzIDEzMjMvNDMxNi8xMDQzIDEzMjYvNDMyMC8xMDQzCitmIDEzMjIvNDMyMS8xNjk3IDEzMDEvNDMwNS8xNjk3IDEzMDUvNDMxNC8xNjk3CitmIDEzMDUvNDMxNC8xNjk4IDEzMjAvNDMxOS8xNjk4IDEzMjIvNDMyMS8xNjk4CitmIDEzMDYvNDMxNS8xMDg5IDEzMDQvNDMxMy8xMDg5IDEzMDcvNDMyMi8xMDg5CitmIDEzMDcvNDMyMi8xNjk5IDEzMDUvNDMxNC8xNjk5IDEzMDYvNDMxNS8xNjk5CitmIDI3NTAvNDMyMy8xNzAwIDEzMDIvNDMwNi8xNzAwIDEzMDMvNDMwNy8xNzAwCitmIDEzMDMvNDMyNC8xNzAxIDI3NTEvNDMyNS8xNzAxIDI3NTIvNDMyNi8xNzAxCitmIDEyOTgvNDMwNC8xNzAyIDI3NTMvNDMyNy8xNzAyIDEzMDQvNDMxMy8xNzAyCitmIDEzMDQvNDMxMy8xNzAzIDEzMDYvNDMxNS8xNzAzIDEyOTgvNDMwNC8xNzAzCitmIDEyODQvNDI2MC8xMDY1IDEyODkvNDI3Ny8xMDY1IDEzMDcvNDMyMi8xMDY1CitmIDEzMDcvNDMyMi8xMDgxIDEzMDQvNDMxMy8xMDgxIDEyODQvNDI2MC8xMDgxCitmIDEzMjQvNDMyOC82ODcgMTMwOC80MzI5LzY4NyAyNzU0LzQzMzAvNjg3CitmIDI3NTUvNDMzMS82ODcgMTMyMS80MzMyLzY4NyAxMzI0LzQzMzMvNjg3CitmIDEzMDIvNDMwNi80NDkgMjc1Ni80MzIzLzQ0OSAxMzEwLzQzMzQvNDQ5CitmIDEzMTAvNDMzNC80NDkgMTMwOS80MzM1LzQ0OSAxMzAyLzQzMDYvNDQ5CitmIDI3NTcvNDMzNi8xNzA0IDI3NTgvNDMzNy8xNzA0IDEzMDgvNDMzOC8xNzA0CitmIDEzMDgvNDMzOS8xNzA0IDI3NTkvNDM0MC8xNzA0IDI3NjAvNDM0MS8xNzA0CitmIDEyODMvNDI1Ni8yMjAgMTMwMi80MzA2LzIyMCAxMzA5LzQzMzUvMjIwCitmIDEzMDkvNDMzNS8yMjAgMTI5My80MjkyLzIyMCAxMjgzLzQyNTYvMjIwCitmIDEyNzQvNDI0Mi82ODcgMTMzMi80MzQyLzY4NyAxMzMxLzQzNDMvNjg3CitmIDEzMzEvNDM0My82ODcgMTI2Ni80MjI3LzY4NyAxMjc0LzQyNDIvNjg3CitmIDEzMTMvNDM0NC8xNzA1IDEzMTIvNDM0NS8xNzA1IDEzMDkvNDMzNS8xNzA1CitmIDEzMDkvNDMzNS80NDkgMTMxMC80MzM0LzQ0OSAxMzEzLzQzNDQvNDQ5CitmIDI3NjEvNDM0Ni8xNzA0IDI3NjIvNDM0Ny8xNzA0IDEzMDgvNDM0OC8xNzA0CitmIDEzMDgvNDMyOS8xNzA0IDEzMTEvNDM0OS8xNzA0IDI3NjMvNDM1MC8xNzA0CitmIDEzMTIvNDM0NS8yODYgMTI5Ny80MzAxLzI4NiAxMjkzLzQyOTIvMjg2CitmIDEyOTMvNDI5Mi8yMjAgMTMwOS80MzM1LzIyMCAxMzEyLzQzNDUvMjIwCitmIDEzMzMvNDI1OC8xNzA2IDEzMjcvNDI2OC8xNzA2IDEzMTcvNDI3MC8xNzA2CitmIDEzMTcvNDI3MC8xNjc4IDEzMTYvNDI1Mi8xNjc4IDEzMzMvNDI1OC8xNjc4CitmIDEyODcvNDI2NS8xNzA3IDEzMTcvNDI3MC8xNzA3IDEzMTUvNDM1MS8xNzA3CitmIDEzMTUvNDM1MS8xNTgyIDEyODgvNDI3MS8xNTgyIDEyODcvNDI2NS8xNTgyCitmIDEzMzYvNDM1Mi82OTcgMjc2NC80MzUzLzY5NyAyNzY1LzQzNTQvNjk3CitmIDI3NjYvNDM1NS82OTcgMTMxOC80MjgzLzY5NyAxMzM2LzQzNTYvNjk3CitmIDEzMzkvNDM1Ny82OTcgMTMzNi80MzU2LzY5NyAxMzE4LzQyODMvNjk3CitmIDEzMTgvNDI4My82OTcgMTMxOS80Mjk0LzY5NyAxMzM5LzQzNTcvNjk3CitmIDEzMDEvNDMwNS8xNzA4IDEzMjIvNDMyMS8xNzA4IDI3NjcvNDM1OC8xNzA4CitmIDI3NjgvNDM1OC8xNzA5IDEzMDAvNDMwMi8xNzA5IDEzMDEvNDMwNS8xNzA5CitmIDEzMzcvNDMxOC8xNzEwIDEzMjgvNDMwOS8xNzEwIDEzMjIvNDMyMS8xNzEwCitmIDEzMjIvNDMyMS8xNzExIDEzMjAvNDMxOS8xNzExIDEzMzcvNDMxOC8xNzExCitmIDEzMDcvNDMyMi8xNjk2IDEzMjMvNDMxNi8xNjk2IDEzMjAvNDMxOS8xNjk2CitmIDEzMjAvNDMxOS8xNjU3IDEzMDUvNDMxNC8xNjU3IDEzMDcvNDMyMi8xNjU3CitmIDI3NjkvNDM1OS82ODcgMTMzMS80MzQzLzY4NyAxMzI0LzQzMjgvNjg3CitmIDEzMjQvNDMzMy82ODcgMTMyMS80MzMyLzY4NyAyNzcwLzQzNjAvNjg3CitmIDEzMTEvNDM0OS82ODcgMTMwOC80MzI5LzY4NyAxMzI0LzQzMjgvNjg3CitmIDEzMjQvNDMyOC82ODcgMTMyNS80MzYxLzY4NyAxMzExLzQzNDkvNjg3CitmIDEyODkvNDI3Ny8xMDgxIDEyODgvNDI3MS8xMDgxIDEzMTUvNDM1MS8xMDgxCitmIDEzMTUvNDM1MS8xMDgxIDEzMjYvNDMyMC8xMDgxIDEyODkvNDI3Ny8xMDgxCitmIDEzMDcvNDMyMi8xMDgxIDEyODkvNDI3Ny8xMDgxIDEzMjYvNDMyMC8xMDgxCitmIDEzMjYvNDMyMC8xMDQzIDEzMjMvNDMxNi8xMDQzIDEzMDcvNDMyMi8xMDQzCitmIDExODgvNDAzNS8xNTc0IDExODcvNDAzNi8xNTc0IDEzMzMvNDI1OC8xNTc0CitmIDEzMzMvNDI1OC8xNjcyIDEzMzUvNDI1Ny8xNjcyIDExODgvNDAzNS8xNjcyCitmIDEzMTUvNDM1MS8xNzA3IDEzMTcvNDI3MC8xNzA3IDEzMjcvNDI2OC8xNzA3CitmIDEzMjcvNDI2OC8xMDg5IDEzMzQvNDI2Ny8xMDg5IDEzMTUvNDM1MS8xMDg5CitmIDEzMjYvNDMyMC8xMDQzIDEzMTUvNDM1MS8xMDQzIDEzMzQvNDI2Ny8xMDQzCitmIDEzMzQvNDI2Ny8xMDQzIDEzMzgvNDI2OS8xMDQzIDEzMjYvNDMyMC8xMDQzCitmIDI3NzEvNDM1OC8xNzEyIDEzMjIvNDMyMS8xNzEyIDEzMjgvNDMwOS8xNzEyCitmIDEzMjgvNDMwOS8xNjkxIDEzMjkvNDMwOC8xNjkxIDI3NzIvNDM1OC8xNjkxCitmIDEyNTUvNDIwNS8xMDQzIDEyMzMvNDE2My8xMDQzIDEzMzcvNDMxOC8xMDQzCitmIDEzMzcvNDMxOC8xMTAyIDEzMzAvNDMxNy8xMTAyIDEyNTUvNDIwNS8xMTAyCitmIDEyNTkvNDEwMC8xMDQzIDEyNTUvNDIwNS8xMDQzIDEzMzAvNDMxNy8xMDQzCitmIDEzMzAvNDMxNy8xMDQzIDEzMzgvNDI2OS8xMDQzIDEyNTkvNDEwMC8xMDQzCitmIDEzMjUvNDM2MS82ODcgMTMyNC80MzI4LzY4NyAxMzMxLzQzNDMvNjg3CitmIDEzMzEvNDM0My82ODcgMTMzMi80MzQyLzY4NyAxMzI1LzQzNjEvNjg3CitmIDExODcvNDAzNi8xNTgwIDExODkvNDA0Ny8xNTgwIDEzMjcvNDI2OC8xNTgwCitmIDEzMjcvNDI2OC8xNzA2IDEzMzMvNDI1OC8xNzA2IDExODcvNDAzNi8xNzA2CitmIDEyMDcvNDM2Mi82OTcgMjc3My80MzYzLzY5NyAyNzc0LzQzNjQvNjk3CitmIDI3NzUvNDM2NS82OTcgMTMzNi80MzU2LzY5NyAxMjA3LzQxMjMvNjk3CitmIDEyMDIvNDEzNy82OTcgMTIwNy80MTIzLzY5NyAxMzM2LzQzNTYvNjk3CitmIDEzMzYvNDM1Ni82OTcgMTMzOS80MzU3LzY5NyAxMjAyLzQxMzcvNjk3CitmIDEyMzMvNDE2My8xNjI5IDEyMjUvNDE1NC8xNjI5IDEzMjgvNDMwOS8xNjI5CitmIDEzMjgvNDMwOS8xNzEwIDEzMzcvNDMxOC8xNzEwIDEyMzMvNDE2My8xNzEwCitmIDI3NzYvNDM2Ni82ODcgMTI2Ni80MjI3LzY4NyAxMzMxLzQzNDMvNjg3CitmIDEzMzEvNDM2Ny82ODcgMjc3Ny80MzY4LzY4NyAyNzc4LzQzNjkvNjg3CitmIDcxNi8zMTA5LzIyMSA3MjAvMzA5MC8yMjEgNjg1LzMxNjcvMjIxCitmIDczOS8zMjY3LzIyMSA3NzQvMzE5MS8yMjEgNzcwLzMyMDkvMjIxCitmIDExMzcvMzkyNC82ODcgMTUwOS8zOTIzLzY4NyAxNTEwLzM4OTcvNjg3CitmIDE1MTAvMzg5Ny82ODcgMTM0MC8zODk2LzY4NyAxMTM3LzM5MjQvNjg3CitmIDExMjQvMzkyNy8xMzkwIDExMjUvMzkyNi8xMzkwIDEzNDIvMzkwMC8xMzkwCitmIDEzNDIvMzkwMC8xMzgxIDEzNDEvMzg5OS8xMzgxIDExMjQvMzkyNy8xMzgxCitmIDI3NzkvMzkyOS8yMjEgMTEyNi8zOTI4LzIyMSAxMzQzLzM5MDIvMjIxCitmIDEzNDMvNDM3MC8yMjEgMjc4MC80MzcxLzIyMSAyNzgxLzQzNzIvMjIxCitmIDExMjYvMzkyOC8yMjEgMTEyNy8zOTMwLzIyMSAxMzQ0LzM5MDYvMjIxCitmIDEzNDQvMzkwNi8yMjEgMTM0My8zOTAyLzIyMSAxMTI2LzM5MjgvMjIxCitmIDExMjkvMzkzMi8yMjEgMTEzMC8zOTMzLzIyMSAxMzQ2LzM5MDgvMjIxCitmIDEzNDYvMzkwOC8yMjEgMTM0NS8zOTA3LzIyMSAxMTI5LzM5MzIvMjIxCitmIDExMzAvMzkzMy8yMjEgMTEzMS8zOTM0LzIyMSAxMzQ3LzM5MDkvMjIxCitmIDEzNDcvMzkwOS8yMjEgMTM0Ni8zOTA4LzIyMSAxMTMwLzM5MzMvMjIxCitmIDExMzEvMzkzNC8xMzQ0IDExMzIvMzkzNS8xMzQ0IDEzNDgvMzkxMC8xMzQ0CitmIDEzNDgvMzkxMC8xMzQ0IDEzNDcvMzkwOS8xMzQ0IDExMzEvMzkzNC8xMzQ0CitmIDI3ODIvNDM3My82OTcgMTEzMy8zOTM2LzY5NyAxMzQ5LzM5MTIvNjk3CitmIDEzNDkvNDM3NC82OTcgMjc4My80Mzc1LzY5NyAyNzg0LzQzNzYvNjk3CitmIDExMzMvMzkzNi8xMzYyIDExMzQvMzk0MC8xMzYyIDEzNTAvMzkxNi8xMzYyCitmIDEzNTAvMzkxNi8xMzYyIDEzNDkvMzkxMi8xMzYyIDExMzMvMzkzNi8xMzYyCitmIDExMzYvMzYwNy8xMTcyIDEzNTIvMzkxNy8xMTcyIDI3ODUvMzkxNy8xMTcyCitmIDI3ODYvNDM3Ny8xMTcyIDI3ODcvNDM3OC8xMTcyIDExMzYvNDM3OC8xMTcyCitmIDExMjIvMzkyMC8xMTcyIDExMjMvMzUxNC8xMTcyIDEzNTIvMzkxNy8xMTcyCitmIDEzNTIvMzkxNy8xMTcyIDEzNTEvMzkyMS8xMTcyIDExMjIvMzkyMC8xMTcyCitmIDExMzkvMzk0Ny8yMjEgMTEyOS8zOTMyLzIyMSAxMzQ1LzM5MDcvMjIxCitmIDEzNDUvMzkwNy8yMjEgMTM1My8zOTQ5LzIyMSAxMTM5LzM5NDcvMjIxCitmIDEzNDQvMzkwNi8yMjEgMTEyNy8zOTMwLzIyMSAxMTQxLzM5NTEvMjIxCitmIDExNDEvMzk1MS8yMjEgMTM1NC8zOTUwLzIyMSAxMzQ0LzM5MDYvMjIxCitmIDExNDUvMzk1NS8yMjEgMTM1NS8zOTUyLzIyMSAxMzUzLzM5NDkvMjIxCitmIDEzNTMvMzk0OS8yMjAgMTEzOC8zOTQ0LzIyMCAxMTQ1LzM5NTUvMjIwCitmIDExNDgvMzk1OS8yMjEgMTM1Ni8zOTU3LzIyMSAxMzU0LzM5NTAvMjIxCitmIDEzNTQvMzk1MC8xMjc2IDExNDEvMzk1MS8xMjc2IDExNDgvMzk1OS8xMjc2CitmIDI3ODgvNDAwMi8xNzEzIDEzNjEvMzk2MC8xNzEzIDEzNTkvMzk2MC8xNzEzCitmIDEzNTkvNDM3OS8xNzE0IDI3ODkvNDM4MC8xNzE0IDI3OTAvNDM4MS8xNzE0CitmIDI3OTEvNDM4Mi8xNzE1IDEzNjIvMzk3MS8xNzE1IDEzNjAvMzk3MC8xNzE1CitmIDEzNjAvNDM4My8xNzE2IDI3OTIvNDM4NC8xNzE2IDI3OTMvNDM4NC8xNzE2CitmIDExNDQvMzk1My8xNzE3IDEzNTUvMzk1Mi8xNzE3IDI3OTQvMzk3Ny8xNzE3CitmIDI3OTUvNDM4NS8xNzE4IDI3OTYvNDM4Ni8xNzE4IDExNDQvNDM4Ny8xNzE4CitmIDExNDcvMzk1Ni8xNzE5IDEzNTYvMzk1Ny8xNzE5IDI3OTcvMzk4OS8xNzE5CitmIDI3OTgvNDM4OC8xNzIwIDI3OTkvNDM4OS8xNzIwIDExNDcvNDM5MC8xNzIwCitmIDExNjIvMzk2MS8xNzIxIDEzNjEvMzk2MC8xNzIxIDEzNTcvNDAwMS8xNzIxCitmIDEzNTcvNDAwMS8xNzIyIDI4MDAvNDM5MS8xNzIyIDExNjIvMzk2MS8xNzIyCitmIDI4MDEvNDM5Mi8xNzIzIDEzNjIvNDAxMC8xNzIzIDEzNTgvNDAwOS8xNzIzCitmIDEzNTgvNDM5My8xNzI0IDI4MDIvNDM5NC8xNzI0IDI4MDMvNDM5NS8xNzI0CitmIDY2Mi8zMDA1LzE3MjUgNjYzLzM4NTcvMTcyNSAxMzY1LzQzOTYvMTcyNQorZiAxMzY1LzQzOTYvMTcyNSAxMzY0LzQzOTcvMTcyNSA2NjIvMzAwNS8xNzI1CitmIDExMDAvMzg2OC8xMzk5IDY2NC8zODg1LzEzOTkgMTM2Ni80Mzk4LzEzOTkKK2YgMTM2Ni80Mzk4LzEzOTkgMTM3MS80Mzk5LzEzOTkgMTEwMC8zODY4LzEzOTkKK2YgMjgwNC80NDAwLzE0MDAgNjY1LzQ0MDEvMTQwMCAxMzY3LzQ0MDIvMTQwMAorZiAxMzY3LzQ0MDMvMTQwMCAxMzcyLzQ0MDQvMTQwMCAyODA1LzQ0MDUvMTQwMAorZiA2NjUvNDQwMS8xNzI2IDY2Ni80NDA2LzE3MjYgMTM2OC80NDA3LzE3MjYKK2YgMTM2OC80NDA3LzE3MjYgMTM2Ny80NDAyLzE3MjYgNjY1LzQ0MDEvMTcyNgorZiA2NDYvMzAwNi8xNzI3IDY2Mi8zMDA1LzE3MjcgMTM2NC80Mzk3LzE3MjcKK2YgMTM2NC80Mzk3LzE3MjcgMTM2My80NDA4LzE3MjcgNjQ2LzMwMDYvMTcyNworZiA2NjYvNDQwNi8xNzI4IDY3NS80NDA5LzE3MjggMTM2OS80NDEwLzE3MjgKK2YgMTM2OS80NDEwLzE3MjggMTM2OC80NDA3LzE3MjggNjY2LzQ0MDYvMTcyOAorZiA2NjMvMzg1Ny8xNTIwIDEwOTYvMzg1OS8xNTIwIDEzNzAvNDQxMS8xNTIwCitmIDEzNzAvNDQxMS8xNTIwIDEzNjUvNDM5Ni8xNTIwIDY2My8zODU3LzE1MjAKK2YgMjgwNi8zODY5LzE1MjMgMTEwMC8zODY4LzE1MjMgMTM3MS80Mzk5LzE1MjMKK2YgMTM3MS80NDEyLzE1MjMgMjgwNy80NDEzLzE1MjMgMjgwOC80NDE0LzE1MjMKK2YgMTEwOC8zODc4LzE1MjYgMTEwNC8zODc3LzE1MjYgMjgwOS80NDE1LzE1MjYKK2YgMjgxMC80NDE2LzE1MjYgMTM3My80NDE3LzE1MjYgMTEwOC80NDE4LzE1MjYKK2YgNjY0LzQ0MTkvMTUyOSAyODExLzQ0MjAvMTUyOSAyODEyLzQ0MjEvMTUyOQorZiAyODEzLzQ0MjIvMTUyOSAxMzY2LzQzOTgvMTUyOSA2NjQvMzg4NS8xNTI5CitmIDk4LzQ0MjMvNjg3IDk3LzQ0MjQvNjg3IDEzNzQvMTcxNi82ODcKK2YgMTM3NC8xNzE2LzY4NyAxMzc1LzE3MTUvNjg3IDk4LzQ0MjMvNjg3CitmIDk5LzQ0MjUvNjg3IDI4MTQvNDQyNi82ODcgMjgxNS80NDI3LzY4NworZiAyODE2LzE3MjAvNjg3IDEzNzYvMTcxOS82ODcgOTkvNDQyOC82ODcKK2YgMTM3Ny8xNzI1LzY4NyAxMDAvNDQyOS82ODcgOTkvNDQyOC82ODcKK2YgOTkvNDQyOC82ODcgMTM3Ni8xNzE5LzY4NyAxMzc3LzE3MjUvNjg3CitmIDEzNzgvMTcyNy82ODcgMTAxLzQ0MzAvNjg3IDEwMC80NDI5LzY4NworZiAxMDAvNDQyOS82ODcgMTM3Ny8xNzI1LzY4NyAxMzc4LzE3MjcvNjg3CitmIDE4MC80NDMxLzY4NyAxMDEvNDQzMC82ODcgMTM3OC8xNzI3LzY4NworZiAxMzc4LzE3MjcvNjg3IDEzOTEvMTcyOS82ODcgMTgwLzQ0MzEvNjg3CitmIDEwMy80NDMyLzY4NyAxMDIvNDQzMy82ODcgMTM3OS8xNzMyLzY4NworZiAxMzc5LzE3MzIvNjg3IDEzODAvMTczMS82ODcgMTAzLzQ0MzIvNjg3CitmIDEwNC80NDM0LzY4NyAxMDMvNDQzMi82ODcgMTM4MC8xNzMxLzY4NworZiAxMzgwLzE3MzEvNjg3IDEzODEvMTczNS82ODcgMTA0LzQ0MzQvNjg3CitmIDEwNS80NDM1LzY4NyAxMDQvNDQzNC82ODcgMTM4MS8xNzM1LzY4NworZiAxMzgxLzE3MzUvNjg3IDEzODIvMTczNy82ODcgMTA1LzQ0MzUvNjg3CitmIDEwNi80NDM2LzY4NyAyODE3LzQ0MzcvNjg3IDI4MTgvNDQzOC82ODcKK2YgMjgxOS8xNzQwLzY4NyAxMzgzLzE3MzkvNjg3IDEwNi80NDM5LzY4NworZiAxMDcvNDQ0MC82ODcgMTA2LzQ0MzkvNjg3IDEzODMvMTczOS82ODcKK2YgMTM4My8xNzM5LzY4NyAxMzg0LzE3NDUvNjg3IDEwNy80NDQwLzY4NworZiAxMDgvMzg0My82ODcgMTA3LzQ0NDAvNjg3IDEzODQvMTc0NS82ODcKK2YgMTM4NC8xNzQ1LzY4NyAxMzg1LzE3NDcvNjg3IDEwOC8zODQzLzY4NworZiAzMTcvNDQ0MS82ODcgMzAzLzIxNjUvNjg3IDEzOTUvMTc0OS82ODcKK2YgMTM5NS8xNzQ5LzY4NyAxMzk5LzE3NDgvNjg3IDMxNy80NDQxLzY4NworZiAyODIwLzQ0NDIvNjg3IDExMC8zMDY1LzY4NyAxMzg3LzE3NTQvNjg3CitmIDEzODcvMTc1NC82ODcgMTQwMi8xNzUzLzY4NyAyODIxLzQ0NDIvNjg3CitmIDExMi80NDQzLzY4NyAxMTEvNDQ0NC82ODcgMTM4OC8xNzU4LzY4NworZiAxMzg4LzE3NTgvNjg3IDEzODkvMTc1Ny82ODcgMTEyLzQ0NDMvNjg3CitmIDk3LzQ0MjQvNjg3IDExMi80NDQzLzY4NyAxMzg5LzE3NTcvNjg3CitmIDEzODkvMTc1Ny82ODcgMTM3NC8xNzE2LzY4NyA5Ny80NDI0LzY4NworZiAyMTgvNDQ0NS82ODcgMTUyMS80NDQ2LzY4NyAxNTI1LzE5MjUvNjg3CitmIDE1MjUvMTkyNS82ODcgMTM5Mi8xOTkxLzY4NyAyMTgvNDQ0NS82ODcKK2YgMTcwLzQ0NDcvNjg3IDE4MC80NDMxLzY4NyAxMzkxLzE3MjkvNjg3CitmIDEzOTEvMTcyOS82ODcgMTM5MC8xOTI2LzY4NyAxNzAvNDQ0Ny82ODcKK2YgMjQ2LzQ0NDgvNjg3IDIxOC80NDQ1LzY4NyAxMzkyLzE5OTEvNjg3CitmIDEzOTIvMTk5MS82ODcgMTM5My8xOTkwLzY4NyAyNDYvNDQ0OC82ODcKK2YgMTAyLzQ0MzMvNjg3IDI0Ni80NDQ4LzY4NyAxMzkzLzE5OTAvNjg3CitmIDEzOTMvMTk5MC82ODcgMTM3OS8xNzMyLzY4NyAxMDIvNDQzMy82ODcKK2YgMzQ3LzQ0NDkvNjg3IDI3OC80NDUwLzY4NyAxMzk0LzIxMTEvNjg3CitmIDEzOTQvMjExMS82ODcgMTQwMC8yMTEwLzY4NyAzNDcvNDQ0OS82ODcKK2YgMjk0LzE3NTAvNjg3IDEzOTUvMTc0OS82ODcgMTQwMS8yMTY0LzY4NworZiAxNDAxLzIxNjQvNjg3IDM1OS80NDUxLzY4NyAyOTQvMTc1MC82ODcKK2YgMjc4LzQ0NTAvMTI3MSA0NjgvMjUyMC8xMjcxIDEzOTcvMjE4NC8xMjcxCitmIDEzOTcvMjE4NC8xMjcxIDEzOTQvMjExMS8xMjcxIDI3OC80NDUwLzEyNzEKK2YgMTA5LzQ0NTIvNjg3IDM0Ny80NDQ5LzY4NyAxNDAwLzIxMTAvNjg3CitmIDE0MDAvMjExMC82ODcgMTM4Ni8yMjE2LzY4NyAxMDkvNDQ1Mi82ODcKK2YgMTA3Ni80NDUzLzY4NyAzNTkvNDQ1MS82ODcgMTQwMS8yMTY0LzY4NworZiAxNDAxLzIxNjQvNjg3IDE1MDIvMjIzMS82ODcgMTA3Ni80NDUzLzY4NworZiA5MzYvNDQ1NC82ODcgMzg0LzQ0NTUvNjg3IDE0MDMvMjMwNy82ODcKK2YgMTQwMy8yMzA3LzY4NyAxNDg5LzIzMDYvNjg3IDkzNi80NDU0LzY4NworZiAyODIyLzQ0NTYvNjg3IDI4MjMvNDQ1Ny82ODcgMTQwNC80NDU4LzY4NworZiAxNDA0LzIzMTEvNjg3IDE0OTQvMjMxMC82ODcgMjgyNC80NDU5LzY4NworZiAyODI1LzQ0NjAvNjg3IDI4MjYvNDQ2MS82ODcgMTQwNS80NDYyLzY4NworZiAxNDA1LzIzNDYvNjg3IDE0MDQvMjMxMS82ODcgMjgyNy80NDYzLzY4NworZiA0MjgvMjM0Ny82ODcgMTQwNS8yMzQ2LzY4NyAxNDA2LzIzNzEvNjg3CitmIDE0MDYvMjM3MS82ODcgNDI5LzQ0NjQvNjg3IDQyOC8yMzQ3LzY4NworZiA0OTMvMjYzNy82ODcgMTQwNy8yMzc3LzY4NyAxNDA4LzIzNzYvNjg3CitmIDE0MDgvMjM3Ni82ODcgNDMxLzQ0NjUvNjg3IDQ5My8yNjM3LzY4NworZiAzODQvNDQ1NS82ODcgNDMxLzQ0NjUvNjg3IDE0MDgvMjM3Ni82ODcKK2YgMTQwOC8yMzc2LzY4NyAxNDAzLzIzMDcvNjg3IDM4NC80NDU1LzY4NworZiA5NTQvMzY4My8xMjcyIDE0OTEvMjM4My8xMjcyIDE0MTAvMjM4Ni8xMjcyCitmIDE0MTAvMjM4Ni8xMjcyIDQzMy80NDY2LzEyNzIgOTU0LzM2ODMvMTI3MgorZiAyODI4LzQ0NjcvMjIxIDI4MjkvNDQ2OC8yMjEgMTQ5MC80NDY5LzIyMQorZiAxNDkwLzIzOTIvMjIxIDk1MS80NDcwLzIyMSAyODMwLzQ0NzEvMjIxCitmIDkwMC80NDcyLzExNzIgNDM1LzQ0NzMvMTE3MiAxNDEyLzIzOTUvMTE3MgorZiAxNDEyLzIzOTUvMTE3MiAxNDg0LzIzOTQvMTE3MiA5MDAvNDQ3Mi8xMTcyCitmIDQzNi80NDc0LzEyNzMgMTQxMy8yMzk3LzEyNzMgMTQxMi8yMzk1LzEyNzMKK2YgMTQxMi8yMzk1LzEyNzMgNDM1LzQ0NzMvMTI3MyA0MzYvNDQ3NC8xMjczCitmIDQ5Mi80NDc1LzE3MjkgMTQzOC8yMzk5LzE3MjkgMTQxMy8yMzk3LzE3MjkKK2YgMTQxMy8yMzk3LzE3MzAgNDM2LzQ0NzQvMTczMCA0OTIvNDQ3NS8xNzMwCitmIDI4MzEvNDQ3Ni8yMjAgMTQzOS8yNDAxLzIyMCAxNDExLzI0MDQvMjIwCitmIDE0MTEvNDQ3Ny8xMjc2IDI4MzIvNDQ3OC8xMjc2IDI4MzMvNDQ3OS8xMjc2CitmIDQzOC80NDgwLzY4NyA0NDUvNDQ4MS82ODcgMTQyMi8yNDA2LzY4NworZiAxNDIyLzI0MDYvNjg3IDE0MTUvMjQwNS82ODcgNDM4LzQ0ODAvNjg3CitmIDEwNzMvNDQ4Mi8yMjEgNDM5LzQ0ODMvMjIxIDE0MTYvMjQxMC8yMjEKK2YgMTQxNi8yNDEwLzIyMSAxNTAxLzI0MDkvMjIxIDEwNzMvNDQ4Mi8yMjEKK2YgNDM5LzQ0ODMvMjIxIDQ0MC80NDg0LzIyMSAxNDE3LzI0MTMvMjIxCitmIDE0MTcvMjQxMy8yMjEgMTQxNi8yNDEwLzIyMSA0MzkvNDQ4My8yMjEKK2YgNDQxLzQ0ODUvMjIxIDE0MTgvMjQxNS8yMjEgMTQxNy8yNDEzLzIyMQorZiAxNDE3LzI0MTMvMjIxIDQ0MC80NDg0LzIyMSA0NDEvNDQ4NS8yMjEKK2YgNDQzLzQ0ODYvMTE3MiA0NDIvNDQ4Ny8xMTcyIDE0MTkvMjQxOS8xMTcyCitmIDE0MTkvMjQxOS8xMTcyIDE0MjAvMjQxOC8xMTcyIDQ0My80NDg2LzExNzIKK2YgNDQzLzQ0ODYvMTE3MiAxNDIwLzI0MTgvMTE3MiAxNDIxLzI0MjEvMTE3MgorZiAxNDIxLzI0MjEvMTE3MiA0NDQvMjQzNy8xMTcyIDQ0My80NDg2LzExNzIKK2YgNDQ1LzQ0ODEvNjg3IDQ0Ni80NDg4LzY4NyAxNDIzLzI0MjMvNjg3CitmIDE0MjMvMjQyMy82ODcgMTQyMi8yNDA2LzY4NyA0NDUvNDQ4MS82ODcKK2YgNDQ2LzQ0ODgvNjg3IDQzNy80NDg5LzY4NyAxNDE0LzI0MjUvNjg3CitmIDE0MTQvMjQyNS82ODcgMTQyMy8yNDIzLzY4NyA0NDYvNDQ4OC82ODcKK2YgMTAzNC80NDkwLzE3MzEgMjgzNC80NDkxLzE3MzEgMjgzNS80NDkyLzE3MzEKK2YgMjgzNi80NDkzLzEyNDIgMTQ5Ny8yNDMyLzEyNDIgMTAzNC80NDk0LzEyNDIKK2YgNDgyLzQ0OTUvMTczMiAxNDM3LzI0MzMvMTczMiAxNDE4LzI0MTUvMTczMgorZiAxNDE4LzI0MTUvMTczMyA0NDEvNDQ4NS8xNzMzIDQ4Mi80NDk1LzE3MzMKK2YgMjgzNy80NDk2LzEyNzcgMTQzNi8yNDM1LzEyNzcgMTQyMS8yNDIxLzEyNzcKK2YgMTQyMS8yNDIxLzEyNDIgNDc5LzI0MjIvMTI0MiAyODM4LzQ0OTYvMTI0MgorZiA0NDgvNDQ5Ny82ODcgNDU1LzQ0OTgvNjg3IDE0MzIvMjQzOS82ODcKK2YgMTQzMi8yNDM5LzY4NyAxNDI1LzI0MzgvNjg3IDQ0OC80NDk3LzY4NworZiAxMDM1LzQ0OTkvMTczNCA0NDkvNDUwMC8xNzM0IDE0MjYvMjQ0My8xNzM0CitmIDE0MjYvMjQ0My8xMjc4IDE0OTgvMjQ0Mi8xMjc4IDEwMzUvNDQ5OS8xMjc4CitmIDQ0OS80NTAwLzE3MzUgNDUwLzQ1MDEvMTczNSAxNDI3LzI0NDYvMTczNQorZiAxNDI3LzI0NDYvMTczNiAxNDI2LzI0NDMvMTczNiA0NDkvNDUwMC8xNzM2CitmIDQ1MS80NTAyLzIyMSAxNDI4LzI0NDgvMjIxIDE0MjcvMjQ0Ni8yMjEKK2YgMTQyNy8yNDQ2LzIyMSA0NTAvNDUwMS8yMjEgNDUxLzQ1MDIvMjIxCitmIDQ1My80NTAzLzExNzIgNDUyLzQ1MDQvMTE3MiAxNDI5LzI0NTIvMTE3MgorZiAxNDI5LzI0NTIvMTE3MiAxNDMwLzI0NTEvMTE3MiA0NTMvNDUwMy8xMTcyCitmIDQ1My80NTAzLzExNzIgMTQzMC8yNDUxLzExNzIgMTQzMS8yNDU0LzExNzIKK2YgMTQzMS8yNDU0LzExNzIgNDU0LzI0NjgvMTE3MiA0NTMvNDUwMy8xMTcyCitmIDQ1NS80NDk4LzY4NyA0NTYvNDUwNS82ODcgMTQzMy8yNDU2LzY4NworZiAxNDMzLzI0NTYvNjg3IDE0MzIvMjQzOS82ODcgNDU1LzQ0OTgvNjg3CitmIDQ1Ni80NTA1LzY4NyA0NDcvNDUwNi82ODcgMTQyNC8yNDU4LzY4NworZiAxNDI0LzI0NTgvNjg3IDE0MzMvMjQ1Ni82ODcgNDU2LzQ1MDUvNjg3CitmIDEwOTAvNDUwNy8xMjQzIDI4MzkvNDUwOC8xMjQzIDI4NDAvNDUwOS8xMjQzCitmIDI4NDEvNDUxMC8xMjQzIDE1MDMvMjQ2NS8xMjQzIDEwOTAvNDUxMS8xMjQzCitmIDI4NDIvNDUxMi8xMTcyIDE0MzUvMjQ2Ni8xMTcyIDE0MzEvMjQ1NC8xMTcyCitmIDE0MzEvMjQ1NC8xMTcyIDQ2NS8yNDU1LzExNzIgMjg0My80NTEyLzExNzIKK2YgNDY3LzQ1MTMvMTczNyAxNDM0LzI0NjkvMTczNyAxNDI4LzI0NDgvMTczNworZiAxNDI4LzI0NDgvMTQ5MiA0NTEvNDUwMi8xNDkyIDQ2Ny80NTEzLzE0OTIKK2YgMzE0LzQ1MTQvMTI5MiAxMzk2LzM3NTgvMTI5MiAyODQ0LzQ1MTUvMTI5MgorZiAyODQ1LzQ1MTYvMTI5MiAyODQ2LzQ1MTcvMTI5MiAzMTQvNDUxOC8xMjkyCitmIDI4NDcvNDUxOS8xMjkzIDEzOTcvNDUyMC8xMjkzIDI4NDgvNDUyMS8xMjkzCitmIDI4NDkvNDUyMi8xMjkzIDI4NTAvNDUyMy8xMjkzIDI4NTEvNDUyNC8xMjkzCitmIDI4NTIvNDUyNS8xMjcyIDEzOTgvNDUyNi8xMjcyIDI4NTMvNDUyNy8xMjcyCitmIDI4NTQvNDUyOC8xMjcyIDI4NTUvNDUyOS8xMjcyIDI4NTYvNDUzMC8xMjcyCitmIDMxNy80NDQxLzQ5MyAxMzk5LzE3NDgvNDkzIDI4NTcvMjU4OS80OTMKK2YgMjg1OC80NTMxLzQ5MyAyODU5LzQ1MzIvNDkzIDMxNy80NTMzLzQ5MworZiA0MjkvNDQ2NC8xMzIyIDE0MDYvMjM3MS8xMzIyIDI4NjAvNDUzNC8xMzIyCitmIDI4NjEvNDUzNS8xNzM4IDI4NjIvNDUzNi8xNzM4IDQyOS80NTM3LzE3MzgKK2YgMjg2My80NTM4LzEzMjQgMTQwNy80NTM5LzEzMjQgMjg2NC80NTQwLzEzMjQKK2YgMjg2NS80NTQxLzE3MzkgMjg2Ni80NTQyLzE3MzkgMjg2Ny80NTQyLzE3MzkKK2YgNTY1LzMwNjYvNjg3IDU2Ni80NTQzLzY4NyAxNDQxLzI4MTYvNjg3CitmIDE0NDEvMjgxNi82ODcgMTQ0MC8yODE1LzY4NyA1NjUvMzA2Ni82ODcKK2YgNTY2LzQ1NDMvNjg3IDU2Ny80NTQ0LzY4NyAxNDQyLzI4MTkvNjg3CitmIDE0NDIvMjgxOS82ODcgMTQ0MS8yODE2LzY4NyA1NjYvNDU0My82ODcKK2YgMTQ0My8yODIyLzY4NyAxNDQyLzI4MTkvNjg3IDU2Ny80NTQ0LzY4NworZiA1NjcvNDU0NC82ODcgNTY4LzQ1NDUvNjg3IDE0NDMvMjgyMi82ODcKK2YgNTY5LzQ1NDYvNjg3IDE0NDQvMjgyMy82ODcgMjg2OC80NTQ3LzY4NworZiAyODY5LzQ1NDgvNjg3IDI4NzAvNDU0OS82ODcgNTY5LzQ1NTAvNjg3CitmIDU2OS80NTQ2LzY4NyA1NzAvMzI4Ny82ODcgMTQ0NS8yODI5LzY4NworZiAxNDQ1LzI4MjkvNjg3IDE0NDQvMjgyMy82ODcgNTY5LzQ1NDYvNjg3CitmIDE0NDcvMjgzNC82ODcgMTQ0Ni8yODMzLzY4NyA1NzEvNDU1MS82ODcKK2YgNTcxLzQ1NTEvNjg3IDU3Mi80NTUyLzY4NyAxNDQ3LzI4MzQvNjg3CitmIDU3My80NTUzLzY4NyAxNDQ4LzI4MzUvNjg3IDE0NDcvMjgzNC82ODcKK2YgMTQ0Ny8yODM0LzY4NyA1NzIvNDU1Mi82ODcgNTczLzQ1NTMvNjg3CitmIDU3My80NTUzLzY4NyA1NzQvNDU1NC82ODcgMTQ0OS8yODM3LzY4NworZiAxNDQ5LzI4MzcvNjg3IDE0NDgvMjgzNS82ODcgNTczLzQ1NTMvNjg3CitmIDI4NzEvNDU1NS82ODcgNTc1LzQ1NTYvNjg3IDE0NTAvMjg0MC82ODcKK2YgMTQ1MC80NTU3LzY4NyAyODcyLzQ1NTgvNjg3IDI4NzMvNDU1OS82ODcKK2YgNjIxLzM5MjIvNjg3IDY0OC80NTYwLzY4NyAxNDU1LzI5NTQvNjg3CitmIDE0NTUvMjk1NC82ODcgMTQ1MS8yOTUzLzY4NyA2MjEvMzkyMi82ODcKK2YgMTQ1Mi8yOTgwLzY4NyA2NDUvNDU2MS82ODcgNTcxLzQ1NTEvNjg3CitmIDU3MS80NTUxLzY4NyAxNDQ2LzI4MzMvNjg3IDE0NTIvMjk4MC82ODcKK2YgNjc0LzMwNDAvNjg3IDY0NS80NTYxLzY4NyAxNDUyLzI5ODAvNjg3CitmIDE0NTIvMjk4MC82ODcgMTQ1My8yOTgxLzY4NyA2NzQvMzA0MC82ODcKK2YgNjQ3LzQ1NjIvNjg3IDE0NTQvMjk4Mi82ODcgMTQ1NS8yOTU0LzY4NworZiAxNDU1LzI5NTQvNjg3IDY0OC80NTYwLzY4NyA2NDcvNDU2Mi82ODcKK2YgNjYzLzM4NTcvMTcyNSA2NjIvMzAwNS8xNzI1IDE0NTYvMjk5MC8xNzI1CitmIDE0NTYvMjk5MC8xMzk3IDE0NTcvMjk5My8xMzk3IDY2My8zODU3LzEzOTcKK2YgNjY0LzM4ODUvMTM5OSAxMTAwLzM4NjgvMTM5OSAxNTA1LzI5OTUvMTM5OQorZiAxNTA1LzI5OTUvMTM5OSAxNDU4LzI5OTQvMTM5OSA2NjQvMzg4NS8xMzk5CitmIDY2NS80NDAxLzE0MDAgMjg3NC80NDAwLzE0MDAgMTUwNi8yOTk5LzE0MDAKK2YgMTUwNi8yOTk5LzE0MDAgMTQ1OS8yOTk4LzE0MDAgNjY1LzQ0MDEvMTQwMAorZiA2NjYvNDQwNi8xNzI2IDY2NS80NDAxLzE3MjYgMTQ1OS8yOTk4LzE3MjYKK2YgMTQ1OS8yOTk4LzE3NDAgMTQ2MC8zMDAzLzE3NDAgNjY2LzQ0MDYvMTc0MAorZiA2NjgvMjk5MS8xNzQxIDE0NTYvMjk5MC8xNzQxIDE0NjEvMzAwNC8xNzQxCitmIDE0NjEvMzAwNC8xNzQyIDI4NzUvNDU2My8xNzQyIDY2OC8yOTkxLzE3NDIKK2YgNjY2LzQ0MDYvMTQwNiAxNDYwLzMwMDMvMTQwNiAxNDYyLzMwMDcvMTQwNgorZiAxNDYyLzMwMDcvMTc0MyA2NzUvNDQwOS8xNzQzIDY2Ni80NDA2LzE3NDMKK2YgNjY3LzMwMTMvMTc0NCAyODc2LzMwNDEvMTc0NCAxNDUzLzI5ODEvMTc0NAorZiAxNDUzLzI5ODEvMTc0NSA2MzgvMjg5MS8xNzQ1IDY2Ny8zMDEzLzE3NDUKK2YgMjg3Ny80NTY0LzE3NDYgMjg3OC80NTY1LzE3NDYgMTQ1NC80NTY2LzE3NDYKK2YgMTQ1NC8yOTgyLzE3NDcgNjQ3LzQ1NjIvMTc0NyAyODc5LzQ1NjcvMTc0NworZiA1NzUvNDU1Ni82ODcgMTA5LzQ0NTIvNjg3IDEzODYvMjIxNi82ODcKK2YgMTM4Ni8yMjE2LzY4NyAxNDUwLzI4NDAvNjg3IDU3NS80NTU2LzY4NworZiA1MjgvMjgxOC82ODcgMTE1LzE3NTUvNjg3IDEzODcvMTc1NC82ODcKK2YgMTM4Ny8xNzU0LzY4NyAxNDQwLzI4MTUvNjg3IDUyOC8yODE4LzY4NworZiA2OTkvNDU2OC82ODcgNjgyLzQ1NjkvNjg3IDE0NjMvMzA2OS82ODcKK2YgMTQ2My8zMDY5LzY4NyAxNDY1LzMwNjgvNjg3IDY5OS80NTY4LzY4NworZiA2OTgvNDU3MC82ODcgNjk5LzQ1NjgvNjg3IDE0NjUvMzA2OC82ODcKK2YgMTQ2NS8zMDY4LzY4NyAxNDY0LzMwOTEvNjg3IDY5OC80NTcwLzY4NworZiA3MjIvMzE1MS8xNDI3IDcwNy80NTcxLzE0MjcgMTQ2Ny8zMTEyLzE0MjcKK2YgMTQ2Ny8zMTEyLzE0MjcgMTQ3Mi8zMTExLzE0MjcgNzIyLzMxNTEvMTQyNworZiA3MDcvNDU3MS8xNDI4IDcwOC80NTcyLzE0MjggMTQ2OC8zMTE0LzE0MjgKK2YgMTQ2OC8zMTE0LzE0MjggMTQ2Ny8zMTEyLzE0MjggNzA3LzQ1NzEvMTQyOAorZiA3MDgvNDU3Mi8xNDI5IDcwOS80NTczLzE0MjkgMTQ2OS8zMTE2LzE0MjkKK2YgMTQ2OS8zMTE2LzE0MjkgMTQ2OC8zMTE0LzE0MjkgNzA4LzQ1NzIvMTQyOQorZiA3MTUvNDU3NC8xNzQ4IDE0NzAvMzExOC8xNzQ4IDE0NjkvMzExNi8xNzQ4CitmIDE0NjkvMzExNi8xNzQ5IDcwOS80NTczLzE3NDkgNzE1LzQ1NzQvMTc0OQorZiAyODgwLzQ1NzUvMTQ0MCAyODgxLzQ1NzYvMTQ0MCAxNDcwLzQ1NzcvMTQ0MAorZiAxNDcwLzMxMTgvMTc1MCA3MTUvNDU3NC8xNzUwIDI4ODIvNDU3OC8xNzUwCitmIDI4ODMvNDU3OS8xNDQyIDI4ODQvNDU4MC8xNDQyIDE0NjYvNDU4MS8xNDQyCitmIDE0NjYvMzE0My8xNDQyIDE0NzEvMzE0Mi8xNDQyIDI4ODUvNDU4Mi8xNDQyCitmIDcyMy80NTgzLzE0NDUgMjg4Ni80NTg0LzE0NDUgMjg4Ny80NTg1LzE0NDUKK2YgMjg4OC80NTg2LzE0NDUgMTQ3Mi8zMTExLzE0NDUgNzIzLzMxMTAvMTQ0NQorZiA3MzYvMzI4OC82ODcgNzUzLzQ1ODcvNjg3IDE0NzUvMzE2OS82ODcKK2YgMTQ3NS8zMTY5LzY4NyAxNDczLzMxNjgvNjg3IDczNi8zMjg4LzY4NworZiA3NTMvNDU4Ny82ODcgNzUyLzQ1ODgvNjg3IDE0NzQvMzE5Mi82ODcKK2YgMTQ3NC8zMTkyLzY4NyAxNDc1LzMxNjkvNjg3IDc1My80NTg3LzY4NworZiA3NjEvNDU4OS8xNDQ5IDc3Ni8zMjUxLzE0NDkgMTQ4Mi8zMjEyLzE0NDkKK2YgMTQ4Mi8zMjEyLzE0NDkgMTQ3Ny8zMjExLzE0NDkgNzYxLzQ1ODkvMTQ0OQorZiA3NjIvNDU5MC8xNDUwIDc2MS80NTg5LzE0NTAgMTQ3Ny8zMjExLzE0NTAKK2YgMTQ3Ny8zMjExLzE0NTAgMTQ3OC8zMjE1LzE0NTAgNzYyLzQ1OTAvMTQ1MAorZiA3NjMvNDU5MS8xNDUxIDc2Mi80NTkwLzE0NTEgMTQ3OC8zMjE1LzE0NTEKK2YgMTQ3OC8zMjE1LzE0NTEgMTQ3OS8zMjE4LzE0NTEgNzYzLzQ1OTEvMTQ1MQorZiA3NjMvNDU5MS8xNDUyIDE0NzkvMzIxOC8xNDUyIDE0ODAvMzIxOS8xNDUyCitmIDE0ODAvMzIxOS8xNzUxIDc2OS80NTkyLzE3NTEgNzYzLzQ1OTEvMTc1MQorZiAyODg5LzQ1OTMvMTQ2MyAyODkwLzQ1OTQvMTQ2MyAxNDc0LzQ1OTUvMTQ2MworZiAxNDc0LzMxOTIvMTc1MiA3NTIvNDU4OC8xNzUyIDI4OTEvNDU4OC8xNzUyCitmIDI4OTIvNDU5Ni8xNzUzIDI4OTMvNDU5Ny8xNzUzIDE0ODEvNDU5OC8xNzUzCitmIDE0ODEvMzI0NS8xNDY0IDE0NzYvMzI0NC8xNDY0IDI4OTQvMzI5NC8xNDY0CitmIDI4OTUvNDU5OS8xNDY3IDc3Ny8zMjEzLzE0NjcgMTQ4Mi8zMjEyLzE0NjcKK2YgMTQ4Mi80NjAwLzE0NjcgMjg5Ni80NjAxLzE0NjcgMjg5Ny80NjAyLzE0NjcKK2YgNjgyLzQ1NjkvNjg3IDExMTAvMzg5OC82ODcgMTUwOC8zMjY4LzY4NworZiAxNTA4LzMyNjgvNjg3IDE0NjMvMzA2OS82ODcgNjgyLzQ1NjkvNjg3CitmIDczMi8zMTcxLzY4NyA1NzgvMjgzMC82ODcgMTQ0NS8yODI5LzY4NworZiAxNDQ1LzI4MjkvNjg3IDE0NzMvMzE2OC82ODcgNzMyLzMxNzEvNjg3CitmIDc2MC8zMjQzLzY4NyA3ODQvMzMxMi82ODcgMTQ4My8zMjkyLzY4NworZiAxNDgzLzMyOTIvNjg3IDE0NzYvMzI0NC82ODcgNzYwLzMyNDMvNjg3CitmIDI4OTgvNDYwMy82ODcgNzg1LzMyOTMvNjg3IDE0ODMvMzI5Mi82ODcKK2YgMTQ4My8zMjkyLzY4NyAxNDY2LzMxNDMvNjg3IDI4OTkvNDYwMy82ODcKK2YgOTgxLzQ2MDQvMTE3MiA5MDAvNDQ3Mi8xMTcyIDE0ODQvMjM5NC8xMTcyCitmIDE0ODQvMjM5NC8xMTcyIDE0OTMvMzYxMi8xMTcyIDk4MS80NjA0LzExNzIKK2YgOTA3LzQ2MDUvMjIxIDkwNC80NjA2LzIyMSAxNDg1LzM2MjEvMjIxCitmIDE0ODUvMzYyMS8yMjEgMTQ4Ni8zNjIwLzIyMSA5MDcvNDYwNS8yMjEKK2YgOTA3LzQ2MDUvMjIxIDE0ODYvMzYyMC8yMjEgMTQxMS8yNDA0LzIyMQorZiAxNDExLzI0MDQvMjIxIDQzNC8yNDAzLzIyMSA5MDcvNDYwNS8yMjEKK2YgMjkwMC80NjA3LzY4NyAyOTAxLzQ2MDgvNjg3IDE0ODcvNDYwOS82ODcKK2YgMTQ4Ny8zNjQ1LzY4NyAxNDkyLzM2NDQvNjg3IDI5MDIvNDYxMC82ODcKK2YgMjkwMy80NjExLzY4NyA5MjUvMzY4NS82ODcgMTQ4OC8zNjU4LzY4NworZiAxNDg4LzM2NTgvNjg3IDE0ODcvMzY0NS82ODcgMjkwNC80NjExLzY4NworZiAxMTEvNDQ0NC82ODcgOTM2LzQ0NTQvNjg3IDE0ODkvMjMwNi82ODcKK2YgMTQ4OS8yMzA2LzY4NyAxMzg4LzE3NTgvNjg3IDExMS80NDQ0LzY4NworZiA5MDQvNDYwNi8yMjAgOTUxLzQ0NzAvMjIwIDE0OTAvMjM5Mi8yMjAKK2YgMTQ5MC8yMzkyLzIyMCAxNDg1LzM2MjEvMjIwIDkwNC80NjA2LzIyMAorZiA5NTYvMjM4NC8xNTA3IDE0OTEvMjM4My8xNTA3IDE0ODgvMzY1OC8xNTA3CitmIDE0ODgvMzY1OC8xNTA3IDkyNS8zNjg1LzE1MDcgOTU2LzIzODQvMTUwNworZiAyOTA1LzQ2MTAvNjg3IDE0OTIvMzY0NC82ODcgMTQwOS8zNjk1LzY4NworZiAxNDA5LzQ2MTIvNjg3IDI5MDYvNDYxMy82ODcgMjkwNy80NjE0LzY4NworZiAyOTA4LzQ2MTUvMTE3MiA5ODEvNDYwNC8xMTcyIDE0OTMvMzYxMi8xMTcyCitmIDE0OTMvNDYxNi8xMTcyIDI5MDkvNDYxNy8xMTcyIDI5MTAvNDYxOC8xMTcyCitmIDI5MTEvNDYxOS82ODcgMjkxMi80NjIwLzY4NyAxNDk0LzQ2MjEvNjg3CitmIDE0OTQvNDYyMi82ODcgMjkxMy80NjIzLzY4NyAyOTE0LzQ2MjQvNjg3CitmIDEwNDgvNDYyNS82ODcgMTA0OS8zODM1LzY4NyAxNTAwLzM3MzYvNjg3CitmIDE1MDAvMzczNi82ODcgMTQ5OS8zNzM1LzY4NyAxMDQ4LzQ2MjUvNjg3CitmIDEwMDcvNDYyNi82ODcgMTQ5NS8zNzU5LzY4NyAxMzk2LzM3NTgvNjg3CitmIDEzOTYvMzc1OC82ODcgMzE0LzQ1MTQvNjg3IDEwMDcvNDYyNi82ODcKK2YgMTAwNi80NjI3LzY4NyAxNDk2LzM3NjIvNjg3IDEzOTgvMjU4NC82ODcKK2YgMTM5OC8yNTg0LzY4NyAyOTE1LzQ2MjgvNjg3IDEwMDYvNDYyNy82ODcKK2YgNDQyLzQ0ODcvMTE3MiAxMDM0LzQ0OTQvMTE3MiAxNDk3LzI0MzIvMTE3MgorZiAxNDk3LzI0MzIvMTE3MiAxNDE5LzI0MTkvMTE3MiA0NDIvNDQ4Ny8xMTcyCitmIDI5MTYvNDYyOS8xNzU0IDEwMzUvNDQ5OS8xNzU0IDE0OTgvMjQ0Mi8xNzU0CitmIDE0OTgvNDYzMC8xNjg1IDI5MTcvNDYzMS8xNjg1IDI5MTgvNDYzMi8xNjg1CitmIDEwMDcvNDYyNi82ODcgMTA0OC80NjI1LzY4NyAxNDk5LzM3MzUvNjg3CitmIDE0OTkvMzczNS82ODcgMTQ5NS8zNzU5LzY4NyAxMDA3LzQ2MjYvNjg3CitmIDEwNDcvMzczNy82ODcgMTUwMC8zNzM2LzY4NyAxNDk2LzM3NjIvNjg3CitmIDE0OTYvMzc2Mi82ODcgMTAwNi80NjI3LzY4NyAxMDQ3LzM3MzcvNjg3CitmIDI5MTkvNDYzMy8yMTkgMTA3My80NDgyLzIxOSAxNTAxLzI0MDkvMjE5CitmIDE1MDEvNDYzNC8yMTkgMjkyMC80NjM1LzIxOSAyOTIxLzQ2MzYvMjE5CitmIDExNi8xNzQ2LzY4NyAxMDc2LzQ0NTMvNjg3IDE1MDIvMjIzMS82ODcKK2YgMTUwMi8yMjMxLzY4NyAxMzg1LzE3NDcvNjg3IDExNi8xNzQ2LzY4NworZiA0NTIvNDUwNC8xMjQzIDEwOTAvNDUxMS8xMjQzIDE1MDMvMjQ2NS8xMjQzCitmIDE1MDMvMjQ2NS8xMjQzIDE0MjkvMjQ1Mi8xMjQzIDQ1Mi80NTA0LzEyNDMKK2YgNjY5LzI5OTIvMTUyMCAyOTIyLzQ2MzcvMTUyMCAxNTA0LzM4NTgvMTUyMAorZiAxNTA0LzM4NTgvMTUxOSAxNDU3LzI5OTMvMTUxOSA2NjkvMjk5Mi8xNTE5CitmIDI5MjMvNDYzOC8xNTIzIDExMDEvMjk5Ni8xNTIzIDE1MDUvMjk5NS8xNTIzCitmIDE1MDUvNDYzOS8xNTIzIDI5MjQvNDY0MC8xNTIzIDI5MjUvNDY0MS8xNTIzCitmIDI5MjYvNDY0Mi8xNTI2IDI5MjcvNDY0My8xNTI2IDI5MjgvNDY0NC8xNTI2CitmIDI5MjkvNDY0NS8xNTI2IDE1MDcvNDY0Ni8xNTI2IDI5MzAvNDY0Ny8xNTI2CitmIDY3MC80NjQ4LzE1MjkgMjkzMS80NjQ5LzE1MjkgMjkzMi80NjUwLzE1MjkKK2YgMjkzMy8zODg2LzE1MjkgMTQ1OC8yOTk0LzE1MjkgNjcwLzI5OTcvMTUyOQorZiAxMzQxLzM4OTkvNjg3IDExMTEvMzI2OS82ODcgMTUwOC8zMjY4LzY4NworZiAxNTA4LzMyNjgvNjg3IDE1MTAvMzg5Ny82ODcgMTM0MS8zODk5LzY4NworZiA2MjMvMjk1Ni82ODcgMTEyNC8zOTI3LzY4NyAxNTA5LzM5MjMvNjg3CitmIDE1MDkvMzkyMy82ODcgMTQ1MS8yOTUzLzY4NyA2MjMvMjk1Ni82ODcKK2YgMTEyNC8zOTI3LzY4NyAxMzQxLzM4OTkvNjg3IDE1MTAvMzg5Ny82ODcKK2YgMTUxMC8zODk3LzY4NyAxNTA5LzM5MjMvNjg3IDExMjQvMzkyNy82ODcKK2YgMjE5LzE5NzkvMTE3MiAyMjEvMTk4Ni8xMTcyIDE1MTMvMTkxNy8xMTcyCitmIDE1MTMvMTkxNy8xMTcyIDE1MTEvMTkxNi8xMTcyIDIxOS8xOTc5LzExNzIKK2YgMjIzLzE5ODgvMTIxNCAyMjIvMTk4MS8xMjE0IDE1MTcvMTkyMS8xMjE0CitmIDE1MTcvMTkyMS8xMjE0IDE1MTQvMTkyMC8xMjE0IDIyMy8xOTg4LzEyMTQKK2YgMjIwLzE5OTIvNjg3IDEzOTIvMTk5MS82ODcgMTUyNS8xOTI1LzY4NworZiAxNTI1LzE5MjUvNjg3IDE1MTYvMTkyNC82ODcgMjIwLzE5OTIvNjg3CitmIDI5MzQvNDY1MS8xNzU1IDIyMC8xOTkyLzE3NTUgMTUxNi8xOTI0LzE3NTUKK2YgMTUxNi8xOTI0LzEyMjkgMTUxOC8xOTI4LzEyMjkgMjkzNS80NjUxLzEyMjkKK2YgMjI2LzE5NzMvMTE3MiAyMjcvMTk2My8xMTcyIDE1MTUvMTkzMy8xMTcyCitmIDE1MTUvMTkzMy8xMTcyIDE1MjAvMTkzMi8xMTcyIDIyNi8xOTczLzExNzIKK2YgMjIxLzE5ODYvMTE3MiAyMjgvMTk3NC8xMTcyIDE1MjIvMTkzNi8xMTcyCitmIDE1MjIvMTkzNi8xMTcyIDE1MTMvMTkxNy8xMTcyIDIyMS8xOTg2LzExNzIKK2YgMTY3LzE5MzkvMTE3MiAxOTcvMTkzNC8xMTcyIDE1MTUvMTkzMy8xMTcyCitmIDE1MTUvMTkzMy8xMTcyIDE1MTkvMTk2Mi8xMTcyIDE2Ny8xOTM5LzExNzIKK2YgMTY4LzE5MzUvMTE3MiAyMTUvMTkzNy8xMTcyIDE1MjIvMTkzNi8xMTcyCitmIDE1MjIvMTkzNi8xMTcyIDE1MjAvMTkzMi8xMTcyIDE2OC8xOTM1LzExNzIKK2YgMjkzNi80NjUyLzExNzIgMTY3LzE5MzkvMTE3MiAxNTE5LzE5NjIvMTE3MgorZiAxNTE5LzQ2NTMvMTE3MiAyOTM3LzQ2NTQvMTE3MiAyOTM4LzQ2NTUvMTE3MgorZiAxNjEvMTkxOS8xMTkzIDE2OS8xOTQ0LzExOTMgMTUxMi8xOTc3LzExOTMKK2YgMTUxMi8xOTc3LzExOTMgMTUxMS8xOTE2LzExOTMgMTYxLzE5MTkvMTE5MworZiAyOTM5LzQ2NTYvNjk3IDE2NC8xOTIyLzY5NyAxNTE3LzE5MjEvNjk3CitmIDE1MTcvNDY1Ny82OTcgMjk0MC80NjU4LzY5NyAyOTQxLzQ2NTkvNjk3CitmIDI5NDIvMzM5MC8yMjEgODYyLzMzOTAvMjIxIDE1MjQvMzM4NS8yMjEKK2YgMTUyNC80NjYwLzIyMSAyOTQzLzQ2NjAvMjIxIDI5NDQvNDY2MS8yMjEKK2YgODEyLzM1NTUvMjg1IDg2NC8zMzg2LzI4NSAxNTI0LzMzODUvMjg1CitmIDE1MjQvMzM4NS8yMjEgMTUyMy8zNTU0LzIyMSA4MTIvMzU1NS8yMjEKK2YgMTcwLzQ0NDcvNjg3IDEzOTAvMTkyNi82ODcgMTUyNS8xOTI1LzY4NworZiAxNTI1LzE5MjUvNjg3IDE1MjEvNDQ0Ni82ODcgMTcwLzQ0NDcvNjg3CitmIDEwNjkzLzQ2NjIvMTA0NCAxMDY5NC80NjYzLzEwNDQgMTA2NjcvNDY2NC8xMDQ0CitmIDEwNjY3LzQ2NjQvMTA0NCAxMDY2OC80NjY1LzEwNDQgMTA2OTMvNDY2Mi8xMDQ0CitmIDEwNjcyLzQ2NjYvMTc1NiAxMDY3My80NjY3LzE3NTYgMTA4NDMvNDY2OC8xNzU2CitmIDEwODQzLzQ2NjgvMTc1NiAxMDgyNS80NjY5LzE3NTYgMTA2NzIvNDY2Ni8xNzU2CitmIDEwODY3LzQ2NzAvNjg3IDEwNjc0LzQ2NzEvNjg3IDEwODQ0LzQ2NzIvNjg3CitmIDEwODQ0LzQ2NzMvNjg3IDEwODY4LzQ2NzQvNjg3IDEwODY5LzQ2NzUvNjg3CitmIDEwNzA5LzQ2NzYvNjg3IDEwNzMzLzQ2NzcvNjg3IDEwODUyLzQ2NzgvNjg3CitmIDEwODUyLzQ2NzgvNjg3IDEwODMxLzQ2NzkvNjg3IDEwNzA5LzQ2NzYvNjg3CitmIDEwNjc1LzQ2ODAvNjg3IDEwNjc2LzQ2ODEvNjg3IDEwODQ2LzQ2ODIvNjg3CitmIDEwODQ2LzQ2ODIvNjg3IDEwODQ1LzQ2ODMvNjg3IDEwNjc1LzQ2ODAvNjg3CitmIDEwODcwLzQ2ODQvMTc1NyAxMDY3Ny80Njg1LzE3NTcgMTA4NDcvNDY4Ni8xNzU3CitmIDEwODQ3LzQ2ODcvMTc1NyAxMDg3MS80Njg4LzE3NTcgMTA4NzIvNDY4OS8xNzU3CitmIDEwNzAxLzQ2OTAvMTA0NCAxMDcwMC80NjkxLzEwNDQgMTA2OTIvNDY5Mi8xMDQ0CitmIDEwNjkyLzQ2OTIvMTA0NCAxMDcwMi80NjkzLzEwNDQgMTA3MDEvNDY5MC8xMDQ0CitmIDEwNjg0LzQ2OTQvMTc1OCAxMDg0OC80Njk1LzE3NTggMTA4MjYvNDY5Ni8xNzU4CitmIDEwODI2LzQ2OTYvMTc1OCAxMDY4NS80Njk3LzE3NTggMTA2ODQvNDY5NC8xNzU4CitmIDEwODczLzQ2OTgvNjk3IDEwODc0LzQ2OTkvNjk3IDEwODI3LzQ3MDAvNjk3CitmIDEwODI3LzQ3MDEvNjk3IDEwNjg2LzQ3MDIvNjk3IDEwODc1LzQ3MDMvNjk3CitmIDEwNjg3LzQ3MDQvNjk3IDEwODI4LzQ3MDUvNjk3IDEwODI5LzQ3MDYvNjk3CitmIDEwODI5LzQ3MDYvNjk3IDEwNjg4LzQ3MDcvNjk3IDEwNjg3LzQ3MDQvNjk3CitmIDEwODc2LzQ3MDgvMTY1OSAxMDg3Ny80NzA5LzE2NTkgMTA4MzAvNDcxMC8xNjU5CitmIDEwODMwLzQ3MTEvMTY1OSAxMDY4OS80NzEyLzE2NTkgMTA4NzgvNDcxMy8xNjU5CitmIDEwNzI5LzQ3MTQvMTE3MiAxMDY4OS80NzEyLzExNzIgMTA4MzAvNDcxMS8xMTcyCitmIDEwODMwLzQ3MTEvMTE3MiAxMDgzMy80NzE1LzExNzIgMTA3MjkvNDcxNC8xMTcyCitmIDEwNzI1LzQ3MTYvMTA0NCAxMDY5Mi80NjkyLzEwNDQgMTA3MDAvNDY5MS8xMDQ0CitmIDEwNzAwLzQ2OTEvMTA0NCAxMDcyMy80NzE3LzEwNDQgMTA3MjUvNDcxNi8xMDQ0CitmIDEwNzA0LzQ3MTgvMTA0NCAxMDcwMy80NzE5LzEwNDQgMTA2OTAvNDcyMC8xMDQ0CitmIDEwNjkwLzQ3MjAvMTA0NCAxMDY4My80NzIxLzEwNDQgMTA3MDQvNDcxOC8xMDQ0CitmIDEwNzI2LzQ3MjIvMTA0NCAxMDY4My80NzIxLzEwNDQgMTA2OTAvNDcyMC8xMDQ0CitmIDEwNjkwLzQ3MjAvMTA0NCAxMDcyNC80NzIzLzEwNDQgMTA3MjYvNDcyMi8xMDQ0CitmIDEwNjcxLzQ3MjQvMTA0NCAxMDY5MS80NzI1LzEwNDQgMTA2NjkvNDcyNi8xMDQ0CitmIDEwNjY5LzQ3MjYvMTA0NCAxMDY3MC80NzI3LzEwNDQgMTA2NzEvNDcyNC8xMDQ0CitmIDEwNzE1LzQ3MjgvMTA0NCAxMDczNi80NzI5LzEwNDQgMTA3MzQvNDczMC8xMDQ0CitmIDEwNzM0LzQ3MzAvMTA0NCAxMDcxMC80NzMxLzEwNDQgMTA3MTUvNDcyOC8xMDQ0CitmIDEwNzMxLzQ3MzIvMTA0NCAxMDc0MC80NzMzLzEwNDQgMTA3MzYvNDcyOS8xMDQ0CitmIDEwNzM2LzQ3MjkvMTA0NCAxMDcxNS80NzI4LzEwNDQgMTA3MzEvNDczMi8xMDQ0CitmIDEwNzA3LzQ3MzQvMTA0NCAxMDczMi80NzM1LzEwNDQgMTA3MzcvNDczNi8xMDQ0CitmIDEwNzM3LzQ3MzYvMTA0NCAxMDcxNi80NzM3LzEwNDQgMTA3MDcvNDczNC8xMDQ0CitmIDEwNjY2LzQ3MzgvMTc1OSAxMDg3OS80NzM5LzE3NTkgMTA4ODAvNDc0MC8xNzU5CitmIDEwNjY2LzQ3NDEvMTc2MCAxMDY5NS80NzQyLzE3NjAgMTA4ODEvNDc0My8xNzYwCitmIDEwODgyLzQ3NDQvMTc2MSAxMDg4My80NzQ1LzE3NjEgMTA4ODQvNDc0Ni8xNzYxCitmIDEwODg1LzQ3NDcvMTc2MSAxMDY5Ni80NzQ4LzE3NjEgMTA4ODYvNDc0OS8xNzYxCitmIDEwNzA2LzQ3NTAvMTc2MSAxMDg4Ny80NzUxLzE3NjEgMTA3MzgvNDc1Mi8xNzYxCitmIDEwNzM4LzQ3NTIvMTc2MiAxMDcxOC80NzUzLzE3NjIgMTA3MDYvNDc1MC8xNzYyCitmIDEwODg4LzQ3NTQvMTc2MyAxMDg4OS80NzU1LzE3NjMgMTA2OTcvNDc1Ni8xNzYzCitmIDEwNjk3LzQ3NTcvMTc2MiAxMDY5OC80NzU4LzE3NjIgMTA4OTAvNDc1OS8xNzYyCitmIDEwODkxLzQ3NjAvMTc2NCAxMDg5Mi80NzYxLzE3NjQgMTA4OTMvNDc2Mi8xNzY0CitmIDEwODk0LzQ3NjMvMTc2NSAxMDY5OS80NzY0LzE3NjUgMTA4OTUvNDc2NS8xNzY1CitmIDEwODk2LzQ3NjYvMTc2NiAxMDg5Ny80NzY3LzE3NjYgMTA2NzkvNDc2OC8xNzY2CitmIDEwNjc5LzQ3NjkvMTc2NyAxMDY3OC80NzcwLzE3NjcgMTA4OTgvNDc3MS8xNzY3CitmIDEwODk5LzQ3NzIvMTc2OCAxMDkwMC80NzczLzE3NjggMTA2ODAvNDc3NC8xNzY4CitmIDEwNjgwLzQ3NzUvMTc2OCAxMDkwMS80Nzc2LzE3NjggMTA5MDIvNDc3Ny8xNzY4CitmIDEwOTAzLzQ3NzgvMTc2OCAxMDkwNC80Nzc5LzE3NjggMTA3MzkvNDc4MC8xNzY4CitmIDEwNzM5LzQ3ODEvMTc2OCAxMDcyMC80NzgyLzE3NjggMTA5MDUvNDc4My8xNzY4CitmIDEwOTA2LzQ3ODQvMTc2OCAxMDkwNy80Nzg1LzE3NjggMTA2ODIvNDc4Ni8xNzY4CitmIDEwNjgyLzQ3ODcvMTc2OCAxMDY4MS80Nzg4LzE3NjggMTA5MDgvNDc4OS8xNzY4CitmIDEwOTA5LzQ3OTAvMTc2OSAxMDkxMC80NzkxLzE3NjkgMTA3MDUvNDc5Mi8xNzY5CitmIDEwNzA1LzQ3OTMvMTc3MCAxMDkxMS80Nzk0LzE3NzAgMTA5MTIvNDc5NS8xNzcwCitmIDEwNzIyLzQ3OTYvMTc3MSAxMDkxMy80Nzk3LzE3NzEgMTA5MTQvNDc5OC8xNzcxCitmIDEwOTE1LzQ3OTkvMTc3MiAxMDY5OS80ODAwLzE3NzIgMTA3MjIvNDgwMS8xNzcyCitmIDEwNjY2LzQ3NDEvMTc3MyAxMDkxNi80ODAyLzE3NzMgMTA3MjcvNDgwMy8xNzczCitmIDEwNjY2LzQ4MDQvMTc3MyAxMDkxNy80ODA1LzE3NzMgMTA5MTgvNDgwNi8xNzczCitmIDEwNzA4LzQ4MDcvNjg3IDEwNjc1LzQ2ODAvNjg3IDEwODQ1LzQ2ODMvNjg3CitmIDEwODQ1LzQ2ODMvNjg3IDEwODQ5LzQ4MDgvNjg3IDEwNzA4LzQ4MDcvNjg3CitmIDEwNjg2LzQ3MDIvNjk3IDEwODI3LzQ3MDEvNjk3IDEwODUwLzQ4MDkvNjk3CitmIDEwODUwLzQ4MDkvNjk3IDEwNzEyLzQ4MTAvNjk3IDEwNjg2LzQ3MDIvNjk3CitmIDEwNzAzLzQ3MTkvMTA0NCAxMDcxMS80ODExLzEwNDQgMTA3MTQvNDgxMi8xMDQ0CitmIDEwNzE0LzQ4MTIvMTA0NCAxMDY5MC80NzIwLzEwNDQgMTA3MDMvNDcxOS8xMDQ0CitmIDEwNjkyLzQ2OTIvMTA0NCAxMDcxNS80NzI4LzEwNDQgMTA3MTAvNDczMS8xMDQ0CitmIDEwNzEwLzQ3MzEvMTA0NCAxMDcwMi80NjkzLzEwNDQgMTA2OTIvNDY5Mi8xMDQ0CitmIDEwNzI4LzQ4MTMvMTA0NCAxMDcyNC80NzIzLzEwNDQgMTA2OTAvNDcyMC8xMDQ0CitmIDEwNjkwLzQ3MjAvMTA0NCAxMDcxNC80ODEyLzEwNDQgMTA3MjgvNDgxMy8xMDQ0CitmIDEwNzMxLzQ3MzIvMTA0NCAxMDcyNS80NzE2LzEwNDQgMTA2OTMvNDY2Mi8xMDQ0CitmIDEwNjkzLzQ2NjIvMTA0NCAxMDcxNi80NzM3LzEwNDQgMTA3MzEvNDczMi8xMDQ0CitmIDEwNjkxLzQ3MjUvMTA0NCAxMDcxNy80ODE0LzEwNDQgMTA5MTkvNDgxNS8xMDQ0CitmIDEwOTIwLzQ4MTUvMTA0NCAxMDY2OS80NzI2LzEwNDQgMTA2OTEvNDcyNS8xMDQ0CitmIDEwNjY4LzQ2NjUvMTA0NCAxMDcwNy80NzM0LzEwNDQgMTA3MTYvNDczNy8xMDQ0CitmIDEwNzE2LzQ3MzcvMTA0NCAxMDY5My80NjYyLzEwNDQgMTA2NjgvNDY2NS8xMDQ0CitmIDEwOTIxLzQ4MTYvMTc2MSAxMDY5Ni80ODE3LzE3NjEgMTA3MTkvNDgxOC8xNzYxCitmIDEwNzE5LzQ4MTkvMTc2MSAxMDkyMi80ODIwLzE3NjEgMTA5MjMvNDgyMS8xNzYxCitmIDEwNzA2LzQ3NTAvMTc2MyAxMDcxOC80NzUzLzE3NjMgMTA2OTcvNDgyMi8xNzYzCitmIDEwNjk3LzQ4MjIvMTc2MiAxMDkyNC80ODIzLzE3NjIgMTA3MDYvNDc1MC8xNzYyCitmIDEwOTI1LzQ4MjQvMTc2OCAxMDY4MS80ODI1LzE3NjggMTA3MjEvNDgyNi8xNzY4CitmIDEwNzIxLzQ4MjcvMTc2OCAxMDkyNi80ODI4LzE3NjggMTA5MjcvNDgyOS8xNzY4CitmIDEwOTI4LzQ4MzAvMTc2OCAxMDcyMC80ODMxLzE3NjggMTA2ODAvNDgzMi8xNzY4CitmIDEwNjgwLzQ4MzMvMTc2OCAxMDkyOS80ODM0LzE3NjggMTA5MzAvNDgzNS8xNzY4CitmIDEwNzI5LzQ3MTQvMTE3MiAxMDgzMy80NzE1LzExNzIgMTA4NDcvNDY4Ni8xMTcyCitmIDEwODQ3LzQ2ODYvMTE3MiAxMDY3Ny80Njg1LzExNzIgMTA3MjkvNDcxNC8xMTcyCitmIDEwNjkzLzQ2NjIvMTA0NCAxMDcyNS80NzE2LzEwNDQgMTA3MjMvNDcxNy8xMDQ0CitmIDEwNzIzLzQ3MTcvMTA0NCAxMDY5NC80NjYzLzEwNDQgMTA2OTMvNDY2Mi8xMDQ0CitmIDEwNjcxLzQ3MjQvMTA0NCAxMDcyNi80NzIyLzEwNDQgMTA3MjQvNDcyMy8xMDQ0CitmIDEwNzI0LzQ3MjMvMTA0NCAxMDY5MS80NzI1LzEwNDQgMTA2NzEvNDcyNC8xMDQ0CitmIDEwNzE2LzQ3MzcvMTA0NCAxMDczNy80NzM2LzEwNDQgMTA3NDAvNDczMy8xMDQ0CitmIDEwNzQwLzQ3MzMvMTA0NCAxMDczMS80NzMyLzEwNDQgMTA3MTYvNDczNy8xMDQ0CitmIDEwNzA1LzQ4MzYvMTc3MSAxMDkzMS80ODM3LzE3NzEgMTA5MzIvNDgzOC8xNzcxCitmIDEwOTMzLzQ4MzkvMTc3MSAxMDcyMi80ODAxLzE3NzEgMTA3MDUvNDg0MC8xNzcxCitmIDEwOTM0LzQ3NzEvMTc3MyAxMDY3OC80NzcwLzE3NzMgMTA3MjcvNDgwMy8xNzczCitmIDEwNzI3LzQ4NDEvMTc3MyAxMDkzNS80ODQyLzE3NzMgMTA5MzYvNDg0My8xNzczCitmIDEwNzE3LzQ4MTQvMTA0NCAxMDY5MS80NzI1LzEwNDQgMTA3MjQvNDcyMy8xMDQ0CitmIDEwNzI0LzQ3MjMvMTA0NCAxMDcyOC80ODEzLzEwNDQgMTA3MTcvNDgxNC8xMDQ0CitmIDEwNzE1LzQ3MjgvMTA0NCAxMDY5Mi80NjkyLzEwNDQgMTA3MjUvNDcxNi8xMDQ0CitmIDEwNzI1LzQ3MTYvMTA0NCAxMDczMS80NzMyLzEwNDQgMTA3MTUvNDcyOC8xMDQ0CitmIDEwNzEzLzQ4NDQvNjk3IDEwNzM1LzQ4NDUvNjk3IDEwODM0LzQ4NDYvNjk3CitmIDEwODM0LzQ4NDYvNjk3IDEwODMyLzQ4NDcvNjk3IDEwNzEzLzQ4NDQvNjk3CitmIDEwNzE0LzQ4MTIvMTA0NCAxMDcxMS80ODExLzEwNDQgMTA3MzQvNDczMC8xMDQ0CitmIDEwNzM0LzQ3MzAvMTA0NCAxMDczNi80NzI5LzEwNDQgMTA3MTQvNDgxMi8xMDQ0CitmIDEwNzI4LzQ4MTMvMTA0NCAxMDcxNC80ODEyLzEwNDQgMTA3MzYvNDcyOS8xMDQ0CitmIDEwNzM2LzQ3MjkvMTA0NCAxMDc0MC80NzMzLzEwNDQgMTA3MjgvNDgxMy8xMDQ0CitmIDEwOTM3LzQ4MTUvMTA0NCAxMDcxNy80ODE0LzEwNDQgMTA3MzcvNDczNi8xMDQ0CitmIDEwNzM3LzQ3MzYvMTA0NCAxMDczMi80NzM1LzEwNDQgMTA5MzgvNDgxNS8xMDQ0CitmIDEwOTM5LzQ4NDgvMTc2MSAxMDcxOS80ODQ5LzE3NjEgMTA3MzgvNDg1MC8xNzYxCitmIDEwNzM4LzQ4NTEvMTc2MSAxMDk0MC80ODUyLzE3NjEgMTA5NDEvNDg1My8xNzYxCitmIDEwOTQyLzQ4NTQvMTc2OCAxMDcyMS80ODU1LzE3NjggMTA3MzkvNDg1Ni8xNzY4CitmIDEwNzM5LzQ4NTcvMTc2OCAxMDk0My80ODU4LzE3NjggMTA5NDQvNDg1OS8xNzY4CitmIDEwNzE3LzQ4MTQvMTA0NCAxMDcyOC80ODEzLzEwNDQgMTA3NDAvNDczMy8xMDQ0CitmIDEwNzQwLzQ3MzMvMTA0NCAxMDczNy80NzM2LzEwNDQgMTA3MTcvNDgxNC8xMDQ0CitmIDEwNzQ0LzQ4NjAvMTExMyAxMDc0MS80ODYxLzExMTMgMTA3NDIvNDg2Mi8xMTEzCitmIDEwNzQyLzQ4NjIvMTExMyAxMDc0My80ODYzLzExMTMgMTA3NDQvNDg2MC8xMTEzCitmIDEwNzQ2LzQ4NjQvMTc1NiAxMDc0Ny80ODY1LzE3NTYgMTA4NTMvNDg2Ni8xNzU2CitmIDEwODUzLzQ4NjYvMTc1NiAxMDgzNS80ODY3LzE3NTYgMTA3NDYvNDg2NC8xNzU2CitmIDEwOTQ1LzQ4NjgvNjg3IDEwNzQ5LzQ4NjkvNjg3IDEwODU0LzQ4NzAvNjg3CitmIDEwODU0LzQ4NzEvNjg3IDEwOTQ2LzQ4NzIvNjg3IDEwOTQ3LzQ4NzMvNjg3CitmIDEwNzU0LzQ4NzQvNjg3IDEwNzU1LzQ4NzUvNjg3IDEwODU2LzQ4NzYvNjg3CitmIDEwODU2LzQ4NzYvNjg3IDEwODU1LzQ4NzcvNjg3IDEwNzU0LzQ4NzQvNjg3CitmIDEwOTQ4LzQ4NzgvMTI3MyAxMDc1Ny80ODc5LzEyNzMgMTA4NTcvNDg4MC8xMjczCitmIDEwODU3LzQ4ODEvMTI3MyAxMDk0OS80ODgyLzEyNzMgMTA5NTAvNDg4My8xMjczCitmIDEwNzYyLzQ4ODQvMTA0NCAxMDc1OS80ODg1LzEwNDQgMTA3NjAvNDg4Ni8xMDQ0CitmIDEwNzYwLzQ4ODYvMTA0NCAxMDc2MS80ODg3LzEwNDQgMTA3NjIvNDg4NC8xMDQ0CitmIDEwNzY2LzQ4ODgvMTc3NCAxMDg1OC80ODg5LzE3NzQgMTA4MzcvNDg5MC8xNzc0CitmIDEwODM3LzQ4OTAvMTc3NSAxMDc2NS80ODkxLzE3NzUgMTA3NjYvNDg4OC8xNzc1CitmIDEwOTUxLzQ4OTIvNjk3IDEwOTUyLzQ4OTMvNjk3IDEwODM4LzQ4OTQvNjk3CitmIDEwODM4LzQ4OTUvNjk3IDEwNzY4LzQ4OTYvNjk3IDEwOTUzLzQ4OTcvNjk3CitmIDEwNzc0LzQ4OTgvNjk3IDEwODQwLzQ4OTkvNjk3IDEwODM5LzQ5MDAvNjk3CitmIDEwODM5LzQ5MDAvNjk3IDEwNzczLzQ5MDEvNjk3IDEwNzc0LzQ4OTgvNjk3CitmIDEwOTU0LzQ5MDIvMTY1OSAxMDk1NS80OTAzLzE2NTkgMTA4NDEvNDkwNC8xNjU5CitmIDEwODQxLzQ5MDUvMTY2MyAxMDc3Ni80OTA2LzE2NjMgMTA5NTYvNDkwNy8xNjYzCitmIDEwODIyLzQ5MDgvMTE3MiAxMDg2NS80OTA5LzExNzIgMTA4NTcvNDg4MC8xMTcyCitmIDEwODU3LzQ4ODAvMTE3MiAxMDc1Ny80ODc5LzExNzIgMTA4MjIvNDkwOC8xMTcyCitmIDEwODE3LzQ5MTAvMTA0NCAxMDgyMS80OTExLzEwNDQgMTA3NjAvNDg4Ni8xMDQ0CitmIDEwNzYwLzQ4ODYvMTA0NCAxMDc1OS80ODg1LzEwNDQgMTA4MTcvNDkxMC8xMDQ0CitmIDEwNzgwLzQ5MTIvMTA0NCAxMDc3Ny80OTEzLzEwNDQgMTA3NzgvNDkxNC8xMDQ0CitmIDEwNzc4LzQ5MTQvMTA0NCAxMDc3OS80OTE1LzEwNDQgMTA3ODAvNDkxMi8xMDQ0CitmIDEwODE0LzQ5MTYvMTA0NCAxMDgxNS80OTE3LzEwNDQgMTA3NzkvNDkxNS8xMDQ0CitmIDEwNzc5LzQ5MTUvMTA0NCAxMDc3OC80OTE0LzEwNDQgMTA4MTQvNDkxNi8xMDQ0CitmIDEwNzg0LzQ5MTgvMTA0NCAxMDc4MS80OTE5LzEwNDQgMTA3ODIvNDkyMC8xMDQ0CitmIDEwNzgyLzQ5MjAvMTA0NCAxMDc4My80OTIxLzEwNDQgMTA3ODQvNDkxOC8xMDQ0CitmIDEwOTU3LzQ5MjIvMTc1OSAxMDk1OC80OTIzLzE3NTkgMTA3NDUvNDkyNC8xNzU5CitmIDEwNzQ1LzQ5MjUvMTc2MCAxMDc0OC80OTI2LzE3NjAgMTA5NTkvNDkyNy8xNzYwCitmIDEwOTYwLzQ5MjgvMTc2MiAxMDk2MS80OTI5LzE3NjIgMTA5NjIvNDkzMC8xNzYyCitmIDEwOTYzLzQ5MzEvMTc2MiAxMDc1MC80OTMyLzE3NjIgMTA5NjQvNDkzMy8xNzYyCitmIDEwOTY1LzQ5MzQvMTc2MSAxMDk2Ni80OTM1LzE3NjEgMTA3NTMvNDkzNi8xNzYxCitmIDEwNzUzLzQ5MzcvMTc2MSAxMDc1Ni80OTM4LzE3NjEgMTA5NjcvNDkzOS8xNzYxCitmIDEwOTY4LzQ5NDAvMTc2NCAxMDk2OS80OTQxLzE3NjQgMTA5NzAvNDk0Mi8xNzY0CitmIDEwOTcxLzQ5NDMvMTc3NiAxMDc1OC80OTQ0LzE3NzYgMTA5NzIvNDk0NS8xNzc2CitmIDEwOTczLzQ5NDYvMTc3NyAxMDk3NC80OTQ3LzE3NzcgMTA3NjQvNDk0OC8xNzc3CitmIDEwNzY0LzQ5NDkvMTc3OCAxMDc2My80OTUwLzE3NzggMTA5NzUvNDk1MS8xNzc4CitmIDEwOTc2LzQ5NTIvMTc3OSAxMDk3Ny80OTUzLzE3NzkgMTA3NjcvNDk1NC8xNzc5CitmIDEwNzY3LzQ5NTUvMTc3OSAxMDk3OC80OTU2LzE3NzkgMTA5NzkvNDk1Ny8xNzc5CitmIDEwOTgwLzQ5NTgvMTc3OSAxMDk4MS80OTU5LzE3NzkgMTA3NzIvNDk2MC8xNzc5CitmIDEwNzcyLzQ5NjEvMTc3OSAxMDc3MS80OTYyLzE3NzkgMTA5ODIvNDk2My8xNzc5CitmIDEwOTgzLzQ5NjQvMTc3MSAxMDk4NC80OTY1LzE3NzEgMTA3NzUvNDk2Ni8xNzcxCitmIDEwNzc1LzQ5NjcvMTc3MCAxMDk4NS80OTY4LzE3NzAgMTA5ODYvNDk2OS8xNzcwCitmIDEwODE2LzQ5NzAvMTc3MSAxMDk4Ny80OTcxLzE3NzEgMTA5ODgvNDk3Mi8xNzcxCitmIDEwOTg5LzQ5NzMvMTc3MSAxMDc1OC80OTc0LzE3NzEgMTA4MTYvNDk3NS8xNzcxCitmIDEwOTkwLzQ5NzYvMTc3MyAxMDk5MS80OTc3LzE3NzMgMTA4MTgvNDk3OC8xNzczCitmIDEwODE4LzQ5NzkvMTc4MCAxMDc0NS80OTI1LzE3ODAgMTA5OTIvNDk4MC8xNzgwCitmIDEwNzU0LzQ4NzQvNjg3IDEwODU1LzQ4NzcvNjg3IDEwODYwLzQ5ODEvNjg3CitmIDEwODYwLzQ5ODEvNjg3IDEwNzkxLzQ5ODIvNjg3IDEwNzU0LzQ4NzQvNjg3CitmIDEwNzY4LzQ4OTYvNjk3IDEwODM4LzQ4OTUvNjk3IDEwODU5LzQ5ODMvNjk3CitmIDEwODU5LzQ5ODMvNjk3IDEwNzY5LzQ5ODQvNjk3IDEwNzY4LzQ4OTYvNjk3CitmIDEwNzc3LzQ5MTMvMTA0NCAxMDc5NC80OTg1LzEwNDQgMTA3OTUvNDk4Ni8xMDQ0CitmIDEwNzk1LzQ5ODYvMTA0NCAxMDc3OC80OTE0LzEwNDQgMTA3NzcvNDkxMy8xMDQ0CitmIDEwNzYwLzQ4ODYvMTA0NCAxMDc4Ni80OTg3LzEwNDQgMTA3ODUvNDk4OC8xMDQ0CitmIDEwNzg1LzQ5ODgvMTA0NCAxMDc2MS80ODg3LzEwNDQgMTA3NjAvNDg4Ni8xMDQ0CitmIDEwODE5LzQ5ODkvMTA0NCAxMDgxNC80OTE2LzEwNDQgMTA3NzgvNDkxNC8xMDQ0CitmIDEwNzc4LzQ5MTQvMTA0NCAxMDc5NS80OTg2LzEwNDQgMTA4MTkvNDk4OS8xMDQ0CitmIDEwODIwLzQ5OTAvMTA0NCAxMDgyMS80OTExLzEwNDQgMTA3NDQvNDg2MC8xMDQ0CitmIDEwNzQ0LzQ4NjAvMTA0NCAxMDc4Ny80OTkxLzEwNDQgMTA4MjAvNDk5MC8xMDQ0CitmIDEwNzgxLzQ5MTkvMTA0NCAxMDc5Ni80OTkyLzEwNDQgMTA3OTAvNDk5My8xMDQ0CitmIDEwNzkwLzQ5OTMvMTA0NCAxMDc4Mi80OTIwLzEwNDQgMTA3ODEvNDkxOS8xMDQ0CitmIDEwNzQzLzQ4NjMvMTExMyAxMDc4OC80OTk0LzExMTMgMTA3ODcvNDk5MS8xMTEzCitmIDEwNzg3LzQ5OTEvMTExMyAxMDc0NC80ODYwLzExMTMgMTA3NDMvNDg2My8xMTEzCitmIDEwOTkzLzQ5OTUvMTc2MiAxMDc1MC80OTk2LzE3NjIgMTA3NTEvNDk5Ny8xNzYyCitmIDEwNzUxLzQ5OTgvMTc2MiAxMDk5NC80OTk5LzE3NjIgMTA5OTUvNTAwMC8xNzYyCitmIDEwOTk2LzUwMDEvMTc2MSAxMDc4OS81MDAyLzE3NjEgMTA3NTMvNTAwMy8xNzYxCitmIDEwNzUzLzUwMDQvMTc2MSAxMDk5Ny81MDA1LzE3NjEgMTA5OTgvNTAwNi8xNzYxCitmIDEwOTk5LzUwMDcvMTc3OSAxMDc3MS81MDA4LzE3NzkgMTA3OTMvNTAwOS8xNzc5CitmIDEwNzkzLzUwMTAvMTc3OSAxMTAwMC81MDExLzE3NzkgMTEwMDEvNTAxMi8xNzc5CitmIDExMDAyLzUwMTMvMTc3OSAxMDc3MC81MDE0LzE3NzkgMTA3NjcvNTAxNS8xNzc5CitmIDEwNzY3LzUwMTYvMTc3OSAxMTAwMy81MDE3LzE3NzkgMTEwMDQvNTAxOC8xNzc5CitmIDEwODUwLzQ4MDkvNjk3IDEwODM0LzQ4NDYvNjk3IDEwNzM1LzQ4NDUvNjk3CitmIDEwNzM1LzQ4NDUvNjk3IDEwNzEyLzQ4MTAvNjk3IDEwODUwLzQ4MDkvNjk3CitmIDEwODQ4LzQ2OTUvMjIxIDEwNjg0LzQ2OTQvMjIxIDEwNzMwLzUwMTkvMjIxCitmIDEwNzMwLzUwMTkvMjIxIDEwODUxLzUwMjAvMjIxIDEwODQ4LzQ2OTUvMjIxCitmIDEwODQ0LzQ2NzIvNjg3IDEwNjc0LzQ2NzEvNjg3IDEwNzA5LzQ2NzYvNjg3CitmIDEwNzA5LzQ2NzYvNjg3IDEwODMxLzQ2NzkvNjg3IDEwODQ0LzQ2NzIvNjg3CitmIDEwODMyLzQ4NDcvNjk3IDEwODI4LzQ3MDUvNjk3IDEwNjg3LzQ3MDQvNjk3CitmIDEwNjg3LzQ3MDQvNjk3IDEwNzEzLzQ4NDQvNjk3IDEwODMyLzQ4NDcvNjk3CitmIDEwODUxLzUwMjAvMjIxIDEwNzMwLzUwMTkvMjIxIDEwNjcyLzQ2NjYvMjIxCitmIDEwNjcyLzQ2NjYvMjIxIDEwODI1LzQ2NjkvMjIxIDEwODUxLzUwMjAvMjIxCitmIDEwODUyLzQ2NzgvNjg3IDEwNzMzLzQ2NzcvNjg3IDEwNzA4LzQ4MDcvNjg3CitmIDEwNzA4LzQ4MDcvNjg3IDEwODQ5LzQ4MDgvNjg3IDEwODUyLzQ2NzgvNjg3CitmIDEwODEzLzUwMjEvMjIxIDEwODY2LzUwMjIvMjIxIDEwODU4LzQ4ODkvMjIxCitmIDEwODU4LzQ4ODkvMjIxIDEwNzY2LzQ4ODgvMjIxIDEwODEzLzUwMjEvMjIxCitmIDEwODU0LzQ4NzAvNjg3IDEwNzQ5LzQ4NjkvNjg3IDEwNzUyLzUwMjMvNjg3CitmIDEwNzUyLzUwMjMvNjg3IDEwODM2LzUwMjQvNjg3IDEwODU0LzQ4NzAvNjg3CitmIDEwODQyLzUwMjUvNjk3IDEwODQwLzQ4OTkvNjk3IDEwNzc0LzQ4OTgvNjk3CitmIDEwNzc0LzQ4OTgvNjk3IDEwNzkyLzUwMjYvNjk3IDEwODQyLzUwMjUvNjk3CitmIDEwODA1LzUwMjcvNjg3IDEwODYxLzUwMjgvNjg3IDEwODYzLzUwMjkvNjg3CitmIDEwODYzLzUwMjkvNjg3IDEwNzk3LzUwMzAvNjg3IDEwODA1LzUwMjcvNjg3CitmIDEwODA3LzUwMzEvMTA0NCAxMDgwMy81MDMyLzEwNDQgMTA4MTEvNTAzMy8xMDQ0CitmIDEwODExLzUwMzMvMTA0NCAxMDc5OS81MDM0LzEwNDQgMTA4MDcvNTAzMS8xMDQ0CitmIDEwODI0LzUwMzUvMTA0NCAxMDgyMy81MDM2LzEwNDQgMTA4MTIvNTAzNy8xMDQ0CitmIDEwODEyLzUwMzcvMTA0NCAxMDgwNC81MDM4LzEwNDQgMTA4MjQvNTAzNS8xMDQ0CitmIDEwODA4LzUwMzkvMTA0NCAxMDgwNC81MDM4LzEwNDQgMTA4MTIvNTAzNy8xMDQ0CitmIDEwODEyLzUwMzcvMTA0NCAxMDgwMC81MDQwLzEwNDQgMTA4MDgvNTAzOS8xMDQ0CitmIDExMDA1LzUwNDEvMTc2MiAxMDc5OC81MDQyLzE3NjIgMTA4MDYvNTA0My8xNzYyCitmIDEwODA2LzUwNDQvMTc2MSAxMTAwNi81MDQ1LzE3NjEgMTEwMDcvNTA0Ni8xNzYxCitmIDExMDA4LzUwNDcvMTc3OSAxMDgwMS81MDQ4LzE3NzkgMTA4MDkvNTA0OS8xNzc5CitmIDEwODA5LzUwNTAvMTc3OSAxMTAwOS81MDUxLzE3NzkgMTEwMTAvNTA1Mi8xNzc5CitmIDEwODEwLzUwNTMvNjk3IDEwODYyLzUwNTQvNjk3IDEwODY0LzUwNTUvNjk3CitmIDEwODY0LzUwNTUvNjk3IDEwODAyLzUwNTYvNjk3IDEwODEwLzUwNTMvNjk3CitmIDEwODYzLzUwMjkvNjg3IDEwODYxLzUwMjgvNjg3IDEwODA2LzUwNTcvNjg3CitmIDEwODA2LzUwNTcvNjg3IDEwNzk4LzUwNTgvNjg3IDEwODYzLzUwMjkvNjg3CitmIDEwODY0LzUwNTUvNjk3IDEwODYyLzUwNTQvNjk3IDEwODA5LzUwNTkvNjk3CitmIDEwODA5LzUwNTkvNjk3IDEwODAxLzUwNjAvNjk3IDEwODY0LzUwNTUvNjk3CitmIDEwODYzLzUwMjkvNjg3IDEwODM2LzUwMjQvNjg3IDEwNzUyLzUwMjMvNjg3CitmIDEwNzUyLzUwMjMvNjg3IDEwNzk3LzUwMzAvNjg3IDEwODYzLzUwMjkvNjg3CitmIDEwNzg1LzQ5ODgvMTA0NCAxMDc4Ni80OTg3LzEwNDQgMTA3OTkvNTAzNC8xMDQ0CitmIDEwNzk5LzUwMzQvMTA0NCAxMDgxMS81MDMzLzEwNDQgMTA3ODUvNDk4OC8xMDQ0CitmIDEwNzg2LzQ5ODcvMTA0NCAxMDgyMC80OTkwLzEwNDQgMTA4MjMvNTAzNi8xMDQ0CitmIDEwODIzLzUwMzYvMTA0NCAxMDc5OS81MDM0LzEwNDQgMTA3ODYvNDk4Ny8xMDQ0CitmIDEwNzg3LzQ5OTEvMTExMyAxMDc4OC80OTk0LzExMTMgMTA4MDAvNTA0MC8xMTEzCitmIDEwODAwLzUwNDAvMTA0NCAxMDgxMi81MDM3LzEwNDQgMTA3ODcvNDk5MS8xMDQ0CitmIDEwNzg5LzUwNjEvMTc2MSAxMTAxMS81MDYyLzE3NjEgMTEwMTIvNTA2My8xNzYxCitmIDExMDEzLzUwNjQvMTc2MSAxMDgwNi81MDY1LzE3NjEgMTA3ODkvNTA2Ni8xNzYxCitmIDEwNzcwLzUwNjcvMTc3OSAxMTAxNC81MDY4LzE3NzkgMTEwMTUvNTA2OS8xNzc5CitmIDExMDE2LzUwNzAvMTc3OSAxMDgwOS81MDcxLzE3NzkgMTA3NzAvNTA3Mi8xNzc5CitmIDEwODEwLzUwNTMvNjk3IDEwNzY5LzQ5ODQvNjk3IDEwODU5LzQ5ODMvNjk3CitmIDEwODU5LzQ5ODMvNjk3IDEwODYyLzUwNTQvNjk3IDEwODEwLzUwNTMvNjk3CitmIDEwNzkxLzQ5ODIvNjg3IDEwODYwLzQ5ODEvNjg3IDEwODYxLzUwMjgvNjg3CitmIDEwODYxLzUwMjgvNjg3IDEwODA1LzUwMjcvNjg3IDEwNzkxLzQ5ODIvNjg3CitmIDEwNzk1LzQ5ODYvMTA0NCAxMDc5NC80OTg1LzEwNDQgMTA4MDMvNTAzMi8xMDQ0CitmIDEwODAzLzUwMzIvMTA0NCAxMDgwNy81MDMxLzEwNDQgMTA3OTUvNDk4Ni8xMDQ0CitmIDEwNzk2LzQ5OTIvMTA0NCAxMDgxOS80OTg5LzEwNDQgMTA4MjQvNTAzNS8xMDQ0CitmIDEwODI0LzUwMzUvMTA0NCAxMDgwNC81MDM4LzEwNDQgMTA3OTYvNDk5Mi8xMDQ0CitmIDEwNzkwLzQ5OTMvMTA0NCAxMDc5Ni80OTkyLzEwNDQgMTA4MDQvNTAzOC8xMDQ0CitmIDEwODA0LzUwMzgvMTA0NCAxMDgwOC81MDM5LzEwNDQgMTA3OTAvNDk5My8xMDQ0CitmIDExMDE3LzUwNzMvMTc2MiAxMDc1MS81MDc0LzE3NjIgMTA3OTgvNTA3NS8xNzYyCitmIDEwNzk4LzUwNzYvMTc2MiAxMTAxOC81MDc3LzE3NjIgMTEwMTkvNTA3OC8xNzYyCitmIDExMDIwLzUwNzkvMTc3OSAxMDc5My81MDgwLzE3NzkgMTA4MDEvNTA4MS8xNzc5CitmIDEwODAxLzUwODIvMTc3OSAxMTAyMS81MDgzLzE3NzkgMTEwMjIvNTA4NC8xNzc5CitmIDEwODQyLzUwMjUvNjk3IDEwNzkyLzUwMjYvNjk3IDEwODAyLzUwNTYvNjk3CitmIDEwODAyLzUwNTYvNjk3IDEwODY0LzUwNTUvNjk3IDEwODQyLzUwMjUvNjk3CitmIDEwNzUxLzUwODUvNjg3IDEwODM2LzUwMjQvNjg3IDEwODYzLzUwMjkvNjg3CitmIDEwODYzLzUwMjkvNjg3IDEwNzk4LzUwNTgvNjg3IDEwNzUxLzUwODUvNjg3CitmIDEwNzkzLzUwODYvNjk3IDEwODQyLzUwMjUvNjk3IDEwODY0LzUwNTUvNjk3CitmIDEwODY0LzUwNTUvNjk3IDEwODAxLzUwNjAvNjk3IDEwNzkzLzUwODYvNjk3CitmIDEwNzc2LzQ5MDYvMTE3MiAxMDg0MS80OTA1LzExNzIgMTA4NjUvNDkwOS8xMTcyCitmIDEwODY1LzQ5MDkvMTE3MiAxMDgyMi80OTA4LzExNzIgMTA3NzYvNDkwNi8xMTcyCitmIDEwNzQxLzQ4NjEvMTA0NCAxMDc0NC80ODYwLzEwNDQgMTA4MjEvNDkxMS8xMDQ0CitmIDEwODIxLzQ5MTEvMTA0NCAxMDgxNy80OTEwLzEwNDQgMTA3NDEvNDg2MS8xMDQ0CitmIDEwNzgxLzQ5MTkvMTA0NCAxMDc4NC80OTE4LzEwNDQgMTA4MTUvNDkxNy8xMDQ0CitmIDEwODE1LzQ5MTcvMTA0NCAxMDgxNC80OTE2LzEwNDQgMTA3ODEvNDkxOS8xMDQ0CitmIDEwODE2LzQ5NzUvMTc3MSAxMDc3NS81MDg3LzE3NzEgMTEwMjMvNTA4OC8xNzcxCitmIDExMDI0LzUwODkvMTc3MSAxMTAyNS81MDkwLzE3NzEgMTA4MTYvNTA5MS8xNzcxCitmIDExMDI2LzQ5NTEvMTc3MyAxMDc2My80OTUwLzE3NzMgMTA4MTgvNDk3OS8xNzczCitmIDEwODE4LzUwOTIvMTc3MyAxMTAyNy81MDkzLzE3NzMgMTEwMjgvNTA5NC8xNzczCitmIDEwNzk2LzQ5OTIvMTA0NCAxMDc4MS80OTE5LzEwNDQgMTA4MTQvNDkxNi8xMDQ0CitmIDEwODE0LzQ5MTYvMTA0NCAxMDgxOS80OTg5LzEwNDQgMTA3OTYvNDk5Mi8xMDQ0CitmIDEwNzg2LzQ5ODcvMTA0NCAxMDc2MC80ODg2LzEwNDQgMTA4MjEvNDkxMS8xMDQ0CitmIDEwODIxLzQ5MTEvMTA0NCAxMDgyMC80OTkwLzEwNDQgMTA3ODYvNDk4Ny8xMDQ0CitmIDEwNzQ2LzQ4NjQvMjIxIDEwODM1LzQ4NjcvMjIxIDEwODY2LzUwMjIvMjIxCitmIDEwODY2LzUwMjIvMjIxIDEwODEzLzUwMjEvMjIxIDEwNzQ2LzQ4NjQvMjIxCitmIDEwODU3LzQ4ODAvMTE3MiAxMDg2NS80OTA5LzExNzIgMTA4MTYvNDk3NS8xMTcyCitmIDEwODE2LzQ5NzUvMTE3MiAxMDc1OC80OTc0LzExNzIgMTA4NTcvNDg4MC8xMTcyCitmIDEwODU4LzQ4ODkvMjIxIDEwODY2LzUwMjIvMjIxIDEwODE4LzQ5NzkvMjIxCitmIDEwODE4LzQ5NzkvMjIxIDEwNzYzLzQ5NTAvMjIxIDEwODU4LzQ4ODkvMjIxCitmIDEwODA3LzUwMzEvMTA0NCAxMDc5OS81MDM0LzEwNDQgMTA4MjMvNTAzNi8xMDQ0CitmIDEwODIzLzUwMzYvMTA0NCAxMDgyNC81MDM1LzEwNDQgMTA4MDcvNTAzMS8xMDQ0CitmIDEwNzg3LzQ5OTEvMTA0NCAxMDgxMi81MDM3LzEwNDQgMTA4MjMvNTAzNi8xMDQ0CitmIDEwODIzLzUwMzYvMTA0NCAxMDgyMC80OTkwLzEwNDQgMTA3ODcvNDk5MS8xMDQ0CitmIDEwNzk1LzQ5ODYvMTA0NCAxMDgwNy81MDMxLzEwNDQgMTA4MjQvNTAzNS8xMDQ0CitmIDEwODI0LzUwMzUvMTA0NCAxMDgxOS80OTg5LzEwNDQgMTA3OTUvNDk4Ni8xMDQ0CitmIDEwNjY2LzQ3NDEvMTc1NiAxMDgyNS80NjY5LzE3NTYgMTA4NDMvNDY2OC8xNzU2CitmIDEwNjY2LzQ3NDEvMTc4MSAxMDg0My80NjY4LzE3ODEgMTA2OTUvNDc0Mi8xNzgxCitmIDExMDI5LzUwOTUvNjg3IDExMDMwLzUwOTYvNjg3IDEwODQ0LzUwOTcvNjg3CitmIDEwODQ0LzQ2NzIvNjg3IDEwNjk2LzUwOTgvNjg3IDExMDMxLzUwOTkvNjg3CitmIDEwNzM4LzUxMDAvNjg3IDEwNzE5LzUxMDEvNjg3IDEwODMxLzQ2NzkvNjg3CitmIDEwODMxLzQ2NzkvNjg3IDEwODUyLzQ2NzgvNjg3IDEwNzM4LzUxMDAvNjg3CitmIDEwNjk3LzUxMDIvNjg3IDEwODQ1LzQ2ODMvNjg3IDEwODQ2LzQ2ODIvNjg3CitmIDEwODQ2LzQ2ODIvNjg3IDEwNjk4LzUxMDMvNjg3IDEwNjk3LzUxMDIvNjg3CitmIDExMDMyLzUxMDQvMTc1NyAxMTAzMy81MTA1LzE3NTcgMTA4NDcvNTEwNi8xNzU3CitmIDEwODQ3LzQ2ODYvMTc1NyAxMDY5OS80ODAwLzE3NTcgMTEwMzQvNTEwNy8xNzU3CitmIDEwNjc5LzQ3NjkvMTc1OCAxMDgyNi80Njk2LzE3NTggMTA4NDgvNDY5NS8xNzU4CitmIDEwODQ4LzQ2OTUvMTc1OCAxMDY3OC80NzcwLzE3NTggMTA2NzkvNDc2OS8xNzU4CitmIDEwNjgwLzUxMDgvNjk3IDEwODI3LzQ3MDEvNjk3IDExMDM1LzUxMDkvNjk3CitmIDExMDM2LzUxMTAvNjk3IDExMDM3LzUxMTEvNjk3IDEwNjgwLzUxMTIvNjk3CitmIDEwNjgyLzUxMTMvNjk3IDEwODI5LzQ3MDYvNjk3IDEwODI4LzQ3MDUvNjk3CitmIDEwODI4LzQ3MDUvNjk3IDEwNjgxLzUxMTQvNjk3IDEwNjgyLzUxMTMvNjk3CitmIDEwNzA1LzQ4NDAvMTY1OSAxMDgzMC80NzExLzE2NTkgMTEwMzgvNTExNS8xNjU5CitmIDExMDM5LzUxMTYvMTY1OSAxMTA0MC81MTE3LzE2NTkgMTA3MDUvNTExOC8xNjU5CitmIDEwNzIyLzQ4MDEvMTE3MiAxMDgzMy80NzE1LzExNzIgMTA4MzAvNDcxMS8xMTcyCitmIDEwODMwLzQ3MTEvMTE3MiAxMDcwNS80ODQwLzExNzIgMTA3MjIvNDgwMS8xMTcyCitmIDEwNzE4LzUxMTkvNjg3IDEwODQ5LzQ4MDgvNjg3IDEwODQ1LzQ2ODMvNjg3CitmIDEwODQ1LzQ2ODMvNjg3IDEwNjk3LzUxMDIvNjg3IDEwNzE4LzUxMTkvNjg3CitmIDEwNzIwLzUxMjAvNjk3IDEwODUwLzQ4MDkvNjk3IDEwODI3LzQ3MDEvNjk3CitmIDEwODI3LzQ3MDEvNjk3IDEwNjgwLzUxMDgvNjk3IDEwNzIwLzUxMjAvNjk3CitmIDEwNjk5LzQ4MDAvMTE3MiAxMDg0Ny80Njg2LzExNzIgMTA4MzMvNDcxNS8xMTcyCitmIDEwODMzLzQ3MTUvMTE3MiAxMDcyMi80ODAxLzExNzIgMTA2OTkvNDgwMC8xMTcyCitmIDEwNzM5LzUxMjEvNjk3IDEwNzIxLzUxMjIvNjk3IDEwODMyLzQ4NDcvNjk3CitmIDEwODMyLzQ4NDcvNjk3IDEwODM0LzQ4NDYvNjk3IDEwNzM5LzUxMjEvNjk3CitmIDEwNzQ1LzQ5MjUvMTc1NiAxMDgzNS80ODY3LzE3NTYgMTA4NTMvNDg2Ni8xNzU2CitmIDEwODUzLzQ4NjYvMTc1NiAxMDc0OC80OTI2LzE3NTYgMTA3NDUvNDkyNS8xNzU2CitmIDExMDQxLzUxMjMvNjg3IDExMDQyLzUxMjQvNjg3IDEwODU0LzUxMjUvNjg3CitmIDEwODU0LzQ4NzAvNjg3IDEwNzUwLzUxMjYvNjg3IDExMDQzLzUxMjcvNjg3CitmIDEwNzUzLzUxMjgvNjg3IDEwODU1LzQ4NzcvNjg3IDEwODU2LzQ4NzYvNjg3CitmIDEwODU2LzQ4NzYvNjg3IDEwNzU2LzUxMjkvNjg3IDEwNzUzLzUxMjgvNjg3CitmIDExMDQ0LzUxMzAvMTI3MyAxMTA0NS81MTMxLzEyNzMgMTA4NTcvNTEzMi8xMjczCitmIDEwODU3LzQ4ODAvMTI3MyAxMDc1OC80OTc0LzEyNzMgMTEwNDYvNTEzMy8xMjczCitmIDEwNzY0LzQ5NDkvMTc3NCAxMDgzNy80ODkwLzE3NzQgMTA4NTgvNDg4OS8xNzc0CitmIDEwODU4LzQ4ODkvMTc3NCAxMDc2My80OTUwLzE3NzQgMTA3NjQvNDk0OS8xNzc0CitmIDEwNzY3LzUxMzQvNjk3IDEwODM4LzQ4OTUvNjk3IDExMDQ3LzUxMzUvNjk3CitmIDExMDQ4LzUxMzYvNjk3IDExMDQ5LzUxMzcvNjk3IDEwNzY3LzUxMzgvNjk3CitmIDEwNzcyLzUxMzkvNjk3IDEwODM5LzQ5MDAvNjk3IDEwODQwLzQ4OTkvNjk3CitmIDEwODQwLzQ4OTkvNjk3IDEwNzcxLzUxNDAvNjk3IDEwNzcyLzUxMzkvNjk3CitmIDEwNzc1LzUwODcvMTY1OSAxMDg0MS80OTA1LzE2NTkgMTEwNTAvNTE0MS8xNjU5CitmIDExMDUxLzUxNDIvMTY1OSAxMTA1Mi81MTQzLzE2NTkgMTA3NzUvNTE0NC8xNjU5CitmIDEwODE2LzQ5NzUvMTE3MiAxMDg2NS80OTA5LzExNzIgMTA4NDEvNDkwNS8xMTcyCitmIDEwODQxLzQ5MDUvMTE3MiAxMDc3NS81MDg3LzExNzIgMTA4MTYvNDk3NS8xMTcyCitmIDEwNzg5LzUxNDUvNjg3IDEwODYwLzQ5ODEvNjg3IDEwODU1LzQ4NzcvNjg3CitmIDEwODU1LzQ4NzcvNjg3IDEwNzUzLzUxMjgvNjg3IDEwNzg5LzUxNDUvNjg3CitmIDEwNzcwLzUxNDYvNjk3IDEwODU5LzQ5ODMvNjk3IDEwODM4LzQ4OTUvNjk3CitmIDEwODM4LzQ4OTUvNjk3IDEwNzY3LzUxMzQvNjk3IDEwNzcwLzUxNDYvNjk3CitmIDEwNzIwLzUxMjAvNjk3IDEwNzM5LzUxMjEvNjk3IDEwODM0LzQ4NDYvNjk3CitmIDEwODM0LzQ4NDYvNjk3IDEwODUwLzQ4MDkvNjk3IDEwNzIwLzUxMjAvNjk3CitmIDEwNjc4LzQ3NzAvMjIxIDEwODQ4LzQ2OTUvMjIxIDEwODUxLzUwMjAvMjIxCitmIDEwODUxLzUwMjAvMjIxIDEwNzI3LzQ4MDMvMjIxIDEwNjc4LzQ3NzAvMjIxCitmIDEwNjk2LzUwOTgvNjg3IDEwODQ0LzQ2NzIvNjg3IDEwODMxLzQ2NzkvNjg3CitmIDEwODMxLzQ2NzkvNjg3IDEwNzE5LzUxMDEvNjg3IDEwNjk2LzUwOTgvNjg3CitmIDEwNjgxLzUxMTQvNjk3IDEwODI4LzQ3MDUvNjk3IDEwODMyLzQ4NDcvNjk3CitmIDEwODMyLzQ4NDcvNjk3IDEwNzIxLzUxMjIvNjk3IDEwNjgxLzUxMTQvNjk3CitmIDEwNzI3LzQ4MDMvMjIxIDEwODUxLzUwMjAvMjIxIDEwODI1LzQ2NjkvMjIxCitmIDEwODI1LzQ2NjkvMjIxIDEwNjY2LzQ3NDEvMjIxIDEwNzI3LzQ4MDMvMjIxCitmIDEwNzE4LzUxMTkvNjg3IDEwNzM4LzUxMDAvNjg3IDEwODUyLzQ2NzgvNjg3CitmIDEwODUyLzQ2NzgvNjg3IDEwODQ5LzQ4MDgvNjg3IDEwNzE4LzUxMTkvNjg3CitmIDEwODE4LzQ5NzkvMjIxIDEwODY2LzUwMjIvMjIxIDEwODM1LzQ4NjcvMjIxCitmIDEwODM1LzQ4NjcvMjIxIDEwNzQ1LzQ5MjUvMjIxIDEwODE4LzQ5NzkvMjIxCitmIDEwNzUwLzUxMjYvNjg3IDEwODU0LzQ4NzAvNjg3IDEwODM2LzUwMjQvNjg3CitmIDEwODM2LzUwMjQvNjg3IDEwNzUxLzUwODUvNjg3IDEwNzUwLzUxMjYvNjg3CitmIDEwNzcxLzUxNDAvNjk3IDEwODQwLzQ4OTkvNjk3IDEwODQyLzUwMjUvNjk3CitmIDEwODQyLzUwMjUvNjk3IDEwNzkzLzUwODYvNjk3IDEwNzcxLzUxNDAvNjk3CitmIDEwNzg5LzUxNDUvNjg3IDEwODA2LzUwNTcvNjg3IDEwODYxLzUwMjgvNjg3CitmIDEwODYxLzUwMjgvNjg3IDEwODYwLzQ5ODEvNjg3IDEwNzg5LzUxNDUvNjg3CitmIDEwNzcwLzUxNDYvNjk3IDEwODA5LzUwNTkvNjk3IDEwODYyLzUwNTQvNjk3CitmIDEwODYyLzUwNTQvNjk3IDEwODU5LzQ5ODMvNjk3IDEwNzcwLzUxNDYvNjk3CitmIDM3MjkvNTE0Ny8xMDQ0IDM3MDUvNTE0OC8xMDQ0IDM3MDQvNTE0OS8xMDQ0CitmIDM3MDQvNTE0OS8xMDQ0IDM3MjgvNTE1MC8xMDQ0IDM3MjkvNTE0Ny8xMDQ0CitmIDM3MjEvNTE1MS8xNzgyIDM3OTEvNTE1Mi8xNzgyIDM3OTIvNTE1My8xNzgyCitmIDM3OTIvNTE1My8xNzgyIDM3MjAvNTE1NC8xNzgyIDM3MjEvNTE1MS8xNzgyCitmIDM4MDgvNTE1NS8xNzgzIDM4MDcvNTE1Ni8xNzgzIDM4MzEvNTE1Ny8xNzgzCitmIDM4MzEvNTE1Ny8xNzgzIDM4MzIvNTE1OC8xNzgzIDM4MDgvNTE1NS8xNzgzCitmIDM5MjMvNTE1OS8xMDQ0IDM5NDEvNTE2MC8xMDQ0IDM5NDUvNTE2MS8xMDQ0CitmIDM5NDUvNTE2MS8xMDQ0IDM5MjIvNTE2Mi8xMDQ0IDM5MjMvNTE1OS8xMDQ0CitmIDM4MjMvNTE2My8xNzg0IDM3NDUvNTE2NC8xNzg0IDM3NDQvNTE2NS8xNzg0CitmIDM3NDQvNTE2NS8xNzg0IDM4MjQvNTE2Ni8xNzg0IDM4MjMvNTE2My8xNzg0CitmIDM3MzcvNTE2Ny82ODcgMzc1My81MTY4LzY4NyAzNzUyLzUxNjkvNjg3CitmIDM3NTIvNTE2OS82ODcgMzczNi81MTcwLzY4NyAzNzM3LzUxNjcvNjg3CitmIDM3NjEvNTE3MS82ODcgMzk5MS81MTcyLzY4NyAzOTk1LzUxNzMvNjg3CitmIDM5OTUvNTE3My82ODcgMzc2MC81MTc0LzY4NyAzNzYxLzUxNzEvNjg3CitmIDM4MTYvNTE3NS8xMDQzIDM3OTIvNTE1My8xMDQzIDM3OTEvNTE1Mi8xMDQzCitmIDM3OTEvNTE1Mi8xMDQzIDM4MTUvNTE3Ni8xMDQzIDM4MTYvNTE3NS8xMDQzCitmIDM4MDcvNTE3Ny8xNzg1IDM4MDgvNTE3OC8xNzg1IDM3MDQvNTE0OS8xNzg1CitmIDM3MDQvNTE0OS8xNzg1IDM3MDUvNTE0OC8xNzg1IDM4MDcvNTE3Ny8xNzg1CitmIDM3MjAvNTE3OS8xNzg2IDM3NDQvNTE2NS8xNzg2IDM3NDUvNTE2NC8xNzg2CitmIDM3NDUvNTE2NC8xNzg2IDM3MjEvNTE4MC8xNzg2IDM3MjAvNTE3OS8xNzg2CitmIDM5MzEvNTE4MS8xMDQzIDM5NDkvNTE4Mi8xMDQzIDM5NTMvNTE4My8xMDQzCitmIDM5NTMvNTE4My8xMDQzIDM5MzAvNTE4NC8xMDQzIDM5MzEvNTE4MS8xMDQzCitmIDM3MzcvNTE2Ny8xNzg3IDM3MzYvNTE3MC8xNzg3IDM4MzIvNTE1OC8xNzg3CitmIDM4MzIvNTE1OC8xNzg3IDM4MzEvNTE1Ny8xNzg3IDM3MzcvNTE2Ny8xNzg3CitmIDM4MjQvNTE2Ni82ODcgMzg0MC81MTg1LzY4NyAzODM5LzUxODYvNjg3CitmIDM4MzkvNTE4Ni82ODcgMzgyMy81MTYzLzY4NyAzODI0LzUxNjYvNjg3CitmIDM4NDAvNTE4NS82ODcgMzg0OC81MTg3LzY4NyAzODQ3LzUxODgvNjg3CitmIDM4NDcvNTE4OC82ODcgMzgzOS81MTg2LzY4NyAzODQwLzUxODUvNjg3CitmIDM4NDgvNTE4Ny82ODcgMzg1Ni81MTg5LzY4NyAzODU1LzUxOTAvNjg3CitmIDM4NTUvNTE5MC82ODcgMzg0Ny81MTg4LzY4NyAzODQ4LzUxODcvNjg3CitmIDM4NTYvNTE4OS82ODcgMzg2NC81MTkxLzY4NyAzODYzLzUxOTIvNjg3CitmIDM4NjMvNTE5Mi82ODcgMzg1NS81MTkwLzY4NyAzODU2LzUxODkvNjg3CitmIDM4NjQvNTE5MS82ODcgMzg5MS81MTkzLzY4NyAzODk1LzUxOTQvNjg3CitmIDM4OTUvNTE5NC82ODcgMzg2My81MTkyLzY4NyAzODY0LzUxOTEvNjg3CitmIDM3NjAvNTE3NC82ODcgMzc2OC81MTk1LzY4NyAzNzY5LzUxOTYvNjg3CitmIDM3NjkvNTE5Ni82ODcgMzc2MS81MTcxLzY4NyAzNzYwLzUxNzQvNjg3CitmIDM3NjgvNTE5NS82ODcgMzc3Ni81MTk3LzY4NyAzNzc3LzUxOTgvNjg3CitmIDM3NzcvNTE5OC82ODcgMzc2OS81MTk2LzY4NyAzNzY4LzUxOTUvNjg3CitmIDM3NzYvNTE5Ny82ODcgMzc1Mi81MTY5LzY4NyAzNzUzLzUxNjgvNjg3CitmIDM3NTMvNTE2OC82ODcgMzc3Ny81MTk4LzY4NyAzNzc2LzUxOTcvNjg3CitmIDMwOTYvNTE5OS82ODcgMzAyNy81MjAwLzY4NyAzMzQ1LzUyMDEvNjg3CitmIDMzNDUvNTIwMS82ODcgMzM0Ny81MjAyLzY4NyAzMDk2LzUxOTkvNjg3CitmIDMwOTcvNTIwMy82ODcgMjk5MC81MjA0LzY4NyAzMzUzLzUyMDUvNjg3CitmIDMzNTMvNTIwNS82ODcgMzM1NS81MjA2LzY4NyAzMDk3LzUyMDMvNjg3CitmIDMwOTkvNTIwNy82ODcgMzA5OC81MjA4LzY4NyAyOTkxLzUyMDkvNjg3CitmIDI5OTEvNTIwOS82ODcgMjk5Mi81MjEwLzY4NyAzMDk5LzUyMDcvNjg3CitmIDMxMDAvNTIxMS82ODcgMzA5OS81MjA3LzY4NyAyOTkyLzUyMTAvNjg3CitmIDI5OTIvNTIxMC82ODcgMjk5My81MjEyLzY4NyAzMTAwLzUyMTEvNjg3CitmIDMxMDEvNTIxMy82ODcgMzEwMC81MjExLzY4NyAyOTkzLzUyMTIvNjg3CitmIDI5OTMvNTIxMi82ODcgMjk5NC81MjE0LzY4NyAzMTAxLzUyMTMvNjg3CitmIDMxMDIvNTIxNS82ODcgMzEwMS81MjEzLzY4NyAyOTk0LzUyMTQvNjg3CitmIDI5OTQvNTIxNC82ODcgMjk5NS81MjE2LzY4NyAzMTAyLzUyMTUvNjg3CitmIDMxMDMvNTIxNy82ODcgMzEwMi81MjE1LzY4NyAyOTk1LzUyMTYvNjg3CitmIDI5OTUvNTIxNi82ODcgMjk5Ni81MjE4LzY4NyAzMTAzLzUyMTcvNjg3CitmIDMxMDQvNTIxOS82ODcgMzEwMy81MjE3LzY4NyAyOTk2LzUyMTgvNjg3CitmIDI5OTYvNTIxOC82ODcgMjk5Ny81MjIwLzY4NyAzMTA0LzUyMTkvNjg3CitmIDMxMDUvNTIyMS82ODcgMzEwNC81MjE5LzY4NyAyOTk3LzUyMjAvNjg3CitmIDI5OTcvNTIyMC82ODcgMjk5OC81MjIyLzY4NyAzMTA1LzUyMjEvNjg3CitmIDMxMDYvNTIyMy82ODcgMzEwNS81MjIxLzY4NyAyOTk4LzUyMjIvNjg3CitmIDI5OTgvNTIyMi82ODcgMjk5OS81MjI0LzY4NyAzMTA2LzUyMjMvNjg3CitmIDMxMDcvNTIyNS82ODcgMzEwNi81MjIzLzY4NyAyOTk5LzUyMjQvNjg3CitmIDI5OTkvNTIyNC82ODcgMzAwMC81MjI2LzY4NyAzMTA3LzUyMjUvNjg3CitmIDMxMDgvNTIyNy82ODcgMzEwNy81MjI1LzY4NyAzMDAwLzUyMjYvNjg3CitmIDMwMDAvNTIyNi82ODcgMzAwMS81MjI4LzY4NyAzMTA4LzUyMjcvNjg3CitmIDMxMDkvNTIyOS82ODcgMzEwOC81MjI3LzY4NyAzMDAxLzUyMjgvNjg3CitmIDMwMDEvNTIyOC82ODcgMzAwMi81MjMwLzY4NyAzMTA5LzUyMjkvNjg3CitmIDMxMTAvNTIzMS82ODcgMzEwOS81MjI5LzY4NyAzMDAyLzUyMzAvNjg3CitmIDMwMDIvNTIzMC82ODcgMzAwMy81MjMyLzY4NyAzMTEwLzUyMzEvNjg3CitmIDMxMTEvNTIzMy82ODcgMzExMC81MjMxLzY4NyAzMDAzLzUyMzIvNjg3CitmIDMwMDMvNTIzMi82ODcgMzAwNC81MjM0LzY4NyAzMTExLzUyMzMvNjg3CitmIDMxMTIvNTIzNS82ODcgMzExMS81MjMzLzY4NyAzMDA0LzUyMzQvNjg3CitmIDMwMDQvNTIzNC82ODcgMzAwNS81MjM2LzY4NyAzMTEyLzUyMzUvNjg3CitmIDMxMTMvNTIzNy82ODcgMzExMi81MjM1LzY4NyAzMDA1LzUyMzYvNjg3CitmIDMwMDUvNTIzNi82ODcgMzAwNi81MjM4LzY4NyAzMTEzLzUyMzcvNjg3CitmIDMxMTQvNTIzOS82ODcgMzExMy81MjM3LzY4NyAzMDA2LzUyMzgvNjg3CitmIDMwMDYvNTIzOC82ODcgMzAwNy81MjQwLzY4NyAzMTE0LzUyMzkvNjg3CitmIDMzNTEvNTI0MS82ODcgMzExNC81MjM5LzY4NyAzMDA3LzUyNDAvNjg3CitmIDMwMDcvNTI0MC82ODcgMzM1MC81MjQyLzY4NyAzMzUxLzUyNDEvNjg3CitmIDMxMTUvNTI0My82ODcgMzAwOC81MjQ0LzY4NyAzMzQ2LzUyNDUvNjg3CitmIDMzNDYvNTI0NS82ODcgMzM0OC81MjQ2LzY4NyAzMTE1LzUyNDMvNjg3CitmIDMxMTYvNTI0Ny82ODcgMzAwOS81MjQ4LzY4NyAzMzQ5LzUyNDkvNjg3CitmIDMzNDkvNTI0OS82ODcgMzM1Mi81MjUwLzY4NyAzMTE2LzUyNDcvNjg3CitmIDMxMTgvNTI1MS82ODcgMzExNy81MjUyLzY4NyAzMDEwLzUyNTMvNjg3CitmIDMwMTAvNTI1My82ODcgMzAxMS81MjU0LzY4NyAzMTE4LzUyNTEvNjg3CitmIDMxMTkvNTI1NS82ODcgMzExOC81MjUxLzY4NyAzMDExLzUyNTQvNjg3CitmIDMwMTEvNTI1NC82ODcgMzAxMi81MjU2LzY4NyAzMTE5LzUyNTUvNjg3CitmIDMxMjAvNTI1Ny82ODcgMzExOS81MjU1LzY4NyAzMDEyLzUyNTYvNjg3CitmIDMwMTIvNTI1Ni82ODcgMzAxMy81MjU4LzY4NyAzMTIwLzUyNTcvNjg3CitmIDMxMjEvNTI1OS82ODcgMzEyMC81MjU3LzY4NyAzMDEzLzUyNTgvNjg3CitmIDMwMTMvNTI1OC82ODcgMzAxNC81MjYwLzY4NyAzMTIxLzUyNTkvNjg3CitmIDMxMjIvNTI2MS82ODcgMzEyMS81MjU5LzY4NyAzMDE0LzUyNjAvNjg3CitmIDMwMTQvNTI2MC82ODcgMzAxNS81MjYyLzY4NyAzMTIyLzUyNjEvNjg3CitmIDMxMjMvNTI2My82ODcgMzEyMi81MjYxLzY4NyAzMDE1LzUyNjIvNjg3CitmIDMwMTUvNTI2Mi82ODcgMzAxNi81MjY0LzY4NyAzMTIzLzUyNjMvNjg3CitmIDMxMjQvNTI2NS82ODcgMzEyMy81MjYzLzY4NyAzMDE2LzUyNjQvNjg3CitmIDMwMTYvNTI2NC82ODcgMzAxNy81MjY2LzY4NyAzMTI0LzUyNjUvNjg3CitmIDMxMjUvNTI2Ny82ODcgMzEyNC81MjY1LzY4NyAzMDE3LzUyNjYvNjg3CitmIDMwMTcvNTI2Ni82ODcgMzAxOC81MjY4LzY4NyAzMTI1LzUyNjcvNjg3CitmIDMxMjYvNTI2OS82ODcgMzEyNS81MjY3LzY4NyAzMDE4LzUyNjgvNjg3CitmIDMwMTgvNTI2OC82ODcgMzAxOS81MjcwLzY4NyAzMTI2LzUyNjkvNjg3CitmIDMxMjcvNTI3MS82ODcgMzEyNi81MjY5LzY4NyAzMDE5LzUyNzAvNjg3CitmIDMwMTkvNTI3MC82ODcgMzAyMC81MjcyLzY4NyAzMTI3LzUyNzEvNjg3CitmIDMxMjgvNTI3My82ODcgMzEyNy81MjcxLzY4NyAzMDIwLzUyNzIvNjg3CitmIDMwMjAvNTI3Mi82ODcgMzAyMS81Mjc0LzY4NyAzMTI4LzUyNzMvNjg3CitmIDMxMjkvNTI3NS82ODcgMzEyOC81MjczLzY4NyAzMDIxLzUyNzQvNjg3CitmIDMwMjEvNTI3NC82ODcgMzAyMi81Mjc2LzY4NyAzMTI5LzUyNzUvNjg3CitmIDMxMzAvNTI3Ny82ODcgMzEyOS81Mjc1LzY4NyAzMDIyLzUyNzYvNjg3CitmIDMwMjIvNTI3Ni82ODcgMzAyMy81Mjc4LzY4NyAzMTMwLzUyNzcvNjg3CitmIDMxMzEvNTI3OS82ODcgMzEzMC81Mjc3LzY4NyAzMDIzLzUyNzgvNjg3CitmIDMwMjMvNTI3OC82ODcgMzAyNC81MjgwLzY4NyAzMTMxLzUyNzkvNjg3CitmIDMxMzIvNTI4MS82ODcgMzEzMS81Mjc5LzY4NyAzMDI0LzUyODAvNjg3CitmIDMwMjQvNTI4MC82ODcgMzAyNS81MjgyLzY4NyAzMTMyLzUyODEvNjg3CitmIDMxMzMvNTI4My82ODcgMzEzMi81MjgxLzY4NyAzMDI1LzUyODIvNjg3CitmIDMwMjUvNTI4Mi82ODcgMzAyNi81Mjg0LzY4NyAzMTMzLzUyODMvNjg3CitmIDMzNTYvNTI4NS82ODcgMzEzMy81MjgzLzY4NyAzMDI2LzUyODQvNjg3CitmIDMwMjYvNTI4NC82ODcgMzM1NC81Mjg2LzY4NyAzMzU2LzUyODUvNjg3CitmIDMxMzQvNTI4Ny82ODcgMzAzNC81Mjg4LzY4NyAzMzYxLzUyODkvNjg3CitmIDMzNjEvNTI4OS82ODcgMzM2My81MjkwLzY4NyAzMTM0LzUyODcvNjg3CitmIDMxMzUvNTI5MS82ODcgMzIyNC81MjkyLzY4NyAzMzY4LzUyOTMvNjg3CitmIDMzNjgvNTI5My82ODcgMzM3MC81Mjk0LzY4NyAzMTM1LzUyOTEvNjg3CitmIDMxMzcvNTI5NS82ODcgMzEzNi81Mjk2LzY4NyAzMDM1LzUyOTcvNjg3CitmIDMwMzUvNTI5Ny82ODcgMzAzNi81Mjk4LzY4NyAzMTM3LzUyOTUvNjg3CitmIDMxMzgvNTI5OS82ODcgMzEzNy81Mjk1LzY4NyAzMDM2LzUyOTgvNjg3CitmIDMwMzYvNTI5OC82ODcgMzAzNy81MzAwLzY4NyAzMTM4LzUyOTkvNjg3CitmIDMxMzkvNTMwMS82ODcgMzEzOC81Mjk5LzY4NyAzMDM3LzUzMDAvNjg3CitmIDMwMzcvNTMwMC82ODcgMzAzOC81MzAyLzY4NyAzMTM5LzUzMDEvNjg3CitmIDMyMzYvNTMwMy82ODcgMzEzOS81MzAxLzY4NyAzMDM4LzUzMDIvNjg3CitmIDMwMzgvNTMwMi82ODcgMzIzNS81MzA0LzY4NyAzMjM2LzUzMDMvNjg3CitmIDMxNDAvNTMwNS82ODcgMzAyOC81MzA2LzY4NyAzMzYyLzUzMDcvNjg3CitmIDMzNjIvNTMwNy82ODcgMzM2NC81MzA4LzY4NyAzMTQwLzUzMDUvNjg3CitmIDMxNDEvNTMwOS82ODcgMzAyOS81MzEwLzY4NyAzMzg0LzUzMTEvNjg3CitmIDMzODQvNTMxMS82ODcgMzM4NS81MzEyLzY4NyAzMTQxLzUzMDkvNjg3CitmIDMxNDMvNTMxMy82ODcgMzE0Mi81MzE0LzY4NyAzMDMwLzUzMTUvNjg3CitmIDMwMzAvNTMxNS82ODcgMzAzMS81MzE2LzY4NyAzMTQzLzUzMTMvNjg3CitmIDMxNDQvNTMxNy82ODcgMzE0My81MzEzLzY4NyAzMDMxLzUzMTYvNjg3CitmIDMwMzEvNTMxNi82ODcgMzAzMi81MzE4LzY4NyAzMTQ0LzUzMTcvNjg3CitmIDMxNDUvNTMxOS82ODcgMzE0NC81MzE3LzY4NyAzMDMyLzUzMTgvNjg3CitmIDMwMzIvNTMxOC82ODcgMzAzMy81MzIwLzY4NyAzMTQ1LzUzMTkvNjg3CitmIDMzNzEvNTMyMS82ODcgMzE0NS81MzE5LzY4NyAzMDMzLzUzMjAvNjg3CitmIDMwMzMvNTMyMC82ODcgMzM2OS81MzIyLzY4NyAzMzcxLzUzMjEvNjg3CitmIDMxNDYvNTMyMy82ODcgMzA0MC81MzI0LzY4NyAzMzcyLzUzMjUvNjg3CitmIDMzNzIvNTMyNS82ODcgMzM3My81MzI2LzY4NyAzMTQ2LzUzMjMvNjg3CitmIDMxNDcvNTMyNy82ODcgMzA0MS81MzI4LzY4NyAzMzU3LzUzMjkvNjg3CitmIDMzNTcvNTMyOS82ODcgMzM1OS81MzMwLzY4NyAzMTQ3LzUzMjcvNjg3CitmIDMxNDgvNTMzMS82ODcgMzA0Mi81MzMyLzY4NyAzMzc2LzUzMzMvNjg3CitmIDMzNzYvNTMzMy82ODcgMzM3Ny81MzM0LzY4NyAzMTQ4LzUzMzEvNjg3CitmIDMxNDkvNTMzNS82ODcgMzAzOS81MzM2LzY4NyAzMzU4LzUzMzcvNjg3CitmIDMzNTgvNTMzNy82ODcgMzM2MC81MzM4LzY4NyAzMTQ5LzUzMzUvNjg3CitmIDMxNTAvNTMzOS82ODcgMzA0My81MzQwLzY4NyAzMzE5LzUzNDEvNjg3CitmIDMzMTkvNTM0MS82ODcgMzMyMC81MzQyLzY4NyAzMTUwLzUzMzkvNjg3CitmIDMxNTEvNTM0My82ODcgMzA0NC81MzQ0LzY4NyAzMzM1LzUzNDUvNjg3CitmIDMzMzUvNTM0NS82ODcgMzMzOS81MzQ2LzY4NyAzMTUxLzUzNDMvNjg3CitmIDMxNTIvNTM0Ny82ODcgMzA0NS81MzQ4LzY4NyAzMzAyLzUzNDkvNjg3CitmIDMzMDIvNTM0OS82ODcgMzMwNC81MzUwLzY4NyAzMTUyLzUzNDcvNjg3CitmIDMxNTQvNTM1MS82ODcgMzE1My81MzUyLzY4NyAzMDQ2LzUzNTMvNjg3CitmIDMwNDYvNTM1My82ODcgMzA1MS81MzU0LzY4NyAzMTU0LzUzNTEvNjg3CitmIDMxNTAvNTMzOS82ODcgMzE1NC81MzUxLzY4NyAzMDUxLzUzNTQvNjg3CitmIDMwNTEvNTM1NC82ODcgMzA0My81MzQwLzY4NyAzMTUwLzUzMzkvNjg3CitmIDMzNDAvNTM1NS82ODcgMzE1NS81MzU2LzY4NyAzMDQ4LzUzNTcvNjg3CitmIDMwNDgvNTM1Ny82ODcgMzMzNi81MzU4LzY4NyAzMzQwLzUzNTUvNjg3CitmIDMxNTYvNTM1OS82ODcgMzA0OS81MzYwLzY4NyAzNDEwLzUzNjEvNjg3CitmIDM0MTAvNTM2MS82ODcgMzQxMS81MzYyLzY4NyAzMTU2LzUzNTkvNjg3CitmIDMxNTgvNTM2My82ODcgMzE1Ny81MzY0LzY4NyAzMDUwLzUzNjUvNjg3CitmIDMwNTAvNTM2NS82ODcgMzIyMC81MzY2LzY4NyAzMTU4LzUzNjMvNjg3CitmIDMxNTkvNTM2Ny82ODcgMzE1OC81MzYzLzY4NyAzMjIwLzUzNjYvNjg3CitmIDMyMjAvNTM2Ni82ODcgMzA0Ny81MzY4LzY4NyAzMTU5LzUzNjcvNjg3CitmIDMxNTkvNTM2Ny82ODcgMzA0Ny81MzY4LzY4NyAzMzMyLzUzNjkvNjg3CitmIDMzMzIvNTM2OS82ODcgMzMzNC81MzcwLzY4NyAzMTU5LzUzNjcvNjg3CitmIDMxNjAvNTM3MS82ODcgMzA1Mi81MzcyLzY4NyAzMzI3LzUzNzMvNjg3CitmIDMzMjcvNTM3My82ODcgMzMyOS81Mzc0LzY4NyAzMTYwLzUzNzEvNjg3CitmIDMxNjEvNTM3NS82ODcgMzA1My81Mzc2LzY4NyAzMzM3LzUzNzcvNjg3CitmIDMzMzcvNTM3Ny82ODcgMzM0MS81Mzc4LzY4NyAzMTYxLzUzNzUvNjg3CitmIDMxNjIvNTM3OS82ODcgMzA1NC81MzgwLzY4NyAzNDA2LzUzODEvNjg3CitmIDM0MDYvNTM4MS82ODcgMzQwNy81MzgyLzY4NyAzMTYyLzUzNzkvNjg3CitmIDMxNjQvNTM4My82ODcgMzE2My81Mzg0LzY4NyAzMDU1LzUzODUvNjg3CitmIDMwNTUvNTM4NS82ODcgMzIyMS81Mzg2LzY4NyAzMTY0LzUzODMvNjg3CitmIDMxNjAvNTM3MS82ODcgMzE2NC81MzgzLzY4NyAzMjIxLzUzODYvNjg3CitmIDMyMjEvNTM4Ni82ODcgMzA1Mi81MzcyLzY4NyAzMTYwLzUzNzEvNjg3CitmIDMzNDIvNTM4Ny82ODcgMzE2NS81Mzg4LzY4NyAzMDU3LzUzODkvNjg3CitmIDMwNTcvNTM4OS82ODcgMzMzOC81MzkwLzY4NyAzMzQyLzUzODcvNjg3CitmIDMxNjYvNTM5MS82ODcgMzA1OC81MzkyLzY4NyAzMzA1LzUzOTMvNjg3CitmIDMzMDUvNTM5My82ODcgMzMwNy81Mzk0LzY4NyAzMTY2LzUzOTEvNjg3CitmIDMxNjgvNTM5NS82ODcgMzE2Ny81Mzk2LzY4NyAzMDU5LzUzOTcvNjg3CitmIDMwNTkvNTM5Ny82ODcgMzIyMi81Mzk4LzY4NyAzMTY4LzUzOTUvNjg3CitmIDMxNjkvNTM5OS82ODcgMzE2OC81Mzk1LzY4NyAzMjIyLzUzOTgvNjg3CitmIDMyMjIvNTM5OC82ODcgMzA1Ni81NDAwLzY4NyAzMTY5LzUzOTkvNjg3CitmIDMxNjkvNTM5OS82ODcgMzA1Ni81NDAwLzY4NyAzMzIzLzU0MDEvNjg3CitmIDMzMjMvNTQwMS82ODcgMzMyNC81NDAyLzY4NyAzMTY5LzUzOTkvNjg3CitmIDMyNzkvNTQwMy82ODcgMzE3MC81NDA0LzY4NyAzMDY4LzU0MDUvNjg3CitmIDMwNjgvNTQwNS82ODcgMzI3Ny81NDA2LzY4NyAzMjc5LzU0MDMvNjg3CitmIDMxNzEvNTQwNy82ODcgMzA2OS81NDA4LzY4NyAzMzE3LzU0MDkvNjg3CitmIDMzMTcvNTQwOS82ODcgMzMxOC81NDEwLzY4NyAzMTcxLzU0MDcvNjg3CitmIDMxNzIvNTQxMS82ODcgMzA3MC81NDEyLzY4NyAzMjc4LzU0MTMvNjg3CitmIDMyNzgvNTQxMy82ODcgMzI4MC81NDE0LzY4NyAzMTcyLzU0MTEvNjg3CitmIDMxNzQvNTQxNS82ODcgMzE3My81NDE2LzY4NyAzMDcxLzU0MTcvNjg3CitmIDMwNzEvNTQxNy82ODcgMzA3Mi81NDE4LzY4NyAzMTc0LzU0MTUvNjg3CitmIDMxNzUvNTQxOS82ODcgMzE3NC81NDE1LzY4NyAzMDcyLzU0MTgvNjg3CitmIDMwNzIvNTQxOC82ODcgMzA3My81NDIwLzY4NyAzMTc1LzU0MTkvNjg3CitmIDMxNzUvNTQxOS82ODcgMzA3My81NDIwLzY4NyAzMjE0LzU0MjEvNjg3CitmIDMyMTQvNTQyMS82ODcgMzIxNS81NDIyLzY4NyAzMTc1LzU0MTkvNjg3CitmIDMxNzYvNTQyMy82ODcgMzA3NC81NDI0LzY4NyAzMDc1LzU0MjUvNjg3CitmIDMwNzUvNTQyNS82ODcgMzE3Ny81NDI2LzY4NyAzMTc2LzU0MjMvNjg3CitmIDMxNzgvNTQyNy82ODcgMzE3Ny81NDI2LzY4NyAzMDc1LzU0MjUvNjg3CitmIDMwNzUvNTQyNS82ODcgMzA3Ni81NDI4LzY4NyAzMTc4LzU0MjcvNjg3CitmIDMxNzkvNTQyOS82ODcgMzE3OC81NDI3LzY4NyAzMDc2LzU0MjgvNjg3CitmIDMwNzYvNTQyOC82ODcgMzA3Ny81NDMwLzY4NyAzMTc5LzU0MjkvNjg3CitmIDMxODAvNTQzMS82ODcgMzE3OS81NDI5LzY4NyAzMDc3LzU0MzAvNjg3CitmIDMwNzcvNTQzMC82ODcgMzA3OC81NDMyLzY4NyAzMTgwLzU0MzEvNjg3CitmIDMxODAvNTQzMS82ODcgMzA3OC81NDMyLzY4NyAzMjkxLzU0MzMvNjg3CitmIDMyOTEvNTQzMy82ODcgMzI5Mi81NDM0LzY4NyAzMTgwLzU0MzEvNjg3CitmIDMyODQvNTQzNS82ODcgMzE4MS81NDM2LzY4NyAzMDc5LzU0MzcvNjg3CitmIDMwNzkvNTQzNy82ODcgMzI4My81NDM4LzY4NyAzMjg0LzU0MzUvNjg3CitmIDMxODMvNTQzOS82ODcgMzE4Mi81NDQwLzY4NyAzMDc0LzU0MjQvNjg3CitmIDMwNzQvNTQyNC82ODcgMzIxMC81NDQxLzY4NyAzMTgzLzU0MzkvNjg3CitmIDMxODMvNTQzOS82ODcgMzIxMC81NDQxLzY4NyAzMjg3LzU0NDIvNjg3CitmIDMyODcvNTQ0Mi82ODcgMzI4OC81NDQzLzY4NyAzMTgzLzU0MzkvNjg3CitmIDMxODQvNTQ0NC82ODcgMzA2MC81NDQ1LzY4NyAzMzE1LzU0NDYvNjg3CitmIDMzMTUvNTQ0Ni82ODcgMzMxNi81NDQ3LzY4NyAzMTg0LzU0NDQvNjg3CitmIDMxODUvNTQ0OC82ODcgMzA5NS81NDQ5LzY4NyAzMDYxLzU0NTAvNjg3CitmIDMwNjEvNTQ1MC82ODcgMzE4Ni81NDUxLzY4NyAzMTg1LzU0NDgvNjg3CitmIDMxODcvNTQ1Mi82ODcgMzE4Ni81NDUxLzY4NyAzMDYxLzU0NTAvNjg3CitmIDMwNjEvNTQ1MC82ODcgMzA2Mi81NDUzLzY4NyAzMTg3LzU0NTIvNjg3CitmIDMxODgvNTQ1NC82ODcgMzE4Ny81NDUyLzY4NyAzMDYyLzU0NTMvNjg3CitmIDMwNjIvNTQ1My82ODcgMzA2My81NDU1LzY4NyAzMTg4LzU0NTQvNjg3CitmIDMxODkvNTQ1Ni82ODcgMzE4OC81NDU0LzY4NyAzMDYzLzU0NTUvNjg3CitmIDMwNjMvNTQ1NS82ODcgMzA2NC81NDU3LzY4NyAzMTg5LzU0NTYvNjg3CitmIDMxODkvNTQ1Ni82ODcgMzA2NC81NDU3LzY4NyAzMjA5LzU0NTgvNjg3CitmIDMyMDkvNTQ1OC82ODcgMzIxMi81NDU5LzY4NyAzMTg5LzU0NTYvNjg3CitmIDMxOTAvNTQ2MC82ODcgMzA2NS81NDYxLzY4NyAzMjEzLzU0NjIvNjg3CitmIDMyMTMvNTQ2Mi82ODcgMzIxNi81NDYzLzY4NyAzMTkwLzU0NjAvNjg3CitmIDMxOTIvNTQ2NC82ODcgMzE5MS81NDY1LzY4NyAzMDY2LzU0NjYvNjg3CitmIDMwNjYvNTQ2Ni82ODcgMzA2Ny81NDY3LzY4NyAzMTkyLzU0NjQvNjg3CitmIDMxNzAvNTQwNC82ODcgMzE5Mi81NDY0LzY4NyAzMDY3LzU0NjcvNjg3CitmIDMwNjcvNTQ2Ny82ODcgMzA2OC81NDA1LzY4NyAzMTcwLzU0MDQvNjg3CitmIDMxOTMvNTQ2OC82ODcgMzA4Mi81NDY5LzY4NyAzMjQ2LzU0NzAvNjg3CitmIDMyNDYvNTQ3MC82ODcgMzI0OC81NDcxLzY4NyAzMTkzLzU0NjgvNjg3CitmIDMxOTQvNTQ3Mi82ODcgMzA4My81NDczLzY4NyAzMjQyLzU0NzQvNjg3CitmIDMyNDIvNTQ3NC82ODcgMzI0My81NDc1LzY4NyAzMTk0LzU0NzIvNjg3CitmIDMxOTUvNTQ3Ni82ODcgMzA4MC81NDc3LzY4NyAzMjQ3LzU0NzgvNjg3CitmIDMyNDcvNTQ3OC82ODcgMzI0OS81NDc5LzY4NyAzMTk1LzU0NzYvNjg3CitmIDMxOTYvNTQ4MC82ODcgMzA4MS81NDgxLzY4NyAzMjM4LzU0ODIvNjg3CitmIDMyMzgvNTQ4Mi82ODcgMzIzOS81NDgzLzY4NyAzMTk2LzU0ODAvNjg3CitmIDMxOTcvNTQ4NC82ODcgMzIxOC81NDg1LzY4NyAzMjU0LzU0ODYvNjg3CitmIDMyNTQvNTQ4Ni82ODcgMzI1Ni81NDg3LzY4NyAzMTk3LzU0ODQvNjg3CitmIDMxOTgvNTQ4OC82ODcgMzA5MC81NDg5LzY4NyAzMjUwLzU0OTAvNjg3CitmIDMyNTAvNTQ5MC82ODcgMzI1Mi81NDkxLzY4NyAzMTk4LzU0ODgvNjg3CitmIDMyMDAvNTQ5Mi82ODcgMzE5OS81NDkzLzY4NyAzMDkxLzU0OTQvNjg3CitmIDMwOTEvNTQ5NC82ODcgMzA5Mi81NDk1LzY4NyAzMjAwLzU0OTIvNjg3CitmIDMyMDEvNTQ5Ni82ODcgMzIwMC81NDkyLzY4NyAzMDkyLzU0OTUvNjg3CitmIDMwOTIvNTQ5NS82ODcgMzA5My81NDk3LzY4NyAzMjAxLzU0OTYvNjg3CitmIDMyMDIvNTQ5OC82ODcgMzIwMS81NDk2LzY4NyAzMDkzLzU0OTcvNjg3CitmIDMwOTMvNTQ5Ny82ODcgMzA5NC81NDk5LzY4NyAzMjAyLzU0OTgvNjg3CitmIDMyMzIvNTUwMC82ODcgMzIwMi81NDk4LzY4NyAzMDk0LzU0OTkvNjg3CitmIDMwOTQvNTQ5OS82ODcgMzIzMS81NTAxLzY4NyAzMjMyLzU1MDAvNjg3CitmIDMyMDMvNTUwMi82ODcgMzA4NC81NTAzLzY4NyAzMjU1LzU1MDQvNjg3CitmIDMyNTUvNTUwNC82ODcgMzI1Ny81NTA1LzY4NyAzMjAzLzU1MDIvNjg3CitmIDMyMDQvNTUwNi82ODcgMzA4NS81NTA3LzY4NyAzMjYzLzU1MDgvNjg3CitmIDMyNjMvNTUwOC82ODcgMzI2NC81NTA5LzY4NyAzMjA0LzU1MDYvNjg3CitmIDMyMDYvNTUxMC82ODcgMzIwNS81NTExLzY4NyAzMDg2LzU1MTIvNjg3CitmIDMwODYvNTUxMi82ODcgMzA4Ny81NTEzLzY4NyAzMjA2LzU1MTAvNjg3CitmIDMyMDcvNTUxNC82ODcgMzIwNi81NTEwLzY4NyAzMDg3LzU1MTMvNjg3CitmIDMwODcvNTUxMy82ODcgMzA4OC81NTE1LzY4NyAzMjA3LzU1MTQvNjg3CitmIDMyMDgvNTUxNi82ODcgMzIwNy81NTE0LzY4NyAzMDg4LzU1MTUvNjg3CitmIDMwODgvNTUxNS82ODcgMzA4OS81NTE3LzY4NyAzMjA4LzU1MTYvNjg3CitmIDMyMDgvNTUxNi82ODcgMzA4OS81NTE3LzY4NyAzMjUxLzU1MTgvNjg3CitmIDMyNTEvNTUxOC82ODcgMzI1My81NTE5LzY4NyAzMjA4LzU1MTYvNjg3CitmIDMxNzYvNTQyMy82ODcgMzIxMS81NTIwLzY4NyAzMjEwLzU0NDEvNjg3CitmIDMyMTAvNTQ0MS82ODcgMzA3NC81NDI0LzY4NyAzMTc2LzU0MjMvNjg3CitmIDMxOTAvNTQ2MC82ODcgMzIxMi81NDU5LzY4NyAzMjA5LzU0NTgvNjg3CitmIDMyMDkvNTQ1OC82ODcgMzA2NS81NDYxLzY4NyAzMTkwLzU0NjAvNjg3CitmIDMyMTUvNTQyMi82ODcgMzIxNC81NDIxLzY4NyAzMjEwLzU0NDEvNjg3CitmIDMyMTAvNTQ0MS82ODcgMzIxMS81NTIwLzY4NyAzMjE1LzU0MjIvNjg3CitmIDMxOTEvNTQ2NS82ODcgMzIxNi81NDYzLzY4NyAzMjEzLzU0NjIvNjg3CitmIDMyMTMvNTQ2Mi82ODcgMzA2Ni81NDY2LzY4NyAzMTkxLzU0NjUvNjg3CitmIDMyMTcvNTUyMS82ODcgMzA5MC81NDg5LzY4NyAzMjU0LzU0ODYvNjg3CitmIDMyNTQvNTQ4Ni82ODcgMzI1OC81NTIyLzY4NyAzMjE3LzU1MjEvNjg3CitmIDMyNDEvNTUyMy82ODcgMzIxOS81NTI0LzY4NyAzMjE4LzU0ODUvNjg3CitmIDMyMTgvNTQ4NS82ODcgMzI0MC81NTI1LzY4NyAzMjQxLzU1MjMvNjg3CitmIDMyMjAvNTM2Ni82ODcgMzA1MC81MzY1LzY4NyAzMDUyLzUzNzIvNjg3CitmIDMwNTIvNTM3Mi82ODcgMzIyMS81Mzg2LzY4NyAzMjIwLzUzNjYvNjg3CitmIDMyMjEvNTM4Ni82ODcgMzA1NS81Mzg1LzY4NyAzMDU2LzU0MDAvNjg3CitmIDMwNTYvNTQwMC82ODcgMzIyMi81Mzk4LzY4NyAzMjIxLzUzODYvNjg3CitmIDMwNTEvNTM1NC82ODcgMzA0Ni81MzUzLzY4NyAzMDQ3LzUzNjgvNjg3CitmIDMwNDcvNTM2OC82ODcgMzIyMC81MzY2LzY4NyAzMDUxLzUzNTQvNjg3CitmIDMyMjIvNTM5OC82ODcgMzA1OS81Mzk3LzY4NyAzMDQzLzUzNDAvNjg3CitmIDMwNDMvNTM0MC82ODcgMzA1MS81MzU0LzY4NyAzMjIyLzUzOTgvNjg3CitmIDMyMjEvNTM4Ni82ODcgMzIyMi81Mzk4LzY4NyAzMDUxLzUzNTQvNjg3CitmIDMwNTEvNTM1NC82ODcgMzIyMC81MzY2LzY4NyAzMjIxLzUzODYvNjg3CitmIDMzODEvNTUyNi82ODcgMzIyNS81NTI3LzY4NyAzMjIzLzU1MjgvNjg3CitmIDMyMjMvNTUyOC82ODcgMzM4MC81NTI5LzY4NyAzMzgxLzU1MjYvNjg3CitmIDMzNjUvNTUzMC82ODcgMzIyNi81NTMxLzY4NyAzMjI0LzUyOTIvNjg3CitmIDMyMjQvNTI5Mi82ODcgMzM2MS81Mjg5LzY4NyAzMzY1LzU1MzAvNjg3CitmIDMyMjgvNTUzMi82ODcgMzIyNy81NTMzLzY4NyAzMzY2LzU1MzQvNjg3CitmIDMzNjYvNTUzNC82ODcgMzM2Ny81NTM1LzY4NyAzMjI4LzU1MzIvNjg3CitmIDMzNzUvNTUzNi82ODcgMzIyOS81NTM3LzY4NyAzMDM0LzUyODgvNjg3CitmIDMwMzQvNTI4OC82ODcgMzM3NC81NTM4LzY4NyAzMzc1LzU1MzYvNjg3CitmIDMyNjYvNTUzOS82ODcgMzIzMi81NTAwLzY4NyAzMjMxLzU1MDEvNjg3CitmIDMyMzEvNTUwMS82ODcgMzI2NS81NTQwLzY4NyAzMjY2LzU1MzkvNjg3CitmIDMyMzMvNTU0MS82ODcgMzIzMC81NTQyLzY4NyAzMDg2LzU1MTIvNjg3CitmIDMwODYvNTUxMi82ODcgMzIwNS81NTExLzY4NyAzMjMzLzU1NDEvNjg3CitmIDMzOTYvNTU0My82ODcgMzIzNi81MzAzLzY4NyAzMjM1LzUzMDQvNjg3CitmIDMyMzUvNTMwNC82ODcgMzM5NS81NTQ0LzY4NyAzMzk2LzU1NDMvNjg3CitmIDMyMzcvNTU0NS82ODcgMzIzNC81NTQ2LzY4NyAzMDMwLzUzMTUvNjg3CitmIDMwMzAvNTMxNS82ODcgMzE0Mi81MzE0LzY4NyAzMjM3LzU1NDUvNjg3CitmIDMyMzkvNTQ4My82ODcgMzIzOC81NDgyLzY4NyAzMjU5LzU1NDcvNjg3CitmIDMyNTkvNTU0Ny82ODcgMzI2MC81NTQ4LzY4NyAzMjM5LzU0ODMvNjg3CitmIDMxOTUvNTQ3Ni82ODcgMzI0MS81NTIzLzY4NyAzMjQwLzU1MjUvNjg3CitmIDMyNDAvNTUyNS82ODcgMzA4MC81NDc3LzY4NyAzMTk1LzU0NzYvNjg3CitmIDMyNDMvNTQ3NS82ODcgMzI0Mi81NDc0LzY4NyAzMjYxLzU1NDkvNjg3CitmIDMyNjEvNTU0OS82ODcgMzI2Mi81NTUwLzY4NyAzMjQzLzU0NzUvNjg3CitmIDMxOTMvNTQ2OC82ODcgMzI0NS81NTUxLzY4NyAzMjQ0LzU1NTIvNjg3CitmIDMyNDQvNTU1Mi82ODcgMzA4Mi81NDY5LzY4NyAzMTkzLzU0NjgvNjg3CitmIDMxOTQvNTQ3Mi82ODcgMzI0OC81NDcxLzY4NyAzMjQ2LzU0NzAvNjg3CitmIDMyNDYvNTQ3MC82ODcgMzA4My81NDczLzY4NyAzMTk0LzU0NzIvNjg3CitmIDMxOTYvNTQ4MC82ODcgMzI0OS81NDc5LzY4NyAzMjQ3LzU0NzgvNjg3CitmIDMyNDcvNTQ3OC82ODcgMzA4MS81NDgxLzY4NyAzMTk2LzU0ODAvNjg3CitmIDMyNTIvNTQ5MS82ODcgMzI1MC81NDkwLzY4NyAzMDkxLzU0OTQvNjg3CitmIDMwOTEvNTQ5NC82ODcgMzE5OS81NDkzLzY4NyAzMjUyLzU0OTEvNjg3CitmIDMxOTcvNTQ4NC82ODcgMzI1My81NTE5LzY4NyAzMjUxLzU1MTgvNjg3CitmIDMyNTEvNTUxOC82ODcgMzIxOC81NDg1LzY4NyAzMTk3LzU0ODQvNjg3CitmIDMwODkvNTUxNy82ODcgMzQzMi81NTUzLzY4NyAzMDgwLzU0NzcvNjg3CitmIDMwODAvNTQ3Ny82ODcgMzI0MC81NTI1LzY4NyAzMDg5LzU1MTcvNjg3CitmIDMyMTgvNTQ4NS82ODcgMzI1MS81NTE4LzY4NyAzMjQwLzU1MjUvNjg3CitmIDMxOTgvNTQ4OC82ODcgMzI1Ni81NDg3LzY4NyAzMjU0LzU0ODYvNjg3CitmIDMyNTQvNTQ4Ni82ODcgMzA5MC81NDg5LzY4NyAzMTk4LzU0ODgvNjg3CitmIDMyMDQvNTUwNi82ODcgMzI1Ny81NTA1LzY4NyAzMjU1LzU1MDQvNjg3CitmIDMyNTUvNTUwNC82ODcgMzA4NS81NTA3LzY4NyAzMjA0LzU1MDYvNjg3CitmIDMyNTgvNTUyMi82ODcgMzI1NC81NDg2LzY4NyAzMjE4LzU0ODUvNjg3CitmIDMyMTgvNTQ4NS82ODcgMzIxOS81NTI0LzY4NyAzMjU4LzU1MjIvNjg3CitmIDMyNDUvNTU1MS82ODcgMzI2MC81NTQ4LzY4NyAzMjU5LzU1NDcvNjg3CitmIDMyNTkvNTU0Ny82ODcgMzI0NC81NTUyLzY4NyAzMjQ1LzU1NTEvNjg3CitmIDMyNjIvNTU1MC82ODcgMzI2MS81NTQ5LzY4NyAzMDkwLzU0ODkvNjg3CitmIDMwOTAvNTQ4OS82ODcgMzIxNy81NTIxLzY4NyAzMjYyLzU1NTAvNjg3CitmIDMyNjQvNTUwOS82ODcgMzI2My81NTA4LzY4NyAzMjMwLzU1NDIvNjg3CitmIDMyMzAvNTU0Mi82ODcgMzIzMy81NTQxLzY4NyAzMjY0LzU1MDkvNjg3CitmIDMyMDMvNTUwMi82ODcgMzI2Ni81NTM5LzY4NyAzMjY1LzU1NDAvNjg3CitmIDMyNjUvNTU0MC82ODcgMzA4NC81NTAzLzY4NyAzMjAzLzU1MDIvNjg3CitmIDMyNzEvNTU1NC82ODcgMzI2Ny81NTU1LzY4NyAzMjY4LzU1NTYvNjg3CitmIDMyNjgvNTU1Ni82ODcgMzI3MC81NTU3LzY4NyAzMjcxLzU1NTQvNjg3CitmIDM0NDQvNTU1OC82ODcgMzQ0OC81NTU5LzY4NyAzMjY4LzU1NTYvNjg3CitmIDMyNjgvNTU1Ni82ODcgMzI2Ny81NTU1LzY4NyAzNDQ0LzU1NTgvNjg3CitmIDMyNjkvNTU2MC82ODcgMzI2OC81NTU2LzY4NyAzMjY1LzU1NDAvNjg3CitmIDMyNjUvNTU0MC82ODcgMzIzMS81NTAxLzY4NyAzMjY5LzU1NjAvNjg3CitmIDMyNjgvNTU1Ni82ODcgMzI2OS81NTYwLzY4NyAzMjcwLzU1NTcvNjg3CitmIDMyNDIvNTQ3NC82ODcgMzI2Ny81NTU1LzY4NyAzMjcyLzU1NjEvNjg3CitmIDMyNzIvNTU2MS82ODcgMzI2MS81NTQ5LzY4NyAzMjQyLzU0NzQvNjg3CitmIDMyNzEvNTU1NC82ODcgMzI3Mi81NTYxLzY4NyAzMjY3LzU1NTUvNjg3CitmIDM0NDQvNTU1OC82ODcgMzI2Ny81NTU1LzY4NyAzMjQyLzU0NzQvNjg3CitmIDMyNDIvNTQ3NC82ODcgMzA4My81NDczLzY4NyAzNDQ0LzU1NTgvNjg3CitmIDMyNjgvNTU1Ni82ODcgMzQ0OC81NTU5LzY4NyAzMDg0LzU1MDMvNjg3CitmIDMwODQvNTUwMy82ODcgMzI2NS81NTQwLzY4NyAzMjY4LzU1NTYvNjg3CitmIDMyNzIvNTU2MS82ODcgMzI1MC81NDkwLzY4NyAzMDkwLzU0ODkvNjg3CitmIDMwOTAvNTQ4OS82ODcgMzI2MS81NTQ5LzY4NyAzMjcyLzU1NjEvNjg3CitmIDMwOTQvNTQ5OS82ODcgMzA5My81NDk3LzY4NyAzMjY5LzU1NjAvNjg3CitmIDMyNjkvNTU2MC82ODcgMzIzMS81NTAxLzY4NyAzMDk0LzU0OTkvNjg3CitmIDMwOTMvNTQ5Ny82ODcgMzA5Mi81NDk1LzY4NyAzMjcwLzU1NTcvNjg3CitmIDMyNzAvNTU1Ny82ODcgMzI2OS81NTYwLzY4NyAzMDkzLzU0OTcvNjg3CitmIDMwOTEvNTQ5NC82ODcgMzI3MS81NTU0LzY4NyAzMjcwLzU1NTcvNjg3CitmIDMyNzAvNTU1Ny82ODcgMzA5Mi81NDk1LzY4NyAzMDkxLzU0OTQvNjg3CitmIDMyNTAvNTQ5MC82ODcgMzI3Mi81NTYxLzY4NyAzMjcxLzU1NTQvNjg3CitmIDMyNzEvNTU1NC82ODcgMzA5MS81NDk0LzY4NyAzMjUwLzU0OTAvNjg3CitmIDMwNzQvNTQyNC82ODcgMzI4OS81NTYyLzY4NyAzMDc1LzU0MjUvNjg3CitmIDMyOTAvNTU2My82ODcgMzI3NS81NTY0LzY4NyAzMjc0LzU1NjUvNjg3CitmIDMyNzQvNTU2NS82ODcgMzI4OS81NTYyLzY4NyAzMjkwLzU1NjMvNjg3CitmIDMyNzYvNTU2Ni82ODcgMzI3My81NTY3LzY4NyAzMjkzLzU1NjgvNjg3CitmIDMyOTMvNTU2OC82ODcgMzI5NC81NTY5LzY4NyAzMjc2LzU1NjYvNjg3CitmIDMwNzcvNTQzMC82ODcgMzA3Ni81NDI4LzY4NyAzMjc0LzU1NjUvNjg3CitmIDMyNzQvNTU2NS82ODcgMzI5NS81NTcwLzY4NyAzMDc3LzU0MzAvNjg3CitmIDMxNzEvNTQwNy82ODcgMzI3OS81NDAzLzY4NyAzMjc3LzU0MDYvNjg3CitmIDMyNzcvNTQwNi82ODcgMzA2OS81NDA4LzY4NyAzMTcxLzU0MDcvNjg3CitmIDMyODAvNTQxNC82ODcgMzI3OC81NDEzLzY4NyAzMDcxLzU0MTcvNjg3CitmIDMwNzEvNTQxNy82ODcgMzE3My81NDE2LzY4NyAzMjgwLzU0MTQvNjg3CitmIDMxODQvNTQ0NC82ODcgMzI4Mi81NTcxLzY4NyAzMjgxLzU1NzIvNjg3CitmIDMyODEvNTU3Mi82ODcgMzA2MC81NDQ1LzY4NyAzMTg0LzU0NDQvNjg3CitmIDMwNjkvNTQwOC82ODcgMzM0My81NTczLzY4NyAzMDYwLzU0NDUvNjg3CitmIDMwNjAvNTQ0NS82ODcgMzMxNy81NDA5LzY4NyAzMDY5LzU0MDgvNjg3CitmIDMyOTgvNTU3NC82ODcgMzI4NC81NDM1LzY4NyAzMjgzLzU0MzgvNjg3CitmIDMyODMvNTQzOC82ODcgMzI5Ny81NTc1LzY4NyAzMjk4LzU1NzQvNjg3CitmIDMyODIvNTU3MS82ODcgMzI4Ni81NTc2LzY4NyAzMjg1LzU1NzcvNjg3CitmIDMyODUvNTU3Ny82ODcgMzI4MS81NTcyLzY4NyAzMjgyLzU1NzEvNjg3CitmIDMwNzAvNTQxMi82ODcgMzI4MS81NTcyLzY4NyAzMjg1LzU1NzcvNjg3CitmIDMyODUvNTU3Ny82ODcgMzI3OC81NDEzLzY4NyAzMDcwLzU0MTIvNjg3CitmIDMyOTMvNTU2OC82ODcgMzA3Mi81NDE4LzY4NyAzMDcxLzU0MTcvNjg3CitmIDMwNzEvNTQxNy82ODcgMzI5OS81NTc4LzY4NyAzMjkzLzU1NjgvNjg3CitmIDMyMTQvNTQyMS82ODcgMzA3My81NDIwLzY4NyAzMjczLzU1NjcvNjg3CitmIDMyNzMvNTU2Ny82ODcgMzI4Ny81NDQyLzY4NyAzMjE0LzU0MjEvNjg3CitmIDMyODgvNTQ0My82ODcgMzI4Ny81NDQyLzY4NyAzMjczLzU1NjcvNjg3CitmIDMyNzMvNTU2Ny82ODcgMzI3Ni81NTY2LzY4NyAzMjg4LzU0NDMvNjg3CitmIDMxODIvNTQ0MC82ODcgMzI5MC81NTYzLzY4NyAzMjg5LzU1NjIvNjg3CitmIDMyODkvNTU2Mi82ODcgMzA3NC81NDI0LzY4NyAzMTgyLzU0NDAvNjg3CitmIDMwNzUvNTQyNS82ODcgMzI4OS81NTYyLzY4NyAzMjc0LzU1NjUvNjg3CitmIDMyNzQvNTU2NS82ODcgMzA3Ni81NDI4LzY4NyAzMDc1LzU0MjUvNjg3CitmIDMyODcvNTQ0Mi82ODcgMzIxMC81NDQxLzY4NyAzMjE0LzU0MjEvNjg3CitmIDMyOTIvNTQzNC82ODcgMzI5MS81NDMzLzY4NyAzMDc5LzU0MzcvNjg3CitmIDMwNzkvNTQzNy82ODcgMzE4MS81NDM2LzY4NyAzMjkyLzU0MzQvNjg3CitmIDMyOTQvNTU2OS82ODcgMzI5My81NTY4LzY4NyAzMjk5LzU1NzgvNjg3CitmIDMyOTkvNTU3OC82ODcgMzMwMC81NTc5LzY4NyAzMjk0LzU1NjkvNjg3CitmIDMyNzUvNTU2NC82ODcgMzI5Ni81NTgwLzY4NyAzMjk1LzU1NzAvNjg3CitmIDMyOTUvNTU3MC82ODcgMzI3NC81NTY1LzY4NyAzMjc1LzU1NjQvNjg3CitmIDMwNzgvNTQzMi82ODcgMzA3Ny81NDMwLzY4NyAzMjk1LzU1NzAvNjg3CitmIDMyOTUvNTU3MC82ODcgMzI5Ny81NTc1LzY4NyAzMDc4LzU0MzIvNjg3CitmIDMwNzIvNTQxOC82ODcgMzI5My81NTY4LzY4NyAzMjczLzU1NjcvNjg3CitmIDMyNzMvNTU2Ny82ODcgMzA3My81NDIwLzY4NyAzMDcyLzU0MTgvNjg3CitmIDMyOTYvNTU4MC82ODcgMzI5OC81NTc0LzY4NyAzMjk3LzU1NzUvNjg3CitmIDMyOTcvNTU3NS82ODcgMzI5NS81NTcwLzY4NyAzMjk2LzU1ODAvNjg3CitmIDMzMDAvNTU3OS82ODcgMzI5OS81NTc4LzY4NyAzMjg1LzU1NzcvNjg3CitmIDMyODUvNTU3Ny82ODcgMzI4Ni81NTc2LzY4NyAzMzAwLzU1NzkvNjg3CitmIDMyOTkvNTU3OC82ODcgMzA3MS81NDE3LzY4NyAzMjc4LzU0MTMvNjg3CitmIDMyNzgvNTQxMy82ODcgMzI4NS81NTc3LzY4NyAzMjk5LzU1NzgvNjg3CitmIDMyOTEvNTQzMy82ODcgMzA3OC81NDMyLzY4NyAzMjk3LzU1NzUvNjg3CitmIDMyOTcvNTU3NS82ODcgMzI4My81NDM4LzY4NyAzMjkxLzU0MzMvNjg3CitmIDMyODMvNTQzOC82ODcgMzA3OS81NDM3LzY4NyAzMjkxLzU0MzMvNjg3CitmIDMxNTEvNTM0My82ODcgMzMwMy81NTgxLzY4NyAzMzAxLzU1ODIvNjg3CitmIDMzMDEvNTU4Mi82ODcgMzA0NC81MzQ0LzY4NyAzMTUxLzUzNDMvNjg3CitmIDMzMDQvNTM1MC82ODcgMzMwMi81MzQ5LzY4NyAzMzEzLzU1ODMvNjg3CitmIDMzMTMvNTU4My82ODcgMzMxNC81NTg0LzY4NyAzMzA0LzUzNTAvNjg3CitmIDMzMjYvNTU4NS82ODcgMzMwNy81Mzk0LzY4NyAzMzA1LzUzOTMvNjg3CitmIDMzMDUvNTM5My82ODcgMzMyNS81NTg2LzY4NyAzMzI2LzU1ODUvNjg3CitmIDMxNjUvNTM4OC82ODcgMzMwOC81NTg3LzY4NyAzMzA2LzU1ODgvNjg3CitmIDMzMDYvNTU4OC82ODcgMzA1Ny81Mzg5LzY4NyAzMTY1LzUzODgvNjg3CitmIDM0MjgvNTU4OS82ODcgMzA2Mi81NDUzLzY4NyAzMDU4LzUzOTIvNjg3CitmIDMwNTgvNTM5Mi82ODcgMzY5MS81NTkwLzY4NyAzNDI4LzU1ODkvNjg3CitmIDMzMDgvNTU4Ny82ODcgMzMxMC81NTkxLzY4NyAzMzA5LzU1OTIvNjg3CitmIDMzMDkvNTU5Mi82ODcgMzMwNi81NTg4LzY4NyAzMzA4LzU1ODcvNjg3CitmIDMwOTUvNTQ0OS82ODcgMzMyNS81NTg2LzY4NyAzMzA1LzUzOTMvNjg3CitmIDMzMDUvNTM5My82ODcgMzA2MS81NDUwLzY4NyAzMDk1LzU0NDkvNjg3CitmIDMzMDMvNTU4MS82ODcgMzMxMi81NTkzLzY4NyAzMzExLzU1OTQvNjg3CitmIDMzMTEvNTU5NC82ODcgMzMwMS81NTgyLzY4NyAzMzAzLzU1ODEvNjg3CitmIDMzMjIvNTU5NS82ODcgMzMxNC81NTg0LzY4NyAzMzEzLzU1ODMvNjg3CitmIDMzMTMvNTU4My82ODcgMzMyMS81NTk2LzY4NyAzMzIyLzU1OTUvNjg3CitmIDMzMDEvNTU4Mi82ODcgMzI3Ny81NDA2LzY4NyAzMDY4LzU0MDUvNjg3CitmIDMwNjgvNTQwNS82ODcgMzA0NC81MzQ0LzY4NyAzMzAxLzU1ODIvNjg3CitmIDMwNDQvNTM0NC82ODcgMzA2OC81NDA1LzY4NyAzMDY3LzU0NjcvNjg3CitmIDMwNjcvNTQ2Ny82ODcgMzQ0My81NTk3LzY4NyAzMDQ0LzUzNDQvNjg3CitmIDMzMTYvNTQ0Ny82ODcgMzMxNS81NDQ2LzY4NyAzMDk1LzU0NDkvNjg3CitmIDMwOTUvNTQ0OS82ODcgMzE4NS81NDQ4LzY4NyAzMzE2LzU0NDcvNjg3CitmIDMzMTUvNTQ0Ni82ODcgMzM0NC81NTk4LzY4NyAzMzI1LzU1ODYvNjg3CitmIDMzMjUvNTU4Ni82ODcgMzA5NS81NDQ5LzY4NyAzMzE1LzU0NDYvNjg3CitmIDMzMTUvNTQ0Ni82ODcgMzA2MC81NDQ1LzY4NyAzMzQzLzU1NzMvNjg3CitmIDMzNDMvNTU3My82ODcgMzM0NC81NTk4LzY4NyAzMzE1LzU0NDYvNjg3CitmIDMxNzIvNTQxMS82ODcgMzMxOC81NDEwLzY4NyAzMzE3LzU0MDkvNjg3CitmIDMzMTcvNTQwOS82ODcgMzA3MC81NDEyLzY4NyAzMTcyLzU0MTEvNjg3CitmIDMwNzAvNTQxMi82ODcgMzMxNy81NDA5LzY4NyAzMDYwLzU0NDUvNjg3CitmIDMwNjAvNTQ0NS82ODcgMzI4MS81NTcyLzY4NyAzMDcwLzU0MTIvNjg3CitmIDMzMTIvNTU5My82ODcgMzMyMC81MzQyLzY4NyAzMzE5LzUzNDEvNjg3CitmIDMzMTkvNTM0MS82ODcgMzMxMS81NTk0LzY4NyAzMzEyLzU1OTMvNjg3CitmIDMxNTMvNTM1Mi82ODcgMzMyMi81NTk1LzY4NyAzMzIxLzU1OTYvNjg3CitmIDMzMjEvNTU5Ni82ODcgMzA0Ni81MzUzLzY4NyAzMTUzLzUzNTIvNjg3CitmIDMzMjQvNTQwMi82ODcgMzMyMy81NDAxLzY4NyAzMzA5LzU1OTIvNjg3CitmIDMzMDkvNTU5Mi82ODcgMzMxMC81NTkxLzY4NyAzMzI0LzU0MDIvNjg3CitmIDMxNjcvNTM5Ni82ODcgMzMyNi81NTg1LzY4NyAzMzI1LzU1ODYvNjg3CitmIDMzMjUvNTU4Ni82ODcgMzA1OS81Mzk3LzY4NyAzMTY3LzUzOTYvNjg3CitmIDM0MTkvNTU5OS82ODcgMzMyOS81Mzc0LzY4NyAzMzI3LzUzNzMvNjg3CitmIDMzMjcvNTM3My82ODcgMzQxOC81NjAwLzY4NyAzNDE5LzU1OTkvNjg3CitmIDMxNjMvNTM4NC82ODcgMzMzMC81NjAxLzY4NyAzMzI4LzU2MDIvNjg3CitmIDMzMjgvNTYwMi82ODcgMzA1NS81Mzg1LzY4NyAzMTYzLzUzODQvNjg3CitmIDMzMzMvNTYwMy82ODcgMzMzMS81NjA0LzY4NyAzMDUwLzUzNjUvNjg3CitmIDMwNTAvNTM2NS82ODcgMzE1Ny81MzY0LzY4NyAzMzMzLzU2MDMvNjg3CitmIDMzMzQvNTM3MC82ODcgMzMzMi81MzY5LzY4NyAzNDE0LzU2MDUvNjg3CitmIDM0MTQvNTYwNS82ODcgMzQxNS81NjA2LzY4NyAzMzM0LzUzNzAvNjg3CitmIDMzMzkvNTM0Ni82ODcgMzMzNS81MzQ1LzY4NyAzMDQ1LzUzNDgvNjg3CitmIDMwNDUvNTM0OC82ODcgMzE1Mi81MzQ3LzY4NyAzMzM5LzUzNDYvNjg3CitmIDMxNTYvNTM1OS82ODcgMzM0MC81MzU1LzY4NyAzMzM2LzUzNTgvNjg3CitmIDMzMzYvNTM1OC82ODcgMzA0OS81MzYwLzY4NyAzMTU2LzUzNTkvNjg3CitmIDMzNDEvNTM3OC82ODcgMzMzNy81Mzc3LzY4NyAzMDU0LzUzODAvNjg3CitmIDMwNTQvNTM4MC82ODcgMzE2Mi81Mzc5LzY4NyAzMzQxLzUzNzgvNjg3CitmIDMxNjYvNTM5MS82ODcgMzM0Mi81Mzg3LzY4NyAzMzM4LzUzOTAvNjg3CitmIDMzMzgvNTM5MC82ODcgMzA1OC81MzkyLzY4NyAzMTY2LzUzOTEvNjg3CitmIDMwNjYvNTQ2Ni82ODcgMzIxMy81NDYyLzY4NyAzMDg1LzU1MDcvNjg3CitmIDMwODUvNTUwNy82ODcgMzQ0NS81NjA3LzY4NyAzMDY2LzU0NjYvNjg3CitmIDMyMzAvNTU0Mi82ODcgMzI2My81NTA4LzY4NyAzMDY1LzU0NjEvNjg3CitmIDMwNjUvNTQ2MS82ODcgMzIwOS81NDU4LzY4NyAzMjMwLzU1NDIvNjg3CitmIDMwODcvNTUxMy82ODcgMzA4Ni81NTEyLzY4NyAzMDY0LzU0NTcvNjg3CitmIDMwNjQvNTQ1Ny82ODcgMzQzMC81NjA4LzY4NyAzMDg3LzU1MTMvNjg3CitmIDMzMTkvNTM0MS82ODcgMzA0My81MzQwLzY4NyAzMzQzLzU1NzMvNjg3CitmIDMwNTkvNTM5Ny82ODcgMzM0NC81NTk4LzY4NyAzMzQzLzU1NzMvNjg3CitmIDMzNDMvNTU3My82ODcgMzA0My81MzQwLzY4NyAzMDU5LzUzOTcvNjg3CitmIDMzNDQvNTU5OC82ODcgMzA1OS81Mzk3LzY4NyAzMzI1LzU1ODYvNjg3CitmIDMzMzIvNTM2OS82ODcgMzA0Ny81MzY4LzY4NyAzMDQ2LzUzNTMvNjg3CitmIDMwNDYvNTM1My82ODcgMzMyMS81NTk2LzY4NyAzMzMyLzUzNjkvNjg3CitmIDMwNTIvNTM3Mi82ODcgMzA1MC81MzY1LzY4NyAzMzMxLzU2MDQvNjg3CitmIDMzMzEvNTYwNC82ODcgMzMyNy81MzczLzY4NyAzMDUyLzUzNzIvNjg3CitmIDMwNTYvNTQwMC82ODcgMzA1NS81Mzg1LzY4NyAzMzI4LzU2MDIvNjg3CitmIDMzMjgvNTYwMi82ODcgMzMyMy81NDAxLzY4NyAzMDU2LzU0MDAvNjg3CitmIDMzNDMvNTU3My82ODcgMzA2OS81NDA4LzY4NyAzMzExLzU1OTQvNjg3CitmIDMzMTEvNTU5NC82ODcgMzMxOS81MzQxLzY4NyAzMzQzLzU1NzMvNjg3CitmIDMwOTcvNTIwMy82ODcgMzM0Ny81MjAyLzY4NyAzMzQ1LzUyMDEvNjg3CitmIDMzNDUvNTIwMS82ODcgMjk5MC81MjA0LzY4NyAzMDk3LzUyMDMvNjg3CitmIDMxMTYvNTI0Ny82ODcgMzM0OC81MjQ2LzY4NyAzMzQ2LzUyNDUvNjg3CitmIDMzNDYvNTI0NS82ODcgMzAwOS81MjQ4LzY4NyAzMTE2LzUyNDcvNjg3CitmIDMxMTUvNTI0My82ODcgMzM1MS81MjQxLzY4NyAzMzUwLzUyNDIvNjg3CitmIDMzNTAvNTI0Mi82ODcgMzAwOC81MjQ0LzY4NyAzMTE1LzUyNDMvNjg3CitmIDMzNTIvNTI1MC82ODcgMzM0OS81MjQ5LzY4NyAzMDEwLzUyNTMvNjg3CitmIDMwMTAvNTI1My82ODcgMzExNy81MjUyLzY4NyAzMzUyLzUyNTAvNjg3CitmIDMzNTUvNTIwNi82ODcgMzM1My81MjA1LzY4NyAyOTkxLzUyMDkvNjg3CitmIDI5OTEvNTIwOS82ODcgMzA5OC81MjA4LzY4NyAzMzU1LzUyMDYvNjg3CitmIDMwOTYvNTE5OS82ODcgMzM1Ni81Mjg1LzY4NyAzMzU0LzUyODYvNjg3CitmIDMzNTQvNTI4Ni82ODcgMzAyNy81MjAwLzY4NyAzMDk2LzUxOTkvNjg3CitmIDI5OTcvNTIyMC82ODcgMzAwOC81MjQ0LzY4NyAzMzUwLzUyNDIvNjg3CitmIDMzNTAvNTI0Mi82ODcgMjk5OC81MjIyLzY4NyAyOTk3LzUyMjAvNjg3CitmIDMzNDYvNTI0NS82ODcgMzAwOC81MjQ0LzY4NyAyOTk3LzUyMjAvNjg3CitmIDI5OTcvNTIyMC82ODcgMjk5Ni81MjE4LzY4NyAzMzQ2LzUyNDUvNjg3CitmIDMwMDcvNTI0MC82ODcgMjk5OC81MjIyLzY4NyAzMzUwLzUyNDIvNjg3CitmIDMwMDEvNTIyOC82ODcgMzAwNC81MjM0LzY4NyAzMDAzLzUyMzIvNjg3CitmIDMwMDMvNTIzMi82ODcgMzAwMi81MjMwLzY4NyAzMDAxLzUyMjgvNjg3CitmIDMwMDAvNTIyNi82ODcgMzAwNS81MjM2LzY4NyAzMDA0LzUyMzQvNjg3CitmIDMwMDQvNTIzNC82ODcgMzAwMS81MjI4LzY4NyAzMDAwLzUyMjYvNjg3CitmIDI5OTkvNTIyNC82ODcgMzAwNi81MjM4LzY4NyAzMDA1LzUyMzYvNjg3CitmIDMwMDUvNTIzNi82ODcgMzAwMC81MjI2LzY4NyAyOTk5LzUyMjQvNjg3CitmIDI5OTgvNTIyMi82ODcgMzAwNy81MjQwLzY4NyAzMDA2LzUyMzgvNjg3CitmIDMwMDYvNTIzOC82ODcgMjk5OS81MjI0LzY4NyAyOTk4LzUyMjIvNjg3CitmIDMwMTYvNTI2NC82ODcgMzAyNy81MjAwLzY4NyAzMzU0LzUyODYvNjg3CitmIDMzNTQvNTI4Ni82ODcgMzAxNy81MjY2LzY4NyAzMDE2LzUyNjQvNjg3CitmIDMzNDUvNTIwMS82ODcgMzAyNy81MjAwLzY4NyAzMDE2LzUyNjQvNjg3CitmIDMwMTYvNTI2NC82ODcgMzY4NC81NjA5LzY4NyAzMzQ1LzUyMDEvNjg3CitmIDMwMjYvNTI4NC82ODcgMzAxNy81MjY2LzY4NyAzMzU0LzUyODYvNjg3CitmIDMwMjAvNTI3Mi82ODcgMzAyMy81Mjc4LzY4NyAzMDIyLzUyNzYvNjg3CitmIDMwMjIvNTI3Ni82ODcgMzAyMS81Mjc0LzY4NyAzMDIwLzUyNzIvNjg3CitmIDMwMTkvNTI3MC82ODcgMzAyNC81MjgwLzY4NyAzMDIzLzUyNzgvNjg3CitmIDMwMjMvNTI3OC82ODcgMzAyMC81MjcyLzY4NyAzMDE5LzUyNzAvNjg3CitmIDMwMTgvNTI2OC82ODcgMzAyNS81MjgyLzY4NyAzMDI0LzUyODAvNjg3CitmIDMwMjQvNTI4MC82ODcgMzAxOS81MjcwLzY4NyAzMDE4LzUyNjgvNjg3CitmIDMwMTcvNTI2Ni82ODcgMzAyNi81Mjg0LzY4NyAzMDI1LzUyODIvNjg3CitmIDMwMjUvNTI4Mi82ODcgMzAxOC81MjY4LzY4NyAzMDE3LzUyNjYvNjg3CitmIDMxNDgvNTMzMS82ODcgMzM1OS81MzMwLzY4NyAzMzU3LzUzMjkvNjg3CitmIDMzNTcvNTMyOS82ODcgMzA0Mi81MzMyLzY4NyAzMTQ4LzUzMzEvNjg3CitmIDMxNDYvNTMyMy82ODcgMzM2MC81MzM4LzY4NyAzMzU4LzUzMzcvNjg3CitmIDMzNTgvNTMzNy82ODcgMzA0MC81MzI0LzY4NyAzMTQ2LzUzMjMvNjg3CitmIDMxMzUvNTI5MS82ODcgMzM2My81MjkwLzY4NyAzMzYxLzUyODkvNjg3CitmIDMzNjEvNTI4OS82ODcgMzIyNC81MjkyLzY4NyAzMTM1LzUyOTEvNjg3CitmIDMxNDEvNTMwOS82ODcgMzM2NC81MzA4LzY4NyAzMzYyLzUzMDcvNjg3CitmIDMzNjIvNTMwNy82ODcgMzAyOS81MzEwLzY4NyAzMTQxLzUzMDkvNjg3CitmIDMzNjUvNTUzMC82ODcgMzM2MS81Mjg5LzY4NyAzMDM0LzUyODgvNjg3CitmIDMwMzQvNTI4OC82ODcgMzIyOS81NTM3LzY4NyAzMzY1LzU1MzAvNjg3CitmIDMzNjcvNTUzNS82ODcgMzM2Ni81NTM0LzY4NyAzMjIzLzU1MjgvNjg3CitmIDMyMjMvNTUyOC82ODcgMzIyNS81NTI3LzY4NyAzMzY3LzU1MzUvNjg3CitmIDMzNzAvNTI5NC82ODcgMzM2OC81MjkzLzY4NyAzMDM1LzUyOTcvNjg3CitmIDMwMzUvNTI5Ny82ODcgMzEzNi81Mjk2LzY4NyAzMzcwLzUyOTQvNjg3CitmIDMxMzQvNTI4Ny82ODcgMzM3MS81MzIxLzY4NyAzMzY5LzUzMjIvNjg3CitmIDMzNjkvNTMyMi82ODcgMzAzNC81Mjg4LzY4NyAzMTM0LzUyODcvNjg3CitmIDMzNzMvNTMyNi82ODcgMzM3Mi81MzI1LzY4NyAzMjI3LzU1MzMvNjg3CitmIDMyMjcvNTUzMy82ODcgMzIyOC81NTMyLzY4NyAzMzczLzUzMjYvNjg3CitmIDMxNDkvNTMzNS82ODcgMzM3NS81NTM2LzY4NyAzMzc0LzU1MzgvNjg3CitmIDMzNzQvNTUzOC82ODcgMzAzOS81MzM2LzY4NyAzMTQ5LzUzMzUvNjg3CitmIDMwMzMvNTMyMC82ODcgMzQzOS81NjEwLzY4NyAzMDM5LzUzMzYvNjg3CitmIDMwMzkvNTMzNi82ODcgMzM3NC81NTM4LzY4NyAzMDMzLzUzMjAvNjg3CitmIDMwMzQvNTI4OC82ODcgMzM2OS81MzIyLzY4NyAzMzc0LzU1MzgvNjg3CitmIDMzNzcvNTMzNC82ODcgMzM3Ni81MzMzLzY4NyAzMzk3LzU2MTEvNjg3CitmIDMzOTcvNTYxMS82ODcgMzM5OC81NjEyLzY4NyAzMzc3LzUzMzQvNjg3CitmIDMxNDcvNTMyNy82ODcgMzM3OS81NjEzLzY4NyAzMzc4LzU2MTQvNjg3CitmIDMzNzgvNTYxNC82ODcgMzA0MS81MzI4LzY4NyAzMTQ3LzUzMjcvNjg3CitmIDM0MDAvNTYxNS82ODcgMzM4MS81NTI2LzY4NyAzMzgwLzU1MjkvNjg3CitmIDMzODAvNTUyOS82ODcgMzM5OS81NjE2LzY4NyAzNDAwLzU2MTUvNjg3CitmIDMzODMvNTYxNy82ODcgMzM4Mi81NjE4LzY4NyAzMjI0LzUyOTIvNjg3CitmIDMyMjQvNTI5Mi82ODcgMzIyNi81NTMxLzY4NyAzMzgzLzU2MTcvNjg3CitmIDMzODUvNTMxMi82ODcgMzM4NC81MzExLzY4NyAzNDAxLzU2MTkvNjg3CitmIDM0MDEvNTYxOS82ODcgMzQwMi81NjIwLzY4NyAzMzg1LzUzMTIvNjg3CitmIDMxNDAvNTMwNS82ODcgMzM4Ny81NjIxLzY4NyAzMzg2LzU2MjIvNjg3CitmIDMzODYvNTYyMi82ODcgMzAyOC81MzA2LzY4NyAzMTQwLzUzMDUvNjg3CitmIDM0MDMvNTYyMy82ODcgMzM5MC81NjI0LzY4NyAzMzg2LzU2MjIvNjg3CitmIDMzODYvNTYyMi82ODcgMzM5NS81NTQ0LzY4NyAzNDAzLzU2MjMvNjg3CitmIDM0MDQvNTYyNS82ODcgMzM4OS81NjI2LzY4NyAzMzkwLzU2MjQvNjg3CitmIDMzOTAvNTYyNC82ODcgMzQwMy81NjIzLzY4NyAzNDA0LzU2MjUvNjg3CitmIDM0MDUvNTYyNy82ODcgMzM5NC81NjI4LzY4NyAzMzgyLzU2MTgvNjg3CitmIDMzODIvNTYxOC82ODcgMzM5Ny81NjExLzY4NyAzNDA1LzU2MjcvNjg3CitmIDM0MDQvNTYyNS82ODcgMzM5My81NjI5LzY4NyAzMzk0LzU2MjgvNjg3CitmIDMzOTQvNTYyOC82ODcgMzQwNS81NjI3LzY4NyAzNDA0LzU2MjUvNjg3CitmIDM0MjYvNTYzMC82ODcgMzM4OC81NjMxLzY4NyAzMzc2LzUzMzMvNjg3CitmIDMzNzYvNTMzMy82ODcgMzA0Mi81MzMyLzY4NyAzNDI2LzU2MzAvNjg3CitmIDM0MzUvNTYzMi82ODcgMzM4OS81NjI2LzY4NyAzMzg4LzU2MzEvNjg3CitmIDMzODgvNTYzMS82ODcgMzQyNi81NjMwLzY4NyAzNDM1LzU2MzIvNjg3CitmIDMzOTAvNTYyNC82ODcgMzQzNi81NjMzLzY4NyAzMDI4LzUzMDYvNjg3CitmIDMwMjgvNTMwNi82ODcgMzM4Ni81NjIyLzY4NyAzMzkwLzU2MjQvNjg3CitmIDMzODkvNTYyNi82ODcgMzQzNS81NjMyLzY4NyAzNDM2LzU2MzMvNjg3CitmIDM0MzYvNTYzMy82ODcgMzM5MC81NjI0LzY4NyAzMzg5LzU2MjYvNjg3CitmIDMzNjgvNTI5My82ODcgMzIyNC81MjkyLzY4NyAzMzgyLzU2MTgvNjg3CitmIDMzODIvNTYxOC82ODcgMzM5NC81NjI4LzY4NyAzMzY4LzUyOTMvNjg3CitmIDMwMzgvNTMwMi82ODcgMzAzNy81MzAwLzY4NyAzMzkxLzU2MzQvNjg3CitmIDMzOTEvNTYzNC82ODcgMzIzNS81MzA0LzY4NyAzMDM4LzUzMDIvNjg3CitmIDMwMzYvNTI5OC82ODcgMzM5Mi81NjM1LzY4NyAzMzkxLzU2MzQvNjg3CitmIDMzOTEvNTYzNC82ODcgMzAzNy81MzAwLzY4NyAzMDM2LzUyOTgvNjg3CitmIDMwMzUvNTI5Ny82ODcgMzM5My81NjI5LzY4NyAzMzkyLzU2MzUvNjg3CitmIDMzOTIvNTYzNS82ODcgMzAzNi81Mjk4LzY4NyAzMDM1LzUyOTcvNjg3CitmIDMzNjgvNTI5My82ODcgMzM5NC81NjI4LzY4NyAzMzkzLzU2MjkvNjg3CitmIDMzOTMvNTYyOS82ODcgMzAzNS81Mjk3LzY4NyAzMzY4LzUyOTMvNjg3CitmIDMzODcvNTYyMS82ODcgMzM5Ni81NTQzLzY4NyAzMzk1LzU1NDQvNjg3CitmIDMzOTUvNTU0NC82ODcgMzM4Ni81NjIyLzY4NyAzMzg3LzU2MjEvNjg3CitmIDMzOTgvNTYxMi82ODcgMzM5Ny81NjExLzY4NyAzMzgyLzU2MTgvNjg3CitmIDMzODIvNTYxOC82ODcgMzM4My81NjE3LzY4NyAzMzk4LzU2MTIvNjg3CitmIDMzNzkvNTYxMy82ODcgMzQwMC81NjE1LzY4NyAzMzk5LzU2MTYvNjg3CitmIDMzOTkvNTYxNi82ODcgMzM3OC81NjE0LzY4NyAzMzc5LzU2MTMvNjg3CitmIDM0MDIvNTYyMC82ODcgMzQwMS81NjE5LzY4NyAzMjM0LzU1NDYvNjg3CitmIDMyMzQvNTU0Ni82ODcgMzIzNy81NTQ1LzY4NyAzNDAyLzU2MjAvNjg3CitmIDM0MDQvNTYyNS82ODcgMzM5Mi81NjM1LzY4NyAzMzkzLzU2MjkvNjg3CitmIDM0MDMvNTYyMy82ODcgMzM5NS81NTQ0LzY4NyAzMjM1LzUzMDQvNjg3CitmIDMyMzUvNTMwNC82ODcgMzM5MS81NjM0LzY4NyAzNDAzLzU2MjMvNjg3CitmIDM0MDQvNTYyNS82ODcgMzQwMy81NjIzLzY4NyAzMzkxLzU2MzQvNjg3CitmIDMzOTEvNTYzNC82ODcgMzM5Mi81NjM1LzY4NyAzNDA0LzU2MjUvNjg3CitmIDM0MDUvNTYyNy82ODcgMzM5Ny81NjExLzY4NyAzMzc2LzUzMzMvNjg3CitmIDMzNzYvNTMzMy82ODcgMzM4OC81NjMxLzY4NyAzNDA1LzU2MjcvNjg3CitmIDM0MDQvNTYyNS82ODcgMzQwNS81NjI3LzY4NyAzMzg4LzU2MzEvNjg3CitmIDMzODgvNTYzMS82ODcgMzM4OS81NjI2LzY4NyAzNDA0LzU2MjUvNjg3CitmIDMwMTQvNTI2MC82ODcgMzM3OC81NjE0LzY4NyAzMzk5LzU2MTYvNjg3CitmIDMzOTkvNTYxNi82ODcgMzAxNS81MjYyLzY4NyAzMDE0LzUyNjAvNjg3CitmIDMwNDEvNTMyOC82ODcgMzM3OC81NjE0LzY4NyAzMDEzLzUyNTgvNjg3CitmIDMwMTMvNTI1OC82ODcgMzQyNC81NjM2LzY4NyAzMDQxLzUzMjgvNjg3CitmIDMzODAvNTUyOS82ODcgMzIyMy81NTI4LzY4NyAyOTkwLzUyMDQvNjg3CitmIDMzNzIvNTMyNS82ODcgMjk5Mi81MjEwLzY4NyAyOTkxLzUyMDkvNjg3CitmIDI5OTEvNTIwOS82ODcgMzIyNy81NTMzLzY4NyAzMzcyLzUzMjUvNjg3CitmIDMzNjYvNTUzNC82ODcgMzIyNy81NTMzLzY4NyAyOTkxLzUyMDkvNjg3CitmIDI5OTEvNTIwOS82ODcgMzM1My81MjA1LzY4NyAzMzY2LzU1MzQvNjg3CitmIDI5OTAvNTIwNC82ODcgMzM0NS81MjAxLzY4NyAzNjg0LzU2MDkvNjg3CitmIDM2ODQvNTYwOS82ODcgMzM4MC81NTI5LzY4NyAyOTkwLzUyMDQvNjg3CitmIDMzNTMvNTIwNS82ODcgMjk5MC81MjA0LzY4NyAzMjIzLzU1MjgvNjg3CitmIDMyMjMvNTUyOC82ODcgMzM2Ni81NTM0LzY4NyAzMzUzLzUyMDUvNjg3CitmIDM0MDcvNTM4Mi82ODcgMzQwNi81MzgxLzY4NyAzNDIwLzU2MzcvNjg3CitmIDM0MjAvNTYzNy82ODcgMzQyMS81NjM4LzY4NyAzNDA3LzUzODIvNjg3CitmIDMxNjEvNTM3NS82ODcgMzQwOS81NjM5LzY4NyAzNDA4LzU2NDAvNjg3CitmIDM0MDgvNTY0MC82ODcgMzA1My81Mzc2LzY4NyAzMTYxLzUzNzUvNjg3CitmIDMzODQvNTMxMS82ODcgMzAyOS81MzEwLzY4NyAzMDUzLzUzNzYvNjg3CitmIDMwNTMvNTM3Ni82ODcgMzQwOC81NjQwLzY4NyAzMzg0LzUzMTEvNjg3CitmIDM0MTEvNTM2Mi82ODcgMzQxMC81MzYxLzY4NyAzNDE2LzU2NDEvNjg3CitmIDM0MTYvNTY0MS82ODcgMzQxNy81NjQyLzY4NyAzNDExLzUzNjIvNjg3CitmIDMxNTUvNTM1Ni82ODcgMzQxMy81NjQzLzY4NyAzNDEyLzU2NDQvNjg3CitmIDM0MTIvNTY0NC82ODcgMzA0OC81MzU3LzY4NyAzMTU1LzUzNTYvNjg3CitmIDM0MTAvNTM2MS82ODcgMzA0OS81MzYwLzY4NyAzMDMxLzUzMTYvNjg3CitmIDMzMjcvNTM3My82ODcgMzMzMS81NjA0LzY4NyAzMjM0LzU1NDYvNjg3CitmIDMyMzQvNTU0Ni82ODcgMzQwMS81NjE5LzY4NyAzMzI3LzUzNzMvNjg3CitmIDMzMjcvNTM3My82ODcgMzQwMS81NjE5LzY4NyAzNDE4LzU2MDAvNjg3CitmIDM0MTMvNTY0My82ODcgMzQxNS81NjA2LzY4NyAzNDE0LzU2MDUvNjg3CitmIDM0MTQvNTYwNS82ODcgMzQxMi81NjQ0LzY4NyAzNDEzLzU2NDMvNjg3CitmIDM0MTcvNTY0Mi82ODcgMzQxNi81NjQxLzY4NyAzMzMxLzU2MDQvNjg3CitmIDMzMzEvNTYwNC82ODcgMzMzMy81NjAzLzY4NyAzNDE3LzU2NDIvNjg3CitmIDM0MTAvNTM2MS82ODcgMzAzMS81MzE2LzY4NyAzMDMwLzUzMTUvNjg3CitmIDMwMzAvNTMxNS82ODcgMzQxNi81NjQxLzY4NyAzNDEwLzUzNjEvNjg3CitmIDMzMzEvNTYwNC82ODcgMzQxNi81NjQxLzY4NyAzMDMwLzUzMTUvNjg3CitmIDMwMzAvNTMxNS82ODcgMzIzNC81NTQ2LzY4NyAzMzMxLzU2MDQvNjg3CitmIDM0NjEvNTY0NS82ODcgMzA0OC81MzU3LzY4NyAzNDEyLzU2NDQvNjg3CitmIDM0MTIvNTY0NC82ODcgMzQ2MC81NjQ2LzY4NyAzNDYxLzU2NDUvNjg3CitmIDMzMTMvNTU4My82ODcgMzMwMi81MzQ5LzY4NyAzNDU3LzU2NDcvNjg3CitmIDM0NTcvNTY0Ny82ODcgMzQ1OS81NjQ4LzY4NyAzMzEzLzU1ODMvNjg3CitmIDM0MTQvNTYwNS82ODcgMzMzMi81MzY5LzY4NyAzNDYyLzU2NDkvNjg3CitmIDM0MjcvNTY1MC82ODcgMzA1Ny81Mzg5LzY4NyAzMzA2LzU1ODgvNjg3CitmIDMzMDYvNTU4OC82ODcgMzY5MC81NjUxLzY4NyAzNDI3LzU2NTAvNjg3CitmIDM2OTAvNTY1MS82ODcgMzMwNi81NTg4LzY4NyAzMzA5LzU1OTIvNjg3CitmIDMzMDkvNTU5Mi82ODcgMzQ1NS81NjUyLzY4NyAzNjkwLzU2NTEvNjg3CitmIDM0MDkvNTYzOS82ODcgMzQxOS81NTk5LzY4NyAzNDE4LzU2MDAvNjg3CitmIDM0MTgvNTYwMC82ODcgMzQwOC81NjQwLzY4NyAzNDA5LzU2MzkvNjg3CitmIDMzMzAvNTYwMS82ODcgMzQyMS81NjM4LzY4NyAzNDIwLzU2MzcvNjg3CitmIDM0MjAvNTYzNy82ODcgMzMyOC81NjAyLzY4NyAzMzMwLzU2MDEvNjg3CitmIDM0MDgvNTY0MC82ODcgMzQxOC81NjAwLzY4NyAzNDAxLzU2MTkvNjg3CitmIDM0MDEvNTYxOS82ODcgMzM4NC81MzExLzY4NyAzNDA4LzU2NDAvNjg3CitmIDMzMDkvNTU5Mi82ODcgMzMyMy81NDAxLzY4NyAzNDU1LzU2NTIvNjg3CitmIDM0NjQvNTY1My82ODcgMzQyMi81NjU0LzY4NyAzMDExLzUyNTQvNjg3CitmIDMwMTEvNTI1NC82ODcgMzAxMC81MjUzLzY4NyAzNDY0LzU2NTMvNjg3CitmIDM0MjIvNTY1NC82ODcgMzQyMy81NjU1LzY4NyAzMDEyLzUyNTYvNjg3CitmIDMwMTIvNTI1Ni82ODcgMzAxMS81MjU0LzY4NyAzNDIyLzU2NTQvNjg3CitmIDM0MjMvNTY1NS82ODcgMzQyNC81NjM2LzY4NyAzMDEzLzUyNTgvNjg3CitmIDMwMTMvNTI1OC82ODcgMzAxMi81MjU2LzY4NyAzNDIzLzU2NTUvNjg3CitmIDM0MzYvNTYzMy82ODcgMzQzNC81NjU2LzY4NyAzMzYyLzUzMDcvNjg3CitmIDMzNjIvNTMwNy82ODcgMzAyOC81MzA2LzY4NyAzNDM2LzU2MzMvNjg3CitmIDM0MjQvNTYzNi82ODcgMzQzMy81NjU3LzY4NyAzMzU3LzUzMjkvNjg3CitmIDMzNTcvNTMyOS82ODcgMzA0MS81MzI4LzY4NyAzNDI0LzU2MzYvNjg3CitmIDM0MjUvNTY1OC82ODcgMzMzNy81Mzc3LzY4NyAzMDUzLzUzNzYvNjg3CitmIDMwNTMvNTM3Ni82ODcgMzAyOS81MzEwLzY4NyAzNDI1LzU2NTgvNjg3CitmIDM0MjkvNTY1OS82ODcgMzQzMC81NjA4LzY4NyAzMDY0LzU0NTcvNjg3CitmIDMwNjQvNTQ1Ny82ODcgMzA2My81NDU1LzY4NyAzNDI5LzU2NTkvNjg3CitmIDM0MjgvNTU4OS82ODcgMzQyOS81NjU5LzY4NyAzMDYzLzU0NTUvNjg3CitmIDMwNjMvNTQ1NS82ODcgMzA2Mi81NDUzLzY4NyAzNDI4LzU1ODkvNjg3CitmIDM0MzIvNTU1My82ODcgMzY4Ny81NjYwLzY4NyAzMjQ3LzU0NzgvNjg3CitmIDMyNDcvNTQ3OC82ODcgMzA4MC81NDc3LzY4NyAzNDMyLzU1NTMvNjg3CitmIDM2ODgvNTY2MS82ODcgMzQzMi81NTUzLzY4NyAzMDg5LzU1MTcvNjg3CitmIDMwODkvNTUxNy82ODcgMzA4OC81NTE1LzY4NyAzNjg4LzU2NjEvNjg3CitmIDM0MzAvNTYwOC82ODcgMzY4OC81NjYxLzY4NyAzMDg4LzU1MTUvNjg3CitmIDMwODgvNTUxNS82ODcgMzA4Ny81NTEzLzY4NyAzNDMwLzU2MDgvNjg3CitmIDM2ODcvNTY2MC82ODcgMzQzMS81NjYyLzY4NyAzMDgxLzU0ODEvNjg3CitmIDMwODEvNTQ4MS82ODcgMzI0Ny81NDc4LzY4NyAzNjg3LzU2NjAvNjg3CitmIDM0MzMvNTY1Ny82ODcgMzQyNi81NjMwLzY4NyAzMDQyLzUzMzIvNjg3CitmIDMwNDIvNTMzMi82ODcgMzM1Ny81MzI5LzY4NyAzNDMzLzU2NTcvNjg3CitmIDM0MzQvNTY1Ni82ODcgMzQyNS81NjU4LzY4NyAzMDI5LzUzMTAvNjg3CitmIDMwMjkvNTMxMC82ODcgMzM2Mi81MzA3LzY4NyAzNDM0LzU2NTYvNjg3CitmIDM0NDAvNTY2My82ODcgMzQzNy81NjY0LzY4NyAyOTkzLzUyMTIvNjg3CitmIDI5OTMvNTIxMi82ODcgMjk5Mi81MjEwLzY4NyAzNDQwLzU2NjMvNjg3CitmIDM0NDIvNTY2NS82ODcgMzQzOS81NjEwLzY4NyAzMDMzLzUzMjAvNjg3CitmIDMwMzMvNTMyMC82ODcgMzAzMi81MzE4LzY4NyAzNDQyLzU2NjUvNjg3CitmIDM0MzkvNTYxMC82ODcgMzQ1MC81NjY2LzY4NyAzMzU4LzUzMzcvNjg3CitmIDMzNTgvNTMzNy82ODcgMzAzOS81MzM2LzY4NyAzNDM5LzU2MTAvNjg3CitmIDM0NDMvNTU5Ny82ODcgMzQ0OS81NjY3LzY4NyAzMzM1LzUzNDUvNjg3CitmIDMzMzUvNTM0NS82ODcgMzA0NC81MzQ0LzY4NyAzNDQzLzU1OTcvNjg3CitmIDMzMzYvNTM1OC82ODcgMzA0OC81MzU3LzY4NyAzNDQxLzU2NjgvNjg3CitmIDM0NDUvNTYwNy82ODcgMzQ0My81NTk3LzY4NyAzMDY3LzU0NjcvNjg3CitmIDMwNjcvNTQ2Ny82ODcgMzA2Ni81NDY2LzY4NyAzNDQ1LzU2MDcvNjg3CitmIDM0NTEvNTY2OS82ODcgMzQ0Ni81NjcwLzY4NyAzMjQ2LzU0NzAvNjg3CitmIDMyNDYvNTQ3MC82ODcgMzA4Mi81NDY5LzY4NyAzNDUxLzU2NjkvNjg3CitmIDM0NDgvNTU1OS82ODcgMzQ0Ny81NjcxLzY4NyAzMjU1LzU1MDQvNjg3CitmIDMyNTUvNTUwNC82ODcgMzA4NC81NTAzLzY4NyAzNDQ4LzU1NTkvNjg3CitmIDM0NDYvNTY3MC82ODcgMzQ0NC81NTU4LzY4NyAzMDgzLzU0NzMvNjg3CitmIDMwODMvNTQ3My82ODcgMzI0Ni81NDcwLzY4NyAzNDQ2LzU2NzAvNjg3CitmIDM0NDcvNTY3MS82ODcgMzQ0NS81NjA3LzY4NyAzMDg1LzU1MDcvNjg3CitmIDMwODUvNTUwNy82ODcgMzI1NS81NTA0LzY4NyAzNDQ3LzU2NzEvNjg3CitmIDMwNDUvNTM0OC82ODcgMzMzNS81MzQ1LzY4NyAzNDQ5LzU2NjcvNjg3CitmIDM0NDEvNTY2OC82ODcgMzQ0Mi81NjY1LzY4NyAzMDQ5LzUzNjAvNjg3CitmIDMwNDkvNTM2MC82ODcgMzMzNi81MzU4LzY4NyAzNDQxLzU2NjgvNjg3CitmIDM0NTAvNTY2Ni82ODcgMzQ0MC81NjYzLzY4NyAzMDQwLzUzMjQvNjg3CitmIDMwNDAvNTMyNC82ODcgMzM1OC81MzM3LzY4NyAzNDUwLzU2NjYvNjg3CitmIDMwNDgvNTM1Ny82ODcgMzQ2MS81NjQ1LzY4NyAzNDQxLzU2NjgvNjg3CitmIDMwMzIvNTMxOC82ODcgMzAzMS81MzE2LzY4NyAzMDQ5LzUzNjAvNjg3CitmIDMwNDkvNTM2MC82ODcgMzQ0Mi81NjY1LzY4NyAzMDMyLzUzMTgvNjg3CitmIDMzNzQvNTUzOC82ODcgMzM2OS81MzIyLzY4NyAzMDMzLzUzMjAvNjg3CitmIDI5OTIvNTIxMC82ODcgMzM3Mi81MzI1LzY4NyAzMDQwLzUzMjQvNjg3CitmIDMwNDAvNTMyNC82ODcgMzQ0MC81NjYzLzY4NyAyOTkyLzUyMTAvNjg3CitmIDMyNzcvNTQwNi82ODcgMzMwMS81NTgyLzY4NyAzMzExLzU1OTQvNjg3CitmIDMzMTEvNTU5NC82ODcgMzA2OS81NDA4LzY4NyAzMjc3LzU0MDYvNjg3CitmIDM0MzEvNTY2Mi82ODcgMzQ1My81NjcyLzY4NyAzMjM4LzU0ODIvNjg3CitmIDMyMzgvNTQ4Mi82ODcgMzA4MS81NDgxLzY4NyAzNDMxLzU2NjIvNjg3CitmIDM0NTMvNTY3Mi82ODcgMzQ1Mi81NjczLzY4NyAzMjU5LzU1NDcvNjg3CitmIDMyNTkvNTU0Ny82ODcgMzIzOC81NDgyLzY4NyAzNDUzLzU2NzIvNjg3CitmIDM0NTQvNTY3NC82ODcgMzQ1MS81NjY5LzY4NyAzMDgyLzU0NjkvNjg3CitmIDMwODIvNTQ2OS82ODcgMzI0NC81NTUyLzY4NyAzNDU0LzU2NzQvNjg3CitmIDM0NTQvNTY3NC82ODcgMzI0NC81NTUyLzY4NyAzMjU5LzU1NDcvNjg3CitmIDMyNTkvNTU0Ny82ODcgMzQ1Mi81NjczLzY4NyAzNDU0LzU2NzQvNjg3CitmIDMyNjMvNTUwOC82ODcgMzA4NS81NTA3LzY4NyAzMjEzLzU0NjIvNjg3CitmIDMyMTMvNTQ2Mi82ODcgMzA2NS81NDYxLzY4NyAzMjYzLzU1MDgvNjg3CitmIDMzNzgvNTYxNC82ODcgMzAxNC81MjYwLzY4NyAzMDEzLzUyNTgvNjg3CitmIDM0MjUvNTY1OC82ODcgMzQ1Ni81Njc1LzY4NyAzMDU0LzUzODAvNjg3CitmIDMwNTQvNTM4MC82ODcgMzMzNy81Mzc3LzY4NyAzNDI1LzU2NTgvNjg3CitmIDM2OTAvNTY1MS82ODcgMzQ1NS81NjUyLzY4NyAzNDIwLzU2MzcvNjg3CitmIDM0MjAvNTYzNy82ODcgMzQwNi81MzgxLzY4NyAzNjkwLzU2NTEvNjg3CitmIDMzMjgvNTYwMi82ODcgMzQyMC81NjM3LzY4NyAzNDU1LzU2NTIvNjg3CitmIDMzMjMvNTQwMS82ODcgMzMyOC81NjAyLzY4NyAzNDU1LzU2NTIvNjg3CitmIDMyNDAvNTUyNS82ODcgMzI1MS81NTE4LzY4NyAzMDg5LzU1MTcvNjg3CitmIDMyMDkvNTQ1OC82ODcgMzA2NC81NDU3LzY4NyAzMDg2LzU1MTIvNjg3CitmIDMwODYvNTUxMi82ODcgMzIzMC81NTQyLzY4NyAzMjA5LzU0NTgvNjg3CitmIDM0NTgvNTY3Ni82ODcgMzQ1Ny81NjQ3LzY4NyAzMzAyLzUzNDkvNjg3CitmIDMzMDIvNTM0OS82ODcgMzA0NS81MzQ4LzY4NyAzNDU4LzU2NzYvNjg3CitmIDM0MTQvNTYwNS82ODcgMzQ2Mi81NjQ5LzY4NyAzNDYwLzU2NDYvNjg3CitmIDM0NjAvNTY0Ni82ODcgMzQxMi81NjQ0LzY4NyAzNDE0LzU2MDUvNjg3CitmIDM0NTgvNTY3Ni82ODcgMzA0NS81MzQ4LzY4NyAzNDQ5LzU2NjcvNjg3CitmIDM0NTgvNTY3Ni82ODcgMzQ2MS81NjQ1LzY4NyAzNDYwLzU2NDYvNjg3CitmIDM0NjAvNTY0Ni82ODcgMzQ1Ny81NjQ3LzY4NyAzNDU4LzU2NzYvNjg3CitmIDM0NjIvNTY0OS82ODcgMzQ1OS81NjQ4LzY4NyAzNDU3LzU2NDcvNjg3CitmIDM0NTcvNTY0Ny82ODcgMzQ2MC81NjQ2LzY4NyAzNDYyLzU2NDkvNjg3CitmIDMzMjEvNTU5Ni82ODcgMzMxMy81NTgzLzY4NyAzNDU5LzU2NDgvNjg3CitmIDM0NjIvNTY0OS82ODcgMzMzMi81MzY5LzY4NyAzMzIxLzU1OTYvNjg3CitmIDMzMjEvNTU5Ni82ODcgMzQ1OS81NjQ4LzY4NyAzNDYyLzU2NDkvNjg3CitmIDM0NjMvNTY3Ny82ODcgMzM0OS81MjQ5LzY4NyAzMDA5LzUyNDgvNjg3CitmIDMwMDkvNTI0OC82ODcgMzQ2NS81Njc4LzY4NyAzNDYzLzU2NzcvNjg3CitmIDM0MzgvNTY3OS82ODcgMjk5NS81MjE2LzY4NyAyOTk0LzUyMTQvNjg3CitmIDI5OTQvNTIxNC82ODcgMzY5My81NjgwLzY4NyAzNDM4LzU2NzkvNjg3CitmIDM0NjQvNTY1My82ODcgMzAxMC81MjUzLzY4NyAzMzQ5LzUyNDkvNjg3CitmIDMzNDkvNTI0OS82ODcgMzQ2My81Njc3LzY4NyAzNDY0LzU2NTMvNjg3CitmIDM2ODcvNTY2MC82ODcgMzQ2Ni81NjgxLzY4NyAyOTg1LzU2ODIvNjg3CitmIDI5ODUvNTY4Mi82ODcgMzQzMS81NjYyLzY4NyAzNjg3LzU2NjAvNjg3CitmIDM0MjYvNTYzMC82ODcgMzQzMy81NjU3LzY4NyAyOTg4LzU2ODMvNjg3CitmIDM0MzgvNTY3OS82ODcgMzQ2NS81Njc4LzY4NyAyOTk2LzUyMTgvNjg3CitmIDI5OTYvNTIxOC82ODcgMjk5NS81MjE2LzY4NyAzNDM4LzU2NzkvNjg3CitmIDI5OTYvNTIxOC82ODcgMzQ2NS81Njc4LzY4NyAzMDA5LzUyNDgvNjg3CitmIDMwMDkvNTI0OC82ODcgMzM0Ni81MjQ1LzY4NyAyOTk2LzUyMTgvNjg3CitmIDI5ODgvNTY4My82ODcgMjk4Ny81Njg0LzY4NyAzNDM1LzU2MzIvNjg3CitmIDM0MzUvNTYzMi82ODcgMzQyNi81NjMwLzY4NyAyOTg4LzU2ODMvNjg3CitmIDM0MjkvNTY1OS82ODcgMzY4OS81Njg1LzY4NyAzNDY3LzU2ODYvNjg3CitmIDM0NjcvNTY4Ni82ODcgMzQzMC81NjA4LzY4NyAzNDI5LzU2NTkvNjg3CitmIDM0NjcvNTY4Ni82ODcgMzY4OC81NjYxLzY4NyAzNDMwLzU2MDgvNjg3CitmIDM0NjYvNTY4MS82ODcgMzY4Ny81NjYwLzY4NyAzNDMyLzU1NTMvNjg3CitmIDM0NjgvNTY4Ny82ODcgMzY5MS81NTkwLzY4NyAzNDI3LzU2NTAvNjg3CitmIDM0NTYvNTY3NS82ODcgMzQ2OS81Njg4LzY4NyAzNDY4LzU2ODcvNjg3CitmIDM0NjgvNTY4Ny82ODcgMzQyNy81NjUwLzY4NyAzNDU2LzU2NzUvNjg3CitmIDM0NTYvNTY3NS82ODcgMzQyNS81NjU4LzY4NyAzNDcwLzU2ODkvNjg3CitmIDM0NzAvNTY4OS82ODcgMzQ2OS81Njg4LzY4NyAzNDU2LzU2NzUvNjg3CitmIDM0NzAvNTY4OS82ODcgMzQyNS81NjU4LzY4NyAzNDM0LzU2NTYvNjg3CitmIDM0MzQvNTY1Ni82ODcgMzQzNi81NjMzLzY4NyAyOTg3LzU2ODQvNjg3CitmIDI5ODcvNTY4NC82ODcgMzQ3MC81Njg5LzY4NyAzNDM0LzU2NTYvNjg3CitmIDI5ODcvNTY4NC82ODcgMzQzNi81NjMzLzY4NyAzNDM1LzU2MzIvNjg3CitmIDM0NzEvNTY5MC82ODcgMzQ3Mi81NjkxLzY4NyAzNDI0LzU2MzYvNjg3CitmIDM0MjQvNTYzNi82ODcgMzQyMy81NjU1LzY4NyAzNDcxLzU2OTAvNjg3CitmIDI5ODkvNTY5Mi82ODcgMzQ3MS81NjkwLzY4NyAzNDIyLzU2NTQvNjg3CitmIDM0MjIvNTY1NC82ODcgMzQ2NC81NjUzLzY4NyAyOTg5LzU2OTIvNjg3CitmIDM0MjQvNTYzNi82ODcgMzQ3Mi81NjkxLzY4NyAyOTg4LzU2ODMvNjg3CitmIDI5ODgvNTY4My82ODcgMzQzMy81NjU3LzY4NyAzNDI0LzU2MzYvNjg3CitmIDM2NTAvNTY5My8xNzg4IDM0NzMvNTY5NC8xNzg4IDYwMDEvNTY5NS8xNzg4CitmIDYwMDIvNTY5Ni8xNzg4IDYwMDMvNTY5Ny8xNzg4IDM2NTAvNTY5OC8xNzg4CitmIDM2NTQvNTY5OS8xNzg5IDM0NzQvNTcwMC8xNzg5IDYwMDQvNTcwMS8xNzg5CitmIDYwMDUvNTcwMi8xNzg5IDYwMDYvNTcwMy8xNzg5IDM2NTQvNTcwNC8xNzg5CitmIDM0NzYvNTcwNS8xNzkwIDM0NzUvNTcwNi8xNzkwIDYwMDcvNTcwNy8xNzkwCitmIDYwMDgvNTcwOC8xNzkwIDYwMDkvNTcwOS8xNzkwIDM0NzYvNTcxMC8xNzkwCitmIDM0NzcvNTcxMS8xNzkxIDM0NzYvNTcxMi8xNzkxIDYwMTAvNTcxMy8xNzkxCitmIDYwMTEvNTcxNC8xNzkxIDYwMTIvNTcxNS8xNzkxIDM0NzcvNTcxNi8xNzkxCitmIDM0NzgvNTcxNy8xNzkyIDM0NzcvNTcxOC8xNzkyIDYwMTMvNTcxOS8xNzkyCitmIDYwMTQvNTcyMC8xNzkyIDYwMTUvNTcyMS8xNzkyIDM0NzgvNTcyMi8xNzkyCitmIDM0NzkvNTcyMy8xNzkzIDYwMTYvNTcyNC8xNzkzIDYwMTcvNTcyNS8xNzkzCitmIDYwMTgvNTcyNi8xNzkzIDYwMTkvNTcyNy8xNzkzIDM0NzkvNTcyOC8xNzkzCitmIDM0ODAvNTcyOS8xNzk0IDM0NzkvNTczMC8xNzk0IDYwMjAvNTczMS8xNzk0CitmIDYwMjEvNTczMi8xNzk0IDYwMjIvNTczMy8xNzk0IDM0ODAvNTczNC8xNzk0CitmIDM0ODEvNTczNS8xNzk1IDYwMjMvNTczNi8xNzk1IDYwMjQvNTczNy8xNzk1CitmIDYwMjUvNTczOC8xNzk1IDYwMjYvNTczOS8xNzk1IDM0ODEvNTc0MC8xNzk1CitmIDM0ODIvNTc0MS8xNzk2IDM0ODEvNTc0Mi8xNzk2IDYwMjcvNTc0My8xNzk2CitmIDYwMjgvNTc0NC8xNzk2IDYwMjkvNTc0NS8xNzk2IDM0ODIvNTc0Ni8xNzk2CitmIDM0ODMvNTc0Ny8xNzk3IDM0ODIvNTc0OC8xNzk3IDYwMzAvNTc0OS8xNzk3CitmIDYwMzEvNTc1MC8xNzk3IDYwMzIvNTc1MS8xNzk3IDM0ODMvNTc1Mi8xNzk3CitmIDM0ODQvNTc1My8xNzk4IDM0ODMvNTc1NC8xNzk4IDYwMzMvNTc1NS8xNzk4CitmIDYwMzQvNTc1Ni8xNzk4IDYwMzUvNTc1Ny8xNzk4IDM0ODQvNTc1OC8xNzk4CitmIDM0ODUvNTc1OS8xNzk5IDM0ODQvNTc2MC8xNzk5IDYwMzYvNTc2MS8xNzk5CitmIDYwMzcvNTc2Mi8xNzk5IDYwMzgvNTc2My8xNzk5IDM0ODUvNTc2NC8xNzk5CitmIDM0ODYvNTc2NS8xODAwIDM0ODUvNTc2Ni8xODAwIDYwMzkvNTc2Ny8xODAwCitmIDYwNDAvNTc2OC8xODAwIDYwNDEvNTc2OS8xODAwIDM0ODYvNTc3MC8xODAwCitmIDM0ODcvNTc3MS8xODAxIDYwNDIvNTc3Mi8xODAxIDYwNDMvNTc3My8xODAxCitmIDYwNDQvNTc3NC8xODAxIDYwNDUvNTc3NS8xODAxIDM0ODcvNTc3Ni8xODAxCitmIDM0ODgvNTc3Ny8xODAyIDYwNDYvNTc3OC8xODAyIDYwNDcvNTc3OS8xODAyCitmIDYwNDgvNTc4MC8xODAzIDYwNDkvNTc4MS8xODAzIDM0ODgvNTc4Mi8xODAzCitmIDM0ODkvNTc4My8xODA0IDM0ODgvNTc4NC8xODA0IDYwNTAvNTc4NS8xODA0CitmIDYwNTEvNTc4Ni8xODA0IDYwNTIvNTc4Ny8xODA0IDM0ODkvNTc4OC8xODA0CitmIDM0OTAvNTc4OS8xODA1IDM0ODkvNTc5MC8xODA1IDYwNTMvNTc5MS8xODA1CitmIDYwNTQvNTc5Mi8xODA1IDYwNTUvNTc5My8xODA1IDM0OTAvNTc5NC8xODA1CitmIDM0OTEvNTc5NS8xODA2IDM0OTAvNTc5Ni8xODA2IDYwNTYvNTc5Ny8xODA2CitmIDYwNTcvNTc5OC8xODA2IDYwNTgvNTc5OS8xODA2IDM0OTEvNTgwMC8xODA2CitmIDM2NTIvNTgwMS8xODA3IDYwNTkvNTgwMi8xODA3IDYwNjAvNTgwMy8xODA3CitmIDYwNjEvNTgwNC8xODA3IDYwNjIvNTgwNS8xODA3IDM2NTIvNTgwNi8xODA3CitmIDM2NTEvNTgwNy8xODA4IDM0OTIvNTgwOC8xODA4IDYwNjMvNTgwOS8xODA4CitmIDYwNjQvNTgxMC8xODA4IDYwNjUvNTgxMS8xODA4IDM2NTEvNTgxMi8xODA4CitmIDM2NTMvNTgxMy8xODA5IDM0OTMvNTgxNC8xODA5IDYwNjYvNTgxNS8xODA5CitmIDYwNjcvNTgxNi8xODA5IDYwNjgvNTgxNy8xODA5IDM2NTMvNTgxOC8xODA5CitmIDM0OTUvNTgxOS8xODEwIDM0OTQvNTgyMC8xODEwIDYwNjkvNTgyMS8xODEwCitmIDYwNzAvNTgyMi8xODEwIDYwNzEvNTgyMy8xODEwIDM0OTUvNTgyNC8xODEwCitmIDM0OTYvNTgyNS8xODExIDM0OTUvNTgyNi8xODExIDYwNzIvNTgyNy8xODExCitmIDYwNzMvNTgyOC8xODEyIDYwNzQvNTgyOS8xODEyIDM0OTYvNTgzMC8xODEyCitmIDM0OTcvNTgzMS8xODEzIDM0OTYvNTgzMi8xODEzIDYwNzUvNTgzMy8xODEzCitmIDYwNzYvNTgzNC8xODEzIDYwNzcvNTgzNS8xODEzIDM0OTcvNTgzNi8xODEzCitmIDM0OTgvNTgzNy8xODE0IDYwNzgvNTgzOC8xODE0IDYwNzkvNTgzOS8xODE0CitmIDYwODAvNTg0MC8xODE0IDYwODEvNTg0MS8xODE0IDM0OTgvNTg0Mi8xODE0CitmIDM0OTkvNTg0My8xODE1IDM0OTgvNTg0NC8xODE1IDYwODIvNTg0NS8xODE1CitmIDYwODMvNTg0Ni8xODE1IDYwODQvNTg0Ny8xODE1IDM0OTkvNTg0OC8xODE1CitmIDM1MDAvNTg0OS8xODE2IDYwODUvNTg1MC8xODE2IDYwODYvNTg1MS8xODE2CitmIDYwODcvNTg1Mi8xODE2IDYwODgvNTg1My8xODE2IDM1MDAvNTg1NC8xODE2CitmIDM1MDEvNTg1NS8xODE3IDM1MDAvNTg1Ni8xODE3IDYwODkvNTg1Ny8xODE3CitmIDYwOTAvNTg1OC8xODE3IDYwOTEvNTg1OS8xODE3IDM1MDEvNTg2MC8xODE3CitmIDM1MDIvNTg2MS8xODE4IDM1MDEvNTg2Mi8xODE4IDYwOTIvNTg2My8xODE4CitmIDYwOTMvNTg2NC8xODE4IDYwOTQvNTg2NS8xODE4IDM1MDIvNTg2Ni8xODE4CitmIDM1MDMvNTg2Ny8xODE5IDM1MDIvNTg2OC8xODE5IDYwOTUvNTg2OS8xODE5CitmIDYwOTYvNTg3MC8xODE5IDYwOTcvNTg3MS8xODE5IDM1MDMvNTg3Mi8xODE5CitmIDM1MDQvNTg3My8xODIwIDM1MDMvNTg3NC8xODIwIDYwOTgvNTg3NS8xODIwCitmIDYwOTkvNTg3Ni8xODIwIDYxMDAvNTg3Ny8xODIwIDM1MDQvNTg3OC8xODIwCitmIDM1MDUvNTg3OS8xODIxIDM1MDQvNTg4MC8xODIxIDYxMDEvNTg4MS8xODIxCitmIDYxMDIvNTg4Mi8xODIxIDYxMDMvNTg4My8xODIxIDM1MDUvNTg4NC8xODIxCitmIDM1MDYvNTg4NS8xODIyIDYxMDQvNTg4Ni8xODIyIDYxMDUvNTg4Ny8xODIyCitmIDYxMDYvNTg4OC8xODIyIDYxMDcvNTg4OS8xODIyIDM1MDYvNTg5MC8xODIyCitmIDM1MDcvNTg5MS8xODIzIDYxMDgvNTg5Mi8xODIzIDYxMDkvNTg5My8xODIzCitmIDYxMTAvNTg5NC8xODIzIDYxMTEvNTg5NS8xODIzIDM1MDcvNTg5Ni8xODIzCitmIDM1MDgvNTg5Ny8xNDgwIDM1MDcvNTg5OC8xNDgwIDYxMTIvNTg5OS8xNDgwCitmIDYxMTMvNTkwMC8xNDgwIDYxMTQvNTkwMS8xNDgwIDM1MDgvNTkwMi8xNDgwCitmIDM1MDkvNTkwMy8xODI0IDM1MDgvNTkwNC8xODI0IDYxMTUvNTkwNS8xODI0CitmIDYxMTYvNTkwNi8xODI0IDYxMTcvNTkwNy8xODI0IDM1MDkvNTkwOC8xODI0CitmIDM1MTAvNTkwOS8xODI1IDM1MDkvNTkxMC8xODI1IDYxMTgvNTkxMS8xODI1CitmIDYxMTkvNTkxMi8xODI1IDYxMjAvNTkxMy8xODI1IDM1MTAvNTkxNC8xODI1CitmIDM2NTUvNTkxNS8xODI2IDYxMjEvNTkxNi8xODI2IDYxMjIvNTkxNy8xODI2CitmIDYxMjMvNTkxOC8xODI2IDYxMjQvNTkxOS8xODI2IDM2NTUvNTkyMC8xODI2CitmIDM2NTgvNTkyMS8yMjEgMzUxMS81OTIyLzIyMSA2MTI1LzU5MjMvMjIxCitmIDYxMjYvNTkyNC8yMjEgNjEyNy81OTI1LzIyMSAzNjU4LzU5MjYvMjIxCitmIDM2NjIvNTkyNy8xODI3IDM1MTIvNTkyOC8xODI3IDYxMjgvNTkyOS8xODI3CitmIDYxMjkvNTkzMC8xODI4IDYxMzAvNTkzMS8xODI4IDM2NjIvNTkzMi8xODI4CitmIDM1MTQvNTkzMy8xODI5IDM1MTMvNTkzNC8xODI5IDYxMzEvNTkzNS8xODI5CitmIDYxMzIvNTkzNi8xODI5IDYxMzMvNTkzNy8xODI5IDM1MTQvNTkzOC8xODI5CitmIDM1MTUvNTkzOS8xODMwIDM1MTQvNTk0MC8xODMwIDYxMzQvNTk0MS8xODMwCitmIDYxMzUvNTk0Mi8xODMwIDYxMzYvNTk0My8xODMwIDM1MTUvNTk0NC8xODMwCitmIDM1MTYvNTk0NS8xODMxIDYxMzcvNTk0Ni8xODMxIDYxMzgvNTk0Ny8xODMxCitmIDYxMzkvNTk0OC8xODMxIDYxNDAvNTk0OS8xODMxIDM1MTYvNTk1MC8xODMxCitmIDM1OTgvNTk1MS8xODMyIDM1MTYvNTk1Mi8xODMyIDYxNDEvNTk1My8xODMyCitmIDYxNDIvNTk1NC8xODMyIDYxNDMvNTk1NS8xODMyIDM1OTgvNTk1Ni8xODMyCitmIDM2NTkvNTk1Ny8xMDQzIDM1MTcvNTk1OC8xMDQzIDYxNDQvNTk1OS8xMDQzCitmIDYxNDUvNTk2MC8xMDQzIDYxNDYvNTk2MS8xMDQzIDM2NTkvNTk2Mi8xMDQzCitmIDM2NzAvNTk2My8xODMzIDM1MTgvNTk2NC8xODMzIDYxNDcvNTk2NS8xODMzCitmIDYxNDgvNTk2Ni8xODMzIDYxNDkvNTk2Ny8xODMzIDM2NzAvNTk2OC8xODMzCitmIDM1MjAvNTk2OS8xODM0IDM1MTkvNTk3MC8xODM0IDYxNTAvNTk3MS8xODM0CitmIDYxNTEvNTk3Mi8xODM0IDYxNTIvNTk3My8xODM0IDM1MjAvNTk3NC8xODM0CitmIDM1MjEvNTk3NS8xODM1IDYxNTMvNTk3Ni8xODM1IDYxNTQvNTk3Ny8xODM1CitmIDYxNTUvNTk3OC8xODM1IDYxNTYvNTk3OS8xODM1IDM1MjEvNTk4MC8xODM1CitmIDM1MjIvNTk4MS8xODM2IDM1MjEvNTk4Mi8xODM2IDYxNTcvNTk4My8xODM2CitmIDYxNTgvNTk4NC8xODM2IDYxNTkvNTk4NS8xODM2IDM1MjIvNTk4Ni8xODM2CitmIDM2NjMvNTk4Ny8xODM3IDM1MjIvNTk4OC8xODM3IDYxNjAvNTk4OS8xODM3CitmIDYxNjEvNTk5MC8xODM3IDYxNjIvNTk5MS8xODM3IDM2NjMvNTk5Mi8xODM3CitmIDM2NjQvNTk5My8yMTkgMzUyMy81OTk0LzIxOSA2MTYzLzU5OTUvMjE5CitmIDYxNjQvNTk5Ni8yMTkgNjE2NS81OTk3LzIxOSAzNjY0LzU5OTgvMjE5CitmIDM2NTYvNTk5OS8xMDQzIDM1MjQvNjAwMC8xMDQzIDYxNjYvNjAwMS8xMDQzCitmIDYxNjcvNjAwMi8xMDQzIDYxNjgvNjAwMy8xMDQzIDM2NTYvNjAwNC8xMDQzCitmIDM2NjYvNjAwNS8xMTcyIDM1MjUvNjAwNi8xMTcyIDYxNjkvNjAwNy8xMTcyCitmIDYxNzAvNjAwOC8xMTcyIDYxNzEvNjAwOS8xMTcyIDM2NjYvNjAxMC8xMTcyCitmIDM2NTcvNjAxMS8xMDQ0IDM1MjYvNjAxMi8xMDQ0IDYxNzIvNjAxMy8xMDQ0CitmIDYxNzMvNjAxNC8xMDQ0IDYxNzQvNjAxNS8xMDQ0IDM2NTcvNjAxNi8xMDQ0CitmIDM2MzgvNjAxNy8xODM4IDM1MjcvNjAxOC8xODM4IDYxNzUvNjAxOS8xODM4CitmIDYxNzYvNjAyMC8xODM4IDYxNzcvNjAyMS8xODM4IDM2MzgvNjAyMi8xODM4CitmIDM2NDYvNjAyMy8xMDQ0IDM1MjgvNjAyNC8xMDQ0IDYxNzgvNjAyNS8xMDQ0CitmIDYxNzkvNjAyNi8xMDQ0IDYxODAvNjAyNy8xMDQ0IDM2NDYvNjAyOC8xMDQ0CitmIDM2MzAvNjAyOS8xODM5IDM1MjkvNjAzMC8xODM5IDYxODEvNjAzMS8xODM5CitmIDYxODIvNjAzMi8xODM5IDYxODMvNjAzMy8xODM5IDM2MzAvNjAzNC8xODM5CitmIDM1MzEvNjAzNS8xODQwIDM1MzAvNjAzNi8xODQwIDYxODQvNjAzNy8xODQwCitmIDYxODUvNjAzOC8xODQwIDYxODYvNjAzOS8xODQwIDM1MzEvNjA0MC8xODQwCitmIDYxODcvNjA0MS8xODQxIDYxODgvNjA0Mi8xODQxIDYxODkvNjA0My8xODQxCitmIDYxOTAvNjA0NC8xODQxIDYxOTEvNjA0NS8xODQxIDYxOTIvNjA0Ni8xODQxCitmIDM2NDcvNjA0Ny8xMDQ0IDM1MzIvNjA0OC8xMDQ0IDYxOTMvNjA0OS8xMDQ0CitmIDYxOTQvNjA1MC8xMDQ0IDYxOTUvNjA1MS8xMDQ0IDM2NDcvNjA1Mi8xMDQ0CitmIDM2NzgvNjA1My8xODQyIDM1MzMvNjA1NC8xODQyIDYxOTYvNjA1NS8xODQyCitmIDYxOTcvNjA1Ni8xODQyIDYxOTgvNjA1Ny8xODQyIDM2NzgvNjA1OC8xODQyCitmIDM1MzUvNjA1OS8xODQzIDM1MzQvNjA2MC8xODQzIDYxOTkvNjA2MS8xODQzCitmIDYyMDAvNjA2Mi8xODQzIDYyMDEvNjA2My8xODQzIDM1MzUvNjA2NC8xODQzCitmIDM1MzYvNjA2NS8xODQ0IDYyMDIvNjA2Ni8xODQ0IDYyMDMvNjA2Ny8xODQ0CitmIDYyMDQvNjA2OC8xODQ0IDYyMDUvNjA2OS8xODQ0IDM1MzYvNjA3MC8xODQ0CitmIDM2NDUvNjA3MS8xODQ1IDM1MzYvNjA3Mi8xODQ1IDYyMDYvNjA3My8xODQ1CitmIDYyMDcvNjA3NC8xODQ1IDYyMDgvNjA3NS8xODQ1IDM2NDUvNjA3Ni8xODQ1CitmIDM2NDIvNjA3Ny8xODQ2IDM1MzcvNjA3OC8xODQ2IDYyMDkvNjA3OS8xODQ2CitmIDYyMTAvNjA4MC8xODQ2IDYyMTEvNjA4MS8xODQ2IDM2NDIvNjA4Mi8xODQ2CitmIDM2NDgvNjA4My8xMDQzIDM1MzgvNjA4NC8xMDQzIDYyMTIvNjA4NS8xMDQzCitmIDYyMTMvNjA4Ni8xMDQzIDYyMTQvNjA4Ny8xMDQzIDM2NDgvNjA4OC8xMDQzCitmIDM2NzYvNjA4OS8xODQ3IDM1MzkvNjA5MC8xODQ3IDYyMTUvNjA5MS8xODQ3CitmIDYyMTYvNjA5Mi8xODQ3IDYyMTcvNjA5My8xODQ3IDM2NzYvNjA5NC8xODQ3CitmIDM1NDEvNjA5NS8xODQ4IDM1NDAvNjA5Ni8xODQ4IDYyMTgvNjA5Ny8xODQ4CitmIDYyMTkvNjA5OC8xODQ4IDYyMjAvNjA5OS8xODQ4IDM1NDEvNjEwMC8xODQ4CitmIDYyMjEvNjEwMS8xODQ5IDYyMjIvNjEwMi8xODQ5IDYyMjMvNjEwMy8xODQ5CitmIDYyMjQvNjEwNC8xODQ5IDYyMjUvNjEwNS8xODQ5IDYyMjYvNjEwNi8xODQ5CitmIDM2NDkvNjEwNy8xMDQzIDM1NDIvNjEwOC8xMDQzIDYyMjcvNjEwOS8xMDQzCitmIDYyMjgvNjExMC8xMDQzIDYyMjkvNjExMS8xMDQzIDM2NDkvNjExMi8xMDQzCitmIDM2MzEvNjExMy8xODUwIDM1NDMvNjExNC8xODUwIDYyMzAvNjExNS8xODUwCitmIDYyMzEvNjExNi8xODUwIDYyMzIvNjExNy8xODUwIDM2MzEvNjExOC8xODUwCitmIDM1NDUvNjExOS8xODUxIDM1NDQvNjEyMC8xODUxIDYyMzMvNjEyMS8xODUxCitmIDYyMzQvNjEyMi8xODUxIDYyMzUvNjEyMy8xODUxIDM1NDUvNjEyNC8xODUxCitmIDM1NDYvNjEyNS8xODUyIDYyMzYvNjEyNi8xODUyIDYyMzcvNjEyNy8xODUyCitmIDYyMzgvNjEyOC8xODUyIDYyMzkvNjEyOS8xODUyIDM1NDYvNjEzMC8xODUyCitmIDM2NDAvNjEzMS8xODUzIDM1NDYvNjEzMi8xODUzIDYyNDAvNjEzMy8xODUzCitmIDYyNDEvNjEzNC8xODUzIDYyNDIvNjEzNS8xODUzIDM2NDAvNjEzNi8xODUzCitmIDM2MTcvNjEzNy8xODU0IDM1NDcvNjEzOC8xODU0IDYyNDMvNjEzOS8xODU0CitmIDYyNDQvNjE0MC8xODU0IDYyNDUvNjE0MS8xODU0IDM2MTcvNjE0Mi8xODU0CitmIDM2MzcvNjE0My8xODU1IDM1NDgvNjE0NC8xODU1IDYyNDYvNjE0NS8xODU1CitmIDYyNDcvNjE0Ni8xODU1IDYyNDgvNjE0Ny8xODU1IDM2MzcvNjE0OC8xODU1CitmIDM2MTgvNjE0OS8xODU2IDM1NDkvNjE1MC8xODU2IDYyNDkvNjE1MS8xODU2CitmIDYyNTAvNjE1Mi8xODU3IDYyNTEvNjE1My8xODU3IDM2MTgvNjE1NC8xODU3CitmIDM1NTEvNjE1NS8xODU4IDM1NTAvNjE1Ni8xODU4IDYyNTIvNjE1Ny8xODU4CitmIDYyNTMvNjE1OC8xODU4IDYyNTQvNjE1OS8xODU4IDM1NTEvNjE2MC8xODU4CitmIDM1NTIvNjE2MS8xODU5IDM1NTEvNjE2Mi8xODU5IDYyNTUvNjE2My8xODU5CitmIDYyNTYvNjE2NC8xODU5IDYyNTcvNjE2NS8xODU5IDM1NTIvNjE2Ni8xODU5CitmIDM1ODgvNjE2Ny8xODYwIDM1NTIvNjE2OC8xODYwIDYyNTgvNjE2OS8xODYwCitmIDYyNTkvNjE3MC8xODYwIDYyNjAvNjE3MS8xODYwIDM1ODgvNjE3Mi8xODYwCitmIDM1ODYvNjE3My8xODYxIDYyNjEvNjE3NC8xODYxIDYyNjIvNjE3NS8xODYxCitmIDYyNjMvNjE3Ni8xODYxIDYyNjQvNjE3Ny8xODYxIDM1ODYvNjE3OC8xODYxCitmIDM1NTQvNjE3OS8xODYyIDM1NTMvNjE4MC8xODYyIDYyNjUvNjE4MS8xODYyCitmIDYyNjYvNjE4Mi8xODYyIDYyNjcvNjE4My8xODYyIDM1NTQvNjE4NC8xODYyCitmIDM1NTUvNjE4NS8xODYzIDYyNjgvNjE4Ni8xODYzIDYyNjkvNjE4Ny8xODYzCitmIDYyNzAvNjE4OC8xODYzIDYyNzEvNjE4OS8xODYzIDM1NTUvNjE5MC8xODYzCitmIDM1NTYvNjE5MS8xODY0IDM1NTUvNjE5Mi8xODY0IDYyNzIvNjE5My8xODY0CitmIDYyNzMvNjE5NC8xODY0IDYyNzQvNjE5NS8xODY0IDM1NTYvNjE5Ni8xODY0CitmIDM1NTcvNjE5Ny8xODY1IDM1NTYvNjE5OC8xODY1IDYyNzUvNjE5OS8xODY1CitmIDYyNzYvNjIwMC8xODY1IDYyNzcvNjIwMS8xODY1IDM1NTcvNjIwMi8xODY1CitmIDM2MjQvNjIwMy8xODY2IDYyNzgvNjIwNC8xODY2IDYyNzkvNjIwNS8xODY2CitmIDYyODAvNjIwNi8xODY2IDYyODEvNjIwNy8xODY2IDM2MjQvNjIwOC8xODY2CitmIDM2MjAvNjIwOS8xMDQzIDM1NTgvNjIxMC8xMDQzIDYyODIvNjIxMS8xMDQzCitmIDYyODMvNjIxMi8xMDQzIDYyODQvNjIxMy8xMDQzIDM2MjAvNjIxNC8xMDQzCitmIDM1NjAvNjIxNS8xODY3IDM1NTkvNjIxNi8xODY3IDYyODUvNjIxNy8xODY3CitmIDYyODYvNjIxOC8xODY3IDYyODcvNjIxOS8xODY3IDM1NjAvNjIyMC8xODY3CitmIDM2MjIvNjIyMS8xMDQ0IDYyODgvNjIyMi8xMDQ0IDYyODkvNjIyMy8xMDQ0CitmIDYyOTAvNjIyNC8xMDQ0IDYyOTEvNjIyNS8xMDQ0IDM2MjIvNjIyNi8xMDQ0CitmIDM2MzYvNjIyNy8xODY4IDM1NjEvNjIyOC8xODY4IDYyOTIvNjIyOS8xODY4CitmIDYyOTMvNjIzMC8xODY5IDYyOTQvNjIzMS8xODY5IDM2MzYvNjIzMi8xODY5CitmIDM1NjMvNjIzMy8xODcwIDM1NjIvNjIzNC8xODcwIDYyOTUvNjIzNS8xODcwCitmIDYyOTYvNjIzNi8xODcwIDYyOTcvNjIzNy8xODcwIDM1NjMvNjIzOC8xODcwCitmIDM1NjQvNjIzOS8xODcxIDM1NjMvNjI0MC8xODcxIDYyOTgvNjI0MS8xODcxCitmIDYyOTkvNjI0Mi8xODcxIDYzMDAvNjI0My8xODcxIDM1NjQvNjI0NC8xODcxCitmIDM1NjUvNjI0NS8xODcyIDYzMDEvNjI0Ni8xODcyIDYzMDIvNjI0Ny8xODcyCitmIDYzMDMvNjI0OC8xODcyIDYzMDQvNjI0OS8xODcyIDM1NjUvNjI1MC8xODcyCitmIDM1NjYvNjI1MS8xODczIDM1NjUvNjI1Mi8xODczIDYzMDUvNjI1My8xODczCitmIDYzMDYvNjI1NC8xODczIDYzMDcvNjI1NS8xODczIDM1NjYvNjI1Ni8xODczCitmIDM1ODcvNjI1Ny8xODc0IDYzMDgvNjI1OC8xODc0IDYzMDkvNjI1OS8xODc0CitmIDYzMTAvNjI2MC8xODc0IDYzMTEvNjI2MS8xODc0IDM1ODcvNjI2Mi8xODc0CitmIDM1ODkvNjI2My8xODc1IDM1NjcvNjI2NC8xODc1IDYzMTIvNjI2NS8xODc1CitmIDYzMTMvNjI2Ni8xODc1IDYzMTQvNjI2Ny8xODc1IDM1ODkvNjI2OC8xODc1CitmIDM1NjkvNjI2OS8xODc2IDM1NjgvNjI3MC8xODc2IDYzMTUvNjI3MS8xODc2CitmIDYzMTYvNjI3Mi8xODc2IDYzMTcvNjI3My8xODc2IDM1NjkvNjI3NC8xODc2CitmIDM1NDcvNjI3NS8xODc3IDM1NjkvNjI3Ni8xODc3IDYzMTgvNjI3Ny8xODc3CitmIDYzMTkvNjI3OC8xODc3IDYzMjAvNjI3OS8xODc3IDM1NDcvNjI4MC8xODc3CitmIDM2MDQvNjI4MS8xMDQ0IDM1NzAvNjI4Mi8xMDQ0IDYzMjEvNjI4My8xMDQ0CitmIDYzMjIvNjI4NC8xMDQ0IDYzMjMvNjI4NS8xMDQ0IDM2MDQvNjI4Ni8xMDQ0CitmIDM2MDIvNjI4Ny8yMjEgMzU3MS82Mjg4LzIyMSA2MzI0LzYyODkvMjIxCitmIDYzMjUvNjI5MC8yMjEgNjMyNi82MjkxLzIyMSAzNjAyLzYyOTIvMjIxCitmIDM2MDUvNjI5My8xMDQzIDM1NzIvNjI5NC8xMDQzIDYzMjcvNjI5NS8xMDQzCitmIDYzMjgvNjI5Ni8xMDQzIDYzMjkvNjI5Ny8xMDQzIDM2MDUvNjI5OC8xMDQzCitmIDM2MDAvNjI5OS8xMTcyIDM1NzMvNjMwMC8xMTcyIDYzMzAvNjMwMS8xMTcyCitmIDYzMzEvNjMwMi8xMTcyIDYzMzIvNjMwMy8xMTcyIDM2MDAvNjMwNC8xMTcyCitmIDM2MDgvNjMwNS8xMTcyIDM1NzQvNjMwNi8xMTcyIDYzMzMvNjMwNy8xMTcyCitmIDYzMzQvNjMwOC8xMTcyIDYzMzUvNjMwOS8xMTcyIDM2MDgvNjMxMC8xMTcyCitmIDM2MDYvNjMxMS8xODc4IDM1NzUvNjMxMi8xODc4IDYzMzYvNjMxMy8xODc4CitmIDYzMzcvNjMxNC8xODc4IDYzMzgvNjMxNS8xODc4IDM2MDYvNjMxNi8xODc4CitmIDM1NzcvNjMxNy8xODc5IDM1NzYvNjMxOC8xODc5IDYzMzkvNjMxOS8xODc5CitmIDYzNDAvNjMyMC8xODc5IDYzNDEvNjMyMS8xODc5IDM1NzcvNjMyMi8xODc5CitmIDM1NzgvNjMyMy8xODgwIDM1NzcvNjMyNC8xODgwIDYzNDIvNjMyNS8xODgwCitmIDYzNDMvNjMyNi8xODgwIDYzNDQvNjMyNy8xODgwIDM1NzgvNjMyOC8xODgwCitmIDM1NzkvNjMyOS8xODgxIDYzNDUvNjMzMC8xODgxIDYzNDYvNjMzMS8xODgxCitmIDYzNDcvNjMzMi8xODgxIDYzNDgvNjMzMy8xODgxIDM1NzkvNjMzNC8xODgxCitmIDM1OTYvNjMzNS8xODgyIDM1NzkvNjMzNi8xODgyIDYzNDkvNjMzNy8xODgyCitmIDYzNTAvNjMzOC8xODgyIDYzNTEvNjMzOS8xODgyIDM1OTYvNjM0MC8xODgyCitmIDM2MDkvNjM0MS8xMDQ0IDM1ODAvNjM0Mi8xMDQ0IDYzNTIvNjM0My8xMDQ0CitmIDYzNTMvNjM0NC8xMDQ0IDYzNTQvNjM0NS8xMDQ0IDM2MDkvNjM0Ni8xMDQ0CitmIDM2MTMvNjM0Ny8xODgzIDM1ODEvNjM0OC8xODgzIDYzNTUvNjM0OS8xODgzCitmIDYzNTYvNjM1MC8xODg0IDYzNTcvNjM1MS8xODg0IDM2MTMvNjM1Mi8xODg0CitmIDM1ODMvNjM1My8xODg1IDM1ODIvNjM1NC8xODg1IDYzNTgvNjM1NS8xODg1CitmIDYzNTkvNjM1Ni8xODg1IDYzNjAvNjM1Ny8xODg1IDM1ODMvNjM1OC8xODg1CitmIDM1ODQvNjM1OS8xODg2IDYzNjEvNjM2MC8xODg2IDYzNjIvNjM2MS8xODg2CitmIDYzNjMvNjM2Mi8xODg2IDYzNjQvNjM2My8xODg2IDM1ODQvNjM2NC8xODg2CitmIDM1ODUvNjM2NS8xODg3IDM1ODQvNjM2Ni8xODg3IDYzNjUvNjM2Ny8xODg3CitmIDYzNjYvNjM2OC8xODg3IDYzNjcvNjM2OS8xODg3IDM1ODUvNjM3MC8xODg3CitmIDM2MDcvNjM3MS8xODg4IDM1ODUvNjM3Mi8xODg4IDYzNjgvNjM3My8xODg4CitmIDYzNjkvNjM3NC8xODg4IDYzNzAvNjM3NS8xODg4IDM2MDcvNjM3Ni8xODg4CitmIDM1NTMvNjM3Ny8xODg5IDM1ODYvNjM3OC8xODg5IDYzNzEvNjM3OS8xODg5CitmIDYzNzIvNjM4MC8xODg5IDYzNzMvNjM4MS8xODg5IDM1NTMvNjM4Mi8xODg5CitmIDM1NjcvNjM4My8xODkwIDM1ODcvNjM4NC8xODkwIDYzNzQvNjM4NS8xODkwCitmIDYzNzUvNjM4Ni8xODkwIDYzNzYvNjM4Ny8xODkwIDM1NjcvNjM4OC8xODkwCitmIDM1NjgvNjM4OS8xODkxIDYzNzcvNjM5MC8xODkxIDYzNzgvNjM5MS8xODkxCitmIDYzNzkvNjM5Mi8xODkxIDYzODAvNjM5My8xODkxIDM1NjgvNjM5NC8xODkxCitmIDM2MTAvNjM5NS8yMjEgMzU5MC82Mzk2LzIyMSA2MzgxLzYzOTcvMjIxCitmIDYzODIvNjM5OC8yMjEgNjM4My82Mzk5LzIyMSAzNjEwLzY0MDAvMjIxCitmIDM2MDAvNjQwMS8xMTcyIDYzODQvNjQwMi8xMTcyIDYzODUvNjQwMy8xMTcyCitmIDYzODYvNjQwNC8xMTcyIDM2MTEvNjQwNS8xMTcyIDM2MDAvNjQwNi8xMTcyCitmIDM2MDEvNjQwNy8yMjEgMzU5MS82NDA4LzIyMSA2Mzg3LzY0MDkvMjIxCitmIDYzODgvNjQxMC8yMjEgNjM4OS82NDExLzIyMSAzNjAxLzY0MTIvMjIxCitmIDM2NjgvNjQxMy8yMTkgMzU5Mi82NDE0LzIxOSA2MzkwLzY0MTUvMjE5CitmIDYzOTEvNjQxNi8yMTkgNjM5Mi82NDE3LzIxOSAzNjY4LzY0MTgvMjE5CitmIDM2NjAvNjQxOS8xMTcyIDM1OTMvNjQyMC8xMTcyIDYzOTMvNjQyMS8xMTcyCitmIDYzOTQvNjQyMi8xMTcyIDYzOTUvNjQyMy8xMTcyIDM2NjAvNjQyNC8xMTcyCitmIDM2NjEvNjQyNS8yMTkgMzU5NC82NDI2LzIxOSA2Mzk2LzY0MjcvMjE5CitmIDYzOTcvNjQyOC8yMTkgNjM5OC82NDI5LzIxOSAzNjYxLzY0MzAvMjE5CitmIDM2NjUvNjQzMS8xMTcyIDM1OTUvNjQzMi8xMTcyIDYzOTkvNjQzMy8xMTcyCitmIDY0MDAvNjQzNC8xMTcyIDY0MDEvNjQzNS8xMTcyIDM2NjUvNjQzNi8xMTcyCitmIDM2MTQvNjQzNy8xODkyIDM1OTYvNjQzOC8xODkyIDY0MDIvNjQzOS8xODkyCitmIDY0MDMvNjQ0MC8xODkyIDY0MDQvNjQ0MS8xODkyIDM2MTQvNjQ0Mi8xODkyCitmIDM1ODIvNjQ0My8xODkzIDM1OTcvNjQ0NC8xODkzIDY0MDUvNjQ0NS8xODkzCitmIDY0MDYvNjQ0Ni8xODkzIDY0MDcvNjQ0Ny8xODkzIDM1ODIvNjQ0OC8xODkzCitmIDM2NzIvNjQ0OS8xODk0IDM1OTgvNjQ1MC8xODk0IDY0MDgvNjQ1MS8xODk0CitmIDY0MDkvNjQ1Mi8xODk0IDY0MTAvNjQ1My8xODk0IDM2NzIvNjQ1NC8xODk0CitmIDM1MTkvNjQ1NS8xODk1IDM1OTkvNjQ1Ni8xODk1IDY0MTEvNjQ1Ny8xODk1CitmIDY0MTIvNjQ1OC8xODk1IDY0MTMvNjQ1OS8xODk1IDM1MTkvNjQ2MC8xODk1CitmIDY0MTQvNjQ2MS8yMjEgMzYwMS82NDYyLzIyMSA2NDE1LzY0NjMvMjIxCitmIDY0MTYvNjQ2NC8yMjEgNjQxNy82NDY1LzIyMSA2NDE4LzY0NjYvMjIxCitmIDM2MTIvNjQ2Ny8yMjEgMzYwMi82NDY4LzIyMSA2NDE5LzY0NjkvMjIxCitmIDY0MjAvNjQ3MC8yMjEgNjQyMS82NDcxLzIyMSAzNjEyLzY0NzIvMjIxCitmIDY0MjIvNjQ3My8xMTcyIDM2MDMvNjQ3NC8xMTcyIDY0MjMvNjQ3NS8xMTcyCitmIDY0MjQvNjQ3Ni8xMTcyIDY0MjUvNjQ3Ny8xMTcyIDY0MjYvNjQ3OC8xMTcyCitmIDY0MjcvNjQ3OS8xMDQ0IDM2MDQvNjQ4MC8xMDQ0IDY0MjgvNjQ4MS8xMDQ0CitmIDY0MjkvNjQ4Mi8xMDQ0IDY0MzAvNjQ4My8xMDQ0IDY0MzEvNjQ4NC8xMDQ0CitmIDY0MzIvNjQ4NS8xMDQzIDM2MDUvNjQ4Ni8xMDQzIDY0MzMvNjQ4Ny8xMDQzCitmIDY0MzQvNjQ4OC8xMDQzIDY0MzUvNjQ4OS8xMDQzIDY0MzYvNjQ5MC8xMDQzCitmIDM1NzYvNjQ5MS8xODc4IDM2MDYvNjQ5Mi8xODc4IDY0MzcvNjQ5My8xODc4CitmIDY0MzgvNjQ5NC8xODc4IDY0MzkvNjQ5NS8xODc4IDM1NzYvNjQ5Ni8xODc4CitmIDY0NDAvNjQ5Ny8xODk2IDM2MDcvNjQ5OC8xODk2IDY0NDEvNjQ5OS8xODk2CitmIDY0NDIvNjUwMC8xODk3IDY0NDMvNjUwMS8xODk3IDY0NDQvNjUwMi8xODk3CitmIDY0NDUvNjUwMy8xMTcyIDM2MDgvNjUwNC8xMTcyIDY0NDYvNjUwNS8xMTcyCitmIDY0NDcvNjUwNi8xMTcyIDY0NDgvNjUwNy8xMTcyIDY0NDkvNjUwOC8xMTcyCitmIDY0NTAvNjUwOS8xMDQ0IDM2MDkvNjUxMC8xMDQ0IDY0NTEvNjUxMS8xMDQ0CitmIDY0NTIvNjUxMi8xMDQ0IDY0NTMvNjUxMy8xMDQ0IDY0NTQvNjUxNC8xMDQ0CitmIDM1OTEvNjUxNS8yMjEgMzYxMC82NTE2LzIyMSA2NDU1LzY1MTcvMjIxCitmIDY0NTYvNjUxOC8yMjEgNjQ1Ny82NTE5LzIyMSAzNTkxLzY1MjAvMjIxCitmIDM1OTAvNjUyMS8yMjEgMzYxMi82NTIyLzIyMSA2NDU4LzY1MjMvMjIxCitmIDY0NTkvNjUyNC8yMjEgNjQ2MC82NTI1LzIyMSAzNTkwLzY1MjYvMjIxCitmIDY0NjEvNjUyNy8xODk4IDM2MTQvNjUyOC8xODk4IDY0NjIvNjUyOS8xODk4CitmIDY0NjMvNjUzMC8xODk4IDY0NjQvNjUzMS8xODk4IDY0NjUvNjUzMi8xODk4CitmIDM2MjMvNjUzMy8xMDQzIDM2MTUvNjUzNC8xMDQzIDY0NjYvNjUzNS8xMDQzCitmIDY0NjcvNjUzNi8xMDQzIDY0NjgvNjUzNy8xMDQzIDM2MjMvNjUzOC8xMDQzCitmIDM2MjUvNjUzOS8xMDQ0IDM2MTYvNjU0MC8xMDQ0IDY0NjkvNjU0MS8xMDQ0CitmIDY0NzAvNjU0Mi8xMDQ0IDY0NzEvNjU0My8xMDQ0IDM2MjUvNjU0NC8xMDQ0CitmIDY0NzIvNjU0NS8xODU0IDM2MTcvNjU0Ni8xODU0IDY0NzMvNjU0Ny8xODU0CitmIDY0NzQvNjU0OC8xODU0IDY0NzUvNjU0OS8xODU0IDY0NzYvNjU1MC8xODU0CitmIDM1NTAvNjU1MS8xODk5IDM2MTgvNjU1Mi8xODk5IDY0NzcvNjU1My8xODk5CitmIDY0NzgvNjU1NC8xOTAwIDY0NzkvNjU1NS8xOTAwIDM1NTAvNjU1Ni8xOTAwCitmIDY0ODAvNjU1Ny8xMDQ0IDM2MTkvNjU1OC8xMDQ0IDY0ODEvNjU1OS8xMDQ0CitmIDY0ODIvNjU2MC8xMDQ0IDY0ODMvNjU2MS8xMDQ0IDY0ODQvNjU2Mi8xMDQ0CitmIDM2MjcvNjU2My8xMDQzIDM2MjAvNjU2NC8xMDQzIDY0ODUvNjU2NS8xMDQzCitmIDY0ODYvNjU2Ni8xMDQzIDY0ODcvNjU2Ny8xMDQzIDM2MjcvNjU2OC8xMDQzCitmIDM2MTkvNjU2OS8xMDQ0IDM2MjEvNjU3MC8xMDQ0IDY0ODgvNjU3MS8xMDQ0CitmIDY0ODkvNjU3Mi8xMDQ0IDY0OTAvNjU3My8xMDQ0IDM2MTkvNjU3NC8xMDQ0CitmIDM2MTYvNjU3NS8xMDQ0IDM2MjIvNjU3Ni8xMDQ0IDY0OTEvNjU3Ny8xMDQ0CitmIDY0OTIvNjU3OC8xMDQ0IDY0OTMvNjU3OS8xMDQ0IDM2MTYvNjU4MC8xMDQ0CitmIDY0OTQvNjU4MS8xMDQzIDM2MjMvNjU4Mi8xMDQzIDY0OTUvNjU4My8xMDQzCitmIDY0OTYvNjU4NC8xMDQzIDY0OTcvNjU4NS8xMDQzIDY0OTgvNjU4Ni8xMDQzCitmIDY0OTkvNjU4Ny8xODY2IDM2MjQvNjU4OC8xODY2IDY1MDAvNjU4OS8xODY2CitmIDY1MDEvNjU5MC8xODY2IDY1MDIvNjU5MS8xODY2IDY1MDMvNjU5Mi8xODY2CitmIDM2MjgvNjU5My8xMDQ0IDM2MjUvNjU5NC8xMDQ0IDY1MDQvNjU5NS8xMDQ0CitmIDY1MDUvNjU5Ni8xMDQ0IDY1MDYvNjU5Ny8xMDQ0IDM2MjgvNjU5OC8xMDQ0CitmIDM2MTUvNjU5OS8xMDQzIDM2MjYvNjYwMC8xMDQzIDY1MDcvNjYwMS8xMDQzCitmIDY1MDgvNjYwMi8xMDQzIDY1MDkvNjYwMy8xMDQzIDM2MTUvNjYwNC8xMDQzCitmIDM2MjYvNjYwNS8xMDQzIDM2MjcvNjYwNi8xMDQzIDY1MTAvNjYwNy8xMDQzCitmIDY1MTEvNjYwOC8xMDQzIDY1MTIvNjYwOS8xMDQzIDM2MjYvNjYxMC8xMDQzCitmIDM2MjEvNjYxMS8xMDQ0IDM2MjgvNjYxMi8xMDQ0IDY1MTMvNjYxMy8xMDQ0CitmIDY1MTQvNjYxNC8xMDQ0IDY1MTUvNjYxNS8xMDQ0IDM2MjEvNjYxNi8xMDQ0CitmIDY1MTYvNjYxNy8xODM4IDM2MjkvNjYxOC8xODM4IDY1MTcvNjYxOS8xODM4CitmIDY1MTgvNjYyMC8xODM4IDY1MTkvNjYyMS8xODM4IDY1MjAvNjYyMi8xODM4CitmIDM2MzUvNjYyMy8xOTAxIDM2MzAvNjYyNC8xOTAxIDY1MjEvNjYyNS8xOTAxCitmIDY1MjIvNjYyNi8xOTAxIDY1MjMvNjYyNy8xOTAxIDM2MzUvNjYyOC8xOTAxCitmIDM2MzEvNjYyOS8xODUwIDY1MjQvNjYzMC8xODUwIDY1MjUvNjYzMS8xODUwCitmIDY1MjYvNjYzMi8xODUwIDM2NDEvNjYzMy8xODUwIDM2MzEvNjYzNC8xODUwCitmIDY1MjcvNjYzNS8xODUzIDM2MzIvNjYzNi8xODUzIDY1MjgvNjYzNy8xODUzCitmIDY1MjkvNjYzOC8xODUzIDY1MzAvNjYzOS8xODUzIDY1MzEvNjY0MC8xODUzCitmIDM2MzIvNjY0MS8xODUzIDM2MzMvNjY0Mi8xODUzIDY1MzIvNjY0My8xODUzCitmIDY1MzMvNjY0NC8xODUzIDY1MzQvNjY0NS8xODUzIDM2MzIvNjY0Ni8xODUzCitmIDM2MjkvNjY0Ny8xOTAyIDM2MzQvNjY0OC8xOTAyIDY1MzUvNjY0OS8xOTAyCitmIDY1MzYvNjY1MC8xOTAzIDY1MzcvNjY1MS8xOTAzIDM2MjkvNjY1Mi8xOTAzCitmIDM2MzkvNjY1My8xOTAxIDM2MzUvNjY1NC8xOTAxIDY1MzgvNjY1NS8xOTAxCitmIDY1MzkvNjY1Ni8xOTAxIDY1NDAvNjY1Ny8xOTAxIDM2MzkvNjY1OC8xOTAxCitmIDM1NjIvNjY1OS8xOTA0IDM2MzYvNjY2MC8xOTA0IDY1NDEvNjY2MS8xOTA0CitmIDY1NDIvNjY2Mi8xOTA1IDY1NDMvNjY2My8xOTA1IDM1NjIvNjY2NC8xOTA1CitmIDM1NDkvNjY2NS8xOTA2IDM2MzcvNjY2Ni8xOTA2IDY1NDQvNjY2Ny8xOTA2CitmIDY1NDUvNjY2OC8xOTA2IDY1NDYvNjY2OS8xOTA2IDM1NDkvNjY3MC8xOTA2CitmIDM2MzQvNjY3MS8xODM4IDM2MzgvNjY3Mi8xODM4IDY1NDcvNjY3My8xODM4CitmIDY1NDgvNjY3NC8xODM4IDY1NDkvNjY3NS8xODM4IDM2MzQvNjY3Ni8xODM4CitmIDM1MzAvNjY3Ny8xODM5IDM2MzkvNjY3OC8xODM5IDY1NTAvNjY3OS8xODM5CitmIDY1NTEvNjY4MC8xODM5IDY1NTIvNjY4MS8xODM5IDM1MzAvNjY4Mi8xODM5CitmIDM2MzMvNjY4My8xODUzIDM2NDAvNjY4NC8xODUzIDY1NTMvNjY4NS8xODUzCitmIDY1NTQvNjY4Ni8xODUzIDY1NTUvNjY4Ny8xODUzIDM2MzMvNjY4OC8xODUzCitmIDY1NTYvNjY4OS8xODUwIDM2NDEvNjY5MC8xODUwIDY1NTcvNjY5MS8xODUwCitmIDY1NTgvNjY5Mi8xODUwIDY1NTkvNjY5My8xODUwIDY1NjAvNjY5NC8xODUwCitmIDM2ODIvNjY5NS8xOTA3IDM2NDIvNjY5Ni8xOTA3IDY1NjEvNjY5Ny8xOTA3CitmIDY1NjIvNjY5OC8xOTA3IDY1NjMvNjY5OS8xOTA3IDM2ODIvNjcwMC8xOTA3CitmIDM1NDAvNjcwMS8xODQ3IDM2NDMvNjcwMi8xODQ3IDY1NjQvNjcwMy8xODQ3CitmIDY1NjUvNjcwNC8xODQ3IDY1NjYvNjcwNS8xODQ3IDM1NDAvNjcwNi8xODQ3CitmIDY1NjcvNjcwNy8xOTA4IDM2NDQvNjcwOC8xOTA4IDY1NjgvNjcwOS8xOTA4CitmIDY1NjkvNjcxMC8xOTA4IDY1NzAvNjcxMS8xOTA4IDY1NzEvNjcxMi8xOTA4CitmIDM2ODAvNjcxMy8xODQ1IDM2NDUvNjcxNC8xODQ1IDY1NzIvNjcxNS8xODQ1CitmIDY1NzMvNjcxNi8xODQ1IDY1NzQvNjcxNy8xODQ1IDM2ODAvNjcxOC8xODQ1CitmIDY1NzUvNjcxOS8xMDQ0IDM2NDYvNjcyMC8xMDQ0IDY1NzYvNjcyMS8xMDQ0CitmIDY1NzcvNjcyMi8xMDQ0IDY1NzgvNjcyMy8xMDQ0IDY1NzkvNjcyNC8xMDQ0CitmIDY1ODAvNjcyNS8xMDQ0IDM2NDcvNjcyNi8xMDQ0IDY1ODEvNjcyNy8xMDQ0CitmIDY1ODIvNjcyOC8xMDQ0IDY1ODMvNjcyOS8xMDQ0IDY1ODQvNjczMC8xMDQ0CitmIDY1ODUvNjczMS8xMDQzIDM2NDgvNjczMi8xMDQzIDY1ODYvNjczMy8xMDQzCitmIDY1ODcvNjczNC8xMDQzIDY1ODgvNjczNS8xMDQzIDY1ODkvNjczNi8xMDQzCitmIDY1OTAvNjczNy8xMDQzIDM2NDkvNjczOC8xMDQzIDY1OTEvNjczOS8xMDQzCitmIDY1OTIvNjc0MC8xMDQzIDY1OTMvNjc0MS8xMDQzIDY1OTQvNjc0Mi8xMDQzCitmIDM1OTcvNjc0My8xODg0IDM2MTMvNjc0NC8xODg0IDY1OTUvNjc0NS8xODg0CitmIDY1OTYvNjc0Ni8xODg0IDY1OTcvNjc0Ny8xODg0IDM1OTcvNjc0OC8xODg0CitmIDY1OTgvNjc0OS8xNzg4IDM2NTAvNjc1MC8xNzg4IDY1OTkvNjc1MS8xNzg4CitmIDY2MDAvNjc1Mi8xNzg4IDY2MDEvNjc1My8xNzg4IDY2MDIvNjc1NC8xNzg4CitmIDY2MDMvNjc1NS8xODA4IDM2NTEvNjc1Ni8xODA4IDY2MDQvNjc1Ny8xODA4CitmIDY2MDUvNjc1OC8xODA4IDY2MDYvNjc1OS8xODA4IDY2MDcvNjc2MC8xODA4CitmIDY2MDgvNjc2MS8xOTA5IDM2NTIvNjc2Mi8xOTA5IDY2MDkvNjc2My8xOTA5CitmIDY2MTAvNjc2NC8xOTA5IDY2MTEvNjc2NS8xOTA5IDY2MTIvNjc2Ni8xOTA5CitmIDY2MTMvNjc2Ny8xODA5IDM2NTMvNjc2OC8xODA5IDY2MTQvNjc2OS8xODA5CitmIDY2MTUvNjc3MC8xODA5IDY2MTYvNjc3MS8xODA5IDY2MTcvNjc3Mi8xODA5CitmIDY2MTgvNjc3My8xNzg5IDM2NTQvNjc3NC8xNzg5IDY2MTkvNjc3NS8xNzg5CitmIDY2MjAvNjc3Ni8xNzg5IDY2MjEvNjc3Ny8xNzg5IDY2MjIvNjc3OC8xNzg5CitmIDY2MjMvNjc3OS8xOTEwIDM2NTUvNjc4MC8xOTEwIDY2MjQvNjc4MS8xOTEwCitmIDY2MjUvNjc4Mi8xODI2IDY2MjYvNjc4My8xODI2IDY2MjcvNjc4NC8xODI2CitmIDY2MjgvNjc4NS8xMDQzIDM2NTYvNjc4Ni8xMDQzIDY2MjkvNjc4Ny8xMDQzCitmIDY2MzAvNjc4OC8xMDQzIDY2MzEvNjc4OS8xMDQzIDY2MzIvNjc5MC8xMDQzCitmIDY2MzMvNjc5MS8xMDQ0IDM2NTcvNjc5Mi8xMDQ0IDY2MzQvNjc5My8xMDQ0CitmIDY2MzUvNjc5NC8xMDQ0IDY2MzYvNjc5NS8xMDQ0IDY2MzcvNjc5Ni8xMDQ0CitmIDY2MzgvNjc5Ny8yMjEgMzY1OC82Nzk4LzIyMSA2NjM5LzY3OTkvMjIxCitmIDY2NDAvNjgwMC8yMjEgNjY0MS82ODAxLzIyMSA2NjQyLzY4MDIvMjIxCitmIDY2NDMvNjgwMy8xMDQzIDM2NTkvNjgwNC8xMDQzIDY2NDQvNjgwNS8xMDQzCitmIDY2NDUvNjgwNi8xMDQzIDY2NDYvNjgwNy8xMDQzIDY2NDcvNjgwOC8xMDQzCitmIDM1OTUvNjgwOS8xMTcyIDM2NjAvNjgxMC8xMTcyIDY2NDgvNjgxMS8xMTcyCitmIDY2NDkvNjgxMi8xMTcyIDY2NTAvNjgxMy8xMTcyIDM1OTUvNjgxNC8xMTcyCitmIDM1OTIvNjgxNS8yMTkgMzY2MS82ODE2LzIxOSA2NjUxLzY4MTcvMjE5CitmIDY2NTIvNjgxOC8yMTkgNjY1My82ODE5LzIxOSAzNTkyLzY4MjAvMjE5CitmIDM1MTMvNjgyMS8xOTExIDM2NjIvNjgyMi8xOTExIDY2NTQvNjgyMy8xOTExCitmIDY2NTUvNjgyNC8xODI4IDY2NTYvNjgyNS8xODI4IDM1MTMvNjgyNi8xODI4CitmIDY2NTcvNjgyNy8xOTEyIDM2NjMvNjgyOC8xOTEyIDY2NTgvNjgyOS8xOTEyCitmIDY2NTkvNjgzMC8xOTEyIDY2NjAvNjgzMS8xOTEyIDY2NjEvNjgzMi8xOTEyCitmIDM1OTQvNjgzMy8yMTkgMzY2NC82ODM0LzIxOSA2NjYyLzY4MzUvMjE5CitmIDY2NjMvNjgzNi8yMTkgNjY2NC82ODM3LzIxOSAzNTk0LzY4MzgvMjE5CitmIDY2NjUvNjgzOS8xMTcyIDM2NjUvNjg0MC8xMTcyIDY2NjYvNjg0MS8xMTcyCitmIDY2NjcvNjg0Mi8xMTcyIDY2NjgvNjg0My8xMTcyIDY2NjkvNjg0NC8xMTcyCitmIDM2NzMvNjg0NS8xMTcyIDM2NjYvNjg0Ni8xMTcyIDY2NzAvNjg0Ny8xMTcyCitmIDY2NzEvNjg0OC8xMTcyIDY2NzIvNjg0OS8xMTcyIDM2NzMvNjg1MC8xMTcyCitmIDY2NzMvNjg1MS8yMTkgMzY2Ny82ODUyLzIxOSA2Njc0LzY4NTMvMjE5CitmIDY2NzUvNjg1NC8yMTkgNjY3Ni82ODU1LzIxOSA2Njc3LzY4NTYvMjE5CitmIDM2NzQvNjg1Ny8yMTkgMzY2OC82ODU4LzIxOSA2Njc4LzY4NTkvMjE5CitmIDY2NzkvNjg2MC8yMTkgNjY4MC82ODYxLzIxOSAzNjc0LzY4NjIvMjE5CitmIDM1OTMvNjg2My8xMTcyIDM2NjkvNjg2NC8xMTcyIDY2ODEvNjg2NS8xMTcyCitmIDY2ODIvNjg2Ni8xMTcyIDY2ODMvNjg2Ny8xMTcyIDM1OTMvNjg2OC8xMTcyCitmIDM2NzUvNjg2OS8xOTEzIDM2NzAvNjg3MC8xOTEzIDY2ODQvNjg3MS8xOTEzCitmIDY2ODUvNjg3Mi8xOTEzIDY2ODYvNjg3My8xOTEzIDM2NzUvNjg3NC8xOTEzCitmIDY2ODcvNjg3NS8xODk0IDM2NzEvNjg3Ni8xODk0IDY2ODgvNjg3Ny8xODk0CitmIDY2ODkvNjg3OC8xODk0IDY2OTAvNjg3OS8xODk0IDY2OTEvNjg4MC8xODk0CitmIDM2NzEvNjg4MS8xODk0IDM2NzIvNjg4Mi8xODk0IDY2OTIvNjg4My8xODk0CitmIDY2OTMvNjg4NC8xODk0IDY2OTQvNjg4NS8xODk0IDM2NzEvNjg4Ni8xODk0CitmIDM2NjkvNjg4Ny8xMTcyIDM2NzMvNjg4OC8xMTcyIDY2OTUvNjg4OS8xMTcyCitmIDY2OTYvNjg5MC8xMTcyIDY2OTcvNjg5MS8xMTcyIDM2NjkvNjg5Mi8xMTcyCitmIDM2NjcvNjg5My8yMTkgMzY3NC82ODk0LzIxOSA2Njk4LzY4OTUvMjE5CitmIDY2OTkvNjg5Ni8yMTkgNjcwMC82ODk3LzIxOSAzNjY3LzY4OTgvMjE5CitmIDM1OTkvNjg5OS8xOTEzIDM2NzUvNjkwMC8xOTEzIDY3MDEvNjkwMS8xOTEzCitmIDY3MDIvNjkwMi8xOTEzIDY3MDMvNjkwMy8xOTEzIDM1OTkvNjkwNC8xOTEzCitmIDM2ODMvNjkwNS8xODQ3IDM2NzYvNjkwNi8xODQ3IDY3MDQvNjkwNy8xODQ3CitmIDY3MDUvNjkwOC8xODQ3IDY3MDYvNjkwOS8xODQ3IDM2ODMvNjkxMC8xODQ3CitmIDY3MDcvNjkxMS8xOTA3IDM2NzcvNjkxMi8xOTA3IDY3MDgvNjkxMy8xOTA3CitmIDY3MDkvNjkxNC8xOTA3IDY3MTAvNjkxNS8xOTA3IDY3MTEvNjkxNi8xOTA3CitmIDM2ODEvNjkxNy8xODQyIDM2NzgvNjkxOC8xODQyIDY3MTIvNjkxOS8xODQyCitmIDY3MTMvNjkyMC8xODQyIDY3MTQvNjkyMS8xODQyIDM2ODEvNjkyMi8xODQyCitmIDY3MTUvNjkyMy8xOTE0IDM2NzkvNjkyNC8xOTE0IDY3MTYvNjkyNS8xOTE0CitmIDY3MTcvNjkyNi8xOTE0IDY3MTgvNjkyNy8xOTE0IDY3MTkvNjkyOC8xOTE0CitmIDM2NzkvNjkyOS8xOTE1IDM2ODAvNjkzMC8xOTE1IDY3MjAvNjkzMS8xOTE1CitmIDY3MjEvNjkzMi8xOTE1IDY3MjIvNjkzMy8xOTE1IDM2NzkvNjkzNC8xOTE1CitmIDM2NDQvNjkzNS8xODQyIDM2ODEvNjkzNi8xODQyIDY3MjMvNjkzNy8xODQyCitmIDY3MjQvNjkzOC8xODQyIDY3MjUvNjkzOS8xODQyIDM2NDQvNjk0MC8xODQyCitmIDM2NzcvNjk0MS8xODQ2IDM2ODIvNjk0Mi8xODQ2IDY3MjYvNjk0My8xODQ2CitmIDY3MjcvNjk0NC8xODQ2IDY3MjgvNjk0NS8xODQ2IDM2NzcvNjk0Ni8xODQ2CitmIDM2NDMvNjk0Ny8xODQ3IDM2ODMvNjk0OC8xODQ3IDY3MjkvNjk0OS8xODQ3CitmIDY3MzAvNjk1MC8xODQ3IDY3MzEvNjk1MS8xODQ3IDM2NDMvNjk1Mi8xODQ3CitmIDM2MTEvNjk1My8xMTcyIDY3MzIvNjk1NC8xMTcyIDY3MzMvNjk1NS8xMTcyCitmIDY3MzQvNjk1Ni8xMTcyIDM2MDMvNjk1Ny8xMTcyIDM2MTEvNjk1OC8xMTcyCitmIDMwMTYvNTI2NC82ODcgMzAxNS81MjYyLzY4NyAzNjg0LzU2MDkvNjg3CitmIDMzODAvNTUyOS82ODcgMzY4NC81NjA5LzY4NyAzMDE1LzUyNjIvNjg3CitmIDMwMTUvNTI2Mi82ODcgMzM5OS81NjE2LzY4NyAzMzgwLzU1MjkvNjg3CitmIDI5ODEvNjk1OS82ODcgMzg3Ni82OTYwLzY4NyAzNDQyLzU2NjUvNjg3CitmIDM0NDIvNTY2NS82ODcgMzQ0MS81NjY4LzY4NyAyOTgxLzY5NTkvNjg3CitmIDM4NzYvNjk2MC82ODcgMzg3Ny82OTYxLzY4NyAzNDM5LzU2MTAvNjg3CitmIDM0MzkvNTYxMC82ODcgMzQ0Mi81NjY1LzY4NyAzODc2LzY5NjAvNjg3CitmIDM4NzcvNjk2MS82ODcgMjk4Mi82OTYyLzY4NyAzNDUwLzU2NjYvNjg3CitmIDM0NTAvNTY2Ni82ODcgMzQzOS81NjEwLzY4NyAzODc3LzY5NjEvNjg3CitmIDI5ODMvNjk2My82ODcgMzQ0MC81NjYzLzY4NyAzNDUwLzU2NjYvNjg3CitmIDM0NTAvNTY2Ni82ODcgMjk4Mi82OTYyLzY4NyAyOTgzLzY5NjMvNjg3CitmIDI5ODQvNjk2NC82ODcgMzQzNy81NjY0LzY4NyAzNDQwLzU2NjMvNjg3CitmIDM0NDAvNTY2My82ODcgMjk4My82OTYzLzY4NyAyOTg0LzY5NjQvNjg3CitmIDM0NTMvNTY3Mi82ODcgMzQzMS81NjYyLzY4NyAyOTg1LzU2ODIvNjg3CitmIDI5ODUvNTY4Mi82ODcgMzY4NS82OTY1LzY4NyAzNDUzLzU2NzIvNjg3CitmIDI5NzMvNjk2Ni82ODcgMzQ1Mi81NjczLzY4NyAzNDUzLzU2NzIvNjg3CitmIDM0NTMvNTY3Mi82ODcgMzY4NS82OTY1LzY4NyAyOTczLzY5NjYvNjg3CitmIDI5ODYvNjk2Ny82ODcgMzQ1NC81Njc0LzY4NyAzNDUyLzU2NzMvNjg3CitmIDM0NTIvNTY3My82ODcgMjk3My82OTY2LzY4NyAyOTg2LzY5NjcvNjg3CitmIDI5NzgvNjk2OC82ODcgMzQ1MS81NjY5LzY4NyAzNDU0LzU2NzQvNjg3CitmIDM0NTQvNTY3NC82ODcgMjk4Ni82OTY3LzY4NyAyOTc4LzY5NjgvNjg3CitmIDM0NTEvNTY2OS82ODcgMjk3OC82OTY4LzY4NyAyOTc3LzY5NjkvNjg3CitmIDI5NzcvNjk2OS82ODcgMzQ0Ni81NjcwLzY4NyAzNDUxLzU2NjkvNjg3CitmIDI5NzcvNjk2OS82ODcgMzQ0NC81NTU4LzY4NyAzNDQ2LzU2NzAvNjg3CitmIDM0NDMvNTU5Ny82ODcgMzQ0NS81NjA3LzY4NyAyOTc5LzY5NzAvNjg3CitmIDI5NzkvNjk3MC82ODcgMjk4MC82OTcxLzY4NyAzNDQzLzU1OTcvNjg3CitmIDM0NDkvNTY2Ny82ODcgMzQ0My81NTk3LzY4NyAyOTgwLzY5NzEvNjg3CitmIDI5ODAvNjk3MS82ODcgMjk3Ni82OTcyLzY4NyAzNDQ5LzU2NjcvNjg3CitmIDM0NTgvNTY3Ni82ODcgMzQ0OS81NjY3LzY4NyAyOTc2LzY5NzIvNjg3CitmIDI5NzYvNjk3Mi82ODcgMjk3NS82OTczLzY4NyAzNDU4LzU2NzYvNjg3CitmIDM0NjEvNTY0NS82ODcgMjk3NS82OTczLzY4NyAyOTgxLzY5NTkvNjg3CitmIDI5ODEvNjk1OS82ODcgMzQ0MS81NjY4LzY4NyAzNDYxLzU2NDUvNjg3CitmIDI5NzUvNjk3My82ODcgMzQ2MS81NjQ1LzY4NyAzNDU4LzU2NzYvNjg3CitmIDM0NDgvNTU1OS82ODcgMzQ0NC81NTU4LzY4NyAyOTc3LzY5NjkvNjg3CitmIDI5NzcvNjk2OS82ODcgMzY4Ni82OTc0LzY4NyAzNDQ4LzU1NTkvNjg3CitmIDM0NDUvNTYwNy82ODcgMzQ0Ny81NjcxLzY4NyAzNjg2LzY5NzQvNjg3CitmIDM2ODYvNjk3NC82ODcgMjk3OS82OTcwLzY4NyAzNDQ1LzU2MDcvNjg3CitmIDM2ODYvNjk3NC82ODcgMzQ0Ny81NjcxLzY4NyAzNDQ4LzU1NTkvNjg3CitmIDM2ODgvNTY2MS82ODcgMzQ2Ny81Njg2LzY4NyAzNDY2LzU2ODEvNjg3CitmIDM0NjYvNTY4MS82ODcgMzQzMi81NTUzLzY4NyAzNjg4LzU2NjEvNjg3CitmIDM2ODkvNTY4NS82ODcgMzQyOS81NjU5LzY4NyAzNDI4LzU1ODkvNjg3CitmIDM0MjMvNTY1NS82ODcgMzQyMi81NjU0LzY4NyAzNDcxLzU2OTAvNjg3CitmIDMwNTQvNTM4MC82ODcgMzQ1Ni81Njc1LzY4NyAzNjkwLzU2NTEvNjg3CitmIDM2OTAvNTY1MS82ODcgMzQwNi81MzgxLzY4NyAzMDU0LzUzODAvNjg3CitmIDM2OTAvNTY1MS82ODcgMzQ1Ni81Njc1LzY4NyAzNDI3LzU2NTAvNjg3CitmIDMzMDUvNTM5My82ODcgMzA1OC81MzkyLzY4NyAzMDYyLzU0NTMvNjg3CitmIDMwNjIvNTQ1My82ODcgMzA2MS81NDUwLzY4NyAzMzA1LzUzOTMvNjg3CitmIDM0MjgvNTU4OS82ODcgMzY5MS81NTkwLzY4NyAzNDY4LzU2ODcvNjg3CitmIDM0NjgvNTY4Ny82ODcgMzY4OS81Njg1LzY4NyAzNDI4LzU1ODkvNjg3CitmIDMwNTgvNTM5Mi82ODcgMzMzOC81MzkwLzY4NyAzNjkxLzU1OTAvNjg3CitmIDM0MjcvNTY1MC82ODcgMzY5MS81NTkwLzY4NyAzMzM4LzUzOTAvNjg3CitmIDMzMzgvNTM5MC82ODcgMzA1Ny81Mzg5LzY4NyAzNDI3LzU2NTAvNjg3CitmIDM2OTIvNjk3NS82ODcgMzY5My81NjgwLzY4NyAzNDM3LzU2NjQvNjg3CitmIDM0MzcvNTY2NC82ODcgMjk4NC82OTY0LzY4NyAzNjkyLzY5NzUvNjg3CitmIDM0MzcvNTY2NC82ODcgMzY5My81NjgwLzY4NyAyOTk0LzUyMTQvNjg3CitmIDI5OTQvNTIxNC82ODcgMjk5My81MjEyLzY4NyAzNDM3LzU2NjQvNjg3CitmIDM5OTcvNjk3Ni82ODcgMzY5OS82OTc3LzY4NyAyOTg2LzY5NjcvNjg3CitmIDI5ODYvNjk2Ny82ODcgMjk3My82OTY2LzY4NyAzOTk3LzY5NzYvNjg3CitmIDI5NzQvNjk3OC82ODcgMzY5Mi82OTc1LzY4NyAzNzgxLzY5NzkvNjg3CitmIDM3ODEvNjk3OS82ODcgNDUxMC82OTgwLzY4NyAyOTc0LzY5NzgvNjg3CitmIDM5OTcvNjk3Ni82ODcgMjk3My82OTY2LzY4NyAzNjg1LzY5NjUvNjg3CitmIDM2ODUvNjk2NS82ODcgMzY5OC82OTgxLzY4NyAzOTk3LzY5NzYvNjg3CitmIDI5NjEvNjk4Mi82ODcgMzY5OC82OTgxLzY4NyAzNjg1LzY5NjUvNjg3CitmIDM2ODUvNjk2NS82ODcgMjk4NS81NjgyLzY4NyAyOTYxLzY5ODIvNjg3CitmIDI5NzgvNjk2OC82ODcgMjk4Ni82OTY3LzY4NyAzNjk5LzY5NzcvNjg3CitmIDM2OTkvNjk3Ny82ODcgMjk3Mi82OTgzLzY4NyAyOTc4LzY5NjgvNjg3CitmIDM4NzUvNjk4NC82ODcgMzQ3MS81NjkwLzY4NyAyOTg5LzU2OTIvNjg3CitmIDI5ODkvNTY5Mi82ODcgNDYzNi82OTg1LzY4NyAzODc1LzY5ODQvNjg3CitmIDI5NjUvNjk4Ni8xMDQ0IDI5NjIvNjk4Ny8xMDQ0IDM3MDgvNjk4OC8xMDQ0CitmIDM3MDgvNjk4OC8xMDQ0IDM3MzIvNjk4OS8xMDQ0IDI5NjUvNjk4Ni8xMDQ0CitmIDM3MzIvNjk4OS8xMDQ0IDM3MDgvNjk4OC8xMDQ0IDM3MDcvNjk5MC8xMDQ0CitmIDM3MDcvNjk5MC8xMDQ0IDM3MzEvNjk5MS8xMDQ0IDM3MzIvNjk4OS8xMDQ0CitmIDM3MzEvNjk5MS8xMDQ0IDM3MDcvNjk5MC8xMDQ0IDM3MDYvNjk5Mi8xMDQ0CitmIDM3MDYvNjk5Mi8xMDQ0IDM3MzAvNjk5My8xMDQ0IDM3MzEvNjk5MS8xMDQ0CitmIDM3MzAvNjk5My8xMDQ0IDM3MDYvNjk5Mi8xMDQ0IDM3MDUvNTE0OC8xMDQ0CitmIDM3MDUvNTE0OC8xMDQ0IDM3MjkvNTE0Ny8xMDQ0IDM3MzAvNjk5My8xMDQ0CitmIDI5NDcvNjk5NC8xMDQ0IDI5NDkvNjk5NS8xMDQ0IDM3MjUvNjk5Ni8xMDQ0CitmIDM3MjUvNjk5Ni8xMDQ0IDM3MDEvNjk5Ny8xMDQ0IDI5NDcvNjk5NC8xMDQ0CitmIDM3MDEvNjk5Ny8xMDQ0IDM3MjUvNjk5Ni8xMDQ0IDM3MjYvNjk5OC8xMDQ0CitmIDM3MjYvNjk5OC8xMDQ0IDM3MDIvNjk5OS8xMDQ0IDM3MDEvNjk5Ny8xMDQ0CitmIDM3MDIvNjk5OS8xMDQ0IDM3MjYvNjk5OC8xMDQ0IDM3MjcvNzAwMC8xMDQ0CitmIDM3MjcvNzAwMC8xMDQ0IDM3MDMvNzAwMS8xMDQ0IDM3MDIvNjk5OS8xMDQ0CitmIDM3MDMvNzAwMS8xMDQ0IDM3MjcvNzAwMC8xMDQ0IDM3MjgvNTE1MC8xMDQ0CitmIDM3MjgvNTE1MC8xMDQ0IDM3MDQvNTE0OS8xMDQ0IDM3MDMvNzAwMS8xMDQ0CitmIDI5NjQvNzAwMi8xNzgyIDI5NTEvNzAwMy8xNzgyIDM3ODgvNzAwNC8xNzgyCitmIDM3ODgvNzAwNC8xNzgyIDM3MjQvNzAwNS8xNzgyIDI5NjQvNzAwMi8xNzgyCitmIDM3MjQvNzAwNS8xNzgyIDM3ODgvNzAwNC8xNzgyIDM3ODkvNzAwNi8xNzgyCitmIDM3ODkvNzAwNi8xNzgyIDM3MjMvNzAwNy8xNzgyIDM3MjQvNzAwNS8xNzgyCitmIDM3MjMvNzAwNy8xNzgyIDM3ODkvNzAwNi8xNzgyIDM3OTAvNzAwOC8xNzgyCitmIDM3OTAvNzAwOC8xNzgyIDM3MjIvNzAwOS8xNzgyIDM3MjMvNzAwNy8xNzgyCitmIDM3MjIvNzAwOS8xNzgyIDM3OTAvNzAwOC8xNzgyIDM3OTEvNTE1Mi8xNzgyCitmIDM3OTEvNTE1Mi8xNzgyIDM3MjEvNTE1MS8xNzgyIDM3MjIvNzAwOS8xNzgyCitmIDQ1MDAvNzAxMC8xNzgyIDQ1MDgvNzAxMS8xNzgyIDM3MTcvNzAxMi8xNzgyCitmIDM3MTcvNzAxMi8xNzgyIDM3OTUvNzAxMy8xNzgyIDQ1MDAvNzAxMC8xNzgyCitmIDM3OTUvNzAxMy8xNzgyIDM3MTcvNzAxMi8xNzgyIDM3MTgvNzAxNC8xNzgyCitmIDM3MTgvNzAxNC8xNzgyIDM3OTQvNzAxNS8xNzgyIDM3OTUvNzAxMy8xNzgyCitmIDM3OTQvNzAxNS8xNzgyIDM3MTgvNzAxNC8xNzgyIDM3MTkvNzAxNi8xNzgyCitmIDM3MTkvNzAxNi8xNzgyIDM3OTMvNzAxNy8xNzgyIDM3OTQvNzAxNS8xNzgyCitmIDM3OTMvNzAxNy8xNzgyIDM3MTkvNzAxNi8xNzgyIDM3MjAvNTE1NC8xNzgyCitmIDM3MjAvNTE1NC8xNzgyIDM3OTIvNTE1My8xNzgyIDM3OTMvNzAxNy8xNzgyCitmIDM4MDQvNzAxOC8xNzgzIDI5NTMvNzAxOS8xNzgzIDI5NTYvNzAyMC8xNzgzCitmIDI5NTYvNzAyMC8xNzgzIDM4MjgvNzAyMS8xNzgzIDM4MDQvNzAxOC8xNzgzCitmIDM4MDUvNzAyMi8xNzgzIDM4MDQvNzAxOC8xNzgzIDM4MjgvNzAyMS8xNzgzCitmIDM4MjgvNzAyMS8xNzgzIDM4MjkvNzAyMy8xNzgzIDM4MDUvNzAyMi8xNzgzCitmIDM4MDYvNzAyNC8xNzgzIDM4MDUvNzAyMi8xNzgzIDM4MjkvNzAyMy8xNzgzCitmIDM4MjkvNzAyMy8xNzgzIDM4MzAvNzAyNS8xNzgzIDM4MDYvNzAyNC8xNzgzCitmIDM4MDcvNTE1Ni8xNzgzIDM4MDYvNzAyNC8xNzgzIDM4MzAvNzAyNS8xNzgzCitmIDM4MzAvNzAyNS8xNzgzIDM4MzEvNTE1Ny8xNzgzIDM4MDcvNTE1Ni8xNzgzCitmIDI5NDUvNzAyNi8xNzgzIDM4MzUvNzAyNy8xNzgzIDI5NDYvNzAyOC8xNzgzCitmIDI5NDUvNzAyNi8xNzgzIDM4MTEvNzAyOS8xNzgzIDM4MzUvNzAyNy8xNzgzCitmIDM4MzQvNzAzMC8xNzgzIDM4MzUvNzAyNy8xNzgzIDM4MTEvNzAyOS8xNzgzCitmIDM4MTEvNzAyOS8xNzgzIDM4MTAvNzAzMS8xNzgzIDM4MzQvNzAzMC8xNzgzCitmIDM4MzMvNzAzMi8xNzgzIDM4MzQvNzAzMC8xNzgzIDM4MTAvNzAzMS8xNzgzCitmIDM4MTAvNzAzMS8xNzgzIDM4MDkvNzAzMy8xNzgzIDM4MzMvNzAzMi8xNzgzCitmIDM4MzIvNTE1OC8xNzgzIDM4MzMvNzAzMi8xNzgzIDM4MDkvNzAzMy8xNzgzCitmIDM4MDkvNzAzMy8xNzgzIDM4MDgvNTE1NS8xNzgzIDM4MzIvNTE1OC8xNzgzCitmIDI5NjMvNzAzNC8xMDQ0IDM5MzcvNzAzNS8xMDQ0IDM5MzgvNzAzNi8xMDQ0CitmIDM5MzgvNzAzNi8xMDQ0IDM3MTYvNzAzNy8xMDQ0IDI5NjMvNzAzNC8xMDQ0CitmIDM3MTYvNzAzNy8xMDQ0IDM5MzgvNzAzNi8xMDQ0IDM5MzkvNzAzOC8xMDQ0CitmIDM5MzkvNzAzOC8xMDQ0IDM5MjUvNzAzOS8xMDQ0IDM3MTYvNzAzNy8xMDQ0CitmIDM5MjUvNzAzOS8xMDQ0IDM5MzkvNzAzOC8xMDQ0IDM5NDAvNzA0MC8xMDQ0CitmIDM5NDAvNzA0MC8xMDQ0IDM5MjQvNzA0MS8xMDQ0IDM5MjUvNzAzOS8xMDQ0CitmIDM5MjQvNzA0MS8xMDQ0IDM5NDAvNzA0MC8xMDQ0IDM5NDEvNTE2MC8xMDQ0CitmIDM5NDEvNTE2MC8xMDQ0IDM5MjMvNTE1OS8xMDQ0IDM5MjQvNzA0MS8xMDQ0CitmIDI5NDkvNjk5NS8xMDQ0IDM5MzUvNzA0Mi8xMDQ0IDM5NDIvNzA0My8xMDQ0CitmIDM5NDIvNzA0My8xMDQ0IDM3MjUvNjk5Ni8xMDQ0IDI5NDkvNjk5NS8xMDQ0CitmIDM3MjUvNjk5Ni8xMDQ0IDM5NDIvNzA0My8xMDQ0IDM5NDMvNzA0NC8xMDQ0CitmIDM5NDMvNzA0NC8xMDQ0IDM3MjYvNjk5OC8xMDQ0IDM3MjUvNjk5Ni8xMDQ0CitmIDM3MjYvNjk5OC8xMDQ0IDM5NDMvNzA0NC8xMDQ0IDM5NDQvNzA0NS8xMDQ0CitmIDM5NDQvNzA0NS8xMDQ0IDM3MjcvNzAwMC8xMDQ0IDM3MjYvNjk5OC8xMDQ0CitmIDM3MjcvNzAwMC8xMDQ0IDM5NDQvNzA0NS8xMDQ0IDM5NDUvNTE2MS8xMDQ0CitmIDM5NDUvNTE2MS8xMDQ0IDM3MjgvNTE1MC8xMDQ0IDM3MjcvNzAwMC8xMDQ0CitmIDI5NTUvNzA0Ni8xNzg0IDI5NjcvNzA0Ny8xNzg0IDM3NDgvNzA0OC8xNzg0CitmIDM3NDgvNzA0OC8xNzg0IDM4MjAvNzA0OS8xNzg0IDI5NTUvNzA0Ni8xNzg0CitmIDM4MjAvNzA0OS8xNzg0IDM3NDgvNzA0OC8xNzg0IDM3NDcvNzA1MC8xNzg0CitmIDM3NDcvNzA1MC8xNzg0IDM4MjEvNzA1MS8xNzg0IDM4MjAvNzA0OS8xNzg0CitmIDM4MjEvNzA1MS8xNzg0IDM3NDcvNzA1MC8xNzg0IDM3NDYvNzA1Mi8xNzg0CitmIDM3NDYvNzA1Mi8xNzg0IDM4MjIvNzA1My8xNzg0IDM4MjEvNzA1MS8xNzg0CitmIDM4MjIvNzA1My8xNzg0IDM3NDYvNzA1Mi8xNzg0IDM3NDUvNTE2NC8xNzg0CitmIDM3NDUvNTE2NC8xNzg0IDM4MjMvNTE2My8xNzg0IDM4MjIvNzA1My8xNzg0CitmIDQ1MDkvNzA1NC8xNzg0IDQ1MDMvNzA1NS8xNzg0IDM4MjcvNzA1Ni8xNzg0CitmIDM4MjcvNzA1Ni8xNzg0IDM3NDEvNzA1Ny8xNzg0IDQ1MDkvNzA1NC8xNzg0CitmIDM3NDEvNzA1Ny8xNzg0IDM4MjcvNzA1Ni8xNzg0IDM4MjYvNzA1OC8xNzg0CitmIDM4MjYvNzA1OC8xNzg0IDM3NDIvNzA1OS8xNzg0IDM3NDEvNzA1Ny8xNzg0CitmIDM3NDIvNzA1OS8xNzg0IDM4MjYvNzA1OC8xNzg0IDM4MjUvNzA2MC8xNzg0CitmIDM4MjUvNzA2MC8xNzg0IDM3NDMvNzA2MS8xNzg0IDM3NDIvNzA1OS8xNzg0CitmIDM3NDMvNzA2MS8xNzg0IDM4MjUvNzA2MC8xNzg0IDM4MjQvNTE2Ni8xNzg0CitmIDM4MjQvNTE2Ni8xNzg0IDM3NDQvNTE2NS8xNzg0IDM3NDMvNzA2MS8xNzg0CitmIDI5NjYvNzA2Mi82ODcgMjk2OC83MDYzLzY4NyAzNzU2LzcwNjQvNjg3CitmIDM3NTYvNzA2NC82ODcgMzc0MC83MDY1LzY4NyAyOTY2LzcwNjIvNjg3CitmIDM3NDAvNzA2NS82ODcgMzc1Ni83MDY0LzY4NyAzNzU1LzcwNjYvNjg3CitmIDM3NTUvNzA2Ni82ODcgMzczOS83MDY3LzY4NyAzNzQwLzcwNjUvNjg3CitmIDM3MzkvNzA2Ny82ODcgMzc1NS83MDY2LzY4NyAzNzU0LzcwNjgvNjg3CitmIDM3NTQvNzA2OC82ODcgMzczOC83MDY5LzY4NyAzNzM5LzcwNjcvNjg3CitmIDM3MzgvNzA2OS82ODcgMzc1NC83MDY4LzY4NyAzNzUzLzUxNjgvNjg3CitmIDM3NTMvNTE2OC82ODcgMzczNy81MTY3LzY4NyAzNzM4LzcwNjkvNjg3CitmIDQ2MjUvNzA3MC82ODcgNDYyNC83MDcxLzY4NyAzNzMzLzcwNzIvNjg3CitmIDM3MzMvNzA3Mi82ODcgMzc0OS83MDczLzY4NyA0NjI1LzcwNzAvNjg3CitmIDM3NDkvNzA3My82ODcgMzczMy83MDcyLzY4NyAzNzM0LzcwNzQvNjg3CitmIDM3MzQvNzA3NC82ODcgMzc1MC83MDc1LzY4NyAzNzQ5LzcwNzMvNjg3CitmIDM3NTAvNzA3NS82ODcgMzczNC83MDc0LzY4NyAzNzM1LzcwNzYvNjg3CitmIDM3MzUvNzA3Ni82ODcgMzc1MS83MDc3LzY4NyAzNzUwLzcwNzUvNjg3CitmIDM3NTEvNzA3Ny82ODcgMzczNS83MDc2LzY4NyAzNzM2LzUxNzAvNjg3CitmIDM3MzYvNTE3MC82ODcgMzc1Mi81MTY5LzY4NyAzNzUxLzcwNzcvNjg3CitmIDI5NjkvNzA3OC82ODcgMzk4Ny83MDc5LzY4NyAzOTg4LzcwODAvNjg3CitmIDM5ODgvNzA4MC82ODcgMzc2NC83MDgxLzY4NyAyOTY5LzcwNzgvNjg3CitmIDM3NjQvNzA4MS82ODcgMzk4OC83MDgwLzY4NyAzOTg5LzcwODIvNjg3CitmIDM5ODkvNzA4Mi82ODcgMzc2My83MDgzLzY4NyAzNzY0LzcwODEvNjg3CitmIDM3NjMvNzA4My82ODcgMzk4OS83MDgyLzY4NyAzOTkwLzcwODQvNjg3CitmIDM5OTAvNzA4NC82ODcgMzc2Mi83MDg1LzY4NyAzNzYzLzcwODMvNjg3CitmIDM3NjIvNzA4NS82ODcgMzk5MC83MDg0LzY4NyAzOTkxLzUxNzIvNjg3CitmIDM5OTEvNTE3Mi82ODcgMzc2MS81MTcxLzY4NyAzNzYyLzcwODUvNjg3CitmIDQ2MzYvNjk4NS82ODcgNDcyOS83MDg2LzY4NyA0Mjc2LzcwODcvNjg3CitmIDQyNzYvNzA4Ny82ODcgMzg3NS82OTg0LzY4NyA0NjM2LzY5ODUvNjg3CitmIDM4NzUvNjk4NC82ODcgNDI3Ni83MDg3LzY4NyA0Mjc3LzcwODgvNjg3CitmIDQyNzcvNzA4OC82ODcgMzg3NC83MDg5LzY4NyAzODc1LzY5ODQvNjg3CitmIDM4NzQvNzA4OS82ODcgNDI3Ny83MDg4LzY4NyA0Mjc4LzcwOTAvNjg3CitmIDQyNzgvNzA5MC82ODcgMzg3My83MDkxLzY4NyAzODc0LzcwODkvNjg3CitmIDM4NzMvNzA5MS82ODcgNDI3OC83MDkwLzY4NyA0Mjc5LzcwOTIvNjg3CitmIDQyNzkvNzA5Mi82ODcgMzg3Mi83MDkzLzY4NyAzODczLzcwOTEvNjg3CitmIDQ1MDIvNzA5NC8xMDQzIDQ1MDAvNzAxMC8xMDQzIDM3OTUvNzAxMy8xMDQzCitmIDM3OTUvNzAxMy8xMDQzIDM4MTkvNzA5NS8xMDQzIDQ1MDIvNzA5NC8xMDQzCitmIDM4MTkvNzA5NS8xMDQzIDM3OTUvNzAxMy8xMDQzIDM3OTQvNzAxNS8xMDQzCitmIDM3OTQvNzAxNS8xMDQzIDM4MTgvNzA5Ni8xMDQzIDM4MTkvNzA5NS8xMDQzCitmIDM4MTgvNzA5Ni8xMDQzIDM3OTQvNzAxNS8xMDQzIDM3OTMvNzAxNy8xMDQzCitmIDM3OTMvNzAxNy8xMDQzIDM4MTcvNzA5Ny8xMDQzIDM4MTgvNzA5Ni8xMDQzCitmIDM4MTcvNzA5Ny8xMDQzIDM3OTMvNzAxNy8xMDQzIDM3OTIvNTE1My8xMDQzCitmIDM3OTIvNTE1My8xMDQzIDM4MTYvNTE3NS8xMDQzIDM4MTcvNzA5Ny8xMDQzCitmIDI5NTEvNzAwMy8xMDQzIDI5NTQvNzA5OC8xMDQzIDM4MTIvNzA5OS8xMDQzCitmIDM4MTIvNzA5OS8xMDQzIDM3ODgvNzAwNC8xMDQzIDI5NTEvNzAwMy8xMDQzCitmIDM3ODgvNzAwNC8xMDQzIDM4MTIvNzA5OS8xMDQzIDM4MTMvNzEwMC8xMDQzCitmIDM4MTMvNzEwMC8xMDQzIDM3ODkvNzAwNi8xMDQzIDM3ODgvNzAwNC8xMDQzCitmIDM3ODkvNzAwNi8xMDQzIDM4MTMvNzEwMC8xMDQzIDM4MTQvNzEwMS8xMDQzCitmIDM4MTQvNzEwMS8xMDQzIDM3OTAvNzAwOC8xMDQzIDM3ODkvNzAwNi8xMDQzCitmIDM3OTAvNzAwOC8xMDQzIDM4MTQvNzEwMS8xMDQzIDM4MTUvNTE3Ni8xMDQzCitmIDM4MTUvNTE3Ni8xMDQzIDM3OTEvNTE1Mi8xMDQzIDM3OTAvNzAwOC8xMDQzCitmIDM4MTEvNzEwMi8xNzg1IDI5NDUvNzEwMy8xNzg1IDI5NDcvNjk5NC8xNzg1CitmIDI5NDcvNjk5NC8xNzg1IDM3MDEvNjk5Ny8xNzg1IDM4MTEvNzEwMi8xNzg1CitmIDM4MTAvNzEwNC8xNzg1IDM4MTEvNzEwMi8xNzg1IDM3MDEvNjk5Ny8xNzg1CitmIDM3MDEvNjk5Ny8xNzg1IDM3MDIvNjk5OS8xNzg1IDM4MTAvNzEwNC8xNzg1CitmIDM4MDkvNzEwNS8xNzg1IDM4MTAvNzEwNC8xNzg1IDM3MDIvNjk5OS8xNzg1CitmIDM3MDIvNjk5OS8xNzg1IDM3MDMvNzAwMS8xNzg1IDM4MDkvNzEwNS8xNzg1CitmIDM4MDgvNTE3OC8xNzg1IDM4MDkvNzEwNS8xNzg1IDM3MDMvNzAwMS8xNzg1CitmIDM3MDMvNzAwMS8xNzg1IDM3MDQvNTE0OS8xNzg1IDM4MDgvNTE3OC8xNzg1CitmIDM3MDgvNjk4OC8xNzg1IDI5NjIvNjk4Ny8xNzg1IDI5NTMvNzEwNi8xNzg1CitmIDI5NTMvNzEwNi8xNzg1IDM4MDQvNzEwNy8xNzg1IDM3MDgvNjk4OC8xNzg1CitmIDM3MDcvNjk5MC8xNzg1IDM3MDgvNjk4OC8xNzg1IDM4MDQvNzEwNy8xNzg1CitmIDM4MDQvNzEwNy8xNzg1IDM4MDUvNzEwOC8xNzg1IDM3MDcvNjk5MC8xNzg1CitmIDM3MDYvNjk5Mi8xNzg1IDM3MDcvNjk5MC8xNzg1IDM4MDUvNzEwOC8xNzg1CitmIDM4MDUvNzEwOC8xNzg1IDM4MDYvNzEwOS8xNzg1IDM3MDYvNjk5Mi8xNzg1CitmIDM3MDUvNTE0OC8xNzg1IDM3MDYvNjk5Mi8xNzg1IDM4MDYvNzEwOS8xNzg1CitmIDM4MDYvNzEwOS8xNzg1IDM4MDcvNTE3Ny8xNzg1IDM3MDUvNTE0OC8xNzg1CitmIDQ1MDgvNzExMC8xNzg2IDQ1MDkvNzA1NC8xNzg2IDM3NDEvNzA1Ny8xNzg2CitmIDM3NDEvNzA1Ny8xNzg2IDM3MTcvNzExMS8xNzg2IDQ1MDgvNzExMC8xNzg2CitmIDM3MTcvNzExMS8xNzg2IDM3NDEvNzA1Ny8xNzg2IDM3NDIvNzA1OS8xNzg2CitmIDM3NDIvNzA1OS8xNzg2IDM3MTgvNzExMi8xNzg2IDM3MTcvNzExMS8xNzg2CitmIDM3MTgvNzExMi8xNzg2IDM3NDIvNzA1OS8xNzg2IDM3NDMvNzA2MS8xNzg2CitmIDM3NDMvNzA2MS8xNzg2IDM3MTkvNzExMy8xNzg2IDM3MTgvNzExMi8xNzg2CitmIDM3MTkvNzExMy8xNzg2IDM3NDMvNzA2MS8xNzg2IDM3NDQvNTE2NS8xNzg2CitmIDM3NDQvNTE2NS8xNzg2IDM3MjAvNTE3OS8xNzg2IDM3MTkvNzExMy8xNzg2CitmIDI5NjcvNzA0Ny8xNzg2IDI5NjQvNzExNC8xNzg2IDM3MjQvNzExNS8xNzg2CitmIDM3MjQvNzExNS8xNzg2IDM3NDgvNzA0OC8xNzg2IDI5NjcvNzA0Ny8xNzg2CitmIDM3NDgvNzA0OC8xNzg2IDM3MjQvNzExNS8xNzg2IDM3MjMvNzExNi8xNzg2CitmIDM3MjMvNzExNi8xNzg2IDM3NDcvNzA1MC8xNzg2IDM3NDgvNzA0OC8xNzg2CitmIDM3NDcvNzA1MC8xNzg2IDM3MjMvNzExNi8xNzg2IDM3MjIvNzExNy8xNzg2CitmIDM3MjIvNzExNy8xNzg2IDM3NDYvNzA1Mi8xNzg2IDM3NDcvNzA1MC8xNzg2CitmIDM3NDYvNzA1Mi8xNzg2IDM3MjIvNzExNy8xNzg2IDM3MjEvNTE4MC8xNzg2CitmIDM3MjEvNTE4MC8xNzg2IDM3NDUvNTE2NC8xNzg2IDM3NDYvNzA1Mi8xNzg2CitmIDQ1MDEvNzExOC8xMDQzIDQ1MTYvNzExOS8xMDQzIDM5NDYvNzEyMC8xMDQzCitmIDM5NDYvNzEyMC8xMDQzIDM4MDMvNzEyMS8xMDQzIDQ1MDEvNzExOC8xMDQzCitmIDM4MDMvNzEyMS8xMDQzIDM5NDYvNzEyMC8xMDQzIDM5NDcvNzEyMi8xMDQzCitmIDM5NDcvNzEyMi8xMDQzIDM5MzMvNzEyMy8xMDQzIDM4MDMvNzEyMS8xMDQzCitmIDM5MzMvNzEyMy8xMDQzIDM5NDcvNzEyMi8xMDQzIDM5NDgvNzEyNC8xMDQzCitmIDM5NDgvNzEyNC8xMTAyIDM5MzIvNzEyNS8xMTAyIDM5MzMvNzEyMy8xMTAyCitmIDM5MzIvNzEyNS8xMTAyIDM5NDgvNzEyNC8xMTAyIDM5NDkvNTE4Mi8xMTAyCitmIDM5NDkvNTE4Mi8xMDQzIDM5MzEvNTE4MS8xMDQzIDM5MzIvNzEyNS8xMDQzCitmIDI5NTQvNzA5OC8xMDQzIDM5MzYvNzEyNi8xMDQzIDM5NTAvNzEyNy8xMDQzCitmIDM5NTAvNzEyNy8xMDQzIDM4MTIvNzA5OS8xMDQzIDI5NTQvNzA5OC8xMDQzCitmIDM4MTIvNzA5OS8xMDQzIDM5NTAvNzEyNy8xMDQzIDM5NTEvNzEyOC8xMDQzCitmIDM5NTEvNzEyOC8xMDQzIDM4MTMvNzEwMC8xMDQzIDM4MTIvNzA5OS8xMDQzCitmIDM4MTMvNzEwMC8xMDQzIDM5NTEvNzEyOC8xMDQzIDM5NTIvNzEyOS8xMDQzCitmIDM5NTIvNzEyOS8xMDQzIDM4MTQvNzEwMS8xMDQzIDM4MTMvNzEwMC8xMDQzCitmIDM4MTQvNzEwMS8xMDQzIDM5NTIvNzEyOS8xMDQzIDM5NTMvNTE4My8xMDQzCitmIDM5NTMvNTE4My8xMDQzIDM4MTUvNTE3Ni8xMDQzIDM4MTQvNzEwMS8xMDQzCitmIDM3MzMvNzA3Mi8xNzg3IDQ2MjQvNzA3MS8xNzg3IDI5NDYvNzAyOC8xNzg3CitmIDI5NDYvNzAyOC8xNzg3IDM4MzUvNzAyNy8xNzg3IDM3MzMvNzA3Mi8xNzg3CitmIDM3MzQvNzA3NC8xNzg3IDM3MzMvNzA3Mi8xNzg3IDM4MzUvNzAyNy8xNzg3CitmIDM4MzUvNzAyNy8xNzg3IDM4MzQvNzAzMC8xNzg3IDM3MzQvNzA3NC8xNzg3CitmIDM3MzUvNzA3Ni8xNzg3IDM3MzQvNzA3NC8xNzg3IDM4MzQvNzAzMC8xNzg3CitmIDM4MzQvNzAzMC8xNzg3IDM4MzMvNzAzMi8xNzg3IDM3MzUvNzA3Ni8xNzg3CitmIDM3MzYvNTE3MC8xNzg3IDM3MzUvNzA3Ni8xNzg3IDM4MzMvNzAzMi8xNzg3CitmIDM4MzMvNzAzMi8xNzg3IDM4MzIvNTE1OC8xNzg3IDM3MzYvNTE3MC8xNzg3CitmIDM4MjgvNzAyMS8xNzg3IDI5NTYvNzAyMC8xNzg3IDI5NjYvNzA2Mi8xNzg3CitmIDI5NjYvNzA2Mi8xNzg3IDM3NDAvNzA2NS8xNzg3IDM4MjgvNzAyMS8xNzg3CitmIDM4MjkvNzAyMy8xNzg3IDM4MjgvNzAyMS8xNzg3IDM3NDAvNzA2NS8xNzg3CitmIDM3NDAvNzA2NS8xNzg3IDM3MzkvNzA2Ny8xNzg3IDM4MjkvNzAyMy8xNzg3CitmIDM4MzAvNzAyNS8xNzg3IDM4MjkvNzAyMy8xNzg3IDM3MzkvNzA2Ny8xNzg3CitmIDM3MzkvNzA2Ny8xNzg3IDM3MzgvNzA2OS8xNzg3IDM4MzAvNzAyNS8xNzg3CitmIDM4MzEvNTE1Ny8xNzg3IDM4MzAvNzAyNS8xNzg3IDM3MzgvNzA2OS8xNzg3CitmIDM3MzgvNzA2OS8xNzg3IDM3MzcvNTE2Ny8xNzg3IDM4MzEvNTE1Ny8xNzg3CitmIDQ1MDMvNzA1NS82ODcgNDUwNC83MTMwLzY4NyAzODQzLzcxMzEvNjg3CitmIDM4NDMvNzEzMS82ODcgMzgyNy83MDU2LzY4NyA0NTAzLzcwNTUvNjg3CitmIDM4MjcvNzA1Ni82ODcgMzg0My83MTMxLzY4NyAzODQyLzcxMzIvNjg3CitmIDM4NDIvNzEzMi82ODcgMzgyNi83MDU4LzY4NyAzODI3LzcwNTYvNjg3CitmIDM4MjYvNzA1OC82ODcgMzg0Mi83MTMyLzY4NyAzODQxLzcxMzMvNjg3CitmIDM4NDEvNzEzMy82ODcgMzgyNS83MDYwLzY4NyAzODI2LzcwNTgvNjg3CitmIDM4MjUvNzA2MC82ODcgMzg0MS83MTMzLzY4NyAzODQwLzUxODUvNjg3CitmIDM4NDAvNTE4NS82ODcgMzgyNC81MTY2LzY4NyAzODI1LzcwNjAvNjg3CitmIDI5NTcvNzEzNC82ODcgMjk1NS83MDQ2LzY4NyAzODIwLzcwNDkvNjg3CitmIDM4MjAvNzA0OS82ODcgMzgzNi83MTM1LzY4NyAyOTU3LzcxMzQvNjg3CitmIDM4MzYvNzEzNS82ODcgMzgyMC83MDQ5LzY4NyAzODIxLzcwNTEvNjg3CitmIDM4MjEvNzA1MS82ODcgMzgzNy83MTM2LzY4NyAzODM2LzcxMzUvNjg3CitmIDM4MzcvNzEzNi82ODcgMzgyMS83MDUxLzY4NyAzODIyLzcwNTMvNjg3CitmIDM4MjIvNzA1My82ODcgMzgzOC83MTM3LzY4NyAzODM3LzcxMzYvNjg3CitmIDM4MzgvNzEzNy82ODcgMzgyMi83MDUzLzY4NyAzODIzLzUxNjMvNjg3CitmIDM4MjMvNTE2My82ODcgMzgzOS81MTg2LzY4NyAzODM4LzcxMzcvNjg3CitmIDQ1MDQvNzEzMC82ODcgNDUwNS83MTM4LzY4NyAzODUxLzcxMzkvNjg3CitmIDM4NTEvNzEzOS82ODcgMzg0My83MTMxLzY4NyA0NTA0LzcxMzAvNjg3CitmIDM4NDMvNzEzMS82ODcgMzg1MS83MTM5LzY4NyAzODUwLzcxNDAvNjg3CitmIDM4NTAvNzE0MC82ODcgMzg0Mi83MTMyLzY4NyAzODQzLzcxMzEvNjg3CitmIDM4NDIvNzEzMi82ODcgMzg1MC83MTQwLzY4NyAzODQ5LzcxNDEvNjg3CitmIDM4NDkvNzE0MS82ODcgMzg0MS83MTMzLzY4NyAzODQyLzcxMzIvNjg3CitmIDM4NDEvNzEzMy82ODcgMzg0OS83MTQxLzY4NyAzODQ4LzUxODcvNjg3CitmIDM4NDgvNTE4Ny82ODcgMzg0MC81MTg1LzY4NyAzODQxLzcxMzMvNjg3CitmIDI5NTgvNzE0Mi82ODcgMjk1Ny83MTM0LzY4NyAzODM2LzcxMzUvNjg3CitmIDM4MzYvNzEzNS82ODcgMzg0NC83MTQzLzY4NyAyOTU4LzcxNDIvNjg3CitmIDM4NDQvNzE0My82ODcgMzgzNi83MTM1LzY4NyAzODM3LzcxMzYvNjg3CitmIDM4MzcvNzEzNi82ODcgMzg0NS83MTQ0LzY4NyAzODQ0LzcxNDMvNjg3CitmIDM4NDUvNzE0NC82ODcgMzgzNy83MTM2LzY4NyAzODM4LzcxMzcvNjg3CitmIDM4MzgvNzEzNy82ODcgMzg0Ni83MTQ1LzY4NyAzODQ1LzcxNDQvNjg3CitmIDM4NDYvNzE0NS82ODcgMzgzOC83MTM3LzY4NyAzODM5LzUxODYvNjg3CitmIDM4MzkvNTE4Ni82ODcgMzg0Ny81MTg4LzY4NyAzODQ2LzcxNDUvNjg3CitmIDQ1MDUvNzEzOC82ODcgNDUwNi83MTQ2LzY4NyAzODU5LzcxNDcvNjg3CitmIDM4NTkvNzE0Ny82ODcgMzg1MS83MTM5LzY4NyA0NTA1LzcxMzgvNjg3CitmIDM4NTEvNzEzOS82ODcgMzg1OS83MTQ3LzY4NyAzODU4LzcxNDgvNjg3CitmIDM4NTgvNzE0OC82ODcgMzg1MC83MTQwLzY4NyAzODUxLzcxMzkvNjg3CitmIDM4NTAvNzE0MC82ODcgMzg1OC83MTQ4LzY4NyAzODU3LzcxNDkvNjg3CitmIDM4NTcvNzE0OS82ODcgMzg0OS83MTQxLzY4NyAzODUwLzcxNDAvNjg3CitmIDM4NDkvNzE0MS82ODcgMzg1Ny83MTQ5LzY4NyAzODU2LzUxODkvNjg3CitmIDM4NTYvNTE4OS82ODcgMzg0OC81MTg3LzY4NyAzODQ5LzcxNDEvNjg3CitmIDI5NTkvNzE1MC82ODcgMjk1OC83MTQyLzY4NyAzODQ0LzcxNDMvNjg3CitmIDM4NDQvNzE0My82ODcgMzg1Mi83MTUxLzY4NyAyOTU5LzcxNTAvNjg3CitmIDM4NTIvNzE1MS82ODcgMzg0NC83MTQzLzY4NyAzODQ1LzcxNDQvNjg3CitmIDM4NDUvNzE0NC82ODcgMzg1My83MTUyLzY4NyAzODUyLzcxNTEvNjg3CitmIDM4NTMvNzE1Mi82ODcgMzg0NS83MTQ0LzY4NyAzODQ2LzcxNDUvNjg3CitmIDM4NDYvNzE0NS82ODcgMzg1NC83MTUzLzY4NyAzODUzLzcxNTIvNjg3CitmIDM4NTQvNzE1My82ODcgMzg0Ni83MTQ1LzY4NyAzODQ3LzUxODgvNjg3CitmIDM4NDcvNTE4OC82ODcgMzg1NS81MTkwLzY4NyAzODU0LzcxNTMvNjg3CitmIDQ1MDYvNzE0Ni82ODcgNDUwNy83MTU0LzY4NyAzODY3LzcxNTUvNjg3CitmIDM4NjcvNzE1NS82ODcgMzg1OS83MTQ3LzY4NyA0NTA2LzcxNDYvNjg3CitmIDM4NTkvNzE0Ny82ODcgMzg2Ny83MTU1LzY4NyAzODY2LzcxNTYvNjg3CitmIDM4NjYvNzE1Ni82ODcgMzg1OC83MTQ4LzY4NyAzODU5LzcxNDcvNjg3CitmIDM4NTgvNzE0OC82ODcgMzg2Ni83MTU2LzY4NyAzODY1LzcxNTcvNjg3CitmIDM4NjUvNzE1Ny82ODcgMzg1Ny83MTQ5LzY4NyAzODU4LzcxNDgvNjg3CitmIDM4NTcvNzE0OS82ODcgMzg2NS83MTU3LzY4NyAzODY0LzUxOTEvNjg3CitmIDM4NjQvNTE5MS82ODcgMzg1Ni81MTg5LzY4NyAzODU3LzcxNDkvNjg3CitmIDI5NjAvNzE1OC82ODcgMjk1OS83MTUwLzY4NyAzODUyLzcxNTEvNjg3CitmIDM4NTIvNzE1MS82ODcgMzg2MC83MTU5LzY4NyAyOTYwLzcxNTgvNjg3CitmIDM4NjAvNzE1OS82ODcgMzg1Mi83MTUxLzY4NyAzODUzLzcxNTIvNjg3CitmIDM4NTMvNzE1Mi82ODcgMzg2MS83MTYwLzY4NyAzODYwLzcxNTkvNjg3CitmIDM4NjEvNzE2MC82ODcgMzg1My83MTUyLzY4NyAzODU0LzcxNTMvNjg3CitmIDM4NTQvNzE1My82ODcgMzg2Mi83MTYxLzY4NyAzODYxLzcxNjAvNjg3CitmIDM4NjIvNzE2MS82ODcgMzg1NC83MTUzLzY4NyAzODU1LzUxOTAvNjg3CitmIDM4NTUvNTE5MC82ODcgMzg2My81MTkyLzY4NyAzODYyLzcxNjEvNjg3CitmIDQ1MDcvNzE1NC82ODcgNDUxMy83MTYyLzY4NyAzODg5LzcxNjMvNjg3CitmIDM4ODkvNzE2My82ODcgMzg2Ny83MTU1LzY4NyA0NTA3LzcxNTQvNjg3CitmIDM4NjcvNzE1NS82ODcgMzg4OS83MTYzLzY4NyAzODkwLzcxNjQvNjg3CitmIDM4OTAvNzE2NC82ODcgMzg2Ni83MTU2LzY4NyAzODY3LzcxNTUvNjg3CitmIDM4NjYvNzE1Ni82ODcgMzg5MC83MTY0LzY4NyAzODk2LzcxNjUvNjg3CitmIDM4OTYvNzE2NS82ODcgMzg2NS83MTU3LzY4NyAzODY2LzcxNTYvNjg3CitmIDM4NjUvNzE1Ny82ODcgMzg5Ni83MTY1LzY4NyAzODkxLzUxOTMvNjg3CitmIDM4OTEvNTE5My82ODcgMzg2NC81MTkxLzY4NyAzODY1LzcxNTcvNjg3CitmIDI5NzIvNjk4My82ODcgMzg3OS83MTY2LzY4NyAzODgzLzcxNjcvNjg3CitmIDM4ODMvNzE2Ny82ODcgMzc4Ny83MTY4LzY4NyAyOTcyLzY5ODMvNjg3CitmIDM3ODcvNzE2OC82ODcgMzg4My83MTY3LzY4NyAzODg0LzcxNjkvNjg3CitmIDM4ODQvNzE2OS82ODcgMzc4Ni83MTcwLzY4NyAzNzg3LzcxNjgvNjg3CitmIDM3ODYvNzE3MC82ODcgMzg4NC83MTY5LzY4NyAzODg1LzcxNzEvNjg3CitmIDM4ODUvNzE3MS82ODcgMzc4NS83MTcyLzY4NyAzNzg2LzcxNzAvNjg3CitmIDM3ODUvNzE3Mi82ODcgMzg4NS83MTcxLzY4NyAzODg2LzcxNzMvNjg3CitmIDM4ODYvNzE3My82ODcgMzc4NC83MTc0LzY4NyAzNzg1LzcxNzIvNjg3CitmIDQ2MjcvNzE3NS82ODcgNDYyNi83MTc2LzY4NyAzNzY1LzcxNzcvNjg3CitmIDM3NjUvNzE3Ny82ODcgMzc1Ny83MTc4LzY4NyA0NjI3LzcxNzUvNjg3CitmIDM3NTcvNzE3OC82ODcgMzc2NS83MTc3LzY4NyAzNzY2LzcxNzkvNjg3CitmIDM3NjYvNzE3OS82ODcgMzc1OC83MTgwLzY4NyAzNzU3LzcxNzgvNjg3CitmIDM3NTgvNzE4MC82ODcgMzc2Ni83MTc5LzY4NyAzNzY3LzcxODEvNjg3CitmIDM3NjcvNzE4MS82ODcgMzc1OS83MTgyLzY4NyAzNzU4LzcxODAvNjg3CitmIDM3NTkvNzE4Mi82ODcgMzc2Ny83MTgxLzY4NyAzNzY4LzUxOTUvNjg3CitmIDM3NjgvNTE5NS82ODcgMzc2MC81MTc0LzY4NyAzNzU5LzcxODIvNjg3CitmIDI5NzAvNzE4My82ODcgMjk2OS83MDc4LzY4NyAzNzY0LzcwODEvNjg3CitmIDM3NjQvNzA4MS82ODcgMzc3Mi83MTg0LzY4NyAyOTcwLzcxODMvNjg3CitmIDM3NzIvNzE4NC82ODcgMzc2NC83MDgxLzY4NyAzNzYzLzcwODMvNjg3CitmIDM3NjMvNzA4My82ODcgMzc3MS83MTg1LzY4NyAzNzcyLzcxODQvNjg3CitmIDM3NzEvNzE4NS82ODcgMzc2My83MDgzLzY4NyAzNzYyLzcwODUvNjg3CitmIDM3NjIvNzA4NS82ODcgMzc3MC83MTg2LzY4NyAzNzcxLzcxODUvNjg3CitmIDM3NzAvNzE4Ni82ODcgMzc2Mi83MDg1LzY4NyAzNzYxLzUxNzEvNjg3CitmIDM3NjEvNTE3MS82ODcgMzc2OS81MTk2LzY4NyAzNzcwLzcxODYvNjg3CitmIDQ2MjYvNzE3Ni82ODcgMjk1MC83MTg3LzY4NyAzNzczLzcxODgvNjg3CitmIDM3NzMvNzE4OC82ODcgMzc2NS83MTc3LzY4NyA0NjI2LzcxNzYvNjg3CitmIDM3NjUvNzE3Ny82ODcgMzc3My83MTg4LzY4NyAzNzc0LzcxODkvNjg3CitmIDM3NzQvNzE4OS82ODcgMzc2Ni83MTc5LzY4NyAzNzY1LzcxNzcvNjg3CitmIDM3NjYvNzE3OS82ODcgMzc3NC83MTg5LzY4NyAzNzc1LzcxOTAvNjg3CitmIDM3NzUvNzE5MC82ODcgMzc2Ny83MTgxLzY4NyAzNzY2LzcxNzkvNjg3CitmIDM3NjcvNzE4MS82ODcgMzc3NS83MTkwLzY4NyAzNzc2LzUxOTcvNjg3CitmIDM3NzYvNTE5Ny82ODcgMzc2OC81MTk1LzY4NyAzNzY3LzcxODEvNjg3CitmIDI5NzEvNzE5MS82ODcgMjk3MC83MTgzLzY4NyAzNzcyLzcxODQvNjg3CitmIDM3NzIvNzE4NC82ODcgMzc4MC83MTkyLzY4NyAyOTcxLzcxOTEvNjg3CitmIDM3ODAvNzE5Mi82ODcgMzc3Mi83MTg0LzY4NyAzNzcxLzcxODUvNjg3CitmIDM3NzEvNzE4NS82ODcgMzc3OS83MTkzLzY4NyAzNzgwLzcxOTIvNjg3CitmIDM3NzkvNzE5My82ODcgMzc3MS83MTg1LzY4NyAzNzcwLzcxODYvNjg3CitmIDM3NzAvNzE4Ni82ODcgMzc3OC83MTk0LzY4NyAzNzc5LzcxOTMvNjg3CitmIDM3NzgvNzE5NC82ODcgMzc3MC83MTg2LzY4NyAzNzY5LzUxOTYvNjg3CitmIDM3NjkvNTE5Ni82ODcgMzc3Ny81MTk4LzY4NyAzNzc4LzcxOTQvNjg3CitmIDI5NTAvNzE4Ny82ODcgNDYyNS83MDcwLzY4NyAzNzQ5LzcwNzMvNjg3CitmIDM3NDkvNzA3My82ODcgMzc3My83MTg4LzY4NyAyOTUwLzcxODcvNjg3CitmIDM3NzMvNzE4OC82ODcgMzc0OS83MDczLzY4NyAzNzUwLzcwNzUvNjg3CitmIDM3NTAvNzA3NS82ODcgMzc3NC83MTg5LzY4NyAzNzczLzcxODgvNjg3CitmIDM3NzQvNzE4OS82ODcgMzc1MC83MDc1LzY4NyAzNzUxLzcwNzcvNjg3CitmIDM3NTEvNzA3Ny82ODcgMzc3NS83MTkwLzY4NyAzNzc0LzcxODkvNjg3CitmIDM3NzUvNzE5MC82ODcgMzc1MS83MDc3LzY4NyAzNzUyLzUxNjkvNjg3CitmIDM3NTIvNTE2OS82ODcgMzc3Ni81MTk3LzY4NyAzNzc1LzcxOTAvNjg3CitmIDI5NjgvNzA2My82ODcgMjk3MS83MTkxLzY4NyAzNzgwLzcxOTIvNjg3CitmIDM3ODAvNzE5Mi82ODcgMzc1Ni83MDY0LzY4NyAyOTY4LzcwNjMvNjg3CitmIDM3NTYvNzA2NC82ODcgMzc4MC83MTkyLzY4NyAzNzc5LzcxOTMvNjg3CitmIDM3NzkvNzE5My82ODcgMzc1NS83MDY2LzY4NyAzNzU2LzcwNjQvNjg3CitmIDM3NTUvNzA2Ni82ODcgMzc3OS83MTkzLzY4NyAzNzc4LzcxOTQvNjg3CitmIDM3NzgvNzE5NC82ODcgMzc1NC83MDY4LzY4NyAzNzU1LzcwNjYvNjg3CitmIDM3NTQvNzA2OC82ODcgMzc3OC83MTk0LzY4NyAzNzc3LzUxOTgvNjg3CitmIDM3NzcvNTE5OC82ODcgMzc1My81MTY4LzY4NyAzNzU0LzcwNjgvNjg3CitmIDM4NzQvNzA4OS82ODcgMzQ3Mi81NjkxLzY4NyAzNDcxLzU2OTAvNjg3CitmIDM0NzEvNTY5MC82ODcgMzg3NS82OTg0LzY4NyAzODc0LzcwODkvNjg3CitmIDM4NzQvNzA4OS82ODcgMzg3My83MDkxLzY4NyAyOTg3LzU2ODQvNjg3CitmIDI5ODcvNTY4NC82ODcgMjk4OC81NjgzLzY4NyAzODc0LzcwODkvNjg3CitmIDM4NzQvNzA4OS82ODcgMjk4OC81NjgzLzY4NyAzNDcyLzU2OTEvNjg3CitmIDM4NzMvNzA5MS82ODcgMzg3Mi83MDkzLzY4NyAzNDcwLzU2ODkvNjg3CitmIDM0NzAvNTY4OS82ODcgMjk4Ny81Njg0LzY4NyAzODczLzcwOTEvNjg3CitmIDM4NzEvNzE5NS82ODcgMzQ2OC81Njg3LzY4NyAzNDY5LzU2ODgvNjg3CitmIDM0NjkvNTY4OC82ODcgMzg3Mi83MDkzLzY4NyAzODcxLzcxOTUvNjg3CitmIDM4NzIvNzA5My82ODcgMzQ2OS81Njg4LzY4NyAzNDcwLzU2ODkvNjg3CitmIDM4NzEvNzE5NS82ODcgMzg3MC83MTk2LzY4NyAzNjg5LzU2ODUvNjg3CitmIDM2ODkvNTY4NS82ODcgMzQ2OC81Njg3LzY4NyAzODcxLzcxOTUvNjg3CitmIDM4NzAvNzE5Ni82ODcgMzg2OS83MTk3LzY4NyAzNDY3LzU2ODYvNjg3CitmIDM0NjcvNTY4Ni82ODcgMzY4OS81Njg1LzY4NyAzODcwLzcxOTYvNjg3CitmIDM4NjkvNzE5Ny82ODcgMzg2OC83MTk4LzY4NyAzNDY2LzU2ODEvNjg3CitmIDM0NjYvNTY4MS82ODcgMzQ2Ny81Njg2LzY4NyAzODY5LzcxOTcvNjg3CitmIDM4NjgvNzE5OC82ODcgMjk2MS82OTgyLzY4NyAyOTg1LzU2ODIvNjg3CitmIDI5ODUvNTY4Mi82ODcgMzQ2Ni81NjgxLzY4NyAzODY4LzcxOTgvNjg3CitmIDM2OTIvNjk3NS82ODcgMjk4NC82OTY0LzY4NyAzNzgxLzY5NzkvNjg3CitmIDI5ODQvNjk2NC82ODcgMjk4My82OTYzLzY4NyAzNzgyLzcxOTkvNjg3CitmIDM3ODIvNzE5OS82ODcgMzc4MS82OTc5LzY4NyAyOTg0LzY5NjQvNjg3CitmIDI5ODMvNjk2My82ODcgMjk4Mi82OTYyLzY4NyAzNzgyLzcxOTkvNjg3CitmIDI5ODIvNjk2Mi82ODcgMzg3Ny82OTYxLzY4NyAzODc4LzcyMDAvNjg3CitmIDM4NzgvNzIwMC82ODcgMzc4Mi83MTk5LzY4NyAyOTgyLzY5NjIvNjg3CitmIDM4NzcvNjk2MS82ODcgMzg3Ni82OTYwLzY4NyAzODc4LzcyMDAvNjg3CitmIDM4NzYvNjk2MC82ODcgMjk4MS82OTU5LzY4NyAzNzgzLzcyMDEvNjg3CitmIDM3ODMvNzIwMS82ODcgMzg3OC83MjAwLzY4NyAzODc2LzY5NjAvNjg3CitmIDI5NzgvNjk2OC82ODcgMjk3Mi82OTgzLzY4NyAzNzg3LzcxNjgvNjg3CitmIDM3ODcvNzE2OC82ODcgMjk3Ny82OTY5LzY4NyAyOTc4LzY5NjgvNjg3CitmIDI5NzcvNjk2OS82ODcgMzc4Ny83MTY4LzY4NyAzNzg2LzcxNzAvNjg3CitmIDM3ODYvNzE3MC82ODcgMzY4Ni82OTc0LzY4NyAyOTc3LzY5NjkvNjg3CitmIDI5ODAvNjk3MS82ODcgMjk3OS82OTcwLzY4NyAzNzg1LzcxNzIvNjg3CitmIDI5NzkvNjk3MC82ODcgMzY4Ni82OTc0LzY4NyAzNzg2LzcxNzAvNjg3CitmIDM3ODYvNzE3MC82ODcgMzc4NS83MTcyLzY4NyAyOTc5LzY5NzAvNjg3CitmIDI5ODAvNjk3MS82ODcgMzc4NS83MTcyLzY4NyAzNzg0LzcxNzQvNjg3CitmIDM3ODQvNzE3NC82ODcgMjk3Ni82OTcyLzY4NyAyOTgwLzY5NzEvNjg3CitmIDI5ODEvNjk1OS82ODcgMjk3NS82OTczLzY4NyAzNzgzLzcyMDEvNjg3CitmIDI5NzUvNjk3My82ODcgMjk3Ni82OTcyLzY4NyAzNzg0LzcxNzQvNjg3CitmIDM3ODQvNzE3NC82ODcgMzc4My83MjAxLzY4NyAyOTc1LzY5NzMvNjg3CitmIDM3MDAvNzIwMi82ODcgMzY5My81NjgwLzY4NyAzNjkyLzY5NzUvNjg3CitmIDM2OTIvNjk3NS82ODcgMjk3NC82OTc4LzY4NyAzNzAwLzcyMDIvNjg3CitmIDM3MDAvNzIwMi82ODcgMzQzOC81Njc5LzY4NyAzNjkzLzU2ODAvNjg3CitmIDI5ODkvNTY5Mi82ODcgMzQ2NC81NjUzLzY4NyA0NjM1LzcyMDMvNjg3CitmIDQ2MzUvNzIwMy82ODcgNDYzNi82OTg1LzY4NyAyOTg5LzU2OTIvNjg3CitmIDI5NzQvNjk3OC82ODcgNDUxMC82OTgwLzY4NyA0NTExLzcyMDQvNjg3CitmIDQ1MTEvNzIwNC82ODcgMzcwMC83MjAyLzY4NyAyOTc0LzY5NzgvNjg3CitmIDM0NjMvNTY3Ny82ODcgMzQ2NS81Njc4LzY4NyA0NzI4LzcyMDUvNjg3CitmIDM0NjUvNTY3OC82ODcgMzQzOC81Njc5LzY4NyA0NTExLzcyMDQvNjg3CitmIDQ1MTEvNzIwNC82ODcgNDcyOC83MjA1LzY4NyAzNDY1LzU2NzgvNjg3CitmIDM0NjQvNTY1My82ODcgMzQ2My81Njc3LzY4NyA0NzI4LzcyMDUvNjg3CitmIDQ3MjgvNzIwNS82ODcgNDYzNS83MjAzLzY4NyAzNDY0LzU2NTMvNjg3CitmIDM0MzgvNTY3OS82ODcgMzcwMC83MjAyLzY4NyA0NTExLzcyMDQvNjg3CitmIDM3ODMvNzIwMS82ODcgMzc4NC83MTc0LzY4NyAzODg2LzcxNzMvNjg3CitmIDM4ODYvNzE3My82ODcgMzg4Mi83MjA2LzY4NyAzNzgzLzcyMDEvNjg3CitmIDQ1MTAvNjk4MC82ODcgMzc4MS82OTc5LzY4NyAzODgwLzcyMDcvNjg3CitmIDM4ODAvNzIwNy82ODcgNDUxMi83MjA4LzY4NyA0NTEwLzY5ODAvNjg3CitmIDM3ODEvNjk3OS82ODcgMzc4Mi83MTk5LzY4NyAzODgxLzcyMDkvNjg3CitmIDM4ODEvNzIwOS82ODcgMzg4MC83MjA3LzY4NyAzNzgxLzY5NzkvNjg3CitmIDM3ODIvNzE5OS82ODcgMzg3OC83MjAwLzY4NyAzODg3LzcyMTAvNjg3CitmIDM4ODcvNzIxMC82ODcgMzg4MS83MjA5LzY4NyAzNzgyLzcxOTkvNjg3CitmIDM4NzgvNzIwMC82ODcgMzc4My83MjAxLzY4NyAzODgyLzcyMDYvNjg3CitmIDM4ODIvNzIwNi82ODcgMzg4Ny83MjEwLzY4NyAzODc4LzcyMDAvNjg3CitmIDM4ODgvNzIxMS82ODcgMzg5Mi83MjEyLzY4NyAzODgzLzcxNjcvNjg3CitmIDM4ODMvNzE2Ny82ODcgMzg3OS83MTY2LzY4NyAzODg4LzcyMTEvNjg3CitmIDM4OTIvNzIxMi82ODcgMzg5My83MjEzLzY4NyAzODg0LzcxNjkvNjg3CitmIDM4ODQvNzE2OS82ODcgMzg4My83MTY3LzY4NyAzODkyLzcyMTIvNjg3CitmIDM4OTMvNzIxMy82ODcgMzg5NC83MjE0LzY4NyAzODg1LzcxNzEvNjg3CitmIDM4ODUvNzE3MS82ODcgMzg4NC83MTY5LzY4NyAzODkzLzcyMTMvNjg3CitmIDM4OTQvNzIxNC82ODcgMzg5NS81MTk0LzY4NyAzODg2LzcxNzMvNjg3CitmIDM4ODYvNzE3My82ODcgMzg4NS83MTcxLzY4NyAzODk0LzcyMTQvNjg3CitmIDM4ODIvNzIwNi82ODcgMzg4Ni83MTczLzY4NyAzODk1LzUxOTQvNjg3CitmIDM4OTUvNTE5NC82ODcgMzg5MS81MTkzLzY4NyAzODgyLzcyMDYvNjg3CitmIDQ1MTIvNzIwOC82ODcgMzg4MC83MjA3LzY4NyAzODg5LzcxNjMvNjg3CitmIDM4ODkvNzE2My82ODcgNDUxMy83MTYyLzY4NyA0NTEyLzcyMDgvNjg3CitmIDM4ODAvNzIwNy82ODcgMzg4MS83MjA5LzY4NyAzODkwLzcxNjQvNjg3CitmIDM4OTAvNzE2NC82ODcgMzg4OS83MTYzLzY4NyAzODgwLzcyMDcvNjg3CitmIDM4ODEvNzIwOS82ODcgMzg4Ny83MjEwLzY4NyAzODk2LzcxNjUvNjg3CitmIDM4OTYvNzE2NS82ODcgMzg5MC83MTY0LzY4NyAzODgxLzcyMDkvNjg3CitmIDM4ODcvNzIxMC82ODcgMzg4Mi83MjA2LzY4NyAzODkxLzUxOTMvNjg3CitmIDM4OTEvNTE5My82ODcgMzg5Ni83MTY1LzY4NyAzODg3LzcyMTAvNjg3CitmIDI5NjAvNzE1OC82ODcgMzg2MC83MTU5LzY4NyAzODkyLzcyMTIvNjg3CitmIDM4OTIvNzIxMi82ODcgMzg4OC83MjExLzY4NyAyOTYwLzcxNTgvNjg3CitmIDM4NjAvNzE1OS82ODcgMzg2MS83MTYwLzY4NyAzODkzLzcyMTMvNjg3CitmIDM4OTMvNzIxMy82ODcgMzg5Mi83MjEyLzY4NyAzODYwLzcxNTkvNjg3CitmIDM4NjEvNzE2MC82ODcgMzg2Mi83MTYxLzY4NyAzODk0LzcyMTQvNjg3CitmIDM4OTQvNzIxNC82ODcgMzg5My83MjEzLzY4NyAzODYxLzcxNjAvNjg3CitmIDM4NjIvNzE2MS82ODcgMzg2My81MTkyLzY4NyAzODk1LzUxOTQvNjg3CitmIDM4OTUvNTE5NC82ODcgMzg5NC83MjE0LzY4NyAzODYyLzcxNjEvNjg3CitmIDQ1MTUvNzIxNS82OTcgMzkzNC83MjE2LzY5NyAzODk3LzcyMTcvNjk3CitmIDM4OTcvNzIxNy82OTcgNDUxNC83MjE4LzY5NyA0NTE1LzcyMTUvNjk3CitmIDM5MzQvNzIxNi82OTcgMzgwMi83MjE5LzY5NyAzODk4LzcyMjAvNjk3CitmIDM4OTgvNzIyMC82OTcgMzg5Ny83MjE3LzY5NyAzOTM0LzcyMTYvNjk3CitmIDM4MDIvNzIxOS82OTcgMzgwMS83MjIxLzY5NyAzODk5LzcyMjIvNjk3CitmIDM4OTkvNzIyMi82OTcgMzg5OC83MjIwLzY5NyAzODAyLzcyMTkvNjk3CitmIDM4MDEvNzIyMS82OTcgMzgwMC83MjIzLzY5NyAzOTAwLzcyMjQvNjk3CitmIDM5MDAvNzIyNC82OTcgMzg5OS83MjIyLzY5NyAzODAxLzcyMjEvNjk3CitmIDM4MDAvNzIyMy82OTcgMzc5OS83MjI1LzY5NyAzOTAxLzcyMjYvNjk3CitmIDM5MDEvNzIyNi82OTcgMzkwMC83MjI0LzY5NyAzODAwLzcyMjMvNjk3CitmIDM3OTkvNzIyNS82OTcgMzc5OC83MjI3LzY5NyAzOTAyLzcyMjgvNjk3CitmIDM5MDIvNzIyOC82OTcgMzkwMS83MjI2LzY5NyAzNzk5LzcyMjUvNjk3CitmIDM3OTgvNzIyNy82OTcgMzc5Ny83MjI5LzY5NyAzOTAzLzcyMzAvNjk3CitmIDM5MDMvNzIzMC82OTcgMzkwMi83MjI4LzY5NyAzNzk4LzcyMjcvNjk3CitmIDM3OTcvNzIyOS82OTcgMzc5Ni83MjMxLzY5NyAzOTA0LzcyMzIvNjk3CitmIDM5MDQvNzIzMi82OTcgMzkwMy83MjMwLzY5NyAzNzk3LzcyMjkvNjk3CitmIDM3OTYvNzIzMS82OTcgMjk1Mi83MjMzLzY5NyAzOTA1LzcyMzQvNjk3CitmIDM5MDUvNzIzNC82OTcgMzkwNC83MjMyLzY5NyAzNzk2LzcyMzEvNjk3CitmIDM5MTgvNzIzNS82OTcgMzkyNi83MjM2LzY5NyAzOTA3LzcyMzcvNjk3CitmIDM5MDcvNzIzNy82OTcgMzkwNi83MjM4LzY5NyAzOTE4LzcyMzUvNjk3CitmIDM5MjYvNzIzNi82OTcgMzcxNS83MjM5LzY5NyAzOTA4LzcyNDAvNjk3CitmIDM5MDgvNzI0MC82OTcgMzkwNy83MjM3LzY5NyAzOTI2LzcyMzYvNjk3CitmIDM3MTUvNzIzOS82OTcgMzcxNC83MjQxLzY5NyAzOTA5LzcyNDIvNjk3CitmIDM5MDkvNzI0Mi82OTcgMzkwOC83MjQwLzY5NyAzNzE1LzcyMzkvNjk3CitmIDM3MTQvNzI0MS82OTcgMzcxMy83MjQzLzY5NyAzOTEwLzcyNDQvNjk3CitmIDM5MTAvNzI0NC82OTcgMzkwOS83MjQyLzY5NyAzNzE0LzcyNDEvNjk3CitmIDM3MTMvNzI0My82OTcgMzcxMi83MjQ1LzY5NyAzOTExLzcyNDYvNjk3CitmIDM5MTEvNzI0Ni82OTcgMzkxMC83MjQ0LzY5NyAzNzEzLzcyNDMvNjk3CitmIDM3MTIvNzI0NS82OTcgMzcxMS83MjQ3LzY5NyAzOTEyLzcyNDgvNjk3CitmIDM5MTIvNzI0OC82OTcgMzkxMS83MjQ2LzY5NyAzNzEyLzcyNDUvNjk3CitmIDM3MTEvNzI0Ny82OTcgMzcxMC83MjQ5LzY5NyAzOTEzLzcyNTAvNjk3CitmIDM5MTMvNzI1MC82OTcgMzkxMi83MjQ4LzY5NyAzNzExLzcyNDcvNjk3CitmIDM3MTAvNzI0OS82OTcgMzcwOS83MjUxLzY5NyAzOTE0LzcyNTIvNjk3CitmIDM5MTQvNzI1Mi82OTcgMzkxMy83MjUwLzY5NyAzNzEwLzcyNDkvNjk3CitmIDM3MDkvNzI1MS82OTcgMjk0OC83MjUzLzY5NyAzOTE1LzcyNTQvNjk3CitmIDM5MTUvNzI1NC82OTcgMzkxNC83MjUyLzY5NyAzNzA5LzcyNTEvNjk3CitmIDY3MzUvNzI1NS8xOTE2IDM5MTkvNzI1Ni8xOTE2IDM5MTYvNzI1Ny8xOTE2CitmIDM5MTYvNzI1OC8xOTE3IDY3MzYvNzI1OS8xOTE3IDY3MzcvNzI2MC8xOTE3CitmIDY3MzgvNzI2MS8xOTE4IDM5MjcvNzI2Mi8xOTE4IDM5MTcvNzI2My8xOTE4CitmIDM5MTcvNzI2NC8xOTE5IDY3MzkvNzI2NS8xOTE5IDY3NDAvNzI2Ni8xOTE5CitmIDY3NDEvNzI2Ny8xOTE2IDM5MjAvNzI2OC8xOTE2IDM5MTkvNzI1Ni8xOTE2CitmIDM5MTkvNzI2OS8xOTE2IDY3NDIvNzI3MC8xOTE2IDY3NDMvNzI3MS8xOTE2CitmIDY3NDQvNzI3Mi8xOTE2IDM5MjEvNzI3My8xOTE2IDM5MjAvNzI2OC8xOTE2CitmIDM5MjAvNzI3NC8xOTE2IDY3NDUvNzI3NS8xOTE2IDY3NDYvNzI3Ni8xOTE2CitmIDY3NDcvNzI3Ny8xOTE2IDM5MjIvNTE2Mi8xOTE2IDM5MjEvNzI3My8xOTE2CitmIDM5MjEvNzI3OC8xOTE2IDY3NDgvNzI3OS8xOTE2IDY3NDkvNzI4MC8xOTE2CitmIDY3NTAvNzI4MS8xOTE2IDM5MjMvNTE1OS8xOTE2IDM5MjIvNTE2Mi8xOTE2CitmIDM5MjIvNzI4Mi8xOTE2IDY3NTEvNzI4My8xOTE2IDY3NTIvNzI4NC8xOTE2CitmIDY3NTMvNzI4NS8xOTE2IDM5MjQvNzA0MS8xOTE2IDM5MjMvNTE1OS8xOTE2CitmIDM5MjMvNzI4Ni8xOTE2IDY3NTQvNzI4Ny8xOTE2IDY3NTUvNzI4OC8xOTE2CitmIDY3NTYvNzI4OS8xOTE2IDM5MjUvNzAzOS8xOTE2IDM5MjQvNzA0MS8xOTE2CitmIDM5MjQvNzI5MC8xOTE2IDY3NTcvNzI5MS8xOTE2IDY3NTgvNzI5Mi8xOTE2CitmIDY3NTkvNzI5My8xOTE2IDM3MTYvNzAzNy8xOTE2IDM5MjUvNzAzOS8xOTE2CitmIDM5MjUvNzI5NC8xOTE2IDY3NjAvNzI5NS8xOTE2IDY3NjEvNzI5Ni8xOTE2CitmIDY3NjIvNzI5Ny8xOTE3IDI5NjMvNzAzNC8xOTE3IDM3MTYvNzAzNy8xOTE3CitmIDM3MTYvNzI5OC8xOTE2IDY3NjMvNzI5OS8xOTE2IDY3NjQvNzMwMC8xOTE2CitmIDY3NjUvNzMwMS8xOTE5IDM5MjgvNzMwMi8xOTE5IDM5MjcvNzI2Mi8xOTE5CitmIDM5MjcvNzMwMy8xOTE4IDY3NjYvNzMwNC8xOTE4IDY3NjcvNzMwNS8xOTE4CitmIDY3NjgvNzMwNi8xOTE4IDM5MjkvNzMwNy8xOTE4IDM5MjgvNzMwMi8xOTE4CitmIDM5MjgvNzMwOC8xOTE5IDY3NjkvNzMwOS8xOTE5IDY3NzAvNzMxMC8xOTE5CitmIDY3NzEvNzMxMS8xOTE4IDM5MzAvNTE4NC8xOTE4IDM5MjkvNzMwNy8xOTE4CitmIDM5MjkvNzMxMi8xOTE4IDY3NzIvNzMxMy8xOTE4IDY3NzMvNzMxNC8xOTE4CitmIDY3NzQvNzMxNS8xOTE4IDM5MzEvNTE4MS8xOTE4IDM5MzAvNTE4NC8xOTE4CitmIDM5MzAvNzMxNi8xOTE4IDY3NzUvNzMxNy8xOTE4IDY3NzYvNzMxOC8xOTE4CitmIDY3NzcvNzMxOS8xOTE4IDM5MzIvNzEyNS8xOTE4IDM5MzEvNTE4MS8xOTE4CitmIDM5MzEvNzMyMC8xOTE4IDY3NzgvNzMyMS8xOTE4IDY3NzkvNzMyMi8xOTE4CitmIDY3ODAvNzMyMy8xOTE4IDM5MzMvNzEyMy8xOTE4IDM5MzIvNzEyNS8xOTE4CitmIDM5MzIvNzMyNC8xOTE4IDY3ODEvNzMyNS8xOTE4IDY3ODIvNzMyNi8xOTE4CitmIDY3ODMvNzMyNy8xOTE4IDM4MDMvNzEyMS8xOTE4IDM5MzMvNzEyMy8xOTE4CitmIDM5MzMvNzMyOC8xOTE4IDY3ODQvNzMyOS8xOTE4IDY3ODUvNzMzMC8xOTE4CitmIDY3ODYvNzMzMS8xOTE4IDQ1MDEvNzExOC8xOTE4IDM4MDMvNzEyMS8xOTE4CitmIDM4MDMvNzMzMi8xOTE4IDY3ODcvNzMzMy8xOTE4IDY3ODgvNzMzNC8xOTE4CitmIDM3MjkvNTE0Ny8xMDQ0IDM3MjgvNTE1MC8xMDQ0IDM5NDUvNTE2MS8xMDQ0CitmIDM5NDUvNTE2MS8xMDQ0IDM5NDEvNTE2MC8xMDQ0IDM3MjkvNTE0Ny8xMDQ0CitmIDM4MTYvNTE3NS8xMDQzIDM4MTUvNTE3Ni8xMDQzIDM5NTMvNTE4My8xMDQzCitmIDM5NTMvNTE4My8xMDQzIDM5NDkvNTE4Mi8xMDQzIDM4MTYvNTE3NS8xMDQzCitmIDI5NjUvNjk4Ni8xMDQ0IDM3MzIvNjk4OS8xMDQ0IDM5MzgvNzAzNi8xMDQ0CitmIDM5MzgvNzAzNi8xMDQ0IDM5MzcvNzAzNS8xMDQ0IDI5NjUvNjk4Ni8xMDQ0CitmIDM3MzIvNjk4OS8xMDQ0IDM3MzEvNjk5MS8xMDQ0IDM5MzkvNzAzOC8xMDQ0CitmIDM5MzkvNzAzOC8xMDQ0IDM5MzgvNzAzNi8xMDQ0IDM3MzIvNjk4OS8xMDQ0CitmIDM3MzEvNjk5MS8xMDQ0IDM3MzAvNjk5My8xMDQ0IDM5NDAvNzA0MC8xMDQ0CitmIDM5NDAvNzA0MC8xMDQ0IDM5MzkvNzAzOC8xMDQ0IDM3MzEvNjk5MS8xMDQ0CitmIDM3MzAvNjk5My8xMDQ0IDM3MjkvNTE0Ny8xMDQ0IDM5NDEvNTE2MC8xMDQ0CitmIDM5NDEvNTE2MC8xMDQ0IDM5NDAvNzA0MC8xMDQ0IDM3MzAvNjk5My8xMDQ0CitmIDM5MTYvNzI1Ny8xMDQ0IDM5MTkvNzI1Ni8xMDQ0IDM5NDIvNzA0My8xMDQ0CitmIDM5NDIvNzA0My8xMDQ0IDM5MzUvNzA0Mi8xMDQ0IDM5MTYvNzI1Ny8xMDQ0CitmIDM5MTkvNzI1Ni8xMDQ0IDM5MjAvNzI2OC8xMDQ0IDM5NDMvNzA0NC8xMDQ0CitmIDM5NDMvNzA0NC8xMDQ0IDM5NDIvNzA0My8xMDQ0IDM5MTkvNzI1Ni8xMDQ0CitmIDM5MjAvNzI2OC8xMTEzIDM5MjEvNzI3My8xMTEzIDM5NDQvNzA0NS8xMTEzCitmIDM5NDQvNzA0NS8xMDQ0IDM5NDMvNzA0NC8xMDQ0IDM5MjAvNzI2OC8xMDQ0CitmIDM5MjEvNzI3My8xMDQ0IDM5MjIvNTE2Mi8xMDQ0IDM5NDUvNTE2MS8xMDQ0CitmIDM5NDUvNTE2MS8xMTEzIDM5NDQvNzA0NS8xMTEzIDM5MjEvNzI3My8xMTEzCitmIDQ1MDIvNzA5NC8xMDQzIDM4MTkvNzA5NS8xMDQzIDM5NDYvNzEyMC8xMDQzCitmIDM5NDYvNzEyMC8xMDQzIDQ1MTYvNzExOS8xMDQzIDQ1MDIvNzA5NC8xMDQzCitmIDM4MTkvNzA5NS8xMDQzIDM4MTgvNzA5Ni8xMDQzIDM5NDcvNzEyMi8xMDQzCitmIDM5NDcvNzEyMi8xMDQzIDM5NDYvNzEyMC8xMDQzIDM4MTkvNzA5NS8xMDQzCitmIDM4MTgvNzA5Ni8xMDQzIDM4MTcvNzA5Ny8xMDQzIDM5NDgvNzEyNC8xMDQzCitmIDM5NDgvNzEyNC8xMDQzIDM5NDcvNzEyMi8xMDQzIDM4MTgvNzA5Ni8xMDQzCitmIDM4MTcvNzA5Ny8xMDQzIDM4MTYvNTE3NS8xMDQzIDM5NDkvNTE4Mi8xMDQzCitmIDM5NDkvNTE4Mi8xMDQzIDM5NDgvNzEyNC8xMDQzIDM4MTcvNzA5Ny8xMDQzCitmIDM5MTcvNzI2My8xMDQzIDM5MjcvNzI2Mi8xMDQzIDM5NTAvNzEyNy8xMDQzCitmIDM5NTAvNzEyNy8xMDQzIDM5MzYvNzEyNi8xMDQzIDM5MTcvNzI2My8xMDQzCitmIDM5MjcvNzI2Mi8xMDQzIDM5MjgvNzMwMi8xMDQzIDM5NTEvNzEyOC8xMDQzCitmIDM5NTEvNzEyOC8xMDQzIDM5NTAvNzEyNy8xMDQzIDM5MjcvNzI2Mi8xMDQzCitmIDM5MjgvNzMwMi8xMDQzIDM5MjkvNzMwNy8xMDQzIDM5NTIvNzEyOS8xMDQzCitmIDM5NTIvNzEyOS8xMDQzIDM5NTEvNzEyOC8xMDQzIDM5MjgvNzMwMi8xMDQzCitmIDM5MjkvNzMwNy8xMDQzIDM5MzAvNTE4NC8xMDQzIDM5NTMvNTE4My8xMDQzCitmIDM5NTMvNTE4My8xMDQzIDM5NTIvNzEyOS8xMDQzIDM5MjkvNzMwNy8xMDQzCitmIDM5ODEvNzMzNS82OTcgMzkxOC83MjM1LzY5NyAzOTA2LzcyMzgvNjk3CitmIDM5MDYvNzIzOC82OTcgMzk3OC83MzM2LzY5NyAzOTgxLzczMzUvNjk3CitmIDM5NzkvNzMzNy82OTcgMzkwNS83MjM0LzY5NyAyOTUyLzcyMzMvNjk3CitmIDI5NTIvNzIzMy82OTcgMzk4MC83MzM4LzY5NyAzOTc5LzczMzcvNjk3CitmIDM5NTUvNzMzOS8xMDQzIDM5NjAvNzM0MC8xMDQzIDI5NTQvNzA5OC8xMDQzCitmIDI5NTQvNzA5OC8xMDQzIDI5NTEvNzAwMy8xMDQzIDM5NTUvNzMzOS8xMDQzCitmIDY3ODkvNzM0MS8xOTE5IDY3OTAvNzM0Mi8xOTE5IDM5MTcvNzM0My8xOTE5CitmIDM5MTcvNzI2My8xOTE4IDM5NTYvNzM0NC8xOTE4IDY3OTEvNzM0NS8xOTE4CitmIDM5NTYvNzM0NC8xMDQzIDM5MTcvNzI2My8xMDQzIDM5MzYvNzEyNi8xMDQzCitmIDM5MzYvNzEyNi8xMDQzIDM5ODMvNzM0Ni8xMDQzIDM5NTYvNzM0NC8xMDQzCitmIDM5ODMvNzM0Ni8xMDQzIDM5MzYvNzEyNi8xMDQzIDI5NTQvNzA5OC8xMDQzCitmIDI5NTQvNzA5OC8xMDQzIDM5NjAvNzM0MC8xMDQzIDM5ODMvNzM0Ni8xMDQzCitmIDI5NTEvNzAwMy8xNzgyIDI5NjQvNzAwMi8xNzgyIDM5NTgvNzM0Ny8xNzgyCitmIDM5NTgvNzM0Ny8xNzgyIDM5NTUvNzMzOS8xNzgyIDI5NTEvNzAwMy8xNzgyCitmIDI5NjQvNzExNC8xNzg2IDI5NjcvNzA0Ny8xNzg2IDM5NjQvNzM0OC8xNzg2CitmIDM5NjQvNzM0OC8xNzg2IDM5NTgvNzM0OS8xNzg2IDI5NjQvNzExNC8xNzg2CitmIDI5NjcvNzA0Ny8xNzg0IDI5NTUvNzA0Ni8xNzg0IDM5NjIvNzM1MC8xNzg0CitmIDM5NjIvNzM1MC8xNzg0IDM5NjQvNzM0OC8xNzg0IDI5NjcvNzA0Ny8xNzg0CitmIDI5NTcvNzEzNC82ODcgMzk2NS83MzUxLzY4NyAzOTYyLzczNTAvNjg3CitmIDM5NjIvNzM1MC82ODcgMjk1NS83MDQ2LzY4NyAyOTU3LzcxMzQvNjg3CitmIDI5NTgvNzE0Mi82ODcgMzk3Mi83MzUyLzY4NyAzOTY1LzczNTEvNjg3CitmIDM5NjUvNzM1MS82ODcgMjk1Ny83MTM0LzY4NyAyOTU4LzcxNDIvNjg3CitmIDI5NTkvNzE1MC82ODcgMzk3MS83MzUzLzY4NyAzOTcyLzczNTIvNjg3CitmIDM5NzIvNzM1Mi82ODcgMjk1OC83MTQyLzY4NyAyOTU5LzcxNTAvNjg3CitmIDI5NjAvNzE1OC82ODcgMzk3MC83MzU0LzY4NyAzOTcxLzczNTMvNjg3CitmIDM5NzEvNzM1My82ODcgMjk1OS83MTUwLzY4NyAyOTYwLzcxNTgvNjg3CitmIDM4ODgvNzIxMS82ODcgMzk4NS83MzU1LzY4NyAzOTcwLzczNTQvNjg3CitmIDM5NzAvNzM1NC82ODcgMjk2MC83MTU4LzY4NyAzODg4LzcyMTEvNjg3CitmIDI5NzIvNjk4My82ODcgMzk3NS83MzU2LzY4NyAzOTg0LzczNTcvNjg3CitmIDM5ODQvNzM1Ny82ODcgMzg3OS83MTY2LzY4NyAyOTcyLzY5ODMvNjg3CitmIDM4NzkvNzE2Ni82ODcgMzk4NC83MzU3LzY4NyAzOTg1LzczNTUvNjg3CitmIDM5ODUvNzM1NS82ODcgMzg4OC83MjExLzY4NyAzODc5LzcxNjYvNjg3CitmIDM5OTcvNjk3Ni82ODcgNTA3OC83MzU4LzY4NyAzOTc2LzczNTkvNjg3CitmIDM5NzYvNzM1OS82ODcgMzY5OS82OTc3LzY4NyAzOTk3LzY5NzYvNjg3CitmIDI5NjEvNjk4Mi82ODcgMzk3NC83MzYwLzY4NyAzOTc3LzczNjEvNjg3CitmIDM5NzcvNzM2MS82ODcgMzY5OC82OTgxLzY4NyAyOTYxLzY5ODIvNjg3CitmIDQyODEvNzM2Mi82ODcgNDI4MC83MzYzLzY4NyAzOTc0LzczNjAvNjg3CitmIDM5NzQvNzM2MC82ODcgMjk2MS82OTgyLzY4NyA0MjgxLzczNjIvNjg3CitmIDM2OTkvNjk3Ny82ODcgMzk3Ni83MzU5LzY4NyAzOTc1LzczNTYvNjg3CitmIDM5NzUvNzM1Ni82ODcgMjk3Mi82OTgzLzY4NyAzNjk5LzY5NzcvNjg3CitmIDI5NzAvNzE4My82ODcgMzk2OC83MzY0LzY4NyAzOTY5LzczNjUvNjg3CitmIDM5NjkvNzM2NS82ODcgMjk2OS83MDc4LzY4NyAyOTcwLzcxODMvNjg3CitmIDI5NzEvNzE5MS82ODcgMzk2Ny83MzY2LzY4NyAzOTY4LzczNjQvNjg3CitmIDM5NjgvNzM2NC82ODcgMjk3MC83MTgzLzY4NyAyOTcxLzcxOTEvNjg3CitmIDI5NjgvNzA2My82ODcgMzk2Ni83MzY3LzY4NyAzOTY3LzczNjYvNjg3CitmIDM5NjcvNzM2Ni82ODcgMjk3MS83MTkxLzY4NyAyOTY4LzcwNjMvNjg3CitmIDI5NjYvNzA2Mi82ODcgMzk2MS83MzY4LzY4NyAzOTY2LzczNjcvNjg3CitmIDM5NjYvNzM2Ny82ODcgMjk2OC83MDYzLzY4NyAyOTY2LzcwNjIvNjg3CitmIDI5NTYvNzAyMC8xNzg3IDM5NjMvNzM2OS8xNzg3IDM5NjEvNzM2OC8xNzg3CitmIDM5NjEvNzM2OC8xNzg3IDI5NjYvNzA2Mi8xNzg3IDI5NTYvNzAyMC8xNzg3CitmIDI5NTMvNzAxOS8xNzgzIDM5NTcvNzM3MC8xNzgzIDM5NjMvNzM2OS8xNzgzCitmIDM5NjMvNzM2OS8xNzgzIDI5NTYvNzAyMC8xNzgzIDI5NTMvNzAxOS8xNzgzCitmIDI5NjIvNjk4Ny8xNzg1IDM5NTQvNzM3MS8xNzg1IDM5NTcvNzM3Mi8xNzg1CitmIDM5NTcvNzM3Mi8xNzg1IDI5NTMvNzEwNi8xNzg1IDI5NjIvNjk4Ny8xNzg1CitmIDI5NjUvNjk4Ni8xMDQ0IDM5NTkvNzM3My8xMDQ0IDM5NTQvNzM3MS8xMDQ0CitmIDM5NTQvNzM3MS8xMDQ0IDI5NjIvNjk4Ny8xMDQ0IDI5NjUvNjk4Ni8xMDQ0CitmIDM5MzcvNzAzNS8xMDQ0IDM5ODIvNzM3NC8xMDQ0IDM5NTkvNzM3My8xMDQ0CitmIDM5NTkvNzM3My8xMDQ0IDI5NjUvNjk4Ni8xMDQ0IDM5MzcvNzAzNS8xMDQ0CitmIDI5NjMvNzAzNC8xMDQ0IDM5NzMvNzM3NS8xMDQ0IDM5ODIvNzM3NC8xMDQ0CitmIDM5ODIvNzM3NC8xMDQ0IDM5MzcvNzAzNS8xMDQ0IDI5NjMvNzAzNC8xMDQ0CitmIDY3OTIvNzM3Ni8xOTE2IDY3OTMvNzM3Ny8xOTE2IDM5NzMvNzM3OC8xOTE2CitmIDM5NzMvNzM3NS8xOTE3IDI5NjMvNzAzNC8xOTE3IDY3OTQvNzI5Ny8xOTE3CitmIDQyODUvNzM3OS82ODcgNDI3OS83MDkyLzY4NyAzOTk1LzUxNzMvNjg3CitmIDM5OTUvNTE3My82ODcgMzk5MS81MTcyLzY4NyA0Mjg1LzczNzkvNjg3CitmIDQyODEvNzM2Mi82ODcgNDI4Mi83MzgwLzY4NyAzOTg4LzcwODAvNjg3CitmIDM5ODgvNzA4MC82ODcgMzk4Ny83MDc5LzY4NyA0MjgxLzczNjIvNjg3CitmIDQyODIvNzM4MC82ODcgNDI4My83MzgxLzY4NyAzOTg5LzcwODIvNjg3CitmIDM5ODkvNzA4Mi82ODcgMzk4OC83MDgwLzY4NyA0MjgyLzczODAvNjg3CitmIDQyODMvNzM4MS82ODcgNDI4NC83MzgyLzY4NyAzOTkwLzcwODQvNjg3CitmIDM5OTAvNzA4NC82ODcgMzk4OS83MDgyLzY4NyA0MjgzLzczODEvNjg3CitmIDQyODQvNzM4Mi82ODcgNDI4NS83Mzc5LzY4NyAzOTkxLzUxNzIvNjg3CitmIDM5OTEvNTE3Mi82ODcgMzk5MC83MDg0LzY4NyA0Mjg0LzczODIvNjg3CitmIDQ2MjcvNzE3NS82ODcgMzc1Ny83MTc4LzY4NyAzOTkyLzczODMvNjg3CitmIDM5OTIvNzM4My82ODcgMzk4Ni83Mzg0LzY4NyA0NjI3LzcxNzUvNjg3CitmIDM3NTcvNzE3OC82ODcgMzc1OC83MTgwLzY4NyAzOTkzLzczODUvNjg3CitmIDM5OTMvNzM4NS82ODcgMzk5Mi83MzgzLzY4NyAzNzU3LzcxNzgvNjg3CitmIDM3NTgvNzE4MC82ODcgMzc1OS83MTgyLzY4NyAzOTk0LzczODYvNjg3CitmIDM5OTQvNzM4Ni82ODcgMzk5My83Mzg1LzY4NyAzNzU4LzcxODAvNjg3CitmIDM3NTkvNzE4Mi82ODcgMzc2MC81MTc0LzY4NyAzOTk1LzUxNzMvNjg3CitmIDM5OTUvNTE3My82ODcgMzk5NC83Mzg2LzY4NyAzNzU5LzcxODIvNjg3CitmIDI5NjkvNzA3OC82ODcgMzk2OS83MzY1LzY4NyAzOTk2LzczODcvNjg3CitmIDM5OTYvNzM4Ny82ODcgMzk4Ny83MDc5LzY4NyAyOTY5LzcwNzgvNjg3CitmIDQwMjcvNzM4OC8xOTIwIDQwMjYvNzM4OS8xOTIwIDM5OTgvNzM5MC8xOTIwCitmIDM5OTgvNzM5MC8xOTIwIDM5OTkvNzM5MS8xOTIwIDQwMjcvNzM4OC8xOTIwCitmIDQwMjgvNzM5Mi8xOTIxIDQwMjcvNzM4OC8xOTIxIDM5OTkvNzM5MS8xOTIxCitmIDM5OTkvNzM5MS8xOTIxIDQwMDAvNzM5My8xOTIxIDQwMjgvNzM5Mi8xOTIxCitmIDQwMjkvNzM5NC8xOTIyIDQwMjgvNzM5NS8xOTIyIDQwMDAvNzM5Ni8xOTIyCitmIDQwMDAvNzM5Ni8xOTIyIDQwMDEvNzM5Ny8xOTIyIDQwMjkvNzM5NC8xOTIyCitmIDQwMzAvNzM5OC8xOTIzIDQwMjkvNzM5NC8xOTIzIDQwMDEvNzM5Ny8xOTIzCitmIDQwMDEvNzM5Ny8xOTIzIDQwMDIvNzM5OS8xOTIzIDQwMzAvNzM5OC8xOTIzCitmIDQwMzIvNzQwMC8xOTI0IDQwMzEvNzQwMS8xOTI0IDQwMDMvNzQwMi8xOTI0CitmIDQwMDMvNzQwMi8xOTI1IDQwMDQvNzQwMy8xOTI1IDQwMzIvNzQwMC8xOTI1CitmIDQwMzUvNzQwNC8xOTI2IDQwMzQvNzQwNS8xOTI2IDQwMDYvNzQwNi8xOTI2CitmIDQwMDYvNzQwNi8xOTI2IDQwMDcvNzQwNy8xOTI2IDQwMzUvNzQwNC8xOTI2CitmIDQwMzQvNzQwNS8xOTI3IDQwMzMvNzQwOC8xOTI3IDQwMDUvNzQwOS8xOTI3CitmIDQwMDUvNzQwOS8xOTI3IDQwMDYvNzQwNi8xOTI3IDQwMzQvNzQwNS8xOTI3CitmIDQwMzMvNzQxMC8xOTI4IDQwMzIvNzQwMC8xOTI4IDQwMDQvNzQwMy8xOTI4CitmIDQwMDQvNzQwMy8xOTI4IDQwMDUvNzQxMS8xOTI4IDQwMzMvNzQxMC8xOTI4CitmIDQwMTYvNzQxMi8xOTI5IDQwMTcvNzQxMy8xOTI5IDM5OTkvNzQxNC8xOTI5CitmIDM5OTkvNzQxNS8xOTMwIDM5OTgvNzQxNi8xOTMwIDQwMTYvNzQxNy8xOTMwCitmIDQwMTcvNzQxOC8xOTMxIDQwMTgvNzQxOS8xOTMxIDQwMDAvNzQyMC8xOTMxCitmIDQwMDAvNzQyMC8xOTMyIDM5OTkvNzQyMS8xOTMyIDQwMTcvNzQxOC8xOTMyCitmIDQwMTgvNzQxOS8xOTMzIDQwMTkvNzQyMi8xOTMzIDQwMDEvNzQyMy8xOTMzCitmIDQwMDEvNzQyMy8xOTMzIDQwMDAvNzQyMC8xOTMzIDQwMTgvNzQxOS8xOTMzCitmIDQwMTkvNzQyNC8xOTM0IDQwMjAvNzQyNS8xOTM0IDQwMDIvNzM5OS8xOTM0CitmIDQwMDIvNzQyNi8xOTM1IDQwMDEvNzQyMy8xOTM1IDQwMTkvNzQyMi8xOTM1CitmIDQwMzcvNzQyNy8xOTM2IDQxODAvNzQyOC8xOTM2IDQxODUvNzQyOS8xOTM2CitmIDQxODUvNzQyOS8xOTM2IDQwMzYvNzQzMC8xOTM2IDQwMzcvNzQyNy8xOTM2CitmIDQwMjEvNzQzMS8xOTM3IDQwMjIvNzQzMi8xOTM3IDQwMDQvNzQzMy8xOTM3CitmIDQwMDQvNzQwMy8xOTM4IDQwMDMvNzQwMi8xOTM4IDQwMjEvNzQzNC8xOTM4CitmIDQwMjIvNzQzMi8xOTM5IDQwMjMvNzQzNS8xOTM5IDQwMDUvNzQzNi8xOTM5CitmIDQwMDUvNzQzNi8xOTQwIDQwMDQvNzQzMy8xOTQwIDQwMjIvNzQzMi8xOTQwCitmIDQwMjMvNzQzNS8xOTQxIDQwMjQvNzQzNy8xOTQxIDQwMDYvNzQzOC8xOTQxCitmIDQwMDYvNzQzOC8xOTQyIDQwMDUvNzQzNi8xOTQyIDQwMjMvNzQzNS8xOTQyCitmIDQwMjQvNzQzNy8xOTQzIDQwMjUvNzQzOS8xOTQzIDQwMDcvNzQ0MC8xOTQzCitmIDQwMDcvNzQwNy8xOTQ0IDQwMDYvNzQwNi8xOTQ0IDQwMjQvNzQ0MS8xOTQ0CitmIDQwMTYvNzQ0Mi8xOTQ1IDQwNTIvNzQ0My8xOTQ1IDQwNTMvNzQ0NC8xOTQ1CitmIDQwNTMvNzQ0NC8xOTQ2IDQwMTcvNzQxOC8xOTQ2IDQwMTYvNzQ0Mi8xOTQ2CitmIDQwMTcvNzQxOC8xOTQ3IDQwNTMvNzQ0NC8xOTQ3IDQwNTQvNzQ0NS8xOTQ3CitmIDQwNTQvNzQ0NS8xOTQ4IDQwMTgvNzQxOS8xOTQ4IDQwMTcvNzQxOC8xOTQ4CitmIDQwMTgvNzQxOS8xOTQ5IDQwNTQvNzQ0NS8xOTQ5IDQwNTUvNzQ0Ni8xOTQ5CitmIDQwNTUvNzQ0Ni8xOTUwIDQwMTkvNzQyMi8xOTUwIDQwMTgvNzQxOS8xOTUwCitmIDQwMjAvNzQ0Ny8xOTUxIDQwMTkvNzQyMi8xOTUxIDQwNTUvNzQ0Ni8xOTUxCitmIDQwNTUvNzQ0Ni8xOTUyIDQwNTYvNzQ0OC8xOTUyIDQwMjAvNzQ0Ny8xOTUyCitmIDU4NTkvNzQ0OS8xOTUzIDQxNjkvNzQ1MC8xOTUzIDQxNzAvNzQ1MS8xOTUzCitmIDQwMjEvNzQzMS8xOTU0IDQwNTcvNzQ1Mi8xOTU0IDQwNTgvNzQ1My8xOTU0CitmIDQwNTgvNzQ1My8xOTU1IDQwMjIvNzQzMi8xOTU1IDQwMjEvNzQzMS8xOTU1CitmIDQwMjIvNzQzMi8xOTU2IDQwNTgvNzQ1My8xOTU2IDQwNTkvNzQ1NC8xOTU2CitmIDQwNTkvNzQ1NC8xOTU3IDQwMjMvNzQzNS8xOTU3IDQwMjIvNzQzMi8xOTU3CitmIDQwMjMvNzQzNS8xOTU4IDQwNTkvNzQ1NC8xOTU4IDQwNjAvNzQ1NS8xOTU4CitmIDQwNjAvNzQ1NS8xOTU5IDQwMjQvNzQzNy8xOTU5IDQwMjMvNzQzNS8xOTU5CitmIDQwMjUvNzQzOS8xOTYwIDQwMjQvNzQzNy8xOTYwIDQwNjAvNzQ1NS8xOTYwCitmIDQwNjAvNzQ1NS8xOTYwIDQwNjEvNzQ1Ni8xOTYwIDQwMjUvNzQzOS8xOTYwCitmIDQxNTUvNzQ1Ny8xOTIwIDQxNTQvNzQ1OC8xOTIwIDQwMjYvNzM4OS8xOTIwCitmIDQwMjYvNzM4OS8xOTYxIDQwMjcvNzM4OC8xOTYxIDQxNTUvNzQ1Ny8xOTYxCitmIDQxNTYvNzQ1OS8xOTYyIDQxNTUvNzQ1Ny8xOTYyIDQwMjcvNzM4OC8xOTYyCitmIDQwMjcvNzM4OC8xOTIxIDQwMjgvNzM5Mi8xOTIxIDQxNTYvNzQ1OS8xOTIxCitmIDQxNTcvNzQ2MC8xOTIyIDQxNTYvNzQ2MS8xOTIyIDQwMjgvNzM5NS8xOTIyCitmIDQwMjgvNzM5NS8xOTIyIDQwMjkvNzM5NC8xOTIyIDQxNTcvNzQ2MC8xOTIyCitmIDQxNTgvNzQ2Mi8xOTYzIDQxNTcvNzQ2MC8xOTYzIDQwMjkvNzM5NC8xOTYzCitmIDQwMjkvNzM5NC8xOTY0IDQwMzAvNzM5OC8xOTY0IDQxNTgvNzQ2Mi8xOTY0CitmIDQxNzQvNzQ2My8xOTY1IDUwNDkvNzQ2NC8xOTY1IDUwNTAvNzQ2NS8xOTY1CitmIDUwNTAvNzQ2NS8xOTY2IDQxNzMvNzQ2Ni8xOTY2IDQxNzQvNzQ2My8xOTY2CitmIDQxNjAvNzQ2Ny8xOTY3IDQxNTkvNzQ2OC8xOTY3IDQwMzEvNzQwMS8xOTY3CitmIDQwMzEvNzQwMS8xOTI1IDQwMzIvNzQwMC8xOTI1IDQxNjAvNzQ2Ny8xOTI1CitmIDQxNjMvNzQ2OS8xOTI2IDQxNjIvNzQ3MC8xOTI2IDQwMzQvNzQwNS8xOTI2CitmIDQwMzQvNzQwNS8xOTI2IDQwMzUvNzQwNC8xOTI2IDQxNjMvNzQ2OS8xOTI2CitmIDQxNjIvNzQ3MC8xOTI3IDQxNjEvNzQ3MS8xOTI3IDQwMzMvNzQwOC8xOTI3CitmIDQwMzMvNzQwOC8xOTI3IDQwMzQvNzQwNS8xOTI3IDQxNjIvNzQ3MC8xOTI3CitmIDQxNjEvNzQ3Mi8xOTI4IDQxNjAvNzQ2Ny8xOTI4IDQwMzIvNzQwMC8xOTI4CitmIDQwMzIvNzQwMC8xOTI4IDQwMzMvNzQxMC8xOTI4IDQxNjEvNzQ3Mi8xOTI4CitmIDQxODgvNzQ3My82ODcgNDA3MC83NDc0LzY4NyA0MDg0Lzc0NzUvNjg3CitmIDQwODQvNzQ3NS82ODcgNDE4My83NDc2LzY4NyA0MTg4Lzc0NzMvNjg3CitmIDQwMzAvNzM5OC8yMjEgNDAwMi83Mzk5LzIyMSA0MDM2Lzc0MzAvMjIxCitmIDQwMzYvNzQzMC8yMTkgNDAzOS83NDc3LzIxOSA0MDMwLzczOTgvMjE5CitmIDQwMzgvNzQ3OC8xOTY4IDU4NjAvNzQ3OS8xOTY4IDU4NjEvNzQ4MC8xOTY4CitmIDU4NjEvNzQ4MC8xOTY5IDUwNDgvNzQ4MS8xOTY5IDQwMzgvNzQ3OC8xOTY5CitmIDQwMzYvNzQzMC8xOTM2IDQwMDIvNzM5OS8xOTM2IDQwMjAvNzQyNS8xOTM2CitmIDQwMjAvNzQyNS8xOTM2IDQwMzcvNzQyNy8xOTM2IDQwMzYvNzQzMC8xOTM2CitmIDQwMzcvNzQ4Mi8xOTcwIDQwMjAvNzQ0Ny8xOTcwIDQwNTYvNzQ0OC8xOTcwCitmIDQwNTYvNzQ0OC8xOTcwIDQwNjIvNzQ4My8xOTcwIDQwMzcvNzQ4Mi8xOTcwCitmIDQwNDEvNzQ4NC8xOTcxIDQwNTcvNzQ1Mi8xOTcxIDQwNjMvNzQ4NS8xOTcxCitmIDQwNjMvNzQ4NS8xOTcyIDQwNDIvNzQ4Ni8xOTcyIDQwNDEvNzQ4NC8xOTcyCitmIDQwNTIvNzQ0My8xOTczIDQwNDAvNzQ4Ny8xOTczIDQwNTAvNzQ4OC8xOTczCitmIDQwNTAvNzQ4OC8xOTc0IDQwNTMvNzQ0NC8xOTc0IDQwNTIvNzQ0My8xOTc0CitmIDQwNTAvNzQ4OC8xOTc1IDQwNDkvNzQ4OS8xOTc1IDQwNTQvNzQ0NS8xOTc1CitmIDQwNTQvNzQ0NS8xOTc2IDQwNTMvNzQ0NC8xOTc2IDQwNTAvNzQ4OC8xOTc2CitmIDQwNDkvNzQ4OS8xOTc3IDQwNDgvNzQ5MC8xOTc3IDQwNTUvNzQ0Ni8xOTc3CitmIDQwNTUvNzQ0Ni8xOTc4IDQwNTQvNzQ0NS8xOTc4IDQwNDkvNzQ4OS8xOTc4CitmIDQwNDgvNzQ5MC8xOTc5IDQwNDcvNzQ5MS8xOTc5IDQwNTYvNzQ0OC8xOTc5CitmIDQwNTYvNzQ0OC8xOTgwIDQwNTUvNzQ0Ni8xOTgwIDQwNDgvNzQ5MC8xOTgwCitmIDQxODEvNzQ5Mi8xOTgxIDQwNjIvNzQ4My8xOTgxIDQwNTEvNzQ5My8xOTgxCitmIDQwNTEvNzQ5My8xOTgxIDQxODcvNzQ5NC8xOTgxIDQxODEvNzQ5Mi8xOTgxCitmIDQwNTcvNzQ1Mi8xOTgyIDQwNDEvNzQ4NC8xOTgyIDQwNDYvNzQ5NS8xOTgyCitmIDQwNDYvNzQ5NS8xOTgzIDQwNTgvNzQ1My8xOTgzIDQwNTcvNzQ1Mi8xOTgzCitmIDQwNDYvNzQ5NS8xOTg0IDQwNDUvNzQ5Ni8xOTg0IDQwNTkvNzQ1NC8xOTg0CitmIDQwNTkvNzQ1NC8xOTg1IDQwNTgvNzQ1My8xOTg1IDQwNDYvNzQ5NS8xOTg1CitmIDQwNDUvNzQ5Ni8xOTg2IDQwNDQvNzQ5Ny8xOTg2IDQwNjAvNzQ1NS8xOTg2CitmIDQwNjAvNzQ1NS8xOTg3IDQwNTkvNzQ1NC8xOTg3IDQwNDUvNzQ5Ni8xOTg3CitmIDQwNDQvNzQ5Ny8xOTg4IDQwNDMvNzQ5OC8xOTg4IDQwNjEvNzQ1Ni8xOTg4CitmIDQwNjEvNzQ1Ni8xOTg5IDQwNjAvNzQ1NS8xOTg5IDQwNDQvNzQ5Ny8xOTg5CitmIDQwNDcvNzQ5MS8xOTgxIDQwNTEvNzQ5My8xOTgxIDQwNjIvNzQ4My8xOTgxCitmIDQwNjIvNzQ4My8xOTgxIDQwNTYvNzQ0OC8xOTgxIDQwNDcvNzQ5MS8xOTgxCitmIDQwNTcvNzQ1Mi8xOTkwIDU4NjAvNzQ3OS8xOTkwIDQwMzgvNzQ3OC8xOTkwCitmIDQwMzgvNzQ3OC8xOTkxIDQwNjMvNzQ4NS8xOTkxIDQwNTcvNzQ1Mi8xOTkxCitmIDQwNDMvNzQ5OC82ODcgNDA0NC83NDk3LzY4NyA0MDY1Lzc0OTkvNjg3CitmIDQwNjUvNzQ5OS82ODcgNDA2NC83NTAwLzY4NyA0MDQzLzc0OTgvNjg3CitmIDQwNDQvNzQ5Ny82ODcgNDA0NS83NDk2LzY4NyA0MDY2Lzc1MDEvNjg3CitmIDQwNjYvNzUwMS82ODcgNDA2NS83NDk5LzY4NyA0MDQ0Lzc0OTcvNjg3CitmIDQwNDUvNzQ5Ni82ODcgNDA0Ni83NDk1LzY4NyA0MDY3Lzc1MDIvNjg3CitmIDQwNjcvNzUwMi82ODcgNDA2Ni83NTAxLzY4NyA0MDQ1Lzc0OTYvNjg3CitmIDQwNDYvNzQ5NS82ODcgNDA0MS83NDg0LzY4NyA0MDY4Lzc1MDMvNjg3CitmIDQwNjgvNzUwMy82ODcgNDA2Ny83NTAyLzY4NyA0MDQ2Lzc0OTUvNjg3CitmIDQwNDEvNzQ4NC82ODcgNDA0Mi83NDg2LzY4NyA0MDY5Lzc1MDQvNjg3CitmIDQwNjkvNzUwNC82ODcgNDA2OC83NTAzLzY4NyA0MDQxLzc0ODQvNjg3CitmIDQwNjkvNzUwNC82ODcgNDA0Mi83NDg2LzY4NyA0MTc3Lzc1MDUvNjg3CitmIDQxNzcvNzUwNS82ODcgNDE3OC83NTA2LzY4NyA0MDY5Lzc1MDQvNjg3CitmIDQwNTEvNzQ5My82ODcgNDA0Ny83NDkxLzY4NyA0MDcxLzc1MDcvNjg3CitmIDQwNzEvNzUwNy82ODcgNDA3MC83NDc0LzY4NyA0MDUxLzc0OTMvNjg3CitmIDQwNDcvNzQ5MS82ODcgNDA0OC83NDkwLzY4NyA0MDcyLzc1MDgvNjg3CitmIDQwNzIvNzUwOC82ODcgNDA3MS83NTA3LzY4NyA0MDQ3Lzc0OTEvNjg3CitmIDQwNDgvNzQ5MC82ODcgNDA0OS83NDg5LzY4NyA0MDczLzc1MDkvNjg3CitmIDQwNzMvNzUwOS82ODcgNDA3Mi83NTA4LzY4NyA0MDQ4Lzc0OTAvNjg3CitmIDQwNDkvNzQ4OS82ODcgNDA1MC83NDg4LzY4NyA0MDc0Lzc1MTAvNjg3CitmIDQwNzQvNzUxMC82ODcgNDA3My83NTA5LzY4NyA0MDQ5Lzc0ODkvNjg3CitmIDQwNTAvNzQ4OC82ODcgNDA0MC83NDg3LzY4NyA0MDc1Lzc1MTEvNjg3CitmIDQwNzUvNzUxMS82ODcgNDA3NC83NTEwLzY4NyA0MDUwLzc0ODgvNjg3CitmIDQwNjgvNzUwMy82ODcgNDA2OS83NTA0LzY4NyA0MDg1Lzc1MTIvNjg3CitmIDQwODUvNzUxMi82ODcgNDA4Ni83NTEzLzY4NyA0MDY4Lzc1MDMvNjg3CitmIDQwNjcvNzUwMi82ODcgNDA2OC83NTAzLzY4NyA0MDg2Lzc1MTMvNjg3CitmIDQwODYvNzUxMy82ODcgNDA4Ny83NTE0LzY4NyA0MDY3Lzc1MDIvNjg3CitmIDQwNjYvNzUwMS82ODcgNDA2Ny83NTAyLzY4NyA0MDg3Lzc1MTQvNjg3CitmIDQwODcvNzUxNC82ODcgNDA2NS83NDk5LzY4NyA0MDY2Lzc1MDEvNjg3CitmIDQwNzEvNzUwNy82ODcgNDA4My83NTE1LzY4NyA0MDg0Lzc0NzUvNjg3CitmIDQwODQvNzQ3NS82ODcgNDA3MC83NDc0LzY4NyA0MDcxLzc1MDcvNjg3CitmIDQwNzIvNzUwOC82ODcgNDA4Mi83NTE2LzY4NyA0MDgzLzc1MTUvNjg3CitmIDQwODMvNzUxNS82ODcgNDA3MS83NTA3LzY4NyA0MDcyLzc1MDgvNjg3CitmIDQwNzMvNzUwOS82ODcgNDA3NC83NTEwLzY4NyA0MDgyLzc1MTYvNjg3CitmIDQwODIvNzUxNi82ODcgNDA3Mi83NTA4LzY4NyA0MDczLzc1MDkvNjg3CitmIDQwNzQvNzUxMC82ODcgNDA3NS83NTExLzY4NyA0MDc2Lzc1MTcvNjg3CitmIDQwNzYvNzUxNy82ODcgNDA4Mi83NTE2LzY4NyA0MDc0Lzc1MTAvNjg3CitmIDQwNzYvNzUxNy82ODcgNDA3Ny83NTE4LzY4NyA0MDgzLzc1MTUvNjg3CitmIDQwODMvNzUxNS82ODcgNDA4Mi83NTE2LzY4NyA0MDc2Lzc1MTcvNjg3CitmIDQwNzcvNzUxOC82ODcgNDA3OC83NTE5LzY4NyA0MDg0Lzc0NzUvNjg3CitmIDQwODQvNzQ3NS82ODcgNDA4My83NTE1LzY4NyA0MDc3Lzc1MTgvNjg3CitmIDQxODMvNzQ3Ni82ODcgNDA4NC83NDc1LzY4NyA0MDc4Lzc1MTkvNjg3CitmIDQwNzgvNzUxOS82ODcgNDE4Mi83NTIwLzY4NyA0MTgzLzc0NzYvNjg3CitmIDQwNzkvNzUyMS82ODcgNDA4MC83NTIyLzY4NyA0MDg2Lzc1MTMvNjg3CitmIDQwODYvNzUxMy82ODcgNDA4NS83NTEyLzY4NyA0MDc5Lzc1MjEvNjg3CitmIDQwODAvNzUyMi82ODcgNDA4MS83NTIzLzY4NyA0MDg3Lzc1MTQvNjg3CitmIDQwODcvNzUxNC82ODcgNDA4Ni83NTEzLzY4NyA0MDgwLzc1MjIvNjg3CitmIDQwODEvNzUyMy82ODcgNDA2NC83NTAwLzY4NyA0MDY1Lzc0OTkvNjg3CitmIDQwNjUvNzQ5OS82ODcgNDA4Ny83NTE0LzY4NyA0MDgxLzc1MjMvNjg3CitmIDQxNjYvNzUyNC8xOTkyIDQxOTQvNzUyNS8xOTkyIDQxOTMvNzUyNi8xOTkyCitmIDQxOTMvNzUyNi8xOTkzIDQxNTIvNzUyNy8xOTkzIDQxNjYvNzUyNC8xOTkzCitmIDQxMTcvNzUyOC8xOTM2IDQxMDgvNzUyOS8xOTM2IDQwOTQvNzUzMC8xOTM2CitmIDQwOTQvNzUzMC8xOTM2IDQwOTAvNzUzMS8xOTM2IDQxMTcvNzUyOC8xOTM2CitmIDQxMjAvNzUzMi82ODcgNDExMi83NTMzLzY4NyA0MDk4Lzc1MzQvNjg3CitmIDQwOTgvNzUzNC82ODcgNDA5My83NTM1LzY4NyA0MTIwLzc1MzIvNjg3CitmIDQxMTEvNzUzNi8xOTk0IDQxMTgvNzUzNy8xOTk0IDQwOTEvNzUzOC8xOTk0CitmIDQwOTEvNzUzOC8xOTgxIDQwOTcvNzUzOS8xOTgxIDQxMTEvNzUzNi8xOTgxCitmIDQxMTkvNzU0MC82ODcgNDEyMC83NTMyLzY4NyA0MDkzLzc1MzUvNjg3CitmIDQwOTMvNzUzNS82ODcgNDA5Mi83NTQxLzY4NyA0MTE5Lzc1NDAvNjg3CitmIDQyNzIvNzU0Mi8yMjEgNDI3MS83NTQzLzIyMSA0MDk0Lzc1MzAvMjIxCitmIDQwOTQvNzUzMC8yMjEgNDA5Ni83NTQ0LzIyMSA0MjcyLzc1NDIvMjIxCitmIDQyNjQvNzU0NS8xOTcwIDQyNjUvNzU0Ni8xOTcwIDQwOTEvNzUzOC8xOTcwCitmIDQwOTEvNzUzOC8xOTcwIDQwOTAvNzU0Ny8xOTcwIDQyNjQvNzU0NS8xOTcwCitmIDQyNjkvNzU0OC8xOTY1IDQyNzAvNzU0OS8xOTY1IDQxNjQvNzU1MC8xOTY1CitmIDQxNjQvNzU1MC8xOTY1IDQwOTUvNzU1MS8xOTY1IDQyNjkvNzU0OC8xOTY1CitmIDQyNzMvNzU1Mi82ODcgNDI3NC83NTUzLzY4NyA0MDk4Lzc1MzQvNjg3CitmIDQwOTgvNzUzNC82ODcgNDA5Ny83NTM5LzY4NyA0MjczLzc1NTIvNjg3CitmIDQxMjMvNzU1NC8yMTkgNDEyMS83NTU1LzIxOSA0MDk5Lzc1NTYvMjE5CitmIDQwOTkvNzU1Ni8yMjEgNDEwMS83NTU3LzIyMSA0MTIzLzc1NTQvMjIxCitmIDQxMTMvNzU1OC8xOTcwIDQxMTQvNzU1OS8xOTcwIDQxMDUvNzU2MC8xOTcwCitmIDQxMDUvNzU2MC8xOTcwIDQxMDQvNzU2MS8xOTcwIDQxMTMvNzU1OC8xOTcwCitmIDQxMjIvNzU2Mi8xOTk1IDQxNjcvNzU2My8xOTk1IDQxNjUvNzU2NC8xOTk1CitmIDQxNjUvNzU2NC8xOTk2IDQxNTEvNzU2NS8xOTk2IDQxMjIvNzU2Mi8xOTk2CitmIDQxMjQvNzU2Ni82ODcgNDEyNS83NTY3LzY4NyA0MTAzLzc1NjgvNjg3CitmIDQxMDMvNzU2OC82ODcgNDEwMi83NTY5LzY4NyA0MTI0Lzc1NjYvNjg3CitmIDQyOTEvNzU3MC8xOTM2IDQyODYvNzU3MS8xOTM2IDQwOTkvNzU1Ni8xOTM2CitmIDQwOTkvNzU1Ni8xOTM2IDQxMDQvNzU3Mi8xOTM2IDQyOTEvNzU3MC8xOTM2CitmIDQyOTQvNzU3My82ODcgNDI4OS83NTc0LzY4NyA0MTAzLzc1NjgvNjg3CitmIDQxMDMvNzU2OC82ODcgNDEwNy83NTc1LzY4NyA0Mjk0Lzc1NzMvNjg3CitmIDQyODgvNzU3Ni8xOTcxIDQyOTIvNzU3Ny8xOTcxIDQxMDUvNzU2MC8xOTcxCitmIDQxMDUvNzU2MC8xOTcxIDQxMDIvNzU2OS8xOTcxIDQyODgvNzU3Ni8xOTcxCitmIDQyOTMvNzU3OC82ODcgNDI5NC83NTczLzY4NyA0MTA3Lzc1NzUvNjg3CitmIDQxMDcvNzU3NS82ODcgNDEwNi83NTc5LzY4NyA0MjkzLzc1NzgvNjg3CitmIDQwOTYvNzU0NC8yMjEgNDA5NC83NTMwLzIyMSA0MTA4Lzc1MjkvMjIxCitmIDQxMDgvNzUyOS8yMTkgNDExMC83NTgwLzIxOSA0MDk2Lzc1NDQvMjE5CitmIDQxMDQvNzU3Mi8xOTM2IDQwOTkvNzU1Ni8xOTM2IDQxMjEvNzU1NS8xOTM2CitmIDQxMjEvNzU1NS8xOTM2IDQxMTMvNzU4MS8xOTM2IDQxMDQvNzU3Mi8xOTM2CitmIDQwOTAvNzU0Ny8xOTcwIDQwOTEvNzUzOC8xOTcwIDQxMTgvNzUzNy8xOTcwCitmIDQxMTgvNzUzNy8xOTcwIDQxMTcvNzU4Mi8xOTcwIDQwOTAvNzU0Ny8xOTcwCitmIDQwOTUvNzU1MS8xOTk1IDQxNjQvNzU1MC8xOTk1IDQxNjYvNzUyNC8xOTk1CitmIDQxNjYvNzUyNC8xOTk3IDQxNTIvNzUyNy8xOTk3IDQwOTUvNzU1MS8xOTk3CitmIDQxMDcvNzU3NS82ODcgNDEwMy83NTY4LzY4NyA0MTI1Lzc1NjcvNjg3CitmIDQxMjUvNzU2Ny82ODcgNDExNi83NTgzLzY4NyA0MTA3Lzc1NzUvNjg3CitmIDQxMDIvNzU2OS8xOTcxIDQxMDUvNzU2MC8xOTcxIDQxMTQvNzU1OS8xOTcxCitmIDQxMTQvNzU1OS8xOTcxIDQxMjQvNzU2Ni8xOTcxIDQxMDIvNzU2OS8xOTcxCitmIDQwOTcvNzUzOS82ODcgNDA5OC83NTM0LzY4NyA0MTEyLzc1MzMvNjg3CitmIDQxMTIvNzUzMy82ODcgNDExMS83NTM2LzY4NyA0MDk3Lzc1MzkvNjg3CitmIDQxMDYvNzU3OS82ODcgNDEwNy83NTc1LzY4NyA0MTE2Lzc1ODMvNjg3CitmIDQxMTYvNzU4My82ODcgNDExNS83NTg0LzY4NyA0MTA2Lzc1NzkvNjg3CitmIDQxMDgvNzUyOS8xOTM2IDQxMTcvNzUyOC8xOTM2IDQyMjQvNzU4NS8xOTM2CitmIDQyMjQvNzU4NS8xOTM2IDQyMTYvNzU4Ni8xOTM2IDQxMDgvNzUyOS8xOTM2CitmIDQxMTIvNzUzMy82ODcgNDEyMC83NTMyLzY4NyA0MjI3Lzc1ODcvNjg3CitmIDQyMjcvNzU4Ny82ODcgNDIxOS83NTg4LzY4NyA0MTEyLzc1MzMvNjg3CitmIDQxMTgvNzUzNy8xOTk0IDQxMTEvNzUzNi8xOTk0IDQyMTgvNzU4OS8xOTk0CitmIDQyMTgvNzU4OS8xOTk0IDQyMjUvNzU5MC8xOTk0IDQxMTgvNzUzNy8xOTk0CitmIDQxMjAvNzUzMi82ODcgNDExOS83NTQwLzY4NyA0MjI2Lzc1OTEvNjg3CitmIDQyMjYvNzU5MS82ODcgNDIyNy83NTg3LzY4NyA0MTIwLzc1MzIvNjg3CitmIDQxMjEvNzU1NS8yMjEgNDEyMy83NTU0LzIyMSA0MjI5Lzc1OTIvMjIxCitmIDQyMjkvNzU5Mi8yMjEgNDIyOC83NTkzLzIyMSA0MTIxLzc1NTUvMjIxCitmIDQxMTQvNzU1OS8xOTcwIDQxMTMvNzU1OC8xOTcwIDQyMjAvNzU5NC8xOTcwCitmIDQyMjAvNzU5NC8xOTcwIDQyMjEvNzU5NS8xOTcwIDQxMTQvNzU1OS8xOTcwCitmIDQxNjcvNzU2My8xOTk3IDQxMjIvNzU2Mi8xOTk3IDQyMDAvNzU5Ni8xOTk3CitmIDQyMDAvNzU5Ni8xOTk2IDQxOTkvNzU5Ny8xOTk2IDQxNjcvNzU2My8xOTk2CitmIDQxMjUvNzU2Ny82ODcgNDEyNC83NTY2LzY4NyA0MjMwLzc1OTgvNjg3CitmIDQyMzAvNzU5OC82ODcgNDIzMS83NTk5LzY4NyA0MTI1Lzc1NjcvNjg3CitmIDQwODgvNzYwMC82OTcgNDAwOC83NjAxLzY5NyA0MTI3Lzc2MDIvNjk3CitmIDQxMjcvNzYwMi82OTcgNDEyNi83NjAzLzY5NyA0MDg4Lzc2MDAvNjk3CitmIDQwMDgvNzYwMS82OTcgNDE0MS83NjA0LzY5NyA0MTI4Lzc2MDUvNjk3CitmIDQxMjgvNzYwNS82OTcgNDEyNy83NjAyLzY5NyA0MDA4Lzc2MDEvNjk3CitmIDQxNDEvNzYwNC82OTcgNDE0Mi83NjA2LzY5NyA0MTI5Lzc2MDcvNjk3CitmIDQxMjkvNzYwNy82OTcgNDEyOC83NjA1LzY5NyA0MTQxLzc2MDQvNjk3CitmIDQxNDIvNzYwNi8xOTk4IDQxNDMvNzYwOC8xOTk4IDQxMzAvNzYwOS8xOTk4CitmIDQxMzAvNzYwOS8xOTk4IDQxMjkvNzYwNy8xOTk4IDQxNDIvNzYwNi8xOTk4CitmIDUwNjkvNzYxMC82OTcgNTA3MC83NjExLzY5NyA0MTMwLzc2MDkvNjk3CitmIDQxMzAvNzYwOS82OTcgNDE0My83NjA4LzY5NyA1MDY5Lzc2MTAvNjk3CitmIDQxNTAvNzYxMi82OTcgNDEwOS83NjEzLzY5NyA0MTMyLzc2MTQvNjk3CitmIDQxMzIvNzYxNC82OTcgNDEzMS83NjE1LzY5NyA0MTUwLzc2MTIvNjk3CitmIDQxMzMvNzYxNi82OTcgNDIxNS83NjE3LzY5NyA0MjAxLzc2MTgvNjk3CitmIDQyMDEvNzYxOC82OTcgNDE1My83NjE5LzY5NyA0MTMzLzc2MTYvNjk3CitmIDQxNTMvNzYxOS82OTcgNDEwMC83NjIwLzY5NyA0MTM0Lzc2MjEvNjk3CitmIDQxMzQvNzYyMS82OTcgNDEzMy83NjE2LzY5NyA0MTUzLzc2MTkvNjk3CitmIDQyOTAvNzYyMi82OTcgNDI5NS83NjIzLzY5NyA0MTM0Lzc2MjEvNjk3CitmIDQxMzQvNzYyMS82OTcgNDEwMC83NjIwLzY5NyA0MjkwLzc2MjIvNjk3CitmIDQwODkvNzYyNC8xOTk5IDQwMTIvNzYyNS8xOTk5IDQxMzYvNzYyNi8xOTk5CitmIDQxMzYvNzYyNi8xOTk5IDQxMzUvNzYyNy8xOTk5IDQwODkvNzYyNC8xOTk5CitmIDQwMTIvNzYyNS82OTcgNDE0NS83NjI4LzY5NyA0MTM3Lzc2MjkvNjk3CitmIDQxMzcvNzYyOS82OTcgNDEzNi83NjI2LzY5NyA0MDEyLzc2MjUvNjk3CitmIDQxNDUvNzYyOC82OTcgNDE0Ni83NjMwLzY5NyA0MTM4Lzc2MzEvNjk3CitmIDQxMzgvNzYzMS82OTcgNDEzNy83NjI5LzY5NyA0MTQ1Lzc2MjgvNjk3CitmIDQxNDYvNzYzMC82OTcgNDE0Ny83NjMyLzY5NyA0MTM5Lzc2MzMvNjk3CitmIDQxMzkvNzYzMy82OTcgNDEzOC83NjMxLzY5NyA0MTQ2Lzc2MzAvNjk3CitmIDY3OTUvNzYzNC8yMDAwIDQxNDgvNzYzNS8yMDAwIDQxNDAvNzYzNi8yMDAwCitmIDQxNDAvNzYzNy8yMDAxIDY3OTYvNzYzOC8yMDAxIDY3OTcvNzYzOS8yMDAxCitmIDY3OTgvNzY0MC8yMDAyIDQxNDAvNzY0MS8yMDAyIDQwMDkvNzY0Mi8yMDAyCitmIDQwMDkvNzY0My8yMDAzIDY3OTkvNzY0NC8yMDAzIDY4MDAvNzY0NS8yMDAzCitmIDY4MDEvNzY0Ni8yMDA0IDQwMDkvNzY0Ny8yMDA0IDQwMTAvNzY0OC8yMDA0CitmIDQwMTAvNzY0OS8yMDA1IDY4MDIvNzY1MC8yMDA1IDY4MDMvNzY1MS8yMDA1CitmIDQxNDIvNzYwNi8yMDA2IDY4MDQvNzY1Mi8yMDA2IDQwMTEvNzY1My8yMDA2CitmIDQwMTEvNzY1My8yMDA3IDQxNDMvNzYwOC8yMDA3IDQxNDIvNzYwNi8yMDA3CitmIDQwODkvNzYyNC8yMDA4IDQxNDkvNzY1NC8yMDA4IDQxNDQvNzY1NS8yMDA4CitmIDQxNDQvNzY1NS8yMDA5IDQwMTIvNzYyNS8yMDA5IDQwODkvNzYyNC8yMDA5CitmIDY4MDUvNzY1Ni8yMDEwIDQwMTQvNzY1Ny8yMDEwIDQwMTUvNzY1OC8yMDEwCitmIDQwMTUvNzY1OS8yMDExIDY4MDYvNzY2MC8yMDExIDY4MDcvNzY2MS8yMDExCitmIDY4MDgvNzY2Mi8yMDEyIDQwMTMvNzY2My8yMDEyIDQwMTQvNzY2NC8yMDEyCitmIDQwMTQvNzY2NS8yMDEzIDY4MDkvNzY2Ni8yMDEzIDY4MTAvNzY2Ny8yMDEzCitmIDY4MTEvNzY2OC8yMDE0IDY4MTIvNzY2OS8yMDE0IDQwMTMvNzY3MC8yMDE0CitmIDQwMTMvNzY3MS8yMDE1IDY4MTMvNzY3Mi8yMDE1IDY4MTQvNzY3My8yMDE1CitmIDY4MTUvNzY3NC8yMDE2IDQyOTYvNzY3NS8yMDE2IDQyOTAvNzY3Ni8yMDE2CitmIDQyOTAvNzYyMi8yMDE3IDQxMDAvNzYyMC8yMDE3IDY4MTYvNzY3Ny8yMDE3CitmIDQxOTIvNzY3OC8yMDE3IDQxMDkvNzYxMy8yMDE3IDY4MTcvNzY3OS8yMDE3CitmIDY4MTgvNzY4MC8yMDE4IDY4MTkvNzY4MS8yMDE4IDQxOTIvNzY4Mi8yMDE4CitmIDQxNTMvNzY4My8yMDE3IDY4MjAvNzY4NC8yMDE3IDY4MjEvNzY4NS8yMDE3CitmIDY4MjIvNzY3Ny8yMDE3IDQxMDAvNzYyMC8yMDE3IDQxNTMvNzYxOS8yMDE3CitmIDQxNTAvNzY4Ni8yMDE2IDY4MjMvNzY4Ny8yMDE2IDY4MjQvNzY4OC8yMDE2CitmIDY4MjUvNzY3OS8yMDE5IDQxMDkvNzYxMy8yMDE5IDQxNTAvNzYxMi8yMDE5CitmIDQyMDEvNzY4OS8yMDE2IDY4MjYvNzY5MC8yMDE2IDY4MjcvNzY5MS8yMDE2CitmIDY4MjgvNzY5Mi8yMDE3IDQxNTMvNzYxOS8yMDE3IDQyMDEvNzYxOC8yMDE3CitmIDQyNjgvNzY5My8yMDE3IDY4MjkvNzY5NC8yMDE3IDY4MzAvNzY5NS8yMDE3CitmIDY4MzEvNzY5Ni8yMDE3IDQxNTAvNzYxMi8yMDE3IDQyNjgvNzY5Ny8yMDE3CitmIDY4MzIvNzY5OC8xOTIwIDY4MzMvNzY5OS8xOTIwIDQxNTQvNzcwMC8xOTIwCitmIDQxNTQvNzQ1OC8xOTIwIDQxNTUvNzQ1Ny8xOTIwIDY4MzQvNzcwMS8xOTIwCitmIDY4MzUvNzcwMi8xOTIxIDY4MzYvNzcwMy8xOTIxIDQxNTUvNzcwNC8xOTIxCitmIDQxNTUvNzQ1Ny8xOTIxIDQxNTYvNzQ1OS8xOTIxIDY4MzcvNzcwNS8xOTIxCitmIDY4MzgvNzcwNi8xOTIyIDY4MzkvNzcwNy8xOTIyIDQxNTYvNzcwOC8xOTIyCitmIDQxNTYvNzQ2MS8xOTIyIDQxNTcvNzQ2MC8xOTIyIDY4NDAvNzcwOS8xOTIyCitmIDY4NDEvNzcxMC8yMDIwIDY4NDIvNzcxMS8yMDIwIDQxNTcvNzcxMi8yMDIwCitmIDQxNTcvNzQ2MC8yMDIxIDQxNTgvNzQ2Mi8yMDIxIDY4NDMvNzcxMy8yMDIxCitmIDQxMDEvNzU1Ny8xMjc2IDQyODcvNzcxNC8xMjc2IDQyOTcvNzcxNS8xMjc2CitmIDQyOTcvNzcxNS8xMjc2IDQxNjUvNzU2NC8xMjc2IDQxMDEvNzU1Ny8xMjc2CitmIDY4NDQvNzcxNi8yMDIyIDY4NDUvNzcxNy8yMDIyIDQxNTkvNzcxOC8yMDIyCitmIDQxNTkvNzQ2OC8yMDIzIDQxNjAvNzQ2Ny8yMDIzIDY4NDYvNzcxOS8yMDIzCitmIDY4NDcvNzcyMC8xOTI2IDY4NDgvNzcyMS8xOTI2IDQxNjIvNzcyMi8xOTI2CitmIDQxNjIvNzQ3MC8xOTI2IDQxNjMvNzQ2OS8xOTI2IDY4NDkvNzcyMy8xOTI2CitmIDY4NTAvNzcyNC8xOTI3IDY4NTEvNzcyNS8xOTI3IDQxNjEvNzcyNi8xOTI3CitmIDQxNjEvNzQ3MS8xOTI3IDQxNjIvNzQ3MC8xOTI3IDY4NTIvNzcyNy8xOTI3CitmIDY4NTMvNzcyOC8xOTI4IDY4NTQvNzcyOS8xOTI4IDQxNjAvNzczMC8xOTI4CitmIDQxNjAvNzQ2Ny8xOTI4IDQxNjEvNzQ3Mi8xOTI4IDY4NTUvNzczMS8xOTI4CitmIDQxNTkvNzQ2OC8xOTk3IDY4NTYvNzczMi8xOTk3IDUwNDYvNzczMy8xOTk3CitmIDUwNDYvNzczMy8xNjUgNTA0Ny83NzM0LzE2NSA0MTU5Lzc0NjgvMTY1CitmIDQyNzAvNzU0OS8xMjc2IDQyNzIvNzU0Mi8xMjc2IDQwOTYvNzU0NC8xMjc2CitmIDQwOTYvNzU0NC8xMjc2IDQxNjQvNzU1MC8xMjc2IDQyNzAvNzU0OS8xMjc2CitmIDQxMjMvNzU1NC8xMjc2IDQxMDEvNzU1Ny8xMjc2IDQxNjUvNzU2NC8xMjc2CitmIDQxNjUvNzU2NC8xMjc2IDQxNjcvNzU2My8xMjc2IDQxMjMvNzU1NC8xMjc2CitmIDQwOTYvNzU0NC8xMjc2IDQxMTAvNzU4MC8xMjc2IDQxNjYvNzUyNC8xMjc2CitmIDQxNjYvNzUyNC8xMjc2IDQxNjQvNzU1MC8xMjc2IDQwOTYvNzU0NC8xMjc2CitmIDQwMTEvNzY1My8yMDE3IDUwNzEvNzczNS8yMDE3IDUwNjkvNzYxMC8yMDE3CitmIDUwNjkvNzYxMC8yMDE3IDQxNDMvNzYwOC8yMDE3IDQwMTEvNzY1My8yMDE3CitmIDQxNTgvNzQ2Mi8xOTk2IDUwNzIvNzczNi8xOTk2IDY4NTcvNzczNy8xOTk2CitmIDY4NTgvNzczOC8xOTY2IDY4NTkvNzczOS8xOTY2IDQxNTgvNzc0MC8xOTY2CitmIDQxODQvNzc0MS82OTcgNDE4OS83NzQyLzY5NyA1MDcwLzc2MTEvNjk3CitmIDUwNzAvNzYxMS82OTcgNTA2OS83NjEwLzY5NyA0MTg0Lzc3NDEvNjk3CitmIDQxNzYvNzc0My8yMjEgNDI4Ny83NzE0LzIyMSA0Mjg2Lzc1NzEvMjIxCitmIDQyODYvNzU3MS8yMjEgNDE3NS83NzQ0LzIyMSA0MTc2Lzc3NDMvMjIxCitmIDQxNzAvNzQ1MS8yMDI0IDQxNjkvNzQ1MC8yMDI0IDQyOTEvNzc0NS8yMDI0CitmIDQyOTEvNzc0NS8xOTcwIDQyOTIvNzU3Ny8xOTcwIDQxNzAvNzQ1MS8xOTcwCitmIDQxNzMvNzQ2Ni8xOTkzIDY4NjAvNzc0Ni8xOTkzIDQyOTcvNzcxNS8xOTkzCitmIDQyOTcvNzcxNS8xOTY1IDQxNzQvNzQ2My8xOTY1IDQxNzMvNzQ2Ni8xOTY1CitmIDQxNzcvNzUwNS82ODcgNDI4OC83NTc2LzY4NyA0Mjg5Lzc1NzQvNjg3CitmIDQyODkvNzU3NC82ODcgNDE3OC83NTA2LzY4NyA0MTc3Lzc1MDUvNjg3CitmIDU4NTkvNzQ0OS8yMDI1IDU4NTYvNzc0Ny8yMDI1IDQxNzUvNzc0OC8yMDI1CitmIDQxNzUvNzc0NC8yMDI2IDQxNjkvNzc0OS8yMDI2IDU4NTkvNzc1MC8yMDI2CitmIDQwNjkvNzUwNC82ODcgNDE3OC83NTA2LzY4NyA0MTcyLzc3NTEvNjg3CitmIDQxNzIvNzc1MS82ODcgNDA4NS83NTEyLzY4NyA0MDY5Lzc1MDQvNjg3CitmIDQxNzAvNzQ1MS8xOTcxIDQxNzcvNzUwNS8xOTcxIDQwNDIvNzQ4Ni8xOTcxCitmIDQwNDIvNzQ4Ni8xOTcyIDQwNjMvNzQ4NS8xOTcyIDQxNzAvNzQ1MS8xOTcyCitmIDQwODUvNzUxMi82ODcgNDE3Mi83NzUxLzY4NyA0MTcxLzc3NTIvNjg3CitmIDQxNzEvNzc1Mi82ODcgNDA3OS83NTIxLzY4NyA0MDg1Lzc1MTIvNjg3CitmIDQxNjgvNzc1My82OTcgNTA1OS83NzU0LzY5NyA1MDU4Lzc3NTUvNjk3CitmIDUwNTgvNzc1NS82OTcgNDE3OS83NzU2LzY5NyA0MTY4Lzc3NTMvNjk3CitmIDUwNTEvNzc1Ny8yMDE3IDU4NzAvNzc1OC8yMDE3IDUwNTkvNzc1NC8yMDE3CitmIDUwNTkvNzc1NC8yMDE3IDY4NjEvNzc1OS8yMDE3IDUwNTEvNzc1Ny8yMDE3CitmIDQxNzQvNzQ2My8xMjc2IDQxNzYvNzc0My8xMjc2IDUwNjYvNzc2MC8xMjc2CitmIDUwNjYvNzc2MC8xMjc2IDUwNDkvNzQ2NC8xMjc2IDQxNzQvNzQ2My8xMjc2CitmIDQxODAvNzQyOC8xOTM2IDQyNjQvNzc2MS8xOTM2IDQyNzEvNzU0My8xOTM2CitmIDQyNzEvNzU0My8xOTM2IDQxODUvNzQyOS8xOTM2IDQxODAvNzQyOC8xOTM2CitmIDQxODMvNzQ3Ni82ODcgNDI2Ny83NzYyLzY4NyA0Mjc0Lzc1NTMvNjg3CitmIDQyNzQvNzU1My82ODcgNDE4OC83NDczLzY4NyA0MTgzLzc0NzYvNjg3CitmIDQxODcvNzQ5NC8xOTgxIDQyNzMvNzU1Mi8xOTgxIDQyNjUvNzU0Ni8xOTgxCitmIDQyNjUvNzU0Ni8xOTgxIDQxODEvNzQ5Mi8xOTgxIDQxODcvNzQ5NC8xOTgxCitmIDQxODIvNzUyMC82ODcgNDI2Ni83NzYzLzY4NyA0MjY3Lzc3NjIvNjg3CitmIDQyNjcvNzc2Mi82ODcgNDE4My83NDc2LzY4NyA0MTgyLzc1MjAvNjg3CitmIDQwMzYvNzQzMC8yMjAgNDE4NS83NDI5LzIyMCA0MTg2Lzc3NjQvMjIwCitmIDQxODYvNzc2NC8yMTkgNDAzOS83NDc3LzIxOSA0MDM2Lzc0MzAvMjE5CitmIDQwNjIvNzQ4My8xOTcwIDQxODEvNzQ5Mi8xOTcwIDQxODAvNzc2NS8xOTcwCitmIDQxODAvNzc2NS8xOTcwIDQwMzcvNzQ4Mi8xOTcwIDQwNjIvNzQ4My8xOTcwCitmIDQxOTAvNzc2Ni8xOTY1IDY4NjIvNzczNy8xOTY1IDUwNzIvNzczNi8xOTY1CitmIDUwNzIvNzczNi8xOTk2IDQxOTEvNzc2Ny8xOTk2IDQxOTAvNzc2Ni8xOTk2CitmIDQwNzAvNzQ3NC82ODcgNDE4OC83NDczLzY4NyA0MTg3Lzc0OTQvNjg3CitmIDQxODcvNzQ5NC82ODcgNDA1MS83NDkzLzY4NyA0MDcwLzc0NzQvNjg3CitmIDQxODQvNzc0MS8yMDE3IDUwNjkvNzYxMC8yMDE3IDUwNzEvNzczNS8yMDE3CitmIDUwNzEvNzczNS8yMDE3IDY4NjMvNzc2OC8yMDE3IDQxODQvNzc0MS8yMDE3CitmIDQxODQvNzc0MS82OTcgNDI2OC83Njk3LzY5NyA0Mjc1Lzc3NjkvNjk3CitmIDQyNzUvNzc2OS82OTcgNDE4OS83NzQyLzY5NyA0MTg0Lzc3NDEvNjk3CitmIDQyMDMvNzc3MC8yMDE3IDQyMDIvNzc3MS8yMDE3IDQxOTIvNzY3OC8yMDE3CitmIDQxOTIvNzY3OC8yMDE4IDY4NjQvNzc3Mi8yMDE4IDQyMDMvNzc3MC8yMDE4CitmIDQyMDQvNzc3My8xOTY2IDY4NjUvNzc3NC8xOTY2IDQxOTMvNzUyNi8xOTY2CitmIDQxOTMvNzUyNi8xOTk2IDQxOTQvNzUyNS8xOTk2IDQyMDQvNzc3My8xOTk2CitmIDQxOTgvNzc3NS8yMDI3IDQxOTcvNzc3Ni8yMDI3IDQyMjkvNzU5Mi8yMDI3CitmIDQyMjkvNzU5Mi8yMDI4IDQxMjMvNzU1NC8yMDI4IDQxOTgvNzc3NS8yMDI4CitmIDQyMTAvNzc3Ny8xOTk2IDQyMDkvNzc3OC8xOTk2IDQxOTkvNzU5Ny8xOTk2CitmIDQxOTkvNzU5Ny8xOTY1IDQyMDAvNzU5Ni8xOTY1IDQyMTAvNzc3Ny8xOTY1CitmIDQyMTEvNzc3OS8yMDE3IDY4NjYvNzc4MC8yMDE3IDY4NjcvNzc4MS8yMDE3CitmIDY4NjgvNzc4Mi8yMDE3IDQyMDEvNzYxOC8yMDE3IDQyMTEvNzc4My8yMDE3CitmIDQxOTgvNzc3NS8yMjEgNDIwOC83Nzg0LzIyMSA0MjA3Lzc3ODUvMjIxCitmIDQyMDcvNzc4NS8yMjAgNDE5Ny83Nzc2LzIyMCA0MTk4Lzc3NzUvMjIwCitmIDQxOTIvNzY3OC82OTcgNDIwMi83NzcxLzY5NyA0MjYwLzc3ODYvNjk3CitmIDQyNjAvNzc4Ni82OTcgNDIxMy83Nzg3LzY5NyA0MTkyLzc2NzgvNjk3CitmIDQxMDkvNzYxMy82OTcgNDE5Mi83Njc4LzY5NyA0MjEzLzc3ODcvNjk3CitmIDQyMTMvNzc4Ny82OTcgNDEzMi83NjE0LzY5NyA0MTA5Lzc2MTMvNjk3CitmIDQyMTEvNzc4My82OTcgNDIwMS83NjE4LzY5NyA0MjE1Lzc2MTcvNjk3CitmIDQyMTUvNzYxNy82OTcgNDIxNC83Nzg4LzY5NyA0MjExLzc3ODMvNjk3CitmIDQyMDgvNzc4NC8yMTkgNDE5OC83Nzc1LzIxOSA0MTk5Lzc1OTcvMjE5CitmIDQxOTkvNzU5Ny8yMjEgNDIwOS83Nzc4LzIyMSA0MjA4Lzc3ODQvMjIxCitmIDQxOTgvNzc3NS8xMjc2IDQxMjMvNzU1NC8xMjc2IDQxNjcvNzU2My8xMjc2CitmIDQxNjcvNzU2My8yMjEgNDE5OS83NTk3LzIyMSA0MTk4Lzc3NzUvMjIxCitmIDQxNjYvNzUyNC8xMjc2IDQxMTAvNzU4MC8xMjc2IDQxOTUvNzc4OS8xMjc2CitmIDQxOTUvNzc4OS8yMjEgNDE5NC83NTI1LzIyMSA0MTY2Lzc1MjQvMjIxCitmIDQxOTQvNzUyNS8yMjEgNDE5NS83Nzg5LzIyMSA0MjA1Lzc3OTAvMjIxCitmIDQyMDUvNzc5MC8yMjEgNDIwNC83NzczLzIyMSA0MTk0Lzc1MjUvMjIxCitmIDQxOTYvNzc5MS8yMjEgNDIwNi83NzkyLzIyMSA0MjA1Lzc3OTAvMjIxCitmIDQyMDUvNzc5MC8yMjEgNDE5NS83Nzg5LzIyMSA0MTk2Lzc3OTEvMjIxCitmIDQyMzUvNzc5My8yMjEgNTA4My83Nzk0LzIyMSA1MDgyLzc3OTUvMjIxCitmIDUwODIvNzc5NS8yMjEgNDIzMy83Nzk2LzIyMSA0MjM1Lzc3OTMvMjIxCitmIDQxMDgvNzUyOS8yMjEgNDIxNi83NTg2LzIyMSA0MjE3Lzc3OTcvMjIxCitmIDQyMTcvNzc5Ny8yMjEgNDExMC83NTgwLzIyMSA0MTA4Lzc1MjkvMjIxCitmIDQxMjEvNzU1NS8xOTM2IDQyMjgvNzU5My8xOTM2IDQyMjAvNzc5OC8xOTM2CitmIDQyMjAvNzc5OC8xOTM2IDQxMTMvNzU4MS8xOTM2IDQxMjEvNzU1NS8xOTM2CitmIDQxMTgvNzUzNy8xOTcwIDQyMjUvNzU5MC8xOTcwIDQyMjQvNzc5OS8xOTcwCitmIDQyMjQvNzc5OS8xOTcwIDQxMTcvNzU4Mi8xOTcwIDQxMTgvNzUzNy8xOTcwCitmIDQxMjUvNzU2Ny82ODcgNDIzMS83NTk5LzY4NyA0MjIzLzc4MDAvNjg3CitmIDQyMjMvNzgwMC82ODcgNDExNi83NTgzLzY4NyA0MTI1Lzc1NjcvNjg3CitmIDQxMTQvNzU1OS8xOTcxIDQyMjEvNzU5NS8xOTcxIDQyMzAvNzU5OC8xOTcxCitmIDQyMzAvNzU5OC8xOTcxIDQxMjQvNzU2Ni8xOTcxIDQxMTQvNzU1OS8xOTcxCitmIDQxMTIvNzUzMy82ODcgNDIxOS83NTg4LzY4NyA0MjE4Lzc1ODkvNjg3CitmIDQyMTgvNzU4OS82ODcgNDExMS83NTM2LzY4NyA0MTEyLzc1MzMvNjg3CitmIDQxMTYvNzU4My82ODcgNDIyMy83ODAwLzY4NyA0MjIyLzc4MDEvNjg3CitmIDQyMjIvNzgwMS82ODcgNDExNS83NTg0LzY4NyA0MTE2Lzc1ODMvNjg3CitmIDQyMzYvNzgwMi8xOTM2IDQyMjQvNzU4NS8xOTM2IDUwODYvNzgwMy8xOTM2CitmIDUwODYvNzgwMy8xOTM2IDUwODQvNzgwNC8xOTM2IDQyMzYvNzgwMi8xOTM2CitmIDQyMjcvNzU4Ny82ODcgNTA4OC83ODA1LzY4NyA1MDgxLzc4MDYvNjg3CitmIDUwODEvNzgwNi82ODcgNDIxOS83NTg4LzY4NyA0MjI3Lzc1ODcvNjg3CitmIDQyMTgvNzU4OS8xOTk0IDUwODAvNzgwNy8xOTk0IDUwODcvNzgwOC8xOTk0CitmIDUwODcvNzgwOC8xOTk0IDQyMjUvNzU5MC8xOTk0IDQyMTgvNzU4OS8xOTk0CitmIDQyMjYvNzU5MS82ODcgNTA3OS83ODA5LzY4NyA1MDg4Lzc4MDUvNjg3CitmIDUwODgvNzgwNS82ODcgNDIyNy83NTg3LzY4NyA0MjI2Lzc1OTEvNjg3CitmIDQyMzkvNzgxMC8yMjEgNTA4NS83ODExLzIyMSA1MDg0Lzc4MDQvMjIxCitmIDUwODQvNzgwNC8yMjEgNDIzNy83ODEyLzIyMSA0MjM5Lzc4MTAvMjIxCitmIDQyMjAvNzU5NC8xOTcwIDUwODYvNzgxMy8xOTcwIDUwODcvNzgwOC8xOTcwCitmIDUwODcvNzgwOC8xOTcwIDQyMjEvNzU5NS8xOTcwIDQyMjAvNzU5NC8xOTcwCitmIDQyMzAvNzU5OC82ODcgNTA4MC83ODA3LzY4NyA1MDgxLzc4MDYvNjg3CitmIDUwODEvNzgwNi82ODcgNDIzMS83NTk5LzY4NyA0MjMwLzc1OTgvNjg3CitmIDQyMzMvNzc5Ni8yMDI5IDUwODIvNzc5NS8yMDI5IDUwODUvNzgxMS8yMDI5CitmIDUwODUvNzgxMS8yMDI5IDQyMzkvNzgxMC8yMDI5IDQyMzMvNzc5Ni8yMDI5CitmIDQxMTAvNzU4MC8yMDI5IDQyMTcvNzc5Ny8yMDI5IDQxOTYvNzc5MS8yMDI5CitmIDQxOTYvNzc5MS8yMDMwIDQxOTUvNzc4OS8yMDMwIDQxMTAvNzU4MC8yMDMwCitmIDQxOTYvNzc5MS8yMjEgNDIzMi83ODE0LzIyMSA0MjYyLzc4MTUvMjIxCitmIDQyNjIvNzgxNS8yMjEgNDIwNi83NzkyLzIyMSA0MTk2Lzc3OTEvMjIxCitmIDQyMDcvNzc4NS8yMjEgNDIzNS83NzkzLzIyMSA0MjMzLzc3OTYvMjIxCitmIDQyMzMvNzc5Ni8yMjEgNDE5Ny83Nzc2LzIyMSA0MjA3Lzc3ODUvMjIxCitmIDQyMzcvNzgxMi8xOTM2IDQyMjAvNzc5OC8xOTM2IDQyMjgvNzU5My8xOTM2CitmIDQyMTYvNzU4Ni8yMjEgNDIzNi83ODAyLzIyMSA0MjM4Lzc4MTYvMjIxCitmIDQyMzgvNzgxNi8yMjEgNDIxNy83Nzk3LzIyMSA0MjE2Lzc1ODYvMjIxCitmIDQyMjkvNzU5Mi8yMjEgNDIzOS83ODEwLzIyMSA0MjM3Lzc4MTIvMjIxCitmIDQyMzcvNzgxMi8yMjEgNDIyOC83NTkzLzIyMSA0MjI5Lzc1OTIvMjIxCitmIDQyMTcvNzc5Ny8yMDI5IDQyMzgvNzgxNi8yMDI5IDQyMzIvNzgxNC8yMDI5CitmIDQyMzIvNzgxNC8yMDI5IDQxOTYvNzc5MS8yMDI5IDQyMTcvNzc5Ny8yMDI5CitmIDQxOTcvNzc3Ni8yMDI5IDQyMzMvNzc5Ni8yMDI5IDQyMzkvNzgxMC8yMDI5CitmIDQyMzkvNzgxMC8yMDI5IDQyMjkvNzU5Mi8yMDI5IDQxOTcvNzc3Ni8yMDI5CitmIDQyNTIvNzgxNy8yMDMxIDQyNDEvNzgxOC8yMDMxIDQyNDAvNzgxOS8yMDMxCitmIDQyNDAvNzgxOS8yMDMyIDQyNTEvNzgyMC8yMDMyIDQyNTIvNzgxNy8yMDMyCitmIDQyNTMvNzgyMS8yMDMzIDQyNDIvNzgyMi8yMDMzIDQyNDEvNzgxOC8yMDMzCitmIDQyNDEvNzgxOC8yMDM0IDQyNTIvNzgxNy8yMDM0IDQyNTMvNzgyMS8yMDM0CitmIDQyNTQvNzgyMy8yMDM1IDQyNDMvNzgyNC8yMDM1IDY4NjkvNzgyNS8yMDM1CitmIDY4NzAvNzgyNi8yMDM2IDY4NzEvNzgyNy8yMDM2IDQyNTQvNzgyOC8yMDM2CitmIDQyMzQvNzgyOS82OTcgNDI0OC83ODMwLzY5NyA0MjQzLzc4MjQvNjk3CitmIDQyNDMvNzgyNC82OTcgNDI1NC83ODIzLzY5NyA0MjM0Lzc4MjkvNjk3CitmIDQyNTYvNzgzMS8yMDM3IDQyNDUvNzgzMi8yMDM3IDQyNDQvNzgzMy8yMDM3CitmIDQyNDQvNzgzMy8yMDM4IDQyNTUvNzgzNC8yMDM4IDQyNTYvNzgzMS8yMDM4CitmIDQyNTcvNzgzNS8yMDM5IDQyNDYvNzgzNi8yMDM5IDY4NzIvNzgzNy8yMDM5CitmIDY4NzMvNzgzOC8yMDQwIDY4NzQvNzgzOS8yMDQwIDQyNTcvNzg0MC8yMDQwCitmIDQyNTgvNzg0MS8yMDQxIDQyNDcvNzg0Mi8yMDQxIDQyNDYvNzgzNi8yMDQxCitmIDQyNDYvNzgzNi8yMDQyIDQyNTcvNzgzNS8yMDQyIDQyNTgvNzg0MS8yMDQyCitmIDQyNDkvNzg0My8yMDQzIDUwODkvNzg0NC8yMDQzIDUwOTAvNzg0NS8yMDQzCitmIDUwOTAvNzg0NS8yMDQzIDQyNjMvNzg0Ni8yMDQzIDQyNDkvNzg0My8yMDQzCitmIDQyNTUvNzgzNC8yMDQzIDQyNDQvNzgzMy8yMDQzIDQyNDkvNzg0My8yMDQzCitmIDQyNDkvNzg0My8yMDQzIDQyNjMvNzg0Ni8yMDQzIDQyNTUvNzgzNC8yMDQzCitmIDQyNjEvNzg0Ny8yMDQ0IDQyNDcvNzg0Mi8yMDQ0IDQyNTgvNzg0MS8yMDQ0CitmIDQyNTgvNzg0MS8yMDQ1IDQyNTkvNzg0OC8yMDQ1IDQyNjEvNzg0Ny8yMDQ1CitmIDQyNTAvNzg0OS8yMDQ2IDQyNTEvNzgyMC8yMDQ2IDQyNDAvNzgxOS8yMDQ2CitmIDQyNDAvNzgxOS8yMDQ3IDQyMTIvNzg1MC8yMDQ3IDQyNTAvNzg0OS8yMDQ3CitmIDQyMDIvNzc3MS8yMDQ4IDQyMDMvNzc3MC8yMDQ4IDY4NzUvNzg1MS8yMDQ4CitmIDY4NzYvNzg1Mi8yMDQ5IDY4NzcvNzg1My8yMDQ5IDQyMDIvNzg1NC8yMDQ5CitmIDY4NzgvNzg1NS8yMDUwIDY4NzkvNzg1Ni8yMDUwIDQyNTIvNzg1Ny8yMDUwCitmIDQyNTIvNzg1OC8yMDUxIDQyNTEvNzg1OS8yMDUxIDY4ODAvNzg2MC8yMDUxCitmIDY4ODEvNzg2MS8yMDUyIDY4ODIvNzg2Mi8yMDUyIDQyNTMvNzg2Mi8yMDUyCitmIDQyNTMvNzg2My8yMDUzIDQyNTIvNzg2NC8yMDUzIDY4ODMvNzg2NC8yMDUzCitmIDY4ODQvNzg2NS8yMDU0IDY4ODUvNzg2Ni8yMDU0IDY4ODYvNzg2Ny8yMDU0CitmIDY4ODcvNzg2OC8yMDU1IDY4ODgvNzg2OS8yMDU1IDY4ODkvNzg2OS8yMDU1CitmIDQyMDYvNzc5Mi8yMDU2IDQyNjIvNzgxNS8yMDU2IDY4OTAvNzg3MC8yMDU2CitmIDY4OTEvNzg3MS8yMDU3IDY4OTIvNzg3Mi8yMDU3IDQyMDYvNzg3My8yMDU3CitmIDQyMDcvNzc4NS8yMDU4IDQyMDgvNzc4NC8yMDU4IDY4OTMvNzg3NC8yMDU4CitmIDY4OTQvNzg3NS8yMDU5IDY4OTUvNzg3Ni8yMDU5IDQyMDcvNzg3Ny8yMDU5CitmIDQyMDgvNzc4NC8yMDYwIDQyMDkvNzc3OC8yMDYwIDY4OTYvNzg3OC8yMDYwCitmIDY4OTcvNzg3OS8yMDYxIDY4OTgvNzg4MC8yMDYxIDQyMDgvNzg4MS8yMDYxCitmIDQyMDkvNzc3OC8yMDYyIDQyMTAvNzc3Ny8yMDYyIDY4OTkvNzc3Ny8yMDYyCitmIDY5MDAvNzg4Mi8yMDYzIDY5MDEvNzg4My8yMDYzIDQyMDkvNzg4NC8yMDYzCitmIDY5MDIvNzg4NS8yMDY0IDQyMTEvNzg4Ni8yMDY0IDY5MDMvNzg4Ni8yMDY0CitmIDY5MDQvNzg4Ny8yMDY1IDY5MDUvNzg4OC8yMDY1IDY5MDYvNzg4OS8yMDY1CitmIDQyNjAvNzc4Ni8yMDY2IDQyMDIvNzc3MS8yMDY2IDY5MDcvNzg5MC8yMDY2CitmIDY5MDgvNzg5MS8yMDY3IDY5MDkvNzg5Mi8yMDY3IDQyNjAvNzg5My8yMDY3CitmIDQyMTEvNzc4My8yMDY4IDQyMTQvNzc4OC8yMDY4IDY5MTAvNzg5NC8yMDY4CitmIDY5MTEvNzg5NS8yMDY5IDY5MTIvNzg5Ni8yMDY5IDQyMTEvNzg5Ny8yMDY5CitmIDUwODMvNzg5OC8yMDcwIDY5MTMvNzg5OS8yMDcwIDY5MTQvNzkwMC8yMDcwCitmIDY5MTUvNzg3MC8yMDcxIDQyNjIvNzgxNS8yMDcxIDUwODMvNzc5NC8yMDcxCitmIDQyMzUvNzc5My8yMDcyIDQyMDcvNzc4NS8yMDcyIDY5MTYvNzkwMS8yMDcyCitmIDY5MTcvNzkwMi8yMDczIDY5MTgvNzkwMy8yMDczIDQyMzUvNzkwNC8yMDczCitmIDQwODEvNzUyMy82ODcgMzk2Ny83MzY2LzY4NyAzOTY2LzczNjcvNjg3CitmIDM5NjYvNzM2Ny82ODcgNDA2NC83NTAwLzY4NyA0MDgxLzc1MjMvNjg3CitmIDQwNDMvNzQ5OC8xNzg3IDM5NjEvNzM2OC8xNzg3IDM5NjMvNzM2OS8xNzg3CitmIDM5NjMvNzM2OS8xNzg3IDQwNjEvNzQ1Ni8xNzg3IDQwNDMvNzQ5OC8xNzg3CitmIDQwNjEvNzQ1Ni8xNzgzIDM5NjMvNzM2OS8xNzgzIDM5NTcvNzM3MC8xNzgzCitmIDM5NTcvNzM3MC8xNzgzIDQwMjUvNzQzOS8xNzgzIDQwNjEvNzQ1Ni8xNzgzCitmIDQwMjUvNzkwNS8xNzg1IDM5NTcvNzM3Mi8xNzg1IDM5NTQvNzM3MS8xNzg1CitmIDM5NTQvNzM3MS8xNzg1IDQwMDcvNzQwNy8xNzg1IDQwMjUvNzkwNS8xNzg1CitmIDQwMDcvNzQwNy8xMDQ0IDM5NTQvNzM3MS8xMDQ0IDM5NTkvNzM3My8xMDQ0CitmIDM5NTkvNzM3My8xMDQ0IDQwMzUvNzQwNC8xMDQ0IDQwMDcvNzQwNy8xMDQ0CitmIDQwMzUvNzQwNC8xMDQ0IDM5NTkvNzM3My8xMDQ0IDM5ODIvNzM3NC8xMDQ0CitmIDM5ODIvNzM3NC8xMDQ0IDQxNjMvNzQ2OS8xMDQ0IDQwMzUvNzQwNC8xMDQ0CitmIDQxNjMvNzQ2OS8xMDQ0IDM5ODIvNzM3NC8xMDQ0IDM5NzMvNzM3NS8xMDQ0CitmIDM5NzMvNzM3NS8xMDQ0IDY5MTkvNzcyMy8xMDQ0IDQxNjMvNzQ2OS8xMDQ0CitmIDY5MjAvNzkwNi8xOTE2IDM5NzMvNzkwNy8xOTE2IDY5MjEvNzkwOC8xOTE2CitmIDY5MjIvNzkwOS8xOTE3IDY5MjMvNzkxMC8xOTE3IDY5MjQvNzkxMS8xOTE3CitmIDQxMzkvNzYzMy82OTcgNDE0Ny83NjMyLzY5NyAzOTgxLzczMzUvNjk3CitmIDM5ODEvNzMzNS82OTcgMzk3OC83MzM2LzY5NyA0MTM5Lzc2MzMvNjk3CitmIDQxMjYvNzYwMy82OTcgMzk3OS83MzM3LzY5NyAzOTgwLzczMzgvNjk3CitmIDM5ODAvNzMzOC82OTcgNDA4OC83NjAwLzY5NyA0MTI2Lzc2MDMvNjk3CitmIDY5MjUvNzkxMi8xOTE4IDY5MjYvNzkxMy8xOTE4IDM5NTYvNzkxNC8xOTE4CitmIDM5NTYvNzkxNS8xOTE5IDY5MjcvNzkxNi8xOTE5IDY5MjgvNzkxNy8xOTE5CitmIDY5MjkvNzkxOC8xMDQzIDM5NTYvNzM0NC8xMDQzIDM5ODMvNzM0Ni8xMDQzCitmIDM5ODMvNzM0Ni8xMDQzIDQxNTQvNzQ1OC8xMDQzIDY5MzAvNzkxOC8xMDQzCitmIDQxNTQvNzQ1OC8xMDQzIDM5ODMvNzM0Ni8xMDQzIDM5NjAvNzM0MC8xMDQzCitmIDM5NjAvNzM0MC8xMDQzIDQwMjYvNzM4OS8xMDQzIDQxNTQvNzQ1OC8xMDQzCitmIDQwMjYvNzM4OS8xMDQzIDM5NjAvNzM0MC8xMDQzIDM5NTUvNzMzOS8xMDQzCitmIDM5NTUvNzMzOS8xMDQzIDM5OTgvNzM5MC8xMDQzIDQwMjYvNzM4OS8xMDQzCitmIDQwMTYvNzkxOS8yMDc0IDM5OTgvNzM5MC8yMDc0IDM5NTUvNzMzOS8yMDc0CitmIDM5NTUvNzMzOS8xNzgyIDM5NTgvNzM0Ny8xNzgyIDQwMTYvNzkxOS8xNzgyCitmIDQwNTIvNzQ0My8xNzg2IDQwMTYvNzQ0Mi8xNzg2IDM5NTgvNzM0OS8xNzg2CitmIDM5NTgvNzM0OS8xNzg2IDM5NjQvNzM0OC8xNzg2IDQwNTIvNzQ0My8xNzg2CitmIDQwNDAvNzQ4Ny8xNzg0IDQwNTIvNzQ0My8xNzg0IDM5NjQvNzM0OC8xNzg0CitmIDM5NjQvNzM0OC8xNzg0IDM5NjIvNzM1MC8xNzg0IDQwNDAvNzQ4Ny8xNzg0CitmIDQwNzUvNzUxMS82ODcgNDA0MC83NDg3LzY4NyAzOTYyLzczNTAvNjg3CitmIDM5NjIvNzM1MC82ODcgMzk2NS83MzUxLzY4NyA0MDc1Lzc1MTEvNjg3CitmIDQwNzUvNzUxMS82ODcgMzk2NS83MzUxLzY4NyAzOTcyLzczNTIvNjg3CitmIDM5NzIvNzM1Mi82ODcgNDA3Ni83NTE3LzY4NyA0MDc1Lzc1MTEvNjg3CitmIDQwNzYvNzUxNy82ODcgMzk3Mi83MzUyLzY4NyAzOTcxLzczNTMvNjg3CitmIDM5NzEvNzM1My82ODcgNDA3Ny83NTE4LzY4NyA0MDc2Lzc1MTcvNjg3CitmIDQwNzcvNzUxOC82ODcgMzk3MS83MzUzLzY4NyAzOTcwLzczNTQvNjg3CitmIDM5NzAvNzM1NC82ODcgNDA3OC83NTE5LzY4NyA0MDc3Lzc1MTgvNjg3CitmIDQwODEvNzUyMy82ODcgNDA4MC83NTIyLzY4NyAzOTY4LzczNjQvNjg3CitmIDM5NjgvNzM2NC82ODcgMzk2Ny83MzY2LzY4NyA0MDgxLzc1MjMvNjg3CitmIDQwNzgvNzUxOS82ODcgMzk3MC83MzU0LzY4NyAzOTg1LzczNTUvNjg3CitmIDM5ODUvNzM1NS82ODcgNDE4Mi83NTIwLzY4NyA0MDc4Lzc1MTkvNjg3CitmIDQxODYvNzc2NC8yMjEgNDE4NS83NDI5LzIyMSA0MjcxLzc1NDMvMjIxCitmIDQyNzEvNzU0My8yMjEgNDI3Mi83NTQyLzIyMSA0MTg2Lzc3NjQvMjIxCitmIDQxODAvNzc2NS8xOTcwIDQxODEvNzQ5Mi8xOTcwIDQyNjUvNzU0Ni8xOTcwCitmIDQyNjUvNzU0Ni8xOTcwIDQyNjQvNzU0NS8xOTcwIDQxODAvNzc2NS8xOTcwCitmIDQxOTAvNzc2Ni8xOTk3IDQxOTEvNzc2Ny8xOTk3IDQyNzAvNzU0OS8xOTk3CitmIDQyNzAvNzU0OS8xOTY1IDQyNjkvNzU0OC8xOTY1IDQxOTAvNzc2Ni8xOTY1CitmIDQxODcvNzQ5NC82ODcgNDE4OC83NDczLzY4NyA0Mjc0Lzc1NTMvNjg3CitmIDQyNzQvNzU1My82ODcgNDI3My83NTUyLzY4NyA0MTg3Lzc0OTQvNjg3CitmIDQxODQvNzkyMC8yMDE3IDY5MzEvNzkyMS8yMDE3IDY5MzIvNzkyMi8yMDE3CitmIDY5MzMvNzkyMy8yMDE5IDQyNjgvNzY5Ny8yMDE5IDQxODQvNzc0MS8yMDE5CitmIDQxOTEvNzc2Ny8xMjc2IDQxODYvNzc2NC8xMjc2IDQyNzIvNzU0Mi8xMjc2CitmIDQyNzIvNzU0Mi8xMjc2IDQyNzAvNzU0OS8xMjc2IDQxOTEvNzc2Ny8xMjc2CitmIDQwOTAvNzUzMS8xOTM2IDQwOTQvNzUzMC8xOTM2IDQyNzEvNzU0My8xOTM2CitmIDQyNzEvNzU0My8xOTM2IDQyNjQvNzc2MS8xOTM2IDQwOTAvNzUzMS8xOTM2CitmIDQwOTMvNzUzNS82ODcgNDA5OC83NTM0LzY4NyA0Mjc0Lzc1NTMvNjg3CitmIDQyNzQvNzU1My82ODcgNDI2Ny83NzYyLzY4NyA0MDkzLzc1MzUvNjg3CitmIDQwOTcvNzUzOS8xOTgxIDQwOTEvNzUzOC8xOTgxIDQyNjUvNzU0Ni8xOTgxCitmIDQyNjUvNzU0Ni8xOTgxIDQyNzMvNzU1Mi8xOTgxIDQwOTcvNzUzOS8xOTgxCitmIDQwOTIvNzU0MS82ODcgNDA5My83NTM1LzY4NyA0MjY3Lzc3NjIvNjg3CitmIDQyNjcvNzc2Mi82ODcgNDI2Ni83NzYzLzY4NyA0MDkyLzc1NDEvNjg3CitmIDQxNTAvNzYxMi82OTcgNDEzMS83NjE1LzY5NyA0Mjc1Lzc3NjkvNjk3CitmIDQyNzUvNzc2OS82OTcgNDI2OC83Njk3LzY5NyA0MTUwLzc2MTIvNjk3CitmIDQxODIvNzUyMC82ODcgMzk4NS83MzU1LzY4NyAzOTg0LzczNTcvNjg3CitmIDM5ODQvNzM1Ny82ODcgNDI2Ni83NzYzLzY4NyA0MTgyLzc1MjAvNjg3CitmIDQyNjYvNzc2My82ODcgMzk4NC83MzU3LzY4NyAzOTc1LzczNTYvNjg3CitmIDM5NzUvNzM1Ni82ODcgNDA5Mi83NTQxLzY4NyA0MjY2Lzc3NjMvNjg3CitmIDQwOTIvNzU0MS82ODcgMzk3NS83MzU2LzY4NyAzOTc2LzczNTkvNjg3CitmIDM5NzYvNzM1OS82ODcgNDExOS83NTQwLzY4NyA0MDkyLzc1NDEvNjg3CitmIDQxMTUvNzU4NC82ODcgNDIyMi83ODAxLzY4NyAzOTc3LzczNjEvNjg3CitmIDQxMTUvNzU4NC82ODcgMzk3Ny83MzYxLzY4NyAzOTc0LzczNjAvNjg3CitmIDM5NzQvNzM2MC82ODcgNDEwNi83NTc5LzY4NyA0MTE1Lzc1ODQvNjg3CitmIDQwNzkvNzUyMS82ODcgMzk2OS83MzY1LzY4NyAzOTY4LzczNjQvNjg3CitmIDM5NjgvNzM2NC82ODcgNDA4MC83NTIyLzY4NyA0MDc5Lzc1MjEvNjg3CitmIDQxNzEvNzc1Mi82ODcgMzk5Ni83Mzg3LzY4NyAzOTY5LzczNjUvNjg3CitmIDM5NjkvNzM2NS82ODcgNDA3OS83NTIxLzY4NyA0MTcxLzc3NTIvNjg3CitmIDQyOTMvNzU3OC82ODcgNDI4MC83MzYzLzY4NyAzOTk2LzczODcvNjg3CitmIDM5OTYvNzM4Ny82ODcgNDE3MS83NzUyLzY4NyA0MjkzLzc1NzgvNjg3CitmIDM5ODYvNzM4NC82ODcgMzk5Mi83MzgzLzY4NyA0Mjc2LzcwODcvNjg3CitmIDQyNzYvNzA4Ny82ODcgNDcyOS83MDg2LzY4NyAzOTg2LzczODQvNjg3CitmIDM5OTIvNzM4My82ODcgMzk5My83Mzg1LzY4NyA0Mjc3LzcwODgvNjg3CitmIDQyNzcvNzA4OC82ODcgNDI3Ni83MDg3LzY4NyAzOTkyLzczODMvNjg3CitmIDM5OTMvNzM4NS82ODcgMzk5NC83Mzg2LzY4NyA0Mjc4LzcwOTAvNjg3CitmIDQyNzgvNzA5MC82ODcgNDI3Ny83MDg4LzY4NyAzOTkzLzczODUvNjg3CitmIDM5OTQvNzM4Ni82ODcgMzk5NS81MTczLzY4NyA0Mjc5LzcwOTIvNjg3CitmIDQyNzkvNzA5Mi82ODcgNDI3OC83MDkwLzY4NyAzOTk0LzczODYvNjg3CitmIDM5ODcvNzA3OS82ODcgMzk5Ni83Mzg3LzY4NyA0MjgwLzczNjMvNjg3CitmIDQyODAvNzM2My82ODcgNDI4MS83MzYyLzY4NyAzOTg3LzcwNzkvNjg3CitmIDM4NzEvNzE5NS82ODcgMzg3Mi83MDkzLzY4NyA0Mjc5LzcwOTIvNjg3CitmIDQyNzkvNzA5Mi82ODcgNDI4NS83Mzc5LzY4NyAzODcxLzcxOTUvNjg3CitmIDI5NjEvNjk4Mi82ODcgMzg2OC83MTk4LzY4NyA0MjgyLzczODAvNjg3CitmIDQyODIvNzM4MC82ODcgNDI4MS83MzYyLzY4NyAyOTYxLzY5ODIvNjg3CitmIDM4NjgvNzE5OC82ODcgMzg2OS83MTk3LzY4NyA0MjgzLzczODEvNjg3CitmIDQyODMvNzM4MS82ODcgNDI4Mi83MzgwLzY4NyAzODY4LzcxOTgvNjg3CitmIDM4NjkvNzE5Ny82ODcgMzg3MC83MTk2LzY4NyA0Mjg0LzczODIvNjg3CitmIDQyODQvNzM4Mi82ODcgNDI4My83MzgxLzY4NyAzODY5LzcxOTcvNjg3CitmIDM4NzAvNzE5Ni82ODcgMzg3MS83MTk1LzY4NyA0Mjg1LzczNzkvNjg3CitmIDQyODUvNzM3OS82ODcgNDI4NC83MzgyLzY4NyAzODcwLzcxOTYvNjg3CitmIDQxNjkvNzc0OS8xOTM2IDQxNzUvNzc0NC8xOTM2IDQyODYvNzU3MS8xOTM2CitmIDQyODYvNzU3MS8xOTM2IDQyOTEvNzU3MC8xOTM2IDQxNjkvNzc0OS8xOTM2CitmIDQxNzIvNzc1MS82ODcgNDE3OC83NTA2LzY4NyA0Mjg5Lzc1NzQvNjg3CitmIDQyODkvNzU3NC82ODcgNDI5NC83NTczLzY4NyA0MTcyLzc3NTEvNjg3CitmIDQxNzcvNzUwNS8xOTcxIDQxNzAvNzQ1MS8xOTcxIDQyOTIvNzU3Ny8xOTcxCitmIDQyOTIvNzU3Ny8xOTcxIDQyODgvNzU3Ni8xOTcxIDQxNzcvNzUwNS8xOTcxCitmIDQxNzEvNzc1Mi82ODcgNDE3Mi83NzUxLzY4NyA0Mjk0Lzc1NzMvNjg3CitmIDQyOTQvNzU3My82ODcgNDI5My83NTc4LzY4NyA0MTcxLzc3NTIvNjg3CitmIDQxNjgvNzc1My82OTcgNDE3OS83NzU2LzY5NyA0Mjk1Lzc2MjMvNjk3CitmIDQyOTUvNzYyMy82OTcgNDI5MC83NjIyLzY5NyA0MTY4Lzc3NTMvNjk3CitmIDY5MzQvNzkyNC8yMDE3IDQxNjgvNzc1My8yMDE3IDQyOTAvNzYyMi8yMDE3CitmIDQyOTAvNzY3Ni8yMDE2IDQyOTYvNzY3NS8yMDE2IDY5MzUvNzkyNS8yMDE2CitmIDQxNzYvNzc0My8xMjc2IDQxNzQvNzQ2My8xMjc2IDQyOTcvNzcxNS8xMjc2CitmIDQyOTcvNzcxNS8xMjc2IDQyODcvNzcxNC8xMjc2IDQxNzYvNzc0My8xMjc2CitmIDQxMDEvNzU1Ny8yMjAgNDA5OS83NTU2LzIyMCA0Mjg2Lzc1NzEvMjIwCitmIDQyODYvNzU3MS8yMTkgNDI4Ny83NzE0LzIxOSA0MTAxLzc1NTcvMjE5CitmIDQxMDQvNzU2MS8xOTcwIDQxMDUvNzU2MC8xOTcwIDQyOTIvNzU3Ny8xOTcwCitmIDQyOTIvNzU3Ny8yMDI0IDQyOTEvNzc0NS8yMDI0IDQxMDQvNzU2MS8yMDI0CitmIDQxNTEvNzU2NS8xOTk1IDQxNjUvNzU2NC8xOTk1IDQyOTcvNzcxNS8xOTk1CitmIDQyOTcvNzcxNS8xOTkzIDY5MzYvNzc0Ni8xOTkzIDQxNTEvNzU2NS8xOTkzCitmIDQxMDIvNzU2OS82ODcgNDEwMy83NTY4LzY4NyA0Mjg5Lzc1NzQvNjg3CitmIDQyODkvNzU3NC82ODcgNDI4OC83NTc2LzY4NyA0MTAyLzc1NjkvNjg3CitmIDQxMDYvNzU3OS82ODcgMzk3NC83MzYwLzY4NyA0MjgwLzczNjMvNjg3CitmIDQyODAvNzM2My82ODcgNDI5My83NTc4LzY4NyA0MTA2Lzc1NzkvNjg3CitmIDQzMTUvNzkyNi8yMDc1IDQzMTQvNzkyNy8yMDc1IDQzMDAvNzkyOC8yMDc1CitmIDQzMDAvNzkyOC8yMDc1IDQzMDEvNzkyOS8yMDc1IDQzMTUvNzkyNi8yMDc1CitmIDQzMTYvNzkzMC8yMDc2IDQzMTUvNzkyNi8yMDc2IDQzMDEvNzkyOS8yMDc2CitmIDQzMDEvNzkyOS8yMDc2IDQzMDIvNzkzMS8yMDc2IDQzMTYvNzkzMC8yMDc2CitmIDQzMTQvNzkzMi8yMDc3IDQzMTMvNzkzMy8yMDc3IDQyOTkvNzkzNC8yMDc3CitmIDQyOTkvNzkzNC8yMDc3IDQzMDAvNzkzNS8yMDc3IDQzMTQvNzkzMi8yMDc3CitmIDQzMTMvNzkzMy8yMDc4IDQzMTIvNzkzNi8yMDc4IDQyOTgvNzkzNy8yMDc4CitmIDQyOTgvNzkzNy8yMDc5IDQyOTkvNzkzNC8yMDc5IDQzMTMvNzkzMy8yMDc5CitmIDQ0MzAvNzkzOC8xMTcyIDQ0MjgvNzkzOS8xMTcyIDQzMjEvNzk0MC8xMTcyCitmIDQzMjEvNzk0MC8xMTcyIDQzMjMvNzk0MS8xMTcyIDQ0MzAvNzkzOC8xMTcyCitmIDQzMDcvNzk0Mi8yMDgwIDQzMDgvNzk0My8yMDgwIDQzMDEvNzk0NC8yMDgwCitmIDQzMDEvNzk0NC8yMDgxIDQzMDAvNzk0NS8yMDgxIDQzMDcvNzk0Mi8yMDgxCitmIDQzMDgvNzk0My8yMDgyIDQzMDkvNzk0Ni8yMDgyIDQzMDIvNzk0Ny8yMDgyCitmIDQzMDIvNzk0Ny8yMDgzIDQzMDEvNzk0NC8yMDgzIDQzMDgvNzk0My8yMDgzCitmIDQzMTAvNzk0OC8yMDg0IDQzMTEvNzk0OS8yMDg0IDQyOTkvNzk1MC8yMDg0CitmIDQyOTkvNzk1MC8yMDg1IDQyOTgvNzk1MS8yMDg1IDQzMTAvNzk0OC8yMDg1CitmIDQzMTEvNzk0OS8yMDg2IDQzMDcvNzk0Mi8yMDg2IDQzMDAvNzk0NS8yMDg2CitmIDQzMDAvNzk0NS8yMDg3IDQyOTkvNzk1MC8yMDg3IDQzMTEvNzk0OS8yMDg3CitmIDQzMDcvNzk0Mi8yMDg4IDQzMzEvNzk1Mi8yMDg4IDQzMzIvNzk1My8yMDg4CitmIDQzMzIvNzk1My8yMDg5IDQzMDgvNzk0My8yMDg5IDQzMDcvNzk0Mi8yMDg5CitmIDQzMDkvNzk0Ni8yMDkwIDQzMDgvNzk0My8yMDkwIDQzMzIvNzk1My8yMDkwCitmIDQzMzIvNzk1My8yMDkxIDQzMzMvNzk1NC8yMDkxIDQzMDkvNzk0Ni8yMDkxCitmIDQ0MzcvNzk1NS8yMDkyIDQ0MzgvNzk1Ni8yMDkyIDQzMzcvNzk1Ny8yMDkyCitmIDQzMzcvNzk1Ny8yMDkyIDQzMjIvNzk1OC8yMDkyIDQ0MzcvNzk1NS8yMDkyCitmIDQzMTAvNzk0OC8yMDkzIDQzMzQvNzk1OS8yMDkzIDQzMzUvNzk2MC8yMDkzCitmIDQzMzUvNzk2MC8yMDk0IDQzMTEvNzk0OS8yMDk0IDQzMTAvNzk0OC8yMDk0CitmIDQzMTEvNzk0OS8yMDk1IDQzMzUvNzk2MC8yMDk1IDQzMzEvNzk1Mi8yMDk1CitmIDQzMzEvNzk1Mi8yMDk2IDQzMDcvNzk0Mi8yMDk2IDQzMTEvNzk0OS8yMDk2CitmIDQ0NzgvNzk2MS8yMDc1IDQ0NzcvNzk2Mi8yMDc1IDQzMTQvNzkyNy8yMDc1CitmIDQzMTQvNzkyNy8yMDc1IDQzMTUvNzkyNi8yMDc1IDQ0NzgvNzk2MS8yMDc1CitmIDQ0NzkvNzk2My8yMDc2IDQ0NzgvNzk2MS8yMDc2IDQzMTUvNzkyNi8yMDc2CitmIDQzMTUvNzkyNi8yMDc2IDQzMTYvNzkzMC8yMDc2IDQ0NzkvNzk2My8yMDc2CitmIDQ0NzcvNzk2NC8yMDc3IDQ0NzYvNzk2NS8yMDc3IDQzMTMvNzkzMy8yMDc3CitmIDQzMTMvNzkzMy8yMDc3IDQzMTQvNzkzMi8yMDc3IDQ0NzcvNzk2NC8yMDc3CitmIDQ0NzYvNzk2NS8yMDc5IDQ0NzUvNzk2Ni8yMDc5IDQzMTIvNzkzNi8yMDc5CitmIDQzMTIvNzkzNi8yMDc5IDQzMTMvNzkzMy8yMDc5IDQ0NzYvNzk2NS8yMDc5CitmIDQ0NzQvNzk2Ny8xMjc3IDQ0ODUvNzk2OC8xMjc3IDQ0ODEvNzk2OS8xMjc3CitmIDQ0ODEvNzk2OS8yMDk3IDQzNTUvNzk3MC8yMDk3IDQ0NzQvNzk2Ny8yMDk3CitmIDQzMTYvNzkzMC8xMDQzIDQzMDIvNzkzMS8xMDQzIDQzMTcvNzk3MS8xMDQzCitmIDQzMTcvNzk3MS8yMDk4IDQzMjAvNzk3Mi8yMDk4IDQzMTYvNzkzMC8yMDk4CitmIDQzMTcvNzk3MS8xNzgyIDQzMDIvNzkzMS8xNzgyIDQzMDkvNzk3My8xNzgyCitmIDQzMDkvNzk3My8xNzgyIDQzMTkvNzk3NC8xNzgyIDQzMTcvNzk3MS8xNzgyCitmIDQzMTkvNzk3NS8xNzg2IDQzMDkvNzk0Ni8xNzg2IDQzMzMvNzk1NC8xNzg2CitmIDQzMzMvNzk1NC8xNzg2IDQzMzYvNzk3Ni8xNzg2IDQzMTkvNzk3NS8xNzg2CitmIDQzMDYvNzk3Ny8xMDQzIDQ0NzkvNzk2My8xMDQzIDQ0ODAvNzk3OC8xMDQzCitmIDQ0ODAvNzk3OC8xMDQzIDQzMTgvNzk3OS8xMDQzIDQzMDYvNzk3Ny8xMDQzCitmIDQyOTgvNzkzNy8xMTcyIDQzMTIvNzkzNi8xMTcyIDQzMjMvNzk0MS8xMTcyCitmIDQzMjMvNzk0MS8xMTcyIDQzMjEvNzk0MC8xMTcyIDQyOTgvNzkzNy8xMTcyCitmIDQzMTAvNzk0OC8yMDk5IDQyOTgvNzk1MS8yMDk5IDQzMjEvNzk4MC8yMDk5CitmIDQzMjEvNzk4MC8yMDk5IDQzMjIvNzk1OC8yMDk5IDQzMTAvNzk0OC8yMDk5CitmIDQzMTIvNzkzNi8xMTcyIDQ0NzUvNzk2Ni8xMTcyIDQ0ODEvNzk2OS8xMTcyCitmIDQ0ODEvNzk2OS8xMTcyIDQzMjMvNzk0MS8xMTcyIDQzMTIvNzkzNi8xMTcyCitmIDQzMjUvNzk4MS8yMTAwIDQzMzQvNzk1OS8yMTAwIDQzMzcvNzk1Ny8yMTAwCitmIDQzMzcvNzk1Ny8yMTAwIDQzMjcvNzk4Mi8yMTAwIDQzMjUvNzk4MS8yMTAwCitmIDQzMjQvNzk4My8yMTAxIDQzMjgvNzk4NC8yMTAxIDQzMzIvNzk1My8yMTAxCitmIDQzMzIvNzk1My8yMTAyIDQzMzEvNzk1Mi8yMTAyIDQzMjQvNzk4My8yMTAyCitmIDQzMjgvNzk4NC8yMTAzIDQzMjkvNzk4NS8yMTAzIDQzMzMvNzk1NC8yMTAzCitmIDQzMzMvNzk1NC8yMTA0IDQzMzIvNzk1My8yMTA0IDQzMjgvNzk4NC8yMTA0CitmIDQzMzQvNzk1OS8yMTA1IDQzMjUvNzk4MS8yMTA1IDQzMjYvNzk4Ni8yMTA1CitmIDQzMjYvNzk4Ni8yMTA2IDQzMzUvNzk2MC8yMTA2IDQzMzQvNzk1OS8yMTA2CitmIDQzMjYvNzk4Ni8yMTA3IDQzMjQvNzk4My8yMTA3IDQzMzEvNzk1Mi8yMTA3CitmIDQzMzEvNzk1Mi8yMTA4IDQzMzUvNzk2MC8yMTA4IDQzMjYvNzk4Ni8yMTA4CitmIDQzMjkvNzk4NS8xNzg0IDQzMzAvNzk4Ny8xNzg0IDQzMzYvNzk3Ni8xNzg0CitmIDQzMzYvNzk3Ni8xNzg0IDQzMzMvNzk1NC8xNzg0IDQzMjkvNzk4NS8xNzg0CitmIDQzMzQvNzk1OS8yMDkyIDQzMTAvNzk0OC8yMDkyIDQzMjIvNzk1OC8yMDkyCitmIDQzMjIvNzk1OC8yMDkyIDQzMzcvNzk1Ny8yMDkyIDQzMzQvNzk1OS8yMDkyCitmIDQzMzAvNzk4Ny82ODcgNDMyOS83OTg1LzY4NyA0MzM5Lzc5ODgvNjg3CitmIDQzMzkvNzk4OC82ODcgNDMzOC83OTg5LzY4NyA0MzMwLzc5ODcvNjg3CitmIDQzMjkvNzk4NS82ODcgNDMyOC83OTg0LzY4NyA0MzQwLzc5OTAvNjg3CitmIDQzNDAvNzk5MC82ODcgNDMzOS83OTg4LzY4NyA0MzI5Lzc5ODUvNjg3CitmIDQzMjgvNzk4NC82ODcgNDMyNC83OTgzLzY4NyA0MzQxLzc5OTEvNjg3CitmIDQzNDEvNzk5MS82ODcgNDM0MC83OTkwLzY4NyA0MzI4Lzc5ODQvNjg3CitmIDQzMjQvNzk4My82ODcgNDMyNi83OTg2LzY4NyA0MzQyLzc5OTIvNjg3CitmIDQzNDIvNzk5Mi82ODcgNDM0MS83OTkxLzY4NyA0MzI0Lzc5ODMvNjg3CitmIDQzMjYvNzk4Ni82ODcgNDMyNS83OTgxLzY4NyA0MzQzLzc5OTMvNjg3CitmIDQzNDMvNzk5My82ODcgNDM0Mi83OTkyLzY4NyA0MzI2Lzc5ODYvNjg3CitmIDQzMjUvNzk4MS82ODcgNDMyNy83OTgyLzY4NyA0MzQ0Lzc5OTQvNjg3CitmIDQzNDQvNzk5NC82ODcgNDM0My83OTkzLzY4NyA0MzI1Lzc5ODEvNjg3CitmIDQ0MzEvNzk5NS82ODcgNDQzMi83OTk2LzY4NyA0MzQ0Lzc5OTQvNjg3CitmIDQzNDQvNzk5NC82ODcgNDMyNy83OTgyLzY4NyA0NDMxLzc5OTUvNjg3CitmIDQzMzkvNzk4OC82ODcgNDM0OC83OTk3LzY4NyA0MzQ1Lzc5OTgvNjg3CitmIDQzNDUvNzk5OC82ODcgNDMzOC83OTg5LzY4NyA0MzM5Lzc5ODgvNjg3CitmIDQzNDgvNzk5Ny82ODcgNDM0OS83OTk5LzY4NyA0MzQ2LzgwMDAvNjg3CitmIDQzNDYvODAwMC82ODcgNDM0NS83OTk4LzY4NyA0MzQ4Lzc5OTcvNjg3CitmIDQzNDkvNzk5OS82ODcgNDM1MC84MDAxLzY4NyA0MzQ3LzgwMDIvNjg3CitmIDQzNDcvODAwMi82ODcgNDM0Ni84MDAwLzY4NyA0MzQ5Lzc5OTkvNjg3CitmIDQzNTAvODAwMS82ODcgNDQzNC84MDAzLzY4NyA0NDMzLzgwMDQvNjg3CitmIDQ0MzMvODAwNC82ODcgNDM0Ny84MDAyLzY4NyA0MzUwLzgwMDEvNjg3CitmIDQzNDAvNzk5MC82ODcgNDM1MS84MDA1LzY4NyA0MzQ4Lzc5OTcvNjg3CitmIDQzNDgvNzk5Ny82ODcgNDMzOS83OTg4LzY4NyA0MzQwLzc5OTAvNjg3CitmIDQzNTEvODAwNS82ODcgNDM1Mi84MDA2LzY4NyA0MzQ5Lzc5OTkvNjg3CitmIDQzNDkvNzk5OS82ODcgNDM0OC83OTk3LzY4NyA0MzUxLzgwMDUvNjg3CitmIDQzNTIvODAwNi82ODcgNDM1My84MDA3LzY4NyA0MzUwLzgwMDEvNjg3CitmIDQzNTAvODAwMS82ODcgNDM0OS83OTk5LzY4NyA0MzUyLzgwMDYvNjg3CitmIDQzNTMvODAwNy82ODcgNDQzNS84MDA4LzY4NyA0NDM0LzgwMDMvNjg3CitmIDQ0MzQvODAwMy82ODcgNDM1MC84MDAxLzY4NyA0MzUzLzgwMDcvNjg3CitmIDQzNDEvNzk5MS82ODcgNDM0Mi83OTkyLzY4NyA0MzUxLzgwMDUvNjg3CitmIDQzNTEvODAwNS82ODcgNDM0MC83OTkwLzY4NyA0MzQxLzc5OTEvNjg3CitmIDQzNDIvNzk5Mi82ODcgNDM0My83OTkzLzY4NyA0MzUyLzgwMDYvNjg3CitmIDQzNTIvODAwNi82ODcgNDM1MS84MDA1LzY4NyA0MzQyLzc5OTIvNjg3CitmIDQzNDMvNzk5My82ODcgNDM0NC83OTk0LzY4NyA0MzUzLzgwMDcvNjg3CitmIDQzNTMvODAwNy82ODcgNDM1Mi84MDA2LzY4NyA0MzQzLzc5OTMvNjg3CitmIDQzNDQvNzk5NC82ODcgNDQzMi83OTk2LzY4NyA0NDM1LzgwMDgvNjg3CitmIDQ0MzUvODAwOC82ODcgNDM1My84MDA3LzY4NyA0MzQ0Lzc5OTQvNjg3CitmIDQzNzEvODAwOS8yMDk5IDQzNzMvODAxMC8yMDk5IDQzNTYvODAxMS8yMDk5CitmIDQzNTYvODAxMS8yMTA5IDQzNTgvODAxMi8yMTA5IDQzNzEvODAwOS8yMTA5CitmIDQzNzYvODAxMy8yMTAwIDQzNzIvODAxNC8yMTAwIDQ1OTMvODAxNS8yMTAwCitmIDQ1OTMvODAxNS8yMTAwIDQ1OTAvODAxNi8yMTAwIDQzNzYvODAxMy8yMTAwCitmIDQzNzUvODAxNy8xMTcyIDQzNzMvODAxOC8xMTcyIDQzNjAvODAxOS8xMTcyCitmIDQzNjAvODAxOS8xMTcyIDQzNjIvODAyMC8xMTcyIDQzNzUvODAxNy8xMTcyCitmIDQzNzEvODAwOS8yMDkyIDQzNzIvODAxNC8yMDkyIDQzNjkvODAyMS8yMDkyCitmIDQzNjkvODAyMS8yMDkyIDQzNjgvODAyMi8yMDkyIDQzNzEvODAwOS8yMDkyCitmIDQzNzQvODAyMy8xMTcyIDQ0ODMvODAyNC8xMTcyIDQ0ODIvODAyNS8xMTcyCitmIDQ0ODIvODAyNS8xMTcyIDQzNjEvODAyNi8xMTcyIDQzNzQvODAyMy8xMTcyCitmIDQzNzYvODAxMy82ODcgNDM3Ny84MDI3LzY4NyA0MzY0LzgwMjgvNjg3CitmIDQzNjQvODAyOC82ODcgNDM2My84MDI5LzY4NyA0Mzc2LzgwMTMvNjg3CitmIDQzNzcvODAyNy82ODcgNDM3OC84MDMwLzY4NyA0MzY3LzgwMzEvNjg3CitmIDQzNjcvODAzMS82ODcgNDM2NC84MDI4LzY4NyA0Mzc3LzgwMjcvNjg3CitmIDQ0MjUvODAzMi8yMDk5IDQ0MTcvODAzMy8yMDk5IDQzNjAvODAzNC8yMDk5CitmIDQzNjAvODAzNC8yMDk5IDQzNjgvODAyMi8yMDk5IDQ0MjUvODAzMi8yMDk5CitmIDQ0MjAvODAzNS8yMTAwIDQ0MjYvODAzNi8yMTAwIDQzNjkvODAyMS8yMTAwCitmIDQzNjkvODAyMS8yMTAwIDQzNjMvODAyOS8yMTAwIDQ0MjAvODAzNS8yMTAwCitmIDU4MTcvODAzNy8xMDQzIDU4MTYvODAzOC8xMDQzIDQ1MDAvNzAxMC8xMDQzCitmIDQ1MDAvNzAxMC8xMDQzIDQ1MDIvNzA5NC8xMDQzIDU4MTcvODAzNy8xMDQzCitmIDU4MTkvODAzOS8xNzg2IDU4NDgvODA0MC8xNzg2IDQ1MDkvNzA1NC8xNzg2CitmIDQ1MDkvNzA1NC8xNzg2IDQ1MDgvNzExMC8xNzg2IDU4MTkvODAzOS8xNzg2CitmIDU4NDYvODA0MS8xMDQzIDU4MjcvODA0Mi8xMDQzIDQ1MTYvNzExOS8xMDQzCitmIDQ1MTYvNzExOS8xMDQzIDQ1MDEvNzExOC8xMDQzIDU4NDYvODA0MS8xMDQzCitmIDU4MjAvODA0My82ODcgNTgyMS84MDQ0LzY4NyA0NTA0LzcxMzAvNjg3CitmIDQ1MDQvNzEzMC82ODcgNDUwMy83MDU1LzY4NyA1ODIwLzgwNDMvNjg3CitmIDU4MjEvODA0NC82ODcgNTgyMi84MDQ1LzY4NyA0NTA1LzcxMzgvNjg3CitmIDQ1MDUvNzEzOC82ODcgNDUwNC83MTMwLzY4NyA1ODIxLzgwNDQvNjg3CitmIDU4MjIvODA0NS82ODcgNTgyMy84MDQ2LzY4NyA0NTA2LzcxNDYvNjg3CitmIDQ1MDYvNzE0Ni82ODcgNDUwNS83MTM4LzY4NyA1ODIyLzgwNDUvNjg3CitmIDU4MjMvODA0Ni82ODcgNTgyNC84MDQ3LzY4NyA0NTA3LzcxNTQvNjg3CitmIDQ1MDcvNzE1NC82ODcgNDUwNi83MTQ2LzY4NyA1ODIzLzgwNDYvNjg3CitmIDU4MjQvODA0Ny82ODcgNTg0OS84MDQ4LzY4NyA0NTEzLzcxNjIvNjg3CitmIDQ1MTMvNzE2Mi82ODcgNDUwNy83MTU0LzY4NyA1ODI0LzgwNDcvNjg3CitmIDQzNjgvODAyMi8yMDk5IDQzNjAvODAzNC8yMDk5IDQzNzMvODAxMC8yMDk5CitmIDQzNzMvODAxMC8yMDk5IDQzNzEvODAwOS8yMDk5IDQzNjgvODAyMi8yMDk5CitmIDQzNjMvODAyOS8yMTAwIDQzNjkvODAyMS8yMTAwIDQzNzIvODAxNC8yMTAwCitmIDQzNzIvODAxNC8yMTAwIDQzNzYvODAxMy8yMTAwIDQzNjMvODAyOS8yMTAwCitmIDQzNTkvODA0OS8xMTcyIDQzNTYvODA1MC8xMTcyIDQzNzMvODAxOC8xMTcyCitmIDQzNzMvODAxOC8xMTcyIDQzNzUvODAxNy8xMTcyIDQzNTkvODA0OS8xMTcyCitmIDQzNTgvODAxMi8yMDkyIDQ1OTMvODAxNS8yMDkyIDQzNzIvODAxNC8yMDkyCitmIDQzNzIvODAxNC8yMDkyIDQzNzEvODAwOS8yMDkyIDQzNTgvODAxMi8yMDkyCitmIDQzNTcvODA1MS8xMTcyIDQ2MjgvODA1Mi8xMTcyIDQ0ODMvODAyNC8xMTcyCitmIDQ0ODMvODAyNC8xMTcyIDQzNzQvODAyMy8xMTcyIDQzNTcvODA1MS8xMTcyCitmIDQ1OTAvODAxNi82ODcgNDYyOS84MDUzLzY4NyA0Mzc3LzgwMjcvNjg3CitmIDQzNzcvODAyNy82ODcgNDM3Ni84MDEzLzY4NyA0NTkwLzgwMTYvNjg3CitmIDQ0MDQvODA1NC82ODcgNDQxNi84MDU1LzY4NyA0NDE1LzgwNTYvNjg3CitmIDQ0MTUvODA1Ni82ODcgNDQwMy84MDU3LzY4NyA0NDA0LzgwNTQvNjg3CitmIDQ2MjkvODA1My82ODcgNDYzNC84MDU4LzY4NyA0Mzc4LzgwMzAvNjg3CitmIDQzNzgvODAzMC82ODcgNDM3Ny84MDI3LzY4NyA0NjI5LzgwNTMvNjg3CitmIDQ1MTAvNjk4MC82ODcgNDM3MC84MDU5LzY4NyA1ODI1LzgwNjAvNjg3CitmIDU4MjUvODA2MC82ODcgNDUxMS83MjA0LzY4NyA0NTEwLzY5ODAvNjg3CitmIDU4MTkvODA2MS8xNzgyIDU4MTYvODAzOC8xNzgyIDQzODIvODA2Mi8xNzgyCitmIDQzODIvODA2Mi8xNzgyIDQzNzkvODA2My8xNzgyIDU4MTkvODA2MS8xNzgyCitmIDU4MjAvODA0My8xNzg0IDU4NDgvODA0MC8xNzg0IDQzODAvODA2NC8xNzg0CitmIDQzODAvODA2NC8xNzg0IDQzODQvODA2NS8xNzg0IDU4MjAvODA0My8xNzg0CitmIDQ0NTAvODA2Ni8yMTEwIDQ0NDYvODA2Ny8yMTEwIDQzOTIvODA2OC8yMTEwCitmIDQzOTIvODA2OC8yMTEwIDQzOTEvODA2OS8yMTEwIDQ0NTAvODA2Ni8yMTEwCitmIDQ0NDYvODA2Ny8yMTExIDQ0NDkvODA3MC8yMTExIDQzOTMvODA3MS8yMTExCitmIDQzOTMvODA3MS8yMTEyIDQzOTIvODA2OC8yMTEyIDQ0NDYvODA2Ny8yMTEyCitmIDQ0NTAvODA2Ni82ODcgNDQ1MS84MDcyLzY4NyA0Mzk3LzgwNzMvNjg3CitmIDQzOTcvODA3My82ODcgNDM5OC84MDc0LzY4NyA0NDUwLzgwNjYvNjg3CitmIDQ2NDcvODA3NS82ODcgNDY0OC84MDc2LzY4NyA0NDQ3LzgwNzcvNjg3CitmIDQ0NDcvODA3Ny82ODcgNDQwMi84MDc4LzY4NyA0NjQ3LzgwNzUvNjg3CitmIDQ0MDIvODA3OC82ODcgNDQ0Ny84MDc3LzY4NyA0NDQ4LzgwNzkvNjg3CitmIDQ0NDgvODA3OS82ODcgNDQwMS84MDgwLzY4NyA0NDAyLzgwNzgvNjg3CitmIDQ0MDEvODA4MC82ODcgNDQ0OC84MDc5LzY4NyA0NDQ5LzgwNzAvNjg3CitmIDQ0NDkvODA3MC82ODcgNDQwMC84MDgxLzY4NyA0NDAxLzgwODAvNjg3CitmIDQzODkvODA4Mi8yMTEzIDQ0NTIvODA4My8yMTEzIDQ0NTEvODA3Mi8yMTEzCitmIDQ0NTEvODA3Mi8yMTE0IDQzOTAvODA4NC8yMTE0IDQzODkvODA4Mi8yMTE0CitmIDQ2NTYvODA4NS8yMTE1IDQ2NTcvODA4Ni8yMTE1IDQ0NTIvODA4My8yMTE1CitmIDQ0NTIvODA4My8yMTE1IDQzODkvODA4Mi8yMTE1IDQ2NTYvODA4NS8yMTE1CitmIDQ0MTAvODA4Ny82ODcgNDQxNC84MDg4LzY4NyA0NDA1LzgwODkvNjg3CitmIDQ0MDUvODA4OS82ODcgNDQwNi84MDkwLzY4NyA0NDEwLzgwODcvNjg3CitmIDU5ODgvODA5MS8yMTE2IDU5ODUvODA5Mi8yMTE2IDQ0MDYvODA5MC8yMTE2CitmIDQ0MDYvODA5MC8yMTE3IDQ0MDUvODA4OS8yMTE3IDU5ODgvODA5MS8yMTE3CitmIDU5ODUvODA5Mi8yMTE4IDU5ODkvODA5My8yMTE4IDQ0MDcvODA5NC8yMTE4CitmIDQ0MDcvODA5NC8yMTE5IDQ0MDYvODA5MC8yMTE5IDU5ODUvODA5Mi8yMTE5CitmIDQ2NjQvODA5NS82ODcgNDQxMS84MDk2LzY4NyA0NDA5LzgwOTcvNjg3CitmIDQ0MDkvODA5Ny82ODcgNDY2My84MDk4LzY4NyA0NjY0LzgwOTUvNjg3CitmIDQ2NjcvODA5OS8yMTIwIDU5OTUvODEwMC8yMTIwIDU5ODYvODEwMS8yMTIwCitmIDU5ODYvODEwMS8yMTIxIDQ0MDMvODA1Ny8yMTIxIDQ2NjcvODA5OS8yMTIxCitmIDQ0MDMvODA1Ny8yMTIyIDU5ODYvODEwMS8yMTIyIDU5ODcvODEwMi8yMTIyCitmIDU5ODcvODEwMi8yMTIzIDQ0MDQvODA1NC8yMTIzIDQ0MDMvODA1Ny8yMTIzCitmIDQ0MDQvODA1NC8yMTI0IDU5ODcvODEwMi8yMTI0IDU5ODgvODA5MS8yMTI0CitmIDU5ODgvODA5MS8yMTI1IDQ0MDUvODA4OS8yMTI1IDQ0MDQvODA1NC8yMTI1CitmIDQzOTQvODEwMy8yMTI2IDU5OTAvODEwNC8yMTI2IDU5ODkvODA5My8yMTI2CitmIDU5ODkvODA5My8yMTI3IDQzOTMvODA3MS8yMTI3IDQzOTQvODEwMy8yMTI3CitmIDQzOTQvODEwMy8yMTI4IDQzOTUvODEwNS8yMTI4IDU5OTEvODEwNi8yMTI4CitmIDU5OTEvODEwNi8yMTI5IDU5OTAvODEwNC8yMTI5IDQzOTQvODEwMy8yMTI5CitmIDQ2NzEvODEwNy8yMTMwIDYwMDAvODEwOC8yMTMwIDU5OTEvODEwNi8yMTMwCitmIDU5OTEvODEwNi8yMTMxIDQzOTUvODEwNS8yMTMxIDQ2NzEvODEwNy8yMTMxCitmIDQ0MDgvODEwOS8yMTMyIDQ0MDkvODA5Ny8yMTMyIDQ0MTEvODA5Ni8yMTMyCitmIDQ0MTEvODA5Ni8yMTMzIDQ0MTIvODExMC8yMTMzIDQ0MDgvODEwOS8yMTMzCitmIDQ0MDgvODEwOS8yMTM0IDQ0MTIvODExMC8yMTM0IDQ0MTMvODExMS8yMTM0CitmIDQ0MTMvODExMS8yMTM1IDQ0MDcvODA5NC8yMTM1IDQ0MDgvODEwOS8yMTM1CitmIDQzNjUvODExMi82ODcgNDM2Ni84MTEzLzY4NyA0NDE2LzgwNTUvNjg3CitmIDQ0MTYvODA1NS82ODcgNDQxNC84MDg4LzY4NyA0MzY1LzgxMTIvNjg3CitmIDQ2MzQvODA1OC82ODcgNDY3Ni84MTE0LzY4NyA0NDE1LzgwNTYvNjg3CitmIDQ0MTUvODA1Ni82ODcgNDM3OC84MDMwLzY4NyA0NjM0LzgwNTgvNjg3CitmIDQ0MTAvODA4Ny82ODcgNDQwNi84MDkwLzY4NyA0NDA3LzgwOTQvNjg3CitmIDQ0MDcvODA5NC82ODcgNDQxMy84MTExLzY4NyA0NDEwLzgwODcvNjg3CitmIDQ0MTYvODA1NS82ODcgNDM2Ny84MDMxLzY4NyA0Mzc4LzgwMzAvNjg3CitmIDQzNzgvODAzMC82ODcgNDQxNS84MDU2LzY4NyA0NDE2LzgwNTUvNjg3CitmIDU4MjkvODExNS82ODcgNTgyNS84MDYwLzY4NyA0NDExLzgwOTYvNjg3CitmIDQ0MTEvODA5Ni82ODcgNDY2NC84MDk1LzY4NyA1ODI5LzgxMTUvNjg3CitmIDQ0MTIvODExMC82ODcgNDM3MC84MDU5LzY4NyA0MzgxLzgxMTYvNjg3CitmIDQzODEvODExNi82ODcgNDQxMy84MTExLzY4NyA0NDEyLzgxMTAvNjg3CitmIDQ0MDQvODA1NC82ODcgNDQwNS84MDg5LzY4NyA0NDE0LzgwODgvNjg3CitmIDQ0MTQvODA4OC82ODcgNDQxNi84MDU1LzY4NyA0NDA0LzgwNTQvNjg3CitmIDQ2NzYvODExNC82ODcgNDY2Ny84MDk5LzY4NyA0NDAzLzgwNTcvNjg3CitmIDQ0MDMvODA1Ny82ODcgNDQxNS84MDU2LzY4NyA0Njc2LzgxMTQvNjg3CitmIDQzNjYvODExMy82ODcgNDM2Ny84MDMxLzY4NyA0NDE2LzgwNTUvNjg3CitmIDQzNjIvODAyMC8xMTcyIDQzNjAvODAxOS8xMTcyIDQ0MTcvODExNy8xMTcyCitmIDQ0MTcvODExNy8xMTcyIDQ0MTkvODExOC8xMTcyIDQzNjIvODAyMC8xMTcyCitmIDQzNjgvODAyMi8yMDkyIDQzNjkvODAyMS8yMDkyIDQ0MjYvODAzNi8yMDkyCitmIDQ0MjYvODAzNi8yMDkyIDQ0MjUvODAzMi8yMDkyIDQzNjgvODAyMi8yMDkyCitmIDQzNjEvODAyNi8xMTcyIDQ0ODIvODAyNS8xMTcyIDQ0ODQvODExOS8xMTcyCitmIDQ0ODQvODExOS8xMTcyIDQ0MTgvODEyMC8xMTcyIDQzNjEvODAyNi8xMTcyCitmIDQzNjMvODAyOS82ODcgNDM2NC84MDI4LzY4NyA0NDIxLzgxMjEvNjg3CitmIDQ0MjEvODEyMS82ODcgNDQyMC84MDM1LzY4NyA0MzYzLzgwMjkvNjg3CitmIDQzNjYvODExMy82ODcgNDM2NS84MTEyLzY4NyA0NDIyLzgxMjIvNjg3CitmIDQ0MjIvODEyMi82ODcgNDQyMy84MTIzLzY4NyA0MzY2LzgxMTMvNjg3CitmIDQzNjcvODAzMS82ODcgNDM2Ni84MTEzLzY4NyA0NDIzLzgxMjMvNjg3CitmIDQ0MjMvODEyMy82ODcgNDQyNC84MTI0LzY4NyA0MzY3LzgwMzEvNjg3CitmIDQzNjQvODAyOC82ODcgNDM2Ny84MDMxLzY4NyA0NDI0LzgxMjQvNjg3CitmIDQ0MjQvODEyNC82ODcgNDQyMS84MTIxLzY4NyA0MzY0LzgwMjgvNjg3CitmIDQ0MzcvNzk1NS8yMDk5IDQ0MjgvODEyNS8yMDk5IDQ0MTcvODAzMy8yMDk5CitmIDQ0MTcvODAzMy8yMDk5IDQ0MjUvODAzMi8yMDk5IDQ0MzcvNzk1NS8yMDk5CitmIDQ0MzEvNzk5NS8yMTAwIDQ0MzgvNzk1Ni8yMTAwIDQ0MjYvODAzNi8yMTAwCitmIDQ0MjYvODAzNi8yMTAwIDQ0MjAvODAzNS8yMTAwIDQ0MzEvNzk5NS8yMTAwCitmIDQ0MjcvODEyNi82ODcgNDM4MS84MTE2LzY4NyA0MzcwLzgwNTkvNjg3CitmIDQzNzAvODA1OS82ODcgNTgyNi84MTI3LzY4NyA0NDI3LzgxMjYvNjg3CitmIDQ0MTkvODExOC8xMTcyIDQ0MTcvODExNy8xMTcyIDQ0MjgvNzkzOS8xMTcyCitmIDQ0MjgvNzkzOS8xMTcyIDQ0MzAvNzkzOC8xMTcyIDQ0MTkvODExOC8xMTcyCitmIDQ0MjUvODAzMi8yMDkyIDQ0MjYvODAzNi8yMDkyIDQ0MzgvNzk1Ni8yMDkyCitmIDQ0MzgvNzk1Ni8yMDkyIDQ0MzcvNzk1NS8yMDkyIDQ0MjUvODAzMi8yMDkyCitmIDQ0MTgvODEyMC8yMTM2IDQ0ODQvODExOS8yMTM2IDQ0ODUvNzk2OC8yMTM2CitmIDQ0ODUvNzk2OC8yMTM3IDQ0NzQvNzk2Ny8yMTM3IDQ0MTgvODEyMC8yMTM3CitmIDQ0MjAvODAzNS82ODcgNDQyMS84MTIxLzY4NyA0NDMyLzc5OTYvNjg3CitmIDQ0MzIvNzk5Ni82ODcgNDQzMS83OTk1LzY4NyA0NDIwLzgwMzUvNjg3CitmIDQ0MjMvODEyMy82ODcgNDQyMi84MTIyLzY4NyA0NDMzLzgwMDQvNjg3CitmIDQ0MzMvODAwNC82ODcgNDQzNC84MDAzLzY4NyA0NDIzLzgxMjMvNjg3CitmIDQ0MjQvODEyNC82ODcgNDQyMy84MTIzLzY4NyA0NDM0LzgwMDMvNjg3CitmIDQ0MzQvODAwMy82ODcgNDQzNS84MDA4LzY4NyA0NDI0LzgxMjQvNjg3CitmIDQ0MjEvODEyMS82ODcgNDQyNC84MTI0LzY4NyA0NDM1LzgwMDgvNjg3CitmIDQ0MzUvODAwOC82ODcgNDQzMi83OTk2LzY4NyA0NDIxLzgxMjEvNjg3CitmIDQ0MjcvODEyNi82ODcgNTgyNi84MTI3LzY4NyA1ODQ5LzgwNDgvNjg3CitmIDU4NDkvODA0OC82ODcgNDQzNi84MTI4LzY4NyA0NDI3LzgxMjYvNjg3CitmIDQzMjIvNzk1OC8yMDk5IDQzMjEvNzk4MC8yMDk5IDQ0MjgvODEyNS8yMDk5CitmIDQ0MjgvODEyNS8yMDk5IDQ0MzcvNzk1NS8yMDk5IDQzMjIvNzk1OC8yMDk5CitmIDQzMjcvNzk4Mi8yMTAwIDQzMzcvNzk1Ny8yMTAwIDQ0MzgvNzk1Ni8yMTAwCitmIDQ0MzgvNzk1Ni8yMTAwIDQ0MzEvNzk5NS8yMTAwIDQzMjcvNzk4Mi8yMTAwCitmIDQ2ODYvODEyOS8yMTM4IDQ2ODcvODEzMC8yMTM4IDQ0MzkvODEzMS8yMTM4CitmIDQ0MzkvODEzMS8yMTM5IDQzOTYvODEzMi8yMTM5IDQ2ODYvODEyOS8yMTM5CitmIDQzOTYvODEzMi8yMTQwIDQ0MzkvODEzMS8yMTQwIDQ0NDAvODEzMy8yMTQwCitmIDQ0NDAvODEzMy8yMTQxIDQzOTcvODA3My8yMTQxIDQzOTYvODEzMi8yMTQxCitmIDQzOTcvODA3My8yMTQyIDQ0NDAvODEzMy8yMTQyIDQ0NDEvODEzNC8yMTQyCitmIDQ0NDEvODEzNC8yMTQzIDQzOTgvODA3NC8yMTQzIDQzOTcvODA3My8yMTQzCitmIDQzOTgvODA3NC8yMTQ0IDQ0NDEvODEzNC8yMTQ0IDQ0NDIvODEzNS8yMTQ0CitmIDQ0NDIvODEzNS8yMTQ1IDQzOTkvODEzNi8yMTQ1IDQzOTgvODA3NC8yMTQ1CitmIDQzOTkvODEzNi8yMTQ2IDQ0NDIvODEzNS8yMTQ2IDQ0NDMvODEzNy8yMTQ2CitmIDQ0NDMvODEzNy8yMTQ3IDQ0MDAvODA4MS8yMTQ3IDQzOTkvODEzNi8yMTQ3CitmIDQ0MDAvODA4MS8yMTQ4IDQ0NDMvODEzNy8yMTQ4IDQ0NDQvODEzOC8yMTQ4CitmIDQ0NDQvODEzOC8yMTQ5IDQ0MDEvODA4MC8yMTQ5IDQ0MDAvODA4MS8yMTQ5CitmIDQ0MDEvODA4MC8yMTUwIDQ0NDQvODEzOC8yMTUwIDQ0NDUvODEzOS8yMTUwCitmIDQ0NDUvODEzOS8yMTUxIDQ0MDIvODA3OC8yMTUxIDQ0MDEvODA4MC8yMTUxCitmIDQ0MDIvODA3OC8yMTUyIDQ0NDUvODEzOS8yMTUyIDQ2OTcvODE0MC8yMTUyCitmIDQ2OTcvODE0MC8yMTUzIDQ2NDcvODA3NS8yMTUzIDQ0MDIvODA3OC8yMTUzCitmIDQzOTgvODA3NC82ODcgNDM5OS84MTM2LzY4NyA0NDQ2LzgwNjcvNjg3CitmIDQ0NDYvODA2Ny82ODcgNDQ1MC84MDY2LzY4NyA0Mzk4LzgwNzQvNjg3CitmIDQzOTkvODEzNi82ODcgNDQwMC84MDgxLzY4NyA0NDQ5LzgwNzAvNjg3CitmIDQ0NDkvODA3MC82ODcgNDQ0Ni84MDY3LzY4NyA0Mzk5LzgxMzYvNjg3CitmIDQzOTEvODA2OS8yMTU0IDQzOTAvODA4NC8yMTU0IDQ0NTEvODA3Mi8yMTU0CitmIDQ0NTEvODA3Mi8yMTU0IDQ0NTAvODA2Ni8yMTU0IDQzOTEvODA2OS8yMTU0CitmIDQ2NzEvODEwNy8yMTU1IDQzOTUvODEwNS8yMTU1IDQ0NDcvODA3Ny8yMTU1CitmIDQ0NDcvODA3Ny8yMTU1IDQ2NDgvODA3Ni8yMTU1IDQ2NzEvODEwNy8yMTU1CitmIDQzOTUvODEwNS8yMTU2IDQzOTQvODEwMy8yMTU2IDQ0NDgvODA3OS8yMTU2CitmIDQ0NDgvODA3OS8yMTU3IDQ0NDcvODA3Ny8yMTU3IDQzOTUvODEwNS8yMTU3CitmIDQzOTQvODEwMy8yMTU4IDQzOTMvODA3MS8yMTU4IDQ0NDkvODA3MC8yMTU4CitmIDQ0NDkvODA3MC8yMTU5IDQ0NDgvODA3OS8yMTU5IDQzOTQvODEwMy8yMTU5CitmIDQzOTYvODEzMi82ODcgNDM5Ny84MDczLzY4NyA0NDUxLzgwNzIvNjg3CitmIDQ0NTEvODA3Mi82ODcgNDQ1Mi84MDgzLzY4NyA0Mzk2LzgxMzIvNjg3CitmIDQ2ODYvODEyOS82ODcgNDM5Ni84MTMyLzY4NyA0NDUyLzgwODMvNjg3CitmIDQ0NTIvODA4My82ODcgNDY1Ny84MDg2LzY4NyA0Njg2LzgxMjkvNjg3CitmIDQ0NjUvODE0MS82OTcgNDQ2Ni84MTQyLzY5NyA0NDU0LzgxNDMvNjk3CitmIDQ0NTQvODE0My82OTcgNDQ1My84MTQ0LzY5NyA0NDY1LzgxNDEvNjk3CitmIDQ0NjYvODE0Mi82OTcgNDQ2Ny84MTQ1LzY5NyA0NDU1LzgxNDYvNjk3CitmIDQ0NTUvODE0Ni82OTcgNDQ1NC84MTQzLzY5NyA0NDY2LzgxNDIvNjk3CitmIDQ0NjcvODE0NS82OTcgNDQ2OC84MTQ3LzY5NyA0NDU2LzgxNDgvNjk3CitmIDQ0NTYvODE0OC82OTcgNDQ1NS84MTQ2LzY5NyA0NDY3LzgxNDUvNjk3CitmIDQ3MDgvODE0OS82OTcgNDQ3Mi84MTUwLzY5NyA0NDU3LzgxNTEvNjk3CitmIDQ0NTcvODE1MS82OTcgNDcxMS84MTUyLzY5NyA0NzA4LzgxNDkvNjk3CitmIDQ0NzIvODE1MC82OTcgNDQ3MS84MTUzLzY5NyA0NDU4LzgxNTQvNjk3CitmIDQ0NTgvODE1NC82OTcgNDQ1Ny84MTUxLzY5NyA0NDcyLzgxNTAvNjk3CitmIDQ0NzEvODE1My82OTcgNDQ3My84MTU1LzY5NyA0NDU5LzgxNTYvNjk3CitmIDQ0NTkvODE1Ni82OTcgNDQ1OC84MTU0LzY5NyA0NDcxLzgxNTMvNjk3CitmIDQ0NzMvODE1NS82OTcgNDQyOS84MTU3LzY5NyA0NDYwLzgxNTgvNjk3CitmIDQ0NjAvODE1OC82OTcgNDQ1OS84MTU2LzY5NyA0NDczLzgxNTUvNjk3CitmIDQ0MjkvODE1Ny82OTcgNDQ3MC84MTU5LzY5NyA0NDYxLzgxNjAvNjk3CitmIDQ0NjEvODE2MC82OTcgNDQ2MC84MTU4LzY5NyA0NDI5LzgxNTcvNjk3CitmIDQ0NzAvODE1OS82OTcgNDM1NC84MTYxLzY5NyA0NDYyLzgxNjIvNjk3CitmIDQ0NjIvODE2Mi82OTcgNDQ2MS84MTYwLzY5NyA0NDcwLzgxNTkvNjk3CitmIDQzNTQvODE2MS82OTcgNDMwMy84MTYzLzY5NyA0NDYzLzgxNjQvNjk3CitmIDQ0NjMvODE2NC82OTcgNDQ2Mi84MTYyLzY5NyA0MzU0LzgxNjEvNjk3CitmIDQzMDMvODE2My82OTcgNDQ2NS84MTQxLzY5NyA0NDUzLzgxNDQvNjk3CitmIDQ0NTMvODE0NC82OTcgNDQ2My84MTY0LzY5NyA0MzAzLzgxNjMvNjk3CitmIDY5MzcvODE2NS8yMTYwIDQzMDQvODE2Ni8yMTYwIDQzMDUvODE2Ny8yMTYwCitmIDQzMDUvODE2OC8yMTYxIDY5MzgvODE2OS8yMTYxIDY5MzkvODE3MC8yMTYxCitmIDY5NDAvODE3MS8yMTYyIDQzMDUvODE3Mi8yMTYyIDY5NDEvODE3My8yMTYyCitmIDY5NDIvODE3NC8yMTYyIDY5NDMvODE3NS8yMTYyIDY5NDQvODE3Ni8yMTYyCitmIDY5NDUvODE3Ny8yMTYzIDQ0NjQvODE3OC8yMTYzIDY5NDYvODE3OS8yMTYzCitmIDY5NDcvODE4MC8yMTY0IDY5NDgvODE4MS8yMTY0IDY5NDkvODE4Mi8yMTY0CitmIDY5NTAvODE4My8yMTY1IDQ0NjkvODE4NC8yMTY1IDQ0NjQvODE4NS8yMTY1CitmIDQ0NjQvODE4Ni8yMTY2IDY5NTEvODE4Ny8yMTY2IDY5NTIvODE4OC8yMTY2CitmIDY5NTMvODE4OS8yMTY3IDQzNTUvODE5MC8yMTY3IDY5NTQvODE5MS8yMTY3CitmIDY5NTUvODE5Mi8yMTY4IDY5NTYvODE5My8yMTY4IDY5NTcvODE5NC8yMTY4CitmIDY5NTgvODE5NS8xOTE5IDQzMDYvNzk3Ny8xOTE5IDQzMTgvNzk3OS8xOTE5CitmIDQzMTgvODE5Ni8xOTE4IDY5NTkvODE5Ny8xOTE4IDY5NjAvODE5OC8xOTE4CitmIDY5NjEvODE5OS8yMTY5IDQ0NzQvNzk2Ny8yMTY5IDQzNTUvNzk3MC8yMTY5CitmIDQzNTUvODIwMC8yMTcwIDY5NjIvODIwMS8yMTcwIDY5NjMvODIwMi8yMTcwCitmIDY5NjQvODIwMy8yMTY3IDQzNzQvODAyMy8yMTY3IDQzNjEvODAyNi8yMTY3CitmIDQzNjEvODIwNC8yMTY3IDY5NjUvODIwNS8yMTY3IDY5NjYvODIwNi8yMTY3CitmIDY5NjcvODIwNy8yMTcwIDQzNTcvODA1MS8yMTcwIDQzNzQvODAyMy8yMTcwCitmIDQzNzQvODIwOC8yMTcwIDY5NjgvODIwOS8yMTcwIDY5NjkvODIxMC8yMTcwCitmIDY5NzAvODIxMS8yMTY3IDQzNjEvODAyNi8yMTY3IDQ0MTgvODEyMC8yMTY3CitmIDQ0MTgvODIxMi8yMTY3IDY5NzEvODIxMy8yMTY3IDY5NzIvODIxNC8yMTY3CitmIDY5NzMvODIxNS8yMTY5IDQ0MTgvODEyMC8yMTY5IDQ0NzQvNzk2Ny8yMTY5CitmIDQ0NzQvODIxNi8yMTcwIDY5NzQvODIxNy8yMTcwIDY5NzUvODIxOC8yMTcwCitmIDY5NzYvODIxOS8yMDc1IDY5NzcvODIyMC8yMDc1IDQ0NzcvODIyMS8yMDc1CitmIDQ0NzcvNzk2Mi8yMDc1IDQ0NzgvNzk2MS8yMDc1IDY5NzgvODIyMi8yMDc1CitmIDQzMDYvNzk3Ny8yMDc2IDY5NzkvODIyMi8yMDc2IDQ0NzgvNzk2MS8yMDc2CitmIDQ0NzgvNzk2MS8yMDc2IDQ0NzkvNzk2My8yMDc2IDQzMDYvNzk3Ny8yMDc2CitmIDY5ODAvODIyMy8yMDc3IDY5ODEvODIyNC8yMDc3IDQ0NzYvODIyNS8yMDc3CitmIDQ0NzYvNzk2NS8yMDc3IDQ0NzcvNzk2NC8yMDc3IDY5ODIvODIyNi8yMDc3CitmIDY5ODMvODIyNy8yMDc5IDY5ODQvODIyOC8yMDc5IDQ0NzUvODIyOS8yMDc5CitmIDQ0NzUvNzk2Ni8yMDc5IDQ0NzYvNzk2NS8yMDc5IDY5ODUvODIzMC8yMDc5CitmIDQ0MzAvNzkzOC8xMTcyIDQzMjMvNzk0MS8xMTcyIDQ0ODEvNzk2OS8xMTcyCitmIDQ0ODEvNzk2OS8xMTcyIDQ0ODUvNzk2OC8xMTcyIDQ0MzAvNzkzOC8xMTcyCitmIDQzMTYvNzkzMC8xMTAyIDQzMjAvNzk3Mi8xMTAyIDQ0ODAvNzk3OC8xMTAyCitmIDQ0ODAvNzk3OC8xMDQzIDQ0NzkvNzk2My8xMDQzIDQzMTYvNzkzMC8xMDQzCitmIDY5ODYvODIzMS8xMjQzIDQzNTUvNzk3MC8xMjQzIDQ0ODEvNzk2OS8xMjQzCitmIDQ0ODEvNzk2OS8xMTcyIDQ0NzUvNzk2Ni8xMTcyIDY5ODcvODIzMS8xMTcyCitmIDQzNzUvODAxNy8xMTcyIDQzNjIvODAyMC8xMTcyIDQ0ODIvODAyNS8xMTcyCitmIDQ0ODIvODAyNS8xMTcyIDQ0ODMvODAyNC8xMTcyIDQzNzUvODAxNy8xMTcyCitmIDQzNTkvODA0OS8xMTcyIDQzNzUvODAxNy8xMTcyIDQ0ODMvODAyNC8xMTcyCitmIDQ0ODMvODAyNC8xMTcyIDQ2MjgvODA1Mi8xMTcyIDQzNTkvODA0OS8xMTcyCitmIDQzNjIvODAyMC8xMTcyIDQ0MTkvODExOC8xMTcyIDQ0ODQvODExOS8xMTcyCitmIDQ0ODQvODExOS8xMTcyIDQ0ODIvODAyNS8xMTcyIDQzNjIvODAyMC8xMTcyCitmIDQ0MTkvODExOC8xMTcyIDQ0MzAvNzkzOC8xMTcyIDQ0ODUvNzk2OC8xMTcyCitmIDQ0ODUvNzk2OC8xMTcyIDQ0ODQvODExOS8xMTcyIDQ0MTkvODExOC8xMTcyCitmIDQ0OTAvODIzMi8yMTcxIDQ0OTEvODIzMy8yMTcxIDQzODIvODA2Mi8yMTcxCitmIDQzODIvODA2Mi8yMDk4IDQzODMvODIzNC8yMDk4IDQ0OTAvODIzMi8yMDk4CitmIDQ0OTIvODIzNS8xNzgyIDQzNzkvODA2My8xNzgyIDQzODIvODA2Mi8xNzgyCitmIDQzODIvODA2Mi8xNzgyIDQ0OTEvODIzMy8xNzgyIDQ0OTIvODIzNS8xNzgyCitmIDQ0OTIvODIzNi8xNzg2IDQ0OTMvODIzNy8xNzg2IDQzODAvODA2NC8xNzg2CitmIDQzODAvODA2NC8xNzg2IDQzNzkvODIzOC8xNzg2IDQ0OTIvODIzNi8xNzg2CitmIDQ0OTQvODIzOS8xNzg0IDQzODQvODA2NS8xNzg0IDQzODAvODA2NC8xNzg0CitmIDQzODAvODA2NC8xNzg0IDQ0OTMvODIzNy8xNzg0IDQ0OTQvODIzOS8xNzg0CitmIDQ0OTQvODIzOS82ODcgNDQ5NS84MjQwLzY4NyA0Mzg1LzgyNDEvNjg3CitmIDQzODUvODI0MS82ODcgNDM4NC84MDY1LzY4NyA0NDk0LzgyMzkvNjg3CitmIDQ0OTUvODI0MC82ODcgNDQ5Ni84MjQyLzY4NyA0Mzg2LzgyNDMvNjg3CitmIDQzODYvODI0My82ODcgNDM4NS84MjQxLzY4NyA0NDk1LzgyNDAvNjg3CitmIDQ0OTYvODI0Mi82ODcgNDQ5Ny84MjQ0LzY4NyA0Mzg3LzgyNDUvNjg3CitmIDQzODcvODI0NS82ODcgNDM4Ni84MjQzLzY4NyA0NDk2LzgyNDIvNjg3CitmIDQ0MTAvODA4Ny82ODcgNDQ5OS84MjQ2LzY4NyA0MzY1LzgxMTIvNjg3CitmIDQzNjUvODExMi82ODcgNDQxNC84MDg4LzY4NyA0NDEwLzgwODcvNjg3CitmIDQ0NTYvODE0OC82OTcgNDQ2OC84MTQ3LzY5NyA0NDg3LzgyNDcvNjk3CitmIDQ0ODcvODI0Ny82OTcgNDQ4Ni84MjQ4LzY5NyA0NDU2LzgxNDgvNjk3CitmIDY5ODgvODI0OS8xOTE4IDQzMTgvNzk3OS8xOTE4IDQ0ODgvODI1MC8xOTE4CitmIDQ0ODgvODI1MS8xOTE5IDY5ODkvODI1Mi8xOTE5IDY5OTAvODI1My8xOTE5CitmIDQzMTgvNzk3OS8xMDQzIDQ0ODAvNzk3OC8xMDQzIDQ0ODkvODI1NC8xMDQzCitmIDQ0ODkvODI1NC8xMDQzIDQ0ODgvODI1MC8xMDQzIDQzMTgvNzk3OS8xMDQzCitmIDQ0ODAvNzk3OC8xMTAyIDQzMjAvNzk3Mi8xMTAyIDQ0OTAvODIzMi8xMTAyCitmIDQ0OTAvODIzMi8xMTAyIDQ0ODkvODI1NC8xMTAyIDQ0ODAvNzk3OC8xMTAyCitmIDQzMjAvNzk3Mi8yMDk4IDQzMTcvNzk3MS8yMDk4IDQ0OTEvODIzMy8yMDk4CitmIDQ0OTEvODIzMy8yMTcxIDQ0OTAvODIzMi8yMTcxIDQzMjAvNzk3Mi8yMTcxCitmIDQ0OTEvODIzMy8xNzgyIDQzMTcvNzk3MS8xNzgyIDQzMTkvNzk3NC8xNzgyCitmIDQzMTkvNzk3NC8xNzgyIDQ0OTIvODIzNS8xNzgyIDQ0OTEvODIzMy8xNzgyCitmIDQ0OTIvODIzNi8xNzg2IDQzMTkvNzk3NS8xNzg2IDQzMzYvNzk3Ni8xNzg2CitmIDQzMzYvNzk3Ni8xNzg2IDQ0OTMvODIzNy8xNzg2IDQ0OTIvODIzNi8xNzg2CitmIDQ0OTMvODIzNy8xNzg0IDQzMzYvNzk3Ni8xNzg0IDQzMzAvNzk4Ny8xNzg0CitmIDQzMzAvNzk4Ny8xNzg0IDQ0OTQvODIzOS8xNzg0IDQ0OTMvODIzNy8xNzg0CitmIDQzMzAvNzk4Ny82ODcgNDMzOC83OTg5LzY4NyA0NDk1LzgyNDAvNjg3CitmIDQ0OTUvODI0MC82ODcgNDQ5NC84MjM5LzY4NyA0MzMwLzc5ODcvNjg3CitmIDQzMzgvNzk4OS82ODcgNDM0NS83OTk4LzY4NyA0NDk2LzgyNDIvNjg3CitmIDQ0OTYvODI0Mi82ODcgNDQ5NS84MjQwLzY4NyA0MzM4Lzc5ODkvNjg3CitmIDQzNDUvNzk5OC82ODcgNDM0Ni84MDAwLzY4NyA0NDk3LzgyNDQvNjg3CitmIDQ0OTcvODI0NC82ODcgNDQ5Ni84MjQyLzY4NyA0MzQ1Lzc5OTgvNjg3CitmIDQzNDYvODAwMC82ODcgNDM0Ny84MDAyLzY4NyA0ODkyLzgyNTUvNjg3CitmIDQ4OTIvODI1NS82ODcgNDQ5Ny84MjQ0LzY4NyA0MzQ2LzgwMDAvNjg3CitmIDQzNjUvODExMi82ODcgNDQ5OS84MjQ2LzY4NyA0ODkxLzgyNTYvNjg3CitmIDQ4OTEvODI1Ni82ODcgNDQyMi84MTIyLzY4NyA0MzY1LzgxMTIvNjg3CitmIDQzODEvODExNi82ODcgNDQ5OS84MjQ2LzY4NyA0NDEwLzgwODcvNjg3CitmIDQ0MTAvODA4Ny82ODcgNDQxMy84MTExLzY4NyA0MzgxLzgxMTYvNjg3CitmIDQ0MzMvODAwNC82ODcgNDQ5OC84MjU3LzY4NyA0ODkyLzgyNTUvNjg3CitmIDQ4OTIvODI1NS82ODcgNDM0Ny84MDAyLzY4NyA0NDMzLzgwMDQvNjg3CitmIDQ0OTcvODI0NC82ODcgNDg5Mi84MjU1LzY4NyA0Mzg4LzgyNTgvNjg3CitmIDQzODgvODI1OC82ODcgNDM4Ny84MjQ1LzY4NyA0NDk3LzgyNDQvNjg3CitmIDQ0OTgvODI1Ny82ODcgNDg5MS84MjU2LzY4NyA0NDI3LzgxMjYvNjg3CitmIDQ0MjcvODEyNi82ODcgNDQzNi84MTI4LzY4NyA0NDk4LzgyNTcvNjg3CitmIDQzODgvODI1OC82ODcgNDg5Mi84MjU1LzY4NyA0NDk4LzgyNTcvNjg3CitmIDQ0OTgvODI1Ny82ODcgNDQzNi84MTI4LzY4NyA0Mzg4LzgyNTgvNjg3CitmIDQ0MzMvODAwNC82ODcgNDQyMi84MTIyLzY4NyA0ODkxLzgyNTYvNjg3CitmIDQ4OTEvODI1Ni82ODcgNDQ5OC84MjU3LzY4NyA0NDMzLzgwMDQvNjg3CitmIDQ1MTgvODI1OS8yMTcyIDQ1MTcvODI2MC8yMTcyIDQ1MjAvODI2MS8yMTcyCitmIDQ1MjAvODI2MS8yMTcyIDQ1MTkvODI2Mi8yMTcyIDQ1MTgvODI1OS8yMTcyCitmIDQ1MjIvODI2My8yMTczIDQ1MjEvODI2NC8yMTczIDQ1MTcvODI2MC8yMTczCitmIDQ1MTcvODI2MC8yMTczIDQ1MTgvODI1OS8yMTczIDQ1MjIvODI2My8yMTczCitmIDQ1MTkvODI2NS8yMTc0IDQ1MjAvODI2Ni8yMTc0IDQ1MjQvODI2Ny8yMTc0CitmIDQ1MjQvODI2Ny8yMTc0IDQ1MjMvODI2OC8yMTc0IDQ1MTkvODI2NS8yMTc0CitmIDQ1MjMvODI2OC8yMTc1IDQ1MjQvODI2Ny8yMTc1IDQ1MjYvODI2OS8yMTc1CitmIDQ1MjYvODI2OS8yMTc1IDQ1MjUvODI3MC8yMTc1IDQ1MjMvODI2OC8yMTc1CitmIDQ1MjgvODI3MS8yMTc2IDQ1MjcvODI3Mi8yMTc2IDQ1MzAvODI3My8yMTc2CitmIDQ1MzAvODI3My8yMTc2IDQ1MjkvODI3NC8yMTc2IDQ1MjgvODI3MS8yMTc2CitmIDQ1MzEvODI3NS8yMTc3IDQ1MjAvODI3Ni8yMTc3IDQ1MTcvODI3Ny8yMTc3CitmIDQ1MTcvODI3Ny8yMTc4IDQ1MzIvODI3OC8yMTc4IDQ1MzEvODI3NS8yMTc4CitmIDQ1MzIvODI3OC8yMTc5IDQ1MTcvODI3Ny8yMTc5IDQ1MjEvODI3OS8yMTc5CitmIDQ1MjEvODI3OS8yMTgwIDQ1MzMvODI4MC8yMTgwIDQ1MzIvODI3OC8yMTgwCitmIDQ1MzQvODI4MS8yMTgxIDQ1MjYvODI4Mi8yMTgxIDQ1MjQvODI4My8yMTgxCitmIDQ1MjQvODI4My8yMTgyIDQ1MzUvODI4NC8yMTgyIDQ1MzQvODI4MS8yMTgyCitmIDQ1MzUvODI4NC8yMTgzIDQ1MjQvODI4My8yMTgzIDQ1MjAvODI3Ni8yMTgzCitmIDQ1MjAvODI3Ni8yMTg0IDQ1MzEvODI3NS8yMTg0IDQ1MzUvODI4NC8yMTg0CitmIDQ1MzEvODI3NS8yMTg1IDQ1MzIvODI3OC8yMTg1IDQ1MzcvODI4NS8yMTg1CitmIDQ1MzcvODI4NS8yMTg2IDQ1MzYvODI4Ni8yMTg2IDQ1MzEvODI3NS8yMTg2CitmIDQ1MzMvODI4MC8yMTg3IDQ1MzgvODI4Ny8yMTg3IDQ1MzcvODI4NS8yMTg3CitmIDQ1MzcvODI4NS8yMTg4IDQ1MzIvODI3OC8yMTg4IDQ1MzMvODI4MC8yMTg4CitmIDQ1NDAvODI4OC8yMTg5IDQ1MzkvODI4OS8yMTg5IDQ1NDIvODI5MC8yMTg5CitmIDQ1NDIvODI5MC8yMDkyIDQ1NDEvODI5MS8yMDkyIDQ1NDAvODI4OC8yMDkyCitmIDQ1MzQvODI4MS8yMTkwIDQ1MzUvODI4NC8yMTkwIDQ1NDQvODI5Mi8yMTkwCitmIDQ1NDQvODI5Mi8yMTkxIDQ1NDMvODI5My8yMTkxIDQ1MzQvODI4MS8yMTkxCitmIDQ1MzUvODI4NC8yMTkyIDQ1MzEvODI3NS8yMTkyIDQ1MzYvODI4Ni8yMTkyCitmIDQ1MzYvODI4Ni8yMTkzIDQ1NDQvODI5Mi8yMTkzIDQ1MzUvODI4NC8yMTkzCitmIDQ1NDUvODI5NC8yMTcyIDQ1MTgvODI1OS8yMTcyIDQ1MTkvODI2Mi8yMTcyCitmIDQ1MTkvODI2Mi8yMTcyIDQ1NDYvODI5NS8yMTcyIDQ1NDUvODI5NC8yMTcyCitmIDQ1NDcvODI5Ni8yMTczIDQ1MjIvODI2My8yMTczIDQ1MTgvODI1OS8yMTczCitmIDQ1MTgvODI1OS8yMTczIDQ1NDUvODI5NC8yMTczIDQ1NDcvODI5Ni8yMTczCitmIDQ1NDYvODI5Ny8yMTc0IDQ1MTkvODI2NS8yMTc0IDQ1MjMvODI2OC8yMTc0CitmIDQ1MjMvODI2OC8yMTc0IDQ1NDgvODI5OC8yMTc0IDQ1NDYvODI5Ny8yMTc0CitmIDQ1NDgvODI5OC8yMTc1IDQ1MjMvODI2OC8yMTc1IDQ1MjUvODI3MC8yMTc1CitmIDQ1MjUvODI3MC8yMTc1IDQ1NDkvODI5OS8yMTc1IDQ1NDgvODI5OC8yMTc1CitmIDQ1NTEvODMwMC8xMTcyIDQ1NTAvODMwMS8xMTcyIDQ1NTMvODMwMi8xMTcyCitmIDQ1NTMvODMwMi8xMjQyIDQ1NTIvODMwMy8xMjQyIDQ1NTEvODMwMC8xMjQyCitmIDQ1MjIvODI2My8xMDQ0IDQ1NTQvODMwNC8xMDQ0IDQ1NTUvODMwNS8xMDQ0CitmIDQ1NTUvODMwNS8xMDQ0IDQ1MjEvODI2NC8xMDQ0IDQ1MjIvODI2My8xMDQ0CitmIDQ1NTUvODMwNS8xNzg1IDQ1NTYvODMwNi8xNzg1IDQ1MzMvODMwNy8xNzg1CitmIDQ1MzMvODMwNy8xNzg1IDQ1MjEvODI2NC8xNzg1IDQ1NTUvODMwNS8xNzg1CitmIDQ1NTYvODMwOC8xNzgzIDQ1NTcvODMwOS8xNzgzIDQ1MzgvODI4Ny8xNzgzCitmIDQ1MzgvODI4Ny8xNzgzIDQ1MzMvODI4MC8xNzgzIDQ1NTYvODMwOC8xNzgzCitmIDQ1NTkvODMxMC8xMDQ0IDQ1NTgvODMxMS8xMDQ0IDQ1NjAvODMxMi8xMDQ0CitmIDQ1NjAvODMxMi8xMDQ0IDQ1NDcvODI5Ni8xMDQ0IDQ1NTkvODMxMC8xMDQ0CitmIDQ1MjYvODI2OS8yMTk0IDQ1MzAvODI3My8yMTk0IDQ1MjcvODI3Mi8yMTk0CitmIDQ1MjcvODI3Mi8yMTk0IDQ1MjUvODI3MC8yMTk0IDQ1MjYvODI2OS8yMTk0CitmIDQ1MzQvODMxMy8yMTk1IDQ1MzkvODMxNC8yMTk1IDQ1MzAvODI3My8yMTk1CitmIDQ1MzAvODMxNS8yMTA5IDQ1MjYvODI4Mi8yMTA5IDQ1MzQvODI4MS8yMTA5CitmIDQ1MjUvODI3MC8yMTk2IDQ1MjcvODI3Mi8yMTk2IDQ1NTMvODMwMi8yMTk2CitmIDQ1NTMvODMwMi8xMTcyIDQ1NDkvODI5OS8xMTcyIDQ1MjUvODI3MC8xMTcyCitmIDQ1NjEvODMxNi8yMTAwIDQ1NjIvODMxNy8yMTAwIDQ1NDIvODI5MC8yMTAwCitmIDQ1NDIvODI5MC8yMTAwIDQ1NDMvODI5My8yMTAwIDQ1NjEvODMxNi8yMTAwCitmIDQ1NjMvODMxOC8yMTk3IDQ1MzYvODI4Ni8yMTk3IDQ1MzcvODI4NS8yMTk3CitmIDQ1MzcvODI4NS8yMTk4IDQ1NjQvODMxOS8yMTk4IDQ1NjMvODMxOC8yMTk4CitmIDQ1NjQvODMxOS8yMTk5IDQ1MzcvODI4NS8yMTk5IDQ1MzgvODI4Ny8yMTk5CitmIDQ1MzgvODI4Ny8yMjAwIDQ1NjUvODMyMC8yMjAwIDQ1NjQvODMxOS8yMjAwCitmIDQ1NDMvODI5My8yMjAxIDQ1NDQvODI5Mi8yMjAxIDQ1NjYvODMyMS8yMjAxCitmIDQ1NjYvODMyMS8yMjAyIDQ1NjEvODMxNi8yMjAyIDQ1NDMvODI5My8yMjAyCitmIDQ1NjYvODMyMS8yMjAzIDQ1NDQvODI5Mi8yMjAzIDQ1MzYvODI4Ni8yMjAzCitmIDQ1MzYvODI4Ni8yMjA0IDQ1NjMvODMxOC8yMjA0IDQ1NjYvODMyMS8yMjA0CitmIDQ1NjUvODMyMC8xNzg3IDQ1MzgvODI4Ny8xNzg3IDQ1NTcvODMwOS8xNzg3CitmIDQ1NTcvODMwOS8xNzg3IDQ1NjcvODMyMi8xNzg3IDQ1NjUvODMyMC8xNzg3CitmIDQ1NDMvODI5My8yMjA1IDQ1NDIvODI5MC8yMjA1IDQ1MzkvODI4OS8yMjA1CitmIDQ1MzkvODI4OS8yMjA2IDQ1MzQvODI4MS8yMjA2IDQ1NDMvODI5My8yMjA2CitmIDQ1NjcvODMyMi82ODcgNDU2OS84MzIzLzY4NyA0NTY4LzgzMjQvNjg3CitmIDQ1NjgvODMyNC82ODcgNDU2NS84MzIwLzY4NyA0NTY3LzgzMjIvNjg3CitmIDQ1NjUvODMyMC82ODcgNDU2OC84MzI0LzY4NyA0NTcwLzgzMjUvNjg3CitmIDQ1NzAvODMyNS82ODcgNDU2NC84MzE5LzY4NyA0NTY1LzgzMjAvNjg3CitmIDQ1NjQvODMxOS82ODcgNDU3MC84MzI1LzY4NyA0NTcxLzgzMjYvNjg3CitmIDQ1NzEvODMyNi82ODcgNDU2My84MzE4LzY4NyA0NTY0LzgzMTkvNjg3CitmIDQ1NjMvODMxOC82ODcgNDU3MS84MzI2LzY4NyA0NTcyLzgzMjcvNjg3CitmIDQ1NzIvODMyNy82ODcgNDU2Ni84MzIxLzY4NyA0NTYzLzgzMTgvNjg3CitmIDQ1NjYvODMyMS82ODcgNDU3Mi84MzI3LzY4NyA0NTczLzgzMjgvNjg3CitmIDQ1NzMvODMyOC82ODcgNDU2MS84MzE2LzY4NyA0NTY2LzgzMjEvNjg3CitmIDQ1NjEvODMxNi82ODcgNDU3My84MzI4LzY4NyA0NTc0LzgzMjkvNjg3CitmIDQ1NzQvODMyOS82ODcgNDU2Mi84MzE3LzY4NyA0NTYxLzgzMTYvNjg3CitmIDQ1NzUvODMzMC82ODcgNDU2Mi84MzE3LzY4NyA0NTc0LzgzMjkvNjg3CitmIDQ1NzQvODMyOS82ODcgNDU3Ni84MzMxLzY4NyA0NTc1LzgzMzAvNjg3CitmIDQ1NjgvODMyNC82ODcgNDU2OS84MzIzLzY4NyA0NTc4LzgzMzIvNjg3CitmIDQ1NzgvODMzMi82ODcgNDU3Ny84MzMzLzY4NyA0NTY4LzgzMjQvNjg3CitmIDQ1NzcvODMzMy82ODcgNDU3OC84MzMyLzY4NyA0NTgwLzgzMzQvNjg3CitmIDQ1ODAvODMzNC82ODcgNDU3OS84MzM1LzY4NyA0NTc3LzgzMzMvNjg3CitmIDQ1NzkvODMzNS82ODcgNDU4MC84MzM0LzY4NyA0NTgyLzgzMzYvNjg3CitmIDQ1ODIvODMzNi82ODcgNDU4MS84MzM3LzY4NyA0NTc5LzgzMzUvNjg3CitmIDQ1ODEvODMzNy82ODcgNDU4Mi84MzM2LzY4NyA0ODI5LzgzMzgvNjg3CitmIDQ4MjkvODMzOC82ODcgNDU4My84MzM5LzY4NyA0NTgxLzgzMzcvNjg3CitmIDQ1NzAvODMyNS82ODcgNDU2OC84MzI0LzY4NyA0NTc3LzgzMzMvNjg3CitmIDQ1NzcvODMzMy82ODcgNDU4NC84MzQwLzY4NyA0NTcwLzgzMjUvNjg3CitmIDQ1ODQvODM0MC82ODcgNDU3Ny84MzMzLzY4NyA0NTc5LzgzMzUvNjg3CitmIDQ1NzkvODMzNS82ODcgNDU4NS84MzQxLzY4NyA0NTg0LzgzNDAvNjg3CitmIDQ1ODUvODM0MS82ODcgNDU3OS84MzM1LzY4NyA0NTgxLzgzMzcvNjg3CitmIDQ1ODEvODMzNy82ODcgNDU4Ni84MzQyLzY4NyA0NTg1LzgzNDEvNjg3CitmIDQ1ODYvODM0Mi82ODcgNDU4MS84MzM3LzY4NyA0NTgzLzgzMzkvNjg3CitmIDQ1ODMvODMzOS82ODcgNDU4Ny84MzQzLzY4NyA0NTg2LzgzNDIvNjg3CitmIDQ1NzEvODMyNi82ODcgNDU3MC84MzI1LzY4NyA0NTg0LzgzNDAvNjg3CitmIDQ1ODQvODM0MC82ODcgNDU3Mi84MzI3LzY4NyA0NTcxLzgzMjYvNjg3CitmIDQ1NzIvODMyNy82ODcgNDU4NC84MzQwLzY4NyA0NTg1LzgzNDEvNjg3CitmIDQ1ODUvODM0MS82ODcgNDU3My84MzI4LzY4NyA0NTcyLzgzMjcvNjg3CitmIDQ1NzMvODMyOC82ODcgNDU4NS84MzQxLzY4NyA0NTg2LzgzNDIvNjg3CitmIDQ1ODYvODM0Mi82ODcgNDU3NC84MzI5LzY4NyA0NTczLzgzMjgvNjg3CitmIDQ1NzQvODMyOS82ODcgNDU4Ni84MzQyLzY4NyA0NTg3LzgzNDMvNjg3CitmIDQ1ODcvODM0My82ODcgNDU3Ni84MzMxLzY4NyA0NTc0LzgzMjkvNjg3CitmIDQ1ODgvODM0NC8yMTA5IDQzNTgvODAxMi8yMTA5IDQzNTYvODAxMS8yMTA5CitmIDQzNTYvODAxMS8yMTA5IDQ1ODkvODM0NS8yMTA5IDQ1ODgvODM0NC8yMTA5CitmIDQ1OTEvODM0Ni8yMTAwIDQ1OTAvODAxNi8yMTAwIDQ1OTMvODAxNS8yMTAwCitmIDQ1OTMvODAxNS8yMTAwIDQ1OTIvODM0Ny8yMTAwIDQ1OTEvODM0Ni8yMTAwCitmIDQ1OTUvODM0OC8xMTcyIDQ1OTQvODM0OS8xMTcyIDQ1OTYvODM1MC8xMTcyCitmIDQ1OTYvODM1MC8xMTcyIDQ1ODkvODM1MS8xMTcyIDQ1OTUvODM0OC8xMTcyCitmIDQ1ODgvODM0NC8yMDkyIDQ1OTcvODM1Mi8yMDkyIDQ1OTgvODM1My8yMDkyCitmIDQ1OTgvODM1My8yMDkyIDQ1OTIvODM0Ny8yMDkyIDQ1ODgvODM0NC8yMDkyCitmIDQ2MDAvODM1NC8xMjQyIDQ1OTkvODM1NS8xMjQyIDQ2MDIvODM1Ni8xMjQyCitmIDQ2MDIvODM1Ni8xMTcyIDQ2MDEvODM1Ny8xMTcyIDQ2MDAvODM1NC8xMTcyCitmIDQ1OTEvODM0Ni82ODcgNDYwMy84MzU4LzY4NyA0NjA1LzgzNTkvNjg3CitmIDQ2MDUvODM1OS82ODcgNDYwNC84MzYwLzY4NyA0NTkxLzgzNDYvNjg3CitmIDQ2MDQvODM2MC82ODcgNDYwNS84MzU5LzY4NyA0NjA3LzgzNjEvNjg3CitmIDQ2MDcvODM2MS82ODcgNDYwNi84MzYyLzY4NyA0NjA0LzgzNjAvNjg3CitmIDQ2MDgvODM2My8yMTA5IDQ1OTcvODM1Mi8yMTA5IDQ1OTYvODM2NC8yMTA5CitmIDQ1OTYvODM2NC8yMTA5IDQ2MDkvODM2NS8yMTA5IDQ2MDgvODM2My8yMTA5CitmIDQ2MTAvODM2Ni8yMTAwIDQ2MDMvODM1OC8yMTAwIDQ1OTgvODM1My8yMTAwCitmIDQ1OTgvODM1My8yMTAwIDQ2MTEvODM2Ny8yMTAwIDQ2MTAvODM2Ni8yMTAwCitmIDI5NDcvNjk5NC8xMDQ0IDU4MzIvODM2OC8xMDQ0IDU4MzEvODM2OS8xMDQ0CitmIDU4MzEvODM2OS8xMDQ0IDI5NDkvNjk5NS8xMDQ0IDI5NDcvNjk5NC8xMDQ0CitmIDI5NDYvNzAyOC8xNzgzIDU4MzQvODM3MC8xNzgzIDU4MzMvODM3MS8xNzgzCitmIDU4MzMvODM3MS8xNzgzIDI5NDUvNzAyNi8xNzgzIDI5NDYvNzAyOC8xNzgzCitmIDM5MzUvNzA0Mi8xMDQ0IDU4MzYvODM3Mi8xMDQ0IDU4MzUvODM3My8xMDQ0CitmIDU4MzUvODM3My8xMDQ0IDM5MTYvNzI1Ny8xMDQ0IDM5MzUvNzA0Mi8xMDQ0CitmIDQ2MjUvNzA3MC82ODcgNTg0MS84Mzc0LzY4NyA1ODI4LzgzNzUvNjg3CitmIDU4MjgvODM3NS82ODcgNDYyNC83MDcxLzY4NyA0NjI1LzcwNzAvNjg3CitmIDI5NTAvNzE4Ny82ODcgNTgzNy84Mzc2LzY4NyA1ODQxLzgzNzQvNjg3CitmIDU4NDEvODM3NC82ODcgNDYyNS83MDcwLzY4NyAyOTUwLzcxODcvNjg3CitmIDQ2MjYvNzE3Ni82ODcgNTg0Mi84Mzc3LzY4NyA1ODM3LzgzNzYvNjg3CitmIDU4MzcvODM3Ni82ODcgMjk1MC83MTg3LzY4NyA0NjI2LzcxNzYvNjg3CitmIDQ2MjcvNzE3NS82ODcgNTg0My84Mzc4LzY4NyA1ODQyLzgzNzcvNjg3CitmIDU4NDIvODM3Ny82ODcgNDYyNi83MTc2LzY4NyA0NjI3LzcxNzUvNjg3CitmIDM5ODYvNzM4NC82ODcgNTgzOC84Mzc5LzY4NyA1ODQzLzgzNzgvNjg3CitmIDU4NDMvODM3OC82ODcgNDYyNy83MTc1LzY4NyAzOTg2LzczODQvNjg3CitmIDQ1OTcvODM1Mi8yMTA5IDQ1ODgvODM0NC8yMTA5IDQ1ODkvODM0NS8yMTA5CitmIDQ1ODkvODM0NS8yMTA5IDQ1OTYvODM2NC8yMTA5IDQ1OTcvODM1Mi8yMTA5CitmIDQ2MDMvODM1OC8yMTAwIDQ1OTEvODM0Ni8yMTAwIDQ1OTIvODM0Ny8yMTAwCitmIDQ1OTIvODM0Ny8yMTAwIDQ1OTgvODM1My8yMTAwIDQ2MDMvODM1OC8yMTAwCitmIDQzNTkvODA0OS8xMTcyIDQ1OTUvODM0OC8xMTcyIDQ1ODkvODM1MS8xMTcyCitmIDQ1ODkvODM1MS8xMTcyIDQzNTYvODA1MC8xMTcyIDQzNTkvODA0OS8xMTcyCitmIDQzNTgvODAxMi8yMDkyIDQ1ODgvODM0NC8yMDkyIDQ1OTIvODM0Ny8yMDkyCitmIDQ1OTIvODM0Ny8yMDkyIDQ1OTMvODAxNS8yMDkyIDQzNTgvODAxMi8yMDkyCitmIDQzNTcvODA1MS8xMTcyIDQ2MDAvODM1NC8xMTcyIDQ2MDEvODM1Ny8xMTcyCitmIDQ2MDEvODM1Ny8xMjQzIDQ2MjgvODA1Mi8xMjQzIDQzNTcvODA1MS8xMjQzCitmIDQ1OTAvODAxNi82ODcgNDU5MS84MzQ2LzY4NyA0NjA0LzgzNjAvNjg3CitmIDQ2MDQvODM2MC82ODcgNDYyOS84MDUzLzY4NyA0NTkwLzgwMTYvNjg3CitmIDQ2MzAvODM4MC82ODcgNDYzMy84MzgxLzY4NyA0NjMyLzgzODIvNjg3CitmIDQ2MzIvODM4Mi82ODcgNDYzMS84MzgzLzY4NyA0NjMwLzgzODAvNjg3CitmIDQ2MjkvODA1My82ODcgNDYwNC84MzYwLzY4NyA0NjA2LzgzNjIvNjg3CitmIDQ2MDYvODM2Mi82ODcgNDYzNC84MDU4LzY4NyA0NjI5LzgwNTMvNjg3CitmIDU4MzAvODM4NC82ODcgNTgzOS84Mzg1LzY4NyA0NjM2LzY5ODUvNjg3CitmIDQ2MzYvNjk4NS82ODcgNDYzNS83MjAzLzY4NyA1ODMwLzgzODQvNjg3CitmIDQ2MTMvODM4Ni8xNzg1IDU4MzIvODM2OC8xNzg1IDU4MzMvODM4Ny8xNzg1CitmIDU4MzMvODM4Ny8xNzg1IDQ2MTQvODM4OC8xNzg1IDQ2MTMvODM4Ni8xNzg1CitmIDQ2MTUvODM4OS8xNzg3IDU4MzQvODM3MC8xNzg3IDU4MjgvODM3NS8xNzg3CitmIDU4MjgvODM3NS8xNzg3IDQ2MTgvODM5MC8xNzg3IDQ2MTUvODM4OS8xNzg3CitmIDQ2MzgvODM5MS8yMjA3IDQ2MzcvODM5Mi8yMjA3IDQ2NDAvODM5My8yMjA3CitmIDQ2NDAvODM5My8yMjA4IDQ2MzkvODM5NC8yMjA4IDQ2MzgvODM5MS8yMjA4CitmIDQ2MzkvODM5NC8yMjA5IDQ2NDAvODM5My8yMjA5IDQ2NDIvODM5NS8yMjA5CitmIDQ2NDIvODM5NS8yMjEwIDQ2NDEvODM5Ni8yMjEwIDQ2MzkvODM5NC8yMjEwCitmIDQ2MzgvODM5MS82ODcgNDY0My84Mzk3LzY4NyA0NjQ1LzgzOTgvNjg3CitmIDQ2NDUvODM5OC82ODcgNDY0NC84Mzk5LzY4NyA0NjM4LzgzOTEvNjg3CitmIDQ2NDcvODA3NS82ODcgNDY0Ni84NDAwLzY4NyA0NjQ5Lzg0MDEvNjg3CitmIDQ2NDkvODQwMS82ODcgNDY0OC84MDc2LzY4NyA0NjQ3LzgwNzUvNjg3CitmIDQ2NDYvODQwMC82ODcgNDY1MC84NDAyLzY4NyA0NjUxLzg0MDMvNjg3CitmIDQ2NTEvODQwMy82ODcgNDY0OS84NDAxLzY4NyA0NjQ2Lzg0MDAvNjg3CitmIDQ2NTAvODQwMi82ODcgNDY1Mi84NDA0LzY4NyA0NjQxLzgzOTYvNjg3CitmIDQ2NDEvODM5Ni82ODcgNDY1MS84NDAzLzY4NyA0NjUwLzg0MDIvNjg3CitmIDQ2NTQvODQwNS8yMjExIDQ2NTMvODQwNi8yMjExIDQ2NDQvODM5OS8yMjExCitmIDQ2NDQvODM5OS8yMjExIDQ2NTUvODQwNy8yMjExIDQ2NTQvODQwNS8yMjExCitmIDQ2NTYvODA4NS8yMjEyIDQ2NTQvODQwNS8yMjEyIDQ2NTUvODQwNy8yMjEyCitmIDQ2NTUvODQwNy8yMjEyIDQ2NTcvODA4Ni8yMjEyIDQ2NTYvODA4NS8yMjEyCitmIDQ2NTkvODQwOC82ODcgNDY1OC84NDA5LzY4NyA0NjYxLzg0MTAvNjg3CitmIDQ2NjEvODQxMC82ODcgNDY2MC84NDExLzY4NyA0NjU5Lzg0MDgvNjg3CitmIDQ2NTgvODQwOS8yMjEzIDU5OTMvODQxMi8yMjEzIDU5OTIvODQxMy8yMjEzCitmIDU5OTIvODQxMy8yMjE0IDQ2NjEvODQxMC8yMjE0IDQ2NTgvODQwOS8yMjE0CitmIDQ2NjIvODQxNC8yMjE1IDU5OTQvODQxNS8yMjE1IDU5OTMvODQxMi8yMjE1CitmIDU5OTMvODQxMi8yMjE2IDQ2NTgvODQwOS8yMjE2IDQ2NjIvODQxNC8yMjE2CitmIDQ2NjQvODA5NS82ODcgNDY2My84MDk4LzY4NyA0NjY2Lzg0MTYvNjg3CitmIDQ2NjYvODQxNi82ODcgNDY2NS84NDE3LzY4NyA0NjY0LzgwOTUvNjg3CitmIDU5OTYvODQxOC8yMjE3IDU5OTUvODEwMC8yMjE3IDQ2NjcvODA5OS8yMjE3CitmIDQ2NjcvODA5OS8yMjE4IDQ2MzMvODM4MS8yMjE4IDU5OTYvODQxOC8yMjE4CitmIDU5OTcvODQxOS8yMjE5IDU5OTYvODQxOC8yMjE5IDQ2MzMvODM4MS8yMjE5CitmIDQ2MzMvODM4MS8yMjIwIDQ2MzAvODM4MC8yMjIwIDU5OTcvODQxOS8yMjIwCitmIDU5OTIvODQxMy8yMjIxIDU5OTcvODQxOS8yMjIxIDQ2MzAvODM4MC8yMjIxCitmIDQ2MzAvODM4MC8yMjIyIDQ2NjEvODQxMC8yMjIyIDU5OTIvODQxMy8yMjIyCitmIDU5OTQvODQxNS8yMjIzIDU5OTgvODQyMC8yMjIzIDQ2NjgvODQyMS8yMjIzCitmIDQ2NjgvODQyMS8yMjI0IDQ2NDIvODM5NS8yMjI0IDU5OTQvODQxNS8yMjI0CitmIDQ2NjgvODQyMS8yMjI1IDU5OTgvODQyMC8yMjI1IDU5OTkvODQyMi8yMjI1CitmIDU5OTkvODQyMi8yMjI2IDQ2NzAvODQyMy8yMjI2IDQ2NjgvODQyMS8yMjI2CitmIDU5OTkvODQyMi8yMjI3IDYwMDAvODEwOC8yMjI3IDQ2NzEvODEwNy8yMjI3CitmIDQ2NzEvODEwNy8yMjI4IDQ2NzAvODQyMy8yMjI4IDU5OTkvODQyMi8yMjI4CitmIDQ2NjkvODQyNC82ODcgNDY3Mi84NDI1LzY4NyA0NjY1Lzg0MTcvNjg3CitmIDQ2NjUvODQxNy82ODcgNDY2Ni84NDE2LzY4NyA0NjY5Lzg0MjQvNjg3CitmIDQ2NjkvODQyNC82ODcgNDY2Mi84NDE0LzY4NyA0NjczLzg0MjYvNjg3CitmIDQ2NzMvODQyNi82ODcgNDY3Mi84NDI1LzY4NyA0NjY5Lzg0MjQvNjg3CitmIDQ2NzQvODQyNy82ODcgNDY2MC84NDExLzY4NyA0NjMxLzgzODMvNjg3CitmIDQ2MzEvODM4My82ODcgNDY3NS84NDI4LzY4NyA0Njc0Lzg0MjcvNjg3CitmIDQ2MzQvODA1OC82ODcgNDYwNi84MzYyLzY4NyA0NjMyLzgzODIvNjg3CitmIDQ2MzIvODM4Mi82ODcgNDY3Ni84MTE0LzY4NyA0NjM0LzgwNTgvNjg3CitmIDQ2NTkvODQwOC82ODcgNDY3My84NDI2LzY4NyA0NjYyLzg0MTQvNjg3CitmIDQ2NjIvODQxNC82ODcgNDY1OC84NDA5LzY4NyA0NjU5Lzg0MDgvNjg3CitmIDQ2MzEvODM4My82ODcgNDYzMi84MzgyLzY4NyA0NjA2LzgzNjIvNjg3CitmIDQ2MDYvODM2Mi82ODcgNDYwNy84MzYxLzY4NyA0NjMxLzgzODMvNjg3CitmIDQ2NjUvODQxNy82ODcgNTgzMC84Mzg0LzY4NyA1ODI5LzgxMTUvNjg3CitmIDU4MjkvODExNS82ODcgNDY2NC84MDk1LzY4NyA0NjY1Lzg0MTcvNjg3CitmIDQ2NzIvODQyNS82ODcgNTgzOS84Mzg1LzY4NyA1ODMwLzgzODQvNjg3CitmIDU4MzAvODM4NC82ODcgNDY2NS84NDE3LzY4NyA0NjcyLzg0MjUvNjg3CitmIDQ2NzIvODQyNS82ODcgNDY3My84NDI2LzY4NyA0Njc3Lzg0MjkvNjg3CitmIDQ2NzcvODQyOS82ODcgNTgzOS84Mzg1LzY4NyA0NjcyLzg0MjUvNjg3CitmIDQ2MzAvODM4MC82ODcgNDYzMS84MzgzLzY4NyA0NjYwLzg0MTEvNjg3CitmIDQ2NjAvODQxMS82ODcgNDY2MS84NDEwLzY4NyA0NjMwLzgzODAvNjg3CitmIDQ2NzYvODExNC82ODcgNDYzMi84MzgyLzY4NyA0NjMzLzgzODEvNjg3CitmIDQ2MzMvODM4MS82ODcgNDY2Ny84MDk5LzY4NyA0Njc2LzgxMTQvNjg3CitmIDQ2NzUvODQyOC82ODcgNDYzMS84MzgzLzY4NyA0NjA3LzgzNjEvNjg3CitmIDQ1OTQvODM0OS8xMTcyIDQ2NzgvODQzMC8xMTcyIDQ2MDkvODQzMS8xMTcyCitmIDQ2MDkvODQzMS8xMTcyIDQ1OTYvODM1MC8xMTcyIDQ1OTQvODM0OS8xMTcyCitmIDQ1OTcvODM1Mi8yMDkyIDQ2MDgvODM2My8yMDkyIDQ2MTEvODM2Ny8yMDkyCitmIDQ2MTEvODM2Ny8yMDkyIDQ1OTgvODM1My8yMDkyIDQ1OTcvODM1Mi8yMDkyCitmIDQ1OTkvODM1NS8xMjQzIDQ2NzkvODQzMi8xMjQzIDQ2ODAvODQzMy8xMjQzCitmIDQ2ODAvODQzMy8xMjQyIDQ2MDIvODM1Ni8xMjQyIDQ1OTkvODM1NS8xMjQyCitmIDQ2MDMvODM1OC82ODcgNDYxMC84MzY2LzY4NyA0NjgxLzg0MzQvNjg3CitmIDQ2ODEvODQzNC82ODcgNDYwNS84MzU5LzY4NyA0NjAzLzgzNTgvNjg3CitmIDQ2NzUvODQyOC82ODcgNDY4Mi84NDM1LzY4NyA0NjgzLzg0MzYvNjg3CitmIDQ2ODMvODQzNi82ODcgNDY3NC84NDI3LzY4NyA0Njc1Lzg0MjgvNjg3CitmIDQ2MDcvODM2MS82ODcgNDY4NC84NDM3LzY4NyA0NjgyLzg0MzUvNjg3CitmIDQ2ODIvODQzNS82ODcgNDY3NS84NDI4LzY4NyA0NjA3LzgzNjEvNjg3CitmIDQ2MDUvODM1OS82ODcgNDY4MS84NDM0LzY4NyA0Njg0Lzg0MzcvNjg3CitmIDQ2ODQvODQzNy82ODcgNDYwNy84MzYxLzY4NyA0NjA1LzgzNTkvNjg3CitmIDQ1NDAvODI4OC8yMTA5IDQ2MDgvODM2My8yMTA5IDQ2MDkvODM2NS8yMTA5CitmIDQ2MDkvODM2NS8yMTA5IDQ1MjkvODQzOC8yMTA5IDQ1NDAvODI4OC8yMTA5CitmIDQ1NzUvODMzMC8yMTAwIDQ2MTAvODM2Ni8yMTAwIDQ2MTEvODM2Ny8yMTAwCitmIDQ2MTEvODM2Ny8yMTAwIDQ1NDEvODI5MS8yMTAwIDQ1NzUvODMzMC8yMTAwCitmIDU4MzkvODM4NS82ODcgNDY3Ny84NDI5LzY4NyA0Njg1Lzg0MzkvNjg3CitmIDQ2ODUvODQzOS82ODcgNTg0NC84NDQwLzY4NyA1ODM5LzgzODUvNjg3CitmIDQ2NzgvODQzMC8xMTcyIDQ1MjgvODI3MS8xMTcyIDQ1MjkvODI3NC8xMTcyCitmIDQ1MjkvODI3NC8xMTcyIDQ2MDkvODQzMS8xMTcyIDQ2NzgvODQzMC8xMTcyCitmIDQ2MDgvODM2My8yMDkyIDQ1NDAvODI4OC8yMDkyIDQ1NDEvODI5MS8yMDkyCitmIDQ1NDEvODI5MS8yMDkyIDQ2MTEvODM2Ny8yMDkyIDQ2MDgvODM2My8yMDkyCitmIDQ2NzkvODQzMi8xMjQyIDQ1NTEvODMwMC8xMjQyIDQ1NTIvODMwMy8xMjQyCitmIDQ1NTIvODMwMy8xMjQzIDQ2ODAvODQzMy8xMjQzIDQ2NzkvODQzMi8xMjQzCitmIDQ2MTAvODM2Ni82ODcgNDU3NS84MzMwLzY4NyA0NTc2LzgzMzEvNjg3CitmIDQ1NzYvODMzMS82ODcgNDY4MS84NDM0LzY4NyA0NjEwLzgzNjYvNjg3CitmIDQ2ODIvODQzNS82ODcgNDU4My84MzM5LzY4NyA0ODI5LzgzMzgvNjg3CitmIDQ4MjkvODMzOC82ODcgNDY4My84NDM2LzY4NyA0NjgyLzg0MzUvNjg3CitmIDQ2ODQvODQzNy82ODcgNDU4Ny84MzQzLzY4NyA0NTgzLzgzMzkvNjg3CitmIDQ1ODMvODMzOS82ODcgNDY4Mi84NDM1LzY4NyA0Njg0Lzg0MzcvNjg3CitmIDQ2ODEvODQzNC82ODcgNDU3Ni84MzMxLzY4NyA0NTg3LzgzNDMvNjg3CitmIDQ1ODcvODM0My82ODcgNDY4NC84NDM3LzY4NyA0NjgxLzg0MzQvNjg3CitmIDU4MzgvODM3OS82ODcgNTg0NC84NDQwLzY4NyA0Njg1Lzg0MzkvNjg3CitmIDQ2ODUvODQzOS82ODcgNDYyMy84NDQxLzY4NyA1ODM4LzgzNzkvNjg3CitmIDQ1MzkvODI4OS8yMjI5IDQ1NDAvODI4OC8yMjI5IDQ1MjkvODQzOC8yMjI5CitmIDQ1MjkvODI3NC8yMjMwIDQ1MzAvODI3My8yMjMwIDQ1MzkvODMxNC8yMjMwCitmIDQ1NjIvODMxNy8yMTAwIDQ1NzUvODMzMC8yMTAwIDQ1NDEvODI5MS8yMTAwCitmIDQ1NDEvODI5MS8yMTAwIDQ1NDIvODI5MC8yMTAwIDQ1NjIvODMxNy8yMTAwCitmIDQ2ODYvODEyOS8yMjMxIDQ2ODkvODQ0Mi8yMjMxIDQ2ODgvODQ0My8yMjMxCitmIDQ2ODgvODQ0My8yMjMyIDQ2ODcvODEzMC8yMjMyIDQ2ODYvODEyOS8yMjMyCitmIDQ2ODkvODQ0Mi8yMjMzIDQ2NDUvODM5OC8yMjMzIDQ2OTAvODQ0NC8yMjMzCitmIDQ2OTAvODQ0NC8yMjM0IDQ2ODgvODQ0My8yMjM0IDQ2ODkvODQ0Mi8yMjM0CitmIDQ2NDUvODM5OC8yMjM1IDQ2NDMvODM5Ny8yMjM1IDQ2OTEvODQ0NS8yMjM1CitmIDQ2OTEvODQ0NS8yMjM2IDQ2OTAvODQ0NC8yMjM2IDQ2NDUvODM5OC8yMjM2CitmIDQ2NDMvODM5Ny8yMjM3IDQ2OTMvODQ0Ni8yMjM3IDQ2OTIvODQ0Ny8yMjM3CitmIDQ2OTIvODQ0Ny8yMjM4IDQ2OTEvODQ0NS8yMjM4IDQ2NDMvODM5Ny8yMjM4CitmIDQ2OTMvODQ0Ni8yMjM5IDQ2NTIvODQwNC8yMjM5IDQ2OTQvODQ0OC8yMjM5CitmIDQ2OTQvODQ0OC8yMjQwIDQ2OTIvODQ0Ny8yMjQwIDQ2OTMvODQ0Ni8yMjQwCitmIDQ2NTIvODQwNC8yMjQxIDQ2NTAvODQwMi8yMjQxIDQ2OTUvODQ0OS8yMjQxCitmIDQ2OTUvODQ0OS8yMjQyIDQ2OTQvODQ0OC8yMjQyIDQ2NTIvODQwNC8yMjQyCitmIDQ2NTAvODQwMi8yMjQzIDQ2NDYvODQwMC8yMjQzIDQ2OTYvODQ1MC8yMjQzCitmIDQ2OTYvODQ1MC8yMjQ0IDQ2OTUvODQ0OS8yMjQ0IDQ2NTAvODQwMi8yMjQ0CitmIDQ2NDYvODQwMC8yMjQ1IDQ2NDcvODA3NS8yMjQ1IDQ2OTcvODE0MC8yMjQ1CitmIDQ2OTcvODE0MC8yMjQ2IDQ2OTYvODQ1MC8yMjQ2IDQ2NDYvODQwMC8yMjQ2CitmIDQ2NDMvODM5Ny82ODcgNDYzOC84MzkxLzY4NyA0NjM5LzgzOTQvNjg3CitmIDQ2MzkvODM5NC82ODcgNDY5My84NDQ2LzY4NyA0NjQzLzgzOTcvNjg3CitmIDQ2OTMvODQ0Ni82ODcgNDYzOS84Mzk0LzY4NyA0NjQxLzgzOTYvNjg3CitmIDQ2NDEvODM5Ni82ODcgNDY1Mi84NDA0LzY4NyA0NjkzLzg0NDYvNjg3CitmIDQ2MzcvODM5Mi8yMjQ3IDQ2MzgvODM5MS8yMjQ3IDQ2NDQvODM5OS8yMjQ3CitmIDQ2NDQvODM5OS8yMjQ4IDQ2NTMvODQwNi8yMjQ4IDQ2MzcvODM5Mi8yMjQ4CitmIDQ2NzEvODEwNy8yMjQ5IDQ2NDgvODA3Ni8yMjQ5IDQ2NDkvODQwMS8yMjQ5CitmIDQ2NDkvODQwMS8yMjQ5IDQ2NzAvODQyMy8yMjQ5IDQ2NzEvODEwNy8yMjQ5CitmIDQ2NzAvODQyMy8yMjUwIDQ2NDkvODQwMS8yMjUwIDQ2NTEvODQwMy8yMjUwCitmIDQ2NTEvODQwMy8yMjUxIDQ2NjgvODQyMS8yMjUxIDQ2NzAvODQyMy8yMjUxCitmIDQ2NjgvODQyMS8yMjUyIDQ2NTEvODQwMy8yMjUyIDQ2NDEvODM5Ni8yMjUyCitmIDQ2NDEvODM5Ni8yMjUyIDQ2NDIvODM5NS8yMjUyIDQ2NjgvODQyMS8yMjUyCitmIDQ2ODkvODQ0Mi82ODcgNDY1NS84NDA3LzY4NyA0NjQ0LzgzOTkvNjg3CitmIDQ2NDQvODM5OS82ODcgNDY0NS84Mzk4LzY4NyA0Njg5Lzg0NDIvNjg3CitmIDQ2ODYvODEyOS82ODcgNDY1Ny84MDg2LzY4NyA0NjU1Lzg0MDcvNjg3CitmIDQ2NTUvODQwNy82ODcgNDY4OS84NDQyLzY4NyA0Njg2LzgxMjkvNjg3CitmIDQ2OTgvODQ1MS82OTcgNDcwMS84NDUyLzY5NyA0NzAwLzg0NTMvNjk3CitmIDQ3MDAvODQ1My82OTcgNDY5OS84NDU0LzY5NyA0Njk4Lzg0NTEvNjk3CitmIDQ2OTkvODQ1NC82OTcgNDcwMC84NDUzLzY5NyA0NzAzLzg0NTUvNjk3CitmIDQ3MDMvODQ1NS82OTcgNDcwMi84NDU2LzY5NyA0Njk5Lzg0NTQvNjk3CitmIDQ3MDIvODQ1Ni82OTcgNDcwMy84NDU1LzY5NyA0NzA1Lzg0NTcvNjk3CitmIDQ3MDUvODQ1Ny82OTcgNDcwNC84NDU4LzY5NyA0NzAyLzg0NTYvNjk3CitmIDQ3MDYvODQ1OS8yMjUzIDQ3MDcvODQ2MC8yMjUzIDU4NDAvODQ2MS8yMjUzCitmIDU4NDAvODQ2MS8yMjUzIDU4NDUvODQ2Mi8yMjUzIDQ3MDYvODQ1OS8yMjUzCitmIDQ3MDgvODE0OS82OTcgNDcxMS84MTUyLzY5NyA0NzEwLzg0NjMvNjk3CitmIDQ3MTAvODQ2My82OTcgNDcwOS84NDY0LzY5NyA0NzA4LzgxNDkvNjk3CitmIDQ3MDkvODQ2NC82OTcgNDcxMC84NDYzLzY5NyA0NzEzLzg0NjUvNjk3CitmIDQ3MTMvODQ2NS82OTcgNDcxMi84NDY2LzY5NyA0NzA5Lzg0NjQvNjk3CitmIDQ3MTIvODQ2Ni82OTcgNDcxMy84NDY1LzY5NyA0NzE1Lzg0NjcvNjk3CitmIDQ3MTUvODQ2Ny82OTcgNDcxNC84NDY4LzY5NyA0NzEyLzg0NjYvNjk3CitmIDQ3MTQvODQ2OC82OTcgNDcxNS84NDY3LzY5NyA0NzE3Lzg0NjkvNjk3CitmIDQ3MTcvODQ2OS82OTcgNDcxNi84NDcwLzY5NyA0NzE0Lzg0NjgvNjk3CitmIDQ3MTYvODQ3MC82OTcgNDcxNy84NDY5LzY5NyA0NzE5Lzg0NzEvNjk3CitmIDQ3MTkvODQ3MS82OTcgNDcxOC84NDcyLzY5NyA0NzE2Lzg0NzAvNjk3CitmIDQ3MTgvODQ3Mi82OTcgNDcxOS84NDcxLzY5NyA0NzIxLzg0NzMvNjk3CitmIDQ3MjEvODQ3My82OTcgNDcyMC84NDc0LzY5NyA0NzE4Lzg0NzIvNjk3CitmIDQ3MjAvODQ3NC82OTcgNDcyMS84NDczLzY5NyA0NzIzLzg0NzUvNjk3CitmIDQ3MjMvODQ3NS82OTcgNDcyMi84NDc2LzY5NyA0NzIwLzg0NzQvNjk3CitmIDQ3MjIvODQ3Ni82OTcgNDcyMy84NDc1LzY5NyA0NzAxLzg0NTIvNjk3CitmIDQ3MDEvODQ1Mi82OTcgNDY5OC84NDUxLzY5NyA0NzIyLzg0NzYvNjk3CitmIDY5OTEvODQ3Ny8yMjU0IDY5OTIvODQ3OC8yMjU0IDQ3MjUvODQ3OS8yMjU0CitmIDQ3MjUvODQ4MC8yMjU1IDQ3MjQvODQ4MS8yMjU1IDY5OTMvODQ4Mi8yMjU1CitmIDY5OTQvODQ4My8yMjU2IDY5OTUvODQ4NC8yMjU2IDY5OTYvODQ4NS8yMjU2CitmIDY5OTcvODQ4Ni8yMjU2IDQ3MjUvODQ4Ny8yMjU2IDY5OTgvODQ4OC8yMjU2CitmIDY5OTkvODQ4OS8yMjU3IDcwMDAvODQ5MC8yMjU3IDcwMDEvODQ5MS8yMjU3CitmIDcwMDIvODQ5Mi8yMjU4IDQ3MjYvODQ5My8yMjU4IDcwMDMvODQ5NC8yMjU4CitmIDcwMDQvODQ5NS8yMjU5IDcwMDUvODQ5Ni8yMjU5IDcwMDYvODQ5Ny8yMjU5CitmIDcwMDcvODQ5OC8yMjYwIDQ3MjcvODQ5OS8yMjYwIDcwMDgvODUwMC8yMjYwCitmIDcwMDkvODUwMS8yMTY3IDcwMTAvODUwMi8yMTY3IDcwMTEvODUwMy8yMTY3CitmIDcwMTIvODUwNC8yMTcwIDQ1NTAvODUwNS8yMTcwIDcwMTMvODUwNi8yMTcwCitmIDcwMTQvODUwNy8xOTE2IDcwMTUvODUwOC8xOTE2IDQ1NTgvODUwOS8xOTE2CitmIDQ1NTgvODMxMS8xOTE3IDQ1NTkvODMxMC8xOTE3IDcwMTYvODUxMC8xOTE3CitmIDcwMTcvODUxMS8yMTY5IDcwMTgvODUxMi8yMTY5IDQ1NTAvODUxMy8yMTY5CitmIDQ1NTAvODMwMS8yMTcwIDQ1NTEvODMwMC8yMTcwIDcwMTkvODUxNC8yMTcwCitmIDcwMjAvODUxNS8yMTY3IDcwMjEvODUxNi8yMTY3IDQ1OTkvODUxNy8yMTY3CitmIDQ1OTkvODM1NS8yMTY3IDQ2MDAvODM1NC8yMTY3IDcwMjIvODUxOC8yMTY3CitmIDU4NDUvODUxOS8yMjYxIDcwMjMvODUyMC8yMjYxIDQ2MTYvODUyMS8yMjYxCitmIDQ2MTYvODUyMi8yMjYyIDQ3MDYvODUyMy8yMjYyIDU4NDUvODUyNC8yMjYyCitmIDcwMjQvODUyNS8yMTY3IDcwMjUvODUyNi8yMTY3IDQ2MDAvODUyNy8yMTY3CitmIDQ2MDAvODM1NC8yMTY3IDQzNTcvODA1MS8yMTY3IDcwMjYvODIwNy8yMTY3CitmIDcwMjcvODUyOC8yMTY5IDcwMjgvODUyOS8yMTY5IDQ2NzkvODUzMC8yMTY5CitmIDQ2NzkvODQzMi8yMTcwIDQ1OTkvODM1NS8yMTcwIDcwMjkvODUzMS8yMTcwCitmIDcwMzAvODUzMi8yMTY4IDcwMzEvODUzMy8yMTY4IDQ1NTEvODUzNC8yMTY4CitmIDQ1NTEvODMwMC8yMTY3IDQ2NzkvODQzMi8yMTY3IDcwMzIvODUzNS8yMTY3CitmIDcwMzMvODUzNi8yMTcyIDQ1NDUvODI5NC8yMTcyIDQ1NDYvODI5NS8yMTcyCitmIDQ1NDYvODUzNy8yMTcyIDcwMzQvODUzOC8yMTcyIDcwMzUvODUzOS8yMTcyCitmIDQ1NTkvODMxMC8yMTczIDQ1NDcvODI5Ni8yMTczIDQ1NDUvODI5NC8yMTczCitmIDQ1NDUvODI5NC8yMTczIDcwMzYvODUzNi8yMTczIDQ1NTkvODMxMC8yMTczCitmIDcwMzcvODU0MC8yMTc0IDQ1NDYvODI5Ny8yMTc0IDQ1NDgvODI5OC8yMTc0CitmIDQ1NDgvODU0MS8yMTc0IDcwMzgvODU0Mi8yMTc0IDcwMzkvODU0My8yMTc0CitmIDcwNDAvODU0NC8yMTc1IDQ1NDgvODI5OC8yMTc1IDQ1NDkvODI5OS8yMTc1CitmIDQ1NDkvODU0NS8yMTc1IDcwNDEvODU0Ni8yMTc1IDcwNDIvODU0Ny8yMTc1CitmIDQ1MjgvODI3MS8xMTcyIDQ1NTIvODMwMy8xMTcyIDQ1NTMvODMwMi8xMTcyCitmIDQ1NTMvODMwMi8yMjYzIDQ1MjcvODI3Mi8yMjYzIDQ1MjgvODI3MS8yMjYzCitmIDQ1MjIvODI2My8xMDQ0IDQ1NDcvODI5Ni8xMDQ0IDQ1NjAvODMxMi8xMDQ0CitmIDQ1NjAvODMxMi8xMDQ0IDQ1NTQvODMwNC8xMDQ0IDQ1MjIvODI2My8xMDQ0CitmIDcwNDMvODU0OC8xMTcyIDQ1NDkvODI5OS8xMTcyIDQ1NTMvODMwMi8xMTcyCitmIDQ1NTMvODMwMi8xMTcyIDQ1NTAvODMwMS8xMTcyIDcwNDQvODU0OC8xMTcyCitmIDQ1OTUvODM0OC8xMTcyIDQ2MDEvODM1Ny8xMTcyIDQ2MDIvODM1Ni8xMTcyCitmIDQ2MDIvODM1Ni8xMTcyIDQ1OTQvODM0OS8xMTcyIDQ1OTUvODM0OC8xMTcyCitmIDU4MzYvODM3Mi8xMDQ0IDU4MzEvODM2OS8xMDQ0IDQ2MTIvODU0OS8xMDQ0CitmIDQ2MTIvODU0OS8xMDQ0IDQ2MTcvODU1MC8xMDQ0IDU4MzYvODM3Mi8xMDQ0CitmIDQzNTkvODA0OS8xMTcyIDQ2MjgvODA1Mi8xMTcyIDQ2MDEvODM1Ny8xMTcyCitmIDQ2MDEvODM1Ny8xMTcyIDQ1OTUvODM0OC8xMTcyIDQzNTkvODA0OS8xMTcyCitmIDQ1OTQvODM0OS8xMTcyIDQ2MDIvODM1Ni8xMTcyIDQ2ODAvODQzMy8xMTcyCitmIDQ2ODAvODQzMy8xMTcyIDQ2NzgvODQzMC8xMTcyIDQ1OTQvODM0OS8xMTcyCitmIDQ2NzgvODQzMC8xMTcyIDQ2ODAvODQzMy8xMTcyIDQ1NTIvODMwMy8xMTcyCitmIDQ1NTIvODMwMy8xMTcyIDQ1MjgvODI3MS8xMTcyIDQ2NzgvODQzMC8xMTcyCitmIDQ3MzEvODU1MS82OTcgNDczMC84NTUyLzY5NyA0NzMzLzg1NTMvNjk3CitmIDQ3MzMvODU1My82OTcgNDczMi84NTU0LzY5NyA0NzMxLzg1NTEvNjk3CitmIDcwNDUvODU1NS8xOTE3IDcwNDYvODU1Ni8xOTE3IDQ3MzUvODU1Ny8xOTE3CitmIDQ3MzUvODU1OC8xOTE2IDQ3MzQvODU1OS8xOTE2IDcwNDcvODU2MC8xOTE2CitmIDQ3MzQvODU1OS8xMDQ0IDQ3MzUvODU1OC8xMDQ0IDQ3MzcvODU2MS8xMDQ0CitmIDQ3MzcvODU2MS8xMDQ0IDQ3MzYvODU2Mi8xMDQ0IDQ3MzQvODU1OS8xMDQ0CitmIDQ3MzYvODU2Mi8xMDQ0IDQ3MzcvODU2MS8xMDQ0IDQ3MzkvODU2My8xMDQ0CitmIDQ3MzkvODU2My8xMDQ0IDQ3MzgvODU2NC8xMDQ0IDQ3MzYvODU2Mi8xMDQ0CitmIDQ3MzgvODU2NC8xMDQ0IDQ3MzkvODU2My8xMDQ0IDQ3NDEvODU2NS8xMDQ0CitmIDQ3NDEvODU2NS8xMDk2IDQ3NDAvODU2Ni8xMDk2IDQ3MzgvODU2NC8xMDk2CitmIDQ3NDEvODU2NS8xNzg1IDQ3NDMvODU2Ny8xNzg1IDQ3NDIvODU2OC8xNzg1CitmIDQ3NDIvODU2OC8xNzg1IDQ3NDAvODU2Ni8xNzg1IDQ3NDEvODU2NS8xNzg1CitmIDQ3NDMvODU2OS8xNzgzIDQ3NDUvODU3MC8xNzgzIDQ3NDQvODU3MS8xNzgzCitmIDQ3NDQvODU3MS8xNzgzIDQ3NDIvODU3Mi8xNzgzIDQ3NDMvODU2OS8xNzgzCitmIDQ3NDYvODU3My82ODcgNDc0Ny84NTc0LzY4NyA0NzQ5Lzg1NzUvNjg3CitmIDQ3NDkvODU3NS82ODcgNDc0OC84NTc2LzY4NyA0NzQ2Lzg1NzMvNjg3CitmIDQ3NDgvODU3Ni82ODcgNDc0OS84NTc1LzY4NyA0NzUxLzg1NzcvNjg3CitmIDQ3NTEvODU3Ny82ODcgNDc1MC84NTc4LzY4NyA0NzQ4Lzg1NzYvNjg3CitmIDQ3NTAvODU3OC82ODcgNDc1MS84NTc3LzY4NyA0NzUzLzg1NzkvNjg3CitmIDQ3NTMvODU3OS82ODcgNDc1Mi84NTgwLzY4NyA0NzUwLzg1NzgvNjg3CitmIDQ3NTUvODU4MS82ODcgNDc1NC84NTgyLzY4NyA0NzU3Lzg1ODMvNjg3CitmIDQ3NTcvODU4My82ODcgNDc1Ni84NTg0LzY4NyA0NzU1Lzg1ODEvNjg3CitmIDQ2NjAvODQxMS82ODcgNDY3NC84NDI3LzY4NyA0NzU4Lzg1ODUvNjg3CitmIDQ3NjAvODU4Ni82OTcgNDc1OS84NTg3LzY5NyA0NzYyLzg1ODgvNjk3CitmIDQ3NjIvODU4OC82OTcgNDc2MS84NTg5LzY5NyA0NzYwLzg1ODYvNjk3CitmIDQ3NTkvODU4Ny82OTcgNDczMS84NTUxLzY5NyA0NzMyLzg1NTQvNjk3CitmIDQ3MzIvODU1NC82OTcgNDc2Mi84NTg4LzY5NyA0NzU5Lzg1ODcvNjk3CitmIDQ3NjMvODU5MC82OTcgNDczMy84NTUzLzY5NyA0NzMwLzg1NTIvNjk3CitmIDQ3MzAvODU1Mi82OTcgNDc2NC84NTkxLzY5NyA0NzYzLzg1OTAvNjk3CitmIDcwNDgvODU5Mi8xOTE3IDcwNDkvODU5My8xOTE3IDQ3NjYvODU5NC8xOTE3CitmIDQ3NjYvODU5NS8yMjY0IDQ3NjUvODU5Ni8yMjY0IDcwNTAvODU5Ny8yMjY0CitmIDcwNTEvODU5OC8xOTE2IDcwNTIvODU5OS8xOTE2IDQ3MzQvODYwMC8xOTE2CitmIDQ3MzQvODU1OS8xOTE3IDQ3NjYvODU5NS8xOTE3IDcwNTMvODYwMS8xOTE3CitmIDQ3NjcvODYwMi8xOTE3IDQ3MzUvODU1OC8xOTE3IDcwNTQvODYwMy8xOTE3CitmIDcwNTUvODYwNC8xOTE2IDcwNTYvODYwNS8xOTE2IDQ3NjcvODYwNi8xOTE2CitmIDQ3NjUvODU5Ni8xMDQ0IDQ3NjYvODU5NS8xMDQ0IDQ3NjkvODYwNy8xMDQ0CitmIDQ3NjkvODYwNy8xMDQ0IDQ3NjgvODYwOC8xMDQ0IDQ3NjUvODU5Ni8xMDQ0CitmIDQ3NjYvODU5NS8xMDQ0IDQ3MzQvODU1OS8xMDQ0IDQ3MzYvODU2Mi8xMDQ0CitmIDQ3MzYvODU2Mi8xMDQ0IDQ3NjkvODYwNy8xMDQ0IDQ3NjYvODU5NS8xMDQ0CitmIDQ3NzAvODYwOS8xMDQ0IDQ3MzcvODU2MS8xMDQ0IDQ3MzUvODU1OC8xMDQ0CitmIDQ3MzUvODU1OC8xMDQ0IDQ3NjcvODYwMi8xMDQ0IDQ3NzAvODYwOS8xMDQ0CitmIDQ3NjgvODYwOC8xMDQ0IDQ3NjkvODYwNy8xMDQ0IDQ3NzIvODYxMC8xMDQ0CitmIDQ3NzIvODYxMC8xMDQ0IDQ3NzEvODYxMS8xMDQ0IDQ3NjgvODYwOC8xMDQ0CitmIDQ3NjkvODYwNy8xMDQ0IDQ3MzYvODU2Mi8xMDQ0IDQ3MzgvODU2NC8xMDQ0CitmIDQ3MzgvODU2NC8xMDQ0IDQ3NzIvODYxMC8xMDQ0IDQ3NjkvODYwNy8xMDQ0CitmIDQ3NzMvODYxMi8xMDQ0IDQ3MzkvODU2My8xMDQ0IDQ3MzcvODU2MS8xMDQ0CitmIDQ3MzcvODU2MS8xMDQ0IDQ3NzAvODYwOS8xMDQ0IDQ3NzMvODYxMi8xMDQ0CitmIDQ3NzEvODYxMS8xMDQ0IDQ3NzIvODYxMC8xMDQ0IDQ3NzUvODYxMy8xMDQ0CitmIDQ3NzUvODYxMy8xMDQ0IDQ3NzQvODYxNC8xMDQ0IDQ3NzEvODYxMS8xMDQ0CitmIDQ3NzIvODYxMC8xMDk2IDQ3MzgvODU2NC8xMDk2IDQ3NDAvODU2Ni8xMDk2CitmIDQ3NDAvODU2Ni8xMDQ0IDQ3NzUvODYxMy8xMDQ0IDQ3NzIvODYxMC8xMDQ0CitmIDQ3NzYvODYxNS8xMDQ0IDQ3NDEvODU2NS8xMDQ0IDQ3MzkvODU2My8xMDQ0CitmIDQ3MzkvODU2My8xMDQ0IDQ3NzMvODYxMi8xMDQ0IDQ3NzYvODYxNS8xMDQ0CitmIDQ3NzUvODYxMy8xNzg1IDQ3NzgvODYxNi8xNzg1IDQ3NzcvODYxNy8xNzg1CitmIDQ3NzcvODYxNy8xNzg1IDQ3NzQvODYxNC8xNzg1IDQ3NzUvODYxMy8xNzg1CitmIDQ3NDAvODU2Ni8xNzg1IDQ3NDIvODU2OC8xNzg1IDQ3NzgvODYxNi8xNzg1CitmIDQ3NzgvODYxNi8xNzg1IDQ3NzUvODYxMy8xNzg1IDQ3NDAvODU2Ni8xNzg1CitmIDQ3NDMvODU2Ny8xNzg1IDQ3NDEvODU2NS8xNzg1IDQ3NzYvODYxNS8xNzg1CitmIDQ3NzYvODYxNS8xNzg1IDQ3NzkvODYxOC8xNzg1IDQ3NDMvODU2Ny8xNzg1CitmIDQ3NzgvODYxOS8xNzgzIDQ3ODEvODYyMC8xNzgzIDQ3ODAvODYyMS8xNzgzCitmIDQ3ODAvODYyMS8xNzgzIDQ3NzcvODYyMi8xNzgzIDQ3NzgvODYxOS8xNzgzCitmIDQ3NDIvODU3Mi8xNzgzIDQ3NDQvODU3MS8xNzgzIDQ3ODEvODYyMC8xNzgzCitmIDQ3ODEvODYyMC8xNzgzIDQ3NzgvODYxOS8xNzgzIDQ3NDIvODU3Mi8xNzgzCitmIDQ3NDUvODU3MC8xNzgzIDQ3NDMvODU2OS8xNzgzIDQ3NzkvODYyMy8xNzgzCitmIDQ3NzkvODYyMy8xNzgzIDQ3ODIvODYyNC8xNzgzIDQ3NDUvODU3MC8xNzgzCitmIDQ3ODMvODYyNS82ODcgNDc4NC84NjI2LzY4NyA0Nzg3Lzg2MjcvNjg3CitmIDQ3ODcvODYyNy82ODcgNDc4Ni84NjI4LzY4NyA0NzgzLzg2MjUvNjg3CitmIDQ3ODQvODYyNi82ODcgNDc0Ni84NTczLzY4NyA0NzQ4Lzg1NzYvNjg3CitmIDQ3NDgvODU3Ni82ODcgNDc4Ny84NjI3LzY4NyA0Nzg0Lzg2MjYvNjg3CitmIDQ3ODgvODYyOS82ODcgNDc0OS84NTc1LzY4NyA0NzQ3Lzg1NzQvNjg3CitmIDQ3NDcvODU3NC82ODcgNDc4NS84NjMwLzY4NyA0Nzg4Lzg2MjkvNjg3CitmIDQ3ODYvODYyOC82ODcgNDc4Ny84NjI3LzY4NyA0NzkwLzg2MzEvNjg3CitmIDQ3OTAvODYzMS82ODcgNDc4OS84NjMyLzY4NyA0Nzg2Lzg2MjgvNjg3CitmIDQ3ODcvODYyNy82ODcgNDc0OC84NTc2LzY4NyA0NzUwLzg1NzgvNjg3CitmIDQ3NTAvODU3OC82ODcgNDc5MC84NjMxLzY4NyA0Nzg3Lzg2MjcvNjg3CitmIDQ3OTEvODYzMy82ODcgNDc1MS84NTc3LzY4NyA0NzQ5Lzg1NzUvNjg3CitmIDQ3NDkvODU3NS82ODcgNDc4OC84NjI5LzY4NyA0NzkxLzg2MzMvNjg3CitmIDQ3OTAvODYzMS82ODcgNDc1MC84NTc4LzY4NyA0NzUyLzg1ODAvNjg3CitmIDQ3NTIvODU4MC82ODcgNDc5Mi84NjM0LzY4NyA0NzkwLzg2MzEvNjg3CitmIDQ3OTQvODYzNS82ODcgNDc5My84NjM2LzY4NyA0NzU0Lzg1ODIvNjg3CitmIDQ3NTQvODU4Mi82ODcgNDc1NS84NTgxLzY4NyA0Nzk0Lzg2MzUvNjg3CitmIDQ2NTkvODQwOC82ODcgNDc5NS84NjM3LzY4NyA0ODE4Lzg2MzgvNjg3CitmIDQ4MTgvODYzOC82ODcgNDY3My84NDI2LzY4NyA0NjU5Lzg0MDgvNjg3CitmIDQ3OTcvODYzOS82ODcgNDc5Ni84NjQwLzY4NyA0Nzk5Lzg2NDEvNjg3CitmIDQ3OTkvODY0MS82ODcgNDc5OC84NjQyLzY4NyA0Nzk3Lzg2MzkvNjg3CitmIDQ4MDAvODY0My82ODcgNDgwMy84NjQ0LzY4NyA0ODAyLzg2NDUvNjg3CitmIDQ4MDIvODY0NS82ODcgNDgwMS84NjQ2LzY4NyA0ODAwLzg2NDMvNjg3CitmIDQ4MDUvODY0Ny82ODcgNDgwNC84NjQ4LzY4NyA0ODA3Lzg2NDkvNjg3CitmIDQ4MDcvODY0OS82ODcgNDgwNi84NjUwLzY4NyA0ODA1Lzg2NDcvNjg3CitmIDQ4MDgvODY1MS82ODcgNDgxMS84NjUyLzY4NyA0ODEwLzg2NTMvNjg3CitmIDQ4MTAvODY1My82ODcgNDgwOS84NjU0LzY4NyA0ODA4Lzg2NTEvNjg3CitmIDQ3NTUvODU4MS82ODcgNDgxMi84NjU1LzY4NyA0ODEzLzg2NTYvNjg3CitmIDQ4MTMvODY1Ni82ODcgNDc5NC84NjM1LzY4NyA0NzU1Lzg1ODEvNjg3CitmIDQ4MTUvODY1Ny82ODcgNDgxNC84NjU4LzY4NyA0ODAyLzg2NDUvNjg3CitmIDQ4MDIvODY0NS82ODcgNDgwMy84NjQ0LzY4NyA0ODE1Lzg2NTcvNjg3CitmIDQ4MTUvODY1Ny82ODcgNDgxNi84NjU5LzY4NyA0ODE3Lzg2NjAvNjg3CitmIDQ4MTcvODY2MC82ODcgNDgxNC84NjU4LzY4NyA0ODE1Lzg2NTcvNjg3CitmIDQ3NTUvODU4MS82ODcgNDc1Ni84NTg0LzY4NyA0ODEwLzg2NTMvNjg3CitmIDQ4MTAvODY1My82ODcgNDgxMi84NjU1LzY4NyA0NzU1Lzg1ODEvNjg3CitmIDQ2NzMvODQyNi82ODcgNDgxOC84NjM4LzY4NyA0Njc3Lzg0MjkvNjg3CitmIDQ2NTkvODQwOC82ODcgNDY2MC84NDExLzY4NyA0NzU4Lzg1ODUvNjg3CitmIDQ3NTgvODU4NS82ODcgNDc5NS84NjM3LzY4NyA0NjU5Lzg0MDgvNjg3CitmIDQ3MDUvODQ1Ny82OTcgNDc2MC84NTg2LzY5NyA0NzYxLzg1ODkvNjk3CitmIDQ3NjEvODU4OS82OTcgNDcwNC84NDU4LzY5NyA0NzA1Lzg0NTcvNjk3CitmIDcwNTcvODY2MS8yMjY0IDcwNTgvODY2Mi8yMjY0IDQ3NjUvODY2My8yMjY0CitmIDQ3NjUvODU5Ni8xOTE2IDQ1NTgvODMxMS8xOTE2IDcwNTkvODY2NC8xOTE2CitmIDQ1NTgvODMxMS8xMDQ0IDQ3NjUvODU5Ni8xMDQ0IDQ3NjgvODYwOC8xMDQ0CitmIDQ3NjgvODYwOC8xMDQ0IDQ1NjAvODMxMi8xMDQ0IDQ1NTgvODMxMS8xMDQ0CitmIDQ1NjAvODMxMi8xMDQ0IDQ3NjgvODYwOC8xMDQ0IDQ3NzEvODYxMS8xMDQ0CitmIDQ3NzEvODYxMS8xMDQ0IDQ1NTQvODMwNC8xMDQ0IDQ1NjAvODMxMi8xMDQ0CitmIDQ1NTQvODMwNC8xMDQ0IDQ3NzEvODYxMS8xMDQ0IDQ3NzQvODYxNC8xMDQ0CitmIDQ3NzQvODYxNC8xMDQ0IDQ1NTUvODMwNS8xMDQ0IDQ1NTQvODMwNC8xMDQ0CitmIDQ3NzQvODYxNC8xNzg1IDQ3NzcvODYxNy8xNzg1IDQ1NTYvODMwNi8xNzg1CitmIDQ1NTYvODMwNi8xNzg1IDQ1NTUvODMwNS8xNzg1IDQ3NzQvODYxNC8xNzg1CitmIDQ3NzcvODYyMi8xNzgzIDQ3ODAvODYyMS8xNzgzIDQ1NTcvODMwOS8xNzgzCitmIDQ1NTcvODMwOS8xNzgzIDQ1NTYvODMwOC8xNzgzIDQ3NzcvODYyMi8xNzgzCitmIDQ1NjkvODMyMy82ODcgNDc4My84NjI1LzY4NyA0Nzg2Lzg2MjgvNjg3CitmIDQ3ODYvODYyOC82ODcgNDU3OC84MzMyLzY4NyA0NTY5LzgzMjMvNjg3CitmIDQ1NzgvODMzMi82ODcgNDc4Ni84NjI4LzY4NyA0Nzg5Lzg2MzIvNjg3CitmIDQ3ODkvODYzMi82ODcgNDU4MC84MzM0LzY4NyA0NTc4LzgzMzIvNjg3CitmIDQ3MDYvODQ1OS82OTcgNDc2My84NTkwLzY5NyA0NzY0Lzg1OTEvNjk3CitmIDQ3NjQvODU5MS82OTcgNDcwNy84NDYwLzY5NyA0NzA2Lzg0NTkvNjk3CitmIDcwNjAvODY2NS8xOTE2IDQ3NjcvODY2Ni8xOTE2IDcwNjEvODY2Ny8xOTE2CitmIDcwNjIvODY2OC8xOTE2IDcwNjMvODY2OS8xOTE2IDcwNjQvODY3MC8xOTE2CitmIDQ2MTcvODU1MC8xMDQ0IDQ3NzAvODYwOS8xMDQ0IDQ3NjcvODYwMi8xMDQ0CitmIDQ3NjcvODYwMi8xMDQ0IDcwNjUvODY3MS8xMDQ0IDQ2MTcvODU1MC8xMDQ0CitmIDQ2MTIvODU0OS8xMDQ0IDQ3NzMvODYxMi8xMDQ0IDQ3NzAvODYwOS8xMDQ0CitmIDQ3NzAvODYwOS8xMDQ0IDQ2MTcvODU1MC8xMDQ0IDQ2MTIvODU0OS8xMDQ0CitmIDQ2MTMvODM4Ni8xMDQ0IDQ3NzYvODYxNS8xMDQ0IDQ3NzMvODYxMi8xMDQ0CitmIDQ3NzMvODYxMi8xMDQ0IDQ2MTIvODU0OS8xMDQ0IDQ2MTMvODM4Ni8xMDQ0CitmIDQ3NzkvODYxOC8xNzg1IDQ3NzYvODYxNS8xNzg1IDQ2MTMvODM4Ni8xNzg1CitmIDQ2MTMvODM4Ni8xNzg1IDQ2MTQvODM4OC8xNzg1IDQ3NzkvODYxOC8xNzg1CitmIDQ3ODIvODYyNC8xNzgzIDQ3NzkvODYyMy8xNzgzIDQ2MTQvODY3Mi8xNzgzCitmIDQ2MTQvODY3Mi8xNzgzIDQ2MTUvODM4OS8xNzgzIDQ3ODIvODYyNC8xNzgzCitmIDQ2MjAvODY3My82ODcgNDc4OC84NjI5LzY4NyA0Nzg1Lzg2MzAvNjg3CitmIDQ3ODUvODYzMC82ODcgNDYxOS84Njc0LzY4NyA0NjIwLzg2NzMvNjg3CitmIDQ2MjEvODY3NS82ODcgNDc5MS84NjMzLzY4NyA0Nzg4Lzg2MjkvNjg3CitmIDQ3ODgvODYyOS82ODcgNDYyMC84NjczLzY4NyA0NjIxLzg2NzUvNjg3CitmIDQ4MTkvODY3Ni82ODcgNDgwMC84NjQzLzY4NyA0ODAxLzg2NDYvNjg3CitmIDQ4MDEvODY0Ni82ODcgNDgyMC84Njc3LzY4NyA0ODE5Lzg2NzYvNjg3CitmIDQ4MDQvODY0OC82ODcgNDgwNS84NjQ3LzY4NyA0ODE3Lzg2NjAvNjg3CitmIDQ4MTcvODY2MC82ODcgNDgxNi84NjU5LzY4NyA0ODA0Lzg2NDgvNjg3CitmIDQ3OTYvODY0MC82ODcgNDc5Ny84NjM5LzY4NyA0ODEzLzg2NTYvNjg3CitmIDQ4MTMvODY1Ni82ODcgNDgyMS84Njc4LzY4NyA0Nzk2Lzg2NDAvNjg3CitmIDQ4MjIvODY3OS82ODcgNDgwOC84NjUxLzY4NyA0ODA5Lzg2NTQvNjg3CitmIDQ4MDkvODY1NC82ODcgNDgyMy84NjgwLzY4NyA0ODIyLzg2NzkvNjg3CitmIDQ4MTkvODY3Ni82ODcgNDgyMC84Njc3LzY4NyA0ODI1Lzg2ODEvNjg3CitmIDQ4MjUvODY4MS82ODcgNDgyNC84NjgyLzY4NyA0ODE5Lzg2NzYvNjg3CitmIDQ2ODUvODQzOS82ODcgNDY3Ny84NDI5LzY4NyA0ODA2Lzg2NTAvNjg3CitmIDQ4MDYvODY1MC82ODcgNDgyNi84NjgzLzY4NyA0Njg1Lzg0MzkvNjg3CitmIDQ4MjIvODY3OS82ODcgNDgyMy84NjgwLzY4NyA0ODI2Lzg2ODMvNjg3CitmIDQ4MjYvODY4My82ODcgNDgyNy84Njg0LzY4NyA0ODIyLzg2NzkvNjg3CitmIDQ3OTgvODY0Mi82ODcgNDgyOS84MzM4LzY4NyA1ODUwLzg2ODUvNjg3CitmIDQ4MDEvODY0Ni82ODcgNDgwMi84NjQ1LzY4NyA0NzU4Lzg1ODUvNjg3CitmIDQ4MTgvODYzOC82ODcgNDgwNS84NjQ3LzY4NyA0ODA2Lzg2NTAvNjg3CitmIDQ4MDYvODY1MC82ODcgNDY3Ny84NDI5LzY4NyA0ODE4Lzg2MzgvNjg3CitmIDQ4MDkvODY1NC82ODcgNDgxMC84NjUzLzY4NyA0NzU2Lzg1ODQvNjg3CitmIDQ3NTYvODU4NC82ODcgNDgzMC84Njg2LzY4NyA0ODA5Lzg2NTQvNjg3CitmIDQ4MjAvODY3Ny82ODcgNDgwMS84NjQ2LzY4NyA0NzU4Lzg1ODUvNjg3CitmIDQ3NTgvODU4NS82ODcgNDY3NC84NDI3LzY4NyA0ODIwLzg2NzcvNjg3CitmIDQ4MTcvODY2MC82ODcgNDgwNS84NjQ3LzY4NyA0ODE4Lzg2MzgvNjg3CitmIDQ3OTQvODYzNS82ODcgNDgxMy84NjU2LzY4NyA0Nzk3Lzg2MzkvNjg3CitmIDQ3OTcvODYzOS82ODcgNDgyOC84Njg3LzY4NyA0Nzk0Lzg2MzUvNjg3CitmIDQ4MjMvODY4MC82ODcgNDgwOS84NjU0LzY4NyA0ODMwLzg2ODYvNjg3CitmIDQ4MzAvODY4Ni82ODcgNDgzMS84Njg4LzY4NyA0ODIzLzg2ODAvNjg3CitmIDQ4MjUvODY4MS82ODcgNDc5OC84NjQyLzY4NyA0Nzk5Lzg2NDEvNjg3CitmIDQ3OTkvODY0MS82ODcgNDgyNC84NjgyLzY4NyA0ODI1Lzg2ODEvNjg3CitmIDQ2ODMvODQzNi82ODcgNDgyNS84NjgxLzY4NyA0ODIwLzg2NzcvNjg3CitmIDQ4MjAvODY3Ny82ODcgNDY3NC84NDI3LzY4NyA0NjgzLzg0MzYvNjg3CitmIDQ4MjYvODY4My82ODcgNDgwNi84NjUwLzY4NyA0ODA3Lzg2NDkvNjg3CitmIDQ4MDcvODY0OS82ODcgNDgyNy84Njg0LzY4NyA0ODI2Lzg2ODMvNjg3CitmIDQ3OTUvODYzNy82ODcgNDc1OC84NTg1LzY4NyA0ODAyLzg2NDUvNjg3CitmIDQ4MDIvODY0NS82ODcgNDgxNC84NjU4LzY4NyA0Nzk1Lzg2MzcvNjg3CitmIDQ3OTUvODYzNy82ODcgNDgxNC84NjU4LzY4NyA0ODE3Lzg2NjAvNjg3CitmIDQ4MTcvODY2MC82ODcgNDgxOC84NjM4LzY4NyA0Nzk1Lzg2MzcvNjg3CitmIDQ4MzIvODY4OS82ODcgNDgyMS84Njc4LzY4NyA0ODEzLzg2NTYvNjg3CitmIDQ4MTMvODY1Ni82ODcgNDgxMi84NjU1LzY4NyA0ODMyLzg2ODkvNjg3CitmIDQ4MzIvODY4OS82ODcgNDgxMi84NjU1LzY4NyA0ODEwLzg2NTMvNjg3CitmIDQ4MTAvODY1My82ODcgNDgxMS84NjUyLzY4NyA0ODMyLzg2ODkvNjg3CitmIDQ4MzMvODY5MC82ODcgNDc1My84NTc5LzY4NyA0NzUxLzg1NzcvNjg3CitmIDQ3NTEvODU3Ny82ODcgNDc5MS84NjMzLzY4NyA0ODMzLzg2OTAvNjg3CitmIDQ3OTAvODYzMS82ODcgNDc5Mi84NjM0LzY4NyA0ODM0Lzg2OTEvNjg3CitmIDQ4MzQvODY5MS82ODcgNDc4OS84NjMyLzY4NyA0NzkwLzg2MzEvNjg3CitmIDQ4MzUvODY5Mi82ODcgNDc5Mi84NjM0LzY4NyA0NzUyLzg1ODAvNjg3CitmIDQ3NTIvODU4MC82ODcgNDgzNi84NjkzLzY4NyA0ODM1Lzg2OTIvNjg3CitmIDQ4MzYvODY5My82ODcgNDc1Mi84NTgwLzY4NyA0NzUzLzg1NzkvNjg3CitmIDQ3NTMvODU3OS82ODcgNDgzNy84Njk0LzY4NyA0ODM2Lzg2OTMvNjg3CitmIDQ4MzgvODY5NS82ODcgNDg0MS84Njk2LzY4NyA0ODQwLzg2OTcvNjg3CitmIDQ4NDAvODY5Ny82ODcgNDgzOS84Njk4LzY4NyA0ODM4Lzg2OTUvNjg3CitmIDQ3NTYvODU4NC82ODcgNDc1Ny84NTgzLzY4NyA0ODQyLzg2OTkvNjg3CitmIDQ4NDIvODY5OS82ODcgNDgzMC84Njg2LzY4NyA0NzU2Lzg1ODQvNjg3CitmIDQ4NDIvODY5OS82ODcgNDc1Ny84NTgzLzY4NyA0ODQ0Lzg3MDAvNjg3CitmIDQ4NDQvODcwMC82ODcgNDg0My84NzAxLzY4NyA0ODQyLzg2OTkvNjg3CitmIDQ4NDQvODcwMC82ODcgNDc1Ny84NTgzLzY4NyA0NzU0Lzg1ODIvNjg3CitmIDQ3NTQvODU4Mi82ODcgNDg0NS84NzAyLzY4NyA0ODQ0Lzg3MDAvNjg3CitmIDQ4NDUvODcwMi82ODcgNDc1NC84NTgyLzY4NyA0NzkzLzg2MzYvNjg3CitmIDQ3OTMvODYzNi82ODcgNDg0Ni84NzAzLzY4NyA0ODQ1Lzg3MDIvNjg3CitmIDQ4NDcvODcwNC82ODcgNDg1MC84NzA1LzY4NyA0ODQ5Lzg3MDYvNjg3CitmIDQ4NDkvODcwNi82ODcgNDg0OC84NzA3LzY4NyA0ODQ3Lzg3MDQvNjg3CitmIDQ4NDkvODcwNi82ODcgNDg1MC84NzA1LzY4NyA0ODUyLzg3MDgvNjg3CitmIDQ4NTIvODcwOC82ODcgNDg1MS84NzA5LzY4NyA0ODQ5Lzg3MDYvNjg3CitmIDQ4NTEvODcwOS82ODcgNDg1Mi84NzA4LzY4NyA0ODM0Lzg2OTEvNjg3CitmIDQ4MzQvODY5MS82ODcgNDg1My84NzEwLzY4NyA0ODUxLzg3MDkvNjg3CitmIDQ4MzUvODY5Mi82ODcgNDg1My84NzEwLzY4NyA0ODM0Lzg2OTEvNjg3CitmIDQ4MzQvODY5MS82ODcgNDc5Mi84NjM0LzY4NyA0ODM1Lzg2OTIvNjg3CitmIDQ4MzMvODY5MC82ODcgNDg1NC84NzExLzY4NyA0ODM3Lzg2OTQvNjg3CitmIDQ4MzcvODY5NC82ODcgNDc1My84NTc5LzY4NyA0ODMzLzg2OTAvNjg3CitmIDQ4MzkvODY5OC82ODcgNDg0MC84Njk3LzY4NyA0ODU0Lzg3MTEvNjg3CitmIDQ4NTQvODcxMS82ODcgNDgzMy84NjkwLzY4NyA0ODM5Lzg2OTgvNjg3CitmIDQ4NDEvODY5Ni82ODcgNDgzOC84Njk1LzY4NyA0ODU2Lzg3MTIvNjg3CitmIDQ4NTYvODcxMi82ODcgNDg1NS84NzEzLzY4NyA0ODQxLzg2OTYvNjg3CitmIDQ4NDIvODY5OS82ODcgNDg0My84NzAxLzY4NyA0ODU1Lzg3MTMvNjg3CitmIDQ4NTUvODcxMy82ODcgNDg1Ni84NzEyLzY4NyA0ODQyLzg2OTkvNjg3CitmIDQ4NTcvODcxNC82ODcgNDg1OC84NzE1LzY4NyA0ODQ2Lzg3MDMvNjg3CitmIDQ4NDYvODcwMy82ODcgNDc5My84NjM2LzY4NyA0ODU3Lzg3MTQvNjg3CitmIDQ4NDcvODcwNC82ODcgNDg0OC84NzA3LzY4NyA0ODU4Lzg3MTUvNjg3CitmIDQ4NTgvODcxNS82ODcgNDg1Ny84NzE0LzY4NyA0ODQ3Lzg3MDQvNjg3CitmIDQ1ODIvODMzNi82ODcgNDg1MC84NzA1LzY4NyA0ODQ3Lzg3MDQvNjg3CitmIDQ4NDcvODcwNC82ODcgNTg1MC84Njg1LzY4NyA0ODI5LzgzMzgvNjg3CitmIDQ4MjkvODMzOC82ODcgNDU4Mi84MzM2LzY4NyA0ODQ3Lzg3MDQvNjg3CitmIDQ4MzgvODY5NS82ODcgNDYyMi84NzE2LzY4NyA0ODU2Lzg3MTIvNjg3CitmIDQ4MzkvODY5OC82ODcgNDgzMy84NjkwLzY4NyA0NzkxLzg2MzMvNjg3CitmIDQ3OTEvODYzMy82ODcgNDYyMS84Njc1LzY4NyA0ODM5Lzg2OTgvNjg3CitmIDQ4MzkvODY5OC82ODcgNDYyMS84Njc1LzY4NyA0NjIyLzg3MTYvNjg3CitmIDQ2MjIvODcxNi82ODcgNDgzOC84Njk1LzY4NyA0ODM5Lzg2OTgvNjg3CitmIDQ3OTQvODYzNS82ODcgNDgyOC84Njg3LzY4NyA0ODU3Lzg3MTQvNjg3CitmIDQ4NTcvODcxNC82ODcgNDc5My84NjM2LzY4NyA0Nzk0Lzg2MzUvNjg3CitmIDQ4MzEvODY4OC82ODcgNDgzMC84Njg2LzY4NyA0ODQyLzg2OTkvNjg3CitmIDQ4NDIvODY5OS82ODcgNDg1Ni84NzEyLzY4NyA0ODMxLzg2ODgvNjg3CitmIDQ3ODkvODYzMi82ODcgNDgzNC84NjkxLzY4NyA0ODUyLzg3MDgvNjg3CitmIDQ4NTIvODcwOC82ODcgNDU4MC84MzM0LzY4NyA0Nzg5Lzg2MzIvNjg3CitmIDQ1ODIvODMzNi82ODcgNDU4MC84MzM0LzY4NyA0ODUyLzg3MDgvNjg3CitmIDQ4NTIvODcwOC82ODcgNDg1MC84NzA1LzY4NyA0NTgyLzgzMzYvNjg3CitmIDQ4MjMvODY4MC82ODcgNDYyMy84NDQxLzY4NyA0Njg1Lzg0MzkvNjg3CitmIDQ2ODUvODQzOS82ODcgNDgyNi84NjgzLzY4NyA0ODIzLzg2ODAvNjg3CitmIDQ2MjMvODQ0MS82ODcgNDgzMS84Njg4LzY4NyA0ODU2Lzg3MTIvNjg3CitmIDQ4NTYvODcxMi82ODcgNDYyMi84NzE2LzY4NyA0NjIzLzg0NDEvNjg3CitmIDQ4MjkvODMzOC82ODcgNDc5OC84NjQyLzY4NyA0ODI1Lzg2ODEvNjg3CitmIDQ4MjUvODY4MS82ODcgNDY4My84NDM2LzY4NyA0ODI5LzgzMzgvNjg3CitmIDQ3OTYvODY0MC8yMjY1IDQ4MjEvODY3OC8yMjY1IDQ4NjAvODcxNy8yMjY1CitmIDQ4NjAvODcxNy8yMjY2IDQ4NTkvODcxOC8yMjY2IDQ3OTYvODY0MC8yMjY2CitmIDQ3OTkvODY0MS8yMjY3IDQ3OTYvODY0MC8yMjY3IDQ4NTkvODcxOC8yMjY3CitmIDQ4NTkvODcxOC8yMjY4IDQ4NjEvODcxOS8yMjY4IDQ3OTkvODY0MS8yMjY4CitmIDQ4MjQvODY4Mi8yMjY5IDQ3OTkvODY0MS8yMjY5IDQ4NjEvODcxOS8yMjY5CitmIDQ4NjEvODcxOS8yMjcwIDQ4NjIvODcyMC8yMjcwIDQ4MjQvODY4Mi8yMjcwCitmIDQ4MTkvODY3Ni8yMjcxIDQ4MjQvODY4Mi8yMjcxIDQ4NjIvODcyMC8yMjcxCitmIDQ4NjIvODcyMC8yMjcyIDQ4NjMvODcyMS8yMjcyIDQ4MTkvODY3Ni8yMjcyCitmIDQ4MDAvODY0My8yMjczIDQ4MTkvODY3Ni8yMjczIDQ4NjMvODcyMS8yMjczCitmIDQ4NjMvODcyMS8yMjc0IDQ4NjQvODcyMi8yMjc0IDQ4MDAvODY0My8yMjc0CitmIDQ4MDMvODY0NC8yMjc1IDQ4MDAvODY0My8yMjc1IDQ4NjQvODcyMi8yMjc1CitmIDQ4NjQvODcyMi8yMjc2IDQ4NjUvODcyMy8yMjc2IDQ4MDMvODY0NC8yMjc2CitmIDQ4MTUvODY1Ny8yMjc3IDQ4MDMvODY0NC8yMjc3IDQ4NjUvODcyMy8yMjc3CitmIDQ4NjUvODcyMy8yMjc4IDQ4NjYvODcyNC8yMjc4IDQ4MTUvODY1Ny8yMjc4CitmIDQ4MTYvODY1OS8yMjc4IDQ4MTUvODY1Ny8yMjc4IDQ4NjYvODcyNC8yMjc4CitmIDQ4NjYvODcyNC8yMjc3IDQ4NjcvODcyNS8yMjc3IDQ4MTYvODY1OS8yMjc3CitmIDQ4MDQvODY0OC8yMjc5IDQ4MTYvODY1OS8yMjc5IDQ4NjcvODcyNS8yMjc5CitmIDQ4NjcvODcyNS8yMjgwIDQ4NjgvODcyNi8yMjgwIDQ4MDQvODY0OC8yMjgwCitmIDQ4MDcvODY0OS8yMjgxIDQ4MDQvODY0OC8yMjgxIDQ4NjgvODcyNi8yMjgxCitmIDQ4NjgvODcyNi8yMjgyIDQ4NjkvODcyNy8yMjgyIDQ4MDcvODY0OS8yMjgyCitmIDQ4MjcvODY4NC8yMjgzIDQ4MDcvODY0OS8yMjgzIDQ4NjkvODcyNy8yMjgzCitmIDQ4NjkvODcyNy8yMjg0IDQ4NzAvODcyOC8yMjg0IDQ4MjcvODY4NC8yMjg0CitmIDQ4MjIvODY3OS8yMjg1IDQ4MjcvODY4NC8yMjg1IDQ4NzAvODcyOC8yMjg1CitmIDQ4NzAvODcyOC8yMjg2IDQ4NzEvODcyOS8yMjg2IDQ4MjIvODY3OS8yMjg2CitmIDQ4MDgvODY1MS8yMjg3IDQ4MjIvODY3OS8yMjg3IDQ4NzEvODcyOS8yMjg3CitmIDQ4NzEvODcyOS8yMjg4IDQ4NzIvODczMC8yMjg4IDQ4MDgvODY1MS8yMjg4CitmIDQ4MTEvODY1Mi8yMjg5IDQ4MDgvODY1MS8yMjg5IDQ4NzIvODczMC8yMjg5CitmIDQ4NzIvODczMC8yMjkwIDQ4NzMvODczMS8yMjkwIDQ4MTEvODY1Mi8yMjkwCitmIDQ4MzIvODY4OS8yMjkxIDQ4MTEvODY1Mi8yMjkxIDQ4NzMvODczMS8yMjkxCitmIDQ4NzMvODczMS8yMjkyIDQ4NzQvODczMi8yMjkyIDQ4MzIvODY4OS8yMjkyCitmIDQ4MjEvODY3OC8yMjkzIDQ4MzIvODY4OS8yMjkzIDQ4NzQvODczMi8yMjkzCitmIDQ4NzQvODczMi8yMjk0IDQ4NjAvODcxNy8yMjk0IDQ4MjEvODY3OC8yMjk0CitmIDQ4NDkvODcwNi8yMjk1IDQ4NTEvODcwOS8yMjk1IDQ4NzYvODczMy8yMjk1CitmIDQ4NzYvODczMy8yMjk2IDQ4NzUvODczNC8yMjk2IDQ4NDkvODcwNi8yMjk2CitmIDQ4NDgvODcwNy8yMjk3IDQ4NDkvODcwNi8yMjk3IDQ4NzUvODczNC8yMjk3CitmIDQ4NzUvODczNC8yMjk4IDQ4NzcvODczNS8yMjk4IDQ4NDgvODcwNy8yMjk4CitmIDQ4NTgvODcxNS8yMjk5IDQ4NDgvODcwNy8yMjk5IDQ4NzcvODczNS8yMjk5CitmIDQ4NzcvODczNS8yMzAwIDQ4NzgvODczNi8yMzAwIDQ4NTgvODcxNS8yMzAwCitmIDQ4NDYvODcwMy8yMzAxIDQ4NTgvODcxNS8yMzAxIDQ4NzgvODczNi8yMzAxCitmIDQ4NzgvODczNi8yMzAyIDQ4NzkvODczNy8yMzAyIDQ4NDYvODcwMy8yMzAyCitmIDQ4NDUvODcwMi8yMzAzIDQ4NDYvODcwMy8yMzAzIDQ4NzkvODczNy8yMzAzCitmIDQ4NzkvODczNy8yMzA0IDQ4ODAvODczOC8yMzA0IDQ4NDUvODcwMi8yMzA0CitmIDQ4NDQvODcwMC8yMjc4IDQ4NDUvODcwMi8yMjc4IDQ4ODAvODczOC8yMjc4CitmIDQ4ODAvODczOC8yMzA1IDQ4ODEvODczOS8yMzA1IDQ4NDQvODcwMC8yMzA1CitmIDQ4NDMvODcwMS8yMzA2IDQ4NDQvODcwMC8yMzA2IDQ4ODEvODczOS8yMzA2CitmIDQ4ODEvODczOS8yMzA3IDQ4ODIvODc0MC8yMzA3IDQ4NDMvODcwMS8yMzA3CitmIDQ4NTUvODcxMy8yMzA4IDQ4NDMvODcwMS8yMzA4IDQ4ODIvODc0MC8yMzA4CitmIDQ4ODIvODc0MC8yMzA5IDQ4ODMvODc0MS8yMzA5IDQ4NTUvODcxMy8yMzA5CitmIDQ4NDEvODY5Ni8yMzEwIDQ4NTUvODcxMy8yMzEwIDQ4ODMvODc0MS8yMzEwCitmIDQ4ODMvODc0MS8yMzExIDQ4ODQvODc0Mi8yMzExIDQ4NDEvODY5Ni8yMzExCitmIDQ4NDAvODY5Ny8yMzEyIDQ4NDEvODY5Ni8yMzEyIDQ4ODQvODc0Mi8yMzEyCitmIDQ4ODQvODc0Mi8yMzEzIDQ4ODUvODc0My8yMzEzIDQ4NDAvODY5Ny8yMzEzCitmIDQ4NTQvODcxMS8yMzE0IDQ4NDAvODY5Ny8yMzE0IDQ4ODUvODc0My8yMzE0CitmIDQ4ODUvODc0My8yMzE1IDQ4ODYvODc0NC8yMzE1IDQ4NTQvODcxMS8yMzE1CitmIDQ4MzcvODY5NC8yMzE2IDQ4NTQvODcxMS8yMzE2IDQ4ODYvODc0NC8yMzE2CitmIDQ4ODYvODc0NC8yMzE3IDQ4ODcvODc0NS8yMzE3IDQ4MzcvODY5NC8yMzE3CitmIDQ4MzYvODY5My8yMjkxIDQ4MzcvODY5NC8yMjkxIDQ4ODcvODc0NS8yMjkxCitmIDQ4ODcvODc0NS8yMjkyIDQ4ODgvODc0Ni8yMjkyIDQ4MzYvODY5My8yMjkyCitmIDQ4MzUvODY5Mi8yMzE4IDQ4MzYvODY5My8yMzE4IDQ4ODgvODc0Ni8yMzE4CitmIDQ4ODgvODc0Ni8yMzE5IDQ4ODkvODc0Ny8yMzE5IDQ4MzUvODY5Mi8yMzE5CitmIDQ4NTMvODcxMC8yMzIwIDQ4MzUvODY5Mi8yMzIwIDQ4ODkvODc0Ny8yMzIwCitmIDQ4ODkvODc0Ny8yMzIxIDQ4OTAvODc0OC8yMzIxIDQ4NTMvODcxMC8yMzIxCitmIDQ4NTEvODcwOS8yMzIyIDQ4NTMvODcxMC8yMzIyIDQ4OTAvODc0OC8yMzIyCitmIDQ4OTAvODc0OC8yMzIzIDQ4NzYvODczMy8yMzIzIDQ4NTEvODcwOS8yMzIzCitmIDQzODEvODExNi82ODcgNDQyNy84MTI2LzY4NyA0ODkxLzgyNTYvNjg3CitmIDQ4OTEvODI1Ni82ODcgNDQ5OS84MjQ2LzY4NyA0MzgxLzgxMTYvNjg3CitmIDQ5MjYvODc0OS8yMzI0IDQ5MjUvODc1MC8yMzI0IDcwNjYvODc1MS8yMzI0CitmIDcwNjcvODc1Mi8yMzI0IDcwNjgvODc1My8yMzI0IDQ5MjYvODc1NC8yMzI0CitmIDcwNjkvODc1NS8yMzI1IDQ5MjcvODc1Ni8yMzI1IDcwNzAvODc1Ni8yMzI1CitmIDcwNzEvODc1Ny8yMzI1IDcwNzIvODc1OC8yMzI1IDcwNzMvODc1OC8yMzI1CitmIDQ5MjcvODc1OS8yMzI2IDQ5MjgvODc2MC8yMzI2IDcwNzQvODc2MS8yMzI2CitmIDcwNzUvODc2Mi8yMzI2IDcwNzYvODc2My8yMzI2IDQ5MjcvODc2NC8yMzI2CitmIDQ5MjgvODc2MC8yMzI3IDQ5MjkvODc2NS8yMzI3IDcwNzcvODc2Ni8yMzI3CitmIDcwNzgvODc2Ny8yMzI3IDcwNzkvODc2OC8yMzI3IDQ5MjgvODc2OS8yMzI3CitmIDQ5MjkvODc2NS8yMzI4IDQ5MzAvODc3MC8yMzI4IDcwODAvODc3MS8yMzI4CitmIDcwODEvODc3Mi8yMzI5IDcwODIvODc3My8yMzI5IDQ5MjkvODc3NC8yMzI5CitmIDcwODMvODc3NS8yMzMwIDQ5MzEvODc3Ni8yMzMwIDcwODQvODc3Ny8yMzMwCitmIDcwODUvODc3OC8yMzMwIDcwODYvODc3OS8yMzMwIDcwODcvODc3OS8yMzMwCitmIDQ5MzEvODc4MC8yMzMxIDQ5MzIvODc4MS8yMzMxIDcwODgvODc4MS8yMzMxCitmIDcwODkvODc4Mi8yMzMxIDcwOTAvODc4My8yMzMxIDQ5MzEvODc4NC8yMzMxCitmIDQ5MzIvODc4MS8yMzMyIDQ5MzMvODc4NS8yMzMyIDcwOTEvODc4NS8yMzMyCitmIDcwOTIvODc4Ni8yMzMyIDcwOTMvODc4Ny8yMzMyIDQ5MzIvODc4OC8yMzMyCitmIDQ5MzMvODc4NS8yMzMzIDQ5MzQvODc4OS8yMzMzIDcwOTQvODc4OS8yMzMzCitmIDcwOTUvODc5MC8yMzMzIDcwOTYvODc5MS8yMzMzIDQ5MzMvODc5MS8yMzMzCitmIDcwOTcvODc5Mi8yMzM0IDQ5MzUvODc5My8yMzM0IDcwOTgvODc5NC8yMzM0CitmIDcwOTkvODc5NS8yMzM0IDcxMDAvODc5Ni8yMzM0IDcxMDEvODc5Ny8yMzM0CitmIDQ5MzUvODc5OC8yMzM1IDQ5MzYvODc5OS8yMzM1IDcxMDIvODgwMC8yMzM1CitmIDcxMDMvODgwMS8yMzM1IDcxMDQvODgwMi8yMzM1IDQ5MzUvODgwMy8yMzM1CitmIDQ5MzYvODc5OS8yMzM2IDQ5MzcvODgwNC8yMzM2IDcxMDUvODgwNS8yMzM2CitmIDcxMDYvODgwNi8yMzM2IDcxMDcvODgwNy8yMzM2IDQ5MzYvODgwOC8yMzM2CitmIDQ5MzcvODgwNC8yMzM3IDQ5MzgvODgwOS8yMzM3IDcxMDgvODgxMC8yMzM3CitmIDcxMDkvODgxMS8yMzM4IDcxMTAvODgxMi8yMzM4IDQ5MzcvODgxMi8yMzM4CitmIDcxMTEvODgxMy8yMzM5IDQ5MzkvODgxNC8yMzM5IDcxMTIvODgxNC8yMzM5CitmIDcxMTMvODgxNS8yMzQwIDcxMTQvODgxNi8yMzQwIDcxMTUvODgxNy8yMzQwCitmIDQ5MzkvODgxOC8xMDQzIDQ5NDAvODgxOS8xMDQzIDcxMTYvODgyMC8xMDQzCitmIDcxMTcvODgyMS8xMDQzIDcxMTgvODgyMi8xMDQzIDQ5MzkvODgyMy8xMDQzCitmIDQ5NDAvODgxOS8xMDQzIDQ5MjYvODc0OS8xMDQzIDcxMTkvODc0OS8xMDQzCitmIDcxMjAvODgyNC8xMDQzIDcxMjEvODgyNS8xMDQzIDQ5NDAvODgyNi8xMDQzCitmIDQ5NDIvODgyNy8yMzQxIDQ5NDEvODgyOC8yMzQxIDcxMjIvODgyOS8yMzQxCitmIDcxMjMvODgzMC8yMzQxIDcxMjQvODgzMS8yMzQxIDQ5NDIvODgzMS8yMzQxCitmIDQ5NDEvODgyOC8yMzQyIDQ5NDMvODgzMi8yMzQyIDcxMjUvODgzMy8yMzQyCitmIDcxMjYvODgzNC8yMzQyIDcxMjcvODgzNS8yMzQyIDQ5NDEvODgzNS8yMzQyCitmIDQ5NDMvODgzNi8yMzQzIDQ5NDQvODgzNy8yMzQzIDcxMjgvODgzOC8yMzQzCitmIDcxMjkvODgzOS8yMzQzIDcxMzAvODg0MC8yMzQzIDQ5NDMvODg0MS8yMzQzCitmIDcxMzEvODg0Mi8yMzQ0IDQ5NDUvODg0My8yMzQ0IDcxMzIvODg0NC8yMzQ0CitmIDcxMzMvODg0NS8yMzQ0IDcxMzQvODg0Ni8yMzQ0IDcxMzUvODg0Ni8yMzQ0CitmIDQ5NDUvODg0Ny8yMzMyIDQ5NDYvODg0OC8yMzMyIDcxMzYvODg0OS8yMzMyCitmIDcxMzcvODg1MC8yMzMyIDcxMzgvODg1MS8yMzMyIDQ5NDUvODg1Mi8yMzMyCitmIDQ5NDYvODg0OC8yMzMyIDQ5NDcvODg1My8yMzMyIDcxMzkvODg1NC8yMzMyCitmIDcxNDAvODg1NS8yMzMyIDcxNDEvODg1Ni8yMzMyIDQ5NDYvODg1Ny8yMzMyCitmIDQ5NDcvODg1My8yMzQ1IDQ5NDgvODg1OC8yMzQ1IDcxNDIvODg1OS8yMzQ1CitmIDcxNDMvODg2MC8yMzQ1IDcxNDQvODg2MS8yMzQ1IDQ5NDcvODg2Mi8yMzQ1CitmIDcxNDUvODg2My8yMzQ2IDQ5NDkvODg2NC8yMzQ2IDcxNDYvODg2NC8yMzQ2CitmIDcxNDcvODg2NS8yMzQ2IDcxNDgvODg2Ni8yMzQ2IDcxNDkvODg2Ni8yMzQ2CitmIDQ5NDkvODg2Ny8yMzQ3IDQ5NTAvODg2OC8yMzQ3IDcxNTAvODg2OC8yMzQ3CitmIDcxNTEvODg2OS8yMzQ3IDcxNTIvODg3MC8yMzQ3IDQ5NDkvODg3MS8yMzQ3CitmIDQ5NTAvODg2OC8yMzQ4IDQ5NTEvODg3Mi8yMzQ4IDcxNTMvODg3Mi8yMzQ4CitmIDcxNTQvODg3My8yMzQ4IDcxNTUvODg3NC8yMzQ4IDQ5NTAvODg3NS8yMzQ4CitmIDcxNTYvODg3Ni8yMzQ5IDQ5NTIvODg3Ny8yMzQ5IDcxNTcvODg3Ny8yMzQ5CitmIDcxNTgvODg3OC8yMzUwIDcxNTkvODg3OS8yMzUwIDcxNjAvODg4MC8yMzUwCitmIDQ5NTIvODg4MS8yMzUxIDQ5NTMvODg4Mi8yMzUxIDcxNjEvODg4Mi8yMzUxCitmIDcxNjIvODg4My8yMzUxIDcxNjMvODg4NC8yMzUxIDQ5NTIvODg4NS8yMzUxCitmIDQ5NTMvODg4Mi8xMDQzIDQ5NTQvODg4Ni8xMDQzIDcxNjQvODg4Ny8xMDQzCitmIDcxNjUvODg4OC8xMDQzIDcxNjYvODg4OS8xMDQzIDQ5NTMvODg4OS8xMDQzCitmIDQ5NTQvODg4Ni8xMDY1IDQ5NTUvODg5MC8xMDY1IDcxNjcvODg5MS8xMDY1CitmIDcxNjgvODg5Mi8xMDY1IDcxNjkvODg5My8xMDY1IDQ5NTQvODg5My8xMDY1CitmIDQ5NTUvODg5MC8yMzUyIDQ5NTYvODg5NC8yMzUyIDcxNzAvODg5NC8yMzUyCitmIDcxNzEvODg5NS8yMzUyIDcxNzIvODg5Ni8yMzUyIDQ5NTUvODg5Ny8yMzUyCitmIDcxNzMvODg5OC8yMzUzIDQ5NDIvODg5OS8yMzUzIDcxNzQvODg5OS8yMzUzCitmIDcxNzUvODkwMC8yMzUzIDcxNzYvODkwMS8yMzUzIDcxNzcvODkwMS8yMzUzCitmIDQ4OTQvODkwMi8yMzI0IDQ4OTMvODkwMy8yMzI0IDQ5MjUvODc1MC8yMzI0CitmIDQ5MjUvODc1MC8yMzI0IDQ5MjYvODc0OS8yMzI0IDQ4OTQvODkwMi8yMzI0CitmIDcxNzgvODkwNC8yMzI1IDQ4OTUvODkwNS8yMzI1IDQ5MjcvODc1OS8yMzI1CitmIDQ5MjcvODkwNi8yMzI1IDcxNzkvODkwNy8yMzI1IDcxODAvODkwOC8yMzI1CitmIDQ4OTUvODkwNS8yMzI2IDQ4OTYvODkwOS8yMzI2IDQ5MjgvODc2MC8yMzI2CitmIDQ5MjgvODc2MC8yMzI2IDQ5MjcvODc1OS8yMzI2IDQ4OTUvODkwNS8yMzI2CitmIDQ4OTYvODkwOS8yMzI3IDQ4OTcvODkxMC8yMzI3IDQ5MjkvODc2NS8yMzI3CitmIDQ5MjkvODc2NS8yMzI3IDQ5MjgvODc2MC8yMzI3IDQ4OTYvODkwOS8yMzI3CitmIDQ4OTcvODkxMC8yMzI4IDQ4OTgvODkxMS8yMzI4IDQ5MzAvODc3MC8yMzI4CitmIDQ5MzAvODc3MC8yMzI4IDQ5MjkvODc2NS8yMzI4IDQ4OTcvODkxMC8yMzI4CitmIDcxODEvODkxMi8yMzMwIDQ4OTkvODkxMy8yMzMwIDQ5MzEvODc4MC8yMzMwCitmIDQ5MzEvODkxNC8yMzMwIDcxODIvODkxNS8yMzMwIDcxODMvODkxNi8yMzMwCitmIDQ4OTkvODkxMy8yMzMxIDQ5MDAvODkxNy8yMzMxIDQ5MzIvODc4MS8yMzMxCitmIDQ5MzIvODc4MS8yMzMxIDQ5MzEvODc4MC8yMzMxIDQ4OTkvODkxMy8yMzMxCitmIDQ5MDAvODkxNy8yMzMyIDQ5MDEvODkxOC8yMzMyIDQ5MzMvODc4NS8yMzMyCitmIDQ5MzMvODc4NS8yMzMyIDQ5MzIvODc4MS8yMzMyIDQ5MDAvODkxNy8yMzMyCitmIDQ5MDEvODkxOC8yMzMzIDQ5MDIvODkxOS8yMzMzIDQ5MzQvODc4OS8yMzMzCitmIDQ5MzQvODc4OS8yMzMzIDQ5MzMvODc4NS8yMzMzIDQ5MDEvODkxOC8yMzMzCitmIDcxODQvODkyMC8yMzM0IDQ5MDMvODkyMS8yMzM0IDQ5MzUvODc5OC8yMzM0CitmIDQ5MzUvODkyMi8yMzM0IDcxODUvODkyMy8yMzM0IDcxODYvODkyNC8yMzM0CitmIDQ5MDMvODkyMS8yMzM1IDQ5MDQvODkyNS8yMzM1IDQ5MzYvODc5OS8yMzM1CitmIDQ5MzYvODc5OS8yMzM1IDQ5MzUvODc5OC8yMzM1IDQ5MDMvODkyMS8yMzM1CitmIDQ5MDQvODkyNS8yMzM2IDQ5MDUvODkyNi8yMzM2IDQ5MzcvODgwNC8yMzM2CitmIDQ5MzcvODgwNC8yMzM2IDQ5MzYvODc5OS8yMzM2IDQ5MDQvODkyNS8yMzM2CitmIDQ5MDUvODkyNi8yMzM4IDQ5MDYvODkyNy8yMzM4IDQ5MzgvODgwOS8yMzM4CitmIDQ5MzgvODgwOS8yMzM4IDQ5MzcvODgwNC8yMzM4IDQ5MDUvODkyNi8yMzM4CitmIDcxODcvODkyOC8yMzQwIDQ5MDcvODkyOS8yMzQwIDQ5MzkvODgxOC8yMzQwCitmIDQ5MzkvODkzMC8yMzQwIDcxODgvODkzMS8yMzQwIDcxODkvODkzMi8yMzQwCitmIDQ5MDcvODkyOS8xMDQzIDQ5MDgvODkzMy8xMDQzIDQ5NDAvODgxOS8xMDQzCitmIDQ5NDAvODgxOS8xMDQzIDQ5MzkvODgxOC8xMDQzIDQ5MDcvODkyOS8xMDQzCitmIDQ5MDgvODkzMy8xMDQzIDQ4OTQvODkwMi8xMDQzIDQ5MjYvODc0OS8xMDQzCitmIDQ5MjYvODc0OS8xMDQzIDQ5NDAvODgxOS8xMDQzIDQ5MDgvODkzMy8xMDQzCitmIDQ5MTAvODkzNC8yMzU0IDQ5MDkvODkzNS8yMzU0IDQ5NDEvODgyOC8yMzU0CitmIDQ5NDEvODgyOC8yMzQxIDQ5NDIvODgyNy8yMzQxIDQ5MTAvODkzNC8yMzQxCitmIDQ5MDkvODkzNS8yMzU1IDQ5MTEvODkzNi8yMzU1IDQ5NDMvODgzMi8yMzU1CitmIDQ5NDMvODgzMi8yMzU2IDQ5NDEvODgyOC8yMzU2IDQ5MDkvODkzNS8yMzU2CitmIDQ5MTEvODkzNy8yMzQzIDQ5MTIvODkzOC8yMzQzIDQ5NDQvODgzNy8yMzQzCitmIDQ5NDQvODgzNy8yMzQzIDQ5NDMvODgzNi8yMzQzIDQ5MTEvODkzNy8yMzQzCitmIDcxOTAvODkzOS8yMzQ0IDQ5MTMvODk0MC8yMzQ0IDQ5NDUvODg0Ny8yMzQ0CitmIDQ5NDUvODk0MS8yMzQ0IDcxOTEvODk0Mi8yMzQ0IDcxOTIvODk0My8yMzQ0CitmIDQ5MTMvODk0MC8yMzMyIDQ5MTQvODk0NC8yMzMyIDQ5NDYvODg0OC8yMzMyCitmIDQ5NDYvODg0OC8yMzMyIDQ5NDUvODg0Ny8yMzMyIDQ5MTMvODk0MC8yMzMyCitmIDQ5MTQvODk0NC8yMzMyIDQ5MTUvODk0NS8yMzMyIDQ5NDcvODg1My8yMzMyCitmIDQ5NDcvODg1My8yMzMyIDQ5NDYvODg0OC8yMzMyIDQ5MTQvODk0NC8yMzMyCitmIDQ5MTUvODk0NS8yMzQ1IDQ5MTYvODk0Ni8yMzQ1IDQ5NDgvODg1OC8yMzQ1CitmIDQ5NDgvODg1OC8yMzQ1IDQ5NDcvODg1My8yMzQ1IDQ5MTUvODk0NS8yMzQ1CitmIDcxOTMvODk0Ny8yMzQ2IDQ5MTcvODk0OC8yMzQ2IDQ5NDkvODg2Ny8yMzQ2CitmIDQ5NDkvODk0OS8yMzQ2IDcxOTQvODk1MC8yMzQ2IDcxOTUvODk1MS8yMzQ2CitmIDQ5MTcvODk0OC8yMzU3IDQ5MTgvODk1Mi8yMzU3IDQ5NTAvODg2OC8yMzU3CitmIDQ5NTAvODg2OC8yMzQ3IDQ5NDkvODg2Ny8yMzQ3IDQ5MTcvODk0OC8yMzQ3CitmIDQ5MTgvODk1Mi8yMzU4IDQ5MTkvODk1My8yMzU4IDQ5NTEvODg3Mi8yMzU4CitmIDQ5NTEvODg3Mi8yMzU5IDQ5NTAvODg2OC8yMzU5IDQ5MTgvODk1Mi8yMzU5CitmIDcxOTYvODk1NC8yMzUwIDQ5MjAvODk1NS8yMzUwIDQ5NTIvODg4MS8yMzUwCitmIDQ5NTIvODk1Ni8yMzUwIDcxOTcvODk1Ny8yMzUwIDcxOTgvODk1OC8yMzUwCitmIDQ5MjAvODk1NS8yMzUxIDQ5MjEvODk1OS8yMzUxIDQ5NTMvODg4Mi8yMzUxCitmIDQ5NTMvODg4Mi8yMzUxIDQ5NTIvODg4MS8yMzUxIDQ5MjAvODk1NS8yMzUxCitmIDQ5MjEvODk1OS8xMDQzIDQ5MjIvODk2MC8xMDQzIDQ5NTQvODg4Ni8xMDQzCitmIDQ5NTQvODg4Ni8xMDQzIDQ5NTMvODg4Mi8xMDQzIDQ5MjEvODk1OS8xMDQzCitmIDQ5MjIvODk2MC8xMDY1IDQ5MjMvODk2MS8xMDY1IDQ5NTUvODg5MC8xMDY1CitmIDQ5NTUvODg5MC8xMDY1IDQ5NTQvODg4Ni8xMDY1IDQ5MjIvODk2MC8xMDY1CitmIDQ5MjMvODk2MS8yMzUyIDQ5MjQvODk2Mi8yMzUyIDQ5NTYvODg5NC8yMzUyCitmIDQ5NTYvODg5NC8yMzUyIDQ5NTUvODg5MC8yMzUyIDQ5MjMvODk2MS8yMzUyCitmIDcxOTkvODk2My8yMzUzIDQ5MTAvODk2NC8yMzUzIDQ5NDIvODk2NS8yMzUzCitmIDQ5NDIvODk2Ni8yMzUzIDcyMDAvODk2Ny8yMzUzIDcyMDEvODk2OC8yMzUzCitmIDQzODMvODIzNC8xMTAyIDU4MTUvODk2OS8xMTAyIDQ0ODkvODI1NC8xMTAyCitmIDQ0ODkvODI1NC8xMTAyIDQ0OTAvODIzMi8xMTAyIDQzODMvODIzNC8xMTAyCitmIDU4MTcvODAzNy8xMDQzIDU4MjcvODA0Mi8xMDQzIDU4MTUvODk2OS8xMDQzCitmIDU4MTUvODk2OS8xMTAyIDQzODMvODIzNC8xMTAyIDU4MTcvODAzNy8xMTAyCitmIDQ1MTUvNzIxNS8yMzYwIDU4NDcvODk3MC8yMzYwIDcyMDIvODk3MS8yMzYwCitmIDcyMDMvODk3Mi8xOTE4IDcyMDQvODk3My8xOTE4IDQ1MTUvODk3NC8xOTE4CitmIDQ1MTQvNzIxOC8yMzYxIDU4MTgvODk3NS8yMzYxIDU4NDcvODk3MC8yMzYxCitmIDU4NDcvODk3MC8yMzYxIDQ1MTUvNzIxNS8yMzYxIDQ1MTQvNzIxOC8yMzYxCitmIDcyMDUvODk3Ni8yMzYyIDU5NTMvODk3Ny8yMzYyIDU5NDYvODk3OC8yMzYyCitmIDU5NDYvODk3OS8yMzYyIDcyMDYvODk4MC8yMzYyIDcyMDcvODk4MS8yMzYyCitmIDcyMDgvODk4Mi8yMzYzIDU5NDYvODk3OC8yMzYzIDU5NDcvODk4My8yMzYzCitmIDU5NDcvODk4NC8yMzY0IDcyMDkvODk4NS8yMzY0IDcyMTAvODk4Ni8yMzY0CitmIDcyMTEvODk4Ny8yMzY1IDcyMTIvODk4OC8yMzY1IDU5NDgvODk4OS8yMzY1CitmIDU5NDgvODk5MC8yMzY1IDcyMTMvODk5MS8yMzY1IDcyMTQvODk5Mi8yMzY1CitmIDcyMTUvODk5My8xOTI2IDU5NDgvODk5NC8xOTI2IDU5NDkvODk5NS8xOTI2CitmIDU5NDkvODk5Ni8xOTI2IDcyMTYvODk5Ny8xOTI2IDcyMTcvODk5OC8xOTI2CitmIDcyMTgvODk5OS8yMTczIDU5NDkvODk5NS8yMTczIDU5NTAvOTAwMC8yMTczCitmIDU5NTAvOTAwMS8yMTczIDcyMTkvOTAwMi8yMTczIDcyMjAvOTAwMy8yMTczCitmIDcyMjEvOTAwNC8yMzY2IDU5NTAvOTAwMC8yMzY2IDU5NTEvOTAwNS8yMzY2CitmIDU5NTEvOTAwNi8yMzY2IDcyMjIvOTAwNy8yMzY2IDcyMjMvOTAwOC8yMzY2CitmIDcyMjQvOTAwOS8yMzY3IDcyMjUvOTAxMC8yMzY3IDU5NTIvOTAxMS8yMzY3CitmIDU5NTIvOTAxMi8yMzY3IDcyMjYvOTAxMy8yMzY3IDcyMjcvOTAxNC8yMzY3CitmIDcyMjgvOTAxNS8yMzY4IDU5NTIvOTAxNi8yMzY4IDU5NjEvOTAxNy8yMzY4CitmIDU5NjEvOTAxOC8yMzY4IDcyMjkvOTAxOS8yMzY4IDcyMzAvOTAyMC8yMzY4CitmIDcyMzEvOTAyMS8yMzY5IDU5NTQvOTAyMi8yMzY5IDU5NTMvODk3Ny8yMzY5CitmIDU5NTMvOTAyMy8yMzY5IDcyMzIvOTAyNC8yMzY5IDcyMzMvOTAyNS8yMzY5CitmIDcyMzQvOTAyNi8yMzcwIDU5NTUvOTAyNy8yMzcwIDU5NTQvOTAyMi8yMzcwCitmIDU5NTQvOTAyOC8yMzcwIDcyMzUvOTAyOS8yMzcwIDcyMzYvOTAzMC8yMzcwCitmIDcyMzcvOTAzMS8yMzcxIDU5NTYvOTAzMi8yMzcxIDcyMzgvOTAzMy8yMzcxCitmIDcyMzkvOTAzNC8yMzcyIDcyNDAvOTAzNS8yMzcyIDcyNDEvOTAzNi8yMzcyCitmIDcyNDIvOTAzNy8yMzczIDU5NTcvOTAzOC8yMzczIDU5NTYvOTAzOS8yMzczCitmIDU5NTYvOTA0MC8yMzczIDcyNDMvOTA0MS8yMzczIDcyNDQvOTA0Mi8yMzczCitmIDcyNDUvOTA0My8yMDc2IDU5NTgvOTA0NC8yMDc2IDU5NTcvOTAzOC8yMDc2CitmIDU5NTcvOTA0NS8yMDc2IDcyNDYvOTA0Ni8yMDc2IDcyNDcvOTA0Ny8yMDc2CitmIDcyNDgvOTA0OC8yMzc0IDU5NTkvOTA0OS8yMzc0IDU5NTgvOTA0NC8yMzc0CitmIDU5NTgvOTA1MC8yMzc1IDcyNDkvOTA1MS8yMzc1IDcyNTAvOTA1Mi8yMzc1CitmIDcyNTEvOTA1My8yMzc2IDU5NjAvOTA1NC8yMzc2IDcyNTIvOTA1NS8yMzc2CitmIDcyNTMvOTA1Ni8yMzc2IDcyNTQvOTA1Ny8yMzc2IDcyNTUvOTA1OC8yMzc2CitmIDcyNTYvOTA1OS8yMzc3IDU5NjEvOTAxNy8yMzc3IDU5NjAvOTA2MC8yMzc3CitmIDU5NjAvOTA2MS8yMzc3IDcyNTcvOTA2Mi8yMzc3IDcyNTgvOTA2My8yMzc3CitmIDUwNDkvNzQ2NC8xOTk1IDUwNTIvOTA2NC8xOTk1IDcyNTkvOTA2NS8xOTk1CitmIDcyNjAvOTA2NS8xOTk3IDUwNTAvNzQ2NS8xOTk3IDUwNDkvNzQ2NC8xOTk3CitmIDUwNjYvNzc2MC8yMzc4IDU4NTYvOTA2Ni8yMzc4IDU4NTcvOTA2Ny8yMzc4CitmIDU4NTcvOTA2Ny8yMzc5IDUwNjcvOTA2OC8yMzc5IDUwNjYvNzc2MC8yMzc5CitmIDUwNTMvOTA2OS8yMzgwIDUwNDgvOTA3MC8yMzgwIDU4NjEvOTA3MS8yMzgwCitmIDU4NjEvOTA3MS8yMzgxIDU4NTQvOTA3Mi8yMzgxIDUwNTMvOTA2OS8yMzgxCitmIDUwNDYvNzczMy8yMzgyIDUwNTUvOTA3My8yMzgyIDUwNTQvOTA3NC8yMzgyCitmIDUwNTQvOTA3NC8xOTk2IDUwNDcvNzczNC8xOTk2IDUwNDYvNzczMy8xOTk2CitmIDUwNTYvOTA3NS82OTcgNDA4OS83NjI0LzY5NyA0MTM1Lzc2MjcvNjk3CitmIDQxMzUvNzYyNy82OTcgNTA1Ny85MDc2LzY5NyA1MDU2LzkwNzUvNjk3CitmIDQxNDkvNzY1NC8yMDE4IDQwODkvNzYyNC8yMDE4IDUwNTYvOTA3NS8yMDE4CitmIDUwNTYvOTA3NS8yMDE3IDcyNjEvOTA3Ny8yMDE3IDQxNDkvNzY1NC8yMDE3CitmIDUwNTYvOTA3NS82OTcgNTA1Ny85MDc2LzY5NyA1MDY1LzkwNzgvNjk3CitmIDUwNjUvOTA3OC82OTcgNTA2NC85MDc5LzY5NyA1MDU2LzkwNzUvNjk3CitmIDUwNTYvOTA3NS8yMzgzIDUwNjQvOTA3OS8yMzgzIDcyNjIvOTA4MC8yMzgzCitmIDcyNjMvOTA4MS8yMzg0IDcyNjQvOTA4Mi8yMzg0IDUwNTYvOTA4My8yMzg0CitmIDU4NzAvNzc1OC82OTcgNTg3MS85MDg0LzY5NyA1MDU4Lzc3NTUvNjk3CitmIDUwNTgvNzc1NS82OTcgNTA1OS83NzU0LzY5NyA1ODcwLzc3NTgvNjk3CitmIDcyNjUvOTA4NS8yMDE4IDcyNjYvOTA4Ni8yMDE4IDUwNTkvOTA4Ny8yMDE4CitmIDUwNTkvNzc1NC8yMDE5IDQxNjgvNzc1My8yMDE5IDcyNjcvNzkyNC8yMDE5CitmIDU4NjMvOTA4OC8yMzg1IDU4NjkvOTA4OS8yMzg1IDcyNjgvOTA5MC8yMzg1CitmIDcyNjkvOTA5MS8yMzg2IDcyNzAvOTA5Mi8yMzg2IDU4NjMvOTA5My8yMzg2CitmIDcyNzEvOTA5NC8yMzg3IDU4NjUvOTA5NS8yMzg3IDU4NjQvOTA5Ni8yMzg3CitmIDU4NjQvOTA5Ny8yMzg4IDcyNzIvOTA5OC8yMzg4IDcyNzMvOTA5OS8yMzg4CitmIDU4NjQvOTA5Ni8yMzg5IDU4NjcvOTEwMC8yMzg5IDU4NTIvOTEwMS8yMzg5CitmIDU4NTIvOTEwMS8yMzkwIDcyNzQvOTEwMi8yMzkwIDU4NjQvOTA5Ni8yMzkwCitmIDUwNjQvOTEwMy8yMzkxIDcyNzUvOTEwNC8yMzkxIDcyNzYvOTEwNS8yMzkxCitmIDUwNDkvNzQ2NC8yMzkyIDUwNjYvNzc2MC8yMzkyIDUwNjcvOTA2OC8yMzkyCitmIDUwNjcvOTA2OC8xMjc2IDUwNTIvOTA2NC8xMjc2IDUwNDkvNzQ2NC8xMjc2CitmIDU4NjYvOTEwNi8yMzkzIDU4NjIvOTEwNy8yMzkzIDcyNzcvOTEwOC8yMzkzCitmIDcyNzgvOTEwOS8yMzk0IDcyNzkvOTExMC8yMzk0IDU4NjYvOTExMS8yMzk0CitmIDQwMzAvNzM5OC8xMjc2IDQwMzkvNzQ3Ny8xMjc2IDUwNzIvNzczNi8xMjc2CitmIDUwNzIvNzczNi8xMjc2IDQxNTgvNzQ2Mi8xMjc2IDQwMzAvNzM5OC8xMjc2CitmIDQxODYvNzc2NC8xMjc2IDQxOTEvNzc2Ny8xMjc2IDUwNzIvNzczNi8xMjc2CitmIDUwNzIvNzczNi8xMjc2IDQwMzkvNzQ3Ny8xMjc2IDQxODYvNzc2NC8xMjc2CitmIDQ3ODAvODYyMS8xNzg3IDUwNzcvOTExMi8xNzg3IDQ1NjcvODMyMi8xNzg3CitmIDQ1NjcvODMyMi8xNzg3IDQ1NTcvODMwOS8xNzg3IDQ3ODAvODYyMS8xNzg3CitmIDQ1NjkvODMyMy82ODcgNDU2Ny84MzIyLzY4NyA1MDc3LzkxMTIvNjg3CitmIDUwNzcvOTExMi82ODcgNDc4My84NjI1LzY4NyA0NTY5LzgzMjMvNjg3CitmIDQ2MTUvODM4OS8xNzg3IDQ2MTgvODM5MC8xNzg3IDUwNzMvOTExMy8xNzg3CitmIDUwNzMvOTExMy8xNzg3IDQ3ODIvODYyNC8xNzg3IDQ2MTUvODM4OS8xNzg3CitmIDQ2MTgvODM5MC82ODcgNDYxOS84Njc0LzY4NyA0Nzg1Lzg2MzAvNjg3CitmIDQ3ODUvODYzMC82ODcgNTA3My85MTEzLzY4NyA0NjE4LzgzOTAvNjg3CitmIDQ3ODIvODYyNC8xNzg3IDUwNzMvOTExMy8xNzg3IDUwNzQvOTExNC8xNzg3CitmIDUwNzQvOTExNC8xNzg3IDQ3NDUvODU3MC8xNzg3IDQ3ODIvODYyNC8xNzg3CitmIDUwNzMvOTExMy82ODcgNDc4NS84NjMwLzY4NyA0NzQ3Lzg1NzQvNjg3CitmIDQ3NDcvODU3NC82ODcgNTA3NC85MTE0LzY4NyA1MDczLzkxMTMvNjg3CitmIDQ3NDUvODU3MC8xNzg3IDUwNzQvOTExNC8xNzg3IDUwNzUvOTExNS8xNzg3CitmIDUwNzUvOTExNS8xNzg3IDQ3NDQvODU3MS8xNzg3IDQ3NDUvODU3MC8xNzg3CitmIDUwNzQvOTExNC82ODcgNDc0Ny84NTc0LzY4NyA0NzQ2Lzg1NzMvNjg3CitmIDQ3NDYvODU3My82ODcgNTA3NS85MTE1LzY4NyA1MDc0LzkxMTQvNjg3CitmIDQ3NDQvODU3MS8xNzg3IDUwNzUvOTExNS8xNzg3IDUwNzYvOTExNi8xNzg3CitmIDUwNzYvOTExNi8xNzg3IDQ3ODEvODYyMC8xNzg3IDQ3NDQvODU3MS8xNzg3CitmIDUwNzUvOTExNS82ODcgNDc0Ni84NTczLzY4NyA0Nzg0Lzg2MjYvNjg3CitmIDQ3ODQvODYyNi82ODcgNTA3Ni85MTE2LzY4NyA1MDc1LzkxMTUvNjg3CitmIDQ3ODEvODYyMC8xNzg3IDUwNzYvOTExNi8xNzg3IDUwNzcvOTExMi8xNzg3CitmIDUwNzcvOTExMi8xNzg3IDQ3ODAvODYyMS8xNzg3IDQ3ODEvODYyMC8xNzg3CitmIDUwNzYvOTExNi82ODcgNDc4NC84NjI2LzY4NyA0NzgzLzg2MjUvNjg3CitmIDQ3ODMvODYyNS82ODcgNTA3Ny85MTEyLzY4NyA1MDc2LzkxMTYvNjg3CitmIDQyNjIvNzgxNS8yMTkgNDIzMi83ODE0LzIxOSA1MDgyLzc3OTUvMjE5CitmIDUwODIvNzc5NS8yMjAgNTA4My83Nzk0LzIyMCA0MjYyLzc4MTUvMjIwCitmIDUwODYvNzgwMy8xOTM2IDQyMjAvNzc5OC8xOTM2IDQyMzcvNzgxMi8xOTM2CitmIDQyMzcvNzgxMi8xOTM2IDUwODQvNzgwNC8xOTM2IDUwODYvNzgwMy8xOTM2CitmIDUwODgvNzgwNS82ODcgNDIyMy83ODAwLzY4NyA0MjMxLzc1OTkvNjg3CitmIDQyMzEvNzU5OS82ODcgNTA4MS83ODA2LzY4NyA1MDg4Lzc4MDUvNjg3CitmIDUwODAvNzgwNy8xOTcxIDQyMzAvNzU5OC8xOTcxIDQyMjEvNzU5NS8xOTcxCitmIDQyMjEvNzU5NS8xOTk0IDUwODcvNzgwOC8xOTk0IDUwODAvNzgwNy8xOTk0CitmIDUwNzkvNzgwOS82ODcgNDIyMi83ODAxLzY4NyA0MjIzLzc4MDAvNjg3CitmIDQyMjMvNzgwMC82ODcgNTA4OC83ODA1LzY4NyA1MDc5Lzc4MDkvNjg3CitmIDQyMzgvNzgxNi8yMjEgNDIzNi83ODAyLzIyMSA1MDg0Lzc4MDQvMjIxCitmIDUwODQvNzgwNC8yMjEgNTA4NS83ODExLzIyMSA0MjM4Lzc4MTYvMjIxCitmIDUwODYvNzgxMy8xOTcwIDQyMjQvNzc5OS8xOTcwIDQyMjUvNzU5MC8xOTcwCitmIDQyMjUvNzU5MC8xOTcwIDUwODcvNzgwOC8xOTcwIDUwODYvNzgxMy8xOTcwCitmIDUwODAvNzgwNy82ODcgNDIxOC83NTg5LzY4NyA0MjE5Lzc1ODgvNjg3CitmIDQyMTkvNzU4OC82ODcgNTA4MS83ODA2LzY4NyA1MDgwLzc4MDcvNjg3CitmIDQyMzIvNzgxNC8yMzk1IDQyMzgvNzgxNi8yMzk1IDUwODUvNzgxMS8yMzk1CitmIDUwODUvNzgxMS8yMDI5IDUwODIvNzc5NS8yMDI5IDQyMzIvNzgxNC8yMDI5CitmIDQyNDgvNzgzMC82OTcgNDIzNC83ODI5LzY5NyA1MDkwLzc4NDUvNjk3CitmIDUwOTAvNzg0NS8yMDQzIDUwODkvNzg0NC8yMDQzIDQyNDgvNzgzMC8yMDQzCitmIDQyMzUvOTExNy8yMDczIDcyODAvOTExOC8yMDczIDcyODEvOTExOS8yMDczCitmIDcyODIvOTEyMC8yMzk2IDUwODMvNzc5NC8yMzk2IDQyMzUvNzc5My8yMzk2CitmIDQyMjYvNzU5MS82ODcgMzk3Ni83MzU5LzY4NyA1MDc4LzczNTgvNjg3CitmIDUwNzgvNzM1OC82ODcgNTA3OS83ODA5LzY4NyA0MjI2Lzc1OTEvNjg3CitmIDM2OTgvNjk4MS82ODcgMzk3Ny83MzYxLzY4NyA1MDc4LzczNTgvNjg3CitmIDUwNzgvNzM1OC82ODcgMzk5Ny82OTc2LzY4NyAzNjk4LzY5ODEvNjg3CitmIDQyMjYvNzU5MS82ODcgNDExOS83NTQwLzY4NyAzOTc2LzczNTkvNjg3CitmIDQyMjIvNzgwMS82ODcgNTA3OS83ODA5LzY4NyA1MDc4LzczNTgvNjg3CitmIDUwNzgvNzM1OC82ODcgMzk3Ny83MzYxLzY4NyA0MjIyLzc4MDEvNjg3CitmIDQyMzYvNzgwMi8xOTM2IDQyMTYvNzU4Ni8xOTM2IDQyMjQvNzU4NS8xOTM2CitmIDQ0ODYvODI0OC82OTcgNDQ4Ny84MjQ3LzY5NyA1ODEzLzkxMjEvNjk3CitmIDU4MTMvOTEyMS82OTcgNTgxMi85MTIyLzY5NyA0NDg2LzgyNDgvNjk3CitmIDcyODMvOTEyMy8xOTE5IDcyODQvOTEyNC8xOTE5IDQ0ODgvOTEyNS8xOTE5CitmIDQ0ODgvODI1MC8xOTE5IDU4MTQvOTEyNi8xOTE5IDcyODUvOTEyNy8xOTE5CitmIDU4MTQvOTEyNi8xMDQzIDQ0ODgvODI1MC8xMDQzIDQ0ODkvODI1NC8xMDQzCitmIDQ0ODkvODI1NC8xMDQzIDU4MTUvODk2OS8xMDQzIDU4MTQvOTEyNi8xMDQzCitmIDQ3MjgvNzIwNS82ODcgNDUxMS83MjA0LzY4NyA1ODI1LzgwNjAvNjg3CitmIDU4MjUvODA2MC82ODcgNTgyOS84MTE1LzY4NyA0NzI4LzcyMDUvNjg3CitmIDQzODMvODIzNC8yMDk4IDQzODIvODA2Mi8yMDk4IDU4MTYvODAzOC8yMDk4CitmIDU4MTYvODAzOC8xMDQzIDU4MTcvODAzNy8xMDQzIDQzODMvODIzNC8xMDQzCitmIDU4MTkvODAzOS8xNzg2IDQzNzkvODIzOC8xNzg2IDQzODAvODA2NC8xNzg2CitmIDQzODAvODA2NC8xNzg2IDU4NDgvODA0MC8xNzg2IDU4MTkvODAzOS8xNzg2CitmIDU4NDYvODA0MS8xMDQzIDU4MTQvOTEyNi8xMDQzIDU4MTUvODk2OS8xMDQzCitmIDU4MTUvODk2OS8xMDQzIDU4MjcvODA0Mi8xMDQzIDU4NDYvODA0MS8xMDQzCitmIDQzODQvODA2NS82ODcgNDM4NS84MjQxLzY4NyA1ODIxLzgwNDQvNjg3CitmIDU4MjEvODA0NC82ODcgNTgyMC84MDQzLzY4NyA0Mzg0LzgwNjUvNjg3CitmIDQzODUvODI0MS82ODcgNDM4Ni84MjQzLzY4NyA1ODIyLzgwNDUvNjg3CitmIDU4MjIvODA0NS82ODcgNTgyMS84MDQ0LzY4NyA0Mzg1LzgyNDEvNjg3CitmIDQzODYvODI0My82ODcgNDM4Ny84MjQ1LzY4NyA1ODIzLzgwNDYvNjg3CitmIDU4MjMvODA0Ni82ODcgNTgyMi84MDQ1LzY4NyA0Mzg2LzgyNDMvNjg3CitmIDQzODcvODI0NS82ODcgNDM4OC84MjU4LzY4NyA1ODI0LzgwNDcvNjg3CitmIDU4MjQvODA0Ny82ODcgNTgyMy84MDQ2LzY4NyA0Mzg3LzgyNDUvNjg3CitmIDQzODgvODI1OC82ODcgNDQzNi84MTI4LzY4NyA1ODQ5LzgwNDgvNjg3CitmIDU4NDkvODA0OC82ODcgNTgyNC84MDQ3LzY4NyA0Mzg4LzgyNTgvNjg3CitmIDQ0MTIvODExMC82ODcgNDQxMS84MDk2LzY4NyA1ODI1LzgwNjAvNjg3CitmIDU4MjUvODA2MC82ODcgNDM3MC84MDU5LzY4NyA0NDEyLzgxMTAvNjg3CitmIDI5NDcvNjk5NC8xNzg1IDI5NDUvNzEwMy8xNzg1IDU4MzMvODM4Ny8xNzg1CitmIDU4MzMvODM4Ny8xNzg1IDU4MzIvODM2OC8xNzg1IDI5NDcvNjk5NC8xNzg1CitmIDI5NDYvNzAyOC8xNzg3IDQ2MjQvNzA3MS8xNzg3IDU4MjgvODM3NS8xNzg3CitmIDU4MjgvODM3NS8xNzg3IDU4MzQvODM3MC8xNzg3IDI5NDYvNzAyOC8xNzg3CitmIDQ2MzUvNzIwMy82ODcgNDcyOC83MjA1LzY4NyA1ODI5LzgxMTUvNjg3CitmIDU4MjkvODExNS82ODcgNTgzMC84Mzg0LzY4NyA0NjM1LzcyMDMvNjg3CitmIDQ2MTMvODM4Ni8xMDQ0IDQ2MTIvODU0OS8xMDQ0IDU4MzEvODM2OS8xMDQ0CitmIDU4MzEvODM2OS8xMDQ0IDU4MzIvODM2OC8xMDQ0IDQ2MTMvODM4Ni8xMDQ0CitmIDQ2MTUvODM4OS8xNzgzIDQ2MTQvODY3Mi8xNzgzIDU4MzMvODM3MS8xNzgzCitmIDU4MzMvODM3MS8xNzgzIDU4MzQvODM3MC8xNzgzIDQ2MTUvODM4OS8xNzgzCitmIDU4MzYvODM3Mi8xMDQ0IDQ2MTcvODU1MC8xMDQ0IDcyODYvODY3MS8xMDQ0CitmIDcyODcvODY3MS8xMDQ0IDU4MzUvODM3My8xMDQ0IDU4MzYvODM3Mi8xMDQ0CitmIDQ2MTkvODY3NC82ODcgNDYxOC84MzkwLzY4NyA1ODI4LzgzNzUvNjg3CitmIDU4MjgvODM3NS82ODcgNTg0MS84Mzc0LzY4NyA0NjE5Lzg2NzQvNjg3CitmIDQ2MjAvODY3My82ODcgNDYxOS84Njc0LzY4NyA1ODQxLzgzNzQvNjg3CitmIDU4NDEvODM3NC82ODcgNTgzNy84Mzc2LzY4NyA0NjIwLzg2NzMvNjg3CitmIDQ2MjEvODY3NS82ODcgNDYyMC84NjczLzY4NyA1ODM3LzgzNzYvNjg3CitmIDU4MzcvODM3Ni82ODcgNTg0Mi84Mzc3LzY4NyA0NjIxLzg2NzUvNjg3CitmIDQ2MjIvODcxNi82ODcgNDYyMS84Njc1LzY4NyA1ODQyLzgzNzcvNjg3CitmIDU4NDIvODM3Ny82ODcgNTg0My84Mzc4LzY4NyA0NjIyLzg3MTYvNjg3CitmIDQ2MjMvODQ0MS82ODcgNDYyMi84NzE2LzY4NyA1ODQzLzgzNzgvNjg3CitmIDU4NDMvODM3OC82ODcgNTgzOC84Mzc5LzY4NyA0NjIzLzg0NDEvNjg3CitmIDQ3MjkvNzA4Ni82ODcgNDYzNi82OTg1LzY4NyA1ODM5LzgzODUvNjg3CitmIDU4MzkvODM4NS82ODcgNTg0NC84NDQwLzY4NyA0NzI5LzcwODYvNjg3CitmIDM5ODYvNzM4NC82ODcgNDcyOS83MDg2LzY4NyA1ODQ0Lzg0NDAvNjg3CitmIDU4NDQvODQ0MC82ODcgNTgzOC84Mzc5LzY4NyAzOTg2LzczODQvNjg3CitmIDM5MTUvNzI1NC8yMzYxIDI5NDgvNzI1My8yMzYxIDU4NDUvODQ2Mi8yMzYxCitmIDU4NDUvODQ2Mi8yMzYxIDU4NDAvODQ2MS8yMzYxIDM5MTUvNzI1NC8yMzYxCitmIDI5NDgvOTEyOC8xOTE3IDcyODgvOTEyOS8xOTE3IDcyODkvOTEzMC8xOTE3CitmIDcyOTAvOTEzMS8yMzk3IDU4NDUvODQ2Mi8yMzk3IDI5NDgvNzI1My8yMzk3CitmIDM5MzUvNzA0Mi8xMDQ0IDI5NDkvNjk5NS8xMDQ0IDU4MzEvODM2OS8xMDQ0CitmIDU4MzEvODM2OS8xMDQ0IDU4MzYvODM3Mi8xMDQ0IDM5MzUvNzA0Mi8xMDQ0CitmIDQ1MDIvNzA5NC8xMDQzIDQ1MTYvNzExOS8xMDQzIDU4MjcvODA0Mi8xMDQzCitmIDU4MjcvODA0Mi8xMDQzIDU4MTcvODAzNy8xMDQzIDQ1MDIvNzA5NC8xMDQzCitmIDQ1MDgvNzAxMS8xNzgyIDQ1MDAvNzAxMC8xNzgyIDU4MTYvODAzOC8xNzgyCitmIDU4MTYvODAzOC8xNzgyIDU4MTkvODA2MS8xNzgyIDQ1MDgvNzAxMS8xNzgyCitmIDQ1MDMvNzA1NS8xNzg0IDQ1MDkvNzA1NC8xNzg0IDU4NDgvODA0MC8xNzg0CitmIDU4NDgvODA0MC8xNzg0IDU4MjAvODA0My8xNzg0IDQ1MDMvNzA1NS8xNzg0CitmIDQ1MTAvNjk4MC82ODcgNDUxMi83MjA4LzY4NyA1ODI2LzgxMjcvNjg3CitmIDU4MjYvODEyNy82ODcgNDM3MC84MDU5LzY4NyA0NTEwLzY5ODAvNjg3CitmIDQ1MTIvNzIwOC82ODcgNDUxMy83MTYyLzY4NyA1ODQ5LzgwNDgvNjg3CitmIDU4NDkvODA0OC82ODcgNTgyNi84MTI3LzY4NyA0NTEyLzcyMDgvNjg3CitmIDU4MTMvOTEzMi8xOTE5IDcyOTEvOTEzMy8xOTE5IDcyOTIvOTEzNC8xOTE5CitmIDcyOTMvODk3MS8yMzk4IDU4NDcvODk3MC8yMzk4IDU4MTMvOTEyMS8yMzk4CitmIDU4MTIvOTEyMi8yMjUzIDU4MTMvOTEyMS8yMjUzIDU4NDcvODk3MC8yMjUzCitmIDU4NDcvODk3MC8yMjUzIDU4MTgvODk3NS8yMjUzIDU4MTIvOTEyMi8yMjUzCitmIDQ4MjMvODY4MC82ODcgNDgzMS84Njg4LzY4NyA0NjIzLzg0NDEvNjg3CitmIDQ4MjgvODY4Ny82ODcgNTg1MC84Njg1LzY4NyA0ODQ3Lzg3MDQvNjg3CitmIDQ4NDcvODcwNC82ODcgNDg1Ny84NzE0LzY4NyA0ODI4Lzg2ODcvNjg3CitmIDQ4MjgvODY4Ny82ODcgNDc5Ny84NjM5LzY4NyA0Nzk4Lzg2NDIvNjg3CitmIDQ3OTgvODY0Mi82ODcgNTg1MC84Njg1LzY4NyA0ODI4Lzg2ODcvNjg3CitmIDU4NjgvOTEzNS8yMzk5IDcyOTQvOTEzNi8yMzk5IDU4NTIvOTEwMS8yMzk5CitmIDU4NTIvOTEwMS8yNDAwIDU4NjcvOTEwMC8yNDAwIDU4NjgvOTEzNS8yNDAwCitmIDU4NTEvOTEzNy8xMjc2IDUwNDcvNzczNC8xMjc2IDUwNTQvOTA3NC8xMjc2CitmIDUwNTQvOTA3NC8yNDAxIDcyOTUvOTEzOC8yNDAxIDU4NTEvOTEzNy8yNDAxCitmIDQwMzEvNzQwMS8xMjc2IDQxNTkvNzQ2OC8xMjc2IDUwNDcvNzczNC8xMjc2CitmIDUwNDcvNzczNC8xMjc2IDU4NTEvOTEzNy8xMjc2IDQwMzEvNzQwMS8xMjc2CitmIDU4NjEvOTEzOS8yNDAyIDU4NTEvOTEzNy8yNDAyIDcyOTYvOTEzOC8yNDAyCitmIDcyOTcvOTE0MC8yNDAzIDU4NTQvOTA3Mi8yNDAzIDU4NjEvOTA3MS8yNDAzCitmIDcyOTgvOTE0MS8yNDA0IDU4NjMvOTE0Mi8yNDA0IDcyOTkvOTE0My8yNDA0CitmIDczMDAvOTE0NC8yNDA1IDczMDEvOTE0NS8yNDA1IDczMDIvOTE0Ni8yNDA1CitmIDU4NTYvOTA2Ni8yNDA2IDUwNDgvOTA3MC8yNDA2IDUwNTMvOTA2OS8yNDA2CitmIDUwNTMvOTA2OS8yNDA3IDU4NTcvOTA2Ny8yNDA3IDU4NTYvOTA2Ni8yNDA3CitmIDU4NjYvOTE0Ny8yNDA4IDczMDMvOTE0OC8yNDA4IDczMDQvOTE0OS8yNDA4CitmIDczMDUvOTE1MC8yNDA5IDczMDYvOTE1MS8yNDA5IDU4NjYvOTE1Mi8yNDA5CitmIDU4NTYvOTA2Ni8yNDEwIDUwNjYvNzc2MC8yNDEwIDQxNzYvNzc0My8yNDEwCitmIDQxNzYvNzc0My8yNDExIDQxNzUvNzc0NC8yNDExIDU4NTYvOTA2Ni8yNDExCitmIDQwNjMvNzQ4NS8yNDEyIDQwMzgvNzQ3OC8yNDEyIDU4NTkvNzQ0OS8yNDEyCitmIDU4NTkvNzQ0OS8yNDEzIDQxNzAvNzQ1MS8yNDEzIDQwNjMvNzQ4NS8yNDEzCitmIDQwMzgvNzQ3OC8yNDE0IDUwNDgvNzQ4MS8yNDE0IDU4NTYvNzc0Ny8yNDE0CitmIDU4NTYvNzc0Ny8yNDE1IDU4NTkvNzQ0OS8yNDE1IDQwMzgvNzQ3OC8yNDE1CitmIDQwNTcvNzQ1Mi8yNDE2IDQwMjEvNzQzMS8yNDE2IDU4NjAvNzQ3OS8yNDE2CitmIDU4NjAvOTE1My8yNDE3IDQwMjEvNzQzNC8yNDE3IDQwMDMvNzQwMi8yNDE3CitmIDQwMDMvOTE1NC8yNDE4IDU4NjEvNzQ4MC8yNDE4IDU4NjAvNzQ3OS8yNDE4CitmIDQwMzEvNzQwMS8yNDE5IDU4NTEvOTEzNy8yNDE5IDU4NjEvOTEzOS8yNDE5CitmIDU4NjEvOTEzOS8yNDIwIDQwMDMvNzQwMi8yNDIwIDQwMzEvNzQwMS8yNDIwCitmIDU4NzIvOTE1NS8yNDIxIDU4NzMvOTE1Ni8yNDIxIDU4NjIvOTEwNy8yNDIxCitmIDU4NjIvOTEwNy8yNDIyIDUwNjAvOTE1Ny8yNDIyIDU4NzIvOTE1NS8yNDIyCitmIDUwNjgvOTE1OC8yNDIzIDUwNjAvOTE1Ny8yNDIzIDU4NjIvOTEwNy8yNDIzCitmIDU4NjIvOTEwNy8yNDI0IDU4NjYvOTEwNi8yNDI0IDUwNjgvOTE1OC8yNDI0CitmIDU4NTUvOTE1OS8yNDI1IDUwNjEvOTE2MC8yNDI1IDczMDcvOTE2MS8yNDI1CitmIDczMDgvOTE2Mi8yNDI2IDczMDkvOTE2My8yNDI2IDU4NTUvOTE2NC8yNDI2CitmIDUwNjIvOTE2NS8yNDI3IDU4NjQvOTA5Ni8yNDI3IDU4NjUvOTA5NS8yNDI3CitmIDU4NjUvOTA5NS8yNDI4IDUwNjMvOTE2Ni8yNDI4IDUwNjIvOTE2NS8yNDI4CitmIDczMTAvOTE2Ny8yNDI5IDU4NTgvOTE2OC8yNDI5IDUwNjgvOTE2OS8yNDI5CitmIDUwNjgvOTE1OC8yNDMwIDU4NjYvOTEwNi8yNDMwIDczMTEvOTE3MC8yNDMwCitmIDUwNjIvOTE2NS8yNDMxIDU4NTMvOTE3MS8yNDMxIDU4NjcvOTEwMC8yNDMxCitmIDU4NjcvOTEwMC8yNDMyIDU4NjQvOTA5Ni8yNDMyIDUwNjIvOTE2NS8yNDMyCitmIDU4NTMvOTE3MS8yNDMzIDczMTIvOTE3Mi8yNDMzIDU4NjgvOTEzNS8yNDMzCitmIDU4NjgvOTEzNS8yNDM0IDU4NjcvOTEwMC8yNDM0IDU4NTMvOTE3MS8yNDM0CitmIDczMTMvOTE3My8yNDM1IDUwNjEvOTE3NC8yNDM1IDczMTQvOTE3NS8yNDM1CitmIDczMTUvOTE3Ni8yNDM2IDczMTYvOTE3Ny8yNDM2IDczMTcvOTE3OC8yNDM2CitmIDUwNjQvOTA3OS82OTcgNTA2NS85MDc4LzY5NyA3MzE4LzkxNzkvNjk3CitmIDczMTkvOTE4MC82OTcgNzMyMC85MTgxLzY5NyA1MDY0LzkxODIvNjk3CitmIDUwNTEvNzc1Ny8yNDM3IDczMjEvOTE4My8yNDM3IDU4NzAvNzc1OC8yNDM3CitmIDU4NzAvOTE4NC82OTcgNzMyMi85MTg1LzY5NyA3MzIzLzkxODYvNjk3CitmIDczMjQvOTE4Ny82OTcgNTg3MS85MDg0LzY5NyA1ODcwLzc3NTgvNjk3CitmIDU4NjIvOTEwNy8yNDM4IDU4NzMvOTE1Ni8yNDM4IDczMjUvOTE4OC8yNDM4CitmIDczMjYvOTE4OS8yNDM5IDczMjcvOTE5MC8yNDM5IDU4NjIvOTE5MS8yNDM5CitmIDUwMzcvOTE5Mi8yMzYyIDUwMzAvOTE5My8yMzYyIDU5NDYvODk3OC8yMzYyCitmIDU5NDYvODk3OC8yMzYyIDU5NTMvODk3Ny8yMzYyIDUwMzcvOTE5Mi8yMzYyCitmIDUwMzAvOTE5My8yMzYzIDUwMzEvOTE5NC8yMzYzIDU5NDcvODk4My8yMzYzCitmIDU5NDcvODk4My8yMzYzIDU5NDYvODk3OC8yMzYzIDUwMzAvOTE5My8yMzYzCitmIDczMjgvOTE5NS8yMzY1IDUwMzIvOTE5Ni8yMzY1IDU5NDgvODk5NC8yMzY1CitmIDU5NDgvOTE5Ny8yMzY1IDczMjkvOTE5OC8yMzY1IDczMzAvOTE5OS8yMzY1CitmIDUwMzIvOTE5Ni8xOTI2IDUwMzMvOTIwMC8xOTI2IDU5NDkvODk5NS8xOTI2CitmIDU5NDkvODk5NS8xOTI2IDU5NDgvODk5NC8xOTI2IDUwMzIvOTE5Ni8xOTI2CitmIDUwMzMvOTIwMC8yMTczIDUwMzQvOTIwMS8yMTczIDU5NTAvOTAwMC8yMTczCitmIDU5NTAvOTAwMC8yMTczIDU5NDkvODk5NS8yMTczIDUwMzMvOTIwMC8yMTczCitmIDUwMzQvOTIwMS8yMzY2IDUwMzUvOTIwMi8yMzY2IDU5NTEvOTAwNS8yMzY2CitmIDU5NTEvOTAwNS8yMzY2IDU5NTAvOTAwMC8yMzY2IDUwMzQvOTIwMS8yMzY2CitmIDczMzEvOTIwMy8yMzY3IDUwMzYvOTIwNC8yMzY3IDU5NTIvOTAxNi8yMzY3CitmIDU5NTIvOTIwNS8yMzY3IDczMzIvOTIwNi8yMzY3IDczMzMvOTIwNy8yMzY3CitmIDUwMzYvOTIwNC8yMzY4IDUwNDUvOTIwOC8yMzY4IDU5NjEvOTAxNy8yMzY4CitmIDU5NjEvOTAxNy8yMzY4IDU5NTIvOTAxNi8yMzY4IDUwMzYvOTIwNC8yMzY4CitmIDUwMzgvOTIwOS8yMzY5IDUwMzcvOTE5Mi8yMzY5IDU5NTMvODk3Ny8yMzY5CitmIDU5NTMvODk3Ny8yMzY5IDU5NTQvOTAyMi8yMzY5IDUwMzgvOTIwOS8yMzY5CitmIDUwMzkvOTIxMC8yMzcwIDUwMzgvOTIwOS8yMzcwIDU5NTQvOTAyMi8yMzcwCitmIDU5NTQvOTAyMi8yMzcwIDU5NTUvOTAyNy8yMzcwIDUwMzkvOTIxMC8yMzcwCitmIDUwNDAvOTIxMS8yMzcxIDczMzQvOTIxMi8yMzcxIDczMzUvOTIxMy8yMzcxCitmIDczMzYvOTIxNC8yMzcxIDU5NTYvOTAzOS8yMzcxIDUwNDAvOTIxNS8yMzcxCitmIDUwNDEvOTIxNi8yMzczIDUwNDAvOTIxNS8yMzczIDU5NTYvOTAzOS8yMzczCitmIDU5NTYvOTAzOS8yMzczIDU5NTcvOTAzOC8yMzczIDUwNDEvOTIxNi8yMzczCitmIDUwNDIvOTIxNy8yMDc2IDUwNDEvOTIxNi8yMDc2IDU5NTcvOTAzOC8yMDc2CitmIDU5NTcvOTAzOC8yMDc2IDU5NTgvOTA0NC8yMDc2IDUwNDIvOTIxNy8yMDc2CitmIDUwNDMvOTIxOC8yMzc1IDUwNDIvOTIxNy8yMzc1IDU5NTgvOTA0NC8yMzc1CitmIDU5NTgvOTA0NC8yMzc1IDU5NTkvOTA0OS8yMzc1IDUwNDMvOTIxOC8yMzc1CitmIDUwNDQvOTIxOS8yMzc2IDczMzcvOTIyMC8yMzc2IDczMzgvOTIyMS8yMzc2CitmIDczMzkvOTIyMi8yMzc2IDU5NjAvOTA2MC8yMzc2IDUwNDQvOTIyMy8yMzc2CitmIDUwNDUvOTIwOC8yMzc3IDUwNDQvOTIyMy8yMzc3IDU5NjAvOTA2MC8yMzc3CitmIDU5NjAvOTA2MC8yMzc3IDU5NjEvOTAxNy8yMzc3IDUwNDUvOTIwOC8yMzc3CitmIDU4NzIvOTE1NS8yNDIyIDUwNjAvOTE1Ny8yNDIyIDU5NjIvOTIyNC8yNDIyCitmIDU5NjIvOTIyNC8yNDIyIDU5NzAvOTIyNS8yNDIyIDU4NzIvOTE1NS8yNDIyCitmIDczNDAvOTIyNi8yNDQwIDczNDEvOTIyNy8yNDQwIDU5NjMvOTIyOC8yNDQwCitmIDU5NjMvOTIyOS8yNDQxIDU5NjkvOTIzMC8yNDQxIDczNDIvOTIzMS8yNDQxCitmIDUwNjIvOTE2NS8yNDQyIDUwNjMvOTE2Ni8yNDQyIDU5NjUvOTIzMi8yNDQyCitmIDU5NjUvOTIzMi8yNDQyIDU5NjQvOTIzMy8yNDQyIDUwNjIvOTE2NS8yNDQyCitmIDU4NTMvOTE3MS8yNDQzIDUwNjIvOTE2NS8yNDQzIDU5NjQvOTIzMy8yNDQzCitmIDU5NjQvOTIzMy8yNDQzIDU5NjcvOTIzNC8yNDQzIDU4NTMvOTE3MS8yNDQzCitmIDUwNjAvOTE1Ny8yNDIzIDUwNjgvOTE1OC8yNDIzIDU5NjYvOTIzNS8yNDIzCitmIDU5NjYvOTIzNS8yNDIzIDU5NjIvOTIyNC8yNDIzIDUwNjAvOTE1Ny8yNDIzCitmIDczNDMvOTE3Mi8yNDQ0IDU4NTMvOTE3MS8yNDQ0IDU5NjcvOTIzNC8yNDQ0CitmIDU5NjcvOTIzNi8yNDQ0IDU5NjgvOTIzNy8yNDQ0IDczNDQvOTIzOC8yNDQ0CitmIDczNDUvOTIzOS8yNDQ1IDczNDYvOTI0MC8yNDQ1IDczNDcvOTI0MS8yNDQ1CitmIDczNDgvOTI0Mi8yNDQ2IDU5NjMvOTI0My8yNDQ2IDczNDkvOTI0NC8yNDQ2CitmIDUwNjgvOTE2OS8yNDQ3IDU4NTgvOTE2OC8yNDQ3IDczNTAvOTI0NS8yNDQ3CitmIDczNTEvOTI0Ni8yNDQ3IDU5NjYvOTIzNS8yNDQ3IDUwNjgvOTE1OC8yNDQ3CitmIDQyNDAvNzgxOS8yNDQ4IDQyNDEvNzgxOC8yNDQ4IDU5NzQvOTI0Ny8yNDQ4CitmIDU5NzQvOTI0Ny8yNDQ4IDU5NzMvOTI0OC8yNDQ4IDQyNDAvNzgxOS8yNDQ4CitmIDQyNDEvNzgxOC8yNDQ5IDQyNDIvNzgyMi8yNDQ5IDU5NzUvOTI0OS8yNDQ5CitmIDU5NzUvOTI0OS8yNDQ5IDU5NzQvOTI0Ny8yNDQ5IDQyNDEvNzgxOC8yNDQ5CitmIDczNTIvNzgyNS8yMDM1IDQyNDMvNzgyNC8yMDM1IDU5NzYvOTI1MC8yMDM1CitmIDU5NzYvOTI1MS8yMDM1IDczNTMvOTI1Mi8yMDM1IDczNTQvOTI1My8yMDM1CitmIDQyNDMvNzgyNC82OTcgNDI0OC83ODMwLzY5NyA1OTgxLzkyNTQvNjk3CitmIDU5ODEvOTI1NC82OTcgNTk3Ni85MjUwLzY5NyA0MjQzLzc4MjQvNjk3CitmIDQyNDQvNzgzMy8yNDUwIDQyNDUvNzgzMi8yNDUwIDU5NzgvOTI1NS8yNDUwCitmIDU5NzgvOTI1NS8yNDUwIDU5NzcvOTI1Ni8yNDUwIDQyNDQvNzgzMy8yNDUwCitmIDczNTUvNzgzNy8yMDM5IDQyNDYvNzgzNi8yMDM5IDU5NzkvOTI1Ny8yMDM5CitmIDU5NzkvOTI1OC8yMDM5IDczNTYvOTI1OS8yMDM5IDczNTcvOTI2MC8yMDM5CitmIDQyNDYvNzgzNi8yNDUxIDQyNDcvNzg0Mi8yNDUxIDU5ODAvOTI2MS8yNDUxCitmIDU5ODAvOTI2MS8yNDUxIDU5NzkvOTI1Ny8yNDUxIDQyNDYvNzgzNi8yNDUxCitmIDUwODkvNzg0NC82OTcgNDI0OS83ODQzLzY5NyA1OTgyLzkyNjIvNjk3CitmIDU5ODIvOTI2Mi82OTcgNTk4NC85MjYzLzY5NyA1MDg5Lzc4NDQvNjk3CitmIDQyNDkvNzg0My82OTcgNDI0NC83ODMzLzY5NyA1OTc3LzkyNTYvNjk3CitmIDU5NzcvOTI1Ni82OTcgNTk4Mi85MjYyLzY5NyA0MjQ5Lzc4NDMvNjk3CitmIDQyNDcvNzg0Mi8yNDUyIDQyNjEvNzg0Ny8yNDUyIDU5ODMvOTI2NC8yNDUyCitmIDU5ODMvOTI2NC8yNDUyIDU5ODAvOTI2MS8yNDUyIDQyNDcvNzg0Mi8yNDUyCitmIDQyMTIvNzg1MC8yNDUzIDQyNDAvNzgxOS8yNDUzIDU5NzMvOTI0OC8yNDUzCitmIDU5NzMvOTI0OC8yNDUzIDU5NzEvOTI2NS8yNDUzIDQyMTIvNzg1MC8yNDUzCitmIDczNTgvOTI2Ni8yNDU0IDczNTkvOTI2Ny8yNDU0IDU5NzIvOTI2OC8yNDU0CitmIDU5NzIvOTI2OS8yNDU0IDczNjAvOTI3MC8yNDU0IDczNjEvOTI3MS8yNDU0CitmIDQyNDgvNzgzMC82OTcgNTA4OS83ODQ0LzY5NyA1OTg0LzkyNjMvNjk3CitmIDU5ODQvOTI2My82OTcgNTk4MS85MjU0LzY5NyA0MjQ4Lzc4MzAvNjk3CitmIDM5NjEvNzM2OC82ODcgNDA0My83NDk4LzY4NyA0MDY0Lzc1MDAvNjg3CitmIDQwNjQvNzUwMC82ODcgMzk2Ni83MzY3LzY4NyAzOTYxLzczNjgvNjg3CitmIDQzOTEvODA2OS8yNDU1IDQzOTIvODA2OC8yNDU1IDU5ODUvODA5Mi8yNDU1CitmIDU5ODUvODA5Mi8yNDU2IDU5ODgvODA5MS8yNDU2IDQzOTEvODA2OS8yNDU2CitmIDQzOTIvODA2OC8yNDU3IDQzOTMvODA3MS8yNDU3IDU5ODkvODA5My8yNDU3CitmIDU5ODkvODA5My8yNDU4IDU5ODUvODA5Mi8yNDU4IDQzOTIvODA2OC8yNDU4CitmIDQ2NTYvODA4NS8yNDU5IDQzODkvODA4Mi8yNDU5IDU5ODYvODEwMS8yNDU5CitmIDU5ODYvODEwMS8yNDYwIDU5OTUvODEwMC8yNDYwIDQ2NTYvODA4NS8yNDYwCitmIDQzODkvODA4Mi8yNDYxIDQzOTAvODA4NC8yNDYxIDU5ODcvODEwMi8yNDYxCitmIDU5ODcvODEwMi8yNDYyIDU5ODYvODEwMS8yNDYyIDQzODkvODA4Mi8yNDYyCitmIDQzOTAvODA4NC8yNDYzIDQzOTEvODA2OS8yNDYzIDU5ODgvODA5MS8yNDYzCitmIDU5ODgvODA5MS8yNDY0IDU5ODcvODEwMi8yNDY0IDQzOTAvODA4NC8yNDY0CitmIDU5OTAvODEwNC8yNDY1IDQ0MDgvODEwOS8yNDY1IDQ0MDcvODA5NC8yNDY1CitmIDQ0MDcvODA5NC8yNDY2IDU5ODkvODA5My8yNDY2IDU5OTAvODEwNC8yNDY2CitmIDQ0MDkvODA5Ny8yNDY3IDQ0MDgvODEwOS8yNDY3IDU5OTAvODEwNC8yNDY3CitmIDU5OTAvODEwNC8yNDY4IDU5OTEvODEwNi8yNDY4IDQ0MDkvODA5Ny8yNDY4CitmIDQ2NjMvODA5OC8yNDY5IDQ0MDkvODA5Ny8yNDY5IDU5OTEvODEwNi8yNDY5CitmIDU5OTEvODEwNi8yNDcwIDYwMDAvODEwOC8yNDcwIDQ2NjMvODA5OC8yNDcwCitmIDU5OTMvODQxMi8yNDcxIDQ2NDAvODM5My8yNDcxIDQ2MzcvODM5Mi8yNDcxCitmIDQ2MzcvODM5Mi8yNDcyIDU5OTIvODQxMy8yNDcyIDU5OTMvODQxMi8yNDcyCitmIDQ2NDIvODM5NS8yNDczIDQ2NDAvODM5My8yNDczIDU5OTMvODQxMi8yNDczCitmIDU5OTMvODQxMi8yNDc0IDU5OTQvODQxNS8yNDc0IDQ2NDIvODM5NS8yNDc0CitmIDQ2NTQvODQwNS8yNDc1IDQ2NTYvODA4NS8yNDc1IDU5OTUvODEwMC8yNDc1CitmIDU5OTUvODEwMC8yNDc2IDU5OTYvODQxOC8yNDc2IDQ2NTQvODQwNS8yNDc2CitmIDQ2NTMvODQwNi8yNDc3IDQ2NTQvODQwNS8yNDc3IDU5OTYvODQxOC8yNDc3CitmIDU5OTYvODQxOC8yNDc4IDU5OTcvODQxOS8yNDc4IDQ2NTMvODQwNi8yNDc4CitmIDQ2MzcvODM5Mi8yNDc5IDQ2NTMvODQwNi8yNDc5IDU5OTcvODQxOS8yNDc5CitmIDU5OTcvODQxOS8yNDc5IDU5OTIvODQxMy8yNDc5IDQ2MzcvODM5Mi8yNDc5CitmIDQ2NjIvODQxNC8yNDgwIDQ2NjkvODQyNC8yNDgwIDU5OTgvODQyMC8yNDgwCitmIDU5OTgvODQyMC8yNDgxIDU5OTQvODQxNS8yNDgxIDQ2NjIvODQxNC8yNDgxCitmIDU5OTgvODQyMC8yNDgyIDQ2NjkvODQyNC8yNDgyIDQ2NjYvODQxNi8yNDgyCitmIDQ2NjYvODQxNi8yNDgzIDU5OTkvODQyMi8yNDgzIDU5OTgvODQyMC8yNDgzCitmIDQ2NjYvODQxNi8yNDg0IDQ2NjMvODA5OC8yNDg0IDYwMDAvODEwOC8yNDg0CitmIDYwMDAvODEwOC8yNDg1IDU5OTkvODQyMi8yNDg1IDQ2NjYvODQxNi8yNDg1CitmIDM2OTQvOTI3Mi82ODcgMzY5NS85MjczLzY4NyAzNjk2LzkyNzQvNjg3CitmIDM2OTYvOTI3NC82ODcgMzY5Ny85Mjc1LzY4NyAzNjk0LzkyNzIvNjg3CitmIDUxMTMvOTI3Ni82ODcgNTExNi85Mjc3LzY4NyA1MTA2LzkyNzgvNjg3CitmIDUxMDYvOTI3OC82ODcgNTA5Ny85Mjc5LzY4NyA1MTEzLzkyNzYvNjg3CitmIDUxMTIvOTI4MC8yNDg2IDU0MDAvOTI4MS8yNDg2IDUzOTAvOTI4Mi8yNDg2CitmIDUzOTAvOTI4Mi8yNDg3IDUwOTUvOTI4My8yNDg3IDUxMTIvOTI4MC8yNDg3CitmIDUxMDMvOTI4NC8yNDg4IDUzOTYvOTI4NS8yNDg4IDUzOTEvOTI4Ni8yNDg4CitmIDUzOTEvOTI4Ni8yNDg5IDUwOTYvOTI4Ny8yNDg5IDUxMDMvOTI4NC8yNDg5CitmIDUwOTEvOTI4OC8yNDkwIDUxNDEvOTI4OS8yNDkwIDU0MTAvOTI5MC8yNDkwCitmIDU0MTAvOTI5MC8yNDkxIDUzOTIvOTI5MS8yNDkxIDUwOTEvOTI4OC8yNDkxCitmIDUxMjQvOTI5Mi8yNDkyIDU0MDQvOTI5My8yNDkyIDUzOTMvOTI5NC8yNDkyCitmIDUzOTMvOTI5NC8yNDkzIDUwOTIvOTI5NS8yNDkzIDUxMjQvOTI5Mi8yNDkzCitmIDUxMjkvOTI5Ni8yNDk0IDU0MDcvOTI5Ny8yNDk0IDUzOTQvOTI5OC8yNDk0CitmIDUzOTQvOTI5OC8yNDk1IDUwOTMvOTI5OS8yNDk1IDUxMjkvOTI5Ni8yNDk1CitmIDUxMzQvOTMwMC8yNDk2IDU0MDgvOTMwMS8yNDk2IDUzOTUvOTMwMi8yNDk2CitmIDUzOTUvOTMwMi8yNDk3IDUwOTQvOTMwMy8yNDk3IDUxMzQvOTMwMC8yNDk3CitmIDUxMjAvOTMwNC82ODcgNTEyMS85MzA1LzY4NyA1MTExLzkzMDYvNjg3CitmIDUxMTEvOTMwNi82ODcgNTEwNS85MzA3LzY4NyA1MTIwLzkzMDQvNjg3CitmIDUxMTkvOTMwOC8yNDk4IDU0MDMvOTMwOS8yNDk4IDUzOTYvOTI4NS8yNDk4CitmIDUzOTYvOTI4NS8yNDk5IDUxMDMvOTI4NC8yNDk5IDUxMTkvOTMwOC8yNDk5CitmIDUxMDQvOTMxMC8yNTAwIDUwOTUvOTMxMS8yNTAwIDUzOTAvOTMxMi8yNTAwCitmIDUzOTAvOTMxMi8yNTAxIDUzOTcvOTMxMy8yNTAxIDUxMDQvOTMxMC8yNTAxCitmIDUwOTgvOTMxNC82ODcgNTEwNS85MzA3LzY4NyA1MTExLzkzMDYvNjg3CitmIDUxMTEvOTMwNi82ODcgNTEwOS85MzE1LzY4NyA1MDk4LzkzMTQvNjg3CitmIDUxMDcvOTMxNi8yNTAyIDUwOTYvOTMxNy8yNTAyIDUzOTEvOTMxOC8yNTAyCitmIDUzOTEvOTMxOC8yNTAzIDUzOTgvOTMxOS8yNTAzIDUxMDcvOTMxNi8yNTAzCitmIDUxMTQvOTMyMC8yNTA0IDU0MDEvOTMyMS8yNTA0IDUzOTkvOTMyMi8yNTA0CitmIDUzOTkvOTMyMi8yNTA0IDUxMDgvOTMyMy8yNTA0IDUxMTQvOTMyMC8yNTA0CitmIDUxMTUvOTMyNC82ODcgNTEzNy85MzI1LzY4NyA1MTM2LzkzMjYvNjg3CitmIDUxMzYvOTMyNi82ODcgNTExMC85MzI3LzY4NyA1MTE1LzkzMjQvNjg3CitmIDUxMDkvOTMxNS82ODcgNTExMS85MzA2LzY4NyA1MTE2LzkyNzcvNjg3CitmIDUxMTYvOTI3Ny82ODcgNTExMy85Mjc2LzY4NyA1MTA5LzkzMTUvNjg3CitmIDUxMDcvOTMxNi8yNTAzIDUzOTgvOTMxOS8yNTAzIDU0MDAvOTI4MS8yNTAzCitmIDU0MDAvOTI4MS8yNDg3IDUxMTIvOTI4MC8yNDg3IDUxMDcvOTMxNi8yNDg3CitmIDUxMTQvOTMyMC8yNTA0IDUwOTQvOTMyOC8yNTA0IDUzOTUvOTMyOS8yNTA0CitmIDUzOTUvOTMyOS8yNTA0IDU0MDEvOTMyMS8yNTA0IDUxMTQvOTMyMC8yNTA0CitmIDUxMDIvOTMzMC82ODcgNTEzNS85MzMxLzY4NyA1MTM3LzkzMjUvNjg3CitmIDUxMzcvOTMyNS82ODcgNTExNS85MzI0LzY4NyA1MTAyLzkzMzAvNjg3CitmIDUxMDQvOTMxMC8yNTA1IDUzOTcvOTMxMy8yNTA1IDU0MDIvOTMzMi8yNTA1CitmIDU0MDIvOTMzMi8yNDk3IDUxMTcvOTMzMy8yNDk3IDUxMDQvOTMxMC8yNDk3CitmIDUxMjAvOTMwNC82ODcgNTA5OS85MzM0LzY4NyA1MTI3LzkzMzUvNjg3CitmIDUxMjcvOTMzNS82ODcgNTEyMS85MzA1LzY4NyA1MTIwLzkzMDQvNjg3CitmIDUwOTEvOTMzNi8yNTA2IDUzOTIvOTMzNy8yNTA2IDU0MDMvOTMwOS8yNTA2CitmIDU0MDMvOTMwOS8yNTA3IDUxMTkvOTMwOC8yNTA3IDUwOTEvOTMzNi8yNTA3CitmIDUxMTYvOTI3Ny82ODcgNTExMS85MzA2LzY4NyA1MTIxLzkzMDUvNjg3CitmIDUxMjEvOTMwNS82ODcgNTEyMi85MzM4LzY4NyA1MTE2LzkyNzcvNjg3CitmIDUxMDYvOTI3OC82ODcgNTExNi85Mjc3LzY4NyA1MTIyLzkzMzgvNjg3CitmIDUxMjIvOTMzOC82ODcgNTExOC85MzM5LzY4NyA1MTA2LzkyNzgvNjg3CitmIDUxMzgvOTM0MC8yNDkzIDU0MDkvOTM0MS8yNDkzIDU0MDQvOTI5My8yNDkzCitmIDU0MDQvOTI5My8yNDkzIDUxMjQvOTI5Mi8yNDkzIDUxMzgvOTM0MC8yNDkzCitmIDUxMTcvOTMzMy8yNTA4IDU0MDIvOTMzMi8yNTA4IDU0MDUvOTM0Mi8yNTA4CitmIDU0MDUvOTM0Mi8yNDk3IDUxMjMvOTM0My8yNDk3IDUxMTcvOTMzMy8yNDk3CitmIDUxMjIvOTMzOC82ODcgNTEyMS85MzA1LzY4NyA1MTI3LzkzMzUvNjg3CitmIDUxMjcvOTMzNS82ODcgNTEyOC85MzQ0LzY4NyA1MTIyLzkzMzgvNjg3CitmIDUxMTgvOTMzOS82ODcgNTEyMi85MzM4LzY4NyA1MTI4LzkzNDQvNjg3CitmIDUxMjgvOTM0NC82ODcgNTEyNi85MzQ1LzY4NyA1MTE4LzkzMzkvNjg3CitmIDUxMzkvOTM0Ni82ODcgNTE0MC85MzQ3LzY4NyA1MTMzLzkzNDgvNjg3CitmIDUxMzMvOTM0OC82ODcgNTEyNS85MzQ5LzY4NyA1MTM5LzkzNDYvNjg3CitmIDUxMzAvOTM1MC8yNTA5IDUwOTIvOTM1MS8yNTA5IDUzOTMvOTM1Mi8yNTA5CitmIDUzOTMvOTM1Mi8yNTEwIDU0MDYvOTM1My8yNTEwIDUxMzAvOTM1MC8yNTEwCitmIDUxNDMvOTM1NC8yNTA0IDU0MTEvOTM1NS8yNTA0IDU0MDcvOTI5Ny8yNTA0CitmIDU0MDcvOTI5Ny8yNTExIDUxMjkvOTI5Ni8yNTExIDUxNDMvOTM1NC8yNTExCitmIDUxMzEvOTM1Ni82ODcgNTEwMC85MzU3LzY4NyA1MTI1LzkzNDkvNjg3CitmIDUxMjUvOTM0OS82ODcgNTEzMy85MzQ4LzY4NyA1MTMxLzkzNTYvNjg3CitmIDUxNDQvOTM1OC82ODcgNTE0Ni85MzU5LzY4NyA1MTQwLzkzNDcvNjg3CitmIDUxNDAvOTM0Ny82ODcgNTEzMi85MzYwLzY4NyA1MTQ0LzkzNTgvNjg3CitmIDUxMjMvOTM0My8yNTEyIDU0MDUvOTM0Mi8yNTEyIDU0MDgvOTMwMS8yNTEyCitmIDU0MDgvOTMwMS8yNTA4IDUxMzQvOTMwMC8yNTA4IDUxMjMvOTM0My8yNTA4CitmIDUxMjgvOTM0NC82ODcgNTEyNy85MzM1LzY4NyA1MTM2LzkzMjYvNjg3CitmIDUxMzYvOTMyNi82ODcgNTEzNy85MzI1LzY4NyA1MTI4LzkzNDQvNjg3CitmIDUxMjYvOTM0NS82ODcgNTEyOC85MzQ0LzY4NyA1MTM3LzkzMjUvNjg3CitmIDUxMzcvOTMyNS82ODcgNTEzNS85MzMxLzY4NyA1MTI2LzkzNDUvNjg3CitmIDUxMzgvOTM0MC8yNDkzIDUwOTMvOTM2MS8yNDkzIDUzOTQvOTM2Mi8yNDkzCitmIDUzOTQvOTM2Mi8yNTEzIDU0MDkvOTM0MS8yNTEzIDUxMzgvOTM0MC8yNTEzCitmIDUxMDEvOTM2My82ODcgNTEzMi85MzYwLzY4NyA1MTQwLzkzNDcvNjg3CitmIDUxNDAvOTM0Ny82ODcgNTEzOS85MzQ2LzY4NyA1MTAxLzkzNjMvNjg3CitmIDUxMjcvOTMzNS82ODcgNTE0NS85MzY0LzY4NyA1MTQ2LzkzNTkvNjg3CitmIDUxNDYvOTM1OS82ODcgNTEzNi85MzI2LzY4NyA1MTI3LzkzMzUvNjg3CitmIDUwOTkvOTMzNC82ODcgNTE0Mi85MzY1LzY4NyA1MTQ1LzkzNjQvNjg3CitmIDUxNDUvOTM2NC82ODcgNTEyNy85MzM1LzY4NyA1MDk5LzkzMzQvNjg3CitmIDUxMzAvOTM1MC8yNTE0IDU0MDYvOTM1My8yNTE0IDU0MTAvOTI5MC8yNTE0CitmIDU0MTAvOTI5MC8yNDkwIDUxNDEvOTI4OS8yNDkwIDUxMzAvOTM1MC8yNDkwCitmIDUxMDgvOTMyMy8yNTA0IDUzOTkvOTMyMi8yNTA0IDU0MTEvOTM1NS8yNTA0CitmIDU0MTEvOTM1NS8yNTE1IDUxNDMvOTM1NC8yNTE1IDUxMDgvOTMyMy8yNTE1CitmIDUxMTAvOTMyNy82ODcgNTEzNi85MzI2LzY4NyA1MTQ2LzkzNTkvNjg3CitmIDUxNDYvOTM1OS82ODcgNTE0NC85MzU4LzY4NyA1MTEwLzkzMjcvNjg3CitmIDUxMzMvOTM0OC82ODcgNTE0MC85MzQ3LzY4NyA1MTQ2LzkzNTkvNjg3CitmIDUxNDYvOTM1OS82ODcgNTE0NS85MzY0LzY4NyA1MTMzLzkzNDgvNjg3CitmIDUxNDIvOTM2NS82ODcgNTEzMS85MzU2LzY4NyA1MTMzLzkzNDgvNjg3CitmIDUxMzMvOTM0OC82ODcgNTE0NS85MzY0LzY4NyA1MTQyLzkzNjUvNjg3CitmIDUyNTgvOTM2Ni82ODcgNTUxMC85MzY3LzY4NyA1NTA4LzkzNjgvNjg3CitmIDU1MDgvOTM2OC82ODcgNTIwNi85MzY5LzY4NyA1MjU4LzkzNjYvNjg3CitmIDUyNTAvOTM3MC82ODcgNTIyNy85MzcxLzY4NyA1MjI4LzkzNzIvNjg3CitmIDUyMjgvOTM3Mi82ODcgNTI0OS85MzczLzY4NyA1MjUwLzkzNzAvNjg3CitmIDUyNDgvOTM3NC82ODcgNTI0OS85MzczLzY4NyA1MjI4LzkzNzIvNjg3CitmIDUyMjgvOTM3Mi82ODcgNTIyOS85Mzc1LzY4NyA1MjQ4LzkzNzQvNjg3CitmIDUyNDcvOTM3Ni82ODcgNTI0OC85Mzc0LzY4NyA1MjI5LzkzNzUvNjg3CitmIDUyMjkvOTM3NS82ODcgNTIzMC85Mzc3LzY4NyA1MjQ3LzkzNzYvNjg3CitmIDUyNDYvOTM3OC82ODcgNTI0Ny85Mzc2LzY4NyA1MjMwLzkzNzcvNjg3CitmIDUyMzAvOTM3Ny82ODcgNTIzMS85Mzc5LzY4NyA1MjQ2LzkzNzgvNjg3CitmIDUyNDUvOTM4MC82ODcgNTI0Ni85Mzc4LzY4NyA1MjMxLzkzNzkvNjg3CitmIDUyMzEvOTM3OS82ODcgNTIzMi85MzgxLzY4NyA1MjQ1LzkzODAvNjg3CitmIDUyNDQvOTM4Mi82ODcgNTI0NS85MzgwLzY4NyA1MjMyLzkzODEvNjg3CitmIDUyMzIvOTM4MS82ODcgNTIzMy85MzgzLzY4NyA1MjQ0LzkzODIvNjg3CitmIDUyNDMvOTM4NC82ODcgNTI0NC85MzgyLzY4NyA1MjMzLzkzODMvNjg3CitmIDUyMzMvOTM4My82ODcgNTIzNC85Mzg1LzY4NyA1MjQzLzkzODQvNjg3CitmIDUyNDIvOTM4Ni82ODcgNTI0My85Mzg0LzY4NyA1MjM0LzkzODUvNjg3CitmIDUyMzQvOTM4NS82ODcgNTIzNS85Mzg3LzY4NyA1MjQyLzkzODYvNjg3CitmIDUyNDEvOTM4OC82ODcgNTI0Mi85Mzg2LzY4NyA1MjM1LzkzODcvNjg3CitmIDUyMzUvOTM4Ny82ODcgNTIzNi85Mzg5LzY4NyA1MjQxLzkzODgvNjg3CitmIDUyNDAvOTM5MC82ODcgNTI4NS85MzkxLzY4NyA1MjEwLzkzOTIvNjg3CitmIDUyOTMvOTM5My82ODcgNTIxMS85Mzk0LzY4NyA1MzA4LzkzOTUvNjg3CitmIDUzMDgvOTM5NS82ODcgNTMwOS85Mzk2LzY4NyA1MjkzLzkzOTMvNjg3CitmIDUzMTIvOTM5Ny82ODcgNTMxMS85Mzk4LzY4NyA1MjcwLzkzOTkvNjg3CitmIDUyNzAvOTM5OS82ODcgNTIzOS85NDAwLzY4NyA1MzEyLzkzOTcvNjg3CitmIDUyOTgvOTQwMS82ODcgNTI3My85NDAyLzY4NyA1Mjk2Lzk0MDMvNjg3CitmIDUyOTYvOTQwMy82ODcgNTI5Ny85NDA0LzY4NyA1Mjk4Lzk0MDEvNjg3CitmIDUyMzkvOTQwMC82ODcgNTI3MC85Mzk5LzY4NyA1MjcxLzk0MDUvNjg3CitmIDUyNzEvOTQwNS82ODcgNTIzOC85NDA2LzY4NyA1MjM5Lzk0MDAvNjg3CitmIDUyMzgvOTQwNi82ODcgNTI3MS85NDA1LzY4NyA1MjI1Lzk0MDcvNjg3CitmIDUyMjUvOTQwNy82ODcgNTIzNy85NDA4LzY4NyA1MjM4Lzk0MDYvNjg3CitmIDUyMjYvOTQwOS82ODcgNTI1MS85NDEwLzY4NyA1NzgzLzk0MTEvNjg3CitmIDU3ODMvOTQxMS82ODcgNTc4NC85NDEyLzY4NyA1MjI2Lzk0MDkvNjg3CitmIDUzMjkvOTQxMy82ODcgNTM0Mi85NDE0LzY4NyA1MzQzLzk0MTUvNjg3CitmIDUzNDMvOTQxNS82ODcgNTMyOC85NDE2LzY4NyA1MzI5Lzk0MTMvNjg3CitmIDUyMTkvOTQxNy82ODcgNTI1Ni85NDE4LzY4NyA1MjU3Lzk0MTkvNjg3CitmIDUyNTcvOTQxOS82ODcgNTIxOC85NDIwLzY4NyA1MjE5Lzk0MTcvNjg3CitmIDUyNTkvOTQyMS82ODcgNTI2Mi85NDIyLzY4NyA1MjYzLzk0MjMvNjg3CitmIDUyNjMvOTQyMy82ODcgNTIwNS85NDI0LzY4NyA1MjU5Lzk0MjEvNjg3CitmIDUyMDUvOTQyNC82ODcgNTI2My85NDIzLzY4NyA1MjY0Lzk0MjUvNjg3CitmIDUyNjQvOTQyNS82ODcgNTIxNS85NDI2LzY4NyA1MjA1Lzk0MjQvNjg3CitmIDUyMDYvOTM2OS82ODcgNTUwOC85MzY4LzY4NyA1MjE2Lzk0MjcvNjg3CitmIDUyMDYvOTM2OS82ODcgNTIxNi85NDI3LzY4NyA1MjE3Lzk0MjgvNjg3CitmIDUyMTcvOTQyOC82ODcgNTM1MC85NDI5LzY4NyA1MjA2LzkzNjkvNjg3CitmIDUyMDYvOTM2OS82ODcgNTM1MC85NDI5LzY4NyA1MzUxLzk0MzAvNjg3CitmIDUzNTEvOTQzMC82ODcgNTI1OC85MzY2LzY4NyA1MjA2LzkzNjkvNjg3CitmIDUyMTkvOTQxNy82ODcgNTUwNi85NDMxLzY4NyA1MjU2Lzk0MTgvNjg3CitmIDUyMTQvOTQzMi82ODcgNTI2NS85NDMzLzY4NyA1MjY2Lzk0MzQvNjg3CitmIDUyNjYvOTQzNC82ODcgNTIxMy85NDM1LzY4NyA1MjE0Lzk0MzIvNjg3CitmIDUyMTMvOTQzNS82ODcgNTI2Ni85NDM0LzY4NyA1MjY3Lzk0MzYvNjg3CitmIDUyNjcvOTQzNi82ODcgNTIxMi85NDM3LzY4NyA1MjEzLzk0MzUvNjg3CitmIDUyODEvOTQzOC82ODcgNTI2OC85NDM5LzY4NyA1MjY5Lzk0NDAvNjg3CitmIDUyNjkvOTQ0MC82ODcgNTI2MC85NDQxLzY4NyA1MjgxLzk0MzgvNjg3CitmIDUyNTkvOTQyMS82ODcgNTI2MC85NDQxLzY4NyA1MjY5Lzk0NDAvNjg3CitmIDUyNjkvOTQ0MC82ODcgNTI2Mi85NDIyLzY4NyA1MjU5Lzk0MjEvNjg3CitmIDUyNTEvOTQxMC82ODcgNTIyNi85NDA5LzY4NyA1MjI3LzkzNzEvNjg3CitmIDUyMjcvOTM3MS82ODcgNTI1MC85MzcwLzY4NyA1MjUxLzk0MTAvNjg3CitmIDUyOTEvOTQ0Mi8yNTE2IDU0ODIvOTQ0My8yNTE2IDU0ODMvOTQ0NC8yNTE2CitmIDU0ODMvOTQ0NC8yNTE3IDUyOTAvOTQ0NS8yNTE3IDUyOTEvOTQ0Mi8yNTE3CitmIDUxODUvOTQ0Ni8yNTE4IDUyODMvOTQ0Ny8yNTE4IDU0NzgvOTQ0OC8yNTE4CitmIDU0NzgvOTQ0OC8yNTE5IDU0MTMvOTQ0OS8yNTE5IDUxODUvOTQ0Ni8yNTE5CitmIDUxODcvOTQ1MC8yNTIwIDU0MTUvOTQ1MS8yNTIwIDU0MTQvOTQ1Mi8yNTIwCitmIDU0MTQvOTQ1Mi8yNTIxIDUxODYvOTQ1My8yNTIxIDUxODcvOTQ1MC8yNTIxCitmIDUxODgvOTQ1NC8yNTIyIDU0MTYvOTQ1NS8yNTIyIDU0MTUvOTQ1Ni8yNTIyCitmIDU0MTUvOTQ1Ni8yNTIzIDUxODcvOTQ1Ny8yNTIzIDUxODgvOTQ1NC8yNTIzCitmIDUyMDQvOTQ1OC8yNTI0IDU0MTcvOTQ1OS8yNTI0IDU0MTYvOTQ1NS8yNTI0CitmIDU0MTYvOTQ1NS8yNTI1IDUxODgvOTQ1NC8yNTI1IDUyMDQvOTQ1OC8yNTI1CitmIDUxODkvOTQ2MC8yNTI2IDU0MTgvOTQ2MS8yNTI2IDU0MTcvOTQ1OS8yNTI2CitmIDU0MTcvOTQ1OS8yNTI3IDUyMDQvOTQ1OC8yNTI3IDUxODkvOTQ2MC8yNTI3CitmIDUxOTAvOTQ2Mi8yNTI4IDU0MTkvOTQ2My8yNTI4IDU0MTgvOTQ2MS8yNTI4CitmIDU0MTgvOTQ2MS8yNTI5IDUxODkvOTQ2MC8yNTI5IDUxOTAvOTQ2Mi8yNTI5CitmIDUxOTEvOTQ2NC8yNTMwIDU0MjAvOTQ2NS8yNTMwIDU0MTkvOTQ2Ni8yNTMwCitmIDU0MTkvOTQ2Ni8yNTMxIDUxOTAvOTQ2Ny8yNTMxIDUxOTEvOTQ2NC8yNTMxCitmIDUxOTIvOTQ2OC8yNTMyIDU0MjEvOTQ2OS8yNTMyIDU0MjAvOTQ2NS8yNTMyCitmIDU0MjAvOTQ2NS8yNTMzIDUxOTEvOTQ2NC8yNTMzIDUxOTIvOTQ2OC8yNTMzCitmIDUxOTMvOTQ3MC8yNTM0IDU0MjIvOTQ3MS8yNTM0IDU0MjEvOTQ2OS8yNTM0CitmIDU0MjEvOTQ2OS8yNTM1IDUxOTIvOTQ2OC8yNTM1IDUxOTMvOTQ3MC8yNTM1CitmIDUxOTQvOTQ3Mi8yNTM2IDU0MjMvOTQ3My8yNTM2IDU0MjIvOTQ3MS8yNTM2CitmIDU0MjIvOTQ3MS8yNTM3IDUxOTMvOTQ3MC8yNTM3IDUxOTQvOTQ3Mi8yNTM3CitmIDUzNDQvOTQ3NC8yNTM4IDUzMjcvOTQ3NS8yNTM4IDU0OTUvOTQ3Ni8yNTM4CitmIDU0OTUvOTQ3Ni8yNTM5IDU1MDEvOTQ3Ny8yNTM5IDUzNDQvOTQ3NC8yNTM5CitmIDU0OTAvOTQ3OC8yNTQwIDU0OTEvOTQ3OS8yNTQwIDUzMTcvOTQ4MC8yNTQwCitmIDUzMTcvOTQ4MC8yNTQxIDUzMTgvOTQ4MS8yNTQxIDU0OTAvOTQ3OC8yNTQxCitmIDUzMDEvOTQ4Mi8yNTQyIDU0ODUvOTQ4My8yNTQyIDU0ODYvOTQ4NC8yNTQyCitmIDU0ODYvOTQ4NC8yNTQzIDUzMDAvOTQ4NS8yNTQzIDUzMDEvOTQ4Mi8yNTQzCitmIDUxNzIvOTQ4Ni8yNTQ0IDUyNzcvOTQ4Ny8yNTQ0IDU0NzUvOTQ4OC8yNTQ0CitmIDU0NzUvOTQ4OC8yNTQ1IDU0MjYvOTQ4OS8yNTQ1IDUxNzIvOTQ4Ni8yNTQ1CitmIDUyNzIvOTQ5MC8yNTQ2IDU0NzMvOTQ5MS8yNTQ2IDU0ODQvOTQ5Mi8yNTQ2CitmIDU0ODQvOTQ5Mi8yNTQ3IDUyOTkvOTQ5My8yNTQ3IDUyNzIvOTQ5MC8yNTQ3CitmIDUyMDIvOTQ5NC8yNTQ4IDUyNzQvOTQ5NS8yNTQ4IDU0NzQvOTQ5Ni8yNTQ4CitmIDU0NzQvOTQ5Ni8yNTQ5IDU0MjcvOTQ5Ny8yNTQ5IDUyMDIvOTQ5NC8yNTQ5CitmIDUxNzQvOTQ5OC8yNTUwIDU0MjkvOTQ5OS8yNTUwIDU0MjgvOTUwMC8yNTUwCitmIDU0MjgvOTUwMC8yNTUxIDUxNzMvOTUwMS8yNTUxIDUxNzQvOTQ5OC8yNTUxCitmIDUxNzUvOTUwMi8yNTUyIDU0MzAvOTUwMy8yNTUyIDU0MjkvOTUwNC8yNTUyCitmIDU0MjkvOTUwNC8yNTUzIDUxNzQvOTUwNS8yNTUzIDUxNzUvOTUwMi8yNTUzCitmIDUxNzYvOTUwNi8yNTU0IDU0MzEvOTUwNy8yNTU0IDU0MzAvOTUwMy8yNTU0CitmIDU0MzAvOTUwMy8yNTU1IDUxNzUvOTUwMi8yNTU1IDUxNzYvOTUwNi8yNTU1CitmIDUxNzcvOTUwOC8yNTU2IDU0MzIvOTUwOS8yNTU2IDU0MzEvOTUwNy8yNTU2CitmIDU0MzEvOTUwNy8yNTU3IDUxNzYvOTUwNi8yNTU3IDUxNzcvOTUwOC8yNTU3CitmIDUxNzgvOTUxMC8yNTU4IDU0MzMvOTUxMS8yNTU4IDU0MzIvOTUwOS8yNTU4CitmIDU0MzIvOTUwOS8yNTU5IDUxNzcvOTUwOC8yNTU5IDUxNzgvOTUxMC8yNTU5CitmIDUxNzkvOTUxMi8yNTYwIDU0MzQvOTUxMy8yNTYwIDU0MzMvOTUxNC8yNTYwCitmIDU0MzMvOTUxNC8yNTYxIDUxNzgvOTUxNS8yNTYxIDUxNzkvOTUxMi8yNTYxCitmIDUxODAvOTUxNi8yNTYyIDU0MzUvOTUxNy8yNTYyIDU0MzQvOTUxMy8yNTYyCitmIDU0MzQvOTUxMy8yNTYzIDUxNzkvOTUxMi8yNTYzIDUxODAvOTUxNi8yNTYzCitmIDUxODEvOTUxOC8yNTY0IDU0MzYvOTUxOS8yNTY0IDU0MzUvOTUxNy8yNTY0CitmIDU0MzUvOTUxNy8yNTY1IDUxODAvOTUxNi8yNTY1IDUxODEvOTUxOC8yNTY1CitmIDUxODIvOTUyMC8yNTY2IDU0MzcvOTUyMS8yNTY2IDU0MzYvOTUxOS8yNTY2CitmIDU0MzYvOTUxOS8yNTY3IDUxODEvOTUxOC8yNTY3IDUxODIvOTUyMC8yNTY3CitmIDUxODMvOTUyMi8yNTY4IDU0MzgvOTUyMy8yNTY4IDU0MzcvOTUyNC8yNTY4CitmIDU0MzcvOTUyNC8yNTY5IDUxODIvOTUyNS8yNTY5IDUxODMvOTUyMi8yNTY5CitmIDUyODIvOTUyNi8yNTcwIDU0NzkvOTUyNy8yNTcwIDU0MzgvOTUyMy8yNTcwCitmIDU0MzgvOTUyMy8yNTcxIDUxODMvOTUyMi8yNTcxIDUyODIvOTUyNi8yNTcxCitmIDUxNDgvOTUyOC8yNTcyIDU0NDAvOTUyOS8yNTcyIDU0MzkvOTUzMC8yNTcyCitmIDU0MzkvOTUzMC8yNTczIDUxNDcvOTUzMS8yNTczIDUxNDgvOTUyOC8yNTczCitmIDUxNDkvOTUzMi8yNTc0IDU0NDEvOTUzMy8yNTc0IDU0NDAvOTUyOS8yNTc0CitmIDU0NDAvOTUyOS8yNTc1IDUxNDgvOTUyOC8yNTc1IDUxNDkvOTUzMi8yNTc1CitmIDUxNTAvOTUzNC8yNTc2IDU0NDIvOTUzNS8yNTc2IDU0NDEvOTUzNi8yNTc2CitmIDU0NDEvOTUzNi8yNTc3IDUxNDkvOTUzNy8yNTc3IDUxNTAvOTUzNC8yNTc3CitmIDUxNTEvOTUzOC8yNTc4IDU0NDMvOTUzOS8yNTc4IDU0NDIvOTUzNS8yNTc4CitmIDU0NDIvOTUzNS8yNTc5IDUxNTAvOTUzNC8yNTc5IDUxNTEvOTUzOC8yNTc5CitmIDUxNTIvOTU0MC8yNTgwIDU0NDQvOTU0MS8yNTgwIDU0NDMvOTUzOS8yNTgwCitmIDU0NDMvOTUzOS8yNTgxIDUxNTEvOTUzOC8yNTgxIDUxNTIvOTU0MC8yNTgxCitmIDUxNTMvOTU0Mi8yNTgyIDU0NDUvOTU0My8yNTgyIDU0NDQvOTU0MS8yNTgyCitmIDU0NDQvOTU0MS8yNTgzIDUxNTIvOTU0MC8yNTgzIDUxNTMvOTU0Mi8yNTgzCitmIDUxNTQvOTU0NC8yNTg0IDU0NDYvOTU0NS8yNTg0IDU0NDUvOTU0Ni8yNTg0CitmIDU0NDUvOTU0Ni8yNTg1IDUxNTMvOTU0Ny8yNTg1IDUxNTQvOTU0NC8yNTg1CitmIDUxNTUvOTU0OC8yNTg2IDU0NDcvOTU0OS8yNTg2IDU0NDYvOTU0NS8yNTg2CitmIDU0NDYvOTU0NS8yNTg3IDUxNTQvOTU0NC8yNTg3IDUxNTUvOTU0OC8yNTg3CitmIDUxNTYvOTU1MC8yNTg4IDU0NDgvOTU1MS8yNTg4IDU0NDcvOTU0OS8yNTg4CitmIDU0NDcvOTU0OS8yNTg5IDUxNTUvOTU0OC8yNTg5IDUxNTYvOTU1MC8yNTg5CitmIDUxNTcvOTU1Mi8yNTkwIDU0NDkvOTU1My8yNTkwIDU0NDgvOTU1MS8yNTkwCitmIDU0NDgvOTU1MS8yNTkxIDUxNTYvOTU1MC8yNTkxIDUxNTcvOTU1Mi8yNTkxCitmIDUxNTgvOTU1NC8yNTkyIDU0NTAvOTU1NS8yNTkyIDU0NDkvOTU1Ni8yNTkyCitmIDU0NDkvOTU1Ni8yNTkzIDUxNTcvOTU1Ny8yNTkzIDUxNTgvOTU1NC8yNTkzCitmIDUxNTkvOTU1OC8yNTk0IDU0NTEvOTU1OS8yNTk0IDU0NTAvOTU1NS8yNTk0CitmIDU0NTAvOTU1NS8yNTk1IDUxNTgvOTU1NC8yNTk1IDUxNTkvOTU1OC8yNTk1CitmIDUxNjAvOTU2MC8yNTk2IDU0NTIvOTU2MS8yNTk2IDU0NTEvOTU1OS8yNTk2CitmIDU0NTEvOTU1OS8yNTk3IDUxNTkvOTU1OC8yNTk3IDUxNjAvOTU2MC8yNTk3CitmIDUxNjEvOTU2Mi8yNTk4IDU0NTMvOTU2My8yNTk4IDU0NTIvOTU2MS8yNTk4CitmIDU0NTIvOTU2MS8yNTk5IDUxNjAvOTU2MC8yNTk5IDUxNjEvOTU2Mi8yNTk5CitmIDUxNjIvOTU2NC8yNjAwIDU0NTQvOTU2NS8yNjAwIDU0NTMvOTU2Ni8yNjAwCitmIDU0NTMvOTU2Ni8yNjAxIDUxNjEvOTU2Ny8yNjAxIDUxNjIvOTU2NC8yNjAxCitmIDU3ODUvOTU2OC8yNjAyIDU3ODYvOTU2OS8yNjAyIDU0NTQvOTU2NS8yNjAyCitmIDU0NTQvOTU2NS8yNjAzIDUxNjIvOTU2NC8yNjAzIDU3ODUvOTU2OC8yNjAzCitmIDUyMDAvOTU3MC8yNjA0IDUyNzYvOTU3MS8yNjA0IDU0NzYvOTU3Mi8yNjA0CitmIDU0NzYvOTU3Mi8yNjA1IDU0NTUvOTU3My8yNjA1IDUyMDAvOTU3MC8yNjA1CitmIDUzMjIvOTU3NC8yNjA2IDU0OTIvOTU3NS8yNjA2IDU0OTgvOTU3Ni8yNjA2CitmIDU0OTgvOTU3Ni8yNjA3IDUzMzYvOTU3Ny8yNjA3IDUzMjIvOTU3NC8yNjA3CitmIDUxOTYvOTU3OC8yNjA4IDUzMzcvOTU3OS8yNjA4IDU0OTkvOTU4MC8yNjA4CitmIDU0OTkvOTU4MC8yNjA5IDU0NTcvOTU4MS8yNjA5IDUxOTYvOTU3OC8yNjA5CitmIDUxOTcvOTU4Mi8yNjEwIDUzNDcvOTU4My8yNjEwIDU1MDMvOTU4NC8yNjEwCitmIDU1MDMvOTU4NC8yNjExIDU0NTgvOTU4NS8yNjExIDUxOTcvOTU4Mi8yNjExCitmIDUxOTgvOTU4Ni8yNjEyIDU0NjAvOTU4Ny8yNjEyIDU0NTkvOTU4OC8yNjEyCitmIDU0NTkvOTU4OC8yNjEzIDUyMDgvOTU4OS8yNjEzIDUxOTgvOTU4Ni8yNjEzCitmIDUxOTgvOTU5MC8yNjE0IDUzNDkvOTU5MS8yNjE0IDU1MDQvOTU5Mi8yNjE0CitmIDU1MDQvOTU5Mi8yNjE1IDU0NjAvOTU5My8yNjE1IDUxOTgvOTU5MC8yNjE1CitmIDU1MDkvOTU5NC8yNjE2IDU1MTEvOTU5NS8yNjE2IDU0NjEvOTU5Ni8yNjE2CitmIDU0NjEvOTU5Ni8yNjE3IDUyMDcvOTU5Ny8yNjE3IDU1MDkvOTU5NC8yNjE3CitmIDUyMDkvOTU5OC8yNjE4IDU0NjMvOTU5OS8yNjE4IDU0NjIvOTYwMC8yNjE4CitmIDU0NjIvOTYwMC8yNTQyIDUyMDMvOTYwMS8yNTQyIDUyMDkvOTU5OC8yNTQyCitmIDUyODAvOTYwMi8yNjE5IDU0NzcvOTYwMy8yNjE5IDU0NjMvOTU5OS8yNjE5CitmIDU0NjMvOTU5OS8yNjIwIDUyMDkvOTU5OC8yNjIwIDUyODAvOTYwMi8yNjIwCitmIDUyODcvOTYwNC8yNjIxIDU0ODAvOTYwNS8yNjIxIDU0ODEvOTYwNi8yNjIxCitmIDU0ODEvOTYwNi8yNjIyIDUyODYvOTYwNy8yNjIyIDUyODcvOTYwNC8yNjIyCitmIDUxNjQvOTYwOC8yNjIzIDU0NjYvOTYwOS8yNjIzIDU0NjUvOTYxMC8yNjIzCitmIDU0NjUvOTYxMC8yNjI0IDUxNjMvOTYxMS8yNjI0IDUxNjQvOTYwOC8yNjI0CitmIDUxNjUvOTYxMi8yNjI1IDU0NjcvOTYxMy8yNjI1IDU0NjYvOTYwOS8yNjI1CitmIDU0NjYvOTYwOS8yNjI2IDUxNjQvOTYwOC8yNjI2IDUxNjUvOTYxMi8yNjI2CitmIDUxNjYvOTYxNC8yNjI3IDU0NjgvOTYxNS8yNjI3IDU0NjcvOTYxNi8yNjI3CitmIDU0NjcvOTYxNi8yNjI4IDUxNjUvOTYxNy8yNjI4IDUxNjYvOTYxNC8yNjI4CitmIDUxNjcvOTYxOC8yNjI5IDU0NjkvOTYxOS8yNjI5IDU0NjgvOTYxNS8yNjI5CitmIDU0NjgvOTYxNS8yNjMwIDUxNjYvOTYxNC8yNjMwIDUxNjcvOTYxOC8yNjMwCitmIDUxNjgvOTYyMC8yNjMxIDU0NzAvOTYyMS8yNjMxIDU0NjkvOTYyMi8yNjMxCitmIDU0NjkvOTYyMi8yNjMyIDUxNjcvOTYyMy8yNjMyIDUxNjgvOTYyMC8yNjMyCitmIDUxNjkvOTYyNC8yNjMzIDU0NzEvOTYyNS8yNjMzIDU0NzAvOTYyMS8yNjMzCitmIDU0NzAvOTYyMS8yNjM0IDUxNjgvOTYyMC8yNjM0IDUxNjkvOTYyNC8yNjM0CitmIDUxNzAvOTYyNi8yNjM1IDU0NzIvOTYyNy8yNjM1IDU0NzEvOTYyOC8yNjM1CitmIDU0NzEvOTYyOC8yNjM2IDUxNjkvOTYyOS8yNjM2IDUxNzAvOTYyNi8yNjM2CitmIDUxNjMvOTYzMC8yNjM3IDU0NjUvOTYzMS8yNjM3IDU0NzIvOTYyNy8yNjM3CitmIDU0NzIvOTYyNy8yNjM4IDUxNzAvOTYyNi8yNjM4IDUxNjMvOTYzMC8yNjM4CitmIDUzMDkvOTM5Ni82ODcgNTI5NS85NjMyLzY4NyA1Mjk0Lzk2MzMvNjg3CitmIDUyOTQvOTYzMy82ODcgNTMxMC85NjM0LzY4NyA1MzA5LzkzOTYvNjg3CitmIDUyOTUvOTYzMi82ODcgNTI5Ny85NDA0LzY4NyA1Mjk2Lzk0MDMvNjg3CitmIDUyOTYvOTQwMy82ODcgNTI5NC85NjMzLzY4NyA1Mjk1Lzk2MzIvNjg3CitmIDUzMTIvOTM5Ny82ODcgNTI0MC85MzkwLzY4NyA1MjEwLzkzOTIvNjg3CitmIDUyMTAvOTM5Mi82ODcgNTMxMS85Mzk4LzY4NyA1MzEyLzkzOTcvNjg3CitmIDUyMDIvOTYzNS8yNjM5IDU0MjcvOTYzNi8yNjM5IDU0NzMvOTQ5MS8yNjM5CitmIDU0NzMvOTQ5MS8yNjQwIDUyNzIvOTQ5MC8yNjQwIDUyMDIvOTYzNS8yNjQwCitmIDU3ODcvOTYzNy8yNjQxIDU3ODgvOTYzOC8yNjQxIDU0NzQvOTQ5Ni8yNjQxCitmIDU0NzQvOTQ5Ni8yNjQyIDUyNzQvOTQ5NS8yNjQyIDU3ODcvOTYzNy8yNjQyCitmIDUyMzcvOTQwOC82ODcgNTIyNS85NDA3LzY4NyA1Mjc1Lzk2MzkvNjg3CitmIDUzMDQvOTY0MC82ODcgNTUxMi85NjQxLzY4NyA1NTE0Lzk2NDIvNjg3CitmIDU1MTQvOTY0Mi82ODcgNTMxMy85NjQzLzY4NyA1MzA0Lzk2NDAvNjg3CitmIDUyOTkvOTQ5My8yNjQzIDU0ODQvOTQ5Mi8yNjQzIDU0NzUvOTQ4OC8yNjQzCitmIDU0NzUvOTQ4OC8yNjQ0IDUyNzcvOTQ4Ny8yNjQ0IDUyOTkvOTQ5My8yNjQ0CitmIDUzMjYvOTY0NC8yNjQ1IDU0OTQvOTY0NS8yNjQ1IDU0OTYvOTY0Ni8yNjQ1CitmIDU0OTYvOTY0Ni8yNjQ2IDUzMzEvOTY0Ny8yNjQ2IDUzMjYvOTY0NC8yNjQ2CitmIDUxOTkvOTY0OC8yNjQ3IDU0NjQvOTY0OS8yNjQ3IDU0NzcvOTYwMy8yNjQ3CitmIDU0NzcvOTYwMy8yNjQ4IDUyODAvOTYwMi8yNjQ4IDUxOTkvOTY0OC8yNjQ4CitmIDUyNjEvOTY1MC82ODcgNTI2Ny85NDM2LzY4NyA1MjY4Lzk0MzkvNjg3CitmIDUyNjgvOTQzOS82ODcgNTI4MS85NDM4LzY4NyA1MjYxLzk2NTAvNjg3CitmIDUxODYvOTQ1My8yNjQ5IDU0MTQvOTQ1Mi8yNjQ5IDU0NzgvOTQ0OC8yNjQ5CitmIDU0NzgvOTQ0OC8yNjUwIDUyODMvOTQ0Ny8yNjUwIDUxODYvOTQ1My8yNjUwCitmIDUxODQvOTY1MS8yNjUxIDU0MTIvOTY1Mi8yNjUxIDU0NzkvOTUyNy8yNjUxCitmIDU0NzkvOTUyNy8yNjUyIDUyODIvOTUyNi8yNjUyIDUxODQvOTY1MS8yNjUyCitmIDUyMDAvOTY1My8yNjUzIDU0NTUvOTY1NC8yNjUzIDU0ODAvOTYwNS8yNjUzCitmIDU0ODAvOTYwNS8yNjU0IDUyODcvOTYwNC8yNjU0IDUyMDAvOTY1My8yNjU0CitmIDUyODgvOTY1NS82ODcgNTI2MS85NjUwLzY4NyA1NDY0Lzk2NTYvNjg3CitmIDU0NjQvOTY1Ni82ODcgNTQ4MS85NjU3LzY4NyA1Mjg4Lzk2NTUvNjg3CitmIDUyODgvOTY1NS82ODcgNTI4OS85NjU4LzY4NyA1MjExLzkzOTQvNjg3CitmIDUyMTEvOTM5NC82ODcgNTI4NC85NjU5LzY4NyA1Mjg4Lzk2NTUvNjg3CitmIDUyNTIvOTY2MC82ODcgNTMwOC85Mzk1LzY4NyA1MjExLzkzOTQvNjg3CitmIDUyMTEvOTM5NC82ODcgNTI4OS85NjU4LzY4NyA1MjUyLzk2NjAvNjg3CitmIDUyNjEvOTY1MC82ODcgNTI4OC85NjU1LzY4NyA1Mjg0Lzk2NTkvNjg3CitmIDUyODQvOTY1OS82ODcgNTIxMi85NDM3LzY4NyA1MjYxLzk2NTAvNjg3CitmIDUxODUvOTY2MS8yNjU1IDU0MTMvOTY2Mi8yNjU1IDU0ODIvOTQ0My8yNjU1CitmIDU0ODIvOTQ0My8yNjU2IDUyOTEvOTQ0Mi8yNjU2IDUxODUvOTY2MS8yNjU2CitmIDUyOTIvOTY2My82ODcgNTIxMC85MzkyLzY4NyA1NDEyLzk2NjQvNjg3CitmIDU0MTIvOTY2NC82ODcgNTQ4My85NjY1LzY4NyA1MjkyLzk2NjMvNjg3CitmIDUzMDgvOTM5NS82ODcgNTMxNi85NjY2LzY4NyA1Mjk1Lzk2MzIvNjg3CitmIDUyOTUvOTYzMi82ODcgNTMwOS85Mzk2LzY4NyA1MzA4LzkzOTUvNjg3CitmIDUyOTQvOTYzMy82ODcgNTI3MC85Mzk5LzY4NyA1MzExLzkzOTgvNjg3CitmIDUzMTEvOTM5OC82ODcgNTMxMC85NjM0LzY4NyA1Mjk0Lzk2MzMvNjg3CitmIDUzMTYvOTY2Ni82ODcgNTMxNS85NjY3LzY4NyA1Mjk3Lzk0MDQvNjg3CitmIDUyOTcvOTQwNC82ODcgNTI5NS85NjMyLzY4NyA1MzE2Lzk2NjYvNjg3CitmIDUyNzEvOTQwNS82ODcgNTI3MC85Mzk5LzY4NyA1Mjk0Lzk2MzMvNjg3CitmIDUyOTQvOTYzMy82ODcgNTI5Ni85NDAzLzY4NyA1MjcxLzk0MDUvNjg3CitmIDUyMTAvOTM5Mi82ODcgNTI5Mi85NjYzLzY4NyA1MzEwLzk2MzQvNjg3CitmIDUzMTAvOTYzNC82ODcgNTMxMS85Mzk4LzY4NyA1MjEwLzkzOTIvNjg3CitmIDUyOTIvOTY2My82ODcgNTI5My85MzkzLzY4NyA1MzA5LzkzOTYvNjg3CitmIDUzMDkvOTM5Ni82ODcgNTMxMC85NjM0LzY4NyA1MjkyLzk2NjMvNjg3CitmIDUyNzMvOTQwMi82ODcgNTIyNS85NDA3LzY4NyA1MjcxLzk0MDUvNjg3CitmIDUyNzEvOTQwNS82ODcgNTI5Ni85NDAzLzY4NyA1MjczLzk0MDIvNjg3CitmIDUyOTcvOTQwNC82ODcgNTMxNS85NjY3LzY4NyA1Mjc4Lzk2NjgvNjg3CitmIDUyNzgvOTY2OC82ODcgNTI5OC85NDAxLzY4NyA1Mjk3Lzk0MDQvNjg3CitmIDUxNzIvOTY2OS8yNjU3IDU0MjYvOTY3MC8yNjU3IDU0ODUvOTQ4My8yNjU3CitmIDU0ODUvOTQ4My8yNTQyIDUzMDEvOTQ4Mi8yNTQyIDUxNzIvOTY2OS8yNTQyCitmIDUzMDIvOTY3MS82ODcgNTIyMy85NjcyLzY4NyA1NDI1Lzk2NzMvNjg3CitmIDU0MjUvOTY3My82ODcgNTQ4Ni85Njc0LzY4NyA1MzAyLzk2NzEvNjg3CitmIDUzMTMvOTY0My82ODcgNTQ4OS85Njc1LzY4NyA1NDg3Lzk2NzYvNjg3CitmIDU0ODcvOTY3Ni82ODcgNTMwNC85NjQwLzY4NyA1MzEzLzk2NDMvNjg3CitmIDUzMDMvOTY3Ny82ODcgNTUxMi85NjQxLzY4NyA1NTEzLzk2NzgvNjg3CitmIDU1MTMvOTY3OC82ODcgNTMwMi85NjcxLzY4NyA1MzAzLzk2NzcvNjg3CitmIDUzMDQvOTY0MC82ODcgNTQ4Ny85Njc2LzY4NyA1NDg4Lzk2NzkvNjg3CitmIDU0ODgvOTY3OS82ODcgNTMwNi85NjgwLzY4NyA1MzA0Lzk2NDAvNjg3CitmIDUyNzkvOTY4MS82ODcgNTQ3Ni85NjgyLzY4NyA1NDg5Lzk2NzUvNjg3CitmIDU0ODkvOTY3NS82ODcgNTMxMy85NjQzLzY4NyA1Mjc5Lzk2ODEvNjg3CitmIDUzMTMvOTY0My82ODcgNTUxNC85NjQyLzY4NyA1NTE1Lzk2ODMvNjg3CitmIDU1MTUvOTY4My82ODcgNTI3OS85NjgxLzY4NyA1MzEzLzk2NDMvNjg3CitmIDUzMDgvOTM5NS82ODcgNTUxNS85NjgzLzY4NyA1MzE2Lzk2NjYvNjg3CitmIDUxNzEvOTY4NC8yNjU4IDU0MjUvOTY4NS8yNjU4IDU0OTAvOTQ3OC8yNjU4CitmIDU0OTAvOTQ3OC8yNjU5IDUzMTgvOTQ4MS8yNjU5IDUxNzEvOTY4NC8yNjU5CitmIDUyMjIvOTY4Ni82ODcgNTQyNC85Njg3LzY4NyA1NDkxLzk2ODgvNjg3CitmIDU0OTEvOTY4OC82ODcgNTMxOS85Njg5LzY4NyA1MjIyLzk2ODYvNjg3CitmIDUxOTYvOTY5MC8yNjA3IDU0NTcvOTY5MS8yNjA3IDU0OTIvOTU3NS8yNjA3CitmIDU0OTIvOTU3NS8yNjYwIDUzMjIvOTU3NC8yNjYwIDUxOTYvOTY5MC8yNjYwCitmIDUyNTMvOTY5Mi82ODcgNTQ1Ni85NjkzLzY4NyA1NDkzLzk2OTQvNjg3CitmIDU0OTMvOTY5NC82ODcgNTMyMy85Njk1LzY4NyA1MjUzLzk2OTIvNjg3CitmIDUzMjkvOTQxMy82ODcgNTMzNC85Njk2LzY4NyA1MzQxLzk2OTcvNjg3CitmIDUzNDEvOTY5Ny82ODcgNTM0Mi85NDE0LzY4NyA1MzI5Lzk0MTMvNjg3CitmIDUzMjYvOTY0NC8xMjgxIDUyMDEvOTY5OC8xMjgxIDU0NTYvOTY5OS8xMjgxCitmIDU0NTYvOTY5OS8yNjQ1IDU0OTQvOTY0NS8yNjQ1IDUzMjYvOTY0NC8yNjQ1CitmIDUzMjcvOTQ3NS8yNjYxIDUxOTUvOTcwMC8yNjYxIDU0MjQvOTcwMS8yNjYxCitmIDU0MjQvOTcwMS8yNjYyIDU0OTUvOTQ3Ni8yNjYyIDUzMjcvOTQ3NS8yNjYyCitmIDUzMjAvOTcwMi82ODcgNTMyOS85NDEzLzY4NyA1MzI4Lzk0MTYvNjg3CitmIDUzMjgvOTQxNi82ODcgNTMxOS85Njg5LzY4NyA1MzIwLzk3MDIvNjg3CitmIDUzMjkvOTQxMy82ODcgNTMyMC85NzAyLzY4NyA1MjIzLzk2NzIvNjg3CitmIDUyMjMvOTY3Mi82ODcgNTMzNC85Njk2LzY4NyA1MzI5Lzk0MTMvNjg3CitmIDUzMzIvOTcwMy82ODcgNTQ5Ny85NzA0LzY4NyA1NDk2Lzk3MDUvNjg3CitmIDU0OTYvOTcwNS82ODcgNTMzMC85NzA2LzY4NyA1MzMyLzk3MDMvNjg3CitmIDUzMDIvOTY3MS82ODcgNTUxMy85Njc4LzY4NyA1NTE3Lzk3MDcvNjg3CitmIDU1MTcvOTcwNy82ODcgNTIyMy85NjcyLzY4NyA1MzAyLzk2NzEvNjg3CitmIDUzMDYvOTY4MC82ODcgNTQ4OC85Njc5LzY4NyA1NDk3Lzk3MDQvNjg3CitmIDU0OTcvOTcwNC82ODcgNTMzMi85NzAzLzY4NyA1MzA2Lzk2ODAvNjg3CitmIDU1MTcvOTcwNy82ODcgNTUxNi85NzA4LzY4NyA1MzM0Lzk2OTYvNjg3CitmIDUzMzQvOTY5Ni82ODcgNTIyMy85NjcyLzY4NyA1NTE3Lzk3MDcvNjg3CitmIDU1MTYvOTcwOC82ODcgNTUxOC85NzA5LzY4NyA1MzQxLzk2OTcvNjg3CitmIDUzNDEvOTY5Ny82ODcgNTMzNC85Njk2LzY4NyA1NTE2Lzk3MDgvNjg3CitmIDUzMjMvOTY5NS82ODcgNTQ5My85Njk0LzY4NyA1NDk4Lzk3MTAvNjg3CitmIDU0OTgvOTcxMC82ODcgNTMzNS85NzExLzY4NyA1MzIzLzk2OTUvNjg3CitmIDUzMjgvOTQxNi82ODcgNTIyMi85Njg2LzY4NyA1MzE5Lzk2ODkvNjg3CitmIDUzNDUvOTcxMi8yNjYzIDU1MDIvOTcxMy8yNjYzIDU0OTkvOTU4MC8yNjYzCitmIDU0OTkvOTU4MC8yNjY0IDUzMzcvOTU3OS8yNjY0IDUzNDUvOTcxMi8yNjY0CitmIDUzMzgvOTcxNC82ODcgNTM0Ni85NzE1LzY4NyA1MjIxLzk3MTYvNjg3CitmIDUyMjEvOTcxNi82ODcgNTMzOS85NzE3LzY4NyA1MzM4Lzk3MTQvNjg3CitmIDUzMzkvOTcxNy82ODcgNTIyMS85NzE2LzY4NyA1NDIzLzk3MTgvNjg3CitmIDU0MjMvOTcxOC82ODcgNTUwMC85NzE5LzY4NyA1MzM5Lzk3MTcvNjg3CitmIDUzMjMvOTY5NS82ODcgNTUxOC85NzA5LzY4NyA1MjUzLzk2OTIvNjg3CitmIDUzNDEvOTY5Ny82ODcgNTMzNS85NzExLzY4NyA1MzI0Lzk3MjAvNjg3CitmIDUzMjQvOTcyMC82ODcgNTM0Mi85NDE0LzY4NyA1MzQxLzk2OTcvNjg3CitmIDUzNDIvOTQxNC82ODcgNTMyNC85NzIwLzY4NyA1MjU0Lzk3MjEvNjg3CitmIDUyNTQvOTcyMS82ODcgNTM0My85NDE1LzY4NyA1MzQyLzk0MTQvNjg3CitmIDUzNDMvOTQxNS82ODcgNTMzOS85NzE3LzY4NyA1NTAwLzk3MTkvNjg3CitmIDU1MDAvOTcxOS82ODcgNTUwMS85NzIyLzY4NyA1MzQzLzk0MTUvNjg3CitmIDUxOTcvOTcyMy8yNjY1IDU0NTgvOTcyNC8yNjY1IDU1MDIvOTcxMy8yNjY1CitmIDU1MDIvOTcxMy8yNjY2IDUzNDUvOTcxMi8yNjY2IDUxOTcvOTcyMy8yNjY2CitmIDUyNTUvOTcyNS82ODcgNTIyMC85NzI2LzY4NyA1MjIxLzk3MTYvNjg3CitmIDUyMjEvOTcxNi82ODcgNTM0Ni85NzE1LzY4NyA1MjU1Lzk3MjUvNjg3CitmIDU1MDUvOTcyNy8yNjY3IDU1MDcvOTcyOC8yNjY3IDU1MDMvOTU4NC8yNjY3CitmIDU1MDMvOTU4NC8yNjY4IDUzNDcvOTU4My8yNjY4IDU1MDUvOTcyNy8yNjY4CitmIDUyMjAvOTcyNi82ODcgNTI1NS85NzI1LzY4NyA1MzQ4Lzk3MjkvNjg3CitmIDUzNTAvOTQyOS82ODcgNTIxOC85NDIwLzY4NyA1MjU3Lzk0MTkvNjg3CitmIDUyNTcvOTQxOS82ODcgNTM1MS85NDMwLzY4NyA1MzUwLzk0MjkvNjg3CitmIDUyMDcvOTU5Ny8yNjY5IDU0NjEvOTU5Ni8yNjY5IDU1MDQvOTU5Mi8yNjY5CitmIDU1MDQvOTU5Mi8yNjE0IDUzNDkvOTU5MS8yNjE0IDUyMDcvOTU5Ny8yNjE0CitmIDUyMTcvOTQyOC82ODcgNTIxOC85NDIwLzY4NyA1MzUwLzk0MjkvNjg3CitmIDUyNDAvOTM5MC82ODcgNTI0MS85Mzg4LzY4NyA1MjM2LzkzODkvNjg3CitmIDUyMzYvOTM4OS82ODcgNTI4NS85MzkxLzY4NyA1MjQwLzkzOTAvNjg3CitmIDUyNjEvOTY1MC82ODcgNTIxMi85NDM3LzY4NyA1MjY3Lzk0MzYvNjg3CitmIDUxMTIvOTI4MC8xMDY1IDUwOTUvOTI4My8xMDY1IDUzNTYvOTczMC8xMDY1CitmIDUzNTYvOTczMC8xMDY1IDUzNjIvOTczMS8xMDY1IDUxMTIvOTI4MC8xMDY1CitmIDUxMDMvOTI4NC8yNjcwIDUwOTYvOTI4Ny8yNjcwIDUzNTcvOTczMi8yNjcwCitmIDUzNTcvOTczMi8yNjcxIDUzNTgvOTczMy8yNjcxIDUxMDMvOTI4NC8yNjcxCitmIDUxMzQvOTMwMC8yMDMwIDUwOTQvOTMwMy8yMDMwIDUzNTUvOTczNC8yMDMwCitmIDUzNTUvOTczNC8yMDMwIDUzNzAvOTczNS8yMDMwIDUxMzQvOTMwMC8yMDMwCitmIDUxMjkvOTI5Ni8yMzMyIDUwOTMvOTI5OS8yMzMyIDUzNTQvOTczNi8yMzMyCitmIDUzNTQvOTczNi8yMzMyIDUzNjgvOTczNy8yMzMyIDUxMjkvOTI5Ni8yMzMyCitmIDUxNDEvOTI4OS8yNjcyIDUwOTEvOTI4OC8yNjcyIDUzNTIvOTczOC8yNjcyCitmIDUzNTIvOTczOC8yNjcyIDUzNzIvOTczOS8yNjcyIDUxNDEvOTI4OS8yNjcyCitmIDUxMjQvOTI5Mi8yNjczIDUwOTIvOTI5NS8yNjczIDUzNTMvOTc0MC8yNjczCitmIDUzNTMvOTc0MC8yNjc0IDUzNjcvOTc0MS8yNjc0IDUxMjQvOTI5Mi8yNjc0CitmIDUxMTkvOTMwOC8yNjc1IDUxMDMvOTI4NC8yNjc1IDUzNTgvOTczMy8yNjc1CitmIDUzNTgvOTczMy8yNjc2IDUzNjUvOTc0Mi8yNjc2IDUxMTkvOTMwOC8yNjc2CitmIDUwOTUvOTMxMS8yMDMwIDUxMDQvOTMxMC8yMDMwIDUzNTkvOTc0My8yMDMwCitmIDUzNTkvOTc0My8yNjc3IDUzNTYvOTc0NC8yNjc3IDUwOTUvOTMxMS8yNjc3CitmIDUwOTYvOTMxNy8xMDY1IDUxMDcvOTMxNi8xMDY1IDUzNjAvOTc0NS8xMDY1CitmIDUzNjAvOTc0NS8xNjMyIDUzNTcvOTc0Ni8xNjMyIDUwOTYvOTMxNy8xNjMyCitmIDUxMTQvOTMyMC8xMDQ0IDUxMDgvOTMyMy8xMDQ0IDUzNjEvOTc0Ny8xMDQ0CitmIDUzNjEvOTc0Ny8xMDQ0IDUzNjMvOTc0OC8xMDQ0IDUxMTQvOTMyMC8xMDQ0CitmIDUxMDcvOTMxNi8xMDY1IDUxMTIvOTI4MC8xMDY1IDUzNjIvOTczMS8xMDY1CitmIDUzNjIvOTczMS8xNjMyIDUzNjAvOTc0NS8xNjMyIDUxMDcvOTMxNi8xNjMyCitmIDUwOTQvOTMyOC8xMDQ0IDUxMTQvOTMyMC8xMDQ0IDUzNjMvOTc0OC8xMDQ0CitmIDUzNjMvOTc0OC8xMDQ0IDUzNTUvOTc0OS8xMDQ0IDUwOTQvOTMyOC8xMDQ0CitmIDUxMDQvOTMxMC8yNjc3IDUxMTcvOTMzMy8yNjc3IDUzNjQvOTc1MC8yNjc3CitmIDUzNjQvOTc1MC8yMDMwIDUzNTkvOTc0My8yMDMwIDUxMDQvOTMxMC8yMDMwCitmIDUwOTEvOTMzNi8yNjc4IDUxMTkvOTMwOC8yNjc4IDUzNjUvOTc0Mi8yNjc4CitmIDUzNjUvOTc0Mi8yNjc4IDUzNTIvOTc1MS8yNjc4IDUwOTEvOTMzNi8yNjc4CitmIDUxMTcvOTMzMy8yNjc5IDUxMjMvOTM0My8yNjc5IDUzNjYvOTc1Mi8yNjc5CitmIDUzNjYvOTc1Mi8yNjc3IDUzNjQvOTc1MC8yNjc3IDUxMTcvOTMzMy8yNjc3CitmIDUxMzgvOTM0MC8yNjczIDUxMjQvOTI5Mi8yNjczIDUzNjcvOTc0MS8yNjczCitmIDUzNjcvOTc0MS8yNjgwIDUzNzEvOTc1My8yNjgwIDUxMzgvOTM0MC8yNjgwCitmIDUxNDMvOTM1NC8xMDg4IDUxMjkvOTI5Ni8xMDg4IDUzNjgvOTczNy8xMDg4CitmIDUzNjgvOTczNy8xMDg4IDUzNzMvOTc1NC8xMDg4IDUxNDMvOTM1NC8xMDg4CitmIDUwOTIvOTM1MS8yNjcyIDUxMzAvOTM1MC8yNjcyIDUzNjkvOTc1NS8yNjcyCitmIDUzNjkvOTc1NS8yNjcyIDUzNTMvOTc1Ni8yNjcyIDUwOTIvOTM1MS8yNjcyCitmIDUxMjMvOTM0My8yNjc3IDUxMzQvOTMwMC8yNjc3IDUzNzAvOTczNS8yNjc3CitmIDUzNzAvOTczNS8yNjc3IDUzNjYvOTc1Mi8yNjc3IDUxMjMvOTM0My8yNjc3CitmIDUwOTMvOTM2MS8yNjgxIDUxMzgvOTM0MC8yNjgxIDUzNzEvOTc1My8yNjgxCitmIDUzNzEvOTc1My8yNjgwIDUzNTQvOTc1Ny8yNjgwIDUwOTMvOTM2MS8yNjgwCitmIDUxMzAvOTM1MC8xNjMyIDUxNDEvOTI4OS8xNjMyIDUzNzIvOTczOS8xNjMyCitmIDUzNzIvOTczOS8xNjMyIDUzNjkvOTc1NS8xNjMyIDUxMzAvOTM1MC8xNjMyCitmIDUxMDgvOTMyMy8xMDQ0IDUxNDMvOTM1NC8xMDQ0IDUzNzMvOTc1NC8xMDQ0CitmIDUzNzMvOTc1NC8xMDQ0IDUzNjEvOTc0Ny8xMDQ0IDUxMDgvOTMyMy8xMDQ0CitmIDUxNDgvOTUyOC8yNjgyIDUxNDcvOTUzMS8yNjgyIDUzNzQvOTc1OC8yNjgyCitmIDUzNzQvOTc1OC8yNjgzIDUzNzUvOTc1OS8yNjgzIDUxNDgvOTUyOC8yNjgzCitmIDU3ODUvOTU2OC8yNjg0IDUxNjIvOTU2NC8yNjg0IDUzODkvOTc2MC8yNjg0CitmIDUzODkvOTc2MC8yNjg1IDU3ODkvOTc2MS8yNjg1IDU3ODUvOTU2OC8yNjg1CitmIDUxNjIvOTU2NC8yNjg2IDUxNjEvOTU2Ny8yNjg2IDUzODgvOTc2Mi8yNjg2CitmIDUzODgvOTc2Mi8yNjg3IDUzODkvOTc2MC8yNjg3IDUxNjIvOTU2NC8yNjg3CitmIDUxNjEvOTU2Mi8yNjg4IDUxNjAvOTU2MC8yNjg4IDUzODcvOTc2My8yNjg4CitmIDUzODcvOTc2My8yNjg5IDUzODgvOTc2NC8yNjg5IDUxNjEvOTU2Mi8yNjg5CitmIDUxNjAvOTU2MC8yNjkwIDUxNTkvOTU1OC8yNjkwIDUzODYvOTc2NS8yNjkwCitmIDUzODYvOTc2NS8yNjkxIDUzODcvOTc2My8yNjkxIDUxNjAvOTU2MC8yNjkxCitmIDUxNTkvOTU1OC8yNjkyIDUxNTgvOTU1NC8yNjkyIDUzODUvOTc2Ni8yNjkyCitmIDUzODUvOTc2Ni8yNjkzIDUzODYvOTc2NS8yNjkzIDUxNTkvOTU1OC8yNjkzCitmIDUxNTgvOTU1NC8yNjk0IDUxNTcvOTU1Ny8yNjk0IDUzODQvOTc2Ny8yNjk0CitmIDUzODQvOTc2Ny8yNjk1IDUzODUvOTc2Ni8yNjk1IDUxNTgvOTU1NC8yNjk1CitmIDUxNTcvOTU1Mi8yNjk2IDUxNTYvOTU1MC8yNjk2IDUzODMvOTc2OC8yNjk2CitmIDUzODMvOTc2OC8yNjk3IDUzODQvOTc2OS8yNjk3IDUxNTcvOTU1Mi8yNjk3CitmIDUxNTYvOTU1MC8yNjk4IDUxNTUvOTU0OC8yNjk4IDUzODIvOTc3MC8yNjk4CitmIDUzODIvOTc3MC8yNjk5IDUzODMvOTc2OC8yNjk5IDUxNTYvOTU1MC8yNjk5CitmIDUxNTUvOTU0OC8yNzAwIDUxNTQvOTU0NC8yNzAwIDUzODEvOTc3MS8yNzAwCitmIDUzODEvOTc3MS8yNzAxIDUzODIvOTc3MC8yNzAxIDUxNTUvOTU0OC8yNzAxCitmIDUxNTQvOTU0NC8yNzAyIDUxNTMvOTU0Ny8yNzAyIDUzODAvOTc3Mi8yNzAyCitmIDUzODAvOTc3Mi8yNzAzIDUzODEvOTc3MS8yNzAzIDUxNTQvOTU0NC8yNzAzCitmIDUxNTMvOTU0Mi8yNzA0IDUxNTIvOTU0MC8yNzA0IDUzNzkvOTc3My8yNzA0CitmIDUzNzkvOTc3My8yNzA1IDUzODAvOTc3NC8yNzA1IDUxNTMvOTU0Mi8yNzA1CitmIDUxNTIvOTU0MC8yNzA2IDUxNTEvOTUzOC8yNzA2IDUzNzgvOTc3NS8yNzA2CitmIDUzNzgvOTc3NS8yNzA3IDUzNzkvOTc3My8yNzA3IDUxNTIvOTU0MC8yNzA3CitmIDUxNTEvOTUzOC8yNzA4IDUxNTAvOTUzNC8yNzA4IDUzNzcvOTc3Ni8yNzA4CitmIDUzNzcvOTc3Ni8yNzA5IDUzNzgvOTc3NS8yNzA5IDUxNTEvOTUzOC8yNzA5CitmIDUxNDkvOTUzMi8yNzEwIDUxNDgvOTUyOC8yNzEwIDUzNzUvOTc1OS8yNzEwCitmIDUzNzUvOTc1OS8yNzExIDUzNzYvOTc3Ny8yNzExIDUxNDkvOTUzMi8yNzExCitmIDUxNTAvOTUzNC8yNzEyIDUxNDkvOTUzNy8yNzEyIDUzNzYvOTc3OC8yNzEyCitmIDUzNzYvOTc3OC8yNzEzIDUzNzcvOTc3Ni8yNzEzIDUxNTAvOTUzNC8yNzEzCitmIDU0MDAvOTc3OS82ODcgNTExMy85Mjc2LzY4NyA1MDk3LzkyNzkvNjg3CitmIDUwOTcvOTI3OS82ODcgNTM5MC85NzgwLzY4NyA1NDAwLzk3NzkvNjg3CitmIDUzOTYvOTc4MS82ODcgNTEwNS85MzA3LzY4NyA1MDk4LzkzMTQvNjg3CitmIDUwOTgvOTMxNC82ODcgNTM5MS85NzgyLzY4NyA1Mzk2Lzk3ODEvNjg3CitmIDUxNDIvOTM2NS82ODcgNTA5OS85MzM0LzY4NyA1MzkyLzk3ODMvNjg3CitmIDUzOTIvOTc4My82ODcgNTQxMC85Nzg0LzY4NyA1MTQyLzkzNjUvNjg3CitmIDU0MDQvOTc4NS82ODcgNTEyNS85MzQ5LzY4NyA1MTAwLzkzNTcvNjg3CitmIDUxMDAvOTM1Ny82ODcgNTM5My85Nzg2LzY4NyA1NDA0Lzk3ODUvNjg3CitmIDU0MDcvOTc4Ny82ODcgNTEzMi85MzYwLzY4NyA1MTAxLzkzNjMvNjg3CitmIDUxMDEvOTM2My82ODcgNTM5NC85Nzg4LzY4NyA1NDA3Lzk3ODcvNjg3CitmIDU0MDgvOTc4OS82ODcgNTEzNS85MzMxLzY4NyA1MTAyLzkzMzAvNjg3CitmIDUxMDIvOTMzMC82ODcgNTM5NS85NzkwLzY4NyA1NDA4Lzk3ODkvNjg3CitmIDUxMjAvOTMwNC82ODcgNTEwNS85MzA3LzY4NyA1Mzk2Lzk3ODEvNjg3CitmIDUzOTYvOTc4MS82ODcgNTQwMy85NzkxLzY4NyA1MTIwLzkzMDQvNjg3CitmIDUwOTcvOTI3OS82ODcgNTEwNi85Mjc4LzY4NyA1Mzk3Lzk3OTIvNjg3CitmIDUzOTcvOTc5Mi82ODcgNTM5MC85NzgwLzY4NyA1MDk3LzkyNzkvNjg3CitmIDUwOTgvOTMxNC82ODcgNTEwOS85MzE1LzY4NyA1Mzk4Lzk3OTMvNjg3CitmIDUzOTgvOTc5My82ODcgNTM5MS85NzgyLzY4NyA1MDk4LzkzMTQvNjg3CitmIDUxMTUvOTMyNC82ODcgNTExMC85MzI3LzY4NyA1Mzk5Lzk3OTQvNjg3CitmIDUzOTkvOTc5NC82ODcgNTQwMS85Nzk1LzY4NyA1MTE1LzkzMjQvNjg3CitmIDUxMDkvOTMxNS82ODcgNTExMy85Mjc2LzY4NyA1NDAwLzk3NzkvNjg3CitmIDU0MDAvOTc3OS82ODcgNTM5OC85NzkzLzY4NyA1MTA5LzkzMTUvNjg3CitmIDUxMDIvOTMzMC82ODcgNTExNS85MzI0LzY4NyA1NDAxLzk3OTUvNjg3CitmIDU0MDEvOTc5NS82ODcgNTM5NS85NzkwLzY4NyA1MTAyLzkzMzAvNjg3CitmIDUxMDYvOTI3OC82ODcgNTExOC85MzM5LzY4NyA1NDAyLzk3OTYvNjg3CitmIDU0MDIvOTc5Ni82ODcgNTM5Ny85NzkyLzY4NyA1MTA2LzkyNzgvNjg3CitmIDUzOTIvOTc4My82ODcgNTA5OS85MzM0LzY4NyA1MTIwLzkzMDQvNjg3CitmIDUxMjAvOTMwNC82ODcgNTQwMy85NzkxLzY4NyA1MzkyLzk3ODMvNjg3CitmIDUxMzkvOTM0Ni82ODcgNTEyNS85MzQ5LzY4NyA1NDA0Lzk3ODUvNjg3CitmIDU0MDQvOTc4NS82ODcgNTQwOS85Nzk3LzY4NyA1MTM5LzkzNDYvNjg3CitmIDUxMTgvOTMzOS82ODcgNTEyNi85MzQ1LzY4NyA1NDA1Lzk3OTgvNjg3CitmIDU0MDUvOTc5OC82ODcgNTQwMi85Nzk2LzY4NyA1MTE4LzkzMzkvNjg3CitmIDUxMDAvOTM1Ny82ODcgNTEzMS85MzU2LzY4NyA1NDA2Lzk3OTkvNjg3CitmIDU0MDYvOTc5OS82ODcgNTM5My85Nzg2LzY4NyA1MTAwLzkzNTcvNjg3CitmIDUxNDQvOTM1OC82ODcgNTEzMi85MzYwLzY4NyA1NDA3Lzk3ODcvNjg3CitmIDU0MDcvOTc4Ny82ODcgNTQxMS85ODAwLzY4NyA1MTQ0LzkzNTgvNjg3CitmIDUxMjYvOTM0NS82ODcgNTEzNS85MzMxLzY4NyA1NDA4Lzk3ODkvNjg3CitmIDU0MDgvOTc4OS82ODcgNTQwNS85Nzk4LzY4NyA1MTI2LzkzNDUvNjg3CitmIDUxMDEvOTM2My82ODcgNTEzOS85MzQ2LzY4NyA1NDA5Lzk3OTcvNjg3CitmIDU0MDkvOTc5Ny82ODcgNTM5NC85Nzg4LzY4NyA1MTAxLzkzNjMvNjg3CitmIDUxMzEvOTM1Ni82ODcgNTE0Mi85MzY1LzY4NyA1NDEwLzk3ODQvNjg3CitmIDU0MTAvOTc4NC82ODcgNTQwNi85Nzk5LzY4NyA1MTMxLzkzNTYvNjg3CitmIDUxMTAvOTMyNy82ODcgNTE0NC85MzU4LzY4NyA1NDExLzk4MDAvNjg3CitmIDU0MTEvOTgwMC82ODcgNTM5OS85Nzk0LzY4NyA1MTEwLzkzMjcvNjg3CitmIDUyOTMvOTM5My82ODcgNTI5Mi85NjYzLzY4NyA1NDgzLzk2NjUvNjg3CitmIDU0ODMvOTY2NS82ODcgNTQ4Mi85ODAxLzY4NyA1MjkzLzkzOTMvNjg3CitmIDUyODQvOTY1OS82ODcgNTIxMS85Mzk0LzY4NyA1NDEzLzk4MDIvNjg3CitmIDU0MTMvOTgwMi82ODcgNTQ3OC85NjU5LzY4NyA1Mjg0Lzk2NTkvNjg3CitmIDUyMTMvOTQzNS82ODcgNTIxMi85NDM3LzY4NyA1NDE0Lzk4MDMvNjg3CitmIDU0MTQvOTgwMy82ODcgNTQxNS85ODA0LzY4NyA1MjEzLzk0MzUvNjg3CitmIDUyMTQvOTQzMi82ODcgNTIxMy85NDM1LzY4NyA1NDE1Lzk4MDQvNjg3CitmIDU0MTUvOTgwNC82ODcgNTQxNi85ODA1LzY4NyA1MjE0Lzk0MzIvNjg3CitmIDUyMTUvOTQyNi82ODcgNTIxNC85NDMyLzY4NyA1NDE2Lzk4MDUvNjg3CitmIDU0MTYvOTgwNS82ODcgNTQxNy85ODA2LzY4NyA1MjE1Lzk0MjYvNjg3CitmIDUyMTYvOTQyNy82ODcgNTIxNS85NDI2LzY4NyA1NDE3Lzk4MDYvNjg3CitmIDU0MTcvOTgwNi82ODcgNTQxOC85ODA3LzY4NyA1MjE2Lzk0MjcvNjg3CitmIDUyMTcvOTQyOC82ODcgNTIxNi85NDI3LzY4NyA1NDE4Lzk4MDcvNjg3CitmIDU0MTgvOTgwNy82ODcgNTQxOS85ODA4LzY4NyA1MjE3Lzk0MjgvNjg3CitmIDUyMTgvOTQyMC82ODcgNTIxNy85NDI4LzY4NyA1NDE5Lzk4MDgvNjg3CitmIDU0MTkvOTgwOC82ODcgNTQyMC85ODA5LzY4NyA1MjE4Lzk0MjAvNjg3CitmIDUyMTkvOTQxNy82ODcgNTIxOC85NDIwLzY4NyA1NDIwLzk4MDkvNjg3CitmIDU0MjAvOTgwOS82ODcgNTQyMS85ODEwLzY4NyA1MjE5Lzk0MTcvNjg3CitmIDUyMjAvOTcyNi82ODcgNTIxOS85NDE3LzY4NyA1NDIxLzk4MTAvNjg3CitmIDU0MjEvOTgxMC8xNTA3IDU0MjIvOTgxMS8xNTA3IDUyMjAvOTcyNi8xNTA3CitmIDUyMjEvOTcxNi8xNTA3IDUyMjAvOTcyNi8xNTA3IDU0MjIvOTgxMS8xNTA3CitmIDU0MjIvOTgxMS82ODcgNTQyMy85NzE4LzY4NyA1MjIxLzk3MTYvNjg3CitmIDUzMjgvOTQxNi82ODcgNTM0My85NDE1LzY4NyA1NTAxLzk3MjIvNjg3CitmIDU1MDEvOTcyMi82ODcgNTQ5NS85ODEyLzY4NyA1MzI4Lzk0MTYvNjg3CitmIDU0OTAvOTgxMy82ODcgNTMyMC85NzAyLzY4NyA1MzE5Lzk2ODkvNjg3CitmIDUzMTkvOTY4OS82ODcgNTQ5MS85Njg4LzY4NyA1NDkwLzk4MTMvNjg3CitmIDUzMDMvOTY3Ny82ODcgNTMwMi85NjcxLzY4NyA1NDg2Lzk2NzQvNjg3CitmIDU0ODYvOTY3NC82ODcgNTQ4NS85ODE0LzY4NyA1MzAzLzk2NzcvNjg3CitmIDUyNzgvOTY2OC82ODcgNTIyNC85ODE1LzY4NyA1NDI2Lzk4MTYvNjg3CitmIDU0MjYvOTgxNi82ODcgNTQ3NS85ODE3LzY4NyA1Mjc4Lzk2NjgvNjg3CitmIDU0NzMvOTgxOC82ODcgNTI3My85NDAyLzY4NyA1Mjk4Lzk0MDEvNjg3CitmIDUyOTgvOTQwMS82ODcgNTQ4NC85ODE5LzY4NyA1NDczLzk4MTgvNjg3CitmIDUyNzUvOTYzOS82ODcgNTIyNS85NDA3LzY4NyA1NDI3Lzk4MjAvNjg3CitmIDU0MjcvOTgyMC82ODcgNTQ3NC85ODIxLzY4NyA1Mjc1Lzk2MzkvNjg3CitmIDUyMjcvOTM3MS82ODcgNTIyNi85NDA5LzY4NyA1NDI4Lzk4MjIvNjg3CitmIDU0MjgvOTgyMi82ODcgNTQyOS85ODIzLzY4NyA1MjI3LzkzNzEvNjg3CitmIDUyMjgvOTM3Mi82ODcgNTIyNy85MzcxLzY4NyA1NDI5Lzk4MjMvNjg3CitmIDU0MjkvOTgyMy82ODcgNTQzMC85ODI0LzY4NyA1MjI4LzkzNzIvNjg3CitmIDUyMjkvOTM3NS82ODcgNTIyOC85MzcyLzY4NyA1NDMwLzk4MjQvNjg3CitmIDU0MzAvOTgyNC82ODcgNTQzMS85ODI1LzY4NyA1MjI5LzkzNzUvNjg3CitmIDUyMzAvOTM3Ny82ODcgNTIyOS85Mzc1LzY4NyA1NDMxLzk4MjUvNjg3CitmIDU0MzEvOTgyNS82ODcgNTQzMi85ODI2LzY4NyA1MjMwLzkzNzcvNjg3CitmIDUyMzEvOTM3OS82ODcgNTIzMC85Mzc3LzY4NyA1NDMyLzk4MjYvNjg3CitmIDU0MzIvOTgyNi82ODcgNTQzMy85ODI3LzY4NyA1MjMxLzkzNzkvNjg3CitmIDUyMzIvOTM4MS82ODcgNTIzMS85Mzc5LzY4NyA1NDMzLzk4MjcvNjg3CitmIDU0MzMvOTgyNy82ODcgNTQzNC85ODI4LzY4NyA1MjMyLzkzODEvNjg3CitmIDUyMzMvOTM4My82ODcgNTIzMi85MzgxLzY4NyA1NDM0Lzk4MjgvNjg3CitmIDU0MzQvOTgyOC82ODcgNTQzNS85ODI5LzY4NyA1MjMzLzkzODMvNjg3CitmIDUyMzQvOTM4NS82ODcgNTIzMy85MzgzLzY4NyA1NDM1Lzk4MjkvNjg3CitmIDU0MzUvOTgyOS82ODcgNTQzNi85ODMwLzY4NyA1MjM0LzkzODUvNjg3CitmIDUyMzUvOTM4Ny82ODcgNTIzNC85Mzg1LzY4NyA1NDM2Lzk4MzAvNjg3CitmIDU0MzYvOTgzMC82ODcgNTQzNy85ODMxLzY4NyA1MjM1LzkzODcvNjg3CitmIDUyMzYvOTM4OS82ODcgNTIzNS85Mzg3LzY4NyA1NDM3Lzk4MzEvNjg3CitmIDU0MzcvOTgzMS82ODcgNTQzOC85ODMyLzY4NyA1MjM2LzkzODkvNjg3CitmIDUyODUvOTM5MS82ODcgNTIzNi85Mzg5LzY4NyA1NDM4Lzk4MzIvNjg3CitmIDU0MzgvOTgzMi82ODcgNTQ3OS85ODMzLzY4NyA1Mjg1LzkzOTEvNjg3CitmIDUyMzgvOTQwNi82ODcgNTIzNy85NDA4LzY4NyA1NDM5Lzk4MzQvNjg3CitmIDU0MzkvOTgzNC82ODcgNTQ0MC85ODM1LzY4NyA1MjM4Lzk0MDYvNjg3CitmIDUyMzkvOTQwMC82ODcgNTIzOC85NDA2LzY4NyA1NDQwLzk4MzUvNjg3CitmIDU0NDAvOTgzNS82ODcgNTQ0MS85ODM2LzY4NyA1MjM5Lzk0MDAvNjg3CitmIDU0NDIvOTgzNy82ODcgNTMxMi85Mzk3LzY4NyA1MjM5Lzk0MDAvNjg3CitmIDUyMzkvOTQwMC82ODcgNTQ0MS85ODM2LzY4NyA1NDQyLzk4MzcvNjg3CitmIDU0NDMvOTgzOC82ODcgNTI0MC85MzkwLzY4NyA1MzEyLzkzOTcvNjg3CitmIDUzMTIvOTM5Ny82ODcgNTQ0Mi85ODM3LzY4NyA1NDQzLzk4MzgvNjg3CitmIDUyNDEvOTM4OC82ODcgNTI0MC85MzkwLzY4NyA1NDQzLzk4MzgvNjg3CitmIDU0NDMvOTgzOC82ODcgNTQ0NC85ODM5LzY4NyA1MjQxLzkzODgvNjg3CitmIDUyNDIvOTM4Ni82ODcgNTI0MS85Mzg4LzY4NyA1NDQ0Lzk4MzkvNjg3CitmIDU0NDQvOTgzOS82ODcgNTQ0NS85ODQwLzY4NyA1MjQyLzkzODYvNjg3CitmIDUyNDMvOTM4NC82ODcgNTI0Mi85Mzg2LzY4NyA1NDQ1Lzk4NDAvNjg3CitmIDU0NDUvOTg0MC82ODcgNTQ0Ni85ODQxLzY4NyA1MjQzLzkzODQvNjg3CitmIDUyNDQvOTM4Mi82ODcgNTI0My85Mzg0LzY4NyA1NDQ2Lzk4NDEvNjg3CitmIDU0NDYvOTg0MS82ODcgNTQ0Ny85ODQyLzY4NyA1MjQ0LzkzODIvNjg3CitmIDUyNDUvOTM4MC82ODcgNTI0NC85MzgyLzY4NyA1NDQ3Lzk4NDIvNjg3CitmIDU0NDcvOTg0Mi82ODcgNTQ0OC85ODQzLzY4NyA1MjQ1LzkzODAvNjg3CitmIDUyNDYvOTM3OC82ODcgNTI0NS85MzgwLzY4NyA1NDQ4Lzk4NDMvNjg3CitmIDU0NDgvOTg0My82ODcgNTQ0OS85ODQ0LzY4NyA1MjQ2LzkzNzgvNjg3CitmIDUyNDcvOTM3Ni82ODcgNTI0Ni85Mzc4LzY4NyA1NDQ5Lzk4NDQvNjg3CitmIDU0NDkvOTg0NC82ODcgNTQ1MC85ODQ1LzY4NyA1MjQ3LzkzNzYvNjg3CitmIDUyNDgvOTM3NC82ODcgNTI0Ny85Mzc2LzY4NyA1NDUwLzk4NDUvNjg3CitmIDU0NTAvOTg0NS82ODcgNTQ1MS85ODQ2LzY4NyA1MjQ4LzkzNzQvNjg3CitmIDUyNDkvOTM3My82ODcgNTI0OC85Mzc0LzY4NyA1NDUxLzk4NDYvNjg3CitmIDU0NTEvOTg0Ni82ODcgNTQ1Mi85ODQ3LzY4NyA1MjQ5LzkzNzMvNjg3CitmIDUyNTAvOTM3MC82ODcgNTI0OS85MzczLzY4NyA1NDUyLzk4NDcvNjg3CitmIDU0NTIvOTg0Ny82ODcgNTQ1My85ODQ4LzY4NyA1MjUwLzkzNzAvNjg3CitmIDUyNTEvOTQxMC82ODcgNTI1MC85MzcwLzY4NyA1NDUzLzk4NDgvNjg3CitmIDU0NTMvOTg0OC82ODcgNTQ1NC85ODQ5LzY4NyA1MjUxLzk0MTAvNjg3CitmIDU3ODMvOTQxMS82ODcgNTI1MS85NDEwLzY4NyA1NDU0Lzk4NDkvNjg3CitmIDU0NTQvOTg0OS82ODcgNTc4Ni85ODUwLzY4NyA1NzgzLzk0MTEvNjg3CitmIDUyNzkvOTY4MS82ODcgNTI1Mi85NjYwLzY4NyA1NDU1Lzk4NTEvNjg3CitmIDU0NTUvOTg1MS82ODcgNTQ3Ni85NjgyLzY4NyA1Mjc5Lzk2ODEvNjg3CitmIDUzMjQvOTcyMC82ODcgNTMzNS85NzExLzY4NyA1NDk4Lzk3MTAvNjg3CitmIDU0OTgvOTcxMC82ODcgNTQ5Mi85ODUyLzY4NyA1MzI0Lzk3MjAvNjg3CitmIDUzMzgvOTcxNC82ODcgNTI1NC85NzIxLzY4NyA1NDU3Lzk4NTMvNjg3CitmIDU0NTcvOTg1My82ODcgNTQ5OS85ODU0LzY4NyA1MzM4Lzk3MTQvNjg3CitmIDUzNDgvOTcyOS82ODcgNTI1NS85NzI1LzY4NyA1NDU4Lzk4NTUvNjg3CitmIDU0NTgvOTg1NS82ODcgNTUwMy85ODU2LzY4NyA1MzQ4Lzk3MjkvNjg3CitmIDU0NjAvOTg1Ny82ODcgNTI1Ny85NDE5LzY4NyA1MjU2Lzk0MTgvNjg3CitmIDUyNTYvOTQxOC82ODcgNTQ1OS85ODU4LzY4NyA1NDYwLzk4NTcvNjg3CitmIDUzNTEvOTQzMC82ODcgNTI1Ny85NDE5LzY4NyA1NDYwLzk4NTcvNjg3CitmIDU0NjAvOTg1Ny82ODcgNTUwNC85ODU5LzY4NyA1MzUxLzk0MzAvNjg3CitmIDUyNTkvOTQyMS82ODcgNTUxMC85MzY3LzY4NyA1NTExLzk4NjAvNjg3CitmIDU1MTEvOTg2MC82ODcgNTQ2Mi85ODYxLzY4NyA1MjU5Lzk0MjEvNjg3CitmIDUyNjAvOTQ0MS82ODcgNTI1OS85NDIxLzY4NyA1NDYyLzk4NjEvNjg3CitmIDU0NjIvOTg2MS82ODcgNTQ2My85ODYyLzY4NyA1MjYwLzk0NDEvNjg3CitmIDUyODEvOTQzOC82ODcgNTI2MC85NDQxLzY4NyA1NDYzLzk4NjIvNjg3CitmIDU0NjMvOTg2Mi82ODcgNTQ3Ny85ODYzLzY4NyA1MjgxLzk0MzgvNjg3CitmIDUyODkvOTY1OC82ODcgNTI4OC85NjU1LzY4NyA1NDgxLzk2NTcvNjg3CitmIDU0ODEvOTY1Ny82ODcgNTQ4MC85ODY0LzY4NyA1Mjg5Lzk2NTgvNjg3CitmIDUyNjMvOTQyMy82ODcgNTI2Mi85NDIyLzY4NyA1NDY1Lzk4NjUvNjg3CitmIDU0NjUvOTg2NS82ODcgNTQ2Ni85ODY2LzY4NyA1MjYzLzk0MjMvNjg3CitmIDUyNjQvOTQyNS82ODcgNTI2My85NDIzLzY4NyA1NDY2Lzk4NjYvNjg3CitmIDU0NjYvOTg2Ni82ODcgNTQ2Ny85ODY3LzY4NyA1MjY0Lzk0MjUvNjg3CitmIDUyNjUvOTQzMy82ODcgNTI2NC85NDI1LzY4NyA1NDY3Lzk4NjcvNjg3CitmIDU0NjcvOTg2Ny82ODcgNTQ2OC85ODY4LzY4NyA1MjY1Lzk0MzMvNjg3CitmIDUyNjYvOTQzNC82ODcgNTI2NS85NDMzLzY4NyA1NDY4Lzk4NjgvNjg3CitmIDU0NjgvOTg2OC82ODcgNTQ2OS85ODY5LzY4NyA1MjY2Lzk0MzQvNjg3CitmIDUyNjcvOTQzNi82ODcgNTI2Ni85NDM0LzY4NyA1NDY5Lzk4NjkvNjg3CitmIDU0NjkvOTg2OS82ODcgNTQ3MC85ODcwLzY4NyA1MjY3Lzk0MzYvNjg3CitmIDUyNjgvOTQzOS82ODcgNTI2Ny85NDM2LzY4NyA1NDcwLzk4NzAvNjg3CitmIDU0NzAvOTg3MC82ODcgNTQ3MS85ODcxLzY4NyA1MjY4Lzk0MzkvNjg3CitmIDUyNjkvOTQ0MC82ODcgNTI2OC85NDM5LzY4NyA1NDcxLzk4NzEvNjg3CitmIDU0NzEvOTg3MS82ODcgNTQ3Mi85ODcyLzY4NyA1MjY5Lzk0NDAvNjg3CitmIDUyNjIvOTQyMi82ODcgNTI2OS85NDQwLzY4NyA1NDcyLzk4NzIvNjg3CitmIDU0NzIvOTg3Mi82ODcgNTQ2NS85ODY1LzY4NyA1MjYyLzk0MjIvNjg3CitmIDU0MjcvOTgyMC82ODcgNTIyNS85NDA3LzY4NyA1MjczLzk0MDIvNjg3CitmIDUyNzMvOTQwMi82ODcgNTQ3My85ODE4LzY4NyA1NDI3Lzk4MjAvNjg3CitmIDU3ODQvOTQxMi82ODcgNTI3NS85NjM5LzY4NyA1NDc0Lzk4MjEvNjg3CitmIDU0NzQvOTgyMS82ODcgNTc4OC85ODczLzY4NyA1Nzg0Lzk0MTIvNjg3CitmIDUyOTgvOTQwMS82ODcgNTI3OC85NjY4LzY4NyA1NDc1Lzk4MTcvNjg3CitmIDU0NzUvOTgxNy82ODcgNTQ4NC85ODE5LzY4NyA1Mjk4Lzk0MDEvNjg3CitmIDUzMjUvOTg3NC82ODcgNTMzMC85NzA2LzY4NyA1NDk2Lzk3MDUvNjg3CitmIDU0OTYvOTcwNS82ODcgNTQ5NC85ODc1LzY4NyA1MzI1Lzk4NzQvNjg3CitmIDU0NjQvOTY1Ni82ODcgNTI2MS85NjUwLzY4NyA1MjgxLzk0MzgvNjg3CitmIDUyODEvOTQzOC82ODcgNTQ3Ny85ODYzLzY4NyA1NDY0Lzk2NTYvNjg3CitmIDUyMTIvOTQzNy82ODcgNTI4NC85NjU5LzY4NyA1NDc4Lzk2NTkvNjg3CitmIDU0NzgvOTY1OS82ODcgNTQxNC85ODAzLzY4NyA1MjEyLzk0MzcvNjg3CitmIDU0MTIvOTY2NC82ODcgNTIxMC85MzkyLzY4NyA1Mjg1LzkzOTEvNjg3CitmIDUyODUvOTM5MS82ODcgNTQ3OS85ODMzLzY4NyA1NDEyLzk2NjQvNjg3CitmIDU0NTUvOTg1MS82ODcgNTI1Mi85NjYwLzY4NyA1Mjg5Lzk2NTgvNjg3CitmIDUyODkvOTY1OC82ODcgNTQ4MC85ODY0LzY4NyA1NDU1Lzk4NTEvNjg3CitmIDUxOTkvOTg3Ni8yNzE0IDUyODYvOTYwNy8yNzE0IDU0ODEvOTYwNi8yNzE0CitmIDU0ODEvOTYwNi8yNzE1IDU0NjQvOTg3Ny8yNzE1IDUxOTkvOTg3Ni8yNzE1CitmIDU0MTMvOTgwMi82ODcgNTIxMS85Mzk0LzY4NyA1MjkzLzkzOTMvNjg3CitmIDUyOTMvOTM5My82ODcgNTQ4Mi85ODAxLzY4NyA1NDEzLzk4MDIvNjg3CitmIDUxODQvOTg3OC8yNzE2IDUyOTAvOTQ0NS8yNzE2IDU0ODMvOTQ0NC8yNzE2CitmIDU0ODMvOTQ0NC8yNzE2IDU0MTIvOTg3OS8yNzE2IDUxODQvOTg3OC8yNzE2CitmIDU0MjYvOTgxNi82ODcgNTIyNC85ODE1LzY4NyA1MzAzLzk2NzcvNjg3CitmIDUzMDMvOTY3Ny82ODcgNTQ4NS85ODE0LzY4NyA1NDI2Lzk4MTYvNjg3CitmIDUxNzEvOTg4MC8yNzE3IDUzMDAvOTQ4NS8yNzE3IDU0ODYvOTQ4NC8yNzE3CitmIDU0ODYvOTQ4NC8yNTQzIDU0MjUvOTg4MS8yNTQzIDUxNzEvOTg4MC8yNTQzCitmIDUzMTQvOTg4Mi8yNzE4IDUzMDUvOTg4My8yNzE4IDU0ODcvOTg4NC8yNzE4CitmIDU0ODcvOTg4NC8yNzE5IDU0ODkvOTg4NS8yNzE5IDUzMTQvOTg4Mi8yNzE5CitmIDUzMDUvOTg4My8yNzIwIDUzMDcvOTg4Ni8yNzIwIDU0ODgvOTg4Ny8yNzIwCitmIDU0ODgvOTg4Ny8yNzIxIDU0ODcvOTg4NC8yNzIxIDUzMDUvOTg4My8yNzIxCitmIDUyNzYvOTU3MS8yNzIyIDUzMTQvOTg4Mi8yNzIyIDU0ODkvOTg4NS8yNzIyCitmIDU0ODkvOTg4NS8yNzIzIDU0NzYvOTU3Mi8yNzIzIDUyNzYvOTU3MS8yNzIzCitmIDU0MjUvOTY3My82ODcgNTIyMy85NjcyLzY4NyA1MzIwLzk3MDIvNjg3CitmIDUzMjAvOTcwMi82ODcgNTQ5MC85ODEzLzY4NyA1NDI1Lzk2NzMvNjg3CitmIDU0MjQvOTg4OC8yNTQwIDUxOTUvOTg4OS8yNTQwIDUzMTcvOTQ4MC8yNTQwCitmIDUzMTcvOTQ4MC8yNzI0IDU0OTEvOTQ3OS8yNzI0IDU0MjQvOTg4OC8yNzI0CitmIDU0NTcvOTg1My82ODcgNTI1NC85NzIxLzY4NyA1MzI0Lzk3MjAvNjg3CitmIDUzMjQvOTcyMC82ODcgNTQ5Mi85ODUyLzY4NyA1NDU3Lzk4NTMvNjg3CitmIDU0NTYvOTg5MC8yNzI1IDUyMDEvOTg5MS8yNzI1IDUzMjEvOTg5Mi8yNzI1CitmIDUzMjEvOTg5Mi8yNzI2IDU0OTMvOTg5My8yNzI2IDU0NTYvOTg5MC8yNzI2CitmIDUyNTMvOTY5Mi82ODcgNTMyNS85ODc0LzY4NyA1NDk0Lzk4NzUvNjg3CitmIDU0OTQvOTg3NS82ODcgNTQ1Ni85NjkzLzY4NyA1MjUzLzk2OTIvNjg3CitmIDUyMjIvOTY4Ni82ODcgNTMyOC85NDE2LzY4NyA1NDk1Lzk4MTIvNjg3CitmIDU0OTUvOTgxMi82ODcgNTQyNC85Njg3LzY4NyA1MjIyLzk2ODYvNjg3CitmIDUzMzMvOTg5NC8yNjQ2IDUzMzEvOTY0Ny8yNjQ2IDU0OTYvOTY0Ni8yNjQ2CitmIDU0OTYvOTY0Ni8yNzI3IDU0OTcvOTg5NS8yNzI3IDUzMzMvOTg5NC8yNzI3CitmIDUzMDcvOTg4Ni8yNzI4IDUzMzMvOTg5NC8yNzI4IDU0OTcvOTg5NS8yNzI4CitmIDU0OTcvOTg5NS8yNzI5IDU0ODgvOTg4Ny8yNzI5IDUzMDcvOTg4Ni8yNzI5CitmIDUzMjEvOTg5Mi8yNjYwIDUzMzYvOTU3Ny8yNjYwIDU0OTgvOTU3Ni8yNjYwCitmIDU0OTgvOTU3Ni8yNzI1IDU0OTMvOTg5My8yNzI1IDUzMjEvOTg5Mi8yNzI1CitmIDUzNDYvOTcxNS82ODcgNTMzOC85NzE0LzY4NyA1NDk5Lzk4NTQvNjg3CitmIDU0OTkvOTg1NC82ODcgNTUwMi85ODk2LzY4NyA1MzQ2Lzk3MTUvNjg3CitmIDUxOTQvOTg5Ny8yNzMwIDUzNDAvOTg5OC8yNzMwIDU1MDAvOTg5OS8yNzMwCitmIDU1MDAvOTg5OS8yNzMxIDU0MjMvOTkwMC8yNzMxIDUxOTQvOTg5Ny8yNzMxCitmIDUzNDAvOTg5OC8yNzMyIDUzNDQvOTQ3NC8yNzMyIDU1MDEvOTQ3Ny8yNzMyCitmIDU1MDEvOTQ3Ny8yNzMzIDU1MDAvOTg5OS8yNzMzIDUzNDAvOTg5OC8yNzMzCitmIDU0NTgvOTg1NS82ODcgNTI1NS85NzI1LzY4NyA1MzQ2Lzk3MTUvNjg3CitmIDUzNDYvOTcxNS82ODcgNTUwMi85ODk2LzY4NyA1NDU4Lzk4NTUvNjg3CitmIDUyNTYvOTQxOC82ODcgNTUwNi85NDMxLzY4NyA1NTA3Lzk5MDEvNjg3CitmIDU1MDcvOTkwMS82ODcgNTQ1OS85ODU4LzY4NyA1MjU2Lzk0MTgvNjg3CitmIDUyNTgvOTM2Ni82ODcgNTM1MS85NDMwLzY4NyA1NTA0Lzk4NTkvNjg3CitmIDU1MDQvOTg1OS82ODcgNTQ2MS85OTAyLzY4NyA1MjU4LzkzNjYvNjg3CitmIDUyMDgvOTU4OS8yNzM0IDU0NTkvOTU4OC8yNzM0IDU1MDcvOTcyOC8yNzM0CitmIDU1MDcvOTcyOC8yNzM1IDU1MDUvOTcyNy8yNzM1IDUyMDgvOTU4OS8yNzM1CitmIDUzNDgvOTcyOS82ODcgNTUwMy85ODU2LzY4NyA1NTA3Lzk5MDEvNjg3CitmIDU1MDcvOTkwMS82ODcgNTUwNi85NDMxLzY4NyA1MzQ4Lzk3MjkvNjg3CitmIDUyMTkvOTQxNy82ODcgNTIyMC85NzI2LzY4NyA1MzQ4Lzk3MjkvNjg3CitmIDUzNDgvOTcyOS82ODcgNTUwNi85NDMxLzY4NyA1MjE5Lzk0MTcvNjg3CitmIDUyNTkvOTQyMS82ODcgNTIwNS85NDI0LzY4NyA1NTA4LzkzNjgvNjg3CitmIDU1MDgvOTM2OC82ODcgNTUxMC85MzY3LzY4NyA1MjU5Lzk0MjEvNjg3CitmIDUyMDMvOTYwMS8yNzM2IDU0NjIvOTYwMC8yNzM2IDU1MTEvOTU5NS8yNzM2CitmIDU1MTEvOTU5NS8yNzM3IDU1MDkvOTU5NC8yNzM3IDUyMDMvOTYwMS8yNzM3CitmIDUyNTgvOTM2Ni82ODcgNTQ2MS85OTAyLzY4NyA1NTExLzk4NjAvNjg3CitmIDU1MTEvOTg2MC82ODcgNTUxMC85MzY3LzY4NyA1MjU4LzkzNjYvNjg3CitmIDUyMjQvOTgxNS82ODcgNTI3OC85NjY4LzY4NyA1MzE1Lzk2NjcvNjg3CitmIDUzMTUvOTY2Ny82ODcgNTUxNC85NjQyLzY4NyA1MjI0Lzk4MTUvNjg3CitmIDU1MTIvOTY0MS82ODcgNTMwMy85Njc3LzY4NyA1MjI0Lzk4MTUvNjg3CitmIDUyMjQvOTgxNS82ODcgNTUxNC85NjQyLzY4NyA1NTEyLzk2NDEvNjg3CitmIDUzMDQvOTY0MC82ODcgNTMwNi85NjgwLzY4NyA1NTEzLzk2NzgvNjg3CitmIDU1MTMvOTY3OC82ODcgNTUxMi85NjQxLzY4NyA1MzA0Lzk2NDAvNjg3CitmIDUzMTUvOTY2Ny82ODcgNTMxNi85NjY2LzY4NyA1NTE1Lzk2ODMvNjg3CitmIDU1MTUvOTY4My82ODcgNTUxNC85NjQyLzY4NyA1MzE1Lzk2NjcvNjg3CitmIDUzMDYvOTY4MC82ODcgNTMzMi85NzAzLzY4NyA1NTE3Lzk3MDcvNjg3CitmIDU1MTcvOTcwNy82ODcgNTUxMy85Njc4LzY4NyA1MzA2Lzk2ODAvNjg3CitmIDUzMzIvOTcwMy82ODcgNTMzMC85NzA2LzY4NyA1NTE2Lzk3MDgvNjg3CitmIDU1MTYvOTcwOC82ODcgNTUxNy85NzA3LzY4NyA1MzMyLzk3MDMvNjg3CitmIDUzMzAvOTcwNi82ODcgNTMyNS85ODc0LzY4NyA1NTE4Lzk3MDkvNjg3CitmIDU1MTgvOTcwOS82ODcgNTUxNi85NzA4LzY4NyA1MzMwLzk3MDYvNjg3CitmIDUzMzUvOTcxMS82ODcgNTM0MS85Njk3LzY4NyA1NTE4Lzk3MDkvNjg3CitmIDU1MTgvOTcwOS82ODcgNTMyMy85Njk1LzY4NyA1MzM1Lzk3MTEvNjg3CitmIDUyNTIvOTY2MC82ODcgNTI3OS85NjgxLzY4NyA1NTE1Lzk2ODMvNjg3CitmIDU1MTUvOTY4My82ODcgNTMwOC85Mzk1LzY4NyA1MjUyLzk2NjAvNjg3CitmIDUyNTQvOTcyMS82ODcgNTMzOC85NzE0LzY4NyA1MzM5Lzk3MTcvNjg3CitmIDUzMzkvOTcxNy82ODcgNTM0My85NDE1LzY4NyA1MjU0Lzk3MjEvNjg3CitmIDUyOTEvOTQ0Mi8yNzM4IDUyOTAvOTQ0NS8yNzM4IDU1NzMvOTkwMy8yNzM4CitmIDU1NzMvOTkwMy8yNzM4IDU1NzQvOTkwNC8yNzM4IDUyOTEvOTQ0Mi8yNzM4CitmIDUyODMvOTQ0Ny8yNzM5IDUxODUvOTQ0Ni8yNzM5IDU1NDEvOTkwNS8yNzM5CitmIDU1NDEvOTkwNS8yNzQwIDU1NzAvOTkwNi8yNzQwIDUyODMvOTQ0Ny8yNzQwCitmIDUxODcvOTQ1MC8yNzQxIDUxODYvOTQ1My8yNzQxIDU1NDIvOTkwNy8yNzQxCitmIDU1NDIvOTkwNy8yNzQyIDU1NDMvOTkwOC8yNzQyIDUxODcvOTQ1MC8yNzQyCitmIDUxODgvOTQ1NC8yNzQzIDUxODcvOTQ1Ny8yNzQzIDU1NDMvOTkwOS8yNzQzCitmIDU1NDMvOTkwOS8yNzQ0IDU1NDQvOTkxMC8yNzQ0IDUxODgvOTQ1NC8yNzQ0CitmIDUyMDQvOTQ1OC8yNzQ1IDUxODgvOTQ1NC8yNzQ1IDU1NDQvOTkxMC8yNzQ1CitmIDU1NDQvOTkxMC8yNzQ2IDU1NjAvOTkxMS8yNzQ2IDUyMDQvOTQ1OC8yNzQ2CitmIDUxODkvOTQ2MC8yNzQ3IDUyMDQvOTQ1OC8yNzQ3IDU1NjAvOTkxMS8yNzQ3CitmIDU1NjAvOTkxMS8yNzQ4IDU1NDUvOTkxMi8yNzQ4IDUxODkvOTQ2MC8yNzQ4CitmIDUxOTAvOTQ2Mi8yNzQ5IDUxODkvOTQ2MC8yNzQ5IDU1NDUvOTkxMi8yNzQ5CitmIDU1NDUvOTkxMi8yNzUwIDU1NDYvOTkxMy8yNzUwIDUxOTAvOTQ2Mi8yNzUwCitmIDUxOTEvOTQ2NC8yNzUxIDUxOTAvOTQ2Ny8yNzUxIDU1NDYvOTkxNC8yNzUxCitmIDU1NDYvOTkxNC8yNzUyIDU1NDcvOTkxNS8yNzUyIDUxOTEvOTQ2NC8yNzUyCitmIDUxOTIvOTQ2OC8yNzUzIDUxOTEvOTQ2NC8yNzUzIDU1NDcvOTkxNS8yNzUzCitmIDU1NDcvOTkxNS8yNzU0IDU1NDgvOTkxNi8yNzU0IDUxOTIvOTQ2OC8yNzU0CitmIDUxOTMvOTQ3MC8yNzU1IDUxOTIvOTQ2OC8yNzU1IDU1NDgvOTkxNi8yNzU1CitmIDU1NDgvOTkxNi8yNzU2IDU1NDkvOTkxNy8yNzU2IDUxOTMvOTQ3MC8yNzU2CitmIDUxOTQvOTQ3Mi8yNzU3IDUxOTMvOTQ3MC8yNzU3IDU1NDkvOTkxNy8yNzU3CitmIDU1NDkvOTkxNy8yNzU4IDU1NTAvOTkxOC8yNzU4IDUxOTQvOTQ3Mi8yNzU4CitmIDUzMjcvOTQ3NS8yNzU5IDUzNDQvOTQ3NC8yNzU5IDU1OTIvOTkxOS8yNzU5CitmIDU1OTIvOTkxOS8yNzYwIDU1ODYvOTkyMC8yNzYwIDUzMjcvOTQ3NS8yNzYwCitmIDUzMTgvOTQ4MS8yNzYxIDUzMTcvOTQ4MC8yNzYxIDU1ODEvOTkyMS8yNzYxCitmIDU1ODEvOTkyMS8yNzYyIDU1ODIvOTkyMi8yNzYyIDUzMTgvOTQ4MS8yNzYyCitmIDUzMDEvOTQ4Mi8xMDY1IDUzMDAvOTQ4NS8xMDY1IDU1NzYvOTkyMy8xMDY1CitmIDU1NzYvOTkyMy8xMDY1IDU1NzcvOTkyNC8xMDY1IDUzMDEvOTQ4Mi8xMDY1CitmIDUyNzcvOTQ4Ny8yNzYzIDUxNzIvOTQ4Ni8yNzYzIDU1MjgvOTkyNS8yNzYzCitmIDU1MjgvOTkyNS8yNzY0IDU1NjcvOTkyNi8yNzY0IDUyNzcvOTQ4Ny8yNzY0CitmIDUyNzIvOTQ5MC8yNzYzIDUyOTkvOTQ5My8yNzYzIDU1NzUvOTkyNy8yNzYzCitmIDU1NzUvOTkyNy8yNzYzIDU1NjQvOTkyOC8yNzYzIDUyNzIvOTQ5MC8yNzYzCitmIDUyNzQvOTQ5NS8yNzY1IDUyMDIvOTQ5NC8yNzY1IDU1NTgvOTkyOS8yNzY1CitmIDU1NTgvOTkyOS8yNzY2IDU1NjUvOTkzMC8yNzY2IDUyNzQvOTQ5NS8yNzY2CitmIDUxNzQvOTQ5OC8yNzY3IDUxNzMvOTUwMS8yNzY3IDU1MjkvOTkzMS8yNzY3CitmIDU1MjkvOTkzMS8yNzY4IDU1MzAvOTkzMi8yNzY4IDUxNzQvOTQ5OC8yNzY4CitmIDUxNzUvOTUwMi8yNzY5IDUxNzQvOTUwNS8yNzY5IDU1MzAvOTkzMy8yNzY5CitmIDU1MzAvOTkzMy8yNzcwIDU1MzEvOTkzNC8yNzcwIDUxNzUvOTUwMi8yNzcwCitmIDUxNzYvOTUwNi8yNzcxIDUxNzUvOTUwMi8yNzcxIDU1MzEvOTkzNC8yNzcxCitmIDU1MzEvOTkzNC8yNzcyIDU1MzIvOTkzNS8yNzcyIDUxNzYvOTUwNi8yNzcyCitmIDUxNzcvOTUwOC8yNzczIDUxNzYvOTUwNi8yNzczIDU1MzIvOTkzNS8yNzczCitmIDU1MzIvOTkzNS8yNzc0IDU1MzMvOTkzNi8yNzc0IDUxNzcvOTUwOC8yNzc0CitmIDUxNzgvOTUxMC8yNzc1IDUxNzcvOTUwOC8yNzc1IDU1MzMvOTkzNi8yNzc1CitmIDU1MzMvOTkzNi8yNzc2IDU1MzQvOTkzNy8yNzc2IDUxNzgvOTUxMC8yNzc2CitmIDUxNzkvOTUxMi8yNzc3IDUxNzgvOTUxNS8yNzc3IDU1MzQvOTkzOC8yNzc3CitmIDU1MzQvOTkzOC8yNzc4IDU1MzUvOTkzOS8yNzc4IDUxNzkvOTUxMi8yNzc4CitmIDUxODAvOTUxNi8yNzc5IDUxNzkvOTUxMi8yNzc5IDU1MzUvOTkzOS8yNzc5CitmIDU1MzUvOTkzOS8yNzgwIDU1MzYvOTk0MC8yNzgwIDUxODAvOTUxNi8yNzgwCitmIDUxODEvOTUxOC8yNzgxIDUxODAvOTUxNi8yNzgxIDU1MzYvOTk0MC8yNzgxCitmIDU1MzYvOTk0MC8yNzgxIDU1MzcvOTk0MS8yNzgxIDUxODEvOTUxOC8yNzgxCitmIDUxODIvOTUyMC8yNzgyIDUxODEvOTUxOC8yNzgyIDU1MzcvOTk0MS8yNzgyCitmIDU1MzcvOTk0MS8yNzgzIDU1MzgvOTk0Mi8yNzgzIDUxODIvOTUyMC8yNzgzCitmIDUxODMvOTUyMi8yNzg0IDUxODIvOTUyNS8yNzg0IDU1MzgvOTk0My8yNzg0CitmIDU1MzgvOTk0My8yNzg1IDU1MzkvOTk0NC8yNzg1IDUxODMvOTUyMi8yNzg1CitmIDUyODIvOTUyNi8yNzg2IDUxODMvOTUyMi8yNzg2IDU1MzkvOTk0NC8yNzg2CitmIDU1MzkvOTk0NC8yNzg3IDU1NjkvOTk0NS8yNzg3IDUyODIvOTUyNi8yNzg3CitmIDUyNzYvOTU3MS8xMDQ0IDUyMDAvOTU3MC8xMDQ0IDU1NTYvOTk0Ni8xMDQ0CitmIDU1NTYvOTk0Ni8xMDQ0IDU1NjYvOTk0Ny8xMDQ0IDUyNzYvOTU3MS8xMDQ0CitmIDUzMjIvOTU3NC8yNzg4IDUzMzYvOTU3Ny8yNzg4IDU1ODkvOTk0OC8yNzg4CitmIDU1ODkvOTk0OC8yNzg5IDU1ODQvOTk0OS8yNzg5IDUzMjIvOTU3NC8yNzg5CitmIDUzMzcvOTU3OS8xMDg4IDUxOTYvOTU3OC8xMDg4IDU1NTIvOTk1MC8xMDg4CitmIDU1NTIvOTk1MC8xMDg4IDU1OTAvOTk1MS8xMDg4IDUzMzcvOTU3OS8xMDg4CitmIDUzNDcvOTU4My8yNzkwIDUxOTcvOTU4Mi8yNzkwIDU1NTMvOTk1Mi8yNzkwCitmIDU1NTMvOTk1Mi8yNzkxIDU1OTQvOTk1My8yNzkxIDUzNDcvOTU4My8yNzkxCitmIDUxOTgvOTU4Ni8yNzkxIDUyMDgvOTU4OS8yNzkxIDU1NjIvOTk1NC8yNzkxCitmIDU1NjIvOTk1NC8yNzkyIDU1NTQvOTk1NS8yNzkyIDUxOTgvOTU4Ni8yNzkyCitmIDUzNDkvOTU5MS8xMDY1IDUxOTgvOTU5MC8xMDY1IDU1NTQvOTk1Ni8xMDY1CitmIDU1NTQvOTk1Ni8xMDY1IDU1OTUvOTk1Ny8xMDY1IDUzNDkvOTU5MS8xMDY1CitmIDU1MDkvOTU5NC8xMDY1IDUyMDcvOTU5Ny8xMDY1IDU1NjEvOTk1OC8xMDY1CitmIDU1NjEvOTk1OC8xMDY1IDU1OTcvOTk1OS8xMDY1IDU1MDkvOTU5NC8xMDY1CitmIDUyMDkvOTU5OC8xMDY1IDUyMDMvOTYwMS8xMDY1IDU1NTkvOTk2MC8xMDY1CitmIDU1NTkvOTk2MC8xMDY1IDU1NjMvOTk2MS8xMDY1IDUyMDkvOTU5OC8xMDY1CitmIDUyODAvOTYwMi8xMDY1IDUyMDkvOTU5OC8xMDY1IDU1NjMvOTk2MS8xMDY1CitmIDU1NjMvOTk2MS8xMDY1IDU1NjgvOTk2Mi8xMDY1IDUyODAvOTYwMi8xMDY1CitmIDUyODcvOTYwNC8yNzkzIDUyODYvOTYwNy8yNzkzIDU1NzEvOTk2My8yNzkzCitmIDU1NzEvOTk2My8yNDAxIDU1NzIvOTk2NC8yNDAxIDUyODcvOTYwNC8yNDAxCitmIDUxNjQvOTYwOC8yNzk0IDUxNjMvOTYxMS8yNzk0IDU1MTkvOTk2NS8yNzk0CitmIDU1MTkvOTk2NS8yNzk1IDU1MjAvOTk2Ni8yNzk1IDUxNjQvOTYwOC8yNzk1CitmIDUxNjUvOTYxMi8yNzk2IDUxNjQvOTYwOC8yNzk2IDU1MjAvOTk2Ni8yNzk2CitmIDU1MjAvOTk2Ni8yNzk3IDU1MjEvOTk2Ny8yNzk3IDUxNjUvOTYxMi8yNzk3CitmIDUxNjYvOTYxNC8yNzk4IDUxNjUvOTYxNy8yNzk4IDU1MjEvOTk2OC8yNzk4CitmIDU1MjEvOTk2OC8yNzk5IDU1MjIvOTk2OS8yNzk5IDUxNjYvOTYxNC8yNzk5CitmIDUxNjcvOTYxOC8yODAwIDUxNjYvOTYxNC8yODAwIDU1MjIvOTk2OS8yODAwCitmIDU1MjIvOTk2OS8yODAxIDU1MjMvOTk3MC8yODAxIDUxNjcvOTYxOC8yODAxCitmIDUxNjgvOTYyMC8yODAyIDUxNjcvOTYyMy8yODAyIDU1MjMvOTk3MS8yODAyCitmIDU1MjMvOTk3MS8yODAzIDU1MjQvOTk3Mi8yODAzIDUxNjgvOTYyMC8yODAzCitmIDUxNjkvOTYyNC8yODA0IDUxNjgvOTYyMC8yODA0IDU1MjQvOTk3Mi8yODA0CitmIDU1MjQvOTk3Mi8yODA1IDU1MjUvOTk3My8yODA1IDUxNjkvOTYyNC8yODA1CitmIDUxNzAvOTYyNi8yODA2IDUxNjkvOTYyOS8yODA2IDU1MjUvOTk3NC8yODA2CitmIDU1MjUvOTk3NC8yODA3IDU1MjYvOTk3NS8yODA3IDUxNzAvOTYyNi8yODA3CitmIDUxNjMvOTYzMC8yODA4IDUxNzAvOTYyNi8yODA4IDU1MjYvOTk3NS8yODA4CitmIDU1MjYvOTk3NS8yODA5IDU1MTkvOTk3Ni8yODA5IDUxNjMvOTYzMC8yODA5CitmIDUyMDIvOTYzNS8yODEwIDUyNzIvOTQ5MC8yODEwIDU1NjQvOTkyOC8yODEwCitmIDU1NjQvOTkyOC8yNjc5IDU1NTgvOTk3Ny8yNjc5IDUyMDIvOTYzNS8yNjc5CitmIDU3ODcvOTYzNy8yODExIDUyNzQvOTQ5NS8yODExIDU1NjUvOTkzMC8yODExCitmIDU1NjUvOTkzMC8yODEyIDU3OTAvOTk3OC8yODEyIDU3ODcvOTYzNy8yODEyCitmIDUyOTkvOTQ5My8yODEzIDUyNzcvOTQ4Ny8yODEzIDU1NjcvOTkyNi8yODEzCitmIDU1NjcvOTkyNi8yODEzIDU1NzUvOTkyNy8yODEzIDUyOTkvOTQ5My8yODEzCitmIDUzMjYvOTY0NC8xMDQ0IDUzMzEvOTY0Ny8xMDQ0IDU1ODcvOTk3OS8xMDQ0CitmIDU1ODcvOTk3OS8xMDQ0IDU1ODUvOTk4MC8xMDQ0IDUzMjYvOTY0NC8xMDQ0CitmIDUxOTkvOTY0OC8xMDY1IDUyODAvOTYwMi8xMDY1IDU1NjgvOTk2Mi8xMDY1CitmIDU1NjgvOTk2Mi8xMDY1IDU1NTUvOTk4MS8xMDY1IDUxOTkvOTY0OC8xMDY1CitmIDUxODYvOTQ1My8yODE0IDUyODMvOTQ0Ny8yODE0IDU1NzAvOTkwNi8yODE0CitmIDU1NzAvOTkwNi8yODE1IDU1NDIvOTkwNy8yODE1IDUxODYvOTQ1My8yODE1CitmIDUxODQvOTY1MS8yODE2IDUyODIvOTUyNi8yODE2IDU1NjkvOTk0NS8yODE2CitmIDU1NjkvOTk0NS8yODE3IDU1NDAvOTk4Mi8yODE3IDUxODQvOTY1MS8yODE3CitmIDUyMDAvOTY1My8yNzYzIDUyODcvOTYwNC8yNzYzIDU1NzIvOTk2NC8yNzYzCitmIDU1NzIvOTk2NC8yNzYzIDU1NTYvOTk4My8yNzYzIDUyMDAvOTY1My8yNzYzCitmIDUxODUvOTY2MS8yODE4IDUyOTEvOTQ0Mi8yODE4IDU1NzQvOTkwNC8yODE4CitmIDU1NzQvOTkwNC8yODE4IDU1NDEvOTk4NC8yODE4IDUxODUvOTY2MS8yODE4CitmIDUxNzIvOTY2OS8xMDY1IDUzMDEvOTQ4Mi8xMDY1IDU1NzcvOTkyNC8xMDY1CitmIDU1NzcvOTkyNC8xMDY1IDU1MjgvOTk4NS8xMDY1IDUxNzIvOTY2OS8xMDY1CitmIDUxNzEvOTY4NC8yODE5IDUzMTgvOTQ4MS8yODE5IDU1ODIvOTkyMi8yODE5CitmIDU1ODIvOTkyMi8yODE5IDU1MjcvOTk4Ni8yODE5IDUxNzEvOTY4NC8yODE5CitmIDUxOTYvOTY5MC8yODIwIDUzMjIvOTU3NC8yODIwIDU1ODQvOTk0OS8yODIwCitmIDU1ODQvOTk0OS8yODIxIDU1NTIvOTk4Ny8yODIxIDUxOTYvOTY5MC8yODIxCitmIDUyMDEvOTY5OC8xMDQ0IDUzMjYvOTY0NC8xMDQ0IDU1ODUvOTk4MC8xMDQ0CitmIDU1ODUvOTk4MC8xMDQ0IDU1NTcvOTk4OC8xMDQ0IDUyMDEvOTY5OC8xMDQ0CitmIDUxOTUvOTcwMC8yODIyIDUzMjcvOTQ3NS8yODIyIDU1ODYvOTkyMC8yODIyCitmIDU1ODYvOTkyMC8yODIzIDU1NTEvOTk4OS8yODIzIDUxOTUvOTcwMC8yODIzCitmIDUzNDUvOTcxMi8yMzMyIDUzMzcvOTU3OS8yMzMyIDU1OTAvOTk1MS8yMzMyCitmIDU1OTAvOTk1MS8yMzMyIDU1OTMvOTk5MC8yMzMyIDUzNDUvOTcxMi8yMzMyCitmIDUxOTcvOTcyMy8yMzMyIDUzNDUvOTcxMi8yMzMyIDU1OTMvOTk5MC8yMzMyCitmIDU1OTMvOTk5MC8yMzMyIDU1NTMvOTk5MS8yMzMyIDUxOTcvOTcyMy8yMzMyCitmIDU1MDUvOTcyNy8yODI0IDUzNDcvOTU4My8yODI0IDU1OTQvOTk1My8yODI0CitmIDU1OTQvOTk1My8yODI1IDU1OTYvOTk5Mi8yODI1IDU1MDUvOTcyNy8yODI1CitmIDUyMDcvOTU5Ny8xMDY1IDUzNDkvOTU5MS8xMDY1IDU1OTUvOTk1Ny8xMDY1CitmIDU1OTUvOTk1Ny8xMDY1IDU1NjEvOTk1OC8xMDY1IDUyMDcvOTU5Ny8xMDY1CitmIDUyOTAvOTQ0NS8xMDg4IDUxODQvOTg3OC8xMDg4IDU1NDAvOTk5My8xMDg4CitmIDU1NDAvOTk5My8xMDg4IDU1NzMvOTkwMy8xMDg4IDUyOTAvOTQ0NS8xMDg4CitmIDUzMTcvOTQ4MC8yNzYxIDUxOTUvOTg4OS8yNzYxIDU1NTEvOTk5NC8yNzYxCitmIDU1NTEvOTk5NC8yNzYyIDU1ODEvOTkyMS8yNzYyIDUzMTcvOTQ4MC8yNzYyCitmIDUzNDAvOTg5OC8yODI2IDUxOTQvOTg5Ny8yODI2IDU1NTAvOTk5NS8yODI2CitmIDU1NTAvOTk5NS8yODI3IDU1OTEvOTk5Ni8yODI3IDUzNDAvOTg5OC8yODI3CitmIDUzMjEvOTg5Mi8yNzg5IDUyMDEvOTg5MS8yNzg5IDU1NTcvOTk5Ny8yNzg5CitmIDU1NTcvOTk5Ny8yODI4IDU1ODMvOTk5OC8yODI4IDUzMjEvOTg5Mi8yODI4CitmIDUyODYvOTYwNy8yNjc3IDUxOTkvOTg3Ni8yNjc3IDU1NTUvOTk5OS8yNjc3CitmIDU1NTUvOTk5OS8yODI5IDU1NzEvOTk2My8yODI5IDUyODYvOTYwNy8yODI5CitmIDUzMDAvOTQ4NS8xMDY1IDUxNzEvOTg4MC8xMDY1IDU1MjcvMTAwMDAvMTA2NQorZiA1NTI3LzEwMDAwLzEwNjUgNTU3Ni85OTIzLzEwNjUgNTMwMC85NDg1LzEwNjUKK2YgNTIwMy85NjAxLzEwNjUgNTUwOS85NTk0LzEwNjUgNTU5Ny85OTU5LzEwNjUKK2YgNTU5Ny85OTU5LzEwNjUgNTU1OS85OTYwLzEwNjUgNTIwMy85NjAxLzEwNjUKK2YgNTMxNC85ODgyLzEwNDQgNTI3Ni85NTcxLzEwNDQgNTU2Ni85OTQ3LzEwNDQKK2YgNTU2Ni85OTQ3LzEwNDQgNTU4MC8xMDAwMS8xMDQ0IDUzMTQvOTg4Mi8xMDQ0CitmIDUzMDcvOTg4Ni8xMDQ0IDUzMDUvOTg4My8xMDQ0IDU1NzgvMTAwMDIvMTA0NAorZiA1NTc4LzEwMDAyLzEwNDQgNTU3OS8xMDAwMy8xMDQ0IDUzMDcvOTg4Ni8xMDQ0CitmIDUzMzMvOTg5NC8xMDQ0IDUzMDcvOTg4Ni8xMDQ0IDU1NzkvMTAwMDMvMTA0NAorZiA1NTc5LzEwMDAzLzEwNDQgNTU4OC8xMDAwNC8xMDQ0IDUzMzMvOTg5NC8xMDQ0CitmIDUzMDUvOTg4My8xMDQ0IDUzMTQvOTg4Mi8xMDQ0IDU1ODAvMTAwMDEvMTA0NAorZiA1NTgwLzEwMDAxLzEwNDQgNTU3OC8xMDAwMi8xMDQ0IDUzMDUvOTg4My8xMDQ0CitmIDUzMzYvOTU3Ny8yNzg4IDUzMjEvOTg5Mi8yNzg4IDU1ODMvOTk5OC8yNzg4CitmIDU1ODMvOTk5OC8yODMwIDU1ODkvOTk0OC8yODMwIDUzMzYvOTU3Ny8yODMwCitmIDUzMzEvOTY0Ny8xMDQ0IDUzMzMvOTg5NC8xMDQ0IDU1ODgvMTAwMDQvMTA0NAorZiA1NTg4LzEwMDA0LzEwNDQgNTU4Ny85OTc5LzEwNDQgNTMzMS85NjQ3LzEwNDQKK2YgNTM0NC85NDc0LzI4MzEgNTM0MC85ODk4LzI4MzEgNTU5MS85OTk2LzI4MzEKK2YgNTU5MS85OTk2LzI4MzIgNTU5Mi85OTE5LzI4MzIgNTM0NC85NDc0LzI4MzIKK2YgNTIwOC85NTg5LzI4MjQgNTUwNS85NzI3LzI4MjQgNTU5Ni85OTkyLzI4MjQKK2YgNTU5Ni85OTkyLzI4MzMgNTU2Mi85OTU0LzI4MzMgNTIwOC85NTg5LzI4MzMKK2YgNTUwOC85MzY4LzY4NyA1MjA1Lzk0MjQvNjg3IDUyMTUvOTQyNi82ODcKK2YgNTIxNS85NDI2LzY4NyA1MjE2Lzk0MjcvNjg3IDU1MDgvOTM2OC82ODcKK2YgNTIxNC85NDMyLzY4NyA1MjE1Lzk0MjYvNjg3IDUyNjQvOTQyNS82ODcKK2YgNTI2NC85NDI1LzY4NyA1MjY1Lzk0MzMvNjg3IDUyMTQvOTQzMi82ODcKK2YgNTY2OS8xMDAwNS82ODcgNTY3Mi8xMDAwNi82ODcgNTY2Mi8xMDAwNy82ODcKK2YgNTY2Mi8xMDAwNy82ODcgNTY0Mi8xMDAwOC82ODcgNTY2OS8xMDAwNS82ODcKK2YgNTYxMy8xMDAwOS8yODM0IDU3MTcvMTAwMTAvMjgzNCA1NzE2LzEwMDExLzI4MzQKK2YgNTcxNi8xMDAxMS8yODM1IDU2MTIvMTAwMTIvMjgzNSA1NjEzLzEwMDA5LzI4MzUKK2YgNTYxMy8xMDAwOS8yODM2IDU2MTQvMTAwMTMvMjgzNiA1NzE4LzEwMDE0LzI4MzYKK2YgNTcxOC8xMDAxNC8yODM3IDU3MTcvMTAwMTAvMjgzNyA1NjEzLzEwMDA5LzI4MzcKK2YgNTYxNC8xMDAxMy8yODM4IDU2MTUvMTAwMTUvMjgzOCA1NzE5LzEwMDE2LzI4MzgKK2YgNTcxOS8xMDAxNi8yODM5IDU3MTgvMTAwMTQvMjgzOSA1NjE0LzEwMDEzLzI4MzkKK2YgNTYxNS8xMDAxNS8yODQwIDU2MTYvMTAwMTcvMjg0MCA1NzIwLzEwMDE4LzI4NDAKK2YgNTcyMC8xMDAxOC8yODQxIDU3MTkvMTAwMTYvMjg0MSA1NjE1LzEwMDE1LzI4NDEKK2YgNTYxNi8xMDAxNy8yODQyIDU2MTcvMTAwMTkvMjg0MiA1NzIxLzEwMDIwLzI4NDIKK2YgNTcyMS8xMDAyMC8yODQzIDU3MjAvMTAwMTgvMjg0MyA1NjE2LzEwMDE3LzI4NDMKK2YgNTYxNy8xMDAxOS8yODQ0IDU2MTgvMTAwMjEvMjg0NCA1NzIyLzEwMDIyLzI4NDQKK2YgNTcyMi8xMDAyMi8yODQ1IDU3MjEvMTAwMjAvMjg0NSA1NjE3LzEwMDE5LzI4NDUKK2YgNTYxOS8xMDAyMy8yODQ2IDU3MjMvMTAwMjQvMjg0NiA1NzIyLzEwMDIyLzI4NDYKK2YgNTcyMi8xMDAyMi8yODQ3IDU2MTgvMTAwMjEvMjg0NyA1NjE5LzEwMDIzLzI4NDcKK2YgNTYyMC8xMDAyNS8yODQ4IDU3MjQvMTAwMjYvMjg0OCA1NzIzLzEwMDI0LzI4NDgKK2YgNTcyMy8xMDAyNC8yODQ5IDU2MTkvMTAwMjMvMjg0OSA1NjIwLzEwMDI1LzI4NDkKK2YgNTYyMC8xMDAyNy8yODUwIDU2MjEvMTAwMjgvMjg1MCA1NzI1LzEwMDI5LzI4NTAKK2YgNTcyNS8xMDAzMC8yODUxIDU3MjQvMTAwMjYvMjg1MSA1NjIwLzEwMDI1LzI4NTEKK2YgNTYyMS8xMDAzMS8yODUyIDU2MjIvMTAwMzIvMjg1MiA1NzI2LzEwMDMzLzI4NTIKK2YgNTcyNi8xMDAzMy8yODUzIDU3MjUvMTAwMzAvMjg1MyA1NjIxLzEwMDMxLzI4NTMKK2YgNTYyMy8xMDAzNC8yODU0IDU3MjcvMTAwMzUvMjg1NCA1NzI2LzEwMDMzLzI4NTQKK2YgNTcyNi8xMDAzMy8yODU1IDU2MjIvMTAwMzIvMjg1NSA1NjIzLzEwMDM0LzI4NTUKK2YgNTYyNC8xMDAzNi8yODU2IDU3MjgvMTAwMzcvMjg1NiA1NzI3LzEwMDM1LzI4NTYKK2YgNTcyNy8xMDAzNS8yODU3IDU2MjMvMTAwMzQvMjg1NyA1NjI0LzEwMDM2LzI4NTcKK2YgNTYyNS8xMDAzOC8yODU4IDU3MjkvMTAwMzkvMjg1OCA1NzI4LzEwMDM3LzI4NTgKK2YgNTcyOC8xMDA0MC8yODU5IDU2MjQvMTAwNDEvMjg1OSA1NjI1LzEwMDQyLzI4NTkKK2YgNTYyNi8xMDA0My8yODYwIDU3MzAvMTAwNDQvMjg2MCA1NzI5LzEwMDM5LzI4NjAKK2YgNTcyOS8xMDAzOS8yODYxIDU2MjUvMTAwMzgvMjg2MSA1NjI2LzEwMDQzLzI4NjEKK2YgNTczMC8xMDA0NC8yODYyIDU2MjYvMTAwNDMvMjg2MiA1NjY0LzEwMDQ1LzI4NjIKK2YgNTY2NC8xMDA0Ni8yODYzIDU3NDkvMTAwNDcvMjg2MyA1NzMwLzEwMDQ4LzI4NjMKK2YgNTczMS8xMDA0OS8yODY0IDU1OTgvMTAwNTAvMjg2NCA1Njk0LzEwMDUxLzI4NjQKK2YgNTY5NC8xMDA1MS8yODY1IDU3NTkvMTAwNTIvMjg2NSA1NzMxLzEwMDQ5LzI4NjUKK2YgNTY2OC8xMDA1My8yODY2IDU3NTEvMTAwNTQvMjg2NiA1NzMyLzEwMDU1LzI4NjYKK2YgNTczMi8xMDA1NS8yODY3IDU1OTkvMTAwNTYvMjg2NyA1NjY4LzEwMDUzLzI4NjcKK2YgNTY1OS8xMDA1Ny8yODY4IDU3NDcvMTAwNTgvMjg2OCA1NzMzLzEwMDU5LzI4NjgKK2YgNTczMy8xMDA1OS8yODY5IDU2MDAvMTAwNjAvMjg2OSA1NjU5LzEwMDU3LzI4NjkKK2YgNTY3My8xMDA2MS8yODcwIDU3NTMvMTAwNjIvMjg3MCA1NzM0LzEwMDYzLzI4NzAKK2YgNTczNC8xMDA2My8yODcxIDU2MDEvMTAwNjQvMjg3MSA1NjczLzEwMDYxLzI4NzEKK2YgNTYwMi8xMDA2NS8yODcyIDU2ODUvMTAwNjYvMjg3MiA1NzU3LzEwMDY3LzI4NzIKK2YgNTc1Ny8xMDA2Ny8yODczIDU3MzUvMTAwNjgvMjg3MyA1NjAyLzEwMDY1LzI4NzMKK2YgNTgwOC8xMDA2OS8yODc0IDU4MDkvMTAwNzAvMjg3NCA1NzM2LzEwMDcxLzI4NzQKK2YgNTczNi8xMDA3MS8yODc1IDU2MDMvMTAwNzIvMjg3NSA1ODA4LzEwMDY5LzI4NzUKK2YgNTYwNC8xMDA3My8yODc2IDU2MDUvMTAwNzQvMjg3NiA1NzM4LzEwMDc1LzI4NzYKK2YgNTczOC8xMDA3NS8yODc3IDU3MzcvMTAwNzYvMjg3NyA1NjA0LzEwMDczLzI4NzcKK2YgNTYwNS8xMDA3NC8yODc4IDU2MDYvMTAwNzcvMjg3OCA1NzM5LzEwMDc4LzI4NzgKK2YgNTczOS8xMDA3OC8yODc5IDU3MzgvMTAwNzUvMjg3OSA1NjA1LzEwMDc0LzI4NzkKK2YgNTYwNi8xMDA3Ny8yODgwIDU2MDcvMTAwNzkvMjg4MCA1NzQwLzEwMDgwLzI4ODAKK2YgNTc0MC8xMDA4MC8yODgxIDU3MzkvMTAwNzgvMjg4MSA1NjA2LzEwMDc3LzI4ODEKK2YgNTYwOC8xMDA4MS8yODgyIDU3NDEvMTAwODIvMjg4MiA1NzQwLzEwMDgwLzI4ODIKK2YgNTc0MC8xMDA4MC8yODgzIDU2MDcvMTAwNzkvMjg4MyA1NjA4LzEwMDgxLzI4ODMKK2YgNTYwOS8xMDA4My8yODg0IDU3NDIvMTAwODQvMjg4NCA1NzQxLzEwMDgyLzI4ODQKK2YgNTc0MS8xMDA4Mi8yODg1IDU2MDgvMTAwODEvMjg4NSA1NjA5LzEwMDgzLzI4ODUKK2YgNTYxMC8xMDA4NS8yODg2IDU3NDMvMTAwODYvMjg4NiA1NzQyLzEwMDg0LzI4ODYKK2YgNTc0Mi8xMDA4NC8yODg3IDU2MDkvMTAwODMvMjg4NyA1NjEwLzEwMDg1LzI4ODcKK2YgNTYxMC8xMDA4NS8yODg4IDU2MTEvMTAwODcvMjg4OCA1NzQ0LzEwMDg4LzI4ODgKK2YgNTc0NC8xMDA4OS8yODg5IDU3NDMvMTAwOTAvMjg4OSA1NjEwLzEwMDkxLzI4ODkKK2YgNTc5Ni8xMDA5Mi8yODkwIDU3OTEvMTAwOTMvMjg5MCA1NzkyLzEwMDk0LzI4OTAKK2YgNTc5Mi8xMDA5NC8yODkxIDU3OTcvMTAwOTUvMjg5MSA1Nzk2LzEwMDkyLzI4OTEKK2YgNTY1OC8xMDA5Ni82ODcgNTY0NC8xMDA5Ny82ODcgNTY3NC8xMDA5OC82ODcKK2YgNTY3NC8xMDA5OC82ODcgNTY3NS8xMDA5OS82ODcgNTY1OC8xMDA5Ni82ODcKK2YgNTY2MS8xMDEwMC8yODkyIDU3NDgvMTAxMDEvMjg5MiA1NzQ1LzEwMTAyLzI4OTIKK2YgNTc0NS8xMDEwMi8yODkzIDU2NTYvMTAxMDMvMjg5MyA1NjYxLzEwMTAwLzI4OTMKK2YgNTY1NS8xMDEwNC8yODk0IDU2MDEvMTAxMDUvMjg5NCA1NzM0LzEwMTA2LzI4OTQKK2YgNTczNC8xMDEwNi8yODk1IDU3NDYvMTAxMDcvMjg5NSA1NjU1LzEwMTA0LzI4OTUKK2YgNTY1OC8xMDA5Ni82ODcgNTY3NS8xMDA5OS82ODcgNTY3Ni8xMDEwOC82ODcKK2YgNTY3Ni8xMDEwOC82ODcgNTY2MC8xMDEwOS82ODcgNTY1OC8xMDA5Ni82ODcKK2YgNTY1NS8xMDEwNC8yODk2IDU3NDYvMTAxMDcvMjg5NiA1NzQ3LzEwMTEwLzI4OTYKK2YgNTc0Ny8xMDA1OC8yODk3IDU2NTkvMTAwNTcvMjg5NyA1NjU1LzEwMTExLzI4OTcKK2YgNTY2MS8xMDEwMC8yODk4IDU1OTkvMTAwNTYvMjg5OCA1NzMyLzEwMDU1LzI4OTgKK2YgNTczMi8xMDA1NS8yODkyIDU3NDgvMTAxMDEvMjg5MiA1NjYxLzEwMTAwLzI4OTIKK2YgNTY4MC8xMDExMi82ODcgNTY4NC8xMDExMy82ODcgNTY2Ny8xMDExNC82ODcKK2YgNTY2Ny8xMDExNC82ODcgNTY2NS8xMDExNS82ODcgNTY4MC8xMDExMi82ODcKK2YgNTY3MC8xMDExNi8yODk5IDU3NTIvMTAxMTcvMjg5OSA1NzQ5LzEwMTE4LzI4OTkKK2YgNTc0OS8xMDA0Ny8yOTAwIDU2NjQvMTAwNDYvMjkwMCA1NjcwLzEwMTE5LzI5MDAKK2YgNTY3OS8xMDEyMC8yOTAxIDU3NTUvMTAxMjEvMjkwMSA1NzUwLzEwMTIyLzI5MDEKK2YgNTc1MC8xMDEyMi8yOTAyIDU2NjMvMTAxMjMvMjkwMiA1Njc5LzEwMTIwLzI5MDIKK2YgNTY5Mi8xMDEyNC82ODcgNTY5MS8xMDEyNS82ODcgNTc0OS8xMDExOC82ODcKK2YgNTc0OS8xMDExOC82ODcgNTc1Mi8xMDExNy82ODcgNTY5Mi8xMDEyNC82ODcKK2YgNTY3MS8xMDEyNi82ODcgNTY3Mi8xMDAwNi82ODcgNTY2Ny8xMDExNC82ODcKK2YgNTY2Ny8xMDExNC82ODcgNTY2Ni8xMDEyNy82ODcgNTY3MS8xMDEyNi82ODcKK2YgNTY2NS8xMDExNS82ODcgNTY2Ny8xMDExNC82ODcgNTY3Mi8xMDAwNi82ODcKK2YgNTY3Mi8xMDAwNi82ODcgNTY2OS8xMDAwNS82ODcgNTY2NS8xMDExNS82ODcKK2YgNTY2My8xMDEyMy8yOTAzIDU3NTAvMTAxMjIvMjkwMyA1NzUxLzEwMDU0LzI5MDMKK2YgNTc1MS8xMDA1NC8yOTA0IDU2NjgvMTAwNTMvMjkwNCA1NjYzLzEwMTIzLzI5MDQKK2YgNTgwMC8xMDEyOC8yOTA1IDU1OTgvMTAwNTAvMjkwNSA1NzMxLzEwMDQ5LzI5MDUKK2YgNTczMS8xMDEyOS8yOTA2IDU3OTkvMTAxMzAvMjkwNiA1ODAwLzEwMTMxLzI5MDYKK2YgNTc5OS8xMDEzMi82ODcgNTY5My8xMDEzMy82ODcgNTY5Mi8xMDEyNC82ODcKK2YgNTY5Mi8xMDEyNC82ODcgNTc1Mi8xMDExNy82ODcgNTc5OS8xMDEzMi82ODcKK2YgNTY1Ny8xMDEzNC82ODcgNTY2Mi8xMDAwNy82ODcgNTY3Mi8xMDAwNi82ODcKK2YgNTY3Mi8xMDAwNi82ODcgNTY3MS8xMDEyNi82ODcgNTY1Ny8xMDEzNC82ODcKK2YgNTY5NC8xMDA1MS8yOTA3IDU4MDIvMTAxMzUvMjkwNyA1ODAzLzEwMTM2LzI5MDcKK2YgNTgwMy8xMDEzNi8yOTA4IDU3NTkvMTAwNTIvMjkwOCA1Njk0LzEwMDUxLzI5MDgKK2YgNTY5Mi8xMDEyNC82ODcgNTgwNC8xMDEzNy82ODcgNTgwNS8xMDEzOC82ODcKK2YgNTgwNS8xMDEzOC82ODcgNTY5MS8xMDEyNS82ODcgNTY5Mi8xMDEyNC82ODcKK2YgNTgwNi8xMDEzOS82ODcgNTgwNC8xMDEzNy82ODcgNTY5Mi8xMDEyNC82ODcKK2YgNTY5Mi8xMDEyNC82ODcgNTY5My8xMDEzMy82ODcgNTgwNi8xMDEzOS82ODcKK2YgNTY4MS8xMDE0MC8yOTA5IDU3NTYvMTAxNDEvMjkwOSA1NzUzLzEwMDYyLzI5MDkKK2YgNTc1My8xMDA2Mi8yOTEwIDU2NzMvMTAwNjEvMjkxMCA1NjgxLzEwMTQwLzI5MTAKK2YgNTY4Mi8xMDE0Mi82ODcgNTY4My8xMDE0My82ODcgNTY3NS8xMDA5OS82ODcKK2YgNTY3NS8xMDA5OS82ODcgNTY3NC8xMDA5OC82ODcgNTY4Mi8xMDE0Mi82ODcKK2YgNTY4My8xMDE0My82ODcgNTY4NC8xMDExMy82ODcgNTY3Ni8xMDEwOC82ODcKK2YgNTY3Ni8xMDEwOC82ODcgNTY3NS8xMDA5OS82ODcgNTY4My8xMDE0My82ODcKK2YgNTY0My8xMDE0NC82ODcgNTY2MC8xMDEwOS82ODcgNTY3Ni8xMDEwOC82ODcKK2YgNTY3Ni8xMDEwOC82ODcgNTY3OC8xMDE0NS82ODcgNTY0My8xMDE0NC82ODcKK2YgNTY3Ny8xMDE0Ni8yOTExIDU2MDAvMTAwNjAvMjkxMSA1NzMzLzEwMDU5LzI5MTEKK2YgNTczMy8xMDA1OS8yOTEyIDU3NTQvMTAxNDcvMjkxMiA1Njc3LzEwMTQ2LzI5MTIKK2YgNTY3OC8xMDE0NS82ODcgNTY3Ni8xMDEwOC82ODcgNTY4NC8xMDExMy82ODcKK2YgNTY4NC8xMDExMy82ODcgNTY4MC8xMDExMi82ODcgNTY3OC8xMDE0NS82ODcKK2YgNTY3Ny8xMDE0Ni8yOTEzIDU3NTQvMTAxNDcvMjkxMyA1NzU1LzEwMTIxLzI5MTMKK2YgNTc1NS8xMDEyMS8yOTE0IDU2NzkvMTAxMjAvMjkxNCA1Njc3LzEwMTQ2LzI5MTQKK2YgNTYwMi8xMDE0OC8yOTE1IDU3MzUvMTAxNDkvMjkxNSA1NzU2LzEwMTQxLzI5MTUKK2YgNTc1Ni8xMDE0MS8yOTE2IDU2ODEvMTAxNDAvMjkxNiA1NjAyLzEwMTQ4LzI5MTYKK2YgNTY4Mi8xMDE0Mi82ODcgNTY0NS8xMDE1MC82ODcgNTY2Ni8xMDEyNy82ODcKK2YgNTY2Ni8xMDEyNy82ODcgNTY4My8xMDE0My82ODcgNTY4Mi8xMDE0Mi82ODcKK2YgNTY2Ni8xMDEyNy82ODcgNTY2Ny8xMDExNC82ODcgNTY4NC8xMDExMy82ODcKK2YgNTY4NC8xMDExMy82ODcgNTY4My8xMDE0My82ODcgNTY2Ni8xMDEyNy82ODcKK2YgNTYwMy8xMDE1MS8yOTE3IDU3MzYvMTAxNTIvMjkxNyA1NzU3LzEwMDY3LzI5MTcKK2YgNTc1Ny8xMDA2Ny8yOTE4IDU2ODUvMTAwNjYvMjkxOCA1NjAzLzEwMTUxLzI5MTgKK2YgNTY1Ni8xMDEwMy8yOTE5IDU3NDUvMTAxMDIvMjkxOSA1NzU4LzEwMTUzLzI5MTkKK2YgNTc1OC8xMDE1My8yOTIwIDU2ODcvMTAxNTQvMjkyMCA1NjU2LzEwMTAzLzI5MjAKK2YgNTY3MS8xMDEyNi82ODcgNTY2Ni8xMDEyNy82ODcgNTY4OS8xMDE1NS82ODcKK2YgNTY4OS8xMDE1NS82ODcgNTY5MC8xMDE1Ni82ODcgNTY3MS8xMDEyNi82ODcKK2YgNTY1Ny8xMDEzNC82ODcgNTY3MS8xMDEyNi82ODcgNTY5MC8xMDE1Ni82ODcKK2YgNTY5MC8xMDE1Ni82ODcgNTY4OC8xMDE1Ny82ODcgNTY1Ny8xMDEzNC82ODcKK2YgNTY4Ni8xMDE1OC82ODcgNTY0Ni8xMDE1OS82ODcgNTgwNS8xMDEzOC82ODcKK2YgNTgwNS8xMDEzOC82ODcgNTY4OS8xMDE1NS82ODcgNTY4Ni8xMDE1OC82ODcKK2YgNTY0Ny8xMDE2MC82ODcgNTYzOS8xMDE2MS82ODcgNTY0MC8xMDE2Mi82ODcKK2YgNTY0MC8xMDE2Mi82ODcgNTgxMC8xMDE2My82ODcgNTY0Ny8xMDE2MC82ODcKK2YgNTY0NS8xMDE1MC82ODcgNTY4Ni8xMDE1OC82ODcgNTY4OS8xMDE1NS82ODcKK2YgNTY4OS8xMDE1NS82ODcgNTY2Ni8xMDEyNy82ODcgNTY0NS8xMDE1MC82ODcKK2YgNTY0OC8xMDE2NC82ODcgNTYzOC8xMDE2NS82ODcgNTYzOS8xMDE2MS82ODcKK2YgNTYzOS8xMDE2MS82ODcgNTY0Ny8xMDE2MC82ODcgNTY0OC8xMDE2NC82ODcKK2YgNTY0OS8xMDE2Ni82ODcgNTYzNi8xMDE2Ny82ODcgNTYzNy8xMDE2OC82ODcKK2YgNTYzNy8xMDE2OC82ODcgNTY0OC8xMDE2NC82ODcgNTY0OS8xMDE2Ni82ODcKK2YgNTY0OS8xMDE2Ni82ODcgNTY1MC8xMDE2OS82ODcgNTYzNS8xMDE3MC82ODcKK2YgNTYzNS8xMDE3MC82ODcgNTYzNi8xMDE2Ny82ODcgNTY0OS8xMDE2Ni82ODcKK2YgNTY1MC8xMDE2OS82ODcgNTY1MS8xMDE3MS82ODcgNTYzNC8xMDE3Mi82ODcKK2YgNTYzNC8xMDE3Mi82ODcgNTYzNS8xMDE3MC82ODcgNTY1MC8xMDE2OS82ODcKK2YgNTY1NC8xMDE3My82ODcgNTYzMC8xMDE3NC82ODcgNTYzMS8xMDE3NS82ODcKK2YgNTYzMS8xMDE3NS82ODcgNTY1My8xMDE3Ni82ODcgNTY1NC8xMDE3My82ODcKK2YgNTY0OC8xMDE2NC82ODcgNTYzNy8xMDE2OC82ODcgNTYzOC8xMDE2NS82ODcKK2YgNTY1MS8xMDE3MS82ODcgNTYzMy8xMDE3Ny82ODcgNTYzNC8xMDE3Mi82ODcKK2YgNTY1My8xMDE3Ni82ODcgNTYzMS8xMDE3NS82ODcgNTYzMi8xMDE3OC82ODcKK2YgNTYzMi8xMDE3OC82ODcgNTY1Mi8xMDE3OS82ODcgNTY1My8xMDE3Ni82ODcKK2YgNTY1Mi8xMDE3OS82ODcgNTYzMi8xMDE3OC82ODcgNTYzMy8xMDE3Ny82ODcKK2YgNTYzMy8xMDE3Ny82ODcgNTY1MS8xMDE3MS82ODcgNTY1Mi8xMDE3OS82ODcKK2YgNTYyOS8xMDE4MC82ODcgNTc5NS8xMDE4MS82ODcgNTYyNy8xMDE4Mi82ODcKK2YgNTYyNy8xMDE4Mi82ODcgNTYyOC8xMDE4My82ODcgNTYyOS8xMDE4MC82ODcKK2YgNTYxMi8xMDAxMi8yOTIxIDU3MTYvMTAwMTEvMjkyMSA1Nzk2LzEwMDkyLzI5MjEKK2YgNTc5Ni8xMDA5Mi8yOTIyIDU3OTcvMTAwOTUvMjkyMiA1NjEyLzEwMDEyLzI5MjIKK2YgNTc5NS8xMDE4MS82ODcgNTc5Ni8xMDA5Mi82ODcgNTcxNi8xMDAxMS82ODcKK2YgNTcxNi8xMDAxMS82ODcgNTYyNy8xMDE4Mi82ODcgNTc5NS8xMDE4MS82ODcKK2YgNTYxMy8xMDE4NC8yOTIzIDU2MTIvMTAxODUvMjkyMyA1NzczLzEwMTg2LzI5MjMKK2YgNTc3My8xMDE4Ni8yOTI0IDU2OTYvMTAxODcvMjkyNCA1NjEzLzEwMTg0LzI5MjQKK2YgNTYxNC8xMDE4OC8yOTI1IDU2MTMvMTAxODkvMjkyNSA1Njk2LzEwMTkwLzI5MjUKK2YgNTY5Ni8xMDE5MC8yOTI2IDU2OTcvMTAxOTEvMjkyNiA1NjE0LzEwMTg4LzI5MjYKK2YgNTYxNS8xMDE5Mi8yOTI3IDU2MTQvMTAxODgvMjkyNyA1Njk3LzEwMTkxLzI5MjcKK2YgNTY5Ny8xMDE5MS8yOTI4IDU2OTgvMTAxOTMvMjkyOCA1NjE1LzEwMTkyLzI5MjgKK2YgNTYxNi8xMDE5NC8yOTI5IDU2MTUvMTAxOTIvMjkyOSA1Njk4LzEwMTkzLzI5MjkKK2YgNTY5OC8xMDE5My8yOTMwIDU2OTkvMTAxOTUvMjkzMCA1NjE2LzEwMTk0LzI5MzAKK2YgNTYxNy8xMDE5Ni8yOTMxIDU2MTYvMTAxOTQvMjkzMSA1Njk5LzEwMTk1LzI5MzEKK2YgNTY5OS8xMDE5NS8yOTMyIDU3MDAvMTAxOTcvMjkzMiA1NjE3LzEwMTk2LzI5MzIKK2YgNTYxOC8xMDE5OC8yOTMzIDU2MTcvMTAxOTYvMjkzMyA1NzAwLzEwMTk3LzI5MzMKK2YgNTcwMC8xMDE5Ny8yOTM0IDU3MDEvMTAxOTkvMjkzNCA1NjE4LzEwMTk4LzI5MzQKK2YgNTYxOS8xMDIwMC8yOTM1IDU2MTgvMTAyMDEvMjkzNSA1NzAxLzEwMjAyLzI5MzUKK2YgNTcwMS8xMDIwMi8yOTM2IDU3MDIvMTAyMDMvMjkzNiA1NjE5LzEwMjAwLzI5MzYKK2YgNTYyMC8xMDAyNy8yOTM3IDU2MTkvMTAyMDAvMjkzNyA1NzAyLzEwMjAzLzI5MzcKK2YgNTcwMi8xMDIwMy8yOTM4IDU3MDMvMTAyMDQvMjkzOCA1NjIwLzEwMDI3LzI5MzgKK2YgNTYyMS8xMDAyOC8yOTM5IDU2MjAvMTAwMjcvMjkzOSA1NzAzLzEwMjA0LzI5MzkKK2YgNTcwMy8xMDIwNC8yOTQwIDU3MDQvMTAyMDUvMjk0MCA1NjIxLzEwMDI4LzI5NDAKK2YgNTYyMi8xMDIwNi8yOTQxIDU2MjEvMTAwMjgvMjk0MSA1NzA0LzEwMjA1LzI5NDEKK2YgNTcwNC8xMDIwNS8yOTQyIDU3MDUvMTAyMDcvMjk0MiA1NjIyLzEwMjA2LzI5NDIKK2YgNTYyMy8xMDIwOC8yOTQzIDU2MjIvMTAyMDkvMjk0MyA1NzA1LzEwMjEwLzI5NDMKK2YgNTcwNS8xMDIxMC8yOTQ0IDU3MDYvMTAyMTEvMjk0NCA1NjIzLzEwMjA4LzI5NDQKK2YgNTYyNC8xMDA0MS8yOTQ1IDU2MjMvMTAyMDgvMjk0NSA1NzA2LzEwMjExLzI5NDUKK2YgNTcwNi8xMDIxMS8yOTQ2IDU3MDcvMTAyMTIvMjk0NiA1NjI0LzEwMDQxLzI5NDYKK2YgNTYyNS8xMDA0Mi8yOTQ3IDU2MjQvMTAwNDEvMjk0NyA1NzA3LzEwMjEyLzI5NDcKK2YgNTcwNy8xMDIxMi8yOTQ4IDU3MDgvMTAyMTMvMjk0OCA1NjI1LzEwMDQyLzI5NDgKK2YgNTYyNi8xMDIxNC8yOTQ5IDU2MjUvMTAwNDIvMjk0OSA1NzA4LzEwMjEzLzI5NDkKK2YgNTcwOC8xMDIxMy8yOTUwIDU3MDkvMTAyMTUvMjk1MCA1NjI2LzEwMjE0LzI5NTAKK2YgNTY5NS8xMDIxNi8xMDQzIDU3MTUvMTAyMTcvMTA0MyA1Njk0LzEwMjE4LzEwNDMKK2YgNTY5NC8xMDIxOC8xMDQzIDU1OTgvMTAyMTkvMTA0MyA1Njk1LzEwMjE2LzEwNDMKK2YgNTcwOS8xMDIxNS8yOTUxIDU3MTIvMTAyMjAvMjk1MSA1NjY0LzEwMDQ2LzI5NTEKK2YgNTY2NC8xMDA0Ni8yOTUyIDU2MjYvMTAyMTQvMjk1MiA1NzA5LzEwMjE1LzI5NTIKK2YgNTY2MS8xMDIyMS8xMDQzIDU2NTYvMTAyMjIvMTA0MyA1NzEwLzEwMjIzLzEwNDMKK2YgNTcxMC8xMDIyMy8xMDQzIDU3MTEvMTAyMjQvMTA0MyA1NjYxLzEwMjIxLzEwNDMKK2YgNTU5OS8xMDIyNS8xMDQzIDU2NjEvMTAyMjEvMTA0MyA1NzExLzEwMjI0LzEwNDMKK2YgNTcxMS8xMDIyNC8xMDQzIDU3NjAvMTAyMjYvMTA0MyA1NTk5LzEwMjI1LzEwNDMKK2YgNTY3MC8xMDExOS8yOTUzIDU2NjQvMTAwNDYvMjk1MyA1NzEyLzEwMjIwLzI5NTMKK2YgNTcxMi8xMDIyMC8yOTU0IDU3MTMvMTAyMjcvMjk1NCA1NjcwLzEwMTE5LzI5NTQKK2YgNTgwMC8xMDIyOC8yOTU1IDU2NzAvMTAxMTkvMjk1NSA1NzEzLzEwMjI3LzI5NTUKK2YgNTcxMy8xMDIyNy8yOTU1IDU4MDEvMTAyMjkvMjk1NSA1ODAwLzEwMjI4LzI5NTUKK2YgNTY1Ni8xMDIyMi8xMDQzIDU2ODcvMTAyMzAvMTA0MyA1NzE0LzEwMjMxLzEwNDMKK2YgNTcxNC8xMDIzMS8xMDQzIDU3MTAvMTAyMjMvMTA0MyA1NjU2LzEwMjIyLzEwNDMKK2YgNTgwMi8xMDIzMi8xMDQzIDU2OTQvMTAyMTgvMTA0MyA1NzE1LzEwMjE3LzEwNDMKK2YgNTcxNS8xMDIxNy8xMDQzIDU4MDcvMTAyMzMvMTA0MyA1ODAyLzEwMjMyLzEwNDMKK2YgNTcxNy8xMDAxMC82ODcgNTYyOC8xMDE4My82ODcgNTYyNy8xMDE4Mi82ODcKK2YgNTYyNy8xMDE4Mi82ODcgNTcxNi8xMDAxMS82ODcgNTcxNy8xMDAxMC82ODcKK2YgNTYyOS8xMDE4MC82ODcgNTYyOC8xMDE4My82ODcgNTcxNy8xMDAxMC82ODcKK2YgNTcxNy8xMDAxMC82ODcgNTcxOC8xMDAxNC82ODcgNTYyOS8xMDE4MC82ODcKK2YgNTYzMC8xMDE3NC82ODcgNTYyOS8xMDE4MC82ODcgNTcxOC8xMDAxNC82ODcKK2YgNTcxOC8xMDAxNC82ODcgNTcxOS8xMDAxNi82ODcgNTYzMC8xMDE3NC82ODcKK2YgNTYzMS8xMDE3NS82ODcgNTYzMC8xMDE3NC82ODcgNTcxOS8xMDAxNi82ODcKK2YgNTcxOS8xMDAxNi82ODcgNTcyMC8xMDAxOC82ODcgNTYzMS8xMDE3NS82ODcKK2YgNTYzMi8xMDE3OC82ODcgNTYzMS8xMDE3NS82ODcgNTcyMC8xMDAxOC82ODcKK2YgNTcyMC8xMDAxOC82ODcgNTcyMS8xMDAyMC82ODcgNTYzMi8xMDE3OC82ODcKK2YgNTYzMy8xMDE3Ny82ODcgNTYzMi8xMDE3OC82ODcgNTcyMS8xMDAyMC82ODcKK2YgNTcyMS8xMDAyMC82ODcgNTcyMi8xMDAyMi82ODcgNTYzMy8xMDE3Ny82ODcKK2YgNTcyMy8xMDAyNC82ODcgNTYzNC8xMDE3Mi82ODcgNTYzMy8xMDE3Ny82ODcKK2YgNTYzMy8xMDE3Ny82ODcgNTcyMi8xMDAyMi82ODcgNTcyMy8xMDAyNC82ODcKK2YgNTcyNC8xMDAyNi82ODcgNTYzNS8xMDE3MC82ODcgNTYzNC8xMDE3Mi82ODcKK2YgNTYzNC8xMDE3Mi82ODcgNTcyMy8xMDAyNC82ODcgNTcyNC8xMDAyNi82ODcKK2YgNTYzNi8xMDE2Ny82ODcgNTYzNS8xMDE3MC82ODcgNTcyNC8xMDAyNi82ODcKK2YgNTcyNC8xMDAyNi82ODcgNTcyNS8xMDAzMC82ODcgNTYzNi8xMDE2Ny82ODcKK2YgNTYzNy8xMDE2OC82ODcgNTYzNi8xMDE2Ny82ODcgNTcyNS8xMDAzMC82ODcKK2YgNTcyNS8xMDAzMC82ODcgNTcyNi8xMDAzMy82ODcgNTYzNy8xMDE2OC82ODcKK2YgNTcyNy8xMDAzNS82ODcgNTYzOC8xMDE2NS82ODcgNTYzNy8xMDE2OC82ODcKK2YgNTYzNy8xMDE2OC82ODcgNTcyNi8xMDAzMy82ODcgNTcyNy8xMDAzNS82ODcKK2YgNTcyOC8xMDAzNy82ODcgNTYzOS8xMDE2MS82ODcgNTYzOC8xMDE2NS82ODcKK2YgNTYzOC8xMDE2NS82ODcgNTcyNy8xMDAzNS82ODcgNTcyOC8xMDAzNy82ODcKK2YgNTY0MC8xMDE2Mi82ODcgNTYzOS8xMDE2MS82ODcgNTcyOC8xMDAzNy82ODcKK2YgNTcyOC8xMDAzNy82ODcgNTcyOS8xMDAzOS82ODcgNTY0MC8xMDE2Mi82ODcKK2YgNTczMC8xMDA0NC82ODcgNTY0MS8xMDIzNC82ODcgNTY0MC8xMDE2Mi82ODcKK2YgNTY0MC8xMDE2Mi82ODcgNTcyOS8xMDAzOS82ODcgNTczMC8xMDA0NC82ODcKK2YgNTczMC8xMDA0NC82ODcgNTc0OS8xMDExOC82ODcgNTY5MS8xMDEyNS82ODcKK2YgNTY5MS8xMDEyNS82ODcgNTY0MS8xMDIzNC82ODcgNTczMC8xMDA0NC82ODcKK2YgNTc1MS8xMDA1NC82ODcgNTY2OS8xMDAwNS82ODcgNTY0Mi8xMDAwOC82ODcKK2YgNTY0Mi8xMDAwOC82ODcgNTczMi8xMDA1NS82ODcgNTc1MS8xMDA1NC82ODcKK2YgNTc0Ny8xMDA1OC82ODcgNTY2MC8xMDEwOS82ODcgNTY0My8xMDE0NC82ODcKK2YgNTY0My8xMDE0NC82ODcgNTczMy8xMDA1OS82ODcgNTc0Ny8xMDA1OC82ODcKK2YgNTc1My8xMDIzNS82ODcgNTY3NC8xMDA5OC82ODcgNTY0NC8xMDA5Ny82ODcKK2YgNTY0NC8xMDA5Ny82ODcgNTczNC8xMDIzNi82ODcgNTc1My8xMDIzNS82ODcKK2YgNTY4Ni8xMDE1OC82ODcgNTY0NS8xMDE1MC82ODcgNTczNS8xMDIzNy82ODcKK2YgNTczNS8xMDIzNy82ODcgNTc1Ny8xMDIzOC82ODcgNTY4Ni8xMDE1OC82ODcKK2YgNTgxMC8xMDE2My82ODcgNTY0Ni8xMDE1OS82ODcgNTczNi8xMDA3MS82ODcKK2YgNTczNi8xMDA3MS82ODcgNTgwOS8xMDA3MC82ODcgNTgxMC8xMDE2My82ODcKK2YgNTY0OC8xMDE2NC82ODcgNTY0Ny8xMDE2MC82ODcgNTczNy8xMDA3Ni82ODcKK2YgNTczNy8xMDA3Ni82ODcgNTczOC8xMDA3NS82ODcgNTY0OC8xMDE2NC82ODcKK2YgNTY0OS8xMDE2Ni82ODcgNTY0OC8xMDE2NC82ODcgNTczOC8xMDA3NS82ODcKK2YgNTczOC8xMDA3NS82ODcgNTczOS8xMDA3OC82ODcgNTY0OS8xMDE2Ni82ODcKK2YgNTY1MC8xMDE2OS82ODcgNTY0OS8xMDE2Ni82ODcgNTczOS8xMDA3OC82ODcKK2YgNTczOS8xMDA3OC82ODcgNTc0MC8xMDA4MC82ODcgNTY1MC8xMDE2OS82ODcKK2YgNTc0MS8xMDA4Mi82ODcgNTY1MS8xMDE3MS82ODcgNTY1MC8xMDE2OS82ODcKK2YgNTY1MC8xMDE2OS82ODcgNTc0MC8xMDA4MC82ODcgNTc0MS8xMDA4Mi82ODcKK2YgNTc0Mi8xMDA4NC82ODcgNTY1Mi8xMDE3OS82ODcgNTY1MS8xMDE3MS82ODcKK2YgNTY1MS8xMDE3MS82ODcgNTc0MS8xMDA4Mi82ODcgNTc0Mi8xMDA4NC82ODcKK2YgNTY1My8xMDE3Ni82ODcgNTY1Mi8xMDE3OS82ODcgNTc0Mi8xMDA4NC82ODcKK2YgNTc0Mi8xMDA4NC82ODcgNTc0My8xMDA4Ni82ODcgNTY1My8xMDE3Ni82ODcKK2YgNTY1NC8xMDE3My82ODcgNTY1My8xMDE3Ni82ODcgNTc0My8xMDA4Ni82ODcKK2YgNTc0My8xMDA4Ni82ODcgNTc0NC8xMDA4OC82ODcgNTY1NC8xMDE3My82ODcKK2YgNTc5My8xMDIzOS82ODcgNTY1NC8xMDE3My82ODcgNTc0NC8xMDA4OC82ODcKK2YgNTc0NC8xMDA4OC82ODcgNTc5MS8xMDA5My82ODcgNTc5My8xMDIzOS82ODcKK2YgNTY2Mi8xMDAwNy82ODcgNTY1Ny8xMDEzNC82ODcgNTc0NS8xMDEwMi82ODcKK2YgNTc0NS8xMDEwMi82ODcgNTc0OC8xMDEwMS82ODcgNTY2Mi8xMDAwNy82ODcKK2YgNTY0NC8xMDA5Ny82ODcgNTY1OC8xMDA5Ni82ODcgNTc0Ni8xMDI0MC82ODcKK2YgNTc0Ni8xMDI0MC82ODcgNTczNC8xMDIzNi82ODcgNTY0NC8xMDA5Ny82ODcKK2YgNTY1OC8xMDA5Ni82ODcgNTY2MC8xMDEwOS82ODcgNTc0Ny8xMDA1OC82ODcKK2YgNTc0Ny8xMDA1OC82ODcgNTc0Ni8xMDI0MC82ODcgNTY1OC8xMDA5Ni82ODcKK2YgNTY0Mi8xMDAwOC82ODcgNTY2Mi8xMDAwNy82ODcgNTc0OC8xMDEwMS82ODcKK2YgNTc0OC8xMDEwMS82ODcgNTczMi8xMDA1NS82ODcgNTY0Mi8xMDAwOC82ODcKK2YgNTY4MC8xMDExMi82ODcgNTY2NS8xMDExNS82ODcgNTc1MC8xMDEyMi82ODcKK2YgNTc1MC8xMDEyMi82ODcgNTc1NS8xMDEyMS82ODcgNTY4MC8xMDExMi82ODcKK2YgNTY2NS8xMDExNS82ODcgNTY2OS8xMDAwNS82ODcgNTc1MS8xMDA1NC82ODcKK2YgNTc1MS8xMDA1NC82ODcgNTc1MC8xMDEyMi82ODcgNTY2NS8xMDExNS82ODcKK2YgNTgwNi8xMDEzOS8yOTU2IDU2OTMvMTAxMzMvMjk1NiA1NzU5LzEwMDUyLzI5NTYKK2YgNTc1OS8xMDA1Mi82ODcgNTgwMy8xMDEzNi82ODcgNTgwNi8xMDEzOS82ODcKK2YgNTY4Mi8xMDE0Mi82ODcgNTY3NC8xMDA5OC82ODcgNTc1My8xMDIzNS82ODcKK2YgNTc1My8xMDIzNS82ODcgNTc1Ni8xMDI0MS82ODcgNTY4Mi8xMDE0Mi82ODcKK2YgNTY0My8xMDE0NC82ODcgNTY3OC8xMDE0NS82ODcgNTc1NC8xMDE0Ny82ODcKK2YgNTc1NC8xMDE0Ny82ODcgNTczMy8xMDA1OS82ODcgNTY0My8xMDE0NC82ODcKK2YgNTY3OC8xMDE0NS82ODcgNTY4MC8xMDExMi82ODcgNTc1NS8xMDEyMS82ODcKK2YgNTc1NS8xMDEyMS82ODcgNTc1NC8xMDE0Ny82ODcgNTY3OC8xMDE0NS82ODcKK2YgNTczNS8xMDIzNy82ODcgNTY0NS8xMDE1MC82ODcgNTY4Mi8xMDE0Mi82ODcKK2YgNTY4Mi8xMDE0Mi82ODcgNTc1Ni8xMDI0MS82ODcgNTczNS8xMDIzNy82ODcKK2YgNTczNi8xMDA3MS82ODcgNTY0Ni8xMDE1OS82ODcgNTY4Ni8xMDE1OC82ODcKK2YgNTY4Ni8xMDE1OC82ODcgNTc1Ny8xMDIzOC82ODcgNTczNi8xMDA3MS82ODcKK2YgNTY1Ny8xMDEzNC82ODcgNTY4OC8xMDE1Ny82ODcgNTc1OC8xMDE1My82ODcKK2YgNTc1OC8xMDE1My82ODcgNTc0NS8xMDEwMi82ODcgNTY1Ny8xMDEzNC82ODcKK2YgNTc2MC8xMDI0Mi8yNzYxIDU3NzcvMTAyNDMvMjc2MSA1NjY4LzEwMjQ0LzI3NjEKK2YgNTY2OC8xMDI0NC8yNjczIDU1OTkvMTAyNDUvMjY3MyA1NzYwLzEwMjQyLzI2NzMKK2YgNTc2MS8xMDI0Ni8xMDQ0IDU3NzUvMTAyNDcvMTA0NCA1NjU5LzEwMjQ4LzEwNDQKK2YgNTY1OS8xMDI0OC8xMDQ0IDU2MDAvMTAyNDkvMTA0NCA1NzYxLzEwMjQ2LzEwNDQKK2YgNTc2Mi8xMDI1MC8yOTU3IDU3NzgvMTAyNTEvMjk1NyA1NjczLzEwMDYxLzI5NTcKK2YgNTY3My8xMDA2MS8yOTU4IDU2MDEvMTAwNjQvMjk1OCA1NzYyLzEwMjUwLzI5NTgKK2YgNTc2My8xMDI1Mi8yOTU5IDU3ODIvMTAyNTMvMjk1OSA1Njg1LzEwMDY2LzI5NTkKK2YgNTY4NS8xMDA2Ni8yOTU5IDU2MDIvMTAwNjUvMjk1OSA1NzYzLzEwMjUyLzI5NTkKK2YgNTgxMS8xMDI1NC8yOTYwIDU3NjUvMTAyNTUvMjk2MCA1NjA0LzEwMjU2LzI5NjAKK2YgNTYwNC8xMDI1Ni8yOTYxIDU4MDgvMTAyNTcvMjk2MSA1ODExLzEwMjU0LzI5NjEKK2YgNTc2NS8xMDI1NS8yOTYyIDU3NjYvMTAyNTgvMjk2MiA1NjA1LzEwMjU5LzI5NjIKK2YgNTYwNS8xMDI1OS8yOTYzIDU2MDQvMTAyNTYvMjk2MyA1NzY1LzEwMjU1LzI5NjMKK2YgNTc2Ni8xMDI2MC8yOTY0IDU3NjcvMTAyNjEvMjk2NCA1NjA2LzEwMjYyLzI5NjQKK2YgNTYwNi8xMDI2Mi8yOTY1IDU2MDUvMTAyNjMvMjk2NSA1NzY2LzEwMjYwLzI5NjUKK2YgNTc2Ny8xMDI2MS8yOTY2IDU3NjgvMTAyNjQvMjk2NiA1NjA3LzEwMjY1LzI5NjYKK2YgNTYwNy8xMDI2NS8yOTY2IDU2MDYvMTAyNjIvMjk2NiA1NzY3LzEwMjYxLzI5NjYKK2YgNTc2OC8xMDI2NC8yOTY3IDU3NjkvMTAyNjYvMjk2NyA1NjA4LzEwMjY3LzI5NjcKK2YgNTYwOC8xMDI2Ny8yOTY4IDU2MDcvMTAyNjUvMjk2OCA1NzY4LzEwMjY0LzI5NjgKK2YgNTc2OS8xMDI2OC8yOTY5IDU3NzAvMTAyNjkvMjk2OSA1NjA5LzEwMjcwLzI5NjkKK2YgNTYwOS8xMDI3MC8yOTcwIDU2MDgvMTAyNzEvMjk3MCA1NzY5LzEwMjY4LzI5NzAKK2YgNTc3MC8xMDI2OS8yOTcxIDU3NzEvMTAyNzIvMjk3MSA1NjEwLzEwMjczLzI5NzEKK2YgNTYxMC8xMDI3My8yOTcyIDU2MDkvMTAyNzAvMjk3MiA1NzcwLzEwMjY5LzI5NzIKK2YgNTc3MS8xMDI3Mi8yOTczIDU3NzIvMTAyNzQvMjk3MyA1NjExLzEwMjc1LzI5NzMKK2YgNTYxMS8xMDI3NS8yOTc0IDU2MTAvMTAyNzMvMjk3NCA1NzcxLzEwMjcyLzI5NzQKK2YgNTc5OC8xMDI3Ni8yOTc1IDU3OTcvMTAyNzcvMjk3NSA1NzkyLzEwMjc4LzI5NzUKK2YgNTc5Mi8xMDI3OC8yOTc2IDU3OTQvMTAyNzkvMjk3NiA1Nzk4LzEwMjc2LzI5NzYKK2YgNTc3NC8xMDI4MC8xMDQ0IDU3NjIvMTAyODEvMTA0NCA1NjAxLzEwMTA1LzEwNDQKK2YgNTYwMS8xMDEwNS8xMDQ0IDU2NTUvMTAxMDQvMTA0NCA1Nzc0LzEwMjgwLzEwNDQKK2YgNTc3NS8xMDI0Ny8xMDg4IDU3NzQvMTAyODAvMTA4OCA1NjU1LzEwMTA0LzEwODgKK2YgNTY1NS8xMDEwNC8xMDg4IDU2NTkvMTAyNDgvMTA4OCA1Nzc1LzEwMjQ3LzEwODgKK2YgNTc3Ni8xMDI4Mi8yNzYxIDU3ODAvMTAyODMvMjc2MSA1Njc5LzEwMjg0LzI3NjEKK2YgNTY3OS8xMDI4NC8yNjgwIDU2NjMvMTAyODUvMjY4MCA1Nzc2LzEwMjgyLzI2ODAKK2YgNTc3Ny8xMDI0My8yNjgxIDU3NzYvMTAyODIvMjY4MSA1NjYzLzEwMjg1LzI2ODEKK2YgNTY2My8xMDI4NS8yNjc0IDU2NjgvMTAyNDQvMjY3NCA1Nzc3LzEwMjQzLzI2NzQKK2YgNTc3OC8xMDI1MS8yOTc3IDU3ODEvMTAyODYvMjk3NyA1NjgxLzEwMTQwLzI5NzcKK2YgNTY4MS8xMDE0MC8yOTc4IDU2NzMvMTAwNjEvMjk3OCA1Nzc4LzEwMjUxLzI5NzgKK2YgNTc3OS8xMDI4Ny8yNjgxIDU3NjEvMTAyODgvMjY4MSA1NjAwLzEwMjg5LzI2ODEKK2YgNTYwMC8xMDI4OS8yNjc0IDU2NzcvMTAyOTAvMjY3NCA1Nzc5LzEwMjg3LzI2NzQKK2YgNTc4MC8xMDI4My8yOTc5IDU3NzkvMTAyODcvMjk3OSA1Njc3LzEwMjkwLzI5NzkKK2YgNTY3Ny8xMDI5MC8yOTgwIDU2NzkvMTAyODQvMjk4MCA1NzgwLzEwMjgzLzI5ODAKK2YgNTc4MS8xMDI4Ni8yOTgxIDU3NjMvMTAyOTEvMjk4MSA1NjAyLzEwMTQ4LzI5ODEKK2YgNTYwMi8xMDE0OC8yOTgyIDU2ODEvMTAxNDAvMjk4MiA1NzgxLzEwMjg2LzI5ODIKK2YgNTc4Mi8xMDI1My8yOTgzIDU3NjQvMTAyOTIvMjk4MyA1NjAzLzEwMTUxLzI5ODMKK2YgNTYwMy8xMDE1MS8yOTg0IDU2ODUvMTAwNjYvMjk4NCA1NzgyLzEwMjUzLzI5ODQKK2YgNTYxMi8xMDI5My8yOTg1IDU3OTcvMTAyNzcvMjk4NSA1Nzk4LzEwMjc2LzI5ODUKK2YgNTc5OC8xMDI3Ni8yOTg2IDU3NzMvMTAyOTQvMjk4NiA1NjEyLzEwMjkzLzI5ODYKK2YgNTI3NS85NjM5LzY4NyA1Nzg0Lzk0MTIvNjg3IDU3ODMvOTQxMS82ODcKK2YgNTc4My85NDExLzY4NyA1MjM3Lzk0MDgvNjg3IDUyNzUvOTYzOS82ODcKK2YgNTE0Ny85NTMxLzI5ODcgNTQzOS85NTMwLzI5ODcgNTc4Ni85NTY5LzI5ODcKK2YgNTc4Ni85NTY5LzI5ODggNTc4NS85NTY4LzI5ODggNTE0Ny85NTMxLzI5ODgKK2YgNTE3My85NTAxLzI5ODkgNTQyOC85NTAwLzI5ODkgNTc4OC85NjM4LzI5ODkKK2YgNTc4OC85NjM4LzI5OTAgNTc4Ny85NjM3LzI5OTAgNTE3My85NTAxLzI5OTAKK2YgNTM3NC85NzU4LzI5OTEgNTE0Ny85NTMxLzI5OTEgNTc4NS85NTY4LzI5OTEKK2YgNTc4NS85NTY4LzI5OTIgNTc4OS85NzYxLzI5OTIgNTM3NC85NzU4LzI5OTIKK2YgNTQzOS85ODM0LzY4NyA1MjM3Lzk0MDgvNjg3IDU3ODMvOTQxMS82ODcKK2YgNTc4My85NDExLzY4NyA1Nzg2Lzk4NTAvNjg3IDU0MzkvOTgzNC82ODcKK2YgNTQyOC85ODIyLzY4NyA1MjI2Lzk0MDkvNjg3IDU3ODQvOTQxMi82ODcKK2YgNTc4NC85NDEyLzY4NyA1Nzg4Lzk4NzMvNjg3IDU0MjgvOTgyMi82ODcKK2YgNTUyOS85OTMxLzI5OTMgNTE3My85NTAxLzI5OTMgNTc4Ny85NjM3LzI5OTMKK2YgNTc4Ny85NjM3LzI5OTQgNTc5MC85OTc4LzI5OTQgNTUyOS85OTMxLzI5OTQKK2YgNTc0NC8xMDA4OC8yOTk1IDU2MTEvMTAwODcvMjk5NSA1NzkyLzEwMDk0LzI5OTUKK2YgNTc5Mi8xMDA5NC8yOTk2IDU3OTEvMTAwOTMvMjk5NiA1NzQ0LzEwMDg4LzI5OTYKK2YgNTYxMS8xMDI3NS8yOTk3IDU3NzIvMTAyNzQvMjk5NyA1Nzk0LzEwMjc5LzI5OTcKK2YgNTc5NC8xMDI3OS8yOTk4IDU3OTIvMTAyNzgvMjk5OCA1NjExLzEwMjc1LzI5OTgKK2YgNTc5Ni8xMDA5Mi82ODcgNTc5NS8xMDE4MS82ODcgNTc5My8xMDIzOS82ODcKK2YgNTc5My8xMDIzOS82ODcgNTc5MS8xMDA5My82ODcgNTc5Ni8xMDA5Mi82ODcKK2YgNTc5NS8xMDE4MS82ODcgNTYyOS8xMDE4MC82ODcgNTc5My8xMDIzOS82ODcKK2YgNTY1NC8xMDE3My82ODcgNTc5My8xMDIzOS82ODcgNTYyOS8xMDE4MC82ODcKK2YgNTYyOS8xMDE4MC82ODcgNTYzMC8xMDE3NC82ODcgNTY1NC8xMDE3My82ODcKK2YgNTY3MC8xMDExOS8yOTk5IDU4MDAvMTAyMjgvMjk5OSA1Nzk5LzEwMjk1LzI5OTkKK2YgNTc5OS8xMDEzMi8zMDAwIDU3NTIvMTAxMTcvMzAwMCA1NjcwLzEwMTE2LzMwMDAKK2YgNTU5OC8xMDI5Ni8zMDAxIDU4MDAvMTAyMjgvMzAwMSA1ODAxLzEwMjI5LzMwMDEKK2YgNTgwMS8xMDIyOS8zMDAyIDU2OTUvMTAyOTcvMzAwMiA1NTk4LzEwMjk2LzMwMDIKK2YgNTc5OS8xMDEzMi8yOTU2IDU3MzEvMTAwNDkvMjk1NiA1NjkzLzEwMTMzLzI5NTYKK2YgNTczMS8xMDA0OS8yOTU2IDU3NTkvMTAwNTIvMjk1NiA1NjkzLzEwMTMzLzI5NTYKK2YgNTY4Ny8xMDE1NC8zMDAzIDU3NTgvMTAxNTMvMzAwMyA1ODAzLzEwMTM2LzMwMDMKK2YgNTgwMy8xMDEzNi8yOTA3IDU4MDIvMTAxMzUvMjkwNyA1Njg3LzEwMTU0LzI5MDcKK2YgNTgwNC8xMDEzNy82ODcgNTY5MC8xMDE1Ni82ODcgNTY4OS8xMDE1NS82ODcKK2YgNTY4OS8xMDE1NS82ODcgNTgwNS8xMDEzOC82ODcgNTgwNC8xMDEzNy82ODcKK2YgNTY5MC8xMDE1Ni82ODcgNTgwNC8xMDEzNy82ODcgNTgwNi8xMDEzOS82ODcKK2YgNTgwNi8xMDEzOS82ODcgNTY4OC8xMDE1Ny82ODcgNTY5MC8xMDE1Ni82ODcKK2YgNTY4Ny8xMDIzMC8xMDQzIDU4MDIvMTAyMzIvMTA0MyA1ODA3LzEwMjMzLzEwNDMKK2YgNTgwNy8xMDIzMy8xMDQzIDU3MTQvMTAyMzEvMTA0MyA1Njg3LzEwMjMwLzEwNDMKK2YgNTY4OC8xMDE1Ny82ODcgNTgwNi8xMDEzOS82ODcgNTgwMy8xMDEzNi82ODcKK2YgNTgwMy8xMDEzNi82ODcgNTc1OC8xMDE1My82ODcgNTY4OC8xMDE1Ny82ODcKK2YgNTY0Ni8xMDE1OS82ODcgNTY5MS8xMDEyNS82ODcgNTgwNS8xMDEzOC82ODcKK2YgNTczNy8xMDA3Ni8zMDA0IDU4MDkvMTAwNzAvMzAwNCA1ODA4LzEwMDY5LzMwMDQKK2YgNTgwOC8xMDA2OS8zMDA1IDU2MDQvMTAwNzMvMzAwNSA1NzM3LzEwMDc2LzMwMDUKK2YgNTY0Ny8xMDE2MC82ODcgNTgxMC8xMDE2My82ODcgNTgwOS8xMDA3MC82ODcKK2YgNTgwOS8xMDA3MC82ODcgNTczNy8xMDA3Ni82ODcgNTY0Ny8xMDE2MC82ODcKK2YgNTc2NC8xMDI5OC8zMDA2IDU4MTEvMTAyNTQvMzAwNiA1ODA4LzEwMjU3LzMwMDYKK2YgNTgwOC8xMDI1Ny8zMDA3IDU2MDMvMTAyOTkvMzAwNyA1NzY0LzEwMjk4LzMwMDcKK2YgNTY0MS8xMDIzNC82ODcgNTY5MS8xMDEyNS82ODcgNTY0Ni8xMDE1OS82ODcKK2YgNTY0Ni8xMDE1OS82ODcgNTgxMC8xMDE2My82ODcgNTY0MS8xMDIzNC82ODcKK2YgNTY0MC8xMDE2Mi82ODcgNTY0MS8xMDIzNC82ODcgNTgxMC8xMDE2My82ODcKK2YgNTUxOC85NzA5LzY4NyA1MzI1Lzk4NzQvNjg3IDUyNTMvOTY5Mi82ODcKK2YgNDk2MC8xMDMwMC8zMDA4IDQ5NjEvMTAzMDEvMzAwOCA0OTgyLzEwMzAyLzMwMDgKK2YgNDk4Mi8xMDMwMi8zMDA5IDQ5ODQvMTAzMDMvMzAwOSA0OTYwLzEwMzAwLzMwMDkKK2YgNTAxNS8xMDMwNC8zMDEwIDQ5NjcvMTAzMDUvMzAxMCA0OTY2LzEwMzA2LzMwMTAKK2YgNDk2Ni8xMDMwNi8zMDExIDUwMTQvMTAzMDcvMzAxMSA1MDE1LzEwMzA0LzMwMTEKK2YgNTAyOS8xMDMwOC8zMDEyIDQ5NjgvMTAzMDkvMzAxMiA0OTY3LzEwMzA1LzMwMTIKK2YgNDk2Ny8xMDMwNS8zMDEzIDUwMTUvMTAzMDQvMzAxMyA1MDI5LzEwMzA4LzMwMTMKK2YgNTAyOC8xMDMxMC8zMDE0IDQ5NjkvMTAzMTEvMzAxNCA0OTY4LzEwMzA5LzMwMTQKK2YgNDk2OC8xMDMwOS8zMDE1IDUwMjkvMTAzMDgvMzAxNSA1MDI4LzEwMzEwLzMwMTUKK2YgNTAyNy8xMDMxMi8zMDE2IDQ5NzAvMTAzMTMvMzAxNiA0OTY5LzEwMzExLzMwMTYKK2YgNDk2OS8xMDMxMS8zMDE3IDUwMjgvMTAzMTAvMzAxNyA1MDI3LzEwMzEyLzMwMTcKK2YgNTAyNy8xMDMxMi8zMDE4IDUwMjYvMTAzMTQvMzAxOCA0OTcxLzEwMzE1LzMwMTgKK2YgNDk3MS8xMDMxNS8zMDE5IDQ5NzAvMTAzMTMvMzAxOSA1MDI3LzEwMzEyLzMwMTkKK2YgNTAyNi8xMDMxNC8zMDIwIDUwMjUvMTAzMTYvMzAyMCA0OTcyLzEwMzE3LzMwMjAKK2YgNDk3Mi8xMDMxNy8zMDIxIDQ5NzEvMTAzMTUvMzAyMSA1MDI2LzEwMzE0LzMwMjEKK2YgNTAyNC8xMDMxOC8zMDIyIDQ5NzMvMTAzMTkvMzAyMiA0OTcyLzEwMzE3LzMwMjIKK2YgNDk3Mi8xMDMxNy8zMDIzIDUwMjUvMTAzMTYvMzAyMyA1MDI0LzEwMzE4LzMwMjMKK2YgNTAyMy8xMDMyMC8zMDI0IDQ5NzQvMTAzMjEvMzAyNCA0OTczLzEwMzE5LzMwMjQKK2YgNDk3My8xMDMxOS8zMDI1IDUwMjQvMTAzMTgvMzAyNSA1MDIzLzEwMzIwLzMwMjUKK2YgNTAyMi8xMDMyMi8zMDI2IDQ5NzUvMTAzMjMvMzAyNiA0OTc0LzEwMzIxLzMwMjYKK2YgNDk3NC8xMDMyMS8zMDI3IDUwMjMvMTAzMjAvMzAyNyA1MDIyLzEwMzIyLzMwMjcKK2YgNTAyMS8xMDMyNC8zMDI4IDQ5NzYvMTAzMjUvMzAyOCA0OTc1LzEwMzIzLzMwMjgKK2YgNDk3NS8xMDMyMy8zMDI5IDUwMjIvMTAzMjIvMzAyOSA1MDIxLzEwMzI0LzMwMjkKK2YgNTAyMC8xMDMyNi8zMDMwIDQ5NzcvMTAzMjcvMzAzMCA0OTc2LzEwMzI1LzMwMzAKK2YgNDk3Ni8xMDMyNS8zMDMxIDUwMjEvMTAzMjQvMzAzMSA1MDIwLzEwMzI2LzMwMzEKK2YgNTAxOS8xMDMyOC8zMDMyIDQ5NzgvMTAzMjkvMzAzMiA0OTc3LzEwMzI3LzMwMzIKK2YgNDk3Ny8xMDMyNy8zMDMyIDUwMjAvMTAzMjYvMzAzMiA1MDE5LzEwMzI4LzMwMzIKK2YgNTAxOS8xMDMyOC8zMDMzIDUwMTgvMTAzMzAvMzAzMyA0OTc5LzEwMzMxLzMwMzMKK2YgNDk3OS8xMDMzMS8zMDM0IDQ5NzgvMTAzMjkvMzAzNCA1MDE5LzEwMzI4LzMwMzQKK2YgNTAxOC8xMDMzMC8zMDM1IDUwMTcvMTAzMzIvMzAzNSA0OTgwLzEwMzMzLzMwMzUKK2YgNDk4MC8xMDMzMy8zMDM2IDQ5NzkvMTAzMzEvMzAzNiA1MDE4LzEwMzMwLzMwMzYKK2YgNTAxNi8xMDMzNC8zMDM3IDQ5ODEvMTAzMzUvMzAzNyA0OTgwLzEwMzMzLzMwMzcKK2YgNDk4MC8xMDMzMy8zMDM4IDUwMTcvMTAzMzIvMzAzOCA1MDE2LzEwMzM0LzMwMzgKK2YgNTAxNi8xMDMzNC8zMDM5IDUwMTQvMTAzMDcvMzAzOSA0OTY2LzEwMzA2LzMwMzkKK2YgNDk2Ni8xMDMwNi8zMDQwIDQ5ODEvMTAzMzUvMzA0MCA1MDE2LzEwMzM0LzMwNDAKK2YgNDk2Ny8xMDMwNS8zMDQxIDUwMDAvMTAzMzYvMzA0MSA0OTk4LzEwMzM3LzMwNDEKK2YgNDk5OC8xMDMzNy8zMDQyIDQ5NjYvMTAzMDYvMzA0MiA0OTY3LzEwMzA1LzMwNDIKK2YgNDk2Ny8xMDMwNS8zMDQzIDQ5NjgvMTAzMDkvMzA0MyA1MDAxLzEwMzM4LzMwNDMKK2YgNTAwMS8xMDMzOC8zMDQ0IDUwMDAvMTAzMzYvMzA0NCA0OTY3LzEwMzA1LzMwNDQKK2YgNDk2OC8xMDMwOS8zMDQ1IDQ5NjkvMTAzMTEvMzA0NSA1MDAyLzEwMzM5LzMwNDUKK2YgNTAwMi8xMDMzOS8zMDQ2IDUwMDEvMTAzMzgvMzA0NiA0OTY4LzEwMzA5LzMwNDYKK2YgNDk3MC8xMDMxMy8zMDQ3IDUwMDMvMTAzNDAvMzA0NyA1MDAyLzEwMzM5LzMwNDcKK2YgNTAwMi8xMDMzOS8zMDQ4IDQ5NjkvMTAzMTEvMzA0OCA0OTcwLzEwMzEzLzMwNDgKK2YgNDk3MS8xMDMxNS8zMDQ5IDUwMDQvMTAzNDEvMzA0OSA1MDAzLzEwMzQwLzMwNDkKK2YgNTAwMy8xMDM0MC8zMDQ5IDQ5NzAvMTAzMTMvMzA0OSA0OTcxLzEwMzE1LzMwNDkKK2YgNDk3Mi8xMDMxNy8zMDUwIDUwMDUvMTAzNDIvMzA1MCA1MDA0LzEwMzQxLzMwNTAKK2YgNTAwNC8xMDM0MS8zMDUxIDQ5NzEvMTAzMTUvMzA1MSA0OTcyLzEwMzE3LzMwNTEKK2YgNDk3My8xMDMxOS8zMDUyIDUwMDYvMTAzNDMvMzA1MiA1MDA1LzEwMzQyLzMwNTIKK2YgNTAwNS8xMDM0Mi8zMDUzIDQ5NzIvMTAzMTcvMzA1MyA0OTczLzEwMzE5LzMwNTMKK2YgNDk3NC8xMDMyMS8zMDU0IDUwMDcvMTAzNDQvMzA1NCA1MDA2LzEwMzQzLzMwNTQKK2YgNTAwNi8xMDM0My8zMDU1IDQ5NzMvMTAzMTkvMzA1NSA0OTc0LzEwMzIxLzMwNTUKK2YgNDk3NC8xMDMyMS8zMDU2IDQ5NzUvMTAzMjMvMzA1NiA1MDA4LzEwMzQ1LzMwNTYKK2YgNTAwOC8xMDM0NS8zMDU3IDUwMDcvMTAzNDQvMzA1NyA0OTc0LzEwMzIxLzMwNTcKK2YgNDk3NS8xMDMyMy8zMDU4IDQ5NzYvMTAzMjUvMzA1OCA1MDA5LzEwMzQ2LzMwNTgKK2YgNTAwOS8xMDM0Ni8zMDU5IDUwMDgvMTAzNDUvMzA1OSA0OTc1LzEwMzIzLzMwNTkKK2YgNDk3Ni8xMDMyNS8zMDYwIDQ5NzcvMTAzMjcvMzA2MCA1MDEwLzEwMzQ3LzMwNjAKK2YgNTAxMC8xMDM0Ny8zMDYxIDUwMDkvMTAzNDYvMzA2MSA0OTc2LzEwMzI1LzMwNjEKK2YgNDk3OC8xMDMyOS8zMDYyIDUwMTEvMTAzNDgvMzA2MiA1MDEwLzEwMzQ3LzMwNjIKK2YgNTAxMC8xMDM0Ny8zMDYyIDQ5NzcvMTAzMjcvMzA2MiA0OTc4LzEwMzI5LzMwNjIKK2YgNDk3OS8xMDMzMS8zMDYyIDUwMTIvMTAzNDkvMzA2MiA1MDExLzEwMzQ4LzMwNjIKK2YgNTAxMS8xMDM0OC8zMDYyIDQ5NzgvMTAzMjkvMzA2MiA0OTc5LzEwMzMxLzMwNjIKK2YgNDk4MC8xMDMzMy8zMDYzIDUwMTMvMTAzNTAvMzA2MyA1MDEyLzEwMzQ5LzMwNjMKK2YgNTAxMi8xMDM0OS8zMDY0IDQ5NzkvMTAzMzEvMzA2NCA0OTgwLzEwMzMzLzMwNjQKK2YgNDk4MS8xMDMzNS8zMDY1IDQ5OTkvMTAzNTEvMzA2NSA1MDEzLzEwMzUwLzMwNjUKK2YgNTAxMy8xMDM1MC8zMDY2IDQ5ODAvMTAzMzMvMzA2NiA0OTgxLzEwMzM1LzMwNjYKK2YgNDk2Ni8xMDMwNi8zMDY3IDQ5OTgvMTAzMzcvMzA2NyA0OTk5LzEwMzUxLzMwNjcKK2YgNDk5OS8xMDM1MS8zMDY4IDQ5ODEvMTAzMzUvMzA2OCA0OTY2LzEwMzA2LzMwNjgKK2YgNDk4My8xMDM1Mi8zMDY5IDQ5ODIvMTAzMDIvMzA2OSA0OTYxLzEwMzAxLzMwNjkKK2YgNDk2MS8xMDMwMS8zMDcwIDQ5NjIvMTAzNTMvMzA3MCA0OTgzLzEwMzUyLzMwNzAKK2YgNDk5Ny8xMDM1NC8zMDcxIDQ5ODMvMTAzNTIvMzA3MSA0OTYyLzEwMzUzLzMwNzEKK2YgNDk2Mi8xMDM1My8zMDcyIDQ5OTYvMTAzNTUvMzA3MiA0OTk3LzEwMzU0LzMwNzIKK2YgNDk4NS8xMDM1Ni8zMDczIDQ5ODYvMTAzNTcvMzA3MyA0OTYwLzEwMzAwLzMwNzMKK2YgNDk2MC8xMDMwMC8zMDc0IDQ5ODQvMTAzMDMvMzA3NCA0OTg1LzEwMzU2LzMwNzQKK2YgNDk4Ny8xMDM1OC8zMDc1IDQ5ODgvMTAzNTkvMzA3NSA0OTYzLzEwMzYwLzMwNzUKK2YgNDk2My8xMDM2MC8zMDc1IDQ5NTcvMTAzNjEvMzA3NSA0OTg3LzEwMzU4LzMwNzUKK2YgNDk2My8xMDM2MC82ODcgNDk2NC8xMDM2Mi82ODcgNDk1OC8xMDM2My82ODcKK2YgNDk1OC8xMDM2My82ODcgNDk1Ny8xMDM2MS82ODcgNDk2My8xMDM2MC82ODcKK2YgNDk2NC8xMDM2Mi82ODcgNDk2NS8xMDM2NC82ODcgNDk1OS8xMDM2NS82ODcKK2YgNDk1OS8xMDM2NS82ODcgNDk1OC8xMDM2My82ODcgNDk2NC8xMDM2Mi82ODcKK2YgNDk2NS8xMDM2NC8zMDc2IDQ5OTQvMTAzNjYvMzA3NiA0OTk1LzEwMzY3LzMwNzYKK2YgNDk5NS8xMDM2Ny8zMDc3IDQ5NTkvMTAzNjUvMzA3NyA0OTY1LzEwMzY0LzMwNzcKK2YgNDk4Ny8xMDM1OC8zMDc1IDQ5NTcvMTAzNjEvMzA3NSA0OTYwLzEwMzAwLzMwNzUKK2YgNDk2MC8xMDMwMC8zMDc4IDQ5ODYvMTAzNTcvMzA3OCA0OTg3LzEwMzU4LzMwNzgKK2YgNDk1Ny8xMDM2MS82ODcgNDk1OC8xMDM2My82ODcgNDk2MS8xMDMwMS82ODcKK2YgNDk2MS8xMDMwMS82ODcgNDk2MC8xMDMwMC82ODcgNDk1Ny8xMDM2MS82ODcKK2YgNDk1OC8xMDM2My82ODcgNDk1OS8xMDM2NS82ODcgNDk2Mi8xMDM1My82ODcKK2YgNDk2Mi8xMDM1My82ODcgNDk2MS8xMDMwMS82ODcgNDk1OC8xMDM2My82ODcKK2YgNDk2Mi8xMDM1My8zMDc3IDQ5NTkvMTAzNjUvMzA3NyA0OTk1LzEwMzY3LzMwNzcKK2YgNDk5NS8xMDM2Ny8zMDc3IDQ5OTYvMTAzNTUvMzA3NyA0OTYyLzEwMzUzLzMwNzcKK2YgNDk4OS8xMDM2OC8zMDc5IDQ5OTAvMTAzNjkvMzA3OSA0OTYzLzEwMzYwLzMwNzkKK2YgNDk2My8xMDM2MC8zMDgwIDQ5ODgvMTAzNTkvMzA4MCA0OTg5LzEwMzY4LzMwODAKK2YgNDk5MC8xMDM2OS8zMDgxIDQ5OTEvMTAzNzAvMzA4MSA0OTY0LzEwMzYyLzMwODEKK2YgNDk2NC8xMDM2Mi8zMDgyIDQ5NjMvMTAzNjAvMzA4MiA0OTkwLzEwMzY5LzMwODIKK2YgNDk2NC8xMDM2Mi8zMDgzIDQ5OTEvMTAzNzAvMzA4MyA0OTkyLzEwMzcxLzMwODMKK2YgNDk5Mi8xMDM3MS8zMDg0IDQ5NjUvMTAzNjQvMzA4NCA0OTY0LzEwMzYyLzMwODQKK2YgNDk2NS8xMDM2NC8zMDg1IDQ5OTIvMTAzNzEvMzA4NSA0OTkzLzEwMzcyLzMwODUKK2YgNDk5My8xMDM3Mi8zMDg2IDQ5OTQvMTAzNjYvMzA4NiA0OTY1LzEwMzY0LzMwODYKK2YgNDk4NC8xMDMwMy8zMDg3IDQ5ODIvMTAzMDIvMzA4NyA0OTk4LzEwMzM3LzMwODcKK2YgNDk5OC8xMDMzNy8zMDg4IDUwMDAvMTAzMzYvMzA4OCA0OTg0LzEwMzAzLzMwODgKK2YgNDk4NS8xMDM1Ni8zMDg5IDQ5ODQvMTAzMDMvMzA4OSA1MDAwLzEwMzM2LzMwODkKK2YgNTAwMC8xMDMzNi8zMDkwIDUwMDEvMTAzMzgvMzA5MCA0OTg1LzEwMzU2LzMwOTAKK2YgNDk4Ni8xMDM1Ny8zMDkxIDQ5ODUvMTAzNTYvMzA5MSA1MDAxLzEwMzM4LzMwOTEKK2YgNTAwMS8xMDMzOC8zMDkyIDUwMDIvMTAzMzkvMzA5MiA0OTg2LzEwMzU3LzMwOTIKK2YgNTAwMy8xMDM0MC8zMDkzIDQ5ODcvMTAzNTgvMzA5MyA0OTg2LzEwMzU3LzMwOTMKK2YgNDk4Ni8xMDM1Ny8zMDkzIDUwMDIvMTAzMzkvMzA5MyA1MDAzLzEwMzQwLzMwOTMKK2YgNDk4OC8xMDM1OS8zMDkzIDQ5ODcvMTAzNTgvMzA5MyA1MDAzLzEwMzQwLzMwOTMKK2YgNTAwMy8xMDM0MC8zMDkzIDUwMDQvMTAzNDEvMzA5MyA0OTg4LzEwMzU5LzMwOTMKK2YgNTAwNS8xMDM0Mi8zMDk0IDQ5ODkvMTAzNjgvMzA5NCA0OTg4LzEwMzU5LzMwOTQKK2YgNDk4OC8xMDM1OS8zMDk1IDUwMDQvMTAzNDEvMzA5NSA1MDA1LzEwMzQyLzMwOTUKK2YgNTAwNi8xMDM0My8zMDk2IDQ5OTAvMTAzNjkvMzA5NiA0OTg5LzEwMzY4LzMwOTYKK2YgNDk4OS8xMDM2OC8zMDk3IDUwMDUvMTAzNDIvMzA5NyA1MDA2LzEwMzQzLzMwOTcKK2YgNTAwNy8xMDM0NC8zMDk4IDQ5OTEvMTAzNzAvMzA5OCA0OTkwLzEwMzY5LzMwOTgKK2YgNDk5MC8xMDM2OS8zMDk5IDUwMDYvMTAzNDMvMzA5OSA1MDA3LzEwMzQ0LzMwOTkKK2YgNDk5Mi8xMDM3MS8zMTAwIDQ5OTEvMTAzNzAvMzEwMCA1MDA3LzEwMzQ0LzMxMDAKK2YgNTAwNy8xMDM0NC8zMTAxIDUwMDgvMTAzNDUvMzEwMSA0OTkyLzEwMzcxLzMxMDEKK2YgNDk5My8xMDM3Mi8zMTAyIDQ5OTIvMTAzNzEvMzEwMiA1MDA4LzEwMzQ1LzMxMDIKK2YgNTAwOC8xMDM0NS8zMTAzIDUwMDkvMTAzNDYvMzEwMyA0OTkzLzEwMzcyLzMxMDMKK2YgNDk5NC8xMDM2Ni8zMTA0IDQ5OTMvMTAzNzIvMzEwNCA1MDA5LzEwMzQ2LzMxMDQKK2YgNTAwOS8xMDM0Ni8zMTA1IDUwMTAvMTAzNDcvMzEwNSA0OTk0LzEwMzY2LzMxMDUKK2YgNDk5NS8xMDM2Ny8zMTA2IDQ5OTQvMTAzNjYvMzEwNiA1MDEwLzEwMzQ3LzMxMDYKK2YgNTAxMC8xMDM0Ny8zMTA2IDUwMTEvMTAzNDgvMzEwNiA0OTk1LzEwMzY3LzMxMDYKK2YgNDk5Ni8xMDM1NS8zMTA2IDQ5OTUvMTAzNjcvMzEwNiA1MDExLzEwMzQ4LzMxMDYKK2YgNTAxMS8xMDM0OC8zMTA2IDUwMTIvMTAzNDkvMzEwNiA0OTk2LzEwMzU1LzMxMDYKK2YgNTAxMy8xMDM1MC8zMTA3IDQ5OTcvMTAzNTQvMzEwNyA0OTk2LzEwMzU1LzMxMDcKK2YgNDk5Ni8xMDM1NS8zMTA4IDUwMTIvMTAzNDkvMzEwOCA1MDEzLzEwMzUwLzMxMDgKK2YgNDk5OS8xMDM1MS8zMTA5IDQ5ODMvMTAzNTIvMzEwOSA0OTk3LzEwMzU0LzMxMDkKK2YgNDk5Ny8xMDM1NC8zMTEwIDUwMTMvMTAzNTAvMzExMCA0OTk5LzEwMzUxLzMxMTAKK2YgNDk4Mi8xMDMwMi8zMTExIDQ5ODMvMTAzNTIvMzExMSA0OTk5LzEwMzUxLzMxMTEKK2YgNDk5OS8xMDM1MS8zMTEyIDQ5OTgvMTAzMzcvMzExMiA0OTgyLzEwMzAyLzMxMTIKK2YgNTkwMS8xMDM3My82ODcgNTg5OS8xMDM3NC82ODcgNTg5OC8xMDM3NS82ODcKK2YgNTg5OC8xMDM3NS82ODcgNTkwMC8xMDM3Ni82ODcgNTkwMS8xMDM3My82ODcKK2YgNTkwMy8xMDM3Ny82ODcgNTkwMS8xMDM3My82ODcgNTkwMC8xMDM3Ni82ODcKK2YgNTkwMC8xMDM3Ni82ODcgNTkwMi8xMDM3OC82ODcgNTkwMy8xMDM3Ny82ODcKK2YgNTkwNS8xMDM3OS82ODcgNTkwMy8xMDM3Ny82ODcgNTkwMi8xMDM3OC82ODcKK2YgNTkwMi8xMDM3OC82ODcgNTkwNC8xMDM4MC82ODcgNTkwNS8xMDM3OS82ODcKK2YgNTkwNy8xMDM4MS82ODcgNTkwNS8xMDM3OS82ODcgNTkwNC8xMDM4MC82ODcKK2YgNTkwNC8xMDM4MC82ODcgNTkwNi8xMDM4Mi82ODcgNTkwNy8xMDM4MS82ODcKK2YgNTkwOS8xMDM4My82ODcgNTkwNy8xMDM4MS82ODcgNTkwNi8xMDM4Mi82ODcKK2YgNTkwNi8xMDM4Mi82ODcgNTkwOC8xMDM4NC82ODcgNTkwOS8xMDM4My82ODcKK2YgNTkxMS8xMDM4NS82ODcgNTkwOS8xMDM4My82ODcgNTkwOC8xMDM4NC82ODcKK2YgNTkwOC8xMDM4NC82ODcgNTkxMC8xMDM4Ni82ODcgNTkxMS8xMDM4NS82ODcKK2YgNTkxMy8xMDM4Ny82ODcgNTkxMS8xMDM4NS82ODcgNTkxMC8xMDM4Ni82ODcKK2YgNTkxMC8xMDM4Ni82ODcgNTkxMi8xMDM4OC82ODcgNTkxMy8xMDM4Ny82ODcKK2YgNTkxNS8xMDM4OS82ODcgNTkxMy8xMDM4Ny82ODcgNTkxMi8xMDM4OC82ODcKK2YgNTkxMi8xMDM4OC82ODcgNTkxNC8xMDM5MC82ODcgNTkxNS8xMDM4OS82ODcKK2YgNTkxNy8xMDM5MS82ODcgNTkxNS8xMDM4OS82ODcgNTkxNC8xMDM5MC82ODcKK2YgNTkxNC8xMDM5MC82ODcgNTkxNi8xMDM5Mi82ODcgNTkxNy8xMDM5MS82ODcKK2YgNTkxOS8xMDM5My82ODcgNTkxNy8xMDM5MS82ODcgNTkxNi8xMDM5Mi82ODcKK2YgNTkxNi8xMDM5Mi82ODcgNTkxOC8xMDM5NC82ODcgNTkxOS8xMDM5My82ODcKK2YgNTkyMS8xMDM5NS82ODcgNTkxOS8xMDM5My82ODcgNTkxOC8xMDM5NC82ODcKK2YgNTkxOC8xMDM5NC82ODcgNTkyMC8xMDM5Ni82ODcgNTkyMS8xMDM5NS82ODcKK2YgNTg5OS8xMDM3NC82ODcgNTkyMS8xMDM5NS82ODcgNTkyMC8xMDM5Ni82ODcKK2YgNTkyMC8xMDM5Ni82ODcgNTg5OC8xMDM3NS82ODcgNTg5OS8xMDM3NC82ODcKK2YgNTg4Ny8xMDM5Ny8zMTEzIDU4ODYvMTAzOTgvMzExMyA1ODk5LzEwMzc0LzMxMTMKK2YgNTg5OS8xMDM3NC8zMTEzIDU5MDEvMTAzNzMvMzExMyA1ODg3LzEwMzk3LzMxMTMKK2YgNTg3Ny8xMDM5OS8zMTE0IDU4NzYvMTA0MDAvMzExNCA1OTAwLzEwMzc2LzMxMTQKK2YgNTkwMC8xMDM3Ni8zMTE0IDU4OTgvMTAzNzUvMzExNCA1ODc3LzEwMzk5LzMxMTQKK2YgNTg4OC8xMDQwMS8zMTE1IDU4ODcvMTAzOTcvMzExNSA1OTAxLzEwMzczLzMxMTUKK2YgNTkwMS8xMDM3My8zMTE1IDU5MDMvMTAzNzcvMzExNSA1ODg4LzEwNDAxLzMxMTUKK2YgNTg3Ni8xMDQwMC8zMTE2IDU4NzUvMTA0MDIvMzExNiA1OTAyLzEwMzc4LzMxMTYKK2YgNTkwMi8xMDM3OC8zMTE2IDU5MDAvMTAzNzYvMzExNiA1ODc2LzEwNDAwLzMxMTYKK2YgNTg4OS8xMDQwMy8zMTE3IDU4ODgvMTA0MDEvMzExNyA1OTAzLzEwMzc3LzMxMTcKK2YgNTkwMy8xMDM3Ny8zMTE3IDU5MDUvMTAzNzkvMzExNyA1ODg5LzEwNDAzLzMxMTcKK2YgNTg3NS8xMDQwMi8zMTE4IDU4NzQvMTA0MDQvMzExOCA1OTA0LzEwMzgwLzMxMTgKK2YgNTkwNC8xMDM4MC8zMTE4IDU5MDIvMTAzNzgvMzExOCA1ODc1LzEwNDAyLzMxMTgKK2YgNTg5MC8xMDQwNS8zMTE5IDU4ODkvMTA0MDMvMzExOSA1OTA1LzEwMzc5LzMxMTkKK2YgNTkwNS8xMDM3OS8zMTE5IDU5MDcvMTAzODEvMzExOSA1ODkwLzEwNDA1LzMxMTkKK2YgNTg3NC8xMDQwNC8zMTIwIDU4ODUvMTA0MDYvMzEyMCA1OTA2LzEwMzgyLzMxMjAKK2YgNTkwNi8xMDM4Mi8zMTIwIDU5MDQvMTAzODAvMzEyMCA1ODc0LzEwNDA0LzMxMjAKK2YgNTg5MS8xMDQwNy8zMTIxIDU4OTAvMTA0MDUvMzEyMSA1OTA3LzEwMzgxLzMxMjEKK2YgNTkwNy8xMDM4MS8zMTIxIDU5MDkvMTAzODMvMzEyMSA1ODkxLzEwNDA3LzMxMjEKK2YgNTg4NS8xMDQwNi8zMTIyIDU4ODQvMTA0MDgvMzEyMiA1OTA4LzEwMzg0LzMxMjIKK2YgNTkwOC8xMDM4NC8zMTIyIDU5MDYvMTAzODIvMzEyMiA1ODg1LzEwNDA2LzMxMjIKK2YgNTg5Mi8xMDQwOS8zMTIzIDU4OTEvMTA0MDcvMzEyMyA1OTA5LzEwMzgzLzMxMjMKK2YgNTkwOS8xMDM4My8zMTIzIDU5MTEvMTAzODUvMzEyMyA1ODkyLzEwNDA5LzMxMjMKK2YgNTg4NC8xMDQwOC8zMTI0IDU4ODMvMTA0MTAvMzEyNCA1OTEwLzEwMzg2LzMxMjQKK2YgNTkxMC8xMDM4Ni8zMTI0IDU5MDgvMTAzODQvMzEyNCA1ODg0LzEwNDA4LzMxMjQKK2YgNTg5My8xMDQxMS8zMTI1IDU4OTIvMTA0MDkvMzEyNSA1OTExLzEwMzg1LzMxMjUKK2YgNTkxMS8xMDM4NS8zMTI1IDU5MTMvMTAzODcvMzEyNSA1ODkzLzEwNDExLzMxMjUKK2YgNTg4My8xMDQxMC8zMTI2IDU4ODIvMTA0MTIvMzEyNiA1OTEyLzEwMzg4LzMxMjYKK2YgNTkxMi8xMDM4OC8zMTI3IDU5MTAvMTAzODYvMzEyNyA1ODgzLzEwNDEwLzMxMjcKK2YgNTg5NC8xMDQxMy8zMTI4IDU4OTMvMTA0MTEvMzEyOCA1OTEzLzEwMzg3LzMxMjgKK2YgNTkxMy8xMDM4Ny8zMTI4IDU5MTUvMTAzODkvMzEyOCA1ODk0LzEwNDEzLzMxMjgKK2YgNTg4Mi8xMDQxMi8zMTI5IDU4ODEvMTA0MTQvMzEyOSA1OTE0LzEwMzkwLzMxMjkKK2YgNTkxNC8xMDM5MC8zMTI5IDU5MTIvMTAzODgvMzEyOSA1ODgyLzEwNDEyLzMxMjkKK2YgNTg5NS8xMDQxNS8zMTMwIDU4OTQvMTA0MTMvMzEzMCA1OTE1LzEwMzg5LzMxMzAKK2YgNTkxNS8xMDM4OS8zMTMwIDU5MTcvMTAzOTEvMzEzMCA1ODk1LzEwNDE1LzMxMzAKK2YgNTg4MS8xMDQxNC8zMTMxIDU4ODAvMTA0MTYvMzEzMSA1OTE2LzEwMzkyLzMxMzEKK2YgNTkxNi8xMDM5Mi8zMTMxIDU5MTQvMTAzOTAvMzEzMSA1ODgxLzEwNDE0LzMxMzEKK2YgNTg5Ni8xMDQxNy8zMTMyIDU4OTUvMTA0MTUvMzEzMiA1OTE3LzEwMzkxLzMxMzIKK2YgNTkxNy8xMDM5MS8zMTMyIDU5MTkvMTAzOTMvMzEzMiA1ODk2LzEwNDE3LzMxMzIKK2YgNTg4MC8xMDQxNi8zMTMzIDU4NzkvMTA0MTgvMzEzMyA1OTE4LzEwMzk0LzMxMzMKK2YgNTkxOC8xMDM5NC8zMTMzIDU5MTYvMTAzOTIvMzEzMyA1ODgwLzEwNDE2LzMxMzMKK2YgNTg5Ny8xMDQxOS8zMTM0IDU4OTYvMTA0MTcvMzEzNCA1OTE5LzEwMzkzLzMxMzQKK2YgNTkxOS8xMDM5My8zMTM1IDU5MjEvMTAzOTUvMzEzNSA1ODk3LzEwNDE5LzMxMzUKK2YgNTg3OS8xMDQxOC8zMTM2IDU4NzgvMTA0MjAvMzEzNiA1OTIwLzEwMzk2LzMxMzYKK2YgNTkyMC8xMDM5Ni8zMTM2IDU5MTgvMTAzOTQvMzEzNiA1ODc5LzEwNDE4LzMxMzYKK2YgNTg4Ni8xMDM5OC8zMTM3IDU4OTcvMTA0MTkvMzEzNyA1OTIxLzEwMzk1LzMxMzcKK2YgNTkyMS8xMDM5NS8zMTM3IDU4OTkvMTAzNzQvMzEzNyA1ODg2LzEwMzk4LzMxMzcKK2YgNTg3OC8xMDQyMC8zMTM4IDU4NzcvMTAzOTkvMzEzOCA1ODk4LzEwMzc1LzMxMzgKK2YgNTg5OC8xMDM3NS8zMTM4IDU5MjAvMTAzOTYvMzEzOCA1ODc4LzEwNDIwLzMxMzgKK2YgNTg3Ni8xMDQyMS8zMTM5IDU4NzcvMTA0MjIvMzEzOSA1OTI1LzEwNDIzLzMxMzkKK2YgNTkyNS8xMDQyMy8zMTM5IDU5MjQvMTA0MjQvMzEzOSA1ODc2LzEwNDIxLzMxMzkKK2YgNTg3Ny8xMDQyMi8zMTQwIDU4NzgvMTA0MjUvMzE0MCA1OTI2LzEwNDI2LzMxNDAKK2YgNTkyNi8xMDQyNi8zMTQwIDU5MjUvMTA0MjMvMzE0MCA1ODc3LzEwNDIyLzMxNDAKK2YgNTg3NS8xMDQyNy8zMTQxIDU4NzYvMTA0MjEvMzE0MSA1OTI0LzEwNDI0LzMxNDEKK2YgNTkyNC8xMDQyNC8zMTQxIDU5MjMvMTA0MjgvMzE0MSA1ODc1LzEwNDI3LzMxNDEKK2YgNTg3NC8xMDQyOS8zMTQyIDU4NzUvMTA0MzAvMzE0MiA1OTIzLzEwNDMxLzMxNDIKK2YgNTkyMy8xMDQzMS8zMTQyIDU5MjIvMTA0MzIvMzE0MiA1ODc0LzEwNDI5LzMxNDIKK2YgNTg4NS8xMDQzMy8zMTQzIDU4NzQvMTA0MjkvMzE0MyA1OTIyLzEwNDMyLzMxNDMKK2YgNTkyMi8xMDQzMi8zMTQzIDU5MzMvMTA0MzQvMzE0MyA1ODg1LzEwNDMzLzMxNDMKK2YgNTg4NC8xMDQzNS8zMTQ0IDU4ODUvMTA0MzMvMzE0NCA1OTMzLzEwNDM0LzMxNDQKK2YgNTkzMy8xMDQzNC8zMTQ0IDU5MzIvMTA0MzYvMzE0NCA1ODg0LzEwNDM1LzMxNDQKK2YgNTg4My8xMDQzNy8zMTQ1IDU4ODQvMTA0MzgvMzE0NSA1OTMyLzEwNDM5LzMxNDUKK2YgNTkzMi8xMDQzOS8zMTQ1IDU5MzEvMTA0NDAvMzE0NSA1ODgzLzEwNDM3LzMxNDUKK2YgNTg4Mi8xMDQ0MS8zMTQ2IDU4ODMvMTA0MzcvMzE0NiA1OTMxLzEwNDQwLzMxNDYKK2YgNTkzMS8xMDQ0MC8zMTQ2IDU5MzAvMTA0NDIvMzE0NiA1ODgyLzEwNDQxLzMxNDYKK2YgNTg4MS8xMDQ0My8zMTQ3IDU4ODIvMTA0NDQvMzE0NyA1OTMwLzEwNDQ1LzMxNDcKK2YgNTkzMC8xMDQ0NS8zMTQ3IDU5MjkvMTA0NDYvMzE0NyA1ODgxLzEwNDQzLzMxNDcKK2YgNTg4MC8xMDQ0Ny8zMTQ4IDU4ODEvMTA0NDMvMzE0OCA1OTI5LzEwNDQ2LzMxNDgKK2YgNTkyOS8xMDQ0Ni8zMTQ4IDU5MjgvMTA0NDgvMzE0OCA1ODgwLzEwNDQ3LzMxNDgKK2YgNTg3OS8xMDQ0OS8yMzUxIDU4ODAvMTA0NDcvMjM1MSA1OTI4LzEwNDQ4LzIzNTEKK2YgNTkyOC8xMDQ0OC8yMzUxIDU5MjcvMTA0NTAvMjM1MSA1ODc5LzEwNDQ5LzIzNTEKK2YgNTg3OC8xMDQyNS8zMTQ5IDU4NzkvMTA0NTEvMzE0OSA1OTI3LzEwNDUyLzMxNDkKK2YgNTkyNy8xMDQ1Mi8zMTQ5IDU5MjYvMTA0MjYvMzE0OSA1ODc4LzEwNDI1LzMxNDkKK2YgNTg4Ni8xMDQ1My8zMTQ2IDU4ODcvMTA0NTQvMzE0NiA1OTM1LzEwNDU1LzMxNDYKK2YgNTkzNS8xMDQ1NS8zMTQ2IDU5MzQvMTA0NTYvMzE0NiA1ODg2LzEwNDUzLzMxNDYKK2YgNTg4Ny8xMDQ1Ny8zMTQ3IDU4ODgvMTA0NTgvMzE0NyA1OTM2LzEwNDU5LzMxNDcKK2YgNTkzNi8xMDQ1OS8zMTQ3IDU5MzUvMTA0NjAvMzE0NyA1ODg3LzEwNDU3LzMxNDcKK2YgNTg4OC8xMDQ1OC8zMTQ4IDU4ODkvMTA0NjEvMzE0OCA1OTM3LzEwNDYyLzMxNDgKK2YgNTkzNy8xMDQ2Mi8zMTQ4IDU5MzYvMTA0NTkvMzE0OCA1ODg4LzEwNDU4LzMxNDgKK2YgNTg4OS8xMDQ2MS8yMzUxIDU4OTAvMTA0NjMvMjM1MSA1OTM4LzEwNDY0LzIzNTEKK2YgNTkzOC8xMDQ2NC8yMzUxIDU5MzcvMTA0NjIvMjM1MSA1ODg5LzEwNDYxLzIzNTEKK2YgNTg5MC8xMDQ2NS8zMTQ5IDU4OTEvMTA0NjYvMzE0OSA1OTM5LzEwNDY3LzMxNDkKK2YgNTkzOS8xMDQ2Ny8zMTQ5IDU5MzgvMTA0NjgvMzE0OSA1ODkwLzEwNDY1LzMxNDkKK2YgNTg5MS8xMDQ2Ni8zMTQwIDU4OTIvMTA0NjkvMzE0MCA1OTQwLzEwNDcwLzMxNDAKK2YgNTk0MC8xMDQ3MC8zMTQwIDU5MzkvMTA0NjcvMzE0MCA1ODkxLzEwNDY2LzMxNDAKK2YgNTg5Mi8xMDQ2OS8zMTM5IDU4OTMvMTA0NzEvMzEzOSA1OTQxLzEwNDcyLzMxMzkKK2YgNTk0MS8xMDQ3Mi8zMTM5IDU5NDAvMTA0NzAvMzEzOSA1ODkyLzEwNDY5LzMxMzkKK2YgNTg5My8xMDQ3MS8zMTQxIDU4OTQvMTA0NzMvMzE0MSA1OTQyLzEwNDc0LzMxNDEKK2YgNTk0Mi8xMDQ3NC8zMTQxIDU5NDEvMTA0NzIvMzE0MSA1ODkzLzEwNDcxLzMxNDEKK2YgNTg5NC8xMDQ3NS8zMTQyIDU4OTUvMTA0NzYvMzE0MiA1OTQzLzEwNDc3LzMxNDIKK2YgNTk0My8xMDQ3Ny8zMTQyIDU5NDIvMTA0NzgvMzE0MiA1ODk0LzEwNDc1LzMxNDIKK2YgNTg5NS8xMDQ3Ni8zMTQzIDU4OTYvMTA0NzkvMzE0MyA1OTQ0LzEwNDgwLzMxNDMKK2YgNTk0NC8xMDQ4MC8zMTQzIDU5NDMvMTA0NzcvMzE0MyA1ODk1LzEwNDc2LzMxNDMKK2YgNTg5Ni8xMDQ3OS8zMTQ0IDU4OTcvMTA0ODEvMzE0NCA1OTQ1LzEwNDgyLzMxNDQKK2YgNTk0NS8xMDQ4Mi8zMTQ0IDU5NDQvMTA0ODAvMzE0NCA1ODk2LzEwNDc5LzMxNDQKK2YgNTg5Ny8xMDQ4My8zMTQ1IDU4ODYvMTA0NTMvMzE0NSA1OTM0LzEwNDU2LzMxNDUKK2YgNTkzNC8xMDQ1Ni8zMTQ1IDU5NDUvMTA0ODQvMzE0NSA1ODk3LzEwNDgzLzMxNDUKK2YgNzY2OC8xMDQ4NS8zMTUwIDc3MjQvMTA0ODYvMzE1MCA3NzIyLzEwNDg3LzMxNTAKK2YgNzcyMi8xMDQ4Ny8zMTUwIDc2NjMvMTA0ODgvMzE1MCA3NjY4LzEwNDg1LzMxNTAKK2YgNzYwMy8xMDQ4OS8zMTUxIDc2MDQvMTA0OTAvMzE1MSA3NTkwLzEwNDkxLzMxNTEKK2YgNzU5MC8xMDQ5MS8zMTUyIDc1ODkvMTA0OTIvMzE1MiA3NjAzLzEwNDg5LzMxNTIKK2YgNzYwNC8xMDQ5MC8zMTUzIDc2MDUvMTA0OTMvMzE1MyA3NTkxLzEwNDk0LzMxNTMKK2YgNzU5MS8xMDQ5NC8zMTU0IDc1OTAvMTA0OTEvMzE1NCA3NjA0LzEwNDkwLzMxNTQKK2YgNzU5MS8xMDQ5NC8zMTU1IDc2MDUvMTA0OTMvMzE1NSA3NjA2LzEwNDk1LzMxNTUKK2YgNzYwNi8xMDQ5NS8zMTU2IDc1ODAvMTA0OTYvMzE1NiA3NTkxLzEwNDk0LzMxNTYKK2YgNzYwNi8xMDQ5NS8zMTU3IDc2MDEvMTA0OTcvMzE1NyA3NTg3LzEwNDk4LzMxNTcKK2YgNzU4Ny8xMDQ5OC8zMTU4IDc1ODAvMTA0OTYvMzE1OCA3NjA2LzEwNDk1LzMxNTgKK2YgNzU4Ny8xMDQ5OC8zMTU5IDc2MDEvMTA0OTcvMzE1OSA3OTIzLzEwNDk5LzMxNTkKK2YgNzkyMy8xMDQ5OS8zMTU5IDc5MTgvMTA1MDAvMzE1OSA3NTg3LzEwNDk4LzMxNTkKK2YgNzYwMi8xMDUwMS8zMTU5IDc4OTYvMTA1MDIvMzE1OSA3ODkxLzEwNTAzLzMxNTkKK2YgNzg5MS8xMDUwMy8zMTU5IDc1ODgvMTA1MDQvMzE1OSA3NjAyLzEwNTAxLzMxNTkKK2YgNzU4OS8xMDQ5Mi82OTcgNzU5MC8xMDQ5MS82OTcgNzU5My8xMDUwNS82OTcKK2YgNzU5My8xMDUwNS82OTcgNzU5Mi8xMDUwNi82OTcgNzU4OS8xMDQ5Mi82OTcKK2YgNzU5MC8xMDQ5MS82OTcgNzU5MS8xMDQ5NC82OTcgNzU5NC8xMDUwNy82OTcKK2YgNzU5NC8xMDUwNy82OTcgNzU5My8xMDUwNS82OTcgNzU5MC8xMDQ5MS82OTcKK2YgNzU5MS8xMDQ5NC82OTcgNzU4MC8xMDQ5Ni82OTcgNzU5NS8xMDUwOC82OTcKK2YgNzU5NS8xMDUwOC82OTcgNzU5NC8xMDUwNy82OTcgNzU5MS8xMDQ5NC82OTcKK2YgNzU4MC8xMDQ5Ni82OTcgNzU4Ny8xMDQ5OC82OTcgNzU5Ni8xMDUwOS82OTcKK2YgNzU4MC8xMDQ5Ni82OTcgNzU5Ni8xMDUwOS82OTcgNzU5NS8xMDUwOC82OTcKK2YgNzkxOC8xMDUwMC82OTcgNzkyMC8xMDUxMC82OTcgNzU5Ni8xMDUwOS82OTcKK2YgNzU5Ni8xMDUwOS82OTcgNzU4Ny8xMDQ5OC82OTcgNzkxOC8xMDUwMC82OTcKK2YgNzg5MS8xMDUwMy82OTcgNzg5My8xMDUxMS82OTcgNzU5Ny8xMDUxMi82OTcKK2YgNzU5Ny8xMDUxMi82OTcgNzU4OC8xMDUwNC82OTcgNzg5MS8xMDUwMy82OTcKK2YgNzY2NC8xMDUxMy8zMTYwIDc3MjUvMTA1MTQvMzE2MCA3NzI0LzEwNTE1LzMxNjAKK2YgNzcyNC8xMDUxNS8zMTYxIDc2NjgvMTA1MTYvMzE2MSA3NjY0LzEwNTEzLzMxNjEKK2YgNzU4My8xMDUxNy8zMTYyIDc1ODQvMTA1MTgvMzE2MiA3NjA0LzEwNTE5LzMxNjIKK2YgNzYwNC8xMDUxOS8zMTYzIDc2MDMvMTA1MjAvMzE2MyA3NTgzLzEwNTE3LzMxNjMKK2YgNzU4NC8xMDUxOC8zMTY0IDc1ODUvMTA1MjEvMzE2NCA3NjA1LzEwNTIyLzMxNjQKK2YgNzYwNS8xMDUyMi8zMTY1IDc2MDQvMTA1MTkvMzE2NSA3NTg0LzEwNTE4LzMxNjUKK2YgNzU4NS8xMDUyMy8zMTY2IDc1ODYvMTA1MjQvMzE2NiA3NjA2LzEwNTI1LzMxNjYKK2YgNzYwNi8xMDUyNS8zMTY3IDc2MDUvMTA1MjYvMzE2NyA3NTg1LzEwNTIzLzMxNjcKK2YgNzYwNi8xMDUyNS8zMTY4IDc1ODYvMTA1MjQvMzE2OCA3NTgxLzEwNTI3LzMxNjgKK2YgNzU4MS8xMDUyNy8zMTY5IDc2MDEvMTA1MjgvMzE2OSA3NjA2LzEwNTI1LzMxNjkKK2YgNzU4MS8xMDUyNy8zMTcwIDc5MTkvMTA1MjkvMzE3MCA3OTIzLzEwNTMwLzMxNzAKK2YgNzkyMy8xMDUzMC8zMTcxIDc2MDEvMTA1MjgvMzE3MSA3NTgxLzEwNTI3LzMxNzEKK2YgNzU4Mi8xMDUzMS8zMTcwIDc4OTIvMTA1MzIvMzE3MCA3ODk2LzEwNTMzLzMxNzAKK2YgNzg5Ni8xMDUzMy8zMTcwIDc2MDIvMTA1MzQvMzE3MCA3NTgyLzEwNTMxLzMxNzAKK2YgNzYyMC8xMDUzNS8zMTUwIDc2MTUvMTA1MzYvMzE1MCA3Nzc1LzEwNTM3LzMxNTAKK2YgNzc3NS8xMDUzNy8zMTUwIDc3NzIvMTA1MzgvMzE1MCA3NjIwLzEwNTM1LzMxNTAKK2YgNzYxNS8xMDUzNi82OTcgNzYxNy8xMDUzOS82OTcgNzc3Ny8xMDU0MC82OTcKK2YgNzc3Ny8xMDU0MC82OTcgNzc3NS8xMDUzNy82OTcgNzYxNS8xMDUzNi82OTcKK2YgNzYxOS8xMDU0MS82OTcgNzkyNS8xMDU0Mi82OTcgNzkzNi8xMDU0My82OTcKK2YgNzkzNi8xMDU0My82OTcgNzc3OC8xMDU0NC82OTcgNzYxOS8xMDU0MS82OTcKK2YgNzYxOS8xMDU0MS82OTcgNzc3OC8xMDU0NC82OTcgNzc4Mi8xMDU0NS82OTcKK2YgNzc4Mi8xMDU0NS82OTcgNzYzMi8xMDU0Ni82OTcgNzYxOS8xMDU0MS82OTcKK2YgNzYxNi8xMDU0Ny8zMTYwIDc2MjAvMTA1NDgvMzE2MCA3NzcyLzEwNTQ5LzMxNjAKK2YgNzc3Mi8xMDU0OS8zMTcyIDc3ODUvMTA1NTAvMzE3MiA3NjE2LzEwNTQ3LzMxNzIKK2YgNzYzMC8xMDU1MS82OTcgNzYzMS8xMDU1Mi82OTcgNzYyMS8xMDU1My82OTcKK2YgNzYyMS8xMDU1My82OTcgNzYxMy8xMDU1NC82OTcgNzYzMC8xMDU1MS82OTcKK2YgNzYyNy8xMDU1NS8zMTUwIDc2MjIvMTA1NTYvMzE1MCA3NjA3LzEwNTU3LzMxNTAKK2YgNzYwNy8xMDU1Ny8zMTUwIDc2MTIvMTA1NTgvMzE1MCA3NjI3LzEwNTU1LzMxNTAKK2YgNzYyMi8xMDU1Ni82OTcgNzYyNC8xMDU1OS82OTcgNzYwOS8xMDU2MC82OTcKK2YgNzYwOS8xMDU2MC82OTcgNzYwNy8xMDU1Ny82OTcgNzYyMi8xMDU1Ni82OTcKK2YgNzYyNi8xMDU2MS82OTcgNzkyNi8xMDU2Mi82OTcgNzkyNC8xMDU2My82OTcKK2YgNzkyNC8xMDU2My82OTcgNzYxMS8xMDU2NC82OTcgNzYyNi8xMDU2MS82OTcKK2YgNzYyMy8xMDU2NS8zMTczIDc2MjcvMTA1NjYvMzE3MyA3NjEyLzEwNTY3LzMxNzMKK2YgNzYxMi8xMDU2Ny8zMTczIDc2MDgvMTA1NjgvMzE3MyA3NjIzLzEwNTY1LzMxNzMKK2YgNzY1NS8xMDU2OS82OTcgNzY2OS8xMDU3MC82OTcgNzY3MC8xMDU3MS82OTcKK2YgNzY3MC8xMDU3MS82OTcgNzY1NC8xMDU3Mi82OTcgNzY1NS8xMDU2OS82OTcKK2YgNzc3Ny8xMDU0MC82OTcgNzYxNy8xMDUzOS82OTcgNzYyMS8xMDU1My82OTcKK2YgNzYyMS8xMDU1My82OTcgNzgwNi8xMDU3My82OTcgNzc3Ny8xMDU0MC82OTcKK2YgNzYwOS8xMDU2MC82OTcgNzYyNC8xMDU1OS82OTcgNzYyOS8xMDU3NC82OTcKK2YgNzYyOS8xMDU3NC82OTcgNzYxMy8xMDU1NC82OTcgNzYwOS8xMDU2MC82OTcKK2YgNzYxMi8xMDU1OC8zMTUwIDc2MDcvMTA1NTcvMzE1MCA3NjE1LzEwNTM2LzMxNTAKK2YgNzYxNS8xMDUzNi8zMTUwIDc2MjAvMTA1MzUvMzE1MCA3NjEyLzEwNTU4LzMxNTAKK2YgNzYwNy8xMDU1Ny82OTcgNzYwOS8xMDU2MC82OTcgNzYxNy8xMDUzOS82OTcKK2YgNzYxNy8xMDUzOS82OTcgNzYxNS8xMDUzNi82OTcgNzYwNy8xMDU1Ny82OTcKK2YgNzYxMS8xMDU2NC82OTcgNzkyNC8xMDU2My82OTcgNzkyNS8xMDU0Mi82OTcKK2YgNzkyNS8xMDU0Mi82OTcgNzYxOS8xMDU0MS82OTcgNzYxMS8xMDU2NC82OTcKK2YgNzYzMy8xMDU3NS82OTcgNzYxMS8xMDU2NC82OTcgNzYxOS8xMDU0MS82OTcKK2YgNzYxOS8xMDU0MS82OTcgNzYzMi8xMDU0Ni82OTcgNzYzMy8xMDU3NS82OTcKK2YgNzYwOC8xMDU2OC8zMTYxIDc2MTIvMTA1NjcvMzE2MSA3NjIwLzEwNTQ4LzMxNjEKK2YgNzYyMC8xMDU0OC8zMTYxIDc2MTYvMTA1NDcvMzE2MSA3NjA4LzEwNTY4LzMxNjEKK2YgNzgwNi8xMDU3My82OTcgNzYyMS8xMDU1My82OTcgNzYzMS8xMDU1Mi82OTcKK2YgNzYzMS8xMDU1Mi82OTcgNzgwOS8xMDU3Ni82OTcgNzgwNi8xMDU3My82OTcKK2YgNzYwOS8xMDU2MC82OTcgNzYxMy8xMDU1NC82OTcgNzYyMS8xMDU1My82OTcKK2YgNzYyMS8xMDU1My82OTcgNzYxNy8xMDUzOS82OTcgNzYwOS8xMDU2MC82OTcKK2YgNzY2OC8xMDQ4NS8zMTUwIDc2NjMvMTA0ODgvMzE1MCA3NjIyLzEwNTU2LzMxNTAKK2YgNzYyMi8xMDU1Ni8zMTUwIDc2MjcvMTA1NTUvMzE1MCA3NjY4LzEwNDg1LzMxNTAKK2YgNzY2My8xMDQ4OC82OTcgNzY2NS8xMDU3Ny82OTcgNzYyNC8xMDU1OS82OTcKK2YgNzYyNC8xMDU1OS82OTcgNzYyMi8xMDU1Ni82OTcgNzY2My8xMDQ4OC82OTcKK2YgNzY2Ny8xMDU3OC82OTcgNzkyNy8xMDU3OS82OTcgNzkyNi8xMDU2Mi82OTcKK2YgNzkyNi8xMDU2Mi82OTcgNzYyNi8xMDU2MS82OTcgNzY2Ny8xMDU3OC82OTcKK2YgNzY2OS8xMDU3MC82OTcgNzY2Ny8xMDU3OC82OTcgNzYyNi8xMDU2MS82OTcKK2YgNzYyNi8xMDU2MS82OTcgNzYyOC8xMDU4MC82OTcgNzY2OS8xMDU3MC82OTcKK2YgNzY2NC8xMDUxMy8zMTYxIDc2NjgvMTA1MTYvMzE2MSA3NjI3LzEwNTY2LzMxNjEKK2YgNzYyNy8xMDU2Ni8zMTYxIDc2MjMvMTA1NjUvMzE2MSA3NjY0LzEwNTEzLzMxNjEKK2YgNzY2NS8xMDU3Ny82OTcgNzY3MC8xMDU3MS82OTcgNzYyOS8xMDU3NC82OTcKK2YgNzYyOS8xMDU3NC82OTcgNzYyNC8xMDU1OS82OTcgNzY2NS8xMDU3Ny82OTcKK2YgNzYzOC8xMDU4MS82OTcgNzYzOS8xMDU4Mi82OTcgNzYzMS8xMDU1Mi82OTcKK2YgNzYzMS8xMDU1Mi82OTcgNzYzMC8xMDU1MS82OTcgNzYzOC8xMDU4MS82OTcKK2YgNzYzOS8xMDU4Mi82OTcgNzgxNy8xMDU4My82OTcgNzgwOS8xMDU3Ni82OTcKK2YgNzgwOS8xMDU3Ni82OTcgNzYzMS8xMDU1Mi82OTcgNzYzOS8xMDU4Mi82OTcKK2YgNzgxOC8xMDU4NC82OTcgNzY0MC8xMDU4NS82OTcgNzYzMi8xMDU0Ni82OTcKK2YgNzYzMi8xMDU0Ni82OTcgNzc4Mi8xMDU0NS82OTcgNzgxOC8xMDU4NC82OTcKK2YgNzY0MC8xMDU4NS82OTcgNzY0MS8xMDU4Ni82OTcgNzYzMy8xMDU3NS82OTcKK2YgNzYzMy8xMDU3NS82OTcgNzYzMi8xMDU0Ni82OTcgNzY0MC8xMDU4NS82OTcKK2YgNzYyOC8xMDU4MC82OTcgNzYyNi8xMDU2MS82OTcgNzYzNC8xMDU4Ny82OTcKK2YgNzYzNC8xMDU4Ny82OTcgNzYzNS8xMDU4OC82OTcgNzYyOC8xMDU4MC82OTcKK2YgNzYxMy8xMDU1NC82OTcgNzYyOS8xMDU3NC82OTcgNzYzNi8xMDU4OS82OTcKK2YgNzYzNi8xMDU4OS82OTcgNzYzMC8xMDU1MS82OTcgNzYxMy8xMDU1NC82OTcKK2YgNzYzNy8xMDU5MC82OTcgNzYzOC8xMDU4MS82OTcgNzYzMC8xMDU1MS82OTcKK2YgNzYzMC8xMDU1MS82OTcgNzYzNi8xMDU4OS82OTcgNzYzNy8xMDU5MC82OTcKK2YgNzYzNS8xMDU4OC82OTcgNzYzNC8xMDU4Ny82OTcgNzY0Mi8xMDU5MS82OTcKK2YgNzY0Mi8xMDU5MS82OTcgNzY0My8xMDU5Mi82OTcgNzYzNS8xMDU4OC82OTcKK2YgNzY1NC8xMDU3Mi82OTcgNzY0NS8xMDU5My82OTcgNzY0Ni8xMDU5NC82OTcKK2YgNzY0Ni8xMDU5NC82OTcgNzY1NS8xMDU2OS82OTcgNzY1NC8xMDU3Mi82OTcKK2YgNzcyNy8xMDU5NS82OTcgNzY2Ny8xMDU3OC82OTcgNzY1Ni8xMDU5Ni82OTcKK2YgNzY1Ni8xMDU5Ni82OTcgNzY1Ny8xMDU5Ny82OTcgNzcyNy8xMDU5NS82OTcKK2YgNzY1Ny8xMDU5Ny82OTcgNzY0OC8xMDU5OC82OTcgNzY0OS8xMDU5OS82OTcKK2YgNzY0OS8xMDU5OS82OTcgNzY1OC8xMDYwMC82OTcgNzY1Ny8xMDU5Ny82OTcKK2YgNzY1OC8xMDYwMC82OTcgNzY0OS8xMDU5OS82OTcgNzY1MC8xMDYwMS82OTcKK2YgNzY1MC8xMDYwMS82OTcgNzY1OS8xMDYwMi82OTcgNzY1OC8xMDYwMC82OTcKK2YgNzYzNS8xMDU4OC82OTcgNzY0My8xMDU5Mi82OTcgNzYzNy8xMDU5MC82OTcKK2YgNzYzNy8xMDU5MC82OTcgNzYzNi8xMDU4OS82OTcgNzYzNS8xMDU4OC82OTcKK2YgNzYzMy8xMDU3NS82OTcgNzY0MS8xMDU4Ni82OTcgNzY0Mi8xMDU5MS82OTcKK2YgNzY0Mi8xMDU5MS82OTcgNzYzNC8xMDU4Ny82OTcgNzYzMy8xMDU3NS82OTcKK2YgNzYyOC8xMDU4MC82OTcgNzYzNS8xMDU4OC82OTcgNzYzNi8xMDU4OS82OTcKK2YgNzYzNi8xMDU4OS82OTcgNzYyOS8xMDU3NC82OTcgNzYyOC8xMDU4MC82OTcKK2YgNzYyNi8xMDU2MS82OTcgNzYxMS8xMDU2NC82OTcgNzYzMy8xMDU3NS82OTcKK2YgNzYzMy8xMDU3NS82OTcgNzYzNC8xMDU4Ny82OTcgNzYyNi8xMDU2MS82OTcKK2YgNzY1NC8xMDU3Mi82OTcgNzY1My8xMDYwMy82OTcgNzY0NC8xMDYwNC82OTcKK2YgNzY0NC8xMDYwNC82OTcgNzY0NS8xMDU5My82OTcgNzY1NC8xMDU3Mi82OTcKK2YgNzY1My8xMDYwMy82OTcgNzY1Mi8xMDYwNS82OTcgNzY1MS8xMDYwNi82OTcKK2YgNzY1MS8xMDYwNi82OTcgNzY0NC8xMDYwNC82OTcgNzY1My8xMDYwMy82OTcKK2YgNzY1Ny8xMDU5Ny82OTcgNzY1Ni8xMDU5Ni82OTcgNzY0Ny8xMDYwNy82OTcKK2YgNzY0Ny8xMDYwNy82OTcgNzY0OC8xMDU5OC82OTcgNzY1Ny8xMDU5Ny82OTcKK2YgNzY1Ni8xMDU5Ni82OTcgNzY1NS8xMDU2OS82OTcgNzY0Ni8xMDU5NC82OTcKK2YgNzY0Ni8xMDU5NC82OTcgNzY0Ny8xMDYwNy82OTcgNzY1Ni8xMDU5Ni82OTcKK2YgNzY1MC8xMDYwMS82OTcgNzY1MS8xMDYwNi82OTcgNzY1Mi8xMDYwNS82OTcKK2YgNzY1Mi8xMDYwNS82OTcgNzY1OS8xMDYwMi82OTcgNzY1MC8xMDYwMS82OTcKK2YgNzY3MC8xMDU3MS82OTcgNzYxNC8xMDYwOC82OTcgNzY1My8xMDYwMy82OTcKK2YgNzY1My8xMDYwMy82OTcgNzY1NC8xMDU3Mi82OTcgNzY3MC8xMDU3MS82OTcKK2YgNzY1Mi8xMDYwNS82OTcgNzcxOS8xMDYwOS82OTcgNzcyMC8xMDYxMC82OTcKK2YgNzcyMC8xMDYxMC82OTcgNzY1OS8xMDYwMi82OTcgNzY1Mi8xMDYwNS82OTcKK2YgNzY1Mi8xMDYwNS82OTcgNzY1My8xMDYwMy82OTcgNzYxNC8xMDYwOC82OTcKK2YgNzYxNC8xMDYwOC82OTcgNzcxOS8xMDYwOS82OTcgNzY1Mi8xMDYwNS82OTcKK2YgNzU5NS8xMDUwOC82OTcgNzU5Ni8xMDUwOS82OTcgNzY4My8xMDYxMS82OTcKK2YgNzY4My8xMDYxMS82OTcgNzY4NC8xMDYxMi82OTcgNzU5NS8xMDUwOC82OTcKK2YgNzY1OS8xMDYwMi82OTcgNzcyMC8xMDYxMC82OTcgNzcyMS8xMDYxMy82OTcKK2YgNzcyMS8xMDYxMy82OTcgNzY1OC8xMDYwMC82OTcgNzY1OS8xMDYwMi82OTcKK2YgNzYyOC8xMDU4MC82OTcgNzYyOS8xMDU3NC82OTcgNzY3MC8xMDU3MS82OTcKK2YgNzY3MC8xMDU3MS82OTcgNzY2OS8xMDU3MC82OTcgNzYyOC8xMDU4MC82OTcKK2YgNzcyMi8xMDQ4Ny82OTcgNzcyMy8xMDYxNC82OTcgNzY2NS8xMDU3Ny82OTcKK2YgNzY2NS8xMDU3Ny82OTcgNzY2My8xMDQ4OC82OTcgNzcyMi8xMDQ4Ny82OTcKK2YgNzcyNy8xMDU5NS82OTcgNzkyOS8xMDYxNS82OTcgNzkyNy8xMDU3OS82OTcKK2YgNzkyNy8xMDU3OS82OTcgNzY2Ny8xMDU3OC82OTcgNzcyNy8xMDU5NS82OTcKK2YgNzY1NS8xMDU2OS82OTcgNzY1Ni8xMDU5Ni82OTcgNzY2Ny8xMDU3OC82OTcKK2YgNzY2Ny8xMDU3OC82OTcgNzY2OS8xMDU3MC82OTcgNzY1NS8xMDU2OS82OTcKK2YgNzY2NS8xMDU3Ny82OTcgNzcyMy8xMDYxNC82OTcgNzYxNC8xMDYwOC82OTcKK2YgNzYxNC8xMDYwOC82OTcgNzY3MC8xMDU3MS82OTcgNzY2NS8xMDU3Ny82OTcKK2YgNzYwMi8xMDUwMS8zMTU5IDc1ODgvMTA1MDQvMzE1OSA3NjcxLzEwNjE2LzMxNTkKK2YgNzY3MS8xMDYxNi8zMTU5IDc2NzYvMTA2MTcvMzE1OSA3NjAyLzEwNTAxLzMxNTkKK2YgNzU4OC8xMDUwNC82OTcgNzU5Ny8xMDUxMi82OTcgNzY3My8xMDYxOC82OTcKK2YgNzY3My8xMDYxOC82OTcgNzY3MS8xMDYxNi82OTcgNzU4OC8xMDUwNC82OTcKK2YgNzY4OS8xMDYxOS82OTcgNzY5MC8xMDYyMC82OTcgNzY3NS8xMDYyMS82OTcKK2YgNzY3NS8xMDYyMS82OTcgNzY3NC8xMDYyMi82OTcgNzY4OS8xMDYxOS82OTcKK2YgNzY4My8xMDYxMS82OTcgNzkyOC8xMDYyMy82OTcgNzk1MC8xMDYyNC82OTcKK2YgNzU4Mi8xMDUzMS8zMTcwIDc2MDIvMTA1MzQvMzE3MCA3Njc2LzEwNjI1LzMxNzAKK2YgNzY3Ni8xMDYyNS8zMTcwIDc2NzIvMTA2MjYvMzE3MCA3NTgyLzEwNTMxLzMxNzAKK2YgNzY3My8xMDYxOC82OTcgNzU5Ny8xMDUxMi82OTcgNzY4MS8xMDYyNy82OTcKK2YgNzY4MS8xMDYyNy82OTcgNzY4Mi8xMDYyOC82OTcgNzY3My8xMDYxOC82OTcKK2YgNzU5Ny8xMDUxMi82OTcgNzg5My8xMDUxMS82OTcgNzkwMS8xMDYyOS82OTcKK2YgNzkwMS8xMDYyOS82OTcgNzY4MS8xMDYyNy82OTcgNzU5Ny8xMDUxMi82OTcKK2YgNzY4My8xMDYxMS82OTcgNzczMS8xMDYzMC82OTcgNzczMy8xMDYzMS82OTcKK2YgNzczMy8xMDYzMS82OTcgNzY4NC8xMDYxMi82OTcgNzY4My8xMDYxMS82OTcKK2YgNzU5Ni8xMDUwOS82OTcgNzkyMC8xMDUxMC82OTcgNzkyOC8xMDYyMy82OTcKK2YgNzkyOC8xMDYyMy82OTcgNzY4My8xMDYxMS82OTcgNzU5Ni8xMDUwOS82OTcKK2YgNzY2Mi8xMDYzMi82OTcgNzU5My8xMDUwNS82OTcgNzU5NC8xMDUwNy82OTcKK2YgNzU5NC8xMDUwNy82OTcgNzY4NS8xMDYzMy82OTcgNzY2Mi8xMDYzMi82OTcKK2YgNzU5NC8xMDUwNy82OTcgNzU5NS8xMDUwOC82OTcgNzY4NC8xMDYxMi82OTcKK2YgNzY4NC8xMDYxMi82OTcgNzY4NS8xMDYzMy82OTcgNzU5NC8xMDUwNy82OTcKK2YgNzY4NS8xMDYzMy82OTcgNzczMy8xMDYzMS82OTcgNzY2MS8xMDYzNC82OTcKK2YgNzY2MS8xMDYzNC82OTcgNzY2Mi8xMDYzMi82OTcgNzY4NS8xMDYzMy82OTcKK2YgNzY3Ni8xMDYxNy8zMTU5IDc2NzEvMTA2MTYvMzE1OSA3Njg2LzEwNjM1LzMxNTkKK2YgNzY4Ni8xMDYzNS8zMTU5IDc2OTEvMTA2MzYvMzE1OSA3Njc2LzEwNjE3LzMxNTkKK2YgNzY3MS8xMDYxNi82OTcgNzY3My8xMDYxOC82OTcgNzY4OC8xMDYzNy82OTcKK2YgNzY4OC8xMDYzNy82OTcgNzY4Ni8xMDYzNS82OTcgNzY3MS8xMDYxNi82OTcKK2YgNzY3Mi8xMDYyNi8zMTcwIDc2NzYvMTA2MjUvMzE3MCA3NjkxLzEwNjM4LzMxNzAKK2YgNzY5MS8xMDYzOC8zMTcwIDc2ODcvMTA2MzkvMzE3MCA3NjcyLzEwNjI2LzMxNzAKK2YgNzY3OC8xMDY0MC82OTcgNzg0Mi8xMDY0MS82OTcgNzc4MC8xMDY0Mi82OTcKK2YgNzc4MC8xMDY0Mi82OTcgNzY5My8xMDY0My82OTcgNzY3OC8xMDY0MC82OTcKK2YgNzY3OS8xMDY0NC82OTcgNzY3Ny8xMDY0NS82OTcgNzY5Mi8xMDY0Ni82OTcKK2YgNzY5Mi8xMDY0Ni82OTcgNzY5NC8xMDY0Ny82OTcgNzY3OS8xMDY0NC82OTcKK2YgNzY3Ny8xMDY0NS82OTcgNzY3OC8xMDY0MC82OTcgNzY5My8xMDY0My82OTcKK2YgNzY5My8xMDY0My82OTcgNzY5Mi8xMDY0Ni82OTcgNzY3Ny8xMDY0NS82OTcKK2YgNzY4MC8xMDY0OC82OTcgNzY3OS8xMDY0NC82OTcgNzY5NC8xMDY0Ny82OTcKK2YgNzY5NC8xMDY0Ny82OTcgNzY5NS8xMDY0OS82OTcgNzY4MC8xMDY0OC82OTcKK2YgNzY3NC8xMDYyMi82OTcgNzcyOC8xMDY1MC82OTcgNzcyOS8xMDY1MS82OTcKK2YgNzcyOS8xMDY1MS82OTcgNzY4OS8xMDYxOS82OTcgNzY3NC8xMDYyMi82OTcKK2YgNzkyMS8xMDY1Mi82OTcgNzkyMi8xMDY1My82OTcgNzY5MC8xMDYyMC82OTcKK2YgNzY5MC8xMDYyMC82OTcgNzY4OS8xMDYxOS82OTcgNzkyMS8xMDY1Mi82OTcKK2YgNzY5Ni8xMDY1NC82OTcgNzY4Mi8xMDYyOC82OTcgNzk0Ni8xMDY1NS82OTcKK2YgNzk0Ni8xMDY1NS82OTcgNzk0Ny8xMDY1Ni82OTcgNzY5Ni8xMDY1NC82OTcKK2YgNzY3My8xMDYxOC82OTcgNzY4Mi8xMDYyOC82OTcgNzY5Ni8xMDY1NC82OTcKK2YgNzY5Ni8xMDY1NC82OTcgNzY4OC8xMDYzNy82OTcgNzY3My8xMDYxOC82OTcKK2YgNzkyMi8xMDY1My82OTcgNzkzMC8xMDY1Ny82OTcgNzczNC8xMDY1OC82OTcKK2YgNzczNC8xMDY1OC82OTcgNzY5MC8xMDYyMC82OTcgNzkyMi8xMDY1My82OTcKK2YgNzcxMy8xMDY1OS8zMTc0IDc3MTIvMTA2NjAvMzE3NCA3NzA1LzEwNjYxLzMxNzQKK2YgNzcwNS8xMDY2MS8zMTc0IDc3MDYvMTA2NjIvMzE3NCA3NzEzLzEwNjU5LzMxNzQKK2YgNzcxNC8xMDY2My8zMTc1IDc3MTMvMTA2NTkvMzE3NSA3NzA2LzEwNjYyLzMxNzUKK2YgNzcwNi8xMDY2Mi8zMTc1IDc3MDcvMTA2NjQvMzE3NSA3NzE0LzEwNjYzLzMxNzUKK2YgNzg1OS8xMDY2NS8xNzMyIDc3MTQvMTA2NjMvMTczMiA3NzA3LzEwNjY0LzE3MzIKK2YgNzcwNy8xMDY2NC8xNzMyIDc4NjAvMTA2NjYvMTczMiA3ODU5LzEwNjY1LzE3MzIKK2YgNzcxNS8xMDY2Ny8yMTk0IDc4NjIvMTA2NjgvMjE5NCA3ODYzLzEwNjY5LzIxOTQKK2YgNzg2My8xMDY2OS8yMTk0IDc3MDgvMTA2NzAvMjE5NCA3NzE1LzEwNjY3LzIxOTQKK2YgNzcxNi8xMDY3MS8yMTk0IDc3MTUvMTA2NjcvMjE5NCA3NzA4LzEwNjcwLzIxOTQKK2YgNzcwOC8xMDY3MC8yMTk0IDc3MDkvMTA2NzIvMjE5NCA3NzE2LzEwNjcxLzIxOTQKK2YgNzcxNy8xMDY3My8zMTc2IDc3MTYvMTA2NzEvMzE3NiA3NzA5LzEwNjcyLzMxNzYKK2YgNzcwOS8xMDY3Mi8zMTc2IDc3MTAvMTA2NzQvMzE3NiA3NzE3LzEwNjczLzMxNzYKK2YgNzcxOC8xMDY3NS8zMTc3IDc3MTcvMTA2NzYvMzE3NyA3NzEwLzEwNjc3LzMxNzcKK2YgNzcxMC8xMDY3Ny8zMTc3IDc3MTEvMTA2NzgvMzE3NyA3NzE4LzEwNjc1LzMxNzcKK2YgNzcxMi8xMDY3OS8zMTc4IDc3MTgvMTA2NzUvMzE3OCA3NzExLzEwNjc4LzMxNzgKK2YgNzcxMS8xMDY3OC8zMTc4IDc3MDUvMTA2ODAvMzE3OCA3NzEyLzEwNjc5LzMxNzgKK2YgNzYzNy8xMDU5MC8zMTc5IDc3MTIvMTA2ODEvMzE3OSA3NzEzLzEwNjgyLzMxNzkKK2YgNzcxMy8xMDY4Mi8zMTgwIDc2MzgvMTA1ODEvMzE4MCA3NjM3LzEwNTkwLzMxODAKK2YgNzYzOC8xMDU4MS8zMTgxIDc3MTMvMTA2ODIvMzE4MSA3NzE0LzEwNjgzLzMxODEKK2YgNzcxNC8xMDY4My8zMTgyIDc2MzkvMTA1ODIvMzE4MiA3NjM4LzEwNTgxLzMxODIKK2YgNzYzOS8xMDU4Mi8zMTgzIDc3MTQvMTA2ODMvMzE4MyA3ODU5LzEwNjg0LzMxODMKK2YgNzg1OS8xMDY4NC8zMTg0IDc4MTcvMTA1ODMvMzE4NCA3NjM5LzEwNTgyLzMxODQKK2YgNzgxOC8xMDY4NS8zMTg1IDc4NjIvMTA2NjgvMzE4NSA3NzE1LzEwNjY3LzMxODUKK2YgNzcxNS8xMDY2Ny8zMTg2IDc2NDAvMTA2ODYvMzE4NiA3ODE4LzEwNjg1LzMxODYKK2YgNzY0MC8xMDY4Ni8zMTg2IDc3MTUvMTA2NjcvMzE4NiA3NzE2LzEwNjcxLzMxODYKK2YgNzcxNi8xMDY4Ny8zMTg3IDc2NDEvMTA1ODYvMzE4NyA3NjQwLzEwNTg1LzMxODcKK2YgNzY0MS8xMDU4Ni8zMTg4IDc3MTYvMTA2ODcvMzE4OCA3NzE3LzEwNjg4LzMxODgKK2YgNzcxNy8xMDY4OC8zMTg5IDc2NDIvMTA1OTEvMzE4OSA3NjQxLzEwNTg2LzMxODkKK2YgNzY0Mi8xMDU5MS8zMTkwIDc3MTcvMTA2ODgvMzE5MCA3NzE4LzEwNjg5LzMxOTAKK2YgNzcxOC8xMDY4OS8zMTkxIDc2NDMvMTA1OTIvMzE5MSA3NjQyLzEwNTkxLzMxOTEKK2YgNzY0My8xMDU5Mi8zMTkyIDc3MTgvMTA2ODkvMzE5MiA3NzEyLzEwNjgxLzMxOTIKK2YgNzcxMi8xMDY4MS8zMTkzIDc2MzcvMTA1OTAvMzE5MyA3NjQzLzEwNTkyLzMxOTMKK2YgNzU5Mi8xMDUwNi82OTcgNzU5My8xMDUwNS82OTcgNzY2Mi8xMDYzMi82OTcKK2YgNzY2Mi8xMDYzMi82OTcgNzcxOS8xMDYwOS82OTcgNzU5Mi8xMDUwNi82OTcKK2YgNzcxOS8xMDYwOS82OTcgNzY2Mi8xMDYzMi82OTcgNzY2MS8xMDYzNC82OTcKK2YgNzY2MS8xMDYzNC82OTcgNzcyMC8xMDYxMC82OTcgNzcxOS8xMDYwOS82OTcKK2YgNzcyMS8xMDYxMy82OTcgNzcyMC8xMDYxMC82OTcgNzY2MS8xMDYzNC82OTcKK2YgNzY2MS8xMDYzNC82OTcgNzYwMC8xMDY5MC82OTcgNzcyMS8xMDYxMy82OTcKK2YgNzYwMy8xMDQ4OS8zMTk0IDc1ODkvMTA0OTIvMzE5NCA3NzIyLzEwNDg3LzMxOTQKK2YgNzcyMi8xMDQ4Ny8zMTUwIDc3MjQvMTA0ODYvMzE1MCA3NjAzLzEwNDg5LzMxNTAKK2YgNzU4My8xMDUxNy8zMTk1IDc2MDMvMTA1MjAvMzE5NSA3NzI0LzEwNTE1LzMxOTUKK2YgNzcyNC8xMDUxNS8zMTYwIDc3MjUvMTA1MTQvMzE2MCA3NTgzLzEwNTE3LzMxNjAKK2YgNzU4OS8xMDQ5Mi82OTcgNzU5Mi8xMDUwNi82OTcgNzcyMy8xMDYxNC82OTcKK2YgNzcyMy8xMDYxNC82OTcgNzcyMi8xMDQ4Ny82OTcgNzU4OS8xMDQ5Mi82OTcKK2YgNzU5Mi8xMDUwNi82OTcgNzcxOS8xMDYwOS82OTcgNzYxNC8xMDYwOC82OTcKK2YgNzYxNC8xMDYwOC82OTcgNzcyMy8xMDYxNC82OTcgNzU5Mi8xMDUwNi82OTcKK2YgNzcyMS8xMDYxMy82OTcgNzkyMS8xMDY1Mi82OTcgNzkyOS8xMDYxNS82OTcKK2YgNzkyOS8xMDYxNS82OTcgNzcyNy8xMDU5NS82OTcgNzcyMS8xMDYxMy82OTcKK2YgNzY4MC8xMDY0OC82OTcgNzY5NS8xMDY0OS82OTcgNzcyOS8xMDY1MS82OTcKK2YgNzcyOS8xMDY1MS82OTcgNzcyOC8xMDY1MC82OTcgNzY4MC8xMDY0OC82OTcKK2YgNzY1OC8xMDYwMC82OTcgNzcyMS8xMDYxMy82OTcgNzcyNy8xMDU5NS82OTcKK2YgNzcyNy8xMDU5NS82OTcgNzY1Ny8xMDU5Ny82OTcgNzY1OC8xMDYwMC82OTcKK2YgNzYwMC8xMDY5MC82OTcgNzY2MS8xMDYzNC82OTcgNzczMy8xMDYzMS82OTcKK2YgNzczMy8xMDYzMS82OTcgNzczMS8xMDYzMC82OTcgNzYwMC8xMDY5MC82OTcKK2YgNzY3NS8xMDYyMS82OTcgNzY5MC8xMDYyMC82OTcgNzczNC8xMDY1OC82OTcKK2YgNzczNC8xMDY1OC82OTcgNzczMi8xMDY5MS82OTcgNzY3NS8xMDYyMS82OTcKK2YgNzY4NS8xMDYzMy82OTcgNzY4NC8xMDYxMi82OTcgNzczMy8xMDYzMS82OTcKK2YgNzczNS8xMDY5Mi8zMTUwIDc3MzcvMTA2OTMvMzE1MCA3NzM4LzEwNjk0LzMxNTAKK2YgNzczOC8xMDY5NC8zMTUwIDc3MzYvMTA2OTUvMzE1MCA3NzM1LzEwNjkyLzMxNTAKK2YgNzczOC8xMDY5NC8zMTk2IDc3MzcvMTA2OTMvMzE5NiA3NzQwLzEwNjk2LzMxOTYKK2YgNzc0MC8xMDY5Ni8zMTk3IDc3MzkvMTA2OTcvMzE5NyA3NzM4LzEwNjk0LzMxOTcKK2YgNzczOS8xMDY5Ny8zMTk4IDc3NDAvMTA2OTYvMzE5OCA3NzQyLzEwNjk4LzMxOTgKK2YgNzc0Mi8xMDY5OC8zMTk5IDc3NDEvMTA2OTkvMzE5OSA3NzM5LzEwNjk3LzMxOTkKK2YgNzc0Mi8xMDY5OC8zMjAwIDc3NDQvMTA3MDAvMzIwMCA3NzQzLzEwNzAxLzMyMDAKK2YgNzc0My8xMDcwMS8zMjAxIDc3NDEvMTA2OTkvMzIwMSA3NzQyLzEwNjk4LzMyMDEKK2YgNzc0My8xMDcwMS8zMjAyIDc3NDQvMTA3MDAvMzIwMiA3NzQ2LzEwNzAyLzMyMDIKK2YgNzc0Ni8xMDcwMi8zMjAzIDc3NDUvMTA3MDMvMzIwMyA3NzQzLzEwNzAxLzMyMDMKK2YgNzc0Ni8xMDcwMi8zMjA0IDc5MzIvMTA3MDQvMzIwNCA3OTMxLzEwNzA1LzMyMDQKK2YgNzkzMS8xMDcwNS8zMjA0IDc3NDUvMTA3MDMvMzIwNCA3NzQ2LzEwNzAyLzMyMDQKK2YgNzkwNi8xMDcwNi8zMjA0IDc5MDUvMTA3MDcvMzIwNCA3NzUwLzEwNzA4LzMyMDQKK2YgNzc1MC8xMDcwOC8zMjA0IDc3NDkvMTA3MDkvMzIwNCA3OTA2LzEwNzA2LzMyMDQKK2YgNzczNy8xMDY5My82OTcgNzc1Mi8xMDcxMC82OTcgNzc1MS8xMDcxMS82OTcKK2YgNzc1MS8xMDcxMS82OTcgNzc0MC8xMDY5Ni82OTcgNzczNy8xMDY5My82OTcKK2YgNzc0MC8xMDY5Ni82OTcgNzc1MS8xMDcxMS82OTcgNzc1My8xMDcxMi82OTcKK2YgNzc1My8xMDcxMi82OTcgNzc0Mi8xMDY5OC82OTcgNzc0MC8xMDY5Ni82OTcKK2YgNzc0Mi8xMDY5OC82OTcgNzc1My8xMDcxMi82OTcgNzc1NC8xMDcxMy82OTcKK2YgNzc1NC8xMDcxMy82OTcgNzc0NC8xMDcwMC82OTcgNzc0Mi8xMDY5OC82OTcKK2YgNzc0NC8xMDcwMC82OTcgNzc1NC8xMDcxMy82OTcgNzc1NS8xMDcxNC82OTcKK2YgNzc1NS8xMDcxNC82OTcgNzc0Ni8xMDcwMi82OTcgNzc0NC8xMDcwMC82OTcKK2YgNzc1NS8xMDcxNC82OTcgNzkzMy8xMDcxNS82OTcgNzkzMi8xMDcwNC82OTcKK2YgNzkzMi8xMDcwNC82OTcgNzc0Ni8xMDcwMi82OTcgNzc1NS8xMDcxNC82OTcKK2YgNzc1Ny8xMDcxNi82OTcgNzkwNy8xMDcxNy82OTcgNzkwNi8xMDcwNi82OTcKK2YgNzkwNi8xMDcwNi82OTcgNzc0OS8xMDcwOS82OTcgNzc1Ny8xMDcxNi82OTcKK2YgNzczNi8xMDcxOC8zMTYwIDc3MzgvMTA3MTkvMzE2MCA3NzY1LzEwNzIwLzMxNjAKK2YgNzc2NS8xMDcyMC8zMTYwIDc3NjQvMTA3MjEvMzE2MCA3NzM2LzEwNzE4LzMxNjAKK2YgNzc2NS8xMDcyMC8zMjA1IDc3MzgvMTA3MTkvMzIwNSA3NzM5LzEwNzIyLzMyMDUKK2YgNzczOS8xMDcyMi8zMjA2IDc3NjYvMTA3MjMvMzIwNiA3NzY1LzEwNzIwLzMyMDYKK2YgNzc2Ni8xMDcyMy8zMjA3IDc3MzkvMTA3MjIvMzIwNyA3NzQxLzEwNzI0LzMyMDcKK2YgNzc0MS8xMDcyNC8zMjA4IDc3NjcvMTA3MjUvMzIwOCA3NzY2LzEwNzIzLzMyMDgKK2YgNzc2Ny8xMDcyNi8zMjA5IDc3NDEvMTA3MjcvMzIwOSA3NzQzLzEwNzI4LzMyMDkKK2YgNzc0My8xMDcyOC8zMjEwIDc3NjgvMTA3MjkvMzIxMCA3NzY3LzEwNzI2LzMyMTAKK2YgNzc0My8xMDcyOC8zMjExIDc3NDUvMTA3MzAvMzIxMSA3NzY5LzEwNzMxLzMyMTEKK2YgNzc2OS8xMDczMS8zMjEyIDc3NjgvMTA3MjkvMzIxMiA3NzQzLzEwNzI4LzMyMTIKK2YgNzkzMS8xMDczMi8zMjEzIDc5MzQvMTA3MzMvMzIxMyA3NzY5LzEwNzMxLzMyMTMKK2YgNzc2OS8xMDczMS8zMjEzIDc3NDUvMTA3MzAvMzIxMyA3OTMxLzEwNzMyLzMyMTMKK2YgNzkwNS8xMDczNC8zMjE0IDc5MDgvMTA3MzUvMzIxNCA3NzcxLzEwNzM2LzMyMTQKK2YgNzc3MS8xMDczNi8zMjE0IDc3NTAvMTA3MzcvMzIxNCA3OTA1LzEwNzM0LzMyMTQKK2YgNzc3My8xMDczOC8zMTUwIDc3NzIvMTA1MzgvMzE1MCA3Nzc1LzEwNTM3LzMxNTAKK2YgNzc3NS8xMDUzNy8zMTUwIDc3NzQvMTA3MzkvMzE1MCA3NzczLzEwNzM4LzMxNTAKK2YgNzc3NC8xMDczOS82OTcgNzc3NS8xMDUzNy82OTcgNzc3Ny8xMDU0MC82OTcKK2YgNzc3Ny8xMDU0MC82OTcgNzc3Ni8xMDc0MC82OTcgNzc3NC8xMDczOS82OTcKK2YgODM4My8xMDc0MS82OTcgODM0OC8xMDc0Mi82OTcgODM0OS8xMDc0My82OTcKK2YgODM0OS8xMDc0My82OTcgNzc4MS8xMDc0NC82OTcgODM4My8xMDc0MS82OTcKK2YgNzc4Ni8xMDc0NS8zMTcyIDc3ODUvMTA1NTAvMzE3MiA3NzcyLzEwNTQ5LzMxNzIKK2YgNzc3Mi8xMDU0OS8zMTYwIDc3NzMvMTA3NDYvMzE2MCA3Nzg2LzEwNzQ1LzMxNjAKK2YgNzc4OC8xMDc0Ny82OTcgNzc4Ny8xMDc0OC82OTcgNzc5MC8xMDc0OS82OTcKK2YgNzc5MC8xMDc0OS82OTcgNzc4OS8xMDc1MC82OTcgNzc4OC8xMDc0Ny82OTcKK2YgNzc5Mi8xMDc1MS8zMTUwIDc3OTEvMTA3NTIvMzE1MCA3Nzk0LzEwNzUzLzMxNTAKK2YgNzc5NC8xMDc1My8zMTUwIDc3OTMvMTA3NTQvMzE1MCA3NzkyLzEwNzUxLzMxNTAKK2YgNzc5My8xMDc1NC82OTcgNzc5NC8xMDc1My82OTcgNzc5Ni8xMDc1NS82OTcKK2YgNzc5Ni8xMDc1NS82OTcgNzc5NS8xMDc1Ni82OTcgNzc5My8xMDc1NC82OTcKK2YgNzgwMy8xMDc1Ny8zMjE1IDc4MDIvMTA3NTgvMzIxNSA3NzkxLzEwNzU5LzMyMTUKK2YgNzc5MS8xMDc1OS8zMjE2IDc3OTIvMTA3NjAvMzIxNiA3ODAzLzEwNzU3LzMyMTYKK2YgNzc3Ny8xMDU0MC82OTcgNzgwNi8xMDU3My82OTcgNzc5MC8xMDc0OS82OTcKK2YgNzc5MC8xMDc0OS82OTcgNzc3Ni8xMDc0MC82OTcgNzc3Ny8xMDU0MC82OTcKK2YgNzc5Ni8xMDc1NS82OTcgNzc4Ny8xMDc0OC82OTcgNzgwNy8xMDc2MS82OTcKK2YgNzgwNy8xMDc2MS82OTcgNzc5NS8xMDc1Ni82OTcgNzc5Ni8xMDc1NS82OTcKK2YgNzc5MS8xMDc1Mi8zMTUwIDc3NzMvMTA3MzgvMzE1MCA3Nzc0LzEwNzM5LzMxNTAKK2YgNzc3NC8xMDczOS8zMTUwIDc3OTQvMTA3NTMvMzE1MCA3NzkxLzEwNzUyLzMxNTAKK2YgNzc5NC8xMDc1My82OTcgNzc3NC8xMDczOS82OTcgNzc3Ni8xMDc0MC82OTcKK2YgNzc3Ni8xMDc0MC82OTcgNzc5Ni8xMDc1NS82OTcgNzc5NC8xMDc1My82OTcKK2YgODM0OS8xMDc0My82OTcgODM1MC8xMDc2Mi82OTcgNzgwOC8xMDc2My82OTcKK2YgNzgwOC8xMDc2My82OTcgNzc4MS8xMDc0NC82OTcgODM0OS8xMDc0My82OTcKK2YgNzgwMi8xMDc1OC8zMTYxIDc3ODYvMTA3NDUvMzE2MSA3NzczLzEwNzQ2LzMxNjEKK2YgNzc3My8xMDc0Ni8zMTYxIDc3OTEvMTA3NTkvMzE2MSA3ODAyLzEwNzU4LzMxNjEKK2YgNzgwNi8xMDU3My82OTcgNzgwOS8xMDU3Ni82OTcgNzc4OS8xMDc1MC82OTcKK2YgNzc4OS8xMDc1MC82OTcgNzc5MC8xMDc0OS82OTcgNzgwNi8xMDU3My82OTcKK2YgNzc5Ni8xMDc1NS82OTcgNzc3Ni8xMDc0MC82OTcgNzc5MC8xMDc0OS82OTcKK2YgNzc5MC8xMDc0OS82OTcgNzc4Ny8xMDc0OC82OTcgNzc5Ni8xMDc1NS82OTcKK2YgNzczNi8xMDY5NS8zMTUwIDc3OTIvMTA3NTEvMzE1MCA3NzkzLzEwNzU0LzMxNTAKK2YgNzc5My8xMDc1NC8zMTUwIDc3MzUvMTA2OTIvMzE1MCA3NzM2LzEwNjk1LzMxNTAKK2YgNzczNS8xMDY5Mi82OTcgNzc5My8xMDc1NC82OTcgNzc5NS8xMDc1Ni82OTcKK2YgNzc5NS8xMDc1Ni82OTcgNzgxMC8xMDc2NC82OTcgNzczNS8xMDY5Mi82OTcKK2YgNzc5Ny8xMDc2NS82OTcgODQwNS8xMDc2Ni82OTcgNzgxMS8xMDc2Ny82OTcKK2YgNzgwNC8xMDc2OC82OTcgNzgxMy8xMDc2OS82OTcgNzc5Ny8xMDc2NS82OTcKK2YgNzc5Ny8xMDc2NS82OTcgNzgxMS8xMDc2Ny82OTcgNzgwNC8xMDc2OC82OTcKK2YgNzc2NC8xMDcyMS8zMTYxIDc4MDMvMTA3NTcvMzE2MSA3NzkyLzEwNzYwLzMxNjEKK2YgNzc5Mi8xMDc2MC8zMTYxIDc3MzYvMTA3MTgvMzE2MSA3NzY0LzEwNzIxLzMxNjEKK2YgNzgxMC8xMDc2NC82OTcgNzc5NS8xMDc1Ni82OTcgNzgwNy8xMDc2MS82OTcKK2YgNzgwNy8xMDc2MS82OTcgNzgwNS8xMDc3MC82OTcgNzgxMC8xMDc2NC82OTcKK2YgNzgxNS8xMDc3MS82OTcgNzc4OC8xMDc0Ny82OTcgNzc4OS8xMDc1MC82OTcKK2YgNzc4OS8xMDc1MC82OTcgNzgxNi8xMDc3Mi82OTcgNzgxNS8xMDc3MS82OTcKK2YgNzgxNi8xMDc3Mi82OTcgNzc4OS8xMDc1MC82OTcgNzgwOS8xMDU3Ni82OTcKK2YgNzgwOS8xMDU3Ni82OTcgNzgxNy8xMDU4My82OTcgNzgxNi8xMDc3Mi82OTcKK2YgODM2MC8xMDc3My82OTcgODM2Mi8xMDc3NC82OTcgNzgxOC8xMDU4NC82OTcKK2YgNzgxOC8xMDU4NC82OTcgNzc4Mi8xMDU0NS82OTcgODM2MC8xMDc3My82OTcKK2YgNzgxOS8xMDc3NS82OTcgNzc4MS8xMDc0NC82OTcgNzgwOC8xMDc2My82OTcKK2YgNzgwOC8xMDc2My82OTcgNzgyMC8xMDc3Ni82OTcgNzgxOS8xMDc3NS82OTcKK2YgNzgyMi8xMDc3Ny82OTcgNzc5Ny8xMDc2NS82OTcgNzgxMy8xMDc2OS82OTcKK2YgNzgxMy8xMDc2OS82OTcgNzgyMS8xMDc3OC82OTcgNzgyMi8xMDc3Ny82OTcKK2YgNzc4Ny8xMDc0OC82OTcgNzc4OC8xMDc0Ny82OTcgNzgyMy8xMDc3OS82OTcKK2YgNzgyMy8xMDc3OS82OTcgNzgwNy8xMDc2MS82OTcgNzc4Ny8xMDc0OC82OTcKK2YgNzgyNC8xMDc4MC82OTcgNzgyMy8xMDc3OS82OTcgNzc4OC8xMDc0Ny82OTcKK2YgNzc4OC8xMDc0Ny82OTcgNzgxNS8xMDc3MS82OTcgNzgyNC8xMDc4MC82OTcKK2YgNzgyMS8xMDc3OC82OTcgNzgyNS8xMDc4MS82OTcgNzgyNi8xMDc4Mi82OTcKK2YgNzgyNi8xMDc4Mi82OTcgNzgyMi8xMDc3Ny82OTcgNzgyMS8xMDc3OC82OTcKK2YgNzgyMS8xMDc3OC82OTcgNzgyMy8xMDc3OS82OTcgNzgyNC8xMDc4MC82OTcKK2YgNzgyNC8xMDc4MC82OTcgNzgyNS8xMDc4MS82OTcgNzgyMS8xMDc3OC82OTcKK2YgNzgwOC8xMDc2My82OTcgNzgyMi8xMDc3Ny82OTcgNzgyNi8xMDc4Mi82OTcKK2YgNzgyNi8xMDc4Mi82OTcgNzgyMC8xMDc3Ni82OTcgNzgwOC8xMDc2My82OTcKK2YgNzgxMy8xMDc2OS82OTcgNzgwNy8xMDc2MS82OTcgNzgyMy8xMDc3OS82OTcKK2YgNzgyMy8xMDc3OS82OTcgNzgyMS8xMDc3OC82OTcgNzgxMy8xMDc2OS82OTcKK2YgNzc1NC8xMDcxMy82OTcgNzgzMC8xMDc4My82OTcgNzgyOS8xMDc4NC82OTcKK2YgNzgyOS8xMDc4NC82OTcgNzc1NS8xMDcxNC82OTcgNzc1NC8xMDcxMy82OTcKK2YgNzgxMy8xMDc2OS82OTcgNzgwNC8xMDc2OC82OTcgNzgwNS8xMDc3MC82OTcKK2YgNzgwNS8xMDc3MC82OTcgNzgwNy8xMDc2MS82OTcgNzgxMy8xMDc2OS82OTcKK2YgNzgxMC8xMDc2NC82OTcgNzc1Mi8xMDcxMC82OTcgNzczNy8xMDY5My82OTcKK2YgNzczNy8xMDY5My82OTcgNzczNS8xMDY5Mi82OTcgNzgxMC8xMDc2NC82OTcKK2YgNzkzOS8xMDc4NS82OTcgNzk0Mi8xMDc4Ni82OTcgNzgzMS8xMDc4Ny82OTcKK2YgNzgzMS8xMDc4Ny82OTcgNzgxMS8xMDc2Ny82OTcgNzkzOS8xMDc4NS82OTcKK2YgNzgxMC8xMDc2NC82OTcgNzgwNS8xMDc3MC82OTcgNzgyNy8xMDc4OC82OTcKK2YgNzgyNy8xMDc4OC82OTcgNzc1Mi8xMDcxMC82OTcgNzgxMC8xMDc2NC82OTcKK2YgNzc1MC8xMDcwOC8zMjA0IDc4MzIvMTA3ODkvMzIwNCA3ODMzLzEwNzkwLzMyMDQKK2YgNzgzMy8xMDc5MC8zMjA0IDc3NDkvMTA3MDkvMzIwNCA3NzUwLzEwNzA4LzMyMDQKK2YgNzc0OS8xMDcwOS82OTcgNzgzMy8xMDc5MC82OTcgNzgzNC8xMDc5MS82OTcKK2YgNzgzNC8xMDc5MS82OTcgNzc1Ny8xMDcxNi82OTcgNzc0OS8xMDcwOS82OTcKK2YgNzgzNS8xMDc5Mi82OTcgNzc1OS8xMDc5My82OTcgNzc2MC8xMDc5NC82OTcKK2YgNzc2MC8xMDc5NC82OTcgNzgzNi8xMDc5NS82OTcgNzgzNS8xMDc5Mi82OTcKK2YgNzgyOS8xMDc4NC82OTcgNzk0NC8xMDc5Ni82OTcgNzk0MC8xMDc5Ny82OTcKK2YgNzc3MS8xMDczNi8zMjEzIDc4NDAvMTA3OTgvMzIxMyA3ODMyLzEwNzk5LzMyMTMKK2YgNzgzMi8xMDc5OS8zMjE0IDc3NTAvMTA3MzcvMzIxNCA3NzcxLzEwNzM2LzMyMTQKK2YgNzgzNC8xMDc5MS82OTcgNzg0Ni8xMDgwMC82OTcgNzg0Ny8xMDgwMS82OTcKK2YgNzg0Ny8xMDgwMS82OTcgNzc1Ny8xMDcxNi82OTcgNzgzNC8xMDc5MS82OTcKK2YgNzkxMy8xMDgwMi82OTcgNzkwNy8xMDcxNy82OTcgNzc1Ny8xMDcxNi82OTcKK2YgNzc1Ny8xMDcxNi82OTcgNzg0Ny8xMDgwMS82OTcgNzkxMy8xMDgwMi82OTcKK2YgNzgyOS8xMDc4NC82OTcgNzgzMC8xMDc4My82OTcgNzg0OC8xMDgwMy82OTcKK2YgNzg0OC8xMDgwMy82OTcgNzgzOS8xMDgwNC82OTcgNzgyOS8xMDc4NC82OTcKK2YgNzk0MC8xMDc5Ny82OTcgNzkzMy8xMDcxNS82OTcgNzc1NS8xMDcxNC82OTcKK2YgNzc1NS8xMDcxNC82OTcgNzgyOS8xMDc4NC82OTcgNzk0MC8xMDc5Ny82OTcKK2YgNzg0OS8xMDgwNS82OTcgNzg1MC8xMDgwNi82OTcgNzc1My8xMDcxMi82OTcKK2YgNzc1My8xMDcxMi82OTcgNzc1MS8xMDcxMS82OTcgNzg0OS8xMDgwNS82OTcKK2YgNzc1My8xMDcxMi82OTcgNzg1MC8xMDgwNi82OTcgNzgzMC8xMDc4My82OTcKK2YgNzgzMC8xMDc4My82OTcgNzc1NC8xMDcxMy82OTcgNzc1My8xMDcxMi82OTcKK2YgNzg1MC8xMDgwNi82OTcgNzg0OS8xMDgwNS82OTcgNzg1MS8xMDgwNy82OTcKK2YgNzg1MS8xMDgwNy82OTcgNzg0OC8xMDgwMy82OTcgNzg1MC8xMDgwNi82OTcKK2YgNzgzMi8xMDc4OS8zMjA0IDc3NDcvMTA4MDgvMzIwNCA3NzQ4LzEwODA5LzMyMDQKK2YgNzc0OC8xMDgwOS8zMjA0IDc4MzMvMTA3OTAvMzIwNCA3ODMyLzEwNzg5LzMyMDQKK2YgNzgzMy8xMDc5MC82OTcgNzc0OC8xMDgwOS82OTcgNzc1Ni8xMDgxMC82OTcKK2YgNzc1Ni8xMDgxMC82OTcgNzgzNC8xMDc5MS82OTcgNzgzMy8xMDc5MC82OTcKK2YgNzg0MC8xMDc5OC8zMjEzIDc3NzAvMTA4MTEvMzIxMyA3NzQ3LzEwODEyLzMyMTMKK2YgNzc0Ny8xMDgxMi8zMjEzIDc4MzIvMTA3OTkvMzIxMyA3ODQwLzEwNzk4LzMyMTMKK2YgODM5My8xMDgxMy82OTcgODM5NC8xMDgxNC82OTcgNzg0MS8xMDgxNS82OTcKK2YgNzg0MS8xMDgxNS82OTcgNzc3OS8xMDgxNi82OTcgODM5My8xMDgxMy82OTcKK2YgNzg0My8xMDgxNy82OTcgNzc5OC8xMDgxOC82OTcgNzc5OS8xMDgxOS82OTcKK2YgNzc5OS8xMDgxOS82OTcgNzg0NC8xMDgyMC82OTcgNzg0My8xMDgxNy82OTcKK2YgNzg0NC8xMDgyMC82OTcgNzc5OS8xMDgxOS82OTcgNzc3OS8xMDgxNi82OTcKK2YgNzc3OS8xMDgxNi82OTcgNzg0MS8xMDgxNS82OTcgNzg0NC8xMDgyMC82OTcKK2YgNzg0NS8xMDgyMS82OTcgNzgxMi8xMDgyMi82OTcgNzc5OC8xMDgxOC82OTcKK2YgNzc5OC8xMDgxOC82OTcgNzg0My8xMDgxNy82OTcgNzg0NS8xMDgyMS82OTcKK2YgNzgxMi8xMDgyMi82OTcgNzg0NS8xMDgyMS82OTcgNzc1OS8xMDc5My82OTcKK2YgNzc1OS8xMDc5My82OTcgNzgzNS8xMDc5Mi82OTcgNzgxMi8xMDgyMi82OTcKK2YgNzgzNi8xMDc5NS82OTcgNzk0My8xMDgyMy82OTcgNzk0Mi8xMDc4Ni82OTcKK2YgNzk0Mi8xMDc4Ni82OTcgNzgzNS8xMDc5Mi82OTcgNzgzNi8xMDc5NS82OTcKK2YgNzgzNy8xMDgyNC82OTcgNzg4Ny8xMDgyNS82OTcgNzg4OC8xMDgyNi82OTcKK2YgNzg4OC8xMDgyNi82OTcgNzg0Ni8xMDgwMC82OTcgNzgzNy8xMDgyNC82OTcKK2YgNzgzNC8xMDc5MS82OTcgNzc1Ni8xMDgxMC82OTcgNzgzNy8xMDgyNC82OTcKK2YgNzgzNy8xMDgyNC82OTcgNzg0Ni8xMDgwMC82OTcgNzgzNC8xMDc5MS82OTcKK2YgNzgzOC8xMDgyNy82OTcgNzk0MS8xMDgyOC82OTcgNzk0My8xMDgyMy82OTcKK2YgNzk0My8xMDgyMy82OTcgNzgzNi8xMDc5NS82OTcgNzgzOC8xMDgyNy82OTcKK2YgNzgyNy8xMDc4OC82OTcgNzgwNS8xMDc3MC82OTcgNzgwNC8xMDc2OC82OTcKK2YgNzgwNC8xMDc2OC82OTcgNzgyOC8xMDgyOS82OTcgNzgyNy8xMDc4OC82OTcKK2YgNzg1My8xMDgzMC8zMjE3IDc4NTYvMTA4MzEvMzIxNyA3ODU1LzEwODMyLzMyMTcKK2YgNzg1NS8xMDgzMi8zMjE3IDc4NTQvMTA4MzMvMzIxNyA3ODUzLzEwODMwLzMyMTcKK2YgNzg1Ny8xMDgzNC8zMjE4IDc4NTgvMTA4MzUvMzIxOCA3ODU2LzEwODMxLzMyMTgKK2YgNzg1Ni8xMDgzMS8zMjE4IDc4NTMvMTA4MzAvMzIxOCA3ODU3LzEwODM0LzMyMTgKK2YgNzg1OS8xMDY2NS8yNjc5IDc4NjAvMTA2NjYvMjY3OSA3ODU4LzEwODM1LzI2NzkKK2YgNzg1OC8xMDgzNS8yNjc5IDc4NTcvMTA4MzQvMjY3OSA3ODU5LzEwNjY1LzI2NzkKK2YgNzg2NC8xMDgzNi8zMjE5IDgzODYvMTA4MzcvMzIxOSA4Mzg1LzEwODM4LzMyMTkKK2YgODM4NS8xMDgzOC8zMjE5IDc4NjEvMTA4MzkvMzIxOSA3ODY0LzEwODM2LzMyMTkKK2YgNzg2NS8xMDg0MC8zMjE5IDc4NjYvMTA4NDEvMzIxOSA3ODY0LzEwODM2LzMyMTkKK2YgNzg2NC8xMDgzNi8zMjE5IDc4NjEvMTA4MzkvMzIxOSA3ODY1LzEwODQwLzMyMTkKK2YgNzg2Ny8xMDg0Mi8zMjIwIDc4NjgvMTA4NDMvMzIyMCA3ODY2LzEwODQxLzMyMjAKK2YgNzg2Ni8xMDg0MS8zMjIwIDc4NjUvMTA4NDAvMzIyMCA3ODY3LzEwODQyLzMyMjAKK2YgNzg2OS8xMDg0NC8zMjIxIDc4NzAvMTA4NDUvMzIyMSA3ODY4LzEwODQ2LzMyMjEKK2YgNzg2OC8xMDg0Ni8zMjIxIDc4NjcvMTA4NDcvMzIyMSA3ODY5LzEwODQ0LzMyMjEKK2YgNzg1NC8xMDg0OC8zMjIyIDc4NTUvMTA4NDkvMzIyMiA3ODcwLzEwODQ1LzMyMjIKK2YgNzg3MC8xMDg0NS8zMjIyIDc4NjkvMTA4NDQvMzIyMiA3ODU0LzEwODQ4LzMyMjIKK2YgNzgyNC8xMDc4MC8zMjIzIDc4MTUvMTA3NzEvMzIyMyA3ODUzLzEwODUwLzMyMjMKK2YgNzg1My8xMDg1MC8zMjI0IDc4NTQvMTA4NTEvMzIyNCA3ODI0LzEwNzgwLzMyMjQKK2YgNzgxNS8xMDc3MS8zMjI1IDc4MTYvMTA3NzIvMzIyNSA3ODU3LzEwODUyLzMyMjUKK2YgNzg1Ny8xMDg1Mi8zMjI2IDc4NTMvMTA4NTAvMzIyNiA3ODE1LzEwNzcxLzMyMjYKK2YgNzgxNi8xMDc3Mi8zMjI3IDc4MTcvMTA1ODMvMzIyNyA3ODU5LzEwNjg0LzMyMjcKK2YgNzg1OS8xMDY4NC8zMjI4IDc4NTcvMTA4NTIvMzIyOCA3ODE2LzEwNzcyLzMyMjgKK2YgODM2Mi8xMDg1My8zMjI5IDgzNjQvMTA4NTQvMzIyOSA3ODYyLzEwNjY4LzMyMjkKK2YgNzg2Mi8xMDY2OC8zMjMwIDc4MTgvMTA2ODUvMzIzMCA4MzYyLzEwODUzLzMyMzAKK2YgNzgxOS8xMDc3NS8zMjMxIDc4MjAvMTA3NzYvMzIzMSA3ODY1LzEwODU1LzMyMzEKK2YgNzg2NS8xMDg0MC8zMjMwIDc4NjEvMTA4MzkvMzIzMCA3ODE5LzEwODU2LzMyMzAKK2YgNzgyMC8xMDc3Ni8zMjMyIDc4MjYvMTA3ODIvMzIzMiA3ODY3LzEwODU3LzMyMzIKK2YgNzg2Ny8xMDg1Ny8zMjMzIDc4NjUvMTA4NTUvMzIzMyA3ODIwLzEwNzc2LzMyMzMKK2YgNzgyNi8xMDc4Mi8zMjM0IDc4MjUvMTA3ODEvMzIzNCA3ODY5LzEwODU4LzMyMzQKK2YgNzg2OS8xMDg1OC8zMjM1IDc4NjcvMTA4NTcvMzIzNSA3ODI2LzEwNzgyLzMyMzUKK2YgNzgyNS8xMDc4MS8zMjM2IDc4MjQvMTA3ODAvMzIzNiA3ODU0LzEwODUxLzMyMzYKK2YgNzg1NC8xMDg1MS8zMjM3IDc4NjkvMTA4NTgvMzIzNyA3ODI1LzEwNzgxLzMyMzcKK2YgNzc1Mi8xMDcxMC82OTcgNzgyNy8xMDc4OC82OTcgNzg0OS8xMDgwNS82OTcKK2YgNzg0OS8xMDgwNS82OTcgNzc1MS8xMDcxMS82OTcgNzc1Mi8xMDcxMC82OTcKK2YgNzgyNy8xMDc4OC82OTcgNzgyOC8xMDgyOS82OTcgNzg1MS8xMDgwNy82OTcKK2YgNzg1MS8xMDgwNy82OTcgNzg0OS8xMDgwNS82OTcgNzgyNy8xMDc4OC82OTcKK2YgNzgzMS8xMDc4Ny82OTcgNzg1Mi8xMDg1OS82OTcgNzg1MS8xMDgwNy82OTcKK2YgNzg1MS8xMDgwNy82OTcgNzgyOC8xMDgyOS82OTcgNzgzMS8xMDc4Ny82OTcKK2YgNzg1Mi8xMDg1OS82OTcgNzgzOS8xMDgwNC82OTcgNzg0OC8xMDgwMy82OTcKK2YgNzg0OC8xMDgwMy82OTcgNzg1MS8xMDgwNy82OTcgNzg1Mi8xMDg1OS82OTcKK2YgNzc2MC8xMDc5NC82OTcgNzc2Mi8xMDg2MC82OTcgNzgzOC8xMDgyNy82OTcKK2YgNzgzOC8xMDgyNy82OTcgNzgzNi8xMDc5NS82OTcgNzc2MC8xMDc5NC82OTcKK2YgNzg1MC8xMDgwNi82OTcgNzg0OC8xMDgwMy82OTcgNzgzMC8xMDc4My82OTcKK2YgNzgzMS8xMDc4Ny82OTcgNzgyOC8xMDgyOS82OTcgNzgwNC8xMDc2OC82OTcKK2YgNzgwNC8xMDc2OC82OTcgNzgxMS8xMDc2Ny82OTcgNzgzMS8xMDc4Ny82OTcKK2YgNzgzOC8xMDgyNy82OTcgNzc2Mi8xMDg2MC82OTcgNzg4OC8xMDgyNi82OTcKK2YgNzg4OC8xMDgyNi82OTcgNzg4Ny8xMDgyNS82OTcgNzgzOC8xMDgyNy82OTcKK2YgNzg0Ny8xMDgwMS82OTcgNzg0Ni8xMDgwMC82OTcgNzg4OC8xMDgyNi82OTcKK2YgNzg4OC8xMDgyNi82OTcgNzg4OS8xMDg2MS82OTcgNzg0Ny8xMDgwMS82OTcKK2YgODI4My8xMDg2Mi82OTcgODMyOC8xMDg2My82OTcgODMzMi8xMDg2NC82OTcKK2YgODMzMi8xMDg2NC82OTcgNzg5MC8xMDg2NS82OTcgODI4My8xMDg2Mi82OTcKK2YgNzgzOS8xMDgwNC82OTcgNzk0MS8xMDgyOC82OTcgNzk0NC8xMDc5Ni82OTcKK2YgNzk0NC8xMDc5Ni82OTcgNzgyOS8xMDc4NC82OTcgNzgzOS8xMDgwNC82OTcKK2YgODMzOC8xMDg2Ni8zMTU5IDgzMzMvMTA4NjcvMzE1OSA3ODkxLzEwNTAzLzMxNTkKK2YgNzg5MS8xMDUwMy8zMTU5IDc4OTYvMTA1MDIvMzE1OSA4MzM4LzEwODY2LzMxNTkKK2YgODMzMy8xMDg2Ny82OTcgODMzNS8xMDg2OC82OTcgNzg5My8xMDUxMS82OTcKK2YgNzg5My8xMDUxMS82OTcgNzg5MS8xMDUwMy82OTcgODMzMy8xMDg2Ny82OTcKK2YgODMzNC8xMDg2OS8zMTcxIDgzMzgvMTA4NzAvMzE3MSA3ODk2LzEwNTMzLzMxNzEKK2YgNzg5Ni8xMDUzMy8zMTcwIDc4OTIvMTA1MzIvMzE3MCA4MzM0LzEwODY5LzMxNzAKK2YgODMzNS8xMDg2OC82OTcgODM0My8xMDg3MS82OTcgNzkwMS8xMDYyOS82OTcKK2YgNzkwMS8xMDYyOS82OTcgNzg5My8xMDUxMS82OTcgODMzNS8xMDg2OC82OTcKK2YgODM0My8xMDg3MS82OTcgODM0Ny8xMDg3Mi82OTcgNzk0OS8xMDg3My82OTcKK2YgNzk0OS8xMDg3My82OTcgNzkwMS8xMDYyOS82OTcgODM0My8xMDg3MS82OTcKK2YgODMyMS8xMDg3NC8zMjA0IDgzMjAvMTA4NzUvMzIwNCA3OTA1LzEwNzA3LzMyMDQKK2YgNzkwNS8xMDcwNy8zMjA0IDc5MDYvMTA3MDYvMzIwNCA4MzIxLzEwODc0LzMyMDQKK2YgODMyMi8xMDg3Ni82OTcgODMyMS8xMDg3NC82OTcgNzkwNi8xMDcwNi82OTcKK2YgNzkwNi8xMDcwNi82OTcgNzkwNy8xMDcxNy82OTcgODMyMi8xMDg3Ni82OTcKK2YgODMyMC8xMDg3Ny8zMjE0IDgzMjMvMTA4NzgvMzIxNCA3OTA4LzEwNzM1LzMyMTQKK2YgNzkwOC8xMDczNS8zMjE0IDc5MDUvMTA3MzQvMzIxNCA4MzIwLzEwODc3LzMyMTQKK2YgODMyOC8xMDg2My82OTcgODMyMi8xMDg3Ni82OTcgNzkwNy8xMDcxNy82OTcKK2YgNzkwNy8xMDcxNy82OTcgNzkxMy8xMDgwMi82OTcgODMyOC8xMDg2My82OTcKK2YgNzg0Ny8xMDgwMS82OTcgNzg4OS8xMDg2MS82OTcgNzkxNy8xMDg3OS82OTcKK2YgNzkxNy8xMDg3OS82OTcgNzkxMy8xMDgwMi82OTcgNzg0Ny8xMDgwMS82OTcKK2YgNzY5MS8xMDYzNi8zMTU5IDc2ODYvMTA2MzUvMzE1OSA3OTE4LzEwNTAwLzMxNTkKK2YgNzkxOC8xMDUwMC8zMTU5IDc5MjMvMTA0OTkvMzE1OSA3NjkxLzEwNjM2LzMxNTkKK2YgNzY4Ni8xMDYzNS82OTcgNzY4OC8xMDYzNy82OTcgNzkyMC8xMDUxMC82OTcKK2YgNzkyMC8xMDUxMC82OTcgNzkxOC8xMDUwMC82OTcgNzY4Ni8xMDYzNS82OTcKK2YgNzY4Ny8xMDYzOS8zMTcwIDc2OTEvMTA2MzgvMzE3MCA3OTIzLzEwNTMwLzMxNzAKK2YgNzkyMy8xMDUzMC8zMTcwIDc5MTkvMTA1MjkvMzE3MCA3Njg3LzEwNjM5LzMxNzAKK2YgNzY5My8xMDY0My82OTcgNzc4MC8xMDY0Mi82OTcgNzkzNi8xMDU0My82OTcKK2YgNzkzNi8xMDU0My82OTcgNzkyNS8xMDU0Mi82OTcgNzY5My8xMDY0My82OTcKK2YgNzY5NC8xMDY0Ny82OTcgNzY5Mi8xMDY0Ni82OTcgNzkyNC8xMDU2My82OTcKK2YgNzkyNC8xMDU2My82OTcgNzkyNi8xMDU2Mi82OTcgNzY5NC8xMDY0Ny82OTcKK2YgNzY5Mi8xMDY0Ni82OTcgNzY5My8xMDY0My82OTcgNzkyNS8xMDU0Mi82OTcKK2YgNzkyNS8xMDU0Mi82OTcgNzkyNC8xMDU2My82OTcgNzY5Mi8xMDY0Ni82OTcKK2YgNzY5NS8xMDY0OS82OTcgNzY5NC8xMDY0Ny82OTcgNzkyNi8xMDU2Mi82OTcKK2YgNzkyNi8xMDU2Mi82OTcgNzkyNy8xMDU3OS82OTcgNzY5NS8xMDY0OS82OTcKK2YgNzcyOS8xMDY1MS82OTcgNzY5NS8xMDY0OS82OTcgNzkyNy8xMDU3OS82OTcKK2YgNzkyNy8xMDU3OS82OTcgNzkyOS8xMDYxNS82OTcgNzcyOS8xMDY1MS82OTcKK2YgNzY5Ni8xMDY1NC82OTcgNzk0Ny8xMDY1Ni82OTcgNzk1MC8xMDYyNC82OTcKK2YgNzk1MC8xMDYyNC82OTcgNzkyOC8xMDYyMy82OTcgNzY5Ni8xMDY1NC82OTcKK2YgNzY4OC8xMDYzNy82OTcgNzY5Ni8xMDY1NC82OTcgNzkyOC8xMDYyMy82OTcKK2YgNzkyOC8xMDYyMy82OTcgNzkyMC8xMDUxMC82OTcgNzY4OC8xMDYzNy82OTcKK2YgNzcyMS8xMDYxMy82OTcgNzYwMC8xMDY5MC82OTcgNzkyMi8xMDY1My82OTcKK2YgNzkyMi8xMDY1My82OTcgNzkyMS8xMDY1Mi82OTcgNzcyMS8xMDYxMy82OTcKK2YgNzYwMC8xMDY5MC82OTcgNzczMS8xMDYzMC82OTcgNzkzMC8xMDY1Ny82OTcKK2YgNzkzMC8xMDY1Ny82OTcgNzkyMi8xMDY1My82OTcgNzYwMC8xMDY5MC82OTcKK2YgNzY4OS8xMDYxOS82OTcgNzcyOS8xMDY1MS82OTcgNzkyOS8xMDYxNS82OTcKK2YgNzkyOS8xMDYxNS82OTcgNzkyMS8xMDY1Mi82OTcgNzY4OS8xMDYxOS82OTcKK2YgNzkzMi8xMDcwNC8zMjA0IDc3NDgvMTA4MDkvMzIwNCA3NzQ3LzEwODA4LzMyMDQKK2YgNzc0Ny8xMDgwOC8zMjA0IDc5MzEvMTA3MDUvMzIwNCA3OTMyLzEwNzA0LzMyMDQKK2YgNzkzMy8xMDcxNS82OTcgNzc1Ni8xMDgxMC82OTcgNzc0OC8xMDgwOS82OTcKK2YgNzc0OC8xMDgwOS82OTcgNzkzMi8xMDcwNC82OTcgNzkzMy8xMDcxNS82OTcKK2YgNzc0Ny8xMDgxMi8zMjEzIDc3NzAvMTA4MTEvMzIxMyA3OTM0LzEwNzMzLzMyMTMKK2YgNzkzNC8xMDczMy8zMjEzIDc5MzEvMTA3MzIvMzIxMyA3NzQ3LzEwODEyLzMyMTMKK2YgNzc4MC8xMDY0Mi82OTcgODM1OS8xMDg4MC82OTcgODM2OC8xMDg4MS82OTcKK2YgODM2OC8xMDg4MS82OTcgNzkzNi8xMDU0My82OTcgNzc4MC8xMDY0Mi82OTcKK2YgNzc5OS8xMDgxOS82OTcgNzc5OC8xMDgxOC82OTcgNzkzNy8xMDg4Mi82OTcKK2YgNzkzNy8xMDg4Mi82OTcgNzkzOC8xMDg4My82OTcgNzc5OS8xMDgxOS82OTcKK2YgNzc3OS8xMDgxNi82OTcgNzc5OS8xMDgxOS82OTcgNzkzOC8xMDg4My82OTcKK2YgNzkzOC8xMDg4My82OTcgNzkzNS8xMDg4NC82OTcgNzc3OS8xMDgxNi82OTcKK2YgNzc5OC8xMDgxOC82OTcgNzgxMi8xMDgyMi82OTcgNzkzOS8xMDc4NS82OTcKK2YgNzkzOS8xMDc4NS82OTcgNzkzNy8xMDg4Mi82OTcgNzc5OC8xMDgxOC82OTcKK2YgNzgxMi8xMDgyMi82OTcgNzgzNS8xMDc5Mi82OTcgNzk0Mi8xMDc4Ni82OTcKK2YgNzk0Mi8xMDc4Ni82OTcgNzkzOS8xMDc4NS82OTcgNzgxMi8xMDgyMi82OTcKK2YgNzg4Ny8xMDgyNS82OTcgNzgzNy8xMDgyNC82OTcgNzk0MC8xMDc5Ny82OTcKK2YgNzk0MC8xMDc5Ny82OTcgNzk0NC8xMDc5Ni82OTcgNzg4Ny8xMDgyNS82OTcKK2YgNzgzNy8xMDgyNC82OTcgNzc1Ni8xMDgxMC82OTcgNzkzMy8xMDcxNS82OTcKK2YgNzkzMy8xMDcxNS82OTcgNzk0MC8xMDc5Ny82OTcgNzgzNy8xMDgyNC82OTcKK2YgNzg1Mi8xMDg1OS82OTcgNzgzMS8xMDc4Ny82OTcgNzk0Mi8xMDc4Ni82OTcKK2YgNzk0Mi8xMDc4Ni82OTcgNzk0My8xMDgyMy82OTcgNzg1Mi8xMDg1OS82OTcKK2YgNzgzOS8xMDgwNC82OTcgNzg1Mi8xMDg1OS82OTcgNzk0My8xMDgyMy82OTcKK2YgNzk0My8xMDgyMy82OTcgNzk0MS8xMDgyOC82OTcgNzgzOS8xMDgwNC82OTcKK2YgNzk0MS8xMDgyOC82OTcgNzgzOC8xMDgyNy82OTcgNzg4Ny8xMDgyNS82OTcKK2YgNzg4Ny8xMDgyNS82OTcgNzk0NC8xMDc5Ni82OTcgNzk0MS8xMDgyOC82OTcKK2YgNzczMi8xMDY5MS82OTcgNzczNC8xMDY1OC82OTcgNzk0Ny8xMDY1Ni82OTcKK2YgNzk0Ny8xMDY1Ni82OTcgNzk0Ni8xMDY1NS82OTcgNzczMi8xMDY5MS82OTcKK2YgNzY4Mi8xMDYyOC82OTcgNzY4MS8xMDYyNy82OTcgNzk0NS8xMDg4NS82OTcKK2YgNzk0NS8xMDg4NS82OTcgNzk0Ni8xMDY1NS82OTcgNzY4Mi8xMDYyOC82OTcKK2YgNzY4MS8xMDYyNy82OTcgNzkwMS8xMDYyOS82OTcgNzk0OS8xMDg3My82OTcKK2YgNzk0OS8xMDg3My82OTcgNzk0NS8xMDg4NS82OTcgNzY4MS8xMDYyNy82OTcKK2YgNzczNC8xMDY1OC82OTcgNzkzMC8xMDY1Ny82OTcgNzk1MC8xMDYyNC82OTcKK2YgNzk1MC8xMDYyNC82OTcgNzk0Ny8xMDY1Ni82OTcgNzczNC8xMDY1OC82OTcKK2YgNzk1MC8xMDYyNC82OTcgNzkzMC8xMDY1Ny82OTcgNzczMS8xMDYzMC82OTcKK2YgNzczMS8xMDYzMC82OTcgNzY4My8xMDYxMS82OTcgNzk1MC8xMDYyNC82OTcKK2YgNzk1Mi8xMDg4Ni8zMjM4IDc5NTEvMTA4ODcvMzIzOCA3OTU0LzEwODg4LzMyMzgKK2YgNzk1NC8xMDg4OC8zMjM4IDc5NTMvMTA4ODkvMzIzOCA3OTUyLzEwODg2LzMyMzgKK2YgNzk1Ni8xMDg5MC8zMjM5IDc5NTUvMTA4OTEvMzIzOSA3OTU4LzEwODkyLzMyMzkKK2YgNzk1OC8xMDg5Mi8zMjQwIDc5NTcvMTA4OTMvMzI0MCA3OTU2LzEwODkwLzMyNDAKK2YgNzk1Ny8xMDg5My8zMjQxIDc5NTgvMTA4OTIvMzI0MSA3OTYwLzEwODk0LzMyNDEKK2YgNzk2MC8xMDg5NC8zMjQyIDc5NTkvMTA4OTUvMzI0MiA3OTU3LzEwODkzLzMyNDIKK2YgNzk2MC8xMDg5NC8zMjQzIDc5NjIvMTA4OTYvMzI0MyA3OTYxLzEwODk3LzMyNDMKK2YgNzk2MS8xMDg5Ny8zMjQ0IDc5NTkvMTA4OTUvMzI0NCA3OTYwLzEwODk0LzMyNDQKK2YgNzk2MS8xMDg5Ny8zMjQ1IDc5NjIvMTA4OTYvMzI0NSA3OTY0LzEwODk4LzMyNDUKK2YgNzk2NC8xMDg5OC8zMjQ2IDc5NjMvMTA4OTkvMzI0NiA3OTYxLzEwODk3LzMyNDYKK2YgNzk2NC8xMDg5OC8zMTU5IDc5NjYvMTA5MDAvMzE1OSA3OTY1LzEwOTAxLzMxNTkKK2YgNzk2NS8xMDkwMS8zMTU5IDc5NjMvMTA4OTkvMzE1OSA3OTY0LzEwODk4LzMxNTkKK2YgNzk2OC8xMDkwMi8zMTU5IDc5NjcvMTA5MDMvMzE1OSA3OTcwLzEwOTA0LzMxNTkKK2YgNzk3MC8xMDkwNC8zMTU5IDc5NjkvMTA5MDUvMzE1OSA3OTY4LzEwOTAyLzMxNTkKK2YgNzk1NS8xMDg5MS82OTcgNzk3Mi8xMDkwNi82OTcgNzk3MS8xMDkwNy82OTcKK2YgNzk3MS8xMDkwNy82OTcgNzk1OC8xMDg5Mi82OTcgNzk1NS8xMDg5MS82OTcKK2YgNzk1OC8xMDg5Mi82OTcgNzk3MS8xMDkwNy82OTcgNzk3My8xMDkwOC82OTcKK2YgNzk3My8xMDkwOC82OTcgNzk2MC8xMDg5NC82OTcgNzk1OC8xMDg5Mi82OTcKK2YgNzk2MC8xMDg5NC82OTcgNzk3My8xMDkwOC82OTcgNzk3NC8xMDkwOS82OTcKK2YgNzk3NC8xMDkwOS82OTcgNzk2Mi8xMDg5Ni82OTcgNzk2MC8xMDg5NC82OTcKK2YgNzk2Mi8xMDg5Ni82OTcgNzk3NC8xMDkwOS82OTcgNzk3NS8xMDkxMC82OTcKK2YgNzk3NS8xMDkxMC82OTcgNzk2NC8xMDg5OC82OTcgNzk2Mi8xMDg5Ni82OTcKK2YgNzk2Ni8xMDkwMC82OTcgNzk2NC8xMDg5OC82OTcgNzk3NS8xMDkxMC82OTcKK2YgNzk3NS8xMDkxMC82OTcgNzk3Ni8xMDkxMS82OTcgNzk2Ni8xMDkwMC82OTcKK2YgNzk3MC8xMDkwNC82OTcgNzk2Ny8xMDkwMy82OTcgNzk3OC8xMDkxMi82OTcKK2YgNzk3OC8xMDkxMi82OTcgNzk3Ny8xMDkxMy82OTcgNzk3MC8xMDkwNC82OTcKK2YgNzk4NS8xMDkxNC8zMjQ3IDc5NTIvMTA5MTUvMzI0NyA3OTUzLzEwOTE2LzMyNDcKK2YgNzk1My8xMDkxNi8zMjQ3IDc5ODYvMTA5MTcvMzI0NyA3OTg1LzEwOTE0LzMyNDcKK2YgNzk4Ny8xMDkxOC8zMjQ4IDc5NTYvMTA5MTkvMzI0OCA3OTU3LzEwOTIwLzMyNDgKK2YgNzk1Ny8xMDkyMC8zMjQ5IDc5ODgvMTA5MjEvMzI0OSA3OTg3LzEwOTE4LzMyNDkKK2YgNzk4OC8xMDkyMS8zMjUwIDc5NTcvMTA5MjAvMzI1MCA3OTU5LzEwOTIyLzMyNTAKK2YgNzk1OS8xMDkyMi8zMjUxIDc5ODkvMTA5MjMvMzI1MSA3OTg4LzEwOTIxLzMyNTEKK2YgNzk4OS8xMDkyNC8zMjUyIDc5NTkvMTA5MjUvMzI1MiA3OTYxLzEwOTI2LzMyNTIKK2YgNzk2MS8xMDkyNi8zMjUzIDc5OTAvMTA5MjcvMzI1MyA3OTg5LzEwOTI0LzMyNTMKK2YgNzk2MS8xMDkyNi8zMjU0IDc5NjMvMTA5MjgvMzI1NCA3OTkxLzEwOTI5LzMyNTQKK2YgNzk5MS8xMDkyOS8zMjU1IDc5OTAvMTA5MjcvMzI1NSA3OTYxLzEwOTI2LzMyNTUKK2YgNzk5MS8xMDkyOS8zMTcxIDc5NjMvMTA5MjgvMzE3MSA3OTY1LzEwOTMwLzMxNzEKK2YgNzk2NS8xMDkzMC8zMTcwIDc5OTIvMTA5MzEvMzE3MCA3OTkxLzEwOTI5LzMxNzAKK2YgNzk5My8xMDkzMi8zMTcwIDc5NjgvMTA5MzMvMzE3MCA3OTY5LzEwOTM0LzMxNzAKK2YgNzk2OS8xMDkzNC8zMTcwIDc5OTQvMTA5MzUvMzE3MCA3OTkzLzEwOTMyLzMxNzAKK2YgNzk5Ni8xMDkzNi8zMjM4IDc5OTUvMTA5MzcvMzIzOCA3OTk4LzEwOTM4LzMyMzgKK2YgNzk5OC8xMDkzOC8zMjM4IDc5OTcvMTA5MzkvMzIzOCA3OTk2LzEwOTM2LzMyMzgKK2YgNzk5Ny8xMDkzOS82OTcgNzk5OC8xMDkzOC82OTcgODAwMC8xMDk0MC82OTcKK2YgODAwMC8xMDk0MC82OTcgNzk5OS8xMDk0MS82OTcgNzk5Ny8xMDkzOS82OTcKK2YgODAwMi8xMDk0Mi82OTcgODAwMS8xMDk0My82OTcgODAwNC8xMDk0NC82OTcKK2YgODAwNC8xMDk0NC82OTcgODAwMy8xMDk0NS82OTcgODAwMi8xMDk0Mi82OTcKK2YgODAwMi8xMDk0Mi82OTcgODAwNS8xMDk0Ni82OTcgODAwNi8xMDk0Ny82OTcKK2YgODAwNi8xMDk0Ny82OTcgODAwMS8xMDk0My82OTcgODAwMi8xMDk0Mi82OTcKK2YgODAxMi8xMDk0OC8zMjU2IDgwMTEvMTA5NDkvMzI1NiA3OTk1LzEwOTUwLzMyNTYKK2YgNzk5NS8xMDk1MC8zMjU3IDc5OTYvMTA5NTEvMzI1NyA4MDEyLzEwOTQ4LzMyNTcKK2YgODAxNC8xMDk1Mi82OTcgODAxMy8xMDk1My82OTcgODAxNi8xMDk1NC82OTcKK2YgODAxNi8xMDk1NC82OTcgODAxNS8xMDk1NS82OTcgODAxNC8xMDk1Mi82OTcKK2YgODAxOC8xMDk1Ni8zMjM4IDgwMTcvMTA5NTcvMzIzOCA4MDIwLzEwOTU4LzMyMzgKK2YgODAyMC8xMDk1OC8zMjM4IDgwMTkvMTA5NTkvMzIzOCA4MDE4LzEwOTU2LzMyMzgKK2YgODAxOS8xMDk1OS82OTcgODAyMC8xMDk1OC82OTcgODAyMi8xMDk2MC82OTcKK2YgODAyMi8xMDk2MC82OTcgODAyMS8xMDk2MS82OTcgODAxOS8xMDk1OS82OTcKK2YgODAyNC8xMDk2Mi82OTcgODAyMy8xMDk2My82OTcgODAyNi8xMDk2NC82OTcKK2YgODAyNi8xMDk2NC82OTcgODAyNS8xMDk2NS82OTcgODAyNC8xMDk2Mi82OTcKK2YgODAzMi8xMDk2Ni8zMjU3IDgwMzEvMTA5NjcvMzI1NyA4MDE3LzEwOTY4LzMyNTcKK2YgODAxNy8xMDk2OC8zMjU4IDgwMTgvMTA5NjkvMzI1OCA4MDMyLzEwOTY2LzMyNTgKK2YgODAwMC8xMDk0MC82OTcgODAzNS8xMDk3MC82OTcgODAxNi8xMDk1NC82OTcKK2YgODAxNi8xMDk1NC82OTcgNzk5OS8xMDk0MS82OTcgODAwMC8xMDk0MC82OTcKK2YgODAyMi8xMDk2MC82OTcgODAxMy8xMDk1My82OTcgODAzNi8xMDk3MS82OTcKK2YgODAzNi8xMDk3MS82OTcgODAyMS8xMDk2MS82OTcgODAyMi8xMDk2MC82OTcKK2YgODAxNy8xMDk1Ny8zMjM4IDc5OTYvMTA5MzYvMzIzOCA3OTk3LzEwOTM5LzMyMzgKK2YgNzk5Ny8xMDkzOS8zMjM4IDgwMjAvMTA5NTgvMzIzOCA4MDE3LzEwOTU3LzMyMzgKK2YgODAyMC8xMDk1OC82OTcgNzk5Ny8xMDkzOS82OTcgNzk5OS8xMDk0MS82OTcKK2YgNzk5OS8xMDk0MS82OTcgODAyMi8xMDk2MC82OTcgODAyMC8xMDk1OC82OTcKK2YgODAyMy8xMDk2My82OTcgODAwMi8xMDk0Mi82OTcgODAwMy8xMDk0NS82OTcKK2YgODAwMy8xMDk0NS82OTcgODAyNi8xMDk2NC82OTcgODAyMy8xMDk2My82OTcKK2YgODAzNy8xMDk3Mi82OTcgODAwNS8xMDk0Ni82OTcgODAwMi8xMDk0Mi82OTcKK2YgODAwMi8xMDk0Mi82OTcgODAyMy8xMDk2My82OTcgODAzNy8xMDk3Mi82OTcKK2YgODAzMS8xMDk2Ny8zMjU3IDgwMTIvMTA5NDgvMzI1NyA3OTk2LzEwOTUxLzMyNTcKK2YgNzk5Ni8xMDk1MS8zMjQ3IDgwMTcvMTA5NjgvMzI0NyA4MDMxLzEwOTY3LzMyNDcKK2YgODAzNS8xMDk3MC82OTcgODAzOC8xMDk3My82OTcgODAxNS8xMDk1NS82OTcKK2YgODAxNS8xMDk1NS82OTcgODAxNi8xMDk1NC82OTcgODAzNS8xMDk3MC82OTcKK2YgODAyMi8xMDk2MC82OTcgNzk5OS8xMDk0MS82OTcgODAxNi8xMDk1NC82OTcKK2YgODAxNi8xMDk1NC82OTcgODAxMy8xMDk1My82OTcgODAyMi8xMDk2MC82OTcKK2YgNzk1Mi8xMDg4Ni8zMjM4IDgwMTgvMTA5NTYvMzIzOCA4MDE5LzEwOTU5LzMyMzgKK2YgODAxOS8xMDk1OS8zMjM4IDc5NTEvMTA4ODcvMzIzOCA3OTUyLzEwODg2LzMyMzgKK2YgNzk1MS8xMDg4Ny82OTcgODAxOS8xMDk1OS82OTcgODAyMS8xMDk2MS82OTcKK2YgODAyMS8xMDk2MS82OTcgODAzOS8xMDk3NC82OTcgNzk1MS8xMDg4Ny82OTcKK2YgODA0MC8xMDk3NS82OTcgODAyNC8xMDk2Mi82OTcgODAyNS8xMDk2NS82OTcKK2YgODAyNS8xMDk2NS82OTcgODA0MS8xMDk3Ni82OTcgODA0MC8xMDk3NS82OTcKK2YgODAzMy8xMDk3Ny82OTcgODA0Mi8xMDk3OC82OTcgODAyNC8xMDk2Mi82OTcKK2YgODAyNC8xMDk2Mi82OTcgODA0MC8xMDk3NS82OTcgODAzMy8xMDk3Ny82OTcKK2YgNzk4NS8xMDkxNC8zMjU3IDgwMzIvMTA5NjYvMzI1NyA4MDE4LzEwOTY5LzMyNTcKK2YgODAxOC8xMDk2OS8zMjU2IDc5NTIvMTA5MTUvMzI1NiA3OTg1LzEwOTE0LzMyNTYKK2YgODAzOS8xMDk3NC82OTcgODAyMS8xMDk2MS82OTcgODAzNi8xMDk3MS82OTcKK2YgODAzNi8xMDk3MS82OTcgODAzNC8xMDk3OS82OTcgODAzOS8xMDk3NC82OTcKK2YgODA0NS8xMDk4MC82OTcgODAxNC8xMDk1Mi82OTcgODAxNS8xMDk1NS82OTcKK2YgODAxNS8xMDk1NS82OTcgODA0Ni8xMDk4MS82OTcgODA0NS8xMDk4MC82OTcKK2YgODA0Ni8xMDk4MS82OTcgODAxNS8xMDk1NS82OTcgODAzOC8xMDk3My82OTcKK2YgODAzOC8xMDk3My82OTcgODA0Ny8xMDk4Mi82OTcgODA0Ni8xMDk4MS82OTcKK2YgODA0OC8xMDk4My82OTcgODAwNi8xMDk0Ny82OTcgODAwNS8xMDk0Ni82OTcKK2YgODAwNS8xMDk0Ni82OTcgODA0OS8xMDk4NC82OTcgODA0OC8xMDk4My82OTcKK2YgODA0OS8xMDk4NC82OTcgODAwNS8xMDk0Ni82OTcgODAzNy8xMDk3Mi82OTcKK2YgODAzNy8xMDk3Mi82OTcgODA1MC8xMDk4NS82OTcgODA0OS8xMDk4NC82OTcKK2YgODA0Mi8xMDk3OC82OTcgODA1MS8xMDk4Ni82OTcgODA1Mi8xMDk4Ny82OTcKK2YgODA1Mi8xMDk4Ny82OTcgODAyNC8xMDk2Mi82OTcgODA0Mi8xMDk3OC82OTcKK2YgODAxMy8xMDk1My82OTcgODAxNC8xMDk1Mi82OTcgODA1My8xMDk4OC82OTcKK2YgODA1My8xMDk4OC82OTcgODAzNi8xMDk3MS82OTcgODAxMy8xMDk1My82OTcKK2YgODA1NC8xMDk4OS82OTcgODA1My8xMDk4OC82OTcgODAxNC8xMDk1Mi82OTcKK2YgODAxNC8xMDk1Mi82OTcgODA0NS8xMDk4MC82OTcgODA1NC8xMDk4OS82OTcKK2YgODA1MS8xMDk4Ni82OTcgODA1NS8xMDk5MC82OTcgODA1Ni8xMDk5MS82OTcKK2YgODA1Ni8xMDk5MS82OTcgODA1Mi8xMDk4Ny82OTcgODA1MS8xMDk4Ni82OTcKK2YgODA1MS8xMDk4Ni82OTcgODA1My8xMDk4OC82OTcgODA1NC8xMDk4OS82OTcKK2YgODA1NC8xMDk4OS82OTcgODA1NS8xMDk5MC82OTcgODA1MS8xMDk4Ni82OTcKK2YgODAzNy8xMDk3Mi82OTcgODA1Mi8xMDk4Ny82OTcgODA1Ni8xMDk5MS82OTcKK2YgODA1Ni8xMDk5MS82OTcgODA1MC8xMDk4NS82OTcgODAzNy8xMDk3Mi82OTcKK2YgODA0Mi8xMDk3OC82OTcgODAzNi8xMDk3MS82OTcgODA1My8xMDk4OC82OTcKK2YgODA1My8xMDk4OC82OTcgODA1MS8xMDk4Ni82OTcgODA0Mi8xMDk3OC82OTcKK2YgODAyNC8xMDk2Mi82OTcgODA1Mi8xMDk4Ny82OTcgODAzNy8xMDk3Mi82OTcKK2YgODAzNy8xMDk3Mi82OTcgODAyMy8xMDk2My82OTcgODAyNC8xMDk2Mi82OTcKK2YgNzk3NC8xMDkwOS82OTcgODA2Mi8xMDk5Mi82OTcgODA2MS8xMDk5My82OTcKK2YgODA2MS8xMDk5My82OTcgNzk3NS8xMDkxMC82OTcgNzk3NC8xMDkwOS82OTcKK2YgODA0Mi8xMDk3OC82OTcgODAzMy8xMDk3Ny82OTcgODAzNC8xMDk3OS82OTcKK2YgODAzNC8xMDk3OS82OTcgODAzNi8xMDk3MS82OTcgODA0Mi8xMDk3OC82OTcKK2YgNzk1NC8xMDg4OC82OTcgNzk1MS8xMDg4Ny82OTcgODAzOS8xMDk3NC82OTcKK2YgODAzOS8xMDk3NC82OTcgODA2NC8xMDk5NC82OTcgNzk1NC8xMDg4OC82OTcKK2YgODA1Ny8xMDk5NS82OTcgODA0MC8xMDk3NS82OTcgODA0MS8xMDk3Ni82OTcKK2YgODA0MS8xMDk3Ni82OTcgODA2NS8xMDk5Ni82OTcgODA1Ny8xMDk5NS82OTcKK2YgODAzOS8xMDk3NC82OTcgODAzNC8xMDk3OS82OTcgODA1OC8xMDk5Ny82OTcKK2YgODA1OC8xMDk5Ny82OTcgODA2NC8xMDk5NC82OTcgODAzOS8xMDk3NC82OTcKK2YgNzk2OC8xMDkwMi8zMTU5IDgwNjgvMTA5OTgvMzE1OSA4MDY5LzEwOTk5LzMxNTkKK2YgODA2OS8xMDk5OS8zMTU5IDc5NjcvMTA5MDMvMzE1OSA3OTY4LzEwOTAyLzMxNTkKK2YgNzk2Ny8xMDkwMy82OTcgODA2OS8xMDk5OS82OTcgODA3MC8xMTAwMC82OTcKK2YgODA3MC8xMTAwMC82OTcgNzk3OC8xMDkxMi82OTcgNzk2Ny8xMDkwMy82OTcKK2YgODA3MS8xMTAwMS82OTcgNzk4MC8xMTAwMi82OTcgNzk4MS8xMTAwMy82OTcKK2YgNzk4MS8xMTAwMy82OTcgODA3Mi8xMTAwNC82OTcgODA3MS8xMTAwMS82OTcKK2YgODA2MS8xMDk5My82OTcgODA3NC8xMTAwNS82OTcgODA3My8xMTAwNi82OTcKK2YgNzk5My8xMDkzMi8zMTcwIDgwNzUvMTEwMDcvMzE3MCA4MDY4LzExMDA4LzMxNzAKK2YgODA2OC8xMTAwOC8zMTcwIDc5NjgvMTA5MzMvMzE3MCA3OTkzLzEwOTMyLzMxNzAKK2YgODA3MC8xMTAwMC82OTcgODA4Mi8xMTAwOS82OTcgODA4My8xMTAxMC82OTcKK2YgODA4My8xMTAxMC82OTcgNzk3OC8xMDkxMi82OTcgODA3MC8xMTAwMC82OTcKK2YgNzk3OC8xMDkxMi82OTcgODA4My8xMTAxMC82OTcgODA4NC8xMTAxMS82OTcKK2YgODA4NC8xMTAxMS82OTcgNzk3Ny8xMDkxMy82OTcgNzk3OC8xMDkxMi82OTcKK2YgODA2MS8xMDk5My82OTcgODA2Mi8xMDk5Mi82OTcgODA4Ni8xMTAxMi82OTcKK2YgODA4Ni8xMTAxMi82OTcgODA4NS8xMTAxMy82OTcgODA2MS8xMDk5My82OTcKK2YgNzk3NS8xMDkxMC82OTcgODA2MS8xMDk5My82OTcgODA3My8xMTAwNi82OTcKK2YgODA3My8xMTAwNi82OTcgNzk3Ni8xMDkxMS82OTcgNzk3NS8xMDkxMC82OTcKK2YgODA4Ny8xMTAxNC82OTcgODA4OC8xMTAxNS82OTcgNzk3My8xMDkwOC82OTcKK2YgNzk3My8xMDkwOC82OTcgNzk3MS8xMDkwNy82OTcgODA4Ny8xMTAxNC82OTcKK2YgNzk3My8xMDkwOC82OTcgODA4OC8xMTAxNS82OTcgODA2Mi8xMDk5Mi82OTcKK2YgODA2Mi8xMDk5Mi82OTcgNzk3NC8xMDkwOS82OTcgNzk3My8xMDkwOC82OTcKK2YgODA4OC8xMTAxNS82OTcgODA4Ny8xMTAxNC82OTcgODA4OS8xMTAxNi82OTcKK2YgODA4OS8xMTAxNi82OTcgODA4Ni8xMTAxMi82OTcgODA4OC8xMTAxNS82OTcKK2YgODA2OC8xMDk5OC8zMTU5IDgwOTAvMTEwMTcvMzE1OSA4MDkxLzExMDE4LzMxNTkKK2YgODA5MS8xMTAxOC8zMTU5IDgwNjkvMTA5OTkvMzE1OSA4MDY4LzEwOTk4LzMxNTkKK2YgODA2OS8xMDk5OS82OTcgODA5MS8xMTAxOC82OTcgODA5Mi8xMTAxOS82OTcKK2YgODA5Mi8xMTAxOS82OTcgODA3MC8xMTAwMC82OTcgODA2OS8xMDk5OS82OTcKK2YgODA3NS8xMTAwNy8zMTcwIDgwOTMvMTEwMjAvMzE3MCA4MDkwLzExMDIxLzMxNzAKK2YgODA5MC8xMTAyMS8zMTcwIDgwNjgvMTEwMDgvMzE3MCA4MDc1LzExMDA3LzMxNzAKK2YgODA3Ni8xMTAyMi82OTcgODA5NC8xMTAyMy82OTcgODA5NS8xMTAyNC82OTcKK2YgODA5NS8xMTAyNC82OTcgODA3Ny8xMTAyNS82OTcgODA3Ni8xMTAyMi82OTcKK2YgODA3OC8xMTAyNi82OTcgODA5Ni8xMTAyNy82OTcgODA5Ny8xMTAyOC82OTcKK2YgODA5Ny8xMTAyOC82OTcgODA3OS8xMTAyOS82OTcgODA3OC8xMTAyNi82OTcKK2YgODA3OS8xMTAyOS82OTcgODA5Ny8xMTAyOC82OTcgODA5NC8xMTAyMy82OTcKK2YgODA5NC8xMTAyMy82OTcgODA3Ni8xMTAyMi82OTcgODA3OS8xMTAyOS82OTcKK2YgODA4MC8xMTAzMC82OTcgODA5OC8xMTAzMS82OTcgODA5Ni8xMTAyNy82OTcKK2YgODA5Ni8xMTAyNy82OTcgODA3OC8xMTAyNi82OTcgODA4MC8xMTAzMC82OTcKK2YgNzk4MC8xMTAwMi82OTcgODA3MS8xMTAwMS82OTcgODA5OS8xMTAzMi82OTcKK2YgODA5OS8xMTAzMi82OTcgODA4MS8xMTAzMy82OTcgNzk4MC8xMTAwMi82OTcKK2YgODEwMC8xMTAzNC82OTcgODA3MS8xMTAwMS82OTcgODA3Mi8xMTAwNC82OTcKK2YgODA3Mi8xMTAwNC82OTcgODEwMS8xMTAzNS82OTcgODEwMC8xMTAzNC82OTcKK2YgODEwMy8xMTAzNi82OTcgODA4Mi8xMTAwOS82OTcgODEwMi8xMTAzNy82OTcKK2YgODEwMi8xMTAzNy82OTcgODEwNC8xMTAzOC82OTcgODEwMy8xMTAzNi82OTcKK2YgODA3MC8xMTAwMC82OTcgODA5Mi8xMTAxOS82OTcgODEwMi8xMTAzNy82OTcKK2YgODEwMi8xMTAzNy82OTcgODA4Mi8xMTAwOS82OTcgODA3MC8xMTAwMC82OTcKK2YgODEwMS8xMTAzNS82OTcgODA3Mi8xMTAwNC82OTcgODEwNi8xMTAzOS82OTcKK2YgODEwNi8xMTAzOS82OTcgODEwNS8xMTA0MC82OTcgODEwMS8xMTAzNS82OTcKK2YgODA1Ny8xMDk5NS82OTcgODI5MS8xMTA0MS82OTcgODAzMy8xMDk3Ny82OTcKK2YgODAzMy8xMDk3Ny82OTcgODA0MC8xMDk3NS82OTcgODA1Ny8xMDk5NS82OTcKK2YgODEwNy8xMTA0Mi8zMjU5IDgxMTAvMTEwNDMvMzI1OSA4MTA5LzExMDQ0LzMyNTkKK2YgODEwOS8xMTA0NC8zMjU5IDgxMDgvMTEwNDUvMzI1OSA4MTA3LzExMDQyLzMyNTkKK2YgODExMS8xMTA0Ni8zMjYwIDgxMTIvMTEwNDcvMzI2MCA4MTEwLzExMDQzLzMyNjAKK2YgODExMC8xMTA0My8zMjYwIDgxMDcvMTEwNDIvMzI2MCA4MTExLzExMDQ2LzMyNjAKK2YgODExMy8xMTA0OC8zMjE5IDgxMTQvMTEwNDkvMzIxOSA4MTEyLzExMDQ3LzMyMTkKK2YgODExMi8xMTA0Ny8zMjE5IDgxMTEvMTEwNDYvMzIxOSA4MTEzLzExMDQ4LzMyMTkKK2YgODExNS8xMTA1MC8yNjc5IDgxMTgvMTEwNTEvMjY3OSA4MTE3LzExMDUyLzI2NzkKK2YgODExNy8xMTA1Mi8yNjc5IDgxMTYvMTEwNTMvMjY3OSA4MTE1LzExMDUwLzI2NzkKK2YgODExOS8xMTA1NC8yNjc5IDgxMjAvMTEwNTUvMjY3OSA4MTE4LzExMDUxLzI2NzkKK2YgODExOC8xMTA1MS8yNjc5IDgxMTUvMTEwNTAvMjY3OSA4MTE5LzExMDU0LzI2NzkKK2YgODEyMS8xMTA1Ni8zMjYxIDgxMjIvMTEwNTcvMzI2MSA4MTIwLzExMDU1LzMyNjEKK2YgODEyMC8xMTA1NS8zMjYxIDgxMTkvMTEwNTQvMzI2MSA4MTIxLzExMDU2LzMyNjEKK2YgODEyMy8xMTA1OC8zMjYyIDgxMjQvMTEwNTkvMzI2MiA4MTIyLzExMDYwLzMyNjIKK2YgODEyMi8xMTA2MC8zMjYyIDgxMjEvMTEwNjEvMzI2MiA4MTIzLzExMDU4LzMyNjIKK2YgODEwOC8xMTA2Mi8zMjYzIDgxMDkvMTEwNjMvMzI2MyA4MTI0LzExMDU5LzMyNjMKK2YgODEyNC8xMTA1OS8zMjYzIDgxMjMvMTEwNTgvMzI2MyA4MTA4LzExMDYyLzMyNjMKK2YgODA1NC8xMDk4OS8zMjY0IDgwNDUvMTA5ODAvMzI2NCA4MTA3LzExMDY0LzMyNjQKK2YgODEwNy8xMTA2NC8zMjY1IDgxMDgvMTEwNjUvMzI2NSA4MDU0LzEwOTg5LzMyNjUKK2YgODA0NS8xMTA2Ni8zMjY2IDgwNDYvMTEwNjcvMzI2NiA4MTExLzExMDQ2LzMyNjYKK2YgODExMS8xMTA2OC8zMjY3IDgxMDcvMTEwNjQvMzI2NyA4MDQ1LzEwOTgwLzMyNjcKK2YgODA0Ni8xMTA2Ny8zMjMwIDgwNDcvMTEwNjkvMzIzMCA4MTEzLzExMDQ4LzMyMzAKK2YgODExMy8xMTA0OC8zMjY4IDgxMTEvMTEwNDYvMzI2OCA4MDQ2LzExMDY3LzMyNjgKK2YgODA0OC8xMDk4My8zMjI4IDgwNDkvMTA5ODQvMzIyOCA4MTE1LzExMDcwLzMyMjgKK2YgODExNS8xMTA3MC8zMjI3IDgxMTYvMTEwNzEvMzIyNyA4MDQ4LzEwOTgzLzMyMjcKK2YgODA0OS8xMDk4NC8zMjY5IDgwNTAvMTA5ODUvMzI2OSA4MTE5LzExMDcyLzMyNjkKK2YgODExOS8xMTA3Mi8zMjI4IDgxMTUvMTEwNzAvMzIyOCA4MDQ5LzEwOTg0LzMyMjgKK2YgODA1MC8xMDk4NS8zMjcwIDgwNTYvMTA5OTEvMzI3MCA4MTIxLzExMDczLzMyNzAKK2YgODEyMS8xMTA3My8zMjcxIDgxMTkvMTEwNzIvMzI3MSA4MDUwLzEwOTg1LzMyNzEKK2YgODA1Ni8xMDk5MS8zMjcyIDgwNTUvMTA5OTAvMzI3MiA4MTIzLzExMDc0LzMyNzIKK2YgODEyMy8xMTA3NC8zMjczIDgxMjEvMTEwNzMvMzI3MyA4MDU2LzEwOTkxLzMyNzMKK2YgODA1NS8xMDk5MC8zMjc0IDgwNTQvMTA5ODkvMzI3NCA4MTA4LzExMDY1LzMyNzQKK2YgODEwOC8xMTA2NS8zMjc1IDgxMjMvMTEwNzQvMzI3NSA4MDU1LzEwOTkwLzMyNzUKK2YgNzk3Mi8xMDkwNi82OTcgODA1OS8xMTA3NS82OTcgODA4Ny8xMTAxNC82OTcKK2YgODA4Ny8xMTAxNC82OTcgNzk3MS8xMDkwNy82OTcgNzk3Mi8xMDkwNi82OTcKK2YgODA1OS8xMTA3NS82OTcgODA2MC8xMTA3Ni82OTcgODA4OS8xMTAxNi82OTcKK2YgODA4OS8xMTAxNi82OTcgODA4Ny8xMTAxNC82OTcgODA1OS8xMTA3NS82OTcKK2YgODA2My8xMTA3Ny82OTcgODEyNS8xMTA3OC82OTcgODA4OS8xMTAxNi82OTcKK2YgODA4OS8xMTAxNi82OTcgODA2MC8xMTA3Ni82OTcgODA2My8xMTA3Ny82OTcKK2YgNzk1Ni8xMDg5MC8zMjM4IDc5NTMvMTA4ODkvMzIzOCA3OTU0LzEwODg4LzMyMzgKK2YgNzk1NC8xMDg4OC8zMjM4IDc5NTUvMTA4OTEvMzIzOCA3OTU2LzEwODkwLzMyMzgKK2YgNzk4Ny8xMDkxOC8zMjc2IDc5ODYvMTA5MTcvMzI3NiA3OTUzLzEwOTE2LzMyNzYKK2YgNzk1My8xMDkxNi8zMjQ3IDc5NTYvMTA5MTkvMzI0NyA3OTg3LzEwOTE4LzMyNDcKK2YgNzk1NS8xMDg5MS82OTcgNzk1NC8xMDg4OC82OTcgODA2NC8xMDk5NC82OTcKK2YgODA2NC8xMDk5NC82OTcgNzk3Mi8xMDkwNi82OTcgNzk1NS8xMDg5MS82OTcKK2YgNzk3Mi8xMDkwNi82OTcgODA2NC8xMDk5NC82OTcgODA1OC8xMDk5Ny82OTcKK2YgODA1OC8xMDk5Ny82OTcgODA1OS8xMTA3NS82OTcgNzk3Mi8xMDkwNi82OTcKK2YgODA2My8xMTA3Ny82OTcgODA1Ny8xMDk5NS82OTcgODA2NS8xMDk5Ni82OTcKK2YgODA2NS8xMDk5Ni82OTcgODEwMC8xMTAzNC82OTcgODA2My8xMTA3Ny82OTcKK2YgODA4MC8xMTAzMC82OTcgODA4MS8xMTAzMy82OTcgODA5OS8xMTAzMi82OTcKK2YgODA5OS8xMTAzMi82OTcgODA5OC8xMTAzMS82OTcgODA4MC8xMTAzMC82OTcKK2YgODEyNS8xMTA3OC82OTcgODA4NS8xMTAxMy82OTcgODA4Ni8xMTAxMi82OTcKK2YgODA4Ni8xMTAxMi82OTcgODA4OS8xMTAxNi82OTcgODEyNS8xMTA3OC82OTcKK2YgNzk4MS8xMTAwMy82OTcgNzk4My8xMTA3OS82OTcgODEwNi8xMTAzOS82OTcKK2YgODEwNi8xMTAzOS82OTcgODA3Mi8xMTAwNC82OTcgNzk4MS8xMTAwMy82OTcKK2YgODA4OC8xMTAxNS82OTcgODA4Ni8xMTAxMi82OTcgODA2Mi8xMDk5Mi82OTcKK2YgODEzMC8xMTA4MC8zMjM4IDgxMzMvMTEwODEvMzIzOCA4MTMyLzExMDgyLzMyMzgKK2YgODEzMi8xMTA4Mi8zMjM4IDgxMzEvMTEwODMvMzIzOCA4MTMwLzExMDgwLzMyMzgKK2YgODEzMi8xMTA4Mi8zMjc3IDgxMzUvMTEwODQvMzI3NyA4MTM0LzExMDg1LzMyNzcKK2YgODEzNC8xMTA4NS8zMjc4IDgxMzEvMTEwODMvMzI3OCA4MTMyLzExMDgyLzMyNzgKK2YgODEzNS8xMTA4NC8zMjc5IDgxMzcvMTEwODYvMzI3OSA4MTM2LzExMDg3LzMyNzkKK2YgODEzNi8xMTA4Ny8zMjgwIDgxMzQvMTEwODUvMzI4MCA4MTM1LzExMDg0LzMyODAKK2YgODEzNi8xMTA4Ny8zMjgxIDgxMzcvMTEwODYvMzI4MSA4MTM5LzExMDg4LzMyODEKK2YgODEzOS8xMTA4OC8zMjgyIDgxMzgvMTEwODkvMzI4MiA4MTM2LzExMDg3LzMyODIKK2YgODEzOS8xMTA4OC8zMjgzIDgxNDEvMTEwOTAvMzI4MyA4MTQwLzExMDkxLzMyODMKK2YgODE0MC8xMTA5MS8zMjg0IDgxMzgvMTEwODkvMzI4NCA4MTM5LzExMDg4LzMyODQKK2YgODE0MC8xMTA5MS8zMjA0IDgxNDEvMTEwOTAvMzIwNCA4MTQzLzExMDkyLzMyMDQKK2YgODE0My8xMTA5Mi8zMjA0IDgxNDIvMTEwOTMvMzIwNCA4MTQwLzExMDkxLzMyMDQKK2YgODE0NS8xMTA5NC8zMjA0IDgxNDQvMTEwOTUvMzIwNCA4MTQ3LzExMDk2LzMyMDQKK2YgODE0Ny8xMTA5Ni8zMjA0IDgxNDYvMTEwOTcvMzIwNCA4MTQ1LzExMDk0LzMyMDQKK2YgODEzMS8xMTA4My82OTcgODEzNC8xMTA4NS82OTcgODE0OS8xMTA5OC82OTcKK2YgODE0OS8xMTA5OC82OTcgODE0OC8xMTA5OS82OTcgODEzMS8xMTA4My82OTcKK2YgODEzNC8xMTA4NS82OTcgODEzNi8xMTA4Ny82OTcgODE1MC8xMTEwMC82OTcKK2YgODE1MC8xMTEwMC82OTcgODE0OS8xMTA5OC82OTcgODEzNC8xMTA4NS82OTcKK2YgODEzNi8xMTA4Ny82OTcgODEzOC8xMTA4OS82OTcgODE1MS8xMTEwMS82OTcKK2YgODE1MS8xMTEwMS82OTcgODE1MC8xMTEwMC82OTcgODEzNi8xMTA4Ny82OTcKK2YgODEzOC8xMTA4OS82OTcgODE0MC8xMTA5MS82OTcgODE1Mi8xMTEwMi82OTcKK2YgODE1Mi8xMTEwMi82OTcgODE1MS8xMTEwMS82OTcgODEzOC8xMTA4OS82OTcKK2YgODE1Mi8xMTEwMi82OTcgODE0MC8xMTA5MS82OTcgODE0Mi8xMTA5My82OTcKK2YgODE0Mi8xMTA5My82OTcgODE1My8xMTEwMy82OTcgODE1Mi8xMTEwMi82OTcKK2YgODE1NC8xMTEwNC82OTcgODE0NC8xMTA5NS82OTcgODE0NS8xMTA5NC82OTcKK2YgODE0NS8xMTA5NC82OTcgODE1NS8xMTEwNS82OTcgODE1NC8xMTEwNC82OTcKK2YgODEzMy8xMTEwNi8zMjc2IDgxNjMvMTExMDcvMzI3NiA4MTYyLzExMTA4LzMyNzYKK2YgODE2Mi8xMTEwOC8zMjU2IDgxMzIvMTExMDkvMzI1NiA4MTMzLzExMTA2LzMyNTYKK2YgODE2Mi8xMTEwOC8zMjg1IDgxNjQvMTExMTAvMzI4NSA4MTM1LzExMTExLzMyODUKK2YgODEzNS8xMTExMS8zMjg2IDgxMzIvMTExMDkvMzI4NiA4MTYyLzExMTA4LzMyODYKK2YgODE2NC8xMTExMC8zMjg3IDgxNjUvMTExMTIvMzI4NyA4MTM3LzExMTEzLzMyODcKK2YgODEzNy8xMTExMy8zMjg4IDgxMzUvMTExMTEvMzI4OCA4MTY0LzExMTEwLzMyODgKK2YgODE2NS8xMTExNC8zMjg5IDgxNjYvMTExMTUvMzI4OSA4MTM5LzExMTE2LzMyODkKK2YgODEzOS8xMTExNi8zMjkwIDgxMzcvMTExMTcvMzI5MCA4MTY1LzExMTE0LzMyOTAKK2YgODEzOS8xMTExNi8zMjkxIDgxNjYvMTExMTUvMzI5MSA4MTY3LzExMTE4LzMyOTEKK2YgODE2Ny8xMTExOC8zMjkyIDgxNDEvMTExMTkvMzI5MiA4MTM5LzExMTE2LzMyOTIKK2YgODE0My8xMTEyMC8zMjEzIDgxNDEvMTExMTkvMzIxMyA4MTY3LzExMTE4LzMyMTMKK2YgODE2Ny8xMTExOC8zMjEzIDgxNjgvMTExMjEvMzIxMyA4MTQzLzExMTIwLzMyMTMKK2YgODE0Ni8xMTEyMi8zMjE0IDgxNDcvMTExMjMvMzIxNCA4MTcwLzExMTI0LzMyMTQKK2YgODE3MC8xMTEyNC8zMjE0IDgxNjkvMTExMjUvMzIxNCA4MTQ2LzExMTIyLzMyMTQKK2YgODE3Mi8xMTEyNi8zMjM4IDgxNzEvMTExMjcvMzIzOCA3OTk4LzEwOTM4LzMyMzgKK2YgNzk5OC8xMDkzOC8zMjM4IDc5OTUvMTA5MzcvMzIzOCA4MTcyLzExMTI2LzMyMzgKK2YgODE3MS8xMTEyNy82OTcgODE3My8xMTEyOC82OTcgODAwMC8xMDk0MC82OTcKK2YgODAwMC8xMDk0MC82OTcgNzk5OC8xMDkzOC82OTcgODE3MS8xMTEyNy82OTcKK2YgODM3MC8xMTEyOS82OTcgODM2OS8xMTEzMC82OTcgODAwNC8xMDk0NC82OTcKK2YgODAwNC8xMDk0NC82OTcgODAwMS8xMDk0My82OTcgODM3MC8xMTEyOS82OTcKK2YgODE3NS8xMTEzMS82OTcgODM5OC8xMTEzMi82OTcgODM5OS8xMTEzMy82OTcKK2YgODM5OS8xMTEzMy82OTcgODE3Ni8xMTEzNC82OTcgODE3NS8xMTEzMS82OTcKK2YgODE3OS8xMTEzNS8zMjc2IDgxNzIvMTExMzYvMzI3NiA3OTk1LzEwOTUwLzMyNzYKK2YgNzk5NS8xMDk1MC8zMjU2IDgwMTEvMTA5NDkvMzI1NiA4MTc5LzExMTM1LzMyNTYKK2YgODE4My8xMTEzNy82OTcgODE4Mi8xMTEzOC82OTcgODE4MS8xMTEzOS82OTcKK2YgODE4MS8xMTEzOS82OTcgODE4MC8xMTE0MC82OTcgODE4My8xMTEzNy82OTcKK2YgODE4Ny8xMTE0MS8zMjM4IDgxODYvMTExNDIvMzIzOCA4MTg1LzExMTQzLzMyMzgKK2YgODE4NS8xMTE0My8zMjM4IDgxODQvMTExNDQvMzIzOCA4MTg3LzExMTQxLzMyMzgKK2YgODE4Ni8xMTE0Mi82OTcgODE4OS8xMTE0NS82OTcgODE4OC8xMTE0Ni82OTcKK2YgODE4OC8xMTE0Ni82OTcgODE4NS8xMTE0My82OTcgODE4Ni8xMTE0Mi82OTcKK2YgODE5MS8xMTE0Ny82OTcgODE5MC8xMTE0OC82OTcgODE5My8xMTE0OS82OTcKK2YgODE5My8xMTE0OS82OTcgODE5Mi8xMTE1MC82OTcgODE5MS8xMTE0Ny82OTcKK2YgODE5OS8xMTE1MS8zMjQ3IDgxODcvMTExNTIvMzI0NyA4MTg0LzExMTUzLzMyNDcKK2YgODE4NC8xMTE1My8zMjc2IDgxOTgvMTExNTQvMzI3NiA4MTk5LzExMTUxLzMyNzYKK2YgODAwMC8xMDk0MC82OTcgODE3My8xMTEyOC82OTcgODE4MS8xMTEzOS82OTcKK2YgODE4MS8xMTEzOS82OTcgODAzNS8xMDk3MC82OTcgODAwMC8xMDk0MC82OTcKK2YgODE4OC8xMTE0Ni82OTcgODE4OS8xMTE0NS82OTcgODIwMC8xMTE1NS82OTcKK2YgODIwMC8xMTE1NS82OTcgODE4MC8xMTE0MC82OTcgODE4OC8xMTE0Ni82OTcKK2YgODE4NC8xMTE0NC8zMjM4IDgxODUvMTExNDMvMzIzOCA4MTcxLzExMTI3LzMyMzgKK2YgODE3MS8xMTEyNy8zMjM4IDgxNzIvMTExMjYvMzIzOCA4MTg0LzExMTQ0LzMyMzgKK2YgODE4NS8xMTE0My82OTcgODE4OC8xMTE0Ni82OTcgODE3My8xMTEyOC82OTcKK2YgODE3My8xMTEyOC82OTcgODE3MS8xMTEyNy82OTcgODE4NS8xMTE0My82OTcKK2YgODE3NC8xMTE1Ni82OTcgODE3NS8xMTEzMS82OTcgODE5MC8xMTE0OC82OTcKK2YgODE5MC8xMTE0OC82OTcgODE5MS8xMTE0Ny82OTcgODE3NC8xMTE1Ni82OTcKK2YgODIwMS8xMTE1Ny82OTcgODE5MC8xMTE0OC82OTcgODE3NS8xMTEzMS82OTcKK2YgODE3NS8xMTEzMS82OTcgODE3Ni8xMTEzNC82OTcgODIwMS8xMTE1Ny82OTcKK2YgODE5OC8xMTE1NC8zMjkzIDgxODQvMTExNTMvMzI5MyA4MTcyLzExMTM2LzMyOTMKK2YgODE3Mi8xMTEzNi8zMjk0IDgxNzkvMTExMzUvMzI5NCA4MTk4LzExMTU0LzMyOTQKK2YgODAzNS8xMDk3MC82OTcgODE4MS8xMTEzOS82OTcgODE4Mi8xMTEzOC82OTcKK2YgODE4Mi8xMTEzOC82OTcgODAzOC8xMDk3My82OTcgODAzNS8xMDk3MC82OTcKK2YgODE4OC8xMTE0Ni82OTcgODE4MC8xMTE0MC82OTcgODE4MS8xMTEzOS82OTcKK2YgODE4MS8xMTEzOS82OTcgODE3My8xMTEyOC82OTcgODE4OC8xMTE0Ni82OTcKK2YgODEzMy8xMTA4MS8zMjM4IDgxMzAvMTEwODAvMzIzOCA4MTg2LzExMTQyLzMyMzgKK2YgODE4Ni8xMTE0Mi8zMjM4IDgxODcvMTExNDEvMzIzOCA4MTMzLzExMDgxLzMyMzgKK2YgODEzMC8xMTA4MC82OTcgODIwMi8xMTE1OC82OTcgODE4OS8xMTE0NS82OTcKK2YgODE4OS8xMTE0NS82OTcgODE4Ni8xMTE0Mi82OTcgODEzMC8xMTA4MC82OTcKK2YgODE5Mi8xMTE1MC82OTcgODE5My8xMTE0OS82OTcgODIwNC8xMTE1OS82OTcKK2YgODIwNC8xMTE1OS82OTcgODIwMy8xMTE2MC82OTcgODE5Mi8xMTE1MC82OTcKK2YgODIwNi8xMTE2MS82OTcgODIwNC8xMTE1OS82OTcgODE5My8xMTE0OS82OTcKK2YgODE5My8xMTE0OS82OTcgODIwNS8xMTE2Mi82OTcgODIwNi8xMTE2MS82OTcKK2YgODE2My8xMTEwNy8zMjk1IDgxMzMvMTExMDYvMzI5NSA4MTg3LzExMTUyLzMyOTUKK2YgODE4Ny8xMTE1Mi8zMjk0IDgxOTkvMTExNTEvMzI5NCA4MTYzLzExMTA3LzMyOTQKK2YgODIwMi8xMTE1OC82OTcgODIwOS8xMTE2My82OTcgODIwMC8xMTE1NS82OTcKK2YgODIwMC8xMTE1NS82OTcgODE4OS8xMTE0NS82OTcgODIwMi8xMTE1OC82OTcKK2YgODIxMS8xMTE2NC82OTcgODIxMC8xMTE2NS82OTcgODE4Mi8xMTEzOC82OTcKK2YgODE4Mi8xMTEzOC82OTcgODE4My8xMTEzNy82OTcgODIxMS8xMTE2NC82OTcKK2YgODIxMC8xMTE2NS82OTcgODA0Ny8xMDk4Mi82OTcgODAzOC8xMDk3My82OTcKK2YgODAzOC8xMDk3My82OTcgODE4Mi8xMTEzOC82OTcgODIxMC8xMTE2NS82OTcKK2YgODA0OC8xMDk4My82OTcgODM3NC8xMTE2Ni82OTcgODM3MS8xMTE2Ny82OTcKK2YgODM3MS8xMTE2Ny82OTcgODAwNi8xMDk0Ny82OTcgODA0OC8xMDk4My82OTcKK2YgODIxMi8xMTE2OC82OTcgODIxMy8xMTE2OS82OTcgODIwMS8xMTE1Ny82OTcKK2YgODIwMS8xMTE1Ny82OTcgODE3Ni8xMTEzNC82OTcgODIxMi8xMTE2OC82OTcKK2YgODIwNS8xMTE2Mi82OTcgODE5My8xMTE0OS82OTcgODIxNS8xMTE3MC82OTcKK2YgODIxNS8xMTE3MC82OTcgODIxNC8xMTE3MS82OTcgODIwNS8xMTE2Mi82OTcKK2YgODE4MC8xMTE0MC82OTcgODIwMC8xMTE1NS82OTcgODIxNi8xMTE3Mi82OTcKK2YgODIxNi8xMTE3Mi82OTcgODE4My8xMTEzNy82OTcgODE4MC8xMTE0MC82OTcKK2YgODIxNy8xMTE3My82OTcgODIxMS8xMTE2NC82OTcgODE4My8xMTEzNy82OTcKK2YgODE4My8xMTEzNy82OTcgODIxNi8xMTE3Mi82OTcgODIxNy8xMTE3My82OTcKK2YgODIxNC8xMTE3MS82OTcgODIxNS8xMTE3MC82OTcgODIxOS8xMTE3NC82OTcKK2YgODIxOS8xMTE3NC82OTcgODIxOC8xMTE3NS82OTcgODIxNC8xMTE3MS82OTcKK2YgODIxNC8xMTE3MS82OTcgODIxOC8xMTE3NS82OTcgODIxNy8xMTE3My82OTcKK2YgODIxNy8xMTE3My82OTcgODIxNi8xMTE3Mi82OTcgODIxNC8xMTE3MS82OTcKK2YgODIwMS8xMTE1Ny82OTcgODIxMy8xMTE2OS82OTcgODIxOS8xMTE3NC82OTcKK2YgODIxOS8xMTE3NC82OTcgODIxNS8xMTE3MC82OTcgODIwMS8xMTE1Ny82OTcKK2YgODIwNS8xMTE2Mi82OTcgODIxNC8xMTE3MS82OTcgODIxNi8xMTE3Mi82OTcKK2YgODIxNi8xMTE3Mi82OTcgODIwMC8xMTE1NS82OTcgODIwNS8xMTE2Mi82OTcKK2YgODE5My8xMTE0OS82OTcgODE5MC8xMTE0OC82OTcgODIwMS8xMTE1Ny82OTcKK2YgODIwMS8xMTE1Ny82OTcgODIxNS8xMTE3MC82OTcgODE5My8xMTE0OS82OTcKK2YgODE1MS8xMTEwMS82OTcgODE1Mi8xMTEwMi82OTcgODIyMS8xMTE3Ni82OTcKK2YgODIyMS8xMTE3Ni82OTcgODIyMC8xMTE3Ny82OTcgODE1MS8xMTEwMS82OTcKK2YgODIwNS8xMTE2Mi82OTcgODIwMC8xMTE1NS82OTcgODIwOS8xMTE2My82OTcKK2YgODIwOS8xMTE2My82OTcgODIwNi8xMTE2MS82OTcgODIwNS8xMTE2Mi82OTcKK2YgODIwMi8xMTE1OC82OTcgODEzMC8xMTA4MC82OTcgODEzMS8xMTA4My82OTcKK2YgODEzMS8xMTA4My82OTcgODE0OC8xMTA5OS82OTcgODIwMi8xMTE1OC82OTcKK2YgODIwMy8xMTE2MC82OTcgODIwNC8xMTE1OS82OTcgODIyMy8xMTE3OC82OTcKK2YgODIyMy8xMTE3OC82OTcgODIyMi8xMTE3OS82OTcgODIwMy8xMTE2MC82OTcKK2YgODIwMi8xMTE1OC82OTcgODE0OC8xMTA5OS82OTcgODIyNS8xMTE4MC82OTcKK2YgODIyNS8xMTE4MC82OTcgODIwOS8xMTE2My82OTcgODIwMi8xMTE1OC82OTcKK2YgODE0Ny8xMTA5Ni8zMjA0IDgxNDQvMTEwOTUvMzIwNCA4MjI3LzExMTgxLzMyMDQKK2YgODIyNy8xMTE4MS8zMjA0IDgyMjYvMTExODIvMzIwNCA4MTQ3LzExMDk2LzMyMDQKK2YgODE0NC8xMTA5NS82OTcgODE1NC8xMTEwNC82OTcgODIyOC8xMTE4My82OTcKK2YgODIyOC8xMTE4My82OTcgODIyNy8xMTE4MS82OTcgODE0NC8xMTA5NS82OTcKK2YgODIzMC8xMTE4NC82OTcgODIyOS8xMTE4NS82OTcgODE1OC8xMTE4Ni82OTcKK2YgODE1OC8xMTE4Ni82OTcgODE1OS8xMTE4Ny82OTcgODIzMC8xMTE4NC82OTcKK2YgODIyMS8xMTE3Ni82OTcgODIzMi8xMTE4OC82OTcgODIzMS8xMTE4OS82OTcKK2YgODE3MC8xMTEyNC8zMjE0IDgxNDcvMTExMjMvMzIxNCA4MjI2LzExMTkwLzMyMTQKK2YgODIyNi8xMTE5MC8zMjEzIDgyMzMvMTExOTEvMzIxMyA4MTcwLzExMTI0LzMyMTMKK2YgODIyOC8xMTE4My82OTcgODE1NC8xMTEwNC82OTcgODIzOS8xMTE5Mi82OTcKK2YgODIzOS8xMTE5Mi82OTcgODIzOC8xMTE5My82OTcgODIyOC8xMTE4My82OTcKK2YgODI0MC8xMTE5NC82OTcgODIzOS8xMTE5Mi82OTcgODE1NC8xMTEwNC82OTcKK2YgODE1NC8xMTEwNC82OTcgODE1NS8xMTEwNS82OTcgODI0MC8xMTE5NC82OTcKK2YgODIyMS8xMTE3Ni82OTcgODI0Mi8xMTE5NS82OTcgODI0MS8xMTE5Ni82OTcKK2YgODI0MS8xMTE5Ni82OTcgODIyMC8xMTE3Ny82OTcgODIyMS8xMTE3Ni82OTcKK2YgODIzMi8xMTE4OC82OTcgODIyMS8xMTE3Ni82OTcgODE1Mi8xMTEwMi82OTcKK2YgODE1Mi8xMTEwMi82OTcgODE1My8xMTEwMy82OTcgODIzMi8xMTE4OC82OTcKK2YgODI0My8xMTE5Ny82OTcgODE0OS8xMTA5OC82OTcgODE1MC8xMTEwMC82OTcKK2YgODE1MC8xMTEwMC82OTcgODI0NC8xMTE5OC82OTcgODI0My8xMTE5Ny82OTcKK2YgODE1MC8xMTEwMC82OTcgODE1MS8xMTEwMS82OTcgODIyMC8xMTE3Ny82OTcKK2YgODIyMC8xMTE3Ny82OTcgODI0NC8xMTE5OC82OTcgODE1MC8xMTEwMC82OTcKK2YgODI0NC8xMTE5OC82OTcgODI0MS8xMTE5Ni82OTcgODI0NS8xMTE5OS82OTcKK2YgODI0NS8xMTE5OS82OTcgODI0My8xMTE5Ny82OTcgODI0NC8xMTE5OC82OTcKK2YgODIyNi8xMTE4Mi8zMjA0IDgyMjcvMTExODEvMzIwNCA4MjQ3LzExMjAwLzMyMDQKK2YgODI0Ny8xMTIwMC8zMjA0IDgyNDYvMTEyMDEvMzIwNCA4MjI2LzExMTgyLzMyMDQKK2YgODIyNy8xMTE4MS82OTcgODIyOC8xMTE4My82OTcgODI0OC8xMTIwMi82OTcKK2YgODI0OC8xMTIwMi82OTcgODI0Ny8xMTIwMC82OTcgODIyNy8xMTE4MS82OTcKK2YgODIzMy8xMTE5MS8zMjEzIDgyMjYvMTExOTAvMzIxMyA4MjQ2LzExMjAzLzMyMTMKK2YgODI0Ni8xMTIwMy8zMjEzIDgyNDkvMTEyMDQvMzIxMyA4MjMzLzExMTkxLzMyMTMKK2YgODIzNC8xMTIwNS82OTcgODM5MC8xMTIwNi82OTcgODM5MS8xMTIwNy82OTcKK2YgODM5MS8xMTIwNy82OTcgODI1MC8xMTIwOC82OTcgODIzNC8xMTIwNS82OTcKK2YgODIzNS8xMTIwOS82OTcgODIzNi8xMTIxMC82OTcgODI1Mi8xMTIxMS82OTcKK2YgODI1Mi8xMTIxMS82OTcgODI1MS8xMTIxMi82OTcgODIzNS8xMTIwOS82OTcKK2YgODIzNi8xMTIxMC82OTcgODIzNC8xMTIwNS82OTcgODI1MC8xMTIwOC82OTcKK2YgODI1MC8xMTIwOC82OTcgODI1Mi8xMTIxMS82OTcgODIzNi8xMTIxMC82OTcKK2YgODIzNy8xMTIxMy82OTcgODIzNS8xMTIwOS82OTcgODI1MS8xMTIxMi82OTcKK2YgODI1MS8xMTIxMi82OTcgODI1My8xMTIxNC82OTcgODIzNy8xMTIxMy82OTcKK2YgODI1My8xMTIxNC82OTcgODIzMC8xMTE4NC82OTcgODE1OS8xMTE4Ny82OTcKK2YgODE1OS8xMTE4Ny82OTcgODIzNy8xMTIxMy82OTcgODI1My8xMTIxNC82OTcKK2YgODIyOS8xMTE4NS82OTcgODIzMC8xMTE4NC82OTcgODIyMi8xMTE3OS82OTcKK2YgODIyMi8xMTE3OS82OTcgODI1NC8xMTIxNS82OTcgODIyOS8xMTE4NS82OTcKK2YgODI1Ni8xMTIxNi82OTcgODI4Mi8xMTIxNy82OTcgODI1NS8xMTIxOC82OTcKK2YgODI1NS8xMTIxOC82OTcgODIzOC8xMTE5My82OTcgODI1Ni8xMTIxNi82OTcKK2YgODIyOC8xMTE4My82OTcgODIzOC8xMTE5My82OTcgODI1NS8xMTIxOC82OTcKK2YgODI1NS8xMTIxOC82OTcgODI0OC8xMTIwMi82OTcgODIyOC8xMTE4My82OTcKK2YgODI1Ny8xMTIxOS82OTcgODIyOS8xMTE4NS82OTcgODI1NC8xMTIxNS82OTcKK2YgODI1NC8xMTIxNS82OTcgODI1OC8xMTIyMC82OTcgODI1Ny8xMTIxOS82OTcKK2YgODIyNS8xMTE4MC82OTcgODI1OS8xMTIyMS82OTcgODIwNi8xMTE2MS82OTcKK2YgODIwNi8xMTE2MS82OTcgODIwOS8xMTE2My82OTcgODIyNS8xMTE4MC82OTcKK2YgODI2MC8xMTIyMi8zMjk2IDgyNjMvMTEyMjMvMzI5NiA4MjYyLzExMjI0LzMyOTYKK2YgODI2Mi8xMTIyNC8zMjk2IDgyNjEvMTEyMjUvMzI5NiA4MjYwLzExMjIyLzMyOTYKK2YgODI2NC8xMTIyNi8zMjk3IDgyNjAvMTEyMjIvMzI5NyA4MjYxLzExMjI1LzMyOTcKK2YgODI2MS8xMTIyNS8zMjk3IDgyNjUvMTEyMjcvMzI5NyA4MjY0LzExMjI2LzMyOTcKK2YgODExMy8xMTA0OC8yMTk0IDgyNjQvMTEyMjYvMjE5NCA4MjY1LzExMjI3LzIxOTQKK2YgODI2NS8xMTIyNy8yMTk0IDgxMTQvMTEwNDkvMjE5NCA4MTEzLzExMDQ4LzIxOTQKK2YgODQwMy8xMTIyOC8xNzMyIDg0MDIvMTEyMjkvMTczMiA4MjY3LzExMjMwLzE3MzIKK2YgODI2Ny8xMTIzMC8xNzMyIDgyNjYvMTEyMzEvMTczMiA4NDAzLzExMjI4LzE3MzIKK2YgODI2OC8xMTIzMi8xNzMyIDgyNjYvMTEyMzEvMTczMiA4MjY3LzExMjMwLzE3MzIKK2YgODI2Ny8xMTIzMC8xNzMyIDgyNjkvMTEyMzMvMTczMiA4MjY4LzExMjMyLzE3MzIKK2YgODI3MC8xMTIzNC8zMjk4IDgyNjgvMTEyMzIvMzI5OCA4MjY5LzExMjMzLzMyOTgKK2YgODI2OS8xMTIzMy8zMjk4IDgyNzEvMTEyMzUvMzI5OCA4MjcwLzExMjM0LzMyOTgKK2YgODI3Mi8xMTIzNi8zMjk5IDgyNzAvMTEyMzcvMzI5OSA4MjcxLzExMjM4LzMyOTkKK2YgODI3MS8xMTIzOC8zMjk5IDgyNzMvMTEyMzkvMzI5OSA4MjcyLzExMjM2LzMyOTkKK2YgODI2My8xMTI0MC8zMzAwIDgyNzIvMTEyMzYvMzMwMCA4MjczLzExMjM5LzMzMDAKK2YgODI3My8xMTIzOS8zMzAwIDgyNjIvMTEyNDEvMzMwMCA4MjYzLzExMjQwLzMzMDAKK2YgODIxNy8xMTE3My8zMzAxIDgyNjMvMTEyNDIvMzMwMSA4MjYwLzExMjQzLzMzMDEKK2YgODI2MC8xMTI0My8zMzAyIDgyMTEvMTExNjQvMzMwMiA4MjE3LzExMTczLzMzMDIKK2YgODIxMS8xMTE2NC8zMzAzIDgyNjAvMTEyNDMvMzMwMyA4MjY0LzExMjQ0LzMzMDMKK2YgODI2NC8xMTIyNi8zMzA0IDgyMTAvMTEyNDUvMzMwNCA4MjExLzExMjQ2LzMzMDQKK2YgODIxMC8xMTI0NS8zMzA1IDgyNjQvMTEyMjYvMzMwNSA4MTEzLzExMDQ4LzMzMDUKK2YgODExMy8xMTA0OC8zMTg2IDgwNDcvMTEwNjkvMzE4NiA4MjEwLzExMjQ1LzMxODYKK2YgODExNi8xMTA3MS8zMTgzIDgzNzgvMTEyNDcvMzE4MyA4Mzc0LzExMTY2LzMxODMKK2YgODM3NC8xMTE2Ni8zMzA2IDgwNDgvMTA5ODMvMzMwNiA4MTE2LzExMDcxLzMzMDYKK2YgODIxMi8xMTE2OC8zMTgzIDgyNjYvMTEyNDgvMzE4MyA4MjY4LzExMjQ5LzMxODMKK2YgODI2OC8xMTI0OS8zMzA3IDgyMTMvMTExNjkvMzMwNyA4MjEyLzExMTY4LzMzMDcKK2YgODIxMy8xMTE2OS8zMzA4IDgyNjgvMTEyNDkvMzMwOCA4MjcwLzExMjUwLzMzMDgKK2YgODI3MC8xMTI1MC8zMzA5IDgyMTkvMTExNzQvMzMwOSA4MjEzLzExMTY5LzMzMDkKK2YgODIxOS8xMTE3NC8zMzEwIDgyNzAvMTEyNTAvMzMxMCA4MjcyLzExMjUxLzMzMTAKK2YgODI3Mi8xMTI1MS8zMzExIDgyMTgvMTExNzUvMzMxMSA4MjE5LzExMTc0LzMzMTEKK2YgODIxOC8xMTE3NS8zMzEyIDgyNzIvMTEyNTEvMzMxMiA4MjYzLzExMjQyLzMzMTIKK2YgODI2My8xMTI0Mi8zMzEzIDgyMTcvMTExNzMvMzMxMyA4MjE4LzExMTc1LzMzMTMKK2YgODE0OC8xMTA5OS82OTcgODE0OS8xMTA5OC82OTcgODI0My8xMTE5Ny82OTcKK2YgODI0My8xMTE5Ny82OTcgODIyNS8xMTE4MC82OTcgODE0OC8xMTA5OS82OTcKK2YgODIyNS8xMTE4MC82OTcgODI0My8xMTE5Ny82OTcgODI0NS8xMTE5OS82OTcKK2YgODI0NS8xMTE5OS82OTcgODI1OS8xMTIyMS82OTcgODIyNS8xMTE4MC82OTcKK2YgODIyMy8xMTE3OC82OTcgODI1OS8xMTIyMS82OTcgODI0NS8xMTE5OS82OTcKK2YgODI0NS8xMTE5OS82OTcgODI3NC8xMTI1Mi82OTcgODIyMy8xMTE3OC82OTcKK2YgODI3NC8xMTI1Mi82OTcgODI0NS8xMTE5OS82OTcgODI0MS8xMTE5Ni82OTcKK2YgODI0MS8xMTE5Ni82OTcgODI0Mi8xMTE5NS82OTcgODI3NC8xMTI1Mi82OTcKK2YgODE1OC8xMTE4Ni82OTcgODIyOS8xMTE4NS82OTcgODI1Ny8xMTIxOS82OTcKK2YgODI1Ny8xMTIxOS82OTcgODE2MS8xMTI1My82OTcgODE1OC8xMTE4Ni82OTcKK2YgODI0NC8xMTE5OC82OTcgODIyMC8xMTE3Ny82OTcgODI0MS8xMTE5Ni82OTcKK2YgODIyMy8xMTE3OC82OTcgODIwNC8xMTE1OS82OTcgODIwNi8xMTE2MS82OTcKK2YgODIwNi8xMTE2MS82OTcgODI1OS8xMTIyMS82OTcgODIyMy8xMTE3OC82OTcKK2YgODI1Ny8xMTIxOS82OTcgODI4Mi8xMTIxNy82OTcgODI1Ni8xMTIxNi82OTcKK2YgODI1Ni8xMTIxNi82OTcgODE2MS8xMTI1My82OTcgODI1Ny8xMTIxOS82OTcKK2YgODIzOS8xMTE5Mi82OTcgODI3Ny8xMTI1NC82OTcgODI1Ni8xMTIxNi82OTcKK2YgODI1Ni8xMTIxNi82OTcgODIzOC8xMTE5My82OTcgODIzOS8xMTE5Mi82OTcKK2YgODI5OS8xMTI1NS82OTcgODI5OC8xMTI1Ni82OTcgODI4My8xMDg2Mi82OTcKK2YgODI4My8xMDg2Mi82OTcgNzg5MC8xMDg2NS82OTcgODI5OS8xMTI1NS82OTcKK2YgODI0Mi8xMTE5NS82OTcgODIyMS8xMTE3Ni82OTcgODIzMS8xMTE4OS82OTcKK2YgODIzMS8xMTE4OS82OTcgODI1OC8xMTIyMC82OTcgODI0Mi8xMTE5NS82OTcKK2YgNzk3MC8xMDkwNC8zMTU5IDgzMDEvMTEyNTcvMzE1OSA4MzAwLzExMjU4LzMxNTkKK2YgODMwMC8xMTI1OC8zMTU5IDc5NjkvMTA5MDUvMzE1OSA3OTcwLzEwOTA0LzMxNTkKK2YgNzk3Ny8xMDkxMy82OTcgODMwMi8xMTI1OS82OTcgODMwMS8xMTI1Ny82OTcKK2YgODMwMS8xMTI1Ny82OTcgNzk3MC8xMDkwNC82OTcgNzk3Ny8xMDkxMy82OTcKK2YgNzk2OS8xMDkzNC8zMTcxIDgzMDAvMTEyNjAvMzE3MSA4MzAzLzExMjYxLzMxNzEKK2YgODMwMy8xMTI2MS8zMTcwIDc5OTQvMTA5MzUvMzE3MCA3OTY5LzEwOTM0LzMxNzAKK2YgODA4NC8xMTAxMS82OTcgODMxMC8xMTI2Mi82OTcgODMwMi8xMTI1OS82OTcKK2YgODMwMi8xMTI1OS82OTcgNzk3Ny8xMDkxMy82OTcgODA4NC8xMTAxMS82OTcKK2YgODEyOC8xMTI2My82OTcgODMxMS8xMTI2NC82OTcgODMxMC8xMTI2Mi82OTcKK2YgODMxMC8xMTI2Mi82OTcgODA4NC8xMTAxMS82OTcgODEyOC8xMTI2My82OTcKK2YgODE0Ni8xMTA5Ny8zMjA0IDgzMTMvMTEyNjUvMzIwNCA4MzEyLzExMjY2LzMyMDQKK2YgODMxMi8xMTI2Ni8zMjA0IDgxNDUvMTEwOTQvMzIwNCA4MTQ2LzExMDk3LzMyMDQKK2YgODE0NS8xMTA5NC82OTcgODMxMi8xMTI2Ni82OTcgODMxNC8xMTI2Ny82OTcKK2YgODMxNC8xMTI2Ny82OTcgODE1NS8xMTEwNS82OTcgODE0NS8xMTA5NC82OTcKK2YgODE2OS8xMTEyNS8zMjE0IDgzMTUvMTEyNjgvMzIxNCA4MzEzLzExMjY5LzMyMTQKK2YgODMxMy8xMTI2OS8zMjE0IDgxNDYvMTExMjIvMzIxNCA4MTY5LzExMTI1LzMyMTQKK2YgODE1NS8xMTEwNS82OTcgODMxNC8xMTI2Ny82OTcgODI5OC8xMTI1Ni82OTcKK2YgODI5OC8xMTI1Ni82OTcgODI0MC8xMTE5NC82OTcgODE1NS8xMTEwNS82OTcKK2YgODIzOS8xMTE5Mi82OTcgODI0MC8xMTE5NC82OTcgODI3Ni8xMTI3MC82OTcKK2YgODI3Ni8xMTI3MC82OTcgODI3Ny8xMTI1NC82OTcgODIzOS8xMTE5Mi82OTcKK2YgODA5MC8xMTAxNy8zMTU5IDc5NjUvMTA5MDEvMzE1OSA3OTY2LzEwOTAwLzMxNTkKK2YgNzk2Ni8xMDkwMC8zMTU5IDgwOTEvMTEwMTgvMzE1OSA4MDkwLzExMDE3LzMxNTkKK2YgODA5MS8xMTAxOC82OTcgNzk2Ni8xMDkwMC82OTcgNzk3Ni8xMDkxMS82OTcKK2YgNzk3Ni8xMDkxMS82OTcgODA5Mi8xMTAxOS82OTcgODA5MS8xMTAxOC82OTcKK2YgODA5My8xMTAyMC8zMTcwIDc5OTIvMTA5MzEvMzE3MCA3OTY1LzEwOTMwLzMxNzAKK2YgNzk2NS8xMDkzMC8zMTcwIDgwOTAvMTEwMjEvMzE3MCA4MDkzLzExMDIwLzMxNzAKK2YgODA5NC8xMTAyMy82OTcgODAwMy8xMDk0NS82OTcgODAwNC8xMDk0NC82OTcKK2YgODAwNC8xMDk0NC82OTcgODA5NS8xMTAyNC82OTcgODA5NC8xMTAyMy82OTcKK2YgODA5Ni8xMTAyNy82OTcgODAyNS8xMDk2NS82OTcgODAyNi8xMDk2NC82OTcKK2YgODAyNi8xMDk2NC82OTcgODA5Ny8xMTAyOC82OTcgODA5Ni8xMTAyNy82OTcKK2YgODA5Ny8xMTAyOC82OTcgODAyNi8xMDk2NC82OTcgODAwMy8xMDk0NS82OTcKK2YgODAwMy8xMDk0NS82OTcgODA5NC8xMTAyMy82OTcgODA5Ny8xMTAyOC82OTcKK2YgODA5OC8xMTAzMS82OTcgODA0MS8xMDk3Ni82OTcgODAyNS8xMDk2NS82OTcKK2YgODAyNS8xMDk2NS82OTcgODA5Ni8xMTAyNy82OTcgODA5OC8xMTAzMS82OTcKK2YgODA5OS8xMTAzMi82OTcgODA2NS8xMDk5Ni82OTcgODA0MS8xMDk3Ni82OTcKK2YgODA0MS8xMDk3Ni82OTcgODA5OC8xMTAzMS82OTcgODA5OS8xMTAzMi82OTcKK2YgODEwMi8xMTAzNy82OTcgODA3My8xMTAwNi82OTcgODA3NC8xMTAwNS82OTcKK2YgODA3NC8xMTAwNS82OTcgODEwNC8xMTAzOC82OTcgODEwMi8xMTAzNy82OTcKK2YgODA5Mi8xMTAxOS82OTcgNzk3Ni8xMDkxMS82OTcgODA3My8xMTAwNi82OTcKK2YgODA3My8xMTAwNi82OTcgODEwMi8xMTAzNy82OTcgODA5Mi8xMTAxOS82OTcKK2YgODA2My8xMTA3Ny82OTcgODEwMC8xMTAzNC82OTcgODEwMS8xMTAzNS82OTcKK2YgODEwMS8xMTAzNS82OTcgODEyNS8xMTA3OC82OTcgODA2My8xMTA3Ny82OTcKK2YgODEyNS8xMTA3OC82OTcgODEwMS8xMTAzNS82OTcgODEwNS8xMTA0MC82OTcKK2YgODEwNS8xMTA0MC82OTcgODA4NS8xMTAxMy82OTcgODEyNS8xMTA3OC82OTcKK2YgODA3MS8xMTAwMS82OTcgODEwMC8xMTAzNC82OTcgODA2NS8xMDk5Ni82OTcKK2YgODA2NS8xMDk5Ni82OTcgODA5OS8xMTAzMi82OTcgODA3MS8xMTAwMS82OTcKK2YgODE0Mi8xMTA5My8zMjA0IDgxNDMvMTEwOTIvMzIwNCA4MjQ2LzExMjAxLzMyMDQKK2YgODI0Ni8xMTIwMS8zMjA0IDgyNDcvMTEyMDAvMzIwNCA4MTQyLzExMDkzLzMyMDQKK2YgODE1My8xMTEwMy82OTcgODE0Mi8xMTA5My82OTcgODI0Ny8xMTIwMC82OTcKK2YgODI0Ny8xMTIwMC82OTcgODI0OC8xMTIwMi82OTcgODE1My8xMTEwMy82OTcKK2YgODI0Ni8xMTIwMy8zMjEzIDgxNDMvMTExMjAvMzIxMyA4MTY4LzExMTIxLzMyMTMKK2YgODE2OC8xMTEyMS8zMjEzIDgyNDkvMTEyMDQvMzIxMyA4MjQ2LzExMjAzLzMyMTMKK2YgODM2OS8xMTEzMC82OTcgODM3Ni8xMTI3MS82OTcgODA5NS8xMTAyNC82OTcKK2YgODA5NS8xMTAyNC82OTcgODAwNC8xMDk0NC82OTcgODM2OS8xMTEzMC82OTcKK2YgODI1Mi8xMTIxMS82OTcgODE5MS8xMTE0Ny82OTcgODE5Mi8xMTE1MC82OTcKK2YgODE5Mi8xMTE1MC82OTcgODI1MS8xMTIxMi82OTcgODI1Mi8xMTIxMS82OTcKK2YgODI1MC8xMTIwOC82OTcgODE3NC8xMTE1Ni82OTcgODE5MS8xMTE0Ny82OTcKK2YgODE5MS8xMTE0Ny82OTcgODI1Mi8xMTIxMS82OTcgODI1MC8xMTIwOC82OTcKK2YgODI1MS8xMTIxMi82OTcgODE5Mi8xMTE1MC82OTcgODIwMy8xMTE2MC82OTcKK2YgODIwMy8xMTE2MC82OTcgODI1My8xMTIxNC82OTcgODI1MS8xMTIxMi82OTcKK2YgODI1My8xMTIxNC82OTcgODIwMy8xMTE2MC82OTcgODIyMi8xMTE3OS82OTcKK2YgODIyMi8xMTE3OS82OTcgODIzMC8xMTE4NC82OTcgODI1My8xMTIxNC82OTcKK2YgODI4Mi8xMTIxNy82OTcgODIzMS8xMTE4OS82OTcgODIzMi8xMTE4OC82OTcKK2YgODIzMi8xMTE4OC82OTcgODI1NS8xMTIxOC82OTcgODI4Mi8xMTIxNy82OTcKK2YgODI1NS8xMTIxOC82OTcgODIzMi8xMTE4OC82OTcgODE1My8xMTEwMy82OTcKK2YgODE1My8xMTEwMy82OTcgODI0OC8xMTIwMi82OTcgODI1NS8xMTIxOC82OTcKK2YgODI3NC8xMTI1Mi82OTcgODI1NC8xMTIxNS82OTcgODIyMi8xMTE3OS82OTcKK2YgODIyMi8xMTE3OS82OTcgODIyMy8xMTE3OC82OTcgODI3NC8xMTI1Mi82OTcKK2YgODI0Mi8xMTE5NS82OTcgODI1OC8xMTIyMC82OTcgODI1NC8xMTIxNS82OTcKK2YgODI1NC8xMTIxNS82OTcgODI3NC8xMTI1Mi82OTcgODI0Mi8xMTE5NS82OTcKK2YgODI1OC8xMTIyMC82OTcgODIzMS8xMTE4OS82OTcgODI4Mi8xMTIxNy82OTcKK2YgODI4Mi8xMTIxNy82OTcgODI1Ny8xMTIxOS82OTcgODI1OC8xMTIyMC82OTcKK2YgNzk4My8xMTA3OS82OTcgODEwMy8xMTAzNi82OTcgODEwNC8xMTAzOC82OTcKK2YgODEwNC8xMTAzOC82OTcgODEwNi8xMTAzOS82OTcgNzk4My8xMTA3OS82OTcKK2YgODA4Mi8xMTAwOS82OTcgODEwMy8xMTAzNi82OTcgODEyNy8xMTI3Mi82OTcKK2YgODEyNy8xMTI3Mi82OTcgODA4My8xMTAxMC82OTcgODA4Mi8xMTAwOS82OTcKK2YgODA4My8xMTAxMC82OTcgODEyNy8xMTI3Mi82OTcgODEyOC8xMTI2My82OTcKK2YgODEyOC8xMTI2My82OTcgODA4NC8xMTAxMS82OTcgODA4My8xMTAxMC82OTcKK2YgODEwNi8xMTAzOS82OTcgODEwNC8xMTAzOC82OTcgODA3NC8xMTAwNS82OTcKK2YgODA3NC8xMTAwNS82OTcgODEwNS8xMTA0MC82OTcgODEwNi8xMTAzOS82OTcKK2YgODA3NC8xMTAwNS82OTcgODA2MS8xMDk5My82OTcgODA4NS8xMTAxMy82OTcKK2YgODA4NS8xMTAxMy82OTcgODEwNS8xMTA0MC82OTcgODA3NC8xMTAwNS82OTcKK2YgODAzNC8xMDk3OS82OTcgODAzMy8xMDk3Ny82OTcgODI5MS8xMTA0MS82OTcKK2YgODI5MS8xMTA0MS82OTcgODA1OC8xMDk5Ny82OTcgODAzNC8xMDk3OS82OTcKK2YgODA1Ny8xMDk5NS82OTcgODA2My8xMTA3Ny82OTcgODA2MC8xMTA3Ni82OTcKK2YgODA2MC8xMTA3Ni82OTcgODI5MS8xMTA0MS82OTcgODA1Ny8xMDk5NS82OTcKK2YgODA2MC8xMTA3Ni82OTcgODA1OS8xMTA3NS82OTcgODA1OC8xMDk5Ny82OTcKK2YgODA1OC8xMDk5Ny82OTcgODI5MS8xMTA0MS82OTcgODA2MC8xMTA3Ni82OTcKK2YgODI3Ni8xMTI3MC82OTcgODI0MC8xMTE5NC82OTcgODI5OC8xMTI1Ni82OTcKK2YgODI5OC8xMTI1Ni82OTcgODI5OS8xMTI1NS82OTcgODI3Ni8xMTI3MC82OTcKK2YgODI4NC8xMTI3My8zMTU5IDc4NzIvMTEyNzQvMzE1OSA4MzAwLzExMjU4LzMxNTkKK2YgODMwMC8xMTI1OC8zMTU5IDgzMDEvMTEyNTcvMzE1OSA4Mjg0LzExMjczLzMxNTkKK2YgNzg4MC8xMTI3NS82OTcgODI4NC8xMTI3My82OTcgODMwMS8xMTI1Ny82OTcKK2YgODMwMS8xMTI1Ny82OTcgODMwMi8xMTI1OS82OTcgNzg4MC8xMTI3NS82OTcKK2YgNzg3Mi8xMTI3Ni8zMTcwIDc4NzUvMTEyNzcvMzE3MCA4MzAzLzExMjYxLzMxNzAKK2YgODMwMy8xMTI2MS8zMTcxIDgzMDAvMTEyNjAvMzE3MSA3ODcyLzExMjc2LzMxNzEKK2YgNzg3Ni8xMTI3OC82OTcgNzg4MC8xMTI3NS82OTcgODMwMi8xMTI1OS82OTcKK2YgODMwMi8xMTI1OS82OTcgODMxMC8xMTI2Mi82OTcgNzg3Ni8xMTI3OC82OTcKK2YgNzk0OC8xMTI3OS82OTcgNzg3Ni8xMTI3OC82OTcgODMxMC8xMTI2Mi82OTcKK2YgODMxMC8xMTI2Mi82OTcgODMxMS8xMTI2NC82OTcgNzk0OC8xMTI3OS82OTcKK2YgODI4OC8xMTI4MC8zMjA0IDgyODcvMTEyODEvMzIwNCA4MzEyLzExMjY2LzMyMDQKK2YgODMxMi8xMTI2Ni8zMjA0IDgzMTMvMTEyNjUvMzIwNCA4Mjg4LzExMjgwLzMyMDQKK2YgODI4Ny8xMTI4MS82OTcgODI4OS8xMTI4Mi82OTcgODMxNC8xMTI2Ny82OTcKK2YgODMxNC8xMTI2Ny82OTcgODMxMi8xMTI2Ni82OTcgODI4Ny8xMTI4MS82OTcKK2YgNzg4NS8xMTI4My8zMjEzIDgyODgvMTEyODQvMzIxMyA4MzEzLzExMjY5LzMyMTMKK2YgODMxMy8xMTI2OS8zMjE0IDgzMTUvMTEyNjgvMzIxNCA3ODg1LzExMjgzLzMyMTQKK2YgODI4OS8xMTI4Mi82OTcgODI4My8xMDg2Mi82OTcgODI5OC8xMTI1Ni82OTcKK2YgODI5OC8xMTI1Ni82OTcgODMxNC8xMTI2Ny82OTcgODI4OS8xMTI4Mi82OTcKK2YgNzkxMy8xMDgwMi82OTcgNzkxNy8xMDg3OS82OTcgODMzMi8xMDg2NC82OTcKK2YgODMzMi8xMDg2NC82OTcgODMyOC8xMDg2My82OTcgNzkxMy8xMDgwMi82OTcKK2YgNzg3Mi8xMTI3NC8zMTU5IDgyODQvMTEyNzMvMzE1OSA4MzMzLzEwODY3LzMxNTkKK2YgODMzMy8xMDg2Ny8zMTU5IDgzMzgvMTA4NjYvMzE1OSA3ODcyLzExMjc0LzMxNTkKK2YgODI4NC8xMTI3My82OTcgNzg4MC8xMTI3NS82OTcgODMzNS8xMDg2OC82OTcKK2YgODMzNS8xMDg2OC82OTcgODMzMy8xMDg2Ny82OTcgODI4NC8xMTI3My82OTcKK2YgNzg3NS8xMTI3Ny8zMTcwIDc4NzIvMTEyNzYvMzE3MCA4MzM4LzEwODcwLzMxNzAKK2YgODMzOC8xMDg3MC8zMTcxIDgzMzQvMTA4NjkvMzE3MSA3ODc1LzExMjc3LzMxNzEKK2YgNzg4MC8xMTI3NS82OTcgNzg3Ni8xMTI3OC82OTcgODM0My8xMDg3MS82OTcKK2YgODM0My8xMDg3MS82OTcgODMzNS8xMDg2OC82OTcgNzg4MC8xMTI3NS82OTcKK2YgNzg3Ni8xMTI3OC82OTcgNzk0OC8xMTI3OS82OTcgODM0Ny8xMDg3Mi82OTcKK2YgODM0Ny8xMDg3Mi82OTcgODM0My8xMDg3MS82OTcgNzg3Ni8xMTI3OC82OTcKK2YgODI4Ny8xMTI4MS8zMjA0IDgyODgvMTEyODAvMzIwNCA4MzIwLzEwODc1LzMyMDQKK2YgODMyMC8xMDg3NS8zMjA0IDgzMjEvMTA4NzQvMzIwNCA4Mjg3LzExMjgxLzMyMDQKK2YgODI4OS8xMTI4Mi82OTcgODI4Ny8xMTI4MS82OTcgODMyMS8xMDg3NC82OTcKK2YgODMyMS8xMDg3NC82OTcgODMyMi8xMDg3Ni82OTcgODI4OS8xMTI4Mi82OTcKK2YgODI4OC8xMTI4NC8zMjEzIDc4ODUvMTEyODMvMzIxMyA4MzIzLzEwODc4LzMyMTMKK2YgODMyMy8xMDg3OC8zMjE0IDgzMjAvMTA4NzcvMzIxNCA4Mjg4LzExMjg0LzMyMTQKK2YgODI4My8xMDg2Mi82OTcgODI4OS8xMTI4Mi82OTcgODMyMi8xMDg3Ni82OTcKK2YgODMyMi8xMDg3Ni82OTcgODMyOC8xMDg2My82OTcgODI4My8xMDg2Mi82OTcKK2YgODM1Ni8xMTI4NS82OTcgODM5Ny8xMTI4Ni82OTcgNzkzNS8xMDg4NC82OTcKK2YgNzkzNS8xMDg4NC82OTcgODM1NS8xMTI4Ny82OTcgODM1Ni8xMTI4NS82OTcKK2YgNzkzNS8xMDg4NC82OTcgNzkzOC8xMDg4My82OTcgODM1NC8xMTI4OC82OTcKK2YgODM1NC8xMTI4OC82OTcgODM1NS8xMTI4Ny82OTcgNzkzNS8xMDg4NC82OTcKK2YgNzkzOC8xMDg4My82OTcgNzkzNy8xMDg4Mi82OTcgODM1My8xMTI4OS82OTcKK2YgODM1My8xMTI4OS82OTcgODM1NC8xMTI4OC82OTcgNzkzOC8xMDg4My82OTcKK2YgNzc4Mi8xMDU0NS82OTcgNzc3OC8xMDU0NC82OTcgODM4Mi8xMTI5MC82OTcKK2YgODM4Mi8xMTI5MC82OTcgODM2MC8xMDc3My82OTcgNzc4Mi8xMDU0NS82OTcKK2YgODM4My8xMDc0MS82OTcgODM4NC8xMTI5MS82OTcgODM2Mi8xMDc3NC82OTcKK2YgODM2Mi8xMDc3NC82OTcgODM2MC8xMDc3My82OTcgODM4My8xMDc0MS82OTcKK2YgNzc4MC8xMDY0Mi82OTcgNzg0Mi8xMDY0MS82OTcgODM2My8xMTI5Mi82OTcKK2YgODM2My8xMTI5Mi82OTcgODM1OS8xMDg4MC82OTcgNzc4MC8xMDY0Mi82OTcKK2YgNzg2My8xMDY2OS8zMjE5IDc4NjIvMTA2NjgvMzIxOSA4MzY0LzEwODU0LzMyMTkKK2YgODM2NC8xMDg1NC8zMjE5IDgzNjUvMTEyOTMvMzIxOSA3ODYzLzEwNjY5LzMyMTkKK2YgODM4NC8xMTI5NC8zMzE0IDgzODUvMTA4MzgvMzMxNCA4MzY0LzEwODU0LzMzMTQKK2YgODM2NC8xMDg1NC8zMzE1IDgzNjIvMTA4NTMvMzMxNSA4Mzg0LzExMjk0LzMzMTUKK2YgODM5My8xMDgxMy82OTcgODM5Ny8xMTI4Ni82OTcgODM2OC8xMDg4MS82OTcKK2YgODM2OC8xMDg4MS82OTcgODM1OS8xMDg4MC82OTcgODM5My8xMDgxMy82OTcKK2YgODM5OC8xMTEzMi82OTcgODM4OC8xMTI5NS82OTcgODM2OS8xMTEzMC82OTcKK2YgODM2OS8xMTEzMC82OTcgODM3MC8xMTEyOS82OTcgODM5OC8xMTEzMi82OTcKK2YgODAwMS8xMDk0My82OTcgODAwNi8xMDk0Ny82OTcgODM3MS8xMTE2Ny82OTcKK2YgODM3MS8xMTE2Ny82OTcgODM3MC8xMTEyOS82OTcgODAwMS8xMDk0My82OTcKK2YgODQwMS8xMTI5Ni82OTcgODM5OS8xMTEzMy82OTcgODM3MS8xMTE2Ny82OTcKK2YgODM3MS8xMTE2Ny82OTcgODM3NC8xMTE2Ni82OTcgODQwMS8xMTI5Ni82OTcKK2YgODA3Ny8xMTAyNS82OTcgODA5NS8xMTAyNC82OTcgODM3Ni8xMTI3MS82OTcKK2YgODM3Ni8xMTI3MS82OTcgODM3NS8xMTI5Ny82OTcgODA3Ny8xMTAyNS82OTcKK2YgODExNi8xMTA1My8xNzMyIDgxMTcvMTEwNTIvMTczMiA4Mzc3LzExMjk4LzE3MzIKK2YgODM3Ny8xMTI5OC8xNzMyIDgzNzgvMTEyOTkvMTczMiA4MTE2LzExMDUzLzE3MzIKK2YgODQwMy8xMTMwMC8zMzE2IDg0MDEvMTEyOTYvMzMxNiA4Mzc0LzExMTY2LzMzMTYKK2YgODM3NC8xMTE2Ni8zMzE3IDgzNzgvMTEyNDcvMzMxNyA4NDAzLzExMzAwLzMzMTcKK2YgODM4OC8xMTI5NS82OTcgODM5MS8xMTIwNy82OTcgODM3Ni8xMTI3MS82OTcKK2YgODM3Ni8xMTI3MS82OTcgODM2OS8xMTEzMC82OTcgODM4OC8xMTI5NS82OTcKK2YgNzkzNi8xMDU0My82OTcgODM2OC8xMDg4MS82OTcgODQwNi8xMTMwMS82OTcKK2YgODQwNi8xMTMwMS82OTcgNzc3OC8xMDU0NC82OTcgNzkzNi8xMDU0My82OTcKK2YgODM1Ny8xMTMwMi82OTcgODM1OC8xMTMwMy82OTcgODQwNi8xMTMwMS82OTcKK2YgODQwNi8xMTMwMS82OTcgODM2OC8xMDg4MS82OTcgODM1Ny8xMTMwMi82OTcKK2YgODM4Mi8xMTI5MC82OTcgODM4MS8xMTMwNC82OTcgODM0OC8xMDc0Mi82OTcKK2YgODM0OC8xMDc0Mi82OTcgODM4My8xMDc0MS82OTcgODM4Mi8xMTI5MC82OTcKK2YgODM2NS8xMTI5My8zMjE5IDgzNjQvMTA4NTQvMzIxOSA4Mzg1LzEwODM4LzMyMTkKK2YgODM4NS8xMDgzOC8zMjE5IDgzODYvMTA4MzcvMzIxOSA4MzY1LzExMjkzLzMyMTkKK2YgNzc4MS8xMDc0NC82OTcgNzgxOS8xMDc3NS82OTcgODM4NC8xMTI5MS82OTcKK2YgODM4NC8xMTI5MS82OTcgODM4My8xMDc0MS82OTcgNzc4MS8xMDc0NC82OTcKK2YgNzgxOS8xMDg1Ni8zMjMwIDc4NjEvMTA4MzkvMzIzMCA4Mzg1LzEwODM4LzMyMzAKK2YgODM4NS8xMDgzOC8zMzE4IDgzODQvMTEyOTQvMzMxOCA3ODE5LzEwODU2LzMzMTgKK2YgODM1OS8xMDg4MC82OTcgODM2My8xMTI5Mi82OTcgODM5NC8xMDgxNC82OTcKK2YgODM5NC8xMDgxNC82OTcgODM5My8xMDgxMy82OTcgODM1OS8xMDg4MC82OTcKK2YgODM3MC8xMTEyOS82OTcgODM3MS8xMTE2Ny82OTcgODM5OS8xMTEzMy82OTcKK2YgODM5OS8xMTEzMy82OTcgODM5OC8xMTEzMi82OTcgODM3MC8xMTEyOS82OTcKK2YgODM3NS8xMTI5Ny82OTcgODM3Ni8xMTI3MS82OTcgODM5MS8xMTIwNy82OTcKK2YgODM5MS8xMTIwNy82OTcgODM5MC8xMTIwNi82OTcgODM3NS8xMTI5Ny82OTcKK2YgODM3OC8xMTI5OS8xNzMyIDgzNzcvMTEyOTgvMTczMiA4NDAyLzExMjI5LzE3MzIKK2YgODQwMi8xMTIyOS8xNzMyIDg0MDMvMTEyMjgvMTczMiA4Mzc4LzExMjk5LzE3MzIKK2YgNzc3OS8xMDgxNi82OTcgNzkzNS8xMDg4NC82OTcgODM5Ny8xMTI4Ni82OTcKK2YgODM5Ny8xMTI4Ni82OTcgODM5My8xMDgxMy82OTcgNzc3OS8xMDgxNi82OTcKK2YgODE3NS8xMTEzMS82OTcgODE3NC8xMTE1Ni82OTcgODM4OC8xMTI5NS82OTcKK2YgODM4OC8xMTI5NS82OTcgODM5OC8xMTEzMi82OTcgODE3NS8xMTEzMS82OTcKK2YgODIxMi8xMTE2OC82OTcgODE3Ni8xMTEzNC82OTcgODM5OS8xMTEzMy82OTcKK2YgODM5OS8xMTEzMy82OTcgODQwMS8xMTI5Ni82OTcgODIxMi8xMTE2OC82OTcKK2YgODI2Ni8xMTI0OC8zMTg0IDgyMTIvMTExNjgvMzE4NCA4NDAxLzExMjk2LzMxODQKK2YgODQwMS8xMTI5Ni8zMTg0IDg0MDMvMTEzMDAvMzE4NCA4MjY2LzExMjQ4LzMxODQKK2YgODE3NC8xMTE1Ni82OTcgODI1MC8xMTIwOC82OTcgODM5MS8xMTIwNy82OTcKK2YgODM5MS8xMTIwNy82OTcgODM4OC8xMTI5NS82OTcgODE3NC8xMTE1Ni82OTcKK2YgODM1Ni8xMTI4NS82OTcgODM1Ny8xMTMwMi82OTcgODM2OC8xMDg4MS82OTcKK2YgODM2OC8xMDg4MS82OTcgODM5Ny8xMTI4Ni82OTcgODM1Ni8xMTI4NS82OTcKK2YgNzc5Ny8xMDc2NS82OTcgNzgyMi8xMDc3Ny82OTcgODM1MS8xMTMwNS82OTcKK2YgODQwNS8xMDc2Ni82OTcgNzc5Ny8xMDc2NS82OTcgODM1MS8xMTMwNS82OTcKK2YgODM1MS8xMTMwNS82OTcgODM1Mi8xMTMwNi82OTcgODQwNS8xMDc2Ni82OTcKK2YgODM4My8xMDc0MS82OTcgODM2MC8xMDc3My82OTcgODM4Mi8xMTI5MC82OTcKK2YgODM1My8xMTI4OS82OTcgNzkzNy8xMDg4Mi82OTcgODQwNS8xMDc2Ni82OTcKK2YgODQwNS8xMDc2Ni82OTcgODM1Mi8xMTMwNi82OTcgODM1My8xMTI4OS82OTcKK2YgNzkzNy8xMDg4Mi82OTcgNzkzOS8xMDc4NS82OTcgNzgxMS8xMDc2Ny82OTcKK2YgNzgxMS8xMDc2Ny82OTcgODQwNS8xMDc2Ni82OTcgNzkzNy8xMDg4Mi82OTcKK2YgODM4MS8xMTMwNC82OTcgODM4Mi8xMTI5MC82OTcgODQwNi8xMTMwMS82OTcKK2YgODQwNi8xMTMwMS82OTcgODM1OC8xMTMwMy82OTcgODM4MS8xMTMwNC82OTcKK2YgODQwNi8xMTMwMS82OTcgODM4Mi8xMTI5MC82OTcgNzc3OC8xMDU0NC82OTcKK2YgODM0OS8xMDc0My82OTcgODM0OC8xMDc0Mi82OTcgODQwOC8xMTMwNy82OTcKK2YgODQwOC8xMTMwNy82OTcgODQwNy8xMTMwOC82OTcgODM0OS8xMDc0My82OTcKK2YgODM0OC8xMDc0Mi82OTcgODM4MS8xMTMwNC82OTcgODQwOS8xMTMwOS82OTcKK2YgODQwOS8xMTMwOS82OTcgODQwOC8xMTMwNy82OTcgODM0OC8xMDc0Mi82OTcKK2YgODM4MS8xMTMwNC82OTcgODM1OC8xMTMwMy82OTcgODQxMC8xMTMxMC82OTcKK2YgODQxMC8xMTMxMC82OTcgODQwOS8xMTMwOS82OTcgODM4MS8xMTMwNC82OTcKK2YgODM1OC8xMTMwMy82OTcgODM1Ny8xMTMwMi82OTcgODQxMS8xMTMxMS82OTcKK2YgODQxMS8xMTMxMS82OTcgODQxMC8xMTMxMC82OTcgODM1OC8xMTMwMy82OTcKK2YgODM1Ny8xMTMwMi82OTcgODM1Ni8xMTI4NS82OTcgODQxMi8xMTMxMi82OTcKK2YgODQxMi8xMTMxMi82OTcgODQxMS8xMTMxMS82OTcgODM1Ny8xMTMwMi82OTcKK2YgODM1Ni8xMTI4NS82OTcgODM1NS8xMTI4Ny82OTcgODQxMy8xMTMxMy82OTcKK2YgODQxMy8xMTMxMy82OTcgODQxMi8xMTMxMi82OTcgODM1Ni8xMTI4NS82OTcKK2YgODM1NS8xMTI4Ny82OTcgODM1NC8xMTI4OC82OTcgODQxNC8xMTMxNC82OTcKK2YgODQxNC8xMTMxNC82OTcgODQxMy8xMTMxMy82OTcgODM1NS8xMTI4Ny82OTcKK2YgODM1NC8xMTI4OC82OTcgODM1My8xMTI4OS82OTcgODQxNS8xMTMxNS82OTcKK2YgODQxNS8xMTMxNS82OTcgODQxNC8xMTMxNC82OTcgODM1NC8xMTI4OC82OTcKK2YgODM1My8xMTI4OS82OTcgODM1Mi8xMTMwNi82OTcgODQxNi8xMTMxNi82OTcKK2YgODQxNi8xMTMxNi82OTcgODQxNS8xMTMxNS82OTcgODM1My8xMTI4OS82OTcKK2YgODM1Mi8xMTMwNi82OTcgODM1MS8xMTMwNS82OTcgODQxNy8xMTMxNy82OTcKK2YgODQxNy8xMTMxNy82OTcgODQxNi8xMTMxNi82OTcgODM1Mi8xMTMwNi82OTcKK2YgODM1MS8xMTMwNS82OTcgODM1MC8xMDc2Mi82OTcgODQxOC8xMTMxOC82OTcKK2YgODQxOC8xMTMxOC82OTcgODQxNy8xMTMxNy82OTcgODM1MS8xMTMwNS82OTcKK2YgODM1MC8xMDc2Mi82OTcgODM0OS8xMDc0My82OTcgODQwNy8xMTMwOC82OTcKK2YgODQwNy8xMTMwOC82OTcgODQxOC8xMTMxOC82OTcgODM1MC8xMDc2Mi82OTcKK2YgNzgwOC8xMDc2My82OTcgODM1MC8xMDc2Mi82OTcgODM1MS8xMTMwNS82OTcKK2YgODM1MS8xMTMwNS82OTcgNzgyMi8xMDc3Ny82OTcgNzgwOC8xMDc2My82OTcKK2YgNzY3NC8xMDYyMi82OTcgNzY3NS8xMDYyMS82OTcgNzU5OS8xMTMxOS82OTcKK2YgNzU5OS8xMTMxOS82OTcgNzU5OC8xMTMyMC82OTcgNzY3NC8xMDYyMi82OTcKK2YgNzY3NS8xMDYyMS82OTcgNzczMi8xMDY5MS82OTcgNzczMC8xMTMyMS82OTcKK2YgNzczMC8xMTMyMS82OTcgNzU5OS8xMTMxOS82OTcgNzY3NS8xMDYyMS82OTcKK2YgNzYxOC8xMTMyMi82OTcgNzg5OC8xMTMyMy82OTcgNzkwNC8xMTMyNC82OTcKK2YgNzkwNC8xMTMyNC82OTcgNzc4My8xMTMyNS82OTcgNzYxOC8xMTMyMi82OTcKK2YgNzYyNS8xMTMyNi82OTcgNzg5OS8xMTMyNy82OTcgNzg5Ny8xMTMyOC82OTcKK2YgNzg5Ny8xMTMyOC82OTcgNzYxMC8xMTMyOS82OTcgNzYyNS8xMTMyNi82OTcKK2YgNzYxMC8xMTMyOS82OTcgNzg5Ny8xMTMyOC82OTcgNzg5OC8xMTMyMy82OTcKK2YgNzg5OC8xMTMyMy82OTcgNzYxOC8xMTMyMi82OTcgNzYxMC8xMTMyOS82OTcKK2YgNzY2Ni8xMTMzMC82OTcgNzkwMC8xMTMzMS82OTcgNzg5OS8xMTMyNy82OTcKK2YgNzg5OS8xMTMyNy82OTcgNzYyNS8xMTMyNi82OTcgNzY2Ni8xMTMzMC82OTcKK2YgNzcwMy8xMTMzMi82OTcgNzcwNC8xMTMzMy82OTcgNzY2MC8xMTMzNC82OTcKK2YgNzY2MC8xMTMzNC82OTcgNzcwMi8xMTMzNS82OTcgNzcwMy8xMTMzMi82OTcKK2YgNzY2MC8xMTMzNC82OTcgNzcwNC8xMTMzMy82OTcgNzY5Ny8xMTMzNi82OTcKK2YgNzY5Ny8xMTMzNi82OTcgNzY5OC8xMTMzNy82OTcgNzY2MC8xMTMzNC82OTcKK2YgNzY5OS8xMTMzOC82OTcgNzcwMC8xMTMzOS82OTcgNzY2MC8xMTMzNC82OTcKK2YgNzY2MC8xMTMzNC82OTcgNzY5OC8xMTMzNy82OTcgNzY5OS8xMTMzOC82OTcKK2YgNzY2MC8xMTMzNC82OTcgNzcwMC8xMTMzOS82OTcgNzcwMS8xMTM0MC82OTcKK2YgNzcwMS8xMTM0MC82OTcgNzcwMi8xMTMzNS82OTcgNzY2MC8xMTMzNC82OTcKK2YgNzcyNi8xMTM0MS82OTcgNzkwMi8xMTM0Mi82OTcgNzkwMC8xMTMzMS82OTcKK2YgNzkwMC8xMTMzMS82OTcgNzY2Ni8xMTMzMC82OTcgNzcyNi8xMTM0MS82OTcKK2YgNzYxOC8xMTMyMi82OTcgNzc4My8xMTMyNS82OTcgNzg0Mi8xMDY0MS82OTcKK2YgNzg0Mi8xMDY0MS82OTcgNzY3OC8xMDY0MC82OTcgNzYxOC8xMTMyMi82OTcKK2YgNzYyNS8xMTMyNi82OTcgNzYxMC8xMTMyOS82OTcgNzY3Ny8xMDY0NS82OTcKK2YgNzY3Ny8xMDY0NS82OTcgNzY3OS8xMDY0NC82OTcgNzYyNS8xMTMyNi82OTcKK2YgNzYxMC8xMTMyOS82OTcgNzYxOC8xMTMyMi82OTcgNzY3OC8xMDY0MC82OTcKK2YgNzY3OC8xMDY0MC82OTcgNzY3Ny8xMDY0NS82OTcgNzYxMC8xMTMyOS82OTcKK2YgNzY2Ni8xMTMzMC82OTcgNzYyNS8xMTMyNi82OTcgNzY3OS8xMDY0NC82OTcKK2YgNzY3OS8xMDY0NC82OTcgNzY4MC8xMDY0OC82OTcgNzY2Ni8xMTMzMC82OTcKK2YgNzU5OC8xMTMyMC82OTcgNzcyNi8xMTM0MS82OTcgNzcyOC8xMDY1MC82OTcKK2YgNzcyOC8xMDY1MC82OTcgNzY3NC8xMDYyMi82OTcgNzU5OC8xMTMyMC82OTcKK2YgNzY0NS8xMDU5My82OTcgNzY0NC8xMDYwNC82OTcgNzY5OC8xMTMzNy82OTcKK2YgNzY5OC8xMTMzNy82OTcgNzY5Ny8xMTMzNi82OTcgNzY0NS8xMDU5My82OTcKK2YgNzY0NC8xMDYwNC82OTcgNzY1MS8xMDYwNi82OTcgNzY5OS8xMTMzOC82OTcKK2YgNzY5OS8xMTMzOC82OTcgNzY5OC8xMTMzNy82OTcgNzY0NC8xMDYwNC82OTcKK2YgNzY1MS8xMDYwNi82OTcgNzY1MC8xMDYwMS82OTcgNzcwMC8xMTMzOS82OTcKK2YgNzcwMC8xMTMzOS82OTcgNzY5OS8xMTMzOC82OTcgNzY1MS8xMDYwNi82OTcKK2YgNzY1MC8xMDYwMS82OTcgNzY0OS8xMDU5OS82OTcgNzcwMS8xMTM0MC82OTcKK2YgNzcwMS8xMTM0MC82OTcgNzcwMC8xMTMzOS82OTcgNzY1MC8xMDYwMS82OTcKK2YgNzY0OS8xMDU5OS82OTcgNzY0OC8xMDU5OC82OTcgNzcwMi8xMTMzNS82OTcKK2YgNzcwMi8xMTMzNS82OTcgNzcwMS8xMTM0MC82OTcgNzY0OS8xMDU5OS82OTcKK2YgNzY0OC8xMDU5OC82OTcgNzY0Ny8xMDYwNy82OTcgNzcwMy8xMTMzMi82OTcKK2YgNzcwMy8xMTMzMi82OTcgNzcwMi8xMTMzNS82OTcgNzY0OC8xMDU5OC82OTcKK2YgNzY0Ny8xMDYwNy82OTcgNzY0Ni8xMDU5NC82OTcgNzcwNC8xMTMzMy82OTcKK2YgNzcwNC8xMTMzMy82OTcgNzcwMy8xMTMzMi82OTcgNzY0Ny8xMDYwNy82OTcKK2YgNzY0Ni8xMDU5NC82OTcgNzY0NS8xMDU5My82OTcgNzY5Ny8xMTMzNi82OTcKK2YgNzY5Ny8xMTMzNi82OTcgNzcwNC8xMTMzMy82OTcgNzY0Ni8xMDU5NC82OTcKK2YgNzU5OC8xMTMyMC82OTcgNzg5NC8xMTM0My82OTcgNzkwMi8xMTM0Mi82OTcKK2YgNzkwMi8xMTM0Mi82OTcgNzcyNi8xMTM0MS82OTcgNzU5OC8xMTMyMC82OTcKK2YgNzY2Ni8xMTMzMC82OTcgNzY4MC8xMDY0OC82OTcgNzcyOC8xMDY1MC82OTcKK2YgNzcyOC8xMDY1MC82OTcgNzcyNi8xMTM0MS82OTcgNzY2Ni8xMTMzMC82OTcKK2YgNzk0Ni8xMDY1NS82OTcgNzk0NS8xMDg4NS82OTcgNzczMC8xMTMyMS82OTcKK2YgNzczMC8xMTMyMS82OTcgNzczMi8xMDY5MS82OTcgNzk0Ni8xMDY1NS82OTcKK2YgNzk0NS8xMDg4NS82OTcgNzk0OS8xMDg3My82OTcgNzkwMy8xMTM0NC82OTcKK2YgNzkwMy8xMTM0NC82OTcgNzczMC8xMTMyMS82OTcgNzk0NS8xMDg4NS82OTcKK2YgNzc1OS8xMDc5My82OTcgNzc1OC8xMTM0NS82OTcgNzc2MS8xMTM0Ni82OTcKK2YgNzc2MS8xMTM0Ni82OTcgNzc2MC8xMDc5NC82OTcgNzc1OS8xMDc5My82OTcKK2YgNzc2MC8xMDc5NC82OTcgNzc2MS8xMTM0Ni82OTcgNzc2My8xMTM0Ny82OTcKK2YgNzc2My8xMTM0Ny82OTcgNzc2Mi8xMDg2MC82OTcgNzc2MC8xMDc5NC82OTcKK2YgNzkwNC8xMTMyNC82OTcgODM2Ny8xMTM0OC82OTcgODM2MS8xMTM0OS82OTcKK2YgODM2MS8xMTM0OS82OTcgNzc4My8xMTMyNS82OTcgNzkwNC8xMTMyNC82OTcKK2YgNzkxMS8xMTM1MC82OTcgNzkxMC8xMTM1MS82OTcgNzgwMS8xMTM1Mi82OTcKK2YgNzgwMS8xMTM1Mi82OTcgNzgwMC8xMTM1My82OTcgNzkxMS8xMTM1MC82OTcKK2YgNzkwOS8xMTM1NC82OTcgNzkxMS8xMTM1MC82OTcgNzgwMC8xMTM1My82OTcKK2YgNzgwMC8xMTM1My82OTcgNzc4NC8xMTM1NS82OTcgNzkwOS8xMTM1NC82OTcKK2YgNzkxMC8xMTM1MS82OTcgNzkxMi8xMTM1Ni82OTcgNzgxNC8xMTM1Ny82OTcKK2YgNzgxNC8xMTM1Ny82OTcgNzgwMS8xMTM1Mi82OTcgNzkxMC8xMTM1MS82OTcKK2YgNzkxMi8xMTM1Ni82OTcgNzkxNC8xMTM1OC82OTcgNzc1OC8xMTM0NS82OTcKK2YgNzc1OC8xMTM0NS82OTcgNzgxNC8xMTM1Ny82OTcgNzkxMi8xMTM1Ni82OTcKK2YgODM5NC8xMDgxNC82OTcgODM4Ny8xMTM1OS82OTcgNzc4NC8xMTM1NS82OTcKK2YgNzc4NC8xMTM1NS82OTcgNzg0MS8xMDgxNS82OTcgODM5NC8xMDgxNC82OTcKK2YgNzgwMS8xMTM1Mi82OTcgNzg0My8xMDgxNy82OTcgNzg0NC8xMDgyMC82OTcKK2YgNzg0NC8xMDgyMC82OTcgNzgwMC8xMTM1My82OTcgNzgwMS8xMTM1Mi82OTcKK2YgNzgwMC8xMTM1My82OTcgNzg0NC8xMDgyMC82OTcgNzg0MS8xMDgxNS82OTcKK2YgNzg0MS8xMDgxNS82OTcgNzc4NC8xMTM1NS82OTcgNzgwMC8xMTM1My82OTcKK2YgNzgxNC8xMTM1Ny82OTcgNzg0NS8xMDgyMS82OTcgNzg0My8xMDgxNy82OTcKK2YgNzg0My8xMDgxNy82OTcgNzgwMS8xMTM1Mi82OTcgNzgxNC8xMTM1Ny82OTcKK2YgNzg0NS8xMDgyMS82OTcgNzgxNC8xMTM1Ny82OTcgNzc1OC8xMTM0NS82OTcKK2YgNzc1OC8xMTM0NS82OTcgNzc1OS8xMDc5My82OTcgNzg0NS8xMDgyMS82OTcKK2YgNzc2My8xMTM0Ny82OTcgNzg4OS8xMDg2MS82OTcgNzg4OC8xMDgyNi82OTcKK2YgNzg4OC8xMDgyNi82OTcgNzc2Mi8xMDg2MC82OTcgNzc2My8xMTM0Ny82OTcKK2YgNzkxNi8xMTM2MC82OTcgNzkxNy8xMDg3OS82OTcgNzg4OS8xMDg2MS82OTcKK2YgNzg4OS8xMDg2MS82OTcgNzc2My8xMTM0Ny82OTcgNzkxNi8xMTM2MC82OTcKK2YgODMzNi8xMTM2MS82OTcgODMzNy8xMTM2Mi82OTcgNzg3OS8xMTM2My82OTcKK2YgNzg3OS8xMTM2My82OTcgNzg3MS8xMTM2NC82OTcgODMzNi8xMTM2MS82OTcKK2YgODMzNy8xMTM2Mi82OTcgODM0NS8xMTM2NS82OTcgNzg3Ny8xMTM2Ni82OTcKK2YgNzg3Ny8xMTM2Ni82OTcgNzg3OS8xMTM2My82OTcgODMzNy8xMTM2Mi82OTcKK2YgODMzMC8xMTM2Ny82OTcgODMyOS8xMTM2OC82OTcgODI4MS8xMTM2OS82OTcKK2YgODI4MS8xMTM2OS82OTcgODI3OS8xMTM3MC82OTcgODMzMC8xMTM2Ny82OTcKK2YgODMzMS8xMTM3MS82OTcgODMzMC8xMTM2Ny82OTcgODI3OS8xMTM3MC82OTcKK2YgODI3OS8xMTM3MC82OTcgNzg3NC8xMTM3Mi82OTcgODMzMS8xMTM3MS82OTcKK2YgODM0MC8xMTM3My82OTcgODM0Ni8xMTM3NC82OTcgNzkwNC8xMTMyNC82OTcKK2YgNzkwNC8xMTMyNC82OTcgNzg5OC8xMTMyMy82OTcgODM0MC8xMTM3My82OTcKK2YgODM0MS8xMTM3NS82OTcgODMzOS8xMTM3Ni82OTcgNzg5Ny8xMTMyOC82OTcKK2YgNzg5Ny8xMTMyOC82OTcgNzg5OS8xMTMyNy82OTcgODM0MS8xMTM3NS82OTcKK2YgODMzOS8xMTM3Ni82OTcgODM0MC8xMTM3My82OTcgNzg5OC8xMTMyMy82OTcKK2YgNzg5OC8xMTMyMy82OTcgNzg5Ny8xMTMyOC82OTcgODMzOS8xMTM3Ni82OTcKK2YgODM0Mi8xMTM3Ny82OTcgODM0MS8xMTM3NS82OTcgNzg5OS8xMTMyNy82OTcKK2YgNzg5OS8xMTMyNy82OTcgNzkwMC8xMTMzMS82OTcgODM0Mi8xMTM3Ny82OTcKK2YgODM0NC8xMTM3OC82OTcgODM0Mi8xMTM3Ny82OTcgNzkwMC8xMTMzMS82OTcKK2YgNzkwMC8xMTMzMS82OTcgNzkwMi8xMTM0Mi82OTcgODM0NC8xMTM3OC82OTcKK2YgODMzNi8xMTM2MS82OTcgODM0NC8xMTM3OC82OTcgNzkwMi8xMTM0Mi82OTcKK2YgNzkwMi8xMTM0Mi82OTcgNzg5NC8xMTM0My82OTcgODMzNi8xMTM2MS82OTcKK2YgODM0Ni8xMTM3NC82OTcgODM4MC8xMTM3OS82OTcgODM2Ny8xMTM0OC82OTcKK2YgODM2Ny8xMTM0OC82OTcgNzkwNC8xMTMyNC82OTcgODM0Ni8xMTM3NC82OTcKK2YgODMyNi8xMTM4MC82OTcgODMyNS8xMTM4MS82OTcgNzkxMC8xMTM1MS82OTcKK2YgNzkxMC8xMTM1MS82OTcgNzkxMS8xMTM1MC82OTcgODMyNi8xMTM4MC82OTcKK2YgODMyNC8xMTM4Mi82OTcgODMyNi8xMTM4MC82OTcgNzkxMS8xMTM1MC82OTcKK2YgNzkxMS8xMTM1MC82OTcgNzkwOS8xMTM1NC82OTcgODMyNC8xMTM4Mi82OTcKK2YgODMyNS8xMTM4MS82OTcgODMyNy8xMTM4My82OTcgNzkxMi8xMTM1Ni82OTcKK2YgNzkxMi8xMTM1Ni82OTcgNzkxMC8xMTM1MS82OTcgODMyNS8xMTM4MS82OTcKK2YgODMyNy8xMTM4My82OTcgODMyOS8xMTM2OC82OTcgNzkxNC8xMTM1OC82OTcKK2YgNzkxNC8xMTM1OC82OTcgNzkxMi8xMTM1Ni82OTcgODMyNy8xMTM4My82OTcKK2YgODMzMS8xMTM3MS82OTcgODMzMi8xMDg2NC82OTcgNzkxNy8xMDg3OS82OTcKK2YgNzkxNy8xMDg3OS82OTcgNzkxNi8xMTM2MC82OTcgODMzMS8xMTM3MS82OTcKK2YgNzU5OC8xMTMyMC82OTcgNzU5OS8xMTMxOS82OTcgNzg5NS8xMTM4NC82OTcKK2YgNzg5NS8xMTM4NC82OTcgNzg5NC8xMTM0My82OTcgNzU5OC8xMTMyMC82OTcKK2YgNzU5OS8xMTMxOS82OTcgNzczMC8xMTMyMS82OTcgNzkwMy8xMTM0NC82OTcKK2YgNzkwMy8xMTM0NC82OTcgNzg5NS8xMTM4NC82OTcgNzU5OS8xMTMxOS82OTcKK2YgNzc2MS8xMTM0Ni82OTcgNzc1OC8xMTM0NS82OTcgNzkxNC8xMTM1OC82OTcKK2YgNzkxNC8xMTM1OC82OTcgNzkxNS8xMTM4NS82OTcgNzc2MS8xMTM0Ni82OTcKK2YgNzc2My8xMTM0Ny82OTcgNzc2MS8xMTM0Ni82OTcgNzkxNS8xMTM4NS82OTcKK2YgNzkxNS8xMTM4NS82OTcgNzkxNi8xMTM2MC82OTcgNzc2My8xMTM0Ny82OTcKK2YgNzg3Ny8xMTM2Ni82OTcgODM0NS8xMTM2NS82OTcgODM0Ny8xMDg3Mi82OTcKK2YgODM0Ny8xMDg3Mi82OTcgNzk0OC8xMTI3OS82OTcgNzg3Ny8xMTM2Ni82OTcKK2YgNzk4MC8xMTAwMi82OTcgNzk3OS8xMTM4Ni82OTcgNzk4Mi8xMTM4Ny82OTcKK2YgNzk4Mi8xMTM4Ny82OTcgNzk4MS8xMTAwMy82OTcgNzk4MC8xMTAwMi82OTcKK2YgNzk4MS8xMTAwMy82OTcgNzk4Mi8xMTM4Ny82OTcgNzk4NC8xMTM4OC82OTcKK2YgNzk4NC8xMTM4OC82OTcgNzk4My8xMTA3OS82OTcgNzk4MS8xMTAwMy82OTcKK2YgODAwOC8xMTM4OS82OTcgODAwNy8xMTM5MC82OTcgODAxMC8xMTM5MS82OTcKK2YgODAxMC8xMTM5MS82OTcgODAwOS8xMTM5Mi82OTcgODAwOC8xMTM4OS82OTcKK2YgODAyOC8xMTM5My82OTcgODAyNy8xMTM5NC82OTcgODAzMC8xMTM5NS82OTcKK2YgODAzMC8xMTM5NS82OTcgODAyOS8xMTM5Ni82OTcgODAyOC8xMTM5My82OTcKK2YgODAyNy8xMTM5NC82OTcgODAwOC8xMTM4OS82OTcgODAwOS8xMTM5Mi82OTcKK2YgODAwOS8xMTM5Mi82OTcgODAzMC8xMTM5NS82OTcgODAyNy8xMTM5NC82OTcKK2YgODA0My8xMTM5Ny82OTcgODAyOC8xMTM5My82OTcgODAyOS8xMTM5Ni82OTcKK2YgODAyOS8xMTM5Ni82OTcgODA0NC8xMTM5OC82OTcgODA0My8xMTM5Ny82OTcKK2YgODA2Ni8xMTM5OS82OTcgODA0My8xMTM5Ny82OTcgODA0NC8xMTM5OC82OTcKK2YgODA0NC8xMTM5OC82OTcgODA2Ny8xMTQwMC82OTcgODA2Ni8xMTM5OS82OTcKK2YgODAwOC8xMTM4OS82OTcgODA3Ni8xMTAyMi82OTcgODA3Ny8xMTAyNS82OTcKK2YgODA3Ny8xMTAyNS82OTcgODAwNy8xMTM5MC82OTcgODAwOC8xMTM4OS82OTcKK2YgODAyOC8xMTM5My82OTcgODA3OC8xMTAyNi82OTcgODA3OS8xMTAyOS82OTcKK2YgODA3OS8xMTAyOS82OTcgODAyNy8xMTM5NC82OTcgODAyOC8xMTM5My82OTcKK2YgODAyNy8xMTM5NC82OTcgODA3OS8xMTAyOS82OTcgODA3Ni8xMTAyMi82OTcKK2YgODA3Ni8xMTAyMi82OTcgODAwOC8xMTM4OS82OTcgODAyNy8xMTM5NC82OTcKK2YgODA0My8xMTM5Ny82OTcgODA4MC8xMTAzMC82OTcgODA3OC8xMTAyNi82OTcKK2YgODA3OC8xMTAyNi82OTcgODAyOC8xMTM5My82OTcgODA0My8xMTM5Ny82OTcKK2YgNzk3OS8xMTM4Ni82OTcgNzk4MC8xMTAwMi82OTcgODA4MS8xMTAzMy82OTcKK2YgODA4MS8xMTAzMy82OTcgODA2Ni8xMTM5OS82OTcgNzk3OS8xMTM4Ni82OTcKK2YgNzk3OS8xMTM4Ni82OTcgODA2Ni8xMTM5OS82OTcgODA2Ny8xMTQwMC82OTcKK2YgODA2Ny8xMTQwMC82OTcgODEyNi8xMTQwMS82OTcgNzk3OS8xMTM4Ni82OTcKK2YgODA0My8xMTM5Ny82OTcgODA2Ni8xMTM5OS82OTcgODA4MS8xMTAzMy82OTcKK2YgODA4MS8xMTAzMy82OTcgODA4MC8xMTAzMC82OTcgODA0My8xMTM5Ny82OTcKK2YgNzk4NC8xMTM4OC82OTcgODEyNy8xMTI3Mi82OTcgODEwMy8xMTAzNi82OTcKK2YgODEwMy8xMTAzNi82OTcgNzk4My8xMTA3OS82OTcgNzk4NC8xMTM4OC82OTcKK2YgODEyNy8xMTI3Mi82OTcgNzk4NC8xMTM4OC82OTcgODEyOS8xMTQwMi82OTcKK2YgODEyOS8xMTQwMi82OTcgODEyOC8xMTI2My82OTcgODEyNy8xMTI3Mi82OTcKK2YgODE1OS8xMTE4Ny82OTcgODE1OC8xMTE4Ni82OTcgODE1Ny8xMTQwMy82OTcKK2YgODE1Ny8xMTQwMy82OTcgODE1Ni8xMTQwNC82OTcgODE1OS8xMTE4Ny82OTcKK2YgODE1OC8xMTE4Ni82OTcgODE2MS8xMTI1My82OTcgODE2MC8xMTQwNS82OTcKK2YgODE2MC8xMTQwNS82OTcgODE1Ny8xMTQwMy82OTcgODE1OC8xMTE4Ni82OTcKK2YgODM3My8xMTQwNi82OTcgODM3Mi8xMTQwNy82OTcgODAxMC8xMTM5MS82OTcKK2YgODAxMC8xMTM5MS82OTcgODAwNy8xMTM5MC82OTcgODM3My8xMTQwNi82OTcKK2YgODE5NS8xMTQwOC82OTcgODE5NC8xMTQwOS82OTcgODE5Ny8xMTQxMC82OTcKK2YgODE5Ny8xMTQxMC82OTcgODE5Ni8xMTQxMS82OTcgODE5NS8xMTQwOC82OTcKK2YgODE3Ny8xMTQxMi82OTcgODE3OC8xMTQxMy82OTcgODE5NC8xMTQwOS82OTcKK2YgODE5NC8xMTQwOS82OTcgODE5NS8xMTQwOC82OTcgODE3Ny8xMTQxMi82OTcKK2YgODE5Ni8xMTQxMS82OTcgODE5Ny8xMTQxMC82OTcgODIwOC8xMTQxNC82OTcKK2YgODIwOC8xMTQxNC82OTcgODIwNy8xMTQxNS82OTcgODE5Ni8xMTQxMS82OTcKK2YgODIwNy8xMTQxNS82OTcgODIwOC8xMTQxNC82OTcgODE1Ni8xMTQwNC82OTcKK2YgODE1Ni8xMTQwNC82OTcgODIyNC8xMTQxNi82OTcgODIwNy8xMTQxNS82OTcKK2YgODE3OC8xMTQxMy82OTcgODQwMC8xMTQxNy82OTcgODM5MC8xMTIwNi82OTcKK2YgODM5MC8xMTIwNi82OTcgODIzNC8xMTIwNS82OTcgODE3OC8xMTQxMy82OTcKK2YgODE5Ny8xMTQxMC82OTcgODE5NC8xMTQwOS82OTcgODIzNi8xMTIxMC82OTcKK2YgODIzNi8xMTIxMC82OTcgODIzNS8xMTIwOS82OTcgODE5Ny8xMTQxMC82OTcKK2YgODE5NC8xMTQwOS82OTcgODE3OC8xMTQxMy82OTcgODIzNC8xMTIwNS82OTcKK2YgODIzNC8xMTIwNS82OTcgODIzNi8xMTIxMC82OTcgODE5NC8xMTQwOS82OTcKK2YgODIwOC8xMTQxNC82OTcgODE5Ny8xMTQxMC82OTcgODIzNS8xMTIwOS82OTcKK2YgODIzNS8xMTIwOS82OTcgODIzNy8xMTIxMy82OTcgODIwOC8xMTQxNC82OTcKK2YgODIzNy8xMTIxMy82OTcgODE1OS8xMTE4Ny82OTcgODE1Ni8xMTQwNC82OTcKK2YgODE1Ni8xMTQwNC82OTcgODIwOC8xMTQxNC82OTcgODIzNy8xMTIxMy82OTcKK2YgODI1Ni8xMTIxNi82OTcgODI3Ny8xMTI1NC82OTcgODE2MC8xMTQwNS82OTcKK2YgODE2MC8xMTQwNS82OTcgODE2MS8xMTI1My82OTcgODI1Ni8xMTIxNi82OTcKK2YgODI3NS8xMTQxOC82OTcgODE2MC8xMTQwNS82OTcgODI3Ny8xMTI1NC82OTcKK2YgODI3Ny8xMTI1NC82OTcgODI3Ni8xMTI3MC82OTcgODI3NS8xMTQxOC82OTcKK2YgNzg3OS8xMTM2My82OTcgODI5My8xMTQxOS82OTcgODI5Mi8xMTQyMC82OTcKK2YgODI5Mi8xMTQyMC82OTcgNzg3MS8xMTM2NC82OTcgNzg3OS8xMTM2My82OTcKK2YgNzg3Ny8xMTM2Ni82OTcgODI5NC8xMTQyMS82OTcgODI5My8xMTQxOS82OTcKK2YgODI5My8xMTQxOS82OTcgNzg3OS8xMTM2My82OTcgNzg3Ny8xMTM2Ni82OTcKK2YgODI4MS8xMTM2OS82OTcgODI5Ni8xMTQyMi82OTcgODI5NS8xMTQyMy82OTcKK2YgODI5NS8xMTQyMy82OTcgODI3OS8xMTM3MC82OTcgODI4MS8xMTM2OS82OTcKK2YgODI3OS8xMTM3MC82OTcgODI5NS8xMTQyMy82OTcgODI5Ny8xMTQyNC82OTcKK2YgODI5Ny8xMTQyNC82OTcgNzg3NC8xMTM3Mi82OTcgODI3OS8xMTM3MC82OTcKK2YgODAxMC8xMTM5MS82OTcgODMwNS8xMTQyNS82OTcgODMwNC8xMTQyNi82OTcKK2YgODMwNC8xMTQyNi82OTcgODAwOS8xMTM5Mi82OTcgODAxMC8xMTM5MS82OTcKK2YgODAzMC8xMTM5NS82OTcgODMwNy8xMTQyNy82OTcgODMwNi8xMTQyOC82OTcKK2YgODMwNi8xMTQyOC82OTcgODAyOS8xMTM5Ni82OTcgODAzMC8xMTM5NS82OTcKK2YgODAwOS8xMTM5Mi82OTcgODMwNC8xMTQyNi82OTcgODMwNy8xMTQyNy82OTcKK2YgODMwNy8xMTQyNy82OTcgODAzMC8xMTM5NS82OTcgODAwOS8xMTM5Mi82OTcKK2YgODAyOS8xMTM5Ni82OTcgODMwNi8xMTQyOC82OTcgODMwOC8xMTQyOS82OTcKK2YgODMwOC8xMTQyOS82OTcgODA0NC8xMTM5OC82OTcgODAyOS8xMTM5Ni82OTcKK2YgODA0NC8xMTM5OC82OTcgODMwOC8xMTQyOS82OTcgODMwOS8xMTQzMC82OTcKK2YgODMwOS8xMTQzMC82OTcgODA2Ny8xMTQwMC82OTcgODA0NC8xMTM5OC82OTcKK2YgODA2Ny8xMTQwMC82OTcgODMwOS8xMTQzMC82OTcgODI5Mi8xMTQyMC82OTcKK2YgODI5Mi8xMTQyMC82OTcgODEyNi8xMTQwMS82OTcgODA2Ny8xMTQwMC82OTcKK2YgODM3Mi8xMTQwNy82OTcgODM3OS8xMTQzMS82OTcgODMwNS8xMTQyNS82OTcKK2YgODMwNS8xMTQyNS82OTcgODAxMC8xMTM5MS82OTcgODM3Mi8xMTQwNy82OTcKK2YgODE5Ni8xMTQxMS82OTcgODMxOC8xMTQzMi82OTcgODMxNy8xMTQzMy82OTcKK2YgODMxNy8xMTQzMy82OTcgODE5NS8xMTQwOC82OTcgODE5Ni8xMTQxMS82OTcKK2YgODE5NS8xMTQwOC82OTcgODMxNy8xMTQzMy82OTcgODMxNi8xMTQzNC82OTcKK2YgODMxNi8xMTQzNC82OTcgODE3Ny8xMTQxMi82OTcgODE5NS8xMTQwOC82OTcKK2YgODIwNy8xMTQxNS82OTcgODMxOS8xMTQzNS82OTcgODMxOC8xMTQzMi82OTcKK2YgODMxOC8xMTQzMi82OTcgODE5Ni8xMTQxMS82OTcgODIwNy8xMTQxNS82OTcKK2YgODIyNC8xMTQxNi82OTcgODI5Ni8xMTQyMi82OTcgODMxOS8xMTQzNS82OTcKK2YgODMxOS8xMTQzNS82OTcgODIwNy8xMTQxNS82OTcgODIyNC8xMTQxNi82OTcKK2YgODI3Ni8xMTI3MC82OTcgODI5OS8xMTI1NS82OTcgODI5Ny8xMTQyNC82OTcKK2YgODI5Ny8xMTQyNC82OTcgODI3NS8xMTQxOC82OTcgODI3Ni8xMTI3MC82OTcKK2YgNzk3OS8xMTM4Ni82OTcgODEyNi8xMTQwMS82OTcgODI3OC8xMTQzNi82OTcKK2YgODI3OC8xMTQzNi82OTcgNzk4Mi8xMTM4Ny82OTcgNzk3OS8xMTM4Ni82OTcKK2YgNzk4Mi8xMTM4Ny82OTcgODI3OC8xMTQzNi82OTcgODEyOS8xMTQwMi82OTcKK2YgODEyOS8xMTQwMi82OTcgNzk4NC8xMTM4OC82OTcgNzk4Mi8xMTM4Ny82OTcKK2YgODE1Ny8xMTQwMy82OTcgODI4MC8xMTQzNy82OTcgODIyNC8xMTQxNi82OTcKK2YgODIyNC8xMTQxNi82OTcgODE1Ni8xMTQwNC82OTcgODE1Ny8xMTQwMy82OTcKK2YgODE2MC8xMTQwNS82OTcgODI3NS8xMTQxOC82OTcgODI4MC8xMTQzNy82OTcKK2YgODI4MC8xMTQzNy82OTcgODE1Ny8xMTQwMy82OTcgODE2MC8xMTQwNS82OTcKK2YgODMxMS8xMTI2NC82OTcgODI5NC8xMTQyMS82OTcgNzg3Ny8xMTM2Ni82OTcKK2YgNzg3Ny8xMTM2Ni82OTcgNzk0OC8xMTI3OS82OTcgODMxMS8xMTI2NC82OTcKK2YgODI3OC8xMTQzNi82OTcgODEyNi8xMTQwMS82OTcgODI5Mi8xMTQyMC82OTcKK2YgODI5Mi8xMTQyMC82OTcgODI5My8xMTQxOS82OTcgODI3OC8xMTQzNi82OTcKK2YgODEyOS8xMTQwMi82OTcgODI3OC8xMTQzNi82OTcgODI5My8xMTQxOS82OTcKK2YgODI5My8xMTQxOS82OTcgODI5NC8xMTQyMS82OTcgODEyOS8xMTQwMi82OTcKK2YgODIyNC8xMTQxNi82OTcgODI4MC8xMTQzNy82OTcgODI5NS8xMTQyMy82OTcKK2YgODI5NS8xMTQyMy82OTcgODI5Ni8xMTQyMi82OTcgODIyNC8xMTQxNi82OTcKK2YgODI4MC8xMTQzNy82OTcgODI3NS8xMTQxOC82OTcgODI5Ny8xMTQyNC82OTcKK2YgODI5Ny8xMTQyNC82OTcgODI5NS8xMTQyMy82OTcgODI4MC8xMTQzNy82OTcKK2YgNzg4Mi8xMTQzOC82OTcgNzg4MS8xMTQzOS82OTcgODMwNC8xMTQyNi82OTcKK2YgODMwNC8xMTQyNi82OTcgODMwNS8xMTQyNS82OTcgNzg4Mi8xMTQzOC82OTcKK2YgNzg4My8xMTQ0MC82OTcgODI4NS8xMTQ0MS82OTcgODMwNi8xMTQyOC82OTcKK2YgODMwNi8xMTQyOC82OTcgODMwNy8xMTQyNy82OTcgNzg4My8xMTQ0MC82OTcKK2YgNzg4MS8xMTQzOS82OTcgNzg4My8xMTQ0MC82OTcgODMwNy8xMTQyNy82OTcKK2YgODMwNy8xMTQyNy82OTcgODMwNC8xMTQyNi82OTcgNzg4MS8xMTQzOS82OTcKK2YgODI4NS8xMTQ0MS82OTcgODI4Ni8xMTQ0Mi82OTcgODMwOC8xMTQyOS82OTcKK2YgODMwOC8xMTQyOS82OTcgODMwNi8xMTQyOC82OTcgODI4NS8xMTQ0MS82OTcKK2YgODI4Ni8xMTQ0Mi82OTcgNzg4NC8xMTQ0My82OTcgODMwOS8xMTQzMC82OTcKK2YgODMwOS8xMTQzMC82OTcgODMwOC8xMTQyOS82OTcgODI4Ni8xMTQ0Mi82OTcKK2YgNzg4NC8xMTQ0My82OTcgNzg3MS8xMTM2NC82OTcgODI5Mi8xMTQyMC82OTcKK2YgODI5Mi8xMTQyMC82OTcgODMwOS8xMTQzMC82OTcgNzg4NC8xMTQ0My82OTcKK2YgNzg3My8xMTQ0NC82OTcgODM5NS8xMTQ0NS82OTcgODM5Mi8xMTQ0Ni82OTcKK2YgODM5Mi8xMTQ0Ni82OTcgODMxNi8xMTQzNC82OTcgNzg3My8xMTQ0NC82OTcKK2YgODI5MC8xMTQ0Ny82OTcgNzg4Ni8xMTQ0OC82OTcgODMxNy8xMTQzMy82OTcKK2YgODMxNy8xMTQzMy82OTcgODMxOC8xMTQzMi82OTcgODI5MC8xMTQ0Ny82OTcKK2YgNzg4Ni8xMTQ0OC82OTcgNzg3My8xMTQ0NC82OTcgODMxNi8xMTQzNC82OTcKK2YgODMxNi8xMTQzNC82OTcgODMxNy8xMTQzMy82OTcgNzg4Ni8xMTQ0OC82OTcKK2YgNzg3OC8xMTQ0OS82OTcgODI5MC8xMTQ0Ny82OTcgODMxOC8xMTQzMi82OTcKK2YgODMxOC8xMTQzMi82OTcgODMxOS8xMTQzNS82OTcgNzg3OC8xMTQ0OS82OTcKK2YgODI4MS8xMTM2OS82OTcgNzg3OC8xMTQ0OS82OTcgODMxOS8xMTQzNS82OTcKK2YgODMxOS8xMTQzNS82OTcgODI5Ni8xMTQyMi82OTcgODI4MS8xMTM2OS82OTcKK2YgNzg5MC8xMDg2NS82OTcgNzg3NC8xMTM3Mi82OTcgODI5Ny8xMTQyNC82OTcKK2YgODI5Ny8xMTQyNC82OTcgODI5OS8xMTI1NS82OTcgNzg5MC8xMDg2NS82OTcKK2YgODEyOC8xMTI2My82OTcgODEyOS8xMTQwMi82OTcgODI5NC8xMTQyMS82OTcKK2YgODI5NC8xMTQyMS82OTcgODMxMS8xMTI2NC82OTcgODEyOC8xMTI2My82OTcKK2YgNzg5NC8xMTM0My82OTcgNzg5NS8xMTM4NC82OTcgODMzNy8xMTM2Mi82OTcKK2YgODMzNy8xMTM2Mi82OTcgODMzNi8xMTM2MS82OTcgNzg5NC8xMTM0My82OTcKK2YgNzg5NS8xMTM4NC82OTcgNzkwMy8xMTM0NC82OTcgODM0NS8xMTM2NS82OTcKK2YgODM0NS8xMTM2NS82OTcgODMzNy8xMTM2Mi82OTcgNzg5NS8xMTM4NC82OTcKK2YgNzkxNS8xMTM4NS82OTcgNzkxNC8xMTM1OC82OTcgODMyOS8xMTM2OC82OTcKK2YgODMyOS8xMTM2OC82OTcgODMzMC8xMTM2Ny82OTcgNzkxNS8xMTM4NS82OTcKK2YgNzkxNi8xMTM2MC82OTcgNzkxNS8xMTM4NS82OTcgODMzMC8xMTM2Ny82OTcKK2YgODMzMC8xMTM2Ny82OTcgODMzMS8xMTM3MS82OTcgNzkxNi8xMTM2MC82OTcKK2YgNzg4MS8xMTQzOS82OTcgNzg4Mi8xMTQzOC82OTcgODM0Ni8xMTM3NC82OTcKK2YgODM0Ni8xMTM3NC82OTcgODM0MC8xMTM3My82OTcgNzg4MS8xMTQzOS82OTcKK2YgODI4NS8xMTQ0MS82OTcgNzg4My8xMTQ0MC82OTcgODMzOS8xMTM3Ni82OTcKK2YgODMzOS8xMTM3Ni82OTcgODM0MS8xMTM3NS82OTcgODI4NS8xMTQ0MS82OTcKK2YgNzg4My8xMTQ0MC82OTcgNzg4MS8xMTQzOS82OTcgODM0MC8xMTM3My82OTcKK2YgODM0MC8xMTM3My82OTcgODMzOS8xMTM3Ni82OTcgNzg4My8xMTQ0MC82OTcKK2YgODI4Ni8xMTQ0Mi82OTcgODI4NS8xMTQ0MS82OTcgODM0MS8xMTM3NS82OTcKK2YgODM0MS8xMTM3NS82OTcgODM0Mi8xMTM3Ny82OTcgODI4Ni8xMTQ0Mi82OTcKK2YgNzg4NC8xMTQ0My82OTcgODI4Ni8xMTQ0Mi82OTcgODM0Mi8xMTM3Ny82OTcKK2YgODM0Mi8xMTM3Ny82OTcgODM0NC8xMTM3OC82OTcgNzg4NC8xMTQ0My82OTcKK2YgNzg3MS8xMTM2NC82OTcgNzg4NC8xMTQ0My82OTcgODM0NC8xMTM3OC82OTcKK2YgODM0NC8xMTM3OC82OTcgODMzNi8xMTM2MS82OTcgNzg3MS8xMTM2NC82OTcKK2YgNzg4Mi8xMTQzOC82OTcgODM2Ni8xMTQ1MC82OTcgODM4MC8xMTM3OS82OTcKK2YgODM4MC8xMTM3OS82OTcgODM0Ni8xMTM3NC82OTcgNzg4Mi8xMTQzOC82OTcKK2YgNzg4Ni8xMTQ0OC82OTcgODI5MC8xMTQ0Ny82OTcgODMyNS8xMTM4MS82OTcKK2YgODMyNS8xMTM4MS82OTcgODMyNi8xMTM4MC82OTcgNzg4Ni8xMTQ0OC82OTcKK2YgNzg3My8xMTQ0NC82OTcgNzg4Ni8xMTQ0OC82OTcgODMyNi8xMTM4MC82OTcKK2YgODMyNi8xMTM4MC82OTcgODMyNC8xMTM4Mi82OTcgNzg3My8xMTQ0NC82OTcKK2YgODI5MC8xMTQ0Ny82OTcgNzg3OC8xMTQ0OS82OTcgODMyNy8xMTM4My82OTcKK2YgODMyNy8xMTM4My82OTcgODMyNS8xMTM4MS82OTcgODI5MC8xMTQ0Ny82OTcKK2YgNzg3OC8xMTQ0OS82OTcgODI4MS8xMTM2OS82OTcgODMyOS8xMTM2OC82OTcKK2YgODMyOS8xMTM2OC82OTcgODMyNy8xMTM4My82OTcgNzg3OC8xMTQ0OS82OTcKK2YgNzg3NC8xMTM3Mi82OTcgNzg5MC8xMDg2NS82OTcgODMzMi8xMDg2NC82OTcKK2YgODMzMi8xMDg2NC82OTcgODMzMS8xMTM3MS82OTcgNzg3NC8xMTM3Mi82OTcKK2YgNzkwMy8xMTM0NC82OTcgNzk0OS8xMDg3My82OTcgODM0Ny8xMDg3Mi82OTcKK2YgODM0Ny8xMDg3Mi82OTcgODM0NS8xMTM2NS82OTcgNzkwMy8xMTM0NC82OTcKK2YgODM5Ni8xMTQ1MS82OTcgODM4Ny8xMTM1OS82OTcgODM2MS8xMTM0OS82OTcKK2YgODM2MS8xMTM0OS82OTcgODM2Ny8xMTM0OC82OTcgODM5Ni8xMTQ1MS82OTcKK2YgNzg0Mi8xMDY0MS82OTcgNzc4My8xMTMyNS82OTcgODM2MS8xMTM0OS82OTcKK2YgODM2MS8xMTM0OS82OTcgODM2My8xMTI5Mi82OTcgNzg0Mi8xMDY0MS82OTcKK2YgODQwNC8xMTQ1Mi82OTcgODM5Ni8xMTQ1MS82OTcgODM2Ny8xMTM0OC82OTcKK2YgODM2Ny8xMTM0OC82OTcgODM4MC8xMTM3OS82OTcgODQwNC8xMTQ1Mi82OTcKK2YgODQwMC8xMTQxNy82OTcgODM4OS8xMTQ1My82OTcgODM3Mi8xMTQwNy82OTcKK2YgODM3Mi8xMTQwNy82OTcgODM3My8xMTQwNi82OTcgODQwMC8xMTQxNy82OTcKK2YgODAwNy8xMTM5MC82OTcgODA3Ny8xMTAyNS82OTcgODM3NS8xMTI5Ny82OTcKK2YgODM3NS8xMTI5Ny82OTcgODM3My8xMTQwNi82OTcgODAwNy8xMTM5MC82OTcKK2YgODM4OS8xMTQ1My82OTcgODM5Mi8xMTQ0Ni82OTcgODM3OS8xMTQzMS82OTcKK2YgODM3OS8xMTQzMS82OTcgODM3Mi8xMTQwNy82OTcgODM4OS8xMTQ1My82OTcKK2YgNzg4Mi8xMTQzOC82OTcgODMwNS8xMTQyNS82OTcgODM3OS8xMTQzMS82OTcKK2YgODM3OS8xMTQzMS82OTcgODM2Ni8xMTQ1MC82OTcgNzg4Mi8xMTQzOC82OTcKK2YgODM5NS8xMTQ0NS82OTcgODQwNC8xMTQ1Mi82OTcgODM4MC8xMTM3OS82OTcKK2YgODM4MC8xMTM3OS82OTcgODM2Ni8xMTQ1MC82OTcgODM5NS8xMTQ0NS82OTcKK2YgODM2My8xMTI5Mi82OTcgODM2MS8xMTM0OS82OTcgODM4Ny8xMTM1OS82OTcKK2YgODM4Ny8xMTM1OS82OTcgODM5NC8xMDgxNC82OTcgODM2My8xMTI5Mi82OTcKK2YgODM3My8xMTQwNi82OTcgODM3NS8xMTI5Ny82OTcgODM5MC8xMTIwNi82OTcKK2YgODM5MC8xMTIwNi82OTcgODQwMC8xMTQxNy82OTcgODM3My8xMTQwNi82OTcKK2YgODM2Ni8xMTQ1MC82OTcgODM3OS8xMTQzMS82OTcgODM5Mi8xMTQ0Ni82OTcKK2YgODM5Mi8xMTQ0Ni82OTcgODM5NS8xMTQ0NS82OTcgODM2Ni8xMTQ1MC82OTcKK2YgNzkwOS8xMTM1NC82OTcgNzc4NC8xMTM1NS82OTcgODM4Ny8xMTM1OS82OTcKK2YgODM4Ny8xMTM1OS82OTcgODM5Ni8xMTQ1MS82OTcgNzkwOS8xMTM1NC82OTcKK2YgODMyNC8xMTM4Mi82OTcgNzkwOS8xMTM1NC82OTcgODM5Ni8xMTQ1MS82OTcKK2YgODM5Ni8xMTQ1MS82OTcgODQwNC8xMTQ1Mi82OTcgODMyNC8xMTM4Mi82OTcKK2YgODE3OC8xMTQxMy82OTcgODE3Ny8xMTQxMi82OTcgODM4OS8xMTQ1My82OTcKK2YgODM4OS8xMTQ1My82OTcgODQwMC8xMTQxNy82OTcgODE3OC8xMTQxMy82OTcKK2YgODE3Ny8xMTQxMi82OTcgODMxNi8xMTQzNC82OTcgODM5Mi8xMTQ0Ni82OTcKK2YgODM5Mi8xMTQ0Ni82OTcgODM4OS8xMTQ1My82OTcgODE3Ny8xMTQxMi82OTcKK2YgNzg3My8xMTQ0NC82OTcgODMyNC8xMTM4Mi82OTcgODQwNC8xMTQ1Mi82OTcKK2YgODQwNC8xMTQ1Mi82OTcgODM5NS8xMTQ0NS82OTcgNzg3My8xMTQ0NC82OTcKK2YgODQzNy8xMTQ1NC82OTcgODQzNi8xMTQ1NS82OTcgODQzNS8xMTQ1Ni82OTcKK2YgODQzNS8xMTQ1Ni82OTcgODQzNC8xMTQ1Ny82OTcgODQzNy8xMTQ1NC82OTcKK2YgODQ0MS8xMTQ1OC82OTcgODQ0MC8xMTQ1OS82OTcgODQzOS8xMTQ2MC82OTcKK2YgODQzOS8xMTQ2MC82OTcgODQzOC8xMTQ2MS82OTcgODQ0MS8xMTQ1OC82OTcKK2YgODQ0My8xMTQ2Mi82OTcgODQzNC8xMTQ1Ny82OTcgODQzNS8xMTQ1Ni82OTcKK2YgODQzNS8xMTQ1Ni82OTcgODQ0Mi8xMTQ2My82OTcgODQ0My8xMTQ2Mi82OTcKK2YgODQ0MS8xMTQ1OC82OTcgODQ0NS8xMTQ2NC82OTcgODQ0NC8xMTQ2NS82OTcKK2YgODQ0NC8xMTQ2NS82OTcgODQ0MC8xMTQ1OS82OTcgODQ0MS8xMTQ1OC82OTcKK2YgODQzNi8xMTQ1NS82OTcgODQzNy8xMTQ1NC82OTcgODQ0Ny8xMTQ2Ni82OTcKK2YgODQ0Ny8xMTQ2Ni82OTcgODQ0Ni8xMTQ2Ny82OTcgODQzNi8xMTQ1NS82OTcKK2YgODQzOC8xMTQ2MS82OTcgODQzOS8xMTQ2MC82OTcgODQ0OS8xMTQ2OC82OTcKK2YgODQ0OS8xMTQ2OC82OTcgODQ0OC8xMTQ2OS82OTcgODQzOC8xMTQ2MS82OTcKK2YgODQ1NC8xMTQ3MC82OTcgODQ1Ni8xMTQ3MS82OTcgODQ1MC8xMTQ3Mi82OTcKK2YgODQ1MC8xMTQ3Mi82OTcgODQ1NS8xMTQ3My82OTcgODQ1NC8xMTQ3MC82OTcKK2YgODQ1NC8xMTQ3MC82OTcgODQ1NS8xMTQ3My82OTcgODQ1My8xMTQ3NC82OTcKK2YgODQ1My8xMTQ3NC82OTcgODQ1Ny8xMTQ3NS82OTcgODQ1NC8xMTQ3MC82OTcKK2YgODQ2My8xMTQ3Ni82OTcgODQ2Mi8xMTQ3Ny82OTcgODQ2MS8xMTQ3OC82OTcKK2YgODQ2MS8xMTQ3OC82OTcgODQ2MC8xMTQ3OS82OTcgODQ2My8xMTQ3Ni82OTcKK2YgODQ2Ny8xMTQ4MC82OTcgODQ2Ni8xMTQ4MS82OTcgODQ2NS8xMTQ4Mi82OTcKK2YgODQ2NS8xMTQ4Mi82OTcgODQ2NC8xMTQ4My82OTcgODQ2Ny8xMTQ4MC82OTcKK2YgODQ2OC8xMTQ4NC82OTcgODQ2MC8xMTQ3OS82OTcgODQ2MS8xMTQ3OC82OTcKK2YgODQ2MS8xMTQ3OC82OTcgODQ1OS8xMTQ4NS82OTcgODQ2OC8xMTQ4NC82OTcKK2YgODQ2Ny8xMTQ4MC82OTcgODQ2OS8xMTQ4Ni82OTcgODQ1OC8xMTQ4Ny82OTcKK2YgODQ1OC8xMTQ4Ny82OTcgODQ2Ni8xMTQ4MS82OTcgODQ2Ny8xMTQ4MC82OTcKK2YgODQ2Mi8xMTQ3Ny82OTcgODQ3MC8xMTQ4OC82OTcgODQ0Ny8xMTQ2Ni82OTcKK2YgODQ0Ny8xMTQ2Ni82OTcgODQzNy8xMTQ1NC82OTcgODQ2Mi8xMTQ3Ny82OTcKK2YgODQ2Mi8xMTQ3Ny82OTcgODQ2My8xMTQ3Ni82OTcgODQ3MS8xMTQ4OS82OTcKK2YgODQ3MS8xMTQ4OS82OTcgODQ3MC8xMTQ4OC82OTcgODQ2Mi8xMTQ3Ny82OTcKK2YgODQzOC8xMTQ2MS82OTcgODQ0OC8xMTQ2OS82OTcgODQ3Mi8xMTQ5MC82OTcKK2YgODQ3Mi8xMTQ5MC82OTcgODQ2NS8xMTQ4Mi82OTcgODQzOC8xMTQ2MS82OTcKK2YgODQ2NC8xMTQ4My82OTcgODQ2NS8xMTQ4Mi82OTcgODQ3Mi8xMTQ5MC82OTcKK2YgODQ3Mi8xMTQ5MC82OTcgODQ3My8xMTQ5MS82OTcgODQ2NC8xMTQ4My82OTcKK2YgODQ3Ni8xMTQ5Mi82OTcgODQ3OC8xMTQ5My82OTcgODQ3NC8xMTQ5NC82OTcKK2YgODQ3NC8xMTQ5NC82OTcgODQ3Ny8xMTQ5NS82OTcgODQ3Ni8xMTQ5Mi82OTcKK2YgODQ3Ni8xMTQ5Mi82OTcgODQ3Ny8xMTQ5NS82OTcgODQ3NS8xMTQ5Ni82OTcKK2YgODQ3NS8xMTQ5Ni82OTcgODQ3OS8xMTQ5Ny82OTcgODQ3Ni8xMTQ5Mi82OTcKK2YgODQ4NS8xMTQ5OC82OTcgODQ4NC8xMTQ5OS82OTcgODQ4My8xMTUwMC82OTcKK2YgODQ4My8xMTUwMC82OTcgODQ4Mi8xMTUwMS82OTcgODQ4NS8xMTQ5OC82OTcKK2YgODQ4OS8xMTUwMi82OTcgODQ4OC8xMTUwMy82OTcgODQ4Ny8xMTUwNC82OTcKK2YgODQ4Ny8xMTUwNC82OTcgODQ4Ni8xMTUwNS82OTcgODQ4OS8xMTUwMi82OTcKK2YgODQ5MC8xMTUwNi82OTcgODQ4Mi8xMTUwMS82OTcgODQ4My8xMTUwMC82OTcKK2YgODQ4My8xMTUwMC82OTcgODQ4MS8xMTUwNy82OTcgODQ5MC8xMTUwNi82OTcKK2YgODQ4OS8xMTUwMi82OTcgODQ5MS8xMTUwOC82OTcgODQ4MC8xMTUwOS82OTcKK2YgODQ4MC8xMTUwOS82OTcgODQ4OC8xMTUwMy82OTcgODQ4OS8xMTUwMi82OTcKK2YgODQ4NC8xMTQ5OS82OTcgODQ5Mi8xMTUxMC82OTcgODQ3MS8xMTQ4OS82OTcKK2YgODQ3MS8xMTQ4OS82OTcgODQ2My8xMTQ3Ni82OTcgODQ4NC8xMTQ5OS82OTcKK2YgODQ4NC8xMTQ5OS82OTcgODQ4NS8xMTQ5OC82OTcgODQ5My8xMTUxMS82OTcKK2YgODQ5My8xMTUxMS82OTcgODQ5Mi8xMTUxMC82OTcgODQ4NC8xMTQ5OS82OTcKK2YgODQ2NC8xMTQ4My82OTcgODQ3My8xMTQ5MS82OTcgODQ5NC8xMTUxMi82OTcKK2YgODQ5NC8xMTUxMi82OTcgODQ4Ny8xMTUwNC82OTcgODQ2NC8xMTQ4My82OTcKK2YgODQ4Ni8xMTUwNS82OTcgODQ4Ny8xMTUwNC82OTcgODQ5NC8xMTUxMi82OTcKK2YgODQ5NC8xMTUxMi82OTcgODQ5NS8xMTUxMy82OTcgODQ4Ni8xMTUwNS82OTcKK2YgODQ5OC8xMTUxNC82OTcgODUwMC8xMTUxNS82OTcgODQ5Ni8xMTUxNi82OTcKK2YgODQ5Ni8xMTUxNi82OTcgODQ5OS8xMTUxNy82OTcgODQ5OC8xMTUxNC82OTcKK2YgODQ5OC8xMTUxNC82OTcgODQ5OS8xMTUxNy82OTcgODQ5Ny8xMTUxOC82OTcKK2YgODQ5Ny8xMTUxOC82OTcgODUwMS8xMTUxOS82OTcgODQ5OC8xMTUxNC82OTcKK2YgODUwOC8xMTUyMC82OTcgODUwNy8xMTUyMS82OTcgODUwNi8xMTUyMi82OTcKK2YgODUwNi8xMTUyMi82OTcgODUwMy8xMTUyMy82OTcgODUwOC8xMTUyMC82OTcKK2YgODUwOC8xMTUyMC82OTcgODUxMC8xMTUyNC82OTcgODUwOS8xMTUyNS82OTcKK2YgODUwOS8xMTUyNS82OTcgODUwNy8xMTUyMS82OTcgODUwOC8xMTUyMC82OTcKK2YgODUxNy8xMTUyNi82OTcgODUxNi8xMTUyNy82OTcgODUxNS8xMTUyOC82OTcKK2YgODUxNS8xMTUyOC82OTcgODUxNC8xMTUyOS82OTcgODUxNy8xMTUyNi82OTcKK2YgODUyMS8xMTUzMC82OTcgODUyMC8xMTUzMS82OTcgODUxOS8xMTUzMi82OTcKK2YgODUxOS8xMTUzMi82OTcgODUxOC8xMTUzMy82OTcgODUyMS8xMTUzMC82OTcKK2YgODUwNC8xMTUzNC82OTcgODUxNC8xMTUyOS82OTcgODUxNS8xMTUyOC82OTcKK2YgODUxNS8xMTUyOC82OTcgODUxMy8xMTUzNS82OTcgODUwNC8xMTUzNC82OTcKK2YgODUyMS8xMTUzMC82OTcgODUxMi8xMTUzNi82OTcgODUwMi8xMTUzNy82OTcKK2YgODUwMi8xMTUzNy82OTcgODUyMC8xMTUzMS82OTcgODUyMS8xMTUzMC82OTcKK2YgODUxNi8xMTUyNy82OTcgODUyMi8xMTUzOC82OTcgODQ5My8xMTUxMS82OTcKK2YgODQ5My8xMTUxMS82OTcgODQ4NS8xMTQ5OC82OTcgODUxNi8xMTUyNy82OTcKK2YgODUyNS8xMTUzOS82OTcgODUyNC8xMTU0MC82OTcgODUyMy8xMTU0MS82OTcKK2YgODUyMy8xMTU0MS82OTcgODUxNy8xMTUyNi82OTcgODUyNS8xMTUzOS82OTcKK2YgODUxNi8xMTUyNy82OTcgODUxNy8xMTUyNi82OTcgODUyMy8xMTU0MS82OTcKK2YgODUyMy8xMTU0MS82OTcgODUyMi8xMTUzOC82OTcgODUxNi8xMTUyNy82OTcKK2YgODUxOC8xMTUzMy82OTcgODUyOC8xMTU0Mi82OTcgODUyNy8xMTU0My82OTcKK2YgODUyNy8xMTU0My82OTcgODUyNi8xMTU0NC82OTcgODUxOC8xMTUzMy82OTcKK2YgODQ4Ni8xMTUwNS82OTcgODQ5NS8xMTUxMy82OTcgODUyOS8xMTU0NS82OTcKK2YgODUyOS8xMTU0NS82OTcgODUxOS8xMTUzMi82OTcgODQ4Ni8xMTUwNS82OTcKK2YgODUxOC8xMTUzMy82OTcgODUxOS8xMTUzMi82OTcgODUyOS8xMTU0NS82OTcKK2YgODUyOS8xMTU0NS82OTcgODUyOC8xMTU0Mi82OTcgODUxOC8xMTUzMy82OTcKK2YgODUzMi8xMTU0Ni82OTcgODUyNS8xMTUzOS82OTcgODUzMS8xMTU0Ny82OTcKK2YgODUzMS8xMTU0Ny82OTcgODUzMC8xMTU0OC82OTcgODUzMi8xMTU0Ni82OTcKK2YgODUzNS8xMTU0OS82OTcgODUzNC8xMTU1MC82OTcgODUyNi8xMTU0NC82OTcKK2YgODUyNi8xMTU0NC82OTcgODUzMy8xMTU1MS82OTcgODUzNS8xMTU0OS82OTcKK2YgODUzNi8xMTU1Mi82OTcgODUzMC8xMTU0OC82OTcgODUzMS8xMTU0Ny82OTcKK2YgODUzMS8xMTU0Ny82OTcgODUwNS8xMTU1My82OTcgODUzNi8xMTU1Mi82OTcKK2YgODUzNS8xMTU0OS82OTcgODUzNy8xMTU1NC82OTcgODUxMS8xMTU1NS82OTcKK2YgODUxMS8xMTU1NS82OTcgODUzNC8xMTU1MC82OTcgODUzNS8xMTU0OS82OTcKK2YgODUyNS8xMTUzOS82OTcgODUzMi8xMTU0Ni82OTcgODUzOC8xMTU1Ni82OTcKK2YgODUzOC8xMTU1Ni82OTcgODUyNC8xMTU0MC82OTcgODUyNS8xMTUzOS82OTcKK2YgODUzMy8xMTU1MS82OTcgODUyNi8xMTU0NC82OTcgODUyNy8xMTU0My82OTcKK2YgODUyNy8xMTU0My82OTcgODUzOS8xMTU1Ny82OTcgODUzMy8xMTU1MS82OTcKK2YgODU0Mi8xMTU1OC82OTcgODU0NC8xMTU1OS82OTcgODU0MC8xMTU2MC82OTcKK2YgODU0MC8xMTU2MC82OTcgODU0My8xMTU2MS82OTcgODU0Mi8xMTU1OC82OTcKK2YgODU0Mi8xMTU1OC82OTcgODU0My8xMTU2MS82OTcgODU0MS8xMTU2Mi82OTcKK2YgODU0MS8xMTU2Mi82OTcgODU0NS8xMTU2My82OTcgODU0Mi8xMTU1OC82OTcKK2YgODU1MS8xMTU2NC82OTcgODU1MC8xMTU2NS82OTcgODU0OS8xMTU2Ni82OTcKK2YgODU0OS8xMTU2Ni82OTcgODU0OC8xMTU2Ny82OTcgODU1MS8xMTU2NC82OTcKK2YgODU1NS8xMTU2OC82OTcgODU1NC8xMTU2OS82OTcgODU1My8xMTU3MC82OTcKK2YgODU1My8xMTU3MC82OTcgODU1Mi8xMTU3MS82OTcgODU1NS8xMTU2OC82OTcKK2YgODU1Ni8xMTU3Mi82OTcgODU0OC8xMTU2Ny82OTcgODU0OS8xMTU2Ni82OTcKK2YgODU0OS8xMTU2Ni82OTcgODU0Ny8xMTU3My82OTcgODU1Ni8xMTU3Mi82OTcKK2YgODU1NS8xMTU2OC82OTcgODU1Ny8xMTU3NC82OTcgODU0Ni8xMTU3NS82OTcKK2YgODU0Ni8xMTU3NS82OTcgODU1NC8xMTU2OS82OTcgODU1NS8xMTU2OC82OTcKK2YgODU1MC8xMTU2NS82OTcgODU1OC8xMTU3Ni82OTcgODUzOC8xMTU1Ni82OTcKK2YgODUzOC8xMTU1Ni82OTcgODUzMi8xMTU0Ni82OTcgODU1MC8xMTU2NS82OTcKK2YgODU1MC8xMTU2NS82OTcgODU1MS8xMTU2NC82OTcgODU1OS8xMTU3Ny82OTcKK2YgODU1OS8xMTU3Ny82OTcgODU1OC8xMTU3Ni82OTcgODU1MC8xMTU2NS82OTcKK2YgODUzMy8xMTU1MS82OTcgODUzOS8xMTU1Ny82OTcgODU2MC8xMTU3OC82OTcKK2YgODU2MC8xMTU3OC82OTcgODU1My8xMTU3MC82OTcgODUzMy8xMTU1MS82OTcKK2YgODU1Mi8xMTU3MS82OTcgODU1My8xMTU3MC82OTcgODU2MC8xMTU3OC82OTcKK2YgODU2MC8xMTU3OC82OTcgODU2MS8xMTU3OS82OTcgODU1Mi8xMTU3MS82OTcKK2YgODU2NC8xMTU4MC82OTcgODU2Ni8xMTU4MS82OTcgODU2Mi8xMTU4Mi82OTcKK2YgODU2Mi8xMTU4Mi82OTcgODU2NS8xMTU4My82OTcgODU2NC8xMTU4MC82OTcKK2YgODU2NC8xMTU4MC82OTcgODU2NS8xMTU4My82OTcgODU2My8xMTU4NC82OTcKK2YgODU2My8xMTU4NC82OTcgODU2Ny8xMTU4NS82OTcgODU2NC8xMTU4MC82OTcKK2YgODU3My8xMTU4Ni82OTcgODU3Mi8xMTU4Ny82OTcgODU3MS8xMTU4OC82OTcKK2YgODU3MS8xMTU4OC82OTcgODU3MC8xMTU4OS82OTcgODU3My8xMTU4Ni82OTcKK2YgODU3Ny8xMTU5MC82OTcgODU3Ni8xMTU5MS82OTcgODU3NS8xMTU5Mi82OTcKK2YgODU3NS8xMTU5Mi82OTcgODU3NC8xMTU5My82OTcgODU3Ny8xMTU5MC82OTcKK2YgODU3OC8xMTU5NC82OTcgODU3MC8xMTU4OS82OTcgODU3MS8xMTU4OC82OTcKK2YgODU3MS8xMTU4OC82OTcgODU2OS8xMTU5NS82OTcgODU3OC8xMTU5NC82OTcKK2YgODU3Ny8xMTU5MC82OTcgODU3OS8xMTU5Ni82OTcgODU2OC8xMTU5Ny82OTcKK2YgODU2OC8xMTU5Ny82OTcgODU3Ni8xMTU5MS82OTcgODU3Ny8xMTU5MC82OTcKK2YgODU3Mi8xMTU4Ny82OTcgODU4MC8xMTU5OC82OTcgODU1OS8xMTU3Ny82OTcKK2YgODU1OS8xMTU3Ny82OTcgODU1MS8xMTU2NC82OTcgODU3Mi8xMTU4Ny82OTcKK2YgODU3Mi8xMTU4Ny82OTcgODU3My8xMTU4Ni82OTcgODU4MS8xMTU5OS82OTcKK2YgODU4MS8xMTU5OS82OTcgODU4MC8xMTU5OC82OTcgODU3Mi8xMTU4Ny82OTcKK2YgODU1Mi8xMTU3MS82OTcgODU2MS8xMTU3OS82OTcgODU4Mi8xMTYwMC82OTcKK2YgODU4Mi8xMTYwMC82OTcgODU3NS8xMTU5Mi82OTcgODU1Mi8xMTU3MS82OTcKK2YgODU3NC8xMTU5My82OTcgODU3NS8xMTU5Mi82OTcgODU4Mi8xMTYwMC82OTcKK2YgODU4Mi8xMTYwMC82OTcgODU4My8xMTYwMS82OTcgODU3NC8xMTU5My82OTcKK2YgODU4Ni8xMTYwMi82OTcgODU4OC8xMTYwMy82OTcgODU4NC8xMTYwNC82OTcKK2YgODU4NC8xMTYwNC82OTcgODU4Ny8xMTYwNS82OTcgODU4Ni8xMTYwMi82OTcKK2YgODU4Ni8xMTYwMi82OTcgODU4Ny8xMTYwNS82OTcgODU4NS8xMTYwNi82OTcKK2YgODU4NS8xMTYwNi82OTcgODU4OS8xMTYwNy82OTcgODU4Ni8xMTYwMi82OTcKK2YgODU5NS8xMTYwOC82OTcgODU5NC8xMTYwOS82OTcgODU5My8xMTYxMC82OTcKK2YgODU5My8xMTYxMC82OTcgODU5Mi8xMTYxMS82OTcgODU5NS8xMTYwOC82OTcKK2YgODU5OS8xMTYxMi82OTcgODU5OC8xMTYxMy82OTcgODU5Ny8xMTYxNC82OTcKK2YgODU5Ny8xMTYxNC82OTcgODU5Ni8xMTYxNS82OTcgODU5OS8xMTYxMi82OTcKK2YgODYwMC8xMTYxNi82OTcgODU5Mi8xMTYxMS82OTcgODU5My8xMTYxMC82OTcKK2YgODU5My8xMTYxMC82OTcgODU5MS8xMTYxNy82OTcgODYwMC8xMTYxNi82OTcKK2YgODU5OS8xMTYxMi82OTcgODYwMS8xMTYxOC82OTcgODU5MC8xMTYxOS82OTcKK2YgODU5MC8xMTYxOS82OTcgODU5OC8xMTYxMy82OTcgODU5OS8xMTYxMi82OTcKK2YgODU5NC8xMTYwOS82OTcgODYwMi8xMTYyMC82OTcgODU4MS8xMTU5OS82OTcKK2YgODU4MS8xMTU5OS82OTcgODU3My8xMTU4Ni82OTcgODU5NC8xMTYwOS82OTcKK2YgODU5NC8xMTYwOS82OTcgODU5NS8xMTYwOC82OTcgODYwMy8xMTYyMS82OTcKK2YgODYwMy8xMTYyMS82OTcgODYwMi8xMTYyMC82OTcgODU5NC8xMTYwOS82OTcKK2YgODU3NC8xMTU5My82OTcgODU4My8xMTYwMS82OTcgODYwNC8xMTYyMi82OTcKK2YgODYwNC8xMTYyMi82OTcgODU5Ny8xMTYxNC82OTcgODU3NC8xMTU5My82OTcKK2YgODU5Ni8xMTYxNS82OTcgODU5Ny8xMTYxNC82OTcgODYwNC8xMTYyMi82OTcKK2YgODYwNC8xMTYyMi82OTcgODYwNS8xMTYyMy82OTcgODU5Ni8xMTYxNS82OTcKK2YgODYwOC8xMTYyNC82OTcgODYxMC8xMTYyNS82OTcgODYwNi8xMTYyNi82OTcKK2YgODYwNi8xMTYyNi82OTcgODYwOS8xMTYyNy82OTcgODYwOC8xMTYyNC82OTcKK2YgODYwOC8xMTYyNC82OTcgODYwOS8xMTYyNy82OTcgODYwNy8xMTYyOC82OTcKK2YgODYwNy8xMTYyOC82OTcgODYxMS8xMTYyOS82OTcgODYwOC8xMTYyNC82OTcKK2YgODYxNy8xMTYzMC82OTcgODYxNi8xMTYzMS82OTcgODYxNS8xMTYzMi82OTcKK2YgODYxNS8xMTYzMi82OTcgODYxNC8xMTYzMy82OTcgODYxNy8xMTYzMC82OTcKK2YgODYyMS8xMTYzNC82OTcgODYyMC8xMTYzNS82OTcgODYxOS8xMTYzNi82OTcKK2YgODYxOS8xMTYzNi82OTcgODYxOC8xMTYzNy82OTcgODYyMS8xMTYzNC82OTcKK2YgODYyMi8xMTYzOC82OTcgODYxNC8xMTYzMy82OTcgODYxNS8xMTYzMi82OTcKK2YgODYxNS8xMTYzMi82OTcgODYxMy8xMTYzOS82OTcgODYyMi8xMTYzOC82OTcKK2YgODYyMS8xMTYzNC82OTcgODYyMy8xMTY0MC82OTcgODYxMi8xMTY0MS82OTcKK2YgODYxMi8xMTY0MS82OTcgODYyMC8xMTYzNS82OTcgODYyMS8xMTYzNC82OTcKK2YgODYxNi8xMTYzMS82OTcgODYyNC8xMTY0Mi82OTcgODYwMy8xMTYyMS82OTcKK2YgODYwMy8xMTYyMS82OTcgODU5NS8xMTYwOC82OTcgODYxNi8xMTYzMS82OTcKK2YgODYxNi8xMTYzMS82OTcgODYxNy8xMTYzMC82OTcgODYyNS8xMTY0My82OTcKK2YgODYyNS8xMTY0My82OTcgODYyNC8xMTY0Mi82OTcgODYxNi8xMTYzMS82OTcKK2YgODU5Ni8xMTYxNS82OTcgODYwNS8xMTYyMy82OTcgODYyNi8xMTY0NC82OTcKK2YgODYyNi8xMTY0NC82OTcgODYxOS8xMTYzNi82OTcgODU5Ni8xMTYxNS82OTcKK2YgODYxOC8xMTYzNy82OTcgODYxOS8xMTYzNi82OTcgODYyNi8xMTY0NC82OTcKK2YgODYyNi8xMTY0NC82OTcgODYyNy8xMTY0NS82OTcgODYxOC8xMTYzNy82OTcKK2YgODYzMC8xMTY0Ni82OTcgODYzMi8xMTY0Ny82OTcgODYyOC8xMTY0OC82OTcKK2YgODYyOC8xMTY0OC82OTcgODYzMS8xMTY0OS82OTcgODYzMC8xMTY0Ni82OTcKK2YgODYzMC8xMTY0Ni82OTcgODYzMS8xMTY0OS82OTcgODYyOS8xMTY1MC82OTcKK2YgODYyOS8xMTY1MC82OTcgODYzMy8xMTY1MS82OTcgODYzMC8xMTY0Ni82OTcKK2YgODYzOS8xMTY1Mi82OTcgODYzOC8xMTY1My82OTcgODYzNy8xMTY1NC82OTcKK2YgODYzNy8xMTY1NC82OTcgODYzNi8xMTY1NS82OTcgODYzOS8xMTY1Mi82OTcKK2YgODY0My8xMTY1Ni82OTcgODY0Mi8xMTY1Ny82OTcgODY0MS8xMTY1OC82OTcKK2YgODY0MS8xMTY1OC82OTcgODY0MC8xMTY1OS82OTcgODY0My8xMTY1Ni82OTcKK2YgODY0NC8xMTY2MC82OTcgODYzNi8xMTY1NS82OTcgODYzNy8xMTY1NC82OTcKK2YgODYzNy8xMTY1NC82OTcgODYzNS8xMTY2MS82OTcgODY0NC8xMTY2MC82OTcKK2YgODY0My8xMTY1Ni82OTcgODY0NS8xMTY2Mi82OTcgODYzNC8xMTY2My82OTcKK2YgODYzNC8xMTY2My82OTcgODY0Mi8xMTY1Ny82OTcgODY0My8xMTY1Ni82OTcKK2YgODYzOC8xMTY1My82OTcgODY0Ni8xMTY2NC82OTcgODYyNS8xMTY0My82OTcKK2YgODYyNS8xMTY0My82OTcgODYxNy8xMTYzMC82OTcgODYzOC8xMTY1My82OTcKK2YgODYzOC8xMTY1My82OTcgODYzOS8xMTY1Mi82OTcgODY0Ny8xMTY2NS82OTcKK2YgODY0Ny8xMTY2NS82OTcgODY0Ni8xMTY2NC82OTcgODYzOC8xMTY1My82OTcKK2YgODYxOC8xMTYzNy82OTcgODYyNy8xMTY0NS82OTcgODY0OC8xMTY2Ni82OTcKK2YgODY0OC8xMTY2Ni82OTcgODY0MS8xMTY1OC82OTcgODYxOC8xMTYzNy82OTcKK2YgODY0MC8xMTY1OS82OTcgODY0MS8xMTY1OC82OTcgODY0OC8xMTY2Ni82OTcKK2YgODY0OC8xMTY2Ni82OTcgODY0OS8xMTY2Ny82OTcgODY0MC8xMTY1OS82OTcKK2YgODY1Mi8xMTY2OC82OTcgODY1NC8xMTY2OS82OTcgODY1MC8xMTY3MC82OTcKK2YgODY1MC8xMTY3MC82OTcgODY1My8xMTY3MS82OTcgODY1Mi8xMTY2OC82OTcKK2YgODY1Mi8xMTY2OC82OTcgODY1My8xMTY3MS82OTcgODY1MS8xMTY3Mi82OTcKK2YgODY1MS8xMTY3Mi82OTcgODY1NS8xMTY3My82OTcgODY1Mi8xMTY2OC82OTcKK2YgODY2MS8xMTY3NC82OTcgODY2MC8xMTY3NS82OTcgODY1OS8xMTY3Ni82OTcKK2YgODY1OS8xMTY3Ni82OTcgODY1OC8xMTY3Ny82OTcgODY2MS8xMTY3NC82OTcKK2YgODY2NS8xMTY3OC82OTcgODY2NC8xMTY3OS82OTcgODY2My8xMTY4MC82OTcKK2YgODY2My8xMTY4MC82OTcgODY2Mi8xMTY4MS82OTcgODY2NS8xMTY3OC82OTcKK2YgODY2Ni8xMTY4Mi82OTcgODY1OC8xMTY3Ny82OTcgODY1OS8xMTY3Ni82OTcKK2YgODY1OS8xMTY3Ni82OTcgODY1Ny8xMTY4My82OTcgODY2Ni8xMTY4Mi82OTcKK2YgODY2NS8xMTY3OC82OTcgODY2Ny8xMTY4NC82OTcgODY1Ni8xMTY4NS82OTcKK2YgODY1Ni8xMTY4NS82OTcgODY2NC8xMTY3OS82OTcgODY2NS8xMTY3OC82OTcKK2YgODY2MC8xMTY3NS82OTcgODY2OC8xMTY4Ni82OTcgODY0Ny8xMTY2NS82OTcKK2YgODY0Ny8xMTY2NS82OTcgODYzOS8xMTY1Mi82OTcgODY2MC8xMTY3NS82OTcKK2YgODY2MC8xMTY3NS82OTcgODY2MS8xMTY3NC82OTcgODY2OS8xMTY4Ny82OTcKK2YgODY2OS8xMTY4Ny82OTcgODY2OC8xMTY4Ni82OTcgODY2MC8xMTY3NS82OTcKK2YgODY0MC8xMTY1OS82OTcgODY0OS8xMTY2Ny82OTcgODY3MC8xMTY4OC82OTcKK2YgODY3MC8xMTY4OC82OTcgODY2My8xMTY4MC82OTcgODY0MC8xMTY1OS82OTcKK2YgODY2Mi8xMTY4MS82OTcgODY2My8xMTY4MC82OTcgODY3MC8xMTY4OC82OTcKK2YgODY3MC8xMTY4OC82OTcgODY3MS8xMTY4OS82OTcgODY2Mi8xMTY4MS82OTcKK2YgODY3NC8xMTY5MC82OTcgODY3Ni8xMTY5MS82OTcgODY3Mi8xMTY5Mi82OTcKK2YgODY3Mi8xMTY5Mi82OTcgODY3NS8xMTY5My82OTcgODY3NC8xMTY5MC82OTcKK2YgODY3NC8xMTY5MC82OTcgODY3NS8xMTY5My82OTcgODY3My8xMTY5NC82OTcKK2YgODY3My8xMTY5NC82OTcgODY3Ny8xMTY5NS82OTcgODY3NC8xMTY5MC82OTcKK2YgODY4NC8xMTY5Ni82OTcgODY4My8xMTY5Ny82OTcgODY4Mi8xMTY5OC82OTcKK2YgODY4Mi8xMTY5OC82OTcgODY3OS8xMTY5OS82OTcgODY4NC8xMTY5Ni82OTcKK2YgODY4NC8xMTY5Ni82OTcgODY4Ni8xMTcwMC82OTcgODY4NS8xMTcwMS82OTcKK2YgODY4NS8xMTcwMS82OTcgODY4My8xMTY5Ny82OTcgODY4NC8xMTY5Ni82OTcKK2YgODY5My8xMTcwMi82OTcgODY5Mi8xMTcwMy82OTcgODY5MS8xMTcwNC82OTcKK2YgODY5MS8xMTcwNC82OTcgODY5MC8xMTcwNS82OTcgODY5My8xMTcwMi82OTcKK2YgODY5Ny8xMTcwNi82OTcgODY5Ni8xMTcwNy82OTcgODY5NS8xMTcwOC82OTcKK2YgODY5NS8xMTcwOC82OTcgODY5NC8xMTcwOS82OTcgODY5Ny8xMTcwNi82OTcKK2YgODY4MC8xMTcxMC82OTcgODY5MC8xMTcwNS82OTcgODY5MS8xMTcwNC82OTcKK2YgODY5MS8xMTcwNC82OTcgODY4OS8xMTcxMS82OTcgODY4MC8xMTcxMC82OTcKK2YgODY5Ny8xMTcwNi82OTcgODY4OC8xMTcxMi82OTcgODY3OC8xMTcxMy82OTcKK2YgODY3OC8xMTcxMy82OTcgODY5Ni8xMTcwNy82OTcgODY5Ny8xMTcwNi82OTcKK2YgODY5Mi8xMTcwMy82OTcgODY5OC8xMTcxNC82OTcgODY2OS8xMTY4Ny82OTcKK2YgODY2OS8xMTY4Ny82OTcgODY2MS8xMTY3NC82OTcgODY5Mi8xMTcwMy82OTcKK2YgODcwMS8xMTcxNS82OTcgODcwMC8xMTcxNi82OTcgODY5OS8xMTcxNy82OTcKK2YgODY5OS8xMTcxNy82OTcgODY5My8xMTcwMi82OTcgODcwMS8xMTcxNS82OTcKK2YgODY5Mi8xMTcwMy82OTcgODY5My8xMTcwMi82OTcgODY5OS8xMTcxNy82OTcKK2YgODY5OS8xMTcxNy82OTcgODY5OC8xMTcxNC82OTcgODY5Mi8xMTcwMy82OTcKK2YgODY5NC8xMTcwOS82OTcgODcwNC8xMTcxOC82OTcgODcwMy8xMTcxOS82OTcKK2YgODcwMy8xMTcxOS82OTcgODcwMi8xMTcyMC82OTcgODY5NC8xMTcwOS82OTcKK2YgODY2Mi8xMTY4MS82OTcgODY3MS8xMTY4OS82OTcgODcwNS8xMTcyMS82OTcKK2YgODcwNS8xMTcyMS82OTcgODY5NS8xMTcwOC82OTcgODY2Mi8xMTY4MS82OTcKK2YgODY5NC8xMTcwOS82OTcgODY5NS8xMTcwOC82OTcgODcwNS8xMTcyMS82OTcKK2YgODcwNS8xMTcyMS82OTcgODcwNC8xMTcxOC82OTcgODY5NC8xMTcwOS82OTcKK2YgODczNi8xMTcyMi82OTcgODc0MC8xMTcyMy82OTcgODcwOC8xMTcyNC82OTcKK2YgODcwOC8xMTcyNC82OTcgODczNS8xMTcyNS82OTcgODczNi8xMTcyMi82OTcKK2YgODczOS8xMTcyNi82OTcgODczOC8xMTcyNy82OTcgODcwMC8xMTcxNi82OTcKK2YgODcwMC8xMTcxNi82OTcgODcwMS8xMTcxNS82OTcgODczOS8xMTcyNi82OTcKK2YgODc0MS8xMTcyOC82OTcgODc0MC8xMTcyMy82OTcgODcwMi8xMTcyMC82OTcKK2YgODcwMi8xMTcyMC82OTcgODcwMy8xMTcxOS82OTcgODc0MS8xMTcyOC82OTcKK2YgODc0My8xMTcyOS82OTcgODc0Mi8xMTczMC82OTcgODcwOC8xMTcyNC82OTcKK2YgODcwOC8xMTcyNC82OTcgODcxMS8xMTczMS82OTcgODc0My8xMTcyOS82OTcKK2YgODc0NS8xMTczMi82OTcgODc0NC8xMTczMy82OTcgODcwNy8xMTczNC82OTcKK2YgODcwNy8xMTczNC82OTcgODcxMi8xMTczNS82OTcgODc0NS8xMTczMi82OTcKK2YgODcyNi8xMTczNi82OTcgODczOS8xMTcyNi82OTcgODcwMS8xMTcxNS82OTcKK2YgODcwMS8xMTcxNS82OTcgODcxMy8xMTczNy82OTcgODcyNi8xMTczNi82OTcKK2YgODcyMy8xMTczOC82OTcgODcyMC8xMTczOS82OTcgOTI3Ny8xMTc0MC82OTcKK2YgOTI3Ny8xMTc0MC82OTcgOTI3Ni8xMTc0MS82OTcgODcyMy8xMTczOC82OTcKK2YgODcyMS8xMTc0Mi82OTcgODcxOC8xMTc0My82OTcgOTI3OS8xMTc0NC82OTcKK2YgOTI3OS8xMTc0NC82OTcgOTI3OC8xMTc0NS82OTcgODcyMS8xMTc0Mi82OTcKK2YgODcxOS8xMTc0Ni82OTcgODcyNC8xMTc0Ny82OTcgOTI4MS8xMTc0OC82OTcKK2YgOTI4MS8xMTc0OC82OTcgOTI4MC8xMTc0OS82OTcgODcxOS8xMTc0Ni82OTcKK2YgODcxOS8xMTc0Ni82OTcgODQzNi8xMTQ1NS82OTcgODQ0Ni8xMTQ2Ny82OTcKK2YgODQ0Ni8xMTQ2Ny82OTcgODcyNC8xMTc0Ny82OTcgODcxOS8xMTc0Ni82OTcKK2YgODcyNS8xMTc1MC82OTcgODQ0OS8xMTQ2OC82OTcgODQzOS8xMTQ2MC82OTcKK2YgODQzOS8xMTQ2MC82OTcgODcyMi8xMTc1MS82OTcgODcyNS8xMTc1MC82OTcKK2YgODczMS8xMTc1Mi82OTcgODcxNC8xMTc1My82OTcgODcxNS8xMTc1NC82OTcKK2YgODcxNS8xMTc1NC82OTcgODczMC8xMTc1NS82OTcgODczMS8xMTc1Mi82OTcKK2YgODczNy8xMTc1Ni82OTcgODY4Ny8xMTc1Ny82OTcgODcwOS8xMTc1OC82OTcKK2YgODcwOS8xMTc1OC82OTcgODczNi8xMTcyMi82OTcgODczNy8xMTc1Ni82OTcKK2YgODcxNS8xMTc1NC82OTcgODczMi8xMTc1OS82OTcgODczMC8xMTc1NS82OTcKK2YgODczNy8xMTc1Ni82OTcgODcxNi8xMTc2MC82OTcgODY4Ny8xMTc1Ny82OTcKK2YgODczMi8xMTc1OS82OTcgODczMy8xMTc2MS82OTcgODcyOS8xMTc2Mi82OTcKK2YgODcyOS8xMTc2Mi82OTcgODczMC8xMTc1NS82OTcgODczMi8xMTc1OS82OTcKK2YgODczMy8xMTc2MS82OTcgODcwNy8xMTczNC82OTcgODcyOS8xMTc2Mi82OTcKK2YgODcxMC8xMTc2My82OTcgODczOC8xMTcyNy82OTcgODczOS8xMTcyNi82OTcKK2YgODczOS8xMTcyNi82OTcgODcwNi8xMTc2NC82OTcgODcxMC8xMTc2My82OTcKK2YgODcxMy8xMTczNy82OTcgODY4MS8xMTc2NS82OTcgODczMS8xMTc1Mi82OTcKK2YgODczMS8xMTc1Mi82OTcgODcyNi8xMTczNi82OTcgODcxMy8xMTczNy82OTcKK2YgODcwNi8xMTc2NC82OTcgODczOS8xMTcyNi82OTcgODcyNi8xMTczNi82OTcKK2YgODcyNi8xMTczNi82OTcgODcyNy8xMTc2Ni82OTcgODcwNi8xMTc2NC82OTcKK2YgODcwOC8xMTcyNC82OTcgODc0MC8xMTcyMy82OTcgODc0MS8xMTcyOC82OTcKK2YgODc0MS8xMTcyOC82OTcgODcxMS8xMTczMS82OTcgODcwOC8xMTcyNC82OTcKK2YgODcwMi8xMTcyMC82OTcgODc0MC8xMTcyMy82OTcgODczNi8xMTcyMi82OTcKK2YgODczNi8xMTcyMi82OTcgODcwOS8xMTc1OC82OTcgODcwMi8xMTcyMC82OTcKK2YgODczMS8xMTc1Mi82OTcgODY4MS8xMTc2NS82OTcgODcxNC8xMTc1My82OTcKK2YgODcwNy8xMTczNC82OTcgODc0Mi8xMTczMC82OTcgODc0My8xMTcyOS82OTcKK2YgODc0My8xMTcyOS82OTcgODcxMi8xMTczNS82OTcgODcwNy8xMTczNC82OTcKK2YgODcwNi8xMTc2NC82OTcgODc0NC8xMTczMy82OTcgODc0NS8xMTczMi82OTcKK2YgODc0NS8xMTczMi82OTcgODcxMC8xMTc2My82OTcgODcwNi8xMTc2NC82OTcKK2YgODcwNi8xMTc2NC82OTcgODcyNy8xMTc2Ni82OTcgODcyOC8xMTc2Ny82OTcKK2YgODcyOC8xMTc2Ny82OTcgODc0NC8xMTczMy82OTcgODcwNi8xMTc2NC82OTcKK2YgODczNC8xMTc2OC82OTcgODczNS8xMTcyNS82OTcgODcwOC8xMTcyNC82OTcKK2YgODcwOC8xMTcyNC82OTcgODc0Mi8xMTczMC82OTcgODczNC8xMTc2OC82OTcKK2YgODczNC8xMTc2OC82OTcgODc0Mi8xMTczMC82OTcgODcwNy8xMTczNC82OTcKK2YgODcwNy8xMTczNC82OTcgODczMy8xMTc2MS82OTcgODczNC8xMTc2OC82OTcKK2YgODcwNy8xMTczNC82OTcgODc0NC8xMTczMy82OTcgODcyOC8xMTc2Ny82OTcKK2YgODcyOC8xMTc2Ny82OTcgODcyOS8xMTc2Mi82OTcgODcwNy8xMTczNC82OTcKK2YgODY4OC8xMTcxMi82OTcgODY4Ny8xMTc1Ny82OTcgODcxNi8xMTc2MC82OTcKK2YgODcxNi8xMTc2MC82OTcgODY4NS8xMTcwMS82OTcgODY4OC8xMTcxMi82OTcKK2YgODY4MS8xMTc2NS82OTcgODY4MC8xMTcxMC82OTcgODY4Mi8xMTY5OC82OTcKK2YgODY4Mi8xMTY5OC82OTcgODcxNC8xMTc1My82OTcgODY4MS8xMTc2NS82OTcKK2YgODY4OC8xMTcxMi82OTcgODY4NS8xMTcwMS82OTcgODY4Ni8xMTcwMC82OTcKK2YgODY4Ni8xMTcwMC82OTcgODY3OC8xMTcxMy82OTcgODY4OC8xMTcxMi82OTcKK2YgODY3OS8xMTY5OS82OTcgODY4Mi8xMTY5OC82OTcgODY4MC8xMTcxMC82OTcKK2YgODY4MC8xMTcxMC82OTcgODY4OS8xMTcxMS82OTcgODY3OS8xMTY5OS82OTcKK2YgODY2Ny8xMTY4NC82OTcgODY3OC8xMTcxMy82OTcgODY4Ni8xMTcwMC82OTcKK2YgODY4Ni8xMTcwMC82OTcgODY3Ny8xMTY5NS82OTcgODY2Ny8xMTY4NC82OTcKK2YgODY4OS8xMTcxMS82OTcgODY2Ni8xMTY4Mi82OTcgODY3Ni8xMTY5MS82OTcKK2YgODY3Ni8xMTY5MS82OTcgODY3OS8xMTY5OS82OTcgODY4OS8xMTcxMS82OTcKK2YgODY1Ni8xMTY4NS82OTcgODY2Ny8xMTY4NC82OTcgODY3Ny8xMTY5NS82OTcKK2YgODY3Ny8xMTY5NS82OTcgODY3My8xMTY5NC82OTcgODY1Ni8xMTY4NS82OTcKK2YgODY3Mi8xMTY5Mi82OTcgODY3Ni8xMTY5MS82OTcgODY2Ni8xMTY4Mi82OTcKK2YgODY2Ni8xMTY4Mi82OTcgODY1Ny8xMTY4My82OTcgODY3Mi8xMTY5Mi82OTcKK2YgODY0NS8xMTY2Mi82OTcgODY1Ni8xMTY4NS82OTcgODY3My8xMTY5NC82OTcKK2YgODY3My8xMTY5NC82OTcgODY1NS8xMTY3My82OTcgODY0NS8xMTY2Mi82OTcKK2YgODY1Ny8xMTY4My82OTcgODY0NC8xMTY2MC82OTcgODY1NC8xMTY2OS82OTcKK2YgODY1NC8xMTY2OS82OTcgODY3Mi8xMTY5Mi82OTcgODY1Ny8xMTY4My82OTcKK2YgODYzNC8xMTY2My82OTcgODY0NS8xMTY2Mi82OTcgODY1NS8xMTY3My82OTcKK2YgODY1NS8xMTY3My82OTcgODY1MS8xMTY3Mi82OTcgODYzNC8xMTY2My82OTcKK2YgODY1MC8xMTY3MC82OTcgODY1NC8xMTY2OS82OTcgODY0NC8xMTY2MC82OTcKK2YgODY0NC8xMTY2MC82OTcgODYzNS8xMTY2MS82OTcgODY1MC8xMTY3MC82OTcKK2YgODYyMy8xMTY0MC82OTcgODYzNC8xMTY2My82OTcgODY1MS8xMTY3Mi82OTcKK2YgODY1MS8xMTY3Mi82OTcgODYzMy8xMTY1MS82OTcgODYyMy8xMTY0MC82OTcKK2YgODYzNS8xMTY2MS82OTcgODYyMi8xMTYzOC82OTcgODYzMi8xMTY0Ny82OTcKK2YgODYzMi8xMTY0Ny82OTcgODY1MC8xMTY3MC82OTcgODYzNS8xMTY2MS82OTcKK2YgODYxMi8xMTY0MS82OTcgODYyMy8xMTY0MC82OTcgODYzMy8xMTY1MS82OTcKK2YgODYzMy8xMTY1MS82OTcgODYyOS8xMTY1MC82OTcgODYxMi8xMTY0MS82OTcKK2YgODYyOC8xMTY0OC82OTcgODYzMi8xMTY0Ny82OTcgODYyMi8xMTYzOC82OTcKK2YgODYyMi8xMTYzOC82OTcgODYxMy8xMTYzOS82OTcgODYyOC8xMTY0OC82OTcKK2YgODYwMS8xMTYxOC82OTcgODYxMi8xMTY0MS82OTcgODYyOS8xMTY1MC82OTcKK2YgODYyOS8xMTY1MC82OTcgODYxMS8xMTYyOS82OTcgODYwMS8xMTYxOC82OTcKK2YgODYxMy8xMTYzOS82OTcgODYwMC8xMTYxNi82OTcgODYxMC8xMTYyNS82OTcKK2YgODYxMC8xMTYyNS82OTcgODYyOC8xMTY0OC82OTcgODYxMy8xMTYzOS82OTcKK2YgODYwMS8xMTYxOC82OTcgODYxMS8xMTYyOS82OTcgODYwNy8xMTYyOC82OTcKK2YgODYwNy8xMTYyOC82OTcgODU5MC8xMTYxOS82OTcgODYwMS8xMTYxOC82OTcKK2YgODYwNi8xMTYyNi82OTcgODYxMC8xMTYyNS82OTcgODYwMC8xMTYxNi82OTcKK2YgODYwMC8xMTYxNi82OTcgODU5MS8xMTYxNy82OTcgODYwNi8xMTYyNi82OTcKK2YgODU5MC8xMTYxOS82OTcgODYwNy8xMTYyOC82OTcgODU4OS8xMTYwNy82OTcKK2YgODU4OS8xMTYwNy82OTcgODU3OS8xMTU5Ni82OTcgODU5MC8xMTYxOS82OTcKK2YgODU5MS8xMTYxNy82OTcgODU3OC8xMTU5NC82OTcgODU4OC8xMTYwMy82OTcKK2YgODU4OC8xMTYwMy82OTcgODYwNi8xMTYyNi82OTcgODU5MS8xMTYxNy82OTcKK2YgODU3OS8xMTU5Ni82OTcgODU4OS8xMTYwNy82OTcgODU4NS8xMTYwNi82OTcKK2YgODU4NS8xMTYwNi82OTcgODU2OC8xMTU5Ny82OTcgODU3OS8xMTU5Ni82OTcKK2YgODU4NC8xMTYwNC82OTcgODU4OC8xMTYwMy82OTcgODU3OC8xMTU5NC82OTcKK2YgODU3OC8xMTU5NC82OTcgODU2OS8xMTU5NS82OTcgODU4NC8xMTYwNC82OTcKK2YgODU2OC8xMTU5Ny82OTcgODU4NS8xMTYwNi82OTcgODU2Ny8xMTU4NS82OTcKK2YgODU2Ny8xMTU4NS82OTcgODU1Ny8xMTU3NC82OTcgODU2OC8xMTU5Ny82OTcKK2YgODU2OS8xMTU5NS82OTcgODU1Ni8xMTU3Mi82OTcgODU2Ni8xMTU4MS82OTcKK2YgODU2Ni8xMTU4MS82OTcgODU4NC8xMTYwNC82OTcgODU2OS8xMTU5NS82OTcKK2YgODU1Ny8xMTU3NC82OTcgODU2Ny8xMTU4NS82OTcgODU2My8xMTU4NC82OTcKK2YgODU2My8xMTU4NC82OTcgODU0Ni8xMTU3NS82OTcgODU1Ny8xMTU3NC82OTcKK2YgODU2Mi8xMTU4Mi82OTcgODU2Ni8xMTU4MS82OTcgODU1Ni8xMTU3Mi82OTcKK2YgODU1Ni8xMTU3Mi82OTcgODU0Ny8xMTU3My82OTcgODU2Mi8xMTU4Mi82OTcKK2YgODU0Ni8xMTU3NS82OTcgODU2My8xMTU4NC82OTcgODU0NS8xMTU2My82OTcKK2YgODU0NS8xMTU2My82OTcgODUzNy8xMTU1NC82OTcgODU0Ni8xMTU3NS82OTcKK2YgODU0Ny8xMTU3My82OTcgODUzNi8xMTU1Mi82OTcgODU0NC8xMTU1OS82OTcKK2YgODU0NC8xMTU1OS82OTcgODU2Mi8xMTU4Mi82OTcgODU0Ny8xMTU3My82OTcKK2YgODUzNy8xMTU1NC82OTcgODU0NS8xMTU2My82OTcgODU0MS8xMTU2Mi82OTcKK2YgODU0MS8xMTU2Mi82OTcgODUxMS8xMTU1NS82OTcgODUzNy8xMTU1NC82OTcKK2YgODU0MC8xMTU2MC82OTcgODU0NC8xMTU1OS82OTcgODUzNi8xMTU1Mi82OTcKK2YgODUzNi8xMTU1Mi82OTcgODUwNS8xMTU1My82OTcgODU0MC8xMTU2MC82OTcKK2YgODUxMS8xMTU1NS82OTcgODU0MS8xMTU2Mi82OTcgODUwOS8xMTUyNS82OTcKK2YgODUwOS8xMTUyNS82OTcgODUxMi8xMTUzNi82OTcgODUxMS8xMTU1NS82OTcKK2YgODUwNS8xMTU1My82OTcgODUwNC8xMTUzNC82OTcgODUwNi8xMTUyMi82OTcKK2YgODUwNi8xMTUyMi82OTcgODU0MC8xMTU2MC82OTcgODUwNS8xMTU1My82OTcKK2YgODUxMi8xMTUzNi82OTcgODUwOS8xMTUyNS82OTcgODUxMC8xMTUyNC82OTcKK2YgODUxMC8xMTUyNC82OTcgODUwMi8xMTUzNy82OTcgODUxMi8xMTUzNi82OTcKK2YgODUwMy8xMTUyMy82OTcgODUwNi8xMTUyMi82OTcgODUwNC8xMTUzNC82OTcKK2YgODUwNC8xMTUzNC82OTcgODUxMy8xMTUzNS82OTcgODUwMy8xMTUyMy82OTcKK2YgODUwMi8xMTUzNy82OTcgODUxMC8xMTUyNC82OTcgODUwMS8xMTUxOS82OTcKK2YgODUwMS8xMTUxOS82OTcgODQ5MS8xMTUwOC82OTcgODUwMi8xMTUzNy82OTcKK2YgODUxMy8xMTUzNS82OTcgODQ5MC8xMTUwNi82OTcgODUwMC8xMTUxNS82OTcKK2YgODUwMC8xMTUxNS82OTcgODUwMy8xMTUyMy82OTcgODUxMy8xMTUzNS82OTcKK2YgODQ4MC8xMTUwOS82OTcgODQ5Ny8xMTUxOC82OTcgODQ3OS8xMTQ5Ny82OTcKK2YgODQ3OS8xMTQ5Ny82OTcgODQ2OS8xMTQ4Ni82OTcgODQ4MC8xMTUwOS82OTcKK2YgODQ3OC8xMTQ5My82OTcgODQ5Ni8xMTUxNi82OTcgODQ4MS8xMTUwNy82OTcKK2YgODQ4MS8xMTUwNy82OTcgODQ2OC8xMTQ4NC82OTcgODQ3OC8xMTQ5My82OTcKK2YgODQ2OS8xMTQ4Ni82OTcgODQ3OS8xMTQ5Ny82OTcgODQ3NS8xMTQ5Ni82OTcKK2YgODQ3NS8xMTQ5Ni82OTcgODQ1OC8xMTQ4Ny82OTcgODQ2OS8xMTQ4Ni82OTcKK2YgODQ3NC8xMTQ5NC82OTcgODQ3OC8xMTQ5My82OTcgODQ2OC8xMTQ4NC82OTcKK2YgODQ2OC8xMTQ4NC82OTcgODQ1OS8xMTQ4NS82OTcgODQ3NC8xMTQ5NC82OTcKK2YgODQ1OC8xMTQ4Ny82OTcgODQ3NS8xMTQ5Ni82OTcgODQ1Ny8xMTQ3NS82OTcKK2YgODQ1Ny8xMTQ3NS82OTcgODQ0NS8xMTQ2NC82OTcgODQ1OC8xMTQ4Ny82OTcKK2YgODQ1OS8xMTQ4NS82OTcgODQ0My8xMTQ2Mi82OTcgODQ1Ni8xMTQ3MS82OTcKK2YgODQ1Ni8xMTQ3MS82OTcgODQ3NC8xMTQ5NC82OTcgODQ1OS8xMTQ4NS82OTcKK2YgODQ0NC8xMTQ2NS82OTcgODQ0NS8xMTQ2NC82OTcgODQ1Ny8xMTQ3NS82OTcKK2YgODQ1Ny8xMTQ3NS82OTcgODQ1My8xMTQ3NC82OTcgODQ0NC8xMTQ2NS82OTcKK2YgODQ1MC8xMTQ3Mi82OTcgODQ1Ni8xMTQ3MS82OTcgODQ0My8xMTQ2Mi82OTcKK2YgODQ0My8xMTQ2Mi82OTcgODQ0Mi8xMTQ2My82OTcgODQ1MC8xMTQ3Mi82OTcKK2YgODQ0NC8xMTQ2NS82OTcgODQ1My8xMTQ3NC82OTcgODQ1Mi8xMTc2OS82OTcKK2YgODQ1Mi8xMTc2OS82OTcgODcxOC8xMTc0My82OTcgODQ0NC8xMTQ2NS82OTcKK2YgODQ0Mi8xMTQ2My82OTcgODcyMy8xMTczOC82OTcgODQ1MS8xMTc3MC82OTcKK2YgODQ1MS8xMTc3MC82OTcgODQ1MC8xMTQ3Mi82OTcgODQ0Mi8xMTQ2My82OTcKK2YgODQzNS8xMTQ1Ni8zMzE5IDg0MzYvMTE0NTUvMzMxOSA4NzQ4LzExNzcxLzMzMTkKK2YgODc0OC8xMTc3MS8zMzIwIDg3NDcvMTE3NzIvMzMyMCA4NDM1LzExNDU2LzMzMjAKK2YgODQzNy8xMTQ1NC8zMzIxIDg0MzQvMTE0NTcvMzMyMSA4NzQ2LzExNzczLzMzMjEKK2YgODc0Ni8xMTc3My8zMzIxIDg3NDkvMTE3NzQvMzMyMSA4NDM3LzExNDU0LzMzMjEKK2YgODQzOS8xMTQ2MC8zMzIyIDg0NDAvMTE0NTkvMzMyMiA4NzUyLzExNzc1LzMzMjIKK2YgODc1Mi8xMTc3NS8zMzIzIDg3NTEvMTE3NzYvMzMyMyA4NDM5LzExNDYwLzMzMjMKK2YgODQ0MS8xMTQ1OC8zMzI0IDg0MzgvMTE0NjEvMzMyNCA4NzUwLzExNzc3LzMzMjQKK2YgODc1MC8xMTc3Ny8zMzI1IDg3NTMvMTE3NzgvMzMyNSA4NDQxLzExNDU4LzMzMjUKK2YgODQ0Mi8xMTQ2My8zMzI2IDg0MzUvMTE0NTYvMzMyNiA4NzQ3LzExNzcyLzMzMjYKK2YgODc0Ny8xMTc3Mi8zMzI2IDg3NTQvMTE0NjMvMzMyNiA4NDQyLzExNDYzLzMzMjYKK2YgODQzNC8xMTQ1Ny8zMzI3IDg0NDMvMTE0NjIvMzMyNyA4NzU1LzExNzc5LzMzMjcKK2YgODc1NS8xMTc3OS8zMzI4IDg3NDYvMTE3NzMvMzMyOCA4NDM0LzExNDU3LzMzMjgKK2YgODQ0MC8xMTQ1OS8zMzI5IDg0NDQvMTE0NjUvMzMyOSA4NzU2LzExNDY1LzMzMjkKK2YgODc1Ni8xMTQ2NS8zMzMwIDg3NTIvMTE3NzUvMzMzMCA4NDQwLzExNDU5LzMzMzAKK2YgODQ0NS8xMTQ2NC8zMzMxIDg0NDEvMTE0NTgvMzMzMSA4NzUzLzExNzc4LzMzMzEKK2YgODc1My8xMTc3OC8zMzMyIDg3NTcvMTE3ODAvMzMzMiA4NDQ1LzExNDY0LzMzMzIKK2YgODQ1MC8xMTQ3Mi8zMjM4IDg0NTEvMTE3NzAvMzIzOCA4NzU5LzExNzgxLzMyMzgKK2YgODc1OS8xMTc4MS8zMzMzIDg3NTgvMTE3ODIvMzMzMyA4NDUwLzExNDcyLzMzMzMKK2YgODQ1Mi8xMTc2OS8zMzM0IDg0NTMvMTE0NzQvMzMzNCA4NzYxLzExNDc0LzMzMzQKK2YgODc2MS8xMTQ3NC8zMzM1IDg3NjAvMTE3NjkvMzMzNSA4NDUyLzExNzY5LzMzMzUKK2YgODQ1NS8xMTQ3My8zMzM2IDg0NTAvMTE0NzIvMzMzNiA4NzU4LzExNzgyLzMzMzYKK2YgODc1OC8xMTc4Mi8zMzM3IDg3NjMvMTE0NzMvMzMzNyA4NDU1LzExNDczLzMzMzcKK2YgODQ1Ni8xMTQ3MS8zMzM4IDg0NTQvMTE0NzAvMzMzOCA4NzYyLzExNDcwLzMzMzgKK2YgODc2Mi8xMTQ3MC8zMzM5IDg3NjQvMTE3ODMvMzMzOSA4NDU2LzExNDcxLzMzMzkKK2YgODQ1My8xMTQ3NC8zMzQwIDg0NTUvMTE0NzMvMzM0MCA4NzYzLzExNDczLzMzNDAKK2YgODc2My8xMTQ3My8zMzQwIDg3NjEvMTE0NzQvMzM0MCA4NDUzLzExNDc0LzMzNDAKK2YgODQ1NC8xMTQ3MC8zMzQxIDg0NTcvMTE0NzUvMzM0MSA4NzY1LzExNzg0LzMzNDEKK2YgODc2NS8xMTc4NC8zMzQyIDg3NjIvMTE0NzAvMzM0MiA4NDU0LzExNDcwLzMzNDIKK2YgODQ1OC8xMTQ4Ny8zMzQzIDg0NDUvMTE0NjQvMzM0MyA4NzU3LzExNzgwLzMzNDMKK2YgODc1Ny8xMTc4MC8zMzQ0IDg3NjYvMTE3ODUvMzM0NCA4NDU4LzExNDg3LzMzNDQKK2YgODQ0My8xMTQ2Mi8zMzQ1IDg0NTkvMTE0ODUvMzM0NSA4NzY3LzExNzg2LzMzNDUKK2YgODc2Ny8xMTc4Ni8zMzQ2IDg3NTUvMTE3NzkvMzM0NiA4NDQzLzExNDYyLzMzNDYKK2YgODQ2MS8xMTQ3OC8zMzQ3IDg0NjIvMTE0NzcvMzM0NyA4NzcwLzExNzg3LzMzNDcKK2YgODc3MC8xMTc4Ny8zMzQ4IDg3NjkvMTE0NzgvMzM0OCA4NDYxLzExNDc4LzMzNDgKK2YgODQ2My8xMTQ3Ni8zMzIxIDg0NjAvMTE0NzkvMzMyMSA4NzY4LzExNzg4LzMzMjEKK2YgODc2OC8xMTc4OC8zMzQ5IDg3NzEvMTE3ODkvMzM0OSA4NDYzLzExNDc2LzMzNDkKK2YgODQ2NS8xMTQ4Mi8zMzUwIDg0NjYvMTE0ODEvMzM1MCA4Nzc0LzExNDgxLzMzNTAKK2YgODc3NC8xMTQ4MS8zMzUxIDg3NzMvMTE3OTAvMzM1MSA4NDY1LzExNDgyLzMzNTEKK2YgODQ2Ny8xMTQ4MC8zMzUyIDg0NjQvMTE0ODMvMzM1MiA4NzcyLzExNzkxLzMzNTIKK2YgODc3Mi8xMTc5MS8zMzUzIDg3NzUvMTE3OTIvMzM1MyA4NDY3LzExNDgwLzMzNTMKK2YgODQ1OS8xMTQ4NS8zMzU0IDg0NjEvMTE0NzgvMzM1NCA4NzY5LzExNDc4LzMzNTQKK2YgODc2OS8xMTQ3OC8zMzU0IDg3NjcvMTE3ODYvMzM1NCA4NDU5LzExNDg1LzMzNTQKK2YgODQ2MC8xMTQ3OS8zMzU1IDg0NjgvMTE0ODQvMzM1NSA4Nzc2LzExNDg0LzMzNTUKK2YgODc3Ni8xMTQ4NC8zMzU2IDg3NjgvMTE3ODgvMzM1NiA4NDYwLzExNDc5LzMzNTYKK2YgODQ2Ni8xMTQ4MS8zMzU3IDg0NTgvMTE0ODcvMzM1NyA4NzY2LzExNzg1LzMzNTcKK2YgODc2Ni8xMTc4NS8zMzU4IDg3NzQvMTE0ODEvMzM1OCA4NDY2LzExNDgxLzMzNTgKK2YgODQ2OS8xMTQ4Ni8zMzU5IDg0NjcvMTE0ODAvMzM1OSA4Nzc1LzExNzkyLzMzNTkKK2YgODc3NS8xMTc5Mi8zMzYwIDg3NzcvMTE0ODYvMzM2MCA4NDY5LzExNDg2LzMzNjAKK2YgODQ2Mi8xMTQ3Ny8zMzYxIDg0MzcvMTE0NTQvMzM2MSA4NzQ5LzExNzc0LzMzNjEKK2YgODc0OS8xMTc3NC8zMzYyIDg3NzAvMTE3ODcvMzM2MiA4NDYyLzExNDc3LzMzNjIKK2YgODQzOC8xMTQ2MS8zMzYzIDg0NjUvMTE0ODIvMzM2MyA4NzczLzExNzkwLzMzNjMKK2YgODc3My8xMTc5MC8zMzY0IDg3NTAvMTE3NzcvMzM2NCA4NDM4LzExNDYxLzMzNjQKK2YgODQ3NC8xMTQ5NC8zMzY1IDg0NTYvMTE0NzEvMzM2NSA4NzY0LzExNzgzLzMzNjUKK2YgODc2NC8xMTc4My8zMzY1IDg3NzgvMTE3OTMvMzM2NSA4NDc0LzExNDk0LzMzNjUKK2YgODQ1Ny8xMTQ3NS8zMzY2IDg0NzUvMTE0OTYvMzM2NiA4Nzc5LzExNDk2LzMzNjYKK2YgODc3OS8xMTQ5Ni8zMzM1IDg3NjUvMTE3ODQvMzMzNSA4NDU3LzExNDc1LzMzMzUKK2YgODQ3Ny8xMTQ5NS8zMzY3IDg0NzQvMTE0OTQvMzM2NyA4Nzc4LzExNzkzLzMzNjcKK2YgODc3OC8xMTc5My8zMzY4IDg3ODEvMTE3OTQvMzM2OCA4NDc3LzExNDk1LzMzNjgKK2YgODQ3OC8xMTQ5My8zMzY5IDg0NzYvMTE0OTIvMzM2OSA4NzgwLzExNzk1LzMzNjkKK2YgODc4MC8xMTc5NS8zMzcwIDg3ODIvMTE3OTYvMzM3MCA4NDc4LzExNDkzLzMzNzAKK2YgODQ3NS8xMTQ5Ni8zMzcxIDg0NzcvMTE0OTUvMzM3MSA4NzgxLzExNzk0LzMzNzEKK2YgODc4MS8xMTc5NC8zMzcyIDg3NzkvMTE0OTYvMzM3MiA4NDc1LzExNDk2LzMzNzIKK2YgODQ3Ni8xMTQ5Mi8zMzczIDg0NzkvMTE0OTcvMzM3MyA4NzgzLzExNDk3LzMzNzMKK2YgODc4My8xMTQ5Ny8zMzczIDg3ODAvMTE3OTUvMzM3MyA4NDc2LzExNDkyLzMzNzMKK2YgODQ4MC8xMTUwOS8zMzc0IDg0NjkvMTE0ODYvMzM3NCA4Nzc3LzExNDg2LzMzNzQKK2YgODc3Ny8xMTQ4Ni8zMzc1IDg3ODQvMTE1MDkvMzM3NSA4NDgwLzExNTA5LzMzNzUKK2YgODQ2OC8xMTQ4NC8zMzc2IDg0ODEvMTE1MDcvMzM3NiA4Nzg1LzExNTA3LzMzNzYKK2YgODc4NS8xMTUwNy8zMzM1IDg3NzYvMTE0ODQvMzMzNSA4NDY4LzExNDg0LzMzMzUKK2YgODQ4My8xMTUwMC8zMzc3IDg0ODQvMTE0OTkvMzM3NyA4Nzg4LzExNzk3LzMzNzcKK2YgODc4OC8xMTc5Ny8zMzc3IDg3ODcvMTE3OTgvMzM3NyA4NDgzLzExNTAwLzMzNzcKK2YgODQ4NS8xMTQ5OC8zMzIxIDg0ODIvMTE1MDEvMzMyMSA4Nzg2LzExNzk5LzMzMjEKK2YgODc4Ni8xMTc5OS8zMzQ5IDg3ODkvMTE4MDAvMzM0OSA4NDg1LzExNDk4LzMzNDkKK2YgODQ4Ny8xMTUwNC8zMzc4IDg0ODgvMTE1MDMvMzM3OCA4NzkyLzExODAxLzMzNzgKK2YgODc5Mi8xMTgwMS8zMzc5IDg3OTEvMTE4MDIvMzM3OSA4NDg3LzExNTA0LzMzNzkKK2YgODQ4OS8xMTUwMi8zMzUyIDg0ODYvMTE1MDUvMzM1MiA4NzkwLzExODAzLzMzNTIKK2YgODc5MC8xMTgwMy8zMzgwIDg3OTMvMTE4MDQvMzM4MCA4NDg5LzExNTAyLzMzODAKK2YgODQ4MS8xMTUwNy8zMzgxIDg0ODMvMTE1MDAvMzM4MSA4Nzg3LzExNzk4LzMzODEKK2YgODc4Ny8xMTc5OC8zMzgyIDg3ODUvMTE1MDcvMzM4MiA4NDgxLzExNTA3LzMzODIKK2YgODQ4Mi8xMTUwMS8zMzgzIDg0OTAvMTE1MDYvMzM4MyA4Nzk0LzExODA1LzMzODMKK2YgODc5NC8xMTgwNS8zMzI4IDg3ODYvMTE3OTkvMzMyOCA4NDgyLzExNTAxLzMzMjgKK2YgODQ4OC8xMTUwMy8zMzg0IDg0ODAvMTE1MDkvMzM4NCA4Nzg0LzExNTA5LzMzODQKK2YgODc4NC8xMTUwOS8zMzg1IDg3OTIvMTE4MDEvMzM4NSA4NDg4LzExNTAzLzMzODUKK2YgODQ5MS8xMTUwOC8zMzg2IDg0ODkvMTE1MDIvMzM4NiA4NzkzLzExODA0LzMzODYKK2YgODc5My8xMTgwNC8zMzg3IDg3OTUvMTE4MDYvMzM4NyA4NDkxLzExNTA4LzMzODcKK2YgODQ4NC8xMTQ5OS8zMzg4IDg0NjMvMTE0NzYvMzM4OCA4NzcxLzExNzg5LzMzODgKK2YgODc3MS8xMTc4OS8zMzYxIDg3ODgvMTE3OTcvMzM2MSA4NDg0LzExNDk5LzMzNjEKK2YgODQ2NC8xMTQ4My8zMzg5IDg0ODcvMTE1MDQvMzM4OSA4NzkxLzExODAyLzMzODkKK2YgODc5MS8xMTgwMi8zMzkwIDg3NzIvMTE3OTEvMzM5MCA4NDY0LzExNDgzLzMzOTAKK2YgODQ5Ni8xMTUxNi8zMzY1IDg0NzgvMTE0OTMvMzM2NSA4NzgyLzExNzk2LzMzNjUKK2YgODc4Mi8xMTc5Ni8zMzMzIDg3OTYvMTE4MDcvMzMzMyA4NDk2LzExNTE2LzMzMzMKK2YgODQ3OS8xMTQ5Ny8zMzY2IDg0OTcvMTE1MTgvMzM2NiA4Nzk3LzExNTE4LzMzNjYKK2YgODc5Ny8xMTUxOC8zMzkxIDg3ODMvMTE0OTcvMzM5MSA4NDc5LzExNDk3LzMzOTEKK2YgODQ5OS8xMTUxNy8zMzY3IDg0OTYvMTE1MTYvMzM2NyA4Nzk2LzExODA3LzMzNjcKK2YgODc5Ni8xMTgwNy8zMzM2IDg3OTkvMTE4MDgvMzMzNiA4NDk5LzExNTE3LzMzMzYKK2YgODUwMC8xMTUxNS8zMzM4IDg0OTgvMTE1MTQvMzMzOCA4Nzk4LzExNTE0LzMzMzgKK2YgODc5OC8xMTUxNC8zMzkyIDg4MDAvMTE4MDkvMzM5MiA4NTAwLzExNTE1LzMzOTIKK2YgODQ5Ny8xMTUxOC8zMzkzIDg0OTkvMTE1MTcvMzM5MyA4Nzk5LzExODA4LzMzOTMKK2YgODc5OS8xMTgwOC8zMzk0IDg3OTcvMTE1MTgvMzM5NCA4NDk3LzExNTE4LzMzOTQKK2YgODQ5OC8xMTUxNC8zMzczIDg1MDEvMTE1MTkvMzM3MyA4ODAxLzExODEwLzMzNzMKK2YgODgwMS8xMTgxMC8zMzczIDg3OTgvMTE1MTQvMzM3MyA4NDk4LzExNTE0LzMzNzMKK2YgODUwMi8xMTUzNy8zMzc1IDg0OTEvMTE1MDgvMzM3NSA4Nzk1LzExODA2LzMzNzUKK2YgODc5NS8xMTgwNi8zMzk1IDg4MDIvMTE4MTEvMzM5NSA4NTAyLzExNTM3LzMzOTUKK2YgODUwNC8xMTUzNC8zMzQ2IDg1MDUvMTE1NTMvMzM0NiA4ODA1LzExNTUzLzMzNDYKK2YgODgwNS8xMTU1My8zMzM1IDg4MDQvMTE1MzQvMzMzNSA4NTA0LzExNTM0LzMzMzUKK2YgODUwNi8xMTUyMi8zMzk2IDg1MDcvMTE1MjEvMzM5NiA4ODA3LzExODEyLzMzOTYKK2YgODgwNy8xMTgxMi8zMzk3IDg4MDYvMTE4MTMvMzM5NyA4NTA2LzExNTIyLzMzOTcKK2YgODUwOC8xMTUyMC8zMzY3IDg1MDMvMTE1MjMvMzM2NyA4ODAzLzExODE0LzMzNjcKK2YgODgwMy8xMTgxNC8zMzM2IDg4MDgvMTE4MTUvMzMzNiA4NTA4LzExNTIwLzMzMzYKK2YgODUwNy8xMTUyMS8zMzk4IDg1MDkvMTE1MjUvMzM5OCA4ODA5LzExNTI1LzMzOTgKK2YgODgwOS8xMTUyNS8zMzk5IDg4MDcvMTE4MTIvMzM5OSA4NTA3LzExNTIxLzMzOTkKK2YgODUxMC8xMTUyNC8zNDAwIDg1MDgvMTE1MjAvMzQwMCA4ODA4LzExODE1LzM0MDAKK2YgODgwOC8xMTgxNS8zNDAxIDg4MTAvMTE4MTYvMzQwMSA4NTEwLzExNTI0LzM0MDEKK2YgODUxMS8xMTU1NS8zMzk1IDg1MTIvMTE1MzYvMzM5NSA4ODEyLzExNTM2LzMzOTUKK2YgODgxMi8xMTUzNi8zMzc1IDg4MTEvMTE1NTUvMzM3NSA4NTExLzExNTU1LzMzNzUKK2YgODQ5MC8xMTUwNi8zMzM1IDg1MTMvMTE1MzUvMzMzNSA4ODEzLzExODE3LzMzMzUKK2YgODgxMy8xMTgxNy8zMzQ1IDg3OTQvMTE4MDUvMzM0NSA4NDkwLzExNTA2LzMzNDUKK2YgODUxNS8xMTUyOC8zMzQ3IDg1MTYvMTE1MjcvMzM0NyA4ODE2LzExODE4LzMzNDcKK2YgODgxNi8xMTgxOC8zMzQ4IDg4MTUvMTE1MjgvMzM0OCA4NTE1LzExNTI4LzMzNDgKK2YgODUxNy8xMTUyNi8zNDAyIDg1MTQvMTE1MjkvMzQwMiA4ODE0LzExNTI5LzM0MDIKK2YgODgxNC8xMTUyOS8zNDAzIDg4MTcvMTE4MTkvMzQwMyA4NTE3LzExNTI2LzM0MDMKK2YgODUxOS8xMTUzMi8zNDA0IDg1MjAvMTE1MzEvMzQwNCA4ODIwLzExNTMxLzM0MDQKK2YgODgyMC8xMTUzMS8zMzIyIDg4MTkvMTE4MjAvMzMyMiA4NTE5LzExNTMyLzMzMjIKK2YgODUyMS8xMTUzMC8zNDA1IDg1MTgvMTE1MzMvMzQwNSA4ODE4LzExODIxLzM0MDUKK2YgODgxOC8xMTgyMS8zNDA2IDg4MjEvMTE1MzAvMzQwNiA4NTIxLzExNTMwLzM0MDYKK2YgODUxMy8xMTUzNS8zMzgxIDg1MTUvMTE1MjgvMzM4MSA4ODE1LzExNTI4LzMzODEKK2YgODgxNS8xMTUyOC8zNDA3IDg4MTMvMTE4MTcvMzQwNyA4NTEzLzExNTM1LzM0MDcKK2YgODUxNC8xMTUyOS8zNDA4IDg1MDQvMTE1MzQvMzQwOCA4ODA0LzExNTM0LzM0MDgKK2YgODgwNC8xMTUzNC8zNDA5IDg4MTQvMTE1MjkvMzQwOSA4NTE0LzExNTI5LzM0MDkKK2YgODUyMC8xMTUzMS8zNDEwIDg1MDIvMTE1MzcvMzQxMCA4ODAyLzExODExLzM0MTAKK2YgODgwMi8xMTgxMS8zNDExIDg4MjAvMTE1MzEvMzQxMSA4NTIwLzExNTMxLzM0MTEKK2YgODUxMi8xMTUzNi8zNDEyIDg1MjEvMTE1MzAvMzQxMiA4ODIxLzExNTMwLzM0MTIKK2YgODgyMS8xMTUzMC8zNDEzIDg4MTIvMTE1MzYvMzQxMyA4NTEyLzExNTM2LzM0MTMKK2YgODUxNi8xMTUyNy8zMzMzIDg0ODUvMTE0OTgvMzMzMyA4Nzg5LzExODAwLzMzMzMKK2YgODc4OS8xMTgwMC8zMzYxIDg4MTYvMTE4MTgvMzM2MSA4NTE2LzExNTI3LzMzNjEKK2YgODUyNS8xMTUzOS8zMzYyIDg1MTcvMTE1MjYvMzM2MiA4ODE3LzExODE5LzMzNjIKK2YgODgxNy8xMTgxOS8zMzYyIDg4MjIvMTE4MjIvMzM2MiA4NTI1LzExNTM5LzMzNjIKK2YgODUxOC8xMTUzMy8zMzYzIDg1MjYvMTE1NDQvMzM2MyA4ODIzLzExODIzLzMzNjMKK2YgODgyMy8xMTgyMy8zNDE0IDg4MTgvMTE4MjEvMzQxNCA4NTE4LzExNTMzLzM0MTQKK2YgODQ4Ni8xMTUwNS8zNDE0IDg1MTkvMTE1MzIvMzQxNCA4ODE5LzExODIwLzM0MTQKK2YgODgxOS8xMTgyMC8zNDE1IDg3OTAvMTE4MDMvMzQxNSA4NDg2LzExNTA1LzM0MTUKK2YgODUwMy8xMTUyMy8zMzg4IDg1MDAvMTE1MTUvMzM4OCA4ODAwLzExODA5LzMzODgKK2YgODgwMC8xMTgwOS8zMjM4IDg4MDMvMTE4MTQvMzIzOCA4NTAzLzExNTIzLzMyMzgKK2YgODUwMS8xMTUxOS8zMzM0IDg1MTAvMTE1MjQvMzMzNCA4ODEwLzExODE2LzMzMzQKK2YgODgxMC8xMTgxNi8zMzkxIDg4MDEvMTE4MTAvMzM5MSA4NTAxLzExNTE5LzMzOTEKK2YgODUzMS8xMTU0Ny8zMzQ4IDg1MjUvMTE1MzkvMzM0OCA4ODIyLzExODIyLzMzNDgKK2YgODgyMi8xMTgyMi8zNDE2IDg4MjUvMTE4MjQvMzQxNiA4NTMxLzExNTQ3LzM0MTYKK2YgODUzMi8xMTU0Ni8zMzQ5IDg1MzAvMTE1NDgvMzM0OSA4ODI0LzExODI1LzMzNDkKK2YgODgyNC8xMTgyNS8zMzQ5IDg4MjYvMTE4MjYvMzM0OSA4NTMyLzExNTQ2LzMzNDkKK2YgODUyNi8xMTU0NC8zNDE3IDg1MzQvMTE1NTAvMzQxNyA4ODI4LzExODI3LzM0MTcKK2YgODgyOC8xMTgyNy8zNDE4IDg4MjMvMTE4MjMvMzQxOCA4NTI2LzExNTQ0LzM0MTgKK2YgODUzNS8xMTU0OS8zNDE5IDg1MzMvMTE1NTEvMzQxOSA4ODI3LzExODI4LzM0MTkKK2YgODgyNy8xMTgyOC8zMzI1IDg4MjkvMTE4MjkvMzMyNSA4NTM1LzExNTQ5LzMzMjUKK2YgODUwNS8xMTU1My8zNDIwIDg1MzEvMTE1NDcvMzQyMCA4ODI1LzExODI0LzM0MjAKK2YgODgyNS8xMTgyNC8zNDIxIDg4MDUvMTE1NTMvMzQyMSA4NTA1LzExNTUzLzM0MjEKK2YgODUzMC8xMTU0OC8zMzI4IDg1MzYvMTE1NTIvMzMyOCA4ODMwLzExNTUyLzMzMjgKK2YgODgzMC8xMTU1Mi8zMzI3IDg4MjQvMTE4MjUvMzMyNyA4NTMwLzExNTQ4LzMzMjcKK2YgODUzNC8xMTU1MC8zNDIyIDg1MTEvMTE1NTUvMzQyMiA4ODExLzExNTU1LzM0MjIKK2YgODgxMS8xMTU1NS8zMzI5IDg4MjgvMTE4MjcvMzMyOSA4NTM0LzExNTUwLzMzMjkKK2YgODUzNy8xMTU1NC8zNDIzIDg1MzUvMTE1NDkvMzQyMyA4ODI5LzExODI5LzM0MjMKK2YgODgyOS8xMTgyOS8zNDI0IDg4MzEvMTE1NTQvMzQyNCA4NTM3LzExNTU0LzM0MjQKK2YgODU0MC8xMTU2MC8zMzY1IDg1MDYvMTE1MjIvMzM2NSA4ODA2LzExODEzLzMzNjUKK2YgODgwNi8xMTgxMy8zMzQ0IDg4MzIvMTE4MzAvMzM0NCA4NTQwLzExNTYwLzMzNDQKK2YgODUwOS8xMTUyNS8zMzM0IDg1NDEvMTE1NjIvMzMzNCA4ODMzLzExNTYyLzMzMzQKK2YgODgzMy8xMTU2Mi8zNDI1IDg4MDkvMTE1MjUvMzQyNSA4NTA5LzExNTI1LzM0MjUKK2YgODU0My8xMTU2MS8zNDI2IDg1NDAvMTE1NjAvMzQyNiA4ODMyLzExODMwLzM0MjYKK2YgODgzMi8xMTgzMC8zNDI3IDg4MzUvMTE4MzEvMzQyNyA4NTQzLzExNTYxLzM0MjcKK2YgODU0NC8xMTU1OS8zMzM4IDg1NDIvMTE1NTgvMzMzOCA4ODM0LzExNTU4LzMzMzgKK2YgODgzNC8xMTU1OC8zMzM5IDg4MzYvMTE4MzIvMzMzOSA4NTQ0LzExNTU5LzMzMzkKK2YgODU0MS8xMTU2Mi8zMzk0IDg1NDMvMTE1NjEvMzM5NCA4ODM1LzExODMxLzMzOTQKK2YgODgzNS8xMTgzMS8zMzcyIDg4MzMvMTE1NjIvMzM3MiA4NTQxLzExNTYyLzMzNzIKK2YgODU0Mi8xMTU1OC8zNDI4IDg1NDUvMTE1NjMvMzQyOCA4ODM3LzExNTYzLzM0MjgKK2YgODgzNy8xMTU2My8zMzQyIDg4MzQvMTE1NTgvMzM0MiA4NTQyLzExNTU4LzMzNDIKK2YgODU0Ni8xMTU3NS8zMzk1IDg1MzcvMTE1NTQvMzM5NSA4ODMxLzExNTU0LzMzOTUKK2YgODgzMS8xMTU1NC8zMzk1IDg4MzgvMTE4MzMvMzM5NSA4NTQ2LzExNTc1LzMzOTUKK2YgODUzNi8xMTU1Mi8zMzQ1IDg1NDcvMTE1NzMvMzM0NSA4ODM5LzExODM0LzMzNDUKK2YgODgzOS8xMTgzNC8zMzM1IDg4MzAvMTE1NTIvMzMzNSA4NTM2LzExNTUyLzMzMzUKK2YgODU0OS8xMTU2Ni8zMzc3IDg1NTAvMTE1NjUvMzM3NyA4ODQyLzExODM1LzMzNzcKK2YgODg0Mi8xMTgzNS8zMzc3IDg4NDEvMTE1NjYvMzM3NyA4NTQ5LzExNTY2LzMzNzcKK2YgODU1MS8xMTU2NC8zMzIxIDg1NDgvMTE1NjcvMzMyMSA4ODQwLzExNTY3LzMzMjEKK2YgODg0MC8xMTU2Ny8zNDI5IDg4NDMvMTE4MzYvMzQyOSA4NTUxLzExNTY0LzM0MjkKK2YgODU1My8xMTU3MC8zNDA0IDg1NTQvMTE1NjkvMzQwNCA4ODQ2LzExNTY5LzM0MDQKK2YgODg0Ni8xMTU2OS8zMzUxIDg4NDUvMTE4MzcvMzM1MSA4NTUzLzExNTcwLzMzNTEKK2YgODU1NS8xMTU2OC8zNDMwIDg1NTIvMTE1NzEvMzQzMCA4ODQ0LzExODM4LzM0MzAKK2YgODg0NC8xMTgzOC8zMzUzIDg4NDcvMTE1NjgvMzM1MyA4NTU1LzExNTY4LzMzNTMKK2YgODU0Ny8xMTU3My8zNDMxIDg1NDkvMTE1NjYvMzQzMSA4ODQxLzExNTY2LzM0MzEKK2YgODg0MS8xMTU2Ni8zMzU0IDg4MzkvMTE4MzQvMzM1NCA4NTQ3LzExNTczLzMzNTQKK2YgODU0OC8xMTU2Ny8zMzI4IDg1NTYvMTE1NzIvMzMyOCA4ODQ4LzExNTcyLzMzMjgKK2YgODg0OC8xMTU3Mi8zMzI4IDg4NDAvMTE1NjcvMzMyOCA4NTQ4LzExNTY3LzMzMjgKK2YgODU1NC8xMTU2OS8zMzU3IDg1NDYvMTE1NzUvMzM1NyA4ODM4LzExODMzLzMzNTcKK2YgODgzOC8xMTgzMy8zNDMyIDg4NDYvMTE1NjkvMzQzMiA4NTU0LzExNTY5LzM0MzIKK2YgODU1Ny8xMTU3NC8zNDIzIDg1NTUvMTE1NjgvMzQyMyA4ODQ3LzExNTY4LzM0MjMKK2YgODg0Ny8xMTU2OC8zNDMzIDg4NDkvMTE1NzQvMzQzMyA4NTU3LzExNTc0LzM0MzMKK2YgODU1MC8xMTU2NS8zNDM0IDg1MzIvMTE1NDYvMzQzNCA4ODI2LzExODI2LzM0MzQKK2YgODgyNi8xMTgyNi8zMzMzIDg4NDIvMTE4MzUvMzMzMyA4NTUwLzExNTY1LzMzMzMKK2YgODUzMy8xMTU1MS8zMzg5IDg1NTMvMTE1NzAvMzM4OSA4ODQ1LzExODM3LzMzODkKK2YgODg0NS8xMTgzNy8zMzkwIDg4MjcvMTE4MjgvMzM5MCA4NTMzLzExNTUxLzMzOTAKK2YgODU2Mi8xMTU4Mi8zMzQ0IDg1NDQvMTE1NTkvMzM0NCA4ODM2LzExODMyLzMzNDQKK2YgODgzNi8xMTgzMi8zMzYyIDg4NTAvMTE4MzkvMzM2MiA4NTYyLzExNTgyLzMzNjIKK2YgODU0NS8xMTU2My8zMzM0IDg1NjMvMTE1ODQvMzMzNCA4ODUxLzExODQwLzMzMzQKK2YgODg1MS8xMTg0MC8zMzY2IDg4MzcvMTE1NjMvMzM2NiA4NTQ1LzExNTYzLzMzNjYKK2YgODU2NS8xMTU4My8zMzY3IDg1NjIvMTE1ODIvMzM2NyA4ODUwLzExODM5LzMzNjcKK2YgODg1MC8xMTgzOS8zNDM1IDg4NTMvMTE1ODMvMzQzNSA4NTY1LzExNTgzLzM0MzUKK2YgODU2Ni8xMTU4MS8zMzM4IDg1NjQvMTE1ODAvMzMzOCA4ODUyLzExODQxLzMzMzgKK2YgODg1Mi8xMTg0MS8zNDM2IDg4NTQvMTE4NDIvMzQzNiA4NTY2LzExNTgxLzM0MzYKK2YgODU2My8xMTU4NC8zNDAwIDg1NjUvMTE1ODMvMzQwMCA4ODUzLzExNTgzLzM0MDAKK2YgODg1My8xMTU4My8zMzk0IDg4NTEvMTE4NDAvMzM5NCA4NTYzLzExNTg0LzMzOTQKK2YgODU2NC8xMTU4MC8zMzczIDg1NjcvMTE1ODUvMzM3MyA4ODU1LzExNTg1LzMzNzMKK2YgODg1NS8xMTU4NS8zMzQyIDg4NTIvMTE4NDEvMzM0MiA4NTY0LzExNTgwLzMzNDIKK2YgODU2OC8xMTU5Ny8zMzk1IDg1NTcvMTE1NzQvMzM5NSA4ODQ5LzExNTc0LzMzOTUKK2YgODg0OS8xMTU3NC8zMzk1IDg4NTYvMTE1OTcvMzM5NSA4NTY4LzExNTk3LzMzOTUKK2YgODU1Ni8xMTU3Mi8zMzM1IDg1NjkvMTE1OTUvMzMzNSA4ODU3LzExNTk1LzMzMzUKK2YgODg1Ny8xMTU5NS8zMzM1IDg4NDgvMTE1NzIvMzMzNSA4NTU2LzExNTcyLzMzMzUKK2YgODU3MS8xMTU4OC8zMzQ3IDg1NzIvMTE1ODcvMzM0NyA4ODYwLzExODQzLzMzNDcKK2YgODg2MC8xMTg0My8zNDE2IDg4NTkvMTE4NDQvMzQxNiA4NTcxLzExNTg4LzM0MTYKK2YgODU3My8xMTU4Ni8zNDM3IDg1NzAvMTE1ODkvMzQzNyA4ODU4LzExODQ1LzM0MzcKK2YgODg1OC8xMTg0NS8zMzIxIDg4NjEvMTE4NDYvMzMyMSA4NTczLzExNTg2LzMzMjEKK2YgODU3NS8xMTU5Mi8zNDE3IDg1NzYvMTE1OTEvMzQxNyA4ODY0LzExODQ3LzM0MTcKK2YgODg2NC8xMTg0Ny8zNDM4IDg4NjMvMTE4NDgvMzQzOCA4NTc1LzExNTkyLzM0MzgKK2YgODU3Ny8xMTU5MC8zNDE5IDg1NzQvMTE1OTMvMzQxOSA4ODYyLzExODQ5LzM0MTkKK2YgODg2Mi8xMTg0OS8zMzI1IDg4NjUvMTE4NTAvMzMyNSA4NTc3LzExNTkwLzMzMjUKK2YgODU2OS8xMTU5NS8zNDA3IDg1NzEvMTE1ODgvMzQwNyA4ODU5LzExODQ0LzM0MDcKK2YgODg1OS8xMTg0NC8zMzgxIDg4NTcvMTE1OTUvMzM4MSA4NTY5LzExNTk1LzMzODEKK2YgODU3MC8xMTU4OS8zMzU2IDg1NzgvMTE1OTQvMzM1NiA4ODY2LzExNTk0LzMzNTYKK2YgODg2Ni8xMTU5NC8zNDM5IDg4NTgvMTE4NDUvMzQzOSA4NTcwLzExNTg5LzM0MzkKK2YgODU3Ni8xMTU5MS8zNDQwIDg1NjgvMTE1OTcvMzQ0MCA4ODU2LzExNTk3LzM0NDAKK2YgODg1Ni8xMTU5Ny8zNDExIDg4NjQvMTE4NDcvMzQxMSA4NTc2LzExNTkxLzM0MTEKK2YgODU3OS8xMTU5Ni8zMzMxIDg1NzcvMTE1OTAvMzMzMSA4ODY1LzExODUwLzMzMzEKK2YgODg2NS8xMTg1MC8zNDI0IDg4NjcvMTE1OTYvMzQyNCA4NTc5LzExNTk2LzM0MjQKK2YgODU3Mi8xMTU4Ny8zMzY1IDg1NTEvMTE1NjQvMzM2NSA4ODQzLzExODM2LzMzNjUKK2YgODg0My8xMTgzNi8zMzYxIDg4NjAvMTE4NDMvMzM2MSA4NTcyLzExNTg3LzMzNjEKK2YgODU1Mi8xMTU3MS8zNDQxIDg1NzUvMTE1OTIvMzQ0MSA4ODYzLzExODQ4LzM0NDEKK2YgODg2My8xMTg0OC8zMzg5IDg4NDQvMTE4MzgvMzM4OSA4NTUyLzExNTcxLzMzODkKK2YgODU4NC8xMTYwNC8zMzg4IDg1NjYvMTE1ODEvMzM4OCA4ODU0LzExODQyLzMzODgKK2YgODg1NC8xMTg0Mi8zMjM4IDg4NjgvMTE4NTEvMzIzOCA4NTg0LzExNjA0LzMyMzgKK2YgODU2Ny8xMTU4NS8zMzM0IDg1ODUvMTE2MDYvMzMzNCA4ODY5LzExNjA2LzMzMzQKK2YgODg2OS8xMTYwNi8zMzY2IDg4NTUvMTE1ODUvMzM2NiA4NTY3LzExNTg1LzMzNjYKK2YgODU4Ny8xMTYwNS8zNDQyIDg1ODQvMTE2MDQvMzQ0MiA4ODY4LzExODUxLzM0NDIKK2YgODg2OC8xMTg1MS8zMzM2IDg4NzEvMTE4NTIvMzMzNiA4NTg3LzExNjA1LzMzMzYKK2YgODU4OC8xMTYwMy8zMzM4IDg1ODYvMTE2MDIvMzMzOCA4ODcwLzExODUzLzMzMzgKK2YgODg3MC8xMTg1My8zNDQzIDg4NzIvMTE4NTQvMzQ0MyA4NTg4LzExNjAzLzM0NDMKK2YgODU4NS8xMTYwNi8zNDAwIDg1ODcvMTE2MDUvMzQwMCA4ODcxLzExODUyLzM0MDAKK2YgODg3MS8xMTg1Mi8zNDQ0IDg4NjkvMTE2MDYvMzQ0NCA4NTg1LzExNjA2LzM0NDQKK2YgODU4Ni8xMTYwMi8zNDQ1IDg1ODkvMTE2MDcvMzQ0NSA4ODczLzExNjA3LzM0NDUKK2YgODg3My8xMTYwNy8zNDQ2IDg4NzAvMTE4NTMvMzQ0NiA4NTg2LzExNjAyLzM0NDYKK2YgODU5MC8xMTYxOS8zMzc1IDg1NzkvMTE1OTYvMzM3NSA4ODY3LzExNTk2LzMzNzUKK2YgODg2Ny8xMTU5Ni8zMzc1IDg4NzQvMTE2MTkvMzM3NSA4NTkwLzExNjE5LzMzNzUKK2YgODU3OC8xMTU5NC8zNDQ3IDg1OTEvMTE2MTcvMzQ0NyA4ODc1LzExNjE3LzM0NDcKK2YgODg3NS8xMTYxNy8zMzM0IDg4NjYvMTE1OTQvMzMzNCA4NTc4LzExNTk0LzMzMzQKK2YgODU5My8xMTYxMC8zMzQ3IDg1OTQvMTE2MDkvMzM0NyA4ODc4LzExODU1LzMzNDcKK2YgODg3OC8xMTg1NS8zMzc3IDg4NzcvMTE4NTYvMzM3NyA4NTkzLzExNjEwLzMzNzcKK2YgODU5NS8xMTYwOC8zNDQ4IDg1OTIvMTE2MTEvMzQ0OCA4ODc2LzExNjExLzM0NDgKK2YgODg3Ni8xMTYxMS8zNDM3IDg4NzkvMTE4NTcvMzQzNyA4NTk1LzExNjA4LzM0MzcKK2YgODU5Ny8xMTYxNC8zNDA0IDg1OTgvMTE2MTMvMzQwNCA4ODgyLzExODU4LzM0MDQKK2YgODg4Mi8xMTg1OC8zMzc5IDg4ODEvMTE4NTkvMzM3OSA4NTk3LzExNjE0LzMzNzkKK2YgODU5OS8xMTYxMi8zNDQ5IDg1OTYvMTE2MTUvMzQ0OSA4ODgwLzExODYwLzM0NDkKK2YgODg4MC8xMTg2MC8zMzI1IDg4ODMvMTE2MTIvMzMyNSA4NTk5LzExNjEyLzMzMjUKK2YgODU5MS8xMTYxNy8zNDUwIDg1OTMvMTE2MTAvMzQ1MCA4ODc3LzExODU2LzM0NTAKK2YgODg3Ny8xMTg1Ni8zNDUxIDg4NzUvMTE2MTcvMzQ1MSA4NTkxLzExNjE3LzM0NTEKK2YgODU5Mi8xMTYxMS8zNDUyIDg2MDAvMTE2MTYvMzQ1MiA4ODg0LzExODYxLzM0NTIKK2YgODg4NC8xMTg2MS8zNDUzIDg4NzYvMTE2MTEvMzQ1MyA4NTkyLzExNjExLzM0NTMKK2YgODU5OC8xMTYxMy8zNDU0IDg1OTAvMTE2MTkvMzQ1NCA4ODc0LzExNjE5LzM0NTQKK2YgODg3NC8xMTYxOS8zNDU1IDg4ODIvMTE4NTgvMzQ1NSA4NTk4LzExNjEzLzM0NTUKK2YgODYwMS8xMTYxOC8zNDU2IDg1OTkvMTE2MTIvMzQ1NiA4ODgzLzExNjEyLzM0NTYKK2YgODg4My8xMTYxMi8zNDU3IDg4ODUvMTE4NjIvMzQ1NyA4NjAxLzExNjE4LzM0NTcKK2YgODU5NC8xMTYwOS8zNDM0IDg1NzMvMTE1ODYvMzQzNCA4ODYxLzExODQ2LzM0MzQKK2YgODg2MS8xMTg0Ni8zMzYxIDg4NzgvMTE4NTUvMzM2MSA4NTk0LzExNjA5LzMzNjEKK2YgODU3NC8xMTU5My8zNDE1IDg1OTcvMTE2MTQvMzQxNSA4ODgxLzExODU5LzM0MTUKK2YgODg4MS8xMTg1OS8zMzkwIDg4NjIvMTE4NDkvMzM5MCA4NTc0LzExNTkzLzMzOTAKK2YgODYwNi8xMTYyNi8zNDU4IDg1ODgvMTE2MDMvMzQ1OCA4ODcyLzExODU0LzM0NTgKK2YgODg3Mi8xMTg1NC8zNDU4IDg4ODYvMTE4NjMvMzQ1OCA4NjA2LzExNjI2LzM0NTgKK2YgODU4OS8xMTYwNy8zNDU5IDg2MDcvMTE2MjgvMzQ1OSA4ODg3LzExNjI4LzM0NTkKK2YgODg4Ny8xMTYyOC8zNDYwIDg4NzMvMTE2MDcvMzQ2MCA4NTg5LzExNjA3LzM0NjAKK2YgODYwOS8xMTYyNy8zNDYxIDg2MDYvMTE2MjYvMzQ2MSA4ODg2LzExODYzLzM0NjEKK2YgODg4Ni8xMTg2My8zNDYyIDg4ODkvMTE2MjcvMzQ2MiA4NjA5LzExNjI3LzM0NjIKK2YgODYxMC8xMTYyNS8zNDYzIDg2MDgvMTE2MjQvMzQ2MyA4ODg4LzExODY0LzM0NjMKK2YgODg4OC8xMTg2NC8zNDY0IDg4OTAvMTE4NjUvMzQ2NCA4NjEwLzExNjI1LzM0NjQKK2YgODYwNy8xMTYyOC8zNDY1IDg2MDkvMTE2MjcvMzQ2NSA4ODg5LzExNjI3LzM0NjUKK2YgODg4OS8xMTYyNy8zNDY2IDg4ODcvMTE2MjgvMzQ2NiA4NjA3LzExNjI4LzM0NjYKK2YgODYwOC8xMTYyNC8zNDY3IDg2MTEvMTE2MjkvMzQ2NyA4ODkxLzExODY2LzM0NjcKK2YgODg5MS8xMTg2Ni8zNDY4IDg4ODgvMTE4NjQvMzQ2OCA4NjA4LzExNjI0LzM0NjgKK2YgODYxMi8xMTY0MS8zNDY5IDg2MDEvMTE2MTgvMzQ2OSA4ODg1LzExODYyLzM0NjkKK2YgODg4NS8xMTg2Mi8zMzk1IDg4OTIvMTE2NDEvMzM5NSA4NjEyLzExNjQxLzMzOTUKK2YgODYwMC8xMTYxNi8zMzQ2IDg2MTMvMTE2MzkvMzM0NiA4ODkzLzExNjM5LzMzNDYKK2YgODg5My8xMTYzOS8zNDcwIDg4ODQvMTE4NjEvMzQ3MCA4NjAwLzExNjE2LzM0NzAKK2YgODYxNS8xMTYzMi8zMzQ4IDg2MTYvMTE2MzEvMzM0OCA4ODk2LzExODY3LzMzNDgKK2YgODg5Ni8xMTg2Ny8zMzQ4IDg4OTUvMTE4NjgvMzM0OCA4NjE1LzExNjMyLzMzNDgKK2YgODYxNy8xMTYzMC8zNDcxIDg2MTQvMTE2MzMvMzQ3MSA4ODk0LzExODY5LzM0NzEKK2YgODg5NC8xMTg2OS8zNDcxIDg4OTcvMTE4NzAvMzQ3MSA4NjE3LzExNjMwLzM0NzEKK2YgODYxOS8xMTYzNi8zMzc4IDg2MjAvMTE2MzUvMzM3OCA4OTAwLzExODcxLzMzNzgKK2YgODkwMC8xMTg3MS8zNDM4IDg4OTkvMTE4NzIvMzQzOCA4NjE5LzExNjM2LzM0MzgKK2YgODYyMS8xMTYzNC8zNDcyIDg2MTgvMTE2MzcvMzQ3MiA4ODk4LzExODczLzM0NzIKK2YgODg5OC8xMTg3My8zNDQ5IDg5MDEvMTE4NzQvMzQ0OSA4NjIxLzExNjM0LzM0NDkKK2YgODYxMy8xMTYzOS8zMzgxIDg2MTUvMTE2MzIvMzM4MSA4ODk1LzExODY4LzMzODEKK2YgODg5NS8xMTg2OC8zNDA3IDg4OTMvMTE2MzkvMzQwNyA4NjEzLzExNjM5LzM0MDcKK2YgODYxNC8xMTYzMy8zNDMwIDg2MjIvMTE2MzgvMzQzMCA4OTAyLzExNjM4LzM0MzAKK2YgODkwMi8xMTYzOC8zNDczIDg4OTQvMTE4NjkvMzQ3MyA4NjE0LzExNjMzLzM0NzMKK2YgODYyMC8xMTYzNS8zNDc0IDg2MTIvMTE2NDEvMzQ3NCA4ODkyLzExNjQxLzM0NzQKK2YgODg5Mi8xMTY0MS8zNDc1IDg5MDAvMTE4NzEvMzQ3NSA4NjIwLzExNjM1LzM0NzUKK2YgODYyMy8xMTY0MC8zNDc2IDg2MjEvMTE2MzQvMzQ3NiA4OTAxLzExODc0LzM0NzYKK2YgODkwMS8xMTg3NC8zNDc3IDg5MDMvMTE2NDAvMzQ3NyA4NjIzLzExNjQwLzM0NzcKK2YgODYxNi8xMTYzMS8zNDM0IDg1OTUvMTE2MDgvMzQzNCA4ODc5LzExODU3LzM0MzQKK2YgODg3OS8xMTg1Ny8zNDc4IDg4OTYvMTE4NjcvMzQ3OCA4NjE2LzExNjMxLzM0NzgKK2YgODU5Ni8xMTYxNS8zNDE1IDg2MTkvMTE2MzYvMzQxNSA4ODk5LzExODcyLzM0MTUKK2YgODg5OS8xMTg3Mi8zMzkwIDg4ODAvMTE4NjAvMzM5MCA4NTk2LzExNjE1LzMzOTAKK2YgODYyOC8xMTY0OC8zMzQ0IDg2MTAvMTE2MjUvMzM0NCA4ODkwLzExODY1LzMzNDQKK2YgODg5MC8xMTg2NS8zMzQ0IDg5MDQvMTE4NzUvMzM0NCA4NjI4LzExNjQ4LzMzNDQKK2YgODYxMS8xMTYyOS8zNDU5IDg2MjkvMTE2NTAvMzQ1OSA4OTA1LzExNjUwLzM0NTkKK2YgODkwNS8xMTY1MC8zMzY2IDg4OTEvMTE4NjYvMzM2NiA4NjExLzExNjI5LzMzNjYKK2YgODYzMS8xMTY0OS8zNDQyIDg2MjgvMTE2NDgvMzQ0MiA4OTA0LzExODc1LzM0NDIKK2YgODkwNC8xMTg3NS8zNDc5IDg5MDcvMTE4NzYvMzQ3OSA4NjMxLzExNjQ5LzM0NzkKK2YgODYzMi8xMTY0Ny8zNDgwIDg2MzAvMTE2NDYvMzQ4MCA4OTA2LzExODc3LzM0ODAKK2YgODkwNi8xMTg3Ny8zNDgxIDg5MDgvMTE4NzgvMzQ4MSA4NjMyLzExNjQ3LzM0ODEKK2YgODYyOS8xMTY1MC8zNDAxIDg2MzEvMTE2NDkvMzQwMSA4OTA3LzExODc2LzM0MDEKK2YgODkwNy8xMTg3Ni8zNDgyIDg5MDUvMTE2NTAvMzQ4MiA4NjI5LzExNjUwLzM0ODIKK2YgODYzMC8xMTY0Ni8zNDgzIDg2MzMvMTE2NTEvMzQ4MyA4OTA5LzExNjUxLzM0ODMKK2YgODkwOS8xMTY1MS8zNDg0IDg5MDYvMTE4NzcvMzQ4NCA4NjMwLzExNjQ2LzM0ODQKK2YgODYzNC8xMTY2My8zMzc1IDg2MjMvMTE2NDAvMzM3NSA4OTAzLzExNjQwLzMzNzUKK2YgODkwMy8xMTY0MC8zMzc1IDg5MTAvMTE2NjMvMzM3NSA4NjM0LzExNjYzLzMzNzUKK2YgODYyMi8xMTYzOC8zMzc2IDg2MzUvMTE2NjEvMzM3NiA4OTExLzExNjYxLzMzNzYKK2YgODkxMS8xMTY2MS8zMzc2IDg5MDIvMTE2MzgvMzM3NiA4NjIyLzExNjM4LzMzNzYKK2YgODYzNy8xMTY1NC8zNDg1IDg2MzgvMTE2NTMvMzQ4NSA4OTE0LzExODc5LzM0ODUKK2YgODkxNC8xMTg3OS8zNDg1IDg5MTMvMTE4ODAvMzQ4NSA4NjM3LzExNjU0LzM0ODUKK2YgODYzOS8xMTY1Mi8zNDg2IDg2MzYvMTE2NTUvMzQ4NiA4OTEyLzExODgxLzM0ODYKK2YgODkxMi8xMTg4MS8zNDg2IDg5MTUvMTE4ODIvMzQ4NiA4NjM5LzExNjUyLzM0ODYKK2YgODY0MS8xMTY1OC8zNDg3IDg2NDIvMTE2NTcvMzQ4NyA4OTE4LzExODgzLzM0ODcKK2YgODkxOC8xMTg4My8zNDg4IDg5MTcvMTE4ODQvMzQ4OCA4NjQxLzExNjU4LzM0ODgKK2YgODY0My8xMTY1Ni8zNDg5IDg2NDAvMTE2NTkvMzQ4OSA4OTE2LzExODg1LzM0ODkKK2YgODkxNi8xMTg4NS8zNDkwIDg5MTkvMTE4ODYvMzQ5MCA4NjQzLzExNjU2LzM0OTAKK2YgODYzNS8xMTY2MS8zNDkxIDg2MzcvMTE2NTQvMzQ5MSA4OTEzLzExODgwLzM0OTEKK2YgODkxMy8xMTg4MC8zNDkyIDg5MTEvMTE2NjEvMzQ5MiA4NjM1LzExNjYxLzM0OTIKK2YgODYzNi8xMTY1NS8zNDkzIDg2NDQvMTE2NjAvMzQ5MyA4OTIwLzExODg3LzM0OTMKK2YgODkyMC8xMTg4Ny8zNDk0IDg5MTIvMTE4ODEvMzQ5NCA4NjM2LzExNjU1LzM0OTQKK2YgODY0Mi8xMTY1Ny8zNDk1IDg2MzQvMTE2NjMvMzQ5NSA4OTEwLzExNjYzLzM0OTUKK2YgODkxMC8xMTY2My8zNDk2IDg5MTgvMTE4ODMvMzQ5NiA4NjQyLzExNjU3LzM0OTYKK2YgODY0NS8xMTY2Mi8zNDk3IDg2NDMvMTE2NTYvMzQ5NyA4OTE5LzExODg2LzM0OTcKK2YgODkxOS8xMTg4Ni8zNDk4IDg5MjEvMTE4ODgvMzQ5OCA4NjQ1LzExNjYyLzM0OTgKK2YgODYzOC8xMTY1My8zNDM0IDg2MTcvMTE2MzAvMzQzNCA4ODk3LzExODcwLzM0MzQKK2YgODg5Ny8xMTg3MC8zNDc4IDg5MTQvMTE4NzkvMzQ3OCA4NjM4LzExNjUzLzM0NzgKK2YgODYxOC8xMTYzNy8zMzY0IDg2NDEvMTE2NTgvMzM2NCA4OTE3LzExODg0LzMzNjQKK2YgODkxNy8xMTg4NC8zMzkwIDg4OTgvMTE4NzMvMzM5MCA4NjE4LzExNjM3LzMzOTAKK2YgODY1MC8xMTY3MC8zNDU4IDg2MzIvMTE2NDcvMzQ1OCA4OTA4LzExODc4LzM0NTgKK2YgODkwOC8xMTg3OC8zNDU4IDg5MjIvMTE4ODkvMzQ1OCA4NjUwLzExNjcwLzM0NTgKK2YgODYzMy8xMTY1MS8zMzY2IDg2NTEvMTE2NzIvMzM2NiA4OTIzLzExNjcyLzMzNjYKK2YgODkyMy8xMTY3Mi8zNDU5IDg5MDkvMTE2NTEvMzQ1OSA4NjMzLzExNjUxLzM0NTkKK2YgODY1My8xMTY3MS8zNDk5IDg2NTAvMTE2NzAvMzQ5OSA4OTIyLzExODg5LzM0OTkKK2YgODkyMi8xMTg4OS8zNTAwIDg5MjUvMTE2NzEvMzUwMCA4NjUzLzExNjcxLzM1MDAKK2YgODY1NC8xMTY2OS8zNTAxIDg2NTIvMTE2NjgvMzUwMSA4OTI0LzExNjY4LzM1MDEKK2YgODkyNC8xMTY2OC8zNTAyIDg5MjYvMTE4OTAvMzUwMiA4NjU0LzExNjY5LzM1MDIKK2YgODY1MS8xMTY3Mi8zNTAzIDg2NTMvMTE2NzEvMzUwMyA4OTI1LzExNjcxLzM1MDMKK2YgODkyNS8xMTY3MS8zNTA0IDg5MjMvMTE2NzIvMzUwNCA4NjUxLzExNjcyLzM1MDQKK2YgODY1Mi8xMTY2OC8zNTA1IDg2NTUvMTE2NzMvMzUwNSA4OTI3LzExODkxLzM1MDUKK2YgODkyNy8xMTg5MS8zNTA2IDg5MjQvMTE2NjgvMzUwNiA4NjUyLzExNjY4LzM1MDYKK2YgODY1Ni8xMTY4NS8zMzk1IDg2NDUvMTE2NjIvMzM5NSA4OTIxLzExODg4LzMzOTUKK2YgODkyMS8xMTg4OC8zMzk1IDg5MjgvMTE4OTIvMzM5NSA4NjU2LzExNjg1LzMzOTUKK2YgODY0NC8xMTY2MC8zMzc2IDg2NTcvMTE2ODMvMzM3NiA4OTI5LzExODkzLzMzNzYKK2YgODkyOS8xMTg5My8zMzQ1IDg5MjAvMTE4ODcvMzM0NSA4NjQ0LzExNjYwLzMzNDUKK2YgODY1OS8xMTY3Ni8zNTA3IDg2NjAvMTE2NzUvMzUwNyA4OTMyLzExODk0LzM1MDcKK2YgODkzMi8xMTg5NC8zNTA4IDg5MzEvMTE4OTUvMzUwOCA4NjU5LzExNjc2LzM1MDgKK2YgODY2MS8xMTY3NC8zNTA5IDg2NTgvMTE2NzcvMzUwOSA4OTMwLzExODk2LzM1MDkKK2YgODkzMC8xMTg5Ni8zNTA5IDg5MzMvMTE4OTcvMzUwOSA4NjYxLzExNjc0LzM1MDkKK2YgODY2My8xMTY4MC8zNTEwIDg2NjQvMTE2NzkvMzUxMCA4OTM2LzExODk4LzM1MTAKK2YgODkzNi8xMTg5OC8zNTExIDg5MzUvMTE4OTkvMzUxMSA4NjYzLzExNjgwLzM1MTEKK2YgODY2NS8xMTY3OC8zNTEyIDg2NjIvMTE2ODEvMzUxMiA4OTM0LzExOTAwLzM1MTIKK2YgODkzNC8xMTkwMC8zNTEzIDg5MzcvMTE5MDEvMzUxMyA4NjY1LzExNjc4LzM1MTMKK2YgODY1Ny8xMTY4My8zNTE0IDg2NTkvMTE2NzYvMzUxNCA4OTMxLzExODk1LzM1MTQKK2YgODkzMS8xMTg5NS8zNTE0IDg5MjkvMTE4OTMvMzUxNCA4NjU3LzExNjgzLzM1MTQKK2YgODY1OC8xMTY3Ny8zNTE1IDg2NjYvMTE2ODIvMzUxNSA4OTM4LzExNjgyLzM1MTUKK2YgODkzOC8xMTY4Mi8zNTEzIDg5MzAvMTE4OTYvMzUxMyA4NjU4LzExNjc3LzM1MTMKK2YgODY2NC8xMTY3OS8zNTE2IDg2NTYvMTE2ODUvMzUxNiA4OTI4LzExODkyLzM1MTYKK2YgODkyOC8xMTg5Mi8zNTE3IDg5MzYvMTE4OTgvMzUxNyA4NjY0LzExNjc5LzM1MTcKK2YgODY2Ny8xMTY4NC8zNTE4IDg2NjUvMTE2NzgvMzUxOCA4OTM3LzExOTAxLzM1MTgKK2YgODkzNy8xMTkwMS8zNTE5IDg5MzkvMTE2ODQvMzUxOSA4NjY3LzExNjg0LzM1MTkKK2YgODY2MC8xMTY3NS8zNTIwIDg2MzkvMTE2NTIvMzUyMCA4OTE1LzExODgyLzM1MjAKK2YgODkxNS8xMTg4Mi8zNTIxIDg5MzIvMTE4OTQvMzUyMSA4NjYwLzExNjc1LzM1MjEKK2YgODY0MC8xMTY1OS8zMzkwIDg2NjMvMTE2ODAvMzM5MCA4OTM1LzExODk5LzMzOTAKK2YgODkzNS8xMTg5OS8zMzY0IDg5MTYvMTE4ODUvMzM2NCA4NjQwLzExNjU5LzMzNjQKK2YgODY3Mi8xMTY5Mi8zNDU4IDg2NTQvMTE2NjkvMzQ1OCA4OTI2LzExODkwLzM0NTgKK2YgODkyNi8xMTg5MC8zMjM4IDg5NDAvMTE5MDIvMzIzOCA4NjcyLzExNjkyLzMyMzgKK2YgODY1NS8xMTY3My8zNTIyIDg2NzMvMTE2OTQvMzUyMiA4OTQxLzExOTAzLzM1MjIKK2YgODk0MS8xMTkwMy8zMzY2IDg5MjcvMTE4OTEvMzM2NiA4NjU1LzExNjczLzMzNjYKK2YgODY3NS8xMTY5My8zNTIzIDg2NzIvMTE2OTIvMzUyMyA4OTQwLzExOTAyLzM1MjMKK2YgODk0MC8xMTkwMi8zNTI0IDg5NDMvMTE5MDQvMzUyNCA4Njc1LzExNjkzLzM1MjQKK2YgODY3Ni8xMTY5MS8zNTI1IDg2NzQvMTE2OTAvMzUyNSA4OTQyLzExOTA1LzM1MjUKK2YgODk0Mi8xMTkwNS8zNTI2IDg5NDQvMTE5MDYvMzUyNiA4Njc2LzExNjkxLzM1MjYKK2YgODY3My8xMTY5NC8zNTI3IDg2NzUvMTE2OTMvMzUyNyA4OTQzLzExOTA0LzM1MjcKK2YgODk0My8xMTkwNC8zNTI4IDg5NDEvMTE5MDMvMzUyOCA4NjczLzExNjk0LzM1MjgKK2YgODY3NC8xMTY5MC8zNTI5IDg2NzcvMTE2OTUvMzUyOSA4OTQ1LzExNjk1LzM1MjkKK2YgODk0NS8xMTY5NS8zNTMwIDg5NDIvMTE5MDUvMzUzMCA4Njc0LzExNjkwLzM1MzAKK2YgODY3OC8xMTcxMy8zMzc1IDg2NjcvMTE2ODQvMzM3NSA4OTM5LzExNjg0LzMzNzUKK2YgODkzOS8xMTY4NC8zMzk1IDg5NDYvMTE5MDcvMzM5NSA4Njc4LzExNzEzLzMzOTUKK2YgODY4MC8xMTcxMC8zMzc2IDg2ODEvMTE3NjUvMzM3NiA4OTQ5LzExNzY1LzMzNzYKK2YgODk0OS8xMTc2NS8zNDcwIDg5NDgvMTE3MTAvMzQ3MCA4NjgwLzExNzEwLzM0NzAKK2YgODY4Mi8xMTY5OC8zNTMxIDg2ODMvMTE2OTcvMzUzMSA4OTUxLzExOTA4LzM1MzEKK2YgODk1MS8xMTkwOC8zNTMyIDg5NTAvMTE5MDkvMzUzMiA4NjgyLzExNjk4LzM1MzIKK2YgODY4NC8xMTY5Ni8zNTMzIDg2NzkvMTE2OTkvMzUzMyA4OTQ3LzExOTEwLzM1MzMKK2YgODk0Ny8xMTkxMC8zNTM0IDg5NTIvMTE2OTYvMzUzNCA4Njg0LzExNjk2LzM1MzQKK2YgODY4My8xMTY5Ny8zNTM1IDg2ODUvMTE3MDEvMzUzNSA4OTUzLzExNzAxLzM1MzUKK2YgODk1My8xMTcwMS8zNTI5IDg5NTEvMTE5MDgvMzUyOSA4NjgzLzExNjk3LzM1MjkKK2YgODY4Ni8xMTcwMC8zNTM2IDg2ODQvMTE2OTYvMzUzNiA4OTUyLzExNjk2LzM1MzYKK2YgODk1Mi8xMTY5Ni8zNTM3IDg5NTQvMTE5MTEvMzUzNyA4Njg2LzExNzAwLzM1MzcKK2YgODY4Ny8xMTc1Ny8zNDU4IDg2ODgvMTE3MTIvMzQ1OCA4OTU2LzExNzEyLzM0NTgKK2YgODk1Ni8xMTcxMi8zMzk1IDg5NTUvMTE3NTcvMzM5NSA4Njg3LzExNzU3LzMzOTUKK2YgODY2Ni8xMTY4Mi8zNDcwIDg2ODkvMTE3MTEvMzQ3MCA4OTU3LzExOTEyLzM0NzAKK2YgODk1Ny8xMTkxMi8zMzc2IDg5MzgvMTE2ODIvMzM3NiA4NjY2LzExNjgyLzMzNzYKK2YgODY5MS8xMTcwNC8zNTMzIDg2OTIvMTE3MDMvMzUzMyA4OTYwLzExOTEzLzM1MzMKK2YgODk2MC8xMTkxMy8zNTM4IDg5NTkvMTE3MDQvMzUzOCA4NjkxLzExNzA0LzM1MzgKK2YgODY5My8xMTcwMi8zNTM5IDg2OTAvMTE3MDUvMzUzOSA4OTU4LzExNzA1LzM1MzkKK2YgODk1OC8xMTcwNS8zNTQwIDg5NjEvMTE5MTQvMzU0MCA4NjkzLzExNzAyLzM1NDAKK2YgODY5NS8xMTcwOC8zNTQxIDg2OTYvMTE3MDcvMzU0MSA4OTY0LzExNzA3LzM1NDEKK2YgODk2NC8xMTcwNy8zNDg3IDg5NjMvMTE5MTUvMzQ4NyA4Njk1LzExNzA4LzM0ODcKK2YgODY5Ny8xMTcwNi8zNTQyIDg2OTQvMTE3MDkvMzU0MiA4OTYyLzExOTE2LzM1NDIKK2YgODk2Mi8xMTkxNi8zNTMwIDg5NjUvMTE3MDYvMzUzMCA4Njk3LzExNzA2LzM1MzAKK2YgODY4OS8xMTcxMS8zNTQxIDg2OTEvMTE3MDQvMzU0MSA4OTU5LzExNzA0LzM1NDEKK2YgODk1OS8xMTcwNC8zNTQzIDg5NTcvMTE5MTIvMzU0MyA4Njg5LzExNzExLzM1NDMKK2YgODY5MC8xMTcwNS8zNTI5IDg2ODAvMTE3MTAvMzUyOSA4OTQ4LzExNzEwLzM1MjkKK2YgODk0OC8xMTcxMC8zNTI5IDg5NTgvMTE3MDUvMzUyOSA4NjkwLzExNzA1LzM1MjkKK2YgODY5Ni8xMTcwNy8zNTQ0IDg2NzgvMTE3MTMvMzU0NCA4OTQ2LzExOTA3LzM1NDQKK2YgODk0Ni8xMTkwNy8zNTMzIDg5NjQvMTE3MDcvMzUzMyA4Njk2LzExNzA3LzM1MzMKK2YgODY4OC8xMTcxMi8zNTQ1IDg2OTcvMTE3MDYvMzU0NSA4OTY1LzExNzA2LzM1NDUKK2YgODk2NS8xMTcwNi8zNTA5IDg5NTYvMTE3MTIvMzUwOSA4Njg4LzExNzEyLzM1MDkKK2YgODY5Mi8xMTcwMy8zNDM0IDg2NjEvMTE2NzQvMzQzNCA4OTMzLzExODk3LzM0MzQKK2YgODkzMy8xMTg5Ny8zNDM0IDg5NjAvMTE5MTMvMzQzNCA4NjkyLzExNzAzLzM0MzQKK2YgODcwMS8xMTcxNS8zMzYxIDg2OTMvMTE3MDIvMzM2MSA4OTYxLzExOTE0LzMzNjEKK2YgODk2MS8xMTkxNC8zNDM0IDg5NjYvMTE5MTcvMzQzNCA4NzAxLzExNzE1LzM0MzQKK2YgODY5NC8xMTcwOS8zMzY0IDg3MDIvMTE3MjAvMzM2NCA4OTY3LzExOTE4LzMzNjQKK2YgODk2Ny8xMTkxOC8zNDE0IDg5NjIvMTE5MTYvMzQxNCA4Njk0LzExNzA5LzM0MTQKK2YgODY2Mi8xMTY4MS8zMzkwIDg2OTUvMTE3MDgvMzM5MCA4OTYzLzExOTE1LzMzOTAKK2YgODk2My8xMTkxNS8zMzY0IDg5MzQvMTE5MDAvMzM2NCA4NjYyLzExNjgxLzMzNjQKK2YgODY3OS8xMTY5OS8zNDU4IDg2NzYvMTE2OTEvMzQ1OCA4OTQ0LzExOTA2LzM0NTgKK2YgODk0NC8xMTkwNi8zMzY1IDg5NDcvMTE5MTAvMzM2NSA4Njc5LzExNjk5LzMzNjUKK2YgODY3Ny8xMTY5NS8zNDU5IDg2ODYvMTE3MDAvMzQ1OSA4OTU0LzExOTExLzM0NTkKK2YgODk1NC8xMTkxMS8zNDU5IDg5NDUvMTE2OTUvMzQ1OSA4Njc3LzExNjk1LzM0NTkKK2YgODcwMi8xMTcyMC8zNTM2IDg3MDkvMTE3NTgvMzUzNiA4OTY4LzExOTE5LzM1MzYKK2YgODk2OC8xMTkxOS8zNTQ2IDg5NjcvMTE5MTgvMzU0NiA4NzAyLzExNzIwLzM1NDYKK2YgODcxMy8xMTczNy8zNTQ3IDg3MDEvMTE3MTUvMzU0NyA4OTY2LzExOTE3LzM1NDcKK2YgODk2Ni8xMTkxNy8zNTQ3IDg5NjkvMTE5MjAvMzU0NyA4NzEzLzExNzM3LzM1NDcKK2YgODcwOS8xMTc1OC8zNTQ4IDg2ODcvMTE3NTcvMzU0OCA4OTU1LzExNzU3LzM1NDgKK2YgODk1NS8xMTc1Ny8zNTQ3IDg5NjgvMTE5MTkvMzU0NyA4NzA5LzExNzU4LzM1NDcKK2YgODY4MS8xMTc2NS8zNTM2IDg3MTMvMTE3MzcvMzUzNiA4OTY5LzExOTIwLzM1MzYKK2YgODk2OS8xMTkyMC8zNTM2IDg5NDkvMTE3NjUvMzUzNiA4NjgxLzExNzY1LzM1MzYKK2YgODcxNC8xMTc1My8zNDU4IDg2ODIvMTE2OTgvMzQ1OCA4OTUwLzExOTA5LzM0NTgKK2YgODk1MC8xMTkwOS8zMzQ0IDg5NzAvMTE5MjEvMzM0NCA4NzE0LzExNzUzLzMzNDQKK2YgODcxNS8xMTc1NC8zNTQ4IDg3MTQvMTE3NTMvMzU0OCA4OTcwLzExOTIxLzM1NDgKK2YgODk3MC8xMTkyMS8zNTQ3IDg5NzEvMTE5MjIvMzU0NyA4NzE1LzExNzU0LzM1NDcKK2YgODcxNi8xMTc2MC8zNTQ5IDg3MTUvMTE3NTQvMzU0OSA4OTcxLzExOTIyLzM1NDkKK2YgODk3MS8xMTkyMi8zNTUwIDg5NzIvMTE3NjAvMzU1MCA4NzE2LzExNzYwLzM1NTAKK2YgODY4NS8xMTcwMS8zMzY2IDg3MTYvMTE3NjAvMzM2NiA4OTcyLzExNzYwLzMzNjYKK2YgODk3Mi8xMTc2MC8zNTIyIDg5NTMvMTE3MDEvMzUyMiA4Njg1LzExNzAxLzM1MjIKK2YgODQ1MS8xMTc3MC8zNTUxIDg3MTcvMTE5MjMvMzU1MSA4OTczLzExOTI0LzM1NTEKK2YgODk3My8xMTkyNC8zNTUyIDg3NTkvMTE3ODEvMzU1MiA4NDUxLzExNzcwLzM1NTIKK2YgODcxNy8xMTkyMy8zNTUzIDg0NTIvMTE3NjkvMzU1MyA4NzYwLzExNzY5LzM1NTMKK2YgODc2MC8xMTc2OS8zNTU0IDg5NzMvMTE5MjQvMzU1NCA4NzE3LzExOTIzLzM1NTQKK2YgODQ0NC8xMTQ2NS8zMzk1IDg3MTgvMTE3NDMvMzM5NSA4OTc0LzExNzQzLzMzOTUKK2YgODk3NC8xMTc0My8zNDU4IDg3NTYvMTE0NjUvMzQ1OCA4NDQ0LzExNDY1LzM0NTgKK2YgODcxOS8xMTc0Ni8zNDc2IDg3MjAvMTE3MzkvMzQ3NiA4OTc2LzExOTI1LzM0NzYKK2YgODk3Ni8xMTkyNS8zNTU1IDg5NzUvMTE5MjYvMzU1NSA4NzE5LzExNzQ2LzM1NTUKK2YgODcyMS8xMTc0Mi8zNTU2IDg3MjIvMTE3NTEvMzU1NiA4OTc4LzExOTI3LzM1NTYKK2YgODk3OC8xMTkyNy8zNTU3IDg5NzcvMTE5MjgvMzU1NyA4NzIxLzExNzQyLzM1NTcKK2YgODcyMC8xMTczOS8zNTU4IDg3MjMvMTE3MzgvMzU1OCA4OTc5LzExNzM4LzM1NTgKK2YgODk3OS8xMTczOC8zNTU5IDg5NzYvMTE5MjUvMzU1OSA4NzIwLzExNzM5LzM1NTkKK2YgODcxOC8xMTc0My8zNTYwIDg3MjEvMTE3NDIvMzU2MCA4OTc3LzExOTI4LzM1NjAKK2YgODk3Ny8xMTkyOC8zNTYxIDg5NzQvMTE3NDMvMzU2MSA4NzE4LzExNzQzLzM1NjEKK2YgODcyMy8xMTczOC8zMzM1IDg0NDIvMTE0NjMvMzMzNSA4NzU0LzExNDYzLzMzMzUKK2YgODc1NC8xMTQ2My8zMzQ2IDg5NzkvMTE3MzgvMzM0NiA4NzIzLzExNzM4LzMzNDYKK2YgODQzNi8xMTQ1NS8zMzYyIDg3MTkvMTE3NDYvMzM2MiA4OTc1LzExOTI2LzMzNjIKK2YgODk3NS8xMTkyNi8zMzg4IDg3NDgvMTE3NzEvMzM4OCA4NDM2LzExNDU1LzMzODgKK2YgODcyMi8xMTc1MS8zMzY0IDg0MzkvMTE0NjAvMzM2NCA4NzUxLzExNzc2LzMzNjQKK2YgODc1MS8xMTc3Ni8zMzkwIDg5NzgvMTE5MjcvMzM5MCA4NzIyLzExNzUxLzMzOTAKK2YgODcyNy8xMTc2Ni8zNTYyIDg3MjYvMTE3MzYvMzU2MiA4OTgwLzExOTI5LzM1NjIKK2YgODk4MC8xMTkyOS8zNTYyIDg5ODEvMTE5MzAvMzU2MiA4NzI3LzExNzY2LzM1NjIKK2YgODcyOC8xMTc2Ny8zNTYzIDg3MjcvMTE3NjYvMzU2MyA4OTgxLzExOTMwLzM1NjMKK2YgODk4MS8xMTkzMC8zNTY0IDg5ODIvMTE5MzEvMzU2NCA4NzI4LzExNzY3LzM1NjQKK2YgODcyOS8xMTc2Mi8zNTY1IDg3MjgvMTE3NjcvMzU2NSA4OTgyLzExOTMxLzM1NjUKK2YgODk4Mi8xMTkzMS8zNTQ5IDg5ODMvMTE5MzIvMzU0OSA4NzI5LzExNzYyLzM1NDkKK2YgODczMC8xMTc1NS8zMzQ1IDg3MjkvMTE3NjIvMzM0NSA4OTgzLzExOTMyLzMzNDUKK2YgODk4My8xMTkzMi8zMzc2IDg5ODQvMTE5MzMvMzM3NiA4NzMwLzExNzU1LzMzNzYKK2YgODczMS8xMTc1Mi8zNTY2IDg3MzAvMTE3NTUvMzU2NiA4OTg0LzExOTMzLzM1NjYKK2YgODk4NC8xMTkzMy8zNTI5IDg5ODUvMTE3NTIvMzUyOSA4NzMxLzExNzUyLzM1MjkKK2YgODcyNi8xMTczNi8zNTI1IDg3MzEvMTE3NTIvMzUyNSA4OTg1LzExNzUyLzM1MjUKK2YgODk4NS8xMTc1Mi8zNTQwIDg5ODAvMTE5MjkvMzU0MCA4NzI2LzExNzM2LzM1NDAKK2YgODczMy8xMTc2MS8zMzk1IDg3MzIvMTE3NTkvMzM5NSA4OTg2LzExOTM0LzMzOTUKK2YgODk4Ni8xMTkzNC8zMjM4IDg5ODcvMTE3NjEvMzIzOCA4NzMzLzExNzYxLzMyMzgKK2YgODczNC8xMTc2OC8zNTY3IDg3MzMvMTE3NjEvMzU2NyA4OTg3LzExNzYxLzM1NjcKK2YgODk4Ny8xMTc2MS8zNTY4IDg5ODgvMTE5MzUvMzU2OCA4NzM0LzExNzY4LzM1NjgKK2YgODczNS8xMTcyNS8zNTY1IDg3MzQvMTE3NjgvMzU2NSA4OTg4LzExOTM1LzM1NjUKK2YgODk4OC8xMTkzNS8zNTY5IDg5ODkvMTE3MjUvMzU2OSA4NzM1LzExNzI1LzM1NjkKK2YgODczNi8xMTcyMi8zMzM0IDg3MzUvMTE3MjUvMzMzNCA4OTg5LzExNzI1LzMzMzQKK2YgODk4OS8xMTcyNS8zNDU5IDg5OTAvMTE5MzYvMzQ1OSA4NzM2LzExNzIyLzM0NTkKK2YgODczNy8xMTc1Ni8zNTcwIDg3MzYvMTE3MjIvMzU3MCA4OTkwLzExOTM2LzM1NzAKK2YgODk5MC8xMTkzNi8zNTMwIDg5OTEvMTE3NTYvMzUzMCA4NzM3LzExNzU2LzM1MzAKK2YgODczMi8xMTc1OS8zNTQ1IDg3MzcvMTE3NTYvMzU0NSA4OTkxLzExNzU2LzM1NDUKK2YgODk5MS8xMTc1Ni8zNTMyIDg5ODYvMTE5MzQvMzUzMiA4NzMyLzExNzU5LzM1MzIKK2YgODQ1Mi8xMTc2OS82OTcgODcxNy8xMTkyMy82OTcgOTUzMC8xMTkzNy82OTcKK2YgOTUzMC8xMTkzNy82OTcgOTMwMS8xMTkzOC82OTcgODQ1Mi8xMTc2OS82OTcKK2YgODcxOS8xMTc0Ni82OTcgOTI4MC8xMTc0OS82OTcgOTI3Ny8xMTc0MC82OTcKK2YgOTI3Ny8xMTc0MC82OTcgODcyMC8xMTczOS82OTcgODcxOS8xMTc0Ni82OTcKK2YgODcyNS8xMTc1MC82OTcgODcyMi8xMTc1MS82OTcgOTI4My8xMTkzOS82OTcKK2YgOTI4My8xMTkzOS82OTcgOTI4Mi8xMTk0MC82OTcgODcyNS8xMTc1MC82OTcKK2YgODQ1MS8xMTc3MC82OTcgODcyMy8xMTczOC82OTcgOTI3Ni8xMTc0MS82OTcKK2YgOTI3Ni8xMTc0MS82OTcgOTMwMi8xMTk0MS82OTcgODQ1MS8xMTc3MC82OTcKK2YgODk5My8xMTk0Mi82OTcgODk5Mi8xMTk0My82OTcgODk5NS8xMTk0NC82OTcKK2YgODk5NS8xMTk0NC82OTcgODk5NC8xMTk0NS82OTcgODk5My8xMTk0Mi82OTcKK2YgODk5Ny8xMTk0Ni82OTcgODk5Ni8xMTk0Ny82OTcgODk5OS8xMTk0OC82OTcKK2YgODk5OS8xMTk0OC82OTcgODk5OC8xMTk0OS82OTcgODk5Ny8xMTk0Ni82OTcKK2YgOTAwMS8xMTk1MC82OTcgOTAwMC8xMTk1MS82OTcgODk5NS8xMTk0NC82OTcKK2YgODk5NS8xMTk0NC82OTcgODk5Mi8xMTk0My82OTcgOTAwMS8xMTk1MC82OTcKK2YgODk5Ny8xMTk0Ni82OTcgODk5OC8xMTk0OS82OTcgOTAwMy8xMTk1Mi82OTcKK2YgOTAwMy8xMTk1Mi82OTcgOTAwMi8xMTk1My82OTcgODk5Ny8xMTk0Ni82OTcKK2YgODk5NC8xMTk0NS82OTcgOTAwNS8xMTk1NC82OTcgOTAwNC8xMTk1NS82OTcKK2YgOTAwNC8xMTk1NS82OTcgODk5My8xMTk0Mi82OTcgODk5NC8xMTk0NS82OTcKK2YgODk5Ni8xMTk0Ny82OTcgOTAwNy8xMTk1Ni82OTcgOTAwNi8xMTk1Ny82OTcKK2YgOTAwNi8xMTk1Ny82OTcgODk5OS8xMTk0OC82OTcgODk5Ni8xMTk0Ny82OTcKK2YgOTAwOC8xMTk1OC82OTcgOTAxMS8xMTk1OS82OTcgOTAxMC8xMTk2MC82OTcKK2YgOTAxMC8xMTk2MC82OTcgOTAwOS8xMTk2MS82OTcgOTAwOC8xMTk1OC82OTcKK2YgOTAwOC8xMTk1OC82OTcgOTAxMi8xMTk2Mi82OTcgOTAxMy8xMTk2My82OTcKK2YgOTAxMy8xMTk2My82OTcgOTAxMS8xMTk1OS82OTcgOTAwOC8xMTk1OC82OTcKK2YgOTAxNS8xMTk2NC82OTcgOTAxNC8xMTk2NS82OTcgOTAxNy8xMTk2Ni82OTcKK2YgOTAxNy8xMTk2Ni82OTcgOTAxNi8xMTk2Ny82OTcgOTAxNS8xMTk2NC82OTcKK2YgOTAxOS8xMTk2OC82OTcgOTAxOC8xMTk2OS82OTcgOTAyMS8xMTk3MC82OTcKK2YgOTAyMS8xMTk3MC82OTcgOTAyMC8xMTk3MS82OTcgOTAxOS8xMTk2OC82OTcKK2YgOTAyMy8xMTk3Mi82OTcgOTAyMi8xMTk3My82OTcgOTAxNy8xMTk2Ni82OTcKK2YgOTAxNy8xMTk2Ni82OTcgOTAxNC8xMTk2NS82OTcgOTAyMy8xMTk3Mi82OTcKK2YgOTAxOS8xMTk2OC82OTcgOTAyMC8xMTk3MS82OTcgOTAyNS8xMTk3NC82OTcKK2YgOTAyNS8xMTk3NC82OTcgOTAyNC8xMTk3NS82OTcgOTAxOS8xMTk2OC82OTcKK2YgOTAxNi8xMTk2Ny82OTcgODk5My8xMTk0Mi82OTcgOTAwNC8xMTk1NS82OTcKK2YgOTAwNC8xMTk1NS82OTcgOTAyNi8xMTk3Ni82OTcgOTAxNi8xMTk2Ny82OTcKK2YgOTAxNi8xMTk2Ny82OTcgOTAyNi8xMTk3Ni82OTcgOTAyNy8xMTk3Ny82OTcKK2YgOTAyNy8xMTk3Ny82OTcgOTAxNS8xMTk2NC82OTcgOTAxNi8xMTk2Ny82OTcKK2YgODk5Ni8xMTk0Ny82OTcgOTAyMS8xMTk3MC82OTcgOTAyOC8xMTk3OC82OTcKK2YgOTAyOC8xMTk3OC82OTcgOTAwNy8xMTk1Ni82OTcgODk5Ni8xMTk0Ny82OTcKK2YgOTAxOC8xMTk2OS82OTcgOTAyOS8xMTk3OS82OTcgOTAyOC8xMTk3OC82OTcKK2YgOTAyOC8xMTk3OC82OTcgOTAyMS8xMTk3MC82OTcgOTAxOC8xMTk2OS82OTcKK2YgOTAzMC8xMTk4MC82OTcgOTAzMy8xMTk4MS82OTcgOTAzMi8xMTk4Mi82OTcKK2YgOTAzMi8xMTk4Mi82OTcgOTAzMS8xMTk4My82OTcgOTAzMC8xMTk4MC82OTcKK2YgOTAzMC8xMTk4MC82OTcgOTAzNC8xMTk4NC82OTcgOTAzNS8xMTk4NS82OTcKK2YgOTAzNS8xMTk4NS82OTcgOTAzMy8xMTk4MS82OTcgOTAzMC8xMTk4MC82OTcKK2YgOTAzNy8xMTk4Ni82OTcgOTAzNi8xMTk4Ny82OTcgOTAzOS8xMTk4OC82OTcKK2YgOTAzOS8xMTk4OC82OTcgOTAzOC8xMTk4OS82OTcgOTAzNy8xMTk4Ni82OTcKK2YgOTA0MS8xMTk5MC82OTcgOTA0MC8xMTk5MS82OTcgOTA0My8xMTk5Mi82OTcKK2YgOTA0My8xMTk5Mi82OTcgOTA0Mi8xMTk5My82OTcgOTA0MS8xMTk5MC82OTcKK2YgOTA0NS8xMTk5NC82OTcgOTA0NC8xMTk5NS82OTcgOTAzOS8xMTk4OC82OTcKK2YgOTAzOS8xMTk4OC82OTcgOTAzNi8xMTk4Ny82OTcgOTA0NS8xMTk5NC82OTcKK2YgOTA0MS8xMTk5MC82OTcgOTA0Mi8xMTk5My82OTcgOTA0Ny8xMTk5Ni82OTcKK2YgOTA0Ny8xMTk5Ni82OTcgOTA0Ni8xMTk5Ny82OTcgOTA0MS8xMTk5MC82OTcKK2YgOTAzOC8xMTk4OS82OTcgOTAxNS8xMTk2NC82OTcgOTAyNy8xMTk3Ny82OTcKK2YgOTAyNy8xMTk3Ny82OTcgOTA0OC8xMTk5OC82OTcgOTAzOC8xMTk4OS82OTcKK2YgOTAzOC8xMTk4OS82OTcgOTA0OC8xMTk5OC82OTcgOTA0OS8xMTk5OS82OTcKK2YgOTA0OS8xMTk5OS82OTcgOTAzNy8xMTk4Ni82OTcgOTAzOC8xMTk4OS82OTcKK2YgOTAxOC8xMTk2OS82OTcgOTA0My8xMTk5Mi82OTcgOTA1MC8xMjAwMC82OTcKK2YgOTA1MC8xMjAwMC82OTcgOTAyOS8xMTk3OS82OTcgOTAxOC8xMTk2OS82OTcKK2YgOTA0MC8xMTk5MS82OTcgOTA1MS8xMjAwMS82OTcgOTA1MC8xMjAwMC82OTcKK2YgOTA1MC8xMjAwMC82OTcgOTA0My8xMTk5Mi82OTcgOTA0MC8xMTk5MS82OTcKK2YgOTA1Mi8xMjAwMi82OTcgOTA1NS8xMjAwMy82OTcgOTA1NC8xMjAwNC82OTcKK2YgOTA1NC8xMjAwNC82OTcgOTA1My8xMjAwNS82OTcgOTA1Mi8xMjAwMi82OTcKK2YgOTA1Mi8xMjAwMi82OTcgOTA1Ni8xMjAwNi82OTcgOTA1Ny8xMjAwNy82OTcKK2YgOTA1Ny8xMjAwNy82OTcgOTA1NS8xMjAwMy82OTcgOTA1Mi8xMjAwMi82OTcKK2YgOTA1OS8xMjAwOC82OTcgOTA1OC8xMjAwOS82OTcgOTA2MS8xMjAxMC82OTcKK2YgOTA2MS8xMjAxMC82OTcgOTA2MC8xMjAxMS82OTcgOTA1OS8xMjAwOC82OTcKK2YgOTA1OS8xMjAwOC82OTcgOTA2MC8xMjAxMS82OTcgOTA2My8xMjAxMi82OTcKK2YgOTA2My8xMjAxMi82OTcgOTA2Mi8xMjAxMy82OTcgOTA1OS8xMjAwOC82OTcKK2YgOTA2NS8xMjAxNC82OTcgOTA2NC8xMjAxNS82OTcgOTA2Ny8xMjAxNi82OTcKK2YgOTA2Ny8xMjAxNi82OTcgOTA2Ni8xMjAxNy82OTcgOTA2NS8xMjAxNC82OTcKK2YgOTA2OS8xMjAxOC82OTcgOTA2OC8xMjAxOS82OTcgOTA3MS8xMjAyMC82OTcKK2YgOTA3MS8xMjAyMC82OTcgOTA3MC8xMjAyMS82OTcgOTA2OS8xMjAxOC82OTcKK2YgOTA3My8xMjAyMi82OTcgOTA3Mi8xMjAyMy82OTcgOTA2Ny8xMjAxNi82OTcKK2YgOTA2Ny8xMjAxNi82OTcgOTA2NC8xMjAxNS82OTcgOTA3My8xMjAyMi82OTcKK2YgOTA2OS8xMjAxOC82OTcgOTA3MC8xMjAyMS82OTcgOTA3NS8xMjAyNC82OTcKK2YgOTA3NS8xMjAyNC82OTcgOTA3NC8xMjAyNS82OTcgOTA2OS8xMjAxOC82OTcKK2YgOTA2Ni8xMjAxNy82OTcgOTAzNy8xMTk4Ni82OTcgOTA0OS8xMTk5OS82OTcKK2YgOTA0OS8xMTk5OS82OTcgOTA3Ni8xMjAyNi82OTcgOTA2Ni8xMjAxNy82OTcKK2YgOTA3Ny8xMjAyNy82OTcgOTA2NS8xMjAxNC82OTcgOTA3OS8xMjAyOC82OTcKK2YgOTA3OS8xMjAyOC82OTcgOTA3OC8xMjAyOS82OTcgOTA3Ny8xMjAyNy82OTcKK2YgOTA2Ni8xMjAxNy82OTcgOTA3Ni8xMjAyNi82OTcgOTA3OS8xMjAyOC82OTcKK2YgOTA3OS8xMjAyOC82OTcgOTA2NS8xMjAxNC82OTcgOTA2Ni8xMjAxNy82OTcKK2YgOTA2OC8xMjAxOS82OTcgOTA4Mi8xMjAzMC82OTcgOTA4MS8xMjAzMS82OTcKK2YgOTA4MS8xMjAzMS82OTcgOTA4MC8xMjAzMi82OTcgOTA2OC8xMjAxOS82OTcKK2YgOTA0MC8xMTk5MS82OTcgOTA3MS8xMjAyMC82OTcgOTA4My8xMjAzMy82OTcKK2YgOTA4My8xMjAzMy82OTcgOTA1MS8xMjAwMS82OTcgOTA0MC8xMTk5MS82OTcKK2YgOTA2OC8xMjAxOS82OTcgOTA4MC8xMjAzMi82OTcgOTA4My8xMjAzMy82OTcKK2YgOTA4My8xMjAzMy82OTcgOTA3MS8xMjAyMC82OTcgOTA2OC8xMjAxOS82OTcKK2YgOTA4NS8xMjAzNC82OTcgOTA4NC8xMjAzNS82OTcgOTA4Ni8xMjAzNi82OTcKK2YgOTA4Ni8xMjAzNi82OTcgOTA3Ny8xMjAyNy82OTcgOTA4NS8xMjAzNC82OTcKK2YgOTA4OC8xMjAzNy82OTcgOTA4Ny8xMjAzOC82OTcgOTA4Mi8xMjAzMC82OTcKK2YgOTA4Mi8xMjAzMC82OTcgOTA4OS8xMjAzOS82OTcgOTA4OC8xMjAzNy82OTcKK2YgOTA5MS8xMjA0MC82OTcgOTA5MC8xMjA0MS82OTcgOTA4Ni8xMjAzNi82OTcKK2YgOTA4Ni8xMjAzNi82OTcgOTA4NC8xMjAzNS82OTcgOTA5MS8xMjA0MC82OTcKK2YgOTA4OC8xMjAzNy82OTcgOTA4OS8xMjAzOS82OTcgOTA5My8xMjA0Mi82OTcKK2YgOTA5My8xMjA0Mi82OTcgOTA5Mi8xMjA0My82OTcgOTA4OC8xMjAzNy82OTcKK2YgOTA3Ny8xMjAyNy82OTcgOTA3OC8xMjAyOS82OTcgOTA5NC8xMjA0NC82OTcKK2YgOTA5NC8xMjA0NC82OTcgOTA4NS8xMjAzNC82OTcgOTA3Ny8xMjAyNy82OTcKK2YgOTA4Ny8xMjAzOC82OTcgOTA5NS8xMjA0NS82OTcgOTA4MS8xMjAzMS82OTcKK2YgOTA4MS8xMjAzMS82OTcgOTA4Mi8xMjAzMC82OTcgOTA4Ny8xMjAzOC82OTcKK2YgOTA5Ni8xMjA0Ni82OTcgOTA5OS8xMjA0Ny82OTcgOTA5OC8xMjA0OC82OTcKK2YgOTA5OC8xMjA0OC82OTcgOTA5Ny8xMjA0OS82OTcgOTA5Ni8xMjA0Ni82OTcKK2YgOTA5Ni8xMjA0Ni82OTcgOTEwMC8xMjA1MC82OTcgOTEwMS8xMjA1MS82OTcKK2YgOTEwMS8xMjA1MS82OTcgOTA5OS8xMjA0Ny82OTcgOTA5Ni8xMjA0Ni82OTcKK2YgOTEwMy8xMjA1Mi82OTcgOTEwMi8xMjA1My82OTcgOTEwNS8xMjA1NC82OTcKK2YgOTEwNS8xMjA1NC82OTcgOTEwNC8xMjA1NS82OTcgOTEwMy8xMjA1Mi82OTcKK2YgOTEwNy8xMjA1Ni82OTcgOTEwNi8xMjA1Ny82OTcgOTEwOS8xMjA1OC82OTcKK2YgOTEwOS8xMjA1OC82OTcgOTEwOC8xMjA1OS82OTcgOTEwNy8xMjA1Ni82OTcKK2YgOTExMS8xMjA2MC82OTcgOTExMC8xMjA2MS82OTcgOTEwNS8xMjA1NC82OTcKK2YgOTEwNS8xMjA1NC82OTcgOTEwMi8xMjA1My82OTcgOTExMS8xMjA2MC82OTcKK2YgOTEwNy8xMjA1Ni82OTcgOTEwOC8xMjA1OS82OTcgOTExMy8xMjA2Mi82OTcKK2YgOTExMy8xMjA2Mi82OTcgOTExMi8xMjA2My82OTcgOTEwNy8xMjA1Ni82OTcKK2YgOTEwNC8xMjA1NS82OTcgOTA4NS8xMjAzNC82OTcgOTA5NC8xMjA0NC82OTcKK2YgOTA5NC8xMjA0NC82OTcgOTExNC8xMjA2NC82OTcgOTEwNC8xMjA1NS82OTcKK2YgOTEwNC8xMjA1NS82OTcgOTExNC8xMjA2NC82OTcgOTExNS8xMjA2NS82OTcKK2YgOTExNS8xMjA2NS82OTcgOTEwMy8xMjA1Mi82OTcgOTEwNC8xMjA1NS82OTcKK2YgOTA4Ny8xMjAzOC82OTcgOTEwOS8xMjA1OC82OTcgOTExNi8xMjA2Ni82OTcKK2YgOTExNi8xMjA2Ni82OTcgOTA5NS8xMjA0NS82OTcgOTA4Ny8xMjAzOC82OTcKK2YgOTEwNi8xMjA1Ny82OTcgOTExNy8xMjA2Ny82OTcgOTExNi8xMjA2Ni82OTcKK2YgOTExNi8xMjA2Ni82OTcgOTEwOS8xMjA1OC82OTcgOTEwNi8xMjA1Ny82OTcKK2YgOTExOC8xMjA2OC82OTcgOTEyMS8xMjA2OS82OTcgOTEyMC8xMjA3MC82OTcKK2YgOTEyMC8xMjA3MC82OTcgOTExOS8xMjA3MS82OTcgOTExOC8xMjA2OC82OTcKK2YgOTExOC8xMjA2OC82OTcgOTEyMi8xMjA3Mi82OTcgOTEyMy8xMjA3My82OTcKK2YgOTEyMy8xMjA3My82OTcgOTEyMS8xMjA2OS82OTcgOTExOC8xMjA2OC82OTcKK2YgOTEyNS8xMjA3NC82OTcgOTEyNC8xMjA3NS82OTcgOTEyNy8xMjA3Ni82OTcKK2YgOTEyNy8xMjA3Ni82OTcgOTEyNi8xMjA3Ny82OTcgOTEyNS8xMjA3NC82OTcKK2YgOTEyOS8xMjA3OC82OTcgOTEyOC8xMjA3OS82OTcgOTEzMS8xMjA4MC82OTcKK2YgOTEzMS8xMjA4MC82OTcgOTEzMC8xMjA4MS82OTcgOTEyOS8xMjA3OC82OTcKK2YgOTEzMy8xMjA4Mi82OTcgOTEzMi8xMjA4My82OTcgOTEyNy8xMjA3Ni82OTcKK2YgOTEyNy8xMjA3Ni82OTcgOTEyNC8xMjA3NS82OTcgOTEzMy8xMjA4Mi82OTcKK2YgOTEyOS8xMjA3OC82OTcgOTEzMC8xMjA4MS82OTcgOTEzNS8xMjA4NC82OTcKK2YgOTEzNS8xMjA4NC82OTcgOTEzNC8xMjA4NS82OTcgOTEyOS8xMjA3OC82OTcKK2YgOTEyNi8xMjA3Ny82OTcgOTEwMy8xMjA1Mi82OTcgOTExNS8xMjA2NS82OTcKK2YgOTExNS8xMjA2NS82OTcgOTEzNi8xMjA4Ni82OTcgOTEyNi8xMjA3Ny82OTcKK2YgOTEyNi8xMjA3Ny82OTcgOTEzNi8xMjA4Ni82OTcgOTEzNy8xMjA4Ny82OTcKK2YgOTEzNy8xMjA4Ny82OTcgOTEyNS8xMjA3NC82OTcgOTEyNi8xMjA3Ny82OTcKK2YgOTEwNi8xMjA1Ny82OTcgOTEzMS8xMjA4MC82OTcgOTEzOC8xMjA4OC82OTcKK2YgOTEzOC8xMjA4OC82OTcgOTExNy8xMjA2Ny82OTcgOTEwNi8xMjA1Ny82OTcKK2YgOTEyOC8xMjA3OS82OTcgOTEzOS8xMjA4OS82OTcgOTEzOC8xMjA4OC82OTcKK2YgOTEzOC8xMjA4OC82OTcgOTEzMS8xMjA4MC82OTcgOTEyOC8xMjA3OS82OTcKK2YgOTE0MC8xMjA5MC82OTcgOTE0My8xMjA5MS82OTcgOTE0Mi8xMjA5Mi82OTcKK2YgOTE0Mi8xMjA5Mi82OTcgOTE0MS8xMjA5My82OTcgOTE0MC8xMjA5MC82OTcKK2YgOTE0MC8xMjA5MC82OTcgOTE0NC8xMjA5NC82OTcgOTE0NS8xMjA5NS82OTcKK2YgOTE0NS8xMjA5NS82OTcgOTE0My8xMjA5MS82OTcgOTE0MC8xMjA5MC82OTcKK2YgOTE0Ny8xMjA5Ni82OTcgOTE0Ni8xMjA5Ny82OTcgOTE0OS8xMjA5OC82OTcKK2YgOTE0OS8xMjA5OC82OTcgOTE0OC8xMjA5OS82OTcgOTE0Ny8xMjA5Ni82OTcKK2YgOTE1MS8xMjEwMC82OTcgOTE1MC8xMjEwMS82OTcgOTE1My8xMjEwMi82OTcKK2YgOTE1My8xMjEwMi82OTcgOTE1Mi8xMjEwMy82OTcgOTE1MS8xMjEwMC82OTcKK2YgOTE1NS8xMjEwNC82OTcgOTE1NC8xMjEwNS82OTcgOTE0OS8xMjA5OC82OTcKK2YgOTE0OS8xMjA5OC82OTcgOTE0Ni8xMjA5Ny82OTcgOTE1NS8xMjEwNC82OTcKK2YgOTE1MS8xMjEwMC82OTcgOTE1Mi8xMjEwMy82OTcgOTE1Ny8xMjEwNi82OTcKK2YgOTE1Ny8xMjEwNi82OTcgOTE1Ni8xMjEwNy82OTcgOTE1MS8xMjEwMC82OTcKK2YgOTE0OC8xMjA5OS82OTcgOTEyNS8xMjA3NC82OTcgOTEzNy8xMjA4Ny82OTcKK2YgOTEzNy8xMjA4Ny82OTcgOTE1OC8xMjEwOC82OTcgOTE0OC8xMjA5OS82OTcKK2YgOTE0OC8xMjA5OS82OTcgOTE1OC8xMjEwOC82OTcgOTE1OS8xMjEwOS82OTcKK2YgOTE1OS8xMjEwOS82OTcgOTE0Ny8xMjA5Ni82OTcgOTE0OC8xMjA5OS82OTcKK2YgOTEyOC8xMjA3OS82OTcgOTE1My8xMjEwMi82OTcgOTE2MC8xMjExMC82OTcKK2YgOTE2MC8xMjExMC82OTcgOTEzOS8xMjA4OS82OTcgOTEyOC8xMjA3OS82OTcKK2YgOTE1MC8xMjEwMS82OTcgOTE2MS8xMjExMS82OTcgOTE2MC8xMjExMC82OTcKK2YgOTE2MC8xMjExMC82OTcgOTE1My8xMjEwMi82OTcgOTE1MC8xMjEwMS82OTcKK2YgOTE2Mi8xMjExMi82OTcgOTE2NS8xMjExMy82OTcgOTE2NC8xMjExNC82OTcKK2YgOTE2NC8xMjExNC82OTcgOTE2My8xMjExNS82OTcgOTE2Mi8xMjExMi82OTcKK2YgOTE2Mi8xMjExMi82OTcgOTE2Ni8xMjExNi82OTcgOTE2Ny8xMjExNy82OTcKK2YgOTE2Ny8xMjExNy82OTcgOTE2NS8xMjExMy82OTcgOTE2Mi8xMjExMi82OTcKK2YgOTE2OS8xMjExOC82OTcgOTE2OC8xMjExOS82OTcgOTE3MS8xMjEyMC82OTcKK2YgOTE3MS8xMjEyMC82OTcgOTE3MC8xMjEyMS82OTcgOTE2OS8xMjExOC82OTcKK2YgOTE3My8xMjEyMi82OTcgOTE3Mi8xMjEyMy82OTcgOTE3NS8xMjEyNC82OTcKK2YgOTE3NS8xMjEyNC82OTcgOTE3NC8xMjEyNS82OTcgOTE3My8xMjEyMi82OTcKK2YgOTE3Ny8xMjEyNi82OTcgOTE3Ni8xMjEyNy82OTcgOTE3MS8xMjEyMC82OTcKK2YgOTE3MS8xMjEyMC82OTcgOTE2OC8xMjExOS82OTcgOTE3Ny8xMjEyNi82OTcKK2YgOTE3My8xMjEyMi82OTcgOTE3NC8xMjEyNS82OTcgOTE3OS8xMjEyOC82OTcKK2YgOTE3OS8xMjEyOC82OTcgOTE3OC8xMjEyOS82OTcgOTE3My8xMjEyMi82OTcKK2YgOTE3MC8xMjEyMS82OTcgOTE0Ny8xMjA5Ni82OTcgOTE1OS8xMjEwOS82OTcKK2YgOTE1OS8xMjEwOS82OTcgOTE4MC8xMjEzMC82OTcgOTE3MC8xMjEyMS82OTcKK2YgOTE3MC8xMjEyMS82OTcgOTE4MC8xMjEzMC82OTcgOTE4MS8xMjEzMS82OTcKK2YgOTE4MS8xMjEzMS82OTcgOTE2OS8xMjExOC82OTcgOTE3MC8xMjEyMS82OTcKK2YgOTE1MC8xMjEwMS82OTcgOTE3NS8xMjEyNC82OTcgOTE4Mi8xMjEzMi82OTcKK2YgOTE4Mi8xMjEzMi82OTcgOTE2MS8xMjExMS82OTcgOTE1MC8xMjEwMS82OTcKK2YgOTE3Mi8xMjEyMy82OTcgOTE4My8xMjEzMy82OTcgOTE4Mi8xMjEzMi82OTcKK2YgOTE4Mi8xMjEzMi82OTcgOTE3NS8xMjEyNC82OTcgOTE3Mi8xMjEyMy82OTcKK2YgOTE4NC8xMjEzNC82OTcgOTE4Ny8xMjEzNS82OTcgOTE4Ni8xMjEzNi82OTcKK2YgOTE4Ni8xMjEzNi82OTcgOTE4NS8xMjEzNy82OTcgOTE4NC8xMjEzNC82OTcKK2YgOTE4NC8xMjEzNC82OTcgOTE4OC8xMjEzOC82OTcgOTE4OS8xMjEzOS82OTcKK2YgOTE4OS8xMjEzOS82OTcgOTE4Ny8xMjEzNS82OTcgOTE4NC8xMjEzNC82OTcKK2YgOTE5MS8xMjE0MC82OTcgOTE5MC8xMjE0MS82OTcgOTE5My8xMjE0Mi82OTcKK2YgOTE5My8xMjE0Mi82OTcgOTE5Mi8xMjE0My82OTcgOTE5MS8xMjE0MC82OTcKK2YgOTE5NS8xMjE0NC82OTcgOTE5NC8xMjE0NS82OTcgOTE5Ny8xMjE0Ni82OTcKK2YgOTE5Ny8xMjE0Ni82OTcgOTE5Ni8xMjE0Ny82OTcgOTE5NS8xMjE0NC82OTcKK2YgOTE5OS8xMjE0OC82OTcgOTE5OC8xMjE0OS82OTcgOTE5My8xMjE0Mi82OTcKK2YgOTE5My8xMjE0Mi82OTcgOTE5MC8xMjE0MS82OTcgOTE5OS8xMjE0OC82OTcKK2YgOTE5NS8xMjE0NC82OTcgOTE5Ni8xMjE0Ny82OTcgOTIwMS8xMjE1MC82OTcKK2YgOTIwMS8xMjE1MC82OTcgOTIwMC8xMjE1MS82OTcgOTE5NS8xMjE0NC82OTcKK2YgOTE5Mi8xMjE0My82OTcgOTE2OS8xMjExOC82OTcgOTE4MS8xMjEzMS82OTcKK2YgOTE4MS8xMjEzMS82OTcgOTIwMi8xMjE1Mi82OTcgOTE5Mi8xMjE0My82OTcKK2YgOTE5Mi8xMjE0My82OTcgOTIwMi8xMjE1Mi82OTcgOTIwMy8xMjE1My82OTcKK2YgOTIwMy8xMjE1My82OTcgOTE5MS8xMjE0MC82OTcgOTE5Mi8xMjE0My82OTcKK2YgOTE3Mi8xMjEyMy82OTcgOTE5Ny8xMjE0Ni82OTcgOTIwNC8xMjE1NC82OTcKK2YgOTIwNC8xMjE1NC82OTcgOTE4My8xMjEzMy82OTcgOTE3Mi8xMjEyMy82OTcKK2YgOTE5NC8xMjE0NS82OTcgOTIwNS8xMjE1NS82OTcgOTIwNC8xMjE1NC82OTcKK2YgOTIwNC8xMjE1NC82OTcgOTE5Ny8xMjE0Ni82OTcgOTE5NC8xMjE0NS82OTcKK2YgOTIwNi8xMjE1Ni82OTcgOTIwOS8xMjE1Ny82OTcgOTIwOC8xMjE1OC82OTcKK2YgOTIwOC8xMjE1OC82OTcgOTIwNy8xMjE1OS82OTcgOTIwNi8xMjE1Ni82OTcKK2YgOTIwNi8xMjE1Ni82OTcgOTIxMC8xMjE2MC82OTcgOTIxMS8xMjE2MS82OTcKK2YgOTIxMS8xMjE2MS82OTcgOTIwOS8xMjE1Ny82OTcgOTIwNi8xMjE1Ni82OTcKK2YgOTIxMy8xMjE2Mi82OTcgOTIxMi8xMjE2My82OTcgOTIxNS8xMjE2NC82OTcKK2YgOTIxNS8xMjE2NC82OTcgOTIxNC8xMjE2NS82OTcgOTIxMy8xMjE2Mi82OTcKK2YgOTIxNy8xMjE2Ni82OTcgOTIxNi8xMjE2Ny82OTcgOTIxOS8xMjE2OC82OTcKK2YgOTIxOS8xMjE2OC82OTcgOTIxOC8xMjE2OS82OTcgOTIxNy8xMjE2Ni82OTcKK2YgOTIyMS8xMjE3MC82OTcgOTIyMC8xMjE3MS82OTcgOTIxNS8xMjE2NC82OTcKK2YgOTIxNS8xMjE2NC82OTcgOTIxMi8xMjE2My82OTcgOTIyMS8xMjE3MC82OTcKK2YgOTIxNy8xMjE2Ni82OTcgOTIxOC8xMjE2OS82OTcgOTIyMy8xMjE3Mi82OTcKK2YgOTIyMy8xMjE3Mi82OTcgOTIyMi8xMjE3My82OTcgOTIxNy8xMjE2Ni82OTcKK2YgOTIxNC8xMjE2NS82OTcgOTE5MS8xMjE0MC82OTcgOTIwMy8xMjE1My82OTcKK2YgOTIwMy8xMjE1My82OTcgOTIyNC8xMjE3NC82OTcgOTIxNC8xMjE2NS82OTcKK2YgOTIxNC8xMjE2NS82OTcgOTIyNC8xMjE3NC82OTcgOTIyNS8xMjE3NS82OTcKK2YgOTIyNS8xMjE3NS82OTcgOTIxMy8xMjE2Mi82OTcgOTIxNC8xMjE2NS82OTcKK2YgOTE5NC8xMjE0NS82OTcgOTIxOS8xMjE2OC82OTcgOTIyNi8xMjE3Ni82OTcKK2YgOTIyNi8xMjE3Ni82OTcgOTIwNS8xMjE1NS82OTcgOTE5NC8xMjE0NS82OTcKK2YgOTIxNi8xMjE2Ny82OTcgOTIyNy8xMjE3Ny82OTcgOTIyNi8xMjE3Ni82OTcKK2YgOTIyNi8xMjE3Ni82OTcgOTIxOS8xMjE2OC82OTcgOTIxNi8xMjE2Ny82OTcKK2YgOTIyOC8xMjE3OC82OTcgOTIzMS8xMjE3OS82OTcgOTIzMC8xMjE4MC82OTcKK2YgOTIzMC8xMjE4MC82OTcgOTIyOS8xMjE4MS82OTcgOTIyOC8xMjE3OC82OTcKK2YgOTIyOC8xMjE3OC82OTcgOTIzMi8xMjE4Mi82OTcgOTIzMy8xMjE4My82OTcKK2YgOTIzMy8xMjE4My82OTcgOTIzMS8xMjE3OS82OTcgOTIyOC8xMjE3OC82OTcKK2YgOTIzNS8xMjE4NC82OTcgOTIzNC8xMjE4NS82OTcgOTIzNy8xMjE4Ni82OTcKK2YgOTIzNy8xMjE4Ni82OTcgOTIzNi8xMjE4Ny82OTcgOTIzNS8xMjE4NC82OTcKK2YgOTIzNS8xMjE4NC82OTcgOTIzNi8xMjE4Ny82OTcgOTIzOS8xMjE4OC82OTcKK2YgOTIzOS8xMjE4OC82OTcgOTIzOC8xMjE4OS82OTcgOTIzNS8xMjE4NC82OTcKK2YgOTI0MS8xMjE5MC82OTcgOTI0MC8xMjE5MS82OTcgOTI0My8xMjE5Mi82OTcKK2YgOTI0My8xMjE5Mi82OTcgOTI0Mi8xMjE5My82OTcgOTI0MS8xMjE5MC82OTcKK2YgOTI0NS8xMjE5NC82OTcgOTI0NC8xMjE5NS82OTcgOTI0Ny8xMjE5Ni82OTcKK2YgOTI0Ny8xMjE5Ni82OTcgOTI0Ni8xMjE5Ny82OTcgOTI0NS8xMjE5NC82OTcKK2YgOTI0OS8xMjE5OC82OTcgOTI0OC8xMjE5OS82OTcgOTI0My8xMjE5Mi82OTcKK2YgOTI0My8xMjE5Mi82OTcgOTI0MC8xMjE5MS82OTcgOTI0OS8xMjE5OC82OTcKK2YgOTI0NS8xMjE5NC82OTcgOTI0Ni8xMjE5Ny82OTcgOTI1MS8xMjIwMC82OTcKK2YgOTI1MS8xMjIwMC82OTcgOTI1MC8xMjIwMS82OTcgOTI0NS8xMjE5NC82OTcKK2YgOTI0Mi8xMjE5My82OTcgOTIxMy8xMjE2Mi82OTcgOTIyNS8xMjE3NS82OTcKK2YgOTIyNS8xMjE3NS82OTcgOTI1Mi8xMjIwMi82OTcgOTI0Mi8xMjE5My82OTcKK2YgOTI1My8xMjIwMy82OTcgOTI0MS8xMjE5MC82OTcgOTI1NS8xMjIwNC82OTcKK2YgOTI1NS8xMjIwNC82OTcgOTI1NC8xMjIwNS82OTcgOTI1My8xMjIwMy82OTcKK2YgOTI0Mi8xMjE5My82OTcgOTI1Mi8xMjIwMi82OTcgOTI1NS8xMjIwNC82OTcKK2YgOTI1NS8xMjIwNC82OTcgOTI0MS8xMjE5MC82OTcgOTI0Mi8xMjE5My82OTcKK2YgOTI0NC8xMjE5NS82OTcgOTI1OC8xMjIwNi82OTcgOTI1Ny8xMjIwNy82OTcKK2YgOTI1Ny8xMjIwNy82OTcgOTI1Ni8xMjIwOC82OTcgOTI0NC8xMjE5NS82OTcKK2YgOTIxNi8xMjE2Ny82OTcgOTI0Ny8xMjE5Ni82OTcgOTI1OS8xMjIwOS82OTcKK2YgOTI1OS8xMjIwOS82OTcgOTIyNy8xMjE3Ny82OTcgOTIxNi8xMjE2Ny82OTcKK2YgOTI0NC8xMjE5NS82OTcgOTI1Ni8xMjIwOC82OTcgOTI1OS8xMjIwOS82OTcKK2YgOTI1OS8xMjIwOS82OTcgOTI0Ny8xMjE5Ni82OTcgOTI0NC8xMjE5NS82OTcKK2YgOTI2Mi8xMjIxMC82OTcgOTI2MS8xMjIxMS82OTcgOTI2MC8xMjIxMi82OTcKK2YgOTI2MC8xMjIxMi82OTcgOTI2My8xMjIxMy82OTcgOTI2Mi8xMjIxMC82OTcKK2YgOTI2NC8xMjIxNC82OTcgOTI1My8xMjIwMy82OTcgOTI1NC8xMjIwNS82OTcKK2YgOTI1NC8xMjIwNS82OTcgOTI2NS8xMjIxNS82OTcgOTI2NC8xMjIxNC82OTcKK2YgOTI2Ni8xMjIxNi82OTcgOTI1Ny8xMjIwNy82OTcgOTI1OC8xMjIwNi82OTcKK2YgOTI1OC8xMjIwNi82OTcgOTI2My8xMjIxMy82OTcgOTI2Ni8xMjIxNi82OTcKK2YgOTI2OC8xMjIxNy82OTcgOTI2Ny8xMjIxOC82OTcgOTI2MC8xMjIxMi82OTcKK2YgOTI2MC8xMjIxMi82OTcgOTI2OS8xMjIxOS82OTcgOTI2OC8xMjIxNy82OTcKK2YgOTI3Mi8xMjIyMC82OTcgOTI3MS8xMjIyMS82OTcgOTI3MC8xMjIyMi82OTcKK2YgOTI3MC8xMjIyMi82OTcgOTI3My8xMjIyMy82OTcgOTI3Mi8xMjIyMC82OTcKK2YgOTI3NS8xMjIyNC82OTcgOTI3NC8xMjIyNS82OTcgOTI1My8xMjIwMy82OTcKK2YgOTI1My8xMjIwMy82OTcgOTI2NC8xMjIxNC82OTcgOTI3NS8xMjIyNC82OTcKK2YgOTI4MC8xMTc0OS82OTcgOTI4MS8xMTc0OC82OTcgOTAwNS8xMTk1NC82OTcKK2YgOTAwNS8xMTk1NC82OTcgODk5NC8xMTk0NS82OTcgOTI4MC8xMTc0OS82OTcKK2YgOTI4Mi8xMTk0MC82OTcgOTI4My8xMTkzOS82OTcgODk5OS8xMTk0OC82OTcKK2YgODk5OS8xMTk0OC82OTcgOTAwNi8xMTk1Ny82OTcgOTI4Mi8xMTk0MC82OTcKK2YgOTI4NC8xMjIyNi82OTcgOTI4Ny8xMjIyNy82OTcgOTI4Ni8xMjIyOC82OTcKK2YgOTI4Ni8xMjIyOC82OTcgOTI4NS8xMjIyOS82OTcgOTI4NC8xMjIyNi82OTcKK2YgOTI4OC8xMjIzMC82OTcgOTI2Mi8xMjIxMC82OTcgOTI5MC8xMjIzMS82OTcKK2YgOTI5MC8xMjIzMS82OTcgOTI4OS8xMjIzMi82OTcgOTI4OC8xMjIzMC82OTcKK2YgOTI4Ni8xMjIyOC82OTcgOTI5Mi8xMjIzMy82OTcgOTI4OC8xMjIzMC82OTcKK2YgOTI4OC8xMjIzMC82OTcgOTI5MS8xMjIzNC82OTcgOTI4Ni8xMjIyOC82OTcKK2YgOTI4OC8xMjIzMC82OTcgOTI4OS8xMjIzMi82OTcgOTI5MS8xMjIzNC82OTcKK2YgOTI5Mi8xMjIzMy82OTcgOTI4Ny8xMjIyNy82OTcgOTI5NC8xMjIzNS82OTcKK2YgOTI5NC8xMjIzNS82OTcgOTI5My8xMjIzNi82OTcgOTI5Mi8xMjIzMy82OTcKK2YgOTI5My8xMjIzNi82OTcgOTI5NC8xMjIzNS82OTcgOTI3MC8xMjIyMi82OTcKK2YgOTI5Ni8xMjIzNy82OTcgOTI5NS8xMjIzOC82OTcgOTI2NC8xMjIxNC82OTcKK2YgOTI2NC8xMjIxNC82OTcgOTI2NS8xMjIxNS82OTcgOTI5Ni8xMjIzNy82OTcKK2YgOTI3NC8xMjIyNS82OTcgOTI3NS8xMjIyNC82OTcgOTI4NC8xMjIyNi82OTcKK2YgOTI4NC8xMjIyNi82OTcgOTI5Ny8xMjIzOS82OTcgOTI3NC8xMjIyNS82OTcKK2YgOTI5NS8xMjIzOC82OTcgOTI5OC8xMjI0MC82OTcgOTI3NS8xMjIyNC82OTcKK2YgOTI3NS8xMjIyNC82OTcgOTI2NC8xMjIxNC82OTcgOTI5NS8xMjIzOC82OTcKK2YgOTI2MC8xMjIxMi82OTcgOTI2Ny8xMjIxOC82OTcgOTI2Ni8xMjIxNi82OTcKK2YgOTI2Ni8xMjIxNi82OTcgOTI2My8xMjIxMy82OTcgOTI2MC8xMjIxMi82OTcKK2YgOTI1OC8xMjIwNi82OTcgOTI5MC8xMjIzMS82OTcgOTI2Mi8xMjIxMC82OTcKK2YgOTI2Mi8xMjIxMC82OTcgOTI2My8xMjIxMy82OTcgOTI1OC8xMjIwNi82OTcKK2YgOTI4NC8xMjIyNi82OTcgOTI4NS8xMjIyOS82OTcgOTI5Ny8xMjIzOS82OTcKK2YgOTI3MC8xMjIyMi82OTcgOTI3MS8xMjIyMS82OTcgOTI2OC8xMjIxNy82OTcKK2YgOTI2OC8xMjIxNy82OTcgOTI2OS8xMjIxOS82OTcgOTI3MC8xMjIyMi82OTcKK2YgOTI5NS8xMjIzOC82OTcgOTI5Ni8xMjIzNy82OTcgOTI3Mi8xMjIyMC82OTcKK2YgOTI3Mi8xMjIyMC82OTcgOTI3My8xMjIyMy82OTcgOTI5NS8xMjIzOC82OTcKK2YgOTI5NS8xMjIzOC82OTcgOTI3My8xMjIyMy82OTcgOTI5OS8xMjI0MS82OTcKK2YgOTI5OS8xMjI0MS82OTcgOTI5OC8xMjI0MC82OTcgOTI5NS8xMjIzOC82OTcKK2YgOTMwMC8xMjI0Mi82OTcgOTI2OS8xMjIxOS82OTcgOTI2MC8xMjIxMi82OTcKK2YgOTI2MC8xMjIxMi82OTcgOTI2MS8xMjIxMS82OTcgOTMwMC8xMjI0Mi82OTcKK2YgOTMwMC8xMjI0Mi82OTcgOTI5My8xMjIzNi82OTcgOTI3MC8xMjIyMi82OTcKK2YgOTI3MC8xMjIyMi82OTcgOTI2OS8xMjIxOS82OTcgOTMwMC8xMjI0Mi82OTcKK2YgOTI3MC8xMjIyMi82OTcgOTI5NC8xMjIzNS82OTcgOTI5OS8xMjI0MS82OTcKK2YgOTI5OS8xMjI0MS82OTcgOTI3My8xMjIyMy82OTcgOTI3MC8xMjIyMi82OTcKK2YgOTI1MC8xMjIwMS82OTcgOTIzOS8xMjE4OC82OTcgOTI5MS8xMjIzNC82OTcKK2YgOTI5MS8xMjIzNC82OTcgOTI4OS8xMjIzMi82OTcgOTI1MC8xMjIwMS82OTcKK2YgOTI5Ny8xMjIzOS82OTcgOTI4NS8xMjIyOS82OTcgOTIzNy8xMjE4Ni82OTcKK2YgOTIzNy8xMjE4Ni82OTcgOTI0OS8xMjE5OC82OTcgOTI5Ny8xMjIzOS82OTcKK2YgOTI1MC8xMjIwMS82OTcgOTI1MS8xMjIwMC82OTcgOTIzOC8xMjE4OS82OTcKK2YgOTIzOC8xMjE4OS82OTcgOTIzOS8xMjE4OC82OTcgOTI1MC8xMjIwMS82OTcKK2YgOTIzNC8xMjE4NS82OTcgOTI0OC8xMjE5OS82OTcgOTI0OS8xMjE5OC82OTcKK2YgOTI0OS8xMjE5OC82OTcgOTIzNy8xMjE4Ni82OTcgOTIzNC8xMjE4NS82OTcKK2YgOTIyMi8xMjE3My82OTcgOTIzMi8xMjE4Mi82OTcgOTIzOC8xMjE4OS82OTcKK2YgOTIzOC8xMjE4OS82OTcgOTI1MS8xMjIwMC82OTcgOTIyMi8xMjE3My82OTcKK2YgOTI0OC8xMjE5OS82OTcgOTIzNC8xMjE4NS82OTcgOTIyOS8xMjE4MS82OTcKK2YgOTIyOS8xMjE4MS82OTcgOTIyMS8xMjE3MC82OTcgOTI0OC8xMjE5OS82OTcKK2YgOTIyMy8xMjE3Mi82OTcgOTIzMy8xMjE4My82OTcgOTIzMi8xMjE4Mi82OTcKK2YgOTIzMi8xMjE4Mi82OTcgOTIyMi8xMjE3My82OTcgOTIyMy8xMjE3Mi82OTcKK2YgOTIzMC8xMjE4MC82OTcgOTIyMC8xMjE3MS82OTcgOTIyMS8xMjE3MC82OTcKK2YgOTIyMS8xMjE3MC82OTcgOTIyOS8xMjE4MS82OTcgOTIzMC8xMjE4MC82OTcKK2YgOTIwMC8xMjE1MS82OTcgOTIxMC8xMjE2MC82OTcgOTIzMy8xMjE4My82OTcKK2YgOTIzMy8xMjE4My82OTcgOTIyMy8xMjE3Mi82OTcgOTIwMC8xMjE1MS82OTcKK2YgOTIyMC8xMjE3MS82OTcgOTIzMC8xMjE4MC82OTcgOTIwNy8xMjE1OS82OTcKK2YgOTIwNy8xMjE1OS82OTcgOTE5OS8xMjE0OC82OTcgOTIyMC8xMjE3MS82OTcKK2YgOTIwMS8xMjE1MC82OTcgOTIxMS8xMjE2MS82OTcgOTIxMC8xMjE2MC82OTcKK2YgOTIxMC8xMjE2MC82OTcgOTIwMC8xMjE1MS82OTcgOTIwMS8xMjE1MC82OTcKK2YgOTIwOC8xMjE1OC82OTcgOTE5OC8xMjE0OS82OTcgOTE5OS8xMjE0OC82OTcKK2YgOTE5OS8xMjE0OC82OTcgOTIwNy8xMjE1OS82OTcgOTIwOC8xMjE1OC82OTcKK2YgOTE3OC8xMjEyOS82OTcgOTE4OC8xMjEzOC82OTcgOTIxMS8xMjE2MS82OTcKK2YgOTIxMS8xMjE2MS82OTcgOTIwMS8xMjE1MC82OTcgOTE3OC8xMjEyOS82OTcKK2YgOTE5OC8xMjE0OS82OTcgOTIwOC8xMjE1OC82OTcgOTE4NS8xMjEzNy82OTcKK2YgOTE4NS8xMjEzNy82OTcgOTE3Ny8xMjEyNi82OTcgOTE5OC8xMjE0OS82OTcKK2YgOTE3OS8xMjEyOC82OTcgOTE4OS8xMjEzOS82OTcgOTE4OC8xMjEzOC82OTcKK2YgOTE4OC8xMjEzOC82OTcgOTE3OC8xMjEyOS82OTcgOTE3OS8xMjEyOC82OTcKK2YgOTE4Ni8xMjEzNi82OTcgOTE3Ni8xMjEyNy82OTcgOTE3Ny8xMjEyNi82OTcKK2YgOTE3Ny8xMjEyNi82OTcgOTE4NS8xMjEzNy82OTcgOTE4Ni8xMjEzNi82OTcKK2YgOTE1Ni8xMjEwNy82OTcgOTE2Ni8xMjExNi82OTcgOTE4OS8xMjEzOS82OTcKK2YgOTE4OS8xMjEzOS82OTcgOTE3OS8xMjEyOC82OTcgOTE1Ni8xMjEwNy82OTcKK2YgOTE3Ni8xMjEyNy82OTcgOTE4Ni8xMjEzNi82OTcgOTE2My8xMjExNS82OTcKK2YgOTE2My8xMjExNS82OTcgOTE1NS8xMjEwNC82OTcgOTE3Ni8xMjEyNy82OTcKK2YgOTE1Ni8xMjEwNy82OTcgOTE1Ny8xMjEwNi82OTcgOTE2Ny8xMjExNy82OTcKK2YgOTE2Ny8xMjExNy82OTcgOTE2Ni8xMjExNi82OTcgOTE1Ni8xMjEwNy82OTcKK2YgOTE2NC8xMjExNC82OTcgOTE1NC8xMjEwNS82OTcgOTE1NS8xMjEwNC82OTcKK2YgOTE1NS8xMjEwNC82OTcgOTE2My8xMjExNS82OTcgOTE2NC8xMjExNC82OTcKK2YgOTE1Ny8xMjEwNi82OTcgOTEzNC8xMjA4NS82OTcgOTE0NC8xMjA5NC82OTcKK2YgOTE0NC8xMjA5NC82OTcgOTE2Ny8xMjExNy82OTcgOTE1Ny8xMjEwNi82OTcKK2YgOTE1NC8xMjEwNS82OTcgOTE2NC8xMjExNC82OTcgOTE0MS8xMjA5My82OTcKK2YgOTE0MS8xMjA5My82OTcgOTEzMy8xMjA4Mi82OTcgOTE1NC8xMjEwNS82OTcKK2YgOTEzNC8xMjA4NS82OTcgOTEzNS8xMjA4NC82OTcgOTE0NS8xMjA5NS82OTcKK2YgOTE0NS8xMjA5NS82OTcgOTE0NC8xMjA5NC82OTcgOTEzNC8xMjA4NS82OTcKK2YgOTE0Mi8xMjA5Mi82OTcgOTEzMi8xMjA4My82OTcgOTEzMy8xMjA4Mi82OTcKK2YgOTEzMy8xMjA4Mi82OTcgOTE0MS8xMjA5My82OTcgOTE0Mi8xMjA5Mi82OTcKK2YgOTEzNS8xMjA4NC82OTcgOTExMi8xMjA2My82OTcgOTEyMi8xMjA3Mi82OTcKK2YgOTEyMi8xMjA3Mi82OTcgOTE0NS8xMjA5NS82OTcgOTEzNS8xMjA4NC82OTcKK2YgOTEzMi8xMjA4My82OTcgOTE0Mi8xMjA5Mi82OTcgOTExOS8xMjA3MS82OTcKK2YgOTExOS8xMjA3MS82OTcgOTExMS8xMjA2MC82OTcgOTEzMi8xMjA4My82OTcKK2YgOTExMi8xMjA2My82OTcgOTExMy8xMjA2Mi82OTcgOTEyMy8xMjA3My82OTcKK2YgOTEyMy8xMjA3My82OTcgOTEyMi8xMjA3Mi82OTcgOTExMi8xMjA2My82OTcKK2YgOTEyMC8xMjA3MC82OTcgOTExMC8xMjA2MS82OTcgOTExMS8xMjA2MC82OTcKK2YgOTExMS8xMjA2MC82OTcgOTExOS8xMjA3MS82OTcgOTEyMC8xMjA3MC82OTcKK2YgOTExMy8xMjA2Mi82OTcgOTA5Mi8xMjA0My82OTcgOTEwMC8xMjA1MC82OTcKK2YgOTEwMC8xMjA1MC82OTcgOTEyMy8xMjA3My82OTcgOTExMy8xMjA2Mi82OTcKK2YgOTExMC8xMjA2MS82OTcgOTEyMC8xMjA3MC82OTcgOTA5Ny8xMjA0OS82OTcKK2YgOTA5Ny8xMjA0OS82OTcgOTA5MS8xMjA0MC82OTcgOTExMC8xMjA2MS82OTcKK2YgOTA5Mi8xMjA0My82OTcgOTA5My8xMjA0Mi82OTcgOTEwMS8xMjA1MS82OTcKK2YgOTEwMS8xMjA1MS82OTcgOTEwMC8xMjA1MC82OTcgOTA5Mi8xMjA0My82OTcKK2YgOTA5OC8xMjA0OC82OTcgOTA5MC8xMjA0MS82OTcgOTA5MS8xMjA0MC82OTcKK2YgOTA5MS8xMjA0MC82OTcgOTA5Ny8xMjA0OS82OTcgOTA5OC8xMjA0OC82OTcKK2YgOTA5My8xMjA0Mi82OTcgOTA3NC8xMjAyNS82OTcgOTA2My8xMjAxMi82OTcKK2YgOTA2My8xMjAxMi82OTcgOTEwMS8xMjA1MS82OTcgOTA5My8xMjA0Mi82OTcKK2YgOTA5MC8xMjA0MS82OTcgOTA5OC8xMjA0OC82OTcgOTA2MS8xMjAxMC82OTcKK2YgOTA2MS8xMjAxMC82OTcgOTA3My8xMjAyMi82OTcgOTA5MC8xMjA0MS82OTcKK2YgOTA3NC8xMjAyNS82OTcgOTA3NS8xMjAyNC82OTcgOTA2Mi8xMjAxMy82OTcKK2YgOTA2Mi8xMjAxMy82OTcgOTA2My8xMjAxMi82OTcgOTA3NC8xMjAyNS82OTcKK2YgOTA1OC8xMjAwOS82OTcgOTA3Mi8xMjAyMy82OTcgOTA3My8xMjAyMi82OTcKK2YgOTA3My8xMjAyMi82OTcgOTA2MS8xMjAxMC82OTcgOTA1OC8xMjAwOS82OTcKK2YgOTA3NS8xMjAyNC82OTcgOTA0Ni8xMTk5Ny82OTcgOTA1Ni8xMjAwNi82OTcKK2YgOTA1Ni8xMjAwNi82OTcgOTA2Mi8xMjAxMy82OTcgOTA3NS8xMjAyNC82OTcKK2YgOTA3Mi8xMjAyMy82OTcgOTA1OC8xMjAwOS82OTcgOTA1My8xMjAwNS82OTcKK2YgOTA1My8xMjAwNS82OTcgOTA0NS8xMTk5NC82OTcgOTA3Mi8xMjAyMy82OTcKK2YgOTAzNC8xMTk4NC82OTcgOTA1Ny8xMjAwNy82OTcgOTA0Ny8xMTk5Ni82OTcKK2YgOTA0Ny8xMTk5Ni82OTcgOTAyNC8xMTk3NS82OTcgOTAzNC8xMTk4NC82OTcKK2YgOTAzMS8xMTk4My82OTcgOTAyMy8xMTk3Mi82OTcgOTA0NC8xMTk5NS82OTcKK2YgOTA0NC8xMTk5NS82OTcgOTA1NC8xMjAwNC82OTcgOTAzMS8xMTk4My82OTcKK2YgOTAyNC8xMTk3NS82OTcgOTAyNS8xMTk3NC82OTcgOTAzNS8xMTk4NS82OTcKK2YgOTAzNS8xMTk4NS82OTcgOTAzNC8xMTk4NC82OTcgOTAyNC8xMTk3NS82OTcKK2YgOTAzMi8xMTk4Mi82OTcgOTAyMi8xMTk3My82OTcgOTAyMy8xMTk3Mi82OTcKK2YgOTAyMy8xMTk3Mi82OTcgOTAzMS8xMTk4My82OTcgOTAzMi8xMTk4Mi82OTcKK2YgOTAyNS8xMTk3NC82OTcgOTAwMi8xMTk1My82OTcgOTAxMi8xMTk2Mi82OTcKK2YgOTAxMi8xMTk2Mi82OTcgOTAzNS8xMTk4NS82OTcgOTAyNS8xMTk3NC82OTcKK2YgOTAyMi8xMTk3My82OTcgOTAzMi8xMTk4Mi82OTcgOTAwOS8xMTk2MS82OTcKK2YgOTAwOS8xMTk2MS82OTcgOTAwMS8xMTk1MC82OTcgOTAyMi8xMTk3My82OTcKK2YgOTAwMy8xMTk1Mi82OTcgOTAxMy8xMTk2My82OTcgOTAxMi8xMTk2Mi82OTcKK2YgOTAxMi8xMTk2Mi82OTcgOTAwMi8xMTk1My82OTcgOTAwMy8xMTk1Mi82OTcKK2YgOTAxMC8xMTk2MC82OTcgOTAwMC8xMTk1MS82OTcgOTAwMS8xMTk1MC82OTcKK2YgOTAwMS8xMTk1MC82OTcgOTAwOS8xMTk2MS82OTcgOTAxMC8xMTk2MC82OTcKK2YgOTAwMy8xMTk1Mi82OTcgOTI3OS8xMTc0NC82OTcgOTMwMS8xMTkzOC82OTcKK2YgOTMwMS8xMTkzOC82OTcgOTAxMy8xMTk2My82OTcgOTAwMy8xMTk1Mi82OTcKK2YgOTAwMC8xMTk1MS82OTcgOTAxMC8xMTk2MC82OTcgOTMwMi8xMTk0MS82OTcKK2YgOTMwMi8xMTk0MS82OTcgOTI3Ni8xMTc0MS82OTcgOTAwMC8xMTk1MS82OTcKK2YgODk5NS8xMTk0NC8zNTcxIDkzMDQvMTIyNDMvMzU3MSA5MzAzLzEyMjQ0LzM1NzEKK2YgOTMwMy8xMjI0NC8zNTcyIDg5OTQvMTE5NDUvMzU3MiA4OTk1LzExOTQ0LzM1NzIKK2YgODk5My8xMTk0Mi8zNTczIDkzMDYvMTIyNDUvMzU3MyA5MzA1LzExOTQzLzM1NzMKK2YgOTMwNS8xMTk0My8zNTc0IDg5OTIvMTE5NDMvMzU3NCA4OTkzLzExOTQyLzM1NzQKK2YgODk5OS8xMTk0OC8zNTc1IDkzMDgvMTIyNDYvMzU3NSA5MzA3LzEyMjQ3LzM1NzUKK2YgOTMwNy8xMjI0Ny8zNTc2IDg5OTgvMTE5NDkvMzU3NiA4OTk5LzExOTQ4LzM1NzYKK2YgODk5Ny8xMTk0Ni8zNTc3IDkzMTAvMTE5NDYvMzU3NyA5MzA5LzEyMjQ4LzM1NzcKK2YgOTMwOS8xMjI0OC8zNTc4IDg5OTYvMTE5NDcvMzU3OCA4OTk3LzExOTQ2LzM1NzgKK2YgOTAwMC8xMTk1MS8zNTc5IDkzMTEvMTE5NTEvMzU3OSA5MzA0LzEyMjQzLzM1NzkKK2YgOTMwNC8xMjI0My8zNTgwIDg5OTUvMTE5NDQvMzU4MCA5MDAwLzExOTUxLzM1ODAKK2YgODk5Mi8xMTk0My8zNTgxIDkzMDUvMTE5NDMvMzU4MSA5MzEyLzEyMjQ5LzM1ODEKK2YgOTMxMi8xMjI0OS8zNTgyIDkwMDEvMTE5NTAvMzU4MiA4OTkyLzExOTQzLzM1ODIKK2YgODk5OC8xMTk0OS8zNTgzIDkzMDcvMTIyNDcvMzU4MyA5MzEzLzExOTUyLzM1ODMKK2YgOTMxMy8xMTk1Mi8zNTg0IDkwMDMvMTE5NTIvMzU4NCA4OTk4LzExOTQ5LzM1ODQKK2YgOTAwMi8xMTk1My8zNTg1IDkzMTQvMTIyNTAvMzU4NSA5MzEwLzExOTQ2LzM1ODUKK2YgOTMxMC8xMTk0Ni8zNTg2IDg5OTcvMTE5NDYvMzU4NiA5MDAyLzExOTUzLzM1ODYKK2YgOTAxMC8xMTk2MC8zMzY1IDkzMTYvMTIyNTEvMzM2NSA5MzE1LzEyMjUyLzMzNjUKK2YgOTMxNS8xMjI1Mi8zMjM4IDkzMDIvMTE5NDEvMzIzOCA5MDEwLzExOTYwLzMyMzgKK2YgOTMwMS8xMTkzOC8zMzY2IDkzMTgvMTE5MzgvMzM2NiA5MzE3LzExOTYzLzMzNjYKK2YgOTMxNy8xMTk2My8zMzY2IDkwMTMvMTE5NjMvMzM2NiA5MzAxLzExOTM4LzMzNjYKK2YgOTAxMS8xMTk1OS8zNTg3IDkzMTkvMTE5NTkvMzU4NyA5MzE2LzEyMjUxLzM1ODcKK2YgOTMxNi8xMjI1MS8zNTg4IDkwMTAvMTE5NjAvMzU4OCA5MDExLzExOTU5LzM1ODgKK2YgOTAwOS8xMTk2MS8zNTg5IDkzMjEvMTIyNTMvMzU4OSA5MzIwLzExOTU4LzM1ODkKK2YgOTMyMC8xMTk1OC8zNTkwIDkwMDgvMTE5NTgvMzU5MCA5MDA5LzExOTYxLzM1OTAKK2YgOTAxMy8xMTk2My8zNTkxIDkzMTcvMTE5NjMvMzU5MSA5MzE5LzExOTU5LzM1OTEKK2YgOTMxOS8xMTk1OS8zNTkyIDkwMTEvMTE5NTkvMzU5MiA5MDEzLzExOTYzLzM1OTIKK2YgOTAwOC8xMTk1OC8zNTkzIDkzMjAvMTE5NTgvMzU5MyA5MzIyLzEyMjU0LzM1OTMKK2YgOTMyMi8xMjI1NC8zNTk0IDkwMTIvMTE5NjIvMzU5NCA5MDA4LzExOTU4LzM1OTQKK2YgOTAyNS8xMTk3NC8zMzk1IDkzMjMvMTE5NzQvMzM5NSA5MzE0LzEyMjUwLzMzOTUKK2YgOTMxNC8xMjI1MC8zMzc1IDkwMDIvMTE5NTMvMzM3NSA5MDI1LzExOTc0LzMzNzUKK2YgOTAwMS8xMTk1MC8zMzM1IDkzMTIvMTIyNDkvMzMzNSA5MzI0LzExOTczLzMzMzUKK2YgOTMyNC8xMTk3My8zNTk1IDkwMjIvMTE5NzMvMzU5NSA5MDAxLzExOTUwLzM1OTUKK2YgOTAxNy8xMTk2Ni8zNTk2IDkzMjYvMTE5NjYvMzU5NiA5MzI1LzEyMjU1LzM1OTYKK2YgOTMyNS8xMjI1NS8zNTk3IDkwMTYvMTE5NjcvMzU5NyA5MDE3LzExOTY2LzM1OTcKK2YgOTAxNS8xMTk2NC8zNTczIDkzMjgvMTIyNTYvMzU3MyA5MzI3LzEyMjU3LzM1NzMKK2YgOTMyNy8xMjI1Ny8zNTk4IDkwMTQvMTE5NjUvMzU5OCA5MDE1LzExOTY0LzM1OTgKK2YgOTAyMS8xMTk3MC8zNTk5IDkzMzAvMTIyNTgvMzU5OSA5MzI5LzExOTcxLzM1OTkKK2YgOTMyOS8xMTk3MS8zNjAwIDkwMjAvMTE5NzEvMzYwMCA5MDIxLzExOTcwLzM2MDAKK2YgOTAxOS8xMTk2OC8zNTc3IDkzMzIvMTIyNTkvMzU3NyA5MzMxLzEyMjYwLzM1NzcKK2YgOTMzMS8xMjI2MC8zNjAxIDkwMTgvMTE5NjkvMzYwMSA5MDE5LzExOTY4LzM2MDEKK2YgOTAyMi8xMTk3My8zNjAyIDkzMjQvMTE5NzMvMzYwMiA5MzI2LzExOTY2LzM2MDIKK2YgOTMyNi8xMTk2Ni8zNjAzIDkwMTcvMTE5NjYvMzYwMyA5MDIyLzExOTczLzM2MDMKK2YgOTAxNC8xMTk2NS8zNjA0IDkzMjcvMTIyNTcvMzYwNCA5MzMzLzExOTcyLzM2MDQKK2YgOTMzMy8xMTk3Mi8zNjA1IDkwMjMvMTE5NzIvMzYwNSA5MDE0LzExOTY1LzM2MDUKK2YgOTAyMC8xMTk3MS8zNjA2IDkzMjkvMTE5NzEvMzYwNiA5MzIzLzExOTc0LzM2MDYKK2YgOTMyMy8xMTk3NC8zNjA3IDkwMjUvMTE5NzQvMzYwNyA5MDIwLzExOTcxLzM2MDcKK2YgOTAyNC8xMTk3NS8zNjA4IDkzMzQvMTE5NzUvMzYwOCA5MzMyLzEyMjU5LzM2MDgKK2YgOTMzMi8xMjI1OS8zNjA5IDkwMTkvMTE5NjgvMzYwOSA5MDI0LzExOTc1LzM2MDkKK2YgOTAxNi8xMTk2Ny8zMzMzIDkzMjUvMTIyNTUvMzMzMyA5MzA2LzEyMjQ1LzMzMzMKK2YgOTMwNi8xMjI0NS8zMzYyIDg5OTMvMTE5NDIvMzM2MiA5MDE2LzExOTY3LzMzNjIKK2YgODk5Ni8xMTk0Ny8zMzg5IDkzMDkvMTIyNDgvMzM4OSA5MzMwLzEyMjU4LzMzODkKK2YgOTMzMC8xMjI1OC8zNjEwIDkwMjEvMTE5NzAvMzYxMCA4OTk2LzExOTQ3LzM2MTAKK2YgOTAzMi8xMTk4Mi8zMjM4IDkzMzUvMTIyNjEvMzIzOCA5MzIxLzEyMjUzLzMyMzgKK2YgOTMyMS8xMjI1My8zMjM4IDkwMDkvMTE5NjEvMzIzOCA5MDMyLzExOTgyLzMyMzgKK2YgOTAxMi8xMTk2Mi8zMzM1IDkzMjIvMTIyNTQvMzMzNSA5MzM2LzExOTg1LzMzMzUKK2YgOTMzNi8xMTk4NS8zMzY2IDkwMzUvMTE5ODUvMzM2NiA5MDEyLzExOTYyLzMzNjYKK2YgOTAzMy8xMTk4MS8zNjExIDkzMzcvMTIyNjIvMzYxMSA5MzM1LzEyMjYxLzM2MTEKK2YgOTMzNS8xMjI2MS8zNjEyIDkwMzIvMTE5ODIvMzYxMiA5MDMzLzExOTgxLzM2MTIKK2YgOTAzMS8xMTk4My8zNjEzIDkzMzkvMTIyNjMvMzYxMyA5MzM4LzEyMjY0LzM2MTMKK2YgOTMzOC8xMjI2NC8zNjE0IDkwMzAvMTE5ODAvMzYxNCA5MDMxLzExOTgzLzM2MTQKK2YgOTAzNS8xMTk4NS8zNjE1IDkzMzYvMTE5ODUvMzYxNSA5MzM3LzEyMjYyLzM2MTUKK2YgOTMzNy8xMjI2Mi8zNjE2IDkwMzMvMTE5ODEvMzYxNiA5MDM1LzExOTg1LzM2MTYKK2YgOTAzMC8xMTk4MC8zNjE3IDkzMzgvMTIyNjQvMzYxNyA5MzQwLzExOTg0LzM2MTcKK2YgOTM0MC8xMTk4NC8zNjE4IDkwMzQvMTE5ODQvMzYxOCA5MDMwLzExOTgwLzM2MTgKK2YgOTA0Ny8xMTk5Ni8zMzc1IDkzNDEvMTE5OTYvMzM3NSA5MzM0LzExOTc1LzMzNzUKK2YgOTMzNC8xMTk3NS8zNDU4IDkwMjQvMTE5NzUvMzQ1OCA5MDQ3LzExOTk2LzM0NTgKK2YgOTAyMy8xMTk3Mi8zMzM1IDkzMzMvMTE5NzIvMzMzNSA5MzQyLzExOTk1LzMzMzUKK2YgOTM0Mi8xMTk5NS8zMzc2IDkwNDQvMTE5OTUvMzM3NiA5MDIzLzExOTcyLzMzNzYKK2YgOTAzOS8xMTk4OC8zNDgxIDkzNDQvMTIyNjUvMzQ4MSA5MzQzLzEyMjY2LzM0ODEKK2YgOTM0My8xMjI2Ni8zNjE5IDkwMzgvMTE5ODkvMzYxOSA5MDM5LzExOTg4LzM2MTkKK2YgOTAzNy8xMTk4Ni8zNjIwIDkzNDYvMTIyNjcvMzYyMCA5MzQ1LzEyMjY4LzM2MjAKK2YgOTM0NS8xMjI2OC8zNTc0IDkwMzYvMTE5ODcvMzU3NCA5MDM3LzExOTg2LzM1NzQKK2YgOTA0My8xMTk5Mi8zNjIxIDkzNDgvMTIyNjkvMzYyMSA5MzQ3LzEyMjcwLzM2MjEKK2YgOTM0Ny8xMjI3MC8zNjAwIDkwNDIvMTE5OTMvMzYwMCA5MDQzLzExOTkyLzM2MDAKK2YgOTA0MS8xMTk5MC8zNjIyIDkzNTAvMTIyNzEvMzYyMiA5MzQ5LzEyMjcyLzM2MjIKK2YgOTM0OS8xMjI3Mi8zNTc4IDkwNDAvMTE5OTEvMzU3OCA5MDQxLzExOTkwLzM1NzgKK2YgOTA0NC8xMTk5NS8zNjIzIDkzNDIvMTE5OTUvMzYyMyA5MzQ0LzEyMjY1LzM2MjMKK2YgOTM0NC8xMjI2NS8zNjIzIDkwMzkvMTE5ODgvMzYyMyA5MDQ0LzExOTk1LzM2MjMKK2YgOTAzNi8xMTk4Ny8zNjI0IDkzNDUvMTIyNjgvMzYyNCA5MzUxLzEyMjczLzM2MjQKK2YgOTM1MS8xMjI3My8zNjI0IDkwNDUvMTE5OTQvMzYyNCA5MDM2LzExOTg3LzM2MjQKK2YgOTA0Mi8xMTk5My8zNjI1IDkzNDcvMTIyNzAvMzYyNSA5MzQxLzExOTk2LzM2MjUKK2YgOTM0MS8xMTk5Ni8zNjI2IDkwNDcvMTE5OTYvMzYyNiA5MDQyLzExOTkzLzM2MjYKK2YgOTA0Ni8xMTk5Ny8zNjI3IDkzNTIvMTIyNzQvMzYyNyA5MzUwLzEyMjcxLzM2MjcKK2YgOTM1MC8xMjI3MS8zNjI4IDkwNDEvMTE5OTAvMzYyOCA5MDQ2LzExOTk3LzM2MjgKK2YgOTAzOC8xMTk4OS8zMzYyIDkzNDMvMTIyNjYvMzM2MiA5MzI4LzEyMjU2LzMzNjIKK2YgOTMyOC8xMjI1Ni8zMzYyIDkwMTUvMTE5NjQvMzM2MiA5MDM4LzExOTg5LzMzNjIKK2YgOTAxOC8xMTk2OS8zNDE1IDkzMzEvMTIyNjAvMzQxNSA5MzQ4LzEyMjY5LzM0MTUKK2YgOTM0OC8xMjI2OS8zMzg5IDkwNDMvMTE5OTIvMzM4OSA5MDE4LzExOTY5LzMzODkKK2YgOTA1NC8xMjAwNC8zMzMzIDkzNTMvMTIyNzUvMzMzMyA5MzM5LzEyMjYzLzMzMzMKK2YgOTMzOS8xMjI2My8zMzMzIDkwMzEvMTE5ODMvMzMzMyA5MDU0LzEyMDA0LzMzMzMKK2YgOTAzNC8xMTk4NC8zMzY2IDkzNDAvMTE5ODQvMzM2NiA5MzU0LzEyMDA3LzMzNjYKK2YgOTM1NC8xMjAwNy8zMzM0IDkwNTcvMTIwMDcvMzMzNCA5MDM0LzExOTg0LzMzMzQKK2YgOTA1NS8xMjAwMy8zNjI5IDkzNTUvMTIwMDMvMzYyOSA5MzUzLzEyMjc1LzM2MjkKK2YgOTM1My8xMjI3NS8zNjMwIDkwNTQvMTIwMDQvMzYzMCA5MDU1LzEyMDAzLzM2MzAKK2YgOTA1My8xMjAwNS8zNjMxIDkzNTcvMTIyNzYvMzYzMSA5MzU2LzEyMDAyLzM2MzEKK2YgOTM1Ni8xMjAwMi8zNjMyIDkwNTIvMTIwMDIvMzYzMiA5MDUzLzEyMDA1LzM2MzIKK2YgOTA1Ny8xMjAwNy8zNjMzIDkzNTQvMTIwMDcvMzYzMyA5MzU1LzEyMDAzLzM2MzMKK2YgOTM1NS8xMjAwMy8zNjMzIDkwNTUvMTIwMDMvMzYzMyA5MDU3LzEyMDA3LzM2MzMKK2YgOTA1Mi8xMjAwMi8zNjM0IDkzNTYvMTIwMDIvMzYzNCA5MzU4LzEyMjc3LzM2MzQKK2YgOTM1OC8xMjI3Ny8zNTk0IDkwNTYvMTIwMDYvMzU5NCA5MDUyLzEyMDAyLzM1OTQKK2YgOTA3NS8xMjAyNC8zMzk1IDkzNTkvMTIyNzgvMzM5NSA5MzUyLzEyMjc0LzMzOTUKK2YgOTM1Mi8xMjI3NC8zMzQzIDkwNDYvMTE5OTcvMzM0MyA5MDc1LzEyMDI0LzMzNDMKK2YgOTA3My8xMjAyMi8zMzY2IDkzNjEvMTIwMjIvMzM2NiA5MzYwLzEyMDQxLzMzNjYKK2YgOTM2MC8xMjA0MS8zNjM1IDkwOTAvMTIwNDEvMzYzNSA5MDczLzEyMDIyLzM2MzUKK2YgOTA2MS8xMjAxMC8zNjM2IDkzNjMvMTIyNzkvMzYzNiA5MzYyLzEyMjgwLzM2MzYKK2YgOTM2Mi8xMjI4MC8zNjM3IDkwNjAvMTIwMTEvMzYzNyA5MDYxLzEyMDEwLzM2MzcKK2YgOTA1OS8xMjAwOC8zNjM4IDkzNjUvMTIyODEvMzYzOCA5MzY0LzEyMjgyLzM2MzgKK2YgOTM2NC8xMjI4Mi8zNjMwIDkwNTgvMTIwMDkvMzYzMCA5MDU5LzEyMDA4LzM2MzAKK2YgOTA2MC8xMjAxMS8zNjM5IDkzNjIvMTIyODAvMzYzOSA5MzY2LzEyMDEyLzM2MzkKK2YgOTM2Ni8xMjAxMi8zNjM5IDkwNjMvMTIwMTIvMzYzOSA5MDYwLzEyMDExLzM2MzkKK2YgOTA2Mi8xMjAxMy8zNjQwIDkzNjcvMTIyODMvMzY0MCA5MzY1LzEyMjgxLzM2NDAKK2YgOTM2NS8xMjI4MS8zNjQwIDkwNTkvMTIwMDgvMzY0MCA5MDYyLzEyMDEzLzM2NDAKK2YgOTA5My8xMjA0Mi8zMzc1IDkzNjkvMTIwNDIvMzM3NSA5MzY4LzEyMDI1LzMzNzUKK2YgOTM2OC8xMjAyNS8zMzQ0IDkwNzQvMTIwMjUvMzM0NCA5MDkzLzEyMDQyLzMzNDQKK2YgOTA0NS8xMTk5NC8zMzM1IDkzNTEvMTIyNzMvMzMzNSA5MzcwLzEyMjg0LzMzMzUKK2YgOTM3MC8xMjI4NC8zMzM1IDkwNzIvMTIwMjMvMzMzNSA5MDQ1LzExOTk0LzMzMzUKK2YgOTA2Ny8xMjAxNi8zNTk2IDkzNzIvMTIwMTYvMzU5NiA5MzcxLzEyMjg1LzM1OTYKK2YgOTM3MS8xMjI4NS8zNDgxIDkwNjYvMTIwMTcvMzQ4MSA5MDY3LzEyMDE2LzM0ODEKK2YgOTA2NS8xMjAxNC8zNjQxIDkzNzQvMTIyODYvMzY0MSA5MzczLzEyMjg3LzM2NDEKK2YgOTM3My8xMjI4Ny8zNjQyIDkwNjQvMTIwMTUvMzY0MiA5MDY1LzEyMDE0LzM2NDIKK2YgOTA3MS8xMjAyMC8zNTc2IDkzNzYvMTIyODgvMzU3NiA5Mzc1LzEyMDIxLzM1NzYKK2YgOTM3NS8xMjAyMS8zNjAwIDkwNzAvMTIwMjEvMzYwMCA5MDcxLzEyMDIwLzM2MDAKK2YgOTA2OS8xMjAxOC8zNjQzIDkzNzgvMTIyODkvMzY0MyA5Mzc3LzEyMjkwLzM2NDMKK2YgOTM3Ny8xMjI5MC8zNjQ0IDkwNjgvMTIwMTkvMzY0NCA5MDY5LzEyMDE4LzM2NDQKK2YgOTA3Mi8xMjAyMy8zNjQ1IDkzNzAvMTIyODQvMzY0NSA5MzcyLzEyMDE2LzM2NDUKK2YgOTM3Mi8xMjAxNi8zNjQ2IDkwNjcvMTIwMTYvMzY0NiA5MDcyLzEyMDIzLzM2NDYKK2YgOTA2NC8xMjAxNS8zNjQ3IDkzNzMvMTIyODcvMzY0NyA5MzYxLzEyMDIyLzM2NDcKK2YgOTM2MS8xMjAyMi8zNjQ3IDkwNzMvMTIwMjIvMzY0NyA5MDY0LzEyMDE1LzM2NDcKK2YgOTA3MC8xMjAyMS8zNjQ4IDkzNzUvMTIwMjEvMzY0OCA5MzU5LzEyMjc4LzM2NDgKK2YgOTM1OS8xMjI3OC8zNjQ5IDkwNzUvMTIwMjQvMzY0OSA5MDcwLzEyMDIxLzM2NDkKK2YgOTA3NC8xMjAyNS8zNDk5IDkzNjgvMTIwMjUvMzQ5OSA5Mzc4LzEyMjg5LzM0OTkKK2YgOTM3OC8xMjI4OS8zNjUwIDkwNjkvMTIwMTgvMzY1MCA5MDc0LzEyMDI1LzM2NTAKK2YgOTA2Ni8xMjAxNy8zMzMzIDkzNzEvMTIyODUvMzMzMyA5MzQ2LzEyMjY3LzMzMzMKK2YgOTM0Ni8xMjI2Ny8zMzYyIDkwMzcvMTE5ODYvMzM2MiA5MDY2LzEyMDE3LzMzNjIKK2YgOTA3Ny8xMjAyNy8zMzYyIDkzNzkvMTIyOTEvMzM2MiA5Mzc0LzEyMjg2LzMzNjIKK2YgOTM3NC8xMjI4Ni8zMzYyIDkwNjUvMTIwMTQvMzM2MiA5MDc3LzEyMDI3LzMzNjIKK2YgOTA2OC8xMjAxOS8zNDE1IDkzNzcvMTIyOTAvMzQxNSA5MzgwLzEyMjkyLzM0MTUKK2YgOTM4MC8xMjI5Mi8zMzkwIDkwODIvMTIwMzAvMzM5MCA5MDY4LzEyMDE5LzMzOTAKK2YgOTA0MC8xMTk5MS8zNDE1IDkzNDkvMTIyNzIvMzQxNSA5Mzc2LzEyMjg4LzM0MTUKK2YgOTM3Ni8xMjI4OC8zMzkwIDkwNzEvMTIwMjAvMzM5MCA5MDQwLzExOTkxLzMzOTAKK2YgOTA1OC8xMjAwOS8zMzMzIDkzNjQvMTIyODIvMzMzMyA5MzU3LzEyMjc2LzMzMzMKK2YgOTM1Ny8xMjI3Ni8zMzQ0IDkwNTMvMTIwMDUvMzM0NCA5MDU4LzEyMDA5LzMzNDQKK2YgOTA1Ni8xMjAwNi8zMzQ1IDkzNTgvMTIyNzcvMzM0NSA5MzY3LzEyMjgzLzMzNDUKK2YgOTM2Ny8xMjI4My8zNDU5IDkwNjIvMTIwMTMvMzQ1OSA5MDU2LzEyMDA2LzM0NTkKK2YgOTA4Ni8xMjAzNi8zNjUxIDkzODEvMTIyOTMvMzY1MSA5Mzc5LzEyMjkxLzM2NTEKK2YgOTM3OS8xMjI5MS8zNjUyIDkwNzcvMTIwMjcvMzY1MiA5MDg2LzEyMDM2LzM2NTIKK2YgOTA4NS8xMjAzNC8zNTczIDkzODMvMTIyOTQvMzU3MyA5MzgyLzEyMjk1LzM1NzMKK2YgOTM4Mi8xMjI5NS8zNTczIDkwODQvMTIwMzUvMzU3MyA5MDg1LzEyMDM0LzM1NzMKK2YgOTA4Mi8xMjAzMC8zNjUzIDkzODAvMTIyOTIvMzY1MyA5Mzg0LzEyMjk2LzM2NTMKK2YgOTM4NC8xMjI5Ni8zNjU0IDkwODkvMTIwMzkvMzY1NCA5MDgyLzEyMDMwLzM2NTQKK2YgOTA4OC8xMjAzNy8zNTc3IDkzODYvMTIyOTcvMzU3NyA5Mzg1LzEyMjk4LzM1NzcKK2YgOTM4NS8xMjI5OC8zNjAxIDkwODcvMTIwMzgvMzYwMSA5MDg4LzEyMDM3LzM2MDEKK2YgOTA5MC8xMjA0MS8zNjU1IDkzNjAvMTIwNDEvMzY1NSA5MzgxLzEyMjkzLzM2NTUKK2YgOTM4MS8xMjI5My8zNjU2IDkwODYvMTIwMzYvMzY1NiA5MDkwLzEyMDQxLzM2NTYKK2YgOTA4NC8xMjAzNS8zNjU3IDkzODIvMTIyOTUvMzY1NyA5Mzg3LzEyMDQwLzM2NTcKK2YgOTM4Ny8xMjA0MC8zNjI0IDkwOTEvMTIwNDAvMzYyNCA5MDg0LzEyMDM1LzM2MjQKK2YgOTA4OS8xMjAzOS8zNTg0IDkzODQvMTIyOTYvMzU4NCA5MzY5LzEyMDQyLzM1ODQKK2YgOTM2OS8xMjA0Mi8zNjU4IDkwOTMvMTIwNDIvMzY1OCA5MDg5LzEyMDM5LzM2NTgKK2YgOTA5Mi8xMjA0My8zNjU5IDkzODgvMTIwNDMvMzY1OSA5Mzg2LzEyMjk3LzM2NTkKK2YgOTM4Ni8xMjI5Ny8zNjI4IDkwODgvMTIwMzcvMzYyOCA5MDkyLzEyMDQzLzM2MjgKK2YgOTA5OC8xMjA0OC8zMzQ0IDkzODkvMTIyOTkvMzM0NCA5MzYzLzEyMjc5LzMzNDQKK2YgOTM2My8xMjI3OS8zMjM4IDkwNjEvMTIwMTAvMzIzOCA5MDk4LzEyMDQ4LzMyMzgKK2YgOTA2My8xMjAxMi8zMzY2IDkzNjYvMTIwMTIvMzM2NiA5MzkwLzEyMDUxLzMzNjYKK2YgOTM5MC8xMjA1MS8zMzY2IDkxMDEvMTIwNTEvMzM2NiA5MDYzLzEyMDEyLzMzNjYKK2YgOTA5OS8xMjA0Ny8zNjExIDkzOTEvMTIzMDAvMzYxMSA5Mzg5LzEyMjk5LzM2MTEKK2YgOTM4OS8xMjI5OS8zNjYwIDkwOTgvMTIwNDgvMzY2MCA5MDk5LzEyMDQ3LzM2NjAKK2YgOTA5Ny8xMjA0OS8zNjYxIDkzOTMvMTIzMDEvMzY2MSA5MzkyLzEyMDQ2LzM2NjEKK2YgOTM5Mi8xMjA0Ni8zNjMyIDkwOTYvMTIwNDYvMzYzMiA5MDk3LzEyMDQ5LzM2MzIKK2YgOTEwMS8xMjA1MS8zNTkyIDkzOTAvMTIwNTEvMzU5MiA5MzkxLzEyMzAwLzM1OTIKK2YgOTM5MS8xMjMwMC8zNjMzIDkwOTkvMTIwNDcvMzYzMyA5MTAxLzEyMDUxLzM2MzMKK2YgOTA5Ni8xMjA0Ni8zNjYyIDkzOTIvMTIwNDYvMzY2MiA5Mzk0LzEyMzAyLzM2NjIKK2YgOTM5NC8xMjMwMi8zNTk0IDkxMDAvMTIwNTAvMzU5NCA5MDk2LzEyMDQ2LzM1OTQKK2YgOTExMy8xMjA2Mi8zNDU4IDkzOTUvMTIzMDMvMzQ1OCA5Mzg4LzEyMDQzLzM0NTgKK2YgOTM4OC8xMjA0My8zMzc1IDkwOTIvMTIwNDMvMzM3NSA5MTEzLzEyMDYyLzMzNzUKK2YgOTA5MS8xMjA0MC8zMzM1IDkzODcvMTIwNDAvMzMzNSA5Mzk2LzEyMzA0LzMzMzUKK2YgOTM5Ni8xMjMwNC8zMzQ2IDkxMTAvMTIwNjEvMzM0NiA5MDkxLzEyMDQwLzMzNDYKK2YgOTEwNS8xMjA1NC8zNTk2IDkzOTgvMTIwNTQvMzU5NiA5Mzk3LzEyMzA1LzM1OTYKK2YgOTM5Ny8xMjMwNS8zNTk3IDkxMDQvMTIwNTUvMzU5NyA5MTA1LzEyMDU0LzM1OTcKK2YgOTEwMy8xMjA1Mi8zNTczIDk0MDAvMTIzMDYvMzU3MyA5Mzk5LzEyMDUzLzM1NzMKK2YgOTM5OS8xMjA1My8zNTc0IDkxMDIvMTIwNTMvMzU3NCA5MTAzLzEyMDUyLzM1NzQKK2YgOTEwOS8xMjA1OC8zNTk5IDk0MDIvMTIzMDcvMzU5OSA5NDAxLzEyMDU5LzM1OTkKK2YgOTQwMS8xMjA1OS8zNjYzIDkxMDgvMTIwNTkvMzY2MyA5MTA5LzEyMDU4LzM2NjMKK2YgOTEwNy8xMjA1Ni8zNjY0IDk0MDQvMTIwNTYvMzY2NCA5NDAzLzEyMzA4LzM2NjQKK2YgOTQwMy8xMjMwOC8zNjAxIDkxMDYvMTIwNTcvMzYwMSA5MTA3LzEyMDU2LzM2MDEKK2YgOTExMC8xMjA2MS8zNjIzIDkzOTYvMTIzMDQvMzYyMyA5Mzk4LzEyMDU0LzM2MjMKK2YgOTM5OC8xMjA1NC8zNjAzIDkxMDUvMTIwNTQvMzYwMyA5MTEwLzEyMDYxLzM2MDMKK2YgOTEwMi8xMjA1My8zNjI0IDkzOTkvMTIwNTMvMzYyNCA5NDA1LzEyMDYwLzM2MjQKK2YgOTQwNS8xMjA2MC8zNjY1IDkxMTEvMTIwNjAvMzY2NSA5MTAyLzEyMDUzLzM2NjUKK2YgOTEwOC8xMjA1OS8zNjY2IDk0MDEvMTIwNTkvMzY2NiA5Mzk1LzEyMzAzLzM2NjYKK2YgOTM5NS8xMjMwMy8zNjI2IDkxMTMvMTIwNjIvMzYyNiA5MTA4LzEyMDU5LzM2MjYKK2YgOTExMi8xMjA2My8zNjY3IDk0MDYvMTIwNjMvMzY2NyA5NDA0LzEyMDU2LzM2NjcKK2YgOTQwNC8xMjA1Ni8zNTg2IDkxMDcvMTIwNTYvMzU4NiA5MTEyLzEyMDYzLzM1ODYKK2YgOTEwNC8xMjA1NS8zMzMzIDkzOTcvMTIzMDUvMzMzMyA5MzgzLzEyMjk0LzMzMzMKK2YgOTM4My8xMjI5NC8zMzYyIDkwODUvMTIwMzQvMzM2MiA5MTA0LzEyMDU1LzMzNjIKK2YgOTA4Ny8xMjAzOC8zNDE1IDkzODUvMTIyOTgvMzQxNSA5NDAyLzEyMzA3LzM0MTUKK2YgOTQwMi8xMjMwNy8zMzkwIDkxMDkvMTIwNTgvMzM5MCA5MDg3LzEyMDM4LzMzOTAKK2YgOTEyMC8xMjA3MC8zMzQ0IDk0MDcvMTIzMDkvMzM0NCA5MzkzLzEyMzAxLzMzNDQKK2YgOTM5My8xMjMwMS8zMzY1IDkwOTcvMTIwNDkvMzM2NSA5MTIwLzEyMDcwLzMzNjUKK2YgOTEwMC8xMjA1MC8zMzY2IDkzOTQvMTIzMDIvMzM2NiA5NDA4LzEyMzEwLzMzNjYKK2YgOTQwOC8xMjMxMC8zMzM1IDkxMjMvMTIwNzMvMzMzNSA5MTAwLzEyMDUwLzMzMzUKK2YgOTEyMS8xMjA2OS8zNjExIDk0MDkvMTIwNjkvMzYxMSA5NDA3LzEyMzA5LzM2MTEKK2YgOTQwNy8xMjMwOS8zNjMwIDkxMjAvMTIwNzAvMzYzMCA5MTIxLzEyMDY5LzM2MzAKK2YgOTExOS8xMjA3MS8zNTg5IDk0MTEvMTIzMTEvMzU4OSA5NDEwLzEyMzEyLzM1ODkKK2YgOTQxMC8xMjMxMi8zNjMyIDkxMTgvMTIwNjgvMzYzMiA5MTE5LzEyMDcxLzM2MzIKK2YgOTEyMy8xMjA3My8zNjMzIDk0MDgvMTIzMTAvMzYzMyA5NDA5LzEyMDY5LzM2MzMKK2YgOTQwOS8xMjA2OS8zNjY4IDkxMjEvMTIwNjkvMzY2OCA5MTIzLzEyMDczLzM2NjgKK2YgOTExOC8xMjA2OC8zNjY5IDk0MTAvMTIzMTIvMzY2OSA5NDEyLzEyMDcyLzM2NjkKK2YgOTQxMi8xMjA3Mi8zNjYyIDkxMjIvMTIwNzIvMzY2MiA5MTE4LzEyMDY4LzM2NjIKK2YgOTEzNS8xMjA4NC8zMzc1IDk0MTMvMTIwODQvMzM3NSA5NDA2LzEyMDYzLzMzNzUKK2YgOTQwNi8xMjA2My8zNDY5IDkxMTIvMTIwNjMvMzQ2OSA5MTM1LzEyMDg0LzM0NjkKK2YgOTExMS8xMjA2MC8zMzM0IDk0MDUvMTIwNjAvMzMzNCA5NDE0LzEyMDgzLzMzMzQKK2YgOTQxNC8xMjA4My8zMzM1IDkxMzIvMTIwODMvMzMzNSA5MTExLzEyMDYwLzMzMzUKK2YgOTEyNy8xMjA3Ni8zNjUxIDk0MTYvMTIzMTMvMzY1MSA5NDE1LzEyMzE0LzM2NTEKK2YgOTQxNS8xMjMxNC8zNTk3IDkxMjYvMTIwNzcvMzU5NyA5MTI3LzEyMDc2LzM1OTcKK2YgOTEyNS8xMjA3NC8zNTczIDk0MTgvMTIzMTUvMzU3MyA5NDE3LzEyMzE2LzM1NzMKK2YgOTQxNy8xMjMxNi8zNjcwIDkxMjQvMTIwNzUvMzY3MCA5MTI1LzEyMDc0LzM2NzAKK2YgOTEzMS8xMjA4MC8zNjIxIDk0MjAvMTIzMTcvMzYyMSA5NDE5LzEyMzE4LzM2MjEKK2YgOTQxOS8xMjMxOC8zNjU0IDkxMzAvMTIwODEvMzY1NCA5MTMxLzEyMDgwLzM2NTQKK2YgOTEyOS8xMjA3OC8zNjIyIDk0MjIvMTIzMTkvMzYyMiA5NDIxLzEyMzIwLzM2MjIKK2YgOTQyMS8xMjMyMC8zNjcxIDkxMjgvMTIwNzkvMzY3MSA5MTI5LzEyMDc4LzM2NzEKK2YgOTEzMi8xMjA4My8zNjIzIDk0MTQvMTIwODMvMzYyMyA5NDE2LzEyMzEzLzM2MjMKK2YgOTQxNi8xMjMxMy8zNjIzIDkxMjcvMTIwNzYvMzYyMyA5MTMyLzEyMDgzLzM2MjMKK2YgOTEyNC8xMjA3NS8zNTgxIDk0MTcvMTIzMTYvMzU4MSA5NDIzLzEyMDgyLzM1ODEKK2YgOTQyMy8xMjA4Mi8zNjcyIDkxMzMvMTIwODIvMzY3MiA5MTI0LzEyMDc1LzM2NzIKK2YgOTEzMC8xMjA4MS8zNjI1IDk0MTkvMTIzMTgvMzYyNSA5NDEzLzEyMDg0LzM2MjUKK2YgOTQxMy8xMjA4NC8zNjczIDkxMzUvMTIwODQvMzY3MyA5MTMwLzEyMDgxLzM2NzMKK2YgOTEzNC8xMjA4NS8zNTg1IDk0MjQvMTIwODUvMzU4NSA5NDIyLzEyMzE5LzM1ODUKK2YgOTQyMi8xMjMxOS8zNjc0IDkxMjkvMTIwNzgvMzY3NCA5MTM0LzEyMDg1LzM2NzQKK2YgOTEyNi8xMjA3Ny8zMzYyIDk0MTUvMTIzMTQvMzM2MiA5NDAwLzEyMzA2LzMzNjIKK2YgOTQwMC8xMjMwNi8zMzYyIDkxMDMvMTIwNTIvMzM2MiA5MTI2LzEyMDc3LzMzNjIKK2YgOTEwNi8xMjA1Ny8zMzg5IDk0MDMvMTIzMDgvMzM4OSA5NDIwLzEyMzE3LzMzODkKK2YgOTQyMC8xMjMxNy8zNjEwIDkxMzEvMTIwODAvMzYxMCA5MTA2LzEyMDU3LzM2MTAKK2YgOTE0Mi8xMjA5Mi8zMzY1IDk0MjUvMTIzMjEvMzM2NSA5NDExLzEyMzExLzMzNjUKK2YgOTQxMS8xMjMxMS8zMzY1IDkxMTkvMTIwNzEvMzM2NSA5MTQyLzEyMDkyLzMzNjUKK2YgOTEyMi8xMjA3Mi8zNDYwIDk0MTIvMTIwNzIvMzQ2MCA5NDI2LzEyMDk1LzM0NjAKK2YgOTQyNi8xMjA5NS8zMzQ2IDkxNDUvMTIwOTUvMzM0NiA5MTIyLzEyMDcyLzMzNDYKK2YgOTE0My8xMjA5MS8zNjc1IDk0MjcvMTIzMjIvMzY3NSA5NDI1LzEyMzIxLzM2NzUKK2YgOTQyNS8xMjMyMS8zNjMwIDkxNDIvMTIwOTIvMzYzMCA5MTQzLzEyMDkxLzM2MzAKK2YgOTE0MS8xMjA5My8zNjc2IDk0MjkvMTIzMjMvMzY3NiA5NDI4LzEyMzI0LzM2NzYKK2YgOTQyOC8xMjMyNC8zNjc3IDkxNDAvMTIwOTAvMzY3NyA5MTQxLzEyMDkzLzM2NzcKK2YgOTE0NS8xMjA5NS8zNjE1IDk0MjYvMTIwOTUvMzYxNSA5NDI3LzEyMzIyLzM2MTUKK2YgOTQyNy8xMjMyMi8zNjE2IDkxNDMvMTIwOTEvMzYxNiA5MTQ1LzEyMDk1LzM2MTYKK2YgOTE0MC8xMjA5MC8zNjYyIDk0MjgvMTIzMjQvMzY2MiA5NDMwLzEyMDk0LzM2NjIKK2YgOTQzMC8xMjA5NC8zNTk0IDkxNDQvMTIwOTQvMzU5NCA5MTQwLzEyMDkwLzM1OTQKK2YgOTE1Ny8xMjEwNi8zMzc1IDk0MzEvMTIzMjUvMzM3NSA5NDI0LzEyMDg1LzMzNzUKK2YgOTQyNC8xMjA4NS8zMzc1IDkxMzQvMTIwODUvMzM3NSA5MTU3LzEyMTA2LzMzNzUKK2YgOTEzMy8xMjA4Mi8zMzM0IDk0MjMvMTIwODIvMzMzNCA5NDMyLzEyMzI2LzMzMzQKK2YgOTQzMi8xMjMyNi8zNTk1IDkxNTQvMTIxMDUvMzU5NSA5MTMzLzEyMDgyLzM1OTUKK2YgOTE0OS8xMjA5OC8zNTk2IDk0MzQvMTIzMjcvMzU5NiA5NDMzLzEyMzI4LzM1OTYKK2YgOTQzMy8xMjMyOC8zNTk3IDkxNDgvMTIwOTkvMzU5NyA5MTQ5LzEyMDk4LzM1OTcKK2YgOTE0Ny8xMjA5Ni8zNjcwIDk0MzYvMTIzMjkvMzY3MCA5NDM1LzEyMDk3LzM2NzAKK2YgOTQzNS8xMjA5Ny8zNTk4IDkxNDYvMTIwOTcvMzU5OCA5MTQ3LzEyMDk2LzM1OTgKK2YgOTE1My8xMjEwMi8zNjc4IDk0MzgvMTIzMzAvMzY3OCA5NDM3LzEyMzMxLzM2NzgKK2YgOTQzNy8xMjMzMS8zNjYzIDkxNTIvMTIxMDMvMzY2MyA5MTUzLzEyMTAyLzM2NjMKK2YgOTE1MS8xMjEwMC8zNTc3IDk0NDAvMTIxMDAvMzU3NyA5NDM5LzEyMzMyLzM1NzcKK2YgOTQzOS8xMjMzMi8zNjc5IDkxNTAvMTIxMDEvMzY3OSA5MTUxLzEyMTAwLzM2NzkKK2YgOTE1NC8xMjEwNS8zNjgwIDk0MzIvMTIzMjYvMzY4MCA5NDM0LzEyMzI3LzM2ODAKK2YgOTQzNC8xMjMyNy8zNjgxIDkxNDkvMTIwOTgvMzY4MSA5MTU0LzEyMTA1LzM2ODEKK2YgOTE0Ni8xMjA5Ny8zNjgyIDk0MzUvMTIwOTcvMzY4MiA5NDQxLzEyMzMzLzM2ODIKK2YgOTQ0MS8xMjMzMy8zNjgzIDkxNTUvMTIxMDQvMzY4MyA5MTQ2LzEyMDk3LzM2ODMKK2YgOTE1Mi8xMjEwMy8zNjg0IDk0MzcvMTIzMzEvMzY4NCA5NDMxLzEyMzI1LzM2ODQKK2YgOTQzMS8xMjMyNS8zNjg1IDkxNTcvMTIxMDYvMzY4NSA5MTUyLzEyMTAzLzM2ODUKK2YgOTE1Ni8xMjEwNy8zNjg2IDk0NDIvMTIzMzQvMzY4NiA5NDQwLzEyMTAwLzM2ODYKK2YgOTQ0MC8xMjEwMC8zNjg3IDkxNTEvMTIxMDAvMzY4NyA5MTU2LzEyMTA3LzM2ODcKK2YgOTE0OC8xMjA5OS8zNDM0IDk0MzMvMTIzMjgvMzQzNCA5NDE4LzEyMzE1LzM0MzQKK2YgOTQxOC8xMjMxNS8zMzYyIDkxMjUvMTIwNzQvMzM2MiA5MTQ4LzEyMDk5LzMzNjIKK2YgOTEyOC8xMjA3OS8zMzkwIDk0MjEvMTIzMjAvMzM5MCA5NDM4LzEyMzMwLzMzOTAKK2YgOTQzOC8xMjMzMC8zMzkwIDkxNTMvMTIxMDIvMzM5MCA5MTI4LzEyMDc5LzMzOTAKK2YgOTE2NC8xMjExNC8zNDU4IDk0NDMvMTIzMzUvMzQ1OCA5NDI5LzEyMzIzLzM0NTgKK2YgOTQyOS8xMjMyMy8zMzk1IDkxNDEvMTIwOTMvMzM5NSA5MTY0LzEyMTE0LzMzOTUKK2YgOTE0NC8xMjA5NC8zNDYwIDk0MzAvMTIwOTQvMzQ2MCA5NDQ0LzEyMzM2LzM0NjAKK2YgOTQ0NC8xMjMzNi8zNjg4IDkxNjcvMTIxMTcvMzY4OCA5MTQ0LzEyMDk0LzM2ODgKK2YgOTE2NS8xMjExMy8zNjg5IDk0NDUvMTIxMTMvMzY4OSA5NDQzLzEyMzM1LzM2ODkKK2YgOTQ0My8xMjMzNS8zNjkwIDkxNjQvMTIxMTQvMzY5MCA5MTY1LzEyMTEzLzM2OTAKK2YgOTE2My8xMjExNS8zNjkxIDk0NDcvMTIzMzcvMzY5MSA5NDQ2LzEyMzM4LzM2OTEKK2YgOTQ0Ni8xMjMzOC8zNjkyIDkxNjIvMTIxMTIvMzY5MiA5MTYzLzEyMTE1LzM2OTIKK2YgOTE2Ny8xMjExNy8zNjkzIDk0NDQvMTIzMzYvMzY5MyA5NDQ1LzEyMTEzLzM2OTMKK2YgOTQ0NS8xMjExMy8zNjk0IDkxNjUvMTIxMTMvMzY5NCA5MTY3LzEyMTE3LzM2OTQKK2YgOTE2Mi8xMjExMi8zNjk1IDk0NDYvMTIzMzgvMzY5NSA5NDQ4LzEyMTE2LzM2OTUKK2YgOTQ0OC8xMjExNi8zNjk2IDkxNjYvMTIxMTYvMzY5NiA5MTYyLzEyMTEyLzM2OTYKK2YgOTE3OS8xMjEyOC8zMzk1IDk0NDkvMTIxMjgvMzM5NSA5NDQyLzEyMzM0LzMzOTUKK2YgOTQ0Mi8xMjMzNC8zNjk3IDkxNTYvMTIxMDcvMzY5NyA5MTc5LzEyMTI4LzM2OTcKK2YgOTE1NS8xMjEwNC8zMzc2IDk0NDEvMTIzMzMvMzM3NiA5NDUwLzEyMTI3LzMzNzYKK2YgOTQ1MC8xMjEyNy8zMzQ1IDkxNzYvMTIxMjcvMzM0NSA5MTU1LzEyMTA0LzMzNDUKK2YgOTE3MS8xMjEyMC8zNjE5IDk0NTIvMTIzMzkvMzYxOSA5NDUxLzEyMzQwLzM2MTkKK2YgOTQ1MS8xMjM0MC8zNDgwIDkxNzAvMTIxMjEvMzQ4MCA5MTcxLzEyMTIwLzM0ODAKK2YgOTE2OS8xMjExOC8zNjk4IDk0NTQvMTIzNDEvMzY5OCA5NDUzLzEyMzQyLzM2OTgKK2YgOTQ1My8xMjM0Mi8zNjk5IDkxNjgvMTIxMTkvMzY5OSA5MTY5LzEyMTE4LzM2OTkKK2YgOTE3NS8xMjEyNC8zNjIxIDk0NTYvMTIzNDMvMzYyMSA5NDU1LzEyMzQ0LzM2MjEKK2YgOTQ1NS8xMjM0NC8zNjU0IDkxNzQvMTIxMjUvMzY1NCA5MTc1LzEyMTI0LzM2NTQKK2YgOTE3My8xMjEyMi8zNzAwIDk0NTgvMTIzNDUvMzcwMCA5NDU3LzEyMzQ2LzM3MDAKK2YgOTQ1Ny8xMjM0Ni8zNTQxIDkxNzIvMTIxMjMvMzU0MSA5MTczLzEyMTIyLzM1NDEKK2YgOTE3Ni8xMjEyNy8zNzAxIDk0NTAvMTIxMjcvMzcwMSA5NDUyLzEyMzM5LzM3MDEKK2YgOTQ1Mi8xMjMzOS8zNjIzIDkxNzEvMTIxMjAvMzYyMyA5MTc2LzEyMTI3LzM2MjMKK2YgOTE2OC8xMjExOS8zNzAyIDk0NTMvMTIzNDIvMzcwMiA5NDU5LzEyMTI2LzM3MDIKK2YgOTQ1OS8xMjEyNi8zNjc5IDkxNzcvMTIxMjYvMzY3OSA5MTY4LzEyMTE5LzM2NzkKK2YgOTE3NC8xMjEyNS8zNzAzIDk0NTUvMTIzNDQvMzcwMyA5NDQ5LzEyMTI4LzM3MDMKK2YgOTQ0OS8xMjEyOC8zNzA0IDkxNzkvMTIxMjgvMzcwNCA5MTc0LzEyMTI1LzM3MDQKK2YgOTE3OC8xMjEyOS8zNzA1IDk0NjAvMTIxMjkvMzcwNSA5NDU4LzEyMzQ1LzM3MDUKK2YgOTQ1OC8xMjM0NS8zNzA2IDkxNzMvMTIxMjIvMzcwNiA5MTc4LzEyMTI5LzM3MDYKK2YgOTE3MC8xMjEyMS8zNDc4IDk0NTEvMTIzNDAvMzQ3OCA5NDM2LzEyMzI5LzM0NzgKK2YgOTQzNi8xMjMyOS8zNzA3IDkxNDcvMTIwOTYvMzcwNyA5MTcwLzEyMTIxLzM3MDcKK2YgOTE1MC8xMjEwMS8zMzkwIDk0MzkvMTIzMzIvMzM5MCA5NDU2LzEyMzQzLzMzOTAKK2YgOTQ1Ni8xMjM0My8zMzkwIDkxNzUvMTIxMjQvMzM5MCA5MTUwLzEyMTAxLzMzOTAKK2YgOTE4Ni8xMjEzNi8zMjM4IDk0NjEvMTIzNDcvMzIzOCA5NDQ3LzEyMzM3LzMyMzgKK2YgOTQ0Ny8xMjMzNy8zMjM4IDkxNjMvMTIxMTUvMzIzOCA5MTg2LzEyMTM2LzMyMzgKK2YgOTE2Ni8xMjExNi8zNDYwIDk0NDgvMTIxMTYvMzQ2MCA5NDYyLzEyMTM5LzM0NjAKK2YgOTQ2Mi8xMjEzOS8zNjg4IDkxODkvMTIxMzkvMzY4OCA5MTY2LzEyMTE2LzM2ODgKK2YgOTE4Ny8xMjEzNS8zNzA4IDk0NjMvMTIzNDgvMzcwOCA5NDYxLzEyMzQ3LzM3MDgKK2YgOTQ2MS8xMjM0Ny8zNzA5IDkxODYvMTIxMzYvMzcwOSA5MTg3LzEyMTM1LzM3MDkKK2YgOTE4NS8xMjEzNy8zMzQ3IDk0NjUvMTIzNDkvMzM0NyA5NDY0LzEyMzUwLzMzNDcKK2YgOTQ2NC8xMjM1MC8zNzEwIDkxODQvMTIxMzQvMzcxMCA5MTg1LzEyMTM3LzM3MTAKK2YgOTE4OS8xMjEzOS8zNjE1IDk0NjIvMTIxMzkvMzYxNSA5NDYzLzEyMzQ4LzM2MTUKK2YgOTQ2My8xMjM0OC8zNjQwIDkxODcvMTIxMzUvMzY0MCA5MTg5LzEyMTM5LzM2NDAKK2YgOTE4NC8xMjEzNC8zNzExIDk0NjQvMTIzNTAvMzcxMSA5NDY2LzEyMTM4LzM3MTEKK2YgOTQ2Ni8xMjEzOC8zNzEyIDkxODgvMTIxMzgvMzcxMiA5MTg0LzEyMTM0LzM3MTIKK2YgOTIwMS8xMjE1MC8zMzk1IDk0NjcvMTIxNTAvMzM5NSA5NDYwLzEyMTI5LzMzOTUKK2YgOTQ2MC8xMjEyOS8zMzQzIDkxNzgvMTIxMjkvMzM0MyA5MjAxLzEyMTUwLzMzNDMKK2YgOTE3Ny8xMjEyNi8zMzc2IDk0NTkvMTIxMjYvMzM3NiA5NDY4LzEyMTQ5LzMzNzYKK2YgOTQ2OC8xMjE0OS8zMzc2IDkxOTgvMTIxNDkvMzM3NiA5MTc3LzEyMTI2LzMzNzYKK2YgOTE5My8xMjE0Mi8zNzEzIDk0NzAvMTIzNTEvMzcxMyA5NDY5LzEyMzUyLzM3MTMKK2YgOTQ2OS8xMjM1Mi8zNzE0IDkxOTIvMTIxNDMvMzcxNCA5MTkzLzEyMTQyLzM3MTQKK2YgOTE5MS8xMjE0MC8zNzE1IDk0NzIvMTIzNTMvMzcxNSA5NDcxLzEyMzU0LzM3MTUKK2YgOTQ3MS8xMjM1NC8zNzE2IDkxOTAvMTIxNDEvMzcxNiA5MTkxLzEyMTQwLzM3MTYKK2YgOTE5Ny8xMjE0Ni8zNzE3IDk0NzQvMTIzNTUvMzcxNyA5NDczLzEyMzU2LzM3MTcKK2YgOTQ3My8xMjM1Ni8zNzE4IDkxOTYvMTIxNDcvMzcxOCA5MTk3LzEyMTQ2LzM3MTgKK2YgOTE5NS8xMjE0NC8zMzIzIDk0NzYvMTIzNTcvMzMyMyA5NDc1LzEyMzU4LzMzMjMKK2YgOTQ3NS8xMjM1OC8zNzE5IDkxOTQvMTIxNDUvMzcxOSA5MTk1LzEyMTQ0LzM3MTkKK2YgOTE5OC8xMjE0OS8zNzIwIDk0NjgvMTIxNDkvMzcyMCA5NDcwLzEyMzUxLzM3MjAKK2YgOTQ3MC8xMjM1MS8zNzIxIDkxOTMvMTIxNDIvMzcyMSA5MTk4LzEyMTQ5LzM3MjEKK2YgOTE5MC8xMjE0MS8zNzIyIDk0NzEvMTIzNTQvMzcyMiA5NDc3LzEyMzU5LzM3MjIKK2YgOTQ3Ny8xMjM1OS8zNzIyIDkxOTkvMTIxNDgvMzcyMiA5MTkwLzEyMTQxLzM3MjIKK2YgOTE5Ni8xMjE0Ny8zNzIzIDk0NzMvMTIzNTYvMzcyMyA5NDY3LzEyMTUwLzM3MjMKK2YgOTQ2Ny8xMjE1MC8zNzI0IDkyMDEvMTIxNTAvMzcyNCA5MTk2LzEyMTQ3LzM3MjQKK2YgOTIwMC8xMjE1MS8zNzI1IDk0NzgvMTIzNjAvMzcyNSA5NDc2LzEyMzU3LzM3MjUKK2YgOTQ3Ni8xMjM1Ny8zNzI2IDkxOTUvMTIxNDQvMzcyNiA5MjAwLzEyMTUxLzM3MjYKK2YgOTE5Mi8xMjE0My8zNDc4IDk0NjkvMTIzNTIvMzQ3OCA5NDU0LzEyMzQxLzM0NzgKK2YgOTQ1NC8xMjM0MS8zMzYxIDkxNjkvMTIxMTgvMzM2MSA5MTkyLzEyMTQzLzMzNjEKK2YgOTE3Mi8xMjEyMy8zMzkwIDk0NTcvMTIzNDYvMzM5MCA5NDc0LzEyMzU1LzMzOTAKK2YgOTQ3NC8xMjM1NS8zMzg5IDkxOTcvMTIxNDYvMzM4OSA5MTcyLzEyMTIzLzMzODkKK2YgOTIwOC8xMjE1OC8zMzk1IDk0NzkvMTIzNjEvMzM5NSA5NDY1LzEyMzQ5LzMzOTUKK2YgOTQ2NS8xMjM0OS8zMzQ0IDkxODUvMTIxMzcvMzM0NCA5MjA4LzEyMTU4LzMzNDQKK2YgOTE4OC8xMjEzOC8zMzY2IDk0NjYvMTIxMzgvMzM2NiA5NDgwLzEyMTYxLzMzNjYKK2YgOTQ4MC8xMjE2MS8zNDU5IDkyMTEvMTIxNjEvMzQ1OSA5MTg4LzEyMTM4LzM0NTkKK2YgOTIwOS8xMjE1Ny8zNzI3IDk0ODEvMTIxNTcvMzcyNyA5NDc5LzEyMzYxLzM3MjcKK2YgOTQ3OS8xMjM2MS8zNzI4IDkyMDgvMTIxNTgvMzcyOCA5MjA5LzEyMTU3LzM3MjgKK2YgOTIwNy8xMjE1OS8zNzI5IDk0ODMvMTIzNjIvMzcyOSA5NDgyLzEyMTU2LzM3MjkKK2YgOTQ4Mi8xMjE1Ni8zNzMwIDkyMDYvMTIxNTYvMzczMCA5MjA3LzEyMTU5LzM3MzAKK2YgOTIxMS8xMjE2MS8zNzMxIDk0ODAvMTIxNjEvMzczMSA5NDgxLzEyMTU3LzM3MzEKK2YgOTQ4MS8xMjE1Ny8zNzMyIDkyMDkvMTIxNTcvMzczMiA5MjExLzEyMTYxLzM3MzIKK2YgOTIwNi8xMjE1Ni8zNzMzIDk0ODIvMTIxNTYvMzczMyA5NDg0LzEyMzYzLzM3MzMKK2YgOTQ4NC8xMjM2My8zNzM0IDkyMTAvMTIxNjAvMzczNCA5MjA2LzEyMTU2LzM3MzQKK2YgOTIyMy8xMjE3Mi8zMzc1IDk0ODUvMTIxNzIvMzM3NSA5NDc4LzEyMzYwLzMzNzUKK2YgOTQ3OC8xMjM2MC8zMzk1IDkyMDAvMTIxNTEvMzM5NSA5MjIzLzEyMTcyLzMzOTUKK2YgOTE5OS8xMjE0OC8zMzQ2IDk0NzcvMTIzNTkvMzM0NiA5NDg2LzEyMTcxLzMzNDYKK2YgOTQ4Ni8xMjE3MS8zNDcwIDkyMjAvMTIxNzEvMzQ3MCA5MTk5LzEyMTQ4LzM0NzAKK2YgOTIxNS8xMjE2NC8zNzM1IDk0ODgvMTIzNjQvMzczNSA5NDg3LzEyMzY1LzM3MzUKK2YgOTQ4Ny8xMjM2NS8zNzM2IDkyMTQvMTIxNjUvMzczNiA5MjE1LzEyMTY0LzM3MzYKK2YgOTIxMy8xMjE2Mi8zNTMzIDk0OTAvMTIzNjYvMzUzMyA5NDg5LzEyMzY3LzM1MzMKK2YgOTQ4OS8xMjM2Ny8zNTMzIDkyMTIvMTIxNjMvMzUzMyA5MjEzLzEyMTYyLzM1MzMKK2YgOTIxOS8xMjE2OC8zNzM3IDk0OTIvMTIzNjgvMzczNyA5NDkxLzEyMzY5LzM3MzcKK2YgOTQ5MS8xMjM2OS8zNzM4IDkyMTgvMTIxNjkvMzczOCA5MjE5LzEyMTY4LzM3MzgKK2YgOTIxNy8xMjE2Ni8zNTQxIDk0OTQvMTIzNzAvMzU0MSA5NDkzLzEyMzcxLzM1NDEKK2YgOTQ5My8xMjM3MS8zNTM3IDkyMTYvMTIxNjcvMzUzNyA5MjE3LzEyMTY2LzM1MzcKK2YgOTIyMC8xMjE3MS8zNzM5IDk0ODYvMTIxNzEvMzczOSA5NDg4LzEyMzY0LzM3MzkKK2YgOTQ4OC8xMjM2NC8zNzQwIDkyMTUvMTIxNjQvMzc0MCA5MjIwLzEyMTcxLzM3NDAKK2YgOTIxMi8xMjE2My8zNzQxIDk0ODkvMTIzNjcvMzc0MSA5NDk1LzEyMzcyLzM3NDEKK2YgOTQ5NS8xMjM3Mi8zNzQyIDkyMjEvMTIxNzAvMzc0MiA5MjEyLzEyMTYzLzM3NDIKK2YgOTIxOC8xMjE2OS8zNzQzIDk0OTEvMTIzNjkvMzc0MyA5NDg1LzEyMTcyLzM3NDMKK2YgOTQ4NS8xMjE3Mi8zNzQ0IDkyMjMvMTIxNzIvMzc0NCA5MjE4LzEyMTY5LzM3NDQKK2YgOTIyMi8xMjE3My8zNTQ0IDk0OTYvMTIzNzMvMzU0NCA5NDk0LzEyMzcwLzM1NDQKK2YgOTQ5NC8xMjM3MC8zNzQ1IDkyMTcvMTIxNjYvMzc0NSA5MjIyLzEyMTczLzM3NDUKK2YgOTIxNC8xMjE2NS8zNDM0IDk0ODcvMTIzNjUvMzQzNCA5NDcyLzEyMzUzLzM0MzQKK2YgOTQ3Mi8xMjM1My8zNzQ2IDkxOTEvMTIxNDAvMzc0NiA5MjE0LzEyMTY1LzM3NDYKK2YgOTE5NC8xMjE0NS8zMzY0IDk0NzUvMTIzNTgvMzM2NCA5NDkyLzEyMzY4LzMzNjQKK2YgOTQ5Mi8xMjM2OC8zMzkwIDkyMTkvMTIxNjgvMzM5MCA5MTk0LzEyMTQ1LzMzOTAKK2YgOTIzMC8xMjE4MC8zNzQ3IDk0OTcvMTIzNzQvMzc0NyA5NDgzLzEyMzYyLzM3NDcKK2YgOTQ4My8xMjM2Mi8zNzQ3IDkyMDcvMTIxNTkvMzc0NyA5MjMwLzEyMTgwLzM3NDcKK2YgOTIxMC8xMjE2MC8zNDU5IDk0ODQvMTIzNjMvMzQ1OSA5NDk4LzEyMTgzLzM0NTkKK2YgOTQ5OC8xMjE4My8zMzY2IDkyMzMvMTIxODMvMzM2NiA5MjEwLzEyMTYwLzMzNjYKK2YgOTIzMS8xMjE3OS8zNzQ4IDk0OTkvMTIzNzUvMzc0OCA5NDk3LzEyMzc0LzM3NDgKK2YgOTQ5Ny8xMjM3NC8zNzQ5IDkyMzAvMTIxODAvMzc0OSA5MjMxLzEyMTc5LzM3NDkKK2YgOTIyOS8xMjE4MS8zNzUwIDk1MDEvMTIzNzYvMzc1MCA5NTAwLzEyMzc3LzM3NTAKK2YgOTUwMC8xMjM3Ny8zNTY3IDkyMjgvMTIxNzgvMzU2NyA5MjI5LzEyMTgxLzM1NjcKK2YgOTIzMy8xMjE4My8zNzUxIDk0OTgvMTIxODMvMzc1MSA5NDk5LzEyMzc1LzM3NTEKK2YgOTQ5OS8xMjM3NS8zNzUyIDkyMzEvMTIxNzkvMzc1MiA5MjMzLzEyMTgzLzM3NTIKK2YgOTIyOC8xMjE3OC8zNTQ5IDk1MDAvMTIzNzcvMzU0OSA5NTAyLzEyMzc4LzM1NDkKK2YgOTUwMi8xMjM3OC8zNTY1IDkyMzIvMTIxODIvMzU2NSA5MjI4LzEyMTc4LzM1NjUKK2YgOTI1MS8xMjIwMC8zMzc1IDk1MDMvMTIzNzkvMzM3NSA5NDk2LzEyMzczLzMzNzUKK2YgOTQ5Ni8xMjM3My8zMzQzIDkyMjIvMTIxNzMvMzM0MyA5MjUxLzEyMjAwLzMzNDMKK2YgOTI0OS8xMjE5OC8zNTk1IDk1MDUvMTIxOTgvMzU5NSA5NTA0LzEyMjM5LzM1OTUKK2YgOTUwNC8xMjIzOS8zMzc2IDkyOTcvMTIyMzkvMzM3NiA5MjQ5LzEyMTk4LzMzNzYKK2YgOTIzNy8xMjE4Ni8zNzUzIDk1MDcvMTIzODAvMzc1MyA5NTA2LzEyMzgxLzM3NTMKK2YgOTUwNi8xMjM4MS8zNTY3IDkyMzYvMTIxODcvMzU2NyA5MjM3LzEyMTg2LzM1NjcKK2YgOTIzNS8xMjE4NC8zNTQ1IDk1MDkvMTIxODQvMzU0NSA5NTA4LzEyMzgyLzM1NDUKK2YgOTUwOC8xMjM4Mi8zNTI2IDkyMzQvMTIxODUvMzUyNiA5MjM1LzEyMTg0LzM1MjYKK2YgOTIzNi8xMjE4Ny8zNTQ5IDk1MDYvMTIzODEvMzU0OSA5NTEwLzEyMTg4LzM1NDkKK2YgOTUxMC8xMjE4OC8zNTUwIDkyMzkvMTIxODgvMzU1MCA5MjM2LzEyMTg3LzM1NTAKK2YgOTIzOC8xMjE4OS8zNTM1IDk1MTEvMTIzODMvMzUzNSA5NTA5LzEyMTg0LzM1MzUKK2YgOTUwOS8xMjE4NC8zNTI5IDkyMzUvMTIxODQvMzUyOSA5MjM4LzEyMTg5LzM1MjkKK2YgOTI4OS8xMjIzMi8zMzk1IDk1MTMvMTIyMzIvMzM5NSA5NTEyLzEyMjAxLzMzOTUKK2YgOTUxMi8xMjIwMS8zMzk1IDkyNTAvMTIyMDEvMzM5NSA5Mjg5LzEyMjMyLzMzOTUKK2YgOTIyMS8xMjE3MC8zMzc2IDk0OTUvMTIzNzIvMzM3NiA5NTE0LzEyMzg0LzMzNzYKK2YgOTUxNC8xMjM4NC8zMzc2IDkyNDgvMTIxOTkvMzM3NiA5MjIxLzEyMTcwLzMzNzYKK2YgOTI0My8xMjE5Mi8zNTA5IDk1MTYvMTIxOTIvMzUwOSA5NTE1LzEyMzg1LzM1MDkKK2YgOTUxNS8xMjM4NS8zNTA5IDkyNDIvMTIxOTMvMzUwOSA5MjQzLzEyMTkyLzM1MDkKK2YgOTI0MS8xMjE5MC8zNTY4IDk1MTgvMTIzODYvMzU2OCA5NTE3LzEyMzg3LzM1NjgKK2YgOTUxNy8xMjM4Ny8zNTY0IDkyNDAvMTIxOTEvMzU2NCA5MjQxLzEyMTkwLzM1NjQKK2YgOTI0Ny8xMjE5Ni8zNzU0IDk1MjAvMTIzODgvMzc1NCA5NTE5LzEyMTk3LzM3NTQKK2YgOTUxOS8xMjE5Ny8zNTEzIDkyNDYvMTIxOTcvMzUxMyA5MjQ3LzEyMTk2LzM1MTMKK2YgOTI0NS8xMjE5NC8zNzU1IDk1MjIvMTIzODkvMzc1NSA5NTIxLzEyMzkwLzM3NTUKK2YgOTUyMS8xMjM5MC8zNTQ2IDkyNDQvMTIxOTUvMzU0NiA5MjQ1LzEyMTk0LzM1NDYKK2YgOTI0OC8xMjE5OS8zNTU2IDk1MTQvMTIzODQvMzU1NiA5NTE2LzEyMTkyLzM1NTYKK2YgOTUxNi8xMjE5Mi8zNTEzIDkyNDMvMTIxOTIvMzUxMyA5MjQ4LzEyMTk5LzM1MTMKK2YgOTI0MC8xMjE5MS8zNzU2IDk1MTcvMTIzODcvMzc1NiA5NTA1LzEyMTk4LzM3NTYKK2YgOTUwNS8xMjE5OC8zNTQ5IDkyNDkvMTIxOTgvMzU0OSA5MjQwLzEyMTkxLzM1NDkKK2YgOTI0Ni8xMjE5Ny8zNTE4IDk1MTkvMTIxOTcvMzUxOCA5NTAzLzEyMzc5LzM1MTgKK2YgOTUwMy8xMjM3OS8zNTE5IDkyNTEvMTIyMDAvMzUxOSA5MjQ2LzEyMTk3LzM1MTkKK2YgOTI1MC8xMjIwMS8zNTMzIDk1MTIvMTIyMDEvMzUzMyA5NTIyLzEyMzg5LzM1MzMKK2YgOTUyMi8xMjM4OS8zNTQ3IDkyNDUvMTIxOTQvMzU0NyA5MjUwLzEyMjAxLzM1NDcKK2YgOTI0Mi8xMjE5My8zNDc4IDk1MTUvMTIzODUvMzQ3OCA5NDkwLzEyMzY2LzM0NzgKK2YgOTQ5MC8xMjM2Ni8zMzYyIDkyMTMvMTIxNjIvMzM2MiA5MjQyLzEyMTkzLzMzNjIKK2YgOTI1My8xMjIwMy8zNDM0IDk1MjMvMTIzOTEvMzQzNCA5NTE4LzEyMzg2LzM0MzQKK2YgOTUxOC8xMjM4Ni8zMzYyIDkyNDEvMTIxOTAvMzM2MiA5MjUzLzEyMjAzLzMzNjIKK2YgOTI0NC8xMjE5NS8zNDE1IDk1MjEvMTIzOTAvMzQxNSA5NTI0LzEyMzkyLzM0MTUKK2YgOTUyNC8xMjM5Mi8zMzY0IDkyNTgvMTIyMDYvMzM2NCA5MjQ0LzEyMTk1LzMzNjQKK2YgOTIxNi8xMjE2Ny8zMzg5IDk0OTMvMTIzNzEvMzM4OSA5NTIwLzEyMzg4LzMzODkKK2YgOTUyMC8xMjM4OC8zMzkwIDkyNDcvMTIxOTYvMzM5MCA5MjE2LzEyMTY3LzMzOTAKK2YgOTIzNC8xMjE4NS8zMjM4IDk1MDgvMTIzODIvMzIzOCA5NTAxLzEyMzc2LzMyMzgKK2YgOTUwMS8xMjM3Ni8zMzQ0IDkyMjkvMTIxODEvMzM0NCA5MjM0LzEyMTg1LzMzNDQKK2YgOTIzMi8xMjE4Mi8zNDU5IDk1MDIvMTIzNzgvMzQ1OSA5NTExLzEyMzgzLzM0NTkKK2YgOTUxMS8xMjM4My8zNDU5IDkyMzgvMTIxODkvMzQ1OSA5MjMyLzEyMTgyLzM0NTkKK2YgOTI1OC8xMjIwNi8zNTQyIDk1MjQvMTIzOTIvMzU0MiA5NTI1LzEyMzkzLzM1NDIKK2YgOTUyNS8xMjM5My8zNTI5IDkyOTAvMTIyMzEvMzUyOSA5MjU4LzEyMjA2LzM1MjkKK2YgOTI3NC8xMjIyNS8zNTQ1IDk1MjYvMTIzOTQvMzU0NSA5NTIzLzEyMzkxLzM1NDUKK2YgOTUyMy8xMjM5MS8zNTQ1IDkyNTMvMTIyMDMvMzU0NSA5Mjc0LzEyMjI1LzM1NDUKK2YgOTI5MC8xMjIzMS8zNTQ1IDk1MjUvMTIzOTMvMzU0NSA5NTEzLzEyMjMyLzM1NDUKK2YgOTUxMy8xMjIzMi8zNzU3IDkyODkvMTIyMzIvMzc1NyA5MjkwLzEyMjMxLzM3NTcKK2YgOTI5Ny8xMjIzOS8zNzU4IDk1MDQvMTIyMzkvMzc1OCA5NTI2LzEyMzk0LzM3NTgKK2YgOTUyNi8xMjM5NC8zNzU5IDkyNzQvMTIyMjUvMzc1OSA5Mjk3LzEyMjM5LzM3NTkKK2YgOTI4NS8xMjIyOS8zMzQ0IDk1MjcvMTIzOTUvMzM0NCA5NTA3LzEyMzgwLzMzNDQKK2YgOTUwNy8xMjM4MC8zMzQ0IDkyMzcvMTIxODYvMzM0NCA5Mjg1LzEyMjI5LzMzNDQKK2YgOTI4Ni8xMjIyOC8zNTQ1IDk1MjgvMTIzOTYvMzU0NSA5NTI3LzEyMzk1LzM1NDUKK2YgOTUyNy8xMjM5NS8zNTMyIDkyODUvMTIyMjkvMzUzMiA5Mjg2LzEyMjI4LzM1MzIKK2YgOTI5MS8xMjIzNC8zNzYwIDk1MjkvMTIyMzQvMzc2MCA5NTI4LzEyMzk2LzM3NjAKK2YgOTUyOC8xMjM5Ni8zNTI5IDkyODYvMTIyMjgvMzUyOSA5MjkxLzEyMjM0LzM1MjkKK2YgOTIzOS8xMjE4OC8zNDI1IDk1MTAvMTIxODgvMzQyNSA5NTI5LzEyMjM0LzM0MjUKK2YgOTUyOS8xMjIzNC8zNDU5IDkyOTEvMTIyMzQvMzQ1OSA5MjM5LzEyMTg4LzM0NTkKK2YgOTMwMi8xMTk0MS8zNzYxIDkzMTUvMTIyNTIvMzc2MSA5NTMxLzEyMzk3LzM3NjEKK2YgOTUzMS8xMjM5Ny8zNzYyIDk1MzAvMTE5MzcvMzc2MiA5MzAyLzExOTQxLzM3NjIKK2YgOTUzMC8xMTkzNy8zNzYzIDk1MzEvMTIzOTcvMzc2MyA5MzE4LzExOTM4LzM3NjMKK2YgOTMxOC8xMTkzOC8zNzY0IDkzMDEvMTE5MzgvMzc2NCA5NTMwLzExOTM3LzM3NjQKK2YgOTAwMy8xMTk1Mi8zMzQzIDkzMTMvMTE5NTIvMzM0MyA5NTMyLzExNzQ0LzMzNDMKK2YgOTUzMi8xMTc0NC8zMzc1IDkyNzkvMTE3NDQvMzM3NSA5MDAzLzExOTUyLzMzNzUKK2YgOTI4MC8xMTc0OS8zNzY1IDk1MzQvMTIzOTgvMzc2NSA5NTMzLzEyMzk5LzM3NjUKK2YgOTUzMy8xMjM5OS8zNzY1IDkyNzcvMTE3NDAvMzc2NSA5MjgwLzExNzQ5LzM3NjUKK2YgOTI3OC8xMTc0NS8zNzAwIDk1MzYvMTI0MDAvMzcwMCA5NTM1LzEyNDAxLzM3MDAKK2YgOTUzNS8xMjQwMS8zNzQyIDkyODMvMTE5MzkvMzc0MiA5Mjc4LzExNzQ1LzM3NDIKK2YgOTI3Ny8xMTc0MC8zNzY2IDk1MzMvMTIzOTkvMzc2NiA5NTM3LzExNzQxLzM3NjYKK2YgOTUzNy8xMTc0MS8zNzY3IDkyNzYvMTE3NDEvMzc2NyA5Mjc3LzExNzQwLzM3NjcKK2YgOTI3OS8xMTc0NC8zNzY4IDk1MzIvMTE3NDQvMzc2OCA5NTM2LzEyNDAwLzM3NjgKK2YgOTUzNi8xMjQwMC8zNzY5IDkyNzgvMTE3NDUvMzc2OSA5Mjc5LzExNzQ0LzM3NjkKK2YgOTI3Ni8xMTc0MS8zMzQ2IDk1MzcvMTE3NDEvMzM0NiA5MzExLzExOTUxLzMzNDYKK2YgOTMxMS8xMTk1MS8zNjM1IDkwMDAvMTE5NTEvMzYzNSA5Mjc2LzExNzQxLzM2MzUKK2YgODk5NC8xMTk0NS8zMzYyIDkzMDMvMTIyNDQvMzM2MiA5NTM0LzEyMzk4LzMzNjIKK2YgOTUzNC8xMjM5OC8zMzYyIDkyODAvMTE3NDkvMzM2MiA4OTk0LzExOTQ1LzMzNjIKK2YgOTI4My8xMTkzOS8zNDE0IDk1MzUvMTI0MDEvMzQxNCA5MzA4LzEyMjQ2LzM0MTQKK2YgOTMwOC8xMjI0Ni8zMzg5IDg5OTkvMTE5NDgvMzM4OSA5MjgzLzExOTM5LzMzODkKK2YgOTI5OC8xMjI0MC8zNTIwIDk1MzkvMTI0MDIvMzUyMCA5NTM4LzEyNDAzLzM1MjAKK2YgOTUzOC8xMjQwMy8zNTIwIDkyNzUvMTIyMjQvMzUyMCA5Mjk4LzEyMjQwLzM1MjAKK2YgOTI5OS8xMjI0MS8zNTM5IDk1NDAvMTI0MDQvMzUzOSA5NTM5LzEyNDAyLzM1MzkKK2YgOTUzOS8xMjQwMi8zNzcwIDkyOTgvMTIyNDAvMzc3MCA5Mjk5LzEyMjQxLzM3NzAKK2YgOTI5NC8xMjIzNS8zNTI5IDk1NDEvMTI0MDUvMzUyOSA5NTQwLzEyNDA0LzM1MjkKK2YgOTU0MC8xMjQwNC8zNTI5IDkyOTkvMTIyNDEvMzUyOSA5Mjk0LzEyMjM1LzM1MjkKK2YgOTI4Ny8xMjIyNy8zNTk1IDk1NDIvMTI0MDYvMzU5NSA5NTQxLzEyNDA1LzM1OTUKK2YgOTU0MS8xMjQwNS8zMzM1IDkyOTQvMTIyMzUvMzMzNSA5Mjg3LzEyMjI3LzMzMzUKK2YgOTI4NC8xMjIyNi8zNTQ5IDk1NDMvMTIyMjYvMzU0OSA5NTQyLzEyNDA2LzM1NDkKK2YgOTU0Mi8xMjQwNi8zNzcxIDkyODcvMTIyMjcvMzc3MSA5Mjg0LzEyMjI2LzM3NzEKK2YgOTI3NS8xMjIyNC8zNTY0IDk1MzgvMTI0MDMvMzU2NCA5NTQzLzEyMjI2LzM1NjQKK2YgOTU0My8xMjIyNi8zNTM0IDkyODQvMTIyMjYvMzUzNCA5Mjc1LzEyMjI0LzM1MzQKK2YgOTI5My8xMjIzNi8zMjM4IDk1NDUvMTIyMzYvMzIzOCA5NTQ0LzEyNDA3LzMyMzgKK2YgOTU0NC8xMjQwNy8zMzk1IDkyOTIvMTIyMzMvMzM5NSA5MjkzLzEyMjM2LzMzOTUKK2YgOTMwMC8xMjI0Mi8zNzcyIDk1NDYvMTI0MDgvMzc3MiA5NTQ1LzEyMjM2LzM3NzIKK2YgOTU0NS8xMjIzNi8zNzczIDkyOTMvMTIyMzYvMzc3MyA5MzAwLzEyMjQyLzM3NzMKK2YgOTI2MS8xMjIxMS8zNzc0IDk1NDcvMTIyMTEvMzc3NCA5NTQ2LzEyNDA4LzM3NzQKK2YgOTU0Ni8xMjQwOC8zNzc1IDkzMDAvMTIyNDIvMzc3NSA5MjYxLzEyMjExLzM3NzUKK2YgOTI2Mi8xMjIxMC8zNjg4IDk1NDgvMTI0MDkvMzY4OCA5NTQ3LzEyMjExLzM2ODgKK2YgOTU0Ny8xMjIxMS8zMzY2IDkyNjEvMTIyMTEvMzM2NiA5MjYyLzEyMjEwLzMzNjYKK2YgOTI4OC8xMjIzMC8zNTM2IDk1NDkvMTIyMzAvMzUzNiA5NTQ4LzEyNDA5LzM1MzYKK2YgOTU0OC8xMjQwOS8zNTY1IDkyNjIvMTIyMTAvMzU2NSA5Mjg4LzEyMjMwLzM1NjUKK2YgOTI5Mi8xMjIzMy8zNzUzIDk1NDQvMTI0MDcvMzc1MyA5NTQ5LzEyMjMwLzM3NTMKK2YgOTU0OS8xMjIzMC8zNTQ3IDkyODgvMTIyMzAvMzU0NyA5MjkyLzEyMjMzLzM1NDcKK2YgODQ1MS8xMTc3MC82OTcgOTMwMi8xMTk0MS82OTcgOTUzMC8xMTkzNy82OTcKK2YgOTUzMC8xMTkzNy82OTcgODcxNy8xMTkyMy82OTcgODQ1MS8xMTc3MC82OTcKK2YgODcyMS8xMTc0Mi82OTcgOTI3OC8xMTc0NS82OTcgOTI4My8xMTkzOS82OTcKK2YgOTI4My8xMTkzOS82OTcgODcyMi8xMTc1MS82OTcgODcyMS8xMTc0Mi82OTcKK2YgODQ1Mi8xMTc2OS82OTcgOTMwMS8xMTkzOC82OTcgOTI3OS8xMTc0NC82OTcKK2YgOTI3OS8xMTc0NC82OTcgODcxOC8xMTc0My82OTcgODQ1Mi8xMTc2OS82OTcKK2YgOTU1My8xMjQxMC82OTcgOTU1Mi8xMjQxMS82OTcgOTU1MS8xMjQxMi82OTcKK2YgOTU1MS8xMjQxMi82OTcgOTU1MC8xMjQxMy82OTcgOTU1My8xMjQxMC82OTcKK2YgOTU1Ny8xMjQxNC82OTcgOTU1Ni8xMjQxNS82OTcgOTU1NS8xMjQxNi82OTcKK2YgOTU1NS8xMjQxNi82OTcgOTU1NC8xMjQxNy82OTcgOTU1Ny8xMjQxNC82OTcKK2YgOTU1OS8xMjQxOC82OTcgOTU1MC8xMjQxMy82OTcgOTU1MS8xMjQxMi82OTcKK2YgOTU1MS8xMjQxMi82OTcgOTU1OC8xMjQxOS82OTcgOTU1OS8xMjQxOC82OTcKK2YgOTU1Ny8xMjQxNC82OTcgOTU2MS8xMjQyMC82OTcgOTU2MC8xMjQyMS82OTcKK2YgOTU2MC8xMjQyMS82OTcgOTU1Ni8xMjQxNS82OTcgOTU1Ny8xMjQxNC82OTcKK2YgOTU1Mi8xMjQxMS82OTcgOTU1My8xMjQxMC82OTcgOTU2My8xMjQyMi82OTcKK2YgOTU2My8xMjQyMi82OTcgOTU2Mi8xMjQyMy82OTcgOTU1Mi8xMjQxMS82OTcKK2YgOTU1NC8xMjQxNy82OTcgOTU1NS8xMjQxNi82OTcgOTU2NS8xMjQyNC82OTcKK2YgOTU2NS8xMjQyNC82OTcgOTU2NC8xMjQyNS82OTcgOTU1NC8xMjQxNy82OTcKK2YgOTU3MC8xMjQyNi82OTcgOTU3Mi8xMjQyNy82OTcgOTU2Ni8xMjQyOC82OTcKK2YgOTU2Ni8xMjQyOC82OTcgOTU3MS8xMjQyOS82OTcgOTU3MC8xMjQyNi82OTcKK2YgOTU3MC8xMjQyNi82OTcgOTU3MS8xMjQyOS82OTcgOTU2OS8xMjQzMC82OTcKK2YgOTU2OS8xMjQzMC82OTcgOTU3My8xMjQzMS82OTcgOTU3MC8xMjQyNi82OTcKK2YgOTU3OS8xMjQzMi82OTcgOTU3OC8xMjQzMy82OTcgOTU3Ny8xMjQzNC82OTcKK2YgOTU3Ny8xMjQzNC82OTcgOTU3Ni8xMjQzNS82OTcgOTU3OS8xMjQzMi82OTcKK2YgOTU4My8xMjQzNi82OTcgOTU4Mi8xMjQzNy82OTcgOTU4MS8xMjQzOC82OTcKK2YgOTU4MS8xMjQzOC82OTcgOTU4MC8xMjQzOS82OTcgOTU4My8xMjQzNi82OTcKK2YgOTU4NC8xMjQ0MC82OTcgOTU3Ni8xMjQzNS82OTcgOTU3Ny8xMjQzNC82OTcKK2YgOTU3Ny8xMjQzNC82OTcgOTU3NS8xMjQ0MS82OTcgOTU4NC8xMjQ0MC82OTcKK2YgOTU4My8xMjQzNi82OTcgOTU4NS8xMjQ0Mi82OTcgOTU3NC8xMjQ0My82OTcKK2YgOTU3NC8xMjQ0My82OTcgOTU4Mi8xMjQzNy82OTcgOTU4My8xMjQzNi82OTcKK2YgOTU3OC8xMjQzMy82OTcgOTU4Ni8xMjQ0NC82OTcgOTU2My8xMjQyMi82OTcKK2YgOTU2My8xMjQyMi82OTcgOTU1My8xMjQxMC82OTcgOTU3OC8xMjQzMy82OTcKK2YgOTU3OC8xMjQzMy82OTcgOTU3OS8xMjQzMi82OTcgOTU4Ny8xMjQ0NS82OTcKK2YgOTU4Ny8xMjQ0NS82OTcgOTU4Ni8xMjQ0NC82OTcgOTU3OC8xMjQzMy82OTcKK2YgOTU1NC8xMjQxNy82OTcgOTU2NC8xMjQyNS82OTcgOTU4OC8xMjQ0Ni82OTcKK2YgOTU4OC8xMjQ0Ni82OTcgOTU4MS8xMjQzOC82OTcgOTU1NC8xMjQxNy82OTcKK2YgOTU4MC8xMjQzOS82OTcgOTU4MS8xMjQzOC82OTcgOTU4OC8xMjQ0Ni82OTcKK2YgOTU4OC8xMjQ0Ni82OTcgOTU4OS8xMjQ0Ny82OTcgOTU4MC8xMjQzOS82OTcKK2YgOTU5Mi8xMjQ0OC82OTcgOTU5NC8xMjQ0OS82OTcgOTU5MC8xMjQ1MC82OTcKK2YgOTU5MC8xMjQ1MC82OTcgOTU5My8xMjQ1MS82OTcgOTU5Mi8xMjQ0OC82OTcKK2YgOTU5Mi8xMjQ0OC82OTcgOTU5My8xMjQ1MS82OTcgOTU5MS8xMjQ1Mi82OTcKK2YgOTU5MS8xMjQ1Mi82OTcgOTU5NS8xMjQ1My82OTcgOTU5Mi8xMjQ0OC82OTcKK2YgOTYwMS8xMjQ1NC82OTcgOTYwMC8xMjQ1NS82OTcgOTU5OS8xMjQ1Ni82OTcKK2YgOTU5OS8xMjQ1Ni82OTcgOTU5OC8xMjQ1Ny82OTcgOTYwMS8xMjQ1NC82OTcKK2YgOTYwNS8xMjQ1OC82OTcgOTYwNC8xMjQ1OS82OTcgOTYwMy8xMjQ2MC82OTcKK2YgOTYwMy8xMjQ2MC82OTcgOTYwMi8xMjQ2MS82OTcgOTYwNS8xMjQ1OC82OTcKK2YgOTYwNi8xMjQ2Mi82OTcgOTU5OC8xMjQ1Ny82OTcgOTU5OS8xMjQ1Ni82OTcKK2YgOTU5OS8xMjQ1Ni82OTcgOTU5Ny8xMjQ2My82OTcgOTYwNi8xMjQ2Mi82OTcKK2YgOTYwNS8xMjQ1OC82OTcgOTYwNy8xMjQ2NC82OTcgOTU5Ni8xMjQ2NS82OTcKK2YgOTU5Ni8xMjQ2NS82OTcgOTYwNC8xMjQ1OS82OTcgOTYwNS8xMjQ1OC82OTcKK2YgOTYwMC8xMjQ1NS82OTcgOTYwOC8xMjQ2Ni82OTcgOTU4Ny8xMjQ0NS82OTcKK2YgOTU4Ny8xMjQ0NS82OTcgOTU3OS8xMjQzMi82OTcgOTYwMC8xMjQ1NS82OTcKK2YgOTYwMC8xMjQ1NS82OTcgOTYwMS8xMjQ1NC82OTcgOTYwOS8xMjQ2Ny82OTcKK2YgOTYwOS8xMjQ2Ny82OTcgOTYwOC8xMjQ2Ni82OTcgOTYwMC8xMjQ1NS82OTcKK2YgOTU4MC8xMjQzOS82OTcgOTU4OS8xMjQ0Ny82OTcgOTYxMC8xMjQ2OC82OTcKK2YgOTYxMC8xMjQ2OC82OTcgOTYwMy8xMjQ2MC82OTcgOTU4MC8xMjQzOS82OTcKK2YgOTYwMi8xMjQ2MS82OTcgOTYwMy8xMjQ2MC82OTcgOTYxMC8xMjQ2OC82OTcKK2YgOTYxMC8xMjQ2OC82OTcgOTYxMS8xMjQ2OS82OTcgOTYwMi8xMjQ2MS82OTcKK2YgOTYxNC8xMjQ3MC82OTcgOTYxNi8xMjQ3MS82OTcgOTYxMi8xMjQ3Mi82OTcKK2YgOTYxMi8xMjQ3Mi82OTcgOTYxNS8xMjQ3My82OTcgOTYxNC8xMjQ3MC82OTcKK2YgOTYxNC8xMjQ3MC82OTcgOTYxNS8xMjQ3My82OTcgOTYxMy8xMjQ3NC82OTcKK2YgOTYxMy8xMjQ3NC82OTcgOTYxNy8xMjQ3NS82OTcgOTYxNC8xMjQ3MC82OTcKK2YgOTYyNC8xMjQ3Ni82OTcgOTYyMy8xMjQ3Ny82OTcgOTYyMi8xMjQ3OC82OTcKK2YgOTYyMi8xMjQ3OC82OTcgOTYxOS8xMjQ3OS82OTcgOTYyNC8xMjQ3Ni82OTcKK2YgOTYyNC8xMjQ3Ni82OTcgOTYyNi8xMjQ4MC82OTcgOTYyNS8xMjQ4MS82OTcKK2YgOTYyNS8xMjQ4MS82OTcgOTYyMy8xMjQ3Ny82OTcgOTYyNC8xMjQ3Ni82OTcKK2YgOTYzMy8xMjQ4Mi82OTcgOTYzMi8xMjQ4My82OTcgOTYzMS8xMjQ4NC82OTcKK2YgOTYzMS8xMjQ4NC82OTcgOTYzMC8xMjQ4NS82OTcgOTYzMy8xMjQ4Mi82OTcKK2YgOTYzNy8xMjQ4Ni82OTcgOTYzNi8xMjQ4Ny82OTcgOTYzNS8xMjQ4OC82OTcKK2YgOTYzNS8xMjQ4OC82OTcgOTYzNC8xMjQ4OS82OTcgOTYzNy8xMjQ4Ni82OTcKK2YgOTYyMC8xMjQ5MC82OTcgOTYzMC8xMjQ4NS82OTcgOTYzMS8xMjQ4NC82OTcKK2YgOTYzMS8xMjQ4NC82OTcgOTYyOS8xMjQ5MS82OTcgOTYyMC8xMjQ5MC82OTcKK2YgOTYzNy8xMjQ4Ni82OTcgOTYyOC8xMjQ5Mi82OTcgOTYxOC8xMjQ5My82OTcKK2YgOTYxOC8xMjQ5My82OTcgOTYzNi8xMjQ4Ny82OTcgOTYzNy8xMjQ4Ni82OTcKK2YgOTYzMi8xMjQ4My82OTcgOTYzOC8xMjQ5NC82OTcgOTYwOS8xMjQ2Ny82OTcKK2YgOTYwOS8xMjQ2Ny82OTcgOTYwMS8xMjQ1NC82OTcgOTYzMi8xMjQ4My82OTcKK2YgOTY0MS8xMjQ5NS82OTcgOTY0MC8xMjQ5Ni82OTcgOTYzOS8xMjQ5Ny82OTcKK2YgOTYzOS8xMjQ5Ny82OTcgOTYzMy8xMjQ4Mi82OTcgOTY0MS8xMjQ5NS82OTcKK2YgOTYzMi8xMjQ4My82OTcgOTYzMy8xMjQ4Mi82OTcgOTYzOS8xMjQ5Ny82OTcKK2YgOTYzOS8xMjQ5Ny82OTcgOTYzOC8xMjQ5NC82OTcgOTYzMi8xMjQ4My82OTcKK2YgOTYzNC8xMjQ4OS82OTcgOTY0NC8xMjQ5OC82OTcgOTY0My8xMjQ5OS82OTcKK2YgOTY0My8xMjQ5OS82OTcgOTY0Mi8xMjUwMC82OTcgOTYzNC8xMjQ4OS82OTcKK2YgOTYwMi8xMjQ2MS82OTcgOTYxMS8xMjQ2OS82OTcgOTY0NS8xMjUwMS82OTcKK2YgOTY0NS8xMjUwMS82OTcgOTYzNS8xMjQ4OC82OTcgOTYwMi8xMjQ2MS82OTcKK2YgOTYzNC8xMjQ4OS82OTcgOTYzNS8xMjQ4OC82OTcgOTY0NS8xMjUwMS82OTcKK2YgOTY0NS8xMjUwMS82OTcgOTY0NC8xMjQ5OC82OTcgOTYzNC8xMjQ4OS82OTcKK2YgOTY0OC8xMjUwMi82OTcgOTY0MS8xMjQ5NS82OTcgOTY0Ny8xMjUwMy82OTcKK2YgOTY0Ny8xMjUwMy82OTcgOTY0Ni8xMjUwNC82OTcgOTY0OC8xMjUwMi82OTcKK2YgOTY1MS8xMjUwNS82OTcgOTY1MC8xMjUwNi82OTcgOTY0Mi8xMjUwMC82OTcKK2YgOTY0Mi8xMjUwMC82OTcgOTY0OS8xMjUwNy82OTcgOTY1MS8xMjUwNS82OTcKK2YgOTY1Mi8xMjUwOC82OTcgOTY0Ni8xMjUwNC82OTcgOTY0Ny8xMjUwMy82OTcKK2YgOTY0Ny8xMjUwMy82OTcgOTYyMS8xMjUwOS82OTcgOTY1Mi8xMjUwOC82OTcKK2YgOTY1MS8xMjUwNS82OTcgOTY1My8xMjUxMC82OTcgOTYyNy8xMjUxMS82OTcKK2YgOTYyNy8xMjUxMS82OTcgOTY1MC8xMjUwNi82OTcgOTY1MS8xMjUwNS82OTcKK2YgOTY0MS8xMjQ5NS82OTcgOTY0OC8xMjUwMi82OTcgOTY1NC8xMjUxMi82OTcKK2YgOTY1NC8xMjUxMi82OTcgOTY0MC8xMjQ5Ni82OTcgOTY0MS8xMjQ5NS82OTcKK2YgOTY0OS8xMjUwNy82OTcgOTY0Mi8xMjUwMC82OTcgOTY0My8xMjQ5OS82OTcKK2YgOTY0My8xMjQ5OS82OTcgOTY1NS8xMjUxMy82OTcgOTY0OS8xMjUwNy82OTcKK2YgOTY1OC8xMjUxNC82OTcgOTY2MC8xMjUxNS82OTcgOTY1Ni8xMjUxNi82OTcKK2YgOTY1Ni8xMjUxNi82OTcgOTY1OS8xMjUxNy82OTcgOTY1OC8xMjUxNC82OTcKK2YgOTY1OC8xMjUxNC82OTcgOTY1OS8xMjUxNy82OTcgOTY1Ny8xMjUxOC82OTcKK2YgOTY1Ny8xMjUxOC82OTcgOTY2MS8xMjUxOS82OTcgOTY1OC8xMjUxNC82OTcKK2YgOTY2Ny8xMjUyMC82OTcgOTY2Ni8xMjUyMS82OTcgOTY2NS8xMjUyMi82OTcKK2YgOTY2NS8xMjUyMi82OTcgOTY2NC8xMjUyMy82OTcgOTY2Ny8xMjUyMC82OTcKK2YgOTY3MS8xMjUyNC82OTcgOTY3MC8xMjUyNS82OTcgOTY2OS8xMjUyNi82OTcKK2YgOTY2OS8xMjUyNi82OTcgOTY2OC8xMjUyNy82OTcgOTY3MS8xMjUyNC82OTcKK2YgOTY3Mi8xMjUyOC82OTcgOTY2NC8xMjUyMy82OTcgOTY2NS8xMjUyMi82OTcKK2YgOTY2NS8xMjUyMi82OTcgOTY2My8xMjUyOS82OTcgOTY3Mi8xMjUyOC82OTcKK2YgOTY3MS8xMjUyNC82OTcgOTY3My8xMjUzMC82OTcgOTY2Mi8xMjUzMS82OTcKK2YgOTY2Mi8xMjUzMS82OTcgOTY3MC8xMjUyNS82OTcgOTY3MS8xMjUyNC82OTcKK2YgOTY2Ni8xMjUyMS82OTcgOTY3NC8xMjUzMi82OTcgOTY1NC8xMjUxMi82OTcKK2YgOTY1NC8xMjUxMi82OTcgOTY0OC8xMjUwMi82OTcgOTY2Ni8xMjUyMS82OTcKK2YgOTY2Ni8xMjUyMS82OTcgOTY2Ny8xMjUyMC82OTcgOTY3NS8xMjUzMy82OTcKK2YgOTY3NS8xMjUzMy82OTcgOTY3NC8xMjUzMi82OTcgOTY2Ni8xMjUyMS82OTcKK2YgOTY0OS8xMjUwNy82OTcgOTY1NS8xMjUxMy82OTcgOTY3Ni8xMjUzNC82OTcKK2YgOTY3Ni8xMjUzNC82OTcgOTY2OS8xMjUyNi82OTcgOTY0OS8xMjUwNy82OTcKK2YgOTY2OC8xMjUyNy82OTcgOTY2OS8xMjUyNi82OTcgOTY3Ni8xMjUzNC82OTcKK2YgOTY3Ni8xMjUzNC82OTcgOTY3Ny8xMjUzNS82OTcgOTY2OC8xMjUyNy82OTcKK2YgOTY4MC8xMjUzNi82OTcgOTY4Mi8xMjUzNy82OTcgOTY3OC8xMjUzOC82OTcKK2YgOTY3OC8xMjUzOC82OTcgOTY4MS8xMjUzOS82OTcgOTY4MC8xMjUzNi82OTcKK2YgOTY4MC8xMjUzNi82OTcgOTY4MS8xMjUzOS82OTcgOTY3OS8xMjU0MC82OTcKK2YgOTY3OS8xMjU0MC82OTcgOTY4My8xMjU0MS82OTcgOTY4MC8xMjUzNi82OTcKK2YgOTY4OS8xMjU0Mi82OTcgOTY4OC8xMjU0My82OTcgOTY4Ny8xMjU0NC82OTcKK2YgOTY4Ny8xMjU0NC82OTcgOTY4Ni8xMjU0NS82OTcgOTY4OS8xMjU0Mi82OTcKK2YgOTY5My8xMjU0Ni82OTcgOTY5Mi8xMjU0Ny82OTcgOTY5MS8xMjU0OC82OTcKK2YgOTY5MS8xMjU0OC82OTcgOTY5MC8xMjU0OS82OTcgOTY5My8xMjU0Ni82OTcKK2YgOTY5NC8xMjU1MC82OTcgOTY4Ni8xMjU0NS82OTcgOTY4Ny8xMjU0NC82OTcKK2YgOTY4Ny8xMjU0NC82OTcgOTY4NS8xMjU1MS82OTcgOTY5NC8xMjU1MC82OTcKK2YgOTY5My8xMjU0Ni82OTcgOTY5NS8xMjU1Mi82OTcgOTY4NC8xMjU1My82OTcKK2YgOTY4NC8xMjU1My82OTcgOTY5Mi8xMjU0Ny82OTcgOTY5My8xMjU0Ni82OTcKK2YgOTY4OC8xMjU0My82OTcgOTY5Ni8xMjU1NC82OTcgOTY3NS8xMjUzMy82OTcKK2YgOTY3NS8xMjUzMy82OTcgOTY2Ny8xMjUyMC82OTcgOTY4OC8xMjU0My82OTcKK2YgOTY4OC8xMjU0My82OTcgOTY4OS8xMjU0Mi82OTcgOTY5Ny8xMjU1NS82OTcKK2YgOTY5Ny8xMjU1NS82OTcgOTY5Ni8xMjU1NC82OTcgOTY4OC8xMjU0My82OTcKK2YgOTY2OC8xMjUyNy82OTcgOTY3Ny8xMjUzNS82OTcgOTY5OC8xMjU1Ni82OTcKK2YgOTY5OC8xMjU1Ni82OTcgOTY5MS8xMjU0OC82OTcgOTY2OC8xMjUyNy82OTcKK2YgOTY5MC8xMjU0OS82OTcgOTY5MS8xMjU0OC82OTcgOTY5OC8xMjU1Ni82OTcKK2YgOTY5OC8xMjU1Ni82OTcgOTY5OS8xMjU1Ny82OTcgOTY5MC8xMjU0OS82OTcKK2YgOTcwMi8xMjU1OC82OTcgOTcwNC8xMjU1OS82OTcgOTcwMC8xMjU2MC82OTcKK2YgOTcwMC8xMjU2MC82OTcgOTcwMy8xMjU2MS82OTcgOTcwMi8xMjU1OC82OTcKK2YgOTcwMi8xMjU1OC82OTcgOTcwMy8xMjU2MS82OTcgOTcwMS8xMjU2Mi82OTcKK2YgOTcwMS8xMjU2Mi82OTcgOTcwNS8xMjU2My82OTcgOTcwMi8xMjU1OC82OTcKK2YgOTcxMS8xMjU2NC82OTcgOTcxMC8xMjU2NS82OTcgOTcwOS8xMjU2Ni82OTcKK2YgOTcwOS8xMjU2Ni82OTcgOTcwOC8xMjU2Ny82OTcgOTcxMS8xMjU2NC82OTcKK2YgOTcxNS8xMjU2OC82OTcgOTcxNC8xMjU2OS82OTcgOTcxMy8xMjU3MC82OTcKK2YgOTcxMy8xMjU3MC82OTcgOTcxMi8xMjU3MS82OTcgOTcxNS8xMjU2OC82OTcKK2YgOTcxNi8xMjU3Mi82OTcgOTcwOC8xMjU2Ny82OTcgOTcwOS8xMjU2Ni82OTcKK2YgOTcwOS8xMjU2Ni82OTcgOTcwNy8xMjU3My82OTcgOTcxNi8xMjU3Mi82OTcKK2YgOTcxNS8xMjU2OC82OTcgOTcxNy8xMjU3NC82OTcgOTcwNi8xMjU3NS82OTcKK2YgOTcwNi8xMjU3NS82OTcgOTcxNC8xMjU2OS82OTcgOTcxNS8xMjU2OC82OTcKK2YgOTcxMC8xMjU2NS82OTcgOTcxOC8xMjU3Ni82OTcgOTY5Ny8xMjU1NS82OTcKK2YgOTY5Ny8xMjU1NS82OTcgOTY4OS8xMjU0Mi82OTcgOTcxMC8xMjU2NS82OTcKK2YgOTcxMC8xMjU2NS82OTcgOTcxMS8xMjU2NC82OTcgOTcxOS8xMjU3Ny82OTcKK2YgOTcxOS8xMjU3Ny82OTcgOTcxOC8xMjU3Ni82OTcgOTcxMC8xMjU2NS82OTcKK2YgOTY5MC8xMjU0OS82OTcgOTY5OS8xMjU1Ny82OTcgOTcyMC8xMjU3OC82OTcKK2YgOTcyMC8xMjU3OC82OTcgOTcxMy8xMjU3MC82OTcgOTY5MC8xMjU0OS82OTcKK2YgOTcxMi8xMjU3MS82OTcgOTcxMy8xMjU3MC82OTcgOTcyMC8xMjU3OC82OTcKK2YgOTcyMC8xMjU3OC82OTcgOTcyMS8xMjU3OS82OTcgOTcxMi8xMjU3MS82OTcKK2YgOTcyNC8xMjU4MC82OTcgOTcyNi8xMjU4MS82OTcgOTcyMi8xMjU4Mi82OTcKK2YgOTcyMi8xMjU4Mi82OTcgOTcyNS8xMjU4My82OTcgOTcyNC8xMjU4MC82OTcKK2YgOTcyNC8xMjU4MC82OTcgOTcyNS8xMjU4My82OTcgOTcyMy8xMjU4NC82OTcKK2YgOTcyMy8xMjU4NC82OTcgOTcyNy8xMjU4NS82OTcgOTcyNC8xMjU4MC82OTcKK2YgOTczMy8xMjU4Ni82OTcgOTczMi8xMjU4Ny82OTcgOTczMS8xMjU4OC82OTcKK2YgOTczMS8xMjU4OC82OTcgOTczMC8xMjU4OS82OTcgOTczMy8xMjU4Ni82OTcKK2YgOTczNy8xMjU5MC82OTcgOTczNi8xMjU5MS82OTcgOTczNS8xMjU5Mi82OTcKK2YgOTczNS8xMjU5Mi82OTcgOTczNC8xMjU5My82OTcgOTczNy8xMjU5MC82OTcKK2YgOTczOC8xMjU5NC82OTcgOTczMC8xMjU4OS82OTcgOTczMS8xMjU4OC82OTcKK2YgOTczMS8xMjU4OC82OTcgOTcyOS8xMjU5NS82OTcgOTczOC8xMjU5NC82OTcKK2YgOTczNy8xMjU5MC82OTcgOTczOS8xMjU5Ni82OTcgOTcyOC8xMjU5Ny82OTcKK2YgOTcyOC8xMjU5Ny82OTcgOTczNi8xMjU5MS82OTcgOTczNy8xMjU5MC82OTcKK2YgOTczMi8xMjU4Ny82OTcgOTc0MC8xMjU5OC82OTcgOTcxOS8xMjU3Ny82OTcKK2YgOTcxOS8xMjU3Ny82OTcgOTcxMS8xMjU2NC82OTcgOTczMi8xMjU4Ny82OTcKK2YgOTczMi8xMjU4Ny82OTcgOTczMy8xMjU4Ni82OTcgOTc0MS8xMjU5OS82OTcKK2YgOTc0MS8xMjU5OS82OTcgOTc0MC8xMjU5OC82OTcgOTczMi8xMjU4Ny82OTcKK2YgOTcxMi8xMjU3MS82OTcgOTcyMS8xMjU3OS82OTcgOTc0Mi8xMjYwMC82OTcKK2YgOTc0Mi8xMjYwMC82OTcgOTczNS8xMjU5Mi82OTcgOTcxMi8xMjU3MS82OTcKK2YgOTczNC8xMjU5My82OTcgOTczNS8xMjU5Mi82OTcgOTc0Mi8xMjYwMC82OTcKK2YgOTc0Mi8xMjYwMC82OTcgOTc0My8xMjYwMS82OTcgOTczNC8xMjU5My82OTcKK2YgOTc0Ni8xMjYwMi82OTcgOTc0OC8xMjYwMy82OTcgOTc0NC8xMjYwNC82OTcKK2YgOTc0NC8xMjYwNC82OTcgOTc0Ny8xMjYwNS82OTcgOTc0Ni8xMjYwMi82OTcKK2YgOTc0Ni8xMjYwMi82OTcgOTc0Ny8xMjYwNS82OTcgOTc0NS8xMjYwNi82OTcKK2YgOTc0NS8xMjYwNi82OTcgOTc0OS8xMjYwNy82OTcgOTc0Ni8xMjYwMi82OTcKK2YgOTc1NS8xMjYwOC82OTcgOTc1NC8xMjYwOS82OTcgOTc1My8xMjYxMC82OTcKK2YgOTc1My8xMjYxMC82OTcgOTc1Mi8xMjYxMS82OTcgOTc1NS8xMjYwOC82OTcKK2YgOTc1OS8xMjYxMi82OTcgOTc1OC8xMjYxMy82OTcgOTc1Ny8xMjYxNC82OTcKK2YgOTc1Ny8xMjYxNC82OTcgOTc1Ni8xMjYxNS82OTcgOTc1OS8xMjYxMi82OTcKK2YgOTc2MC8xMjYxNi82OTcgOTc1Mi8xMjYxMS82OTcgOTc1My8xMjYxMC82OTcKK2YgOTc1My8xMjYxMC82OTcgOTc1MS8xMjYxNy82OTcgOTc2MC8xMjYxNi82OTcKK2YgOTc1OS8xMjYxMi82OTcgOTc2MS8xMjYxOC82OTcgOTc1MC8xMjYxOS82OTcKK2YgOTc1MC8xMjYxOS82OTcgOTc1OC8xMjYxMy82OTcgOTc1OS8xMjYxMi82OTcKK2YgOTc1NC8xMjYwOS82OTcgOTc2Mi8xMjYyMC82OTcgOTc0MS8xMjU5OS82OTcKK2YgOTc0MS8xMjU5OS82OTcgOTczMy8xMjU4Ni82OTcgOTc1NC8xMjYwOS82OTcKK2YgOTc1NC8xMjYwOS82OTcgOTc1NS8xMjYwOC82OTcgOTc2My8xMjYyMS82OTcKK2YgOTc2My8xMjYyMS82OTcgOTc2Mi8xMjYyMC82OTcgOTc1NC8xMjYwOS82OTcKK2YgOTczNC8xMjU5My82OTcgOTc0My8xMjYwMS82OTcgOTc2NC8xMjYyMi82OTcKK2YgOTc2NC8xMjYyMi82OTcgOTc1Ny8xMjYxNC82OTcgOTczNC8xMjU5My82OTcKK2YgOTc1Ni8xMjYxNS82OTcgOTc1Ny8xMjYxNC82OTcgOTc2NC8xMjYyMi82OTcKK2YgOTc2NC8xMjYyMi82OTcgOTc2NS8xMjYyMy82OTcgOTc1Ni8xMjYxNS82OTcKK2YgOTc2OC8xMjYyNC82OTcgOTc3MC8xMjYyNS82OTcgOTc2Ni8xMjYyNi82OTcKK2YgOTc2Ni8xMjYyNi82OTcgOTc2OS8xMjYyNy82OTcgOTc2OC8xMjYyNC82OTcKK2YgOTc2OC8xMjYyNC82OTcgOTc2OS8xMjYyNy82OTcgOTc2Ny8xMjYyOC82OTcKK2YgOTc2Ny8xMjYyOC82OTcgOTc3MS8xMjYyOS82OTcgOTc2OC8xMjYyNC82OTcKK2YgOTc3Ny8xMjYzMC82OTcgOTc3Ni8xMjYzMS82OTcgOTc3NS8xMjYzMi82OTcKK2YgOTc3NS8xMjYzMi82OTcgOTc3NC8xMjYzMy82OTcgOTc3Ny8xMjYzMC82OTcKK2YgOTc4MS8xMjYzNC82OTcgOTc4MC8xMjYzNS82OTcgOTc3OS8xMjYzNi82OTcKK2YgOTc3OS8xMjYzNi82OTcgOTc3OC8xMjYzNy82OTcgOTc4MS8xMjYzNC82OTcKK2YgOTc4Mi8xMjYzOC82OTcgOTc3NC8xMjYzMy82OTcgOTc3NS8xMjYzMi82OTcKK2YgOTc3NS8xMjYzMi82OTcgOTc3My8xMjYzOS82OTcgOTc4Mi8xMjYzOC82OTcKK2YgOTc4MS8xMjYzNC82OTcgOTc4My8xMjY0MC82OTcgOTc3Mi8xMjY0MS82OTcKK2YgOTc3Mi8xMjY0MS82OTcgOTc4MC8xMjYzNS82OTcgOTc4MS8xMjYzNC82OTcKK2YgOTc3Ni8xMjYzMS82OTcgOTc4NC8xMjY0Mi82OTcgOTc2My8xMjYyMS82OTcKK2YgOTc2My8xMjYyMS82OTcgOTc1NS8xMjYwOC82OTcgOTc3Ni8xMjYzMS82OTcKK2YgOTc3Ni8xMjYzMS82OTcgOTc3Ny8xMjYzMC82OTcgOTc4NS8xMjY0My82OTcKK2YgOTc4NS8xMjY0My82OTcgOTc4NC8xMjY0Mi82OTcgOTc3Ni8xMjYzMS82OTcKK2YgOTc1Ni8xMjYxNS82OTcgOTc2NS8xMjYyMy82OTcgOTc4Ni8xMjY0NC82OTcKK2YgOTc4Ni8xMjY0NC82OTcgOTc3OS8xMjYzNi82OTcgOTc1Ni8xMjYxNS82OTcKK2YgOTc3OC8xMjYzNy82OTcgOTc3OS8xMjYzNi82OTcgOTc4Ni8xMjY0NC82OTcKK2YgOTc4Ni8xMjY0NC82OTcgOTc4Ny8xMjY0NS82OTcgOTc3OC8xMjYzNy82OTcKK2YgOTc5MC8xMjY0Ni82OTcgOTc5Mi8xMjY0Ny82OTcgOTc4OC8xMjY0OC82OTcKK2YgOTc4OC8xMjY0OC82OTcgOTc5MS8xMjY0OS82OTcgOTc5MC8xMjY0Ni82OTcKK2YgOTc5MC8xMjY0Ni82OTcgOTc5MS8xMjY0OS82OTcgOTc4OS8xMjY1MC82OTcKK2YgOTc4OS8xMjY1MC82OTcgOTc5My8xMjY1MS82OTcgOTc5MC8xMjY0Ni82OTcKK2YgOTgwMC8xMjY1Mi82OTcgOTc5OS8xMjY1My82OTcgOTc5OC8xMjY1NC82OTcKK2YgOTc5OC8xMjY1NC82OTcgOTc5NS8xMjY1NS82OTcgOTgwMC8xMjY1Mi82OTcKK2YgOTgwMC8xMjY1Mi82OTcgOTgwMi8xMjY1Ni82OTcgOTgwMS8xMjY1Ny82OTcKK2YgOTgwMS8xMjY1Ny82OTcgOTc5OS8xMjY1My82OTcgOTgwMC8xMjY1Mi82OTcKK2YgOTgwOS8xMjY1OC82OTcgOTgwOC8xMjY1OS82OTcgOTgwNy8xMjY2MC82OTcKK2YgOTgwNy8xMjY2MC82OTcgOTgwNi8xMjY2MS82OTcgOTgwOS8xMjY1OC82OTcKK2YgOTgxMy8xMjY2Mi82OTcgOTgxMi8xMjY2My82OTcgOTgxMS8xMjY2NC82OTcKK2YgOTgxMS8xMjY2NC82OTcgOTgxMC8xMjY2NS82OTcgOTgxMy8xMjY2Mi82OTcKK2YgOTc5Ni8xMjY2Ni82OTcgOTgwNi8xMjY2MS82OTcgOTgwNy8xMjY2MC82OTcKK2YgOTgwNy8xMjY2MC82OTcgOTgwNS8xMjY2Ny82OTcgOTc5Ni8xMjY2Ni82OTcKK2YgOTgxMy8xMjY2Mi82OTcgOTgwNC8xMjY2OC82OTcgOTc5NC8xMjY2OS82OTcKK2YgOTc5NC8xMjY2OS82OTcgOTgxMi8xMjY2My82OTcgOTgxMy8xMjY2Mi82OTcKK2YgOTgwOC8xMjY1OS82OTcgOTgxNC8xMjY3MC82OTcgOTc4NS8xMjY0My82OTcKK2YgOTc4NS8xMjY0My82OTcgOTc3Ny8xMjYzMC82OTcgOTgwOC8xMjY1OS82OTcKK2YgOTgxNy8xMjY3MS82OTcgOTgxNi8xMjY3Mi82OTcgOTgxNS8xMjY3My82OTcKK2YgOTgxNS8xMjY3My82OTcgOTgwOS8xMjY1OC82OTcgOTgxNy8xMjY3MS82OTcKK2YgOTgwOC8xMjY1OS82OTcgOTgwOS8xMjY1OC82OTcgOTgxNS8xMjY3My82OTcKK2YgOTgxNS8xMjY3My82OTcgOTgxNC8xMjY3MC82OTcgOTgwOC8xMjY1OS82OTcKK2YgOTgxMC8xMjY2NS82OTcgOTgyMC8xMjY3NC82OTcgOTgxOS8xMjY3NS82OTcKK2YgOTgxOS8xMjY3NS82OTcgOTgxOC8xMjY3Ni82OTcgOTgxMC8xMjY2NS82OTcKK2YgOTc3OC8xMjYzNy82OTcgOTc4Ny8xMjY0NS82OTcgOTgyMS8xMjY3Ny82OTcKK2YgOTgyMS8xMjY3Ny82OTcgOTgxMS8xMjY2NC82OTcgOTc3OC8xMjYzNy82OTcKK2YgOTgxMC8xMjY2NS82OTcgOTgxMS8xMjY2NC82OTcgOTgyMS8xMjY3Ny82OTcKK2YgOTgyMS8xMjY3Ny82OTcgOTgyMC8xMjY3NC82OTcgOTgxMC8xMjY2NS82OTcKK2YgOTg1Mi8xMjY3OC82OTcgOTg1Ni8xMjY3OS82OTcgOTgyNC8xMjY4MC82OTcKK2YgOTgyNC8xMjY4MC82OTcgOTg1MS8xMjY4MS82OTcgOTg1Mi8xMjY3OC82OTcKK2YgOTg1NS8xMjY4Mi82OTcgOTg1NC8xMjY4My82OTcgOTgxNi8xMjY3Mi82OTcKK2YgOTgxNi8xMjY3Mi82OTcgOTgxNy8xMjY3MS82OTcgOTg1NS8xMjY4Mi82OTcKK2YgOTg1Ny8xMjY4NC82OTcgOTg1Ni8xMjY3OS82OTcgOTgxOC8xMjY3Ni82OTcKK2YgOTgxOC8xMjY3Ni82OTcgOTgxOS8xMjY3NS82OTcgOTg1Ny8xMjY4NC82OTcKK2YgOTg1OS8xMjY4NS82OTcgOTg1OC8xMjY4Ni82OTcgOTgyNC8xMjY4MC82OTcKK2YgOTgyNC8xMjY4MC82OTcgOTgyNy8xMjY4Ny82OTcgOTg1OS8xMjY4NS82OTcKK2YgOTg2MS8xMjY4OC82OTcgOTg2MC8xMjY4OS82OTcgOTgyMy8xMjY5MC82OTcKK2YgOTgyMy8xMjY5MC82OTcgOTgyOC8xMjY5MS82OTcgOTg2MS8xMjY4OC82OTcKK2YgOTg0Mi8xMjY5Mi82OTcgOTg1NS8xMjY4Mi82OTcgOTgxNy8xMjY3MS82OTcKK2YgOTgxNy8xMjY3MS82OTcgOTgyOS8xMjY5My82OTcgOTg0Mi8xMjY5Mi82OTcKK2YgOTgzOS8xMjY5NC82OTcgOTgzNi8xMjY5NS82OTcgMTAzOTMvMTI2OTYvNjk3CitmIDEwMzkzLzEyNjk2LzY5NyAxMDM5Mi8xMjY5Ny82OTcgOTgzOS8xMjY5NC82OTcKK2YgOTgzNy8xMjY5OC82OTcgOTgzNC8xMjY5OS82OTcgMTAzOTUvMTI3MDAvNjk3CitmIDEwMzk1LzEyNzAwLzY5NyAxMDM5NC8xMjcwMS82OTcgOTgzNy8xMjY5OC82OTcKK2YgOTgzNS8xMjcwMi82OTcgOTg0MC8xMjcwMy82OTcgMTAzOTcvMTI3MDQvNjk3CitmIDEwMzk3LzEyNzA0LzY5NyAxMDM5Ni8xMjcwNS82OTcgOTgzNS8xMjcwMi82OTcKK2YgOTgzNS8xMjcwMi82OTcgOTU1Mi8xMjQxMS82OTcgOTU2Mi8xMjQyMy82OTcKK2YgOTU2Mi8xMjQyMy82OTcgOTg0MC8xMjcwMy82OTcgOTgzNS8xMjcwMi82OTcKK2YgOTg0MS8xMjcwNi82OTcgOTU2NS8xMjQyNC82OTcgOTU1NS8xMjQxNi82OTcKK2YgOTU1NS8xMjQxNi82OTcgOTgzOC8xMjcwNy82OTcgOTg0MS8xMjcwNi82OTcKK2YgOTg0Ny8xMjcwOC82OTcgOTgzMC8xMjcwOS82OTcgOTgzMS8xMjcxMC82OTcKK2YgOTgzMS8xMjcxMC82OTcgOTg0Ni8xMjcxMS82OTcgOTg0Ny8xMjcwOC82OTcKK2YgOTg1My8xMjcxMi82OTcgOTgwMy8xMjcxMy82OTcgOTgyNS8xMjcxNC82OTcKK2YgOTgyNS8xMjcxNC82OTcgOTg1Mi8xMjY3OC82OTcgOTg1My8xMjcxMi82OTcKK2YgOTgzMS8xMjcxMC82OTcgOTg0OC8xMjcxNS82OTcgOTg0Ni8xMjcxMS82OTcKK2YgOTg1My8xMjcxMi82OTcgOTgzMi8xMjcxNi82OTcgOTgwMy8xMjcxMy82OTcKK2YgOTg0OC8xMjcxNS82OTcgOTg0OS8xMjcxNy82OTcgOTg0NS8xMjcxOC82OTcKK2YgOTg0NS8xMjcxOC82OTcgOTg0Ni8xMjcxMS82OTcgOTg0OC8xMjcxNS82OTcKK2YgOTg0OS8xMjcxNy82OTcgOTgyMy8xMjY5MC82OTcgOTg0NS8xMjcxOC82OTcKK2YgOTgyNi8xMjcxOS82OTcgOTg1NC8xMjY4My82OTcgOTg1NS8xMjY4Mi82OTcKK2YgOTg1NS8xMjY4Mi82OTcgOTgyMi8xMjcyMC82OTcgOTgyNi8xMjcxOS82OTcKK2YgOTgyOS8xMjY5My82OTcgOTc5Ny8xMjcyMS82OTcgOTg0Ny8xMjcwOC82OTcKK2YgOTg0Ny8xMjcwOC82OTcgOTg0Mi8xMjY5Mi82OTcgOTgyOS8xMjY5My82OTcKK2YgOTgyMi8xMjcyMC82OTcgOTg1NS8xMjY4Mi82OTcgOTg0Mi8xMjY5Mi82OTcKK2YgOTg0Mi8xMjY5Mi82OTcgOTg0My8xMjcyMi82OTcgOTgyMi8xMjcyMC82OTcKK2YgOTgyNC8xMjY4MC82OTcgOTg1Ni8xMjY3OS82OTcgOTg1Ny8xMjY4NC82OTcKK2YgOTg1Ny8xMjY4NC82OTcgOTgyNy8xMjY4Ny82OTcgOTgyNC8xMjY4MC82OTcKK2YgOTgxOC8xMjY3Ni82OTcgOTg1Ni8xMjY3OS82OTcgOTg1Mi8xMjY3OC82OTcKK2YgOTg1Mi8xMjY3OC82OTcgOTgyNS8xMjcxNC82OTcgOTgxOC8xMjY3Ni82OTcKK2YgOTg0Ny8xMjcwOC82OTcgOTc5Ny8xMjcyMS82OTcgOTgzMC8xMjcwOS82OTcKK2YgOTgyMy8xMjY5MC82OTcgOTg1OC8xMjY4Ni82OTcgOTg1OS8xMjY4NS82OTcKK2YgOTg1OS8xMjY4NS82OTcgOTgyOC8xMjY5MS82OTcgOTgyMy8xMjY5MC82OTcKK2YgOTgyMi8xMjcyMC82OTcgOTg2MC8xMjY4OS82OTcgOTg2MS8xMjY4OC82OTcKK2YgOTg2MS8xMjY4OC82OTcgOTgyNi8xMjcxOS82OTcgOTgyMi8xMjcyMC82OTcKK2YgOTgyMi8xMjcyMC82OTcgOTg0My8xMjcyMi82OTcgOTg0NC8xMjcyMy82OTcKK2YgOTg0NC8xMjcyMy82OTcgOTg2MC8xMjY4OS82OTcgOTgyMi8xMjcyMC82OTcKK2YgOTg1MC8xMjcyNC82OTcgOTg1MS8xMjY4MS82OTcgOTgyNC8xMjY4MC82OTcKK2YgOTgyNC8xMjY4MC82OTcgOTg1OC8xMjY4Ni82OTcgOTg1MC8xMjcyNC82OTcKK2YgOTg1MC8xMjcyNC82OTcgOTg1OC8xMjY4Ni82OTcgOTgyMy8xMjY5MC82OTcKK2YgOTgyMy8xMjY5MC82OTcgOTg0OS8xMjcxNy82OTcgOTg1MC8xMjcyNC82OTcKK2YgOTgyMy8xMjY5MC82OTcgOTg2MC8xMjY4OS82OTcgOTg0NC8xMjcyMy82OTcKK2YgOTg0NC8xMjcyMy82OTcgOTg0NS8xMjcxOC82OTcgOTgyMy8xMjY5MC82OTcKK2YgOTgwNC8xMjY2OC82OTcgOTgwMy8xMjcxMy82OTcgOTgzMi8xMjcxNi82OTcKK2YgOTgzMi8xMjcxNi82OTcgOTgwMS8xMjY1Ny82OTcgOTgwNC8xMjY2OC82OTcKK2YgOTc5Ny8xMjcyMS82OTcgOTc5Ni8xMjY2Ni82OTcgOTc5OC8xMjY1NC82OTcKK2YgOTc5OC8xMjY1NC82OTcgOTgzMC8xMjcwOS82OTcgOTc5Ny8xMjcyMS82OTcKK2YgOTgwNC8xMjY2OC82OTcgOTgwMS8xMjY1Ny82OTcgOTgwMi8xMjY1Ni82OTcKK2YgOTgwMi8xMjY1Ni82OTcgOTc5NC8xMjY2OS82OTcgOTgwNC8xMjY2OC82OTcKK2YgOTc5NS8xMjY1NS82OTcgOTc5OC8xMjY1NC82OTcgOTc5Ni8xMjY2Ni82OTcKK2YgOTc5Ni8xMjY2Ni82OTcgOTgwNS8xMjY2Ny82OTcgOTc5NS8xMjY1NS82OTcKK2YgOTc4My8xMjY0MC82OTcgOTc5NC8xMjY2OS82OTcgOTgwMi8xMjY1Ni82OTcKK2YgOTgwMi8xMjY1Ni82OTcgOTc5My8xMjY1MS82OTcgOTc4My8xMjY0MC82OTcKK2YgOTgwNS8xMjY2Ny82OTcgOTc4Mi8xMjYzOC82OTcgOTc5Mi8xMjY0Ny82OTcKK2YgOTc5Mi8xMjY0Ny82OTcgOTc5NS8xMjY1NS82OTcgOTgwNS8xMjY2Ny82OTcKK2YgOTc3Mi8xMjY0MS82OTcgOTc4My8xMjY0MC82OTcgOTc5My8xMjY1MS82OTcKK2YgOTc5My8xMjY1MS82OTcgOTc4OS8xMjY1MC82OTcgOTc3Mi8xMjY0MS82OTcKK2YgOTc4OC8xMjY0OC82OTcgOTc5Mi8xMjY0Ny82OTcgOTc4Mi8xMjYzOC82OTcKK2YgOTc4Mi8xMjYzOC82OTcgOTc3My8xMjYzOS82OTcgOTc4OC8xMjY0OC82OTcKK2YgOTc2MS8xMjYxOC82OTcgOTc3Mi8xMjY0MS82OTcgOTc4OS8xMjY1MC82OTcKK2YgOTc4OS8xMjY1MC82OTcgOTc3MS8xMjYyOS82OTcgOTc2MS8xMjYxOC82OTcKK2YgOTc3My8xMjYzOS82OTcgOTc2MC8xMjYxNi82OTcgOTc3MC8xMjYyNS82OTcKK2YgOTc3MC8xMjYyNS82OTcgOTc4OC8xMjY0OC82OTcgOTc3My8xMjYzOS82OTcKK2YgOTc1MC8xMjYxOS82OTcgOTc2MS8xMjYxOC82OTcgOTc3MS8xMjYyOS82OTcKK2YgOTc3MS8xMjYyOS82OTcgOTc2Ny8xMjYyOC82OTcgOTc1MC8xMjYxOS82OTcKK2YgOTc2Ni8xMjYyNi82OTcgOTc3MC8xMjYyNS82OTcgOTc2MC8xMjYxNi82OTcKK2YgOTc2MC8xMjYxNi82OTcgOTc1MS8xMjYxNy82OTcgOTc2Ni8xMjYyNi82OTcKK2YgOTczOS8xMjU5Ni82OTcgOTc1MC8xMjYxOS82OTcgOTc2Ny8xMjYyOC82OTcKK2YgOTc2Ny8xMjYyOC82OTcgOTc0OS8xMjYwNy82OTcgOTczOS8xMjU5Ni82OTcKK2YgOTc1MS8xMjYxNy82OTcgOTczOC8xMjU5NC82OTcgOTc0OC8xMjYwMy82OTcKK2YgOTc0OC8xMjYwMy82OTcgOTc2Ni8xMjYyNi82OTcgOTc1MS8xMjYxNy82OTcKK2YgOTcyOC8xMjU5Ny82OTcgOTczOS8xMjU5Ni82OTcgOTc0OS8xMjYwNy82OTcKK2YgOTc0OS8xMjYwNy82OTcgOTc0NS8xMjYwNi82OTcgOTcyOC8xMjU5Ny82OTcKK2YgOTc0NC8xMjYwNC82OTcgOTc0OC8xMjYwMy82OTcgOTczOC8xMjU5NC82OTcKK2YgOTczOC8xMjU5NC82OTcgOTcyOS8xMjU5NS82OTcgOTc0NC8xMjYwNC82OTcKK2YgOTcxNy8xMjU3NC82OTcgOTcyOC8xMjU5Ny82OTcgOTc0NS8xMjYwNi82OTcKK2YgOTc0NS8xMjYwNi82OTcgOTcyNy8xMjU4NS82OTcgOTcxNy8xMjU3NC82OTcKK2YgOTcyOS8xMjU5NS82OTcgOTcxNi8xMjU3Mi82OTcgOTcyNi8xMjU4MS82OTcKK2YgOTcyNi8xMjU4MS82OTcgOTc0NC8xMjYwNC82OTcgOTcyOS8xMjU5NS82OTcKK2YgOTcxNy8xMjU3NC82OTcgOTcyNy8xMjU4NS82OTcgOTcyMy8xMjU4NC82OTcKK2YgOTcyMy8xMjU4NC82OTcgOTcwNi8xMjU3NS82OTcgOTcxNy8xMjU3NC82OTcKK2YgOTcyMi8xMjU4Mi82OTcgOTcyNi8xMjU4MS82OTcgOTcxNi8xMjU3Mi82OTcKK2YgOTcxNi8xMjU3Mi82OTcgOTcwNy8xMjU3My82OTcgOTcyMi8xMjU4Mi82OTcKK2YgOTcwNi8xMjU3NS82OTcgOTcyMy8xMjU4NC82OTcgOTcwNS8xMjU2My82OTcKK2YgOTcwNS8xMjU2My82OTcgOTY5NS8xMjU1Mi82OTcgOTcwNi8xMjU3NS82OTcKK2YgOTcwNy8xMjU3My82OTcgOTY5NC8xMjU1MC82OTcgOTcwNC8xMjU1OS82OTcKK2YgOTcwNC8xMjU1OS82OTcgOTcyMi8xMjU4Mi82OTcgOTcwNy8xMjU3My82OTcKK2YgOTY5NS8xMjU1Mi82OTcgOTcwNS8xMjU2My82OTcgOTcwMS8xMjU2Mi82OTcKK2YgOTcwMS8xMjU2Mi82OTcgOTY4NC8xMjU1My82OTcgOTY5NS8xMjU1Mi82OTcKK2YgOTcwMC8xMjU2MC82OTcgOTcwNC8xMjU1OS82OTcgOTY5NC8xMjU1MC82OTcKK2YgOTY5NC8xMjU1MC82OTcgOTY4NS8xMjU1MS82OTcgOTcwMC8xMjU2MC82OTcKK2YgOTY4NC8xMjU1My82OTcgOTcwMS8xMjU2Mi82OTcgOTY4My8xMjU0MS82OTcKK2YgOTY4My8xMjU0MS82OTcgOTY3My8xMjUzMC82OTcgOTY4NC8xMjU1My82OTcKK2YgOTY4NS8xMjU1MS82OTcgOTY3Mi8xMjUyOC82OTcgOTY4Mi8xMjUzNy82OTcKK2YgOTY4Mi8xMjUzNy82OTcgOTcwMC8xMjU2MC82OTcgOTY4NS8xMjU1MS82OTcKK2YgOTY3My8xMjUzMC82OTcgOTY4My8xMjU0MS82OTcgOTY3OS8xMjU0MC82OTcKK2YgOTY3OS8xMjU0MC82OTcgOTY2Mi8xMjUzMS82OTcgOTY3My8xMjUzMC82OTcKK2YgOTY3OC8xMjUzOC82OTcgOTY4Mi8xMjUzNy82OTcgOTY3Mi8xMjUyOC82OTcKK2YgOTY3Mi8xMjUyOC82OTcgOTY2My8xMjUyOS82OTcgOTY3OC8xMjUzOC82OTcKK2YgOTY2Mi8xMjUzMS82OTcgOTY3OS8xMjU0MC82OTcgOTY2MS8xMjUxOS82OTcKK2YgOTY2MS8xMjUxOS82OTcgOTY1My8xMjUxMC82OTcgOTY2Mi8xMjUzMS82OTcKK2YgOTY2My8xMjUyOS82OTcgOTY1Mi8xMjUwOC82OTcgOTY2MC8xMjUxNS82OTcKK2YgOTY2MC8xMjUxNS82OTcgOTY3OC8xMjUzOC82OTcgOTY2My8xMjUyOS82OTcKK2YgOTY1My8xMjUxMC82OTcgOTY2MS8xMjUxOS82OTcgOTY1Ny8xMjUxOC82OTcKK2YgOTY1Ny8xMjUxOC82OTcgOTYyNy8xMjUxMS82OTcgOTY1My8xMjUxMC82OTcKK2YgOTY1Ni8xMjUxNi82OTcgOTY2MC8xMjUxNS82OTcgOTY1Mi8xMjUwOC82OTcKK2YgOTY1Mi8xMjUwOC82OTcgOTYyMS8xMjUwOS82OTcgOTY1Ni8xMjUxNi82OTcKK2YgOTYyNy8xMjUxMS82OTcgOTY1Ny8xMjUxOC82OTcgOTYyNS8xMjQ4MS82OTcKK2YgOTYyNS8xMjQ4MS82OTcgOTYyOC8xMjQ5Mi82OTcgOTYyNy8xMjUxMS82OTcKK2YgOTYyMS8xMjUwOS82OTcgOTYyMC8xMjQ5MC82OTcgOTYyMi8xMjQ3OC82OTcKK2YgOTYyMi8xMjQ3OC82OTcgOTY1Ni8xMjUxNi82OTcgOTYyMS8xMjUwOS82OTcKK2YgOTYyOC8xMjQ5Mi82OTcgOTYyNS8xMjQ4MS82OTcgOTYyNi8xMjQ4MC82OTcKK2YgOTYyNi8xMjQ4MC82OTcgOTYxOC8xMjQ5My82OTcgOTYyOC8xMjQ5Mi82OTcKK2YgOTYxOS8xMjQ3OS82OTcgOTYyMi8xMjQ3OC82OTcgOTYyMC8xMjQ5MC82OTcKK2YgOTYyMC8xMjQ5MC82OTcgOTYyOS8xMjQ5MS82OTcgOTYxOS8xMjQ3OS82OTcKK2YgOTYxOC8xMjQ5My82OTcgOTYyNi8xMjQ4MC82OTcgOTYxNy8xMjQ3NS82OTcKK2YgOTYxNy8xMjQ3NS82OTcgOTYwNy8xMjQ2NC82OTcgOTYxOC8xMjQ5My82OTcKK2YgOTYyOS8xMjQ5MS82OTcgOTYwNi8xMjQ2Mi82OTcgOTYxNi8xMjQ3MS82OTcKK2YgOTYxNi8xMjQ3MS82OTcgOTYxOS8xMjQ3OS82OTcgOTYyOS8xMjQ5MS82OTcKK2YgOTU5Ni8xMjQ2NS82OTcgOTYxMy8xMjQ3NC82OTcgOTU5NS8xMjQ1My82OTcKK2YgOTU5NS8xMjQ1My82OTcgOTU4NS8xMjQ0Mi82OTcgOTU5Ni8xMjQ2NS82OTcKK2YgOTU5NC8xMjQ0OS82OTcgOTYxMi8xMjQ3Mi82OTcgOTU5Ny8xMjQ2My82OTcKK2YgOTU5Ny8xMjQ2My82OTcgOTU4NC8xMjQ0MC82OTcgOTU5NC8xMjQ0OS82OTcKK2YgOTU4NS8xMjQ0Mi82OTcgOTU5NS8xMjQ1My82OTcgOTU5MS8xMjQ1Mi82OTcKK2YgOTU5MS8xMjQ1Mi82OTcgOTU3NC8xMjQ0My82OTcgOTU4NS8xMjQ0Mi82OTcKK2YgOTU5MC8xMjQ1MC82OTcgOTU5NC8xMjQ0OS82OTcgOTU4NC8xMjQ0MC82OTcKK2YgOTU4NC8xMjQ0MC82OTcgOTU3NS8xMjQ0MS82OTcgOTU5MC8xMjQ1MC82OTcKK2YgOTU3NC8xMjQ0My82OTcgOTU5MS8xMjQ1Mi82OTcgOTU3My8xMjQzMS82OTcKK2YgOTU3My8xMjQzMS82OTcgOTU2MS8xMjQyMC82OTcgOTU3NC8xMjQ0My82OTcKK2YgOTU3NS8xMjQ0MS82OTcgOTU1OS8xMjQxOC82OTcgOTU3Mi8xMjQyNy82OTcKK2YgOTU3Mi8xMjQyNy82OTcgOTU5MC8xMjQ1MC82OTcgOTU3NS8xMjQ0MS82OTcKK2YgOTU2MC8xMjQyMS82OTcgOTU2MS8xMjQyMC82OTcgOTU3My8xMjQzMS82OTcKK2YgOTU3My8xMjQzMS82OTcgOTU2OS8xMjQzMC82OTcgOTU2MC8xMjQyMS82OTcKK2YgOTU2Ni8xMjQyOC82OTcgOTU3Mi8xMjQyNy82OTcgOTU1OS8xMjQxOC82OTcKK2YgOTU1OS8xMjQxOC82OTcgOTU1OC8xMjQxOS82OTcgOTU2Ni8xMjQyOC82OTcKK2YgOTU2MC8xMjQyMS82OTcgOTU2OS8xMjQzMC82OTcgOTU2OC8xMjcyNS82OTcKK2YgOTU2OC8xMjcyNS82OTcgOTgzNC8xMjY5OS82OTcgOTU2MC8xMjQyMS82OTcKK2YgOTU1OC8xMjQxOS82OTcgOTgzOS8xMjY5NC82OTcgOTU2Ny8xMjcyNi82OTcKK2YgOTU2Ny8xMjcyNi82OTcgOTU2Ni8xMjQyOC82OTcgOTU1OC8xMjQxOS82OTcKK2YgOTU1MS8xMjQxMi8zNzc2IDk1NTIvMTI0MTEvMzc3NiA5ODY0LzEyNDExLzM3NzYKK2YgOTg2NC8xMjQxMS8zNzc3IDk4NjMvMTI3MjcvMzc3NyA5NTUxLzEyNDEyLzM3NzcKK2YgOTU1My8xMjQxMC8zNzc4IDk1NTAvMTI0MTMvMzc3OCA5ODYyLzEyNzI4LzM3NzgKK2YgOTg2Mi8xMjcyOC8zNDM3IDk4NjUvMTI3MjkvMzQzNyA5NTUzLzEyNDEwLzM0MzcKK2YgOTU1NS8xMjQxNi8zMzc5IDk1NTYvMTI0MTUvMzM3OSA5ODY4LzEyNzMwLzMzNzkKK2YgOTg2OC8xMjczMC8zMzIzIDk4NjcvMTI3MzEvMzMyMyA5NTU1LzEyNDE2LzMzMjMKK2YgOTU1Ny8xMjQxNC8zMzUyIDk1NTQvMTI0MTcvMzM1MiA5ODY2LzEyNzMyLzMzNTIKK2YgOTg2Ni8xMjczMi8zMzI1IDk4NjkvMTI3MzMvMzMyNSA5NTU3LzEyNDE0LzMzMjUKK2YgOTU1OC8xMjQxOS8zMzI2IDk1NTEvMTI0MTIvMzMyNiA5ODYzLzEyNzI3LzMzMjYKK2YgOTg2My8xMjcyNy8zMzI2IDk4NzAvMTI3MzQvMzMyNiA5NTU4LzEyNDE5LzMzMjYKK2YgOTU1MC8xMjQxMy8zNDM5IDk1NTkvMTI0MTgvMzQzOSA5ODcxLzEyNzM1LzM0MzkKK2YgOTg3MS8xMjczNS8zMzI3IDk4NjIvMTI3MjgvMzMyNyA5NTUwLzEyNDEzLzMzMjcKK2YgOTU1Ni8xMjQxNS8zNzc5IDk1NjAvMTI0MjEvMzc3OSA5ODcyLzEyNzM2LzM3NzkKK2YgOTg3Mi8xMjczNi8zMzMwIDk4NjgvMTI3MzAvMzMzMCA5NTU2LzEyNDE1LzMzMzAKK2YgOTU2MS8xMjQyMC8zNDIzIDk1NTcvMTI0MTQvMzQyMyA5ODY5LzEyNzMzLzM0MjMKK2YgOTg2OS8xMjczMy8zNzgwIDk4NzMvMTI3MzcvMzc4MCA5NTYxLzEyNDIwLzM3ODAKK2YgOTU2Ni8xMjQyOC8zMzY1IDk1NjcvMTI3MjYvMzM2NSA5ODc1LzEyNzI2LzMzNjUKK2YgOTg3NS8xMjcyNi8zMzY1IDk4NzQvMTI0MjgvMzM2NSA5NTY2LzEyNDI4LzMzNjUKK2YgOTU2OC8xMjcyNS8zNjg4IDk1NjkvMTI0MzAvMzY4OCA5ODc3LzEyNzM4LzM2ODgKK2YgOTg3Ny8xMjczOC8zNDI1IDk4NzYvMTI3MzkvMzQyNSA5NTY4LzEyNzI1LzM0MjUKK2YgOTU3MS8xMjQyOS8zMzM3IDk1NjYvMTI0MjgvMzMzNyA5ODc0LzEyNDI4LzMzMzcKK2YgOTg3NC8xMjQyOC8zMzM3IDk4NzkvMTI0MjkvMzMzNyA5NTcxLzEyNDI5LzMzMzcKK2YgOTU3Mi8xMjQyNy8zNzgxIDk1NzAvMTI0MjYvMzc4MSA5ODc4LzEyNDI2LzM3ODEKK2YgOTg3OC8xMjQyNi8zNzgyIDk4ODAvMTI3NDAvMzc4MiA5NTcyLzEyNDI3LzM3ODIKK2YgOTU2OS8xMjQzMC8zNDQ0IDk1NzEvMTI0MjkvMzQ0NCA5ODc5LzEyNDI5LzM0NDQKK2YgOTg3OS8xMjQyOS8zNzgzIDk4NzcvMTI3MzgvMzc4MyA5NTY5LzEyNDMwLzM3ODMKK2YgOTU3MC8xMjQyNi8zNDQ1IDk1NzMvMTI0MzEvMzQ0NSA5ODgxLzEyNzQxLzM0NDUKK2YgOTg4MS8xMjc0MS8zMzQyIDk4NzgvMTI0MjYvMzM0MiA5NTcwLzEyNDI2LzMzNDIKK2YgOTU3NC8xMjQ0My8zMzk1IDk1NjEvMTI0MjAvMzM5NSA5ODczLzEyNzM3LzMzOTUKK2YgOTg3My8xMjczNy8zNDU4IDk4ODIvMTI3NDIvMzQ1OCA5NTc0LzEyNDQzLzM0NTgKK2YgOTU1OS8xMjQxOC8zMzQ1IDk1NzUvMTI0NDEvMzM0NSA5ODgzLzEyNzQzLzMzNDUKK2YgOTg4My8xMjc0My8zMzQ1IDk4NzEvMTI3MzUvMzM0NSA5NTU5LzEyNDE4LzMzNDUKK2YgOTU3Ny8xMjQzNC8zMzQ4IDk1NzgvMTI0MzMvMzM0OCA5ODg2LzEyNzQ0LzMzNDgKK2YgOTg4Ni8xMjc0NC8zMzc3IDk4ODUvMTI0MzQvMzM3NyA5NTc3LzEyNDM0LzMzNzcKK2YgOTU3OS8xMjQzMi8zMzQ5IDk1NzYvMTI0MzUvMzM0OSA5ODg0LzEyNzQ1LzMzNDkKK2YgOTg4NC8xMjc0NS8zNzc4IDk4ODcvMTI0MzIvMzc3OCA5NTc5LzEyNDMyLzM3NzgKK2YgOTU4MS8xMjQzOC8zNzg0IDk1ODIvMTI0MzcvMzc4NCA5ODkwLzEyNDM3LzM3ODQKK2YgOTg5MC8xMjQzNy8zMzUxIDk4ODkvMTI3NDYvMzM1MSA5NTgxLzEyNDM4LzMzNTEKK2YgOTU4My8xMjQzNi8zMzI0IDk1ODAvMTI0MzkvMzMyNCA5ODg4LzEyNzQ3LzMzMjQKK2YgOTg4OC8xMjc0Ny8zNzg1IDk4OTEvMTI3NDgvMzc4NSA5NTgzLzEyNDM2LzM3ODUKK2YgOTU3NS8xMjQ0MS8zMzgyIDk1NzcvMTI0MzQvMzM4MiA5ODg1LzEyNDM0LzMzODIKK2YgOTg4NS8xMjQzNC8zMzU0IDk4ODMvMTI3NDMvMzM1NCA5NTc1LzEyNDQxLzMzNTQKK2YgOTU3Ni8xMjQzNS8zMzU1IDk1ODQvMTI0NDAvMzM1NSA5ODkyLzEyNzQ5LzMzNTUKK2YgOTg5Mi8xMjc0OS8zMzU2IDk4ODQvMTI3NDUvMzM1NiA5NTc2LzEyNDM1LzMzNTYKK2YgOTU4Mi8xMjQzNy8zNzg2IDk1NzQvMTI0NDMvMzc4NiA5ODgyLzEyNzQyLzM3ODYKK2YgOTg4Mi8xMjc0Mi8zMzU4IDk4OTAvMTI0MzcvMzM1OCA5NTgyLzEyNDM3LzMzNTgKK2YgOTU4NS8xMjQ0Mi8zMzU5IDk1ODMvMTI0MzYvMzM1OSA5ODkxLzEyNzQ4LzMzNTkKK2YgOTg5MS8xMjc0OC8zMzg3IDk4OTMvMTI3NTAvMzM4NyA5NTg1LzEyNDQyLzMzODcKK2YgOTU3OC8xMjQzMy8zMzYxIDk1NTMvMTI0MTAvMzM2MSA5ODY1LzEyNzI5LzMzNjEKK2YgOTg2NS8xMjcyOS8zNDM0IDk4ODYvMTI3NDQvMzQzNCA5NTc4LzEyNDMzLzM0MzQKK2YgOTU1NC8xMjQxNy8zMzkwIDk1ODEvMTI0MzgvMzM5MCA5ODg5LzEyNzQ2LzMzOTAKK2YgOTg4OS8xMjc0Ni8zMzkwIDk4NjYvMTI3MzIvMzM5MCA5NTU0LzEyNDE3LzMzOTAKK2YgOTU5MC8xMjQ1MC8zMzY1IDk1NzIvMTI0MjcvMzM2NSA5ODgwLzEyNzQwLzMzNjUKK2YgOTg4MC8xMjc0MC8zMzY1IDk4OTQvMTI0NTAvMzM2NSA5NTkwLzEyNDUwLzMzNjUKK2YgOTU3My8xMjQzMS8zMzY2IDk1OTEvMTI0NTIvMzM2NiA5ODk1LzEyNzUxLzMzNjYKK2YgOTg5NS8xMjc1MS8zNDU5IDk4ODEvMTI3NDEvMzQ1OSA5NTczLzEyNDMxLzM0NTkKK2YgOTU5My8xMjQ1MS8zNDI2IDk1OTAvMTI0NTAvMzQyNiA5ODk0LzEyNDUwLzM0MjYKK2YgOTg5NC8xMjQ1MC8zMzY4IDk4OTcvMTI3NTIvMzM2OCA5NTkzLzEyNDUxLzMzNjgKK2YgOTU5NC8xMjQ0OS8zNzg3IDk1OTIvMTI0NDgvMzc4NyA5ODk2LzEyNzUzLzM3ODcKK2YgOTg5Ni8xMjc1My8zNzg4IDk4OTgvMTI0NDkvMzc4OCA5NTk0LzEyNDQ5LzM3ODgKK2YgOTU5MS8xMjQ1Mi8zMzcxIDk1OTMvMTI0NTEvMzM3MSA5ODk3LzEyNzUyLzMzNzEKK2YgOTg5Ny8xMjc1Mi8zNDQ0IDk4OTUvMTI3NTEvMzQ0NCA5NTkxLzEyNDUyLzM0NDQKK2YgOTU5Mi8xMjQ0OC8zNDI4IDk1OTUvMTI0NTMvMzQyOCA5ODk5LzEyNzU0LzM0MjgKK2YgOTg5OS8xMjc1NC8zNzg5IDk4OTYvMTI3NTMvMzc4OSA5NTkyLzEyNDQ4LzM3ODkKK2YgOTU5Ni8xMjQ2NS8zNzQ3IDk1ODUvMTI0NDIvMzc0NyA5ODkzLzEyNzUwLzM3NDcKK2YgOTg5My8xMjc1MC8zMzk1IDk5MDAvMTI3NTUvMzM5NSA5NTk2LzEyNDY1LzMzOTUKK2YgOTU4NC8xMjQ0MC8zMzQ1IDk1OTcvMTI0NjMvMzM0NSA5OTAxLzEyNzU2LzMzNDUKK2YgOTkwMS8xMjc1Ni8zMzQ1IDk4OTIvMTI3NDkvMzM0NSA5NTg0LzEyNDQwLzMzNDUKK2YgOTU5OS8xMjQ1Ni8zMzQ4IDk2MDAvMTI0NTUvMzM0OCA5OTA0LzEyNDU1LzMzNDgKK2YgOTkwNC8xMjQ1NS8zMzc3IDk5MDMvMTI3NTcvMzM3NyA5NTk5LzEyNDU2LzMzNzcKK2YgOTYwMS8xMjQ1NC8zMzIxIDk1OTgvMTI0NTcvMzMyMSA5OTAyLzEyNzU4LzMzMjEKK2YgOTkwMi8xMjc1OC8zMzIxIDk5MDUvMTI0NTQvMzMyMSA5NjAxLzEyNDU0LzMzMjEKK2YgOTYwMy8xMjQ2MC8zMzUwIDk2MDQvMTI0NTkvMzM1MCA5OTA4LzEyNzU5LzMzNTAKK2YgOTkwOC8xMjc1OS8zMzc5IDk5MDcvMTI3NjAvMzM3OSA5NjAzLzEyNDYwLzMzNzkKK2YgOTYwNS8xMjQ1OC8zMzUyIDk2MDIvMTI0NjEvMzM1MiA5OTA2LzEyNzYxLzMzNTIKK2YgOTkwNi8xMjc2MS8zMzUzIDk5MDkvMTI3NjIvMzM1MyA5NjA1LzEyNDU4LzMzNTMKK2YgOTU5Ny8xMjQ2My8zMzgxIDk1OTkvMTI0NTYvMzM4MSA5OTAzLzEyNzU3LzMzODEKK2YgOTkwMy8xMjc1Ny8zNDMxIDk5MDEvMTI3NTYvMzQzMSA5NTk3LzEyNDYzLzM0MzEKK2YgOTU5OC8xMjQ1Ny8zMzI4IDk2MDYvMTI0NjIvMzMyOCA5OTEwLzEyNzYzLzMzMjgKK2YgOTkxMC8xMjc2My8zNzkwIDk5MDIvMTI3NTgvMzc5MCA5NTk4LzEyNDU3LzM3OTAKK2YgOTYwNC8xMjQ1OS8zMzg0IDk1OTYvMTI0NjUvMzM4NCA5OTAwLzEyNzU1LzMzODQKK2YgOTkwMC8xMjc1NS8zNzc5IDk5MDgvMTI3NTkvMzc3OSA5NjA0LzEyNDU5LzM3NzkKK2YgOTYwNy8xMjQ2NC8zMzg2IDk2MDUvMTI0NTgvMzM4NiA5OTA5LzEyNzYyLzMzODYKK2YgOTkwOS8xMjc2Mi8zMzg3IDk5MTEvMTI3NjQvMzM4NyA5NjA3LzEyNDY0LzMzODcKK2YgOTYwMC8xMjQ1NS8zMzYyIDk1NzkvMTI0MzIvMzM2MiA5ODg3LzEyNDMyLzMzNjIKK2YgOTg4Ny8xMjQzMi8zNDc4IDk5MDQvMTI0NTUvMzQ3OCA5NjAwLzEyNDU1LzM0NzgKK2YgOTU4MC8xMjQzOS8zMzYzIDk2MDMvMTI0NjAvMzM2MyA5OTA3LzEyNzYwLzMzNjMKK2YgOTkwNy8xMjc2MC8zNDE1IDk4ODgvMTI3NDcvMzQxNSA5NTgwLzEyNDM5LzM0MTUKK2YgOTYxMi8xMjQ3Mi8zMjM4IDk1OTQvMTI0NDkvMzIzOCA5ODk4LzEyNDQ5LzMyMzgKK2YgOTg5OC8xMjQ0OS8zMzMzIDk5MTIvMTI0NzIvMzMzMyA5NjEyLzEyNDcyLzMzMzMKK2YgOTU5NS8xMjQ1My8zNDI1IDk2MTMvMTI0NzQvMzQyNSA5OTEzLzEyNzY1LzM0MjUKK2YgOTkxMy8xMjc2NS8zNDI1IDk4OTkvMTI3NTQvMzQyNSA5NTk1LzEyNDUzLzM0MjUKK2YgOTYxNS8xMjQ3My8zNzkxIDk2MTIvMTI0NzIvMzc5MSA5OTEyLzEyNDcyLzM3OTEKK2YgOTkxMi8xMjQ3Mi8zNzkxIDk5MTUvMTI3NjYvMzc5MSA5NjE1LzEyNDczLzM3OTEKK2YgOTYxNi8xMjQ3MS8zMzM4IDk2MTQvMTI0NzAvMzMzOCA5OTE0LzEyNDcwLzMzMzgKK2YgOTkxNC8xMjQ3MC8zMzM4IDk5MTYvMTI3NjcvMzMzOCA5NjE2LzEyNDcxLzMzMzgKK2YgOTYxMy8xMjQ3NC8zNzkyIDk2MTUvMTI0NzMvMzc5MiA5OTE1LzEyNzY2LzM3OTIKK2YgOTkxNS8xMjc2Ni8zNDQ0IDk5MTMvMTI3NjUvMzQ0NCA5NjEzLzEyNDc0LzM0NDQKK2YgOTYxNC8xMjQ3MC8zNDI4IDk2MTcvMTI0NzUvMzQyOCA5OTE3LzEyNzY4LzM0MjgKK2YgOTkxNy8xMjc2OC8zNzg5IDk5MTQvMTI0NzAvMzc4OSA5NjE0LzEyNDcwLzM3ODkKK2YgOTYxOC8xMjQ5My8zMzY1IDk2MDcvMTI0NjQvMzM2NSA5OTExLzEyNzY0LzMzNjUKK2YgOTkxMS8xMjc2NC8zMzk1IDk5MTgvMTI3NjkvMzM5NSA5NjE4LzEyNDkzLzMzOTUKK2YgOTYyMC8xMjQ5MC8zMzQ1IDk2MjEvMTI1MDkvMzM0NSA5OTIxLzEyNzcwLzMzNDUKK2YgOTkyMS8xMjc3MC8zMzM1IDk5MjAvMTI3NzEvMzMzNSA5NjIwLzEyNDkwLzMzMzUKK2YgOTYyMi8xMjQ3OC8zNzkzIDk2MjMvMTI0NzcvMzc5MyA5OTIzLzEyNzcyLzM3OTMKK2YgOTkyMy8xMjc3Mi8zNzk0IDk5MjIvMTI0NzgvMzc5NCA5NjIyLzEyNDc4LzM3OTQKK2YgOTYyNC8xMjQ3Ni8zNDQyIDk2MTkvMTI0NzkvMzQ0MiA5OTE5LzEyNzczLzM0NDIKK2YgOTkxOS8xMjc3My8zMzM2IDk5MjQvMTI3NzQvMzMzNiA5NjI0LzEyNDc2LzMzMzYKK2YgOTYyMy8xMjQ3Ny8zNzk1IDk2MjUvMTI0ODEvMzc5NSA5OTI1LzEyNzc1LzM3OTUKK2YgOTkyNS8xMjc3NS8zNzk2IDk5MjMvMTI3NzIvMzc5NiA5NjIzLzEyNDc3LzM3OTYKK2YgOTYyNi8xMjQ4MC8zNzk3IDk2MjQvMTI0NzYvMzc5NyA5OTI0LzEyNzc0LzM3OTcKK2YgOTkyNC8xMjc3NC8zNDQ0IDk5MjYvMTI3NzYvMzQ0NCA5NjI2LzEyNDgwLzM0NDQKK2YgOTYyNy8xMjUxMS8zMjM4IDk2MjgvMTI0OTIvMzIzOCA5OTI4LzEyNzc3LzMyMzgKK2YgOTkyOC8xMjc3Ny8zNDY5IDk5MjcvMTI3NzgvMzQ2OSA5NjI3LzEyNTExLzM0NjkKK2YgOTYwNi8xMjQ2Mi8zMzM1IDk2MjkvMTI0OTEvMzMzNSA5OTI5LzEyNzc5LzMzMzUKK2YgOTkyOS8xMjc3OS8zMzQ2IDk5MTAvMTI3NjMvMzM0NiA5NjA2LzEyNDYyLzMzNDYKK2YgOTYzMS8xMjQ4NC8zMzc3IDk2MzIvMTI0ODMvMzM3NyA5OTMyLzEyNzgwLzMzNzcKK2YgOTkzMi8xMjc4MC8zMzc3IDk5MzEvMTI0ODQvMzM3NyA5NjMxLzEyNDg0LzMzNzcKK2YgOTYzMy8xMjQ4Mi8zNzk4IDk2MzAvMTI0ODUvMzc5OCA5OTMwLzEyNDg1LzM3OTgKK2YgOTkzMC8xMjQ4NS8zNzk5IDk5MzMvMTI0ODIvMzc5OSA5NjMzLzEyNDgyLzM3OTkKK2YgOTYzNS8xMjQ4OC8zNDA0IDk2MzYvMTI0ODcvMzQwNCA5OTM2LzEyNDg3LzM0MDQKK2YgOTkzNi8xMjQ4Ny8zMzc5IDk5MzUvMTI3ODEvMzM3OSA5NjM1LzEyNDg4LzMzNzkKK2YgOTYzNy8xMjQ4Ni8zNDczIDk2MzQvMTI0ODkvMzQ3MyA5OTM0LzEyNzgyLzM0NzMKK2YgOTkzNC8xMjc4Mi8zODAwIDk5MzcvMTI0ODYvMzgwMCA5NjM3LzEyNDg2LzM4MDAKK2YgOTYyOS8xMjQ5MS8zODAxIDk2MzEvMTI0ODQvMzgwMSA5OTMxLzEyNDg0LzM4MDEKK2YgOTkzMS8xMjQ4NC8zODAyIDk5MjkvMTI3NzkvMzgwMiA5NjI5LzEyNDkxLzM4MDIKK2YgOTYzMC8xMjQ4NS8zODAzIDk2MjAvMTI0OTAvMzgwMyA5OTIwLzEyNzcxLzM4MDMKK2YgOTkyMC8xMjc3MS8zODA0IDk5MzAvMTI0ODUvMzgwNCA5NjMwLzEyNDg1LzM4MDQKK2YgOTYzNi8xMjQ4Ny8zODA1IDk2MTgvMTI0OTMvMzgwNSA5OTE4LzEyNzY5LzM4MDUKK2YgOTkxOC8xMjc2OS8zNDExIDk5MzYvMTI0ODcvMzQxMSA5NjM2LzEyNDg3LzM0MTEKK2YgOTYyOC8xMjQ5Mi8zODA2IDk2MzcvMTI0ODYvMzgwNiA5OTM3LzEyNDg2LzM4MDYKK2YgOTkzNy8xMjQ4Ni8zODA3IDk5MjgvMTI3NzcvMzgwNyA5NjI4LzEyNDkyLzM4MDcKK2YgOTYzMi8xMjQ4My8zMzYyIDk2MDEvMTI0NTQvMzM2MiA5OTA1LzEyNDU0LzMzNjIKK2YgOTkwNS8xMjQ1NC8zNDc4IDk5MzIvMTI3ODAvMzQ3OCA5NjMyLzEyNDgzLzM0NzgKK2YgOTY0MS8xMjQ5NS8zMzYyIDk2MzMvMTI0ODIvMzM2MiA5OTMzLzEyNDgyLzMzNjIKK2YgOTkzMy8xMjQ4Mi8zNDM0IDk5MzgvMTI0OTUvMzQzNCA5NjQxLzEyNDk1LzM0MzQKK2YgOTYzNC8xMjQ4OS8zNDE0IDk2NDIvMTI1MDAvMzQxNCA5OTM5LzEyNzgzLzM0MTQKK2YgOTkzOS8xMjc4My8zNDE0IDk5MzQvMTI3ODIvMzQxNCA5NjM0LzEyNDg5LzM0MTQKK2YgOTYwMi8xMjQ2MS8zMzkwIDk2MzUvMTI0ODgvMzM5MCA5OTM1LzEyNzgxLzMzOTAKK2YgOTkzNS8xMjc4MS8zMzkwIDk5MDYvMTI3NjEvMzM5MCA5NjAyLzEyNDYxLzMzOTAKK2YgOTYxOS8xMjQ3OS8zMzY1IDk2MTYvMTI0NzEvMzM2NSA5OTE2LzEyNzY3LzMzNjUKK2YgOTkxNi8xMjc2Ny8zMzY1IDk5MTkvMTI3NzMvMzM2NSA5NjE5LzEyNDc5LzMzNjUKK2YgOTYxNy8xMjQ3NS8zNDI1IDk2MjYvMTI0ODAvMzQyNSA5OTI2LzEyNzc2LzM0MjUKK2YgOTkyNi8xMjc3Ni8zNDU5IDk5MTcvMTI3NjgvMzQ1OSA5NjE3LzEyNDc1LzM0NTkKK2YgOTY0Ny8xMjUwMy8zODA4IDk2NDEvMTI0OTUvMzgwOCA5OTM4LzEyNDk1LzM4MDgKK2YgOTkzOC8xMjQ5NS8zNzEwIDk5NDEvMTI3ODQvMzcxMCA5NjQ3LzEyNTAzLzM3MTAKK2YgOTY0OC8xMjUwMi8zNzc4IDk2NDYvMTI1MDQvMzc3OCA5OTQwLzEyNzg1LzM3NzgKK2YgOTk0MC8xMjc4NS8zNDM3IDk5NDIvMTI1MDIvMzQzNyA5NjQ4LzEyNTAyLzM0MzcKK2YgOTY0Mi8xMjUwMC8zNzExIDk2NTAvMTI1MDYvMzcxMSA5OTQ0LzEyNzg2LzM3MTEKK2YgOTk0NC8xMjc4Ni8zNDE4IDk5MzkvMTI3ODMvMzQxOCA5NjQyLzEyNTAwLzM0MTgKK2YgOTY1MS8xMjUwNS8zMzUyIDk2NDkvMTI1MDcvMzM1MiA5OTQzLzEyNzg3LzMzNTIKK2YgOTk0My8xMjc4Ny8zMzI1IDk5NDUvMTI3ODgvMzMyNSA5NjUxLzEyNTA1LzMzMjUKK2YgOTYyMS8xMjUwOS8zNDIwIDk2NDcvMTI1MDMvMzQyMCA5OTQxLzEyNzg0LzM0MjAKK2YgOTk0MS8xMjc4NC8zNDIxIDk5MjEvMTI3NzAvMzQyMSA5NjIxLzEyNTA5LzM0MjEKK2YgOTY0Ni8xMjUwNC8zMzI4IDk2NTIvMTI1MDgvMzMyOCA5OTQ2LzEyNzg5LzMzMjgKK2YgOTk0Ni8xMjc4OS8zMzU2IDk5NDAvMTI3ODUvMzM1NiA5NjQ2LzEyNTA0LzMzNTYKK2YgOTY1MC8xMjUwNi8zNDIyIDk2MjcvMTI1MTEvMzQyMiA5OTI3LzEyNzc4LzM0MjIKK2YgOTkyNy8xMjc3OC8zMzI5IDk5NDQvMTI3ODYvMzMyOSA5NjUwLzEyNTA2LzMzMjkKK2YgOTY1My8xMjUxMC8zODA5IDk2NTEvMTI1MDUvMzgwOSA5OTQ1LzEyNzg4LzM4MDkKK2YgOTk0NS8xMjc4OC8zMzMyIDk5NDcvMTI3OTAvMzMzMiA5NjUzLzEyNTEwLzMzMzIKK2YgOTY1Ni8xMjUxNi8zMzY1IDk2MjIvMTI0NzgvMzM2NSA5OTIyLzEyNDc4LzMzNjUKK2YgOTkyMi8xMjQ3OC8zMzY1IDk5NDgvMTI1MTYvMzM2NSA5NjU2LzEyNTE2LzMzNjUKK2YgOTYyNS8xMjQ4MS8zNjg4IDk2NTcvMTI1MTgvMzY4OCA5OTQ5LzEyNzkxLzM2ODgKK2YgOTk0OS8xMjc5MS8zNDU5IDk5MjUvMTI3NzUvMzQ1OSA5NjI1LzEyNDgxLzM0NTkKK2YgOTY1OS8xMjUxNy8zMzM2IDk2NTYvMTI1MTYvMzMzNiA5OTQ4LzEyNTE2LzMzMzYKK2YgOTk0OC8xMjUxNi8zMzY4IDk5NTEvMTI3OTIvMzM2OCA5NjU5LzEyNTE3LzMzNjgKK2YgOTY2MC8xMjUxNS8zMzM4IDk2NTgvMTI1MTQvMzMzOCA5OTUwLzEyNTE0LzMzMzgKK2YgOTk1MC8xMjUxNC8zODEwIDk5NTIvMTI1MTUvMzgxMCA5NjYwLzEyNTE1LzM4MTAKK2YgOTY1Ny8xMjUxOC8zMzcxIDk2NTkvMTI1MTcvMzM3MSA5OTUxLzEyNzkyLzMzNzEKK2YgOTk1MS8xMjc5Mi8zODExIDk5NDkvMTI3OTEvMzgxMSA5NjU3LzEyNTE4LzM4MTEKK2YgOTY1OC8xMjUxNC8zMzQxIDk2NjEvMTI1MTkvMzM0MSA5OTUzLzEyNzkzLzMzNDEKK2YgOTk1My8xMjc5My8zMzczIDk5NTAvMTI1MTQvMzM3MyA5NjU4LzEyNTE0LzMzNzMKK2YgOTY2Mi8xMjUzMS8zMzQ0IDk2NTMvMTI1MTAvMzM0NCA5OTQ3LzEyNzkwLzMzNDQKK2YgOTk0Ny8xMjc5MC8zMzk1IDk5NTQvMTI3OTQvMzM5NSA5NjYyLzEyNTMxLzMzOTUKK2YgOTY1Mi8xMjUwOC8zMzQ1IDk2NjMvMTI1MjkvMzM0NSA5OTU1LzEyNzk1LzMzNDUKK2YgOTk1NS8xMjc5NS8zMzM1IDk5NDYvMTI3ODkvMzMzNSA5NjUyLzEyNTA4LzMzMzUKK2YgOTY2NS8xMjUyMi8zMzc3IDk2NjYvMTI1MjEvMzM3NyA5OTU4LzEyNTIxLzMzNzcKK2YgOTk1OC8xMjUyMS8zODEyIDk5NTcvMTI1MjIvMzgxMiA5NjY1LzEyNTIyLzM4MTIKK2YgOTY2Ny8xMjUyMC8zMzQ5IDk2NjQvMTI1MjMvMzM0OSA5OTU2LzEyNTIzLzMzNDkKK2YgOTk1Ni8xMjUyMy8zMzQ5IDk5NTkvMTI3OTYvMzM0OSA5NjY3LzEyNTIwLzMzNDkKK2YgOTY2OS8xMjUyNi8zMzc4IDk2NzAvMTI1MjUvMzM3OCA5OTYyLzEyNTI1LzMzNzgKK2YgOTk2Mi8xMjUyNS8zMzc5IDk5NjEvMTI3OTcvMzM3OSA5NjY5LzEyNTI2LzMzNzkKK2YgOTY3MS8xMjUyNC8zODEzIDk2NjgvMTI1MjcvMzgxMyA5OTYwLzEyNzk4LzM4MTMKK2YgOTk2MC8xMjc5OC8zNzg1IDk5NjMvMTI1MjQvMzc4NSA5NjcxLzEyNTI0LzM3ODUKK2YgOTY2My8xMjUyOS8zMzgyIDk2NjUvMTI1MjIvMzM4MiA5OTU3LzEyNTIyLzMzODIKK2YgOTk1Ny8xMjUyMi8zMzgxIDk5NTUvMTI3OTUvMzM4MSA5NjYzLzEyNTI5LzMzODEKK2YgOTY2NC8xMjUyMy8zMzI4IDk2NzIvMTI1MjgvMzMyOCA5OTY0LzEyNzk5LzMzMjgKK2YgOTk2NC8xMjc5OS8zMzI4IDk5NTYvMTI1MjMvMzMyOCA5NjY0LzEyNTIzLzMzMjgKK2YgOTY3MC8xMjUyNS8zMzU3IDk2NjIvMTI1MzEvMzM1NyA5OTU0LzEyNzk0LzMzNTcKK2YgOTk1NC8xMjc5NC8zODE0IDk5NjIvMTI1MjUvMzgxNCA5NjcwLzEyNTI1LzM4MTQKK2YgOTY3My8xMjUzMC8zNDIzIDk2NzEvMTI1MjQvMzQyMyA5OTYzLzEyNTI0LzM0MjMKK2YgOTk2My8xMjUyNC8zNDMzIDk5NjUvMTI4MDAvMzQzMyA5NjczLzEyNTMwLzM0MzMKK2YgOTY2Ni8xMjUyMS8zMzg4IDk2NDgvMTI1MDIvMzM4OCA5OTQyLzEyNTAyLzMzODgKK2YgOTk0Mi8xMjUwMi8zNDM0IDk5NTgvMTI1MjEvMzQzNCA5NjY2LzEyNTIxLzM0MzQKK2YgOTY0OS8xMjUwNy8zODE1IDk2NjkvMTI1MjYvMzgxNSA5OTYxLzEyNzk3LzM4MTUKK2YgOTk2MS8xMjc5Ny8zMzkwIDk5NDMvMTI3ODcvMzM5MCA5NjQ5LzEyNTA3LzMzOTAKK2YgOTY3OC8xMjUzOC8zMjM4IDk2NjAvMTI1MTUvMzIzOCA5OTUyLzEyNTE1LzMyMzgKK2YgOTk1Mi8xMjUxNS8zMzY1IDk5NjYvMTI4MDEvMzM2NSA5Njc4LzEyNTM4LzMzNjUKK2YgOTY2MS8xMjUxOS8zNDU5IDk2NzkvMTI1NDAvMzQ1OSA5OTY3LzEyODAyLzM0NTkKK2YgOTk2Ny8xMjgwMi8zNDU5IDk5NTMvMTI3OTMvMzQ1OSA5NjYxLzEyNTE5LzM0NTkKK2YgOTY4MS8xMjUzOS8zNDI2IDk2NzgvMTI1MzgvMzQyNiA5OTY2LzEyODAxLzM0MjYKK2YgOTk2Ni8xMjgwMS8zMzY4IDk5NjkvMTI1MzkvMzM2OCA5NjgxLzEyNTM5LzMzNjgKK2YgOTY4Mi8xMjUzNy8zMzM4IDk2ODAvMTI1MzYvMzMzOCA5OTY4LzEyODAzLzMzMzgKK2YgOTk2OC8xMjgwMy8zMzM5IDk5NzAvMTI1MzcvMzMzOSA5NjgyLzEyNTM3LzMzMzkKK2YgOTY3OS8xMjU0MC8zNDAwIDk2ODEvMTI1MzkvMzQwMCA5OTY5LzEyNTM5LzM0MDAKK2YgOTk2OS8xMjUzOS8zNDQ0IDk5NjcvMTI4MDIvMzQ0NCA5Njc5LzEyNTQwLzM0NDQKK2YgOTY4MC8xMjUzNi8zNDI4IDk2ODMvMTI1NDEvMzQyOCA5OTcxLzEyODA0LzM0MjgKK2YgOTk3MS8xMjgwNC8zODE2IDk5NjgvMTI4MDMvMzgxNiA5NjgwLzEyNTM2LzM4MTYKK2YgOTY4NC8xMjU1My8zMzQ0IDk2NzMvMTI1MzAvMzM0NCA5OTY1LzEyODAwLzMzNDQKK2YgOTk2NS8xMjgwMC8zMzc1IDk5NzIvMTI4MDUvMzM3NSA5Njg0LzEyNTUzLzMzNzUKK2YgOTY3Mi8xMjUyOC8zMzQ1IDk2ODUvMTI1NTEvMzM0NSA5OTczLzEyODA2LzMzNDUKK2YgOTk3My8xMjgwNi8zMzQ1IDk5NjQvMTI3OTkvMzM0NSA5NjcyLzEyNTI4LzMzNDUKK2YgOTY4Ny8xMjU0NC8zMzc3IDk2ODgvMTI1NDMvMzM3NyA5OTc2LzEyNTQzLzMzNzcKK2YgOTk3Ni8xMjU0My8zNDE2IDk5NzUvMTI4MDcvMzQxNiA5Njg3LzEyNTQ0LzM0MTYKK2YgOTY4OS8xMjU0Mi8zMzIxIDk2ODYvMTI1NDUvMzMyMSA5OTc0LzEyODA4LzMzMjEKK2YgOTk3NC8xMjgwOC8zNDQ4IDk5NzcvMTI1NDIvMzQ0OCA5Njg5LzEyNTQyLzM0NDgKK2YgOTY5MS8xMjU0OC8zODE3IDk2OTIvMTI1NDcvMzgxNyA5OTgwLzEyODA5LzM4MTcKK2YgOTk4MC8xMjgwOS8zNDM4IDk5NzkvMTI4MTAvMzQzOCA5NjkxLzEyNTQ4LzM0MzgKK2YgOTY5My8xMjU0Ni8zODE4IDk2OTAvMTI1NDkvMzgxOCA5OTc4LzEyODExLzM4MTgKK2YgOTk3OC8xMjgxMS8zMzgwIDk5ODEvMTI4MTIvMzM4MCA5NjkzLzEyNTQ2LzMzODAKK2YgOTY4NS8xMjU1MS8zMzgxIDk2ODcvMTI1NDQvMzM4MSA5OTc1LzEyODA3LzMzODEKK2YgOTk3NS8xMjgwNy8zMzgxIDk5NzMvMTI4MDYvMzM4MSA5Njg1LzEyNTUxLzMzODEKK2YgOTY4Ni8xMjU0NS8zNDM5IDk2OTQvMTI1NTAvMzQzOSA5OTgyLzEyODEzLzM0MzkKK2YgOTk4Mi8xMjgxMy8zMzI3IDk5NzQvMTI4MDgvMzMyNyA5Njg2LzEyNTQ1LzMzMjcKK2YgOTY5Mi8xMjU0Ny8zODE5IDk2ODQvMTI1NTMvMzgxOSA5OTcyLzEyODA1LzM4MTkKK2YgOTk3Mi8xMjgwNS8zODIwIDk5ODAvMTI4MDkvMzgyMCA5NjkyLzEyNTQ3LzM4MjAKK2YgOTY5NS8xMjU1Mi8zMzg2IDk2OTMvMTI1NDYvMzM4NiA5OTgxLzEyODEyLzMzODYKK2YgOTk4MS8xMjgxMi8zNzgwIDk5ODMvMTI4MTQvMzc4MCA5Njk1LzEyNTUyLzM3ODAKK2YgOTY4OC8xMjU0My8zMzg4IDk2NjcvMTI1MjAvMzM4OCA5OTU5LzEyNzk2LzMzODgKK2YgOTk1OS8xMjc5Ni8zNDc4IDk5NzYvMTI1NDMvMzQ3OCA5Njg4LzEyNTQzLzM0NzgKK2YgOTY2OC8xMjUyNy8zNDQxIDk2OTEvMTI1NDgvMzQ0MSA5OTc5LzEyODEwLzM0NDEKK2YgOTk3OS8xMjgxMC8zNDE0IDk5NjAvMTI3OTgvMzQxNCA5NjY4LzEyNTI3LzM0MTQKK2YgOTcwMC8xMjU2MC8zMzY1IDk2ODIvMTI1MzcvMzM2NSA5OTcwLzEyNTM3LzMzNjUKK2YgOTk3MC8xMjUzNy8zMzY1IDk5ODQvMTI1NjAvMzM2NSA5NzAwLzEyNTYwLzMzNjUKK2YgOTY4My8xMjU0MS8zMzY2IDk3MDEvMTI1NjIvMzM2NiA5OTg1LzEyODE1LzMzNjYKK2YgOTk4NS8xMjgxNS8zNDI1IDk5NzEvMTI4MDQvMzQyNSA5NjgzLzEyNTQxLzM0MjUKK2YgOTcwMy8xMjU2MS8zMzM2IDk3MDAvMTI1NjAvMzMzNiA5OTg0LzEyNTYwLzMzMzYKK2YgOTk4NC8xMjU2MC8zNDc5IDk5ODcvMTI4MTYvMzQ3OSA5NzAzLzEyNTYxLzM0NzkKK2YgOTcwNC8xMjU1OS8zMzM4IDk3MDIvMTI1NTgvMzMzOCA5OTg2LzEyODE3LzMzMzgKK2YgOTk4Ni8xMjgxNy8zODIxIDk5ODgvMTI1NTkvMzgyMSA5NzA0LzEyNTU5LzM4MjEKK2YgOTcwMS8xMjU2Mi8zNDAwIDk3MDMvMTI1NjEvMzQwMCA5OTg3LzEyODE2LzM0MDAKK2YgOTk4Ny8xMjgxNi8zMzQwIDk5ODUvMTI4MTUvMzM0MCA5NzAxLzEyNTYyLzMzNDAKK2YgOTcwMi8xMjU1OC8zNDI4IDk3MDUvMTI1NjMvMzQyOCA5OTg5LzEyODE4LzM0MjgKK2YgOTk4OS8xMjgxOC8zMzQyIDk5ODYvMTI4MTcvMzM0MiA5NzAyLzEyNTU4LzMzNDIKK2YgOTcwNi8xMjU3NS8zMzQ0IDk2OTUvMTI1NTIvMzM0NCA5OTgzLzEyODE0LzMzNDQKK2YgOTk4My8xMjgxNC8zMzQ0IDk5OTAvMTI4MTkvMzM0NCA5NzA2LzEyNTc1LzMzNDQKK2YgOTY5NC8xMjU1MC8zNDcwIDk3MDcvMTI1NzMvMzQ3MCA5OTkxLzEyODIwLzM0NzAKK2YgOTk5MS8xMjgyMC8zMzM0IDk5ODIvMTI4MTMvMzMzNCA5Njk0LzEyNTUwLzMzMzQKK2YgOTcwOS8xMjU2Ni8zODIyIDk3MTAvMTI1NjUvMzgyMiA5OTk0LzEyNTY1LzM4MjIKK2YgOTk5NC8xMjU2NS8zMzQ3IDk5OTMvMTI4MjEvMzM0NyA5NzA5LzEyNTY2LzMzNDcKK2YgOTcxMS8xMjU2NC8zMzIxIDk3MDgvMTI1NjcvMzMyMSA5OTkyLzEyNTY3LzMzMjEKK2YgOTk5Mi8xMjU2Ny8zMzQ5IDk5OTUvMTI4MjIvMzM0OSA5NzExLzEyNTY0LzMzNDkKK2YgOTcxMy8xMjU3MC8zMzUwIDk3MTQvMTI1NjkvMzM1MCA5OTk4LzEyODIzLzMzNTAKK2YgOTk5OC8xMjgyMy8zODIzIDk5OTcvMTI4MjQvMzgyMyA5NzEzLzEyNTcwLzM4MjMKK2YgOTcxNS8xMjU2OC8zODE4IDk3MTIvMTI1NzEvMzgxOCA5OTk2LzEyODI1LzM4MTgKK2YgOTk5Ni8xMjgyNS8zNzg1IDk5OTkvMTI1NjgvMzc4NSA5NzE1LzEyNTY4LzM3ODUKK2YgOTcwNy8xMjU3My8zNDUxIDk3MDkvMTI1NjYvMzQ1MSA5OTkzLzEyODIxLzM0NTEKK2YgOTk5My8xMjgyMS8zNDUwIDk5OTEvMTI4MjAvMzQ1MCA5NzA3LzEyNTczLzM0NTAKK2YgOTcwOC8xMjU2Ny8zNDUyIDk3MTYvMTI1NzIvMzQ1MiAxMDAwMC8xMjgyNi8zNDUyCitmIDEwMDAwLzEyODI2LzM0NTIgOTk5Mi8xMjU2Ny8zNDUyIDk3MDgvMTI1NjcvMzQ1MgorZiA5NzE0LzEyNTY5LzM4MjQgOTcwNi8xMjU3NS8zODI0IDk5OTAvMTI4MTkvMzgyNAorZiA5OTkwLzEyODE5LzM0NTUgOTk5OC8xMjgyMy8zNDU1IDk3MTQvMTI1NjkvMzQ1NQorZiA5NzE3LzEyNTc0LzM0NTYgOTcxNS8xMjU2OC8zNDU2IDk5OTkvMTI1NjgvMzQ1NgorZiA5OTk5LzEyNTY4LzM4MjUgMTAwMDEvMTI4MjcvMzgyNSA5NzE3LzEyNTc0LzM4MjUKK2YgOTcxMC8xMjU2NS8zNDM0IDk2ODkvMTI1NDIvMzQzNCA5OTc3LzEyNTQyLzM0MzQKK2YgOTk3Ny8xMjU0Mi8zNDc4IDk5OTQvMTI1NjUvMzQ3OCA5NzEwLzEyNTY1LzM0NzgKK2YgOTY5MC8xMjU0OS8zNDQxIDk3MTMvMTI1NzAvMzQ0MSA5OTk3LzEyODI0LzM0NDEKK2YgOTk5Ny8xMjgyNC8zNDQxIDk5NzgvMTI4MTEvMzQ0MSA5NjkwLzEyNTQ5LzM0NDEKK2YgOTcyMi8xMjU4Mi8zMjM4IDk3MDQvMTI1NTkvMzIzOCA5OTg4LzEyNTU5LzMyMzgKK2YgOTk4OC8xMjU1OS8zMzY1IDEwMDAyLzEyNTgyLzMzNjUgOTcyMi8xMjU4Mi8zMzY1CitmIDk3MDUvMTI1NjMvMzY4OCA5NzIzLzEyNTg0LzM2ODggMTAwMDMvMTI4MjgvMzY4OAorZiAxMDAwMy8xMjgyOC8zNDU5IDk5ODkvMTI4MTgvMzQ1OSA5NzA1LzEyNTYzLzM0NTkKK2YgOTcyNS8xMjU4My8zNDYxIDk3MjIvMTI1ODIvMzQ2MSAxMDAwMi8xMjU4Mi8zNDYxCitmIDEwMDAyLzEyNTgyLzM4MjYgMTAwMDUvMTI1ODMvMzgyNiA5NzI1LzEyNTgzLzM4MjYKK2YgOTcyNi8xMjU4MS8zNDYzIDk3MjQvMTI1ODAvMzQ2MyAxMDAwNC8xMjgyOS8zNDYzCitmIDEwMDA0LzEyODI5LzM0NjQgMTAwMDYvMTI4MzAvMzQ2NCA5NzI2LzEyNTgxLzM0NjQKK2YgOTcyMy8xMjU4NC8zODI3IDk3MjUvMTI1ODMvMzgyNyAxMDAwNS8xMjU4My8zODI3CitmIDEwMDA1LzEyNTgzLzM4MjggMTAwMDMvMTI4MjgvMzgyOCA5NzIzLzEyNTg0LzM4MjgKK2YgOTcyNC8xMjU4MC8zNDY3IDk3MjcvMTI1ODUvMzQ2NyAxMDAwNy8xMjgzMS8zNDY3CitmIDEwMDA3LzEyODMxLzM0NjggMTAwMDQvMTI4MjkvMzQ2OCA5NzI0LzEyNTgwLzM0NjgKK2YgOTcyOC8xMjU5Ny8zMzc1IDk3MTcvMTI1NzQvMzM3NSAxMDAwMS8xMjgyNy8zMzc1CitmIDEwMDAxLzEyODI3LzMzNDQgMTAwMDgvMTI4MzIvMzM0NCA5NzI4LzEyNTk3LzMzNDQKK2YgOTcxNi8xMjU3Mi8zMzM1IDk3MjkvMTI1OTUvMzMzNSAxMDAwOS8xMjgzMy8zMzM1CitmIDEwMDA5LzEyODMzLzM2MzUgMTAwMDAvMTI4MjYvMzYzNSA5NzE2LzEyNTcyLzM2MzUKK2YgOTczMS8xMjU4OC8zODEyIDk3MzIvMTI1ODcvMzgxMiAxMDAxMi8xMjgzNC8zODEyCitmIDEwMDEyLzEyODM0LzMzNDggMTAwMTEvMTI4MzUvMzM0OCA5NzMxLzEyNTg4LzMzNDgKK2YgOTczMy8xMjU4Ni8zODI5IDk3MzAvMTI1ODkvMzgyOSAxMDAxMC8xMjgzNi8zODI5CitmIDEwMDEwLzEyODM2LzM1NTUgMTAwMTMvMTI1ODYvMzU1NSA5NzMzLzEyNTg2LzM1NTUKK2YgOTczNS8xMjU5Mi8zNDE3IDk3MzYvMTI1OTEvMzQxNyAxMDAxNi8xMjgzNy8zNDE3CitmIDEwMDE2LzEyODM3LzMzNzkgMTAwMTUvMTI4MzgvMzM3OSA5NzM1LzEyNTkyLzMzNzkKK2YgOTczNy8xMjU5MC8zODMwIDk3MzQvMTI1OTMvMzgzMCAxMDAxNC8xMjgzOS8zODMwCitmIDEwMDE0LzEyODM5LzM0NDkgMTAwMTcvMTI4NDAvMzQ0OSA5NzM3LzEyNTkwLzM0NDkKK2YgOTcyOS8xMjU5NS8zODMxIDk3MzEvMTI1ODgvMzgzMSAxMDAxMS8xMjgzNS8zODMxCitmIDEwMDExLzEyODM1LzM4MDEgMTAwMDkvMTI4MzMvMzgwMSA5NzI5LzEyNTk1LzM4MDEKK2YgOTczMC8xMjU4OS8zODMyIDk3MzgvMTI1OTQvMzgzMiAxMDAxOC8xMjg0MS8zODMyCitmIDEwMDE4LzEyODQxLzMzNTIgMTAwMTAvMTI4MzYvMzM1MiA5NzMwLzEyNTg5LzMzNTIKK2YgOTczNi8xMjU5MS8zNDc0IDk3MjgvMTI1OTcvMzQ3NCAxMDAwOC8xMjgzMi8zNDc0CitmIDEwMDA4LzEyODMyLzM0NzUgMTAwMTYvMTI4MzcvMzQ3NSA5NzM2LzEyNTkxLzM0NzUKK2YgOTczOS8xMjU5Ni8zODI5IDk3MzcvMTI1OTAvMzgyOSAxMDAxNy8xMjg0MC8zODI5CitmIDEwMDE3LzEyODQwLzM0NzcgMTAwMTkvMTI4NDIvMzQ3NyA5NzM5LzEyNTk2LzM0NzcKK2YgOTczMi8xMjU4Ny8zNDM0IDk3MTEvMTI1NjQvMzQzNCA5OTk1LzEyODIyLzM0MzQKK2YgOTk5NS8xMjgyMi8zMzYyIDEwMDEyLzEyODM0LzMzNjIgOTczMi8xMjU4Ny8zMzYyCitmIDk3MTIvMTI1NzEvMzQxNCA5NzM1LzEyNTkyLzM0MTQgMTAwMTUvMTI4MzgvMzQxNAorZiAxMDAxNS8xMjgzOC8zNDQxIDk5OTYvMTI4MjUvMzQ0MSA5NzEyLzEyNTcxLzM0NDEKK2YgOTc0NC8xMjYwNC8zMzY1IDk3MjYvMTI1ODEvMzM2NSAxMDAwNi8xMjgzMC8zMzY1CitmIDEwMDA2LzEyODMwLzMzNjUgMTAwMjAvMTI2MDQvMzM2NSA5NzQ0LzEyNjA0LzMzNjUKK2YgOTcyNy8xMjU4NS8zMzY2IDk3NDUvMTI2MDYvMzM2NiAxMDAyMS8xMjg0My8zMzY2CitmIDEwMDIxLzEyODQzLzM0NTkgMTAwMDcvMTI4MzEvMzQ1OSA5NzI3LzEyNTg1LzM0NTkKK2YgOTc0Ny8xMjYwNS8zODMzIDk3NDQvMTI2MDQvMzgzMyAxMDAyMC8xMjYwNC8zODMzCitmIDEwMDIwLzEyNjA0LzM4MzQgMTAwMjMvMTI4NDQvMzgzNCA5NzQ3LzEyNjA1LzM4MzQKK2YgOTc0OC8xMjYwMy8zODM1IDk3NDYvMTI2MDIvMzgzNSAxMDAyMi8xMjg0NS8zODM1CitmIDEwMDIyLzEyODQ1LzM1OTcgMTAwMjQvMTI2MDMvMzU5NyA5NzQ4LzEyNjAzLzM1OTcKK2YgOTc0NS8xMjYwNi8zNDAxIDk3NDcvMTI2MDUvMzQwMSAxMDAyMy8xMjg0NC8zNDAxCitmIDEwMDIzLzEyODQ0LzM0ODIgMTAwMjEvMTI4NDMvMzQ4MiA5NzQ1LzEyNjA2LzM0ODIKK2YgOTc0Ni8xMjYwMi8zNjc4IDk3NDkvMTI2MDcvMzY3OCAxMDAyNS8xMjg0Ni8zNjc4CitmIDEwMDI1LzEyODQ2LzM4MzYgMTAwMjIvMTI4NDUvMzgzNiA5NzQ2LzEyNjAyLzM4MzYKK2YgOTc1MC8xMjYxOS8zMzk1IDk3MzkvMTI1OTYvMzM5NSAxMDAxOS8xMjg0Mi8zMzk1CitmIDEwMDE5LzEyODQyLzMzNDQgMTAwMjYvMTI4NDcvMzM0NCA5NzUwLzEyNjE5LzMzNDQKK2YgOTczOC8xMjU5NC8zMzQ2IDk3NTEvMTI2MTcvMzM0NiAxMDAyNy8xMjg0OC8zMzQ2CitmIDEwMDI3LzEyODQ4LzMzNDUgMTAwMTgvMTI4NDEvMzM0NSA5NzM4LzEyNTk0LzMzNDUKK2YgOTc1My8xMjYxMC8zNDg1IDk3NTQvMTI2MDkvMzQ4NSAxMDAzMC8xMjYwOS8zNDg1CitmIDEwMDMwLzEyNjA5LzM4MzcgMTAwMjkvMTI4NDkvMzgzNyA5NzUzLzEyNjEwLzM4MzcKK2YgOTc1NS8xMjYwOC8zNDg2IDk3NTIvMTI2MTEvMzQ4NiAxMDAyOC8xMjg1MC8zNDg2CitmIDEwMDI4LzEyODUwLzM4MzggMTAwMzEvMTI4NTEvMzgzOCA5NzU1LzEyNjA4LzM4MzgKK2YgOTc1Ny8xMjYxNC8zNDg3IDk3NTgvMTI2MTMvMzQ4NyAxMDAzNC8xMjg1Mi8zNDg3CitmIDEwMDM0LzEyODUyLzM4MzkgMTAwMzMvMTI4NTMvMzgzOSA5NzU3LzEyNjE0LzM4MzkKK2YgOTc1OS8xMjYxMi8zODQwIDk3NTYvMTI2MTUvMzg0MCAxMDAzMi8xMjg1NC8zODQwCitmIDEwMDMyLzEyODU0LzM0OTAgMTAwMzUvMTI4NTUvMzQ5MCA5NzU5LzEyNjEyLzM0OTAKK2YgOTc1MS8xMjYxNy8zNDkxIDk3NTMvMTI2MTAvMzQ5MSAxMDAyOS8xMjg0OS8zNDkxCitmIDEwMDI5LzEyODQ5LzM0OTEgMTAwMjcvMTI4NDgvMzQ5MSA5NzUxLzEyNjE3LzM0OTEKK2YgOTc1Mi8xMjYxMS8zNDk0IDk3NjAvMTI2MTYvMzQ5NCAxMDAzNi8xMjg1Ni8zNDk0CitmIDEwMDM2LzEyODU2LzM0OTQgMTAwMjgvMTI4NTAvMzQ5NCA5NzUyLzEyNjExLzM0OTQKK2YgOTc1OC8xMjYxMy8zODQxIDk3NTAvMTI2MTkvMzg0MSAxMDAyNi8xMjg0Ny8zODQxCitmIDEwMDI2LzEyODQ3LzM4NDIgMTAwMzQvMTI4NTIvMzg0MiA5NzU4LzEyNjEzLzM4NDIKK2YgOTc2MS8xMjYxOC8zNDk3IDk3NTkvMTI2MTIvMzQ5NyAxMDAzNS8xMjg1NS8zNDk3CitmIDEwMDM1LzEyODU1LzM4NDMgMTAwMzcvMTI4NTcvMzg0MyA5NzYxLzEyNjE4LzM4NDMKK2YgOTc1NC8xMjYwOS8zNDc4IDk3MzMvMTI1ODYvMzQ3OCAxMDAxMy8xMjU4Ni8zNDc4CitmIDEwMDEzLzEyNTg2LzMzNjIgMTAwMzAvMTI2MDkvMzM2MiA5NzU0LzEyNjA5LzMzNjIKK2YgOTczNC8xMjU5My8zNDE0IDk3NTcvMTI2MTQvMzQxNCAxMDAzMy8xMjg1My8zNDE0CitmIDEwMDMzLzEyODUzLzM0NDEgMTAwMTQvMTI4MzkvMzQ0MSA5NzM0LzEyNTkzLzM0NDEKK2YgOTc2Ni8xMjYyNi8zMzMzIDk3NDgvMTI2MDMvMzMzMyAxMDAyNC8xMjYwMy8zMzMzCitmIDEwMDI0LzEyNjAzLzMzMzMgMTAwMzgvMTI2MjYvMzMzMyA5NzY2LzEyNjI2LzMzMzMKK2YgOTc0OS8xMjYwNy8zNDU5IDk3NjcvMTI2MjgvMzQ1OSAxMDAzOS8xMjg1OC8zNDU5CitmIDEwMDM5LzEyODU4LzM0NTkgMTAwMjUvMTI4NDYvMzQ1OSA5NzQ5LzEyNjA3LzM0NTkKK2YgOTc2OS8xMjYyNy8zODQ0IDk3NjYvMTI2MjYvMzg0NCAxMDAzOC8xMjYyNi8zODQ0CitmIDEwMDM4LzEyNjI2LzM1MDAgMTAwNDEvMTI2MjcvMzUwMCA5NzY5LzEyNjI3LzM1MDAKK2YgOTc3MC8xMjYyNS8zODQ1IDk3NjgvMTI2MjQvMzg0NSAxMDA0MC8xMjYyNC8zODQ1CitmIDEwMDQwLzEyNjI0LzM4NDYgMTAwNDIvMTI4NTkvMzg0NiA5NzcwLzEyNjI1LzM4NDYKK2YgOTc2Ny8xMjYyOC8zNTAzIDk3NjkvMTI2MjcvMzUwMyAxMDA0MS8xMjYyNy8zNTAzCitmIDEwMDQxLzEyNjI3LzM1MDQgMTAwMzkvMTI4NTgvMzUwNCA5NzY3LzEyNjI4LzM1MDQKK2YgOTc2OC8xMjYyNC8zODQ3IDk3NzEvMTI2MjkvMzg0NyAxMDA0My8xMjg2MC8zODQ3CitmIDEwMDQzLzEyODYwLzM4NDggMTAwNDAvMTI2MjQvMzg0OCA5NzY4LzEyNjI0LzM4NDgKK2YgOTc3Mi8xMjY0MS8zNDU4IDk3NjEvMTI2MTgvMzQ1OCAxMDAzNy8xMjg1Ny8zNDU4CitmIDEwMDM3LzEyODU3LzM0NTggMTAwNDQvMTI4NjEvMzQ1OCA5NzcyLzEyNjQxLzM0NTgKK2YgOTc2MC8xMjYxNi8zMzM1IDk3NzMvMTI2MzkvMzMzNSAxMDA0NS8xMjg2Mi8zMzM1CitmIDEwMDQ1LzEyODYyLzMzNDUgMTAwMzYvMTI4NTYvMzM0NSA5NzYwLzEyNjE2LzMzNDUKK2YgOTc3NS8xMjYzMi8zODQ5IDk3NzYvMTI2MzEvMzg0OSAxMDA0OC8xMjg2My8zODQ5CitmIDEwMDQ4LzEyODYzLzM4NTAgMTAwNDcvMTI4NjQvMzg1MCA5Nzc1LzEyNjMyLzM4NTAKK2YgOTc3Ny8xMjYzMC8zNTI2IDk3NzQvMTI2MzMvMzUyNiAxMDA0Ni8xMjg2NS8zNTI2CitmIDEwMDQ2LzEyODY1LzM1MDkgMTAwNDkvMTI2MzAvMzUwOSA5Nzc3LzEyNjMwLzM1MDkKK2YgOTc3OS8xMjYzNi8zNTEwIDk3ODAvMTI2MzUvMzUxMCAxMDA1Mi8xMjg2Ni8zNTEwCitmIDEwMDUyLzEyODY2LzM4NTEgMTAwNTEvMTI4NjcvMzg1MSA5Nzc5LzEyNjM2LzM4NTEKK2YgOTc4MS8xMjYzNC8zNTEyIDk3NzgvMTI2MzcvMzUxMiAxMDA1MC8xMjg2OC8zNTEyCitmIDEwMDUwLzEyODY4LzM1MTMgMTAwNTMvMTI4NjkvMzUxMyA5NzgxLzEyNjM0LzM1MTMKK2YgOTc3My8xMjYzOS8zODUyIDk3NzUvMTI2MzIvMzg1MiAxMDA0Ny8xMjg2NC8zODUyCitmIDEwMDQ3LzEyODY0LzM4NTMgMTAwNDUvMTI4NjIvMzg1MyA5NzczLzEyNjM5LzM4NTMKK2YgOTc3NC8xMjYzMy8zNTU2IDk3ODIvMTI2MzgvMzU1NiAxMDA1NC8xMjg3MC8zNTU2CitmIDEwMDU0LzEyODcwLzM1MTMgMTAwNDYvMTI4NjUvMzUxMyA5Nzc0LzEyNjMzLzM1MTMKK2YgOTc4MC8xMjYzNS8zODU0IDk3NzIvMTI2NDEvMzg1NCAxMDA0NC8xMjg2MS8zODU0CitmIDEwMDQ0LzEyODYxLzM4NTUgMTAwNTIvMTI4NjYvMzg1NSA5NzgwLzEyNjM1LzM4NTUKK2YgOTc4My8xMjY0MC8zNTE4IDk3ODEvMTI2MzQvMzUxOCAxMDA1My8xMjg2OS8zNTE4CitmIDEwMDUzLzEyODY5LzM4NTYgMTAwNTUvMTI4NzEvMzg1NiA5NzgzLzEyNjQwLzM4NTYKK2YgOTc3Ni8xMjYzMS8zNDc4IDk3NTUvMTI2MDgvMzQ3OCAxMDAzMS8xMjg1MS8zNDc4CitmIDEwMDMxLzEyODUxLzMzNjIgMTAwNDgvMTI4NjMvMzM2MiA5Nzc2LzEyNjMxLzMzNjIKK2YgOTc1Ni8xMjYxNS8zMzkwIDk3NzkvMTI2MzYvMzM5MCAxMDA1MS8xMjg2Ny8zMzkwCitmIDEwMDUxLzEyODY3LzM0NDEgMTAwMzIvMTI4NTQvMzQ0MSA5NzU2LzEyNjE1LzM0NDEKK2YgOTc4OC8xMjY0OC8zMzY1IDk3NzAvMTI2MjUvMzM2NSAxMDA0Mi8xMjg1OS8zMzY1CitmIDEwMDQyLzEyODU5LzMzNjUgMTAwNTYvMTI4NzIvMzM2NSA5Nzg4LzEyNjQ4LzMzNjUKK2YgOTc3MS8xMjYyOS8zNDU5IDk3ODkvMTI2NTAvMzQ1OSAxMDA1Ny8xMjg3My8zNDU5CitmIDEwMDU3LzEyODczLzM0NTkgMTAwNDMvMTI4NjAvMzQ1OSA5NzcxLzEyNjI5LzM0NTkKK2YgOTc5MS8xMjY0OS8zODU3IDk3ODgvMTI2NDgvMzg1NyAxMDA1Ni8xMjg3Mi8zODU3CitmIDEwMDU2LzEyODcyLzM4NTggMTAwNTkvMTI4NzQvMzg1OCA5NzkxLzEyNjQ5LzM4NTgKK2YgOTc5Mi8xMjY0Ny8zNTMxIDk3OTAvMTI2NDYvMzUzMSAxMDA1OC8xMjg3NS8zNTMxCitmIDEwMDU4LzEyODc1LzM1MDkgMTAwNjAvMTI2NDcvMzUwOSA5NzkyLzEyNjQ3LzM1MDkKK2YgOTc4OS8xMjY1MC8zODU5IDk3OTEvMTI2NDkvMzg1OSAxMDA1OS8xMjg3NC8zODU5CitmIDEwMDU5LzEyODc0LzM1MjggMTAwNTcvMTI4NzMvMzUyOCA5Nzg5LzEyNjUwLzM1MjgKK2YgOTc5MC8xMjY0Ni8zNTEyIDk3OTMvMTI2NTEvMzUxMiAxMDA2MS8xMjg3Ni8zNTEyCitmIDEwMDYxLzEyODc2LzM1MzAgMTAwNTgvMTI4NzUvMzUzMCA5NzkwLzEyNjQ2LzM1MzAKK2YgOTc5NC8xMjY2OS8zMzQzIDk3ODMvMTI2NDAvMzM0MyAxMDA1NS8xMjg3MS8zMzQzCitmIDEwMDU1LzEyODcxLzM3NDcgMTAwNjIvMTI4NzcvMzc0NyA5Nzk0LzEyNjY5LzM3NDcKK2YgOTc5Ni8xMjY2Ni8zMzQ1IDk3OTcvMTI3MjEvMzM0NSAxMDA2NS8xMjg3OC8zMzQ1CitmIDEwMDY1LzEyODc4LzMzNDUgMTAwNjQvMTI4NzkvMzM0NSA5Nzk2LzEyNjY2LzMzNDUKK2YgOTc5OC8xMjY1NC8zNTMxIDk3OTkvMTI2NTMvMzUzMSAxMDA2Ny8xMjg4MC8zNTMxCitmIDEwMDY3LzEyODgwLzM1MjYgMTAwNjYvMTI2NTQvMzUyNiA5Nzk4LzEyNjU0LzM1MjYKK2YgOTgwMC8xMjY1Mi8zNzUwIDk3OTUvMTI2NTUvMzc1MCAxMDA2My8xMjg4MS8zNzUwCitmIDEwMDYzLzEyODgxLzM4NjAgMTAwNjgvMTI2NTIvMzg2MCA5ODAwLzEyNjUyLzM4NjAKK2YgOTc5OS8xMjY1My8zNTM1IDk4MDEvMTI2NTcvMzUzNSAxMDA2OS8xMjg4Mi8zNTM1CitmIDEwMDY5LzEyODgyLzM1MzAgMTAwNjcvMTI4ODAvMzUzMCA5Nzk5LzEyNjUzLzM1MzAKK2YgOTgwMi8xMjY1Ni8zNTM2IDk4MDAvMTI2NTIvMzUzNiAxMDA2OC8xMjY1Mi8zNTM2CitmIDEwMDY4LzEyNjUyLzM1NTAgMTAwNzAvMTI4ODMvMzU1MCA5ODAyLzEyNjU2LzM1NTAKK2YgOTgwMy8xMjcxMy8zMzk1IDk4MDQvMTI2NjgvMzM5NSAxMDA3Mi8xMjg4NC8zMzk1CitmIDEwMDcyLzEyODg0LzM0NTggMTAwNzEvMTI4ODUvMzQ1OCA5ODAzLzEyNzEzLzM0NTgKK2YgOTc4Mi8xMjYzOC8zMzQ1IDk4MDUvMTI2NjcvMzM0NSAxMDA3My8xMjg4Ni8zMzQ1CitmIDEwMDczLzEyODg2LzMzNDUgMTAwNTQvMTI4NzAvMzM0NSA5NzgyLzEyNjM4LzMzNDUKK2YgOTgwNy8xMjY2MC8zNzUwIDk4MDgvMTI2NTkvMzc1MCAxMDA3Ni8xMjg4Ny8zNzUwCitmIDEwMDc2LzEyODg3LzM1MzggMTAwNzUvMTI2NjAvMzUzOCA5ODA3LzEyNjYwLzM1MzgKK2YgOTgwOS8xMjY1OC8zNTM5IDk4MDYvMTI2NjEvMzUzOSAxMDA3NC8xMjY2MS8zNTM5CitmIDEwMDc0LzEyNjYxLzM1NDUgMTAwNzcvMTI2NTgvMzU0NSA5ODA5LzEyNjU4LzM1NDUKK2YgOTgxMS8xMjY2NC8zNTQxIDk4MTIvMTI2NjMvMzU0MSAxMDA4MC8xMjY2My8zNTQxCitmIDEwMDgwLzEyNjYzLzM4NjEgMTAwNzkvMTI4ODgvMzg2MSA5ODExLzEyNjY0LzM4NjEKK2YgOTgxMy8xMjY2Mi8zODYyIDk4MTAvMTI2NjUvMzg2MiAxMDA3OC8xMjg4OS8zODYyCitmIDEwMDc4LzEyODg5LzM1MzUgMTAwODEvMTI2NjIvMzUzNSA5ODEzLzEyNjYyLzM1MzUKK2YgOTgwNS8xMjY2Ny8zNTQxIDk4MDcvMTI2NjAvMzU0MSAxMDA3NS8xMjY2MC8zNTQxCitmIDEwMDc1LzEyNjYwLzM1NDEgMTAwNzMvMTI4ODYvMzU0MSA5ODA1LzEyNjY3LzM1NDEKK2YgOTgwNi8xMjY2MS8zNTM1IDk3OTYvMTI2NjYvMzUzNSAxMDA2NC8xMjg3OS8zNTM1CitmIDEwMDY0LzEyODc5LzM1MzUgMTAwNzQvMTI2NjEvMzUzNSA5ODA2LzEyNjYxLzM1MzUKK2YgOTgxMi8xMjY2My8zNTQ4IDk3OTQvMTI2NjkvMzU0OCAxMDA2Mi8xMjg3Ny8zNTQ4CitmIDEwMDYyLzEyODc3LzM3NTMgMTAwODAvMTI2NjMvMzc1MyA5ODEyLzEyNjYzLzM3NTMKK2YgOTgwNC8xMjY2OC8zNTQwIDk4MTMvMTI2NjIvMzU0MCAxMDA4MS8xMjY2Mi8zNTQwCitmIDEwMDgxLzEyNjYyLzM1MTggMTAwNzIvMTI4ODQvMzUxOCA5ODA0LzEyNjY4LzM1MTgKK2YgOTgwOC8xMjY1OS8zNDM0IDk3NzcvMTI2MzAvMzQzNCAxMDA0OS8xMjYzMC8zNDM0CitmIDEwMDQ5LzEyNjMwLzMzODggMTAwNzYvMTI4ODcvMzM4OCA5ODA4LzEyNjU5LzMzODgKK2YgOTgxNy8xMjY3MS8zNDM0IDk4MDkvMTI2NTgvMzQzNCAxMDA3Ny8xMjY1OC8zNDM0CitmIDEwMDc3LzEyNjU4LzMzODggMTAwODIvMTI2NzEvMzM4OCA5ODE3LzEyNjcxLzMzODgKK2YgOTgxMC8xMjY2NS8zMzY0IDk4MTgvMTI2NzYvMzM2NCAxMDA4My8xMjg5MC8zMzY0CitmIDEwMDgzLzEyODkwLzMzNjMgMTAwNzgvMTI4ODkvMzM2MyA5ODEwLzEyNjY1LzMzNjMKK2YgOTc3OC8xMjYzNy8zNDE1IDk4MTEvMTI2NjQvMzQxNSAxMDA3OS8xMjg4OC8zNDE1CitmIDEwMDc5LzEyODg4LzM2MTAgMTAwNTAvMTI4NjgvMzYxMCA5Nzc4LzEyNjM3LzM2MTAKK2YgOTc5NS8xMjY1NS8zMzY1IDk3OTIvMTI2NDcvMzM2NSAxMDA2MC8xMjY0Ny8zMzY1CitmIDEwMDYwLzEyNjQ3LzMyMzggMTAwNjMvMTI4ODEvMzIzOCA5Nzk1LzEyNjU1LzMyMzgKK2YgOTc5My8xMjY1MS8zNDI1IDk4MDIvMTI2NTYvMzQyNSAxMDA3MC8xMjg4My8zNDI1CitmIDEwMDcwLzEyODgzLzM0NTkgMTAwNjEvMTI4NzYvMzQ1OSA5NzkzLzEyNjUxLzM0NTkKK2YgOTgxOC8xMjY3Ni8zNTM2IDk4MjUvMTI3MTQvMzUzNiAxMDA4NC8xMjg5MS8zNTM2CitmIDEwMDg0LzEyODkxLzM0ODcgMTAwODMvMTI4OTAvMzQ4NyA5ODE4LzEyNjc2LzM0ODcKK2YgOTgyOS8xMjY5My8zNTM4IDk4MTcvMTI2NzEvMzUzOCAxMDA4Mi8xMjY3MS8zNTM4CitmIDEwMDgyLzEyNjcxLzM1NjQgMTAwODUvMTI4OTIvMzU2NCA5ODI5LzEyNjkzLzM1NjQKK2YgOTgyNS8xMjcxNC8zNzQ1IDk4MDMvMTI3MTMvMzc0NSAxMDA3MS8xMjg4NS8zNzQ1CitmIDEwMDcxLzEyODg1LzM1NDcgMTAwODQvMTI4OTEvMzU0NyA5ODI1LzEyNzE0LzM1NDcKK2YgOTc5Ny8xMjcyMS8zNTQ5IDk4MjkvMTI2OTMvMzU0OSAxMDA4NS8xMjg5Mi8zNTQ5CitmIDEwMDg1LzEyODkyLzM1MzYgMTAwNjUvMTI4NzgvMzUzNiA5Nzk3LzEyNzIxLzM1MzYKK2YgOTgzMC8xMjcwOS8zMzY1IDk3OTgvMTI2NTQvMzM2NSAxMDA2Ni8xMjY1NC8zMzY1CitmIDEwMDY2LzEyNjU0LzMyMzggMTAwODYvMTI3MDkvMzIzOCA5ODMwLzEyNzA5LzMyMzgKK2YgOTgzMS8xMjcxMC8zNTMzIDk4MzAvMTI3MDkvMzUzMyAxMDA4Ni8xMjcwOS8zNTMzCitmIDEwMDg2LzEyNzA5LzM1NjcgMTAwODcvMTI4OTMvMzU2NyA5ODMxLzEyNzEwLzM1NjcKK2YgOTgzMi8xMjcxNi8zNTQ5IDk4MzEvMTI3MTAvMzU0OSAxMDA4Ny8xMjg5My8zNTQ5CitmIDEwMDg3LzEyODkzLzM1MzcgMTAwODgvMTI4OTQvMzUzNyA5ODMyLzEyNzE2LzM1MzcKK2YgOTgwMS8xMjY1Ny8zNDU5IDk4MzIvMTI3MTYvMzQ1OSAxMDA4OC8xMjg5NC8zNDU5CitmIDEwMDg4LzEyODk0LzM0MjUgMTAwNjkvMTI4ODIvMzQyNSA5ODAxLzEyNjU3LzM0MjUKK2YgOTU2Ny8xMjcyNi8zNTUxIDk4MzMvMTI4OTUvMzU1MSAxMDA4OS8xMjg5Ni8zNTUxCitmIDEwMDg5LzEyODk2LzM4NjMgOTg3NS8xMjcyNi8zODYzIDk1NjcvMTI3MjYvMzg2MworZiA5ODMzLzEyODk1LzM4NjQgOTU2OC8xMjcyNS8zODY0IDk4NzYvMTI3MzkvMzg2NAorZiA5ODc2LzEyNzM5LzM1NTQgMTAwODkvMTI4OTYvMzU1NCA5ODMzLzEyODk1LzM1NTQKK2YgOTU2MC8xMjQyMS8zNDU4IDk4MzQvMTI2OTkvMzQ1OCAxMDA5MC8xMjg5Ny8zNDU4CitmIDEwMDkwLzEyODk3LzMzOTUgOTg3Mi8xMjczNi8zMzk1IDk1NjAvMTI0MjEvMzM5NQorZiA5ODM1LzEyNzAyLzM0NzYgOTgzNi8xMjY5NS8zNDc2IDEwMDkyLzEyODk4LzM0NzYKK2YgMTAwOTIvMTI4OTgvMzQ3NiAxMDA5MS8xMjcwMi8zNDc2IDk4MzUvMTI3MDIvMzQ3NgorZiA5ODM3LzEyNjk4LzM1MTUgOTgzOC8xMjcwNy8zNTE1IDEwMDk0LzEyODk5LzM1MTUKK2YgMTAwOTQvMTI4OTkvMzg2NSAxMDA5My8xMjkwMC8zODY1IDk4MzcvMTI2OTgvMzg2NQorZiA5ODM2LzEyNjk1LzM4NjYgOTgzOS8xMjY5NC8zODY2IDEwMDk1LzEyOTAxLzM4NjYKK2YgMTAwOTUvMTI5MDEvMzU1OSAxMDA5Mi8xMjg5OC8zNTU5IDk4MzYvMTI2OTUvMzU1OQorZiA5ODM0LzEyNjk5LzM4NjcgOTgzNy8xMjY5OC8zODY3IDEwMDkzLzEyOTAwLzM4NjcKK2YgMTAwOTMvMTI5MDAvMzU2MSAxMDA5MC8xMjg5Ny8zNTYxIDk4MzQvMTI2OTkvMzU2MQorZiA5ODM5LzEyNjk0LzMzNDUgOTU1OC8xMjQxOS8zMzQ1IDk4NzAvMTI3MzQvMzM0NQorZiA5ODcwLzEyNzM0LzMzMzUgMTAwOTUvMTI5MDEvMzMzNSA5ODM5LzEyNjk0LzMzMzUKK2YgOTU1Mi8xMjQxMS8zMzYxIDk4MzUvMTI3MDIvMzM2MSAxMDA5MS8xMjcwMi8zMzYxCitmIDEwMDkxLzEyNzAyLzM0MzQgOTg2NC8xMjQxMS8zNDM0IDk1NTIvMTI0MTEvMzQzNAorZiA5ODM4LzEyNzA3LzM2MTAgOTU1NS8xMjQxNi8zNjEwIDk4NjcvMTI3MzEvMzYxMAorZiA5ODY3LzEyNzMxLzM0MTUgMTAwOTQvMTI4OTkvMzQxNSA5ODM4LzEyNzA3LzM0MTUKK2YgOTg0My8xMjcyMi8zODY4IDk4NDIvMTI2OTIvMzg2OCAxMDA5Ni8xMjkwMi8zODY4CitmIDEwMDk2LzEyOTAyLzM4NjkgMTAwOTcvMTI5MDMvMzg2OSA5ODQzLzEyNzIyLzM4NjkKK2YgOTg0NC8xMjcyMy8zNDg1IDk4NDMvMTI3MjIvMzQ4NSAxMDA5Ny8xMjkwMy8zNDg1CitmIDEwMDk3LzEyOTAzLzM1NjQgMTAwOTgvMTI5MDQvMzU2NCA5ODQ0LzEyNzIzLzM1NjQKK2YgOTg0NS8xMjcxOC8zNTY1IDk4NDQvMTI3MjMvMzU2NSAxMDA5OC8xMjkwNC8zNTY1CitmIDEwMDk4LzEyOTA0LzM3NzEgMTAwOTkvMTI3MTgvMzc3MSA5ODQ1LzEyNzE4LzM3NzEKK2YgOTg0Ni8xMjcxMS8zMTUwIDk4NDUvMTI3MTgvMzE1MCAxMDA5OS8xMjcxOC8zMTUwCitmIDEwMDk5LzEyNzE4LzMxNTAgMTAxMDAvMTI5MDUvMzE1MCA5ODQ2LzEyNzExLzMxNTAKK2YgOTg0Ny8xMjcwOC8zNTU2IDk4NDYvMTI3MTEvMzU1NiAxMDEwMC8xMjkwNS8zNTU2CitmIDEwMTAwLzEyOTA1LzM1MjkgMTAxMDEvMTI3MDgvMzUyOSA5ODQ3LzEyNzA4LzM1MjkKK2YgOTg0Mi8xMjY5Mi8zNTI1IDk4NDcvMTI3MDgvMzUyNSAxMDEwMS8xMjcwOC8zNTI1CitmIDEwMTAxLzEyNzA4LzM3NzAgMTAwOTYvMTI5MDIvMzc3MCA5ODQyLzEyNjkyLzM3NzAKK2YgOTg0OS8xMjcxNy8zMzMzIDk4NDgvMTI3MTUvMzMzMyAxMDEwMi8xMjkwNi8zMzMzCitmIDEwMTAyLzEyOTA2LzMzMzMgMTAxMDMvMTI5MDcvMzMzMyA5ODQ5LzEyNzE3LzMzMzMKK2YgOTg1MC8xMjcyNC8zNTY0IDk4NDkvMTI3MTcvMzU2NCAxMDEwMy8xMjkwNy8zNTY0CitmIDEwMTAzLzEyOTA3LzM1NDcgMTAxMDQvMTI5MDgvMzU0NyA5ODUwLzEyNzI0LzM1NDcKK2YgOTg1MS8xMjY4MS8zNzU2IDk4NTAvMTI3MjQvMzc1NiAxMDEwNC8xMjkwOC8zNzU2CitmIDEwMTA0LzEyOTA4LzM4NjEgMTAxMDUvMTI5MDkvMzg2MSA5ODUxLzEyNjgxLzM4NjEKK2YgOTg1Mi8xMjY3OC8zNDU5IDk4NTEvMTI2ODEvMzQ1OSAxMDEwNS8xMjkwOS8zNDU5CitmIDEwMTA1LzEyOTA5LzMzMzQgMTAxMDYvMTI5MTAvMzMzNCA5ODUyLzEyNjc4LzMzMzQKK2YgOTg1My8xMjcxMi8zNTI5IDk4NTIvMTI2NzgvMzUyOSAxMDEwNi8xMjkxMC8zNTI5CitmIDEwMTA2LzEyOTEwLzM3NTggMTAxMDcvMTI3MTIvMzc1OCA5ODUzLzEyNzEyLzM3NTgKK2YgOTg0OC8xMjcxNS8zNTQ1IDk4NTMvMTI3MTIvMzU0NSAxMDEwNy8xMjcxMi8zNTQ1CitmIDEwMTA3LzEyNzEyLzM1MDkgMTAxMDIvMTI5MDYvMzUwOSA5ODQ4LzEyNzE1LzM1MDkKK2YgOTU2OC8xMjcyNS82OTcgOTgzMy8xMjg5NS82OTcgMTA2NDYvMTI5MTEvNjk3CitmIDEwNjQ2LzEyOTExLzY5NyAxMDQxNy8xMjkxMi82OTcgOTU2OC8xMjcyNS82OTcKK2YgOTgzNS8xMjcwMi82OTcgMTAzOTYvMTI3MDUvNjk3IDEwMzkzLzEyNjk2LzY5NworZiAxMDM5My8xMjY5Ni82OTcgOTgzNi8xMjY5NS82OTcgOTgzNS8xMjcwMi82OTcKK2YgOTg0MS8xMjcwNi82OTcgOTgzOC8xMjcwNy82OTcgMTAzOTkvMTI5MTMvNjk3CitmIDEwMzk5LzEyOTEzLzY5NyAxMDM5OC8xMjkxNC82OTcgOTg0MS8xMjcwNi82OTcKK2YgOTU2Ny8xMjcyNi82OTcgOTgzOS8xMjY5NC82OTcgMTAzOTIvMTI2OTcvNjk3CitmIDEwMzkyLzEyNjk3LzY5NyAxMDQxOC8xMjkxNS82OTcgOTU2Ny8xMjcyNi82OTcKK2YgMTAxMDkvMTI5MTYvNjk3IDEwMTA4LzEyOTE3LzY5NyAxMDExMS8xMjkxOC82OTcKK2YgMTAxMTEvMTI5MTgvNjk3IDEwMTEwLzEyOTE5LzY5NyAxMDEwOS8xMjkxNi82OTcKK2YgMTAxMTMvMTI5MjAvNjk3IDEwMTEyLzEyOTIxLzY5NyAxMDExNS8xMjkyMi82OTcKK2YgMTAxMTUvMTI5MjIvNjk3IDEwMTE0LzEyOTIzLzY5NyAxMDExMy8xMjkyMC82OTcKK2YgMTAxMTcvMTI5MjQvNjk3IDEwMTE2LzEyOTI1LzY5NyAxMDExMS8xMjkxOC82OTcKK2YgMTAxMTEvMTI5MTgvNjk3IDEwMTA4LzEyOTE3LzY5NyAxMDExNy8xMjkyNC82OTcKK2YgMTAxMTMvMTI5MjAvNjk3IDEwMTE0LzEyOTIzLzY5NyAxMDExOS8xMjkyNi82OTcKK2YgMTAxMTkvMTI5MjYvNjk3IDEwMTE4LzEyOTI3LzY5NyAxMDExMy8xMjkyMC82OTcKK2YgMTAxMTAvMTI5MTkvNjk3IDEwMTIxLzEyOTI4LzY5NyAxMDEyMC8xMjkyOS82OTcKK2YgMTAxMjAvMTI5MjkvNjk3IDEwMTA5LzEyOTE2LzY5NyAxMDExMC8xMjkxOS82OTcKK2YgMTAxMTIvMTI5MjEvNjk3IDEwMTIzLzEyOTMwLzY5NyAxMDEyMi8xMjkzMS82OTcKK2YgMTAxMjIvMTI5MzEvNjk3IDEwMTE1LzEyOTIyLzY5NyAxMDExMi8xMjkyMS82OTcKK2YgMTAxMjQvMTI5MzIvNjk3IDEwMTI3LzEyOTMzLzY5NyAxMDEyNi8xMjkzNC82OTcKK2YgMTAxMjYvMTI5MzQvNjk3IDEwMTI1LzEyOTM1LzY5NyAxMDEyNC8xMjkzMi82OTcKK2YgMTAxMjQvMTI5MzIvNjk3IDEwMTI4LzEyOTM2LzY5NyAxMDEyOS8xMjkzNy82OTcKK2YgMTAxMjkvMTI5MzcvNjk3IDEwMTI3LzEyOTMzLzY5NyAxMDEyNC8xMjkzMi82OTcKK2YgMTAxMzEvMTI5MzgvNjk3IDEwMTMwLzEyOTM5LzY5NyAxMDEzMy8xMjk0MC82OTcKK2YgMTAxMzMvMTI5NDAvNjk3IDEwMTMyLzEyOTQxLzY5NyAxMDEzMS8xMjkzOC82OTcKK2YgMTAxMzUvMTI5NDIvNjk3IDEwMTM0LzEyOTQzLzY5NyAxMDEzNy8xMjk0NC82OTcKK2YgMTAxMzcvMTI5NDQvNjk3IDEwMTM2LzEyOTQ1LzY5NyAxMDEzNS8xMjk0Mi82OTcKK2YgMTAxMzkvMTI5NDYvNjk3IDEwMTM4LzEyOTQ3LzY5NyAxMDEzMy8xMjk0MC82OTcKK2YgMTAxMzMvMTI5NDAvNjk3IDEwMTMwLzEyOTM5LzY5NyAxMDEzOS8xMjk0Ni82OTcKK2YgMTAxMzUvMTI5NDIvNjk3IDEwMTM2LzEyOTQ1LzY5NyAxMDE0MS8xMjk0OC82OTcKK2YgMTAxNDEvMTI5NDgvNjk3IDEwMTQwLzEyOTQ5LzY5NyAxMDEzNS8xMjk0Mi82OTcKK2YgMTAxMzIvMTI5NDEvNjk3IDEwMTA5LzEyOTE2LzY5NyAxMDEyMC8xMjkyOS82OTcKK2YgMTAxMjAvMTI5MjkvNjk3IDEwMTQyLzEyOTUwLzY5NyAxMDEzMi8xMjk0MS82OTcKK2YgMTAxMzIvMTI5NDEvNjk3IDEwMTQyLzEyOTUwLzY5NyAxMDE0My8xMjk1MS82OTcKK2YgMTAxNDMvMTI5NTEvNjk3IDEwMTMxLzEyOTM4LzY5NyAxMDEzMi8xMjk0MS82OTcKK2YgMTAxMTIvMTI5MjEvNjk3IDEwMTM3LzEyOTQ0LzY5NyAxMDE0NC8xMjk1Mi82OTcKK2YgMTAxNDQvMTI5NTIvNjk3IDEwMTIzLzEyOTMwLzY5NyAxMDExMi8xMjkyMS82OTcKK2YgMTAxMzQvMTI5NDMvNjk3IDEwMTQ1LzEyOTUzLzY5NyAxMDE0NC8xMjk1Mi82OTcKK2YgMTAxNDQvMTI5NTIvNjk3IDEwMTM3LzEyOTQ0LzY5NyAxMDEzNC8xMjk0My82OTcKK2YgMTAxNDYvMTI5NTQvNjk3IDEwMTQ5LzEyOTU1LzY5NyAxMDE0OC8xMjk1Ni82OTcKK2YgMTAxNDgvMTI5NTYvNjk3IDEwMTQ3LzEyOTU3LzY5NyAxMDE0Ni8xMjk1NC82OTcKK2YgMTAxNDYvMTI5NTQvNjk3IDEwMTUwLzEyOTU4LzY5NyAxMDE1MS8xMjk1OS82OTcKK2YgMTAxNTEvMTI5NTkvNjk3IDEwMTQ5LzEyOTU1LzY5NyAxMDE0Ni8xMjk1NC82OTcKK2YgMTAxNTMvMTI5NjAvNjk3IDEwMTUyLzEyOTYxLzY5NyAxMDE1NS8xMjk2Mi82OTcKK2YgMTAxNTUvMTI5NjIvNjk3IDEwMTU0LzEyOTYzLzY5NyAxMDE1My8xMjk2MC82OTcKK2YgMTAxNTcvMTI5NjQvNjk3IDEwMTU2LzEyOTY1LzY5NyAxMDE1OS8xMjk2Ni82OTcKK2YgMTAxNTkvMTI5NjYvNjk3IDEwMTU4LzEyOTY3LzY5NyAxMDE1Ny8xMjk2NC82OTcKK2YgMTAxNjEvMTI5NjgvNjk3IDEwMTYwLzEyOTY5LzY5NyAxMDE1NS8xMjk2Mi82OTcKK2YgMTAxNTUvMTI5NjIvNjk3IDEwMTUyLzEyOTYxLzY5NyAxMDE2MS8xMjk2OC82OTcKK2YgMTAxNTcvMTI5NjQvNjk3IDEwMTU4LzEyOTY3LzY5NyAxMDE2My8xMjk3MC82OTcKK2YgMTAxNjMvMTI5NzAvNjk3IDEwMTYyLzEyOTcxLzY5NyAxMDE1Ny8xMjk2NC82OTcKK2YgMTAxNTQvMTI5NjMvNjk3IDEwMTMxLzEyOTM4LzY5NyAxMDE0My8xMjk1MS82OTcKK2YgMTAxNDMvMTI5NTEvNjk3IDEwMTY0LzEyOTcyLzY5NyAxMDE1NC8xMjk2My82OTcKK2YgMTAxNTQvMTI5NjMvNjk3IDEwMTY0LzEyOTcyLzY5NyAxMDE2NS8xMjk3My82OTcKK2YgMTAxNjUvMTI5NzMvNjk3IDEwMTUzLzEyOTYwLzY5NyAxMDE1NC8xMjk2My82OTcKK2YgMTAxMzQvMTI5NDMvNjk3IDEwMTU5LzEyOTY2LzY5NyAxMDE2Ni8xMjk3NC82OTcKK2YgMTAxNjYvMTI5NzQvNjk3IDEwMTQ1LzEyOTUzLzY5NyAxMDEzNC8xMjk0My82OTcKK2YgMTAxNTYvMTI5NjUvNjk3IDEwMTY3LzEyOTc1LzY5NyAxMDE2Ni8xMjk3NC82OTcKK2YgMTAxNjYvMTI5NzQvNjk3IDEwMTU5LzEyOTY2LzY5NyAxMDE1Ni8xMjk2NS82OTcKK2YgMTAxNjgvMTI5NzYvNjk3IDEwMTcxLzEyOTc3LzY5NyAxMDE3MC8xMjk3OC82OTcKK2YgMTAxNzAvMTI5NzgvNjk3IDEwMTY5LzEyOTc5LzY5NyAxMDE2OC8xMjk3Ni82OTcKK2YgMTAxNjgvMTI5NzYvNjk3IDEwMTcyLzEyOTgwLzY5NyAxMDE3My8xMjk4MS82OTcKK2YgMTAxNzMvMTI5ODEvNjk3IDEwMTcxLzEyOTc3LzY5NyAxMDE2OC8xMjk3Ni82OTcKK2YgMTAxNzUvMTI5ODIvNjk3IDEwMTc0LzEyOTgzLzY5NyAxMDE3Ny8xMjk4NC82OTcKK2YgMTAxNzcvMTI5ODQvNjk3IDEwMTc2LzEyOTg1LzY5NyAxMDE3NS8xMjk4Mi82OTcKK2YgMTAxNzUvMTI5ODIvNjk3IDEwMTc2LzEyOTg1LzY5NyAxMDE3OS8xMjk4Ni82OTcKK2YgMTAxNzkvMTI5ODYvNjk3IDEwMTc4LzEyOTg3LzY5NyAxMDE3NS8xMjk4Mi82OTcKK2YgMTAxODEvMTI5ODgvNjk3IDEwMTgwLzEyOTg5LzY5NyAxMDE4My8xMjk5MC82OTcKK2YgMTAxODMvMTI5OTAvNjk3IDEwMTgyLzEyOTkxLzY5NyAxMDE4MS8xMjk4OC82OTcKK2YgMTAxODUvMTI5OTIvNjk3IDEwMTg0LzEyOTkzLzY5NyAxMDE4Ny8xMjk5NC82OTcKK2YgMTAxODcvMTI5OTQvNjk3IDEwMTg2LzEyOTk1LzY5NyAxMDE4NS8xMjk5Mi82OTcKK2YgMTAxODkvMTI5OTYvNjk3IDEwMTg4LzEyOTk3LzY5NyAxMDE4My8xMjk5MC82OTcKK2YgMTAxODMvMTI5OTAvNjk3IDEwMTgwLzEyOTg5LzY5NyAxMDE4OS8xMjk5Ni82OTcKK2YgMTAxODUvMTI5OTIvNjk3IDEwMTg2LzEyOTk1LzY5NyAxMDE5MS8xMjk5OC82OTcKK2YgMTAxOTEvMTI5OTgvNjk3IDEwMTkwLzEyOTk5LzY5NyAxMDE4NS8xMjk5Mi82OTcKK2YgMTAxODIvMTI5OTEvNjk3IDEwMTUzLzEyOTYwLzY5NyAxMDE2NS8xMjk3My82OTcKK2YgMTAxNjUvMTI5NzMvNjk3IDEwMTkyLzEzMDAwLzY5NyAxMDE4Mi8xMjk5MS82OTcKK2YgMTAxOTMvMTMwMDEvNjk3IDEwMTgxLzEyOTg4LzY5NyAxMDE5NS8xMzAwMi82OTcKK2YgMTAxOTUvMTMwMDIvNjk3IDEwMTk0LzEzMDAzLzY5NyAxMDE5My8xMzAwMS82OTcKK2YgMTAxODIvMTI5OTEvNjk3IDEwMTkyLzEzMDAwLzY5NyAxMDE5NS8xMzAwMi82OTcKK2YgMTAxOTUvMTMwMDIvNjk3IDEwMTgxLzEyOTg4LzY5NyAxMDE4Mi8xMjk5MS82OTcKK2YgMTAxODQvMTI5OTMvNjk3IDEwMTk4LzEzMDA0LzY5NyAxMDE5Ny8xMzAwNS82OTcKK2YgMTAxOTcvMTMwMDUvNjk3IDEwMTk2LzEzMDA2LzY5NyAxMDE4NC8xMjk5My82OTcKK2YgMTAxNTYvMTI5NjUvNjk3IDEwMTg3LzEyOTk0LzY5NyAxMDE5OS8xMzAwNy82OTcKK2YgMTAxOTkvMTMwMDcvNjk3IDEwMTY3LzEyOTc1LzY5NyAxMDE1Ni8xMjk2NS82OTcKK2YgMTAxODQvMTI5OTMvNjk3IDEwMTk2LzEzMDA2LzY5NyAxMDE5OS8xMzAwNy82OTcKK2YgMTAxOTkvMTMwMDcvNjk3IDEwMTg3LzEyOTk0LzY5NyAxMDE4NC8xMjk5My82OTcKK2YgMTAyMDEvMTMwMDgvNjk3IDEwMjAwLzEzMDA5LzY5NyAxMDIwMi8xMzAxMC82OTcKK2YgMTAyMDIvMTMwMTAvNjk3IDEwMTkzLzEzMDAxLzY5NyAxMDIwMS8xMzAwOC82OTcKK2YgMTAyMDQvMTMwMTEvNjk3IDEwMjAzLzEzMDEyLzY5NyAxMDE5OC8xMzAwNC82OTcKK2YgMTAxOTgvMTMwMDQvNjk3IDEwMjA1LzEzMDEzLzY5NyAxMDIwNC8xMzAxMS82OTcKK2YgMTAyMDcvMTMwMTQvNjk3IDEwMjA2LzEzMDE1LzY5NyAxMDIwMi8xMzAxMC82OTcKK2YgMTAyMDIvMTMwMTAvNjk3IDEwMjAwLzEzMDA5LzY5NyAxMDIwNy8xMzAxNC82OTcKK2YgMTAyMDQvMTMwMTEvNjk3IDEwMjA1LzEzMDEzLzY5NyAxMDIwOS8xMzAxNi82OTcKK2YgMTAyMDkvMTMwMTYvNjk3IDEwMjA4LzEzMDE3LzY5NyAxMDIwNC8xMzAxMS82OTcKK2YgMTAxOTMvMTMwMDEvNjk3IDEwMTk0LzEzMDAzLzY5NyAxMDIxMC8xMzAxOC82OTcKK2YgMTAyMTAvMTMwMTgvNjk3IDEwMjAxLzEzMDA4LzY5NyAxMDE5My8xMzAwMS82OTcKK2YgMTAyMDMvMTMwMTIvNjk3IDEwMjExLzEzMDE5LzY5NyAxMDE5Ny8xMzAwNS82OTcKK2YgMTAxOTcvMTMwMDUvNjk3IDEwMTk4LzEzMDA0LzY5NyAxMDIwMy8xMzAxMi82OTcKK2YgMTAyMTIvMTMwMjAvNjk3IDEwMjE1LzEzMDIxLzY5NyAxMDIxNC8xMzAyMi82OTcKK2YgMTAyMTQvMTMwMjIvNjk3IDEwMjEzLzEzMDIzLzY5NyAxMDIxMi8xMzAyMC82OTcKK2YgMTAyMTIvMTMwMjAvNjk3IDEwMjE2LzEzMDI0LzY5NyAxMDIxNy8xMzAyNS82OTcKK2YgMTAyMTcvMTMwMjUvNjk3IDEwMjE1LzEzMDIxLzY5NyAxMDIxMi8xMzAyMC82OTcKK2YgMTAyMTkvMTMwMjYvNjk3IDEwMjE4LzEzMDI3LzY5NyAxMDIyMS8xMzAyOC82OTcKK2YgMTAyMjEvMTMwMjgvNjk3IDEwMjIwLzEzMDI5LzY5NyAxMDIxOS8xMzAyNi82OTcKK2YgMTAyMjMvMTMwMzAvNjk3IDEwMjIyLzEzMDMxLzY5NyAxMDIyNS8xMzAzMi82OTcKK2YgMTAyMjUvMTMwMzIvNjk3IDEwMjI0LzEzMDMzLzY5NyAxMDIyMy8xMzAzMC82OTcKK2YgMTAyMjcvMTMwMzQvNjk3IDEwMjI2LzEzMDM1LzY5NyAxMDIyMS8xMzAyOC82OTcKK2YgMTAyMjEvMTMwMjgvNjk3IDEwMjE4LzEzMDI3LzY5NyAxMDIyNy8xMzAzNC82OTcKK2YgMTAyMjMvMTMwMzAvNjk3IDEwMjI0LzEzMDMzLzY5NyAxMDIyOS8xMzAzNi82OTcKK2YgMTAyMjkvMTMwMzYvNjk3IDEwMjI4LzEzMDM3LzY5NyAxMDIyMy8xMzAzMC82OTcKK2YgMTAyMjAvMTMwMjkvNjk3IDEwMjAxLzEzMDA4LzY5NyAxMDIxMC8xMzAxOC82OTcKK2YgMTAyMTAvMTMwMTgvNjk3IDEwMjMwLzEzMDM4LzY5NyAxMDIyMC8xMzAyOS82OTcKK2YgMTAyMjAvMTMwMjkvNjk3IDEwMjMwLzEzMDM4LzY5NyAxMDIzMS8xMzAzOS82OTcKK2YgMTAyMzEvMTMwMzkvNjk3IDEwMjE5LzEzMDI2LzY5NyAxMDIyMC8xMzAyOS82OTcKK2YgMTAyMDMvMTMwMTIvNjk3IDEwMjI1LzEzMDMyLzY5NyAxMDIzMi8xMzA0MC82OTcKK2YgMTAyMzIvMTMwNDAvNjk3IDEwMjExLzEzMDE5LzY5NyAxMDIwMy8xMzAxMi82OTcKK2YgMTAyMjIvMTMwMzEvNjk3IDEwMjMzLzEzMDQxLzY5NyAxMDIzMi8xMzA0MC82OTcKK2YgMTAyMzIvMTMwNDAvNjk3IDEwMjI1LzEzMDMyLzY5NyAxMDIyMi8xMzAzMS82OTcKK2YgMTAyMzQvMTMwNDIvNjk3IDEwMjM3LzEzMDQzLzY5NyAxMDIzNi8xMzA0NC82OTcKK2YgMTAyMzYvMTMwNDQvNjk3IDEwMjM1LzEzMDQ1LzY5NyAxMDIzNC8xMzA0Mi82OTcKK2YgMTAyMzQvMTMwNDIvNjk3IDEwMjM4LzEzMDQ2LzY5NyAxMDIzOS8xMzA0Ny82OTcKK2YgMTAyMzkvMTMwNDcvNjk3IDEwMjM3LzEzMDQzLzY5NyAxMDIzNC8xMzA0Mi82OTcKK2YgMTAyNDEvMTMwNDgvNjk3IDEwMjQwLzEzMDQ5LzY5NyAxMDI0My8xMzA1MC82OTcKK2YgMTAyNDMvMTMwNTAvNjk3IDEwMjQyLzEzMDUxLzY5NyAxMDI0MS8xMzA0OC82OTcKK2YgMTAyNDUvMTMwNTIvNjk3IDEwMjQ0LzEzMDUzLzY5NyAxMDI0Ny8xMzA1NC82OTcKK2YgMTAyNDcvMTMwNTQvNjk3IDEwMjQ2LzEzMDU1LzY5NyAxMDI0NS8xMzA1Mi82OTcKK2YgMTAyNDkvMTMwNTYvNjk3IDEwMjQ4LzEzMDU3LzY5NyAxMDI0My8xMzA1MC82OTcKK2YgMTAyNDMvMTMwNTAvNjk3IDEwMjQwLzEzMDQ5LzY5NyAxMDI0OS8xMzA1Ni82OTcKK2YgMTAyNDUvMTMwNTIvNjk3IDEwMjQ2LzEzMDU1LzY5NyAxMDI1MS8xMzA1OC82OTcKK2YgMTAyNTEvMTMwNTgvNjk3IDEwMjUwLzEzMDU5LzY5NyAxMDI0NS8xMzA1Mi82OTcKK2YgMTAyNDIvMTMwNTEvNjk3IDEwMjE5LzEzMDI2LzY5NyAxMDIzMS8xMzAzOS82OTcKK2YgMTAyMzEvMTMwMzkvNjk3IDEwMjUyLzEzMDYwLzY5NyAxMDI0Mi8xMzA1MS82OTcKK2YgMTAyNDIvMTMwNTEvNjk3IDEwMjUyLzEzMDYwLzY5NyAxMDI1My8xMzA2MS82OTcKK2YgMTAyNTMvMTMwNjEvNjk3IDEwMjQxLzEzMDQ4LzY5NyAxMDI0Mi8xMzA1MS82OTcKK2YgMTAyMjIvMTMwMzEvNjk3IDEwMjQ3LzEzMDU0LzY5NyAxMDI1NC8xMzA2Mi82OTcKK2YgMTAyNTQvMTMwNjIvNjk3IDEwMjMzLzEzMDQxLzY5NyAxMDIyMi8xMzAzMS82OTcKK2YgMTAyNDQvMTMwNTMvNjk3IDEwMjU1LzEzMDYzLzY5NyAxMDI1NC8xMzA2Mi82OTcKK2YgMTAyNTQvMTMwNjIvNjk3IDEwMjQ3LzEzMDU0LzY5NyAxMDI0NC8xMzA1My82OTcKK2YgMTAyNTYvMTMwNjQvNjk3IDEwMjU5LzEzMDY1LzY5NyAxMDI1OC8xMzA2Ni82OTcKK2YgMTAyNTgvMTMwNjYvNjk3IDEwMjU3LzEzMDY3LzY5NyAxMDI1Ni8xMzA2NC82OTcKK2YgMTAyNTYvMTMwNjQvNjk3IDEwMjYwLzEzMDY4LzY5NyAxMDI2MS8xMzA2OS82OTcKK2YgMTAyNjEvMTMwNjkvNjk3IDEwMjU5LzEzMDY1LzY5NyAxMDI1Ni8xMzA2NC82OTcKK2YgMTAyNjMvMTMwNzAvNjk3IDEwMjYyLzEzMDcxLzY5NyAxMDI2NS8xMzA3Mi82OTcKK2YgMTAyNjUvMTMwNzIvNjk3IDEwMjY0LzEzMDczLzY5NyAxMDI2My8xMzA3MC82OTcKK2YgMTAyNjcvMTMwNzQvNjk3IDEwMjY2LzEzMDc1LzY5NyAxMDI2OS8xMzA3Ni82OTcKK2YgMTAyNjkvMTMwNzYvNjk3IDEwMjY4LzEzMDc3LzY5NyAxMDI2Ny8xMzA3NC82OTcKK2YgMTAyNzEvMTMwNzgvNjk3IDEwMjcwLzEzMDc5LzY5NyAxMDI2NS8xMzA3Mi82OTcKK2YgMTAyNjUvMTMwNzIvNjk3IDEwMjYyLzEzMDcxLzY5NyAxMDI3MS8xMzA3OC82OTcKK2YgMTAyNjcvMTMwNzQvNjk3IDEwMjY4LzEzMDc3LzY5NyAxMDI3My8xMzA4MC82OTcKK2YgMTAyNzMvMTMwODAvNjk3IDEwMjcyLzEzMDgxLzY5NyAxMDI2Ny8xMzA3NC82OTcKK2YgMTAyNjQvMTMwNzMvNjk3IDEwMjQxLzEzMDQ4LzY5NyAxMDI1My8xMzA2MS82OTcKK2YgMTAyNTMvMTMwNjEvNjk3IDEwMjc0LzEzMDgyLzY5NyAxMDI2NC8xMzA3My82OTcKK2YgMTAyNjQvMTMwNzMvNjk3IDEwMjc0LzEzMDgyLzY5NyAxMDI3NS8xMzA4My82OTcKK2YgMTAyNzUvMTMwODMvNjk3IDEwMjYzLzEzMDcwLzY5NyAxMDI2NC8xMzA3My82OTcKK2YgMTAyNDQvMTMwNTMvNjk3IDEwMjY5LzEzMDc2LzY5NyAxMDI3Ni8xMzA4NC82OTcKK2YgMTAyNzYvMTMwODQvNjk3IDEwMjU1LzEzMDYzLzY5NyAxMDI0NC8xMzA1My82OTcKK2YgMTAyNjYvMTMwNzUvNjk3IDEwMjc3LzEzMDg1LzY5NyAxMDI3Ni8xMzA4NC82OTcKK2YgMTAyNzYvMTMwODQvNjk3IDEwMjY5LzEzMDc2LzY5NyAxMDI2Ni8xMzA3NS82OTcKK2YgMTAyNzgvMTMwODYvNjk3IDEwMjgxLzEzMDg3LzY5NyAxMDI4MC8xMzA4OC82OTcKK2YgMTAyODAvMTMwODgvNjk3IDEwMjc5LzEzMDg5LzY5NyAxMDI3OC8xMzA4Ni82OTcKK2YgMTAyNzgvMTMwODYvNjk3IDEwMjgyLzEzMDkwLzY5NyAxMDI4My8xMzA5MS82OTcKK2YgMTAyODMvMTMwOTEvNjk3IDEwMjgxLzEzMDg3LzY5NyAxMDI3OC8xMzA4Ni82OTcKK2YgMTAyODUvMTMwOTIvNjk3IDEwMjg0LzEzMDkzLzY5NyAxMDI4Ny8xMzA5NC82OTcKK2YgMTAyODcvMTMwOTQvNjk3IDEwMjg2LzEzMDk1LzY5NyAxMDI4NS8xMzA5Mi82OTcKK2YgMTAyODkvMTMwOTYvNjk3IDEwMjg4LzEzMDk3LzY5NyAxMDI5MS8xMzA5OC82OTcKK2YgMTAyOTEvMTMwOTgvNjk3IDEwMjkwLzEzMDk5LzY5NyAxMDI4OS8xMzA5Ni82OTcKK2YgMTAyOTMvMTMxMDAvNjk3IDEwMjkyLzEzMTAxLzY5NyAxMDI4Ny8xMzA5NC82OTcKK2YgMTAyODcvMTMwOTQvNjk3IDEwMjg0LzEzMDkzLzY5NyAxMDI5My8xMzEwMC82OTcKK2YgMTAyODkvMTMwOTYvNjk3IDEwMjkwLzEzMDk5LzY5NyAxMDI5NS8xMzEwMi82OTcKK2YgMTAyOTUvMTMxMDIvNjk3IDEwMjk0LzEzMTAzLzY5NyAxMDI4OS8xMzA5Ni82OTcKK2YgMTAyODYvMTMwOTUvNjk3IDEwMjYzLzEzMDcwLzY5NyAxMDI3NS8xMzA4My82OTcKK2YgMTAyNzUvMTMwODMvNjk3IDEwMjk2LzEzMTA0LzY5NyAxMDI4Ni8xMzA5NS82OTcKK2YgMTAyODYvMTMwOTUvNjk3IDEwMjk2LzEzMTA0LzY5NyAxMDI5Ny8xMzEwNS82OTcKK2YgMTAyOTcvMTMxMDUvNjk3IDEwMjg1LzEzMDkyLzY5NyAxMDI4Ni8xMzA5NS82OTcKK2YgMTAyNjYvMTMwNzUvNjk3IDEwMjkxLzEzMDk4LzY5NyAxMDI5OC8xMzEwNi82OTcKK2YgMTAyOTgvMTMxMDYvNjk3IDEwMjc3LzEzMDg1LzY5NyAxMDI2Ni8xMzA3NS82OTcKK2YgMTAyODgvMTMwOTcvNjk3IDEwMjk5LzEzMTA3LzY5NyAxMDI5OC8xMzEwNi82OTcKK2YgMTAyOTgvMTMxMDYvNjk3IDEwMjkxLzEzMDk4LzY5NyAxMDI4OC8xMzA5Ny82OTcKK2YgMTAzMDAvMTMxMDgvNjk3IDEwMzAzLzEzMTA5LzY5NyAxMDMwMi8xMzExMC82OTcKK2YgMTAzMDIvMTMxMTAvNjk3IDEwMzAxLzEzMTExLzY5NyAxMDMwMC8xMzEwOC82OTcKK2YgMTAzMDAvMTMxMDgvNjk3IDEwMzA0LzEzMTEyLzY5NyAxMDMwNS8xMzExMy82OTcKK2YgMTAzMDUvMTMxMTMvNjk3IDEwMzAzLzEzMTA5LzY5NyAxMDMwMC8xMzEwOC82OTcKK2YgMTAzMDcvMTMxMTQvNjk3IDEwMzA2LzEzMTE1LzY5NyAxMDMwOS8xMzExNi82OTcKK2YgMTAzMDkvMTMxMTYvNjk3IDEwMzA4LzEzMTE3LzY5NyAxMDMwNy8xMzExNC82OTcKK2YgMTAzMTEvMTMxMTgvNjk3IDEwMzEwLzEzMTE5LzY5NyAxMDMxMy8xMzEyMC82OTcKK2YgMTAzMTMvMTMxMjAvNjk3IDEwMzEyLzEzMTIxLzY5NyAxMDMxMS8xMzExOC82OTcKK2YgMTAzMTUvMTMxMjIvNjk3IDEwMzE0LzEzMTIzLzY5NyAxMDMwOS8xMzExNi82OTcKK2YgMTAzMDkvMTMxMTYvNjk3IDEwMzA2LzEzMTE1LzY5NyAxMDMxNS8xMzEyMi82OTcKK2YgMTAzMTEvMTMxMTgvNjk3IDEwMzEyLzEzMTIxLzY5NyAxMDMxNy8xMzEyNC82OTcKK2YgMTAzMTcvMTMxMjQvNjk3IDEwMzE2LzEzMTI1LzY5NyAxMDMxMS8xMzExOC82OTcKK2YgMTAzMDgvMTMxMTcvNjk3IDEwMjg1LzEzMDkyLzY5NyAxMDI5Ny8xMzEwNS82OTcKK2YgMTAyOTcvMTMxMDUvNjk3IDEwMzE4LzEzMTI2LzY5NyAxMDMwOC8xMzExNy82OTcKK2YgMTAzMDgvMTMxMTcvNjk3IDEwMzE4LzEzMTI2LzY5NyAxMDMxOS8xMzEyNy82OTcKK2YgMTAzMTkvMTMxMjcvNjk3IDEwMzA3LzEzMTE0LzY5NyAxMDMwOC8xMzExNy82OTcKK2YgMTAyODgvMTMwOTcvNjk3IDEwMzEzLzEzMTIwLzY5NyAxMDMyMC8xMzEyOC82OTcKK2YgMTAzMjAvMTMxMjgvNjk3IDEwMjk5LzEzMTA3LzY5NyAxMDI4OC8xMzA5Ny82OTcKK2YgMTAzMTAvMTMxMTkvNjk3IDEwMzIxLzEzMTI5LzY5NyAxMDMyMC8xMzEyOC82OTcKK2YgMTAzMjAvMTMxMjgvNjk3IDEwMzEzLzEzMTIwLzY5NyAxMDMxMC8xMzExOS82OTcKK2YgMTAzMjIvMTMxMzAvNjk3IDEwMzI1LzEzMTMxLzY5NyAxMDMyNC8xMzEzMi82OTcKK2YgMTAzMjQvMTMxMzIvNjk3IDEwMzIzLzEzMTMzLzY5NyAxMDMyMi8xMzEzMC82OTcKK2YgMTAzMjIvMTMxMzAvNjk3IDEwMzI2LzEzMTM0LzY5NyAxMDMyNy8xMzEzNS82OTcKK2YgMTAzMjcvMTMxMzUvNjk3IDEwMzI1LzEzMTMxLzY5NyAxMDMyMi8xMzEzMC82OTcKK2YgMTAzMjkvMTMxMzYvNjk3IDEwMzI4LzEzMTM3LzY5NyAxMDMzMS8xMzEzOC82OTcKK2YgMTAzMzEvMTMxMzgvNjk3IDEwMzMwLzEzMTM5LzY5NyAxMDMyOS8xMzEzNi82OTcKK2YgMTAzMzMvMTMxNDAvNjk3IDEwMzMyLzEzMTQxLzY5NyAxMDMzNS8xMzE0Mi82OTcKK2YgMTAzMzUvMTMxNDIvNjk3IDEwMzM0LzEzMTQzLzY5NyAxMDMzMy8xMzE0MC82OTcKK2YgMTAzMzcvMTMxNDQvNjk3IDEwMzM2LzEzMTQ1LzY5NyAxMDMzMS8xMzEzOC82OTcKK2YgMTAzMzEvMTMxMzgvNjk3IDEwMzI4LzEzMTM3LzY5NyAxMDMzNy8xMzE0NC82OTcKK2YgMTAzMzMvMTMxNDAvNjk3IDEwMzM0LzEzMTQzLzY5NyAxMDMzOS8xMzE0Ni82OTcKK2YgMTAzMzkvMTMxNDYvNjk3IDEwMzM4LzEzMTQ3LzY5NyAxMDMzMy8xMzE0MC82OTcKK2YgMTAzMzAvMTMxMzkvNjk3IDEwMzA3LzEzMTE0LzY5NyAxMDMxOS8xMzEyNy82OTcKK2YgMTAzMTkvMTMxMjcvNjk3IDEwMzQwLzEzMTQ4LzY5NyAxMDMzMC8xMzEzOS82OTcKK2YgMTAzMzAvMTMxMzkvNjk3IDEwMzQwLzEzMTQ4LzY5NyAxMDM0MS8xMzE0OS82OTcKK2YgMTAzNDEvMTMxNDkvNjk3IDEwMzI5LzEzMTM2LzY5NyAxMDMzMC8xMzEzOS82OTcKK2YgMTAzMTAvMTMxMTkvNjk3IDEwMzM1LzEzMTQyLzY5NyAxMDM0Mi8xMzE1MC82OTcKK2YgMTAzNDIvMTMxNTAvNjk3IDEwMzIxLzEzMTI5LzY5NyAxMDMxMC8xMzExOS82OTcKK2YgMTAzMzIvMTMxNDEvNjk3IDEwMzQzLzEzMTUxLzY5NyAxMDM0Mi8xMzE1MC82OTcKK2YgMTAzNDIvMTMxNTAvNjk3IDEwMzM1LzEzMTQyLzY5NyAxMDMzMi8xMzE0MS82OTcKK2YgMTAzNDQvMTMxNTIvNjk3IDEwMzQ3LzEzMTUzLzY5NyAxMDM0Ni8xMzE1NC82OTcKK2YgMTAzNDYvMTMxNTQvNjk3IDEwMzQ1LzEzMTU1LzY5NyAxMDM0NC8xMzE1Mi82OTcKK2YgMTAzNDQvMTMxNTIvNjk3IDEwMzQ4LzEzMTU2LzY5NyAxMDM0OS8xMzE1Ny82OTcKK2YgMTAzNDkvMTMxNTcvNjk3IDEwMzQ3LzEzMTUzLzY5NyAxMDM0NC8xMzE1Mi82OTcKK2YgMTAzNTEvMTMxNTgvNjk3IDEwMzUwLzEzMTU5LzY5NyAxMDM1My8xMzE2MC82OTcKK2YgMTAzNTMvMTMxNjAvNjk3IDEwMzUyLzEzMTYxLzY5NyAxMDM1MS8xMzE1OC82OTcKK2YgMTAzNTEvMTMxNTgvNjk3IDEwMzUyLzEzMTYxLzY5NyAxMDM1NS8xMzE2Mi82OTcKK2YgMTAzNTUvMTMxNjIvNjk3IDEwMzU0LzEzMTYzLzY5NyAxMDM1MS8xMzE1OC82OTcKK2YgMTAzNTcvMTMxNjQvNjk3IDEwMzU2LzEzMTY1LzY5NyAxMDM1OS8xMzE2Ni82OTcKK2YgMTAzNTkvMTMxNjYvNjk3IDEwMzU4LzEzMTY3LzY5NyAxMDM1Ny8xMzE2NC82OTcKK2YgMTAzNjEvMTMxNjgvNjk3IDEwMzYwLzEzMTY5LzY5NyAxMDM2My8xMzE3MC82OTcKK2YgMTAzNjMvMTMxNzAvNjk3IDEwMzYyLzEzMTcxLzY5NyAxMDM2MS8xMzE2OC82OTcKK2YgMTAzNjUvMTMxNzIvNjk3IDEwMzY0LzEzMTczLzY5NyAxMDM1OS8xMzE2Ni82OTcKK2YgMTAzNTkvMTMxNjYvNjk3IDEwMzU2LzEzMTY1LzY5NyAxMDM2NS8xMzE3Mi82OTcKK2YgMTAzNjEvMTMxNjgvNjk3IDEwMzYyLzEzMTcxLzY5NyAxMDM2Ny8xMzE3NC82OTcKK2YgMTAzNjcvMTMxNzQvNjk3IDEwMzY2LzEzMTc1LzY5NyAxMDM2MS8xMzE2OC82OTcKK2YgMTAzNTgvMTMxNjcvNjk3IDEwMzI5LzEzMTM2LzY5NyAxMDM0MS8xMzE0OS82OTcKK2YgMTAzNDEvMTMxNDkvNjk3IDEwMzY4LzEzMTc2LzY5NyAxMDM1OC8xMzE2Ny82OTcKK2YgMTAzNjkvMTMxNzcvNjk3IDEwMzU3LzEzMTY0LzY5NyAxMDM3MS8xMzE3OC82OTcKK2YgMTAzNzEvMTMxNzgvNjk3IDEwMzcwLzEzMTc5LzY5NyAxMDM2OS8xMzE3Ny82OTcKK2YgMTAzNTgvMTMxNjcvNjk3IDEwMzY4LzEzMTc2LzY5NyAxMDM3MS8xMzE3OC82OTcKK2YgMTAzNzEvMTMxNzgvNjk3IDEwMzU3LzEzMTY0LzY5NyAxMDM1OC8xMzE2Ny82OTcKK2YgMTAzNjAvMTMxNjkvNjk3IDEwMzc0LzEzMTgwLzY5NyAxMDM3My8xMzE4MS82OTcKK2YgMTAzNzMvMTMxODEvNjk3IDEwMzcyLzEzMTgyLzY5NyAxMDM2MC8xMzE2OS82OTcKK2YgMTAzMzIvMTMxNDEvNjk3IDEwMzYzLzEzMTcwLzY5NyAxMDM3NS8xMzE4My82OTcKK2YgMTAzNzUvMTMxODMvNjk3IDEwMzQzLzEzMTUxLzY5NyAxMDMzMi8xMzE0MS82OTcKK2YgMTAzNjAvMTMxNjkvNjk3IDEwMzcyLzEzMTgyLzY5NyAxMDM3NS8xMzE4My82OTcKK2YgMTAzNzUvMTMxODMvNjk3IDEwMzYzLzEzMTcwLzY5NyAxMDM2MC8xMzE2OS82OTcKK2YgMTAzNzgvMTMxODQvNjk3IDEwMzc3LzEzMTg1LzY5NyAxMDM3Ni8xMzE4Ni82OTcKK2YgMTAzNzYvMTMxODYvNjk3IDEwMzc5LzEzMTg3LzY5NyAxMDM3OC8xMzE4NC82OTcKK2YgMTAzODAvMTMxODgvNjk3IDEwMzY5LzEzMTc3LzY5NyAxMDM3MC8xMzE3OS82OTcKK2YgMTAzNzAvMTMxNzkvNjk3IDEwMzgxLzEzMTg5LzY5NyAxMDM4MC8xMzE4OC82OTcKK2YgMTAzODIvMTMxOTAvNjk3IDEwMzczLzEzMTgxLzY5NyAxMDM3NC8xMzE4MC82OTcKK2YgMTAzNzQvMTMxODAvNjk3IDEwMzc5LzEzMTg3LzY5NyAxMDM4Mi8xMzE5MC82OTcKK2YgMTAzODQvMTMxOTEvNjk3IDEwMzgzLzEzMTkyLzY5NyAxMDM3Ni8xMzE4Ni82OTcKK2YgMTAzNzYvMTMxODYvNjk3IDEwMzg1LzEzMTkzLzY5NyAxMDM4NC8xMzE5MS82OTcKK2YgMTAzODgvMTMxOTQvNjk3IDEwMzg3LzEzMTk1LzY5NyAxMDM4Ni8xMzE5Ni82OTcKK2YgMTAzODYvMTMxOTYvNjk3IDEwMzg5LzEzMTk3LzY5NyAxMDM4OC8xMzE5NC82OTcKK2YgMTAzOTEvMTMxOTgvNjk3IDEwMzkwLzEzMTk5LzY5NyAxMDM2OS8xMzE3Ny82OTcKK2YgMTAzNjkvMTMxNzcvNjk3IDEwMzgwLzEzMTg4LzY5NyAxMDM5MS8xMzE5OC82OTcKK2YgMTAzOTYvMTI3MDUvNjk3IDEwMzk3LzEyNzA0LzY5NyAxMDEyMS8xMjkyOC82OTcKK2YgMTAxMjEvMTI5MjgvNjk3IDEwMTEwLzEyOTE5LzY5NyAxMDM5Ni8xMjcwNS82OTcKK2YgMTAzOTgvMTI5MTQvNjk3IDEwMzk5LzEyOTEzLzY5NyAxMDExNS8xMjkyMi82OTcKK2YgMTAxMTUvMTI5MjIvNjk3IDEwMTIyLzEyOTMxLzY5NyAxMDM5OC8xMjkxNC82OTcKK2YgMTA0MDAvMTMyMDAvNjk3IDEwNDAzLzEzMjAxLzY5NyAxMDQwMi8xMzIwMi82OTcKK2YgMTA0MDIvMTMyMDIvNjk3IDEwNDAxLzEzMjAzLzY5NyAxMDQwMC8xMzIwMC82OTcKK2YgMTA0MDQvMTMyMDQvNjk3IDEwMzc4LzEzMTg0LzY5NyAxMDQwNi8xMzIwNS82OTcKK2YgMTA0MDYvMTMyMDUvNjk3IDEwNDA1LzEzMjA2LzY5NyAxMDQwNC8xMzIwNC82OTcKK2YgMTA0MDIvMTMyMDIvNjk3IDEwNDA4LzEzMjA3LzY5NyAxMDQwNC8xMzIwNC82OTcKK2YgMTA0MDQvMTMyMDQvNjk3IDEwNDA3LzEzMjA4LzY5NyAxMDQwMi8xMzIwMi82OTcKK2YgMTA0MDQvMTMyMDQvNjk3IDEwNDA1LzEzMjA2LzY5NyAxMDQwNy8xMzIwOC82OTcKK2YgMTA0MDgvMTMyMDcvNjk3IDEwNDAzLzEzMjAxLzY5NyAxMDQxMC8xMzIwOS82OTcKK2YgMTA0MTAvMTMyMDkvNjk3IDEwNDA5LzEzMjEwLzY5NyAxMDQwOC8xMzIwNy82OTcKK2YgMTA0MDkvMTMyMTAvNjk3IDEwNDEwLzEzMjA5LzY5NyAxMDM4Ni8xMzE5Ni82OTcKK2YgMTA0MTIvMTMyMTEvNjk3IDEwNDExLzEzMjEyLzY5NyAxMDM4MC8xMzE4OC82OTcKK2YgMTAzODAvMTMxODgvNjk3IDEwMzgxLzEzMTg5LzY5NyAxMDQxMi8xMzIxMS82OTcKK2YgMTAzOTAvMTMxOTkvNjk3IDEwMzkxLzEzMTk4LzY5NyAxMDQwMC8xMzIwMC82OTcKK2YgMTA0MDAvMTMyMDAvNjk3IDEwNDEzLzEzMjEzLzY5NyAxMDM5MC8xMzE5OS82OTcKK2YgMTA0MTEvMTMyMTIvNjk3IDEwNDE0LzEzMjE0LzY5NyAxMDM5MS8xMzE5OC82OTcKK2YgMTAzOTEvMTMxOTgvNjk3IDEwMzgwLzEzMTg4LzY5NyAxMDQxMS8xMzIxMi82OTcKK2YgMTAzNzYvMTMxODYvNjk3IDEwMzgzLzEzMTkyLzY5NyAxMDM4Mi8xMzE5MC82OTcKK2YgMTAzODIvMTMxOTAvNjk3IDEwMzc5LzEzMTg3LzY5NyAxMDM3Ni8xMzE4Ni82OTcKK2YgMTAzNzQvMTMxODAvNjk3IDEwNDA2LzEzMjA1LzY5NyAxMDM3OC8xMzE4NC82OTcKK2YgMTAzNzgvMTMxODQvNjk3IDEwMzc5LzEzMTg3LzY5NyAxMDM3NC8xMzE4MC82OTcKK2YgMTA0MDAvMTMyMDAvNjk3IDEwNDAxLzEzMjAzLzY5NyAxMDQxMy8xMzIxMy82OTcKK2YgMTAzODYvMTMxOTYvNjk3IDEwMzg3LzEzMTk1LzY5NyAxMDM4NC8xMzE5MS82OTcKK2YgMTAzODQvMTMxOTEvNjk3IDEwMzg1LzEzMTkzLzY5NyAxMDM4Ni8xMzE5Ni82OTcKK2YgMTA0MTEvMTMyMTIvNjk3IDEwNDEyLzEzMjExLzY5NyAxMDM4OC8xMzE5NC82OTcKK2YgMTAzODgvMTMxOTQvNjk3IDEwMzg5LzEzMTk3LzY5NyAxMDQxMS8xMzIxMi82OTcKK2YgMTA0MTEvMTMyMTIvNjk3IDEwMzg5LzEzMTk3LzY5NyAxMDQxNS8xMzIxNS82OTcKK2YgMTA0MTUvMTMyMTUvNjk3IDEwNDE0LzEzMjE0LzY5NyAxMDQxMS8xMzIxMi82OTcKK2YgMTA0MTYvMTMyMTYvNjk3IDEwMzg1LzEzMTkzLzY5NyAxMDM3Ni8xMzE4Ni82OTcKK2YgMTAzNzYvMTMxODYvNjk3IDEwMzc3LzEzMTg1LzY5NyAxMDQxNi8xMzIxNi82OTcKK2YgMTA0MTYvMTMyMTYvNjk3IDEwNDA5LzEzMjEwLzY5NyAxMDM4Ni8xMzE5Ni82OTcKK2YgMTAzODYvMTMxOTYvNjk3IDEwMzg1LzEzMTkzLzY5NyAxMDQxNi8xMzIxNi82OTcKK2YgMTAzODYvMTMxOTYvNjk3IDEwNDEwLzEzMjA5LzY5NyAxMDQxNS8xMzIxNS82OTcKK2YgMTA0MTUvMTMyMTUvNjk3IDEwMzg5LzEzMTk3LzY5NyAxMDM4Ni8xMzE5Ni82OTcKK2YgMTAzNjYvMTMxNzUvNjk3IDEwMzU1LzEzMTYyLzY5NyAxMDQwNy8xMzIwOC82OTcKK2YgMTA0MDcvMTMyMDgvNjk3IDEwNDA1LzEzMjA2LzY5NyAxMDM2Ni8xMzE3NS82OTcKK2YgMTA0MTMvMTMyMTMvNjk3IDEwNDAxLzEzMjAzLzY5NyAxMDM1My8xMzE2MC82OTcKK2YgMTAzNTMvMTMxNjAvNjk3IDEwMzY1LzEzMTcyLzY5NyAxMDQxMy8xMzIxMy82OTcKK2YgMTAzNjYvMTMxNzUvNjk3IDEwMzY3LzEzMTc0LzY5NyAxMDM1NC8xMzE2My82OTcKK2YgMTAzNTQvMTMxNjMvNjk3IDEwMzU1LzEzMTYyLzY5NyAxMDM2Ni8xMzE3NS82OTcKK2YgMTAzNTAvMTMxNTkvNjk3IDEwMzY0LzEzMTczLzY5NyAxMDM2NS8xMzE3Mi82OTcKK2YgMTAzNjUvMTMxNzIvNjk3IDEwMzUzLzEzMTYwLzY5NyAxMDM1MC8xMzE1OS82OTcKK2YgMTAzMzgvMTMxNDcvNjk3IDEwMzQ4LzEzMTU2LzY5NyAxMDM1NC8xMzE2My82OTcKK2YgMTAzNTQvMTMxNjMvNjk3IDEwMzY3LzEzMTc0LzY5NyAxMDMzOC8xMzE0Ny82OTcKK2YgMTAzNjQvMTMxNzMvNjk3IDEwMzUwLzEzMTU5LzY5NyAxMDM0NS8xMzE1NS82OTcKK2YgMTAzNDUvMTMxNTUvNjk3IDEwMzM3LzEzMTQ0LzY5NyAxMDM2NC8xMzE3My82OTcKK2YgMTAzMzkvMTMxNDYvNjk3IDEwMzQ5LzEzMTU3LzY5NyAxMDM0OC8xMzE1Ni82OTcKK2YgMTAzNDgvMTMxNTYvNjk3IDEwMzM4LzEzMTQ3LzY5NyAxMDMzOS8xMzE0Ni82OTcKK2YgMTAzNDYvMTMxNTQvNjk3IDEwMzM2LzEzMTQ1LzY5NyAxMDMzNy8xMzE0NC82OTcKK2YgMTAzMzcvMTMxNDQvNjk3IDEwMzQ1LzEzMTU1LzY5NyAxMDM0Ni8xMzE1NC82OTcKK2YgMTAzMTYvMTMxMjUvNjk3IDEwMzI2LzEzMTM0LzY5NyAxMDM0OS8xMzE1Ny82OTcKK2YgMTAzNDkvMTMxNTcvNjk3IDEwMzM5LzEzMTQ2LzY5NyAxMDMxNi8xMzEyNS82OTcKK2YgMTAzMzYvMTMxNDUvNjk3IDEwMzQ2LzEzMTU0LzY5NyAxMDMyMy8xMzEzMy82OTcKK2YgMTAzMjMvMTMxMzMvNjk3IDEwMzE1LzEzMTIyLzY5NyAxMDMzNi8xMzE0NS82OTcKK2YgMTAzMTcvMTMxMjQvNjk3IDEwMzI3LzEzMTM1LzY5NyAxMDMyNi8xMzEzNC82OTcKK2YgMTAzMjYvMTMxMzQvNjk3IDEwMzE2LzEzMTI1LzY5NyAxMDMxNy8xMzEyNC82OTcKK2YgMTAzMjQvMTMxMzIvNjk3IDEwMzE0LzEzMTIzLzY5NyAxMDMxNS8xMzEyMi82OTcKK2YgMTAzMTUvMTMxMjIvNjk3IDEwMzIzLzEzMTMzLzY5NyAxMDMyNC8xMzEzMi82OTcKK2YgMTAyOTQvMTMxMDMvNjk3IDEwMzA0LzEzMTEyLzY5NyAxMDMyNy8xMzEzNS82OTcKK2YgMTAzMjcvMTMxMzUvNjk3IDEwMzE3LzEzMTI0LzY5NyAxMDI5NC8xMzEwMy82OTcKK2YgMTAzMTQvMTMxMjMvNjk3IDEwMzI0LzEzMTMyLzY5NyAxMDMwMS8xMzExMS82OTcKK2YgMTAzMDEvMTMxMTEvNjk3IDEwMjkzLzEzMTAwLzY5NyAxMDMxNC8xMzEyMy82OTcKK2YgMTAyOTUvMTMxMDIvNjk3IDEwMzA1LzEzMTEzLzY5NyAxMDMwNC8xMzExMi82OTcKK2YgMTAzMDQvMTMxMTIvNjk3IDEwMjk0LzEzMTAzLzY5NyAxMDI5NS8xMzEwMi82OTcKK2YgMTAzMDIvMTMxMTAvNjk3IDEwMjkyLzEzMTAxLzY5NyAxMDI5My8xMzEwMC82OTcKK2YgMTAyOTMvMTMxMDAvNjk3IDEwMzAxLzEzMTExLzY5NyAxMDMwMi8xMzExMC82OTcKK2YgMTAyNzIvMTMwODEvNjk3IDEwMjgyLzEzMDkwLzY5NyAxMDMwNS8xMzExMy82OTcKK2YgMTAzMDUvMTMxMTMvNjk3IDEwMjk1LzEzMTAyLzY5NyAxMDI3Mi8xMzA4MS82OTcKK2YgMTAyOTIvMTMxMDEvNjk3IDEwMzAyLzEzMTEwLzY5NyAxMDI3OS8xMzA4OS82OTcKK2YgMTAyNzkvMTMwODkvNjk3IDEwMjcxLzEzMDc4LzY5NyAxMDI5Mi8xMzEwMS82OTcKK2YgMTAyNzIvMTMwODEvNjk3IDEwMjczLzEzMDgwLzY5NyAxMDI4My8xMzA5MS82OTcKK2YgMTAyODMvMTMwOTEvNjk3IDEwMjgyLzEzMDkwLzY5NyAxMDI3Mi8xMzA4MS82OTcKK2YgMTAyODAvMTMwODgvNjk3IDEwMjcwLzEzMDc5LzY5NyAxMDI3MS8xMzA3OC82OTcKK2YgMTAyNzEvMTMwNzgvNjk3IDEwMjc5LzEzMDg5LzY5NyAxMDI4MC8xMzA4OC82OTcKK2YgMTAyNzMvMTMwODAvNjk3IDEwMjUwLzEzMDU5LzY5NyAxMDI2MC8xMzA2OC82OTcKK2YgMTAyNjAvMTMwNjgvNjk3IDEwMjgzLzEzMDkxLzY5NyAxMDI3My8xMzA4MC82OTcKK2YgMTAyNzAvMTMwNzkvNjk3IDEwMjgwLzEzMDg4LzY5NyAxMDI1Ny8xMzA2Ny82OTcKK2YgMTAyNTcvMTMwNjcvNjk3IDEwMjQ5LzEzMDU2LzY5NyAxMDI3MC8xMzA3OS82OTcKK2YgMTAyNTAvMTMwNTkvNjk3IDEwMjUxLzEzMDU4LzY5NyAxMDI2MS8xMzA2OS82OTcKK2YgMTAyNjEvMTMwNjkvNjk3IDEwMjYwLzEzMDY4LzY5NyAxMDI1MC8xMzA1OS82OTcKK2YgMTAyNTgvMTMwNjYvNjk3IDEwMjQ4LzEzMDU3LzY5NyAxMDI0OS8xMzA1Ni82OTcKK2YgMTAyNDkvMTMwNTYvNjk3IDEwMjU3LzEzMDY3LzY5NyAxMDI1OC8xMzA2Ni82OTcKK2YgMTAyNTEvMTMwNTgvNjk3IDEwMjI4LzEzMDM3LzY5NyAxMDIzOC8xMzA0Ni82OTcKK2YgMTAyMzgvMTMwNDYvNjk3IDEwMjYxLzEzMDY5LzY5NyAxMDI1MS8xMzA1OC82OTcKK2YgMTAyNDgvMTMwNTcvNjk3IDEwMjU4LzEzMDY2LzY5NyAxMDIzNS8xMzA0NS82OTcKK2YgMTAyMzUvMTMwNDUvNjk3IDEwMjI3LzEzMDM0LzY5NyAxMDI0OC8xMzA1Ny82OTcKK2YgMTAyMjgvMTMwMzcvNjk3IDEwMjI5LzEzMDM2LzY5NyAxMDIzOS8xMzA0Ny82OTcKK2YgMTAyMzkvMTMwNDcvNjk3IDEwMjM4LzEzMDQ2LzY5NyAxMDIyOC8xMzAzNy82OTcKK2YgMTAyMzYvMTMwNDQvNjk3IDEwMjI2LzEzMDM1LzY5NyAxMDIyNy8xMzAzNC82OTcKK2YgMTAyMjcvMTMwMzQvNjk3IDEwMjM1LzEzMDQ1LzY5NyAxMDIzNi8xMzA0NC82OTcKK2YgMTAyMjkvMTMwMzYvNjk3IDEwMjA4LzEzMDE3LzY5NyAxMDIxNi8xMzAyNC82OTcKK2YgMTAyMTYvMTMwMjQvNjk3IDEwMjM5LzEzMDQ3LzY5NyAxMDIyOS8xMzAzNi82OTcKK2YgMTAyMjYvMTMwMzUvNjk3IDEwMjM2LzEzMDQ0LzY5NyAxMDIxMy8xMzAyMy82OTcKK2YgMTAyMTMvMTMwMjMvNjk3IDEwMjA3LzEzMDE0LzY5NyAxMDIyNi8xMzAzNS82OTcKK2YgMTAyMDgvMTMwMTcvNjk3IDEwMjA5LzEzMDE2LzY5NyAxMDIxNy8xMzAyNS82OTcKK2YgMTAyMTcvMTMwMjUvNjk3IDEwMjE2LzEzMDI0LzY5NyAxMDIwOC8xMzAxNy82OTcKK2YgMTAyMTQvMTMwMjIvNjk3IDEwMjA2LzEzMDE1LzY5NyAxMDIwNy8xMzAxNC82OTcKK2YgMTAyMDcvMTMwMTQvNjk3IDEwMjEzLzEzMDIzLzY5NyAxMDIxNC8xMzAyMi82OTcKK2YgMTAyMDkvMTMwMTYvNjk3IDEwMTkwLzEyOTk5LzY5NyAxMDE3OS8xMjk4Ni82OTcKK2YgMTAxNzkvMTI5ODYvNjk3IDEwMjE3LzEzMDI1LzY5NyAxMDIwOS8xMzAxNi82OTcKK2YgMTAyMDYvMTMwMTUvNjk3IDEwMjE0LzEzMDIyLzY5NyAxMDE3Ny8xMjk4NC82OTcKK2YgMTAxNzcvMTI5ODQvNjk3IDEwMTg5LzEyOTk2LzY5NyAxMDIwNi8xMzAxNS82OTcKK2YgMTAxOTAvMTI5OTkvNjk3IDEwMTkxLzEyOTk4LzY5NyAxMDE3OC8xMjk4Ny82OTcKK2YgMTAxNzgvMTI5ODcvNjk3IDEwMTc5LzEyOTg2LzY5NyAxMDE5MC8xMjk5OS82OTcKK2YgMTAxNzQvMTI5ODMvNjk3IDEwMTg4LzEyOTk3LzY5NyAxMDE4OS8xMjk5Ni82OTcKK2YgMTAxODkvMTI5OTYvNjk3IDEwMTc3LzEyOTg0LzY5NyAxMDE3NC8xMjk4My82OTcKK2YgMTAxOTEvMTI5OTgvNjk3IDEwMTYyLzEyOTcxLzY5NyAxMDE3Mi8xMjk4MC82OTcKK2YgMTAxNzIvMTI5ODAvNjk3IDEwMTc4LzEyOTg3LzY5NyAxMDE5MS8xMjk5OC82OTcKK2YgMTAxODgvMTI5OTcvNjk3IDEwMTc0LzEyOTgzLzY5NyAxMDE2OS8xMjk3OS82OTcKK2YgMTAxNjkvMTI5NzkvNjk3IDEwMTYxLzEyOTY4LzY5NyAxMDE4OC8xMjk5Ny82OTcKK2YgMTAxNTAvMTI5NTgvNjk3IDEwMTczLzEyOTgxLzY5NyAxMDE2My8xMjk3MC82OTcKK2YgMTAxNjMvMTI5NzAvNjk3IDEwMTQwLzEyOTQ5LzY5NyAxMDE1MC8xMjk1OC82OTcKK2YgMTAxNDcvMTI5NTcvNjk3IDEwMTM5LzEyOTQ2LzY5NyAxMDE2MC8xMjk2OS82OTcKK2YgMTAxNjAvMTI5NjkvNjk3IDEwMTcwLzEyOTc4LzY5NyAxMDE0Ny8xMjk1Ny82OTcKK2YgMTAxNDAvMTI5NDkvNjk3IDEwMTQxLzEyOTQ4LzY5NyAxMDE1MS8xMjk1OS82OTcKK2YgMTAxNTEvMTI5NTkvNjk3IDEwMTUwLzEyOTU4LzY5NyAxMDE0MC8xMjk0OS82OTcKK2YgMTAxNDgvMTI5NTYvNjk3IDEwMTM4LzEyOTQ3LzY5NyAxMDEzOS8xMjk0Ni82OTcKK2YgMTAxMzkvMTI5NDYvNjk3IDEwMTQ3LzEyOTU3LzY5NyAxMDE0OC8xMjk1Ni82OTcKK2YgMTAxNDEvMTI5NDgvNjk3IDEwMTE4LzEyOTI3LzY5NyAxMDEyOC8xMjkzNi82OTcKK2YgMTAxMjgvMTI5MzYvNjk3IDEwMTUxLzEyOTU5LzY5NyAxMDE0MS8xMjk0OC82OTcKK2YgMTAxMzgvMTI5NDcvNjk3IDEwMTQ4LzEyOTU2LzY5NyAxMDEyNS8xMjkzNS82OTcKK2YgMTAxMjUvMTI5MzUvNjk3IDEwMTE3LzEyOTI0LzY5NyAxMDEzOC8xMjk0Ny82OTcKK2YgMTAxMTkvMTI5MjYvNjk3IDEwMTI5LzEyOTM3LzY5NyAxMDEyOC8xMjkzNi82OTcKK2YgMTAxMjgvMTI5MzYvNjk3IDEwMTE4LzEyOTI3LzY5NyAxMDExOS8xMjkyNi82OTcKK2YgMTAxMjYvMTI5MzQvNjk3IDEwMTE2LzEyOTI1LzY5NyAxMDExNy8xMjkyNC82OTcKK2YgMTAxMTcvMTI5MjQvNjk3IDEwMTI1LzEyOTM1LzY5NyAxMDEyNi8xMjkzNC82OTcKK2YgMTAxMTkvMTI5MjYvNjk3IDEwMzk1LzEyNzAwLzY5NyAxMDQxNy8xMjkxMi82OTcKK2YgMTA0MTcvMTI5MTIvNjk3IDEwMTI5LzEyOTM3LzY5NyAxMDExOS8xMjkyNi82OTcKK2YgMTAxMTYvMTI5MjUvNjk3IDEwMTI2LzEyOTM0LzY5NyAxMDQxOC8xMjkxNS82OTcKK2YgMTA0MTgvMTI5MTUvNjk3IDEwMzkyLzEyNjk3LzY5NyAxMDExNi8xMjkyNS82OTcKK2YgMTAxMTEvMTI5MTgvMzU3MSAxMDQyMC8xMzIxNy8zNTcxIDEwNDE5LzEyOTE5LzM1NzEKK2YgMTA0MTkvMTI5MTkvMzg3MCAxMDExMC8xMjkxOS8zODcwIDEwMTExLzEyOTE4LzM4NzAKK2YgMTAxMDkvMTI5MTYvMzU3NCAxMDQyMi8xMzIxOC8zNTc0IDEwNDIxLzEyOTE3LzM1NzQKK2YgMTA0MjEvMTI5MTcvMzU3NCAxMDEwOC8xMjkxNy8zNTc0IDEwMTA5LzEyOTE2LzM1NzQKK2YgMTAxMTUvMTI5MjIvMzU3NSAxMDQyNC8xMzIxOS8zNTc1IDEwNDIzLzEzMjIwLzM1NzUKK2YgMTA0MjMvMTMyMjAvMzY3OCAxMDExNC8xMjkyMy8zNjc4IDEwMTE1LzEyOTIyLzM2NzgKK2YgMTAxMTMvMTI5MjAvMzg3MSAxMDQyNi8xMjkyMC8zODcxIDEwNDI1LzEzMjIxLzM4NzEKK2YgMTA0MjUvMTMyMjEvMzY3OSAxMDExMi8xMjkyMS8zNjc5IDEwMTEzLzEyOTIwLzM2NzkKK2YgMTAxMTYvMTI5MjUvMzU3OSAxMDQyNy8xMzIyMi8zNTc5IDEwNDIwLzEzMjE3LzM1NzkKK2YgMTA0MjAvMTMyMTcvMzU4MCAxMDExMS8xMjkxOC8zNTgwIDEwMTE2LzEyOTI1LzM1ODAKK2YgMTAxMDgvMTI5MTcvMzU4MSAxMDQyMS8xMjkxNy8zNTgxIDEwNDI4LzEzMjIzLzM1ODEKK2YgMTA0MjgvMTMyMjMvMzYyNCAxMDExNy8xMjkyNC8zNjI0IDEwMTA4LzEyOTE3LzM2MjQKK2YgMTAxMTQvMTI5MjMvMzg3MiAxMDQyMy8xMzIyMC8zODcyIDEwNDI5LzEzMjI0LzM4NzIKK2YgMTA0MjkvMTMyMjQvMzU4NCAxMDExOS8xMjkyNi8zNTg0IDEwMTE0LzEyOTIzLzM1ODQKK2YgMTAxMTgvMTI5MjcvMzg3MyAxMDQzMC8xMzIyNS8zODczIDEwNDI2LzEyOTIwLzM4NzMKK2YgMTA0MjYvMTI5MjAvMzg3NCAxMDExMy8xMjkyMC8zODc0IDEwMTE4LzEyOTI3LzM4NzQKK2YgMTAxMjYvMTI5MzQvMzM0NCAxMDQzMi8xMjkzNC8zMzQ0IDEwNDMxLzEyOTE1LzMzNDQKK2YgMTA0MzEvMTI5MTUvMzMzMyAxMDQxOC8xMjkxNS8zMzMzIDEwMTI2LzEyOTM0LzMzMzMKK2YgMTA0MTcvMTI5MTIvMzQyNSAxMDQzNC8xMzIyNi8zNDI1IDEwNDMzLzEzMjI3LzM0MjUKK2YgMTA0MzMvMTMyMjcvMzM2NiAxMDEyOS8xMjkzNy8zMzY2IDEwNDE3LzEyOTEyLzMzNjYKK2YgMTAxMjcvMTI5MzMvMzU4NyAxMDQzNS8xMjkzMy8zNTg3IDEwNDMyLzEyOTM0LzM1ODcKK2YgMTA0MzIvMTI5MzQvMzU4NyAxMDEyNi8xMjkzNC8zNTg3IDEwMTI3LzEyOTMzLzM1ODcKK2YgMTAxMjUvMTI5MzUvMzY3NyAxMDQzNy8xMzIyOC8zNjc3IDEwNDM2LzEyOTMyLzM2NzcKK2YgMTA0MzYvMTI5MzIvMzU5MCAxMDEyNC8xMjkzMi8zNTkwIDEwMTI1LzEyOTM1LzM1OTAKK2YgMTAxMjkvMTI5MzcvMzg3NSAxMDQzMy8xMzIyNy8zODc1IDEwNDM1LzEyOTMzLzM4NzUKK2YgMTA0MzUvMTI5MzMvMzU5MiAxMDEyNy8xMjkzMy8zNTkyIDEwMTI5LzEyOTM3LzM1OTIKK2YgMTAxMjQvMTI5MzIvMzU5MyAxMDQzNi8xMjkzMi8zNTkzIDEwNDM4LzEzMjI5LzM1OTMKK2YgMTA0MzgvMTMyMjkvMzg3NiAxMDEyOC8xMjkzNi8zODc2IDEwMTI0LzEyOTMyLzM4NzYKK2YgMTAxNDEvMTI5NDgvMzM5NSAxMDQzOS8xMzIzMC8zMzk1IDEwNDMwLzEzMjI1LzMzOTUKK2YgMTA0MzAvMTMyMjUvMzM0NCAxMDExOC8xMjkyNy8zMzQ0IDEwMTQxLzEyOTQ4LzMzNDQKK2YgMTAxMTcvMTI5MjQvMzM0NSAxMDQyOC8xMzIyMy8zMzQ1IDEwNDQwLzEzMjMxLzMzNDUKK2YgMTA0NDAvMTMyMzEvMzM0NSAxMDEzOC8xMjk0Ny8zMzQ1IDEwMTE3LzEyOTI0LzMzNDUKK2YgMTAxMzMvMTI5NDAvMzY1MiAxMDQ0Mi8xMjk0MC8zNjUyIDEwNDQxLzEzMjMyLzM2NTIKK2YgMTA0NDEvMTMyMzIvMzU5NyAxMDEzMi8xMjk0MS8zNTk3IDEwMTMzLzEyOTQwLzM1OTcKK2YgMTAxMzEvMTI5MzgvMzg3NyAxMDQ0NC8xMjkzOC8zODc3IDEwNDQzLzEzMjMzLzM4NzcKK2YgMTA0NDMvMTMyMzMvMzU3NCAxMDEzMC8xMjkzOS8zNTc0IDEwMTMxLzEyOTM4LzM1NzQKK2YgMTAxMzcvMTI5NDQvMzU5OSAxMDQ0Ni8xMzIzNC8zNTk5IDEwNDQ1LzEyOTQ1LzM1OTkKK2YgMTA0NDUvMTI5NDUvMzY2MyAxMDEzNi8xMjk0NS8zNjYzIDEwMTM3LzEyOTQ0LzM2NjMKK2YgMTAxMzUvMTI5NDIvMzg3MSAxMDQ0OC8xMzIzNS8zODcxIDEwNDQ3LzEzMjM2LzM4NzEKK2YgMTA0NDcvMTMyMzYvMzU3OCAxMDEzNC8xMjk0My8zNTc4IDEwMTM1LzEyOTQyLzM1NzgKK2YgMTAxMzgvMTI5NDcvMzYwMiAxMDQ0MC8xMzIzMS8zNjAyIDEwNDQyLzEyOTQwLzM2MDIKK2YgMTA0NDIvMTI5NDAvMzYwMiAxMDEzMy8xMjk0MC8zNjAyIDEwMTM4LzEyOTQ3LzM2MDIKK2YgMTAxMzAvMTI5MzkvMzYwNSAxMDQ0My8xMzIzMy8zNjA1IDEwNDQ5LzEzMjM3LzM2MDUKK2YgMTA0NDkvMTMyMzcvMzYwNCAxMDEzOS8xMjk0Ni8zNjA0IDEwMTMwLzEyOTM5LzM2MDQKK2YgMTAxMzYvMTI5NDUvMzYwNiAxMDQ0NS8xMjk0NS8zNjA2IDEwNDM5LzEzMjMwLzM2MDYKK2YgMTA0MzkvMTMyMzAvMzg3OCAxMDE0MS8xMjk0OC8zODc4IDEwMTM2LzEyOTQ1LzM4NzgKK2YgMTAxNDAvMTI5NDkvMzY2NyAxMDQ1MC8xMzIzOC8zNjY3IDEwNDQ4LzEzMjM1LzM2NjcKK2YgMTA0NDgvMTMyMzUvMzYwOSAxMDEzNS8xMjk0Mi8zNjA5IDEwMTQwLzEyOTQ5LzM2MDkKK2YgMTAxMzIvMTI5NDEvMzQzNCAxMDQ0MS8xMzIzMi8zNDM0IDEwNDIyLzEzMjE4LzM0MzQKK2YgMTA0MjIvMTMyMTgvMzM2MiAxMDEwOS8xMjkxNi8zMzYyIDEwMTMyLzEyOTQxLzMzNjIKK2YgMTAxMTIvMTI5MjEvMzM5MCAxMDQyNS8xMzIyMS8zMzkwIDEwNDQ2LzEzMjM0LzMzOTAKK2YgMTA0NDYvMTMyMzQvMzM5MCAxMDEzNy8xMjk0NC8zMzkwIDEwMTEyLzEyOTIxLzMzOTAKK2YgMTAxNDgvMTI5NTYvMzMzMyAxMDQ1MS8xMjk1Ni8zMzMzIDEwNDM3LzEzMjI4LzMzMzMKK2YgMTA0MzcvMTMyMjgvMzIzOCAxMDEyNS8xMjkzNS8zMjM4IDEwMTQ4LzEyOTU2LzMyMzgKK2YgMTAxMjgvMTI5MzYvMzQyNSAxMDQzOC8xMzIyOS8zNDI1IDEwNDUyLzEzMjM5LzM0MjUKK2YgMTA0NTIvMTMyMzkvMzY4OCAxMDE1MS8xMjk1OS8zNjg4IDEwMTI4LzEyOTM2LzM2ODgKK2YgMTAxNDkvMTI5NTUvMzYyOSAxMDQ1My8xMzI0MC8zNjI5IDEwNDUxLzEyOTU2LzM2MjkKK2YgMTA0NTEvMTI5NTYvMzU4OCAxMDE0OC8xMjk1Ni8zNTg4IDEwMTQ5LzEyOTU1LzM1ODgKK2YgMTAxNDcvMTI5NTcvMzg3OSAxMDQ1NS8xMjk1Ny8zODc5IDEwNDU0LzEzMjQxLzM4NzkKK2YgMTA0NTQvMTMyNDEvMzg4MCAxMDE0Ni8xMjk1NC8zODgwIDEwMTQ3LzEyOTU3LzM4ODAKK2YgMTAxNTEvMTI5NTkvMzU5MSAxMDQ1Mi8xMzIzOS8zNTkxIDEwNDUzLzEzMjQwLzM1OTEKK2YgMTA0NTMvMTMyNDAvMzg4MSAxMDE0OS8xMjk1NS8zODgxIDEwMTUxLzEyOTU5LzM4ODEKK2YgMTAxNDYvMTI5NTQvMzg4MiAxMDQ1NC8xMzI0MS8zODgyIDEwNDU2LzEzMjQyLzM4ODIKK2YgMTA0NTYvMTMyNDIvMzYzNCAxMDE1MC8xMjk1OC8zNjM0IDEwMTQ2LzEyOTU0LzM2MzQKK2YgMTAxNjMvMTI5NzAvMzM5NSAxMDQ1Ny8xMzI0My8zMzk1IDEwNDUwLzEzMjM4LzMzOTUKK2YgMTA0NTAvMTMyMzgvMzQ1OCAxMDE0MC8xMjk0OS8zNDU4IDEwMTYzLzEyOTcwLzM0NTgKK2YgMTAxMzkvMTI5NDYvMzMzNSAxMDQ0OS8xMzIzNy8zMzM1IDEwNDU4LzEzMjQ0LzMzMzUKK2YgMTA0NTgvMTMyNDQvMzMzNSAxMDE2MC8xMjk2OS8zMzM1IDEwMTM5LzEyOTQ2LzMzMzUKK2YgMTAxNTUvMTI5NjIvMzYxOSAxMDQ2MC8xMzI0NS8zNjE5IDEwNDU5LzEyOTYzLzM2MTkKK2YgMTA0NTkvMTI5NjMvMzU5NiAxMDE1NC8xMjk2My8zNTk2IDEwMTU1LzEyOTYyLzM1OTYKK2YgMTAxNTMvMTI5NjAvMzU3NCAxMDQ2Mi8xMjk2MC8zNTc0IDEwNDYxLzEzMjQ2LzM1NzQKK2YgMTA0NjEvMTMyNDYvMzU5OCAxMDE1Mi8xMjk2MS8zNTk4IDEwMTUzLzEyOTYwLzM1OTgKK2YgMTAxNTkvMTI5NjYvMzYyMSAxMDQ2NC8xMzI0Ny8zNjIxIDEwNDYzLzEzMjQ4LzM2MjEKK2YgMTA0NjMvMTMyNDgvMzYwMCAxMDE1OC8xMjk2Ny8zNjAwIDEwMTU5LzEyOTY2LzM2MDAKK2YgMTAxNTcvMTI5NjQvMzg4MyAxMDQ2Ni8xMzI0OS8zODgzIDEwNDY1LzEzMjUwLzM4ODMKK2YgMTA0NjUvMTMyNTAvMzcwMCAxMDE1Ni8xMjk2NS8zNzAwIDEwMTU3LzEyOTY0LzM3MDAKK2YgMTAxNjAvMTI5NjkvMzYyMyAxMDQ1OC8xMzI0NC8zNjIzIDEwNDYwLzEzMjQ1LzM2MjMKK2YgMTA0NjAvMTMyNDUvMzYyMyAxMDE1NS8xMjk2Mi8zNjIzIDEwMTYwLzEyOTY5LzM2MjMKK2YgMTAxNTIvMTI5NjEvMzY3MiAxMDQ2MS8xMzI0Ni8zNjcyIDEwNDY3LzEzMjUxLzM2NzIKK2YgMTA0NjcvMTMyNTEvMzYyNCAxMDE2MS8xMjk2OC8zNjI0IDEwMTUyLzEyOTYxLzM2MjQKK2YgMTAxNTgvMTI5NjcvMzYyNSAxMDQ2My8xMzI0OC8zNjI1IDEwNDU3LzEzMjQzLzM2MjUKK2YgMTA0NTcvMTMyNDMvMzYyNiAxMDE2My8xMjk3MC8zNjI2IDEwMTU4LzEyOTY3LzM2MjYKK2YgMTAxNjIvMTI5NzEvMzY2NyAxMDQ2OC8xMzI1Mi8zNjY3IDEwNDY2LzEzMjQ5LzM2NjcKK2YgMTA0NjYvMTMyNDkvMzYyOCAxMDE1Ny8xMjk2NC8zNjI4IDEwMTYyLzEyOTcxLzM2MjgKK2YgMTAxNTQvMTI5NjMvMzQ3OCAxMDQ1OS8xMjk2My8zNDc4IDEwNDQ0LzEyOTM4LzM0NzgKK2YgMTA0NDQvMTI5MzgvMzMzMyAxMDEzMS8xMjkzOC8zMzMzIDEwMTU0LzEyOTYzLzMzMzMKK2YgMTAxMzQvMTI5NDMvMzQxNSAxMDQ0Ny8xMzIzNi8zNDE1IDEwNDY0LzEzMjQ3LzM0MTUKK2YgMTA0NjQvMTMyNDcvMzM5MCAxMDE1OS8xMjk2Ni8zMzkwIDEwMTM0LzEyOTQzLzMzOTAKK2YgMTAxNzAvMTI5NzgvMzMzMyAxMDQ2OS8xMjk3OC8zMzMzIDEwNDU1LzEyOTU3LzMzMzMKK2YgMTA0NTUvMTI5NTcvMzIzOCAxMDE0Ny8xMjk1Ny8zMjM4IDEwMTcwLzEyOTc4LzMyMzgKK2YgMTAxNTAvMTI5NTgvMzY4OCAxMDQ1Ni8xMzI0Mi8zNjg4IDEwNDcwLzEzMjUzLzM2ODgKK2YgMTA0NzAvMTMyNTMvMzMzNCAxMDE3My8xMjk4MS8zMzM0IDEwMTUwLzEyOTU4LzMzMzQKK2YgMTAxNzEvMTI5NzcvMzYyOSAxMDQ3MS8xMjk3Ny8zNjI5IDEwNDY5LzEyOTc4LzM2MjkKK2YgMTA0NjkvMTI5NzgvMzU4OCAxMDE3MC8xMjk3OC8zNTg4IDEwMTcxLzEyOTc3LzM1ODgKK2YgMTAxNjkvMTI5NzkvMzYzMiAxMDQ3My8xMzI1NC8zNjMyIDEwNDcyLzEyOTc2LzM2MzIKK2YgMTA0NzIvMTI5NzYvMzYzMiAxMDE2OC8xMjk3Ni8zNjMyIDEwMTY5LzEyOTc5LzM2MzIKK2YgMTAxNzMvMTI5ODEvMzYxNSAxMDQ3MC8xMzI1My8zNjE1IDEwNDcxLzEyOTc3LzM2MTUKK2YgMTA0NzEvMTI5NzcvMzYxNiAxMDE3MS8xMjk3Ny8zNjE2IDEwMTczLzEyOTgxLzM2MTYKK2YgMTAxNjgvMTI5NzYvMzY2MiAxMDQ3Mi8xMjk3Ni8zNjYyIDEwNDc0LzEzMjU1LzM2NjIKK2YgMTA0NzQvMTMyNTUvMzg4NCAxMDE3Mi8xMjk4MC8zODg0IDEwMTY4LzEyOTc2LzM4ODQKK2YgMTAxOTEvMTI5OTgvMzM3NSAxMDQ3NS8xMzI1Ni8zMzc1IDEwNDY4LzEzMjUyLzMzNzUKK2YgMTA0NjgvMTMyNTIvMzIzOCAxMDE2Mi8xMjk3MS8zMjM4IDEwMTkxLzEyOTk4LzMyMzgKK2YgMTAxODkvMTI5OTYvMzM0NSAxMDQ3Ny8xMzI1Ny8zMzQ1IDEwNDc2LzEzMjU4LzMzNDUKK2YgMTA0NzYvMTMyNTgvMzMzNSAxMDIwNi8xMzAxNS8zMzM1IDEwMTg5LzEyOTk2LzMzMzUKK2YgMTAxNzcvMTI5ODQvMzg4NSAxMDQ3OS8xMjk4NC8zODg1IDEwNDc4LzEzMjU5LzM4ODUKK2YgMTA0NzgvMTMyNTkvMzYzNyAxMDE3Ni8xMjk4NS8zNjM3IDEwMTc3LzEyOTg0LzM2MzcKK2YgMTAxNzUvMTI5ODIvMzYzOCAxMDQ4MS8xMzI2MC8zNjM4IDEwNDgwLzEzMjYxLzM2MzgKK2YgMTA0ODAvMTMyNjEvMzg4NiAxMDE3NC8xMjk4My8zODg2IDEwMTc1LzEyOTgyLzM4ODYKK2YgMTAxNzYvMTI5ODUvMzg4NyAxMDQ3OC8xMzI1OS8zODg3IDEwNDgyLzEzMjYyLzM4ODcKK2YgMTA0ODIvMTMyNjIvMzg4OCAxMDE3OS8xMjk4Ni8zODg4IDEwMTc2LzEyOTg1LzM4ODgKK2YgMTAxNzgvMTI5ODcvMzg4OSAxMDQ4My8xMzI2My8zODg5IDEwNDgxLzEzMjYwLzM4ODkKK2YgMTA0ODEvMTMyNjAvMzY2OCAxMDE3NS8xMjk4Mi8zNjY4IDEwMTc4LzEyOTg3LzM2NjgKK2YgMTAyMDkvMTMwMTYvMzM3NSAxMDQ4NS8xMzI2NC8zMzc1IDEwNDg0LzEzMjY1LzMzNzUKK2YgMTA0ODQvMTMyNjUvMzM0NCAxMDE5MC8xMjk5OS8zMzQ0IDEwMjA5LzEzMDE2LzMzNDQKK2YgMTAxNjEvMTI5NjgvMzMzNSAxMDQ2Ny8xMzI1MS8zMzM1IDEwNDg2LzEzMjY2LzMzMzUKK2YgMTA0ODYvMTMyNjYvMzYzNSAxMDE4OC8xMjk5Ny8zNjM1IDEwMTYxLzEyOTY4LzM2MzUKK2YgMTAxODMvMTI5OTAvMzU5NiAxMDQ4OC8xMjk5MC8zNTk2IDEwNDg3LzEzMjY3LzM1OTYKK2YgMTA0ODcvMTMyNjcvMzYxOSAxMDE4Mi8xMjk5MS8zNjE5IDEwMTgzLzEyOTkwLzM2MTkKK2YgMTAxODEvMTI5ODgvMzY0MiAxMDQ5MC8xMjk4OC8zNjQyIDEwNDg5LzEzMjY4LzM2NDIKK2YgMTA0ODkvMTMyNjgvMzY0MiAxMDE4MC8xMjk4OS8zNjQyIDEwMTgxLzEyOTg4LzM2NDIKK2YgMTAxODcvMTI5OTQvMzU5OSAxMDQ5Mi8xMzI2OS8zNTk5IDEwNDkxLzEyOTk1LzM1OTkKK2YgMTA0OTEvMTI5OTUvMzYwMCAxMDE4Ni8xMjk5NS8zNjAwIDEwMTg3LzEyOTk0LzM2MDAKK2YgMTAxODUvMTI5OTIvMzg5MCAxMDQ5NC8xMzI3MC8zODkwIDEwNDkzLzEzMjcxLzM4OTAKK2YgMTA0OTMvMTMyNzEvMzg5MSAxMDE4NC8xMjk5My8zODkxIDEwMTg1LzEyOTkyLzM4OTEKK2YgMTAxODgvMTI5OTcvMzY0NiAxMDQ4Ni8xMzI2Ni8zNjQ2IDEwNDg4LzEyOTkwLzM2NDYKK2YgMTA0ODgvMTI5OTAvMzY0NiAxMDE4My8xMjk5MC8zNjQ2IDEwMTg4LzEyOTk3LzM2NDYKK2YgMTAxODAvMTI5ODkvMzg5MiAxMDQ4OS8xMzI2OC8zODkyIDEwNDc3LzEzMjU3LzM4OTIKK2YgMTA0NzcvMTMyNTcvMzg5MyAxMDE4OS8xMjk5Ni8zODkzIDEwMTgwLzEyOTg5LzM4OTMKK2YgMTAxODYvMTI5OTUvMzY0OCAxMDQ5MS8xMjk5NS8zNjQ4IDEwNDc1LzEzMjU2LzM2NDgKK2YgMTA0NzUvMTMyNTYvMzY0OSAxMDE5MS8xMjk5OC8zNjQ5IDEwMTg2LzEyOTk1LzM2NDkKK2YgMTAxOTAvMTI5OTkvMzg0NCAxMDQ4NC8xMzI2NS8zODQ0IDEwNDk0LzEzMjcwLzM4NDQKK2YgMTA0OTQvMTMyNzAvMzY1MCAxMDE4NS8xMjk5Mi8zNjUwIDEwMTkwLzEyOTk5LzM2NTAKK2YgMTAxODIvMTI5OTEvMzQzNCAxMDQ4Ny8xMzI2Ny8zNDM0IDEwNDYyLzEyOTYwLzM0MzQKK2YgMTA0NjIvMTI5NjAvMzM2MiAxMDE1My8xMjk2MC8zMzYyIDEwMTgyLzEyOTkxLzMzNjIKK2YgMTAxOTMvMTMwMDEvMzQzNCAxMDQ5NS8xMzAwMS8zNDM0IDEwNDkwLzEyOTg4LzM0MzQKK2YgMTA0OTAvMTI5ODgvMzM2MiAxMDE4MS8xMjk4OC8zMzYyIDEwMTkzLzEzMDAxLzMzNjIKK2YgMTAxODQvMTI5OTMvMzQxNSAxMDQ5My8xMzI3MS8zNDE1IDEwNDk2LzEzMjcyLzM0MTUKK2YgMTA0OTYvMTMyNzIvMzM5MCAxMDE5OC8xMzAwNC8zMzkwIDEwMTg0LzEyOTkzLzMzOTAKK2YgMTAxNTYvMTI5NjUvMzQxNSAxMDQ2NS8xMzI1MC8zNDE1IDEwNDkyLzEzMjY5LzM0MTUKK2YgMTA0OTIvMTMyNjkvMzM5MCAxMDE4Ny8xMjk5NC8zMzkwIDEwMTU2LzEyOTY1LzMzOTAKK2YgMTAxNzQvMTI5ODMvMzIzOCAxMDQ4MC8xMzI2MS8zMjM4IDEwNDczLzEzMjU0LzMyMzgKK2YgMTA0NzMvMTMyNTQvMzIzOCAxMDE2OS8xMjk3OS8zMjM4IDEwMTc0LzEyOTgzLzMyMzgKK2YgMTAxNzIvMTI5ODAvMzY4OCAxMDQ3NC8xMzI1NS8zNjg4IDEwNDgzLzEzMjYzLzM2ODgKK2YgMTA0ODMvMTMyNjMvMzQ1OSAxMDE3OC8xMjk4Ny8zNDU5IDEwMTcyLzEyOTgwLzM0NTkKK2YgMTAyMDIvMTMwMTAvMzY1MSAxMDQ5Ny8xMzI3My8zNjUxIDEwNDk1LzEzMDAxLzM2NTEKK2YgMTA0OTUvMTMwMDEvMzU3MiAxMDE5My8xMzAwMS8zNTcyIDEwMjAyLzEzMDEwLzM1NzIKK2YgMTAyMDEvMTMwMDgvMzU3NCAxMDQ5OS8xMzAwOC8zNTc0IDEwNDk4LzEzMjc0LzM1NzQKK2YgMTA0OTgvMTMyNzQvMzg3NyAxMDIwMC8xMzAwOS8zODc3IDEwMjAxLzEzMDA4LzM4NzcKK2YgMTAxOTgvMTMwMDQvMzg5NCAxMDQ5Ni8xMzI3Mi8zODk0IDEwNTAwLzEzMjc1LzM4OTQKK2YgMTA1MDAvMTMyNzUvMzg5NSAxMDIwNS8xMzAxMy8zODk1IDEwMTk4LzEzMDA0LzM4OTUKK2YgMTAyMDQvMTMwMTEvMzU3NyAxMDUwMi8xMzI3Ni8zNTc3IDEwNTAxLzEzMjc3LzM1NzcKK2YgMTA1MDEvMTMyNzcvMzY3OSAxMDIwMy8xMzAxMi8zNjc5IDEwMjA0LzEzMDExLzM2NzkKK2YgMTAyMDYvMTMwMTUvMzY1NiAxMDQ3Ni8xMzI1OC8zNjU2IDEwNDk3LzEzMjczLzM2NTYKK2YgMTA0OTcvMTMyNzMvMzY1NiAxMDIwMi8xMzAxMC8zNjU2IDEwMjA2LzEzMDE1LzM2NTYKK2YgMTAyMDAvMTMwMDkvMzY3MiAxMDQ5OC8xMzI3NC8zNjcyIDEwNTAzLzEzMjc4LzM2NzIKK2YgMTA1MDMvMTMyNzgvMzYyNCAxMDIwNy8xMzAxNC8zNjI0IDEwMjAwLzEzMDA5LzM2MjQKK2YgMTAyMDUvMTMwMTMvMzg5NiAxMDUwMC8xMzI3NS8zODk2IDEwNDg1LzEzMjY0LzM4OTYKK2YgMTA0ODUvMTMyNjQvMzY1OCAxMDIwOS8xMzAxNi8zNjU4IDEwMjA1LzEzMDEzLzM2NTgKK2YgMTAyMDgvMTMwMTcvMzY1OSAxMDUwNC8xMzI3OS8zNjU5IDEwNTAyLzEzMjc2LzM2NTkKK2YgMTA1MDIvMTMyNzYvMzg5NyAxMDIwNC8xMzAxMS8zODk3IDEwMjA4LzEzMDE3LzM4OTcKK2YgMTAyMTQvMTMwMjIvMzMzMyAxMDUwNS8xMzAyMi8zMzMzIDEwNDc5LzEyOTg0LzMzMzMKK2YgMTA0NzkvMTI5ODQvMzIzOCAxMDE3Ny8xMjk4NC8zMjM4IDEwMjE0LzEzMDIyLzMyMzgKK2YgMTAxNzkvMTI5ODYvMzQyNSAxMDQ4Mi8xMzI2Mi8zNDI1IDEwNTA2LzEzMjgwLzM0MjUKK2YgMTA1MDYvMTMyODAvMzY4OCAxMDIxNy8xMzAyNS8zNjg4IDEwMTc5LzEyOTg2LzM2ODgKK2YgMTAyMTUvMTMwMjEvMzY3NSAxMDUwNy8xMzI4MS8zNjc1IDEwNTA1LzEzMDIyLzM2NzUKK2YgMTA1MDUvMTMwMjIvMzYxMSAxMDIxNC8xMzAyMi8zNjExIDEwMjE1LzEzMDIxLzM2MTEKK2YgMTAyMTMvMTMwMjMvMzYzMiAxMDUwOS8xMzI4Mi8zNjMyIDEwNTA4LzEzMDIwLzM2MzIKK2YgMTA1MDgvMTMwMjAvMzYzMiAxMDIxMi8xMzAyMC8zNjMyIDEwMjEzLzEzMDIzLzM2MzIKK2YgMTAyMTcvMTMwMjUvMzU5MSAxMDUwNi8xMzI4MC8zNTkxIDEwNTA3LzEzMjgxLzM1OTEKK2YgMTA1MDcvMTMyODEvMzYzMyAxMDIxNS8xMzAyMS8zNjMzIDEwMjE3LzEzMDI1LzM2MzMKK2YgMTAyMTIvMTMwMjAvMzU5NCAxMDUwOC8xMzAyMC8zNTk0IDEwNTEwLzEzMjgzLzM1OTQKK2YgMTA1MTAvMTMyODMvMzU5NCAxMDIxNi8xMzAyNC8zNTk0IDEwMjEyLzEzMDIwLzM1OTQKK2YgMTAyMjkvMTMwMzYvMzM5NSAxMDUxMS8xMzI4NC8zMzk1IDEwNTA0LzEzMjc5LzMzOTUKK2YgMTA1MDQvMTMyNzkvMzM2NSAxMDIwOC8xMzAxNy8zMzY1IDEwMjI5LzEzMDM2LzMzNjUKK2YgMTAyMDcvMTMwMTQvMzM0NiAxMDUwMy8xMzI3OC8zMzQ2IDEwNTEyLzEzMjg1LzMzNDYKK2YgMTA1MTIvMTMyODUvMzM0NSAxMDIyNi8xMzAzNS8zMzQ1IDEwMjA3LzEzMDE0LzMzNDUKK2YgMTAyMjEvMTMwMjgvMzU5NiAxMDUxNC8xMzAyOC8zNTk2IDEwNTEzLzEzMjg2LzM1OTYKK2YgMTA1MTMvMTMyODYvMzU5NiAxMDIyMC8xMzAyOS8zNTk2IDEwMjIxLzEzMDI4LzM1OTYKK2YgMTAyMTkvMTMwMjYvMzg3NyAxMDUxNi8xMzI4Ny8zODc3IDEwNTE1LzEzMDI3LzM4NzcKK2YgMTA1MTUvMTMwMjcvMzg3NyAxMDIxOC8xMzAyNy8zODc3IDEwMjE5LzEzMDI2LzM4NzcKK2YgMTAyMjUvMTMwMzIvMzU5OSAxMDUxOC8xMzI4OC8zNTk5IDEwNTE3LzEzMDMzLzM1OTkKK2YgMTA1MTcvMTMwMzMvMzYwMCAxMDIyNC8xMzAzMy8zNjAwIDEwMjI1LzEzMDMyLzM2MDAKK2YgMTAyMjMvMTMwMzAvMzY2NCAxMDUyMC8xMzAzMC8zNjY0IDEwNTE5LzEzMjg5LzM2NjQKK2YgMTA1MTkvMTMyODkvMzg5OCAxMDIyMi8xMzAzMS8zODk4IDEwMjIzLzEzMDMwLzM4OTgKK2YgMTAyMjYvMTMwMzUvMzYyMyAxMDUxMi8xMzI4NS8zNjIzIDEwNTE0LzEzMDI4LzM2MjMKK2YgMTA1MTQvMTMwMjgvMzYyMyAxMDIyMS8xMzAyOC8zNjIzIDEwMjI2LzEzMDM1LzM2MjMKK2YgMTAyMTgvMTMwMjcvMzY2NSAxMDUxNS8xMzAyNy8zNjY1IDEwNTIxLzEzMjkwLzM2NjUKK2YgMTA1MjEvMTMyOTAvMzYyNCAxMDIyNy8xMzAzNC8zNjI0IDEwMjE4LzEzMDI3LzM2MjQKK2YgMTAyMjQvMTMwMzMvMzcwNCAxMDUxNy8xMzAzMy8zNzA0IDEwNTExLzEzMjg0LzM3MDQKK2YgMTA1MTEvMTMyODQvMzg3OCAxMDIyOS8xMzAzNi8zODc4IDEwMjI0LzEzMDMzLzM4NzgKK2YgMTAyMjgvMTMwMzcvMzg5OSAxMDUyMi8xMzI5MS8zODk5IDEwNTIwLzEzMDMwLzM4OTkKK2YgMTA1MjAvMTMwMzAvMzU4NiAxMDIyMy8xMzAzMC8zNTg2IDEwMjI4LzEzMDM3LzM1ODYKK2YgMTAyMjAvMTMwMjkvMzQ3OCAxMDUxMy8xMzI4Ni8zNDc4IDEwNDk5LzEzMDA4LzM0NzgKK2YgMTA0OTkvMTMwMDgvMzMzMyAxMDIwMS8xMzAwOC8zMzMzIDEwMjIwLzEzMDI5LzMzMzMKK2YgMTAyMDMvMTMwMTIvMzM5MCAxMDUwMS8xMzI3Ny8zMzkwIDEwNTE4LzEzMjg4LzMzOTAKK2YgMTA1MTgvMTMyODgvMzM5MCAxMDIyNS8xMzAzMi8zMzkwIDEwMjAzLzEzMDEyLzMzOTAKK2YgMTAyMzYvMTMwNDQvMzM2NSAxMDUyMy8xMzI5Mi8zMzY1IDEwNTA5LzEzMjgyLzMzNjUKK2YgMTA1MDkvMTMyODIvMzM2NSAxMDIxMy8xMzAyMy8zMzY1IDEwMjM2LzEzMDQ0LzMzNjUKK2YgMTAyMTYvMTMwMjQvMzQ1OSAxMDUxMC8xMzI4My8zNDU5IDEwNTI0LzEzMjkzLzM0NTkKK2YgMTA1MjQvMTMyOTMvMzQyNSAxMDIzOS8xMzA0Ny8zNDI1IDEwMjE2LzEzMDI0LzM0MjUKK2YgMTAyMzcvMTMwNDMvMzYxMSAxMDUyNS8xMzA0My8zNjExIDEwNTIzLzEzMjkyLzM2MTEKK2YgMTA1MjMvMTMyOTIvMzkwMCAxMDIzNi8xMzA0NC8zOTAwIDEwMjM3LzEzMDQzLzM5MDAKK2YgMTAyMzUvMTMwNDUvMzkwMSAxMDUyNy8xMzA0NS8zOTAxIDEwNTI2LzEzMjk0LzM5MDEKK2YgMTA1MjYvMTMyOTQvMzg3OSAxMDIzNC8xMzA0Mi8zODc5IDEwMjM1LzEzMDQ1LzM4NzkKK2YgMTAyMzkvMTMwNDcvMzYzMyAxMDUyNC8xMzI5My8zNjMzIDEwNTI1LzEzMDQzLzM2MzMKK2YgMTA1MjUvMTMwNDMvMzY2OCAxMDIzNy8xMzA0My8zNjY4IDEwMjM5LzEzMDQ3LzM2NjgKK2YgMTAyMzQvMTMwNDIvMzkwMiAxMDUyNi8xMzI5NC8zOTAyIDEwNTI4LzEzMjk1LzM5MDIKK2YgMTA1MjgvMTMyOTUvMzU5NCAxMDIzOC8xMzA0Ni8zNTk0IDEwMjM0LzEzMDQyLzM1OTQKK2YgMTAyNTEvMTMwNTgvMzM3NSAxMDUyOS8xMzI5Ni8zMzc1IDEwNTIyLzEzMjkxLzMzNzUKK2YgMTA1MjIvMTMyOTEvMzM2NSAxMDIyOC8xMzAzNy8zMzY1IDEwMjUxLzEzMDU4LzMzNjUKK2YgMTAyMjcvMTMwMzQvMzM0NSAxMDUyMS8xMzI5MC8zMzQ1IDEwNTMwLzEzMjk3LzMzNDUKK2YgMTA1MzAvMTMyOTcvMzM0NSAxMDI0OC8xMzA1Ny8zMzQ1IDEwMjI3LzEzMDM0LzMzNDUKK2YgMTAyNDMvMTMwNTAvMzY1MSAxMDUzMi8xMzI5OC8zNjUxIDEwNTMxLzEzMDUxLzM2NTEKK2YgMTA1MzEvMTMwNTEvMzU5NiAxMDI0Mi8xMzA1MS8zNTk2IDEwMjQzLzEzMDUwLzM1OTYKK2YgMTAyNDEvMTMwNDgvMzU5OCAxMDUzNC8xMzA0OC8zNTk4IDEwNTMzLzEzMjk5LzM1OTgKK2YgMTA1MzMvMTMyOTkvMzY3MCAxMDI0MC8xMzA0OS8zNjcwIDEwMjQxLzEzMDQ4LzM2NzAKK2YgMTAyNDcvMTMwNTQvMzkwMyAxMDUzNi8xMzMwMC8zOTAzIDEwNTM1LzEzMzAxLzM5MDMKK2YgMTA1MzUvMTMzMDEvMzYwMCAxMDI0Ni8xMzA1NS8zNjAwIDEwMjQ3LzEzMDU0LzM2MDAKK2YgMTAyNDUvMTMwNTIvMzU3NyAxMDUzOC8xMzMwMi8zNTc3IDEwNTM3LzEzMzAzLzM1NzcKK2YgMTA1MzcvMTMzMDMvMzY3MSAxMDI0NC8xMzA1My8zNjcxIDEwMjQ1LzEzMDUyLzM2NzEKK2YgMTAyNDgvMTMwNTcvMzY1NiAxMDUzMC8xMzI5Ny8zNjU2IDEwNTMyLzEzMjk4LzM2NTYKK2YgMTA1MzIvMTMyOTgvMzkwNCAxMDI0My8xMzA1MC8zOTA0IDEwMjQ4LzEzMDU3LzM5MDQKK2YgMTAyNDAvMTMwNDkvMzU4MSAxMDUzMy8xMzI5OS8zNTgxIDEwNTM5LzEzMzA0LzM1ODEKK2YgMTA1MzkvMTMzMDQvMzY3MiAxMDI0OS8xMzA1Ni8zNjcyIDEwMjQwLzEzMDQ5LzM2NzIKK2YgMTAyNDYvMTMwNTUvMzYyNSAxMDUzNS8xMzMwMS8zNjI1IDEwNTI5LzEzMjk2LzM2MjUKK2YgMTA1MjkvMTMyOTYvMzY3MyAxMDI1MS8xMzA1OC8zNjczIDEwMjQ2LzEzMDU1LzM2NzMKK2YgMTAyNTAvMTMwNTkvMzkwNSAxMDU0MC8xMzMwNS8zOTA1IDEwNTM4LzEzMzAyLzM5MDUKK2YgMTA1MzgvMTMzMDIvMzkwNiAxMDI0NS8xMzA1Mi8zOTA2IDEwMjUwLzEzMDU5LzM5MDYKK2YgMTAyNDIvMTMwNTEvMzQzNCAxMDUzMS8xMzA1MS8zNDM0IDEwNTE2LzEzMjg3LzM0MzQKK2YgMTA1MTYvMTMyODcvMzMzMyAxMDIxOS8xMzAyNi8zMzMzIDEwMjQyLzEzMDUxLzMzMzMKK2YgMTAyMjIvMTMwMzEvMzQxNSAxMDUxOS8xMzI4OS8zNDE1IDEwNTM2LzEzMzAwLzM0MTUKK2YgMTA1MzYvMTMzMDAvMzYxMCAxMDI0Ny8xMzA1NC8zNjEwIDEwMjIyLzEzMDMxLzM2MTAKK2YgMTAyNTgvMTMwNjYvMzM2NSAxMDU0MS8xMzA2Ni8zMzY1IDEwNTI3LzEzMDQ1LzMzNjUKK2YgMTA1MjcvMTMwNDUvMzM2NSAxMDIzNS8xMzA0NS8zMzY1IDEwMjU4LzEzMDY2LzMzNjUKK2YgMTAyMzgvMTMwNDYvMzQ1OSAxMDUyOC8xMzI5NS8zNDU5IDEwNTQyLzEzMzA2LzM0NTkKK2YgMTA1NDIvMTMzMDYvMzQyNSAxMDI2MS8xMzA2OS8zNDI1IDEwMjM4LzEzMDQ2LzM0MjUKK2YgMTAyNTkvMTMwNjUvMzYyOSAxMDU0My8xMzMwNy8zNjI5IDEwNTQxLzEzMDY2LzM2MjkKK2YgMTA1NDEvMTMwNjYvMzYyOSAxMDI1OC8xMzA2Ni8zNjI5IDEwMjU5LzEzMDY1LzM2MjkKK2YgMTAyNTcvMTMwNjcvMzkwNyAxMDU0NS8xMzA2Ny8zOTA3IDEwNTQ0LzEzMzA4LzM5MDcKK2YgMTA1NDQvMTMzMDgvMzYzMiAxMDI1Ni8xMzA2NC8zNjMyIDEwMjU3LzEzMDY3LzM2MzIKK2YgMTAyNjEvMTMwNjkvMzU5MSAxMDU0Mi8xMzMwNi8zNTkxIDEwNTQzLzEzMzA3LzM1OTEKK2YgMTA1NDMvMTMzMDcvMzY2OCAxMDI1OS8xMzA2NS8zNjY4IDEwMjYxLzEzMDY5LzM2NjgKK2YgMTAyNTYvMTMwNjQvMzY2MiAxMDU0NC8xMzMwOC8zNjYyIDEwNTQ2LzEzMzA5LzM2NjIKK2YgMTA1NDYvMTMzMDkvMzU5NCAxMDI2MC8xMzA2OC8zNTk0IDEwMjU2LzEzMDY0LzM1OTQKK2YgMTAyNzMvMTMwODAvMzM0NCAxMDU0Ny8xMzMxMC8zMzQ0IDEwNTQwLzEzMzA1LzMzNDQKK2YgMTA1NDAvMTMzMDUvMzM0NCAxMDI1MC8xMzA1OS8zMzQ0IDEwMjczLzEzMDgwLzMzNDQKK2YgMTAyNDkvMTMwNTYvMzMzNCAxMDUzOS8xMzMwNC8zMzM0IDEwNTQ4LzEzMzExLzMzMzQKK2YgMTA1NDgvMTMzMTEvMzM3NiAxMDI3MC8xMzA3OS8zMzc2IDEwMjQ5LzEzMDU2LzMzNzYKK2YgMTAyNjUvMTMwNzIvMzU5NyAxMDU1MC8xMzMxMi8zNTk3IDEwNTQ5LzEzMDczLzM1OTcKK2YgMTA1NDkvMTMwNzMvMzkwOCAxMDI2NC8xMzA3My8zOTA4IDEwMjY1LzEzMDcyLzM5MDgKK2YgMTAyNjMvMTMwNzAvMzg3NyAxMDU1Mi8xMzMxMy8zODc3IDEwNTUxLzEzMDcxLzM4NzcKK2YgMTA1NTEvMTMwNzEvMzU5OCAxMDI2Mi8xMzA3MS8zNTk4IDEwMjYzLzEzMDcwLzM1OTgKK2YgMTAyNjkvMTMwNzYvMzkwOSAxMDU1NC8xMzMxNC8zOTA5IDEwNTUzLzEzMzE1LzM5MDkKK2YgMTA1NTMvMTMzMTUvMzYwMCAxMDI2OC8xMzA3Ny8zNjAwIDEwMjY5LzEzMDc2LzM2MDAKK2YgMTAyNjcvMTMwNzQvMzg3MSAxMDU1Ni8xMzA3NC8zODcxIDEwNTU1LzEzMzE2LzM4NzEKK2YgMTA1NTUvMTMzMTYvMzYwMSAxMDI2Ni8xMzA3NS8zNjAxIDEwMjY3LzEzMDc0LzM2MDEKK2YgMTAyNzAvMTMwNzkvMzkxMCAxMDU0OC8xMzMxMS8zOTEwIDEwNTUwLzEzMzEyLzM5MTAKK2YgMTA1NTAvMTMzMTIvMzY4MSAxMDI2NS8xMzA3Mi8zNjgxIDEwMjcwLzEzMDc5LzM2ODEKK2YgMTAyNjIvMTMwNzEvMzkxMSAxMDU1MS8xMzA3MS8zOTExIDEwNTU3LzEzMzE3LzM5MTEKK2YgMTA1NTcvMTMzMTcvMzY4MiAxMDI3MS8xMzA3OC8zNjgyIDEwMjYyLzEzMDcxLzM2ODIKK2YgMTAyNjgvMTMwNzcvMzY4NCAxMDU1My8xMzMxNS8zNjg0IDEwNTQ3LzEzMzEwLzM2ODQKK2YgMTA1NDcvMTMzMTAvMzkxMiAxMDI3My8xMzA4MC8zOTEyIDEwMjY4LzEzMDc3LzM5MTIKK2YgMTAyNzIvMTMwODEvMzkxMyAxMDU1OC8xMzMxOC8zOTEzIDEwNTU2LzEzMDc0LzM5MTMKK2YgMTA1NTYvMTMwNzQvMzkxNCAxMDI2Ny8xMzA3NC8zOTE0IDEwMjcyLzEzMDgxLzM5MTQKK2YgMTAyNjQvMTMwNzMvMzQzNCAxMDU0OS8xMzA3My8zNDM0IDEwNTM0LzEzMDQ4LzM0MzQKK2YgMTA1MzQvMTMwNDgvMzQ3OCAxMDI0MS8xMzA0OC8zNDc4IDEwMjY0LzEzMDczLzM0NzgKK2YgMTAyNDQvMTMwNTMvMzM5MCAxMDUzNy8xMzMwMy8zMzkwIDEwNTU0LzEzMzE0LzMzOTAKK2YgMTA1NTQvMTMzMTQvMzYxMCAxMDI2OS8xMzA3Ni8zNjEwIDEwMjQ0LzEzMDUzLzM2MTAKK2YgMTAyODAvMTMwODgvMzIzOCAxMDU1OS8xMzMxOS8zMjM4IDEwNTQ1LzEzMDY3LzMyMzgKK2YgMTA1NDUvMTMwNjcvMzIzOCAxMDI1Ny8xMzA2Ny8zMjM4IDEwMjgwLzEzMDg4LzMyMzgKK2YgMTAyNjAvMTMwNjgvMzQ1OSAxMDU0Ni8xMzMwOS8zNDU5IDEwNTYwLzEzMzIwLzM0NTkKK2YgMTA1NjAvMTMzMjAvMzY4OCAxMDI4My8xMzA5MS8zNjg4IDEwMjYwLzEzMDY4LzM2ODgKK2YgMTAyODEvMTMwODcvMzkxNSAxMDU2MS8xMzA4Ny8zOTE1IDEwNTU5LzEzMzE5LzM5MTUKK2YgMTA1NTkvMTMzMTkvMzkxNiAxMDI4MC8xMzA4OC8zOTE2IDEwMjgxLzEzMDg3LzM5MTYKK2YgMTAyNzkvMTMwODkvMzY5MSAxMDU2My8xMzA4OS8zNjkxIDEwNTYyLzEzMzIxLzM2OTEKK2YgMTA1NjIvMTMzMjEvMzY5MiAxMDI3OC8xMzA4Ni8zNjkyIDEwMjc5LzEzMDg5LzM2OTIKK2YgMTAyODMvMTMwOTEvMzkxNyAxMDU2MC8xMzMyMC8zOTE3IDEwNTYxLzEzMDg3LzM5MTcKK2YgMTA1NjEvMTMwODcvMzkxOCAxMDI4MS8xMzA4Ny8zOTE4IDEwMjgzLzEzMDkxLzM5MTgKK2YgMTAyNzgvMTMwODYvMzY5NSAxMDU2Mi8xMzMyMS8zNjk1IDEwNTY0LzEzMzIyLzM2OTUKK2YgMTA1NjQvMTMzMjIvMzkxOSAxMDI4Mi8xMzA5MC8zOTE5IDEwMjc4LzEzMDg2LzM5MTkKK2YgMTAyOTUvMTMxMDIvMzM0NCAxMDU2NS8xMzMyMy8zMzQ0IDEwNTU4LzEzMzE4LzMzNDQKK2YgMTA1NTgvMTMzMTgvMzM5NSAxMDI3Mi8xMzA4MS8zMzk1IDEwMjk1LzEzMTAyLzMzOTUKK2YgMTAyNzEvMTMwNzgvMzM0NiAxMDU1Ny8xMzMxNy8zMzQ2IDEwNTY2LzEzMzI0LzMzNDYKK2YgMTA1NjYvMTMzMjQvMzM0NSAxMDI5Mi8xMzEwMS8zMzQ1IDEwMjcxLzEzMDc4LzMzNDUKK2YgMTAyODcvMTMwOTQvMzYxOSAxMDU2OC8xMzMyNS8zNjE5IDEwNTY3LzEzMzI2LzM2MTkKK2YgMTA1NjcvMTMzMjYvMzYxOSAxMDI4Ni8xMzA5NS8zNjE5IDEwMjg3LzEzMDk0LzM2MTkKK2YgMTAyODUvMTMwOTIvMzc2NSAxMDU3MC8xMzA5Mi8zNzY1IDEwNTY5LzEzMzI3LzM3NjUKK2YgMTA1NjkvMTMzMjcvMzkyMCAxMDI4NC8xMzA5My8zOTIwIDEwMjg1LzEzMDkyLzM5MjAKK2YgMTAyOTEvMTMwOTgvMzU5OSAxMDU3Mi8xMzMyOC8zNTk5IDEwNTcxLzEzMzI5LzM1OTkKK2YgMTA1NzEvMTMzMjkvMzY1NCAxMDI5MC8xMzA5OS8zNjU0IDEwMjkxLzEzMDk4LzM2NTQKK2YgMTAyODkvMTMwOTYvMzY3OSAxMDU3NC8xMzMzMC8zNjc5IDEwNTczLzEzMzMxLzM2NzkKK2YgMTA1NzMvMTMzMzEvMzkyMSAxMDI4OC8xMzA5Ny8zOTIxIDEwMjg5LzEzMDk2LzM5MjEKK2YgMTAyOTIvMTMxMDEvMzkyMiAxMDU2Ni8xMzMyNC8zOTIyIDEwNTY4LzEzMzI1LzM5MjIKK2YgMTA1NjgvMTMzMjUvMzkyMyAxMDI4Ny8xMzA5NC8zOTIzIDEwMjkyLzEzMTAxLzM5MjMKK2YgMTAyODQvMTMwOTMvMzY3OSAxMDU2OS8xMzMyNy8zNjc5IDEwNTc1LzEzMzMyLzM2NzkKK2YgMTA1NzUvMTMzMzIvMzcwMiAxMDI5My8xMzEwMC8zNzAyIDEwMjg0LzEzMDkzLzM3MDIKK2YgMTAyOTAvMTMwOTkvMzkyNCAxMDU3MS8xMzMyOS8zOTI0IDEwNTY1LzEzMzIzLzM5MjQKK2YgMTA1NjUvMTMzMjMvMzcwNCAxMDI5NS8xMzEwMi8zNzA0IDEwMjkwLzEzMDk5LzM3MDQKK2YgMTAyOTQvMTMxMDMvMzkyNSAxMDU3Ni8xMzMzMy8zOTI1IDEwNTc0LzEzMzMwLzM5MjUKK2YgMTA1NzQvMTMzMzAvMzcwNiAxMDI4OS8xMzA5Ni8zNzA2IDEwMjk0LzEzMTAzLzM3MDYKK2YgMTAyODYvMTMwOTUvMzM2MiAxMDU2Ny8xMzMyNi8zMzYyIDEwNTUyLzEzMzEzLzMzNjIKK2YgMTA1NTIvMTMzMTMvMzQzNCAxMDI2My8xMzA3MC8zNDM0IDEwMjg2LzEzMDk1LzM0MzQKK2YgMTAyNjYvMTMwNzUvMzYxMCAxMDU1NS8xMzMxNi8zNjEwIDEwNTcyLzEzMzI4LzM2MTAKK2YgMTA1NzIvMTMzMjgvMzM5MCAxMDI5MS8xMzA5OC8zMzkwIDEwMjY2LzEzMDc1LzMzOTAKK2YgMTAzMDIvMTMxMTAvMzM2NSAxMDU3Ny8xMzExMC8zMzY1IDEwNTYzLzEzMDg5LzMzNjUKK2YgMTA1NjMvMTMwODkvMzM2NSAxMDI3OS8xMzA4OS8zMzY1IDEwMzAyLzEzMTEwLzMzNjUKK2YgMTAyODIvMTMwOTAvMzQ1OSAxMDU2NC8xMzMyMi8zNDU5IDEwNTc4LzEzMzM0LzM0NTkKK2YgMTA1NzgvMTMzMzQvMzM2NiAxMDMwNS8xMzExMy8zMzY2IDEwMjgyLzEzMDkwLzMzNjYKK2YgMTAzMDMvMTMxMDkvMzcwOCAxMDU3OS8xMzMzNS8zNzA4IDEwNTc3LzEzMTEwLzM3MDgKK2YgMTA1NzcvMTMxMTAvMzcwOSAxMDMwMi8xMzExMC8zNzA5IDEwMzAzLzEzMTA5LzM3MDkKK2YgMTAzMDEvMTMxMTEvMzgyMiAxMDU4MS8xMzExMS8zODIyIDEwNTgwLzEzMzM2LzM4MjIKK2YgMTA1ODAvMTMzMzYvMzgwOCAxMDMwMC8xMzEwOC8zODA4IDEwMzAxLzEzMTExLzM4MDgKK2YgMTAzMDUvMTMxMTMvMzkyNiAxMDU3OC8xMzMzNC8zOTI2IDEwNTc5LzEzMzM1LzM5MjYKK2YgMTA1NzkvMTMzMzUvMzY0MCAxMDMwMy8xMzEwOS8zNjQwIDEwMzA1LzEzMTEzLzM2NDAKK2YgMTAzMDAvMTMxMDgvMzgxNyAxMDU4MC8xMzMzNi8zODE3IDEwNTgyLzEzMzM3LzM4MTcKK2YgMTA1ODIvMTMzMzcvMzcxMiAxMDMwNC8xMzExMi8zNzEyIDEwMzAwLzEzMTA4LzM3MTIKK2YgMTAzMTcvMTMxMjQvMzQ1OCAxMDU4My8xMzMzOC8zNDU4IDEwNTc2LzEzMzMzLzM0NTgKK2YgMTA1NzYvMTMzMzMvMzM3NSAxMDI5NC8xMzEwMy8zMzc1IDEwMzE3LzEzMTI0LzMzNzUKK2YgMTAyOTMvMTMxMDAvMzM0NiAxMDU3NS8xMzMzMi8zMzQ2IDEwNTg0LzEzMzM5LzMzNDYKK2YgMTA1ODQvMTMzMzkvMzM0NSAxMDMxNC8xMzEyMy8zMzQ1IDEwMjkzLzEzMTAwLzMzNDUKK2YgMTAzMDkvMTMxMTYvMzcxMyAxMDU4Ni8xMzM0MC8zNzEzIDEwNTg1LzEzMTE3LzM3MTMKK2YgMTA1ODUvMTMxMTcvMzcxMyAxMDMwOC8xMzExNy8zNzEzIDEwMzA5LzEzMTE2LzM3MTMKK2YgMTAzMDcvMTMxMTQvMzkyNyAxMDU4OC8xMzM0MS8zOTI3IDEwNTg3LzEzMzQyLzM5MjcKK2YgMTA1ODcvMTMzNDIvMzcxNSAxMDMwNi8xMzExNS8zNzE1IDEwMzA3LzEzMTE0LzM3MTUKK2YgMTAzMTMvMTMxMjAvMzkyOCAxMDU5MC8xMzM0My8zOTI4IDEwNTg5LzEzMzQ0LzM5MjgKK2YgMTA1ODkvMTMzNDQvMzkyOSAxMDMxMi8xMzEyMS8zOTI5IDEwMzEzLzEzMTIwLzM5MjkKK2YgMTAzMTEvMTMxMTgvMzMyMyAxMDU5Mi8xMzM0NS8zMzIzIDEwNTkxLzEzMzQ2LzMzMjMKK2YgMTA1OTEvMTMzNDYvMzkzMCAxMDMxMC8xMzExOS8zOTMwIDEwMzExLzEzMTE4LzM5MzAKK2YgMTAzMTQvMTMxMjMvMzkzMSAxMDU4NC8xMzMzOS8zOTMxIDEwNTg2LzEzMzQwLzM5MzEKK2YgMTA1ODYvMTMzNDAvMzkzMSAxMDMwOS8xMzExNi8zOTMxIDEwMzE0LzEzMTIzLzM5MzEKK2YgMTAzMDYvMTMxMTUvMzcyMiAxMDU4Ny8xMzM0Mi8zNzIyIDEwNTkzLzEzMzQ3LzM3MjIKK2YgMTA1OTMvMTMzNDcvMzkzMiAxMDMxNS8xMzEyMi8zOTMyIDEwMzA2LzEzMTE1LzM5MzIKK2YgMTAzMTIvMTMxMjEvMzkzMyAxMDU4OS8xMzM0NC8zOTMzIDEwNTgzLzEzMzM4LzM5MzMKK2YgMTA1ODMvMTMzMzgvMzkzNCAxMDMxNy8xMzEyNC8zOTM0IDEwMzEyLzEzMTIxLzM5MzQKK2YgMTAzMTYvMTMxMjUvMzkzNSAxMDU5NC8xMzM0OC8zOTM1IDEwNTkyLzEzMzQ1LzM5MzUKK2YgMTA1OTIvMTMzNDUvMzcyNiAxMDMxMS8xMzExOC8zNzI2IDEwMzE2LzEzMTI1LzM3MjYKK2YgMTAzMDgvMTMxMTcvMzM2MiAxMDU4NS8xMzExNy8zMzYyIDEwNTcwLzEzMDkyLzMzNjIKK2YgMTA1NzAvMTMwOTIvMzQ3OCAxMDI4NS8xMzA5Mi8zNDc4IDEwMzA4LzEzMTE3LzM0NzgKK2YgMTAyODgvMTMwOTcvMzQ0MSAxMDU3My8xMzMzMS8zNDQxIDEwNTkwLzEzMzQzLzM0NDEKK2YgMTA1OTAvMTMzNDMvMzM5MCAxMDMxMy8xMzEyMC8zMzkwIDEwMjg4LzEzMDk3LzMzOTAKK2YgMTAzMjQvMTMxMzIvMzM2NSAxMDU5NS8xMzEzMi8zMzY1IDEwNTgxLzEzMTExLzMzNjUKK2YgMTA1ODEvMTMxMTEvMzMzMyAxMDMwMS8xMzExMS8zMzMzIDEwMzI0LzEzMTMyLzMzMzMKK2YgMTAzMDQvMTMxMTIvMzUyMiAxMDU4Mi8xMzMzNy8zNTIyIDEwNTk2LzEzMzQ5LzM1MjIKK2YgMTA1OTYvMTMzNDkvMzQ1OSAxMDMyNy8xMzEzNS8zNDU5IDEwMzA0LzEzMTEyLzM0NTkKK2YgMTAzMjUvMTMxMzEvMzkzNiAxMDU5Ny8xMzEzMS8zOTM2IDEwNTk1LzEzMTMyLzM5MzYKK2YgMTA1OTUvMTMxMzIvMzcyOCAxMDMyNC8xMzEzMi8zNzI4IDEwMzI1LzEzMTMxLzM3MjgKK2YgMTAzMjMvMTMxMzMvMzkzNyAxMDU5OS8xMzM1MC8zOTM3IDEwNTk4LzEzMTMwLzM5MzcKK2YgMTA1OTgvMTMxMzAvMzczMCAxMDMyMi8xMzEzMC8zNzMwIDEwMzIzLzEzMTMzLzM3MzAKK2YgMTAzMjcvMTMxMzUvMzczMSAxMDU5Ni8xMzM0OS8zNzMxIDEwNTk3LzEzMTMxLzM3MzEKK2YgMTA1OTcvMTMxMzEvMzkzOCAxMDMyNS8xMzEzMS8zOTM4IDEwMzI3LzEzMTM1LzM5MzgKK2YgMTAzMjIvMTMxMzAvMzkzOSAxMDU5OC8xMzEzMC8zOTM5IDEwNjAwLzEzMzUxLzM5MzkKK2YgMTA2MDAvMTMzNTEvMzk0MCAxMDMyNi8xMzEzNC8zOTQwIDEwMzIyLzEzMTMwLzM5NDAKK2YgMTAzMzkvMTMxNDYvMzQ1OCAxMDYwMS8xMzM1Mi8zNDU4IDEwNTk0LzEzMzQ4LzM0NTgKK2YgMTA1OTQvMTMzNDgvMzM5NSAxMDMxNi8xMzEyNS8zMzk1IDEwMzM5LzEzMTQ2LzMzOTUKK2YgMTAzMTUvMTMxMjIvMzM0NSAxMDU5My8xMzM0Ny8zMzQ1IDEwNjAyLzEzMzUzLzMzNDUKK2YgMTA2MDIvMTMzNTMvMzMzNSAxMDMzNi8xMzE0NS8zMzM1IDEwMzE1LzEzMTIyLzMzMzUKK2YgMTAzMzEvMTMxMzgvMzk0MSAxMDYwNC8xMzM1NC8zOTQxIDEwNjAzLzEzMzU1LzM5NDEKK2YgMTA2MDMvMTMzNTUvMzk0MiAxMDMzMC8xMzEzOS8zOTQyIDEwMzMxLzEzMTM4LzM5NDIKK2YgMTAzMjkvMTMxMzYvMzc1MCAxMDYwNi8xMzM1Ni8zNzUwIDEwNjA1LzEzMzU3LzM3NTAKK2YgMTA2MDUvMTMzNTcvMzc0NSAxMDMyOC8xMzEzNy8zNzQ1IDEwMzI5LzEzMTM2LzM3NDUKK2YgMTAzMzUvMTMxNDIvMzk0MyAxMDYwOC8xMzM1OC8zOTQzIDEwNjA3LzEzMzU5LzM5NDMKK2YgMTA2MDcvMTMzNTkvMzczOCAxMDMzNC8xMzE0My8zNzM4IDEwMzM1LzEzMTQyLzM3MzgKK2YgMTAzMzMvMTMxNDAvMzU0MSAxMDYxMC8xMzM2MC8zNTQxIDEwNjA5LzEzMzYxLzM1NDEKK2YgMTA2MDkvMTMzNjEvMzU2NSAxMDMzMi8xMzE0MS8zNTY1IDEwMzMzLzEzMTQwLzM1NjUKK2YgMTAzMzYvMTMxNDUvMzk0NCAxMDYwMi8xMzM1My8zOTQ0IDEwNjA0LzEzMzU0LzM5NDQKK2YgMTA2MDQvMTMzNTQvMzk0NSAxMDMzMS8xMzEzOC8zOTQ1IDEwMzM2LzEzMTQ1LzM5NDUKK2YgMTAzMjgvMTMxMzcvMzU0MyAxMDYwNS8xMzM1Ny8zNTQzIDEwNjExLzEzMzYyLzM1NDMKK2YgMTA2MTEvMTMzNjIvMzU0MSAxMDMzNy8xMzE0NC8zNTQxIDEwMzI4LzEzMTM3LzM1NDEKK2YgMTAzMzQvMTMxNDMvMzk0NiAxMDYwNy8xMzM1OS8zOTQ2IDEwNjAxLzEzMzUyLzM5NDYKK2YgMTA2MDEvMTMzNTIvMzk0NyAxMDMzOS8xMzE0Ni8zOTQ3IDEwMzM0LzEzMTQzLzM5NDcKK2YgMTAzMzgvMTMxNDcvMzk0OCAxMDYxMi8xMzM2My8zOTQ4IDEwNjEwLzEzMzYwLzM5NDgKK2YgMTA2MTAvMTMzNjAvMzc0NSAxMDMzMy8xMzE0MC8zNzQ1IDEwMzM4LzEzMTQ3LzM3NDUKK2YgMTAzMzAvMTMxMzkvMzM2MiAxMDYwMy8xMzM1NS8zMzYyIDEwNTg4LzEzMzQxLzMzNjIKK2YgMTA1ODgvMTMzNDEvMzQ3OCAxMDMwNy8xMzExNC8zNDc4IDEwMzMwLzEzMTM5LzM0NzgKK2YgMTAzMTAvMTMxMTkvMzQ0MSAxMDU5MS8xMzM0Ni8zNDQxIDEwNjA4LzEzMzU4LzM0NDEKK2YgMTA2MDgvMTMzNTgvMzM5MCAxMDMzNS8xMzE0Mi8zMzkwIDEwMzEwLzEzMTE5LzMzOTAKK2YgMTAzNDYvMTMxNTQvMzM2NSAxMDYxMy8xMzE1NC8zMzY1IDEwNTk5LzEzMzUwLzMzNjUKK2YgMTA1OTkvMTMzNTAvMzM4OCAxMDMyMy8xMzEzMy8zMzg4IDEwMzQ2LzEzMTU0LzMzODgKK2YgMTAzMjYvMTMxMzQvMzQ1OSAxMDYwMC8xMzM1MS8zNDU5IDEwNjE0LzEzMzY0LzM0NTkKK2YgMTA2MTQvMTMzNjQvMzM2NiAxMDM0OS8xMzE1Ny8zMzY2IDEwMzI2LzEzMTM0LzMzNjYKK2YgMTAzNDcvMTMxNTMvMzk0OSAxMDYxNS8xMzM2NS8zOTQ5IDEwNjEzLzEzMTU0LzM5NDkKK2YgMTA2MTMvMTMxNTQvMzk1MCAxMDM0Ni8xMzE1NC8zOTUwIDEwMzQ3LzEzMTUzLzM5NTAKK2YgMTAzNDUvMTMxNTUvMzUzOCAxMDYxNy8xMzM2Ni8zNTM4IDEwNjE2LzEzMzY3LzM1MzgKK2YgMTA2MTYvMTMzNjcvMzUzNCAxMDM0NC8xMzE1Mi8zNTM0IDEwMzQ1LzEzMTU1LzM1MzQKK2YgMTAzNDkvMTMxNTcvMzc1MSAxMDYxNC8xMzM2NC8zNzUxIDEwNjE1LzEzMzY1LzM3NTEKK2YgMTA2MTUvMTMzNjUvMzc1MiAxMDM0Ny8xMzE1My8zNzUyIDEwMzQ5LzEzMTU3LzM3NTIKK2YgMTAzNDQvMTMxNTIvMzc1NSAxMDYxNi8xMzM2Ny8zNzU1IDEwNjE4LzEzMzY4LzM3NTUKK2YgMTA2MTgvMTMzNjgvMzU2NSAxMDM0OC8xMzE1Ni8zNTY1IDEwMzQ0LzEzMTUyLzM1NjUKK2YgMTAzNjcvMTMxNzQvMzM0NCAxMDYxOS8xMzM2OS8zMzQ0IDEwNjEyLzEzMzYzLzMzNDQKK2YgMTA2MTIvMTMzNjMvMzM0MyAxMDMzOC8xMzE0Ny8zMzQzIDEwMzY3LzEzMTc0LzMzNDMKK2YgMTAzNjUvMTMxNzIvMzM0NSAxMDYyMS8xMzM3MC8zMzQ1IDEwNjIwLzEzMzcxLzMzNDUKK2YgMTA2MjAvMTMzNzEvMzMzNSAxMDQxMy8xMzIxMy8zMzM1IDEwMzY1LzEzMTcyLzMzMzUKK2YgMTAzNTMvMTMxNjAvMzUzMyAxMDYyMy8xMzE2MC8zNTMzIDEwNjIyLzEzMzcyLzM1MzMKK2YgMTA2MjIvMTMzNzIvMzk1MSAxMDM1Mi8xMzE2MS8zOTUxIDEwMzUzLzEzMTYwLzM5NTEKK2YgMTAzNTEvMTMxNTgvMzUyNSAxMDYyNS8xMzE1OC8zNTI1IDEwNjI0LzEzMzczLzM1MjUKK2YgMTA2MjQvMTMzNzMvMzUwOSAxMDM1MC8xMzE1OS8zNTA5IDEwMzUxLzEzMTU4LzM1MDkKK2YgMTAzNTIvMTMxNjEvMzc3MSAxMDYyMi8xMzM3Mi8zNzcxIDEwNjI2LzEzMzc0LzM3NzEKK2YgMTA2MjYvMTMzNzQvMzg2MSAxMDM1NS8xMzE2Mi8zODYxIDEwMzUyLzEzMTYxLzM4NjEKK2YgMTAzNTQvMTMxNjMvMzUxMiAxMDYyNy8xMzM3NS8zNTEyIDEwNjI1LzEzMTU4LzM1MTIKK2YgMTA2MjUvMTMxNTgvMzc1OSAxMDM1MS8xMzE1OC8zNzU5IDEwMzU0LzEzMTYzLzM3NTkKK2YgMTA0MDUvMTMyMDYvMzM0NCAxMDYyOS8xMzM3Ni8zMzQ0IDEwNjI4LzEzMzc3LzMzNDQKK2YgMTA2MjgvMTMzNzcvMzM5NSAxMDM2Ni8xMzE3NS8zMzk1IDEwNDA1LzEzMjA2LzMzOTUKK2YgMTAzMzcvMTMxNDQvMzM0NSAxMDYxMS8xMzM2Mi8zMzQ1IDEwNjMwLzEzMzc4LzMzNDUKK2YgMTA2MzAvMTMzNzgvMzM0NSAxMDM2NC8xMzE3My8zMzQ1IDEwMzM3LzEzMTQ0LzMzNDUKK2YgMTAzNTkvMTMxNjYvMzc3MyAxMDYzMi8xMzE2Ni8zNzczIDEwNjMxLzEzMzc5LzM3NzMKK2YgMTA2MzEvMTMzNzkvMzUyNiAxMDM1OC8xMzE2Ny8zNTI2IDEwMzU5LzEzMTY2LzM1MjYKK2YgMTAzNTcvMTMxNjQvMzU0NyAxMDYzNC8xMzE2NC8zNTQ3IDEwNjMzLzEzMzgwLzM1NDcKK2YgMTA2MzMvMTMzODAvMzU0NyAxMDM1Ni8xMzE2NS8zNTQ3IDEwMzU3LzEzMTY0LzM1NDcKK2YgMTAzNjMvMTMxNzAvMzUxMiAxMDYzNi8xMzM4MS8zNTEyIDEwNjM1LzEzMTcxLzM1MTIKK2YgMTA2MzUvMTMxNzEvMzUxMyAxMDM2Mi8xMzE3MS8zNTEzIDEwMzYzLzEzMTcwLzM1MTMKK2YgMTAzNjEvMTMxNjgvMzc1NiAxMDYzOC8xMzM4Mi8zNzU2IDEwNjM3LzEzMzgzLzM3NTYKK2YgMTA2MzcvMTMzODMvMzk1MiAxMDM2MC8xMzE2OS8zOTUyIDEwMzYxLzEzMTY4LzM5NTIKK2YgMTAzNjQvMTMxNzMvMzUxMyAxMDYzMC8xMzM3OC8zNTEzIDEwNjMyLzEzMTY2LzM1MTMKK2YgMTA2MzIvMTMxNjYvMzUxMyAxMDM1OS8xMzE2Ni8zNTEzIDEwMzY0LzEzMTczLzM1MTMKK2YgMTAzNTYvMTMxNjUvMzU2NSAxMDYzMy8xMzM4MC8zNTY1IDEwNjIxLzEzMzcwLzM1NjUKK2YgMTA2MjEvMTMzNzAvMzU0OSAxMDM2NS8xMzE3Mi8zNTQ5IDEwMzU2LzEzMTY1LzM1NDkKK2YgMTAzNjIvMTMxNzEvMzUyNiAxMDYzNS8xMzE3MS8zNTI2IDEwNjE5LzEzMzY5LzM1MjYKK2YgMTA2MTkvMTMzNjkvMzUyNiAxMDM2Ny8xMzE3NC8zNTI2IDEwMzYyLzEzMTcxLzM1MjYKK2YgMTAzNjYvMTMxNzUvMzUzOCAxMDYyOC8xMzM3Ny8zNTM4IDEwNjM4LzEzMzgyLzM1MzgKK2YgMTA2MzgvMTMzODIvMzU2OCAxMDM2MS8xMzE2OC8zNTY4IDEwMzY2LzEzMTc1LzM1NjgKK2YgMTAzNTgvMTMxNjcvMzM2MiAxMDYzMS8xMzM3OS8zMzYyIDEwNjA2LzEzMzU2LzMzNjIKK2YgMTA2MDYvMTMzNTYvMzQzNCAxMDMyOS8xMzEzNi8zNDM0IDEwMzU4LzEzMTY3LzM0MzQKK2YgMTAzNjkvMTMxNzcvMzMzMyAxMDYzOS8xMzE3Ny8zMzMzIDEwNjM0LzEzMTY0LzMzMzMKK2YgMTA2MzQvMTMxNjQvMzQ3OCAxMDM1Ny8xMzE2NC8zNDc4IDEwMzY5LzEzMTc3LzM0NzgKK2YgMTAzNjAvMTMxNjkvMzM5MCAxMDYzNy8xMzM4My8zMzkwIDEwNjQwLzEzMzg0LzMzOTAKK2YgMTA2NDAvMTMzODQvMzM2NCAxMDM3NC8xMzE4MC8zMzY0IDEwMzYwLzEzMTY5LzMzNjQKK2YgMTAzMzIvMTMxNDEvMzQ0MSAxMDYwOS8xMzM2MS8zNDQxIDEwNjM2LzEzMzgxLzM0NDEKK2YgMTA2MzYvMTMzODEvMzM5MCAxMDM2My8xMzE3MC8zMzkwIDEwMzMyLzEzMTQxLzMzOTAKK2YgMTAzNTAvMTMxNTkvMzIzOCAxMDYyNC8xMzM3My8zMjM4IDEwNjE3LzEzMzY2LzMyMzgKK2YgMTA2MTcvMTMzNjYvMzM2NSAxMDM0NS8xMzE1NS8zMzY1IDEwMzUwLzEzMTU5LzMzNjUKK2YgMTAzNDgvMTMxNTYvMzQyNSAxMDYxOC8xMzM2OC8zNDI1IDEwNjI3LzEzMzc1LzM0MjUKK2YgMTA2MjcvMTMzNzUvMzQ1OSAxMDM1NC8xMzE2My8zNDU5IDEwMzQ4LzEzMTU2LzM0NTkKK2YgMTAzNzQvMTMxODAvMzkyOSAxMDY0MC8xMzM4NC8zOTI5IDEwNjQxLzEzMzg1LzM5MjkKK2YgMTA2NDEvMTMzODUvMzc1OSAxMDQwNi8xMzIwNS8zNzU5IDEwMzc0LzEzMTgwLzM3NTkKK2YgMTAzOTAvMTMxOTkvMzUzOSAxMDY0Mi8xMzM4Ni8zNTM5IDEwNjM5LzEzMTc3LzM1MzkKK2YgMTA2MzkvMTMxNzcvMzUxOCAxMDM2OS8xMzE3Ny8zNTE4IDEwMzkwLzEzMTk5LzM1MTgKK2YgMTA0MDYvMTMyMDUvMzk1MyAxMDY0MS8xMzM4NS8zOTUzIDEwNjI5LzEzMzc2LzM5NTMKK2YgMTA2MjkvMTMzNzYvMzUwOSAxMDQwNS8xMzIwNi8zNTA5IDEwNDA2LzEzMjA1LzM1MDkKK2YgMTA0MTMvMTMyMTMvMzUzMCAxMDYyMC8xMzM3MS8zNTMwIDEwNjQyLzEzMzg2LzM1MzAKK2YgMTA2NDIvMTMzODYvMzUyOSAxMDM5MC8xMzE5OS8zNTI5IDEwNDEzLzEzMjEzLzM1MjkKK2YgMTA0MDEvMTMyMDMvMzIzOCAxMDY0My8xMzIwMy8zMjM4IDEwNjIzLzEzMTYwLzMyMzgKK2YgMTA2MjMvMTMxNjAvMzMzMyAxMDM1My8xMzE2MC8zMzMzIDEwNDAxLzEzMjAzLzMzMzMKK2YgMTA0MDIvMTMyMDIvMzUzMSAxMDY0NC8xMzM4Ny8zNTMxIDEwNjQzLzEzMjAzLzM1MzEKK2YgMTA2NDMvMTMyMDMvMzUyNiAxMDQwMS8xMzIwMy8zNTI2IDEwNDAyLzEzMjAyLzM1MjYKK2YgMTA0MDcvMTMyMDgvMzUxMiAxMDY0NS8xMzM4OC8zNTEyIDEwNjQ0LzEzMzg3LzM1MTIKK2YgMTA2NDQvMTMzODcvMzUyOSAxMDQwMi8xMzIwMi8zNTI5IDEwNDA3LzEzMjA4LzM1MjkKK2YgMTAzNTUvMTMxNjIvMzQyNSAxMDYyNi8xMzM3NC8zNDI1IDEwNjQ1LzEzMzg4LzM0MjUKK2YgMTA2NDUvMTMzODgvMzQ1OSAxMDQwNy8xMzIwOC8zNDU5IDEwMzU1LzEzMTYyLzM0NTkKK2YgMTA0MTgvMTI5MTUvMzk1NCAxMDQzMS8xMjkxNS8zOTU0IDEwNjQ3LzEzMzg5LzM5NTQKK2YgMTA2NDcvMTMzODkvMzc2MiAxMDY0Ni8xMjkxMS8zNzYyIDEwNDE4LzEyOTE1LzM3NjIKK2YgMTA2NDYvMTI5MTEvMzc2NCAxMDY0Ny8xMzM4OS8zNzY0IDEwNDM0LzEzMjI2LzM3NjQKK2YgMTA0MzQvMTMyMjYvMzc2NCAxMDQxNy8xMjkxMi8zNzY0IDEwNjQ2LzEyOTExLzM3NjQKK2YgMTAxMTkvMTI5MjYvMzM5NSAxMDQyOS8xMzIyNC8zMzk1IDEwNjQ4LzEzMzkwLzMzOTUKK2YgMTA2NDgvMTMzOTAvMzM0NCAxMDM5NS8xMjcwMC8zMzQ0IDEwMTE5LzEyOTI2LzMzNDQKK2YgMTAzOTYvMTI3MDUvMzcwNiAxMDY1MC8xMjcwNS8zNzA2IDEwNjQ5LzEzMzkxLzM3MDYKK2YgMTA2NDkvMTMzOTEvMzc2NSAxMDM5My8xMjY5Ni8zNzY1IDEwMzk2LzEyNzA1LzM3NjUKK2YgMTAzOTQvMTI3MDEvMzcwMCAxMDY1Mi8xMzM5Mi8zNzAwIDEwNjUxLzEzMzkzLzM3MDAKK2YgMTA2NTEvMTMzOTMvMzk1NSAxMDM5OS8xMjkxMy8zOTU1IDEwMzk0LzEyNzAxLzM5NTUKK2YgMTAzOTMvMTI2OTYvMzc2NiAxMDY0OS8xMzM5MS8zNzY2IDEwNjUzLzEzMzk0LzM3NjYKK2YgMTA2NTMvMTMzOTQvMzk1NiAxMDM5Mi8xMjY5Ny8zOTU2IDEwMzkzLzEyNjk2LzM5NTYKK2YgMTAzOTUvMTI3MDAvMzc2OCAxMDY0OC8xMzM5MC8zNzY4IDEwNjUyLzEzMzkyLzM3NjgKK2YgMTA2NTIvMTMzOTIvMzk1NyAxMDM5NC8xMjcwMS8zOTU3IDEwMzk1LzEyNzAwLzM5NTcKK2YgMTAzOTIvMTI2OTcvMzM0NiAxMDY1My8xMzM5NC8zMzQ2IDEwNDI3LzEzMjIyLzMzNDYKK2YgMTA0MjcvMTMyMjIvMzMzNSAxMDExNi8xMjkyNS8zMzM1IDEwMzkyLzEyNjk3LzMzMzUKK2YgMTAxMTAvMTI5MTkvMzUyMSAxMDQxOS8xMjkxOS8zNTIxIDEwNjUwLzEyNzA1LzM1MjEKK2YgMTA2NTAvMTI3MDUvMzQzNCAxMDM5Ni8xMjcwNS8zNDM0IDEwMTEwLzEyOTE5LzM0MzQKK2YgMTAzOTkvMTI5MTMvMzQxNCAxMDY1MS8xMzM5My8zNDE0IDEwNDI0LzEzMjE5LzM0MTQKK2YgMTA0MjQvMTMyMTkvMzYxMCAxMDExNS8xMjkyMi8zNjEwIDEwMzk5LzEyOTEzLzM2MTAKK2YgMTA0MTQvMTMyMTQvMzg2OSAxMDY1NS8xMzM5NS8zODY5IDEwNjU0LzEzMzk2LzM4NjkKK2YgMTA2NTQvMTMzOTYvMzk1OCAxMDM5MS8xMzE5OC8zOTU4IDEwNDE0LzEzMjE0LzM5NTgKK2YgMTA0MTUvMTMyMTUvMzUzOSAxMDY1Ni8xMzM5Ny8zNTM5IDEwNjU1LzEzMzk1LzM1MzkKK2YgMTA2NTUvMTMzOTUvMzcxMyAxMDQxNC8xMzIxNC8zNzEzIDEwNDE1LzEzMjE1LzM3MTMKK2YgMTA0MTAvMTMyMDkvMzUyOSAxMDY1Ny8xMzIwOS8zNTI5IDEwNjU2LzEzMzk3LzM1MjkKK2YgMTA2NTYvMTMzOTcvMzc3NSAxMDQxNS8xMzIxNS8zNzc1IDEwNDEwLzEzMjA5LzM3NzUKK2YgMTA0MDMvMTMyMDEvMzE1MCAxMDY1OC8xMzM5OC8zMTUwIDEwNjU3LzEzMjA5LzMxNTAKK2YgMTA2NTcvMTMyMDkvMzE1MCAxMDQxMC8xMzIwOS8zMTUwIDEwNDAzLzEzMjAxLzMxNTAKK2YgMTA0MDAvMTMyMDAvMzU0OSAxMDY1OS8xMzIwMC8zNTQ5IDEwNjU4LzEzMzk4LzM1NDkKK2YgMTA2NTgvMTMzOTgvMzU0MyAxMDQwMy8xMzIwMS8zNTQzIDEwNDAwLzEzMjAwLzM1NDMKK2YgMTAzOTEvMTMxOTgvMzU2OCAxMDY1NC8xMzM5Ni8zNTY4IDEwNjU5LzEzMjAwLzM1NjgKK2YgMTA2NTkvMTMyMDAvMzU2NyAxMDQwMC8xMzIwMC8zNTY3IDEwMzkxLzEzMTk4LzM1NjcKK2YgMTA0MDkvMTMyMTAvMzMzMyAxMDY2MS8xMzM5OS8zMzMzIDEwNjYwLzEzNDAwLzMzMzMKK2YgMTA2NjAvMTM0MDAvMzM2MiAxMDQwOC8xMzIwNy8zMzYyIDEwNDA5LzEzMjEwLzMzNjIKK2YgMTA0MTYvMTMyMTYvMzU0NSAxMDY2Mi8xMzQwMS8zNTQ1IDEwNjYxLzEzMzk5LzM1NDUKK2YgMTA2NjEvMTMzOTkvMzU0NSAxMDQwOS8xMzIxMC8zNTQ1IDEwNDE2LzEzMjE2LzM1NDUKK2YgMTAzNzcvMTMxODUvMzc3NCAxMDY2My8xMzQwMi8zNzc0IDEwNjYyLzEzNDAxLzM3NzQKK2YgMTA2NjIvMTM0MDEvMzc3NSAxMDQxNi8xMzIxNi8zNzc1IDEwMzc3LzEzMTg1LzM3NzUKK2YgMTAzNzgvMTMxODQvMzMzNSAxMDY2NC8xMzQwMy8zMzM1IDEwNjYzLzEzNDAyLzMzMzUKK2YgMTA2NjMvMTM0MDIvMzY4OCAxMDM3Ny8xMzE4NS8zNjg4IDEwMzc4LzEzMTg0LzM2ODgKK2YgMTA0MDQvMTMyMDQvMzc3MSAxMDY2NS8xMzIwNC8zNzcxIDEwNjY0LzEzNDAzLzM3NzEKK2YgMTA2NjQvMTM0MDMvMzU2NSAxMDM3OC8xMzE4NC8zNTY1IDEwNDA0LzEzMjA0LzM1NjUKK2YgMTA0MDgvMTMyMDcvMzUzMyAxMDY2MC8xMzQwMC8zNTMzIDEwNjY1LzEzMjA0LzM1MzMKK2YgMTA2NjUvMTMyMDQvMzU0NyAxMDQwNC8xMzIwNC8zNTQ3IDEwNDA4LzEzMjA3LzM1NDcKK2YgOTU2Ny8xMjcyNi82OTcgMTA0MTgvMTI5MTUvNjk3IDEwNjQ2LzEyOTExLzY5NworZiAxMDY0Ni8xMjkxMS82OTcgOTgzMy8xMjg5NS82OTcgOTU2Ny8xMjcyNi82OTcKK2YgOTgzNy8xMjY5OC82OTcgMTAzOTQvMTI3MDEvNjk3IDEwMzk5LzEyOTEzLzY5NworZiAxMDM5OS8xMjkxMy82OTcgOTgzOC8xMjcwNy82OTcgOTgzNy8xMjY5OC82OTcKK2YgOTU2OC8xMjcyNS82OTcgMTA0MTcvMTI5MTIvNjk3IDEwMzk1LzEyNzAwLzY5NworZiAxMDM5NS8xMjcwMC82OTcgOTgzNC8xMjY5OS82OTcgOTU2OC8xMjcyNS82OTcKK2YgOTA0NS8xMTk5NC82OTcgOTA1My8xMjAwNS82OTcgOTA1NC8xMjAwNC82OTcKK2YgOTA1NC8xMjAwNC82OTcgOTA0NC8xMTk5NS82OTcgOTA0NS8xMTk5NC82OTcKK2YgOTA1Ni8xMjAwNi82OTcgOTA0Ni8xMTk5Ny82OTcgOTA0Ny8xMTk5Ni82OTcKK2YgOTA0Ny8xMTk5Ni82OTcgOTA1Ny8xMjAwNy82OTcgOTA1Ni8xMjAwNi82OTcKK2YgODQ5MS8xMTUwOC82OTcgODUwMS8xMTUxOS82OTcgODQ5Ny8xMTUxOC82OTcKK2YgODQ5Ny8xMTUxOC82OTcgODQ4MC8xMTUwOS82OTcgODQ5MS8xMTUwOC82OTcKK2YgODQ5Ni8xMTUxNi82OTcgODUwMC8xMTUxNS82OTcgODQ5MC8xMTUwNi82OTcKK2YgODQ5MC8xMTUwNi82OTcgODQ4MS8xMTUwNy82OTcgODQ5Ni8xMTUxNi82OTcKK2YgODcxNS8xMTc1NC82OTcgODcxNi8xMTc2MC82OTcgODczNy8xMTc1Ni82OTcKK2YgODczNy8xMTc1Ni82OTcgODczMi8xMTc1OS82OTcgODcxNS8xMTc1NC82OTcKK2YgOTI4Ni8xMjIyOC82OTcgOTI4Ny8xMjIyNy82OTcgOTI5Mi8xMjIzMy82OTcKK2YgMTA0MDIvMTMyMDIvNjk3IDEwNDAzLzEzMjAxLzY5NyAxMDQwOC8xMzIwNy82OTcKK2YgMTAxNzIvMTI5ODAvNjk3IDEwMTYyLzEyOTcxLzY5NyAxMDE2My8xMjk3MC82OTcKK2YgMTAxNjMvMTI5NzAvNjk3IDEwMTczLzEyOTgxLzY5NyAxMDE3Mi8xMjk4MC82OTcKK2YgMTAxNjEvMTI5NjgvNjk3IDEwMTY5LzEyOTc5LzY5NyAxMDE3MC8xMjk3OC82OTcKK2YgMTAxNzAvMTI5NzgvNjk3IDEwMTYwLzEyOTY5LzY5NyAxMDE2MS8xMjk2OC82OTcKK2YgOTYwNy8xMjQ2NC82OTcgOTYxNy8xMjQ3NS82OTcgOTYxMy8xMjQ3NC82OTcKK2YgOTYxMy8xMjQ3NC82OTcgOTU5Ni8xMjQ2NS82OTcgOTYwNy8xMjQ2NC82OTcKK2YgOTYxMi8xMjQ3Mi82OTcgOTYxNi8xMjQ3MS82OTcgOTYwNi8xMjQ2Mi82OTcKK2YgOTYwNi8xMjQ2Mi82OTcgOTU5Ny8xMjQ2My82OTcgOTYxMi8xMjQ3Mi82OTcKK2YgOTgzMS8xMjcxMC82OTcgOTgzMi8xMjcxNi82OTcgOTg1My8xMjcxMi82OTcKK2YgOTg1My8xMjcxMi82OTcgOTg0OC8xMjcxNS82OTcgOTgzMS8xMjcxMC82OTcKK2YgODQzMS8xMzQwNC82OTcgODQyMC8xMzQwNS82OTcgODQyMS8xMzQwNi82OTcKK2YgODQyMS8xMzQwNi82OTcgODQyMi8xMzQwNy82OTcgODQzMS8xMzQwNC82OTcKK2YgODQwNy8xMTMwOC82OTcgODQwOC8xMTMwNy82OTcgODQyMC8xMzQwNS82OTcKK2YgODQyMC8xMzQwNS82OTcgODQxOS8xMzQwOC82OTcgODQwNy8xMTMwOC82OTcKK2YgODQwOC8xMTMwNy82OTcgODQwOS8xMTMwOS82OTcgODQyMS8xMzQwNi82OTcKK2YgODQyMS8xMzQwNi82OTcgODQyMC8xMzQwNS82OTcgODQwOC8xMTMwNy82OTcKK2YgODQwOS8xMTMwOS82OTcgODQxMC8xMTMxMC82OTcgODQyMi8xMzQwNy82OTcKK2YgODQyMi8xMzQwNy82OTcgODQyMS8xMzQwNi82OTcgODQwOS8xMTMwOS82OTcKK2YgODQxMC8xMTMxMC82OTcgODQxMS8xMTMxMS82OTcgODQyMy8xMzQwOS82OTcKK2YgODQyMy8xMzQwOS82OTcgODQyMi8xMzQwNy82OTcgODQxMC8xMTMxMC82OTcKK2YgODQxMS8xMTMxMS82OTcgODQxMi8xMTMxMi82OTcgODQyNC8xMzQxMC82OTcKK2YgODQyNC8xMzQxMC82OTcgODQyMy8xMzQwOS82OTcgODQxMS8xMTMxMS82OTcKK2YgODQxMi8xMTMxMi82OTcgODQxMy8xMTMxMy82OTcgODQyNS8xMzQxMS82OTcKK2YgODQyNS8xMzQxMS82OTcgODQyNC8xMzQxMC82OTcgODQxMi8xMTMxMi82OTcKK2YgODQxMy8xMTMxMy82OTcgODQxNC8xMTMxNC82OTcgODQyNi8xMzQxMi82OTcKK2YgODQyNi8xMzQxMi82OTcgODQyNS8xMzQxMS82OTcgODQxMy8xMTMxMy82OTcKK2YgODQxNC8xMTMxNC82OTcgODQxNS8xMTMxNS82OTcgODQyNy8xMzQxMy82OTcKK2YgODQyNy8xMzQxMy82OTcgODQyNi8xMzQxMi82OTcgODQxNC8xMTMxNC82OTcKK2YgODQxNS8xMTMxNS82OTcgODQxNi8xMTMxNi82OTcgODQyOC8xMzQxNC82OTcKK2YgODQyOC8xMzQxNC82OTcgODQyNy8xMzQxMy82OTcgODQxNS8xMTMxNS82OTcKK2YgODQxNi8xMTMxNi82OTcgODQxNy8xMTMxNy82OTcgODQyOS8xMzQxNS82OTcKK2YgODQyOS8xMzQxNS82OTcgODQyOC8xMzQxNC82OTcgODQxNi8xMTMxNi82OTcKK2YgODQxNy8xMTMxNy82OTcgODQxOC8xMTMxOC82OTcgODQzMC8xMzQxNi82OTcKK2YgODQzMC8xMzQxNi82OTcgODQyOS8xMzQxNS82OTcgODQxNy8xMTMxNy82OTcKK2YgODQxOC8xMTMxOC82OTcgODQwNy8xMTMwOC82OTcgODQxOS8xMzQwOC82OTcKK2YgODQxOS8xMzQwOC82OTcgODQzMC8xMzQxNi82OTcgODQxOC8xMTMxOC82OTcKK2YgODQyOS8xMzQxNS82OTcgODQzMC8xMzQxNi82OTcgODQzMy8xMzQxNy82OTcKK2YgODQzMy8xMzQxNy82OTcgODQyOC8xMzQxNC82OTcgODQyOS8xMzQxNS82OTcKK2YgODQzMC8xMzQxNi82OTcgODQxOS8xMzQwOC82OTcgODQzMi8xMzQxOC82OTcKK2YgODQzMi8xMzQxOC82OTcgODQzMy8xMzQxNy82OTcgODQzMC8xMzQxNi82OTcKK2YgODQxOS8xMzQwOC82OTcgODQyMC8xMzQwNS82OTcgODQzMS8xMzQwNC82OTcKK2YgODQzMS8xMzQwNC82OTcgODQzMi8xMzQxOC82OTcgODQxOS8xMzQwOC82OTcKK2YgODQyMy8xMzQwOS82OTcgODQyNC8xMzQxMC82OTcgODQzMS8xMzQwNC82OTcKK2YgODQzMS8xMzQwNC82OTcgODQyMi8xMzQwNy82OTcgODQyMy8xMzQwOS82OTcKK2YgODQyNC8xMzQxMC82OTcgODQyNS8xMzQxMS82OTcgODQzMi8xMzQxOC82OTcKK2YgODQzMi8xMzQxOC82OTcgODQzMS8xMzQwNC82OTcgODQyNC8xMzQxMC82OTcKK2YgODQyNS8xMzQxMS82OTcgODQyNi8xMzQxMi82OTcgODQzMy8xMzQxNy82OTcKK2YgODQzMy8xMzQxNy82OTcgODQzMi8xMzQxOC82OTcgODQyNS8xMzQxMS82OTcKK2YgODQzMy8xMzQxNy82OTcgODQyNi8xMzQxMi82OTcgODQyNy8xMzQxMy82OTcKK2YgODQyNy8xMzQxMy82OTcgODQyOC8xMzQxNC82OTcgODQzMy8xMzQxNy82OTcKK2YgMTEwNTkvMTM0MTkvMTA4OCAxMTA2Ny8xMzQyMC8xMDg4IDExMTE0LzEzNDIxLzEwODgKK2YgMTExMTQvMTM0MjEvMTA4OCAxMTA2Ni8xMzQyMi8xMDg4IDExMDU5LzEzNDE5LzEwODgKK2YgMTEwNTMvMTM0MjMvMzk1OSAxMTA1NC8xMzQyNC8zOTU5IDExMDYxLzEzNDI1LzM5NTkKK2YgMTEwNTMvMTM0MjMvMzk1OSAxMTA2MS8xMzQyNS8zOTU5IDExMDYwLzEzNDI2LzM5NTkKK2YgMTEwNTgvMTM0MjcvMzk2MCAxMTA1OS8xMzQxOS8zOTYwIDExMDY2LzEzNDIyLzM5NjAKK2YgMTEwNjYvMTM0MjIvMzk2MCAxMTA2NS8xMzQyOC8zOTYwIDExMDU4LzEzNDI3LzM5NjAKK2YgMTEwNTcvMTM0MjkvMzk2MSAxMTA1OC8xMzQzMC8zOTYxIDExMDY1LzEzNDMxLzM5NjEKK2YgMTEwNjUvMTM0MzEvMzk2MSAxMTA2NC8xMzQzMi8zOTYxIDExMDU3LzEzNDI5LzM5NjEKK2YgMTEwNTYvMTM0MzMvMzk2MiAxMTA1Ny8xMzQyOS8zOTYyIDExMDY0LzEzNDMyLzM5NjIKK2YgMTEwNjQvMTM0MzIvMzk2MiAxMTA2My8xMzQzNC8zOTYyIDExMDU2LzEzNDMzLzM5NjIKK2YgMTEwNTUvMTM0MzUvMzk2MyAxMTA1Ni8xMzQzMy8zOTYzIDExMDYzLzEzNDM0LzM5NjMKK2YgMTEwNjMvMTM0MzQvMzk2MyAxMTA2Mi8xMzQzNi8zOTYzIDExMDU1LzEzNDM1LzM5NjMKK2YgMTEwNTQvMTM0MzcvMzk2NCAxMTA1NS8xMzQzNS8zOTY0IDExMDYyLzEzNDM2LzM5NjQKK2YgMTEwNjIvMTM0MzYvMzk2NCAxMTA2MS8xMzQzOC8zOTY0IDExMDU0LzEzNDM3LzM5NjQKK2YgMTExMTIvMTM0MzkvMzk2NSAxMTA3MC8xMzQ0MC8zOTY1IDExMDc4LzEzNDQxLzM5NjUKK2YgMTEwNjcvMTM0MjAvMTA0NCAxMTEwMy8xMzQ0Mi8xMDQ0IDExMTE4LzEzNDQzLzEwNDQKK2YgMTExMTgvMTM0NDMvMTA0NCAxMTExNC8xMzQyMS8xMDQ0IDExMDY3LzEzNDIwLzEwNDQKK2YgMTEwNTMvMTM0MjMvMTA0MyAxMTA2MC8xMzQyNi8xMDQzIDExMDY4LzEzNDQ0LzEwNDMKK2YgMTEwNTMvMTM0MjMvMTA0MyAxMTA2OC8xMzQ0NC8xMDQzIDExMDY5LzEzNDQ1LzEwNDMKK2YgMTExMTMvMTM0NDYvNjg3IDExMTA2LzEzNDQ3LzY4NyAxMTA4NC8xMzQ0OC82ODcKK2YgMTExNzIvMTM0NDkvMTA0MyAxMTA3Mi8xMzQ1MC8xMDQzIDExMDc0LzEzNDUxLzEwNDMKK2YgMTEwNzQvMTM0NTEvMTA0MyAxMTE3OC8xMzQ1Mi8xMDQzIDExMTcyLzEzNDQ5LzEwNDMKK2YgMTEwODkvMTM0NTMvNjg3IDExMDc3LzEzNDU0LzY4NyAxMTA3OC8xMzQ0MS82ODcKK2YgMTEwNzgvMTM0NDEvNjg3IDExMDkwLzEzNDU1LzY4NyAxMTA4OS8xMzQ1My82ODcKK2YgMTExODAvMTM0NTYvNjg3IDExMTE1LzEzNDU3LzY4NyAxMTExOS8xMzQ1OC82ODcKK2YgMTExMTkvMTM0NTgvMTUwNyAxMTE4MS8xMzQ1OS8xNTA3IDExMTgwLzEzNDU2LzE1MDcKK2YgMTExNzMvMTM0NjAvNjg3IDExMDczLzEzNDYxLzY4NyAxMTEwMS8xMzQ2Mi82ODcKK2YgMTExMDEvMTM0NjIvNjg3IDExMTc2LzEzNDYzLzY4NyAxMTE3My8xMzQ2MC82ODcKK2YgMTEwODQvMTM0NDgvNjg3IDExMDg1LzEzNDY0LzY4NyAxMTA5Ny8xMzQ2NS82ODcKK2YgMTEwOTcvMTM0NjUvNjg3IDExMDk2LzEzNDY2LzY4NyAxMTA4NC8xMzQ0OC82ODcKK2YgMTExMDkvMTM0NjcvNjg3IDExMDg3LzEzNDY4LzY4NyAxMTA4Ni8xMzQ2OS82ODcKK2YgMTEwODYvMTM0NjkvNjg3IDExMTA4LzEzNDcwLzY4NyAxMTEwOS8xMzQ2Ny82ODcKK2YgMTEwODcvMTM0NjgvNjg3IDExMDc2LzEzNDcxLzY4NyAxMTA4OC8xMzQ3Mi82ODcKK2YgMTEwODgvMTM0NzIvNjg3IDExMDk5LzEzNDczLzY4NyAxMTA4Ny8xMzQ2OC82ODcKK2YgMTEwODEvMTM0NzQvNjg3IDExMDkzLzEzNDc1LzY4NyAxMTA5Mi8xMzQ3Ni82ODcKK2YgMTEwOTIvMTM0NzYvNjg3IDExMDgwLzEzNDc3LzY4NyAxMTA4MS8xMzQ3NC82ODcKK2YgMTEwODQvMTM0NDgvNjg3IDExMDk2LzEzNDY2LzY4NyAxMTA5NS8xMzQ3OC82ODcKK2YgMTEwOTUvMTM0NzgvNjg3IDExMDgzLzEzNDc5LzY4NyAxMTA4NC8xMzQ0OC82ODcKK2YgMTEwODcvMTM0NjgvNjg3IDExMDk5LzEzNDczLzY4NyAxMTA5OC8xMzQ4MC82ODcKK2YgMTEwOTgvMTM0ODAvMTUwNyAxMTA4Ni8xMzQ2OS8xNTA3IDExMDg3LzEzNDY4LzE1MDcKK2YgMTEwNzYvMTM0NzEvNjg3IDExMDc3LzEzNDU0LzY4NyAxMTA4OS8xMzQ1My82ODcKK2YgMTEwODkvMTM0NTMvNjg3IDExMDg4LzEzNDcyLzY4NyAxMTA3Ni8xMzQ3MS82ODcKK2YgMTEwNzgvMTM0NDEvMzk2NSAxMTA3OS8xMzQ4MS8zOTY1IDExMDkxLzEzNDgyLzM5NjUKK2YgMTEwOTEvMTM0ODIvNjg3IDExMDkwLzEzNDU1LzY4NyAxMTA3OC8xMzQ0MS82ODcKK2YgMTEwODAvMTM0NzcvNjg3IDExMDkyLzEzNDc2LzY4NyAxMTA5MS8xMzQ4Mi82ODcKK2YgMTEwOTEvMTM0ODIvMzk2NSAxMTA3OS8xMzQ4MS8zOTY1IDExMDgwLzEzNDc3LzM5NjUKK2YgMTEwODEvMTM0NzQvNjg3IDExMDgyLzEzNDgzLzY4NyAxMTA5NC8xMzQ4NC82ODcKK2YgMTEwOTQvMTM0ODQvNjg3IDExMDkzLzEzNDc1LzY4NyAxMTA4MS8xMzQ3NC82ODcKK2YgMTEwODMvMTM0NzkvNjg3IDExMDk1LzEzNDc4LzY4NyAxMTA5NC8xMzQ4NC82ODcKK2YgMTEwOTQvMTM0ODQvNjg3IDExMDgyLzEzNDgzLzY4NyAxMTA4My8xMzQ3OS82ODcKK2YgMTEwODYvMTM0NjkvMzk2NiAxMTA5OC8xMzQ4MC8zOTY2IDExMDk3LzEzNDY1LzM5NjYKK2YgMTEwOTcvMTM0NjUvNjg3IDExMDg1LzEzNDY0LzY4NyAxMTA4Ni8xMzQ2OS82ODcKK2YgMTExMDgvMTM0NzAvNjg3IDExMDg2LzEzNDY5LzY4NyAxMTA4NS8xMzQ2NC82ODcKK2YgMTEwODUvMTM0NjQvNjg3IDExMTA3LzEzNDg1LzY4NyAxMTEwOC8xMzQ3MC82ODcKK2YgMTExMDkvMTM0NjcvNjg3IDExMTEwLzEzNDg2LzY4NyAxMTA3Ni8xMzQ3MS82ODcKK2YgMTEwNzYvMTM0NzEvNjg3IDExMDg3LzEzNDY4LzY4NyAxMTEwOS8xMzQ2Ny82ODcKK2YgMTExMTAvMTM0ODYvNjg3IDExMTExLzEzNDg3LzY4NyAxMTA3Ny8xMzQ1NC82ODcKK2YgMTEwNzcvMTM0NTQvNjg3IDExMDc2LzEzNDcxLzY4NyAxMTExMC8xMzQ4Ni82ODcKK2YgMTEwODAvMTM0NzcvNjg3IDExMTc1LzEzNDg4LzY4NyAxMTE3My8xMzQ2MC82ODcKK2YgMTExNzMvMTM0NjAvNjg3IDExMDgxLzEzNDc0LzY4NyAxMTA4MC8xMzQ3Ny82ODcKK2YgMTEwODIvMTM0ODMvNjg3IDExMTc2LzEzNDYzLzY4NyAxMTE4Mi8xMzQ4OS82ODcKK2YgMTExODIvMTM0ODkvNjg3IDExMDgzLzEzNDc5LzY4NyAxMTA4Mi8xMzQ4My82ODcKK2YgMTExMDMvMTM0NDIvMTA0NCAxMTE3NC8xMzQ5MC8xMDQ0IDExMTc3LzEzNDkxLzEwNDQKK2YgMTExNzcvMTM0OTEvMTA0NCAxMTExOC8xMzQ0My8xMDQ0IDExMTAzLzEzNDQyLzEwNDQKK2YgMTExMDIvMTM0OTIvMTA0MyAxMTEwNS8xMzQ5My8xMDQzIDExMDY5LzEzNDQ1LzEwNDMKK2YgMTEwNjkvMTM0NDUvMTA0MyAxMTA2OC8xMzQ0NC8xMDQzIDExMTAyLzEzNDkyLzEwNDMKK2YgMTEwODMvMTM0NzkvNjg3IDExMTE3LzEzNDk0LzY4NyAxMTExMy8xMzQ0Ni82ODcKK2YgMTExMTMvMTM0NDYvNjg3IDExMDg0LzEzNDQ4LzY4NyAxMTA4My8xMzQ3OS82ODcKK2YgMTEwNzAvMTM0NDAvNjg3IDExMTA0LzEzNDk1LzY4NyAxMTA3OS8xMzQ4MS82ODcKK2YgMTEwNzkvMTM0ODEvMzk2NSAxMTA3OC8xMzQ0MS8zOTY1IDExMDcwLzEzNDQwLzM5NjUKK2YgMTEwNjgvMTM0OTYvMzk2NyAxMTA2MC8xMzQ5Ny8zOTY3IDExMTA2LzEzNDQ3LzM5NjcKK2YgMTExMDYvMTM0NDcvMzk2OCAxMTExMy8xMzQ0Ni8zOTY4IDExMDY4LzEzNDk2LzM5NjgKK2YgMTEwNjAvMTM0MjYvMzk2OSAxMTA2MS8xMzQyNS8zOTY5IDExMTA3LzEzNDk4LzM5NjkKK2YgMTExMDcvMTM0ODUvMzk3MCAxMTEwNi8xMzQ0Ny8zOTcwIDExMDYwLzEzNDk3LzM5NzAKK2YgMTEwNjUvMTM0OTkvMzk3MSAxMTA2Ni8xMzUwMC8zOTcxIDExMTEyLzEzNDM5LzM5NzEKK2YgMTExMTIvMTM1MDEvMzk3MiAxMTExMS8xMzUwMi8zOTcyIDExMDY1LzEzNTAzLzM5NzIKK2YgMTEwNjQvMTM1MDQvMzk3MyAxMTA2NS8xMzQ5OS8zOTczIDExMTExLzEzNDg3LzM5NzMKK2YgMTExMTEvMTM0ODcvMzk3NCAxMTExMC8xMzQ4Ni8zOTc0IDExMDY0LzEzNTA0LzM5NzQKK2YgMTEwNjMvMTM1MDUvMzk3NSAxMTA2NC8xMzUwNC8zOTc1IDExMTEwLzEzNDg2LzM5NzUKK2YgMTExMTAvMTM0ODYvMzk3NiAxMTEwOS8xMzQ2Ny8zOTc2IDExMDYzLzEzNTA1LzM5NzYKK2YgMTEwNjIvMTM1MDYvMzk3NyAxMTA2My8xMzUwNS8zOTc3IDExMTA5LzEzNDY3LzM5NzcKK2YgMTExMDkvMTM0NjcvMzk3OCAxMTEwOC8xMzQ3MC8zOTc4IDExMDYyLzEzNTA2LzM5NzgKK2YgMTEwNjEvMTM1MDcvMzk3OSAxMTA2Mi8xMzUwNi8zOTc5IDExMTA4LzEzNDcwLzM5NzkKK2YgMTExMDgvMTM0NzAvMzk4MCAxMTEwNy8xMzQ4NS8zOTgwIDExMDYxLzEzNTA3LzM5ODAKK2YgMTExNzkvMTM1MDgvMzk4MSAxMTExNi8xMzUwOS8zOTgxIDExMDcyLzEzNTEwLzM5ODEKK2YgMTEwNzIvMTM1MTAvMzk4MiAxMTE3Mi8xMzUxMS8zOTgyIDExMTc5LzEzNTA4LzM5ODIKK2YgMTEwNjYvMTM1MDAvMzk4MyAxMTExNC8xMzUxMi8zOTgzIDExMDcwLzEzNDQwLzM5ODMKK2YgMTEwNzAvMTM0NDAvMzk4NCAxMTExMi8xMzQzOS8zOTg0IDExMDY2LzEzNTAwLzM5ODQKK2YgMTExMTQvMTM1MTIvMzk4NSAxMTExOC8xMzUxMy8zOTg1IDExMTA0LzEzNDk1LzM5ODUKK2YgMTExMDQvMTM0OTUvMzk4NSAxMTA3MC8xMzQ0MC8zOTg1IDExMTE0LzEzNTEyLzM5ODUKK2YgMTExMDIvMTM1MTQvMzk4MiAxMTA2OC8xMzQ5Ni8zOTgyIDExMTEzLzEzNDQ2LzM5ODIKK2YgMTExMTMvMTM0NDYvMzk4MiAxMTExNy8xMzQ5NC8zOTgyIDExMTAyLzEzNTE0LzM5ODIKK2YgMTExMTgvMTM1MTMvMzk4NSAxMTE3Ny8xMzUxNS8zOTg1IDExMTgwLzEzNDU2LzM5ODUKK2YgMTExODAvMTM0NTYvMzk4NSAxMTEwNC8xMzQ5NS8zOTg1IDExMTE4LzEzNTEzLzM5ODUKK2YgMTExODEvMTM0NTkvNjg3IDExMTc1LzEzNDg4LzY4NyAxMTA4MC8xMzQ3Ny82ODcKK2YgMTEwODAvMTM0NzcvNjg3IDExMDc5LzEzNDgxLzY4NyAxMTE4MS8xMzQ1OS82ODcKK2YgMTExODIvMTM0ODkvNjg3IDExMTc5LzEzNTA4LzY4NyAxMTExNy8xMzQ5NC82ODcKK2YgMTExMTcvMTM0OTQvNjg3IDExMDgzLzEzNDc5LzY4NyAxMTE4Mi8xMzQ4OS82ODcKK2YgMTExMTIvMTM0MzkvNjg3IDExMDc4LzEzNDQxLzY4NyAxMTA3Ny8xMzQ1NC82ODcKK2YgMTEwNzcvMTM0NTQvNjg3IDExMTExLzEzNDg3LzY4NyAxMTExMi8xMzQzOS82ODcKK2YgMTEwODUvMTM0NjQvNjg3IDExMDg0LzEzNDQ4LzY4NyAxMTEwNi8xMzQ0Ny82ODcKK2YgMTExMDYvMTM0NDcvNjg3IDExMTA3LzEzNDg1LzY4NyAxMTA4NS8xMzQ2NC82ODcKK2YgMTIwNzIvMTM1MTYvMzk4NiAxMTA4OC8xMzUxNy8zOTg2IDExMDg5LzEzNTE4LzM5ODYKK2YgMTEwODkvMTM1MTgvMzk4NiAxMjA3MS8xMzUxOS8zOTg2IDEyMDcyLzEzNTE2LzM5ODYKK2YgMTIwNzMvMTM1MjAvMzk4NyAxMTA5OS8xMzUyMS8zOTg3IDExMDg4LzEzNTE3LzM5ODcKK2YgMTEwODgvMTM1MTcvMzk4NyAxMjA3Mi8xMzUxNi8zOTg3IDEyMDczLzEzNTIwLzM5ODcKK2YgMTIwNzQvMTM1MjIvMzk4OCAxMTA5OC8xMzUyMy8zOTg4IDExMDk5LzEzNTIxLzM5ODgKK2YgMTEwOTkvMTM1MjEvMzk4OCAxMjA3My8xMzUyMC8zOTg4IDEyMDc0LzEzNTIyLzM5ODgKK2YgMTIwNzUvMTM1MjQvMzk4OSAxMTA5Ny8xMzUyNS8zOTg5IDExMDk4LzEzNTIzLzM5ODkKK2YgMTEwOTgvMTM1MjMvMzk4OSAxMjA3NC8xMzUyMi8zOTg5IDEyMDc1LzEzNTI0LzM5ODkKK2YgMTIwNzYvMTM1MjYvMzk5MCAxMTA5Ni8xMzUyNy8zOTkwIDExMDk3LzEzNTI4LzM5OTAKK2YgMTEwOTcvMTM1MjgvMzk5MCAxMjA3NS8xMzUyOS8zOTkwIDEyMDc2LzEzNTI2LzM5OTAKK2YgMTIwNzcvMTM1MzAvMzk5MSAxMTA5NS8xMzUzMS8zOTkxIDExMDk2LzEzNTI3LzM5OTEKK2YgMTEwOTYvMTM1MjcvMzk5MSAxMjA3Ni8xMzUyNi8zOTkxIDEyMDc3LzEzNTMwLzM5OTEKK2YgMTIwNzgvMTM1MzIvMzk5MiAxMTA5NC8xMzUzMy8zOTkyIDExMDk1LzEzNTM0LzM5OTIKK2YgMTEwOTUvMTM1MzQvMzk5MiAxMjA3Ny8xMzUzNS8zOTkyIDEyMDc4LzEzNTMyLzM5OTIKK2YgMTIwNzkvMTM1MzYvMzk5MyAxMTA5My8xMzUzNy8zOTkzIDExMDk0LzEzNTMzLzM5OTMKK2YgMTEwOTQvMTM1MzMvMzk5MyAxMjA3OC8xMzUzMi8zOTkzIDEyMDc5LzEzNTM2LzM5OTMKK2YgMTIwODAvMTM1MzgvMzk5NCAxMTA5Mi8xMzUzOS8zOTk0IDExMDkzLzEzNTM3LzM5OTQKK2YgMTEwOTMvMTM1MzcvMzk5NCAxMjA3OS8xMzUzNi8zOTk0IDEyMDgwLzEzNTM4LzM5OTQKK2YgMTIwODEvMTM1NDAvMzk5NSAxMTA5MS8xMzU0MS8zOTk1IDExMDkyLzEzNTM5LzM5OTUKK2YgMTEwOTIvMTM1MzkvMzk5NSAxMjA4MC8xMzUzOC8zOTk1IDEyMDgxLzEzNTQwLzM5OTUKK2YgMTIwODIvMTM1NDIvMzk5NiAxMTA5MC8xMzU0My8zOTk2IDExMDkxLzEzNTQ0LzM5OTYKK2YgMTEwOTEvMTM1NDQvMzk5NiAxMjA4MS8xMzU0NS8zOTk2IDEyMDgyLzEzNTQyLzM5OTYKK2YgMTIwNzEvMTM1NDYvMzk5NyAxMTA4OS8xMzU0Ny8zOTk3IDExMDkwLzEzNTQzLzM5OTcKK2YgMTEwOTAvMTM1NDMvMzk5NyAxMjA4Mi8xMzU0Mi8zOTk3IDEyMDcxLzEzNTQ2LzM5OTcKK2YgMTExODUvMTM1NDgvMjIxIDExMTg2LzEzNTQ5LzIyMSAxMTA3MS8xMzU1MC8yMjEKK2YgMTEwNzEvMTM1NTAvMjIxIDExMDc1LzEzNTUxLzIyMSAxMTE4NS8xMzU0OC8yMjEKK2YgMTExOTAvMTM1NTIvMjIxIDExMTIwLzEzNTUzLzIyMSAxMTEwMS8xMzU1NC8yMjEKK2YgMTExMDEvMTM1NTQvMjIwIDExMTk2LzEzNTU1LzIyMCAxMTE5MC8xMzU1Mi8yMjAKK2YgMTExMDUvMTM0OTMvMTA0MyAxMTEwMi8xMzQ5Mi8xMDQzIDExMTcyLzEzNDQ5LzEwNDMKK2YgMTExNzIvMTM0NDkvMTA0MyAxMTE3OC8xMzQ1Mi8xMDQzIDExMTA1LzEzNDkzLzEwNDMKK2YgMTExODEvMTM0NTkvNjg3IDExMDc5LzEzNDgxLzY4NyAxMTEwNC8xMzQ5NS82ODcKK2YgMTExMDQvMTM0OTUvNjg3IDExMTgwLzEzNDU2LzY4NyAxMTE4MS8xMzQ1OS82ODcKK2YgMTEwODIvMTM0ODMvNjg3IDExMDgxLzEzNDc0LzY4NyAxMTE3My8xMzQ2MC82ODcKK2YgMTExNzMvMTM0NjAvNjg3IDExMTc2LzEzNDYzLzY4NyAxMTA4Mi8xMzQ4My82ODcKK2YgMTEwNzMvMTM0NjEvNjg3IDExMTczLzEzNDYwLzY4NyAxMTE3NS8xMzQ4OC82ODcKK2YgMTExNzUvMTM0ODgvMTUwNyAxMTEwMC8xMzU1Ni8xNTA3IDExMDczLzEzNDYxLzE1MDcKK2YgMTExMjAvMTM1NTcvNjg3IDExMTgyLzEzNDg5LzY4NyAxMTE3Ni8xMzQ2My82ODcKK2YgMTExNzYvMTM0NjMvNjg3IDExMTAxLzEzNDYyLzY4NyAxMTEyMC8xMzU1Ny82ODcKK2YgMTEwNzEvMTM1NTgvMTA0NCAxMTE3Ny8xMzQ5MS8xMDQ0IDExMTc0LzEzNDkwLzEwNDQKK2YgMTExNzQvMTM0OTAvMTA0NCAxMTA3NS8xMzU1OS8xMDQ0IDExMDcxLzEzNTU4LzEwNDQKK2YgMTExMDIvMTM1MTQvMzk4MiAxMTExNy8xMzQ5NC8zOTgyIDExMTc5LzEzNTA4LzM5ODIKK2YgMTExNzkvMTM1MDgvMzk4MiAxMTE3Mi8xMzUxMS8zOTgyIDExMTAyLzEzNTE0LzM5ODIKK2YgMTExMTUvMTM0NTcvMzk5OCAxMTE4MC8xMzQ1Ni8zOTk4IDExMTc3LzEzNTE1LzM5OTgKK2YgMTExNzcvMTM1MTUvMzk5OSAxMTA3MS8xMzU2MC8zOTk5IDExMTE1LzEzNDU3LzM5OTkKK2YgMTExMDAvMTM1NTYvMTUwNyAxMTE3NS8xMzQ4OC8xNTA3IDExMTgxLzEzNDU5LzE1MDcKK2YgMTExODEvMTM0NTkvMTUwNyAxMTExOS8xMzQ1OC8xNTA3IDExMTAwLzEzNTU2LzE1MDcKK2YgMTExMTYvMTM1MDkvNjg3IDExMTc5LzEzNTA4LzY4NyAxMTE4Mi8xMzQ4OS82ODcKK2YgMTExODIvMTM0ODkvNjg3IDExMTIwLzEzNTU3LzY4NyAxMTExNi8xMzUwOS82ODcKK2YgMTExOTUvMTM1NjEvMjIxIDExMTk2LzEzNTU1LzIyMSAxMTE4My8xMzU2Mi8yMjEKK2YgMTExODMvMTM1NjIvMjIxIDExMTg0LzEzNTYzLzIyMSAxMTE5NS8xMzU2MS8yMjEKK2YgMTExMDAvMTM1NjQvMjIxIDExMTkzLzEzNTY1LzIyMSAxMTE4My8xMzU2Mi8yMjEKK2YgMTExODMvMTM1NjIvMjIxIDExMDczLzEzNTY2LzIyMSAxMTEwMC8xMzU2NC8yMjEKK2YgMTExOTIvMTM1NjcvMjIxIDExMTkxLzEzNTY4LzIyMSAxMTE4Ni8xMzU0OS8yMjEKK2YgMTExODYvMTM1NDkvMjIxIDExMTg1LzEzNTQ4LzIyMSAxMTE5Mi8xMzU2Ny8yMjEKK2YgMTExMTUvMTM1NjkvMjIxIDExMDcxLzEzNTUwLzIyMSAxMTE4Ni8xMzU0OS8yMjEKK2YgMTEwNzQvMTM1NzAvMjIxIDExMDcyLzEzNTcxLzIyMSAxMTE4Ny8xMzU3Mi8yMjEKK2YgMTExODcvMTM1NzIvMjIxIDExMTg4LzEzNTczLzIyMSAxMTA3NC8xMzU3MC8yMjEKK2YgMTExODcvMTM1NzIvMjIxIDExMDcyLzEzNTcxLzIyMSAxMTExNi8xMzU3NC8yMjEKK2YgMTExODgvMTM1NzMvMjIxIDExMTg3LzEzNTcyLzIyMSAxMTE5MC8xMzU1Mi8yMjEKK2YgMTExOTAvMTM1NTIvMjIxIDExMTg5LzEzNTc1LzIyMSAxMTE4OC8xMzU3My8yMjEKK2YgMTExOTQvMTM1NzYvMjIxIDExMTkzLzEzNTY1LzIyMSAxMTE5MS8xMzU2OC8yMjEKK2YgMTExOTEvMTM1NjgvMjIxIDExMTkyLzEzNTY3LzIyMSAxMTE5NC8xMzU3Ni8yMjEKK2YgMTExMTYvMTM1NzQvMjIxIDExMTIwLzEzNTUzLzIyMSAxMTE5MC8xMzU1Mi8yMjEKK2YgMTExOTAvMTM1NTIvMjIxIDExMTg3LzEzNTcyLzIyMSAxMTExNi8xMzU3NC8yMjEKK2YgMTExODYvMTM1NDkvMjIxIDExMTkxLzEzNTY4LzIyMSAxMTExOS8xMzU3Ny8yMjEKK2YgMTExMTkvMTM1NzcvMjIxIDExMTE1LzEzNTY5LzIyMSAxMTE4Ni8xMzU0OS8yMjEKK2YgMTExODQvMTM1NjMvMjIxIDExMTgzLzEzNTYyLzIyMSAxMTE5My8xMzU2NS8yMjEKK2YgMTExOTMvMTM1NjUvMjIxIDExMTk0LzEzNTc2LzIyMSAxMTE4NC8xMzU2My8yMjEKK2YgMTExODkvMTM1NzUvMjIxIDExMTkwLzEzNTUyLzIyMSAxMTE5Ni8xMzU1NS8yMjEKK2YgMTExOTYvMTM1NTUvMjIxIDExMTk1LzEzNTYxLzIyMSAxMTE4OS8xMzU3NS8yMjEKK2YgMTExMDEvMTM1NTQvMjIxIDExMDczLzEzNTY2LzIyMSAxMTE4My8xMzU2Mi8yMjEKK2YgMTExODMvMTM1NjIvMjIwIDExMTk2LzEzNTU1LzIyMCAxMTEwMS8xMzU1NC8yMjAKK2YgMTExOTEvMTM1NjgvMjIxIDExMTkzLzEzNTY1LzIyMSAxMTEwMC8xMzU2NC8yMjEKK2YgMTExMDAvMTM1NjQvMjIxIDExMTE5LzEzNTc3LzIyMSAxMTE5MS8xMzU2OC8yMjEKK2YgMTE1NjMvMTM1NzgvMTA4MCAxMTU3MC8xMzU3OS8xMDgwIDExNjE4LzEzNTgwLzEwODAKK2YgMTE2MTgvMTM1ODAvMTA4MCAxMTU3MS8xMzU4MS8xMDgwIDExNTYzLzEzNTc4LzEwODAKK2YgMTE1NTcvMTM1ODIvNDAwMCAxMTU2NC8xMzU4My80MDAwIDExNTY1LzEzNTg0LzQwMDAKK2YgMTE1NjUvMTM1ODQvNDAwMCAxMTU1OC8xMzU4NS80MDAwIDExNTU3LzEzNTgyLzQwMDAKK2YgMTE1NjIvMTM1ODYvNDAwMSAxMTU2OS8xMzU4Ny80MDAxIDExNTcwLzEzNTc5LzQwMDEKK2YgMTE1NzAvMTM1NzkvNDAwMiAxMTU2My8xMzU3OC80MDAyIDExNTYyLzEzNTg2LzQwMDIKK2YgMTE1NjEvMTM1ODgvNDAwMyAxMTU2OC8xMzU4OS80MDAzIDExNTY5LzEzNTkwLzQwMDMKK2YgMTE1NjkvMTM1OTAvNDAwMyAxMTU2Mi8xMzU5MS80MDAzIDExNTYxLzEzNTg4LzQwMDMKK2YgMTE1NjAvMTM1OTIvNDAwNCAxMTU2Ny8xMzU5My80MDA0IDExNTY4LzEzNTg5LzQwMDQKK2YgMTE1NjgvMTM1ODkvNDAwNCAxMTU2MS8xMzU4OC80MDA0IDExNTYwLzEzNTkyLzQwMDQKK2YgMTE1NTkvMTM1OTQvNDAwNSAxMTU2Ni8xMzU5NS80MDA1IDExNTY3LzEzNTkzLzQwMDUKK2YgMTE1NjcvMTM1OTMvNDAwNSAxMTU2MC8xMzU5Mi80MDA1IDExNTU5LzEzNTk0LzQwMDUKK2YgMTE1NTgvMTM1OTYvNDAwNiAxMTU2NS8xMzU5Ny80MDA2IDExNTY2LzEzNTk1LzQwMDYKK2YgMTE1NjYvMTM1OTUvNDAwNiAxMTU1OS8xMzU5NC80MDA2IDExNTU4LzEzNTk2LzQwMDYKK2YgMTE2MTYvMTM1OTgvNjg3IDExNTgyLzEzNTk5LzY4NyAxMTU3NC8xMzYwMC82ODcKK2YgMTE1NzEvMTM1ODEvMTA0NCAxMTYxOC8xMzU4MC8xMDQ0IDExNjIyLzEzNjAxLzEwNDQKK2YgMTE2MjIvMTM2MDEvMTA0NCAxMTYwNy8xMzYwMi8xMDQ0IDExNTcxLzEzNTgxLzEwNDQKK2YgMTE1NTcvMTM1ODIvMTA0MyAxMTU3My8xMzYwMy8xMDQzIDExNTcyLzEzNjA0LzEwNDMKK2YgMTE1NzIvMTM2MDQvMTA0MyAxMTU2NC8xMzU4My8xMDQzIDExNTU3LzEzNTgyLzEwNDMKK2YgMTE2MTcvMTM2MDUvNjg3IDExNTg4LzEzNjA2LzY4NyAxMTYxMC8xMzYwNy82ODcKK2YgMTE2NzYvMTM2MDgvMTA0MyAxMTY4Mi8xMzYwOS8xMDQzIDExNTc4LzEzNjEwLzEwNDMKK2YgMTE1NzgvMTM2MTAvMTA0MyAxMTU3Ni8xMzYxMS8xMDQzIDExNjc2LzEzNjA4LzEwNDMKK2YgMTE1OTMvMTM2MTIvMjk1NiAxMTU5NC8xMzYxMy8yOTU2IDExNTgyLzEzNTk5LzI5NTYKK2YgMTE1ODIvMTM1OTkvNjg3IDExNTgxLzEzNjE0LzY4NyAxMTU5My8xMzYxMi82ODcKK2YgMTE2ODQvMTM2MTUvNDkzIDExNjg1LzEzNjE2LzQ5MyAxMTYyMy8xMzYxNy80OTMKK2YgMTE2MjMvMTM2MTcvNDkzIDExNjE5LzEzNjE4LzQ5MyAxMTY4NC8xMzYxNS80OTMKK2YgMTE2NzcvMTM2MTkvNjg3IDExNjgwLzEzNjIwLzY4NyAxMTYwNS8xMzYyMS82ODcKK2YgMTE2MDUvMTM2MjEvNjg3IDExNTc3LzEzNjIyLzY4NyAxMTY3Ny8xMzYxOS82ODcKK2YgMTE1ODgvMTM2MDYvNjg3IDExNjAwLzEzNjIzLzY4NyAxMTYwMS8xMzYyNC82ODcKK2YgMTE2MDEvMTM2MjQvNjg3IDExNTg5LzEzNjI1LzY4NyAxMTU4OC8xMzYwNi82ODcKK2YgMTE2MTMvMTM2MjYvNjg3IDExNjEyLzEzNjI3LzY4NyAxMTU5MC8xMzYyOC82ODcKK2YgMTE1OTAvMTM2MjgvNjg3IDExNTkxLzEzNjI5LzY4NyAxMTYxMy8xMzYyNi82ODcKK2YgMTE1OTEvMTM2MjkvNjg3IDExNjAzLzEzNjMwLzY4NyAxMTU5Mi8xMzYzMS82ODcKK2YgMTE1OTIvMTM2MzEvNjg3IDExNTgwLzEzNjMyLzY4NyAxMTU5MS8xMzYyOS82ODcKK2YgMTE1ODUvMTM2MzMvNjg3IDExNTg0LzEzNjM0LzY4NyAxMTU5Ni8xMzYzNS82ODcKK2YgMTE1OTYvMTM2MzUvNjg3IDExNTk3LzEzNjM2LzY4NyAxMTU4NS8xMzYzMy82ODcKK2YgMTE1ODgvMTM2MDYvNjg3IDExNTg3LzEzNjM3LzY4NyAxMTU5OS8xMzYzOC82ODcKK2YgMTE1OTkvMTM2MzgvNjg3IDExNjAwLzEzNjIzLzY4NyAxMTU4OC8xMzYwNi82ODcKK2YgMTE1OTEvMTM2MjkvNjg3IDExNTkwLzEzNjI4LzY4NyAxMTYwMi8xMzYzOS82ODcKK2YgMTE2MDIvMTM2MzkvNjg3IDExNjAzLzEzNjMwLzY4NyAxMTU5MS8xMzYyOS82ODcKK2YgMTE1ODAvMTM2MzIvNjg3IDExNTkyLzEzNjMxLzY4NyAxMTU5My8xMzYxMi82ODcKK2YgMTE1OTMvMTM2MTIvNjg3IDExNTgxLzEzNjE0LzY4NyAxMTU4MC8xMzYzMi82ODcKK2YgMTE1ODIvMTM1OTkvMjk1NiAxMTU5NC8xMzYxMy8yOTU2IDExNTk1LzEzNjQwLzI5NTYKK2YgMTE1OTUvMTM2NDAvNjg3IDExNTgzLzEzNjQxLzY4NyAxMTU4Mi8xMzU5OS82ODcKK2YgMTE1ODQvMTM2MzQvNjg3IDExNTgzLzEzNjQxLzY4NyAxMTU5NS8xMzY0MC82ODcKK2YgMTE1OTUvMTM2NDAvNjg3IDExNTk2LzEzNjM1LzY4NyAxMTU4NC8xMzYzNC82ODcKK2YgMTE1ODUvMTM2MzMvNjg3IDExNTk3LzEzNjM2LzY4NyAxMTU5OC8xMzY0Mi82ODcKK2YgMTE1OTgvMTM2NDIvNjg3IDExNTg2LzEzNjQzLzY4NyAxMTU4NS8xMzYzMy82ODcKK2YgMTE1ODcvMTM2MzcvNjg3IDExNTg2LzEzNjQzLzY4NyAxMTU5OC8xMzY0Mi82ODcKK2YgMTE1OTgvMTM2NDIvNjg3IDExNTk5LzEzNjM4LzY4NyAxMTU4Ny8xMzYzNy82ODcKK2YgMTE1OTAvMTM2MjgvNjg3IDExNTg5LzEzNjI1LzY4NyAxMTYwMS8xMzYyNC82ODcKK2YgMTE2MDEvMTM2MjQvNjg3IDExNjAyLzEzNjM5LzY4NyAxMTU5MC8xMzYyOC82ODcKK2YgMTE2MTIvMTM2MjcvNjg3IDExNjExLzEzNjQ0LzY4NyAxMTU4OS8xMzYyNS82ODcKK2YgMTE1ODkvMTM2MjUvNjg3IDExNTkwLzEzNjI4LzY4NyAxMTYxMi8xMzYyNy82ODcKK2YgMTE2MTMvMTM2MjYvNjg3IDExNTkxLzEzNjI5LzY4NyAxMTU4MC8xMzYzMi82ODcKK2YgMTE1ODAvMTM2MzIvNjg3IDExNjE0LzEzNjQ1LzY4NyAxMTYxMy8xMzYyNi82ODcKK2YgMTE2MTQvMTM2NDUvNjg3IDExNTgwLzEzNjMyLzY4NyAxMTU4MS8xMzYxNC82ODcKK2YgMTE1ODEvMTM2MTQvNjg3IDExNjE1LzEzNjQ2LzY4NyAxMTYxNC8xMzY0NS82ODcKK2YgMTE1ODQvMTM2MzQvNjg3IDExNTg1LzEzNjMzLzY4NyAxMTY3Ny8xMzYxOS82ODcKK2YgMTE2NzcvMTM2MTkvNjg3IDExNjc5LzEzNjQ3LzY4NyAxMTU4NC8xMzYzNC82ODcKK2YgMTE1ODYvMTM2NDMvNjg3IDExNTg3LzEzNjM3LzY4NyAxMTY4Ni8xMzY0OC82ODcKK2YgMTE2ODYvMTM2NDgvNjg3IDExNjgwLzEzNjIwLzY4NyAxMTU4Ni8xMzY0My82ODcKK2YgMTE2MDcvMTM2MDIvMTA0NCAxMTYyMi8xMzYwMS8xMDQ0IDExNjgxLzEzNjQ5LzEwNDQKK2YgMTE2ODEvMTM2NDkvMTA0NCAxMTY3OC8xMzY1MC8xMDQ0IDExNjA3LzEzNjAyLzEwNDQKK2YgMTE2MDYvMTM2NTEvMTA0MyAxMTU3Mi8xMzYwNC8xMDQzIDExNTczLzEzNjAzLzEwNDMKK2YgMTE1NzMvMTM2MDMvMTA0MyAxMTYwOS8xMzY1Mi8xMDQzIDExNjA2LzEzNjUxLzEwNDMKK2YgMTE1ODcvMTM2MzcvNjg3IDExNTg4LzEzNjA2LzY4NyAxMTYxNy8xMzYwNS82ODcKK2YgMTE2MTcvMTM2MDUvNjg3IDExNjIxLzEzNjUzLzY4NyAxMTU4Ny8xMzYzNy82ODcKK2YgMTE1NzQvMTM2MDAvNjg3IDExNTgyLzEzNTk5LzY4NyAxMTU4My8xMzY0MS82ODcKK2YgMTE1ODMvMTM2NDEvNjg3IDExNjA4LzEzNjU0LzY4NyAxMTU3NC8xMzYwMC82ODcKK2YgMTE1NzIvMTM2NTUvNDAwNyAxMTYxNy8xMzYwNS80MDA3IDExNjEwLzEzNjA3LzQwMDcKK2YgMTE2MTAvMTM2MDcvMzk2NyAxMTU2NC8xMzY1Ni8zOTY3IDExNTcyLzEzNjU1LzM5NjcKK2YgMTE1NjQvMTM2NTYvNDAwOCAxMTYxMC8xMzYwNy80MDA4IDExNjExLzEzNjQ0LzQwMDgKK2YgMTE2MTEvMTM2NTcvNDAwOSAxMTU2NS8xMzU4NC80MDA5IDExNTY0LzEzNTgzLzQwMDkKK2YgMTE1NjkvMTM2NTgvNDAxMCAxMTYxNS8xMzY1OS80MDEwIDExNjE2LzEzNjYwLzQwMTAKK2YgMTE2MTYvMTM1OTgvNDAxMSAxMTU3MC8xMzY2MS80MDExIDExNTY5LzEzNjYyLzQwMTEKK2YgMTE1NjgvMTM2NjMvNDAxMiAxMTYxNC8xMzY0NS80MDEyIDExNjE1LzEzNjQ2LzQwMTIKK2YgMTE2MTUvMTM2NDYvNDAxMyAxMTU2OS8xMzY2Mi80MDEzIDExNTY4LzEzNjYzLzQwMTMKK2YgMTE1NjcvMTM2NjQvNDAxNCAxMTYxMy8xMzYyNi80MDE0IDExNjE0LzEzNjQ1LzQwMTQKK2YgMTE2MTQvMTM2NDUvNDAxNSAxMTU2OC8xMzY2My80MDE1IDExNTY3LzEzNjY0LzQwMTUKK2YgMTE1NjYvMTM2NjUvNDAxNiAxMTYxMi8xMzYyNy80MDE2IDExNjEzLzEzNjI2LzQwMTYKK2YgMTE2MTMvMTM2MjYvNDAxNyAxMTU2Ny8xMzY2NC80MDE3IDExNTY2LzEzNjY1LzQwMTcKK2YgMTE1NjUvMTM2NjYvNDAxOCAxMTYxMS8xMzY0NC80MDE4IDExNjEyLzEzNjI3LzQwMTgKK2YgMTE2MTIvMTM2MjcvNDAxOSAxMTU2Ni8xMzY2NS80MDE5IDExNTY1LzEzNjY2LzQwMTkKK2YgMTE2ODMvMTM2NjcvMzk4MiAxMTY3Ni8xMzY2OC8zOTgyIDExNTc2LzEzNjY5LzM5ODIKK2YgMTE1NzYvMTM2NjkvNDAyMCAxMTYyMC8xMzY3MC80MDIwIDExNjgzLzEzNjY3LzQwMjAKK2YgMTE1NzAvMTM2NjEvNDAyMSAxMTYxNi8xMzU5OC80MDIxIDExNTc0LzEzNjAwLzQwMjEKK2YgMTE1NzQvMTM2MDAvNDAyMiAxMTYxOC8xMzY3MS80MDIyIDExNTcwLzEzNjYxLzQwMjIKK2YgMTE2MTgvMTM2NzEvNDAyMyAxMTU3NC8xMzYwMC80MDIzIDExNjA4LzEzNjU0LzQwMjMKK2YgMTE2MDgvMTM2NTQvNDAyMyAxMTYyMi8xMzY3Mi80MDIzIDExNjE4LzEzNjcxLzQwMjMKK2YgMTE2MDYvMTM2NzMvNDAyNCAxMTYyMS8xMzY1My80MDI0IDExNjE3LzEzNjA1LzQwMjQKK2YgMTE2MTcvMTM2MDUvNDAyNCAxMTU3Mi8xMzY1NS80MDI0IDExNjA2LzEzNjczLzQwMjQKK2YgMTE2MjIvMTM2NzIvNDAyMyAxMTYwOC8xMzY1NC80MDIzIDExNjg0LzEzNjE1LzQwMjMKK2YgMTE2ODQvMTM2MTUvNDAyMyAxMTY4MS8xMzY3NC80MDIzIDExNjIyLzEzNjcyLzQwMjMKK2YgMTE2ODUvMTM2MTYvNjg3IDExNTgzLzEzNjQxLzY4NyAxMTU4NC8xMzYzNC82ODcKK2YgMTE1ODQvMTM2MzQvNjg3IDExNjc5LzEzNjQ3LzY4NyAxMTY4NS8xMzYxNi82ODcKK2YgMTE2ODYvMTM2NDgvNjg3IDExNTg3LzEzNjM3LzY4NyAxMTYyMS8xMzY1My82ODcKK2YgMTE2MjEvMTM2NTMvNjg3IDExNjgzLzEzNjY3LzY4NyAxMTY4Ni8xMzY0OC82ODcKK2YgMTE2MTYvMTM1OTgvNjg3IDExNjE1LzEzNjQ2LzY4NyAxMTU4MS8xMzYxNC82ODcKK2YgMTE1ODEvMTM2MTQvNjg3IDExNTgyLzEzNTk5LzY4NyAxMTYxNi8xMzU5OC82ODcKK2YgMTE1ODkvMTM2MjUvNjg3IDExNjExLzEzNjQ0LzY4NyAxMTYxMC8xMzYwNy82ODcKK2YgMTE2MTAvMTM2MDcvNjg3IDExNTg4LzEzNjA2LzY4NyAxMTU4OS8xMzYyNS82ODcKK2YgMTE1OTMvMTM2NzUvMzk5NSAxMTU5Mi8xMzY3Ni8zOTk1IDEyMDg0LzEzNjc3LzM5OTUKK2YgMTIwODQvMTM2NzcvMzk5NSAxMjA4My8xMzY3OC8zOTk1IDExNTkzLzEzNjc1LzM5OTUKK2YgMTE1OTIvMTM2NzYvNDAyNSAxMTYwMy8xMzY3OS80MDI1IDEyMDg1LzEzNjgwLzQwMjUKK2YgMTIwODUvMTM2ODAvNDAyNSAxMjA4NC8xMzY3Ny80MDI1IDExNTkyLzEzNjc2LzQwMjUKK2YgMTE2MDMvMTM2NzkvNDAyNiAxMTYwMi8xMzY4MS80MDI2IDEyMDg2LzEzNjgyLzQwMjYKK2YgMTIwODYvMTM2ODIvNDAyNyAxMjA4NS8xMzY4MC80MDI3IDExNjAzLzEzNjc5LzQwMjcKK2YgMTE2MDIvMTM2ODEvMzk5MiAxMTYwMS8xMzY4My8zOTkyIDEyMDg3LzEzNjg0LzM5OTIKK2YgMTIwODcvMTM2ODQvMzk5MiAxMjA4Ni8xMzY4Mi8zOTkyIDExNjAyLzEzNjgxLzM5OTIKK2YgMTE2MDEvMTM2ODUvNDAyOCAxMTYwMC8xMzY4Ni80MDI4IDEyMDg4LzEzNjg3LzQwMjgKK2YgMTIwODgvMTM2ODcvNDAyOSAxMjA4Ny8xMzY4OC80MDI5IDExNjAxLzEzNjg1LzQwMjkKK2YgMTE2MDAvMTM2ODYvNDAzMCAxMTU5OS8xMzY4OS80MDMwIDEyMDg5LzEzNjkwLzQwMzAKK2YgMTIwODkvMTM2OTAvNDAzMCAxMjA4OC8xMzY4Ny80MDMwIDExNjAwLzEzNjg2LzQwMzAKK2YgMTE1OTkvMTM2OTEvMzk4OSAxMTU5OC8xMzY5Mi8zOTg5IDEyMDkwLzEzNjkzLzM5ODkKK2YgMTIwOTAvMTM2OTMvMzk4OSAxMjA4OS8xMzY5NC8zOTg5IDExNTk5LzEzNjkxLzM5ODkKK2YgMTE1OTgvMTM2OTIvNDAzMSAxMTU5Ny8xMzY5NS80MDMxIDEyMDkxLzEzNjk2LzQwMzEKK2YgMTIwOTEvMTM2OTYvNDAzMSAxMjA5MC8xMzY5My80MDMxIDExNTk4LzEzNjkyLzQwMzEKK2YgMTE1OTcvMTM2OTUvNDAzMiAxMTU5Ni8xMzY5Ny80MDMyIDEyMDkyLzEzNjk4LzQwMzIKK2YgMTIwOTIvMTM2OTgvNDAzMyAxMjA5MS8xMzY5Ni80MDMzIDExNTk3LzEzNjk1LzQwMzMKK2YgMTE1OTYvMTM2OTcvMzk4NiAxMTU5NS8xMzY5OS8zOTg2IDEyMDkzLzEzNzAwLzM5ODYKK2YgMTIwOTMvMTM3MDAvMzk4NiAxMjA5Mi8xMzY5OC8zOTg2IDExNTk2LzEzNjk3LzM5ODYKK2YgMTE1OTUvMTM3MDEvNDAzNCAxMTU5NC8xMzcwMi80MDM0IDEyMDk0LzEzNzAzLzQwMzQKK2YgMTIwOTQvMTM3MDMvNDAzNCAxMjA5My8xMzcwNC80MDM0IDExNTk1LzEzNzAxLzQwMzQKK2YgMTE1OTQvMTM3MDIvNDAzNSAxMTU5My8xMzcwNS80MDM1IDEyMDgzLzEzNzA2LzQwMzUKK2YgMTIwODMvMTM3MDYvNDAzNSAxMjA5NC8xMzcwMy80MDM1IDExNTk0LzEzNzAyLzQwMzUKK2YgMTE2ODkvMTM3MDcvNDAzNiAxMTU3OS8xMzcwOC80MDM2IDExNTc1LzEzNzA5LzQwMzYKK2YgMTE1NzUvMTM3MDkvNDAzNiAxMTY5MC8xMzcxMC80MDM2IDExNjg5LzEzNzA3LzQwMzYKK2YgMTE2OTQvMTM3MTEvMTI0MiAxMTcwMC8xMzcxMi8xMjQyIDExNjA1LzEzNzEzLzEyNDIKK2YgMTE2MDUvMTM3MTMvMTE3MiAxMTYyNC8xMzcxNC8xMTcyIDExNjk0LzEzNzExLzExNzIKK2YgMTE2MDkvMTM2NTIvMTA0MyAxMTY4Mi8xMzYwOS8xMDQzIDExNjc2LzEzNjA4LzEwNDMKK2YgMTE2NzYvMTM2MDgvMTA0MyAxMTYwNi8xMzY1MS8xMDQzIDExNjA5LzEzNjUyLzEwNDMKK2YgMTE2ODUvMTM2MTYvNjg3IDExNjg0LzEzNjE1LzY4NyAxMTYwOC8xMzY1NC82ODcKK2YgMTE2MDgvMTM2NTQvNjg3IDExNTgzLzEzNjQxLzY4NyAxMTY4NS8xMzYxNi82ODcKK2YgMTE1ODYvMTM2NDMvNjg3IDExNjgwLzEzNjIwLzY4NyAxMTY3Ny8xMzYxOS82ODcKK2YgMTE2NzcvMTM2MTkvNjg3IDExNTg1LzEzNjMzLzY4NyAxMTU4Ni8xMzY0My82ODcKK2YgMTE1NzcvMTM2MjIvNDkzIDExNjA0LzEzNzE1LzQ5MyAxMTY3OS8xMzY0Ny80OTMKK2YgMTE2NzkvMTM2NDcvNjg3IDExNjc3LzEzNjE5LzY4NyAxMTU3Ny8xMzYyMi82ODcKK2YgMTE2MjQvMTM3MTYvNjg3IDExNjA1LzEzNjIxLzY4NyAxMTY4MC8xMzYyMC82ODcKK2YgMTE2ODAvMTM2MjAvNjg3IDExNjg2LzEzNjQ4LzY4NyAxMTYyNC8xMzcxNi82ODcKK2YgMTE1NzUvMTM3MTcvMTA0NCAxMTU3OS8xMzcxOC8xMDQ0IDExNjc4LzEzNjUwLzEwNDQKK2YgMTE2NzgvMTM2NTAvMTA0NCAxMTY4MS8xMzY0OS8xMDQ0IDExNTc1LzEzNzE3LzEwNDQKK2YgMTE2MDYvMTM2NzMvNDAzNyAxMTY3Ni8xMzY2OC80MDM3IDExNjgzLzEzNjY3LzQwMzcKK2YgMTE2ODMvMTM2NjcvNDAzNyAxMTYyMS8xMzY1My80MDM3IDExNjA2LzEzNjczLzQwMzcKK2YgMTE2MTkvMTM2MTgvNDAyMyAxMTU3NS8xMzcxOS80MDIzIDExNjgxLzEzNjc0LzQwMjMKK2YgMTE2ODEvMTM2NzQvNDAzOCAxMTY4NC8xMzYxNS80MDM4IDExNjE5LzEzNjE4LzQwMzgKK2YgMTE2MDQvMTM3MTUvNDkzIDExNjIzLzEzNjE3LzQ5MyAxMTY4NS8xMzYxNi80OTMKK2YgMTE2ODUvMTM2MTYvNDkzIDExNjc5LzEzNjQ3LzQ5MyAxMTYwNC8xMzcxNS80OTMKK2YgMTE2MjAvMTM2NzAvNjg3IDExNjI0LzEzNzE2LzY4NyAxMTY4Ni8xMzY0OC82ODcKK2YgMTE2ODYvMTM2NDgvNDkzIDExNjgzLzEzNjY3LzQ5MyAxMTYyMC8xMzY3MC80OTMKK2YgMTE2OTkvMTM3MjAvNDAzNiAxMTY4OC8xMzcyMS80MDM2IDExNjg3LzEzNzIyLzQwMzYKK2YgMTE2ODcvMTM3MjIvNDAzNiAxMTcwMC8xMzcxMi80MDM2IDExNjk5LzEzNzIwLzQwMzYKK2YgMTE2MDQvMTM3MjMvMTE3MiAxMTU3Ny8xMzcyNC8xMTcyIDExNjg3LzEzNzIyLzExNzIKK2YgMTE2ODcvMTM3MjIvMTE3MiAxMTY5Ny8xMzcyNS8xMTcyIDExNjA0LzEzNzIzLzExNzIKK2YgMTE2OTYvMTM3MjYvNDAzNiAxMTY4OS8xMzcwNy80MDM2IDExNjkwLzEzNzEwLzQwMzYKK2YgMTE2OTAvMTM3MTAvNDAzNiAxMTY5NS8xMzcyNy80MDM2IDExNjk2LzEzNzI2LzQwMzYKK2YgMTE2MTkvMTM3MjgvMTE3MiAxMTY5MC8xMzcxMC8xMTcyIDExNTc1LzEzNzA5LzExNzIKK2YgMTE1NzgvMTM3MjkvNDAzNiAxMTY5Mi8xMzczMC80MDM2IDExNjkxLzEzNzMxLzQwMzYKK2YgMTE2OTEvMTM3MzEvNDAzNiAxMTU3Ni8xMzczMi80MDM2IDExNTc4LzEzNzI5LzQwMzYKK2YgMTE2OTEvMTM3MzEvMTE3MiAxMTYyMC8xMzczMy8xMTcyIDExNTc2LzEzNzMyLzExNzIKK2YgMTE2OTIvMTM3MzAvNDAzNiAxMTY5My8xMzczNC80MDM2IDExNjk0LzEzNzExLzQwMzYKK2YgMTE2OTQvMTM3MTEvNDAzNiAxMTY5MS8xMzczMS80MDM2IDExNjkyLzEzNzMwLzQwMzYKK2YgMTE2OTgvMTM3MzUvNDAzNiAxMTY5Ni8xMzcyNi80MDM2IDExNjk1LzEzNzI3LzQwMzYKK2YgMTE2OTUvMTM3MjcvNDAzNiAxMTY5Ny8xMzcyNS80MDM2IDExNjk4LzEzNzM1LzQwMzYKK2YgMTE2MjAvMTM3MzMvMTE3MiAxMTY5MS8xMzczMS8xMTcyIDExNjk0LzEzNzExLzExNzIKK2YgMTE2OTQvMTM3MTEvMTE3MiAxMTYyNC8xMzcxNC8xMTcyIDExNjIwLzEzNzMzLzExNzIKK2YgMTE2OTAvMTM3MTAvMTE3MiAxMTYxOS8xMzcyOC8xMTcyIDExNjIzLzEzNzM2LzExNzIKK2YgMTE2MjMvMTM3MzYvMTE3MiAxMTY5NS8xMzcyNy8xMTcyIDExNjkwLzEzNzEwLzExNzIKK2YgMTE2ODgvMTM3MjEvNDAzNiAxMTY5OC8xMzczNS80MDM2IDExNjk3LzEzNzI1LzQwMzYKK2YgMTE2OTcvMTM3MjUvNDAzNiAxMTY4Ny8xMzcyMi80MDM2IDExNjg4LzEzNzIxLzQwMzYKK2YgMTE2OTMvMTM3MzQvNDAzNiAxMTY5OS8xMzcyMC80MDM2IDExNzAwLzEzNzEyLzQwMzYKK2YgMTE3MDAvMTM3MTIvNDAzNiAxMTY5NC8xMzcxMS80MDM2IDExNjkzLzEzNzM0LzQwMzYKK2YgMTE2MDUvMTM3MTMvMTI0MiAxMTcwMC8xMzcxMi8xMjQyIDExNjg3LzEzNzIyLzEyNDIKK2YgMTE2ODcvMTM3MjIvMTE3MiAxMTU3Ny8xMzcyNC8xMTcyIDExNjA1LzEzNzEzLzExNzIKK2YgMTE2OTUvMTM3MjcvMTI0MyAxMTYyMy8xMzczNi8xMjQzIDExNjA0LzEzNzIzLzEyNDMKK2YgMTE2MDQvMTM3MjMvMTE3MiAxMTY5Ny8xMzcyNS8xMTcyIDExNjk1LzEzNzI3LzExNzIKK2YgMTIxMzYvMTM3MzcvNjg3IDEyMjAwLzEzNzM4LzY4NyAxMjE1Mi8xMzczOS82ODcKK2YgMTIxNTIvMTM3MzkvNjg3IDEyMTUzLzEzNzQwLzY4NyAxMjEzNi8xMzczNy82ODcKK2YgMTIwOTUvMTM3NDEvMTA2NSAxMjE4NC8xMzc0Mi8xMDY1IDEyMTEyLzEzNzQzLzEwNjUKK2YgMTIxMTIvMTM3NDMvMTA2NSAxMjE3MC8xMzc0NC8xMDY1IDEyMDk1LzEzNzQxLzEwNjUKK2YgMTIwOTYvMTM3NDUvMTA0MyAxMjA5NS8xMzc0MS8xMDQzIDEyMTcwLzEzNzQ0LzEwNDMKK2YgMTIxNzAvMTM3NDQvMTA0MyAxMjE3MS8xMzc0Ni8xMDQzIDEyMDk2LzEzNzQ1LzEwNDMKK2YgMTIwOTcvMTM3NDcvMTA0MyAxMjA5Ni8xMzc0NS8xMDQzIDEyMTcxLzEzNzQ2LzEwNDMKK2YgMTIxNzEvMTM3NDYvMTA0MyAxMjE3Mi8xMzc0OC8xMDQzIDEyMDk3LzEzNzQ3LzEwNDMKK2YgMTIwOTgvMTM3NDkvMTA0MyAxMjA5Ny8xMzc0Ny8xMDQzIDEyMTcyLzEzNzQ4LzEwNDMKK2YgMTIxNzIvMTM3NDgvMTA0MyAxMjE3My8xMzc1MC8xMDQzIDEyMDk4LzEzNzQ5LzEwNDMKK2YgMTIxNjQvMTM3NTEvMTA0MyAxMjA5OC8xMzc0OS8xMDQzIDEyMTczLzEzNzUwLzEwNDMKK2YgMTIxNzMvMTM3NTAvMTA0MyAxMjE3NC8xMzc1Mi8xMDQzIDEyMTY0LzEzNzUxLzEwNDMKK2YgMTIxNjUvMTM3NTMvMTA4MSAxMjE2NC8xMzc1MS8xMDgxIDEyMTc0LzEzNzUyLzEwODEKK2YgMTIxNzQvMTM3NTIvMTA4MSAxMjExMy8xMzc1NC8xMDgxIDEyMTY1LzEzNzUzLzEwODEKK2YgMTIwOTkvMTM3NTUvNDAzOSAxMjE2NS8xMzc1My80MDM5IDEyMTEzLzEzNzU0LzQwMzkKK2YgMTIxMTMvMTM3NTQvNDAzOSAxMjExNC8xMzc1Ni80MDM5IDEyMDk5LzEzNzU1LzQwMzkKK2YgMTIxNjYvMTM3NTcvMzk2NCAxMjA5OS8xMzc1OC8zOTY0IDEyMTE0LzEzNzU5LzM5NjQKK2YgMTIxMTQvMTM3NTkvNDA0MCAxMjExNS8xMzc2MC80MDQwIDEyMTY2LzEzNzU3LzQwNDAKK2YgMTIxNjcvMTM3NjEvNDA0MSAxMjE2Ni8xMzc1Ny80MDQxIDEyMTE1LzEzNzYwLzQwNDEKK2YgMTIxMTUvMTM3NjAvNDA0MiAxMjE3NS8xMzc2Mi80MDQyIDEyMTY3LzEzNzYxLzQwNDIKK2YgMTIxMDAvMTM3NjMvMzk2MiAxMjE2Ny8xMzc2MS8zOTYyIDEyMTc1LzEzNzYyLzM5NjIKK2YgMTIxNzUvMTM3NjIvMzk2MiAxMjE3Ni8xMzc2NC8zOTYyIDEyMTAwLzEzNzYzLzM5NjIKK2YgMTIxMDEvMTM3NjUvMzk2MSAxMjEwMC8xMzc2My8zOTYxIDEyMTc2LzEzNzY0LzM5NjEKK2YgMTIxNzYvMTM3NjQvMzk2MSAxMjE3Ny8xMzc2Ni8zOTYxIDEyMTAxLzEzNzY1LzM5NjEKK2YgMTIxMDIvMTM3NjcvMzk2MCAxMjEwMS8xMzc2OC8zOTYwIDEyMTc3LzEzNzY5LzM5NjAKK2YgMTIxNzcvMTM3NjkvMzk2MCAxMjExNi8xMzc3MC8zOTYwIDEyMTAyLzEzNzY3LzM5NjAKK2YgMTIxMDMvMTM3NzEvMTA0NCAxMjEwMi8xMzc2Ny8xMDQ0IDEyMTE2LzEzNzcwLzEwNDQKK2YgMTIxMTYvMTM3NzAvMTA0NCAxMjE3OC8xMzc3Mi8xMDQ0IDEyMTAzLzEzNzcxLzEwNDQKK2YgMTIxMDQvMTM3NzMvMTA0NCAxMjEwMy8xMzc3MS8xMDQ0IDEyMTc4LzEzNzcyLzEwNDQKK2YgMTIxNzgvMTM3NzIvMTA0NCAxMjExNy8xMzc3NC8xMDQ0IDEyMTA0LzEzNzczLzEwNDQKK2YgMTIxNjgvMTM3NzUvMTA0NCAxMjEwNC8xMzc3My8xMDQ0IDEyMTE3LzEzNzc0LzEwNDQKK2YgMTIxMTcvMTM3NzQvMTA0NCAxMjE3OS8xMzc3Ni8xMDQ0IDEyMTY4LzEzNzc1LzEwNDQKK2YgMTIxMDUvMTM3NzcvMTA0NCAxMjE2OC8xMzc3NS8xMDQ0IDEyMTc5LzEzNzc2LzEwNDQKK2YgMTIxNzkvMTM3NzYvMTA0NCAxMjExOC8xMzc3OC8xMDQ0IDEyMTA1LzEzNzc3LzEwNDQKK2YgMTIxMDYvMTM3NzkvMTA0NCAxMjEwNS8xMzc3Ny8xMDQ0IDEyMTE4LzEzNzc4LzEwNDQKK2YgMTIxMTgvMTM3NzgvMTA0NCAxMjE4MC8xMzc4MC8xMDQ0IDEyMTA2LzEzNzc5LzEwNDQKK2YgMTIxMDcvMTM3ODEvMTA0NCAxMjEwNi8xMzc3OS8xMDQ0IDEyMTgwLzEzNzgwLzEwNDQKK2YgMTIxODAvMTM3ODAvMTA0NCAxMjExOS8xMzc4Mi8xMDQ0IDEyMTA3LzEzNzgxLzEwNDQKK2YgMTIxMDgvMTM3ODMvNDAwMSAxMjEwNy8xMzc4MS80MDAxIDEyMTE5LzEzNzgyLzQwMDEKK2YgMTIxMTkvMTM3ODIvNDAwMSAxMjE4MS8xMzc4NC80MDAxIDEyMTA4LzEzNzgzLzQwMDEKK2YgMTIxNjkvMTM3ODUvNDAwMyAxMjEwOC8xMzc4Ni80MDAzIDEyMTgxLzEzNzg3LzQwMDMKK2YgMTIxODEvMTM3ODcvNDAwMyAxMjE4Mi8xMzc4OC80MDAzIDEyMTY5LzEzNzg1LzQwMDMKK2YgMTIxMDkvMTM3ODkvNDA0MyAxMjE2OS8xMzc4NS80MDQzIDEyMTgyLzEzNzg4LzQwNDMKK2YgMTIxODIvMTM3ODgvNDA0MyAxMjE4My8xMzc5MC80MDQzIDEyMTA5LzEzNzg5LzQwNDMKK2YgMTIxMTAvMTM3OTEvNDAwNSAxMjEwOS8xMzc4OS80MDA1IDEyMTgzLzEzNzkwLzQwMDUKK2YgMTIxODMvMTM3OTAvNDAwNSAxMjEyMC8xMzc5Mi80MDA1IDEyMTEwLzEzNzkxLzQwMDUKK2YgMTIxMzUvMTM3OTMvNDAwNiAxMjExMC8xMzc5MS80MDA2IDEyMTIwLzEzNzkyLzQwMDYKK2YgMTIxMjAvMTM3OTIvNDAwNiAxMjEyMS8xMzc5NC80MDA2IDEyMTM1LzEzNzkzLzQwMDYKK2YgMTIxODQvMTM3NDIvNDAwMCAxMjEzNS8xMzc5NS80MDAwIDEyMTIxLzEzNzk2LzQwMDAKK2YgMTIxMjEvMTM3OTYvNDAwMCAxMjExMi8xMzc0My80MDAwIDEyMTg0LzEzNzQyLzQwMDAKK2YgMTIxNjMvMTM3OTcvNDA0NCAxMjE4NC8xMzc5OC80MDQ0IDEyMDk1LzEzNzk5LzQwNDQKK2YgMTIwOTUvMTM3OTkvNDA0NCAxMjEyMi8xMzgwMC80MDQ0IDEyMTYzLzEzNzk3LzQwNDQKK2YgMTIxMjIvMTM4MDAvNDA0NSAxMjA5NS8xMzc5OS80MDQ1IDEyMDk2LzEzODAxLzQwNDUKK2YgMTIwOTYvMTM4MDEvNDA0NSAxMjE4NS8xMzgwMi80MDQ1IDEyMTIyLzEzODAwLzQwNDUKK2YgMTIxODUvMTM4MDIvNDA0NSAxMjA5Ni8xMzgwMS80MDQ1IDEyMDk3LzEzODAzLzQwNDUKK2YgMTIwOTcvMTM4MDMvNDA0NSAxMjEyMy8xMzgwNC80MDQ1IDEyMTg1LzEzODAyLzQwNDUKK2YgMTIxMjMvMTM4MDQvNDA0NSAxMjA5Ny8xMzgwMy80MDQ1IDEyMDk4LzEzODA1LzQwNDUKK2YgMTIwOTgvMTM4MDUvNDA0NSAxMjEyNC8xMzgwNi80MDQ1IDEyMTIzLzEzODA0LzQwNDUKK2YgMTIxMjQvMTM4MDYvNDA0NSAxMjA5OC8xMzgwNS80MDQ1IDEyMTY0LzEzODA3LzQwNDUKK2YgMTIxNjQvMTM4MDcvNDA0NSAxMjE4Ni8xMzgwOC80MDQ1IDEyMTI0LzEzODA2LzQwNDUKK2YgMTIxODYvMTM4MDgvNDA0NiAxMjE2NC8xMzgwNy80MDQ2IDEyMTY1LzEzODA5LzQwNDYKK2YgMTIxNjUvMTM4MDkvNDA0NiAxMjE4Ny8xMzgxMC80MDQ2IDEyMTg2LzEzODA4LzQwNDYKK2YgMTIxODcvMTM4MTAvNDA0NyAxMjE2NS8xMzgwOS80MDQ3IDEyMDk5LzEzODExLzQwNDcKK2YgMTIwOTkvMTM4MTEvNDA0NyAxMjE4OC8xMzgxMi80MDQ3IDEyMTg3LzEzODEwLzQwNDcKK2YgMTIxODgvMTM4MTIvNDA0OCAxMjA5OS8xMzgxMS80MDQ4IDEyMTY2LzEzODEzLzQwNDgKK2YgMTIxNjYvMTM4MTMvNDA0OCAxMjEyNS8xMzgxNC80MDQ4IDEyMTg4LzEzODEyLzQwNDgKK2YgMTIxMjUvMTM4MTQvNDA0OSAxMjE2Ni8xMzgxMy80MDQ5IDEyMTY3LzEzODE1LzQwNDkKK2YgMTIxNjcvMTM4MTUvNDA0OSAxMjEyNi8xMzgxNi80MDQ5IDEyMTI1LzEzODE0LzQwNDkKK2YgMTIxMjYvMTM4MTYvNDA1MCAxMjE2Ny8xMzgxNS80MDUwIDEyMTAwLzEzODE3LzQwNTAKK2YgMTIxMDAvMTM4MTcvNDA1MCAxMjEyNy8xMzgxOC80MDUwIDEyMTI2LzEzODE2LzQwNTAKK2YgMTIxMjcvMTM4MTgvNDA1MSAxMjEwMC8xMzgxNy80MDUxIDEyMTAxLzEzODE5LzQwNTEKK2YgMTIxMDEvMTM4MTkvNDA1MSAxMjEyOC8xMzgyMC80MDUxIDEyMTI3LzEzODE4LzQwNTEKK2YgMTIxMjgvMTM4MjAvNDA1MiAxMjEwMS8xMzgxOS80MDUyIDEyMTAyLzEzODIxLzQwNTIKK2YgMTIxMDIvMTM4MjEvNDA1MiAxMjEyOS8xMzgyMi80MDUyIDEyMTI4LzEzODIwLzQwNTIKK2YgMTIxMjkvMTM4MjIvNDA1MyAxMjEwMi8xMzgyMS80MDUzIDEyMTAzLzEzODIzLzQwNTMKK2YgMTIxMDMvMTM4MjMvNDA1MyAxMjE4OS8xMzgyNC80MDUzIDEyMTI5LzEzODIyLzQwNTMKK2YgMTIxODkvMTM4MjQvNDA1MyAxMjEwMy8xMzgyMy80MDUzIDEyMTA0LzEzODI1LzQwNTMKK2YgMTIxMDQvMTM4MjUvNDA1MyAxMjEzMC8xMzgyNi80MDUzIDEyMTg5LzEzODI0LzQwNTMKK2YgMTIxMzAvMTM4MjYvNDA1MyAxMjEwNC8xMzgyNS80MDUzIDEyMTY4LzEzODI3LzQwNTMKK2YgMTIxNjgvMTM4MjcvNDA1MyAxMjE5MC8xMzgyOC80MDUzIDEyMTMwLzEzODI2LzQwNTMKK2YgMTIxOTAvMTM4MjgvNDA1MyAxMjE2OC8xMzgyNy80MDUzIDEyMTA1LzEzODI5LzQwNTMKK2YgMTIxMDUvMTM4MjkvNDA1MyAxMjEzMS8xMzgzMC80MDUzIDEyMTkwLzEzODI4LzQwNTMKK2YgMTIxMzEvMTM4MzAvNDA1MyAxMjEwNS8xMzgyOS80MDUzIDEyMTA2LzEzODMxLzQwNTMKK2YgMTIxMDYvMTM4MzEvNDA1MyAxMjE5MS8xMzgzMi80MDUzIDEyMTMxLzEzODMwLzQwNTMKK2YgMTIxOTEvMTM4MzIvNDA1MyAxMjEwNi8xMzgzMS80MDUzIDEyMTA3LzEzODMzLzQwNTMKK2YgMTIxMDcvMTM4MzMvNDA1MyAxMjE5Mi8xMzgzNC80MDUzIDEyMTkxLzEzODMyLzQwNTMKK2YgMTIxOTIvMTM4MzQvNDA1NCAxMjEwNy8xMzgzMy80MDU0IDEyMTA4LzEzODM1LzQwNTQKK2YgMTIxMDgvMTM4MzUvNDA1NCAxMjEzMi8xMzgzNi80MDU0IDEyMTkyLzEzODM0LzQwNTQKK2YgMTIxMzIvMTM4MzYvNDA1NSAxMjEwOC8xMzgzNS80MDU1IDEyMTY5LzEzODM3LzQwNTUKK2YgMTIxNjkvMTM4MzcvNDA1NSAxMjE5My8xMzgzOC80MDU1IDEyMTMyLzEzODM2LzQwNTUKK2YgMTIxOTMvMTM4MzgvNDA1NiAxMjE2OS8xMzgzNy80MDU2IDEyMTA5LzEzODM5LzQwNTYKK2YgMTIxMDkvMTM4MzkvNDA1NiAxMjEzMy8xMzg0MC80MDU2IDEyMTkzLzEzODM4LzQwNTYKK2YgMTIxMzMvMTM4NDAvNDA1NyAxMjEwOS8xMzgzOS80MDU3IDEyMTEwLzEzODQxLzQwNTcKK2YgMTIxMTAvMTM4NDEvNDA1NyAxMjEzNC8xMzg0Mi80MDU3IDEyMTMzLzEzODQwLzQwNTcKK2YgMTIxMzQvMTM4NDIvNDA1OCAxMjExMC8xMzg0MS80MDU4IDEyMTM1LzEzODQzLzQwNTgKK2YgMTIxMzUvMTM4NDMvNDA1OCAxMjExMS8xMzg0NC80MDU4IDEyMTM0LzEzODQyLzQwNTgKK2YgMTIxMTEvMTM4NDQvNDA1OSAxMjEzNS8xMzg0My80MDU5IDEyMTg0LzEzNzk4LzQwNTkKK2YgMTIxODQvMTM3OTgvNDA1OSAxMjE2My8xMzc5Ny80MDU5IDEyMTExLzEzODQ0LzQwNTkKK2YgMTIxNjMvMTM3OTcvNjg3IDEyMTIyLzEzODAwLzY4NyAxMjEzNy8xMzg0NS82ODcKK2YgMTIxMzcvMTM4NDUvNjg3IDEyMTM2LzEzNzM3LzY4NyAxMjE2My8xMzc5Ny82ODcKK2YgMTIxMjIvMTM4MDAvNjg3IDEyMTg1LzEzODAyLzY4NyAxMjEzOC8xMzg0Ni82ODcKK2YgMTIxMzgvMTM4NDYvNjg3IDEyMTM3LzEzODQ1LzY4NyAxMjEyMi8xMzgwMC82ODcKK2YgMTIxODUvMTM4MDIvNjg3IDEyMTIzLzEzODA0LzY4NyAxMjEzOS8xMzg0Ny82ODcKK2YgMTIxMzkvMTM4NDcvNjg3IDEyMTM4LzEzODQ2LzY4NyAxMjE4NS8xMzgwMi82ODcKK2YgMTIxMjMvMTM4MDQvNjg3IDEyMTI0LzEzODA2LzY4NyAxMjE0MC8xMzg0OC82ODcKK2YgMTIxNDAvMTM4NDgvNjg3IDEyMTM5LzEzODQ3LzY4NyAxMjEyMy8xMzgwNC82ODcKK2YgMTIxMjQvMTM4MDYvNjg3IDEyMTg2LzEzODA4LzY4NyAxMjE5NC8xMzg0OS82ODcKK2YgMTIxOTQvMTM4NDkvNjg3IDEyMTQwLzEzODQ4LzY4NyAxMjEyNC8xMzgwNi82ODcKK2YgMTIxODYvMTM4MDgvNjg3IDEyMTg3LzEzODEwLzY4NyAxMjE0MS8xMzg1MC82ODcKK2YgMTIxNDEvMTM4NTAvNjg3IDEyMTk0LzEzODQ5LzY4NyAxMjE4Ni8xMzgwOC82ODcKK2YgMTIxODcvMTM4MTAvNjg3IDEyMTg4LzEzODEyLzY4NyAxMjE0Mi8xMzg1MS82ODcKK2YgMTIxNDIvMTM4NTEvNjg3IDEyMTQxLzEzODUwLzY4NyAxMjE4Ny8xMzgxMC82ODcKK2YgMTIxODgvMTM4MTIvNjg3IDEyMTI1LzEzODE0LzY4NyAxMjE5NS8xMzg1Mi82ODcKK2YgMTIxOTUvMTM4NTIvNjg3IDEyMTQyLzEzODUxLzY4NyAxMjE4OC8xMzgxMi82ODcKK2YgMTIxMjUvMTM4MTQvNjg3IDEyMTI2LzEzODE2LzY4NyAxMjE0My8xMzg1My82ODcKK2YgMTIxNDMvMTM4NTMvNjg3IDEyMTk1LzEzODUyLzY4NyAxMjEyNS8xMzgxNC82ODcKK2YgMTIxMjYvMTM4MTYvNjg3IDEyMTI3LzEzODE4LzY4NyAxMjE5Ni8xMzg1NC82ODcKK2YgMTIxOTYvMTM4NTQvNjg3IDEyMTQzLzEzODUzLzY4NyAxMjEyNi8xMzgxNi82ODcKK2YgMTIxMjcvMTM4MTgvNjg3IDEyMTI4LzEzODIwLzY4NyAxMjE0NC8xMzg1NS82ODcKK2YgMTIxNDQvMTM4NTUvNjg3IDEyMTk2LzEzODU0LzY4NyAxMjEyNy8xMzgxOC82ODcKK2YgMTIxMjgvMTM4MjAvNjg3IDEyMTI5LzEzODIyLzY4NyAxMjE0NS8xMzg1Ni82ODcKK2YgMTIxNDUvMTM4NTYvNjg3IDEyMTQ0LzEzODU1LzY4NyAxMjEyOC8xMzgyMC82ODcKK2YgMTIxMjkvMTM4MjIvNjg3IDEyMTg5LzEzODI0LzY4NyAxMjE0Ni8xMzg1Ny82ODcKK2YgMTIxNDYvMTM4NTcvNjg3IDEyMTQ1LzEzODU2LzY4NyAxMjEyOS8xMzgyMi82ODcKK2YgMTIxODkvMTM4MjQvNjg3IDEyMTMwLzEzODI2LzY4NyAxMjE5Ny8xMzg1OC82ODcKK2YgMTIxOTcvMTM4NTgvNjg3IDEyMTQ2LzEzODU3LzY4NyAxMjE4OS8xMzgyNC82ODcKK2YgMTIxMzAvMTM4MjYvNjg3IDEyMTkwLzEzODI4LzY4NyAxMjE0Ny8xMzg1OS82ODcKK2YgMTIxNDcvMTM4NTkvNjg3IDEyMTk3LzEzODU4LzY4NyAxMjEzMC8xMzgyNi82ODcKK2YgMTIxOTAvMTM4MjgvNjg3IDEyMTMxLzEzODMwLzY4NyAxMjE5OC8xMzg2MC82ODcKK2YgMTIxOTgvMTM4NjAvNjg3IDEyMTQ3LzEzODU5LzY4NyAxMjE5MC8xMzgyOC82ODcKK2YgMTIxMzEvMTM4MzAvNjg3IDEyMTkxLzEzODMyLzY4NyAxMjE0OC8xMzg2MS82ODcKK2YgMTIxNDgvMTM4NjEvNjg3IDEyMTk4LzEzODYwLzY4NyAxMjEzMS8xMzgzMC82ODcKK2YgMTIxOTEvMTM4MzIvNjg3IDEyMTkyLzEzODM0LzY4NyAxMjE0OS8xMzg2Mi82ODcKK2YgMTIxNDkvMTM4NjIvNjg3IDEyMTQ4LzEzODYxLzY4NyAxMjE5MS8xMzgzMi82ODcKK2YgMTIxOTIvMTM4MzQvNjg3IDEyMTMyLzEzODM2LzY4NyAxMjE1MC8xMzg2My82ODcKK2YgMTIxNTAvMTM4NjMvNjg3IDEyMTQ5LzEzODYyLzY4NyAxMjE5Mi8xMzgzNC82ODcKK2YgMTIxMzIvMTM4MzYvNjg3IDEyMTkzLzEzODM4LzY4NyAxMjE5OS8xMzg2NC82ODcKK2YgMTIxOTkvMTM4NjQvNjg3IDEyMTUwLzEzODYzLzY4NyAxMjEzMi8xMzgzNi82ODcKK2YgMTIxOTMvMTM4MzgvNjg3IDEyMTMzLzEzODQwLzY4NyAxMjE1MS8xMzg2NS82ODcKK2YgMTIxNTEvMTM4NjUvNjg3IDEyMTk5LzEzODY0LzY4NyAxMjE5My8xMzgzOC82ODcKK2YgMTIxMzMvMTM4NDAvNjg3IDEyMTM0LzEzODQyLzY4NyAxMjE1Mi8xMzczOS82ODcKK2YgMTIxNTIvMTM3MzkvNjg3IDEyMTUxLzEzODY1LzY4NyAxMjEzMy8xMzg0MC82ODcKK2YgMTIxMzQvMTM4NDIvNjg3IDEyMTExLzEzODQ0LzY4NyAxMjE1My8xMzc0MC82ODcKK2YgMTIxNTMvMTM3NDAvNjg3IDEyMTUyLzEzNzM5LzY4NyAxMjEzNC8xMzg0Mi82ODcKK2YgMTIxMTEvMTM4NDQvNjg3IDEyMTYzLzEzNzk3LzY4NyAxMjEzNi8xMzczNy82ODcKK2YgMTIxMzYvMTM3MzcvNjg3IDEyMTUzLzEzNzQwLzY4NyAxMjExMS8xMzg0NC82ODcKK2YgMTIxOTkvMTM4NjQvNjg3IDEyMTUxLzEzODY1LzY4NyAxMjE1NC8xMzg2Ni82ODcKK2YgMTIxNTQvMTM4NjYvNjg3IDEyMjAxLzEzODY3LzY4NyAxMjE5OS8xMzg2NC82ODcKK2YgMTIxNTQvMTM4NjYvNjg3IDEyMTUxLzEzODY1LzY4NyAxMjE1Mi8xMzczOS82ODcKK2YgMTIxNTIvMTM3MzkvNjg3IDEyMjAwLzEzNzM4LzY4NyAxMjE1NC8xMzg2Ni82ODcKK2YgMTIxNTAvMTM4NjMvNjg3IDEyMTk5LzEzODY0LzY4NyAxMjIwMS8xMzg2Ny82ODcKK2YgMTIyMDEvMTM4NjcvNjg3IDEyMTQ5LzEzODYyLzY4NyAxMjE1MC8xMzg2My82ODcKK2YgMTIxMzcvMTM4NDUvNjg3IDEyMTU1LzEzODY4LzY4NyAxMjIwMC8xMzczOC82ODcKK2YgMTIyMDAvMTM3MzgvNjg3IDEyMTM2LzEzNzM3LzY4NyAxMjEzNy8xMzg0NS82ODcKK2YgMTIxNTUvMTM4NjgvNjg3IDEyMTU2LzEzODY5LzY4NyAxMjE1NC8xMzg2Ni82ODcKK2YgMTIxNTQvMTM4NjYvNjg3IDEyMjAwLzEzNzM4LzY4NyAxMjE1NS8xMzg2OC82ODcKK2YgMTIxNTYvMTM4NjkvNjg3IDEyMjAyLzEzODcwLzY4NyAxMjIwMS8xMzg2Ny82ODcKK2YgMTIyMDEvMTM4NjcvNjg3IDEyMTU0LzEzODY2LzY4NyAxMjE1Ni8xMzg2OS82ODcKK2YgMTIyMDIvMTM4NzAvNjg3IDEyMTQ4LzEzODYxLzY4NyAxMjE0OS8xMzg2Mi82ODcKK2YgMTIxNDkvMTM4NjIvNjg3IDEyMjAxLzEzODY3LzY4NyAxMjIwMi8xMzg3MC82ODcKK2YgMTIxMzgvMTM4NDYvNjg3IDEyMjAzLzEzODcxLzY4NyAxMjE1NS8xMzg2OC82ODcKK2YgMTIxNTUvMTM4NjgvNjg3IDEyMTM3LzEzODQ1LzY4NyAxMjEzOC8xMzg0Ni82ODcKK2YgMTIyMDMvMTM4NzEvNjg3IDEyMjA0LzEzODcyLzY4NyAxMjE1Ni8xMzg2OS82ODcKK2YgMTIxNTYvMTM4NjkvNjg3IDEyMTU1LzEzODY4LzY4NyAxMjIwMy8xMzg3MS82ODcKK2YgMTIyMDQvMTM4NzIvNjg3IDEyMjA1LzEzODczLzY4NyAxMjIwMi8xMzg3MC82ODcKK2YgMTIyMDIvMTM4NzAvNjg3IDEyMTU2LzEzODY5LzY4NyAxMjIwNC8xMzg3Mi82ODcKK2YgMTIyMDUvMTM4NzMvNjg3IDEyMTk4LzEzODYwLzY4NyAxMjE0OC8xMzg2MS82ODcKK2YgMTIxNDgvMTM4NjEvNjg3IDEyMjAyLzEzODcwLzY4NyAxMjIwNS8xMzg3My82ODcKK2YgMTIxMzkvMTM4NDcvNjg3IDEyMTU3LzEzODc0LzY4NyAxMjIwMy8xMzg3MS82ODcKK2YgMTIyMDMvMTM4NzEvNjg3IDEyMTM4LzEzODQ2LzY4NyAxMjEzOS8xMzg0Ny82ODcKK2YgMTIxNTcvMTM4NzQvNjg3IDEyMTU4LzEzODc1LzY4NyAxMjIwNC8xMzg3Mi82ODcKK2YgMTIyMDQvMTM4NzIvNjg3IDEyMjAzLzEzODcxLzY4NyAxMjE1Ny8xMzg3NC82ODcKK2YgMTIxNTgvMTM4NzUvNjg3IDEyMTU5LzEzODc2LzY4NyAxMjIwNS8xMzg3My82ODcKK2YgMTIyMDUvMTM4NzMvNjg3IDEyMjA0LzEzODcyLzY4NyAxMjE1OC8xMzg3NS82ODcKK2YgMTIxNTkvMTM4NzYvNjg3IDEyMTQ3LzEzODU5LzY4NyAxMjE5OC8xMzg2MC82ODcKK2YgMTIxOTgvMTM4NjAvNjg3IDEyMjA1LzEzODczLzY4NyAxMjE1OS8xMzg3Ni82ODcKK2YgMTIxNDAvMTM4NDgvNjg3IDEyMjA2LzEzODc3LzY4NyAxMjE1Ny8xMzg3NC82ODcKK2YgMTIxNTcvMTM4NzQvNjg3IDEyMTM5LzEzODQ3LzY4NyAxMjE0MC8xMzg0OC82ODcKK2YgMTIyMDYvMTM4NzcvNjg3IDEyMTYwLzEzODc4LzY4NyAxMjE1OC8xMzg3NS82ODcKK2YgMTIxNTgvMTM4NzUvNjg3IDEyMTU3LzEzODc0LzY4NyAxMjIwNi8xMzg3Ny82ODcKK2YgMTIxNjAvMTM4NzgvNjg3IDEyMjA3LzEzODc5LzY4NyAxMjE1OS8xMzg3Ni82ODcKK2YgMTIxNTkvMTM4NzYvNjg3IDEyMTU4LzEzODc1LzY4NyAxMjE2MC8xMzg3OC82ODcKK2YgMTIyMDcvMTM4NzkvNjg3IDEyMTk3LzEzODU4LzY4NyAxMjE0Ny8xMzg1OS82ODcKK2YgMTIxNDcvMTM4NTkvNjg3IDEyMTU5LzEzODc2LzY4NyAxMjIwNy8xMzg3OS82ODcKK2YgMTIxOTQvMTM4NDkvNjg3IDEyMTYxLzEzODgwLzY4NyAxMjIwNi8xMzg3Ny82ODcKK2YgMTIyMDYvMTM4NzcvNjg3IDEyMTQwLzEzODQ4LzY4NyAxMjE5NC8xMzg0OS82ODcKK2YgMTIxNjEvMTM4ODAvNjg3IDEyMTYyLzEzODgxLzY4NyAxMjE2MC8xMzg3OC82ODcKK2YgMTIxNjAvMTM4NzgvNjg3IDEyMjA2LzEzODc3LzY4NyAxMjE2MS8xMzg4MC82ODcKK2YgMTIxNjIvMTM4ODEvNjg3IDEyMjA4LzEzODgyLzY4NyAxMjIwNy8xMzg3OS82ODcKK2YgMTIyMDcvMTM4NzkvNjg3IDEyMTYwLzEzODc4LzY4NyAxMjE2Mi8xMzg4MS82ODcKK2YgMTIyMDgvMTM4ODIvNjg3IDEyMTQ2LzEzODU3LzY4NyAxMjE5Ny8xMzg1OC82ODcKK2YgMTIxOTcvMTM4NTgvNjg3IDEyMjA3LzEzODc5LzY4NyAxMjIwOC8xMzg4Mi82ODcKK2YgMTIxNDEvMTM4NTAvNjg3IDEyMjA5LzEzODgzLzY4NyAxMjE2MS8xMzg4MC82ODcKK2YgMTIxNjEvMTM4ODAvNjg3IDEyMTk0LzEzODQ5LzY4NyAxMjE0MS8xMzg1MC82ODcKK2YgMTIyMDkvMTM4ODMvNjg3IDEyMjEwLzEzODg0LzY4NyAxMjE2Mi8xMzg4MS82ODcKK2YgMTIxNjIvMTM4ODEvNjg3IDEyMTYxLzEzODgwLzY4NyAxMjIwOS8xMzg4My82ODcKK2YgMTIyMTAvMTM4ODQvNjg3IDEyMjExLzEzODg1LzY4NyAxMjIwOC8xMzg4Mi82ODcKK2YgMTIyMDgvMTM4ODIvNjg3IDEyMTYyLzEzODgxLzY4NyAxMjIxMC8xMzg4NC82ODcKK2YgMTIyMTEvMTM4ODUvNjg3IDEyMTQ1LzEzODU2LzY4NyAxMjE0Ni8xMzg1Ny82ODcKK2YgMTIxNDYvMTM4NTcvNjg3IDEyMjA4LzEzODgyLzY4NyAxMjIxMS8xMzg4NS82ODcKK2YgMTIxNDIvMTM4NTEvNjg3IDEyMTk1LzEzODUyLzY4NyAxMjIwOS8xMzg4My82ODcKK2YgMTIyMDkvMTM4ODMvNjg3IDEyMTQxLzEzODUwLzY4NyAxMjE0Mi8xMzg1MS82ODcKK2YgMTIxOTUvMTM4NTIvNjg3IDEyMTQzLzEzODUzLzY4NyAxMjIxMC8xMzg4NC82ODcKK2YgMTIyMTAvMTM4ODQvNjg3IDEyMjA5LzEzODgzLzY4NyAxMjE5NS8xMzg1Mi82ODcKK2YgMTIyMTAvMTM4ODQvNjg3IDEyMTQzLzEzODUzLzY4NyAxMjE5Ni8xMzg1NC82ODcKK2YgMTIxOTYvMTM4NTQvNjg3IDEyMjExLzEzODg1LzY4NyAxMjIxMC8xMzg4NC82ODcKK2YgMTIyMTEvMTM4ODUvNjg3IDEyMTk2LzEzODU0LzY4NyAxMjE0NC8xMzg1NS82ODcKK2YgMTIxNDQvMTM4NTUvNjg3IDEyMTQ1LzEzODU2LzY4NyAxMjIxMS8xMzg4NS82ODcKK2YgMTEyNDQvMTM4ODYvNDA2MCAxMTIwOS8xMzg4Ny80MDYwIDExMzE1LzEzODg4LzQwNjAKK2YgMTEzMTUvMTM4ODkvNDA2MSAxMTMxOC8xMzg5MC80MDYxIDExMjQ0LzEzODkxLzQwNjEKK2YgMTEyNDEvMTM4OTIvNDA2MiAxMTI0Mi8xMzg5My80MDYyIDExMjExLzEzODk0LzQwNjIKK2YgMTEyMTEvMTM4OTQvNDA2MyAxMTI0Ny8xMzg5NS80MDYzIDExMjQxLzEzODkyLzQwNjMKK2YgMTEyNDcvMTM4OTYvNDA2NCAxMTIxMS8xMzg5Ny80MDY0IDExMjEzLzEzODk4LzQwNjQKK2YgMTEyMTMvMTM4OTgvNDA2NSAxMTI1MC8xMzg5OS80MDY1IDExMjQ3LzEzODk2LzQwNjUKK2YgMTEyMTIvMTM5MDAvNDA2NiAxMTIxMC8xMzkwMS80MDY2IDExMTk3LzEzOTAyLzQwNjYKK2YgMTExOTcvMTM5MDIvNDA2NyAxMTE5OC8xMzkwMy80MDY3IDExMjEyLzEzOTAwLzQwNjcKK2YgMTEyMTEvMTM5MDQvNDA2OCAxMTIxMC8xMzkwMS80MDY4IDExMjEyLzEzOTAwLzQwNjgKK2YgMTEyMTIvMTM5MDAvNDA2OSAxMTIxMy8xMzkwNS80MDY5IDExMjExLzEzOTA0LzQwNjkKK2YgMTEyMDcvMTM5MDYvNDA3MCAxMTMxNy8xMzkwNy80MDcwIDExMzE2LzEzOTA4LzQwNzAKK2YgMTEzMTYvMTM5MDgvNDA3MSAxMTIwOC8xMzkwOS80MDcxIDExMjA3LzEzOTA2LzQwNzEKK2YgMTEzMTQvMTM5MTAvNDA3MiAxMTMxNy8xMzkxMS80MDcyIDExMjA3LzEzOTEyLzQwNzIKK2YgMTEyMDcvMTM5MTIvNDA3MyAxMTMyOS8xMzkxMy80MDczIDExMzE0LzEzOTEwLzQwNzMKK2YgMTEyMzAvMTM5MTQvNDA3NCAxMTIwMi8xMzkxNS80MDc0IDExMzMwLzEzOTE2LzQwNzQKK2YgMTEzMzAvMTM5MTYvNDA3NSAxMTIxNC8xMzkxNy80MDc1IDExMjMwLzEzOTE0LzQwNzUKK2YgMTEyNzYvMTM5MTgvNDA3NiAxMTIzMS8xMzkxOS80MDc2IDExMjE1LzEzOTIwLzQwNzYKK2YgMTEyMTUvMTM5MjAvNDA3NyAxMTI1Mi8xMzkyMS80MDc3IDExMjc2LzEzOTE4LzQwNzcKK2YgMTEyMzEvMTM5MjIvNDA3OCAxMTIzMC8xMzkyMy80MDc4IDExMjE0LzEzOTI0LzQwNzgKK2YgMTEyMTQvMTM5MjQvNDA3OCAxMTIxNS8xMzkyNS80MDc4IDExMjMxLzEzOTIyLzQwNzgKK2YgMTEyMTQvMTM5MjYvNDA3OSAxMTMzMC8xMzkyNy80MDc5IDExMTk5LzEzOTI4LzQwNzkKK2YgMTExOTkvMTM5MjgvNDA4MCAxMTIxNi8xMzkyOS80MDgwIDExMjE0LzEzOTI2LzQwODAKK2YgMTEyNTIvMTM5MzAvNDA4MSAxMTIxNS8xMzkzMS80MDgxIDExMjE3LzEzOTMyLzQwODEKK2YgMTEyMTcvMTM5MzIvNDA4MiAxMTI1NS8xMzkzMy80MDgyIDExMjUyLzEzOTMwLzQwODIKK2YgMTEyMTUvMTM5MjUvNDA4MyAxMTIxNC8xMzkyNC80MDgzIDExMjE2LzEzOTM0LzQwODMKK2YgMTEyMTYvMTM5MzQvNDA4MyAxMTIxNy8xMzkzNS80MDgzIDExMjE1LzEzOTI1LzQwODMKK2YgMTEyMzIvMTM5MzYvNDA4NCAxMTMzMS8xMzkzNy80MDg0IDExMjAwLzEzOTM4LzQwODQKK2YgMTEyMDAvMTM5MzgvNDA3NSAxMTIxOC8xMzkzOS80MDc1IDExMjMyLzEzOTM2LzQwNzUKK2YgMTEyNzgvMTM5NDAvNDA4NSAxMTIzMy8xMzk0MS80MDg1IDExMjE5LzEzOTQyLzQwODUKK2YgMTEyMTkvMTM5NDIvNDA4NiAxMTI1OC8xMzk0My80MDg2IDExMjc4LzEzOTQwLzQwODYKK2YgMTEyMzMvMTM5NDQvNDA4NyAxMTIzMi8xMzk0NS80MDg3IDExMjE4LzEzOTQ2LzQwODcKK2YgMTEyMTgvMTM5NDYvNDA4OCAxMTIxOS8xMzk0Ny80MDg4IDExMjMzLzEzOTQ0LzQwODgKK2YgMTEyMTgvMTM5NDgvNDA4MCAxMTIwMC8xMzk0OS80MDgwIDExMjAxLzEzOTUwLzQwODAKK2YgMTEyMDEvMTM5NTAvNDA3OSAxMTIyMC8xMzk1MS80MDc5IDExMjE4LzEzOTQ4LzQwNzkKK2YgMTEyNTgvMTM5NTIvNDA4OSAxMTIxOS8xMzk1My80MDg5IDExMjIxLzEzOTU0LzQwODkKK2YgMTEyMjEvMTM5NTQvNDA5MCAxMTI2MS8xMzk1NS80MDkwIDExMjU4LzEzOTUyLzQwOTAKK2YgMTEyMTkvMTM5NDcvNDA5MSAxMTIxOC8xMzk0Ni80MDkxIDExMjIwLzEzOTU2LzQwOTEKK2YgMTEyMjAvMTM5NTYvNDA5MSAxMTIyMS8xMzk1Ny80MDkxIDExMjE5LzEzOTQ3LzQwOTEKK2YgMTEyMzQvMTM5NTgvNDA3NSAxMTMzMi8xMzk1OS80MDc1IDExMjIzLzEzOTYwLzQwNzUKK2YgMTEyMjMvMTM5NjAvNDA3NCAxMTIyMi8xMzk2MS80MDc0IDExMjM0LzEzOTU4LzQwNzQKK2YgMTEyODEvMTM5NjIvNDA5MiAxMTIzNS8xMzk2My80MDkyIDExMjI0LzEzOTY0LzQwOTIKK2YgMTEyMjQvMTM5NjQvNDA5MyAxMTI2NS8xMzk2NS80MDkzIDExMjgxLzEzOTYyLzQwOTMKK2YgMTEyMzUvMTM5NjYvNDA5NCAxMTIzNC8xMzk2Ny80MDk0IDExMjIyLzEzOTY4LzQwOTQKK2YgMTEyMjIvMTM5NjgvNDA3OCAxMTIyNC8xMzk2OS80MDc4IDExMjM1LzEzOTY2LzQwNzgKK2YgMTEyMjIvMTM5NzAvNDA5NSAxMTIyMy8xMzk3MS80MDk1IDExMzU5LzEzOTcyLzQwOTUKK2YgMTEzNTkvMTM5NzIvNDA5NiAxMTIyNS8xMzk3My80MDk2IDExMjIyLzEzOTcwLzQwOTYKK2YgMTEyNjUvMTM5NzQvNDA5NyAxMTIyNC8xMzk3NS80MDk3IDExMjI2LzEzOTc2LzQwOTcKK2YgMTEyMjYvMTM5NzYvNDA5OCAxMTI2OS8xMzk3Ny80MDk4IDExMjY1LzEzOTc0LzQwOTgKK2YgMTEyMjQvMTM5NjkvNDA4MyAxMTIyMi8xMzk2OC80MDgzIDExMjI1LzEzOTc4LzQwODMKK2YgMTEyMjUvMTM5NzgvNDA4MyAxMTIyNi8xMzk3OS80MDgzIDExMjI0LzEzOTY5LzQwODMKK2YgMTEyMzYvMTM5ODAvNDA5OSAxMTIzNy8xMzk4MS80MDk5IDExMjI4LzEzOTgyLzQwOTkKK2YgMTEyMjgvMTM5ODIvNDEwMCAxMTIyNy8xMzk4My80MTAwIDExMjM2LzEzOTgwLzQxMDAKK2YgMTEyODUvMTM5ODQvNDEwMSAxMTIzOC8xMzk4NS80MTAxIDExMjI5LzEzOTg2LzQxMDEKK2YgMTEyMjkvMTM5ODYvNDEwMiAxMTI3Mi8xMzk4Ny80MTAyIDExMjg1LzEzOTg0LzQxMDIKK2YgMTEyMzgvMTM5ODgvNDA3OCAxMTIzNi8xMzk4OS80MDc4IDExMjI3LzEzOTkwLzQwNzgKK2YgMTEyMjcvMTM5OTAvNDEwMyAxMTIyOS8xMzk5MS80MTAzIDExMjM4LzEzOTg4LzQxMDMKK2YgMTEyMzAvMTM5MjMvNjg3IDExMjEyLzEzOTkyLzY4NyAxMTE5OC8xMzk5My82ODcKK2YgMTExOTgvMTM5OTMvNjg3IDExMjAyLzEzOTk0LzY4NyAxMTIzMC8xMzkyMy82ODcKK2YgMTEyMzEvMTM5MjIvNjg3IDExMjEzLzEzOTk1LzY4NyAxMTIxMi8xMzk5Mi82ODcKK2YgMTEyMTIvMTM5OTIvNjg3IDExMjMwLzEzOTIzLzY4NyAxMTIzMS8xMzkyMi82ODcKK2YgMTEyNzYvMTM5OTYvNjg3IDExMjUwLzEzOTk3LzY4NyAxMTIxMy8xMzk5NS82ODcKK2YgMTEyMTMvMTM5OTUvNjg3IDExMjMxLzEzOTIyLzY4NyAxMTI3Ni8xMzk5Ni82ODcKK2YgMTEyMzIvMTM5NDUvMTUwNyAxMTIxNi8xMzkzNC8xNTA3IDExMTk5LzEzOTk4LzE1MDcKK2YgMTExOTkvMTM5OTgvNjg3IDExMzMxLzEzOTk5LzY4NyAxMTIzMi8xMzk0NS82ODcKK2YgMTEyNzgvMTQwMDAvNjg3IDExMjU1LzE0MDAxLzY4NyAxMTIxNy8xMzkzNS82ODcKK2YgMTEyMTcvMTM5MzUvNjg3IDExMjMzLzEzOTQ0LzY4NyAxMTI3OC8xNDAwMC82ODcKK2YgMTEyMzMvMTM5NDQvNjg3IDExMjE3LzEzOTM1LzY4NyAxMTIxNi8xMzkzNC82ODcKK2YgMTEyMTYvMTM5MzQvMzk2NSAxMTIzMi8xMzk0NS8zOTY1IDExMjMzLzEzOTQ0LzM5NjUKK2YgMTEyMzQvMTM5NjcvNjg3IDExMjIwLzEzOTU2LzY4NyAxMTIwMS8xNDAwMi82ODcKK2YgMTEyMDEvMTQwMDIvNjg3IDExMzMyLzE0MDAzLzY4NyAxMTIzNC8xMzk2Ny82ODcKK2YgMTEyODEvMTQwMDQvNjg3IDExMjYxLzE0MDA1LzY4NyAxMTIyMS8xMzk1Ny82ODcKK2YgMTEyMjEvMTM5NTcvMzk2NSAxMTIzNS8xMzk2Ni8zOTY1IDExMjgxLzE0MDA0LzM5NjUKK2YgMTEyMzUvMTM5NjYvMTUwNyAxMTIyMS8xMzk1Ny8xNTA3IDExMjIwLzEzOTU2LzE1MDcKK2YgMTEyMjAvMTM5NTYvNjg3IDExMjM0LzEzOTY3LzY4NyAxMTIzNS8xMzk2Ni82ODcKK2YgMTEyMzYvMTM5ODkvNjg3IDExMjI1LzEzOTc4LzY4NyAxMTM1OS8xNDAwNi82ODcKK2YgMTEzNTkvMTQwMDYvNjg3IDExMjM3LzE0MDA3LzY4NyAxMTIzNi8xMzk4OS82ODcKK2YgMTEyODUvMTQwMDgvNjg3IDExMjY5LzE0MDA5LzY4NyAxMTIyNi8xMzk3OS82ODcKK2YgMTEyMjYvMTM5NzkvMzk2NSAxMTIzOC8xMzk4OC8zOTY1IDExMjg1LzE0MDA4LzM5NjUKK2YgMTEyMzgvMTM5ODgvMTUwNyAxMTIyNi8xMzk3OS8xNTA3IDExMjI1LzEzOTc4LzE1MDcKK2YgMTEyMjUvMTM5NzgvNjg3IDExMjM2LzEzOTg5LzY4NyAxMTIzOC8xMzk4OC82ODcKK2YgMTEyMjcvMTM5OTAvNDEwNCAxMTIyOC8xNDAxMC80MTA0IDExMzcyLzE0MDExLzQxMDQKK2YgMTEzNzIvMTQwMTEvNDEwNCAxMTIzOS8xNDAxMi80MTA0IDExMjI3LzEzOTkwLzQxMDQKK2YgMTEyNzIvMTQwMTMvNDEwNSAxMTIyOS8xMzk5MS80MTA1IDExMjQwLzE0MDE0LzQxMDUKK2YgMTEyNDAvMTQwMTQvNDEwNiAxMTI4OS8xNDAxNS80MTA2IDExMjcyLzE0MDEzLzQxMDYKK2YgMTEyMjkvMTM5OTEvNDEwNyAxMTIyNy8xMzk5MC80MTA3IDExMjM5LzE0MDEyLzQxMDcKK2YgMTEyMzkvMTQwMTIvNDEwOCAxMTI0MC8xNDAxNC80MTA4IDExMjI5LzEzOTkxLzQxMDgKK2YgMTEzNzIvMTQwMTEvNDkzIDExMzc0LzE0MDE2LzQ5MyAxMTI0MC8xNDAxNC80OTMKK2YgMTEyNDAvMTQwMTQvNDEwOSAxMTIzOS8xNDAxMi80MTA5IDExMzcyLzE0MDExLzQxMDkKK2YgMTEzNzQvMTQwMTYvNjg3IDExNDIyLzE0MDE3LzY4NyAxMTI4OS8xNDAxNS82ODcKK2YgMTEyODkvMTQwMTUvNjg3IDExMjQwLzE0MDE0LzY4NyAxMTM3NC8xNDAxNi82ODcKK2YgMTEzMTYvMTM5MDgvNjg3IDExMjQyLzE0MDE4LzY4NyAxMTI0MS8xNDAxOS82ODcKK2YgMTEyNDEvMTQwMTkvMzk2NSAxMTMxNS8xMzg4OS8zOTY1IDExMzE2LzEzOTA4LzM5NjUKK2YgMTEyMTAvMTQwMjAvNDExMCAxMTIxMS8xNDAyMS80MTEwIDExMjQyLzE0MDE4LzQxMTAKK2YgMTEyNDIvMTQwMTgvNDExMSAxMTI0My8xNDAyMi80MTExIDExMjEwLzE0MDIwLzQxMTEKK2YgMTExOTcvMTQwMjMvNDExMiAxMTIxMC8xNDAyNC80MTEyIDExMjQzLzE0MDI1LzQxMTIKK2YgMTEyNDMvMTQwMjUvNDExMyAxMTIwMy8xNDAyNi80MTEzIDExMTk3LzE0MDIzLzQxMTMKK2YgMTEyOTYvMTQwMjcvNDExNCAxMTMyOC8xNDAyOC80MTE0IDExMzE5LzE0MDI5LzQxMTQKK2YgMTEyNDEvMTM4OTIvNDExNSAxMTI0Ny8xMzg5NS80MTE1IDExMjQ2LzE0MDMwLzQxMTUKK2YgMTEyNDYvMTQwMzAvNDExNiAxMTI5Mi8xNDAzMS80MTE2IDExMjQxLzEzODkyLzQxMTYKK2YgMTEyNDcvMTM4OTYvNDExNyAxMTI1MC8xMzg5OS80MTE3IDExMjQ5LzE0MDMyLzQxMTcKK2YgMTEyNDkvMTQwMzIvNDExOCAxMTI0Ni8xNDAzMy80MTE4IDExMjQ3LzEzODk2LzQxMTgKK2YgMTEyNDgvMTQwMzQvNDExOSAxMTMzMy8xNDAzNS80MTE5IDExMjA0LzE0MDM2LzQxMTkKK2YgMTEyMDQvMTQwMzYvNDEyMCAxMTI0NS8xNDAzNy80MTIwIDExMjQ4LzE0MDM0LzQxMjAKK2YgMTEyNDYvMTQwMzgvNDEyMSAxMTI0OS8xNDAzOS80MTIxIDExMjQ4LzE0MDM0LzQxMjEKK2YgMTEyNDgvMTQwMzQvNDEyMiAxMTI0NS8xNDAzNy80MTIyIDExMjQ2LzE0MDM4LzQxMjIKK2YgMTEyNzQvMTQwNDAvNDEyMyAxMTI1MS8xNDA0MS80MTIzIDExMzM0LzE0MDQyLzQxMjMKK2YgMTEzMzQvMTQwNDIvNDEyNCAxMTMzNy8xNDA0My80MTI0IDExMjc0LzE0MDQwLzQxMjQKK2YgMTEyNzYvMTM5MTgvNDEyNSAxMTI1Mi8xMzkyMS80MTI1IDExMjUzLzE0MDQ0LzQxMjUKK2YgMTEyNTMvMTQwNDQvNDEyNiAxMTI3NS8xNDA0NS80MTI2IDExMjc2LzEzOTE4LzQxMjYKK2YgMTEyNzUvMTQwNDYvNDEyNyAxMTI1My8xNDA0Ny80MTI3IDExMjUxLzE0MDQ4LzQxMjcKK2YgMTEyNTEvMTQwNDgvNDEyNyAxMTI3NC8xNDA0OS80MTI3IDExMjc1LzE0MDQ2LzQxMjcKK2YgMTEyNTEvMTQwNTAvNDEyOCAxMTI1NC8xNDA1MS80MTI4IDExMzM1LzE0MDUyLzQxMjgKK2YgMTEzMzUvMTQwNTIvNDEyOCAxMTMzNC8xNDA1My80MTI4IDExMjUxLzE0MDUwLzQxMjgKK2YgMTEyNTIvMTM5MzAvNDEyOSAxMTI1NS8xMzkzMy80MTI5IDExMjU2LzE0MDU0LzQxMjkKK2YgMTEyNTYvMTQwNTQvNDEzMCAxMTI1My8xNDA1NS80MTMwIDExMjUyLzEzOTMwLzQxMzAKK2YgMTEyNTMvMTQwNDcvNDEzMSAxMTI1Ni8xNDA1Ni80MTMxIDExMjU0LzE0MDU3LzQxMzEKK2YgMTEyNTQvMTQwNTcvNDEzMiAxMTI1MS8xNDA0OC80MTMyIDExMjUzLzE0MDQ3LzQxMzIKK2YgMTEyNzcvMTQwNTgvNDEzMyAxMTI1Ny8xNDA1OS80MTMzIDExMzM2LzE0MDYwLzQxMzMKK2YgMTEzMzYvMTQwNjAvNDEzNCAxMTIwNi8xNDA2MS80MTM0IDExMjc3LzE0MDU4LzQxMzQKK2YgMTEyNzgvMTM5NDAvNDEzNSAxMTI1OC8xMzk0My80MTM1IDExMjU5LzE0MDYyLzQxMzUKK2YgMTEyNTkvMTQwNjIvNDEzNiAxMTI3OS8xNDA2My80MTM2IDExMjc4LzEzOTQwLzQxMzYKK2YgMTEyNzkvMTQwNjQvNDEzNyAxMTI1OS8xNDA2NS80MTM3IDExMjU3LzE0MDY2LzQxMzcKK2YgMTEyNTcvMTQwNjYvNDEzOCAxMTI3Ny8xNDA2Ny80MTM4IDExMjc5LzE0MDY0LzQxMzgKK2YgMTEyNTcvMTQwNjgvNDEzOSAxMTI2MC8xNDA2OS80MTM5IDExMjA1LzE0MDcwLzQxMzkKK2YgMTEyMDUvMTQwNzAvNDE0MCAxMTMzNi8xNDA3MS80MTQwIDExMjU3LzE0MDY4LzQxNDAKK2YgMTEyNTgvMTM5NTIvNDE0MSAxMTI2MS8xMzk1NS80MTQxIDExMjYyLzE0MDcyLzQxNDEKK2YgMTEyNjIvMTQwNzIvNDE0MiAxMTI1OS8xNDA3My80MTQyIDExMjU4LzEzOTUyLzQxNDIKK2YgMTEyNTkvMTQwNjUvNDEzMSAxMTI2Mi8xNDA3NC80MTMxIDExMjYwLzE0MDc1LzQxMzEKK2YgMTEyNjAvMTQwNzUvNDE0MyAxMTI1Ny8xNDA2Ni80MTQzIDExMjU5LzE0MDY1LzQxNDMKK2YgMTEyODAvMTQwNzYvNDE0NCAxMTI2My8xNDA3Ny80MTQ0IDExMjY0LzE0MDc4LzQxNDQKK2YgMTEyNjQvMTQwNzgvNDEyNCAxMTMzOC8xNDA3OS80MTI0IDExMjgwLzE0MDc2LzQxMjQKK2YgMTEyODEvMTM5NjIvNDE0NSAxMTI2NS8xMzk2NS80MTQ1IDExMjY2LzE0MDgwLzQxNDUKK2YgMTEyNjYvMTQwODAvNDE0NiAxMTI4Mi8xNDA4MS80MTQ2IDExMjgxLzEzOTYyLzQxNDYKK2YgMTEyODIvMTQwODIvNDEzOCAxMTI2Ni8xNDA4My80MTM4IDExMjYzLzE0MDg0LzQxMzgKK2YgMTEyNjMvMTQwODQvNDE0NyAxMTI4MC8xNDA4NS80MTQ3IDExMjgyLzE0MDgyLzQxNDcKK2YgMTEyNjMvMTQwODYvNDEzOSAxMTI2Ny8xNDA4Ny80MTM5IDExMjY4LzE0MDg4LzQxMzkKK2YgMTEyNjgvMTQwODgvNDE0OCAxMTI2NC8xNDA4OS80MTQ4IDExMjYzLzE0MDg2LzQxNDgKK2YgMTEyNjUvMTM5NzQvNDE0OSAxMTI2OS8xMzk3Ny80MTQ5IDExMjcwLzE0MDkwLzQxNDkKK2YgMTEyNzAvMTQwOTAvNDE1MCAxMTI2Ni8xNDA5MS80MTUwIDExMjY1LzEzOTc0LzQxNTAKK2YgMTEyNjYvMTQwODMvNDE1MSAxMTI3MC8xNDA5Mi80MTUxIDExMjY3LzE0MDkzLzQxNTEKK2YgMTEyNjcvMTQwOTMvNDE0MyAxMTI2My8xNDA4NC80MTQzIDExMjY2LzE0MDgzLzQxNDMKK2YgMTEyODMvMTQwOTQvNDE1MiAxMTI3MS8xNDA5NS80MTUyIDExNDA0LzE0MDk2LzQxNTIKK2YgMTE0MDQvMTQwOTYvNDE1MiAxMTI4NC8xNDA5Ny80MTUyIDExMjgzLzE0MDk0LzQxNTIKK2YgMTEyODUvMTM5ODQvNDE1MyAxMTI3Mi8xMzk4Ny80MTUzIDExMjczLzE0MDk4LzQxNTMKK2YgMTEyNzMvMTQwOTgvNDE1NCAxMTI4Ni8xNDA5OS80MTU0IDExMjg1LzEzOTg0LzQxNTQKK2YgMTEyODYvMTQxMDAvNDEyNyAxMTI3My8xNDEwMS80MTI3IDExMjcxLzE0MTAyLzQxMjcKK2YgMTEyNzEvMTQxMDIvNDEyNyAxMTI4My8xNDEwMy80MTI3IDExMjg2LzE0MTAwLzQxMjcKK2YgMTEyNzQvMTQwNDkvNjg3IDExMzM3LzE0MTA0LzY4NyAxMTMzMy8xNDEwNS82ODcKK2YgMTEzMzMvMTQxMDUvNjg3IDExMjQ4LzE0MTA2LzY4NyAxMTI3NC8xNDA0OS82ODcKK2YgMTEyNzUvMTQwNDYvNjg3IDExMjc0LzE0MDQ5LzY4NyAxMTI0OC8xNDEwNi82ODcKK2YgMTEyNDgvMTQxMDYvNjg3IDExMjQ5LzE0MTA3LzY4NyAxMTI3NS8xNDA0Ni82ODcKK2YgMTEyNzYvMTM5OTYvNjg3IDExMjc1LzE0MDQ2LzY4NyAxMTI0OS8xNDEwNy82ODcKK2YgMTEyNDkvMTQxMDcvNjg3IDExMjUwLzEzOTk3LzY4NyAxMTI3Ni8xMzk5Ni82ODcKK2YgMTEyNzcvMTQwNjcvNjg3IDExMjA2LzE0MTA4LzY4NyAxMTMzNS8xNDEwOS82ODcKK2YgMTEzMzUvMTQxMDkvNjg3IDExMjU0LzE0MDU3LzY4NyAxMTI3Ny8xNDA2Ny82ODcKK2YgMTEyNzgvMTQwMDAvMjk1NiAxMTI3OS8xNDA2NC8yOTU2IDExMjU2LzE0MDU2LzI5NTYKK2YgMTEyNTYvMTQwNTYvNjg3IDExMjU1LzE0MDAxLzY4NyAxMTI3OC8xNDAwMC82ODcKK2YgMTEyNzkvMTQwNjQvNjg3IDExMjc3LzE0MDY3LzY4NyAxMTI1NC8xNDA1Ny82ODcKK2YgMTEyNTQvMTQwNTcvNDE1NSAxMTI1Ni8xNDA1Ni80MTU1IDExMjc5LzE0MDY0LzQxNTUKK2YgMTEyODAvMTQwODUvNjg3IDExMzM4LzE0MTEwLzY4NyAxMTIwNS8xNDExMS82ODcKK2YgMTEyMDUvMTQxMTEvNjg3IDExMjYwLzE0MDc1LzY4NyAxMTI4MC8xNDA4NS82ODcKK2YgMTEyODEvMTQwMDQvNjg3IDExMjgyLzE0MDgyLzY4NyAxMTI2Mi8xNDA3NC82ODcKK2YgMTEyNjIvMTQwNzQvNjg3IDExMjYxLzE0MDA1LzY4NyAxMTI4MS8xNDAwNC82ODcKK2YgMTEyODIvMTQwODIvNjg3IDExMjgwLzE0MDg1LzY4NyAxMTI2MC8xNDA3NS82ODcKK2YgMTEyNjAvMTQwNzUvNjg3IDExMjYyLzE0MDc0LzY4NyAxMTI4Mi8xNDA4Mi82ODcKK2YgMTEyODMvMTQxMDMvNjg3IDExMjg0LzE0MTEyLzY4NyAxMTI2OC8xNDExMy82ODcKK2YgMTEyNjgvMTQxMTMvNjg3IDExMjY3LzE0MDkzLzY4NyAxMTI4My8xNDEwMy82ODcKK2YgMTEyODUvMTQwMDgvNjg3IDExMjg2LzE0MTAwLzY4NyAxMTI3MC8xNDA5Mi82ODcKK2YgMTEyNzAvMTQwOTIvNjg3IDExMjY5LzE0MDA5LzY4NyAxMTI4NS8xNDAwOC82ODcKK2YgMTEyODYvMTQxMDAvNjg3IDExMjgzLzE0MTAzLzY4NyAxMTI2Ny8xNDA5My82ODcKK2YgMTEyNjcvMTQwOTMvNjg3IDExMjcwLzE0MDkyLzY4NyAxMTI4Ni8xNDEwMC82ODcKK2YgMTEyNzEvMTQxMDIvNDE1NiAxMTI4Ny8xNDExNC80MTU2IDExMjg4LzE0MTE1LzQxNTYKK2YgMTEyODgvMTQxMTUvNDE1NyAxMTQwNC8xNDExNi80MTU3IDExMjcxLzE0MTAyLzQxNTcKK2YgMTEyNzIvMTQwMTMvNDE1OCAxMTI4OS8xNDAxNS80MTU4IDExMjkwLzE0MTE3LzQxNTgKK2YgMTEyOTAvMTQxMTcvNDE1OSAxMTI3My8xNDEwMS80MTU5IDExMjcyLzE0MDEzLzQxNTkKK2YgMTEyNzMvMTQxMDEvNDE2MCAxMTI5MC8xNDExNy80MTYwIDExMjg3LzE0MTE0LzQxNjAKK2YgMTEyODcvMTQxMTQvNDE2MSAxMTI3MS8xNDEwMi80MTYxIDExMjczLzE0MTAxLzQxNjEKK2YgMTEyODgvMTQxMTUvNjg3IDExMjg3LzE0MTE0LzY4NyAxMTI5MC8xNDExNy82ODcKK2YgMTEyOTAvMTQxMTcvNjg3IDExMjkxLzE0MTE4LzY4NyAxMTI4OC8xNDExNS82ODcKK2YgMTEyOTEvMTQxMTgvNjg3IDExMjkwLzE0MTE3LzY4NyAxMTI4OS8xNDAxNS82ODcKK2YgMTEyODkvMTQwMTUvNjg3IDExNDIyLzE0MDE3LzY4NyAxMTI5MS8xNDExOC82ODcKK2YgMTEyNDUvMTQxMTkvNDE2MiAxMTI5My8xNDEyMC80MTYyIDExMjkyLzE0MTIxLzQxNjIKK2YgMTEyOTIvMTQxMjEvNDE2MyAxMTI0Ni8xNDEyMi80MTYzIDExMjQ1LzE0MTE5LzQxNjMKK2YgMTEyMDQvMTQxMjMvNDE2NCAxMTMzOS8xNDEyNC80MTY0IDExMjkzLzE0MTI1LzQxNjQKK2YgMTEyOTMvMTQxMjUvNDE2NSAxMTI0NS8xNDEyNi80MTY1IDExMjA0LzE0MTIzLzQxNjUKK2YgMTEyOTgvMTQxMjcvNjg3IDExMjkyLzE0MTIxLzY4NyAxMTI5My8xNDEyMC82ODcKK2YgMTEyOTMvMTQxMjAvNjg3IDExMjk5LzE0MTI4LzY4NyAxMTI5OC8xNDEyNy82ODcKK2YgMTEyOTUvMTQxMjkvNjg3IDExMzAyLzE0MTMwLzY4NyAxMjA2MS8xNDEzMS82ODcKK2YgMTIwNjEvMTQxMzEvNjg3IDExMzE5LzE0MTMyLzY4NyAxMTI5NS8xNDEyOS82ODcKK2YgMTEyOTMvMTQxMjAvNjg3IDExMzM5LzE0MTMzLzY4NyAxMTQyOS8xNDEzNC82ODcKK2YgMTE0MjkvMTQxMzQvNjg3IDExMjk5LzE0MTI4LzY4NyAxMTI5My8xNDEyMC82ODcKK2YgMTEzMDEvMTQxMzUvNDE2NiAxMTMwMC8xNDEzNi80MTY2IDExMjk4LzE0MTI3LzQxNjYKK2YgMTEyOTgvMTQxMjcvNDE2NyAxMTI5OS8xNDEyOC80MTY3IDExMzAxLzE0MTM1LzQxNjcKK2YgMTE0MjkvMTQxMzcvNDE2OCAxMTQzNC8xNDEzOC80MTY4IDExMzAxLzE0MTM5LzQxNjgKK2YgMTEzMDEvMTQxMzkvNDE2OSAxMTI5OS8xNDE0MC80MTY5IDExNDI5LzE0MTM3LzQxNjkKK2YgMTE0MzQvMTQxNDEvNDE3MCAxMTMwMy8xNDE0Mi80MTcwIDExMzAyLzE0MTQzLzQxNzAKK2YgMTEzMDIvMTQxNDMvNDE3MSAxMTMwMS8xNDE0NC80MTcxIDExNDM0LzE0MTQxLzQxNzEKK2YgMTEzMDIvMTQxNDMvNDE3MiAxMTI5NS8xNDE0NS80MTcyIDExMzAwLzE0MTQ2LzQxNzIKK2YgMTEzMDAvMTQxNDYvNDE3MyAxMTMwMS8xNDE0NC80MTczIDExMzAyLzE0MTQzLzQxNzMKK2YgMTEzMDYvMTQxNDcvNDE3NCAxMTMwNS8xNDE0OC80MTc0IDExMzA0LzE0MTQ5LzQxNzQKK2YgMTEzMDQvMTQxNDkvNDE3NSAxMTMwNy8xNDE1MC80MTc1IDExMzA2LzE0MTQ3LzQxNzUKK2YgMTEzMDQvMTQxNTEvNDE3NiAxMjA2My8xNDE1Mi80MTc2IDEyMDY1LzE0MTUzLzQxNzYKK2YgMTIwNjUvMTQxNTQvNDE3NyAxMTM0MC8xNDE1NS80MTc3IDExMzA0LzE0MTU2LzQxNzcKK2YgMTEzMDkvMTQxNTcvNDE3OCAxMTMwOC8xNDE1OC80MTc4IDExMjk3LzE0MTU5LzQxNzgKK2YgMTEzMDYvMTQxNjAvMTUwNyAxMTMwNy8xNDE2MS8xNTA3IDExMzA4LzE0MTYyLzE1MDcKK2YgMTEzMDgvMTQxNjIvMTUwNyAxMTMwOS8xNDE2My8xNTA3IDExMzA2LzE0MTYwLzE1MDcKK2YgMTEzMTgvMTM4OTAvNDE3OSAxMTMxNS8xMzg4OS80MTc5IDExMjQxLzE0MDE5LzQxNzkKK2YgMTEzMTcvMTM5MDcvNjg3IDExMjQzLzE0MDIyLzY4NyAxMTI0Mi8xNDAxOC82ODcKK2YgMTEyNDIvMTQwMTgvNjg3IDExMzE2LzEzOTA4LzY4NyAxMTMxNy8xMzkwNy82ODcKK2YgMTEyMDMvMTQxNjQvNjg3IDExMjQzLzE0MDIyLzY4NyAxMTMxNy8xMzkwNy82ODcKK2YgMTEzMTcvMTM5MDcvNjg3IDExMzE0LzE0MTY1LzY4NyAxMTIwMy8xNDE2NC82ODcKK2YgMTEyMDkvMTM4ODcvNDE4MCAxMTIwOC8xNDE2Ni80MTgwIDExMzE2LzE0MTY3LzQxODAKK2YgMTEzMTYvMTQxNjcvNDE4MSAxMTMxNS8xMzg4OC80MTgxIDExMjA5LzEzODg3LzQxODEKK2YgMTEzMjYvMTQxNjgvNjg3IDExMzEzLzE0MTY5LzY4NyAxMTI5NC8xNDE3MC82ODcKK2YgMTEzMDUvMTQxNzEvNDE4MiAxMTI5Ni8xNDE3Mi80MTgyIDExMzE5LzE0MTczLzQxODIKK2YgMTEzMTkvMTQxMzIvNDE4MyAxMjA2MS8xNDEzMS80MTgzIDExMzA1LzE0MTc0LzQxODMKK2YgMTEzMDYvMTQxNjAvNDE4NCAxMTMyMC8xNDE3NS80MTg0IDExMjk2LzE0MTc2LzQxODQKK2YgMTEyOTYvMTQxNzYvNDE4NSAxMTMwNS8xNDE3Ny80MTg1IDExMzA2LzE0MTYwLzQxODUKK2YgMTEzMDkvMTQxNjMvNjg3IDExMzIxLzE0MTc4LzY4NyAxMTMyMC8xNDE3NS82ODcKK2YgMTEzMjAvMTQxNzUvNDE1NSAxMTMwNi8xNDE2MC80MTU1IDExMzA5LzE0MTYzLzQxNTUKK2YgMTEyOTcvMTQxNTkvNDE4NiAxMTMyMi8xNDE3OS80MTg2IDExMzIxLzE0MTgwLzQxODYKK2YgMTEzMjEvMTQxODAvNDE4NyAxMTMwOS8xNDE1Ny80MTg3IDExMjk3LzE0MTU5LzQxODcKK2YgMTEyOTcvMTQxODEvNDE4OCAxMTMxMC8xNDE4Mi80MTg4IDExMzIzLzE0MTgzLzQxODgKK2YgMTEzMjMvMTQxODMvNDE4OSAxMTMyMi8xNDE4NC80MTg5IDExMjk3LzE0MTgxLzQxODkKK2YgMTEzMTAvMTQxODUvNjg3IDExMzExLzE0MTg2LzY4NyAxMTMyNC8xNDE4Ny82ODcKK2YgMTEzMjQvMTQxODcvNjg3IDExMzIzLzE0MTg4LzY4NyAxMTMxMC8xNDE4NS82ODcKK2YgMTEzMTEvMTQxODkvNDE5MCAxMTMxMi8xNDE5MC80MTkwIDExMzI1LzE0MTc5LzQxOTAKK2YgMTEzMjUvMTQxNzkvNDE5MSAxMTMyNC8xNDE4MC80MTkxIDExMzExLzE0MTg5LzQxOTEKK2YgMTEzMTIvMTQxOTEvNDE5MiAxMTMxMy8xNDE2OS80MTkyIDExMzI2LzE0MTY4LzQxOTIKK2YgMTEzMjYvMTQxNjgvNDE5MyAxMTMyNS8xNDE5Mi80MTkzIDExMzEyLzE0MTkxLzQxOTMKK2YgMTEyOTgvMTQxOTMvNDE5NCAxMTMxOC8xNDE5NC80MTk0IDExMjQxLzE0MTk1LzQxOTQKK2YgMTEyNDEvMTQxOTYvNjg3IDExMjkyLzE0MTIxLzY4NyAxMTI5OC8xNDEyNy82ODcKK2YgMTEzMDAvMTQxOTcvNjg3IDExMjQ0LzEzODkxLzY4NyAxMTMxOC8xMzg5MC82ODcKK2YgMTEzMTgvMTQxOTQvNDE5NSAxMTI5OC8xNDE5My80MTk1IDExMzAwLzE0MTk4LzQxOTUKK2YgMTEyOTUvMTQxMjkvNDE5NiAxMTMyNy8xNDE5OS80MTk2IDExMjQ0LzE0MjAwLzQxOTYKK2YgMTEyNDQvMTQyMDEvNDE5NyAxMTMwMC8xNDIwMi80MTk3IDExMjk1LzE0MjAzLzQxOTcKK2YgMTEzMTkvMTQxMzIvNjg3IDExMzI4LzE0MjA0LzY4NyAxMTMyNy8xNDE5OS82ODcKK2YgMTEzMjcvMTQxOTkvNjg3IDExMjk1LzE0MTI5LzY4NyAxMTMxOS8xNDEzMi82ODcKK2YgMTEzNzgvMTQyMDUvNDE5OCAxMTQ1MC8xNDIwNi80MTk4IDExNDQ3LzE0MjA3LzQxOTgKK2YgMTE0NDcvMTQyMDgvNDE5OSAxMTM0My8xNDIwOS80MTk5IDExMzc4LzE0MjEwLzQxOTkKK2YgMTEzNzUvMTQyMTEvNDIwMCAxMTM4MS8xNDIxMi80MjAwIDExMzQ1LzE0MjEzLzQyMDAKK2YgMTEzNDUvMTQyMTMvNDIwMSAxMTM3Ni8xNDIxNC80MjAxIDExMzc1LzE0MjExLzQyMDEKK2YgMTEzODEvMTQyMTUvNDIwMiAxMTM4NC8xNDIxNi80MjAyIDExMzQ3LzE0MjE3LzQyMDIKK2YgMTEzNDcvMTQyMTcvNDIwMyAxMTM0NS8xNDIxOC80MjAzIDExMzgxLzE0MjE1LzQyMDMKK2YgMTEzNDYvMTQyMTkvNDIwNCAxMTE5OC8xMzkwMy80MjA0IDExMTk3LzEzOTAyLzQyMDQKK2YgMTExOTcvMTM5MDIvNDIwNSAxMTM0NC8xNDIyMC80MjA1IDExMzQ2LzE0MjE5LzQyMDUKK2YgMTEzNDUvMTQyMjEvNDIwNiAxMTM0Ny8xNDIyMi80MjA2IDExMzQ2LzE0MjE5LzQyMDYKK2YgMTEzNDYvMTQyMTkvNDIwNyAxMTM0NC8xNDIyMC80MjA3IDExMzQ1LzE0MjIxLzQyMDcKK2YgMTEzNDEvMTQyMjMvNDIwOCAxMTM0Mi8xNDIyNC80MjA4IDExNDQ4LzE0MjI1LzQyMDgKK2YgMTE0NDgvMTQyMjUvNDIwOSAxMTQ0OS8xNDIyNi80MjA5IDExMzQxLzE0MjIzLzQyMDkKK2YgMTEzMTQvMTM5MTAvNDIxMCAxMTMyOS8xMzkxMy80MjEwIDExMzQxLzE0MjI3LzQyMTAKK2YgMTEzNDEvMTQyMjcvNDIxMSAxMTQ0OS8xNDIyOC80MjExIDExMzE0LzEzOTEwLzQyMTEKK2YgMTEzNjMvMTQyMjkvNDEyOCAxMTM0OC8xNDIzMC80MTI4IDExMzMwLzEzOTE2LzQxMjgKK2YgMTEzMzAvMTM5MTYvNDIxMiAxMTIwMi8xMzkxNS80MjEyIDExMzYzLzE0MjI5LzQyMTIKK2YgMTE0MDkvMTQyMzEvNDIxMyAxMTM4Ni8xNDIzMi80MjEzIDExMzQ5LzE0MjMzLzQyMTMKK2YgMTEzNDkvMTQyMzMvNDIxNCAxMTM2NC8xNDIzNC80MjE0IDExNDA5LzE0MjMxLzQyMTQKK2YgMTEzNjQvMTQyMzUvNDEzMSAxMTM0OS8xNDIzNi80MTMxIDExMzQ4LzE0MjM3LzQxMzEKK2YgMTEzNDgvMTQyMzcvNDEzMSAxMTM2My8xNDIzOC80MTMxIDExMzY0LzE0MjM1LzQxMzEKK2YgMTEzNDgvMTQyMzkvNDEzMyAxMTM1MC8xNDI0MC80MTMzIDExMTk5LzEzOTI4LzQxMzMKK2YgMTExOTkvMTM5MjgvNDEyNCAxMTMzMC8xMzkyNy80MTI0IDExMzQ4LzE0MjM5LzQxMjQKK2YgMTEzODYvMTQyNDEvNDIxNSAxMTM4OS8xNDI0Mi80MjE1IDExMzUxLzE0MjQzLzQyMTUKK2YgMTEzNTEvMTQyNDMvNDIxNiAxMTM0OS8xNDI0NC80MjE2IDExMzg2LzE0MjQxLzQyMTYKK2YgMTEzNDkvMTQyMzYvNDIxNyAxMTM1MS8xNDI0NS80MjE3IDExMzUwLzE0MjQ2LzQyMTcKK2YgMTEzNTAvMTQyNDYvNDEyNyAxMTM0OC8xNDIzNy80MTI3IDExMzQ5LzE0MjM2LzQxMjcKK2YgMTEzNjUvMTQyNDcvNDEyOCAxMTM1Mi8xNDI0OC80MTI4IDExMjAwLzEzOTM4LzQxMjgKK2YgMTEyMDAvMTM5MzgvNDE0MCAxMTMzMS8xMzkzNy80MTQwIDExMzY1LzE0MjQ3LzQxNDAKK2YgMTE0MTEvMTQyNDkvNDIxMyAxMTM5Mi8xNDI1MC80MjEzIDExMzUzLzE0MjUxLzQyMTMKK2YgMTEzNTMvMTQyNTEvNDIxOCAxMTM2Ni8xNDI1Mi80MjE4IDExNDExLzE0MjQ5LzQyMTgKK2YgMTEzNjYvMTQyNTMvNDE1MSAxMTM1My8xNDI1NC80MTUxIDExMzUyLzE0MjU1LzQxNTEKK2YgMTEzNTIvMTQyNTUvNDE0MyAxMTM2NS8xNDI1Ni80MTQzIDExMzY2LzE0MjUzLzQxNDMKK2YgMTEzNTIvMTQyNTcvNDEyNCAxMTM1NC8xNDI1OC80MTI0IDExMjAxLzEzOTUwLzQxMjQKK2YgMTEyMDEvMTM5NTAvNDEzMyAxMTIwMC8xMzk0OS80MTMzIDExMzUyLzE0MjU3LzQxMzMKK2YgMTEzOTIvMTQyNTkvNDIxOSAxMTM5NS8xNDI2MC80MjE5IDExMzU1LzE0MjYxLzQyMTkKK2YgMTEzNTUvMTQyNjEvNDIyMCAxMTM1My8xNDI2Mi80MjIwIDExMzkyLzE0MjU5LzQyMjAKK2YgMTEzNTMvMTQyNTQvNDIyMSAxMTM1NS8xNDI2My80MjIxIDExMzU0LzE0MjY0LzQyMjEKK2YgMTEzNTQvMTQyNjQvNDEyNyAxMTM1Mi8xNDI1NS80MTI3IDExMzUzLzE0MjU0LzQxMjcKK2YgMTEzNjcvMTQyNjUvNDEyOCAxMTM1Ni8xNDI2Ni80MTI4IDExMjIzLzEzOTYwLzQxMjgKK2YgMTEyMjMvMTM5NjAvNDEyOCAxMTMzMi8xMzk1OS80MTI4IDExMzY3LzE0MjY1LzQxMjgKK2YgMTE0MTQvMTQyNjcvNDIyMiAxMTM5OC8xNDI2OC80MjIyIDExMzU3LzE0MjY5LzQyMjIKK2YgMTEzNTcvMTQyNjkvNDIyMyAxMTM2OC8xNDI3MC80MjIzIDExNDE0LzE0MjY3LzQyMjMKK2YgMTEzNjgvMTQyNzEvNDEzMSAxMTM1Ny8xNDI3Mi80MTMxIDExMzU2LzE0MjczLzQxMzEKK2YgMTEzNTYvMTQyNzMvNDEzMSAxMTM2Ny8xNDI3NC80MTMxIDExMzY4LzE0MjcxLzQxMzEKK2YgMTEzNTYvMTQyNzUvNDE1MiAxMTM1OC8xNDI3Ni80MTUyIDExMzU5LzEzOTcyLzQxNTIKK2YgMTEzNTkvMTM5NzIvNDIyNCAxMTIyMy8xMzk3MS80MjI0IDExMzU2LzE0Mjc1LzQyMjQKK2YgMTEzOTgvMTQyNzcvNDIyNSAxMTQwMS8xNDI3OC80MjI1IDExMzYwLzE0Mjc5LzQyMjUKK2YgMTEzNjAvMTQyNzkvNDIyNiAxMTM1Ny8xNDI4MC80MjI2IDExMzk4LzE0Mjc3LzQyMjYKK2YgMTEzNTcvMTQyNzIvNDIyNyAxMTM2MC8xNDI4MS80MjI3IDExMzU4LzE0MjgyLzQyMjcKK2YgMTEzNTgvMTQyODIvNDEyNyAxMTM1Ni8xNDI3My80MTI3IDExMzU3LzE0MjcyLzQxMjcKK2YgMTEzNjkvMTQyODMvNDEzOSAxMTM2MS8xNDI4NC80MTM5IDExMjI4LzEzOTgyLzQxMzkKK2YgMTEyMjgvMTM5ODIvNDIyOCAxMTIzNy8xMzk4MS80MjI4IDExMzY5LzE0MjgzLzQyMjgKK2YgMTE0MTcvMTQyODUvNDIyOSAxMTQwNS8xNDI4Ni80MjI5IDExMzYyLzE0Mjg3LzQyMjkKK2YgMTEzNjIvMTQyODcvNDIzMCAxMTM3MC8xNDI4OC80MjMwIDExNDE3LzE0Mjg1LzQyMzAKK2YgMTEzNzAvMTQyODkvNDIzMSAxMTM2Mi8xNDI5MC80MjMxIDExMzYxLzE0MjkxLzQyMzEKK2YgMTEzNjEvMTQyOTEvNDEzMSAxMTM2OS8xNDI5Mi80MTMxIDExMzcwLzE0Mjg5LzQxMzEKK2YgMTEzNjMvMTQyMzgvNjg3IDExMjAyLzEzOTk0LzY4NyAxMTE5OC8xMzk5My82ODcKK2YgMTExOTgvMTM5OTMvNjg3IDExMzQ2LzE0MjkzLzY4NyAxMTM2My8xNDIzOC82ODcKK2YgMTEzNjQvMTQyMzUvNjg3IDExMzYzLzE0MjM4LzY4NyAxMTM0Ni8xNDI5My82ODcKK2YgMTEzNDYvMTQyOTMvNjg3IDExMzQ3LzE0Mjk0LzY4NyAxMTM2NC8xNDIzNS82ODcKK2YgMTE0MDkvMTQyOTUvNjg3IDExMzY0LzE0MjM1LzY4NyAxMTM0Ny8xNDI5NC82ODcKK2YgMTEzNDcvMTQyOTQvNjg3IDExMzg0LzE0Mjk2LzY4NyAxMTQwOS8xNDI5NS82ODcKK2YgMTEzNjUvMTQyNTYvNjg3IDExMzMxLzEzOTk5LzY4NyAxMTE5OS8xMzk5OC82ODcKK2YgMTExOTkvMTM5OTgvNjg3IDExMzUwLzE0MjQ2LzY4NyAxMTM2NS8xNDI1Ni82ODcKK2YgMTE0MTEvMTQyOTcvNjg3IDExMzY2LzE0MjUzLzY4NyAxMTM1MS8xNDI0NS82ODcKK2YgMTEzNTEvMTQyNDUvNjg3IDExMzg5LzE0Mjk4LzY4NyAxMTQxMS8xNDI5Ny82ODcKK2YgMTEzNjYvMTQyNTMvNjg3IDExMzY1LzE0MjU2LzY4NyAxMTM1MC8xNDI0Ni82ODcKK2YgMTEzNTAvMTQyNDYvNjg3IDExMzUxLzE0MjQ1LzY4NyAxMTM2Ni8xNDI1My82ODcKK2YgMTEzNjcvMTQyNzQvNjg3IDExMzMyLzE0MDAzLzY4NyAxMTIwMS8xNDAwMi82ODcKK2YgMTEyMDEvMTQwMDIvNjg3IDExMzU0LzE0MjY0LzY4NyAxMTM2Ny8xNDI3NC82ODcKK2YgMTE0MTQvMTQyOTkvNjg3IDExMzY4LzE0MjcxLzY4NyAxMTM1NS8xNDI2My82ODcKK2YgMTEzNTUvMTQyNjMvNjg3IDExMzk1LzE0MzAwLzY4NyAxMTQxNC8xNDI5OS82ODcKK2YgMTEzNjgvMTQyNzEvNjg3IDExMzY3LzE0Mjc0LzY4NyAxMTM1NC8xNDI2NC82ODcKK2YgMTEzNTQvMTQyNjQvNjg3IDExMzU1LzE0MjYzLzY4NyAxMTM2OC8xNDI3MS82ODcKK2YgMTEzNjkvMTQyOTIvNjg3IDExMjM3LzE0MDA3LzY4NyAxMTM1OS8xNDAwNi82ODcKK2YgMTEzNTkvMTQwMDYvNjg3IDExMzU4LzE0MjgyLzY4NyAxMTM2OS8xNDI5Mi82ODcKK2YgMTE0MTcvMTQzMDEvNjg3IDExMzcwLzE0Mjg5LzY4NyAxMTM2MC8xNDI4MS82ODcKK2YgMTEzNjAvMTQyODEvNjg3IDExNDAxLzE0MzAyLzY4NyAxMTQxNy8xNDMwMS82ODcKK2YgMTEzNzAvMTQyODkvNjg3IDExMzY5LzE0MjkyLzY4NyAxMTM1OC8xNDI4Mi82ODcKK2YgMTEzNTgvMTQyODIvNjg3IDExMzYwLzE0MjgxLzY4NyAxMTM3MC8xNDI4OS82ODcKK2YgMTEzNjEvMTQyOTEvNDIzMiAxMTM3MS8xNDMwMy80MjMyIDExMzcyLzE0MDExLzQyMzIKK2YgMTEzNzIvMTQwMTEvNDIzMiAxMTIyOC8xNDAxMC80MjMyIDExMzYxLzE0MjkxLzQyMzIKK2YgMTE0MDUvMTQzMDQvNDIzMyAxMTQyMC8xNDMwNS80MjMzIDExMzczLzE0MzA2LzQyMzMKK2YgMTEzNzMvMTQzMDYvNDIzNCAxMTM2Mi8xNDI5MC80MjM0IDExNDA1LzE0MzA0LzQyMzQKK2YgMTEzNjIvMTQyOTAvNDIzNSAxMTM3My8xNDMwNi80MjM1IDExMzcxLzE0MzAzLzQyMzUKK2YgMTEzNzEvMTQzMDMvNDIzNiAxMTM2MS8xNDI5MS80MjM2IDExMzYyLzE0MjkwLzQyMzYKK2YgMTEzNzIvMTQwMTEvNDkzIDExMzcxLzE0MzAzLzQ5MyAxMTM3My8xNDMwNi80OTMKK2YgMTEzNzMvMTQzMDYvNDkzIDExMzc0LzE0MDE2LzQ5MyAxMTM3Mi8xNDAxMS80OTMKK2YgMTEzNzQvMTQwMTYvNjg3IDExMzczLzE0MzA2LzY4NyAxMTQyMC8xNDMwNS82ODcKK2YgMTE0MjAvMTQzMDUvNjg3IDExNDIyLzE0MDE3LzY4NyAxMTM3NC8xNDAxNi82ODcKK2YgMTE0NDgvMTQyMjUvMjk1NiAxMTQ0Ny8xNDIwNy8yOTU2IDExMzc1LzE0MzA3LzI5NTYKK2YgMTEzNzUvMTQzMDcvNjg3IDExMzc2LzE0MzA4LzY4NyAxMTQ0OC8xNDIyNS82ODcKK2YgMTEzNDQvMTQzMDkvNDIzNyAxMTM3Ny8xNDMxMC80MjM3IDExMzc2LzE0MzA4LzQyMzcKK2YgMTEzNzYvMTQzMDgvNDIzOCAxMTM0NS8xNDMxMS80MjM4IDExMzQ0LzE0MzA5LzQyMzgKK2YgMTExOTcvMTQwMjMvNDIzOSAxMTIwMy8xNDAyNi80MjM5IDExMzc3LzE0MzEyLzQyMzkKK2YgMTEzNzcvMTQzMTIvNDIzOSAxMTM0NC8xNDMxMy80MjM5IDExMTk3LzE0MDIzLzQyMzkKK2YgMTE0MjcvMTQzMTQvNDI0MCAxMTQ1MS8xNDMxNS80MjQwIDExNDYwLzE0MzE2LzQyNDAKK2YgMTEzNzUvMTQyMTEvNDI0MSAxMTQyMy8xNDMxNy80MjQxIDExMzgwLzE0MzE4LzQyNDEKK2YgMTEzODAvMTQzMTgvNDI0MiAxMTM4MS8xNDIxMi80MjQyIDExMzc1LzE0MjExLzQyNDIKK2YgMTEzODEvMTQyMTUvNDI0MyAxMTM4MC8xNDMxOS80MjQzIDExMzgzLzE0MzIwLzQyNDMKK2YgMTEzODMvMTQzMjAvNDI0NCAxMTM4NC8xNDIxNi80MjQ0IDExMzgxLzE0MjE1LzQyNDQKK2YgMTEzODIvMTQzMjEvNDI0NSAxMTM3OS8xNDMyMi80MjQ1IDExMjA0LzE0MDM2LzQyNDUKK2YgMTEyMDQvMTQwMzYvNDI0NiAxMTMzMy8xNDAzNS80MjQ2IDExMzgyLzE0MzIxLzQyNDYKK2YgMTEzODAvMTQzMjMvNDI0NyAxMTM3OS8xNDMyMi80MjQ3IDExMzgyLzE0MzIxLzQyNDcKK2YgMTEzODIvMTQzMjEvNDI0OCAxMTM4My8xNDMyNC80MjQ4IDExMzgwLzE0MzIzLzQyNDgKK2YgMTE0MDcvMTQzMjUvNDA3OSAxMTMzNy8xNDA0My80MDc5IDExMzM0LzE0MDQyLzQwNzkKK2YgMTEzMzQvMTQwNDIvNDA4MCAxMTM4NS8xNDMyNi80MDgwIDExNDA3LzE0MzI1LzQwODAKK2YgMTE0MDkvMTQyMzEvNDI0OSAxMTQwOC8xNDMyNy80MjQ5IDExMzg3LzE0MzI4LzQyNDkKK2YgMTEzODcvMTQzMjgvNDI1MCAxMTM4Ni8xNDIzMi80MjUwIDExNDA5LzE0MjMxLzQyNTAKK2YgMTE0MDgvMTQzMjkvNDA4MyAxMTQwNy8xNDMzMC80MDgzIDExMzg1LzE0MzMxLzQwODMKK2YgMTEzODUvMTQzMzEvNDA5MSAxMTM4Ny8xNDMzMi80MDkxIDExNDA4LzE0MzI5LzQwOTEKK2YgMTEzODUvMTQzMzMvNDA3NSAxMTMzNC8xNDA1My80MDc1IDExMzM1LzE0MDUyLzQwNzUKK2YgMTEzMzUvMTQwNTIvNDA3NSAxMTM4OC8xNDMzNC80MDc1IDExMzg1LzE0MzMzLzQwNzUKK2YgMTEzODYvMTQyNDEvNDI1MSAxMTM4Ny8xNDMzNS80MjUxIDExMzkwLzE0MzM2LzQyNTEKK2YgMTEzOTAvMTQzMzYvNDI1MiAxMTM4OS8xNDI0Mi80MjUyIDExMzg2LzE0MjQxLzQyNTIKK2YgMTEzODcvMTQzMzIvNDA3OCAxMTM4NS8xNDMzMS80MDc4IDExMzg4LzE0MzM3LzQwNzgKK2YgMTEzODgvMTQzMzcvNDA3OCAxMTM5MC8xNDMzOC80MDc4IDExMzg3LzE0MzMyLzQwNzgKK2YgMTE0MTAvMTQzMzkvNDI1MyAxMTIwNi8xNDA2MS80MjUzIDExMzM2LzE0MDYwLzQyNTMKK2YgMTEzMzYvMTQwNjAvNDA4MCAxMTM5MS8xNDM0MC80MDgwIDExNDEwLzE0MzM5LzQwODAKK2YgMTE0MTEvMTQyNDkvNDI1NCAxMTQxMi8xNDM0MS80MjU0IDExMzkzLzE0MzQyLzQyNTQKK2YgMTEzOTMvMTQzNDIvNDI1NSAxMTM5Mi8xNDI1MC80MjU1IDExNDExLzE0MjQ5LzQyNTUKK2YgMTE0MTIvMTQzNDMvNDI1NiAxMTQxMC8xNDM0NC80MjU2IDExMzkxLzE0MzQ1LzQyNTYKK2YgMTEzOTEvMTQzNDUvNDI1NiAxMTM5My8xNDM0Ni80MjU2IDExNDEyLzE0MzQzLzQyNTYKK2YgMTEzOTEvMTQzNDcvNDI1NyAxMTMzNi8xNDA3MS80MjU3IDExMjA1LzE0MDcwLzQyNTcKK2YgMTEyMDUvMTQwNzAvNDI1OCAxMTM5NC8xNDM0OC80MjU4IDExMzkxLzE0MzQ3LzQyNTgKK2YgMTEzOTIvMTQyNTkvNDI1OSAxMTM5My8xNDM0OS80MjU5IDExMzk2LzE0MzUwLzQyNTkKK2YgMTEzOTYvMTQzNTAvNDI2MCAxMTM5NS8xNDI2MC80MjYwIDExMzkyLzE0MjU5LzQyNjAKK2YgMTEzOTMvMTQzNDYvNDA3OCAxMTM5MS8xNDM0NS80MDc4IDExMzk0LzE0MzUxLzQwNzgKK2YgMTEzOTQvMTQzNTEvNDA3OCAxMTM5Ni8xNDM1Mi80MDc4IDExMzkzLzE0MzQ2LzQwNzgKK2YgMTE0MTMvMTQzNTMvNDA5NSAxMTMzOC8xNDA3OS80MDk1IDExMjY0LzE0MDc4LzQwOTUKK2YgMTEyNjQvMTQwNzgvNDA5NiAxMTM5Ny8xNDM1NC80MDk2IDExNDEzLzE0MzUzLzQwOTYKK2YgMTE0MTQvMTQyNjcvNDI2MSAxMTQxNS8xNDM1NS80MjYxIDExMzk5LzE0MzU2LzQyNjEKK2YgMTEzOTkvMTQzNTYvNDI2MiAxMTM5OC8xNDI2OC80MjYyIDExNDE0LzE0MjY3LzQyNjIKK2YgMTE0MTUvMTQzNTcvNDI2MyAxMTQxMy8xNDM1OC80MjYzIDExMzk3LzE0MzU5LzQyNjMKK2YgMTEzOTcvMTQzNTkvNDI2MyAxMTM5OS8xNDM2MC80MjYzIDExNDE1LzE0MzU3LzQyNjMKK2YgMTEzOTcvMTQzNjEvNDI2NCAxMTI2NC8xNDA4OS80MjY0IDExMjY4LzE0MDg4LzQyNjQKK2YgMTEyNjgvMTQwODgvNDI1OCAxMTQwMC8xNDM2Mi80MjU4IDExMzk3LzE0MzYxLzQyNTgKK2YgMTEzOTgvMTQyNzcvNDI2NSAxMTM5OS8xNDM2My80MjY1IDExNDAyLzE0MzY0LzQyNjUKK2YgMTE0MDIvMTQzNjQvNDI2NiAxMTQwMS8xNDI3OC80MjY2IDExMzk4LzE0Mjc3LzQyNjYKK2YgMTEzOTkvMTQzNjAvNDA4NyAxMTM5Ny8xNDM1OS80MDg3IDExNDAwLzE0MzY1LzQwODcKK2YgMTE0MDAvMTQzNjUvNDA4OCAxMTQwMi8xNDM2Ni80MDg4IDExMzk5LzE0MzYwLzQwODgKK2YgMTE0MTYvMTQzNjcvNDA5NiAxMTI4NC8xNDA5Ny80MDk2IDExNDA0LzE0MDk2LzQwOTYKK2YgMTE0MDQvMTQwOTYvNDA5NiAxMTQwMy8xNDM2OC80MDk2IDExNDE2LzE0MzY3LzQwOTYKK2YgMTE0MTcvMTQyODUvNDI2NyAxMTQxOC8xNDM2OS80MjY3IDExNDA2LzE0MzcwLzQyNjcKK2YgMTE0MDYvMTQzNzAvNDI2OCAxMTQwNS8xNDI4Ni80MjY4IDExNDE3LzE0Mjg1LzQyNjgKK2YgMTE0MTgvMTQzNzEvNDA4MyAxMTQxNi8xNDM3Mi80MDgzIDExNDAzLzE0MzczLzQwODMKK2YgMTE0MDMvMTQzNzMvNDA4MyAxMTQwNi8xNDM3NC80MDgzIDExNDE4LzE0MzcxLzQwODMKK2YgMTE0MDcvMTQzMzAvNjg3IDExMzgyLzE0Mzc1LzY4NyAxMTMzMy8xNDEwNS82ODcKK2YgMTEzMzMvMTQxMDUvNjg3IDExMzM3LzE0MTA0LzY4NyAxMTQwNy8xNDMzMC82ODcKK2YgMTE0MDgvMTQzMjkvNjg3IDExMzgzLzE0Mzc2LzY4NyAxMTM4Mi8xNDM3NS82ODcKK2YgMTEzODIvMTQzNzUvNjg3IDExNDA3LzE0MzMwLzY4NyAxMTQwOC8xNDMyOS82ODcKK2YgMTE0MDkvMTQyOTUvNjg3IDExMzg0LzE0Mjk2LzY4NyAxMTM4My8xNDM3Ni82ODcKK2YgMTEzODMvMTQzNzYvNjg3IDExNDA4LzE0MzI5LzY4NyAxMTQwOS8xNDI5NS82ODcKK2YgMTE0MTAvMTQzNDQvNjg3IDExMzg4LzE0MzM3LzY4NyAxMTMzNS8xNDEwOS82ODcKK2YgMTEzMzUvMTQxMDkvNjg3IDExMjA2LzE0MTA4LzY4NyAxMTQxMC8xNDM0NC82ODcKK2YgMTE0MTEvMTQyOTcvNjg3IDExMzg5LzE0Mjk4LzY4NyAxMTM5MC8xNDMzOC82ODcKK2YgMTEzOTAvMTQzMzgvNjg3IDExNDEyLzE0MzQzLzY4NyAxMTQxMS8xNDI5Ny82ODcKK2YgMTE0MTIvMTQzNDMvNjg3IDExMzkwLzE0MzM4LzY4NyAxMTM4OC8xNDMzNy82ODcKK2YgMTEzODgvMTQzMzcvNjg3IDExNDEwLzE0MzQ0LzY4NyAxMTQxMi8xNDM0My82ODcKK2YgMTE0MTMvMTQzNTgvNjg3IDExMzk0LzE0MzUxLzY4NyAxMTIwNS8xNDExMS82ODcKK2YgMTEyMDUvMTQxMTEvNjg3IDExMzM4LzE0MTEwLzY4NyAxMTQxMy8xNDM1OC82ODcKK2YgMTE0MTQvMTQyOTkvNjg3IDExMzk1LzE0MzAwLzY4NyAxMTM5Ni8xNDM1Mi82ODcKK2YgMTEzOTYvMTQzNTIvNjg3IDExNDE1LzE0MzU3LzY4NyAxMTQxNC8xNDI5OS82ODcKK2YgMTE0MTUvMTQzNTcvNjg3IDExMzk2LzE0MzUyLzY4NyAxMTM5NC8xNDM1MS82ODcKK2YgMTEzOTQvMTQzNTEvNjg3IDExNDEzLzE0MzU4LzY4NyAxMTQxNS8xNDM1Ny82ODcKK2YgMTE0MTYvMTQzNzIvNjg3IDExNDAwLzE0MzY1LzY4NyAxMTI2OC8xNDExMy82ODcKK2YgMTEyNjgvMTQxMTMvNjg3IDExMjg0LzE0MTEyLzY4NyAxMTQxNi8xNDM3Mi82ODcKK2YgMTE0MTcvMTQzMDEvNjg3IDExNDAxLzE0MzAyLzY4NyAxMTQwMi8xNDM2Ni82ODcKK2YgMTE0MDIvMTQzNjYvNjg3IDExNDE4LzE0MzcxLzY4NyAxMTQxNy8xNDMwMS82ODcKK2YgMTE0MTgvMTQzNzEvNjg3IDExNDAyLzE0MzY2LzY4NyAxMTQwMC8xNDM2NS82ODcKK2YgMTE0MDAvMTQzNjUvNjg3IDExNDE2LzE0MzcyLzY4NyAxMTQxOC8xNDM3MS82ODcKK2YgMTE0MDMvMTQzNzMvNDI2OSAxMTQwNC8xNDExNi80MjY5IDExMjg4LzE0MTE1LzQyNjkKK2YgMTEyODgvMTQxMTUvNDI3MCAxMTQxOS8xNDM3Ny80MjcwIDExNDAzLzE0MzczLzQyNzAKK2YgMTE0MDUvMTQzMDQvNDI3MSAxMTQwNi8xNDM3NC80MjcxIDExNDIxLzE0Mzc4LzQyNzEKK2YgMTE0MjEvMTQzNzgvNDI3MiAxMTQyMC8xNDMwNS80MjcyIDExNDA1LzE0MzA0LzQyNzIKK2YgMTE0MDYvMTQzNzQvNDI3MyAxMTQwMy8xNDM3My80MjczIDExNDE5LzE0Mzc3LzQyNzMKK2YgMTE0MTkvMTQzNzcvNDI3MyAxMTQyMS8xNDM3OC80MjczIDExNDA2LzE0Mzc0LzQyNzMKK2YgMTEyODgvMTQxMTUvNjg3IDExMjkxLzE0MTE4LzY4NyAxMTQyMS8xNDM3OC82ODcKK2YgMTE0MjEvMTQzNzgvNjg3IDExNDE5LzE0Mzc3LzY4NyAxMTI4OC8xNDExNS82ODcKK2YgMTEyOTEvMTQxMTgvNjg3IDExNDIyLzE0MDE3LzY4NyAxMTQyMC8xNDMwNS82ODcKK2YgMTE0MjAvMTQzMDUvNjg3IDExNDIxLzE0Mzc4LzY4NyAxMTI5MS8xNDExOC82ODcKK2YgMTEzNzkvMTQzNzkvNDI3NCAxMTM4MC8xNDM4MC80Mjc0IDExNDIzLzE0MzgxLzQyNzQKK2YgMTE0MjMvMTQzODEvNDI3NCAxMTQyNC8xNDM4Mi80Mjc0IDExMzc5LzE0Mzc5LzQyNzQKK2YgMTEyMDQvMTQxMjMvNDI3NSAxMTM3OS8xNDM4My80Mjc1IDExNDI0LzE0Mzg0LzQyNzUKK2YgMTE0MjQvMTQzODQvNDI3NiAxMTMzOS8xNDEyNC80Mjc2IDExMjA0LzE0MTIzLzQyNzYKK2YgMTE0MzAvMTQzODUvNDI3NyAxMTQzMS8xNDM4Ni80Mjc3IDExNDI0LzE0MzgyLzQyNzcKK2YgMTE0MjQvMTQzODIvNjg3IDExNDIzLzE0MzgxLzY4NyAxMTQzMC8xNDM4NS82ODcKK2YgMTE0MjYvMTQzODcvNjg3IDExNDUxLzE0Mzg4LzY4NyAxMTQzNi8xNDM4OS82ODcKK2YgMTE0MzYvMTQzODkvNDI3OCAxMTQzNS8xNDM5MC80Mjc4IDExNDI2LzE0Mzg3LzQyNzgKK2YgMTE0MjQvMTQzODIvNDkzIDExNDMxLzE0Mzg2LzQ5MyAxMTQyOS8xNDEzNC80OTMKK2YgMTE0MjkvMTQxMzQvNjg3IDExMzM5LzE0MTMzLzY4NyAxMTQyNC8xNDM4Mi82ODcKK2YgMTE0MzMvMTQzOTEvNDI3OSAxMTQzMS8xNDM4Ni80Mjc5IDExNDMwLzE0Mzg1LzQyNzkKK2YgMTE0MzAvMTQzODUvNDI4MCAxMTQzMi8xNDM5Mi80MjgwIDExNDMzLzE0MzkxLzQyODAKK2YgMTE0MjkvMTQxMzcvNDI4MSAxMTQzMS8xNDM5My80MjgxIDExNDMzLzE0Mzk0LzQyODEKK2YgMTE0MzMvMTQzOTQvNDI4MiAxMTQzNC8xNDEzOC80MjgyIDExNDI5LzE0MTM3LzQyODIKK2YgMTE0MzUvMTQzOTUvNDI4MyAxMjA2OS8xNDM5Ni80MjgzIDExNDM0LzE0MTQxLzQyODMKK2YgMTE0MzQvMTQxNDEvNDI4NCAxMTQzMy8xNDM5Ny80Mjg0IDExNDM1LzE0Mzk1LzQyODQKK2YgMTE0MzUvMTQzOTUvNDI4NSAxMTQzMy8xNDM5Ny80Mjg1IDExNDMyLzE0Mzk4LzQyODUKK2YgMTE0MzIvMTQzOTgvNDI4NiAxMTQyNi8xNDM5OS80Mjg2IDExNDM1LzE0Mzk1LzQyODYKK2YgMTE0MzkvMTQ0MDAvNDI4NyAxMTQ0MC8xNDQwMS80Mjg3IDExNDM3LzE0NDAyLzQyODcKK2YgMTE0MzcvMTQ0MDIvNDI4OCAxMTQzOC8xNDQwMy80Mjg4IDExNDM5LzE0NDAwLzQyODgKK2YgMTE0MzcvMTQ0MDQvNDI4OSAxMjA2NC8xNDQwNS80Mjg5IDExNDM2LzE0NDA2LzQyODkKK2YgMTE0MzYvMTQ0MDYvNDI5MCAxMTQzOC8xNDQwNy80MjkwIDExNDM3LzE0NDA0LzQyOTAKK2YgMTE0NDIvMTQ0MDgvNDI5MSAxMTQyOC8xNDQwOS80MjkxIDExNDQxLzE0NDEwLzQyOTEKK2YgMTE0MzkvMTQ0MTEvMTUwNyAxMTQ0Mi8xNDQxMi8xNTA3IDExNDQxLzE0NDEzLzE1MDcKK2YgMTE0NDEvMTQ0MTMvMTUwNyAxMTQ0MC8xNDQxNC8xNTA3IDExNDM5LzE0NDExLzE1MDcKK2YgMTE0NTAvMTQyMDYvNDI5MiAxMTM3NS8xNDMwNy80MjkyIDExNDQ3LzE0MjA3LzQyOTIKK2YgMTE0NDkvMTQyMjYvNjg3IDExNDQ4LzE0MjI1LzY4NyAxMTM3Ni8xNDMwOC82ODcKK2YgMTEzNzYvMTQzMDgvNjg3IDExMzc3LzE0MzEwLzY4NyAxMTQ0OS8xNDIyNi82ODcKK2YgMTEyMDMvMTQxNjQvNjg3IDExMzE0LzE0MTY1LzY4NyAxMTQ0OS8xNDIyNi82ODcKK2YgMTE0NDkvMTQyMjYvNjg3IDExMzc3LzE0MzEwLzY4NyAxMTIwMy8xNDE2NC82ODcKK2YgMTEzNDMvMTQyMDkvNDI5MyAxMTQ0Ny8xNDIwOC80MjkzIDExNDQ4LzE0NDE1LzQyOTMKK2YgMTE0NDgvMTQ0MTUvNDI5NCAxMTM0Mi8xNDQxNi80Mjk0IDExMzQzLzE0MjA5LzQyOTQKK2YgMTE0NTgvMTQ0MTcvNjg3IDExNDI1LzE0NDE4LzY4NyAxMTQ0Ni8xNDQxOS82ODcKK2YgMTE0MzgvMTQ0MjAvNDI5NSAxMTQzNi8xNDM4OS80Mjk1IDExNDUxLzE0Mzg4LzQyOTUKK2YgMTE0NTEvMTQ0MjEvNDI5NiAxMTQyNy8xNDQyMi80Mjk2IDExNDM4LzE0NDIzLzQyOTYKK2YgMTE0MzkvMTQ0MTEvNDI5NyAxMTQzOC8xNDQyNC80Mjk3IDExNDI3LzE0NDI1LzQyOTcKK2YgMTE0MjcvMTQ0MjUvNDI5OCAxMTQ1Mi8xNDQyNi80Mjk4IDExNDM5LzE0NDExLzQyOTgKK2YgMTE0NDIvMTQ0MTIvMzk2NSAxMTQzOS8xNDQxMS8zOTY1IDExNDUyLzE0NDI2LzM5NjUKK2YgMTE0NTIvMTQ0MjYvNjg3IDExNDUzLzE0NDI3LzY4NyAxMTQ0Mi8xNDQxMi82ODcKK2YgMTE0MjgvMTQ0MDkvNDI5OSAxMTQ0Mi8xNDQwOC80Mjk5IDExNDUzLzE0NDI4LzQyOTkKK2YgMTE0NTMvMTQ0MjgvNDMwMCAxMTQ1NC8xNDQyOS80MzAwIDExNDI4LzE0NDA5LzQzMDAKK2YgMTE0MjgvMTQ0MzAvNDMwMSAxMTQ1NC8xNDQzMS80MzAxIDExNDU1LzE0NDMyLzQzMDEKK2YgMTE0NTUvMTQ0MzIvNDMwMiAxMTQ0My8xNDQzMy80MzAyIDExNDI4LzE0NDMwLzQzMDIKK2YgMTE0NDMvMTQ0MzQvMzk2NSAxMTQ1NS8xNDQzNS8zOTY1IDExNDU2LzE0NDM2LzM5NjUKK2YgMTE0NTYvMTQ0MzYvMzk2NiAxMTQ0NC8xNDQzNy8zOTY2IDExNDQzLzE0NDM0LzM5NjYKK2YgMTE0NDQvMTQ0MzgvNDMwMyAxMTQ1Ni8xNDQzOS80MzAzIDExNDU3LzE0NDQwLzQzMDMKK2YgMTE0NTcvMTQ0NDEvNDMwNCAxMTQ0NS8xNDQ0Mi80MzA0IDExNDQ0LzE0NDQzLzQzMDQKK2YgMTE0NDUvMTQ0NDQvNDMwNSAxMTQ1Ny8xNDQ0NS80MzA1IDExNDU4LzE0NDE3LzQzMDUKK2YgMTE0NTgvMTQ0MTcvNDMwNiAxMTQ0Ni8xNDQxOS80MzA2IDExNDQ1LzE0NDQ0LzQzMDYKK2YgMTE0MzAvMTQzODUvNjg3IDExNDIzLzE0MzgxLzY4NyAxMTM3NS8xNDQ0Ni82ODcKK2YgMTEzNzUvMTQ0NDcvNDMwNyAxMTQ1MC8xNDQ0OC80MzA3IDExNDMwLzE0NDQ5LzQzMDcKK2YgMTE0MzIvMTQ0NTAvNDMwOCAxMTQzMC8xNDQ0OS80MzA4IDExNDUwLzE0NDQ4LzQzMDgKK2YgMTE0NTAvMTQyMDYvMzk2NSAxMTM3OC8xNDIwNS8zOTY1IDExNDMyLzE0NDUxLzM5NjUKK2YgMTE0MjYvMTQ0NTIvNDMwOSAxMTQzMi8xNDQ1My80MzA5IDExMzc4LzE0NDU0LzQzMDkKK2YgMTEzNzgvMTQ0NTQvNDMxMCAxMTQ1OS8xNDQ1NS80MzEwIDExNDI2LzE0NDUyLzQzMTAKK2YgMTE0NTEvMTQzODgvNjg3IDExNDI2LzE0Mzg3LzY4NyAxMTQ1OS8xNDQ1Ni82ODcKK2YgMTE0NTkvMTQ0NTYvNDMxMSAxMTQ2MC8xNDQ1Ny80MzExIDExNDUxLzE0Mzg4LzQzMTEKK2YgMTE1MTIvMTQ0NTgvMTA4MCAxMTUxMS8xNDQ1OS8xMDgwIDExMjA5LzEzODg3LzEwODAKK2YgMTEyMDkvMTM4ODcvMTA4MCAxMTI0NC8xMzg4Ni8xMDgwIDExNTEyLzE0NDU4LzEwODAKK2YgMTE1MTEvMTQ0NTkvNDMxMiAxMTUxMC8xNDQ2MC80MzEyIDExMjA4LzE0MTY2LzQzMTIKK2YgMTEyMDgvMTQxNjYvNDMxMiAxMTIwOS8xMzg4Ny80MzEyIDExNTExLzE0NDU5LzQzMTIKK2YgMTE1MTAvMTQ0NjEvNDAwMyAxMTUwOS8xNDQ2Mi80MDAzIDExMjA3LzEzOTEyLzQwMDMKK2YgMTEyMDcvMTM5MTIvNDAwMyAxMTIwOC8xNDQ2My80MDAzIDExNTEwLzE0NDYxLzQwMDMKK2YgMTE1MDkvMTQ0NjIvNDAwNCAxMTUzMi8xNDQ2NC80MDA0IDExMzI5LzEzOTEzLzQwMDQKK2YgMTEzMjkvMTM5MTMvNDAwNCAxMTIwNy8xMzkxMi80MDA0IDExNTA5LzE0NDYyLzQwMDQKK2YgMTE1MjMvMTQ0NjUvMTA0NCAxMTUxNC8xNDQ2Ni8xMDQ0IDExMjk2LzE0MDI3LzEwNDQKK2YgMTEyOTYvMTQwMjcvNDMxMyAxMTMyMC8xNDQ2NS80MzEzIDExNTIzLzE0NDY1LzQzMTMKK2YgMTEyOTQvMTQxODAvMTE3MiAxMTUyMi8xNDQ2Ny8xMTcyIDExNTEzLzE0MTgwLzExNzIKK2YgMTE1MTgvMTQxNTgvMTE3MiAxMTUxNS8xNDE1OS8xMTcyIDExMjk3LzE0MTU5LzExNzIKK2YgMTEyOTcvMTQxNTkvMTE3MiAxMTMwOC8xNDE1OC8xMTcyIDExNTE4LzE0MTU4LzExNzIKK2YgMTE1MzAvMTQ0NjgvMTA0NCAxMTUxMi8xNDQ1OC8xMDQ0IDExMjQ0LzEzODg2LzEwNDQKK2YgMTEyNDQvMTM4ODYvNDMxNCAxMTMyNy8xNDQ2OC80MzE0IDExNTMwLzE0NDY4LzQzMTQKK2YgMTE1MzMvMTQ0NjkvMTE3MiAxMTUxNi8xNDQ3MC8xMTcyIDExMzA0LzE0NDcwLzExNzIKK2YgMTEzMDQvMTQ0NzAvMTE3MiAxMTM0MC8xNDQ2OS8xMTcyIDExNTMzLzE0NDY5LzExNzIKK2YgMTE1MTYvMTQ0NzAvMjEzNiAxMTUxNy8xNDQ3MS8yMTM2IDExMzA3LzE0NDcxLzIxMzYKK2YgMTEzMDcvMTQ0NzEvMTE3MiAxMTMwNC8xNDQ3MC8xMTcyIDExNTE2LzE0NDcwLzExNzIKK2YgMTE1MTcvMTQ0NzEvMTE3MiAxMTUxOC8xNDE1OC8xMTcyIDExMzA4LzE0MTU4LzExNzIKK2YgMTEzMDgvMTQxNTgvMTE3MiAxMTMwNy8xNDQ3MS8xMTcyIDExNTE3LzE0NDcxLzExNzIKK2YgMTE1MTUvMTQxNTkvMTE3MiAxMTUxOS8xNDQ3Mi8xMTcyIDExMzEwLzE0NDcyLzExNzIKK2YgMTEzMTAvMTQ0NzIvMTE3MiAxMTI5Ny8xNDE1OS8xMTcyIDExNTE1LzE0MTU5LzExNzIKK2YgMTE1MTkvMTQ0NzIvMTE3MiAxMTUyMC8xNDE4OS8xMTcyIDExMzExLzE0MTg5LzExNzIKK2YgMTEzMTEvMTQxODkvMTE3MiAxMTMxMC8xNDQ3Mi8xMTcyIDExNTE5LzE0NDcyLzExNzIKK2YgMTE1MjAvMTQxODkvMTE3MiAxMTUyMS8xNDE5MC8xMTcyIDExMzEyLzE0MTkwLzExNzIKK2YgMTEzMTIvMTQxOTAvMTE3MiAxMTMxMS8xNDE4OS8xMTcyIDExNTIwLzE0MTg5LzExNzIKK2YgMTE1MjEvMTQxOTAvMTE3MiAxMTUyMi8xNDQ2Ny8xMTcyIDExMzEzLzE0NDY3LzExNzIKK2YgMTEzMTMvMTQ0NjcvMTE3MiAxMTMxMi8xNDE5MC8xMTcyIDExNTIxLzE0MTkwLzExNzIKK2YgMTE1MjQvMTQ0NzMvNDMxNCAxMTUyMy8xNDQ2NS80MzE0IDExMzIwLzE0NDY1LzQzMTQKK2YgMTEzMjAvMTQ0NjUvNDMxNCAxMTMyMS8xNDQ3My80MzE0IDExNTI0LzE0NDczLzQzMTQKK2YgMTE1MjUvMTQ0NzQvNDMxNSAxMTUyNC8xNDQ3My80MzE1IDExMzIxLzE0NDczLzQzMTUKK2YgMTEzMjEvMTQ0NzMvMTA4MCAxMTMyMi8xNDQ3NS8xMDgwIDExNTI1LzE0NDc0LzEwODAKK2YgMTE1MjYvMTQ0NzYvMTA4OCAxMTUyNS8xNDQ3NC8xMDg4IDExMzIyLzE0NDc1LzEwODgKK2YgMTEzMjIvMTQ0NzUvNDMxNiAxMTMyMy8xNDQ3Ni80MzE2IDExNTI2LzE0NDc2LzQzMTYKK2YgMTE1MjcvMTQ0NzcvNDMxNCAxMTUyNi8xNDQ3Ni80MzE0IDExMzIzLzE0NDc2LzQzMTQKK2YgMTEzMjMvMTQ0NzYvNDMxNCAxMTMyNC8xNDQ3Ny80MzE0IDExNTI3LzE0NDc3LzQzMTQKK2YgMTE1MjgvMTQ0NzgvNDMxNSAxMTUyNy8xNDQ3Ny80MzE1IDExMzI0LzE0NDc3LzQzMTUKK2YgMTEzMjQvMTQ0NzcvMjMzMSAxMTMyNS8xNDQ3OS8yMzMxIDExNTI4LzE0NDc4LzIzMzEKK2YgMTE1MjkvMTQ0ODAvMTA0NCAxMTUyOC8xNDQ3OC8xMDQ0IDExMzI1LzE0NDc5LzEwNDQKK2YgMTEzMjUvMTQ0NzkvNDMxNiAxMTMyNi8xNDQ4MS80MzE2IDExNTI5LzE0NDgwLzQzMTYKK2YgMTE1MTMvMTQ0ODIvNDMxNCAxMTUyOS8xNDQ4MC80MzE0IDExMzI2LzE0NDgxLzQzMTQKK2YgMTEzMjYvMTQ0ODEvMTA0NCAxMTI5NC8xNDQ4My8xMDQ0IDExNTEzLzE0NDgyLzEwNDQKK2YgMTE1MzEvMTQwMjgvNDMxNCAxMTUzMC8xNDQ2OC80MzE0IDExMzI3LzE0NDY4LzQzMTQKK2YgMTEzMjcvMTQ0NjgvMTA0NCAxMTMyOC8xNDAyOC8xMDQ0IDExNTMxLzE0MDI4LzEwNDQKK2YgMTE1MTQvMTQ0NjYvMTA0NCAxMTUzMS8xNDAyOC8xMDQ0IDExMzI4LzE0MDI4LzEwNDQKK2YgMTEzMjgvMTQwMjgvMTA0NCAxMTI5Ni8xNDAyNy8xMDQ0IDExNTE0LzE0NDY2LzEwNDQKK2YgMTE1MzYvMTQ0ODQvMTYzMiAxMTUzNy8xNDQ4NS8xNjMyIDExMzc4LzE0MjEwLzE2MzIKK2YgMTEzNzgvMTQyMTAvNDMxNyAxMTM0My8xNDIwOS80MzE3IDExNTM2LzE0NDg0LzQzMTcKK2YgMTE1MzUvMTQ0MTYvNDMxOCAxMTUzNi8xNDQ4NC80MzE4IDExMzQzLzE0MjA5LzQzMTgKK2YgMTEzNDMvMTQyMDkvNDAwMCAxMTM0Mi8xNDQxNi80MDAwIDExNTM1LzE0NDE2LzQwMDAKK2YgMTE1MzQvMTQ0ODYvNDAwNiAxMTUzNS8xNDQ4Ny80MDA2IDExMzQyLzE0NDg4LzQwMDYKK2YgMTEzNDIvMTQ0ODgvNDAwNiAxMTM0MS8xNDIyNy80MDA2IDExNTM0LzE0NDg2LzQwMDYKK2YgMTE1MzIvMTQ0NjQvNDMxOSAxMTUzNC8xNDQ4Ni80MzE5IDExMzQxLzE0MjI3LzQzMTkKK2YgMTEzNDEvMTQyMjcvNDMxOSAxMTMyOS8xMzkxMy80MzE5IDExNTMyLzE0NDY0LzQzMTkKK2YgMTE1MzkvMTQzMTQvMTA4MSAxMTU0OC8xNDQ4OS8xMDgxIDExNDUyLzE0NDg5LzEwODEKK2YgMTE0NTIvMTQ0ODkvMTA4MSAxMTQyNy8xNDMxNC8xMDgxIDExNTM5LzE0MzE0LzEwODEKK2YgMTE0NDYvMTQ0OTAvMTE3MiAxMTQyNS8xNDQyOC8xMTcyIDExNTQ3LzE0NDkwLzExNzIKK2YgMTE1NDAvMTQ0MDkvMTE3MiAxMTU0My8xNDQxMC8xMTcyIDExNDQxLzE0NDEwLzExNzIKK2YgMTE0NDEvMTQ0MTAvMTE3MiAxMTQyOC8xNDQwOS8xMTcyIDExNTQwLzE0NDA5LzExNzIKK2YgMTE1MzcvMTQ0ODUvMTA0MyAxMTU1NS8xNDQ5MS8xMDQzIDExNDU5LzE0NDkxLzEwNDMKK2YgMTE0NTkvMTQ0OTEvMTA0MyAxMTM3OC8xNDIxMC8xMDQzIDExNTM3LzE0NDg1LzEwNDMKK2YgMTE1NDEvMTQ0OTIvMTE3MiAxMTUzMy8xNDQ2OS8xMTcyIDExMzQwLzE0NDY5LzExNzIKK2YgMTEzNDAvMTQ0NjkvMTE3MiAxMTQzNy8xNDQ5Mi8xMTcyIDExNTQxLzE0NDkyLzExNzIKK2YgMTE1NDIvMTQ0OTMvMTE3MiAxMTU0MS8xNDQ5Mi8xMTcyIDExNDM3LzE0NDkyLzExNzIKK2YgMTE0MzcvMTQ0OTIvMTE3MiAxMTQ0MC8xNDQ5My8xMTcyIDExNTQyLzE0NDkzLzExNzIKK2YgMTE1NDMvMTQ0MTAvMTE3MiAxMTU0Mi8xNDQ5My8xMTcyIDExNDQwLzE0NDkzLzExNzIKK2YgMTE0NDAvMTQ0OTMvMTE3MiAxMTQ0MS8xNDQxMC8xMTcyIDExNTQzLzE0NDEwLzExNzIKK2YgMTE1NDQvMTQ0OTQvMTE3MiAxMTU0MC8xNDQwOS8xMTcyIDExNDI4LzE0NDA5LzExNzIKK2YgMTE0MjgvMTQ0MDkvMTE3MiAxMTQ0My8xNDQ5NC8xMTcyIDExNTQ0LzE0NDk0LzExNzIKK2YgMTE1NDUvMTQ0OTUvMTE3MiAxMTU0NC8xNDQ5NC8xMTcyIDExNDQzLzE0NDk0LzExNzIKK2YgMTE0NDMvMTQ0OTQvMTE3MiAxMTQ0NC8xNDQ5NS8xMTcyIDExNTQ1LzE0NDk1LzExNzIKK2YgMTE1NDYvMTQ0OTYvMTE3MiAxMTU0NS8xNDQ5NS8xMTcyIDExNDQ0LzE0NDk1LzExNzIKK2YgMTE0NDQvMTQ0OTUvMTE3MiAxMTQ0NS8xNDQ5Ni8xMTcyIDExNTQ2LzE0NDk2LzExNzIKK2YgMTE1NDcvMTQ0OTAvMTE3MiAxMTU0Ni8xNDQ5Ni8xMTcyIDExNDQ1LzE0NDk2LzExNzIKK2YgMTE0NDUvMTQ0OTYvMTE3MiAxMTQ0Ni8xNDQ5MC8xMTcyIDExNTQ3LzE0NDkwLzExNzIKK2YgMTE1NDgvMTQ0ODkvMTA0MyAxMTU0OS8xNDQ5Ny8xMDQzIDExNDUzLzE0NDk3LzEwNDMKK2YgMTE0NTMvMTQ0OTcvMTA0MyAxMTQ1Mi8xNDQ4OS8xMDQzIDExNTQ4LzE0NDg5LzEwNDMKK2YgMTE1NDkvMTQ0OTcvMTA0MyAxMTU1MC8xNDQ5OC8xMDQzIDExNDU0LzE0NDk4LzEwNDMKK2YgMTE0NTQvMTQ0OTgvMTA4MSAxMTQ1My8xNDQ5Ny8xMDgxIDExNTQ5LzE0NDk3LzEwODEKK2YgMTE1NTAvMTQ0OTgvMTA2NSAxMTU1MS8xNDQ5OS8xMDY1IDExNDU1LzE0NDk5LzEwNjUKK2YgMTE0NTUvMTQ0OTkvMTA0MyAxMTQ1NC8xNDQ5OC8xMDQzIDExNTUwLzE0NDk4LzEwNDMKK2YgMTE1NTEvMTQ0OTkvMTA0MyAxMTU1Mi8xNDUwMC8xMDQzIDExNDU2LzE0NTAwLzEwNDMKK2YgMTE0NTYvMTQ1MDAvMTA0MyAxMTQ1NS8xNDQ5OS8xMDQzIDExNTUxLzE0NDk5LzEwNDMKK2YgMTE1NTIvMTQ1MDAvMTA4MSAxMTU1My8xNDUwMS8xMDgxIDExNDU3LzE0NTAxLzEwODEKK2YgMTE0NTcvMTQ1MDEvMTA4MSAxMTQ1Ni8xNDUwMC8xMDgxIDExNTUyLzE0NTAwLzEwODEKK2YgMTE1NTMvMTQ1MDEvMTA0MyAxMTU1NC8xNDUwMi8xMDQzIDExNDU4LzE0NTAyLzEwNDMKK2YgMTE0NTgvMTQ1MDIvMTA0MyAxMTQ1Ny8xNDUwMS8xMDQzIDExNTUzLzE0NTAxLzEwNDMKK2YgMTE1NTQvMTQ1MDIvMTA0MyAxMTUzOC8xNDUwMy8xMDQzIDExNDI1LzE0NTAzLzEwNDMKK2YgMTE0MjUvMTQ1MDMvMTA0MyAxMTQ1OC8xNDUwMi8xMDQzIDExNTU0LzE0NTAyLzEwNDMKK2YgMTE1NTUvMTQ0OTEvMTA0MyAxMTU1Ni8xNDMxNi8xMDQzIDExNDYwLzE0MzE2LzEwNDMKK2YgMTE0NjAvMTQzMTYvMTA0MyAxMTQ1OS8xNDQ5MS8xMDQzIDExNTU1LzE0NDkxLzEwNDMKK2YgMTE1NTYvMTQzMTYvMTA0MyAxMTUzOS8xNDMxNC8xMDQzIDExNDI3LzE0MzE0LzEwNDMKK2YgMTE0MjcvMTQzMTQvMTA0MyAxMTQ2MC8xNDMxNi8xMDQzIDExNTU2LzE0MzE2LzEwNDMKK2YgMTE0NjMvMTQ1MDQvMTA4MCAxMTUxMS8xNDQ1OS8xMDgwIDExNTEyLzE0NDU4LzEwODAKK2YgMTE1MTIvMTQ0NTgvMTA4MCAxMTQ2NC8xNDUwNS8xMDgwIDExNDYzLzE0NTA0LzEwODAKK2YgMTE0NjMvMTQ1MDQvNDMxMiAxMTQ2Mi8xNDUwNi80MzEyIDExNTEwLzE0NDYwLzQzMTIKK2YgMTE1MTAvMTQ0NjAvNDMxMiAxMTUxMS8xNDQ1OS80MzEyIDExNDYzLzE0NTA0LzQzMTIKK2YgMTE0NjIvMTQ1MDcvNDAwMyAxMTQ2MS8xNDUwOC80MDAzIDExNTA5LzE0NDYyLzQwMDMKK2YgMTE1MDkvMTQ0NjIvNDAwMyAxMTUxMC8xNDQ2MS80MDAzIDExNDYyLzE0NTA3LzQwMDMKK2YgMTE0NjEvMTQ1MDgvNDAwNCAxMTQ4NC8xNDUwOS80MDA0IDExNTMyLzE0NDY0LzQwMDQKK2YgMTE1MzIvMTQ0NjQvNDAwNCAxMTUwOS8xNDQ2Mi80MDA0IDExNDYxLzE0NTA4LzQwMDQKK2YgMTE0NjYvMTQ1MTAvMTA4OCAxMTUxNC8xNDQ2Ni8xMDg4IDExNTIzLzE0NDY1LzEwODgKK2YgMTE1MjMvMTQ0NjUvMTA4OCAxMTQ3NS8xNDUxMS8xMDg4IDExNDY2LzE0NTEwLzEwODgKK2YgMTE0NjUvMTQ1MTIvMTE3MiAxMTUxMy8xNDE4MC8xMTcyIDExNTIyLzE0NDY3LzExNzIKK2YgMTE1MjIvMTQ0NjcvMTE3MiAxMTQ3NC8xNDUxMy8xMTcyIDExNDY1LzE0NTEyLzExNzIKK2YgMTE1MTUvMTQxNTkvMTE3MiAxMTUxOC8xNDE1OC8xMTcyIDExNDcwLzE0NTE0LzExNzIKK2YgMTE0NzAvMTQ1MTQvMTE3MiAxMTQ2Ny8xNDUxNS8xMTcyIDExNTE1LzE0MTU5LzExNzIKK2YgMTE0ODIvMTQ1MTYvMTA0NCAxMTQ2NC8xNDUwNS8xMDQ0IDExNTEyLzE0NDU4LzEwNDQKK2YgMTE1MTIvMTQ0NTgvMTA0NCAxMTUzMC8xNDQ2OC8xMDQ0IDExNDgyLzE0NTE2LzEwNDQKK2YgMTE1MTYvMTQ0NzAvMTE3MiAxMTUzMy8xNDQ2OS8xMTcyIDExNDg1LzE0NTE3LzExNzIKK2YgMTE0ODUvMTQ1MTcvMTE3MiAxMTQ2OC8xNDUxOC8xMTcyIDExNTE2LzE0NDcwLzExNzIKK2YgMTE0NjkvMTQ1MTkvMTE3MiAxMTUxNy8xNDQ3MS8xMTcyIDExNTE2LzE0NDcwLzExNzIKK2YgMTE1MTYvMTQ0NzAvMTE3MiAxMTQ2OC8xNDUxOC8xMTcyIDExNDY5LzE0NTE5LzExNzIKK2YgMTE0NzAvMTQ1MTQvMTE3MiAxMTUxOC8xNDE1OC8xMTcyIDExNTE3LzE0NDcxLzExNzIKK2YgMTE1MTcvMTQ0NzEvMTE3MiAxMTQ2OS8xNDUxOS8xMTcyIDExNDcwLzE0NTE0LzExNzIKK2YgMTE0NzEvMTQ1MjAvMTE3MiAxMTUxOS8xNDQ3Mi8xMTcyIDExNTE1LzE0MTU5LzExNzIKK2YgMTE1MTUvMTQxNTkvMTE3MiAxMTQ2Ny8xNDUxNS8xMTcyIDExNDcxLzE0NTIwLzExNzIKK2YgMTE0NzIvMTQ1MjEvMTE3MiAxMTUyMC8xNDE4OS8xMTcyIDExNTE5LzE0NDcyLzExNzIKK2YgMTE1MTkvMTQ0NzIvMTE3MiAxMTQ3MS8xNDUyMC8xMTcyIDExNDcyLzE0NTIxLzExNzIKK2YgMTE0NzMvMTQ1MjIvMTE3MiAxMTUyMS8xNDE5MC8xMTcyIDExNTIwLzE0MTg5LzExNzIKK2YgMTE1MjAvMTQxODkvMTE3MiAxMTQ3Mi8xNDUyMS8xMTcyIDExNDczLzE0NTIyLzExNzIKK2YgMTE0NzQvMTQ1MTMvMTE3MiAxMTUyMi8xNDQ2Ny8xMTcyIDExNTIxLzE0MTkwLzExNzIKK2YgMTE1MjEvMTQxOTAvMTE3MiAxMTQ3My8xNDUyMi8xMTcyIDExNDc0LzE0NTEzLzExNzIKK2YgMTE0NzUvMTQ1MTEvMTA0NCAxMTUyMy8xNDQ2NS8xMDQ0IDExNTI0LzE0NDczLzEwNDQKK2YgMTE1MjQvMTQ0NzMvMTA0NCAxMTQ3Ni8xNDUyMy8xMDQ0IDExNDc1LzE0NTExLzEwNDQKK2YgMTE0NzYvMTQ1MjMvMTA0NCAxMTUyNC8xNDQ3My8xMDQ0IDExNTI1LzE0NDc0LzEwNDQKK2YgMTE1MjUvMTQ0NzQvMTA0NCAxMTQ3Ny8xNDUyNC8xMDQ0IDExNDc2LzE0NTIzLzEwNDQKK2YgMTE0NzcvMTQ1MjQvMTA0NCAxMTUyNS8xNDQ3NC8xMDQ0IDExNTI2LzE0NDc2LzEwNDQKK2YgMTE1MjYvMTQ0NzYvMTA0NCAxMTQ3OC8xNDUyNS8xMDQ0IDExNDc3LzE0NTI0LzEwNDQKK2YgMTE0NzgvMTQ1MjUvMTA0NCAxMTUyNi8xNDQ3Ni8xMDQ0IDExNTI3LzE0NDc3LzEwNDQKK2YgMTE1MjcvMTQ0NzcvMTA0NCAxMTQ3OS8xNDUyNi8xMDQ0IDExNDc4LzE0NTI1LzEwNDQKK2YgMTE0NzkvMTQ1MjYvMTA0NCAxMTUyNy8xNDQ3Ny8xMDQ0IDExNTI4LzE0NDc4LzEwNDQKK2YgMTE1MjgvMTQ0NzgvMTA0NCAxMTQ4MC8xNDUyNy8xMDQ0IDExNDc5LzE0NTI2LzEwNDQKK2YgMTE0ODAvMTQ1MjcvMTA4OCAxMTUyOC8xNDQ3OC8xMDg4IDExNTI5LzE0NDgwLzEwODgKK2YgMTE1MjkvMTQ0ODAvMTA4OCAxMTQ4MS8xNDUyOC8xMDg4IDExNDgwLzE0NTI3LzEwODgKK2YgMTE0ODEvMTQ1MjgvMTA0NCAxMTUyOS8xNDQ4MC8xMDQ0IDExNTEzLzE0NDgyLzEwNDQKK2YgMTE1MTMvMTQ0ODIvMTA0NCAxMTQ2NS8xNDUyOS8xMDQ0IDExNDgxLzE0NTI4LzEwNDQKK2YgMTE0ODIvMTQ1MTYvMTA4OCAxMTUzMC8xNDQ2OC8xMDg4IDExNTMxLzE0MDI4LzEwODgKK2YgMTE1MzEvMTQwMjgvMTA0NCAxMTQ4My8xNDUzMC8xMDQ0IDExNDgyLzE0NTE2LzEwNDQKK2YgMTE0ODMvMTQ1MzAvMTA0NCAxMTUzMS8xNDAyOC8xMDQ0IDExNTE0LzE0NDY2LzEwNDQKK2YgMTE1MTQvMTQ0NjYvMTA0NCAxMTQ2Ni8xNDUxMC8xMDQ0IDExNDgzLzE0NTMwLzEwNDQKK2YgMTE0ODkvMTQ1MzEvMTYzMiAxMTUzNy8xNDQ4NS8xNjMyIDExNTM2LzE0NDg0LzE2MzIKK2YgMTE1MzYvMTQ0ODQvMTYzMiAxMTQ4OC8xNDUzMi8xNjMyIDExNDg5LzE0NTMxLzE2MzIKK2YgMTE0ODcvMTQ1MzMvNDAwMCAxMTQ4OC8xNDUzMi80MDAwIDExNTM2LzE0NDg0LzQwMDAKK2YgMTE1MzYvMTQ0ODQvNDAwMCAxMTUzNS8xNDQxNi80MDAwIDExNDg3LzE0NTMzLzQwMDAKK2YgMTE0ODYvMTQ1MzQvNDAwNiAxMTQ4Ny8xNDUzNS80MDA2IDExNTM1LzE0NDg3LzQwMDYKK2YgMTE1MzUvMTQ0ODcvNDAwNiAxMTUzNC8xNDQ4Ni80MDA2IDExNDg2LzE0NTM0LzQwMDYKK2YgMTE0ODQvMTQ1MDkvNDMxOSAxMTQ4Ni8xNDUzNC80MzE5IDExNTM0LzE0NDg2LzQzMTkKK2YgMTE1MzQvMTQ0ODYvNDMxOSAxMTUzMi8xNDQ2NC80MzE5IDExNDg0LzE0NTA5LzQzMTkKK2YgMTE1MDAvMTQ1MzYvMTA4MSAxMTU0OC8xNDQ4OS8xMDgxIDExNTM5LzE0MzE0LzEwODEKK2YgMTE1MzkvMTQzMTQvMTA0MyAxMTQ5MS8xNDUzNy8xMDQzIDExNTAwLzE0NTM2LzEwNDMKK2YgMTE0OTkvMTQ1MzgvMTE3MiAxMTU0Ny8xNDQ5MC8xMTcyIDExNTM4LzE0NDI4LzExNzIKK2YgMTE1MzgvMTQ0MjgvMTE3MiAxMTQ5MC8xNDUzOS8xMTcyIDExNDk5LzE0NTM4LzExNzIKK2YgMTE0OTUvMTQ1NDAvMTE3MiAxMTU0My8xNDQxMC8xMTcyIDExNTQwLzE0NDA5LzExNzIKK2YgMTE1NDAvMTQ0MDkvMTE3MiAxMTQ5Mi8xNDU0MS8xMTcyIDExNDk1LzE0NTQwLzExNzIKK2YgMTE1MzcvMTQ0ODUvMTA0MyAxMTQ4OS8xNDUzMS8xMDQzIDExNTA3LzE0NTQyLzEwNDMKK2YgMTE1MDcvMTQ1NDIvMTA0MyAxMTU1NS8xNDQ5MS8xMDQzIDExNTM3LzE0NDg1LzEwNDMKK2YgMTE0ODUvMTQ1MTcvMTE3MiAxMTUzMy8xNDQ2OS8xMTcyIDExNTQxLzE0NDkyLzExNzIKK2YgMTE1NDEvMTQ0OTIvMTE3MiAxMTQ5My8xNDU0My8xMTcyIDExNDg1LzE0NTE3LzExNzIKK2YgMTE1NDEvMTQ0OTIvMTE3MiAxMTU0Mi8xNDQ5My8xMTcyIDExNDk0LzE0NTQ0LzExNzIKK2YgMTE0OTQvMTQ1NDQvMTE3MiAxMTQ5My8xNDU0My8xMTcyIDExNTQxLzE0NDkyLzExNzIKK2YgMTE0OTQvMTQ1NDQvMTE3MiAxMTU0Mi8xNDQ5My8xMTcyIDExNTQzLzE0NDEwLzExNzIKK2YgMTE1NDMvMTQ0MTAvMTE3MiAxMTQ5NS8xNDU0MC8xMTcyIDExNDk0LzE0NTQ0LzExNzIKK2YgMTE0OTIvMTQ1NDEvMTE3MiAxMTU0MC8xNDQwOS8xMTcyIDExNTQ0LzE0NDk0LzExNzIKK2YgMTE1NDQvMTQ0OTQvMTE3MiAxMTQ5Ni8xNDU0NS8xMTcyIDExNDkyLzE0NTQxLzExNzIKK2YgMTE0OTYvMTQ1NDUvMTE3MiAxMTU0NC8xNDQ5NC8xMTcyIDExNTQ1LzE0NDk1LzExNzIKK2YgMTE1NDUvMTQ0OTUvMTE3MiAxMTQ5Ny8xNDU0Ni8xMTcyIDExNDk2LzE0NTQ1LzExNzIKK2YgMTE0OTcvMTQ1NDYvMTE3MiAxMTU0NS8xNDQ5NS8xMTcyIDExNTQ2LzE0NDk2LzExNzIKK2YgMTE1NDYvMTQ0OTYvMTE3MiAxMTQ5OC8xNDU0Ny8xMTcyIDExNDk3LzE0NTQ2LzExNzIKK2YgMTE0OTgvMTQ1NDcvMTE3MiAxMTU0Ni8xNDQ5Ni8xMTcyIDExNTQ3LzE0NDkwLzExNzIKK2YgMTE1NDcvMTQ0OTAvMTE3MiAxMTQ5OS8xNDUzOC8xMTcyIDExNDk4LzE0NTQ3LzExNzIKK2YgMTE1MDEvMTQ1NDgvMTA0MyAxMTU0OS8xNDQ5Ny8xMDQzIDExNTQ4LzE0NDg5LzEwNDMKK2YgMTE1NDgvMTQ0ODkvMTA0MyAxMTUwMC8xNDUzNi8xMDQzIDExNTAxLzE0NTQ4LzEwNDMKK2YgMTE1MDIvMTQ1NDkvMTA0MyAxMTU1MC8xNDQ5OC8xMDQzIDExNTQ5LzE0NDk3LzEwNDMKK2YgMTE1NDkvMTQ0OTcvMTA0MyAxMTUwMS8xNDU0OC8xMDQzIDExNTAyLzE0NTQ5LzEwNDMKK2YgMTE1MDMvMTQ1NTAvMTA0MyAxMTU1MS8xNDQ5OS8xMDQzIDExNTUwLzE0NDk4LzEwNDMKK2YgMTE1NTAvMTQ0OTgvMTA0MyAxMTUwMi8xNDU0OS8xMDQzIDExNTAzLzE0NTUwLzEwNDMKK2YgMTE1MDQvMTQ1NTEvMTA0MyAxMTU1Mi8xNDUwMC8xMDQzIDExNTUxLzE0NDk5LzEwNDMKK2YgMTE1NTEvMTQ0OTkvMTA0MyAxMTUwMy8xNDU1MC8xMDQzIDExNTA0LzE0NTUxLzEwNDMKK2YgMTE1MDUvMTQ1NTIvMTA4MSAxMTU1My8xNDUwMS8xMDgxIDExNTUyLzE0NTAwLzEwODEKK2YgMTE1NTIvMTQ1MDAvMTA4MSAxMTUwNC8xNDU1MS8xMDgxIDExNTA1LzE0NTUyLzEwODEKK2YgMTE1MDYvMTQ1NTMvMTA0MyAxMTU1NC8xNDUwMi8xMDQzIDExNTUzLzE0NTAxLzEwNDMKK2YgMTE1NTMvMTQ1MDEvMTA0MyAxMTUwNS8xNDU1Mi8xMDQzIDExNTA2LzE0NTUzLzEwNDMKK2YgMTE0OTAvMTQ1NTQvMTA0MyAxMTUzOC8xNDUwMy8xMDQzIDExNTU0LzE0NTAyLzEwNDMKK2YgMTE1NTQvMTQ1MDIvMTA0MyAxMTUwNi8xNDU1My8xMDQzIDExNDkwLzE0NTU0LzEwNDMKK2YgMTE1MDgvMTQ1NTUvMTA0MyAxMTU1Ni8xNDMxNi8xMDQzIDExNTU1LzE0NDkxLzEwNDMKK2YgMTE1NTUvMTQ0OTEvMTA0MyAxMTUwNy8xNDU0Mi8xMDQzIDExNTA4LzE0NTU1LzEwNDMKK2YgMTE1MzkvMTQzMTQvMTA0MyAxMTU1Ni8xNDMxNi8xMDQzIDExNTA4LzE0NTU1LzEwNDMKK2YgMTE1MDgvMTQ1NTUvMTA0MyAxMTQ5MS8xNDUzNy8xMDQzIDExNTM5LzE0MzE0LzEwNDMKK2YgMTE3NDgvMTQ1NTYvNDMyMCAxMTgyMy8xNDU1Ny80MzIwIDExODIwLzE0NTU4LzQzMjAKK2YgMTE4MjAvMTQ1NTkvNDMyMSAxMTcxMy8xNDU2MC80MzIxIDExNzQ4LzE0NTYxLzQzMjEKK2YgMTE3NDUvMTQ1NjIvNDMyMiAxMTc1MS8xNDU2My80MzIyIDExNzE1LzE0NTY0LzQzMjIKK2YgMTE3MTUvMTQ1NjQvNDMyMyAxMTc0Ni8xNDU2NS80MzIzIDExNzQ1LzE0NTYyLzQzMjMKK2YgMTE3NTEvMTQ1NjYvNDMyNCAxMTc1NC8xNDU2Ny80MzI0IDExNzE3LzE0NTY4LzQzMjQKK2YgMTE3MTcvMTQ1NjgvNDMyNSAxMTcxNS8xNDU2OS80MzI1IDExNzUxLzE0NTY2LzQzMjUKK2YgMTE3MTYvMTQ1NzAvNDMyNiAxMTcwMi8xNDU3MS80MzI2IDExNzAxLzE0NTcyLzQzMjYKK2YgMTE3MDEvMTQ1NzIvNDMyNyAxMTcxNC8xNDU3My80MzI3IDExNzE2LzE0NTcwLzQzMjcKK2YgMTE3MTUvMTQ1NzQvNDMyOCAxMTcxNy8xNDU3NS80MzI4IDExNzE2LzE0NTcwLzQzMjgKK2YgMTE3MTYvMTQ1NzAvNDMyOSAxMTcxNC8xNDU3My80MzI5IDExNzE1LzE0NTc0LzQzMjkKK2YgMTE3MTEvMTQ1NzYvNDMzMCAxMTcxMi8xNDU3Ny80MzMwIDExODIxLzE0NTc4LzQzMzAKK2YgMTE4MjEvMTQ1NzgvNDMzMSAxMTgyMi8xNDU3OS80MzMxIDExNzExLzE0NTc2LzQzMzEKK2YgMTE4MTkvMTQ1ODAvNDMzMiAxMTgzNC8xNDU4MS80MzMyIDExNzExLzE0NTgyLzQzMzIKK2YgMTE3MTEvMTQ1ODIvNDMzMyAxMTgyMi8xNDU4My80MzMzIDExODE5LzE0NTgwLzQzMzMKK2YgMTE3MzQvMTQ1ODQvNDEzMyAxMTcxOC8xNDU4NS80MTMzIDExODM1LzE0NTg2LzQxMzMKK2YgMTE4MzUvMTQ1ODYvNDEzMyAxMTcwNi8xNDU4Ny80MTMzIDExNzM0LzE0NTg0LzQxMzMKK2YgMTE3ODAvMTQ1ODgvNDIxNSAxMTc1Ni8xNDU4OS80MjE1IDExNzE5LzE0NTkwLzQyMTUKK2YgMTE3MTkvMTQ1OTAvNDMzNCAxMTczNS8xNDU5MS80MzM0IDExNzgwLzE0NTg4LzQzMzQKK2YgMTE3MzUvMTQ1OTIvNDEyNyAxMTcxOS8xNDU5My80MTI3IDExNzE4LzE0NTk0LzQxMjcKK2YgMTE3MTgvMTQ1OTQvNDEyNyAxMTczNC8xNDU5NS80MTI3IDExNzM1LzE0NTkyLzQxMjcKK2YgMTE3MTgvMTQ1OTYvNDEyOCAxMTcyMC8xNDU5Ny80MTI4IDExNzAzLzE0NTk4LzQxMjgKK2YgMTE3MDMvMTQ1OTgvNDE0MCAxMTgzNS8xNDU5OS80MTQwIDExNzE4LzE0NTk2LzQxNDAKK2YgMTE3NTYvMTQ2MDAvNDIxMyAxMTc1OS8xNDYwMS80MjEzIDExNzIxLzE0NjAyLzQyMTMKK2YgMTE3MjEvMTQ2MDIvNDIxOCAxMTcxOS8xNDYwMy80MjE4IDExNzU2LzE0NjAwLzQyMTgKK2YgMTE3MTkvMTQ1OTMvNDMzNSAxMTcyMS8xNDYwNC80MzM1IDExNzIwLzE0NjA1LzQzMzUKK2YgMTE3MjAvMTQ2MDUvNDMzNSAxMTcxOC8xNDU5NC80MzM1IDExNzE5LzE0NTkzLzQzMzUKK2YgMTE3MzYvMTQ2MDYvNDEyNCAxMTcyMi8xNDYwNy80MTI0IDExNzA0LzE0NjA4LzQxMjQKK2YgMTE3MDQvMTQ2MDgvNDEzMyAxMTgzNi8xNDYwOS80MTMzIDExNzM2LzE0NjA2LzQxMzMKK2YgMTE3ODIvMTQ2MTAvNDIxNSAxMTc2Mi8xNDYxMS80MjE1IDExNzIzLzE0NjEyLzQyMTUKK2YgMTE3MjMvMTQ2MTIvNDIxNiAxMTczNy8xNDYxMy80MjE2IDExNzgyLzE0NjEwLzQyMTYKK2YgMTE3MzcvMTQ2MTQvNDMzNiAxMTcyMy8xNDYxNS80MzM2IDExNzIyLzE0NjE2LzQzMzYKK2YgMTE3MjIvMTQ2MTYvNDIyNyAxMTczNi8xNDYxNy80MjI3IDExNzM3LzE0NjE0LzQyMjcKK2YgMTE3MjIvMTQ2MTgvNDE0MCAxMTcyNC8xNDYxOS80MTQwIDExNzA1LzE0NjIwLzQxNDAKK2YgMTE3MDUvMTQ2MjAvNDEzOSAxMTcwNC8xNDYyMS80MTM5IDExNzIyLzE0NjE4LzQxMzkKK2YgMTE3NjIvMTQ2MjIvNDMzNyAxMTc2NS8xNDYyMy80MzM3IDExNzI1LzE0NjI0LzQzMzcKK2YgMTE3MjUvMTQ2MjQvNDMzOCAxMTcyMy8xNDYyNS80MzM4IDExNzYyLzE0NjIyLzQzMzgKK2YgMTE3MjMvMTQ2MTUvNDEzMSAxMTcyNS8xNDYyNi80MTMxIDExNzI0LzE0NjI3LzQxMzEKK2YgMTE3MjQvMTQ2MjcvNDIzMSAxMTcyMi8xNDYxNi80MjMxIDExNzIzLzE0NjE1LzQyMzEKK2YgMTE3MzgvMTQ2MjgvNDEzMyAxMTcyNi8xNDYyOS80MTMzIDExNzI3LzE0NjMwLzQxMzMKK2YgMTE3MjcvMTQ2MzAvNDEyNCAxMTgzNy8xNDYzMS80MTI0IDExNzM4LzE0NjI4LzQxMjQKK2YgMTE3ODUvMTQ2MzIvNDMzOSAxMTc2OS8xNDYzMy80MzM5IDExNzI4LzE0NjM0LzQzMzkKK2YgMTE3MjgvMTQ2MzQvNDM0MCAxMTczOS8xNDYzNS80MzQwIDExNzg1LzE0NjMyLzQzNDAKK2YgMTE3MzkvMTQ2MzYvNDEyNyAxMTcyOC8xNDYzNy80MTI3IDExNzI2LzE0NjM4LzQxMjcKK2YgMTE3MjYvMTQ2MzgvNDM0MSAxMTczOC8xNDYzOS80MzQxIDExNzM5LzE0NjM2LzQzNDEKK2YgMTE3MjYvMTQ2NDAvNDEzOSAxMTcyOS8xNDY0MS80MTM5IDExODY0LzE0NjQyLzQxMzkKK2YgMTE4NjQvMTQ2NDIvNDIyOCAxMTcyNy8xNDY0My80MjI4IDExNzI2LzE0NjQwLzQyMjgKK2YgMTE3NjkvMTQ2NDQvNDM0MiAxMTc3My8xNDY0NS80MzQyIDExNzMwLzE0NjQ2LzQzNDIKK2YgMTE3MzAvMTQ2NDYvNDM0MyAxMTcyOC8xNDY0Ny80MzQzIDExNzY5LzE0NjQ0LzQzNDMKK2YgMTE3MjgvMTQ2MzcvNDE0MyAxMTczMC8xNDY0OC80MTQzIDExNzI5LzE0NjQ5LzQxNDMKK2YgMTE3MjkvMTQ2NDkvNDM0NCAxMTcyNi8xNDYzOC80MzQ0IDExNzI4LzE0NjM3LzQzNDQKK2YgMTE3NDAvMTQ2NTAvNDEyNCAxMTczMS8xNDY1MS80MTI0IDExNzMyLzE0NjUyLzQxMjQKK2YgMTE3MzIvMTQ2NTIvNDE1MiAxMTc0MS8xNDY1My80MTUyIDExNzQwLzE0NjUwLzQxNTIKK2YgMTE3ODkvMTQ2NTQvNDM0NSAxMTc3Ni8xNDY1NS80MzQ1IDExNzMzLzE0NjU2LzQzNDUKK2YgMTE3MzMvMTQ2NTYvNDM0NiAxMTc0Mi8xNDY1Ny80MzQ2IDExNzg5LzE0NjU0LzQzNDYKK2YgMTE3NDIvMTQ2NTgvNDIyMSAxMTczMy8xNDY1OS80MjIxIDExNzMxLzE0NjYwLzQyMjEKK2YgMTE3MzEvMTQ2NjAvNDIyMSAxMTc0MC8xNDY2MS80MjIxIDExNzQyLzE0NjU4LzQyMjEKK2YgMTE3MzQvMTQ1OTUvNjg3IDExNzA2LzE0NjYyLzY4NyAxMTcwMi8xNDY2My82ODcKK2YgMTE3MDIvMTQ2NjMvNjg3IDExNzE2LzE0NjY0LzY4NyAxMTczNC8xNDU5NS82ODcKK2YgMTE3MzUvMTQ1OTIvNjg3IDExNzM0LzE0NTk1LzY4NyAxMTcxNi8xNDY2NC82ODcKK2YgMTE3MTYvMTQ2NjQvNjg3IDExNzE3LzE0NjY1LzY4NyAxMTczNS8xNDU5Mi82ODcKK2YgMTE3ODAvMTQ2NjYvNjg3IDExNzM1LzE0NTkyLzY4NyAxMTcxNy8xNDY2NS82ODcKK2YgMTE3MTcvMTQ2NjUvNjg3IDExNzU0LzE0NjY3LzY4NyAxMTc4MC8xNDY2Ni82ODcKK2YgMTE3MzYvMTQ2MTcvNjg3IDExODM2LzE0NjY4LzY4NyAxMTcwMy8xNDY2OS82ODcKK2YgMTE3MDMvMTQ2NjkvNjg3IDExNzIwLzE0NjA1LzY4NyAxMTczNi8xNDYxNy82ODcKK2YgMTE3ODIvMTQ2NzAvNjg3IDExNzM3LzE0NjE0LzY4NyAxMTcyMS8xNDYwNC82ODcKK2YgMTE3MjEvMTQ2MDQvNjg3IDExNzU5LzE0NjcxLzY4NyAxMTc4Mi8xNDY3MC82ODcKK2YgMTE3MzcvMTQ2MTQvNjg3IDExNzM2LzE0NjE3LzY4NyAxMTcyMC8xNDYwNS82ODcKK2YgMTE3MjAvMTQ2MDUvNjg3IDExNzIxLzE0NjA0LzY4NyAxMTczNy8xNDYxNC82ODcKK2YgMTE3MzgvMTQ2MzkvNjg3IDExODM3LzE0NjcyLzY4NyAxMTcwNS8xNDY3My82ODcKK2YgMTE3MDUvMTQ2NzMvNjg3IDExNzI0LzE0NjI3LzY4NyAxMTczOC8xNDYzOS82ODcKK2YgMTE3ODUvMTQ2NzQvNjg3IDExNzM5LzE0NjM2LzY4NyAxMTcyNS8xNDYyNi82ODcKK2YgMTE3MjUvMTQ2MjYvNjg3IDExNzY1LzE0Njc1LzY4NyAxMTc4NS8xNDY3NC82ODcKK2YgMTE3MzkvMTQ2MzYvMjk1NiAxMTczOC8xNDYzOS8yOTU2IDExNzI0LzE0NjI3LzI5NTYKK2YgMTE3MjQvMTQ2MjcvMjk1NiAxMTcyNS8xNDYyNi8yOTU2IDExNzM5LzE0NjM2LzI5NTYKK2YgMTE3NDAvMTQ2NjEvNjg3IDExNzQxLzE0Njc2LzY4NyAxMTg2NC8xNDY3Ny82ODcKK2YgMTE4NjQvMTQ2NzcvNjg3IDExNzI5LzE0NjQ5LzY4NyAxMTc0MC8xNDY2MS82ODcKK2YgMTE3ODkvMTQ2NzgvNjg3IDExNzQyLzE0NjU4LzY4NyAxMTczMC8xNDY0OC82ODcKK2YgMTE3MzAvMTQ2NDgvNjg3IDExNzczLzE0Njc5LzY4NyAxMTc4OS8xNDY3OC82ODcKK2YgMTE3NDIvMTQ2NTgvNDkzIDExNzQwLzE0NjYxLzQ5MyAxMTcyOS8xNDY0OS80OTMKK2YgMTE3MjkvMTQ2NDkvNDkzIDExNzMwLzE0NjQ4LzQ5MyAxMTc0Mi8xNDY1OC80OTMKK2YgMTE3MzEvMTQ2NjAvNDM0NyAxMTc0My8xNDY4MC80MzQ3IDExODc3LzE0NjgxLzQzNDcKK2YgMTE4NzcvMTQ2ODEvNDM0OCAxMTczMi8xNDY4Mi80MzQ4IDExNzMxLzE0NjYwLzQzNDgKK2YgMTE3NzYvMTQ2ODMvNDM0OSAxMTc5My8xNDY4NC80MzQ5IDExNzQ0LzE0Njg1LzQzNDkKK2YgMTE3NDQvMTQ2ODUvNDM1MCAxMTczMy8xNDY1OS80MzUwIDExNzc2LzE0NjgzLzQzNTAKK2YgMTE3MzMvMTQ2NTkvNDM1MSAxMTc0NC8xNDY4NS80MzUxIDExNzQzLzE0NjgwLzQzNTEKK2YgMTE3NDMvMTQ2ODAvNDE2MSAxMTczMS8xNDY2MC80MTYxIDExNzMzLzE0NjU5LzQxNjEKK2YgMTE4NzcvMTQ2ODEvNDM1MiAxMTc0My8xNDY4MC80MzUyIDExNzQ0LzE0Njg1LzQzNTIKK2YgMTE3NDQvMTQ2ODUvMTUwNyAxMTg3OS8xNDY4Ni8xNTA3IDExODc3LzE0NjgxLzE1MDcKK2YgMTE4NzkvMTQ2ODYvNjg3IDExNzQ0LzE0Njg1LzY4NyAxMTc5My8xNDY4NC82ODcKK2YgMTE3OTMvMTQ2ODQvNjg3IDExOTI3LzE0Njg3LzY4NyAxMTg3OS8xNDY4Ni82ODcKK2YgMTE4MjEvMTQ1NzgvMzk2NSAxMTgyMC8xNDU1OC8zOTY1IDExNzQ1LzE0Njg4LzM5NjUKK2YgMTE3NDUvMTQ2ODgvNjg3IDExNzQ2LzE0Njg5LzY4NyAxMTgyMS8xNDU3OC82ODcKK2YgMTE3MTQvMTQ2OTAvNDE2MiAxMTc0Ny8xNDY5MS80MTYyIDExNzQ2LzE0Njg5LzQxNjIKK2YgMTE3NDYvMTQ2ODkvNDM1MyAxMTcxNS8xNDY5Mi80MzUzIDExNzE0LzE0NjkwLzQzNTMKK2YgMTE3MDEvMTQ2OTMvNDE2NSAxMTcwNy8xNDY5NC80MTY1IDExNzQ3LzE0Njk1LzQxNjUKK2YgMTE3NDcvMTQ2OTUvNDE2NSAxMTcxNC8xNDY5Ni80MTY1IDExNzAxLzE0NjkzLzQxNjUKK2YgMTE4MDAvMTQ2OTcvNDM1NCAxMTgyNC8xNDY5OC80MzU0IDExODMzLzE0Njk5LzQzNTQKK2YgMTE3NDUvMTQ1NjIvNDM1NSAxMTc5Ni8xNDcwMC80MzU1IDExNzUwLzE0NzAxLzQzNTUKK2YgMTE3NTAvMTQ3MDEvNDM1NiAxMTc1MS8xNDU2My80MzU2IDExNzQ1LzE0NTYyLzQzNTYKK2YgMTE3NTEvMTQ1NjYvNDM1NyAxMTc1MC8xNDcwMi80MzU3IDExNzUzLzE0NzAzLzQzNTcKK2YgMTE3NTMvMTQ3MDMvNDM1OCAxMTc1NC8xNDU2Ny80MzU4IDExNzUxLzE0NTY2LzQzNTgKK2YgMTE3NTIvMTQ3MDQvNDA2NiAxMTc0OS8xNDcwNS80MDY2IDExNzA4LzE0NzA2LzQwNjYKK2YgMTE3MDgvMTQ3MDYvNDM1OSAxMTgzOC8xNDcwNy80MzU5IDExNzUyLzE0NzA0LzQzNTkKK2YgMTE3NTAvMTQ3MDgvNDM2MCAxMTc0OS8xNDcwNS80MzYwIDExNzUyLzE0NzA0LzQzNjAKK2YgMTE3NTIvMTQ3MDQvNDA2OSAxMTc1My8xNDcwOS80MDY5IDExNzUwLzE0NzA4LzQwNjkKK2YgMTE3NzgvMTQ3MTAvNDA3NSAxMTg0Mi8xNDcxMS80MDc1IDExODM5LzE0NzEyLzQwNzUKK2YgMTE4MzkvMTQ3MTIvNDA4NCAxMTc1NS8xNDcxMy80MDg0IDExNzc4LzE0NzEwLzQwODQKK2YgMTE3ODAvMTQ1ODgvNDM2MSAxMTc3OS8xNDcxNC80MzYxIDExNzU3LzE0NzE1LzQzNjEKK2YgMTE3NTcvMTQ3MTUvNDM2MiAxMTc1Ni8xNDU4OS80MzYyIDExNzgwLzE0NTg4LzQzNjIKK2YgMTE3NzkvMTQ3MTYvNDA3OCAxMTc3OC8xNDcxNy80MDc4IDExNzU1LzE0NzE4LzQwNzgKK2YgMTE3NTUvMTQ3MTgvNDA5NCAxMTc1Ny8xNDcxOS80MDk0IDExNzc5LzE0NzE2LzQwOTQKK2YgMTE3NTUvMTQ3MjAvNDA3OSAxMTgzOS8xNDcyMS80MDc5IDExODQwLzE0NzIyLzQwNzkKK2YgMTE4NDAvMTQ3MjIvNDA4MCAxMTc1OC8xNDcyMy80MDgwIDExNzU1LzE0NzIwLzQwODAKK2YgMTE3NTYvMTQ2MDAvNDM2MyAxMTc1Ny8xNDcyNC80MzYzIDExNzYwLzE0NzI1LzQzNjMKK2YgMTE3NjAvMTQ3MjUvNDM2NCAxMTc1OS8xNDYwMS80MzY0IDExNzU2LzE0NjAwLzQzNjQKK2YgMTE3NTcvMTQ3MTkvNDA4MyAxMTc1NS8xNDcxOC80MDgzIDExNzU4LzE0NzI2LzQwODMKK2YgMTE3NTgvMTQ3MjYvNDA4MyAxMTc2MC8xNDcyNy80MDgzIDExNzU3LzE0NzE5LzQwODMKK2YgMTE3ODEvMTQ3MjgvNDI1OCAxMTcxMC8xNDcyOS80MjU4IDExODQxLzE0NzMwLzQyNTgKK2YgMTE4NDEvMTQ3MzAvNDA3NSAxMTc2MS8xNDczMS80MDc1IDExNzgxLzE0NzI4LzQwNzUKK2YgMTE3ODIvMTQ2MTAvNDM2NSAxMTc4My8xNDczMi80MzY1IDExNzYzLzE0NzMzLzQzNjUKK2YgMTE3NjMvMTQ3MzMvNDM2NiAxMTc2Mi8xNDYxMS80MzY2IDExNzgyLzE0NjEwLzQzNjYKK2YgMTE3ODMvMTQ3MzQvNDA3OCAxMTc4MS8xNDczNS80MDc4IDExNzYxLzE0NzM2LzQwNzgKK2YgMTE3NjEvMTQ3MzYvNDM2NyAxMTc2My8xNDczNy80MzY3IDExNzgzLzE0NzM0LzQzNjcKK2YgMTE3NjEvMTQ3MzgvNDA4MCAxMTg0MS8xNDczOS80MDgwIDExNzA5LzE0NzQwLzQwODAKK2YgMTE3MDkvMTQ3NDAvNDA4MCAxMTc2NC8xNDc0MS80MDgwIDExNzYxLzE0NzM4LzQwODAKK2YgMTE3NjIvMTQ2MjIvNDM2OCAxMTc2My8xNDc0Mi80MzY4IDExNzY2LzE0NzQzLzQzNjgKK2YgMTE3NjYvMTQ3NDMvNDM2OSAxMTc2NS8xNDYyMy80MzY5IDExNzYyLzE0NjIyLzQzNjkKK2YgMTE3NjMvMTQ3MzcvNDA4MyAxMTc2MS8xNDczNi80MDgzIDExNzY0LzE0NzQ0LzQwODMKK2YgMTE3NjQvMTQ3NDQvNDA4MyAxMTc2Ni8xNDc0NS80MDgzIDExNzYzLzE0NzM3LzQwODMKK2YgMTE3ODQvMTQ3NDYvNDI1NyAxMTg0My8xNDc0Ny80MjU3IDExNzY4LzE0NzQ4LzQyNTcKK2YgMTE3NjgvMTQ3NDgvNDI1OCAxMTc2Ny8xNDc0OS80MjU4IDExNzg0LzE0NzQ2LzQyNTgKK2YgMTE3ODUvMTQ2MzIvNDM3MCAxMTc4Ni8xNDc1MC80MzcwIDExNzcwLzE0NzUxLzQzNzAKK2YgMTE3NzAvMTQ3NTEvNDM3MSAxMTc2OS8xNDYzMy80MzcxIDExNzg1LzE0NjMyLzQzNzEKK2YgMTE3ODYvMTQ3NTIvNDA5NCAxMTc4NC8xNDc1My80MDk0IDExNzY3LzE0NzU0LzQwOTQKK2YgMTE3NjcvMTQ3NTQvNDA3OCAxMTc3MC8xNDc1NS80MDc4IDExNzg2LzE0NzUyLzQwNzgKK2YgMTE3NjcvMTQ3NTYvNDA5NiAxMTc2OC8xNDc1Ny80MDk2IDExNzcyLzE0NzU4LzQwOTYKK2YgMTE3NzIvMTQ3NTgvNDA5NiAxMTc3MS8xNDc1OS80MDk2IDExNzY3LzE0NzU2LzQwOTYKK2YgMTE3NjkvMTQ2NDQvNDM3MiAxMTc3MC8xNDc2MC80MzcyIDExNzc0LzE0NzYxLzQzNzIKK2YgMTE3NzQvMTQ3NjEvNDM3MyAxMTc3My8xNDY0NS80MzczIDExNzY5LzE0NjQ0LzQzNzMKK2YgMTE3NzAvMTQ3NTUvNDI2MyAxMTc2Ny8xNDc1NC80MjYzIDExNzcxLzE0NzYyLzQyNjMKK2YgMTE3NzEvMTQ3NjIvNDM3NCAxMTc3NC8xNDc2My80Mzc0IDExNzcwLzE0NzU1LzQzNzQKK2YgMTE3ODcvMTQ3NjQvNDI1OCAxMTc4OC8xNDc2NS80MjU4IDExOTA5LzE0NzY2LzQyNTgKK2YgMTE5MDkvMTQ3NjYvNDI1OCAxMTc3NS8xNDc2Ny80MjU4IDExNzg3LzE0NzY0LzQyNTgKK2YgMTE3ODkvMTQ2NTQvNDM3NSAxMTc5MC8xNDc2OC80Mzc1IDExNzc3LzE0NzY5LzQzNzUKK2YgMTE3NzcvMTQ3NjkvNDM3NiAxMTc3Ni8xNDY1NS80Mzc2IDExNzg5LzE0NjU0LzQzNzYKK2YgMTE3OTAvMTQ3NzAvNDA3OCAxMTc4Ny8xNDc3MS80MDc4IDExNzc1LzE0NzcyLzQwNzgKK2YgMTE3NzUvMTQ3NzIvNDM3NyAxMTc3Ny8xNDc3My80Mzc3IDExNzkwLzE0NzcwLzQzNzcKK2YgMTE3NzgvMTQ3MTcvNjg3IDExNzUyLzE0Nzc0LzY4NyAxMTgzOC8xNDc3NS82ODcKK2YgMTE4MzgvMTQ3NzUvNjg3IDExODQyLzE0Nzc2LzY4NyAxMTc3OC8xNDcxNy82ODcKK2YgMTE3NzkvMTQ3MTYvNjg3IDExNzUzLzE0Nzc3LzY4NyAxMTc1Mi8xNDc3NC82ODcKK2YgMTE3NTIvMTQ3NzQvNjg3IDExNzc4LzE0NzE3LzY4NyAxMTc3OS8xNDcxNi82ODcKK2YgMTE3ODAvMTQ2NjYvNjg3IDExNzU0LzE0NjY3LzY4NyAxMTc1My8xNDc3Ny82ODcKK2YgMTE3NTMvMTQ3NzcvNjg3IDExNzc5LzE0NzE2LzY4NyAxMTc4MC8xNDY2Ni82ODcKK2YgMTE3ODEvMTQ3MzUvNjg3IDExNzU4LzE0NzI2LzY4NyAxMTg0MC8xNDc3OC82ODcKK2YgMTE4NDAvMTQ3NzgvMjk1NiAxMTcxMC8xNDc3OS8yOTU2IDExNzgxLzE0NzM1LzI5NTYKK2YgMTE3ODIvMTQ2NzAvNjg3IDExNzU5LzE0NjcxLzY4NyAxMTc2MC8xNDcyNy82ODcKK2YgMTE3NjAvMTQ3MjcvMjk1NiAxMTc4My8xNDczNC8yOTU2IDExNzgyLzE0NjcwLzI5NTYKK2YgMTE3ODMvMTQ3MzQvNDI3NyAxMTc2MC8xNDcyNy80Mjc3IDExNzU4LzE0NzI2LzQyNzcKK2YgMTE3NTgvMTQ3MjYvNjg3IDExNzgxLzE0NzM1LzY4NyAxMTc4My8xNDczNC82ODcKK2YgMTE3ODQvMTQ3NTMvNjg3IDExNzY0LzE0NzQ0LzY4NyAxMTcwOS8xNDc4MC82ODcKK2YgMTE3MDkvMTQ3ODAvNjg3IDExODQzLzE0NzgxLzY4NyAxMTc4NC8xNDc1My82ODcKK2YgMTE3ODUvMTQ2NzQvNjg3IDExNzY1LzE0Njc1LzY4NyAxMTc2Ni8xNDc0NS82ODcKK2YgMTE3NjYvMTQ3NDUvNjg3IDExNzg2LzE0NzUyLzY4NyAxMTc4NS8xNDY3NC82ODcKK2YgMTE3ODYvMTQ3NTIvNjg3IDExNzY2LzE0NzQ1LzY4NyAxMTc2NC8xNDc0NC82ODcKK2YgMTE3NjQvMTQ3NDQvNjg3IDExNzg0LzE0NzUzLzY4NyAxMTc4Ni8xNDc1Mi82ODcKK2YgMTE3ODcvMTQ3NzEvNjg3IDExNzcxLzE0NzYyLzY4NyAxMTc3Mi8xNDc4Mi82ODcKK2YgMTE3NzIvMTQ3ODIvNjg3IDExNzg4LzE0NzgzLzY4NyAxMTc4Ny8xNDc3MS82ODcKK2YgMTE3ODkvMTQ2NzgvNjg3IDExNzczLzE0Njc5LzY4NyAxMTc3NC8xNDc2My82ODcKK2YgMTE3NzQvMTQ3NjMvNjg3IDExNzkwLzE0NzcwLzY4NyAxMTc4OS8xNDY3OC82ODcKK2YgMTE3OTAvMTQ3NzAvMTUwNyAxMTc3NC8xNDc2My8xNTA3IDExNzcxLzE0NzYyLzE1MDcKK2YgMTE3NzEvMTQ3NjIvNjg3IDExNzg3LzE0NzcxLzY4NyAxMTc5MC8xNDc3MC82ODcKK2YgMTE3NzUvMTQ3NzIvNDM3OCAxMTkwOS8xNDc4NC80Mzc4IDExNzkyLzE0Nzg1LzQzNzgKK2YgMTE3OTIvMTQ3ODUvNDM3OSAxMTc5MS8xNDc4Ni80Mzc5IDExNzc1LzE0NzcyLzQzNzkKK2YgMTE3NzYvMTQ2ODMvNDM4MCAxMTc3Ny8xNDc3My80MzgwIDExNzk0LzE0Nzg3LzQzODAKK2YgMTE3OTQvMTQ3ODcvNDM4MSAxMTc5My8xNDY4NC80MzgxIDExNzc2LzE0NjgzLzQzODEKK2YgMTE3NzcvMTQ3NzMvNDEwNyAxMTc3NS8xNDc3Mi80MTA3IDExNzkxLzE0Nzg2LzQxMDcKK2YgMTE3OTEvMTQ3ODYvNDEwNyAxMTc5NC8xNDc4Ny80MTA3IDExNzc3LzE0NzczLzQxMDcKK2YgMTE3OTIvMTQ3ODUvNjg3IDExNzk1LzE0Nzg4LzY4NyAxMTc5NC8xNDc4Ny82ODcKK2YgMTE3OTQvMTQ3ODcvNjg3IDExNzkxLzE0Nzg2LzY4NyAxMTc5Mi8xNDc4NS82ODcKK2YgMTE3OTUvMTQ3ODgvNjg3IDExOTI3LzE0Njg3LzY4NyAxMTc5My8xNDY4NC82ODcKK2YgMTE3OTMvMTQ2ODQvNjg3IDExNzk0LzE0Nzg3LzY4NyAxMTc5NS8xNDc4OC82ODcKK2YgMTE3NDkvMTQ3ODkvNDM4MiAxMTc1MC8xNDc5MC80MzgyIDExNzk2LzE0NzkxLzQzODIKK2YgMTE3OTYvMTQ3OTEvNDM4MiAxMTc5Ny8xNDc5Mi80MzgyIDExNzQ5LzE0Nzg5LzQzODIKK2YgMTE3MDgvMTQ3OTMvNDExMiAxMTc0OS8xNDc5NC80MTEyIDExNzk3LzE0Nzk1LzQxMTIKK2YgMTE3OTcvMTQ3OTUvNDExMyAxMTg0NC8xNDc5Ni80MTEzIDExNzA4LzE0NzkzLzQxMTMKK2YgMTE4MDIvMTQ3OTcvNjg3IDExODAzLzE0Nzk4LzY4NyAxMTc5Ny8xNDc5Mi82ODcKK2YgMTE3OTcvMTQ3OTIvNjg3IDExNzk2LzE0NzkxLzY4NyAxMTgwMi8xNDc5Ny82ODcKK2YgMTE3OTkvMTQ3OTkvNjg3IDExODI0LzE0ODAwLzY4NyAxMTgwOC8xNDgwMS82ODcKK2YgMTE4MDgvMTQ4MDEvMjk1NiAxMTgwNi8xNDgwMi8yOTU2IDExNzk5LzE0Nzk5LzI5NTYKK2YgMTE3OTcvMTQ3OTIvMTUwNyAxMTgwMy8xNDc5OC8xNTA3IDExOTM0LzE0ODAzLzE1MDcKK2YgMTE5MzQvMTQ4MDMvNjg3IDExODQ0LzE0ODA0LzY4NyAxMTc5Ny8xNDc5Mi82ODcKK2YgMTE4MDUvMTQ4MDUvNDM4MyAxMTgwMy8xNDc5OC80MzgzIDExODAyLzE0Nzk3LzQzODMKK2YgMTE4MDIvMTQ3OTcvNDM4NCAxMTgwNC8xNDgwNi80Mzg0IDExODA1LzE0ODA1LzQzODQKK2YgMTE5MzQvMTQ4MDcvNDM4NSAxMTgwMy8xNDgwOC80Mzg1IDExODA1LzE0ODA5LzQzODUKK2YgMTE4MDUvMTQ4MDkvNDM4NiAxMTkzOS8xNDgxMC80Mzg2IDExOTM0LzE0ODA3LzQzODYKK2YgMTE5MzkvMTQ4MTEvNDM4NyAxMTgwNS8xNDgxMi80Mzg3IDExODA2LzE0ODEzLzQzODcKK2YgMTE4MDYvMTQ4MTMvNDM4OCAxMTgwNy8xNDgxNC80Mzg4IDExOTM5LzE0ODExLzQzODgKK2YgMTE4MDYvMTQ4MTMvNDM4OSAxMTgwNS8xNDgxMi80Mzg5IDExODA0LzE0ODE1LzQzODkKK2YgMTE4MDQvMTQ4MTUvNDM5MCAxMTc5OS8xNDgxNi80MzkwIDExODA2LzE0ODEzLzQzOTAKK2YgMTE4MTEvMTQ4MTcvNDM5MSAxMTgxMi8xNDgxOC80MzkxIDExODA5LzE0ODE5LzQzOTEKK2YgMTE4MDkvMTQ4MTkvNDM5MiAxMTgxMC8xNDgyMC80MzkyIDExODExLzE0ODE3LzQzOTIKK2YgMTE4MDkvMTQ4MjEvNDM5MyAxMjA2Ny8xNDgyMi80MzkzIDExODA4LzE0ODIzLzQzOTMKK2YgMTE4MDgvMTQ4MjMvNDM5NCAxMTgxMC8xNDgyNC80Mzk0IDExODA5LzE0ODIxLzQzOTQKK2YgMTE4MTQvMTQ4MjUvNDM5NSAxMTgwMS8xNDgyNi80Mzk1IDExODEzLzE0ODI3LzQzOTUKK2YgMTE4MTEvMTQ4MjgvNDkzIDExODE0LzE0ODI5LzQ5MyAxMTgxMy8xNDgzMC80OTMKK2YgMTE4MTMvMTQ4MzAvNDkzIDExODEyLzE0ODMxLzQ5MyAxMTgxMS8xNDgyOC80OTMKK2YgMTE4MjMvMTQ1NTcvNDM5NiAxMTc0NS8xNDY4OC80Mzk2IDExODIwLzE0NTU4LzQzOTYKK2YgMTE4MjIvMTQ1NzkvNjg3IDExODIxLzE0NTc4LzY4NyAxMTc0Ni8xNDY4OS82ODcKK2YgMTE3NDYvMTQ2ODkvNjg3IDExNzQ3LzE0NjkxLzY4NyAxMTgyMi8xNDU3OS82ODcKK2YgMTE3MDcvMTQ4MzIvMTUwNyAxMTgxOS8xNDgzMy8xNTA3IDExODIyLzE0NTc5LzE1MDcKK2YgMTE4MjIvMTQ1NzkvNjg3IDExNzQ3LzE0NjkxLzY4NyAxMTcwNy8xNDgzMi82ODcKK2YgMTE3MTMvMTQ1NjAvNDM5NyAxMTgyMC8xNDU1OS80Mzk3IDExODIxLzE0ODM0LzQzOTcKK2YgMTE4MjEvMTQ4MzQvNDM5OCAxMTcxMi8xNDgzNS80Mzk4IDExNzEzLzE0NTYwLzQzOTgKK2YgMTE4MzEvMTQ4MzYvNjg3IDExNzk4LzE0ODM3LzY4NyAxMTgxOC8xNDgzOC82ODcKK2YgMTE4MTAvMTQ4MzkvNDM5OSAxMTgwOC8xNDgwMS80Mzk5IDExODI0LzE0ODAwLzQzOTkKK2YgMTE4MjQvMTQ2OTgvNDQwMCAxMTgwMC8xNDY5Ny80NDAwIDExODEwLzE0ODQwLzQ0MDAKK2YgMTE4MTEvMTQ4MjgvNDQwMSAxMTgxMC8xNDg0MS80NDAxIDExODAwLzE0ODQyLzQ0MDEKK2YgMTE4MDAvMTQ4NDIvNDQwMiAxMTgyNS8xNDg0My80NDAyIDExODExLzE0ODI4LzQ0MDIKK2YgMTE4MTQvMTQ4MjkvNDI3NyAxMTgxMS8xNDgyOC80Mjc3IDExODI1LzE0ODQzLzQyNzcKK2YgMTE4MjUvMTQ4NDMvNjg3IDExODI2LzE0ODQ0LzY4NyAxMTgxNC8xNDgyOS82ODcKK2YgMTE4MDEvMTQ4MjYvNDQwMyAxMTgxNC8xNDgyNS80NDAzIDExODI2LzE0ODQ1LzQ0MDMKK2YgMTE4MjYvMTQ4NDUvNDQwNCAxMTgyNy8xNDg0Ni80NDA0IDExODAxLzE0ODI2LzQ0MDQKK2YgMTE4MDEvMTQ4NDcvNDQwNSAxMTgyNy8xNDg0OC80NDA1IDExODI4LzE0ODQ5LzQ0MDUKK2YgMTE4MjgvMTQ4NDkvNDQwNiAxMTgxNS8xNDg1MC80NDA2IDExODAxLzE0ODQ3LzQ0MDYKK2YgMTE4MTUvMTQ4NTEvNjg3IDExODI4LzE0ODUyLzY4NyAxMTgyOS8xNDg1My82ODcKK2YgMTE4MjkvMTQ4NTMvNjg3IDExODE2LzE0ODU0LzY4NyAxMTgxNS8xNDg1MS82ODcKK2YgMTE4MTYvMTQ4NTUvNDQwNyAxMTgyOS8xNDg1Ni80NDA3IDExODMwLzE0ODU3LzQ0MDcKK2YgMTE4MzAvMTQ4NTcvNDQwOCAxMTgxNy8xNDg1OC80NDA4IDExODE2LzE0ODU1LzQ0MDgKK2YgMTE4MTcvMTQ4NTkvNDQwOSAxMTgzMC8xNDg2MC80NDA5IDExODMxLzE0ODM2LzQ0MDkKK2YgMTE4MzEvMTQ4MzYvNDQxMCAxMTgxOC8xNDgzOC80NDEwIDExODE3LzE0ODU5LzQ0MTAKK2YgMTE4MDIvMTQ3OTcvNjg3IDExNzk2LzE0NzkxLzY4NyAxMTc0NS8xNDg2MS82ODcKK2YgMTE3NDUvMTQ4NjIvNDQxMSAxMTgyMy8xNDg2My80NDExIDExODAyLzE0ODY0LzQ0MTEKK2YgMTE4MDQvMTQ4NjUvNDQxMiAxMTgwMi8xNDg2NC80NDEyIDExODIzLzE0ODYzLzQ0MTIKK2YgMTE4MjMvMTQ1NTcvNjg3IDExNzQ4LzE0NTU2LzY4NyAxMTgwNC8xNDg2Ni82ODcKK2YgMTE3OTkvMTQ4NjcvNDQxMyAxMTgwNC8xNDg2OC80NDEzIDExNzQ4LzE0ODY5LzQ0MTMKK2YgMTE3NDgvMTQ4NzAvNDQxNCAxMTgzMi8xNDg3MS80NDE0IDExNzk5LzE0Nzk5LzQ0MTQKK2YgMTE4MjQvMTQ4MDAvNjg3IDExNzk5LzE0Nzk5LzY4NyAxMTgzMi8xNDg3MS82ODcKK2YgMTE4MzIvMTQ4NzEvNjg3IDExODMzLzE0ODcyLzY4NyAxMTgyNC8xNDgwMC82ODcKK2YgMTE4ODMvMTQ4NzMvNDQxNSAxMTg0OC8xNDg3NC80NDE1IDExOTUxLzE0ODc1LzQ0MTUKK2YgMTE5NTEvMTQ4NzYvNDQxNiAxMTk1NC8xNDg3Ny80NDE2IDExODgzLzE0ODc4LzQ0MTYKK2YgMTE4ODAvMTQ4NzkvNDQxNyAxMTg4MS8xNDg4MC80NDE3IDExODUwLzE0ODgxLzQ0MTcKK2YgMTE4NTAvMTQ4ODEvNDQxOCAxMTg4Ni8xNDg4Mi80NDE4IDExODgwLzE0ODc5LzQ0MTgKK2YgMTE4ODYvMTQ4ODMvNDQxOSAxMTg1MC8xNDg4NC80NDE5IDExODUyLzE0ODg1LzQ0MTkKK2YgMTE4NTIvMTQ4ODUvNDQyMCAxMTg4OS8xNDg4Ni80NDIwIDExODg2LzE0ODgzLzQ0MjAKK2YgMTE4NTEvMTQ4ODcvNDQyMSAxMTg0OS8xNDg4OC80NDIxIDExNzAxLzE0NTcyLzQ0MjEKK2YgMTE3MDEvMTQ1NzIvNDQyMiAxMTcwMi8xNDU3MS80NDIyIDExODUxLzE0ODg3LzQ0MjIKK2YgMTE4NTAvMTQ4ODkvNDQyMyAxMTg0OS8xNDg4OC80NDIzIDExODUxLzE0ODg3LzQ0MjMKK2YgMTE4NTEvMTQ4ODcvNDI0OCAxMTg1Mi8xNDg5MC80MjQ4IDExODUwLzE0ODg5LzQyNDgKK2YgMTE4NDYvMTQ4OTEvNDQyNCAxMTk1My8xNDg5Mi80NDI0IDExOTUyLzE0ODkzLzQ0MjQKK2YgMTE5NTIvMTQ4OTMvNDQyNSAxMTg0Ny8xNDg5NC80NDI1IDExODQ2LzE0ODkxLzQ0MjUKK2YgMTE4MTkvMTQ1ODAvNDQyNiAxMTk1My8xNDg5NS80NDI2IDExODQ2LzE0ODk2LzQ0MjYKK2YgMTE4NDYvMTQ4OTYvNDQyNyAxMTgzNC8xNDU4MS80NDI3IDExODE5LzE0NTgwLzQ0MjcKK2YgMTE4NjgvMTQ4OTcvNDA4MCAxMTcwNi8xNDU4Ny80MDgwIDExODM1LzE0NTg2LzQwODAKK2YgMTE4MzUvMTQ1ODYvNDA4MCAxMTg1My8xNDg5OC80MDgwIDExODY4LzE0ODk3LzQwODAKK2YgMTE5MTQvMTQ4OTkvNDQyOCAxMTg2OS8xNDkwMC80NDI4IDExODU0LzE0OTAxLzQ0MjgKK2YgMTE4NTQvMTQ5MDEvNDA4MiAxMTg5MS8xNDkwMi80MDgyIDExOTE0LzE0ODk5LzQwODIKK2YgMTE4NjkvMTQ5MDMvNDA4MyAxMTg2OC8xNDkwNC80MDgzIDExODUzLzE0OTA1LzQwODMKK2YgMTE4NTMvMTQ5MDUvNDA4MyAxMTg1NC8xNDkwNi80MDgzIDExODY5LzE0OTAzLzQwODMKK2YgMTE4NTMvMTQ5MDcvNDI1NyAxMTgzNS8xNDU5OS80MjU3IDExNzAzLzE0NTk4LzQyNTcKK2YgMTE3MDMvMTQ1OTgvNDA3NSAxMTg1NS8xNDkwOC80MDc1IDExODUzLzE0OTA3LzQwNzUKK2YgMTE4OTEvMTQ5MDkvNDA4NSAxMTg1NC8xNDkxMC80MDg1IDExODU2LzE0OTExLzQwODUKK2YgMTE4NTYvMTQ5MTEvNDA4NiAxMTg5NC8xNDkxMi80MDg2IDExODkxLzE0OTA5LzQwODYKK2YgMTE4NTQvMTQ5MDYvNDA3OCAxMTg1My8xNDkwNS80MDc4IDExODU1LzE0OTEzLzQwNzgKK2YgMTE4NTUvMTQ5MTMvNDM2NyAxMTg1Ni8xNDkxNC80MzY3IDExODU0LzE0OTA2LzQzNjcKK2YgMTE4NzAvMTQ5MTUvNDA4MCAxMTgzNi8xNDYwOS80MDgwIDExNzA0LzE0NjA4LzQwODAKK2YgMTE3MDQvMTQ2MDgvNDA4MCAxMTg1Ny8xNDkxNi80MDgwIDExODcwLzE0OTE1LzQwODAKK2YgMTE5MTYvMTQ5MTcvNDA4MSAxMTg3MS8xNDkxOC80MDgxIDExODU4LzE0OTE5LzQwODEKK2YgMTE4NTgvMTQ5MTkvNDA4MiAxMTg5Ny8xNDkyMC80MDgyIDExOTE2LzE0OTE3LzQwODIKK2YgMTE4NzEvMTQ5MjEvNDI2MyAxMTg3MC8xNDkyMi80MjYzIDExODU3LzE0OTIzLzQyNjMKK2YgMTE4NTcvMTQ5MjMvNDI2MyAxMTg1OC8xNDkyNC80MjYzIDExODcxLzE0OTIxLzQyNjMKK2YgMTE4NTcvMTQ5MjUvNDA3NSAxMTcwNC8xNDYyMS80MDc1IDExNzA1LzE0NjIwLzQwNzUKK2YgMTE3MDUvMTQ2MjAvNDI1NyAxMTg1OS8xNDkyNi80MjU3IDExODU3LzE0OTI1LzQyNTcKK2YgMTE4OTcvMTQ5MjcvNDQyOSAxMTg1OC8xNDkyOC80NDI5IDExODYwLzE0OTI5LzQ0MjkKK2YgMTE4NjAvMTQ5MjkvNDQzMCAxMTkwMC8xNDkzMC80NDMwIDExODk3LzE0OTI3LzQ0MzAKK2YgMTE4NTgvMTQ5MjQvNDM3NyAxMTg1Ny8xNDkyMy80Mzc3IDExODU5LzE0OTMxLzQzNzcKK2YgMTE4NTkvMTQ5MzEvNDA3OCAxMTg2MC8xNDkzMi80MDc4IDExODU4LzE0OTI0LzQwNzgKK2YgMTE4NzIvMTQ5MzMvNDA4MCAxMTgzNy8xNDYzMS80MDgwIDExNzI3LzE0NjMwLzQwODAKK2YgMTE3MjcvMTQ2MzAvNDA5NiAxMTg2MS8xNDkzNC80MDk2IDExODcyLzE0OTMzLzQwOTYKK2YgMTE5MTkvMTQ5MzUvNDQzMSAxMTg3My8xNDkzNi80NDMxIDExODYyLzE0OTM3LzQ0MzEKK2YgMTE4NjIvMTQ5MzcvNDQzMiAxMTkwMy8xNDkzOC80NDMyIDExOTE5LzE0OTM1LzQ0MzIKK2YgMTE4NzMvMTQ5MzkvNDA4MyAxMTg3Mi8xNDk0MC80MDgzIDExODYxLzE0OTQxLzQwODMKK2YgMTE4NjEvMTQ5NDEvNDQzMyAxMTg2Mi8xNDk0Mi80NDMzIDExODczLzE0OTM5LzQ0MzMKK2YgMTE4NjEvMTQ5NDMvNDA5OSAxMTcyNy8xNDY0My80MDk5IDExODY0LzE0NjQyLzQwOTkKK2YgMTE4NjQvMTQ2NDIvNDI1OCAxMTg2My8xNDk0NC80MjU4IDExODYxLzE0OTQzLzQyNTgKK2YgMTE5MDMvMTQ5NDUvNDA5MiAxMTg2Mi8xNDk0Ni80MDkyIDExODY1LzE0OTQ3LzQwOTIKK2YgMTE4NjUvMTQ5NDcvNDQzNCAxMTkwNi8xNDk0OC80NDM0IDExOTAzLzE0OTQ1LzQ0MzQKK2YgMTE4NjIvMTQ5NDIvNDQzNSAxMTg2MS8xNDk0MS80NDM1IDExODYzLzE0OTQ5LzQ0MzUKK2YgMTE4NjMvMTQ5NDkvNDA3OCAxMTg2NS8xNDk1MC80MDc4IDExODYyLzE0OTQyLzQwNzgKK2YgMTE4NzQvMTQ5NTEvNDA5NiAxMTc0MS8xNDY1My80MDk2IDExNzMyLzE0NjUyLzQwOTYKK2YgMTE3MzIvMTQ2NTIvNDA5NSAxMTg2Ni8xNDk1Mi80MDk1IDExODc0LzE0OTUxLzQwOTUKK2YgMTE5MjIvMTQ5NTMvNDQzNiAxMTg3NS8xNDk1NC80NDM2IDExODY3LzE0OTU1LzQ0MzYKK2YgMTE4NjcvMTQ5NTUvNDQzNyAxMTkxMC8xNDk1Ni80NDM3IDExOTIyLzE0OTUzLzQ0MzcKK2YgMTE4NzUvMTQ5NTcvNDA4MyAxMTg3NC8xNDk1OC80MDgzIDExODY2LzE0OTU5LzQwODMKK2YgMTE4NjYvMTQ5NTkvNDA4MyAxMTg2Ny8xNDk2MC80MDgzIDExODc1LzE0OTU3LzQwODMKK2YgMTE4NjgvMTQ5MDQvNjg3IDExODUxLzE0OTYxLzY4NyAxMTcwMi8xNDY2My82ODcKK2YgMTE3MDIvMTQ2NjMvNjg3IDExNzA2LzE0NjYyLzY4NyAxMTg2OC8xNDkwNC82ODcKK2YgMTE4NjkvMTQ5MDMvNjg3IDExODUyLzE0OTYyLzY4NyAxMTg1MS8xNDk2MS82ODcKK2YgMTE4NTEvMTQ5NjEvNjg3IDExODY4LzE0OTA0LzY4NyAxMTg2OS8xNDkwMy82ODcKK2YgMTE5MTQvMTQ5NjMvNjg3IDExODg5LzE0OTY0LzY4NyAxMTg1Mi8xNDk2Mi82ODcKK2YgMTE4NTIvMTQ5NjIvNjg3IDExODY5LzE0OTAzLzY4NyAxMTkxNC8xNDk2My82ODcKK2YgMTE4NzAvMTQ5MjIvNjg3IDExODU1LzE0OTEzLzY4NyAxMTcwMy8xNDY2OS82ODcKK2YgMTE3MDMvMTQ2NjkvNjg3IDExODM2LzE0NjY4LzY4NyAxMTg3MC8xNDkyMi82ODcKK2YgMTE5MTYvMTQ5NjUvNjg3IDExODk0LzE0OTY2LzY4NyAxMTg1Ni8xNDkxNC82ODcKK2YgMTE4NTYvMTQ5MTQvNjg3IDExODcxLzE0OTIxLzY4NyAxMTkxNi8xNDk2NS82ODcKK2YgMTE4NzEvMTQ5MjEvNjg3IDExODU2LzE0OTE0LzY4NyAxMTg1NS8xNDkxMy82ODcKK2YgMTE4NTUvMTQ5MTMvNjg3IDExODcwLzE0OTIyLzY4NyAxMTg3MS8xNDkyMS82ODcKK2YgMTE4NzIvMTQ5NDAvNjg3IDExODU5LzE0OTMxLzY4NyAxMTcwNS8xNDY3My82ODcKK2YgMTE3MDUvMTQ2NzMvNjg3IDExODM3LzE0NjcyLzY4NyAxMTg3Mi8xNDk0MC82ODcKK2YgMTE5MTkvMTQ5NjcvNjg3IDExOTAwLzE0OTY4LzY4NyAxMTg2MC8xNDkzMi82ODcKK2YgMTE4NjAvMTQ5MzIvNjg3IDExODczLzE0OTM5LzY4NyAxMTkxOS8xNDk2Ny82ODcKK2YgMTE4NzMvMTQ5MzkvNjg3IDExODYwLzE0OTMyLzY4NyAxMTg1OS8xNDkzMS82ODcKK2YgMTE4NTkvMTQ5MzEvNjg3IDExODcyLzE0OTQwLzY4NyAxMTg3My8xNDkzOS82ODcKK2YgMTE4NzQvMTQ5NTgvNjg3IDExODYzLzE0OTQ5LzY4NyAxMTg2NC8xNDY3Ny82ODcKK2YgMTE4NjQvMTQ2NzcvNjg3IDExNzQxLzE0Njc2LzY4NyAxMTg3NC8xNDk1OC82ODcKK2YgMTE5MjIvMTQ5NjkvNjg3IDExOTA2LzE0OTcwLzY4NyAxMTg2NS8xNDk1MC82ODcKK2YgMTE4NjUvMTQ5NTAvNjg3IDExODc1LzE0OTU3LzY4NyAxMTkyMi8xNDk2OS82ODcKK2YgMTE4NzUvMTQ5NTcvNjg3IDExODY1LzE0OTUwLzY4NyAxMTg2My8xNDk0OS82ODcKK2YgMTE4NjMvMTQ5NDkvNjg3IDExODc0LzE0OTU4LzY4NyAxMTg3NS8xNDk1Ny82ODcKK2YgMTE4NjYvMTQ5NTkvNDI2OSAxMTczMi8xNDY4Mi80MjY5IDExODc3LzE0NjgxLzQyNjkKK2YgMTE4NzcvMTQ2ODEvNDQzOCAxMTg3Ni8xNDk3MS80NDM4IDExODY2LzE0OTU5LzQ0MzgKK2YgMTE5MTAvMTQ5NzIvNDQzOSAxMTg2Ny8xNDk2MC80NDM5IDExODc4LzE0OTczLzQ0MzkKK2YgMTE4NzgvMTQ5NzMvNDQ0MCAxMTkyNS8xNDk3NC80NDQwIDExOTEwLzE0OTcyLzQ0NDAKK2YgMTE4NjcvMTQ5NjAvNDI3MyAxMTg2Ni8xNDk1OS80MjczIDExODc2LzE0OTcxLzQyNzMKK2YgMTE4NzYvMTQ5NzEvNDQ0MSAxMTg3OC8xNDk3My80NDQxIDExODY3LzE0OTYwLzQ0NDEKK2YgMTE4NzcvMTQ2ODEvMzk2NiAxMTg3OS8xNDY4Ni8zOTY2IDExODc4LzE0OTczLzM5NjYKK2YgMTE4NzgvMTQ5NzMvNjg3IDExODc2LzE0OTcxLzY4NyAxMTg3Ny8xNDY4MS82ODcKK2YgMTE4NzkvMTQ2ODYvNjg3IDExOTI3LzE0Njg3LzY4NyAxMTkyNS8xNDk3NC82ODcKK2YgMTE5MjUvMTQ5NzQvMzk2NSAxMTg3OC8xNDk3My8zOTY1IDExODc5LzE0Njg2LzM5NjUKK2YgMTE5NTIvMTQ4OTMvNjg3IDExODgxLzE0OTc1LzY4NyAxMTg4MC8xNDk3Ni82ODcKK2YgMTE4ODAvMTQ5NzYvNjg3IDExOTUxLzE0ODc2LzY4NyAxMTk1Mi8xNDg5My82ODcKK2YgMTE4NDkvMTQ5NzcvNDI3NCAxMTg1MC8xNDk3OC80Mjc0IDExODgxLzE0OTc1LzQyNzQKK2YgMTE4ODEvMTQ5NzUvNDI3NCAxMTg4Mi8xNDk3OS80Mjc0IDExODQ5LzE0OTc3LzQyNzQKK2YgMTE3MDEvMTQ2OTMvNDI3NSAxMTg0OS8xNDk4MC80Mjc1IDExODgyLzE0OTgxLzQyNzUKK2YgMTE4ODIvMTQ5ODEvNDI3NSAxMTcwNy8xNDY5NC80Mjc1IDExNzAxLzE0NjkzLzQyNzUKK2YgMTE5MzIvMTQ5ODIvNDQ0MiAxMTk2NC8xNDk4My80NDQyIDExOTU1LzE0OTg0LzQ0NDIKK2YgMTE4ODAvMTQ4NzkvNDQ0MyAxMTg4Ni8xNDg4Mi80NDQzIDExODg1LzE0OTg1LzQ0NDMKK2YgMTE4ODUvMTQ5ODUvNDQ0NCAxMTkyOC8xNDk4Ni80NDQ0IDExODgwLzE0ODc5LzQ0NDQKK2YgMTE4ODYvMTQ4ODMvNDQ0NSAxMTg4OS8xNDg4Ni80NDQ1IDExODg4LzE0OTg3LzQ0NDUKK2YgMTE4ODgvMTQ5ODcvNDQ0NiAxMTg4NS8xNDk4OC80NDQ2IDExODg2LzE0ODgzLzQ0NDYKK2YgMTE4ODcvMTQ5ODkvNDQ0NyAxMTgzOC8xNDcwNy80NDQ3IDExNzA4LzE0NzA2LzQ0NDcKK2YgMTE3MDgvMTQ3MDYvNDIwNSAxMTg4NC8xNDk5MC80MjA1IDExODg3LzE0OTg5LzQyMDUKK2YgMTE4ODUvMTQ5OTEvNDIwNiAxMTg4OC8xNDk5Mi80MjA2IDExODg3LzE0OTg5LzQyMDYKK2YgMTE4ODcvMTQ5ODkvNDQ0OCAxMTg4NC8xNDk5MC80NDQ4IDExODg1LzE0OTkxLzQ0NDgKK2YgMTE5MTIvMTQ5OTMvNDEyOCAxMTg5MC8xNDk5NC80MTI4IDExODM5LzE0NzEyLzQxMjgKK2YgMTE4MzkvMTQ3MTIvNDEyOCAxMTg0Mi8xNDcxMS80MTI4IDExOTEyLzE0OTkzLzQxMjgKK2YgMTE5MTQvMTQ4OTkvNDQ0OSAxMTg5MS8xNDkwMi80NDQ5IDExODkyLzE0OTk1LzQ0NDkKK2YgMTE4OTIvMTQ5OTUvNDQ1MCAxMTkxMy8xNDk5Ni80NDUwIDExOTE0LzE0ODk5LzQ0NTAKK2YgMTE5MTMvMTQ5OTcvNDEzMSAxMTg5Mi8xNDk5OC80MTMxIDExODkwLzE0OTk5LzQxMzEKK2YgMTE4OTAvMTQ5OTkvNDEzMSAxMTkxMi8xNTAwMC80MTMxIDExOTEzLzE0OTk3LzQxMzEKK2YgMTE4OTAvMTUwMDEvNDEzMyAxMTg5My8xNTAwMi80MTMzIDExODQwLzE0NzIyLzQxMzMKK2YgMTE4NDAvMTQ3MjIvNDEyNCAxMTgzOS8xNDcyMS80MTI0IDExODkwLzE1MDAxLzQxMjQKK2YgMTE4OTEvMTQ5MDkvNDQ1MSAxMTg5NC8xNDkxMi80NDUxIDExODk1LzE1MDAzLzQ0NTEKK2YgMTE4OTUvMTUwMDMvNDQ1MiAxMTg5Mi8xNTAwNC80NDUyIDExODkxLzE0OTA5LzQ0NTIKK2YgMTE4OTIvMTQ5OTgvNDIxNyAxMTg5NS8xNTAwNS80MjE3IDExODkzLzE1MDA2LzQyMTcKK2YgMTE4OTMvMTUwMDYvNDEyNyAxMTg5MC8xNDk5OS80MTI3IDExODkyLzE0OTk4LzQxMjcKK2YgMTE5MTUvMTUwMDcvNDIxMiAxMTg5Ni8xNTAwOC80MjEyIDExODQxLzE0NzMwLzQyMTIKK2YgMTE4NDEvMTQ3MzAvNDEyOCAxMTcxMC8xNDcyOS80MTI4IDExOTE1LzE1MDA3LzQxMjgKK2YgMTE5MTYvMTQ5MTcvNDQ1MyAxMTg5Ny8xNDkyMC80NDUzIDExODk4LzE1MDA5LzQ0NTMKK2YgMTE4OTgvMTUwMDkvNDQ1NCAxMTkxNy8xNTAxMC80NDU0IDExOTE2LzE0OTE3LzQ0NTQKK2YgMTE5MTcvMTUwMTEvNDE1MSAxMTg5OC8xNTAxMi80MTUxIDExODk2LzE1MDEzLzQxNTEKK2YgMTE4OTYvMTUwMTMvNDMzNSAxMTkxNS8xNTAxNC80MzM1IDExOTE3LzE1MDExLzQzMzUKK2YgMTE4OTYvMTUwMTUvNDEzMyAxMTg5OS8xNTAxNi80MTMzIDExNzA5LzE0NzQwLzQxMzMKK2YgMTE3MDkvMTQ3NDAvNDEzMyAxMTg0MS8xNDczOS80MTMzIDExODk2LzE1MDE1LzQxMzMKK2YgMTE4OTcvMTQ5MjcvNDQ1NSAxMTkwMC8xNDkzMC80NDU1IDExOTAxLzE1MDE3LzQ0NTUKK2YgMTE5MDEvMTUwMTcvNDQ1NiAxMTg5OC8xNTAxOC80NDU2IDExODk3LzE0OTI3LzQ0NTYKK2YgMTE4OTgvMTUwMTIvNDEyNyAxMTkwMS8xNTAxOS80MTI3IDExODk5LzE1MDIwLzQxMjcKK2YgMTE4OTkvMTUwMjAvNDEyNyAxMTg5Ni8xNTAxMy80MTI3IDExODk4LzE1MDEyLzQxMjcKK2YgMTE5MTgvMTUwMjEvNDEzOSAxMTkwMi8xNTAyMi80MTM5IDExNzY4LzE0NzQ4LzQxMzkKK2YgMTE3NjgvMTQ3NDgvNDIyOCAxMTg0My8xNDc0Ny80MjI4IDExOTE4LzE1MDIxLzQyMjgKK2YgMTE5MTkvMTQ5MzUvNDQ1NyAxMTkwMy8xNDkzOC80NDU3IDExOTA0LzE1MDIzLzQ0NTcKK2YgMTE5MDQvMTUwMjMvNDQ1OCAxMTkyMC8xNTAyNC80NDU4IDExOTE5LzE0OTM1LzQ0NTgKK2YgMTE5MjAvMTUwMjUvNDE1MSAxMTkwNC8xNTAyNi80MTUxIDExOTAyLzE1MDI3LzQxNTEKK2YgMTE5MDIvMTUwMjcvNDEzMSAxMTkxOC8xNTAyOC80MTMxIDExOTIwLzE1MDI1LzQxMzEKK2YgMTE5MDIvMTUwMjkvNDEzMyAxMTkwNS8xNTAzMC80MTMzIDExNzcyLzE0NzU4LzQxMzMKK2YgMTE3NzIvMTQ3NTgvNDEzMyAxMTc2OC8xNDc1Ny80MTMzIDExOTAyLzE1MDI5LzQxMzMKK2YgMTE5MDMvMTQ5NDUvNDQ1OSAxMTkwNi8xNDk0OC80NDU5IDExOTA3LzE1MDMxLzQ0NTkKK2YgMTE5MDcvMTUwMzEvNDQ2MCAxMTkwNC8xNTAzMi80NDYwIDExOTAzLzE0OTQ1LzQ0NjAKK2YgMTE5MDQvMTUwMjYvNDIxNyAxMTkwNy8xNTAzMy80MjE3IDExOTA1LzE1MDM0LzQyMTcKK2YgMTE5MDUvMTUwMzQvNDEzNyAxMTkwMi8xNTAyNy80MTM3IDExOTA0LzE1MDI2LzQxMzcKK2YgMTE5MjEvMTUwMzUvNDEzOSAxMTkwOC8xNTAzNi80MTM5IDExOTA5LzE0NzY2LzQxMzkKK2YgMTE5MDkvMTQ3NjYvNDE0OCAxMTc4OC8xNDc2NS80MTQ4IDExOTIxLzE1MDM1LzQxNDgKK2YgMTE5MjIvMTQ5NTMvNDQ2MSAxMTkxMC8xNDk1Ni80NDYxIDExOTExLzE1MDM3LzQ0NjEKK2YgMTE5MTEvMTUwMzcvNDQ2MiAxMTkyMy8xNTAzOC80NDYyIDExOTIyLzE0OTUzLzQ0NjIKK2YgMTE5MjMvMTUwMzkvNDEzMSAxMTkxMS8xNTA0MC80MTMxIDExOTA4LzE1MDQxLzQxMzEKK2YgMTE5MDgvMTUwNDEvNDMzNSAxMTkyMS8xNTA0Mi80MzM1IDExOTIzLzE1MDM5LzQzMzUKK2YgMTE5MTIvMTUwMDAvNjg3IDExODQyLzE0Nzc2LzY4NyAxMTgzOC8xNDc3NS82ODcKK2YgMTE4MzgvMTQ3NzUvNjg3IDExODg3LzE1MDQzLzY4NyAxMTkxMi8xNTAwMC82ODcKK2YgMTE5MTMvMTQ5OTcvMzk2NSAxMTkxMi8xNTAwMC8zOTY1IDExODg3LzE1MDQzLzM5NjUKK2YgMTE4ODcvMTUwNDMvNjg3IDExODg4LzE1MDQ0LzY4NyAxMTkxMy8xNDk5Ny82ODcKK2YgMTE5MTQvMTQ5NjMvNjg3IDExOTEzLzE0OTk3LzY4NyAxMTg4OC8xNTA0NC82ODcKK2YgMTE4ODgvMTUwNDQvNjg3IDExODg5LzE0OTY0LzY4NyAxMTkxNC8xNDk2My82ODcKK2YgMTE5MTUvMTUwMTQvNjg3IDExNzEwLzE0Nzc5LzY4NyAxMTg0MC8xNDc3OC82ODcKK2YgMTE4NDAvMTQ3NzgvNjg3IDExODkzLzE1MDA2LzY4NyAxMTkxNS8xNTAxNC82ODcKK2YgMTE5MTYvMTQ5NjUvNjg3IDExOTE3LzE1MDExLzY4NyAxMTg5NS8xNTAwNS82ODcKK2YgMTE4OTUvMTUwMDUvNjg3IDExODk0LzE0OTY2LzY4NyAxMTkxNi8xNDk2NS82ODcKK2YgMTE5MTcvMTUwMTEvNjg3IDExOTE1LzE1MDE0LzY4NyAxMTg5My8xNTAwNi82ODcKK2YgMTE4OTMvMTUwMDYvNjg3IDExODk1LzE1MDA1LzY4NyAxMTkxNy8xNTAxMS82ODcKK2YgMTE5MTgvMTUwMjgvNjg3IDExODQzLzE0NzgxLzY4NyAxMTcwOS8xNDc4MC82ODcKK2YgMTE3MDkvMTQ3ODAvNjg3IDExODk5LzE1MDIwLzY4NyAxMTkxOC8xNTAyOC82ODcKK2YgMTE5MTkvMTQ5NjcvMzk2NSAxMTkyMC8xNTAyNS8zOTY1IDExOTAxLzE1MDE5LzM5NjUKK2YgMTE5MDEvMTUwMTkvNjg3IDExOTAwLzE0OTY4LzY4NyAxMTkxOS8xNDk2Ny82ODcKK2YgMTE5MjAvMTUwMjUvNjg3IDExOTE4LzE1MDI4LzY4NyAxMTg5OS8xNTAyMC82ODcKK2YgMTE4OTkvMTUwMjAvMzk2NSAxMTkwMS8xNTAxOS8zOTY1IDExOTIwLzE1MDI1LzM5NjUKK2YgMTE5MjEvMTUwNDIvMzk2NSAxMTc4OC8xNDc4My8zOTY1IDExNzcyLzE0NzgyLzM5NjUKK2YgMTE3NzIvMTQ3ODIvNjg3IDExOTA1LzE1MDM0LzY4NyAxMTkyMS8xNTA0Mi82ODcKK2YgMTE5MjIvMTQ5NjkvNjg3IDExOTIzLzE1MDM5LzY4NyAxMTkwNy8xNTAzMy82ODcKK2YgMTE5MDcvMTUwMzMvNjg3IDExOTA2LzE0OTcwLzY4NyAxMTkyMi8xNDk2OS82ODcKK2YgMTE5MjMvMTUwMzkvNjg3IDExOTIxLzE1MDQyLzY4NyAxMTkwNS8xNTAzNC82ODcKK2YgMTE5MDUvMTUwMzQvNjg3IDExOTA3LzE1MDMzLzY4NyAxMTkyMy8xNTAzOS82ODcKK2YgMTE5MDgvMTUwNDEvNDQ2MyAxMTkyNC8xNTA0NS80NDYzIDExNzkyLzE0Nzg1LzQ0NjMKK2YgMTE3OTIvMTQ3ODUvNDQ2NCAxMTkwOS8xNDc4NC80NDY0IDExOTA4LzE1MDQxLzQ0NjQKK2YgMTE5MTAvMTQ5NzIvNDQ2NSAxMTkyNS8xNDk3NC80NDY1IDExOTI2LzE1MDQ2LzQ0NjUKK2YgMTE5MjYvMTUwNDYvNDQ2NiAxMTkxMS8xNTA0MC80NDY2IDExOTEwLzE0OTcyLzQ0NjYKK2YgMTE5MTEvMTUwNDAvNDQ2NyAxMTkyNi8xNTA0Ni80NDY3IDExOTI0LzE1MDQ1LzQ0NjcKK2YgMTE5MjQvMTUwNDUvNDIzNiAxMTkwOC8xNTA0MS80MjM2IDExOTExLzE1MDQwLzQyMzYKK2YgMTE3OTIvMTQ3ODUvNDQ2OCAxMTkyNC8xNTA0NS80NDY4IDExOTI2LzE1MDQ2LzQ0NjgKK2YgMTE5MjYvMTUwNDYvMzk2NSAxMTc5NS8xNDc4OC8zOTY1IDExNzkyLzE0Nzg1LzM5NjUKK2YgMTE3OTUvMTQ3ODgvMzk2NSAxMTkyNi8xNTA0Ni8zOTY1IDExOTI1LzE0OTc0LzM5NjUKK2YgMTE5MjUvMTQ5NzQvNjg3IDExOTI3LzE0Njg3LzY4NyAxMTc5NS8xNDc4OC82ODcKK2YgMTE4ODQvMTUwNDcvNDIzNyAxMTkyOS8xNTA0OC80MjM3IDExOTI4LzE1MDQ5LzQyMzcKK2YgMTE5MjgvMTUwNDkvNDIzNyAxMTg4NS8xNTA1MC80MjM3IDExODg0LzE1MDQ3LzQyMzcKK2YgMTE3MDgvMTQ3OTMvNDQ2OSAxMTg0NC8xNDc5Ni80NDY5IDExOTI5LzE1MDUxLzQ0NjkKK2YgMTE5MjkvMTUwNTEvNDIzOSAxMTg4NC8xNTA1Mi80MjM5IDExNzA4LzE0NzkzLzQyMzkKK2YgMTE5MzUvMTUwNTMvNjg3IDExOTI4LzE1MDQ5LzY4NyAxMTkyOS8xNTA0OC82ODcKK2YgMTE5MjkvMTUwNDgvNDE1NSAxMTkzNi8xNTA1NC80MTU1IDExOTM1LzE1MDUzLzQxNTUKK2YgMTE5MzEvMTUwNTUvNDQ3MCAxMTk0MC8xNTA1Ni80NDcwIDEyMDYyLzE1MDU3LzQ0NzAKK2YgMTIwNjIvMTUwNTcvNjg3IDExOTU1LzE1MDU4LzY4NyAxMTkzMS8xNTA1NS82ODcKK2YgMTE5MjkvMTUwNDgvNjg3IDExODQ0LzE0ODA0LzY4NyAxMTkzNC8xNDgwMy82ODcKK2YgMTE5MzQvMTQ4MDMvMTUwNyAxMTkzNi8xNTA1NC8xNTA3IDExOTI5LzE1MDQ4LzE1MDcKK2YgMTE5MzgvMTUwNTkvNDQ3MSAxMTkzNy8xNTA2MC80NDcxIDExOTM1LzE1MDUzLzQ0NzEKK2YgMTE5MzUvMTUwNTMvNDQ3MiAxMTkzNi8xNTA1NC80NDcyIDExOTM4LzE1MDU5LzQ0NzIKK2YgMTE5MzQvMTQ4MDcvNDQ3MyAxMTkzOS8xNDgxMC80NDczIDExOTM4LzE1MDYxLzQ0NzMKK2YgMTE5MzgvMTUwNjEvNDQ3NCAxMTkzNi8xNTA2Mi80NDc0IDExOTM0LzE0ODA3LzQ0NzQKK2YgMTE5MzkvMTQ4MTEvNDQ3NSAxMTgwNy8xNDgxNC80NDc1IDEyMDcwLzE1MDYzLzQ0NzUKK2YgMTE5NDAvMTUwNjQvNDQ3NiAxMTkzMS8xNTA2NS80NDc2IDExOTM3LzE1MDY2LzQ0NzYKK2YgMTE5MzcvMTUwNjYvNDQ3NyAxMTkzOC8xNTA2Ny80NDc3IDExOTQwLzE1MDY0LzQ0NzcKK2YgMTE5NDMvMTUwNjgvNDQ3OCAxMTk0Mi8xNTA2OS80NDc4IDExOTQxLzE1MDcwLzQ0NzgKK2YgMTE5NDEvMTUwNzAvNDQ3OSAxMTk0NC8xNTA3MS80NDc5IDExOTQzLzE1MDY4LzQ0NzkKK2YgMTE5NDEvMTUwNzIvNDQ4MCAxMjA2Ni8xNTA3My80NDgwIDEyMDY4LzE1MDc0LzQ0ODAKK2YgMTIwNjgvMTUwNzUvNDQ4MSAxMTg0NS8xNTA3Ni80NDgxIDExOTQxLzE1MDc3LzQ0ODEKK2YgMTE5NDYvMTUwNzgvNDQ4MiAxMTk0NS8xNTA3OS80NDgyIDExOTMzLzE1MDgwLzQ0ODIKK2YgMTE5NDMvMTUwODEvNDQ4MyAxMTk0NC8xNTA4Mi80NDgzIDExOTQ1LzE1MDgzLzQ0ODMKK2YgMTE5NDUvMTUwODMvNDkzIDExOTQ2LzE1MDg0LzQ5MyAxMTk0My8xNTA4MS80OTMKK2YgMTE5NTQvMTQ4NzcvNDQ4NCAxMTk1MS8xNDg3Ni80NDg0IDExODgwLzE0OTc2LzQ0ODQKK2YgMTE5NTMvMTQ4OTIvNjg3IDExODgyLzE0OTc5LzY4NyAxMTg4MS8xNDk3NS82ODcKK2YgMTE4ODEvMTQ5NzUvNjg3IDExOTUyLzE0ODkzLzY4NyAxMTk1My8xNDg5Mi82ODcKK2YgMTE3MDcvMTQ4MzIvNjg3IDExODgyLzE0OTc5LzY4NyAxMTk1My8xNDg5Mi82ODcKK2YgMTE5NTMvMTQ4OTIvMTUwNyAxMTgxOS8xNDgzMy8xNTA3IDExNzA3LzE0ODMyLzE1MDcKK2YgMTE4NDgvMTQ4NzQvNDQ4NSAxMTg0Ny8xNTA4NS80NDg1IDExOTUyLzE1MDg2LzQ0ODUKK2YgMTE5NTIvMTUwODYvNDQ4NiAxMTk1MS8xNDg3NS80NDg2IDExODQ4LzE0ODc0LzQ0ODYKK2YgMTE5NjIvMTUwODcvNjg3IDExOTUwLzE1MDg4LzY4NyAxMTkzMC8xNTA4OS82ODcKK2YgMTE5NDIvMTUwOTAvNDQ4NyAxMTkzMi8xNTA5MS80NDg3IDExOTU1LzE1MDkyLzQ0ODcKK2YgMTE5NTUvMTUwNTgvNDQ4OCAxMjA2Mi8xNTA1Ny80NDg4IDExOTQyLzE1MDkzLzQ0ODgKK2YgMTE5NDMvMTUwODEvNDQ4OSAxMTk1Ni8xNTA5NC80NDg5IDExOTMyLzE1MDk1LzQ0ODkKK2YgMTE5MzIvMTUwOTUvNDQ5MCAxMTk0Mi8xNTA5Ni80NDkwIDExOTQzLzE1MDgxLzQ0OTAKK2YgMTE5NDYvMTUwODQvNjg3IDExOTU3LzE1MDk3LzY4NyAxMTk1Ni8xNTA5NC82ODcKK2YgMTE5NTYvMTUwOTQvMzk2NSAxMTk0My8xNTA4MS8zOTY1IDExOTQ2LzE1MDg0LzM5NjUKK2YgMTE5MzMvMTUwODAvNDQ5MSAxMTk1OC8xNTA5OC80NDkxIDExOTU3LzE1MDk5LzQ0OTEKK2YgMTE5NTcvMTUwOTkvNDQ5MiAxMTk0Ni8xNTA3OC80NDkyIDExOTMzLzE1MDgwLzQ0OTIKK2YgMTE5MzMvMTUxMDAvNDQ5MyAxMTk0Ny8xNTEwMS80NDkzIDExOTU5LzE1MTAyLzQ0OTMKK2YgMTE5NTkvMTUxMDIvNDQ5NCAxMTk1OC8xNTEwMy80NDk0IDExOTMzLzE1MTAwLzQ0OTQKK2YgMTE5NDcvMTUxMDQvNDM1MiAxMTk0OC8xNTEwNS80MzUyIDExOTYwLzE1MTA2LzQzNTIKK2YgMTE5NjAvMTUxMDYvNjg3IDExOTU5LzE1MTA3LzY4NyAxMTk0Ny8xNTEwNC82ODcKK2YgMTE5NDgvMTUxMDgvNDQ5NSAxMTk0OS8xNTEwOS80NDk1IDExOTYxLzE1MTEwLzQ0OTUKK2YgMTE5NjEvMTUxMTEvNDQ5NiAxMTk2MC8xNTExMi80NDk2IDExOTQ4LzE1MTEzLzQ0OTYKK2YgMTE5NDkvMTUxMTQvNDQ5NyAxMTk1MC8xNTA4OC80NDk3IDExOTYyLzE1MDg3LzQ0OTcKK2YgMTE5NjIvMTUwODcvNDQ5OCAxMTk2MS8xNTExNS80NDk4IDExOTQ5LzE1MTE0LzQ0OTgKK2YgMTE5MzUvMTUxMTYvNDQ5OSAxMTk1NC8xNTExNy80NDk5IDExODgwLzE1MTE4LzQ0OTkKK2YgMTE4ODAvMTUxMTkvNjg3IDExOTI4LzE1MDQ5LzY4NyAxMTkzNS8xNTA1My82ODcKK2YgMTE5MzcvMTUxMjAvNjg3IDExODgzLzE0ODc4LzY4NyAxMTk1NC8xNDg3Ny82ODcKK2YgMTE5NTQvMTUxMTcvNDUwMCAxMTkzNS8xNTExNi80NTAwIDExOTM3LzE1MTIxLzQ1MDAKK2YgMTE5MzEvMTUxMjIvNDUwMSAxMTk2My8xNTEyMy80NTAxIDExODgzLzE1MTI0LzQ1MDEKK2YgMTE4ODMvMTUxMjQvNDUwMiAxMTkzNy8xNTEyNS80NTAyIDExOTMxLzE1MTIyLzQ1MDIKK2YgMTE5NTUvMTUwNTgvNDUwMyAxMTk2NC8xNTEyNi80NTAzIDExOTYzLzE1MTI3LzQ1MDMKK2YgMTE5NjMvMTUxMjcvNjg3IDExOTMxLzE1MDU1LzY4NyAxMTk1NS8xNTA1OC82ODcKK2YgMTIwMTYvMTQ1NjEvMTA4OCAxMTc0OC8xNDU2MS8xMDg4IDExNzEzLzE0NTYwLzEwODgKK2YgMTE3MTMvMTQ1NjAvMTA4OCAxMjAxNS8xNDU2MC8xMDg4IDEyMDE2LzE0NTYxLzEwODgKK2YgMTIwMTUvMTQ1NjAvMzk2MCAxMTcxMy8xNDU2MC8zOTYwIDExNzEyLzE0ODM1LzM5NjAKK2YgMTE3MTIvMTQ4MzUvNDUwNCAxMjAxNC8xNDgzNS80NTA0IDEyMDE1LzE0NTYwLzQ1MDQKK2YgMTIwMTQvMTUxMjgvMzk2MSAxMTcxMi8xNTEyOS8zOTYxIDExNzExLzE0NTgyLzM5NjEKK2YgMTE3MTEvMTQ1ODIvMzk2MSAxMjAxMy8xNTEzMC8zOTYxIDEyMDE0LzE1MTI4LzM5NjEKK2YgMTIwMTMvMTUxMzAvMzk2MiAxMTcxMS8xNDU4Mi8zOTYyIDExODM0LzE0NTgxLzM5NjIKK2YgMTE4MzQvMTQ1ODEvMzk2MiAxMjAzNi8xNTEzMS8zOTYyIDEyMDEzLzE1MTMwLzM5NjIKK2YgMTIwMjcvMTUxMzIvNDMxNSAxMTgyNS8xNTEzMi80MzE1IDExODAwLzE0Njk3LzQzMTUKK2YgMTE4MDAvMTQ2OTcvMTA4MCAxMjAxOC8xNDY5Ny8xMDgwIDEyMDI3LzE1MTMyLzEwODAKK2YgMTE3OTgvMTQ4NDUvMjIxIDEyMDI2LzE1MTMzLzIyMSAxMTgxOC8xNTEzNC8yMjEKK2YgMTIwMjIvMTUxMzUvMjIxIDExODEzLzE0ODI3LzIyMSAxMTgwMS8xNDgyNi8yMjEKK2YgMTE4MDEvMTQ4MjYvMjIxIDEyMDE5LzE0ODI2LzIyMSAxMjAyMi8xNTEzNS8yMjEKK2YgMTIwMzQvMTUxMzYvNDUwNSAxMTgzMi8xNTEzNi80NTA1IDExNzQ4LzE0NTYxLzQ1MDUKK2YgMTE3NDgvMTQ1NjEvMTA0NCAxMjAxNi8xNDU2MS8xMDQ0IDEyMDM0LzE1MTM2LzEwNDQKK2YgMTIwMzcvMTUxMzcvMjIxIDExODQ1LzE1MTM4LzIyMSAxMTgwOS8xNTEzOS8yMjEKK2YgMTE4MDkvMTUxMzkvMjIxIDEyMDIwLzE1MTM5LzIyMSAxMjAzNy8xNTEzNy8yMjEKK2YgMTIwMjAvMTUxMzkvMjIxIDExODA5LzE1MTM5LzIyMSAxMTgxMi8xNTE0MC8yMjEKK2YgMTE4MTIvMTUxNDAvMjIxIDEyMDIxLzE1MTQxLzIyMSAxMjAyMC8xNTEzOS8yMjEKK2YgMTIwMjEvMTUxNDEvMjIxIDExODEyLzE1MTQwLzIyMSAxMTgxMy8xNDgyNy8yMjEKK2YgMTE4MTMvMTQ4MjcvMjIxIDEyMDIyLzE1MTM1LzIyMSAxMjAyMS8xNTE0MS8yMjEKK2YgMTIwMTkvMTQ4MjYvMjIxIDExODAxLzE0ODI2LzIyMSAxMTgxNS8xNTE0Mi8yMjEKK2YgMTE4MTUvMTUxNDIvMjIxIDEyMDIzLzE1MTQzLzIyMSAxMjAxOS8xNDgyNi8yMjEKK2YgMTIwMjMvMTUxNDMvMjIxIDExODE1LzE1MTQyLzIyMSAxMTgxNi8xNTE0NC8yMjEKK2YgMTE4MTYvMTUxNDQvMjIxIDEyMDI0LzE1MTQ1LzIyMSAxMjAyMy8xNTE0My8yMjEKK2YgMTIwMjQvMTUxNDUvMjIxIDExODE2LzE1MTQ0LzIyMSAxMTgxNy8xNTE0Ni8yMjEKK2YgMTE4MTcvMTUxNDYvMjIxIDEyMDI1LzE1MTQ2LzIyMSAxMjAyNC8xNTE0NS8yMjEKK2YgMTIwMjUvMTUxNDYvMjIxIDExODE3LzE1MTQ2LzIyMSAxMTgxOC8xNTEzNC8yMjEKK2YgMTE4MTgvMTUxMzQvMjIxIDEyMDI2LzE1MTMzLzIyMSAxMjAyNS8xNTE0Ni8yMjEKK2YgMTIwMjgvMTUxNDcvNDMxNCAxMTgyNi8xNTE0Ny80MzE0IDExODI1LzE1MTMyLzQzMTQKK2YgMTE4MjUvMTUxMzIvNDMxNCAxMjAyNy8xNTEzMi80MzE0IDEyMDI4LzE1MTQ3LzQzMTQKK2YgMTIwMjkvMTUxNDgvMjMzMiAxMTgyNy8xNTE0OC8yMzMyIDExODI2LzE1MTQ3LzIzMzIKK2YgMTE4MjYvMTUxNDcvNDMxMyAxMjAyOC8xNTE0Ny80MzEzIDEyMDI5LzE1MTQ4LzQzMTMKK2YgMTIwMzAvMTUxNDkvNDMxNCAxMTgyOC8xNTE0OS80MzE0IDExODI3LzE1MTQ4LzQzMTQKK2YgMTE4MjcvMTUxNDgvMTA0NCAxMjAyOS8xNTE0OC8xMDQ0IDEyMDMwLzE1MTQ5LzEwNDQKK2YgMTIwMzEvMTQ4NTYvNDMxNCAxMTgyOS8xNDg1Ni80MzE0IDExODI4LzE1MTQ5LzQzMTQKK2YgMTE4MjgvMTUxNDkvNDMxNCAxMjAzMC8xNTE0OS80MzE0IDEyMDMxLzE0ODU2LzQzMTQKK2YgMTIwMzIvMTQ4NTcvMTA0NCAxMTgzMC8xNDg1Ny8xMDQ0IDExODI5LzE0ODU2LzEwNDQKK2YgMTE4MjkvMTQ4NTYvNDMxMyAxMjAzMS8xNDg1Ni80MzEzIDEyMDMyLzE0ODU3LzQzMTMKK2YgMTIwMzMvMTUxNTAvNDMxNSAxMTgzMS8xNTE1MC80MzE1IDExODMwLzE0ODU3LzQzMTUKK2YgMTE4MzAvMTQ4NTcvMTA4MCAxMjAzMi8xNDg1Ny8xMDgwIDEyMDMzLzE1MTUwLzEwODAKK2YgMTIwMTcvMTUxNTEvMTA0NCAxMTc5OC8xNTE1MS8xMDQ0IDExODMxLzE1MTUwLzEwNDQKK2YgMTE4MzEvMTUxNTAvNDMxNCAxMjAzMy8xNTE1MC80MzE0IDEyMDE3LzE1MTUxLzQzMTQKK2YgMTIwMzUvMTQ2OTkvMTA0NCAxMTgzMy8xNDY5OS8xMDQ0IDExODMyLzE1MTM2LzEwNDQKK2YgMTE4MzIvMTUxMzYvNDMxNCAxMjAzNC8xNTEzNi80MzE0IDEyMDM1LzE0Njk5LzQzMTQKK2YgMTIwMTgvMTQ2OTcvMTA0NCAxMTgwMC8xNDY5Ny8xMDQ0IDExODMzLzE0Njk5LzEwNDQKK2YgMTE4MzMvMTQ2OTkvMTA0NCAxMjAzNS8xNDY5OS8xMDQ0IDEyMDE4LzE0Njk3LzEwNDQKK2YgMTIwNDAvMTQ4NzQvMTYxMiAxMTg0OC8xNDg3NC8xNjEyIDExODgzLzE0ODczLzE2MTIKK2YgMTE4ODMvMTQ4NzMvMTYxMiAxMjA0MS8xNDg3My8xNjEyIDEyMDQwLzE0ODc0LzE2MTIKK2YgMTIwMzkvMTUwODUvMzk1OSAxMTg0Ny8xNTA4NS8zOTU5IDExODQ4LzE0ODc0LzM5NTkKK2YgMTE4NDgvMTQ4NzQvMzk1OSAxMjA0MC8xNDg3NC8zOTU5IDEyMDM5LzE1MDg1LzM5NTkKK2YgMTIwMzgvMTUxNTIvMzk2NCAxMTg0Ni8xNDg5Ni8zOTY0IDExODQ3LzE1MTUzLzM5NjQKK2YgMTE4NDcvMTUxNTMvMzk2NCAxMjAzOS8xNTE1NC8zOTY0IDEyMDM4LzE1MTUyLzM5NjQKK2YgMTIwMzYvMTUxMzEvMzk2MyAxMTgzNC8xNDU4MS8zOTYzIDExODQ2LzE0ODk2LzM5NjMKK2YgMTE4NDYvMTQ4OTYvMzk2MyAxMjAzOC8xNTE1Mi8zOTYzIDEyMDM2LzE1MTMxLzM5NjMKK2YgMTIwNDMvMTQ5ODIvMTA0MyAxMTkzMi8xNDk4Mi8xMDQzIDExOTU2LzE1MTU1LzEwNDMKK2YgMTE5NTYvMTUxNTUvMTA0MyAxMjA1Mi8xNTE1Ni8xMDQzIDEyMDQzLzE0OTgyLzEwNDMKK2YgMTE5NTAvMTUxNTcvMjIxIDEyMDUxLzE1MTU4LzIyMSAxMTkzMC8xNTA5OS8yMjEKK2YgMTIwNDQvMTUwODAvMjIxIDExOTMzLzE1MDgwLzIyMSAxMTk0NS8xNTA3OS8yMjEKK2YgMTE5NDUvMTUwNzkvMjIxIDEyMDQ3LzE1MTU5LzIyMSAxMjA0NC8xNTA4MC8yMjEKK2YgMTIwNDEvMTQ4NzMvMTA0MyAxMTg4My8xNDg3My8xMDQzIDExOTYzLzE1MTYwLzEwNDMKK2YgMTE5NjMvMTUxNjAvMTA0MyAxMjA1OS8xNTE2MS8xMDQzIDEyMDQxLzE0ODczLzEwNDMKK2YgMTIwNDUvMTUxNjIvMjIxIDExOTQxLzE1MTYyLzIyMSAxMTg0NS8xNTEzOC8yMjEKK2YgMTE4NDUvMTUxMzgvMjIxIDEyMDM3LzE1MTM3LzIyMSAxMjA0NS8xNTE2Mi8yMjEKK2YgMTIwNDYvMTUxNjMvMjIxIDExOTQ0LzE1MTY0LzIyMSAxMTk0MS8xNTE2Mi8yMjEKK2YgMTE5NDEvMTUxNjIvMjIxIDEyMDQ1LzE1MTYyLzIyMSAxMjA0Ni8xNTE2My8yMjEKK2YgMTIwNDcvMTUxNTkvMjIxIDExOTQ1LzE1MDc5LzIyMSAxMTk0NC8xNTE2NC8yMjEKK2YgMTE5NDQvMTUxNjQvMjIxIDEyMDQ2LzE1MTYzLzIyMSAxMjA0Ny8xNTE1OS8yMjEKK2YgMTIwNDgvMTUxNjUvMjIxIDExOTQ3LzE1MTY2LzIyMSAxMTkzMy8xNTA4MC8yMjEKK2YgMTE5MzMvMTUwODAvMjIxIDEyMDQ0LzE1MDgwLzIyMSAxMjA0OC8xNTE2NS8yMjEKK2YgMTIwNDkvMTUxNjcvMjIxIDExOTQ4LzE1MTY4LzIyMSAxMTk0Ny8xNTE2Ni8yMjEKK2YgMTE5NDcvMTUxNjYvMjIxIDEyMDQ4LzE1MTY1LzIyMSAxMjA0OS8xNTE2Ny8yMjEKK2YgMTIwNTAvMTUxNjkvMjIxIDExOTQ5LzE1MTY5LzIyMSAxMTk0OC8xNTE2OC8yMjEKK2YgMTE5NDgvMTUxNjgvMjIxIDEyMDQ5LzE1MTY3LzIyMSAxMjA1MC8xNTE2OS8yMjEKK2YgMTIwNTEvMTUxNTgvMjIxIDExOTUwLzE1MTU3LzIyMSAxMTk0OS8xNTE2OS8yMjEKK2YgMTE5NDkvMTUxNjkvMjIxIDEyMDUwLzE1MTY5LzIyMSAxMjA1MS8xNTE1OC8yMjEKK2YgMTIwNTIvMTUxNTYvMTA0MyAxMTk1Ni8xNTE1NS8xMDQzIDExOTU3LzE1MTcwLzEwNDMKK2YgMTE5NTcvMTUxNzAvMTA0MyAxMjA1My8xNTE3MS8xMDQzIDEyMDUyLzE1MTU2LzEwNDMKK2YgMTIwNTMvMTUxNzEvMTA0MyAxMTk1Ny8xNTE3MC8xMDQzIDExOTU4LzE1MTcyLzEwNDMKK2YgMTE5NTgvMTUxNzIvMTA0MyAxMjA1NC8xNTE3Mi8xMDQzIDEyMDUzLzE1MTcxLzEwNDMKK2YgMTIwNTQvMTUxNzIvMTA0MyAxMTk1OC8xNTE3Mi8xMDQzIDExOTU5LzE1MTczLzEwNDMKK2YgMTE5NTkvMTUxNzMvMTA0MyAxMjA1NS8xNTE3NC8xMDQzIDEyMDU0LzE1MTcyLzEwNDMKK2YgMTIwNTUvMTUxNzQvMTA0MyAxMTk1OS8xNTE3My8xMDQzIDExOTYwLzE1MTc1LzEwNDMKK2YgMTE5NjAvMTUxNzUvMTA0MyAxMjA1Ni8xNTE3Ni8xMDQzIDEyMDU1LzE1MTc0LzEwNDMKK2YgMTIwNTYvMTUxNzYvMTA2NSAxMTk2MC8xNTE3NS8xMDY1IDExOTYxLzE1MTc3LzEwNjUKK2YgMTE5NjEvMTUxNzcvMTYzMiAxMjA1Ny8xNTE3Ny8xNjMyIDEyMDU2LzE1MTc2LzE2MzIKK2YgMTIwNTcvMTUxNzcvMTA0MyAxMTk2MS8xNTE3Ny8xMDQzIDExOTYyLzE1MTc4LzEwNDMKK2YgMTE5NjIvMTUxNzgvMTA0MyAxMjA1OC8xNTE3OS8xMDQzIDEyMDU3LzE1MTc3LzEwNDMKK2YgMTIwNTgvMTUxNzkvMTA0MyAxMTk2Mi8xNTE3OC8xMDQzIDExOTMwLzE1MTgwLzEwNDMKK2YgMTE5MzAvMTUxODAvMTA0MyAxMjA0Mi8xNTE4MS8xMDQzIDEyMDU4LzE1MTc5LzEwNDMKK2YgMTIwNTkvMTUxNjEvMTA0MyAxMTk2My8xNTE2MC8xMDQzIDExOTY0LzE0OTgzLzEwNDMKK2YgMTE5NjQvMTQ5ODMvMTA0MyAxMjA2MC8xNTE4Mi8xMDQzIDEyMDU5LzE1MTYxLzEwNDMKK2YgMTIwNjAvMTUxODIvMTA0MyAxMTk2NC8xNDk4My8xMDQzIDExOTMyLzE0OTgyLzEwNDMKK2YgMTE5MzIvMTQ5ODIvMTA0MyAxMjA0My8xNDk4Mi8xMDQzIDEyMDYwLzE1MTgyLzEwNDMKK2YgMTE5NjcvMTUxODMvMTA4OCAxMTk2OC8xNTE4NC8xMDg4IDEyMDE2LzE0NTYxLzEwODgKK2YgMTIwMTYvMTQ1NjEvMTA4OCAxMjAxNS8xNDU2MC8xMDg4IDExOTY3LzE1MTgzLzEwODgKK2YgMTE5NjcvMTUxODMvMzk2MCAxMjAxNS8xNDU2MC8zOTYwIDEyMDE0LzE0ODM1LzM5NjAKK2YgMTIwMTQvMTQ4MzUvNDUwNCAxMTk2Ni8xNTE4NS80NTA0IDExOTY3LzE1MTgzLzQ1MDQKK2YgMTE5NjYvMTUxODYvMzk2MSAxMjAxNC8xNTEyOC8zOTYxIDEyMDEzLzE1MTMwLzM5NjEKK2YgMTIwMTMvMTUxMzAvMzk2MSAxMTk2NS8xNTE4Ny8zOTYxIDExOTY2LzE1MTg2LzM5NjEKK2YgMTE5NjUvMTUxODcvMzk2MiAxMjAxMy8xNTEzMC8zOTYyIDEyMDM2LzE1MTMxLzM5NjIKK2YgMTIwMzYvMTUxMzEvMzk2MiAxMTk4OC8xNTE4OC8zOTYyIDExOTY1LzE1MTg3LzM5NjIKK2YgMTE5NzAvMTUxODkvMTA4MCAxMTk3OS8xNTE5MC8xMDgwIDEyMDI3LzE1MTMyLzEwODAKK2YgMTIwMjcvMTUxMzIvMTA4MCAxMjAxOC8xNDY5Ny8xMDgwIDExOTcwLzE1MTg5LzEwODAKK2YgMTE5NjkvMTUxOTEvMjIxIDExOTc4LzE1MTkyLzIyMSAxMjAyNi8xNTEzMy8yMjEKK2YgMTIwMjYvMTUxMzMvMjIxIDEyMDE3LzE1MTkzLzIyMSAxMTk2OS8xNTE5MS8yMjEKK2YgMTIwMTkvMTQ4MjYvMjIxIDExOTcxLzE1MTk0LzIyMSAxMTk3NC8xNTE5NS8yMjEKK2YgMTE5NzQvMTUxOTUvMjIxIDEyMDIyLzE1MTM1LzIyMSAxMjAxOS8xNDgyNi8yMjEKK2YgMTE5ODYvMTUxOTYvMTA0NCAxMjAzNC8xNTEzNi8xMDQ0IDEyMDE2LzE0NTYxLzEwNDQKK2YgMTIwMTYvMTQ1NjEvMTA0NCAxMTk2OC8xNTE4NC8xMDQ0IDExOTg2LzE1MTk2LzEwNDQKK2YgMTIwMjAvMTUxMzkvMjIxIDExOTcyLzE1MTk3LzIyMSAxMTk4OS8xNTE5OC8yMjEKK2YgMTE5ODkvMTUxOTgvMjIxIDEyMDM3LzE1MTM3LzIyMSAxMjAyMC8xNTEzOS8yMjEKK2YgMTE5NzMvMTUxOTkvMjIxIDExOTcyLzE1MTk3LzIyMSAxMjAyMC8xNTEzOS8yMjEKK2YgMTIwMjAvMTUxMzkvMjIxIDEyMDIxLzE1MTQxLzIyMSAxMTk3My8xNTE5OS8yMjEKK2YgMTE5NzQvMTUxOTUvMjIxIDExOTczLzE1MTk5LzIyMSAxMjAyMS8xNTE0MS8yMjEKK2YgMTIwMjEvMTUxNDEvMjIxIDEyMDIyLzE1MTM1LzIyMSAxMTk3NC8xNTE5NS8yMjEKK2YgMTE5NzUvMTUyMDAvMjIxIDExOTcxLzE1MTk0LzIyMSAxMjAxOS8xNDgyNi8yMjEKK2YgMTIwMTkvMTQ4MjYvMjIxIDEyMDIzLzE1MTQzLzIyMSAxMTk3NS8xNTIwMC8yMjEKK2YgMTE5NzYvMTUyMDEvMjIxIDExOTc1LzE1MjAwLzIyMSAxMjAyMy8xNTE0My8yMjEKK2YgMTIwMjMvMTUxNDMvMjIxIDEyMDI0LzE1MTQ1LzIyMSAxMTk3Ni8xNTIwMS8yMjEKK2YgMTE5NzcvMTUyMDIvMjIxIDExOTc2LzE1MjAxLzIyMSAxMjAyNC8xNTE0NS8yMjEKK2YgMTIwMjQvMTUxNDUvMjIxIDEyMDI1LzE1MTQ2LzIyMSAxMTk3Ny8xNTIwMi8yMjEKK2YgMTE5NzgvMTUxOTIvMjIxIDExOTc3LzE1MjAyLzIyMSAxMjAyNS8xNTE0Ni8yMjEKK2YgMTIwMjUvMTUxNDYvMjIxIDEyMDI2LzE1MTMzLzIyMSAxMTk3OC8xNTE5Mi8yMjEKK2YgMTE5NzkvMTUxOTAvMTA0NCAxMTk4MC8xNTIwMy8xMDQ0IDEyMDI4LzE1MTQ3LzEwNDQKK2YgMTIwMjgvMTUxNDcvMTA0NCAxMjAyNy8xNTEzMi8xMDQ0IDExOTc5LzE1MTkwLzEwNDQKK2YgMTE5ODAvMTUyMDMvMTA0NCAxMTk4MS8xNTIwNC8xMDQ0IDEyMDI5LzE1MTQ4LzEwNDQKK2YgMTIwMjkvMTUxNDgvMTA0NCAxMjAyOC8xNTE0Ny8xMDQ0IDExOTgwLzE1MjAzLzEwNDQKK2YgMTE5ODEvMTUyMDQvMTA0NCAxMTk4Mi8xNTIwNS8xMDQ0IDEyMDMwLzE1MTQ5LzEwNDQKK2YgMTIwMzAvMTUxNDkvMTA0NCAxMjAyOS8xNTE0OC8xMDQ0IDExOTgxLzE1MjA0LzEwNDQKK2YgMTE5ODIvMTUyMDUvMTA0NCAxMTk4My8xNTIwNi8xMDQ0IDEyMDMxLzE0ODU2LzEwNDQKK2YgMTIwMzEvMTQ4NTYvMTA0NCAxMjAzMC8xNTE0OS8xMDQ0IDExOTgyLzE1MjA1LzEwNDQKK2YgMTE5ODMvMTUyMDYvMTA0NCAxMTk4NC8xNTIwNy8xMDQ0IDEyMDMyLzE0ODU3LzEwNDQKK2YgMTIwMzIvMTQ4NTcvMTA0NCAxMjAzMS8xNDg1Ni8xMDQ0IDExOTgzLzE1MjA2LzEwNDQKK2YgMTE5ODQvMTUyMDcvMTA4MCAxMTk4NS8xNTIwOC8xMDgwIDEyMDMzLzE1MTUwLzEwODAKK2YgMTIwMzMvMTUxNTAvMTA4MCAxMjAzMi8xNDg1Ny8xMDgwIDExOTg0LzE1MjA3LzEwODAKK2YgMTE5ODUvMTUyMDgvMTA0NCAxMTk2OS8xNTIwOS8xMDQ0IDEyMDE3LzE1MTUxLzEwNDQKK2YgMTIwMTcvMTUxNTEvMTA0NCAxMjAzMy8xNTE1MC8xMDQ0IDExOTg1LzE1MjA4LzEwNDQKK2YgMTE5ODYvMTUxOTYvMTA0NCAxMTk4Ny8xNTIxMC8xMDQ0IDEyMDM1LzE0Njk5LzEwNDQKK2YgMTIwMzUvMTQ2OTkvMTA0NCAxMjAzNC8xNTEzNi8xMDQ0IDExOTg2LzE1MTk2LzEwNDQKK2YgMTE5ODcvMTUyMTAvMTA0NCAxMTk3MC8xNTE4OS8xMDQ0IDEyMDE4LzE0Njk3LzEwNDQKK2YgMTIwMTgvMTQ2OTcvMTA0NCAxMjAzNS8xNDY5OS8xMDQ0IDExOTg3LzE1MjEwLzEwNDQKK2YgMTE5OTMvMTUyMTEvMTYxMiAxMTk5Mi8xNTIxMi8xNjEyIDEyMDQwLzE0ODc0LzE2MTIKK2YgMTIwNDAvMTQ4NzQvMTYxMiAxMjA0MS8xNDg3My8xNjEyIDExOTkzLzE1MjExLzE2MTIKK2YgMTE5OTEvMTUyMTMvMzk1OSAxMjAzOS8xNTA4NS8zOTU5IDEyMDQwLzE0ODc0LzM5NTkKK2YgMTIwNDAvMTQ4NzQvMzk1OSAxMTk5Mi8xNTIxMi8zOTU5IDExOTkxLzE1MjEzLzM5NTkKK2YgMTE5OTAvMTUyMTQvMzk2NCAxMjAzOC8xNTE1Mi8zOTY0IDEyMDM5LzE1MTU0LzM5NjQKK2YgMTIwMzkvMTUxNTQvMzk2NCAxMTk5MS8xNTIxNS8zOTY0IDExOTkwLzE1MjE0LzM5NjQKK2YgMTE5ODgvMTUxODgvMzk2MyAxMjAzNi8xNTEzMS8zOTYzIDEyMDM4LzE1MTUyLzM5NjMKK2YgMTIwMzgvMTUxNTIvMzk2MyAxMTk5MC8xNTIxNC8zOTYzIDExOTg4LzE1MTg4LzM5NjMKK2YgMTIwMDQvMTUyMTYvMTA0MyAxMTk5NS8xNTIxNy8xMDQzIDEyMDQzLzE0OTgyLzEwNDMKK2YgMTIwNDMvMTQ5ODIvMTA0MyAxMjA1Mi8xNTE1Ni8xMDQzIDEyMDA0LzE1MjE2LzEwNDMKK2YgMTIwMDMvMTUyMTgvMjIxIDExOTk0LzE1MjE5LzIyMSAxMjA0Mi8xNTIyMC8yMjEKK2YgMTIwNDIvMTUyMjAvMjIxIDEyMDUxLzE1MTU4LzIyMSAxMjAwMy8xNTIxOC8yMjEKK2YgMTE5OTkvMTUyMjEvMjIxIDExOTk2LzE1MjIyLzIyMSAxMjA0NC8xNTA4MC8yMjEKK2YgMTIwNDQvMTUwODAvMjIxIDEyMDQ3LzE1MTU5LzIyMSAxMTk5OS8xNTIyMS8yMjEKK2YgMTIwNDEvMTQ4NzMvMTA0MyAxMjA1OS8xNTE2MS8xMDQzIDEyMDExLzE1MjIzLzEwNDMKK2YgMTIwMTEvMTUyMjMvMTA0MyAxMTk5My8xNTIxMS8xMDQzIDEyMDQxLzE0ODczLzEwNDMKK2YgMTE5ODkvMTUxOTgvMjIxIDExOTk3LzE1MjI0LzIyMSAxMjA0NS8xNTE2Mi8yMjEKK2YgMTIwNDUvMTUxNjIvMjIxIDEyMDM3LzE1MTM3LzIyMSAxMTk4OS8xNTE5OC8yMjEKK2YgMTIwNDUvMTUxNjIvMjIxIDExOTk3LzE1MjI0LzIyMSAxMTk5OC8xNTIyNS8yMjEKK2YgMTE5OTgvMTUyMjUvMjIxIDEyMDQ2LzE1MTYzLzIyMSAxMjA0NS8xNTE2Mi8yMjEKK2YgMTE5OTgvMTUyMjUvMjIxIDExOTk5LzE1MjIxLzIyMSAxMjA0Ny8xNTE1OS8yMjEKK2YgMTIwNDcvMTUxNTkvMjIxIDEyMDQ2LzE1MTYzLzIyMSAxMTk5OC8xNTIyNS8yMjEKK2YgMTE5OTYvMTUyMjIvMjIxIDEyMDAwLzE1MjI2LzIyMSAxMjA0OC8xNTE2NS8yMjEKK2YgMTIwNDgvMTUxNjUvMjIxIDEyMDQ0LzE1MDgwLzIyMSAxMTk5Ni8xNTIyMi8yMjEKK2YgMTIwMDAvMTUyMjYvMjIxIDEyMDAxLzE1MjI3LzIyMSAxMjA0OS8xNTE2Ny8yMjEKK2YgMTIwNDkvMTUxNjcvMjIxIDEyMDQ4LzE1MTY1LzIyMSAxMjAwMC8xNTIyNi8yMjEKK2YgMTIwMDEvMTUyMjcvMjIxIDEyMDAyLzE1MjI4LzIyMSAxMjA1MC8xNTE2OS8yMjEKK2YgMTIwNTAvMTUxNjkvMjIxIDEyMDQ5LzE1MTY3LzIyMSAxMjAwMS8xNTIyNy8yMjEKK2YgMTIwMDIvMTUyMjgvMjIxIDEyMDAzLzE1MjE4LzIyMSAxMjA1MS8xNTE1OC8yMjEKK2YgMTIwNTEvMTUxNTgvMjIxIDEyMDUwLzE1MTY5LzIyMSAxMjAwMi8xNTIyOC8yMjEKK2YgMTIwMDUvMTUyMjkvMTA0MyAxMjAwNC8xNTIxNi8xMDQzIDEyMDUyLzE1MTU2LzEwNDMKK2YgMTIwNTIvMTUxNTYvMTA0MyAxMjA1My8xNTE3MS8xMDQzIDEyMDA1LzE1MjI5LzEwNDMKK2YgMTIwMDYvMTUyMzAvMTA0MyAxMjAwNS8xNTIyOS8xMDQzIDEyMDUzLzE1MTcxLzEwNDMKK2YgMTIwNTMvMTUxNzEvMTA0MyAxMjA1NC8xNTE3Mi8xMDQzIDEyMDA2LzE1MjMwLzEwNDMKK2YgMTIwMDcvMTUyMzEvMTA0MyAxMjAwNi8xNTIzMC8xMDQzIDEyMDU0LzE1MTcyLzEwNDMKK2YgMTIwNTQvMTUxNzIvMTA0MyAxMjA1NS8xNTE3NC8xMDQzIDEyMDA3LzE1MjMxLzEwNDMKK2YgMTIwMDgvMTUyMzIvMTA0MyAxMjAwNy8xNTIzMS8xMDQzIDEyMDU1LzE1MTc0LzEwNDMKK2YgMTIwNTUvMTUxNzQvMTA0MyAxMjA1Ni8xNTE3Ni8xMDQzIDEyMDA4LzE1MjMyLzEwNDMKK2YgMTIwMDkvMTUyMzMvMTA2NSAxMjAwOC8xNTIzMi8xMDY1IDEyMDU2LzE1MTc2LzEwNjUKK2YgMTIwNTYvMTUxNzYvMTA2NSAxMjA1Ny8xNTE3Ny8xMDY1IDEyMDA5LzE1MjMzLzEwNjUKK2YgMTIwMTAvMTUyMzQvMTA0MyAxMjAwOS8xNTIzMy8xMDQzIDEyMDU3LzE1MTc3LzEwNDMKK2YgMTIwNTcvMTUxNzcvMTA0MyAxMjA1OC8xNTE3OS8xMDQzIDEyMDEwLzE1MjM0LzEwNDMKK2YgMTE5OTQvMTUyMzUvMTA0MyAxMjAxMC8xNTIzNC8xMDQzIDEyMDU4LzE1MTc5LzEwNDMKK2YgMTIwNTgvMTUxNzkvMTA0MyAxMjA0Mi8xNTE4MS8xMDQzIDExOTk0LzE1MjM1LzEwNDMKK2YgMTIwMTIvMTUyMzYvMTA0MyAxMjAxMS8xNTIyMy8xMDQzIDEyMDU5LzE1MTYxLzEwNDMKK2YgMTIwNTkvMTUxNjEvMTA0MyAxMjA2MC8xNTE4Mi8xMDQzIDEyMDEyLzE1MjM2LzEwNDMKK2YgMTIwNDMvMTQ5ODIvMTA0MyAxMTk5NS8xNTIxNy8xMDQzIDEyMDEyLzE1MjM2LzEwNDMKK2YgMTIwMTIvMTUyMzYvMTA0MyAxMjA2MC8xNTE4Mi8xMDQzIDEyMDQzLzE0OTgyLzEwNDMKK2YgMTE0MzYvMTQzODkvNjg3IDEyMDY0LzE1MjM3LzY4NyAxMjA2OS8xNTIzOC82ODcKK2YgMTIwNjkvMTUyMzgvMTI3MiAxMTQzNS8xNDM5MC8xMjcyIDExNDM2LzE0Mzg5LzEyNzIKK2YgMTE4MDcvMTUyMzkvNDkzIDEyMDY3LzE1MjQwLzQ5MyAxMjA2OC8xNTI0MS80OTMKK2YgMTIwNjgvMTUyNDEvNDUwNiAxMjA2Ni8xNTI0Mi80NTA2IDEyMDcwLzE1MjQzLzQ1MDYKK2YgMTIwNzAvMTUyNDMvNDkzIDExODA3LzE1MjM5LzQ5MyAxMjA2OC8xNTI0MS80OTMKK2YgMTIwNTEvMTUxNTgvMjIxIDEyMDQyLzE1MjIwLzIyMSAxMTkzMC8xNTA5OS8yMjEKK2YgMTE0MjUvMTQ0MjgvMTE3MiAxMTUzOC8xNDQyOC8xMTcyIDExNTQ3LzE0NDkwLzExNzIKK2YgMTE3OTgvMTQ4NDUvMjIxIDEyMDE3LzE1MTkzLzIyMSAxMjAyNi8xNTEzMy8yMjEKK2YgMTEyOTQvMTQxODAvMTE3MiAxMTMxMy8xNDQ2Ny8xMTcyIDExNTIyLzE0NDY3LzExNzIKK2YgMTEzMDQvMTQxNTEvNDUwNyAxMTMwNS8xNTI0NC80NTA3IDEyMDYxLzE1MjQ1LzQ1MDcKK2YgMTIwNjEvMTUyNDUvNDUwOCAxMjA2My8xNDE1Mi80NTA4IDExMzA0LzE0MTUxLzQ1MDgKK2YgMTE0MzcvMTUyNDYvNDUwOSAxMTM0MC8xNDE1NS80NTA5IDEyMDY1LzE0MTU0LzQ1MDkKK2YgMTIwNjUvMTUyNDcvNDUxMCAxMjA2NC8xNDQwNS80NTEwIDExNDM3LzE0NDA0LzQ1MTAKK2YgMTIwNjMvMTUyNDgvMTUwNyAxMTMwMy8xNTI0OS8xNTA3IDEyMDY1LzE1MjUwLzE1MDcKK2YgMTE5NDEvMTUwNzIvNDUxMSAxMTk0Mi8xNTI1MS80NTExIDEyMDYyLzE1MjUyLzQ1MTEKK2YgMTIwNjIvMTUyNTIvNDUxMiAxMjA2Ni8xNTA3My80NTEyIDExOTQxLzE1MDcyLzQ1MTIKK2YgMTE4MDkvMTUyNTMvNDUxMyAxMTg0NS8xNTA3Ni80NTEzIDEyMDY4LzE1MDc1LzQ1MTMKK2YgMTIwNjgvMTUyNTQvNDUxNCAxMjA2Ny8xNDgyMi80NTE0IDExODA5LzE0ODIxLzQ1MTQKK2YgMTIwNjEvMTQxMzEvMTUwNyAxMTMwMi8xNDEzMC8xNTA3IDExMzAzLzE1MjQ5LzE1MDcKK2YgMTEzMDMvMTUyNDkvNjg3IDEyMDYzLzE1MjQ4LzY4NyAxMjA2MS8xNDEzMS82ODcKK2YgMTEzMDMvMTUyNDkvMTUwNyAxMjA2OS8xNTIzOC8xNTA3IDEyMDY0LzE1MjM3LzE1MDcKK2YgMTIwNjQvMTUyMzcvMTUwNyAxMjA2NS8xNTI1MC8xNTA3IDExMzAzLzE1MjQ5LzE1MDcKK2YgMTIwNjkvMTQzOTYvNDI4MyAxMTMwMy8xNDE0Mi80MjgzIDExNDM0LzE0MTQxLzQyODMKK2YgMTE4MDcvMTUyMzkvNjg3IDExODA2LzE0ODAyLzY4NyAxMTgwOC8xNDgwMS82ODcKK2YgMTE4MDgvMTQ4MDEvNjg3IDEyMDY3LzE1MjQwLzY4NyAxMTgwNy8xNTIzOS82ODcKK2YgMTE5NDAvMTUwNTYvNDUxNSAxMjA3MC8xNTI0My80NTE1IDEyMDY2LzE1MjQyLzQ1MTUKK2YgMTIwNjYvMTUyNDIvNDUxNiAxMjA2Mi8xNTA1Ny80NTE2IDExOTQwLzE1MDU2LzQ1MTYKK2YgMTE5MzkvMTQ4MTEvNDUxNyAxMjA3MC8xNTA2My80NTE3IDExOTQwLzE1MDY0LzQ1MTcKK2YgMTE5NDAvMTUwNjQvNDUxOCAxMTkzOC8xNTA2Ny80NTE4IDExOTM5LzE0ODExLzQ1MTgKK2YgMTE2NjEvMTUyNTUvNjg3IDExNjQ5LzE1MjU2LzY4NyAxMTY1MC8xNTI1Ny82ODcKK2YgMTE2NTAvMTUyNTcvNjg3IDExNjUxLzE1MjU4LzY4NyAxMTY2MS8xNTI1NS82ODcKK2YgMTE2NjQvMTUyNTkvNDUxOSAxMTY2NS8xNTI2MC80NTE5IDExNjM4LzE1MjYxLzQ1MTkKK2YgMTE2MzgvMTUyNjEvNDUxOSAxMTYzNy8xNTI2Mi80NTE5IDExNjY0LzE1MjU5LzQ1MTkKK2YgMTE2NjUvMTUyNjAvNDUyMCAxMTY2Ni8xNTI2My80NTIwIDExNjM5LzE1MjY0LzQ1MjAKK2YgMTE2MzkvMTUyNjQvNDUyMCAxMTYzOC8xNTI2MS80NTIwIDExNjY1LzE1MjYwLzQ1MjAKK2YgMTE2NjYvMTUyNjMvNDUyMSAxMTY2Ny8xNTI2NS80NTIxIDExNjQwLzE1MjY2LzQ1MjEKK2YgMTE2NDAvMTUyNjYvNDUyMSAxMTYzOS8xNTI2NC80NTIxIDExNjY2LzE1MjYzLzQ1MjEKK2YgMTE2NjcvMTUyNjUvNDUyMiAxMTY2OC8xNTI2Ny80NTIyIDExNjQxLzE1MjY4LzQ1MjIKK2YgMTE2NDEvMTUyNjgvNDUyMiAxMTY0MC8xNTI2Ni80NTIyIDExNjY3LzE1MjY1LzQ1MjIKK2YgMTE2NjgvMTUyNjcvNDUyMyAxMTY2OS8xNTI2OS80NTIzIDExNjQyLzE1MjcwLzQ1MjMKK2YgMTE2NDIvMTUyNzAvNDUyMyAxMTY0MS8xNTI2OC80NTIzIDExNjY4LzE1MjY3LzQ1MjMKK2YgMTE2NjkvMTUyNjkvNDUyNCAxMTY3MC8xNTI3MS80NTI0IDExNjQzLzE1MjcyLzQ1MjQKK2YgMTE2NDMvMTUyNzIvNDUyNCAxMTY0Mi8xNTI3MC80NTI0IDExNjY5LzE1MjY5LzQ1MjQKK2YgMTE2NzAvMTUyNzEvNDUyNSAxMTY3MS8xNTI3My80NTI1IDExNjQ0LzE1Mjc0LzQ1MjUKK2YgMTE2NDQvMTUyNzQvNDUyNSAxMTY0My8xNTI3Mi80NTI1IDExNjcwLzE1MjcxLzQ1MjUKK2YgMTE2NzEvMTUyNzMvNDUyNiAxMTY3Mi8xNTI3NS80NTI2IDExNjQ1LzE1Mjc2LzQ1MjYKK2YgMTE2NDUvMTUyNzYvNDUyNyAxMTY0NC8xNTI3NC80NTI3IDExNjcxLzE1MjczLzQ1MjcKK2YgMTE2NzIvMTUyNzUvNDUyOCAxMTY3My8xNTI3Ny80NTI4IDExNjQ2LzE1Mjc4LzQ1MjgKK2YgMTE2NDYvMTUyNzgvNDUyOCAxMTY0NS8xNTI3Ni80NTI4IDExNjcyLzE1Mjc1LzQ1MjgKK2YgMTE2NzMvMTUyNzcvNDUyOSAxMTY3NC8xNTI3OS80NTI5IDExNjQ3LzE1MjgwLzQ1MjkKK2YgMTE2NDcvMTUyODAvNDUyOSAxMTY0Ni8xNTI3OC80NTI5IDExNjczLzE1Mjc3LzQ1MjkKK2YgMTE2NzQvMTUyNzkvNDUzMCAxMTY3NS8xNTI4MS80NTMwIDExNjQ4LzE1MjgyLzQ1MzAKK2YgMTE2NDgvMTUyODIvNDUzMCAxMTY0Ny8xNTI4MC80NTMwIDExNjc0LzE1Mjc5LzQ1MzAKK2YgMTE2NzUvMTUyODEvNDUzMSAxMTY2NC8xNTI1OS80NTMxIDExNjM3LzE1MjYyLzQ1MzEKK2YgMTE2MzcvMTUyNjIvNDUzMSAxMTY0OC8xNTI4Mi80NTMxIDExNjc1LzE1MjgxLzQ1MzEKK2YgMTE2MzcvMTUyNjIvNDUzMiAxMTYzOC8xNTI2MS80NTMyIDExNjUwLzE1MjU3LzQ1MzIKK2YgMTE2NTAvMTUyNTcvNDUzMyAxMTY0OS8xNTI1Ni80NTMzIDExNjM3LzE1MjYyLzQ1MzMKK2YgMTE2MzgvMTUyNjEvNDUzNCAxMTYzOS8xNTI2NC80NTM0IDExNjUxLzE1MjU4LzQ1MzQKK2YgMTE2NTEvMTUyNTgvNDUzNSAxMTY1MC8xNTI1Ny80NTM1IDExNjM4LzE1MjYxLzQ1MzUKK2YgMTE2MzkvMTUyNjQvNDUzNiAxMTY0MC8xNTI2Ni80NTM2IDExNjUyLzE1MjgzLzQ1MzYKK2YgMTE2NTIvMTUyODMvNDUzNiAxMTY1MS8xNTI1OC80NTM2IDExNjM5LzE1MjY0LzQ1MzYKK2YgMTE2NDAvMTUyNjYvNDUzNyAxMTY0MS8xNTI2OC80NTM3IDExNjUzLzE1Mjg0LzQ1MzcKK2YgMTE2NTMvMTUyODQvNDUzNyAxMTY1Mi8xNTI4My80NTM3IDExNjQwLzE1MjY2LzQ1MzcKK2YgMTE2NDEvMTUyNjgvNDUzOCAxMTY0Mi8xNTI3MC80NTM4IDExNjU0LzE1Mjg1LzQ1MzgKK2YgMTE2NTQvMTUyODUvNDUzOCAxMTY1My8xNTI4NC80NTM4IDExNjQxLzE1MjY4LzQ1MzgKK2YgMTE2NDIvMTUyNzAvNDUzOSAxMTY0My8xNTI3Mi80NTM5IDExNjU1LzE1Mjg2LzQ1MzkKK2YgMTE2NTUvMTUyODYvNDUzOSAxMTY1NC8xNTI4NS80NTM5IDExNjQyLzE1MjcwLzQ1MzkKK2YgMTE2NDMvMTUyNzIvNDU0MCAxMTY0NC8xNTI3NC80NTQwIDExNjU2LzE1Mjg3LzQ1NDAKK2YgMTE2NTYvMTUyODcvNDU0MCAxMTY1NS8xNTI4Ni80NTQwIDExNjQzLzE1MjcyLzQ1NDAKK2YgMTE2NDQvMTUyNzQvNDU0MSAxMTY0NS8xNTI3Ni80NTQxIDExNjU3LzE1Mjg4LzQ1NDEKK2YgMTE2NTcvMTUyODgvNDU0MSAxMTY1Ni8xNTI4Ny80NTQxIDExNjQ0LzE1Mjc0LzQ1NDEKK2YgMTE2NDUvMTUyNzYvNDU0MiAxMTY0Ni8xNTI3OC80NTQyIDExNjU4LzE1Mjg5LzQ1NDIKK2YgMTE2NTgvMTUyODkvNDU0MiAxMTY1Ny8xNTI4OC80NTQyIDExNjQ1LzE1Mjc2LzQ1NDIKK2YgMTE2NDYvMTUyNzgvNDU0MyAxMTY0Ny8xNTI4MC80NTQzIDExNjU5LzE1MjkwLzQ1NDMKK2YgMTE2NTkvMTUyOTAvNDU0MyAxMTY1OC8xNTI4OS80NTQzIDExNjQ2LzE1Mjc4LzQ1NDMKK2YgMTE2NDcvMTUyODAvNDU0NCAxMTY0OC8xNTI4Mi80NTQ0IDExNjYwLzE1MjkxLzQ1NDQKK2YgMTE2NjAvMTUyOTEvNDU0NCAxMTY1OS8xNTI5MC80NTQ0IDExNjQ3LzE1MjgwLzQ1NDQKK2YgMTE2NDgvMTUyODIvNDU0NSAxMTYzNy8xNTI2Mi80NTQ1IDExNjQ5LzE1MjU2LzQ1NDUKK2YgMTE2NDkvMTUyNTYvNDU0NSAxMTY2MC8xNTI5MS80NTQ1IDExNjQ4LzE1MjgyLzQ1NDUKK2YgMTE2NjIvMTUyOTIvNjg3IDExNjYwLzE1MjkxLzY4NyAxMTY0OS8xNTI1Ni82ODcKK2YgMTE2NDkvMTUyNTYvNjg3IDExNjYxLzE1MjU1LzY4NyAxMTY2Mi8xNTI5Mi82ODcKK2YgMTE2NTkvMTUyOTAvNjg3IDExNjYwLzE1MjkxLzY4NyAxMTY2Mi8xNTI5Mi82ODcKK2YgMTE2NjIvMTUyOTIvNjg3IDExNjYzLzE1MjkzLzY4NyAxMTY1OS8xNTI5MC82ODcKK2YgMTE2NTkvMTUyOTAvNjg3IDExNjYzLzE1MjkzLzY4NyAxMTY1Ny8xNTI4OC82ODcKK2YgMTE2NTcvMTUyODgvNDE1NSAxMTY1OC8xNTI4OS80MTU1IDExNjU5LzE1MjkwLzQxNTUKK2YgMTE2NTMvMTUyODQvNjg3IDExNjYxLzE1MjU1LzY4NyAxMTY1MS8xNTI1OC82ODcKK2YgMTE2NTEvMTUyNTgvNjg3IDExNjUyLzE1MjgzLzY4NyAxMTY1My8xNTI4NC82ODcKK2YgMTE2NTMvMTUyODQvNjg3IDExNjU0LzE1Mjg1LzY4NyAxMTY2Mi8xNTI5Mi82ODcKK2YgMTE2NjIvMTUyOTIvNjg3IDExNjYxLzE1MjU1LzY4NyAxMTY1My8xNTI4NC82ODcKK2YgMTE2NjIvMTUyOTIvNjg3IDExNjU0LzE1Mjg1LzY4NyAxMTY1NS8xNTI4Ni82ODcKK2YgMTE2NTUvMTUyODYvNjg3IDExNjYzLzE1MjkzLzY4NyAxMTY2Mi8xNTI5Mi82ODcKK2YgMTE2NTYvMTUyODcvNjg3IDExNjU3LzE1Mjg4LzY4NyAxMTY2My8xNTI5My82ODcKK2YgMTE2NjMvMTUyOTMvNjg3IDExNjU1LzE1Mjg2LzY4NyAxMTY1Ni8xNTI4Ny82ODcKK2YgMTE2NjQvMTUyNTkvNDU0NiAxMTYyNS8xNTI5NC80NTQ2IDExNjI2LzE1Mjk1LzQ1NDYKK2YgMTE2MjYvMTUyOTUvNDU0NiAxMTY2NS8xNTI2MC80NTQ2IDExNjY0LzE1MjU5LzQ1NDYKK2YgMTE2NjUvMTUyNjAvNDU0NyAxMTYyNi8xNTI5NS80NTQ3IDExNjI3LzE1Mjk2LzQ1NDcKK2YgMTE2MjcvMTUyOTYvNDU0OCAxMTY2Ni8xNTI2My80NTQ4IDExNjY1LzE1MjYwLzQ1NDgKK2YgMTE2NjYvMTUyNjMvNDU0OSAxMTYyNy8xNTI5Ni80NTQ5IDExNjI4LzE1Mjk3LzQ1NDkKK2YgMTE2MjgvMTUyOTcvNDU0OSAxMTY2Ny8xNTI2NS80NTQ5IDExNjY2LzE1MjYzLzQ1NDkKK2YgMTE2NjcvMTUyNjUvNDU1MCAxMTYyOC8xNTI5Ny80NTUwIDExNjI5LzE1Mjk4LzQ1NTAKK2YgMTE2MjkvMTUyOTgvNDU1MCAxMTY2OC8xNTI2Ny80NTUwIDExNjY3LzE1MjY1LzQ1NTAKK2YgMTE2NjgvMTUyNjcvNDU1MSAxMTYyOS8xNTI5OC80NTUxIDExNjMwLzE1Mjk5LzQ1NTEKK2YgMTE2MzAvMTUyOTkvNDU1MiAxMTY2OS8xNTI2OS80NTUyIDExNjY4LzE1MjY3LzQ1NTIKK2YgMTE2NjkvMTUyNjkvNDU1MyAxMTYzMC8xNTI5OS80NTUzIDExNjMxLzE1MzAwLzQ1NTMKK2YgMTE2MzEvMTUzMDAvNDU1NCAxMTY3MC8xNTI3MS80NTU0IDExNjY5LzE1MjY5LzQ1NTQKK2YgMTE2NzAvMTUyNzEvNDU1NSAxMTYzMS8xNTMwMC80NTU1IDExNjMyLzE1MzAxLzQ1NTUKK2YgMTE2MzIvMTUzMDEvNDU1NiAxMTY3MS8xNTI3My80NTU2IDExNjcwLzE1MjcxLzQ1NTYKK2YgMTE2NzEvMTUyNzMvNDU1NyAxMTYzMi8xNTMwMS80NTU3IDExNjMzLzE1MzAyLzQ1NTcKK2YgMTE2MzMvMTUzMDIvNDU1OCAxMTY3Mi8xNTI3NS80NTU4IDExNjcxLzE1MjczLzQ1NTgKK2YgMTE2NzIvMTUyNzUvNDU1OSAxMTYzMy8xNTMwMi80NTU5IDExNjM0LzE1MzAzLzQ1NTkKK2YgMTE2MzQvMTUzMDMvNDU1OSAxMTY3My8xNTI3Ny80NTU5IDExNjcyLzE1Mjc1LzQ1NTkKK2YgMTE2NzMvMTUyNzcvNDU2MCAxMTYzNC8xNTMwMy80NTYwIDExNjM1LzE1MzA0LzQ1NjAKK2YgMTE2MzUvMTUzMDQvNDU2MCAxMTY3NC8xNTI3OS80NTYwIDExNjczLzE1Mjc3LzQ1NjAKK2YgMTE2NzQvMTUyNzkvNDU2MSAxMTYzNS8xNTMwNC80NTYxIDExNjM2LzE1MzA1LzQ1NjEKK2YgMTE2MzYvMTUzMDUvNDU2MSAxMTY3NS8xNTI4MS80NTYxIDExNjc0LzE1Mjc5LzQ1NjEKK2YgMTE2NzUvMTUyODEvNDU2MiAxMTYzNi8xNTMwNS80NTYyIDExNjI1LzE1Mjk0LzQ1NjIKK2YgMTE2MjUvMTUyOTQvNDU2MiAxMTY2NC8xNTI1OS80NTYyIDExNjc1LzE1MjgxLzQ1NjIKK2YgMTExNTcvMTUzMDYvNjg3IDExMTQ3LzE1MzA3LzY4NyAxMTE0Ni8xNTMwOC82ODcKK2YgMTExNDYvMTUzMDgvNjg3IDExMTQ1LzE1MzA5LzY4NyAxMTE1Ny8xNTMwNi82ODcKK2YgMTExNjAvMTUzMTAvNDUyOSAxMTEzMy8xNTMxMS80NTI5IDExMTM0LzE1MzEyLzQ1MjkKK2YgMTExMzQvMTUzMTIvNDUyOSAxMTE2MS8xNTMxMy80NTI5IDExMTYwLzE1MzEwLzQ1MjkKK2YgMTExNjEvMTUzMTMvNDU2MyAxMTEzNC8xNTMxMi80NTYzIDExMTM1LzE1MzE0LzQ1NjMKK2YgMTExMzUvMTUzMTQvNDU2NCAxMTE2Mi8xNTMxNS80NTY0IDExMTYxLzE1MzEzLzQ1NjQKK2YgMTExNjIvMTUzMTUvNDU2NSAxMTEzNS8xNTMxNC80NTY1IDExMTM2LzE1MzE2LzQ1NjUKK2YgMTExMzYvMTUzMTYvNDU2NSAxMTE2My8xNTMxNy80NTY1IDExMTYyLzE1MzE1LzQ1NjUKK2YgMTExNjMvMTUzMTcvNDUyNSAxMTEzNi8xNTMxNi80NTI1IDExMTM3LzE1MzE4LzQ1MjUKK2YgMTExMzcvMTUzMTgvNDUyNSAxMTE2NC8xNTMxOS80NTI1IDExMTYzLzE1MzE3LzQ1MjUKK2YgMTExNjQvMTUzMTkvNDU2NiAxMTEzNy8xNTMxOC80NTY2IDExMTM4LzE1MzIwLzQ1NjYKK2YgMTExMzgvMTUzMjAvNDU2NiAxMTE2NS8xNTMyMS80NTY2IDExMTY0LzE1MzE5LzQ1NjYKK2YgMTExNjUvMTUzMjEvNDU2NyAxMTEzOC8xNTMyMC80NTY3IDExMTM5LzE1MzIyLzQ1NjcKK2YgMTExMzkvMTUzMjIvNDU2OCAxMTE2Ni8xNTMyMy80NTY4IDExMTY1LzE1MzIxLzQ1NjgKK2YgMTExNjYvMTUzMjMvNDUyMiAxMTEzOS8xNTMyMi80NTIyIDExMTQwLzE1MzI0LzQ1MjIKK2YgMTExNDAvMTUzMjQvNDUyMiAxMTE2Ny8xNTMyNS80NTIyIDExMTY2LzE1MzIzLzQ1MjIKK2YgMTExNjcvMTUzMjUvNDU2OSAxMTE0MC8xNTMyNC80NTY5IDExMTQxLzE1MzI2LzQ1NjkKK2YgMTExNDEvMTUzMjYvNDU3MCAxMTE2OC8xNTMyNy80NTcwIDExMTY3LzE1MzI1LzQ1NzAKK2YgMTExNjgvMTUzMjcvNDU3MSAxMTE0MS8xNTMyNi80NTcxIDExMTQyLzE1MzI4LzQ1NzEKK2YgMTExNDIvMTUzMjgvNDU3MSAxMTE2OS8xNTMyOS80NTcxIDExMTY4LzE1MzI3LzQ1NzEKK2YgMTExNjkvMTUzMjkvNDUxOSAxMTE0Mi8xNTMyOC80NTE5IDExMTQzLzE1MzMwLzQ1MTkKK2YgMTExNDMvMTUzMzAvNDUxOSAxMTE3MC8xNTMzMS80NTE5IDExMTY5LzE1MzI5LzQ1MTkKK2YgMTExNzAvMTUzMzEvNDU3MiAxMTE0My8xNTMzMC80NTcyIDExMTQ0LzE1MzMyLzQ1NzIKK2YgMTExNDQvMTUzMzIvNDU3MiAxMTE3MS8xNTMzMy80NTcyIDExMTcwLzE1MzMxLzQ1NzIKK2YgMTExNzEvMTUzMzMvNDU3MyAxMTE0NC8xNTMzMi80NTczIDExMTMzLzE1MzExLzQ1NzMKK2YgMTExMzMvMTUzMTEvNDU3MyAxMTE2MC8xNTMxMC80NTczIDExMTcxLzE1MzMzLzQ1NzMKK2YgMTExMzMvMTUzMTEvNDU3NCAxMTE0NS8xNTMwOS80NTc0IDExMTQ2LzE1MzA4LzQ1NzQKK2YgMTExNDYvMTUzMDgvNDU3NCAxMTEzNC8xNTMxMi80NTc0IDExMTMzLzE1MzExLzQ1NzQKK2YgMTExMzQvMTUzMTIvNDU0MiAxMTE0Ni8xNTMwOC80NTQyIDExMTQ3LzE1MzA3LzQ1NDIKK2YgMTExNDcvMTUzMDcvNDU0MiAxMTEzNS8xNTMxNC80NTQyIDExMTM0LzE1MzEyLzQ1NDIKK2YgMTExMzUvMTUzMTQvNDU3NSAxMTE0Ny8xNTMwNy80NTc1IDExMTQ4LzE1MzM0LzQ1NzUKK2YgMTExNDgvMTUzMzQvNDU3NSAxMTEzNi8xNTMxNi80NTc1IDExMTM1LzE1MzE0LzQ1NzUKK2YgMTExMzYvMTUzMTYvNDU3NiAxMTE0OC8xNTMzNC80NTc2IDExMTQ5LzE1MzM1LzQ1NzYKK2YgMTExNDkvMTUzMzUvNDU3NiAxMTEzNy8xNTMxOC80NTc2IDExMTM2LzE1MzE2LzQ1NzYKK2YgMTExMzcvMTUzMTgvNDUzOSAxMTE0OS8xNTMzNS80NTM5IDExMTUwLzE1MzM2LzQ1MzkKK2YgMTExNTAvMTUzMzYvNDU3NyAxMTEzOC8xNTMyMC80NTc3IDExMTM3LzE1MzE4LzQ1NzcKK2YgMTExMzgvMTUzMjAvNDU3OCAxMTE1MC8xNTMzNi80NTc4IDExMTUxLzE1MzM3LzQ1NzgKK2YgMTExNTEvMTUzMzcvNDU3OCAxMTEzOS8xNTMyMi80NTc4IDExMTM4LzE1MzIwLzQ1NzgKK2YgMTExMzkvMTUzMjIvNDUzNyAxMTE1MS8xNTMzNy80NTM3IDExMTUyLzE1MzM4LzQ1MzcKK2YgMTExNTIvMTUzMzgvNDU3OSAxMTE0MC8xNTMyNC80NTc5IDExMTM5LzE1MzIyLzQ1NzkKK2YgMTExNDAvMTUzMjQvNDU4MCAxMTE1Mi8xNTMzOC80NTgwIDExMTUzLzE1MzM5LzQ1ODAKK2YgMTExNTMvMTUzMzkvNDU4MCAxMTE0MS8xNTMyNi80NTgwIDExMTQwLzE1MzI0LzQ1ODAKK2YgMTExNDEvMTUzMjYvNDUzNCAxMTE1My8xNTMzOS80NTM0IDExMTU0LzE1MzQwLzQ1MzQKK2YgMTExNTQvMTUzNDAvNDUzNCAxMTE0Mi8xNTMyOC80NTM0IDExMTQxLzE1MzI2LzQ1MzQKK2YgMTExNDIvMTUzMjgvNDUzMiAxMTE1NC8xNTM0MC80NTMyIDExMTU1LzE1MzQxLzQ1MzIKK2YgMTExNTUvMTUzNDEvNDUzMiAxMTE0My8xNTMzMC80NTMyIDExMTQyLzE1MzI4LzQ1MzIKK2YgMTExNDMvMTUzMzAvNDU4MSAxMTE1NS8xNTM0MS80NTgxIDExMTU2LzE1MzQyLzQ1ODEKK2YgMTExNTYvMTUzNDIvNDU4MSAxMTE0NC8xNTMzMi80NTgxIDExMTQzLzE1MzMwLzQ1ODEKK2YgMTExNDQvMTUzMzIvNDU4MiAxMTE1Ni8xNTM0Mi80NTgyIDExMTQ1LzE1MzA5LzQ1ODIKK2YgMTExNDUvMTUzMDkvNDU4MyAxMTEzMy8xNTMxMS80NTgzIDExMTQ0LzE1MzMyLzQ1ODMKK2YgMTExNTgvMTUzNDMvNjg3IDExMTU3LzE1MzA2LzY4NyAxMTE0NS8xNTMwOS82ODcKK2YgMTExNDUvMTUzMDkvNjg3IDExMTU2LzE1MzQyLzY4NyAxMTE1OC8xNTM0My82ODcKK2YgMTExNTUvMTUzNDEvNjg3IDExMTU5LzE1MzQ0LzY4NyAxMTE1OC8xNTM0My82ODcKK2YgMTExNTgvMTUzNDMvNjg3IDExMTU2LzE1MzQyLzY4NyAxMTE1NS8xNTM0MS82ODcKK2YgMTExNTUvMTUzNDEvNjg3IDExMTU0LzE1MzQwLzY4NyAxMTE1My8xNTMzOS82ODcKK2YgMTExNTMvMTUzMzkvNjg3IDExMTU5LzE1MzQ0LzY4NyAxMTE1NS8xNTM0MS82ODcKK2YgMTExNDkvMTUzMzUvNjg3IDExMTQ4LzE1MzM0LzY4NyAxMTE0Ny8xNTMwNy82ODcKK2YgMTExNDcvMTUzMDcvNjg3IDExMTU3LzE1MzA2LzY4NyAxMTE0OS8xNTMzNS82ODcKK2YgMTExNDkvMTUzMzUvNjg3IDExMTU3LzE1MzA2LzY4NyAxMTE1OC8xNTM0My82ODcKK2YgMTExNTgvMTUzNDMvNjg3IDExMTUwLzE1MzM2LzY4NyAxMTE0OS8xNTMzNS82ODcKK2YgMTExNTgvMTUzNDMvNjg3IDExMTU5LzE1MzQ0LzY4NyAxMTE1MS8xNTMzNy82ODcKK2YgMTExNTEvMTUzMzcvNjg3IDExMTUwLzE1MzM2LzY4NyAxMTE1OC8xNTM0My82ODcKK2YgMTExNTIvMTUzMzgvNjg3IDExMTUxLzE1MzM3LzY4NyAxMTE1OS8xNTM0NC82ODcKK2YgMTExNTkvMTUzNDQvNjg3IDExMTUzLzE1MzM5LzY4NyAxMTE1Mi8xNTMzOC82ODcKK2YgMTExNjAvMTUzMTAvNDU2MCAxMTE2MS8xNTMxMy80NTYwIDExMTIyLzE1MzQ1LzQ1NjAKK2YgMTExMjIvMTUzNDUvNDU2MCAxMTEyMS8xNTM0Ni80NTYwIDExMTYwLzE1MzEwLzQ1NjAKK2YgMTExNjEvMTUzMTMvNDU4NCAxMTE2Mi8xNTMxNS80NTg0IDExMTIzLzE1MzQ3LzQ1ODQKK2YgMTExMjMvMTUzNDcvNDU4NCAxMTEyMi8xNTM0NS80NTg0IDExMTYxLzE1MzEzLzQ1ODQKK2YgMTExNjIvMTUzMTUvNDU1OCAxMTE2My8xNTMxNy80NTU4IDExMTI0LzE1MzQ4LzQ1NTgKK2YgMTExMjQvMTUzNDgvNDU1OCAxMTEyMy8xNTM0Ny80NTU4IDExMTYyLzE1MzE1LzQ1NTgKK2YgMTExNjMvMTUzMTcvNDU1NSAxMTE2NC8xNTMxOS80NTU1IDExMTI1LzE1MzQ5LzQ1NTUKK2YgMTExMjUvMTUzNDkvNDU1NSAxMTEyNC8xNTM0OC80NTU1IDExMTYzLzE1MzE3LzQ1NTUKK2YgMTExNjQvMTUzMTkvNDU4NSAxMTE2NS8xNTMyMS80NTg1IDExMTI2LzE1MzUwLzQ1ODUKK2YgMTExMjYvMTUzNTAvNDU4NSAxMTEyNS8xNTM0OS80NTg1IDExMTY0LzE1MzE5LzQ1ODUKK2YgMTExNjUvMTUzMjEvNDU4NiAxMTE2Ni8xNTMyMy80NTg2IDExMTI3LzE1MzUxLzQ1ODYKK2YgMTExMjcvMTUzNTEvNDU4NyAxMTEyNi8xNTM1MC80NTg3IDExMTY1LzE1MzIxLzQ1ODcKK2YgMTExNjYvMTUzMjMvNDU1MCAxMTE2Ny8xNTMyNS80NTUwIDExMTI4LzE1MzUyLzQ1NTAKK2YgMTExMjgvMTUzNTIvNDU1MCAxMTEyNy8xNTM1MS80NTUwIDExMTY2LzE1MzIzLzQ1NTAKK2YgMTExNjcvMTUzMjUvNDU0OSAxMTE2OC8xNTMyNy80NTQ5IDExMTI5LzE1MzUzLzQ1NDkKK2YgMTExMjkvMTUzNTMvNDU0OSAxMTEyOC8xNTM1Mi80NTQ5IDExMTY3LzE1MzI1LzQ1NDkKK2YgMTExNjgvMTUzMjcvNDU4OCAxMTE2OS8xNTMyOS80NTg4IDExMTMwLzE1MzU0LzQ1ODgKK2YgMTExMzAvMTUzNTQvNDU4OSAxMTEyOS8xNTM1My80NTg5IDExMTY4LzE1MzI3LzQ1ODkKK2YgMTExNjkvMTUzMjkvNDU0NiAxMTE3MC8xNTMzMS80NTQ2IDExMTMxLzE1MzU1LzQ1NDYKK2YgMTExMzEvMTUzNTUvNDU0NiAxMTEzMC8xNTM1NC80NTQ2IDExMTY5LzE1MzI5LzQ1NDYKK2YgMTExNzAvMTUzMzEvNDU2MiAxMTE3MS8xNTMzMy80NTYyIDExMTMyLzE1MzU2LzQ1NjIKK2YgMTExMzIvMTUzNTYvNDU2MiAxMTEzMS8xNTM1NS80NTYyIDExMTcwLzE1MzMxLzQ1NjIKK2YgMTExNzEvMTUzMzMvNDU2MSAxMTE2MC8xNTMxMC80NTYxIDExMTIxLzE1MzQ2LzQ1NjEKK2YgMTExMjEvMTUzNDYvNDU2MSAxMTEzMi8xNTM1Ni80NTYxIDExMTcxLzE1MzMzLzQ1NjEKK2YgMTIyMjkvMTUzNTcvNjk3IDEyMjI4LzE1MzU4LzY5NyAxMjIzMS8xNTM1OS82OTcKK2YgMTIyMzEvMTUzNTkvNjk3IDEyMjMwLzE1MzYwLzY5NyAxMjIyOS8xNTM1Ny82OTcKK2YgMTIyMjUvMTUzNjEvNjk3IDEyMjI0LzE1MzYyLzY5NyAxMjIyNi8xNTM2My82OTcKK2YgMTIyMjYvMTUzNjMvNjk3IDEyMjI3LzE1MzY0LzY5NyAxMjIyNS8xNTM2MS82OTcKK2YgMTIyMjcvMTUzNjQvNjk3IDEyMjI2LzE1MzYzLzY5NyAxMjIyOC8xNTM1OC82OTcKK2YgMTIyMjgvMTUzNTgvNjk3IDEyMjI5LzE1MzU3LzY5NyAxMjIyNy8xNTM2NC82OTcKK2YgMTIyMjMvMTUzNjUvNjk3IDEyMjIyLzE1MzY2LzY5NyAxMjIzMC8xNTM2MC82OTcKK2YgMTIyMzAvMTUzNjAvNjk3IDEyMjMxLzE1MzU5LzY5NyAxMjIyMy8xNTM2NS82OTcKK2YgMTIyMTcvMTUzNjcvNjk3IDEyMjI5LzE1MzU3LzY5NyAxMjIzMC8xNTM2MC82OTcKK2YgMTIyMzAvMTUzNjAvNjk3IDEyMjE4LzE1MzY4LzY5NyAxMjIxNy8xNTM2Ny82OTcKK2YgMTIyMTkvMTUzNjkvNjk3IDEyMjMxLzE1MzU5LzY5NyAxMjIyOC8xNTM1OC82OTcKK2YgMTIyMjgvMTUzNTgvNjk3IDEyMjIwLzE1MzcwLzY5NyAxMjIxOS8xNTM2OS82OTcKK2YgMTIyMTMvMTUzNzEvNjk3IDEyMjI1LzE1MzYxLzY5NyAxMjIyNy8xNTM2NC82OTcKK2YgMTIyMjcvMTUzNjQvNjk3IDEyMjE2LzE1MzcyLzY5NyAxMjIxMy8xNTM3MS82OTcKK2YgMTIyMjEvMTUzNzMvNjk3IDEyMjI2LzE1MzYzLzY5NyAxMjIyNC8xNTM2Mi82OTcKK2YgMTIyMjQvMTUzNjIvNjk3IDEyMjE1LzE1Mzc0LzY5NyAxMjIyMS8xNTM3My82OTcKK2YgMTIyMTYvMTUzNzIvNjk3IDEyMjI3LzE1MzY0LzY5NyAxMjIyOS8xNTM1Ny82OTcKK2YgMTIyMjkvMTUzNTcvNjk3IDEyMjE3LzE1MzY3LzY5NyAxMjIxNi8xNTM3Mi82OTcKK2YgMTIyMjAvMTUzNzAvNjk3IDEyMjI4LzE1MzU4LzY5NyAxMjIyNi8xNTM2My82OTcKK2YgMTIyMjYvMTUzNjMvNjk3IDEyMjIxLzE1MzczLzY5NyAxMjIyMC8xNTM3MC82OTcKK2YgMTIyMTQvMTUzNzUvNjk3IDEyMjIzLzE1MzY1LzY5NyAxMjIzMS8xNTM1OS82OTcKK2YgMTIyMzEvMTUzNTkvNjk3IDEyMjE5LzE1MzY5LzY5NyAxMjIxNC8xNTM3NS82OTcKK2YgMTIyMTgvMTUzNjgvNjk3IDEyMjMwLzE1MzYwLzY5NyAxMjIyMi8xNTM2Ni82OTcKK2YgMTIyMjIvMTUzNjYvNjk3IDEyMjEyLzE1Mzc2LzY5NyAxMjIxOC8xNTM2OC82OTcKK2YgMTIzMzcvMTUzNzcvNDU5MCAxMjMzOC8xNTM3OC80NTkwIDEyMzM5LzE1Mzc5LzQ1OTAKK2YgMTIzMzkvMTUzNzkvNDU5MCAxMjM0MC8xNTM4MC80NTkwIDEyMzM3LzE1Mzc3LzQ1OTAKK2YgMTIzNDEvMTUzODEvMjIxIDEyMzQyLzE1MzgyLzIyMSAxMjMzOC8xNTM3OC8yMjEKK2YgMTIzMzgvMTUzNzgvMjIxIDEyMzM3LzE1Mzc3LzIyMSAxMjM0MS8xNTM4MS8yMjEKK2YgMTIzNDMvMTUzODMvMjIxIDEyMzQ0LzE1Mzg0LzIyMSAxMjM0Mi8xNTM4Mi8yMjEKK2YgMTIzNDIvMTUzODIvMjIxIDEyMzQxLzE1MzgxLzIyMSAxMjM0My8xNTM4My8yMjEKK2YgMTIzNDUvMTUzODUvNDU5MSAxMjM0Ni8xNTM4Ni80NTkxIDEyMzQ0LzE1Mzg0LzQ1OTEKK2YgMTIzNDQvMTUzODQvNDU5MSAxMjM0My8xNTM4My80NTkxIDEyMzQ1LzE1Mzg1LzQ1OTEKK2YgMTIzNDcvMTUzODcvNDU5MiAxMjM0OC8xNTM4OC80NTkyIDEyMzQ2LzE1Mzg5LzQ1OTIKK2YgMTIzNDYvMTUzODkvNDU5MiAxMjM0NS8xNTM5MC80NTkyIDEyMzQ3LzE1Mzg3LzQ1OTIKK2YgMTIzNDkvMTUzOTEvNDU5MyAxMjM1MC8xNTM5Mi80NTkzIDEyMzQ4LzE1Mzg4LzQ1OTMKK2YgMTIzNDgvMTUzODgvNDU5MyAxMjM0Ny8xNTM4Ny80NTkzIDEyMzQ5LzE1MzkxLzQ1OTMKK2YgMTIzNTEvMTUzOTMvNDU5NCAxMjM1Mi8xNTM5NC80NTk0IDEyMzUwLzE1Mzk1LzQ1OTQKK2YgMTIzNTAvMTUzOTUvNDU5NCAxMjM0OS8xNTM5Ni80NTk0IDEyMzUxLzE1MzkzLzQ1OTQKK2YgMTIzNTMvMTUzOTcvMTE3MiAxMjM1NC8xNTM5OC8xMTcyIDEyMzUyLzE1Mzk0LzExNzIKK2YgMTIzNTIvMTUzOTQvMTE3MiAxMjM1MS8xNTM5My8xMTcyIDEyMzUzLzE1Mzk3LzExNzIKK2YgMTIzNTUvMTUzOTkvMTE3MiAxMjM1Ni8xNTQwMC8xMTcyIDEyMzU0LzE1Mzk4LzExNzIKK2YgMTIzNTQvMTUzOTgvMTE3MiAxMjM1My8xNTM5Ny8xMTcyIDEyMzU1LzE1Mzk5LzExNzIKK2YgMTIzNTcvMTU0MDEvNDU5NSAxMjM1OC8xNTQwMi80NTk1IDEyMzU2LzE1NDAwLzQ1OTUKK2YgMTIzNTYvMTU0MDAvNDU5NSAxMjM1NS8xNTM5OS80NTk1IDEyMzU3LzE1NDAxLzQ1OTUKK2YgMTIzNTkvMTU0MDMvNDU5NiAxMjM2MC8xNTQwNC80NTk2IDEyMzU4LzE1NDA1LzQ1OTYKK2YgMTIzNTgvMTU0MDUvNDU5NiAxMjM1Ny8xNTQwNi80NTk2IDEyMzU5LzE1NDAzLzQ1OTYKK2YgMTIzNDAvMTU0MDcvNDU5NyAxMjMzOS8xNTQwOC80NTk3IDEyMzYwLzE1NDA0LzQ1OTcKK2YgMTIzNjAvMTU0MDQvNDU5NyAxMjM1OS8xNTQwMy80NTk3IDEyMzQwLzE1NDA3LzQ1OTcKK2YgMTIzNjIvMTU0MDkvNjk3IDEyMzYzLzE1NDEwLzY5NyAxMjM2NC8xNTQxMS82OTcKK2YgMTIzNjQvMTU0MTEvNjk3IDEyMzYxLzE1NDEyLzY5NyAxMjM2Mi8xNTQwOS82OTcKK2YgMTIzMzgvMTU0MTMvNjk3IDEyMzY1LzE1NDE0LzY5NyAxMjM2Ni8xNTQxNS82OTcKK2YgMTIzNjYvMTU0MTUvNjk3IDEyMzM5LzE1NDE2LzY5NyAxMjMzOC8xNTQxMy82OTcKK2YgMTIzMzkvMTU0MTYvNjk3IDEyMzY2LzE1NDE1LzY5NyAxMjM2MS8xNTQxMi82OTcKK2YgMTIzNjEvMTU0MTIvNjk3IDEyMzYwLzE1NDE3LzY5NyAxMjMzOS8xNTQxNi82OTcKK2YgMTIzNjAvMTU0MTcvNjk3IDEyMzYxLzE1NDEyLzY5NyAxMjM2NC8xNTQxMS82OTcKK2YgMTIzNjQvMTU0MTEvNjk3IDEyMzU4LzE1NDE4LzY5NyAxMjM2MC8xNTQxNy82OTcKK2YgMTIzNTgvMTU0MTgvNjk3IDEyMzY0LzE1NDExLzY5NyAxMjM2Ny8xNTQxOS82OTcKK2YgMTIzNjcvMTU0MTkvNjk3IDEyMzU2LzE1NDIwLzY5NyAxMjM1OC8xNTQxOC82OTcKK2YgMTIzNTYvMTU0MjAvNjk3IDEyMzY3LzE1NDE5LzY5NyAxMjM2OC8xNTQyMS82OTcKK2YgMTIzNjgvMTU0MjEvNjk3IDEyMzU0LzE1NDIyLzY5NyAxMjM1Ni8xNTQyMC82OTcKK2YgMTIzNTQvMTU0MjIvNjk3IDEyMzY4LzE1NDIxLzY5NyAxMjM2OS8xNTQyMy82OTcKK2YgMTIzNjkvMTU0MjMvNjk3IDEyMzUyLzE1NDI0LzY5NyAxMjM1NC8xNTQyMi82OTcKK2YgMTIzNTIvMTU0MjQvNjk3IDEyMzY5LzE1NDIzLzY5NyAxMjM3MC8xNTQyNS82OTcKK2YgMTIzNzAvMTU0MjUvNjk3IDEyMzUwLzE1NDI2LzY5NyAxMjM1Mi8xNTQyNC82OTcKK2YgMTIzNTAvMTU0MjYvNjk3IDEyMzcwLzE1NDI1LzY5NyAxMjM3MS8xNTQyNy82OTcKK2YgMTIzNzEvMTU0MjcvNjk3IDEyMzQ4LzE1NDI4LzY5NyAxMjM1MC8xNTQyNi82OTcKK2YgMTIzNDgvMTU0MjgvNjk3IDEyMzcxLzE1NDI3LzY5NyAxMjM3Mi8xNTQyOS82OTcKK2YgMTIzNzIvMTU0MjkvNjk3IDEyMzQ2LzE1NDMwLzY5NyAxMjM0OC8xNTQyOC82OTcKK2YgMTIzNDYvMTU0MzAvNjk3IDEyMzcyLzE1NDI5LzY5NyAxMjM3My8xNTQzMS82OTcKK2YgMTIzNzMvMTU0MzEvNjk3IDEyMzQ0LzE1NDMyLzY5NyAxMjM0Ni8xNTQzMC82OTcKK2YgMTIzNDQvMTU0MzIvNjk3IDEyMzczLzE1NDMxLzY5NyAxMjM3NC8xNTQzMy82OTcKK2YgMTIzNzQvMTU0MzMvNjk3IDEyMzQyLzE1NDM0LzY5NyAxMjM0NC8xNTQzMi82OTcKK2YgMTIzNDIvMTU0MzQvNjk3IDEyMzc0LzE1NDMzLzY5NyAxMjM2NS8xNTQxNC82OTcKK2YgMTIzNjUvMTU0MTQvNjk3IDEyMzM4LzE1NDEzLzY5NyAxMjM0Mi8xNTQzNC82OTcKK2YgMTIzNzUvMTU0MzUvNjk3IDEyMzc2LzE1NDM2LzY5NyAxMjM3MC8xNTQyNS82OTcKK2YgMTIzNzAvMTU0MjUvNjk3IDEyMzY5LzE1NDIzLzY5NyAxMjM3NS8xNTQzNS82OTcKK2YgMTIzNzcvMTU0MzcvNjk3IDEyMzc4LzE1NDM4LzY5NyAxMjM2OC8xNTQyMS82OTcKK2YgMTIzNjgvMTU0MjEvNjk3IDEyMzY3LzE1NDE5LzY5NyAxMjM3Ny8xNTQzNy82OTcKK2YgMTIzNzkvMTU0MzkvNjk3IDEyMzgwLzE1NDQwLzY5NyAxMjM3Mi8xNTQyOS82OTcKK2YgMTIzNzIvMTU0MjkvNjk3IDEyMzcxLzE1NDI3LzY5NyAxMjM3OS8xNTQzOS82OTcKK2YgMTIzODEvMTU0NDEvNjk3IDEyMzgyLzE1NDQyLzY5NyAxMjM4My8xNTQ0My82OTcKK2YgMTIzODMvMTU0NDMvNjk3IDEyMzg0LzE1NDQ0LzY5NyAxMjM4MS8xNTQ0MS82OTcKK2YgMTIzNjYvMTU0MTUvNjk3IDEyMzg1LzE1NDQ1LzY5NyAxMjM2Mi8xNTQwOS82OTcKK2YgMTIzNjIvMTU0MDkvNjk3IDEyMzYxLzE1NDEyLzY5NyAxMjM2Ni8xNTQxNS82OTcKK2YgMTIzODAvMTU0NDAvNjk3IDEyMzg2LzE1NDQ2LzY5NyAxMjM3My8xNTQzMS82OTcKK2YgMTIzNzMvMTU0MzEvNjk3IDEyMzcyLzE1NDI5LzY5NyAxMjM4MC8xNTQ0MC82OTcKK2YgMTIzNzYvMTU0MzYvNjk3IDEyMzc5LzE1NDM5LzY5NyAxMjM3MS8xNTQyNy82OTcKK2YgMTIzNzEvMTU0MjcvNjk3IDEyMzcwLzE1NDI1LzY5NyAxMjM3Ni8xNTQzNi82OTcKK2YgMTIzODcvMTU0NDcvNjk3IDEyMzc4LzE1NDM4LzY5NyAxMjM4NC8xNTQ0NC82OTcKK2YgMTIzODQvMTU0NDQvNjk3IDEyMzgzLzE1NDQzLzY5NyAxMjM4Ny8xNTQ0Ny82OTcKK2YgMTIzNjUvMTU0MTQvNjk3IDEyMzg4LzE1NDQ4LzY5NyAxMjM4NS8xNTQ0NS82OTcKK2YgMTIzODUvMTU0NDUvNjk3IDEyMzY2LzE1NDE1LzY5NyAxMjM2NS8xNTQxNC82OTcKK2YgMTIzNjMvMTU0MTAvNjk3IDEyMzc3LzE1NDM3LzY5NyAxMjM2Ny8xNTQxOS82OTcKK2YgMTIzNjcvMTU0MTkvNjk3IDEyMzY0LzE1NDExLzY5NyAxMjM2My8xNTQxMC82OTcKK2YgMTIzODIvMTU0NDIvNjk3IDEyMzc0LzE1NDMzLzY5NyAxMjM3My8xNTQzMS82OTcKK2YgMTIzNzMvMTU0MzEvNjk3IDEyMzg2LzE1NDQ2LzY5NyAxMjM4Mi8xNTQ0Mi82OTcKK2YgMTIzNzUvMTU0MzUvNjk3IDEyMzg5LzE1NDQ5LzY5NyAxMjM5MC8xNTQ1MC82OTcKK2YgMTIzOTAvMTU0NTAvNjk3IDEyMzc2LzE1NDM2LzY5NyAxMjM3NS8xNTQzNS82OTcKK2YgMTIzNzYvMTU0MzYvNjk3IDEyMzkwLzE1NDUwLzY5NyAxMjM5MS8xNTQ1MS82OTcKK2YgMTIzOTEvMTU0NTEvNjk3IDEyMzc5LzE1NDM5LzY5NyAxMjM3Ni8xNTQzNi82OTcKK2YgMTIzNzkvMTU0MzkvNjk3IDEyMzkxLzE1NDUxLzY5NyAxMjM5Mi8xNTQ1Mi82OTcKK2YgMTIzOTIvMTU0NTIvNjk3IDEyMzgwLzE1NDQwLzY5NyAxMjM3OS8xNTQzOS82OTcKK2YgMTIzODAvMTU0NDAvNjk3IDEyMzkyLzE1NDUyLzY5NyAxMjM5My8xNTQ1My82OTcKK2YgMTIzOTMvMTU0NTMvNjk3IDEyMzg2LzE1NDQ2LzY5NyAxMjM4MC8xNTQ0MC82OTcKK2YgMTIzODYvMTU0NDYvNjk3IDEyMzkzLzE1NDUzLzY5NyAxMjM5NC8xNTQ1NC82OTcKK2YgMTIzOTQvMTU0NTQvNjk3IDEyMzgyLzE1NDQyLzY5NyAxMjM4Ni8xNTQ0Ni82OTcKK2YgMTIzODIvMTU0NDIvNjk3IDEyMzk0LzE1NDU0LzY5NyAxMjM5NS8xNTQ1NS82OTcKK2YgMTIzOTUvMTU0NTUvNjk3IDEyMzgzLzE1NDQzLzY5NyAxMjM4Mi8xNTQ0Mi82OTcKK2YgMTIzODMvMTU0NDMvNjk3IDEyMzk1LzE1NDU1LzY5NyAxMjM5Ni8xNTQ1Ni82OTcKK2YgMTIzOTYvMTU0NTYvNjk3IDEyMzg3LzE1NDQ3LzY5NyAxMjM4My8xNTQ0My82OTcKK2YgMTIzODcvMTU0NDcvNjk3IDEyMzk2LzE1NDU2LzY5NyAxMjM4OS8xNTQ0OS82OTcKK2YgMTIzODkvMTU0NDkvNjk3IDEyMzc1LzE1NDM1LzY5NyAxMjM4Ny8xNTQ0Ny82OTcKK2YgMTIzODgvMTU0NDgvNjk3IDEyMzk3LzE1NDU3LzY5NyAxMjM5OC8xNTQ1OC82OTcKK2YgMTIzOTgvMTU0NTgvNjk3IDEyMzg1LzE1NDQ1LzY5NyAxMjM4OC8xNTQ0OC82OTcKK2YgMTIzODUvMTU0NDUvNjk3IDEyMzk4LzE1NDU4LzY5NyAxMjM5OS8xNTQ1OS82OTcKK2YgMTIzOTkvMTU0NTkvNjk3IDEyMzYyLzE1NDA5LzY5NyAxMjM4NS8xNTQ0NS82OTcKK2YgMTIzNjIvMTU0MDkvNjk3IDEyMzk5LzE1NDU5LzY5NyAxMjQwMC8xNTQ2MC82OTcKK2YgMTI0MDAvMTU0NjAvNjk3IDEyMzYzLzE1NDEwLzY5NyAxMjM2Mi8xNTQwOS82OTcKK2YgMTIzNjMvMTU0MTAvNjk3IDEyNDAwLzE1NDYwLzY5NyAxMjQwMS8xNTQ2MS82OTcKK2YgMTI0MDEvMTU0NjEvNjk3IDEyMzc3LzE1NDM3LzY5NyAxMjM2My8xNTQxMC82OTcKK2YgMTIzNzcvMTU0MzcvNjk3IDEyNDAxLzE1NDYxLzY5NyAxMjQwMi8xNTQ2Mi82OTcKK2YgMTI0MDIvMTU0NjIvNjk3IDEyMzc4LzE1NDM4LzY5NyAxMjM3Ny8xNTQzNy82OTcKK2YgMTIzNzgvMTU0MzgvNjk3IDEyNDAyLzE1NDYyLzY5NyAxMjQwMy8xNTQ2My82OTcKK2YgMTI0MDMvMTU0NjMvNjk3IDEyMzg0LzE1NDQ0LzY5NyAxMjM3OC8xNTQzOC82OTcKK2YgMTIzODQvMTU0NDQvNjk3IDEyNDAzLzE1NDYzLzY5NyAxMjQwNC8xNTQ2NC82OTcKK2YgMTI0MDQvMTU0NjQvNjk3IDEyMzgxLzE1NDQxLzY5NyAxMjM4NC8xNTQ0NC82OTcKK2YgMTIzODEvMTU0NDEvNjk3IDEyNDA0LzE1NDY0LzY5NyAxMjM5Ny8xNTQ1Ny82OTcKK2YgMTIzOTcvMTU0NTcvNjk3IDEyMzg4LzE1NDQ4LzY5NyAxMjM4MS8xNTQ0MS82OTcKK2YgMTIzODkvMTU0NjUvNDU5OCAxMjQwNS8xNTQ2Ni80NTk4IDEyNDA2LzE1NDY3LzQ1OTgKK2YgMTI0MDYvMTU0NjcvNDU5OCAxMjM5MC8xNTQ2OC80NTk4IDEyMzg5LzE1NDY1LzQ1OTgKK2YgMTIzOTAvMTU0NjkvNDU5OSAxMjQwNi8xNTQ3MC80NTk5IDEyNDA3LzE1NDcxLzQ1OTkKK2YgMTI0MDcvMTU0NzEvNDU5OSAxMjM5MS8xNTQ3Mi80NTk5IDEyMzkwLzE1NDY5LzQ1OTkKK2YgMTIzOTEvMTU0NzIvNDYwMCAxMjQwNy8xNTQ3MS80NjAwIDEyNDA4LzE1NDczLzQ2MDAKK2YgMTI0MDgvMTU0NzMvNDYwMCAxMjM5Mi8xNTQ3NC80NjAwIDEyMzkxLzE1NDcyLzQ2MDAKK2YgMTIzOTIvMTU0NzUvNDYwMSAxMjQwOC8xNTQ3Ni80NjAxIDEyNDA5LzE1NDc3LzQ2MDEKK2YgMTI0MDkvMTU0NzcvNDYwMSAxMjM5My8xNTQ3OC80NjAxIDEyMzkyLzE1NDc1LzQ2MDEKK2YgMTIzOTMvMTU0NzgvNDYwMiAxMjQwOS8xNTQ3Ny80NjAyIDEyNDEwLzE1NDc5LzQ2MDIKK2YgMTI0MTAvMTU0NzkvNDYwMiAxMjM5NC8xNTQ4MC80NjAyIDEyMzkzLzE1NDc4LzQ2MDIKK2YgMTIzOTQvMTU0ODEvNDYwMyAxMjQxMC8xNTQ4Mi80NjAzIDEyNDExLzE1NDgzLzQ2MDMKK2YgMTI0MTEvMTU0ODMvNDYwMyAxMjM5NS8xNTQ4NC80NjAzIDEyMzk0LzE1NDgxLzQ2MDMKK2YgMTIzOTUvMTU0ODQvNDYwNCAxMjQxMS8xNTQ4My80NjA0IDEyNDEyLzE1NDg1LzQ2MDQKK2YgMTI0MTIvMTU0ODUvNDYwNCAxMjM5Ni8xNTQ4Ni80NjA0IDEyMzk1LzE1NDg0LzQ2MDQKK2YgMTIzOTYvMTU0ODcvNDYwNSAxMjQxMi8xNTQ4OC80NjA1IDEyNDA1LzE1NDY2LzQ2MDUKK2YgMTI0MDUvMTU0NjYvNDYwNiAxMjM4OS8xNTQ2NS80NjA2IDEyMzk2LzE1NDg3LzQ2MDYKK2YgMTIzOTcvMTU0ODkvNDYwMiAxMjQxMy8xNTQ5MC80NjAyIDEyNDE0LzE1NDkxLzQ2MDIKK2YgMTI0MTQvMTU0OTEvNDYwMiAxMjM5OC8xNTQ5Mi80NjAyIDEyMzk3LzE1NDg5LzQ2MDIKK2YgMTIzOTgvMTU0OTMvNDYwMyAxMjQxNC8xNTQ5NC80NjAzIDEyNDE1LzE1NDk1LzQ2MDMKK2YgMTI0MTUvMTU0OTUvNDYwMyAxMjM5OS8xNTQ5Ni80NjAzIDEyMzk4LzE1NDkzLzQ2MDMKK2YgMTIzOTkvMTU0OTYvNDYwNCAxMjQxNS8xNTQ5NS80NjA0IDEyNDE2LzE1NDk3LzQ2MDQKK2YgMTI0MTYvMTU0OTcvNDYwNCAxMjQwMC8xNTQ5OC80NjA0IDEyMzk5LzE1NDk2LzQ2MDQKK2YgMTI0MDAvMTU0OTkvNDYwNyAxMjQxNi8xNTUwMC80NjA3IDEyNDE3LzE1NTAxLzQ2MDcKK2YgMTI0MTcvMTU1MDEvNDYwNiAxMjQwMS8xNTUwMi80NjA2IDEyNDAwLzE1NDk5LzQ2MDYKK2YgMTI0MDEvMTU1MDIvNDYwOCAxMjQxNy8xNTUwMS80NjA4IDEyNDE4LzE1NTAzLzQ2MDgKK2YgMTI0MTgvMTU1MDMvNDYwOCAxMjQwMi8xNTUwNC80NjA4IDEyNDAxLzE1NTAyLzQ2MDgKK2YgMTI0MDIvMTU1MDUvNDYwOSAxMjQxOC8xNTUwNi80NjA5IDEyNDE5LzE1NTA3LzQ2MDkKK2YgMTI0MTkvMTU1MDcvNDU5OSAxMjQwMy8xNTUwOC80NTk5IDEyNDAyLzE1NTA1LzQ1OTkKK2YgMTI0MDMvMTU1MDgvNDYxMCAxMjQxOS8xNTUwNy80NjEwIDEyNDIwLzE1NTA5LzQ2MTAKK2YgMTI0MjAvMTU1MDkvNDYwMCAxMjQwNC8xNTUxMC80NjAwIDEyNDAzLzE1NTA4LzQ2MDAKK2YgMTI0MDQvMTU1MTEvNDYxMSAxMjQyMC8xNTUxMi80NjExIDEyNDEzLzE1NDkwLzQ2MTEKK2YgMTI0MTMvMTU0OTAvNDYwMSAxMjM5Ny8xNTQ4OS80NjAxIDEyNDA0LzE1NTExLzQ2MDEKK2YgMTIzODgvMTU0NDgvNjk3IDEyMzY1LzE1NDE0LzY5NyAxMjM3NC8xNTQzMy82OTcKK2YgMTIzNzQvMTU0MzMvNjk3IDEyMzgxLzE1NDQxLzY5NyAxMjM4OC8xNTQ0OC82OTcKK2YgMTIzNzUvMTU0MzUvNjk3IDEyMzY5LzE1NDIzLzY5NyAxMjM2OC8xNTQyMS82OTcKK2YgMTIzNjgvMTU0MjEvNjk3IDEyMzg3LzE1NDQ3LzY5NyAxMjM3NS8xNTQzNS82OTcKK2YgMTIzODEvMTU0NDEvNjk3IDEyMzc0LzE1NDMzLzY5NyAxMjM4Mi8xNTQ0Mi82OTcKK2YgMTIzODcvMTU0NDcvNjk3IDEyMzY4LzE1NDIxLzY5NyAxMjM3OC8xNTQzOC82OTcKK2YgMTIyMzMvMTU1MTMvNjk3IDEyMjQxLzE1NTE0LzY5NyAxMjI0MC8xNTUxNS82OTcKK2YgMTIyNDAvMTU1MTUvNjk3IDEyMjMyLzE1NTE2LzY5NyAxMjIzMy8xNTUxMy82OTcKK2YgMTIyMzQvMTU1MTcvNjk3IDEyMjQyLzE1NTE4LzY5NyAxMjI0MS8xNTUxNC82OTcKK2YgMTIyNDEvMTU1MTQvNjk3IDEyMjMzLzE1NTEzLzY5NyAxMjIzNC8xNTUxNy82OTcKK2YgMTIyMzUvMTU1MTkvNjk3IDEyMjQzLzE1NTIwLzY5NyAxMjI0Mi8xNTUxOC82OTcKK2YgMTIyNDIvMTU1MTgvNjk3IDEyMjM0LzE1NTE3LzY5NyAxMjIzNS8xNTUxOS82OTcKK2YgMTIyMzYvMTU1MjEvNjk3IDEyMjQ0LzE1NTIyLzY5NyAxMjI0My8xNTUyMC82OTcKK2YgMTIyNDMvMTU1MjAvNjk3IDEyMjM1LzE1NTE5LzY5NyAxMjIzNi8xNTUyMS82OTcKK2YgMTIyMzcvMTU1MjMvNjk3IDEyMjQ1LzE1NTI0LzY5NyAxMjI0NC8xNTUyMi82OTcKK2YgMTIyNDQvMTU1MjIvNjk3IDEyMjM2LzE1NTIxLzY5NyAxMjIzNy8xNTUyMy82OTcKK2YgMTIyMzgvMTU1MjUvNjk3IDEyMjQ2LzE1NTI2LzY5NyAxMjI0NS8xNTUyNC82OTcKK2YgMTIyNDUvMTU1MjQvNjk3IDEyMjM3LzE1NTIzLzY5NyAxMjIzOC8xNTUyNS82OTcKK2YgMTIyMzkvMTU1MjcvNjk3IDEyMjQ3LzE1NTI4LzY5NyAxMjI0Ni8xNTUyNi82OTcKK2YgMTIyNDYvMTU1MjYvNjk3IDEyMjM4LzE1NTI1LzY5NyAxMjIzOS8xNTUyNy82OTcKK2YgMTIyMzIvMTU1MTYvNjk3IDEyMjQwLzE1NTE1LzY5NyAxMjI0Ny8xNTUyOC82OTcKK2YgMTIyMzIvMTU1MTYvNjk3IDEyMjQ3LzE1NTI4LzY5NyAxMjIzOS8xNTUyNy82OTcKK2YgMTIyNDAvMTU1MjkvNDYxMiAxMjI0MS8xNTUzMC80NjEyIDEyMzMwLzE1NTMxLzQ2MTIKK2YgMTIzMzAvMTU1MzEvNDYxMiAxMjMyOS8xNTUzMi80NjEyIDEyMjQwLzE1NTI5LzQ2MTIKK2YgMTIyNDEvMTU1MzAvNDYxMyAxMjI0Mi8xNTUzMy80NjEzIDEyMzMxLzE1NTM0LzQ2MTMKK2YgMTIzMzEvMTU1MzQvNDYxMyAxMjMzMC8xNTUzMS80NjEzIDEyMjQxLzE1NTMwLzQ2MTMKK2YgMTIyNDIvMTU1MzUvNDYxNCAxMjI0My8xNTUzNi80NjE0IDEyMzMyLzE1NTM3LzQ2MTQKK2YgMTIzMzIvMTU1MzcvNDYxNCAxMjMzMS8xNTUzOC80NjE0IDEyMjQyLzE1NTM1LzQ2MTQKK2YgMTIyNDMvMTU1MzYvNDYxNSAxMjI0NC8xNTUzOS80NjE1IDEyMzMzLzE1NTQwLzQ2MTUKK2YgMTIzMzMvMTU1NDAvNDYxNSAxMjMzMi8xNTUzNy80NjE1IDEyMjQzLzE1NTM2LzQ2MTUKK2YgMTIyNDQvMTU1NDEvNDYxNiAxMjI0NS8xNTU0Mi80NjE2IDEyMzM0LzE1NTQzLzQ2MTYKK2YgMTIzMzQvMTU1NDMvNDYxNiAxMjMzMy8xNTU0NC80NjE2IDEyMjQ0LzE1NTQxLzQ2MTYKK2YgMTIyNDUvMTU1NDIvNDYxNyAxMjI0Ni8xNTU0NS80NjE3IDEyMzM1LzE1NTQ2LzQ2MTcKK2YgMTIzMzUvMTU1NDYvNDYxNyAxMjMzNC8xNTU0My80NjE3IDEyMjQ1LzE1NTQyLzQ2MTcKK2YgMTIyNDYvMTU1NDcvNDYxOCAxMjI0Ny8xNTU0OC80NjE4IDEyMzM2LzE1NTQ5LzQ2MTgKK2YgMTIzMzYvMTU1NDkvNDYxOCAxMjMzNS8xNTU1MC80NjE4IDEyMjQ2LzE1NTQ3LzQ2MTgKK2YgMTIyNDcvMTU1NDgvNDYxOSAxMjI0MC8xNTU1MS80NjE5IDEyMzI5LzE1NTUyLzQ2MTkKK2YgMTIzMjkvMTU1NTIvNDYxOSAxMjMzNi8xNTU0OS80NjE5IDEyMjQ3LzE1NTQ4LzQ2MTkKK2YgMTIyNDgvMTU1NTMvNjk3IDEyMjQ5LzE1NTU0LzY5NyAxMjI1Ny8xNTU1NS82OTcKK2YgMTIyNTcvMTU1NTUvNjk3IDEyMjU2LzE1NTU2LzY5NyAxMjI0OC8xNTU1My82OTcKK2YgMTIyNDkvMTU1NTQvNjk3IDEyMjUwLzE1NTU3LzY5NyAxMjI1OC8xNTU1OC82OTcKK2YgMTIyNTgvMTU1NTgvNjk3IDEyMjU3LzE1NTU1LzY5NyAxMjI0OS8xNTU1NC82OTcKK2YgMTIyNTAvMTU1NTcvNjk3IDEyMjUxLzE1NTU5LzY5NyAxMjI1OS8xNTU2MC82OTcKK2YgMTIyNTkvMTU1NjAvNjk3IDEyMjU4LzE1NTU4LzY5NyAxMjI1MC8xNTU1Ny82OTcKK2YgMTIyNTEvMTU1NTkvNjk3IDEyMjUyLzE1NTYxLzY5NyAxMjI2MC8xNTU2Mi82OTcKK2YgMTIyNjAvMTU1NjIvNjk3IDEyMjU5LzE1NTYwLzY5NyAxMjI1MS8xNTU1OS82OTcKK2YgMTIyNTIvMTU1NjEvNjk3IDEyMjUzLzE1NTYzLzY5NyAxMjI2MS8xNTU2NC82OTcKK2YgMTIyNjEvMTU1NjQvNjk3IDEyMjYwLzE1NTYyLzY5NyAxMjI1Mi8xNTU2MS82OTcKK2YgMTIyNTMvMTU1NjMvNjk3IDEyMjU0LzE1NTY1LzY5NyAxMjI2Mi8xNTU2Ni82OTcKK2YgMTIyNjIvMTU1NjYvNjk3IDEyMjYxLzE1NTY0LzY5NyAxMjI1My8xNTU2My82OTcKK2YgMTIyNTQvMTU1NjUvNjk3IDEyMjU1LzE1NTY3LzY5NyAxMjI2My8xNTU2OC82OTcKK2YgMTIyNjMvMTU1NjgvNjk3IDEyMjYyLzE1NTY2LzY5NyAxMjI1NC8xNTU2NS82OTcKK2YgMTIyNTUvMTU1NjcvNjk3IDEyMjQ4LzE1NTUzLzY5NyAxMjI1Ni8xNTU1Ni82OTcKK2YgMTIyNTYvMTU1NTYvNjk3IDEyMjYzLzE1NTY4LzY5NyAxMjI1NS8xNTU2Ny82OTcKK2YgMTIzMDUvMTU1NjkvNDYxMiAxMjMwNi8xNTU3MC80NjEyIDEyMjk4LzE1NTcxLzQ2MTIKK2YgMTIyOTgvMTU1NzEvNDYxMiAxMjI5Ny8xNTU3Mi80NjEyIDEyMzA1LzE1NTY5LzQ2MTIKK2YgMTIzMDYvMTU1NzAvNDYxMyAxMjMwNy8xNTU3My80NjEzIDEyMjk5LzE1NTc0LzQ2MTMKK2YgMTIyOTkvMTU1NzQvNDYxMyAxMjI5OC8xNTU3MS80NjEzIDEyMzA2LzE1NTcwLzQ2MTMKK2YgMTIzMDcvMTU1NzUvNDYxNCAxMjMwOC8xNTU3Ni80NjE0IDEyMzAwLzE1NTc3LzQ2MTQKK2YgMTIzMDAvMTU1NzcvNDYxNCAxMjI5OS8xNTU3OC80NjE0IDEyMzA3LzE1NTc1LzQ2MTQKK2YgMTIzMDgvMTU1NzYvNDYxNSAxMjMwOS8xNTU3OS80NjE1IDEyMzAxLzE1NTgwLzQ2MTUKK2YgMTIzMDEvMTU1ODAvNDYxNSAxMjMwMC8xNTU3Ny80NjE1IDEyMzA4LzE1NTc2LzQ2MTUKK2YgMTIzMDkvMTU1ODEvNDYxNiAxMjMxMC8xNTU4Mi80NjE2IDEyMzAyLzE1NTgzLzQ2MTYKK2YgMTIzMDIvMTU1ODMvNDYxNiAxMjMwMS8xNTU4NC80NjE2IDEyMzA5LzE1NTgxLzQ2MTYKK2YgMTIzMTAvMTU1ODIvNDYxNyAxMjMxMS8xNTU4NS80NjE3IDEyMzAzLzE1NTg2LzQ2MTcKK2YgMTIzMDMvMTU1ODYvNDYxNyAxMjMwMi8xNTU4My80NjE3IDEyMzEwLzE1NTgyLzQ2MTcKK2YgMTIzMTEvMTU1ODcvNDYxOCAxMjMxMi8xNTU4OC80NjE4IDEyMzA0LzE1NTg5LzQ2MTgKK2YgMTIzMDQvMTU1ODkvNDYxOCAxMjMwMy8xNTU5MC80NjE4IDEyMzExLzE1NTg3LzQ2MTgKK2YgMTIzMTIvMTU1ODgvNDYxOSAxMjMwNS8xNTU5MS80NjE5IDEyMjk3LzE1NTkyLzQ2MTkKK2YgMTIyOTcvMTU1OTIvNDYxOSAxMjMwNC8xNTU4OS80NjE5IDEyMzEyLzE1NTg4LzQ2MTkKK2YgMTIzMTMvMTU1OTMvNDYyMCAxMjMxNC8xNTU1Ni80NjIwIDEyMzE2LzE1NTk0LzQ2MjAKK2YgMTIzMTYvMTU1OTQvNDYyMCAxMjMxNS8xNTU5NS80NjIwIDEyMzEzLzE1NTkzLzQ2MjAKK2YgMTIzMTUvMTU1OTUvNDYyMSAxMjMxNi8xNTU5NC80NjIxIDEyMzE4LzE1NTk2LzQ2MjEKK2YgMTIzMTgvMTU1OTYvNDYyMiAxMjMxNy8xNTU5Ny80NjIyIDEyMzE1LzE1NTk1LzQ2MjIKK2YgMTIzMTcvMTU1OTcvNDYyMyAxMjMxOC8xNTU5Ni80NjIzIDEyMzIwLzE1NTYwLzQ2MjMKK2YgMTIzMjAvMTU1NjAvNDYyMyAxMjMxOS8xNTU5OC80NjIzIDEyMzE3LzE1NTk3LzQ2MjMKK2YgMTIzMTkvMTU1OTgvNDYyNCAxMjMyMC8xNTU2MC80NjI0IDEyMzIyLzE1NTYyLzQ2MjQKK2YgMTIzMjIvMTU1NjIvNDYyNCAxMjMyMS8xNTU5OS80NjI0IDEyMzE5LzE1NTk4LzQ2MjQKK2YgMTIzMjEvMTU1OTkvNDYyNSAxMjMyMi8xNTU2Mi80NjI1IDEyMzI0LzE1NTY0LzQ2MjUKK2YgMTIzMjQvMTU1NjQvNDYyNiAxMjMyMy8xNTYwMC80NjI2IDEyMzIxLzE1NTk5LzQ2MjYKK2YgMTIzMjMvMTU2MDAvNDYyNyAxMjMyNC8xNTU2NC80NjI3IDEyMzI2LzE1NTY2LzQ2MjcKK2YgMTIzMjYvMTU1NjYvNDYyNyAxMjMyNS8xNTYwMS80NjI3IDEyMzIzLzE1NjAwLzQ2MjcKK2YgMTIzMjUvMTU2MDEvNDYyOCAxMjMyNi8xNTU2Ni80NjI4IDEyMzI4LzE1NTY4LzQ2MjgKK2YgMTIzMjgvMTU1NjgvNDYyOSAxMjMyNy8xNTYwMi80NjI5IDEyMzI1LzE1NjAxLzQ2MjkKK2YgMTIzMjcvMTU2MDIvNDYzMCAxMjMyOC8xNTU2OC80NjMwIDEyMzE0LzE1NTU2LzQ2MzAKK2YgMTIzMTQvMTU1NTYvNDYzMCAxMjMxMy8xNTU5My80NjMwIDEyMzI3LzE1NjAyLzQ2MzAKK2YgMTIzMDUvMTU1OTMvNDYzMSAxMjMxMy8xNTU5My80NjMxIDEyMzE1LzE1NTk1LzQ2MzEKK2YgMTIzMTUvMTU1OTUvNDYzMiAxMjMwNi8xNTYwMy80NjMyIDEyMzA1LzE1NTkzLzQ2MzIKK2YgMTIyNTcvMTU1NTUvNDYzMyAxMjMxNi8xNTU5NC80NjMzIDEyMzE0LzE1NTU2LzQ2MzMKK2YgMTIzMTQvMTU1NTYvNDYzNCAxMjI1Ni8xNTU1Ni80NjM0IDEyMjU3LzE1NTU1LzQ2MzQKK2YgMTIzMDYvMTU2MDMvNDYzNSAxMjMxNS8xNTU5NS80NjM1IDEyMzE3LzE1NTk3LzQ2MzUKK2YgMTIzMTcvMTU1OTcvNDYzNiAxMjMwNy8xNTYwNC80NjM2IDEyMzA2LzE1NjAzLzQ2MzYKK2YgMTIyNTgvMTU1NTgvNDYzNyAxMjMxOC8xNTU5Ni80NjM3IDEyMzE2LzE1NTk0LzQ2MzcKK2YgMTIzMTYvMTU1OTQvNDYzNSAxMjI1Ny8xNTU1NS80NjM1IDEyMjU4LzE1NTU4LzQ2MzUKK2YgMTIzMDcvMTU2MDQvNDYzOCAxMjMxNy8xNTU5Ny80NjM4IDEyMzE5LzE1NTk4LzQ2MzgKK2YgMTIzMTkvMTU1OTgvNDYzOSAxMjMwOC8xNTU5OC80NjM5IDEyMzA3LzE1NjA0LzQ2MzkKK2YgMTIyNTkvMTU1NjAvNDY0MCAxMjMyMC8xNTU2MC80NjQwIDEyMzE4LzE1NTk2LzQ2NDAKK2YgMTIzMTgvMTU1OTYvNDYzOCAxMjI1OC8xNTU1OC80NjM4IDEyMjU5LzE1NTYwLzQ2MzgKK2YgMTIzMDgvMTU1OTgvNDY0MSAxMjMxOS8xNTU5OC80NjQxIDEyMzIxLzE1NTk5LzQ2NDEKK2YgMTIzMjEvMTU1OTkvNDYyNCAxMjMwOS8xNTU5OS80NjI0IDEyMzA4LzE1NTk4LzQ2MjQKK2YgMTIyNjAvMTU1NjIvNDY0MiAxMjMyMi8xNTU2Mi80NjQyIDEyMzIwLzE1NTYwLzQ2NDIKK2YgMTIzMjAvMTU1NjAvNDY0MyAxMjI1OS8xNTU2MC80NjQzIDEyMjYwLzE1NTYyLzQ2NDMKK2YgMTIzMDkvMTU1OTkvNDY0NCAxMjMyMS8xNTU5OS80NjQ0IDEyMzIzLzE1NjAwLzQ2NDQKK2YgMTIzMjMvMTU2MDAvNDY0NSAxMjMxMC8xNTYwMC80NjQ1IDEyMzA5LzE1NTk5LzQ2NDUKK2YgMTIyNjEvMTU1NjQvNDY0NiAxMjMyNC8xNTU2NC80NjQ2IDEyMzIyLzE1NTYyLzQ2NDYKK2YgMTIzMjIvMTU1NjIvNDY0NCAxMjI2MC8xNTU2Mi80NjQ0IDEyMjYxLzE1NTY0LzQ2NDQKK2YgMTIzMTAvMTU2MDAvNDY0NyAxMjMyMy8xNTYwMC80NjQ3IDEyMzI1LzE1NjAxLzQ2NDcKK2YgMTIzMjUvMTU2MDEvNDY0OCAxMjMxMS8xNTYwNS80NjQ4IDEyMzEwLzE1NjAwLzQ2NDgKK2YgMTIyNjIvMTU1NjYvNDY0OSAxMjMyNi8xNTU2Ni80NjQ5IDEyMzI0LzE1NTY0LzQ2NDkKK2YgMTIzMjQvMTU1NjQvNDY0NyAxMjI2MS8xNTU2NC80NjQ3IDEyMjYyLzE1NTY2LzQ2NDcKK2YgMTIzMTEvMTU2MDUvNDY1MCAxMjMyNS8xNTYwMS80NjUwIDEyMzI3LzE1NjAyLzQ2NTAKK2YgMTIzMjcvMTU2MDIvNDY1MCAxMjMxMi8xNTYwMi80NjUwIDEyMzExLzE1NjA1LzQ2NTAKK2YgMTIyNjMvMTU1NjgvNDY1MSAxMjMyOC8xNTU2OC80NjUxIDEyMzI2LzE1NTY2LzQ2NTEKK2YgMTIzMjYvMTU1NjYvNDY1MiAxMjI2Mi8xNTU2Ni80NjUyIDEyMjYzLzE1NTY4LzQ2NTIKK2YgMTIzMTIvMTU2MDIvNDYzMCAxMjMyNy8xNTYwMi80NjMwIDEyMzEzLzE1NTkzLzQ2MzAKK2YgMTIzMTMvMTU1OTMvNDYzMCAxMjMwNS8xNTU5My80NjMwIDEyMzEyLzE1NjAyLzQ2MzAKK2YgMTIyNTYvMTU1NTYvNDY1MyAxMjMxNC8xNTU1Ni80NjUzIDEyMzI4LzE1NTY4LzQ2NTMKK2YgMTIzMjgvMTU1NjgvNDY1NCAxMjI2My8xNTU2OC80NjU0IDEyMjU2LzE1NTU2LzQ2NTQKK2YgMTIyMzMvMTU2MDYvNDYxMiAxMjIzMi8xNTYwNy80NjEyIDEyNDcxLzE1NjA4LzQ2MTIKK2YgMTI0NzEvMTU2MDgvNDYxMiAxMjQ3Mi8xNTYwOS80NjEyIDEyMjMzLzE1NjA2LzQ2MTIKK2YgMTIyMzQvMTU2MTAvNDYxMyAxMjIzMy8xNTYwNi80NjEzIDEyNDcyLzE1NjA5LzQ2MTMKK2YgMTI0NzIvMTU2MDkvNDYxMyAxMjQ3My8xNTYxMS80NjEzIDEyMjM0LzE1NjEwLzQ2MTMKK2YgMTIyMzUvMTU2MTIvNDYxNCAxMjIzNC8xNTYxMy80NjE0IDEyNDczLzE1NjE0LzQ2MTQKK2YgMTI0NzMvMTU2MTQvNDYxNCAxMjQ3NC8xNTYxNS80NjE0IDEyMjM1LzE1NjEyLzQ2MTQKK2YgMTIyMzYvMTU2MTYvNDYxNSAxMjIzNS8xNTYxMi80NjE1IDEyNDc0LzE1NjE1LzQ2MTUKK2YgMTI0NzQvMTU2MTUvNDYxNSAxMjQ3NS8xNTYxNy80NjE1IDEyMjM2LzE1NjE2LzQ2MTUKK2YgMTIyMzcvMTU2MTgvNDYxNiAxMjIzNi8xNTYxOS80NjE2IDEyNDc1LzE1NjIwLzQ2MTYKK2YgMTI0NzUvMTU2MjAvNDYxNiAxMjQ3Ni8xNTYyMS80NjE2IDEyMjM3LzE1NjE4LzQ2MTYKK2YgMTIyMzgvMTU2MjIvNDYxNyAxMjIzNy8xNTYxOC80NjE3IDEyNDc2LzE1NjIxLzQ2MTcKK2YgMTI0NzYvMTU2MjEvNDYxNyAxMjQ3Ny8xNTYyMy80NjE3IDEyMjM4LzE1NjIyLzQ2MTcKK2YgMTIyMzkvMTU2MjQvNDYxOCAxMjIzOC8xNTYyNS80NjE4IDEyNDc3LzE1NjI2LzQ2MTgKK2YgMTI0NzcvMTU2MjYvNDYxOCAxMjQ3OC8xNTYyNy80NjE4IDEyMjM5LzE1NjI0LzQ2MTgKK2YgMTIyMzIvMTU2MjgvNDYxOSAxMjIzOS8xNTYyNC80NjE5IDEyNDc4LzE1NjI3LzQ2MTkKK2YgMTIyMzIvMTU2MjgvNDYxOSAxMjQ3OC8xNTYyNy80NjE5IDEyNDcxLzE1NjI5LzQ2MTkKK2YgMTIyNjQvMTU2MzAvNDY1NSAxMjI2NS8xNTYzMS80NjU1IDEyMjczLzE1NjMyLzQ2NTUKK2YgMTIyNzMvMTU2MzIvNDY1NiAxMjI3Mi8xNTYzMy80NjU2IDEyMjY0LzE1NjMwLzQ2NTYKK2YgMTIyNjUvMTU2MzEvNDY1NyAxMjI2Ni8xNTYzNC80NjU3IDEyMjc0LzE1NjM1LzQ2NTcKK2YgMTIyNzQvMTU2MzUvNDY1NyAxMjI3My8xNTYzMi80NjU3IDEyMjY1LzE1NjMxLzQ2NTcKK2YgMTIyNjYvMTU2MzQvNDY1OCAxMjI2Ny8xNTYzNi80NjU4IDEyMjc1LzE1NjM3LzQ2NTgKK2YgMTIyNzUvMTU2MzcvNDY1OSAxMjI3NC8xNTYzNS80NjU5IDEyMjY2LzE1NjM0LzQ2NTkKK2YgMTIyNjcvMTU2MzYvNDY2MCAxMjI2OC8xNTYzOC80NjYwIDEyMjc2LzE1NjM5LzQ2NjAKK2YgMTIyNzYvMTU2MzkvNDY2MCAxMjI3NS8xNTYzNy80NjYwIDEyMjY3LzE1NjM2LzQ2NjAKK2YgMTIyNjgvMTU2MzgvNDY2MSAxMjI2OS8xNTY0MC80NjYxIDEyMjc3LzE1NjQxLzQ2NjEKK2YgMTIyNzcvMTU2NDEvNDY2MSAxMjI3Ni8xNTYzOS80NjYxIDEyMjY4LzE1NjM4LzQ2NjEKK2YgMTIyNjkvMTU2NDAvNDY2MiAxMjI3MC8xNTY0Mi80NjYyIDEyMjc4LzE1NjQzLzQ2NjIKK2YgMTIyNzgvMTU2NDMvNDY2MiAxMjI3Ny8xNTY0MS80NjYyIDEyMjY5LzE1NjQwLzQ2NjIKK2YgMTIyNzAvMTU2NDIvNDY2MyAxMjI3MS8xNTY0NC80NjYzIDEyMjc5LzE1NjQ1LzQ2NjMKK2YgMTIyNzkvMTU2NDUvNDY2MyAxMjI3OC8xNTY0My80NjYzIDEyMjcwLzE1NjQyLzQ2NjMKK2YgMTIyNzEvMTU2NDQvNDY2NCAxMjI2NC8xNTYzMC80NjY0IDEyMjcyLzE1NjMzLzQ2NjQKK2YgMTIyNzIvMTU2MzMvNDY2NCAxMjI3OS8xNTY0NS80NjY0IDEyMjcxLzE1NjQ0LzQ2NjQKK2YgMTIyNzIvMTU2MzMvNDY2NSAxMjI3My8xNTYzMi80NjY1IDEyMjgxLzE1NjQ2LzQ2NjUKK2YgMTIyODEvMTU2NDYvNDY2NSAxMjI4MC8xNTY0Ny80NjY1IDEyMjcyLzE1NjMzLzQ2NjUKK2YgMTIyNzMvMTU2MzIvNDY2NiAxMjI3NC8xNTYzNS80NjY2IDEyMjgyLzE1NjQ4LzQ2NjYKK2YgMTIyODIvMTU2NDgvNDY2NiAxMjI4MS8xNTY0Ni80NjY2IDEyMjczLzE1NjMyLzQ2NjYKK2YgMTIyNzQvMTU2MzUvNDY2NyAxMjI3NS8xNTYzNy80NjY3IDEyMjgzLzE1NjQ5LzQ2NjcKK2YgMTIyODMvMTU2NDkvNDY2NyAxMjI4Mi8xNTY0OC80NjY3IDEyMjc0LzE1NjM1LzQ2NjcKK2YgMTIyNzUvMTU2MzcvNDY2OCAxMjI3Ni8xNTYzOS80NjY4IDEyMjg0LzE1NjUwLzQ2NjgKK2YgMTIyODQvMTU2NTAvNDY2OCAxMjI4My8xNTY0OS80NjY4IDEyMjc1LzE1NjM3LzQ2NjgKK2YgMTIyNzYvMTU2MzkvNDY2OSAxMjI3Ny8xNTY0MS80NjY5IDEyMjg1LzE1NjUxLzQ2NjkKK2YgMTIyODUvMTU2NTEvNDY2OSAxMjI4NC8xNTY1MC80NjY5IDEyMjc2LzE1NjM5LzQ2NjkKK2YgMTIyNzcvMTU2NDEvNDY3MCAxMjI3OC8xNTY0My80NjcwIDEyMjg2LzE1NjUyLzQ2NzAKK2YgMTIyODYvMTU2NTIvNDY3MCAxMjI4NS8xNTY1MS80NjcwIDEyMjc3LzE1NjQxLzQ2NzAKK2YgMTIyNzgvMTU2NDMvNDY3MSAxMjI3OS8xNTY0NS80NjcxIDEyMjg3LzE1NjUzLzQ2NzEKK2YgMTIyODcvMTU2NTMvNDY3MSAxMjI4Ni8xNTY1Mi80NjcxIDEyMjc4LzE1NjQzLzQ2NzEKK2YgMTIyNzkvMTU2NDUvNDY3MiAxMjI3Mi8xNTYzMy80NjcyIDEyMjgwLzE1NjQ3LzQ2NzIKK2YgMTIyODAvMTU2NDcvNDY3MiAxMjI4Ny8xNTY1My80NjcyIDEyMjc5LzE1NjQ1LzQ2NzIKK2YgMTIyODAvMTU2NDcvNDY3MyAxMjI4MS8xNTY0Ni80NjczIDEyMjg5LzE1NjU0LzQ2NzMKK2YgMTIyODkvMTU2NTQvNDY3MyAxMjI4OC8xNTY1NS80NjczIDEyMjgwLzE1NjQ3LzQ2NzMKK2YgMTIyODEvMTU2NDYvNDY3NCAxMjI4Mi8xNTY0OC80Njc0IDEyMjkwLzE1NjU2LzQ2NzQKK2YgMTIyOTAvMTU2NTYvNDY3NCAxMjI4OS8xNTY1NC80Njc0IDEyMjgxLzE1NjQ2LzQ2NzQKK2YgMTIyODIvMTU2NDgvNDY3NSAxMjI4My8xNTY0OS80Njc1IDEyMjkxLzE1NjU3LzQ2NzUKK2YgMTIyOTEvMTU2NTcvNDY3NSAxMjI5MC8xNTY1Ni80Njc1IDEyMjgyLzE1NjQ4LzQ2NzUKK2YgMTIyODMvMTU2NDkvNDY3NiAxMjI4NC8xNTY1MC80Njc2IDEyMjkyLzE1NjU4LzQ2NzYKK2YgMTIyOTIvMTU2NTgvNDY3NiAxMjI5MS8xNTY1Ny80Njc2IDEyMjgzLzE1NjQ5LzQ2NzYKK2YgMTIyODQvMTU2NTAvNDY3NyAxMjI4NS8xNTY1MS80Njc3IDEyMjkzLzE1NjU5LzQ2NzcKK2YgMTIyOTMvMTU2NTkvNDY3NyAxMjI5Mi8xNTY1OC80Njc3IDEyMjg0LzE1NjUwLzQ2NzcKK2YgMTIyODUvMTU2NTEvNDY3OCAxMjI4Ni8xNTY1Mi80Njc4IDEyMjk0LzE1NjYwLzQ2NzgKK2YgMTIyOTQvMTU2NjAvNDY3OCAxMjI5My8xNTY1OS80Njc4IDEyMjg1LzE1NjUxLzQ2NzgKK2YgMTIyODYvMTU2NTIvNDY3OSAxMjI4Ny8xNTY1My80Njc5IDEyMjk1LzE1NjYxLzQ2NzkKK2YgMTIyOTUvMTU2NjEvNDY3OSAxMjI5NC8xNTY2MC80Njc5IDEyMjg2LzE1NjUyLzQ2NzkKK2YgMTIyODcvMTU2NTMvNDY4MCAxMjI4MC8xNTY0Ny80NjgwIDEyMjg4LzE1NjU1LzQ2ODAKK2YgMTIyODgvMTU2NTUvNDY4MCAxMjI5NS8xNTY2MS80NjgwIDEyMjg3LzE1NjUzLzQ2ODAKK2YgMTIyOTMvMTU2NTkvNjk3IDEyMjk0LzE1NjYwLzY5NyAxMjI5NS8xNTY2MS82OTcKK2YgMTIyOTUvMTU2NjEvNjk3IDEyMjk2LzE1NjYyLzY5NyAxMjI5My8xNTY1OS82OTcKK2YgMTIyOTMvMTU2NTkvNjk3IDEyMjk2LzE1NjYyLzY5NyAxMjI5MS8xNTY1Ny82OTcKK2YgMTIyOTEvMTU2NTcvNjk3IDEyMjkyLzE1NjU4LzY5NyAxMjI5My8xNTY1OS82OTcKK2YgMTIyODkvMTU2NTQvNjk3IDEyMjk2LzE1NjYyLzY5NyAxMjI5NS8xNTY2MS82OTcKK2YgMTIyOTUvMTU2NjEvNjk3IDEyMjg4LzE1NjU1LzY5NyAxMjI4OS8xNTY1NC82OTcKK2YgMTIyOTAvMTU2NTYvNjk3IDEyMjkxLzE1NjU3LzY5NyAxMjI5Ni8xNTY2Mi82OTcKK2YgMTIyOTYvMTU2NjIvNjk3IDEyMjg5LzE1NjU0LzY5NyAxMjI5MC8xNTY1Ni82OTcKK2YgMTI0MjEvMTU2NjMvNDY4MSAxMjQyMi8xNTY2NC80NjgxIDEyNDIzLzE1NjY1LzQ2ODEKK2YgMTI0MjMvMTU2NjUvNDY4MiAxMjQyNC8xNTY2Ni80NjgyIDEyNDIxLzE1NjYzLzQ2ODIKK2YgMTI0MjQvMTU2NjYvNDY4MyAxMjQyMy8xNTY2NS80NjgzIDEyNDI1LzE1NjY3LzQ2ODMKK2YgMTI0MjUvMTU2NjcvNDY4NCAxMjQyNi8xNTY2OC80Njg0IDEyNDI0LzE1NjY2LzQ2ODQKK2YgMTI0MjYvMTU2NjgvNDY4NSAxMjQyNS8xNTY2Ny80Njg1IDEyNDI3LzE1NjY5LzQ2ODUKK2YgMTI0MjcvMTU2NjkvNDY4NiAxMjQyOC8xNTY3MC80Njg2IDEyNDI2LzE1NjY4LzQ2ODYKK2YgMTI0MjgvMTU2NzAvNDY4NyAxMjQyNy8xNTY2OS80Njg3IDEyNDI5LzE1NjcxLzQ2ODcKK2YgMTI0MjkvMTU2NzEvNDY4OCAxMjQzMC8xNTY3Mi80Njg4IDEyNDI4LzE1NjcwLzQ2ODgKK2YgMTI0MzAvMTU2NzIvNDY4OSAxMjQyOS8xNTY3MS80Njg5IDEyNDMxLzE1NjczLzQ2ODkKK2YgMTI0MzEvMTU2NzMvNDY5MCAxMjQzMi8xNTY3NC80NjkwIDEyNDMwLzE1NjcyLzQ2OTAKK2YgMTI0MzIvMTU2NzQvNDY5MSAxMjQzMS8xNTY3My80NjkxIDEyNDMzLzE1Njc1LzQ2OTEKK2YgMTI0MzMvMTU2NzUvNDY5MiAxMjQzNC8xNTY3Ni80NjkyIDEyNDMyLzE1Njc0LzQ2OTIKK2YgMTI0MzQvMTU2NzYvNDY5MyAxMjQzMy8xNTY3NS80NjkzIDEyNDM1LzE1Njc3LzQ2OTMKK2YgMTI0MzUvMTU2NzcvNDY5NCAxMjQzNi8xNTY3OC80Njk0IDEyNDM0LzE1Njc2LzQ2OTQKK2YgMTI0MzYvMTU2NzgvNDY5NSAxMjQzNS8xNTY3Ny80Njk1IDEyNDIyLzE1NjY0LzQ2OTUKK2YgMTI0MjIvMTU2NjQvNDY5NSAxMjQyMS8xNTY2My80Njk1IDEyNDM2LzE1Njc4LzQ2OTUKK2YgMTI0MjIvMTU2NjQvNDY5NiAxMjQ1My8xNTY3OS80Njk2IDEyNDU0LzE1NjgwLzQ2OTYKK2YgMTI0NTQvMTU2ODAvNDY5NyAxMjQyMy8xNTY2NS80Njk3IDEyNDIyLzE1NjY0LzQ2OTcKK2YgMTI0MjMvMTU2NjUvNDY5OCAxMjQ1NC8xNTY4MC80Njk4IDEyNDU1LzE1NjgxLzQ2OTgKK2YgMTI0NTUvMTU2ODEvNDY5OCAxMjQyNS8xNTY2Ny80Njk4IDEyNDIzLzE1NjY1LzQ2OTgKK2YgMTI0MjUvMTU2NjcvNDY5OSAxMjQ1NS8xNTY4MS80Njk5IDEyNDU2LzE1NjgyLzQ2OTkKK2YgMTI0NTYvMTU2ODIvNDY5OSAxMjQyNy8xNTY2OS80Njk5IDEyNDI1LzE1NjY3LzQ2OTkKK2YgMTI0MjcvMTU2NjkvNDcwMCAxMjQ1Ni8xNTY4Mi80NzAwIDEyNDU3LzE1NjgzLzQ3MDAKK2YgMTI0NTcvMTU2ODMvNDcwMSAxMjQyOS8xNTY3MS80NzAxIDEyNDI3LzE1NjY5LzQ3MDEKK2YgMTI0MjkvMTU2NzEvNDcwMiAxMjQ1Ny8xNTY4My80NzAyIDEyNDU4LzE1Njg0LzQ3MDIKK2YgMTI0NTgvMTU2ODQvNDcwMyAxMjQzMS8xNTY3My80NzAzIDEyNDI5LzE1NjcxLzQ3MDMKK2YgMTI0MzEvMTU2NzMvNDcwNCAxMjQ1OC8xNTY4NC80NzA0IDEyNDU5LzE1Njg1LzQ3MDQKK2YgMTI0NTkvMTU2ODUvNDcwNCAxMjQzMy8xNTY3NS80NzA0IDEyNDMxLzE1NjczLzQ3MDQKK2YgMTI0MzMvMTU2NzUvNDcwNSAxMjQ1OS8xNTY4NS80NzA1IDEyNDYwLzE1Njg2LzQ3MDUKK2YgMTI0NjAvMTU2ODYvNDcwNSAxMjQzNS8xNTY3Ny80NzA1IDEyNDMzLzE1Njc1LzQ3MDUKK2YgMTI0MzUvMTU2NzcvNDcwNiAxMjQ2MC8xNTY4Ni80NzA2IDEyNDUzLzE1Njc5LzQ3MDYKK2YgMTI0NTMvMTU2NzkvNDcwNyAxMjQyMi8xNTY2NC80NzA3IDEyNDM1LzE1Njc3LzQ3MDcKK2YgMTI0NjkvMTU2ODcvNjk3IDEyNDU1LzE1NjgxLzY5NyAxMjQ1NC8xNTY4MC82OTcKK2YgMTI0NTQvMTU2ODAvNjk3IDEyNDUzLzE1Njc5LzY5NyAxMjQ2OS8xNTY4Ny82OTcKK2YgMTI0NjAvMTU2ODYvNjk3IDEyNDU5LzE1Njg1LzY5NyAxMjQ2OS8xNTY4Ny82OTcKK2YgMTI0NjkvMTU2ODcvNjk3IDEyNDUzLzE1Njc5LzY5NyAxMjQ2MC8xNTY4Ni82OTcKK2YgMTI0NTcvMTU2ODMvNjk3IDEyNDY5LzE1Njg3LzY5NyAxMjQ1OS8xNTY4NS82OTcKK2YgMTI0NTkvMTU2ODUvNjk3IDEyNDU4LzE1Njg0LzY5NyAxMjQ1Ny8xNTY4My82OTcKK2YgMTI0NTYvMTU2ODIvNjk3IDEyNDU1LzE1NjgxLzY5NyAxMjQ2OS8xNTY4Ny82OTcKK2YgMTI0NjkvMTU2ODcvNjk3IDEyNDU3LzE1NjgzLzY5NyAxMjQ1Ni8xNTY4Mi82OTcKK2YgMTI0MzcvMTU2ODgvNDY5MCAxMjQzOC8xNTY4OS80NjkwIDEyNDM5LzE1NjkwLzQ2OTAKK2YgMTI0MzkvMTU2OTAvNDcwOCAxMjQ0MC8xNTY5MS80NzA4IDEyNDM3LzE1Njg4LzQ3MDgKK2YgMTI0NDAvMTU2OTEvNDY5MSAxMjQzOS8xNTY5MC80NjkxIDEyNDQxLzE1NjkyLzQ2OTEKK2YgMTI0NDEvMTU2OTIvNDY5MSAxMjQ0Mi8xNTY5My80NjkxIDEyNDQwLzE1NjkxLzQ2OTEKK2YgMTI0NDIvMTU2OTMvNDY5NCAxMjQ0MS8xNTY5Mi80Njk0IDEyNDQzLzE1Njk0LzQ2OTQKK2YgMTI0NDMvMTU2OTQvNDY5NCAxMjQ0NC8xNTY5NS80Njk0IDEyNDQyLzE1NjkzLzQ2OTQKK2YgMTI0NDQvMTU2OTUvNDY5NSAxMjQ0My8xNTY5NC80Njk1IDEyNDQ1LzE1Njk2LzQ2OTUKK2YgMTI0NDUvMTU2OTYvNDY5NSAxMjQ0Ni8xNTY5Ny80Njk1IDEyNDQ0LzE1Njk1LzQ2OTUKK2YgMTI0NDYvMTU2OTcvNDcwOSAxMjQ0NS8xNTY5Ni80NzA5IDEyNDQ3LzE1Njk4LzQ3MDkKK2YgMTI0NDcvMTU2OTgvNDY4MSAxMjQ0OC8xNTY5OS80NjgxIDEyNDQ2LzE1Njk3LzQ2ODEKK2YgMTI0NDgvMTU2OTkvNDY4MyAxMjQ0Ny8xNTY5OC80NjgzIDEyNDQ5LzE1NzAwLzQ2ODMKK2YgMTI0NDkvMTU3MDAvNDY4NCAxMjQ1MC8xNTcwMS80Njg0IDEyNDQ4LzE1Njk5LzQ2ODQKK2YgMTI0NTAvMTU3MDEvNDY4NSAxMjQ0OS8xNTcwMC80Njg1IDEyNDUxLzE1NzAyLzQ2ODUKK2YgMTI0NTEvMTU3MDIvNDY4NiAxMjQ1Mi8xNTcwMy80Njg2IDEyNDUwLzE1NzAxLzQ2ODYKK2YgMTI0NTIvMTU3MDMvNDY4OCAxMjQ1MS8xNTcwMi80Njg4IDEyNDM4LzE1Njg5LzQ2ODgKK2YgMTI0MzgvMTU2ODkvNDcxMCAxMjQzNy8xNTY4OC80NzEwIDEyNDUyLzE1NzAzLzQ3MTAKK2YgMTI0MzgvMTU2ODkvNDcxMSAxMjQ2MS8xNTcwNC80NzExIDEyNDYyLzE1NzA1LzQ3MTEKK2YgMTI0NjIvMTU3MDUvNDcxMSAxMjQzOS8xNTY5MC80NzExIDEyNDM4LzE1Njg5LzQ3MTEKK2YgMTI0MzkvMTU2OTAvNDcwNCAxMjQ2Mi8xNTcwNS80NzA0IDEyNDYzLzE1NzA2LzQ3MDQKK2YgMTI0NjMvMTU3MDYvNDcxMiAxMjQ0MS8xNTY5Mi80NzEyIDEyNDM5LzE1NjkwLzQ3MTIKK2YgMTI0NDEvMTU2OTIvNDcwNSAxMjQ2My8xNTcwNi80NzA1IDEyNDY0LzE1NzA3LzQ3MDUKK2YgMTI0NjQvMTU3MDcvNDcwNSAxMjQ0My8xNTY5NC80NzA1IDEyNDQxLzE1NjkyLzQ3MDUKK2YgMTI0NDMvMTU2OTQvNDcwNiAxMjQ2NC8xNTcwNy80NzA2IDEyNDY1LzE1NzA4LzQ3MDYKK2YgMTI0NjUvMTU3MDgvNDcwNiAxMjQ0NS8xNTY5Ni80NzA2IDEyNDQzLzE1Njk0LzQ3MDYKK2YgMTI0NDUvMTU2OTYvNDY5NyAxMjQ2NS8xNTcwOC80Njk3IDEyNDY2LzE1NzA5LzQ2OTcKK2YgMTI0NjYvMTU3MDkvNDY5NyAxMjQ0Ny8xNTY5OC80Njk3IDEyNDQ1LzE1Njk2LzQ2OTcKK2YgMTI0NDcvMTU2OTgvNDY5OCAxMjQ2Ni8xNTcwOS80Njk4IDEyNDY3LzE1NzEwLzQ2OTgKK2YgMTI0NjcvMTU3MTAvNDY5OCAxMjQ0OS8xNTcwMC80Njk4IDEyNDQ3LzE1Njk4LzQ2OTgKK2YgMTI0NDkvMTU3MDAvNDY5OSAxMjQ2Ny8xNTcxMC80Njk5IDEyNDY4LzE1NzExLzQ2OTkKK2YgMTI0NjgvMTU3MTEvNDcxMyAxMjQ1MS8xNTcwMi80NzEzIDEyNDQ5LzE1NzAwLzQ3MTMKK2YgMTI0NTEvMTU3MDIvNDcwMCAxMjQ2OC8xNTcxMS80NzAwIDEyNDYxLzE1NzA0LzQ3MDAKK2YgMTI0NjEvMTU3MDQvNDcwMCAxMjQzOC8xNTY4OS80NzAwIDEyNDUxLzE1NzAyLzQ3MDAKK2YgMTI0NjQvMTU3MDcvNjk3IDEyNDYzLzE1NzA2LzY5NyAxMjQ3MC8xNTcxMi82OTcKK2YgMTI0NzAvMTU3MTIvNjk3IDEyNDY1LzE1NzA4LzY5NyAxMjQ2NC8xNTcwNy82OTcKK2YgMTI0NjcvMTU3MTAvNjk3IDEyNDY2LzE1NzA5LzY5NyAxMjQ2NS8xNTcwOC82OTcKK2YgMTI0NjUvMTU3MDgvNjk3IDEyNDcwLzE1NzEyLzY5NyAxMjQ2Ny8xNTcxMC82OTcKK2YgMTI0NjEvMTU3MDQvNjk3IDEyNDcwLzE1NzEyLzY5NyAxMjQ2My8xNTcwNi82OTcKK2YgMTI0NjMvMTU3MDYvNjk3IDEyNDYyLzE1NzA1LzY5NyAxMjQ2MS8xNTcwNC82OTcKK2YgMTI0NjgvMTU3MTEvNjk3IDEyNDY3LzE1NzEwLzY5NyAxMjQ3MC8xNTcxMi82OTcKK2YgMTI0NzAvMTU3MTIvNjk3IDEyNDYxLzE1NzA0LzY5NyAxMjQ2OC8xNTcxMS82OTcKK2YgMTI3OTUvMTU3MTMvNjg3IDEyNzkzLzE1NzE0LzY4NyAxMjc5Mi8xNTcxNS82ODcKK2YgMTI3OTIvMTU3MTUvNjg3IDEyNzk0LzE1NzE2LzY4NyAxMjc5NS8xNTcxMy82ODcKK2YgMTI3OTcvMTU3MTcvNjg3IDEyNzk1LzE1NzEzLzY4NyAxMjc5NC8xNTcxNi82ODcKK2YgMTI3OTQvMTU3MTYvNjg3IDEyNzk2LzE1NzE4LzY4NyAxMjc5Ny8xNTcxNy82ODcKK2YgMTI3OTkvMTU3MTkvNjg3IDEyNzk3LzE1NzE3LzY4NyAxMjc5Ni8xNTcxOC82ODcKK2YgMTI3OTYvMTU3MTgvNjg3IDEyNzk4LzE1NzIwLzY4NyAxMjc5OS8xNTcxOS82ODcKK2YgMTI4MDEvMTU3MjEvNjg3IDEyNzk5LzE1NzE5LzY4NyAxMjc5OC8xNTcyMC82ODcKK2YgMTI3OTgvMTU3MjAvNjg3IDEyODAwLzE1NzIyLzY4NyAxMjgwMS8xNTcyMS82ODcKK2YgMTI4MDMvMTU3MjMvNjg3IDEyODAxLzE1NzIxLzY4NyAxMjgwMC8xNTcyMi82ODcKK2YgMTI4MDAvMTU3MjIvNjg3IDEyODAyLzE1NzI0LzY4NyAxMjgwMy8xNTcyMy82ODcKK2YgMTI4MDUvMTU3MjUvNjg3IDEyODAzLzE1NzIzLzY4NyAxMjgwMi8xNTcyNC82ODcKK2YgMTI4MDIvMTU3MjQvNjg3IDEyODA0LzE1NzI2LzY4NyAxMjgwNS8xNTcyNS82ODcKK2YgMTI4MDcvMTU3MjcvNjg3IDEyODA1LzE1NzI1LzY4NyAxMjgwNC8xNTcyNi82ODcKK2YgMTI4MDQvMTU3MjYvNjg3IDEyODA2LzE1NzI4LzY4NyAxMjgwNy8xNTcyNy82ODcKK2YgMTI4MDkvMTU3MjkvNjg3IDEyODA3LzE1NzI3LzY4NyAxMjgwNi8xNTcyOC82ODcKK2YgMTI4MDYvMTU3MjgvNjg3IDEyODA4LzE1NzMwLzY4NyAxMjgwOS8xNTcyOS82ODcKK2YgMTI4MTEvMTU3MzEvNjg3IDEyODA5LzE1NzI5LzY4NyAxMjgwOC8xNTczMC82ODcKK2YgMTI4MDgvMTU3MzAvNjg3IDEyODEwLzE1NzMyLzY4NyAxMjgxMS8xNTczMS82ODcKK2YgMTI4MTMvMTU3MzMvNjg3IDEyODExLzE1NzMxLzY4NyAxMjgxMC8xNTczMi82ODcKK2YgMTI4MTAvMTU3MzIvNjg3IDEyODEyLzE1NzM0LzY4NyAxMjgxMy8xNTczMy82ODcKK2YgMTI4MTUvMTU3MzUvNjg3IDEyODEzLzE1NzMzLzY4NyAxMjgxMi8xNTczNC82ODcKK2YgMTI4MTIvMTU3MzQvNjg3IDEyODE0LzE1NzM2LzY4NyAxMjgxNS8xNTczNS82ODcKK2YgMTI4MTcvMTU3MzcvNjg3IDEyODE1LzE1NzM1LzY4NyAxMjgxNC8xNTczNi82ODcKK2YgMTI4MTQvMTU3MzYvNjg3IDEyODE2LzE1NzM4LzY4NyAxMjgxNy8xNTczNy82ODcKK2YgMTI4MTkvMTU3MzkvNjg3IDEyODE3LzE1NzM3LzY4NyAxMjgxNi8xNTczOC82ODcKK2YgMTI4MTYvMTU3MzgvNjg3IDEyODE4LzE1NzQwLzY4NyAxMjgxOS8xNTczOS82ODcKK2YgMTI4MjEvMTU3NDEvNjg3IDEyODE5LzE1NzM5LzY4NyAxMjgxOC8xNTc0MC82ODcKK2YgMTI4MTgvMTU3NDAvNjg3IDEyODIwLzE1NzQyLzY4NyAxMjgyMS8xNTc0MS82ODcKK2YgMTI4MjMvMTU3NDMvNjg3IDEyODIxLzE1NzQxLzY4NyAxMjgyMC8xNTc0Mi82ODcKK2YgMTI4MjAvMTU3NDIvNjg3IDEyODIyLzE1NzQ0LzY4NyAxMjgyMy8xNTc0My82ODcKK2YgMTI3OTMvMTU3MTQvNjg3IDEyODIzLzE1NzQzLzY4NyAxMjgyMi8xNTc0NC82ODcKK2YgMTI4MjIvMTU3NDQvNjg3IDEyNzkyLzE1NzE1LzY4NyAxMjc5My8xNTcxNC82ODcKK2YgMTI3MjkvMTU3NDUvNDcxNCAxMjcyOC8xNTc0Ni80NzE0IDEyNzQ1LzE1NzQ3LzQ3MTQKK2YgMTI3NDUvMTU3NDcvNDcxNCAxMjc0Ny8xNTc0OC80NzE0IDEyNzI5LzE1NzQ1LzQ3MTQKK2YgMTI3MTcvMTU3NDkvNDcxNSAxMjcxNi8xNTc1MC80NzE1IDEyNzQ2LzE1NzUxLzQ3MTUKK2YgMTI3NDYvMTU3NTEvNDcxNSAxMjc0NC8xNTc1Mi80NzE1IDEyNzE3LzE1NzQ5LzQ3MTUKK2YgMTI3MzAvMTU3NTMvNDcxNiAxMjcyOS8xNTc0NS80NzE2IDEyNzQ3LzE1NzQ4LzQ3MTYKK2YgMTI3NDcvMTU3NDgvNDcxNiAxMjc0OS8xNTc1NC80NzE2IDEyNzMwLzE1NzUzLzQ3MTYKK2YgMTI3MTYvMTU3NTAvNDcxNyAxMjcxNS8xNTc1NS80NzE3IDEyNzQ4LzE1NzU2LzQ3MTcKK2YgMTI3NDgvMTU3NTYvNDcxOCAxMjc0Ni8xNTc1MS80NzE4IDEyNzE2LzE1NzUwLzQ3MTgKK2YgMTI3MzEvMTU3NTcvNDcxOSAxMjczMC8xNTc1My80NzE5IDEyNzQ5LzE1NzU0LzQ3MTkKK2YgMTI3NDkvMTU3NTQvNDcyMCAxMjc1MS8xNTc1OC80NzIwIDEyNzMxLzE1NzU3LzQ3MjAKK2YgMTI3MTUvMTU3NTkvNDcyMSAxMjcxNC8xNTc2MC80NzIxIDEyNzUwLzE1NzYxLzQ3MjEKK2YgMTI3NTAvMTU3NjEvNDcyMSAxMjc0OC8xNTc2Mi80NzIxIDEyNzE1LzE1NzU5LzQ3MjEKK2YgMTI3MzIvMTU3NjMvNDcyMiAxMjczMS8xNTc1Ny80NzIyIDEyNzUxLzE1NzU4LzQ3MjIKK2YgMTI3NTEvMTU3NTgvNDcyMyAxMjc1My8xNTc2NC80NzIzIDEyNzMyLzE1NzYzLzQ3MjMKK2YgMTI3MTQvMTU3NjAvNDcyNCAxMjcxMy8xNTc2NS80NzI0IDEyNzUyLzE1NzY2LzQ3MjQKK2YgMTI3NTIvMTU3NjYvNDcyNCAxMjc1MC8xNTc2MS80NzI0IDEyNzE0LzE1NzYwLzQ3MjQKK2YgMTI3MzMvMTU3NjcvNDcyNSAxMjczMi8xNTc2My80NzI1IDEyNzUzLzE1NzY0LzQ3MjUKK2YgMTI3NTMvMTU3NjQvNDcyNSAxMjc1NS8xNTc2OC80NzI1IDEyNzMzLzE1NzY3LzQ3MjUKK2YgMTI3MTMvMTU3NjUvNDcyNiAxMjcxMi8xNTc2OS80NzI2IDEyNzU0LzE1NzcwLzQ3MjYKK2YgMTI3NTQvMTU3NzAvNDcyNyAxMjc1Mi8xNTc2Ni80NzI3IDEyNzEzLzE1NzY1LzQ3MjcKK2YgMTI3MzQvMTU3NzEvNDcyOCAxMjczMy8xNTc2Ny80NzI4IDEyNzU1LzE1NzY4LzQ3MjgKK2YgMTI3NTUvMTU3NjgvNDcyOCAxMjc1Ny8xNTc3Mi80NzI4IDEyNzM0LzE1NzcxLzQ3MjgKK2YgMTI3MTIvMTU3NjkvNDcyOSAxMjcyNy8xNTc3My80NzI5IDEyNzU2LzE1Nzc0LzQ3MjkKK2YgMTI3NTYvMTU3NzQvNDcyOSAxMjc1NC8xNTc3MC80NzI5IDEyNzEyLzE1NzY5LzQ3MjkKK2YgMTI3MzUvMTU3NzUvNDczMCAxMjczNC8xNTc3MS80NzMwIDEyNzU3LzE1NzcyLzQ3MzAKK2YgMTI3NTcvMTU3NzIvNDczMSAxMjc1OS8xNTc3Ni80NzMxIDEyNzM1LzE1Nzc1LzQ3MzEKK2YgMTI3MjcvMTU3NzcvNDczMiAxMjcyNi8xNTc3OC80NzMyIDEyNzU4LzE1Nzc5LzQ3MzIKK2YgMTI3NTgvMTU3NzkvNDczMyAxMjc1Ni8xNTc4MC80NzMzIDEyNzI3LzE1Nzc3LzQ3MzMKK2YgMTI3MzYvMTU3ODEvNDczNCAxMjczNS8xNTc3NS80NzM0IDEyNzU5LzE1Nzc2LzQ3MzQKK2YgMTI3NTkvMTU3NzYvNDczNCAxMjc2MS8xNTc4Mi80NzM0IDEyNzM2LzE1NzgxLzQ3MzQKK2YgMTI3MjYvMTU3NzgvNDczNSAxMjcyNS8xNTc4My80NzM1IDEyNzYwLzE1Nzg0LzQ3MzUKK2YgMTI3NjAvMTU3ODQvNDczNSAxMjc1OC8xNTc3OS80NzM1IDEyNzI2LzE1Nzc4LzQ3MzUKK2YgMTI3MzcvMTU3ODUvNDczNiAxMjczNi8xNTc4MS80NzM2IDEyNzYxLzE1NzgyLzQ3MzYKK2YgMTI3NjEvMTU3ODIvNDczNiAxMjc2My8xNTc4Ni80NzM2IDEyNzM3LzE1Nzg1LzQ3MzYKK2YgMTI3MjUvMTU3ODMvNDczNyAxMjcyNC8xNTc4Ny80NzM3IDEyNzYyLzE1Nzg4LzQ3MzcKK2YgMTI3NjIvMTU3ODgvNDczOCAxMjc2MC8xNTc4NC80NzM4IDEyNzI1LzE1NzgzLzQ3MzgKK2YgMTI3MzgvMTU3ODkvNDczOSAxMjczNy8xNTc4NS80NzM5IDEyNzYzLzE1Nzg2LzQ3MzkKK2YgMTI3NjMvMTU3ODYvNDczOSAxMjc2NS8xNTc5MC80NzM5IDEyNzM4LzE1Nzg5LzQ3MzkKK2YgMTI3MjQvMTU3ODcvNDc0MCAxMjcyMy8xNTc5MS80NzQwIDEyNzY0LzE1NzkyLzQ3NDAKK2YgMTI3NjQvMTU3OTIvNDc0MSAxMjc2Mi8xNTc4OC80NzQxIDEyNzI0LzE1Nzg3LzQ3NDEKK2YgMTI3MzkvMTU3OTMvNDc0MiAxMjczOC8xNTc4OS80NzQyIDEyNzY1LzE1NzkwLzQ3NDIKK2YgMTI3NjUvMTU3OTAvNDc0MyAxMjc2Ny8xNTc5NC80NzQzIDEyNzM5LzE1NzkzLzQ3NDMKK2YgMTI3MjMvMTU3OTUvNDc0NCAxMjcyMi8xNTc5Ni80NzQ0IDEyNzY2LzE1Nzk3LzQ3NDQKK2YgMTI3NjYvMTU3OTcvNDc0NSAxMjc2NC8xNTc5OC80NzQ1IDEyNzIzLzE1Nzk1LzQ3NDUKK2YgMTI3NDAvMTU3OTkvNDc0NiAxMjczOS8xNTc5My80NzQ2IDEyNzY3LzE1Nzk0LzQ3NDYKK2YgMTI3NjcvMTU3OTQvNDc0NiAxMjc2OS8xNTgwMC80NzQ2IDEyNzQwLzE1Nzk5LzQ3NDYKK2YgMTI3MjIvMTU3OTYvNDc0NyAxMjcyMS8xNTgwMS80NzQ3IDEyNzY4LzE1ODAyLzQ3NDcKK2YgMTI3NjgvMTU4MDIvNDc0NyAxMjc2Ni8xNTc5Ny80NzQ3IDEyNzIyLzE1Nzk2LzQ3NDcKK2YgMTI3NDEvMTU4MDMvNDc0OCAxMjc0MC8xNTc5OS80NzQ4IDEyNzY5LzE1ODAwLzQ3NDgKK2YgMTI3NjkvMTU4MDAvNDc0OCAxMjc3MS8xNTgwNC80NzQ4IDEyNzQxLzE1ODAzLzQ3NDgKK2YgMTI3MjEvMTU4MDEvNDc0OSAxMjcyMC8xNTgwNS80NzQ5IDEyNzcwLzE1ODA2LzQ3NDkKK2YgMTI3NzAvMTU4MDYvNDc1MCAxMjc2OC8xNTgwMi80NzUwIDEyNzIxLzE1ODAxLzQ3NTAKK2YgMTI3NDIvMTU4MDcvNDc1MSAxMjc0MS8xNTgwMy80NzUxIDEyNzcxLzE1ODA0LzQ3NTEKK2YgMTI3NzEvMTU4MDQvNDc1MSAxMjc3My8xNTgwOC80NzUxIDEyNzQyLzE1ODA3LzQ3NTEKK2YgMTI3MjAvMTU4MDUvNDc1MiAxMjcxOS8xNTgwOS80NzUyIDEyNzcyLzE1ODEwLzQ3NTIKK2YgMTI3NzIvMTU4MTAvNDc1MiAxMjc3MC8xNTgwNi80NzUyIDEyNzIwLzE1ODA1LzQ3NTIKK2YgMTI3NDMvMTU4MTEvNDc1MyAxMjc0Mi8xNTgwNy80NzUzIDEyNzczLzE1ODA4LzQ3NTMKK2YgMTI3NzMvMTU4MDgvNDc1MyAxMjc3NS8xNTgxMi80NzUzIDEyNzQzLzE1ODExLzQ3NTMKK2YgMTI3MTkvMTU4MTMvNDc1NCAxMjcxOC8xNTgxNC80NzU0IDEyNzc0LzE1ODE1LzQ3NTQKK2YgMTI3NzQvMTU4MTUvNDc1NCAxMjc3Mi8xNTgxNi80NzU0IDEyNzE5LzE1ODEzLzQ3NTQKK2YgMTI3MjgvMTU3NDYvNDc1NSAxMjc0My8xNTgxMS80NzU1IDEyNzc1LzE1ODEyLzQ3NTUKK2YgMTI3NzUvMTU4MTIvNDc1NSAxMjc0NS8xNTc0Ny80NzU1IDEyNzI4LzE1NzQ2LzQ3NTUKK2YgMTI3MTgvMTU4MTQvNDc1NiAxMjcxNy8xNTc0OS80NzU2IDEyNzQ0LzE1NzUyLzQ3NTYKK2YgMTI3NDQvMTU3NTIvNDc1NyAxMjc3NC8xNTgxNS80NzU3IDEyNzE4LzE1ODE0LzQ3NTcKK2YgMTI3MjgvMTU4MTcvNDc1OCAxMjcyOS8xNTgxOC80NzU4IDEyNzc3LzE1ODE5LzQ3NTgKK2YgMTI3NzcvMTU4MTkvNDc1OCAxMjc3Ni8xNTgyMC80NzU4IDEyNzI4LzE1ODE3LzQ3NTgKK2YgMTI3MjkvMTU4MTgvNDc1OSAxMjczMC8xNTgyMS80NzU5IDEyNzc4LzE1ODIyLzQ3NTkKK2YgMTI3NzgvMTU4MjIvNDc1OSAxMjc3Ny8xNTgxOS80NzU5IDEyNzI5LzE1ODE4LzQ3NTkKK2YgMTI3MzAvMTU4MjMvNDc2MCAxMjczMS8xNTgyNC80NzYwIDEyNzc5LzE1ODI1LzQ3NjAKK2YgMTI3NzkvMTU4MjUvNDc2MCAxMjc3OC8xNTgyNi80NzYwIDEyNzMwLzE1ODIzLzQ3NjAKK2YgMTI3MzEvMTU4MjQvMjM2MiAxMjczMi8xNTgyNy8yMzYyIDEyNzgwLzE1ODI4LzIzNjIKK2YgMTI3ODAvMTU4MjgvMjM2MiAxMjc3OS8xNTgyNS8yMzYyIDEyNzMxLzE1ODI0LzIzNjIKK2YgMTI3MzIvMTU4MjcvMjM2OSAxMjczMy8xNTgyOS8yMzY5IDEyNzgxLzE1ODMwLzIzNjkKK2YgMTI3ODEvMTU4MzAvMjM2OSAxMjc4MC8xNTgyOC8yMzY5IDEyNzMyLzE1ODI3LzIzNjkKK2YgMTI3MzMvMTU4MjkvMTQ3NiAxMjczNC8xNTgzMS8xNDc2IDEyNzgyLzE1ODMyLzE0NzYKK2YgMTI3ODIvMTU4MzIvMTQ3NiAxMjc4MS8xNTgzMC8xNDc2IDEyNzMzLzE1ODI5LzE0NzYKK2YgMTI3MzQvMTU4MzMvNDc2MSAxMjczNS8xNTgzNC80NzYxIDEyNzgzLzE1ODM1LzQ3NjEKK2YgMTI3ODMvMTU4MzUvNDc2MSAxMjc4Mi8xNTgzNi80NzYxIDEyNzM0LzE1ODMzLzQ3NjEKK2YgMTI3MzUvMTU4MzQvNDc2MiAxMjczNi8xNTgzNy80NzYyIDEyNzg0LzE1ODM4LzQ3NjIKK2YgMTI3ODQvMTU4MzgvNDc2MiAxMjc4My8xNTgzNS80NzYyIDEyNzM1LzE1ODM0LzQ3NjIKK2YgMTI3MzYvMTU4MzcvNDc2MyAxMjczNy8xNTgzOS80NzYzIDEyNzg1LzE1ODQwLzQ3NjMKK2YgMTI3ODUvMTU4NDAvNDc2MyAxMjc4NC8xNTgzOC80NzYzIDEyNzM2LzE1ODM3LzQ3NjMKK2YgMTI3MzcvMTU4MzkvMjA3NSAxMjczOC8xNTg0MS8yMDc1IDEyNzg2LzE1ODQyLzIwNzUKK2YgMTI3ODYvMTU4NDIvMjA3NSAxMjc4NS8xNTg0MC8yMDc1IDEyNzM3LzE1ODM5LzIwNzUKK2YgMTI3MzgvMTU4NDMvMjA3NyAxMjczOS8xNTg0NC8yMDc3IDEyNzg3LzE1ODQ1LzIwNzcKK2YgMTI3ODcvMTU4NDUvMjA3NyAxMjc4Ni8xNTg0Ni8yMDc3IDEyNzM4LzE1ODQzLzIwNzcKK2YgMTI3MzkvMTU4NDQvNDc2NCAxMjc0MC8xNTg0Ny80NzY0IDEyNzg4LzE1ODQ4LzQ3NjQKK2YgMTI3ODgvMTU4NDgvNDc2NCAxMjc4Ny8xNTg0NS80NzY0IDEyNzM5LzE1ODQ0LzQ3NjQKK2YgMTI3NDAvMTU4NDcvNDc2NSAxMjc0MS8xNTg0OS80NzY1IDEyNzg5LzE1ODUwLzQ3NjUKK2YgMTI3ODkvMTU4NTAvNDc2NSAxMjc4OC8xNTg0OC80NzY1IDEyNzQwLzE1ODQ3LzQ3NjUKK2YgMTI3NDEvMTU4NDkvNDc2NiAxMjc0Mi8xNTg1MS80NzY2IDEyNzkwLzE1ODUyLzQ3NjYKK2YgMTI3OTAvMTU4NTIvNDc2NyAxMjc4OS8xNTg1MC80NzY3IDEyNzQxLzE1ODQ5LzQ3NjcKK2YgMTI3NDIvMTU4NTMvNDc2OCAxMjc0My8xNTg1NC80NzY4IDEyNzkxLzE1ODU1LzQ3NjgKK2YgMTI3OTEvMTU4NTUvNDc2OCAxMjc5MC8xNTg1Ni80NzY4IDEyNzQyLzE1ODUzLzQ3NjgKK2YgMTI3NDMvMTU4NTQvNDc2OSAxMjcyOC8xNTgxNy80NzY5IDEyNzc2LzE1ODIwLzQ3NjkKK2YgMTI3NzYvMTU4MjAvNDc2OSAxMjc5MS8xNTg1NS80NzY5IDEyNzQzLzE1ODU0LzQ3NjkKK2YgMTI3NDcvMTU3NDgvNjg3IDEyNzQ1LzE1NzQ3LzY4NyAxMjc5My8xNTcxNC82ODcKK2YgMTI3OTMvMTU3MTQvNjg3IDEyNzk1LzE1NzEzLzY4NyAxMjc0Ny8xNTc0OC82ODcKK2YgMTI3NDQvMTU4NTcvNjg3IDEyNzQ2LzE1ODU4LzY4NyAxMjc5NC8xNTcxNi82ODcKK2YgMTI3OTQvMTU3MTYvNjg3IDEyNzkyLzE1NzE1LzY4NyAxMjc0NC8xNTg1Ny82ODcKK2YgMTI3NDkvMTU3NTQvNjg3IDEyNzQ3LzE1NzQ4LzY4NyAxMjc5NS8xNTcxMy82ODcKK2YgMTI3OTUvMTU3MTMvNjg3IDEyNzk3LzE1NzE3LzY4NyAxMjc0OS8xNTc1NC82ODcKK2YgMTI3NDYvMTU4NTgvNjg3IDEyNzQ4LzE1ODU5LzY4NyAxMjc5Ni8xNTcxOC82ODcKK2YgMTI3OTYvMTU3MTgvNjg3IDEyNzk0LzE1NzE2LzY4NyAxMjc0Ni8xNTg1OC82ODcKK2YgMTI3NTEvMTU3NTgvNjg3IDEyNzQ5LzE1NzU0LzY4NyAxMjc5Ny8xNTcxNy82ODcKK2YgMTI3OTcvMTU3MTcvNjg3IDEyNzk5LzE1NzE5LzY4NyAxMjc1MS8xNTc1OC82ODcKK2YgMTI3NDgvMTU4NTkvNjg3IDEyNzUwLzE1ODYwLzY4NyAxMjc5OC8xNTcyMC82ODcKK2YgMTI3OTgvMTU3MjAvNjg3IDEyNzk2LzE1NzE4LzY4NyAxMjc0OC8xNTg1OS82ODcKK2YgMTI3NTMvMTU3NjQvNjg3IDEyNzUxLzE1NzU4LzY4NyAxMjc5OS8xNTcxOS82ODcKK2YgMTI3OTkvMTU3MTkvNjg3IDEyODAxLzE1NzIxLzY4NyAxMjc1My8xNTc2NC82ODcKK2YgMTI3NTAvMTU4NjAvNjg3IDEyNzUyLzE1ODYxLzY4NyAxMjgwMC8xNTcyMi82ODcKK2YgMTI4MDAvMTU3MjIvNjg3IDEyNzk4LzE1NzIwLzY4NyAxMjc1MC8xNTg2MC82ODcKK2YgMTI3NTUvMTU3NjgvNjg3IDEyNzUzLzE1NzY0LzY4NyAxMjgwMS8xNTcyMS82ODcKK2YgMTI4MDEvMTU3MjEvNjg3IDEyODAzLzE1NzIzLzY4NyAxMjc1NS8xNTc2OC82ODcKK2YgMTI3NTIvMTU4NjEvNjg3IDEyNzU0LzE1ODYyLzY4NyAxMjgwMi8xNTcyNC82ODcKK2YgMTI4MDIvMTU3MjQvNjg3IDEyODAwLzE1NzIyLzY4NyAxMjc1Mi8xNTg2MS82ODcKK2YgMTI3NTcvMTU3NzIvNjg3IDEyNzU1LzE1NzY4LzY4NyAxMjgwMy8xNTcyMy82ODcKK2YgMTI4MDMvMTU3MjMvNjg3IDEyODA1LzE1NzI1LzY4NyAxMjc1Ny8xNTc3Mi82ODcKK2YgMTI3NTQvMTU4NjIvNjg3IDEyNzU2LzE1ODYzLzY4NyAxMjgwNC8xNTcyNi82ODcKK2YgMTI4MDQvMTU3MjYvNjg3IDEyODAyLzE1NzI0LzY4NyAxMjc1NC8xNTg2Mi82ODcKK2YgMTI3NTkvMTU3NzYvNjg3IDEyNzU3LzE1NzcyLzY4NyAxMjgwNS8xNTcyNS82ODcKK2YgMTI4MDUvMTU3MjUvNjg3IDEyODA3LzE1NzI3LzY4NyAxMjc1OS8xNTc3Ni82ODcKK2YgMTI3NTYvMTU4NjMvNjg3IDEyNzU4LzE1ODY0LzY4NyAxMjgwNi8xNTcyOC82ODcKK2YgMTI4MDYvMTU3MjgvNjg3IDEyODA0LzE1NzI2LzY4NyAxMjc1Ni8xNTg2My82ODcKK2YgMTI3NjEvMTU3ODIvNjg3IDEyNzU5LzE1Nzc2LzY4NyAxMjgwNy8xNTcyNy82ODcKK2YgMTI4MDcvMTU3MjcvNjg3IDEyODA5LzE1NzI5LzY4NyAxMjc2MS8xNTc4Mi82ODcKK2YgMTI3NTgvMTU4NjQvNjg3IDEyNzYwLzE1ODY1LzY4NyAxMjgwOC8xNTczMC82ODcKK2YgMTI4MDgvMTU3MzAvNjg3IDEyODA2LzE1NzI4LzY4NyAxMjc1OC8xNTg2NC82ODcKK2YgMTI3NjMvMTU3ODYvNjg3IDEyNzYxLzE1NzgyLzY4NyAxMjgwOS8xNTcyOS82ODcKK2YgMTI4MDkvMTU3MjkvNjg3IDEyODExLzE1NzMxLzY4NyAxMjc2My8xNTc4Ni82ODcKK2YgMTI3NjAvMTU4NjUvNjg3IDEyNzYyLzE1ODY2LzY4NyAxMjgxMC8xNTczMi82ODcKK2YgMTI4MTAvMTU3MzIvNjg3IDEyODA4LzE1NzMwLzY4NyAxMjc2MC8xNTg2NS82ODcKK2YgMTI3NjUvMTU3OTAvNjg3IDEyNzYzLzE1Nzg2LzY4NyAxMjgxMS8xNTczMS82ODcKK2YgMTI4MTEvMTU3MzEvNjg3IDEyODEzLzE1NzMzLzY4NyAxMjc2NS8xNTc5MC82ODcKK2YgMTI3NjIvMTU4NjYvNjg3IDEyNzY0LzE1ODY3LzY4NyAxMjgxMi8xNTczNC82ODcKK2YgMTI4MTIvMTU3MzQvNjg3IDEyODEwLzE1NzMyLzY4NyAxMjc2Mi8xNTg2Ni82ODcKK2YgMTI3NjcvMTU3OTQvNjg3IDEyNzY1LzE1NzkwLzY4NyAxMjgxMy8xNTczMy82ODcKK2YgMTI4MTMvMTU3MzMvNjg3IDEyODE1LzE1NzM1LzY4NyAxMjc2Ny8xNTc5NC82ODcKK2YgMTI3NjQvMTU4NjcvNjg3IDEyNzY2LzE1ODY4LzY4NyAxMjgxNC8xNTczNi82ODcKK2YgMTI4MTQvMTU3MzYvNjg3IDEyODEyLzE1NzM0LzY4NyAxMjc2NC8xNTg2Ny82ODcKK2YgMTI3NjkvMTU4MDAvNjg3IDEyNzY3LzE1Nzk0LzY4NyAxMjgxNS8xNTczNS82ODcKK2YgMTI4MTUvMTU3MzUvNjg3IDEyODE3LzE1NzM3LzY4NyAxMjc2OS8xNTgwMC82ODcKK2YgMTI3NjYvMTU4NjgvNjg3IDEyNzY4LzE1ODY5LzY4NyAxMjgxNi8xNTczOC82ODcKK2YgMTI4MTYvMTU3MzgvNjg3IDEyODE0LzE1NzM2LzY4NyAxMjc2Ni8xNTg2OC82ODcKK2YgMTI3NzEvMTU4MDQvNjg3IDEyNzY5LzE1ODAwLzY4NyAxMjgxNy8xNTczNy82ODcKK2YgMTI4MTcvMTU3MzcvNjg3IDEyODE5LzE1NzM5LzY4NyAxMjc3MS8xNTgwNC82ODcKK2YgMTI3NjgvMTU4NjkvNjg3IDEyNzcwLzE1ODcwLzY4NyAxMjgxOC8xNTc0MC82ODcKK2YgMTI4MTgvMTU3NDAvNjg3IDEyODE2LzE1NzM4LzY4NyAxMjc2OC8xNTg2OS82ODcKK2YgMTI3NzMvMTU4MDgvNjg3IDEyNzcxLzE1ODA0LzY4NyAxMjgxOS8xNTczOS82ODcKK2YgMTI4MTkvMTU3MzkvNjg3IDEyODIxLzE1NzQxLzY4NyAxMjc3My8xNTgwOC82ODcKK2YgMTI3NzAvMTU4NzAvNjg3IDEyNzcyLzE1ODcxLzY4NyAxMjgyMC8xNTc0Mi82ODcKK2YgMTI4MjAvMTU3NDIvNjg3IDEyODE4LzE1NzQwLzY4NyAxMjc3MC8xNTg3MC82ODcKK2YgMTI3NzUvMTU4MTIvNjg3IDEyNzczLzE1ODA4LzY4NyAxMjgyMS8xNTc0MS82ODcKK2YgMTI4MjEvMTU3NDEvNjg3IDEyODIzLzE1NzQzLzY4NyAxMjc3NS8xNTgxMi82ODcKK2YgMTI3NzIvMTU4NzEvNjg3IDEyNzc0LzE1ODcyLzY4NyAxMjgyMi8xNTc0NC82ODcKK2YgMTI4MjIvMTU3NDQvNjg3IDEyODIwLzE1NzQyLzY4NyAxMjc3Mi8xNTg3MS82ODcKK2YgMTI3NDUvMTU3NDcvNjg3IDEyNzc1LzE1ODEyLzY4NyAxMjgyMy8xNTc0My82ODcKK2YgMTI4MjMvMTU3NDMvNjg3IDEyNzkzLzE1NzE0LzY4NyAxMjc0NS8xNTc0Ny82ODcKK2YgMTI3NzQvMTU4NzIvNjg3IDEyNzQ0LzE1ODU3LzY4NyAxMjc5Mi8xNTcxNS82ODcKK2YgMTI3OTIvMTU3MTUvNjg3IDEyODIyLzE1NzQ0LzY4NyAxMjc3NC8xNTg3Mi82ODcKK2YgMTI4NjIvMTU4NzMvNjg3IDEyODUzLzE1ODc0LzY4NyAxMjg1NC8xNTg3NS82ODcKK2YgMTI4NTQvMTU4NzUvNjg3IDEyODU1LzE1ODc2LzY4NyAxMjg2Mi8xNTg3My82ODcKK2YgMTI4MjUvMTU4NzcvNjg3IDEyODI0LzE1ODc4LzY4NyAxMjg0MS8xNTg3OS82ODcKK2YgMTI4NDEvMTU4NzkvNjg3IDEyODQwLzE1ODgwLzY4NyAxMjgyNS8xNTg3Ny82ODcKK2YgMTI4MjQvMTU4NzgvNjg3IDEyODM5LzE1ODgxLzY4NyAxMjg0Mi8xNTg4Mi82ODcKK2YgMTI4NDIvMTU4ODIvNjg3IDEyODQxLzE1ODc5LzY4NyAxMjgyNC8xNTg3OC82ODcKK2YgMTI4MzkvMTU4ODEvNjg3IDEyODM4LzE1ODgzLzY4NyAxMjg0My8xNTg4NC82ODcKK2YgMTI4NDMvMTU4ODQvNjg3IDEyODQyLzE1ODgyLzY4NyAxMjgzOS8xNTg4MS82ODcKK2YgMTI4MzgvMTU4ODMvNjg3IDEyODM3LzE1ODg1LzY4NyAxMjg0NC8xNTg4Ni82ODcKK2YgMTI4NDQvMTU4ODYvNjg3IDEyODQzLzE1ODg0LzY4NyAxMjgzOC8xNTg4My82ODcKK2YgMTI4MzcvMTU4ODUvNjg3IDEyODM2LzE1ODg3LzY4NyAxMjg0NS8xNTg4OC82ODcKK2YgMTI4NDUvMTU4ODgvNjg3IDEyODQ0LzE1ODg2LzY4NyAxMjgzNy8xNTg4NS82ODcKK2YgMTI4MzYvMTU4ODcvNjg3IDEyODM1LzE1ODg5LzY4NyAxMjg0Ni8xNTg5MC82ODcKK2YgMTI4NDYvMTU4OTAvNjg3IDEyODQ1LzE1ODg4LzY4NyAxMjgzNi8xNTg4Ny82ODcKK2YgMTI4MzUvMTU4ODkvNjg3IDEyODM0LzE1ODkxLzY4NyAxMjg0Ny8xNTg5Mi82ODcKK2YgMTI4NDcvMTU4OTIvNjg3IDEyODQ2LzE1ODkwLzY4NyAxMjgzNS8xNTg4OS82ODcKK2YgMTI4MzQvMTU4OTEvNjg3IDEyODMzLzE1ODkzLzY4NyAxMjg0OC8xNTg5NC82ODcKK2YgMTI4NDgvMTU4OTQvNjg3IDEyODQ3LzE1ODkyLzY4NyAxMjgzNC8xNTg5MS82ODcKK2YgMTI4MzMvMTU4OTMvNjg3IDEyODMyLzE1ODk1LzY4NyAxMjg0OS8xNTg5Ni82ODcKK2YgMTI4NDkvMTU4OTYvNjg3IDEyODQ4LzE1ODk0LzY4NyAxMjgzMy8xNTg5My82ODcKK2YgMTI4MzIvMTU4OTUvNjg3IDEyODMxLzE1ODk3LzY4NyAxMjg1MC8xNTg5OC82ODcKK2YgMTI4NTAvMTU4OTgvNjg3IDEyODQ5LzE1ODk2LzY4NyAxMjgzMi8xNTg5NS82ODcKK2YgMTI4MzEvMTU4OTcvNjg3IDEyODMwLzE1ODk5LzY4NyAxMjg1MS8xNTkwMC82ODcKK2YgMTI4NTEvMTU5MDAvNjg3IDEyODUwLzE1ODk4LzY4NyAxMjgzMS8xNTg5Ny82ODcKK2YgMTI4MzAvMTU4OTkvNjg3IDEyODI5LzE1OTAxLzY4NyAxMjg1Mi8xNTkwMi82ODcKK2YgMTI4NTIvMTU5MDIvNjg3IDEyODUxLzE1OTAwLzY4NyAxMjgzMC8xNTg5OS82ODcKK2YgMTI4MjkvMTU5MDEvNjg3IDEyODI4LzE1OTAzLzY4NyAxMjg1My8xNTg3NC82ODcKK2YgMTI4NTMvMTU4NzQvNjg3IDEyODUyLzE1OTAyLzY4NyAxMjgyOS8xNTkwMS82ODcKK2YgMTI4MjgvMTU5MDMvNjg3IDEyODI3LzE1OTA0LzY4NyAxMjg1NC8xNTg3NS82ODcKK2YgMTI4NTQvMTU4NzUvNjg3IDEyODUzLzE1ODc0LzY4NyAxMjgyOC8xNTkwMy82ODcKK2YgMTI4MjcvMTU5MDQvNjg3IDEyODI2LzE1OTA1LzY4NyAxMjg1NS8xNTg3Ni82ODcKK2YgMTI4NTUvMTU4NzYvNjg3IDEyODU0LzE1ODc1LzY4NyAxMjgyNy8xNTkwNC82ODcKK2YgMTI4MjYvMTU5MDUvNjg3IDEyODI1LzE1ODc3LzY4NyAxMjg0MC8xNTg4MC82ODcKK2YgMTI4NDAvMTU4ODAvNjg3IDEyODU1LzE1ODc2LzY4NyAxMjgyNi8xNTkwNS82ODcKK2YgMTI4NTEvMTU5MDAvNjg3IDEyODUyLzE1OTAyLzY4NyAxMjg2My8xNTkwNi82ODcKK2YgMTI4NjMvMTU5MDYvNjg3IDEyODY0LzE1OTA3LzY4NyAxMjg1MS8xNTkwMC82ODcKK2YgMTI4NjMvMTU5MDYvNjg3IDEyODUyLzE1OTAyLzY4NyAxMjg1My8xNTg3NC82ODcKK2YgMTI4NTMvMTU4NzQvNjg3IDEyODYyLzE1ODczLzY4NyAxMjg2My8xNTkwNi82ODcKK2YgMTI4NDkvMTU4OTYvNjg3IDEyODUwLzE1ODk4LzY4NyAxMjg1MS8xNTkwMC82ODcKK2YgMTI4NTEvMTU5MDAvNjg3IDEyODY0LzE1OTA3LzY4NyAxMjg0OS8xNTg5Ni82ODcKK2YgMTI4NDEvMTU4NzkvNjg3IDEyODU5LzE1OTA4LzY4NyAxMjg1Ni8xNTkwOS82ODcKK2YgMTI4NTYvMTU5MDkvNjg3IDEyODQwLzE1ODgwLzY4NyAxMjg0MS8xNTg3OS82ODcKK2YgMTI4NTkvMTU5MDgvNjg3IDEyODYwLzE1OTEwLzY4NyAxMjg1Ny8xNTkxMS82ODcKK2YgMTI4NTcvMTU5MTEvNjg3IDEyODU2LzE1OTA5LzY4NyAxMjg1OS8xNTkwOC82ODcKK2YgMTI4NjAvMTU5MTAvNjg3IDEyODYxLzE1OTEyLzY4NyAxMjg1OC8xNTkxMy82ODcKK2YgMTI4NTgvMTU5MTMvNjg3IDEyODU3LzE1OTExLzY4NyAxMjg2MC8xNTkxMC82ODcKK2YgMTI4NTgvMTU5MTMvNjg3IDEyODYxLzE1OTEyLzY4NyAxMjg0Ny8xNTg5Mi82ODcKK2YgMTI4NDcvMTU4OTIvNjg3IDEyODQ4LzE1ODk0LzY4NyAxMjg1OC8xNTkxMy82ODcKK2YgMTI4NDEvMTU4NzkvNjg3IDEyODQyLzE1ODgyLzY4NyAxMjg0My8xNTg4NC82ODcKK2YgMTI4NDMvMTU4ODQvNjg3IDEyODU5LzE1OTA4LzY4NyAxMjg0MS8xNTg3OS82ODcKK2YgMTI4NDMvMTU4ODQvNjg3IDEyODQ0LzE1ODg2LzY4NyAxMjg2MC8xNTkxMC82ODcKK2YgMTI4NjAvMTU5MTAvNjg3IDEyODU5LzE1OTA4LzY4NyAxMjg0My8xNTg4NC82ODcKK2YgMTI4NjAvMTU5MTAvNjg3IDEyODQ0LzE1ODg2LzY4NyAxMjg0NS8xNTg4OC82ODcKK2YgMTI4NDUvMTU4ODgvNjg3IDEyODYxLzE1OTEyLzY4NyAxMjg2MC8xNTkxMC82ODcKK2YgMTI4NjEvMTU5MTIvNjg3IDEyODQ1LzE1ODg4LzY4NyAxMjg0Ni8xNTg5MC82ODcKK2YgMTI4NDYvMTU4OTAvNjg3IDEyODQ3LzE1ODkyLzY4NyAxMjg2MS8xNTkxMi82ODcKK2YgMTI4NTUvMTU4NzYvNjg3IDEyODQwLzE1ODgwLzY4NyAxMjg1Ni8xNTkwOS82ODcKK2YgMTI4NTYvMTU5MDkvNjg3IDEyODYyLzE1ODczLzY4NyAxMjg1NS8xNTg3Ni82ODcKK2YgMTI4NTYvMTU5MDkvNjg3IDEyODU3LzE1OTExLzY4NyAxMjg2My8xNTkwNi82ODcKK2YgMTI4NjMvMTU5MDYvNjg3IDEyODYyLzE1ODczLzY4NyAxMjg1Ni8xNTkwOS82ODcKK2YgMTI4NTcvMTU5MTEvNjg3IDEyODU4LzE1OTEzLzY4NyAxMjg2NC8xNTkwNy82ODcKK2YgMTI4NjQvMTU5MDcvNjg3IDEyODYzLzE1OTA2LzY4NyAxMjg1Ny8xNTkxMS82ODcKK2YgMTI4NDkvMTU4OTYvNjg3IDEyODY0LzE1OTA3LzY4NyAxMjg1OC8xNTkxMy82ODcKK2YgMTI4NTgvMTU5MTMvNjg3IDEyODQ4LzE1ODk0LzY4NyAxMjg0OS8xNTg5Ni82ODcKK2YgMTI2NDgvMTU5MTQvNjg3IDEyNjQ5LzE1OTE1LzY4NyAxMjY2NS8xNTkxNi82ODcKK2YgMTI2NjUvMTU5MTYvNjg3IDEyNjY0LzE1OTE3LzY4NyAxMjY0OC8xNTkxNC82ODcKK2YgMTI2NDkvMTU5MTUvNjg3IDEyNjUwLzE1OTE4LzY4NyAxMjY2Ni8xNTkxOS82ODcKK2YgMTI2NjYvMTU5MTkvNjg3IDEyNjY1LzE1OTE2LzY4NyAxMjY0OS8xNTkxNS82ODcKK2YgMTI2NTAvMTU5MTgvNjg3IDEyNjUxLzE1OTIwLzY4NyAxMjY2Ny8xNTkyMS82ODcKK2YgMTI2NjcvMTU5MjEvNjg3IDEyNjY2LzE1OTE5LzY4NyAxMjY1MC8xNTkxOC82ODcKK2YgMTI2NTEvMTU5MjAvNjg3IDEyNjUyLzE1OTIyLzY4NyAxMjY2OC8xNTkyMy82ODcKK2YgMTI2NjgvMTU5MjMvNjg3IDEyNjY3LzE1OTIxLzY4NyAxMjY1MS8xNTkyMC82ODcKK2YgMTI2NTIvMTU5MjIvNjg3IDEyNjUzLzE1OTI0LzY4NyAxMjY2OS8xNTkyNS82ODcKK2YgMTI2NjkvMTU5MjUvNjg3IDEyNjY4LzE1OTIzLzY4NyAxMjY1Mi8xNTkyMi82ODcKK2YgMTI2NTMvMTU5MjQvNjg3IDEyNjU0LzE1OTI2LzY4NyAxMjY3MC8xNTkyNy82ODcKK2YgMTI2NzAvMTU5MjcvNjg3IDEyNjY5LzE1OTI1LzY4NyAxMjY1My8xNTkyNC82ODcKK2YgMTI2NTQvMTU5MjYvNjg3IDEyNjU1LzE1OTI4LzY4NyAxMjY3MS8xNTkyOS82ODcKK2YgMTI2NzEvMTU5MjkvNjg3IDEyNjcwLzE1OTI3LzY4NyAxMjY1NC8xNTkyNi82ODcKK2YgMTI2NTUvMTU5MjgvNjg3IDEyNjU2LzE1OTMwLzY4NyAxMjY3Mi8xNTkzMS82ODcKK2YgMTI2NzIvMTU5MzEvNjg3IDEyNjcxLzE1OTI5LzY4NyAxMjY1NS8xNTkyOC82ODcKK2YgMTI2NTYvMTU5MzAvNjg3IDEyNjU3LzE1OTMyLzY4NyAxMjY3My8xNTkzMy82ODcKK2YgMTI2NzMvMTU5MzMvNjg3IDEyNjcyLzE1OTMxLzY4NyAxMjY1Ni8xNTkzMC82ODcKK2YgMTI2NTcvMTU5MzIvNjg3IDEyNjU4LzE1OTM0LzY4NyAxMjY3NC8xNTkzNS82ODcKK2YgMTI2NzQvMTU5MzUvNjg3IDEyNjczLzE1OTMzLzY4NyAxMjY1Ny8xNTkzMi82ODcKK2YgMTI2NTgvMTU5MzQvNjg3IDEyNjU5LzE1OTM2LzY4NyAxMjY3NS8xNTkzNy82ODcKK2YgMTI2NzUvMTU5MzcvNjg3IDEyNjc0LzE1OTM1LzY4NyAxMjY1OC8xNTkzNC82ODcKK2YgMTI2NTkvMTU5MzYvNjg3IDEyNjYwLzE1OTM4LzY4NyAxMjY3Ni8xNTkzOS82ODcKK2YgMTI2NzYvMTU5MzkvNjg3IDEyNjc1LzE1OTM3LzY4NyAxMjY1OS8xNTkzNi82ODcKK2YgMTI2NjAvMTU5MzgvNjg3IDEyNjYxLzE1OTQwLzY4NyAxMjY3Ny8xNTk0MS82ODcKK2YgMTI2NzcvMTU5NDEvNjg3IDEyNjc2LzE1OTM5LzY4NyAxMjY2MC8xNTkzOC82ODcKK2YgMTI2NjEvMTU5NDAvNjg3IDEyNjYyLzE1OTQyLzY4NyAxMjY3OC8xNTk0My82ODcKK2YgMTI2NzgvMTU5NDMvNjg3IDEyNjc3LzE1OTQxLzY4NyAxMjY2MS8xNTk0MC82ODcKK2YgMTI2NjIvMTU5NDIvNjg3IDEyNjYzLzE1OTQ0LzY4NyAxMjY3OS8xNTk0NS82ODcKK2YgMTI2NzkvMTU5NDUvNjg3IDEyNjc4LzE1OTQzLzY4NyAxMjY2Mi8xNTk0Mi82ODcKK2YgMTI2NjMvMTU5NDQvNjg3IDEyNjQ4LzE1OTE0LzY4NyAxMjY2NC8xNTkxNy82ODcKK2YgMTI2NjQvMTU5MTcvNjg3IDEyNjc5LzE1OTQ1LzY4NyAxMjY2My8xNTk0NC82ODcKK2YgMTI2ODEvMTU5NDYvNDc3MCAxMjY4MC8xNTk0Ny80NzcwIDEyNjk2LzE1OTQ4LzQ3NzAKK2YgMTI2OTYvMTU5NDgvNDc3MCAxMjY5Ny8xNTk0OS80NzcwIDEyNjgxLzE1OTQ2LzQ3NzAKK2YgMTI2ODIvMTU5NTAvNDc3MSAxMjY4MS8xNTk0Ni80NzcxIDEyNjk3LzE1OTQ5LzQ3NzEKK2YgMTI2OTcvMTU5NDkvNDc3MSAxMjY5OC8xNTk1MS80NzcxIDEyNjgyLzE1OTUwLzQ3NzEKK2YgMTI2ODMvMTU5NTIvNDc3MiAxMjY4Mi8xNTk1My80NzcyIDEyNjk4LzE1OTU0LzQ3NzIKK2YgMTI2OTgvMTU5NTQvNDc3MyAxMjY5OS8xNTk1NS80NzczIDEyNjgzLzE1OTUyLzQ3NzMKK2YgMTI2ODQvMTU5NTYvNDc3NCAxMjY4My8xNTk1Mi80Nzc0IDEyNjk5LzE1OTU1LzQ3NzQKK2YgMTI2OTkvMTU5NTUvNDc3NCAxMjcwMC8xNTk1Ny80Nzc0IDEyNjg0LzE1OTU2LzQ3NzQKK2YgMTI2ODUvMTU5NTgvNDc3NSAxMjY4NC8xNTk1Ni80Nzc1IDEyNzAwLzE1OTU3LzQ3NzUKK2YgMTI3MDAvMTU5NTcvNDc3NSAxMjcwMS8xNTk1OS80Nzc1IDEyNjg1LzE1OTU4LzQ3NzUKK2YgMTI2ODYvMTU5NjAvNDc3NiAxMjY4NS8xNTk1OC80Nzc2IDEyNzAxLzE1OTU5LzQ3NzYKK2YgMTI3MDEvMTU5NTkvNDc3NyAxMjcwMi8xNTk2MS80Nzc3IDEyNjg2LzE1OTYwLzQ3NzcKK2YgMTI2ODcvMTU5NjIvNDc3OCAxMjY4Ni8xNTk2My80Nzc4IDEyNzAyLzE1OTY0LzQ3NzgKK2YgMTI3MDIvMTU5NjQvNDc3OCAxMjcwMy8xNTk2NS80Nzc4IDEyNjg3LzE1OTYyLzQ3NzgKK2YgMTI2ODgvMTU5NjYvNDc3OSAxMjY4Ny8xNTk2Mi80Nzc5IDEyNzAzLzE1OTY1LzQ3NzkKK2YgMTI3MDMvMTU5NjUvNDc3OSAxMjcwNC8xNTk2Ny80Nzc5IDEyNjg4LzE1OTY2LzQ3NzkKK2YgMTI2ODkvMTU5NjgvNDc4MCAxMjY4OC8xNTk2Ni80NzgwIDEyNzA0LzE1OTY3LzQ3ODAKK2YgMTI3MDQvMTU5NjcvNDc4MCAxMjcwNS8xNTk2OS80NzgwIDEyNjg5LzE1OTY4LzQ3ODAKK2YgMTI2OTAvMTU5NzAvNDc4MSAxMjY4OS8xNTk2OC80NzgxIDEyNzA1LzE1OTY5LzQ3ODEKK2YgMTI3MDUvMTU5NjkvNDc4MSAxMjcwNi8xNTk3MS80NzgxIDEyNjkwLzE1OTcwLzQ3ODEKK2YgMTI2OTEvMTU5NzIvNDc4MiAxMjY5MC8xNTk3My80NzgyIDEyNzA2LzE1OTc0LzQ3ODIKK2YgMTI3MDYvMTU5NzQvNDc4MiAxMjcwNy8xNTk3NS80NzgyIDEyNjkxLzE1OTcyLzQ3ODIKK2YgMTI2OTIvMTU5NzYvNDc4MyAxMjY5MS8xNTk3Mi80NzgzIDEyNzA3LzE1OTc1LzQ3ODMKK2YgMTI3MDcvMTU5NzUvNDc4MyAxMjcwOC8xNTk3Ny80NzgzIDEyNjkyLzE1OTc2LzQ3ODMKK2YgMTI2OTMvMTU5NzgvNDc4NCAxMjY5Mi8xNTk3Ni80Nzg0IDEyNzA4LzE1OTc3LzQ3ODQKK2YgMTI3MDgvMTU5NzcvNDc4NCAxMjcwOS8xNTk3OS80Nzg0IDEyNjkzLzE1OTc4LzQ3ODQKK2YgMTI2OTQvMTU5ODAvNDc4NSAxMjY5My8xNTk3OC80Nzg1IDEyNzA5LzE1OTc5LzQ3ODUKK2YgMTI3MDkvMTU5NzkvNDc4NSAxMjcxMC8xNTk4MS80Nzg1IDEyNjk0LzE1OTgwLzQ3ODUKK2YgMTI2OTUvMTU5ODIvNDc4NiAxMjY5NC8xNTk4My80Nzg2IDEyNzEwLzE1OTg0LzQ3ODYKK2YgMTI3MTAvMTU5ODQvNDc4NiAxMjcxMS8xNTk4NS80Nzg2IDEyNjk1LzE1OTgyLzQ3ODYKK2YgMTI2ODAvMTU5NDcvNDc4NyAxMjY5NS8xNTk4Mi80Nzg3IDEyNzExLzE1OTg1LzQ3ODcKK2YgMTI3MTEvMTU5ODUvNDc4NyAxMjY5Ni8xNTk0OC80Nzg3IDEyNjgwLzE1OTQ3LzQ3ODcKK2YgMTI2NjUvMTU5ODYvNDc4OCAxMjY5Ny8xNTk0OS80Nzg4IDEyNjk2LzE1OTQ4LzQ3ODgKK2YgMTI2OTYvMTU5NDgvNDc4OSAxMjY2NC8xNTk4Ny80Nzg5IDEyNjY1LzE1OTg2LzQ3ODkKK2YgMTI2NjYvMTU5MTkvNDc5MCAxMjY5OC8xNTk4OC80NzkwIDEyNjk3LzE1OTg5LzQ3OTAKK2YgMTI2OTcvMTU5ODkvNDc5MSAxMjY2NS8xNTkxNi80NzkxIDEyNjY2LzE1OTE5LzQ3OTEKK2YgMTI2NjcvMTU5MjEvNDc5MiAxMjY5OS8xNTk5MC80NzkyIDEyNjk4LzE1OTg4LzQ3OTIKK2YgMTI2OTgvMTU5ODgvNDc5MyAxMjY2Ni8xNTkxOS80NzkzIDEyNjY3LzE1OTIxLzQ3OTMKK2YgMTI2NjgvMTU5OTEvNDc5NCAxMjcwMC8xNTk1Ny80Nzk0IDEyNjk5LzE1OTU1LzQ3OTQKK2YgMTI2OTkvMTU5NTUvNDc5NSAxMjY2Ny8xNTk5Mi80Nzk1IDEyNjY4LzE1OTkxLzQ3OTUKK2YgMTI2NjkvMTU5OTMvNDc5NiAxMjcwMS8xNTk1OS80Nzk2IDEyNzAwLzE1OTU3LzQ3OTYKK2YgMTI3MDAvMTU5NTcvNDc5NyAxMjY2OC8xNTk5MS80Nzk3IDEyNjY5LzE1OTkzLzQ3OTcKK2YgMTI2NzAvMTU5MjcvNDc5OCAxMjcwMi8xNTk5NC80Nzk4IDEyNzAxLzE1OTk1LzQ3OTgKK2YgMTI3MDEvMTU5OTUvNDc5OSAxMjY2OS8xNTkyNS80Nzk5IDEyNjcwLzE1OTI3LzQ3OTkKK2YgMTI2NzEvMTU5MjkvNDgwMCAxMjcwMy8xNTk5Ni80ODAwIDEyNzAyLzE1OTk0LzQ4MDAKK2YgMTI3MDIvMTU5OTQvNDgwMSAxMjY3MC8xNTkyNy80ODAxIDEyNjcxLzE1OTI5LzQ4MDEKK2YgMTI2NzIvMTU5OTcvNDgwMiAxMjcwNC8xNTk2Ny80ODAyIDEyNzAzLzE1OTY1LzQ4MDIKK2YgMTI3MDMvMTU5NjUvNDgwMyAxMjY3MS8xNTk5OC80ODAzIDEyNjcyLzE1OTk3LzQ4MDMKK2YgMTI2NzMvMTU5OTkvNDgwNCAxMjcwNS8xNTk2OS80ODA0IDEyNzA0LzE1OTY3LzQ4MDQKK2YgMTI3MDQvMTU5NjcvNDgwNSAxMjY3Mi8xNTk5Ny80ODA1IDEyNjczLzE1OTk5LzQ4MDUKK2YgMTI2NzQvMTU5MzUvNDgwNiAxMjcwNi8xNjAwMC80ODA2IDEyNzA1LzE2MDAxLzQ4MDYKK2YgMTI3MDUvMTYwMDEvNDgwNyAxMjY3My8xNTkzMy80ODA3IDEyNjc0LzE1OTM1LzQ4MDcKK2YgMTI2NzUvMTU5MzcvNDgwOCAxMjcwNy8xNjAwMi80ODA4IDEyNzA2LzE2MDAwLzQ4MDgKK2YgMTI3MDYvMTYwMDAvNDgwOSAxMjY3NC8xNTkzNS80ODA5IDEyNjc1LzE1OTM3LzQ4MDkKK2YgMTI2NzYvMTYwMDMvNDgxMCAxMjcwOC8xNTk3Ny80ODEwIDEyNzA3LzE1OTc1LzQ4MTAKK2YgMTI3MDcvMTU5NzUvNDgxMSAxMjY3NS8xNjAwNC80ODExIDEyNjc2LzE2MDAzLzQ4MTEKK2YgMTI2NzcvMTYwMDUvNDgxMiAxMjcwOS8xNTk3OS80ODEyIDEyNzA4LzE1OTc3LzQ4MTIKK2YgMTI3MDgvMTU5NzcvNDgxMyAxMjY3Ni8xNjAwMy80ODEzIDEyNjc3LzE2MDA1LzQ4MTMKK2YgMTI2NzgvMTU5NDMvNDgxNCAxMjcxMC8xNjAwNi80ODE0IDEyNzA5LzE2MDA3LzQ4MTQKK2YgMTI3MDkvMTYwMDcvNDgxNSAxMjY3Ny8xNTk0MS80ODE1IDEyNjc4LzE1OTQzLzQ4MTUKK2YgMTI2NzkvMTU5NDUvNDgxNiAxMjcxMS8xNjAwOC80ODE2IDEyNzEwLzE2MDA2LzQ4MTYKK2YgMTI3MTAvMTYwMDYvNDgxNyAxMjY3OC8xNTk0My80ODE3IDEyNjc5LzE1OTQ1LzQ4MTcKK2YgMTI2NjQvMTU5ODcvNDgxOCAxMjY5Ni8xNTk0OC80ODE4IDEyNzExLzE1OTg1LzQ4MTgKK2YgMTI3MTEvMTU5ODUvNDgxOSAxMjY3OS8xNjAwOS80ODE5IDEyNjY0LzE1OTg3LzQ4MTkKK2YgMTI0NzkvMTYwMTAvNjg3IDEyNDgwLzE2MDExLzY4NyAxMjQ5Ni8xNjAxMi82ODcKK2YgMTI0NzkvMTYwMTAvNjg3IDEyNDk2LzE2MDEyLzY4NyAxMjQ5NS8xNjAxMy82ODcKK2YgMTI0ODAvMTYwMTEvNjg3IDEyNDgxLzE2MDE0LzY4NyAxMjQ5Ny8xNjAxNS82ODcKK2YgMTI0OTcvMTYwMTUvNjg3IDEyNDk2LzE2MDEyLzY4NyAxMjQ4MC8xNjAxMS82ODcKK2YgMTI0ODEvMTYwMTQvNjg3IDEyNDgyLzE2MDE2LzY4NyAxMjQ5OC8xNjAxNy82ODcKK2YgMTI0OTgvMTYwMTcvNjg3IDEyNDk3LzE2MDE1LzY4NyAxMjQ4MS8xNjAxNC82ODcKK2YgMTI0ODIvMTYwMTYvNjg3IDEyNDgzLzE2MDE4LzY4NyAxMjQ5OS8xNjAxOS82ODcKK2YgMTI0OTkvMTYwMTkvNjg3IDEyNDk4LzE2MDE3LzY4NyAxMjQ4Mi8xNjAxNi82ODcKK2YgMTI0ODMvMTYwMTgvNjg3IDEyNDg0LzE2MDIwLzY4NyAxMjUwMC8xNjAyMS82ODcKK2YgMTI1MDAvMTYwMjEvNjg3IDEyNDk5LzE2MDE5LzY4NyAxMjQ4My8xNjAxOC82ODcKK2YgMTI0ODQvMTYwMjAvNjg3IDEyNDg1LzE2MDIyLzY4NyAxMjUwMS8xNjAyMy82ODcKK2YgMTI1MDEvMTYwMjMvNjg3IDEyNTAwLzE2MDIxLzY4NyAxMjQ4NC8xNjAyMC82ODcKK2YgMTI0ODUvMTYwMjIvNjg3IDEyNDg2LzE2MDI0LzY4NyAxMjUwMi8xNjAyNS82ODcKK2YgMTI1MDIvMTYwMjUvNjg3IDEyNTAxLzE2MDIzLzY4NyAxMjQ4NS8xNjAyMi82ODcKK2YgMTI0ODYvMTYwMjQvNjg3IDEyNDg3LzE2MDI2LzY4NyAxMjUwMy8xNjAyNy82ODcKK2YgMTI1MDMvMTYwMjcvNjg3IDEyNTAyLzE2MDI1LzY4NyAxMjQ4Ni8xNjAyNC82ODcKK2YgMTI0ODcvMTYwMjYvNjg3IDEyNDg4LzE2MDI4LzY4NyAxMjUwNC8xNjAyOS82ODcKK2YgMTI1MDQvMTYwMjkvNjg3IDEyNTAzLzE2MDI3LzY4NyAxMjQ4Ny8xNjAyNi82ODcKK2YgMTI0ODgvMTYwMjgvNjg3IDEyNDg5LzE2MDMwLzY4NyAxMjUwNS8xNjAzMS82ODcKK2YgMTI1MDUvMTYwMzEvNjg3IDEyNTA0LzE2MDI5LzY4NyAxMjQ4OC8xNjAyOC82ODcKK2YgMTI0ODkvMTYwMzAvNjg3IDEyNDkwLzE2MDMyLzY4NyAxMjUwNi8xNjAzMy82ODcKK2YgMTI1MDYvMTYwMzMvNjg3IDEyNTA1LzE2MDMxLzY4NyAxMjQ4OS8xNjAzMC82ODcKK2YgMTI0OTAvMTYwMzIvNjg3IDEyNDkxLzE2MDM0LzY4NyAxMjUwNy8xNjAzNS82ODcKK2YgMTI1MDcvMTYwMzUvNjg3IDEyNTA2LzE2MDMzLzY4NyAxMjQ5MC8xNjAzMi82ODcKK2YgMTI0OTEvMTYwMzQvNjg3IDEyNDkyLzE2MDM2LzY4NyAxMjUwOC8xNjAzNy82ODcKK2YgMTI1MDgvMTYwMzcvNjg3IDEyNTA3LzE2MDM1LzY4NyAxMjQ5MS8xNjAzNC82ODcKK2YgMTI0OTIvMTYwMzYvNjg3IDEyNDkzLzE2MDM4LzY4NyAxMjUwOS8xNjAzOS82ODcKK2YgMTI1MDkvMTYwMzkvNjg3IDEyNTA4LzE2MDM3LzY4NyAxMjQ5Mi8xNjAzNi82ODcKK2YgMTI0OTMvMTYwMzgvNjg3IDEyNDk0LzE2MDQwLzY4NyAxMjUxMC8xNjA0MS82ODcKK2YgMTI1MTAvMTYwNDEvNjg3IDEyNTA5LzE2MDM5LzY4NyAxMjQ5My8xNjAzOC82ODcKK2YgMTI0OTQvMTYwNDAvNjg3IDEyNDc5LzE2MDEwLzY4NyAxMjQ5NS8xNjAxMy82ODcKK2YgMTI0OTUvMTYwMTMvNjg3IDEyNTEwLzE2MDQxLzY4NyAxMjQ5NC8xNjA0MC82ODcKK2YgMTI1ODQvMTYwNDIvNDc1OCAxMjU4NS8xNjA0My80NzU4IDEyNTEyLzE2MDQ0LzQ3NTgKK2YgMTI1MTIvMTYwNDQvNDc1OCAxMjYzMi8xNjA0NS80NzU4IDEyNTg0LzE2MDQyLzQ3NTgKK2YgMTI1ODUvMTYwNDMvNDc1OSAxMjU4Ni8xNjA0Ni80NzU5IDEyNTEzLzE2MDQ3LzQ3NTkKK2YgMTI1MTMvMTYwNDcvNDc1OSAxMjUxMi8xNjA0NC80NzU5IDEyNTg1LzE2MDQzLzQ3NTkKK2YgMTI1ODYvMTYwNDgvNDc2MCAxMjU4Ny8xNjA0OS80NzYwIDEyNTE0LzE2MDUwLzQ3NjAKK2YgMTI1MTQvMTYwNTAvNDc2MCAxMjUxMy8xNjA1MS80NzYwIDEyNTg2LzE2MDQ4LzQ3NjAKK2YgMTI1ODcvMTYwNDkvMjM2MiAxMjU4OC8xNjA1Mi8yMzYyIDEyNTE1LzE2MDUzLzIzNjIKK2YgMTI1MTUvMTYwNTMvMjM2MiAxMjUxNC8xNjA1MC8yMzYyIDEyNTg3LzE2MDQ5LzIzNjIKK2YgMTI1ODgvMTYwNTIvMjM2OSAxMjU4OS8xNjA1NC8yMzY5IDEyNTE2LzE2MDU1LzIzNjkKK2YgMTI1MTYvMTYwNTUvMjM2OSAxMjUxNS8xNjA1My8yMzY5IDEyNTg4LzE2MDUyLzIzNjkKK2YgMTI1ODkvMTYwNTQvMTQ3NiAxMjU5MC8xNjA1Ni8xNDc2IDEyNTE3LzE2MDU3LzE0NzYKK2YgMTI1MTcvMTYwNTcvMTQ3NiAxMjUxNi8xNjA1NS8xNDc2IDEyNTg5LzE2MDU0LzE0NzYKK2YgMTI1OTAvMTYwNTgvNDc2MSAxMjU5MS8xNjA1OS80NzYxIDEyNTE4LzE2MDYwLzQ3NjEKK2YgMTI1MTgvMTYwNjAvNDc2MSAxMjUxNy8xNjA2MS80NzYxIDEyNTkwLzE2MDU4LzQ3NjEKK2YgMTI1OTEvMTYwNTkvNDc2MiAxMjU5Mi8xNjA2Mi80NzYyIDEyNTE5LzE2MDYzLzQ3NjIKK2YgMTI1MTkvMTYwNjMvNDc2MiAxMjUxOC8xNjA2MC80NzYyIDEyNTkxLzE2MDU5LzQ3NjIKK2YgMTI1OTIvMTYwNjIvNDc2MyAxMjU5My8xNjA2NC80NzYzIDEyNTIwLzE2MDY1LzQ3NjMKK2YgMTI1MjAvMTYwNjUvNDc2MyAxMjUxOS8xNjA2My80NzYzIDEyNTkyLzE2MDYyLzQ3NjMKK2YgMTI1OTMvMTYwNjQvMjA3NSAxMjU5NC8xNjA2Ni8yMDc1IDEyNTIxLzE2MDY3LzIwNzUKK2YgMTI1MjEvMTYwNjcvMjA3NSAxMjUyMC8xNjA2NS8yMDc1IDEyNTkzLzE2MDY0LzIwNzUKK2YgMTI1OTQvMTYwNjgvMjA3NyAxMjU5NS8xNjA2OS8yMDc3IDEyNTIyLzE2MDcwLzIwNzcKK2YgMTI1MjIvMTYwNzAvMjA3NyAxMjUyMS8xNjA3MS8yMDc3IDEyNTk0LzE2MDY4LzIwNzcKK2YgMTI1OTUvMTYwNjkvNDc2NCAxMjU5Ni8xNjA3Mi80NzY0IDEyNTIzLzE2MDczLzQ3NjQKK2YgMTI1MjMvMTYwNzMvNDc2NCAxMjUyMi8xNjA3MC80NzY0IDEyNTk1LzE2MDY5LzQ3NjQKK2YgMTI1OTYvMTYwNzIvNDc2NSAxMjU5Ny8xNjA3NC80NzY1IDEyNTI0LzE2MDc1LzQ3NjUKK2YgMTI1MjQvMTYwNzUvNDc2NSAxMjUyMy8xNjA3My80NzY1IDEyNTk2LzE2MDcyLzQ3NjUKK2YgMTI1OTcvMTYwNzQvNDc2NyAxMjU5OC8xNjA3Ni80NzY3IDEyNTI1LzE2MDc3LzQ3NjcKK2YgMTI1MjUvMTYwNzcvNDc2NyAxMjUyNC8xNjA3NS80NzY3IDEyNTk3LzE2MDc0LzQ3NjcKK2YgMTI1OTgvMTYwNzgvNDc2OCAxMjU5OS8xNjA3OS80NzY4IDEyNjQ3LzE2MDgwLzQ3NjgKK2YgMTI2NDcvMTYwODAvNDc2OCAxMjUyNS8xNjA4MS80NzY4IDEyNTk4LzE2MDc4LzQ3NjgKK2YgMTI1OTkvMTYwNzkvNDc2OSAxMjU4NC8xNjA0Mi80NzY5IDEyNjMyLzE2MDQ1LzQ3NjkKK2YgMTI2MzIvMTYwNDUvNDc2OSAxMjY0Ny8xNjA4MC80NzY5IDEyNTk5LzE2MDc5LzQ3NjkKK2YgMTI2MDMvMTYwODIvNDgyMCAxMjYwMi8xNjA4My80ODIwIDEyNjAwLzE2MDg0LzQ4MjAKK2YgMTI2MDAvMTYwODQvNDgyMSAxMjYwMS8xNjA4NS80ODIxIDEyNjAzLzE2MDgyLzQ4MjEKK2YgMTI2MDUvMTYwODYvNDgyMiAxMjYwNC8xNjA4Ny80ODIyIDEyNjAyLzE2MDg4LzQ4MjIKK2YgMTI2MDIvMTYwODgvNDgyMyAxMjYwMy8xNjA4OS80ODIzIDEyNjA1LzE2MDg2LzQ4MjMKK2YgMTI2MDcvMTYwOTAvNDgyNCAxMjYwNi8xNjA5MS80ODI0IDEyNjA0LzE2MDg3LzQ4MjQKK2YgMTI2MDQvMTYwODcvNDgyNSAxMjYwNS8xNjA4Ni80ODI1IDEyNjA3LzE2MDkwLzQ4MjUKK2YgMTI2MDkvMTYwOTIvNDgyNiAxMjYwOC8xNjA5My80ODI2IDEyNjA2LzE2MDk0LzQ4MjYKK2YgMTI2MDYvMTYwOTQvNDgyNyAxMjYwNy8xNjA5NS80ODI3IDEyNjA5LzE2MDkyLzQ4MjcKK2YgMTI2MTEvMTYwOTYvNDgyOCAxMjYxMC8xNjA5Ny80ODI4IDEyNjA4LzE2MDkzLzQ4MjgKK2YgMTI2MDgvMTYwOTMvNDgyOSAxMjYwOS8xNjA5Mi80ODI5IDEyNjExLzE2MDk2LzQ4MjkKK2YgMTI2MTMvMTYwOTgvNDgzMCAxMjYxMi8xNjA5OS80ODMwIDEyNjEwLzE2MTAwLzQ4MzAKK2YgMTI2MTAvMTYxMDAvNDgzMSAxMjYxMS8xNjEwMS80ODMxIDEyNjEzLzE2MDk4LzQ4MzEKK2YgMTI2MTUvMTYxMDIvNDgzMiAxMjYxNC8xNjEwMy80ODMyIDEyNjEyLzE2MDk5LzQ4MzIKK2YgMTI2MTIvMTYwOTkvNDgzMyAxMjYxMy8xNjA5OC80ODMzIDEyNjE1LzE2MTAyLzQ4MzMKK2YgMTI2MTcvMTYxMDQvNDgzNCAxMjYxNi8xNjEwNS80ODM0IDEyNjE0LzE2MTA2LzQ4MzQKK2YgMTI2MTQvMTYxMDYvNDgzNSAxMjYxNS8xNjEwNy80ODM1IDEyNjE3LzE2MTA0LzQ4MzUKK2YgMTI2MTkvMTYxMDgvNDgzNiAxMjYxOC8xNjEwOS80ODM2IDEyNjE2LzE2MTA1LzQ4MzYKK2YgMTI2MTYvMTYxMDUvNDgzNyAxMjYxNy8xNjEwNC80ODM3IDEyNjE5LzE2MTA4LzQ4MzcKK2YgMTI2MjEvMTYxMTAvNDgzOCAxMjYyMC8xNjExMS80ODM4IDEyNjE4LzE2MTEyLzQ4MzgKK2YgMTI2MTgvMTYxMTIvNDgzOSAxMjYxOS8xNjExMy80ODM5IDEyNjIxLzE2MTEwLzQ4MzkKK2YgMTI2MjMvMTYxMTQvNDg0MCAxMjYyMi8xNjExNS80ODQwIDEyNjIwLzE2MTExLzQ4NDAKK2YgMTI2MjAvMTYxMTEvNDg0MSAxMjYyMS8xNjExMC80ODQxIDEyNjIzLzE2MTE0LzQ4NDEKK2YgMTI2MjUvMTYxMTYvNDg0MiAxMjYyNC8xNjExNy80ODQyIDEyNjIyLzE2MTE4LzQ4NDIKK2YgMTI2MjIvMTYxMTgvNDg0MyAxMjYyMy8xNjExOS80ODQzIDEyNjI1LzE2MTE2LzQ4NDMKK2YgMTI2MjcvMTYxMjAvNDg0NCAxMjYyNi8xNjEyMS80ODQ0IDEyNjI0LzE2MTE3LzQ4NDQKK2YgMTI2MjQvMTYxMTcvNDg0NSAxMjYyNS8xNjExNi80ODQ1IDEyNjI3LzE2MTIwLzQ4NDUKK2YgMTI2MjkvMTYxMjIvNDg0NiAxMjYyOC8xNjEyMy80ODQ2IDEyNjI2LzE2MTI0LzQ4NDYKK2YgMTI2MjYvMTYxMjQvNDg0NyAxMjYyNy8xNjEyNS80ODQ3IDEyNjI5LzE2MTIyLzQ4NDcKK2YgMTI2MzEvMTYxMjYvNDg0OCAxMjYzMC8xNjEyNy80ODQ4IDEyNjI4LzE2MTIzLzQ4NDgKK2YgMTI2MjgvMTYxMjMvNDg0OSAxMjYyOS8xNjEyMi80ODQ5IDEyNjMxLzE2MTI2LzQ4NDkKK2YgMTI2MDEvMTYwODUvNDg1MCAxMjYwMC8xNjA4NC80ODUwIDEyNjMwLzE2MTI4LzQ4NTAKK2YgMTI2MzAvMTYxMjgvNDg1MSAxMjYzMS8xNjEyOS80ODUxIDEyNjAxLzE2MDg1LzQ4NTEKK2YgMTI1ODQvMTYwNDIvNDg1MiAxMjYwMC8xNjA4NC80ODUyIDEyNjAyLzE2MDgzLzQ4NTIKK2YgMTI2MDIvMTYwODMvNDg1MyAxMjU4NS8xNjA0My80ODUzIDEyNTg0LzE2MDQyLzQ4NTMKK2YgMTI2MDEvMTYwODUvNDg1NCAxMjQ5NS8xNjEzMC80ODU0IDEyNDk2LzE2MTMxLzQ4NTQKK2YgMTI0OTYvMTYxMzEvNDg1NSAxMjYwMy8xNjA4Mi80ODU1IDEyNjAxLzE2MDg1LzQ4NTUKK2YgMTI1ODUvMTYwNDMvNDg1NiAxMjYwMi8xNjA4My80ODU2IDEyNjA0LzE2MTMyLzQ4NTYKK2YgMTI2MDQvMTYxMzIvNDg1NyAxMjU4Ni8xNjA0Ni80ODU3IDEyNTg1LzE2MDQzLzQ4NTcKK2YgMTI2MDMvMTYwODIvNDg1OCAxMjQ5Ni8xNjEzMS80ODU4IDEyNDk3LzE2MTMzLzQ4NTgKK2YgMTI0OTcvMTYxMzMvNDg1OSAxMjYwNS8xNjEzNC80ODU5IDEyNjAzLzE2MDgyLzQ4NTkKK2YgMTI1ODYvMTYwNDgvNDg2MCAxMjYwNC8xNjEzNS80ODYwIDEyNjA2LzE2MDk0LzQ4NjAKK2YgMTI2MDYvMTYwOTQvNDg2MSAxMjU4Ny8xNjA0OS80ODYxIDEyNTg2LzE2MDQ4LzQ4NjEKK2YgMTI2MDUvMTYxMzYvNDg2MiAxMjQ5Ny8xNjEzNy80ODYyIDEyNDk4LzE2MTM4LzQ4NjIKK2YgMTI0OTgvMTYxMzgvNDg2MyAxMjYwNy8xNjA5NS80ODYzIDEyNjA1LzE2MTM2LzQ4NjMKK2YgMTI1ODcvMTYwNDkvNDg2NCAxMjYwNi8xNjA5NC80ODY0IDEyNjA4LzE2MDkzLzQ4NjQKK2YgMTI2MDgvMTYwOTMvNDg2NSAxMjU4OC8xNjA1Mi80ODY1IDEyNTg3LzE2MDQ5LzQ4NjUKK2YgMTI2MDcvMTYwOTUvNDg2NiAxMjQ5OC8xNjEzOC80ODY2IDEyNDk5LzE2MTM5LzQ4NjYKK2YgMTI0OTkvMTYxMzkvNDg2NyAxMjYwOS8xNjA5Mi80ODY3IDEyNjA3LzE2MDk1LzQ4NjcKK2YgMTI1ODgvMTYwNTIvNDg2OCAxMjYwOC8xNjA5My80ODY4IDEyNjEwLzE2MDk3LzQ4NjgKK2YgMTI2MTAvMTYwOTcvNDg2OSAxMjU4OS8xNjA1NC80ODY5IDEyNTg4LzE2MDUyLzQ4NjkKK2YgMTI2MDkvMTYwOTIvNDg3MCAxMjQ5OS8xNjEzOS80ODcwIDEyNTAwLzE2MTQwLzQ4NzAKK2YgMTI1MDAvMTYxNDAvNDg3MSAxMjYxMS8xNjA5Ni80ODcxIDEyNjA5LzE2MDkyLzQ4NzEKK2YgMTI1ODkvMTYwNTQvNDg3MiAxMjYxMC8xNjA5Ny80ODcyIDEyNjEyLzE2MTQxLzQ4NzIKK2YgMTI2MTIvMTYxNDEvNDg3MyAxMjU5MC8xNjA1Ni80ODczIDEyNTg5LzE2MDU0LzQ4NzMKK2YgMTI2MTEvMTYwOTYvNDg3NCAxMjUwMC8xNjE0MC80ODc0IDEyNTAxLzE2MTQyLzQ4NzQKK2YgMTI1MDEvMTYxNDIvNDg3NSAxMjYxMy8xNjE0My80ODc1IDEyNjExLzE2MDk2LzQ4NzUKK2YgMTI1OTAvMTYwNTgvNDg3NiAxMjYxMi8xNjE0NC80ODc2IDEyNjE0LzE2MTA2LzQ4NzYKK2YgMTI2MTQvMTYxMDYvNDg3NyAxMjU5MS8xNjA1OS80ODc3IDEyNTkwLzE2MDU4LzQ4NzcKK2YgMTI2MTMvMTYxNDUvNDg3OCAxMjUwMS8xNjE0Ni80ODc4IDEyNTAyLzE2MTQ3LzQ4NzgKK2YgMTI1MDIvMTYxNDcvNDg3OSAxMjYxNS8xNjEwNy80ODc5IDEyNjEzLzE2MTQ1LzQ4NzkKK2YgMTI1OTEvMTYwNTkvNDg4MCAxMjYxNC8xNjEwNi80ODgwIDEyNjE2LzE2MTA1LzQ4ODAKK2YgMTI2MTYvMTYxMDUvNDg4MSAxMjU5Mi8xNjA2Mi80ODgxIDEyNTkxLzE2MDU5LzQ4ODEKK2YgMTI2MTUvMTYxMDcvNDg4MiAxMjUwMi8xNjE0Ny80ODgyIDEyNTAzLzE2MTQ4LzQ4ODIKK2YgMTI1MDMvMTYxNDgvNDg4MyAxMjYxNy8xNjEwNC80ODgzIDEyNjE1LzE2MTA3LzQ4ODMKK2YgMTI1OTIvMTYwNjIvNDg4NCAxMjYxNi8xNjEwNS80ODg0IDEyNjE4LzE2MTA5LzQ4ODQKK2YgMTI2MTgvMTYxMDkvNDg4NSAxMjU5My8xNjA2NC80ODg1IDEyNTkyLzE2MDYyLzQ4ODUKK2YgMTI2MTcvMTYxMDQvNDg4NiAxMjUwMy8xNjE0OC80ODg2IDEyNTA0LzE2MTQ5LzQ4ODYKK2YgMTI1MDQvMTYxNDkvNDg4NyAxMjYxOS8xNjEwOC80ODg3IDEyNjE3LzE2MTA0LzQ4ODcKK2YgMTI1OTMvMTYwNjQvNDg4OCAxMjYxOC8xNjEwOS80ODg4IDEyNjIwLzE2MTUwLzQ4ODgKK2YgMTI2MjAvMTYxNTAvNDg4OSAxMjU5NC8xNjA2Ni80ODg5IDEyNTkzLzE2MDY0LzQ4ODkKK2YgMTI2MTkvMTYxMDgvNDg5MCAxMjUwNC8xNjE0OS80ODkwIDEyNTA1LzE2MTUxLzQ4OTAKK2YgMTI1MDUvMTYxNTEvNDg5MSAxMjYyMS8xNjE1Mi80ODkxIDEyNjE5LzE2MTA4LzQ4OTEKK2YgMTI1OTQvMTYwNjgvNDg5MiAxMjYyMC8xNjE1My80ODkyIDEyNjIyLzE2MTE4LzQ4OTIKK2YgMTI2MjIvMTYxMTgvNDg5MyAxMjU5NS8xNjA2OS80ODkzIDEyNTk0LzE2MDY4LzQ4OTMKK2YgMTI2MjEvMTYxNTQvNDg5NCAxMjUwNS8xNjE1NS80ODk0IDEyNTA2LzE2MTU2LzQ4OTQKK2YgMTI1MDYvMTYxNTYvNDg5NSAxMjYyMy8xNjExOS80ODk1IDEyNjIxLzE2MTU0LzQ4OTUKK2YgMTI1OTUvMTYwNjkvNDg5NiAxMjYyMi8xNjExOC80ODk2IDEyNjI0LzE2MTE3LzQ4OTYKK2YgMTI2MjQvMTYxMTcvNDg5NyAxMjU5Ni8xNjA3Mi80ODk3IDEyNTk1LzE2MDY5LzQ4OTcKK2YgMTI2MjMvMTYxMTkvNDg5OCAxMjUwNi8xNjE1Ni80ODk4IDEyNTA3LzE2MTU3LzQ4OTgKK2YgMTI1MDcvMTYxNTcvNDg5OSAxMjYyNS8xNjExNi80ODk5IDEyNjIzLzE2MTE5LzQ4OTkKK2YgMTI1OTYvMTYwNzIvNDkwMCAxMjYyNC8xNjExNy80OTAwIDEyNjI2LzE2MTIxLzQ5MDAKK2YgMTI2MjYvMTYxMjEvNDkwMSAxMjU5Ny8xNjA3NC80OTAxIDEyNTk2LzE2MDcyLzQ5MDEKK2YgMTI2MjUvMTYxMTYvNDkwMiAxMjUwNy8xNjE1Ny80OTAyIDEyNTA4LzE2MTU4LzQ5MDIKK2YgMTI1MDgvMTYxNTgvNDkwMyAxMjYyNy8xNjEyMC80OTAzIDEyNjI1LzE2MTE2LzQ5MDMKK2YgMTI1OTcvMTYwNzQvNDkwNCAxMjYyNi8xNjEyMS80OTA0IDEyNjI4LzE2MTU5LzQ5MDQKK2YgMTI2MjgvMTYxNTkvNDkwNSAxMjU5OC8xNjA3Ni80OTA1IDEyNTk3LzE2MDc0LzQ5MDUKK2YgMTI2MjcvMTYxMjAvNDkwNiAxMjUwOC8xNjE1OC80OTA2IDEyNTA5LzE2MTYwLzQ5MDYKK2YgMTI1MDkvMTYxNjAvNDkwNyAxMjYyOS8xNjE2MS80OTA3IDEyNjI3LzE2MTIwLzQ5MDcKK2YgMTI1OTgvMTYwNzgvNDkwOCAxMjYyOC8xNjE2Mi80OTA4IDEyNjMwLzE2MTI4LzQ5MDgKK2YgMTI2MzAvMTYxMjgvNDkwOSAxMjU5OS8xNjA3OS80OTA5IDEyNTk4LzE2MDc4LzQ5MDkKK2YgMTI2MjkvMTYxNjMvNDkxMCAxMjUwOS8xNjE2NC80OTEwIDEyNTEwLzE2MTY1LzQ5MTAKK2YgMTI1MTAvMTYxNjUvNDkxMSAxMjYzMS8xNjEyOS80OTExIDEyNjI5LzE2MTYzLzQ5MTEKK2YgMTI1OTkvMTYwNzkvNDkxMiAxMjYzMC8xNjEyOC80OTEyIDEyNjAwLzE2MDg0LzQ5MTIKK2YgMTI2MDAvMTYwODQvNDkxMyAxMjU4NC8xNjA0Mi80OTEzIDEyNTk5LzE2MDc5LzQ5MTMKK2YgMTI2MzEvMTYxMjkvNDkxNCAxMjUxMC8xNjE2NS80OTE0IDEyNDk1LzE2MTMwLzQ5MTQKK2YgMTI0OTUvMTYxMzAvNDkxNSAxMjYwMS8xNjA4NS80OTE1IDEyNjMxLzE2MTI5LzQ5MTUKK2YgMTI1MTEvMTYxNjYvNDkxNiAxMjYzMy8xNjE2Ny80OTE2IDEyNTI4LzE2MTY4LzQ5MTYKK2YgMTI1MjgvMTYxNjgvNDkxNiAxMjUyNy8xNjE2OS80OTE2IDEyNTExLzE2MTY2LzQ5MTYKK2YgMTI2MzMvMTYxNjcvNDkxNyAxMjYzNC8xNjE3MC80OTE3IDEyNTI5LzE2MTcxLzQ5MTcKK2YgMTI1MjkvMTYxNzEvNDkxNyAxMjUyOC8xNjE2OC80OTE3IDEyNjMzLzE2MTY3LzQ5MTcKK2YgMTI2MzQvMTYxNzAvNDkxOCAxMjYzNS8xNjE3Mi80OTE4IDEyNTMwLzE2MTczLzQ5MTgKK2YgMTI1MzAvMTYxNzMvNDkxOCAxMjUyOS8xNjE3MS80OTE4IDEyNjM0LzE2MTcwLzQ5MTgKK2YgMTI2MzUvMTYxNzIvNDkxOSAxMjYzNi8xNjE3NC80OTE5IDEyNTMxLzE2MTc1LzQ5MTkKK2YgMTI1MzEvMTYxNzUvNDkxOSAxMjUzMC8xNjE3My80OTE5IDEyNjM1LzE2MTcyLzQ5MTkKK2YgMTI2MzYvMTYxNzQvNDkyMCAxMjYzNy8xNjE3Ni80OTIwIDEyNTMyLzE2MTc3LzQ5MjAKK2YgMTI1MzIvMTYxNzcvNDkyMCAxMjUzMS8xNjE3NS80OTIwIDEyNjM2LzE2MTc0LzQ5MjAKK2YgMTI2MzcvMTYxNzYvNDkyMSAxMjYzOC8xNjE3OC80OTIxIDEyNTMzLzE2MTc5LzQ5MjEKK2YgMTI1MzMvMTYxNzkvNDkyMSAxMjUzMi8xNjE3Ny80OTIxIDEyNjM3LzE2MTc2LzQ5MjEKK2YgMTI2MzgvMTYxNzgvNDkyMiAxMjYzOS8xNjE4MC80OTIyIDEyNTM0LzE2MTgxLzQ5MjIKK2YgMTI1MzQvMTYxODEvNDkyMiAxMjUzMy8xNjE3OS80OTIyIDEyNjM4LzE2MTc4LzQ5MjIKK2YgMTI2MzkvMTYxODAvNDkyMyAxMjY0MC8xNjE4Mi80OTIzIDEyNTM1LzE2MTgzLzQ5MjMKK2YgMTI1MzUvMTYxODMvNDkyMyAxMjUzNC8xNjE4MS80OTIzIDEyNjM5LzE2MTgwLzQ5MjMKK2YgMTI2NDAvMTYxODIvNDkyNCAxMjY0MS8xNjE4NC80OTI0IDEyNTM2LzE2MTg1LzQ5MjQKK2YgMTI1MzYvMTYxODUvNDkyNCAxMjUzNS8xNjE4My80OTI0IDEyNjQwLzE2MTgyLzQ5MjQKK2YgMTI2NDEvMTYxODQvNDkyNSAxMjY0Mi8xNjE4Ni80OTI1IDEyNTM3LzE2MTg3LzQ5MjUKK2YgMTI1MzcvMTYxODcvNDkyNSAxMjUzNi8xNjE4NS80OTI1IDEyNjQxLzE2MTg0LzQ5MjUKK2YgMTI2NDIvMTYxODYvNDkyNiAxMjY0My8xNjE4OC80OTI2IDEyNTM4LzE2MTg5LzQ5MjYKK2YgMTI1MzgvMTYxODkvNDkyNiAxMjUzNy8xNjE4Ny80OTI2IDEyNjQyLzE2MTg2LzQ5MjYKK2YgMTI2NDMvMTYxODgvNDkyNyAxMjY0NC8xNjE5MC80OTI3IDEyNTM5LzE2MTkxLzQ5MjcKK2YgMTI1MzkvMTYxOTEvNDkyNyAxMjUzOC8xNjE4OS80OTI3IDEyNjQzLzE2MTg4LzQ5MjcKK2YgMTI2NDQvMTYxOTAvNDkyOCAxMjY0NS8xNjE5Mi80OTI4IDEyNTQwLzE2MTkzLzQ5MjgKK2YgMTI1NDAvMTYxOTMvNDkyOCAxMjUzOS8xNjE5MS80OTI4IDEyNjQ0LzE2MTkwLzQ5MjgKK2YgMTI2NDUvMTYxOTIvNDkyOSAxMjY0Ni8xNjE5NC80OTI5IDEyNTQxLzE2MTk1LzQ5MjkKK2YgMTI1NDEvMTYxOTUvNDkyOSAxMjU0MC8xNjE5My80OTI5IDEyNjQ1LzE2MTkyLzQ5MjkKK2YgMTI2NDYvMTYxOTQvNDkzMCAxMjUyNi8xNjE5Ni80OTMwIDEyNTQyLzE2MTk3LzQ5MzAKK2YgMTI1NDIvMTYxOTcvNDkzMCAxMjU0MS8xNjE5NS80OTMwIDEyNjQ2LzE2MTk0LzQ5MzAKK2YgMTI1MjYvMTYxOTYvNDkzMSAxMjUxMS8xNjE2Ni80OTMxIDEyNTI3LzE2MTY5LzQ5MzEKK2YgMTI1MjcvMTYxNjkvNDkzMSAxMjU0Mi8xNjE5Ny80OTMxIDEyNTI2LzE2MTk2LzQ5MzEKK2YgMTI1MjcvMTYxNjkvNDkzMiAxMjUyOC8xNjE2OC80OTMyIDEyNTQ0LzE2MTk4LzQ5MzIKK2YgMTI1NDQvMTYxOTgvNDkzMiAxMjU0My8xNjE5OS80OTMyIDEyNTI3LzE2MTY5LzQ5MzIKK2YgMTI1MjgvMTYxNjgvNDkzMyAxMjUyOS8xNjE3MS80OTMzIDEyNTQ1LzE2MjAwLzQ5MzMKK2YgMTI1NDUvMTYyMDAvNDkzMyAxMjU0NC8xNjE5OC80OTMzIDEyNTI4LzE2MTY4LzQ5MzMKK2YgMTI1MjkvMTYxNzEvNDkzNCAxMjUzMC8xNjE3My80OTM0IDEyNTQ2LzE2MjAxLzQ5MzQKK2YgMTI1NDYvMTYyMDEvNDkzNCAxMjU0NS8xNjIwMC80OTM0IDEyNTI5LzE2MTcxLzQ5MzQKK2YgMTI1MzAvMTYxNzMvNDkzNSAxMjUzMS8xNjE3NS80OTM1IDEyNTQ3LzE2MjAyLzQ5MzUKK2YgMTI1NDcvMTYyMDIvNDkzNSAxMjU0Ni8xNjIwMS80OTM1IDEyNTMwLzE2MTczLzQ5MzUKK2YgMTI1MzEvMTYxNzUvNDkzNiAxMjUzMi8xNjE3Ny80OTM2IDEyNTQ4LzE2MjAzLzQ5MzYKK2YgMTI1NDgvMTYyMDMvNDkzNiAxMjU0Ny8xNjIwMi80OTM2IDEyNTMxLzE2MTc1LzQ5MzYKK2YgMTI1MzIvMTYxNzcvNDkzNyAxMjUzMy8xNjE3OS80OTM3IDEyNTQ5LzE2MjA0LzQ5MzcKK2YgMTI1NDkvMTYyMDQvNDkzNyAxMjU0OC8xNjIwMy80OTM3IDEyNTMyLzE2MTc3LzQ5MzcKK2YgMTI1MzMvMTYxNzkvNDkzOCAxMjUzNC8xNjE4MS80OTM4IDEyNTUwLzE2MjA1LzQ5MzgKK2YgMTI1NTAvMTYyMDUvNDkzOSAxMjU0OS8xNjIwNC80OTM5IDEyNTMzLzE2MTc5LzQ5MzkKK2YgMTI1MzQvMTYxODEvNDk0MCAxMjUzNS8xNjE4My80OTQwIDEyNTUxLzE2MjA2LzQ5NDAKK2YgMTI1NTEvMTYyMDYvNDk0MCAxMjU1MC8xNjIwNS80OTQwIDEyNTM0LzE2MTgxLzQ5NDAKK2YgMTI1MzUvMTYxODMvNDk0MSAxMjUzNi8xNjE4NS80OTQxIDEyNTUyLzE2MjA3LzQ5NDEKK2YgMTI1NTIvMTYyMDcvNDk0MSAxMjU1MS8xNjIwNi80OTQxIDEyNTM1LzE2MTgzLzQ5NDEKK2YgMTI1MzYvMTYxODUvNDk0MiAxMjUzNy8xNjE4Ny80OTQyIDEyNTUzLzE2MjA4LzQ5NDIKK2YgMTI1NTMvMTYyMDgvNDk0MiAxMjU1Mi8xNjIwNy80OTQyIDEyNTM2LzE2MTg1LzQ5NDIKK2YgMTI1MzcvMTYxODcvNDk0MyAxMjUzOC8xNjE4OS80OTQzIDEyNTU0LzE2MjA5LzQ5NDMKK2YgMTI1NTQvMTYyMDkvNDk0NCAxMjU1My8xNjIwOC80OTQ0IDEyNTM3LzE2MTg3LzQ5NDQKK2YgMTI1MzgvMTYxODkvNDk0NSAxMjUzOS8xNjE5MS80OTQ1IDEyNTU1LzE2MjEwLzQ5NDUKK2YgMTI1NTUvMTYyMTAvNDk0NSAxMjU1NC8xNjIwOS80OTQ1IDEyNTM4LzE2MTg5LzQ5NDUKK2YgMTI1MzkvMTYxOTEvNDk0NiAxMjU0MC8xNjE5My80OTQ2IDEyNTU2LzE2MjExLzQ5NDYKK2YgMTI1NTYvMTYyMTEvNDk0NiAxMjU1NS8xNjIxMC80OTQ2IDEyNTM5LzE2MTkxLzQ5NDYKK2YgMTI1NDAvMTYxOTMvNDk0NyAxMjU0MS8xNjE5NS80OTQ3IDEyNTU3LzE2MjEyLzQ5NDcKK2YgMTI1NTcvMTYyMTIvNDk0OCAxMjU1Ni8xNjIxMS80OTQ4IDEyNTQwLzE2MTkzLzQ5NDgKK2YgMTI1NDEvMTYxOTUvNDk0OSAxMjU0Mi8xNjE5Ny80OTQ5IDEyNTU4LzE2MjEzLzQ5NDkKK2YgMTI1NTgvMTYyMTMvNDk0OSAxMjU1Ny8xNjIxMi80OTQ5IDEyNTQxLzE2MTk1LzQ5NDkKK2YgMTI1NDIvMTYxOTcvNDk1MCAxMjUyNy8xNjE2OS80OTUwIDEyNTQzLzE2MTk5LzQ5NTAKK2YgMTI1NDMvMTYxOTkvNDk1MCAxMjU1OC8xNjIxMy80OTUwIDEyNTQyLzE2MTk3LzQ5NTAKK2YgMTI1NDMvMTYxOTkvNDk1MSAxMjU0NC8xNjE5OC80OTUxIDEyNTYwLzE2MjE0LzQ5NTEKK2YgMTI1NjAvMTYyMTQvNDk1MSAxMjU1OS8xNjIxNS80OTUxIDEyNTQzLzE2MTk5LzQ5NTEKK2YgMTI1NDQvMTYxOTgvNDk1MiAxMjU0NS8xNjIwMC80OTUyIDEyNTYxLzE2MjE2LzQ5NTIKK2YgMTI1NjEvMTYyMTYvNDk1MiAxMjU2MC8xNjIxNC80OTUyIDEyNTQ0LzE2MTk4LzQ5NTIKK2YgMTI1NDUvMTYyMDAvNDk1MyAxMjU0Ni8xNjIwMS80OTUzIDEyNTYyLzE2MjE3LzQ5NTMKK2YgMTI1NjIvMTYyMTcvNDk1MyAxMjU2MS8xNjIxNi80OTUzIDEyNTQ1LzE2MjAwLzQ5NTMKK2YgMTI1NDYvMTYyMDEvNDk1NCAxMjU0Ny8xNjIwMi80OTU0IDEyNTYzLzE2MjE4LzQ5NTQKK2YgMTI1NjMvMTYyMTgvNDk1NCAxMjU2Mi8xNjIxNy80OTU0IDEyNTQ2LzE2MjAxLzQ5NTQKK2YgMTI1NDcvMTYyMDIvNDk1NSAxMjU0OC8xNjIwMy80OTU1IDEyNTY0LzE2MjE5LzQ5NTUKK2YgMTI1NjQvMTYyMTkvNDk1NSAxMjU2My8xNjIxOC80OTU1IDEyNTQ3LzE2MjAyLzQ5NTUKK2YgMTI1NDgvMTYyMDMvNDk1NiAxMjU0OS8xNjIwNC80OTU2IDEyNTY1LzE2MjIwLzQ5NTYKK2YgMTI1NjUvMTYyMjAvNDk1NyAxMjU2NC8xNjIxOS80OTU3IDEyNTQ4LzE2MjAzLzQ5NTcKK2YgMTI1NDkvMTYyMDQvNDk1OCAxMjU1MC8xNjIwNS80OTU4IDEyNTY2LzE2MjIxLzQ5NTgKK2YgMTI1NjYvMTYyMjEvNDk1OCAxMjU2NS8xNjIyMC80OTU4IDEyNTQ5LzE2MjA0LzQ5NTgKK2YgMTI1NTAvMTYyMDUvNDk1OSAxMjU1MS8xNjIwNi80OTU5IDEyNTY3LzE2MjIyLzQ5NTkKK2YgMTI1NjcvMTYyMjIvNDk1OSAxMjU2Ni8xNjIyMS80OTU5IDEyNTUwLzE2MjA1LzQ5NTkKK2YgMTI1NTEvMTYyMDYvNDk2MCAxMjU1Mi8xNjIwNy80OTYwIDEyNTY4LzE2MjIzLzQ5NjAKK2YgMTI1NjgvMTYyMjMvNDk2MCAxMjU2Ny8xNjIyMi80OTYwIDEyNTUxLzE2MjA2LzQ5NjAKK2YgMTI1NTIvMTYyMDcvNDk2MSAxMjU1My8xNjIwOC80OTYxIDEyNTY5LzE2MjI0LzQ5NjEKK2YgMTI1NjkvMTYyMjQvNDk2MSAxMjU2OC8xNjIyMy80OTYxIDEyNTUyLzE2MjA3LzQ5NjEKK2YgMTI1NTMvMTYyMDgvNDk2MiAxMjU1NC8xNjIwOS80OTYyIDEyNTcwLzE2MjI1LzQ5NjIKK2YgMTI1NzAvMTYyMjUvNDk2MiAxMjU2OS8xNjIyNC80OTYyIDEyNTUzLzE2MjA4LzQ5NjIKK2YgMTI1NTQvMTYyMDkvNDk2MyAxMjU1NS8xNjIxMC80OTYzIDEyNTcxLzE2MjI2LzQ5NjMKK2YgMTI1NzEvMTYyMjYvNDk2MyAxMjU3MC8xNjIyNS80OTYzIDEyNTU0LzE2MjA5LzQ5NjMKK2YgMTI1NTUvMTYyMTAvNDk2NCAxMjU1Ni8xNjIxMS80OTY0IDEyNTcyLzE2MjI3LzQ5NjQKK2YgMTI1NzIvMTYyMjcvNDk2NCAxMjU3MS8xNjIyNi80OTY0IDEyNTU1LzE2MjEwLzQ5NjQKK2YgMTI1NTYvMTYyMTEvNDk2NSAxMjU1Ny8xNjIxMi80OTY1IDEyNTczLzE2MjI4LzQ5NjUKK2YgMTI1NzMvMTYyMjgvNDk2NSAxMjU3Mi8xNjIyNy80OTY1IDEyNTU2LzE2MjExLzQ5NjUKK2YgMTI1NTcvMTYyMTIvNDk2NiAxMjU1OC8xNjIxMy80OTY2IDEyNTc0LzE2MjI5LzQ5NjYKK2YgMTI1NzQvMTYyMjkvNDk2NiAxMjU3My8xNjIyOC80OTY2IDEyNTU3LzE2MjEyLzQ5NjYKK2YgMTI1NTgvMTYyMTMvNDk2NyAxMjU0My8xNjE5OS80OTY3IDEyNTU5LzE2MjE1LzQ5NjcKK2YgMTI1NTkvMTYyMTUvNDk2NyAxMjU3NC8xNjIyOS80OTY3IDEyNTU4LzE2MjEzLzQ5NjcKK2YgMTI1NjAvMTYyMTQvNjg3IDEyNTYxLzE2MjE2LzY4NyAxMjU2Mi8xNjIxNy82ODcKK2YgMTI1NjIvMTYyMTcvNjg3IDEyNTc3LzE2MjMwLzY4NyAxMjU2MC8xNjIxNC82ODcKK2YgMTI1NzUvMTYyMzEvNjg3IDEyNTc2LzE2MjMyLzY4NyAxMjU2My8xNjIxOC82ODcKK2YgMTI1NjMvMTYyMTgvNjg3IDEyNTY0LzE2MjE5LzY4NyAxMjU3NS8xNjIzMS82ODcKK2YgMTI1NjIvMTYyMTcvNjg3IDEyNTYzLzE2MjE4LzY4NyAxMjU3Ni8xNjIzMi82ODcKK2YgMTI1NzYvMTYyMzIvNjg3IDEyNTc3LzE2MjMwLzY4NyAxMjU2Mi8xNjIxNy82ODcKK2YgMTI1NjYvMTYyMjEvNjg3IDEyNTc1LzE2MjMxLzY4NyAxMjU2NC8xNjIxOS82ODcKK2YgMTI1NjQvMTYyMTkvNjg3IDEyNTY1LzE2MjIwLzY4NyAxMjU2Ni8xNjIyMS82ODcKK2YgMTI1NzAvMTYyMjUvNjg3IDEyNTgzLzE2MjMzLzY4NyAxMjU2OC8xNjIyMy82ODcKK2YgMTI1NjgvMTYyMjMvNjg3IDEyNTY5LzE2MjI0LzY4NyAxMjU3MC8xNjIyNS82ODcKK2YgMTI1NzEvMTYyMjYvNjg3IDEyNTgyLzE2MjM0LzY4NyAxMjU4My8xNjIzMy82ODcKK2YgMTI1ODMvMTYyMzMvNjg3IDEyNTcwLzE2MjI1LzY4NyAxMjU3MS8xNjIyNi82ODcKK2YgMTI1ODEvMTYyMzUvNjg3IDEyNTgyLzE2MjM0LzY4NyAxMjU3MS8xNjIyNi82ODcKK2YgMTI1NzEvMTYyMjYvNjg3IDEyNTcyLzE2MjI3LzY4NyAxMjU4MS8xNjIzNS82ODcKK2YgMTI1NzQvMTYyMjkvNjg3IDEyNTgxLzE2MjM1LzY4NyAxMjU3Mi8xNjIyNy82ODcKK2YgMTI1NzIvMTYyMjcvNjg3IDEyNTczLzE2MjI4LzY4NyAxMjU3NC8xNjIyOS82ODcKK2YgMTI1NzcvMTYyMzAvNjg3IDEyNTc4LzE2MjM2LzY4NyAxMjU1OS8xNjIxNS82ODcKK2YgMTI1NTkvMTYyMTUvNjg3IDEyNTYwLzE2MjE0LzY4NyAxMjU3Ny8xNjIzMC82ODcKK2YgMTI1NzYvMTYyMzIvNjg3IDEyNTc5LzE2MjM3LzY4NyAxMjU3OC8xNjIzNi82ODcKK2YgMTI1NzgvMTYyMzYvNjg3IDEyNTc3LzE2MjMwLzY4NyAxMjU3Ni8xNjIzMi82ODcKK2YgMTI1NzUvMTYyMzEvNjg3IDEyNTgwLzE2MjM4LzY4NyAxMjU3OS8xNjIzNy82ODcKK2YgMTI1NzkvMTYyMzcvNjg3IDEyNTc2LzE2MjMyLzY4NyAxMjU3NS8xNjIzMS82ODcKK2YgMTI1NjYvMTYyMjEvNjg3IDEyNTY3LzE2MjIyLzY4NyAxMjU4MC8xNjIzOC82ODcKK2YgMTI1ODAvMTYyMzgvNjg3IDEyNTc1LzE2MjMxLzY4NyAxMjU2Ni8xNjIyMS82ODcKK2YgMTI1NzQvMTYyMjkvNjg3IDEyNTU5LzE2MjE1LzY4NyAxMjU3OC8xNjIzNi82ODcKK2YgMTI1NzgvMTYyMzYvNjg3IDEyNTgxLzE2MjM1LzY4NyAxMjU3NC8xNjIyOS82ODcKK2YgMTI1NzkvMTYyMzcvNjg3IDEyNTgyLzE2MjM0LzY4NyAxMjU4MS8xNjIzNS82ODcKK2YgMTI1ODEvMTYyMzUvNjg3IDEyNTc4LzE2MjM2LzY4NyAxMjU3OS8xNjIzNy82ODcKK2YgMTI1ODAvMTYyMzgvNjg3IDEyNTgzLzE2MjMzLzY4NyAxMjU4Mi8xNjIzNC82ODcKK2YgMTI1ODIvMTYyMzQvNjg3IDEyNTc5LzE2MjM3LzY4NyAxMjU4MC8xNjIzOC82ODcKK2YgMTI1ODMvMTYyMzMvNjg3IDEyNTgwLzE2MjM4LzY4NyAxMjU2Ny8xNjIyMi82ODcKK2YgMTI1NjcvMTYyMjIvNjg3IDEyNTY4LzE2MjIzLzY4NyAxMjU4My8xNjIzMy82ODcKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL3ZlcnQuZ2xzbCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Bob25lLW1vZGVsL3ZlcnQuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMzZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcGhvbmUtbW9kZWwvdmVydC5nbHNsCkBAIC0wLDAgKzEsMjggQEAKK2F0dHJpYnV0ZSB2ZWMzIHZ0eF9wb3M7CithdHRyaWJ1dGUgdmVjMyB2dHhfbm9ybWFsOworYXR0cmlidXRlIHZlYzIgdnR4X3V2OworCit2YXJ5aW5nIHZlYzMgdmFyeWluZ19wb3M7Cit2YXJ5aW5nIHZlYzMgdmFyeWluZ19ub3JtYWw7Cit2YXJ5aW5nIHZlYzIgdmFyeWluZ191djsKKwordW5pZm9ybSBtYXQ0IG1vZGVsX3ZpZXdfaW52ZXJzZV90cmFuc3Bvc2U7Cit1bmlmb3JtIG1hdDQgbW9kZWxfdmlldzsKK3VuaWZvcm0gbWF0NCBtb2RlbF92aWV3X3Byb2plY3Rpb247Cit2b2lkIG1haW4oKSB7CisgICAgLy8gQmxlbmRlciBzZWVtcyB0byBleHBvcnQgVVYgY29vcmRpbmF0ZXMgaW4gYSB3ZWlyZAorICAgIC8vIHdheSAoViBpcyBpbnZlcnRlZCBjb21wYXJlZCB0byBob3cgT3BlbkdMIHNlZXMgaXQpLgorICAgIC8vIEl0J3MgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIGluIHRoZSBzaGFkZXIuLi4KKyAgICB2YXJ5aW5nX3V2ID0gdmVjMih2dHhfdXYueCwgMS4wIC0gdnR4X3V2LnkpOworICAgIHZlYzQgbm9ybWFsID0gdmVjNCh2dHhfbm9ybWFsLngsIHZ0eF9ub3JtYWwueSwgdnR4X25vcm1hbC56LCAwKTsKKworICAgIC8vIEFwcGx5IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBub3JtYWwuCisgICAgdmFyeWluZ19ub3JtYWwgPSAobW9kZWxfdmlld19pbnZlcnNlX3RyYW5zcG9zZSAqIG5vcm1hbCkueHl6OworCisgICAgLy8gQXBwbHkgdGhlIG1vZGVsdmlldyB0cmFuc2Zvcm0gdG8gdGhlIHZlcnRleCB0byBjb21wdXRlIHRoZQorICAgIC8vIGZpbmFsIHBvc2l0aW9uLgorICAgIHZlYzQgcG9zNCA9IHZlYzQodnR4X3Bvcy54LCB2dHhfcG9zLnksIHZ0eF9wb3MueiwgMSk7CisgICAgdmVjNCB2cG9zNCA9IG1vZGVsX3ZpZXcgKiBwb3M0OworICAgIHZhcnlpbmdfcG9zID0gdnBvczQueHl6L3Zwb3M0Lnc7CisgICAgZ2xfUG9zaXRpb24gPSBtb2RlbF92aWV3X3Byb2plY3Rpb24gKiBwb3M0OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3F0LXNldHRpbmdzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9xdC1zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjMzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9xdC1zZXR0aW5ncy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8vIFRoaXMgZmlsZSBjb250YWlucyB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBmb3Igc2F2aW5nIGFuZAorLy8gcmVzdG9yaW5nIHVzZXIgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBRdC1iYXNlZCBVSS4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UVN0cmluZz4KKworbmFtZXNwYWNlIFVpIHsKK25hbWVzcGFjZSBTZXR0aW5ncyB7CisKK2NvbnN0IFFTdHJpbmcgT1JHX05BTUUoIkFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCIpOworY29uc3QgUVN0cmluZyBPUkdfRE9NQUlOKCJhbmRyb2lkLmNvbSIpOworY29uc3QgUVN0cmluZyBBUFBfTkFNRSgiRW11bGF0b3IiKTsKKworY29uc3QgUVN0cmluZyBTSE9XX0FEQl9XQVJOSU5HKCJzaG93QWRiV2FybmluZyIpOworY29uc3QgUVN0cmluZyBTSE9XX0FWRF9BUkNIX1dBUk5JTkcoInNob3dBdmRBcmNoV2FybmluZyIpOworY29uc3QgUVN0cmluZyBTSE9XX0dQVV9XQVJOSU5HKCJzaG93R3B1V2FybmluZyIpOworCisvLyBOb3RlOiBUaGUgInNldC8iIGhlcmUgaXMgYmVjYXVzZSB0aGVzZSBzZXR0aW5ncyBhcmUKKy8vICAgICAgIGFzc29jaWF0ZWQgd2l0aCAic2V0dGluZ3MtcGFnZSIsIG5vdCBiZWNhdXNlCisvLyAgICAgICB3ZSdyZSBpbiAibmFtZXNwYWNlIFNldHRpbmdzIi4KKworY29uc3QgUVN0cmluZyBBREJfUEFUSCgic2V0L2FkYlBhdGgiKTsKK2NvbnN0IFFTdHJpbmcgQVVUT19GSU5EX0FEQigic2V0L2F1dG9GaW5kQWRiIik7Citjb25zdCBRU3RyaW5nIEFMV0FZU19PTl9UT1AoInNldC9hbHdheXNPblRvcCIpOworY29uc3QgUVN0cmluZyBGT1JXQVJEX1NIT1JUQ1VUU19UT19ERVZJQ0UoInNldC9mb3J3YXJkU2hvcnRjdXRzVG9EZXZpY2UiKTsKK2NvbnN0IFFTdHJpbmcgU0FWRV9QQVRIKCJzZXQvc2F2ZVBhdGgiKTsKK2NvbnN0IFFTdHJpbmcgVUlfVEhFTUUoInNldC90aGVtZSIpOworCitjb25zdCBRU3RyaW5nIENFTExVTEFSX05FVFdPUktfVFlQRSAgICgiY2VsbC9uZXR3b3JrX3R5cGUiKTsKK2NvbnN0IFFTdHJpbmcgQ0VMTFVMQVJfU0lHTkFMX1NUUkVOR1RIKCJjZWxsL3NpZ25hbF9zdHJlbmd0aCIpOworY29uc3QgUVN0cmluZyBDRUxMVUxBUl9WT0lDRV9TVEFUVVMgICAoImNlbGwvdm9pY2Vfc3RhdHVzIik7Citjb25zdCBRU3RyaW5nIENFTExVTEFSX0RBVEFfU1RBVFVTICAgICgiY2VsbC9kYXRhX3N0YXR1cyIpOworCitjb25zdCBRU3RyaW5nIENSQVNIUkVQT1JUX1BSRUZFUkVOQ0UoInNldC9jcmFzaFJlcG9ydFByZWZlcmVuY2UiKTsKK2VudW0gQ1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9WQUxVRSB7CisgICAgQ1JBU0hSRVBPUlRfUFJFRkVSRU5DRV9BU0sgPSAwLAorICAgIENSQVNIUkVQT1JUX1BSRUZFUkVOQ0VfQUxXQVlTID0gMSwKKyAgICBDUkFTSFJFUE9SVF9QUkVGRVJFTkNFX05FVkVSID0gMgorfTsKK2NvbnN0IFFTdHJpbmcgQ1JBU0hSRVBPUlRfU0FWRVBSRUZFUkVOQ0VfQ0hFQ0tFRCgic2V0L2NyYXNoUmVwb3J0U2F2ZVByZWZlcmVuY2VDaGVja2VkIik7Citjb25zdCBpbnQgQ1JBU0hSRVBPUlRfQ09NQk9CT1hfQUxXQVlTID0gMDsKK2NvbnN0IGludCBDUkFTSFJFUE9SVF9DT01CT0JPWF9ORVZFUiA9IDE7Citjb25zdCBpbnQgQ1JBU0hSRVBPUlRfQ09NQk9CT1hfQVNLID0gMjsKKworY29uc3QgUVN0cmluZyBMT0NBVElPTl9FTlRFUkVEX0FMVElUVURFKCJsb2MvYWx0aXR1ZGUiKTsKK2NvbnN0IFFTdHJpbmcgTE9DQVRJT05fRU5URVJFRF9MQVRJVFVERSgibG9jL2xhdGl0dWRlIik7Citjb25zdCBRU3RyaW5nIExPQ0FUSU9OX0VOVEVSRURfTE9OR0lUVURFKCJsb2MvbG9uZ2l0dWRlIik7Citjb25zdCBRU3RyaW5nIExPQ0FUSU9OX1BMQVlCQUNLX0ZJTEUoImxvYy9wbGF5YmFja19maWxlX3BhdGgiKTsKK2NvbnN0IFFTdHJpbmcgTE9DQVRJT05fUExBWUJBQ0tfU1BFRUQoImxvYy9wbGF5YmFja19zcGVlZCIpOworY29uc3QgUVN0cmluZyBMT0NBVElPTl9SRUNFTlRfQUxUSVRVREUoImxvYy9yZWNlbnRfYWx0aXR1ZGUiKTsKK2NvbnN0IFFTdHJpbmcgTE9DQVRJT05fUkVDRU5UX0xBVElUVURFKCJsb2MvcmVjZW50X2xhdGl0dWRlIik7Citjb25zdCBRU3RyaW5nIExPQ0FUSU9OX1JFQ0VOVF9MT05HSVRVREUoImxvYy9yZWNlbnRfbG9uZ2l0dWRlIik7Cit9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9xdC1zdGQtaGFzaC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcXQtc3RkLWhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA1MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcXQtc3RkLWhhc2guaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFFdmVudD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKKy8vIFNwZWNpYWxpemUgc3RkOjpoYXNoIGZvciBzb21lIFF0IHR5cGVzLgorbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPFFFdmVudDo6VHlwZT4geworICAgIHNpemVfdCBvcGVyYXRvcigpKFFFdmVudDo6VHlwZSB0eXBlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBoYXNoPGludD4oKShzdGF0aWNfY2FzdDxpbnQ+KHR5cGUpKTsKKyAgICB9Cit9OworCit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3F0LXVpLWNvbW1hbmRzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3F0LXVpLWNvbW1hbmRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNjMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuaCIKKyNpbmNsdWRlIDxtYXA+CisKK2Jvb2wgcGFyc2VRdFVJQ29tbWFuZChjb25zdCBRU3RyaW5nJiBzdHJpbmcsIFF0VUlDb21tYW5kKiBjb21tYW5kKSB7CisgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihzdGQ6OmJlZ2luKE5hbWVUb1F0VUlDbWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoTmFtZVRvUXRVSUNtZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmluZ10gKGNvbnN0IHN0ZDo6cGFpcjxRU3RyaW5nLCBRdFVJQ29tbWFuZD4mIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZpcnN0ID09IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGJvb2wgcmVzdWx0ID0gKGl0ICE9IHN0ZDo6ZW5kKE5hbWVUb1F0VUlDbWQpKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICpjb21tYW5kID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitRU3RyaW5nIGdldFF0VUlDb21tYW5kRGVzY3JpcHRpb24oUXRVSUNvbW1hbmQgY29tbWFuZCkgeworICAgIFFTdHJpbmcgcmVzdWx0OworICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoc3RkOjpiZWdpbihRdFVJQ21kVG9EZXNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKFF0VUlDbWRUb0Rlc2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgW2NvbW1hbmRdKGNvbnN0IHN0ZDo6cGFpcjxRdFVJQ29tbWFuZCwgUVN0cmluZz4mIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmZpcnN0ID09IGNvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoaXQgIT0gc3RkOjplbmQoUXRVSUNtZFRvRGVzYykpIHsKKyAgICAgICAgcmVzdWx0ID0gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3F0LXVpLWNvbW1hbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg0NWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3F0LXVpLWNvbW1hbmRzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRU3RyaW5nPgorCitlbnVtIGNsYXNzIFF0VUlDb21tYW5kIHsKKyAgICBTSE9XX1BBTkVfTE9DQVRJT04sCisgICAgU0hPV19QQU5FX0NFTExVTEFSLAorICAgIFNIT1dfUEFORV9CQVRURVJZLAorICAgIFNIT1dfUEFORV9QSE9ORSwKKyAgICBTSE9XX1BBTkVfVklSVFNFTlNPUlMsCisgICAgU0hPV19QQU5FX0RQQUQsCisgICAgU0hPV19QQU5FX0ZJTkdFUiwKKyAgICBTSE9XX1BBTkVfU0VUVElOR1MsCisgICAgU0hPV19QQU5FX0hFTFAsCisgICAgU0hPV19NVUxUSVRPVUNILAorICAgIFRBS0VfU0NSRUVOU0hPVCwKKyAgICBFTlRFUl9aT09NLAorICAgIFpPT01fSU4sCisgICAgWk9PTV9PVVQsCisgICAgUEFOX1VQLAorICAgIFBBTl9ET1dOLAorICAgIFBBTl9MRUZULAorICAgIFBBTl9SSUdIVCwKKyAgICBWT0xVTUVfVVAsCisgICAgVk9MVU1FX0RPV04sCisgICAgUE9XRVIsCisgICAgTUVOVSwKKyAgICBIT01FLAorICAgIEJBQ0ssCisgICAgT1ZFUlZJRVcsCisgICAgUk9UQVRFX1JJR0hULAorICAgIFJPVEFURV9MRUZULAorICAgIFRPR0dMRV9UUkFDS0JBTEwsCit9OworCisjZGVmaW5lIE5BTUVfVE9fQ01EKHgpIHsjeCwgUXRVSUNvbW1hbmQ6Onh9CitzdGF0aWMgY29uc3Qgc3RkOjpwYWlyPFFTdHJpbmcsIFF0VUlDb21tYW5kPiBOYW1lVG9RdFVJQ21kW10gPSB7CisgICAgICAgIE5BTUVfVE9fQ01EKFNIT1dfUEFORV9MT0NBVElPTiksCisgICAgICAgIE5BTUVfVE9fQ01EKFNIT1dfUEFORV9DRUxMVUxBUiksCisgICAgICAgIE5BTUVfVE9fQ01EKFNIT1dfUEFORV9CQVRURVJZKSwKKyAgICAgICAgTkFNRV9UT19DTUQoU0hPV19QQU5FX1BIT05FKSwKKyAgICAgICAgTkFNRV9UT19DTUQoU0hPV19QQU5FX1ZJUlRTRU5TT1JTKSwKKyAgICAgICAgTkFNRV9UT19DTUQoU0hPV19QQU5FX0RQQUQpLAorICAgICAgICBOQU1FX1RPX0NNRChTSE9XX1BBTkVfRklOR0VSKSwKKyAgICAgICAgTkFNRV9UT19DTUQoU0hPV19QQU5FX1NFVFRJTkdTKSwKKyAgICAgICAgTkFNRV9UT19DTUQoU0hPV19QQU5FX0hFTFApLAorICAgICAgICBOQU1FX1RPX0NNRChTSE9XX01VTFRJVE9VQ0gpLAorICAgICAgICBOQU1FX1RPX0NNRChST1RBVEVfTEVGVCksCisgICAgICAgIE5BTUVfVE9fQ01EKFJPVEFURV9SSUdIVCksCisgICAgICAgIE5BTUVfVE9fQ01EKFRBS0VfU0NSRUVOU0hPVCksCisgICAgICAgIE5BTUVfVE9fQ01EKEVOVEVSX1pPT00pLAorICAgICAgICBOQU1FX1RPX0NNRChaT09NX0lOKSwKKyAgICAgICAgTkFNRV9UT19DTUQoWk9PTV9PVVQpLAorICAgICAgICBOQU1FX1RPX0NNRChQQU5fVVApLAorICAgICAgICBOQU1FX1RPX0NNRChQQU5fRE9XTiksCisgICAgICAgIE5BTUVfVE9fQ01EKFBBTl9MRUZUKSwKKyAgICAgICAgTkFNRV9UT19DTUQoUEFOX1JJR0hUKSwKKyAgICAgICAgTkFNRV9UT19DTUQoVk9MVU1FX1VQKSwKKyAgICAgICAgTkFNRV9UT19DTUQoVk9MVU1FX0RPV04pLAorICAgICAgICBOQU1FX1RPX0NNRChQT1dFUiksCisgICAgICAgIE5BTUVfVE9fQ01EKE1FTlUpLAorICAgICAgICBOQU1FX1RPX0NNRChIT01FKSwKKyAgICAgICAgTkFNRV9UT19DTUQoQkFDSyksCisgICAgICAgIE5BTUVfVE9fQ01EKE9WRVJWSUVXKSwKKyAgICAgICAgTkFNRV9UT19DTUQoVE9HR0xFX1RSQUNLQkFMTCksfTsKKyN1bmRlZiBOQU1FX1RPX0NNRAorCisjZGVmaW5lIENNRF9UT19ERVNDKHgsIHkpIHtRdFVJQ29tbWFuZDo6eCwgcUFwcC0+dHJhbnNsYXRlKCJRdFVJQ29tbWFuZCIsIHkpfQorc3RhdGljIGNvbnN0IHN0ZDo6cGFpcjxRdFVJQ29tbWFuZCwgUVN0cmluZz4gUXRVSUNtZFRvRGVzY1tdID0geworICAgICAgICBDTURfVE9fREVTQyhTSE9XX1BBTkVfTE9DQVRJT04sICJMb2NhdGlvbiIpLAorICAgICAgICBDTURfVE9fREVTQyhTSE9XX1BBTkVfQ0VMTFVMQVIsICJDZWxsdWxhciIpLAorICAgICAgICBDTURfVE9fREVTQyhTSE9XX1BBTkVfQkFUVEVSWSwgIkJhdHRlcnkiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoU0hPV19QQU5FX1BIT05FLCAiUGhvbmUiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoU0hPV19QQU5FX1ZJUlRTRU5TT1JTLCAiVmlydHVhbCBzZW5zb3JzIiksCisgICAgICAgIENNRF9UT19ERVNDKFNIT1dfUEFORV9EUEFELCAiRC1QYWQiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoU0hPV19QQU5FX0ZJTkdFUiwgIkZpbmdlcnByaW50IiksCisgICAgICAgIENNRF9UT19ERVNDKFNIT1dfUEFORV9TRVRUSU5HUywgIlNldHRpbmdzIiksCisgICAgICAgIENNRF9UT19ERVNDKFNIT1dfUEFORV9IRUxQLCAiSGVscCIpLAorICAgICAgICBDTURfVE9fREVTQyhTSE9XX01VTFRJVE9VQ0gsCisgICAgICAgICAgICAgICAgICAgICJNdWx0aXRvdWNoIChsZWZ0IGNsaWNrIHRvIHBpbmNoL3pvb20sIHJpZ2h0IGNsaWNrIHRvICIKKyAgICAgICAgICAgICAgICAgICAgInZlcnRpY2FsIHN3aXBlKSIpLAorICAgICAgICBDTURfVE9fREVTQyhST1RBVEVfTEVGVCwgIlJvdGF0ZSBsZWZ0IiksCisgICAgICAgIENNRF9UT19ERVNDKFJPVEFURV9SSUdIVCwgIlJvdGF0ZSByaWdodCIpLAorICAgICAgICBDTURfVE9fREVTQyhUQUtFX1NDUkVFTlNIT1QsICJUYWtlIHNjcmVlbnNob3QiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoRU5URVJfWk9PTSwgIkVudGVyIHpvb20gbW9kZSIpLAorICAgICAgICBDTURfVE9fREVTQyhaT09NX0lOLAorICAgICAgICAgICAgICAgICAgICAiWm9vbSBpbiAod2hlbiBpbiB6b29tIG1vZGUpLCBvciBzY2FsZSB1cCAod2hlbiBub3QpIiksCisgICAgICAgIENNRF9UT19ERVNDKFpPT01fT1VULAorICAgICAgICAgICAgICAgICAgICAiWm9vbSBvdXQgKHdoZW4gaW4gem9vbSBtb2RlKSwgb3Igc2NhbGUgZG93biAod2hlbiBub3QpIiksCisgICAgICAgIENNRF9UT19ERVNDKFBBTl9VUCwgIlBhbiB1cCAod2hlbiBpbiB6b29tIG1vZGUpIiksCisgICAgICAgIENNRF9UT19ERVNDKFBBTl9ET1dOLCAiUGFuIGRvd24gKHdoZW4gaW4gem9vbSBtb2RlKSIpLAorICAgICAgICBDTURfVE9fREVTQyhQQU5fTEVGVCwgIlBhbiBsZWZ0ICh3aGVuIGluIHpvb20gbW9kZSkiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoUEFOX1JJR0hULCAiUGFuIHJpZ2h0ICh3aGVuIGluIHpvb20gbW9kZSkiKSwKKyAgICAgICAgQ01EX1RPX0RFU0MoVk9MVU1FX1VQLCAiVm9sdW1lIHVwIiksCisgICAgICAgIENNRF9UT19ERVNDKFZPTFVNRV9ET1dOLCAiVm9sdW1lIGRvd24iKSwgQ01EX1RPX0RFU0MoUE9XRVIsICJQb3dlciIpLAorICAgICAgICBDTURfVE9fREVTQyhIT01FLCAiSG9tZSIpLCBDTURfVE9fREVTQyhCQUNLLCAiQmFjayIpLAorICAgICAgICBDTURfVE9fREVTQyhNRU5VLCAiTWVudSIpLCBDTURfVE9fREVTQyhPVkVSVklFVywgIk92ZXJ2aWV3IiksCisgICAgICAgIENNRF9UT19ERVNDKFRPR0dMRV9UUkFDS0JBTEwsICJUb2dnbGUgdHJhY2tiYWxsIG1vZGUgKGlmIEFWRCBpcyBjb25maWd1cmVkIGZvciBpdCkiKSwKKyAgICAgICAgICAgICAgICAgICAgQ01EX1RPX0RFU0MoVE9HR0xFX1RSQUNLQkFMTCwgIlRvZ2dsZSBUcmFja2JhbGwiKSx9OworI3VuZGVmIENNRF9UT19ERVNDCisKK2Jvb2wgcGFyc2VRdFVJQ29tbWFuZChjb25zdCBRU3RyaW5nJiBzdHJpbmcsIFF0VUlDb21tYW5kKiBjb21tYW5kKTsKK1FTdHJpbmcgZ2V0UXRVSUNvbW1hbmREZXNjcmlwdGlvbihRdFVJQ29tbWFuZCBjb21tYW5kKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3JhaXNlZC1tYXRlcmlhbC1idXR0b24uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3JhaXNlZC1tYXRlcmlhbC1idXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjAwYmZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcmFpc2VkLW1hdGVyaWFsLWJ1dHRvbi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFHcmFwaGljc0Ryb3BTaGFkb3dFZmZlY3Q+CisjaW5jbHVkZSA8UVB1c2hCdXR0b24+CisKKy8vIEl0J3MganVzdCBhIFFQdXNoQnV0dG9uIHdpdGggYSBkcm9wIHNoYWRvdy4KK2NsYXNzIFJhaXNlZE1hdGVyaWFsQnV0dG9uIDogcHVibGljIFFQdXNoQnV0dG9uIHsKK1FfT0JKRUNUCitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFpc2VkTWF0ZXJpYWxCdXR0b24oUVdpZGdldCogcGFyZW50ID0gMCkgOgorICAgICAgICBRUHVzaEJ1dHRvbihwYXJlbnQpLAorICAgICAgICBtU2hhZG93RWZmZWN0KG5ldyBRR3JhcGhpY3NEcm9wU2hhZG93RWZmZWN0KCkpIHsKKyAgICAgICAgbVNoYWRvd0VmZmVjdC0+c2V0Qmx1clJhZGl1cyg0LjUpOworICAgICAgICBtU2hhZG93RWZmZWN0LT5zZXRPZmZzZXQoMS4wLCAxLjApOworICAgICAgICBzZXRHcmFwaGljc0VmZmVjdChtU2hhZG93RWZmZWN0KTsKKyAgICAgICAgY29ubmVjdCh0aGlzLCBTSUdOQUwocHJlc3NlZCgpKSwgdGhpcywgU0xPVChvblByZXNzZWQoKSkpOworICAgICAgICBjb25uZWN0KHRoaXMsIFNJR05BTChyZWxlYXNlZCgpKSwgdGhpcywgU0xPVChvblJlbGVhc2VkKCkpKTsKKyAgICB9CisKKyAgICBRR3JhcGhpY3NEcm9wU2hhZG93RWZmZWN0KiBzaGFkb3dFZmZlY3QoKSB7IHJldHVybiBtU2hhZG93RWZmZWN0OyB9CisgICAgY29uc3QgUUdyYXBoaWNzRHJvcFNoYWRvd0VmZmVjdCogc2hhZG93RWZmZWN0KCkgY29uc3QgeyByZXR1cm4gbVNoYWRvd0VmZmVjdDsgfQorCitwcml2YXRlIHNsb3RzOgorICAgIHZvaWQgb25QcmVzc2VkKCkgeworICAgICAgICBtU2hhZG93RWZmZWN0LT5zZXRCbHVyUmFkaXVzKDMuMCk7CisgICAgfQorCisgICAgdm9pZCBvblJlbGVhc2VkKCkgeworICAgICAgICBtU2hhZG93RWZmZWN0LT5zZXRCbHVyUmFkaXVzKDQuNSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFFHcmFwaGljc0Ryb3BTaGFkb3dFZmZlY3QqIG1TaGFkb3dFZmZlY3Q7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvcmVzb3VyY2VzLnFyYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Jlc291cmNlcy5xcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlYWYwYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Jlc291cmNlcy5xcmMKQEAgLTAsMCArMSwyMTcgQEAKKzwhLS1Db3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgICAgbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCistLT4KKzxSQ0M+CisgICAgPHFyZXNvdXJjZSBwcmVmaXg9Ii8iPgorICAgICAgICA8IS0tIFF0IHdhbnRzIGFuIGV4dHJhICdxdC8nIGluIHRoaXMgcGF0aCBuYW1lIC0tPgorICAgICAgICA8ZmlsZSBhbGlhcz0icXQvZXRjL3F0LmNvbmYiPmV0Yy9xdC5jb25mPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ic3R5bGVzL3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzIj5zdHlsZXMvc3R5bGVzaGVldF90ZW1wbGF0ZS5jc3M8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzdHlsZXMvZm9udHNfc3R5bGVzaGVldF90ZW1wbGF0ZS5jc3MiPnN0eWxlcy9mb250c19zdHlsZXNoZWV0X3RlbXBsYXRlLmNzczwvZmlsZT4KKyAgICA8L3FyZXNvdXJjZT4KKyAgICA8cXJlc291cmNlIHByZWZpeD0iL2xpYi9mb250cyI+CisgICAgICAgICA8IS0tIFRoZSBuYW1lcyAnUm9ib3RvKicgYXJlIHVzZWQgdG8gbG9hZCB0aGUgZm9udHMgaW4KKyAgICAgICAgICAgICAgYW5kcm9pZC9za2luL3F0L3dpbnN5cy1xdC5jcHAgLS0+CisgICAgICAgIDxmaWxlIGFsaWFzPSJSb2JvdG8iPmZvbnRzL1JvYm90by1SZWd1bGFyLnR0ZjwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9IlJvYm90by1Cb2xkIj5mb250cy9Sb2JvdG8tQm9sZC50dGY8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJSb2JvdG8tTWVkaXVtIj5mb250cy9Sb2JvdG8tTWVkaXVtLnR0ZjwvZmlsZT4KKyAgICA8L3FyZXNvdXJjZT4KKyAgICA8cXJlc291cmNlIHByZWZpeD0iL2xpZ2h0Ij4KKyAgICAgICAgPCEtLSBNYWluIGxpc3Qgb2YgdG9vbCBidXR0b25zIC0tPgorICAgICAgICA8ZmlsZSBhbGlhcz0iYmFjayI+aW1hZ2VzL2xpZ2h0L1N5c3RlbV9CYWNrXzY3OC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjbG9zZSI+aW1hZ2VzL2xpZ2h0L2ljX2Nsb3NlXzY3OF80OHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImhlbHAiPmltYWdlcy9saWdodC9pY19oZWxwXzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImhvbWUiPmltYWdlcy9saWdodC9TeXN0ZW1fSG9tZV82Nzguc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ibWluaW1pemUiPmltYWdlcy9saWdodC9pY19yZW1vdmVfNjc4XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ibW9yZSI+aW1hZ2VzL2xpZ2h0L2ljX21vcmVfaG9yaXpfNjc4XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ib3ZlcnZpZXciPmltYWdlcy9saWdodC9TeXN0ZW1fT3ZlcnZpZXdfNjc4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBvd2VyX3NldHRpbmdzIj5pbWFnZXMvbGlnaHQvaWNfcG93ZXJfc2V0dGluZ3NfbmV3XzY3OF80OHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNjcmVlbl9yb3RhdGlvbiI+aW1hZ2VzL2xpZ2h0L2ljX3NjcmVlbl9yb3RhdGlvbl82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzY3JlZW5fcm90YXRpb25fbGVmdCI+aW1hZ2VzL2xpZ2h0L1JvdGF0ZV9MZWZ0XzY3OC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzY3JlZW5fcm90YXRpb25fcmlnaHQiPmltYWdlcy9saWdodC9Sb3RhdGVfUmlnaHRfNjc4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNjcmVlbl9zaG90Ij5pbWFnZXMvbGlnaHQvaWNfcGhvdG9fY2FtZXJhXzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InZvbHVtZV9kb3duIj5pbWFnZXMvbGlnaHQvaWNfdm9sdW1lX2Rvd25fNjc4XzQ4cHguc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0idm9sdW1lX3VwIj5pbWFnZXMvbGlnaHQvaWNfdm9sdW1lX3VwXzY3OF80OHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9Inpvb20iPmltYWdlcy9saWdodC9pY196b29tX2luXzY3OF80OGRwLnN2ZzwvZmlsZT4KKworICAgICAgICA8IS0tIFVzZWQgaW4gdGhlICJleHRlbmRlZCIgd2luZG93IC0tPgorICAgICAgICA8ZmlsZSBhbGlhcz0iYWRkIj5pbWFnZXMvbGlnaHQvaWNfYWRkXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImFycm93X2Ryb3BfZG93biI+aW1hZ2VzL2xpZ2h0L2ljX2Fycm93X2Ryb3BfZG93bl9ibGFja18xOHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImFycm93X2Ryb3BfdXAiPmltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX3VwX2JsYWNrXzE4cHguc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iYWRkX2Rpc2FibGVkIj5pbWFnZXMvbGlnaHQvaWNfYWRkX0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImJhdHRlcnkiPmltYWdlcy9saWdodC9pY19iYXR0ZXJ5XzgwXzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImNhbGxfZW5kIj5pbWFnZXMvbGlnaHQvaWNfY2FsbF9lbmRfMEJBXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iY2FsbF9lbmRfZGlzYWJsZWQiPmltYWdlcy9saWdodC9pY19jYWxsX2VuZF9CRUVfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjYW1lcmFfaXJpcyI+aW1hZ2VzL2xpZ2h0L2ljX2NhbWVyYV82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjaGVja195ZXMiPmltYWdlcy9saWdodC9pY19jaGVja19ib3hfMEJBXzI0ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iY2hlY2tfbm8iPmltYWdlcy9saWdodC9pY19jaGVja19ib3hfb3V0bGluZV9ibGFua183NzdfMjRkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkIj5pbWFnZXMvbGlnaHQvUmVtb3RlXzY3OC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2JhY2siPmltYWdlcy9saWdodC9kcGFkX2JhY2suc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9iYWNrX3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX2JhY2tfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2Rvd24iPmltYWdlcy9saWdodC9kcGFkX2Rvd24uc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9kb3duX3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX2Rvd25fcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2ZvcndhcmQiPmltYWdlcy9saWdodC9kcGFkX2ZvcndhcmQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9mb3J3YXJkX3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX2ZvcndhcmRfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2xlZnQiPmltYWdlcy9saWdodC9kcGFkX2xlZnQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9sZWZ0X3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX2xlZnRfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX3BsYXkiPmltYWdlcy9saWdodC9kcGFkX3BsYXlfcGF1c2Uuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9wbGF5X3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX3BsYXlfcGF1c2VfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX3JpZ2h0Ij5pbWFnZXMvbGlnaHQvZHBhZF9yaWdodC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX3JpZ2h0X3ByZXNzZWQiPmltYWdlcy9saWdodC9kcGFkX3JpZ2h0X3ByZXNzZWQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9zZWxlY3QiPmltYWdlcy9saWdodC9kcGFkX3NlbGVjdF9GRkYuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9zZWxlY3RfcHJlc3NlZCI+aW1hZ2VzL2xpZ2h0L2RwYWRfc2VsZWN0X0ZGRl9wcmVzc2VkLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfdXAiPmltYWdlcy9saWdodC9kcGFkX3VwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfdXBfcHJlc3NlZCI+aW1hZ2VzL2xpZ2h0L2RwYWRfdXBfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcm9wX2Rvd24iPmltYWdlcy9saWdodC9pY19hcnJvd19kcm9wX2Rvd25fY2NjXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZmlsZV9kb3dubG9hZCI+aW1hZ2VzL2xpZ2h0L2ljX2ZpbGVfZG93bmxvYWRfNjc4XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZmlsZV91cGxvYWQiPmltYWdlcy9saWdodC9pY19maWxlX3VwbG9hZF82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJmaW5nZXJwcmludCI+aW1hZ2VzL2xpZ2h0L2ljX2ZpbmdlcnByaW50XzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImZvbGRlciI+aW1hZ2VzL2xpZ2h0L2ljX2ZvbGRlcl83NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJoZWxwX291dGxpbmUiPmltYWdlcy9saWdodC9pY19oZWxwX291dGxpbmVfZ3JleTYwMF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9Imh3U2Vuc29ycyI+aW1hZ2VzL2xpZ2h0L2ljX2ZpbHRlcl90aWx0X3NoaWZ0XzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImtleWJvYXJkIj5pbWFnZXMvbGlnaHQvaWNfa2V5Ym9hcmRfNjc4XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ibG9jYXRpb24iPmltYWdlcy9saWdodC9pY19sb2NhdGlvbl9vbl82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJtZXNzYWdlIj5pbWFnZXMvbGlnaHQvaWNfbWVzc2FnZV82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwYXVzZSI+aW1hZ2VzL2xpZ2h0L2ljX3BhdXNlXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBhdXNlX2Rpc2FibGVkIj5pbWFnZXMvbGlnaHQvaWNfcGF1c2VfQkVFXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icGhvbmUiPmltYWdlcy9saWdodC9pY19waG9uZV82NzhfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwaG9uZV9idXR0b24iPmltYWdlcy9saWdodC9pY19waG9uZV8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwaG9uZV9kaXNhYmxlZCI+aW1hZ2VzL2xpZ2h0L2ljX3Bob25lX0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX2luX3RhbGsiPmltYWdlcy9saWdodC9pY19waG9uZV9pbl90YWxrXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX2luX3RhbGtfZGlzYWJsZWQiPmltYWdlcy9saWdodC9pY19waG9uZV9pbl90YWxrX0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX2xhbmRzY2FwZSI+aW1hZ2VzL2xpZ2h0L2ljX3Bob25lX2FuZHJvaWRfbGFuZHNjYXBlLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3BhdXNlZCI+aW1hZ2VzL2xpZ2h0L2ljX3Bob25lX3BhdXNlZF8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwaG9uZV9wYXVzZWRfZGlzYWJsZWQiPmltYWdlcy9saWdodC9pY19waG9uZV9wYXVzZWRfQkVFXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icGhvbmVfcG9ydHJhaXQiPmltYWdlcy9saWdodC9pY19waG9uZV9hbmRyb2lkX3BvcnRyYWl0LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3JldmVyc2VfbGFuZHNjYXBlIj5pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX2xhbmRzY2FwZS5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwaG9uZV9yZXZlcnNlX3BvcnRyYWl0Ij5pbWFnZXMvbGlnaHQvaWNfcGhvbmVfYW5kcm9pZF9yZXZlcnNlX3BvcnRyYWl0LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBsYXlfYXJyb3ciPmltYWdlcy9saWdodC9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBsYXlfYXJyb3dfZGlzYWJsZWQiPmltYWdlcy9saWdodC9pY19wbGF5X2Fycm93X0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InJhZGlvX29mZiI+aW1hZ2VzL2xpZ2h0L2ljX3JhZGlvX2J1dHRvbl91bmNoZWNrZWRfNzc3XzI0ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icmFkaW9fb24iPmltYWdlcy9saWdodC9pY19yYWRpb19idXR0b25fY2hlY2tlZF8wQkFfMjRkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJyZW1vdmUiPmltYWdlcy9saWdodC9pY19yZW1vdmVfMEJBXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icmVtb3ZlX2Rpc2FibGVkIj5pbWFnZXMvbGlnaHQvaWNfcmVtb3ZlX0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNlbmQiPmltYWdlcy9saWdodC9pY19zZW5kXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNldHRpbmdzIj5pbWFnZXMvbGlnaHQvaWNfc2V0dGluZ3NfNjc4XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ic2lnbmFsX2NlbGx1bGFyXzNfYmFyIj5pbWFnZXMvbGlnaHQvaWNfc2lnbmFsX2NlbGx1bGFyXzNfYmFyXzY3OF80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InN0b3AiPmltYWdlcy9saWdodC9pY19zdG9wXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InN0b3BfZGlzYWJsZWQiPmltYWdlcy9saWdodC9pY19zdG9wX0JFRV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InRvZ2dsZV9vZmYiPmltYWdlcy9saWdodC90b2dnbGVfb2ZmX2xpZ2h0LnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InRvZ2dsZV9vbiI+aW1hZ2VzL2xpZ2h0L3RvZ2dsZV9vbi5wbmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJ2aXJ0U2Vuc29ycyI+aW1hZ2VzL2xpZ2h0L1ZpcnR1YWxfU2Vuc29yc182Nzguc3ZnPC9maWxlPgorICAgIDwvcXJlc291cmNlPgorICAgIDxxcmVzb3VyY2UgcHJlZml4PSIvZGFyayI+CisgICAgICAgIDwhLS0gTWFpbiBsaXN0IG9mIHRvb2wgYnV0dG9ucyAtLT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImFycm93X2Ryb3BfZG93biI+aW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF9kb3duX3doaXRlXzE4cHguc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iYXJyb3dfZHJvcF91cCI+aW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF91cF93aGl0ZV8xOHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImJhY2siPmltYWdlcy9kYXJrL1N5c3RlbV9CYWNrX3doaXRlLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImNsb3NlIj5pbWFnZXMvZGFyay9pY19jbG9zZV80OHB4LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImhlbHAiPmltYWdlcy9kYXJrL2ljX2hlbHBfNjc3XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iaG9tZSI+aW1hZ2VzL2RhcmsvU3lzdGVtX0hvbWVfd2hpdGUuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ibWluaW1pemUiPmltYWdlcy9kYXJrL2ljX3JlbW92ZV93aGl0ZV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9Im1vcmUiPmltYWdlcy9kYXJrL2ljX21vcmVfaG9yaXpfd2hpdGVfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJvdmVydmlldyI+aW1hZ2VzL2RhcmsvU3lzdGVtX092ZXJ2aWV3X3doaXRlLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBvd2VyX3NldHRpbmdzIj5pbWFnZXMvZGFyay9pY19wb3dlcl9zZXR0aW5nc19uZXdfNDhweC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzY3JlZW5fcm90YXRpb24iPmltYWdlcy9kYXJrL2ljX3NjcmVlbl9yb3RhdGlvbl93aGl0ZV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNjcmVlbl9yb3RhdGlvbl9sZWZ0Ij5pbWFnZXMvZGFyay9Sb3RhdGVfTGVmdF93aGl0ZS5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzY3JlZW5fcm90YXRpb25fcmlnaHQiPmltYWdlcy9kYXJrL1JvdGF0ZV9SaWdodF93aGl0ZS5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzY3JlZW5fc2hvdCI+aW1hZ2VzL2RhcmsvaWNfcGhvdG9fY2FtZXJhX3doaXRlXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0idm9sdW1lX2Rvd24iPmltYWdlcy9kYXJrL2ljX3ZvbHVtZV9kb3duXzQ4cHguc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0idm9sdW1lX3VwIj5pbWFnZXMvZGFyay9pY192b2x1bWVfdXBfNDhweC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJ6b29tIj5pbWFnZXMvZGFyay9pY196b29tX2luX3doaXRlXzQ4ZHAuc3ZnPC9maWxlPgorCisgICAgICAgIDwhLS0gVXNlZCBpbiB0aGUgImV4dGVuZGVkIiB3aW5kb3cgLS0+CisgICAgICAgIDxmaWxlIGFsaWFzPSJhZGQiPmltYWdlcy9kYXJrL2ljX2FkZF8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJhZGRfZGlzYWJsZWQiPmltYWdlcy9kYXJrL2ljX2FkZF8xNTVfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJiYXR0ZXJ5Ij5pbWFnZXMvZGFyay9pY19iYXR0ZXJ5XzgwXzY3N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImNhbGxfZW5kIj5pbWFnZXMvZGFyay9pY19jYWxsX2VuZF8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjYWxsX2VuZF9kaXNhYmxlZCI+aW1hZ2VzL2RhcmsvaWNfY2FsbF9lbmRfMTU1XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iY2FtZXJhX2lyaXMiPmltYWdlcy9kYXJrL2ljX2NhbWVyYV82NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjaGVja195ZXMiPmltYWdlcy9kYXJrL2ljX2NoZWNrX2JveF8wQkFfMjRkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJjaGVja19ubyI+aW1hZ2VzL2RhcmsvaWNfY2hlY2tfYm94X291dGxpbmVfYmxhbmtfQkNDXzI0ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZCI+aW1hZ2VzL2RhcmsvUmVtb3RlXzY3Ny5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2JhY2siPmltYWdlcy9kYXJrL2RwYWRfYmFjay5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2JhY2tfcHJlc3NlZCI+aW1hZ2VzL2RhcmsvZHBhZF9iYWNrX3ByZXNzZWQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9kb3duIj5pbWFnZXMvZGFyay9kcGFkX2Rvd24uc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9kb3duX3ByZXNzZWQiPmltYWdlcy9kYXJrL2RwYWRfZG93bl9wcmVzc2VkLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfZm9yd2FyZCI+aW1hZ2VzL2RhcmsvZHBhZF9mb3J3YXJkLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfZm9yd2FyZF9wcmVzc2VkIj5pbWFnZXMvZGFyay9kcGFkX2ZvcndhcmRfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2xlZnQiPmltYWdlcy9kYXJrL2RwYWRfbGVmdC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX2xlZnRfcHJlc3NlZCI+aW1hZ2VzL2RhcmsvZHBhZF9sZWZ0X3ByZXNzZWQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9wbGF5Ij5pbWFnZXMvZGFyay9kcGFkX3BsYXlfcGF1c2Uuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9wbGF5X3ByZXNzZWQiPmltYWdlcy9kYXJrL2RwYWRfcGxheV9wYXVzZV9wcmVzc2VkLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfcmlnaHQiPmltYWdlcy9kYXJrL2RwYWRfcmlnaHQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9yaWdodF9wcmVzc2VkIj5pbWFnZXMvZGFyay9kcGFkX3JpZ2h0X3ByZXNzZWQuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZHBhZF9zZWxlY3QiPmltYWdlcy9kYXJrL2RwYWRfc2VsZWN0XzIzMy5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX3NlbGVjdF9wcmVzc2VkIj5pbWFnZXMvZGFyay9kcGFkX3NlbGVjdF8yMzNfcHJlc3NlZC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJkcGFkX3VwIj5pbWFnZXMvZGFyay9kcGFkX3VwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRwYWRfdXBfcHJlc3NlZCI+aW1hZ2VzL2RhcmsvZHBhZF91cF9wcmVzc2VkLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRyb3BfZG93biI+aW1hZ2VzL2RhcmsvaWNfYXJyb3dfZHJvcF9kb3duXzY2N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImZpbGVfZG93bmxvYWQiPmltYWdlcy9kYXJrL2ljX2ZpbGVfZG93bmxvYWRfNjc3XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZmlsZV91cGxvYWQiPmltYWdlcy9kYXJrL2ljX2ZpbGVfdXBsb2FkXzY3N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImZpbmdlcnByaW50Ij5pbWFnZXMvZGFyay9pY19maW5nZXJwcmludF82NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJmb2xkZXIiPmltYWdlcy9kYXJrL2ljX2ZvbGRlcl9iY2NfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJoZWxwX291dGxpbmUiPmltYWdlcy9kYXJrL2ljX2hlbHBfb3V0bGluZV93aGl0ZV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9Imh3U2Vuc29ycyI+aW1hZ2VzL2RhcmsvaWNfZmlsdGVyX3RpbHRfc2hpZnRfNjc3XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0ia2V5Ym9hcmQiPmltYWdlcy9kYXJrL2ljX2tleWJvYXJkXzY3N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImxvY2F0aW9uIj5pbWFnZXMvZGFyay9pY19sb2NhdGlvbl9vbl82NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJtZXNzYWdlIj5pbWFnZXMvZGFyay9pY19tZXNzYWdlXzY3N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBhdXNlIj5pbWFnZXMvZGFyay9pY19wYXVzZV8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwYXVzZV9kaXNhYmxlZCI+aW1hZ2VzL2RhcmsvaWNfcGF1c2VfMTU1XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icGhvbmUiPmltYWdlcy9kYXJrL2ljX3Bob25lXzY3N180OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX2J1dHRvbiI+aW1hZ2VzL2RhcmsvaWNfcGhvbmVfMEJBXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icGhvbmVfZGlzYWJsZWQiPmltYWdlcy9kYXJrL2ljX3Bob25lXzE1NV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX2luX3RhbGsiPmltYWdlcy9kYXJrL2ljX3Bob25lX2luX3RhbGtfMEJBXzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icGhvbmVfaW5fdGFsa19kaXNhYmxlZCI+aW1hZ2VzL2RhcmsvaWNfcGhvbmVfaW5fdGFsa18xNTVfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwaG9uZV9sYW5kc2NhcGUiPmltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfbGFuZHNjYXBlLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3BhdXNlZCI+aW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3BhdXNlZF9kaXNhYmxlZCI+aW1hZ2VzL2RhcmsvaWNfcGhvbmVfcGF1c2VkXzE1NV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3BvcnRyYWl0Ij5pbWFnZXMvZGFyay9pY19waG9uZV9hbmRyb2lkX3BvcnRyYWl0LnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3JldmVyc2VfbGFuZHNjYXBlIj5pbWFnZXMvZGFyay9pY19waG9uZV9hbmRyb2lkX3JldmVyc2VfbGFuZHNjYXBlLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBob25lX3JldmVyc2VfcG9ydHJhaXQiPmltYWdlcy9kYXJrL2ljX3Bob25lX2FuZHJvaWRfcmV2ZXJzZV9wb3J0cmFpdC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJwbGF5X2Fycm93Ij5pbWFnZXMvZGFyay9pY19wbGF5X2Fycm93XzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InBsYXlfYXJyb3dfZGlzYWJsZWQiPmltYWdlcy9kYXJrL2ljX3BsYXlfYXJyb3dfMTU1XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0icmFkaW9fb2ZmIj5pbWFnZXMvZGFyay9pY19yYWRpb19idXR0b25fdW5jaGVja2VkX0JDQ18yNGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InJhZGlvX29uIj5pbWFnZXMvZGFyay9pY19yYWRpb19idXR0b25fY2hlY2tlZF8wQkFfMjRkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJyZW1vdmUiPmltYWdlcy9kYXJrL2ljX3JlbW92ZV8wQkFfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJyZW1vdmVfZGlzYWJsZWQiPmltYWdlcy9kYXJrL2ljX3JlbW92ZV8xNTVfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzZW5kIj5pbWFnZXMvZGFyay9pY19zZW5kXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InNldHRpbmdzIj5pbWFnZXMvZGFyay9pY19zZXR0aW5nc182NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzaWduYWxfY2VsbHVsYXJfM19iYXIiPmltYWdlcy9kYXJrL2ljX3NpZ25hbF9jZWxsdWxhcl8zX2Jhcl82NzdfNDhkcC5zdmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzdG9wIj5pbWFnZXMvZGFyay9pY19zdG9wXzBCQV80OGRwLnN2ZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InN0b3BfZGlzYWJsZWQiPmltYWdlcy9kYXJrL2ljX3N0b3BfMTU1XzQ4ZHAuc3ZnPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0idG9nZ2xlX29mZiI+aW1hZ2VzL2RhcmsvdG9nZ2xlX29mZl9kYXJrLnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InRvZ2dsZV9vbiI+aW1hZ2VzL2RhcmsvdG9nZ2xlX29uLnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9InZpcnRTZW5zb3JzIj5pbWFnZXMvZGFyay9WaXJ0dWFsX1NlbnNvcnNfNjc3LnN2ZzwvZmlsZT4KKyAgICA8L3FyZXNvdXJjZT4KKyAgICA8cXJlc291cmNlIHByZWZpeD0iL2N1cnNvciI+CisgICAgICAgIDxmaWxlIGFsaWFzPSJ6b29tX2N1cnNvciI+aW1hZ2VzL2N1cnNvci96b29tX2N1cnNvci5zdmc8L2ZpbGU+CisgICAgPC9xcmVzb3VyY2U+CisgICAgPHFyZXNvdXJjZSBwcmVmaXg9Ii9tdWx0aXRvdWNoIj4KKyAgICAgICAgPGZpbGUgYWxpYXM9InRvdWNoX3BvaW50Ij5pbWFnZXMvbXVsdGl0b3VjaC90b3VjaF9wb2ludC5wbmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJ0b3VjaF9wb2ludF8yeCI+aW1hZ2VzL211bHRpdG91Y2gvdG91Y2hfcG9pbnRfMngucG5nPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iY2VudGVyX3BvaW50Ij5pbWFnZXMvbXVsdGl0b3VjaC9jZW50ZXJfcG9pbnQucG5nPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iY2VudGVyX3BvaW50XzJ4Ij5pbWFnZXMvbXVsdGl0b3VjaC9jZW50ZXJfcG9pbnRfMngucG5nPC9maWxlPgorICAgIDwvcXJlc291cmNlPgorICAgIDxxcmVzb3VyY2UgcHJlZml4PSIvcGhvbmUtbW9kZWwiPgorICAgICAgICA8ZmlsZSBhbGlhcz0ibW9kZWwub2JqIj5waG9uZS1tb2RlbC9tb2RlbC5vYmo8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJzcGVjdWxhci1tYXAucG5nIj5waG9uZS1tb2RlbC9tb2RlbC1zcGVjdWxhci1tYXAucG5nPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZ2xvc3MtbWFwLnBuZyI+cGhvbmUtbW9kZWwvbW9kZWwtZ2xvc3MtbWFwLnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImVudi1tYXAtYmFjay5wbmciPnBob25lLW1vZGVsL2Vudi1tYXAtYmFjay5wbmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJlbnYtbWFwLWJvdHRvbS5wbmciPnBob25lLW1vZGVsL2Vudi1tYXAtYm90dG9tLnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImVudi1tYXAtZnJvbnQucG5nIj5waG9uZS1tb2RlbC9lbnYtbWFwLWZyb250LnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImVudi1tYXAtbGVmdC5wbmciPnBob25lLW1vZGVsL2Vudi1tYXAtbGVmdC5wbmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJlbnYtbWFwLXJpZ2h0LnBuZyI+cGhvbmUtbW9kZWwvZW52LW1hcC1yaWdodC5wbmc8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJlbnYtbWFwLXRvcC5wbmciPnBob25lLW1vZGVsL2Vudi1tYXAtdG9wLnBuZzwvZmlsZT4KKyAgICAgICAgPGZpbGUgYWxpYXM9ImRpZmZ1c2UtbWFwLnBuZyI+cGhvbmUtbW9kZWwvbW9kZWwtZGlmZnVzZS1tYXAucG5nPC9maWxlPgorICAgICAgICA8ZmlsZSBhbGlhcz0iZnJhZy5nbHNsIj5waG9uZS1tb2RlbC9mcmFnLmdsc2w8L2ZpbGU+CisgICAgICAgIDxmaWxlIGFsaWFzPSJ2ZXJ0Lmdsc2wiPnBob25lLW1vZGVsL3ZlcnQuZ2xzbDwvZmlsZT4KKyAgICA8L3FyZXNvdXJjZT4KKzwvUkNDPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc2V0LXVpLWVtdS1hZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc2V0LXVpLWVtdS1hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjgyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zZXQtdWktZW11LWFnZW50LmgKQEAgLTAsMCArMSwyMyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitzdHJ1Y3QgVWlFbXVBZ2VudDsKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKwordm9pZCBzZXRVaUVtdUFnZW50KGNvbnN0IFVpRW11QWdlbnQgKmFnZW50UHRyKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zaG9ydGN1dC1rZXktc3RvcmUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Nob3J0Y3V0LWtleS1zdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTlhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zaG9ydGN1dC1rZXktc3RvcmUuaApAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UUtleVNlcXVlbmNlPgorI2luY2x1ZGUgPFFTdHJpbmc+CisjaW5jbHVkZSA8UVRleHRTdHJlYW0+CisjaW5jbHVkZSA8UVZlY3Rvcj4KKyNpbmNsdWRlIDxRTWFwPgorCisvLyBQcm92aWRlcyBhIGdlbmVyaWMgd2F5IG9mIG1hcHBpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIHRvIGNvbW1hbmRzLgorLy8gQ29tbWFuZFR5cGUgbXVzdCBiZSBEZWZhdWx0Q29uc3RydWN0YWJsZS4KK3RlbXBsYXRlIDxjbGFzcyBDb21tYW5kVHlwZT4KK2NsYXNzIFNob3J0Y3V0S2V5U3RvcmUgeworICAgIHVzaW5nIENvbnRhaW5lciA9IFFNYXA8UUtleVNlcXVlbmNlLCBDb21tYW5kVHlwZT47CisgICAgdXNpbmcgUmV2ZXJzZUNvbnRhaW5lciA9IFFNYXA8Q29tbWFuZFR5cGUsIFFWZWN0b3I8UUtleVNlcXVlbmNlPj47CitwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBDb250YWluZXI6Oml0ZXJhdG9yOworICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gdHlwZW5hbWUgQ29udGFpbmVyOjpjb25zdF9pdGVyYXRvcjsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIHNob3J0Y3V0IGtleSBzdG9yZSBmcm9tIGEgdGV4dCBzdHJlYW0uCisgICAgLy8gVGhlIHN0cmVhbSBzaG91bGQgY29udGFpbiB6ZXJvIG9yIG1vcmUgc2hvcnRjdXQgc3BlY2lmaWNhdGlvbnMuCisgICAgLy8gQSBzaG9ydGN1dCBzcGVjaWZpY2F0aW9uIG1hcHMgYSBrZXkgc2VxdWVuY2UgdG8gYSBjb21tYW5kIGFuZAorICAgIC8vIGxvb2tzIGxpa2UgdGhpczoKKyAgICAvLyAgPEtFWV9TRVFVRU5DRT4gPENPTU1BTkQ+CisgICAgLy8gd2hlcmUgPEtFWV9TRVFVRU5DRT4gaXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBrZXkgc2VxdWVuY2UKKyAgICAvLyBwYXJzYWJsZSBieSBRS2V5U2VxdWVuY2UgYW5kIDxDT01NQU5EPiBpcyBhIHN0cmluZyBwYXJzYWJsZSBieQorICAgIC8vIGludm9raW5nIG9wZXJhdG9yKCkgb24gYW4gaW5zdGFuY2Ugb2YgQ29tbWFuZFBhcnNlci4KKyAgICAvLyBDb21tYW5kUGFyc2VyIGlzIHVzZWQgdG8gY29udmVydCBRU3RyaW5ncyBpbnRvIHZhbHVlcyBvZiBDb21tYW5kVHlwZS4KKyAgICAvLyBPYmplY3RzIG9mIHR5cGUgQ29tbWFuZFBhcnNlciBzaG91bGQgYmUgY2FsbGFibGUgd2l0aCBhIFFTdHJpbmcgYW5kCisgICAgLy8gYSBwb2ludGVyIHRvIENvbW1hbmRUeXBlLiBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIHNoYWxsIGJlICJ0cnVlIiBpZgorICAgIC8vIGNvbnZlcnNpb24gZnJvbSBRU3RyaW5nIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiBzaGFsbCBiZSBwbGFjZWQgaW50byB0aGUgb2JqZWN0IHBvaW50ZWQKKyAgICAvLyB0byBieSB0aGUgc2Vjb25kIGFyZ3VtZW50LiBUaGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgdGhlIHNlY29uZCBhcmd1bWVudAorICAgIC8vIHNoYWxsIHJlbWFpbiB1bm1vZGlmaWVkIGlmIHRoZSBjYWxsIHJldHVybnMgZmFsc2UuCisgICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIHJlYWRpbmcgc2hvcnRjdXQgc3BlY2lmaWNhdGlvbnMgZnJvbQorICAgIC8vIHRoZSBzdHJlYW0gdW50aWwgdGhlIHN0cmVhbSBlbmRzIG9yIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuCisgICAgdGVtcGxhdGUgPGNsYXNzIENvbW1hbmRQYXJzZXIgPSBib29sKCopKGNvbnN0IFFTdHJpbmcmLCBDb21tYW5kVHlwZSopPgorICAgIHZvaWQgcG9wdWxhdGVGcm9tVGV4dFN0cmVhbShRVGV4dFN0cmVhbSYgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kUGFyc2VyJiBjb21tYW5kX3BhcnNlcikgeworICAgICAgICBRU3RyaW5nIGtleV9zZXFfc3RyLCBjb21tYW5kX3N0cjsKKyAgICAgICAgd2hpbGUgKCFzdHJlYW0uYXRFbmQoKSkgeworICAgICAgICAgICAgc3RyZWFtID4+IGtleV9zZXFfc3RyID4+IGNvbW1hbmRfc3RyOworICAgICAgICAgICAgYXV0byBrZXlfc2VxID0gUUtleVNlcXVlbmNlOjpmcm9tU3RyaW5nKGtleV9zZXFfc3RyKTsKKyAgICAgICAgICAgIENvbW1hbmRUeXBlIGNvbW1hbmQ7CisgICAgICAgICAgICBib29sIGNvbW1hbmRfcGFyc2VfcmVzdWx0ID0KKyAgICAgICAgICAgICAgICBjb21tYW5kX3BhcnNlcihjb21tYW5kX3N0ciwgJmNvbW1hbmQpOworICAgICAgICAgICAgaWYgKCFjb21tYW5kX3BhcnNlX3Jlc3VsdCB8fCBrZXlfc2VxLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGQoa2V5X3NlcSwgY29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFeHBsaWNpdGx5IG1hcHMgdGhlIGdpdmVuIGtleSBzZXF1ZW5jZSB0byB0aGUgZ2l2ZW4gY29tbWFuZC4KKyAgICB2b2lkIGFkZChjb25zdCBRS2V5U2VxdWVuY2UmIGtleV9zZXEsIGNvbnN0IENvbW1hbmRUeXBlICZjb21tYW5kKSB7CisgICAgICAgIG1LZXlTZXF1ZW5jZVRvQ29tbWFuZE1hcFtrZXlfc2VxXSA9IGNvbW1hbmQ7CisgICAgICAgIG1Db21tYW5kVG9LZXlTZXF1ZW5jZU1hcFtjb21tYW5kXS5wdXNoX2JhY2soa2V5X3NlcSk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGdpdmVuIGtleSBzZXF1ZW5jZSBtYXRjaGVzIHRoYXQgb2YgYSBjb21tYW5kIGluIHRoZSBzdG9yZSwKKyAgICAvLyBpbnZva2VzIHRoZSBnaXZlbiBoYW5kbGVyIHdpdGggdGhhdCBjb21tYW5kIGFzIHRoZSBvbmx5IGFyZ3VtZW50LgorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGFuZGxlciB3YXMgY2FsbGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgdGVtcGxhdGUgPGNsYXNzIENvbW1hbmRIYW5kbGVyPgorICAgIGJvb2wgaGFuZGxlKGNvbnN0IFFLZXlTZXF1ZW5jZSYga2V5X3NlcSwgY29uc3QgQ29tbWFuZEhhbmRsZXImIGhhbmRsZXIpIHsKKyAgICAgICAgYXV0byBpdCA9IG1LZXlTZXF1ZW5jZVRvQ29tbWFuZE1hcC5maW5kKGtleV9zZXEpOworICAgICAgICBib29sIG11c3RfY2FsbF9oYW5kbGVyID0gKGl0ICE9IG1LZXlTZXF1ZW5jZVRvQ29tbWFuZE1hcC5lbmQoKSk7CisgICAgICAgIGlmIChtdXN0X2NhbGxfaGFuZGxlcikgeworICAgICAgICAgICAgaGFuZGxlcihpdC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXVzdF9jYWxsX2hhbmRsZXI7CisgICAgfQorCisgICAgLy8gUGVyZm9ybXMgYSByZXZlcnNlIGxvb2t1cDogcmV0dXJuIGEgdmVjdG9yIHdpdGggYWxsIHRoZSBzaG9ydGN1dCBrZXlzCisgICAgLy8gKG9yIG51bGxwdHIgaWYgbm8gc2hvcnR1Y3RzIGNvcnJlc3BvbmQgdG8gdGhlIGdpdmVuIGNvbW1hbmQpCisgICAgUVZlY3RvcjxRS2V5U2VxdWVuY2U+KiByZXZlcnNlTG9va3VwKENvbW1hbmRUeXBlIGNtZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNvbW1hbmRUb0tleVNlcXVlbmNlTWFwLmZpbmQoY21kKTsKKyAgICAgICAgaWYgKGl0ICE9IG1Db21tYW5kVG9LZXlTZXF1ZW5jZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuICYoaXQudmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICB9CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1LZXlTZXF1ZW5jZVRvQ29tbWFuZE1hcC5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbUtleVNlcXVlbmNlVG9Db21tYW5kTWFwLmVuZCgpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgeyByZXR1cm4gbUtleVNlcXVlbmNlVG9Db21tYW5kTWFwLmNiZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIHsgcmV0dXJuIG1LZXlTZXF1ZW5jZVRvQ29tbWFuZE1hcC5jZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0eyByZXR1cm4gbUtleVNlcXVlbmNlVG9Db21tYW5kTWFwLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtS2V5U2VxdWVuY2VUb0NvbW1hbmRNYXAuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgICBDb250YWluZXIgbUtleVNlcXVlbmNlVG9Db21tYW5kTWFwOworICAgIFJldmVyc2VDb250YWluZXIgbUNvbW1hbmRUb0tleVNlcXVlbmNlTWFwOworfTsKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc2l6ZS10d2Vha2VyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3NpemUtdHdlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNzAwMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3NpemUtdHdlYWtlci5jcHAKQEAgLTAsMCArMSwxODMgQEAKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvc2l6ZS10d2Vha2VyLmgiCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUNoZWNrQm94PgorI2luY2x1ZGUgPFFDb21ib0JveD4KKyNpbmNsdWRlIDxRRGVza3RvcFdpZGdldD4KKyNpbmNsdWRlIDxRUHVzaEJ1dHRvbj4KKyNpbmNsdWRlIDxRUmFkaW9CdXR0b24+CisjaW5jbHVkZSA8UVNjcmVlbj4KKyNpbmNsdWRlIDxRU3R5bGU+CisjaW5jbHVkZSA8UVRhYmxlV2lkZ2V0PgorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworY29uc3QgcXJlYWwgU2l6ZVR3ZWFrZXI6OkJhc2VsaW5lRHBpID0gOTYuMDsKKworU2l6ZVR3ZWFrZXI6OlNpemVUd2Vha2VyKFFXaWRnZXQqIHdpZGdldCkgOgorICAgICAgICBtU3ViamVjdCh3aWRnZXQpLAorICAgICAgICBtQ3VycmVudFNjYWxlRmFjdG9yKDEuMCwgMS4wKSB7CisvL1dlIGRvbid0IG5lZWQgc2l6ZSB0d2Vha2luZyBvbiBPUyBYLCBidXQgd2UgbmVlZAorLy8gaXQgZm9yIFdpbmRvd3MvTGludXguCisjaWZuZGVmIFFfT1NfTUFDCisgICAgaWYgKG1TdWJqZWN0KSB7CisgICAgICAgIG1TdWJqZWN0LT5pbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7CisgICAgfQorI2VuZGlmCit9CisKK2Jvb2wgU2l6ZVR3ZWFrZXI6OmV2ZW50RmlsdGVyKFFPYmplY3QqIG8sIFFFdmVudCogZXZlbnQpIHsKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OlNob3cgfHwgZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OlNjcmVlbkNoYW5nZUludGVybmFsKSB7CisgICAgICAgIGFkanVzdFNpemVzQW5kUG9zaXRpb25zKCk7CisgICAgfQorICAgIHJldHVybiBRT2JqZWN0OjpldmVudEZpbHRlcihvLCBldmVudCk7Cit9CisKKyNpZm5kZWYgUV9PU19NQUMKK3N0YXRpYyBRU3RyaW5nIGdldFR3ZWFrZWRTdHlsZXNoZWV0KGNvbnN0IFFWZWN0b3IyRCYgc2NhbGVfZmFjdG9yKSB7CisgICAgLy8gS0xVREdFOiBXZSBoYXZlIGN1c3RvbWl6ZWQgc2V2ZXJhbCBjb250cm9scyB2aWEgUVNTLgorICAgIC8vIFRoZWlyIHN0eWxlc2hlZXRzIG5lZWQgdG8gYmUgYWRqdXN0ZWQgdG8gcHJvcGVybHkgcmVhY3QgdG8gRFBJCisgICAgLy8gY2hhbmdlcy4KKworICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0byByZWFkIHRob3NlIGJhc2VsaW5lIHZhbHVlcyBmcm9tIHRoZQorICAgIC8vIHN0eWxlc2hlZXQgd2l0aG91dCBhY3R1YWxseSBwYXJzaW5nIGl0Liwgc28gd2UgaGFyZGNvZGUgdGhlbSBoZXJlLgorICAgIHN0YXRpYyBjb25zdCBpbnQgY3VzdG9tX3JhZGlvYnRuX2Jhc2VsaW5lX3NpemUgPSAyNDsKKyAgICBzdGF0aWMgY29uc3QgaW50IGN1c3RvbV9jaGVja2JveF9iYXNlbGluZV93aWR0aCA9IDM2OworICAgIHN0YXRpYyBjb25zdCBpbnQgY3VzdG9tX2NoZWNrYm94X2Jhc2VsaW5lX2hlaWdodCA9IDI0OworICAgIHN0YXRpYyBjb25zdCBpbnQgY3VzdG9tX2hlYWRlcnZpZXdfYmFzZWxpbmVfcGFkZGluZyA9IDE2OworCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGN1c3RvbV9jdHJsX3N0eWxlc2hlZXQ7CisgICAgY3VzdG9tX2N0cmxfc3R5bGVzaGVldCA8PCAiXG5RUmFkaW9CdXR0b246OmluZGljYXRvciB7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aWR0aDogIiA8PCBjdXN0b21fcmFkaW9idG5fYmFzZWxpbmVfc2l6ZSAqIHNjYWxlX2ZhY3Rvci54KCkgPDwgIjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlaWdodDogIiA8PCBjdXN0b21fcmFkaW9idG5fYmFzZWxpbmVfc2l6ZSAqIHNjYWxlX2ZhY3Rvci55KCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAifVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlFDaGVja0JveDo6aW5kaWNhdG9yIHsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpZHRoOiAiIDw8IGN1c3RvbV9jaGVja2JveF9iYXNlbGluZV93aWR0aCAqIHNjYWxlX2ZhY3Rvci54KCkgPDwgIjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlaWdodDogIiA8PCBjdXN0b21fY2hlY2tib3hfYmFzZWxpbmVfaGVpZ2h0ICogc2NhbGVfZmFjdG9yLnkoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiUUNvbWJvQm94Ojpkb3duLWFycm93IHsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIndpZHRoOiAiIDw8IGN1c3RvbV9yYWRpb2J0bl9iYXNlbGluZV9zaXplICogc2NhbGVfZmFjdG9yLngoKSA8PCAiOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVpZ2h0OiAiIDw8IGN1c3RvbV9yYWRpb2J0bl9iYXNlbGluZV9zaXplICogc2NhbGVfZmFjdG9yLnkoKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiUUhlYWRlclZpZXc6OnNlY3Rpb24geyBwYWRkaW5nOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjdXN0b21faGVhZGVydmlld19iYXNlbGluZV9wYWRkaW5nICogc2NhbGVfZmFjdG9yLnkoKSA8PCAiOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAifVxuIjsKKyAgICByZXR1cm4gUVN0cmluZzo6ZnJvbVN0ZFN0cmluZyhjdXN0b21fY3RybF9zdHlsZXNoZWV0LnN0cigpKTsKK30KKworc3RhdGljIHZvaWQgc2NhbGVXaWRnZXRCeShRV2lkZ2V0KiB3aWRnZXQsIGNvbnN0IFFWZWN0b3IyRCYgc2NhbGVfYnkpIHsKKyAgICAvLyBGaXJzdCwgY2FsY3VsYXRlIHRoZSBleHBlY3RlZCBuZXcgc2l6ZSAodXNpbmcgUVdpZGdldDo6d2lkdGggYW5kCisgICAgLy8gUVdpZGdldDo6aGVpZ2h0IGFmdGVyIGZpZGRsaW5nIHdpdGggbWluL21heCBzaXplcyBpcyB1bnByZWRpY3RhYmxlCisgICAgLy8gc2luY2UgY2hhbmdpbmcgbWluL21heCBzaXplcyBtYXkgYWN0dWFsbHkgcmVzaXplIHRoZSB3aWRnZXQpLgorICAgIFFWZWN0b3IyRCBuZXdfc2l6ZSB7d2lkZ2V0LT53aWR0aCgpICogc2NhbGVfYnkueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LT5oZWlnaHQoKSAqIHNjYWxlX2J5LnkoKX07CisgICAgLy8gRm9yIHNpemUtbGltaXRlZCB3aWRnZXRzLCBzZXQgbmV3IGxpbWl0cy4gVGhlIGNoZWNrIGZvciBRV0lER0VUU0laRV9NQVgKKyAgICAvLyBpcyB0byBhdm9pZCBwb3RlbnRpYWwgTE9UUyBvZiBsb2dzcGFtLgorICAgIHdpZGdldC0+c2V0TWluaW11bVdpZHRoKHdpZGdldC0+bWluaW11bVdpZHRoKCkgKiBzY2FsZV9ieS54KCkpOworICAgIHdpZGdldC0+c2V0TWluaW11bUhlaWdodCh3aWRnZXQtPm1pbmltdW1IZWlnaHQoKSAqIHNjYWxlX2J5LnkoKSk7CisKKyAgICAvLyBDaGVjayBiZWZvcmUgc2V0dGluZyBuZXcgbWF4aW11bSB3aWR0aC9oZWlnaHQuCisgICAgLy8gU2V0dGluZyB0aGlzIHByb3BlcnR5IHRvIGEgdmFsdWUgdGhhdCBpcyB0b28gbGFyZ2Ugd2lsbCBjYXVzZSBRdAorICAgIC8vIHRvIHByaW50IGEgd2FybmluZy4gU2luY2UgbW9zdCB3aWRnZXRzIGhhdmUgbm8gZXhwbGljaXQgc2l6ZSBjb25zdHJhaW50cywKKyAgICAvLyBhbmQgdGhlIGRlZmF1bHQgbWF4IHdpZHRoL2hlaWdodCBpcyBhbHJlYWR5IFFXSURHRVRTSVpFX01BWCwKKyAgICAvLyBpdCB3b3VsZCBwcm9kdWNlIGxvdHMgb2YgbG9nc3BhbSBhbmQgYWN0dWFsbHkgY2F1c2UgYSBub3RpY2VhYmxlIGxhZy4KKyAgICBpbnQgbmV3X21heF93aWR0aCA9IHdpZGdldC0+bWF4aW11bVdpZHRoKCkgKiBzY2FsZV9ieS54KCk7CisgICAgaWYgKG5ld19tYXhfd2lkdGggPCBRV0lER0VUU0laRV9NQVgpIHsKKyAgICAgICAgd2lkZ2V0LT5zZXRNYXhpbXVtV2lkdGgobmV3X21heF93aWR0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2lkZ2V0LT5zZXRNYXhpbXVtV2lkdGgoUVdJREdFVFNJWkVfTUFYKTsKKyAgICB9CisKKyAgICBpbnQgbmV3X21heF9oZWlnaHQgPSB3aWRnZXQtPm1heGltdW1IZWlnaHQoKSAqIHNjYWxlX2J5LnkoKTsKKyAgICBpZiAobmV3X21heF9oZWlnaHQgPCBRV0lER0VUU0laRV9NQVgpIHsKKyAgICAgICAgd2lkZ2V0LT5zZXRNYXhpbXVtSGVpZ2h0KG5ld19tYXhfaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aWRnZXQtPnNldE1heGltdW1XaWR0aChRV0lER0VUU0laRV9NQVgpOworICAgIH0KKworICAgIC8vIFNldCB0aGUgbmV3IHNpemUgb2YgdGhlIHdpZGdldCEKKyAgICB3aWRnZXQtPnJlc2l6ZShuZXdfc2l6ZS54KCksIG5ld19zaXplLnkoKSk7CisKKyAgICAvLyBGb250cyBuZWVkIHRvIGJlIGFkanVzdGVkIHRvby4KKyAgICBpZiAod2lkZ2V0LT5mb250KCkucGl4ZWxTaXplKCkgIT0gLTEpIHsKKyAgICAgICAgUUZvbnQgZiA9IHdpZGdldC0+Zm9udCgpOworICAgICAgICBmLnNldFBpeGVsU2l6ZSh3aWRnZXQtPmZvbnQoKS5waXhlbFNpemUoKSAqIHNjYWxlX2J5LnkoKSk7CisgICAgICAgIHdpZGdldC0+c2V0Rm9udChmKTsKKyAgICB9IGVsc2UgaWYgKHdpZGdldC0+Zm9udCgpLnBvaW50U2l6ZSgpICE9IC0xKSB7CisgICAgICAgIFFGb250IGYgPSB3aWRnZXQtPmZvbnQoKTsKKyAgICAgICAgZi5zZXRQb2ludFNpemUod2lkZ2V0LT5mb250KCkucG9pbnRTaXplKCkgKiBzY2FsZV9ieS55KCkpOworICAgICAgICB3aWRnZXQtPnNldEZvbnQoZik7CisgICAgfQorfQorI2VuZGlmCisKK3ZvaWQgU2l6ZVR3ZWFrZXI6OmFkanVzdFNpemVzQW5kUG9zaXRpb25zKCkgeworI2lmbmRlZiBRX09TX01BQworICAgIGlmICghbVN1YmplY3QpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBzY3JlZW5fbnVtYmVyID0gUUFwcGxpY2F0aW9uOjpkZXNrdG9wKCktPnNjcmVlbk51bWJlcihtU3ViamVjdC5kYXRhKCkpOworCisgICAgLy8gUURlc2t0b3BXaWRnZXQ6OnNjcmVlbk51bWJlciByZXR1cm5zIC0xIGlmIHRoZSB3aWRnZXQgaXMgbm90IG9uIGEgc2NyZWVuLgorICAgIC8vIFRoZSByZXR1cm5lZCBpbmRleCAqbWF5KiBiZSBvdXQgb2YgYm91bmRzIGlmIHRoZSBzY3JlZW4gY2hhbmdlIGV2ZW50IHdhcworICAgIC8vIHRyaWdnZXJlZCBhcyBhIHJlc3VsdCBvZiB0dXJuaW5nIG9mZiBvbmUgb2YgdGhlIHNjcmVlbnMuCisgICAgaWYgKHNjcmVlbl9udW1iZXIgPCAwIHx8CisgICAgICAgIHNjcmVlbl9udW1iZXIgPj0gUUFwcGxpY2F0aW9uOjpzY3JlZW5zKCkuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUVNjcmVlbiogc2NyZWVuID0gUUFwcGxpY2F0aW9uOjpzY3JlZW5zKCkuYXQoc2NyZWVuX251bWJlcik7CisgICAgaWYgKCFzY3JlZW4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9ycyByZWxhdGl2ZSB0byBiYXNlbGluZSBEUEkuCisgICAgUVZlY3RvcjJEIHNjYWxlX2ZhY3RvciA9CisgICAgICAgIFFWZWN0b3IyRChzY3JlZW4tPmxvZ2ljYWxEb3RzUGVySW5jaFgoKSAvIEJhc2VsaW5lRHBpLAorICAgICAgICAgICAgICAgIHNjcmVlbi0+bG9naWNhbERvdHNQZXJJbmNoWSgpIC8gQmFzZWxpbmVEcGkpOworCisgICAgLy8gQ2FsY3VsYXRlIGhvdyBtdWNoIHRoZSBzaXplIG5lZWRzIHRvIGJlIGNoYW5nZWQuIEZvciBleGFtcGxlLAorICAgIC8vIGlmIHdlJ3JlIGdvaW5nIGZyb20gMTkyIERQSSB0byA5NiBEUEksIHRoZSBzaXplcyBzaG91bGQgYmUgY2hhbmdlZAorICAgIC8vIGJ5IDAuNS4gSWYgd2UncmUgZ29pbmcgZnJvbSA5NiB0byAxOTIsIHNpemVzIHNob3VsZCBiZSBjaGFuZ2VkIGJ5CisgICAgLy8gMi4wLgorICAgIFFWZWN0b3IyRCBzY2FsZV9ieSA9IHNjYWxlX2ZhY3RvciAvIG1DdXJyZW50U2NhbGVGYWN0b3I7CisKKyAgICBpZiAocUZ1enp5Q29tcGFyZShzdGF0aWNfY2FzdDxkb3VibGU+KHNjYWxlX2J5LngoKSksIDEuMCkgJiYKKyAgICAgICAgcUZ1enp5Q29tcGFyZShzdGF0aWNfY2FzdDxkb3VibGU+KHNjYWxlX2J5LnkoKSksIDEuMCkpIHsKKyAgICAgICAgLy8gTm8gRFBJIGNoYW5nZSwgc2l6ZXMgZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSBzY2FsZSBmYWN0b3JzLgorICAgIG1DdXJyZW50U2NhbGVGYWN0b3IgPSBzY2FsZV9mYWN0b3I7CisKKyAgICAvLyBSZXNpemUgdGhlIHdpZGdldCBpdHNlbGYuCisgICAgc2NhbGVXaWRnZXRCeShtU3ViamVjdC5kYXRhKCksIHNjYWxlX2J5KTsKKworICAgIC8vIEdlbmVyYXRlIGEgc3R5bGVzaGVldCB0d2Vha2VkIGZvciB0aGlzIERQSS4KKyAgICBRU3RyaW5nIHR3ZWFrZWRfc3R5bGVzaGVldCA9IGdldFR3ZWFrZWRTdHlsZXNoZWV0KHNjYWxlX2ZhY3Rvcik7CisKKyAgICAvLyBTY2FsZSBhbmQgcmVwb3NpdGlvbiBjaGlsZCB3aWRnZXRzLgorICAgIGZvciAoUVdpZGdldCogdyA6IG1TdWJqZWN0LT5maW5kQ2hpbGRyZW48UVdpZGdldCo+KCkpIHsKKyAgICAgICAgLy8gQXBwbHkgUUNoZWNrYm94IC8gUVJhZGlvQnV0dG9uIHN0eWxlcyBpZiBuZWVkZWQuCisgICAgICAgIGlmIChxb2JqZWN0X2Nhc3Q8UUNoZWNrQm94Kj4odykgfHwKKyAgICAgICAgICAgIHFvYmplY3RfY2FzdDxRUmFkaW9CdXR0b24qPih3KSB8fAorICAgICAgICAgICAgcW9iamVjdF9jYXN0PFFDb21ib0JveCo+KHcpIHx8CisgICAgICAgICAgICBxb2JqZWN0X2Nhc3Q8UVRhYmxlV2lkZ2V0Kj4odykpIHsKKyAgICAgICAgICAgIHctPnNldFN0eWxlU2hlZXQodHdlYWtlZF9zdHlsZXNoZWV0KTsKKworICAgICAgICAgICAgLy8gRW5zdXJlIG5ldyBzdHlsZXNoZWV0IGlzIGFwcGxpZWQuCisgICAgICAgICAgICB3LT5zdHlsZSgpLT51bnBvbGlzaCh3KTsKKyAgICAgICAgICAgIHctPnN0eWxlKCktPnBvbGlzaCh3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUUFic3RyYWN0QnV0dG9uKiBidXR0b24gPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0QnV0dG9uKj4odykpIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0byB1c2UgbGFyZ2UgaWNvbnMgb24gYnV0dG9ucy4KKyAgICAgICAgICAgIGJ1dHRvbi0+c2V0SWNvblNpemUoUVNpemUoYnV0dG9uLT5pY29uU2l6ZSgpLndpZHRoKCkgKiBzY2FsZV9ieS54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi0+aWNvblNpemUoKS5oZWlnaHQoKSAqIHNjYWxlX2J5LnkoKSkpOworICAgICAgICB9CisgICAgICAgIHNjYWxlV2lkZ2V0Qnkodywgc2NhbGVfYnkpOworICAgICAgICB3LT5tb3ZlKHctPngoKSAqIHNjYWxlX2J5LngoKSwgdy0+eSgpICogc2NhbGVfYnkueSgpKTsKKyAgICB9CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc2l6ZS10d2Vha2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zaXplLXR3ZWFrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzk2MjczCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc2l6ZS10d2Vha2VyLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFFPYmplY3Q+CisjaW5jbHVkZSA8UVdpZGdldD4KKyNpbmNsdWRlIDxRVmVjdG9yMkQ+CisjaW5jbHVkZSA8UVBvaW50ZXI+CisKKy8vIFRoaXMgaXMgYSBzcGVjaWFsIGNvbXBvbmVudCB0aGF0IGFkanVzdHMgd2lkZ2V0IHNpemVzIGZvcgorLy8gaGlnaC1kZW5zaXR5IGRpc3BsYXlzLiBXZSBkb24ndCBuZWVkIGl0IG9uIE9TIFgsIGJ1dCB3ZSBuZWVkCisvLyBpdCBmb3IgV2luZG93cy9MaW51eC4KK2NsYXNzIFNpemVUd2Vha2VyIDogcHVibGljIFFPYmplY3QgeworUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICAvLyBUaGUgVUkgbG9va3MgZ29vZCBhdCA5NiBEUEkuCisgICAgc3RhdGljIGNvbnN0IHFyZWFsIEJhc2VsaW5lRHBpOworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBTaXplVHdlYWtlciB0aGF0IHdpbGwgYWRqdXN0IHRoZSBhcHBlYXJhbmNlCisgICAgLy8gb2YgfHdpZGdldHwgYmFzZWQgb24gRFBJLCBhcyBpdCBnZXRzIHNob3duL21vdmVkIGJldHdlZW4KKyAgICAvLyBkaXNwbGF5cy4KKyAgICBleHBsaWNpdCBTaXplVHdlYWtlcihRV2lkZ2V0KiB3aWRnZXQpOworCitwcml2YXRlOgorICAgIC8vIEludGVyY2VwdHMgc2hvdyBhbmQgbW92ZSBldmVudHMgZnJvbSB0aGUgbWFuYWdlZCB3aWRnZXQuCisgICAgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiwgUUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisKKyAgICAvLyBBZGp1c3RzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBtYW5hZ2VkIHdpZGdldCBhY2NvcmRpbmcgdG8KKyAgICAvLyB0aGUgRFBJIHByb3BlcnR5IG9mIHRoZSBzY3JlZW4gdGhhdCB0aGUgd2lkZ2V0IGlzIG9uLgorICAgIHZvaWQgYWRqdXN0U2l6ZXNBbmRQb3NpdGlvbnMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBXaWRnZXQgdG8gb3BlcmF0ZSBvbi4KKyAgICBRUG9pbnRlcjxRV2lkZ2V0PiBtU3ViamVjdDsKKworICAgIC8vIFNjYWxlIGZhY3RvcnMgcmVsYXRpdmUgdG8gYmFzZWxpbmUgRFBJLgorICAgIC8vIEZvciBleGFtcGxlLCBhIHZhbHVlIG9mICIyIiBoZXJlIHdvdWxkIGluZGljYXRlIHRoYXQKKyAgICAvLyB0aGUgbWFuYWdlZCB3aWRnZXQgaXMgY3VycmVudGx5IGFkanVzdGVkIGZvciAxOTIgRFBJCisgICAgLy8gKGdpdmVuIHRoYXQgYmFzZWxpbmUgRFBJIGlzIDk2KQorICAgIFFWZWN0b3IyRCBtQ3VycmVudFNjYWxlRmFjdG9yOworfTsKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc291cmNlcy5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3NvdXJjZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwZTUxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3NvdXJjZXMubWsKQEAgLTAsMCArMSwxMTIgQEAKKyMgRGVmaW5pdGlvbnMgcmVsYXRlZCB0byB0aGUgUXQtYmFzZWQgVUkgYmFja2VuZC4KKworQU5EUk9JRF9TS0lOX1NPVVJDRVMgKz0gXAorICAgIGFuZHJvaWQvc2tpbi9xdC9ldmVudC1xdC5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9pbml0LXF0LmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L3N1cmZhY2UtcXQuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmNwcCBcCisKK2lmZXEgKGRhcndpbiwkKEJVSUxEX1RBUkdFVF9PUykpCitBTkRST0lEX1NLSU5fU09VUkNFUyArPSBcCisgICAgYW5kcm9pZC9za2luL3F0L21hYy1uYXRpdmUtd2luZG93Lm1tCitlbmRpZgorCitpZmVxICh3aW5kb3dzLCQoQlVJTERfVEFSR0VUX09TKSkKK0FORFJPSURfU0tJTl9TT1VSQ0VTICs9IFwKKyAgICBhbmRyb2lkL3NraW4vcXQvd2luZG93cy1uYXRpdmUtd2luZG93LmNwcAorZW5kaWYKKworQU5EUk9JRF9TS0lOX0lOQ0xVREVTICs9ICQoRU1VR0xfSU5DTFVERVMpICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpCisKKyMgZ2wtd2lkZ2V0LmNwcCBuZWVkcyB0byBjYWxsIFhJbml0VGhyZWFkcygpIGRpcmVjdGx5IHRvIHdvcmsgYXJvdW5kCisjIGEgUXQgYnVnLiBUaGlzIGltcGxpZXMgYSBkaXJlY3QgZGVwZW5kZW5jeSB0byBsaWJYMTEuc28KK2lmZXEgKGxpbnV4LCQoQlVJTERfVEFSR0VUX09TKSkKK0FORFJPSURfU0tJTl9MRExJQlMgKz0gLWxYMTEKK2VuZGlmCisKKyMgZ2wtd2lkZ2V0LmNwcCBkZXBlbmRzIG9uIGxpYk9wZW5HTEVTRGlzcGF0Y2gsIHdoaWNoIGRlcGVuZHMgb24KKyMgbGliZW11Z2xfY29tbW9uLiBVc2luZyBsaWJPcGVuR0xFU0Rpc3BhdGNoIGVuc3VyZXMgdGhhdCB0aGUgY29kZQorIyB3aWxsIGZpbmQgYW5kIHVzZSB0aGUgc2FtZSBob3N0IEVHTC9HTEVTdjIgbGlicmFyaWVzIGFzIHRoZSBvbmVzCisjIHVzZWQgYnkgRW11R0wuIERvaW5nIGFueXRoaW5nIGVsc2UgaXMgcHJvbmUgdG8gcmVhbGx5IGJhZCBmYWlsdXJlCisjIGNhc2VzLgorQU5EUk9JRF9TS0lOX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAorICAgIGxpYk9wZW5HTEVTRGlzcGF0Y2ggXAorICAgIGxpYmVtdWdsX2NvbW1vbgorCitBTkRST0lEX1NLSU5fU09VUkNFUyArPSBcCisgICAgYW5kcm9pZC9za2luL3F0L2FjY2VsZXJvbWV0ZXItM2Qtd2lkZ2V0LmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2FuZ2xlLWlucHV0LXdpZGdldC5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLWNvbnRhaW5lci5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1vdmVybGF5LmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXZlbnQtY2FwdHVyZXIuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXZlbnQtc2VyaWFsaXplci5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9ldmVudC1zdWJzY3JpYmVyLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9nbC1jYW52YXMuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZ2wtY29tbW9uLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2dsLXRleHR1cmUtZHJhdy5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY29tbW9uLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2JhdHRlcnktcGFnZS5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jZWxsdWxhci1wYWdlLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9maW5nZXItcGFnZS5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9oZWxwLXBhZ2UuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvbG9jYXRpb24tcGFnZS5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9zZXR0aW5ncy1wYWdlLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3RlbGVwaG9ueS1wYWdlLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLmNwcCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXdpbmRvdy5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9zaXplLXR3ZWFrZXIuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvUXRMb29wZXIuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuY3BwIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvc3R5bGVzaGVldC5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5jcHAgXAorICAgIGFuZHJvaWQvc2tpbi9xdC93YXZlZnJvbnQtb2JqLXBhcnNlci5jcHAKKworQU5EUk9JRF9TS0lOX1FUX01PQ19TUkNfRklMRVMgOj0gXAorICAgIGFuZHJvaWQvc2tpbi9xdC9hY2NlbGVyb21ldGVyLTNkLXdpZGdldC5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvYW5nbGUtaW5wdXQtd2lkZ2V0LmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9lZGl0YWJsZS1zbGlkZXItd2lkZ2V0LmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9nbC13aWRnZXQuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLWNvbnRhaW5lci5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZW11bGF0b3Itb3ZlcmxheS5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtd2luZG93LmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V2ZW50LWNhcHR1cmVyLmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9ldmVudC1zdWJzY3JpYmVyLmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9iYXR0ZXJ5LXBhZ2UuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2NlbGx1bGFyLXBhZ2UuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvZmluZ2VyLXBhZ2UuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2hlbHAtcGFnZS5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvbG9jYXRpb24tcGFnZS5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvc2V0dGluZ3MtcGFnZS5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvdGVsZXBob255LXBhZ2UuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L3JhaXNlZC1tYXRlcmlhbC1idXR0b24uaCBcCisgICAgYW5kcm9pZC9za2luL3F0L3NpemUtdHdlYWtlci5oIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvUXRUaW1lckltcGwuaCBcCisgICAgYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmggXAorICAgIGFuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5oCisKK0FORFJPSURfU0tJTl9RVF9SRVNPVVJDRVMgOj0gXAorICAgIGFuZHJvaWQvc2tpbi9xdC9yZXNvdXJjZXMucXJjIFwKKworQU5EUk9JRF9TS0lOX1FUX1VJX1NSQ19GSUxFUyA6PSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLnVpIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvYmF0dGVyeS1wYWdlLnVpIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvY2VsbHVsYXItcGFnZS51aSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2RwYWQtcGFnZS51aSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2Zpbmdlci1wYWdlLnVpIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvbG9jYXRpb24tcGFnZS51aSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL2hlbHAtcGFnZS51aSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3NldHRpbmdzLXBhZ2UudWkgXAorICAgIGFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy90ZWxlcGhvbnktcGFnZS51aSBcCisgICAgYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXBhZ2VzL3ZpcnR1YWwtc2Vuc29ycy1wYWdlLnVpIFwKKyAgICBhbmRyb2lkL3NraW4vcXQvdG9vbHMudWkgXApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzL2ZvbnRzX3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzL2ZvbnRzX3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTNjODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zdHlsZXMvZm9udHNfc3R5bGVzaGVldF90ZW1wbGF0ZS5jc3MKQEAgLTAsMCArMSwyNCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCitRR3JvdXBCb3ggeyBmb250LXdlaWdodDogcmVndWxhcjsgZm9udC1zaXplOiAlJUZPTlRfTUVESVVNJSU7IH0KK1FDb21ib0JveCwgUUxpbmVFZGl0LCBRUGxhaW5UZXh0RWRpdCwgUVB1c2hCdXR0b24sIFFSYWRpb0J1dHRvbiwgUUFic3RyYWN0U3BpbkJveCB7CisgICAgZm9udC13ZWlnaHQ6IHJlZ3VsYXI7CisgICAgZm9udC1zaXplOiAlJUZPTlRfTEFSR0UlJTsKK30KKypbQ29sb3JHcm91cD0iVG9vbCJdIHsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBmb250LXNpemU6ICUlRk9OVF9NRURJVU0lJTsKK30KKyogeworICAgIGZvbnQtc2l6ZTogJSVGT05UX01FRElVTSUlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzL3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzL3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTM3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zdHlsZXMvc3R5bGVzaGVldF90ZW1wbGF0ZS5jc3MKQEAgLTAsMCArMSwyMTYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworKltDb2xvckdyb3VwPSJNYWpvclRhYiJdIHsKKyAgICBjb2xvcjogJSVNQUpPUl9UQUJfQ09MT1IlJTsKKyAgICBwYWRkaW5nOiAwcHggMHB4IDBweCAxNnB4OworfQorKltDb2xvckdyb3VwPSJNYWpvclRhYlRpdGxlIl0geworICAgIGNvbG9yOiAlJU1BSk9SX1RJVExFX0NPTE9SJSU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogJSVUQUJfQktHX0NPTE9SJSUKK30KKypbQ29sb3JHcm91cD0iVGl0bGUiXSB7CisgICAgY29sb3I6ICUlVElUTEVfQ09MT1IlJTsKK30KKyo6OmRpc2FibGVkW0NvbG9yR3JvdXA9IlRvb2wiXSB7IGNvbG9yOiAlJURJU0FCTEVEX1RPT0xfQ09MT1IlJX0KKypbQ29sb3JHcm91cD0iVG9vbCJdIHsgY29sb3I6ICUlVE9PTF9DT0xPUiUlfQorKltjbGFzcz0iRWRpdGFibGVWYWx1ZSJdICB7IGNvbG9yOiAlJVRFWFRfQ09MT1IlJSB9CisqW0NvbG9yR3JvdXA9IlNsaWRlckxhYmVsIl0gIHsgY29sb3I6ICUlVEVYVF9DT0xPUiUlIH0KKypbQ29sb3JHcm91cD0iU21zQm94Il0geyBib3JkZXI6IDFweCBzb2xpZCAlJUJPWF9DT0xPUiUlIH0KKypbQ29sb3JHcm91cD0iSG9yaXpEaXZpZGVyIl0geworICAgIGJhY2tncm91bmQ6IHFsaW5lYXJncmFkaWVudCh4MTogMCwgeTE6IDAsIHgyOiAwLCB5MjogMSwgc3RvcDogMCAgJSVMQVJHRV9ESVZJREVSX0NPTE9SJSUsIHN0b3A6IDEgJSVUQUJfU0VMRUNURURfQ09MT1IlJSk7CisgICAgYm9yZGVyOiAwcHg7Cit9CisqW0NvbG9yR3JvdXA9IkdyYWRpZW50RGl2aWRlciJdIHsKKyAgICBiYWNrZ3JvdW5kOiBxbGluZWFyZ3JhZGllbnQoeDE6IDAsIHkxOiAwLCB4MjogMSwgeTI6IDAsIHN0b3A6IDAgJSVMQVJHRV9ESVZJREVSX0NPTE9SJSUsIHN0b3A6IDEgJSVCS0dfQ09MT1IlJSk7CisgICAgYm9yZGVyOiAwcHg7Cit9CisqeworICAgIGNvbG9yOiAlJVRFWFRfQ09MT1IlJTsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAlJUJLR19DT0xPUiUlOworfQorUUdyb3VwQm94Ojp0aXRsZSB7IG1hcmdpbi10b3A6IDRweDsgbWFyZ2luLWxlZnQ6IDBweCB9CitRVGV4dEVkaXQ6ZGlzYWJsZWQsIFFMaW5lRWRpdDpkaXNhYmxlZCB7IGJvcmRlcjogMHB4IH0KK1FUZXh0RWRpdCwgUUxpbmVFZGl0IHsKKyAgICBib3JkZXItdG9wOiAwcHg7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICUlRURJVF9DT0xPUiUlOworfQorUUxpbmVFZGl0OmZvY3VzIHsKKyAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgJSVUT09MX0NPTE9SJSU7Cit9CitRUGxhaW5UZXh0RWRpdDpkaXNhYmxlZCwgUVBsYWluVGV4dEVkaXRbcmVhZE9ubHk9dHJ1ZV0geworICAgIGJvcmRlcjogMHB4OworICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50Cit9CitRUGxhaW5UZXh0RWRpdCB7CisgICAgYmFja2dyb3VuZDogJSVUQUJfQktHX0NPTE9SJSU7CisgICAgYm9yZGVyOiAxcHggc29saWQgJSVFRElUX0NPTE9SJSU7Cit9CitRQ2hlY2tCb3g6OmluZGljYXRvcjpjaGVja2VkW0NvbG9yR3JvdXA9IlRvZ2dsZSJdIHsKKyAgICBpbWFnZTogdXJsKDovJSVQQVRIJSUvdG9nZ2xlX29uKTsKKyAgICB3aWR0aDogMzY7IGhlaWdodDogMjQ7Cit9CitRQ2hlY2tCb3g6OmluZGljYXRvcjp1bmNoZWNrZWRbQ29sb3JHcm91cD0iVG9nZ2xlIl0geworICAgIGltYWdlOiB1cmwoOi8lJVBBVEglJS90b2dnbGVfb2ZmKTsKKyAgICB3aWR0aDogMzY7IGhlaWdodDogMjQ7Cit9CitRQ2hlY2tCb3g6OmluZGljYXRvcjpjaGVja2VkIHsKKyAgICBpbWFnZTogdXJsKDovJSVQQVRIJSUvY2hlY2tfeWVzKQorfQorUUNoZWNrQm94OjppbmRpY2F0b3I6dW5jaGVja2VkIHsKKyAgICBpbWFnZTogdXJsKDovJSVQQVRIJSUvY2hlY2tfbm8pCit9CitRUHVzaEJ1dHRvbjpwcmVzc2VkW1Rvb2xXaW5kb3dCdXR0b249dHJ1ZV0sIFFQdXNoQnV0dG9uOmNoZWNrZWRbVG9vbFdpbmRvd0J1dHRvbj10cnVlXSB7CisgICAgYm9yZGVyOiBub25lOworICAgIGJhY2tncm91bmQ6ICUlVEFCX0RBUktFTkVEX0NPTE9SJSU7CisgICAgYm9yZGVyLXJhZGl1czogNHB4OworfQorUVB1c2hCdXR0b246cHJlc3NlZFtoZWxwQnV0dG9uPXRydWVdIHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgYmFja2dyb3VuZDogJSVUQUJfREFSS0VORURfQ09MT1IlJTsKK30KK1FQdXNoQnV0dG9uW0NvbG9yR3JvdXA9Ik1ham9yVGFiIl0geworICAgIGJvcmRlcjogbm9uZTsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworICAgIGNvbG9yOiAlJU1BSk9SX1RBQl9DT0xPUiUlOworICAgIGJhY2tncm91bmQ6ICUlVEFCX0JLR19DT0xPUiUlOworfQorUVB1c2hCdXR0b25bQ29sb3JHcm91cD0iTWFqb3JUYWJUaXRsZSJdIHsKKyAgICBib3JkZXI6IG5vbmU7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBjb2xvcjogJSVNQUpPUl9UQUJfQ09MT1IlJTsKKyAgICBiYWNrZ3JvdW5kOiAlJVRBQl9CS0dfQ09MT1IlJTsKK30KK1FQdXNoQnV0dG9uOnByZXNzZWRbQ29sb3JHcm91cD0iTWFqb3JUYWIiXSB7CisgICAgYm9yZGVyOiBub25lOworICAgIGJhY2tncm91bmQ6ICUlVEFCX0RBUktFTkVEX0NPTE9SJSU7Cit9CitRUHVzaEJ1dHRvbjpjaGVja2VkW0NvbG9yR3JvdXA9Ik1ham9yVGFiIl0geworICAgIGJvcmRlcjogbm9uZTsKKyAgICBiYWNrZ3JvdW5kOiAlJVRBQl9TRUxFQ1RFRF9DT0xPUiUlOworfQorUVB1c2hCdXR0b246cHJlc3NlZFtDb2xvckdyb3VwPSJUb29sIl0geworICAgIGJvcmRlcjogbm9uZTsKK30KK1FSYWRpb0J1dHRvbjo6aW5kaWNhdG9yOnVuY2hlY2tlZCB7CisgICAgaW1hZ2U6IHVybCg6LyUlUEFUSCUlL3JhZGlvX29mZik7CisgICAgd2lkdGg6IDI0OyBoZWlnaHQ6IDI0OworfQorUVJhZGlvQnV0dG9uOjppbmRpY2F0b3I6Y2hlY2tlZCB7CisgICAgaW1hZ2U6IHVybCg6LyUlUEFUSCUlL3JhZGlvX29uKTsKKyAgICB3aWR0aDogMjQ7IGhlaWdodDogMjQ7Cit9CitRU2xpZGVyOjpncm9vdmUge2JvcmRlcjogMXB4IDtoZWlnaHQ6IDJweDt9CitRU2xpZGVyOjpoYW5kbGUgeworICAgIGJhY2tncm91bmQ6IHNvbGlkICUlVE9PTF9DT0xPUiUlOworICAgIGJvcmRlcjogMXB4IHNvbGlkICUlVE9PTF9DT0xPUiUlOworICAgIHdpZHRoOiAxMnB4OworICAgIG1hcmdpbjogLTZweCAwOworICAgIGJvcmRlci1yYWRpdXM6IDdweDsKK30KK1FTbGlkZXI6OnN1Yi1wYWdlOmhvcml6b250YWwgeworICAgIGJhY2tncm91bmQ6ICUlVE9PTF9DT0xPUiUlOworICAgIGJvcmRlci1yYWRpdXM6IDFweDsKK30KK1FTbGlkZXI6OmFkZC1wYWdlOmhvcml6b250YWwgeworICAgIGJhY2tncm91bmQ6ICUlQk9YX0NPTE9SJSU7CisgICAgYm9yZGVyLXJhZGl1czogMXB4OworfQorUVRleHRCcm93c2VyLCBRVGFibGVXaWRnZXQgeworICAgIGdyaWRsaW5lLWNvbG9yOiAlJVRBQl9CS0dfQ09MT1IlJTsKKyAgICBiYWNrZ3JvdW5kOiAlJVRBQl9CS0dfQ09MT1IlJTsKKyAgICBib3JkZXI6IDFweCBzb2xpZCAlJUVESVRfQ09MT1IlJTsKK30KK1FUYWJsZVZpZXc6Oml0ZW0geworICAgIHBhZGRpbmctbGVmdDogMTY7CisgICAgcGFkZGluZy1yaWdodDogMTY7CisgICAgYm9yZGVyOiAwOworICAgIGJvcmRlci1ib3R0b206IDEgc29saWQgJSVUQUJMRV9CT1RUT01fQ09MT1IlJTsKK30KK1FUYWJsZVZpZXc6Oml0ZW06Zm9jdXN7fQorUUhlYWRlclZpZXc6OnNlY3Rpb24geworICAgIGNvbG9yOiAlJVRJVExFX0NPTE9SJSU7CisgICAgYmFja2dyb3VuZDogJSVUQUJfQktHX0NPTE9SJSU7CisgICAgYm9yZGVyOiAwcHg7IHBhZGRpbmc6IDE2OworICAgIGJvcmRlci1ib3R0b206IDEgc29saWQgJSVESVZJREVSX0NPTE9SJSU7Cit9CitRU2Nyb2xsQmFyOjp2ZXJ0aWNhbCB7CisgICAgYmFja2dyb3VuZDogJSVTQ1JPTExfQktHX0NPTE9SJSU7CisgICAgd2lkdGg6IDhweDsKKyAgICBtYXJnaW4gMjFweCAwIDIxIHB4IDA7Cit9CitRU2Nyb2xsQmFyOjpoYW5kbGU6dmVydGljYWwgeworICAgIGJhY2tncm91bmQ6ICUlU0NST0xMX0hBTkRMRV9DT0xPUiUlOworICAgIG1pbi1oZWlnaHQ6IDI1cHg7Cit9CitRU2Nyb2xsQmFyOjphZGQtbGluZTp2ZXJ0aWNhbCB7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogbm9uZSB9CitRU2Nyb2xsQmFyOjpzdWItbGluZTp2ZXJ0aWNhbCB7IGJvcmRlcjogbm9uZTsgYmFja2dyb3VuZDogbm9uZSB9CitRQ29tYm9Cb3ggeworICAgIGJvcmRlci10b3A6IDBweDsKKyAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJSVCT1hfQ09MT1IlJTsKKyAgICBzZWxlY3Rpb24tYmFja2dyb3VuZC1jb2xvcjogJSVUQUJfQktHX0NPTE9SJSU7Cit9CitRQ29tYm9Cb3g6OmRyb3AtZG93biB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgfQorUUNvbWJvQm94Ojpkb3duLWFycm93IHsKKyAgICBpbWFnZTp1cmwoOi8lJVBBVEglJS9kcm9wX2Rvd24pOworICAgIGJvcmRlcjogbm9uZTsKKyAgICB3aWR0aDogMjQ7CisgICAgaGVpZ2h0OiAyNDsKK30KK1FMaXN0VmlldyB7IG1pbi1oZWlnaHQ6IDRlbSB9CitRVGFiV2lkZ2V0OjpwYW5lIHtib3JkZXI6IG5vbmU7fQorUVRhYldpZGdldDo6dGFiLWJhciB7bGVmdDogMHB4O30KK1FUYWJCYXI6OnRhYiB7CisgICAgYmFja2dyb3VuZDogJSVCS0dfQ09MT1IlJTsKKyAgICBwYWRkaW5nLWJvdHRvbTo4cHg7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgICBtYXJnaW4tbGVmdDogOAorfQorUVRhYkJhcjo6dGFiOnNlbGVjdGVkIHsKKyAgICBjb2xvcjogJSVURVhUX0NPTE9SJSU7CisgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICUlVE9PTF9DT0xPUiUlOworfQorUVRhYkJhcjo6dGFiOiFzZWxlY3RlZHsKKyAgICBjb2xvcjogJSVUSVRMRV9DT0xPUiUlOworICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAlJUJLR19DT0xPUiUlOworfQorUVRhYkJhcjo6dGFiOmRpc2FibGVkIHsKKyAgICBjb2xvcjogdHJhbnNwYXJlbnQ7CisgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHRyYW5zcGFyZW50Cit9CitSYWlzZWRNYXRlcmlhbEJ1dHRvbiB7CisgICAgYm9yZGVyLXJhZGl1czogMnB4OworICAgIGNvbG9yOiAlJVRPT0xfQ09MT1IlJTsKK30KK1JhaXNlZE1hdGVyaWFsQnV0dG9uOnByZXNzZWQgeworICAgIGJhY2tncm91bmQ6ICUlVEFCX0RBUktFTkVEX0NPTE9SJSU7Cit9CitRQWJzdHJhY3RTcGluQm94IHsKKyAgICBib3JkZXItdG9wOiAwcHg7CisgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICUlRURJVF9DT0xPUiUlOworICAgIHBhZGRpbmctYm90dG9tOiA0OworfQorUUFic3RyYWN0U3BpbkJveDpmb2N1cyB7CisgICAgYm9yZGVyLXRvcDogMHB4OworICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAlJVRPT0xfQ09MT1IlJTsKK30KK1FBYnN0cmFjdFNwaW5Cb3g6dXAtYnV0dG9uIHsKKyAgICBib3JkZXItaW1hZ2U6IHVybCg6LyUlUEFUSCUlL2Fycm93X2Ryb3BfdXApOworICAgIHdpZHRoOiAxMjsKK30KK1FBYnN0cmFjdFNwaW5Cb3g6ZG93bi1idXR0b24geworICAgIGJvcmRlci1pbWFnZTogdXJsKDovJSVQQVRIJSUvYXJyb3dfZHJvcF9kb3duKTsKKyAgICB3aWR0aDogMTI7Cit9CitRTGluZUVkaXRbQ29sb3JHcm91cD0iSW52YWxpZElucHV0Il0geworICAgIGNvbG9yOiAjZmYwMDAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzaGVldC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zdHlsZXNoZWV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Q4ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3R5bGVzaGVldC5jcHAKQEAgLTAsMCArMSwzMTMgQEAKKy8vQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3N0eWxlc2hlZXQuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxRRmlsZT4KKyNpbmNsdWRlIDxRSGFzaD4KKyNpbmNsdWRlIDxRTXV0ZXg+CisjaW5jbHVkZSA8UVRleHRTdHJlYW0+CisjaW5jbHVkZSA8UXRHbG9iYWw+CisKK25hbWVzcGFjZSBVaSB7CisKK2NvbnN0IGNoYXIqIFRIRU1FX1BBVEhfVkFSID0gIlBBVEgiOworY29uc3QgY2hhciogTUFKT1JfVEFCX0NPTE9SX1ZBUiA9ICJNQUpPUl9UQUJfQ09MT1IiOworY29uc3QgY2hhciogVEFCX0JLR19DT0xPUl9WQVIgPSAiVEFCX0JLR19DT0xPUiI7Citjb25zdCBjaGFyKiBUQUJfU0VMRUNURURfQ09MT1JfVkFSID0gIlRBQl9TRUxFQ1RFRF9DT0xPUiI7CisKK3N0YXRpYyBRU3RyaW5nIGRhcmtTdHlsZXNoZWV0Oworc3RhdGljIFFTdHJpbmcgbGlnaHRTdHlsZXNoZWV0OworCitzdGF0aWMgUVN0cmluZyBoaURlbnNpdHlGb250U3R5bGVzaGVldDsKK3N0YXRpYyBRU3RyaW5nIGxvRGVuc2l0eUZvbnRTdHlsZXNoZWV0OworCisvLyBXZSBoYXZlIHR3byBzdHlsZXM6IG9uZSBmb3IgdGhlIGxpZ2h0LWNvbG9yZWQgdGhlbWUgYW5kIG9uZSBmb3IKKy8vIHRoZSBkYXJrLWNvbG9yZWQgdGhlbWUuCisvLworLy8gRWFjaCB0aGVtZSBpbmRpY2F0ZXMgdGhlIGNvbG9ycyB0aGF0IGFyZSB0byBiZSB1c2VkIGZvciB0aGUgZm9yZWdyb3VuZAorLy8gKG1vc3RseSB0ZXh0KSBhbmQgdGhlIGJhY2tncm91bmQuCisvLworLy8gRXZlbiB3aXRoaW4gYSB0aGVtZSwgbm90IGFsbCB3aWRnZXRzIHVzZSB0aGUgc2FtZSBjb2xvcnMuIFRoZSBzdHlsZQorLy8gc2hlZXQgYWNjb21vZGF0ZXMgdGhpcyBieSBhc3NvY2lhdGluZyBjb2xvcnMgYmFzZWQgb24gInByb3BlcnRpZXMiCisvLyB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBhIHdpZGdldC4gKFByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiB0aGUgLnVpCisvLyBmaWxlLikKKy8vCisvLyBTbyBmYXIsIHdlIGhhdmUgdGhlc2Ugc3BlY2lhbCBzdHlsZXMgZm9yIGVhY2ggdGhlbWU6CisvLyAgICJNYWpvclRhYiI6ICAgICAgIFRoZSBhcmVhIG9mIHRoZSB0YWIgYnV0dG9ucyBvbiB0aGUgbGVmdCBvZiB0aGUgd2luZG93CisvLyAgICJNYWpvclRhYlRpdGxlIjogIFNlY3Rpb24gdGl0bGVzIHNlcGFyYXRpbmcgdGhlIHRhYiBidXR0b25zCisvLyAgICJUaXRsZSI6ICAgICAgICAgIFNlY3Rpb24gdGl0bGVzIGluIHRoZSBtYWluIHBhcnQgb2YgdGhlIHdpbmRvdworLy8gICAiVG9vbCI6ICAgICAgICAgICBCdXR0b25zIHdob3NlIHRleHQgaXMgdGhlIHNhbWUgY29sb3IgYXMgYSBjaGVja2JveAorLy8gICAiRWRpdGFibGVWYWx1ZSI6ICAgIFRleHQgdGhhdCBjYW4gYmUgZWRpdGVkCisvLyAgICJTbGlkZXJMYWJlbCI6ICAgICAgVGhlIGxhYmVsIG9uIGEgc2xpZGVyCisvLyAgICJTbXNCb3giOiAgICAgICAgICAgVGhlIG9uZSBpdGVtIHRoYXQgaGFzIGEgYm9yZGVyIG9uIGFsbCBmb3VyIHNpZGVzCisvLyAgICJHcmFkaWVudERpdmlkZXIiOiAgVGhlIHZlcnRpY2FsIGxpbmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHRhYnMKKy8vICAgPE5vcm1hbD46ICAgICAgICAgVGV4dCBpbiB0aGUgbWFpbiBwYXJ0IG9mIHRoZSB3aW5kb3cKKy8vCisvLyBUaGVzZSBhcmUgaWRlbnRpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlaXIgIkNvbG9yR3JvdXAiIG9yICJjbGFzcyIKKy8vIHByb3BlcnR5LgorCisvLyBUaGVzZSBhcmUgdGhlIGNvbG9ycyB1c2VkIGluIHRoZSB0d28gdGhlbWVzCisKK1FIYXNoPFFTdHJpbmcsIFFTdHJpbmc+IGxpZ2h0VmFsdWVzIHsKKyAgICB7IkJPWF9DT0xPUiIsICAgICAgICAgICAgIiNlMGUwZTAifSwgIC8vIEJvdW5kYXJ5IGFyb3VuZCBTTVMgdGV4dCBhcmVhCisgICAgeyJCS0dfQ09MT1IiLCAgICAgICAgICAgICIjZjBmMGYwIn0sICAvLyBNYWluIHBhZ2UgYmFja2dyb3VuZAorICAgIHsiRElTQUJMRURfVE9PTF9DT0xPUiIsICAiI2JhZWFlNCJ9LCAgLy8gR3JheWVkLW91dCBidXR0b24gdGV4dAorICAgIHsiRElWSURFUl9DT0xPUiIsICAgICAgICAiI2UwZTBlMCJ9LCAgLy8gTGluZSBiZXR3ZWVuIGl0ZW1zCisgICAgeyJFRElUX0NPTE9SIiwgICAgICAgICAgICIjZTBlMGUwIn0sICAvLyBMaW5lIHVuZGVyIGVkaXRhYmxlIGZpZWxkcworICAgIHsiTEFSR0VfRElWSURFUl9DT0xPUiIsICAiI2ViZWJlYiJ9LCAgLy8gU3RhcnQgb2YgbGFyZ2UgZGl2aWRlcidzIGdyYWRpZW50CisgICAge01BSk9SX1RBQl9DT0xPUl9WQVIsICAgICIjOTFhNGFkIn0sICAvLyBUZXh0IG9mIG1ham9yIHRhYnMKKyAgICB7Ik1BSk9SX1RJVExFX0NPTE9SIiwgICAgIiM2MTdkOGEifSwgIC8vIFRleHQgb2YgbWFqb3IgdGFiIHNlcGFyYXRvcnMKKyAgICB7IlNDUk9MTF9CS0dfQ09MT1IiLCAgICAgIiNmNmY2ZjYifSwgIC8vIEJhY2tncm91bmQgb2Ygc2Nyb2xsIGJhcgorICAgIHsiU0NST0xMX0hBTkRMRV9DT0xPUiIsICAiI2Q5ZDlkOSJ9LCAgLy8gSGFuZGxlIG9mIHNjcm9sbGVyCisgICAge1RBQl9CS0dfQ09MT1JfVkFSLCAgICAgICIjZmZmZmZmIn0sICAvLyBCYWNrZ3JvdW5kIG9mIG1ham9yIHRhYnMKKyAgICB7VEFCX1NFTEVDVEVEX0NPTE9SX1ZBUiwgIiNmNWY1ZjUifSwgIC8vIEJhY2tncm91bmQgb2YgdGhlIHNlbGVjdGVkIG1ham9yIHRhYgorICAgIHsiVEFCX0RBUktFTkVEX0NPTE9SIiwgICAiI2U2ZTZlNiJ9LAorICAgIHsiVEFCTEVfQk9UVE9NX0NPTE9SIiwgICAiI2UwZTBlMCJ9LAorICAgIHsiVEVYVF9DT0xPUiIsICAgICAgICAgICAiIzIxMjEyMSJ9LCAgLy8gTWFpbiBwYWdlIHRleHQKKyAgICB7IlRJVExFX0NPTE9SIiwgICAgICAgICAgIiM3NTc1NzUifSwgIC8vIE1haW4gcGFnZSB0aXRsZXMKKyAgICB7IlRPT0xfQ09MT1IiLCAgICAgICAgICAgIiMwMGJlYTQifSwgIC8vIENoZWNrYm94ZXMsIHNsaWRlcnMsIGV0Yy4KKyAgICB7VEhFTUVfUEFUSF9WQVIsICAgICAgICAgICAibGlnaHQifSwgIC8vIEljb24gZGlyZWN0b3J5IHVuZGVyIGltYWdlcy8KK307CisKK1FIYXNoPFFTdHJpbmcsIFFTdHJpbmc+IGRhcmtWYWx1ZXMgeworICAgIHsiQk9YX0NPTE9SIiwgICAgICAgICAgICAgIiM0MTRhNTAifSwKKyAgICB7IkJLR19DT0xPUiIsICAgICAgICAgICAgICIjMjczMjM4In0sCisgICAgeyJESVNBQkxFRF9UT09MX0NPTE9SIiwgICAiIzFiNWM1OCJ9LAorICAgIHsiRElWSURFUl9DT0xPUiIsICAgICAgICAgIiNlMGUwZTAifSwKKyAgICB7IkVESVRfQ09MT1IiLCAgICAgICAgICAgICIjODA4MDgwIn0sCisgICAgeyJMQVJHRV9ESVZJREVSX0NPTE9SIiwgICAiIzFmMjgyZCJ9LAorICAgIHtNQUpPUl9UQUJfQ09MT1JfVkFSLCAgICAgIiNiZGMwYzMifSwKKyAgICB7Ik1BSk9SX1RJVExFX0NPTE9SIiwgICAgICIjZTVlNmU3In0sCisgICAgeyJTQ1JPTExfQktHX0NPTE9SIiwgICAgICAiIzMzM2I0MyJ9LAorICAgIHsiU0NST0xMX0hBTkRMRV9DT0xPUiIsICAgIiMxZDI3MmMifSwKKyAgICB7VEFCX0JLR19DT0xPUl9WQVIsICAgICAgICIjMzk0MjQ5In0sCisgICAge1RBQl9TRUxFQ1RFRF9DT0xPUl9WQVIsICAiIzMxM2M0MiJ9LAorICAgIHsiVEFCX0RBUktFTkVEX0NPTE9SIiwgICAgIiMyMDI5MmUifSwKKyAgICB7IlRBQkxFX0JPVFRPTV9DT0xPUiIsICAgICIjMWQyNzJjIn0sCisgICAgeyJURVhUX0NPTE9SIiwgICAgICAgICAgICAiI2VlZWVlZSJ9LAorICAgIHsiVElUTEVfQ09MT1IiLCAgICAgICAgICAgIiNiZWMxYzMifSwKKyAgICB7IlRPT0xfQ09MT1IiLCAgICAgICAgICAgICIjMDBiZWE0In0sCisgICAge1RIRU1FX1BBVEhfVkFSLCAgICAgICAgICAgICAiZGFyayJ9LAorfTsKKworUUhhc2g8UVN0cmluZywgUVN0cmluZz4gaGlEZW5zaXR5VmFsdWVzIHsKKyAgICB7IkZPTlRfTUVESVVNIiwgIjhwdCJ9LAorICAgIHsiRk9OVF9MQVJHRSIsICIxMHB0In0sCit9OworCitRSGFzaDxRU3RyaW5nLCBRU3RyaW5nPiBsb0RlbnNpdHlWYWx1ZXMgeworICAgIHsiRk9OVF9NRURJVU0iLCAiOHB0In0sCisgICAgeyJGT05UX0xBUkdFIiwgIjEwcHQifSwKK307CisKKy8vIEVuY2Fwc3VsYXRlcyBwYXJzaW5nIGEgc3R5bGVzaGVldCB0ZW1wbGF0ZSBhbmQgZ2VuZXJhdGluZyBhIHN0eWxlc2hlZXQKKy8vIGZyb20gdGVtcGxhdGUuCisvLyBTdHlsZXNoZWV0IHRlbXBsYXRlcyBhcmUgYXJiaXRyYXJ5IHN0cmluZ3Mgd2hpY2ggbWF5IGNvbnRhaW4gcmVmZXJlbmNlcworLy8gdG8gdmFyaWFibGVzLiBBIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGxvb2tzIGxpa2UgdGhpczogJSV2YXJpYWJsZV9uYW1lJSUKKy8vIFRoZSB2YXJpYWJsZSBuYW1lIGlzIGFsbG93ZWQgdG8gY29udGFpbiBhbHBoYWJldGljIGNoYXJhY3RlcnMuCitjbGFzcyBTdHlsZXNoZWV0VGVtcGxhdGUgeworICAgIGVudW0gY2xhc3MgVGVtcGxhdGVCbG9ja1R5cGUgeyBSYXdUZXh0LCBVbmJvdW5kVmFyaWFibGUgfTsKKworICAgIHN0cnVjdCBUZW1wbGF0ZUJsb2NrIHsKKyAgICAgICAgVGVtcGxhdGVCbG9ja1R5cGUgdHlwZTsKKyAgICAgICAgUVN0cmluZyB0ZXh0OworICAgIH07CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24uIExvb2tzIGF0IHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtIGFuZCBkaXNjYXJkcworICAgIC8vIGl0IGlmIGl0IGlzIGVxdWFsIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyLiBSZXR1cm5zIHRydWUgaWYgdGhlIG5leHQKKyAgICAvLyBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbSBoYXMgYmVlbiBkaXNjYXJkZWQsIGZhbHNlIGlmIG5vdC4KKyAgICBzdGF0aWMgYm9vbCBwZWVrQW5kRGlzY2FyZChjaGFyIGRpc2NhcmRfY2hhciwgUUlPRGV2aWNlKiBzdHJlYW0pIHsKKyAgICAgICAgY2hhciBjOworICAgICAgICBpZiAoc3RyZWFtLT5wZWVrKCZjLCAxKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjID09IGRpc2NhcmRfY2hhciA/IHN0cmVhbS0+Z2V0Q2hhcihudWxscHRyKSA6IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLy8gTG9hZHMgdGhlIHRlbXBsYXRlIGZyb20gYSBnaXZlbiBsb2NhdGlvbiBhbmQgcGFyc2VzIGl0LgorICAgIGV4cGxpY2l0IFN0eWxlc2hlZXRUZW1wbGF0ZShjb25zdCBRU3RyaW5nJiBsb2NhdGlvbikgOiBtT2sodHJ1ZSkgeworICAgICAgICBRRmlsZSBzb3VyY2VfZmlsZShsb2NhdGlvbik7CisgICAgICAgIGlmICghc291cmNlX2ZpbGUub3BlbihRSU9EZXZpY2U6OlJlYWRPbmx5KSkgeworICAgICAgICAgICAgcVdhcm5pbmcoIlN0eWxlc2hlZXRUZW1wbGF0ZTogY291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgbU9rID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBUZW1wbGF0ZUJsb2NrVHlwZSBjdXJyZW50X2Jsb2NrX3R5cGUgPSBUZW1wbGF0ZUJsb2NrVHlwZTo6UmF3VGV4dDsKKyAgICAgICAgY2hhciBjdXJyZW50X2NoYXI7CisgICAgICAgIFFTdHJpbmcgYnVmOworICAgICAgICB3aGlsZSAobU9rICYmIHNvdXJjZV9maWxlLmdldENoYXIoJmN1cnJlbnRfY2hhcikpIHsKKyAgICAgICAgICAgIHN3aXRjaChjdXJyZW50X2Jsb2NrX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVCbG9ja1R5cGU6OlJhd1RleHQ6CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfY2hhciA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlZWtBbmREaXNjYXJkKCclJywgJnNvdXJjZV9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkQmxvY2soY3VycmVudF9ibG9ja190eXBlLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ibG9ja190eXBlID0gVGVtcGxhdGVCbG9ja1R5cGU6OlVuYm91bmRWYXJpYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjdXJyZW50X2NoYXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBUZW1wbGF0ZUJsb2NrVHlwZTo6VW5ib3VuZFZhcmlhYmxlOgorICAgICAgICAgICAgICAgIGlmIChpc2FscGhhKGN1cnJlbnRfY2hhcikgfHwgY3VycmVudF9jaGFyID09ICdfJykgeworICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGN1cnJlbnRfY2hhcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlZWtBbmREaXNjYXJkKCclJywgJnNvdXJjZV9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkQmxvY2soY3VycmVudF9ibG9ja190eXBlLCBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ibG9ja190eXBlID0gVGVtcGxhdGVCbG9ja1R5cGU6OlJhd1RleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFXYXJuaW5nKCJTdHlsZXNoZWV0VGVtcGxhdGU6IEJhZCB2YXJpYWJsZSBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2Jsb2NrX3R5cGUgPSBUZW1wbGF0ZUJsb2NrVHlwZTo6UmF3VGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIHRoZSBsYXN0IHJlbWFpbmluZyBibG9jay4KKyAgICAgICAgc3dpdGNoIChjdXJyZW50X2Jsb2NrX3R5cGUpIHsKKyAgICAgICAgY2FzZSBUZW1wbGF0ZUJsb2NrVHlwZTo6UmF3VGV4dDoKKyAgICAgICAgICAgIC8vIGZsdXNoLgorICAgICAgICAgICAgYWRkQmxvY2soY3VycmVudF9ibG9ja190eXBlLCBidWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVGVtcGxhdGVCbG9ja1R5cGU6OlVuYm91bmRWYXJpYWJsZToKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiBmb3IgdmFsaWQgaW5wdXRzLgorICAgICAgICAgICAgcVdhcm5pbmcoIlN0eWxlc2hlZXRUZW1wbGF0ZTogVW50ZXJtaW5hdGVkIHZhcmlhYmxlIG5hbWUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgYnVmLnRvU3RkU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBtT2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0cyBhIHN0eWxlc2hlZXQgdG8gdGhlIGdpdmVuIHxzdHJlYW18IHdpdGggYWxsIHRoZSByZWZlcmVuY2VzIHRvCisgICAgLy8gdmFyaWFibGVzIHN1YnN0aXR1dGVkIGJ5IHZhbHVlcyBsb29rZWQgdXAgZnJvbSB8YXJndW1lbnRzfC4KKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCByZW5kZXIoY29uc3QgUUhhc2g8UVN0cmluZywgUVN0cmluZz4mIGFyZ3VtZW50cywgUVRleHRTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGJsb2NrIDogbUJsb2NrcykgeworICAgICAgICAgICAgc3dpdGNoKGJsb2NrLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGVtcGxhdGVCbG9ja1R5cGU6OlJhd1RleHQ6CisgICAgICAgICAgICAgICAgKCpzdHJlYW0pIDw8IGJsb2NrLnRleHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRlbXBsYXRlQmxvY2tUeXBlOjpVbmJvdW5kVmFyaWFibGU6CisgICAgICAgICAgICAgICAgYXV0byB2YWx1ZV9pdGVyYXRvciA9IGFyZ3VtZW50cy5maW5kKGJsb2NrLnRleHQpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZV9pdGVyYXRvciAhPSBhcmd1bWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKCpzdHJlYW0pIDw8IHZhbHVlX2l0ZXJhdG9yLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcVdhcm5pbmcoIlN0eWxlc2hlZXRUZW1wbGF0ZTogdmFyaWFibGUgJXMgdW5ib3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLnRleHQudG9TdGRTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRlbXBsYXRlIGhhcyBiZWVuIHBhcnNlZCBzdWNjZXNzZnVsbHkuCisgICAgYm9vbCBpc09rKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU9rOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gLSBhcHBlbmRzIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGxpc3Qgb2YgYmxvY2tzLgorICAgIHZvaWQgYWRkQmxvY2soVGVtcGxhdGVCbG9ja1R5cGUgdHlwZSwgY29uc3QgUVN0cmluZyYgc3RyKSB7CisgICAgICAgIG1CbG9ja3MuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIG1CbG9ja3MuYmFjaygpLnR5cGUgPSB0eXBlOworICAgICAgICBtQmxvY2tzLmJhY2soKS50ZXh0ID0gc3RyOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPFRlbXBsYXRlQmxvY2s+IG1CbG9ja3M7CisgICAgYm9vbCBtT2s7Cit9OworCitzdGF0aWMgYm9vbCBpbml0aWFsaXplU3R5bGVzaGVldHMoKSB7CisgICAgU3R5bGVzaGVldFRlbXBsYXRlIHRwbCgiOi9zdHlsZXMvc3R5bGVzaGVldF90ZW1wbGF0ZS5jc3MiKTsKKyAgICBpZiAoIXRwbC5pc09rKCkpIHsKKyAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBsb2FkIHN0eWxlc2hlZXQgdGVtcGxhdGUhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBRVGV4dFN0cmVhbSBkYXJrX3N0eWxlc2hlZXRfc3RyZWFtKCZkYXJrU3R5bGVzaGVldCk7CisgICAgaWYgKCF0cGwucmVuZGVyKGRhcmtWYWx1ZXMsICZkYXJrX3N0eWxlc2hlZXRfc3RyZWFtKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUVRleHRTdHJlYW0gbGlnaHRfc3R5bGVzaGVldF9zdHJlYW0oJmxpZ2h0U3R5bGVzaGVldCk7CisgICAgaWYgKCF0cGwucmVuZGVyKGxpZ2h0VmFsdWVzLCAmbGlnaHRfc3R5bGVzaGVldF9zdHJlYW0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHlsZXNoZWV0VGVtcGxhdGUgZm9udF90cGwoIjovc3R5bGVzL2ZvbnRzX3N0eWxlc2hlZXRfdGVtcGxhdGUuY3NzIik7CisgICAgaWYgKCFmb250X3RwbC5pc09rKCkpIHsKKyAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBsb2FkIGZvbnQgc3R5bGVzaGVldCB0ZW1wbGF0ZSEiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFFUZXh0U3RyZWFtIGhpX2ZvbnRfc3R5bGVzaGVldF9zdHJlYW0oJmhpRGVuc2l0eUZvbnRTdHlsZXNoZWV0KTsKKyAgICBpZiAoIWZvbnRfdHBsLnJlbmRlcihoaURlbnNpdHlWYWx1ZXMsICZoaV9mb250X3N0eWxlc2hlZXRfc3RyZWFtKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUVRleHRTdHJlYW0gbG9fZm9udF9zdHlsZXNoZWV0X3N0cmVhbSgmbG9EZW5zaXR5Rm9udFN0eWxlc2hlZXQpOworICAgIGlmICghZm9udF90cGwucmVuZGVyKGxvRGVuc2l0eVZhbHVlcywgJmxvX2ZvbnRfc3R5bGVzaGVldF9zdHJlYW0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgUVN0cmluZyYgc3R5bGVzaGVldEZvclRoZW1lKFNldHRpbmdzVGhlbWUgdGhlbWUpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWM8Ym9vbD4gc3R5bGVzaGVldHNfaW5pdGlhbGl6ZWQoZmFsc2UpOworICAgIHN0YXRpYyBRTXV0ZXggaW5pdF9tdXRleDsKKyAgICBpZiAoIXN0eWxlc2hlZXRzX2luaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRfbXV0ZXgubG9jaygpOworICAgICAgICBpZiAoIXN0eWxlc2hlZXRzX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBpZiAoIWluaXRpYWxpemVTdHlsZXNoZWV0cygpKSB7CisgICAgICAgICAgICAgICAgcVdhcm5pbmcoIkZhaWxlZCB0byBpbml0aWFsaXplIFVJIHN0eWxlc2hlZXRzISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0eWxlc2hlZXRzX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgaW5pdF9tdXRleC51bmxvY2soKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRoZW1lKSB7CisgICAgY2FzZSBTRVRUSU5HU19USEVNRV9EQVJLOgorICAgICAgICByZXR1cm4gZGFya1N0eWxlc2hlZXQ7CisgICAgY2FzZSBTRVRUSU5HU19USEVNRV9MSUdIVDoKKyAgICAgICAgcmV0dXJuIGxpZ2h0U3R5bGVzaGVldDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbGlnaHRTdHlsZXNoZWV0OworICAgIH0KK30KKworY29uc3QgUVN0cmluZyYgZm9udFN0eWxlc2hlZXQoYm9vbCBoaV9kZW5zaXR5KSB7CisgICAgcmV0dXJuIGhpX2RlbnNpdHkgPyBoaURlbnNpdHlGb250U3R5bGVzaGVldCA6IGxvRGVuc2l0eUZvbnRTdHlsZXNoZWV0OworfQorCisKK2NvbnN0IFFIYXNoPFFTdHJpbmcsIFFTdHJpbmc+JiBzdHlsZXNoZWV0VmFsdWVzKFNldHRpbmdzVGhlbWUgdGhlbWUpIHsKKyAgICByZXR1cm4gdGhlbWUgPT0gU0VUVElOR1NfVEhFTUVfTElHSFQgPyBsaWdodFZhbHVlcyA6IGRhcmtWYWx1ZXM7Cit9CisKKworCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zdHlsZXNoZWV0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC9zdHlsZXNoZWV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5MDY1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3N0eWxlc2hlZXQuaApAQCAtMCwwICsxLDM2IEBACisvL0NvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3NldHRpbmdzLWFnZW50LmgiCisjaW5jbHVkZSA8UVN0cmluZz4KKyNpbmNsdWRlIDxRSGFzaD4KKworbmFtZXNwYWNlIFVpIHsKKworLy8gUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzdHlsZSBzaGVldCBmb3IgdGhlCisvLyBnaXZlbiBVSSB0aGVtZS4KK2NvbnN0IFFTdHJpbmcmIHN0eWxlc2hlZXRGb3JUaGVtZShTZXR0aW5nc1RoZW1lIHRoZW1lKTsKKworLy8gUmV0dW5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0eWxlIHNoZWV0IGZvciBmb250cy4KKy8vIHxoaV9kZW5zaXR5fCBzaG91bGQgYmUgdHJ1ZSBmb3IgUmV0aW5hIGRpc3BsYXlzLgorY29uc3QgUVN0cmluZyYgZm9udFN0eWxlc2hlZXQoYm9vbCBoaV9kZW5zaXR5KTsKKworLy8gUmV0dXJucyBhIG1hcHBpbmcgb2Ygc3R5bGVzaGVldCB0ZW1wbGF0ZSB2YXJpYWJsZSBuYW1lcyB0byB0aGVpcgorLy8gdmFsdWVzIGluIGEgZ2l2ZW4gdGhlbWUuCitjb25zdCBRSGFzaDxRU3RyaW5nLCBRU3RyaW5nPiYgc3R5bGVzaGVldFZhbHVlcyhTZXR0aW5nc1RoZW1lIHRoZW1lKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIFRIRU1FX1BBVEhfVkFSOworZXh0ZXJuIGNvbnN0IGNoYXIqIE1BSk9SX1RBQl9DT0xPUl9WQVI7CitleHRlcm4gY29uc3QgY2hhciogVEFCX0JLR19DT0xPUl9WQVI7CitleHRlcm4gY29uc3QgY2hhciogVEFCX1NFTEVDVEVEX0NPTE9SX1ZBUjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3N1cmZhY2UtcXQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvc3VyZmFjZS1xdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1ZGJlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3N1cmZhY2UtcXQuY3BwCkBAIC0wLDAgKzEsMjMxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSA8UXRDb3JlPgorI2luY2x1ZGUgPFFDb2xvcj4KKyNpbmNsdWRlIDxRSW1hZ2U+CisjaW5jbHVkZSA8UU9iamVjdD4KKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNpbmNsdWRlIDxRUmVjdD4KKyNpbmNsdWRlIDxRV2lkZ2V0PgorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2FyZ2IuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVjdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9zdXJmYWNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3dpbnN5cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NldGVudi5oIgorCisjZGVmaW5lICBERUJVRyAgMQorCisjaWYgREVCVUcKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNkZWZpbmUgIEQoLi4uKSAgIFZFUkJPU0VfUFJJTlQoc3VyZmFjZSxfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lICBEKC4uLikgICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IG5leHRfaWQgPSAwOworCitleHRlcm4gU2tpblN1cmZhY2UgKnNraW5fc3VyZmFjZV9jcmVhdGUoaW50IHcsIGludCBoLCBpbnQgb3JpZ2luYWxfdywgaW50IG9yaWdpbmFsX2gpCit7CisgICAgYXV0byBzID0gbmV3IFNraW5TdXJmYWNlKCk7CisgICAgYXV0byB3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZVB0cigpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKHMgIT0gTlVMTCkgeworICAgICAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICAgICAgd2luZG93LT5jcmVhdGVCaXRtYXAocywgb3JpZ2luYWxfdywgb3JpZ2luYWxfaCwgJnNlbWFwaG9yZSk7CisgICAgICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7CisgICAgICAgIHMtPnJlZmNvdW50ID0gMTsKKyAgICAgICAgcy0+dyA9IHc7CisgICAgICAgIHMtPmggPSBoOworICAgICAgICBzLT5vcmlnaW5hbF93ID0gb3JpZ2luYWxfdzsKKyAgICAgICAgcy0+b3JpZ2luYWxfaCA9IG9yaWdpbmFsX2g7CisgICAgICAgIHMtPmlkID0gbmV4dF9pZCsrOworICAgICAgICBzLT53aW5kb3cgPSB3aW5kb3c7CisgICAgICAgIEQoIkNyZWF0ZWQgc3VyZmFjZSAlZCAlZCB3LCVkIGgsIG9yaWdpbmFsICVkLCAlZCIsIHMtPmlkLCB3LCBoLCBvcmlnaW5hbF93LCBvcmlnaW5hbF9oKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEQoICJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBuZXcgc2tpbiBzdXJmYWNlICEiICk7CisgICAgfQorICAgIHJldHVybiAgczsKK30KKworZXh0ZXJuIFNraW5TdXJmYWNlICpza2luX3N1cmZhY2VfY3JlYXRlKGludCB3LCBpbnQgaCkKK3sKKyAgICBEKCJza2luX3N1cmZhY2VfY3JlYXRlICVkLCAlZCIsIHcsIGgpOworICAgIHJldHVybiBza2luX3N1cmZhY2VfY3JlYXRlKHcsIGgsIHcsIGgpOworfQorCitzdGF0aWMgdm9pZCBza2luX3N1cmZhY2VfZnJlZShTa2luU3VyZmFjZSAqcykKK3sKKyAgICBEKCJza2luX3N1cmZhY2VfZnJlZSAlZCIsIHMtPmlkKTsKKyAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBzLT53aW5kb3ctPnJlbGVhc2VCaXRtYXAocywgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICBkZWxldGUgczsKK30KKworZXh0ZXJuIGludCBza2luX3N1cmZhY2VfaGVpZ2h0KFNraW5TdXJmYWNlICpzKQoreworICAgIEQoInNraW5fc3VyZmFjZV9oZWlnaHQgJWQiLCBzLT5pZCk7CisgICAgcmV0dXJuIHMtPmg7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV91bnJlZnAoU2tpblN1cmZhY2UqICpwc3VyZmFjZSkKK3sKKyAgICBTa2luU3VyZmFjZSAqc3VyZiA9ICpwc3VyZmFjZTsKKyAgICBpZiAoc3VyZikgeworICAgICAgICBEKCJza2luX3N1cmZhY2VfdW5yZWYgJWQiLCBzdXJmLT5pZCk7CisgICAgICAgIGlmICgtLXN1cmYtPnJlZmNvdW50IDw9IDApCisgICAgICAgICAgICBza2luX3N1cmZhY2VfZnJlZShzdXJmKTsKKyAgICAgICAgKnBzdXJmYWNlID0gTlVMTDsKKyAgICB9Cit9CisKK2V4dGVybiBpbnQgc2tpbl9zdXJmYWNlX3dpZHRoKFNraW5TdXJmYWNlICpzKQoreworICAgIEQoInNraW5fc3VyZmFjZV93aWR0aCAlZCIsIHMtPmlkKTsKKyAgICByZXR1cm4gcy0+dzsKK30KKworZXh0ZXJuIFNraW5TdXJmYWNlKiBza2luX3N1cmZhY2VfY3JlYXRlX2FyZ2IzMl9mcm9tKGludCB3LCBpbnQgaCwgaW50IHBpdGNoLCB1aW50MzJfdCAqcGl4ZWxzKQoreworICAgIEQoInNraW5fc3VyZmFjZV9jcmVhdGVfYXJnYjMyX2Zyb20gJWQsICVkLCBwaXRjaCAlZCIsIHcsIGgsIHBpdGNoKTsKKyAgICBTa2luU3VyZmFjZSogcyA9IHNraW5fc3VyZmFjZV9jcmVhdGUodywgaCwgdywgaCk7CisgICAgU2tpblJlY3QgcmVjdDsKKyAgICByZWN0LnNpemUuaCA9IGg7CisgICAgcmVjdC5zaXplLncgPSB3OworICAgIHJlY3QucG9zLnggPSAwOworICAgIHJlY3QucG9zLnkgPSAwOworICAgIHNraW5fc3VyZmFjZV91cGxvYWQocywgJnJlY3QsIHBpeGVscywgcGl0Y2gpOworICAgIHJldHVybiBzOworfQorCitleHRlcm4gU2tpblN1cmZhY2UqIHNraW5fc3VyZmFjZV9yZXNpemUoU2tpblN1cmZhY2UgKnN1cmZhY2UsIGludCB3LCBpbnQgaCwgaW50IG9yaWdpbmFsX3csIGludCBvcmlnaW5hbF9oKQoreworICAgIGlmICggc3VyZmFjZSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gc2tpbl9zdXJmYWNlX2NyZWF0ZSh3LCBoLCBvcmlnaW5hbF93LCBvcmlnaW5hbF9oKTsKKyAgICB9IGVsc2UgaWYgKCBzdXJmYWNlLT5vcmlnaW5hbF93ID09IG9yaWdpbmFsX3cgJiYgc3VyZmFjZS0+b3JpZ2luYWxfaCA9PSBvcmlnaW5hbF9oICkgeworICAgICAgICBzdXJmYWNlLT53ID0gdzsKKyAgICAgICAgc3VyZmFjZS0+aCA9IGg7CisgICAgICAgIHJldHVybiBzdXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIHNraW5fc3VyZmFjZV91bnJlZnAoJnN1cmZhY2UpOworICAgICAgICByZXR1cm4gc2tpbl9zdXJmYWNlX2NyZWF0ZSh3LCBoLCBvcmlnaW5hbF93LCBvcmlnaW5hbF9oKTsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV9jcmVhdGVfd2luZG93KFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgpIHsKKyAgICBEKCJza2luX3N1cmZhY2VfY3JlYXRlX3dpbmRvdyAgJWQsICVkLCAlZCwgJWQiLCB4LCB5LCB3LCBoKTsKKyAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBFbXVsYXRvclF0V2luZG93ICp3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgcmV0dXJuOworICAgIFFSZWN0IHJlY3QoeCwgeSwgdywgaCk7CisgICAgd2luZG93LT5zaG93V2luZG93KHN1cmZhY2UsICZyZWN0LCAmc2VtYXBob3JlKTsKKyAgICBzZW1hcGhvcmUuYWNxdWlyZSgpOworICAgIEQoIklEIG9mIGJhY2tpbmcgYml0bWFwIHN1cmZhY2UgaXMgJWQiLCBzdXJmYWNlLT5pZCk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV91cGRhdGUoU2tpblN1cmZhY2UgKnN1cmZhY2UsIFNraW5SZWN0ICpyZWN0KQoreworI2lmIDAKKyAgICBEKCJza2luX3N1cmZhY2VfdXBkYXRlICVkOiAlZCwlZCwlZCwlZCIsIHN1cmZhY2UtPmlkLCByZWN0LT5wb3MueCwgcmVjdC0+cG9zLnksIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oKTsKKyNlbmRpZgorICAgIFFSZWN0IHFyZWN0KHJlY3QtPnBvcy54LCByZWN0LT5wb3MueSwgcmVjdC0+c2l6ZS53LCByZWN0LT5zaXplLmgpOworICAgIFFTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIHN1cmZhY2UtPndpbmRvdy0+cmVxdWVzdFVwZGF0ZSgmcXJlY3QsICZzZW1hcGhvcmUpOworICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV9ibGl0KFNraW5TdXJmYWNlICpkc3QsIFNraW5Qb3MgKnBvcywgU2tpblN1cmZhY2UgKnNyYywgU2tpblJlY3QgKnJlY3QsIFNraW5CbGl0T3Agb3ApCit7CisjaWYgMAorICAgIEQoInNraW5fc3VyZmFjZV9ibGl0IGZyb20gJWQgKCVkLCAlZCkgdG8gJWQ6ICVkLCVkLCVkLCVkIiwgc3JjLT5pZCwgcmVjdC0+cG9zLngsIHJlY3QtPnBvcy55LCBkc3QtPmlkLCByZWN0LT5wb3MueCwgcmVjdC0+cG9zLnksIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oKTsKKyNlbmRpZgorICAgIFFSZWN0IHFyZWN0KHJlY3QtPnBvcy54LCByZWN0LT5wb3MueSwgcmVjdC0+c2l6ZS53LCByZWN0LT5zaXplLmgpOworICAgIFFQb2ludCBxcG9zKHBvcy0+eCwgcG9zLT55KTsKKyAgICBRUGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlIHFvcDsKKyAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBTS0lOX0JMSVRfQ09QWToKKyAgICAgICAgICAgIHFvcCA9IFFQYWludGVyOjpDb21wb3NpdGlvbk1vZGVfU291cmNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0tJTl9CTElUX1NSQ09WRVI6CisgICAgICAgICAgICBxb3AgPSBRUGFpbnRlcjo6Q29tcG9zaXRpb25Nb2RlX1NvdXJjZU92ZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgZHN0LT53aW5kb3ctPmJsaXQoc3JjLT5iaXRtYXAsICZxcmVjdCwgZHN0LT5iaXRtYXAsICZxcG9zLCAmcW9wLCAmc2VtYXBob3JlKTsKKyAgICBzZW1hcGhvcmUuYWNxdWlyZSgpOworfQorCitleHRlcm4gdm9pZCBza2luX3N1cmZhY2VfZmlsbChTa2luU3VyZmFjZSAqZHN0LCBTa2luUmVjdCAqcmVjdCwgdWludDMyX3QgYXJnYl9wcmVtdWwpCit7CisgICAgRCgic2tpbl9zdXJmYWNlX2ZpbGwgJWQ6ICVkLCAlZCwgJWQsICVkOiAleCIsIGRzdC0+aWQsIHJlY3QtPnBvcy54LCByZWN0LT5wb3MueSwgcmVjdC0+c2l6ZS53LCByZWN0LT5zaXplLmgsIGFyZ2JfcHJlbXVsKTsKKyAgICBRUmVjdCBxcmVjdChyZWN0LT5wb3MueCwgcmVjdC0+cG9zLnksIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oKTsKKyAgICBRQ29sb3IgY29sb3IoYXJnYl9wcmVtdWwpOworICAgIFFTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIGRzdC0+d2luZG93LT5maWxsKGRzdCwgJnFyZWN0LCAmY29sb3IsICZzZW1hcGhvcmUpOworICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV91cGxvYWQoU2tpblN1cmZhY2UgKnN1cmZhY2UsIFNraW5SZWN0ICpyZWN0LCBjb25zdCB2b2lkICpwaXhlbHMsIGludCBwaXRjaCkKK3sKKyNpZiAwCisgICAgRCgic2tpbl9zdXJmYWNlX3VwbG9hZCAlZDogJWQsJWQsJWQsJWQiLCBzdXJmYWNlLT5pZCwgcmVjdC0+cG9zLngsIHJlY3QtPnBvcy55LCByZWN0LT5zaXplLncsIHJlY3QtPnNpemUuaCk7CisjZW5kaWYKKyAgICB1aW50MzJfdCAqc3JjID0gKCh1aW50MzJfdCopcGl4ZWxzKTsKKyAgICB1aW50MzJfdCAqZHN0ID0gKCh1aW50MzJfdCopc3VyZmFjZS0+Yml0bWFwLT5iaXRzKCkpICsgc3VyZmFjZS0+dyAqIHJlY3QtPnBvcy55OworICAgIGludCBudW0gPSAwOworICAgIGZvciAoaW50IHkgPSByZWN0LT5wb3MueTsgeSA8IHJlY3QtPnBvcy55ICsgcmVjdC0+c2l6ZS5oOyB5KyspIHsKKyAgICAgICAgZm9yIChpbnQgeCA9IHJlY3QtPnBvcy54OyB4IDwgcmVjdC0+cG9zLnggKyByZWN0LT5zaXplLnc7IHgrKykgeworICAgICAgICAgICAgKihkc3QgKyB4KSA9ICooc3JjICsgeCAtcmVjdC0+cG9zLngpOworICAgICAgICAgICAgbnVtKys7CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHBpdGNoIC8gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgZHN0ICs9IHN1cmZhY2UtPnc7CisgICAgfQorfQorCitleHRlcm4gdm9pZCBza2luX3N1cmZhY2VfZ2V0X3NjYWxlZF9yZWN0KFNraW5TdXJmYWNlICpzdXJmYWNlLCBjb25zdCBTa2luUmVjdCAqZnJvbSwgU2tpblJlY3QgKnRvKQoreworICAgIGludCBmcm9teCA9IGZyb20tPnBvcy54OworICAgIGludCBmcm9teSA9IGZyb20tPnBvcy55OworICAgIGludCBmcm9tdyA9IGZyb20tPnNpemUudzsKKyAgICBpbnQgZnJvbWggPSBmcm9tLT5zaXplLmg7CisgICAgaW50IHcgPSBzdXJmYWNlLT53OworICAgIGludCBoID0gc3VyZmFjZS0+aDsKKyAgICBpbnQgb3JpZ2luYWxfdyA9IHN1cmZhY2UtPm9yaWdpbmFsX3c7CisgICAgaW50IG9yaWdpbmFsX2ggPSBzdXJmYWNlLT5vcmlnaW5hbF9oOworICAgIHRvLT5wb3MueCA9IGZyb20tPnBvcy54ICogdyAvIG9yaWdpbmFsX3c7CisgICAgdG8tPnBvcy55ID0gZnJvbS0+cG9zLnkgKiBoIC8gb3JpZ2luYWxfaDsKKyAgICB0by0+c2l6ZS53ID0gZnJvbS0+c2l6ZS53ICogdyAvIG9yaWdpbmFsX3c7CisgICAgdG8tPnNpemUuaCA9IGZyb20tPnNpemUuaCAqIGggLyBvcmlnaW5hbF9oOworICAgIEQoInNraW5fc3VyZmFjZV9nZXRfc2NhbGVkX3JlY3QgJWQ6ICVkLCAlZCwgJWQsICVkID0+ICVkLCAlZCwgJWQsICVkIiwgc3VyZmFjZS0+aWQsIGZyb214LCBmcm9teSwgZnJvbXcsIGZyb21oLCB0by0+cG9zLngsIHRvLT5wb3MueSwgdG8tPnNpemUudywgdG8tPnNpemUuaCk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fc3VyZmFjZV9yZXZlcnNlX21hcChTa2luU3VyZmFjZSAqc3VyZmFjZSwgaW50ICp4LCBpbnQgKnkpCit7CisgICAgaW50IG5ld194ID0gKnggKiBzdXJmYWNlLT5vcmlnaW5hbF93IC8gc3VyZmFjZS0+dzsKKyAgICBpbnQgbmV3X3kgPSAqeSAqIHN1cmZhY2UtPm9yaWdpbmFsX2ggLyBzdXJmYWNlLT5oOworI2lmIDAKKyAgICBEKCJza2luX3N1cmZhY2VfcmV2ZXJzZV9tYXAgJWQ6ICVkLCVkIHRvICVkLCVkIiwgc3VyZmFjZS0+aWQsICp4LCAqeSwgbmV3X3gsIG5ld195KTsKKyNlbmRpZgorICAgICp4ID0gbmV3X3g7CisgICAgKnkgPSBuZXdfeTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDNkZjYwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvdG9vbC13aW5kb3cuY3BwCkBAIC0wLDAgKzEsNjA4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPFFDb3JlQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UURhdGVUaW1lPgorI2luY2x1ZGUgPFFQdXNoQnV0dG9uPgorI2luY2x1ZGUgPFFTZXR0aW5ncz4KKyNpbmNsdWRlIDxRdFdpZGdldHM+CisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9Db25maWdEaXJzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9jbGlwYm9hcmRfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21haW4tY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZW11bGF0b3ItcXQtd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2Vycm9yLWRpYWxvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC1wYWdlcy9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtcGFnZXMvbG9jYXRpb24tcGFnZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LXN0eWxlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9leHRlbmRlZC13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvcXQtdWktY29tbWFuZHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvc3R5bGVzaGVldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworc3RhdGljIFRvb2xXaW5kb3cqIHR3SW5zdGFuY2UgPSBOVUxMOworCitzdGF0aWMgdm9pZCBvbkd1ZXN0Q2xpcGJvYXJkQ2hhbmdlZCgKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgIHNpemVfdCBsZW5ndGgpIHsKKyAgICBRU3RyaW5nIGNvbnRlbnQgPSBRU3RyaW5nOjpmcm9tVXRmOCgoY29uc3QgY2hhciopZGF0YSwgbGVuZ3RoKTsKKyAgICBRQXBwbGljYXRpb246OmNsaXBib2FyZCgpLT5ibG9ja1NpZ25hbHModHJ1ZSk7CisgICAgUUFwcGxpY2F0aW9uOjpjbGlwYm9hcmQoKS0+c2V0VGV4dChjb250ZW50KTsKKyAgICBRQXBwbGljYXRpb246OmNsaXBib2FyZCgpLT5ibG9ja1NpZ25hbHMoZmFsc2UpOworfQorCitleHRlcm4gIkMiIHZvaWQgc2V0VWlFbXVBZ2VudChjb25zdCBVaUVtdUFnZW50KiBhZ2VudFB0cikgeworICAgIGlmIChhZ2VudFB0ci0+Y2xpcGJvYXJkKSB7CisgICAgICAgIGFnZW50UHRyLT5jbGlwYm9hcmQtPnNldEd1ZXN0Q2xpcGJvYXJkQ2FsbGJhY2sob25HdWVzdENsaXBib2FyZENoYW5nZWQpOworICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KAorICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpjbGlwYm9hcmQoKSwgJlFDbGlwYm9hcmQ6OmRhdGFDaGFuZ2VkLAorICAgICAgICAgICAgW2FnZW50UHRyXSgpIHsKKyAgICAgICAgICAgICAgICBRQnl0ZUFycmF5IGJ5dGVzID0gUUFwcGxpY2F0aW9uOjpjbGlwYm9hcmQoKS0+dGV4dCgpLnRvVXRmOCgpOworICAgICAgICAgICAgICAgIGFnZW50UHRyLT5jbGlwYm9hcmQtPnNldEd1ZXN0Q2xpcGJvYXJkQ29udGVudHMoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilieXRlcy5kYXRhKCksIGJ5dGVzLnNpemUoKSk7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgaWYgKHR3SW5zdGFuY2UpIHsKKyAgICAgICAgdHdJbnN0YW5jZS0+c2V0VG9vbEVtdUFnZW50KGFnZW50UHRyKTsKKyAgICB9Cit9CisKK1Rvb2xXaW5kb3c6OlRvb2xXaW5kb3coRW11bGF0b3JRdFdpbmRvdyogd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICBRV2lkZ2V0KiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIFRvb2xXaW5kb3c6OlVJRXZlbnRSZWNvcmRlclB0ciBldmVudF9yZWNvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgVG9vbFdpbmRvdzo6VXNlckFjdGlvbnNDb3VudGVyUHRyIHVzZXJfYWN0aW9uc19jb3VudGVyKQorICAgIDogUUZyYW1lKHBhcmVudCksCisgICAgICBtRW11bGF0b3JXaW5kb3cod2luZG93KSwKKyAgICAgIG1FeHRlbmRlZFdpbmRvdyhhbmRyb2lkOjpiYXNlOjptYWtlQ3VzdG9tU2NvcGVkUHRyPEV4dGVuZGVkV2luZG93Kj4oCisgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgIFtdKFFPYmplY3QqIG8pIHsgby0+ZGVsZXRlTGF0ZXIoKTsgfSkpLAorICAgICAgbVVpRW11QWdlbnQobnVsbHB0ciksCisgICAgICBtVG9vbHNVaShuZXcgVWk6OlRvb2xDb250cm9scyksCisgICAgICBtVUlFdmVudFJlY29yZGVyKGV2ZW50X3JlY29yZGVyKSwKKyAgICAgIG1Vc2VyQWN0aW9uc0NvdW50ZXIodXNlcl9hY3Rpb25zX2NvdW50ZXIpLAorICAgICAgbVNpemVUd2Vha2VyKHRoaXMpIHsKKyAgICB0d0luc3RhbmNlID0gdGhpczsKKworLy8gIlRvb2wiIHR5cGUgd2luZG93cyBsaXZlIGluIGFub3RoZXIgbGF5ZXIgb24gdG9wIG9mIGV2ZXJ5dGhpbmcgaW4gT1NYLCB3aGljaAorLy8gaXMgdW5kZXNpcmFibGUKKy8vIGJlY2F1c2UgaXQgbWVhbnMgdGhlIGV4dGVuZGVkIHdpbmRvdyBtdXN0IGJlIG9uIHRvcCBvZiB0aGUgZW11bGF0b3Igd2luZG93LgorLy8gSG93ZXZlciwgb24KKy8vIFdpbmRvd3MgYW5kIExpbnV4LCAiVG9vbCIgdHlwZSB3aW5kb3dzIGFyZSB0aGUgb25seSB3YXkgdG8gbWFrZSBhIHdpbmRvdyB0aGF0CisvLyBkb2VzIG5vdCBoYXZlCisvLyBpdHMgb3duIHRhc2tiYXIgaXRlbS4KKyNpZmRlZiBfX0FQUExFX18KKyAgICBRdDo6V2luZG93RmxhZ3MgZmxhZyA9IFF0OjpEaWFsb2c7CisjZWxzZQorICAgIFF0OjpXaW5kb3dGbGFncyBmbGFnID0gUXQ6OlRvb2w7CisjZW5kaWYKKyAgICBzZXRXaW5kb3dGbGFncyhmbGFnIHwgUXQ6OkZyYW1lbGVzc1dpbmRvd0hpbnQgfCBRdDo6Tm9Ecm9wU2hhZG93V2luZG93SGludCk7CisgICAgbVRvb2xzVWktPnNldHVwVWkodGhpcyk7CisKKyAgICAvLyBHZXQgdGhlIGxhdGVzdCB1c2VyIHNlbGVjdGlvbnMgZnJvbSB0aGUgdXNlci1jb25maWcgY29kZS4KKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgU2V0dGluZ3NUaGVtZSB0aGVtZSA9CisgICAgICAgICAgICAoU2V0dGluZ3NUaGVtZSlzZXR0aW5ncy52YWx1ZShVaTo6U2V0dGluZ3M6OlVJX1RIRU1FLCAwKS50b0ludCgpOworICAgIGlmICh0aGVtZSA8IDAgfHwgdGhlbWUgPj0gU0VUVElOR1NfVEhFTUVfTlVNX0VOVFJJRVMpIHsKKyAgICAgICAgdGhlbWUgPSAoU2V0dGluZ3NUaGVtZSkwOworICAgICAgICBzZXR0aW5ncy5zZXRWYWx1ZShVaTo6U2V0dGluZ3M6OlVJX1RIRU1FLCAwKTsKKyAgICB9CisKKyAgICBhZGp1c3RBbGxCdXR0b25zRm9yVGhlbWUodGhlbWUpOworICAgIHRoaXMtPnNldFN0eWxlU2hlZXQoVWk6OnN0eWxlc2hlZXRGb3JUaGVtZSh0aGVtZSkpOworCisgICAgUVN0cmluZyBkZWZhdWx0X3Nob3J0Y3V0cyA9CisgICAgICAgICAgICAiQ3RybCtTaGlmdCtMIFNIT1dfUEFORV9MT0NBVElPTlxuIgorICAgICAgICAgICAgIkN0cmwrU2hpZnQrQyBTSE9XX1BBTkVfQ0VMTFVMQVJcbiIKKyAgICAgICAgICAgICJDdHJsK1NoaWZ0K0IgU0hPV19QQU5FX0JBVFRFUllcbiIKKyAgICAgICAgICAgICJDdHJsK1NoaWZ0K1AgU0hPV19QQU5FX1BIT05FXG4iCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtWIFNIT1dfUEFORV9WSVJUU0VOU09SU1xuIgorICAgICAgICAgICAgIkN0cmwrU2hpZnQrRiBTSE9XX1BBTkVfRklOR0VSXG4iCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtEIFNIT1dfUEFORV9EUEFEXG4iCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtTIFNIT1dfUEFORV9TRVRUSU5HU1xuIgorI2lmZGVmIF9fQVBQTEVfXworICAgICAgICAgICAgIkN0cmwrLyAgICAgU0hPV19QQU5FX0hFTFBcbiIKKyNlbHNlCisgICAgICAgICAgICAiRjEgICAgICAgICBTSE9XX1BBTkVfSEVMUFxuIgorI2VuZGlmCisgICAgICAgICAgICAiQ3RybCtTICAgICBUQUtFX1NDUkVFTlNIT1RcbiIKKyAgICAgICAgICAgICJDdHJsK1ogICAgIEVOVEVSX1pPT01cbiIKKyAgICAgICAgICAgICJDdHJsK1VwICAgIFpPT01fSU5cbiIKKyAgICAgICAgICAgICJDdHJsK0Rvd24gIFpPT01fT1VUXG4iCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtVcCAgICBQQU5fVVBcbiIKKyAgICAgICAgICAgICJDdHJsK1NoaWZ0K0Rvd24gIFBBTl9ET1dOXG4iCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtMZWZ0ICBQQU5fTEVGVFxuIgorICAgICAgICAgICAgIkN0cmwrU2hpZnQrUmlnaHQgUEFOX1JJR0hUXG4iCisgICAgICAgICAgICAiQ3RybCs9ICAgICBWT0xVTUVfVVBcbiIKKyAgICAgICAgICAgICJDdHJsKy0gICAgIFZPTFVNRV9ET1dOXG4iCisgICAgICAgICAgICAiQ3RybCtQICAgICBQT1dFUlxuIgorICAgICAgICAgICAgIkN0cmwrTSAgICAgTUVOVVxuIgorICAgICAgICAgICAgIkN0cmwrVCAgICAgVE9HR0xFX1RSQUNLQkFMTFxuIgorI2lmbmRlZiBfX0FQUExFX18KKyAgICAgICAgICAgICJDdHJsK0ggICAgIEhPTUVcbiIKKyNlbHNlCisgICAgICAgICAgICAiQ3RybCtTaGlmdCtIICBIT01FXG4iCisjZW5kaWYKKyAgICAgICAgICAgICJDdHJsK08gICAgIE9WRVJWSUVXXG4iCisgICAgICAgICAgICAiQ3RybCtCYWNrc3BhY2UgQkFDS1xuIgorICAgICAgICAgICAgIkN0cmwrTGVmdCBST1RBVEVfTEVGVFxuIgorICAgICAgICAgICAgIkN0cmwrUmlnaHQgUk9UQVRFX1JJR0hUXG4iOworCisgICAgUVRleHRTdHJlYW0gc3RyZWFtKCZkZWZhdWx0X3Nob3J0Y3V0cyk7CisgICAgbVNob3J0Y3V0S2V5U3RvcmUucG9wdWxhdGVGcm9tVGV4dFN0cmVhbShzdHJlYW0sIHBhcnNlUXRVSUNvbW1hbmQpOworICAgIC8vIE5lZWQgdG8gYWRkIHRoaXMgb25lIHNlcGFyYXRlbHkgYmVjYXVzZSBRS2V5U2VxdWVuY2UgY2Fubm90IHBhcnNlCisgICAgLy8gdGhlIHN0cmluZyAiQ3RybCIuCisgICAgbVNob3J0Y3V0S2V5U3RvcmUuYWRkKFFLZXlTZXF1ZW5jZShRdDo6S2V5X0NvbnRyb2wgfCBRdDo6Q29udHJvbE1vZGlmaWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRVSUNvbW1hbmQ6OlNIT1dfTVVMVElUT1VDSCk7CisKKyAgICAvLyBVcGRhdGUgdG9vbCB0aXBzIG9uIGFsbCBwdXNoIGJ1dHRvbnMuCisgICAgY29uc3QgUUxpc3Q8UVB1c2hCdXR0b24qPiBjaGlsZEJ1dHRvbnMgPQorICAgICAgICAgICAgZmluZENoaWxkcmVuPFFQdXNoQnV0dG9uKj4oUVN0cmluZygpLCBRdDo6RmluZERpcmVjdENoaWxkcmVuT25seSk7CisgICAgZm9yIChhdXRvIGJ1dHRvbiA6IGNoaWxkQnV0dG9ucykgeworICAgICAgICBRVmFyaWFudCB1aUNvbW1hbmQgPSBidXR0b24tPnByb3BlcnR5KCJ1aUNvbW1hbmQiKTsKKyAgICAgICAgaWYgKHVpQ29tbWFuZC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIFF0VUlDb21tYW5kIGNtZDsKKyAgICAgICAgICAgIGlmIChwYXJzZVF0VUlDb21tYW5kKHVpQ29tbWFuZC50b1N0cmluZygpLCAmY21kKSkgeworICAgICAgICAgICAgICAgIFFWZWN0b3I8UUtleVNlcXVlbmNlPiogc2hvcnRjdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TaG9ydGN1dEtleVN0b3JlLnJldmVyc2VMb29rdXAoY21kKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvcnRjdXRzICYmIHNob3J0Y3V0cy0+bGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi0+c2V0VG9vbFRpcChnZXRRdFVJQ29tbWFuZERlc2NyaXB0aW9uKGNtZCkgKyAiICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0cy0+YXQoMCkudG9TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFLZXlTZXF1ZW5jZTo6TmF0aXZlVGV4dCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYnV0dG9uICE9IG1Ub29sc1VpLT5jbG9zZV9idXR0b24gJiYKKyAgICAgICAgICAgICAgICAgICBidXR0b24gIT0gbVRvb2xzVWktPm1pbmltaXplX2J1dHRvbiAmJgorICAgICAgICAgICAgICAgICAgIGJ1dHRvbiAhPSBtVG9vbHNVaS0+bW9yZV9idXR0b24pIHsKKyAgICAgICAgICAgIC8vIEFsbW9zdCBhbGwgdG9vbGJhciBidXR0b25zIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgdWlDb21tYW5kCisgICAgICAgICAgICAvLyBwcm9wZXJ0eS4KKyAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgbm8gd2F5IG9mIGVuZm9yY2luZyBpdCBhdCBjb21waWxlIHRpbWUuCisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjcmVhdGVFeHRlbmRlZFdpbmRvdygpOyAvLyBCdXQgZG9uJ3Qgc2hvdyBpdCB5ZXQKKworI2lmbmRlZiBRX09TX01BQworICAgIC8vIFN3YXAgbWluaW1pemUgYW5kIGNsb3NlIGJ1dHRvbnMgb24gbm9uLWFwcGxlIE9TZXMKKyAgICBpbnQgdG1wX3ggPSBtVG9vbHNVaS0+Y2xvc2VfYnV0dG9uLT54KCk7CisgICAgbVRvb2xzVWktPmNsb3NlX2J1dHRvbi0+bW92ZShtVG9vbHNVaS0+bWluaW1pemVfYnV0dG9uLT54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVG9vbHNVaS0+Y2xvc2VfYnV0dG9uLT55KCkpOworICAgIG1Ub29sc1VpLT5taW5pbWl6ZV9idXR0b24tPm1vdmUodG1wX3gsIG1Ub29sc1VpLT5taW5pbWl6ZV9idXR0b24tPnkoKSk7CisjZW5kaWYKK30KKworVG9vbFdpbmRvdzo6flRvb2xXaW5kb3coKSB7fQorCit2b2lkIFRvb2xXaW5kb3c6OmhpZGUoKSB7CisgICAgUUZyYW1lOjpoaWRlKCk7CisKKyAgICBhc3NlcnQobUV4dGVuZGVkV2luZG93KTsKKyAgICBtRXh0ZW5kZWRXaW5kb3ctPmhpZGUoKTsKK30KKwordm9pZCBUb29sV2luZG93OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBjZSkgeworICAgIC8vIG1ha2Ugc3VyZSBvbmx5IHBhcmVudCBwcm9jZXNzZXMgdGhlIGV2ZW50IC0gb3RoZXJ3aXNlIHNvbWUKKyAgICAvLyBzaWJsaW5ncyB3b24ndCBnZXQgaXQsIGUuZy4gbWFpbiB3aW5kb3cKKyAgICBjZS0+aWdub3JlKCk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkgeworICAgIHJhaXNlTWFpbldpbmRvdygpOworICAgIFFGcmFtZTo6bW91c2VQcmVzc0V2ZW50KGV2ZW50KTsKK30KKwordm9pZCBUb29sV2luZG93OjpoaWRlRXZlbnQoUUhpZGVFdmVudCopIHsKKyAgICBhc3NlcnQobUV4dGVuZGVkV2luZG93KTsKKyAgICBtSXNFeHRlbmRlZFdpbmRvd1Zpc2libGVPblNob3cgPSBtRXh0ZW5kZWRXaW5kb3ctPmlzVmlzaWJsZSgpOworfQorCit2b2lkIFRvb2xXaW5kb3c6OnNob3coKSB7CisgICAgUUZyYW1lOjpzaG93KCk7CisgICAgc2V0Rml4ZWRTaXplKHNpemUoKSk7CisKKyAgICBpZiAobUlzRXh0ZW5kZWRXaW5kb3dWaXNpYmxlT25TaG93KSB7CisgICAgICAgIGFzc2VydChtRXh0ZW5kZWRXaW5kb3cpOworICAgICAgICBtRXh0ZW5kZWRXaW5kb3ctPnNob3coKTsKKyAgICB9Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6aGFuZGxlVUlDb21tYW5kKFF0VUlDb21tYW5kIGNtZCwgYm9vbCBkb3duKSB7CisgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6U0hPV19QQU5FX0xPQ0FUSU9OOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBzaG93T3JSYWlzZUV4dGVuZGVkV2luZG93KFBBTkVfSURYX0xPQ0FUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0VUlDb21tYW5kOjpTSE9XX1BBTkVfQ0VMTFVMQVI6CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIHNob3dPclJhaXNlRXh0ZW5kZWRXaW5kb3coUEFORV9JRFhfQ0VMTFVMQVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9CQVRURVJZOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBzaG93T3JSYWlzZUV4dGVuZGVkV2luZG93KFBBTkVfSURYX0JBVFRFUlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9QSE9ORToKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgc2hvd09yUmFpc2VFeHRlbmRlZFdpbmRvdyhQQU5FX0lEWF9URUxFUEhPTkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9WSVJUU0VOU09SUzoKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgc2hvd09yUmFpc2VFeHRlbmRlZFdpbmRvdyhQQU5FX0lEWF9WSVJUX1NFTlNPUlMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9EUEFEOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBzaG93T3JSYWlzZUV4dGVuZGVkV2luZG93KFBBTkVfSURYX0RQQUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9GSU5HRVI6CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIHNob3dPclJhaXNlRXh0ZW5kZWRXaW5kb3coUEFORV9JRFhfRklOR0VSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0VUlDb21tYW5kOjpTSE9XX1BBTkVfU0VUVElOR1M6CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIHNob3dPclJhaXNlRXh0ZW5kZWRXaW5kb3coUEFORV9JRFhfU0VUVElOR1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlNIT1dfUEFORV9IRUxQOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBzaG93T3JSYWlzZUV4dGVuZGVkV2luZG93KFBBTkVfSURYX0hFTFApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlRBS0VfU0NSRUVOU0hPVDoKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5zY3JlZW5zaG90KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6RU5URVJfWk9PTToKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT50b2dnbGVab29tTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRvb2xzVWktPnpvb21fYnV0dG9uLT5zZXRDaGVja2VkKG1FbXVsYXRvcldpbmRvdy0+aXNJblpvb21Nb2RlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlpPT01fSU46CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIGlmIChtRW11bGF0b3JXaW5kb3ctPmlzSW5ab29tTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+em9vbUluKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5zY2FsZVVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlpPT01fT1VUOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBpZiAobUVtdWxhdG9yV2luZG93LT5pc0luWm9vbU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnpvb21PdXQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnNjYWxlRG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0VUlDb21tYW5kOjpQQU5fVVA6CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+cGFuVmVydGljYWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6UEFOX0RPV046CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+cGFuVmVydGljYWwoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlBBTl9MRUZUOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnBhbkhvcml6b250YWwodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6UEFOX1JJR0hUOgorICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICBtRW11bGF0b3JXaW5kb3ctPnBhbkhvcml6b250YWwoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlZPTFVNRV9VUDoKKyAgICAgICAgICAgIGZvcndhcmRLZXlUb0VtdWxhdG9yKEtFWV9WT0xVTUVVUCwgZG93bik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6Vk9MVU1FX0RPV046CisgICAgICAgICAgICBmb3J3YXJkS2V5VG9FbXVsYXRvcihLRVlfVk9MVU1FRE9XTiwgZG93bik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6UE9XRVI6CisgICAgICAgICAgICBmb3J3YXJkS2V5VG9FbXVsYXRvcihLRVlfUE9XRVIsIGRvd24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6Ok1FTlU6CisgICAgICAgICAgICBmb3J3YXJkS2V5VG9FbXVsYXRvcihLRVlfU09GVDEsIGRvd24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OkhPTUU6CisgICAgICAgICAgICBmb3J3YXJkS2V5VG9FbXVsYXRvcihLRVlfSE9NRSwgZG93bik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6QkFDSzoKKyAgICAgICAgICAgIGZvcndhcmRLZXlUb0VtdWxhdG9yKEtFWV9CQUNLLCBkb3duKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0VUlDb21tYW5kOjpPVkVSVklFVzoKKyAgICAgICAgICAgIGZvcndhcmRLZXlUb0VtdWxhdG9yKEtFWV9BUFBTV0lUQ0gsIGRvd24pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUXRVSUNvbW1hbmQ6OlJPVEFURV9SSUdIVDoKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6Uk9UQVRFX0xFRlQ6CisgICAgICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGFmdGVyIHdlIHByZXNlcnZlIHpvb20gYWZ0ZXIgcm90YXRlCisgICAgICAgICAgICAgICAgaWYgKG1FbXVsYXRvcldpbmRvdy0+aXNJblpvb21Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRvb2xzVWktPnpvb21fYnV0dG9uLT5jbGljaygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFJvdGF0aW5nIHRoZSBlbXVsYXRvciBwcmVzZXJ2ZXMgc2l6ZSwgYnV0IHRoaXMgY2FuIGJlIGEKKyAgICAgICAgICAgICAgICAvLyBwcm9ibGVtCisgICAgICAgICAgICAgICAgLy8gaWYsIGZvciBleGFtcGxlLCBhIHZlcnktd2lkZSBlbXVsYXRvciBpbiBsYW5kc2NhcGUgaXMgcm90YXRlZAorICAgICAgICAgICAgICAgIC8vIHRvCisgICAgICAgICAgICAgICAgLy8gcG9ydHJhaXQuIFRvIGF2b2lkIHRoaXMgc2l0dWF0aW9uICh3aGljaCBtYWtlcyB0aGUgc2Nyb2xsCisgICAgICAgICAgICAgICAgLy8gYmFycworICAgICAgICAgICAgICAgIC8vIGFwcGVhciksIGZvcmNlIGEgcmVzaXplIHRvIHRoZSBuZXcgc2l6ZS4KKyAgICAgICAgICAgICAgICBRU2l6ZSBjb250YWluZXJTaXplID0gbUVtdWxhdG9yV2luZG93LT5jb250YWluZXJTaXplKCk7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5kb1Jlc2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFFTaXplKGNvbnRhaW5lclNpemUuaGVpZ2h0KCksIGNvbnRhaW5lclNpemUud2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIFNraW5FdmVudCogc2tpbl9ldmVudCA9IG5ldyBTa2luRXZlbnQoKTsKKyAgICAgICAgICAgICAgICBza2luX2V2ZW50LT50eXBlID0gY21kID09IFF0VUlDb21tYW5kOjpST1RBVEVfUklHSFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGtFdmVudExheW91dE5leHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtFdmVudExheW91dFByZXY7CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGdyaWdvcnlqKTogZGVidWcgb3V0cHV0IG5lZWRlZCBmb3IgaW52ZXN0aWdhdGluZyB0aGUKKyAgICAgICAgICAgICAgICAvLyByb3RhdGlvbgorICAgICAgICAgICAgICAgIC8vIGJ1Zy4KKyAgICAgICAgICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhyb3RhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcVdhcm5pbmcoIlF1ZXVpbmcgc2tpbiBldmVudCBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gUXRVSUNvbW1hbmQ6OlJPVEFURV9SSUdIVCA/ICJST1RBVEVfUklHSFQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlJPVEFURV9MRUZUIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1FbXVsYXRvcldpbmRvdy0+cXVldWVTa2luRXZlbnQoc2tpbl9ldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRdFVJQ29tbWFuZDo6VE9HR0xFX1RSQUNLQkFMTDoKKyAgICAgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICAgICAgU2tpbkV2ZW50KiBza2luX2V2ZW50ID0gbmV3IFNraW5FdmVudCgpOworICAgICAgICAgICAgICAgIHNraW5fZXZlbnQtPnR5cGUgPSBrRXZlbnRUb2dnbGVUcmFja2JhbGw7CisgICAgICAgICAgICAgICAgbUVtdWxhdG9yV2luZG93LT5xdWV1ZVNraW5FdmVudChza2luX2V2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0VUlDb21tYW5kOjpTSE9XX01VTFRJVE9VQ0g6CisgICAgICAgIC8vIE11bHRpdG91Y2ggaXMgaGFuZGxlZCBpbiBFbXVsYXRvclF0V2luZG93LCBhbmQgZG9lc24ndAorICAgICAgICAvLyByZWFsbHkgbmVlZCBhbiBlbGVtZW50IGluIHRoZSBRdFVJQ29tbWFuZCBlbnVtLiBUaGlzCisgICAgICAgIC8vIGVudW0gZWxlbWVudCBleGlzdHMgc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBkaXNwbGF5aW5nCisgICAgICAgIC8vIGl0IGluIHRoZSBsaXN0IG9mIGtleWJvYXJkIHNob3J0Y3V0cyBpbiB0aGUgSGVscCBwYWdlLgorICAgICAgICBkZWZhdWx0OjsKKyAgICB9Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6Zm9yd2FyZEtleVRvRW11bGF0b3IodWludDMyX3Qga2V5Y29kZSwgYm9vbCBkb3duKSB7CisgICAgU2tpbkV2ZW50KiBza2luX2V2ZW50ID0gbmV3IFNraW5FdmVudCgpOworICAgIHNraW5fZXZlbnQtPnR5cGUgPSBkb3duID8ga0V2ZW50S2V5RG93biA6IGtFdmVudEtleVVwOworICAgIHNraW5fZXZlbnQtPnUua2V5LmtleWNvZGUgPSBrZXljb2RlOworICAgIHNraW5fZXZlbnQtPnUua2V5Lm1vZCA9IDA7CisgICAgbUVtdWxhdG9yV2luZG93LT5xdWV1ZVNraW5FdmVudChza2luX2V2ZW50KTsKK30KKworYm9vbCBUb29sV2luZG93OjpoYW5kbGVRdEtleUV2ZW50KFFLZXlFdmVudCogZXZlbnQpIHsKKyAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBrZXlwYWQgbW9kaWZpZXIgZm9yIGFueXRoaW5nLCBhbmQgaXQgZ2V0cyBhZGRlZAorICAgIC8vIHRvIHRoZSBhcnJvdyBrZXlzIG9mIE9TWCBieSBkZWZhdWx0LCBzbyByZW1vdmUgaXQuCisgICAgUUtleVNlcXVlbmNlIGV2ZW50X2tleV9zZXF1ZW5jZShldmVudC0+a2V5KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LT5tb2RpZmllcnMoKSAmIH5RdDo6S2V5cGFkTW9kaWZpZXIpKTsKKyAgICBib29sIGRvd24gPSBldmVudC0+dHlwZSgpID09IFFFdmVudDo6S2V5UHJlc3M7CisgICAgYm9vbCBoID0gbVNob3J0Y3V0S2V5U3RvcmUuaGFuZGxlKGV2ZW50X2tleV9zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMsIGRvd25dKFF0VUlDb21tYW5kIGNtZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVSUNvbW1hbmQoY21kLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVSUNvbW1hbmQoY21kLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIHJldHVybiBoOworfQorCit2b2lkIFRvb2xXaW5kb3c6OmNsb3NlRXh0ZW5kZWRXaW5kb3coKSB7CisgICAgLy8gSWYgdXNlciBpcyBjbGlja2luZyB0aGUgJ3gnIGJ1dHRvbiBsaWtlIGNyYXp5LCB3ZSBtYXkgZ2V0IG11bHRpcGxlCisgICAgLy8gY2xvc2UgZXZlbnRzIGhlcmUsIHNvIG1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gZG9lc24ndCBzY3JldyB0aGUgc3RhdGUgZm9yCisgICAgLy8gYSBuZXh0IGNhbGwuCisgICAgaWYgKG1FeHRlbmRlZFdpbmRvdykgeworICAgICAgICBtRXh0ZW5kZWRXaW5kb3ctPmNsb3NlKCk7CisgICAgICAgIG1FeHRlbmRlZFdpbmRvdy5yZXNldCgpOworICAgIH0KK30KKwordm9pZCBUb29sV2luZG93Ojpkb2NrTWFpbldpbmRvdygpIHsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAvLyBPbiBMaW51eCwgdGhlIGdhcCBiZXR3ZWVuIHRoZSBtYWluIHdpbmRvdyBhbmQKKyAgICAvLyB0aGUgdG9vbCBiYXIgaXMgOCBwaXhlbHMgYmlnZ2VyIHRoYW4gaXMgZXhwZWN0ZWQuCisgICAgLy8gS2x1ZGdlIGEgY29ycmVjdGlvbi4KKyAgICBjb25zdCBzdGF0aWMgaW50IGdhcEFkanVzdCA9IC04OworI2Vsc2UKKyAgICAvLyBXaW5kb3dzIGFuZCBPU1ggYXJlIE9LCisgICAgY29uc3Qgc3RhdGljIGludCBnYXBBZGp1c3QgPSAwOworI2VuZGlmCisKKyAgICAvLyBBbGlnbiBob3Jpem9udGFsbHkgcmVsYXRpdmUgdG8gdGhlIG1haW4gd2luZG93J3MgZnJhbWUuCisgICAgLy8gQWxpZ24gdmVydGljYWxseSB0byBpdHMgY29udGVudHMuCisKKyAgICBtb3ZlKHBhcmVudFdpZGdldCgpLT5mcmFtZUdlb21ldHJ5KCkucmlnaHQoKSArIHRvb2xHYXAgKyBnYXBBZGp1c3QsCisgICAgICAgICBwYXJlbnRXaWRnZXQoKS0+Z2VvbWV0cnkoKS50b3AoKSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6cmFpc2VNYWluV2luZG93KCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+cmFpc2UoKTsKKyAgICBtRW11bGF0b3JXaW5kb3ctPmFjdGl2YXRlV2luZG93KCk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6c2V0VG9vbEVtdUFnZW50KGNvbnN0IFVpRW11QWdlbnQqIGFnUHRyKSB7CisgICAgbVVpRW11QWdlbnQgPSBhZ1B0cjsKKworICAgIGFzc2VydChtRXh0ZW5kZWRXaW5kb3cpOworICAgIG1FeHRlbmRlZFdpbmRvdy0+c2V0QWdlbnQoYWdQdHIpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX2JhY2tfYnV0dG9uX3ByZXNzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5yYWlzZSgpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6QkFDSywgdHJ1ZSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6b25fYmFja19idXR0b25fcmVsZWFzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5hY3RpdmF0ZVdpbmRvdygpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6QkFDSywgZmFsc2UpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX2Nsb3NlX2J1dHRvbl9jbGlja2VkKCkgeworICAgIHBhcmVudFdpZGdldCgpLT5jbG9zZSgpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX2hvbWVfYnV0dG9uX3ByZXNzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5yYWlzZSgpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6SE9NRSwgdHJ1ZSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6b25faG9tZV9idXR0b25fcmVsZWFzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5hY3RpdmF0ZVdpbmRvdygpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6SE9NRSwgZmFsc2UpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX21pbmltaXplX2J1dHRvbl9jbGlja2VkKCkgeworICAgIC8vIHNob3dNaW5pbWl6ZWQoKSBvbiBPU1ggd2lsbCBwdXQgdGhlIHRvb2xiYXIgaW4gdGhlIG1pbmltaXplZCBzdGF0ZSwKKyAgICAvLyB3aGljaCBpcyB1bmRlc2lyZWQuIFdlIG9ubHkgd2FudCB0aGUgbWFpbiB3aW5kb3cgdG8gbWluaW1pemUsIHNvCisgICAgLy8gaGlkZSBpdCBpbnN0ZWFkLgorICAgIHRoaXMtPmhpZGUoKTsKKyAgICBtRW11bGF0b3JXaW5kb3ctPnNob3dNaW5pbWl6ZWQoKTsKK30KKwordm9pZCBUb29sV2luZG93Ojpvbl9wb3dlcl9idXR0b25fcHJlc3NlZCgpIHsKKyAgICBtRW11bGF0b3JXaW5kb3ctPnJhaXNlKCk7CisgICAgaGFuZGxlVUlDb21tYW5kKFF0VUlDb21tYW5kOjpQT1dFUiwgdHJ1ZSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6b25fcG93ZXJfYnV0dG9uX3JlbGVhc2VkKCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+YWN0aXZhdGVXaW5kb3coKTsKKyAgICBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQ6OlBPV0VSLCBmYWxzZSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6b25fdm9sdW1lX3VwX2J1dHRvbl9wcmVzc2VkKCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+cmFpc2UoKTsKKyAgICBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQ6OlZPTFVNRV9VUCwgdHJ1ZSk7Cit9Cit2b2lkIFRvb2xXaW5kb3c6Om9uX3ZvbHVtZV91cF9idXR0b25fcmVsZWFzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5hY3RpdmF0ZVdpbmRvdygpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6Vk9MVU1FX1VQLCBmYWxzZSk7Cit9Cit2b2lkIFRvb2xXaW5kb3c6Om9uX3ZvbHVtZV9kb3duX2J1dHRvbl9wcmVzc2VkKCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+cmFpc2UoKTsKKyAgICBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQ6OlZPTFVNRV9ET1dOLCB0cnVlKTsKK30KK3ZvaWQgVG9vbFdpbmRvdzo6b25fdm9sdW1lX2Rvd25fYnV0dG9uX3JlbGVhc2VkKCkgeworICAgIG1FbXVsYXRvcldpbmRvdy0+YWN0aXZhdGVXaW5kb3coKTsKKyAgICBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQ6OlZPTFVNRV9ET1dOLCBmYWxzZSk7Cit9CisKK3ZvaWQgVG9vbFdpbmRvdzo6b25fb3ZlcnZpZXdfYnV0dG9uX3ByZXNzZWQoKSB7CisgICAgbUVtdWxhdG9yV2luZG93LT5yYWlzZSgpOworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6T1ZFUlZJRVcsIHRydWUpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX292ZXJ2aWV3X2J1dHRvbl9yZWxlYXNlZCgpIHsKKyAgICBtRW11bGF0b3JXaW5kb3ctPmFjdGl2YXRlV2luZG93KCk7CisgICAgaGFuZGxlVUlDb21tYW5kKFF0VUlDb21tYW5kOjpPVkVSVklFVywgZmFsc2UpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX3ByZXZfbGF5b3V0X2J1dHRvbl9jbGlja2VkKCkgeworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6Uk9UQVRFX0xFRlQpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX25leHRfbGF5b3V0X2J1dHRvbl9jbGlja2VkKCkgeworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6Uk9UQVRFX1JJR0hUKTsKK30KKwordm9pZCBUb29sV2luZG93Ojpvbl9zY3JTaG90X2J1dHRvbl9jbGlja2VkKCkgeworICAgIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZDo6VEFLRV9TQ1JFRU5TSE9ULCB0cnVlKTsKK30KK3ZvaWQgVG9vbFdpbmRvdzo6b25fem9vbV9idXR0b25fY2xpY2tlZCgpIHsKKyAgICBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQ6OkVOVEVSX1pPT00sIHRydWUpOworfQorCit2b2lkIFRvb2xXaW5kb3c6OnNob3dPclJhaXNlRXh0ZW5kZWRXaW5kb3coRXh0ZW5kZWRXaW5kb3dQYW5lIHBhbmUpIHsKKyAgICAvLyBTaG93IHRoZSB0YWJiZWQgcGFuZQorICAgIGFzc2VydChtRXh0ZW5kZWRXaW5kb3cpOworCisgICAgbUV4dGVuZGVkV2luZG93LT5zaG93UGFuZShwYW5lKTsKKyAgICBtRXh0ZW5kZWRXaW5kb3ctPnJhaXNlKCk7CisgICAgbUV4dGVuZGVkV2luZG93LT5hY3RpdmF0ZVdpbmRvdygpOworfQorCit2b2lkIFRvb2xXaW5kb3c6Om9uX21vcmVfYnV0dG9uX2NsaWNrZWQoKSB7CisgICAgYXNzZXJ0KG1FeHRlbmRlZFdpbmRvdyk7CisKKyAgICBtRXh0ZW5kZWRXaW5kb3ctPnNob3coKTsKKyAgICBtRXh0ZW5kZWRXaW5kb3ctPnJhaXNlKCk7CisgICAgbUV4dGVuZGVkV2luZG93LT5hY3RpdmF0ZVdpbmRvdygpOworfQorCit2b2lkIFRvb2xXaW5kb3c6OmNyZWF0ZUV4dGVuZGVkV2luZG93KCkgeworICAgIG1FeHRlbmRlZFdpbmRvdy5yZXNldCgKKyAgICAgICAgICAgIG5ldyBFeHRlbmRlZFdpbmRvdyhtRW11bGF0b3JXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNob3J0Y3V0S2V5U3RvcmUpKTsKKyAgICBpZiAoYXV0byByZWNvcmRlcl9wdHIgPSBtVUlFdmVudFJlY29yZGVyLmxvY2soKSkgeworICAgICAgICByZWNvcmRlcl9wdHItPnN0YXJ0UmVjb3JkaW5nKG1FeHRlbmRlZFdpbmRvdy5nZXQoKSk7CisgICAgfQorICAgIGlmIChhdXRvIHVzZXJfYWN0aW9uc19jb3VudGVyID0gbVVzZXJBY3Rpb25zQ291bnRlci5sb2NrKCkpIHsKKyAgICAgICAgdXNlcl9hY3Rpb25zX2NvdW50ZXItPnN0YXJ0Q291bnRpbmdGb3JFeHRlbmRlZFdpbmRvdygKKyAgICAgICAgICAgIG1FeHRlbmRlZFdpbmRvdy5nZXQoKSk7CisgICAgfQorCisgICAgLy8gVGhlIGV4dGVuZGVkIHdpbmRvdyBpcyBjcmVhdGVkIGJlZm9yZSB0aGUgIi4uLiIgYnV0dG9uIGlzIHByZXNzZWQsIHNvIGl0CisgICAgLy8gc2hvdWxkIGJlIGhpZCB1bnRpbCB0aGF0IGJ1dHRvbiBpcyBhY3R1YWxseSBwcmVzc2VkLgorICAgIG1FeHRlbmRlZFdpbmRvdy0+aGlkZSgpOworfQorCit2b2lkIFRvb2xXaW5kb3c6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQqKSB7CisgICAgUVBhaW50ZXIgcDsKKyAgICBRUGVuIHBlbihRdDo6U29saWRMaW5lKTsKKyAgICBwZW4uc2V0Q29sb3IoUXQ6OmJsYWNrKTsKKyAgICBwZW4uc2V0V2lkdGgoMSk7CisgICAgcC5iZWdpbih0aGlzKTsKKyAgICBwLnNldFBlbihwZW4pOworICAgIGRvdWJsZSBkcHIgPSAxLjA7CisgICAgaW50IHByaW1hcnlfc2NyZWVuX2lkeCA9IHFBcHAtPmRlc2t0b3AoKS0+c2NyZWVuTnVtYmVyKHRoaXMpOworICAgIFFTY3JlZW4qIHByaW1hcnlfc2NyZWVuID0gUUFwcGxpY2F0aW9uOjpzY3JlZW5zKCkuYXQocHJpbWFyeV9zY3JlZW5faWR4KTsKKyAgICBpZiAocHJpbWFyeV9zY3JlZW4pIHsKKyAgICAgICAgZHByID0gcHJpbWFyeV9zY3JlZW4tPmRldmljZVBpeGVsUmF0aW8oKTsKKyAgICB9CisgICAgaWYgKGRwciA+IDEuMCkgeworICAgICAgICAvLyBOb3JtYWxseSB5b3UnZCBkcmF3IHRoZSBib3JkZXIgd2l0aCBhICgwLCAwIC0gdy0xLCBoLTEpIHJlY3RhbmdsZS4KKyAgICAgICAgLy8gSG93ZXZlciwgdGhlcmUncyBzb21lIHdlaXJkbmVzcyBnb2luZyBvbiB3aXRoIGhpZ2gtZGVuc2l0eSBkaXNwbGF5cworICAgICAgICAvLyB0aGF0IG1ha2VzIGEgc2luZ2xlLXBpeGVsICJzbGFjayIgYXBwZWFyIGF0IHRoZSBsZWZ0IGFuZCBib3R0b20KKyAgICAgICAgLy8gb2YgdGhlIGJvcmRlci4gVGhpcyBiYXNpY2FsbHkgYWRkcyAxIHRvIGNvbXBlbnNhdGUgZm9yIGl0LgorICAgICAgICBwLmRyYXdSZWN0KGNvbnRlbnRzUmVjdCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwLmRyYXdSZWN0KFFSZWN0KDAsIDAsIHdpZHRoKCkgLSAxLCBoZWlnaHQoKSAtIDEpKTsKKyAgICB9CisgICAgcC5lbmQoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Rvb2wtd2luZG93LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmM1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC90b29sLXdpbmRvdy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9DaXJjdWxhckJ1ZmZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2V4dGVuZGVkLXdpbmRvdy1zdHlsZXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXh0ZW5kZWQtd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3F0LXVpLWNvbW1hbmRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3NldC11aS1lbXUtYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvc2hvcnRjdXQta2V5LXN0b3JlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3NpemUtdHdlYWtlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC91aS1ldmVudC1yZWNvcmRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgInVpX3Rvb2xzLmgiCisKKyNpbmNsdWRlIDxRRGlyPgorI2luY2x1ZGUgPFFFcnJvck1lc3NhZ2U+CisjaW5jbHVkZSA8UUZyYW1lPgorI2luY2x1ZGUgPFFGcmFtZT4KKyNpbmNsdWRlIDxRR3JpZExheW91dD4KKyNpbmNsdWRlIDxRSGFzaD4KKyNpbmNsdWRlIDxRS2V5RXZlbnQ+CisjaW5jbHVkZSA8UU1hcD4KKyNpbmNsdWRlIDxRTWVzc2FnZUJveD4KKyNpbmNsdWRlIDxRUGFpcj4KKyNpbmNsdWRlIDxRUHJvY2Vzcz4KKyNpbmNsdWRlIDxRUXVldWU+CisjaW5jbHVkZSA8UVRvb2xCdXR0b24+CisjaW5jbHVkZSA8UVVybD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2RlZmluZSBSRU1PVEVfU0NSRUVOU0hPVF9GSUxFICIvZGF0YS9sb2NhbC90bXAvc2NyZWVuLnBuZyIKKworY2xhc3MgRW11bGF0b3JRdFdpbmRvdzsKK2NsYXNzIEV4dGVuZGVkV2luZG93OworCit0eXBlZGVmIHZvaWQgKEVtdWxhdG9yUXRXaW5kb3c6OipFbXVsYXRvclF0V2luZG93U2xvdCkoKTsKKworY2xhc3MgVG9vbFdpbmRvdyA6IHB1YmxpYyBRRnJhbWUgeworICAgIFFfT0JKRUNUCisgICAgdXNpbmcgVUlFdmVudFJlY29yZGVyUHRyID0KKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8VUlFdmVudFJlY29yZGVyPGFuZHJvaWQ6OmJhc2U6OkNpcmN1bGFyQnVmZmVyPj47CisgICAgdXNpbmcgVXNlckFjdGlvbnNDb3VudGVyUHRyID0KKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6cXQ6OlVzZXJBY3Rpb25zQ291bnRlcj47CisKK3B1YmxpYzoKKyAgICBUb29sV2luZG93KEVtdWxhdG9yUXRXaW5kb3cqIGVtdWxhdG9yV2luZG93LAorICAgICAgICAgICAgICAgUVdpZGdldCogcGFyZW50LAorICAgICAgICAgICAgICAgVUlFdmVudFJlY29yZGVyUHRyIGV2ZW50X3JlY29yZGVyLAorICAgICAgICAgICAgICAgVXNlckFjdGlvbnNDb3VudGVyUHRyIHVzZXJfYWN0aW9uc19jb3VudGVyKTsKKyAgICB+VG9vbFdpbmRvdygpOworCisgICAgdm9pZCBoaWRlKCk7CisgICAgdm9pZCBzaG93KCk7CisgICAgdm9pZCBkb2NrTWFpbldpbmRvdygpOworICAgIHZvaWQgcmFpc2VNYWluV2luZG93KCk7CisgICAgdm9pZCBzZXRMYXN0RXh0ZW5kZWRXaW5kb3dQYW5lKEV4dGVuZGVkV2luZG93UGFuZSBwYW5lKTsKKworICAgIHZvaWQgc2V0VG9vbEVtdUFnZW50KGNvbnN0IFVpRW11QWdlbnQqIGFnUHRyKTsKKyAgICBjb25zdCBVaUVtdUFnZW50KiBnZXRVaUVtdUFnZW50KCkgY29uc3QgeyByZXR1cm4gbVVpRW11QWdlbnQ7IH0KKworICAgIGJvb2wgaGFuZGxlUXRLZXlFdmVudChRS2V5RXZlbnQqIGV2ZW50KTsKKworICAgIHZvaWQgY2xvc2VFeHRlbmRlZFdpbmRvdygpOworCisgICAgLy8gVGhlIGRlc2lnbmVycyB3YW50IGEgZ2FwIGJldHdlZW4gdGhlIG1haW4gZW11bGF0b3IKKyAgICAvLyB3aW5kb3cgYW5kIHRoZSB0b29sIGJhci4gVGhpcyBpcyBob3cgYmlnIHRoYXQgZ2FwIGlzLgorICAgIHN0YXRpYyBjb25zdCBpbnQgdG9vbEdhcCA9IDEwOworCitwcml2YXRlOgorICAgIHZvaWQgY3JlYXRlRXh0ZW5kZWRXaW5kb3coKTsKKyAgICB2b2lkIGhhbmRsZVVJQ29tbWFuZChRdFVJQ29tbWFuZCBjbWQsIGJvb2wgZG93bik7CisgICAgdm9pZCBmb3J3YXJkS2V5VG9FbXVsYXRvcih1aW50MzJfdCBrZXljb2RlLCBib29sIGRvd24pOworCisgICAgLy8gSGVscGVyIG1ldGhvZCwgY2FsbHMgaGFuZGxlVUlDb21tYW5kIHdpdGgKKyAgICAvLyBkb3duIGVxdWFsIHRvIHRydWUgYW5kIGRvd24gZXF1YWwgdG8gZmFsc2UuCisgICAgdm9pZCBoYW5kbGVVSUNvbW1hbmQoUXRVSUNvbW1hbmQgY21kKSB7CisgICAgICAgIGhhbmRsZVVJQ29tbWFuZChjbWQsIHRydWUpOworICAgICAgICBoYW5kbGVVSUNvbW1hbmQoY21kLCBmYWxzZSk7CisgICAgfQorCisgICAgUVRvb2xCdXR0b24qIGFkZEJ1dHRvbihRR3JpZExheW91dCogbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBpY29uUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgdGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRW11bGF0b3JRdFdpbmRvd1Nsb3Qgc2xvdCk7CisgICAgdm9pZCBzaG93T3JSYWlzZUV4dGVuZGVkV2luZG93KEV4dGVuZGVkV2luZG93UGFuZSBwYW5lKTsKKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZXZlbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBwYWludEV2ZW50KFFQYWludEV2ZW50Kikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGhpZGVFdmVudChRSGlkZUV2ZW50KiBldmVudCkgb3ZlcnJpZGU7CisKKyAgICBFbXVsYXRvclF0V2luZG93KiBtRW11bGF0b3JXaW5kb3c7CisgICAgLy8gRXh0ZW5kZWRXaW5kb3cgaGFzIHNsb3RzIHdpdGggc3Vic2NyaWJlcnMsIHNvIHVzZSBkZWxldGVMYXRlcigpIGluc3RlYWQKKyAgICAvLyBvZiByZWd1bGFyIGRlbGV0ZSBmb3IgaXQuCisgICAgYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ3VzdG9tUHRyPEV4dGVuZGVkV2luZG93LCB2b2lkICgqKShRT2JqZWN0Kik+CisgICAgICAgICAgICBtRXh0ZW5kZWRXaW5kb3c7CisgICAgY29uc3QgVWlFbXVBZ2VudCogbVVpRW11QWdlbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFVpOjpUb29sQ29udHJvbHM+IG1Ub29sc1VpOworICAgIGJvb2wgbVN0YXJ0ZWRBZGJTdG9wUHJvY2VzcyA9IGZhbHNlOworICAgIFNob3J0Y3V0S2V5U3RvcmU8UXRVSUNvbW1hbmQ+IG1TaG9ydGN1dEtleVN0b3JlOworICAgIGJvb2wgbUlzRXh0ZW5kZWRXaW5kb3dWaXNpYmxlT25TaG93ID0gZmFsc2U7CisgICAgUVN0cmluZyBtRGV0ZWN0ZWRBZGJQYXRoOworICAgIFVJRXZlbnRSZWNvcmRlclB0ciBtVUlFdmVudFJlY29yZGVyOworICAgIFVzZXJBY3Rpb25zQ291bnRlclB0ciBtVXNlckFjdGlvbnNDb3VudGVyOworICAgIFNpemVUd2Vha2VyIG1TaXplVHdlYWtlcjsKKworcHJpdmF0ZSBzbG90czoKKyAgICB2b2lkIG9uX2JhY2tfYnV0dG9uX3ByZXNzZWQoKTsKKyAgICB2b2lkIG9uX2JhY2tfYnV0dG9uX3JlbGVhc2VkKCk7CisgICAgdm9pZCBvbl9jbG9zZV9idXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25faG9tZV9idXR0b25fcHJlc3NlZCgpOworICAgIHZvaWQgb25faG9tZV9idXR0b25fcmVsZWFzZWQoKTsKKyAgICB2b2lkIG9uX21pbmltaXplX2J1dHRvbl9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9tb3JlX2J1dHRvbl9jbGlja2VkKCk7CisgICAgdm9pZCBvbl9wb3dlcl9idXR0b25fcHJlc3NlZCgpOworICAgIHZvaWQgb25fcG93ZXJfYnV0dG9uX3JlbGVhc2VkKCk7CisgICAgdm9pZCBvbl9vdmVydmlld19idXR0b25fcHJlc3NlZCgpOworICAgIHZvaWQgb25fb3ZlcnZpZXdfYnV0dG9uX3JlbGVhc2VkKCk7CisgICAgdm9pZCBvbl9wcmV2X2xheW91dF9idXR0b25fY2xpY2tlZCgpOworICAgIHZvaWQgb25fbmV4dF9sYXlvdXRfYnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX3NjclNob3RfYnV0dG9uX2NsaWNrZWQoKTsKKyAgICB2b2lkIG9uX3ZvbHVtZV9kb3duX2J1dHRvbl9wcmVzc2VkKCk7CisgICAgdm9pZCBvbl92b2x1bWVfZG93bl9idXR0b25fcmVsZWFzZWQoKTsKKyAgICB2b2lkIG9uX3ZvbHVtZV91cF9idXR0b25fcHJlc3NlZCgpOworICAgIHZvaWQgb25fdm9sdW1lX3VwX2J1dHRvbl9yZWxlYXNlZCgpOworICAgIHZvaWQgb25fem9vbV9idXR0b25fY2xpY2tlZCgpOworfTsKKwordHlwZWRlZiB2b2lkIChUb29sV2luZG93OjoqVG9vbFdpbmRvd1Nsb3QpKCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC90b29scy51aSBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3Rvb2xzLnVpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNjZjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC90b29scy51aQpAQCAtMCwwICsxLDU4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx1aSB2ZXJzaW9uPSI0LjAiPgorIDxjbGFzcz5Ub29sQ29udHJvbHM8L2NsYXNzPgorIDx3aWRnZXQgY2xhc3M9IlFGcmFtZSIgbmFtZT0iVG9vbENvbnRyb2xzIj4KKyAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgIDxyZWN0PgorICAgIDx4PjA8L3g+CisgICAgPHk+MDwveT4KKyAgICA8d2lkdGg+NjA8L3dpZHRoPgorICAgIDxoZWlnaHQ+NTE2PC9oZWlnaHQ+CisgICA8L3JlY3Q+CisgIDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJzaXplUG9saWN5Ij4KKyAgIDxzaXplcG9saWN5IGhzaXpldHlwZT0iRml4ZWQiIHZzaXpldHlwZT0iRml4ZWQiPgorICAgIDxob3JzdHJldGNoPjA8L2hvcnN0cmV0Y2g+CisgICAgPHZlcnN0cmV0Y2g+MDwvdmVyc3RyZXRjaD4KKyAgIDwvc2l6ZXBvbGljeT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1pbmltdW1TaXplIj4KKyAgIDxzaXplPgorICAgIDx3aWR0aD42MDwvd2lkdGg+CisgICAgPGhlaWdodD41MTY8L2hlaWdodD4KKyAgIDwvc2l6ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1heGltdW1TaXplIj4KKyAgIDxzaXplPgorICAgIDx3aWR0aD42MDwvd2lkdGg+CisgICAgPGhlaWdodD41MTY8L2hlaWdodD4KKyAgIDwvc2l6ZT4KKyAgPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd1RpdGxlIj4KKyAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0ic3R5bGVTaGVldCI+CisgICA8c3RyaW5nIG5vdHI9InRydWUiPmJhY2tncm91bmQtY29sb3I6ICMzOTQyNDk7Citjb2xvcjogI2YwZjBmMDwvc3RyaW5nPgorICA8L3Byb3BlcnR5PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0icG93ZXJfYnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjEyPC94PgorICAgICA8eT4yODwveT4KKyAgICAgPHdpZHRoPjM2PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgIDxzdHJpbmc+UG93ZXI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSJyZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3Bvd2VyX3NldHRpbmdzPC9ub3JtYWxvZmY+Oi9saWdodC9wb3dlcl9zZXR0aW5nczwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+cG93ZXJfc2V0dGluZ3M8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idWlDb21tYW5kIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+UE9XRVI8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJ2b2x1bWVfdXBfYnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjEyPC94PgorICAgICA8eT43MjwveT4KKyAgICAgPHdpZHRoPjM2PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgIDxzdHJpbmc+Vm9sdW1lIHVwPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC92b2x1bWVfdXA8L25vcm1hbG9mZj46L2xpZ2h0L3ZvbHVtZV91cDwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+dm9sdW1lX3VwPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InVpQ29tbWFuZCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPlZPTFVNRV9VUDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJUb29sV2luZG93QnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9InZvbHVtZV9kb3duX2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MTE2PC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5Wb2x1bWUgZG93bjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvdm9sdW1lX2Rvd248L25vcm1hbG9mZj46L2xpZ2h0L3ZvbHVtZV9kb3duPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj52b2x1bWVfZG93bjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ1aUNvbW1hbmQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5WT0xVTUVfRE9XTjwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJUb29sV2luZG93QnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9InByZXZfbGF5b3V0X2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MTYwPC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5Sb3RhdGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSJyZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3NjcmVlbl9yb3RhdGlvbl9sZWZ0PC9ub3JtYWxvZmY+Oi9saWdodC9zY3JlZW5fcm90YXRpb25fbGVmdDwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+c2NyZWVuX3JvdGF0aW9uX2xlZnQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idWlDb21tYW5kIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+Uk9UQVRFX0xFRlQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJiYWNrX2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MzM2PC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5CYWNrPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9iYWNrPC9ub3JtYWxvZmY+Oi9saWdodC9iYWNrPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5iYWNrPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InVpQ29tbWFuZCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPkJBQ0s8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJ6b29tX2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MjkyPC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5ab29tPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC96b29tPC9ub3JtYWxvZmY+Oi9saWdodC96b29tPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImNoZWNrYWJsZSI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPnpvb208L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idWlDb21tYW5kIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+RU5URVJfWk9PTTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJUb29sV2luZG93QnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9Im1vcmVfYnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjEyPC94PgorICAgICA8eT40Njg8L3k+CisgICAgIDx3aWR0aD4zNjwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MzY8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sVGlwIj4KKyAgICA8c3RyaW5nPk1vcmU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSJyZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L21vcmU8L25vcm1hbG9mZj46L2xpZ2h0L21vcmU8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjI0PC93aWR0aD4KKyAgICAgPGhlaWdodD4yNDwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPm1vcmU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJzY3JTaG90X2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MjQ4PC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5TY3JlZW4gc2hvdDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvc2NyZWVuX3Nob3Q8L25vcm1hbG9mZj46L2xpZ2h0L3NjcmVlbl9zaG90PC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5zY3JlZW5fc2hvdDwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ1aUNvbW1hbmQiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZz5UQUtFX1NDUkVFTlNIT1Q8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJob21lX2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MzgwPC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5Ib21lPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9ob21lPC9ub3JtYWxvZmY+Oi9saWdodC9ob21lPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5ob21lPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InVpQ29tbWFuZCIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nPkhPTUU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJvdmVydmlld19idXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MTI8L3g+CisgICAgIDx5PjQyNDwveT4KKyAgICAgPHdpZHRoPjM2PC93aWR0aD4KKyAgICAgPGhlaWdodD4zNjwvaGVpZ2h0PgorICAgIDwvcmVjdD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0X21ldHJpY3MiIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+ZmFsc2U8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRvb2xUaXAiPgorICAgIDxzdHJpbmc+T3ZlcnZpZXc8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSJyZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L292ZXJ2aWV3PC9ub3JtYWxvZmY+Oi9saWdodC9vdmVydmlldzwvaWNvbnNldD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvblNpemUiPgorICAgIDxzaXplPgorICAgICA8d2lkdGg+MjQ8L3dpZHRoPgorICAgICA8aGVpZ2h0PjI0PC9oZWlnaHQ+CisgICAgPC9zaXplPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJmbGF0Ij4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0aGVtZUljb25OYW1lIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSI+b3ZlcnZpZXc8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idWlDb21tYW5kIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+T1ZFUlZJRVc8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iVG9vbFdpbmRvd0J1dHRvbiIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD50cnVlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgPC93aWRnZXQ+CisgIDx3aWRnZXQgY2xhc3M9IlFQdXNoQnV0dG9uIiBuYW1lPSJjbG9zZV9idXR0b24iPgorICAgPHByb3BlcnR5IG5hbWU9Imdlb21ldHJ5Ij4KKyAgICA8cmVjdD4KKyAgICAgPHg+MTE8L3g+CisgICAgIDx5PjY8L3k+CisgICAgIDx3aWR0aD4xNjwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MTY8L2hlaWdodD4KKyAgICA8L3JlY3Q+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InJlcG9ydF9tZXRyaWNzIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPmZhbHNlPC9ib29sPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sVGlwIj4KKyAgICA8c3RyaW5nPkNsb3NlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRleHQiPgorICAgIDxzdHJpbmcgbm90cj0idHJ1ZSIvPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uIj4KKyAgICA8aWNvbnNldCByZXNvdXJjZT0icmVzb3VyY2VzLnFyYyI+CisgICAgIDxub3JtYWxvZmY+Oi9saWdodC9jbG9zZTwvbm9ybWFsb2ZmPjovbGlnaHQvY2xvc2U8L2ljb25zZXQ+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb25TaXplIj4KKyAgICA8c2l6ZT4KKyAgICAgPHdpZHRoPjEyPC93aWR0aD4KKyAgICAgPGhlaWdodD4xMjwvaGVpZ2h0PgorICAgIDwvc2l6ZT4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iZmxhdCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGhlbWVJY29uTmFtZSIgc3Rkc2V0PSIwIj4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiPmNsb3NlPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IlRvb2xXaW5kb3dCdXR0b24iIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorICA8d2lkZ2V0IGNsYXNzPSJRUHVzaEJ1dHRvbiIgbmFtZT0ibWluaW1pemVfYnV0dG9uIj4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJnZW9tZXRyeSI+CisgICAgPHJlY3Q+CisgICAgIDx4PjMzPC94PgorICAgICA8eT42PC95PgorICAgICA8d2lkdGg+MTY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjE2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5NaW5pbWl6ZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0Ij4KKyAgICA8c3RyaW5nIG5vdHI9InRydWUiLz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0iaWNvbiI+CisgICAgPGljb25zZXQgcmVzb3VyY2U9InJlc291cmNlcy5xcmMiPgorICAgICA8bm9ybWFsb2ZmPjovbGlnaHQvbWluaW1pemU8L25vcm1hbG9mZj46L2xpZ2h0L21pbmltaXplPC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yMTwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MTI8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5taW5pbWl6ZTwvc3RyaW5nPgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJUb29sV2luZG93QnV0dG9uIiBzdGRzZXQ9IjAiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICA8L3dpZGdldD4KKyAgPHdpZGdldCBjbGFzcz0iUVB1c2hCdXR0b24iIG5hbWU9Im5leHRfbGF5b3V0X2J1dHRvbiI+CisgICA8cHJvcGVydHkgbmFtZT0iZ2VvbWV0cnkiPgorICAgIDxyZWN0PgorICAgICA8eD4xMjwveD4KKyAgICAgPHk+MjA0PC95PgorICAgICA8d2lkdGg+MzY8L3dpZHRoPgorICAgICA8aGVpZ2h0PjM2PC9oZWlnaHQ+CisgICAgPC9yZWN0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRfbWV0cmljcyIgc3Rkc2V0PSIwIj4KKyAgICA8Ym9vbD5mYWxzZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idG9vbFRpcCI+CisgICAgPHN0cmluZz5Sb3RhdGU8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idGV4dCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIi8+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9Imljb24iPgorICAgIDxpY29uc2V0IHJlc291cmNlPSJyZXNvdXJjZXMucXJjIj4KKyAgICAgPG5vcm1hbG9mZj46L2xpZ2h0L3NjcmVlbl9yb3RhdGlvbl9yaWdodDwvbm9ybWFsb2ZmPjovbGlnaHQvc2NyZWVuX3JvdGF0aW9uX3JpZ2h0PC9pY29uc2V0PgorICAgPC9wcm9wZXJ0eT4KKyAgIDxwcm9wZXJ0eSBuYW1lPSJpY29uU2l6ZSI+CisgICAgPHNpemU+CisgICAgIDx3aWR0aD4yNDwvd2lkdGg+CisgICAgIDxoZWlnaHQ+MjQ8L2hlaWdodD4KKyAgICA8L3NpemU+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9ImZsYXQiPgorICAgIDxib29sPnRydWU8L2Jvb2w+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9InRoZW1lSWNvbk5hbWUiIHN0ZHNldD0iMCI+CisgICAgPHN0cmluZyBub3RyPSJ0cnVlIj5zY3JlZW5fcm90YXRpb25fcmlnaHQ8L3N0cmluZz4KKyAgIDwvcHJvcGVydHk+CisgICA8cHJvcGVydHkgbmFtZT0idWlDb21tYW5kIiBzdGRzZXQ9IjAiPgorICAgIDxzdHJpbmc+Uk9UQVRFX1JJR0hUPC9zdHJpbmc+CisgICA8L3Byb3BlcnR5PgorICAgPHByb3BlcnR5IG5hbWU9IlRvb2xXaW5kb3dCdXR0b24iIHN0ZHNldD0iMCI+CisgICAgPGJvb2w+dHJ1ZTwvYm9vbD4KKyAgIDwvcHJvcGVydHk+CisgIDwvd2lkZ2V0PgorIDwvd2lkZ2V0PgorIDx0YWJzdG9wcz4KKyAgPHRhYnN0b3A+cG93ZXJfYnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD52b2x1bWVfdXBfYnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD52b2x1bWVfZG93bl9idXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPnByZXZfbGF5b3V0X2J1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+c2NyU2hvdF9idXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPnpvb21fYnV0dG9uPC90YWJzdG9wPgorICA8dGFic3RvcD5iYWNrX2J1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+aG9tZV9idXR0b248L3RhYnN0b3A+CisgIDx0YWJzdG9wPm92ZXJ2aWV3X2J1dHRvbjwvdGFic3RvcD4KKyAgPHRhYnN0b3A+bW9yZV9idXR0b248L3RhYnN0b3A+CisgPC90YWJzdG9wcz4KKyA8cmVzb3VyY2VzPgorICA8aW5jbHVkZSBsb2NhdGlvbj0icmVzb3VyY2VzLnFyYyIvPgorIDwvcmVzb3VyY2VzPgorIDxjb25uZWN0aW9ucy8+Cis8L3VpPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvdWktZXZlbnQtcmVjb3JkZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3VpLWV2ZW50LXJlY29yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNTlkZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3VpLWV2ZW50LXJlY29yZGVyLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1R5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXZlbnQtc3Vic2NyaWJlci5oIgorCisjaW5jbHVkZSA8UUV2ZW50PgorI2luY2x1ZGUgPFFFbnRlckV2ZW50PgorI2luY2x1ZGUgPFFDbG9zZUV2ZW50PgorI2luY2x1ZGUgPFFIaWRlRXZlbnQ+CisjaW5jbHVkZSA8UUZvY3VzRXZlbnQ+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CisjaW5jbHVkZSA8UVJlc2l6ZUV2ZW50PgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6ZW5hYmxlX2lmX2NvbnZlcnRpYmxlOworCitzdHJ1Y3QgRXZlbnRSZWNvcmQgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxRRXZlbnQ+IGV2ZW50OworICAgIHN0ZDo6c3RyaW5nIHRhcmdldF9uYW1lOworfTsKKworLy8gVGhpcyBjbGFzcyBpbnRlcmNlcHRzIHZhcmlvdXMgVUkgZXZlbnRzIHZpYSBFdmVudENhcHR1cmVyCisvLyBhbmQgc3RvcmVzIHRoZWlyIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb25zIGluIGEgY29udGFpbmVyLgordGVtcGxhdGUgPHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUPj4gY2xhc3MgRXZlbnRDb250YWluZXI+CitjbGFzcyBVSUV2ZW50UmVjb3JkZXIgOiBwdWJsaWMgRXZlbnRTdWJzY3JpYmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBDb250YWluZXJUeXBlID0gRXZlbnRDb250YWluZXI8RXZlbnRSZWNvcmQ+OworCisgICAgZXhwbGljaXQgVUlFdmVudFJlY29yZGVyKEV2ZW50Q2FwdHVyZXIqIGVjYXApIDogRXZlbnRTdWJzY3JpYmVyKGVjYXApIHt9CisKKyAgICAvLyBMZXRzIHRoZSBjbGllbnQgc3BlY2lhbGl6ZSB0aGVpciBvd24gY29udGFpbmVyIGluc3RhbmNlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIGV4cGxpY2l0IFVJRXZlbnRSZWNvcmRlcigKKyAgICAgICAgICAgIEV2ZW50Q2FwdHVyZXIqIGVjYXAsCisgICAgICAgICAgICBVJiYgY29udGFpbmVyLAorICAgICAgICAgICAgZW5hYmxlX2lmX2NvbnZlcnRpYmxlPFUsIENvbnRhaW5lclR5cGU+ID0gbnVsbHB0cikgOgorICAgICAgICBFdmVudFN1YnNjcmliZXIoZWNhcCksCisgICAgICAgIG1Db250YWluZXIoc3RkOjpmb3J3YXJkPFU+KGNvbnRhaW5lcikpIHt9CisKKyAgICAvLyBHZXQgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHVuZGVyZWx5aW5nIGNvbnRhaW5lciB3aXRoIHNlcmlhbGl6ZWQKKyAgICAvLyBldmVudHMuCisgICAgY29uc3QgQ29udGFpbmVyVHlwZSYgY29udGFpbmVyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbnRhaW5lcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBvYmplY3RQcmVkaWNhdGUoY29uc3QgUU9iamVjdCopIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICAgIGNvbnN0IEV2ZW50Q2FwdHVyZXI6OkV2ZW50VHlwZVNldCYgZXZlbnRUeXBlcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1FdmVudFR5cGVzOworICAgIH0KKworICAgIHZvaWQgcHJvY2Vzc0V2ZW50KGNvbnN0IFFPYmplY3QqIHRhcmdldCwgY29uc3QgUUV2ZW50KiBldmVudCkgb3ZlcnJpZGUgeworICAgICAgICBFdmVudFJlY29yZCByZWNvcmQgeworICAgICAgICAgICAgY2xvbmVFdmVudChldmVudCksCisgICAgICAgICAgICB0YXJnZXQtPm9iamVjdE5hbWUoKS50b1N0ZFN0cmluZygpCisgICAgICAgIH07CisgICAgICAgIG1Db250YWluZXIucHVzaF9iYWNrKHN0ZDo6bW92ZShyZWNvcmQpKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UUV2ZW50PiBjbG9uZUV2ZW50KGNvbnN0IFFFdmVudCogZSkgeworICAgICAgICBzd2l0Y2goZS0+dHlwZSgpKSB7CisgICAgICAgIGNhc2UgUUV2ZW50OjpDbG9zZToKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUV2ZW50SGVscGVyPFFDbG9zZUV2ZW50PihlKTsKKyAgICAgICAgY2FzZSBRRXZlbnQ6OkVudGVyOgorICAgICAgICAgICAgcmV0dXJuIGNsb25lRXZlbnRIZWxwZXI8UUVudGVyRXZlbnQ+KGUpOworICAgICAgICBjYXNlIFFFdmVudDo6TGVhdmU6CisgICAgICAgICAgICByZXR1cm4gY2xvbmVFdmVudEhlbHBlcjxRRXZlbnQ+KGUpOworICAgICAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25QcmVzczoKKyAgICAgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZToKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUV2ZW50SGVscGVyPFFNb3VzZUV2ZW50PihlKTsKKyAgICAgICAgY2FzZSBRRXZlbnQ6OkZvY3VzSW46CisgICAgICAgIGNhc2UgUUV2ZW50OjpGb2N1c091dDoKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUV2ZW50SGVscGVyPFFGb2N1c0V2ZW50PihlKTsKKyAgICAgICAgY2FzZSBRRXZlbnQ6OkhpZGU6CisgICAgICAgICAgICByZXR1cm4gY2xvbmVFdmVudEhlbHBlcjxRSGlkZUV2ZW50PihlKTsKKyAgICAgICAgY2FzZSBRRXZlbnQ6OlJlc2l6ZToKKyAgICAgICAgICAgIHJldHVybiBjbG9uZUV2ZW50SGVscGVyPFFSZXNpemVFdmVudD4oZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2FmZXR5IG1lYXN1cmUuIElmIHdlIGdvdCBoZXJlLCBpdCBtZWFucworICAgICAgICAgICAgLy8gdGhhdCB0aGlzIG1ldGhvZCB3YXMgbm90IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIHN1cG9wb3J0ZWQKKyAgICAgICAgICAgIC8vIGV2ZW50IHR5cGVzLgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UUV2ZW50PiBjbG9uZUV2ZW50SGVscGVyKGNvbnN0IFFFdmVudCogZSwgZW5hYmxlX2lmX2NvbnZlcnRpYmxlPFQqLCBRRXZlbnQqPiA9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxRRXZlbnQ+KG5ldyBUKCpzdGF0aWNfY2FzdDxjb25zdCBUKj4oZSkpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ29udGFpbmVyVHlwZSBtQ29udGFpbmVyOworICAgIHN0YXRpYyBFdmVudENhcHR1cmVyOjpFdmVudFR5cGVTZXQgbUV2ZW50VHlwZXM7Cit9OworCisKK3RlbXBsYXRlIDx0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VD4+IGNsYXNzIEV2ZW50Q29udGFpbmVyPgorRXZlbnRDYXB0dXJlcjo6RXZlbnRUeXBlU2V0IFVJRXZlbnRSZWNvcmRlcjxFdmVudENvbnRhaW5lcj46Om1FdmVudFR5cGVzID0geworICAgIFFFdmVudDo6Q2xvc2UsCisgICAgUUV2ZW50OjpFbnRlciwKKyAgICBRRXZlbnQ6OkxlYXZlLAorICAgIFFFdmVudDo6Rm9jdXNJbiwKKyAgICBRRXZlbnQ6OkZvY3VzT3V0LAorICAgIFFFdmVudDo6SGlkZSwKKyAgICBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsCisgICAgUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2UsCisgICAgUUV2ZW50OjpSZXNpemUKK307CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3VpX3Rvb2wtd2luZG93LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC91aV90b29sLXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOWM3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC91aV90b29sLXdpbmRvdy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiogRm9ybSBnZW5lcmF0ZWQgZnJvbSByZWFkaW5nIFVJIGZpbGUgJ3Rvb2wtd2luZG93LnVpJworKioKKyoqIENyZWF0ZWQgYnk6IFF0IFVzZXIgSW50ZXJmYWNlIENvbXBpbGVyIHZlcnNpb24gNS40LjAKKyoqCisqKiBXQVJOSU5HISBBbGwgY2hhbmdlcyBtYWRlIGluIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3Qgd2hlbiByZWNvbXBpbGluZyBVSSBmaWxlIQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8UXRDb3JlL1FWYXJpYW50PgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9RQWN0aW9uPgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9RQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UXRXaWRnZXRzL1FCdXR0b25Hcm91cD4KKyNpbmNsdWRlIDxRdFdpZGdldHMvUUZyYW1lPgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9RR3JpZExheW91dD4KKyNpbmNsdWRlIDxRdFdpZGdldHMvUUhlYWRlclZpZXc+CisjaW5jbHVkZSA8UXRXaWRnZXRzL1FUb29sQnV0dG9uPgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9RV2lkZ2V0PgorCitRVF9CRUdJTl9OQU1FU1BBQ0UKKworY2xhc3MgVWlfVG9vbFdpbmRvdworeworcHVibGljOgorICAgIFFXaWRnZXQgKnZlcnRpY2FsTGF5b3V0V2lkZ2V0OworICAgIFFHcmlkTGF5b3V0ICpncmlkTGF5b3V0OworICAgIFFUb29sQnV0dG9uICp0b29sQnV0dG9uOworICAgIFFUb29sQnV0dG9uICp0b29sQnV0dG9uXzI7CisKKyAgICB2b2lkIHNldHVwVWkoUUZyYW1lICpUb29sV2luZG93KQorICAgIHsKKyAgICAgICAgaWYgKFRvb2xXaW5kb3ctPm9iamVjdE5hbWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBUb29sV2luZG93LT5zZXRPYmplY3ROYW1lKFFTdHJpbmdMaXRlcmFsKCJUb29sV2luZG93IikpOworICAgICAgICBUb29sV2luZG93LT5yZXNpemUoMzcsIDQwMCk7CisgICAgICAgIFRvb2xXaW5kb3ctPnNldEZyYW1lU2hhcGUoUUZyYW1lOjpTdHlsZWRQYW5lbCk7CisgICAgICAgIFRvb2xXaW5kb3ctPnNldEZyYW1lU2hhZG93KFFGcmFtZTo6UmFpc2VkKTsKKyAgICAgICAgdmVydGljYWxMYXlvdXRXaWRnZXQgPSBuZXcgUVdpZGdldChUb29sV2luZG93KTsKKyAgICAgICAgdmVydGljYWxMYXlvdXRXaWRnZXQtPnNldE9iamVjdE5hbWUoUVN0cmluZ0xpdGVyYWwoInZlcnRpY2FsTGF5b3V0V2lkZ2V0IikpOworICAgICAgICB2ZXJ0aWNhbExheW91dFdpZGdldC0+c2V0R2VvbWV0cnkoUVJlY3QoMCwgMCwgNTEsIDExNikpOworICAgICAgICBncmlkTGF5b3V0ID0gbmV3IFFHcmlkTGF5b3V0KHZlcnRpY2FsTGF5b3V0V2lkZ2V0KTsKKyAgICAgICAgZ3JpZExheW91dC0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgiZ3JpZExheW91dCIpKTsKKyAgICAgICAgZ3JpZExheW91dC0+c2V0Q29udGVudHNNYXJnaW5zKDAsIDAsIDAsIDApOworICAgICAgICB0b29sQnV0dG9uID0gbmV3IFFUb29sQnV0dG9uKHZlcnRpY2FsTGF5b3V0V2lkZ2V0KTsKKyAgICAgICAgdG9vbEJ1dHRvbi0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgidG9vbEJ1dHRvbiIpKTsKKyAgICAgICAgUUljb24gaWNvbjsKKyAgICAgICAgaWNvbi5hZGRGaWxlKFFTdHJpbmdMaXRlcmFsKCI6L2ltYWdlcy9wb3dlci5wbmciKSwgUVNpemUoKSwgUUljb246Ok5vcm1hbCwgUUljb246Ok9mZik7CisgICAgICAgIHRvb2xCdXR0b24tPnNldEljb24oaWNvbik7CisKKyAgICAgICAgZ3JpZExheW91dC0+YWRkV2lkZ2V0KHRvb2xCdXR0b24sIDAsIDAsIDEsIDEpOworCisgICAgICAgIHRvb2xCdXR0b25fMiA9IG5ldyBRVG9vbEJ1dHRvbih2ZXJ0aWNhbExheW91dFdpZGdldCk7CisgICAgICAgIHRvb2xCdXR0b25fMi0+c2V0T2JqZWN0TmFtZShRU3RyaW5nTGl0ZXJhbCgidG9vbEJ1dHRvbl8yIikpOworICAgICAgICBRRm9udCBmb250OworICAgICAgICBmb250LnNldFBvaW50U2l6ZSg5KTsKKyAgICAgICAgdG9vbEJ1dHRvbl8yLT5zZXRGb250KGZvbnQpOworCisgICAgICAgIGdyaWRMYXlvdXQtPmFkZFdpZGdldCh0b29sQnV0dG9uXzIsIDEsIDAsIDEsIDEpOworCisKKyAgICAgICAgcmV0cmFuc2xhdGVVaShUb29sV2luZG93KTsKKworICAgICAgICBRTWV0YU9iamVjdDo6Y29ubmVjdFNsb3RzQnlOYW1lKFRvb2xXaW5kb3cpOworICAgIH0gLy8gc2V0dXBVaQorCisgICAgdm9pZCByZXRyYW5zbGF0ZVVpKFFGcmFtZSAqVG9vbFdpbmRvdykKKyAgICB7CisgICAgICAgIFRvb2xXaW5kb3ctPnNldFdpbmRvd1RpdGxlKFFBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJUb29sV2luZG93IiwgIkZyYW1lIiwgMCkpOworICAgICAgICB0b29sQnV0dG9uLT5zZXRUZXh0KFFTdHJpbmcoKSk7CisgICAgICAgIHRvb2xCdXR0b25fMi0+c2V0VGV4dChRQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiVG9vbFdpbmRvdyIsICJSb3RhdGUiLCAwKSk7CisgICAgfSAvLyByZXRyYW5zbGF0ZVVpCisKK307CisKK25hbWVzcGFjZSBVaSB7CisgICAgY2xhc3MgVG9vbFdpbmRvdzogcHVibGljIFVpX1Rvb2xXaW5kb3cge307Cit9IC8vIG5hbWVzcGFjZSBVaQorCitRVF9FTkRfTkFNRVNQQUNFCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwZmMyMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3VzZXItYWN0aW9ucy1jb3VudGVyLmNwcApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQgbWF5IGJlIGNvcGllZCwKKy8vIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5oIgorCisjaW5jbHVkZSA8UVZhcmlhbnQ+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHF0IHsKKworLy8gc3RhdGljCitjb25zdCBjaGFyIFVzZXJBY3Rpb25zQ291bnRlcjo6a1JlcG9ydE1ldHJpY3NQcm9wZXJ0eVtdID0gInJlcG9ydF9tZXRyaWNzIjsKKworVXNlckFjdGlvbnNDb3VudGVyOjpVc2VyQWN0aW9uc0NvdW50ZXIoRXZlbnRDYXB0dXJlciogZXZlbnRDYXB0dXJlcikKKyAgICAgICAgOiBtRXZlbnRUeXBlcyh7UUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2UsIFFFdmVudDo6S2V5UmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgUUV2ZW50OjpGaWxlT3Blbn0pLAorICAgICAgICAgIG1FdmVudENhcHR1cmVyKGV2ZW50Q2FwdHVyZXIpIHsKKyAgICBhc3NlcnQobUV2ZW50Q2FwdHVyZXIpOworfQorCit2b2lkIFVzZXJBY3Rpb25zQ291bnRlcjo6c3RhcnRDb3VudGluZ0FsbChRT2JqZWN0KiB0YXJnZXQpIHsKKyAgICBtVG9rZW5zW3RhcmdldF0gPSBtRXZlbnRDYXB0dXJlci0+c3Vic2NyaWJlVG9FdmVudHMoCisgICAgICAgICAgICB0YXJnZXQsIFtdKGNvbnN0IFFPYmplY3QqIG8pIHsgcmV0dXJuIHRydWU7IH0sIG1FdmVudFR5cGVzLAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFFPYmplY3QqIHRhcmdldCwgY29uc3QgUUV2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgIHRoaXMtPnByb2Nlc3NFdmVudCh0YXJnZXQsIGV2ZW50KTsKKyAgICAgICAgICAgIH0pOworICAgIGNvbm5lY3QodGFyZ2V0LCBTSUdOQUwoZGVzdHJveWVkKCkpLCB0aGlzLCBTTE9UKHN0b3BDb3VudGluZ0ZvckVtaXR0ZXIoKSkpOworfQorCit2b2lkIFVzZXJBY3Rpb25zQ291bnRlcjo6c3RhcnRDb3VudGluZ01hcmtlZChRT2JqZWN0KiB0YXJnZXQpIHsKKyAgICBtVG9rZW5zW3RhcmdldF0gPSBtRXZlbnRDYXB0dXJlci0+c3Vic2NyaWJlVG9FdmVudHMoCisgICAgICAgICAgICB0YXJnZXQsIFt0aGlzXShjb25zdCBRT2JqZWN0KiBvKSB7IHJldHVybiB0aGlzLT5pc01hcmtlZChvKTsgfSwKKyAgICAgICAgICAgIG1FdmVudFR5cGVzLAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IFFPYmplY3QqIHRhcmdldCwgY29uc3QgUUV2ZW50KiBldmVudCkgeworICAgICAgICAgICAgICAgIHRoaXMtPnByb2Nlc3NFdmVudCh0YXJnZXQsIGV2ZW50KTsKKyAgICAgICAgICAgIH0pOworICAgIGNvbm5lY3QodGFyZ2V0LCBTSUdOQUwoZGVzdHJveWVkKCkpLCB0aGlzLCBTTE9UKHN0b3BDb3VudGluZ0ZvckVtaXR0ZXIoKSkpOworfQorCit2b2lkIFVzZXJBY3Rpb25zQ291bnRlcjo6c3RvcENvdW50aW5nRm9yRW1pdHRlcigpIHsKKyAgICBpZiAoYXV0byB0YXJnZXQgPSBzZW5kZXIoKSkgeworICAgICAgICBtVG9rZW5zLmVyYXNlKHRhcmdldCk7CisgICAgfQorfQorCitib29sIFVzZXJBY3Rpb25zQ291bnRlcjo6aXNNYXJrZWQoY29uc3QgUU9iamVjdCogdGFyZ2V0KSB7CisgICAgaWYgKCF0YXJnZXQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIHVzZSB0aGUgbWV0cmljcyByZXBvcnRpbmcgZHluYW1pYyBwcm9wZXJ0eSB0byBjb25zaWRlciBhIHdpZGdldCBhcworICAgIC8vIHdvcnRoIGNvdW50aW5nLiBXZSdsbCBjb3VudCBhbGwgdXNlciBhY3Rpb25zIC0tIGV2ZW4gZm9yIHdpZGdldHMgd2hlcmUKKyAgICAvLyBubyBVSSBtZXRyaWNzIGFyZSBiZWluZyByZXBvcnRlZCBvdGhlcndpc2UuCisgICAgUVZhcmlhbnQgbWV0cmljc0VuYWJsZWQgPSB0YXJnZXQtPnByb3BlcnR5KGtSZXBvcnRNZXRyaWNzUHJvcGVydHkpOworCisgICAgLy8gRHluYW1pYyBwcm9wZXJ0aWVzIGFyZSBub3QgaW5oZXJpdGVkIGJ5IGNoaWxkIHdpZGdldHMsIGJ1dCB0aGUgbW91c2UKKyAgICAvLyBjbGljayBldmVudHMgY2FuIGJlIGNhcHR1cmVkIHRoZXJlIGluIChlLmcuIFFDb21ib0JveCBkb2Vzbid0IGdldCBhbnkKKyAgICAvLyBRRXZlbnQgd2hlbiB0aGUgc2VsZWN0aW9uIGlzIGNoYW5nZWQuIEEgcHJpdmF0ZSBzdWItd2lkZ2V0IGdldCB0aGUgZXZlbnQKKyAgICAvLyBhbmQgdHJhbnNsYXRlcyB0aGF0IHRvIFFDb21ib0JveCBzcGVjaWZpYyBzaWduYWxzKS4gU28sIGFsc28gbWFyayBhbGwKKyAgICAvLyBzdWJ3aWRnZXRzIG9mIGEgbWFya2VkIHdpZGdldC4KKyAgICByZXR1cm4gbWV0cmljc0VuYWJsZWQuaXNWYWxpZCgpIHx8IGlzTWFya2VkKHRhcmdldC0+cGFyZW50KCkpOworfQorCit2b2lkIFVzZXJBY3Rpb25zQ291bnRlcjo6cHJvY2Vzc0V2ZW50KGNvbnN0IFFPYmplY3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUV2ZW50KiBldmVudCkgeworICAgIC8vIEFsbCB0aGUgZmlsdGVyaW5nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSB3aGVuIHJlZ2lzdGVyaW5nIGZvciBldmVudHMuCisgICAgKyttQ291bnQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBxdAorfSAgLy8gIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC91c2VyLWFjdGlvbnMtY291bnRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvdXNlci1hY3Rpb25zLWNvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNmYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvdXNlci1hY3Rpb25zLWNvdW50ZXIuaApAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvZXZlbnQtc3Vic2NyaWJlci5oIgorCisjaW5jbHVkZSA8UU9iamVjdD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHF0IHsKKworY2xhc3MgVXNlckFjdGlvbnNDb3VudGVyIDogcHVibGljIFFPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBVc2VyQWN0aW9uc0NvdW50ZXIoRXZlbnRDYXB0dXJlciogZXZlbnRDYXB0dXJlcik7CisKK3B1YmxpYyBzbG90czoKKyAgICAvLyBEaWZmZXJlbnQgd2luZG93IHR5cGVzIGFyZSB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudGx5LgorICAgIC8vIEZvciBVSSB3aWRnZXQgY29udGFpbmluZyB3aW5kb3dzLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBidXR0b24KKyAgICAvLyBjbGlja3MgYW5kIG90aGVyIHdpZGdldCByZWxhdGVkIGFjdGlvbnMuCisgICAgLy8gT24gd2luZG93cyB0aGF0IHJlcHJlc2VudCB0aGUgdmlydHVhbCBkZXZpY2UgaXRzZWxmLCBhbGwgdXNlciBjbGlja3MgYXJlCisgICAgLy8gc2lnbmlmaWNhbnQuCisgICAgdm9pZCBzdGFydENvdW50aW5nRm9yTWFpbldpbmRvdyhRT2JqZWN0KiB0YXJnZXQpIHsKKyAgICAgICAgc3RhcnRDb3VudGluZ0FsbCh0YXJnZXQpOworICAgIH0KKyAgICB2b2lkIHN0YXJ0Q291bnRpbmdGb3JPdmVybGF5V2luZG93KFFPYmplY3QqIHRhcmdldCkgeworICAgICAgICBzdGFydENvdW50aW5nQWxsKHRhcmdldCk7CisgICAgfQorICAgIHZvaWQgc3RhcnRDb3VudGluZ0ZvclRvb2xXaW5kb3coUU9iamVjdCogdGFyZ2V0KSB7CisgICAgICAgIHN0YXJ0Q291bnRpbmdNYXJrZWQodGFyZ2V0KTsKKyAgICB9CisgICAgdm9pZCBzdGFydENvdW50aW5nRm9yRXh0ZW5kZWRXaW5kb3coUU9iamVjdCogdGFyZ2V0KSB7CisgICAgICAgIHN0YXJ0Q291bnRpbmdNYXJrZWQodGFyZ2V0KTsKKyAgICB9CisKK3ByaXZhdGUgc2xvdHM6CisgICAgLy8gU3RvcHMgbW9uaXRvcmluZyBldmVudHMgZnJvbSB0aGUgZ2l2ZW4gdGFyZ2V0J3MgaGllcmFyY2h5LiAgVGhpcyBtZXRob2QKKyAgICAvLyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBzdWJzY3JpYmVyIHdhcyBub3QgcHJldmlvdXNseSBzdWJzY3JpYmVkIHRvIHRoZQorICAgIC8vIGV2ZW50cyBmcm9tIHRoYXQgdGFyZ2V0LgorICAgIC8vIFRoaXMgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSBzaWduYWwgZnJvbSB0aGUgdGFyZ2V0LiBDYWxsaW5nIGl0IGRpcmVjdGx5CisgICAgLy8gKGFzIGEgZnVuY3Rpb24pIGhhcyBubyBlZmZlY3QuCisgICAgdm9pZCBzdG9wQ291bnRpbmdGb3JFbWl0dGVyKCk7CisKK3B1YmxpYzoKKyAgICAvLyBSZXNldCB0aGUgdXNlciBhY3Rpb24gY291bnQuIERvZXMgbm90IHN0b3AgbGlzdGVuaW5nIGZvciBldmVudHMgb24gdGhlCisgICAgLy8gcmVnaXN0ZXJlZCBvYmplY3RzLgorICAgIHZvaWQgcmVzZXQoKSB7IG1Db3VudCA9IDA7IH0KKyAgICB1aW50NjRfdCBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1Db3VudDsgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBjaGFyIGtSZXBvcnRNZXRyaWNzUHJvcGVydHlbXTsKKyAgICB2b2lkIHN0YXJ0Q291bnRpbmdBbGwoUU9iamVjdCogdGFyZ2V0KTsKKyAgICB2b2lkIHN0YXJ0Q291bnRpbmdNYXJrZWQoUU9iamVjdCogdGFyZ2V0KTsKKyAgICBib29sIGlzTWFya2VkKGNvbnN0IFFPYmplY3QqIHRhcmdldCk7CisgICAgdm9pZCBwcm9jZXNzRXZlbnQoY29uc3QgUU9iamVjdCogdGFyZ2V0LCBjb25zdCBRRXZlbnQqIGV2ZW50KTsKKworICAgIGNvbnN0IEV2ZW50Q2FwdHVyZXI6OkV2ZW50VHlwZVNldCBtRXZlbnRUeXBlczsKKyAgICBFdmVudENhcHR1cmVyKiBtRXZlbnRDYXB0dXJlcjsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8UU9iamVjdCosIEV2ZW50Q2FwdHVyZXI6OlN1YnNjcmliZXJUb2tlbj4gbVRva2VuczsKKyAgICB1aW50NjRfdCBtQ291bnQgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHF0Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2F2ZWZyb250LW9iai1wYXJzZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2F2ZWZyb250LW9iai1wYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTI4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC93YXZlZnJvbnQtb2JqLXBhcnNlci5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvd2F2ZWZyb250LW9iai1wYXJzZXIuaCIKKworI2luY2x1ZGUgPFFTdHJpbmc+CisKKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2Ugc3RkIHsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQ+PiB7CisgICAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgdHVwbGU8aW50LCBpbnQsIGludD4mIHQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGhhc2hfY29tYmluZShzdGQ6Omhhc2g8aW50PigpKGdldDwwPih0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9jb21iaW5lKHN0ZDo6aGFzaDxpbnQ+KCkoZ2V0PDE+KHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpoYXNoPGludD4oKShnZXQ8Mj4odCkpKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBpbnQgaGFzaF9jb21iaW5lKGludCBzZWVkLCBpbnQgdikgeworICAgICAgICByZXR1cm4gc3RkOjpoYXNoPGludD4oKSh2KSArIDB4OWUzNzc5YjkgKyAoc2VlZDw8NikgKyAoc2VlZD4+Mik7CisgICAgfQorfTsKK30KKworYm9vbCBwYXJzZVdhdmVmcm9udE9CSihRVGV4dFN0cmVhbSYgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4mIHZ0eF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEdMdWludD4mIGlkeF9idWYpIHsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcG9zLCB0ZXgsIG5vcm07CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6dHVwbGU8aW50LCBpbnQsIGludD4sIHNpemVfdD4gaWR4X3RhYmxlOworICAgIFFTdHJpbmcgc3RyOworICAgIGludCB2ZXJ0aWNlcyA9IDA7CisKKyAgICB2dHhfYnVmLmNsZWFyKCk7CisgICAgaWR4X2J1Zi5jbGVhcigpOworCisgICAgZm9yIChzdHJlYW0gPj4gc3RyOyAhc3RyZWFtLmF0RW5kKCk7IHN0cmVhbSA+PiBzdHIpIHsKKyAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSA8PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyWzBdID09ICcjJykgeworICAgICAgICAgICAgLy8gQ29tbWVudCwgcmVhZCB0aWxsIHRoZSBlbmQgb2YgbGluZS4KKyAgICAgICAgICAgIHN0cmVhbS5yZWFkTGluZSgpOworICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAidiIgfHwgc3RyID09ICJ2biIpIHsKKyAgICAgICAgICAgIC8vIFZlcnRleCBwb3NpdGlvbiBvciBub3JtYWwuCisgICAgICAgICAgICAvLyBCb3RoIGFyZSBzcGVjaWZpZWQgd2l0aCAzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKKyAgICAgICAgICAgIC8vIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgZmxvYXQgeHl6WzNdOworICAgICAgICAgICAgc3RyZWFtID4+IHh5elswXSA+PiB4eXpbMV0gPj4geHl6WzJdOworICAgICAgICAgICAgaWYgKHN0cmVhbS5zdGF0dXMoKSAhPSBRVGV4dFN0cmVhbTo6T2spIHsKKyAgICAgICAgICAgICAgICBxV2FybmluZygiT0JKIHBhcnNlcjogaW52YWxpZCBwb3NpdGlvbiBvciBub3JtYWwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvJiBjb250YWluZXIgPSAoc3RyID09ICJ2IiA/IHBvcyA6IG5vcm0pOworICAgICAgICAgICAgY29udGFpbmVyLmluc2VydChjb250YWluZXIuZW5kKCksIHh5eiwgeHl6ICsgMyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJ2dCIpIHsKKyAgICAgICAgICAgIC8vIFVWIGNvb3Jkcy4KKyAgICAgICAgICAgIC8vIFNwZWNpZmllZCB3aXRoIDIgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KKyAgICAgICAgICAgIGZsb2F0IHV2WzJdOworICAgICAgICAgICAgc3RyZWFtID4+IHV2WzBdID4+IHV2WzFdOworICAgICAgICAgICAgaWYgKHN0cmVhbS5zdGF0dXMoKSAhPSBRVGV4dFN0cmVhbTo6T2spIHsKKyAgICAgICAgICAgICAgICBxV2FybmluZygiT0JKIHBhcnNlcjogaW52YWxpZCBVViIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleC5pbnNlcnQodGV4LmVuZCgpLCB1diwgdXYgKyAyKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gImYiKSB7CisgICAgICAgICAgICAvLyBGYWNlLgorICAgICAgICAgICAgLy8gQSBmYWNlIGlzIHNwZWNpZmllZCB3aXRoIDMgdmVydGljZXMuCisgICAgICAgICAgICAvLyBBIHZlcnRleCBpcyBzcGVjaWZpZWQgbGlrZSAidnAvdnQvdm4iIChubyBzcGFjZXMpCisgICAgICAgICAgICAvLyB3aGVyZSB2cCwgdnQgYW5kIHZuIGFyZSBpbmRpY2VzIGludG8gdGhlIHBvc2l0aW9uLAorICAgICAgICAgICAgLy8gVVYgYW5kIG5vcm1hbCBhcnJheXMuCisgICAgICAgICAgICBRU3RyaW5nIHY7CisgICAgICAgICAgICBzaXplX3QgdnAsIHZ0LCB2bjsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtID4+IHY7CisgICAgICAgICAgICAgICAgUVN0cmluZ0xpc3QgY29tcG9uZW50cyA9IHYuc3BsaXQoJy8nLCBRU3RyaW5nOjpTa2lwRW1wdHlQYXJ0cyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuc2l6ZSgpICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgcVdhcm5pbmcoIk9CSiBwYXJzZXI6IGludmFsaWQgZmFjZSBzcGVjaWZpY2F0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYm9vbCBwb3NfcmVzdWx0LCB0ZXhfcmVzdWx0LCBucm1fcmVzdWx0OworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpbmRpY2VzIGluIE9CSiBhcmUgMS1iYXNlZC4KKyAgICAgICAgICAgICAgICB2cCA9IGNvbXBvbmVudHNbMF0udG9JbnQoJnBvc19yZXN1bHQpIC0gMTsKKyAgICAgICAgICAgICAgICB2dCA9IGNvbXBvbmVudHNbMV0udG9JbnQoJnRleF9yZXN1bHQpIC0gMTsKKyAgICAgICAgICAgICAgICB2biA9IGNvbXBvbmVudHNbMl0udG9JbnQoJm5ybV9yZXN1bHQpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIShwb3NfcmVzdWx0ICYmIHRleF9yZXN1bHQgJiYgbnJtX3Jlc3VsdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdnAgKiAzID49IHBvcy5zaXplKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdnQgKiAyID49IHRleC5zaXplKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgdm4gKiAzID49IG5vcm0uc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHFXYXJuaW5nKCJPQkogcGFyc2VyOiBpbnZhbGlkIGZhY2Ugc3BlY2lmaWNhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF1dG8gdmVydGV4X2lkeCA9IHN0ZDo6bWFrZV90dXBsZSh2cCwgdnQsIHZuKTsKKyAgICAgICAgICAgICAgICBhdXRvIHZlcnRleF9pdCA9IGlkeF90YWJsZS5maW5kKHZlcnRleF9pZHgpOworICAgICAgICAgICAgICAgIGlmICh2ZXJ0ZXhfaXQgPT0gaWR4X3RhYmxlLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgZW5jb3VudGVyaW5nIHRoaXMgdmVydGV4LCB3cml0ZSBpdHMgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIHZlcnRleCBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbGVtZW50X2FycmF5X2lkeCA9IHZlcnRpY2VzKys7CisgICAgICAgICAgICAgICAgICAgIGlkeF9idWYucHVzaF9iYWNrKGVsZW1lbnRfYXJyYXlfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgdnR4X2J1Zi5pbnNlcnQodnR4X2J1Zi5lbmQoKSwgJnBvc1t2cCAqIDNdLCAmcG9zW3ZwICogMyArIDNdKTsKKyAgICAgICAgICAgICAgICAgICAgdnR4X2J1Zi5pbnNlcnQodnR4X2J1Zi5lbmQoKSwgJm5vcm1bdm4gKiAzXSwgJm5vcm1bdm4gKiAzICsgM10pOworICAgICAgICAgICAgICAgICAgICB2dHhfYnVmLmluc2VydCh2dHhfYnVmLmVuZCgpLCAmdGV4W3Z0ICogMl0sICZ0ZXhbdnQgKiAyICsgMl0pOworICAgICAgICAgICAgICAgICAgICBpZHhfdGFibGVbdmVydGV4X2lkeF0gPSBlbGVtZW50X2FycmF5X2lkeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGVuY291bnRlcmVkIHRoaXMgdmVydGV4LCB3cml0ZSBpdHMgaW5kZXggaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBpZHhfYnVmLnB1c2hfYmFjayh2ZXJ0ZXhfaXQtPnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU29tZXRoaW5nJ3Mgd3JvbmcsIGJhaWwgb3V0LgorICAgICAgICAgICAgcVdhcm5pbmcoIk9CSiBwYXJzZXI6IGludmFsaWQgaW5wdXQgWyVzXSIsIHN0ci50b1N0ZFN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2F2ZWZyb250LW9iai1wYXJzZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dhdmVmcm9udC1vYmotcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2NWYxOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dhdmVmcm9udC1vYmotcGFyc2VyLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJHTEVTMi9nbDIuaCIKKworI2luY2x1ZGUgPFFUZXh0U3RyZWFtPgorCisvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHBhcnNlIGNlcnRhaW4gc3Vic2V0IG9mIHRoZSBXYXZlZnJvbnQgT0JKIGZvcm1hdC4KKy8vIFNlZSBoZXJlIGZvciBkZXRhaWxzOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XYXZlZnJvbnRfLm9ial9maWxlCisvLyBJdCBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKy8vIDEuIE1hdGVyaWFscyBhcmUgbm90IHN1cHBvcnRlZC4KKy8vIDIuIFBvc2l0aW9uIGNvb3JkaW5hdGVzIG11c3QgaGF2ZSBvbmx5IHgsIHkgYW5kIHogKHcgZGVmYXVsdHMgdG8gMSkKKy8vIDMuIFRleHR1cmUgY29vcmRpbmF0ZXMgbXVzdCBoYXZlIG9ubHkgdSBhbmQgdiAodyBkZWZhdWx0cyB0byAwKQorLy8gNC4gUGFyYW1ldGVyIHNwYWNlIHZlcnRpY2VzIGFyZSBub3Qgc3VwcG9ydGVkLgorLy8gNS4gT25seSB0cmlhbmd1bGFyIGZhY2VzIGFyZSBhbGxvd2VkLgorLy8gNi4gQSBmYWNlIG11c3QgYmUgc3BlY2lmaWVkIGFzICJmIHYxL3Z0MS92bjEgdjIvdnQyL3ZuMiB2My92dDMvdm4zIiwgd2hlcmUgdiogYXJlCisvLyAgICB0aGUgaW5kaWNlcyBvZiBwb3NpdGlvbiBjb29yZGluYXRlcywgdnQqIGFyZSB0aGUgaW5kaWNlcyBvZiB0ZXh0dXJlCisvLyAgICBjb29yZGluYXRlcyBhbmQgdm4qIGFyZSBpbmRpY2VzIG9mIG5vcm1hbHMuCisvLyB8c3RyZWFtfCBpcyB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdGhlIE9CSiBkYXRhIGlzIHJlYWQKKy8vIHx2dHhfYnVmfCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyLCBpdCB3aWxsIGNvbnRhaW4gdGhlIHZlcnRleCBkYXRhIGluIHRoZQorLy8gICAgICAgICAgIGZvbGxvd2luZyBmb3JtYXQ6IDxYPiA8WT4gPFo+IDxYJz4gPFknPiA8Wic+IDxVPiA8Vj4uCisvLyAgICAgICAgICAgV2hlcmUgWFlaIGlzIHBvc2l0aW9uLCBYJ1knWicgaXMgdGhlIG5vcm1hbCBhbmQgVVYgYXJlIHRleHR1cmUKKy8vICAgICAgICAgICBjb29yZGluYXRlcy4gSXQgaXMgc3VpdGFibGUgZm9yIGNyZWF0aW5nIGEgYnVmZmVyIG9iamVjdCBvZgorLy8gICAgICAgICAgIHZlcnRleCBkYXRhIGZvciBhIHNoYWRlci4KKy8vIHxpZHhfYnVmfCBpcyBhbiBvdXRwdXQgcGFyYW1ldGVyLCBpdCB3aWxsIGNvbnRhaW4gaW5kaWNlcyBmb3IgdmVydGljZXMKKy8vICAgICAgICAgICBmcm9tIHx2dHhidWZ8LiBJdCBpcyBzdWl0YWJsZSBmb3IgY3JlYXRpbmcgYW4gZWxlbWVudCBhcnJheSBidWZmZXIKKy8vICAgICAgICAgICBmb3IgYSBzaGFkZXIuCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBsb2FkaW5nIHRoZSBtZXNoIHdhcyBzdWNjZXNzZnVsLCBhbmQgZmFsc2UKKy8vIG90aGVyd2lzZS4KK2Jvb2wgcGFyc2VXYXZlZnJvbnRPQkooUVRleHRTdHJlYW0mIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiB2dHhidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEdMdWludD4mIGlkeGJ1Zik7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2luZG93cy1uYXRpdmUtd2luZG93LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM2YmY2MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5jcHAKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5oIgorCitpbnQgbnVtSGVsZE1vdXNlQnV0dG9ucygpIHsKKworICAgIC8vIFdlIGNhcmUgYWJvdXQgdGhlIGxlZnQgYW5kIHJpZ2h0IG1vdXNlIGJ1dHRvbnMgYmVjYXVzZSB0aGVzZSBmdW5jdGlvbnMKKyAgICAvLyBxdWVyeSB0aGUgcGh5c2ljYWwgbW91c2Ugc3RhdGUsIGJ1dCB0aG9zZSBidXR0b25zIGNhbiBiZSByZS1tYXBwZWQgaW4KKyAgICAvLyB0aGUgc3lzdGVtIHZpcnR1YWxseS4KKyAgICBpbnQgbnVtSGVsZCA9IDA7CisgICAgaWYgKEdldEtleVN0YXRlKFZLX0xCVVRUT04pICYgMHg4MCkgeworICAgICAgICBudW1IZWxkKys7CisgICAgfQorICAgIGlmIChHZXRLZXlTdGF0ZShWS19SQlVUVE9OKSAmIDB4ODApIHsKKyAgICAgICAgbnVtSGVsZCsrOworICAgIH0KKyAgICByZXR1cm4gbnVtSGVsZDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2luZG93cy1uYXRpdmUtd2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3Nzc0OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbmRvd3MtbmF0aXZlLXdpbmRvdy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2ludCBudW1IZWxkTW91c2VCdXR0b25zKCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9xdC93aW5zeXMtcXQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mODg1ODdkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmNwcApAQCAtMCwwICsxLDQ3NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgQ09ORklHX1BPU0lYCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9xdC9xdF9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVzb3VyY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3F0L2VtdWxhdG9yLXF0LXdpbmRvdy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9xdC9lbXVsYXRvci1xdC1uby13aW5kb3cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvaW5pdC1xdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc2V0ZW52LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tYWluLWNvbW1vbi11aS5oIgorCisjaW5jbHVkZSA8UXRDb3JlPgorI2luY2x1ZGUgPFFBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRQ29yZUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgorI2luY2x1ZGUgPFFGb250RGF0YWJhc2U+CisjaW5jbHVkZSA8UU1lbnU+CisjaW5jbHVkZSA8UU1lbnVCYXI+CisjaW5jbHVkZSA8UVJlY3Q+CisjaW5jbHVkZSA8UVNlbWFwaG9yZT4KKyNpbmNsdWRlIDxRVGhyZWFkPgorI2luY2x1ZGUgPFFXaWRnZXQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZmRlZiBRX09TX0xJTlVYCisvLyBUaGlzIGluY2x1ZGUgbmVlZHMgdG8gYmUgYWZ0ZXIgYWxsIHRoZSBRdCBpbmNsdWRlcworLy8gYmVjYXVzZSBpdCBkZWZpbmVzIG1hY3Jvcy90eXBlcyB0aGF0IGNvbmZsaWN0IHdpdGgKKy8vIHF0J3Mgb3duIG1hY3Jvcy90eXBlcy4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8c2hlbGxhcGkuaD4KKyNlbmRpZgorCisjaWZkZWYgX19BUFBMRV9fCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworI2lmZGVmIF9XSU4zMgordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOworI2VuZGlmCisKKyNkZWZpbmUgIERFQlVHICAxCisKKyNpZiBERUJVRworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2RlZmluZSAgRCguLi4pICAgVkVSQk9TRV9QUklOVChzdXJmYWNlLF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgIEQoLi4uKSAgICgodm9pZCkwKQorI2VuZGlmCisKK3N0cnVjdCBHbG9iYWxTdGF0ZSB7CisgICAgaW50IGFyZ2M7CisgICAgY2hhcioqIGFyZ3Y7CisgICAgUUNvcmVBcHBsaWNhdGlvbiogYXBwOworICAgIGJvb2wgd2luZG93X3Bvc19zYXZlZDsKKyAgICBpbnQgd2luZG93X3Bvc194OworICAgIGludCB3aW5kb3dfcG9zX3k7Cit9OworCitzdGF0aWMgR2xvYmFsU3RhdGUqIGdsb2JhbFN0YXRlKCkgeworICAgIHN0YXRpYyBHbG9iYWxTdGF0ZSBzR2xvYmFsU3RhdGUgPSB7CisgICAgICAgIC5hcmdjID0gMCwKKyAgICAgICAgLmFyZ3YgPSBOVUxMLAorICAgICAgICAuYXBwID0gTlVMTCwKKyAgICAgICAgLndpbmRvd19wb3Nfc2F2ZWQgPSBmYWxzZSwKKyAgICAgICAgLndpbmRvd19wb3NfeCA9IDAsCisgICAgICAgIC53aW5kb3dfcG9zX3kgPSAwLAorICAgIH07CisgICAgcmV0dXJuICZzR2xvYmFsU3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZVNpZ0NoaWxkKCkgeworICAgIC8vIFRoZSBpc3N1ZSBvbmx5IG9jY3VycyBvbiBEYXJ3aW4gc28gdG8gYmUgc2FmZSBqdXN0IGRvIHRoaXMgb24gRGFyd2luCisgICAgLy8gdG8gcHJldmVudCBwb3RlbnRpYWwgaXNzdWVzLiBUaGUgZnVuY3Rpb24gZXhpc3RzIG9uIGFsbCBwbGF0Zm9ybXMgdG8KKyAgICAvLyBtYWtlIHRoZSBjYWxsaW5nIGNvZGUgbG9vayBjbGVhbmVyLiBJbiBhZGRpdGlvbiB0aGUgaXNzdWUgb25seSBvY2N1cnMKKyAgICAvLyB3aGVuIHRoZSBleHRlbmRlZCB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC4gV2UgZG8gbm90IGN1cnJlbnRseSBrbm93CisgICAgLy8gd2h5IHRoaXMgb25seSBoYXBwZW5zIG9uIERhcndpbiBhbmQgd2h5IGl0IG9ubHkgaGFwcGVucyBvbmNlIHRoZQorICAgIC8vIGV4dGVuZGVkIHdpbmRvdyBpcyBjcmVhdGVkLiBUaGUgc2lnbWFzayBpcyBub3QgY2hhbmdlZCBhZnRlciB0aGUKKyAgICAvLyBleHRlbmRlZCB3aW5kb3cgaGFzIGJlZW4gY3JlYXRlZC4KKyNpZmRlZiBfX0FQUExFX18KKyAgICBzaWdzZXRfdCBzZXQ7CisgICAgc2lnZW1wdHlzZXQoJnNldCk7CisgICAgc2lnYWRkc2V0KCZzZXQsIFNJR0NITEQpOworICAgIC8vIFdlIG9ubHkgbmVlZCB0byBlbmFibGUgU0lHQ0hMRCBmb3IgdGhlIFF0IG1haW4gdGhyZWFkIHNpbmNlIHRoYXQncyB3aGVyZQorICAgIC8vIGFsbCB0aGUgUXQgc3R1ZmYgcnVucy4gVGhlIG1haW4gbG9vcCBzaG91bGQgZXZlbnR1YWxseSBtYWtlIHN5c2NhbGxzIHRoYXQKKyAgICAvLyB0cmlnZ2VyIHNpZ25hbHMuCisgICAgaW50IHJlc3VsdCA9IHB0aHJlYWRfc2lnbWFzayhTSUdfVU5CTE9DSywgJnNldCwgbnVsbHB0cik7CisgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgIEQoIkNvdWxkIG5vdCBzZXQgdGhyZWFkIHNpZ21hc2s6ICVkIiwgcmVzdWx0KTsKKyAgICB9CisjZW5kaWYKK30KKworc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IHNraW5fd2luc3lzX2dldF9zaGFyZWRfcHRyKCkgeworICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8dm9pZD4oRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2VQdHIoKSk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX2VudGVyX21haW5fbG9vcChib29sIG5vX3dpbmRvdykgeworICAgIEQoIlN0YXJ0aW5nIFFUIG1haW4gbG9vcFxuIik7CisKKyAgICAvLyBJbiBvcmRlciBmb3IgUVByb2Nlc3MgdG8gY29ycmVjdGx5IGhhbmRsZSBwcm9jZXNzZXMgdGhhdCBleGl0IHdlIG5lZWQKKyAgICAvLyB0byBlbmFibGUgU0lHQ0hMRC4gVGhhdCdzIGhvdyBRdCBrbm93cyB0byB3YWl0IGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gSWYKKyAgICAvLyBpdCBkb2Vzbid0IHdhaXQgdGhlIHByb2Nlc3Mgd2lsbCBiZSBsZWZ0IGFzIGEgem9tYmllIGFuZCB0aGUgZmluaXNoZWQKKyAgICAvLyBzaWduYWwgd2lsbCBub3QgYmUgZW1pdHRlZCBmcm9tIFFQcm9jZXNzLgorICAgIGVuYWJsZVNpZ0NoaWxkKCk7CisgICAgR2xvYmFsU3RhdGUqIGcgPSBnbG9iYWxTdGF0ZSgpOworICAgIGctPmFwcC0+ZXhlYygpOworICAgIEQoIkZpbmlzaGVkIFFUIG1haW4gbG9vcFxuIik7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX2dldF9tb25pdG9yX3JlY3QoU2tpblJlY3QgKnJlY3QpCit7CisgICAgUVJlY3QgcXJlY3Q7CisgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgRW11bGF0b3JRdFdpbmRvdyAqd2luZG93ID0gRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2luZG93LT5nZXRTY3JlZW5EaW1lbnNpb25zKCZxcmVjdCwgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKKyAgICByZWN0LT5wb3MueCA9IHFyZWN0LmxlZnQoKTsKKyAgICByZWN0LT5wb3MueSA9IHFyZWN0LnRvcCgpOworICAgIHJlY3QtPnNpemUudyA9IHFyZWN0LndpZHRoKCk7CisgICAgcmVjdC0+c2l6ZS5oID0gcXJlY3QuaGVpZ2h0KCk7CisgICAgRCgiJXM6ICglZCwlZCkgJWR4JWQiLCBfX0ZVTkNUSU9OX18sIHJlY3QtPnBvcy54LCByZWN0LT5wb3MueSwKKyAgICAgIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oKTsKK30KKworZXh0ZXJuIGludCBza2luX3dpbnN5c19nZXRfZGV2aWNlX3BpeGVsX3JhdGlvKGRvdWJsZSAqZHByKQoreworICAgIEQoInNraW5fd2luc3lzX2dldF9kZXZpY2VfcGl4ZWxfcmF0aW8iKTsKKyAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBFbXVsYXRvclF0V2luZG93ICp3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogQ291bGQgbm90IGdldCB3aW5kb3cgaGFuZGxlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB3aW5kb3ctPmdldERldmljZVBpeGVsUmF0aW8oZHByLCAmc2VtYXBob3JlKTsKKyAgICBzZW1hcGhvcmUuYWNxdWlyZSgpOworICAgIEQoIiVzOiByZXN1bHQ9JWYiLCBfX0ZVTkNUSU9OX18sICpkcHIpOworICAgIHJldHVybiAwOworfQorCitleHRlcm4gdm9pZCAqc2tpbl93aW5zeXNfZ2V0X3dpbmRvd19oYW5kbGUodm9pZCkKK3sKKyAgICBEKCJza2luX3dpbnN5c19nZXRfd2luZG93X2hhbmRsZSIpOworICAgIFdJZCBoYW5kbGU7CisgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgRW11bGF0b3JRdFdpbmRvdyAqd2luZG93ID0gRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aW5kb3ctPmdldFdpbmRvd0lkKCZoYW5kbGUsICZzZW1hcGhvcmUpOworICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7CisgICAgRCgiJXM6IHJlc3VsdCA9IDB4JXAiLCBfX0ZVTkNUSU9OX18sICh2b2lkKiloYW5kbGUpOworICAgIHJldHVybiAodm9pZCopaGFuZGxlOworfQorCitleHRlcm4gdm9pZCBza2luX3dpbnN5c19nZXRfd2luZG93X3BvcyhpbnQgKngsIGludCAqeSkKK3sKKyAgICBEKCJza2luX3dpbnN5c19nZXRfd2luZG93X3BvcyIpOworICAgIEdsb2JhbFN0YXRlKiBnID0gZ2xvYmFsU3RhdGUoKTsKKyAgICBpZiAoZy0+d2luZG93X3Bvc19zYXZlZCkgeworICAgICAgICAqeCA9IGctPndpbmRvd19wb3NfeDsKKyAgICAgICAgKnkgPSBnLT53aW5kb3dfcG9zX3k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgICAgIEVtdWxhdG9yUXRXaW5kb3cgKndpbmRvdyA9IEVtdWxhdG9yUXRXaW5kb3c6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2luZG93LT5nZXRXaW5kb3dQb3MoeCwgeSwgJnNlbWFwaG9yZSk7CisgICAgICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7CisgICAgfQorICAgIEQoIiVzOiB4PSVkIHk9JWQiLCBfX0ZVTkNUSU9OX18sICp4LCAqeSk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX3NldF9kZXZpY2VfZ2VvbWV0cnkoY29uc3QgU2tpblJlY3QqIHJlY3QpIHsKKyAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBFbXVsYXRvclF0V2luZG93ICp3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogQ291bGQgbm90IGdldCB3aW5kb3cgaGFuZGxlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBRUmVjdCBxcmVjdChyZWN0LT5wb3MueCwgcmVjdC0+cG9zLnksIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oKTsKKyAgICB3aW5kb3ctPnNldERldmljZUdlb21ldHJ5KCZxcmVjdCwgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKK30KKworZXh0ZXJuIHZvaWQgc2tpbl93aW5zeXNfc2F2ZV93aW5kb3dfcG9zKCkgeworICAgIGludCB4ID0gMCwgeSA9IDA7CisgICAgc2tpbl93aW5zeXNfZ2V0X3dpbmRvd19wb3MoJngsICZ5KTsKKyAgICBHbG9iYWxTdGF0ZSogZyA9IGdsb2JhbFN0YXRlKCk7CisgICAgZy0+d2luZG93X3Bvc19zYXZlZCA9IHRydWU7CisgICAgZy0+d2luZG93X3Bvc194ID0geDsKKyAgICBnLT53aW5kb3dfcG9zX3kgPSB5OworfQorCitleHRlcm4gYm9vbCBza2luX3dpbnN5c19pc193aW5kb3dfZnVsbHlfdmlzaWJsZSgpCit7CisgICAgRCgic2tpbl93aW5zeXNfaXNfd2luZG93X2Z1bGx5X3Zpc2libGUiKTsKKyAgICBRU2VtYXBob3JlIHNlbWFwaG9yZTsKKyAgICBFbXVsYXRvclF0V2luZG93ICp3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogQ291bGQgbm90IGdldCB3aW5kb3cgaGFuZGxlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgdmFsdWU7CisgICAgd2luZG93LT5pc1dpbmRvd0Z1bGx5VmlzaWJsZSgmdmFsdWUsICZzZW1hcGhvcmUpOworICAgIHNlbWFwaG9yZS5hY3F1aXJlKCk7CisgICAgRCgiJXM6IHJlc3VsdCA9ICVzIiwgX19GVU5DVElPTl9fLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIHJldHVybiB2YWx1ZTsKK30KKworZXh0ZXJuIHZvaWQgc2tpbl93aW5zeXNfcXVpdF9yZXF1ZXN0KCkKK3sKKyAgICBEKF9fRlVOQ1RJT05fXyk7CisgICAgYXV0byB3aW5kb3cgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICBEKCIlczogQ291bGQgbm90IGdldCB3aW5kb3cgaGFuZGxlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aW5kb3ctPnJlcXVlc3RDbG9zZSgpOworfQorCit2b2lkIHNraW5fd2luc3lzX2Rlc3Ryb3koKSB7CisgICAgRChfX0ZVTkNUSU9OX18pOworCisgICAgLy8gTWFjIGlzIHN0aWxsIGNhdXNpbmcgdXMgdHJvdWJsZXMgLSBpdCBzb21laG93IG1hbmFnZXMgdG8gbm90IGNhbGwgdGhlCisgICAgLy8gbWFpbiB3aW5kb3cgZGVzdHJ1Y3RvciAoaW4gcWVtaTEgb25seSEpIGFuZCBjcmFzaGVzIGlmIFFBcHBsaWNhdGlvbgorICAgIC8vIGlzIGRlc3Ryb3llZCByaWdodCBoZXJlLiBTbyBsZXQncyBkZWxheSB0aGUgZGVsZXRpb24gZm9yIG5vdworI2lmZGVmIF9fQVBQTEVfXworICAgIGF0ZXhpdChbXSB7CisgICAgICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZSgpLT5hcHA7CisgICAgICAgIGdsb2JhbFN0YXRlKCktPmFwcCA9IG51bGxwdHI7CisgICAgfSk7CisjZWxzZQorICAgIGRlbGV0ZSBnbG9iYWxTdGF0ZSgpLT5hcHA7CisgICAgZ2xvYmFsU3RhdGUoKS0+YXBwID0gbnVsbHB0cjsKKyNlbmRpZgorfQorCitleHRlcm4gdm9pZCBza2luX3dpbnN5c19zZXRfd2luZG93X2ljb24oY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgRCgic2tpbl93aW5zeXNfc2V0X3dpbmRvd19pY29uIik7CisgICAgRW11bGF0b3JRdFdpbmRvdyAqd2luZG93ID0gRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2luZG93LT5zZXRXaW5kb3dJY29uKGRhdGEsIHNpemUpOworfQorCitleHRlcm4gdm9pZCBza2luX3dpbnN5c19zZXRfd2luZG93X3BvcyhpbnQgeCwgaW50IHkpCit7CisgICAgRCgic2tpbl93aW5zeXNfc2V0X3dpbmRvd19wb3MgJWQsICVkIiwgeCwgeSk7CisgICAgRW11bGF0b3JRdFdpbmRvdyAqd2luZG93ID0gRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgd2luZG93LT5zZXRXaW5kb3dQb3MoeCwgeSwgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKK30KKworZXh0ZXJuIHZvaWQgc2tpbl93aW5zeXNfc2V0X3dpbmRvd190aXRsZShjb25zdCBjaGFyICp0aXRsZSkKK3sKKyAgICBEKCJza2luX3dpbnN5c19zZXRfd2luZG93X3RpdGxlIFslc10iLCB0aXRsZSk7CisgICAgUVNlbWFwaG9yZSBzZW1hcGhvcmU7CisgICAgRW11bGF0b3JRdFdpbmRvdyAqd2luZG93ID0gRW11bGF0b3JRdFdpbmRvdzo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAod2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUVN0cmluZyBxdGl0bGUodGl0bGUpOworICAgIHdpbmRvdy0+c2V0VGl0bGUoJnF0aXRsZSwgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKK30KKworZXh0ZXJuIHZvaWQgc2tpbl93aW5zeXNfc3Bhd25fdGhyZWFkKGJvb2wgbm9fd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0RnVuY3Rpb24gZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogYXJndikgeworICAgIEQoInNraW5fc3Bhd25fdGhyZWFkIik7CisgICAgaWYgKG5vX3dpbmRvdykgeworICAgICAgICBFbXVsYXRvclF0Tm9XaW5kb3cqIGd1aWxlc3Nfd2luZG93ID0gRW11bGF0b3JRdE5vV2luZG93OjpnZXRJbnN0YW5jZSgpOworICAgICAgICBpZiAoZ3VpbGVzc193aW5kb3cgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZ3VpbGVzc193aW5kb3ctPnN0YXJ0VGhyZWFkKFtmLCBhcmdjLCBhcmd2XSB7IGYoYXJnYywgYXJndik7IH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIEVtdWxhdG9yUXRXaW5kb3cqIHdpbmRvdyA9IEVtdWxhdG9yUXRXaW5kb3c6OmdldEluc3RhbmNlKCk7CisgICAgICAgIGlmICh3aW5kb3cgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IENvdWxkIG5vdCBnZXQgd2luZG93IGhhbmRsZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd2luZG93LT5zdGFydFRocmVhZChmLCBhcmdjLCBhcmd2KTsKKyAgICB9Cit9CisKK3ZvaWQgc2tpbl93aW5zeXNfc2V0dXBfbGlicmFyeV9wYXRocygpIHsKKyAgICAvLyBNYWtlIFF0IGxvb2sgYXQgdGhlIGxpYnJhcmllcyB3aXRoaW4gdGhpcyBpbnN0YWxsYXRpb24KKyAgICAvLyBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgd2UgYWRkZWQgdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHRvIHRoZSBlbnZpcm9ubWVudAorICAgIC8vIHdlIGhhdmUgdG8gYWRkIGl0IGhlcmUgYXMgd2VsbCB0byBzdXBwb3J0IGV4dGVuZGVkIHVuaWNvZGUgY2hhcmFjdGVycworICAgIC8vIGluIHRoZSBsaWJyYXJ5IHBhdGguIFdpdGhvdXQgYWRkaW5nIHRoZSBwbHVnaW4gcGF0aCBoZXJlIHRoYXQgd29uJ3Qgd29yay4KKyAgICAvLyBXaGF0J3MgZXZlbiBtb3JlIGludGVyZXN0aW5nIGlzIHRoYXQgYWRkaW5nIHRoZSBwbHVnaW4gcGF0aCBoZXJlIGlzIG5vdAorICAgIC8vIGVub3VnaCBpbiBpdHNlbGYuIEl0IGFsc28gaGFzIHRvIGJlIHNldCB0aHJvdWdoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgIC8vIG9yIGV4dGVuZGVkIHVuaWNvZGUgY2hhcmFjdGVycyB3b24ndCB3b3JrCisgICAgc3RkOjpzdHJpbmcgcXRMaWJQYXRoID0gYW5kcm9pZFF0R2V0TGlicmFyeURpcigpOworICAgIHN0ZDo6c3RyaW5nIHF0UGx1Z2luc1BhdGggPSBhbmRyb2lkUXRHZXRQbHVnaW5zRGlyKCk7CisgICAgUVN0cmluZ0xpc3QgcGF0aExpc3Q7CisgICAgcGF0aExpc3QuYXBwZW5kKFFTdHJpbmc6OmZyb21VdGY4KHF0TGliUGF0aC5jX3N0cigpKSk7CisgICAgcGF0aExpc3QuYXBwZW5kKFFTdHJpbmc6OmZyb21VdGY4KHF0UGx1Z2luc1BhdGguY19zdHIoKSkpOworICAgIFFBcHBsaWNhdGlvbjo6c2V0TGlicmFyeVBhdGhzKHBhdGhMaXN0KTsKKyAgICBEKCJRdCBsaWIgcGF0aDogJXNcbiIsIHF0TGliUGF0aC5jX3N0cigpKTsKKyAgICBEKCJRdCBwbHVnaW4gcGF0aDogJXNcbiIsIHF0UGx1Z2luc1BhdGguY19zdHIoKSk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX2luaXRfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBHbG9iYWxTdGF0ZSogZyA9IGdsb2JhbFN0YXRlKCk7CisgICAgZy0+YXJnYyA9IGFyZ2M7CisgICAgZy0+YXJndiA9IGFyZ3Y7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX3N0YXJ0KGJvb2wgbm9fd2luZG93KSB7CisgICAgR2xvYmFsU3RhdGUqIGcgPSBnbG9iYWxTdGF0ZSgpOworI2lmZGVmIFFfT1NfTElOVVgKKyAgICAvLyBUaGlzIGNhbGwgaXMgcmVxdWlyZWQgdG8gbWFrZSBkb2luZyBPcGVuR0wgc3R1ZmYgb24gdGhlIFVJCisgICAgLy8gdGhyZWFkIHNhZmUuIFRoZSBBQV9YMTFJbml0VGhyZWFkcyBmbGFnIGluIFF0IGRvZXMgbm90IGFjdHVhbGx5CisgICAgLy8gd29yayAoY29uZmlybWVkIGJ5IGdyZXBwaW5nIHRocm91Z2ggUXQgY29kZSkuCisgICAgWEluaXRUaHJlYWRzKCk7CisjZW5kaWYKKyAgICBza2luX3dpbnN5c19zZXR1cF9saWJyYXJ5X3BhdGhzKCk7CisKKyAgICBpZiAobm9fd2luZG93KSB7CisgICAgICAgIGctPmFwcCA9IG5ldyBRQ29yZUFwcGxpY2F0aW9uKGctPmFyZ2MsIGctPmFyZ3YpOworICAgICAgICBFbXVsYXRvclF0Tm9XaW5kb3c6OmNyZWF0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGctPmFwcCA9IG5ldyBRQXBwbGljYXRpb24oZy0+YXJnYywgZy0+YXJndik7CisgICAgICAgIGctPmFwcC0+c2V0QXR0cmlidXRlKFF0OjpBQV9Vc2VIaWdoRHBpUGl4bWFwcyk7CisgICAgICAgIGFuZHJvaWRRdERlZmF1bHRJbml0KCk7CisKKyAgICAgICAgRW11bGF0b3JRdFdpbmRvdzo6Y3JlYXRlKCk7CisjaWZkZWYgX19BUFBMRV9fCisgICAgICAgIC8vIE9uIE9TIFgsIFF0IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGFuIGFwcGxpY2F0aW9uIG1lbnUgd2l0aCBhICJRdWl0IgorICAgICAgICAvLyBpdGVtLiBGb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgYXV0by1nZW5lcmF0ZWQgInF1aXQiIGRvZXMgbm90IHdvcmssCisgICAgICAgIC8vIG9yIHdvcmtzIGludGVybWl0dGVudGx5LgorICAgICAgICAvLyBGb3IgdGhhdCByZWFzb24sIHdlIGV4cGxpY2l0bHkgY3JlYXRlIGEgIlF1aXQiIGFjdGlvbiBmb3IgUXQgdG8gdXNlCisgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIGF1dG8tZ2VuZXJhdGVkIG9uZSwgYW5kIHNldCBpdCB1cCB0byBjb3JyZWN0bHkgcXVpdAorICAgICAgICAvLyB0aGUgZW11bGF0b3IuCisgICAgICAgIC8vIE5vdGU6IHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgcXVpdE1lbnUsIHF1aXRBY3Rpb24gYW5kIG1haW5CYXIgd2lsbCByZW1haW4KKyAgICAgICAgLy8gZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHNvIHdlIGRvbid0IGJvdGhlciBjbGVhbmluZworICAgICAgICAvLyB0aGVtIHVwLgorICAgICAgICBRTWVudSogcXVpdE1lbnUgPSBuZXcgUU1lbnUobnVsbHB0cik7CisgICAgICAgIFFBY3Rpb24qIHF1aXRBY3Rpb24gPSBuZXcgUUFjdGlvbihnLT5hcHAtPnRyKCJRdWl0IEVtdWxhdG9yIiksIHF1aXRNZW51KTsKKyAgICAgICAgUU1lbnVCYXIqIG1haW5CYXIgPSBuZXcgUU1lbnVCYXIobnVsbHB0cik7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIG5ldmVyIHRyeSB0byBjYWxsIGludG8gYSBkYW5nbGluZyBwb2ludGVyLCBhbmQgYWxzbworICAgICAgICAvLyB0aGF0IHdlIGRvbid0IGhvbGQgaXQgYWxpdmUganVzdCBiZWNhdXNlIG9mIGEgc2lnbmFsIGNvbm5lY3Rpb24KKyAgICAgICAgY29uc3QgYXV0byB3aW5QdHIgPSBFbXVsYXRvclF0V2luZG93OjpnZXRJbnN0YW5jZVB0cigpOworICAgICAgICBjb25zdCBhdXRvIHdpbldlYWtQdHIgPSBzdGQ6OndlYWtfcHRyPEVtdWxhdG9yUXRXaW5kb3c+KHdpblB0cik7CisgICAgICAgIFFPYmplY3Q6OmNvbm5lY3QocXVpdEFjdGlvbiwgJlFBY3Rpb246OnRyaWdnZXJlZCwKKyAgICAgICAgICAgIFt3aW5XZWFrUHRyXSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gd2luID0gd2luV2Vha1B0ci5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd2luLT5yZXF1ZXN0Q2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIHF1aXRNZW51LT5hZGRBY3Rpb24ocXVpdEFjdGlvbik7CisgICAgICAgIG1haW5CYXItPmFkZE1lbnUocXVpdE1lbnUpOworICAgICAgICBxdF9tYWNfc2V0X2RvY2tfbWVudShxdWl0TWVudSk7CisjZW5kaWYKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX3J1bl91aV91cGRhdGUoU2tpbkdlbmVyaWNGdW5jdGlvbiBmLCB2b2lkKiBkYXRhKSB7CisgICAgRChfX0ZVTkNUSU9OX18pOworICAgIFFTZW1hcGhvcmUgc2VtYXBob3JlOworICAgIEVtdWxhdG9yUXRXaW5kb3cqIGNvbnN0IHdpbmRvdyA9IEVtdWxhdG9yUXRXaW5kb3c6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKHdpbmRvdyA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBDb3VsZCBub3QgZ2V0IHdpbmRvdyBoYW5kbGUiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdpbmRvdy0+cnVuT25VaVRocmVhZCgmZiwgZGF0YSwgJnNlbWFwaG9yZSk7CisgICAgc2VtYXBob3JlLmFjcXVpcmUoKTsKK30KKworZXh0ZXJuIHZvaWQgc2tpbl93aW5zeXNfZXJyb3JfZGlhbG9nKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGNvbnN0IGNoYXIqIHRpdGxlKSB7CisgICAgLy8gTGFtYmRhcyBjYW4gb25seSBiZSBjb252ZXJ0ZWQgdG8gZnVuY3Rpb24gcG9pbnRlcnMgaWYgdGhleSBkb24ndCBjYXB0dXJlCisgICAgLy8gU28gaW5zdGVhZCB3ZSB1c2UgdGhlIHZvaWQgcGFyYW1ldGVyIHRvIHBhc3Mgb3VyIHBhcmFtZXRlcnMgaW4gYSBzdHJ1Y3QKKyAgICBzdHJ1Y3QgUGFyYW1zIHsKKyAgICAgICAgY29uc3QgY2hhciogTWVzc2FnZTsKKyAgICAgICAgY29uc3QgY2hhciogVGl0bGU7CisgICAgfSBwYXJhbXMgPSB7bWVzc2FnZSwgdGl0bGV9OworCisgICAgLy8gVGhlbiBjcmVhdGUgYSBub24tY2FwdHVyaW5nIGxhbWJkYSB0aGF0IHRha2VzIHRob3NlIHBhcmFtZXRlcnMsIHVucGFja3MKKyAgICAvLyB0aGVtLCBhbmQgc2hvd3MgdGhlIGVycm9yIGRpYWxvZworICAgIGF1dG8gc2hvd0RpYWxvZyA9IFtdKHZvaWQqIGRhdGEpIHsKKyAgICAgICAgYXV0byBwYXJhbXMgPSBzdGF0aWNfY2FzdDxQYXJhbXMqPihkYXRhKTsKKyAgICAgICAgc2hvd0Vycm9yRGlhbG9nKHBhcmFtcy0+TWVzc2FnZSwgcGFyYW1zLT5UaXRsZSk7CisgICAgfTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBzaG93IHRoZSBkaWFsb2cgb24gdGhlIFVJIHRocmVhZCBvciBpdCB3aWxsIGNyYXNoLiBUaGlzIGlzCisgICAgLy8gYSBibG9ja2luZyBjYWxsIHNvIHJlZmVyZW5jaW5nIHBhcmFtcyBhbmQgaXRzIGNvbnRlbnRzIGZyb20gYW5vdGhlcgorICAgIC8vIHRocmVhZCBpcyBzYWZlLgorICAgIHNraW5fd2luc3lzX3J1bl91aV91cGRhdGUoc2hvd0RpYWxvZywgJnBhcmFtcyk7Cit9CisKKyNpZmRlZiBfV0lOMzIKK2V4dGVybiAiQyIgaW50IHF0X21haW4oaW50LCBjaGFyKiopOworCitpbnQgcU1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgLy8gVGhlIGFyZ3VtZW50cyBjb21pbmcgaW4gaGVyZSBhcmUgZW5jb2RlZCBpbiB3aGF0ZXZlciBsb2NhbCBjb2RlIHBhZ2UKKyAgICAvLyBXaW5kb3dzIGlzIGNvbmZpZ3VyZWQgd2l0aCBidXQgd2UgbmVlZCB0aGVtIHRvIGJlIFVURi04IGVuY29kZWQuIFNvIHdlCisgICAgLy8gdXNlIEdldENvbW1hbmRMaW5lVyBhbmQgQ29tbWFuZExpbmVUb0FyZ3ZXIHRvIGdldCBhIFVURi0xNiBlbmNvZGVkIGFyZ3YKKyAgICAvLyB3aGljaCB3ZSB0aGVuIGNvbnZlcnQgdG8gVVRGLTguCisgICAgLy8KKyAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIFF0IGRvY3VtZW50YXRpb24gUXQgaXRzZWxmIGRvZXNuJ3QgcmVhbGx5IGNhcmUgYWJvdXQKKyAgICAvLyB0aGVzZSBhcyBpdCBhbHNvIHVzZXMgR2V0Q29tbWFuZExpbmVXIG9uIFdpbmRvd3Mgc28gdGhpcyBzaG91bGRuJ3QgY2F1c2UKKyAgICAvLyBwcm9ibGVtcyBmb3IgUXQuIEJ1dCB0aGUgZW11bGF0b3IgdXNlcyBhcmd2WzBdIHRvIGRldGVybWluZSB0aGUgcGF0aCBvZgorICAgIC8vIHRoZSBlbXVsYXRvciBleGVjdXRhYmxlIHNvIHdlIG5lZWQgdGhhdCB0byBiZSBlbmNvZGVkIGNvcnJlY3RseS4KKyAgICBpbnQgbnVtQXJncyA9IDA7CisgICAgY29uc3QgYXV0byB3aWRlQXJndiA9IGFuZHJvaWQ6OmJhc2U6Om1ha2VDdXN0b21TY29wZWRQdHIoCisgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZVRvQXJndlcoR2V0Q29tbWFuZExpbmVXKCksICZudW1BcmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtdKHdjaGFyX3QqKiBwdHIpIHsgTG9jYWxGcmVlKHB0cik7IH0pOworICAgIGlmICghd2lkZUFyZ3YpIHsKKyAgICAgICAgLy8gSWYgdGhpcyBmYWlscyB3ZSBjYW4gYXQgbGVhc3QgZ2l2ZSBpdCBhIHRyeSB3aXRoIHRoZSBsb2NhbCBjb2RlIHBhZ2UKKyAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGVyZSBhcmUgb25seSBBTlNJIGNoYXJhY3RlcnMgaW4gdGhlIGFyZ3VtZW50cyB0aGlzIHdvcmtzCisgICAgICAgIHJldHVybiBxdF9tYWluKGFyZ2MsIGFyZ3YpOworICAgIH0KKworICAgIC8vIFN0b3JlIGNvbnZlcnRlZCBzdHJpbmdzIGFuZCBwb2ludGVycyB0byB0aG9zZSBzdHJpbmdzLCB0aGUgcG9pbnRlcnMgYXJlCisgICAgLy8gd2hhdCB3aWxsIGJlY29tZSB0aGUgYXJndiBmb3IgcXRfbWFpbi4KKyAgICAvLyBBbHNvIHJlc2VydmUgYSBzbG90IGZvciBhbiBhcnJheSBudWxsLXRlcm1pbmF0b3IgYXMgUUVNVSBjb21tYW5kIGxpbmUKKyAgICAvLyBwYXJzaW5nIGNvZGUgcmVsaWVzIG9uIGl0IChhbmQgaXQncyBhIHBhcnQgb2YgQyBTdGFuZGFyZCwgYWN0dWFsbHkpLgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmd1bWVudHMobnVtQXJncyk7CisgICAgc3RkOjp2ZWN0b3I8Y2hhcio+IGFyZ3VtZW50UG9pbnRlcnMobnVtQXJncyArIDEpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyArK2kpIHsKKyAgICAgICAgYXJndW1lbnRzW2ldID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KHdpZGVBcmd2LmdldCgpW2ldKTsKKyAgICAgICAgYXJndW1lbnRQb2ludGVyc1tpXSA9ICZhcmd1bWVudHNbaV0uZnJvbnQoKTsKKyAgICB9CisgICAgYXJndW1lbnRQb2ludGVycy5iYWNrKCkgPSBudWxscHRyOworCisgICAgcmV0dXJuIHF0X21haW4obnVtQXJncywgYXJndW1lbnRQb2ludGVycy5kYXRhKCkpOworfQorI2VuZGlmICAvLyBfV0lOMzIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbnN5cy1xdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2NmYxNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3F0L3dpbnN5cy1xdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorCisvLyBTYXZlIHRoZSBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiBmb3IgYWZ0ZXIgdGhlIGFwcCBleGl0LgorLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgYWJvdXRUb1F1aXQoKSBzaWduYWwgaGFuZGxlIGZvciB0aGUKKy8vIGFwcGxpY2F0aW9uIHdpbmRvdy4KK2V4dGVybiB2b2lkIHNraW5fd2luc3lzX3NhdmVfd2luZG93X3BvcygpOworCisvLyBSZXR1cm5zIGEgc2hhcmVkIHBvaW50ZXIgdG8gRW11bGF0b3JRdFdpbmRvdyBpbnN0YW5jZQorLy8gVXNlZCBmb3IgcWVtdTEgd29ya2Fyb3VuZCBmb3IgdW5yZXNvbHZlZCBjcmFzaDogTlNXaW5kb3cgcmVsZWFzZSBvbiBPU1gKKy8vIENhbiByZW1vdmUgYWZ0ZXIgYi5hbmRyb2lkLmNvbS8xOTgyNTYgaXMgcmVzb2x2ZWQuCitleHRlcm4gc3RkOjpzaGFyZWRfcHRyPHZvaWQ+IHNraW5fd2luc3lzX2dldF9zaGFyZWRfcHRyKCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZWN0LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4MTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3JlY3QuYwpAQCAtMCwwICsxLDIyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZWN0LmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgIFNLSU5fUE9TX0lOSVRJQUxJWkVSICAgeyAwLCAwIH0KKworZXh0ZXJuIFNraW5Sb3RhdGlvbiBza2luX3JvdGF0aW9uX3JvdGF0ZShTa2luUm90YXRpb24gcm90YXRpb24sIFNraW5Sb3RhdGlvbiBieSkgeworICAgIHJldHVybiAocm90YXRpb24gKyBieSkgJSAoU0tJTl9ST1RBVElPTl8yNzAgKyAxKTsKK30KKwordm9pZCBza2luX3Bvc19yb3RhdGUoU2tpblBvcyogZHN0LCBjb25zdCBTa2luUG9zKiBzcmMsIFNraW5Sb3RhdGlvbiByb3RhdGlvbikgeworICAgIGludCAgeCA9IHNyYy0+eDsKKyAgICBpbnQgIHkgPSBzcmMtPnk7CisKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzA6CisgICAgICAgIGRzdC0+eCA9IHg7CisgICAgICAgIGRzdC0+eSA9IHk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzkwOgorICAgICAgICBkc3QtPnggPSAgeTsKKyAgICAgICAgZHN0LT55ID0gLXg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgZHN0LT54ID0gLXg7CisgICAgICAgIGRzdC0+eSA9IC15OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU0tJTl9ST1RBVElPTl8yNzA6CisgICAgICAgIGRzdC0+eCA9IC15OworICAgICAgICBkc3QtPnkgPSAgeDsKKyAgICB9Cit9CisKKworI2RlZmluZSAgU0tJTl9TSVpFX0lOSVRJQUxJWkVSICB7IDAsIDAgfQorCitib29sIHNraW5fc2l6ZV9jb250YWlucyhjb25zdCBTa2luU2l6ZSogc2l6ZSwgaW50IHgsIGludCB5KSB7CisgICAgcmV0dXJuICggKHVuc2lnbmVkKSB4IDwgKHVuc2lnbmVkKSBzaXplLT53ICYmCisgICAgICAgICAgICAgKHVuc2lnbmVkKSB5IDwgKHVuc2lnbmVkKSBzaXplLT5oICk7Cit9CisKK3ZvaWQgc2tpbl9zaXplX3JvdGF0ZShTa2luU2l6ZSogZHN0LCBjb25zdCBTa2luU2l6ZSogc3JjLCBTa2luUm90YXRpb24gcm90KSB7CisgICAgaW50ICB3ID0gc3JjLT53OworICAgIGludCAgaCA9IHNyYy0+aDsKKworICAgIGlmICgocm90ICYgMSkgIT0gMCkgeworICAgICAgICBkc3QtPncgPSBoOworICAgICAgICBkc3QtPmggPSB3OworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdC0+dyA9IHc7CisgICAgICAgIGRzdC0+aCA9IGg7CisgICAgfQorfQorCisvKiogU0tJTiBSRUNUQU5HTEVTCisgKiovCisjZGVmaW5lICBTS0lOX1JFQ1RfSU5JVElBTElaRVIgIHsgU0tJTl9QT1NfSU5JVElBTElaRVIsIFNLSU5fU0laRV9JTklUSUFMSVpFUiB9CisKK3ZvaWQgc2tpbl9yZWN0X2luaXQoU2tpblJlY3QqIHIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKSB7CisgICAgaWYgKHcgPCAwIHx8IGggPCAwKSB7CisgICAgICAgIHggPSB5ID0gdyA9IGggPSAwOworICAgIH0KKyAgICByLT5wb3MueCAgPSB4OworICAgIHItPnBvcy55ICA9IHk7CisgICAgci0+c2l6ZS53ID0gdzsKKyAgICByLT5zaXplLmggPSBoOworfQorCisKK3ZvaWQgc2tpbl9yZWN0X3RyYW5zbGF0ZShTa2luUmVjdCogciwgaW50IGR4LCBpbnQgZHkpIHsKKyAgICByLT5wb3MueCArPSBkeDsKKyAgICByLT5wb3MueSArPSBkeTsKK30KKworCit2b2lkIHNraW5fcmVjdF9yb3RhdGUoU2tpblJlY3QqIGRzdCwgY29uc3QgU2tpblJlY3QqIHNyYywgU2tpblJvdGF0aW9uIHJvdCkgeworICAgIGludCAgeCwgeSwgdywgaDsKKyAgICBzd2l0Y2ggKHJvdCAmIDMpIHsKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzkwOgorICAgICAgICAgICAgeCA9IHNyYy0+cG9zLng7CisgICAgICAgICAgICB5ID0gc3JjLT5wb3MueTsKKyAgICAgICAgICAgIHcgPSBzcmMtPnNpemUudzsKKyAgICAgICAgICAgIGggPSBzcmMtPnNpemUuaDsKKyAgICAgICAgICAgIGRzdC0+cG9zLnggID0gLSh5ICsgaCk7CisgICAgICAgICAgICBkc3QtPnBvcy55ICA9IHg7CisgICAgICAgICAgICBkc3QtPnNpemUudyA9IGg7CisgICAgICAgICAgICBkc3QtPnNpemUuaCA9IHc7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNLSU5fUk9UQVRJT05fMTgwOgorICAgICAgICAgICAgZHN0LT5wb3MueCA9IC0oc3JjLT5wb3MueCArIHNyYy0+c2l6ZS53KTsKKyAgICAgICAgICAgIGRzdC0+cG9zLnkgPSAtKHNyYy0+cG9zLnkgKyBzcmMtPnNpemUuaCk7CisgICAgICAgICAgICBkc3QtPnNpemUgID0gc3JjLT5zaXplOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIHggPSBzcmMtPnBvcy54OworICAgICAgICAgICAgeSA9IHNyYy0+cG9zLnk7CisgICAgICAgICAgICB3ID0gc3JjLT5zaXplLnc7CisgICAgICAgICAgICBoID0gc3JjLT5zaXplLmg7CisgICAgICAgICAgICBkc3QtPnBvcy54ICA9IHk7CisgICAgICAgICAgICBkc3QtPnBvcy55ICA9IC0oeCArIHcpOworICAgICAgICAgICAgZHN0LT5zaXplLncgPSBoOworICAgICAgICAgICAgZHN0LT5zaXplLmggPSB3OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICB9Cit9CisKK2Jvb2wgc2tpbl9yZWN0X2NvbnRhaW5zKGNvbnN0IFNraW5SZWN0KiByLCBpbnQgeCwgaW50IHkpIHsKKyAgICByZXR1cm4gKCAodW5zaWduZWQpKHggLSByLT5wb3MueCkgPCAodW5zaWduZWQpci0+c2l6ZS53ICYmCisgICAgICAgICAgICAgKHVuc2lnbmVkKSh5IC0gci0+cG9zLnkpIDwgKHVuc2lnbmVkKXItPnNpemUuaCApOworfQorCitTa2luT3ZlcmxhcCBza2luX3JlY3RfY29udGFpbnNfcmVjdChjb25zdCBTa2luUmVjdCogcjEsIGNvbnN0IFNraW5SZWN0KiByMikgeworICAgIFNraW5Cb3ggYSwgYjsKKworICAgIHNraW5fYm94X2Zyb21fcmVjdCggJmEsIHIxICk7CisgICAgc2tpbl9ib3hfZnJvbV9yZWN0KCAmYiwgcjIgKTsKKworICAgIGlmIChhLngyIDw9IGIueDEgfHwgYi54MiA8PSBhLngxIHx8IGEueTIgPD0gYi55MSB8fCBiLnkyIDw9IGEueTEpIHsKKyAgICAgICAgcmV0dXJuIFNLSU5fT1VUU0lERTsKKyAgICB9CisKKyAgICBpZiAoYi54MSA+PSBhLngxICYmIGIueDIgPD0gYS54MiAmJiBiLnkxID49IGEueTEgJiYgYi55MiA8PSBhLnkyKSB7CisgICAgICAgIHJldHVybiBTS0lOX0lOU0lERTsKKyAgICB9CisKKyAgICByZXR1cm4gU0tJTl9PVkVSTEFQOworfQorCisKK2Jvb2wgc2tpbl9yZWN0X2ludGVyc2VjdChTa2luUmVjdCogcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5SZWN0KiByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luUmVjdCogcjIpIHsKKyAgICBTa2luQm94ICBhLCBiLCByOworCisgICAgc2tpbl9ib3hfZnJvbV9yZWN0KCAmYSwgcjEgKTsKKyAgICBza2luX2JveF9mcm9tX3JlY3QoICZiLCByMiApOworCisgICAgaWYgKGEueDIgPD0gYi54MSB8fCBiLngyIDw9IGEueDEgfHwgYS55MiA8PSBiLnkxIHx8IGIueTIgPD0gYS55MSkgeworICAgICAgICByZXN1bHQtPnBvcy54ID0gcmVzdWx0LT5wb3MueSA9IHJlc3VsdC0+c2l6ZS53ID0gcmVzdWx0LT5zaXplLmggPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByLngxID0gKGEueDEgPiBiLngxKSA/IGEueDEgOiBiLngxOworICAgIHIueDIgPSAoYS54MiA8IGIueDIpID8gYS54MiA6IGIueDI7CisgICAgci55MSA9IChhLnkxID4gYi55MSkgPyBhLnkxIDogYi55MTsKKyAgICByLnkyID0gKGEueTIgPCBiLnkyKSA/IGEueTIgOiBiLnkyOworCisgICAgc2tpbl9ib3hfdG9fcmVjdCggJnIsIHJlc3VsdCApOworICAgIHJldHVybiAxOworfQorCitib29sIHNraW5fcmVjdF9lcXVhbHMoY29uc3QgU2tpblJlY3QqIHIxLCBjb25zdCBTa2luUmVjdCogcjIpIHsKKyAgICByZXR1cm4gKHIxLT5wb3MueCAgPT0gcjItPnBvcy54ICAmJiByMS0+cG9zLnkgID09IHIyLT5wb3MueSAmJgorICAgICAgICAgICAgcjEtPnNpemUudyA9PSByMi0+c2l6ZS53ICYmIHIxLT5zaXplLmggPT0gcjItPnNpemUuaCk7Cit9CisKKy8qKiBTS0lOIEJPWEVTCisgKiovCit2b2lkIHNraW5fYm94X2luaXQoU2tpbkJveCogYm94LCBpbnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIpIHsKKyAgICBib3gtPngxID0geDE7CisgICAgYm94LT55MSA9IHkxOworICAgIGJveC0+eDIgPSB4MjsKKyAgICBib3gtPnkyID0geTI7Cit9CisKK3ZvaWQgc2tpbl9ib3hfbWlubWF4X2luaXQoU2tpbkJveCogYm94KSB7CisgICAgYm94LT54MSA9IGJveC0+eTEgPSBJTlRfTUFYOworICAgIGJveC0+eDIgPSBib3gtPnkyID0gSU5UX01JTjsKK30KKwordm9pZCBza2luX2JveF9taW5tYXhfdXBkYXRlKFNraW5Cb3gqIGEsIGNvbnN0IFNraW5SZWN0KiByKSB7CisgICAgU2tpbkJveCAgYlsxXTsKKworICAgIHNraW5fYm94X2Zyb21fcmVjdChiLCByKTsKKworICAgIGlmIChiLT54MSA8IGEtPngxKSBhLT54MSA9IGItPngxOworICAgIGlmIChiLT55MSA8IGEtPnkxKSBhLT55MSA9IGItPnkxOworICAgIGlmIChiLT54MiA+IGEtPngyKSBhLT54MiA9IGItPngyOworICAgIGlmIChiLT55MiA+IGEtPnkyKSBhLT55MiA9IGItPnkyOworfQorCitpbnQgc2tpbl9ib3hfbWlubWF4X3RvX3JlY3QoY29uc3QgU2tpbkJveCogYm94LCBTa2luUmVjdCogcikgeworICAgIGlmIChib3gtPngxID4gYm94LT54MikgeworICAgICAgICByLT5wb3MueCA9IHItPnBvcy55ID0gci0+c2l6ZS53ID0gci0+c2l6ZS5oID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNraW5fYm94X3RvX3JlY3QoYm94LCByKTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBza2luX2JveF9mcm9tX3JlY3QoU2tpbkJveCogIGJveCwgY29uc3QgU2tpblJlY3QqIHIpIHsKKyAgICBib3gtPngxID0gci0+cG9zLng7CisgICAgYm94LT55MSA9IHItPnBvcy55OworICAgIGJveC0+eDIgPSByLT5zaXplLncgKyBib3gtPngxOworICAgIGJveC0+eTIgPSByLT5zaXplLmggKyBib3gtPnkxOworfQorCit2b2lkIHNraW5fYm94X3RvX3JlY3QoY29uc3QgU2tpbkJveCogYm94LCBTa2luUmVjdCogcikgeworICAgIHItPnBvcy54ICA9IGJveC0+eDE7CisgICAgci0+cG9zLnkgID0gYm94LT55MTsKKyAgICByLT5zaXplLncgPSBib3gtPngyIC0gYm94LT54MTsKKyAgICByLT5zaXplLmggPSBib3gtPnkyIC0gYm94LT55MTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVjdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOTkzOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZWN0LmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qKiAgUmVjdGFuZ2xlcworICoqLworCisvLyBMaXN0IG9mIHZhbHVlcyB1c2VkIHRvIGlkZW50aWZ5IGEgY2xvY2t3aXNlIDkwLWRlZ3JlZSByb3RhdGlvbi4KK3R5cGVkZWYgZW51bSB7CisgICAgU0tJTl9ST1RBVElPTl8wLAorICAgIFNLSU5fUk9UQVRJT05fOTAsCisgICAgU0tJTl9ST1RBVElPTl8xODAsCisgICAgU0tJTl9ST1RBVElPTl8yNzAKK30gU2tpblJvdGF0aW9uOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgcG9zaXRpb24gaW4gcGl4ZWxzIG9uIHRoZSBzY3JlZW4uCisvLyB8eHwgaXMgdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZS4KKy8vIHx5fCBpcyB0aGUgdmVydGljYWwgY29vcmRpbmF0ZS4KKy8vIEJ5IGNvbnZlbnRpb24sICgwLDApIGlzIHRoZSB0b3AtbGVmdCBwaXhlbC4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgIHgsIHk7Cit9IFNraW5Qb3M7CisKKy8vIFJvdGF0ZXMgdGhlIGdpdmVuIHJvdGF0aW9uIGJ5IHRoZSBnaXZlbiBhbW91bnQsIGkuZS4KKy8vIHNraW5fcm90YXRpb25fcm90YXRlKFNLSU5fUk9UQVRJT05fOTAsIFNLSU5fUk9UQVRJT05fMTgwKQorLy8gd2lsbCByZXR1cm4gU0tJTl9ST1RBVElPTl8yNzAKK2V4dGVybiBTa2luUm90YXRpb24gc2tpbl9yb3RhdGlvbl9yb3RhdGUoU2tpblJvdGF0aW9uIHJvdGF0aW9uLCBTa2luUm90YXRpb24gYnkpOworCisvLyBSb3RhdGUgaW5wdXQgcG9zaXRpb24gfHNyY3wgYnkgcm90YXRpb24gfHJvdHwsIHdyaXRpbmcgdGhlIHJlc3VsdCBpbnRvCisvLyBwb3NpdGlvbiB8KmRzdHwuIE9uZSBjYW4gdXNlIHRoZSBzYW1lIGFkZHJlc3MgZm9yIHxzcmN8IGFuZCB8ZHN0fC4KK2V4dGVybiB2b2lkIHNraW5fcG9zX3JvdGF0ZShTa2luUG9zKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpblBvcyogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5Sb3RhdGlvbiByb3QpOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGRpbWVzaW9ucyBpbiBwaXhlbHMuCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICB3LCBoOworfSBTa2luU2l6ZTsKKworZXh0ZXJuIHZvaWQgc2tpbl9zaXplX3JvdGF0ZShTa2luU2l6ZSogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luU2l6ZSogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gcm90KTsKKworZXh0ZXJuIGJvb2wgc2tpbl9zaXplX2NvbnRhaW5zKGNvbnN0IFNraW5TaXplKiBzaXplLCBpbnQgeCwgaW50IHkpOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgcmVjdGFuZ2xlIGluIHBpeGVscy4KKy8vIHxwb3N8IGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVjdGFuZ2xlJ3Mgb3JpZ2luICh0b3AtbGVmdCBjb3JuZXIpLgorLy8gfHNpemV8IGlzIHRoZSBkaW1lbnNpb24gaW4gaW50ZWdlciBwaXhlbHMgb2YgdGhlIHJlY3RhbmdsZS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTa2luUG9zICAgcG9zOworICAgIFNraW5TaXplICBzaXplOworfSBTa2luUmVjdDsKKworLy8gSW5pdGlhbGl6ZSBhIGdpdmVuIFNraW5SZWN0IHN0cnVjdHVyZSB3aXRoIGRpcmVjdCB2YWx1ZXMuCisvLyB8eHwgYW5kIHx5fCBhcmUgdGhlIHRvcC1sZWZ0IGNvcm5lciBjb29yZGluYXRlcywgYW5kIHx3fCBhbmQgfGh8IGFyZQorLy8gdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCByZXNwZWN0aXZlbHkuCitleHRlcm4gdm9pZCAgc2tpbl9yZWN0X2luaXQoU2tpblJlY3QqIHIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKKworLy8gVHJhbnNsYXRlIGEgZ2l2ZW4gU2tpblJlY3QuIFRoaXMgbW9kaWZpZXMgdGhlIHJlY3RhbmdsZSdzIHxwb3N8IGZpZWxkCisvLyBieSBhZGRpbmcgfGR4fCBhbmQgfGR5fCB0byBpdHMgY29vcmRpbmF0ZXMuCitleHRlcm4gdm9pZCAgc2tpbl9yZWN0X3RyYW5zbGF0ZShTa2luUmVjdCogciwgaW50IGR4LCBpbnQgZHkpOworCisvLyBSb3RhdGUgYSBnaXZlbiBTa2luUmVjdC4gVGhpcyBhcHBsaWVzIHRoZSBjbG9ja3dpc2UgfHJvdGF0aW9ufCB0byB0aGUKKy8vIGlucHV0IHxzcmN8IHJlY3RhbmdsZSwgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGludG8gfGRzdHwuCisvLyBOb3RlIHRoYXQgb25lIGNhbiB1c2UgdGhlIHNhbWUgYWRkcmVzcyBmb3IgfHNyY3wgYW5kIHxkc3R8LgorZXh0ZXJuIHZvaWQgIHNraW5fcmVjdF9yb3RhdGUoU2tpblJlY3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5SZWN0KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gIHJvdGF0aW9uKTsKKworLy8gUmV0dXJuIHRydWUgaWZmIGEgZ2l2ZW4gcmVjdGFuZ2xlIHxyfCBjb250YWlucyB0aGUgcGl4ZWwgYXQgY29vcmRpbmF0ZXMKKy8vIHx4fCBhbmQgfHl8LgorZXh0ZXJuIGJvb2wgc2tpbl9yZWN0X2NvbnRhaW5zKGNvbnN0IFNraW5SZWN0KiByLCBpbnQgeCwgaW50IHkpOworCisKKy8vIENvbXB1dGUgdGhlIGludGVyc2VjdGlvbiBvZiB0d28gcmVjdGFuZ2xlcyB8cjF8IGFuZCB8cjJ8LCBhbmQgc3RvcmUKKy8vIHRoZSByZXN1bHQgaW50byB8cmVzdWx0fC4KK2V4dGVybiBib29sICBza2luX3JlY3RfaW50ZXJzZWN0KFNraW5SZWN0KiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5SZWN0KiByMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpblJlY3QqIHIyKTsKKworLy8gUmV0dXJucyB0cnVlIGlmZiB0d28gcmVjdGFuZ2xlcyB8cjF8IGFuZCB8cjJ8IGFyZSBlcXVhbC4KK2V4dGVybiBib29sIHNraW5fcmVjdF9lcXVhbHMoY29uc3QgU2tpblJlY3QqIHIxLCBjb25zdCBTa2luUmVjdCogcjIpOworCisvLyBSZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyBpZi9ob3cgdHdvIHJlY3RhbmdsZSB8cjF8IGFuZCB8cjJ8IGludGVyc2VjdC4KKy8vIFNLSU5fT1VUU0lERSBtZWFucyB0aGUgdHdvIHJlY3RhbmdsZXMgZG8gbm90IGludGVyc2VjdCBhdCBhbGwuCisvLyBTS0lOX0lOU0lERSBpbmRpY2F0ZXMgdGhhdCB8cjF8IGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluc2lkZSB8cjJ8LgorLy8gU0tJTl9PVkVSTEFQIGluZGljYXRlcyB0aGF0IHRoZSB0d28gcmVjdGFuZ2xlcyBpbnRlcmVzZWN0LCBidXQgYWxzbworLy8gaGF2ZSBub24tY29tbW9uIHBpeGVscy4KK3R5cGVkZWYgZW51bSB7CisgICAgU0tJTl9PVVRTSURFID0gMCwKKyAgICBTS0lOX0lOU0lERSAgPSAxLAorICAgIFNLSU5fT1ZFUkxBUCA9IDIKK30gU2tpbk92ZXJsYXA7CisKK2V4dGVybiBTa2luT3ZlcmxhcCAgc2tpbl9yZWN0X2NvbnRhaW5zX3JlY3QoY29uc3QgU2tpblJlY3QqIHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luUmVjdCogcjIpOworCisvLyBBbHRlcm5hdGl2ZSBtb2RlbCBmb3IgYSByZWN0YW5nbGUsIHRoYXQgdXNlcyB0aGUgY29vcmRpbmF0ZXMgb2YKKy8vIG9wcG9zaXRlIGNvcm5lcnMgaW5zdGVhZC4gVGhpcyBpcyBtb3JlIGNvbnZlbmllbnQgdG8gY29tcHV0ZQorLy8gYWNjdW11bGF0ZWQgbWluL21heCBib3VuZHMuCisvLyB8eDF8IGFuZCB8eTF8IGFyZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lci4KKy8vIHx4MnwgYW5kIHx5MnwgYXJlIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lci4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgIHgxLCB5MTsKKyAgICBpbnQgIHgyLCB5MjsKK30gU2tpbkJveDsKKworLy8gSW5pdGlhbGl6ZSBhIFNraW5Cb3ggc3RydWN0dXJlIHxib3h8IHdpdGggY29vcmRpbmF0ZXMgfHgxfCwgfHkxfCwKKy8vIHx4MnwgYW5kIHx5MnwuCitleHRlcm4gdm9pZCBza2luX2JveF9pbml0KFNraW5Cb3gqIGJveCwgaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyKSA7CisKKy8vIEluaXRpYWxpemUgYSBTa2luQm94IHN0cnVjdHVyZSB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiBvZiBhY2N1bXVsYXRlZAorLy8gcmVjdGFuZ2xlIGJvdW5kcy4gVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBpbiBjb2RlIHRoYXQgbG9va3MgbGlrZToKKy8vCisvLyAgICBTa2luQm94IGJveDsKKy8vICAgIHNraW5fYm94X21pbm1heF9pbml0KCZib3gpOworLy8gICAgLi5mb3JlYWNoIHJlY3RhbmdsZSByIGRvCisvLyAgICAgICBza2luX2JveF9taW5tYXhfdXBkYXRlKCZib3gsICZyKTsKKy8vCisvLyAgICBTa2luUmVjdCBib3VuZHM7CisvLyAgICBza2luX2JveF9taW5tYXhfdG9fcmVjdCgmYm94LCAmYm91bmRzKTsKKy8vCisvLyBXaGljaCBjb21wdXRlcyBpbiB8Ym91bmRzfCB0aGUgZW5jbG9zaW5nIGJvdW5kcyBvZiBhbGwgcmVjdGFuZ2xlcworLy8gZnJvbSB0aGUgbG9vcC4KKy8vCitleHRlcm4gdm9pZCAgc2tpbl9ib3hfbWlubWF4X2luaXQoIFNraW5Cb3gqICBib3ggKTsKKworLy8gQWRkIGEgbmV3IHJlY3RhbmdsZSB0byB0aGUgYm91bmRzIG1pbm1heCBjb21wdXRhdGlvbi4KKy8vIHxib3h8IGlzIHRoZSBTa2luQm94IHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24sIGFuZCB8cmVjdHwKKy8vIGEgcmVjdGFuZ2xlLgorZXh0ZXJuIHZvaWQgIHNraW5fYm94X21pbm1heF91cGRhdGUoU2tpbkJveCogIGJveCwgY29uc3QgU2tpblJlY3QqIHJlY3QpOworCisvLyBFeHRyYWN0IHRoZSBib3VuZHMgb2YgYSBwcmV2aW91cyBtaW5tYXggY29tcHV0YXRpb24gYXMgYSByZWN0YW5nbGUuCisvLyB8Ym94fCBpcyB0aGUgU2tpbkJveCB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uLCBhbmQgfHJlY3R8IHdpbGwKKy8vIHJlY2VpdmUgdGhlIGZpbmFsIGJvdW5kcy4KK2V4dGVybiBpbnQgICBza2luX2JveF9taW5tYXhfdG9fcmVjdChjb25zdCBTa2luQm94KiBib3gsIFNraW5SZWN0KiByZWN0KTsKKworLy8gQ29udmVydCBhIHJlY3RhbmdsZSB8cmVjdHwgaW50byB0aGUgZXF1aXZhbGVudCBTa2luQm94IHxib3h8LgorZXh0ZXJuIHZvaWQgIHNraW5fYm94X2Zyb21fcmVjdChTa2luQm94KiBib3gsIGNvbnN0IFNraW5SZWN0KiByZWN0KTsKKworLy8gQ29udmVydCBhIFNraW5Cb3ggfGJveHwgaW50byB0aGUgZXF1aXZhbGVudCBTa2luUmVjdCB8cmVjdHwuCitleHRlcm4gdm9pZCAgc2tpbl9ib3hfdG9fcmVjdChjb25zdCBTa2luQm94KiBib3gsIFNraW5SZWN0KiByZWN0KTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZWN0X3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3JlY3RfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzM0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZWN0X3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVjdC5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBBUlJBWUxFTih4KSAgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKKworbmFtZXNwYWNlIGFuZHJvaWRfc2tpbiB7CisKK1RFU1QocmVjdCwgc2tpbl9wb3Nfcm90YXRlKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIFNraW5Qb3MgZXhwZWN0ZWQ7CisgICAgICAgIFNraW5Qb3MgcG9zOworICAgICAgICBTa2luUm90YXRpb24gcm90YXRpb247CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7IHsgMCwgMCB9LCB7IDAsIDAgfSwgU0tJTl9ST1RBVElPTl8wIH0sCisgICAgICAgIHsgeyAwLCAwIH0sIHsgMCwgMCB9LCBTS0lOX1JPVEFUSU9OXzkwIH0sCisgICAgICAgIHsgeyAwLCAwIH0sIHsgMCwgMCB9LCBTS0lOX1JPVEFUSU9OXzE4MCB9LAorICAgICAgICB7IHsgMCwgMCB9LCB7IDAsIDAgfSwgU0tJTl9ST1RBVElPTl8yNzAgfSwKKworICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMTAwLCAwIH0sIFNLSU5fUk9UQVRJT05fMCB9LAorICAgICAgICB7IHsgMCwgLTEwMCB9LCB7IDEwMCwgMCB9LCBTS0lOX1JPVEFUSU9OXzkwIH0sCisgICAgICAgIHsgeyAtMTAwLCAwIH0sIHsgMTAwLCAwIH0sIFNLSU5fUk9UQVRJT05fMTgwIH0sCisgICAgICAgIHsgeyAwLCAxMDAgfSwgeyAxMDAsIDAgfSwgU0tJTl9ST1RBVElPTl8yNzAgfSwKKworICAgICAgICB7IHsgMCwgMTAwIH0sIHsgMCwgMTAwIH0sIFNLSU5fUk9UQVRJT05fMCB9LAorICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMCwgMTAwIH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IDAsIC0xMDAgfSwgeyAwLCAxMDAgfSwgU0tJTl9ST1RBVElPTl8xODAgfSwKKyAgICAgICAgeyB7IC0xMDAsIDAgfSwgeyAwLCAxMDAgfSwgU0tJTl9ST1RBVElPTl8yNzAgfSwKKworICAgICAgICB7IHsgLTEwMCwgMCB9LCB7IC0xMDAsIDAgfSwgU0tJTl9ST1RBVElPTl8wIH0sCisgICAgICAgIHsgeyAwLCAxMDAgfSwgeyAtMTAwLCAwIH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IDEwMCwgMCB9LCB7IC0xMDAsIDAgfSwgU0tJTl9ST1RBVElPTl8xODAgfSwKKyAgICAgICAgeyB7IDAsIC0xMDAgfSwgeyAtMTAwLCAwIH0sIFNLSU5fUk9UQVRJT05fMjcwIH0sCisKKyAgICAgICAgeyB7IDAsIC0xMDAgfSwgeyAwLCAtMTAwIH0sIFNLSU5fUk9UQVRJT05fMCB9LAorICAgICAgICB7IHsgLTEwMCwgMCB9LCB7IDAsIC0xMDAgfSwgU0tJTl9ST1RBVElPTl85MCB9LAorICAgICAgICB7IHsgMCwgMTAwIH0sIHsgMCwgLTEwMCB9LCBTS0lOX1JPVEFUSU9OXzE4MCB9LAorICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMCwgLTEwMCB9LCBTS0lOX1JPVEFUSU9OXzI3MCB9LAorCisgICAgICAgIHsgeyAxMDAsIDIwMCB9LCB7IDEwMCwgMjAwIH0sIFNLSU5fUk9UQVRJT05fMCB9LAorICAgICAgICB7IHsgMjAwLCAtMTAwIH0sIHsgMTAwLCAyMDAgfSwgU0tJTl9ST1RBVElPTl85MCB9LAorICAgICAgICB7IHsgLTEwMCwgLTIwMCB9LCB7IDEwMCwgMjAwIH0sIFNLSU5fUk9UQVRJT05fMTgwIH0sCisgICAgICAgIHsgeyAtMjAwLCAxMDAgfSwgeyAxMDAsIDIwMCB9LCBTS0lOX1JPVEFUSU9OXzI3MCB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhTGVuID0gQVJSQVlMRU4oa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFMZW47ICsrbikgeworICAgICAgICBTa2luUG9zIHJlc3VsdCA9IGtEYXRhW25dLnBvczsKKyAgICAgICAgLy8gTm90ZTogdGhpcyBjaGVja3MgdGhhdCB0aGUgZnVuY3Rpb24gd29ya3Mgd2hlbiB8c3JjID09IGRzdHwuCisgICAgICAgIHNraW5fcG9zX3JvdGF0ZSgmcmVzdWx0LCAmcmVzdWx0LCBrRGF0YVtuXS5yb3RhdGlvbik7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZC54LCByZXN1bHQueCkgPDwgIiMiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZC55LCByZXN1bHQueSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKHJlY3QsIHNraW5fc2l6ZV9jb250YWlucykgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBTa2luU2l6ZSBzaXplOworICAgICAgICBpbnQgeDsKKyAgICAgICAgaW50IHk7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7IGZhbHNlLCB7IDAsIDAgfSwgMCwgMCB9LAorICAgICAgICB7IHRydWUsIHsgMSwgMSB9LCAwLCAwIH0sCisgICAgICAgIHsgZmFsc2UsIHsgMSwgMSB9LCAxLCAxIH0sCisgICAgICAgIHsgdHJ1ZSwgeyAxMCwgMjAgfSwgMCwgMCB9LAorICAgICAgICB7IGZhbHNlLCB7IDEwLCAyMCB9LCAxMCwgMCB9LAorICAgICAgICB7IGZhbHNlLCB7IDEwLCAyMCB9LCAwLCAyMCB9LAorICAgICAgICB7IGZhbHNlLCB7IDEwLCAyMCB9LCAxMCwgMjAgfSwKKyAgICAgICAgeyB0cnVlLCB7IDEwLCAyMCB9LCA5LCAxOSB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhTGVuID0gQVJSQVlMRU4oa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFMZW47ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBza2luX3NpemVfY29udGFpbnMoJmtEYXRhW25dLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFbbl0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS55KSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKHJlY3QsIHNraW5fc2l6ZV9yb3RhdGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgU2tpblNpemUgZXhwZWN0ZWQ7CisgICAgICAgIFNraW5TaXplIHNpemU7CisgICAgICAgIFNraW5Sb3RhdGlvbiByb3RhdGlvbjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgeyAwLCAwIH0sIHsgMCwgMCB9LCBTS0lOX1JPVEFUSU9OXzAgfSwKKyAgICAgICAgeyB7IDAsIDAgfSwgeyAwLCAwIH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IDAsIDAgfSwgeyAwLCAwIH0sIFNLSU5fUk9UQVRJT05fMTgwIH0sCisgICAgICAgIHsgeyAwLCAwIH0sIHsgMCwgMCB9LCBTS0lOX1JPVEFUSU9OXzI3MCB9LAorCisgICAgICAgIHsgeyAxMDAsIDAgfSwgeyAxMDAsIDAgfSwgU0tJTl9ST1RBVElPTl8wIH0sCisgICAgICAgIHsgeyAwLCAxMDAgfSwgeyAxMDAsIDAgfSwgU0tJTl9ST1RBVElPTl85MCB9LAorICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMTAwLCAwIH0sIFNLSU5fUk9UQVRJT05fMTgwIH0sCisgICAgICAgIHsgeyAwLCAxMDAgfSwgeyAxMDAsIDAgfSwgU0tJTl9ST1RBVElPTl8yNzAgfSwKKworICAgICAgICB7IHsgMCwgMTAwIH0sIHsgMCwgMTAwIH0sIFNLSU5fUk9UQVRJT05fMCB9LAorICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMCwgMTAwIH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IDAsIDEwMCB9LCB7IDAsIDEwMCB9LCBTS0lOX1JPVEFUSU9OXzE4MCB9LAorICAgICAgICB7IHsgMTAwLCAwIH0sIHsgMCwgMTAwIH0sIFNLSU5fUk9UQVRJT05fMjcwIH0sCisKKyAgICAgICAgeyB7IDEwMCwgMjAwIH0sIHsgMTAwLCAyMDAgfSwgU0tJTl9ST1RBVElPTl8wIH0sCisgICAgICAgIHsgeyAyMDAsIDEwMCB9LCB7IDEwMCwgMjAwIH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IDEwMCwgMjAwIH0sIHsgMTAwLCAyMDAgfSwgU0tJTl9ST1RBVElPTl8xODAgfSwKKyAgICAgICAgeyB7IDIwMCwgMTAwIH0sIHsgMTAwLCAyMDAgfSwgU0tJTl9ST1RBVElPTl8yNzAgfSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YUxlbiA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhTGVuOyArK24pIHsKKyAgICAgICAgU2tpblNpemUgcmVzdWx0ID0ga0RhdGFbbl0uc2l6ZTsKKyAgICAgICAgLy8gTm90ZTogdGhpcyBjaGVja3MgdGhhdCB0aGUgZnVuY3Rpb24gd29ya3Mgd2hlbiB8c3JjID09IGRzdHwuCisgICAgICAgIHNraW5fc2l6ZV9yb3RhdGUoJnJlc3VsdCwgJnJlc3VsdCwga0RhdGFbbl0ucm90YXRpb24pOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQudywgcmVzdWx0LncpIDw8ICIjIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQuaCwgcmVzdWx0LmgpIDw8ICIjIiA8PCBuOworICAgIH0KK30KKworVEVTVChyZWN0LCBza2luX3JlY3RfaW5pdCkgeworICAgIFNraW5SZWN0IHI7CisgICAgc2tpbl9yZWN0X2luaXQoJnIsIDEwLCAyMCwgMzAsIDQwKTsKKyAgICBFWFBFQ1RfRVEoMTAsIHIucG9zLngpOworICAgIEVYUEVDVF9FUSgyMCwgci5wb3MueSk7CisgICAgRVhQRUNUX0VRKDMwLCByLnNpemUudyk7CisgICAgRVhQRUNUX0VRKDQwLCByLnNpemUuaCk7CisKKyAgICBza2luX3JlY3RfaW5pdCgmciwgMTAsIDIwLCAtMzAsIDQwKTsKKyAgICBFWFBFQ1RfRVEoMCwgci5wb3MueCk7CisgICAgRVhQRUNUX0VRKDAsIHIucG9zLnkpOworICAgIEVYUEVDVF9FUSgwLCByLnNpemUudyk7CisgICAgRVhQRUNUX0VRKDAsIHIuc2l6ZS5oKTsKKworICAgIHNraW5fcmVjdF9pbml0KCZyLCAxMCwgMjAsIDMwLCAtNDApOworICAgIEVYUEVDVF9FUSgwLCByLnBvcy54KTsKKyAgICBFWFBFQ1RfRVEoMCwgci5wb3MueSk7CisgICAgRVhQRUNUX0VRKDAsIHIuc2l6ZS53KTsKKyAgICBFWFBFQ1RfRVEoMCwgci5zaXplLmgpOworCisgICAgc2tpbl9yZWN0X2luaXQoJnIsIDEwLCAyMCwgLTMwLCAtNDApOworICAgIEVYUEVDVF9FUSgwLCByLnBvcy54KTsKKyAgICBFWFBFQ1RfRVEoMCwgci5wb3MueSk7CisgICAgRVhQRUNUX0VRKDAsIHIuc2l6ZS53KTsKKyAgICBFWFBFQ1RfRVEoMCwgci5zaXplLmgpOworfQorCitURVNUKHJlY3QsIHNraW5fcmVjdF90cmFuc2xhdGUpIHsKKyAgICBTa2luUmVjdCByOworICAgIHNraW5fcmVjdF9pbml0KCZyLCAxMCwgMzAsIDUwLCA3MCk7CisgICAgc2tpbl9yZWN0X3RyYW5zbGF0ZSgmciwgKzUsIC01KTsKKyAgICBFWFBFQ1RfRVEoMTUsIHIucG9zLngpOworICAgIEVYUEVDVF9FUSgyNSwgci5wb3MueSk7CisgICAgRVhQRUNUX0VRKDUwLCByLnNpemUudyk7CisgICAgRVhQRUNUX0VRKDcwLCByLnNpemUuaCk7Cit9CisKK1RFU1QocmVjdCwgc2tpbl9yZWN0X3JvdGF0ZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBTa2luUmVjdCBleHBlY3RlZDsKKyAgICAgICAgU2tpblJlY3QgcmVjdDsKKyAgICAgICAgU2tpblJvdGF0aW9uIHJvdGF0aW9uOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCBTS0lOX1JPVEFUSU9OXzAgfSwKKyAgICAgICAgeyB7IHsgLTc1LCAxMCB9LCB7IDcwLCAzMCB9IH0sIHsgeyAxMCwgNSB9LCB7IDMwLCA3MCB9IH0sIFNLSU5fUk9UQVRJT05fOTAgfSwKKyAgICAgICAgeyB7IHsgLTQwLCAtNzUgfSwgeyAzMCwgNzAgfSB9LCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCBTS0lOX1JPVEFUSU9OXzE4MCB9LAorICAgICAgICB7IHsgeyA1LCAtNDAgfSwgeyA3MCwgMzAgfSB9LCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCBTS0lOX1JPVEFUSU9OXzI3MCB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhTGVuID0gQVJSQVlMRU4oa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFMZW47ICsrbikgeworICAgICAgICBTa2luUmVjdCByZXN1bHQgPSBrRGF0YVtuXS5yZWN0OworICAgICAgICBTa2luUmVjdCBleHBlY3RlZCA9IGtEYXRhW25dLmV4cGVjdGVkOworICAgICAgICBza2luX3JlY3Rfcm90YXRlKCZyZXN1bHQsICZyZXN1bHQsIGtEYXRhW25dLnJvdGF0aW9uKTsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLnBvcy54LCByZXN1bHQucG9zLngpIDw8ICIjIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQucG9zLnksIHJlc3VsdC5wb3MueSkgPDwgIiMiIDw8IG47CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZC5zaXplLncsIHJlc3VsdC5zaXplLncpIDw8ICIjIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQuc2l6ZS5oLCByZXN1bHQuc2l6ZS5oKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QocmVjdCwgc2tpbl9yZWN0X2NvbnRhaW5zKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGJvb2wgZXhwZWN0ZWQ7CisgICAgICAgIFNraW5SZWN0IHJlY3Q7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgeTsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgZmFsc2UsIHsgeyAwLCAwIH0sIHsgMCwgMCB9IH0sIDAsIDAgfSwKKyAgICAgICAgeyB0cnVlLCB7IHsgMCwgMCB9LCB7IDEsIDEgfSB9LCAwLCAwIH0sCisKKyAgICAgICAgeyBmYWxzZSwgeyB7IDEwLCA1IH0sIHsgMzAsIDcwIH0gfSwgOSwgNSB9LAorICAgICAgICB7IGZhbHNlLCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCAxMCwgNCB9LAorICAgICAgICB7IGZhbHNlLCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCA0MCwgNSB9LAorICAgICAgICB7IGZhbHNlLCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCAxMCwgNzUgfSwKKyAgICAgICAgeyBmYWxzZSwgeyB7IDEwLCA1IH0sIHsgMzAsIDcwIH0gfSwgNDAsIDc1IH0sCisKKyAgICAgICAgeyB0cnVlLCB7IHsgMTAsIDUgfSwgeyAzMCwgNzAgfSB9LCAxMCwgNSB9LAorICAgICAgICB7IHRydWUsIHsgeyAxMCwgNSB9LCB7IDMwLCA3MCB9IH0sIDM5LCA1IH0sCisgICAgICAgIHsgdHJ1ZSwgeyB7IDEwLCA1IH0sIHsgMzAsIDcwIH0gfSwgMTAsIDc0IH0sCisgICAgICAgIHsgdHJ1ZSwgeyB7IDEwLCA1IH0sIHsgMzAsIDcwIH0gfSwgMzksIDc0IH0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBBUlJBWUxFTihrRGF0YSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrRGF0YUxlbjsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5leHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgIHNraW5fcmVjdF9jb250YWlucygma0RhdGFbbl0ucmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtuXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEYXRhW25dLnkpKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QocmVjdCwgc2tpbl9yZWN0X2NvbnRhaW5zX3JlY3QpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgU2tpbk92ZXJsYXAgZXhwZWN0ZWQ7CisgICAgICAgIFNraW5SZWN0IHJlY3QxOworICAgICAgICBTa2luUmVjdCByZWN0MjsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgU0tJTl9PVVRTSURFLCB7IHsgMCwgMCB9LCB7IDAsIDAgfSB9LCB7IHsgMCwgMCB9LCB7IDAsIDAgfSB9IH0sCisgICAgICAgIHsgU0tJTl9PVVRTSURFLCB7IHsgMCwgMCB9LCB7IDEwLCAyMCB9IH0sIHsgeyAxMCwgMjAgfSwgeyA1LCA1IH0gfSB9LAorICAgICAgICB7IFNLSU5fSU5TSURFLCB7IHsgMCwgMCB9LCB7IDEwLCAyMCB9IH0sIHsgeyA1LCAzIH0sIHsgNSwgNSB9IH0gfSwKKyAgICAgICAgeyBTS0lOX09WRVJMQVAsIHsgeyAwLCAwIH0sIHsgMTAsIDIwIH0gfSwgeyB7IDUsIDMgfSwgeyAxNSwgNSB9IH0gfSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YUxlbiA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhTGVuOyArK24pIHsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgc2tpbl9yZWN0X2NvbnRhaW5zX3JlY3QoJmtEYXRhW25dLnJlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtEYXRhW25dLnJlY3QyKSkgPDwgIiMiIDw8IG47CisgICAgfQorfQorCitURVNUKHJlY3QsIHNraW5fcmVjdF9pbnRlcnNlY3QpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgYm9vbCBleHBlY3RlZDsKKyAgICAgICAgU2tpblJlY3QgcmVzdWx0OworICAgICAgICBTa2luUmVjdCByMTsKKyAgICAgICAgU2tpblJlY3QgcjI7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7IGZhbHNlLCB7eyAwLCAwfSx7IDAsIDB9fSwge3sgMCwgMH0sezEwLDIwfX0sIHt7MjAsIDB9LHsxMCwyMH19IH0sCisgICAgICAgIHsgdHJ1ZSwge3syMCwyMH0sezIwLDE1fX0sIHt7MTAsMjB9LHszMCwzMH19LCB7ezIwLDEwfSx7NTAsMjV9fSB9LAorICAgICAgICB7IHRydWUsIHt7MjAsNDB9LHsyMCwxMH19LCB7ezEwLDIwfSx7MzAsMzB9fSwge3syMCw0MH0sezUwLDI1fX0gfSwKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrRGF0YUxlbiA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhTGVuOyArK24pIHsKKyAgICAgICAgU2tpblJlY3QgcmVzdWx0ID0geyB7IDAsIDAgfSwgeyAwLCAwIH0gfTsKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgc2tpbl9yZWN0X2ludGVyc2VjdCgmcmVzdWx0LCAma0RhdGFbbl0ucjEsICZrRGF0YVtuXS5yMikpCisgICAgICAgICAgICAgICAgPDwgIiMiIDw8IG47CisgICAgICAgIGlmIChrRGF0YVtuXS5leHBlY3RlZCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLnJlc3VsdC5wb3MueCwgcmVzdWx0LnBvcy54KSA8PCAiIyIgPDwgbjsKKyAgICAgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXS5yZXN1bHQucG9zLnksIHJlc3VsdC5wb3MueSkgPDwgIiMiIDw8IG47CisgICAgICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0ucmVzdWx0LnNpemUudywgcmVzdWx0LnNpemUudykgPDwgIiMiIDw8IG47CisgICAgICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0ucmVzdWx0LnNpemUuaCwgcmVzdWx0LnNpemUuaCkgPDwgIiMiIDw8IG47CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QocmVjdCwgc2tpbl9yZWN0X2VxdWFscykgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBTa2luUmVjdCByMTsKKyAgICAgICAgU2tpblJlY3QgcjI7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7IGZhbHNlLCB7eyAwLCAwfSx7MTAsMjB9fSwge3syMCwgMH0sezEwLDIwfX0gfSwKKworICAgICAgICB7IHRydWUsIHt7MTAsMjB9LHszMCw0MH19LCB7ezEwLDIwfSx7MzAsNDB9fSB9LAorCisgICAgICAgIHsgZmFsc2UsIHt7MTAsMjB9LHszMCw0MH19LCB7ezEwLC0yMH0sezMwLDQwfX0gfSwKKyAgICAgICAgeyBmYWxzZSwge3sxMCwyMH0sezMwLDQwfX0sIHt7LTEwLDIwfSx7MzAsNDB9fSB9LAorICAgICAgICB7IGZhbHNlLCB7ezEwLDIwfSx7MzAsNDB9fSwge3stMTAsLTIwfSx7MzAsNDB9fSB9LAorICAgICAgICB7IGZhbHNlLCB7ezEwLDIwfSx7MzAsNDB9fSwge3stMTAsLTIwfSx7MzAsNDB9fSB9LAorCisgICAgICAgIHsgZmFsc2UsIHt7MTAsMjB9LHszMCw0MH19LCB7ezEwLDIwfSx7MzUsNDB9fSB9LAorICAgICAgICB7IGZhbHNlLCB7ezEwLDIwfSx7MzAsNDB9fSwge3sxMCwyMH0sezMwLDQ1fX0gfSwKKyAgICAgICAgeyBmYWxzZSwge3sxMCwyMH0sezMwLDQwfX0sIHt7MTAsMjB9LHszNSw0NX19IH0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFMZW4gPSBBUlJBWUxFTihrRGF0YSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrRGF0YUxlbjsgKytuKSB7CisgICAgICAgIGNvbnN0IFNraW5SZWN0KiByMSA9ICZrRGF0YVtuXS5yMTsKKyAgICAgICAgY29uc3QgU2tpblJlY3QqIHIyID0gJmtEYXRhW25dLnIyOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQsIHNraW5fcmVjdF9lcXVhbHMocjEsIHIyKSkKKyAgICAgICAgICAgICAgICA8PCAiIyIgPDwgbgorICAgICAgICAgICAgICAgIDw8ICIgcjEueD0iIDw8IHIxLT5wb3MueAorICAgICAgICAgICAgICAgIDw8ICIgcjEueT0iIDw8IHIxLT5wb3MueQorICAgICAgICAgICAgICAgIDw8ICIgcjEudz0iIDw8IHIxLT5zaXplLncKKyAgICAgICAgICAgICAgICA8PCAiIHIxLmg9IiA8PCByMS0+c2l6ZS5oCisgICAgICAgICAgICAgICAgPDwgIiByMi54PSIgPDwgcjItPnBvcy54CisgICAgICAgICAgICAgICAgPDwgIiByMi55PSIgPDwgcjItPnBvcy55CisgICAgICAgICAgICAgICAgPDwgIiByMi53PSIgPDwgcjItPnNpemUudworICAgICAgICAgICAgICAgIDw8ICIgcjIuaD0iIDw8IHIyLT5zaXplLmg7CisgICAgfQorfQorCitURVNUKHJlY3QsIHNraW5fYm94X2luaXQpIHsKKyAgICBTa2luQm94IGJveCA9IHsgMCwgMCwgMCwgMCB9OworICAgIHNraW5fYm94X2luaXQoJmJveCwgMTAsIDIwLCAzMCwgNDApOworICAgIEVYUEVDVF9FUSgxMCwgYm94LngxKTsKKyAgICBFWFBFQ1RfRVEoMjAsIGJveC55MSk7CisgICAgRVhQRUNUX0VRKDMwLCBib3gueDIpOworICAgIEVYUEVDVF9FUSg0MCwgYm94LnkyKTsKK30KKworVEVTVChyZWN0LCBza2luX2JveF9mcm9tX3JlY3QpIHsKKyAgICBTa2luQm94IGJveCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGNvbnN0IFNraW5SZWN0IHJlY3QgPSB7IHsgMTAsIDIwIH0sIHsgMzAsIDQwIH0gfTsKKyAgICBza2luX2JveF9mcm9tX3JlY3QoJmJveCwgJnJlY3QpOworICAgIEVYUEVDVF9FUSgxMCwgYm94LngxKTsKKyAgICBFWFBFQ1RfRVEoMjAsIGJveC55MSk7CisgICAgRVhQRUNUX0VRKDQwLCBib3gueDIpOworICAgIEVYUEVDVF9FUSg2MCwgYm94LnkyKTsKK30KKworVEVTVChyZWN0LCBza2luX2JveF90b19yZWN0KSB7CisgICAgY29uc3QgU2tpbkJveCBib3ggPSB7IDEwLCAyMCwgNDAsIDYwIH07CisgICAgU2tpblJlY3QgcmVjdDsKKyAgICBza2luX2JveF90b19yZWN0KCZib3gsICZyZWN0KTsKKyAgICBFWFBFQ1RfRVEoMTAsIHJlY3QucG9zLngpOworICAgIEVYUEVDVF9FUSgyMCwgcmVjdC5wb3MueSk7CisgICAgRVhQRUNUX0VRKDMwLCByZWN0LnNpemUudyk7CisgICAgRVhQRUNUX0VRKDQwLCByZWN0LnNpemUuaCk7Cit9CisKK1RFU1QocmVjdCwgc2tpbl9ib3hfbWlubWF4X2luaXQpIHsKKyAgICBTa2luQm94IGJveCA9IHsgMCwgMCwgMCwgMCB9OworICAgIHNraW5fYm94X21pbm1heF9pbml0KCZib3gpOworfQorCitURVNUKHJlY3QsIHNraW5fYm94X21pbm1heF90b19yZWN0KSB7CisgICAgY29uc3QgU2tpblJlY3QgcjEgPSB7ezEwLCAyMH0sezMwLDQwfX07CisgICAgY29uc3QgU2tpblJlY3QgcjIgPSB7ezEwMCwyNX0sezUwLDUwfX07CisgICAgU2tpbkJveCBib3g7CisgICAgc2tpbl9ib3hfbWlubWF4X2luaXQoJmJveCk7CisKKyAgICBza2luX2JveF9taW5tYXhfdXBkYXRlKCZib3gsICZyMSk7CisgICAgc2tpbl9ib3hfbWlubWF4X3VwZGF0ZSgmYm94LCAmcjIpOworCisgICAgU2tpblJlY3QgcmVjdDsKKyAgICBza2luX2JveF9taW5tYXhfdG9fcmVjdCgmYm94LCAmcmVjdCk7CisgICAgRVhQRUNUX0VRKDEwLHJlY3QucG9zLngpOworICAgIEVYUEVDVF9FUSgyMCxyZWN0LnBvcy55KTsKKyAgICBFWFBFQ1RfRVEoMTQwLHJlY3Quc2l6ZS53KTsKKyAgICBFWFBFQ1RfRVEoNTUscmVjdC5zaXplLmgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZF9za2luCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZXNvdXJjZS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY4MzNiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2UuYwpAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3Jlc291cmNlLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgbmFtZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgYmFzZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgc2l6ZTsKK30gRmlsZUVudHJ5OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciogX3Jlc291cmNlX2ZpbmQoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgIGNvbnN0IEZpbGVFbnRyeSogZW50cmllcywKKyAgICAgICAgc2l6ZV90KiBwc2l6ZSkgeworICAgIGNvbnN0IEZpbGVFbnRyeSogZSA9IGVudHJpZXM7CisgICAgZm9yICggOyBlLT5uYW1lICE9IE5VTEw7IGUrKyApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoZS0+bmFtZSwgbmFtZSkgPT0gMCApIHsKKyAgICAgICAgICAgICpwc2l6ZSA9IGUtPnNpemU7CisgICAgICAgICAgICByZXR1cm4gZS0+YmFzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworI3VuZGVmICAgX2ZpbGVfZW50cmllcworI2RlZmluZSAgX2ZpbGVfZW50cmllcyAgX3NraW5fZW50cmllcworY29uc3QgdW5zaWduZWQgY2hhciogc2tpbl9yZXNvdXJjZV9maW5kKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBwc2l6ZSkgeworIyAgICBpbmNsdWRlICJhbmRyb2lkL3NraW4vcmVzb3VyY2VfZGVmYXVsdHMuaCIKKyAgICByZXR1cm4gX3Jlc291cmNlX2ZpbmQoIG5hbWUsIF9maWxlX2VudHJpZXMsIHBzaXplICk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZXNvdXJjZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzY3OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2UuaApAQCAtMCwwICsxLDIxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8vIEZpbmQgdGhlIHJlc291cmNlIGRhdGEgaWRlbnRpZmllZCBieSB8bmFtZXwuIE9uIHN1Y2Nlc3MgcmV0dXJuIGl0cworLy8gZmlyc3QgYWRkcmVzcyBpbiBtZW1vcnksIGFuZCBzZXRzIHwqcHNpemV8IHRvIGl0cyBzaXplIGluIGJ5dGVzLgorLy8gT24gZmFpbHVyZSwgcmV0dXJuIE5VTEwuCitjb25zdCB1bnNpZ25lZCBjaGFyKiBza2luX3Jlc291cmNlX2ZpbmQoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBzaXplICk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9yZXNvdXJjZV9kZWZhdWx0cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2VfZGVmYXVsdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWIwYzAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vcmVzb3VyY2VfZGVmYXVsdHMuaApAQCAtMCwwICsxLDc0MTQgQEAKKy8qIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLCBkbyBub3QgdG91Y2ggKi8KKworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfZGF0YV9hcnJvd19kb3duX3BuZ1szNDM4XSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsIDk4LCAgMCwgIDAsICAwLCAzMSwgMTYsICA2LCAgMCwgIDAsICAwLCA3NiwxMzcsMTk2LAorICAgICA4MiwgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDIsCisgICAgMTUzLCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwxNTYsIDU5LCA3NSwxOTUsIDgwLCAyNCwxMzQsMTYzLAorICAgIDE4NCwxMDQsMTEzLCAxOCwgMjAsIDY4LDEzNSwgOTAsMTY5LDE2MywgOTMsMTg5LCA0NSwgOTAsMTU2LCAyNiwKKyAgICAyMDgsMTY1LCA0NiwgMjksMjUyLCAxMywyMjIsICA2LCAyMywgNjksIDcxLCA0NywxNjMsMTc5LCA2NiwgMzksCisgICAgIDY1LDExMiwyMzgsMTcwLCA4MCwgNzEsIDY5LCAyMywxNzEsIDc4LDE4NiwgNDAsIDU2LDEzNywgNTYsMTk4LAorICAgIDIyNSwyMDMsIDQzLCAzNiwxNjEsMTY0LDE3NywgMzksMTUxLDIzMCwxODgsMjA3LDI0MiwxMjksIDk2LCAyNywKKyAgICAyMDYsMTIxLDE1OSwxNTYsMjI3LDE1MSwgOTksMTg2LCA0NCwyMDMsMTc4LCA0NCwyMDMsIDQ4LDEwMiwyMzEsCisgICAgMTcwLDIxMywxNTEsMTAzLCAzNSwgMzgsICA2LCAyMiwxNTcsMTQ5LDIzMiwyMDEsMTAzLDIwNSwgODksMTYzLAorICAgIDIyNywyNTAsMTcwLCA4MiwyMDEsMTQxLCAyNywgNzAsIDc5LCA1MCwgIDYsIDk4LDE4OSwyMjMsIDIyLDE2MiwKKyAgICAxNTksMTYxLDIwOCwgOTAsICA4LDEyMywyNTQsMTgzLCA5OSwxODcsMTMwLDIzOCwxMjAsICA3LCA5NiwgOTcsCisgICAgMTM5LCA0MywgIDMsMjQxLDIzOCwgMjAsMTQ0LCAxMSwxMDksMTMyLDIzMiwxNzMsIDc0LCA0NSwyMzcsIDQ4LAorICAgICAgNCwxOTYsIDExLDExNCwxMjksMTU2LDE2NCwgOTQsMTM2LDI0MiwxNTIsMjEyLDE5MCwgNDIsIDM5LDE1OSwKKyAgICAxMjAsIDY1LCA0NiwxNDQsMTQ3LDIxMiwgMTAsIDQ5LDI0MiwgMzMsMTE3LDI1MCwxNTgsMTQ3LCA3OCwyNTIsCisgICAgIDY1LCA3OCwxNDQsMTU1LDIxMiwgIDksMTc3LCA1MCwyMDYsIDczLCAzOCwgNzMsMjA2LCA3NywgNjgsIDY2LAorICAgICAyMCwgMTAsIDgyLDI0MywgIDcsMTU2LCA5MiwgMTgsIDI4LDIyOCwgIDYsIDU3LDIzNCwxMjAsIDMzLDIwMiwKKyAgICAgNTcsIDc4LCA0MiwyMzMsMTMyLCAyOCwxMzMsIDQ0LDEzMiwgNTcsIDQ0LDE0OSwxMDksIDg1LDE2MiwgIDIsCisgICAgMjI4LCAgOCwxODUsMjM0LCAyNCwgMzMsMTEyLDIyNSwyNDMsIDc5LDE1NiwgNjgsMTYyLCAzMCwyMjgsIDc0LAorICAgIDI1MywxNDEsIDU0LDE2NCwgMzksMjEzLDE2NSwgOTMsMTY5LDE4NiwxODAsIDg1LDIwNywgOTUsMTY0LDE5MCwKKyAgICAgMTQsMTk4LDEyMywgMjksMTYzLCAzMSwxMjIsMTA4LCA4MSwxNDUsIDQzLDIyOCwyMzYsMTcyLDE1MCwgODAsCisgICAgIDMzLDI0MiwxMzUsIDgyLDExNywxMDcsMTcxLDIyNiwgNjUsMjEwLDIwOSwxODMsMjEyLDE4MywxMzYsMTk3LAorICAgICA2NCwgOTEsMTc4LDE0OCwxNzcsMTI3LDE2MCwyMDEsMTQxLCAgOCwgNTcsMTcxLDIxOSwxODUsMTA3LDEwOCwKKyAgICAgMzYsMTA4LDIwMywxMDAsMjM4LDIzMywxODUsMTMyLDIyNywxNDIsMTgxLDE1OCwxMTMsICA2LCA1MiwgNDIsCisgICAgIDE3LDI0MCwxODksMTg2LCA2MiwyMzIsIDg0LDE1MSwgNTksIDY5LCA2NiwgNzYsIDYxLDIxNiwgNDMsMTMyLAorICAgIDIzMCwxMDksMjEzLDE2OCwxOTYsMTYwLCAgOCwxNzQsMTU3LDIwMSwxMjksIDUxLDEzNSwxNzcsICA5LDEyOSwKKyAgICAxNzksIDM4LCAzOCwyMDcsIDM2LCA2OSwgMzQsICA2LCA2OSwyNDAsIDg5LCA0MSwyMTgsIDYyLCAgMywyMTMsCisgICAgMTY2LCAxNiwgNjksMTU4LCA4NiwxNDEsIDY4LCAxMiwxMzgsMjA4LCAyNiwyMDAsIDk3LDExMywgNDMsIDk4LAorICAgICAzMywyNDAsMTk3LCA2MCwxNzMsIDI2LDE3NCwgMjQsIDIwLDE2MSwxODksIDM4LCA3MSwyNDAsIDI3LDI0NSwKKyAgICAgNjMsMTMzLCA0MCwyNDMsIDc2LCA4MiwxNjgsIDk4LCA4MCwgIDQsIDUzLCAgNCwyMDcsMTA1LCA2NCwgMzMsCisgICAgMjA4LCA4NiwgNDUsIDc2LDExNCwxNzYsMTk1LCAxNiwxMzEsIDM0LDE2OCwgIDUsIDU3LCA2OSwxMTAsMTQ5LAorICAgICAxMSwxOTMsMTQ5LCAzMywgOTIsIDQ5LCA0MCwgNjYsMjIwLCA0MywgNjksMTM5LCA2NiwxNjAsMTU3LCA1MywKKyAgICAyNTAsMjA2LDE5MywgMTMsIDgzLCAxMiwxMzgsIDE2LCAxNCwyMDAsMTczLDEyNywgOTEsMjE0LCA3MSwgIDgsCisgICAgMTgwLDE3NSwyMDIsIDg5LCAxNCwgNDIsIDczLDE5MywgNzQsMTQ1LDExNywyMzAsMjE4LDEzOSwyMDcsMjA5LAorICAgICAxMywxMTUsMjE1LDE5MCwxMTUsMTI1LDExNSwgNDgsIDczLDEyMiwgODYsIDk4LDIxMSwxMjYsMTQ0LDExOSwKKyAgICAyMjIsMjM0LCAxMCwyNDEsMjQ3LDI0NiwxMzEsIDc3LCAxNCwgMzQsIDczLCAzMSwyMDAsMTgxLDE4MywgNDUsCisgICAgMjE5LCA2OCwxMzYsMjEzLCAyNywgMTQsIDI2LCA3MywgNjMsMjIyLDE1NiwxODcsMTgyLCA3NiwxMDQsIDc5LAorICAgIDIyOSwyNDksMTk0LCA0OCwxNjIsICAxLCA1NiwgIDMsMTQ5LDI1NSwxNDYsMjE4LDIxNiwxMTIsMTczLCAxNiwKKyAgICAxNzEsMTE3LCAxNCwgMTgsMjA5LDExMiwxNjUsMTY4LCA1NSwyMTcsIDUwLDIzNywgNDcsIDc1LCA2MSwxNTcsCisgICAgMTQ1LDEyMiwxMjMsMTk5LDE5MywgMzQsMjMzLCAgMywxODUsIDcwLDIwNiwxNDUsMTIzLDIwNywxNTAsMjMzLAorICAgIDE2NywgMzQsIDIxLDE5NCwxODQsIDIzLCAxMiwxMDgsMTY5LCAzOCwxNDIsMTY1LDE0MiwgNDQsIDczLCA2OSwKKyAgICAxNTksMTUxLDEzNSwyNTIsIDcyLDE1NiwyMjQsIDM3LDIwMSwxNzUsIDY3LCA4MiwyMjMsIDQ2LDE2NSwgNjIsCisgICAgMTc0LCA5NywgNzUsMjI4LDI1MCwxMzMsIDE5LDE1OSwxOTEsIDMzLDI1MiwxOTIsICA3LCA1NCwxNTQsMTI1LAorICAgIDIyNCwxMzMsIDgzLCAyOCwgIDAsMTI5LCAgOCwgODEsICAxLCAgMiwyMzgsMjA2LDEwMSwgODMsIDkwLDI1NCwKKyAgICAgNzksMTg2LCA5NSwgIDAsICAwLCAgMCwyNTUsMjU1LCAgMywgIDAsMjQzLDE3NSwxNTcsMTA3LCA0NywxNTEsCisgICAgMjAyLDI0MywgIDAsICAwLCAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfYXJyb3dfbGVmdF9wbmdbNDEyMl0gPSB7CisgICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCwgIDAsICAwLCAgMCwgMTMsIDczLCA3MiwgNjgsIDgyLAorICAgICAgMCwgIDAsICAwLCA0NywgIDAsICAwLCAgMCwgODcsIDE2LCAgNiwgIDAsICAwLCAgMCwxOTYsMTk4LDE5MiwKKyAgICAgNjcsICAwLCAgMCwgIDAsICA5LDExMiwgNzIsIDg5LDExNSwgIDAsICAwLCAxMSwgMTksICAwLCAgMCwgMTEsCisgICAgIDE5LCAgMSwgIDAsMTU0LDE1NiwgMjQsICAwLCAgMCwgMTAsIDc5LDEwNSwgNjcsIDY3LCA4MCwgODAsMTA0LAorICAgIDExMSwxMTYsMTExLDExNSwxMDQsMTExLDExMiwgMzIsIDczLCA2NywgNjcsIDMyLDExMiwxMTQsMTExLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwgIDAsICAwLDEyMCwyMTgsMTU3LCA4MywxMDMsIDg0LCA4MywyMzMsIDIyLCA2MSwyNDcsCisgICAgMjIyLDI0NCwgNjYsIDc1LDEzNiwxMjgsMTQ4LCA3NSwxMTEsIDgyLCAyMSwgIDgsIDMyLCA4MiwgNjYsMTM5LAorICAgIDEyOCwgMjAsMTQ1LCAzOCwgNDIsIDMzLCAgOSwgMTYsIDc0LDEzNiwgMzMsMTYxLDIxNywgMjEsIDgxLDE5MywKKyAgICAgMTcsIDY5LCA2OSwgIDQsIDI3LDIwMCwxNjAsMTM2LCAgMywxNDIsMTQyLDEyOCwxNDAsIDIxLCA4MSwgNDQsCisgICAgIDEyLDEzOCwgMTAsMjE2LCAgNywyMjgsIDMzLDE2MiwxNDIsMTMxLDE2MywxMzYsMTM4LDIwMiwyNTEsMjI1LAorICAgIDEyMywxNjMsMTA3LDIxNCwxODgsMjQ3LDIzMCwyMDUsMjU0LDE4MSwyMTUsIDYyLDIzMSwxNzIsMjQzLDE1NywKKyAgICAxNzksMjA3LCAgNywxOTIsICA4LCAxMiwxNTAsIDcyLCA1MSwgODEsIDUzLDEyOCwgMTIsMTY5LCA2NiwgMzAsCisgICAgIDE3LDIyNCwxMzEsMTk5LDE5NiwxOTgsMjI1LDIyOCwgNDYsIDY0LDEyOSwgMTAsIDM2LDExMiwgIDAsIDE2LAorICAgICAgOCwxNzksMTAwLCAzMywxMTUsMjUzLCAzNSwgIDEsICAwLDI0OCwxMjYsIDYwLCA2MCwgNDMsIDM0LDE5MiwKKyAgICAgIDcsMTkwLCAgMCwgIDEsMTIwLDIxMSwgMTEsICA4LCAgMCwxOTIsIDc3LDE1NSwxOTIsIDQ4LCAyOCwxMzUsCisgICAgMjU1LCAxNSwyMzQsIDY2LDE1MywgOTIsICAxLDEyOCwxMzIsICAxLDE5MiwxMTYsMTQ1LCA1NiwgNzUsICA4LAorICAgIDEyOCwgMjAsICAwLCA2NCwxMjIsMTQyLCA2NiwxNjYsICAwLCA2NCwgNzAsICAxLDEyOCwxNTcsMTUyLCAzOCwKKyAgICAgODMsICAwLDE2MCwgIDQsICAwLCA5NiwyMDMsIDk5LCA5OCwyMjcsICAwLCA4MCwgNDUsICAwLCA5NiwgMzksCisgICAgMTI3LDIzMCwyMTEsICAwLDEyOCwxNTcsMjQ4LDE1MywxMjMsICAxLCAgMCwgOTEsMTQ4LCAzMywgMjEsICAxLAorICAgIDE2MCwxNDUsICAwLCAzMiwgMTksMTAxLDEzNiwgNjgsICAwLDEwNCwgNTksICAwLDE3MiwyMDcsIDg2LDEzOCwKKyAgICAgNjksICAwLCA4OCwgNDgsICAwLCAyMCwxMDIsIDc1LDE5NiwgNTcsICAwLDIxNiwgNDUsICAwLCA0OCwgNzMsCisgICAgIDg3LDEwMiwgNzIsICAwLDE3NiwxODMsICAwLDE5MiwyMDYsIDE2LCAxMSwxNzgsICAwLCAgOCwgMTIsICAwLAorICAgICA0OCwgODEsMTM2LDEzMywgNDEsICAwLCAgNCwxMjMsICAwLCA5NiwyMDAsIDM1LCAzNSwxMjAsICAwLDEzMiwKKyAgICAxNTMsICAwLCAyMCwgNzAsMjQyLCA4NywgNjAsMjQxLCA0MywxNzQsIDE2LDIzMSwgNDIsICAwLCAgMCwxMjAsCisgICAgMTUzLDE3OCwgNjAsMTg1LCAzNiwgNTcsIDY5LDEyOSwgOTEsICA4LCA0NSwxMTMsICA3LCA4NywgODcsIDQ2LAorICAgICAzMCwgNDAsMjA2LCA3MywgMjMsIDQzLCAyMCwgNTQsIDk3LCAgMiwgOTcsMTU0LCA2NCwgNDYsMTk0LDEyMSwKKyAgICAxNTMsIDI1LCA1MCwxMjksIDUyLCAxNSwyMjQsMjQzLDIwNCwgIDAsICAwLDE2MCwxNDUsIDIxLCAxNywyMjQsCisgICAgMTMxLDI0MywyNTMsMTIwLDIwNiwgMTQsMTc0LDIwNiwyMDYsIDU0LDE0MiwxODIsIDE0LCA5NSwgNDUsMjM0LAorICAgIDE5MSwgIDYsMjU1LCAzNCwgOTgsIDk4LDIyNywyNTQsMjI5LDIwNywxNzEsMTEyLCA2NCwgIDAsICAwLDIyNSwKKyAgICAxMTYsMTI2LDIwOSwyNTQsIDQ0LCA0NywxNzksIDI2LDEyOCwgNTksICA2LDEyOCwxMDksMjU0LDE2MiwgMzcsCisgICAgMjM4LCAgNCwxMDQsIDk0LCAxMSwxNjAsMTE3LDI0NywxMzksMTAyLDE3OCwgMTUsIDY0LDE4MSwgIDAsMTYwLAorICAgIDIzMywyMTgsIDg3LDI0MywxMTIsMjQ4LDEyNiwgNjAsIDYwLCA2OSwxNjEsMTQ0LDE4NSwyMTcsMjE3LDIyOSwKKyAgICAyMjgsMjI4LDIxNiwgNzQsMTk2LCA2NiwgOTEsIDk3LDIwMiwgODcsMTI1LDI1NCwxMDMsMTk0LCA5NSwxOTIsCisgICAgIDg3LDI1MywxMDgsMjQ5LDEyNiwgNjAsMjUyLDI0NywyNDUsMjI0LDE5MCwyMjYsIDM2LDEyOSwgNTAsIDkzLAorICAgIDEyOSwgNzEsICA0LDI0OCwyMjQsMTk0LDIwNCwyNDQsIDc2LDE2NSwgMjgsMjA3LDE0NiwgIDksMTMyLCA5OCwKKyAgICAyMjAsMjMwLDE0MywgNzEsMjUyLDE4MywgMTEsMjU1LDI1MiwgMjksMjExLCAzNCwxOTYsIDczLCA5OCwxODUsCisgICAgIDg4LCA0MiwgMjAsMjI3LCA4MSwgMTgsMTEzLDE0MiwgNjgsMTU0LDE0MCwyNDMsIDUwLDE2NSwgMzQsMTM3LAorICAgICA2NiwxNDYsIDQxLDE5NywgMzcsMjEwLDI1NSwxMDAsMjI2LDIyMywgNDQsMjUxLCAgMywgNjIsMjIzLCA1MywKKyAgICAgIDAsMTc2LDEwNiwgNjIsICAxLDEyMywxNDUsIDQ1LDE2OCwgOTMsIDk5LCAgMywyNDYsIDc1LCAzOSwgMTYsCisgICAgIDg4LDExNiwxOTIsMjI2LDI0NywgIDAsICAwLDI0MiwxODcsMTExLDE5MywyMTIsIDQwLCAgOCwgIDMsMTI4LAorICAgIDEwNCwxMzEsMjI1LDIwNywxMTksMjU1LDIzOSwgNjMsMjUzLCA3MSwxNjAsIDM3LCAgMCwxMjgsMTAyLCA3MywKKyAgICAxNDYsMTEzLCAgMCwgIDAsIDk0LCA2OCwgMzYsIDQ2LCA4NCwyMDIsMTc5LCA2MywxOTksICA4LCAgMCwgIDAsCisgICAgIDY4LDE2MCwxMjksIDQyLDE3NiwgNjUsIDI3LDI0NCwxOTMsIDI0LCA0NCwxOTIsICA2LCAyOCwxOTMsICA1LAorICAgIDIyMCwxOTMsIDExLDI1MiwgOTYsIDU0LDEzMiwgNjYsIDM2LDE5NiwxOTQsIDY2LCAxNiwgNjYsIDEwLDEwMCwKKyAgICAxMjgsIDI4LDExNCwgOTYsIDQxLDE3MiwxMzAsIDY2LCA0MCwxMzQsMjA1LDE3NiwgMjksIDQyLCA5NiwgNDcsCisgICAgMjEyLCA2NCwgMjksIDUyLDE5MiwgODEsMTA0LDEzNCwxNDcsMTEyLCAxNCwgNDYsMTk0LCA4NSwxODQsIDE0LAorICAgICA2MSwxMTIsIDE1LDI1MCwgOTcsICA4LDE1OCwxOTMsIDQwLDE4OCwxMjksICA5LCAgNCwgNjUsMjAwLCAgOCwKKyAgICAgMTksIDk3LCAzMywyMTgsMTM2LCAgMSwgOTgsMTM4LCA4OCwgMzUsMTQyLCAgOCwgMjMsMTUzLDEzMywyNDgsCisgICAgIDMzLDE5MywgNzIsICA0LCAxOCwxMzksIDM2LCAzMiwyMDEsMTM2LCAyMCwgODEsIDM0LCA3NSwxNDUsIDUzLAorICAgICA3MiwgNDksIDgyLDEzOCwgODQsIDMyLCA4NSwgNzIsIDI5LDI0MiwgNjEsMTE0LCAgMiwgNTcsMTM1LCA5MiwKKyAgICAgNzAsMTg2LDE0NSwgNTksMjAwLCAgMCwgNTAsMTMwLDI1MiwxMzQsMTg4LCA3MSwgNDksMTQ4LDEyOSwxNzgsCisgICAgIDgxLCA2MSwyMTIsIDEyLDE4MSwgNjcsMTg1LDE2OCwgNTUsIDI2LDEzMiwgNzAsMTYyLCAxMSwyMDgsMTAwLAorICAgIDExNiwgNDksMTU0LDE0MywgMjIsMTYwLDE1NSwyMDgsMTE0LDE4MCwgMjYsIDYxLDE0MCwgNTQsMTYxLDIzMSwKKyAgICAyMDgsMTcxLDEwNCwgMTUsMjE4LDE0MywgNjIsIDY3LDE5OSwgNDgsMTkyLDIzMiwgMjQsICA3LCA1MSwxOTYsCisgICAgMTA4LCA0OCwgNDYsMTk4LDE5NSwgNjYsMTc3LCA1NiwgNDQsICA5LDE0NywgOTksMjAzLDE3NywgMzQsMTcyLAorICAgICAxMiwxNzEsMTk4LCAyNiwxNzYsIDg2LDE3MiwgIDMsMTg3LDEzNywyNDUsIDk5LDIwNywxNzcsMTE5LCAgNCwKKyAgICAgMTgsMTI5LCA2OSwxOTIsICA5LCA1NCwgIDQsMTE5LCA2NiwgMzIsIDk3LCAzMCwgNjUsIDcyLCA4OCwgNzYsCisgICAgIDg4LCA3OCwyMTYsIDcyLDE2OCwgMzIsIDI4LCAzNiwgNTIsIDE3LDIxOCwgIDksIDU1LCAgOSwgIDMsMTMyLAorICAgICA4MSwxOTQsIDM5LCAzNCwxNDcsMTY4LCA3NSwxODAsIDM4LDE4NiwgMTcsMjQ5LDE5NiwgMjQsIDk4LCA1MCwKKyAgICAgNDksMTM1LCA4OCwgNzIsIDQ0LCAzNSwyMTQsIDE4LDE0MywgMTksIDQ3LCAxNiwxMjMsMTM2LCA2NywxOTYsCisgICAgIDU1LCAzNiwgMTgsMTM3LCA2NywgNTAsIDM5LDE4NSwxNDQsICAyLCA3MywxNzcsMTY0LCA4NCwyMTAsIDE4LAorICAgIDIxMCwgNzAsMjEwLDExMCwgODIsIDM1LDIzMywgNDQsMTY5LDE1NSwgNTIsIDcyLCAyNiwgMzUsMTQ3LDIwMSwKKyAgICAyMTgsMTAwLDEwNywxNzgsICA3LCA1NywxNDgsIDQ0LCAzMiwgNDMsMjAwLDEzMywyMjgsMTU3LDIyOCwxOTUsCisgICAgMjI4LCA1MSwyMjgsIDI3LDIyOCwgMzMsMjQyLCA5MSwgMTAsMTU3LCA5OCwgNjQsMTEzLDE2NCwyNDgsIDgzLAorICAgIDIyNiwgNDAsIDgyLDIwMiwxMDYsIDc0LCAyNSwyMjksIDE2LDIyOSwgNTIsMjI5LCAgNiwxMDEsMTUyLCA1MCwKKyAgICAgNjUsIDg1LDE2MywxNTQsIDgyLDIyMSwxNjgsMTYxLCA4NCwgMTcsIDUzLDE0MywgOTAsIDY2LDE3MywxNjEsCisgICAgMTgyLCA4MiwxNzUsIDgxLDEzNSwxNjgsIDE5LCA1MiwxMTcsMTU0LCA1NywyMDUsMTMxLCAyMiwgNzMsIDc1LAorICAgIDE2NSwxNzMsMTYyLDE0OSwyMTEsIDI2LDEwNCwgMjMsMTA0LDI0NywxMDUsMTc1LDIzMiwxMTYsMTg2LCAxNywKKyAgICAyMjEsMTQ5LCAzMCwgNzgsMTUxLDIwOCwgODcsMjEwLDIwMywyMzMsIDcxLDIzMiwxNTEsMjMyLCAgMywyNDQsCisgICAgMTE5LCAxMiwgMTMsMTM0LCAyMSwxMzEsMTk5LDEzNiwxMDMsIDQwLCAyNSwxNTUsIDI0LCAgNywgMjQsMTAzLAorICAgICAyNSwxMTksIDI0LDE3NSwxNTIsIDc2LDE2NiwgMjUsMjExLDEzOSwgMjUsMTk5LCA4NCwgNDgsIDU1LCA0OSwKKyAgICAyMzUsMTUyLDIzMSwxNTMsIDE1LDE1MywxMTEsIDg1LCA4OCwgNDIsMTgyLCA0MiwxMjQsIDIxLDE0NSwyMDIsCisgICAgIDEwLDE0OSwgNzQsMTQ5LCAzOCwxNDksIDI3LCA0MiwgNDcsIDg0LDE2OSwxNzAsMTY2LDE3MCwyMjIsMTcwLAorICAgICAxMSwgODUsMjQzLCA4NSwyMDMsIDg0LDE0MywxNjksIDk0LCA4MywxMjUsMTc0LCA3MCwgODUsIDUxLCA4MywKKyAgICAyMjcsMTY5LCAgOSwyMTIsMTUwLDE3MSwgODUsMTcwLDE1NywgODAsMjM1LCA4MywgMjcsIDgzLDEwMywxNjksCisgICAgIDU5LDE2OCwxMzUsMTcwLDEwMywxNjgsMTExLCA4NCwgNjMsMTY0LDEyNiwgODksMjUzLDEzNywgIDYsIDg5LAorICAgIDE5NSwgNzYsMTk1LCA3OSwgNjcsMTY0LCA4MSwxNjAsMTc3LCA5NSwyMjcsMTg4LDE5OCwgMzIsIDExLCA5OSwKKyAgICAgMjUsMTc5LDEyMCwgNDQsIDMzLDEwNywgMTMsMTcxLDEzNCwxMTcsMTI5LCA1MywxOTYsIDM4LDE3NywyMDUsCisgICAgMjE3LDEyNCwxMTgsIDQyLDE4NywxNTIsMjUzLCAyOSwxODcsMTM5LCA2MSwxNzAsMTY5LDE2MSwgNTcsIDY3LAorICAgICA1MSwgNzQsIDUxLCA4NywxNzksIDgyLDI0MywxNDgsMTAyLCA2MywgIDcsMjI3LDE1MiwxMTMsMjQ4LDE1NiwKKyAgICAxMTYsIDc4LCAgOSwyMzEsIDQwLDE2NywxNTEsMjQzLDEyNiwxMzgsMjIyLCAyMCwyMzksIDQxLDIyNiwgNDEsCisgICAgIDI3LDE2NiwgNTIsIDc2LDE4NSwgNDksMTAxLCA5MiwxMDcsMTcwLDE1MCwxNTEsMTUwLCA4OCwxNzEsIDcyLAorICAgIDE3MSwgODEsMTcxLCA3MSwyMzUsMTg5LCA1NCwxNzQsMjM3LDE2NywxNTcsMTY2LDE4OSwgNjksMTg3LCA4OSwKKyAgICAyNTEsMTI5LCAxNCwgNjUsMTk5LCA3NCwgMzksIDkyLCAzOSwgNzEsMTAzLDE0MywyMDYsICA1LDE1NywyMzEsCisgICAgIDgzLDIxNywgODMsMjIxLDE2NywgMTAsMTY3LCAyMiwgNzcsIDYxLCA1OCwyNDUsMTc0LCA0NiwxNzAsMTA3LAorICAgIDE2NSwgMjcsMTYxLDE4NywgNjgsMTE5LDE5MSwxMTAsMTY3LDIzOCwxNTIsMTU4LDE5MCwgOTQsMTI4LDE1OCwKKyAgICAgNzYsMTExLDE2NywyMjIsMTIxLDE4OSwyMzEsMjUwLCAyOCwxMjUsIDQ3LDI1MywgODQsMjUzLDEwOSwyNTAsCisgICAgMTY3LDI0NSwgNzEsIDEyLCA4OCwgIDYsMTc5LCAxMiwgMzYsICA2LDIxOSwgMTIsMjA2LCAyNCwgNjAsMTk3LAorICAgICA1MywxMTMsMTExLCA2MCwgMjksIDQ3LDE5OSwyMTksMjQxLCA4MSwgNjcsIDkzLDE5NSwgNjQsIDY3LDE2NSwKKyAgICAgOTcsMTQ5LCA5NywxNTEsMjI1LDEzMiwxNDUsMTg1LDIwOSwgNjAsMTYzLDIxMywgNzAsMTQxLCA3MCwgMTUsCisgICAgMTQwLDEwNSwxOTgsIDkyLDIyNywgMzYsMjI3LDEwOSwxOTgsMTA5LDE5OCwxNjMsIDM4LCAgNiwgMzgsIDMzLAorICAgICAzOCwgNzUsIDc3LDIzNCwgNzcsMjM4LDE1NCwgODIsIDc3LDE4NSwxNjYsIDQxLDE2NiwgNTksIDc2LCA1OSwKKyAgICAgNzYsMTk5LDIwNSwyMDQsMjA1LDE2MiwyMDUsMjE0LDE1MywgNTMsMTU1LCA2MSwgNDksMjE1LCA1MCwyMzEsCisgICAgMTU1LDIzMSwxNTUsMjE1LDE1NSwyMjMsMTgzLCA5NiwgOTAsMTIwLCA5MCwgNDQsMTgyLDE2OCwxODIsMTg0LAorICAgIDEwMSwgNzMsMTc4LDIyOCwgOTAsMTY2LCA4OSwyMzgsMTgyLDE4OCwxMTAsMTMzLCA5MCwgNTcsIDg5LDE2NSwKKyAgICAgODgsIDg1LCA5MCwgOTMsMTc5LCA3MCwxNzMsMTU3LDE3MywgMzcsMjE0LDE4NywxNzMsMTg3LDE2NywgMTcsCisgICAgMTY3LDE4NSwgNzgsMTQ3LCA3OCwxNzEsMTU4LDIxNCwxMDMsMTk1LDE3NiwyNDEsMTgyLDIwMSwxODIsMTY5LAorICAgIDE4MywgMjUsMTc2LDIyOSwyMTYsICA2LDIxOSwxNzQsMTgyLDEwOSwxODIsMTI1LCA5NywxMDMsIDk4LCAyMywKKyAgICAxMDMsMTgzLDE5NywxNzQsMTk1LDIzOCwxNDcsMTg5LDE0NywxMjUsMTg2LDEyNSwxNDEsMjUzLCA2MSwgIDcsCisgICAgIDEzLDEzNSwyMTcsIDE0LDE3MSwgMjksIDkwLCAyOSwxMjYsMTE1LDE4MCwxMTQsIDIwLCA1OCwgODYsIDU4LAorICAgIDIyMiwxNTQsMjA2LDE1NiwyMzgsIDYzLDEyNSwxOTcsMjQ0LDE1MCwyMzMsIDQ3LDEwMywgODgsMjA3LCAxNiwKKyAgICAyMDcsMjE2LCA1MSwyMjcsMTgyLCAxOSwyMDMsIDQxLDE5NiwxMDUsMTU3LCA4MywxNTUsMjExLCA3MSwxMDMsCisgICAgIDIzLDEwMywxODUsMTE1LDEzMSwyNDMsMTM2LDEzOSwxMzcsIDc1LDEzMCwyMDMsIDQ2LDE1MSwgNjIsIDQ2LAorICAgIDE1NSwgMjcsMTk4LDIyMSwyMDAsMTg5LDIyOCwgNzQsMTE2LDI0NSwxMTMsIDkzLDIyNSwxMjIsMjEwLDI0NSwKKyAgICAxNTcsMTU1LDE3OSwxNTUsMTk0LDIzNywxNjgsMjE5LDE3NSwyMzgsIDU0LDIzOCwxMDUsMjM4LDEzNSwyMjAsCisgICAgMTU5LDIwNCwgNTIsMTU5LCA0MSwxNTgsIDg5LCA1MSwxMTUsMjA4LDE5NSwyMDAsIDY3LDIyNCwgODEsMjI5LAorICAgIDIwOSwgNjMsIDExLDE1OSwxNDksIDQ4LDEwNywyMjMsMTcyLDEyNiwgNzksIDY3LCA3OSwxMjksMTAzLDE4MSwKKyAgICAyMzEsIDM1LCA0NywgOTksIDQ3LDE0NSwgODcsMTczLDIxNSwxNzYsMTgzLDE2NSwxMTksMTcwLDI0NywgOTcsCisgICAgMjM5LCAyMywgNjIsMjQ2LCA2MiwxMTQsMTU5LDIyNywgNjIsMjI3LCA2MCwgNTUsMjIyLCA1MCwyMjIsIDg5LAorICAgICA5NSwyMDQsIDU1LDE5MiwxODMsMjAwLDE4MywyMDMsIDc5LDE5NSwxMTEsMTU4LCA5NSwxMzMsMjIzLCA2NywKKyAgICAxMjcsIDM1LDI1NSwxMDAsMjU1LDEyMiwyNTUsMjA5LCAgMCwxNjcsMTI4LCAzNywgIDEsMTAzLCAgMywxMzcsCisgICAgMTI5LCA2NSwxMjksIDkxLCAgMiwyNTEsMjQ4LDEyMiwxMjQsIDMzLDE5MSwxNDIsIDYzLCA1OCwyMTksMTAxLAorICAgIDI0NiwxNzgsMjE3LDIzNywgNjUsMTQwLDE2MCwxODUsIDY1LCAyMSwgNjUsMTQzLDEzMCwxNzMsMTMwLDIyOSwKKyAgICAxOTMsMTczLCAzMywxMDQsMjAwLDIzNiwxNDQsMTczLCAzMywyNDcsMjMxLDE1MiwyMDYsMTQ1LDIwNiwxMDUsCisgICAgIDE0LDEzMywgODAsMTI2LDIzMiwyMTQsMjA4LCAgNywgOTcsMjMwLCA5NywxMzksMTk1LDEyNiwgMTIsIDM5LAorICAgIDEzMywxMzUsMTMzLCA4NywxMzQsIDYzLDE0MiwxMTIsMTM2LCA4OCwgMjYsMjA5LCA0OSwxNTEsIDUzLDExOSwKKyAgICAyMDksMjIwLCA2NywxMTUsMjIzLCA2OCwyNTAsIDY4LDE1MCwgNjgsMjIyLDE1NSwxMDMsIDQ5LCA3OSwgNTcsCisgICAgMTc1LCA0NSwgNzQsIDUzLCA0MiwgNjIsMTcwLCA0NiwxMDYsIDYwLDIxOCwgNTUsMTg2LCA1MiwxODYsIDYzLAorICAgIDE5OCwgNDYsMTAyLCA4OSwyMDQsMjEzLCA4OCwxNTcsIDg4LCA3MywxMDgsIDc1LCAyOCwgNTcsIDQ2LCA0MiwKKyAgICAxNzQsIDU0LDExMCwxMDgsMTkwLDIyMywyNTIsMjM3LDI0MywxMzUsMjI2LDE1NywyMjYsIDExLDIyNywxMjMsCisgICAgIDIzLDE1MiwgNDcsMjAwLCA5MywxMTIsMTIxLDE2MSwyMDYsMTk0LDI0NCwxMzMsMTY3LCAyMiwxNjksIDQ2LAorICAgICAxOCwgNDQsIDU4LDE1MCwgNjQsIDc2LDEzNiwgNzgsIDU2LDE0OCwyNDAsIDY1LCAxNiwgNDIsMTY4LCAyMiwKKyAgICAxNDAsIDM3LDI0MiwgMTksMTE5LCAzNywxNDIsIDEwLDEyMSwxOTQsIDI5LDE5NCwxMDMsIDM0LCA0NywyMDksCisgICAgIDU0LDIwOSwxMzYsMjE2LCA2NywgOTIsIDQyLCAzMCwgNzgsMjQyLCA3MiwgNDIsIDc3LDEyMiwxNDYsMjM2LAorICAgIDE0NSwxODgsIDUzLDEyMSwgMzYsMTk3LCA1MSwxNjUsIDQ0LDIyOSwxODUsMTMyLCAzOSwxNjksMTQ0LDE4OCwKKyAgICAgNzYsIDEzLCA3NiwyMjEsMTU1LCA1OCwxNTgsIDIyLDE1NCwxMTgsIDMyLDEwOSwgNTAsIDYxLCA1OCwxODksCisgICAgIDQ5LDEzMSwxNDYsMTQ1LDE0NCwxMTMsIDY2LDE3MCwgMzMsIDc3LDE0NywxODIsMTAzLDIzNCwxMDMsMjMwLAorICAgIDEwMiwxMTgsMjAzLDE3MiwxMDEsMTMzLDE3OCwyNTQsMTk3LDExMCwxMzksMTgzLCA0NywgMzAsMTQ5LCAgNywKKyAgICAyMDEsMTA3LDE3OSwxNDQsMTcyLCAgNSwgODksIDQ1LCAxMCwxODIsIDY2LDE2NiwyMzIsIDg0LCA5MCwgNDAsCisgICAgMjE1LCA0MiwgIDcsMTc4LDEwMywxMDEsIDg3LDEwMiwxOTEsMjA1LDEzNywyMDIsIDU3LDE1MCwxNzEsMTU4LAorICAgICA0MywyMDUsMjM3LDIwNCwxNzksMjAyLDIxOSwxNDQsIDU1LDE1NiwyMzksMTU5LDI1NSwyMzcsIDE4LDE5NCwKKyAgICAgMTgsMjI1LDE0NiwxODIsMTY1LDEzNCwgNzUsIDg3LCA0NSwgMjksIDg4LDIzMCwxODksMTcyLDEwNiwgNTcsCisgICAgMTc4LCA2MCwxMTMsMTIxLDIxOSwgMTAsMjI3LCAyMSwgIDUsIDQzLDEzNCwgODYsICA2LDE3MiwgNjAsMTg0LAorICAgIDEzOCwxODIsIDQyLDEwOSwyMTMsIDc5LDE3MSwyMzcsIDg3LDE1MSwxNzQsMTI2LDE4OSwgMzgsMTIyLCA3NywKKyAgICAxMDcsMTI5LCA5NCwxOTMsMjAyLDEzMCwxOTMsMTgxLCAgMSwxMDcsMjM1LCAxMSwgODUsIDEwLDIyOSwxMzMsCisgICAgMTI1LDIzNSwyMjAsMjE1LDIzNywgOTMsIDc5LCA4OCwgNDcsIDg5LDIyMywxODEsIDk3LDI1MCwxMzQsMTU3LAorICAgICAyNywgNjIsIDIxLDEzNywxMzgsMTc0LCAyMCwyMTksIDIzLDE1MSwgMjEsMTI3LDIxNiwgNDAsMjIwLDEyMCwKKyAgICAyMjksIDI3LDEzNSwxMTEsMjAyLDE5MSwxNTMsMjIwLDE0OCwxODAsMTY5LDE3MSwxOTYsMTg1LDEwMCwyMDcsCisgICAgMTAyLDIxMCwxMDIsMjMzLDIzMCwyMjIsIDQ1LDE1OCwgOTEsIDE0LDE1MCwxNzAsMTUxLDIzMCwxNTEsIDE0LAorICAgIDExMCwgMTMsMjE3LDIxOCwxODAsIDEzLDIyMywgODYsMTgwLDIzNywyNDUsMjQ2LCA2OSwyMTksIDQ3LDE1MSwKKyAgICAyMDUsIDQwLDIxOSwxODcsMTMxLDE4MiwgNjcsMTg1LDE2MywxOTEsIDYwLDE4NCwxODgsMTAxLDE2NywyMDEsCisgICAgMjA2LDIwNSwgNTksIDYzLCA4NCwxNjQsIDg0LDI0NCwgODQsMjUwLCA4NCwgNTQsMjM4LDIxMCwyMjEsMTgxLAorICAgICA5NywyMTUsMjQ4LDExMCwyMDksMjM4LCAyNywxMjMsMTg4LDI0NiwgNTIsMjM2LDIxMywyMTksIDkxLDE4OCwKKyAgICAyNDcsMjUzLCA2MiwyMDEsMTkwLDIxOSwgODUsICAxLCA4NSwgNzcsMjEzLDEwMiwyMTMsMTAxLDI1MSwgNzMsCisgICAgMjUxLDE3OSwyNDcsIDYzLDE3NCwxMzcsMTcwLDIzMywyNDgsMTUwLDI1MSwxMDksIDkzLDE3MywgNzgsMTA5LAorICAgIDExMywyMzcsMTk5LCAgMywyMTAsICAzLDI1MywgIDcsIDM1LCAxNCwxODIsMjE1LDE4NSwyMTIsMjEzLCAyOSwKKyAgICAyMTAsIDYxLCA4NCwgODIsMTQzLDIxNCwgNDMsMjM1LCA3MSwgMTQsMTk5LCAzMSwxOTAsMjU0LDE1NywyMzksCisgICAgMTE5LCA0NSwgMTMsIDU0LCAxMywgODUsMTQxLDE1NiwxOTgsMjI2LCAzNSwxMTIsIDY4LDEyMSwyMjgsMjMzLAorICAgIDI0NywgIDksMjIzLDI0NywgMzAsIDEzLCA1OCwyMTgsMTE4LDE0MCwxMjMsMTcyLDIyNSwgIDcsMjExLCAzMSwKKyAgICAxMTgsIDI5LDEwMywgMjksIDQ3LDEwNiwgNjYsMTU0LDI0MiwxNTQsIDcwLDE1NSwgODMsMTU0LDI1MSwgOTEsCisgICAgIDk4LCA5MSwxODYsIDc5LDIwNCwgNjIsMjA5LDIxNCwyMzQsMjIyLDEyMiwyNTIsIDcxLDIxOSwgMzEsIDE1LAorICAgIDE1NiwgNTIsIDYwLCA4OSwxMjEsIDc0LDI0MywgODQsMjAxLDEwNSwyMTgsMjMzLDEzMCwyMTEsMTQ3LDEwMywKKyAgICAyNDIsMjA3LDE0MCwxNTcsMTQ5LDE1NywxMjUsMTI2LCA0NiwyNDksMjIwLCA5NiwyMTksMTYyLDE4MiwxMjMsCisgICAgMjMxLCA5OSwyMDYsMjIzLDEwNiwgMTUsMTExLDIzOSwxODYsIDE2LDExNiwyMjUsMjEwLCA2OSwyNTUsMTM5LAorICAgIDIzMSwgNTksMTg4LCA1OSwyMDYsIDkyLDI0MiwxODQsMTE2LDI0MiwxNzgsMjE5LDIyOSwgMTksIDg3LDE4NCwKKyAgICAgODcsMTU0LDE3NSwgNTgsIDk1LDEwOSwyMzQsMTE2LDIzNCwgNjAsMjU0LDE0NywyMTEsIDc5LDE5OSwxODcsCisgICAgMTU2LDE4NywxNTQsMTc0LDE4NSwgOTIsMTA3LDE4NSwyMzgsMTIyLDE4OSwxODEsMTIzLDEwMiwyNDcsMjMzLAorICAgICAyNywxNTgsIDU1LDIwNiwyMjEsMjQ0LDE4OSwxMjEsMjQxLCAyMiwyNTUsMjE0LDIxMywxNTgsIDU3LCA2MSwKKyAgICAyMjEsMTg5LDI0MywxMjIsMTExLDI0NywxOTcsMjQ3LDI0NSwyMjMsIDIyLDIyMSwxMjYsMTE0LCAzOSwyNTMsCisgICAgMjA2LDIwMywxODcsMjE3LDExOSwgMzksMjM4LDE3MywxODgsIDc5LDE4OCwgOTUsMjQ0LCA2NCwyMzcsIDY1LAorICAgIDIxNywgNjcsMjIxLDEzNSwyMTMsIDYzLCA5MSwyNTQsMjIwLDIxNiwyMzksMjIwLDEyNywxMDYsMTkyLDExOSwKKyAgICAxNjAsMjQzLDIwOSwyMjAsIDcxLDI0NywgIDYsMTMzLDEzMSwyMDcsMjU0LDE0NSwyNDUsMTQzLCAxNSwgNjcsCisgICAgICA1LDE0MywxNTMsMTQzLDIwMywxMzQsIDEzLDEzNCwyMzUsMTU4LCA1NiwgNjIsIDU3LCA1NywyMjYsIDYzLAorICAgIDExNCwyNTMsMjMzLDI1MiwxNjcsIDY3LDIwNywxMDAsMjA3LCAzOCwxNTgsIDIzLDI1NCwxNjIsMjU0LDIwMywKKyAgICAxNzQsIDIzLCAyMiwgNDcsMTI2LDI0OCwyMTMsMjM1LDIxNSwyMDYsMjA5LDE1MiwyMDksMTYxLDE1MSwyNDIsCisgICAgMTUxLDE0NywxOTEsMTA5LDEyNCwxNjUsMjUzLDIzNCwxOTIsMjM1LCAyNSwxNzUsMjE5LDE5OCwxOTQsMTk4LAorICAgICAzMCwxOTAsMjAxLDEyMCwgNTEsIDQ5LCA5NCwyNDQsIDg2LDI1MSwyMzcsMTkzLDExOSwyMjAsMTE5LCAyOSwKKyAgICAyMzksMTYzLDIyMywgMTUsIDc5LDIyOCwxMjQsIDMyLDEyNywgNDAsMjU1LDEwNCwyNDksMTc3LDI0NSwgODMsCisgICAgMjA4LDE2NywyNTEsMTQ3LCAyNSwxNDcsMTQ3LDI1NSwgIDQsICAzLDE1MiwyNDMsMjUyLCA5OSwgNTEsIDQ1LAorICAgIDIxOSwgIDAsICAwLCAgMCwgMzIsIDk5LCA3MiwgODIsIDc3LCAgMCwgIDAsMTIyLCAzNywgIDAsICAwLDEyOCwKKyAgICAxMzEsICAwLCAgMCwyNDksMjU1LCAgMCwgIDAsMTI4LDIzMywgIDAsICAwLDExNywgNDgsICAwLCAgMCwyMzQsCisgICAgIDk2LCAgMCwgIDAsIDU4LDE1MiwgIDAsICAwLCAyMywxMTEsMTQ2LCA5NSwxOTcsIDcwLCAgMCwgIDAsICA1LAorICAgICA2OSwgNzMsIDY4LCA2NSwgODQsMTIwLDIxOCwyMzYsIDkzLCA2MSwgNzYsIDIwLCA2NSwgMjAsIDYyLCA0NywKKyAgICAgNTIsMTM2LDIxNiwxNDQsICAwLCA0OSwgODgsIDMyLCAgOCwxNDEsMTk4LCA0MywgIDUsMTcyLCA2MCwgNjcsCisgICAgIDM3LDEzNywxMzIsMjI4LDEwOCwxMzYsMjA4LCAyNSwgNDAsICAxLCA0MSwxNDAsICA5LDE2OCwgIDksICA1LAorICAgICA2MywxNTAsIDk4LCAgOSwgNjYsIDM1LDEzNywxMjksICA0LCA0MiwgIDUsIDU5LCAxNCwgNzQsMTM2LCA1NCwKKyAgICAgMzAsMTYwLDE5NywgMTcsMTQwLCAzOCwgNTIsMTM4LCA3MSwxMDcsIDQ5LDI0MywxNzMsMjM4LDEyMiwxOTksCisgICAgMjM4LDIzNiwyMDUsMjIzLDIzOCwyMDQsMjE1LCAxMiwxNzYsMTAwLDEyNywxOTAsMTIxLDI1MSwxODksMjQ3LAorICAgIDEwMiwyMjIsMjA0LDE1OCwyMzUsMTg0LDE4MSwxNzYsMTc2LDE5MSwxNTEsIDQ4LCAgNCwgNTMsMTU3LDE2NCwKKyAgICAgNzcsMTI3LCAzMywxMDksMTI2LDEzMywxODAsIDkxLDIxNSwxMDAsMjIzLCA3MywgNjksMTg4LDEzNywxMTAsCisgICAgMTUzLCAzOCwxMDksMjE1LCA1MSwyNTAsMTIzLDE0MywyNTEsMTIwLDE2MSwxNDUsMTgwLCA1OSwxMzksMTY0LAorICAgICA2MSwyMzcsMTgxLDE5NiwxMzUsIDY2LCA0MiwgNjksMjE4LCA3NiwgMTksMTgxLDI0MCwxMDYsMTIyLCA5NiwKKyAgICAxNzAsMjQ4LDI1NSwxNTksMTY3LDEzMiwxMTksMjA5LDIyNywgNzUsMjEwLDIzOCwgNTIsIDI1LCAxNSwxMzksCisgICAgIDMwLDE5MCwgNzIsMjE4LDEyOSwgIDEsMTgzLDE2NCwgIDQsIDY5LDI1MCwgMTcsMTA1LCAyNywxMjYsIDg4LAorICAgIDIyNiwxMzksMTYyLDE0NiwgOTAsMTA0LCA5NSwxNTAsIDE4LCA3OCwgNDUsMTg2LDEwMSwxMzgsMjA3LDI0OSwKKyAgICAyMzksIDU1LCA5MSwyMjYsMTM5LCA3NCwyMDAsIDY4LCA1NSwxMDUsMjE5LCA2MywgMTAsMTIyLDEzMSwxNjYsCisgICAgMjIwLDIxNSwgNTEsMTQyLDEyMCwgODgsMTE4LDE2NiwyMTcsIDQ1LCAzMywyMDgsMTAwLDIwOSwxMjgsMTQzLAorICAgICA0OCwxMzQsMTIwLDEwNCwyNDMsMjQwLCAgNSwxODMsMjQ2LDE3MCwxODYsMTQzLDE3NCwgNzUsIDQ5LCAzOSwKKyAgICAgMzAsIDc4LDIzNywyMDEsIDUwLDEwNSwgNDcsMTI3LDIxNSwyMjcsMTkwLDExMCwyMzksMTg1LDIyMywxOTIsCisgICAgMjE2LDEzMiwxNDcsMTA5LDE1OSwgNzIsMjE5LDE5MSwxNzIsMTY3LDIyOCwgNjUsMjE4LCA1MCwyMTUsIDczLAorICAgICA1OSwgMzEsMTE3LDEzOSwxMTksICA4LDIyMywxNDAsMTM0LDExNSwxMzUsIDUxLCA3MSwyNDgsIDI2LCA1NywKKyAgICAyMjYsMTYzLCA3MCwxODQsIDIzLDIwMCwxMjgsIDM1LCA2NywxMjQsMjEyLCAgOSwyNDcsMTM0LDE1NSwxMjAsCisgICAgIDMwLDEwOSwxMzcsMTM1LDIxMSwxNDAsIDU4LDIyNSwyNTUsIDg5LDI1NCwgODgsMTg1LCA3OCwgODcsIDE2LAorICAgIDI0MSwgNzgsIDg4LCA4OCwxNDksMTM2LCAzNywyNDAsMTI0LDExOSwgNzAsIDUzLCAzNSwxMjYsIDk2LCA4MCwKKyAgICAxMTAsMTk0LDE2MywgNTgsMjIwLDEwMCwgMjksIDI3LDIyNiwgNzgsIDYwLCA1MCwgNzcsIDkzLDIyNiwxMTIsCisgICAgMTA1LDIyNSwxMDIsMTc5LCAzNCwyMjYsIDQ5LDE4MiwxNjEsIDQyLDIxMSwgODQsMTQxLDIxMiwgMTMsMjE0LAorICAgIDExMiwxNzksIDc2LDIyNiwxNTcsMjA5LDE5NCwyMDUsMTMyLCAgNSwxNDcsMjI5LDE1MSwgNzMsMTI0LDIxNSwKKyAgICAxODQsIDI1LCA5MCwgMzAsIDIwLDE0NCwgODgsMjU1LDExMiwgNTEsIDM2LDI0MSwgIDgsIDE5LCA3NywxNDksCisgICAgIDIyLCA5NSwyMDMsMTExLDI0NCwgMTEsIDU1LCA2NywgMTgsIDQ3LDExMSwxOTQsIDMyLDIxOCwgNzgsMTgzLAorICAgIDExNiwxODQsMjAxLCA3MiwgNjAsMTU2LCAgNywxNzUsIDI1LDE1OSwxODQsMjI3LDIzOCwgODgsMTY5LDExMiwKKyAgICAxNDcsMTQ1LDEyMCwxMjYsIDk5LCAyMSwxMDIsMTYxLDEyNywyMTksMjUxLDE1MSwgMTAsIDcwLCA3NSwxNzUsCisgICAgMTgyLCAzNiwxMzQsICAxLCAyMCwxNjIsMjI5LCAyMywxMDUsMTE1LCAzNSwgIDEsIDQ1LCAzMCwgIDUsIDY0LAorICAgICAyMiwxMDEsIDkwLDI1NCwgODYsIDY0LDEzOSwxMzUsIDU0LCAzMywgNjUsMTc2LCA0MCwgMTUsIDc4LCAzNywKKyAgICAgOTEsIDgzLCA2OSwxNzYsMTQwLDIxMiwxMzAsIDEzLCAgNSwgOTAsMTQ1LDE1MCwxNjMsMjI1LDI0NiwyMjUsCisgICAgMTM4LDI1MSwxMjAsMTI2LDIwMCwxMzUsMjQ4LDI0NCwgIDEsMjUzLDE2MSwyMDEsMTQ2LDEyMSwgMjIsMTc4LAorICAgIDExNiwxMDYsMTEyLDEzMSwxMzQsMjE3LDEzNSwxMjYsMTYzLDE3OCwgMzUsIDIxLDEwMywgMzksIDcyLCA1MywKKyAgICAyMDMsMTUwLDIxMiwxNzksMTM2LCA5NCwxNjMsMTUzLDI1MSwyNDEsIDY3LDIxNCwgNTEsMTQ4LCAzMiwxOTAsCisgICAgMTE3LDIxOCwgOTAsMTIyLCA0OSwyMzMsMTUyLDE1NywxNjUsIDE4LDIxMCwgOTQsMjM4LCAyNSwgNzUsIDY4LAorICAgICA1MywxNjksIDg3LDE1MCwyMzYsIDY4LCAzNCwxNDUsMjAwLDIxNSwxNDUsMjQ2LDI0MSwgNTAsMTk0LCA2NCwKKyAgICAgOTQsMTAzLCA3OCwxNTgsIDI5LDExOSwxNTQsIDc4LDI0OCwyMDQsICA5LDEwNSwyNDksMTUxLDExMSwgMzksCisgICAgMTM5LCAzOSwgNzQsMTY2LCA3NSwxMzgsIDU2LDE5NCwgNzUsIDE2LDIyMywyNTAsIDM0LCAyNiwxOTYsIDI4LAorICAgIDE5MSwgMTksMTE1LDEyNiwxMDQsMTg0LDI0OCwgIDUsIDEwLCAzMCwyMjYsIDI3LDIzOCwxMDUsMTEwLDEzNywKKyAgICAxOTEsIDQxLDI0MSwyMzksMjQ5LDE1OCwxMjcsMTAzLDE1MSwxODMsMTM0LCA1MSwgMTgsMTc1LDIxOSwxMzIsCisgICAgMTM0LDE1MSwyNDAsMTk1LCA5MCwgNDksMjE1LCA4OSwyMTgsMTUxLDI1MywxMDAsIDczLCA2MSwxNTcsMTcwLAorICAgICA0NCwxOTQsIDE3LDE0MywxMzksMTQ2LCA0NiwyMzAsMTY4LCAzOCwyMzgsMTMyLCAgMywxODcsMTMxLDE3MCwKKyAgICAxNTgsIDUyLDE2OSwgNzEsIDUyLCAzNSwxNTUsMTEyLCA3MSwyMTksMTE5LCAyMCwgMTksMTExLCAyNiwyMjUsCisgICAgIDU3LDIyOSwxMTUsMTk3LCA3MywxNzksICA4LDExOSwgMTgsMTY0LCA5MCwxOTUsMTM2LCA4NywgNzcsIDU2LAorICAgIDExMiwgOTAsIDQ4LDE0MCwxMjAsIDM2LCA0MCwxMzUsMjAyLCA0NSwyMDYsIDQ4LDIyNiwgODEsMTA1LCA4NSwKKyAgICAxODUsMTA0LDEzNywxNTEsIDEwLCA4NCwgOTAsIDk3LCA4NSwxNTksMTg1LCAyOSwxNjAsMjAwLDE4NSwxNzAsCisgICAgMjM4LDEyOCwxNTAsIDE5LCA2NywxMzcsIDg3LDIyMSwgIDEsIDEzLDIyMywgNTIsIDMzLCA2MiwgOTUsMTExLAorICAgICA4NiwgIDcsIDk2LCA3NiwgNzQsMjIyLDE2NiwgMTcsIDM3LDEzNiwxNTEsMTgzLCA3OSwxMzksIDk0LCAyOSwKKyAgICAxNDQsMjIyLCA4NywgNzYsMTg4LDE0NywgODgsMjEyLDE1MywyMTMsICAxLDE2OCwgMjMsMTQ2LDIzOSwyMjgsCisgICAgIDYxLDE5NiwyMDMsIDMxLDE2NSwgODMsMjE5LCAgMSwyMDYsIDcwLCA2NSwyMjcsMTM4LDEzNywyNDcsIDIyLAorICAgIDIyMiwxMDQsMjE5LCAgMSwxNzUsIDU3LCA3NSwxNDIsMjM0LDE0MSwxMzAsIDYyLCAxNSwyMzMsIDI5LDI1MywKKyAgICAxNjIsICAzLCA2OCwgNDUsMTEwLDIzNSwyMDcsMjAyLDE0NiwgMzAsMTc1LDE5OCwyMTUsIDM5LDE0MCwgIDYsCisgICAgIDU4LCAyMCwgMjksIDMyLDE0MSwxMjAsIDY4LCA1NSwxODYsIDU2LCA4OSwgODUsMTI4LDIxMSwyMzcsIDE5LAorICAgIDI0NiwgIDYsMTQ4LCA3MiwxNjAsMjI4LCA3NywyNTAsMjM0LCAxMywyMzYsMjE4LCAgMSwyMjMsMTk0LDE5MCwKKyAgICAxNDQsMTUyLDE0NSwyNDgsMTA4LDIxNCwxNDYsIDk0LCA3NiwxMzAsMTc2LDE0NSwgODEsMTIyLCA4NCwgMTYsCisgICAgMjQxLCAyNCwxODIsMjEzLCA0NSwxODgsIDg0LCAxMywxMDMsIDM3LCA1NSwxNzMsIDQxLDE1NywyMzIsMTEzLAorICAgIDExOSwgNjgsMTEyLCA3MywyNDIsIDQxLDIxMSwgNzAsMTg5LCA3MywxODYsMjExLDE0NiwgOTQsIDEyLDE0NCwKKyAgICAxNTgsIDEyLDI1MywgNjEsIDY3LCAzOSwxMjAsMTE0LDExNiwgMzEsMjA0LCAyOCwxNDksIDQwLDIwNCwxMjAsCisgICAgIDk3LCAzNCwxNjgsMjQwLDE5MiwxMzUsMjQ4LDE0MSwgNDMsMTQ4LDEyMCwyMDMsIDQ5LCAxOSwxNTYsIDUzLAorICAgICA3OSwgMzcsMTQyLDE3NSwxNjUsMTI0LDEzNiwxMzUsMjEyLDIyOCwxODIsMjIxLCAzOSwxODAsICA4LCAgNywKKyAgICAgODgsMjUyLDEyMiwgODUsMTkyLCA5NywgOTcsMjM1LDEwOCwyNDksIDk2LDIzMywgNDMsMTk0LDI0NiwxMjgsCisgICAgMTk2LCA5OSwxNTUsMTExLDIzNSwxMDgsMTk1LCAgMSwxMjEsMjA5LDIyMywyMzcsMjEwLCAyNSwgMzksIDY2LAorICAgICA4NiwxNTksIDkwLCAxOCwgNjcsIDg5LDI1MCwxMjYsMTkyLDExMiwyMTAsIDkwLCA2MiwgMzEsMTYwLCA1NCwKKyAgICAyNDMsMjU1LDEzMiwgNTIsMjI4LDIxMiwyMjMsIDkyLDE1NSwgMzcsIDUzLDEzNiwgMTksMTk3LDIyNiwxODAsCisgICAgMTkyLCAgOSwxNDgsIDMxLDIwOCwxMzEsMTM2LDI0MywgNDUsMjIwLDI0OCwxMTIsMjEzLCA3OSwgMjUsMjAyLAorICAgIDE1NiwyMzYsMTM0LDExOCwgMjEsMTIyLCA0NSwyMTcsMjU1LCAxOCwxODksIDYyLCAyNSwxMTQsMjAwLDEyOCwKKyAgICAyNDUsIDY2LDEwNywyMTQsMjMzLCAxOCwgNjcsIDYwLCA2NCwxODQsIDQwLDE1MiwxMjAsIDM5LDE5NSwxNTcsCisgICAgIDUyLCA5MSwxMjIsIDgwLDEyNSwgMjgsMTg4LDIzNiwxNTUsMTE1LCA5MywyMDUsIDkyLDE4NywxNTMsIDgxLAorICAgIDIwNywgMjcsMjMwLDEwNiwgIDUsMjA2LDE5NiwyMjcsIDIxLDEyMywgNTcsMTA3LDEzNCwyNDYsIDM1LCA5MiwKKyAgICAxMDAsIDQ3LDE5NCwgMjEsIDg0LCA3MywxMzQsIDI3LCA2NSwxMzgsIDI4LDIxNSwxMTIsMTEzLCA0MSwyNDQsCisgICAgIDYyLCA2MiwxMzAsIDc1LDI0OCwxNDQsMTEyLDE5MywyMzMsMTk2LCA0NSwgOTIsIDEyLCA5NSwgIDgsIDM4LAorICAgIDE2OSwxMTgsIDE4LDIwNiwgMjMsMTc1LDEwMiwyMTIsMTk1LDE5NywyMTMsMTYzLDExNCwyMDcsIDM2LDE4NSwKKyAgICAxMDQsMTE3LDE5MCwgNjEsMjE4LCAyOSwxOTIsIDQ3LCA5OSwgODcsIDg0LCA0NSwxNDAsIDE0LDEzNiwxMzgsCisgICAgICA0LCAzMywgOTIsIDIwLDE5MCwxMjMsMTM1LCA0NCwgNjQsMTMwLDIzMCwgNTgsIDUyLDE4MywyNDQsMTU1LAorICAgIDE4OCwyMDcsMTY4LDIwMSwgNzEsIDIyLDIyNSwxMzIsMjQzLDE4MCwxMzIsIDE0LCAyNywyNTQsMTcxLCA5NCwKKyAgICAyMjYsMTkxLCA2NSwxMDMsMjIwLDE0MiwxODUsIDg3LCAyMSwxMDcsMTgyLDE3OCwgMjcsIDk3LDE2OCwxNzksCisgICAgIDQ5LDE0MywxNjIsMjQ1LDE2OCwgIDgsIDIzLCA4NywxOTksIDY5LCA5MywgNjUsMjExLCA3OSwyMDYsIDMzLAorICAgICA3NiwxNTUsMjQ5LCA3MywgOTAsMjE3LCA5OSwgNjUsMTg0LDE1OCwxODAsMjUzLDEwNiwxMTYsICA1LDE5NCwKKyAgICAxODMsMjMxLDIyMSwgOTgsMjIzLCAgNCwgNzYsMjA5LDEwOSwgNzYsMTM4LDEyNiwxNjIsMTM2LDEyNSwgODYsCisgICAgIDIwLCA4MiwxMzIsIDU1LCAgMSwgNzgsMTUzLDIxNSwyMDgsMTMyLDE4OCwyMzcsIDgzLCAzNCwyNTQsIDMzLAorICAgICA5MywgNTYsMTAxLDI0OCwgIDQsIDcyLCAgNCwxMDcsIDcxLCA0MCwyMjMsIDQwLCA0MCwxNzAsMTI4LCAyMiwKKyAgICAgNjcsMTQ2LDE4OCwgMjksMjI1LCA1NSwgOTAsIDQyLDEyNywxNjMsMTYwLDE1MiwxMjYsIDQ0LDIyMSwyMzMsCisgICAgICA4LDI0OCwxMzYsMTgzLDE2NCwgNzcsMjA5LDEzMiwxNzMsMTQxLCAzOCwxMTIsIDg4LCAgMSwxMTUsMTI0LAorICAgICAzNiwyNTEsIDE0LDI1NSwgMTIsICAwLDExMiwxODYsMTM3LDI0MiwyMzUsMjAxLCAyMCwxNTcsICAwLCAgMCwKKyAgICAgIDAsICAwLCA3MywgNjksIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX2Fycm93X3JpZ2h0X3BuZ1s0MTQ3XSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsIDQ3LCAgMCwgIDAsICAwLCA4NywgMTYsICA2LCAgMCwgIDAsICAwLDE5NiwxOTgsMTkyLAorICAgICA2NywgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDUsCisgICAgIDk0LCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwxNTcsIDU5LCA3NiwgMjAsIDY1LCAyNCwxOTksMTk5LAorICAgICAxMSwxNDEsMjQ4LDEwNCwgNzIsMjA4LCAyNCwgNDAsICA0LCA2MSwgMjYsMTQxLDEwMywgMzksMTY3LDE0OSwKKyAgICAgMjQsIDQzLCA3MiwgMzIsIDM4LDIxNiwxNDQsMTIwLDE1NywxMjksIDIyLDIwNiwxOTQsMTY4LDEyOCwgMzgsCisgICAgIDIyLCA2MCwgNDQsMTk3LCAxOCwxNDksIDcwLCAxOCwxMzEsICA5LCA4NCwgNDIsMTE4LDEyOCwyMjksIDMzLAorICAgICA1MiwyNDIsMTc4LDEyOCwgOTYsIDQ4LDE2MSwgODEsIDMwLDE3MywxOTcsMjA0LDEyNywxNDMsMjIxLDEyMywKKyAgICAxNzYsMTgzLCA1OSwxNzUsMjIxLDE1MywxNzUsMjQ5LCAgMiwgIDcsMjUxLDI0OCwxMjUsMTc5LDIyMywgOTksCisgICAgMTE4LDIzMCwxODcsIDE5LCA1NSwxMTEsMTg5LDEyNywxOTEsMTgyLCA3NCwgMjAsIDczLDI0MywgNTAsMjEzLAorICAgIDI0NSwyMzcsIDg0LDIwNywgNTQsIDgwLDE4OSwyNTEsMTUzLDE5NiwgOTIsMTcwLDIxMiwxNTYsMjQ2LDIyOCwKKyAgICAgIDQsMjEzLDE1NywgMjMsMTY5LDE3NCwyMDYsIDgyLDIyMSwxOTQsIDYyLCA5NSwyNDksIDc4LDI0NSwyNDQsCisgICAgIDUxLDI0NiwxMTUsMTU5LCAgNSwyMDcsIDY5LDIxOCwgIDYsIDI0LDI0MCwyNTMsMjI2LDE1OSwgMzksMTM1LAorICAgIDE2OSwyMzgsMTAxLCA2MywyMzksMjIyLDE2MywxMjIsMTE0LDE1NywyMzQsIDkyLCA0NiwyMzQsMjI0LCAxOSwKKyAgICAxMTQsIDc5LCA4NywxMTUsMTUxLDE0MSwyMzYsMTA4LDE3NiwyNTUsMjM1LDIzOCwxMDIsICA2LCA1NywyMDMsCisgICAgIDEyLCA1MiwgOTgsMTkzLDI1MSwxNDYsMjA0LDExOSwgNjIsMTk5LDExMywxNTgsMTM2LCA1MSwgODQsIDYzLAorICAgIDE1MiwxMTksMTg3LCA0OCwgMTEsMTU4LCA3MywgNDIsMjI5LCAgNiwxOTgsIDkxLDIxMCwgNzUsIDg0LDE5MSwKKyAgICAyMzYsMTEyLDE1OSwyMDcsMTIwLDI0MCwxNTcsMTQxLDExNCwyMDYsIDgzLCA2MSwyMjUsMTE4LCA3MywxNTcsCisgICAgMTUxLDExNiwxMjUsIDE4LCAgNCwxMzEsMTExLDE4NywyMjQsMjQ2LDIwOSwxNzgsICA1LDE3NywxNjQsMjQ3LAorICAgIDE4MCwyMTgsMjM1LDE0NCwgIDYsIDMwLCAzNSwyMzYsMjQ2LDE3MCwgMzAsMTgzLCA4OSwxOTEsIDY3LDI0NSwKKyAgICAxNDcsIDQxLDE3MCwyMzUsMjU0LDE5NiwgMjAsMTI0LDEwMywxMzEsMjUxLDIwOSwyMTUsIDY5LDExMiwgNjEsCisgICAgIDc5LDE2NywyMjAsICA1LCA5MiwyMjgsMTkzLCAzNSwxODksIDY3LDE3NiwyMTEsIDkzLCA1MCwxMTUsMTcwLAorICAgICAxMiwxOTIsIDI1LDEyNCwyMTksMjQzLDEwNCwxMDIsMjEzLDI0MiwgMTMsMTkyLDE2OSwxMTQsMTk3LCAgNSwKKyAgICAgMzksMjMxLDE2MiwgOTMsIDc5LDE5NCwgIDAsMTMyLDIyMSwyMDcsMTk0LCAyMSwgNzcsIDcxLCA2MCwxMzAsCisgICAgMTA0LCA5MSwgNjMsMTM3LDE0OSwxOTIsICAwLDIyNiwxMzAsMTEyLCA3MiwyNDAsMTE5LCAzMCwyMzMsMTUwLAorICAgIDE2NiwyNDEsMTQ5LDIyMiwgODMsMTYyLDIzOCwgNDcsIDMyLDEyMCwgOTIsMTM2LCA0NiwyMzMsMTYyLDI0MCwKKyAgICAxMzAsMTcyLCA3MSwgMTksMjQwLDE2OCwgIDgsMTcxLCAzOSwxMzYsIDE3LDEzMCwgNTgsICAwLDI0NywgNDUsCisgICAgIDI5LCA2MCwyMTAsMTk3LDIxMiwgNTMsIDk4LDE2NCwxNjAsIDE4LCAxNCwgNjMsIDIzLDE0OCwgIDgsIDU0LAorICAgIDIxMCwgNzcsMTUxLCAgNywxMTUsMjM4LDIyOCwgNjYsIDI0LDEyMCwyMzEsIDIxLDIyMSwxNDIsMTMzLDEyNiwKKyAgICAyMTIsMTk3LDIyNiwxMzMsIDE0LDExOSwyNDAsMjIyLCA4NywxMTYsIDg2LDEzOCwxODcsMTU4LDIwMiwyMTEsCisgICAgMjA2LDEzMiwxOTEsMTE2LDIwOSwxNDgsIDMyLCAyNiwgODQsMjM4LCA5NSwyMjYsICA0LCAzMCwyMzMsIDk4LAorICAgIDEwNywxOTEsMTMzLDIzNCwgNDMsMjMzLCAyNCwxMTgsIDM5LCAzMSwxMjksMTkzLDI0MywxMjIsIDY5LDEwMywKKyAgICAxNTQsMjQ4LDE1OSwxNzEsMTcwLCA0MiwxNTgsIDQ2LCAzOCwyMDcsIDg4LDEzNiwxNjEsIDcwLDI1NCwgNjMsCisgICAgMTcwLCA3NSwgNDcsIDc1LDI0MSwxNDAsMjQ4LDIwNCwxMzAsMTMzLDE5OSwgMzcsMjMyLDExMCwyNDgsMTE2LAorICAgICA1MywgNDUsIDQ5LDE1OSwxMTUsMTQ1LCA0NSwgNDAsIDQ4LCA3NSwyNDMsMTAwLDIyNCwgNTUsMTA3LDE2OSwKKyAgICAxNTgsIDI1LDExNiwyMzUsMjIwLCAzNCwyMTMsICA3LCA5MywgMjIsMTAyLCAxNiwgNzMsIDQ3LCAzMSwyMjcsCisgICAgMjI3LDIyNSwxMzksIDg2LDE4OCwxNTksMTkxLDExOCwxMDcsMjI4LDE3MSwgNDUsMTA3LDIzNiwxOTIsIDc1LAorICAgICAyMiwxMTAsMjE3LDE5NCwxNzksMTUzLDIzNCwyMzMsMTQzLCAzMywxNjcsIDEyLDE4MiwyMTYsMTQ3LDI0MSwKKyAgICAgNTQsIDc3LDI0NSwgOTksMTE4LDE5MiwyNDksMTcxLCAyMiwxMTQsMTg1LDE4MCwxODgsMTc2LDE5MiwgMTAsCisgICAgIDU3LCAzMSwxNDMsIDg1LDE4OSwgNDgsMTk2LDIzMiwgNjMsMjM1LDE1NCwxMzgsIDczLDIxMSwgIDgsMTAzLAorICAgIDI0MCwgOTQsMTI5LDIwMywxMjIsMjA0LDIyMiwyMjYsMTExLDE1OCwxNzksMjA4LCAgOSwgMzMsIDM2LDI0NSwKKyAgICAgNzAsIDQ4LDEyMCwyMDAsIDMzLCAyNywyNDEsMTYzLDEyMywyMTQsICAwLCA3MSwyNDMsMTIzLDIyNSwyMjQsCisgICAgIDc1LCAyNSwxOTIsMTE2LCAyMywxNDgsMTU5LCA4MiwxNDQsMTgwLDExOCwgMTgsICA2LCAyNCwgMjcsIDE5LAorICAgIDExNSwxMjQsMTk2LCAyNiwyMjEsIDEzLDIxOSwyNDQsIDc0LCA1MCwxMjAsMTExLCAxMiwyMjQsMTU3LCAgNSwKKyAgICAyMzcsMTI2LCA5NywgNzksMjE0LDE5MCwyMjIsICA2LDE2OCwxMDcsIDg3LCAgNCwgMzAsIDUwLCA1MSwgMzIsCisgICAgMjMwLDE4NCwgNzIsMTE5LDExNywgNTMsIDY0LDEyNiwxMjIsIDkzLCAxNywxMjAsMTg0LCAgNiwgODEsMjQ5LAorICAgIDE5MSwxNzQsICA2LDIwMCwgIDcsMjE3LDEzMiwyMTgsIDExLCA4OSwyMzYsIDE3LDEyMywxMjQsMTI1LDE1OSwKKyAgICAgIDAsMTk3LDIyNCwxMDEsMTA5LCAzNCwyMTEsMjA1LCAgMCwyMDEsMTQ1LDEzMiwgMzAsMjQ2LCA5NSwyMDEsCisgICAgMTU0LDEwMiwgIDAsIDc3LDE5MiwgOTksMTE4LCA4NCwxNTAsMTY4LCA1NSwxMjgsIDM4LDIyNCwgMTUsIDE1LAorICAgIDIxMiwxNTYsIDg3LDE1NywgIDEsIDUyLCAgMSwxNzUsIDkwLCA5NiwgIDAsIDgxLCAgNSwgOTQsMTYxLCA4NCwKKyAgICAgODksMjMyLDEzMiwgMjgsIDg5LCA2MywxOTYsIDU0LDE2OSwxNDUsIDI5LCA1OSwyMjYsMTY1LCAgMCwxOTksCisgICAgMTc0LCA2NCwxMjEsIDQzLDIyOSwgNTIsICAxLDE1OSwyMjAsIDUxLCAgNSwxODQsMTAyLDIyNCwyMzUsMTI2LAorICAgIDE1NSwgIDIsIDkyLCAxOSwyNDAsMTIwLCAzNywgMzgsMTIyLDEzNywxNjAsIDYyLDE5MiwgODksMjUwLDEyNCwKKyAgICAgOTQsIDQ5LDEyMCwxODgsIDUyLCA1NSwgIDUsMTg0LDE0NywgNjIsMTE5LCA0MSwgIDIsIDE1LCAzMiwxNjIsCisgICAgIDU0LCA1NiwyMzIsIDEwLCA2MCwyNTUsIDM4LCA3OCwgODEsIDU4LDIzMywxNzIsIDY2LDIyMiwgNTUsICAzLAorICAgICA1NiwgMzYsMjIzLDI0MiwgNzUsIDUwLDEyMCwyNDgsMjQ0LDIxNCwgNDEsMjA2LDE5MiwyMjMsIDQ5LDIyNCwKKyAgICAgNjgsIDc5LDIyNCwgNzgsMTYxLDI0NiwgNzMsIDUwLDEyMCwxNDAsMTk2LDIwNCwxODgsMTUyLDIyNywgNzEsCisgICAgMTAxLDE2NywxMzgsIDUxLCAzOSwxODEsIDQ1LDIwMSwxOTksICAzLDE4NCwyMzMsIDkxLDEyMSwxMjYsMjQ2LAorICAgICAgOSwgMzAsMjQxLCA3OCwgIDksMjA2LDE4NiwxMjAsMTY0LCAxMiwgOTUsMjM0LDEzNSwxNjAsMTIyLDIxNiwKKyAgICAgNDYsICA4LDE4OCwyMTEsMTgwLCAxMywxOTMsMjA1LDE3NCwxNzMsIDM2LDEzMiwgMjAsIDkxLCAzOSwyMDcsCisgICAgMjAxLDIxMywgOTYsMTUzLCA1NSwgMjYsMjQxLDIxNiwyMjEsMTI5LDExMCwxNTMsIDQ3LDEzNiwxMDksIDIxLAorICAgIDE0MiwxMjAsMTg0LDE0NCwyNDQsIDE1LCAgNiwxNTYsMjQ1LDEyOSwxNzIsIDY1LDIwNywgNDksMTg3LCA3MywKKyAgICAxNzMsMTA0LDI1MCwxODQsMjQ1LDE3NiwgIDQsMTIwLDE2NywxMTYsMTI3LDIzMSwgNDYsMjI1LDIzNSwyMTcsCisgICAgMjM5LCA0OSwxMzcsMTQ5LCA2OCwyMjIsMjIxLDIzMiwyMDksIDg2LDEzOCwgMTAsMjQ2LCAyMywgMjAsIDEwLAorICAgICAgMywxMjcsIDYxLDE5NywyNDIsMTA3LDIzNiwyNDIsMjM1LDE4MiwyMDgsMTIwLCAgOCwxMjIsIDM3LDE0NywKKyAgICAxODEsIDE4LCA2MiwyNTQsMjM1LCAxNiwyMTMsMTE4LDEyMSwgNTMsMTY3LCA5NiwxNTQsMjQ1LCA4NiwxNzAsCisgICAgIDM3LDE5MiwgOTksMTA5LDIyNywyMjgsIDQ3LCAxMSwgNzcsIDc2LCA0OCwgNjEsIDM4LDE3MSwgNjUsIDQzLAorICAgICA0MCwgODksMjAzLCA0NSwyMjYsIDI2LCA3NiwxNDMsMTExLDE2OSwgODUsIDM0LDE1NywgNjgsMjUxLDExMiwKKyAgICAgNDMsMTQ5LDIwMSwyNDQsMTYwLDIyMywxOTEsIDc2LDE0OCwgNzksMjQ4LDIzNywyMjIsIDM4LDIyMiwgMzUsCisgICAgMjIxLDEwMywgIDEsMTMzLCA4NSwxODksIDU0LDIzMiwxNTAsMTUxLDI0MSwyMzAsIDc0LDI1NSwgMzUsMjI1LAorICAgIDIwNywxNDYsMjIzLCA0NiwgOTEsMTg0LDIyOSwyNDIsMjQ0LDIwMiwxOTEsMjA5LDE5MywyMzEsMTQ4LCAgMSwKKyAgICAyMTAsMjA1LDI0OCwxMjcsMTE5LDEzNSwgNjMsMTI5LCAgNywxNTIsIDEyLDI1MiwyMzQsMjEwLCAzOSwxMjAsCisgICAgIDM5LDIyMSwgOTIsMTgzLDIwOCwgIDksMjAxLDIzOSwxMjQsIDE1LCA2MiwgMTYsIDQzLDE1NiwgMzYsMTk1LAorICAgIDE3OCwxMDYsIDgzLDIxMSwgNzcsMTg0LDE1MCwyMTcsMTYxLDE3NiwgNzEsIDEwLCA1NiwgNTksMjQ5LCA5NywKKyAgICAyMDUsIDQ0LDIyNCwgMjQsMjE3LDIyNywxMDUsIDk0LCA3MSwgMTIsICA4LCAzMCwxMzksIDYwLCA3NywgNzMsCisgICAgIDU1LCA5NSwxNDMsMTg1LCA5MywxNzQsIDUwLDI0MCwxNDQsMjAxLDE0MSwxMjAsMTY3LDE1NSwyMjcsIDU1LAorICAgIDIyMSwgIDMsMTQxLDE1OSwxMzIsICA0LDE0MywgMTcsIDE2LDE4MywxMTYsIDE5LCA3MywxMzIsMTgyLDIyMSwKKyAgICAxODAsMTU3LCA4MiwxMjEsIDU5LCAzMCwyMzMsIDM4LCA5MiwxMDMsMjQ4LDIyNCwgNDEsICA5LDEyNCwyNDAsCisgICAgIDEwLCA3OCwgNDcsMjI0LDExMSwyMTEsMTc4LDIwNiwgNDAsMTY4LDEyMywgNzEsIDg0LDIxMCwgNzcsMjI4LAorICAgIDIyNywyNDIsMTI4LCAxMSwgIDIsMjM5LDE0MCwyNTIsIDI3LDIwOSwgIDgsMTU0LDExMiwxNDUsMjQyLCA2OSwKKyAgICAgMTYsMTIwLDI0OCwyNTAsMjE3LCA5NywgNjEsIDY0LCAzNSwyMzUsIDY2LCAzNSwgMzUsMTEzLCA2NSwgODMsCisgICAgIDQ5LDEyMCwgMzksMjMyLCAxNCwxNjgsIDc3LCA1NSwyMjUsMjQyLDIwOCwxODQsIDcyLDE1OSwxNzUsIDM5LAorICAgIDE0OSwyMTIsMTc1LDEwMiwxMDIsIDgwLDIzOCwxMDksMjI1LDEyNCwxNjMsMTI3LDEyMSwgMjMsIDYyLCAxNywKKyAgICAgIDEsIDE1LCA2NSwxMjIsIDM4LDE3MCwgODMsIDE5LCA3MCwyNDYsMTM5LCAxNCwyMTMsMTkwLCA5MSwgNTEsCisgICAgMjQwLCA3OCwgOTcsMTk0LDEwNSwxNDIsICA3LDE3NCwgMTEsIDY1LCAxOCwgMzUsMTIzLDE3MSwxNTAsIDY4LAorICAgICA2OCwgMzYsMTc1LDE0MywxMzUsMTQzLDIwNSwxNzcsMTc0LCAyOSwxMjYsMTE5LDEzMiwgMjgsMTIwLCA0MiwKKyAgICAyMjgsMTc1LDE2NywxMTYsMTE3LCAzMywxNTQsMTMwLDI0NywxNDIsMjUyLCA4MiwyMjQsMTU3LDExOSwxNTIsCisgICAgIDExLCAzMCwyMDgsMTEyLCAzMywxNDUsMTU5LCAyNywgODIsICA0LCAzMCwgOTYsMTAzLCA4OCwgMTEsIDg4LAorICAgIDE4MCwxNDAsIDkwLCA5NiwyMzUsIDgxLCAxMCwyMTgsMTY5LDE5NiwxMTAsIDE4LDIzOCwyNTUsICAwLCAgOSwKKyAgICAyMjUsMTQ0LDE5MywxNTMsMTAzLDE3NiwyNDksICAwLCAgMCwgIDAsICAwLCA3MywgNjksIDc4LCA2OCwxNzQsCisgICAgIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX2Fycm93X3VwX3BuZ1szNDkzXSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsIDk4LCAgMCwgIDAsICAwLCAzMSwgMTYsICA2LCAgMCwgIDAsICAwLCA3NiwxMzcsMTk2LAorICAgICA4MiwgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDIsCisgICAgMjA4LCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwxNTYsMTg5LCA3OSwyMTksIDgwLCAyMCwxOTcsIDkzLAorICAgICA0MywgNzUsIDE3LDExNiwxNjEsMTMwLDE2NSwxNTMsMTYwLDIzMywgIDIsMTIzLCAgOSwgNDgsIDg1LDE2MCwKKyAgICAxNDIsMTc2LCA5MSwgODUsMjE0LDIzOCwyMzcsIDg2LDEzNywgMzQsMTYxLCAxNCwgNDEsMjU1LCAgMCwgMjcsCisgICAgIDY2LCA4OSwyMDAsICAyLCAxOCwgMTIsMTM2LDE0MywgNDYsMTA5LDE5NCwxNTQsIDc0LCA5MywgMjYsICAxLAorICAgICA3NSwxNzEsIDc0LCA4NCwxMDEsIDY1LCAgNSwgNzAsIDUxLDE4OCwxMjMsICAyLCA1NCwxMTQsIDE4LDIxOSwKKyAgICAyMzksMTk3LCA3OCwxMTQsMTI2LDIwMywxNDUsMTYyLDI0OCwgMzUsMjE1LDIzMSwyMTYsMTI2LDI0NywyMTcsCisgICAgMTIxLDIyOCwxODYsMTc0LDIzNSwxODYsMTUwLCA1MywgNTEsIDkxLCA0MiwxNTcsMTU4LCA4OCwxNTQsMTIxLAorICAgIDI0NiwgODcsMjMzLDE5MiwxMzQsMjQ3LDI0MywyMjUsMjE1LCA3NCwxNTksMjA2LCA5MSwxMzIsICA0LDI0MiwKKyAgICAxMTEsIDk1LDIzMywxOTcsMTU4LDI0NywyNDMsMjM1LCA1NSwgNzQsMTI3LDE0MywyMzIsMjE4LDIxMCwxODMsCisgICAgMTc1LDE0MiwgNTEsIDU0LDExMCwgODksMTUzLDExMiwxMzksIDYxLCA0NiwgNDEsMTI1LDE3NywxNzAsIDUyLAorICAgICA0MywxMzQsMjA3LDI1MywgMjMsMTYzLDIwNywxMzcsMTk0LDIzMiwgOTEsMTYyLCA2NywxOTAsIDIxLCA4NSwKKyAgICAgNjgsMTUxLDEyMCwyMDgsIDczLCAxOSwgNDIsICAxLDI1NCwxMjksMTc1LDIxNCwgMzYsIDQ4LCAgOCwyMDYsCisgICAgMTI5LDIxMCwyNTAsMTYwLDIxMCwgOTUsIDE4LDE1MiwxNTksMjM5LDE0OCwyMjIsIDU2LDE3MywgNTQsMTUyLAorICAgIDEwNSwxMjYsMTAyLDIwNywyMzEsMTk3LDI0MCwgIDgsMTkyLDE4NSwxMjQsMjI1LCA0NSwxNDMsIDIxLCA3MywKKyAgICAgMTUsIDU2LCAgMSwgNjcsMTE1LDI1NCwgNDcsIDkyLCA3MywgNjQsMTgyLCAzNywgNDgsIDE4LDE0NCwxMDYsCisgICAgMjEzLDEyNywxNjUsMjQxLCAgNSwyMjYsMTMxLCA0NCwxNDQsIDY5LCAgMiwyMjMsMTM5LDE1OCwxNzksMjMyLAorICAgIDE2NCwyNTEsMTkzLCAgOSwgNjEsIDQzLDE5MCwxMjYsMTgxLDIyOSwgMTMsMjAyLDIwMiwxMzAsMjM3LCA5MywKKyAgICAyMjQsMTA0LDE1NiwgNjksIDM1LDI1MywxOTksMTU3LDIzOSwxMjUsMTI5LCA1NiwxNTgsMTQ0LDE5NiwxNDAsCisgICAgMTc4LCA3MiwxNjQsMjQ3LDEyOSwyMDcsMjI1LDI1MSwgIDcsMTI5LCAgMCwyMjksIDE5LCAyMiwxMzksMjQ0LAorICAgICA2MiwgMTUsMTI1LCAzMCwgMTYsICA4LCAxMiwgNTgsMTA2LDIyMywgODksIDUyLDIxMCwxMjMsMTkyLDIxNSwKKyAgICAyNDAsMTIxLDIwMywgNjQsMjQ4LCAxOSwxMTYsMjM3LDE3NiwxMzYsMTY0LDI1MSwxMjksMTQzLDEzMSwyMzksCisgICAgMTI4LCA5MCwgIDQsICAyLDI1MywyMjEsIDQ3LDIwNywgODksIDc2LDIxMCwyNTMsMTkyLDE5OSwyNDAsMTE3LAorICAgIDIzMiwgNjQsMTI4LDE5NSwgOTgsMTcxLCAyMSwgMTcsMTQ2LCA5NCwyMjQsIDkxLDI0OCwgNTYsMTUyLCA1NCwKKyAgICAgIDMsMTI5LCAyNSwxOTAsMTU3LDEwMSwgMjIsMjE1LCAgNCwyMzUsMjExLCA5NCwgMzcsMTIyLDEyOSwxMTEsCisgICAgIDM1LDIwNywgODQsICA3LDEyOSwyNDYsIDg0LDI1NCwxMzcsMjEwLDIyMCwxMDMsIDIyLCA5MSwgNzEsIDE2LAorICAgIDIzOCwyMTgsMTI2LDE5NCwgMTUsIDM3LDEzMywgMTAsMTA3LCAyMCwxMzUsMTg2LCA3NiwxOTIsIDI5LCA5NSwKKyAgICAxODIsMTg3LDEzMiwgMjksMTA5LCA2NywxNTUsMTA4LDIwMywxNTQsICA5LDEzMCwyMzksMTk2LDE5NSwgNDMsCisgICAgIDcwLCA2MCwxOTQsMjUxLCA1MiwgOTgsIDMyLDI0MCwyMzYsIDcxLDExNywxNDYsIDY5LDIxNSwgMjUsICA0LAorICAgICAgNiwgNjcsIDE1LDI0MCwxMDEsMjQ4LDE2NywgOTcsMjM3LDEyMCwgMjcsIDQ2LDE1OSwgNDEsMTAxLCA5MSwKKyAgICAgODYsMTExLCAxNiwgMjQsMTQwLDEwNCwgNTIsMjE4LDE3MCwxMDMsIDgxLDIxNSwgMTYsIDUxLCAxNiwgMjQsCisgICAgMTY0LDE3NiwgNDUsMTA3LCAzOCwgIDgsIDEyLCA3MCwgNTYsMjI0LDE5NSwgMjcsIDM5LDE2MSwgNjQsIDUyLAorICAgICA3MCwyNDEsMTI3LDE0OCwxNzgsIDQ1LDEwNywgMzgsICA4LCAxMiwgNzAsMTE1LDIyNCwgNTksMjQ4LCA0OCwKKyAgICAgNTgsMTgyLDIyMiwgMjksIDQzLDE1OSwgNTAsICA4LCAzOCwxMzEsMTkyLCA5NiwxNTIsMjQ2LDE1NywyMzAsCisgICAgIDY0LDIxMiwxMDYsIDc0LDIwOSwyMzgsIDk4LCAxNiwgMjQsIDEyLDE0NywxOTIsMTAzLDI0MCwgOTMsMTI0LAorICAgICA1MCwxMzQsIDEyLDI0MiwgODIsMjMzLDE2NywgNjIsIDU3LCA0OCwxNTIsIDQ3LCA0MCwxNzIsIDM3LDE4OCwKKyAgICAgMzUsMTI1LCA1NCwxMTEsICAxLDE1OSwgODksMjE4LDExMCwyMTMsMTA5LCA1MSwgNTksMTM4LDEyMywxODYsCisgICAgIDM1LCA3OCwyMjAsIDE3LCAgMywxOTIsIDg3LDI1MCwxOTksMTcyLDE4MiwyMTcsIDI5LDIyMywyNDksMTY4LAorICAgIDE0OCwxMDksIDg5LDE2MiwgIDMsMjQ4LCAgOCwxOTAsMjEwLDE0MywyMjUsIDY0LDE2MCwyNTMsMTgxLDIwMywKKyAgICAxMDMsMTYwLDEzNiwgIDYsMTE4LDIxOSwxMjYsIDM4LCA0MSwxNjUsMTI5LDEwNCwgOTIsMjI2LDI0OCwxODAsCisgICAgIDQ0LDIwOSwxMTMsIDExLCA5NCwgNTIsMTg5LCAzNywxODcsMTc5LCA2MywxMDgsMTI1LDEzOCwgIDcsMTUxLAorICAgIDE2NCwyMTcsIDU1LCAyOSwgMTQsICA0LCA5NSwgNzcsIDM3LCA5NywgIDgsMTI2LDIxMywxNzksIDcxLCAgMiwKKyAgICAgIDEsMjQ4LCAzOSwgIDYsIDM2LDE1NywgNjIsIDczLCA0MCwgMTYsMTg0LCAzOSwyMjgsIDk2LDE1NSwgNTIsCisgICAgIDI3LCA2MCwxMTksMTI2LDIwNCwxMDUsIDM5LDI1MSwxOTUsMjQxLCA3NCwgMzEsMjE5LDE3OCwyMjgsMTkwLAorICAgICAxNSwgMTQsMTM5LCA3MywyMzcsIDY1LCAzOCwyMTcsICAyLDE2MCwxMjUsMTgyLDIyNiwyNTEsMTExLCA3OCwKKyAgICAyMTAsMTU5LCA5MiwgNDQsMTM4LCA0NywgMTgsMjM1LCA3MCwyMjIsICAyLCAgMCwgIDAsMjU1LDI1NSwgIDMsCisgICAgICAwLDE2NiwyNDcsMjE0LCA5MSwgNDQsMTIyLDE1MCwyMDUsICAwLCAgMCwgIDAsICAwLCA3MywgNjksIDc4LAorICAgICA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX2JhY2tfcG5nWzM1NjRdID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMCwgNDYsICAwLCAgMCwgIDAsIDQ3LCAxNiwgIDYsICAwLCAgMCwgIDAsMjA0LDExNywgMzYsCisgICAgMjA5LCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsIDEwLCA3OSwxMDUsIDY3LCA2NywgODAsIDgwLDEwNCwKKyAgICAxMTEsMTE2LDExMSwxMTUsMTA0LDExMSwxMTIsIDMyLCA3MywgNjcsIDY3LCAzMiwxMTIsMTE0LDExMSwxMDIsCisgICAgMTA1LDEwOCwxMDEsICAwLCAgMCwxMjAsMjE4LDE1NywgODMsMTAzLCA4NCwgODMsMjMzLCAyMiwgNjEsMjQ3LAorICAgIDIyMiwyNDQsIDY2LCA3NSwxMzYsMTI4LDE0OCwgNzUsMTExLCA4MiwgMjEsICA4LCAzMiwgODIsIDY2LDEzOSwKKyAgICAxMjgsIDIwLDE0NSwgMzgsIDQyLCAzMywgIDksIDE2LCA3NCwxMzYsIDMzLDE2MSwyMTcsIDIxLCA4MSwxOTMsCisgICAgIDE3LCA2OSwgNjksICA0LCAyNywyMDAsMTYwLDEzNiwgIDMsMTQyLDE0MiwxMjgsMTQwLCAyMSwgODEsIDQ0LAorICAgICAxMiwxMzgsIDEwLDIxNiwgIDcsMjI4LCAzMywxNjIsMTQyLDEzMSwxNjMsMTM2LDEzOCwyMDIsMjUxLDIyNSwKKyAgICAxMjMsMTYzLDEwNywyMTQsMTg4LDI0NywyMzAsMjA1LDI1NCwxODEsMjE1LCA2MiwyMzEsMTcyLDI0MywxNTcsCisgICAgMTc5LDIwNywgIDcsMTkyLCAgOCwgMTIsMTUwLCA3MiwgNTEsIDgxLCA1MywxMjgsIDEyLDE2OSwgNjYsIDMwLAorICAgICAxNywyMjQsMTMxLDE5OSwxOTYsMTk4LDIyNSwyMjgsIDQ2LCA2NCwxMjksIDEwLCAzNiwxMTIsICAwLCAxNiwKKyAgICAgIDgsMTc5LDEwMCwgMzMsMTE1LDI1MywgMzUsICAxLCAgMCwyNDgsMTI2LCA2MCwgNjAsIDQzLCAzNCwxOTIsCisgICAgICA3LDE5MCwgIDAsICAxLDEyMCwyMTEsIDExLCAgOCwgIDAsMTkyLCA3NywxNTUsMTkyLCA0OCwgMjgsMTM1LAorICAgIDI1NSwgMTUsMjM0LCA2NiwxNTMsIDkyLCAgMSwxMjgsMTMyLCAgMSwxOTIsMTE2LDE0NSwgNTYsIDc1LCAgOCwKKyAgICAxMjgsIDIwLCAgMCwgNjQsMTIyLDE0MiwgNjYsMTY2LCAgMCwgNjQsIDcwLCAgMSwxMjgsMTU3LDE1MiwgMzgsCisgICAgIDgzLCAgMCwxNjAsICA0LCAgMCwgOTYsMjAzLCA5OSwgOTgsMjI3LCAgMCwgODAsIDQ1LCAgMCwgOTYsIDM5LAorICAgIDEyNywyMzAsMjExLCAgMCwxMjgsMTU3LDI0OCwxNTMsMTIzLCAgMSwgIDAsIDkxLDE0OCwgMzMsIDIxLCAgMSwKKyAgICAxNjAsMTQ1LCAgMCwgMzIsIDE5LDEwMSwxMzYsIDY4LCAgMCwxMDQsIDU5LCAgMCwxNzIsMjA3LCA4NiwxMzgsCisgICAgIDY5LCAgMCwgODgsIDQ4LCAgMCwgMjAsMTAyLCA3NSwxOTYsIDU3LCAgMCwyMTYsIDQ1LCAgMCwgNDgsIDczLAorICAgICA4NywxMDIsIDcyLCAgMCwxNzYsMTgzLCAgMCwxOTIsMjA2LCAxNiwgMTEsMTc4LCAgMCwgIDgsIDEyLCAgMCwKKyAgICAgNDgsIDgxLDEzNiwxMzMsIDQxLCAgMCwgIDQsMTIzLCAgMCwgOTYsMjAwLCAzNSwgMzUsMTIwLCAgMCwxMzIsCisgICAgMTUzLCAgMCwgMjAsIDcwLDI0MiwgODcsIDYwLDI0MSwgNDMsMTc0LCAxNiwyMzEsIDQyLCAgMCwgIDAsMTIwLAorICAgIDE1MywxNzgsIDYwLDE4NSwgMzYsIDU3LCA2OSwxMjksIDkxLCAgOCwgNDUsMTEzLCAgNywgODcsIDg3LCA0NiwKKyAgICAgMzAsIDQwLDIwNiwgNzMsIDIzLCA0MywgMjAsIDU0LCA5NywgIDIsIDk3LDE1NCwgNjQsIDQ2LDE5NCwxMjEsCisgICAgMTUzLCAyNSwgNTAsMTI5LCA1MiwgMTUsMjI0LDI0MywyMDQsICAwLCAgMCwxNjAsMTQ1LCAyMSwgMTcsMjI0LAorICAgIDEzMSwyNDMsMjUzLDEyMCwyMDYsIDE0LDE3NCwyMDYsMjA2LCA1NCwxNDIsMTgyLCAxNCwgOTUsIDQ1LDIzNCwKKyAgICAxOTEsICA2LDI1NSwgMzQsIDk4LCA5OCwyMjcsMjU0LDIyOSwyMDcsMTcxLDExMiwgNjQsICAwLCAgMCwyMjUsCisgICAgMTE2LDEyNiwyMDksMjU0LCA0NCwgNDcsMTc5LCAyNiwxMjgsIDU5LCAgNiwxMjgsMTA5LDI1NCwxNjIsIDM3LAorICAgIDIzOCwgIDQsMTA0LCA5NCwgMTEsMTYwLDExNywyNDcsMTM5LDEwMiwxNzgsIDE1LCA2NCwxODEsICAwLDE2MCwKKyAgICAyMzMsMjE4LCA4NywyNDMsMTEyLDI0OCwxMjYsIDYwLCA2MCwgNjksMTYxLDE0NCwxODUsMjE3LDIxNywyMjksCisgICAgMjI4LDIyOCwyMTYsIDc0LDE5NiwgNjYsIDkxLCA5NywyMDIsIDg3LDEyNSwyNTQsMTAzLDE5NCwgOTUsMTkyLAorICAgICA4NywyNTMsMTA4LDI0OSwxMjYsIDYwLDI1MiwyNDcsMjQ1LDIyNCwxOTAsMjI2LCAzNiwxMjksIDUwLCA5MywKKyAgICAxMjksIDcxLCAgNCwyNDgsMjI0LDE5NCwyMDQsMjQ0LCA3NiwxNjUsIDI4LDIwNywxNDYsICA5LDEzMiwgOTgsCisgICAgMjIwLDIzMCwxNDMsIDcxLDI1MiwxODMsIDExLDI1NSwyNTIsIDI5LDIxMSwgMzQsMTk2LCA3MywgOTgsMTg1LAorICAgICA4OCwgNDIsIDIwLDIyNywgODEsIDE4LDExMywxNDIsIDY4LDE1NCwxNDAsMjQzLCA1MCwxNjUsIDM0LDEzNywKKyAgICAgNjYsMTQ2LCA0MSwxOTcsIDM3LDIxMCwyNTUsMTAwLDIyNiwyMjMsIDQ0LDI1MSwgIDMsIDYyLDIyMywgNTMsCisgICAgICAwLDE3NiwxMDYsIDYyLCAgMSwxMjMsMTQ1LCA0NSwxNjgsIDkzLCA5OSwgIDMsMjQ2LCA3NSwgMzksIDE2LAorICAgICA4OCwxMTYsMTkyLDIyNiwyNDcsICAwLCAgMCwyNDIsMTg3LDExMSwxOTMsMjEyLCA0MCwgIDgsICAzLDEyOCwKKyAgICAxMDQsMTMxLDIyNSwyMDcsMTE5LDI1NSwyMzksIDYzLDI1MywgNzEsMTYwLCAzNywgIDAsMTI4LDEwMiwgNzMsCisgICAgMTQ2LDExMywgIDAsICAwLCA5NCwgNjgsIDM2LCA0NiwgODQsMjAyLDE3OSwgNjMsMTk5LCAgOCwgIDAsICAwLAorICAgICA2OCwxNjAsMTI5LCA0MiwxNzYsIDY1LCAyNywyNDQsMTkzLCAyNCwgNDQsMTkyLCAgNiwgMjgsMTkzLCAgNSwKKyAgICAyMjAsMTkzLCAxMSwyNTIsIDk2LCA1NCwxMzIsIDY2LCAzNiwxOTYsMTk0LCA2NiwgMTYsIDY2LCAxMCwxMDAsCisgICAgMTI4LCAyOCwxMTQsIDk2LCA0MSwxNzIsMTMwLCA2NiwgNDAsMTM0LDIwNSwxNzYsIDI5LCA0MiwgOTYsIDQ3LAorICAgIDIxMiwgNjQsIDI5LCA1MiwxOTIsIDgxLDEwNCwxMzQsMTQ3LDExMiwgMTQsIDQ2LDE5NCwgODUsMTg0LCAxNCwKKyAgICAgNjEsMTEyLCAxNSwyNTAsIDk3LCAgOCwxNTgsMTkzLCA0MCwxODgsMTI5LCAgOSwgIDQsIDY1LDIwMCwgIDgsCisgICAgIDE5LCA5NywgMzMsMjE4LDEzNiwgIDEsIDk4LDEzOCwgODgsIDM1LDE0MiwgIDgsIDIzLDE1MywxMzMsMjQ4LAorICAgICAzMywxOTMsIDcyLCAgNCwgMTgsMTM5LCAzNiwgMzIsMjAxLDEzNiwgMjAsIDgxLCAzNCwgNzUsMTQ1LCA1MywKKyAgICAgNzIsIDQ5LCA4MiwxMzgsIDg0LCAzMiwgODUsIDcyLCAyOSwyNDIsIDYxLDExNCwgIDIsIDU3LDEzNSwgOTIsCisgICAgIDcwLDE4NiwxNDUsIDU5LDIwMCwgIDAsIDUwLDEzMCwyNTIsMTM0LDE4OCwgNzEsIDQ5LDE0OCwxMjksMTc4LAorICAgICA4MSwgNjEsMjEyLCAxMiwxODEsIDY3LDE4NSwxNjgsIDU1LCAyNiwxMzIsIDcwLDE2MiwgMTEsMjA4LDEwMCwKKyAgICAxMTYsIDQ5LDE1NCwxNDMsIDIyLDE2MCwxNTUsMjA4LDExNCwxODAsIDI2LCA2MSwxNDAsIDU0LDE2MSwyMzEsCisgICAgMjA4LDE3MSwxMDQsIDE1LDIxOCwxNDMsIDYyLCA2NywxOTksIDQ4LDE5MiwyMzIsIDI0LCAgNywgNTEsMTk2LAorICAgIDEwOCwgNDgsIDQ2LDE5OCwxOTUsIDY2LDE3NywgNTYsIDQ0LCAgOSwxNDcsIDk5LDIwMywxNzcsIDM0LDE3MiwKKyAgICAgMTIsMTcxLDE5OCwgMjYsMTc2LCA4NiwxNzIsICAzLDE4NywxMzcsMjQ1LCA5OSwyMDcsMTc3LDExOSwgIDQsCisgICAgIDE4LDEyOSwgNjksMTkyLCAgOSwgNTQsICA0LDExOSwgNjYsIDMyLCA5NywgMzAsIDY1LCA3MiwgODgsIDc2LAorICAgICA4OCwgNzgsMjE2LCA3MiwxNjgsIDMyLCAyOCwgMzYsIDUyLCAxNywyMTgsICA5LCA1NSwgIDksICAzLDEzMiwKKyAgICAgODEsMTk0LCAzOSwgMzQsMTQ3LDE2OCwgNzUsMTgwLCAzOCwxODYsIDE3LDI0OSwxOTYsIDI0LCA5OCwgNTAsCisgICAgIDQ5LDEzNSwgODgsIDcyLCA0NCwgMzUsMjE0LCAxOCwxNDMsIDE5LCA0NywgMTYsMTIzLDEzNiwgNjcsMTk2LAorICAgICA1NSwgMzYsIDE4LDEzNywgNjcsIDUwLCAzOSwxODUsMTQ0LCAgMiwgNzMsMTc3LDE2NCwgODQsMjEwLCAxOCwKKyAgICAyMTAsIDcwLDIxMCwxMTAsIDgyLCAzNSwyMzMsIDQ0LDE2OSwxNTUsIDUyLCA3MiwgMjYsIDM1LDE0NywyMDEsCisgICAgMjE4LDEwMCwxMDcsMTc4LCAgNywgNTcsMTQ4LCA0NCwgMzIsIDQzLDIwMCwxMzMsMjI4LDE1NywyMjgsMTk1LAorICAgIDIyOCwgNTEsMjI4LCAyNywyMjgsIDMzLDI0MiwgOTEsIDEwLDE1NywgOTgsIDY0LDExMywxNjQsMjQ4LCA4MywKKyAgICAyMjYsIDQwLCA4MiwyMDIsMTA2LCA3NCwgMjUsMjI5LCAxNiwyMjksIDUyLDIyOSwgIDYsMTAxLDE1MiwgNTAsCisgICAgIDY1LCA4NSwxNjMsMTU0LCA4MiwyMjEsMTY4LDE2MSwgODQsIDE3LCA1MywxNDMsIDkwLCA2NiwxNzMsMTYxLAorICAgIDE4MiwgODIsMTc1LCA4MSwxMzUsMTY4LCAxOSwgNTIsMTE3LDE1NCwgNTcsMjA1LDEzMSwgMjIsIDczLCA3NSwKKyAgICAxNjUsMTczLDE2MiwxNDksMjExLCAyNiwxMDQsIDIzLDEwNCwyNDcsMTA1LDE3NSwyMzIsMTE2LDE4NiwgMTcsCisgICAgMjIxLDE0OSwgMzAsIDc4LDE1MSwyMDgsIDg3LDIxMCwyMDMsMjMzLCA3MSwyMzIsMTUxLDIzMiwgIDMsMjQ0LAorICAgIDExOSwgMTIsIDEzLDEzNCwgMjEsMTMxLDE5OSwxMzYsMTAzLCA0MCwgMjUsMTU1LCAyNCwgIDcsIDI0LDEwMywKKyAgICAgMjUsMTE5LCAyNCwxNzUsMTUyLCA3NiwxNjYsIDI1LDIxMSwxMzksIDI1LDE5OSwgODQsIDQ4LCA1NSwgNDksCisgICAgMjM1LDE1MiwyMzEsMTUzLCAxNSwxNTMsMTExLCA4NSwgODgsIDQyLDE4MiwgNDIsMTI0LCAyMSwxNDUsMjAyLAorICAgICAxMCwxNDksIDc0LDE0OSwgMzgsMTQ5LCAyNywgNDIsIDQ3LCA4NCwxNjksMTcwLDE2NiwxNzAsMjIyLDE3MCwKKyAgICAgMTEsIDg1LDI0MywgODUsMjAzLCA4NCwxNDMsMTY5LCA5NCwgODMsMTI1LDE3NCwgNzAsIDg1LCA1MSwgODMsCisgICAgMjI3LDE2OSwgIDksMjEyLDE1MCwxNzEsIDg1LDE3MCwxNTcsIDgwLDIzNSwgODMsIDI3LCA4MywxMDMsMTY5LAorICAgICA1OSwxNjgsMTM1LDE3MCwxMDMsMTY4LDExMSwgODQsIDYzLDE2NCwxMjYsIDg5LDI1MywxMzcsICA2LCA4OSwKKyAgICAxOTUsIDc2LDE5NSwgNzksIDY3LDE2NCwgODEsMTYwLDE3NywgOTUsMjI3LDE4OCwxOTgsIDMyLCAxMSwgOTksCisgICAgIDI1LDE3OSwxMjAsIDQ0LCAzMywxMDcsIDEzLDE3MSwxMzQsMTE3LDEyOSwgNTMsMTk2LCAzOCwxNzcsMjA1LAorICAgIDIxNywxMjQsMTE4LCA0MiwxODcsMTUyLDI1MywgMjksMTg3LDEzOSwgNjEsMTcwLDE2OSwxNjEsIDU3LCA2NywKKyAgICAgNTEsIDc0LCA1MSwgODcsMTc5LCA4MiwyNDMsMTQ4LDEwMiwgNjMsICA3LDIyNywxNTIsMTEzLDI0OCwxNTYsCisgICAgMTE2LCA3OCwgIDksMjMxLCA0MCwxNjcsMTUxLDI0MywxMjYsMTM4LDIyMiwgMjAsMjM5LCA0MSwyMjYsIDQxLAorICAgICAyNywxNjYsIDUyLCA3NiwxODUsIDQ5LDEwMSwgOTIsMTA3LDE3MCwxNTAsMTUxLDE1MCwgODgsMTcxLCA3MiwKKyAgICAxNzEsIDgxLDE3MSwgNzEsMjM1LDE4OSwgNTQsMTc0LDIzNywxNjcsMTU3LDE2NiwxODksIDY5LDE4NywgODksCisgICAgMjUxLDEyOSwgMTQsIDY1LDE5OSwgNzQsIDM5LCA5MiwgMzksIDcxLDEwMywxNDMsMjA2LCAgNSwxNTcsMjMxLAorICAgICA4MywyMTcsIDgzLDIyMSwxNjcsIDEwLDE2NywgMjIsIDc3LCA2MSwgNTgsMjQ1LDE3NCwgNDYsMTcwLDEwNywKKyAgICAxNjUsIDI3LDE2MSwxODcsIDY4LDExOSwxOTEsMTEwLDE2NywyMzgsMTUyLDE1OCwxOTAsIDk0LDEyOCwxNTgsCisgICAgIDc2LDExMSwxNjcsMjIyLDEyMSwxODksMjMxLDI1MCwgMjgsMTI1LCA0NywyNTMsIDg0LDI1MywxMDksMjUwLAorICAgIDE2NywyNDUsIDcxLCAxMiwgODgsICA2LDE3OSwgMTIsIDM2LCAgNiwyMTksIDEyLDIwNiwgMjQsIDYwLDE5NywKKyAgICAgNTMsMTEzLDExMSwgNjAsIDI5LCA0NywxOTksMjE5LDI0MSwgODEsIDY3LCA5MywxOTUsIDY0LCA2NywxNjUsCisgICAgIDk3LDE0OSwgOTcsMTUxLDIyNSwxMzIsMTQ1LDE4NSwyMDksIDYwLDE2MywyMTMsIDcwLDE0MSwgNzAsIDE1LAorICAgIDE0MCwxMDUsMTk4LCA5MiwyMjcsIDM2LDIyNywxMDksMTk4LDEwOSwxOTgsMTYzLCAzOCwgIDYsIDM4LCAzMywKKyAgICAgMzgsIDc1LCA3NywyMzQsIDc3LDIzOCwxNTQsIDgyLCA3NywxODUsMTY2LCA0MSwxNjYsIDU5LCA3NiwgNTksCisgICAgIDc2LDE5OSwyMDUsMjA0LDIwNSwxNjIsMjA1LDIxNCwxNTMsIDUzLDE1NSwgNjEsIDQ5LDIxNSwgNTAsMjMxLAorICAgIDE1NSwyMzEsMTU1LDIxNSwxNTUsMjIzLDE4MywgOTYsIDkwLDEyMCwgOTAsIDQ0LDE4MiwxNjgsMTgyLDE4NCwKKyAgICAxMDEsIDczLDE3OCwyMjgsIDkwLDE2NiwgODksMjM4LDE4MiwxODgsMTEwLDEzMywgOTAsIDU3LCA4OSwxNjUsCisgICAgIDg4LCA4NSwgOTAsIDkzLDE3OSwgNzAsMTczLDE1NywxNzMsIDM3LDIxNCwxODcsMTczLDE4NywxNjcsIDE3LAorICAgIDE2NywxODUsIDc4LDE0NywgNzgsMTcxLDE1OCwyMTQsMTAzLDE5NSwxNzYsMjQxLDE4MiwyMDEsMTgyLDE2OSwKKyAgICAxODMsIDI1LDE3NiwyMjksMjE2LCAgNiwyMTksMTc0LDE4MiwxMDksMTgyLDEyNSwgOTcsMTAzLCA5OCwgMjMsCisgICAgMTAzLDE4MywxOTcsMTc0LDE5NSwyMzgsMTQ3LDE4OSwxNDcsMTI1LDE4NiwxMjUsMTQxLDI1MywgNjEsICA3LAorICAgICAxMywxMzUsMjE3LCAxNCwxNzEsIDI5LCA5MCwgMjksMTI2LDExNSwxODAsMTE0LCAyMCwgNTgsIDg2LCA1OCwKKyAgICAyMjIsMTU0LDIwNiwxNTYsMjM4LCA2MywxMjUsMTk3LDI0NCwxNTAsMjMzLCA0NywxMDMsIDg4LDIwNywgMTYsCisgICAgMjA3LDIxNiwgNTEsMjI3LDE4MiwgMTksMjAzLCA0MSwxOTYsMTA1LDE1NywgODMsMTU1LDIxMSwgNzEsMTAzLAorICAgICAyMywxMDMsMTg1LDExNSwxMzEsMjQzLDEzNiwxMzksMTM3LCA3NSwxMzAsMjAzLCA0NiwxNTEsIDYyLCA0NiwKKyAgICAxNTUsIDI3LDE5OCwyMjEsMjAwLDE4OSwyMjgsIDc0LDExNiwyNDUsMTEzLCA5MywyMjUsMTIyLDIxMCwyNDUsCisgICAgMTU3LDE1NSwxNzksMTU1LDE5NCwyMzcsMTY4LDIxOSwxNzUsMjM4LCA1NCwyMzgsMTA1LDIzOCwxMzUsMjIwLAorICAgIDE1OSwyMDQsIDUyLDE1OSwgNDEsMTU4LCA4OSwgNTEsMTE1LDIwOCwxOTUsMjAwLCA2NywyMjQsIDgxLDIyOSwKKyAgICAyMDksIDYzLCAxMSwxNTksMTQ5LCA0OCwxMDcsMjIzLDE3MiwxMjYsIDc5LCA2NywgNzksMTI5LDEwMywxODEsCisgICAgMjMxLCAzNSwgNDcsIDk5LCA0NywxNDUsIDg3LDE3MywyMTUsMTc2LDE4MywxNjUsMTE5LDE3MCwyNDcsIDk3LAorICAgIDIzOSwgMjMsIDYyLDI0NiwgNjIsMTE0LDE1OSwyMjcsIDYyLDIyNywgNjAsIDU1LDIyMiwgNTAsMjIyLCA4OSwKKyAgICAgOTUsMjA0LCA1NSwxOTIsMTgzLDIwMCwxODMsMjAzLCA3OSwxOTUsMTExLDE1OCwgOTUsMTMzLDIyMywgNjcsCisgICAgMTI3LCAzNSwyNTUsMTAwLDI1NSwxMjIsMjU1LDIwOSwgIDAsMTY3LDEyOCwgMzcsICAxLDEwMywgIDMsMTM3LAorICAgIDEyOSwgNjUsMTI5LCA5MSwgIDIsMjUxLDI0OCwxMjIsMTI0LCAzMywxOTEsMTQyLCA2MywgNTgsMjE5LDEwMSwKKyAgICAyNDYsMTc4LDIxNywyMzcsIDY1LDE0MCwxNjAsMTg1LCA2NSwgMjEsIDY1LDE0MywxMzAsMTczLDEzMCwyMjksCisgICAgMTkzLDE3MywgMzMsMTA0LDIwMCwyMzYsMTQ0LDE3MywgMzMsMjQ3LDIzMSwxNTIsMjA2LDE0NSwyMDYsMTA1LAorICAgICAxNCwxMzMsIDgwLDEyNiwyMzIsMjE0LDIwOCwgIDcsIDk3LDIzMCwgOTcsMTM5LDE5NSwxMjYsIDEyLCAzOSwKKyAgICAxMzMsMTM1LDEzMywgODcsMTM0LCA2MywxNDIsMTEyLDEzNiwgODgsIDI2LDIwOSwgNDksMTUxLCA1MywxMTksCisgICAgMjA5LDIyMCwgNjcsMTE1LDIyMywgNjgsMjUwLCA2OCwxNTAsIDY4LDIyMiwxNTUsMTAzLCA0OSwgNzksIDU3LAorICAgIDE3NSwgNDUsIDc0LCA1MywgNDIsIDYyLDE3MCwgNDYsMTA2LCA2MCwyMTgsIDU1LDE4NiwgNTIsMTg2LCA2MywKKyAgICAxOTgsIDQ2LDEwMiwgODksMjA0LDIxMywgODgsMTU3LCA4OCwgNzMsMTA4LCA3NSwgMjgsIDU3LCA0NiwgNDIsCisgICAgMTc0LCA1NCwxMTAsMTA4LDE5MCwyMjMsMjUyLDIzNywyNDMsMTM1LDIyNiwxNTcsMjI2LCAxMSwyMjcsMTIzLAorICAgICAyMywxNTIsIDQ3LDIwMCwgOTMsMTEyLDEyMSwxNjEsMjA2LDE5NCwyNDQsMTMzLDE2NywgMjIsMTY5LCA0NiwKKyAgICAgMTgsIDQ0LCA1OCwxNTAsIDY0LCA3NiwxMzYsIDc4LCA1NiwxNDgsMjQwLCA2NSwgMTYsIDQyLDE2OCwgMjIsCisgICAgMTQwLCAzNywyNDIsIDE5LDExOSwgMzcsMTQyLCAxMCwxMjEsMTk0LCAyOSwxOTQsMTAzLCAzNCwgNDcsMjA5LAorICAgICA1NCwyMDksMTM2LDIxNiwgNjcsIDkyLCA0MiwgMzAsIDc4LDI0MiwgNzIsIDQyLCA3NywxMjIsMTQ2LDIzNiwKKyAgICAxNDUsMTg4LCA1MywxMjEsIDM2LDE5NywgNTEsMTY1LCA0NCwyMjksMTg1LDEzMiwgMzksMTY5LDE0NCwxODgsCisgICAgIDc2LCAxMywgNzYsMjIxLDE1NSwgNTgsMTU4LCAyMiwxNTQsMTE4LCAzMiwxMDksIDUwLCA2MSwgNTgsMTg5LAorICAgICA0OSwxMzEsMTQ2LDE0NSwxNDQsMTEzLCA2NiwxNzAsIDMzLCA3NywxNDcsMTgyLDEwMywyMzQsMTAzLDIzMCwKKyAgICAxMDIsMTE4LDIwMywxNzIsMTAxLDEzMywxNzgsMjU0LDE5NywxMTAsMTM5LDE4MywgNDcsIDMwLDE0OSwgIDcsCisgICAgMjAxLDEwNywxNzksMTQ0LDE3MiwgIDUsIDg5LCA0NSwgMTAsMTgyLCA2NiwxNjYsMjMyLCA4NCwgOTAsIDQwLAorICAgIDIxNSwgNDIsICA3LDE3OCwxMDMsMTAxLCA4NywxMDIsMTkxLDIwNSwxMzcsMjAyLCA1NywxNTAsMTcxLDE1OCwKKyAgICAgNDMsMjA1LDIzNywyMDQsMTc5LDIwMiwyMTksMTQ0LCA1NSwxNTYsMjM5LDE1OSwyNTUsMjM3LCAxOCwxOTQsCisgICAgIDE4LDIyNSwxNDYsMTgyLDE2NSwxMzQsIDc1LCA4NywgNDUsIDI5LCA4OCwyMzAsMTg5LDE3MiwxMDYsIDU3LAorICAgIDE3OCwgNjAsMTEzLDEyMSwyMTksIDEwLDIyNywgMjEsICA1LCA0MywxMzQsIDg2LCAgNiwxNzIsIDYwLDE4NCwKKyAgICAxMzgsMTgyLCA0MiwxMDksMjEzLCA3OSwxNzEsMjM3LCA4NywxNTEsMTc0LDEyNiwxODksIDM4LDEyMiwgNzcsCisgICAgMTA3LDEyOSwgOTQsMTkzLDIwMiwxMzAsMTkzLDE4MSwgIDEsMTA3LDIzNSwgMTEsIDg1LCAxMCwyMjksMTMzLAorICAgIDEyNSwyMzUsMjIwLDIxNSwyMzcsIDkzLCA3OSwgODgsIDQ3LCA4OSwyMjMsMTgxLCA5NywyNTAsMTM0LDE1NywKKyAgICAgMjcsIDYyLCAyMSwxMzcsMTM4LDE3NCwgMjAsMjE5LCAyMywxNTEsIDIxLDEyNywyMTYsIDQwLDIyMCwxMjAsCisgICAgMjI5LCAyNywxMzUsMTExLDIwMiwxOTEsMTUzLDIyMCwxNDgsMTgwLDE2OSwxNzEsMTk2LDE4NSwxMDAsMjA3LAorICAgIDEwMiwyMTAsMTAyLDIzMywyMzAsMjIyLCA0NSwxNTgsIDkxLCAxNCwxNTAsMTcwLDE1MSwyMzAsMTUxLCAxNCwKKyAgICAxMTAsIDEzLDIxNywyMTgsMTgwLCAxMywyMjMsIDg2LDE4MCwyMzcsMjQ1LDI0NiwgNjksMjE5LCA0NywxNTEsCisgICAgMjA1LCA0MCwyMTksMTg3LDEzMSwxODIsIDY3LDE4NSwxNjMsMTkxLCA2MCwxODQsMTg4LDEwMSwxNjcsMjAxLAorICAgIDIwNiwyMDUsIDU5LCA2MywgODQsMTY0LCA4NCwyNDQsIDg0LDI1MCwgODQsIDU0LDIzOCwyMTAsMjIxLDE4MSwKKyAgICAgOTcsMjE1LDI0OCwxMTAsMjA5LDIzOCwgMjcsMTIzLDE4OCwyNDYsIDUyLDIzNiwyMTMsMjE5LCA5MSwxODgsCisgICAgMjQ3LDI1MywgNjIsMjAxLDE5MCwyMTksIDg1LCAgMSwgODUsIDc3LDIxMywxMDIsMjEzLDEwMSwyNTEsIDczLAorICAgIDI1MSwxNzksMjQ3LCA2MywxNzQsMTM3LDE3MCwyMzMsMjQ4LDE1MCwyNTEsMTA5LCA5MywxNzMsIDc4LDEwOSwKKyAgICAxMTMsMjM3LDE5OSwgIDMsMjEwLCAgMywyNTMsICA3LCAzNSwgMTQsMTgyLDIxNSwxODUsMjEyLDIxMywgMjksCisgICAgMjEwLCA2MSwgODQsIDgyLDE0MywyMTQsIDQzLDIzNSwgNzEsIDE0LDE5OSwgMzEsMTkwLDI1NCwxNTcsMjM5LAorICAgIDExOSwgNDUsIDEzLCA1NCwgMTMsIDg1LDE0MSwxNTYsMTk4LDIyNiwgMzUsMTEyLCA2OCwxMjEsMjI4LDIzMywKKyAgICAyNDcsICA5LDIyMywyNDcsIDMwLCAxMywgNTgsMjE4LDExOCwxNDAsMTIzLDE3MiwyMjUsICA3LDIxMSwgMzEsCisgICAgMTE4LCAyOSwxMDMsIDI5LCA0NywxMDYsIDY2LDE1NCwyNDIsMTU0LCA3MCwxNTUsIDgzLDE1NCwyNTEsIDkxLAorICAgICA5OCwgOTEsMTg2LCA3OSwyMDQsIDYyLDIwOSwyMTQsMjM0LDIyMiwxMjIsMjUyLCA3MSwyMTksIDMxLCAxNSwKKyAgICAxNTYsIDUyLCA2MCwgODksMTIxLCA3NCwyNDMsIDg0LDIwMSwxMDUsMjE4LDIzMywxMzAsMjExLDE0NywxMDMsCisgICAgMjQyLDIwNywxNDAsMTU3LDE0OSwxNTcsMTI1LDEyNiwgNDYsMjQ5LDIyMCwgOTYsMjE5LDE2MiwxODIsMTIzLAorICAgIDIzMSwgOTksMjA2LDIyMywxMDYsIDE1LDExMSwyMzksMTg2LCAxNiwxMTYsMjI1LDIxMCwgNjksMjU1LDEzOSwKKyAgICAyMzEsIDU5LDE4OCwgNTksMjA2LCA5MiwyNDIsMTg0LDExNiwyNDIsMTc4LDIxOSwyMjksIDE5LCA4NywxODQsCisgICAgIDg3LDE1NCwxNzUsIDU4LCA5NSwxMDksMjM0LDExNiwyMzQsIDYwLDI1NCwxNDcsMjExLCA3OSwxOTksMTg3LAorICAgIDE1NiwxODcsMTU0LDE3NCwxODUsIDkyLDEwNywxODUsMjM4LDEyMiwxODksMTgxLDEyMywxMDIsMjQ3LDIzMywKKyAgICAgMjcsMTU4LCA1NSwyMDYsMjIxLDI0NCwxODksMTIxLDI0MSwgMjIsMjU1LDIxNCwyMTMsMTU4LCA1NywgNjEsCisgICAgMjIxLDE4OSwyNDMsMTIyLDExMSwyNDcsMTk3LDI0NywyNDUsMjIzLCAyMiwyMjEsMTI2LDExNCwgMzksMjUzLAorICAgIDIwNiwyMDMsMTg3LDIxNywxMTksIDM5LDIzOCwxNzMsMTg4LCA3OSwxODgsIDk1LDI0NCwgNjQsMjM3LCA2NSwKKyAgICAyMTcsIDY3LDIyMSwxMzUsMjEzLCA2MywgOTEsMjU0LDIyMCwyMTYsMjM5LDIyMCwxMjcsMTA2LDE5MiwxMTksCisgICAgMTYwLDI0MywyMDksMjIwLCA3MSwyNDcsICA2LDEzMywxMzEsMjA3LDI1NCwxNDUsMjQ1LDE0MywgMTUsIDY3LAorICAgICAgNSwxNDMsMTUzLDE0MywyMDMsMTM0LCAxMywxMzQsMjM1LDE1OCwgNTYsIDYyLCA1NywgNTcsMjI2LCA2MywKKyAgICAxMTQsMjUzLDIzMywyNTIsMTY3LCA2NywyMDcsMTAwLDIwNywgMzgsMTU4LCAyMywyNTQsMTYyLDI1NCwyMDMsCisgICAgMTc0LCAyMywgMjIsIDQ3LDEyNiwyNDgsMjEzLDIzNSwyMTUsMjA2LDIwOSwxNTIsMjA5LDE2MSwxNTEsMjQyLAorICAgIDE1MSwxNDcsMTkxLDEwOSwxMjQsMTY1LDI1MywyMzQsMTkyLDIzNSwgMjUsMTc1LDIxOSwxOTgsMTk0LDE5OCwKKyAgICAgMzAsMTkwLDIwMSwxMjAsIDUxLCA0OSwgOTQsMjQ0LCA4NiwyNTEsMjM3LDE5MywxMTksMjIwLDExOSwgMjksCisgICAgMjM5LDE2MywyMjMsIDE1LCA3OSwyMjgsMTI0LCAzMiwxMjcsIDQwLDI1NSwxMDQsMjQ5LDE3NywyNDUsIDgzLAorICAgIDIwOCwxNjcsMjUxLDE0NywgMjUsMTQ3LDE0NywyNTUsICA0LCAgMywxNTIsMjQzLDI1MiwgOTksIDUxLCA0NSwKKyAgICAyMTksICAwLCAgMCwgIDAsIDMyLCA5OSwgNzIsIDgyLCA3NywgIDAsICAwLDEyMiwgMzcsICAwLCAgMCwxMjgsCisgICAgMTMxLCAgMCwgIDAsMjQ5LDI1NSwgIDAsICAwLDEyOCwyMzMsICAwLCAgMCwxMTcsIDQ4LCAgMCwgIDAsMjM0LAorICAgICA5NiwgIDAsICAwLCA1OCwxNTIsICAwLCAgMCwgMjMsMTExLDE0NiwgOTUsMTk3LCA3MCwgIDAsICAwLCAgMywKKyAgICAgMjMsIDczLCA2OCwgNjUsIDg0LDEyMCwyMTgsMjM2LDE1NSwgNTksMTA4LCAxOSwgNjUsIDE2LDEzNCwgMjMsCisgICAgIDQzLCAxMywgNzgsIDY2LCA2NywgMjAsIDQwLDE1NiwgMzQsMTk0LDE0NCwgIDYsMjI4LDEwNywgMTksIDgzLAorICAgICA5NywxMDAsMTY1LDE3NywxOTYsIDY3LCAxMCwxNDEsIDM3LDIzMiwgMzQsMTg3LCAgNCwgNzYsMTI5LCAxNiwKKyAgICAyMjYsMjA5LDEzMywxNjQsMTQxLCA0MSwgMTksMTQ2LCA0MiwxNDEsMTQ1LDE2MCwgNjYsIDI4LCA5MywgMjgsCisgICAgIDc0LCAzNSwxNjUsMTkzLCAgOSwxMDUsIDI4LDEyOSwxNzYsMTQ4LCAgNiwxMjksMjExLCA4MiwyMzYsMjUyLAorICAgIDEyOSwgNTksMjUxLDIyOCwxMjMsMjM2LDE3MywyMDcsMjQ2LDI1MiwyMDUsIDQwLDI0MSwyMjcsMTI0LDIyMywKKyAgICAyMDYsMjU0LCA1OSwxMjMsMTE5LDExNSwgNDIsMTI1LDExNywgOTksIDk5LDEyNywgNzksIDY4LCA5MiwxNTEsCisgICAgMTUwLDE4OSwxODksMTkxLDExMywgOTQsMTk4LDIyNywxMjQsMjEyLDIwNiwxMDAsMTY0LDE4MywxMzUsIDYzLAorICAgIDE4OSwgNDEsMTYzLCA5NywgMTYsMjE2LCA5NSwgNTAsMjA2LDE3MiwyMDAsMTIwLCA1NCwyMzUsMjQzLDEzOSwKKyAgICAyNTUsMjAwLDIwOCwxNjIsIDg4LCA0NywgODEsIDI4LDE0NywxNzcsIDg2LDE0NywyNDEsMjMyLDE5NSwxMjgsCisgICAgICAzLCA3MSwxNjYsMTAyLCAxNCwgIDgsIDUyLCAgMSwgMTcsMjE5LDE4MiwgNTUsMTAyLDIxMywgMjgsIDQ3LAorICAgIDE0MiwgIDEsIDc3LCA4MSwxNjQsMjU1LCA0NywgOTIsMTYwLCAgMSwyNDgsIDQ0LCA5OSwxODEsIDQyLDIyNywKKyAgICAyMDYsMjI5LCA2MiwgIDcsIDE0LDE5MiwxODUsIDIzLDI0NCwyNDcsIDU2LDE4OSwxNDQsMTM4LDEzNiwgODUsCisgICAgMTg5LDE2MiwgNzIsICAzLDE1OCwxODcsIDQ1LDIyNywyMTQsIDU1LDIzNSwgNzYsIDgwLDE2NywgODgsIDU2LAorICAgICAyMiwxNzcsMTQ0LDE0OCwyNDEsMTkzLDE4NCwyNDUsMTk2LDE2MiwgNDYsIDg4LCA4OCwxNjEsIDY0LDE5MSwKKyAgICAyNTUsIDc2LCA2NCwxMDcsIDExLCAxMSwxMjAsMTYyLCA3MywgNjMsMTQ0LCA2MCwgNTAsIDgzLCAxOCwgIDMsCisgICAgIDMzLCAzNiwyMDIsMTQ3LDEzOCwxMTcsMTczLDIzMywgMjUsMjQwLCAxOSwyMDgsMTYzLCA1MCwgNzgsMjUzLAorICAgICAyMCwgIDMsIDQxLDE3MiwgIDUsMjAwLDI1MiwyMTcsIDkzLDIwNSwgMzAsMTQyLDE0NSwgNDYsIDg0LDE5NiwKKyAgICAgODAsMjM0LCAzMCwgMjIsMjQ5LCA5MywxNzUsMTM5LDEwOSwyMDQsIDk1LCA3MCwyMjMsMjIxLCAyMiwxNzIsCisgICAgMjU1LDE5MiwxODcsMjA3LDEyMCwxNTEsMTkyLDE3NywgMjQsMTk0LCA1OCwgNDgsMTk3LCA4OCwgODYsMjQwLAorICAgICA3MiwyMDAsMTkyLDE5MiwxMzksIDY5LCAgNiwyMzcsMTM4LCA4MywxOTMsMTU0LDE2MCwxNTgsMTI5LCA5OSwKKyAgICAxNzAsMjQ0LCA3NSwgODksIDIzLDE0OSwxNzgsIDUwLDI0NywyMDQsIDM1LDI0MCwxNDcsMTIyLDEyMiwxNTQsCisgICAgIDMzLDI1MCwgMTcsMjAyLDIyNiwxMTgsMTM5LDExMywgIDAsMTI2LDI1MywgMTcsIDkxLDEzNiwgMTAsMjIxLAorICAgICA3MywxODYsICA0LDEyNiwxMDksMTQzLCA5NywxNjksMjIwLCA1NiwyNTMsMjE5LDE2OSwxOTgsIDU4LDEyMywKKyAgICAgNTQsMTAzLDE4MiwgOTgsMTM5LCA1NywxMTIsICAwLDExMCwxNzIsIDUwLDE1NiwgNDgsMTAwLDE2NCwgMjgsCisgICAgMTI4LDExNSwgNTMsIDE4LDExMCwyNDUsMTQ2LDEwNCwgMTgsMTEyLCA5MiwgNzAsMTAxLCA0MywgIDksIDg3LAorICAgICA1MSwyMDMsICA0LDEyNCwxNzAsMjAxLCA0OCwxMTYsIDQwLDExMywgMzUsMTk4LDE1MywxNzMsIDgzLCAxOSwKKyAgICAyNDMsMTc2LDE0OCwyMjMsIDEyLCA2NywgNzUsMTM0LDI1NSwxMzYsIDQ5LCAgNCwxNTcsMTM4LDExMSwgNTAsCisgICAgMTEyLDIwNSwgOTgsMjI0LCAxMiwxMjQsIDQwLDEyOCwgNTUsIDM4LCAyNSwxMzMsIDE0LDIxMywgNzUsICA0LAorICAgIDI1MiwyMzIsIDIyLDE5NSwyMDgsMTYxLCA4NiwxNTgsIDUxLCA5MiwxNzEsIDE0LDIyMywgMTgsMjQwLDI1MCwKKyAgICAgNjcsMTM0LDE2MSwgNjcsIDk1LDIzOSwyMTksIDMwLDE0NywxNjgsMTI1LDE0NSwyMDksIDcyLCA0OSwgMjgsCisgICAgMTgxLCA4NiwgNjYsMTM3LCA2MSwxMDYsMTcxLCA4MiwxMDYsIDY5LDEzNCwgMTksMTM0LDE0NCwyMDAsMTA5LAorICAgIDEwMSwgMzMsIDMwLCA5NCwxMDgsMjI5LCAyNSwxNDYsIDc0LDE1MywgNzMsICA3LDIyNCwxMjAsMTI4LDI1MywKKyAgICAyMTEsIDY5LDEzNCwxNjQsMTY2LCAxMiwxNjQsMTk3LDExNCwxNzgsMjAzLDE5OCwyMzEsMjI3LCAxOCwxMDMsCisgICAgMTg2LCAxMCwxODksMTIzLDIzNCwxMTQsMTY3LDEzNywgNzYsMTI3LDI1NSwxNTYsMTYxLCAgNSwyNDEsMjM2LAorICAgIDI0NiwyMzQsMTc1LDIwMywyMTQsMjIyLDE2NCwgNzYsMTExLDE1NiwgOTksMTM2LCA5NCwxNzAsMTQ1LDE4MSwKKyAgICAxODUsIDQ2LCA5MSwyNTEsMTEwLCA0MiwxNzUsMTc4LDE5NywxODQsMjA5LDEyMiwyMTgsMjM0LCAxNiwxOTAsCisgICAgMTI5LDE2MywyNDksMTY4LCA5MiwxMDIsMTY4LDE1NywgIDQsMjM1LDIzNywyMjIsMTYyLDIyNiwyNDEsMTA2LAorICAgICAzMywgNjAsMTA1LCA0NSwyMDUsMTQ0LDEzMywgMTYsMTYyLDEyMiwxMzMsIDIyLDE5OSwyMzksMTEwLCA2MywKKyAgICAyMjUsMjQzLDI0MiwgNDQsIDMwLCA2NCwgMzEsIDg2LDI0MCwgMzgsIDYxLCA3OCwxNzgsIDYyLDIzMSwyNDUsCisgICAgMTQ3LCAgMSwxNzUsMTM1LCAgMywyNTIsMjAzLDE1NSwxOTUsMjI1LDI0MSwgNzIsMTc2LDE3MywxMjUsMTkxLAorICAgIDIyMywxNjAsMjMyLCAgNiwgIDQsIDEwLDI1MSwxOTksIDIxLDI1MSwgODYsMTgyLDE5MSwxMzMsMjM0LCAxMiwKKyAgICAgIDksIDIxLDE4OCwxNDMsIDgzLDExMywxNTksIDM4LCA4NiwxMDMsMTcyLDE3MywyMzIsICA1LCA2NiwgMzUsCisgICAgMTcwLDE4NiwyNDYsMTg3LDExMiwyMDMsIDU4LCA0NCwxMzAsMjMwLDE2MiwyMzQsIDM1LDEzMiwyMjAsIDI0LAorICAgIDEzOSwgODUsIDI3LDExMywxNTAsIDc4LCAzNiwgNjcsIDgzLDE3OCwyMTUsIDkzLDExMSwxNjgsMTkwLCA3NiwKKyAgICAgNzQsMTM2LCA0MiwyMDUsMjA4LDIyNywxNjUsMTc2LDE0MiwxNjgsMTg1LDI0NSwgMjcsIDgzLDExNCwgNzEsCisgICAgIDg4LCA1MSwgMzAsIDUxLDE5MywxMjAsIDQ1LDE2MywyMzQsMTAzLCAyOCwgOTcsIDEzLDE2OCwxNzgsMjA4LAorICAgIDIzNCwxMjUsMTg0LDE2OCwxMjMsMTM2LCA3MSwgMzQsMTQ2LCA5NywxMzYsMTIwLDEyOSwgNjQsMTYwLDEzMSwKKyAgICAgMzIsMjU0LDEzNCwgIDYsMTA0LCA5NCwxOTgsMTM3LDEwOCwxMDMsIDQzLDE3NiwyMjMsMTg1LDExNCwxODgsCisgICAgMTc3LDIxMCwxNzksIDU5LCA5MiwxMjcsICA3LCAgMCwxNjIsMTcwLDE5NiwgODQsMTgyLDE0NywyMjYsMjE2LAorICAgICAgMCwgIDAsICAwLCAgMCwgNzMsIDY5LCA3OCwgNjgsMTc0LCA2NiwgOTYsMTMwCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfZGF0YV9lbmRfcG5nWzM1NjJdID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMCwgNDYsICAwLCAgMCwgIDAsIDQ3LCAxNiwgIDYsICAwLCAgMCwgIDAsMjA0LDExNywgMzYsCisgICAgMjA5LCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsIDEwLCA3OSwxMDUsIDY3LCA2NywgODAsIDgwLDEwNCwKKyAgICAxMTEsMTE2LDExMSwxMTUsMTA0LDExMSwxMTIsIDMyLCA3MywgNjcsIDY3LCAzMiwxMTIsMTE0LDExMSwxMDIsCisgICAgMTA1LDEwOCwxMDEsICAwLCAgMCwxMjAsMjE4LDE1NywgODMsMTAzLCA4NCwgODMsMjMzLCAyMiwgNjEsMjQ3LAorICAgIDIyMiwyNDQsIDY2LCA3NSwxMzYsMTI4LDE0OCwgNzUsMTExLCA4MiwgMjEsICA4LCAzMiwgODIsIDY2LDEzOSwKKyAgICAxMjgsIDIwLDE0NSwgMzgsIDQyLCAzMywgIDksIDE2LCA3NCwxMzYsIDMzLDE2MSwyMTcsIDIxLCA4MSwxOTMsCisgICAgIDE3LCA2OSwgNjksICA0LCAyNywyMDAsMTYwLDEzNiwgIDMsMTQyLDE0MiwxMjgsMTQwLCAyMSwgODEsIDQ0LAorICAgICAxMiwxMzgsIDEwLDIxNiwgIDcsMjI4LCAzMywxNjIsMTQyLDEzMSwxNjMsMTM2LDEzOCwyMDIsMjUxLDIyNSwKKyAgICAxMjMsMTYzLDEwNywyMTQsMTg4LDI0NywyMzAsMjA1LDI1NCwxODEsMjE1LCA2MiwyMzEsMTcyLDI0MywxNTcsCisgICAgMTc5LDIwNywgIDcsMTkyLCAgOCwgMTIsMTUwLCA3MiwgNTEsIDgxLCA1MywxMjgsIDEyLDE2OSwgNjYsIDMwLAorICAgICAxNywyMjQsMTMxLDE5OSwxOTYsMTk4LDIyNSwyMjgsIDQ2LCA2NCwxMjksIDEwLCAzNiwxMTIsICAwLCAxNiwKKyAgICAgIDgsMTc5LDEwMCwgMzMsMTE1LDI1MywgMzUsICAxLCAgMCwyNDgsMTI2LCA2MCwgNjAsIDQzLCAzNCwxOTIsCisgICAgICA3LDE5MCwgIDAsICAxLDEyMCwyMTEsIDExLCAgOCwgIDAsMTkyLCA3NywxNTUsMTkyLCA0OCwgMjgsMTM1LAorICAgIDI1NSwgMTUsMjM0LCA2NiwxNTMsIDkyLCAgMSwxMjgsMTMyLCAgMSwxOTIsMTE2LDE0NSwgNTYsIDc1LCAgOCwKKyAgICAxMjgsIDIwLCAgMCwgNjQsMTIyLDE0MiwgNjYsMTY2LCAgMCwgNjQsIDcwLCAgMSwxMjgsMTU3LDE1MiwgMzgsCisgICAgIDgzLCAgMCwxNjAsICA0LCAgMCwgOTYsMjAzLCA5OSwgOTgsMjI3LCAgMCwgODAsIDQ1LCAgMCwgOTYsIDM5LAorICAgIDEyNywyMzAsMjExLCAgMCwxMjgsMTU3LDI0OCwxNTMsMTIzLCAgMSwgIDAsIDkxLDE0OCwgMzMsIDIxLCAgMSwKKyAgICAxNjAsMTQ1LCAgMCwgMzIsIDE5LDEwMSwxMzYsIDY4LCAgMCwxMDQsIDU5LCAgMCwxNzIsMjA3LCA4NiwxMzgsCisgICAgIDY5LCAgMCwgODgsIDQ4LCAgMCwgMjAsMTAyLCA3NSwxOTYsIDU3LCAgMCwyMTYsIDQ1LCAgMCwgNDgsIDczLAorICAgICA4NywxMDIsIDcyLCAgMCwxNzYsMTgzLCAgMCwxOTIsMjA2LCAxNiwgMTEsMTc4LCAgMCwgIDgsIDEyLCAgMCwKKyAgICAgNDgsIDgxLDEzNiwxMzMsIDQxLCAgMCwgIDQsMTIzLCAgMCwgOTYsMjAwLCAzNSwgMzUsMTIwLCAgMCwxMzIsCisgICAgMTUzLCAgMCwgMjAsIDcwLDI0MiwgODcsIDYwLDI0MSwgNDMsMTc0LCAxNiwyMzEsIDQyLCAgMCwgIDAsMTIwLAorICAgIDE1MywxNzgsIDYwLDE4NSwgMzYsIDU3LCA2OSwxMjksIDkxLCAgOCwgNDUsMTEzLCAgNywgODcsIDg3LCA0NiwKKyAgICAgMzAsIDQwLDIwNiwgNzMsIDIzLCA0MywgMjAsIDU0LCA5NywgIDIsIDk3LDE1NCwgNjQsIDQ2LDE5NCwxMjEsCisgICAgMTUzLCAyNSwgNTAsMTI5LCA1MiwgMTUsMjI0LDI0MywyMDQsICAwLCAgMCwxNjAsMTQ1LCAyMSwgMTcsMjI0LAorICAgIDEzMSwyNDMsMjUzLDEyMCwyMDYsIDE0LDE3NCwyMDYsMjA2LCA1NCwxNDIsMTgyLCAxNCwgOTUsIDQ1LDIzNCwKKyAgICAxOTEsICA2LDI1NSwgMzQsIDk4LCA5OCwyMjcsMjU0LDIyOSwyMDcsMTcxLDExMiwgNjQsICAwLCAgMCwyMjUsCisgICAgMTE2LDEyNiwyMDksMjU0LCA0NCwgNDcsMTc5LCAyNiwxMjgsIDU5LCAgNiwxMjgsMTA5LDI1NCwxNjIsIDM3LAorICAgIDIzOCwgIDQsMTA0LCA5NCwgMTEsMTYwLDExNywyNDcsMTM5LDEwMiwxNzgsIDE1LCA2NCwxODEsICAwLDE2MCwKKyAgICAyMzMsMjE4LCA4NywyNDMsMTEyLDI0OCwxMjYsIDYwLCA2MCwgNjksMTYxLDE0NCwxODUsMjE3LDIxNywyMjksCisgICAgMjI4LDIyOCwyMTYsIDc0LDE5NiwgNjYsIDkxLCA5NywyMDIsIDg3LDEyNSwyNTQsMTAzLDE5NCwgOTUsMTkyLAorICAgICA4NywyNTMsMTA4LDI0OSwxMjYsIDYwLDI1MiwyNDcsMjQ1LDIyNCwxOTAsMjI2LCAzNiwxMjksIDUwLCA5MywKKyAgICAxMjksIDcxLCAgNCwyNDgsMjI0LDE5NCwyMDQsMjQ0LCA3NiwxNjUsIDI4LDIwNywxNDYsICA5LDEzMiwgOTgsCisgICAgMjIwLDIzMCwxNDMsIDcxLDI1MiwxODMsIDExLDI1NSwyNTIsIDI5LDIxMSwgMzQsMTk2LCA3MywgOTgsMTg1LAorICAgICA4OCwgNDIsIDIwLDIyNywgODEsIDE4LDExMywxNDIsIDY4LDE1NCwxNDAsMjQzLCA1MCwxNjUsIDM0LDEzNywKKyAgICAgNjYsMTQ2LCA0MSwxOTcsIDM3LDIxMCwyNTUsMTAwLDIyNiwyMjMsIDQ0LDI1MSwgIDMsIDYyLDIyMywgNTMsCisgICAgICAwLDE3NiwxMDYsIDYyLCAgMSwxMjMsMTQ1LCA0NSwxNjgsIDkzLCA5OSwgIDMsMjQ2LCA3NSwgMzksIDE2LAorICAgICA4OCwxMTYsMTkyLDIyNiwyNDcsICAwLCAgMCwyNDIsMTg3LDExMSwxOTMsMjEyLCA0MCwgIDgsICAzLDEyOCwKKyAgICAxMDQsMTMxLDIyNSwyMDcsMTE5LDI1NSwyMzksIDYzLDI1MywgNzEsMTYwLCAzNywgIDAsMTI4LDEwMiwgNzMsCisgICAgMTQ2LDExMywgIDAsICAwLCA5NCwgNjgsIDM2LCA0NiwgODQsMjAyLDE3OSwgNjMsMTk5LCAgOCwgIDAsICAwLAorICAgICA2OCwxNjAsMTI5LCA0MiwxNzYsIDY1LCAyNywyNDQsMTkzLCAyNCwgNDQsMTkyLCAgNiwgMjgsMTkzLCAgNSwKKyAgICAyMjAsMTkzLCAxMSwyNTIsIDk2LCA1NCwxMzIsIDY2LCAzNiwxOTYsMTk0LCA2NiwgMTYsIDY2LCAxMCwxMDAsCisgICAgMTI4LCAyOCwxMTQsIDk2LCA0MSwxNzIsMTMwLCA2NiwgNDAsMTM0LDIwNSwxNzYsIDI5LCA0MiwgOTYsIDQ3LAorICAgIDIxMiwgNjQsIDI5LCA1MiwxOTIsIDgxLDEwNCwxMzQsMTQ3LDExMiwgMTQsIDQ2LDE5NCwgODUsMTg0LCAxNCwKKyAgICAgNjEsMTEyLCAxNSwyNTAsIDk3LCAgOCwxNTgsMTkzLCA0MCwxODgsMTI5LCAgOSwgIDQsIDY1LDIwMCwgIDgsCisgICAgIDE5LCA5NywgMzMsMjE4LDEzNiwgIDEsIDk4LDEzOCwgODgsIDM1LDE0MiwgIDgsIDIzLDE1MywxMzMsMjQ4LAorICAgICAzMywxOTMsIDcyLCAgNCwgMTgsMTM5LCAzNiwgMzIsMjAxLDEzNiwgMjAsIDgxLCAzNCwgNzUsMTQ1LCA1MywKKyAgICAgNzIsIDQ5LCA4MiwxMzgsIDg0LCAzMiwgODUsIDcyLCAyOSwyNDIsIDYxLDExNCwgIDIsIDU3LDEzNSwgOTIsCisgICAgIDcwLDE4NiwxNDUsIDU5LDIwMCwgIDAsIDUwLDEzMCwyNTIsMTM0LDE4OCwgNzEsIDQ5LDE0OCwxMjksMTc4LAorICAgICA4MSwgNjEsMjEyLCAxMiwxODEsIDY3LDE4NSwxNjgsIDU1LCAyNiwxMzIsIDcwLDE2MiwgMTEsMjA4LDEwMCwKKyAgICAxMTYsIDQ5LDE1NCwxNDMsIDIyLDE2MCwxNTUsMjA4LDExNCwxODAsIDI2LCA2MSwxNDAsIDU0LDE2MSwyMzEsCisgICAgMjA4LDE3MSwxMDQsIDE1LDIxOCwxNDMsIDYyLCA2NywxOTksIDQ4LDE5MiwyMzIsIDI0LCAgNywgNTEsMTk2LAorICAgIDEwOCwgNDgsIDQ2LDE5OCwxOTUsIDY2LDE3NywgNTYsIDQ0LCAgOSwxNDcsIDk5LDIwMywxNzcsIDM0LDE3MiwKKyAgICAgMTIsMTcxLDE5OCwgMjYsMTc2LCA4NiwxNzIsICAzLDE4NywxMzcsMjQ1LCA5OSwyMDcsMTc3LDExOSwgIDQsCisgICAgIDE4LDEyOSwgNjksMTkyLCAgOSwgNTQsICA0LDExOSwgNjYsIDMyLCA5NywgMzAsIDY1LCA3MiwgODgsIDc2LAorICAgICA4OCwgNzgsMjE2LCA3MiwxNjgsIDMyLCAyOCwgMzYsIDUyLCAxNywyMTgsICA5LCA1NSwgIDksICAzLDEzMiwKKyAgICAgODEsMTk0LCAzOSwgMzQsMTQ3LDE2OCwgNzUsMTgwLCAzOCwxODYsIDE3LDI0OSwxOTYsIDI0LCA5OCwgNTAsCisgICAgIDQ5LDEzNSwgODgsIDcyLCA0NCwgMzUsMjE0LCAxOCwxNDMsIDE5LCA0NywgMTYsMTIzLDEzNiwgNjcsMTk2LAorICAgICA1NSwgMzYsIDE4LDEzNywgNjcsIDUwLCAzOSwxODUsMTQ0LCAgMiwgNzMsMTc3LDE2NCwgODQsMjEwLCAxOCwKKyAgICAyMTAsIDcwLDIxMCwxMTAsIDgyLCAzNSwyMzMsIDQ0LDE2OSwxNTUsIDUyLCA3MiwgMjYsIDM1LDE0NywyMDEsCisgICAgMjE4LDEwMCwxMDcsMTc4LCAgNywgNTcsMTQ4LCA0NCwgMzIsIDQzLDIwMCwxMzMsMjI4LDE1NywyMjgsMTk1LAorICAgIDIyOCwgNTEsMjI4LCAyNywyMjgsIDMzLDI0MiwgOTEsIDEwLDE1NywgOTgsIDY0LDExMywxNjQsMjQ4LCA4MywKKyAgICAyMjYsIDQwLCA4MiwyMDIsMTA2LCA3NCwgMjUsMjI5LCAxNiwyMjksIDUyLDIyOSwgIDYsMTAxLDE1MiwgNTAsCisgICAgIDY1LCA4NSwxNjMsMTU0LCA4MiwyMjEsMTY4LDE2MSwgODQsIDE3LCA1MywxNDMsIDkwLCA2NiwxNzMsMTYxLAorICAgIDE4MiwgODIsMTc1LCA4MSwxMzUsMTY4LCAxOSwgNTIsMTE3LDE1NCwgNTcsMjA1LDEzMSwgMjIsIDczLCA3NSwKKyAgICAxNjUsMTczLDE2MiwxNDksMjExLCAyNiwxMDQsIDIzLDEwNCwyNDcsMTA1LDE3NSwyMzIsMTE2LDE4NiwgMTcsCisgICAgMjIxLDE0OSwgMzAsIDc4LDE1MSwyMDgsIDg3LDIxMCwyMDMsMjMzLCA3MSwyMzIsMTUxLDIzMiwgIDMsMjQ0LAorICAgIDExOSwgMTIsIDEzLDEzNCwgMjEsMTMxLDE5OSwxMzYsMTAzLCA0MCwgMjUsMTU1LCAyNCwgIDcsIDI0LDEwMywKKyAgICAgMjUsMTE5LCAyNCwxNzUsMTUyLCA3NiwxNjYsIDI1LDIxMSwxMzksIDI1LDE5OSwgODQsIDQ4LCA1NSwgNDksCisgICAgMjM1LDE1MiwyMzEsMTUzLCAxNSwxNTMsMTExLCA4NSwgODgsIDQyLDE4MiwgNDIsMTI0LCAyMSwxNDUsMjAyLAorICAgICAxMCwxNDksIDc0LDE0OSwgMzgsMTQ5LCAyNywgNDIsIDQ3LCA4NCwxNjksMTcwLDE2NiwxNzAsMjIyLDE3MCwKKyAgICAgMTEsIDg1LDI0MywgODUsMjAzLCA4NCwxNDMsMTY5LCA5NCwgODMsMTI1LDE3NCwgNzAsIDg1LCA1MSwgODMsCisgICAgMjI3LDE2OSwgIDksMjEyLDE1MCwxNzEsIDg1LDE3MCwxNTcsIDgwLDIzNSwgODMsIDI3LCA4MywxMDMsMTY5LAorICAgICA1OSwxNjgsMTM1LDE3MCwxMDMsMTY4LDExMSwgODQsIDYzLDE2NCwxMjYsIDg5LDI1MywxMzcsICA2LCA4OSwKKyAgICAxOTUsIDc2LDE5NSwgNzksIDY3LDE2NCwgODEsMTYwLDE3NywgOTUsMjI3LDE4OCwxOTgsIDMyLCAxMSwgOTksCisgICAgIDI1LDE3OSwxMjAsIDQ0LCAzMywxMDcsIDEzLDE3MSwxMzQsMTE3LDEyOSwgNTMsMTk2LCAzOCwxNzcsMjA1LAorICAgIDIxNywxMjQsMTE4LCA0MiwxODcsMTUyLDI1MywgMjksMTg3LDEzOSwgNjEsMTcwLDE2OSwxNjEsIDU3LCA2NywKKyAgICAgNTEsIDc0LCA1MSwgODcsMTc5LCA4MiwyNDMsMTQ4LDEwMiwgNjMsICA3LDIyNywxNTIsMTEzLDI0OCwxNTYsCisgICAgMTE2LCA3OCwgIDksMjMxLCA0MCwxNjcsMTUxLDI0MywxMjYsMTM4LDIyMiwgMjAsMjM5LCA0MSwyMjYsIDQxLAorICAgICAyNywxNjYsIDUyLCA3NiwxODUsIDQ5LDEwMSwgOTIsMTA3LDE3MCwxNTAsMTUxLDE1MCwgODgsMTcxLCA3MiwKKyAgICAxNzEsIDgxLDE3MSwgNzEsMjM1LDE4OSwgNTQsMTc0LDIzNywxNjcsMTU3LDE2NiwxODksIDY5LDE4NywgODksCisgICAgMjUxLDEyOSwgMTQsIDY1LDE5OSwgNzQsIDM5LCA5MiwgMzksIDcxLDEwMywxNDMsMjA2LCAgNSwxNTcsMjMxLAorICAgICA4MywyMTcsIDgzLDIyMSwxNjcsIDEwLDE2NywgMjIsIDc3LCA2MSwgNTgsMjQ1LDE3NCwgNDYsMTcwLDEwNywKKyAgICAxNjUsIDI3LDE2MSwxODcsIDY4LDExOSwxOTEsMTEwLDE2NywyMzgsMTUyLDE1OCwxOTAsIDk0LDEyOCwxNTgsCisgICAgIDc2LDExMSwxNjcsMjIyLDEyMSwxODksMjMxLDI1MCwgMjgsMTI1LCA0NywyNTMsIDg0LDI1MywxMDksMjUwLAorICAgIDE2NywyNDUsIDcxLCAxMiwgODgsICA2LDE3OSwgMTIsIDM2LCAgNiwyMTksIDEyLDIwNiwgMjQsIDYwLDE5NywKKyAgICAgNTMsMTEzLDExMSwgNjAsIDI5LCA0NywxOTksMjE5LDI0MSwgODEsIDY3LCA5MywxOTUsIDY0LCA2NywxNjUsCisgICAgIDk3LDE0OSwgOTcsMTUxLDIyNSwxMzIsMTQ1LDE4NSwyMDksIDYwLDE2MywyMTMsIDcwLDE0MSwgNzAsIDE1LAorICAgIDE0MCwxMDUsMTk4LCA5MiwyMjcsIDM2LDIyNywxMDksMTk4LDEwOSwxOTgsMTYzLCAzOCwgIDYsIDM4LCAzMywKKyAgICAgMzgsIDc1LCA3NywyMzQsIDc3LDIzOCwxNTQsIDgyLCA3NywxODUsMTY2LCA0MSwxNjYsIDU5LCA3NiwgNTksCisgICAgIDc2LDE5OSwyMDUsMjA0LDIwNSwxNjIsMjA1LDIxNCwxNTMsIDUzLDE1NSwgNjEsIDQ5LDIxNSwgNTAsMjMxLAorICAgIDE1NSwyMzEsMTU1LDIxNSwxNTUsMjIzLDE4MywgOTYsIDkwLDEyMCwgOTAsIDQ0LDE4MiwxNjgsMTgyLDE4NCwKKyAgICAxMDEsIDczLDE3OCwyMjgsIDkwLDE2NiwgODksMjM4LDE4MiwxODgsMTEwLDEzMywgOTAsIDU3LCA4OSwxNjUsCisgICAgIDg4LCA4NSwgOTAsIDkzLDE3OSwgNzAsMTczLDE1NywxNzMsIDM3LDIxNCwxODcsMTczLDE4NywxNjcsIDE3LAorICAgIDE2NywxODUsIDc4LDE0NywgNzgsMTcxLDE1OCwyMTQsMTAzLDE5NSwxNzYsMjQxLDE4MiwyMDEsMTgyLDE2OSwKKyAgICAxODMsIDI1LDE3NiwyMjksMjE2LCAgNiwyMTksMTc0LDE4MiwxMDksMTgyLDEyNSwgOTcsMTAzLCA5OCwgMjMsCisgICAgMTAzLDE4MywxOTcsMTc0LDE5NSwyMzgsMTQ3LDE4OSwxNDcsMTI1LDE4NiwxMjUsMTQxLDI1MywgNjEsICA3LAorICAgICAxMywxMzUsMjE3LCAxNCwxNzEsIDI5LCA5MCwgMjksMTI2LDExNSwxODAsMTE0LCAyMCwgNTgsIDg2LCA1OCwKKyAgICAyMjIsMTU0LDIwNiwxNTYsMjM4LCA2MywxMjUsMTk3LDI0NCwxNTAsMjMzLCA0NywxMDMsIDg4LDIwNywgMTYsCisgICAgMjA3LDIxNiwgNTEsMjI3LDE4MiwgMTksMjAzLCA0MSwxOTYsMTA1LDE1NywgODMsMTU1LDIxMSwgNzEsMTAzLAorICAgICAyMywxMDMsMTg1LDExNSwxMzEsMjQzLDEzNiwxMzksMTM3LCA3NSwxMzAsMjAzLCA0NiwxNTEsIDYyLCA0NiwKKyAgICAxNTUsIDI3LDE5OCwyMjEsMjAwLDE4OSwyMjgsIDc0LDExNiwyNDUsMTEzLCA5MywyMjUsMTIyLDIxMCwyNDUsCisgICAgMTU3LDE1NSwxNzksMTU1LDE5NCwyMzcsMTY4LDIxOSwxNzUsMjM4LCA1NCwyMzgsMTA1LDIzOCwxMzUsMjIwLAorICAgIDE1OSwyMDQsIDUyLDE1OSwgNDEsMTU4LCA4OSwgNTEsMTE1LDIwOCwxOTUsMjAwLCA2NywyMjQsIDgxLDIyOSwKKyAgICAyMDksIDYzLCAxMSwxNTksMTQ5LCA0OCwxMDcsMjIzLDE3MiwxMjYsIDc5LCA2NywgNzksMTI5LDEwMywxODEsCisgICAgMjMxLCAzNSwgNDcsIDk5LCA0NywxNDUsIDg3LDE3MywyMTUsMTc2LDE4MywxNjUsMTE5LDE3MCwyNDcsIDk3LAorICAgIDIzOSwgMjMsIDYyLDI0NiwgNjIsMTE0LDE1OSwyMjcsIDYyLDIyNywgNjAsIDU1LDIyMiwgNTAsMjIyLCA4OSwKKyAgICAgOTUsMjA0LCA1NSwxOTIsMTgzLDIwMCwxODMsMjAzLCA3OSwxOTUsMTExLDE1OCwgOTUsMTMzLDIyMywgNjcsCisgICAgMTI3LCAzNSwyNTUsMTAwLDI1NSwxMjIsMjU1LDIwOSwgIDAsMTY3LDEyOCwgMzcsICAxLDEwMywgIDMsMTM3LAorICAgIDEyOSwgNjUsMTI5LCA5MSwgIDIsMjUxLDI0OCwxMjIsMTI0LCAzMywxOTEsMTQyLCA2MywgNTgsMjE5LDEwMSwKKyAgICAyNDYsMTc4LDIxNywyMzcsIDY1LDE0MCwxNjAsMTg1LCA2NSwgMjEsIDY1LDE0MywxMzAsMTczLDEzMCwyMjksCisgICAgMTkzLDE3MywgMzMsMTA0LDIwMCwyMzYsMTQ0LDE3MywgMzMsMjQ3LDIzMSwxNTIsMjA2LDE0NSwyMDYsMTA1LAorICAgICAxNCwxMzMsIDgwLDEyNiwyMzIsMjE0LDIwOCwgIDcsIDk3LDIzMCwgOTcsMTM5LDE5NSwxMjYsIDEyLCAzOSwKKyAgICAxMzMsMTM1LDEzMywgODcsMTM0LCA2MywxNDIsMTEyLDEzNiwgODgsIDI2LDIwOSwgNDksMTUxLCA1MywxMTksCisgICAgMjA5LDIyMCwgNjcsMTE1LDIyMywgNjgsMjUwLCA2OCwxNTAsIDY4LDIyMiwxNTUsMTAzLCA0OSwgNzksIDU3LAorICAgIDE3NSwgNDUsIDc0LCA1MywgNDIsIDYyLDE3MCwgNDYsMTA2LCA2MCwyMTgsIDU1LDE4NiwgNTIsMTg2LCA2MywKKyAgICAxOTgsIDQ2LDEwMiwgODksMjA0LDIxMywgODgsMTU3LCA4OCwgNzMsMTA4LCA3NSwgMjgsIDU3LCA0NiwgNDIsCisgICAgMTc0LCA1NCwxMTAsMTA4LDE5MCwyMjMsMjUyLDIzNywyNDMsMTM1LDIyNiwxNTcsMjI2LCAxMSwyMjcsMTIzLAorICAgICAyMywxNTIsIDQ3LDIwMCwgOTMsMTEyLDEyMSwxNjEsMjA2LDE5NCwyNDQsMTMzLDE2NywgMjIsMTY5LCA0NiwKKyAgICAgMTgsIDQ0LCA1OCwxNTAsIDY0LCA3NiwxMzYsIDc4LCA1NiwxNDgsMjQwLCA2NSwgMTYsIDQyLDE2OCwgMjIsCisgICAgMTQwLCAzNywyNDIsIDE5LDExOSwgMzcsMTQyLCAxMCwxMjEsMTk0LCAyOSwxOTQsMTAzLCAzNCwgNDcsMjA5LAorICAgICA1NCwyMDksMTM2LDIxNiwgNjcsIDkyLCA0MiwgMzAsIDc4LDI0MiwgNzIsIDQyLCA3NywxMjIsMTQ2LDIzNiwKKyAgICAxNDUsMTg4LCA1MywxMjEsIDM2LDE5NywgNTEsMTY1LCA0NCwyMjksMTg1LDEzMiwgMzksMTY5LDE0NCwxODgsCisgICAgIDc2LCAxMywgNzYsMjIxLDE1NSwgNTgsMTU4LCAyMiwxNTQsMTE4LCAzMiwxMDksIDUwLCA2MSwgNTgsMTg5LAorICAgICA0OSwxMzEsMTQ2LDE0NSwxNDQsMTEzLCA2NiwxNzAsIDMzLCA3NywxNDcsMTgyLDEwMywyMzQsMTAzLDIzMCwKKyAgICAxMDIsMTE4LDIwMywxNzIsMTAxLDEzMywxNzgsMjU0LDE5NywxMTAsMTM5LDE4MywgNDcsIDMwLDE0OSwgIDcsCisgICAgMjAxLDEwNywxNzksMTQ0LDE3MiwgIDUsIDg5LCA0NSwgMTAsMTgyLCA2NiwxNjYsMjMyLCA4NCwgOTAsIDQwLAorICAgIDIxNSwgNDIsICA3LDE3OCwxMDMsMTAxLCA4NywxMDIsMTkxLDIwNSwxMzcsMjAyLCA1NywxNTAsMTcxLDE1OCwKKyAgICAgNDMsMjA1LDIzNywyMDQsMTc5LDIwMiwyMTksMTQ0LCA1NSwxNTYsMjM5LDE1OSwyNTUsMjM3LCAxOCwxOTQsCisgICAgIDE4LDIyNSwxNDYsMTgyLDE2NSwxMzQsIDc1LCA4NywgNDUsIDI5LCA4OCwyMzAsMTg5LDE3MiwxMDYsIDU3LAorICAgIDE3OCwgNjAsMTEzLDEyMSwyMTksIDEwLDIyNywgMjEsICA1LCA0MywxMzQsIDg2LCAgNiwxNzIsIDYwLDE4NCwKKyAgICAxMzgsMTgyLCA0MiwxMDksMjEzLCA3OSwxNzEsMjM3LCA4NywxNTEsMTc0LDEyNiwxODksIDM4LDEyMiwgNzcsCisgICAgMTA3LDEyOSwgOTQsMTkzLDIwMiwxMzAsMTkzLDE4MSwgIDEsMTA3LDIzNSwgMTEsIDg1LCAxMCwyMjksMTMzLAorICAgIDEyNSwyMzUsMjIwLDIxNSwyMzcsIDkzLCA3OSwgODgsIDQ3LCA4OSwyMjMsMTgxLCA5NywyNTAsMTM0LDE1NywKKyAgICAgMjcsIDYyLCAyMSwxMzcsMTM4LDE3NCwgMjAsMjE5LCAyMywxNTEsIDIxLDEyNywyMTYsIDQwLDIyMCwxMjAsCisgICAgMjI5LCAyNywxMzUsMTExLDIwMiwxOTEsMTUzLDIyMCwxNDgsMTgwLDE2OSwxNzEsMTk2LDE4NSwxMDAsMjA3LAorICAgIDEwMiwyMTAsMTAyLDIzMywyMzAsMjIyLCA0NSwxNTgsIDkxLCAxNCwxNTAsMTcwLDE1MSwyMzAsMTUxLCAxNCwKKyAgICAxMTAsIDEzLDIxNywyMTgsMTgwLCAxMywyMjMsIDg2LDE4MCwyMzcsMjQ1LDI0NiwgNjksMjE5LCA0NywxNTEsCisgICAgMjA1LCA0MCwyMTksMTg3LDEzMSwxODIsIDY3LDE4NSwxNjMsMTkxLCA2MCwxODQsMTg4LDEwMSwxNjcsMjAxLAorICAgIDIwNiwyMDUsIDU5LCA2MywgODQsMTY0LCA4NCwyNDQsIDg0LDI1MCwgODQsIDU0LDIzOCwyMTAsMjIxLDE4MSwKKyAgICAgOTcsMjE1LDI0OCwxMTAsMjA5LDIzOCwgMjcsMTIzLDE4OCwyNDYsIDUyLDIzNiwyMTMsMjE5LCA5MSwxODgsCisgICAgMjQ3LDI1MywgNjIsMjAxLDE5MCwyMTksIDg1LCAgMSwgODUsIDc3LDIxMywxMDIsMjEzLDEwMSwyNTEsIDczLAorICAgIDI1MSwxNzksMjQ3LCA2MywxNzQsMTM3LDE3MCwyMzMsMjQ4LDE1MCwyNTEsMTA5LCA5MywxNzMsIDc4LDEwOSwKKyAgICAxMTMsMjM3LDE5OSwgIDMsMjEwLCAgMywyNTMsICA3LCAzNSwgMTQsMTgyLDIxNSwxODUsMjEyLDIxMywgMjksCisgICAgMjEwLCA2MSwgODQsIDgyLDE0MywyMTQsIDQzLDIzNSwgNzEsIDE0LDE5OSwgMzEsMTkwLDI1NCwxNTcsMjM5LAorICAgIDExOSwgNDUsIDEzLCA1NCwgMTMsIDg1LDE0MSwxNTYsMTk4LDIyNiwgMzUsMTEyLCA2OCwxMjEsMjI4LDIzMywKKyAgICAyNDcsICA5LDIyMywyNDcsIDMwLCAxMywgNTgsMjE4LDExOCwxNDAsMTIzLDE3MiwyMjUsICA3LDIxMSwgMzEsCisgICAgMTE4LCAyOSwxMDMsIDI5LCA0NywxMDYsIDY2LDE1NCwyNDIsMTU0LCA3MCwxNTUsIDgzLDE1NCwyNTEsIDkxLAorICAgICA5OCwgOTEsMTg2LCA3OSwyMDQsIDYyLDIwOSwyMTQsMjM0LDIyMiwxMjIsMjUyLCA3MSwyMTksIDMxLCAxNSwKKyAgICAxNTYsIDUyLCA2MCwgODksMTIxLCA3NCwyNDMsIDg0LDIwMSwxMDUsMjE4LDIzMywxMzAsMjExLDE0NywxMDMsCisgICAgMjQyLDIwNywxNDAsMTU3LDE0OSwxNTcsMTI1LDEyNiwgNDYsMjQ5LDIyMCwgOTYsMjE5LDE2MiwxODIsMTIzLAorICAgIDIzMSwgOTksMjA2LDIyMywxMDYsIDE1LDExMSwyMzksMTg2LCAxNiwxMTYsMjI1LDIxMCwgNjksMjU1LDEzOSwKKyAgICAyMzEsIDU5LDE4OCwgNTksMjA2LCA5MiwyNDIsMTg0LDExNiwyNDIsMTc4LDIxOSwyMjksIDE5LCA4NywxODQsCisgICAgIDg3LDE1NCwxNzUsIDU4LCA5NSwxMDksMjM0LDExNiwyMzQsIDYwLDI1NCwxNDcsMjExLCA3OSwxOTksMTg3LAorICAgIDE1NiwxODcsMTU0LDE3NCwxODUsIDkyLDEwNywxODUsMjM4LDEyMiwxODksMTgxLDEyMywxMDIsMjQ3LDIzMywKKyAgICAgMjcsMTU4LCA1NSwyMDYsMjIxLDI0NCwxODksMTIxLDI0MSwgMjIsMjU1LDIxNCwyMTMsMTU4LCA1NywgNjEsCisgICAgMjIxLDE4OSwyNDMsMTIyLDExMSwyNDcsMTk3LDI0NywyNDUsMjIzLCAyMiwyMjEsMTI2LDExNCwgMzksMjUzLAorICAgIDIwNiwyMDMsMTg3LDIxNywxMTksIDM5LDIzOCwxNzMsMTg4LCA3OSwxODgsIDk1LDI0NCwgNjQsMjM3LCA2NSwKKyAgICAyMTcsIDY3LDIyMSwxMzUsMjEzLCA2MywgOTEsMjU0LDIyMCwyMTYsMjM5LDIyMCwxMjcsMTA2LDE5MiwxMTksCisgICAgMTYwLDI0MywyMDksMjIwLCA3MSwyNDcsICA2LDEzMywxMzEsMjA3LDI1NCwxNDUsMjQ1LDE0MywgMTUsIDY3LAorICAgICAgNSwxNDMsMTUzLDE0MywyMDMsMTM0LCAxMywxMzQsMjM1LDE1OCwgNTYsIDYyLCA1NywgNTcsMjI2LCA2MywKKyAgICAxMTQsMjUzLDIzMywyNTIsMTY3LCA2NywyMDcsMTAwLDIwNywgMzgsMTU4LCAyMywyNTQsMTYyLDI1NCwyMDMsCisgICAgMTc0LCAyMywgMjIsIDQ3LDEyNiwyNDgsMjEzLDIzNSwyMTUsMjA2LDIwOSwxNTIsMjA5LDE2MSwxNTEsMjQyLAorICAgIDE1MSwxNDcsMTkxLDEwOSwxMjQsMTY1LDI1MywyMzQsMTkyLDIzNSwgMjUsMTc1LDIxOSwxOTgsMTk0LDE5OCwKKyAgICAgMzAsMTkwLDIwMSwxMjAsIDUxLCA0OSwgOTQsMjQ0LCA4NiwyNTEsMjM3LDE5MywxMTksMjIwLDExOSwgMjksCisgICAgMjM5LDE2MywyMjMsIDE1LCA3OSwyMjgsMTI0LCAzMiwxMjcsIDQwLDI1NSwxMDQsMjQ5LDE3NywyNDUsIDgzLAorICAgIDIwOCwxNjcsMjUxLDE0NywgMjUsMTQ3LDE0NywyNTUsICA0LCAgMywxNTIsMjQzLDI1MiwgOTksIDUxLCA0NSwKKyAgICAyMTksICAwLCAgMCwgIDAsIDMyLCA5OSwgNzIsIDgyLCA3NywgIDAsICAwLDEyMiwgMzcsICAwLCAgMCwxMjgsCisgICAgMTMxLCAgMCwgIDAsMjQ5LDI1NSwgIDAsICAwLDEyOCwyMzMsICAwLCAgMCwxMTcsIDQ4LCAgMCwgIDAsMjM0LAorICAgICA5NiwgIDAsICAwLCA1OCwxNTIsICAwLCAgMCwgMjMsMTExLDE0NiwgOTUsMTk3LCA3MCwgIDAsICAwLCAgMywKKyAgICAgMjEsIDczLCA2OCwgNjUsIDg0LDEyMCwyMTgsMjM2LDE1NiwgNjEsIDcyLCA5MSwgODEsIDIwLDE5OSwgOTUsCisgICAgIDMxLCA4OSwxNDAsMjA4LCA2OSwyMDksIDgyLDIyNiwyMDgsMTUwLDIxOCwxOTcsMTYyLCA5OSwyNDMsMjM2LAorICAgIDE2NiwxMzYsMTMxLCAgMSwgNjksMTEyLCAxMCwxNDYsMTczLDE1MiwxNzcsMTI2LCA3NiwxNzMsIDcwLCA0MCwKKyAgICAgMjksMTcyLDE3NCwxNDksMTEwLCAxNywgNTEsICA5LDE0NiwxMzAsIDI5LCA3NCwgODEsIDU1LDE0NywxNDIsCisgICAgIDc5LDIzNiwxNjIsMTQxLDIzNywxNjAsMTgwLCAyNCwyMzQsIDk4LCA3NSwxNzgsIDU4LDIyMCwxMTUsMTMyLAorICAgIDExOSwyMjcsMjM1LDI1MSwxODYsMjQ3LDIzMCwgMzcsIDU3LDI1NSwyMjksMjI4LDIyNywyMzAsIDM3LDI0OSwKKyAgICAyMjEsMTE1LDIwNywgNjEsMjMxLDIzMCwyMjIsMjIwLCAyNSwxMjQsMTkwLDE4NSwgODksMjUwLDE3NCwxMzMsCisgICAgIDkyLCAyOSwgMzUsIDg2LDEwNywxNjcsMjAyLCA1MiwxNzksMjMxLCA5MywgOTcsMjUzLCAzOCwxNDUsMTEyLAorICAgIDEyNCwxNDAsMTI5LCAgMSwxMDIsMTIzLDI1NSwxMjksIDkzLDEwMSwxODIsMjMxLDE5NCwyMjcsMTMzLDI0MiwKKyAgICAgOTYsIDYzLCA0OCwxMTUsMjE0LCAxMywgMjIsIDU4LDIyNCwyMjgsIDQ2LDE3OSwxNjYsMjAxLDEwOCwgNTMsCisgICAgMjE3LDIyOCwxOTIsIDk5LDEwMSwxMDIsMTM1LCA3NCwgIDAsMTg2LDE1OSwyMTcsMTA0LDE0MiwxMDcsMTIwLAorICAgICAzMywyMzAsMjUzLDE3NiwxOTUsMjA4LCAyNiwyMjAsMjQzLDEwMiwxNTQsMjE3LDE4OSwxMzUsMjA4LCAzMywKKyAgICAxMTUsIDEzLCAxNCwgMjgsIDY3LCA2NCwyMzQsIDQzLDEyMCwxMTAsMTU4LDEwNywxMTIsIDg0LDIzMSwxNDUsCisgICAgICA1LCAyOSwgMTQsICAzLDIzNiwxMDIsICA0LDIzNiwgNDQsMjAyLDIzNCwgIDAsIDczLDE5MiwgMTksMjQ3LAorICAgIDE1MywgMjksMTU1LDEzMiwgIDcsIDM4LDE4MSwxMzQsIDgwLDIzOSwgNTksMTAyLDEwMywxODUsIDE3LDE0NCwKKyAgICAgNTMsIDY4LDEzMywxNjAsMTM2LCA4OCwgNzksMTU4LCA3MywyNTEsMTQwLDE4OSwgMzMsIDIxLDE0MiwxMjgsCisgICAgMTgzLCAxOSwyMDQsMTc0LDE0OSwxMzEsIDc4LDIwMiwxODYsMTUyLDE1MiwyNTIsIDQyLDIyMywgOTIsMTYwLAorICAgIDEyMSwyMjUsIDI4LDI0MywgMjYsMTkwLDEwMywyNTIsMTU1LCA5OCwyMjQsICA4LDEyMiwxODIsMjIxLDEwMiwKKyAgICAyMTAsMTA3LDExNCwxNjUsIDE0LDI1MiwxMzAsMjE1LCAgOSwxODAsIDkwLDI0MCwgNDYsMTI5LDE4MywgIDEsCisgICAgMjE2LDI0NCwgMTIsMTI5LDE5MCwgNzcsIDgzLCAxNSwxNzIsIDE0LCAyNSwgMjQsMTIwLDE3MCwyMjQsMTc0LAorICAgIDIxMCwxMDcsIDg1LCA2OSwgNTcsMTM1LDEwOCwyMDMsMjQ5LCAgNCwxNDIsIDIxLCAzMiwyMDYsMjE0LCAzNiwKKyAgICAxMTksMjE3LCA5MCwgMzQsMjI3LCAxNywgNTYsMjQ2LDIwOCwyMTIsIDM1LDEzMCwyMzIsIDcxLCA2NywyNDMsCisgICAgMTE4LCAxNywxOTMsICA2LDI0OCwyNDAsICAyLDEzMywgMTYsIDE3LCAyNiwyMDMsMTg0LCAgNCwgMzAsMTQzLAorICAgICAxOSwgNDQsIDE3LCA1MCwxNDIsMTIwLDE5OSwyMTMsMTExLDE0MywyMTcsMjI4LDIxNywxMzAsIDY3LDIwNCwKKyAgICAgMTUsIDI3LDIyNCwyNTMsMjM5LCAgOSwxNDIsMjA0LCAzNywxMzAsIDkwLCAxNSwxNjcsMTA4LCA2OCwxMDYsCisgICAgMjQ2LCAxOCwgNDMsMjM1LDIxNCwxMzIsMTU3LCAxMCwgMjYsMTg1LDEyMiwxNzgsMTcwLDIyNywgMTMsMTMwLAorICAgIDE2MSwgNjYsMTc3LDExMywxNTcsIDYwLCA5MSwxNjUsIDU4LCA3MSwgIDEsIDU2LDI1NCwxNTAsIDcyLDE0NiwKKyAgICAyMzYsMjI1LDE5MSwxMTcsMTMwLDE2MCwgODIsMjA5LCAyOCwgIDEsIDg3LCA0NCwgIDIsIDc4LDE5MiwgOTEsCisgICAgICAyLDI0OCwgODksIDIzLDE2MSwgODAsMTYxLDE0NywxMjEsICAwLCA5NCwxNzMsIDE2LCAxMiwgMjEsMTcwLAorICAgICAzNiwgIDEsMjQ4LDI0MSwgNzUsMTMwLDE2MSwgNjYsMjMxLCAzMSwgIDEsMTg0LDI1MiwgNDUsIDk0LCAzNiwKKyAgICAyMzAsMjE2LDIyMCwgNzAsIDMyLDI0MywxNDQsIDg5LCA5MCwxOTYsIDE4LCAyOSwgNzQsMTkyLDE3NywyMTksCisgICAgMTg1LCA0NCwgIDUsMTgzLDExOCwxNDUsMTk2LCAxMCwgMjksMTg1LCAzOCwgNDUsMTk2LDEwOSwxODgsMTQ5LAorICAgICAzNiwgNjUsIDE4LDE2OSwgOTgsICAxLDExMSwxMTMsIDMzLCAgNSwgNTUsIDQzLDE1NCwyMDgsMTkyLCAzMiwKKyAgICAgODYsICAxLDIxMSwgNjQsMTc2LCA4NywgMTQsMTMzLDIwNywxNjcsIDEyLDEyMSwxODYsICA4LDIyNSwxODIsCisgICAgMTAzLDE5OSwgNzQsMjQzLDI0MiwgMTEsMTc5LDI1MSwxNDMsICA5LCA5MCwgMzIsMjA3LDE1OCwyNDMsIDg4LAorICAgIDIxOCwyMzksMjUyLDEzMCwgNzQsMTgwLDE1NSwgMzIsMTIyLDIwMSwgNzAsMTc4LDIwNywgMjgsIDc0LDEyMywKKyAgICAgMzksMjI1LDEzNCwxMTYsIDEwLCA0OSwyNTUsMjE1LDIxNCwgNzksMTA3LDEzMiwyNDAsIDEzLCAyOCwgNTUsCisgICAgMTYwLDIyNywgIDUsIDczLCA4NiwyMzcsMTkzLDIwMSwxMzcsIDk4LDE1OSwgODMsIDc1LDE0MywxNzEsMTMzLAorICAgIDEyMCwxOTMsMjM2LCAzMiwgNjUsMjE0LCA1MiwgNzcsIDQzLCA2MCwgIDUsIDcxLCA0NCwxODUsMTI1LDEzMywKKyAgICAyMDcsMjI5LDIxNywgODYsICA3LDE0MywxNjAsIDU1LCA2MCwyMzEsMjA1LCAgMSwyMTUsMTk1LCAxNywyNTIsCisgICAgMjUwLDEyMiwxMDcsMTk2LDI0OCwxNzMsIDgzLDE5MSwxNjAsICA1LCAgMSwyMzEsIDQzLDIxMiwgNTUsIDE5LAorICAgIDIxNCwxODAsMTY4LDIwOSwxMzMsMTQ3LDIyMywyMTgsIDk1LDEzNiwyMTMsIDQzLCA2NSwxNzUsIDI0LDE0NSwKKyAgICAyNDQsICAxLDIyNSwxMjYsIDI4LCA2NiwgNzgsIDk4LDEzNywyMTcsMTc2LDIzOSwgODksMTk2LCAxNywxMzgsCisgICAgMjQ1LDE5OSwyMzgsMTM4LDE4MSwgIDIsIDE1LCA0NiwyMDEsICA3LCA5OSwgNDksMjI4LCAyMCwxNzcsICAzLAorICAgIDE1MCwxOTUsMjEzLCAgMSwgNTMsMTI4LDIyNSwyMzYsIDgyLCAyMSwyMzQsIDE1LCA3NywxMjAsMTM2LCA4NCwKKyAgICAxMjQsMjQ0LDE1NSwyMzksMTI4LCAyNCwxOTYsMTI2LCAgMywgOTgsMTYyLDIzOSwgNTEsMjQ2LCA0NiwgNzEsCisgICAgMjIyLCA0OSwxNTYsMTIwLCA2MSwxMzIsIDg1LCA4MSwyNDMsICA1LDIxNSwgODAsMjUwLCAyOCwgODQsMjMxLAorICAgICA2MywgNTUsMTg0LDIwMSwyMzksMjQxLDEyOSwxMTMsMjM1LDI0MywyMTYsICAxLDE4NCwgNTEsMTcyLDE5OSwKKyAgICAyMjUsMjA4LDIxMCwgMzEsICAwLDEyMywyNDksIDI1LCA0MiwyMjgsMTIzLDIyNCwxNzcsMjE5LDIwOCwgOTYsCisgICAgMTg3LDIyMiwgNjUsMjM1LDEyMiwgIDAsMjE3LDIxNywyMDEsIDMwLCA2MiwyMDUsMTExLDIxMSwgIDAsICAwLAorICAgICAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfaG9tZV9wbmdbMzU3OF0gPSB7CisgICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCwgIDAsICAwLCAgMCwgMTMsIDczLCA3MiwgNjgsIDgyLAorICAgICAgMCwgIDAsICAwLCA0NiwgIDAsICAwLCAgMCwgNDcsIDE2LCAgNiwgIDAsICAwLCAgMCwyMDQsMTE3LCAzNiwKKyAgICAyMDksICAwLCAgMCwgIDAsICA5LDExMiwgNzIsIDg5LDExNSwgIDAsICAwLCAxMSwgMTksICAwLCAgMCwgMTEsCisgICAgIDE5LCAgMSwgIDAsMTU0LDE1NiwgMjQsICAwLCAgMCwgMTAsIDc5LDEwNSwgNjcsIDY3LCA4MCwgODAsMTA0LAorICAgIDExMSwxMTYsMTExLDExNSwxMDQsMTExLDExMiwgMzIsIDczLCA2NywgNjcsIDMyLDExMiwxMTQsMTExLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwgIDAsICAwLDEyMCwyMTgsMTU3LCA4MywxMDMsIDg0LCA4MywyMzMsIDIyLCA2MSwyNDcsCisgICAgMjIyLDI0NCwgNjYsIDc1LDEzNiwxMjgsMTQ4LCA3NSwxMTEsIDgyLCAyMSwgIDgsIDMyLCA4MiwgNjYsMTM5LAorICAgIDEyOCwgMjAsMTQ1LCAzOCwgNDIsIDMzLCAgOSwgMTYsIDc0LDEzNiwgMzMsMTYxLDIxNywgMjEsIDgxLDE5MywKKyAgICAgMTcsIDY5LCA2OSwgIDQsIDI3LDIwMCwxNjAsMTM2LCAgMywxNDIsMTQyLDEyOCwxNDAsIDIxLCA4MSwgNDQsCisgICAgIDEyLDEzOCwgMTAsMjE2LCAgNywyMjgsIDMzLDE2MiwxNDIsMTMxLDE2MywxMzYsMTM4LDIwMiwyNTEsMjI1LAorICAgIDEyMywxNjMsMTA3LDIxNCwxODgsMjQ3LDIzMCwyMDUsMjU0LDE4MSwyMTUsIDYyLDIzMSwxNzIsMjQzLDE1NywKKyAgICAxNzksMjA3LCAgNywxOTIsICA4LCAxMiwxNTAsIDcyLCA1MSwgODEsIDUzLDEyOCwgMTIsMTY5LCA2NiwgMzAsCisgICAgIDE3LDIyNCwxMzEsMTk5LDE5NiwxOTgsMjI1LDIyOCwgNDYsIDY0LDEyOSwgMTAsIDM2LDExMiwgIDAsIDE2LAorICAgICAgOCwxNzksMTAwLCAzMywxMTUsMjUzLCAzNSwgIDEsICAwLDI0OCwxMjYsIDYwLCA2MCwgNDMsIDM0LDE5MiwKKyAgICAgIDcsMTkwLCAgMCwgIDEsMTIwLDIxMSwgMTEsICA4LCAgMCwxOTIsIDc3LDE1NSwxOTIsIDQ4LCAyOCwxMzUsCisgICAgMjU1LCAxNSwyMzQsIDY2LDE1MywgOTIsICAxLDEyOCwxMzIsICAxLDE5MiwxMTYsMTQ1LCA1NiwgNzUsICA4LAorICAgIDEyOCwgMjAsICAwLCA2NCwxMjIsMTQyLCA2NiwxNjYsICAwLCA2NCwgNzAsICAxLDEyOCwxNTcsMTUyLCAzOCwKKyAgICAgODMsICAwLDE2MCwgIDQsICAwLCA5NiwyMDMsIDk5LCA5OCwyMjcsICAwLCA4MCwgNDUsICAwLCA5NiwgMzksCisgICAgMTI3LDIzMCwyMTEsICAwLDEyOCwxNTcsMjQ4LDE1MywxMjMsICAxLCAgMCwgOTEsMTQ4LCAzMywgMjEsICAxLAorICAgIDE2MCwxNDUsICAwLCAzMiwgMTksMTAxLDEzNiwgNjgsICAwLDEwNCwgNTksICAwLDE3MiwyMDcsIDg2LDEzOCwKKyAgICAgNjksICAwLCA4OCwgNDgsICAwLCAyMCwxMDIsIDc1LDE5NiwgNTcsICAwLDIxNiwgNDUsICAwLCA0OCwgNzMsCisgICAgIDg3LDEwMiwgNzIsICAwLDE3NiwxODMsICAwLDE5MiwyMDYsIDE2LCAxMSwxNzgsICAwLCAgOCwgMTIsICAwLAorICAgICA0OCwgODEsMTM2LDEzMywgNDEsICAwLCAgNCwxMjMsICAwLCA5NiwyMDAsIDM1LCAzNSwxMjAsICAwLDEzMiwKKyAgICAxNTMsICAwLCAyMCwgNzAsMjQyLCA4NywgNjAsMjQxLCA0MywxNzQsIDE2LDIzMSwgNDIsICAwLCAgMCwxMjAsCisgICAgMTUzLDE3OCwgNjAsMTg1LCAzNiwgNTcsIDY5LDEyOSwgOTEsICA4LCA0NSwxMTMsICA3LCA4NywgODcsIDQ2LAorICAgICAzMCwgNDAsMjA2LCA3MywgMjMsIDQzLCAyMCwgNTQsIDk3LCAgMiwgOTcsMTU0LCA2NCwgNDYsMTk0LDEyMSwKKyAgICAxNTMsIDI1LCA1MCwxMjksIDUyLCAxNSwyMjQsMjQzLDIwNCwgIDAsICAwLDE2MCwxNDUsIDIxLCAxNywyMjQsCisgICAgMTMxLDI0MywyNTMsMTIwLDIwNiwgMTQsMTc0LDIwNiwyMDYsIDU0LDE0MiwxODIsIDE0LCA5NSwgNDUsMjM0LAorICAgIDE5MSwgIDYsMjU1LCAzNCwgOTgsIDk4LDIyNywyNTQsMjI5LDIwNywxNzEsMTEyLCA2NCwgIDAsICAwLDIyNSwKKyAgICAxMTYsMTI2LDIwOSwyNTQsIDQ0LCA0NywxNzksIDI2LDEyOCwgNTksICA2LDEyOCwxMDksMjU0LDE2MiwgMzcsCisgICAgMjM4LCAgNCwxMDQsIDk0LCAxMSwxNjAsMTE3LDI0NywxMzksMTAyLDE3OCwgMTUsIDY0LDE4MSwgIDAsMTYwLAorICAgIDIzMywyMTgsIDg3LDI0MywxMTIsMjQ4LDEyNiwgNjAsIDYwLCA2OSwxNjEsMTQ0LDE4NSwyMTcsMjE3LDIyOSwKKyAgICAyMjgsMjI4LDIxNiwgNzQsMTk2LCA2NiwgOTEsIDk3LDIwMiwgODcsMTI1LDI1NCwxMDMsMTk0LCA5NSwxOTIsCisgICAgIDg3LDI1MywxMDgsMjQ5LDEyNiwgNjAsMjUyLDI0NywyNDUsMjI0LDE5MCwyMjYsIDM2LDEyOSwgNTAsIDkzLAorICAgIDEyOSwgNzEsICA0LDI0OCwyMjQsMTk0LDIwNCwyNDQsIDc2LDE2NSwgMjgsMjA3LDE0NiwgIDksMTMyLCA5OCwKKyAgICAyMjAsMjMwLDE0MywgNzEsMjUyLDE4MywgMTEsMjU1LDI1MiwgMjksMjExLCAzNCwxOTYsIDczLCA5OCwxODUsCisgICAgIDg4LCA0MiwgMjAsMjI3LCA4MSwgMTgsMTEzLDE0MiwgNjgsMTU0LDE0MCwyNDMsIDUwLDE2NSwgMzQsMTM3LAorICAgICA2NiwxNDYsIDQxLDE5NywgMzcsMjEwLDI1NSwxMDAsMjI2LDIyMywgNDQsMjUxLCAgMywgNjIsMjIzLCA1MywKKyAgICAgIDAsMTc2LDEwNiwgNjIsICAxLDEyMywxNDUsIDQ1LDE2OCwgOTMsIDk5LCAgMywyNDYsIDc1LCAzOSwgMTYsCisgICAgIDg4LDExNiwxOTIsMjI2LDI0NywgIDAsICAwLDI0MiwxODcsMTExLDE5MywyMTIsIDQwLCAgOCwgIDMsMTI4LAorICAgIDEwNCwxMzEsMjI1LDIwNywxMTksMjU1LDIzOSwgNjMsMjUzLCA3MSwxNjAsIDM3LCAgMCwxMjgsMTAyLCA3MywKKyAgICAxNDYsMTEzLCAgMCwgIDAsIDk0LCA2OCwgMzYsIDQ2LCA4NCwyMDIsMTc5LCA2MywxOTksICA4LCAgMCwgIDAsCisgICAgIDY4LDE2MCwxMjksIDQyLDE3NiwgNjUsIDI3LDI0NCwxOTMsIDI0LCA0NCwxOTIsICA2LCAyOCwxOTMsICA1LAorICAgIDIyMCwxOTMsIDExLDI1MiwgOTYsIDU0LDEzMiwgNjYsIDM2LDE5NiwxOTQsIDY2LCAxNiwgNjYsIDEwLDEwMCwKKyAgICAxMjgsIDI4LDExNCwgOTYsIDQxLDE3MiwxMzAsIDY2LCA0MCwxMzQsMjA1LDE3NiwgMjksIDQyLCA5NiwgNDcsCisgICAgMjEyLCA2NCwgMjksIDUyLDE5MiwgODEsMTA0LDEzNCwxNDcsMTEyLCAxNCwgNDYsMTk0LCA4NSwxODQsIDE0LAorICAgICA2MSwxMTIsIDE1LDI1MCwgOTcsICA4LDE1OCwxOTMsIDQwLDE4OCwxMjksICA5LCAgNCwgNjUsMjAwLCAgOCwKKyAgICAgMTksIDk3LCAzMywyMTgsMTM2LCAgMSwgOTgsMTM4LCA4OCwgMzUsMTQyLCAgOCwgMjMsMTUzLDEzMywyNDgsCisgICAgIDMzLDE5MywgNzIsICA0LCAxOCwxMzksIDM2LCAzMiwyMDEsMTM2LCAyMCwgODEsIDM0LCA3NSwxNDUsIDUzLAorICAgICA3MiwgNDksIDgyLDEzOCwgODQsIDMyLCA4NSwgNzIsIDI5LDI0MiwgNjEsMTE0LCAgMiwgNTcsMTM1LCA5MiwKKyAgICAgNzAsMTg2LDE0NSwgNTksMjAwLCAgMCwgNTAsMTMwLDI1MiwxMzQsMTg4LCA3MSwgNDksMTQ4LDEyOSwxNzgsCisgICAgIDgxLCA2MSwyMTIsIDEyLDE4MSwgNjcsMTg1LDE2OCwgNTUsIDI2LDEzMiwgNzAsMTYyLCAxMSwyMDgsMTAwLAorICAgIDExNiwgNDksMTU0LDE0MywgMjIsMTYwLDE1NSwyMDgsMTE0LDE4MCwgMjYsIDYxLDE0MCwgNTQsMTYxLDIzMSwKKyAgICAyMDgsMTcxLDEwNCwgMTUsMjE4LDE0MywgNjIsIDY3LDE5OSwgNDgsMTkyLDIzMiwgMjQsICA3LCA1MSwxOTYsCisgICAgMTA4LCA0OCwgNDYsMTk4LDE5NSwgNjYsMTc3LCA1NiwgNDQsICA5LDE0NywgOTksMjAzLDE3NywgMzQsMTcyLAorICAgICAxMiwxNzEsMTk4LCAyNiwxNzYsIDg2LDE3MiwgIDMsMTg3LDEzNywyNDUsIDk5LDIwNywxNzcsMTE5LCAgNCwKKyAgICAgMTgsMTI5LCA2OSwxOTIsICA5LCA1NCwgIDQsMTE5LCA2NiwgMzIsIDk3LCAzMCwgNjUsIDcyLCA4OCwgNzYsCisgICAgIDg4LCA3OCwyMTYsIDcyLDE2OCwgMzIsIDI4LCAzNiwgNTIsIDE3LDIxOCwgIDksIDU1LCAgOSwgIDMsMTMyLAorICAgICA4MSwxOTQsIDM5LCAzNCwxNDcsMTY4LCA3NSwxODAsIDM4LDE4NiwgMTcsMjQ5LDE5NiwgMjQsIDk4LCA1MCwKKyAgICAgNDksMTM1LCA4OCwgNzIsIDQ0LCAzNSwyMTQsIDE4LDE0MywgMTksIDQ3LCAxNiwxMjMsMTM2LCA2NywxOTYsCisgICAgIDU1LCAzNiwgMTgsMTM3LCA2NywgNTAsIDM5LDE4NSwxNDQsICAyLCA3MywxNzcsMTY0LCA4NCwyMTAsIDE4LAorICAgIDIxMCwgNzAsMjEwLDExMCwgODIsIDM1LDIzMywgNDQsMTY5LDE1NSwgNTIsIDcyLCAyNiwgMzUsMTQ3LDIwMSwKKyAgICAyMTgsMTAwLDEwNywxNzgsICA3LCA1NywxNDgsIDQ0LCAzMiwgNDMsMjAwLDEzMywyMjgsMTU3LDIyOCwxOTUsCisgICAgMjI4LCA1MSwyMjgsIDI3LDIyOCwgMzMsMjQyLCA5MSwgMTAsMTU3LCA5OCwgNjQsMTEzLDE2NCwyNDgsIDgzLAorICAgIDIyNiwgNDAsIDgyLDIwMiwxMDYsIDc0LCAyNSwyMjksIDE2LDIyOSwgNTIsMjI5LCAgNiwxMDEsMTUyLCA1MCwKKyAgICAgNjUsIDg1LDE2MywxNTQsIDgyLDIyMSwxNjgsMTYxLCA4NCwgMTcsIDUzLDE0MywgOTAsIDY2LDE3MywxNjEsCisgICAgMTgyLCA4MiwxNzUsIDgxLDEzNSwxNjgsIDE5LCA1MiwxMTcsMTU0LCA1NywyMDUsMTMxLCAyMiwgNzMsIDc1LAorICAgIDE2NSwxNzMsMTYyLDE0OSwyMTEsIDI2LDEwNCwgMjMsMTA0LDI0NywxMDUsMTc1LDIzMiwxMTYsMTg2LCAxNywKKyAgICAyMjEsMTQ5LCAzMCwgNzgsMTUxLDIwOCwgODcsMjEwLDIwMywyMzMsIDcxLDIzMiwxNTEsMjMyLCAgMywyNDQsCisgICAgMTE5LCAxMiwgMTMsMTM0LCAyMSwxMzEsMTk5LDEzNiwxMDMsIDQwLCAyNSwxNTUsIDI0LCAgNywgMjQsMTAzLAorICAgICAyNSwxMTksIDI0LDE3NSwxNTIsIDc2LDE2NiwgMjUsMjExLDEzOSwgMjUsMTk5LCA4NCwgNDgsIDU1LCA0OSwKKyAgICAyMzUsMTUyLDIzMSwxNTMsIDE1LDE1MywxMTEsIDg1LCA4OCwgNDIsMTgyLCA0MiwxMjQsIDIxLDE0NSwyMDIsCisgICAgIDEwLDE0OSwgNzQsMTQ5LCAzOCwxNDksIDI3LCA0MiwgNDcsIDg0LDE2OSwxNzAsMTY2LDE3MCwyMjIsMTcwLAorICAgICAxMSwgODUsMjQzLCA4NSwyMDMsIDg0LDE0MywxNjksIDk0LCA4MywxMjUsMTc0LCA3MCwgODUsIDUxLCA4MywKKyAgICAyMjcsMTY5LCAgOSwyMTIsMTUwLDE3MSwgODUsMTcwLDE1NywgODAsMjM1LCA4MywgMjcsIDgzLDEwMywxNjksCisgICAgIDU5LDE2OCwxMzUsMTcwLDEwMywxNjgsMTExLCA4NCwgNjMsMTY0LDEyNiwgODksMjUzLDEzNywgIDYsIDg5LAorICAgIDE5NSwgNzYsMTk1LCA3OSwgNjcsMTY0LCA4MSwxNjAsMTc3LCA5NSwyMjcsMTg4LDE5OCwgMzIsIDExLCA5OSwKKyAgICAgMjUsMTc5LDEyMCwgNDQsIDMzLDEwNywgMTMsMTcxLDEzNCwxMTcsMTI5LCA1MywxOTYsIDM4LDE3NywyMDUsCisgICAgMjE3LDEyNCwxMTgsIDQyLDE4NywxNTIsMjUzLCAyOSwxODcsMTM5LCA2MSwxNzAsMTY5LDE2MSwgNTcsIDY3LAorICAgICA1MSwgNzQsIDUxLCA4NywxNzksIDgyLDI0MywxNDgsMTAyLCA2MywgIDcsMjI3LDE1MiwxMTMsMjQ4LDE1NiwKKyAgICAxMTYsIDc4LCAgOSwyMzEsIDQwLDE2NywxNTEsMjQzLDEyNiwxMzgsMjIyLCAyMCwyMzksIDQxLDIyNiwgNDEsCisgICAgIDI3LDE2NiwgNTIsIDc2LDE4NSwgNDksMTAxLCA5MiwxMDcsMTcwLDE1MCwxNTEsMTUwLCA4OCwxNzEsIDcyLAorICAgIDE3MSwgODEsMTcxLCA3MSwyMzUsMTg5LCA1NCwxNzQsMjM3LDE2NywxNTcsMTY2LDE4OSwgNjksMTg3LCA4OSwKKyAgICAyNTEsMTI5LCAxNCwgNjUsMTk5LCA3NCwgMzksIDkyLCAzOSwgNzEsMTAzLDE0MywyMDYsICA1LDE1NywyMzEsCisgICAgIDgzLDIxNywgODMsMjIxLDE2NywgMTAsMTY3LCAyMiwgNzcsIDYxLCA1OCwyNDUsMTc0LCA0NiwxNzAsMTA3LAorICAgIDE2NSwgMjcsMTYxLDE4NywgNjgsMTE5LDE5MSwxMTAsMTY3LDIzOCwxNTIsMTU4LDE5MCwgOTQsMTI4LDE1OCwKKyAgICAgNzYsMTExLDE2NywyMjIsMTIxLDE4OSwyMzEsMjUwLCAyOCwxMjUsIDQ3LDI1MywgODQsMjUzLDEwOSwyNTAsCisgICAgMTY3LDI0NSwgNzEsIDEyLCA4OCwgIDYsMTc5LCAxMiwgMzYsICA2LDIxOSwgMTIsMjA2LCAyNCwgNjAsMTk3LAorICAgICA1MywxMTMsMTExLCA2MCwgMjksIDQ3LDE5OSwyMTksMjQxLCA4MSwgNjcsIDkzLDE5NSwgNjQsIDY3LDE2NSwKKyAgICAgOTcsMTQ5LCA5NywxNTEsMjI1LDEzMiwxNDUsMTg1LDIwOSwgNjAsMTYzLDIxMywgNzAsMTQxLCA3MCwgMTUsCisgICAgMTQwLDEwNSwxOTgsIDkyLDIyNywgMzYsMjI3LDEwOSwxOTgsMTA5LDE5OCwxNjMsIDM4LCAgNiwgMzgsIDMzLAorICAgICAzOCwgNzUsIDc3LDIzNCwgNzcsMjM4LDE1NCwgODIsIDc3LDE4NSwxNjYsIDQxLDE2NiwgNTksIDc2LCA1OSwKKyAgICAgNzYsMTk5LDIwNSwyMDQsMjA1LDE2MiwyMDUsMjE0LDE1MywgNTMsMTU1LCA2MSwgNDksMjE1LCA1MCwyMzEsCisgICAgMTU1LDIzMSwxNTUsMjE1LDE1NSwyMjMsMTgzLCA5NiwgOTAsMTIwLCA5MCwgNDQsMTgyLDE2OCwxODIsMTg0LAorICAgIDEwMSwgNzMsMTc4LDIyOCwgOTAsMTY2LCA4OSwyMzgsMTgyLDE4OCwxMTAsMTMzLCA5MCwgNTcsIDg5LDE2NSwKKyAgICAgODgsIDg1LCA5MCwgOTMsMTc5LCA3MCwxNzMsMTU3LDE3MywgMzcsMjE0LDE4NywxNzMsMTg3LDE2NywgMTcsCisgICAgMTY3LDE4NSwgNzgsMTQ3LCA3OCwxNzEsMTU4LDIxNCwxMDMsMTk1LDE3NiwyNDEsMTgyLDIwMSwxODIsMTY5LAorICAgIDE4MywgMjUsMTc2LDIyOSwyMTYsICA2LDIxOSwxNzQsMTgyLDEwOSwxODIsMTI1LCA5NywxMDMsIDk4LCAyMywKKyAgICAxMDMsMTgzLDE5NywxNzQsMTk1LDIzOCwxNDcsMTg5LDE0NywxMjUsMTg2LDEyNSwxNDEsMjUzLCA2MSwgIDcsCisgICAgIDEzLDEzNSwyMTcsIDE0LDE3MSwgMjksIDkwLCAyOSwxMjYsMTE1LDE4MCwxMTQsIDIwLCA1OCwgODYsIDU4LAorICAgIDIyMiwxNTQsMjA2LDE1NiwyMzgsIDYzLDEyNSwxOTcsMjQ0LDE1MCwyMzMsIDQ3LDEwMywgODgsMjA3LCAxNiwKKyAgICAyMDcsMjE2LCA1MSwyMjcsMTgyLCAxOSwyMDMsIDQxLDE5NiwxMDUsMTU3LCA4MywxNTUsMjExLCA3MSwxMDMsCisgICAgIDIzLDEwMywxODUsMTE1LDEzMSwyNDMsMTM2LDEzOSwxMzcsIDc1LDEzMCwyMDMsIDQ2LDE1MSwgNjIsIDQ2LAorICAgIDE1NSwgMjcsMTk4LDIyMSwyMDAsMTg5LDIyOCwgNzQsMTE2LDI0NSwxMTMsIDkzLDIyNSwxMjIsMjEwLDI0NSwKKyAgICAxNTcsMTU1LDE3OSwxNTUsMTk0LDIzNywxNjgsMjE5LDE3NSwyMzgsIDU0LDIzOCwxMDUsMjM4LDEzNSwyMjAsCisgICAgMTU5LDIwNCwgNTIsMTU5LCA0MSwxNTgsIDg5LCA1MSwxMTUsMjA4LDE5NSwyMDAsIDY3LDIyNCwgODEsMjI5LAorICAgIDIwOSwgNjMsIDExLDE1OSwxNDksIDQ4LDEwNywyMjMsMTcyLDEyNiwgNzksIDY3LCA3OSwxMjksMTAzLDE4MSwKKyAgICAyMzEsIDM1LCA0NywgOTksIDQ3LDE0NSwgODcsMTczLDIxNSwxNzYsMTgzLDE2NSwxMTksMTcwLDI0NywgOTcsCisgICAgMjM5LCAyMywgNjIsMjQ2LCA2MiwxMTQsMTU5LDIyNywgNjIsMjI3LCA2MCwgNTUsMjIyLCA1MCwyMjIsIDg5LAorICAgICA5NSwyMDQsIDU1LDE5MiwxODMsMjAwLDE4MywyMDMsIDc5LDE5NSwxMTEsMTU4LCA5NSwxMzMsMjIzLCA2NywKKyAgICAxMjcsIDM1LDI1NSwxMDAsMjU1LDEyMiwyNTUsMjA5LCAgMCwxNjcsMTI4LCAzNywgIDEsMTAzLCAgMywxMzcsCisgICAgMTI5LCA2NSwxMjksIDkxLCAgMiwyNTEsMjQ4LDEyMiwxMjQsIDMzLDE5MSwxNDIsIDYzLCA1OCwyMTksMTAxLAorICAgIDI0NiwxNzgsMjE3LDIzNywgNjUsMTQwLDE2MCwxODUsIDY1LCAyMSwgNjUsMTQzLDEzMCwxNzMsMTMwLDIyOSwKKyAgICAxOTMsMTczLCAzMywxMDQsMjAwLDIzNiwxNDQsMTczLCAzMywyNDcsMjMxLDE1MiwyMDYsMTQ1LDIwNiwxMDUsCisgICAgIDE0LDEzMywgODAsMTI2LDIzMiwyMTQsMjA4LCAgNywgOTcsMjMwLCA5NywxMzksMTk1LDEyNiwgMTIsIDM5LAorICAgIDEzMywxMzUsMTMzLCA4NywxMzQsIDYzLDE0MiwxMTIsMTM2LCA4OCwgMjYsMjA5LCA0OSwxNTEsIDUzLDExOSwKKyAgICAyMDksMjIwLCA2NywxMTUsMjIzLCA2OCwyNTAsIDY4LDE1MCwgNjgsMjIyLDE1NSwxMDMsIDQ5LCA3OSwgNTcsCisgICAgMTc1LCA0NSwgNzQsIDUzLCA0MiwgNjIsMTcwLCA0NiwxMDYsIDYwLDIxOCwgNTUsMTg2LCA1MiwxODYsIDYzLAorICAgIDE5OCwgNDYsMTAyLCA4OSwyMDQsMjEzLCA4OCwxNTcsIDg4LCA3MywxMDgsIDc1LCAyOCwgNTcsIDQ2LCA0MiwKKyAgICAxNzQsIDU0LDExMCwxMDgsMTkwLDIyMywyNTIsMjM3LDI0MywxMzUsMjI2LDE1NywyMjYsIDExLDIyNywxMjMsCisgICAgIDIzLDE1MiwgNDcsMjAwLCA5MywxMTIsMTIxLDE2MSwyMDYsMTk0LDI0NCwxMzMsMTY3LCAyMiwxNjksIDQ2LAorICAgICAxOCwgNDQsIDU4LDE1MCwgNjQsIDc2LDEzNiwgNzgsIDU2LDE0OCwyNDAsIDY1LCAxNiwgNDIsMTY4LCAyMiwKKyAgICAxNDAsIDM3LDI0MiwgMTksMTE5LCAzNywxNDIsIDEwLDEyMSwxOTQsIDI5LDE5NCwxMDMsIDM0LCA0NywyMDksCisgICAgIDU0LDIwOSwxMzYsMjE2LCA2NywgOTIsIDQyLCAzMCwgNzgsMjQyLCA3MiwgNDIsIDc3LDEyMiwxNDYsMjM2LAorICAgIDE0NSwxODgsIDUzLDEyMSwgMzYsMTk3LCA1MSwxNjUsIDQ0LDIyOSwxODUsMTMyLCAzOSwxNjksMTQ0LDE4OCwKKyAgICAgNzYsIDEzLCA3NiwyMjEsMTU1LCA1OCwxNTgsIDIyLDE1NCwxMTgsIDMyLDEwOSwgNTAsIDYxLCA1OCwxODksCisgICAgIDQ5LDEzMSwxNDYsMTQ1LDE0NCwxMTMsIDY2LDE3MCwgMzMsIDc3LDE0NywxODIsMTAzLDIzNCwxMDMsMjMwLAorICAgIDEwMiwxMTgsMjAzLDE3MiwxMDEsMTMzLDE3OCwyNTQsMTk3LDExMCwxMzksMTgzLCA0NywgMzAsMTQ5LCAgNywKKyAgICAyMDEsMTA3LDE3OSwxNDQsMTcyLCAgNSwgODksIDQ1LCAxMCwxODIsIDY2LDE2NiwyMzIsIDg0LCA5MCwgNDAsCisgICAgMjE1LCA0MiwgIDcsMTc4LDEwMywxMDEsIDg3LDEwMiwxOTEsMjA1LDEzNywyMDIsIDU3LDE1MCwxNzEsMTU4LAorICAgICA0MywyMDUsMjM3LDIwNCwxNzksMjAyLDIxOSwxNDQsIDU1LDE1NiwyMzksMTU5LDI1NSwyMzcsIDE4LDE5NCwKKyAgICAgMTgsMjI1LDE0NiwxODIsMTY1LDEzNCwgNzUsIDg3LCA0NSwgMjksIDg4LDIzMCwxODksMTcyLDEwNiwgNTcsCisgICAgMTc4LCA2MCwxMTMsMTIxLDIxOSwgMTAsMjI3LCAyMSwgIDUsIDQzLDEzNCwgODYsICA2LDE3MiwgNjAsMTg0LAorICAgIDEzOCwxODIsIDQyLDEwOSwyMTMsIDc5LDE3MSwyMzcsIDg3LDE1MSwxNzQsMTI2LDE4OSwgMzgsMTIyLCA3NywKKyAgICAxMDcsMTI5LCA5NCwxOTMsMjAyLDEzMCwxOTMsMTgxLCAgMSwxMDcsMjM1LCAxMSwgODUsIDEwLDIyOSwxMzMsCisgICAgMTI1LDIzNSwyMjAsMjE1LDIzNywgOTMsIDc5LCA4OCwgNDcsIDg5LDIyMywxODEsIDk3LDI1MCwxMzQsMTU3LAorICAgICAyNywgNjIsIDIxLDEzNywxMzgsMTc0LCAyMCwyMTksIDIzLDE1MSwgMjEsMTI3LDIxNiwgNDAsMjIwLDEyMCwKKyAgICAyMjksIDI3LDEzNSwxMTEsMjAyLDE5MSwxNTMsMjIwLDE0OCwxODAsMTY5LDE3MSwxOTYsMTg1LDEwMCwyMDcsCisgICAgMTAyLDIxMCwxMDIsMjMzLDIzMCwyMjIsIDQ1LDE1OCwgOTEsIDE0LDE1MCwxNzAsMTUxLDIzMCwxNTEsIDE0LAorICAgIDExMCwgMTMsMjE3LDIxOCwxODAsIDEzLDIyMywgODYsMTgwLDIzNywyNDUsMjQ2LCA2OSwyMTksIDQ3LDE1MSwKKyAgICAyMDUsIDQwLDIxOSwxODcsMTMxLDE4MiwgNjcsMTg1LDE2MywxOTEsIDYwLDE4NCwxODgsMTAxLDE2NywyMDEsCisgICAgMjA2LDIwNSwgNTksIDYzLCA4NCwxNjQsIDg0LDI0NCwgODQsMjUwLCA4NCwgNTQsMjM4LDIxMCwyMjEsMTgxLAorICAgICA5NywyMTUsMjQ4LDExMCwyMDksMjM4LCAyNywxMjMsMTg4LDI0NiwgNTIsMjM2LDIxMywyMTksIDkxLDE4OCwKKyAgICAyNDcsMjUzLCA2MiwyMDEsMTkwLDIxOSwgODUsICAxLCA4NSwgNzcsMjEzLDEwMiwyMTMsMTAxLDI1MSwgNzMsCisgICAgMjUxLDE3OSwyNDcsIDYzLDE3NCwxMzcsMTcwLDIzMywyNDgsMTUwLDI1MSwxMDksIDkzLDE3MywgNzgsMTA5LAorICAgIDExMywyMzcsMTk5LCAgMywyMTAsICAzLDI1MywgIDcsIDM1LCAxNCwxODIsMjE1LDE4NSwyMTIsMjEzLCAyOSwKKyAgICAyMTAsIDYxLCA4NCwgODIsMTQzLDIxNCwgNDMsMjM1LCA3MSwgMTQsMTk5LCAzMSwxOTAsMjU0LDE1NywyMzksCisgICAgMTE5LCA0NSwgMTMsIDU0LCAxMywgODUsMTQxLDE1NiwxOTgsMjI2LCAzNSwxMTIsIDY4LDEyMSwyMjgsMjMzLAorICAgIDI0NywgIDksMjIzLDI0NywgMzAsIDEzLCA1OCwyMTgsMTE4LDE0MCwxMjMsMTcyLDIyNSwgIDcsMjExLCAzMSwKKyAgICAxMTgsIDI5LDEwMywgMjksIDQ3LDEwNiwgNjYsMTU0LDI0MiwxNTQsIDcwLDE1NSwgODMsMTU0LDI1MSwgOTEsCisgICAgIDk4LCA5MSwxODYsIDc5LDIwNCwgNjIsMjA5LDIxNCwyMzQsMjIyLDEyMiwyNTIsIDcxLDIxOSwgMzEsIDE1LAorICAgIDE1NiwgNTIsIDYwLCA4OSwxMjEsIDc0LDI0MywgODQsMjAxLDEwNSwyMTgsMjMzLDEzMCwyMTEsMTQ3LDEwMywKKyAgICAyNDIsMjA3LDE0MCwxNTcsMTQ5LDE1NywxMjUsMTI2LCA0NiwyNDksMjIwLCA5NiwyMTksMTYyLDE4MiwxMjMsCisgICAgMjMxLCA5OSwyMDYsMjIzLDEwNiwgMTUsMTExLDIzOSwxODYsIDE2LDExNiwyMjUsMjEwLCA2OSwyNTUsMTM5LAorICAgIDIzMSwgNTksMTg4LCA1OSwyMDYsIDkyLDI0MiwxODQsMTE2LDI0MiwxNzgsMjE5LDIyOSwgMTksIDg3LDE4NCwKKyAgICAgODcsMTU0LDE3NSwgNTgsIDk1LDEwOSwyMzQsMTE2LDIzNCwgNjAsMjU0LDE0NywyMTEsIDc5LDE5OSwxODcsCisgICAgMTU2LDE4NywxNTQsMTc0LDE4NSwgOTIsMTA3LDE4NSwyMzgsMTIyLDE4OSwxODEsMTIzLDEwMiwyNDcsMjMzLAorICAgICAyNywxNTgsIDU1LDIwNiwyMjEsMjQ0LDE4OSwxMjEsMjQxLCAyMiwyNTUsMjE0LDIxMywxNTgsIDU3LCA2MSwKKyAgICAyMjEsMTg5LDI0MywxMjIsMTExLDI0NywxOTcsMjQ3LDI0NSwyMjMsIDIyLDIyMSwxMjYsMTE0LCAzOSwyNTMsCisgICAgMjA2LDIwMywxODcsMjE3LDExOSwgMzksMjM4LDE3MywxODgsIDc5LDE4OCwgOTUsMjQ0LCA2NCwyMzcsIDY1LAorICAgIDIxNywgNjcsMjIxLDEzNSwyMTMsIDYzLCA5MSwyNTQsMjIwLDIxNiwyMzksMjIwLDEyNywxMDYsMTkyLDExOSwKKyAgICAxNjAsMjQzLDIwOSwyMjAsIDcxLDI0NywgIDYsMTMzLDEzMSwyMDcsMjU0LDE0NSwyNDUsMTQzLCAxNSwgNjcsCisgICAgICA1LDE0MywxNTMsMTQzLDIwMywxMzQsIDEzLDEzNCwyMzUsMTU4LCA1NiwgNjIsIDU3LCA1NywyMjYsIDYzLAorICAgIDExNCwyNTMsMjMzLDI1MiwxNjcsIDY3LDIwNywxMDAsMjA3LCAzOCwxNTgsIDIzLDI1NCwxNjIsMjU0LDIwMywKKyAgICAxNzQsIDIzLCAyMiwgNDcsMTI2LDI0OCwyMTMsMjM1LDIxNSwyMDYsMjA5LDE1MiwyMDksMTYxLDE1MSwyNDIsCisgICAgMTUxLDE0NywxOTEsMTA5LDEyNCwxNjUsMjUzLDIzNCwxOTIsMjM1LCAyNSwxNzUsMjE5LDE5OCwxOTQsMTk4LAorICAgICAzMCwxOTAsMjAxLDEyMCwgNTEsIDQ5LCA5NCwyNDQsIDg2LDI1MSwyMzcsMTkzLDExOSwyMjAsMTE5LCAyOSwKKyAgICAyMzksMTYzLDIyMywgMTUsIDc5LDIyOCwxMjQsIDMyLDEyNywgNDAsMjU1LDEwNCwyNDksMTc3LDI0NSwgODMsCisgICAgMjA4LDE2NywyNTEsMTQ3LCAyNSwxNDcsMTQ3LDI1NSwgIDQsICAzLDE1MiwyNDMsMjUyLCA5OSwgNTEsIDQ1LAorICAgIDIxOSwgIDAsICAwLCAgMCwgMzIsIDk5LCA3MiwgODIsIDc3LCAgMCwgIDAsMTIyLCAzNywgIDAsICAwLDEyOCwKKyAgICAxMzEsICAwLCAgMCwyNDksMjU1LCAgMCwgIDAsMTI4LDIzMywgIDAsICAwLDExNywgNDgsICAwLCAgMCwyMzQsCisgICAgIDk2LCAgMCwgIDAsIDU4LDE1MiwgIDAsICAwLCAyMywxMTEsMTQ2LCA5NSwxOTcsIDcwLCAgMCwgIDAsICAzLAorICAgICAzNywgNzMsIDY4LCA2NSwgODQsMTIwLDIxOCwyMzYsMTU1LCA2MSwxMDgsIDE5LCA0OSwgMjAsMTk5LDE0MywKKyAgICAxMzYsICA1LCAxMCwgMTIsMTI4LDEzMCwxNDQsMTU0LCAgMSwgNDAsIDk3LCA0MSwgNTIsIDQzLCA0MSwgMTksCisgICAgIDY1LDEzNiwgIDEsMTY0LCAxMCwxNjQsMTc2LCA2OCwxNDgsIDEzLDExNCwxMDcsIDEwLCAyNywgOTUsIDE4LAorICAgICA4MywgMTgsMjE0LCA2OCwxMDgsMTY5LDIxOCwgNDEsIDc1LDE0NSwyMDIsMTI4LCA0MiwxOTQsMTUwLDExOCwKKyAgICAyMjgsIDE2LCA0NCwxNjQsMTMzLDE2NSwgMjEsIDMxLCAxNywyMTcsIDEwLCA5MywgMjUsMjUyLCA5NCwgNDIsCisgICAgIDkxLDE4MSwyMzYsMTA3LDIwNiwxOTAsIDc1LDIzOCwyNTMsMTUxLDE2NywyMjgsIDQ2LDE4NSwyMjgsMjMxLAorICAgIDIzMSwxOTEsMTU5LDIzOSwyMzYsICAzLDIxMSwgODcsIDIyLCAyMiwgNTQsMjE0LDE1NywxMzYsMjM0LDIwOCwKKyAgICAgMzQsMTM5LDE2OSwgOTUsMjU0LCA2MiwyMTUsMTUzLDEzOSwyMzQsIDYzLCA1OCwgMjQsMjM4LDIyOSwgNzksCisgICAgIDkyLDEwMywgNDksMTQ3LCA5NywgNDksMTg5LCAxMywxNzcsMTk0LDIyNiwgOTcsICAwLDIzOCwgMjgsMjQ1LAorICAgIDI0OSwxOTcsMTc1LCA4OSwyMzIsMTczLDE3NiwyNDgsMTgxLCAgNCwgMTMsMTEzLDE0MCwgNjksMjA3LCA5OSwKKyAgICAxMTMsMTY3LCA0OCwyMjYsMTkyLCA0NywxMjcsIDk3LCA0OSwxNTUsICA1LDE3NiwxMTksIDM2LCAzOSwgNDYsCisgICAgICA2LDIxOSwxNjAsMjE3LDIwNywgMTYsMTMzLDIyNywxNTgsMjAzLCA5OCwyMzUsMTcyLDE3MywxNTgsIDk3LAorICAgICAyNCwgNTYsMTAyLDExMCwyNTQsIDI4LCAgMCwxMDQsMTk1LDEyOSwgNzQsIDUyLCA1OCwxMjAsMTAyLCAxMCwKKyAgICAxNjIsMTk1LDI0NywxMjgsMjI5LDE2NywxNjYsIDI2LCAzMiwgOTcsMTk4LCAzNCwgNzQsMjQwLDE5NSwxMzksCisgICAgIDY5LDI1NCwyNTMsMTY4LCAxMSwxNzMsMTcyLCAgNCwgMjIsMTUwLDE1OSwyMjQsMTk5LDE0NiwyMDAsMTAwLAorICAgICA1NiwxMDIsMjQyLDIzNiwxNDYsMjI0LDE4OSwgNjcsMTc0LDIyMCwgMzUsMTA0LDEzNiwgMzUsIDQ0LCA1NCwKKyAgICAxODYsIDQ0LDExMCwgMzcsIDY3LDIwMiwxMTIsMjQ0LDEwMCwyMDQsMjI4LCA4MSwgIDEsIDQ1LCA0MiwyNDUsCisgICAgIDI3LCA1MCwxMjcsMTQwLDE5NywyNDEsMTc0LDEwMSwyMjQsICA4LDI1MCwxMjYsMjE5LDEzNywxNDksIDQ4LAorICAgIDE2MSwxNTgsIDQ0LDI0MSwgNjEsMjE5LCAyNCwyNDAsMTg0LDEzMCwxNTAsMTA1LDE4MiwyMzcsIDU1LDIyNywKKyAgICAgNTMsMTI5LDIyNywgMjMsIDE4LDIzMiwxODksIDUxLCAzMCwxNzMsIDcwLCA2MSwxODQsIDM4LDI0NCwxMDIsCisgICAgMTIyLDExMCwxNDUsMjI0LDIzNCwxMjgsMTE5LDIyMSwgIDEsMTI5LDIyMywxMjIsIDYyLCA5MiwxMDEsIDkzLAorICAgICA4NCwyMDIsIDc0LDE4MCwgOTQsMTA5LDIyNCwxMDQsIDMzLCA4OCwgMjIsMTQ1LDI1MiwgNDEsMTI3LCA3MCwKKyAgICAxMDIsIDQ5LCAxOCwyMjQsMTE5LCAzOSwgIDgsIDkwLCAxNiwgMjIsMTE1LDIzNywxNzcsICAyLCA1NiwgOTAsCisgICAgIDcxLDE4NiwgNjYsMjA4LDEzMCwyMDgsMjEzLDExNywgIDUsMjQwLDIyMCwxMTksMTMwLDEwMCwgMzQsMjExLAorICAgIDExOSwgNjEsIDkzLCAgMCwxNDIsIDU1LDExNSwgNzIsMTkzLCA0MiwgODMsIDE5LDEyOCwyMjcsIDMyLCA3MywKKyAgICAyMTMsMTM2LCAzMywyMjQsIDgzLCAgMiwyNDAsIDExLCA4NSwxMzAsIDk4LDE2NSwxMDgsMTcyLCA5OCwxMzQsCisgICAgMjA3LCAxNiwgMTIsIDI3LCA3NCwxMTcsICAxLDI0OCwyMDEsIDI3LCAgNCwxOTUsMjA2LCAzMiwxMzgsIDI1LAorICAgIDI1NCwxNDcsIDk2LCA4OCwxNzcsMTQ4LDIzNywgIDQsIDk1LDE5MCwxNDQsIDc2LCA0MywgNjUsICA4LCAgOCwKKyAgICAxMjAsIDI4LDEyOCwyNTUsIDQzLCAxNiwgMTAsMTcxLDE5MiwxODMsIDc4LCAxOSwgMTAsIDI3LDIxOCwgNzYsCisgICAgIDgyLDEzNCwgOTEsIDg1LDIzOSwgNTQsMTAyLDI0OCwgMjcsMTMwLCA5NywgNTMsMTk1LCA2MywxMjIsICA0LAorICAgIDE5NSwxMzQsIDU4LDExNSwxNTIsMjI1LCA3MywxNzgsIDIyLDE0NywyNDIsIDYyLCA3MywyMDIsMTk0LDIyMSwKKyAgICAgIDMsMTY0LCA2NCwxMjksMTg3LCAxOCwyMjQsIDQ1LDEyMiwxODAsIDIyLDE2OCwyMDgsIDQ5LDE4OCwxOTAsCisgICAgMTAxLCAxMSwxMDcsIDExLDIwOSwgOTAsMTEyLCAyMSwgNDEsIDYxLDEwNiwgMjcsIDc2LCAzMSwyMDYsMTc5LAorICAgIDE4NCwyNDMsIDY3LCA0OSwyMTEsMTk2LDIyOSwxODYsMTY0LDE5MywgNTAsMjUxLDEyNSwgODksMTE1LDEwNiwKKyAgICAxNDMsMjM1LDE2MiwyMDEsMjExLDI0NywxNjcsMTgzLCA0NywgMzIsMTc5LCAxMSwxNTQsMTkyLCA4MSwxNDEsCisgICAgIDQ0LCA4NSwgNDcsMTkwLDIzNCwyMzYsIDgzLCA0OCwgMjIsMTUwLCAyMSwgODMsMTIzLDE1MywxNzYsMTMzLAorICAgIDIzMCwxNjcsICA5LDE2NiwxNDIsMTMzLDIxMiwxMDcsMTcwLCA1MSwgNTMsMjM5LCAyMiwyMjYsIDQwLDEzOSwKKyAgICAgOTMsMTMzLDE5NiwxNzEsIDk0LDEzNSwxNjksMjUxLDEzOCwyMzQsIDc2LDE1OSwgNTksIDMyLDE1MCwgOTcsCisgICAgMTgwLCA2MSwxMjYsMTQ1LCA2OSwyMjAsMTcyLCAyMCwgODcsIDUzLDE2MCwyMzEsMTE5LCAzOCwxMTcsIDYzLAorICAgIDE3NywyMDcsMjUxLDIyNSwyNDMsMjI0LDIzNywxNzMsIDc0LDE4OCwgNjUsMTc1LCA3NywyNTAsMjUzLDIyOCwKKyAgICAxMjgsMTIzLDEyNCwxNTQsIDI3LCA0OCwgODgsMTkyLCAxNSwgMjQsMjEzLDI0NSwyMjcsMjMyLDIwOSwxNzUsCisgICAgMjU0LDI0MiwyNDMsIDIxLDI1NSwgMTAsMTA0LCA4MywgMjEsMTgyLDI0NCwgMzgsIDQ2LDIyMCwgOTUsMTAxLAorICAgICAxNywyNDcsMTk4LCAxMiwyMzcsMTQ4LCAyOCwyMDIsMjI2LDE5OCwxNTIsMTcyLDIwNCwgMTEsICA5LDE4NCwKKyAgICAgNTYsIDgzLDEyNSwgIDksMTc1LDExNSwxNzYsMTIyLDI0NCwyMzAsIDUxLCAyMiwxNjMsMjU0LDE3NiwgMjYsCisgICAgICA3LDE4OSwyMzAsIDU1LCA5NywgNzQsIDk0LCAxMSwyMzQsIDEwLDEzNCwgNTUsMTk4LCA5OCwgNjEsMTg2LAorICAgIDEyMiwgIDksICA2LCA4OSwyNDgsIDM1LCA1NywxMzYsIDk3LCA0NywxNzMsMjM1LDIxNSwyMDUsMTEyLCAxNSwKKyAgICAxMDUsMjM3LDEyOSwyMzMsIDQzLCA5MCwyMTgsMjUwLDE0MSwgOTMsMTc3LDIyOSwyNDAsMTEzLCAyOCwyMDIsCisgICAgMTY5LDI1NCwgODYsMjQwLDE3MCwgMjUsIDQzLDIzNCwxOTIsMTk4LCAgMiwyMzksIDMzLDE1OSwxODUsMjM0LAorICAgICA1MCwxMTAsIDcyLDEyOSwxNzEsIDQ0LDE2OCwxMzcsMTExLDIwNCwyNDAsMTk5LDIxMSwxOTQsMTU0LDE5OSwKKyAgICAgODQsMTE5LDExMSwxMDcsMjUwLCAgMywyMjQsMTIyLDIzOSwgOTYsMTQ0LDE4NywgMzksIDI1LDIyMCwyMDIsCisgICAgIDk3LDE1NSwyMTQsMjU1LCAgMSwgIDAsMTY4LDEyMCwxOTksMTEwLCA2NywxNzksMTU4LDEyNiwgIDAsICAwLAorICAgICAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfa2V5X3BuZ1syODU3XSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsIDM1LCAgMCwgIDAsICAwLCAzNCwgMTYsICA2LCAgMCwgIDAsICAwLDEzMywgMjEsMTg4LAorICAgIDE5MSwgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDAsCisgICAgIDg0LCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwyMDgsIDQ5LCAgMSwgIDAsIDE2LCAxNiwgIDAsIDY0LAorICAgIDIxMiwyNTAsMTEyLDIxMiwgNDgsMTA3LCAzMiwyMDcsIDIzLDE3NywxNTMsMTAxLDExMiwgMjMsMjI1LDEwNiwKKyAgICAyMzYsMTE3LDExNCwxNDIsIDk0LDEyMCwgNTIsICA1LCA5OCwxOTYsMTM2LCAxNywgMzUsIDcwLDE0MCwgMjQsCisgICAgIDQ5LCA5OCwxOTYsMTM2LCA2NSwxNDAsIDI0LCA0OSwgOTgsMTk2LDEzNiwgMTcsIDM1LCA3MCwxNDAsIDI0LAorICAgICA0OSwxMzYsIDE3LCAzNSwgNzAsMTQwLCAyNCwgNDksIDk4LDE5NiwxMzYsIDE3LDI0MywxNTksIDExLCAgMCwKKyAgICAgIDAsMjU1LDI1NSwgIDMsICAwLCA1NiwxNzEsICA1LCA2NSwxMzEsMjExLDIzNCwgMTEsICAwLCAgMCwgIDAsCisgICAgICAwLCA3MywgNjksIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX2xheW91dFs3NzE0XSA9IHsKKyAgICAxMTIsIDk3LDExNCwxMTYsMTE1LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwxMDAsMTAxLDExOCwxMDUsCisgICAgIDk5LDEwMSwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5OCwgOTcsIDk5LAorICAgIDEwNywxMDMsMTE0LDExMSwxMTcsMTEwLDEwMCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsIDMyLDEwMCwxMDEsCisgICAgMTE4LDEwNSwgOTksMTAxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTAwLDEwNSwxMTUsMTEyLDEwOCwKKyAgICAgOTcsMTIxLCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDExOSwxMDUsMTAwLDExNiwxMDQsIDMyLCAzMiwgMzIsIDUxLCA1MCwgNDgsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNCwxMDEsMTA1LDEwMywxMDQsMTE2LCAzMiwKKyAgICAgMzIsIDUyLCA1NiwgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDUxLCA0OSwgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgNTUsIDUwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDk4LDExNywxMTYsMTE2LDExMSwxMTAsMTE1LCAzMiwxMjMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExNSwxMTEsMTAyLDExNiwKKyAgICAgNDUsMTA4LDEwMSwxMDIsMTE2LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLAorICAgIDEwMSwgMzIsMTA5LDEwMSwxMTAsMTE3LCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsCisgICAgIDMyLCA0OSwgNTIsIDU1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDUzLCA1MywgNTMsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA0LDExMSwxMDksMTAxLCAzMiwxMjMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsMTA0LDExMSwxMDksMTAxLCA0NiwxMTIsCisgICAgMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MiwgNTYsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTIxLCAzMiwgNTMsIDU3LCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgOTgsIDk3LCA5OSwxMDcsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLAorICAgICAzMiwgOTgsIDk3LCA5OSwxMDcsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsCisgICAgIDUwLCA1NiwgNTQsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTMsIDU3LCA0OCwgMTAsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDAsMTEyLCA5NywxMDAsIDQ1LDExNywxMTIsIDMyLAorICAgIDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgOTcsMTE0LDExNCwxMTEsCisgICAgMTE5LCA5NSwxMTcsMTEyLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA0OSwKKyAgICAgNTIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDUzLCA1NywgNTMsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTAwLDExMiwgOTcsMTAwLCA0NSwxMDAsMTExLDExOSwxMTAsCisgICAgIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgOTcsMTE0LDExNCwKKyAgICAxMTEsMTE5LCA5NSwxMDAsMTExLDExOSwxMTAsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMCwgMzIsIDQ5LCA1MiwgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTQsIDUzLCA1NCwgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDAsMTEyLCA5NywxMDAsIDQ1LDEwOCwKKyAgICAxMDEsMTAyLDExNiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLAorICAgICA5NywxMTQsMTE0LDExMSwxMTksIDk1LDEwOCwxMDEsMTAyLDExNiwgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTIwLCAzMiwgNDksIDQ5LCA0OSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1MywKKyAgICAgNTcsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwMCwxMTIsIDk3LAorICAgIDEwMCwgNDUsMTE0LDEwNSwxMDMsMTA0LDExNiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksCisgICAgIDk3LDEwMywxMDEsIDMyLCA5NywxMTQsMTE0LDExMSwxMTksIDk1LDExNCwxMDUsMTAzLDEwNCwxMTYsIDQ2LAorICAgIDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUwLCA1MCwgNTAsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTIxLCAzMiwgNTMsIDU3LCA1NiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMDAsMTEyLCA5NywxMDAsIDQ1LCA5OSwxMDEsMTEwLDExNiwxMDEsMTE0LCAzMiwxMjMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsMTE1LDEwMSwxMDgsMTAxLCA5OSwxMTYsCisgICAgIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA1MiwgNTAsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTQsIDUwLCA1NCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwxMTIsMTA0LDExMSwxMTAsMTAxLCA0NSwxMDAsMTA1LCA5NywxMDgsIDMyLDEyMywgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwxMTUsMTAxLDExMCwxMDAsIDQ2LDExMiwKKyAgICAxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUyLCA1NiwgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjEsIDMyLCA1NCwgNTIsIDU0LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDExMiwxMDQsMTExLDExMCwxMDEsIDQ1LDEwNCwgOTcsMTEwLDEwMywxMTcsMTEyLCAzMiwxMjMsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsMTAxLDExMCwxMDAsIDQ2LDExMiwxMTAsMTAzLAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUwLCA1NiwgNTQsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLAorICAgICAzMiwgNTQsIDUyLCA1NCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTI1LCAxMCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTEyLDExMSwxMTksMTAxLDExNCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywKKyAgICAxMDEsIDMyLDExMiwxMTEsMTE5LDEwMSwxMTQsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMCwgMzIsIDQ1LCA1MSwgNTYsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTMsIDUwLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMTgsMTExLDEwOCwxMTcsMTA5LDEwMSwKKyAgICAgNDUsMTE3LDExMiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLAorICAgIDExOCwxMTEsMTA4LDExNywxMDksMTAxLCA5NSwxMTcsMTEyLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjAsIDMyLCA1MSwgNTQsIDUwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDUwLCA1NCwKKyAgICAgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExOCwxMTEsMTA4LAorICAgIDExNywxMDksMTAxLCA0NSwxMDAsMTExLDExOSwxMTAsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsCisgICAgMTA5LCA5NywxMDMsMTAxLCAzMiwxMTgsMTExLDEwOCwxMTcsMTA5LDEwMSwgOTUsMTAwLDExMSwxMTksMTEwLAorICAgICA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MSwgNTQsIDUwLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyMSwgMzIsIDUxLCA0OSwgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAxMCwgMzIsIDMyLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDk4LAorICAgIDExMSwgOTcsMTE0LDEwMCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5OCwKKyAgICAgOTcsIDk5LDEwNywxMDMsMTE0LDExMSwxMTcsMTEwLDEwMCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsIDMyLAorICAgIDEwNywxMDEsMTIxLCA5OCwxMTEsIDk3LDExNCwxMDAsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTgsCisgICAgMTE3LDExNiwxMTYsMTExLDExMCwxMTUsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDQ5LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsCisgICAgMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgMzIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgMzIsCisgICAgIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA1MCwgMzIsMTIzLCAxMCwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwKKyAgICAgMzIsIDUxLCA1NSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCA1MSwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLAorICAgICA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDU1LCA1MiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDQ4LCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA1MiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLAorICAgIDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA0OSwgNDksCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwxMjEsIDMyLCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTMsCisgICAgIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLDExMCwKKyAgICAxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjAsIDMyLCA0OSwgNTIsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDU0LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwKKyAgICAgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNDksIDU2LCA1MywgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwKKyAgICAgMzIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA1NSwgMzIsMTIzLAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMCwgMzIsIDUwLCA1MCwgNTAsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgNTYsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsCisgICAgMTAxLDEyMSwgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MCwgNTMsIDU3LCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNDgsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDU3LCAzMiwxMjMsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsCisgICAgMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwKKyAgICAgNTAsIDU3LCA1NCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCA0OCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLAorICAgICA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUxLCA1MSwgNTEsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OCwgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMTAsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTEzLCAzMiwxMjMsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LAorICAgICA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgMzIsCisgICAgIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTIxLCAzMiwgMzIsIDUxLCA1NCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMTksIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwKKyAgICAgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MSwgNTUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1MSwgNTQsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTAxLCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywKKyAgICAxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTUsIDUyLAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTIxLCAzMiwgNTEsIDU0LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDExNCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsCisgICAgMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA0OSwgNDksIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1MSwgNTQsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTE2LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsCisgICAgMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNDksIDUyLCA1NiwKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyMSwgMzIsIDUxLCA1NCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjEsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLAorICAgIDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwxMjAsIDMyLCA0OSwgNTYsIDUzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTEsIDU0LCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExNywgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLAorICAgIDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUwLCA1MCwgNTAsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwxMjEsIDMyLCA1MSwgNTQsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTA1LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwKKyAgICAxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTAsIDUzLCA1NywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDUxLCA1NCwgMTAsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMTEsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywKKyAgICAxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MCwgNTcsIDU0LAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTIxLCAzMiwgNTEsIDU0LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDExMiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsCisgICAgMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyMCwgMzIsIDUxLCA1MSwgNTEsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1MSwgNTQsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5NywgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsCisgICAgMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDMyLCA0OCwKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyMSwgMzIsIDMyLCA1NSwgNTAsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTE1LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LAorICAgIDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTEsIDU1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTUsIDUwLCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwMCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLAorICAgIDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDU1LCA1MiwgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMSwgMzIsIDU1LCA1MCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDIsCisgICAgIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLDExMCwKKyAgICAxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjAsIDMyLCA0OSwgNDksIDQ5LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNTUsIDUwLCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwMywgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwKKyAgICAgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA1MiwgNTYsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjEsIDMyLCA1NSwgNTAsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA0LAorICAgICAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsCisgICAgMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTIwLCAzMiwgNDksIDU2LCA1MywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDU1LCA1MCwgMTAsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDYsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsCisgICAgIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA1MCwgNTAsIDUwLCAxMCwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTIxLCAzMiwgNTUsIDUwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwNywKKyAgICAgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLAorICAgIDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLDEyMCwgMzIsIDUwLCA1MywgNTcsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1NSwgNTAsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA4LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLAorICAgICAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTAsIDU3LCA1NCwgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMSwgMzIsIDU1LCA1MCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNjgsCisgICAgIDY5LCA3NiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwKKyAgICAxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUxLCA1MSwgNTEsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA1NSwgNTAsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA2NywgNjUsIDgwLCAzMiwxMjMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLAorICAgICAzMiwgMzIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgMzIsIDQ5LCA0OCwgNTYsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTIyLCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsCisgICAgMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTEsIDU1LCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNDksCisgICAgIDQ4LCA1NiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLDEyMywKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEwNSwxMDksIDk3LDEwMywxMDEsIDMyLCAzMiwxMDcsMTAxLDEyMSwgNDYsMTEyLDExMCwxMDMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjAsIDMyLCA1NSwgNTIsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCA5OSwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLAorICAgIDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA0OSwgNDksIDEwLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLAorICAgICA0OSwgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExOCwgMzIsCisgICAgMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyMCwgMzIsIDQ5LCA1MiwgNTYsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5OCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwKKyAgICAgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDQ5LCA1NiwgNTMsIDEwLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAxMjEsIDMyLCA0OSwgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDExMCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsCisgICAgMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyMCwgMzIsIDUwLCA1MCwgNTAsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwgNDgsIDU2LCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwOSwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsCisgICAgMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUwLCA1MywKKyAgICAgNTcsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjEsIDMyLCA0OSwgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCA4MCwgNjksIDgyLCA3MywgNzksIDY4LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLAorICAgICAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTAsIDU3LCA1NCwgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgIDEyMSwgMzIsIDQ5LCA0OCwgNTYsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDY5LCA3OCwgODQsIDY5LCA4MiwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywKKyAgICAxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDUxLCA1MSwgNTEsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwKKyAgICAgNDgsIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsCisgICAgIDEwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNjUsIDc2LAorICAgICA4NCwgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsCisgICAgMTEwLDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEyMCwgMzIsIDMyLCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDMyLCA0OSwgNTIsIDUyLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA4MywgODksIDc3LCAzMiwxMjMsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsCisgICAgMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwKKyAgICAgNTEsIDU1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTIxLCAzMiwgNDksIDUyLCA1MiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgNjUsIDg0LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LAorICAgIDEwMSwxMjEsIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTUsIDUyLCAxMCwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwgNDksIDUyLAorICAgICA1MiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LCAxMCwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgODMsIDgwLCA2NSwgNjcsCisgICAgIDY5LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTE1LDExMiwgOTcsIDk5LDEwMSwKKyAgICAgOTgsIDk3LDExNCwgNDYsMTEyLDExMCwxMDMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjAsIDMyLCA0OSwgNDksIDQ5LCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwKKyAgICAgNDksIDUyLCA1MiwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTI1LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgODMsIDc2LAorICAgICA2NSwgODMsIDcyLCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMDUsMTA5LCA5NywxMDMsMTAxLCAzMiwgMzIsMTA3LDEwMSwxMjEsCisgICAgIDQ2LDExMiwxMTAsMTAzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgNTAsIDUzLCA1NywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDQ5LCA1MiwgNTIsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDY3LCA3OSwgNzcsIDc3LCA2NSwKKyAgICAgMzIsMTIzLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsMTA1LDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLAorICAgIDEwMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLDEyMCwgMzIsIDUwLCA1NywgNTQsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwgNTIsIDUyLCAxMCwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA2NSwgNzYsIDg0LCA1MCwgMzIsMTIzLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA1LAorICAgIDEwOSwgOTcsMTAzLDEwMSwgMzIsIDMyLDEwNywxMDEsMTIxLCA0NiwxMTIsMTEwLDEwMywgMTAsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsCisgICAgIDUxLCA1MSwgNTEsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCA0OSwgNTIsIDUyLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsMTI1LCAxMCwgMTAsMTA4LCA5NywxMjEsMTExLAorICAgIDExNywxMTYsMTE1LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwxMTIsMTExLDExNCwxMTYsMTE0LCA5NywKKyAgICAxMDUsMTE2LCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTE5LDEwNSwxMDAsCisgICAgMTE2LDEwNCwgMzIsIDMyLCAzMiwgMzIsIDMyLCA1NywgNDgsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLDEwNCwxMDEsMTA1LDEwMywxMDQsMTE2LCAzMiwgMzIsIDMyLCAzMiwgNTUsIDUxLCA0OCwKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgOTksMTExLDEwOCwxMTEsMTE0LCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDQ4LDEyMCwxMDEsIDQ4LDEwMSwgNDgsMTAxLCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwxMDEsMTE4LDEwMSwxMTAsMTE2LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDY5LCA4NiwKKyAgICAgOTUsIDgzLCA4NywgNTgsIDQ4LCA1OCwgNDksIDEwLCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLDExMiwgOTcsMTE0LDExNiwgNDksIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTEwLCA5NywxMDksMTAxLCAzMiwgMzIsIDMyLCAzMiwxMDAsMTAxLDExOCwKKyAgICAxMDUsIDk5LDEwMSwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgMTIwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTIsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMjEsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA0NSwKKyAgICAgNDksIDU2LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwxMTIsIDk3LDExNCwxMTYsIDUwLCAzMiwxMjMsIDEwLCAzMiwgMzIsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExMCwgOTcsMTA5LDEwMSwgMzIsIDMyLCAzMiwKKyAgICAgMzIsMTA3LDEwMSwxMjEsIDk4LDExMSwgOTcsMTE0LDEwMCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTIsIDU2LAorICAgICA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIxLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNTAsIDQ4LCA0OCwgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwxMjUsIDEwLCAzMiwgMzIsIDMyLCAzMiwxMjUsIDEwLCAxMCwgMzIsIDMyLCAzMiwgMzIsMTA4LAorICAgICA5NywxMTAsMTAwLDExNSwgOTksIDk3LDExMiwxMDEsIDMyLDEyMywgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwxMTksMTA1LDEwMCwxMTYsMTA0LCAzMiwgMzIsIDMyLCAzMiwgMzIsIDU3LCA0OCwgNDgsCisgICAgIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA0LDEwMSwxMDUsMTAzLDEwNCwxMTYsIDMyLAorICAgICAzMiwgMzIsIDMyLCA1NCwgNTUsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA5OSwKKyAgICAxMTEsMTA4LDExMSwxMTQsIDMyLCAzMiwgMzIsIDMyLCAzMiwgNDgsMTIwLDEwMSwgNDgsMTAxLCA0OCwxMDEsCisgICAgIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEwMSwxMTgsMTAxLDExMCwxMTYsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgNjksIDg2LCA5NSwgODMsIDg3LCA1OCwgNDgsIDU4LCA0OCwgMTAsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTEyLCA5NywxMTQsMTE2LCA0OSwgMzIsMTIzLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwxMTAsIDk3LDEwOSwxMDEsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsMTAwLDEwMSwxMTgsMTA1LCA5OSwxMDEsIDEwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgNTMsIDQ4LCAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorICAgICAzMiwxMjEsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDUyLCA1MiwgNDgsIDEwLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExNCwxMTEsMTE2LCA5NywxMTYsCisgICAgMTA1LDExMSwxMTAsIDMyLCAzMiwgNTEsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTI1LAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDExMiwgOTcsMTE0LDExNiwgNTAsIDMyLDEyMywKKyAgICAgMTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTEwLCA5NywxMDksCisgICAgMTAxLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTA3LDEwMSwxMjEsIDk4LDExMSwgOTcsMTE0LDEwMCwgMTAsIDMyLAorICAgICAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsMTIwLCAzMiwgMzIsIDMyLCAzMiwKKyAgICAgMzIsIDMyLCAzMiwgMzIsIDUwLCA1MywgNDgsIDEwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEyMSwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCA1MiwgNTUsIDQ4LAorICAgICAxMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLDEyNSwgMTAsIDMyLCAzMiwgMzIsIDMyLDEyNSwKKyAgICAgMTAsMTI1LCAxMCwgMTAsMTA3LDEwMSwxMjEsIDk4LDExMSwgOTcsMTE0LDEwMCwgMzIsMTIzLCAxMCwgMzIsCisgICAgIDMyLCAzMiwgMzIsIDk5LDEwNCwgOTcsMTE0LDEwOSwgOTcsMTEyLCAzMiwxMTMsMTE5LDEwMSwxMTQsMTE2LAorICAgIDEyMSwgNTAsIDEwLDEyNSwgMTAsIDEwLDExMCwxMDEsMTE2LDExOSwxMTEsMTE0LDEwNywgMzIsMTIzLCAxMCwKKyAgICAgMzIsIDMyLCAzMiwgMzIsMTE1LDExMiwxMDEsMTAxLDEwMCwgMzIsIDMyLDEwMiwxMTcsMTA4LDEwOCwgMTAsCisgICAgIDMyLCAzMiwgMzIsIDMyLDEwMCwxMDEsMTA4LCA5NywxMjEsIDMyLCAzMiwxMTAsMTExLDExMCwxMDEsIDEwLAorICAgIDEyNSwgMTAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX21lbnVfcG5nWzMwNzldID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMCwgODQsICAwLCAgMCwgIDAsIDM0LCAxNiwgIDYsICAwLCAgMCwgIDAsMTQ1LDEyOCwgMzQsCisgICAgIDk0LCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsIDEwLCA3OSwxMDUsIDY3LCA2NywgODAsIDgwLDEwNCwKKyAgICAxMTEsMTE2LDExMSwxMTUsMTA0LDExMSwxMTIsIDMyLCA3MywgNjcsIDY3LCAzMiwxMTIsMTE0LDExMSwxMDIsCisgICAgMTA1LDEwOCwxMDEsICAwLCAgMCwxMjAsMjE4LDE1NywgODMsMTAzLCA4NCwgODMsMjMzLCAyMiwgNjEsMjQ3LAorICAgIDIyMiwyNDQsIDY2LCA3NSwxMzYsMTI4LDE0OCwgNzUsMTExLCA4MiwgMjEsICA4LCAzMiwgODIsIDY2LDEzOSwKKyAgICAxMjgsIDIwLDE0NSwgMzgsIDQyLCAzMywgIDksIDE2LCA3NCwxMzYsIDMzLDE2MSwyMTcsIDIxLCA4MSwxOTMsCisgICAgIDE3LCA2OSwgNjksICA0LCAyNywyMDAsMTYwLDEzNiwgIDMsMTQyLDE0MiwxMjgsMTQwLCAyMSwgODEsIDQ0LAorICAgICAxMiwxMzgsIDEwLDIxNiwgIDcsMjI4LCAzMywxNjIsMTQyLDEzMSwxNjMsMTM2LDEzOCwyMDIsMjUxLDIyNSwKKyAgICAxMjMsMTYzLDEwNywyMTQsMTg4LDI0NywyMzAsMjA1LDI1NCwxODEsMjE1LCA2MiwyMzEsMTcyLDI0MywxNTcsCisgICAgMTc5LDIwNywgIDcsMTkyLCAgOCwgMTIsMTUwLCA3MiwgNTEsIDgxLCA1MywxMjgsIDEyLDE2OSwgNjYsIDMwLAorICAgICAxNywyMjQsMTMxLDE5OSwxOTYsMTk4LDIyNSwyMjgsIDQ2LCA2NCwxMjksIDEwLCAzNiwxMTIsICAwLCAxNiwKKyAgICAgIDgsMTc5LDEwMCwgMzMsMTE1LDI1MywgMzUsICAxLCAgMCwyNDgsMTI2LCA2MCwgNjAsIDQzLCAzNCwxOTIsCisgICAgICA3LDE5MCwgIDAsICAxLDEyMCwyMTEsIDExLCAgOCwgIDAsMTkyLCA3NywxNTUsMTkyLCA0OCwgMjgsMTM1LAorICAgIDI1NSwgMTUsMjM0LCA2NiwxNTMsIDkyLCAgMSwxMjgsMTMyLCAgMSwxOTIsMTE2LDE0NSwgNTYsIDc1LCAgOCwKKyAgICAxMjgsIDIwLCAgMCwgNjQsMTIyLDE0MiwgNjYsMTY2LCAgMCwgNjQsIDcwLCAgMSwxMjgsMTU3LDE1MiwgMzgsCisgICAgIDgzLCAgMCwxNjAsICA0LCAgMCwgOTYsMjAzLCA5OSwgOTgsMjI3LCAgMCwgODAsIDQ1LCAgMCwgOTYsIDM5LAorICAgIDEyNywyMzAsMjExLCAgMCwxMjgsMTU3LDI0OCwxNTMsMTIzLCAgMSwgIDAsIDkxLDE0OCwgMzMsIDIxLCAgMSwKKyAgICAxNjAsMTQ1LCAgMCwgMzIsIDE5LDEwMSwxMzYsIDY4LCAgMCwxMDQsIDU5LCAgMCwxNzIsMjA3LCA4NiwxMzgsCisgICAgIDY5LCAgMCwgODgsIDQ4LCAgMCwgMjAsMTAyLCA3NSwxOTYsIDU3LCAgMCwyMTYsIDQ1LCAgMCwgNDgsIDczLAorICAgICA4NywxMDIsIDcyLCAgMCwxNzYsMTgzLCAgMCwxOTIsMjA2LCAxNiwgMTEsMTc4LCAgMCwgIDgsIDEyLCAgMCwKKyAgICAgNDgsIDgxLDEzNiwxMzMsIDQxLCAgMCwgIDQsMTIzLCAgMCwgOTYsMjAwLCAzNSwgMzUsMTIwLCAgMCwxMzIsCisgICAgMTUzLCAgMCwgMjAsIDcwLDI0MiwgODcsIDYwLDI0MSwgNDMsMTc0LCAxNiwyMzEsIDQyLCAgMCwgIDAsMTIwLAorICAgIDE1MywxNzgsIDYwLDE4NSwgMzYsIDU3LCA2OSwxMjksIDkxLCAgOCwgNDUsMTEzLCAgNywgODcsIDg3LCA0NiwKKyAgICAgMzAsIDQwLDIwNiwgNzMsIDIzLCA0MywgMjAsIDU0LCA5NywgIDIsIDk3LDE1NCwgNjQsIDQ2LDE5NCwxMjEsCisgICAgMTUzLCAyNSwgNTAsMTI5LCA1MiwgMTUsMjI0LDI0MywyMDQsICAwLCAgMCwxNjAsMTQ1LCAyMSwgMTcsMjI0LAorICAgIDEzMSwyNDMsMjUzLDEyMCwyMDYsIDE0LDE3NCwyMDYsMjA2LCA1NCwxNDIsMTgyLCAxNCwgOTUsIDQ1LDIzNCwKKyAgICAxOTEsICA2LDI1NSwgMzQsIDk4LCA5OCwyMjcsMjU0LDIyOSwyMDcsMTcxLDExMiwgNjQsICAwLCAgMCwyMjUsCisgICAgMTE2LDEyNiwyMDksMjU0LCA0NCwgNDcsMTc5LCAyNiwxMjgsIDU5LCAgNiwxMjgsMTA5LDI1NCwxNjIsIDM3LAorICAgIDIzOCwgIDQsMTA0LCA5NCwgMTEsMTYwLDExNywyNDcsMTM5LDEwMiwxNzgsIDE1LCA2NCwxODEsICAwLDE2MCwKKyAgICAyMzMsMjE4LCA4NywyNDMsMTEyLDI0OCwxMjYsIDYwLCA2MCwgNjksMTYxLDE0NCwxODUsMjE3LDIxNywyMjksCisgICAgMjI4LDIyOCwyMTYsIDc0LDE5NiwgNjYsIDkxLCA5NywyMDIsIDg3LDEyNSwyNTQsMTAzLDE5NCwgOTUsMTkyLAorICAgICA4NywyNTMsMTA4LDI0OSwxMjYsIDYwLDI1MiwyNDcsMjQ1LDIyNCwxOTAsMjI2LCAzNiwxMjksIDUwLCA5MywKKyAgICAxMjksIDcxLCAgNCwyNDgsMjI0LDE5NCwyMDQsMjQ0LCA3NiwxNjUsIDI4LDIwNywxNDYsICA5LDEzMiwgOTgsCisgICAgMjIwLDIzMCwxNDMsIDcxLDI1MiwxODMsIDExLDI1NSwyNTIsIDI5LDIxMSwgMzQsMTk2LCA3MywgOTgsMTg1LAorICAgICA4OCwgNDIsIDIwLDIyNywgODEsIDE4LDExMywxNDIsIDY4LDE1NCwxNDAsMjQzLCA1MCwxNjUsIDM0LDEzNywKKyAgICAgNjYsMTQ2LCA0MSwxOTcsIDM3LDIxMCwyNTUsMTAwLDIyNiwyMjMsIDQ0LDI1MSwgIDMsIDYyLDIyMywgNTMsCisgICAgICAwLDE3NiwxMDYsIDYyLCAgMSwxMjMsMTQ1LCA0NSwxNjgsIDkzLCA5OSwgIDMsMjQ2LCA3NSwgMzksIDE2LAorICAgICA4OCwxMTYsMTkyLDIyNiwyNDcsICAwLCAgMCwyNDIsMTg3LDExMSwxOTMsMjEyLCA0MCwgIDgsICAzLDEyOCwKKyAgICAxMDQsMTMxLDIyNSwyMDcsMTE5LDI1NSwyMzksIDYzLDI1MywgNzEsMTYwLCAzNywgIDAsMTI4LDEwMiwgNzMsCisgICAgMTQ2LDExMywgIDAsICAwLCA5NCwgNjgsIDM2LCA0NiwgODQsMjAyLDE3OSwgNjMsMTk5LCAgOCwgIDAsICAwLAorICAgICA2OCwxNjAsMTI5LCA0MiwxNzYsIDY1LCAyNywyNDQsMTkzLCAyNCwgNDQsMTkyLCAgNiwgMjgsMTkzLCAgNSwKKyAgICAyMjAsMTkzLCAxMSwyNTIsIDk2LCA1NCwxMzIsIDY2LCAzNiwxOTYsMTk0LCA2NiwgMTYsIDY2LCAxMCwxMDAsCisgICAgMTI4LCAyOCwxMTQsIDk2LCA0MSwxNzIsMTMwLCA2NiwgNDAsMTM0LDIwNSwxNzYsIDI5LCA0MiwgOTYsIDQ3LAorICAgIDIxMiwgNjQsIDI5LCA1MiwxOTIsIDgxLDEwNCwxMzQsMTQ3LDExMiwgMTQsIDQ2LDE5NCwgODUsMTg0LCAxNCwKKyAgICAgNjEsMTEyLCAxNSwyNTAsIDk3LCAgOCwxNTgsMTkzLCA0MCwxODgsMTI5LCAgOSwgIDQsIDY1LDIwMCwgIDgsCisgICAgIDE5LCA5NywgMzMsMjE4LDEzNiwgIDEsIDk4LDEzOCwgODgsIDM1LDE0MiwgIDgsIDIzLDE1MywxMzMsMjQ4LAorICAgICAzMywxOTMsIDcyLCAgNCwgMTgsMTM5LCAzNiwgMzIsMjAxLDEzNiwgMjAsIDgxLCAzNCwgNzUsMTQ1LCA1MywKKyAgICAgNzIsIDQ5LCA4MiwxMzgsIDg0LCAzMiwgODUsIDcyLCAyOSwyNDIsIDYxLDExNCwgIDIsIDU3LDEzNSwgOTIsCisgICAgIDcwLDE4NiwxNDUsIDU5LDIwMCwgIDAsIDUwLDEzMCwyNTIsMTM0LDE4OCwgNzEsIDQ5LDE0OCwxMjksMTc4LAorICAgICA4MSwgNjEsMjEyLCAxMiwxODEsIDY3LDE4NSwxNjgsIDU1LCAyNiwxMzIsIDcwLDE2MiwgMTEsMjA4LDEwMCwKKyAgICAxMTYsIDQ5LDE1NCwxNDMsIDIyLDE2MCwxNTUsMjA4LDExNCwxODAsIDI2LCA2MSwxNDAsIDU0LDE2MSwyMzEsCisgICAgMjA4LDE3MSwxMDQsIDE1LDIxOCwxNDMsIDYyLCA2NywxOTksIDQ4LDE5MiwyMzIsIDI0LCAgNywgNTEsMTk2LAorICAgIDEwOCwgNDgsIDQ2LDE5OCwxOTUsIDY2LDE3NywgNTYsIDQ0LCAgOSwxNDcsIDk5LDIwMywxNzcsIDM0LDE3MiwKKyAgICAgMTIsMTcxLDE5OCwgMjYsMTc2LCA4NiwxNzIsICAzLDE4NywxMzcsMjQ1LCA5OSwyMDcsMTc3LDExOSwgIDQsCisgICAgIDE4LDEyOSwgNjksMTkyLCAgOSwgNTQsICA0LDExOSwgNjYsIDMyLCA5NywgMzAsIDY1LCA3MiwgODgsIDc2LAorICAgICA4OCwgNzgsMjE2LCA3MiwxNjgsIDMyLCAyOCwgMzYsIDUyLCAxNywyMTgsICA5LCA1NSwgIDksICAzLDEzMiwKKyAgICAgODEsMTk0LCAzOSwgMzQsMTQ3LDE2OCwgNzUsMTgwLCAzOCwxODYsIDE3LDI0OSwxOTYsIDI0LCA5OCwgNTAsCisgICAgIDQ5LDEzNSwgODgsIDcyLCA0NCwgMzUsMjE0LCAxOCwxNDMsIDE5LCA0NywgMTYsMTIzLDEzNiwgNjcsMTk2LAorICAgICA1NSwgMzYsIDE4LDEzNywgNjcsIDUwLCAzOSwxODUsMTQ0LCAgMiwgNzMsMTc3LDE2NCwgODQsMjEwLCAxOCwKKyAgICAyMTAsIDcwLDIxMCwxMTAsIDgyLCAzNSwyMzMsIDQ0LDE2OSwxNTUsIDUyLCA3MiwgMjYsIDM1LDE0NywyMDEsCisgICAgMjE4LDEwMCwxMDcsMTc4LCAgNywgNTcsMTQ4LCA0NCwgMzIsIDQzLDIwMCwxMzMsMjI4LDE1NywyMjgsMTk1LAorICAgIDIyOCwgNTEsMjI4LCAyNywyMjgsIDMzLDI0MiwgOTEsIDEwLDE1NywgOTgsIDY0LDExMywxNjQsMjQ4LCA4MywKKyAgICAyMjYsIDQwLCA4MiwyMDIsMTA2LCA3NCwgMjUsMjI5LCAxNiwyMjksIDUyLDIyOSwgIDYsMTAxLDE1MiwgNTAsCisgICAgIDY1LCA4NSwxNjMsMTU0LCA4MiwyMjEsMTY4LDE2MSwgODQsIDE3LCA1MywxNDMsIDkwLCA2NiwxNzMsMTYxLAorICAgIDE4MiwgODIsMTc1LCA4MSwxMzUsMTY4LCAxOSwgNTIsMTE3LDE1NCwgNTcsMjA1LDEzMSwgMjIsIDczLCA3NSwKKyAgICAxNjUsMTczLDE2MiwxNDksMjExLCAyNiwxMDQsIDIzLDEwNCwyNDcsMTA1LDE3NSwyMzIsMTE2LDE4NiwgMTcsCisgICAgMjIxLDE0OSwgMzAsIDc4LDE1MSwyMDgsIDg3LDIxMCwyMDMsMjMzLCA3MSwyMzIsMTUxLDIzMiwgIDMsMjQ0LAorICAgIDExOSwgMTIsIDEzLDEzNCwgMjEsMTMxLDE5OSwxMzYsMTAzLCA0MCwgMjUsMTU1LCAyNCwgIDcsIDI0LDEwMywKKyAgICAgMjUsMTE5LCAyNCwxNzUsMTUyLCA3NiwxNjYsIDI1LDIxMSwxMzksIDI1LDE5OSwgODQsIDQ4LCA1NSwgNDksCisgICAgMjM1LDE1MiwyMzEsMTUzLCAxNSwxNTMsMTExLCA4NSwgODgsIDQyLDE4MiwgNDIsMTI0LCAyMSwxNDUsMjAyLAorICAgICAxMCwxNDksIDc0LDE0OSwgMzgsMTQ5LCAyNywgNDIsIDQ3LCA4NCwxNjksMTcwLDE2NiwxNzAsMjIyLDE3MCwKKyAgICAgMTEsIDg1LDI0MywgODUsMjAzLCA4NCwxNDMsMTY5LCA5NCwgODMsMTI1LDE3NCwgNzAsIDg1LCA1MSwgODMsCisgICAgMjI3LDE2OSwgIDksMjEyLDE1MCwxNzEsIDg1LDE3MCwxNTcsIDgwLDIzNSwgODMsIDI3LCA4MywxMDMsMTY5LAorICAgICA1OSwxNjgsMTM1LDE3MCwxMDMsMTY4LDExMSwgODQsIDYzLDE2NCwxMjYsIDg5LDI1MywxMzcsICA2LCA4OSwKKyAgICAxOTUsIDc2LDE5NSwgNzksIDY3LDE2NCwgODEsMTYwLDE3NywgOTUsMjI3LDE4OCwxOTgsIDMyLCAxMSwgOTksCisgICAgIDI1LDE3OSwxMjAsIDQ0LCAzMywxMDcsIDEzLDE3MSwxMzQsMTE3LDEyOSwgNTMsMTk2LCAzOCwxNzcsMjA1LAorICAgIDIxNywxMjQsMTE4LCA0MiwxODcsMTUyLDI1MywgMjksMTg3LDEzOSwgNjEsMTcwLDE2OSwxNjEsIDU3LCA2NywKKyAgICAgNTEsIDc0LCA1MSwgODcsMTc5LCA4MiwyNDMsMTQ4LDEwMiwgNjMsICA3LDIyNywxNTIsMTEzLDI0OCwxNTYsCisgICAgMTE2LCA3OCwgIDksMjMxLCA0MCwxNjcsMTUxLDI0MywxMjYsMTM4LDIyMiwgMjAsMjM5LCA0MSwyMjYsIDQxLAorICAgICAyNywxNjYsIDUyLCA3NiwxODUsIDQ5LDEwMSwgOTIsMTA3LDE3MCwxNTAsMTUxLDE1MCwgODgsMTcxLCA3MiwKKyAgICAxNzEsIDgxLDE3MSwgNzEsMjM1LDE4OSwgNTQsMTc0LDIzNywxNjcsMTU3LDE2NiwxODksIDY5LDE4NywgODksCisgICAgMjUxLDEyOSwgMTQsIDY1LDE5OSwgNzQsIDM5LCA5MiwgMzksIDcxLDEwMywxNDMsMjA2LCAgNSwxNTcsMjMxLAorICAgICA4MywyMTcsIDgzLDIyMSwxNjcsIDEwLDE2NywgMjIsIDc3LCA2MSwgNTgsMjQ1LDE3NCwgNDYsMTcwLDEwNywKKyAgICAxNjUsIDI3LDE2MSwxODcsIDY4LDExOSwxOTEsMTEwLDE2NywyMzgsMTUyLDE1OCwxOTAsIDk0LDEyOCwxNTgsCisgICAgIDc2LDExMSwxNjcsMjIyLDEyMSwxODksMjMxLDI1MCwgMjgsMTI1LCA0NywyNTMsIDg0LDI1MywxMDksMjUwLAorICAgIDE2NywyNDUsIDcxLCAxMiwgODgsICA2LDE3OSwgMTIsIDM2LCAgNiwyMTksIDEyLDIwNiwgMjQsIDYwLDE5NywKKyAgICAgNTMsMTEzLDExMSwgNjAsIDI5LCA0NywxOTksMjE5LDI0MSwgODEsIDY3LCA5MywxOTUsIDY0LCA2NywxNjUsCisgICAgIDk3LDE0OSwgOTcsMTUxLDIyNSwxMzIsMTQ1LDE4NSwyMDksIDYwLDE2MywyMTMsIDcwLDE0MSwgNzAsIDE1LAorICAgIDE0MCwxMDUsMTk4LCA5MiwyMjcsIDM2LDIyNywxMDksMTk4LDEwOSwxOTgsMTYzLCAzOCwgIDYsIDM4LCAzMywKKyAgICAgMzgsIDc1LCA3NywyMzQsIDc3LDIzOCwxNTQsIDgyLCA3NywxODUsMTY2LCA0MSwxNjYsIDU5LCA3NiwgNTksCisgICAgIDc2LDE5OSwyMDUsMjA0LDIwNSwxNjIsMjA1LDIxNCwxNTMsIDUzLDE1NSwgNjEsIDQ5LDIxNSwgNTAsMjMxLAorICAgIDE1NSwyMzEsMTU1LDIxNSwxNTUsMjIzLDE4MywgOTYsIDkwLDEyMCwgOTAsIDQ0LDE4MiwxNjgsMTgyLDE4NCwKKyAgICAxMDEsIDczLDE3OCwyMjgsIDkwLDE2NiwgODksMjM4LDE4MiwxODgsMTEwLDEzMywgOTAsIDU3LCA4OSwxNjUsCisgICAgIDg4LCA4NSwgOTAsIDkzLDE3OSwgNzAsMTczLDE1NywxNzMsIDM3LDIxNCwxODcsMTczLDE4NywxNjcsIDE3LAorICAgIDE2NywxODUsIDc4LDE0NywgNzgsMTcxLDE1OCwyMTQsMTAzLDE5NSwxNzYsMjQxLDE4MiwyMDEsMTgyLDE2OSwKKyAgICAxODMsIDI1LDE3NiwyMjksMjE2LCAgNiwyMTksMTc0LDE4MiwxMDksMTgyLDEyNSwgOTcsMTAzLCA5OCwgMjMsCisgICAgMTAzLDE4MywxOTcsMTc0LDE5NSwyMzgsMTQ3LDE4OSwxNDcsMTI1LDE4NiwxMjUsMTQxLDI1MywgNjEsICA3LAorICAgICAxMywxMzUsMjE3LCAxNCwxNzEsIDI5LCA5MCwgMjksMTI2LDExNSwxODAsMTE0LCAyMCwgNTgsIDg2LCA1OCwKKyAgICAyMjIsMTU0LDIwNiwxNTYsMjM4LCA2MywxMjUsMTk3LDI0NCwxNTAsMjMzLCA0NywxMDMsIDg4LDIwNywgMTYsCisgICAgMjA3LDIxNiwgNTEsMjI3LDE4MiwgMTksMjAzLCA0MSwxOTYsMTA1LDE1NywgODMsMTU1LDIxMSwgNzEsMTAzLAorICAgICAyMywxMDMsMTg1LDExNSwxMzEsMjQzLDEzNiwxMzksMTM3LCA3NSwxMzAsMjAzLCA0NiwxNTEsIDYyLCA0NiwKKyAgICAxNTUsIDI3LDE5OCwyMjEsMjAwLDE4OSwyMjgsIDc0LDExNiwyNDUsMTEzLCA5MywyMjUsMTIyLDIxMCwyNDUsCisgICAgMTU3LDE1NSwxNzksMTU1LDE5NCwyMzcsMTY4LDIxOSwxNzUsMjM4LCA1NCwyMzgsMTA1LDIzOCwxMzUsMjIwLAorICAgIDE1OSwyMDQsIDUyLDE1OSwgNDEsMTU4LCA4OSwgNTEsMTE1LDIwOCwxOTUsMjAwLCA2NywyMjQsIDgxLDIyOSwKKyAgICAyMDksIDYzLCAxMSwxNTksMTQ5LCA0OCwxMDcsMjIzLDE3MiwxMjYsIDc5LCA2NywgNzksMTI5LDEwMywxODEsCisgICAgMjMxLCAzNSwgNDcsIDk5LCA0NywxNDUsIDg3LDE3MywyMTUsMTc2LDE4MywxNjUsMTE5LDE3MCwyNDcsIDk3LAorICAgIDIzOSwgMjMsIDYyLDI0NiwgNjIsMTE0LDE1OSwyMjcsIDYyLDIyNywgNjAsIDU1LDIyMiwgNTAsMjIyLCA4OSwKKyAgICAgOTUsMjA0LCA1NSwxOTIsMTgzLDIwMCwxODMsMjAzLCA3OSwxOTUsMTExLDE1OCwgOTUsMTMzLDIyMywgNjcsCisgICAgMTI3LCAzNSwyNTUsMTAwLDI1NSwxMjIsMjU1LDIwOSwgIDAsMTY3LDEyOCwgMzcsICAxLDEwMywgIDMsMTM3LAorICAgIDEyOSwgNjUsMTI5LCA5MSwgIDIsMjUxLDI0OCwxMjIsMTI0LCAzMywxOTEsMTQyLCA2MywgNTgsMjE5LDEwMSwKKyAgICAyNDYsMTc4LDIxNywyMzcsIDY1LDE0MCwxNjAsMTg1LCA2NSwgMjEsIDY1LDE0MywxMzAsMTczLDEzMCwyMjksCisgICAgMTkzLDE3MywgMzMsMTA0LDIwMCwyMzYsMTQ0LDE3MywgMzMsMjQ3LDIzMSwxNTIsMjA2LDE0NSwyMDYsMTA1LAorICAgICAxNCwxMzMsIDgwLDEyNiwyMzIsMjE0LDIwOCwgIDcsIDk3LDIzMCwgOTcsMTM5LDE5NSwxMjYsIDEyLCAzOSwKKyAgICAxMzMsMTM1LDEzMywgODcsMTM0LCA2MywxNDIsMTEyLDEzNiwgODgsIDI2LDIwOSwgNDksMTUxLCA1MywxMTksCisgICAgMjA5LDIyMCwgNjcsMTE1LDIyMywgNjgsMjUwLCA2OCwxNTAsIDY4LDIyMiwxNTUsMTAzLCA0OSwgNzksIDU3LAorICAgIDE3NSwgNDUsIDc0LCA1MywgNDIsIDYyLDE3MCwgNDYsMTA2LCA2MCwyMTgsIDU1LDE4NiwgNTIsMTg2LCA2MywKKyAgICAxOTgsIDQ2LDEwMiwgODksMjA0LDIxMywgODgsMTU3LCA4OCwgNzMsMTA4LCA3NSwgMjgsIDU3LCA0NiwgNDIsCisgICAgMTc0LCA1NCwxMTAsMTA4LDE5MCwyMjMsMjUyLDIzNywyNDMsMTM1LDIyNiwxNTcsMjI2LCAxMSwyMjcsMTIzLAorICAgICAyMywxNTIsIDQ3LDIwMCwgOTMsMTEyLDEyMSwxNjEsMjA2LDE5NCwyNDQsMTMzLDE2NywgMjIsMTY5LCA0NiwKKyAgICAgMTgsIDQ0LCA1OCwxNTAsIDY0LCA3NiwxMzYsIDc4LCA1NiwxNDgsMjQwLCA2NSwgMTYsIDQyLDE2OCwgMjIsCisgICAgMTQwLCAzNywyNDIsIDE5LDExOSwgMzcsMTQyLCAxMCwxMjEsMTk0LCAyOSwxOTQsMTAzLCAzNCwgNDcsMjA5LAorICAgICA1NCwyMDksMTM2LDIxNiwgNjcsIDkyLCA0MiwgMzAsIDc4LDI0MiwgNzIsIDQyLCA3NywxMjIsMTQ2LDIzNiwKKyAgICAxNDUsMTg4LCA1MywxMjEsIDM2LDE5NywgNTEsMTY1LCA0NCwyMjksMTg1LDEzMiwgMzksMTY5LDE0NCwxODgsCisgICAgIDc2LCAxMywgNzYsMjIxLDE1NSwgNTgsMTU4LCAyMiwxNTQsMTE4LCAzMiwxMDksIDUwLCA2MSwgNTgsMTg5LAorICAgICA0OSwxMzEsMTQ2LDE0NSwxNDQsMTEzLCA2NiwxNzAsIDMzLCA3NywxNDcsMTgyLDEwMywyMzQsMTAzLDIzMCwKKyAgICAxMDIsMTE4LDIwMywxNzIsMTAxLDEzMywxNzgsMjU0LDE5NywxMTAsMTM5LDE4MywgNDcsIDMwLDE0OSwgIDcsCisgICAgMjAxLDEwNywxNzksMTQ0LDE3MiwgIDUsIDg5LCA0NSwgMTAsMTgyLCA2NiwxNjYsMjMyLCA4NCwgOTAsIDQwLAorICAgIDIxNSwgNDIsICA3LDE3OCwxMDMsMTAxLCA4NywxMDIsMTkxLDIwNSwxMzcsMjAyLCA1NywxNTAsMTcxLDE1OCwKKyAgICAgNDMsMjA1LDIzNywyMDQsMTc5LDIwMiwyMTksMTQ0LCA1NSwxNTYsMjM5LDE1OSwyNTUsMjM3LCAxOCwxOTQsCisgICAgIDE4LDIyNSwxNDYsMTgyLDE2NSwxMzQsIDc1LCA4NywgNDUsIDI5LCA4OCwyMzAsMTg5LDE3MiwxMDYsIDU3LAorICAgIDE3OCwgNjAsMTEzLDEyMSwyMTksIDEwLDIyNywgMjEsICA1LCA0MywxMzQsIDg2LCAgNiwxNzIsIDYwLDE4NCwKKyAgICAxMzgsMTgyLCA0MiwxMDksMjEzLCA3OSwxNzEsMjM3LCA4NywxNTEsMTc0LDEyNiwxODksIDM4LDEyMiwgNzcsCisgICAgMTA3LDEyOSwgOTQsMTkzLDIwMiwxMzAsMTkzLDE4MSwgIDEsMTA3LDIzNSwgMTEsIDg1LCAxMCwyMjksMTMzLAorICAgIDEyNSwyMzUsMjIwLDIxNSwyMzcsIDkzLCA3OSwgODgsIDQ3LCA4OSwyMjMsMTgxLCA5NywyNTAsMTM0LDE1NywKKyAgICAgMjcsIDYyLCAyMSwxMzcsMTM4LDE3NCwgMjAsMjE5LCAyMywxNTEsIDIxLDEyNywyMTYsIDQwLDIyMCwxMjAsCisgICAgMjI5LCAyNywxMzUsMTExLDIwMiwxOTEsMTUzLDIyMCwxNDgsMTgwLDE2OSwxNzEsMTk2LDE4NSwxMDAsMjA3LAorICAgIDEwMiwyMTAsMTAyLDIzMywyMzAsMjIyLCA0NSwxNTgsIDkxLCAxNCwxNTAsMTcwLDE1MSwyMzAsMTUxLCAxNCwKKyAgICAxMTAsIDEzLDIxNywyMTgsMTgwLCAxMywyMjMsIDg2LDE4MCwyMzcsMjQ1LDI0NiwgNjksMjE5LCA0NywxNTEsCisgICAgMjA1LCA0MCwyMTksMTg3LDEzMSwxODIsIDY3LDE4NSwxNjMsMTkxLCA2MCwxODQsMTg4LDEwMSwxNjcsMjAxLAorICAgIDIwNiwyMDUsIDU5LCA2MywgODQsMTY0LCA4NCwyNDQsIDg0LDI1MCwgODQsIDU0LDIzOCwyMTAsMjIxLDE4MSwKKyAgICAgOTcsMjE1LDI0OCwxMTAsMjA5LDIzOCwgMjcsMTIzLDE4OCwyNDYsIDUyLDIzNiwyMTMsMjE5LCA5MSwxODgsCisgICAgMjQ3LDI1MywgNjIsMjAxLDE5MCwyMTksIDg1LCAgMSwgODUsIDc3LDIxMywxMDIsMjEzLDEwMSwyNTEsIDczLAorICAgIDI1MSwxNzksMjQ3LCA2MywxNzQsMTM3LDE3MCwyMzMsMjQ4LDE1MCwyNTEsMTA5LCA5MywxNzMsIDc4LDEwOSwKKyAgICAxMTMsMjM3LDE5OSwgIDMsMjEwLCAgMywyNTMsICA3LCAzNSwgMTQsMTgyLDIxNSwxODUsMjEyLDIxMywgMjksCisgICAgMjEwLCA2MSwgODQsIDgyLDE0MywyMTQsIDQzLDIzNSwgNzEsIDE0LDE5OSwgMzEsMTkwLDI1NCwxNTcsMjM5LAorICAgIDExOSwgNDUsIDEzLCA1NCwgMTMsIDg1LDE0MSwxNTYsMTk4LDIyNiwgMzUsMTEyLCA2OCwxMjEsMjI4LDIzMywKKyAgICAyNDcsICA5LDIyMywyNDcsIDMwLCAxMywgNTgsMjE4LDExOCwxNDAsMTIzLDE3MiwyMjUsICA3LDIxMSwgMzEsCisgICAgMTE4LCAyOSwxMDMsIDI5LCA0NywxMDYsIDY2LDE1NCwyNDIsMTU0LCA3MCwxNTUsIDgzLDE1NCwyNTEsIDkxLAorICAgICA5OCwgOTEsMTg2LCA3OSwyMDQsIDYyLDIwOSwyMTQsMjM0LDIyMiwxMjIsMjUyLCA3MSwyMTksIDMxLCAxNSwKKyAgICAxNTYsIDUyLCA2MCwgODksMTIxLCA3NCwyNDMsIDg0LDIwMSwxMDUsMjE4LDIzMywxMzAsMjExLDE0NywxMDMsCisgICAgMjQyLDIwNywxNDAsMTU3LDE0OSwxNTcsMTI1LDEyNiwgNDYsMjQ5LDIyMCwgOTYsMjE5LDE2MiwxODIsMTIzLAorICAgIDIzMSwgOTksMjA2LDIyMywxMDYsIDE1LDExMSwyMzksMTg2LCAxNiwxMTYsMjI1LDIxMCwgNjksMjU1LDEzOSwKKyAgICAyMzEsIDU5LDE4OCwgNTksMjA2LCA5MiwyNDIsMTg0LDExNiwyNDIsMTc4LDIxOSwyMjksIDE5LCA4NywxODQsCisgICAgIDg3LDE1NCwxNzUsIDU4LCA5NSwxMDksMjM0LDExNiwyMzQsIDYwLDI1NCwxNDcsMjExLCA3OSwxOTksMTg3LAorICAgIDE1NiwxODcsMTU0LDE3NCwxODUsIDkyLDEwNywxODUsMjM4LDEyMiwxODksMTgxLDEyMywxMDIsMjQ3LDIzMywKKyAgICAgMjcsMTU4LCA1NSwyMDYsMjIxLDI0NCwxODksMTIxLDI0MSwgMjIsMjU1LDIxNCwyMTMsMTU4LCA1NywgNjEsCisgICAgMjIxLDE4OSwyNDMsMTIyLDExMSwyNDcsMTk3LDI0NywyNDUsMjIzLCAyMiwyMjEsMTI2LDExNCwgMzksMjUzLAorICAgIDIwNiwyMDMsMTg3LDIxNywxMTksIDM5LDIzOCwxNzMsMTg4LCA3OSwxODgsIDk1LDI0NCwgNjQsMjM3LCA2NSwKKyAgICAyMTcsIDY3LDIyMSwxMzUsMjEzLCA2MywgOTEsMjU0LDIyMCwyMTYsMjM5LDIyMCwxMjcsMTA2LDE5MiwxMTksCisgICAgMTYwLDI0MywyMDksMjIwLCA3MSwyNDcsICA2LDEzMywxMzEsMjA3LDI1NCwxNDUsMjQ1LDE0MywgMTUsIDY3LAorICAgICAgNSwxNDMsMTUzLDE0MywyMDMsMTM0LCAxMywxMzQsMjM1LDE1OCwgNTYsIDYyLCA1NywgNTcsMjI2LCA2MywKKyAgICAxMTQsMjUzLDIzMywyNTIsMTY3LCA2NywyMDcsMTAwLDIwNywgMzgsMTU4LCAyMywyNTQsMTYyLDI1NCwyMDMsCisgICAgMTc0LCAyMywgMjIsIDQ3LDEyNiwyNDgsMjEzLDIzNSwyMTUsMjA2LDIwOSwxNTIsMjA5LDE2MSwxNTEsMjQyLAorICAgIDE1MSwxNDcsMTkxLDEwOSwxMjQsMTY1LDI1MywyMzQsMTkyLDIzNSwgMjUsMTc1LDIxOSwxOTgsMTk0LDE5OCwKKyAgICAgMzAsMTkwLDIwMSwxMjAsIDUxLCA0OSwgOTQsMjQ0LCA4NiwyNTEsMjM3LDE5MywxMTksMjIwLDExOSwgMjksCisgICAgMjM5LDE2MywyMjMsIDE1LCA3OSwyMjgsMTI0LCAzMiwxMjcsIDQwLDI1NSwxMDQsMjQ5LDE3NywyNDUsIDgzLAorICAgIDIwOCwxNjcsMjUxLDE0NywgMjUsMTQ3LDE0NywyNTUsICA0LCAgMywxNTIsMjQzLDI1MiwgOTksIDUxLCA0NSwKKyAgICAyMTksICAwLCAgMCwgIDAsIDMyLCA5OSwgNzIsIDgyLCA3NywgIDAsICAwLDEyMiwgMzcsICAwLCAgMCwxMjgsCisgICAgMTMxLCAgMCwgIDAsMjQ5LDI1NSwgIDAsICAwLDEyOCwyMzMsICAwLCAgMCwxMTcsIDQ4LCAgMCwgIDAsMjM0LAorICAgICA5NiwgIDAsICAwLCA1OCwxNTIsICAwLCAgMCwgMjMsMTExLDE0NiwgOTUsMTk3LCA3MCwgIDAsICAwLCAgMSwKKyAgICAgNTAsIDczLCA2OCwgNjUsIDg0LDEyMCwyMTgsMjM2LDIyMCwxNjEsIDc4LDE5NSwgODAsIDIwLDEyOCwgOTcsCisgICAgIDcwLCA0OCwgNDQsIDcyLCA1MCwgIDUsIDEwLDEzMCwgIDYsIDc1LDE5MiwxNjIsMTIwLDEzMiwgNjIsMTkzLAorICAgICA0NCwgNDAsIDEyLCAxNSwgNjQsMTc2LDIyNCwgNzMsIDYxLDEwNCwgNDQsICA0LCAxMSwxNTQsIDQ4LCA1MywKKyAgICAgMTIsIDM2LCA1NiwxOTQsMjI4LCA2OSwyMjAsIDk0LDE5MywgNzIsIDg5LCA0MSwgOTEsIDkwLDE0NiwyMzksCisgICAgIDUxLCAzOSwgODksMTY3LCA3OCwyNTQsMjIwLDExMCwyMzAsMTE4LCA2NiwgIDgsIDMzLDEzMiwgNTcsMTA0LAorICAgIDE2NSwxMjEsIDQzLDE2MCwyMDUsIDIyLDE5OCwgNjMsMjE2LDIxNywyMDUsMjQzLDE5MywgODMsMjE3LDIxNSwKKyAgICAgODcsIDk0LDIyNywyMjAsMjE4LDE4MCwgNTgsMjM0LDE4NywxMjcsMTM2LDI0MywxODUsIDU1LDI1NCwyMjgsCisgICAgMjQ2LCAzOCwyMDMsMjE0LDIxNCwxMjcsICA4LDI0NCwxNzEsMTk3LCA2MCwyMDYsMTMxLDE2NSwgNTYsIDg3LAorICAgICA0NywxMzksICA3LDE5OSwxNTAsIDc2LDEyNSwyNTEsIDY5LCA3MSwxOTUsMTcxLCA1NiwgNzksMjIzLDIyNywKKyAgICAgMjgsMTAxLDE5MSwxMjQsMTk3LDI0NywyNTEsIDY5LDE1MiwgNDcsMTUwLDIwMiwyNDQsMTY1LDE3NCwgODIsCisgICAgMTAzLDE0OSwxMjcsMTMxLDE2NiwgODcsMjQ5LDE5OCwxMzcsIDM3LCA1MCwxMjMsMTY5LDE3OSwyMTIsMjIxLAorICAgIDE5NiwgNjQsMTg3LCAyMywxNTAsIDcwLCAgMywgMzksMTA2LDIxMywgNjQsMTYxLCAgOSwyMDMsMTIzLCAgMiwKKyAgICAyMjksIDk1LCAxNywgNDAsICAyLCAgNSwxMjksIDM0LCA4MCwgMTYsIDQwLCAgOCwgMjAsMTI5LDEzMCwgNjQsCisgICAgIDE3LCA0MCwgIDgsIDIwLCAgNCwxMzgsIDY0LCA2NSwxNjAsICA4LCAyMCwgIDQsIDEwLCAgMiwgNjksMTYwLAorICAgICAzMiwgODAsICA0LCAxMCwgMTMsMjUxLDIwMCwgIDQsIDc0LDEzOSwgMTMsMTIzLCAyMSwgIDMsMTI1LCA2MCwKKyAgICAxNDAsMjQzLDIzNywyMTgsMjEwLDE1MiwxODksMjEyLCA4OSwyMzQsMTc0LDI0MiwgIDksMTIyLDExOCwgOTQsCisgICAgMTE4LDI0NCwxOTQsMjQ0LCA5NCwyMzMsMTY5LDE3OSwyMzksIDM4LDIyMCwyMDUsMTQ4LCA0NiwxMTksIDU4LAorICAgICA0MiwyMzgsMTA0LDIxOCwgMzAsMTk2LDIxNywyMDUsIDQ1LDE1MSwxOTEsMTM1LDEyMSwgODcsMjIwLDIwOSwKKyAgICAgNTIsIDQyLCA2MSwgIDAsIDU5LDIzOCwgIDcsMTk3LDE5MSwxMjAsMTY4LDIzMywgMTksICAwLCAgMCwyNTUsCisgICAgMjU1LCAgMywgIDAsICA2LCA1MiwgNjAsMTExLCA0NCwgNjEsIDc0LDE1MywgIDAsICAwLCAgMCwgIDAsIDczLAorICAgICA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfcG93ZXJfcG5nWzM3ODJdID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMCwgNTgsICAwLCAgMCwgIDAsIDY3LCAxNiwgIDYsICAwLCAgMCwgIDAsMTU3LCAgNiwyMDIsCisgICAgIDk4LCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsIDEwLCA3OSwxMDUsIDY3LCA2NywgODAsIDgwLDEwNCwKKyAgICAxMTEsMTE2LDExMSwxMTUsMTA0LDExMSwxMTIsIDMyLCA3MywgNjcsIDY3LCAzMiwxMTIsMTE0LDExMSwxMDIsCisgICAgMTA1LDEwOCwxMDEsICAwLCAgMCwxMjAsMjE4LDE1NywgODMsMTAzLCA4NCwgODMsMjMzLCAyMiwgNjEsMjQ3LAorICAgIDIyMiwyNDQsIDY2LCA3NSwxMzYsMTI4LDE0OCwgNzUsMTExLCA4MiwgMjEsICA4LCAzMiwgODIsIDY2LDEzOSwKKyAgICAxMjgsIDIwLDE0NSwgMzgsIDQyLCAzMywgIDksIDE2LCA3NCwxMzYsIDMzLDE2MSwyMTcsIDIxLCA4MSwxOTMsCisgICAgIDE3LCA2OSwgNjksICA0LCAyNywyMDAsMTYwLDEzNiwgIDMsMTQyLDE0MiwxMjgsMTQwLCAyMSwgODEsIDQ0LAorICAgICAxMiwxMzgsIDEwLDIxNiwgIDcsMjI4LCAzMywxNjIsMTQyLDEzMSwxNjMsMTM2LDEzOCwyMDIsMjUxLDIyNSwKKyAgICAxMjMsMTYzLDEwNywyMTQsMTg4LDI0NywyMzAsMjA1LDI1NCwxODEsMjE1LCA2MiwyMzEsMTcyLDI0MywxNTcsCisgICAgMTc5LDIwNywgIDcsMTkyLCAgOCwgMTIsMTUwLCA3MiwgNTEsIDgxLCA1MywxMjgsIDEyLDE2OSwgNjYsIDMwLAorICAgICAxNywyMjQsMTMxLDE5OSwxOTYsMTk4LDIyNSwyMjgsIDQ2LCA2NCwxMjksIDEwLCAzNiwxMTIsICAwLCAxNiwKKyAgICAgIDgsMTc5LDEwMCwgMzMsMTE1LDI1MywgMzUsICAxLCAgMCwyNDgsMTI2LCA2MCwgNjAsIDQzLCAzNCwxOTIsCisgICAgICA3LDE5MCwgIDAsICAxLDEyMCwyMTEsIDExLCAgOCwgIDAsMTkyLCA3NywxNTUsMTkyLCA0OCwgMjgsMTM1LAorICAgIDI1NSwgMTUsMjM0LCA2NiwxNTMsIDkyLCAgMSwxMjgsMTMyLCAgMSwxOTIsMTE2LDE0NSwgNTYsIDc1LCAgOCwKKyAgICAxMjgsIDIwLCAgMCwgNjQsMTIyLDE0MiwgNjYsMTY2LCAgMCwgNjQsIDcwLCAgMSwxMjgsMTU3LDE1MiwgMzgsCisgICAgIDgzLCAgMCwxNjAsICA0LCAgMCwgOTYsMjAzLCA5OSwgOTgsMjI3LCAgMCwgODAsIDQ1LCAgMCwgOTYsIDM5LAorICAgIDEyNywyMzAsMjExLCAgMCwxMjgsMTU3LDI0OCwxNTMsMTIzLCAgMSwgIDAsIDkxLDE0OCwgMzMsIDIxLCAgMSwKKyAgICAxNjAsMTQ1LCAgMCwgMzIsIDE5LDEwMSwxMzYsIDY4LCAgMCwxMDQsIDU5LCAgMCwxNzIsMjA3LCA4NiwxMzgsCisgICAgIDY5LCAgMCwgODgsIDQ4LCAgMCwgMjAsMTAyLCA3NSwxOTYsIDU3LCAgMCwyMTYsIDQ1LCAgMCwgNDgsIDczLAorICAgICA4NywxMDIsIDcyLCAgMCwxNzYsMTgzLCAgMCwxOTIsMjA2LCAxNiwgMTEsMTc4LCAgMCwgIDgsIDEyLCAgMCwKKyAgICAgNDgsIDgxLDEzNiwxMzMsIDQxLCAgMCwgIDQsMTIzLCAgMCwgOTYsMjAwLCAzNSwgMzUsMTIwLCAgMCwxMzIsCisgICAgMTUzLCAgMCwgMjAsIDcwLDI0MiwgODcsIDYwLDI0MSwgNDMsMTc0LCAxNiwyMzEsIDQyLCAgMCwgIDAsMTIwLAorICAgIDE1MywxNzgsIDYwLDE4NSwgMzYsIDU3LCA2OSwxMjksIDkxLCAgOCwgNDUsMTEzLCAgNywgODcsIDg3LCA0NiwKKyAgICAgMzAsIDQwLDIwNiwgNzMsIDIzLCA0MywgMjAsIDU0LCA5NywgIDIsIDk3LDE1NCwgNjQsIDQ2LDE5NCwxMjEsCisgICAgMTUzLCAyNSwgNTAsMTI5LCA1MiwgMTUsMjI0LDI0MywyMDQsICAwLCAgMCwxNjAsMTQ1LCAyMSwgMTcsMjI0LAorICAgIDEzMSwyNDMsMjUzLDEyMCwyMDYsIDE0LDE3NCwyMDYsMjA2LCA1NCwxNDIsMTgyLCAxNCwgOTUsIDQ1LDIzNCwKKyAgICAxOTEsICA2LDI1NSwgMzQsIDk4LCA5OCwyMjcsMjU0LDIyOSwyMDcsMTcxLDExMiwgNjQsICAwLCAgMCwyMjUsCisgICAgMTE2LDEyNiwyMDksMjU0LCA0NCwgNDcsMTc5LCAyNiwxMjgsIDU5LCAgNiwxMjgsMTA5LDI1NCwxNjIsIDM3LAorICAgIDIzOCwgIDQsMTA0LCA5NCwgMTEsMTYwLDExNywyNDcsMTM5LDEwMiwxNzgsIDE1LCA2NCwxODEsICAwLDE2MCwKKyAgICAyMzMsMjE4LCA4NywyNDMsMTEyLDI0OCwxMjYsIDYwLCA2MCwgNjksMTYxLDE0NCwxODUsMjE3LDIxNywyMjksCisgICAgMjI4LDIyOCwyMTYsIDc0LDE5NiwgNjYsIDkxLCA5NywyMDIsIDg3LDEyNSwyNTQsMTAzLDE5NCwgOTUsMTkyLAorICAgICA4NywyNTMsMTA4LDI0OSwxMjYsIDYwLDI1MiwyNDcsMjQ1LDIyNCwxOTAsMjI2LCAzNiwxMjksIDUwLCA5MywKKyAgICAxMjksIDcxLCAgNCwyNDgsMjI0LDE5NCwyMDQsMjQ0LCA3NiwxNjUsIDI4LDIwNywxNDYsICA5LDEzMiwgOTgsCisgICAgMjIwLDIzMCwxNDMsIDcxLDI1MiwxODMsIDExLDI1NSwyNTIsIDI5LDIxMSwgMzQsMTk2LCA3MywgOTgsMTg1LAorICAgICA4OCwgNDIsIDIwLDIyNywgODEsIDE4LDExMywxNDIsIDY4LDE1NCwxNDAsMjQzLCA1MCwxNjUsIDM0LDEzNywKKyAgICAgNjYsMTQ2LCA0MSwxOTcsIDM3LDIxMCwyNTUsMTAwLDIyNiwyMjMsIDQ0LDI1MSwgIDMsIDYyLDIyMywgNTMsCisgICAgICAwLDE3NiwxMDYsIDYyLCAgMSwxMjMsMTQ1LCA0NSwxNjgsIDkzLCA5OSwgIDMsMjQ2LCA3NSwgMzksIDE2LAorICAgICA4OCwxMTYsMTkyLDIyNiwyNDcsICAwLCAgMCwyNDIsMTg3LDExMSwxOTMsMjEyLCA0MCwgIDgsICAzLDEyOCwKKyAgICAxMDQsMTMxLDIyNSwyMDcsMTE5LDI1NSwyMzksIDYzLDI1MywgNzEsMTYwLCAzNywgIDAsMTI4LDEwMiwgNzMsCisgICAgMTQ2LDExMywgIDAsICAwLCA5NCwgNjgsIDM2LCA0NiwgODQsMjAyLDE3OSwgNjMsMTk5LCAgOCwgIDAsICAwLAorICAgICA2OCwxNjAsMTI5LCA0MiwxNzYsIDY1LCAyNywyNDQsMTkzLCAyNCwgNDQsMTkyLCAgNiwgMjgsMTkzLCAgNSwKKyAgICAyMjAsMTkzLCAxMSwyNTIsIDk2LCA1NCwxMzIsIDY2LCAzNiwxOTYsMTk0LCA2NiwgMTYsIDY2LCAxMCwxMDAsCisgICAgMTI4LCAyOCwxMTQsIDk2LCA0MSwxNzIsMTMwLCA2NiwgNDAsMTM0LDIwNSwxNzYsIDI5LCA0MiwgOTYsIDQ3LAorICAgIDIxMiwgNjQsIDI5LCA1MiwxOTIsIDgxLDEwNCwxMzQsMTQ3LDExMiwgMTQsIDQ2LDE5NCwgODUsMTg0LCAxNCwKKyAgICAgNjEsMTEyLCAxNSwyNTAsIDk3LCAgOCwxNTgsMTkzLCA0MCwxODgsMTI5LCAgOSwgIDQsIDY1LDIwMCwgIDgsCisgICAgIDE5LCA5NywgMzMsMjE4LDEzNiwgIDEsIDk4LDEzOCwgODgsIDM1LDE0MiwgIDgsIDIzLDE1MywxMzMsMjQ4LAorICAgICAzMywxOTMsIDcyLCAgNCwgMTgsMTM5LCAzNiwgMzIsMjAxLDEzNiwgMjAsIDgxLCAzNCwgNzUsMTQ1LCA1MywKKyAgICAgNzIsIDQ5LCA4MiwxMzgsIDg0LCAzMiwgODUsIDcyLCAyOSwyNDIsIDYxLDExNCwgIDIsIDU3LDEzNSwgOTIsCisgICAgIDcwLDE4NiwxNDUsIDU5LDIwMCwgIDAsIDUwLDEzMCwyNTIsMTM0LDE4OCwgNzEsIDQ5LDE0OCwxMjksMTc4LAorICAgICA4MSwgNjEsMjEyLCAxMiwxODEsIDY3LDE4NSwxNjgsIDU1LCAyNiwxMzIsIDcwLDE2MiwgMTEsMjA4LDEwMCwKKyAgICAxMTYsIDQ5LDE1NCwxNDMsIDIyLDE2MCwxNTUsMjA4LDExNCwxODAsIDI2LCA2MSwxNDAsIDU0LDE2MSwyMzEsCisgICAgMjA4LDE3MSwxMDQsIDE1LDIxOCwxNDMsIDYyLCA2NywxOTksIDQ4LDE5MiwyMzIsIDI0LCAgNywgNTEsMTk2LAorICAgIDEwOCwgNDgsIDQ2LDE5OCwxOTUsIDY2LDE3NywgNTYsIDQ0LCAgOSwxNDcsIDk5LDIwMywxNzcsIDM0LDE3MiwKKyAgICAgMTIsMTcxLDE5OCwgMjYsMTc2LCA4NiwxNzIsICAzLDE4NywxMzcsMjQ1LCA5OSwyMDcsMTc3LDExOSwgIDQsCisgICAgIDE4LDEyOSwgNjksMTkyLCAgOSwgNTQsICA0LDExOSwgNjYsIDMyLCA5NywgMzAsIDY1LCA3MiwgODgsIDc2LAorICAgICA4OCwgNzgsMjE2LCA3MiwxNjgsIDMyLCAyOCwgMzYsIDUyLCAxNywyMTgsICA5LCA1NSwgIDksICAzLDEzMiwKKyAgICAgODEsMTk0LCAzOSwgMzQsMTQ3LDE2OCwgNzUsMTgwLCAzOCwxODYsIDE3LDI0OSwxOTYsIDI0LCA5OCwgNTAsCisgICAgIDQ5LDEzNSwgODgsIDcyLCA0NCwgMzUsMjE0LCAxOCwxNDMsIDE5LCA0NywgMTYsMTIzLDEzNiwgNjcsMTk2LAorICAgICA1NSwgMzYsIDE4LDEzNywgNjcsIDUwLCAzOSwxODUsMTQ0LCAgMiwgNzMsMTc3LDE2NCwgODQsMjEwLCAxOCwKKyAgICAyMTAsIDcwLDIxMCwxMTAsIDgyLCAzNSwyMzMsIDQ0LDE2OSwxNTUsIDUyLCA3MiwgMjYsIDM1LDE0NywyMDEsCisgICAgMjE4LDEwMCwxMDcsMTc4LCAgNywgNTcsMTQ4LCA0NCwgMzIsIDQzLDIwMCwxMzMsMjI4LDE1NywyMjgsMTk1LAorICAgIDIyOCwgNTEsMjI4LCAyNywyMjgsIDMzLDI0MiwgOTEsIDEwLDE1NywgOTgsIDY0LDExMywxNjQsMjQ4LCA4MywKKyAgICAyMjYsIDQwLCA4MiwyMDIsMTA2LCA3NCwgMjUsMjI5LCAxNiwyMjksIDUyLDIyOSwgIDYsMTAxLDE1MiwgNTAsCisgICAgIDY1LCA4NSwxNjMsMTU0LCA4MiwyMjEsMTY4LDE2MSwgODQsIDE3LCA1MywxNDMsIDkwLCA2NiwxNzMsMTYxLAorICAgIDE4MiwgODIsMTc1LCA4MSwxMzUsMTY4LCAxOSwgNTIsMTE3LDE1NCwgNTcsMjA1LDEzMSwgMjIsIDczLCA3NSwKKyAgICAxNjUsMTczLDE2MiwxNDksMjExLCAyNiwxMDQsIDIzLDEwNCwyNDcsMTA1LDE3NSwyMzIsMTE2LDE4NiwgMTcsCisgICAgMjIxLDE0OSwgMzAsIDc4LDE1MSwyMDgsIDg3LDIxMCwyMDMsMjMzLCA3MSwyMzIsMTUxLDIzMiwgIDMsMjQ0LAorICAgIDExOSwgMTIsIDEzLDEzNCwgMjEsMTMxLDE5OSwxMzYsMTAzLCA0MCwgMjUsMTU1LCAyNCwgIDcsIDI0LDEwMywKKyAgICAgMjUsMTE5LCAyNCwxNzUsMTUyLCA3NiwxNjYsIDI1LDIxMSwxMzksIDI1LDE5OSwgODQsIDQ4LCA1NSwgNDksCisgICAgMjM1LDE1MiwyMzEsMTUzLCAxNSwxNTMsMTExLCA4NSwgODgsIDQyLDE4MiwgNDIsMTI0LCAyMSwxNDUsMjAyLAorICAgICAxMCwxNDksIDc0LDE0OSwgMzgsMTQ5LCAyNywgNDIsIDQ3LCA4NCwxNjksMTcwLDE2NiwxNzAsMjIyLDE3MCwKKyAgICAgMTEsIDg1LDI0MywgODUsMjAzLCA4NCwxNDMsMTY5LCA5NCwgODMsMTI1LDE3NCwgNzAsIDg1LCA1MSwgODMsCisgICAgMjI3LDE2OSwgIDksMjEyLDE1MCwxNzEsIDg1LDE3MCwxNTcsIDgwLDIzNSwgODMsIDI3LCA4MywxMDMsMTY5LAorICAgICA1OSwxNjgsMTM1LDE3MCwxMDMsMTY4LDExMSwgODQsIDYzLDE2NCwxMjYsIDg5LDI1MywxMzcsICA2LCA4OSwKKyAgICAxOTUsIDc2LDE5NSwgNzksIDY3LDE2NCwgODEsMTYwLDE3NywgOTUsMjI3LDE4OCwxOTgsIDMyLCAxMSwgOTksCisgICAgIDI1LDE3OSwxMjAsIDQ0LCAzMywxMDcsIDEzLDE3MSwxMzQsMTE3LDEyOSwgNTMsMTk2LCAzOCwxNzcsMjA1LAorICAgIDIxNywxMjQsMTE4LCA0MiwxODcsMTUyLDI1MywgMjksMTg3LDEzOSwgNjEsMTcwLDE2OSwxNjEsIDU3LCA2NywKKyAgICAgNTEsIDc0LCA1MSwgODcsMTc5LCA4MiwyNDMsMTQ4LDEwMiwgNjMsICA3LDIyNywxNTIsMTEzLDI0OCwxNTYsCisgICAgMTE2LCA3OCwgIDksMjMxLCA0MCwxNjcsMTUxLDI0MywxMjYsMTM4LDIyMiwgMjAsMjM5LCA0MSwyMjYsIDQxLAorICAgICAyNywxNjYsIDUyLCA3NiwxODUsIDQ5LDEwMSwgOTIsMTA3LDE3MCwxNTAsMTUxLDE1MCwgODgsMTcxLCA3MiwKKyAgICAxNzEsIDgxLDE3MSwgNzEsMjM1LDE4OSwgNTQsMTc0LDIzNywxNjcsMTU3LDE2NiwxODksIDY5LDE4NywgODksCisgICAgMjUxLDEyOSwgMTQsIDY1LDE5OSwgNzQsIDM5LCA5MiwgMzksIDcxLDEwMywxNDMsMjA2LCAgNSwxNTcsMjMxLAorICAgICA4MywyMTcsIDgzLDIyMSwxNjcsIDEwLDE2NywgMjIsIDc3LCA2MSwgNTgsMjQ1LDE3NCwgNDYsMTcwLDEwNywKKyAgICAxNjUsIDI3LDE2MSwxODcsIDY4LDExOSwxOTEsMTEwLDE2NywyMzgsMTUyLDE1OCwxOTAsIDk0LDEyOCwxNTgsCisgICAgIDc2LDExMSwxNjcsMjIyLDEyMSwxODksMjMxLDI1MCwgMjgsMTI1LCA0NywyNTMsIDg0LDI1MywxMDksMjUwLAorICAgIDE2NywyNDUsIDcxLCAxMiwgODgsICA2LDE3OSwgMTIsIDM2LCAgNiwyMTksIDEyLDIwNiwgMjQsIDYwLDE5NywKKyAgICAgNTMsMTEzLDExMSwgNjAsIDI5LCA0NywxOTksMjE5LDI0MSwgODEsIDY3LCA5MywxOTUsIDY0LCA2NywxNjUsCisgICAgIDk3LDE0OSwgOTcsMTUxLDIyNSwxMzIsMTQ1LDE4NSwyMDksIDYwLDE2MywyMTMsIDcwLDE0MSwgNzAsIDE1LAorICAgIDE0MCwxMDUsMTk4LCA5MiwyMjcsIDM2LDIyNywxMDksMTk4LDEwOSwxOTgsMTYzLCAzOCwgIDYsIDM4LCAzMywKKyAgICAgMzgsIDc1LCA3NywyMzQsIDc3LDIzOCwxNTQsIDgyLCA3NywxODUsMTY2LCA0MSwxNjYsIDU5LCA3NiwgNTksCisgICAgIDc2LDE5OSwyMDUsMjA0LDIwNSwxNjIsMjA1LDIxNCwxNTMsIDUzLDE1NSwgNjEsIDQ5LDIxNSwgNTAsMjMxLAorICAgIDE1NSwyMzEsMTU1LDIxNSwxNTUsMjIzLDE4MywgOTYsIDkwLDEyMCwgOTAsIDQ0LDE4MiwxNjgsMTgyLDE4NCwKKyAgICAxMDEsIDczLDE3OCwyMjgsIDkwLDE2NiwgODksMjM4LDE4MiwxODgsMTEwLDEzMywgOTAsIDU3LCA4OSwxNjUsCisgICAgIDg4LCA4NSwgOTAsIDkzLDE3OSwgNzAsMTczLDE1NywxNzMsIDM3LDIxNCwxODcsMTczLDE4NywxNjcsIDE3LAorICAgIDE2NywxODUsIDc4LDE0NywgNzgsMTcxLDE1OCwyMTQsMTAzLDE5NSwxNzYsMjQxLDE4MiwyMDEsMTgyLDE2OSwKKyAgICAxODMsIDI1LDE3NiwyMjksMjE2LCAgNiwyMTksMTc0LDE4MiwxMDksMTgyLDEyNSwgOTcsMTAzLCA5OCwgMjMsCisgICAgMTAzLDE4MywxOTcsMTc0LDE5NSwyMzgsMTQ3LDE4OSwxNDcsMTI1LDE4NiwxMjUsMTQxLDI1MywgNjEsICA3LAorICAgICAxMywxMzUsMjE3LCAxNCwxNzEsIDI5LCA5MCwgMjksMTI2LDExNSwxODAsMTE0LCAyMCwgNTgsIDg2LCA1OCwKKyAgICAyMjIsMTU0LDIwNiwxNTYsMjM4LCA2MywxMjUsMTk3LDI0NCwxNTAsMjMzLCA0NywxMDMsIDg4LDIwNywgMTYsCisgICAgMjA3LDIxNiwgNTEsMjI3LDE4MiwgMTksMjAzLCA0MSwxOTYsMTA1LDE1NywgODMsMTU1LDIxMSwgNzEsMTAzLAorICAgICAyMywxMDMsMTg1LDExNSwxMzEsMjQzLDEzNiwxMzksMTM3LCA3NSwxMzAsMjAzLCA0NiwxNTEsIDYyLCA0NiwKKyAgICAxNTUsIDI3LDE5OCwyMjEsMjAwLDE4OSwyMjgsIDc0LDExNiwyNDUsMTEzLCA5MywyMjUsMTIyLDIxMCwyNDUsCisgICAgMTU3LDE1NSwxNzksMTU1LDE5NCwyMzcsMTY4LDIxOSwxNzUsMjM4LCA1NCwyMzgsMTA1LDIzOCwxMzUsMjIwLAorICAgIDE1OSwyMDQsIDUyLDE1OSwgNDEsMTU4LCA4OSwgNTEsMTE1LDIwOCwxOTUsMjAwLCA2NywyMjQsIDgxLDIyOSwKKyAgICAyMDksIDYzLCAxMSwxNTksMTQ5LCA0OCwxMDcsMjIzLDE3MiwxMjYsIDc5LCA2NywgNzksMTI5LDEwMywxODEsCisgICAgMjMxLCAzNSwgNDcsIDk5LCA0NywxNDUsIDg3LDE3MywyMTUsMTc2LDE4MywxNjUsMTE5LDE3MCwyNDcsIDk3LAorICAgIDIzOSwgMjMsIDYyLDI0NiwgNjIsMTE0LDE1OSwyMjcsIDYyLDIyNywgNjAsIDU1LDIyMiwgNTAsMjIyLCA4OSwKKyAgICAgOTUsMjA0LCA1NSwxOTIsMTgzLDIwMCwxODMsMjAzLCA3OSwxOTUsMTExLDE1OCwgOTUsMTMzLDIyMywgNjcsCisgICAgMTI3LCAzNSwyNTUsMTAwLDI1NSwxMjIsMjU1LDIwOSwgIDAsMTY3LDEyOCwgMzcsICAxLDEwMywgIDMsMTM3LAorICAgIDEyOSwgNjUsMTI5LCA5MSwgIDIsMjUxLDI0OCwxMjIsMTI0LCAzMywxOTEsMTQyLCA2MywgNTgsMjE5LDEwMSwKKyAgICAyNDYsMTc4LDIxNywyMzcsIDY1LDE0MCwxNjAsMTg1LCA2NSwgMjEsIDY1LDE0MywxMzAsMTczLDEzMCwyMjksCisgICAgMTkzLDE3MywgMzMsMTA0LDIwMCwyMzYsMTQ0LDE3MywgMzMsMjQ3LDIzMSwxNTIsMjA2LDE0NSwyMDYsMTA1LAorICAgICAxNCwxMzMsIDgwLDEyNiwyMzIsMjE0LDIwOCwgIDcsIDk3LDIzMCwgOTcsMTM5LDE5NSwxMjYsIDEyLCAzOSwKKyAgICAxMzMsMTM1LDEzMywgODcsMTM0LCA2MywxNDIsMTEyLDEzNiwgODgsIDI2LDIwOSwgNDksMTUxLCA1MywxMTksCisgICAgMjA5LDIyMCwgNjcsMTE1LDIyMywgNjgsMjUwLCA2OCwxNTAsIDY4LDIyMiwxNTUsMTAzLCA0OSwgNzksIDU3LAorICAgIDE3NSwgNDUsIDc0LCA1MywgNDIsIDYyLDE3MCwgNDYsMTA2LCA2MCwyMTgsIDU1LDE4NiwgNTIsMTg2LCA2MywKKyAgICAxOTgsIDQ2LDEwMiwgODksMjA0LDIxMywgODgsMTU3LCA4OCwgNzMsMTA4LCA3NSwgMjgsIDU3LCA0NiwgNDIsCisgICAgMTc0LCA1NCwxMTAsMTA4LDE5MCwyMjMsMjUyLDIzNywyNDMsMTM1LDIyNiwxNTcsMjI2LCAxMSwyMjcsMTIzLAorICAgICAyMywxNTIsIDQ3LDIwMCwgOTMsMTEyLDEyMSwxNjEsMjA2LDE5NCwyNDQsMTMzLDE2NywgMjIsMTY5LCA0NiwKKyAgICAgMTgsIDQ0LCA1OCwxNTAsIDY0LCA3NiwxMzYsIDc4LCA1NiwxNDgsMjQwLCA2NSwgMTYsIDQyLDE2OCwgMjIsCisgICAgMTQwLCAzNywyNDIsIDE5LDExOSwgMzcsMTQyLCAxMCwxMjEsMTk0LCAyOSwxOTQsMTAzLCAzNCwgNDcsMjA5LAorICAgICA1NCwyMDksMTM2LDIxNiwgNjcsIDkyLCA0MiwgMzAsIDc4LDI0MiwgNzIsIDQyLCA3NywxMjIsMTQ2LDIzNiwKKyAgICAxNDUsMTg4LCA1MywxMjEsIDM2LDE5NywgNTEsMTY1LCA0NCwyMjksMTg1LDEzMiwgMzksMTY5LDE0NCwxODgsCisgICAgIDc2LCAxMywgNzYsMjIxLDE1NSwgNTgsMTU4LCAyMiwxNTQsMTE4LCAzMiwxMDksIDUwLCA2MSwgNTgsMTg5LAorICAgICA0OSwxMzEsMTQ2LDE0NSwxNDQsMTEzLCA2NiwxNzAsIDMzLCA3NywxNDcsMTgyLDEwMywyMzQsMTAzLDIzMCwKKyAgICAxMDIsMTE4LDIwMywxNzIsMTAxLDEzMywxNzgsMjU0LDE5NywxMTAsMTM5LDE4MywgNDcsIDMwLDE0OSwgIDcsCisgICAgMjAxLDEwNywxNzksMTQ0LDE3MiwgIDUsIDg5LCA0NSwgMTAsMTgyLCA2NiwxNjYsMjMyLCA4NCwgOTAsIDQwLAorICAgIDIxNSwgNDIsICA3LDE3OCwxMDMsMTAxLCA4NywxMDIsMTkxLDIwNSwxMzcsMjAyLCA1NywxNTAsMTcxLDE1OCwKKyAgICAgNDMsMjA1LDIzNywyMDQsMTc5LDIwMiwyMTksMTQ0LCA1NSwxNTYsMjM5LDE1OSwyNTUsMjM3LCAxOCwxOTQsCisgICAgIDE4LDIyNSwxNDYsMTgyLDE2NSwxMzQsIDc1LCA4NywgNDUsIDI5LCA4OCwyMzAsMTg5LDE3MiwxMDYsIDU3LAorICAgIDE3OCwgNjAsMTEzLDEyMSwyMTksIDEwLDIyNywgMjEsICA1LCA0MywxMzQsIDg2LCAgNiwxNzIsIDYwLDE4NCwKKyAgICAxMzgsMTgyLCA0MiwxMDksMjEzLCA3OSwxNzEsMjM3LCA4NywxNTEsMTc0LDEyNiwxODksIDM4LDEyMiwgNzcsCisgICAgMTA3LDEyOSwgOTQsMTkzLDIwMiwxMzAsMTkzLDE4MSwgIDEsMTA3LDIzNSwgMTEsIDg1LCAxMCwyMjksMTMzLAorICAgIDEyNSwyMzUsMjIwLDIxNSwyMzcsIDkzLCA3OSwgODgsIDQ3LCA4OSwyMjMsMTgxLCA5NywyNTAsMTM0LDE1NywKKyAgICAgMjcsIDYyLCAyMSwxMzcsMTM4LDE3NCwgMjAsMjE5LCAyMywxNTEsIDIxLDEyNywyMTYsIDQwLDIyMCwxMjAsCisgICAgMjI5LCAyNywxMzUsMTExLDIwMiwxOTEsMTUzLDIyMCwxNDgsMTgwLDE2OSwxNzEsMTk2LDE4NSwxMDAsMjA3LAorICAgIDEwMiwyMTAsMTAyLDIzMywyMzAsMjIyLCA0NSwxNTgsIDkxLCAxNCwxNTAsMTcwLDE1MSwyMzAsMTUxLCAxNCwKKyAgICAxMTAsIDEzLDIxNywyMTgsMTgwLCAxMywyMjMsIDg2LDE4MCwyMzcsMjQ1LDI0NiwgNjksMjE5LCA0NywxNTEsCisgICAgMjA1LCA0MCwyMTksMTg3LDEzMSwxODIsIDY3LDE4NSwxNjMsMTkxLCA2MCwxODQsMTg4LDEwMSwxNjcsMjAxLAorICAgIDIwNiwyMDUsIDU5LCA2MywgODQsMTY0LCA4NCwyNDQsIDg0LDI1MCwgODQsIDU0LDIzOCwyMTAsMjIxLDE4MSwKKyAgICAgOTcsMjE1LDI0OCwxMTAsMjA5LDIzOCwgMjcsMTIzLDE4OCwyNDYsIDUyLDIzNiwyMTMsMjE5LCA5MSwxODgsCisgICAgMjQ3LDI1MywgNjIsMjAxLDE5MCwyMTksIDg1LCAgMSwgODUsIDc3LDIxMywxMDIsMjEzLDEwMSwyNTEsIDczLAorICAgIDI1MSwxNzksMjQ3LCA2MywxNzQsMTM3LDE3MCwyMzMsMjQ4LDE1MCwyNTEsMTA5LCA5MywxNzMsIDc4LDEwOSwKKyAgICAxMTMsMjM3LDE5OSwgIDMsMjEwLCAgMywyNTMsICA3LCAzNSwgMTQsMTgyLDIxNSwxODUsMjEyLDIxMywgMjksCisgICAgMjEwLCA2MSwgODQsIDgyLDE0MywyMTQsIDQzLDIzNSwgNzEsIDE0LDE5OSwgMzEsMTkwLDI1NCwxNTcsMjM5LAorICAgIDExOSwgNDUsIDEzLCA1NCwgMTMsIDg1LDE0MSwxNTYsMTk4LDIyNiwgMzUsMTEyLCA2OCwxMjEsMjI4LDIzMywKKyAgICAyNDcsICA5LDIyMywyNDcsIDMwLCAxMywgNTgsMjE4LDExOCwxNDAsMTIzLDE3MiwyMjUsICA3LDIxMSwgMzEsCisgICAgMTE4LCAyOSwxMDMsIDI5LCA0NywxMDYsIDY2LDE1NCwyNDIsMTU0LCA3MCwxNTUsIDgzLDE1NCwyNTEsIDkxLAorICAgICA5OCwgOTEsMTg2LCA3OSwyMDQsIDYyLDIwOSwyMTQsMjM0LDIyMiwxMjIsMjUyLCA3MSwyMTksIDMxLCAxNSwKKyAgICAxNTYsIDUyLCA2MCwgODksMTIxLCA3NCwyNDMsIDg0LDIwMSwxMDUsMjE4LDIzMywxMzAsMjExLDE0NywxMDMsCisgICAgMjQyLDIwNywxNDAsMTU3LDE0OSwxNTcsMTI1LDEyNiwgNDYsMjQ5LDIyMCwgOTYsMjE5LDE2MiwxODIsMTIzLAorICAgIDIzMSwgOTksMjA2LDIyMywxMDYsIDE1LDExMSwyMzksMTg2LCAxNiwxMTYsMjI1LDIxMCwgNjksMjU1LDEzOSwKKyAgICAyMzEsIDU5LDE4OCwgNTksMjA2LCA5MiwyNDIsMTg0LDExNiwyNDIsMTc4LDIxOSwyMjksIDE5LCA4NywxODQsCisgICAgIDg3LDE1NCwxNzUsIDU4LCA5NSwxMDksMjM0LDExNiwyMzQsIDYwLDI1NCwxNDcsMjExLCA3OSwxOTksMTg3LAorICAgIDE1NiwxODcsMTU0LDE3NCwxODUsIDkyLDEwNywxODUsMjM4LDEyMiwxODksMTgxLDEyMywxMDIsMjQ3LDIzMywKKyAgICAgMjcsMTU4LCA1NSwyMDYsMjIxLDI0NCwxODksMTIxLDI0MSwgMjIsMjU1LDIxNCwyMTMsMTU4LCA1NywgNjEsCisgICAgMjIxLDE4OSwyNDMsMTIyLDExMSwyNDcsMTk3LDI0NywyNDUsMjIzLCAyMiwyMjEsMTI2LDExNCwgMzksMjUzLAorICAgIDIwNiwyMDMsMTg3LDIxNywxMTksIDM5LDIzOCwxNzMsMTg4LCA3OSwxODgsIDk1LDI0NCwgNjQsMjM3LCA2NSwKKyAgICAyMTcsIDY3LDIyMSwxMzUsMjEzLCA2MywgOTEsMjU0LDIyMCwyMTYsMjM5LDIyMCwxMjcsMTA2LDE5MiwxMTksCisgICAgMTYwLDI0MywyMDksMjIwLCA3MSwyNDcsICA2LDEzMywxMzEsMjA3LDI1NCwxNDUsMjQ1LDE0MywgMTUsIDY3LAorICAgICAgNSwxNDMsMTUzLDE0MywyMDMsMTM0LCAxMywxMzQsMjM1LDE1OCwgNTYsIDYyLCA1NywgNTcsMjI2LCA2MywKKyAgICAxMTQsMjUzLDIzMywyNTIsMTY3LCA2NywyMDcsMTAwLDIwNywgMzgsMTU4LCAyMywyNTQsMTYyLDI1NCwyMDMsCisgICAgMTc0LCAyMywgMjIsIDQ3LDEyNiwyNDgsMjEzLDIzNSwyMTUsMjA2LDIwOSwxNTIsMjA5LDE2MSwxNTEsMjQyLAorICAgIDE1MSwxNDcsMTkxLDEwOSwxMjQsMTY1LDI1MywyMzQsMTkyLDIzNSwgMjUsMTc1LDIxOSwxOTgsMTk0LDE5OCwKKyAgICAgMzAsMTkwLDIwMSwxMjAsIDUxLCA0OSwgOTQsMjQ0LCA4NiwyNTEsMjM3LDE5MywxMTksMjIwLDExOSwgMjksCisgICAgMjM5LDE2MywyMjMsIDE1LCA3OSwyMjgsMTI0LCAzMiwxMjcsIDQwLDI1NSwxMDQsMjQ5LDE3NywyNDUsIDgzLAorICAgIDIwOCwxNjcsMjUxLDE0NywgMjUsMTQ3LDE0NywyNTUsICA0LCAgMywxNTIsMjQzLDI1MiwgOTksIDUxLCA0NSwKKyAgICAyMTksICAwLCAgMCwgIDAsIDMyLCA5OSwgNzIsIDgyLCA3NywgIDAsICAwLDEyMiwgMzcsICAwLCAgMCwxMjgsCisgICAgMTMxLCAgMCwgIDAsMjQ5LDI1NSwgIDAsICAwLDEyOCwyMzMsICAwLCAgMCwxMTcsIDQ4LCAgMCwgIDAsMjM0LAorICAgICA5NiwgIDAsICAwLCA1OCwxNTIsICAwLCAgMCwgMjMsMTExLDE0NiwgOTUsMTk3LCA3MCwgIDAsICAwLCAgMywKKyAgICAyNDEsIDczLCA2OCwgNjUsIDg0LDEyMCwyMTgsMjM2LCA5MywgNjMsIDc2LCA4MywgNjUsIDI4LCA0NiwxOTYsCisgICAgICA1LCA4NCwgMjIsMTQwLCA3MCwgIDMsMTM5LDEwNCwgOTMsIDc2LCA5MCwxOTksIDg2LCA5MywxMDgsIDM2LAorICAgICAxNCwxNTIsIDcyLCA3NiwxNTIsIDcyLCA5NiwgNTEsMTc4LCAyMiwgNTQsIDE5LCAzNywgNDksIDE0LCAxMCwKKyAgICAxMDcsMTEzLDE3MiwxNjYsIDE5LDEzNywyMDksMTY0LCAxNCwgIDYsMTk3LCA3NywyMzQsIDM4LCA2OCwgMjIsCisgICAgMjM0LCAzMSwgIDYsMTM2LCAgOSwgNzAsIDI4LCAyMCwyMDMsIDg4LDEzNSwxODcsMTc1LDIwNSwgOTMsMjUxLAorICAgIDEyMCwxNzUsMjM3LCA4MSwgMzAsMTE5LDIyMywxODMsMjUyLDEwNCwgMzEsMjQ3LDIzOCwyNTMsMjM4LDIzNSwKKyAgICAyMzksMjU0LDEyNiwyNDcsMTc0LDE2MywgOTIsIDQ2LDE1MSwyMDMsMjI5LCAgOCwgOTcsICA5LDE0MiwyMjQsCisgICAgMTQzLCA0MywgODcsMTE1LDE4NSwxMTEsIDk1LCA4OSwgMzIsIDQyLDI1MCwxMjYsIDEwLDEyMywgOTcsIDcwLAorICAgIDIxNiwyMzgsIDkyLDEwNywyNDcsIDQzLDE0MSwgMTAsMTg3LCA1NCwgNDEsMjM2LDIzMCwyMDEsMTI1LCAzNSwKKyAgICAyMTIsMTA5LDI0NCwgMTQsIDEwLDE1NSwyNTAsIDQ2LDEwOCwgOTgsIDY5LCAzNSwxMTIsIDY0LDIxOCwyNTEsCisgICAgMTM0LCA1MCwxMjQsIDQxLCAgOSwyNTQsIDM5LDEwOCwgMzMsIDM4LDIzNiwyMjYsIDg5LCA5NywxODMsIDIzLAorICAgICA3MiwxMDQsIDgzLDE4NCwxMjEsIDcwLDIxNiwxNjEsMjE5LDIxOCwxMzMsIDkyLDEyMywyNDIsMTk5LCAxNSwKKyAgICAgMzgsIDUzLCAzNywxNzMsMjUyLDI1NCwyNDUsMTcwLDE3NiwyNDksIDMxLCAzNiwxMTYsIDc5LDExNiwyMDEsCisgICAgICAyLCA3NiwgMzEsIDE5LDE4MiwxMjcsIDQzLDE1NiwyMDcsIDU3LCAzNiwxMDcsMTMwLDIxNiwgNDEsIDk3LAorICAgIDEwMywxMTksMTMyLDIyMSwgMjksMjQ1LCA3NSwyMTcsMjMzLCA4NiwgOTEsMjQ4LDEwNCwgNTYsMjIwLCA2OCwKKyAgICAyMzQsMTkyLDExNSwyMjYsMTg1LDIyNSwxMzUsMTc5LDEzMiwgMzQsIDM0LDE5OSwxNTEsMjA0LDExNiwxMDYsCisgICAgIDE0LCAxMCwyMjEsMTU0LCAzMSwgOTMsIDU3LCA3MSwgIDksIDY5LCAgMSwgMjgsMTUwLDEzNiwgMTIsIDI2LAorICAgIDE3NywyNDAsMjAzLCAyNSwgNjYsMjI3LDExMywxMDUsIDk5LDE1MCwyNTAsIDIzLCA4MywyNTMsMTgwLDE1OCwKKyAgICAyMDgsMTQ1LCAgMSwgNTUsMjUwLCAgNiwxODEsMTI2LCA5MCwgNzAsMTA0LDExNiwgNzAsIDI5LCA4NywxODYsCisgICAgIDUwLDEyNiwxMzQsMjIzLDIxNCwgMTcsIDI2LDEyNywyMzQsMjMwLDEyMCwxODYsMjM0LDE4MywxNjUsIDE3LAorICAgIDIzNCwgMjYsMTcyLDE0MSwgODAsIDkxLDEyMiwxNzksMjA1LDI1MSwyMjEsIDI1LCAzMywxNzIsICAyLCAgOSwKKyAgICAxODEsMTcyLDIzNCwgMzcsMTYxLDE0MCwgODAsMTMwLDEzMiwgMTgsIDM2LDE0OCwgIDgsIDIxLDE2MSwxNzQsCisgICAgMTQyLCAgNywxNzMsIDM1LCA1MiwyMjEsIDM1LDIzNywxMTMsIDk3LDE5OSwxNTAsIDg4LDE5NiwxMzUsMTU0LAorICAgIDIwOCwyMzIsIDE5LDI0NSwyNDMsMTM3LCAyNywgNDQsIDk4LDE4MiwxNjEsICA0LCAgOSwgMzcsMTU0LCAzNiwKKyAgICAgMjAsMjEwLDEzNSwgNDksIDk1LCA0MSwxOTYsMjIyLCA3MiwxNzIsMTgyLDE1MCwxNTgsMjQwLCA2NiwgNjQsCisgICAgMjEzLCAzMSwxOTYsIDczLDIzMywxNjMsMTk0LCA2NiwyMjcsMjQyLDEyMywgOTAsMjE2LDEyNCwxMzEsMTg5LAorICAgIDIyMywyNDEsIDE1LDE5NCwgNjYsMTI3LDE1NCwxNDUsMjQ3LCA1NSwgNDcsIDYwLDEwMiwxMzIsICA2LCAzNCwKKyAgICAgMTgsMTg0LDI0NiwxNjUsMTc3LDIzNiwgMzIsMTAwLCAgNiwxNzYsIDY0LDEzOSwyNTEsMjUxLDE3MSwyMTgsCisgICAgMTM2LDE1MCwgIDgsMTU3LDE4NCwgOTEsMTU5LDIwMCwgMTMsMTY5LCAyMywxMjUsIDU2LDIyMCwgODgsMTE4LAorICAgIDI0OSwgIDcsMTA2LDEyMiwgNjQsIDg3LDE4MSwgMTcsMTM0LCAgOSwgNjksIDI3LDE2NywgNzUsIDU3LCA1NCwKKyAgICAgNTIsMjI1LDExMSwxNjMsMTQ2LDEyNSwgODQsMTY5LCA5NCwyMzMsMTc3LDE3NCwxMzUsMjUyLCAgOSwgNjcsCisgICAgMTMyLDE2NiwgNjAsMTgyLCA0NSwyMDUsMjAzLDIzOSwyNTMsIDIxLDIyMCwxMjMsICAzLDIzMywyNDMsMjExLAorICAgIDI0NSwxNzUsMTk5LCA1MSwxNjQsMTk4LCA0MCwxNjEsMjUwLDIwMiwgNjMsIDM0LDE3OSwgNTYsMTA1LCA1NCwKKyAgICAyNTEsMTk0LDE5NywyNTAsMTQ1LDEwNiwxNzEsMjUyLDE3OCwyMzcsMTMyLDEyMiwyMDUsMTkzLDE1NCwgMzgsCisgICAgIDgyLDE5OSwyNDYsIDkxLCA4MiwyMDksMjE0LDExMywyMzIsMTEwLCA0MSwgMzIsIDQ5LCAxMSwgNDQsMjEwLAorICAgICA4MCwxNDEsIDY3LCA0MywxMzIsMTA0LDIxOSwyMzUsMTYyLCA1OSwxOTMsMTEwLDE1MSwxNTMsIDE5LDI0NiwKKyAgICAgODIsIDkyLDIxNiwgNzksMTA0LDEzOSwxMjUsMTk4LDE1MSwgOTMsMjA3LDIyOSwgMzEsIDkxLDE2NCwxOTYsCisgICAgMTA0LDEzMiwxMzAsMjA4LDE0NiwyMTQsMjMzLDE5MywxNjQsMTg3LDE1OSwxMjgsIDI1LDE4OSwgODgsMjM2LAorICAgIDEwNywyNDQsMTU1LCA0MCwxOTIsMjUzLDE4OCwyMTgsMTA4LDE5NCwgODAsMTQ5LCA5MSwyNDAsMjMyLDE0OCwKKyAgICAxNDAsMTU2LCA1MSwxNTUsMjUzLDI0OCwxOTksMjUwLDIyMywxNzUsIDc2LDE0NCwgMjYsMTYzLDEzMiwgOTgsCisgICAgMTA3LDE4NCwgMzAsMTY5LDIzMiwxMjUsMTgyLDE4NiwyMDYsMTM3LDI0NCwyNTAsMTE0LCAyNywyNDIsMTIzLAorICAgIDI0NywxNTIsMjEyLCAyNCwgMzcsIDIwLCA4NSwyMzksMjUyLDEyMiwyNTMsMjM1LDIwMSwyMDcsMTk0LCA5OCwKKyAgICAgNjUsMTg3LDExOCwgMjMsMTQ4LDI0NiwgNjcsMTQ0LDIxNSwyMzksMTg5LCA4MiwyMTEsMjE1LDE0MCwxMTUsCisgICAgMjE1LDIwNSwxNDAsMTE1LDIxNywgNDEsMjQyLCAyNSwgMzksMjQ2LDIwMywxNzAsIDIyLDIzOSwgIDIsMjA4LAorICAgIDIxOSwyMTQsMTA0LDIwOCwyNTIsIDYwLCA1OCwgNjEsMjE3LDIwMywxMDYsMTI2LDE5NiwgNjIsIDE1LCA5MSwKKyAgICAgNDgsIDY3LCA1MiwgNTUsMTAzLDEwMiwxMjAsMTMwLDI0NCwxNzksMTI3LCA3MywxMDAsIDkxLCAzNSwgODQsCisgICAgMTk5LDI0MiwxNzgsMTA2LCAxOSwxMTQsMjM0LCA0NiwyNTAsIDcxLCA4OCwgNDcsMjAxLDIwMSwxNzUsIDU1LAorICAgIDEwNiwxMDMsICA3LDIzMywgMzUsIDQ3LCA3MiwxOTMsMTI5LCAxOCwyMzQsIDg1LCAzNywgMjMsMjUyLDI1NCwKKyAgICAgNDksMjAxLDE2MiwgMTQsIDg1LDE0OSwgNzUsMTQ0LCA4MCwxMzAsMTMyLCAxOCwgMzYsMTQ4LCAzMiwxNjEsCisgICAgIDM2LDE0OCwgMzIsMTYxLCAgNCwgIDksIDM3LCA3MiwgNDAsMTYxLDE2MywgNTYsIDczLCA2NiwgMjUsMTYxLAorICAgICA5NywxMzQsMTcxLDE1NCwxNjYsMTcwLDIyMywxNTAsIDE3LDE4NiwxNTAsMTE4LDE0NywyMDgsMTcwLDIyMywKKyAgICAxNTAsIDE3LCA5MCwyMzYsMTEzLDE4MCwyMzcsMjM2LDE3NywxNDgsIDgwLDE3MiwyNTQsMTQ4LCAyOCwgODEsCisgICAgIDYwLDE5MiwyMDcsMjM0LDEyMiwxNzgsMTY1LDE1NywxNjIsMjQ3LDIzMSwyMjEsIDMyLDE4MCwyMTQsIDc5LAorICAgICA3NSwgIDksMTMzLDE0MCwyMTIsIDg2LCA1NywgNDAsMjUyLDE3MCwgNjEsICA2LDE5NiwyNDIsIDk3LCA3NSwKKyAgICAgNTQsMTA1LCA4NywgMjEsIDEyLCA2MywxNzgsIDczLCA3MSwgMzksIDIyLCAzMiwyNDQsMjQ2LCA4MiwgNDcsCisgICAgIDMwLCA1NCwxOTIsIDE1LDExMSwgIDEsMTg3LCAzNSwgIDcsMjQxLDE2MCwyMTEsMTc2LCAyNywgMjMsMTE4LAorICAgICA3NiwxOTAsIDE4LCAzMiwyMzYsMTk5LDEyNiwgMzIsIDM0LDE1OSwgNzMsIDg1LDIyOCwyNDIsIDI5LDE5OSwKKyAgICAgMzgsIDIyLDI1MiwgIDAsMTEzLCAyNiwxMTgsMTU4LCAyMywxNjcsIDY2LCA1OCwgMTIsMTUzLCA4MiwxNTksCisgICAgMTc5LCAzNCwxNzAsMjQzLDEzMywxNjMsMTAzLDE1OSwgODUsMTAwLDE2NCwyNDIsMTE1LCA2NiwgNzAsICAwLAorICAgICA1NCwgNTgsMTgzLDI1MSwyMDUsMjE2LDIzMiwyMjgsIDQ0LCA3NCwyNTMsMTE1LCA2NSwxNzAsIDQwLCAzNSwKKyAgICAgMTMsMjA3LDEyNCwyNDEsMTE2LCA2NiwxNjUsIDc0LDEzNCwxMjIsIDE3LCA0NywyMzksMTkyLCA0NiwxODYsCisgICAgMTkwLCA5MSwxMDYsIDIxLDIyMSwxMjMsIDkzLDIxOCwxOTMsIDk2LCA4NSwyMzAsMjMwLDEwNSwyNDUsMTE1LAorICAgICA4MSwxNTgsMTg5LDEwMiwyNTQsMjE2LDIwMSwgMTQsIDMwLCAgOCwxMDcsIDIzLCA3MiwxNjgsMTAxLDI0OCwKKyAgICAgNjMsICAwLDE3OSwxNjAsIDE2LDIxNywxODgsMTk5LCA2OSwgNTMsICAwLCAgMCwgIDAsICAwLCA3MywgNjksCisgICAgIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX3NlbGVjdF9wbmdbMzM3NF0gPSB7CisgICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCwgIDAsICAwLCAgMCwgMTMsIDczLCA3MiwgNjgsIDgyLAorICAgICAgMCwgIDAsICAwLCA5OCwgIDAsICAwLCAgMCwgMzMsIDE2LCAgNiwgIDAsICAwLCAgMCwxMTQsMjQ5LDE2MiwKKyAgICAxNDMsICAwLCAgMCwgIDAsICA5LDExMiwgNzIsIDg5LDExNSwgIDAsICAwLCAxMSwgMTksICAwLCAgMCwgMTEsCisgICAgIDE5LCAgMSwgIDAsMTU0LDE1NiwgMjQsICAwLCAgMCwgMTAsIDc5LDEwNSwgNjcsIDY3LCA4MCwgODAsMTA0LAorICAgIDExMSwxMTYsMTExLDExNSwxMDQsMTExLDExMiwgMzIsIDczLCA2NywgNjcsIDMyLDExMiwxMTQsMTExLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwgIDAsICAwLDEyMCwyMTgsMTU3LCA4MywxMDMsIDg0LCA4MywyMzMsIDIyLCA2MSwyNDcsCisgICAgMjIyLDI0NCwgNjYsIDc1LDEzNiwxMjgsMTQ4LCA3NSwxMTEsIDgyLCAyMSwgIDgsIDMyLCA4MiwgNjYsMTM5LAorICAgIDEyOCwgMjAsMTQ1LCAzOCwgNDIsIDMzLCAgOSwgMTYsIDc0LDEzNiwgMzMsMTYxLDIxNywgMjEsIDgxLDE5MywKKyAgICAgMTcsIDY5LCA2OSwgIDQsIDI3LDIwMCwxNjAsMTM2LCAgMywxNDIsMTQyLDEyOCwxNDAsIDIxLCA4MSwgNDQsCisgICAgIDEyLDEzOCwgMTAsMjE2LCAgNywyMjgsIDMzLDE2MiwxNDIsMTMxLDE2MywxMzYsMTM4LDIwMiwyNTEsMjI1LAorICAgIDEyMywxNjMsMTA3LDIxNCwxODgsMjQ3LDIzMCwyMDUsMjU0LDE4MSwyMTUsIDYyLDIzMSwxNzIsMjQzLDE1NywKKyAgICAxNzksMjA3LCAgNywxOTIsICA4LCAxMiwxNTAsIDcyLCA1MSwgODEsIDUzLDEyOCwgMTIsMTY5LCA2NiwgMzAsCisgICAgIDE3LDIyNCwxMzEsMTk5LDE5NiwxOTgsMjI1LDIyOCwgNDYsIDY0LDEyOSwgMTAsIDM2LDExMiwgIDAsIDE2LAorICAgICAgOCwxNzksMTAwLCAzMywxMTUsMjUzLCAzNSwgIDEsICAwLDI0OCwxMjYsIDYwLCA2MCwgNDMsIDM0LDE5MiwKKyAgICAgIDcsMTkwLCAgMCwgIDEsMTIwLDIxMSwgMTEsICA4LCAgMCwxOTIsIDc3LDE1NSwxOTIsIDQ4LCAyOCwxMzUsCisgICAgMjU1LCAxNSwyMzQsIDY2LDE1MywgOTIsICAxLDEyOCwxMzIsICAxLDE5MiwxMTYsMTQ1LCA1NiwgNzUsICA4LAorICAgIDEyOCwgMjAsICAwLCA2NCwxMjIsMTQyLCA2NiwxNjYsICAwLCA2NCwgNzAsICAxLDEyOCwxNTcsMTUyLCAzOCwKKyAgICAgODMsICAwLDE2MCwgIDQsICAwLCA5NiwyMDMsIDk5LCA5OCwyMjcsICAwLCA4MCwgNDUsICAwLCA5NiwgMzksCisgICAgMTI3LDIzMCwyMTEsICAwLDEyOCwxNTcsMjQ4LDE1MywxMjMsICAxLCAgMCwgOTEsMTQ4LCAzMywgMjEsICAxLAorICAgIDE2MCwxNDUsICAwLCAzMiwgMTksMTAxLDEzNiwgNjgsICAwLDEwNCwgNTksICAwLDE3MiwyMDcsIDg2LDEzOCwKKyAgICAgNjksICAwLCA4OCwgNDgsICAwLCAyMCwxMDIsIDc1LDE5NiwgNTcsICAwLDIxNiwgNDUsICAwLCA0OCwgNzMsCisgICAgIDg3LDEwMiwgNzIsICAwLDE3NiwxODMsICAwLDE5MiwyMDYsIDE2LCAxMSwxNzgsICAwLCAgOCwgMTIsICAwLAorICAgICA0OCwgODEsMTM2LDEzMywgNDEsICAwLCAgNCwxMjMsICAwLCA5NiwyMDAsIDM1LCAzNSwxMjAsICAwLDEzMiwKKyAgICAxNTMsICAwLCAyMCwgNzAsMjQyLCA4NywgNjAsMjQxLCA0MywxNzQsIDE2LDIzMSwgNDIsICAwLCAgMCwxMjAsCisgICAgMTUzLDE3OCwgNjAsMTg1LCAzNiwgNTcsIDY5LDEyOSwgOTEsICA4LCA0NSwxMTMsICA3LCA4NywgODcsIDQ2LAorICAgICAzMCwgNDAsMjA2LCA3MywgMjMsIDQzLCAyMCwgNTQsIDk3LCAgMiwgOTcsMTU0LCA2NCwgNDYsMTk0LDEyMSwKKyAgICAxNTMsIDI1LCA1MCwxMjksIDUyLCAxNSwyMjQsMjQzLDIwNCwgIDAsICAwLDE2MCwxNDUsIDIxLCAxNywyMjQsCisgICAgMTMxLDI0MywyNTMsMTIwLDIwNiwgMTQsMTc0LDIwNiwyMDYsIDU0LDE0MiwxODIsIDE0LCA5NSwgNDUsMjM0LAorICAgIDE5MSwgIDYsMjU1LCAzNCwgOTgsIDk4LDIyNywyNTQsMjI5LDIwNywxNzEsMTEyLCA2NCwgIDAsICAwLDIyNSwKKyAgICAxMTYsMTI2LDIwOSwyNTQsIDQ0LCA0NywxNzksIDI2LDEyOCwgNTksICA2LDEyOCwxMDksMjU0LDE2MiwgMzcsCisgICAgMjM4LCAgNCwxMDQsIDk0LCAxMSwxNjAsMTE3LDI0NywxMzksMTAyLDE3OCwgMTUsIDY0LDE4MSwgIDAsMTYwLAorICAgIDIzMywyMTgsIDg3LDI0MywxMTIsMjQ4LDEyNiwgNjAsIDYwLCA2OSwxNjEsMTQ0LDE4NSwyMTcsMjE3LDIyOSwKKyAgICAyMjgsMjI4LDIxNiwgNzQsMTk2LCA2NiwgOTEsIDk3LDIwMiwgODcsMTI1LDI1NCwxMDMsMTk0LCA5NSwxOTIsCisgICAgIDg3LDI1MywxMDgsMjQ5LDEyNiwgNjAsMjUyLDI0NywyNDUsMjI0LDE5MCwyMjYsIDM2LDEyOSwgNTAsIDkzLAorICAgIDEyOSwgNzEsICA0LDI0OCwyMjQsMTk0LDIwNCwyNDQsIDc2LDE2NSwgMjgsMjA3LDE0NiwgIDksMTMyLCA5OCwKKyAgICAyMjAsMjMwLDE0MywgNzEsMjUyLDE4MywgMTEsMjU1LDI1MiwgMjksMjExLCAzNCwxOTYsIDczLCA5OCwxODUsCisgICAgIDg4LCA0MiwgMjAsMjI3LCA4MSwgMTgsMTEzLDE0MiwgNjgsMTU0LDE0MCwyNDMsIDUwLDE2NSwgMzQsMTM3LAorICAgICA2NiwxNDYsIDQxLDE5NywgMzcsMjEwLDI1NSwxMDAsMjI2LDIyMywgNDQsMjUxLCAgMywgNjIsMjIzLCA1MywKKyAgICAgIDAsMTc2LDEwNiwgNjIsICAxLDEyMywxNDUsIDQ1LDE2OCwgOTMsIDk5LCAgMywyNDYsIDc1LCAzOSwgMTYsCisgICAgIDg4LDExNiwxOTIsMjI2LDI0NywgIDAsICAwLDI0MiwxODcsMTExLDE5MywyMTIsIDQwLCAgOCwgIDMsMTI4LAorICAgIDEwNCwxMzEsMjI1LDIwNywxMTksMjU1LDIzOSwgNjMsMjUzLCA3MSwxNjAsIDM3LCAgMCwxMjgsMTAyLCA3MywKKyAgICAxNDYsMTEzLCAgMCwgIDAsIDk0LCA2OCwgMzYsIDQ2LCA4NCwyMDIsMTc5LCA2MywxOTksICA4LCAgMCwgIDAsCisgICAgIDY4LDE2MCwxMjksIDQyLDE3NiwgNjUsIDI3LDI0NCwxOTMsIDI0LCA0NCwxOTIsICA2LCAyOCwxOTMsICA1LAorICAgIDIyMCwxOTMsIDExLDI1MiwgOTYsIDU0LDEzMiwgNjYsIDM2LDE5NiwxOTQsIDY2LCAxNiwgNjYsIDEwLDEwMCwKKyAgICAxMjgsIDI4LDExNCwgOTYsIDQxLDE3MiwxMzAsIDY2LCA0MCwxMzQsMjA1LDE3NiwgMjksIDQyLCA5NiwgNDcsCisgICAgMjEyLCA2NCwgMjksIDUyLDE5MiwgODEsMTA0LDEzNCwxNDcsMTEyLCAxNCwgNDYsMTk0LCA4NSwxODQsIDE0LAorICAgICA2MSwxMTIsIDE1LDI1MCwgOTcsICA4LDE1OCwxOTMsIDQwLDE4OCwxMjksICA5LCAgNCwgNjUsMjAwLCAgOCwKKyAgICAgMTksIDk3LCAzMywyMTgsMTM2LCAgMSwgOTgsMTM4LCA4OCwgMzUsMTQyLCAgOCwgMjMsMTUzLDEzMywyNDgsCisgICAgIDMzLDE5MywgNzIsICA0LCAxOCwxMzksIDM2LCAzMiwyMDEsMTM2LCAyMCwgODEsIDM0LCA3NSwxNDUsIDUzLAorICAgICA3MiwgNDksIDgyLDEzOCwgODQsIDMyLCA4NSwgNzIsIDI5LDI0MiwgNjEsMTE0LCAgMiwgNTcsMTM1LCA5MiwKKyAgICAgNzAsMTg2LDE0NSwgNTksMjAwLCAgMCwgNTAsMTMwLDI1MiwxMzQsMTg4LCA3MSwgNDksMTQ4LDEyOSwxNzgsCisgICAgIDgxLCA2MSwyMTIsIDEyLDE4MSwgNjcsMTg1LDE2OCwgNTUsIDI2LDEzMiwgNzAsMTYyLCAxMSwyMDgsMTAwLAorICAgIDExNiwgNDksMTU0LDE0MywgMjIsMTYwLDE1NSwyMDgsMTE0LDE4MCwgMjYsIDYxLDE0MCwgNTQsMTYxLDIzMSwKKyAgICAyMDgsMTcxLDEwNCwgMTUsMjE4LDE0MywgNjIsIDY3LDE5OSwgNDgsMTkyLDIzMiwgMjQsICA3LCA1MSwxOTYsCisgICAgMTA4LCA0OCwgNDYsMTk4LDE5NSwgNjYsMTc3LCA1NiwgNDQsICA5LDE0NywgOTksMjAzLDE3NywgMzQsMTcyLAorICAgICAxMiwxNzEsMTk4LCAyNiwxNzYsIDg2LDE3MiwgIDMsMTg3LDEzNywyNDUsIDk5LDIwNywxNzcsMTE5LCAgNCwKKyAgICAgMTgsMTI5LCA2OSwxOTIsICA5LCA1NCwgIDQsMTE5LCA2NiwgMzIsIDk3LCAzMCwgNjUsIDcyLCA4OCwgNzYsCisgICAgIDg4LCA3OCwyMTYsIDcyLDE2OCwgMzIsIDI4LCAzNiwgNTIsIDE3LDIxOCwgIDksIDU1LCAgOSwgIDMsMTMyLAorICAgICA4MSwxOTQsIDM5LCAzNCwxNDcsMTY4LCA3NSwxODAsIDM4LDE4NiwgMTcsMjQ5LDE5NiwgMjQsIDk4LCA1MCwKKyAgICAgNDksMTM1LCA4OCwgNzIsIDQ0LCAzNSwyMTQsIDE4LDE0MywgMTksIDQ3LCAxNiwxMjMsMTM2LCA2NywxOTYsCisgICAgIDU1LCAzNiwgMTgsMTM3LCA2NywgNTAsIDM5LDE4NSwxNDQsICAyLCA3MywxNzcsMTY0LCA4NCwyMTAsIDE4LAorICAgIDIxMCwgNzAsMjEwLDExMCwgODIsIDM1LDIzMywgNDQsMTY5LDE1NSwgNTIsIDcyLCAyNiwgMzUsMTQ3LDIwMSwKKyAgICAyMTgsMTAwLDEwNywxNzgsICA3LCA1NywxNDgsIDQ0LCAzMiwgNDMsMjAwLDEzMywyMjgsMTU3LDIyOCwxOTUsCisgICAgMjI4LCA1MSwyMjgsIDI3LDIyOCwgMzMsMjQyLCA5MSwgMTAsMTU3LCA5OCwgNjQsMTEzLDE2NCwyNDgsIDgzLAorICAgIDIyNiwgNDAsIDgyLDIwMiwxMDYsIDc0LCAyNSwyMjksIDE2LDIyOSwgNTIsMjI5LCAgNiwxMDEsMTUyLCA1MCwKKyAgICAgNjUsIDg1LDE2MywxNTQsIDgyLDIyMSwxNjgsMTYxLCA4NCwgMTcsIDUzLDE0MywgOTAsIDY2LDE3MywxNjEsCisgICAgMTgyLCA4MiwxNzUsIDgxLDEzNSwxNjgsIDE5LCA1MiwxMTcsMTU0LCA1NywyMDUsMTMxLCAyMiwgNzMsIDc1LAorICAgIDE2NSwxNzMsMTYyLDE0OSwyMTEsIDI2LDEwNCwgMjMsMTA0LDI0NywxMDUsMTc1LDIzMiwxMTYsMTg2LCAxNywKKyAgICAyMjEsMTQ5LCAzMCwgNzgsMTUxLDIwOCwgODcsMjEwLDIwMywyMzMsIDcxLDIzMiwxNTEsMjMyLCAgMywyNDQsCisgICAgMTE5LCAxMiwgMTMsMTM0LCAyMSwxMzEsMTk5LDEzNiwxMDMsIDQwLCAyNSwxNTUsIDI0LCAgNywgMjQsMTAzLAorICAgICAyNSwxMTksIDI0LDE3NSwxNTIsIDc2LDE2NiwgMjUsMjExLDEzOSwgMjUsMTk5LCA4NCwgNDgsIDU1LCA0OSwKKyAgICAyMzUsMTUyLDIzMSwxNTMsIDE1LDE1MywxMTEsIDg1LCA4OCwgNDIsMTgyLCA0MiwxMjQsIDIxLDE0NSwyMDIsCisgICAgIDEwLDE0OSwgNzQsMTQ5LCAzOCwxNDksIDI3LCA0MiwgNDcsIDg0LDE2OSwxNzAsMTY2LDE3MCwyMjIsMTcwLAorICAgICAxMSwgODUsMjQzLCA4NSwyMDMsIDg0LDE0MywxNjksIDk0LCA4MywxMjUsMTc0LCA3MCwgODUsIDUxLCA4MywKKyAgICAyMjcsMTY5LCAgOSwyMTIsMTUwLDE3MSwgODUsMTcwLDE1NywgODAsMjM1LCA4MywgMjcsIDgzLDEwMywxNjksCisgICAgIDU5LDE2OCwxMzUsMTcwLDEwMywxNjgsMTExLCA4NCwgNjMsMTY0LDEyNiwgODksMjUzLDEzNywgIDYsIDg5LAorICAgIDE5NSwgNzYsMTk1LCA3OSwgNjcsMTY0LCA4MSwxNjAsMTc3LCA5NSwyMjcsMTg4LDE5OCwgMzIsIDExLCA5OSwKKyAgICAgMjUsMTc5LDEyMCwgNDQsIDMzLDEwNywgMTMsMTcxLDEzNCwxMTcsMTI5LCA1MywxOTYsIDM4LDE3NywyMDUsCisgICAgMjE3LDEyNCwxMTgsIDQyLDE4NywxNTIsMjUzLCAyOSwxODcsMTM5LCA2MSwxNzAsMTY5LDE2MSwgNTcsIDY3LAorICAgICA1MSwgNzQsIDUxLCA4NywxNzksIDgyLDI0MywxNDgsMTAyLCA2MywgIDcsMjI3LDE1MiwxMTMsMjQ4LDE1NiwKKyAgICAxMTYsIDc4LCAgOSwyMzEsIDQwLDE2NywxNTEsMjQzLDEyNiwxMzgsMjIyLCAyMCwyMzksIDQxLDIyNiwgNDEsCisgICAgIDI3LDE2NiwgNTIsIDc2LDE4NSwgNDksMTAxLCA5MiwxMDcsMTcwLDE1MCwxNTEsMTUwLCA4OCwxNzEsIDcyLAorICAgIDE3MSwgODEsMTcxLCA3MSwyMzUsMTg5LCA1NCwxNzQsMjM3LDE2NywxNTcsMTY2LDE4OSwgNjksMTg3LCA4OSwKKyAgICAyNTEsMTI5LCAxNCwgNjUsMTk5LCA3NCwgMzksIDkyLCAzOSwgNzEsMTAzLDE0MywyMDYsICA1LDE1NywyMzEsCisgICAgIDgzLDIxNywgODMsMjIxLDE2NywgMTAsMTY3LCAyMiwgNzcsIDYxLCA1OCwyNDUsMTc0LCA0NiwxNzAsMTA3LAorICAgIDE2NSwgMjcsMTYxLDE4NywgNjgsMTE5LDE5MSwxMTAsMTY3LDIzOCwxNTIsMTU4LDE5MCwgOTQsMTI4LDE1OCwKKyAgICAgNzYsMTExLDE2NywyMjIsMTIxLDE4OSwyMzEsMjUwLCAyOCwxMjUsIDQ3LDI1MywgODQsMjUzLDEwOSwyNTAsCisgICAgMTY3LDI0NSwgNzEsIDEyLCA4OCwgIDYsMTc5LCAxMiwgMzYsICA2LDIxOSwgMTIsMjA2LCAyNCwgNjAsMTk3LAorICAgICA1MywxMTMsMTExLCA2MCwgMjksIDQ3LDE5OSwyMTksMjQxLCA4MSwgNjcsIDkzLDE5NSwgNjQsIDY3LDE2NSwKKyAgICAgOTcsMTQ5LCA5NywxNTEsMjI1LDEzMiwxNDUsMTg1LDIwOSwgNjAsMTYzLDIxMywgNzAsMTQxLCA3MCwgMTUsCisgICAgMTQwLDEwNSwxOTgsIDkyLDIyNywgMzYsMjI3LDEwOSwxOTgsMTA5LDE5OCwxNjMsIDM4LCAgNiwgMzgsIDMzLAorICAgICAzOCwgNzUsIDc3LDIzNCwgNzcsMjM4LDE1NCwgODIsIDc3LDE4NSwxNjYsIDQxLDE2NiwgNTksIDc2LCA1OSwKKyAgICAgNzYsMTk5LDIwNSwyMDQsMjA1LDE2MiwyMDUsMjE0LDE1MywgNTMsMTU1LCA2MSwgNDksMjE1LCA1MCwyMzEsCisgICAgMTU1LDIzMSwxNTUsMjE1LDE1NSwyMjMsMTgzLCA5NiwgOTAsMTIwLCA5MCwgNDQsMTgyLDE2OCwxODIsMTg0LAorICAgIDEwMSwgNzMsMTc4LDIyOCwgOTAsMTY2LCA4OSwyMzgsMTgyLDE4OCwxMTAsMTMzLCA5MCwgNTcsIDg5LDE2NSwKKyAgICAgODgsIDg1LCA5MCwgOTMsMTc5LCA3MCwxNzMsMTU3LDE3MywgMzcsMjE0LDE4NywxNzMsMTg3LDE2NywgMTcsCisgICAgMTY3LDE4NSwgNzgsMTQ3LCA3OCwxNzEsMTU4LDIxNCwxMDMsMTk1LDE3NiwyNDEsMTgyLDIwMSwxODIsMTY5LAorICAgIDE4MywgMjUsMTc2LDIyOSwyMTYsICA2LDIxOSwxNzQsMTgyLDEwOSwxODIsMTI1LCA5NywxMDMsIDk4LCAyMywKKyAgICAxMDMsMTgzLDE5NywxNzQsMTk1LDIzOCwxNDcsMTg5LDE0NywxMjUsMTg2LDEyNSwxNDEsMjUzLCA2MSwgIDcsCisgICAgIDEzLDEzNSwyMTcsIDE0LDE3MSwgMjksIDkwLCAyOSwxMjYsMTE1LDE4MCwxMTQsIDIwLCA1OCwgODYsIDU4LAorICAgIDIyMiwxNTQsMjA2LDE1NiwyMzgsIDYzLDEyNSwxOTcsMjQ0LDE1MCwyMzMsIDQ3LDEwMywgODgsMjA3LCAxNiwKKyAgICAyMDcsMjE2LCA1MSwyMjcsMTgyLCAxOSwyMDMsIDQxLDE5NiwxMDUsMTU3LCA4MywxNTUsMjExLCA3MSwxMDMsCisgICAgIDIzLDEwMywxODUsMTE1LDEzMSwyNDMsMTM2LDEzOSwxMzcsIDc1LDEzMCwyMDMsIDQ2LDE1MSwgNjIsIDQ2LAorICAgIDE1NSwgMjcsMTk4LDIyMSwyMDAsMTg5LDIyOCwgNzQsMTE2LDI0NSwxMTMsIDkzLDIyNSwxMjIsMjEwLDI0NSwKKyAgICAxNTcsMTU1LDE3OSwxNTUsMTk0LDIzNywxNjgsMjE5LDE3NSwyMzgsIDU0LDIzOCwxMDUsMjM4LDEzNSwyMjAsCisgICAgMTU5LDIwNCwgNTIsMTU5LCA0MSwxNTgsIDg5LCA1MSwxMTUsMjA4LDE5NSwyMDAsIDY3LDIyNCwgODEsMjI5LAorICAgIDIwOSwgNjMsIDExLDE1OSwxNDksIDQ4LDEwNywyMjMsMTcyLDEyNiwgNzksIDY3LCA3OSwxMjksMTAzLDE4MSwKKyAgICAyMzEsIDM1LCA0NywgOTksIDQ3LDE0NSwgODcsMTczLDIxNSwxNzYsMTgzLDE2NSwxMTksMTcwLDI0NywgOTcsCisgICAgMjM5LCAyMywgNjIsMjQ2LCA2MiwxMTQsMTU5LDIyNywgNjIsMjI3LCA2MCwgNTUsMjIyLCA1MCwyMjIsIDg5LAorICAgICA5NSwyMDQsIDU1LDE5MiwxODMsMjAwLDE4MywyMDMsIDc5LDE5NSwxMTEsMTU4LCA5NSwxMzMsMjIzLCA2NywKKyAgICAxMjcsIDM1LDI1NSwxMDAsMjU1LDEyMiwyNTUsMjA5LCAgMCwxNjcsMTI4LCAzNywgIDEsMTAzLCAgMywxMzcsCisgICAgMTI5LCA2NSwxMjksIDkxLCAgMiwyNTEsMjQ4LDEyMiwxMjQsIDMzLDE5MSwxNDIsIDYzLCA1OCwyMTksMTAxLAorICAgIDI0NiwxNzgsMjE3LDIzNywgNjUsMTQwLDE2MCwxODUsIDY1LCAyMSwgNjUsMTQzLDEzMCwxNzMsMTMwLDIyOSwKKyAgICAxOTMsMTczLCAzMywxMDQsMjAwLDIzNiwxNDQsMTczLCAzMywyNDcsMjMxLDE1MiwyMDYsMTQ1LDIwNiwxMDUsCisgICAgIDE0LDEzMywgODAsMTI2LDIzMiwyMTQsMjA4LCAgNywgOTcsMjMwLCA5NywxMzksMTk1LDEyNiwgMTIsIDM5LAorICAgIDEzMywxMzUsMTMzLCA4NywxMzQsIDYzLDE0MiwxMTIsMTM2LCA4OCwgMjYsMjA5LCA0OSwxNTEsIDUzLDExOSwKKyAgICAyMDksMjIwLCA2NywxMTUsMjIzLCA2OCwyNTAsIDY4LDE1MCwgNjgsMjIyLDE1NSwxMDMsIDQ5LCA3OSwgNTcsCisgICAgMTc1LCA0NSwgNzQsIDUzLCA0MiwgNjIsMTcwLCA0NiwxMDYsIDYwLDIxOCwgNTUsMTg2LCA1MiwxODYsIDYzLAorICAgIDE5OCwgNDYsMTAyLCA4OSwyMDQsMjEzLCA4OCwxNTcsIDg4LCA3MywxMDgsIDc1LCAyOCwgNTcsIDQ2LCA0MiwKKyAgICAxNzQsIDU0LDExMCwxMDgsMTkwLDIyMywyNTIsMjM3LDI0MywxMzUsMjI2LDE1NywyMjYsIDExLDIyNywxMjMsCisgICAgIDIzLDE1MiwgNDcsMjAwLCA5MywxMTIsMTIxLDE2MSwyMDYsMTk0LDI0NCwxMzMsMTY3LCAyMiwxNjksIDQ2LAorICAgICAxOCwgNDQsIDU4LDE1MCwgNjQsIDc2LDEzNiwgNzgsIDU2LDE0OCwyNDAsIDY1LCAxNiwgNDIsMTY4LCAyMiwKKyAgICAxNDAsIDM3LDI0MiwgMTksMTE5LCAzNywxNDIsIDEwLDEyMSwxOTQsIDI5LDE5NCwxMDMsIDM0LCA0NywyMDksCisgICAgIDU0LDIwOSwxMzYsMjE2LCA2NywgOTIsIDQyLCAzMCwgNzgsMjQyLCA3MiwgNDIsIDc3LDEyMiwxNDYsMjM2LAorICAgIDE0NSwxODgsIDUzLDEyMSwgMzYsMTk3LCA1MSwxNjUsIDQ0LDIyOSwxODUsMTMyLCAzOSwxNjksMTQ0LDE4OCwKKyAgICAgNzYsIDEzLCA3NiwyMjEsMTU1LCA1OCwxNTgsIDIyLDE1NCwxMTgsIDMyLDEwOSwgNTAsIDYxLCA1OCwxODksCisgICAgIDQ5LDEzMSwxNDYsMTQ1LDE0NCwxMTMsIDY2LDE3MCwgMzMsIDc3LDE0NywxODIsMTAzLDIzNCwxMDMsMjMwLAorICAgIDEwMiwxMTgsMjAzLDE3MiwxMDEsMTMzLDE3OCwyNTQsMTk3LDExMCwxMzksMTgzLCA0NywgMzAsMTQ5LCAgNywKKyAgICAyMDEsMTA3LDE3OSwxNDQsMTcyLCAgNSwgODksIDQ1LCAxMCwxODIsIDY2LDE2NiwyMzIsIDg0LCA5MCwgNDAsCisgICAgMjE1LCA0MiwgIDcsMTc4LDEwMywxMDEsIDg3LDEwMiwxOTEsMjA1LDEzNywyMDIsIDU3LDE1MCwxNzEsMTU4LAorICAgICA0MywyMDUsMjM3LDIwNCwxNzksMjAyLDIxOSwxNDQsIDU1LDE1NiwyMzksMTU5LDI1NSwyMzcsIDE4LDE5NCwKKyAgICAgMTgsMjI1LDE0NiwxODIsMTY1LDEzNCwgNzUsIDg3LCA0NSwgMjksIDg4LDIzMCwxODksMTcyLDEwNiwgNTcsCisgICAgMTc4LCA2MCwxMTMsMTIxLDIxOSwgMTAsMjI3LCAyMSwgIDUsIDQzLDEzNCwgODYsICA2LDE3MiwgNjAsMTg0LAorICAgIDEzOCwxODIsIDQyLDEwOSwyMTMsIDc5LDE3MSwyMzcsIDg3LDE1MSwxNzQsMTI2LDE4OSwgMzgsMTIyLCA3NywKKyAgICAxMDcsMTI5LCA5NCwxOTMsMjAyLDEzMCwxOTMsMTgxLCAgMSwxMDcsMjM1LCAxMSwgODUsIDEwLDIyOSwxMzMsCisgICAgMTI1LDIzNSwyMjAsMjE1LDIzNywgOTMsIDc5LCA4OCwgNDcsIDg5LDIyMywxODEsIDk3LDI1MCwxMzQsMTU3LAorICAgICAyNywgNjIsIDIxLDEzNywxMzgsMTc0LCAyMCwyMTksIDIzLDE1MSwgMjEsMTI3LDIxNiwgNDAsMjIwLDEyMCwKKyAgICAyMjksIDI3LDEzNSwxMTEsMjAyLDE5MSwxNTMsMjIwLDE0OCwxODAsMTY5LDE3MSwxOTYsMTg1LDEwMCwyMDcsCisgICAgMTAyLDIxMCwxMDIsMjMzLDIzMCwyMjIsIDQ1LDE1OCwgOTEsIDE0LDE1MCwxNzAsMTUxLDIzMCwxNTEsIDE0LAorICAgIDExMCwgMTMsMjE3LDIxOCwxODAsIDEzLDIyMywgODYsMTgwLDIzNywyNDUsMjQ2LCA2OSwyMTksIDQ3LDE1MSwKKyAgICAyMDUsIDQwLDIxOSwxODcsMTMxLDE4MiwgNjcsMTg1LDE2MywxOTEsIDYwLDE4NCwxODgsMTAxLDE2NywyMDEsCisgICAgMjA2LDIwNSwgNTksIDYzLCA4NCwxNjQsIDg0LDI0NCwgODQsMjUwLCA4NCwgNTQsMjM4LDIxMCwyMjEsMTgxLAorICAgICA5NywyMTUsMjQ4LDExMCwyMDksMjM4LCAyNywxMjMsMTg4LDI0NiwgNTIsMjM2LDIxMywyMTksIDkxLDE4OCwKKyAgICAyNDcsMjUzLCA2MiwyMDEsMTkwLDIxOSwgODUsICAxLCA4NSwgNzcsMjEzLDEwMiwyMTMsMTAxLDI1MSwgNzMsCisgICAgMjUxLDE3OSwyNDcsIDYzLDE3NCwxMzcsMTcwLDIzMywyNDgsMTUwLDI1MSwxMDksIDkzLDE3MywgNzgsMTA5LAorICAgIDExMywyMzcsMTk5LCAgMywyMTAsICAzLDI1MywgIDcsIDM1LCAxNCwxODIsMjE1LDE4NSwyMTIsMjEzLCAyOSwKKyAgICAyMTAsIDYxLCA4NCwgODIsMTQzLDIxNCwgNDMsMjM1LCA3MSwgMTQsMTk5LCAzMSwxOTAsMjU0LDE1NywyMzksCisgICAgMTE5LCA0NSwgMTMsIDU0LCAxMywgODUsMTQxLDE1NiwxOTgsMjI2LCAzNSwxMTIsIDY4LDEyMSwyMjgsMjMzLAorICAgIDI0NywgIDksMjIzLDI0NywgMzAsIDEzLCA1OCwyMTgsMTE4LDE0MCwxMjMsMTcyLDIyNSwgIDcsMjExLCAzMSwKKyAgICAxMTgsIDI5LDEwMywgMjksIDQ3LDEwNiwgNjYsMTU0LDI0MiwxNTQsIDcwLDE1NSwgODMsMTU0LDI1MSwgOTEsCisgICAgIDk4LCA5MSwxODYsIDc5LDIwNCwgNjIsMjA5LDIxNCwyMzQsMjIyLDEyMiwyNTIsIDcxLDIxOSwgMzEsIDE1LAorICAgIDE1NiwgNTIsIDYwLCA4OSwxMjEsIDc0LDI0MywgODQsMjAxLDEwNSwyMTgsMjMzLDEzMCwyMTEsMTQ3LDEwMywKKyAgICAyNDIsMjA3LDE0MCwxNTcsMTQ5LDE1NywxMjUsMTI2LCA0NiwyNDksMjIwLCA5NiwyMTksMTYyLDE4MiwxMjMsCisgICAgMjMxLCA5OSwyMDYsMjIzLDEwNiwgMTUsMTExLDIzOSwxODYsIDE2LDExNiwyMjUsMjEwLCA2OSwyNTUsMTM5LAorICAgIDIzMSwgNTksMTg4LCA1OSwyMDYsIDkyLDI0MiwxODQsMTE2LDI0MiwxNzgsMjE5LDIyOSwgMTksIDg3LDE4NCwKKyAgICAgODcsMTU0LDE3NSwgNTgsIDk1LDEwOSwyMzQsMTE2LDIzNCwgNjAsMjU0LDE0NywyMTEsIDc5LDE5OSwxODcsCisgICAgMTU2LDE4NywxNTQsMTc0LDE4NSwgOTIsMTA3LDE4NSwyMzgsMTIyLDE4OSwxODEsMTIzLDEwMiwyNDcsMjMzLAorICAgICAyNywxNTgsIDU1LDIwNiwyMjEsMjQ0LDE4OSwxMjEsMjQxLCAyMiwyNTUsMjE0LDIxMywxNTgsIDU3LCA2MSwKKyAgICAyMjEsMTg5LDI0MywxMjIsMTExLDI0NywxOTcsMjQ3LDI0NSwyMjMsIDIyLDIyMSwxMjYsMTE0LCAzOSwyNTMsCisgICAgMjA2LDIwMywxODcsMjE3LDExOSwgMzksMjM4LDE3MywxODgsIDc5LDE4OCwgOTUsMjQ0LCA2NCwyMzcsIDY1LAorICAgIDIxNywgNjcsMjIxLDEzNSwyMTMsIDYzLCA5MSwyNTQsMjIwLDIxNiwyMzksMjIwLDEyNywxMDYsMTkyLDExOSwKKyAgICAxNjAsMjQzLDIwOSwyMjAsIDcxLDI0NywgIDYsMTMzLDEzMSwyMDcsMjU0LDE0NSwyNDUsMTQzLCAxNSwgNjcsCisgICAgICA1LDE0MywxNTMsMTQzLDIwMywxMzQsIDEzLDEzNCwyMzUsMTU4LCA1NiwgNjIsIDU3LCA1NywyMjYsIDYzLAorICAgIDExNCwyNTMsMjMzLDI1MiwxNjcsIDY3LDIwNywxMDAsMjA3LCAzOCwxNTgsIDIzLDI1NCwxNjIsMjU0LDIwMywKKyAgICAxNzQsIDIzLCAyMiwgNDcsMTI2LDI0OCwyMTMsMjM1LDIxNSwyMDYsMjA5LDE1MiwyMDksMTYxLDE1MSwyNDIsCisgICAgMTUxLDE0NywxOTEsMTA5LDEyNCwxNjUsMjUzLDIzNCwxOTIsMjM1LCAyNSwxNzUsMjE5LDE5OCwxOTQsMTk4LAorICAgICAzMCwxOTAsMjAxLDEyMCwgNTEsIDQ5LCA5NCwyNDQsIDg2LDI1MSwyMzcsMTkzLDExOSwyMjAsMTE5LCAyOSwKKyAgICAyMzksMTYzLDIyMywgMTUsIDc5LDIyOCwxMjQsIDMyLDEyNywgNDAsMjU1LDEwNCwyNDksMTc3LDI0NSwgODMsCisgICAgMjA4LDE2NywyNTEsMTQ3LCAyNSwxNDcsMTQ3LDI1NSwgIDQsICAzLDE1MiwyNDMsMjUyLCA5OSwgNTEsIDQ1LAorICAgIDIxOSwgIDAsICAwLCAgMCwgMzIsIDk5LCA3MiwgODIsIDc3LCAgMCwgIDAsMTIyLCAzNywgIDAsICAwLDEyOCwKKyAgICAxMzEsICAwLCAgMCwyNDksMjU1LCAgMCwgIDAsMTI4LDIzMywgIDAsICAwLDExNywgNDgsICAwLCAgMCwyMzQsCisgICAgIDk2LCAgMCwgIDAsIDU4LDE1MiwgIDAsICAwLCAyMywxMTEsMTQ2LCA5NSwxOTcsIDcwLCAgMCwgIDAsICAyLAorICAgICA4OSwgNzMsIDY4LCA2NSwgODQsMTIwLDIxOCwyMzYsMTU2LCA1OSwgNzksMjE5LCA5NiwgMjAsMTM0LCA2NywKKyAgICAxOTYsICAyLCAyMCwxNTAsIDg2LCA5NywgMzMsIDgzLCA0MywxNzksIDgwLCA1MywgNDMsMjA4LDE0MSwxNzAsCisgICAgIDk4LDIzMywgOTAsMTUwLCA3MiwyMjksIDU1LDEzMiwyMDMsMTM2LCA4NCwxOTYsIDY4LDE2MywxNDIsMjA0LAorICAgICA2OSwxNzYsIDIwLCAgOSwgMjEsIDQxLCA3NSwgODUsIDUzLCAzNSwgIDksIDk5LCAxNiwgODMsMjExLDE5MiwKKyAgICAgMTgsMTY2LCAgOCwxNTAsMTUwLDIwMywyMDIsMTEyLDIwNiwgNzMsIDIwLCA4NywgODYsIDc2LDEwOCwgODIsCisgICAgIDk4LCA2MywyMDcsMjQyLDIwMiwgNzgsMjM2LCA0NywgNTgsIDYyLDE3NSwxOTEsMTM5LDIyNywgNTEsIDQ4LAorICAgIDI1MSwxMjIsMTAzLDE2NywyNDYsIDU5LDI0MSwgNjQsIDYwLDEyNSwgNDMsMjM0LDEyNCwgODYsMjUzLCAzNSwKKyAgICAyNTAsMTA4LDE5MCwyNTMsMTIzLDIwNiwxNjcsICA0LCA2NCwxNDcsMjM0LCA3NCwyNTEsMjQ2LDE5NywxMTksCisgICAgMjIxLCA2MywxNjYsMTU0LCAxOSwxODksMjUyLCAxNywxMTgsMjAzLCAgMywyMjUsIDI2LDE5NCwyMDEsMTM5LAorICAgIDE5MCwgOTEsIDM5LDIwOSwxNjEsMTE5LDE5OCwgNDEsMTcyLDIzMywyNDYsMTE0LDIwOCwgNTEsIDE0LCAgNiwKKyAgICAgNTksMTI0LDE2MiwgMzMsMTg2LDI0MCwgNjYsIDEzLCA0OCwxNzAsIDMxLCA5NiwgIDQsMjMyLCAgMSwxMTgsCisgICAgMTk1LCA5MywgNzQsMTgwLDI0NywgMzIsIDk1LDEwNywxNjIsMjMxLDE2OSwgMzAsMjQ1LCAxNiwxMTUsMTcxLAorICAgIDE2MiwyMzksMTU5LDExNSwgODEsMjI0LDI0MSwxNzgsMTE5LCA0MiwgOTAsMjIwLDI0NCwxMjMsIDY4LDI0MiwKKyAgICAxMjYsIDEzLDEyNCwgNDAsIDk3LCAgNCwyMzIsIDMxLCA0NCwgNzksIDQ1LDExMSwgNjcsIDUxLDEzMiwxNTcsCisgICAgMTEyLDIzMCwxMzIsIDMyLCA2NywyNTUsIDk3LDEyMSwyMTksMjE3LCAyNCwgNzMsMTI3LCA2NywgMzUsMTQwLAorICAgICAgMCwgODEsIDUwLDEzNCwyMjksMTgxLDExMSwgNjcsMjE2LDExNCwgNDEsIDY3LCAzNSwxMzYsMjQyLCA4MCwKKyAgICAyMDIsIDIyLDEzMywgNTgsIDI2LCA5OCwyNDEsMTM2LDE2MCwgNjUsMjQ0LDE3NywyMTMsMjA5LCAyMiwxNzQsCisgICAgMTAxLCA4NywxMjMsMTQyLDIwOCwgOTIsIDYyLCAgNSwxMzYsIDQ4LDE4MiwxMDgsMjM1LDI1MiwgMjEsMTczLAorICAgICA0NiwxODcsMTIyLDEzNiwxODUsIDUxLDEzMCwgIDQsMjQxLDE2MywxNDksMjQ3LDIxOCwgNjcsIDEyLDIzNywKKyAgICAxMzgsMTAyLDE3NCwgIDksIDE0LDE5NiwxNDMsMjA0LCA0MywyNDMsMTI5LDI0NiwgMTYsMTQ3LDEyMSwxMzAsCisgICAgICAyLCA0OCwxNTMsIDg3LCA2NywxNjQsIDI3LCAgNCwgIDMsIDMyLDIyMSwgODAsIDY3LCA1NiwgODcsICA0LAorICAgICAgMywxOTIsMTg1LCA3NCwgMTgsICA0LDEyOCwgMjIsIDI0LCAgMiwgIDAsIDY3LCAgMCwgOTYsICA4LCAgMCwKKyAgICAxOTEsMTM0LDE2OCwxNjcsICA4LCAgNSwgNjQsIDYxLDEwMSwxMzQsIDU2LCAzMiwgMjQsICAwLDI0NSwgIDMsCisgICAgIDUzLDEzMiwxODksMTgwLCAxMywgMTYsMTAzLDE3MCwgNTcsIDUzLDEzMiwgODUsIDQ3LDExMiwgODcsIDU5LAorICAgICAgMCwxMzYsMTMzLCAxNywgODYsMjA0LCAgNywxNzQsIDczLDExNywxNjksIDY4LDExMiwgMzIsMTI2LDE4MCwKKyAgICAyNDIsMjIyLDEwMSwxMzYsMjQyLDE0OCwxNDIsMTY1LDE5OCwgIDksIDE4LCA2OCwgMzEsIDI3LCAyNSwgODksCisgICAgMjIyLDEyMywgNDYsMTg3LDIzOCwyMTMsICA4LCAyMiwgNjgsMTU5LCA0NywyMTEsMjM4LCA2MSwgMzAsMTM0LAorICAgIDE3NiwxMzAsIDc5LCA2OSwyMzQsIDQzLCA2NSwgIDQsMTc3LDE4OCwyNTQsMTgzLDE3NiwgODksMTM1LCAgNywKKyAgICAxMTUsMjE0LCA4MywgNDgsMjE3LDEzNCwgNDAsIDc3LDE1OCwxODksIDcxLCA2NCwgNjIsMTU5LCA4NCwxMTEsCisgICAgMTA5LCA0OSwxODMsMTI4LDI1NCwxOTcsMjQyLDIxNCwyNDIsMjE2LCAyNywxNTksMTY1LCA0NCwxMTEsMTc5LAorICAgIDE2MiwgMjcsMTg2LCA3NywxNTcsIDM4LDIzMiwgIDcsIDc0LCA0NywgNjksMTgzLDEwMywyNTIsIDMwLDIwOSwKKyAgICAxMDEsMTA5LCA4NywxMDcsMjI0LCA1NiwxNjMsICA2LCA1NywgMjAsIDI5LDIyMiwyMjksIDM0LDE5MiwyNTUsCisgICAgMjI3LCA3MCwxMTEsMjIwLDIxOSwxNzksMTYyLDE0OSwyMDIsMTI1LDIwNywgMTYsMTc2LDIxNiwxNzcsIDUzLAorICAgIDI0OCwyMzUsMTU1LDIzMiwxNTUsMTQzLDE2MiwyMTEsIDU4LDEyMywxODMsMjUwLCA3OCwgIDAsIDE1LCA2NSwKKyAgICAxMTUsMjE3LDE4MCwgNDQsMjUwLDExNSwgNjgsIDcxLCA1MiwxNDksMTEwLDIwNywgNTYsIDI0LDIwNiwgMTUsCisgICAgMTc5LCAzMywgODUsIDY1LDE4MywgMTEsMjUxLDE2MiwgMjUsIDQ1LCA1NCwxMDcsMTExLDIyOCwyMTcsMTcxLAorICAgIDE3MCwxNDgsMjAxLDEzNSwxMTAsIDM4LDE5NSwyNDYsIDM5LDIxMiwyMzQsIDE5LDE0MywgMzAsIDMyLCAyNywKKyAgICAxODAsMTY1LCA1OSwgIDAsICAwLCAgMCwyNTUsMjU1LCAgMywgIDAsIDk3LDE2OCwxNDIsIDgyLCAxNCwyMzYsCisgICAgIDE3LDExMywgIDAsICAwLCAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfc2VuZF9wbmdbMzU2MV0gPSB7CisgICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCwgIDAsICAwLCAgMCwgMTMsIDczLCA3MiwgNjgsIDgyLAorICAgICAgMCwgIDAsICAwLCA0NiwgIDAsICAwLCAgMCwgNDcsIDE2LCAgNiwgIDAsICAwLCAgMCwyMDQsMTE3LCAzNiwKKyAgICAyMDksICAwLCAgMCwgIDAsICA5LDExMiwgNzIsIDg5LDExNSwgIDAsICAwLCAxMSwgMTksICAwLCAgMCwgMTEsCisgICAgIDE5LCAgMSwgIDAsMTU0LDE1NiwgMjQsICAwLCAgMCwgMTAsIDc5LDEwNSwgNjcsIDY3LCA4MCwgODAsMTA0LAorICAgIDExMSwxMTYsMTExLDExNSwxMDQsMTExLDExMiwgMzIsIDczLCA2NywgNjcsIDMyLDExMiwxMTQsMTExLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwgIDAsICAwLDEyMCwyMTgsMTU3LCA4MywxMDMsIDg0LCA4MywyMzMsIDIyLCA2MSwyNDcsCisgICAgMjIyLDI0NCwgNjYsIDc1LDEzNiwxMjgsMTQ4LCA3NSwxMTEsIDgyLCAyMSwgIDgsIDMyLCA4MiwgNjYsMTM5LAorICAgIDEyOCwgMjAsMTQ1LCAzOCwgNDIsIDMzLCAgOSwgMTYsIDc0LDEzNiwgMzMsMTYxLDIxNywgMjEsIDgxLDE5MywKKyAgICAgMTcsIDY5LCA2OSwgIDQsIDI3LDIwMCwxNjAsMTM2LCAgMywxNDIsMTQyLDEyOCwxNDAsIDIxLCA4MSwgNDQsCisgICAgIDEyLDEzOCwgMTAsMjE2LCAgNywyMjgsIDMzLDE2MiwxNDIsMTMxLDE2MywxMzYsMTM4LDIwMiwyNTEsMjI1LAorICAgIDEyMywxNjMsMTA3LDIxNCwxODgsMjQ3LDIzMCwyMDUsMjU0LDE4MSwyMTUsIDYyLDIzMSwxNzIsMjQzLDE1NywKKyAgICAxNzksMjA3LCAgNywxOTIsICA4LCAxMiwxNTAsIDcyLCA1MSwgODEsIDUzLDEyOCwgMTIsMTY5LCA2NiwgMzAsCisgICAgIDE3LDIyNCwxMzEsMTk5LDE5NiwxOTgsMjI1LDIyOCwgNDYsIDY0LDEyOSwgMTAsIDM2LDExMiwgIDAsIDE2LAorICAgICAgOCwxNzksMTAwLCAzMywxMTUsMjUzLCAzNSwgIDEsICAwLDI0OCwxMjYsIDYwLCA2MCwgNDMsIDM0LDE5MiwKKyAgICAgIDcsMTkwLCAgMCwgIDEsMTIwLDIxMSwgMTEsICA4LCAgMCwxOTIsIDc3LDE1NSwxOTIsIDQ4LCAyOCwxMzUsCisgICAgMjU1LCAxNSwyMzQsIDY2LDE1MywgOTIsICAxLDEyOCwxMzIsICAxLDE5MiwxMTYsMTQ1LCA1NiwgNzUsICA4LAorICAgIDEyOCwgMjAsICAwLCA2NCwxMjIsMTQyLCA2NiwxNjYsICAwLCA2NCwgNzAsICAxLDEyOCwxNTcsMTUyLCAzOCwKKyAgICAgODMsICAwLDE2MCwgIDQsICAwLCA5NiwyMDMsIDk5LCA5OCwyMjcsICAwLCA4MCwgNDUsICAwLCA5NiwgMzksCisgICAgMTI3LDIzMCwyMTEsICAwLDEyOCwxNTcsMjQ4LDE1MywxMjMsICAxLCAgMCwgOTEsMTQ4LCAzMywgMjEsICAxLAorICAgIDE2MCwxNDUsICAwLCAzMiwgMTksMTAxLDEzNiwgNjgsICAwLDEwNCwgNTksICAwLDE3MiwyMDcsIDg2LDEzOCwKKyAgICAgNjksICAwLCA4OCwgNDgsICAwLCAyMCwxMDIsIDc1LDE5NiwgNTcsICAwLDIxNiwgNDUsICAwLCA0OCwgNzMsCisgICAgIDg3LDEwMiwgNzIsICAwLDE3NiwxODMsICAwLDE5MiwyMDYsIDE2LCAxMSwxNzgsICAwLCAgOCwgMTIsICAwLAorICAgICA0OCwgODEsMTM2LDEzMywgNDEsICAwLCAgNCwxMjMsICAwLCA5NiwyMDAsIDM1LCAzNSwxMjAsICAwLDEzMiwKKyAgICAxNTMsICAwLCAyMCwgNzAsMjQyLCA4NywgNjAsMjQxLCA0MywxNzQsIDE2LDIzMSwgNDIsICAwLCAgMCwxMjAsCisgICAgMTUzLDE3OCwgNjAsMTg1LCAzNiwgNTcsIDY5LDEyOSwgOTEsICA4LCA0NSwxMTMsICA3LCA4NywgODcsIDQ2LAorICAgICAzMCwgNDAsMjA2LCA3MywgMjMsIDQzLCAyMCwgNTQsIDk3LCAgMiwgOTcsMTU0LCA2NCwgNDYsMTk0LDEyMSwKKyAgICAxNTMsIDI1LCA1MCwxMjksIDUyLCAxNSwyMjQsMjQzLDIwNCwgIDAsICAwLDE2MCwxNDUsIDIxLCAxNywyMjQsCisgICAgMTMxLDI0MywyNTMsMTIwLDIwNiwgMTQsMTc0LDIwNiwyMDYsIDU0LDE0MiwxODIsIDE0LCA5NSwgNDUsMjM0LAorICAgIDE5MSwgIDYsMjU1LCAzNCwgOTgsIDk4LDIyNywyNTQsMjI5LDIwNywxNzEsMTEyLCA2NCwgIDAsICAwLDIyNSwKKyAgICAxMTYsMTI2LDIwOSwyNTQsIDQ0LCA0NywxNzksIDI2LDEyOCwgNTksICA2LDEyOCwxMDksMjU0LDE2MiwgMzcsCisgICAgMjM4LCAgNCwxMDQsIDk0LCAxMSwxNjAsMTE3LDI0NywxMzksMTAyLDE3OCwgMTUsIDY0LDE4MSwgIDAsMTYwLAorICAgIDIzMywyMTgsIDg3LDI0MywxMTIsMjQ4LDEyNiwgNjAsIDYwLCA2OSwxNjEsMTQ0LDE4NSwyMTcsMjE3LDIyOSwKKyAgICAyMjgsMjI4LDIxNiwgNzQsMTk2LCA2NiwgOTEsIDk3LDIwMiwgODcsMTI1LDI1NCwxMDMsMTk0LCA5NSwxOTIsCisgICAgIDg3LDI1MywxMDgsMjQ5LDEyNiwgNjAsMjUyLDI0NywyNDUsMjI0LDE5MCwyMjYsIDM2LDEyOSwgNTAsIDkzLAorICAgIDEyOSwgNzEsICA0LDI0OCwyMjQsMTk0LDIwNCwyNDQsIDc2LDE2NSwgMjgsMjA3LDE0NiwgIDksMTMyLCA5OCwKKyAgICAyMjAsMjMwLDE0MywgNzEsMjUyLDE4MywgMTEsMjU1LDI1MiwgMjksMjExLCAzNCwxOTYsIDczLCA5OCwxODUsCisgICAgIDg4LCA0MiwgMjAsMjI3LCA4MSwgMTgsMTEzLDE0MiwgNjgsMTU0LDE0MCwyNDMsIDUwLDE2NSwgMzQsMTM3LAorICAgICA2NiwxNDYsIDQxLDE5NywgMzcsMjEwLDI1NSwxMDAsMjI2LDIyMywgNDQsMjUxLCAgMywgNjIsMjIzLCA1MywKKyAgICAgIDAsMTc2LDEwNiwgNjIsICAxLDEyMywxNDUsIDQ1LDE2OCwgOTMsIDk5LCAgMywyNDYsIDc1LCAzOSwgMTYsCisgICAgIDg4LDExNiwxOTIsMjI2LDI0NywgIDAsICAwLDI0MiwxODcsMTExLDE5MywyMTIsIDQwLCAgOCwgIDMsMTI4LAorICAgIDEwNCwxMzEsMjI1LDIwNywxMTksMjU1LDIzOSwgNjMsMjUzLCA3MSwxNjAsIDM3LCAgMCwxMjgsMTAyLCA3MywKKyAgICAxNDYsMTEzLCAgMCwgIDAsIDk0LCA2OCwgMzYsIDQ2LCA4NCwyMDIsMTc5LCA2MywxOTksICA4LCAgMCwgIDAsCisgICAgIDY4LDE2MCwxMjksIDQyLDE3NiwgNjUsIDI3LDI0NCwxOTMsIDI0LCA0NCwxOTIsICA2LCAyOCwxOTMsICA1LAorICAgIDIyMCwxOTMsIDExLDI1MiwgOTYsIDU0LDEzMiwgNjYsIDM2LDE5NiwxOTQsIDY2LCAxNiwgNjYsIDEwLDEwMCwKKyAgICAxMjgsIDI4LDExNCwgOTYsIDQxLDE3MiwxMzAsIDY2LCA0MCwxMzQsMjA1LDE3NiwgMjksIDQyLCA5NiwgNDcsCisgICAgMjEyLCA2NCwgMjksIDUyLDE5MiwgODEsMTA0LDEzNCwxNDcsMTEyLCAxNCwgNDYsMTk0LCA4NSwxODQsIDE0LAorICAgICA2MSwxMTIsIDE1LDI1MCwgOTcsICA4LDE1OCwxOTMsIDQwLDE4OCwxMjksICA5LCAgNCwgNjUsMjAwLCAgOCwKKyAgICAgMTksIDk3LCAzMywyMTgsMTM2LCAgMSwgOTgsMTM4LCA4OCwgMzUsMTQyLCAgOCwgMjMsMTUzLDEzMywyNDgsCisgICAgIDMzLDE5MywgNzIsICA0LCAxOCwxMzksIDM2LCAzMiwyMDEsMTM2LCAyMCwgODEsIDM0LCA3NSwxNDUsIDUzLAorICAgICA3MiwgNDksIDgyLDEzOCwgODQsIDMyLCA4NSwgNzIsIDI5LDI0MiwgNjEsMTE0LCAgMiwgNTcsMTM1LCA5MiwKKyAgICAgNzAsMTg2LDE0NSwgNTksMjAwLCAgMCwgNTAsMTMwLDI1MiwxMzQsMTg4LCA3MSwgNDksMTQ4LDEyOSwxNzgsCisgICAgIDgxLCA2MSwyMTIsIDEyLDE4MSwgNjcsMTg1LDE2OCwgNTUsIDI2LDEzMiwgNzAsMTYyLCAxMSwyMDgsMTAwLAorICAgIDExNiwgNDksMTU0LDE0MywgMjIsMTYwLDE1NSwyMDgsMTE0LDE4MCwgMjYsIDYxLDE0MCwgNTQsMTYxLDIzMSwKKyAgICAyMDgsMTcxLDEwNCwgMTUsMjE4LDE0MywgNjIsIDY3LDE5OSwgNDgsMTkyLDIzMiwgMjQsICA3LCA1MSwxOTYsCisgICAgMTA4LCA0OCwgNDYsMTk4LDE5NSwgNjYsMTc3LCA1NiwgNDQsICA5LDE0NywgOTksMjAzLDE3NywgMzQsMTcyLAorICAgICAxMiwxNzEsMTk4LCAyNiwxNzYsIDg2LDE3MiwgIDMsMTg3LDEzNywyNDUsIDk5LDIwNywxNzcsMTE5LCAgNCwKKyAgICAgMTgsMTI5LCA2OSwxOTIsICA5LCA1NCwgIDQsMTE5LCA2NiwgMzIsIDk3LCAzMCwgNjUsIDcyLCA4OCwgNzYsCisgICAgIDg4LCA3OCwyMTYsIDcyLDE2OCwgMzIsIDI4LCAzNiwgNTIsIDE3LDIxOCwgIDksIDU1LCAgOSwgIDMsMTMyLAorICAgICA4MSwxOTQsIDM5LCAzNCwxNDcsMTY4LCA3NSwxODAsIDM4LDE4NiwgMTcsMjQ5LDE5NiwgMjQsIDk4LCA1MCwKKyAgICAgNDksMTM1LCA4OCwgNzIsIDQ0LCAzNSwyMTQsIDE4LDE0MywgMTksIDQ3LCAxNiwxMjMsMTM2LCA2NywxOTYsCisgICAgIDU1LCAzNiwgMTgsMTM3LCA2NywgNTAsIDM5LDE4NSwxNDQsICAyLCA3MywxNzcsMTY0LCA4NCwyMTAsIDE4LAorICAgIDIxMCwgNzAsMjEwLDExMCwgODIsIDM1LDIzMywgNDQsMTY5LDE1NSwgNTIsIDcyLCAyNiwgMzUsMTQ3LDIwMSwKKyAgICAyMTgsMTAwLDEwNywxNzgsICA3LCA1NywxNDgsIDQ0LCAzMiwgNDMsMjAwLDEzMywyMjgsMTU3LDIyOCwxOTUsCisgICAgMjI4LCA1MSwyMjgsIDI3LDIyOCwgMzMsMjQyLCA5MSwgMTAsMTU3LCA5OCwgNjQsMTEzLDE2NCwyNDgsIDgzLAorICAgIDIyNiwgNDAsIDgyLDIwMiwxMDYsIDc0LCAyNSwyMjksIDE2LDIyOSwgNTIsMjI5LCAgNiwxMDEsMTUyLCA1MCwKKyAgICAgNjUsIDg1LDE2MywxNTQsIDgyLDIyMSwxNjgsMTYxLCA4NCwgMTcsIDUzLDE0MywgOTAsIDY2LDE3MywxNjEsCisgICAgMTgyLCA4MiwxNzUsIDgxLDEzNSwxNjgsIDE5LCA1MiwxMTcsMTU0LCA1NywyMDUsMTMxLCAyMiwgNzMsIDc1LAorICAgIDE2NSwxNzMsMTYyLDE0OSwyMTEsIDI2LDEwNCwgMjMsMTA0LDI0NywxMDUsMTc1LDIzMiwxMTYsMTg2LCAxNywKKyAgICAyMjEsMTQ5LCAzMCwgNzgsMTUxLDIwOCwgODcsMjEwLDIwMywyMzMsIDcxLDIzMiwxNTEsMjMyLCAgMywyNDQsCisgICAgMTE5LCAxMiwgMTMsMTM0LCAyMSwxMzEsMTk5LDEzNiwxMDMsIDQwLCAyNSwxNTUsIDI0LCAgNywgMjQsMTAzLAorICAgICAyNSwxMTksIDI0LDE3NSwxNTIsIDc2LDE2NiwgMjUsMjExLDEzOSwgMjUsMTk5LCA4NCwgNDgsIDU1LCA0OSwKKyAgICAyMzUsMTUyLDIzMSwxNTMsIDE1LDE1MywxMTEsIDg1LCA4OCwgNDIsMTgyLCA0MiwxMjQsIDIxLDE0NSwyMDIsCisgICAgIDEwLDE0OSwgNzQsMTQ5LCAzOCwxNDksIDI3LCA0MiwgNDcsIDg0LDE2OSwxNzAsMTY2LDE3MCwyMjIsMTcwLAorICAgICAxMSwgODUsMjQzLCA4NSwyMDMsIDg0LDE0MywxNjksIDk0LCA4MywxMjUsMTc0LCA3MCwgODUsIDUxLCA4MywKKyAgICAyMjcsMTY5LCAgOSwyMTIsMTUwLDE3MSwgODUsMTcwLDE1NywgODAsMjM1LCA4MywgMjcsIDgzLDEwMywxNjksCisgICAgIDU5LDE2OCwxMzUsMTcwLDEwMywxNjgsMTExLCA4NCwgNjMsMTY0LDEyNiwgODksMjUzLDEzNywgIDYsIDg5LAorICAgIDE5NSwgNzYsMTk1LCA3OSwgNjcsMTY0LCA4MSwxNjAsMTc3LCA5NSwyMjcsMTg4LDE5OCwgMzIsIDExLCA5OSwKKyAgICAgMjUsMTc5LDEyMCwgNDQsIDMzLDEwNywgMTMsMTcxLDEzNCwxMTcsMTI5LCA1MywxOTYsIDM4LDE3NywyMDUsCisgICAgMjE3LDEyNCwxMTgsIDQyLDE4NywxNTIsMjUzLCAyOSwxODcsMTM5LCA2MSwxNzAsMTY5LDE2MSwgNTcsIDY3LAorICAgICA1MSwgNzQsIDUxLCA4NywxNzksIDgyLDI0MywxNDgsMTAyLCA2MywgIDcsMjI3LDE1MiwxMTMsMjQ4LDE1NiwKKyAgICAxMTYsIDc4LCAgOSwyMzEsIDQwLDE2NywxNTEsMjQzLDEyNiwxMzgsMjIyLCAyMCwyMzksIDQxLDIyNiwgNDEsCisgICAgIDI3LDE2NiwgNTIsIDc2LDE4NSwgNDksMTAxLCA5MiwxMDcsMTcwLDE1MCwxNTEsMTUwLCA4OCwxNzEsIDcyLAorICAgIDE3MSwgODEsMTcxLCA3MSwyMzUsMTg5LCA1NCwxNzQsMjM3LDE2NywxNTcsMTY2LDE4OSwgNjksMTg3LCA4OSwKKyAgICAyNTEsMTI5LCAxNCwgNjUsMTk5LCA3NCwgMzksIDkyLCAzOSwgNzEsMTAzLDE0MywyMDYsICA1LDE1NywyMzEsCisgICAgIDgzLDIxNywgODMsMjIxLDE2NywgMTAsMTY3LCAyMiwgNzcsIDYxLCA1OCwyNDUsMTc0LCA0NiwxNzAsMTA3LAorICAgIDE2NSwgMjcsMTYxLDE4NywgNjgsMTE5LDE5MSwxMTAsMTY3LDIzOCwxNTIsMTU4LDE5MCwgOTQsMTI4LDE1OCwKKyAgICAgNzYsMTExLDE2NywyMjIsMTIxLDE4OSwyMzEsMjUwLCAyOCwxMjUsIDQ3LDI1MywgODQsMjUzLDEwOSwyNTAsCisgICAgMTY3LDI0NSwgNzEsIDEyLCA4OCwgIDYsMTc5LCAxMiwgMzYsICA2LDIxOSwgMTIsMjA2LCAyNCwgNjAsMTk3LAorICAgICA1MywxMTMsMTExLCA2MCwgMjksIDQ3LDE5OSwyMTksMjQxLCA4MSwgNjcsIDkzLDE5NSwgNjQsIDY3LDE2NSwKKyAgICAgOTcsMTQ5LCA5NywxNTEsMjI1LDEzMiwxNDUsMTg1LDIwOSwgNjAsMTYzLDIxMywgNzAsMTQxLCA3MCwgMTUsCisgICAgMTQwLDEwNSwxOTgsIDkyLDIyNywgMzYsMjI3LDEwOSwxOTgsMTA5LDE5OCwxNjMsIDM4LCAgNiwgMzgsIDMzLAorICAgICAzOCwgNzUsIDc3LDIzNCwgNzcsMjM4LDE1NCwgODIsIDc3LDE4NSwxNjYsIDQxLDE2NiwgNTksIDc2LCA1OSwKKyAgICAgNzYsMTk5LDIwNSwyMDQsMjA1LDE2MiwyMDUsMjE0LDE1MywgNTMsMTU1LCA2MSwgNDksMjE1LCA1MCwyMzEsCisgICAgMTU1LDIzMSwxNTUsMjE1LDE1NSwyMjMsMTgzLCA5NiwgOTAsMTIwLCA5MCwgNDQsMTgyLDE2OCwxODIsMTg0LAorICAgIDEwMSwgNzMsMTc4LDIyOCwgOTAsMTY2LCA4OSwyMzgsMTgyLDE4OCwxMTAsMTMzLCA5MCwgNTcsIDg5LDE2NSwKKyAgICAgODgsIDg1LCA5MCwgOTMsMTc5LCA3MCwxNzMsMTU3LDE3MywgMzcsMjE0LDE4NywxNzMsMTg3LDE2NywgMTcsCisgICAgMTY3LDE4NSwgNzgsMTQ3LCA3OCwxNzEsMTU4LDIxNCwxMDMsMTk1LDE3NiwyNDEsMTgyLDIwMSwxODIsMTY5LAorICAgIDE4MywgMjUsMTc2LDIyOSwyMTYsICA2LDIxOSwxNzQsMTgyLDEwOSwxODIsMTI1LCA5NywxMDMsIDk4LCAyMywKKyAgICAxMDMsMTgzLDE5NywxNzQsMTk1LDIzOCwxNDcsMTg5LDE0NywxMjUsMTg2LDEyNSwxNDEsMjUzLCA2MSwgIDcsCisgICAgIDEzLDEzNSwyMTcsIDE0LDE3MSwgMjksIDkwLCAyOSwxMjYsMTE1LDE4MCwxMTQsIDIwLCA1OCwgODYsIDU4LAorICAgIDIyMiwxNTQsMjA2LDE1NiwyMzgsIDYzLDEyNSwxOTcsMjQ0LDE1MCwyMzMsIDQ3LDEwMywgODgsMjA3LCAxNiwKKyAgICAyMDcsMjE2LCA1MSwyMjcsMTgyLCAxOSwyMDMsIDQxLDE5NiwxMDUsMTU3LCA4MywxNTUsMjExLCA3MSwxMDMsCisgICAgIDIzLDEwMywxODUsMTE1LDEzMSwyNDMsMTM2LDEzOSwxMzcsIDc1LDEzMCwyMDMsIDQ2LDE1MSwgNjIsIDQ2LAorICAgIDE1NSwgMjcsMTk4LDIyMSwyMDAsMTg5LDIyOCwgNzQsMTE2LDI0NSwxMTMsIDkzLDIyNSwxMjIsMjEwLDI0NSwKKyAgICAxNTcsMTU1LDE3OSwxNTUsMTk0LDIzNywxNjgsMjE5LDE3NSwyMzgsIDU0LDIzOCwxMDUsMjM4LDEzNSwyMjAsCisgICAgMTU5LDIwNCwgNTIsMTU5LCA0MSwxNTgsIDg5LCA1MSwxMTUsMjA4LDE5NSwyMDAsIDY3LDIyNCwgODEsMjI5LAorICAgIDIwOSwgNjMsIDExLDE1OSwxNDksIDQ4LDEwNywyMjMsMTcyLDEyNiwgNzksIDY3LCA3OSwxMjksMTAzLDE4MSwKKyAgICAyMzEsIDM1LCA0NywgOTksIDQ3LDE0NSwgODcsMTczLDIxNSwxNzYsMTgzLDE2NSwxMTksMTcwLDI0NywgOTcsCisgICAgMjM5LCAyMywgNjIsMjQ2LCA2MiwxMTQsMTU5LDIyNywgNjIsMjI3LCA2MCwgNTUsMjIyLCA1MCwyMjIsIDg5LAorICAgICA5NSwyMDQsIDU1LDE5MiwxODMsMjAwLDE4MywyMDMsIDc5LDE5NSwxMTEsMTU4LCA5NSwxMzMsMjIzLCA2NywKKyAgICAxMjcsIDM1LDI1NSwxMDAsMjU1LDEyMiwyNTUsMjA5LCAgMCwxNjcsMTI4LCAzNywgIDEsMTAzLCAgMywxMzcsCisgICAgMTI5LCA2NSwxMjksIDkxLCAgMiwyNTEsMjQ4LDEyMiwxMjQsIDMzLDE5MSwxNDIsIDYzLCA1OCwyMTksMTAxLAorICAgIDI0NiwxNzgsMjE3LDIzNywgNjUsMTQwLDE2MCwxODUsIDY1LCAyMSwgNjUsMTQzLDEzMCwxNzMsMTMwLDIyOSwKKyAgICAxOTMsMTczLCAzMywxMDQsMjAwLDIzNiwxNDQsMTczLCAzMywyNDcsMjMxLDE1MiwyMDYsMTQ1LDIwNiwxMDUsCisgICAgIDE0LDEzMywgODAsMTI2LDIzMiwyMTQsMjA4LCAgNywgOTcsMjMwLCA5NywxMzksMTk1LDEyNiwgMTIsIDM5LAorICAgIDEzMywxMzUsMTMzLCA4NywxMzQsIDYzLDE0MiwxMTIsMTM2LCA4OCwgMjYsMjA5LCA0OSwxNTEsIDUzLDExOSwKKyAgICAyMDksMjIwLCA2NywxMTUsMjIzLCA2OCwyNTAsIDY4LDE1MCwgNjgsMjIyLDE1NSwxMDMsIDQ5LCA3OSwgNTcsCisgICAgMTc1LCA0NSwgNzQsIDUzLCA0MiwgNjIsMTcwLCA0NiwxMDYsIDYwLDIxOCwgNTUsMTg2LCA1MiwxODYsIDYzLAorICAgIDE5OCwgNDYsMTAyLCA4OSwyMDQsMjEzLCA4OCwxNTcsIDg4LCA3MywxMDgsIDc1LCAyOCwgNTcsIDQ2LCA0MiwKKyAgICAxNzQsIDU0LDExMCwxMDgsMTkwLDIyMywyNTIsMjM3LDI0MywxMzUsMjI2LDE1NywyMjYsIDExLDIyNywxMjMsCisgICAgIDIzLDE1MiwgNDcsMjAwLCA5MywxMTIsMTIxLDE2MSwyMDYsMTk0LDI0NCwxMzMsMTY3LCAyMiwxNjksIDQ2LAorICAgICAxOCwgNDQsIDU4LDE1MCwgNjQsIDc2LDEzNiwgNzgsIDU2LDE0OCwyNDAsIDY1LCAxNiwgNDIsMTY4LCAyMiwKKyAgICAxNDAsIDM3LDI0MiwgMTksMTE5LCAzNywxNDIsIDEwLDEyMSwxOTQsIDI5LDE5NCwxMDMsIDM0LCA0NywyMDksCisgICAgIDU0LDIwOSwxMzYsMjE2LCA2NywgOTIsIDQyLCAzMCwgNzgsMjQyLCA3MiwgNDIsIDc3LDEyMiwxNDYsMjM2LAorICAgIDE0NSwxODgsIDUzLDEyMSwgMzYsMTk3LCA1MSwxNjUsIDQ0LDIyOSwxODUsMTMyLCAzOSwxNjksMTQ0LDE4OCwKKyAgICAgNzYsIDEzLCA3NiwyMjEsMTU1LCA1OCwxNTgsIDIyLDE1NCwxMTgsIDMyLDEwOSwgNTAsIDYxLCA1OCwxODksCisgICAgIDQ5LDEzMSwxNDYsMTQ1LDE0NCwxMTMsIDY2LDE3MCwgMzMsIDc3LDE0NywxODIsMTAzLDIzNCwxMDMsMjMwLAorICAgIDEwMiwxMTgsMjAzLDE3MiwxMDEsMTMzLDE3OCwyNTQsMTk3LDExMCwxMzksMTgzLCA0NywgMzAsMTQ5LCAgNywKKyAgICAyMDEsMTA3LDE3OSwxNDQsMTcyLCAgNSwgODksIDQ1LCAxMCwxODIsIDY2LDE2NiwyMzIsIDg0LCA5MCwgNDAsCisgICAgMjE1LCA0MiwgIDcsMTc4LDEwMywxMDEsIDg3LDEwMiwxOTEsMjA1LDEzNywyMDIsIDU3LDE1MCwxNzEsMTU4LAorICAgICA0MywyMDUsMjM3LDIwNCwxNzksMjAyLDIxOSwxNDQsIDU1LDE1NiwyMzksMTU5LDI1NSwyMzcsIDE4LDE5NCwKKyAgICAgMTgsMjI1LDE0NiwxODIsMTY1LDEzNCwgNzUsIDg3LCA0NSwgMjksIDg4LDIzMCwxODksMTcyLDEwNiwgNTcsCisgICAgMTc4LCA2MCwxMTMsMTIxLDIxOSwgMTAsMjI3LCAyMSwgIDUsIDQzLDEzNCwgODYsICA2LDE3MiwgNjAsMTg0LAorICAgIDEzOCwxODIsIDQyLDEwOSwyMTMsIDc5LDE3MSwyMzcsIDg3LDE1MSwxNzQsMTI2LDE4OSwgMzgsMTIyLCA3NywKKyAgICAxMDcsMTI5LCA5NCwxOTMsMjAyLDEzMCwxOTMsMTgxLCAgMSwxMDcsMjM1LCAxMSwgODUsIDEwLDIyOSwxMzMsCisgICAgMTI1LDIzNSwyMjAsMjE1LDIzNywgOTMsIDc5LCA4OCwgNDcsIDg5LDIyMywxODEsIDk3LDI1MCwxMzQsMTU3LAorICAgICAyNywgNjIsIDIxLDEzNywxMzgsMTc0LCAyMCwyMTksIDIzLDE1MSwgMjEsMTI3LDIxNiwgNDAsMjIwLDEyMCwKKyAgICAyMjksIDI3LDEzNSwxMTEsMjAyLDE5MSwxNTMsMjIwLDE0OCwxODAsMTY5LDE3MSwxOTYsMTg1LDEwMCwyMDcsCisgICAgMTAyLDIxMCwxMDIsMjMzLDIzMCwyMjIsIDQ1LDE1OCwgOTEsIDE0LDE1MCwxNzAsMTUxLDIzMCwxNTEsIDE0LAorICAgIDExMCwgMTMsMjE3LDIxOCwxODAsIDEzLDIyMywgODYsMTgwLDIzNywyNDUsMjQ2LCA2OSwyMTksIDQ3LDE1MSwKKyAgICAyMDUsIDQwLDIxOSwxODcsMTMxLDE4MiwgNjcsMTg1LDE2MywxOTEsIDYwLDE4NCwxODgsMTAxLDE2NywyMDEsCisgICAgMjA2LDIwNSwgNTksIDYzLCA4NCwxNjQsIDg0LDI0NCwgODQsMjUwLCA4NCwgNTQsMjM4LDIxMCwyMjEsMTgxLAorICAgICA5NywyMTUsMjQ4LDExMCwyMDksMjM4LCAyNywxMjMsMTg4LDI0NiwgNTIsMjM2LDIxMywyMTksIDkxLDE4OCwKKyAgICAyNDcsMjUzLCA2MiwyMDEsMTkwLDIxOSwgODUsICAxLCA4NSwgNzcsMjEzLDEwMiwyMTMsMTAxLDI1MSwgNzMsCisgICAgMjUxLDE3OSwyNDcsIDYzLDE3NCwxMzcsMTcwLDIzMywyNDgsMTUwLDI1MSwxMDksIDkzLDE3MywgNzgsMTA5LAorICAgIDExMywyMzcsMTk5LCAgMywyMTAsICAzLDI1MywgIDcsIDM1LCAxNCwxODIsMjE1LDE4NSwyMTIsMjEzLCAyOSwKKyAgICAyMTAsIDYxLCA4NCwgODIsMTQzLDIxNCwgNDMsMjM1LCA3MSwgMTQsMTk5LCAzMSwxOTAsMjU0LDE1NywyMzksCisgICAgMTE5LCA0NSwgMTMsIDU0LCAxMywgODUsMTQxLDE1NiwxOTgsMjI2LCAzNSwxMTIsIDY4LDEyMSwyMjgsMjMzLAorICAgIDI0NywgIDksMjIzLDI0NywgMzAsIDEzLCA1OCwyMTgsMTE4LDE0MCwxMjMsMTcyLDIyNSwgIDcsMjExLCAzMSwKKyAgICAxMTgsIDI5LDEwMywgMjksIDQ3LDEwNiwgNjYsMTU0LDI0MiwxNTQsIDcwLDE1NSwgODMsMTU0LDI1MSwgOTEsCisgICAgIDk4LCA5MSwxODYsIDc5LDIwNCwgNjIsMjA5LDIxNCwyMzQsMjIyLDEyMiwyNTIsIDcxLDIxOSwgMzEsIDE1LAorICAgIDE1NiwgNTIsIDYwLCA4OSwxMjEsIDc0LDI0MywgODQsMjAxLDEwNSwyMTgsMjMzLDEzMCwyMTEsMTQ3LDEwMywKKyAgICAyNDIsMjA3LDE0MCwxNTcsMTQ5LDE1NywxMjUsMTI2LCA0NiwyNDksMjIwLCA5NiwyMTksMTYyLDE4MiwxMjMsCisgICAgMjMxLCA5OSwyMDYsMjIzLDEwNiwgMTUsMTExLDIzOSwxODYsIDE2LDExNiwyMjUsMjEwLCA2OSwyNTUsMTM5LAorICAgIDIzMSwgNTksMTg4LCA1OSwyMDYsIDkyLDI0MiwxODQsMTE2LDI0MiwxNzgsMjE5LDIyOSwgMTksIDg3LDE4NCwKKyAgICAgODcsMTU0LDE3NSwgNTgsIDk1LDEwOSwyMzQsMTE2LDIzNCwgNjAsMjU0LDE0NywyMTEsIDc5LDE5OSwxODcsCisgICAgMTU2LDE4NywxNTQsMTc0LDE4NSwgOTIsMTA3LDE4NSwyMzgsMTIyLDE4OSwxODEsMTIzLDEwMiwyNDcsMjMzLAorICAgICAyNywxNTgsIDU1LDIwNiwyMjEsMjQ0LDE4OSwxMjEsMjQxLCAyMiwyNTUsMjE0LDIxMywxNTgsIDU3LCA2MSwKKyAgICAyMjEsMTg5LDI0MywxMjIsMTExLDI0NywxOTcsMjQ3LDI0NSwyMjMsIDIyLDIyMSwxMjYsMTE0LCAzOSwyNTMsCisgICAgMjA2LDIwMywxODcsMjE3LDExOSwgMzksMjM4LDE3MywxODgsIDc5LDE4OCwgOTUsMjQ0LCA2NCwyMzcsIDY1LAorICAgIDIxNywgNjcsMjIxLDEzNSwyMTMsIDYzLCA5MSwyNTQsMjIwLDIxNiwyMzksMjIwLDEyNywxMDYsMTkyLDExOSwKKyAgICAxNjAsMjQzLDIwOSwyMjAsIDcxLDI0NywgIDYsMTMzLDEzMSwyMDcsMjU0LDE0NSwyNDUsMTQzLCAxNSwgNjcsCisgICAgICA1LDE0MywxNTMsMTQzLDIwMywxMzQsIDEzLDEzNCwyMzUsMTU4LCA1NiwgNjIsIDU3LCA1NywyMjYsIDYzLAorICAgIDExNCwyNTMsMjMzLDI1MiwxNjcsIDY3LDIwNywxMDAsMjA3LCAzOCwxNTgsIDIzLDI1NCwxNjIsMjU0LDIwMywKKyAgICAxNzQsIDIzLCAyMiwgNDcsMTI2LDI0OCwyMTMsMjM1LDIxNSwyMDYsMjA5LDE1MiwyMDksMTYxLDE1MSwyNDIsCisgICAgMTUxLDE0NywxOTEsMTA5LDEyNCwxNjUsMjUzLDIzNCwxOTIsMjM1LCAyNSwxNzUsMjE5LDE5OCwxOTQsMTk4LAorICAgICAzMCwxOTAsMjAxLDEyMCwgNTEsIDQ5LCA5NCwyNDQsIDg2LDI1MSwyMzcsMTkzLDExOSwyMjAsMTE5LCAyOSwKKyAgICAyMzksMTYzLDIyMywgMTUsIDc5LDIyOCwxMjQsIDMyLDEyNywgNDAsMjU1LDEwNCwyNDksMTc3LDI0NSwgODMsCisgICAgMjA4LDE2NywyNTEsMTQ3LCAyNSwxNDcsMTQ3LDI1NSwgIDQsICAzLDE1MiwyNDMsMjUyLCA5OSwgNTEsIDQ1LAorICAgIDIxOSwgIDAsICAwLCAgMCwgMzIsIDk5LCA3MiwgODIsIDc3LCAgMCwgIDAsMTIyLCAzNywgIDAsICAwLDEyOCwKKyAgICAxMzEsICAwLCAgMCwyNDksMjU1LCAgMCwgIDAsMTI4LDIzMywgIDAsICAwLDExNywgNDgsICAwLCAgMCwyMzQsCisgICAgIDk2LCAgMCwgIDAsIDU4LDE1MiwgIDAsICAwLCAyMywxMTEsMTQ2LCA5NSwxOTcsIDcwLCAgMCwgIDAsICAzLAorICAgICAyMCwgNzMsIDY4LCA2NSwgODQsMTIwLDIxOCwyMzYsMTU2LCA2MSwxMDgsMjExLCA2NCwgMjAsMTk5LCAxNSwKKyAgICAxNzEsIDc1LDE5NCwxOTksIDY2LCAyMSwgMjIsIDYwLCAzMiwxOTIsIDkzLCA2NCwyMDEsIDcyLCA5MywxODIsCisgICAgIDM0LDE5NiwyMDgsIDc0LCAzMiwxNjQsIDc4LCAyOSwxODYsIDMzLCA1OCwgNjYsMjAyLCA4MCwgMzMsICA4LAorICAgICAzMSwgOTgsIDMyLDIwMSwgNzQsMjE0LCA2NCwgNTksIDY5LDE3MCwxMzAsMjEyLCA3NiwgNzIsIDk3LDEwNywKKyAgICAxODYsICA2LDE5MywgNjYsIDQwLCA0OCwgMzYsMjI2LDE2MywgMTgsIDc1LCAzMywyMzcsMjAyLDExMiwyMzksCisgICAgMTY1LDE3OCwgMTksMjQ3LCA5MiwyNTEsMjM4LDE1NiwyMTIsMjM5LDE5MSwxODgsMTg0LCA1NywyMTcsMjAxLAorICAgIDIzOSwyMjIsIDYxLDE5MSwxMTksMTI1LDIwNiwxNzcsMTY5LDE3MSwgNDMsIDQzLCA5MSwgOTUsMjE2LDE0NCwKKyAgICAyMzUsMjM2LCA1NCwxODMsMjAxLCA1NSwgIDcsMTQzLDI1MSwyNDMsMjA2LDEwNSwxMzUsIDc5LCA5OSwyMDksCisgICAgIDk0LCA2MiwxNzcsMjAyLDEwOSwgMzgsMTk1LDE3MywxODEsMTk1LDE3MywgIDksMTI4LDIwNSwyMjMsIDQ4LAorICAgIDE3NiwgMTAsMjQ2LDE2NCwyMjQsMTMyLDE4MywxNTcsMTgyLDEyNSwxMzQsMjE5LCA4NiwgMjIsMjM2LCAgOSwKKyAgICAxMTAsMTU1LDIwNSwxNTIsICAwLDE4MywgMTAsMjIwLCA3OCwxMjcsICAzLDIwOCwgOTMsMTIwLCA5OSwgNjcsCisgICAgMjA1LDI0NSwxMTIsMTk0LDIwNCwgMzcsMTg0LCA0NiwyNTIsMTI1LDExOSwgMzAsMTkyLDEyNywyMjQsMTgyLAorICAgIDEyNiwxMjksMjE5LCA3OCwxMDYsMTk2LDEyOSwgMzUsMjI0LDIxNywxNjcsMTEyLDE0MCwgMzAsMTU0LDE0MiwKKyAgICAxMTgsMTAxLCAzNywgOTcsMTAxLDIxNywxMTIsMTA4LDEyNywxMzIsIDIxLDExMiwxMzgsMjE5LDI0MiwgMjEsCisgICAgIDg1LDE2MSwxMDUsIDc2LCA3NywxMzYsIDg4LDEwNCwxMjgsICA3LCAzNSwyMjQsIDYwLCAyNywgIDksIDg5LAorICAgIDI0MCwgNTcsIDk1LDE5MiwxMTMsMjM3LCAxOSwxODMsMjM1LCA2MywxMzQsIDEyLCA1NiwyMjIsMjEyLDIzOCwKKyAgICAgMzEsICA3LCAxNSwyMzQsMTc4LCAzNSwxNjEsMTUzLDE5OSwxNzYsIDMyLDIyNSwgOTQsIDgwLDEyMiwgMjEsCisgICAgMjE0LDI0MywgNjcsICAyLDE1OSwgIDQsIDE1LCA4OCwxNjgsMTc4LCAzNSwgNDUsMTg4LCAyMywgNjAsMTMyLAorICAgIDIzOSwgODksMjM2LCAgNiwxNDEsMjQ5LCA3MCwgNzIsMjA4LCAyNywgNDQsIDg2LDE5NCwyMTYsMTQzLCA0MywKKyAgICAgMjUsIDg3LDE4MiwgNTAsMjI0LDExMywgIDUsIDQ1LCAxNSwxODgsIDc5LDIyNCwxMjAsMTk0LDE4NSwxMTUsCisgICAgMTQwLCA1MiwgIDAsMjUyLDIyNiwgOTMsMTAzLDIxMCwgMTYsIDI0LDEyMCwxOTQsMTE3LDE5NCwyMjgsIDQyLAorICAgICA2NSwgMzAsMTY0LDIxMSwyMTUsMTU3LDIxNywgODksIDk2LDIyNCwxNzksIDU3LDIzMSwgIDksIDczLCAgNywKKyAgICAgNDMsMTQ3LDExOCwgODYsMjA2LDE5MCwxMjksIDM1LDIyNCwyMzMsIDM3LDEzMCwgMjQsIDY4LDExNSwyMzEsCisgICAgMTg5LCA2NiwxNDAsICA3LDI0MCwxNTMsIDI4LCA2NSwxNDcsIDE3LCA5OCwxNzQsIDYxLCAxNiwgIDAsMTk5LAorICAgIDEyOSwgODgsMjM0LDE0NiwgNjYsMjE0LCA0MSwxNDcsICAyLDIyNCwxODQsMTY5LCA2OCwxNDYsMjM1LDIzMywKKyAgICAyNTEsIDQ5LDIyMSwgMjQsIDI4LDI0NCwgNzMsMTQ2LCA2MSwyMjEsMTE4LCAgMSwxOTksIDYwLDE1NSwxNzgsCisgICAgIDE3LCA1MywxNzgsMjQyLCA0NiwyMjQsIDE5LCAgNSwxMzAsMTYyLDE2MywgNjQsMTc4LCAxMCwyMzIsMjI1LAorICAgICA1NSwgIDksMTM4LCAxNCwxNTMsMjE5LCAgMCwxMjQsMjUyLCAgNiwxOTMsMjA4LDIyNywyMzMsMjMyLDIyNSwKKyAgICAgNjMsICA5LDEzNCwxNTAsIDg4LDI1NCwyMDcsMTEyLDE5OCwgMjQsMTQ2LDEwNiwgMjUsMTMyLDEyOCwxMjgsCisgICAgIDE5LDExMiwxNDYsMTE2LDIyNCwgNDUsMjE4LCAyMSwyMTIsMTYyLDExOCwgMTAsMTI4LCA5OSwgOTksIDEyLAorICAgICA3MywxNzMsMjQ2LDExOCwgIDEsMTIwLDIzMSwgNDUsMTkzLDIwOCwxNjEsMjA3LDI0NywgMTIsMTI0LCA2NSwKKyAgICAgNDgsMTE2LDE2OCwxNDksMTk3LCAyNCwxNTgsMTY1LDIwOCwxNjIsIDgyLDIxNiwxOTUsMjE2LDE1MSwxNjUsCisgICAgMjM2LDE5MSwgNjUsMTQ2LCAxMCwxMjQsMjA5LCAgMywyNDgsMTAyLDEzMSwyMjQsMjAwLCA4NCwxNzUsIDc1LAorICAgIDE4MywyMzMsICAxLDE4OCwyMTUsIDcxLCA3NywxMDUsMTYyLDIxMiwgODAsMTc4LCA1NSwgNDcsIDQwLDEyNCwKKyAgICAyMTQsIDMxLCAxNywgNDQsIDI1LDE1OCwgOTMsMjAzLDI0OSwxNzIsIDUyLDIwMSwyMTEsMTk1LDIzMywyNTMsCisgICAgIDY5LDExMCwyNTEsMTg3LDEwOCwgIDUsMTY1LCA2MSwgNTQsMTY2LCA4MywyNDYsMjI2LDE3OSwxNDYsMTMyLAorICAgIDE4MiwxMDIsMjM5LDEyNiwxMTQsICAxLDExMiwxNTYsMTYxLDIwMiwxMTksMTMwLDIzMywgMzksMTMyLDE0OCwKKyAgICAxMDksMjA5LCA3MiwxNTksMTU1LCA4NywxNTUsMTUxLDE4NCwxNzMsMjMxLCAgOSwyMzgsIDMyLDE2MSwgNjcsCisgICAgMTM4LDI1MSwxOTcsIDE1LDE4NSwgOTEsIDg4LDIxNywyMjYsMTgyLDExMywxNTMsIDMyLCA1MSwxOTgsIDg4LAorICAgIDEyMSwyMDIsMjMzLDE0NCwgOTgsICA1LDIyMCwxNTgsMTI1LDEwOSwxOTksIDI3LDI1MiwyMjUsIDY1LDEzNSwKKyAgICAgIDQsMjM4LCAgNiwgOTUsMjQ5LCAyNiwxNDMsIDI0LCA5MywgNDIsICA1LCAgNSwgNDUsICA5LCA1NiwxNzAsCisgICAgMjU0LDE0NiwyMTksMjI2LCA5NSwxNzUsMTE2LDEwNCwgNTIsMTMzLDEwNSwyNDEsMjQzLCA5MSwyMzgsMTM4LAorICAgICA0OSwgOTgsMjI0LDIzOCwyNTIsMjUzLCAyNSwxMjQsMTkyLDIxOCwxNDcsMjA5LCA3NCwgNDMsMjA5LCA4MSwKKyAgICAgNDgsMTAwLCAyMCwxMTksMTAwLCA1OSwxNDQsMTYyLDEyNywxNzcsIDk3LCA0MSwxMzksMjQ5LDIzMiwxMTQsCisgICAgMTE3LCA1NiwgMzksMTkyLCAxMywxMjAsMTIxLCA0NSwxMDgsMjAwLCAxNiwgNzMsMjExLDE2MywyMjMsMTg5LAorICAgICAgOSwxOTIsMTczLCAgMywxMjAsIDI0LCAgOSwxODcsIDc0LDIxMSwyNDAsMjUyLDIyNywgNjgsMTQ1LCA5MSwKKyAgICAyMTcsIDYxLDE0MiwyMzgsMTAzLDIzOCwgMjcsMTc2LCA3MywyMTUsMTg1LCAgMywgIDMsMjE0LDExNiwgNzcsCisgICAgMTEzLDE5NiwgNjMsMTEwLDEyOCwgNDksMTc3LDIzMywgNDIsIDI0LCAxOCwgMTYsMTQ2LDIwNCwgOTUsIDQ4LAorICAgICAgMSwyMDgsIDI1LCA1NCwgNDYsMTUyLDEzNiwxMTgsMjAyLDE4NSwxMzAsIDE2LDExMiwxNTksIDgyLCA4MSwKKyAgICAxMjUsMjI3LDI1NSwgIDMsICAwLDIzMywyMzcsMjA3LDE1MywgNjIsMjA5LCA4OCwxNDQsICAwLCAgMCwgIDAsCisgICAgICAwLCA3MywgNjksIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX3NwYWNlYmFyX3BuZ1syOTE2XSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsMTQ1LCAgMCwgIDAsICAwLCAzNCwgMTYsICA2LCAgMCwgIDAsICAwLCAxNSwgMjIsMjMxLAorICAgIDE4NywgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDAsCisgICAgMTQzLCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwyMTIsIDQ5LCAgMSwgIDAsIDMyLCAxMiwxOTIsIDQ4LAorICAgIDE5MiwyMTQsMTk2LDEyOSwgMTMsMTEwLCAyOCwxNjAsMTAzLCA3MCwyNDgsMTQ0LDE3NywgMzksMTQ1LDIwOCwKKyAgICAxNjMsIDYxLDIzOCwxMjEsMTg1LDIxNSwxMDgsICAwLCA2OSwxMzQsICA0LDEyOCwgMTcsICAxLCA3MCwgMzYsCisgICAgICAxLCA5NiwgNjgsMTI4LCAxNywgNzMsICAwLCAyNCwgMTcsIDk2LCA2OCwgMTgsICAwLCA3MCwgIDQsIDI0LAorICAgIDE0NSwgIDQsMTI4LCAxNywgIDEsIDcwLCAzNiwgIDEsIDk2LCA2OCwxMjgsIDE3LCA3MywgIDAsIDI0LCAxNywKKyAgICAgOTYsIDY4LCAxOCwgIDAsIDcwLCAgNCwgMjQsMTQ1LCAgNCwxMjgsIDE3LCAgMSwgNzAsIDM2LCAgMSwgOTYsCisgICAgIDY4LDEyOCwgMTcsIDczLCAgMCwgMjQsIDE3LCA5NiwgNjgsIDE4LCAgMCwgNzAsICA0LCAyNCwxNDUsICA0LAorICAgIDEyOCwgMTcsICAxLCA3MCwgMzYsICAxLCA5NiwgNjgsMTI4LCAxNywgNzMsICAwLCAyNCwgMTcsIDk2LCA2OCwKKyAgICAgMTgsICAwLCA3MCwgIDQsIDI0LDE0NSwgIDQsIDY0LDE4MSwgMTUsICAwLCAgMCwyNTUsMjU1LCAgMywgIDAsCisgICAgIDg3LDE5NiwgIDUsIDY1LCA1NSwxMDYsIDM3LCAyOCwgIDAsICAwLCAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LAorICAgIDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfdm9sdW1lX2Rvd25fcG5nWzM1ODZdID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMCwgNjcsICAwLCAgMCwgIDAsIDQ5LCAxNiwgIDYsICAwLCAgMCwgIDAsMjA5LDE3NiwyMDAsCisgICAgMjUwLCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsIDEwLCA3OSwxMDUsIDY3LCA2NywgODAsIDgwLDEwNCwKKyAgICAxMTEsMTE2LDExMSwxMTUsMTA0LDExMSwxMTIsIDMyLCA3MywgNjcsIDY3LCAzMiwxMTIsMTE0LDExMSwxMDIsCisgICAgMTA1LDEwOCwxMDEsICAwLCAgMCwxMjAsMjE4LDE1NywgODMsMTAzLCA4NCwgODMsMjMzLCAyMiwgNjEsMjQ3LAorICAgIDIyMiwyNDQsIDY2LCA3NSwxMzYsMTI4LDE0OCwgNzUsMTExLCA4MiwgMjEsICA4LCAzMiwgODIsIDY2LDEzOSwKKyAgICAxMjgsIDIwLDE0NSwgMzgsIDQyLCAzMywgIDksIDE2LCA3NCwxMzYsIDMzLDE2MSwyMTcsIDIxLCA4MSwxOTMsCisgICAgIDE3LCA2OSwgNjksICA0LCAyNywyMDAsMTYwLDEzNiwgIDMsMTQyLDE0MiwxMjgsMTQwLCAyMSwgODEsIDQ0LAorICAgICAxMiwxMzgsIDEwLDIxNiwgIDcsMjI4LCAzMywxNjIsMTQyLDEzMSwxNjMsMTM2LDEzOCwyMDIsMjUxLDIyNSwKKyAgICAxMjMsMTYzLDEwNywyMTQsMTg4LDI0NywyMzAsMjA1LDI1NCwxODEsMjE1LCA2MiwyMzEsMTcyLDI0MywxNTcsCisgICAgMTc5LDIwNywgIDcsMTkyLCAgOCwgMTIsMTUwLCA3MiwgNTEsIDgxLCA1MywxMjgsIDEyLDE2OSwgNjYsIDMwLAorICAgICAxNywyMjQsMTMxLDE5OSwxOTYsMTk4LDIyNSwyMjgsIDQ2LCA2NCwxMjksIDEwLCAzNiwxMTIsICAwLCAxNiwKKyAgICAgIDgsMTc5LDEwMCwgMzMsMTE1LDI1MywgMzUsICAxLCAgMCwyNDgsMTI2LCA2MCwgNjAsIDQzLCAzNCwxOTIsCisgICAgICA3LDE5MCwgIDAsICAxLDEyMCwyMTEsIDExLCAgOCwgIDAsMTkyLCA3NywxNTUsMTkyLCA0OCwgMjgsMTM1LAorICAgIDI1NSwgMTUsMjM0LCA2NiwxNTMsIDkyLCAgMSwxMjgsMTMyLCAgMSwxOTIsMTE2LDE0NSwgNTYsIDc1LCAgOCwKKyAgICAxMjgsIDIwLCAgMCwgNjQsMTIyLDE0MiwgNjYsMTY2LCAgMCwgNjQsIDcwLCAgMSwxMjgsMTU3LDE1MiwgMzgsCisgICAgIDgzLCAgMCwxNjAsICA0LCAgMCwgOTYsMjAzLCA5OSwgOTgsMjI3LCAgMCwgODAsIDQ1LCAgMCwgOTYsIDM5LAorICAgIDEyNywyMzAsMjExLCAgMCwxMjgsMTU3LDI0OCwxNTMsMTIzLCAgMSwgIDAsIDkxLDE0OCwgMzMsIDIxLCAgMSwKKyAgICAxNjAsMTQ1LCAgMCwgMzIsIDE5LDEwMSwxMzYsIDY4LCAgMCwxMDQsIDU5LCAgMCwxNzIsMjA3LCA4NiwxMzgsCisgICAgIDY5LCAgMCwgODgsIDQ4LCAgMCwgMjAsMTAyLCA3NSwxOTYsIDU3LCAgMCwyMTYsIDQ1LCAgMCwgNDgsIDczLAorICAgICA4NywxMDIsIDcyLCAgMCwxNzYsMTgzLCAgMCwxOTIsMjA2LCAxNiwgMTEsMTc4LCAgMCwgIDgsIDEyLCAgMCwKKyAgICAgNDgsIDgxLDEzNiwxMzMsIDQxLCAgMCwgIDQsMTIzLCAgMCwgOTYsMjAwLCAzNSwgMzUsMTIwLCAgMCwxMzIsCisgICAgMTUzLCAgMCwgMjAsIDcwLDI0MiwgODcsIDYwLDI0MSwgNDMsMTc0LCAxNiwyMzEsIDQyLCAgMCwgIDAsMTIwLAorICAgIDE1MywxNzgsIDYwLDE4NSwgMzYsIDU3LCA2OSwxMjksIDkxLCAgOCwgNDUsMTEzLCAgNywgODcsIDg3LCA0NiwKKyAgICAgMzAsIDQwLDIwNiwgNzMsIDIzLCA0MywgMjAsIDU0LCA5NywgIDIsIDk3LDE1NCwgNjQsIDQ2LDE5NCwxMjEsCisgICAgMTUzLCAyNSwgNTAsMTI5LCA1MiwgMTUsMjI0LDI0MywyMDQsICAwLCAgMCwxNjAsMTQ1LCAyMSwgMTcsMjI0LAorICAgIDEzMSwyNDMsMjUzLDEyMCwyMDYsIDE0LDE3NCwyMDYsMjA2LCA1NCwxNDIsMTgyLCAxNCwgOTUsIDQ1LDIzNCwKKyAgICAxOTEsICA2LDI1NSwgMzQsIDk4LCA5OCwyMjcsMjU0LDIyOSwyMDcsMTcxLDExMiwgNjQsICAwLCAgMCwyMjUsCisgICAgMTE2LDEyNiwyMDksMjU0LCA0NCwgNDcsMTc5LCAyNiwxMjgsIDU5LCAgNiwxMjgsMTA5LDI1NCwxNjIsIDM3LAorICAgIDIzOCwgIDQsMTA0LCA5NCwgMTEsMTYwLDExNywyNDcsMTM5LDEwMiwxNzgsIDE1LCA2NCwxODEsICAwLDE2MCwKKyAgICAyMzMsMjE4LCA4NywyNDMsMTEyLDI0OCwxMjYsIDYwLCA2MCwgNjksMTYxLDE0NCwxODUsMjE3LDIxNywyMjksCisgICAgMjI4LDIyOCwyMTYsIDc0LDE5NiwgNjYsIDkxLCA5NywyMDIsIDg3LDEyNSwyNTQsMTAzLDE5NCwgOTUsMTkyLAorICAgICA4NywyNTMsMTA4LDI0OSwxMjYsIDYwLDI1MiwyNDcsMjQ1LDIyNCwxOTAsMjI2LCAzNiwxMjksIDUwLCA5MywKKyAgICAxMjksIDcxLCAgNCwyNDgsMjI0LDE5NCwyMDQsMjQ0LCA3NiwxNjUsIDI4LDIwNywxNDYsICA5LDEzMiwgOTgsCisgICAgMjIwLDIzMCwxNDMsIDcxLDI1MiwxODMsIDExLDI1NSwyNTIsIDI5LDIxMSwgMzQsMTk2LCA3MywgOTgsMTg1LAorICAgICA4OCwgNDIsIDIwLDIyNywgODEsIDE4LDExMywxNDIsIDY4LDE1NCwxNDAsMjQzLCA1MCwxNjUsIDM0LDEzNywKKyAgICAgNjYsMTQ2LCA0MSwxOTcsIDM3LDIxMCwyNTUsMTAwLDIyNiwyMjMsIDQ0LDI1MSwgIDMsIDYyLDIyMywgNTMsCisgICAgICAwLDE3NiwxMDYsIDYyLCAgMSwxMjMsMTQ1LCA0NSwxNjgsIDkzLCA5OSwgIDMsMjQ2LCA3NSwgMzksIDE2LAorICAgICA4OCwxMTYsMTkyLDIyNiwyNDcsICAwLCAgMCwyNDIsMTg3LDExMSwxOTMsMjEyLCA0MCwgIDgsICAzLDEyOCwKKyAgICAxMDQsMTMxLDIyNSwyMDcsMTE5LDI1NSwyMzksIDYzLDI1MywgNzEsMTYwLCAzNywgIDAsMTI4LDEwMiwgNzMsCisgICAgMTQ2LDExMywgIDAsICAwLCA5NCwgNjgsIDM2LCA0NiwgODQsMjAyLDE3OSwgNjMsMTk5LCAgOCwgIDAsICAwLAorICAgICA2OCwxNjAsMTI5LCA0MiwxNzYsIDY1LCAyNywyNDQsMTkzLCAyNCwgNDQsMTkyLCAgNiwgMjgsMTkzLCAgNSwKKyAgICAyMjAsMTkzLCAxMSwyNTIsIDk2LCA1NCwxMzIsIDY2LCAzNiwxOTYsMTk0LCA2NiwgMTYsIDY2LCAxMCwxMDAsCisgICAgMTI4LCAyOCwxMTQsIDk2LCA0MSwxNzIsMTMwLCA2NiwgNDAsMTM0LDIwNSwxNzYsIDI5LCA0MiwgOTYsIDQ3LAorICAgIDIxMiwgNjQsIDI5LCA1MiwxOTIsIDgxLDEwNCwxMzQsMTQ3LDExMiwgMTQsIDQ2LDE5NCwgODUsMTg0LCAxNCwKKyAgICAgNjEsMTEyLCAxNSwyNTAsIDk3LCAgOCwxNTgsMTkzLCA0MCwxODgsMTI5LCAgOSwgIDQsIDY1LDIwMCwgIDgsCisgICAgIDE5LCA5NywgMzMsMjE4LDEzNiwgIDEsIDk4LDEzOCwgODgsIDM1LDE0MiwgIDgsIDIzLDE1MywxMzMsMjQ4LAorICAgICAzMywxOTMsIDcyLCAgNCwgMTgsMTM5LCAzNiwgMzIsMjAxLDEzNiwgMjAsIDgxLCAzNCwgNzUsMTQ1LCA1MywKKyAgICAgNzIsIDQ5LCA4MiwxMzgsIDg0LCAzMiwgODUsIDcyLCAyOSwyNDIsIDYxLDExNCwgIDIsIDU3LDEzNSwgOTIsCisgICAgIDcwLDE4NiwxNDUsIDU5LDIwMCwgIDAsIDUwLDEzMCwyNTIsMTM0LDE4OCwgNzEsIDQ5LDE0OCwxMjksMTc4LAorICAgICA4MSwgNjEsMjEyLCAxMiwxODEsIDY3LDE4NSwxNjgsIDU1LCAyNiwxMzIsIDcwLDE2MiwgMTEsMjA4LDEwMCwKKyAgICAxMTYsIDQ5LDE1NCwxNDMsIDIyLDE2MCwxNTUsMjA4LDExNCwxODAsIDI2LCA2MSwxNDAsIDU0LDE2MSwyMzEsCisgICAgMjA4LDE3MSwxMDQsIDE1LDIxOCwxNDMsIDYyLCA2NywxOTksIDQ4LDE5MiwyMzIsIDI0LCAgNywgNTEsMTk2LAorICAgIDEwOCwgNDgsIDQ2LDE5OCwxOTUsIDY2LDE3NywgNTYsIDQ0LCAgOSwxNDcsIDk5LDIwMywxNzcsIDM0LDE3MiwKKyAgICAgMTIsMTcxLDE5OCwgMjYsMTc2LCA4NiwxNzIsICAzLDE4NywxMzcsMjQ1LCA5OSwyMDcsMTc3LDExOSwgIDQsCisgICAgIDE4LDEyOSwgNjksMTkyLCAgOSwgNTQsICA0LDExOSwgNjYsIDMyLCA5NywgMzAsIDY1LCA3MiwgODgsIDc2LAorICAgICA4OCwgNzgsMjE2LCA3MiwxNjgsIDMyLCAyOCwgMzYsIDUyLCAxNywyMTgsICA5LCA1NSwgIDksICAzLDEzMiwKKyAgICAgODEsMTk0LCAzOSwgMzQsMTQ3LDE2OCwgNzUsMTgwLCAzOCwxODYsIDE3LDI0OSwxOTYsIDI0LCA5OCwgNTAsCisgICAgIDQ5LDEzNSwgODgsIDcyLCA0NCwgMzUsMjE0LCAxOCwxNDMsIDE5LCA0NywgMTYsMTIzLDEzNiwgNjcsMTk2LAorICAgICA1NSwgMzYsIDE4LDEzNywgNjcsIDUwLCAzOSwxODUsMTQ0LCAgMiwgNzMsMTc3LDE2NCwgODQsMjEwLCAxOCwKKyAgICAyMTAsIDcwLDIxMCwxMTAsIDgyLCAzNSwyMzMsIDQ0LDE2OSwxNTUsIDUyLCA3MiwgMjYsIDM1LDE0NywyMDEsCisgICAgMjE4LDEwMCwxMDcsMTc4LCAgNywgNTcsMTQ4LCA0NCwgMzIsIDQzLDIwMCwxMzMsMjI4LDE1NywyMjgsMTk1LAorICAgIDIyOCwgNTEsMjI4LCAyNywyMjgsIDMzLDI0MiwgOTEsIDEwLDE1NywgOTgsIDY0LDExMywxNjQsMjQ4LCA4MywKKyAgICAyMjYsIDQwLCA4MiwyMDIsMTA2LCA3NCwgMjUsMjI5LCAxNiwyMjksIDUyLDIyOSwgIDYsMTAxLDE1MiwgNTAsCisgICAgIDY1LCA4NSwxNjMsMTU0LCA4MiwyMjEsMTY4LDE2MSwgODQsIDE3LCA1MywxNDMsIDkwLCA2NiwxNzMsMTYxLAorICAgIDE4MiwgODIsMTc1LCA4MSwxMzUsMTY4LCAxOSwgNTIsMTE3LDE1NCwgNTcsMjA1LDEzMSwgMjIsIDczLCA3NSwKKyAgICAxNjUsMTczLDE2MiwxNDksMjExLCAyNiwxMDQsIDIzLDEwNCwyNDcsMTA1LDE3NSwyMzIsMTE2LDE4NiwgMTcsCisgICAgMjIxLDE0OSwgMzAsIDc4LDE1MSwyMDgsIDg3LDIxMCwyMDMsMjMzLCA3MSwyMzIsMTUxLDIzMiwgIDMsMjQ0LAorICAgIDExOSwgMTIsIDEzLDEzNCwgMjEsMTMxLDE5OSwxMzYsMTAzLCA0MCwgMjUsMTU1LCAyNCwgIDcsIDI0LDEwMywKKyAgICAgMjUsMTE5LCAyNCwxNzUsMTUyLCA3NiwxNjYsIDI1LDIxMSwxMzksIDI1LDE5OSwgODQsIDQ4LCA1NSwgNDksCisgICAgMjM1LDE1MiwyMzEsMTUzLCAxNSwxNTMsMTExLCA4NSwgODgsIDQyLDE4MiwgNDIsMTI0LCAyMSwxNDUsMjAyLAorICAgICAxMCwxNDksIDc0LDE0OSwgMzgsMTQ5LCAyNywgNDIsIDQ3LCA4NCwxNjksMTcwLDE2NiwxNzAsMjIyLDE3MCwKKyAgICAgMTEsIDg1LDI0MywgODUsMjAzLCA4NCwxNDMsMTY5LCA5NCwgODMsMTI1LDE3NCwgNzAsIDg1LCA1MSwgODMsCisgICAgMjI3LDE2OSwgIDksMjEyLDE1MCwxNzEsIDg1LDE3MCwxNTcsIDgwLDIzNSwgODMsIDI3LCA4MywxMDMsMTY5LAorICAgICA1OSwxNjgsMTM1LDE3MCwxMDMsMTY4LDExMSwgODQsIDYzLDE2NCwxMjYsIDg5LDI1MywxMzcsICA2LCA4OSwKKyAgICAxOTUsIDc2LDE5NSwgNzksIDY3LDE2NCwgODEsMTYwLDE3NywgOTUsMjI3LDE4OCwxOTgsIDMyLCAxMSwgOTksCisgICAgIDI1LDE3OSwxMjAsIDQ0LCAzMywxMDcsIDEzLDE3MSwxMzQsMTE3LDEyOSwgNTMsMTk2LCAzOCwxNzcsMjA1LAorICAgIDIxNywxMjQsMTE4LCA0MiwxODcsMTUyLDI1MywgMjksMTg3LDEzOSwgNjEsMTcwLDE2OSwxNjEsIDU3LCA2NywKKyAgICAgNTEsIDc0LCA1MSwgODcsMTc5LCA4MiwyNDMsMTQ4LDEwMiwgNjMsICA3LDIyNywxNTIsMTEzLDI0OCwxNTYsCisgICAgMTE2LCA3OCwgIDksMjMxLCA0MCwxNjcsMTUxLDI0MywxMjYsMTM4LDIyMiwgMjAsMjM5LCA0MSwyMjYsIDQxLAorICAgICAyNywxNjYsIDUyLCA3NiwxODUsIDQ5LDEwMSwgOTIsMTA3LDE3MCwxNTAsMTUxLDE1MCwgODgsMTcxLCA3MiwKKyAgICAxNzEsIDgxLDE3MSwgNzEsMjM1LDE4OSwgNTQsMTc0LDIzNywxNjcsMTU3LDE2NiwxODksIDY5LDE4NywgODksCisgICAgMjUxLDEyOSwgMTQsIDY1LDE5OSwgNzQsIDM5LCA5MiwgMzksIDcxLDEwMywxNDMsMjA2LCAgNSwxNTcsMjMxLAorICAgICA4MywyMTcsIDgzLDIyMSwxNjcsIDEwLDE2NywgMjIsIDc3LCA2MSwgNTgsMjQ1LDE3NCwgNDYsMTcwLDEwNywKKyAgICAxNjUsIDI3LDE2MSwxODcsIDY4LDExOSwxOTEsMTEwLDE2NywyMzgsMTUyLDE1OCwxOTAsIDk0LDEyOCwxNTgsCisgICAgIDc2LDExMSwxNjcsMjIyLDEyMSwxODksMjMxLDI1MCwgMjgsMTI1LCA0NywyNTMsIDg0LDI1MywxMDksMjUwLAorICAgIDE2NywyNDUsIDcxLCAxMiwgODgsICA2LDE3OSwgMTIsIDM2LCAgNiwyMTksIDEyLDIwNiwgMjQsIDYwLDE5NywKKyAgICAgNTMsMTEzLDExMSwgNjAsIDI5LCA0NywxOTksMjE5LDI0MSwgODEsIDY3LCA5MywxOTUsIDY0LCA2NywxNjUsCisgICAgIDk3LDE0OSwgOTcsMTUxLDIyNSwxMzIsMTQ1LDE4NSwyMDksIDYwLDE2MywyMTMsIDcwLDE0MSwgNzAsIDE1LAorICAgIDE0MCwxMDUsMTk4LCA5MiwyMjcsIDM2LDIyNywxMDksMTk4LDEwOSwxOTgsMTYzLCAzOCwgIDYsIDM4LCAzMywKKyAgICAgMzgsIDc1LCA3NywyMzQsIDc3LDIzOCwxNTQsIDgyLCA3NywxODUsMTY2LCA0MSwxNjYsIDU5LCA3NiwgNTksCisgICAgIDc2LDE5OSwyMDUsMjA0LDIwNSwxNjIsMjA1LDIxNCwxNTMsIDUzLDE1NSwgNjEsIDQ5LDIxNSwgNTAsMjMxLAorICAgIDE1NSwyMzEsMTU1LDIxNSwxNTUsMjIzLDE4MywgOTYsIDkwLDEyMCwgOTAsIDQ0LDE4MiwxNjgsMTgyLDE4NCwKKyAgICAxMDEsIDczLDE3OCwyMjgsIDkwLDE2NiwgODksMjM4LDE4MiwxODgsMTEwLDEzMywgOTAsIDU3LCA4OSwxNjUsCisgICAgIDg4LCA4NSwgOTAsIDkzLDE3OSwgNzAsMTczLDE1NywxNzMsIDM3LDIxNCwxODcsMTczLDE4NywxNjcsIDE3LAorICAgIDE2NywxODUsIDc4LDE0NywgNzgsMTcxLDE1OCwyMTQsMTAzLDE5NSwxNzYsMjQxLDE4MiwyMDEsMTgyLDE2OSwKKyAgICAxODMsIDI1LDE3NiwyMjksMjE2LCAgNiwyMTksMTc0LDE4MiwxMDksMTgyLDEyNSwgOTcsMTAzLCA5OCwgMjMsCisgICAgMTAzLDE4MywxOTcsMTc0LDE5NSwyMzgsMTQ3LDE4OSwxNDcsMTI1LDE4NiwxMjUsMTQxLDI1MywgNjEsICA3LAorICAgICAxMywxMzUsMjE3LCAxNCwxNzEsIDI5LCA5MCwgMjksMTI2LDExNSwxODAsMTE0LCAyMCwgNTgsIDg2LCA1OCwKKyAgICAyMjIsMTU0LDIwNiwxNTYsMjM4LCA2MywxMjUsMTk3LDI0NCwxNTAsMjMzLCA0NywxMDMsIDg4LDIwNywgMTYsCisgICAgMjA3LDIxNiwgNTEsMjI3LDE4MiwgMTksMjAzLCA0MSwxOTYsMTA1LDE1NywgODMsMTU1LDIxMSwgNzEsMTAzLAorICAgICAyMywxMDMsMTg1LDExNSwxMzEsMjQzLDEzNiwxMzksMTM3LCA3NSwxMzAsMjAzLCA0NiwxNTEsIDYyLCA0NiwKKyAgICAxNTUsIDI3LDE5OCwyMjEsMjAwLDE4OSwyMjgsIDc0LDExNiwyNDUsMTEzLCA5MywyMjUsMTIyLDIxMCwyNDUsCisgICAgMTU3LDE1NSwxNzksMTU1LDE5NCwyMzcsMTY4LDIxOSwxNzUsMjM4LCA1NCwyMzgsMTA1LDIzOCwxMzUsMjIwLAorICAgIDE1OSwyMDQsIDUyLDE1OSwgNDEsMTU4LCA4OSwgNTEsMTE1LDIwOCwxOTUsMjAwLCA2NywyMjQsIDgxLDIyOSwKKyAgICAyMDksIDYzLCAxMSwxNTksMTQ5LCA0OCwxMDcsMjIzLDE3MiwxMjYsIDc5LCA2NywgNzksMTI5LDEwMywxODEsCisgICAgMjMxLCAzNSwgNDcsIDk5LCA0NywxNDUsIDg3LDE3MywyMTUsMTc2LDE4MywxNjUsMTE5LDE3MCwyNDcsIDk3LAorICAgIDIzOSwgMjMsIDYyLDI0NiwgNjIsMTE0LDE1OSwyMjcsIDYyLDIyNywgNjAsIDU1LDIyMiwgNTAsMjIyLCA4OSwKKyAgICAgOTUsMjA0LCA1NSwxOTIsMTgzLDIwMCwxODMsMjAzLCA3OSwxOTUsMTExLDE1OCwgOTUsMTMzLDIyMywgNjcsCisgICAgMTI3LCAzNSwyNTUsMTAwLDI1NSwxMjIsMjU1LDIwOSwgIDAsMTY3LDEyOCwgMzcsICAxLDEwMywgIDMsMTM3LAorICAgIDEyOSwgNjUsMTI5LCA5MSwgIDIsMjUxLDI0OCwxMjIsMTI0LCAzMywxOTEsMTQyLCA2MywgNTgsMjE5LDEwMSwKKyAgICAyNDYsMTc4LDIxNywyMzcsIDY1LDE0MCwxNjAsMTg1LCA2NSwgMjEsIDY1LDE0MywxMzAsMTczLDEzMCwyMjksCisgICAgMTkzLDE3MywgMzMsMTA0LDIwMCwyMzYsMTQ0LDE3MywgMzMsMjQ3LDIzMSwxNTIsMjA2LDE0NSwyMDYsMTA1LAorICAgICAxNCwxMzMsIDgwLDEyNiwyMzIsMjE0LDIwOCwgIDcsIDk3LDIzMCwgOTcsMTM5LDE5NSwxMjYsIDEyLCAzOSwKKyAgICAxMzMsMTM1LDEzMywgODcsMTM0LCA2MywxNDIsMTEyLDEzNiwgODgsIDI2LDIwOSwgNDksMTUxLCA1MywxMTksCisgICAgMjA5LDIyMCwgNjcsMTE1LDIyMywgNjgsMjUwLCA2OCwxNTAsIDY4LDIyMiwxNTUsMTAzLCA0OSwgNzksIDU3LAorICAgIDE3NSwgNDUsIDc0LCA1MywgNDIsIDYyLDE3MCwgNDYsMTA2LCA2MCwyMTgsIDU1LDE4NiwgNTIsMTg2LCA2MywKKyAgICAxOTgsIDQ2LDEwMiwgODksMjA0LDIxMywgODgsMTU3LCA4OCwgNzMsMTA4LCA3NSwgMjgsIDU3LCA0NiwgNDIsCisgICAgMTc0LCA1NCwxMTAsMTA4LDE5MCwyMjMsMjUyLDIzNywyNDMsMTM1LDIyNiwxNTcsMjI2LCAxMSwyMjcsMTIzLAorICAgICAyMywxNTIsIDQ3LDIwMCwgOTMsMTEyLDEyMSwxNjEsMjA2LDE5NCwyNDQsMTMzLDE2NywgMjIsMTY5LCA0NiwKKyAgICAgMTgsIDQ0LCA1OCwxNTAsIDY0LCA3NiwxMzYsIDc4LCA1NiwxNDgsMjQwLCA2NSwgMTYsIDQyLDE2OCwgMjIsCisgICAgMTQwLCAzNywyNDIsIDE5LDExOSwgMzcsMTQyLCAxMCwxMjEsMTk0LCAyOSwxOTQsMTAzLCAzNCwgNDcsMjA5LAorICAgICA1NCwyMDksMTM2LDIxNiwgNjcsIDkyLCA0MiwgMzAsIDc4LDI0MiwgNzIsIDQyLCA3NywxMjIsMTQ2LDIzNiwKKyAgICAxNDUsMTg4LCA1MywxMjEsIDM2LDE5NywgNTEsMTY1LCA0NCwyMjksMTg1LDEzMiwgMzksMTY5LDE0NCwxODgsCisgICAgIDc2LCAxMywgNzYsMjIxLDE1NSwgNTgsMTU4LCAyMiwxNTQsMTE4LCAzMiwxMDksIDUwLCA2MSwgNTgsMTg5LAorICAgICA0OSwxMzEsMTQ2LDE0NSwxNDQsMTEzLCA2NiwxNzAsIDMzLCA3NywxNDcsMTgyLDEwMywyMzQsMTAzLDIzMCwKKyAgICAxMDIsMTE4LDIwMywxNzIsMTAxLDEzMywxNzgsMjU0LDE5NywxMTAsMTM5LDE4MywgNDcsIDMwLDE0OSwgIDcsCisgICAgMjAxLDEwNywxNzksMTQ0LDE3MiwgIDUsIDg5LCA0NSwgMTAsMTgyLCA2NiwxNjYsMjMyLCA4NCwgOTAsIDQwLAorICAgIDIxNSwgNDIsICA3LDE3OCwxMDMsMTAxLCA4NywxMDIsMTkxLDIwNSwxMzcsMjAyLCA1NywxNTAsMTcxLDE1OCwKKyAgICAgNDMsMjA1LDIzNywyMDQsMTc5LDIwMiwyMTksMTQ0LCA1NSwxNTYsMjM5LDE1OSwyNTUsMjM3LCAxOCwxOTQsCisgICAgIDE4LDIyNSwxNDYsMTgyLDE2NSwxMzQsIDc1LCA4NywgNDUsIDI5LCA4OCwyMzAsMTg5LDE3MiwxMDYsIDU3LAorICAgIDE3OCwgNjAsMTEzLDEyMSwyMTksIDEwLDIyNywgMjEsICA1LCA0MywxMzQsIDg2LCAgNiwxNzIsIDYwLDE4NCwKKyAgICAxMzgsMTgyLCA0MiwxMDksMjEzLCA3OSwxNzEsMjM3LCA4NywxNTEsMTc0LDEyNiwxODksIDM4LDEyMiwgNzcsCisgICAgMTA3LDEyOSwgOTQsMTkzLDIwMiwxMzAsMTkzLDE4MSwgIDEsMTA3LDIzNSwgMTEsIDg1LCAxMCwyMjksMTMzLAorICAgIDEyNSwyMzUsMjIwLDIxNSwyMzcsIDkzLCA3OSwgODgsIDQ3LCA4OSwyMjMsMTgxLCA5NywyNTAsMTM0LDE1NywKKyAgICAgMjcsIDYyLCAyMSwxMzcsMTM4LDE3NCwgMjAsMjE5LCAyMywxNTEsIDIxLDEyNywyMTYsIDQwLDIyMCwxMjAsCisgICAgMjI5LCAyNywxMzUsMTExLDIwMiwxOTEsMTUzLDIyMCwxNDgsMTgwLDE2OSwxNzEsMTk2LDE4NSwxMDAsMjA3LAorICAgIDEwMiwyMTAsMTAyLDIzMywyMzAsMjIyLCA0NSwxNTgsIDkxLCAxNCwxNTAsMTcwLDE1MSwyMzAsMTUxLCAxNCwKKyAgICAxMTAsIDEzLDIxNywyMTgsMTgwLCAxMywyMjMsIDg2LDE4MCwyMzcsMjQ1LDI0NiwgNjksMjE5LCA0NywxNTEsCisgICAgMjA1LCA0MCwyMTksMTg3LDEzMSwxODIsIDY3LDE4NSwxNjMsMTkxLCA2MCwxODQsMTg4LDEwMSwxNjcsMjAxLAorICAgIDIwNiwyMDUsIDU5LCA2MywgODQsMTY0LCA4NCwyNDQsIDg0LDI1MCwgODQsIDU0LDIzOCwyMTAsMjIxLDE4MSwKKyAgICAgOTcsMjE1LDI0OCwxMTAsMjA5LDIzOCwgMjcsMTIzLDE4OCwyNDYsIDUyLDIzNiwyMTMsMjE5LCA5MSwxODgsCisgICAgMjQ3LDI1MywgNjIsMjAxLDE5MCwyMTksIDg1LCAgMSwgODUsIDc3LDIxMywxMDIsMjEzLDEwMSwyNTEsIDczLAorICAgIDI1MSwxNzksMjQ3LCA2MywxNzQsMTM3LDE3MCwyMzMsMjQ4LDE1MCwyNTEsMTA5LCA5MywxNzMsIDc4LDEwOSwKKyAgICAxMTMsMjM3LDE5OSwgIDMsMjEwLCAgMywyNTMsICA3LCAzNSwgMTQsMTgyLDIxNSwxODUsMjEyLDIxMywgMjksCisgICAgMjEwLCA2MSwgODQsIDgyLDE0MywyMTQsIDQzLDIzNSwgNzEsIDE0LDE5OSwgMzEsMTkwLDI1NCwxNTcsMjM5LAorICAgIDExOSwgNDUsIDEzLCA1NCwgMTMsIDg1LDE0MSwxNTYsMTk4LDIyNiwgMzUsMTEyLCA2OCwxMjEsMjI4LDIzMywKKyAgICAyNDcsICA5LDIyMywyNDcsIDMwLCAxMywgNTgsMjE4LDExOCwxNDAsMTIzLDE3MiwyMjUsICA3LDIxMSwgMzEsCisgICAgMTE4LCAyOSwxMDMsIDI5LCA0NywxMDYsIDY2LDE1NCwyNDIsMTU0LCA3MCwxNTUsIDgzLDE1NCwyNTEsIDkxLAorICAgICA5OCwgOTEsMTg2LCA3OSwyMDQsIDYyLDIwOSwyMTQsMjM0LDIyMiwxMjIsMjUyLCA3MSwyMTksIDMxLCAxNSwKKyAgICAxNTYsIDUyLCA2MCwgODksMTIxLCA3NCwyNDMsIDg0LDIwMSwxMDUsMjE4LDIzMywxMzAsMjExLDE0NywxMDMsCisgICAgMjQyLDIwNywxNDAsMTU3LDE0OSwxNTcsMTI1LDEyNiwgNDYsMjQ5LDIyMCwgOTYsMjE5LDE2MiwxODIsMTIzLAorICAgIDIzMSwgOTksMjA2LDIyMywxMDYsIDE1LDExMSwyMzksMTg2LCAxNiwxMTYsMjI1LDIxMCwgNjksMjU1LDEzOSwKKyAgICAyMzEsIDU5LDE4OCwgNTksMjA2LCA5MiwyNDIsMTg0LDExNiwyNDIsMTc4LDIxOSwyMjksIDE5LCA4NywxODQsCisgICAgIDg3LDE1NCwxNzUsIDU4LCA5NSwxMDksMjM0LDExNiwyMzQsIDYwLDI1NCwxNDcsMjExLCA3OSwxOTksMTg3LAorICAgIDE1NiwxODcsMTU0LDE3NCwxODUsIDkyLDEwNywxODUsMjM4LDEyMiwxODksMTgxLDEyMywxMDIsMjQ3LDIzMywKKyAgICAgMjcsMTU4LCA1NSwyMDYsMjIxLDI0NCwxODksMTIxLDI0MSwgMjIsMjU1LDIxNCwyMTMsMTU4LCA1NywgNjEsCisgICAgMjIxLDE4OSwyNDMsMTIyLDExMSwyNDcsMTk3LDI0NywyNDUsMjIzLCAyMiwyMjEsMTI2LDExNCwgMzksMjUzLAorICAgIDIwNiwyMDMsMTg3LDIxNywxMTksIDM5LDIzOCwxNzMsMTg4LCA3OSwxODgsIDk1LDI0NCwgNjQsMjM3LCA2NSwKKyAgICAyMTcsIDY3LDIyMSwxMzUsMjEzLCA2MywgOTEsMjU0LDIyMCwyMTYsMjM5LDIyMCwxMjcsMTA2LDE5MiwxMTksCisgICAgMTYwLDI0MywyMDksMjIwLCA3MSwyNDcsICA2LDEzMywxMzEsMjA3LDI1NCwxNDUsMjQ1LDE0MywgMTUsIDY3LAorICAgICAgNSwxNDMsMTUzLDE0MywyMDMsMTM0LCAxMywxMzQsMjM1LDE1OCwgNTYsIDYyLCA1NywgNTcsMjI2LCA2MywKKyAgICAxMTQsMjUzLDIzMywyNTIsMTY3LCA2NywyMDcsMTAwLDIwNywgMzgsMTU4LCAyMywyNTQsMTYyLDI1NCwyMDMsCisgICAgMTc0LCAyMywgMjIsIDQ3LDEyNiwyNDgsMjEzLDIzNSwyMTUsMjA2LDIwOSwxNTIsMjA5LDE2MSwxNTEsMjQyLAorICAgIDE1MSwxNDcsMTkxLDEwOSwxMjQsMTY1LDI1MywyMzQsMTkyLDIzNSwgMjUsMTc1LDIxOSwxOTgsMTk0LDE5OCwKKyAgICAgMzAsMTkwLDIwMSwxMjAsIDUxLCA0OSwgOTQsMjQ0LCA4NiwyNTEsMjM3LDE5MywxMTksMjIwLDExOSwgMjksCisgICAgMjM5LDE2MywyMjMsIDE1LCA3OSwyMjgsMTI0LCAzMiwxMjcsIDQwLDI1NSwxMDQsMjQ5LDE3NywyNDUsIDgzLAorICAgIDIwOCwxNjcsMjUxLDE0NywgMjUsMTQ3LDE0NywyNTUsICA0LCAgMywxNTIsMjQzLDI1MiwgOTksIDUxLCA0NSwKKyAgICAyMTksICAwLCAgMCwgIDAsIDMyLCA5OSwgNzIsIDgyLCA3NywgIDAsICAwLDEyMiwgMzcsICAwLCAgMCwxMjgsCisgICAgMTMxLCAgMCwgIDAsMjQ5LDI1NSwgIDAsICAwLDEyOCwyMzMsICAwLCAgMCwxMTcsIDQ4LCAgMCwgIDAsMjM0LAorICAgICA5NiwgIDAsICAwLCA1OCwxNTIsICAwLCAgMCwgMjMsMTExLDE0NiwgOTUsMTk3LCA3MCwgIDAsICAwLCAgMywKKyAgICAgNDUsIDczLCA2OCwgNjUsIDg0LDEyMCwyMTgsMjM2LDE1NywxOTEsMTExLDIxMSwgNjQsIDIwLDE5OSwgMTMsCisgICAgMjM0LCA4MiwgNjgsMTk3LCA2NCwgMjEsIDMzLDE0OCwgMTIsIDgwLCAgNCwgMTEsMTM2LDE3MiwxMTcsIDk3LAorICAgIDEzOCwxMzIsIDI0LCAyNiwgIDksMTUwLDE3OCwgODgsIDM0LCAyNywxMzYsIDE3LCAgOCwxMDcsIDExLCAzNSwKKyAgICAgMTYsMjU0LDEzNCwgODQsMjQyLCA2NiwgMzYsIDM2LDEzNCwgMTQsMTY4LCA4MiwgMzgsMTM2LCAyNSwgODgsCisgICAgMTQwLDIwMiwyMTAsMTM2LCA3NiwxNDEsIDE2LCAzMiwxNzgsIDgwLCA1MywxMDgsMTUyLDIyNSwyMjIsMTM5LAorICAgIDEwMCwxNzEsMTc0LDIwNiwyNDEsIDk3LDE1OSwxMTUsMjIzLDIzOSwyNDIsMTA2LDE4MywxMzgsMjM5LDIyMSwKKyAgICAxMjUsMjQyLDIzOCwyMjEsIDE1LCA5NSwxNDMsICA1LCA2NSwgMTYsICA0LDEyOSwxMDEsIDkzLDE4NywyMzgsCisgICAgMTg2LDEzMSwxNzUsMTUwLCA5OCwyMDUsMTg3LDE5NCwgODYsMTkwLCAxMSwxMjMsMjMzLCA4NSwxODYsMjA3LAorICAgIDIxOSwxMjUsIDQwLDIzNiwyMjIsIDI1LCA5NywyNTUsIDU2LCAyMiwxMDAsIDg5LDE1MCwxMDEsMTI1LDEyMCwKKyAgICAyMzksIDU2LCA3NSwgMjMsMjEyLDEyNSwyMjIsMTU2LCA5MCwgIDAsMTcwLCA4NSwgOTcsMTA3LDEzMiwgODgsCisgICAgMjI5LCAgNywyNTMsMTkzLCAgMiwyMTcsMjQ1LDExNiwyMDcsIDg5LDIyOSwgMzEsIDE0LCAgOCwxNDQsMTgzLAorICAgIDE5NCwxMTgsMTY5LCA3NCwxMjQsIDMxLDE5MiwxMDQsICAxLDE5OCwyNDIsIDIzLCA5NywyMTUsMjA2LCAgOSwKKyAgICAxMjMsMTk0LDIwNSwxODIsMjQ4LCAxMiwgOTQsMTMxLDIzNiwxNTIsMTI4LDIzMiwgODAsMTg1LCA2MiwgOTQsCisgICAgIDcwLCAxOSwxMDMsICAyLCAgNiwgNzEsMTM0LDEzNCwgNzEsIDE3LDE2MiwgNzEsMTkxLDIzMiwyMzMsMjI1LAorICAgICAxNCwxMzEsMjE3LDE2MCwyMzUsMjM0LCAgMywgOTcsMjE5LCA1NCwgMzQsIDczLCA1MCwgMjksIDc5LCAgNiwKKyAgICAxOTYsMTYzLDE0NywgODQsMjI1LCA4NywxMzksMjI1LCAzMCwxNTEsMTQ3LDIwMywgNjEsMjM5LDE2MiwyMDEsCisgICAgMTQ5LDEyOCwgMTcsICA1LCA5OCwxNDYsIDUxLCAyMCwgNzYsIDkyLDExMCwgIDAsMTYyLCAgOCwxNDAsMjUwLAorICAgICA3MCwxNzcsMTI5LDEzNiwgIDMsMTMyLDI1MywxMzAsIDE4LDIzMCwgMjQsIDIzLCA5NSwyMTAsMjMyLCA5OCwKKyAgICAgOTcsIDU0LDIyMSwxNzQsIDUzLDEwNSwgMjAsMTc5LCA0NywxMDgsMjU1LCA0OSwgODAsMTQ0LDEzOCwgMjQsCisgICAgMjQ1LDEwMywxMDIsMTg0LDExMSwxMzgsMTU5LDE2OSwxOTMsIDQwLDI1NSwxNjQsMTM2LDI0MSwxOTQsIDEyLAorICAgIDI0NywyMTcsIDc5LDI0NiwgMjcsMTM4LCAgMSwxOTUsMTgyLDIwNSwxNzIsICA2LCA4MywyNTMsMTUwLCAgNiwKKyAgICAxNjMsIDk4LDIzMiwgNTUsMTM1LDExNSwgNDIsIDQwLCAgNiwgMTIsIDgzLDE4NiwxNDQsMTg0LDIwOSwgMTAsCisgICAgIDM2LCA1NywgOTIsMTMzLCAgMCwgIDYsMTMyLCA0NiwgIDUsIDk2LDE5NiwxMTgsIDQxLCA1NywyMzEsIDg4LAorICAgIDE4OCwgNDAsIDg5LCA2MywgMTEsIDQ4LDE4MCwyMTAsIDk0LCA0MSwgOTUsIDMyLCAyNiwgNjEsIDkzLDEwNiwKKyAgICAgIDIsIDk2LDEwNCwgMTcsIDMzLDI0NCwgIDEsMTMwLCA1MywxMzUsMTk4LDIwMSwgNjcsMTE5LDEwNSwyMTksCisgICAgMTMwLDIyMSwyMTEsMTgxLDEzMiwxMzYsIDI0LDI0OSwgIDAsMTc3LDE2MywxMjMsIDczLCAxNywgNDksIDgyLAorICAgICA3MywgNTQsIDczLCA0NCwyMjMsIDE4LDE4MiwxODYsMTYzLCAyMiwxNzYsMTk3LDE1NSwxOTQsMTgyLDEyNiwKKyAgICAgIDMsIDEyLDE3MywxODAsMTg2LDE1OCwyMzcsMjQzLDEyMCwgNzksMjM3LCAzNiwyMjYsMjA4LDEzMiwyMjgsCisgICAgMjQyLDEzOCwxNzYsMjM0LDE4MiwgNTAsMTYyLCA0MywgNDEsMTQ4LDEyMCwxNzksMTE1LDE5MSwgMjUsMTkwLAorICAgIDE3NSwxMjYsMTczLCAgNywgOTYsIDIwLCA4MiwxNTgsIDIzLDE5MCwgODYsMTkxLDE0OCwgIDEsIDQ4LCAxMCwKKyAgICAxNjksMjA5LCA1OSwxNDAsIDc0LDE2MCwgNjcsIDIwLDE1NywxNjEsIDI5LCA1OSwgIDAsMTk1LDEwNCwyNDEsCisgICAgIDM4LDIzMCwyMTgsIDMyLDEyNCwgNjMsMTU0LDExNSwgIDAsIDEyLDIxMSwgMzQsICA1LDE4OSwyMzQsMTIxLAorICAgIDI1MCwgNzAsMjQ4LDEyNiwyNDcsIDYwLDEzNCwxNzEsIDkwLDE2OSwxODEsMTU5LCA0NCwyNDQsMTc1LCA0NSwKKyAgICAxNjUsMTIzLCAzMCwxMTEsIDkwLDExMCwyMTEsIDg0LDI1MCwgMzQsICAxLDIxMCwyNTUsICA2LCA0OCwxODAsCisgICAgMTQ2LDIzNiwyMzgsMjQyLCA2MiwyMzEsICAyLDEzOCwyMTQsIDcwLDI1NCwyNTUsMTcxLDE1MSwyMzIsIDc0LAorICAgICA1MCwgMjEsIDU1LDEwNCwxMjMsIDY5LDI0NywxNDYsICAyLDE0MCwgOTIsICAxLDIyNSwxNzQsMTA0LDIzNiwKKyAgICAgIDAsIDEyLDIzMiwxNDQsMTc0LDE2OCwxMTcsMTYwLCAyNywgMzIsICAwLCA2NywgMTEsIDEzLCA3NSwgOTcsCisgICAgIDY0LDEyNiwxMDksMjMxLCA5MywgMzQsIDM2LDE1OSwgMzMsMTU3LDEyMiwxNjIsICA3LCAzMiwgNjcsIDY4LAorICAgICAxMiwxODksMjQ0LDIzMywgNDcsMjM0LCAgMCwgOTYsIDY0LDI0MiwgOTYsMTY4LDE1OSwgOTAsIDQ1LCA3MiwKKyAgICAgMTgsMjE2LCAgNCwgMTAsIDcxLDEzMCwyMjUsMjIzLCA1NSwxNzksIDI2LCA3NiwyNDUsIDkxLCAzMCwgMTIsCisgICAgMjIzLCA4MCwgNDgsMTI0LDE2MCwxMTIsIDM2LCAyNCwgMzUsIDI2LCAzOCwxMjEsIDg3LDIwNCwxMTIsMTU5LAorICAgIDI1MywgMjgsMTA5LCAgMywgIDUsMTY5LDIyOCwxMTUsMTA3LCA2NywyMTYsMjQxLDE0MCwxNTgsMTE0LDE5OSwKKyAgICAxMjYsMTc3LDE1OSwxNDQsIDM2LCAyNCwyNTIsIDEzLDIxOCwxMjIsIDU4LDE1NSwxMTAsMTc5LCA5NSwxMzYsCisgICAgIDIwLCA4MywgMTQsIDg3LDE4NywyMDcsMTAzLDE3MSwxMDcsIDk3LCA2MywyMTYsIDQ3LDEwNCwgNzQsIDQ4LAorICAgICA4OCwxNTUsMTE4LDE3NywgIDEsMjI1LDExNCwxMTEsMjI2LDIyOCwgMjgsMTgxLCA5NiwgNjgsICAxLDIzMywKKyAgICAgMTIsMTM4LDIxMywxMDEsICAwLDEzNiwxNjQsMTU0LDExNCwxNzMsMTMyLCA2NywyNDEsIDQ2LDIzNywgNzYsCisgICAgMTg2LCA2NywxMzUsMTg4LDIzMSwxMjUsIDM0LCAxNSwgNzksIDg0LDE4OSwxNjYsIDY3LDIzOCwxMzUsMjQ3LAorICAgIDIwOCwxOTYsMTUzLDEzMCwxOTMsMTU0LDE3MiwgMTAsMjEwLDExNywyNDksMTgyLDE3NiwyNTIsICAyLCAxMiwKKyAgICAgMzEsMjE3LCAyOCwyMjEsMTYzLDE1MiwgODYsMTU2LCA1MiwyNTAsMTU5LDE2OSwxNzEsMjQwLCAzNCwgMzIsCisgICAgMTQ4LDIwOCwxODAsMTg1LDEzMCwgMTcsICA3LCA3NCwxMzUsMTc0LCA1OSwyNTIsIDMxLCA4MCwyMjIsIDgwLAorICAgICA2OCwgNzMsMTIxLCA5OCwgNzcsMjM2LCA4NiwgNTgsMTI4LDE2MCwgODgsMjU1LCAgNiwgIDAsMTYxLDIzMiwKKyAgICAxOTgsMjQwLCA2OCwyNDksMTAzLCA3NiwgIDAsICAwLCAgMCwgIDAsIDczLCA2OSwgNzgsIDY4LDE3NCwgNjYsCisgICAgIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfdm9sdW1lX3VwX3BuZ1szODU2XSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDAsIDY3LCAgMCwgIDAsICAwLCA0OSwgMTYsICA2LCAgMCwgIDAsICAwLDIwOSwxNzYsMjAwLAorICAgIDI1MCwgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAxMCwgNzksMTA1LCA2NywgNjcsIDgwLCA4MCwxMDQsCisgICAgMTExLDExNiwxMTEsMTE1LDEwNCwxMTEsMTEyLCAzMiwgNzMsIDY3LCA2NywgMzIsMTEyLDExNCwxMTEsMTAyLAorICAgIDEwNSwxMDgsMTAxLCAgMCwgIDAsMTIwLDIxOCwxNTcsIDgzLDEwMywgODQsIDgzLDIzMywgMjIsIDYxLDI0NywKKyAgICAyMjIsMjQ0LCA2NiwgNzUsMTM2LDEyOCwxNDgsIDc1LDExMSwgODIsIDIxLCAgOCwgMzIsIDgyLCA2NiwxMzksCisgICAgMTI4LCAyMCwxNDUsIDM4LCA0MiwgMzMsICA5LCAxNiwgNzQsMTM2LCAzMywxNjEsMjE3LCAyMSwgODEsMTkzLAorICAgICAxNywgNjksIDY5LCAgNCwgMjcsMjAwLDE2MCwxMzYsICAzLDE0MiwxNDIsMTI4LDE0MCwgMjEsIDgxLCA0NCwKKyAgICAgMTIsMTM4LCAxMCwyMTYsICA3LDIyOCwgMzMsMTYyLDE0MiwxMzEsMTYzLDEzNiwxMzgsMjAyLDI1MSwyMjUsCisgICAgMTIzLDE2MywxMDcsMjE0LDE4OCwyNDcsMjMwLDIwNSwyNTQsMTgxLDIxNSwgNjIsMjMxLDE3MiwyNDMsMTU3LAorICAgIDE3OSwyMDcsICA3LDE5MiwgIDgsIDEyLDE1MCwgNzIsIDUxLCA4MSwgNTMsMTI4LCAxMiwxNjksIDY2LCAzMCwKKyAgICAgMTcsMjI0LDEzMSwxOTksMTk2LDE5OCwyMjUsMjI4LCA0NiwgNjQsMTI5LCAxMCwgMzYsMTEyLCAgMCwgMTYsCisgICAgICA4LDE3OSwxMDAsIDMzLDExNSwyNTMsIDM1LCAgMSwgIDAsMjQ4LDEyNiwgNjAsIDYwLCA0MywgMzQsMTkyLAorICAgICAgNywxOTAsICAwLCAgMSwxMjAsMjExLCAxMSwgIDgsICAwLDE5MiwgNzcsMTU1LDE5MiwgNDgsIDI4LDEzNSwKKyAgICAyNTUsIDE1LDIzNCwgNjYsMTUzLCA5MiwgIDEsMTI4LDEzMiwgIDEsMTkyLDExNiwxNDUsIDU2LCA3NSwgIDgsCisgICAgMTI4LCAyMCwgIDAsIDY0LDEyMiwxNDIsIDY2LDE2NiwgIDAsIDY0LCA3MCwgIDEsMTI4LDE1NywxNTIsIDM4LAorICAgICA4MywgIDAsMTYwLCAgNCwgIDAsIDk2LDIwMywgOTksIDk4LDIyNywgIDAsIDgwLCA0NSwgIDAsIDk2LCAzOSwKKyAgICAxMjcsMjMwLDIxMSwgIDAsMTI4LDE1NywyNDgsMTUzLDEyMywgIDEsICAwLCA5MSwxNDgsIDMzLCAyMSwgIDEsCisgICAgMTYwLDE0NSwgIDAsIDMyLCAxOSwxMDEsMTM2LCA2OCwgIDAsMTA0LCA1OSwgIDAsMTcyLDIwNywgODYsMTM4LAorICAgICA2OSwgIDAsIDg4LCA0OCwgIDAsIDIwLDEwMiwgNzUsMTk2LCA1NywgIDAsMjE2LCA0NSwgIDAsIDQ4LCA3MywKKyAgICAgODcsMTAyLCA3MiwgIDAsMTc2LDE4MywgIDAsMTkyLDIwNiwgMTYsIDExLDE3OCwgIDAsICA4LCAxMiwgIDAsCisgICAgIDQ4LCA4MSwxMzYsMTMzLCA0MSwgIDAsICA0LDEyMywgIDAsIDk2LDIwMCwgMzUsIDM1LDEyMCwgIDAsMTMyLAorICAgIDE1MywgIDAsIDIwLCA3MCwyNDIsIDg3LCA2MCwyNDEsIDQzLDE3NCwgMTYsMjMxLCA0MiwgIDAsICAwLDEyMCwKKyAgICAxNTMsMTc4LCA2MCwxODUsIDM2LCA1NywgNjksMTI5LCA5MSwgIDgsIDQ1LDExMywgIDcsIDg3LCA4NywgNDYsCisgICAgIDMwLCA0MCwyMDYsIDczLCAyMywgNDMsIDIwLCA1NCwgOTcsICAyLCA5NywxNTQsIDY0LCA0NiwxOTQsMTIxLAorICAgIDE1MywgMjUsIDUwLDEyOSwgNTIsIDE1LDIyNCwyNDMsMjA0LCAgMCwgIDAsMTYwLDE0NSwgMjEsIDE3LDIyNCwKKyAgICAxMzEsMjQzLDI1MywxMjAsMjA2LCAxNCwxNzQsMjA2LDIwNiwgNTQsMTQyLDE4MiwgMTQsIDk1LCA0NSwyMzQsCisgICAgMTkxLCAgNiwyNTUsIDM0LCA5OCwgOTgsMjI3LDI1NCwyMjksMjA3LDE3MSwxMTIsIDY0LCAgMCwgIDAsMjI1LAorICAgIDExNiwxMjYsMjA5LDI1NCwgNDQsIDQ3LDE3OSwgMjYsMTI4LCA1OSwgIDYsMTI4LDEwOSwyNTQsMTYyLCAzNywKKyAgICAyMzgsICA0LDEwNCwgOTQsIDExLDE2MCwxMTcsMjQ3LDEzOSwxMDIsMTc4LCAxNSwgNjQsMTgxLCAgMCwxNjAsCisgICAgMjMzLDIxOCwgODcsMjQzLDExMiwyNDgsMTI2LCA2MCwgNjAsIDY5LDE2MSwxNDQsMTg1LDIxNywyMTcsMjI5LAorICAgIDIyOCwyMjgsMjE2LCA3NCwxOTYsIDY2LCA5MSwgOTcsMjAyLCA4NywxMjUsMjU0LDEwMywxOTQsIDk1LDE5MiwKKyAgICAgODcsMjUzLDEwOCwyNDksMTI2LCA2MCwyNTIsMjQ3LDI0NSwyMjQsMTkwLDIyNiwgMzYsMTI5LCA1MCwgOTMsCisgICAgMTI5LCA3MSwgIDQsMjQ4LDIyNCwxOTQsMjA0LDI0NCwgNzYsMTY1LCAyOCwyMDcsMTQ2LCAgOSwxMzIsIDk4LAorICAgIDIyMCwyMzAsMTQzLCA3MSwyNTIsMTgzLCAxMSwyNTUsMjUyLCAyOSwyMTEsIDM0LDE5NiwgNzMsIDk4LDE4NSwKKyAgICAgODgsIDQyLCAyMCwyMjcsIDgxLCAxOCwxMTMsMTQyLCA2OCwxNTQsMTQwLDI0MywgNTAsMTY1LCAzNCwxMzcsCisgICAgIDY2LDE0NiwgNDEsMTk3LCAzNywyMTAsMjU1LDEwMCwyMjYsMjIzLCA0NCwyNTEsICAzLCA2MiwyMjMsIDUzLAorICAgICAgMCwxNzYsMTA2LCA2MiwgIDEsMTIzLDE0NSwgNDUsMTY4LCA5MywgOTksICAzLDI0NiwgNzUsIDM5LCAxNiwKKyAgICAgODgsMTE2LDE5MiwyMjYsMjQ3LCAgMCwgIDAsMjQyLDE4NywxMTEsMTkzLDIxMiwgNDAsICA4LCAgMywxMjgsCisgICAgMTA0LDEzMSwyMjUsMjA3LDExOSwyNTUsMjM5LCA2MywyNTMsIDcxLDE2MCwgMzcsICAwLDEyOCwxMDIsIDczLAorICAgIDE0NiwxMTMsICAwLCAgMCwgOTQsIDY4LCAzNiwgNDYsIDg0LDIwMiwxNzksIDYzLDE5OSwgIDgsICAwLCAgMCwKKyAgICAgNjgsMTYwLDEyOSwgNDIsMTc2LCA2NSwgMjcsMjQ0LDE5MywgMjQsIDQ0LDE5MiwgIDYsIDI4LDE5MywgIDUsCisgICAgMjIwLDE5MywgMTEsMjUyLCA5NiwgNTQsMTMyLCA2NiwgMzYsMTk2LDE5NCwgNjYsIDE2LCA2NiwgMTAsMTAwLAorICAgIDEyOCwgMjgsMTE0LCA5NiwgNDEsMTcyLDEzMCwgNjYsIDQwLDEzNCwyMDUsMTc2LCAyOSwgNDIsIDk2LCA0NywKKyAgICAyMTIsIDY0LCAyOSwgNTIsMTkyLCA4MSwxMDQsMTM0LDE0NywxMTIsIDE0LCA0NiwxOTQsIDg1LDE4NCwgMTQsCisgICAgIDYxLDExMiwgMTUsMjUwLCA5NywgIDgsMTU4LDE5MywgNDAsMTg4LDEyOSwgIDksICA0LCA2NSwyMDAsICA4LAorICAgICAxOSwgOTcsIDMzLDIxOCwxMzYsICAxLCA5OCwxMzgsIDg4LCAzNSwxNDIsICA4LCAyMywxNTMsMTMzLDI0OCwKKyAgICAgMzMsMTkzLCA3MiwgIDQsIDE4LDEzOSwgMzYsIDMyLDIwMSwxMzYsIDIwLCA4MSwgMzQsIDc1LDE0NSwgNTMsCisgICAgIDcyLCA0OSwgODIsMTM4LCA4NCwgMzIsIDg1LCA3MiwgMjksMjQyLCA2MSwxMTQsICAyLCA1NywxMzUsIDkyLAorICAgICA3MCwxODYsMTQ1LCA1OSwyMDAsICAwLCA1MCwxMzAsMjUyLDEzNCwxODgsIDcxLCA0OSwxNDgsMTI5LDE3OCwKKyAgICAgODEsIDYxLDIxMiwgMTIsMTgxLCA2NywxODUsMTY4LCA1NSwgMjYsMTMyLCA3MCwxNjIsIDExLDIwOCwxMDAsCisgICAgMTE2LCA0OSwxNTQsMTQzLCAyMiwxNjAsMTU1LDIwOCwxMTQsMTgwLCAyNiwgNjEsMTQwLCA1NCwxNjEsMjMxLAorICAgIDIwOCwxNzEsMTA0LCAxNSwyMTgsMTQzLCA2MiwgNjcsMTk5LCA0OCwxOTIsMjMyLCAyNCwgIDcsIDUxLDE5NiwKKyAgICAxMDgsIDQ4LCA0NiwxOTgsMTk1LCA2NiwxNzcsIDU2LCA0NCwgIDksMTQ3LCA5OSwyMDMsMTc3LCAzNCwxNzIsCisgICAgIDEyLDE3MSwxOTgsIDI2LDE3NiwgODYsMTcyLCAgMywxODcsMTM3LDI0NSwgOTksMjA3LDE3NywxMTksICA0LAorICAgICAxOCwxMjksIDY5LDE5MiwgIDksIDU0LCAgNCwxMTksIDY2LCAzMiwgOTcsIDMwLCA2NSwgNzIsIDg4LCA3NiwKKyAgICAgODgsIDc4LDIxNiwgNzIsMTY4LCAzMiwgMjgsIDM2LCA1MiwgMTcsMjE4LCAgOSwgNTUsICA5LCAgMywxMzIsCisgICAgIDgxLDE5NCwgMzksIDM0LDE0NywxNjgsIDc1LDE4MCwgMzgsMTg2LCAxNywyNDksMTk2LCAyNCwgOTgsIDUwLAorICAgICA0OSwxMzUsIDg4LCA3MiwgNDQsIDM1LDIxNCwgMTgsMTQzLCAxOSwgNDcsIDE2LDEyMywxMzYsIDY3LDE5NiwKKyAgICAgNTUsIDM2LCAxOCwxMzcsIDY3LCA1MCwgMzksMTg1LDE0NCwgIDIsIDczLDE3NywxNjQsIDg0LDIxMCwgMTgsCisgICAgMjEwLCA3MCwyMTAsMTEwLCA4MiwgMzUsMjMzLCA0NCwxNjksMTU1LCA1MiwgNzIsIDI2LCAzNSwxNDcsMjAxLAorICAgIDIxOCwxMDAsMTA3LDE3OCwgIDcsIDU3LDE0OCwgNDQsIDMyLCA0MywyMDAsMTMzLDIyOCwxNTcsMjI4LDE5NSwKKyAgICAyMjgsIDUxLDIyOCwgMjcsMjI4LCAzMywyNDIsIDkxLCAxMCwxNTcsIDk4LCA2NCwxMTMsMTY0LDI0OCwgODMsCisgICAgMjI2LCA0MCwgODIsMjAyLDEwNiwgNzQsIDI1LDIyOSwgMTYsMjI5LCA1MiwyMjksICA2LDEwMSwxNTIsIDUwLAorICAgICA2NSwgODUsMTYzLDE1NCwgODIsMjIxLDE2OCwxNjEsIDg0LCAxNywgNTMsMTQzLCA5MCwgNjYsMTczLDE2MSwKKyAgICAxODIsIDgyLDE3NSwgODEsMTM1LDE2OCwgMTksIDUyLDExNywxNTQsIDU3LDIwNSwxMzEsIDIyLCA3MywgNzUsCisgICAgMTY1LDE3MywxNjIsMTQ5LDIxMSwgMjYsMTA0LCAyMywxMDQsMjQ3LDEwNSwxNzUsMjMyLDExNiwxODYsIDE3LAorICAgIDIyMSwxNDksIDMwLCA3OCwxNTEsMjA4LCA4NywyMTAsMjAzLDIzMywgNzEsMjMyLDE1MSwyMzIsICAzLDI0NCwKKyAgICAxMTksIDEyLCAxMywxMzQsIDIxLDEzMSwxOTksMTM2LDEwMywgNDAsIDI1LDE1NSwgMjQsICA3LCAyNCwxMDMsCisgICAgIDI1LDExOSwgMjQsMTc1LDE1MiwgNzYsMTY2LCAyNSwyMTEsMTM5LCAyNSwxOTksIDg0LCA0OCwgNTUsIDQ5LAorICAgIDIzNSwxNTIsMjMxLDE1MywgMTUsMTUzLDExMSwgODUsIDg4LCA0MiwxODIsIDQyLDEyNCwgMjEsMTQ1LDIwMiwKKyAgICAgMTAsMTQ5LCA3NCwxNDksIDM4LDE0OSwgMjcsIDQyLCA0NywgODQsMTY5LDE3MCwxNjYsMTcwLDIyMiwxNzAsCisgICAgIDExLCA4NSwyNDMsIDg1LDIwMywgODQsMTQzLDE2OSwgOTQsIDgzLDEyNSwxNzQsIDcwLCA4NSwgNTEsIDgzLAorICAgIDIyNywxNjksICA5LDIxMiwxNTAsMTcxLCA4NSwxNzAsMTU3LCA4MCwyMzUsIDgzLCAyNywgODMsMTAzLDE2OSwKKyAgICAgNTksMTY4LDEzNSwxNzAsMTAzLDE2OCwxMTEsIDg0LCA2MywxNjQsMTI2LCA4OSwyNTMsMTM3LCAgNiwgODksCisgICAgMTk1LCA3NiwxOTUsIDc5LCA2NywxNjQsIDgxLDE2MCwxNzcsIDk1LDIyNywxODgsMTk4LCAzMiwgMTEsIDk5LAorICAgICAyNSwxNzksMTIwLCA0NCwgMzMsMTA3LCAxMywxNzEsMTM0LDExNywxMjksIDUzLDE5NiwgMzgsMTc3LDIwNSwKKyAgICAyMTcsMTI0LDExOCwgNDIsMTg3LDE1MiwyNTMsIDI5LDE4NywxMzksIDYxLDE3MCwxNjksMTYxLCA1NywgNjcsCisgICAgIDUxLCA3NCwgNTEsIDg3LDE3OSwgODIsMjQzLDE0OCwxMDIsIDYzLCAgNywyMjcsMTUyLDExMywyNDgsMTU2LAorICAgIDExNiwgNzgsICA5LDIzMSwgNDAsMTY3LDE1MSwyNDMsMTI2LDEzOCwyMjIsIDIwLDIzOSwgNDEsMjI2LCA0MSwKKyAgICAgMjcsMTY2LCA1MiwgNzYsMTg1LCA0OSwxMDEsIDkyLDEwNywxNzAsMTUwLDE1MSwxNTAsIDg4LDE3MSwgNzIsCisgICAgMTcxLCA4MSwxNzEsIDcxLDIzNSwxODksIDU0LDE3NCwyMzcsMTY3LDE1NywxNjYsMTg5LCA2OSwxODcsIDg5LAorICAgIDI1MSwxMjksIDE0LCA2NSwxOTksIDc0LCAzOSwgOTIsIDM5LCA3MSwxMDMsMTQzLDIwNiwgIDUsMTU3LDIzMSwKKyAgICAgODMsMjE3LCA4MywyMjEsMTY3LCAxMCwxNjcsIDIyLCA3NywgNjEsIDU4LDI0NSwxNzQsIDQ2LDE3MCwxMDcsCisgICAgMTY1LCAyNywxNjEsMTg3LCA2OCwxMTksMTkxLDExMCwxNjcsMjM4LDE1MiwxNTgsMTkwLCA5NCwxMjgsMTU4LAorICAgICA3NiwxMTEsMTY3LDIyMiwxMjEsMTg5LDIzMSwyNTAsIDI4LDEyNSwgNDcsMjUzLCA4NCwyNTMsMTA5LDI1MCwKKyAgICAxNjcsMjQ1LCA3MSwgMTIsIDg4LCAgNiwxNzksIDEyLCAzNiwgIDYsMjE5LCAxMiwyMDYsIDI0LCA2MCwxOTcsCisgICAgIDUzLDExMywxMTEsIDYwLCAyOSwgNDcsMTk5LDIxOSwyNDEsIDgxLCA2NywgOTMsMTk1LCA2NCwgNjcsMTY1LAorICAgICA5NywxNDksIDk3LDE1MSwyMjUsMTMyLDE0NSwxODUsMjA5LCA2MCwxNjMsMjEzLCA3MCwxNDEsIDcwLCAxNSwKKyAgICAxNDAsMTA1LDE5OCwgOTIsMjI3LCAzNiwyMjcsMTA5LDE5OCwxMDksMTk4LDE2MywgMzgsICA2LCAzOCwgMzMsCisgICAgIDM4LCA3NSwgNzcsMjM0LCA3NywyMzgsMTU0LCA4MiwgNzcsMTg1LDE2NiwgNDEsMTY2LCA1OSwgNzYsIDU5LAorICAgICA3NiwxOTksMjA1LDIwNCwyMDUsMTYyLDIwNSwyMTQsMTUzLCA1MywxNTUsIDYxLCA0OSwyMTUsIDUwLDIzMSwKKyAgICAxNTUsMjMxLDE1NSwyMTUsMTU1LDIyMywxODMsIDk2LCA5MCwxMjAsIDkwLCA0NCwxODIsMTY4LDE4MiwxODQsCisgICAgMTAxLCA3MywxNzgsMjI4LCA5MCwxNjYsIDg5LDIzOCwxODIsMTg4LDExMCwxMzMsIDkwLCA1NywgODksMTY1LAorICAgICA4OCwgODUsIDkwLCA5MywxNzksIDcwLDE3MywxNTcsMTczLCAzNywyMTQsMTg3LDE3MywxODcsMTY3LCAxNywKKyAgICAxNjcsMTg1LCA3OCwxNDcsIDc4LDE3MSwxNTgsMjE0LDEwMywxOTUsMTc2LDI0MSwxODIsMjAxLDE4MiwxNjksCisgICAgMTgzLCAyNSwxNzYsMjI5LDIxNiwgIDYsMjE5LDE3NCwxODIsMTA5LDE4MiwxMjUsIDk3LDEwMywgOTgsIDIzLAorICAgIDEwMywxODMsMTk3LDE3NCwxOTUsMjM4LDE0NywxODksMTQ3LDEyNSwxODYsMTI1LDE0MSwyNTMsIDYxLCAgNywKKyAgICAgMTMsMTM1LDIxNywgMTQsMTcxLCAyOSwgOTAsIDI5LDEyNiwxMTUsMTgwLDExNCwgMjAsIDU4LCA4NiwgNTgsCisgICAgMjIyLDE1NCwyMDYsMTU2LDIzOCwgNjMsMTI1LDE5NywyNDQsMTUwLDIzMywgNDcsMTAzLCA4OCwyMDcsIDE2LAorICAgIDIwNywyMTYsIDUxLDIyNywxODIsIDE5LDIwMywgNDEsMTk2LDEwNSwxNTcsIDgzLDE1NSwyMTEsIDcxLDEwMywKKyAgICAgMjMsMTAzLDE4NSwxMTUsMTMxLDI0MywxMzYsMTM5LDEzNywgNzUsMTMwLDIwMywgNDYsMTUxLCA2MiwgNDYsCisgICAgMTU1LCAyNywxOTgsMjIxLDIwMCwxODksMjI4LCA3NCwxMTYsMjQ1LDExMywgOTMsMjI1LDEyMiwyMTAsMjQ1LAorICAgIDE1NywxNTUsMTc5LDE1NSwxOTQsMjM3LDE2OCwyMTksMTc1LDIzOCwgNTQsMjM4LDEwNSwyMzgsMTM1LDIyMCwKKyAgICAxNTksMjA0LCA1MiwxNTksIDQxLDE1OCwgODksIDUxLDExNSwyMDgsMTk1LDIwMCwgNjcsMjI0LCA4MSwyMjksCisgICAgMjA5LCA2MywgMTEsMTU5LDE0OSwgNDgsMTA3LDIyMywxNzIsMTI2LCA3OSwgNjcsIDc5LDEyOSwxMDMsMTgxLAorICAgIDIzMSwgMzUsIDQ3LCA5OSwgNDcsMTQ1LCA4NywxNzMsMjE1LDE3NiwxODMsMTY1LDExOSwxNzAsMjQ3LCA5NywKKyAgICAyMzksIDIzLCA2MiwyNDYsIDYyLDExNCwxNTksMjI3LCA2MiwyMjcsIDYwLCA1NSwyMjIsIDUwLDIyMiwgODksCisgICAgIDk1LDIwNCwgNTUsMTkyLDE4MywyMDAsMTgzLDIwMywgNzksMTk1LDExMSwxNTgsIDk1LDEzMywyMjMsIDY3LAorICAgIDEyNywgMzUsMjU1LDEwMCwyNTUsMTIyLDI1NSwyMDksICAwLDE2NywxMjgsIDM3LCAgMSwxMDMsICAzLDEzNywKKyAgICAxMjksIDY1LDEyOSwgOTEsICAyLDI1MSwyNDgsMTIyLDEyNCwgMzMsMTkxLDE0MiwgNjMsIDU4LDIxOSwxMDEsCisgICAgMjQ2LDE3OCwyMTcsMjM3LCA2NSwxNDAsMTYwLDE4NSwgNjUsIDIxLCA2NSwxNDMsMTMwLDE3MywxMzAsMjI5LAorICAgIDE5MywxNzMsIDMzLDEwNCwyMDAsMjM2LDE0NCwxNzMsIDMzLDI0NywyMzEsMTUyLDIwNiwxNDUsMjA2LDEwNSwKKyAgICAgMTQsMTMzLCA4MCwxMjYsMjMyLDIxNCwyMDgsICA3LCA5NywyMzAsIDk3LDEzOSwxOTUsMTI2LCAxMiwgMzksCisgICAgMTMzLDEzNSwxMzMsIDg3LDEzNCwgNjMsMTQyLDExMiwxMzYsIDg4LCAyNiwyMDksIDQ5LDE1MSwgNTMsMTE5LAorICAgIDIwOSwyMjAsIDY3LDExNSwyMjMsIDY4LDI1MCwgNjgsMTUwLCA2OCwyMjIsMTU1LDEwMywgNDksIDc5LCA1NywKKyAgICAxNzUsIDQ1LCA3NCwgNTMsIDQyLCA2MiwxNzAsIDQ2LDEwNiwgNjAsMjE4LCA1NSwxODYsIDUyLDE4NiwgNjMsCisgICAgMTk4LCA0NiwxMDIsIDg5LDIwNCwyMTMsIDg4LDE1NywgODgsIDczLDEwOCwgNzUsIDI4LCA1NywgNDYsIDQyLAorICAgIDE3NCwgNTQsMTEwLDEwOCwxOTAsMjIzLDI1MiwyMzcsMjQzLDEzNSwyMjYsMTU3LDIyNiwgMTEsMjI3LDEyMywKKyAgICAgMjMsMTUyLCA0NywyMDAsIDkzLDExMiwxMjEsMTYxLDIwNiwxOTQsMjQ0LDEzMywxNjcsIDIyLDE2OSwgNDYsCisgICAgIDE4LCA0NCwgNTgsMTUwLCA2NCwgNzYsMTM2LCA3OCwgNTYsMTQ4LDI0MCwgNjUsIDE2LCA0MiwxNjgsIDIyLAorICAgIDE0MCwgMzcsMjQyLCAxOSwxMTksIDM3LDE0MiwgMTAsMTIxLDE5NCwgMjksMTk0LDEwMywgMzQsIDQ3LDIwOSwKKyAgICAgNTQsMjA5LDEzNiwyMTYsIDY3LCA5MiwgNDIsIDMwLCA3OCwyNDIsIDcyLCA0MiwgNzcsMTIyLDE0NiwyMzYsCisgICAgMTQ1LDE4OCwgNTMsMTIxLCAzNiwxOTcsIDUxLDE2NSwgNDQsMjI5LDE4NSwxMzIsIDM5LDE2OSwxNDQsMTg4LAorICAgICA3NiwgMTMsIDc2LDIyMSwxNTUsIDU4LDE1OCwgMjIsMTU0LDExOCwgMzIsMTA5LCA1MCwgNjEsIDU4LDE4OSwKKyAgICAgNDksMTMxLDE0NiwxNDUsMTQ0LDExMywgNjYsMTcwLCAzMywgNzcsMTQ3LDE4MiwxMDMsMjM0LDEwMywyMzAsCisgICAgMTAyLDExOCwyMDMsMTcyLDEwMSwxMzMsMTc4LDI1NCwxOTcsMTEwLDEzOSwxODMsIDQ3LCAzMCwxNDksICA3LAorICAgIDIwMSwxMDcsMTc5LDE0NCwxNzIsICA1LCA4OSwgNDUsIDEwLDE4MiwgNjYsMTY2LDIzMiwgODQsIDkwLCA0MCwKKyAgICAyMTUsIDQyLCAgNywxNzgsMTAzLDEwMSwgODcsMTAyLDE5MSwyMDUsMTM3LDIwMiwgNTcsMTUwLDE3MSwxNTgsCisgICAgIDQzLDIwNSwyMzcsMjA0LDE3OSwyMDIsMjE5LDE0NCwgNTUsMTU2LDIzOSwxNTksMjU1LDIzNywgMTgsMTk0LAorICAgICAxOCwyMjUsMTQ2LDE4MiwxNjUsMTM0LCA3NSwgODcsIDQ1LCAyOSwgODgsMjMwLDE4OSwxNzIsMTA2LCA1NywKKyAgICAxNzgsIDYwLDExMywxMjEsMjE5LCAxMCwyMjcsIDIxLCAgNSwgNDMsMTM0LCA4NiwgIDYsMTcyLCA2MCwxODQsCisgICAgMTM4LDE4MiwgNDIsMTA5LDIxMywgNzksMTcxLDIzNywgODcsMTUxLDE3NCwxMjYsMTg5LCAzOCwxMjIsIDc3LAorICAgIDEwNywxMjksIDk0LDE5MywyMDIsMTMwLDE5MywxODEsICAxLDEwNywyMzUsIDExLCA4NSwgMTAsMjI5LDEzMywKKyAgICAxMjUsMjM1LDIyMCwyMTUsMjM3LCA5MywgNzksIDg4LCA0NywgODksMjIzLDE4MSwgOTcsMjUwLDEzNCwxNTcsCisgICAgIDI3LCA2MiwgMjEsMTM3LDEzOCwxNzQsIDIwLDIxOSwgMjMsMTUxLCAyMSwxMjcsMjE2LCA0MCwyMjAsMTIwLAorICAgIDIyOSwgMjcsMTM1LDExMSwyMDIsMTkxLDE1MywyMjAsMTQ4LDE4MCwxNjksMTcxLDE5NiwxODUsMTAwLDIwNywKKyAgICAxMDIsMjEwLDEwMiwyMzMsMjMwLDIyMiwgNDUsMTU4LCA5MSwgMTQsMTUwLDE3MCwxNTEsMjMwLDE1MSwgMTQsCisgICAgMTEwLCAxMywyMTcsMjE4LDE4MCwgMTMsMjIzLCA4NiwxODAsMjM3LDI0NSwyNDYsIDY5LDIxOSwgNDcsMTUxLAorICAgIDIwNSwgNDAsMjE5LDE4NywxMzEsMTgyLCA2NywxODUsMTYzLDE5MSwgNjAsMTg0LDE4OCwxMDEsMTY3LDIwMSwKKyAgICAyMDYsMjA1LCA1OSwgNjMsIDg0LDE2NCwgODQsMjQ0LCA4NCwyNTAsIDg0LCA1NCwyMzgsMjEwLDIyMSwxODEsCisgICAgIDk3LDIxNSwyNDgsMTEwLDIwOSwyMzgsIDI3LDEyMywxODgsMjQ2LCA1MiwyMzYsMjEzLDIxOSwgOTEsMTg4LAorICAgIDI0NywyNTMsIDYyLDIwMSwxOTAsMjE5LCA4NSwgIDEsIDg1LCA3NywyMTMsMTAyLDIxMywxMDEsMjUxLCA3MywKKyAgICAyNTEsMTc5LDI0NywgNjMsMTc0LDEzNywxNzAsMjMzLDI0OCwxNTAsMjUxLDEwOSwgOTMsMTczLCA3OCwxMDksCisgICAgMTEzLDIzNywxOTksICAzLDIxMCwgIDMsMjUzLCAgNywgMzUsIDE0LDE4MiwyMTUsMTg1LDIxMiwyMTMsIDI5LAorICAgIDIxMCwgNjEsIDg0LCA4MiwxNDMsMjE0LCA0MywyMzUsIDcxLCAxNCwxOTksIDMxLDE5MCwyNTQsMTU3LDIzOSwKKyAgICAxMTksIDQ1LCAxMywgNTQsIDEzLCA4NSwxNDEsMTU2LDE5OCwyMjYsIDM1LDExMiwgNjgsMTIxLDIyOCwyMzMsCisgICAgMjQ3LCAgOSwyMjMsMjQ3LCAzMCwgMTMsIDU4LDIxOCwxMTgsMTQwLDEyMywxNzIsMjI1LCAgNywyMTEsIDMxLAorICAgIDExOCwgMjksMTAzLCAyOSwgNDcsMTA2LCA2NiwxNTQsMjQyLDE1NCwgNzAsMTU1LCA4MywxNTQsMjUxLCA5MSwKKyAgICAgOTgsIDkxLDE4NiwgNzksMjA0LCA2MiwyMDksMjE0LDIzNCwyMjIsMTIyLDI1MiwgNzEsMjE5LCAzMSwgMTUsCisgICAgMTU2LCA1MiwgNjAsIDg5LDEyMSwgNzQsMjQzLCA4NCwyMDEsMTA1LDIxOCwyMzMsMTMwLDIxMSwxNDcsMTAzLAorICAgIDI0MiwyMDcsMTQwLDE1NywxNDksMTU3LDEyNSwxMjYsIDQ2LDI0OSwyMjAsIDk2LDIxOSwxNjIsMTgyLDEyMywKKyAgICAyMzEsIDk5LDIwNiwyMjMsMTA2LCAxNSwxMTEsMjM5LDE4NiwgMTYsMTE2LDIyNSwyMTAsIDY5LDI1NSwxMzksCisgICAgMjMxLCA1OSwxODgsIDU5LDIwNiwgOTIsMjQyLDE4NCwxMTYsMjQyLDE3OCwyMTksMjI5LCAxOSwgODcsMTg0LAorICAgICA4NywxNTQsMTc1LCA1OCwgOTUsMTA5LDIzNCwxMTYsMjM0LCA2MCwyNTQsMTQ3LDIxMSwgNzksMTk5LDE4NywKKyAgICAxNTYsMTg3LDE1NCwxNzQsMTg1LCA5MiwxMDcsMTg1LDIzOCwxMjIsMTg5LDE4MSwxMjMsMTAyLDI0NywyMzMsCisgICAgIDI3LDE1OCwgNTUsMjA2LDIyMSwyNDQsMTg5LDEyMSwyNDEsIDIyLDI1NSwyMTQsMjEzLDE1OCwgNTcsIDYxLAorICAgIDIyMSwxODksMjQzLDEyMiwxMTEsMjQ3LDE5NywyNDcsMjQ1LDIyMywgMjIsMjIxLDEyNiwxMTQsIDM5LDI1MywKKyAgICAyMDYsMjAzLDE4NywyMTcsMTE5LCAzOSwyMzgsMTczLDE4OCwgNzksMTg4LCA5NSwyNDQsIDY0LDIzNywgNjUsCisgICAgMjE3LCA2NywyMjEsMTM1LDIxMywgNjMsIDkxLDI1NCwyMjAsMjE2LDIzOSwyMjAsMTI3LDEwNiwxOTIsMTE5LAorICAgIDE2MCwyNDMsMjA5LDIyMCwgNzEsMjQ3LCAgNiwxMzMsMTMxLDIwNywyNTQsMTQ1LDI0NSwxNDMsIDE1LCA2NywKKyAgICAgIDUsMTQzLDE1MywxNDMsMjAzLDEzNCwgMTMsMTM0LDIzNSwxNTgsIDU2LCA2MiwgNTcsIDU3LDIyNiwgNjMsCisgICAgMTE0LDI1MywyMzMsMjUyLDE2NywgNjcsMjA3LDEwMCwyMDcsIDM4LDE1OCwgMjMsMjU0LDE2MiwyNTQsMjAzLAorICAgIDE3NCwgMjMsIDIyLCA0NywxMjYsMjQ4LDIxMywyMzUsMjE1LDIwNiwyMDksMTUyLDIwOSwxNjEsMTUxLDI0MiwKKyAgICAxNTEsMTQ3LDE5MSwxMDksMTI0LDE2NSwyNTMsMjM0LDE5MiwyMzUsIDI1LDE3NSwyMTksMTk4LDE5NCwxOTgsCisgICAgIDMwLDE5MCwyMDEsMTIwLCA1MSwgNDksIDk0LDI0NCwgODYsMjUxLDIzNywxOTMsMTE5LDIyMCwxMTksIDI5LAorICAgIDIzOSwxNjMsMjIzLCAxNSwgNzksMjI4LDEyNCwgMzIsMTI3LCA0MCwyNTUsMTA0LDI0OSwxNzcsMjQ1LCA4MywKKyAgICAyMDgsMTY3LDI1MSwxNDcsIDI1LDE0NywxNDcsMjU1LCAgNCwgIDMsMTUyLDI0MywyNTIsIDk5LCA1MSwgNDUsCisgICAgMjE5LCAgMCwgIDAsICAwLCAzMiwgOTksIDcyLCA4MiwgNzcsICAwLCAgMCwxMjIsIDM3LCAgMCwgIDAsMTI4LAorICAgIDEzMSwgIDAsICAwLDI0OSwyNTUsICAwLCAgMCwxMjgsMjMzLCAgMCwgIDAsMTE3LCA0OCwgIDAsICAwLDIzNCwKKyAgICAgOTYsICAwLCAgMCwgNTgsMTUyLCAgMCwgIDAsIDIzLDExMSwxNDYsIDk1LDE5NywgNzAsICAwLCAgMCwgIDQsCisgICAgIDU5LCA3MywgNjgsIDY1LCA4NCwxMjAsMjE4LDIzNiwxNTcsIDYxLCA3NiwgMjAsIDY1LCAyMCwxOTksIDg3LAorICAgICA2NywxNjMsICA2LCAyNywgIDgsIDI0LDE5NSwgNTMsIDY2LDE3NiwgMTcsMTg1LCA4MiwgNzgsMTA5LDE5NiwKKyAgICAgMjQsIDExLCA3NiwgNTIsIDM2LCA4NCwgNjgsMTc1LDE5NSwxNjMsMTQ4LDE0MywgODIsMTYxLDE3NywgMTYsCisgICAgMTc3LCAgNCwyMzYsIDc4LDExNSwgMjEsMTQxLDE5NywgODEsMTUzLCA4MCwgNDEsMTIzLDE1MCwxMDMsMTc2LAorICAgICAgMSwgNjUsIDExLDEzNiwgIDIsMjA5LCAgNiwxNDksIDQzLDIwNywgOTgsMjIyLDI1NSwyMDAsIDEyLDE4NywKKyAgICAxODMsMTE1LDE4MywxMTUsIDMxLDE4NywyNTEsMjU0LDIwNSwyMjgsMTUwLDE4NSwxODksMTIxLCA1NSwxOTEsCisgICAgMTU1LDI0NywyMjIsMTI0LCA0NCwxNjcsMTM4LDE5NywgOTgsMTc3LCA4OCwxODAsMTcyLCAyNywgNTUsIDUxLAorICAgIDE1MywyMzcsIDQ1LDE3MSwxOTgsMjM0LDEyNSwyMzMsMjM5LDI1MywxNTUsMTQ3LCAyMiwxNzEsMTY2LDI1MCwKKyAgICAyNDgsIDk3LDExNiwxODAsMTg3LDE5OSwxNzgsIDkwLDIwNCwyMjIsMTgyLDIzNywxNDIsIDQwLCAgNywxOTEsCisgICAgMjAxLCAzMiwxOTYsMjQ2LCAxMywxMjUsMTkyLDEwNywgODEsMjM2LDExNiwyMDIsMTYwLDE3MiwgOTQsIDE4LAorICAgIDIyOSwyMzksMjQ3LDIyMCwxODEsMTAyLDIxMiwgOTgsICA2LDEzMiwyMjgsIDM5LCAgMiwgOTcsIDg4LDE2OSwKKyAgICAxNzYsIDk1LDE1NSwxMDIsICAzLDE4MCwyMTYsIDIwLDEyOSwxMzYsIDE3LDEzMywyMTgsMTQ1LDE5MCwxOTgsCisgICAgMTYwLCA1MiwgIDQsMTQwLDE5MywxMDUsIDgxLDE0MiwxMTYsMjExLDEzMywyMjUsMjMwLCA0OCwxNjcsMTE5LAorICAgICA3OCwxNDgsMjA3LDIzMywyNDUsMTE0LDE1NiwgNzAsMTQ4LCAyMywyMjAsMjEzLDE0OSwyMzMsMTE2LDEwMSwKKyAgICAyMTMsIDMxLDIxNywgMTAsIDE2LCA3NywgNDYsMTgwLCAxOSwyMzcsMTAyLCAyNSwgIDYsICAzLCA5NSwxMDgsCisgICAgIDk4LCA2MSwxNTIsMTAyLDE2MiwyMjEsIDEyLDEzNiwgMzMsIDQ4LDIyNCwgNTAsMTMwLCAxMCwxMzIsIDI3LAorICAgICAzMiwxNzYsMTM5LCA4NSwgMzMsIDI0LCAgOCwgNDIsMTM1LDE1OCwxMzMsMjExLDEwOCwyMTYsICA1LCA1OSwKKyAgICAgODksMTU0LCA5NiwgMTIsMjA1LDEzNiwyNDIsMTA4LCAzOCwxNTYsMTAyLDE5NSwgNDYsMjE2LDIwMSwyNDIsCisgICAgICAwLCAgMywxOTEsMTYwLDE3NiwxODQsIDE0LCA5MywyMTUsMTk0LCAzNSwxMzUsICA3LCAyNCwyNDEsMTIwLAorICAgICA1MiwxOTEsMTM0LDE2OCwyMTgsMTczLCAxNSwxOTgsIDgyLCA2OCwxOTMsIDg4LCA5OCwgMjAsMjAyLDEzMCwKKyAgICAyMDksMjQ1LCA1MSwxNTQsIDk1LCAgMywgMzgsMTk4LCA4OCwgNDYsIDk2LDEzMiwgNTMsMjE2LDEwMCwgMjUsCisgICAgMjAyLCA3NCwxNjIsMTcwLDE3NCwxMzEsMTEyLDIxOSwxNjUsIDMxLCA3NSwgNDksIDI0LDI0MiwxMzYsMjQ5LAorICAgIDE4MiwgNTcsIDU4LDExMiwyMjQsMTM5LDIxNywyNTEsIDc3LDE1NiwgMTksMTAxLCA0MiwxNjUsMjUxLCAgMywKKyAgICAgOTYsIDQ4LDE1NCwyMzQsIDIzLDE0MSwgMTQsMTA4LCA1NSwxNDgsIDYyLCAyMywgNzAsMTU3LDE3NSwxNDMsCisgICAgIDE5LCAzMiwxMDMsIDUwLCAxMiwxMzQsMTUwLCA5OCwgIDcsMTQxLCAgNSwxOTQsMTExLDE0MCwxNjcsMTQyLAorICAgICA1NiwyMTYsMTE4LDE3NiwxODQsIDQwLDIxNSwxOTUsMTg4LDIwNSwyMzcsMTA1LCAgNiwgNjcsIDc1LCA1OSwKKyAgICAgMjksMjQ1LDI0OSwgMjgsMTE2LDE1NiwxMDUsIDMyLDExMiwxOTEsMjI4LCAyNiwxMDEsIDkxLDE4MCwgODEsCisgICAgIDEwLCAyNywxNTQsMjM2LCA2MiwyNDksMTI1LDE4MywxOTAsMTg2LDE0MSwgMjgsIDEyLCA3MCwgOTMsICA1LAorICAgICAzMiwyMDgsMTEzLDE2NiwxNzgsIDY0LDE0MCwgMTIsMTMzLDEzNSwyNDIsMjQ1LDEwMCwgNzgsMTI2LDE4OSwKKyAgICAgNTAsMjI3LDE1NiwxMzMsMTU4LCAxMiwgNzQsIDkxLDE4NCwxNzksMjUyLCA3MiwxMTksIDE1LCA0MywgOTIsCisgICAgMjEyLDIwMCwxNTQsIDg5LDE5MiwgMTYsMTM5LDEwMCwgNDEsMTUwLCA3MiwgODMsMTIzLCAzOCwgMjAsMTUxLAorICAgICA0OSwgNDgsIDQzLDIwMiwyMjAsIDIxLCA4MSwyMzAsMTIzLCAgOCwxMzYsMTI2LCA4MSwgMzgsIDE4LDI0NCwKKyAgICAxMTksICA2LDE5NSwxNDAsIDM4LCA5MCwgNTMsIDQzLDE4MiwxNTQsICA1LCAxNywgMzUsMTQyLCA2OSwxNzEsCisgICAgMTk2LCAyNywxMjcsMTAwLDE1MSwxNzcsMTIxLDE1OCwyMzQsMjExLDE5NiwgOTMsMTI0LCA2NSwyMzgsMjQ4LAorICAgIDI1MiwgNTYsIDkzLCA5NSwxNDcsMjM1LCA4OSwgOTksMjM2LCA3NCwxMzAsIDI1LCAgMywgOTMsMTQ0LCA5MywKKyAgICAgIDcsMTMyLDIwNSwyMTUsIDgwLDI1NCwxNzcsICAyLDIxMiwxNTYsIDk0LCA0NCwxMTcsMTU2LDE5OCwgNTAsCisgICAgIDI0LDEyOSwgMTgsMjEwLDIwNywyMTMsMjM4LDIwMiwgNTgsIDMwLDE3NywgIDQsMTMwLDIwNCwgOTMsIDIzLAorICAgICA0OCwxNDIsMjMxLDExMywgMjQsMTQwLCA4MCwxMDAsIDc5LDEwNiwgMTYsMTM5LDE0NSwyMjksIDY4LDE3MiwKKyAgICAxNzksMTY3LDI1MSwgIDksIDEyLCA3MCwgMzIsMjEzLDExOCwyMTUsIDM1LDIxNiwyMjEsIDQzLDE1OSwxODksCisgICAgIDQ4LCAyNCwgMzMsIDIxLDE3OCwgIDgsMTA0LDExNSwxNzAsMjUyLCAgOCwxNjIsMTMwLDIyNSwxODksIDQ5LAorICAgIDEzNywxOTMsICA4LDE0OCwgNDgsMjIzLDE2MCwxOTgsIDIwLDE4MiwxNzgsMjUxLDE4OSwxMjcsIDY1LDExMywKKyAgICAgNDUsMTU3LDIwNiwyMzMsMTc5LDE3MCwyMjcsIDM1LDE2MCwxNTYsMTc0LDI1MCwyMTAsMjAyLDE3MiwgOTQsCisgICAgMTg5LDE3NCwyNTEsMjQyLDE4OCwgNjUsMTgxLDIwMiwyMzEsICA5LCAgNCwxNTQsMTkzLDEwOCwgMzksMTUxLAorICAgIDE0NiwgNTksMTQ4LCA3MSwgIDIsMTE3LDEwNywxMDIsMjA2LCAxMywxNTYsMTE3LDEwMywxMTIsIDI0LCAxMiwKKyAgICAxNTksMjAyLDI1NCwyMDgsMTcyLCA3MiwgMjksIDk3LDIzNCwxMjQsMjA2LDE1NSwxMzIsMjQzLDExNywgMjgsCisgICAgIDIxLDE5NywyMDEsMTkyLCAzNSwyMDIsIDk4LDIzNiwxMTksMTE0LCA4NiwgODIsICAyLDExNiwgOTMsIDI5LAorICAgICA0MSwgMjQsMTQwLDEzNCwxNjgsMjEyLDE2MSwxMzQsIDE1LDExMiwxNDksIDkyLCA3NiwyMDIsMTIxLCA2OCwKKyAgICAgNDMsMjA4LCAxNywyMDUsMTIzLCAyMywgNDEsICA2LDI0OSwgMzksMjE1LDE5NSwxNjEsMTEyLDEwNywxMzksCisgICAgIDk5LCAxMiwyMzEsMTA0LDI1NCwxNjAsMTkwLDEyOCwyMzIsMTg2LCAzNCwgOTMsIDIzLDE0NywxOTAsIDQ2LAorICAgIDE4NywgMjYsMTU2LDIxNywxMzMsMTM5LDE5MywxNjIsIDg5LCA0MSwgNTQsMjMzLDExNSwyMDMsIDg2LDEyMCwKKyAgICAxOTYsIDQwLCA1OSwgNjMsIDgwLCA0NywgODcsMjQ0LDEzOSwgNTgsIDUyLDIzMywxMTUsIDQ1LCAgNSwxMDcsCisgICAgIDMzLDIwMiwyMTgsMTUzLDE0OSwgMjYsMTUxLDE3OSwgMjEsMTg0LDE1MiwxNDksICA3LDExMCwxMTksIDk4LAorICAgICA0OCwxNTQsIDY2LDIzMiwgODAsIDExLDEzOSwgOTksMTM0LDIzOCwyMzUsMjQ2LDEyNCwxNDYsMjI5LDIzOSwKKyAgICAgOTQsMjQzLCAyNiwgMTIsMTM0LDE2NCwgMzUsIDQ0LCA5MSwgNzksIDU0LCAyNCwgMTYsIDY3LCA2NiwgODAsCisgICAgMTUzLCAzOCwyMjQsIDk4LDE0OCwgMjksMjI5LDE5OCwxODgsMjIyLDIwMSwgOTYsIDcyLDIxOCwyMzcsICA4LAorICAgIDE2NywgOTMsMTEwLCA0NiwxOTgsIDkzLCAyOCwxMjQsMTc4LDExNiwxOTIsIDU2LCA1NywyMDksIDE3LDE0NSwKKyAgICAxNjAsMTc5LDE0NywgODEsIDQwLCAxMSwgNzAsIDg0LDE1OSwxMzgsMTk5LCA3OSwgIDMsMjQ0LCAgMCwxOTUsCisgICAgMTQyLDIzMiwgMTksMTAzLDEwOCwxMjYsMjEwLCA3OCwxMjEsIDQ4LCAxNiwxMjQsMTY5LDE3MSwxMTcsMTYxLAorICAgICAyOSwgNDEsMTY2LDE5NCwgMjksMTE2LCAyNiwgIDMsICAzLDIwMiwgNjIsMTQxLDEzNCwyNDksIDgxLDE3NywKKyAgICAyMTEsIDI0LCAyNCwxNjUsICA3LDE3MSwxMzQsMjQ0LCAyMCwgNTYsMjM2LDIyNiwyMTYsMTYyLDIwMiwxMTYsCisgICAgIDUzLCA1OSwgMTksMTc0LDE2OCwgMjksMTE4LDE5MiwgNDYsIDg2LDE0OSwgOTYsIDk2LDI0MywyMzMsMjUyLAorICAgIDIyMywgOTYsICAzLDEzMCwxMTgsMTk1LCAxNCwxODMsIDUxLDE1NywgNDQsIDc3LCA0OCwyMjAsICAwLDIwMSwKKyAgICAxMjcsIDE0LCA4NiwxMTIsMjAxLCA2NCwyMTIsICA4LCAxMiwgMjEsMTQ0LCA2OSwyMTgsMTIwLDE3OCwxODgsCisgICAgIDQ1LDIwMiwxNjMsIDM4LDI0OSwxOTQsMjA5LCAxNCwxODAsMTA3LDI1NCwxNDQsMTI5LDE2OCwgNzgsIDYyLAorICAgIDIxNSwgNzQsMTc2LDIyMiwxMTEsIDk1LCAyMSwxMDEsMTMwLCA1OCwxMDAsMTI4LDI0NiwgMjcsMTk2LDI0NiwKKyAgICAxMDcsMjE5LDEyNCwxODQsICA4LDEwOCwgOTMsMTk1LCA3OCwxNjUsICAyLCA2MywgNTksMTg4LDE3NywgOTYsCisgICAgMTY4LCAzNSwyMDEsMTcwLCAzNywxNTEsMjE2LCAzMiwxMzAsMjQyLDI0MiwgNDMsMTI3LDE1OSwxNzksMjQxLAorICAgICA2OCwxNDgsIDg4LCA0NiwyMzAsMjU1LCA0NiwgODAsIDQzLDI1MywgMzEsICAwLDE2NSwgNzcsIDQ2LDIyNSwKKyAgICAgMTcsIDI3LDIyMSwgMzksICAwLCAgMCwgIDAsICAwLCA3MywgNjksIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIF9kYXRhX2RldmljZV9wbmdbNDU1MTFdID0geworICAgIDEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTAsICAwLCAgMCwgIDAsIDEzLCA3MywgNzIsIDY4LCA4MiwKKyAgICAgIDAsICAwLCAgMSwxNDksICAwLCAgMCwgIDMsIDM0LCAgOCwgIDIsICAwLCAgMCwgIDAsIDQxLDEwNSwyMDEsCisgICAgMTM2LCAgMCwgIDAsICAwLCAgOSwxMTIsIDcyLCA4OSwxMTUsICAwLCAgMCwgMTEsIDE5LCAgMCwgIDAsIDExLAorICAgICAxOSwgIDEsICAwLDE1NCwxNTYsIDI0LCAgMCwgIDAsICAwLCAgNywxMTYsIDczLCA3NywgNjksICA3LDIxNiwKKyAgICAgIDEsIDMwLCAxMywgIDUsIDI5LDE2OSwxODIsIDU0LCA0OSwgIDAsICAwLCAzMiwgIDAsIDczLCA2OCwgNjUsCisgICAgIDg0LDEyMCwyMTgsMjM2LDE4OSwgODksMTEyLDEwMCwgODcsMTIyLDIzMSwyNDcsMTU3LDExNSwxMTEsMTc0LAorICAgICA4OCwgMTAsIDQwLCA4NCwgMjEsMTM5LDEwMCwgODUsMTQ1LCA0NCwxNDYsIDkzLDEwMCwgNTUsIDkxLDIwNSwKKyAgICAxMTAsMTgyLDEyMiwxMzksMjIyLDIxMiwxNDgsMTg2LCAzNywxODUsMjI5LDExMiwgNDMsIDM2LDIxNywxNTAsCisgICAgIDM0LCA3MCwxMTQsMTMyLDE2NSwxNTIsMjQxLDEzMSwgNjEsMTc4LDE1OSwxOTgsIDQ5LDE0MywgMTksMTU4LAorICAgIDE4MywxMTMsMjA0LDIxOSwxOTYsMjMyLDEwMSwyNDQsIDQ4LCAxOSwgOTksIDQzLCAyOCwxNTQsMTEzLDEwNCwKKyAgICAxMDgsMTA1LCA3MCwxMDYsMTQxLDEzMCwgODIsMTExLCA4NiwxNzksIDkxLCAxOCwxNTUsMTA4LCA1NCwxNTEsCisgICAgIDM0LDEwNywgOTcsIDg1LDE2MSwgMTAsIDY0LCAgMSwxODUsMjIwLDIyOSwgNDQsMTU5LCAzMSwyMzgsMTE4LAorICAgIDIzOCwyMDUsICA0LDE0NCwgIDAsIDE4LDE4NSwgIDAsMjU1LCAzMSwgNzMsIDQ4LDE0NSwxODQsMTUzLDEyMSwKKyAgICAgNTEsMTQ1LDI0OSwxOTUsMjU1LDI1MSwyMzgsMTg1LDIzMSwxMzYsMTgzLDIyMywxODUsIDc4LCAgMCwxNDAsCisgICAgICAxLCAzMCwxMjEsIDc1LDEyOSwgMjMsIDExLDE0MCwgIDUsIDMxLCA0NywxOTMsMTM3LDIwOSwgIDcsIDUxLAorICAgICA0OSwgOTEsMjMwLDE3MCwgODMsMTUyLCA4OSwgNDEsMTY1LDE0OCwxNzgsMTUwLDI0NywyMDgsIDEzLCA1MSwKKyAgICAgNzEsIDgxLDIxMiwyMzcsMTE4LDE0OSwgODIsICA3LDIxMywgMjAsMjM5LDEwMywxNzcsMTIyLDE4OSwxOTAsCisgICAgMTg0LDE4NCwyMTYsMTA0LCA1MiwxMzIsMjE2LCA3NSwgOTQsIDY2LDEzNiwgOTAsMTczLCA5NCwxNzEsMjEzLAorICAgIDE2NCwgMjAsMTMxLCA2MywxNDcsIDY2LDIwOCwyMjIsMTgzLDEzNSwgNTgsMjI1LCA0NywgNDgsIDIxLDI1MSwKKyAgICAgODgsMjAzLDIwNCwxNjksMTEwLDE4MCwyMDksIDQyLDE0MiwxNDEsMTc3LCA2OCwxMDAsMTczLCAgOSwxMzAsCisgICAgMTYwLDIxNSwyMzUsIDI1LCA5OSwxNDYsIDc3LDE4MSwyMTQsMjUzLCA5NCwxNzUsIDMxLCAgNCwxOTgsMjMyLAorICAgICA5MiwgMjYsMTc3LCA4MiwgNTgsMTQwLCA2MCwxMDIsMjAzLDE4MiwgOTgsIDE4LDEwNywyMzcsMTE0LDE3MSwKKyAgICAgODUsMjQzLDE4OCwgNzYsMTA5LDE4NywgIDYsMTY1LDE1NCwyMzksMTc1LCA0NiwgNDQsMjAyLCA5NywxMTAsCisgICAgIDI4LDExOCwxMTMsMTY4LCAyMSwxMzQsMTcxLCA3NiwgMTcsIDk1LDIzOSwyNDUsMTQ4LDIwOSwxODcsIDI3LAorICAgICAzNiwyMTcsIDkwLCA0MCwxNjMsIDU5LCA4MSwgNDAsMTY1LCAyOCwyMTIsMTUxLDE0OSwxNjIsMjE0LDEwOCwKKyAgICAyMTQsMjM0LDI0NSwyNTIsIDc0LDIwNywyNDMsMjE4LDIzNywyNDYsIDY2LDEyMywxOTMsMjQzLDE4OSwyNDQsCisgICAgIDEzLDIzNywyNTEsMjM3LDExOCwxODcsMjEzLDEwNiwxMjEsMTU4LCA3MSwgNjgsIDgyLDIwMiwxMjIsMTg5LAorICAgIDIzOCwyNTEsIDYyLCAgOSwgNjUsIDY4LCA4MiwgIDgsIDMzLCA2OCwxMTQsMjQ5LDIyNCwgMzgsMTMxLDI1MSwKKyAgICAxMDIsIDE0LDEyOSwyNTAsMjQxLDIxNiwyMTAsIDgwLDEzOCwgNDksIDM4LDE0MiwgOTksMTA5LDE0MCwgNTMsCisgICAgIDM4LCAgOCwxMzAsMTI2LDE3NSwxNzUsMTQxLDIxNCwgOTAsMjQ3LDI1MSwyNTMsMTI2LDE5MSwxMTEsMTQwLAorICAgICA0OSwxOTgsMTMyLDI1MywxMjYsMTQxLDIwMCwgMzgsMTk0LCA5OCwyMTksMTcwLDIxMywyMTksMjQ1LCAgNiwKKyAgICAxMDMsICAyLCA4OCwxMDQsIDUyLCAyMywxNTUsMjA1LDIyNiwgMzUsIDc4LDE4MCwyMDgsMTA4LCA0NiwgNTQsCisgICAgIDkxLDE1NiwxODUsIDY4LCAxMiwgODEsIDEzLCAxNSwgMTAsMTM2LDEyMSwyMjQsIDM1LCA0MCwxNzgsMjI4LAorICAgICA1NCwxMTIsMTgxLDE3MSwxNzIsIDM0LDIyNCwxNDEsIDk0LCA2NSwgODYsMjQ3LDEzMSwyNDcsIDgwLDEyOCwKKyAgICAgMTYsMTMwLDExOSwgODMsMjI3LDE3NCwxODUsIDQ2LDE4OSwgNjksIDQ3LCAxMCwxMjMsIDgxLDIyOCwgOTQsCisgICAgMjIzLDEzOSwxNjIsMjI4LDE1NCwyMjgsMTkzLCAgMiwgMjEsMTM1LCA3MCwgMTEsIDMzLDEzNywyMDAsMTQ3LAorICAgICA4MiwxMjMsMTc4LDIxNywxMTAsMTIzLDE1OCwxNTEsMTg0LDE3NSwyMjEsMTEwLDI1MSwxOTAsMTU5LCA5MSwKKyAgICAgNzksMTIyLDE1OCwyMzksMTIxLDI0NSwxMjIsMjIxLDI0MywgNjAsIDMzLCA2OCwxNDYsMjQ5LDEzNiwgNjgsCisgICAgMTkwLDIyNywgIDIsMTc4LDEzMSwxOTEsIDc4LDEzNCwxNTUsMTQwLDE3NywxMTMsIDI4LCA0MSwxNzMsIDg1LAorICAgICAyOCwxMTksIDU4LDE1NywgNDAsMTM4LDE2MiwgNDAsMjE4LDIxNywyMTcsMTM3LDIyNywgNTYsIDEyLCAgMywKKyAgICAxNjEsIDEyLCA4OSwxMDcsMjE3LDEyMiwgNjYsMTU4LDEwNSwxODMsIDgzLCAxOSwgNTMsMTU1LCAxMSwxNDEsCisgICAgMTAyLDIzMCwxNjAsMjE0LCA5OCwxNzEsIDg1LDEyNCwxMDQsMTM5LDI1NSwxMTUsMTAyLCAxNiwgMzAsIDMwLAorICAgIDEzMCwyMDIsIDkxLCAxNCwgOTAsMTMxLDEzNywxOTcsIDk2LCA4NiwyMDIsMjM3LDE5NywyNTEsIDYwLDE4NSwKKyAgICAyMTAsMTU3LDE4NywgMTUsMTk5LCA0NCwgNzAsMjE0LCAyMywyMzcsMjI1LDE2MywxMDYsICA5LDIwMCwxMjMsCisgICAgMjM5LCAxOCwgMzEsMjI0LDIzNywgNDQsIDEwLDE2NywgMTEsMjI2LCA5MywyMzgsIDM0LDI1NSwyMDYsMTE3LAorICAgICA5NSwgNDcsMTM4LDI1MCwxMTMsMTIyLDE4NSwgMTksMTMzLDEzNCwgODgsIDEwLCA3MywgODIsMTM4LDEwMiwKKyAgICAxODksMjE3LDEwOCwyMTMsMjM1LDI0NSwyMjksMjI5LDIyOSwgNzAsMTYzLDIwOSwxMDQsIDUyLDE1MCwxNTAsCisgICAgMTUwLDEwNiwxODEsMTIyLDE3MywyMzAsMjE1LDIzNSwxMTcsMjMzLDEyMSwxMDUsMTY2LCAyNywgNDgsMTU2LAorICAgIDEyOCwyMjQsMjI0LDE3NSwgNDEsIDI2LDIwMiwgODgsMTA3LDE4MCwxNDIsMjI3LCA1NiwgMTIsMTk1LCA3OCwKKyAgICAxNjcsMjExLDIzNSwyNDUsMTQ2LDE5NiwyMTIsMjM1LDI0NSwxMzIsMjE0LDEwMCwxNzMsIDQ5LDIzMCwyMjAsCisgICAgMjEwLDExNCwyNDIsMTIxLDEyMSwxMDAsMTE3LCA1MywxODUsMjIxLDE5NywyMTMsMTc5LDE5NywgNzEsIDg3LAorICAgIDE2NCwxNTksMTQ5LDE0NiwxMzcsMTg0LDE0NCwgNzgsIDM4LCAzMiwgODcsIDY3LDE4OCwxMDcsMTE4LDIwMSwKKyAgICAyMjAsIDUyLDIzNiwgNzQsIDU1LCA1NSwxNzcsMTIzLDE4OSwxMTIsMjE5LCA5OSwxOTUsMTAxLCA0OCwxNjQsCisgICAgIDE3LCA1NCwyNDAsIDE5LDIyMiwgODcsIDc0LDIxMywgMjksMjE2LDE5OSwgNTEsIDk4LCAgNCwgNDMsMjQxLAorICAgIDIwOCwxMDIsIDIzLCAxNSwxMjcsIDkyLCA0OSwyMjgsMjMzLDE0MSwyMTQsIDQzLDIyNywyMzQsIDE5LCAyNCwKKyAgICAyNDIsIDM1LDEwMiwxOTAsMjIzLDIyMSwgNzMsMTc0LDE4NiwyMjMsMjM3LCAzNiwgMjcsMTEwLCAgNiwxMjUsCisgICAgMjA3LDI0MywxMzIsMjMxLDEzNywgNzAsMTI1LCA5NywgOTcsMTYxLDIxMywxMTAsIDQ3LCA0NCwgNDQsIDQ0LAorICAgICA0NCwgNDQsIDQ0LCA0NSwgNDUsIDUzLDE1NCwyMDUsMTIyLDE3MywyMzgsMjUxLDE1OCwxNDgsIDk0LDIxNCwKKyAgICAyMDMsIDE5LCAyMSwxMTksICA5LDIxNiwgMTMsMjU0LCA1OCwxNTQsMTY0LDIwMCwgOTAsMTYzLDE4MSwgMTQsCisgICAgMTk1LDE3NiwyMTksMjM3LDExOCwxODcsMjIxLCA3OCwxNjcsMjExLDIzNSwxMTgsMTgzLDE4MywxODMsMjM1LAorICAgICA2OCwgNzQsMjMzLCA4NiwxNzMsMjE0LDExMCwgNTIsMTM3LDI0OCwxNDUsMjEzLDE3OSwxOTYsMTg4LDIxNiwKKyAgICAxMDYsIDQ1LCA1NCwgOTEsMjM2LDEyNCwgNzQsMTMzLCA4MywgOTIsIDE3LDIzMSwgNjMsMjAxLCA2MywgNzQsCisgICAgIDY5LDIxMywxOTgsMTk2LDE4NSwxNjcsIDc0LDE4NSwxMzcsMTg1LDI0MiwxMDksMjM4LCAyOSwxMDIsIDQ2LAorICAgICA1NSwxNTgsMTg0LDEwNiwxNDYsMTI5LDEwNywxMzQsMTEwLCA4NiwyNDIsIDE0LDI0MywyMjIsIDQyLCAyNCwKKyAgICAxODIsIDI1LDIzNywgOTEsIDYzLDEzOCwxODksIDY3LCAyMCwgMTUsMTI2LDEyNiwxOTcsMTc0LDE2MiwgOTcsCisgICAgMjIyLDIxMywgNTksIDk4LDE1MSwxNTUsIDE1LDE4MSwxNDksMTEyLCAzMCwxMjUsMTgzLCAzMSwgMjEsMjI2LAorICAgIDIwMywgNTQsMjIxLCA5MywxMjEsMTg4LDIyMywxNDksMTg5LCA1NiwxNzMsIDkxLDIzOSwxMTksIDU5LDEzMCwKKyAgICAgNDAsIDgwLCA0MiwxNzgsMjE4LDI0NywxMDcsMTY2LCA5NCwgNTksMTE1LDIzMCwyMDQsMTYyLCA2NywxNzksCisgICAgMjE3LDI0NCwyNTMsIDkwLCAxOCwyMjEsMTM0LDIzOSwgMTksMjEyLCAgNiwxMjcsMTg1LDExMSwgNTEsMTA3LAorICAgIDE3MywgODIsIDQyLDI0MSwyMTIsMTk1LCAxMiwgODIsMTM4LDE0MSwxMDksMjE0LDEwNiwyMzcsIDcwLCA5OSwKKyAgICAxNzcsMjE3LCA5MCwxMDQsIDU0LCAyNywxODEsMjE4LDIxNywxNjUsMjI5LDIzNiwxMzEsMjAyLCA2OCwxMzAsCisgICAgIDI4LDEzNywxODQsIDk4LCA3NCwxMzgsMTY5LDIxMiwgNzksMTMzLDE1MSwxODQsMTY0LCAzOSwyMTUsIDc3LAorICAgIDIwNCwxMDEsMjExLDIyOSwxODMsMjI5LDE0NiwgOTksMTg0LCAyNiwyMDIsMjIwLDEyMywxNjgsMjE0LDE0MCwKKyAgICAgMjEsMjQ3LCA4MSwyNDksIDgxLDEzNCwgNzQsMTE4LDIyMywgNzgsIDIyLDI0MywgNjQsMjA2LDIyNiwxNDUsCisgICAgMTYyLDIxNSwgNDAsMTQ5LDE1OCwgOTksMTM1LDE0NiwgNDAsMTM0LCA4OSwgOTksMjAwLDE2NywgODgsIDEyLAorICAgIDIyMywgOTQsIDM2LCA3OSwxNzcsMTE2LDIzMSwgOTgsMjQ3LDE5OSwgMjEsMTg3LDIzOCwxNDksMTY4LCA2MiwKKyAgICAgODIsMTY5LCAgOCwgMjksICA4LCA4MCwyMDYsIDM3LDE2NywxMDYsMTczLDEwMCwyMzIsMjM2LDEzMywxMjEsCisgICAgIDI0LDI0NCwxNDksMjE0LDE4OSwgNTYsIDE0LCA4NCwgMjgsMTA0LCAyMSwgOTEsIDM1LDI1MywxNTQsMjE1LAorICAgIDEwNiwxNzQsMTcyLDE3NCwxNTgsIDU3LDExNSwxMDIsMTAxLDEwMSwgMzcsMjQxLCA5MCwxNzMsIDg2LDE0NywKKyAgICAgODIsMTUwLDExOSwgODIsMTQwLDE1MCwyMTgsICA0LDI1MiwxMTcsMTE0LCA4NCwyMTMsMjM5LCAgNywxNTcsCisgICAgMjA2LDIwNiwxOTUsMTM1LCAxNSwgNTUsIDU0LCA1NCwgNTgsMjE5LDIxOSwgNjIsMTE1LDIyMSwyNDcsIDIzLAorICAgICAyNiwyMDUsMTMzLDEwMiwxMTUsMTc3LDIxMywgNTgsMTg3LDE4MCwgOTIsMjQ3LDEyNSwyMTUsIDExLCA4NCwKKyAgICAxNjksMTg4LDI0MiwyMDMsIDM3LDIzOSwxNDgsIDM3LDE0OSwgMjcsMTM4LDE1NywyMTksMjMxLCA1NSwgNDEsCisgICAgIDkzLCA0MCwgIDQsMTUxLCA4OSwxMzYsMjIxLDEzOCwxNzYsIDQ4LDEwMiwxMjIsIDU3LDI1MSwxMDUsMjQ1LAorICAgIDE3OCwxMDcsIDUyLCA0NiwyMTIsMTk5LCA2MCwyMTYsMTg1LDExNCwgMzYsIDg1LDE5MCwxMzUsIDYxLDIzNCwKKyAgICAxOTMsMTkzLDE1NSwxNDAsMTA0LDE3NCwgODEsMjE5LCA4MywxODcsMTg2LCA2NywyMzYsIDM3LCA1MCwgODcsCisgICAgIDQ5LCA5OCwxMzYsMTkwLDI0MiwxMjMsMTc0LCAgNCwgNTIsMjMxLCA3NCwyMjUsMTI0LDI1MCwxNzksMjIxLAorICAgIDExMiwxODIsMTc0LDIyOCwgMzIsMTc3LDE4NywgIDQsMTU3LCA5OSwxNTEsMTU2LDEwOSwxOTUsMTk2LCA2OSwKKyAgICAxNDIsIDI3LDE0NCwgMzIsIDE5LDEwMywgIDcsIDQwLDIwMCwyNTMsMTQ2LDEwOCwxNzUsMTQwLDEyMSwgMjQsCisgICAgMjQ0LDEyMywxMTMsIDIwLCA0MCwgMjEsMTA2LDE2NSwxNTIsMTg1LCA4MSwgOTUsIDk0LCA4OSwgODksIDkxLAorICAgICA5MSwgNTksMTE1LDEwMiwxMDEsMTIxLDEyMSwxNjksMjIxLDExMCwgMzksIDgyLCAyNywyMTYsIDM1LCA0OSwKKyAgICAgNjYsIDk0LCAxOSwyNDAsMjE1LCA3NiwyMTksMjAyLCAyNCwgMjcsIDY5LCA5NywxODMsMjE5LDIyMSwyMTYsCisgICAgMjE2LDIxNiwyMjAsMjIwLDIyMCwyMjAsMjIwLDI0MCwgMTMsMjE1LCA2MSwxNzUsMjIxLDEwNCwxNTYsIDkzLAorICAgICA5MCwxNzQsMjE1LDI1MiwxMzksMTcxLDEwNywxMjEsIDg0LCAxNywyMDYsMTk5LDE4NCwxMDYsMTY4LDE3OCwKKyAgICAxMTAsIDUwLDIxNSwxNDgsIDM3LDE0OSwgOTMsMjAwLDExMSwgOTEsMTg2LCA4MCwxNDAsMTI3LCA1NiwyMDAsCisgICAgMTczLDE1NiwgNTgsMTQ1LDIwMywxMzgsIDQ0LCA0MSwxMTEsIDgwLDEwMCwyMTcsIDEzLDEzNSwxOTksMTg2LAorICAgIDEyOSwxNjYsIDkxLDE2NSwxNjcsMTgyLCA3MSwxNDcsMTA3LDI0NywgMTAsMTQ4LDExOSwyNTEsMTA4LDE0MCwKKyAgICAyNDQsIDQxLCAxNywyMjksMjA3LDIxOCwyMDgsIDQ0LCA4NiwyMzIsMTA4LDE2MCwgMjksMjM4LCA3MiwxNjcsCisgICAgMTA2LDE3MSwxNzIsMTI1LDE1OCwxMDksMTQ2LCAyOSwgNTAsMjA0LDE5MCwgMjEsMTQ5LDI1MiwxNDksIDU5LAorICAgICA3MiwyMjgsMjUxLCAzNiwyMDIsMTE0LDIwNCwgIDQsIDM4LDIwMiwxMzgsIDIwLDEwMSwxNjMsMTg2LCAzMCwKKyAgICAgMjAsIDY5LCA5NSwxMTEsMTg0LDEzOSwgNjksMjIyLDE2MSwgMTksMTEwLCA5MywgOTEsMjQxLCA5MCwyNTQsCisgICAgIDE4LDIyMywyMzksMTE3LDE0OSwyMTQsMjE5LCA5NywgMTYsIDI2LDE3MywxMzYsIDY4LDE2MywxOTAsMTc4LAorICAgIDE4MiwxMTgsMjU0LDI1MiwyNDksMTc5LDEwMywyMTUsMTUwLDE1MCwgMjIsIDI3LDE0MSwxMzQsMjMxLDEyMSwKKyAgICAyMzgsMTc5LCAyOCwgODksMTA2LCAgMiwyNTQsMTU0LDEwMiwgOTEsIDYxLCA4NiwxNzAsMjE1LDIzNywyMjIsCisgICAgMTkxLDEyNywyNTUsMjIyLDE4OSwxMjMsMjE5LCA5MSwgOTEsMjEwLDIxOCwxNjUsMTAyLDEwNywxNjEsMjE3LAorICAgICA2MCwxODcsMTg4LDE4OCwxODIsMTgwLCA5MiwyNDMsMTI1LCA4MSwyMDEsIDI2LDE4NSwgOTIsIDkyLCA3MywKKyAgICAgMzcsIDY3LCA1NywgMTksIDk1LDE3NiwxNjUsMTk0LCAyNywgNTQsIDIxLDE0MSwxMDcsIDI1LDIwMywxNDIsCisgICAgMjA2LDI0MiwgMTMsMTUzLCA0MiwgNTUsIDczLDE3NSwgNzYsIDE1LCA3OSwxNDYsMTA3LCA1MiwyMDMsMTg1LAorICAgIDIxNSwxNTIsMTUyLDE3MiwxMDcsMTgwLDIyNiwgIDIsMTE1LDE3NywgOTksMTIxLCA3NiwyMDMsMjQ2LDE5NCwKKyAgICAxODYsMTY1LDEwNywgODUsMTE1LDIzNiwgMjAsMTY4LCAyMSwgNTksMjM5LDExMCwxODAsMTYxLCA4NiwxMTQsCisgICAgMTExLDE4NCwxMTksMjMxLCA3NSwgMTIsMjA1LDEwOSwxODcsIDIxLDEzMywgMjEsIDQ5LDE0OSwgIDUsIDgyLAorICAgIDExNCwyMTcsIDk2LCAgMiwxMTQsMTM1LDEwNywgMTMsMjAyLDE2OCwgMTYsIDc3LDIwMSwgNTAsIDM0LDEzNywKKyAgICAgODUsMjA2LDIwNSwxNTYsMTU2LDE0OSwgOTUsIDQ2LCA3NiwxNDgsMjIyLDEzMywxMTIsIDMwLDIxNiwgMjksCisgICAgIDQ2LDE1NSwgNjMsMTc0LCA0MCwgMzAsIDM3LDE4NSwxNTEsMTk0LDEyOCwxNjIsIDE2LDEwMCwyNTAsIDIwLAorICAgIDEzMiwgNzIsMjM1LDIxOCwxOTQsMTE2LCA5MiwxODYsMTU2LDEyMSwxNzMsMTY4LDI0MSwxMzksICAyLDE0OCwKKyAgICAyMTYsMTQxLDIxMSwgNjgsMTc3LCA0OSwyMTksIDY1LDE3NiwgMjksICA1LDEyOSwgODYsMTI5LCA0OSwxNzgsCisgICAgMjEzLCA5MiwgODksIDkxLDE4NywxMTIsMjI1LDE5NCwyNDksMjQzLCAyMywgMjIsIDIzLCAyMywxMDYsMTgxLAorICAgIDEyMiwxMTMsMTYwLCA2NCwgMTIsMTcxLDExNywgNzksMTYyLDIwOSwxMDIsMjIwLCA5NSwyMDQsMjA0LDExMywKKyAgICAgMjgsMjM5LDIzNiwxMTYsMjE0LDIxNSwyMzksMjIxLDE4NiwxMTcsIDc1LDI0NSwyNTEsMjM3LCA5MCwxODksCisgICAgMjIxLDEwNCwgOTIsIDYwLDE4NywxMTgsMTE4LDEyMSwxODUsMjM4LDIxNSwyMDAsMTczLDE4OCwgMjgsIDUzLAorICAgIDE0OCwxODAsMTAxLCA0NSwgMTksMTAxLDE5OCwyMDEsMTc0LCA3OSwgNjgsMTQ1LDI0OCwgMzQsMjUzLDIwMiwKKyAgICAxODUsMTUyLDIxNiwgNTAsIDM3LDIyMiwgOTgsMjMxLCAzOCwyMTcsMjE1LDE5MywgMTEsMjEzLDE1OSwgMjIsCisgICAgMTE5LCA2OSwxMDgsMjM3LDEyOCwyMTIsIDUwLCAgNywgMTMsIDgzLDEwMywxNzcsMjE3LDE3NCwgMjUsMjA1LAorICAgIDExMywgNDksMTg3LDI1MCwyMjYsIDgyLCA5NSwxNzIsIDkyLDE1MCwgMTQsMTQ1LDIxOCwgODAsMTc1LDIzNywKKyAgICAxMTQsMjI5LDIwOCwxNzcsMTAyLDE2MywgODQsMTQwLDE0OSwgIDIsIDgwLDE0OCwxMDcsIDQ5LCA4MSwyMDEsCisgICAgIDQ3LDE3NCwgMzIsIDkyLCA2OSwxODUsMjAxLCA3MiwxNDgsMjQzLCA4NSwgNTgsMTIyLCA2NSwgMjAsMTIxLAorICAgICA3MywgNTYsMjQyLDIwMiwgNzcsMTQ3LDEyNSwgODMsMTg2LCAzOCwxNTEsIDg2LDIyNSwgNjUsIDgxLDE4NiwKKyAgICAgNTcsIDEzLCA5MiwxNDcsMjUyLCAzOSwgNzUsMTE5LCA5MSwxODUsMTgzLDE3OCwyNDUsMTc4LDEyNSwgMjIsCisgICAgMjA2LDE0NywxMTYsIDI5LDIzMSwxNzAsIDM3LDIwMSwgOTksMjE3LDIyOSwyNDQsIDUzLDIwNywgNzQsMjEyLAorICAgIDEzOCwyMDksMTUyLCA0MCwyMTQsMTIyLCA1OSwgMTAsIDU1LDI1MCwxODksMjAwLDE1MiwgODgsIDgwLDI1MSwKKyAgICAyMzYsMjAyLDE2NSwxOTksIDQ3LDE1NywxOTEsMjQwLDIwMCwyNDIsMjQyLCA4MiwxODksIDk0LDIwNywgIDYsCisgICAgMTc1LDIzNywgOTgsMTgwLCAxOSwxNjEsMTc5LCAyNSwyNDQsIDIzLDEwNywxNzMsIDU5LDE1NywyMzgsMjIxLAorICAgIDE4NywxMTksMTEwLDIyMCwxODQsMTQ1LCAgOCwxMDcsMTAxLDExMywyNDEsMjM2LDI0MiwxNTMsIDcxLDIwNywKKyAgICAxNzQsIDEzLCA4NSwgODUsMjQyLDIwMSwgMzEsIDM0LCAyMCwyMzUsIDU4LCAzNywgNzUsIDczLDIwMSwgNTYsCisgICAgMjQ3LDI1MiwyNTAsMjA0LCA4NiwyMDQsMjE0LDIyMSwxNTgsMTUyLDE0NywgMTcsMjQxLDE5NywgNjQsMjEyLAorICAgIDI0NCwgOTEsMTcwLDEwOCwgODksMjE3LCA0NCwgNTUsIDg3LDI0NiwxMzYsMjE0LDEyMSwxMzYsMTcwLDIzMCwKKyAgICAyMDIsMjE1LDIyOCwgMTAsIDQzLCAgNSwgNTgsIDg3LDE5OSwgNjAsMTcyLDIxOCwyMjksIDk3LDE0MSwxODUsCisgICAgMTg5LDE1NSwxMDQsIDYwLDIyOCwxNzYsMjMwLDI0MCwxMDcsMTUyLDI0NiwgNzUsIDg5LDI1MSwyNDYsMTg1LAorICAgICA2OCwxNjUsMjMyLDE2MiwxNjEsICAxLDEwNiwgOTYsMTk1LCA4MiwxNDksMTUxLDEyMSwxNjEsMTQ4LDE3MCwKKyAgICAyMTAsMjQ4LCA1MSwxOTYsIDc3LCA4NSwgNzksMTY1LDExNCwgNDEsMTYyLDE0NywgMTYsIDg1LCA4NSwgNTcsCisgICAgICAxLCA0NSwgMjcsMjA3LCAzNywxNjQsMTE1LCA3MSwgNjYsIDg2LDIzOSwyMDIsMTg1LCA2NywgMzMsMTc5LAorICAgICAgOCwgMzksIDY4LDEwNSwgNjMsIDUxLDIwNSwgMTMsIDIzLDEwMSwyNDUsIDY2LDIwMSwyMjYsIDM2LDE3MCwKKyAgICAgIDcsIDM3LCA3MiwxMzYsMjI2LDExOSwgMzQsIDY4LDIwOSwxMzEsMjA1LDI1NSwxMzAsIDE3LCA2MSwyMzIsCisgICAgMjQ3LDExOCwxNjIsMTc2LDE3MSwgOTgsIDM3LCA2OSwxMjMsMTE3LDI0NSwyNDIsMTQ5LCA0MywgMjMsIDQ3LAorICAgICA5NCwgOTIsIDkwLCA5MCwyNDIsMTI1LDIyMywxMjEsMjI1LCA2OSwgNTMsMjQyLDIwNiwxNzMsMjA2LDEwMiwKKyAgICAxOTQsIDk1LDIwNCwgMjgsMTk5LDIwOSwxMzEsICA3LCAxNSwxMTAsMjIxLDE4NiwxMTcsMjM5LDIwNiwxNTcsCisgICAgMTY2LDI0NCwyMDYsMTgwLDIxOSwgMjMsMjE1LDIwNiwgNjEsMTg2LDE4MiwgODYsIDQyLDE3OCwxMTQsMTAzLAorICAgIDIyOSwgOTUsIDQzLCAgMiwyMjYsMjM2LDIwMiwxOTYsIDI2LCA5MiwxODIsIDc2LCA5OCwxNzQsMjEyLCAzNSwKKyAgICAxNjksMTMxLDEzOCwgNDUsIDQ1LCA5MSwxMDcsMTM3LDI0MywxMDksMTM4LDEyMywyMDAsMTEwLDIzMiwxMjYsCisgICAgMTAxLDEwMywyMDMsMjM2LDIwMiwgOTIsMTQyLDI0OSwyMDYsMTAwLDE0MywgODAsIDg1LCA5NCwgOTgsIDQwLAorICAgIDIxNSwxMTMsMTAxLDE1MywyMzAsMjMwLCA3NCwyNDYsMTYxLDIwMCwxMzcsMTQyLDE5NywxNTYsIDM4LDE1NywKKyAgICAgODMsIDg0LCAzOCwgNDIsMTE5LCA0MywyMDIsMjM0LCA0OSwgODAsMTgzLDIxNSwgNTAsIDM2LDE0MiwxNDEsCisgICAgIDgyLCA5OSwyMzgsMjUzLDE4MiwgMjIsIDY3LDI1MSwgODYsIDY3LDEwNywgNjQsIDgxLDIzNywxODEsMTg3LAorICAgIDE5MywxMDEsIDcyLDI0NSwgODcsMTE3LCA4MywgNTcsIDM0LDE4NSwgMjIsMjAzLCAyMSwgNjcsIDM2LDE2NCwKKyAgICAgNDQsIDQ2LDE4NCwxODYsMTQ1LDE5NCwxODEsIDc2LDExMywxMDEsIDczLDExMiwgMTQsIDUwLCA4MSwgODgsCisgICAgMTgyLDE4MSwxMTIsIDEyLCA4NSwgOTIsIDg3LDE4NiwgIDksIDEzLDEyMywxNzIsMTA2LDEyNCwgMTksMTYyLAorICAgIDE3OCwyMzEsIDc4LDEzNywyMzQsMjQ0LCAxMCwgNjksIDU0LDIxMiwxNjMsMTIwLDEyNSwgNTcsIDU1LCA5MCwKKyAgICAxMjYsMTg4LCA2MCwgNjMsMTY2LDE0NywyNTIsIDM0LCA1NSwyNTAsMTg5LDE0MSwxNzYsIDMxLCA4OCwxOTUsCisgICAgMTczLDIzMCwxOTcsMTk5LCAzMSwxOTEsMjQ0LDI0OCwxNjUsMTgxLDExNSwxMDcsMjE3LCA4OSwxNjgsMTM1LAorICAgIDIwOCwxNTMsMTI4LDE5MSwxMzgsIDE1LDEzNSwgODIsMjM0LDE5MywxMzEsICA3LDIxNSwyMjMsMTI1LDI0NywKKyAgICAxOTMsMjUwLDI1MCwgOTgsMTg5LDI0MSwyMDAsMjE3LDE3OSwxNDMsMTU4LCA5MywgOTEsMTA4LDE4MSwxMzcsCisgICAgMTcwLCAyOSwxMTYsMTAyLCA3NSwxODIsIDI4LDExOCwgNDIsMTk0LDE3OCwgNTQsMTE5LCAgNCwgOTEsMTU1LAorICAgICA0MSwgMzUsMjIxLDE5MiwgOTAsIDc1LCAzNywxMzMsMTAxLDE1MCwgNzMsMTExLDEwMSwgNTEsMTIxLDE3NywKKyAgICAxODEsMTUwLDE3MiwxODEsMTY5LCA4OSwyMTYsIDI2LCA5MSwxODYsMjQzLDI1MiwyMzAsMTY1LDEyMywgOTYsCisgICAgMTAyLDIwMywxOTgsMTE0LCA2OSwxMTgsMjE3LDE1NywxODQsMjU0LCAyNiwxNTQsMjIxLCA5MiwgIDUsIDIzLAorICAgIDI0OSwxNDIsICA2LDExNiwxOTgsMTY1LDIzMCwyMTgsIDk0LDIwNSwxMjYsMTY3LCA4NSwyMzAsMTgyLDIyNCwKKyAgICAxMjEsMjE2LDIyNCwgNDcsIDMwLDEyNiwyMTAsMjA3LDE5MCwxMDMsMTAwLCAzMSwgOTYsMTY0LDE5NiwxMTAsCisgICAgMjA5LCA3NiwgIDgsMTc3LDEwNywxMzksMTY2LDE3MCwxNzksMTI5LDI0NiwgODYsIDk0LCA0OCwgNTgsMjMwLAorICAgICAyNiwgNzYsIDczLCAzNywxNjEsIDU2LDIzOCwgMTYsIDUwLDE5MSwgOTQsMjMwLCA5NSwgNDAsMjQzLDE0OCwKKyAgICAyMjcsIDQ0LCAzMywxMzIsIDM2LDIzMSwxNzgsMTE1LDEyOSwxMzIsMTQ0LDIzMywgMTMsMTQ3LDE1NSwgMTIsCisgICAgMjIwLCA0OCwxMjUsMjA4LDIwMiwxOTgsMjQ5LDE2MywgMTYsMTQ1LDExNSwgMTksIDI2LDE3OCwyMTksIDg5LAorICAgICA1MywyMzQsIDIyLDE2NywxODcsIDI3LDE0MSwxNzksMjI2LDE0NywxMzksIDk3LDEyNCwxNTYsIDI5LDI1NCwKKyAgICAyMjUsMTU4LDEzOCwgNTUsMTk1LDIyNCwgOTcsIDI4LDIzMywxMjIsMjM3LDE5NCwxNjUsMTk5LDE1OSwxMjIsCisgICAgMjM0LDE2OSwxMTUsMjMxLDIwNiwyMTMsMTA2LDE4MSwxODgsIDM5LDE4NCwxMDcsMTc3LCA1NywxOTUsIDQ2LAorICAgIDE1NSwxNzYsMTkxLDIxNiwgOTAsMjM4LDI0NSwxODYsMjE1LDE3NSwgOTUsMTI3LDI1NSwxODksMjQ3LDIzNCwKKyAgICAgMzYsIDQ2LDE1NywgNjMsMjU1LDIxNiwxODUsMjQzLDIwMSwxMDUsIDUyLDEyMSwgIDcsMTM4LCA0MiwxMjksCisgICAgMTAxLDE4NCwxMTYsMTUyLDE3MiwgNDUsMTY0LDE5NSwxMDgsIDE5LDE3MywxNTIsMTM4LCA5OCwxNzIsIDUzLAorICAgIDIxNCwyNDEsMTQ4LDE4MSwgNTQsMjUxLDE2OSwyMDUsMTc1LDIwMSwgNTQsIDU0LDIyOSwxMTEsMjQzLDIwMywKKyAgICAyNDksIDc3LCA1NiwxOTEsIDU1LCA0NiwxNzQsMTAzLDEwNywxNzksMTU3LCAyNSwxODAsMTAzLDExMywxODUsCisgICAgMTQ2LDIxMiwxNTYsMjAzLDIzOCwxNzcsMjAzLDEyOSwgNjAsIDUzLCA4MCwyNTAsMjM3LDIwOSwyMDQsIDU4LAorICAgIDE2MCwxMDUsMTIwLDIxNSwxMTEsIDcwLDEyNywyNTEsIDI4LDI1MCwyMzcsIDQ0LCAxNCwyNTIsMTMxLCAgMSwKKyAgICAyMzUsIDg1LCA3MSwgMTksMTg0LDI1MywgNDQsIDU1LDIzMiwyMjksIDgxLDE3MywxNTQsMjE1LDEwMCwxNjYsCisgICAgMTg4LCA4NCwgNTMsMTAxLCAgMSwyMDEsMjI2LDEzMCwxMTYsMTgwLCA4NSwxMjQsIDIxLCA1MCwyNTUsIDgxLAorICAgIDEwNSwxNzksIDk4LCA5OSwgNDEsMjAzLDEzMCwgMTksIDY2LDEyMiwgNTAsMjQzLDE1NCwgOTksMTgzLDIzNiwKKyAgICAxMzUsMjQ5LDExMCwgMTYsMTQ1LCAyNCwgODAsIDkxLDIyNiwgOTUsMTE0LCA1MiwgNzcsMTk3LDIwOSwxMzUsCisgICAgMTg4LCA3NywgODYsMjA5LCA4OSwyNTAsMjE1LCA0NSwgNjMsIDMyLDE0OSwxODgsMjIzLDEyMiwgNDIsMjIyLAorICAgIDE0MCwxOTQsMjA1LCA1NiwxNDYsIDc1LCAxMSwgNzksIDk0LDEyNSwyNTAsMTY5LDE3MSwgNzksIDQ1LCA0NCwKKyAgICAgNDQsIDU2LDIyNywyMDYsMTE4LDE0MywxMDIsIDUxLDIzMCwxNzgsMjAxLDI0OCwxMzksMTczLDE4MSwgOTEsCisgICAgIDkxLCA5MSwxMTEsMTg4LDI0MSwxOTgsMTk1LCAgNywgMTUsIDg2LDIxOCwyMzcsMTAzLCA0NywgNjMsMTc3LAorICAgIDE4MiwxODgsIDkyLCA3NywgMTksMjM4LCA3MSwxODksIDgyLDE3OCwgMjUsIDkxLDE0NiwgODQsIDY5LCA2MSwKKyAgICAyMDEsMTAxLDIyNywgOTIsMTA1LCA3NCwgNjMsMTgxLDE5OCwgMzYsMjQ3LDEwNSwxNzMsMTAxLCA5OSwyMDIsCisgICAgMjE1LCAyMywxNDYsIDQyLDEyNywxMDcsMTE1LCAzMywyMTgsMTI5LDEzNSwxNzksIDIxLDE2OSwgODksMTU1LAorICAgIDE2NCwxODgsMTI5LCAgMiwxNDcsMjIwLCAxMCwxNzcsIDg0LDI0MSwxNzcsMTU1LDE1NCwgNzAsIDI3LCA4OSwKKyAgICAxODYsMTgzLDEyOCwgMTQsMjQ1LDEyMywgNTcsMjAyLDE0MywxOTcsIDE3LCAzNiwxMTcsMjQ0LDIxOSwyMzYsCisgICAgIDU0LCA4MCwxMDgsMTQzLCA1OSwgMjUsMTQwLDEyNiwxMTAsMTcyLCAyNywxMDgsMTM1LDE4NSwgNTMsMTYwLAorICAgIDE2OCwgOTAsIDcwLCA3NCwgNDcsMjQzLDEzOSwgMzksIDExLCA4NSwyMDEsMjIxLCA0NywgNzUsIDMzLDE2NSwKKyAgICAgMjAsIDY2LCAxNCwgOTQsMjA2LDE5NywgMzksMTE1LDI0NywxNjUsIDYzLDE3MywxNTQsMTQ4LDE1NiwyNDQsCisgICAgIDcxLDEzMywxMjcsMjQzLCA5OCwgODMsMTQ4LDE4OSwxNTAsMjMyLCA3NiwgMjAsMTI3LCAgNiwyMDEsMTA1LAorICAgIDE3NywgODAsMjUwLCAyMiwyMjIsIDgxLDIwOSwyMjEsMTYwLCAyMywyNDksMjIyLDEzMywgMzksIDQ2LCA2MywKKyAgICAyNDcsMjIwLDI0MywxNzEsMTcxLDE3MSwyMDEsMjEyLCAyOSwxMjMsMjMwLDE3OCwyMjEsMTA2LCA3NiwxMTMsCisgICAgMTYyLDI1MiwxMDEsMTczLDEyNSwyNDgsMTEyLDIzNSwyNDUsMjE1LCA5NSwyMjMsIDkyLCA5NSwxOTEsMTE0LAorICAgIDIyNSwxNDUsIDM5LCAzMSwxMjUsMTE2LDE3NywyMTMsIDQ2LCAyNiwgNTgsMTEwLDI1NSwyMDAsMTczLDIwOSwKKyAgICAgNzQsMjAyLCA0OCwxMDUsMTcwLDE3OCwxNTYsIDk0LDIwNiwxMjQsMTQ4LDIzNCwgMzgsMjUzLCA5MCwxMzYsCisgICAgIDQxLDE0OSwgODQsMTE4LDEyNSwxMTMsMTkzLCAxNCwyMTcsMjIyLCAyNiwxNDcsIDYxLDE1NiwxNzcsIDM4LAorICAgIDEyMywxOTYsMTA4LCAgNywxMDgsMjE3LDEzMSwxMDUsMjU0LCA0MiwxNjUsMTk0LDE2MiwgNzUsMTk3LDE2NSwKKyAgICAxNDUsIDE2LDE4NywxNDIsMjU1LDIyOCwxNDUsMTgxLDE5NCwgNzEsMjEyLCAxOCwyMTEsMTcyLCAzNSwgMTQsCisgICAgMjU1LDE1MCwyMjMsIDU1LDI0OSwxMzcsMTQ1LDE5NiwgMzksMTE4LDIxOSwxODQsMTQ2LDI0MiwxMzIsMjE5LAorICAgIDEyOCwyMDcsMTg2LDEwNSwgNzgsIDg1LCA4OCwyMTYsIDQ1LDI0NSwxNTQsMTQ4LDE2OSwxNDMsMTc4LDE3NSwKKyAgICAgNjYsIDEwLCA0MSwxODksMjI2LCA3NCwgNzksIDU4LDE5NCwxMTQsMTkwLCA3NywxNzIsMjMxLDIwMSwxNDYsCisgICAgMjEyLDE1NiwgMTIsIDQwLDE2NSwxNjQsIDk3LDEwNiwxNzEsIDMwLCA4OCwgMTYsIDg0LDIwOSwgODksMTE0LAorICAgIDEyMiwgOTEsMjIyLCA3NSwyMDYsIDQ0LDE1MCwyNTQsMjI5LDE4MSwxMDgsMjUxLCA3NCwgNjEsMTM2LDE5NSwKKyAgICAxMDksMTkzLDE0MywgNjAsMjQ1LDIyOCwxMzUsIDYzLDI1MiwyMjUsMTQ5LDE0OSwxNDksIDYwLDE0NSwgMTMsCisgICAgMTg2LDEwOCwxOTEsIDgwLCAzOCwyMzAsMjE2LCA5NSwgNzYsIDI4LCAgNiwxOTMsMTU1LDExMSwxOTAsMTIxLAorICAgIDI1MywxNTcsMTE5LDE3NCwgNjIsMTE0LDI0MSwyMDEsMTk5LCAzMCwgOTEsMTA4LDE4MSwyMDMsMjA2LDExNCwKKyAgICAyNDIsIDc1LDEwMiwxNTYsIDYwLCA1OCwxODUsIDU3LCA0MCwyNDUsMTM5LCA0OSwxNjksIDg2LCA4MiwgNDksCisgICAgMTc3LCA1MywgNTgsMTE3LCA4MCwxNjIsIDQ1LCA5OSwxNzIsMTc5LDE1MywyMDksMTU0LDE0MSwxODEsMjE0LAorICAgICA4OCwgOTksMTc4LDIwNSwyMTAsMTExLDI0MywgNTksMjAxLDIyOCwxNDksIDkyLCA0MCwxOTcsMTc3LDE3MiwKKyAgICAyNDMsMTAxLDE3MSwgNDUsMTcwLDE5MywxNTQsMTQyLDI0NiwxNTIsMjQ3LDEzMywgNzEsMTE2LCAgOCwgMzEsCisgICAgMjAyLCA1MywxMzUsMTcxLCAyNSwyMzEsMjMyLDIwMCwyNDgsMTYxLDI0MywxNTUsIDI0LCA3MywxMjQsIDk4LAorICAgIDIyMywgMTUsIDkyLDE2NSwxMzMsIDM5LDEzNCwgIDksMjA2LCA2MSwxNjgsIDkwLCAgNCwxODUsMjEyLDEwOCwKKyAgICAxMTAsIDMzLDIzMywxOTYsIDQ5LDE3NSwyNDAsMTU0LDI0NCwgNTAsMTYzLDEyMSwgODIsIDc0LDIwNywxODEsCisgICAgMTUyLDI0NCwgNjAsIDg3LDEyNywxMjMsICA4LCA0NiwgNzksMTE1LDE0OCwgOTQsIDQwLDEwNiwyMTAsMTcyLAorICAgIDEzNywgMzgsMjQzLCAgMywxODQsMjA0LDE5NywgMTYsMTc5LDEyNCwgODgsIDk5LDIxNCwxOTYsIDc3LDI1NSwKKyAgICAyMDgsMjQ3LDE4MSwyMTgsIDgwLDIwOSwxMTgsMjA1LDEyMywyMzAsIDM1LCAzMSwxOTAsMTE4LDIzNywgOTAsCisgICAgMTcxLDIxMywxMTQsMjUwLDI1MywgMjEsMTQ5LCA4NSwgNjcsMTUzLCAxNiwgMTksIDIxLDIxNywxNTIsMjUzLAorICAgIDE5NywxMDgsIDU1LCA1NSwgNTUsMjU1LDI1MCwxMjMsMjIzLDE3MSwxNDcsMTIwLDIyNSwyMzMsMTY3LDIxNSwKKyAgICAyMDYsMTcyLCA4NCwgMTQsMjI1LCA4NSwxMzgsMTc4LDIxMiwgMzIsMTk4LDE4NiwxMjIsIDQyLCA4OSwgMzgsCisgICAgMTg5LDE3MiwxMDksMjQxLDIxMywgODgsMTU3LDEyNSwxNzEsMTQxLDE4MSwxOTgsMTA2LCA1MSwyNDAsMTczLAorICAgIDE3NywgMzgsMTg3LDE0NCwgOTUsIDgzLDEyMiwxODQsMTI5LCAxMCwyMTIsIDYxLCAgMiwyMzIsMTgyLDE5OCwKKyAgICAgNzUsMTI2LCAyNSwgNDEsMjE3LDI0MCwxNjgsIDE3LDEzOSwxOTksMjUwLCA1NSwyMjcsMTY0LCA3MiwxMDcsCisgICAgMTcyLDI0NywgMzksMTQyLDE3NiwxNDUsMjE2LDE3NSwgNDQsMjIxLCA2NywxMTIsMjM4LDEwMywyMjEsMjM3LAorICAgIDE5NCwyMDEsMjQ0LCAyNCwxMzAsMTQ4LCA3OCwyMjUsMTUzLCA3NSwgNDUsMjE1LCA4OSwxMjIsMTkzLDI0MywKKyAgICAxNjQsIDg3LDI1NCwxODIsMTYyLDE4MiwyMjgsMTMwLCA4NywgMTQsMTIyLDExMCwgNzMsIDQzLCAgNCwxMDEsCisgICAgMjQxLDE0NCwxNzgsIDM1LDE3NiwyMzgsIDY1LDEyOCwxMjQsIDE2LCA3MCwyMTQsMTgxLDIwNSwxMDYsIDIxLAorICAgIDEwNywxODEsIDQ5LCA5MywxNjMsMjM5LDE1MywxODQsMjQxLDIwMCwyNDksMTU5LDI1NCwyMzYsMTAzLDIwNywKKyAgICAxNTgsIDYxLCA5MSwxMzcsIDk5LDEwMSwxNDcsMTQ5LCA2OSwgNTQsMTY5LCA2OCwgNTQsIDU0LDEyNywgODksCisgICAgMTA3LDExMCwyMjEsMTg2LDI0NSwgNTUsMTc1LDE5MCwxMjIsMTEzLDI0NSwyMzYsIDc5LCA2MSwyNDMsMTA4LAorICAgIDIyMSwyNDcsMTQ3LDEyNiwxODgsIDkxLCAgOSwyMTgsMTkzLCAzNiwxMDEsMTQwLDIwOSwxNjksMTA3LCA1NiwKKyAgICAgMTksMTQxLDIwOSwxODYsMTc2LCA3OSwgOTgsIDM3LCA5OSwxNzIsMjE0LCA3MCwgMzksMjMwLDIwMiwxODIsCisgICAgMjA5LDIxOCwxMDYsIDk5LCA3NiwxMTgsMTY1LDEyMywyMTksMjI2LDIyMywxMTQsIDkzLDIzMywgMzAsIDU4LAorICAgICAyOCwxMDgsIDY5LDIzNywyMTcsMTI2LDIxOCwgNTUsIDM3LCAyOSwgNzgsIDczLCAzOSwgNTMsIDYyLDIwNSwKKyAgICAxNjEsICA3LDI0NywxNTgsMjE3LDEyMiwgODgsIDY0LDIxOSwgODMsMTEyLDE2NSwgMjIsMjQ4LCA2NCwxMDYsCisgICAgIDQzLDE4NiwyNDIsMjMzLDE0NCwxNDIsIDgyLCAxMSwgNDQsIDc5LCA5MSwxMzcsMTYxLDE2NCwyMzEsMTAxLAorICAgIDI1NSwxNjYsIDQ5LCA3NywxMjIsMTU4LDE0OCwxNTgsMjQ0LDE4OCwgOTIsMTI0LDE1MywyMDMsMTg4LDE5MywKKyAgICAxODgsMTUwLCAyOSwgNzAsMTEyLDE0MiwgODQsICA4LCA3MywxNjIsIDI0LCA2OSwxNTYsMTU3LCAzNiwxNDYsCisgICAgMTU2LCAgMCwgOTgsMjExLDIwMSwxNjMsMTA4LCA1MCwxODMsMTY2LDEzNywxNDAsMTg1LDEwMywgODQsMTI0LAorICAgIDEwMiwyNDEsMTY1LDIwNywxMjUsMjQ2LDIxMCwxNjUsMjAzLDIxNywxODAsIDI1LCAgMywxOTksIDc1LDEzNCwKKyAgICAgMzgsMTc4LDIyMSwgNzgsMTExLDE1NCwgMjksMTI3LCA0OSwyMTksMjUxLDI0NywyMzksMTI3LDIzMSwxNzUsCisgICAgMjU0LDIzNCwyMTgsMjI5LCA0MywyMTUsMTU4LDEyMCwyMTAsIDI5LCAyOCwxNDQsMjE1LDEwMSwgNzMsICA4LAorICAgICA1MCwxMzEsMTYyLCA3MywgMjgsIDg0LDE4NSwxNzIsMTgxLDIxMywyMTgsMTAwLDE5NCwgNTAsMjE3LDE4MywKKyAgICAxODIsMTIyLCA3NywxMDYsIDQ2LDE5OSwgODksIDc4LCA2OSwgODksIDU4LCAyNiwxNTIsIDMxLDEyMCwgMzMsCisgICAgMTAzLCAgNiwgIDcsIDMwLCA5MywgNzksIDYwLDE3OCwxMDMsMjI0LDE2MywxNDcsMjM3LCA1OSwxNzcsMjM1LAorICAgICAyMCwxNzgsMTIzLCA1MywyNDcsMTM0LDEyMiwxMDksIDMxLDE2OSwxNDksIDE1LCA4OSwgNzQsIDQxLCAgNywKKyAgICAyMjgsIDM3LDE2NSwyMzEsIDczLDIyMywyNDcsMTg4LDIyMCwgOTUsMTU4LDI0NCwxODksMjIwLDEwMSwxMzcsCisgICAgMjM5LCAgNiwgNzUsIDgxLDE4MywxNzYsMTE3LDIwNiwgMTYsMTYwLDE4OCwgNDUsMTQ2LCAzMCwxNDcsMjI2LAorICAgICAzNiwgOTMsIDI0LDEwOSwxODAsMjE0LDE5OCwgMjQsMTc5LCA3MywxNjYsMTg3LDE3OCwyNDQsMjQ5LDE1OSwKKyAgICAxMjUsMjQ5LDE5NCwyNDksIDExLCA4OSwyNTEsMjA3LCAyMSwyMTcsMjI0LDIwOSwyMjMsIDk5LDE4MywyMTYsCisgICAgIDE3LDI1MywxOTcsIDY1LCAxNiwxODgsMjQyLCAyMywxMjcsMTEzLDE4MiwyMTMsMjU0LDIyOCwgNzEsIDk0LAorICAgIDIwMCwgMTQsIDM1LDE2NiwxMzUsMjMxLDE3MiwgNDksMTA4LDE0NywgMjMsIDMyLDI0NywxNDUsIDU0LDE3MCwKKyAgICAyMjYsIDM1LDEwOSwxNDgsMTgyLDIzMywyNDUsMjAyLCA0MiwgOTksMTgwLDExNCwxNzQsMjA5LCA3MCwxNjksCisgICAgMjEwLDI0NiwyMDEsMjA1LDE0NywgNTYsMTUwLCAyMywxMzEsIDY5LDE5MSwyMDQsIDI5LCAxNywyMzQsMjMwLAorICAgICA0MSwyMjIsMTg3LDE3OCwgMjcsIDQ5LCA1OCwxOTMsIDc3LDExMiwyMjAsIDMzLDIzNiwgNTQsMTA4LDI0MiwKKyAgICAxNzcsMTcwLDIxNSwxMzQsIDc0LCA0NSwxODMsMTI5LCA1OSwxNzAsIDY3LCAxMCwgMzMsIDYwLCA3OSwgMTAsCisgICAgIDgxLDE0MiwxMDIsIDgyLDEyMiwxNTgsMjMxLDEyMSwyMTAsMjQ3LDE2NSwgMzksIDYxLDIwNywxNTEsIDk0LAorICAgIDIzNCwgNTAsIDQ3LDE1MSwgOTAsIDk3LCA1MiwxNzUsMTQ4LDIwMywxNzgsMjIyLDEyNywxNTgsIDIwLDIxMSwKKyAgICAxNjYsIDg4LDEyMiwgIDQsIDQzLDI0OSwgIDQsIDI3LDE3MywxNDksMjEwLDIxOCwgMjQsMTc5LDIzOCwxMzksCisgICAgMTk4LDIxMywgNDMsIDk1LDI1MiwyMDIsIDg3LCA5MCwxNzMsMTE4LCA5MCwgMTQsMTUxLDE2MiwgMzYsIDEzLAorICAgIDI1MSwgNTgsMTgwLCA1OSwgMzgsMTY2LDIzMywgNDcsMTA3LDIzNywgMjcsMTExLDE4OCwyNTQsMTkzLDI0NSwKKyAgICAyMzUsMTU5LDI0OSwyMzIsMTk5LDE1MCwyMTgsMTA5LDExOSwxNTIsMTIzLDIxMCwxNDEsIDUwLCA3MywxNTgsCisgICAgIDgyLDIwMiwxMDQsMTczLDE0OSwgNTAsIDQyLDI0OSwxNTQsMjUyLDE3MSwxMzksMTc1LCA5MCwxNTUsIDU2LAorICAgICA0NiwxNzQsMjA5LDIzMywgIDYsMjAxLDE5OCwgNzMsIDM0LCA1MSwgNzQsIDIzLDEzMywxMDAsMTI2LDEwOCwKKyAgICAxNzcsIDI0LDE2OSwxOTIsIDkyLCA1OCwyMTMsMTUzLCAxNSwgNDUsIDQxLCAyNCwgMTAsIDI4LDE0MywyMjEsCisgICAgMTk2LDE1OCwxOTksICA3LDI0NiwxNDQsIDkwLDIxMywxMDQsMTYyLCA2NiwyMTQsIDY0LDE3MSwgODQsMTU0LAorICAgIDE1OCwyMzEsIDc1LCA3OSwxMjIsMTkwLCA0NywyNTMsMjI4LDE3OCwyMzEsMjQ5LDE1OCwyNDQsMTU2LDE3NiwKKyAgICAyMzAsMTIxLCA4OSwgOTEsIDc3LDE1MCwxMzQsMTcwLDEwMSwgIDMsIDQ3LDEzOCwxMTgsMTUyLCA0OSwxOTgsCisgICAgIDI0LDE3MywxODEsMjEwLCA5MCwgNDEsMTY1LDE4MCwxMzgsMTUyLCAzMSwgNDQsIDUzLCA5NSwyNDgsMjQyLAorICAgICAyMywxNzUsIDYxLDI0NywxODgsMjMxLCA1NywyMjcsMjEyLDE2OCwxMTYsMjI2LDEzMSwxMDcsMTc3LDIxMCwKKyAgICAxMzcsMjUxLDIyNywxNzksMjE2LDIyNSwyNTIsMTk3LDExMywgMjgsMjU1LDIzMywxMjcsMjUyLDE0MywyMDcsCisgICAgIDk1LDE4NiwyNDIsMjEyLDIyNywxNDMsMTY3LCA1MSwyNDksMTg1LDIzMCwgODIsMjE4LDEwNiwxNzMsMTQ5LAorICAgICA1NCwgNDIsMjE0LCA3NCwyMzMsIDU2LDI0OSwgNTUsMTg1LCAyOCwxNTUsMjI4LDExNCwxNzIsMTQwLDEzOCwKKyAgICAgNzcsMTcyLDE4MCwgODIsIDM4LCA4NiwgOTAsMTk3LCA3MCwxMDUsIDE5LCA0MywxNjMsIDg0LCAxNywxOTMsCisgICAgMTE2LDIxNCwxNDYsIDU1LDIwNiwxOTIsMTc0LCA1MiwgOTEsMTAxLDIxMSwyMTIsIDEyLDE1OCwxMjUsMTg4LAorICAgIDE1OSwxMzYsIDMyLCA0MSwgNDgsIDM1LDEwNiwgMjcsMTcyLDE3MSwxOTYsMTc2LDE2NCwgMzgsMTM0LDEwMSwKKyAgICAxODAsMTYxLCA1OCwxMTUsMTQzLDEwOCwyMzAsMTcwLDI0MiwgNjAsMjIzLDI0MywxNDcsIDc0LDIxMSwyNDMsCisgICAgMTI0LCA2MywgMTksIDg5LCAyMiwyMDgsIDYwLCA5NSwxMjIsMTc4LDIwMCwxMDEsMjQ5LCA2NCwyMTcsMTk2LAorICAgICA5OCwyMDEsMjE2LDE2MiwxODAsMTQyLCA3NCwgMjEsIDIyLCA0MywgMjEsIDQzLDIxMywxNzUsMjUxLDI0NCwKKyAgICAyNTIsMjExLCA2MywyNDcsMTM5LDE5MSwxNTIsMTU3LCA0MywgOTQsIDI5LDExMSwxODcsIDcxLDEwNSwgNTcsCisgICAgMTc0LDEzOCwyNDIsIDE2LDI1NCwyMjYsMTczLDE3MywxNzMsIDg3LDI1NCwyNTIsMjA3LDE5MSwyNTIsMjQxLAorICAgIDE1MSwxNTAsIDIyLCAyMiwxMzYsIDQwLCAyOSwxMTksMTU0LCA1NSwxODIsMTQ4LCA3NCwxNTcsIDIxLDE5NywKKyAgICAgNTgsMTQyLCA4NCwgMjgsMjM1LCA0MCwyMTQsMTEzLDE3MiwxNjIsIDg4LCA2OSwgODEsMTE0LCA2NSwxOTksCisgICAgMTc3LDEzNywyMjcsIDY4LDEwNiwgMzgsMTQyLDIwMywxMjksIDQzLDEwNSwxMDUsIDI1LDE3NCwxODAsMTc3LAorICAgIDE1NiwxMDUsMTAxLDE3MCwgMTEsIDg4LDE5MiwgODMsMjI0LDIyOCwgNzQsIDc3LDEzNiwyMjUsIDU4LDE3MSwKKyAgICAgIDQsMTgwLDEzOCwyMDYsMjEwLDIyNywgIDAsMjA2LCA2NSwgIDAsMjA3LCA3OSwgODMsMTUyLDIzMSwyNTEsCisgICAgMTM3LDIwOSwgNjAsMjIzLDE3NSwyMzIsMjA0LDI0MywgNjAsMjQ3LCA1NiwxMDIsIDUwLCAgNywgNzAsMjQyLAorICAgICAgMSwgNTIsMjE0LDEwNiwxNjMsMTgxLDIxMCwgNzQsMjM1LCA4OCwxOTcsMTEzLDE3MiwgOTgsIDIxLDE5OSwKKyAgICAgNjgsMjE5LCA3OSwgNjAsMjUwLDIxMywgOTUsMjQ5LDIyOSwxMjQsMTc2LDIxNiwgMzIsIDM1LCA5MSwgNzYsCisgICAgIDI4LDE4NywxOTEsMTUyLDI0OCwxOTgsMjUxLDIzOSwgOTUsMTI3LDI1MywxNDEsMjA3LDEyNCwyNDQsMTY3LAorICAgIDIzNCwxODEsMTU0LDIwMCwgNzgsIDY5LCA3NiwgMTQsIDIwLCAzOCwgIDEsIDc0LDE5OSwxNzcsMTQyLCA5OSwKKyAgICAgMjEsIDcwLCA0MiwgMTAsIDg1LCAyNCwxOTksIDgxLDE2OCwxOTQsIDcyLCA2OSwgODEsMjUwLCA1MywxMzgsCisgICAgIDE4LDEzOSwyMzMsIDQwLCA1NCwgNzQsMTAxLDEyOSwgNzUsIDI3LDEwOSwxMzgsIDMzLCA5MywxMTAsIDM5LAorICAgIDEzOSwxMjAsMjQ4LCAyOCwgNDcsIDgwLCAyMSwgNTYsIDUzLCA4MiwxMTUsIDYzLDIzMCwgOTgsIDk2LDE2MiwKKyAgICAxMjQsIDU1LDE1NywgIDksIDE4LDEyMywxODcsMjA0LCA3NSwgMTksIDg5LCAyNiwxOTYsIDgyLDE1MSwyMTMsCisgICAgMjUyLDIwNCwxMDEsMTkwLDIzMSwyMjksMTM1LCAgOCwxMDAsMTE4LDE1NCwxMjIsIDU4LCA5NCwyMTksIDI0LAorICAgIDEwOSwxNDAsMjA5LCA3NCwxOTksIDc0LDE5NywgNDIsMTQyLDE0OSwxMzgsMTYyLCA0MCwxMDIsMjE5LDEyMSwKKyAgICAxMDAsMjM3LCA1MSwxOTEsMjUwLDE0MSwyMDMsMTUxLCA0NywxNjcsMjI3LDIyMCwxMzQsMTIxLDEwOCwyMjQsCisgICAgMTEyLDIyOSwxNzQsMTY3LDEyOSwgMjksMTUxLDE5MSwxNTIsMjM3LDEwNywxNzUsMTg5LDE4MiwxMjUsMjMxLAorICAgIDIzOCwyMzEsMTI2LDIzNCwgOTksMTQ4LDE1OSwxNzIsMTAzLCA0NCwgOTEsMTU1LDExNiwxODEsMTE2LCAyMCwKKyAgICAxNjcsMTU4LCAxMCwxOTUsIDU2LCAgOCwyMjcsIDQ4LDE0MCwxMzEsIDY0LDEzMywgODEsIDI4LDEzNCwxMTMsCisgICAgIDI0LDIzMCwyNTQsIDc0LCAgNCwxNTEsIDUyLDE4OCwgNzQsIDQ1LDE3MywgOTgsIDEwLCAgNywgMzQsMjI2LAorICAgIDI1MywgNTgsIDg5LCAgMCwxNTYsIDgyLDE2MywgMTMsMjEzLDIxNywgOTYsMTc3LCA1NywyMzIsMTc4LDIzNiwKKyAgICAxOTYsIDM5LCA0MSwgMTgsMTQ1LCA3MywyMzMsMTAxLCA2OSwxNjUsIDk1LDI0MywgNjEsMjA3LDI0NywgMTksCisgICAgMTQ1LCAzNywyNDUsMTY2LCA4NywxOTYsMTc3LDE4OCwxNTAsIDc2LDEyMiwgOTcsIDc0LDE3MSwgNTYsIDg2LAorICAgIDExMywgMjgsIDcxLDExMywgMjgsMTY5LCA1NiwxMzgsMjI3LDIzOCwgOTksMjMxLCA2MywyNTAsIDc1LDE5MSwKKyAgICAyNDAsMjUyLDEzNSwgNjMsMjM2LCA3MywgNDcsIDU5LDExMSwgOTMsIDEwLCA1NywgNzQsIDI4LCA1OSwgODIsCisgICAgIDE2LCAyNywyMTMsIDk1LDIwNCwyNDYsMTIzLDIyMywyNTEsMjIyLCA1MCwyMTEsMTM1LDE3NCwgNjAsMTQ1LAorICAgICA2MiwgNjYsIDUwLCA3NCwgMzYsIDU3LCAzOCwxNjgsMTQ4LCAxMCwgNjcsIDIxLCA2OSwxMTMsIDE2LDE5NiwKKyAgICAyNTMsIDQ4LDIzOCwyNDcsMTYzLDEyNiwgMTYsICA1LCA2NSwgMjgsICA0LDEzNywyMDAsIDg0LCAyNCwxNzAsCisgICAgIDQwLCA4NiwxMTMsMTY0LDIyNywxNzIsMTI3LDExMSwgMTIsIDU5LDIyNywyMjEsIDQzLCA2NywgNzAsMTYxLAorICAgICA0MiwgIDAsIDE0LDE3MywgNTEsMjE1LDEwMSwxMTAsMjQ3LCA5MiwxNTAsMTAyLDE5OSwgNzIsIDkwLDEwMSwKKyAgICAxOTQsMjAzLDE1NCwyNTAsMTkwLDIzOSwxMjMsMTkwLDE1OSwxMjYsMTE3LCA2OSwxNTAsIDQwLCA0NCwyMzMsCisgICAgMjM1LDEwMywgNDEsIDc2LDE2OSwyMDQsIDk1LDExMywgMjgsMTk3LDExMywgMjQsIDcxLDIwOSwyMTcsMTQ5LAorICAgIDE2NywxOTAsMjQxLDEzOSwxNTksMTIwLDIzMywxNjUsMTAwLDIzMywyMjMsIDUyLDI0NCwxODUsMjMxLDE0MSwKKyAgICAgODYsMjEwLDIxNiwyNDAsICA2LDI1NSwxOTMsIDIwLDIzMCwxNDMsIDM4LCA0NywxMjYsMjM3LDE4MSwyMTUsCisgICAgMTUwLCAxMiwgNjMsMTE1LDIyOSwgNzQsMjA5LDE3MywgNTUsIDU0LCAyNSwxNjgsMTY1LDE2MywgNTYsIDE0LAorICAgICA2NiwgMjEsICA0LCA4MSwgMTYsIDY4LDE4OSwxMjYsMjEyLDIzNSwgNzEsMjUzLCA5NCwyMTIsIDE1LDE2MiwKKyAgICAgOTQsIDYzLCAxNCwxOTUsIDU2LCAgOCwyMTEsMjE2LDE2NSwxNDgsMjA2LDE0MiwgMzksMTg2LDE0MSwxNzMsCisgICAgMTYxLDE2MywxNzcsICAwLCAgMCwyNTEsIDg2LCAzMCwyMTcsIDUwLCAzNCwyMzgsMTAwLCA3MSwyMTcsMTA1LAorICAgIDIxOSwxOTYsMTk3LDEwMCwxNzQsMTU2LDIwNywxNzksMjA3LDEzMCwgNTEsMTQ1LCAyNSwxNDcsIDcyLCA3MCwKKyAgICAxMDcsMTU3LDEwMCwgNDksMTU3LDIxMiwxNTAsMTY5LDE5NiwgMTAsMTUxLDE2NSwgNjksMTAxLCA2MiwyNDgsCisgICAgMTU4LDE3MywxNzYsMjM2LCA0OSwyNDksIDM2LCA0NCwgIDksMTk1LDEwMCwxNTIsMTI0LCAzOCwxMTcsMTAzLAorICAgIDI1MywyMzcsIDYzLDI0OCwyNDcsMTI2LDE3MywyNDYsMjA5LCAyMywgOTQsMTQ0LDE1OCwxOTksMTUwLDEzMywKKyAgICAgMjAsIDQ0LCA4OSwxMTIsMTE0LDIxMSwxMDAsIDYxLCA5NiwxNDUsIDc1LCA1MywgMjMsIDQ2LCAzOSwyMDMsCisgICAgMTU1LCA0OCwxMTMsMTQ1LDIwMCwxMjAsIDY4LDEzMywyNDksIDM1LDE4OCwxMDAsMTI0LDIyNywxOTgsMjUxLAorICAgICAxNSwxMTEsMTI3LDI0MCwyMzMsIDE1LDEyNywxMzIsMjQyLDE3OSwyMTUsMTQ3LDExMCwxODksIDgyLCA0MiwKKyAgICAxMzgsIDg0LCAxNiwxOTYsMjUzLCAzMiwyMzQsMjQ1LDE5NCwxMTAsIDQ3LDIzNiwyNDYsMTk0LCA5NCwgNDcsCisgICAgMjM0LDI0NSwxNjMsIDMyLDEzNiwyNTAsMTI5LCAxMCwxOTUsIDM2LDEwNCwgMjIsMjI3LDE4MiwgIDYsICAzLAorICAgICAyMywgIDAsMjI0LDIwMCwgNTgsMjE5LDE5NSwxMDEsMjMzLCA0NCwxMzUsIDY4LDE5NCwgMjEsIDI1LCAgOSwKKyAgICAxOTMsMTk4LDE3OCwgMTYsIDY2LCA4OCwxMDcsMTY1LDE0NCwgNzAsMTA2LCA0MSwxNjUsMTY3LCA2MSwxNTcsCisgICAgMjI4LDE3NCwgNzYsMTAwLDE5MCwxNjMsMTc2LDE2NCwxNTAsIDIwLDE1MCwxMzMsMTAxLDIwMSwyMjgsIDE3LAorICAgIDI0OSwgNjYsIDI0LCAzNCwxNTksMjAxLDE4MywxNzIsMTExLDIyMSwxMjUsMjM3LDI1NSwyNTIsMTE5LCAxMSwKKyAgICAgMTEsIDExLCA3OSwgNjIsMjQ5LDE2NCwxNDgsIDgyLDE3OCwxMDAsMTAyLCA0MSwxNTMsIDg5LCA3MiwgNDEsCisgICAgIDg5LDE0NCwxMTYsIDM5LCA5OSwxMTUsMTUxLDEyNCwgNzQsMjEzLDE5NywyMDQsICA3LCA4MywyMTYsMTkwLAorICAgIDI1NCwyMjYsMTczLDIwNSwyMDUsMTgzLDI1NSwyNDYsMjM5LCA2MiwyNTUsMjA5LDE1OSwyMDIsMjI5LCA2OSwKKyAgICAyMTQsIDkwLDE3MywgNzcsMTcyLCA4NCwgMjQsMTcwLDEyNiwgMTYsMjQ1LDEzMSwxNzYsMjExLCAxMywxODcsCisgICAgMjIxLDE3NiwyMTksIDEzLCA1OCwyMjEsMTY4LDIyMywxNDMsMjUwLCA2NSwgMjgsMTMyLDExMywgMjAsMTY5LAorICAgICA1NiwgNTAsIDc0LDIzNSwxMDgsMTI0LDEyNCwxMTMsMjI2LDIwNiwgIDEsIDM5LDEzOCwgIDEsICAwLCAyOCwKKyAgICAyMTgsMTAxLDIwNCwxMDUsMTEzLDE5OCwxOTYsMTA1LDEyOSwxNTMsMTM3LCA3NiwgMTYsIDExLCAyMiwgNDQsCisgICAgMTMyLCAzNywgNDMsIDg4LCA3NCwxMDcsMjExLCAgMSwgOTUsMjEwLDEyMCwgOTAsIDI2LDIwNywgNTUsMTkwLAorICAgIDEwMywxMjQsMjIzLDI0MywgMTgsMTM5LDEyMSwgNzMsMTIzLDEzOSwxMzYsMjAwLCA5MCwxOTMsIDg2LCA1MCwKKyAgICAxMjEsIDc2LCA3MywgMjIsMTcxLDE0NSwyMDgsIDY2LDE1NCwyMzUsIDU1LDE5MSwyNDUsMTExLDI1NSwgOTYsCisgICAgMjMzLDE5MSwyNTUsMjM5LCA4NiwyMDcsMTU4LDI0NSwxNjQsMTk5LDE0NiwgODksMTc4LDE0OCwxNjksMjAwLAorICAgIDE3OCwgMTgsIDg2LCA3NCwxMDUsMTU3LDIzNCwxNTAsMTg0LDExMiwyMTYsMTkzLCAyMCwyMzAsMjUzLDE0MywKKyAgICAyNTUsMjExLCA2MywyMjAsMjI3LCA1MywxMzcsMjI3LDI0OCwgNzksMjU1LDE1OSwyNTUsMjQ3LCA0MywgNDcsCisgICAgMTI2LCA2MCwgNjEsIDkzLDIyMSwgOTAsIDUwLDE5OCwgNDIsMTA5LDE2MiwgODgsICA3LCA5NywyMjAsMjM1LAorICAgICA3MSwxNTcsMTEwLDE4NCwxNzksIDE5LDEwOCwyMzksICA0LDIxOSwyMTksMjUzLDIzNywgNzgsMjA4LDIzMywKKyAgICAxMzIsMTU3LDExMCwyMTIsMjM1LDE5OSwgNjUsIDE2LDEzNSwxNjEsMTM4LCA5OSwxNjMsIDg0LDExOCwxMjIsCisgICAgIDM1LDExNSwxMDEsMTg1LCA4NiwgNDgsMTUzLDExOSwgNTQsMTc5LCAzNywgNTAsMjE3LDE5MiwgNTcsIDQ5LAorICAgIDExNiwgMjksMTk4LDEwOCwgNTQsICAyLDE5NSwxMDgsMTUyLDE0NywxOTEsMjIxLCA5OCwxNTEsIDUxLCAgMiwKKyAgICAgNDUsMTY3LDE1NSwxMDEsMTI3LDEzMiwxMzQsMTExLDE1MiwgMjgsIDY2LDIwNiwxNDIsMjAzLDIzNiwyNDEsCisgICAgMTg0LCAzNSwyMzcsIDMwLCAyNCwgODMsMjAzLCA3NiwgNTYsMjI1LCA0NCwgMTcsIDcxLDIxOCwxMTcsMjA2LAorICAgIDE1MCwgOTYsMTYwLDEyOSwgIDksIDIzLDIxMCwxMzcsMjQ5LCA0MCwxNTUsIDUxLDEzNCwxNDYsMTgyLDE0MywKKyAgICAgOTcsIDc0LDEwMiwxNDIsIDQ5LDE1MCwxODEsMTc3LDE5OCwgNDgsMTQ1LDEwMSwyMjYsMjQ1LDE0MSwxODMsCisgICAgIDU5LCAxNSwxNTksMjU0LDIwMCwxMzUsMTY1LCAyMCwyMzMsMjEyLDEzNywyMjksIDc5LDEyNCwxMTcsIDczLAorICAgICA2MCwgNDIsIDQ1LDEwMiwgNTUsMjI4LDEwOCwyNDAsIDY3LDIyOSwgNDcsMTgyLDIxNCwyNTQsMTY3LCA2MywKKyAgICAyNDksMTQ3LDIwNywgNjEsMjQ3LCA5NywxMDcsMTczLCA3NiwgMTUsMTYyLDE3OCwyMTMsMjE4LDEwMiwyMDEsCisgICAgIDQzLDIzNiwyNDYsMTk0LCA3OCwgMzksMjE2LDIzMywgIDQsMTU3LCA3OCwyMDgsMjMzLDEzNCwxODksIDk0LAorICAgIDIxMiwgNzksMTgxLDE2NSwxNDksIDc0LCA5OSwxNTEsMjA1LDIzMSwyMzEsMTUyLDE1NSwxMDUsMTY5LCA3OCwKKyAgICAxNDQsMTg1LDIwMCwxNzYsIDEzLDE0MCwyMzgsIDI1LCAyMSwgMjYsIDY3LCA2OCwgMTMsMjA3LCA5MSwyNDQsCisgICAgMTA2LCA0NSwyMDcsMjQ3LDIwMiwgMTEsMTQ1LCAyNSwyMzAsMjAwLDE1MiwxNzQsIDg2LDEyOSwyMTMsMTUwLAorICAgIDE4NSwgMzgsMjI5LDEzMCwgODcsMTA3LDEyMywxMjYsMTc4LCAyNCwxODAsMjM1LDE1NCwyMDAsMjE4LDE1OCwKKyAgICAgODYsMTI1LDE2MywgNTIsMTc5LCAzOSwgNjgsMjE5LDI0MywgMjMsMjUyLCA5MCwgOTMsMTIyLCA5NCwxMjEsCisgICAgIDUxLDE5NywxODIsMTc1LDExNywyMDcsMTY4LDIxNiwgOTAsIDczLDIxMiwyNDQsMjUyLCAgNSwxOTEsMjE0LAorICAgIDE0OCwyMjIsMjI0LDIyNywgIDYsIDcwLDExOSwxODEsIDEwLDE0MSwgMzgsMTYyLDEzNCwyNDQsIDIyLDI1MiwKKyAgICAgOTAsMjAzLDI0MywxMjQsIDMzLCA5NywxNzcsMjQxLDIzMCwxNzgsMTA2LDEyOSwyMDEsIDM0LCA0NywgNDUsCisgICAgMTQ3LCA1NiwgMzgsICA0LCA0OSwxNDcsIDQ4LDEzNCwxNjUsMTAwLCAzMywgNDQsMTc5LCAyMSwgNTAsMTUzLAorICAgICAyNSwyMDcsIDI2LDIwNywyNTAsMjE0LCAyNiwyMjcsIDM5LCAgMywgNDcsMTQ2LCAgOSwgNDUsIDQ0LDE0NywKKyAgICAxMDEsIDczLDIyOCwgMTcsMTIxLCA2OCwxOTAsMTQ4LCA2MiwxNzksIDQ3LDIxNywxNzYsIDUzLDE3NSwxOTAsCisgICAgMjQ2LDEwMywgMjMsMjU0LDI0OCwyMzEsMTI2LDIyNSwgMjMsMjUzLCAyNiwxMjMsIDgyLDE3OCwyNDQsMjE2LAorICAgIDExNSwgMjIsMTczLDE0NSwgNDQsIDczLCA3NCwgNjUsMTgyLCA4OCwxMjUsIDMyLCA5NSwgNDksIDQ3LDExMSwKKyAgICAxMzUsICA5LCAyMiwyNDksIDc2LCA2MywyMjYsMTYwLDI1NCwgOTgsIDM4LDEyMiwyMjcsMTQxLCA1NSwxNzQsCisgICAgMTc0LDE3NCwxODEsIDI3LDExNywgNTAsMjE3LDI1MCwgOTksMTk4LDE1MiwgODgsMTUzLCA0MCwgODIsMjUzLAorICAgIDEyNiwyMTIsMjMzLDEzMywxNTcsIDc4LDE3NiwxODksMTQ3LDI0OCwgNDMsMjM2LDI0NSwxOTUsIDM2LDExNSwKKyAgICAgNjksMTc3LDIxNCwyMDIsIDI0LCA5OSwxNDEsIDUzLDIxNCwxMTIsMTIxLCA3MywgIDgsMjAwLDEwNywxNDYsCisgICAgIDI0LDE4MiwyMTksIDQyLDE5MCwgMTksMjQ2LCA1NCwyMjYsMTEyLCA1MSwxNDIsIDYwLCAzMywgMjYsMTU4LAorICAgIDExOSwxODEsMTg5LDEyNCwxNzQsMjA5LCA5MiwyNDQsMjM1LDEyNiwyNDYsICA3LDIwOCwgNTAsMjQ3LDE4MCwKKyAgICAxODYsIDIzLDI0NiwyMTUsMTYzLCA5NiwgODMsMTMzLDE1MCwxODUsIDM4LDE4OSwgNzEsMTU1LDIzNywgNzEsCisgICAgMTU1LCAxMSwgNDMsMTgxLDEyMiwgNjcsMTIyLDIzMywgNDIsMjExLDIwNCwxNjEsIDUzLDI0NywxNjMsMjI0LAorICAgICA3OCwyMDgsMjE5LCA4MCwgODEsMTA4LDE0MSwgNDcsMjI4LCA5MCwxODksMTEzLDE4NSwxODEsMTgwLCA5MCwKKyAgICAxMTEsMTgwLCA2MCwgNjMsIDU1LDE1NywgOTgsMTg3LCAyNSwxMzUsIDMxLCAgNCwyNTMsMTQxLCA1NiwyMzIsCisgICAgMTA2LDIzNywgIDksMTc3LCA4NCwxNzEsIDYxLDIwOSwgOTAsIDkwLDEwNywxODAsIDIyLCA2MCwyMjMsMjAzLAorICAgICAzMCwyMTUsIDQ4LDIzOSwxNjgsMjQ4LDExMCwyMTYsMTg3LCAzMSwgIDUsMTU1LCA0MiwxNDYsIDM2LCAyNiwKKyAgICAxNTgsMjQ3LCA2OCwxMjMsMjMzLCA5MiwxODksMTg1LCA5MiwxNzEsMjE1LCAgOCwgMTAsIDU5LCA0NiwxNDUsCisgICAgIDU3LDEzOSwxODQsMTY0LDI0NSwxMDAsMjAxLCA5OCwyMTQsMTc4LCAxNiwgNDQsICA0LCAzOSwxOTUsIDg3LAorICAgICA2MSwyMDEsMjM4LDIxNywxMjksMjE0LDExNCwgNTgsIDgyLDE1OSwgMTgsMTMzLCAgOSwxMDIsMTQzLDIwMCwKKyAgICAgMTksMjEwLDE1MSwyMTQsMTAzLDE2MSwxMzMsMTQ4LCA5NywxODgsMjUzLDIwMiwxMTksMjIzLDE4OCwxMjIsCisgICAgMjQ1LCA2NywyMTUsMTc0LCA4OSwyMDcsMjQzLCA2MCwyNDYsIDg4LDE3OCwyMzEsMTc3LCAyNywxOTcsICA0LAorICAgIDEzNywxMDgsIDc3LCAyMSwgMzQsMTUzLDIzOSwxNTQsMTcxLCA0OCwyMTgsMTc1LDE0NCwyNDQsMTE5LDEyMywKKyAgICAxNjYsIDY1LDE5MSwyNTUsMjU0LCAyNywgNjMsMjU0LDI1MiwxMzUsIDk1LCAzMiwgOTksIDU3LDE1MywyNDcsCisgICAgIDQ0LCA1NywxMDcsIDU4LDE0MCwyMjYsMTI2LCAxNiwxMTcsMTg3LDIyNSwgNzgsIDQyLDE3NSwxMjYsMTY3LAorICAgIDE0NywgMzcsMTc1LCA0MCwxNDIsIDk5LDE3MywxNDksMjA5LDE5OCwxMDIsMjMwLDEzMCwxODgsMTY2LCA4OCwKKyAgICAgNTQsMTM0LDIxNCwyMjAsMTM5LDI1MCwyMTUsMjUxLCA1OSwgNTUsMTMxLCA5NCwxMDAsIDc3LDExNCwyNTMsCisgICAgMjA1LDE2MCwyNTEsMjEzLCAxMSwxNTEsMTU1LCA3MywgIDQsIDM1LCA2NSwgNjgsMjAyLDIxOCwyMDUsIDU2LAorICAgIDE4OCwgMjUsMTE2LDIyMywyMzMsMjM3LDExNiwxNDEsIDc0LCA1NCwxMjMsMTY3LDE4MywyNDMsMTY5LDIxMywKKyAgICAgMTEsMTM5LDIwMywxMDMsMTA3LCA2OCwxNDYsIDczLCAgOCwgNTAsMjA0LDIxOSwgNDIsMjUwLCAzMiwyMzIsCisgICAgMjUzLDE2NCwyNDcsMTEyLCAzNSwxNDIsMTQ2LDIwNSwyMjIsMjM0LDIwOSwgNjcsIDIxLDEyNywyNDYsMjM2LAorICAgIDE5NywxODYsIDc2LCA3NSwyMDYsMTk2LDEzNCwxMTksMTk1LDI1NCwxODcsMTg5LDIzNywyMTksIDgxLDIyMywKKyAgICAxMDIsMTExLDEyOCwgNTksIDk3LDI1NSwyMDMsMjMxLCAzMCwxMTEsMTIxLDE1OCwgNzEsMTU2LDEyNCwgOTgsCisgICAgIDM0LDE2MywyMTUsMTYzLDI1NCwyMDUsMTYwLDI1MSwxMTgsMTExLDE5OSwyMjEsMTg5LDIwNywxNTcsMTg5LAorICAgIDE4NCwyMjQsMjE1LDEyNCwgNjUsMTc2LDIxNSwyNDEsMTM3LDE3MiwgMjAsMTk5LCAgNiwgNDQsMTUwLDE4OCwKKyAgICAxMjcsIDg4LDIwMiwyMzYsICA0LDIyNywxMDgsMjA2LCA5NywyMDMsMTA4LCA0NSwxMjEsIDU0LCA1NywgIDUsCisgICAgMTU2LDE1MiwgIDUsMTc5LCA5NiwxNDYsIDY4LDE1OCwgMTYsMTU4LDE0NCwxOTAsIDk2LCA5NSwgOTAsMjA1LAorICAgICA2NiwyMjEsMjIzLDI1MCwxOTMsIDMxLDI1NSwxNjcsMTk5LCAzMCwxMjMsMTA4LCA5NywgOTcsMTQ1LCA0NSwKKyAgICAxNzksIDM5LCAzNywxNzksMjMxLDEyMSwxOTYsMjA0LDIyOCwyMjksIDQxLDE0MCwxMzYsMTY0LDE0NCwxNDgsCisgICAgMTgyLDE5NSwxMDAsIDY5LCA5NywyNTEsMjQ2LDE5NCwyMjgsMjA4LDEwMywxMDMsIDQ1LDEyNywyNDMsIDc5LAorICAgIDI1NSwyNDQsMTY3LDE1OSwxMjYsMTUwLDE0MSwgMzMsMTA3LDIxNywxMDQsMjE0LDIxOCwxOTYsMjAyLDEzMiwKKyAgICAxNDUsMjM0LCAgNywxMTMsMTc1LCAyMywxMTcsMTg2LCA5NywxNjcsIDI3LDExOCwgNTgsIDk3LDE2NywgMTksCisgICAgMTE3LDEyMywgNzMsMTk1LCA5NCwxOTcsMTQ1LCA3OCwxNjYsMTM5LDE3NiwgMzgsIDI1LCAzMiwgNjUsMTQ0LAorICAgIDIxNSwyNDQsMTc2LDE5NiwgNjEsMTczLCA1OCwgNDIsMTkwLCAxNywxMTYsMTE1LCA1OSwgMTYsIDgxLCA3MSwKKyAgICAxNzEsMjU1LDI1MiwyMjQsMTMxLDE1NCwgNDAsIDEwLDE5NSwyMDAsMTU0LDEwOSwgMjEsMjIzLCAxNCwxMjMsCisgICAgMTg1LDE4OCwxMzYsIDcyLDE3OSwyNTMsMjM1LDEzNSwyMzUsMTQ1LCA1MywgNTAsMTM5LCA3NSwxMzgsMjM3LAorICAgIDE0MiwgODIsMjQ3LDE2MiwxMjYsIDQ2LDE3NSwxMzIsIDMxLDExOSwgMzEsMjIyLDEzNywyNTAsMTI2LCA4NiwKKyAgICAgMjQsMTA2LDE4MiwgOTMsMTczLCA1NCwyMjcsMjMyLCAgMywgNzEsIDk0LCA2OCwxMTYsIDQ3LCAxMCwgOTQsCisgICAgMjM5LDEwOCwxMjIsIDg5LCA5NywyMDAsMTk2LDEyOSwgNDksIDU5LCA0MiwxMjYsMTk5LDE0NSwgODcsMTc4LAorICAgIDEyMywxMjcsMTgxLDEyMSwxODMsIDM4LDE2NCwgMzIsMTI5LCA5OSwgNjAsMTk5LDEwNiwxNzcsIDk4LDEyMiwKKyAgICAxMTUsMjAyLCA4NywxMDYsIDc4LCA0NywgOTEsMTAyLCA3NSwxNTYsMjA0LDE4NSwxMTAsMTcyLDIxMywyMTQsCisgICAgMTcwLCA5OCwgNDYsMTU3LDE2NCwgNTcsMTY0LDE0MSwyMTQsIDczLCAzNCwgMTksMTk2LDIwMSwgMzQsIDc1LAorICAgICA5NCwyNTAsMTc1LCA3NiwgNDYsMjAwLCA1NSwyMjIsMTIxLDIyOSwxNTUsMjIzLCA3NiwgNTAsIDc3LDE3OCwKKyAgICAxODksIDc4LDEwMiwyMjYsIDczLDE2NiwyMzcsIDc1LCAgNywgMzUsMjE2LDEyNCwyMzMsMTM2LDE3MiwyMDksCisgICAgIDg0LCA0NCwxMDMsIDg5LCA4OSwxNzAsMTE2LCAyMCwxMjcsIDE3LCAxNywyMjEsMTg5LDEyMywyMzEsMTg4LAorICAgICA5NSwyNDcsMTMyLCAzMiwyMDMsMTcyLCAxMywgNDMsIDk5LCA5OSwxMDEsMjI3LCA4OCwgIDcsMTYxLCAxMCwKKyAgICAxMzAsMTg0LDIxOSwxMzksIDU4LDIyMSwxMTIsMTY3LCAxOSwyMzgsMTE2LDE5NSwgOTQsIDYzLCAzMSwgMzksCisgICAgMTYxLDE0OSwgNzQsMTY3LCA3MiwyMDUsIDIzLDI1MSwgMjYsMTIwLDE2NSwxOTIsICA0LDEzOSwgNzEsIDg2LAorICAgIDIxNCwyMzgsMTA0LCAyMSwgOTEsIDkxLDI0OSwyMDksIDcwLCAyOCwyMzgsICA4LDIzNSwyNDksMTI2LDI0MiwKKyAgICAgIDYsIDczLDEyMiwyMzEsIDE1LDIyNiwxNzYsMTc4LCA4OSwxMDgsMjM3LDIxOSwgNjUsMTY3LDIxNCwxNjgsCisgICAgIDM5LDE5OCwxNzcsMjMzLDEwMiwyMDksMjI0LCA5OSwyNTMsMTY4LDE4NywgODUsMTExLCA1NCwyMTEsMTI5LAorICAgIDIxOCwgNzYsMTM0LDEyMSwgODMsIDY5LDEwMiwgNjQsIDYzLDEyNywxODMsMTc5LDIxNywxNjgsMjE1LDE2NSwKKyAgICAyMzEsIDM3LDE1OSwgMjUsMjA1LDE4MiwxMTEsMTE2LDIzMiwyMDAsIDQzLDE2MSwxNzEsMjEzLDE4NiwxMzcsCisgICAgMTg5LDE1NCwxNDMsMjQyLDExMywxOTQsIDIyLDIwMywgMzksMjQzLCA3NiwyMTUsMTIyLCAzOCwgNzgsMTQyLAorICAgIDIxMywgMjAsIDM0LCA3NSwyMjgsIDk5LDE0MSwyMTQsMjAxLCA2MCwxNjIsIDM4LCAyNSwgMTQsIDM3LCAgNCwKKyAgICAgNzMsIDE4LDE0NiwgNzQsIDEwLCAzNSwgOTksMTgyLDE5MCwyNTUsMTgzLDExOSwyMzksMjIyLCA4MSwyMDEsCisgICAgMTgwLCAyMSwyNDksIDM2LCA5MCwxNTMsMTkyLDExNCwxMzksMjQxLCAxNiwxMzMsIDEzLCA5MSwgOTAsMTIxLAorICAgICA2MywxMjcsIDQ5LCAxNywgMjUsIDk5LDE5MSwyNDMsMTUxLDEyNywyNDksMjA0LCAzNSwgMjMsMTQ3LDE2MywKKyAgICAxNDEsMTA4LCAxMiwxMDcsMTA5LDIyNiwgODgsMTM1LDE0NSwgMTAsMTMwLDE4NCwyMTUsMTQzLDE4NiwxODksCisgICAgMTAwLDE5MiwgNjgsMjEyLDIzOSwxOTksMjUzLCA2NCwgNjksMTQ1LDIwMiwyMDIsIDcwLCA5OSwxMDksMTAxLAorICAgIDE1OCwgNjQsMTUyLDEwNywgOTAsIDcyLCAxOCwgNTMsIDQxLCAgMywxNzEsMTM1LDIxOSwyMDUsMjQ3LDI1MiwKKyAgICAxMjIsIDQ1LDE1NSwgMjksIDkzLDIxNiwgOTMsMTI2LCA4MSwgOTQsMTczLDIzMCwgNTUsIDgyLDIyNywgNzIsCisgICAgIDMzLDEwNiwgODIsMTIyLDE5NSwxNjQsIDM0LDE2NSwgODcsMTA3LCA1NCwxNjQsMjM5LCAzOSwgNDUsMjE2LAorICAgIDE1NCwxNDgsIDUzLCA1NywyNTIsIDc5LDIyNywgMjksMTcxLDI1MiwgOTAsIDQ1LCA4OSwxNDcsMjE4LCA0MywKKyAgICAxNDEsICAyLCA0MiwyNDEsMTI5LCAxMCwyMzUsMTQxLDEzNCwyMjAsMjI5LCA3OCwxOTIsIDQ5LCA4OSwxNzIsCisgICAgIDQ4LCA4NywgNDIsMTc1LDExNiwgMjIsMTU3LCA2OCwgOTcsIDU4LCA2MSwyMDcsMTg1LCA4MCwgODgsIDYyLAorICAgIDE3MSwxMTMsMjQyLDEyMywgNzksIDc4LDE1MiwyNDQsIDEwLDEzOSwgIDksMTg2LDEyNSwyMzksMTg3LDI1NSwKKyAgICAyNDksIDQ3LDE2MiwgNDAsIDgyLCA5MCwxMDUsMTQ5LDIyOCwgNTQsMTU3LCAyNiwgNzYsMTY3LCA0NSwyNDIsCisgICAgICAxLDEzMywgMTMsMTM0LDE3NiwgOTMsIDg3LDEyMywxNDQsIDIxLDEyMSwgNDksMjA5LDE3MywgOTEsIDU1LAorICAgICA0NywgNDcsIDQ2LCA5MSwgOTksIDQxLCA1NywxNTUsIDkwLDIzNSwgNTIsMTI0LDEzMywxNjEsIDEwLDE5NCwKKyAgICAxODQsMjE5LDEzOSwxODYsMTg5LDE2OCwyMTUsMTQzLDEyMywyNTMsIDU2LDIwMCwyMjgsMTY1LDE4MCwgNTMsCisgICAgMTk4LCA1MCwyMjgsIDUzLCA2NywxMjAsIDY2LCA0NiwyNTAsMTgxLDIwMywxNzMsMTk3LDIyNSwxNDEsMjA3LAorICAgICA5MCwgOTMsMjUwLDEwNSwyMDUsMjE1LDE0NCwyNDIsMTQ1LCA3MCwxMjMsMjQ4LDE1NywyNDgsMTkwLCA5NSwKKyAgICAxNzEsIDM3LDEzNSwxODIsMTI1LCAzMywxNTEsMjUyLDIyNSwxNjEsIDcyLCA3MiwyMzMsMjEzLDIxMSwxNTIsCisgICAgMjMwLCAgOSwxODUsMjI0LDIxMywgMjYsMjEwLCAyNywxMjIsMTM1LDIwNywxNTgsMTI3LCA2OCwyNTAsIDMwLAorICAgICAgOSwxNDYsIDY4LCA0NSwyMDcsMTExLDEyMywxOTUsMTQzLCAzMiwgNjEsMTE1LDIzOCwxMzAsIDg3LDE3NSwKKyAgICAxNDUsIDY4LCAgMCwxNTUsMTE2LCA5NSwxNDAsMTU2LCAzNywyNTMsMTUyLDIxMCwyMjUsIDIwLCA1NCwgMTEsCisgICAgMjMzLDE5OCwxNzgsMjI1LDEwOCwyNTAsMTE5LDEwNywxNDcsMjUyLDE5NywyNDksMTkyLCAyMywgNzQsIDIxLAorICAgIDE1MCwyNTQsIDc1LDE5NCwgMTksIDM0LDI1MCwyNDEsMjE5LDE4MywxMTEsMjIzLCA4NiwxNzcsIDgyLCA0MiwKKyAgICAxNzEsIDYwLDE4MSwyMTQsIDM4LDExNSwgODgsMTE4LDE2NCwyMDcsIDgxLDE1MiwgNDUsICAyLDE1MiwxNzksCisgICAgMjM0LDIzMywyMDgsIDQyLDE3OCwyNTAsMjQ3LDIwNSwgMjYsMjUxLDIxNSwyMjMsMjU0LDIwNiwxNDksMTQ5LAorICAgIDE3OSwyMzMsMjAwLCAxNCwxMDksIDU2LDE1MywxOTgsIDQzLDEzOCwxMTcsIDI0LDE2OSwxMjYsIDYzLDIzOCwKKyAgICAgIDcsMTEzLDE3NSwgMjMsMjQ3LDI1MSwxMTMsIDE2LDE3MCwgNDgsIDgyLDExMywxMDgsMTgwLCA1NCwgNjksCisgICAgMjQwLCA5OCwxOTgsMjAxLCA2NCwxNzksMTI5LCAxNiwyMTIsMjQyLDI1MiwxMDMsIDIzLCA4NywxNTAsMjUyLAorICAgICA5MCwyMjksIDcxLDE0MywgNDYsMTU3LDEyMSwyNTAsMjIwLDEzMywyNTIsMjQ3LCA4NCwxNTEsMjIyLDEwNiwKKyAgICAxODksMjQxLDE2MSwxOTcsMTQ5LDIwMiwxMDIsIDc3LDE5MSwyNDYsMjAxLCA3NSwgNzksMjMwLCAxNywyMjIsCisgICAgIDIzLDI0MiwgNzYsMTczLDI0MSwyMjYsMjAyLDE4NSwxOTMsMTk5LDI1MCwyNTIsMTQ3LCA3OSwgMzksMjM3LAorICAgICA4NiwgMzQsMjQyLDEzMiwgODgsMjQ0LDEwNywgMzEsIDU5LDE3OSwgODYsIDMxLCA4MCwyMTYsIDc1LDE0MywKKyAgICAgOTMsIDE3LDE1OCwgNzYsMTk4LCAyMiwgIDksIDMzLDE1NCwxNTgsMTI3LDEwOSwxMDUsMTE3LDE3MywyMjIsCisgICAgMTcyLDEwOCwxODIsMjE4LDEwNiwgNjMsMTg5LDExOCwgMzMsIDg5LCA1MiwgMTUsMTkxLDE5OSwxNTMsIDgwLAorICAgICA4OCwyMTAsIDE3LCA5OSwgNTQsMjMzLCA3NCwgMjIsIDU0LCA5MywgMjYsMTY3LCA4OCwgODksIDYyLDEyMSwKKyAgICAyMDMsIDM3LDEwNywgMzEsICA5LCA3MywgMzQsIDkxLDE2NywxNTEsMTA0LDEyNSwyMjcsICA3LDIyMywyNTAsCisgICAgMTE4LCAyOCwgNzEsMjMzLDIyOCwxMzUsIDc0LDEwNywxNzMsIDc2LDIzMCwxNzYsMjQ0LDE0MCwxMTIsIDcxLAorICAgICA5NywgOTIsIDE0LCA5NywgODksIDI1LCA1NywxMjQsMTkyLDEyMywgNjIsMTI2LCA1MywxNDEsIDc1LCAzMSwKKyAgICAxMjQsMTEyLCA5MSwgNjAsMjE2LCA5MCwxMTAsMTgyLCAgNCwxNzksMTc2LCA3NiwyMTQsMTc4LDIxNCwgNTQsCisgICAgMTM4LDIxMSwyMDYsMTI1LDE4MywgMzEsMTE4LDE4NywgOTcsMTgzLCAyMywyNDYsMjUwLCA4MSwgMTYsMTk2LAorICAgIDIwMSwgNTYsIDQ3LDIyNywgNjIsMTc4LCA1MSwyMzQsIDIzLDExMSwxMzUsMjMzLCA0MywgNzYsIDUyLDE2NCwKKyAgICAyNTUsMTk2LDIxMCwyMDIsMTIzLDI1MywgNzgsMTAwLDIxMCwgNjYsMjQyLDE3NywyMjksMTQ5LCA5NSwyNTEsCisgICAgMTY5LCA3OSwgNTQsMTUzLDE2MiwxMjYsMjIzLCA0MCwxNDksMTExLDI0NiwyMjgsMjI2LDE1MywxODcsMTEzLAorICAgIDE4NCwxNTcsMTgxLDE4MywxNTQsMTgxLDIxOCwxMjcsMjUzLDE3NywgNzksIDYyLDIxNCwgOTQsMTQwLDE4NiwKKyAgICAgNjEsIDI5LDE5OSwxMDUsIDk3LDIzMiwxMjEsMTQzLDE4MCwgMjIsMTY0LDIzMSwyMjEsMjM2LDExNywyNDIsCisgICAgIDcxLDI0OSwxOTQsIDgzLDIwNywxMjYsMjM4LDIxMCwxNDcsIDgxLDE3NSwxNzUsMTk0LCA0MCwgODUsMTUyLAorICAgIDE0OCwgNzUsMTgxLDI1MCwyNDksMjQ2LDIyNiwxMjMsMTg5LCAyOSwyMDUsMTA1LDI0NywyMzcsMjMzLDE4MSwKKyAgICAyNDMsMTkxLDI0MiwyMDksIDc5LDExMiwgMjQsMTk5LDI1MywxOTIsIDkwLDE1NSwgMjAsMTY0LCAxMywyMDcsCisgICAgMTkxLDE4MCwxODQsMTI0LCA1NSwyMzgsMjQ3LCA4NCwxMjIsMjMyLCA5NiwxODEsMTg5LDI0MCwyNDcsIDk0LAorICAgIDI1MCwxMDgsMTQ3LCA0MSwyMzYsMjQ1LDE0MCwgODIsMjQ4LCAzNywgNzgsMjMxLDE1NywxNDcsMTI2LDExNywKKyAgICAyMzAsIDc2LCAyMSwxNjUsIDYzLDE0MSwyMDYsMTE0LCAyOSwyMzMsMTE3LDIwMSwyMzEsMjIxLCA1MCwxNjcsCisgICAgMTgxLDEwMywgNTQsIDIyLDIxOCwgMTgsMTk5LCA2NSwxMTIsMjMwLDIzMywgMzksMjE5LDIzNywxMTgsMTAxLAorICAgIDEyMiwxOTgsMjM2LDE1OSwgOTgsMjI1LDIyNCwyNTIsMjU0LDIwMywxMzksIDEzLCA4NywxNTAsICA4LCA0MSwKKyAgICAgMzAsIDU0LDE1OSwxMjcsIDM0LCA2MSwyMzYsMjQ4LDEyNywyNTUsMTg3LCA2MywyNTIsMjMzLDE3OSwgMjMsCisgICAgMTMyLCAxNiwgMzAsICA5LDIwMSwgNDQsMTcyLDEwMSwxNjUsIDc3LCAyMCwxNzEsIDMyLDEzNiwgNTgsMjIxLAorICAgICA5NiwxNjcsMjExLDEyNywxODQsMjIxLDIyMywyMTcsICA5LDE4NiwxODksIDQwLCAgOCwxNjIsIDQwLCA4MiwKKyAgICAgNzQsMjMzLCAzNCwgNjgsIDIyLDI1NCwxMzAsMTg4LDEwMiwxNjUsIDExLDIzMCwxMjEsMTI2LDE4OSwgODYsCisgICAgMTExLDE4MSwxMTAsIDcxLDE5MywxNDIsIDgxLDEwNywgMTEsMTM5LCA3OSwxNzMsMTc0LDE5NywgNjUsIDE2LAorICAgIDIzNiwxMTYsMjI2LCA5NCwyMjMsMTAyLDE3MywxMjUsIDMzLDE2NSwgOTUsMTcxLDIxMywxNTQsMjA1LCA3NywKKyAgICAyMTQsMjQ3LDE2MywgOTYsMTA5LDExMywyMzMsMjA5LDE2NSwgNTEsMTkwLDE4MSwxOTMsIDc4LCAzOSwyMzQsCisgICAgMjQ2LDE0MCwyMTQsMTg1LCAxNiwxNjUsMjM5LDIxMywgMjYsMjA1LDE5MiwgMTksIDE1LCA4NCwgMzYsMTI1LAorICAgIDIzOSwxNzcsMjI5LDE0OSwyMjksIDkwLCA2MSwyMzYsMTE2LDEzMSwxNTcsIDc4LDE2MiwxODUsMjI4LDE1NywKKyAgICAgNDEsIDYwLCA4OSwxMDcsIDUyLDEwOCwxNjMsMTgyLDE2MSwyMjcsIDI5LCAyMSwgNjMsMTkwLDE3OCwxMjIsCisgICAgMTEzLCA5NywgNDEsMjM0LDI0NSwyNTEsIDU5LCA1OSwgNDIsICA4LDI0MywgNjMsMTY2LDIxMCwyNDMsMjUyLAorICAgICA5MCwxNzMsMjIyLDEwNiwyMjEsMTQyLDI1MSwgNTksIDcwLDE3NSwgNDUsIDQ0LCA5NCwgOTMsIDYxLCAyMywKKyAgICAgIDcsIDY1LDE3NiwxNzksIDE5LCA1NywxODcsICA3LDE2NiwxNzEsIDQ4LDE0NSwxNTcsMTg2LDIzMiwxMDEsCisgICAgMTk5LCAyNSwxMjUsIDQxLCA2MSwgMzMsMTI0LDIzMywyNDksIDY2LDEyMCwxNTMsIDg4LCA0NCwxNzksMTAyLAorICAgIDE3MSwxNzIsMTQxLDE3MiwgIDksMTQxLCAgOSwxNDEsICA5LDE3MywgMTQsMTQxLDEzNywxNzIsMTA1LDI1MywKKyAgICAyMDQsMjMxLDE5MCwyNDQsMTc5LCA0NywyMTUsMTA2LCA1MywyMjMsMjQ3LDEyNSwgNjMsMjUzLDEyNywgNTQsCisgICAgMjI5LCA2OSwgNTgsIDY3LDE3MiwgMzksMTc5LDEyNywyMTAsIDg5LDEwMCwyMjEsIDg5LCA0MywgIDYsMTY2LAorICAgIDIyMCwgNzMsMjE4LCAzMiwxMTAsMjQ4LDIzNCwyNDcsMTIzLDE3MywgNzIsIDI1LCA5OSwxMjQsMTQ1LCA3OCwKKyAgICAgNzcsMjAwLDE5OCwyMTgsIDg4LDE1MywgNDAsIDU0LCA5NywxNjQsMTk1LCA3MiwgMzksIDUxLDIyNSwxMzIsCisgICAgIDgxLCA1MCwgMjUsMTgwLDIwOSwgMzgsIDYzLDE5MSwgIDAsMjQyLDE1NCwyMDksMTM4LDE5MiwgOTAsIDI5LAorICAgICA0MywgMzQsMTIyLDE4MCwyMDksMTg0LDIyMCwgOTQsIDM2LCAzMywxODYsIDI3LDE1NSwgNDIsICA4LDExNywKKyAgICAgMjgsMTg3LDExOCwgNzIsIDM4LDExMywgMzUsMTYyLDIxMywgNzAsMjUzLDI1MiwyMTAsMTcwLDE0NCwyMTAsCisgICAgMjM2LDExNiwxOTQsIDQwLDIxMCwgODEsMTU2LDIwMywgNDMsICA5LDI0MSwgODYsIDI3LCA3NywgODEsMTcxLAorICAgIDIwOSwxMjAsMTcwLDE4MSwgNDAsIDYxLDE0MywxOTUsMTg0LDE4NywyMjEsIDg1LCA4MSwyMjgsMTAyLCAzNywKKyAgICAgMzgsMTc0LCA2MiwgMzUsMTk1LCAgMCwgIDAsIDMyLCAgMCwgNzMsIDY4LCA2NSwgODQsIDM4LDEwNywxMTcsCisgICAgIDI4LDI1MSwgNjgsMTQzLCA1NCwgMjYsMTUxLDE1NCwgMTEsMTAwLDE2OCwyNDMsIDk2LCA4MywxMzMsMTYxLAorICAgICA4NiwyMDIsMTczLCAgNCwxNzIsMTc3LDE1NCwxNDYsMjIxLDEwNywgOTQsMTEwLDIxNSwgNzIsMTM2LDIwNiwKKyAgICAxOTgsIDcwLDI0MiwgIDYsMTMxLDE4OCwxNjYsIDk0LCA3NSwxMzgsMjM2LCA3NiwyMzksMTAwLDIzMCwgMTAsCisgICAgIDk4LDE3OCwxMzAsICA0LDE0NSwgMzcsIDUwLDEwOCwxMzMsMjQwLCA0NCwgOTEsIDc1LCA1MCwgMjcsMTI2LAorICAgICA5MCwyMDQsIDYwLDE1MCwgODYsMTQ1LCA3MywxNjgsIDM0LCAxOCwgNjgsIDU5LDExMSwxOTEsMjE5LDI1MywKKyAgICAyNDQsMTY3LCAyMiwxNTEsMTUwLDI0MiwgMzcsMTE3LDEzOCwgOTcsMTA0LDE2MiwxMzYsMTIyLDEyMSwgMzYsCisgICAgMTQ3LCA3NiwyMDQsMTQ2LDE3OCwgMTksIDU0LDE0NywxOTMsMTA1LCAzNCwyNDksIDgyLDIzNiwxNTcsIDU5LAorICAgIDEyNiwxNDksMjQ5LDIwNSwgNTUsMjIzLDEyNCwxMTYsIDk3LDEzNywxNDEsIDk3LCAzMywxNTMsMjE3LCAyNiwKKyAgICAgNzUsMjE4LDIxNiwgNTYsIDU0LDExMywxNjQsMTYzLCA3MiwgNzEsMTQ1LCAxMCwgMjgsMTIxLCAzNywxNzEsCisgICAgMTYyLCA1NywgMjksMTIzLDEzNiwxMDcsIDIyLDIyMywxMzMsMjA0LDEwOCwgNzYsIDI4LCA4OCwgMjEsMTk3LAorICAgIDIwMSwyMjUsMTg4LDIyOCwxMzYsMjA5LDIyNCwxNTAsMjE0LCA5MCwgMjcsIDY5LCA5MCwgNDEsIDMzLDI1MCwKKyAgICAgNjYsMTM2LDEwMCwgIDksMTczLDE5MywyMjMsIDQxLCA1MSwgMzksMTYzLDI1MiwyMjYsIDMyLCA3MiwxMjIsCisgICAgIDk0LDE1NiwxMTcsMTEyLCA0MywxNTUsIDM3LCA1MSwxNDIsMTY4LCA0OCwgMjAsMTc4LCAyNCwxOTIsIDYxLAorICAgICA2OCwxNzYsMTk4LDE5NiwxOTgsMTcwLDEyMCwxNTksMjIxLCAgMywgODMsIDg0LCA4OCwxMTMsMjE0LCAzNiwKKyAgICAxNzcsMjA1LCA3OCwxODIsMTgyLDIxNCwgOTAsIDQxLCAxMywgODksIDMzLDE0NiwgNjUsMjQ0LDI0OSwyMTgsCisgICAgMjIyLDE0OCwyMDUsMTQ2LCAzNSwxNjQsIDcyLDIwNywxNjIsIDE2LDI0NywgNTUsMjIzLDEyMywyMzksMTg5LAorICAgIDEwNywyMDcsIDYxLDIzMSwxODgsMTYxLDE1NiwxMTcsMTE2LDEzOSwgMTAsMTc4LDE1MiwxMjAsMTQ1LDEzNiwKKyAgICAxNjUsMTgwLDIwNCwyMTAsIDQ1LCA5MCwgNDMsMjI3LCA4OCwyNTMsMTA4LDE2NiwgODMsMTc4LDIwNCwyMzksCisgICAgMTg5LDI0NSwyMTQsMTM5LCA3NSwxNzEsMTcyLCAxMywgMTEsMjAzLCA3NiwxMDAsIDEyLCAzOSwxMDcsMTA2LAorICAgICAzNiwxNDcsMjE3LDEzNSwgODEsIDUwLDE0NywxODksMjA2LDEwMywxMjQsMTgyLCA1NCwxNTksICA4LDE5OSwKKyAgICAgNjEsICA0LCAxMSwxMDIsMjA5LCA5OSwxNTAsMjA1LCAgOCwgOTQsIDcyLCAxNSwxMzQsMTQzLDE2NiwxOTcsCisgICAgMTQ1LCA1NCwgNzUsIDc4LDI1MSwgMzEsMjExLDIzOCwxMjksIDQxLDEzNywgNDQsMjAxLCA5NywyMDQsIDQ0LAorICAgICA4OCwxNDQsIDc3LCAzOCwxNzQsIDMyLDE3OCwyMDQsMTQ2LDEzMiwgNzcsMTk4LDIzOSwxNTEsMTg3LCA4NywKKyAgICAyMzMsMTQwLDIwOSwgODksMTc1LDE0MCwyNTEsMTkzLDE0MSwxODMsMjIyLDEyNiwyMzQsMjM0LCA4NSwgODcsCisgICAgIDE2LDE5NywyNDIsMjI4LDEzMCwxMzIsIDMyLCAzNSwxMzIsIDQ4LDEzMywyMDEsMTUyLDEzNywgODksIDUwLAorICAgIDExNSwxNjksMjI1LCA4NSwgMTIsMjAyLDEwMywgMzQsIDgxLDIyOCwxNzUsIDQ4LCAgOCwgOTAsMTc3LDE3NywKKyAgICAyMTgsIDcyLDIwMSwxNTAsICA0LCA0OSwgMTEsIDk5LCA4OCwxMDUsMTcxLDE0OCwgNzMsMTUwLDIxOSwyMDAsCisgICAgMTAyLDEyNywgNTQsIDc0LCAzOSwgIDMsMjM2LCA0MywxNjcsICA3LCA2NSwgOTQsICAwLDE1NiwyMDAsICA4LAorICAgICA4NiwxMDQsIDc2LCAxNiwgMjMsIDk5LCA5MiwxMzMsIDM3LDE4MiwxMzAsICA1LDE0NSwgNzYsMjI3LCA4NywKKyAgICAxMTMsMTE0LCA4MiwyMTgsIDUwLDE2MywxMDgsIDk3LCA3MywgMTgsMjI1LCAgNywxMTksMjUxLDE4OSwxNTgsCisgICAgIDg4LDIwNCwgNTgsMjQ2LDIzOCwxNDYsMTQ1LDEwNSwyMDksMTUzLDE1MiwyMDQsIDgwLDEwMiwxOTIsMjI4LAorICAgICAgNCwgNzYsIDM0LCAzMywgNjgsMTI2LCA4NCwxNzYsIDUyLDEyNiwxOTksMjA3LCA0MiwgODEsMjU0LDIyNCwKKyAgICAxMzEsIDE1LDE1MCwxMjUsMTU5LCA3NywgMjIsMTY5LCA0NCwxNzksIDQ5LDE1NiwgNDQsMjE1LDE1MiwgNjgsCisgICAgIDQ4LCA4NSwgNzYsMjUzLCA5MiwxNTYsMjIyLDE1MiwxNDEsMjA5LDE5MiwxNTIsICA5LCAgMCwgNzgsIDY1LAorICAgICAyMSwgODksMTM4LCA5NiwxNDYsIDY4LCAzMCwxOTMsMTc4LDE3OSwyMzcsIDgzLCAxNSwgIDgsIDU1LCA5NywKKyAgICAgMzcsMTgzLDIyMCwyMzMsMjIyLDE5MSwxMjcsMTkxLDIwOSwxMDQsICA4LDE2NywxOTIsIDQ0LCA0NSwyMDYsCisgICAgIDQzLDEzMiwxNjksIDc2LDE1MCwxMTEsMTQ3LCA0MiwgNTAsIDMxLCA5NywxNTAsMjUyLCA4NywgNjgsIDQ4LAorICAgICA2MywxMzksMjM5LDI0NCwyMzgsMTg3LDIzOSwgOTQsMjQ2LDIzNSwxMDgsIDEyLCA5MSwxNDUsMjA0LCA4MSwKKyAgICAgNzIsMjE4LDE3NiwyMTQsIDU0LCA4OSwxNTUsIDY3LDEwMSwgMTAsIDQzLDEwMiwxOTcsMTY5LDE1NCwgMTEsCisgICAgICAyLCAgMywyMjQsIDY4LDE2NywxNzYsMTE2LCA5MCwxNTUsIDQ0LDEzMCwxNjUsMjE4LDIyNiwxMDAsMTM0LAorICAgIDE5NiwxMTYsMjEzLDIxOSwgNjYsICA0LCA2OSwyNTMsMTUyLDEyNCwxODcsMjIxLDE4NSwxMTUsMjMxLDIwNiwKKyAgICAgMzUsMTQzLCA2MCwxNDYsIDIzLDE1MywgODQsMTU4LCAyNCwgNjMsMTg1LCA5NiwyMDMsIDEwLCA3NSwyMDcsCisgICAgMjAyLDEwMCwgNzMsMjAxLDIxMiwyMTUsMjI5LCAgOCwyMzAsMTE1LDIxOCwyNDQsMTc2LCA1OSwxMTksMjM5LAorICAgICAyNSwxOTEsIDM3LDE2NSwxODAsIDY2LCAgOCwgMzgsIDk3LCA0NCwxNjUsMjQ1LDE2MywxODIsIDc0LCA4OSwKKyAgICAxNDksMjMwLDE3NSwxMTYsMjA0LDIxOCwgOTYsMjMzLCAgOCwgIDAsIDU2LDIzMywgMjIsIDc1LDIxMSwgNzgsCisgICAgMTEwLDE3NywxMTYsMjUwLCA3MywgMzMsIDY5LCA5MCwyMzEsIDU3LDE1NSwgNTksICAzLDE4NCwgNTAsMTg3LAorICAgIDEwOSwyMjEsMjU0LCAzMiwyNTQsMjAwLCA3MSwgNzQsIDExLDIzOCwxMzgsMTE2LDE4MCwxMjYsMTc4LDI0NCwKKyAgICAxNTQsIDE2LCA4MiwgNzIsIDQzLDE0MCwgMjEsMjMzLCAzNywgNDMsMTc4LCA1MywgNDAsIDY5LCA2MiwgNzIsCisgICAgMTUwLDE3OCwxNjMsMTQ1LCA2OCwxMjYsMTc4LCA4MywgODEsIDIwLDIxNCwgOTksMTA5LDEzMywgNzMsMjExLAorICAgICAzMiwxNzksMTgwLDE1MCwxODAsMTc3LCA5MCwgMjUsMTY1LDE0MSwgNTQsMjAxLDEzMCwyMTYsMjMzLDExNCwKKyAgICAxMDMsMTk3LDEyOCwyMTksMTg4LDEwMywgMTUsMTQ5LCAgMSwxMTIsIDU4LCAzNCwxNTIsIDUxLCA0MSwgMjMsCisgICAgIDIzLDExNSwgODcsICA4LDIwNiwgMzgsIDEyLCA0MSwgOTAsIDk2LDE5NywxODgsMTMyLDE2OSwyMTcsMjEyLAorICAgIDIzMCwxOTUsIDQ4LCAgOCwyMjAsMTMzLDIxMywxNDYsMTQ5LDE0NCwyMTAsMTM5LCA4MiwyMDIsMTI0LDE5NywKKyAgICAgMzQsIDQzLDE3MiwxNzYsIDY2LDEzOCwxMDAsIDQ2LDE3OCwxMjQsIDE4LDIyMywxNzIsIDE3LDE1MCwgMzAsCisgICAgMTM2LDI0NCwxNDcsMTI5LDI0OSwgNTksIDU5LCA1OSwxODEsMTY0LDIyNSwxMDEsMjE3LCAxMCwgMTgsIDU0LAorICAgIDE3MywgMzEsMTA5LDE3OCwxNzIsMTcyLDIxNCwyMTQsMjMyLDExNCwyMjksMjMyLDE1NiwyMjgsMjAwLCA0MCwKKyAgICAgMzAsICAxLCA1NiwgNTMsIDE3LDE0MCwxMzcsIDY5LDIyMiwgNTksIDE4LDIwMSwgOTIsMjI3LDExMCwgIDksCisgICAgIDU3LDEyOCwxMTUsICAwLCAzMiwxMzgsMTg2LDIyMSwxMTAsMTg5LCA5NCwxNTEsMTE0LDExMiwxNDksMTEyLAorICAgICA0NSwxMTcsMjM0LCA0OCwgMzUsMTY1LDE3NiwgNTQsIDQ5LDE1MiwgMTYsMTMwLCA1NywxMzksIDk2LDE5NCwKKyAgICAxMDUsMTMyLCAgOSwyMzAsMjM2LDI0OCwgMzUsMTExLDExMSwxMTEsIDU1LDE1MywxNzIsMjE0LCA4NiwgNzQsCisgICAgIDczLDE5NCwyMTgsIDYwLDEyNywgMjUsIDc4LCA0NCwxNTAsIDQ1LCA1MiwyMDMsMjE0LDE1NywxNjMsICA3LAorICAgIDIyNiwgIDIsMjI0LDE4MCwgNjksMTc2LDE3MiwyMDcsMTQ5LCA3NiwyMDIsIDc1LCAzNCwgODUsIDc1LCA1MCwKKyAgICAgNDUsMjI5LDE5MiwxMDgsMjQ3LDIzOCwyMDUsIDU3LDEzNiwxODYsMjIxLDIzOCwyNDIsMjQyLDExNCwxODYsCisgICAgIDcyLDExOSwgNTgsMjA4LCA5NCwxMDcsMTUzLCA5OSwxNDYsMTc1LCA1NCwgNDEsIDMwLDIzNywgNjQsIDIxLAorICAgICA0MSwgNjgsMTQ1LDI0MCwxNTIsMjUyLCAzNiwgIDQsMTEwLDExMSwxMTEsIDExLDEwNywxNTMsIDEyLDIxOSwKKyAgICAxMDgsMTM1LDE0NiwgNTYsMTAyLDEzOCwyNDUsMTc3LDE3MywyMDEsICA3LDEyNCwyMzcsIDU0LDE1NSwgIDUsCisgICAgICAwLDIyNCwxODAsMTIwLDIwNCwxNjksIDMxLDIxMSwyMzgsIDIzLCAyMSwxNjMsIDI4LDEzNCwyNDcsMTQ4LAorICAgIDIxNiwxNTIsIDk0LDE3NSwxMDMsMTgwLDIxNCwgODksMjQwLDIxMCwyMTcsMTI3LCA1OCwgNzksIDk3LDE1OCwKKyAgICAxNDgsIDg2LCA3NCwxMDcsMTcyLDE0OSwyMTAsIDEwLCA0MywxMDksIDU0LDE0MywxMTcsIDgxLCA2OSwyMzAsCisgICAgMjMxLDEwMSwyNTAsMTM3LCA3NSwxMjMsMjIxLDExMCwgNzUsIDkxLCA0MywyMDEsIDc0LDE4MiwgMzYsICA0LAorICAgIDE3OSwxODEsIDc2LCA3MywyMjQsIDc0LDEwMiwyMDksMjAxLCA4NywxNTYsMTE3LCA5OCwgMjMsIDM4LCAzOCwKKyAgICAgIDQsMjI0LCA1MiwyMTgsMTM5LDI0MywyMjksMTM5LCAgNiwyMzAsIDQwLDEwMSwgMjYsMjE4LCA3OSwgNzQsCisgICAgMTY3LDE2OSwgMTQsMTYzLCAzMiwgIDgsMTgwLCA0OSwgNjYsMjM1LDE4OCwxMTIsMjEyLCA3MywyMzQsIDUwLAorICAgIDE5OCwgMjQsIDM1LDE2NSwyNDQsMTQwLDE3NywgNzMsIDEyLDE3OSwxOTgsIDkwLCA0MSwxNzIsMTQ5LCA2NiwKKyAgICAgOTAsIDgxLDExNiwxOTMsMjEwLDE2OCwgNzEsMTMwLCAgNCwxNjcsMjI3LDIzOSwxNDksIDgyLDExNywxNjMsCisgICAgMjExLCA2OSwgNjYsMTQ2LCA1NCwxNTYsMjA1LDIzMCwyNTUsMTc4LCAzOCwgODksMTA5LDE1NSwgNzcsMTEzLAorICAgICA5OCwgIDcsIDE1LDIzOCwgMjcsICAwLDIyNCwxMTYsIDY4LCA0NywxNjYsMTI0LDE4NCwxMDYsMTc4LDE4OCwKKyAgICAxMTksMjM4LCA1MiwyMjUsMTQyLDE2NSwgNDIsIDQ3LDE2NiwxNTUsMTI2LCA4MSwgNzQsIDI1LDE3MywxNDcsCisgICAgMjQzLDE3OSwxNDEsIDU0LCA1OCwyMTUsMTUxLDI0NCwxNDAsIDUyLCA4MiwgNzQsIDk5LDE0MCwxNDgsMTU4LAorICAgIDE0OCwyMTQsIDc0LDEwNywxNzMsMTQ5LCA4NiwxMDIsIDE3LCA0NCwgMzEsIDc1LDE0NSwgODcsMTQ1LDE5NCwKKyAgICAgMTUsMTMxLDIwOCwgMjQsIDE5LDEzMiwxNjEsMTkxLDIxMSwgMzcsMjA3LCA5OSwgNDEsIDg5LCA3MiwyMDMsCisgICAgIDM2LDE3MiwgMzcsIDk5LDE0MSwyMTQsIDQyLDEzOCwgODQsIDI0LDE3MCwgNDAsIDgyLDE3NywgNTAsMTk4LAorICAgICAzNiwgMTksIDk5LDE3OSwgNTksMTAzLCA1NCwgOTcsIDgxLCA3MSwgIDAsIDc4LDE0MywxOTQsICA0LCAgOSwKKyAgICAxODIsMTU2LCAyNCwxOTYsIDE4LCAgOSwxNzgsMTQ2LDEzMiwgMzcsIDQxLDIxMSwyNDksMTk0LDE1MiwxMTcsCisgICAgIDU0LDIyMywgOTcsIDUwLCA0NSwxNDEsMjA1LDIzMCwyMTIsIDU1LDIwNCwxODMsMTI3LDI0MiwyMTQsMTM1LAorICAgIDE1OCwxMjUsIDg2LCA3NCwgNDUsMTQxLDIxMiwgODIsIDc1LDE0NywgIDQsMTc1LDEwMCwgODYsMTI0LDIzMywKKyAgICAgMjUsMjA3LCAyNCwyMjcsMTIxLDE5OCwyMTgsIDc2LCA5NiwxMDgsMTY1LCA3NywgODYsMjQyLDIwNiwxMDIsCisgICAgIDIzLCA0NCwyMDIsIDg1LDE0NiwgMTYsIDE1LCAgMCwgOTYsMTQ2LDEwMCwxOTAsMjEwLDEwMiwgMjQsMjE0LAorICAgICAzOCwxNTcsMjQ2LDEyNCwxMDUsIDE1LDEwNywyNDMsIDczLCAxOCwgNzUsIDc1LDE1NCwgNDksIDQ5LCAyOSwKKyAgICAgOTgsMTI2LDExMywyMzIsIDE0LCAgMCwxMTIsMTIwLCAxNSwyMzIsIDc2LCA4NCwxOTUsMjM2LDE0OSwyNTMsCisgICAgMTk2LCA0OSwgMjQsMTAzLDI1NSwgMTIsIDQyLDIwNCwxNTksMjU0LDE3OSwgIDEsICAwLDIwNCwgMTUsIDcxLAorICAgICA5NSwxNDYsMTkyLCAyNCwgOTksIDYwLCA3OSwgMjYsMjI3LCA3MywgODksMTM3LCA5NCwgMzgsIDI5LDIzNCwKKyAgICAgOTYsMTczLDE3NywyMTQsIDc1LCA4NywgODYsMTc5LDEwOCwgMzcsMjAzLDIyOCwxMDcsIDYyLDI0OCwgMzMsCisgICAgMTY5LCAzMiwxNzcsMTkwLCAxMSwgIDAsIDk2LDE2MiwyMjgsMjI3LDE3NywyMDIsIDE3LDIwNCwxNTQsMjUyLAorICAgIDIwMiwgODQsIDk2LDEyMSwgIDQsMTE1LDE2NywxOTcsIDM5LDExOSwxNTMsMTQxLDE5NSwyNTEsIDExLDEyOSwKKyAgICAgMTEsICAwLDExMiwgMjQsMTI3LDIyOSwgMjAsMTAxLDE2MiwgNzcsMTUwLCAgNCwgNDksMjE0LCAyMSwgODcsCisgICAgMTkwLDE4NCwxMDksIDMzLCA0OCwxMTQsMjMxLDE4OSwgMjUsIDk5LDI1MywxODQsMTM1LDIyNywxMzgsMjAwLAorICAgIDEzNSwgOTUsIDI5LCAgMCwgNTEsIDk0LCAyNCwxMDIsIDgzLDIwNCwxMzksMTc3LCA3NCwxNjAsMTE2LCAxMywKKyAgICAxMTUsMTk3LCA5MCwgODksMjI3LCA2MiwxODcsMTcwLDE3NiwgMjMsIDM5LCAxMSwxNzAsIDg5LDIwNiwxNDIsCisgICAgIDY0LCA4MiwgNjIsMjIxLDE3OSwxMTUsMjU0LDIwOCwxMjAsIDM1LDE1MSwxODcsMTI2LCA0NywgNTEsIDkxLAorICAgICAzNCwxOTQsIDU3LDE0NiwgIDAsMjA0LDE4OCwxODgsMTQ2LCA1NywgIDMsMTc5LDIxMywgNTgsIDc0LDE3OSwKKyAgICAyMjMsMTQwLCA1NywxMjcsIDIxLCAxMCwgNTEsMjE0LDEyMiwxMzMsMTgyLCA3NiwgNDEsMTQ2LDExMywgNTgsCisgICAgMTA4LDE5MCwxODgsMTY4LCAyNiwxNjUsMjQ5LCA3NSwxMTIsIDU4LDEyNywgMTQsMTQ5LDE1MCwgOTIsIDQzLAorICAgIDIwNSwgNDksMTI1LCA5NiwyMzEsIDQ4LCA4MSwgNTAsMjA4LCA2NywxNzksIDUzLDIwMSwgNzIsMTQ0LDExNiwKKyAgICAgIDksIDU3LCAgMCwxOTIsIDc2LCA0MywgNDQsIDg5LDEyOCwxODIsIDcwLDE5NCwgMjMsMTk0LCAyMywyMTAsCisgICAgMjAzLDEwMiwxNzUsIDMxLDExNSwgODksIDg2LCAxMCwgOTYsIDkyLDIwMSwgOTMsMjQ5LDE0NCwxMzcsMTA4LAorICAgIDEwMSwgIDUsMjA2LDIxNCwxODAsIDQ1LCA0MSwgNDQsMjQ5LDIxNSwyMDcsMjI5LDE0OSwgNzIsMTk5LCA3OSwKKyAgICAgNDMsMjAzLDI1MywyNDYsMTIxLCAyMywgMjcsIDM3LDEzOSwxOTAsMTA1LDIwMywgNDksMTU1LDEzNiwxMDksCisgICAgMTkyLCAyOCwgMTgsIDQzLCA5OCwxMzEsMTE5LCAgNywgIDAsIDUxLCA0NywgNDgsIDY1LDIyOCwxNzksMTY4LAorICAgIDE0NywxMDQsMTQ1LDEwOCwgMTcsIDU1LCA3MywyMTQsIDczLDIwMiwxMDAsMTI1LDE0MiwxMTMsMjMxLCA0NywKKyAgICAgNzgsICA3LDE4NCwgMjIsICAyLDIyNywxMDYsMjIzLCA0MywgOTUsMTQ1LDE4NywyMTgsMTg3LDIwNywgOTEsCisgICAgIDk2LCA2MiwxMDEsMjExLDI0NCwyNTIsMjQ4LDIzOCwyMzcsMTY1LCA3MCwyNDMsMjM0LDIxOCwxMjEsIDk1LAorICAgIDIxMiwxODgsIDY3LCA0MSwyMTUsIDE4LCAyNywyMDMsMTM4LDEwOSwgOTYsIDc3LDE1MSwxMDksMTM1LDEwOCwKKyAgICAxNDMsMTA4LDIyMywyMTgsMTkwLDE0MiwgMzUsMTY1LDE3NiwgNjQsIDE3LCAgMCwxMTUsIDE2LDE5MywxMzIsCisgICAgIDg4LDI0MCwyMzUsMTcxLDI0NSwxOTgsMTc4LDIzMSwgNDcsMTc3LDE4MywgMzYsMTg1LCA2NSwxNDYsMTMyLAorICAgICAyOCwxNjMsMTk0LDIxMCwyNTIsMTQ5LDIyOCwxNzEsMjI2LCAgMiwgNTksMjUzLDI1MCwxMDgsMjEyLDEwNiwKKyAgICAyMjIsMjUzLCA0MiwyNTAsMjQ3LDIyOCwxNTgsMTE1LDIzMywgMzksMTIzLDIzNywxMjEsMjIyLDEzOSwgNzksCisgICAgIDYxLCAyOSwgNzEsMjA5LDI1NSwyNDcsMjIyLCA1OSwgMzEsMTkxLDI0NCwxOTYsIDkwLDE3MSwxMjUsMTkyLAorICAgIDE1NCwxNDUsMTUzLDIwMCwgNDgsMTk5LDEwOCwgIDMsMTA3LDE4MiwyMTcsMTA4LDE0NSwxMjUsMTA0LDIxMiwKKyAgICAyNTMsMjM4LDIwNiwxODksMTU3LDEwOSwxODgsIDQ1LCAgMCwxNTIsIDU5LCA0NiwgNDcsMTc1LCA2MCwxODcsCisgICAgMTI0LDE1MCwgNjksMTI1LDE1MywgNjgsMTQ3LCA4OCwyMzYsIDgyLCA3MiwgMzAsIDM0LDE0NiwyMjgsMTM5LAorICAgIDIzMywxMDEsMTgxLCA5NywgNTgsMjAwLCA0MywgMTMsIDkyLDE1MywxNzEsIDQyLDIyNywgMzgsMTg0LDExNCwKKyAgICAgIDAsMTQ2LDEzNiwxMzYsMTAwLDE5MCwgMjAsMTM2LDI0NCwxODgsMTY1LDE5NywxOTcsMjA3LCA2MiwxMTUsCisgICAgMjM3LDIyMSwyMDUsICA3LCA5NCwxODksMTI2LDIwOCwxNzgsMjE1LCA1MCwxMDcsMjAzLDE2MSwgNTMsIDE1LAorICAgIDIxNywxMDgsMTQ0LDE4OSwgMjcsICA3LCA2MywxOTAsMTIzLCAyNywyNDIsICAyLCA5NiwgNzgsMTg1LDE4NSwKKyAgICAyNDMsMjQwLDE0OSwgMTUsMjIyLDE4NywgMjEsMjQ2LDI1MCwxMDgsMjI3LDIyMSwxMDMsMjQ1LCA1OCwxMDAsCisgICAgMjU0LDExNCwyMDAsMTMxLCA4OCwxNzAsMTc4LDE2MiwxMDksMjM5LDExMCwgNjYsIDc4LDIyMSwxNTIsMjIzLAorICAgICA3MywgNTQsMjU0LDIwMywgOTAsMTcxLDE2MiwgNzIsMTMzLDE0NSwgNzEsMjI2LCA3NiwxNzEsMTg5LCAxOSwKKyAgICAgNzEsIDk0LDE2MywgNjIsMjI2LDE5MywxMzUsMTY0LDE0NywxNTAsMTMyLDE3NSwgNDYsMjE3LDEwOSwxNzgsCisgICAgMjQ3LDE5NCwyNTQsMjE5LDI0NywyMzgsMTA0LCA0NCwyMzEsICA3LDE5MiwgNjAsMTYzLDE3MiwyNTMsMjE0LAorICAgIDIyMSwxNTUsMjM5LDI0NSwxMTksIDIwLDE3OSwgNDEsICA0LDE5OCwxMjMsMjAyLDIyNCwxMjgsICA2LDIwMywKKyAgICAgNjAsMjI5LDI0NiwxODYsICA2LDExNCwgODcsIDQ2LDE3NSwxMTYsIDQxLDIwMiwyNTIsMjUyLCAzMywxNTMsCisgICAgIDExLCA0MCwxODksIDM1LDIyNiwyMjksMTIyLCA2NywgMjUsIDQ1LDI1MywxNTQsMjQ0LCA2MSwxNzcsMjU1LAorICAgICA0MCwgMTYsIDM4LCA3OCwgMTQsIDU2LDIxOCwxNDQsMjM3LCAxNCwyMTcsIDQ1LDE2MywyMjIsMTg1LDEyNywKKyAgICAgMjMsMTkxLDEyMywgIDAsIDc4LCAgNiwyMjMsIDkwLDE5MSwyNTMsIDgwLCA2OSwgNzgsIDI0LCA1NywyMzQsCisgICAgICAxLCA3MywxMDIsMjE1LCA5NywgODQsIDU3LDE4NiwxMDQsMTM1LCA5MiwyMDIsMTY3LDE4NiwgNDEsMjE0LAorICAgICA1OSwgNzUsMjM4LDE5NiwgNDcsMjIxLDEwNSwxODYsMTY4LCAgNywxNzksMTc3LCA2NiwgMTAsIDMzLCAzNywKKyAgICAxNDEsIDgwLDI0MiwgMzgsMTE5LDE3MCwxMzYsMjUxLDEwMCwgNjcsIDk4LCA4NywgOTQsIDg4LDE2MiwgIDgsCisgICAgMTI4LDI0OSwgMzcsMTExLCAzNCwyNTMsMjMzLDIyMSwgMjcsMTI3LDIzOSwxMzcsMTA3LDIwMSwgODUsIDcxLAorICAgIDE3NSwgMzUsMjQzLCAgNiwgODYsMjIyLDIwNywgMzQsIDMwLCAzOCwgNDgsIDcxLDExMywxMDEsMTI1LDIyOSwKKyAgICAgNjcsIDQwLDIwMCwgMzEsIDIyLDE2NywgOTIsMjM5LDEzNiwgODEsMTMwLCAzNCwgNTEsIDI1LDIzMCwxMzYsCisgICAgMjQ4LCA2NSwyMDgsIDE1LDE0OCwyMDIsMTc1LDI1NSwxMTEsMjU0LDIxOSwyMjMsMTkyLDE1NSwgIDAsMTI4LAorICAgICA1NywyMjksMjU1LDI0OCwxODMsMjU1LCAzOCwxODUsMjA4LDIwOSwyNDEsIDkxLDE1NywxMzUsIDQ3LDE3MiwKKyAgICAxNTYsIDk5LDEwNywxOTksIDUwLCA0OCwxMjcsMTYwLCAyOSwxOTEsIDIzLDIyOCwgMTIsMTg4LDExOSwgODcsCisgICAgMjAyLDEwMiwgMzAsMjIzLDI0OSwyMTksMTM0LDIwMCwgMTYsMTA5LDI0NSwxODcsMjQ4LDE3MywgIDMsMTEyLAorICAgIDI0MiwxODQsIDMwLDI0NiwyNTIsMTIyLDIyMSwyNDMsMjUzLDI1MywyMzQsMTc3LDE0NSwyMjgsIDg1LDE4NiwKKyAgICAgOTIsIDE3LCAyNSwxODUsMjMwLDIwMiwxMDAsIDcxLDIxNywgOTAsMTAzLDIxNywgNjMsMjAxLDI0NywgOTksCisgICAgMjQzLCA4NywxMTQsMTM1LCA5MSwgNjUsIDMxLDE5MSwxMDUsICAwLCA3OCwgMzAsIDU1LDEyMywgNTksMjQ1LAorICAgICA4NiwgODMsMjE0LDI1MiwgOTcsIDUzLDIxNywxOTMsMjA3LDIxMCwgNDEsMTU3LCAxMywxNDgsMjEzLDEyNCwKKyAgICAgODksMTU5LDE1OCwyMDIsIDM1LCA4NSwyMTEsMTcyLDE0OSwyMzEsMTc1LDE3MiwxMDMsIDY5LCA1MiwxOTAsCisgICAgMjUyLCAzNywxMzYsIDM2LDE0NSwxOTQsIDQ5LCA3MSwgIDAsIDc4LCAzNCwxNjEsMjA5LCA5NCwxNzMsMjMwLAorICAgIDEyMSwyMjIsIDU2LDIwNiwgMzksMTE0LDIzMSwxOTcsMjA3LDIwNywxNTAsMTY2LDExNCwgNDksMTUzLDEyNywKKyAgICAyMzksMjMwLDE3NSwyMzQsMTczLDIyOSwgODgsMjQ2LDE2MSwxMTIsIDI0LCAgMCwyMjQsMTMyLCAzNCwxOTksCisgICAgMTE2LCA0MiwxNDUsMTIzLDI1MiwgNDksIDQzLCAxMCwyMTEsMTMyLDE0OSwxMjcsMjM1LDE3MiwgMzUsMjMzLAorICAgIDIzMCwxNzUsMTI0LDIwMSwxNDEsMjQ0LCA1OCwyMDQsIDk1LCAgOCwgIDAsIDI0LDE3NywyMDAsIDE4LCAzNiwKKyAgICAxOTksIDUyLCAzOSwgNjksIDQ5LDE0MSwxNzAsMTU1LDE5MSwxMzgsMTExLCA0MSwxNDcsIDg1LDE2NiwxODEsCisgICAgMTE0LDEwNiwyMjYsMTYzLDIzMSwgNDcsICAwLDE5MiwgNDEsMTM0LDE0MywxNzYsIDQ5LDE1MSwgNDcsIDIzLAorICAgICA1MSwxMjIsIDIxLDI0OSwxMzksMTU2LDI1MiwgODUsMTc0LCAzMSwxMTUsMjI1LDE0MSwyMTYsMTkxLDE5OSwKKyAgICAgMzIsIDQ2LCAgMCwxOTIsMTUyLDIzNywxNTAsMTU5LDE5OCwyMzIsMjA0LDEwNCwgOTUsMjI4LDE3NSwyMDIsCisgICAgMTg5LDE4NCwxMDMsMTEwLCAzMSwxODYsMjU1LCAgNSwxNDUsICAxLCAgMCwxNDIsMTcwLCAgNywxNzQsMjQ0LAorICAgIDIyNiwxMjEsMjAwLCA3MiwxMTksMTAzLDE2OCwxMzIsMTg3LDEwMCwxMzUsMjQzLCAzMiwgOTksIDYxLDI1NCwKKyAgICAgIDgsICAwLCAgMCwgIDcsMTUxLDIyMiwgODAsMTEzLCAyMSwxMzQsMjAyLDE5OSwxMjIsIDEzLDI0OSwgNTcsCisgICAgMjUyLCAgNSwgIDAsMTUyLDExNiwyNTIsMjE4LDIzNywyMTgsIDk4LCA5NywgOTAsMjMwLDE2MSwgNjEsMTc4LAorICAgIDEyOSwyMTksMjAyLDE2OSwgNjAsICAxLCAgMCwgIDAsIDk4LCA4NywyMTcsIDI4LDEyNCwxMzYsIDI1LCA3OCwKKyAgICAxNDUsMTkxLCAgMCwgIDAsMTk5LDE0NCwgOTQsIDE0LCAyMSwxOTksMTcwLDE0NywyNDQsIDQ4LCAxMywyNTUsCisgICAgIDIyLDI1NCwgIDIsICAwLDIwNCwxODAsIDE1LDI0NywyMDAsIDk5LCAyNCwyNTUsICA1LCAgMCwgMjQsMTA3LAorICAgIDIyNiwgMjYsMjU1LCA3NywxMjEsIDg4LCA1MCwgNjcsMjU0LCAgMiwgIDAsMjA0LDE1MCwgIDcsMjQ5LCA4MCwKKyAgICAxNTAsMTQ3LDE2MywgNjMsICAwLCAgMCwgIDAsMjM2LDIzNSwgIDksIDYyLDIyOCwyMzcsMTE4LDI1MywxNTgsCisgICAgMTE5LDIyMywgODIsIDMwLDI0OSwxNzcsICAwLCAgMCwxNjcsMjAyLCA4MiwgIDcsIDgwLDE5MiwxNjgsMTM1LAorICAgICAyMCwyNDksMTQ0LCA2MywgNjYsMjUzLCAgOCwgIDAsIDI0LDEyMywxMjQsIDI1LDEyNiwgODAsMTEzLDIzNiwKKyAgICAgMTUsIDEwLDEyNywgIDEsICAwLDE2NiwgNDYsMTk1LCA2NywgMjYsIDE0LDI1NCwgIDIsICAwLCA3NiwgNTEsCisgICAgMTcwLCAyOSwgIDUsMjQ4LCAxMSwgIDAsIDQ4LDE3NSwgMjgsMjE2LCA5NSwxMDQsMjIzLCAgMywgIDAsMTAyLAorICAgICAzNiwxNjIsIDczLCA0MCwgMTAsICAwLCA0OCwxODcsIDM3LCAzNCwyMzQsIDcxLCAgMCwxOTIsIDczLDIxMCwKKyAgICAgMjIsMjUyLCAgNSwgIDAsMTUyLDEyMywgNzAsMjQ3LCAyMywxNzAsIDc0LCAgMCwxOTIsMTA4LDIyOSwgNTIsCisgICAgIDU3LDI0MywxMjMsICA4LCAgMCwgIDAsMTY4LCAzMSwgIDEsICAwLDI0MCwgMjMsICAwLCAgMCwxOTIsIDk1LAorICAgICAgMCwxMjgsMjExLDE5NCwxMTMsMjQ0LDE1NCwyMjgsMTA4LDIzOCwgMjIsICAwLCA5NiwyMjIsMjIxLCA1MiwKKyAgICAgIDEsIDUxLDIwMCwyMDIsMjI3LCA1NywgMTEsMTI4LDE5MiwgNzUsICAwLDEyOCwxODUsMTY5LCAzMSwgNzUsCisgICAgIDExLCA3NCwxMzgsIDgxLDEwOCwxMjMsMjQ0LDI0MywxOTksICAxLCAgMCwgMzksMTY4LCAyNCwyMjgsMjAxLAorICAgICAyMiwxMDUsMTc4LDE4OCwxMjgsIDU1LCA1MSwxMTUsIDQ3LDE0MiwxMzIsMTQ4LDE5NCwyNDMsMjQ2LDExOCwKKyAgICAgMjQsICAwLCAgMCwyMDQsIDY4LDI1NCwgOTgsMTgyLDE5OCwxNzgsMTAxLDEwMiwxNjIsICA3LDIyMSwyMDYsCisgICAgMTY1LCA3MSwgMzEsIDIxLDE1OCwgNzEsMTAxLDEyOSwgMzMsIDk3LCAgMSwgIDAsMTAyLDIwNiwgOTUsMjA0LAorICAgIDIwNCwxNTAsMTQ3LDE0MiwyMTUsMjIzLDIyMCwxMjQsMjU1LDIwMSwxOTksIDMwLDE3NSwgNTMsMTU1LDEwMCwKKyAgICAgNDUsIDkxLDEzOSwgMjMsICA4LCAgMCwgNDgsMTc5LDI0OCwgNjgsIDY4LCAzNiwxMzIsIDE2LDExMSwyMjIsCisgICAgMTg5LCA0NSwxMzIsMTIwLDI1NCwyMzQsMjEzLDE2NywxNTksMTIwLDE0NiwxNjMsMjE2LDEwNCwyMDUsMjE0LAorICAgICA1MCwyNDEsIDQwLDIxMSwgOTMsIDM1LDE1NCwgIDEsICAwLDE2NiwyMjcsIDQ3LCAzMywyMDAsMjQzLDE4OCwKKyAgICAxNTEsMTU4LDI1MSwyNDAsMTUzLDE3OSwxNzEsMjA1LDEwMiwyMTEsIDQyLDE3MywxMzEsMjA4LCA0MiwxOTcsCisgICAgMjA0LCA0OCwgMTksICAwLCA5NiwxMTgsMjUzLCAzNywxMzYsICA0LCAgOSwgMzMsIDM3LDE3OSwgODUsIDY1LAorICAgICA3MiwxNzcsIDE4LCA3NCwxMTUsIDIwLDE3OSwyMTQsMTAwLCA0NSwgOTcsIDIwLCAgNSwgIDAsIDk2LDE4MiwKKyAgICAyMzUsIDcxLDE3OCwyMTQsMTcwLCAzMiwgMTIsMTgwLCA0OSwyMTAsMjQ3LDEzNywxMzIsMTc3LDE5NCwgODgsCisgICAgMTg0LCAxMSwgIDAsIDQ4LDIzNSwyNTQsMjI2LDE4MCwxMzMsMTExLDE3MywgNTQsIDcwLDE3OCwgMzIsMjI1LAorICAgIDExMywxNzgsMjAyLCAyNywgIDQsICA2LCAgMCwxNTIsMjQ5LDI1MiwgNjksMjE3LDIyNCwgNDcsMTc4LDEyMywKKyAgICAgMTUsIDkzLDEzMywyMDksICAwLCAgMCwxNzksMTk0LDE2OCwyMzEsIDYzLDI0MiwgNDgsMTI1LCA2NSwxMDIsCisgICAgICAwLDEyOCwxOTUsIDI3LDEwMCwyMzYsMjU0LDEzMCwxNDYsICAwLCAgMCwxMzUsMjQ2LDIxMSwxNDAsMjMwLAorICAgICA0NywgIDAsICAwLDE1MiwyMTUsMjUwLCAxNywgIDAsICAwLCA3OCwxMzYsMTkxLCA4MCwxMDIsICAyLCAgMCwKKyAgICAxNDQsMTkxLCAgMCwgIDAsICAwLDI1NCwgIDIsICAwLCAyOCwgNTksMTc5LCA4NSwxMjIsMjAxLDEyMSwyMjAsCisgICAgMTA1LCAgMCwgIDAsIDY0LDI1NCwgIDIsICAwLDE1NiwgMjgsMTI3LCA0OSwxMTQsIDIzLCAgMCwgIDAsMjQ5LAorICAgICAxMSwgIDAsMTEyLCA3NCwxNTMsIDg4LDIzOCwxMjksMTkxLCAgMCwgIDAsIDM5LCA0NCwxMjcsIDI5LDIxNiwKKyAgICAxNTksIDQwLCA1MiwgIDEsIDY0LDIxMCwxNjIsICA5LDIwNywgMjQsMTM2LDI1MiwgIDUsICAwLDE1MiwyMTUsCisgICAgMTY4LCAzNCwyMzEsMjUzLCAgOSwgIDAsICAwLCA4MCwgNjMsMTk0LCA3NiwgIDAsMTI4LDE4NSwyNDYsIDIzLAorICAgIDIxMCwgMjIsICAwLCA5NiwxMjYsIDc0LCA3NiwyNDQsMTkxLCAgMCwgIDAsIDUxLCA0MywxNjgsMTEzLDI0OSwKKyAgICAgMTEsIDQ5LCAxMiwgIDAsIDQ4LCA5OSwgODIsMTQ0LCAzOSwyMjcsMTA1LCAgMCwgIDAsIDc4LCAzMywxNjgsCisgICAgIDMxLCAgMSwgIDAsMTY3LDIxNCwgOTUsMjAwLCA5NCwgIDAsMTI4LDE4NSwyNDMsIDIzLDE5NiwgIDUsICAwLAorICAgIDE1MiwxNzQsICA5LCA4MCwgNjMsICAyLCAgMCwgNzgsMTA5LDI1MywxMzYsIDM2LCAgNiwgIDAsMTUyLDE0NiwKKyAgICAgNDAsMTQ0LDE5MSwgIDAsICAwLDIyNywxNTAsMjEwLDE2NCwgNTAsIDEzLDI1MiwgIDUsICAwLCA1NiwyMDUsCisgICAgMjQ1LCAzNSwgIDAsICAwLDE2OSwxMDcsIDk4LCA2OSwgMzUsMjUyLCAgNSwgIDAsMTUyLDE4OCwyMDQsMjI0LAorICAgICA0NywgIDAsMTkyLDE4OCwxNjgsMjM0LDIxNiwyMDUsIDM4LDEwMywxMDcsMTE5LCAgMCwgIDAsIDM5LDIxMSwKKyAgICAxMjIsMTk5LCAzNCwgMTUsMTIxLDIwMCwxNTcsICAxLCAgMCwxMjgsMTA1LDExNSwgMzIsMTI3LDE5MywgOTIsCisgICAgICAwLDEyOCwxNTMsMjQ3LCAyMywxNDMsMjI4LCA0NSwyMzIsIDEyLCAgMCwgNDgsIDU1LDI0OSwgMTEsICAwLAorICAgICAgMCwxMTgsIDc5LCA0NywgMTksMTQzLCA1MiwyNDIsIDI0LDE1OCwgIDQsICAwLDIyNCwgNTIsMTM3LDE0MCwKKyAgICAyNDcsIDQyLDIxOCwxNDIsMjEzLCAxNywgMTgsMTEwLCAgMiwgIDAsMTQwLCA1MSwxNDksIDc3LDIwOCwgMjgsCisgICAgMTY4LCAzMSwgIDEsICAwLDEzNSwxNjksMTgyLDEyMCwgIDYsIDM0LCAxNSwyNTIsICA1LCAgMCwgNTYsIDcwLAorICAgIDIwNSwgNzcsMjE4LCA5NSwxNDAsMTMwLCAxOCwgIDAsIDQ4LCAxNSwgMzIsMTI3LCAgMSwgIDAsIDc4LDE0MiwKKyAgICAxOTEsIDcwLCAyNywyNTEsMTMzLCA4NCwgIDYsICAwLDE1MiwgMjksMTI3LDI0MSwgODEsMTg5LCAgNCwxNDUsCisgICAgICAxLCAgMCwgODAsIDYzLCAgMiwgIDAsICAwLDI1MiwgIDUsICAwLCAyNCwgMzEsIDUxLCA4NywgOTksMjAxLAorICAgIDE4NSwxMjcsICA2LCAgMCwxMjgsMTY5LDEyMywxMDksIDc0LCA5NCwxNDQsMTM1LCA4NSwgMjEsIDYwLCAgNiwKKyAgICAgIDAsMTUyLDE3OCwgMTksIDgwLCA2MywgIDIsICAwLDIzMCwgMjEsMjQ4LCAxMSwgIDAsICAwLDEyNywgIDEsCisgICAgICAwLCAgMCwyNTIsICA1LCAgMCwxNTIsIDExLDEyMCwxOTEsMTUwLDIxNSwxMTMsMTgzLDE5NiwyMjQsIDQ3LAorICAgICAgMCwxOTIsIDk3LDIyMCwxMzMsMjUyLCAgNSwgIDAsMTI4LDIxMywxNDIsMjAxLCA5NSwgNjAsMTIzLDE5MCwKKyAgICAgIDUsICAwLCAzMiwxNDAsIDEzLDI0NSwgMjMsMjE0LDIzMywgIDAsICAwLDIwNCwgNzEsMjMzLDEzNiwyNTAsCisgICAgIDE3LCAgMCwgNDgsMjE1LCAyOCwyMTMsIDk1LDIwMCwxMDIsICAwLDEyOCwxMjEsMjQzLCAyMywxODgsICA1LAorICAgICAgMCwxNTIsMTgyLCA0MCwyMjgsIDEyLDIzOCwgMTksICAwLDIyNCwgIDQsMTIwLDEwNywgIDIsMTU4LCA2NCwKKyAgICAyNTUsIDExLCAgMCwxMTIsMjEwLDIzNCwgNzEsIDY4LCA0NCwgIDAsMTkyLDE4OCwyNTAsIDExLDIxMywgMzYsCisgICAgICAwLCA5NiwyMTQsIDYzLDI0NSwxMTQsMTk2LCA2MSwxMDEsMTA0LCAxMCwgIDAsMTEyLCA4OCwxOTcsIDI5LAorICAgIDE0NywgNjIsMjA4LDI1NSwgIDIsICAwLDIwNCwxMDcsIDM2LDEzMSwxOTEsICAwLCAgMCwyNDMsIDEwLDI1MiwKKyAgICAgIDUsICAwLDEyOCwxOTEsICAwLCAgMCwgNDAsIDIwLCAzOSwgOTEsIDk4LCA3NCwxNTQsMTU3LDEyNSwgIDEsCisgICAgICAwLDEyOCwxNzcsMjQ4LDEwNywgMjAsIDU5LDE5MywgOTYsICAwLDEyOCwyNDksMTcxLCAzMSwgNDMsMjMwLAorICAgICA5OCwxNTIsIDEyLCAgMCwgNDgsICA3LDI1NCwxMzAsMTcwLCAgMCwgIDAsMTc5LCAzMywgMTAsMTIxLDE2OCwKKyAgICAgOTMsMTI5LDE5NSwgIDAsICAwLDIxMSwgODcsIDI2LDE0MiwgNjMsICAyLCAgMCwyMzAsIDQ5LDEyMywxOTMsCisgICAgIDk1LCAgMCwxMjgsMTIxLCA3MCwyMzgsMjM3LCA3NiwxNTgsMTU0LCA4OCwgIDEsICAwLDIyNCwgNzIsMjQ5LAorICAgICAxMSwxODIsICAyLCAgMCwyMDQsMTcxLDE5MSwgOTYsIDUzLCAgMCwxOTIsIDE3LCA1NywgNzAsIDk3LDE2MCwKKyAgICAyNTUsICA1LCAgMCwxNTIsMTQ4LDE1MSwxOTgsMTczLCA1MCwxODUsMjA3LDEzMSwgMzIsMTA3LCAgMSwgIDAsCisgICAgMTAyLDE4MSwgNDIsIDY3LDI1NCwgIDIsICAwLDIwNCwgNDMsMjUxLDI1MSwgMTEsICA5LCAxMiwgIDAsIDQ4LAorICAgIDE3NSwyNTQsMTU0LDIzMywyNDgsICA4LCAgMCwxMjgsMTkxLDE2MCwgMzMsICAwLDE5MiwyMjAsIDM3LCAyMSwKKyAgICAyNDQsMTkxLCAgMCwgIDAsIDM5LDE4OCwxMjYsIDY4LCA0NCwgIDMsICAwLDIwNCwxNTYsIDEyLDIyOCwgIDksCisgICAgMTI1LCA5NCwgIDAsMTI4LDE0NywxNzUsIDU1LCA1NywgMzEsMTg3LCAgOSwgIDAsIDY0LDI0MiwgNTgsMTYyLAorICAgIDE5MSwyMjQsIDQ0LCAgMCwxOTIsMjM2LDI0OCwgNjYsMjA2LDIxOCwgMTQsICAxLCAgMCwyMjQsMTY4LCA5OSwKKyAgICAxNzUsIDMxLCAgMSwgIDAsMTI4LDE2NiwgNTgsMjAzLCAyMiwyNTIsICA1LCAgMCwxNTIsIDg3LDE0MiwyMzAsCisgICAgIDQ3LDE0OCwxNDcsICAwLDE2MCwgOTIsMTU2LCA0NSwxMjcsMTkzLCA3NCwgIDAsMTI4LDExMywxNTUsMjM3LAorICAgICA1NiwxODgsIDM0LDE5OSwxNzgsMTAzLCAgMCwgIDAsIDg4LDEzOSwgMzksMTc0LCAxNSwxMjEsIDYwLCA3OSwKKyAgICAgIDQsICAwLCAgMCwxNjYsIDgyLCA2MywgIDIsICAwLDE5MiwgNjAsIDM2LCAyNSwyNDgsIDExLCAgMCwxMTIsCisgICAgMjIwLCAyMiwgNTksIDQ2LDE2NywxOTMsIDk1LCAgMCwgIDAsMjEyLDE0MywgIDAsICAwLCA4NCwxMzUsMTQ3LAorICAgIDIzNywxMzEsMTk1LCA5NSwgIDAsMTI4LDIyNywxMTMsIDI1LDI1MiwgIDUsICAwLDE1MiwxMDksIDk5LCA3NywKKyAgICAyMTEsIDk4LDI0MCwgMjMsICAwLCA5NiwgNjIsMjExLDIxNSwxMTAsMjU0LDIyNiwgIDMsMjM5LCA1MiwgNzAsCisgICAgMTI3LCAgMSwgIDAsMTAyLCA1OCwxMjcsMjQxLCA0NiwxNzAsMTMwLDE4OCwgIDAsICAwLDE2OCwgMzEsICAxLAorICAgICAgMCwgIDAsMjU0LCAgMiwgIDAsMjA0LCAxMCwxOTksIDg2LDE2MSwyMDEsIDgxLCAzMSwgIDksIDUzLCAzNCwKKyAgICAgIDAsIDk2LCA5MCwxNjIsIDY2LDI1NCwgIDIsICAwLDE1NiwgNDgsMTI5LDIwMSwxNTMsMjIxLCA1MSwgIDAsCisgICAgICAwLDE0MCwgNTQsMTg2LDE5MSwgMzIsIDQwLCAgMCwxOTIsIDI0LDE2NSwxMTYsMjM2LCA3NCwxNDUsIDcxLAorICAgIDEyMCwxMTIsMjQ4LCAxNCwgIDAsMTc2LDE5MSwgMTEsMTQyLDIwNywgMjAsIDE4LCA5MCwgIDIsICAwLCAyOCwKKyAgICAgNzgsIDgyLCA4MywxMTksICA1LDI1MCwyNDcsICAwLDEyOCwyMjcsIDgzLDIyMSwyNDEsIDQyLCA3OCwgMzQsCisgICAgMTIzLCAgMSwgIDAsMjMwLDE0OCwgMzUsMjMwLCA0NywyNDgsIDE0LCAgMCwxMjgsMjUwLCAxNywgIDAsMTEyLAorICAgICA4MiwxMzgsIDcwLDI0OCwgMTEsICAwLCAgMCwxNjUsIDI5LDIwNiwgOTUsMTY4LCAxMSwgIDEsICAwLCAgNywKKyAgICAxODEsMjEwLDE5NiwxODksIDMzLDI0NywyMTksIDczLDEzNCwyMDgsICAwLCAgMCwxMjMsMTIyLDEwNiwxMDYsCisgICAgMTIyLCA1NiwxMDYsMjUzLDIwMCwgNjAsIDE5LCA3OSwgIDMsICAwLDExMiwyMTgsMTM4LDE5OSwxNjMsMjQ4LAorICAgIDEzOSwyMjUsIDQ0LCAgMCwxOTIsMTE2LCA2NSwyNTUsIDMwLCAgMCwgNDgsMTExLDE4NSwyMzUsIDQ4LDI1NCwKKyAgICAgNjYsMjEwLCAgMiwgIDAsMjA0LDE0NiwgMTIsMTQ0LDE5MSwgIDAsICAwLDI0MywgNDIsMTc5LCA0OSwyNDgsCisgICAgMTM5LDE0NSwyMDMsICAwLCAgMCwyMTEsMjQ1LCAyMywgNDQsICA0LCAgMCwxNTIsMTc1LCA3NCwgODIsMjA2LAorICAgIDI1MCwgMTQsICAyLCAgMCwxOTIsMTIwLDIzNSwgNzEsIDQwLCAxMywgIDAsIDQ4LDExNywgNjMsMjAwLDE4NSwKKyAgICAyMTYsIDc1LCAgMCwgIDAsIDEyLCA1NCwxMDIsMTI3LCAgMSwgIDAsIDk2LDE2OCwyNDksMTcxLCAzMSwgIDEsCisgICAgICAwLDIwOCwyMTUsMjEyLDEwOSwgMzgsIDcxLDE4MiwgNDMsMTM4LCA2OSwgIDAsMTkyLDEwOCwgMzMsIDE1LAorICAgIDE2MSwgNDAsMTUyLCAxMiwgIDAsIDQ4LDE1NSwyNDUsIDM1LCAzOCwxNDgsICAwLCAgMCwxNDAsMTg5LDE5NCwKKyAgICAxNTYsMTA4LDI1MywgNTYsMTE1LDEyMywgMTAsICAwLCAgMCwxOTksMjI1LCA0NywgIDAsICAwLCAzNCwyMTMsCisgICAgMjI4LCA1MSwxNDIsMjIwLDI0NywgNDksMTQ0LDE3MywgIDAsICAwLDIwMCwgOTUsICAwLCAgMCwgNDgsIDI1LAorICAgIDEyNywgMzMsMTE5LCAgMSwgIDAsMTAyLDE2MSwyNDYsIDI4LCA4NywyNTQsMTMwLDIxMSwgIDAsICAwLDE3OSwKKyAgICAgOTksICA0LDEyMSwxNjgsMjUzLDEzMywxOTksICAwLCAgMCwyMTEsIDIzLDE1OCwgNjgsMjEwLCAgMiwgIDAsCisgICAgMjA0LCA0MSwyMzIsMjIzLCAgMywgIDAsIDc4LDE0OSwxOTEsMTUyLDEzNiwxNDUsMjA4LCAgMCwgIDAsIDgzLAorICAgIDE3NCwyMTcsMTQ0LDE5MSwgIDAsICAwLDEzNSwyMTUsIDIwLCA1OSwgNzcsMjQxLDIwMSwgMjcsIDc2LDE0MiwKKyAgICAgNzksMTY4LCAgOCwxMDAsICAwLDE1NiwyMTgsMTYwLCA1MywxNTcsMTQzLCA2MywyNDIsIDIzLCAgMCwgOTYsCisgICAgIDk0LDEzOSwgNzUsIDU3LDE5NywxOTksICA2LCAgMCwgNjQsIDg1LDE5OSwyMzYsIDQ3LDIxNiwgMTEsICAwLAorICAgICA0OCwxNDcsMTYwLDEyNiwgIDQsICAwLDE1NiwgNzYsMTI3LCAzMywxMjIsICAxLCAgMCwxMDIsMTgyLDEyNCwKKyAgICAgNjAsIDY4LDI1NCwxMzAsMjExLCAgMCwgIDAsMTc5LDIyNSwgIDksIDU3LCA3NSwgNTksICAzLCAgMCwgIDAsCisgICAgIDcxLDI0MCwgMjMsIDY4LCAgNSwgIDAsMTUyLDE1MSwgMjQsIDM4LCAxNSwxODYsIDE5LCAxNiwgMjgsICAwLAorICAgICA5NiwgNzAsMjAyLCA1MywgNTcsIDE1LCA1OSwgIDksICAwLCA1NiwgNDUsMTY2LCA5OSwgNjIsMTI4LDEwMiwKKyAgICAgNDgsMTI2LCAgMiwgIDAsIDQ4LCA5OSwgMzMsMTQwLCA3MSwgOTMsMTM4LCAgMywyNTQsICAyLCAgMCwgNzYsCisgICAgMjA4LCA5MCwyMTQsIDEwLDEwNywyNDcsMjIwLCA2MiwgNjEsIDE5LDE1NiwyNDcsMjAwLDEwNCwyMTcsIDg3LAorICAgICA1NywyMDYsIDYxLCAgMywgIDAsIDY0LCA4NSwxMjMsMjEwLDIyMSwyMjAsMjE4LDE4NSwxODMsMTEwLDIyNiwKKyAgICAxODQsIDkwLCA0MCwgMTQsMTUwLDE0MiwgNjcsIDMxLDEzOCwgNzUsICA5LCA3NywgNzgsMjQ3LDIwMSwgIDAsCisgICAgICAwLCA3OCwgMjEsIDcwLDIzMywxNzMsIDE1LDIzOCwgNjAsMTg0LDEyMywxNDMsIDQzLDIwNiwxNzAsIDc2LAorICAgICA3NywxOTEsIDcxLCAgMSwyMDEsMTY4LCAzMSwgIDEsICAwLCA4MywgNjYsMTMzLCA4MSwyMDgsMjM3LDEwNiwKKyAgICAxNjUsICA2LDIxMSwgMjMsIDg3LCAgNCwxOTgsMTg3LCAgNiwgNDgsMjQ4LCAxMSwgIDAsIDQ4LDEzMywgNjYsCisgICAgMTQ3LDIxNywgOTAsIDk5LDExNCwxMjcsMjQxLDE3NiwgNTcsIDE3LDE0NywyMzcsMjE2LCAxNywgODgsIDY5LAorICAgICA5NywxODgsMTg3LDE5MSwgODAsIDExLCAgMiwgIDAsMTQyLDE2MCwxNjgsMTI1LDE4MywgMzEsIDI0LCAzNywKKyAgICAxOTMsMjM4LDE0MywyMTYsMTUzLDIxNCwxNDksMTQ3LCAxOCwxNDcsMjQzLDEwNSwyMzUsMTU3LCA3NiwxOTgsCisgICAgMjAwLCA5NSwgIDAsMTI4LDE2OSwxODYsMTQyLCA1MSwgNDEsIDQ5LCAxNSwyNDEsMjE3LDE1OCwgNTEsIDg0LAorICAgIDIwMywxMzEsIDYyLCAyMiwgIDAsICAwLDIzOCwgNTcsMTg2LCAzMiwxNTIsMTM2LDIyMSwgMjQsMTk4LDIwNCwKKyAgICAxNjUsIDkyLDE1MCwxMDAsIDQ1LDIyMiwyNTEsIDk3LDIyOCwxOTMsMTcyLCAgNSwxNTcsICAxLCAgMCwxOTgsCisgICAgMTA1LCA2OCwxNzQsMTIwLDEzMywgMTksMTM2LDIyMCwxOTQsIDQ5LDE4MSwgMjcsIDg1LCAxNSwgODMsIDMwLAorICAgIDE2OCwxMjYsMTAwLDE5NiwgNTIsICAwLDE5MiwxMjAsIDYyLDI0NSwyMzYsICA0LDE3NSwgMzYsMTE5LDExMywKKyAgICAxNjksIDEzLDE1MCwxMzMsIDQ4LDIwNiwgNDcsIDE5LCAyMywgODcsMjM3LDIzOSwgNDcsIDcyLCAgOSwgIDAsCisgICAgMTEyLDEwOCwxMzgsMTY4LDE4MCwyNDAsMTM5LDI0MSwgMTksMjA0LDEzMywyMTYsMTU2LCA3NywxODUsIDUyLAorICAgIDE5OCwyMjYsMTc2LDIyNywgODcsMTYxLCA1MywgIDAsMTkyLDE5MywyMjksIDQ4LDExMiwgODYsIDk5LCA4NiwKKyAgICAgNDEsMTUwLCA1OCwyNDMsIDg5LCAzMSwgNDQsIDQzLCAzMCwxNDcsMTM5LDE0OSwyNTAsIDQ5LDE0NywxNTMsCisgICAgIDI4LDE5OSwxMjYsICAxLCAgMCwyMjQsMTcyLCA2NywyMjIsIDQ0LDIwOSwgODMsMjE0LDI0NywgMjYsMTU4LAorICAgIDE5MSwxNjgsMTY4LCA0NiwyNDMsMjQwLDEzMywyNDEsIDE5LCAgMCwxMjgsIDI1LCA4MywgOTYsMTQ1LDE5MSwKKyAgICAgNTYsMjA3LCA5NSwyNDksMTEzLDIwMSwgOTIsMTExLCAzNSwyNDQsMTkxLCAgMCwgIDAsMjI0LDE4NCwxNzAsCisgICAgIDUwLCA0NiwgMzcsMTc0LDIyNiwgNTksIDM4LDIzMSwyNDgsIDk5LDE0NSwxODUsMjQyLDI0OCwyMjksIDIyLAorICAgIDE1NSwyNDAsIDIzLCAgMCwgOTYsMTcwLDE0NiwgOTksIDg3LCA4MSwgODksMjA1LDE1MiwgMjMsMTQ5LDIxMywKKyAgICAgIDEsIDIxLDE2NSwgODMsIDM0LDIyOSwxMDAsMjQ3LCAyMCwgIDAsICAwLCA0MCwgMjMsIDIyLDIzMSwxOTUsCisgICAgIDg2LDE3OSwgMTQsMTg5LDE0NywxOTYsMjAwLCAyOSwyMDksMjAyLDEyMSwyNDIsIDk4LDIwNiwgIDcsIDgxLAorICAgICAzMiwxMjcsICAxLCAgMCwxNDIsIDM5LDE5NiwyNDAsMTA0LDIxOSwgMjIsMTk5LCAyMiwxNzksIDMzLDE3MSwKKyAgICAgNzgsIDgxLCA3MywyMjksMTAyLCA4OCwxMDUsMTUyLDE5NywyMDgsMjU0LCA2MSwgODIsIDIwLCAgMCwyMjQsCisgICAgMjMyLDEwMSwgMjIsMTQzLCA4MiwgNTQsMTE0LCA4MSwgNDUsMTUwLCAgMiwgODcsMjIyLDE4MywxMTksIDExLAorICAgIDIwMiwyNDIsIDE2LDEzOCwgNDksMjEyLDE0MywxNDQsIDI5LCAgMCwgNDgsMjE2LDIyNSwxODIsMTAwLCA3MSwKKyAgICAgOTcsIDkyLDExOCwxNTAsMTA3LCA0MywxNjcsMTYxLCA3OSwxNDksIDMwLCA2MiwyMzQsIDcxLCAgMCwxOTIsCisgICAgMTgwLCAxMSwyMDUsMjI2LCAyMCwgMzQsMTE5LDE5OCwgNDcsMTE4LDEyNiwxNDQsMTE5LDI0OSwxNTcsIDY3LAorICAgIDE0NywgNzEsMjQ1LCAyMywgMzUsMTMyLCAgMSwxMjgsMjE2LDExNywxMjAsIDE1LDE4NCwgNjcsMjQwLDIyMSwKKyAgICAxNjMsMTQxLCA2OSwyMjUsMjAwLDI0OSwgNjgsIDIxLDIwNCwgODUsMjM1LCAyOSwyMDEsIDk1LDEyNCwxOTYsCisgICAgIDkzLCAgNywgIDAsMjA0LDE2OSwxOTYsMjQ4LDIzMiwgMzgsIDk5LDExOCwxNDMsIDQ1LCAxNCwgNzYsMTA1LAorICAgIDE1MiwgNzAsMTc2LDI0MiwxNDQsMjUxLDI0MiwyMzIsMTc1LCA2NywxNDMsMTkxLDEzNSwxNzQsICAwLCAgMCwKKyAgICAgIDcsMjQyLCAgNCwyMzksMTg3LDEwMSwyNDksIDY4LCAzNCwxMDMsMTkyLDEwNiwyMTgsIDIzLDIwMywgOTIsCisgICAgMTM1LDI1NCwgMjMsICAwLCA5NiwxMjIsMTMzLCAzOSwgODcsMTk5LCA3MCwgMTIsMTU3LCA5OCwxNDksIDQzLAorICAgIDE2NywgNjQsMTg2LDE2MywgODcsMjQ3LDE1MiwyNTUsIDMwLCA4OSwgMTIsICAwLDExMiwxNDAsIDMxLDEyMiwKKyAgICAgNzUsMjM2LDI0OSwgNjIsIDEzLDIxNCwxNDMsMjA2LDE5MiwgNDcsMTAzLCAxMCwyNTIsMjM0LCA1MCwgNjgsCisgICAgMTIxLCA2NSwyMzMsIDMxLDEwMSwyMjMsIDk3LCA0NiwgIDAsMTkyLDEyOSwyMjksIDM3LCAzNywxNDcsMjQwLAorICAgIDEwNywgNTMsIDMwLDE2OCwgMzEsMTU3LCA2MiwgMjQsMjMxLDIyOSwgMzYsMTQ5LDIzMCwyMTEsIDU3LDIyMCwKKyAgICAyNDgsIDQ3LCA3MCwyNDYsICAyLCAgMCwgMjgsMTk3LCAgMywgNzYsIDY4LCAzNiwxMzIsMTA1LDIxMiwxNTEsCisgICAgMjA3LDE3NCwxNDIsMTIwLCAyMywgIDMsIDQzLCA2MywxNTAsIDc4LDEyOSwgNjgsMjU1LCAxMSwgIDAsIDQ4LAorICAgICA1NywxODAsIDM5LDI1MywxMzMsMjQ2LDIxOCwxODUsMTE1LDE1MywxMzEsMTU2LDE2MywxNDQsIDc4LCAxNCwKKyAgICAgNDMsIDI5LDEwNSwyMjAsMTAxLDEzNywxMTAsIDY2LDI1NSwgMzAsICAwLCA0OCwgNzMsIDIyLDE1MSwxNTEsCisgICAgMTU5LDE4OCwxMjIsIDg1LDEyMiwgOTQsIDg1LCA3MywxMTAsMjE3LCA3MiwgODQsMTQwLDEwMCwxMDEsIDI2LAorICAgIDE3OCwxMzgsMTA5LDIxNCwgIDAsMTQ3LDI1MSwgIDUsMTkwLCAxNywgOTgsIDI5LCAgMCwgIDAsMTQ5LDIyNiwKKyAgICAgOTQsIDU1LCA0MCwxMTAsIDg2LDE3MSwyMTMsMjQyLDIyOCwyMjksMTA4LDE5NywyMTMsMTA3LCAxMCwxNTEsCisgICAgIDg1LCA4NywyNDYsMTEyLCA1NSwxNDQsICA3LDIxOCwgNzksIDcyLCAxMSwgIDAsMTEyLDE3MiwxMjIsMjI4LAorICAgIDE4OSwxNjIsIDg0LDE4MSwgMjcsIDM4LCA3MSwxODUsIDcxLCAgMCwgIDAsMTUyLCA2NSwgMjMsMjAwLDIyMSwKKyAgICAyNDcsIDE4LDIyNiwgIDIsICAwLDIwNCwxODAsMjMzLDIwOCwxOTEsICA3LCAgMCwxNDAsIDkzLCA5MSwgOTksCisgICAgIDIzLDE1MiwgMzIsIDY1LCA2OCwgOTgsMTE5LDEyNywgMjksMTE3LCAyNSwgMzYsICAwLDE5MiwxNjksMTE4LAorICAgIDIxNSwxOTMsIDkyLCAzMiwgNjgsMjQ1LDE3OCwgMTYsMTYyLDE3MCwxNjgsMjQ0LCAxMCwgMzMsICA2LDIxMiwKKyAgICAgMzcsMTM2LCA3MiwyMDAsMjA5LDExOCwgMTIsICAwLCAgMCwxNDIsIDQzLDIyNSwgIDgsMTE0LDE3OCwgODUsCisgICAgMjM0LCA1MywxNDUsIDc0LDIwMywgNTMsIDg3LDEyNiwgNTcsMTg3LCAgMSwyMzQsIDcxLCAgMCwxOTIsMTAwLAorICAgICA0MSwgIDUsIDQ3LCAzMywyMTAsMjQwLDE0OSwgIDUsMTczLCA2OCwgOTMsMTMwLDEzOCwgNDQsIDM4LCA5MiwKKyAgICAxMDcsMTQ5LDEzMCwyMTYsMjMyLDI1NCwyMjYsIDYxLCA2MCwxMzgsMTMyLCAgNiwgIDAsICAyLDIxNCwxNjEsCisgICAgIDc0LDE5OSwgNjUsMTY3LDE0OSwgIDUsIDU1LDEwMCwxOTUsIDYwLDE2OSwgMzMsMTI3LCAgMSwgIDAsMTk4LAorICAgIDE3MSwxNzksMTQ1LDEyNSwgNTQsMjA4LDIxMCwgMTgsMTY1LDEyMiwgODEsICA4LDIwMiwgMjYsIDk4LCAzNCwKKyAgICAgNDEsIDM5LCAgNywxMTAsMTE1LDEyMCwxMjcsIDMzLDExNSwgIDEsICAwLCAxNCwyMzMsMTI5LDE2NCwxMDQsCisgICAgMjA0LCAxMSwgNjcsMTQ1LDIzNSwgNzMsMTY0LDE3NCwgMTgsIDM3LDExNywxODUsMjEzLDE2NSwyMTksIDE3LAorICAgIDE0NywxOTksMTg0LDEzOSwgIDAsICAwLDE3NiwgOTEsMjM2LCA3NCwgMTMsMTUwLDI0NiwxOTEsIDc0LCA3MSwKKyAgICAgMzAsIDY5LDE4NSwyMTAsIDIwLCA2NywgNzQsMTk5LCA2OCwgOTgsMTY4LCAzMSwgIDEsICAwLDE3OSwxNDUsCisgICAgMjA0LDE0NiwyMDQsMTQ5LDE0MywxNjUsIDcyLDEyMywyNDgsMTYyLCAyMCwyMDgsMTY4LDEwMCwgNTksMTIxLAorICAgIDE5MiwgNzEsIDY3LCAyMCwgIDMsICAwLCAyOCwgNzcsICA1LCA2NiwgODQsMTQyLCAzNiwgMzgsMTIyLCAxOCwKKyAgICAxMTAsIDQwLCA3NSwgNTUsIDQwLDE0MCwyMzAsIDMwLDE2NCwyMDQsMTExLDEzNSwyNTIsICA1LCAgMCwxNTIsCisgICAgMTQwLDE4MywgNzQsIDUzLDEwMCwgODEsIDYxLDIzMCwxMjIsMTE0LDI0MiwxNTEsIDQwLDIzMSwxNzUsIDM2LAorICAgIDExMywxMzcsMTc4LDE5MCwxNzAsMjI3LDE5MSwgMjQsMjQxLCAxMCwgIDAsIDQ4LCAgOSwxNjUsMTM3LDIzNCwKKyAgICAyNDgsMjUxLDExNCwyNTQsIDQyLDE3NCwyMDUsIDc1LCA3MywxNjcsMTA5LDE1MCwgMTUsMTA4LCA2OSwyNTQsCisgICAgICAyLCAgMCwgNzYsMjEyLDEwNSwgOTgsMTYwLDE0MiwgMjAsMjI5LDI1MiwxNDksMTk5LCA1MCwgODEsMjAyLAorICAgICA5NSwxMjEsMjE1LCA5NCwyMjgsMTM1LCAzMiwyMjksIDY1LCA0NSwyMDIsMTQ5LCA0NSwxMjEsMjIwLDE5MywKKyAgICAgMTgsICAwLDExMiwxMzAsMTA3LCA3MiwgODEsIDU4LDIwNywgNDksIDI3LCA0MCwgODEsMjI4LCA0NywyMjUsCisgICAgICA2LDE4MCwxODAsIDQ5LDE1MCwyNTMsMTQzLDE1NiwyNTAsIDgxLCA4NCwyNTMsICA1LCAgMCwgIDAsMTk5LAorICAgIDEwNywgNTQsIDgxLCAzNiwxNjksMjEwLDEyMCwxMzcsMTg4LDIzMywgNjksMTk0LDIzMywxMjUsIDgxLDI1NCwKKyAgICAgOTUsMjMzLCA4NiwgODksMjUyLCA1OCwgNzIsMjU1LCAzMCwyNDEsIDEwLCAgMCwgNDgsMjIwLCAxMSwxMzUsCisgICAgMTc4LCA2NywxNjksIDgwLCA0NCwxMzgsIDczLDExOSwyNTIsIDY4LDE2OSwxNDQsMjA0LCAxNSwgNzQsMjMwLAorICAgIDIxMywxNjYsMTMyLDE2NSwgIDAsICAwLDE0NywyMTEsMTU3LDIxMCwgMzAsIDE3LCA0OSwxMzksIDc0LCA3NywKKyAgICAgODksIDIwLDE0NywgODQsMjUyLCA0NywxMTEsMTE5LCAyMSwxOTUsMjQzLCA3NSwxNzksIDg1LDIwMCwxNzcsCisgICAgMTAxLCA0NSwxMzYsIDE1LCAgMCwgMjAsMTQyLDI1MSwyMDksMjIxLDIxOCwyMTgsMTI0LDI1NSwxMzQsMTQyLAorICAgIDE2MiwxNjIsMTI2LDExNiwgMzgsMjU1LCAzNCwxODMsMTM3LCA3OSwxOTcsIDc2LCAyMCwxNjIsMjI2LCA0OSwKKyAgICAgNjYsMjU1LCAxMSwgIDAsIDQ4LDExMywxNDUsMTc3LDE4MSwxNTcsICA3LDE1NSwgMjcsMTE5LDIzOSwyMDksCisgICAgMTkyLDE3NiwyMTMsMjI2LDI0OCwgOTgsIDQ5LCA4NCwxNjIsMTE2LCAzOCwyMDksIDgxLDIzMCwyMDcsICAxLAorICAgICAgMCwxMjgsIDQ5LDE2MCwyMjYsIDQwLCAxMCwgIDIsIDIxLCA2OSwyMjgsIDI4LCA3NSwxNzIsMTU4LCAgMywKKyAgICAyMzMsIDc2LCAgMCwgNTQsIDQ4LCA0NSwxMDcsMjI1LDE4MSwxMTMsMjQ4LCAxMSwxNDksIDM1LCAgMCwgIDgsCisgICAgIDkzLCAgNywyNDksIDQ5LCA1MSwgOTEsMTA3LDEzNSwxMTAsMTU1LCA4NywxMzcsMTEwLCA1OSwgOTUsMTQ4LAorICAgIDIwNiwyNDksIDcwLDI1NCwgIDIsICAwLCA3NiwgNDcsMTgzLCA0OCwgMTUsMjA2LCAxOCwgODYsMjA0LDE3OCwKKyAgICAgNTgsMTAwLDEyMiwgNjcsMTYyLDIxMCwxODQsMTc1LDEwOCwgODMsMjQ4LCAxMSwgIDAsIDQ4LCAgNSwgNDIsCisgICAgMTE1LDIyOCwyMDgsMTQ0LDIxNywgIDksMTM1LDE3NCwyMTcsIDgxLCAgMiwyNTQsICAyLCAgMCwgNzYsIDU0LAorICAgIDEyNSwxNDEsIDE1LCA1NywgNzksIDU5LCAxMSwgIDAsMTI4LDIxOSwyNDYsMjQ0LCAyMywgNzksMTIwLCAxNSwKKyAgICAgIDAsICAwLDExNSwgMzcsIDM4LCAzMCwxMzksMTgxLDE1NiwxODEsMTEwLDEzOSwxNDcsMTcwLDEyMSwyMzksCisgICAgMTg3LDEwMCwyMTIsMTQzLCAgMCwxMjgsMTUzLDE0OCwgMzUsMTAzLDE0NiwyMTgsMTAxLCAgNSwgMTYsMTk5LAorICAgIDE1OCwyMTcsMTY2LDExNCwgNzksMTkzLCAyOSwyMjcsMTE0LDIyNCwgIDAsICAwLCA0OCwyMDQsIDgyLDE1NiwKKyAgICAxODQsIDQ0LDIxMywgMjEsMTc5LDIzNSwgNTQsIDQ2LDIwMywgIDgsMjQ5LCAxMSwgIDAsIDQ4LDI1MywxMzgsCisgICAgMTQ4LDEzOSwyNTUsMTAxLDE2NiwyMDIsMTkwLDEwMSwyMzAsMTE0LDEzMCwyMjYsMTI0LDE2NiwgODUsMTIxLAorICAgIDI0OCwxOTksICA0LCAgMCwxNjAsMjI4LCA1OSwxOTQsMTQxLDE1MywxODUsMTU2LDE3NSwgODIsIDQ5LCA1NywKKyAgICAxMDUsMTM5LCAgNywxNjUsMjI5LCA2MiwxNjYsMTMyLDE2NiwgIDAsICAwLDE0NywyMDEsIDg5LDEyMywgODksCisgICAgMTQ0LDIxNywgNDEsIDI0LCA1NywgMjksMjI0LDE1NCwyNDgsMTQxLDE3OSwxODYsMTQ1LCAyOSwxMDEsMjQyLAorICAgICA4MSwyMzQsIDcxLDE4NCwgMTMsICAwLCA0OCwgNjIsMTg3LCA0OSwgNTcsMjE0LCA0MiwgNzYsIDg2LDI0MSwKKyAgICAgODYsMjA5LDI1NSwyMjYsIDYxLDI0MiwgMjMsMTk1LCA4MCwgIDAsMTI4LDIyNywxMTgsIDg2LCAgNiwyMjksCisgICAgMTMzLDE2NCwxNTUsMTkxLDE0NiwgNDMsMjQzLDI1MiwxNDksMTExLCA2NCwgODksMTQ5LDIwMSwyMzIsMjIzLAorICAgICAgMywgIDAsMTY2LCA4MiwxMTksMjQxLCA0NiwyNDksIDQzLDExOSwgMjMsMjI5LDIzMywxNzEsMjMyLDIyOCwKKyAgICAgNTksMTQ5LCAzNiwgMTMsIDI1LCA2MywxNzcsMjMxLDE5NSwgNDgsIDQyLCA3MSwgIDAsMTkyLCAyNCwgIDUsCisgICAgIDg2LCA4NCwxNDAsIDkyLCA1MCwgODMsIDU4LCAxMiwxNzIsMjQwLCA4OSwxODYsMTAxLCA4MSwgMjYsMjM4LAorICAgIDIyMywyNTUsMTMwLDE3MCwgIDAsICAwLDE5OSwxNTAsMjA3LDE1MiwyMDMsMjI3LCAzNSwxNTYsMjQ0LDE0OSwKKyAgICAxNTEsMTQ5LDEyMSwgNTEsIDQ0LDIwMywgOTUsIDc4LCAgNSwxMzcsMjQxLCA5NSwgIDAsMTI4LDE2OSwyNDgsCisgICAgMTQxLDIwMywgMzgsMTE1LCAgNywgODIsMTc2LCA1MSwxNTYsMTMwLDEzOSwxNzgsIDUwLDIyMywgNTIsMTcxLAorICAgICA0MCwyMDksMjU1LCAgMiwgIDAsIDI4LDE0NywxNjYsMjQ2LCAxNSwgOTksMTIxLDIwOCwgNDIsMjQyLCA4NywKKyAgICAyMzgsMTc3LDE4OCwgIDcsIDg2LCAxMiwxMTMsMjA1LDIyNywgODcsMjU0LCA0MCwyNDIsICAwLDE4NywxMzEsCisgICAgMTcwLCAxOCwgIDAsIDQ4LCA1NCwyMDEsIDQ5LDE4NywgMjMsMTM1LDIyOCwxNzUsMjEwLDEyOSwxOTksMTgwLAorICAgIDI1MSwgOTQsIDI2LCAyNywxOTMsIDcxLDIwNSwgOTUsMTQ0LCAyNSwgIDAsMTY4LCAgMiwxOTksMTA0LDE4MCwKKyAgICAxNjEsMjQ5LDIwMywgNDEsIDMyLDIxNywgNjEsMjExLCA3MiwgMzAsMjQ5LCAgOSwgNjQsMTAwLCAgMCwxMjgsCisgICAgMTMxLCA5NywxMzksMTYxLDE3MCwgNjksMjUzLDIwMCwgNjcsMTQ5LCA4NiwgNDYsIDI0LDE4NSwxODQsMTU4LAorICAgICAgOSwyNTMsMTIzLCAgMCwxOTIsIDY4LDE0NiwxNTQsMTM5LDE3NiwgNjgsMTgxLCA3MCwxOTUsMjMzLDIwMSwKKyAgICAxMTUsIDQ5LDE5MiwxOTAsIDI0LCAgMSwyMzAsIDI4LDEwOCwxMTYsIDc5LDE0MCwxMTYsMjA2LDEzOCwxNDgsCisgICAgMjI3LDIxOSwgMzksICAwLCAgMCwgNzQsMjAwLDIyMSwxNzQsIDQ2LDE5MCwxODMsMTkwLCA3MSwxNTgsIDM5LAorICAgIDE2NSwyMjgsMTYxLDI0NSwgOTksIDQxLCA5OSwxODUsIDE4LCAyNywgNTAsMjU0LCA4NCwxNDIsMjI5LCAyNSwKKyAgICAgIDAsICAwLDE5MiwgNDAsMTU4LCA5NiwgNDEsIDg1LDIyMSwgOTUsIDg5LCA1OSwxODcsMjE1LDEwMiwxMjMsCisgICAgMjE3LDIwOSwgNDUsIDM0LCAxNSwyMzIsIDQ3LCA0MCwgMTEsICAwLDExMiwgMjAsMTQwLCAzOSwgODcsIDQ2LAorICAgICA5MiwgODgsIDkzLCA5MSwyMDMsIDM1LCAyMywxODcsIDg1LCA5NywxMDUsMjE0LCAgOSwxMTQsMTAzLCA0NSwKKyAgICAgMzYsIDI2LDEwOSwyNTQsIDI4LCAzMCwgODksIDk2LCAxMiwxODUsICAxLCAgMCwgMTQsMTk0LDE1MywxNDksCisgICAgMTQ5LCAxMSwgMjMsIDQ2LCAxMiwyNDMsMTM4LCA4MywgNTQsMjMwLCA2MiwgNDMsMjEzLDE0NywyMDYsMjI5LAorICAgIDIzNiwgIDYsIDk5LDIzMiwyMjMsMTk1LCA5MSwgIDAsMTI4LCAxNywgNzcsIDMyLDE2NCwgNDAsMTIzLDIwMiwKKyAgICAxODUsIDkyLDE1NywxMDQsMTQ5LDE1NywgNTEsMTg3LDEzNSwyNDYsMjExLDEzNCwxNDMsMjU1LDEzMCwxNDUsCisgICAgICAwLCAgMCwgIDcsIDIyLDIxNCwxMjAsIDIyLCAzOCwyMTgsMjM3LCA3OCwxMzQsMjA1LDIzNCwgMzcsMjQ3LAorICAgIDIyMSwgNjUsMjAwLCAxMiwgIDAsIDQ4LDE1NSwyMTMsIDI1LDE5OCwxMjcsICAxLCAgMCwxMDIsMjIzLCA4NCwKKyAgICAxNjMsMjQ4LCAxMSwgODksIDExLCAgMCwgNDgsIDYxLCA2NywgIDksIDM0LDE3NywyMTksIDc5LCAgNCwxNDksCisgICAgMTI2LCA0MCwxNDQsMTkxLCAgMCwgIDAsMTQ3LCAzOCwxMTUsMTQ0LDExMiwxMDEsIDM2LDE3MCwyMTUsIDIwLAorICAgICA1NCwgMTksMjAxLCA3OSwxMzQsMTIxLCA3NywyMDAsMTI1LCA5MiwxMzksIDY4LCAgNiwgIDAsIDI0LDE5MSwKKyAgICAxODksIDc0LDIyMywgMTAsIDg3LCA5NCwgNjYsIDIwLDEyOSwgNzUsIDM2LDI1NSwgMjMsMTY1LCAxNiwxNTAsCisgICAgMjIxLCA3NiwgMzIsMTI3LCAgMSwgIDAsMTk4LCA5MSwxMDAsMjM4LDE1OSwxMjEsMjAyLDIwMSwgNzUsICA4LAorICAgICA3MSwgNzQsIDY2LDIyOCwyMTUsIDIxLDE4MSwxNjQsIDI0LDE0NCwgOTMsMTM0LCA2MCwyMTAsMTU4LCAgMiwKKyAgICAgIDAsMTYwLDE3MiwgMzUsMTY3LCA0OCwyMTgsMTgxLDIzNywgNTMsMjA4LDI0MSwxMTQsIDkxLDEwMCwgOTgsCisgICAgIDUyLDEyNywgNjUsIDg0LCAgMCwxMjgsMjIxLDE4OSwxOTIsMTM1LCA1MSwxMzUsIDI0LDIwMCwxMDEsIDM0LAorICAgIDI1MywxNDYsMjEyLDEzOCwyMTcsMTkxLDIwMSwxNDksMTk0LCA0MSwgNDIsMTk5LDE0NSwxOTEsMjI0LCA1NSwKKyAgICAgIDAsIDMyLDE3NywgNjcsMTA5LCAzNSwxMzIsMjE5LDI0MywgMTgsIDY2LDE4NCwyMTUsIDg0LDIzNCwxOTksCisgICAgMjQ0LCAzOSwyMTMsIDY2LCA4MiwgMjgsMjAxLCA5NSwxNDQsIDIyLCAgMCwyMjQsIDE2LDIyOCwyMTAsMjAyLAorICAgICA4NCwgODUsIDI2LCAyNSwgODEsIDQyLCAyNCwgNjksMjMzLDE5MiwxNjMsIDI0LCA1NiwxMjAsMTM3LDI1NCwKKyAgICAgNjEsICAwLCA5NiwgNTQsMTE0LCA5MCwxNTQsMTg3LDE0NiwyNTUsMjIwLDE0NiwgNDksMTg5LDIyMiwyMDksCisgICAgMjIyLCA4MSwxOTksMTI3LDI0MSwyMDAsIDU5LCAgNSwgIDAsIDU2LCA0NSwgNTQsIDI2LDIzNywgMjgsMTEwLAorICAgICAzMywgNzQsMjU1LDExOSwyMzQsMTk5LDExNCwgNjYsIDQzLDEwOCwyMjksIDE0LCAgMywgNDMsIDU0LCAyMCwKKyAgICAyNDIsMTYwLCA1OSwgMTAsIDk5LCAgMSwgIDAsMTQyLCA5MiwgNjcsMTAyLDEwMSwxNjMsIDkxLCA2MywgMjIsCisgICAgMjAxLCA0MywyMDMsIDk1LDE2OSwxNzMsMTMyLDIwMCwgNDcsMTQ5LDIzOCwyMjcsIDMyLDI0OSwxMzksMjQ3LAorICAgIDI1MCwgMTcsMTgwLCAgNiwgIDAsMjM0LDE5MiwgNjcsMjMwLCAyOCwxNjcsMTI3LDIzOSwxODIsMTg3LDEzMiwKKyAgICAgMjcsMjA0LDI0MiwxODYsIDgxLDEwMCwxOTksIDM4LDEwNSwxMDgsMjUzLCA0NywyMzIsIDExLCAgMCwgODAsCisgICAgIDgxLDE5NCwxMTAsMTcxLDExOSwxNDgsMjM1LDIwMCwgODIsMjU0LDExNCwgMTksIDI0LDE0OSwyNTEsIDk1LAorICAgIDE5NywyMjQsICA5LDExMywxMzYsMjU0LCAyMywgMjAsICA1LCAgMCwgNTYsMTIyLDIyOSwgNzIsIDM2LDIyMCwKKyAgICAyNDEsIDE4LDE5NCwxMzcsIDkwLDIyOCwgOTQsMTQ3LDE4NywxNDAsMjQyLCA3NywxNjgsMTIyLCAxOCwyNDcsCisgICAgIDQwLDI1NCwgOTgsMjMyLCAxMSwgIDAsIDQ4LCA2MiwxMjksMTQ5LCAzNywgODQsIDY4LCA0NSwxNjcsIDQxLAorICAgICA3MCwxMzEsIDYxLCA1MCwxNDUsMTA3LCA0NiwgNjMsIDUwLDEzNywyNDEsIDE5LCAgMCwxMjgsICAzLCAyMiwKKyAgICAxMzQsIDcxLDE0MCwgOTUsMTQyLDE4NCwxMTQsIDY5LDIyOSwgMjIsIDE5LDIyOSwyNTAsMjA5LCA1NywgNzAsCisgICAgIDg5LDE1NCwxNDAsIDM0LDI0OSwgNzEsIDc4LDI0MywxNjksICAwLCAgMCwgNzgsMTYxLDIzOCwgNjgsMTIxLAorICAgIDE4OCwxMzIsMTQ3LDE5MSwxNjgsIDg0LCA0NiwxODYsIDk5LDE5MywxNzgsMjUyLCA4NSwgMzAsMTMxLCA0NywKKyAgICAgMTUsIDQwLCAzOSwxMzQsMTk1LCAgMCwgIDAsIDcxLDIxNCwxNTMsIDI0LDE0NiwxOTEsMTc4LDExMCwxNTEsCisgICAgIDkxLCA0NiwxODYsIDM1LDIzOCwxNzEsICA3LCA0MCwgNDksMjU0LCAzMCwgIDAsMTEyLDI0NCwgNjgsMTE3LAorICAgIDE5NiwyMzMsICAyLCA2OSwyNDUsMTYwLDE2NCwgMjcsMTg1LCAxMCwyMDMsIDgxLDI0OSwxMDAsMTEwLDI0OCwKKyAgICAgMTEsICAwLCA0OCwxMDUsMjQ1LCAxMywgNTIsMTgyLCA3NCwxNjUsIDM0LCAyMSwgNTEsIDI0LDE1MCwxMDMsCisgICAgIDkzLCAyMSwyMDYsIDIwLDIxMCwyMTcsIDg4LCA0OCwyNDgsIDExLCAgMCwgNDgsIDg5LDE1NiwgODksMTEzLAorICAgIDEzMiwxMjMsIDU4LDE2MywgNDAsMjMxLCA0NywgNDIsMjQyLDE1MSwyMTEsIDM1LDExNSwgMzQsMTU1LCAyNCwKKyAgICAxMTUsMjU0LCA2NiwgNDcsIDEyLCAgMCwgNDgsMjIwLCAgNiwyNTEsIDc3LCAgNiwyMzAsIDEyLDE0MCwgMjQsCisgICAgMjAwLCA5NSwxNjIsIDgwLCA4NiwyMTQsICAxLDE5NSwyNTAsIDI5LCAgMCwxMjgsMTM3LDE4NCwxMDcsMTUyLAorICAgIDE3NSwgOTIsMTEzLCAyMSwgOTMsMTI0LCAzOSwxNjMsIDgxLCA1NCwyNDksMTg5LCAxNiwyMjgsMTM0LCA1MiwKKyAgICAxNjcsMTcxLCAxNSwxMjcsICAxLCAgMCwxNjYsIDg0LCA2OSwxMDIsIDMwLCA0MywxNTksMTQ5LDIzNywgMTIsCisgICAgMjU0LDE2MiwgMzQsMTQ2LDE0OSwyMzQsMTk5LDIzNiwgIDYsMTYzLDI1MCwxNzEsMTI0LCA1NCwgMTksMjM0LAorICAgICA2OCwgIDAsMTQ0LDE3NywgMTQsIDQzLCA0NiwxMDMsIDk4LCA4NSwgNDksMTEyLDIyMCwxNzcsMjE2LDE3MCwKKyAgICAxNTIsMjQzLDEwNywyMTUsMjE3LDI0MSwxNDUsMTkxLCAgMCwgIDAsIDk5LDIxMiwyMTUsMTI2LDE0NywyMDksCisgICAgICA4LCA1NSwxMjQsMjI5LDE1MSwgIDcsMjE0LDEyNywgMjgsIDUwLDIzNSwyMzQsMTQ0LDE5NywxMDksMjI1LAorICAgICA0NywgIDAsMTkyLDEwMCwyMTEsMTUyLCAxNiwxMzEsIDgyLCAyNywxMDgsMTM1LDIyOSwxNjIsIDE5LDIwNiwKKyAgICAxNTYsIDE5LDIyOSwgIDEsMjQ4LDIyOSwyNDEsIDE5LCA0MCwgMTEsICAxLCAgMCwgMTksIDcwLDIzNiwxNzgsCisgICAgMTY4LDEwOSwxMDUsMjUyLDE1MSwxNjgsIDQ2LDE2NCwxMzQsMjQ5LDIzOSwgIDEsICAwLCA4MywyNDEsMjEzLAorICAgIDE3NCwxNjksIDc2LCA4NCwyMTQsMjQxLCAxNiwxMzEsMTgzLCAxNywxNjgsIDMxLCAgMSwgIDAsMTQ3LCA0NCwKKyAgICAgMjYsMTIxLCA4NywxNDEsMTM3LCA5MywgMjIsMjE1LCAyMiwxODcsMTU1LDExMSwyMzIsMjUyLCA5NSwgNDAsCisgICAgIDMwLCAgMSwgIDAsIDE5LDIwNCwgOTcsIDk4LDI1NSwxMDcsMTE4LDE0MSwgOTUsICAyLDIyNywgODcsICAxLAorICAgICAgMCwgNTEsIDg4LCA3NiwxMzgsIDMzLDEzOSwyMTMsIDE0LDE4NywxNDksMjE2LDIxOSwgOTUsIDcyLDEwMCwKKyAgICAgIDAsMTI4LCA5OSwgNDQsIDQzLDExOSwxODMsMTU0LCAyNCwyMDUsMTE3LDIwMCwgOTUsICAwLDEyOCwxMDUsCisgICAgICA5LCA3NiwyMzYsIDkxLCA4NiwxMzgsIDYxLDExMSwgNDcsMTk5LDE4OCwgNjMsICAwLDEyOCwyMTEsMTAyLAorICAgIDE2NiwyMzMsMjMzLCAgMSwyNDksIDExLCAgMCwgNDgsMTc1LDE5MiwgOTUsICAwLDEyOCwyMDEsIDg1LDE0MCwKKyAgICAyNDAsIDIzLCAgMCwgIDAsMjM2LDIzMCwgNDcsIDcwLDE4NywgMTEsICAwLCA0OCwxMzUsMjU0LDIyNiwyMDksCisgICAgIDY2LCAzNCwgIDQsICA3LCAgMCwxNTIsMTIyLCA3NywgNDEsMTAzLDExNSwxODMsICAwLCAgMCwgNTEsIDQwLAorICAgICAzNiwxNTgsIDQ5LCAyOSwyMDAsMTMxLDIzNywgNjIsIDkyLCAgNiwgIDAsMTUyLDIxNywyNTAsMjQxLDE5MiwKKyAgICAxMTgsMTMwLDE5MiwgIDAsIDY0LCA5NywxODQsMTIzLCA2MiwgNTksIDg2LCA2OSwyMjQsMjQ4LCAzNSwgIDAsCisgICAgMjI0LDIzMiwxMDEsMjI4LCA3NiwyMjgsIDQ3LDE2NCwgNDEsICAwLDE5MiwxNjEsMTcyLCA1NCwgMTMsMTIxLAorICAgICA3MiwxNDgsMTMzLCAgMCwxMjgsMTEzLDE0OSwxNDQsMjI3LDE5MSwyMDksMTg0LDIzNSwgNzEsIDQ0LCA2NywKKyAgICAgIDQsICAwLDE1MiwxNDYsMTc3LCAxNCwyMzQsIDQ3LCA3MiwgMTAsICAwLCA0OCwxNTUsIDcyLDIwMCwgMTEsCisgICAgICAwLCA0OCwgNzEsMTUzLDIzNSwxMzYsMjQ1LCAzNSwgMjgsICA3LCAgMCwxNTIsMTM1LDI1MiwgIDUsICAwLAorICAgICAgMCwxMTUsMjI1LCA0NywgMzAsIDUzLCA4MywgNDksICAyLCAyNCwgIDAsMjI0LCAgMCwxODIsMjI0LDIyNywKKyAgICAgMTcsICA1LDI0MiwgMjMsICAwLDIyNCwyMjQsMTY2LDIyNiwxNTMsICA4LCA0NywxMTQsIDIwLDE1MywgMzQsCisgICAgIDk2LCAgMSwgIDAsMTQyLDE1MCwxOTUsIDM4LDIyOCwxNzUsMjUzLDI0NiwgIDIsIDUwLCAgMywgIDAsMjA0LAorICAgIDEzNCwgMTcsMjI4LCAzMywxMTksIDEwLCAyMiwgIDMsICAwLDI0MCwxNDgsMTU1LDIyNSwyNDIsIDMyLDE4NywKKyAgICAgMTAsMTEzLCAgMSwgIDAsMTAyLCAgOCwxMjEsMTA0LDExNSwgNjYsMTAwLCAgMCwxMjgsMTUzLDI0MSwgMjMsCisgICAgIDY4LCAgNSwgIDAsMTUyLDExMSwxMjcsIDI5LDIxNCwgODYsMTc2LCAyOCwgIDAsIDM5LDE1NSwgMjUsMjUyLAorICAgIDE0MCwyMDMsMTIxLDIyMSwxMTMsICAwLDE5MiwxNjksMTUxLCAyOSwxOTgsMTc1LCAgMiwgIDAsMjMwLCA1MywKKyAgICAxNDQsIDczLDEwMCwgNDYsICAwLDE5MiwxNTYsIDM0LCAxNSwxNjYsIDg3LCA3MiwgMTMsICAwLCA0OCwgMzEsCisgICAgMjU0LCAgMiwgIDAsMTI4LCAyNSwxNzQsIDM2LDIyNSwgNDcsICAwLDE5MiwgNDksMjMyLDEwNywgMzQsIDc0LAorICAgIDE0NywgOTksMjE3LDEwNSwxNDgsMTQ5LCAgMCwgIDAsMjI4LCA0NywgIDAsICAwLDE1MiwxMjgsMTkxLCAxNiwKKyAgICAxODYsICAwLCA2NCwxNzMsMTM2LDI1MiwgIDUsICAwLCA1NiwyMDEsMTc0LCA1OSwgNTQsMjMxLDIwMSwgMTcsCisgICAgIDEzLDIwMywxNTIsIDUyLCAyNiwgIDAsIDQ4LDE3MCwxNzgsMTIwLDExOSwgODcsMTQwLCA4MywgMjksMTE0LAorICAgIDE0MCwyNTEsIDEzLDE2NSwgIDEsICAwLCAzOCwgODksMTE0LDIwMiwxNjMsIDYxLCA1MiwxNDgsICA1LCAgMCwKKyAgICAxNTIsIDI2LCAgNywyMDUsIDk1LCAxMiwxMzksICAxLCAgMCwyMzAsMjAwLCA5NSwyMDgsIDE5LCAgMCwgOTYsCisgICAgIDIyLDE4OSwxMjgsMjI3LDE0MywgIDAsMTI4LDEyMSwxMTYsIDIzLDI1MiwgIDUsICAwLCA1NiwyMDEsMjQ1LAorICAgICAzNSwxMDYsIDcxLCAgMCwxOTIsMTg4LDI1MCwgMTEsICAwLCAgMCwyMjQsIDQ3LCAgMCwxOTIsICA5LCA5OSwKKyAgICAyMzQsMjI5LDE1MywgNjAsIDQxLCA3OSwgIDQsICAwLCA0OCwxMjMsIDk0LCA1OSwxMDIsIDQ5LDIwMCwyMjcsCisgICAgMjE2LDEwMywgIDAsMTkyLDE2OSwxMTksMjE1LCAzNiwxMzIsIDMyLDE5OSwxODMsMTg3LCAgMCwxMjgsMjExLAorICAgICA4NCwgNTAsMjQyLCA5NywxMTEsIDU2LCAxNywxMjcsIDQ5LCAxNSwgNjAsMjUwLDE3NywxNTksIDc4LCAxNCwKKyAgICAgIDAsICAwLDIxMSwxNjgsIDMxLCAgMSwgIDAsMjAwLDEwMSwgMTksMTczLDIwNywyMjQsIDQ3LCAgMCwxOTIsCisgICAgIDQ5LCA3NSwgMTIsMjU0LCAgMiwgIDAsIDY0LCA5NSwgOTksMjQwLCAyMywxNjMsICAxLCAgNiwgIDAsMTUyLAorICAgICAgMSwxNDQsMTkxLCAgMCwgIDAsMjI3LCAxMywgOTUsMTQ3LDEzOSwgNTUsMjQwLCAyMywgIDAsMjI0LDEyMCwKKyAgICAxNDAsMTE4LDI1MiwgMzAsMTMxLDE5MSwgIDAsICAwLCA3MSwyMDMsIDkxLDI0MywgODEsIDYzLDE2MiwyMzMsCisgICAgICA1LCAgMCwxNTIsIDM3LDIyOCwgODAsIDY1LDE0MSwxMDYsIDQyLDE3MiwyMTcsICAxLCAgMCwxNTIsIDk0LAorICAgIDIxNCwxNDUsMTc5LDE4MSwgNTksICAwLDEyOCwxMjEsMTE5LDIxNSwgIDQsMTA5LDEyOSwyNTQsIDIzLCAgMCwKKyAgICAgOTYsIDU0LDIxMSwyMTMsIDU2LDI1MiwxMzMsMjMyLCAgNSwgIDAsMTUyLCA3NywgMTQsMTQ4LDE5MSwxMjAsCisgICAgMjE1LDIzOSwgMjUsMTcwLCAgMywyMjQsIDIwLCAzNywxNzUsIDI1LDI0OSwxNzIsIDc1LDEwMCwgNDUsICAwLAorICAgIDE5MiwxNTIsMTcwLDE5OSwgNzMsIDI3LCA2OCwxNjIsMTIwLCAgNCwgIDAsMjA0LDEyNSwyNTMsICA4LCA4NSwKKyAgICAgIDEsICAwLDE0MiwgMjQsMjAwLDEyMCwyMjgsIDMxLCAyOSwgNzUsMjU0LDIyNiwyMjEsMjQ3LCAxNSwxMzAsCisgICAgICAzLCAgMCwyMDQsMTA0LDI1NCwgMjYsIDY3LDI0MSwgMTEsICAwLCAgMCwxNzksMjM2LCA0NywgMjQsIDEzLAorICAgICAgMCwgNDgsMTkxLDI1NCwxMzAsMTc1LCAgMCwgIDAsIDM5LCAzNywxMjcsICAxLCAgMCwgNzgsIDQ1LDIxMSwKKyAgICAxNDEsIDUxLCAxOCwgODEsIDExLCAgMCwxMTIsMjM0LDI0MiwgMjMsMjIwLCAgNiwgIDAsIDcyLCA5MywgNDgsCisgICAgIDM3LCAyOSwxNjAsMTI2LCAgNCwgIDAsMjA0LDEwNywxNzcsIDQxLCAxNywxNzUsICAwLCAgMCwgOTksMTgzLAorICAgICAxOSwgNzksIDY4LCAzOSwyMDAsIDk1LCAgMCwxMjgsIDk5LCA3NiwgODEsMTk5LDE1NCwxMzIsMjI0LCA0NywKKyAgICAgIDAsMTkyLDIwNCwgMjEsMTM0LDEzNSwyNDcsIDIzLCA0MiwgNzEsICAwLDE5MiwgOTIsMTI4LDI1MiwgIDUsCisgICAgICAwLDE1MiwyMTUsIDEyLCAzOCwxMDMsIDQ0LCAxNSwgIDIsICAwLDE2MCwgNDUsMjI4LCA0NywgIDAsMTkyLAorICAgIDIwMSwxODIsMjE1LDIzMiwyNTQsIDY2LCAzMCwgIDMsICAwLDIwNCwxNTQsIDI3LDE0NCwxOTEsICAwLCAgMCwKKyAgICAyNDMsMTA2LCA1NywyNDgsIDExLCAgMCwgNDgsMTc1LDE5MiwgOTUsICAwLCAgMCwyNDgsIDExLCAgMCwxMTIsCisgICAgMjI2LCA3NSwxOTIsIDI1LDEwNywxMzIsMjAzLDExMywgNjAsIDM5LCAgMCwxOTIsMTA1LDE3OCwyMTYsMTI0LAorICAgIDI1MSwxMzksIDMzLCA0OSwgIDAsMjI0LDE3NiwxMzEsMjIzLCA5OCwyMjAsMTY2LCA2NCwyNTMsICA4LCAgMCwKKyAgICAxNTIsIDg3LCAxNCwyMzgsIDQ3LDEwMCwgNDUsICAwLDE5MiwgNzYsMjUwLCAxMSwxMTQsICAyLCAgMCwxNDAsCisgICAgMTUyLDEwMCwxMjAsMjM0LDIyMiwxNDQsIDcyLCA4OCwgIDAsMTI4LCA4MywgODMsIDYzLDE2MiwxNzIsICA0LAorICAgIDIyNCwyMTIsIDcwLDE3NCwgMjUsMTc5LDEyOSwgNjAsMTk0LDE3NCwgNjcsIDg5LCAgMCwxMjgsMTA1LCAyNiwKKyAgICAgNzYsIDMwLDExMiwxNjcsIDI0LDIzOCwgIDIsICAwLDIwNCwxMzYsICA2LDIyOCwxOTMsMTE4LCAgOSwyMTgsCisgICAgICAyLCAgMCwxODYsIDU4LDE0NCwgMTAsMjQ4LCAyNCwgMTMsIDM0LCA3MSwxMjIsMTIwLDIyMiwxMTUsMTY3LAorICAgICAzMiwgNTMsICAwLCA5NiwxODAsMTA1LDE1MiwgIDAsMjI3LCA4NywgIDEsICAwLDI0MywgMTAsMjUyLCAgNSwKKyAgICAgIDAsMTUyLCA3MiwgNjAsMTU1LDE1NiwxOTEsMTg0LDI1MiwxMDEsMTk0LCA1OSwgIDUsICAwLCA1NiwgNjUsCisgICAgMTc0LCA1OCwgNjIsIDk5LDIwMCwxNjMsMjM3LCAyNCwgIDAsICAwLCA3NiwgNDUsMTQ3LDIwMSwxNjMsMjM3LAorICAgICAgMywyMTIsICA2LCAgMCwxNTIsIDI2LCAxOCwgNTcsIDExLCAgMCwgNDgsMTYzLDI0OSwyMzQsMTUyLDI0MiwKKyAgICAgMjMsICAwLCAgMCwyMzYsMTY1LDE3NSwxMzcsMTIwLCAxMiwyNTQsICAyLCAgMCwyMDQsMTA3LCAgMCwxNDcsCisgICAgMjI3LDIxNiwgMTcsIDIwLDE1OCwgIDAsMTkyLCA4MSwgODMsMjQwLDEzMCwxMzIsMTQ4LCAgMCwgIDAsMTE1LAorICAgICAxMCwyMzQsIDcxLCAgMCwxOTIsMTg4LDIxNCwxNDUsMTE0LDIyMywgIDcsMTAyLDEwMCwgNTEsICAwLDE5MiwKKyAgICAgMTIsMjE2LDEwNiwxNzIsMjQ5LDEzOSwgOTcsIDUwLCAgMCwxOTIsMTkwLCAyNiwgNTksMTk4LCA2NywxNDYsCisgICAgMjQyLDEwNCwxMjMsICA2LCAgMCwgIDAsIDgzLCA4MywgIDUsMjUwLCA5NSwgIDAsMTI4LDEyMSwxNjgsIDIxLAorICAgICAxNSwyMjUsIDQ3LDIyMiwxMTUsMTE5LCA4MSwgNjUsICAyLCAgMCwxMzMsIDc3LCA4MSwyMzgsMTgzLDE2NywKKyAgICAgNzUsICAwLCAgMCwgMzIsICAwLCA3MywgNjgsIDY1LCA4NCwgIDEsMjQyLDE2MCwxMjYsMTMzLDE3NCwgIDAsCisgICAgICAwLDE3OSwxNTksMTkxLCAxNCwxMDAsIDQyLDEwNCwgMTMsICAwLCA0OCwgOTksMjQ1LCAzNSwgIDAsICAwLAorICAgIDE5MiwgOTUsICAwLCAgMCwxMTIsMjIwLDI1NCwyMjYsMTYxLDIyMywgNTAsMTM4LCA2OCwgIDAsMTkyLCA2MiwKKyAgICAgNzYsMTI0LDE4MiwxMDIsMTIxLDEzMiwgNjEsICAzLCAgMCwxNTYsMTE4LCA2NSwyMzcsMTg5LCAgMiwyMDksCisgICAgMTEzLDEwNywgIDMsMjQ1LCAzNSwgIDAsMjI0LCA3MiwgMTcsMTA3LDE1MCwyMzQsMTk5LCAzNSwgNjEsIDMzLAorICAgIDEzMiwgNTIsICAwLCAzMiwxNzgsIDQxLDI0OSwgMTEsIDM1LCAzOCwgIDAsICAwLDE5OSwgODAsIDg3LDE2MiwKKyAgICAxMjYsICA0LCAgMCwgIDAsMjQ4LCAxMSwgIDAsMTEyLDI1MCwyNTIsMTMzLDEzOCwgMTcsICAwLCA0OCwgNzUsCisgICAgIDY2LDE0NCwxODcsMjM3LCAxMywxMDAsICA1LCAgMCwxNTIsMTc5LDI1MiwgNTMsMTMwLDE4MiwgOTYsIDU0LAorICAgICAgMCwxOTIsIDkyLDIxMywxNDMsMTQ0LCAyMiwgIDAsIDk2LCA4NCwgODksIDc2LDEwNiwgMjEsIDcyLDI0NCwKKyAgICAyMzksICAxLCAgMCwgMzksIDYxLDEyNywgIDEsICAwLCAgMCwyNTIsICA1LCAgMCwgNTYsMTY5LDExNywyMjcsCisgICAgIDI4LDI1MSwgMTEsIDQ1LCA1MCwgIDAsMTkyLCA0OCwgMzcsIDI4LDE1NSwgMjcsIDM2LDI0NCwgIDMsICAwLAorICAgIDE1MiwyMTEsIDg0LCAzOCwxMDMsMTE5LDIxNSwgIDAsICAwLDIyNCwxNjAsMjU0LDE5NCwxMjQsIDE4LCAgMCwKKyAgICAxMjgsMTIxLDI0NSwgMjMsICAwLCAgMCwxOTIsIDk1LCAgMCwgIDAsMTQ0LCAyMSwxMTUsMTk5LCA4MCwyMDYsCisgICAgMTkzLCA5NSwgIDAsMTI4LDIxMSwxNDUsMTkxLDIwOCwgMTUsICAzLCAgMCwyMDQsMTQyLCA0MCwyMjgsMjUyLAorICAgIDIzNywgNTAsICAwLDIyNCwgMjAsMTg0LCAgOSwyNDUsIDM1LCAgMCwgOTYsMTE0LCA4NiwxNTUsMTg4LDIxOCwKKyAgICAyMjgsMjQ4LDExOCwgMzAsICAwLDExMiwxMzgsIDE4LCAyNCwyMDcsMTkyLDE2NywgOTUsMTQyLDI1NSwxMDUsCisgICAgICAxLCAgMCwgODAsIDc3LDE2MiwxMjYsICA0LCAgMCwyMDQsMTI5LDE3OCwyNDgsMTQ0LDE4MywxMzEsMTkxLAorICAgICAgMCwgIDAsIDUxLCAzMywxNzQsMTY5LCAzNiwgNDksMTIxLCA5MiwyMDcsIDEyLCAgMCwxMjgsIDgyLDExNCwKKyAgICAgIDYsMjUzLCAgNSwgODksICAxLCAgMCwxMDIsICAxLCAgOSwgNzEsICAxLCAgMCwgNzgsMTUyLDE5MSwgIDAsCisgICAgICAwLCA5NiwyMTQsMjM1LCA3MiwgNTcsMjUxLDE4NywgIDgsICAwLDEyOCwxNzgsIDE0LDIzNiwxNzUsIDk3LAorICAgICAxMSwyMTgsIDY2LCA5MiwgIDAsICAwLDIxMiwxNDMsICAwLCAgMCwgMzYsIDUwLDI0OCwgMTEsICAwLDExMiwKKyAgICAyNTAsMTA2LCA3MSwyNDgsIDExLCAgMCwgNDgsIDg2LDExNywgNzcsMjE2LDEwMiwyNDAsIDIzLCAgMCwgOTYsCisgICAgIDk0LCA2NywxNTQsIDYwLDE5NCwgNDYsMTYwLDE1MSwgMTUsICAwLDE1MiwxMDIsMTAxLDIzMywgMzEsMTE4LAorICAgICAzOSwgNzQsIDg3LCAxMSwgNjUsMTMwLDEzMiwxOTIsMTExLCAxMiwgIDAsIDQ4LDExOSwyNDUsMTYzLCAzMiwKKyAgICAgMTgsIDY4LDE0NiwgOTYsIDQ4LCAgMCwgNzgsMTc0LCA0NCwyMjgsMjI1LDExNywxMTMsIDc2LCA4OSwgNzYsCisgICAgIDMwLDEwMiwgNzEsMTIwLCA4MCwgOTQsMTk0LCAzOSwgODEsIDM5LDIyNSwgMTEsIDUyLDIxMiwgIDAsIDU2LAorICAgIDEyOSwgNTIsMjUzLDE1NCwyMzEsMjUxLCA5OCwyNTUsIDQyLDEwNywxNjIsMTA5LDE2NSwxNDUsMTE2LDE3OSwKKyAgICAyMzksIDQ0LCAyNSwgNjYsIDgwLCA3NywxMzYsIDIyLDEzNywgNzEsIDkwLDEwOSwyNTIsMTY2LCAgMSwgNTYsCisgICAgMTIxLCA2MCwxMjUsMjM4LDE4OCwyNDQsIDYxLDE1OCwxODYsMTc3LDE0MiwxNjcsMTI2LCAyMCwgNTMsIDE4LAorICAgIDEwOSwgMzMsIDQ3LDE4MywgMjIsMjQxLDE1NSwgIDYsMjI0LDIyOCwyNDEsMTYxLDE4MSwgMTEsMTk2LDE5NiwKKyAgICAxOTgsIDI4LDIyOSwgNzgsMTk4LDExMCwgNTgsMTkxLDEyMiwyNDcsIDk4LDE5MSwxMTQsMTEzLDE4NCwxOTEsCisgICAgMjAwLDE0NywxNzgsIDk3LDIzNywxNzksMjM3LDIyOSwyMTUsMTgyLCA1NSwxODYsIDkwLCAzNywyMTUsMTc1LAorICAgIDE3NSwyMjMsMTk1LCA0NywgMzAsMTI4LDEyMSwyMzEsMjM2LDE5NCwyMjYsMTAzLDE1OCwxODUsMjE0LDEyMSwKKyAgICAxNzYsMTYxLDE0OSwxNTgsMTcwLDE3NSwyNDYsMjQ2LDIxNSwxOTAsMTQzLDIwNywxODcsMjE1LDE0OSwyMDQsCisgICAgMTkwLDE0OCwgNDUsMTgyLCA5NSwgOTAsMTIzLDI0NCwgNjMsMjIwLDE4NywxNDUsIDkyLDI0OSwyMzEsMjIzLAorICAgIDI1MiwgNTEsMjUyLDIzOCwgIDEsMTUyLDExOSwxOTAsMjQxLDIwOSwxNDMsMjM1LCA1NiwxNDIsMjUwLDEyNSwKKyAgICAxNjMsIDIwLCA1MSwgMTksIDUxLDEzNywxNTMsIDI0LDExMSwgNDgsMjMwLDExOCwxODcsMjM5LDI0OSwgNzksCisgICAgMTgwLDE1MSwxMjYsMjQ2LDE5NCwgMzcsMjUyLDIwMiwgIDEsIDU2LCAyNSwyNTIsMjAyLCAzOSwgNjIsMTE3LAorICAgIDIzNywyMDksMTk5LDI1MSwyMTksIDU5LDExMywgMTYsMTc2LDE4MSwxMzUsMTM2LCA4NiwxOTksIDIzLDE5NSwKKyAgICAyNTIsMTYzLDIyMSwxODgsMTgwLCA5OSwyMDQsIDQ0LDE1MiwxNjUsMjMxLDEyNSwxMDAsMjQ1LDE4OCwgOTUsCisgICAgMTc1LDI1NSwyNDksMTU3LCAyNywxNDUsMjA5LDI0OCwyNDUsICAzLCA0OCwxNjcsMTgwLCAyNywxNDEsMjU1LAorICAgIDIyNiwgMzUsIDQ3LDEyNiwyNTAsMjM0LCA1MSwxNTcsICA3LCAyNywyNTMsMjM3LCAyOSwgMjksMTAzLDIyNSwKKyAgICAxMDcsMTAyLDI0MCwxOTksMTIzLDExOSwyMTQsIDkwLCAxOCwgNjYsIDE4LDE5MSwxNzYsMTE4LDIyNSwyMDIsCisgICAgMjAyLDIxNywyMzksMTA5LDIyMCwyNTMsMjI1LDE1NywgOTEsMTIwLCAzMSwgIDAsIDQ4LDExOSwxMjQsMjM0LAorICAgIDIzNCwgNTEsIDYzLDI0MywyMzYsMjQzLDIzMSwgMjIsMTUwLCA1OCwgMTUsIDU0LCA1OCwgMjcsMTU1LDExMywKKyAgICAgMjQsIDg4LDEwNywxMTgsMTUxLDIxNSwxNDQsMjIyLDI0OSwyMDQsMjQ4LDIzNSwgMzIsIDQzLCAzOCwgODksCisgICAgIDk5LDExNiwgNzYsIDY2LDEzNiwgNTEsMTczLDIxNCwyMTUsMTU5LDEyNiwyNTQsMjMxLDE3NCwgOTQsMTIzLAorICAgIDIzNSwyMjUsMTMxLDE1NywgNTYsMjIyLDEzNywxOTQsMTM1LCA5NywxMjgsMTgzLDE5NywxNDUsMjU0LCA2MCwKKyAgICAgNDgsMTk5LDEwOCwyNDMsMTk1LCAzNSwgNjgsMTE2LDE2MSwxODEsMTkyLDEwOCwyMTcsIDUwLCA5NCwxMzUsCisgICAgIDgzLDI0OCwgNTgsMTQwLCAyMywgNjUsMTgwLDIxMCwgOTQsIDg4LDEwNSwxODEsIDg2LCA5MCwyMzcsIDIzLAorICAgICA0NiwgOTMsIDg5LDEwOCwgNTIsMTk1LDExMCwxMTEsMjM1LDIwNiwyMjEsIDk2LDEwMywgMzksIDE0LCAzNSwKKyAgICAxMDcsIDQ0LDExMywxMDYsIDQ3LCA0OSwxNDUsMjE4LDI0MCwyNDgsMjQyLDIxNSwyMjIsMTA5LDEyNSwgOTgsCisgICAgIDk5LCA4NCwgMjQsIDg5LDEwOSwxNDAsIDgyLDE4MSwgODYsMjM1LDE2MywxMDcsMTQzLDIxMiwgMjcsIDc3LAorICAgIDE3NSwyMzAsIDc1LDIwNywgMTksIDgyLCAxMCwxNTYsMTA0LDExNiwgODgsMjUwLCA3MCwyMjMsMTQzLDE5NSwKKyAgICAgODcsMTE5LCA1NCwyNDIsMTA3LDEyNiwyNTMsMTUzLCAyMywgODQsIDI4LDIzMywgNDAsMTk4LDIzNSwxMTIsCisgICAgIDEwLCA5NSwxMzUsIDk5LDI0OSwyMTksIDk2LDE0MCwgNTMsIDcwLDI0NSwxOTQsMTQxLDI1MSwxNTUsIDgxLAorICAgIDE3NSwxNjcsMTk0LCA3MiwgNDMsMTk3LDEwOCwyMDEsMTQyLCA5NCwgNTUsIDc4LDExMCwxNzQsIDgzLDEyNywKKyAgICAyNTUsIDQ0LDEyMCwyNDAsMjIxLCA5NiwgMzQsMTgyLDE1MCwxNDksIDUwLDE5OCwxOTYsIDY1LCAyNCwyMTQsCisgICAgMTA2LCA5NCwyMDUsMjQ3LDEyNCwgNjMsMTQ1LDE1MSwxNDQsMjQwLDIxNSwgMzMsMjMzLDEwNiwxMjUsIDQ3LAorICAgIDIzNCwyMjMsMTIwLDEyMCwgNjMsMTkxLDEwMiwxMDcsMjQxLDE1NiwgMTAsIDM1LCAyMSwxMzMsMTIwLCAyOSwKKyAgICAgNzgsMjI1LDIzNSwgNDgsIDcwLCA4MiwgNTcsIDQ5LCAzOSwyNTQsMjEwLCA3NCwgODksMTczLDE3MywgNTQsCisgICAgMTU2LDExMywyMDgsIDEwLDEwOSwxNTAsMjQzLDIxNSwxMzYsMTc1LCAgOCwxNzksIDQ5LDEwOCwxNzMsIDQ5LAorICAgICA3MCwxMzIsIDY4LCAzNCwgIDksIDk0LDE0NCwyMTUsMjI1LDIzMywxMDQsMTgxLCAyMSwyNDYsMjE0LDE4MywKKyAgICAyMTQsMTM5LCA3OSwyNDIsMTk3LCA0NSwgMjEsMTM0LDExMywgMTYsMjI2LDExNywgNTYsMTMzLDE3NSwxOTUsCisgICAgMTEzLDEyNSwxMTAsMjExLDE3NSwgNzYsIDc2LDIwNCwgNTEsIDkzLDE0NiwgMzEsMjIyLCA5NSwgNjAsMTU0LAorICAgIDEyMCwxNDcsICAzLCAyMiwgNzYsIDM2LCAgNCwgNDksMjI4LCA1MywxNDIsMTA4LDE3NSwxODEsIDQ2LCA5MywKKyAgICAxNjMsMTQxLCA2MSwyMTgsMTY4LDEwNCwxODgsIDE0LCA5NiwxNTIsMTk1LDE0MiwyMjYsMTMzLCAgOSwgMzcsCisgICAgIDUwLDEyNywxNzYsMjQyLCA1OSwxNjYsMTM2LDE0OCwgODgsIDI5LDExMSwxNDEsMTYzLCA3MCwyMTgsIDc0LAorICAgIDE1MiwgNzksMjU1LCA2MiwgNDgsIDk0LDEzNSwgODMsMjQ4LCA1OCwyMDQsMTkyLDExMSwgOTgsMjAyLCAgNSwKKyAgICAgMjEsMTY2LDEzOSwxNTIsMTg3LDI0NywyMDMsMTkyLDI0NywxNDAsMjE1LDEyOSwyNDAsMTk5LDI0MSwxMTYsCisgICAgIDM0LCAxNSwyNDksMTI2LCAgMSwgIDAsMTI4LCA4MSwyNTQsMTc0LDIwNCwgNzYsMjU0LDEzMCwxOTYsICAwLAorICAgICAgMCwxMTUsMTUyLDE5MSwgIDAsICAwLCA5NiwgNzgsMjUzLDE5NywxMzYsMTAwLCAgMCwxMjgsICAzLDEyNCwKKyAgICAyNDQsIDM5LDE2MiwgIDYsMjI4LCA0NywgIDAsMTkyLCA3MywyMDIsIDk1LDE0MCwgOTYsICA1LCAgMCwgNTYsCisgICAgIDU3LDI0NSwgMzUsMTUyLDE1NSwyMTYsMTQyLDIxNSwgIDEsMTU2LCAzMCwxMjQsMTg4LCA1MywgIDAsIDE3LAorICAgIDE3MywgOTIsMTg1LDI0NCwxMzcsMjIzLDI0OCwgODUsIDM0LDEyMiwyMjksMTU5LDI1NSwgMTEsMjEzLCAxNSwKKyAgICAxMzYsMjMyLDEzMywxMTEsMTI0LDI1MywxOTQsMTE1LDIwNywxMTAsMTg5LDEyNywyMzUsICA3LDI1NSwyMzAsCisgICAgIDE1LDE0NiwxMDksMTkwLDI0MiwxNDMsMTI2LCA1NSwyMjMsMjU0LDI1MCwgOTUsMTI2LDIzMSwyNTAsIDQzLAorICAgIDIyMywgMzgsMTYyLDE0MywyNTUsMjUwLDE3NSwxNzQsIDYyLDExMywyMzMsMjE0LDE3MSwxMjcsMjQzLDE0NywKKyAgICAgNjMsMjQ5LDEwMiwyNDIsIDQ1LCAxNywxODUsIDU1LDIwMSwyMzksIDMzLDIxNywyNDIsMTU1LDI1NSwyNDQsCisgICAgMTI3LDE5OSwxNzEsIDEzLDE0MiwyMTMsIDk1LDE3NiwyMTYsMTY5LDE2MywyMjIsMTEwLCA5NSwxMjAsMjU0LAorICAgICAyNiwgMTcsIDkzLDEyMiwyMzMsMTk3LCA2OCwgNzYsIDc5LDEyNSwyNTQsIDUxLCAxMSwyMzEsMjA3LDE4NSwKKyAgICAyMTksIDkyLDEyMCwyNTQsIDkwLDIyMCwyMzUsIDYzLDE4OCwxMTMsMjExLDE4OSwxMTQsMjQ1LDEzNywgNzUsCisgICAgIDIzLDE1OCwxOTEsMTgyLDExNCwyMjksMjQyLDI0NSwgODcsMTkwLDE3MywyNTAsMTkzLDIzNCwgMTksMTUxLAorICAgICA0MiwgNTUsMTY5LDEwOCwxMzcsMTUxLCAyNiwgMjgsMTkxLDE5MSwgMzgsIDU1LCAgMSwgIDYsMTUyLCAzMywKKyAgICAyMjYsIDk0LDI1NSwyNTIsMTE1LDIwNywgOTQsMTI3LDIyOSwyMTksIDQzLCA4NywgNDYsIDQ1LDE1NiwgNjMsCisgICAgMTgzLDI0NSwyNTQsMjA1LDIwMiwgOTEsIDk2LDIzNSwxOTgsMjA1LCA2MywgNDcsICA3LCA0MCwgMzgsMjM0LAorICAgIDIyMSwxMjcsMTc2LDExMiwyNTQsMjIwLDE4MSwxNzUsMTg5LDI1MiwyMTgsIDMxLDI1NCwyMDksIDMwLCA1MSwKKyAgICAxOTcsMjI1LDIyMSwxMzIsIDgyLDEyNywxNDYsMjQ5LDEwNywxOTEsIDI5LDE1MywyNDQsIDgwLCA5MSwxNzYsCisgICAgMTk5LDE3MSwgNjAsMTU4LCAyMywyNTUsMjE0LDE3MSwgNjMsMTg4LDI0NCwxMzcsIDIzLDE5MSwgNzEsMTkxLAorICAgIDEyNywyMzMsMTY1LCAyMywxODMsMjIyLDE5MSwgMjUsMjQ3LDI1MSwxNDksIDU5LCA5NSwxODksMTE0LDI0OSwKKyAgICAxMDMsMjU0LDIwOSwyMzksIDE4LDIwOSwgMTUsMjU0LDI0NSwgMzEsMjI4LCA2NSwxNzIsMjUxLCA5NiwyMjcsCisgICAgMjIyLDE0MywxMjcsMjQyLDE2MSwxNzUsMTI2LDIyOSwyMDUsIDYzLDI0OSwxNzksIDkzLDI0NiwxMzUsMTk5LAorICAgIDE5MCwxNzEsIDYwLDI0MSwxNDMsIDEwLDIwMCwgMTYsIDk5LDI0OSwgODUsMTQxLCAgNSwxMjEsMjI4LDExOSwKKyAgICAgMTQsMjIyLCA0OSwgMzksMTM1LDI1MSwgNjMsMTI2LDE3MSwxOTAsMjA4LCA5NCwxODUsMTE0LDI0OSwyNDEsCisgICAgIDc5LDEyNCwyMzYsMjUwLCA5NSwxMjYsMTIzLDI0NCwgMjcsMjU0LDIzMiwgMTUsMjU1LCA2NywxMjUsMTYxLAorICAgIDEyNSwyMzcsMTA3LCA0NywyMjcsIDUzLCA2MCwyMTMsMTI3LCA5MiwxMjEsMjEwLDEyNywgODEsMTI0LDE4OCwKKyAgICAyMzIsIDMyLDE2NywxMTksMTI3LCA5OSwyMzUsMjUzLDE1NSwgMzEsMjUwLDIxOCwgODcsIDg2LDE1OSwxODQsCisgICAgMjUyLDIyMSwyMjMsMjUxLDI1MywxOTksIDYzLDI0MSwgNDksIDI2LCA4MiwgNjMsMjU0LDE3OSwgMzMsIDU1LAorICAgIDEyNCwyNDAsMjI0LDIyMSwgODcsMTkwLDI0NSwxNjEsMTc1LDEyNiwxNjUsMjQ3LCA5NiwgMzUsIDc1LDEwOSwKKyAgICAgIDAsIDg1LDE5NCwxNzcsMjI3LDE0MywgOTIsIDMwLDEzMCwgODMsMjQxLCA5NCwgODksMTI3LDIyNywgMzksCisgICAgMjE1LDEyNiwyNTQsMjI5LDIzOCwyNTMsICA3LDE0OSwgNjIsMTI1LDE5NCwxOTQsMTg1LDE4MSwgMjMsMTkwLAorICAgIDI0MSwgNzUsMjAxLDEwMiwyMzUsIDYzLDEyNiwxNzksIDE4LDE5MywxNzQsMTI2LDIyNSwxMTUsMjQ1LDEzMywKKyAgICAyNDYsMTg5LCA1NSwxMzgsMjM1LDExMSwxMjUsMjU1LDEzNSwxNTEsIDk0LDEyMiwyNDEsMjI3LDE5MSwyNTQsCisgICAgMTA3LCA2OCwyNDQsMjAwLDI0MywyMTUsMTEwLDEyNSwyNTUsMTM1LCAzOSwyMjQsIDUxLCAgMywxMDIsICA3LAorICAgIDEyNywyMTIsIDU1LCAgMSwyMjcsMjM3LDExNSwgNDIsIDI4LDExOCwyNTEsMjEzLDE5MSwxODUsMjQ2LDI0MywKKyAgICAgNDcsMjIzLDI1NCwyNTQsMjIzLCAxMiwxMDksMTg4LCA0NywxNTgsIDYzLDI0NywxOTQsIDU1LDE5MCwgNzgsCisgICAgIDY4LDE3NSwyMDksIDMxLDE3MywgNTksMTU4LCAzNCwxNjYsMjIyLDI1MywgIDcsMjM5LDE5MCwyNDIsMTczLAorICAgIDE3MSwgOTUsMjQ4LDE1NiwxMjMsMTQ3LDIzOSwyNTQsMjIyLDIzOSwgMTksMjA5LDE4MSwxNTksMTI3LCA1NywKKyAgICAxMTMsMjE3LDExOSwxMjcsMjM5LDI0NywxNDMsMjQ3LDEyNSwxMzAsIDU1LDIyNSwgIDQsIDE2LDEyMywxODgsCisgICAgMjUwLDE0NywxNTgsIDEyLCA3NiwyNTIsMjM3LDIyMywxOTAsMTY2LDE0MSwyNDksMjMwLCA1NSwyNTUsMTcyLAorICAgIDI0MSwyNTMsMjE1LDEwNiwgODIsMjE0LDE2NCwxNzIsMTQ1LDE0NCwgNzYsMTk0LCA5MCwgNTAsMjE0LDEwNCwKKyAgICAxNjUsMTk0LCA0MCwgMTAsMTMwLDE2MCwyMTUsMjM5LDExOSwgNTksIDk3LCAyNCwgMjUsMTgyLDEzNCwgNTcsCisgICAgMjQ5LDIxNSwgMTgsIDkxLDEwMiwgNzgsMTAzLCA5NSwxOTQsMTIzLDIzMSwyMTYsMjMzLCAyNCwxMTcsIDQzLAorICAgIDIzMiwyNTUsMTk3LDIxNCwyMjEsMjUyLDE1NCwyNTUsMjI5LCA5OSwxNTksMTM3LDEzMSwgODAsICA1LCAgMSwKKyAgICAgOTQsMTM1LCA4MywyNDgsIDU4LCA3NiwyMDEsIDk1LCA2NiwgMTYsICA5LCAzNCwgNDEsMTMyLCAzNiwgMzMsCisgICAgMTMzLDI0MCwxMzIsMjQwLDEzMiwyNDAsMTMzLCAxNiwgMzYsMTM2LDIwMCwgMTgsMTA3LDEwMiwxMDksMTczLAorICAgICA5OCwgMjcsIDg5LCAxOSwgMjUsIDE5LCA4OCwgMTksIDI2LCAxOSwgOTAsIDE5LCA5MCwyMTEsMTkxLDExMiwKKyAgICAyNDYsIDY3LCA0NywxMjYsMjA0LDI0NywxMjUsMjIzLDI0NywgNjEsMjA3LDE3NSwyMTMsMTI0LDIyMywyNDcsCisgICAgMTA3LDE4MSwgOTAsMTczLDE1OCwyMTAsMTA0LCA1MiwyMzQsMTQxLCA3MCwxNzksMjA5LCA3MiwgNDYsIDUyLAorICAgIDIzNCwxNDEsIDkwLDE4OSwgOTQsMTc1LDIxNSwxMDYsMTgxLDEyMiwxNzMsMjMwLDE2NywgNTUsMjQwLDEyNCwKKyAgICAyMDcsMjQ3LCA2MCwyMzMsIDczLDI1MiwyNDEsICAyLDI0MywyNDksIDMzLDE5NCwxMDcsMTEyLDE0NiwyNTEsCisgICAgIDI0LCAzNSwxMzAsMjQzLDEzNSwyMzAsIDQzLDE4NSwxMzksIDkwLDEyMSwyNDUsIDM4LCA0MSwyMjksIDQxLAorICAgIDI1MiwgMzYsIDc1LCAxOCwgNTMsIDMzLDI0MSwgNTgsMTI4LDI1MywyNTIsIDUzLDI1NCwxMjksIDU5LDIyNCwKKyAgICAyNDAsMjEyLDE2NSwgNjAsMjI3LDIxNSwyNDMsMTExLDE1NSwxOTAsMjM5LDIxNSwyMzUsMTY3LDExMiwgNzMsCisgICAgMTY3LDE1NCwxNDgsMjAzLDEyNiwyMDUsIDg1LDIxNiwyMzMsMTI0LCAyOSwxNjYsMTU1LDE4MCwyNDgsIDY0LAorICAgICA5MSwgNzksMjA0LCA5NSwyMDgsMjEyLDIzNiwxMjYsMTEwLDEzMywgNjAsIDkxLDExMSwxODgsMTI0LDIyNSwKKyAgICAgODIsMTk1LDI0MywxNTUsMTI2LDIzNywgMjMsMTc0LDE4OSwgNjQsIDY2LCA0OCwyMTksMjExLDI0OSwgNTgsCisgICAgMTI0LDI0MSwyNTIsIDk5LDIwMSwyMzUsMjQwLDE0MSwxNDMsMTg4LCA0MCwgNzgsMjI5LDIzNSwgIDAsIDQ4LAorICAgIDI1NCwxMDcsMTc0LDIzNCwgNzEsIDMzLDEwNiwxNTgsMjU1LDIwOSwxNjUsIDcxLCA2MiwyNDUsMjEyLCA1MSwKKyAgICAxODEsMTAyLDIxMSwgMjYsIDI5LDIzNiwxMTYsMTQwLDIxMCwxMjAsIDI5LDEzMCwxNTcsMTc0LDIwOSwgMjYsCisgICAgMjM5LDE0NCwyMzMsIDM2LDE3NywyNDksMjQyLCAyMywyMDcsMjI2LCAxOSwgNTcsIDUzLDIzOSwgMjQsMTA3LAorICAgICA4NSwgMjQsIDg5LCA5OSwxNjUsMjE1LCA3MywyMTUsIDczLCA2MiwxNDksMTM5LCAzMCwgMTQsMTIxLCAyOSwKKyAgICAgNTIsIDIyLDEyNywgNjAsMTE3LCA4MiwgNjcsMjU0LDE1NCwxNzUsMTgzLCAgNiwgNTEsMTc5LDE3NywyMTQsCisgICAgIDQwLDEzMywyMTUsICAxLDE3NSwxOTUsMjEyLDI1MiwgMzYsMTAyLCA2OSwgOTYsIDU2LDI1NCwgIDgsICAwLAorICAgIDE1MiwgODcsIDE0LDE1MywxOTEsICA2LDIzMSwxNTgsIDY0LCAgMSwgIDksMTkyLDEwNSwgOTYsMTY0LDE2MywKKyAgICAxODgsMTQ3LDIxMCwgIDEsMjQyLCAyMywgIDAsIDk2LDE1NiwxOTcsMjI5LCAzNiwxNDUsMTc5LDE4MCwgNTEsCisgICAgICAwLCAgMCwxMTIsIDYwLDI0OSwgMTEsIDUwLCAgMywgIDAsMjA0LDE0OCwgMTcsIDM2LDEzMiwgIDUsICAwLAorICAgIDE1MiwgODMsMTI0LDIxNiwgMTAsMTI3LCAyNiwyMzEsICAyLDE1NiwgMjgsIDUyLCA4MywyMzksMTc0LCAyNSwKKyAgICAyNDksMTE3LCA5NiwyNTIsMjE1LCA3MywyNDAsIDIwLDE1MSwxMDMsIDQ4LCA3NCwxOTEsIDYxLDExMywyNDIsCisgICAgIDE4LDIxNywxNjcsIDM4LCA1NywgODUsIDU5LDI0OSwgMjIsIDk0LCA1OSwyMDUsIDU0LDEzMSwxOTEsMjMwLAorICAgIDIxNiwgODksMjA0LDE5NiwxOTYsIDc2LDE0OCwgOTIsMjE2LDIwOSwgNzQsIDg5LDIwMywgNjgsMTI5LDIxMywKKyAgICAxOTMsICA5LCAyNiwxNDgsMjIzLDE0NiwgOTQsMjExLDI0MywgIDQsIDgxLCA3NywyMDIsIDM3LDE5MSwgNDYsCisgICAgMTM2LCAgNCwxNDcsIDMyLCAzMywgIDQsIDExLCA3NCwgNDYsMTkyLDEwMSwxNjcsMTkwLDEyNiwgMjgsMTc3LAorICAgICAxOCwgNjUsMTUzLCA1NywgNjksMTA5LDE4NSwyMDYsMTM4LDE3MywyMjEsMTM2LDE5NSwgMjksMTczLCA1NCwKKyAgICAgODUsIDIwLCA5MCwgMTksIDI2LDExNSwxMDIsMjM3LDE3MiwyMjMsMTY4LCAxNywgODEsMTIzLDIzMywgNzYsCisgICAgMTA3LCA5NywxMjksMTUzLDIzMSwxMjcsIDc4LCA3MywxODIsMjE0LDExMCwxMTcsMTIzLCA5NywxOTEsIDc5LAorICAgICA2OCwgNDIsMTQyLDE4NywyNDcsMjM5LCA1NSwgNjEsMTc1LCA0MSwxODksMTQ5LCA5MCwxMjUsMjAxLDE3NSwKKyAgICAxNzMsMjEzLCAyNiwgNTMsMjMzLCA3MywgMzgsMTUzLCA3OCwxNzAsMTUxLDE4NiwgMTIsIDM0LCA1OSwgMzcsCisgICAgMTY1LCAzNiwyNDIsMjE1LDE1NiwxNjQsIDQ1LDEwMiwgNzUsMTAwLDE1MywxODMsMTE3LDEyNCwgNTksMjM2LAorICAgIDEwOSwxNzAsIDU2LDI0MiwxOTYsMTMzLDE5OSwgMzAsIDkxLCA1NywxODMsMjQ2LDE3NywxMzksIDIzLDE1NSwKKyAgICAyMzcsMTE4LDExNSwxNjEsMTczLDE0OCwgODIsIDc0LCA4OSwxMDcsMTczLDE4MSwgNzQsIDQxLDE3MywxODEsCisgICAgMTgxLDExNSwgNjMsIDM3LCAgMywgNTEsIDc1LCA0MSwxMDcsMTgxLDE1NCwyMzEsMTIxLDIwMSwgNTMsIDk3LAorICAgIDE5MSwyMjMsMjM5LDExOCwgMzEsMjIyLDEyNywxMTIsMTIzLDEyMywyMzEsMjQ1LDE0MSwgIDcsIDc3LDE2NiwKKyAgICAgODUsMTkxLDI0MSwxMDQsMTc5LDExNywxOTgsMTc1LCA3NSwgMzMsIDM2LCAxMSwgNDEsIDcyLDE2NiwxNzksCisgICAgMTMyLCAzNCwxNDUsIDc3LDI1NSwxNzMsIDU5LDEyNSwxMjcsIDQ5LDIyNiwyMTUsIDg0LCAgMywxNTEsIDM3LAorICAgIDIzOCwxMDQsMTE3LCAzNSwyMzIsMTc0LDE5OSwgOTcsMTE1LDExNywyMjksMjM0LCAzOSwgOTUsMTI0LDIzOCwKKyAgICAyMjYsMTk3LDEzMywgNTEsMjAzLCA4MSwgMjAsMjQ1LDI1MSwyNTMsIDk0LDE3NSwxMTksMjM5LDIxNCwgNzAsCisgICAgMTc1LDIxNSwgMTEsMTMwLCAzMiwxNDIsIDk5LCA5OSwxNDAsIDQ5LCA3MCwxMDcsMTA5LDE3MiwgOTcsIDU5LAorICAgIDIyMywxOTEsIDQ3LCAzMywxMzIsIDE2LDE5NCwyNDMsIDYwLDIyMywyNDcsMTg5LDE0MCwgNzAsMTYzLDIwOSwKKyAgICAxMDgsIDU0LDE1MSwgNDYsMTU2LCA2MywxMjcsMjI5LDE3OCwyMzksMjUxLDI1MywxNTcsMjA2LDI0NiwxOTgsCisgICAgMTk4LDEwNywxODMsIDYzLDE3NiwgNTksIDkxLDIzMSwyMzQsMTQxLDIwMywxNzMsMTMzLCA2OSwxNzUsMjMwLAorICAgICAzNywgODMsIDI3LCAzNSwxNDIsIDc3LDIxNSwgODMsMTk5LDE5MSwxNTYsIDI2LDI0MiwyMTUsMTcyLDE1NSwKKyAgICAyMzUsMTE4LDIxNiwxOTEsIDI1LDExNiwyMjcsIDg2LDIyNywxODUsMTU5LDI1NCwyNDgsMTk5LDE1OCwxMjAsCisgICAgMTk0LDEwNywyMTIsMTg3LDE1NywyMDYsMTMxLDE3MywxNzMsMTU5LDE4OCwyNTEsMjA2LDI0NiwyNDYsMTE4LAorICAgIDE4MywyMTksMjM3LDI0NywyNTEsMTY5LDE4NSwyMzAsIDk1LCA4OCwyNTEsIDM0LDE2NSwgNzYsIDIwLDIxNCwKKyAgICAyMDIsMTA0LDE4MywyMTksIDExLDEwMywxNTAsMTU5LDE4NSwyNDgsMTM2LCA4MSwyMzQsMjI1LDI1MCwyNTMsCisgICAgMjM5LDIyMywxODgsMjEzLCA1NCwyNTIsMTIwLDE3OSwyNTMsMTA0LDE2MywyMzcsICA5LDIyNSwxNDUsMTQ0LAorICAgICA2OCwxNzYsMjE2LCA3MywxOTcsIDYzLDIwMCwxMDMsIDEwLCA3NiwyMTIsIDkyLDExMSwyNDcsMTE4LDExMCwKKyAgICAxMzQsMTg5LCA1MSwxNDMsIDk0LDI1MiwyMjgsMjA3LDEyNSwxMDUsMjI5LDI1MiwxODUsMTU3LDE1NywxNTcsCisgICAgMjE5LDExOSwyMzksMjIwLDE4NywxMTksMTExLCA5OSwgOTksIDk5LDEyMywxMjMsMTg3LCAzMSwgIDQsIDQyLAorICAgIDE0MiwgNDMsIDQ1LCA0NiwxMTMsMjEwLCA2MywxNjQsMjA0LDE3MiwxODEsMjE0LCA5MCwyNDcsMTIyLCA2MSwKKyAgICAgMTgsIDY2LCAxMCwgODEsMTc1LDIxNSwyMTksMjM3LDI0NiwyMjYsMjEwLDIyNiwyMTAsMjEwLDI0MiwyMjYsCisgICAgMjQyLDIxMCwyMTMsIDc5LDE4OCwgMjQsMTE2LCA1OCwyMzksMjIxLDE4NCwyNDUsMjA2LDIzMCwxODksMTk5LAorICAgIDE1NSwyMzcsMTY3LDIxOCwxMzksMTU4LDE0NCwxNzYsMjE2LDEwOCwxMDAsMTc5LDI0MSwgNTksMTk2LCAzMSwKKyAgICAyNDIsMTIwLDI0OCwgMTMsIDc5LCA4MSwgOTQsMjA0LDEzNCwyNDgsMTMxLDE3NiwxMjcsIDM1LDIzMiwxNTgsCisgICAgMTI1LDI0NiwyMzMsMTU5LDI1NSwyNDQsIDc5LCA3NSwyMjMsMjIzLDIxNiwyMTYsMjQ4LDE5MywgMTUsMTI2LAorICAgIDExMiwyMzEsMjA2LDE1NywyMDUsMjA1LDIwNSwxMjYsMTkxLDE3NSwxODEsMTgyLDE1NiwgMjksMTMyLCAyMCwKKyAgICAxNjcsMjM5LDE0MywxMzksMjQzLDI1NCwxODAsMjA0LCA5NywgMjAsIDY5LCA4MSwyNDQsMjQwLDIyNSwxOTUsCisgICAgIDY4LDEwMCwyMDMsMjAzLDIwMywyMDMsMjAzLDIwMywxNDMsIDk0LDEyMywyMTQsIDQyLDE4OSwxMjYsMjI3LAorICAgIDIzMCwxMzEsMjM3LCAgNywxNDMsIDU1LCAyMiwgMzAsMTA3LDE2NiwgODksMjA0LCA1OSwgMTMsMTQyLDE1OSwKKyAgICAyMDYsIDU5LCA4NywgNzYsIDM3LDIzOCwyNDgsIDcxLDIyMSwxMDksIDQ4LDE5MCwyMTYsMTAxLDE1MywgNTQsCisgICAgIDg1LDI0NCwxMjYsMjA4LDE4MSwyMzEsIDg2LCA2MywyNDksMjEzLCA0NywgNDUsMTczLDE3NCwyMjIsMTg5LAorICAgIDEyMywyNDcsMTk4LDE0MSwgMjcsMTE5LDIzOSwyMjIsMTI1LDI0OCwyNDAsIDk3LCAyNCwxMzQsMTIxLCA2MywKKyAgICAgOTQsMjA4LDI0MCwyNTUsMTU5LDIyMiwgMjMsMTQ0LCA1NywxMzgsMTYyLCA1NiwxNDIsMTE5LCA1OCwxNTcsCisgICAgMjE0LDE5OCwxOTgsMjEwLDIxMCwyMTAsMjEwLDIxMCwyMTAsMjI2LDE5NywgMTEsMTAyLDIyOSwyMDQsMTg3LAorICAgIDI0NywyMTQsIDU1LCA1OCwxNTUsMTUxLDE1NCwgMTEsMTAzLDEwNywgMTMsIDIyLCA2NiwxNDYsMTQ4LCAgOCwKKyAgICAgOTgsIDk5LCAyMywyMTQsMTQ4LDExNCwxNDMsIDE1LCA2NSwyMDUsIDc4LDIzNiwyNTAsMTEzLDExOSwyNTEsCisgICAgMTUwLDEzNywgNjIsMjQ1LDIyOSwgNDcsIDYxLDEyNiwyNDUsMTY5LDI0NSwyNDUsMjQ1LCA4NywgOTUsMTI1LAorICAgIDI0NSwxOTgsMTQxLCAyNywgOTEsIDkxLCA5MSwgNzQsMTY5LDE2NCwgNzgsMTE2LDE2MywgIDMsMTg3LDI1NSwKKyAgICAgNjMsMTA5LDE5MSwgMzksMjI1LDI1MiwgODcsMTk4LCAyNiwxNDcsIDI4LDIwMiwyMTYsMjIyLDIyMiwgOTQsCisgICAgIDkwLCA5MCwgNTgsMTE1LDIzMCwyMDQsMjM0LCAxOSwxNTEsMTMxLDEzNSwyMTksIDYzLDE4NCwxMjMsMjM5LAorICAgIDI0MSwxMjIsMjM1LDIxNywyNDYsMTE0LCA3NywgMTgsMTMwLDIxNiwxMTMsIDM2LDE3NCwxNjksMjI0LDE0MywKKyAgICAyMjksMTUzLDIwNCwgMjYsMTU5LDI1NCwyMzcsMjIzLCA5MiwyNTUsMjQxLCA3OSwxNzQsMTkxLDI0MiwyMzcsCisgICAgMTIxLDEyMCwgMzEsMTY0LDE3NywyMzUsMTg5LDE2MCwyMzUsIDk1LDE4NiwyNDgsMTQxLDE1OSwxMjUsMTg1LAorICAgIDIxOSwyMzUsMTg5LDI0NiwyMTgsMTA3LDIxNSwxNzUsIDk1LDEyNywyNDAsMjI0LCA2NSwgMjQsMTM0LDE1MCwKKyAgICAyMzcsMjA4LDE1MSwxODQsIDIwLDE4OSwyNDAsIDY1LCA0NCwxOTEsIDUyLDE1MCwgNTcsIDEyLCA2NywxNjUsCisgICAgIDg0LDE5MSwyMjMsIDk1LCA5MCwgOTQsIDk0LCA5MiwgODgsIDU2LDEyMywyNDUsMjAxLDI0NSwgNTksMjQ3LAorICAgIDE2MiwyMzgsMjE0LDIyOSwgNTIsMTM2LCA3MywxNDMsIDcyLDEzOCwgOTgsIDc2LDI1NSwgNzYsIDgxLDExMSwKKyAgICAxODMsIDYzLDI1NSwgMTUsMjU1LDI1NCwyMzQsMTQ5LDIwMywyNTUsMjE1LDIyMywyNTUsMjIxLDE4NSwxNzcsCisgICAgMjE1LCA1MiwxNDgsMjMwLCAzMSwyNDEsIDg5LDIwNCwgMzIsMTU5LDI1NCwyMzcsMjIzLDE4OCwyNTAsMTk3LAorICAgIDIwNywgOTMsMjUzLDIyNiwyMzEsMTM2LDEwNCwxNTAsIDIxLDE1MCwyMTMsMTQwLDI1MiwgOTQsMjA4LDEyNSwKKyAgICAgNDMsMjM4LDEyNywyMzQsMjAzLCA5NSwxMjIsMjQ0LDE2OSwgMzksMTExLDIyMSwxOTAsMjUzLDIxNCwgOTEsCisgICAgMTExLDIyMSwxOTAsMTI1LDE4NywyMTUsMjM1LCAyNSwgOTksIDQwLCA1NywgNzUsIDcwLDIzNiwyNDYsMjI2LAorICAgIDE1OSwyMjYsMTIxLCAzNSwxMTksMTQzLCA5NiwgNTcsMTk4LDE1MiwxMjYsMTkxLCAzMSwxOTksMTEzLDIwOCwKKyAgICAyMzksIDQ3LCA0NSwgNDUsMTgxLCA0NiwxNTYsMjM1LDExOCwxODYsMTc1LDExMCwxMDgsIDYyLDIxMSwgOTAsCisgICAgMTg2LDIxMCwgOTAsMTY4LDE0NSwyNDQsIDcyLDIwNCwgOTYsIDQ1LCA4OSwxMTEsMTgzLDE5MSwyNDIsMTkxLAorICAgIDI1NCwyMDcsMTcxLCA3OSwgOTIsMTU4LDIxOSwxMDAsIDU0LCA4NywyNDksMTA3LCAgNiwyMjksIDIxLDI0NywKKyAgICAyNTAsMjQ1LDEzMywyNDYsMTAzLDEyNiwyMzEsMTgzLDEwMiwgODYsIDk3LDE1NiwgMTQsIDczLDIyOSwgNTUsCisgICAgMTg2LDIxOSwyMzUsIDYyLDEyNSwyNDUsIDg3LDEyNiwgODksMjQ4LDI1NCwyMzUsIDYzLDI1MCwyMDksMjE5LAorICAgIDExMSwxOTEsMTg5LDE3NywxNzcsIDE3LDE3MSwxNTIsIDU2LDE3MywxMTEsMTE4LDI0MywxNDgsMTE1LCAxMCwKKyAgICAyMjQsMTI0LDI1NSwxODksIDI1LCAyMiwgNDIsMTQzLDEyMCwgNDcsIDM3LCAzMSwxMDUsMTczLDE4NywyMjEsCisgICAgMTEwLCAyOCwxOTksIDExLDEzOSwxMzksMTczLDEwMiwxNzksMTEzLDEyNiwyMzcsMjM3LCAgNywxNTUsMTYxLAorICAgIDIwOSwyMDcsIDQ2LDE1NiwxNjksIDczLDIzMywgMzksMTE1LDE3NiwyMDQsIDgyLCA0NSwyNDksMjMzLDIyMywKKyAgICAyNDksMjA1LCA4OSwxNTAsMjE1LDE0NCwxNTIsMTk3LDE5NiwgODMsMTIyLDI0OSwgNzgsMTQ4LDE5MSwxMTQsCisgICAgMTIxLDEyNSwyNDMsMTU5LDI1NCwxNzksMTQ5LCA0MywxNTEsIDYyLDI0MywgNTksMTkxLCA1MywxNTUsIDEwLAorICAgIDIwMywgMjcsIDk0LDEyNywyMTUsMjE3LDIzNCwgNDUsMTgyLDEyNiwyNDEsMTUxLDI1NSwxNzEsMTczLDEzNSwKKyAgICAgMTUsMjIzLDI1MiwyMDksMTQzLDIyMiwxMjMsMjM5LDE4OSwgNzgsMTY3LCA4MywgMjUsIDUyLCA2MywyMzIsCisgICAgMTY5LCA2NywgMzksMTc1LDE0NywgODksMTAxLDIzOCwxNzEsIDMwLCAzMywxNDYsMjM4LDE5MCwgNDksIDcwLAorICAgICA0MywyMTMsMTA2LDE4MSwyMzQsMjMxLDIxNSwxMTAsMTExLDEwOCwxNjksMjM4LDE5NSwyMzEsIDIzLDIwNywKKyAgICAxNzYsMjQwLDEyNCwgNzMsIDMwLDIwNywxMzgsMTk0LCA2MiwyNTMsMjE5LDE5MSwxMjEsMjMzLDE2NSwgMjMsCisgICAgMTgzLDIyMiwxOTEsIDczLCA2OCwxMTUsIDE3LDE5MywxNjYsMjUxLCA3MSwgODEsMTQyLCA5OSwxNzUsMTAyLAorICAgIDIyNiwyMzksMTg2LCA0MywxNzUsMTczLDI0NywxMTEsIDk0LDEyNywyMjksMjE5LDIyMywyNDksMTUxLDI1NSwKKyAgICAxMzgsMTM2LCA2MiwyNDMsIDU5LDE5MSwyNDUsMjEyLCAyMywgNjIsIDU5LDE1NSwyNDIsMTA2LCA2MCwxMTcsCisgICAgMjI5LDEwNywxOTEsMjQ2LCA0MywyNDcsMjE0LDIxNSwxMjcsMjQ4LDE5NSwgMzEsMTkwLDI1MywyNDYsMjE5LAorICAgICA1OSwxNTcsMTU3LCA2OCwgOTQsIDM0LCAyOSwxMjEsIDQ2LDEzMiwgMjQsIDgyLDIyMCwxMzYsMjQyLCAgNiwKKyAgICAgNDYsIDM2LCA3OCwyMjYsMTI5LCA1MywxNzcsMjE5LDIxMSwgNzcsMTU4LDI0MywgNDgsMTYzLCAxMywyMTksCisgICAgIDMyLCA0MSwgMzksMTIzLDE4OSwxNTgsIDk3LDI0NiwyMTUsIDg2LDIzOSwgIDksMjQzLCA3MCwxMTksIDU5LAorICAgIDEwMiwxNjMsMTczLCA1MywgNTIsIDE5LDEwMywxMzksIDM4LDIzOSwyMjUsMTczLDI0NywxMTEsMTI2LDI0MywKKyAgICAxMjcsMjUxLDEwMywxMTMsMTkxLCA3OSwyMjQsMjE2LDI0MiwyMTUsMTA4LDIxMywgMzQsIDIxLDEyMSwgMzcsCisgICAgIDg3LCAzOCwxNzcsMTA3LDE2NiwgODIsMTUyLCA0MywxNzUsMjUwLCA4MywxNTEsIDYzLDI0MSwxOTcsMjA3LAorICAgICA5NSwxOTEsMTI2LDI1MywxNDEsIDU1LDIyMiwxODQsMTIzLDI0NywxMTAsIDI4LDE1MSwxMDcsMTk4LDIzNiwKKyAgICAyMTEsIDM2LDEzNiwxNjgsMTE0LDIxNiwxMTMsMjQ3LCAxNSwgOTAsMTA1LDEyNiwxNTMsMjExLDE5NSwgMzAsCisgICAgMjA5LDE2OSwyMjAsIDYyLCA1MiwxOTgsICA0LCA5NywgOTYsMTczLDEwOSwgNTIsMTU1LDIyMCwxMDYsMjIyLAorICAgIDIzMywyNDYsMTg1LDI1MSwyNDAsMTg1LDEzMywgMjEsIDM0LCAzNCwgNDEsMTY3LDE1NSwxOTQsMTQ2LDI0NywKKyAgICAxMTIsMjQ3LDI1NCwgIDMsIDg3LCA5NCwgNDcsMjUyLDI0MiwgNDcsMTczLDE5MSwyNDEsMTY2LDIzNCwgIDcsCisgICAgMjQ5LDE4NywxMjIsMTk4LCA3NSwyMDEsIDU3LDE3MCwgMzEsMTIxLCA3MCwgODQsIDU0LCA4NCwgOTQsIDUxLAorICAgIDE2OCwxNzYsMTcwLDE4OCwxOTAsMjQwLDI0OSwyNDcsMjIyLDEyMywyMzksIDcxLDE3NSwxOTEsMTkwLDEyNiwKKyAgICAyMzksMTU4LCA3OCwyMTQsMTQyLCAyMiwgMzQsMTEzLDE0NywyMzUsMTcyLDIzNCwgIDgsMjUxLCA5NywxMjIsCisgICAgIDU4LCAgMSwgMTksIDc3LDE0MCwxNzksIDk2LDIyMCwxMDEsMTU1LDI0NCwxMTEsMTMxLDIyOSwgNDAsMTM4LAorICAgIDE1MiwxODUsIDk0LDE3NSwxMTUsMTg3LDEyMSwxNjcsIDMxLCA4MCwxMTEsMjUwLCAxMCwyMDMsMjIzLDE5NSwKKyAgICAxMjcsMjQ5LDIwNywyNTUsMTMzLDE1NSwxODgsIDYyLDI1MCwxNDEsMTc1LDIxMSwgNTUsMTkwLDE1OCwgOTIsCisgICAgMTkwLDI0NSwyNTMsIDMxLCA5NCwxMjcsMjI5LDIxOSwxODMsMTkwLDI1NSwxOTUsMTg1LDI0OCwgNDUsMjQxLAorICAgICA3NiwyNDksMTA3LDEwMiwgNjMsIDMxLDEyMywyMDAsMTA3LDE2NiwgMjAsMTUwLCAzMCwxMDksIDc2LDIyOCwKKyAgICAyNDUsMjI4LDIyOSwgNzksMTI0LDIyNSwyNDMsMjM5LDIyMywxODQsMjQxLDI1MCwyMzUsMTc1LDIyMywgOTUsCisgICAgIDk1LDIxNSwyMTcsIDkyLCA5MywxODUsMTU1LCA3NCwyNDksMTA3LDEzMiwyNDAsMTMzLDE0NSwgNzYsMTIzLAorICAgIDE4OCwgIDgsMjEzLDIzNSwxMzMsIDMyLCAzNCwxNjUsIDIwLCAxNywgNTMsIDI2LCAxMywyMjEsMTA4LDIyMCwKKyAgICAyMzgsICA1LDIxMiwxMjMsMjQ4LDI1MiwyMjYsIDEwLCA4OSwgMTgsIDgyLDIwMiwxMzcsIDM5LDIxNiwxNjEsCisgICAgMjM5LDIyNSwgMzEsMjUyLDIzNSwgNjMsIDg4LCA1NiwxODMsMTgyLDI0MiwxOTYsMTAxLCAzNCwxODYsMjQwLAorICAgIDIyMCwxNzksMTcxLCA4NywgNDYsIDk1LDEyMiwyMzMsMTk3LDE2NCwgNTMsMjQ2LDIyMSwyMjMsMjUxLDI1MywKKyAgICAxNTMsMTQwLCA5OSwxMTUsMTQ5LDE5MSwxMjAsICA2LDIzNiwxODIsMTc1LDE4OCwxMDIsIDczLCA5NywxMDgsCisgICAgMTUzLDIyMywyMzIsMTEwLDExOSwgMjMsMTU0LCA2MywyNTEsMTk3LDIwNywyMjMsMTg4LDEyMSwyNDMsMTQxLAorICAgIDIxNSwgOTUsMTkxLDEyNywyNTUsMTkwLDIxNCwxMjIsIDgwLCA5MSwgNjcsIDY5LCA1NCwgNTIsMTI0LDE0MSwKKyAgICAxNDgsMTg4LDIzMCwxMDMsIDM4LCAyNSwyMDYsMTU4LDIxMywyMDksIDgzLDIxNiwyMjQsMjA3LCA3NSwxMjcsCisgICAgICA5LDE1MiwxODEsMjE0LCA2NiwgIDgsMjA3LDI0NywgIDIsIDc5LDIyMCwxMzcsIDY3LDE5MSwxODMsMjQzLAorICAgIDE2MSwxMzMsMTAxLDE5MywxOTQsMTU5LDIzNiwxODQsMTc2LDIyMSwyMjIsMTk1LCA5MSwyMzksMjIzLDIyMCwKKyAgICAxMjIsMjU1LDE2NiwxNTUsMTgyLDE1OCwyNTAsMTk0LDEwMywxNzUsMTI1LDIzNywyMjksMjEzLCAzOSwgNDYsCisgICAgMjU1LDI1MiwgNjMsMjQ5LDE5OSwyMjMsMjQ5LDE1MSwyNTUsMTA2LCA0NiwxMzQsIDU1LCAzMCwgNTUsMjQyLAorICAgIDEyOCwxNjYsMTU0LDE2NywyMjgsIDg1LCA4MSwyMTYsIDIwLDIxOSwyNDksMjAxLCAzMiwyMTMsMjQ3LDEzMCwKKyAgICAyMzgsMTg2LCA3MSwgOTUsMjU0LCA0NywxOTEsMTI2LDI0NywyMzgsMjIxLCA1NSwyMjMsMTI0LDExNSwxMjUsCisgICAgMTI1LCA2MSwyNDksICA4LDIyOSwxNTksIDQzLDE0NSwxODEsMTU4LCA5MywgOTcsMjM3LDIwOSwyMDAsIDM5LAorICAgIDIxOCwxNzEsMTc1LDIzNywgNTQsMTc2LDIxMSwgNjUsIDc4LCA5OCwxNjYsMjAxLDE1OSwyNTIsMTM2LCA3OSwKKyAgICAxMDYsMjM5LCAyMywgOTksMjQwLDIzNCwyMDIsMTgzLDIwNCwxNzIsMTQ4LCA1NCwyMTgsMjEyLDIzNSwyNDUsCisgICAgMTkwLDIzOSwyMjEsMTM4LDI1MCwgNTUsMTMwLDE1OCwxNzgsMjE0LDExMiwgNTgsIDczLDIyOCwxMDAsMjIyLAorICAgICAyNywyMzUsIDYzLDI1NCwgIDksIDE3LDIxMywgMjMsMjE4LCA0MywgODcsIDQ2LDIzNywyNTEsIDMwLDI1NCwKKyAgICAyMjcsMTI3LDI1MiwgNzksMjU0LDIzOCwgMTUsMjU1LCA0MCwxMjEsIDI3LCA5NSwxMjAsMjU0LCA2NywyNDAsCisgICAgMTUxLDI0NywgMTUsMjU0LDE5MywyNTUsIDk2LDE1MywxNzUsIDk1LDE5MSwyMzgsMjIxLCA4OSwyNDcsMTMyLAorICAgIDI0NCwxMzIsMTQ0LCA2NiwgNzIsIDM0LDE0NSwxNDIsIDgwLDE3OCwyMTQsMTA0LDE2MywxODEsIDg2LCA3NCwKKyAgICAxOTcsMTc3LCA0OSwyMTgsMjMwLDExNSwgMzYsIDIwLCAxOSwgMjUsIDc5LDEyOSwgNzksMjUyLDE5OCwxNzUsCisgICAgIDYyLDI1MSwyNDIsMTUxLCAxOCwxMjEsIDQ1LDE1NiwgOTEsIDkxLDEyNiwyMzYsMjI2LDIwNiwxNTcsMTg3LAorICAgIDEyMywxMDgsMTI3LDIzNywxMDcsIDQ3LDExMSwxODgsMTE1LDI1MywxOTMsMjE5LDIzOSwgMzgsIDMzLDE4OCwKKyAgICAyNDcsIDk2LDIyNywyMjUsMTQxLCA5MSwgMTksMjAzLCAyMCwxNTAsMjMzLDI1NSwxMDMsMjM5LCA5MywgOTksCisgICAgIDQ0LDIwMywxNzQsMjUxLDE5MCwxODEsMjE0LCA2MiwyMzEsIDYyLDIzNSwyNTMsMjM0LDExOSwyNDcsIDc2LAorICAgICAxNSwxMDMsMTIyLDE1NCwgMjgsMTQ2LDE5NSwyMjUsMTU1LDE2MywgMzMsMTAxLCA4MiwgNTAsIDczLCA4OCwKKyAgICAgNjgsIDk4LDEzOCwxNjIsIDEzLDEzNiwxNzcsMTAxLCAzMiwxMTgsMTkwLDIxNiwxMjgsIDE5LDEyNSwgNzIsCisgICAgIDMyLCAyNywgNzIsIDYyLDIwMCwxMzAsMTkxLCA0MCwxMTgsMTQ0LCAgMCwgNzAsMTY0LCAgNCwxNDUsICAwLAorICAgICA0MSwxMjgsICA1LDEzNSwgNjYsIDY0LCA1NywxNjIsICAyLCA4MywxMzYsIDY5LCA4MSwgMzYsIDQ1LDI0MSwKKyAgICAgNzcsMTEzLDE2NiwxMDMsIDU2LDIxMSwyMTEsMjExLDIzOSwyMzgsMTcwLDIzNCwxMjIsMjIxLDIxNSwgNTcsCisgICAgMTAzLDE3NSwxNDksIDE1LDI1MSwyMzYsMTE1LDI0NiwgNjIsMjMxLDIyMCwxNzAsMjM0LCA3MSwyNDUsMjIwLAorICAgIDIzNCwgNjIsMTg3LDE3MSwxNzEsMTEwLDIyMSwxODYsIDg1LDExNywyMzUsMjIwLDEyMywxMjYsMjQ3LDI1NSwKKyAgICAyNTUsMjM5LDE4MSwyMTUsMjIyLCA3NCwxNjIsIDExLDE4OSwxNzMsMTQzLDEyNSwyMzgsMTc5LDE2MywgNTYsCisgICAgMTI2LDIyOSwxNDksIDg3LDE3NCwgOTMsMTg3LDE1MCwgMzYsIDczLDEzNCwxNjQsIDM0LDE4MiwxNzAsIDc4LAorICAgIDIxMCwyNTMsMTU4LDIxNiwyMjksIDY1LCA2OCwxMjAsMTA0LCAgNiwgNTYsMjU1LDI0NywxOTYsMjQyLCA0NiwKKyAgICAgNzIsIDQzLCA5NSwyMzcsMTI1LDIzNCwgOTIsIDg0LCA3NCwgIDksIDcyLDEzMCwxNzYsIDE5LDE0MSwgMjIsCisgICAgMTk0LDEwMiwxMzEsMTM2LDE3OCwgMjUsMjIyLDEzMSwxMjcsMTIyLDEwOCwxODgsMTE3LDE2NSwxODMsMTg2LAorICAgICA4NiwxMjYsIDkwLDE5MCwyNDAsMjAzLDE5MSwxMTYsMjU0LDExNSwxNTksMjMzLCA0NiwgNDcsMTczLDE1NiwKKyAgICAgNjMsMjE1LCA5MywgOTAsIDY4LDE5NiwyMjUsMjMwLCAyMiwgIDAsMjIwLDEyMiwyNDksIDg1LDExNSwyNTEsCisgICAgMTQ5LDEwMywxNTksMTIxLDI0MywyMzUsMjIzLDIxMiwxMTMsMjQyLCA1NCwgODgsMTE3LDExNSwyNTIsMjM2LAorICAgICAzMywgMzcsIDY0LCA2NiwgMzYsMTIzLDE5MiwxMDgsIDg0LCAgMiwgNDQsMTYyLCA2OSwgMTgsMjUxLCAyMiwKKyAgICAgMTEsMTA3LDE1MCwxMjAsMTcwLDE3OSwxMjAsMjQ0LCA0MCwyMTcsMTYxLDE0OCwxMjEsMTU5LDE0MywgMzIsCisgICAgICA4LCA4NCwxNDQsIDE0LDI0MywxMzcsMjQzLCA2OSwyNTEsIDEzLDEwMiwgMzIsICA1LDIyNywgNzgsIDU3LAorICAgIDE1NiwxMDgsMjQxLDE4MSwxMTQsMjU0LCA5MiwxNjYsMTg4LCA2MiwyNDMsMjM1LDI1NSwgNjAsMjM0LDI0NSwKKyAgICAxMTksMjA3LCA1MywgOTUsMjQ4LDIxMCwgMjMsMTExLDE5MCwxMjQsMjI1LCA3OSwxMjcsMjI3LDEyNywgNzYsCisgICAgIDk1LDE4NywxNTgsMTI1LDIzMCwyMjUsMjAwLDIzOSwxNzIsIDc4LDI0NSwgOTgsMTI3LDIzMSwgMjksIDMxLAorICAgIDI1NCwgNjQsMjA4LDEwNiwxODksMjQyLDI0MiwyMDMsMjE1LDE3NCwgOTMsIDUxLDI0OSwgNzUsMjM4LCAxOSwKKyAgICAyNTMsMjI5LDE0MSwxNzgsMjU1LDI0MCwxMDcsMjQ3LDExNSwyMzYsIDE2LCAgNiwgOTksIDg5LCA5MywxODksCisgICAgMjM2LDE4NiwgIDksMTM3LDEzNiwyMzYsMTA2LCAxNiwxOTksIDk1LDIzNywxOTEsIDgwLDEzNiwxMzYsMjE0LAorICAgICA1OCwgIDgsMTMwLCA4OCwgMzYsIDgyLDExMiwxMjEsMjA4LDIzNSwxNzAsMTI4LCAgOCwgMTcsICA1LCAzMSwKKyAgICAgODYsMTUwLCA5NSwxNTMsMTExLDIwNCwxNTcsIDU3LDExNywyMjgsMjUyLDE4NSwgMzUsMjMxLDIwNywxMDEsCisgICAgIDU1LCA1MSwgNzksMjQyLCA4NywyNTUsMjIzLCA2MywxODksMjQ4LDI0NSwxMTEsIDI2LDIyMiwgNjEsMjQzLAorICAgIDE1MywgNzksMjUzLDI0OCwyMDMsMTI3LCA1MiwgNDksMjE0LDI1NSwxMDksMTIwLDE3NCwgMjksMjE0LDI1MCwKKyAgICAyMTMsMTc1LDI1NCwyNDMsIDk1LDExOSwgNjMsMTA5LDExNiwgNTksMjMwLDE5NCwgMzksMTI3LDIzNywxOTEsCisgICAgMTEzLCAzMSwyNDIsIDMxLDI1MywyMjUsIDg3LCAxMCwgMTUsMjQwLDE5NywxNzUsMTI3LDI0MywyMjUsICA2LAorICAgICAgNywxOTQsIDMyLDE3NSwyMzYsMTA4LDI0MiwxNzcsMTY1LCA1MSwyMzEsMTU4LDE4NSwxMjAsMjQxLDIyNiwKKyAgICAxNDksIDQzLCA4NywxMzQsMTk1LCA4MSwxMTgsIDMwLDE4NSwyMjgsIDQyLCA5OSwyMDMsIDYxLDEzNSwxNzcsCisgICAgIDU4LCA4NiwyMjIsMjIzLCA3MywxMjMsICA4LCAgNywxNDIsMTY3LDIxNiwxMjYsMjA2LDE0OSwyMjEsMjQzLAorICAgICA0NywyNDcsIDE5LCAxNywgMTcsMTQ1LCA0OCwgMTIsIDk5LDEzNiwxNzUsMTk5LDE2MywxNjAsMTkxLDI1MywKKyAgICAgNzYsMTE5LDEzNCwgIDQsIDE3LCA2NSwxOTMsIDY3LCA3NCwgMTQsMTk5LCA2OSwxODAsIDk1LDI1MSwxNDEsCisgICAgMjIzLDIzNiwgNDYsIDQ1LDExOCwxNTEsIDIzLCA4NywxNTgsMTI1LDIzMCwyMDAsMjQ5LDExNSwxMDIsIDk3LAorICAgIDIyMCwxNDksMjM5LDEyNCwyNTUsMTk5LDEyNywyNDgsIDcxLCAzOSwyMjMsMjU1LDI1MiwxNDcsIDYzLDI0MywKKyAgICAyMDksMTM3LDIyNSwgODcsMTAxLDIyNiwgMzYsIDUzLDE5MSwgMTQsMjQxLCA0OCwyMDYsMTEzLCA1OSwxMzcsCisgICAgMTc1LCAzNiwxNjMsIDc5LDE5MSwyNDQsIDUxLDE4MywxMTAsMjIxLCA1MCwgMjEsMjQ2LCAgMCwgOTgsMjQyLAorICAgIDE1MSwgNzQsMTM4LDI0OSwgMzIsMjE5LDI0MywyNTIsIDQxLDE1NywxNjcsMTQzLDIxNCwxMDAsMTY0LDE2NSwKKyAgICAgODgsMTc3LDEzNiwgNjgsIDQyLCAyMCwgMjUsMjIwLDEzMSwyNTQsIDUwLDE1MSwxNTMsIDU3LCAgOCwgIDIsCisgICAgIDM0LCAyNiwgIDUsMTEyLDEwOSwyMTIsIDYzLDIxMCwxMDQsMjA1LDEzNSwgNzcsIDM0LDE5NCwxMTYsMTI5LAorICAgICAzNiwgNjAsMTI0LDEzMiwxNjUsMjMzLDIxNiwyMDMsMTc1LDIzMCwgNDcsMjEwLDE1NywyNDYsMTQ3LCA0NywKKyAgICAxMjUsMjM2LDE4NSwxOTEsMjUzLCAxMSwxOTgsIDYwLCA3MCwxODksMjU0LDIxMiwyNDIsMjEwLDI1MiwxNTMsCisgICAgIDgzLDEzNSwxMDAsIDQ2LCA4MiwgMzgsMTM1LCA5NSwxNDcsIDk0LDEwOSwyNDQsMTgxLDIyMywyNDgsMjA1LAorICAgIDE0OSwyNDMsMjA3LDE4OCwyNTEsMTExLDEyNywyMzgsMjM3LDEyNiwxOTYsIDgyLDIzMSwyNDgsMjM2LCAxMSwKKyAgICAyMDcsIDE1LCA3MSwxNjMsIDc1LDExMSwxODksMTgxLDE4MiwxODIsMTk4LDIwNCwyMzAsICA0LDE3MiwyMTAsCisgICAgIDk1LDIzMywxNzcsMjQ1LDEwMywyMDIsMjIwLCAgMywxOTAsICA3LDE3MywgNDIsMjE2LDExNywgIDgsMTEzLAorICAgICAzOCwyMDYsMjU1LDIzNiwxNDMsMTQ0LDE4OSwyNDcsMTgwLDE0OCwyMjEsMjU1LDIzMiwxMTMsMjUwLDIwMywKKyAgICAgOTIsMjEyLCA5MCwgNDMsMTY1LCAxOCwxNDUsIDcyLDIwOSwyMTMsIDk3LDEyNywgNDIsICA4LDE0OSwyMjgsCisgICAgIDkxLDE4MCwxOTMsIDY3LCA3MSwgODgsMjEyLCA0MywyMTQsMjIzLCA3MSwyNTMsMTkzLDEzMywgNjMsMjQ5LAorICAgIDIxOCwgMjcsIDk1LDI1NSwxMzksIDIzLDEyNiwyNDksMTM5LDE2NiwgNjEsICAxLCAgMCwxNTYsMTIwLDI1NSwKKyAgICAxMjMsMjIzLDEwMiwxMjYsMTg5LDE3MywgNjksMTcyLDE5MywgMzUsMTk3LDE3MywyMDEsIDU4LCAgOSwgNjksCisgICAgICA0LDE3NCwgMTMsMjUxLDIxOSwyMjEsMjMwLDI0MywyMzEsMTU4LDEyMSwyMzUsMTczLDE4MywxNzgsIDU4LAorICAgICA4NSwgODcsIDgzLDI0OCwgMjAsMjAzLDIxMywyMTQsIDU2LCAgOSwxODIsIDE1LCA0OSwxMTMsIDE1LDIxNiwKKyAgICAxOTQsMTM1LCAxNSwxNjgsMjUzLCA2OCwgOTYsIDYyLDIxMSwgNjUsICAwLDE1NywgIDQsMjA4LCAxOSwgOTcsCisgICAgIDM0LDE3OCwgNzksIDM1LCA5MywxMjUsMTk2LDIwNCwgODEsIDcwLCAzNiwxNjIsIDM2LDEyOCwxNTUsMjA5LAorICAgIDEwNCwxMTgsIDUyLCA1NiwyMTcsMjM0LDE0NCwgMzIsICAxLCAxMCwyMDIsMTk1LCA3MSwgODgsIDIyLDEzNywKKyAgICAgMjAsIDcwLDIyMCwgMzEsMTI0LDI1MSwxODMsMTI3LCAyMywgIDAsIDEyLDE5NCwyMzAsIDc5LDE1OSwxNTQsCisgICAgMjM2LDE3OSwyMjQsIDk2LDE4NSwgMTcsMjIwLDIyMywxMTUsIDc5LDEwNiwxNjIsMTQxLCA1OSwgNzIsIDM0LAorICAgIDE5MiwgMzQsMTExLCAxMywxMTgsMTU4LDEyMywyNDEsMTExLDEwOCwxMDksMTA5LCA5MywxODksMTIyLDExNywKKyAgICAgNDgsIDI0LDE2NCwgODIsICAyLCAgMCwgNjgsMTEyLDIyMywyMDEsMjUzLDIxNiwgMTksMTc4LDIzNCwyMjYsCisgICAgMTU4LDEzMCwxMDgsIDE4LCA3NiwyMjUsMjU0LCAzNiwxNTIsIDIwLCA4OSwgMTUsIDMyLDIxNywgMTgsICA1LAorICAgIDE4OCwxODcsIDM5LDIyMywxMjYsMTg0LDExMSwgOTIsMTAwLDE0NiwgMzYsMTYzLDEyOCwxMTAsMTQwLDI1MCwKKyAgICAgNzEsIDI2LCA0NSwxMzMsMTY0LCA2NCwgMTYsIDMwLDEwNiwxNTksMTc2LCAxMiwgOTcsMTg3LDIyMCwyMzAsCisgICAgMjE5LDE5MSwyNTMsMTg3LDI0MywxMDMsIDc4LDIwNSwxNTksIDU3LCAyMSwxMTgsMjE4LDEzNSwxOTQsIDQ4LAorICAgIDIwMiwxNjQsMjQwLDEwNywgODIsMTM1LCA0MSwxMzUsMTA1LDExNiwxODgsIDg3LDE3MywyMzgsMjI2LDIyNiwKKyAgICAyMTksIDg0LCAzOCwgMzUsICAyLDExMiwxMTcsMjEyLDE2NywxOTcsMjQ5LDIzMywxMzMsMjQ5LDEzOSwgMjMsCisgICAgIDQ3LDE3NCwxNzUsMTc1LDEwNywxNzMsIDc3LDIzNiwxMDEsIDk0LDIzNSwgNDMsMjAxLCA4NSwxMTgsMTQyLAorICAgIDE2NSwgODMsMTk5LDE3MSwxMDAsMjQyLCA0NywxNDAsMTI5LCAyNCwgMjgsMTQyLCAxOCwgODYsMTEzLDIwOCwKKyAgICAgODUsMTY4LDIyNCwyMDUsMTYxLDE1OSwyNDYsMjUyLDE1MSwyNDEsIDU3LCA4OCwyNDUsMTkzLDIyMCwgOTMsCisgICAgMTY0LDE4NiwxNDMsICAyLCAxNywxMDUsMTY1LCA1NCwxNDcsMjQ4LDE5OCwxMDQsMTEyLDE3OCwyMTMsIDg1LAorICAgICAxMCwyMDEsMTM2LDE5MSwxMzUsMTIwLDI1MiwgMTIsMTk0LDIzMCwxMTksMTczLCAgOCwyNTEsMjM4LDIzOSwKKyAgICAyNTUsMTkzLDE2NywxMjYsMjM3LCA4NywxODcsIDc1LDEzOSwgMTksMjI5LCA1NywgMzAsMTc4LDExMywgMTEsCisgICAgMjM4LDIzMCwxMTksIDc2LDIwMiwxMzAsMTk5LDIwMiwyNDEsMTY5LCA5NSwyNTEsMjEzLDI0MiwxNDksIDg5LAorICAgICAzNSwxOTUsMTM1LCA3OSwgNDcsIDM1LDE5MCwyMDYsMTI3LDI0NCwgMTksMjE5LDIxOSwyMTksMTgzLDExMCwKKyAgICAyMjEsIDI2LCA2OSwgODEsIDEwLDE3NSwxMzAsMjU0LDIwMiwxMzMsICA2LCA1OCwyMDcsICAyLDIwNywgNzgsCisgICAgMTQyLDE0NSwgODQsMjMzLCAgNSwyNTUsMTk1LCA0NiwgMTIsMTE1LDE4MCwgMTUsIDc4LCAzNCwxODMsMjA4LAorICAgIDExOSwxNDMsMjMwLDE5MiwgMzIsICA4LCAzMiwgNTgsIDIzLCA1MCwgIDUsIDU0LCA4NiwxMzAsMTQ5LDEzMCwKKyAgICAyNTIsMjIxLDE2NywgMzQsMTM5LCAgNywxNDAsMTM2LCA2OCwgMzYsIDE0LDIxMiwyMDUsMTA0LDExMiwxNjQsCisgICAgMjE3LCAxNCwgIDQsIDg1LCA5MCwyNTEsMjUxLCA4MCwxNDMsMjAyLDE5NywxNzUsMTI3LDI0MywyMjYsMTc0LAorICAgICA1NSwxODQsMjQ1LDI0MiwxNzEsMTExLDI1MiwyMTcsIDk1LDE5NiwxNDMsMTE5LDE1NSwxMzgsMjI0LDE1OCwKKyAgICAxNTgsMTA2LDE0NywgNTMsMTI2LDI0NCwxMzUsIDk1LCA0MSwgOTIsMjExLDE4NywxODksMTE4LCAxMSwgOTQsCisgICAgMjUzLCAxNywxMjQsMTY1LDExMiwyMjksMTk1LCA3NSwxOTAsICAwLDExMCwgNjksICAzLDE4MSwgNTYsIDYzLAorICAgIDE3OSwxODQsMjQwLDIzMCwxNTUsMTExLDExMCwxMTAsMTA5LDEwMSwxMzgsIDMyLDIxMSwgOTUsMTA1LDEwNiwKKyAgICAgIDMsMjM4LCA4MiwxMDksIDQ4LDI0MiwxNjIsMTAwLCA4NiwgNDIsMjA2LCA1NSwyMzksMTk1LCAyNCwxNDgsCisgICAgIDc3LDEwNCwxMTksMjI4LDEwNiwgNTUsIDg5LDExMCwxMzgsMTAzLDE3MCwgMzksIDQ4LDE5MSwgMzIsMTQ2LAorICAgIDE5MSwgIDYsMjM2LDIzMCwgMzAsMTcxLDE4MSwyMTAsIDQ2LDExNSwgMzEsMTMzLDIyNywgNzUsIDY4LDEzNywKKyAgICAxNjIsMjA1LCAzNiwgOTQsMTQxLDEzNCwxOTksMTU0LCAyOSwxNjUsMTMyLCAgMCwgIDUsMTAwLDIxMCwgMTQsCisgICAgMTY3LCAgOSwxOTQsMTA2LDEyNiwgMjksIDIyLCA4MiwgODUsMTQzLDIwMiwgMTgsMTUyLDIyMiwyMzQsMTU0LAorICAgICA1OSwyNDcsMjUyLDExOCwxMzYsMTc1LDIyMiwxNTMsMjQ3LDEyNSwxNjgsMjE1LDIzNSwxNzMsMTc0LDE3NCwKKyAgICAgNzAsMTYzLCA4MSwyMzAsIDI1LDExOSwxMzcsMTg5LDExOCwgNDksMTIxLDEwMSwgODUsMjI5LDEyOCwgNDMsCisgICAgMTg5LCAgOCwxNTIsMjE0LCA1MCwgNDksMTU1LDE3OCwyMTcsIDY3LCAzMSwgNzgsMTAyLDEyNywgOTksIDg2LAorICAgIDE0MywgMTUsIDI1LDE4OCwxNDAsMjUwLCA0MiwxMDUsMTc2LDE3NywgODUsIDIwLCA1NywgNDUsIDYxLCAxMCwKKyAgICAxNDksIDI1LDEwMiwgNDQsMTY0LCA4MiwgNDIsIDg2LDI1MCwxMDIsIDUyLCA4OCwxMDYsMTgwLCAgMiwgNzMsCisgICAgIDgzLDE3NiwxMjIsMTUzLDI1MiwxNjQsMjMzLDE1NiwxODYsMjU0LDIzNSwxOTMsIDYzLDExNCwgIDIsMjA4LAorICAgIDIxMSwyMDEsIDc4LCA2NywgNDUsIDI5LCA1OSwxMjIsMjI5LDIwMiwxNDksMjA1LDIwNSwgNDUsIDk1LCA1NiwKKyAgICAgNjQsIDg2LCA2MCwgODEsMTU3LDIxMiwgIDgsICA4LCA3MiwxMDUsMjQxLCA4MCwxMjIsMjE0LDE4NSwgMTgsCisgICAgIDQzLDI1NSwgMzMsICAwLDE3MiwgNTMsMTA3LDE1NywyMzIsIDY4LDEwNywyMDUsMjA0LDE5NCwgOTgsIDU1LAorICAgIDI1NCwgNTYsMTcyLCA1OSwxMjIsIDM0LCA2NiwxODYsMjQyLDIwMSwgODksIDk1LDE0NiwgNDcsMTMzLDE3OCwKKyAgICAxMjcsMTUyLDIzNiwgNDIsMTkwLCA1MCwxNjcsMTg1LDE5MSwgMzIsIDQ0LCA2MywxODYsIDY4LCAyMCwgIDcsCisgICAgMjM0LDIwNiwgNDgsMjM0LDIzMywxNjQsIDY1LDE5NiwxMzYsMTAwLDE0OCwgOTYsMjUzLCAyMCwgNjMsMTk2LAorICAgIDI1NCwxNzcsIDMwLDI1MSwxNDYsIDk1LDExNCwxMDEsMjE2LCA1OSwyNTQsMjEyLCAxOSwxOTUsMjI1LDExMiwKKyAgICAxMDksMTA5LCA2MSwxMzgsIDcwLCA4OSwxOTMsMTUxLCA5MywyNDUsMTMwLCA0OCwgNjIsMTc2LDIwNywgODgsCisgICAgIDg1LCAyNSwxMjMsMTIxLDEyNiwgMTcsIDgwLCA2NCwgODgsMjM1LCA0MCwxMzgsMTYyLCA0MCwgNjYsMTk2LAorICAgIDE2OSwxMTAsMTE5LDE3MCwyMTksIDEzLDE5NSwgMTYsICA0LCAyNiwyMzcsMTUwLCAgOSwyMTUsIDM2LDE3MSwKKyAgICAgNjUsMjQwLCA0NywgNzYsMTk2LDIzNSwxNzksMTg0LDE2OSwxMjUsMTE4LDEyNywgNjksICAwLDEzMiwgODksCisgICAgIDY4LDIyNiwyMjUsMTM2LDEzMywxNDcsIDM2LCAyNSwgNzAsIDgxLCAyMCwgNjksIDc0LDE2OSwgNDgsIDEyLAorICAgIDE0OSwgODIsMTg0LDE0MywyMjksMTM3LCAzNCwgOTYsMTk0LDE5OCwxNzcsIDQ5LDE1MiwxNjMsMTk3LDIwMiwKKyAgICAxOTQsMjE0LDE4NCwyMDAsMTU1LDE2MywxOTMsMTE2LCAxNiwgIDYsIDM0LCAxMCwxNjUsMjEwLDIzMSwyMTQsCisgICAgIDk5LCA1NSwyMTEsIDk0LDI0MywyMzUsMjA4LDIwOSwxMzksIDY5LDE3NCwxNDEsMjUwLDIzOSwgNjMsMTI1LAorICAgIDEyMiwxMjMsMTIzLDEyMywxMjMsMTIzLDE1NSwgODksMTc4LCAzNCwgIDAsMTgzLCA3OCwxODEsIDk4LDE3MCwKKyAgICAxNzcsMjMyLCAzMSwgNDMsIDUyLCA2NiwyNDYsIDk0LCAgNCwxNTIsMTE3LCAyMCwgNjksMTk1LDIyNSwxNzYsCisgICAgMjEzLDEwNiwxNTcsIDYyLDEyMSwxNzAsMjEzLDIzNywxODQsMTMyLCAxOCwxNDUsICAyLCAyOSwgMzgsIDEwLAorICAgICA5NywgMzAsMjAzLDIyMCwxODcsMjM3LCAzMCwgMTcsIDE3LDIxMywgIDgsMTQ1LCAyNSwxNDksIDgyLCA5NywKKyAgICAyMDAsMjA0LCA1OCwxNDIsIDcxLDE2MywxMzYsIDIwLDEwMSwgMjAsIDI3LDEwNywgMzAsMTA5LDExNiwxODIsCisgICAgIDg3LCAxMCwgODYsIDkzLDE0NCwgOTgsIDIyLCAyMywgMzksMTM4LDIxNCwyMjYsMjA5LCAxOSwyMDQsIDI2LAorICAgIDEzNywgNjksMTY4LDE4MiwxNDQsMTM1LCA4MywxMjcsMjEzLDEwMSwgOTQsMjUxLCA2MCwgNzYsIDM0LCAgMCwKKyAgICAxNTUsIDczLCAyOCwgNzYsIDc5LDE2OSwgNzAsMTg0LDEyMSwyMzUsMjMwLDExMiwgNTYsIDQ0LDE5MywgNzUsCisgICAgMjUyLCA1OCwyMTMsIDc0LDExNCwxNDEsIDIxLCAgOCwyMTcsIDE1LCA3MywxNDYsMTAwLCA1NiwgMjQsIDMyLAorICAgIDIwOSwxNTMsIDgzLDE2NywyMTksMjIxLCAxNCwgIDAsMjA0LDExOSwxNjcsMjA2LCA0NiwxNzMsMTU2LCA5MywKKyAgICAgOTAsMTU4LDExMSwxODIsIDY5LDIzNSwgNTEsMTE1LCAxMSwyMDAsIDQ0LCAgNiwxNjgsMjQ5LDIxMiwyNDYsCisgICAgICA0LCA3OCwgMzQsIDc1LCA4MSwxMzgsIDczLDIwMiwgNDksIDIyLDI1NCwyMzMsMjE4LDEwOSwgIDAsIDkyLAorICAgIDIzNywyMzksIDkyLDE4NCwxMTcsMjI3LDIxMywgOTEsIDU1LDExMCwxMTEsMTA5LDEzNCwxNDEsMTQ0LDE0NywKKyAgICAgMzYsIDI2LDE0MSwxOTQsIDcwLCAzNSwgIDgsICAyLDE1OSwgNDAsIDU3LDE3NiwxMTgsMTQzLDIxOSwxOTksCisgICAgIDg3LDE2NSwxODQsIDIyLCAxOCwxMjksMTA0LCAgNCwxMjIsIDQzLDEzNywxNTUsMTY0LDE3OCwyMDYsIDQzLAorICAgICA4OCwgNzUsMTc2LDEzNywgIDksMTk2LDEwNiwyNTMsMjQ1LDIyNCwgMTcsMTgyLCAyMiwgMTMsMjMxLDE0MywKKyAgICAxNzUsMTk2LDExMywxNzgsMTc5LDE3OSwxNjMsMTE3LDIyNiwxNTIsMTk5LCA2NiwyNDIsMTgxLCAyNywxODUsCisgICAgMTk4LDE1OCwgODgsICAwLCAzNCwgMTgsIDcxLDExMywxMjcsMjA4LDE1OSwxNTcsMTUzLCA1NywxMTQsMjQ0LAorICAgICA0MCwgIDAsIDI4LDE1MywxNTMsMTI1LDIwNywyMDEsMjExLDE1OSwxMjQsMjM0LCA4OSwxNDIsIDM0LCAyOSwKKyAgICAgNjksIDU4LDE0MiwxMzMsMTEzLDEyMCwxMDMsIDY3LDE4MCwgNzgsIDg1LDE1MiwxMDAsMjE5LDExNiwxMzksCisgICAgMTQ3LDE3OCwxNjUsMTkxLDIxNiwgNDUsMTA1LDEyNywyNDgsMTQyLCAzNSwyMjMsIDY0LDE4OCwyMDAsIDQ3LAorICAgICAxNywxMjksMTQ3LCAyNCwgIDIsMTkyLDIwMSwxNjksMjQ5LDI0NywgNzcsIDQ3LDIwMCwyMTEsMjA3LDI1MywKKyAgICAgNjMsMTc1LDE5MSwyNTIsMTU3LDE3MSwxMTEsIDkzLDE4OSwxNzksMjA2LDE0NiwxODIsMTI5LCAxNCwxOTUsCisgICAgMTc2LDIzNiwgMzcsMjQ3LCA3NiwyNDEsIDQzLCA0MSwyMzAsIDMwLDEwNiwxNDcsMjI2LCAxOSwgODEsIDY2LAorICAgIDE4NCwgMzAsMTQzLCAyMiwxOTQsIDM4LDEzOSwgNzIsMTU3LDEyOCwgMjksIDc0LDI1MywgODUsMjAzLDE3NSwKKyAgICAxODcsIDQ4LDE0MywxMTIsIDQzLCAyNiwgNjIsMTIxLDI1MiwgODgsIDIwLDE0MSwxMzQsMTk1LDE2MSwgNjEsCisgICAgMTQ1LCAxMCwyMDEsIDg3LCAyMSwxODUsIDgyLDE0MSwxODAsMTM5LDE5MSwgNDksMjQzLDExMSwgMTgsMTk5LAorICAgIDExMywxOTEsMjIzLCA1OSwxMTQsMjI4LDIwMCwyMDQsMjM2LCA0NCwgIDAsMTg4LDI0NCwyMDQsMjQ5LCA5NSwKKyAgICAgNTYsMjU1LDExMCwgNjEsIDI0LDE0MiwyMzgsMTA4LDIzMiwgNDAsMjEwLCA3MywxOTQsMTM3LCAyMiwyMTQsCisgICAgMTk0LCAzNCwxOTQsMTkyLDIyNiwgNTgsIDcxLDIxNSwxNzksIDc3LDIyNiwyMjUsMjAzLCAgOCwxMDksIDYxLAorICAgIDExMiwxMjIsIDg5LDE5NiwgMjgsMTU0LDE1OSwgOTUsIDU3LDI0OSwyNDMsMTk5LDE1OSwyNDgsMTE5LDE3NSwKKyAgICAyNTQsMjQ4LDEwNywgNjMsMTI1LCA2OSwxMDcsMjA1LDEzNywxOTgsIDQ2LCAgNSwxMjksIDc0LDIxOSwgNjIsCisgICAgMTQzLDExNSwxNDIsIDk5LDE0MywyMzcsIDMwLCA0MSwxNTIsIDgyLCA0MiwgNjUsMjIwLCA3OCwyMjYsICA0LAorICAgIDE1MiwxMzMsIDg4LDEyOCwgMzAsMTkxLDIyMSwgODEsIDM4LCA2NywxMDUsMjEzLDI1MCwyMzUsMjI0LCAzMSwKKyAgICAgNTYsMjI3LCA0NywgNTQsMjI2LDEwNCwxMjIsIDk3LDI1NCwyMTQsMTczLCA5MSwxOTUsMjI1LDEwNCwgNzYsCisgICAgMjQyLCA4NSwgNjksMTc0LDI1MiwgNTIsMjE4LDEwOSwyMDEsIDk0LDE0NiwgMzYsMTMxLDE5MywgOTYsMTAxLAorICAgIDEwMSwxMDEsMTIyLDEwMiwgMzgsIDg0LDIzNCwgNzUsIDMxLDEyMSwyMzMsMjE3LDE4NSwxOTcsMjA5LDE5OCwKKyAgICAxMDIsIDYwLCAyNCwyMzQsIDU2LCAyMiwgNTksMjQ5LDIzMiwyMjksIDk1LDIzOCwyNTEsMTM3LDIyOSwxNTEsCisgICAgMjQ4LDI1NSwgMzcsMjM3LDE0NiwgNDEsIDQ0LDE5NCwgNDQsMTk0LDIzMywgIDUsICAwLCA2OCwyNTIsMjA3LAorICAgICA3OSwgNjIsMTE3LDExOCwxMDYsMjMwLDEyNywyNTEsMjM4LDE4MywxMzQsMTEzLDE5NiwyMTksIDYwLCA2MSwKKyAgICAgNTksMjI3LCA1NCwgNDMsIDQ0LCA4OCwgNjAsIDgzLCA1OCwxMzQsMTIxLDE1MywgODksMTgxLDI1NSwgNDMsCisgICAgMTY3LCA5NiwgNzAsMTI3LDE3NywxNjIsIDk0LCAyOCwxMDcsIDE3LDE1NywyMzQsMjE2LCA5MCwxMzEsIDI5LAorICAgIDE5MCwyNTIsMTcxLCAzMCwyNTEsIDM3LDIxNiwgOTAsIDUyLDE1NCwgOTEsIDk0LCA1MCwxMjMsIDYyLDE5OSwKKyAgICAxMTMsMTQwLCA1NiwgNTQsMjQ5LDE3MCwgMzQsMjE1LCAzMCwyMTQsIDM4LCA3MywxNDYsMjI1LDExMiwgNTYsCisgICAgIDUzLCA1MywgNTMsIDUzLCA1MSwgMTksIDQyLDI0NSwgOTUsMTI3LDIzNCwxNzksMjQzLDE2OCwgIDYsIDI3LAorICAgIDE1NSwyMDEsMTEyLDE5NiwgNzMsIDk4LCAzOCwyMzYsIDY0LDExNCwxMjAsIDIxLCAxNywgNTQsMTI5LDIyOCwKKyAgICAxNzAsIDkyLCAzNiwyMzEsMTM2LCA0NywyNTEsMTAyLDEwMywgNzAsMTUyLCA4OSwgMjQsMTYyLDIzMiwxNTcsCisgICAgMTczLDIzMywyNTUsMjQ2LDEzMSwgMzEsMjU1LDI0NSwxMTEsMjU0LDIzMywgNDAsMTQyLDEzMCwxMjYsMTkxLAorICAgICA1OSwgNTMsMTAxLDE4NywgNjYsMTIzLDI1MCwyMDAsIDc4LCA2NSwyMzgsMTcxLDExMSwxNTQsMTE1LDIwNCwKKyAgICAyNDMsIDIwLCAxMiwgMTcsIDUzLDIyNSwxMDIsIDI4LDE4MSwgNzIsMTEzLDEzOCwgNDcsMTY4LCAgOSwgNTQsCisgICAgIDMzLCAxMCwgNDQsIDU2LCAgNCwyNDcsMjQxLCA4MCwgNjEsMTE0LDIzNSwyNDEsMTA0LDIzMCwyMTYsMTc3LAorICAgICA1NiwxNDIsIDc3LCA1OCwgIDMsIDc4LDIzOSwxNTEsIDkzLCA3NCwgMzcsMjQ2LDE0NSwyMDYsMTYwLCAgOCwKKyAgICAxOTksMTEzLDIwNCwxNTQsMTUxLDE1MCwxNTAsIDY0LDIyOCwxNTEsIDYzLDI1MiwgNTEsMTE1LCA2NCwxOTUsCisgICAgMTczLDIzNywxMDAsIDU2LDE0OCwgNjgsIDc1LCA0MiwgODgsMTkyLCA2NSwgMjQsIDI3LDIzMSwgODUsMTMzLAorICAgIDE3NiwxMzcsMTI0LCAzMiwxOTcsMjI3LDE4NiwxMzUsIDQ4LDEwMiwgOTYsICA2LCA5NywgMTYsICA2LDEwMiwKKyAgICAxMDIsIDIyLDE0NSwgMzcsMTYyLCA5NSwxMjEsMjE1LCAxMSwxOTEsMjUzLDE5NSwxOTEsMjM2LDI0NSwyNTEsCisgICAgMjA1LCA4NiwxNzEsMjA5LDEwNCwgNjQsMTc3LDEzNSwxOTksIDU2LDEyMCwgNTcsIDIwLCA0MywxNzcsMTY4LAorICAgICA5MiwxMzksMTc1LCAgOSwxODMsMTQ2LDEyMCwxODUsMjA5LDE0NiwyNTAsMTM3LDIzOSwxNTMsMjQ0LCA2NywKKyAgICAxNjEsMTkxLDE2NCwxMDIsMjE1LDEyNiwyMTEsIDI3LCAxNywyMTYsIDc0LDIyNiwxOTcsMTY5LCA0MSwgOTEsCisgICAgMTQ0LCA4NSwgNzYsMTkwLDIzNiwgNTIsMTYwLDIzNiwxMTUsIDYxLDE4MSwxMzksMTc2LCAzNiwyMDksMjA5LAorICAgIDEwNCwxODAsMTc4LDE4OCwxOTYsIDM0LCAzMSwxMjYsMjQyLDE2OSwxMDMsMTAzLCAyMywgNzAsMTU1LCA5MSwKKyAgICAyMDEsIDk2LDIwMCwgNzMsMTQ2LCA4NSwgMjcsMjE2LDI0MCwyMDAsMTIwLCA0NiwgMjUsIDI3LDIyMiwgNzksCisgICAgMjA4LDE2MywgODgsIDg1LDEzMywgNDIsMjQ5LCAgMSwgMjEsIDcxLCA3NSwxNjYsMTE1LDE2OSwgNDQsMTkyLAorICAgICA0NCwyMDQsIDczLDE2MiwyMDcsMTE5LDEwMywxMjcsMjMwLDIyOCwgMTksMTI3LDEyNiwyMjksMjA1LDE1NywKKyAgICAxNzMsMTczLDE5NywyMjksMjI5LDE5NCwgMjYsMjEwLDI1MywgNDcsIDkwLCAzMSwgMjMsMjI4LCAyNywgMTEsCisgICAgMTY5LCAgMSwyNTAsIDU4LCA5NywgMTYsIDc4LDE4MywyNDYsMTY4LCAzNSwxNzYsIDczLCAgMSwgODgsMTEyLAorICAgICA3OSwyNDcsMTg3LCAzMCwyMjcsIDE0LDE0MSwgMzYsMTk0LCA0MiwgIDgsMTQ2LCAzNiwyMDEsMTg3LCA3NywKKyAgICAgMzIsMjUwLCA4NiwxNzcsMjM0LDE2NCwyMTgsMjA1LDE0OCwgMzIsIDM0LCA0OCwxMTUsIDE4LDE5OSwxNjQsCisgICAgIDg0LDIxNiwxMDgsIDMwLDE1MywxNTMsMjUzLDI1MiwxMTUsMjM5LDEzOSwxODIsMTIzLDI0MSwgOTYsMjAwLAorICAgIDExMywgOTIsMTY4LDI0OSwyMDIsMTM1LCA5OSwgMzksIDExLDI1MiwxNTQsMTU2LDE0OSwgNjksICA4LCAgMCwKKyAgICAxOTIsIDY5LDEzMiwxODUsIDE5LDE0NSwyMDQsIDk2LCAxOCwgNjEsIDIyLCA3MiwxMDMsIDM2LCA4OCwgODgsCisgICAgIDE4LDE1MCwgNjgsIDg4LDExNSwyNDIsMjE3LCAxOSwgNzksMTkwLDE4NiwxOTAsMTIyLDE3MSwxOTEsIDE5LAorICAgICA2OSwgODEsMTc5LDIxNywxMzAsMTE2LDE4NiwxODMsMTcwLDIwMiwgOTcsMTExLDIzMSwgODcsMTc3LDIwNiwKKyAgICAxNDgsMTM2LCA1MiwgNjYsIDk4LCA2NiwgNjksMTExLDIxOCwxODIsMTI2LDE4MiwxOTEsMjUzLDExNiwxNjgsCisgICAgMjQzLDE3NSwgIDcsMTU0LDEyNiwgIDEsMTA4LDE5NiwyMDksMTg1LDEzMywyNDksMjQ1LDI0NSwxMTcsMjE5LAorICAgIDE3MCwyMDgsMTUwLDIxOCwxNDMsMTc5LDEzOCwxMDUsMTc1LCAgOSwgMjUsMTAzLDEwMywxNzIsMTIxLDE0OCwKKyAgICAgNTYsIDczLDEwMiwxNjYsMTY2LDE1MywyNDksMTg5LCAzOSwgNzgsMjI1LCA0OCwxMzgsMjUxLDEyNSwxNDIsCisgICAgIDk5LCA5NywyMDYsICAzLDE2MywgNzYsICA0LCA1MCwxNTUsMjAxLDE5OSwgODQsIDQ4LCA4OCwgNTksIDg2LAorICAgIDI0NCwxMDQsMTQ3LDExNSwgMTQsIDU2LCAzNCwxNzIsMTg0LDE4OSwgMzcsMTc5LDEzNywxODksMjA0LDE1NSwKKyAgICAxODUsMTA4LDE2NiwgODcsIDUzLDExNSwgMzQsMTQ2LCA0OCwxNTksMTU5LCA5NSwxODYsMjEzLDIyMywyMzMsCisgICAgMTA5LDExMSwxMTksIDU4LCAyOSwxMzEsMjM4LDIyNiwxNjEsIDQ2LCAzMSwyMjgsMjQxLCAzMiwxMTUsIDMxLAorICAgIDE2OCwgODQsMTI3LCAzMywxNjYsMjUwLDIwMywyMTcsMTE4LDE3MSwgMzAsIDgwLCAzMywxNTUsIDMxLCA1NCwKKyAgICAyMTcsMTMxLDEyMywxODksMTc1LDI0NSwxNjgsMTE4LCA2MCwgIDAsMTkyLDIwNCwxNjMsIDgxLDEwMCwyNDYsCisgICAgMTE4LCA0NCwgMzksIDk1LCAgMCwxMjYsMjAxLCA4MywxMzMsIDM0LDE3MSwgNTYsMTkzLDE1MiwxNTMsMTUzLAorICAgIDE5NSwxMDIsMTYzLCAyNSwgIDQsIDQ3LDE1NywxMjEsIDQyLDIyMiwyMzMsMjM1LCA4MSwxOTYsICA2LDE0NSwKKyAgICAgNzgsMTYwLCAzOCwgNDEsMTgxLDIwNCwyMTcsMTEwLDE1MCwgNjQsMTY2LDIyNSwxODMsIDU2LDI0NiwxMTcsCisgICAgIDUwLCAgNywgMjIsIDY3LDE3NiwyNDQsMTA0LDEwMiwxMzQsIDgxLDE1MiwgNTcsMTAxLCA4NiwxODYsIDQ5LAorICAgICA4NywyMDQsIDU4LCAxNywxMjEsIDk3LCA5NywyMjksIDkxLCA1NSwxNzQsIDEyLDE2MywxNjgsMjA5LDEwNCwKKyAgICAgNDgsMTc5LDIxNywyMTksMTY5LCA2NCwxNzQsIDQyLDIxNywxODcsIDI3LDIwMCwyNDIsICA1LDE2NywxNDQsCisgICAgMjM4LDE4OCwyMDEsMjE3LDIwMiwgMzgsMTcyLCA1MywyMTYsMTY0LDE0MCwyMjQsICAwLDIwNiwxMDAsIDE3LAorICAgICAgMSwgNTEsMjIzLDIwNCwgMzQsMjQyLDIxNiwxNjAsIDc5LDEzOSwxNzIsIDcwLDE5NSwyMzgsMjUyLCA5MiwKKyAgICAxNDYsMjMyLCAzNiwxNDIsMTU3LDE0OSwxOTUsMjMyLDE1NywgNzUsMTY2LCAgMSwyMjMsMTkwLCAyNiwxMTMsCisgICAgMTY1LDIyMywgNDUsIDQ0LCA5MCwyMzUsIDY0LCAgNSwyMDQsMjUyLDIxMiwyMTAsMTQ1LDEzNCwxNTAsMjI1LAorICAgIDExMiwxNjQsMjI3LDIxNiwyNDYsMjQzLDE3OSwgMzksMTg3LDEzMSwgNDcsIDczLCA2NywxMTAsMTUwLDEwOCwKKyAgICAyNDIsIDQ2LDE1MSwgNTIsIDE5LCA3OSwgNDYsMTgzLDEzOSwxODIsMTQ1LDE0NywgNTgsMjI5LCA4NywgMzQsCisgICAgMTA4LDE1NiwgOTksMjA0LDE1NiwgODgsMjUzLCAyMSwgIDAsMTU2LDE1NiwxNTQsMTIxLDEyNSwxMTUsIDYxLAorICAgIDEzOCwxNjIsIDg2LDE3MSwxNDksMTk2LDIwMSwxNzQsIDQ3LCAxNSwgOTksMjM5LCA2NiwxMzMsMjQ4LDE4MSwKKyAgICAxNjAsMTM4LCAxNywgODYsMTYzLCAxNywgNTQsIDgwLDEzOSwxMzIsIDY2LDIzNCwgODEsIDE1LDE5MiwgMTIsCisgICAgMTc5LCAgMywgMzYsMTAxLDEyMiwxMjcsIDc2LCA0MiwxNzQsMTMxLDEyMywxMzMsMjEyLDIxNiwxOTMsICAyLAorICAgICAgMywxNTcsMTA4LCAzNywgODEsIDc5LCAzOSwgNDksMjQzLDIyNywxNjMsMjE4LCAyNCwxMDAsIDQzLDEzNywKKyAgICAxMzUsIDI0LDE5OCwxMTMsMTcyLCA4OSwgOTksMTY5LDEzMSwyNTEsMTkwLDIwNywxNjUsMTM4LDE1MSwgIDQsCisgICAgMTAyLCAxNCwxNDksMjEwLCA5MCwxNTksMTU2LDE1NywgNzUsMTM0LCA2NywgMjksIDY5LDE0NiwyMzIsMTMwLAorICAgIDIxMSwgMTgsIDQ4LDE4OCwxNzgsMjQwLCA5OCwxMDIsMjMwLDEwOCwyNTMsIDU0LCA2NCwxMTMsIDQ3LDE0NCwKKyAgICAyMDEsMTI5LDE1MSwxNDAsIDMzLCA5MCwyMDYsIDQ3LDEwMiwxMDIsMjA5LCA0MSwxOTEsIDU2LDIyNywgODcsCisgICAgMTU2LDEyNiwgNDIsIDc1LDE3MywyNDYsMjM1LDE1NSwgNDgsMjM2LDI0NywxNjcsMTY3LDE2NywyMDUsMjA0LAorICAgIDIzOSwxMjUsMjQ0LDEwNSwyNDQsIDk0LDExNiwyMDQsMTMxLCA1NCwgOTgsMTg5LCAyNiwgMTMsIDM1LDIxNCwKKyAgICAgIDEsIDgxLDEyOCwgNzIsMjQwLDIwMCwyNDMsIDExLCA2NiwxNjIsMTc0LCAxMCwxMDMsMTMwLDE3NiwxNjUsCisgICAgMTQ4LDE1NCwgODQsMTMyLCAgNSwgMTUsMjIwLCA0NywxOTgsMTcyLCA4NywxNjMsMjI1LDIxMywgODEsMTI3LAorICAgICA1MywgMjYsMTk4LCAzNCwxNDMsMTQzLDIwNCwgMjIsMTI4LDEzMiwgNTcsIDEyLDE2NywyMDUsIDIyLDI0NCwKKyAgICAyMTMsMTAzLDE5NSwxODksMjU1LDExNiwgMzMsMTY1LDE4MCwyMTQsIDc5LDIwNiwgNDcsMTU0LCAyMSwgNjYsCisgICAgMTcyLCA1MywyMTgsMTc5LDIyMywgMTMsMjM5LDE0MSwyMzYsIDk4LCAzNSwgODgsMjIwLDI0OSwxODcsIDk4LAorICAgIDIyNCwgNTIsMTEzLCAxMCwgMTIsIDYxLDI0MywxMDIsIDY3LCA2MSwgMjIsIDk2LDIxNCwxOTQsICA5LDEzOSwKKyAgICAxNTAsIDkyLDEyNywgMzcsMjA0LDE3NywxMzEsMTc5LDE0OSwgODYsIDI3LCAgMCwxMjIsMTg5LDI1NCwxNTMsCisgICAgIDc4LDE5OSwgNzYsMjU0LCA2MiwgNTYsIDMzLCAgMiwxMzQsIDk1LDIxNSwgNzEsMTMxLDIxMywxMjAsIDY4LAorICAgIDE1MywxNTksMTI0LDIxMiwgIDcsIDMzLDIwNiwgIDQsMjI1LCA1OSwxODcsMTE1LCAxMCwxNDUsMTk4LCA0MSwKKyAgICAyMDYsMTgzLDIxOSwgNzIsICA3LDI0NywxMjMsMTQzLCA3NCwgMzksIDY2LCAzNCwyMTAsMjExLDIwMSwgMjcsCisgICAgMTMxLDE1NywxOTAsIDc4LDIyNCwgNDksIDI3LCAgMiwgNTAsMTExLDIxMSwxNzQsIDYxLCA1OCwgMjEsMjAwLAorICAgIDEyNiwyMDYsMTA0LCA1NSwxMzksIDY1LDEwMiwgMjIsMTczLCAzNywgNzMsIDUyLCAxOSwxOTksMTM3LDEwNCwKKyAgICAyMzcsMjI0LDIwMCwgNTIsMTU2LCA3MywxNjUsMTUxLDEzNiwgODgsMTI2LDE3NywyMjgsMTA3LDExMywgOTYsCisgICAgIDY2LCA1OSwxMjgsIDk5LDIyOSwxOTcsIDkyLDEyNywgODksMTE0LCA4OSwyNTMsIDM3LDE0NiwxMDAsMjI4LAorICAgIDIwMiwxNzQsMjA5LDEwOCwgOTQsIDQyLDIxOCwyMzcsMTE4LDE3NSwyMTUsIDQzLCA2OCwgOTYsMjUxLDE5MSwKKyAgICAgIDMsMjI3LCA3MCwgMzQsIDUwLDIxMCwgIDksMjQyLDIyNywxNDksMTIyLDIyMSwxMzgsMTM0LCA5MSwgNzMsCisgICAgMjUyLDE1OSwxNzMsMTU2LCAzOCwxNjIsMjAxLDIyMCwxNzEsIDM5LDE4NCwxMTEsMjA5LCA4NSwyMjAsMTA3LAorICAgIDE1MSwgMTYsIDU5LCA0MiwxMjAsIDEyLDIyNSwyMjksMTU4LCAxMSwxMDUsMTA0LDE3NiwyMDMsMjQxLDE5NiwKKyAgICAxODcsMjUxLDE2MSwxMzYsMjAwLDEzNywgMjIsIDE3LDE1NywgMzYsIDc2LDE5NiwgNzMsIDM0LCA3MCwxMjcsCisgICAgMTAxLDIyNCwxMTYsMjM1LCAzOCwxNzIsMjI1LCAxOCwyMjUsMTcyLDE1MSwxMzEsIDc2LCA5OCwyNDEsMjE1LAorICAgIDIzOCwgNzksIDM4LCA4MywgNTMsIDMzLDEzNywxMTIsIDM0LDE3MiwxNzMsMjM2LDE3OCwyMzksIDgzLDEzOCwKKyAgICAxMDUsMjQzLCAzNywxMDIsMTE1LDE1NiwxMzAsIDMyLCA4MCwxNjQsMTE4LDEzMywyMjYsMjIxLCA2NSwgMjEsCisgICAgICAxLCAzMSwyMzEsMTM0LCAxOSwxODMsMTYyLDIyNSwyMTIsMjIwLDEwOCwgNTIsIDI0LCAzOCwyMDksMjMyLAorICAgIDIzOCwgMTQsMTY4LCA2MCwgNTYsIDc5LDI0NywxOTIsMjQzLCAxMCwxMjEsIDMxLDEwNCwgIDAsICAwLCAzMiwKKyAgICAgIDAsIDczLCA2OCwgNjUsIDg0LDE3NSwgOTMsMjM4LCA4OSwxMzEsMTA0LDE4NSwyMDksIDkwLCAgOCwxNTUsCisgICAgMjM1LDI0MSwyMzIsIDQ5LCA2OSwxNTIsIDI1LDEwMCwxNzAsIDg3LDIwMywxNDMsMTU2LDIyMCwyMTMsIDczLAorICAgIDEzMiwgIDAsMTMwLCA2OCwxMzYsIDE3LDEwNywxMDIsMjI0LCA2OCwgNTEsIDM3LDE1MCwgOTUsIDU0LDI0OCwKKyAgICAyNDYsMjQ5LCAzNywgMjUsMTkwLDE5NiwyNDYsIDk2LDE1NywyMzIsIDI0LDIxMCwxODcsMTE5LDE0NiwgIDksCisgICAgIDQ3LCAgMCwgMjIsIDUxLDIwNywyMzIsIDczLCA0NSwgMzksICA1LCAxOSwgIDMsIDQ3LDIyNywgNDMsMjA1LAorICAgICAgMSwgMTEsMTMwLCAgMCwgNDEsMTA3LCA3MSwgMzMsMTE5LDEzOSwgNDQsIDQ0LCAgMSwyMzYsMjI1LDEwOSwKKyAgICAxOTIsIDYxLDE0NSwyMjcsMTM3LDE4NSwxMzMsMTAyLDE4MywgMjcsIDcxLDIwOSwgNjEsIDU1LCA0MSwgNTcsCisgICAgMjA4LDE2NywgOTQsIDgwLDI1NCwgNzcsMTE0LDEyNywyNDcsIDM4LCA2NCwxNTQsMTEwLDE2OCwgNDcsMTU2LAorICAgIDEyMSwyMzAsMTc1LCAgNywgOTEsMTcwLDIxNiwxNTgsMjMzLCA4MSwgMzAsIDQ0LDE3OCwgNTcsIDI4LDIyMCwKKyAgICAgIDEsIDM4LDE2NCwxODgsMTYzLDEzOSwgNjEsMTQzLDE1NiwgNzAsIDQ5LDEyMCwxODMsMTAzLCAyMCwgNDEsCisgICAgIDgyLCA2NSwxOTIsMTMxLDEyOSwgMjIsIDk3LDE3MywgODksMTM2LCAxOSwxMDksMjUyLCAzNSwgNTgsMjIxLAorICAgIDE3OCwxNzgsMTg1LCA3MSwxNTcsMTkwLCAyOSwxNDIsIDU0LDI0OCwxMjEsMTEzLDE3MywgODMsIDg2LCA5OCwKKyAgICAgNTgsMTUwLDE1MywgNjMsMTk2LDIxMSwgOTIsMTgyLDIzNiwyMDMsMTg4LDEwMywyMjUsMjM2LCA1NCwyMzAsCisgICAgMTQ5LDE2MywyMTcsMTA4LCAxOCwgMTcsMTg1LDEyNSwgODcsMjM5LDE1MCwgOTUsIDg4LDI0MSwxMDYsIDUyLAorICAgIDIxMywxMDQsIDMwLDIzMywgNzYsMjA1LDE4MCwgOTAsIDEzLCAyMSwgIDQsIDY4LDI0NCwgNTYsIDYwLDE3MSwKKyAgICAgMTcsIDE3LDI0MSwxOTUsIDM5LDIwNiwxMTIsMTI3LCA5NiwxNTgsMTA4LDExMSwgNTEsMTcxLDIzOCwgODYsCisgICAgMTI3LDIwMSwxMjUsMjUyLDIyOSwgMTMsMTYyLDE0MywgNDQsIDI5LCAxMSwxNTUsIDc3LDExNiwgMjcsMTU1LAorICAgICA2MCwyMDIsMjAxLCAyMywxMDQsMjE0LCA4NywxODIsMTgzLDE5MCwxODMsMTg5LDEwMiwxODYsMjE1LCAzNSwKKyAgICAgODIsMTI2LCAgOCwyNDEsMjIyLDE0MiwxMDIsMTIyLDE1MCwgMTYsIDgyLCAxNiwgIDQsICAwLDE0NCwgMzYsCisgICAgMjAxLDE5NywxODEsMjE5LDE2NywgMjIsMTQzLCA0OSwxMDcsIDczLDE0NiwgNjAsMjQ5LDE3OCwyMTMsIDczLAorICAgICAxMiwxNjIsIDM3LCA2OSwgMjQsMjMxLCAxMSwgMzIsMTM5LDE0MywgNDEsMTkwLDIwNSwyMDcsMTg2LDIzNCwKKyAgICAgOTUsIDQ3LCA5NiwyMTUsMTA3LDIxOCwxMDYsMTQ0LDIxMiwgNjAsIDkwLDIzMSwyMzIsMTY0LCA5NiwxNjIsCisgICAgMTMzLDE3OSwxOTEsIDgxLCA2NCwgNTQsMTYyLCAxNywgIDAsIDQ0LCA0NiwgNDYsIDQxLCA4MiwgMzIsMjQ3LAorICAgIDIxNCwgMzgsMTgxLDE2MiwgMjgsMjA0LDIzNiwgMjYsICAyLCAgMCwyMjEsIDQ4LDEyNCwxMDYsMTE4LDI1NCwKKyAgICAxOTYsMjQ0LDEwOCwgMzksMTA4LDE4MCwxNDgsIDgyLDE2NCwgMzAsMTI1LDEyOCwgMzMsMTI4LCA3MiwxODgsCisgICAgMjExLCAyNywyNDUsMjUxLCA1OCwxNTMsMjA4LCA1NiwgNDAsIDQwLCA2MSwxNDksMjQwLCA2MiwxNTksMjA3LAorICAgICAgMiwgIDIsMTU0LDE0NywyMDksMTM2LDIyNywxMDAsMTY4LDEyMiwxNDMsMTM3LDI1NCwgMTgsICAwLDIwNSwKKyAgICAgNTAsIDI0LDI0NiwxNzgsMTQ5LCA2NywgNjgsMjMyLDE0OCwxMDMsMjIxLCAzNSwxOTYsMjM2LDIwNiwyMDcsCisgICAgIDI0LCAgNCwgIDEsIDQxLDE2NSwxMzUsMTk1LDIxNSwgODcsMTExLDE4OSwxODAsMTIwLCA3NiwgNTEsMTA3LAorICAgIDE3MywxMDksMTM5LDE1MywyNDQsMTg5LCA4OSwxNjAsMTAzLDI0NSwgMjMsMTc5LCAgNSwxMjksIDgzLDEyMCwKKyAgICAgNTQsMjI1LDE3NywgODcsIDkwLDE3MiwxMDIsMTQ0LDE0OCwxMzMsIDk1LCA1OCwxMTUsMTM5LDEwNSwyMjQsCisgICAgMTAxLDIxMywxNjUsMjQzLCA3MSwxMDksIDY4LCA2NywgIDAsIDU2LDEyMiwyMzYsMTA0LDE1NiwxOTYsMTM3LAorICAgICA3OCwyMzgsMTU3LCA5NSwgODUsMTcxLCAzMiwgNjksIDY4LCAzOSwxMjIsMTg0LDIxMSwyMzUsMTA3LCAxNiwKKyAgICAgMjEsMTk2LDE2NCwyMTIsIDk5LCAzMywxOTIsMTkyLCA3NiwgIDQsMTc3LDIxNCwyNDcsIDE3LCA2NCwyMDAsCisgICAgMTk1LDIyOCwgODcsMjQ1LDIzOSwxNTEsMTg3LCA3MSwxNTIsMTM3LCA5NiwyMjQsMTEzLCAxMCwyNDEsMTgxLAorICAgICA3MiwxNTUsMTAxLDE3NiwxODksMTA5LDIxNCwgNjAsMTAyLDIxOSwxMjUsMjI5LDIzNSwgOTgsMjI4LDE3NCwKKyAgICAgMzMsMTUwLDEwOSwyMjksIDE3LDE2OCwxNjAsMjEzLDExMCwxMTEsMTA5LDExMSwxOTEsMTI0LDIyNywgOTAsCisgICAgMjUyLDIzNiwxMjMsIDE4LDEyOCwgODgsMjQyLDEzMCwxMTIsMjQ3LDEzMiwgNTUsIDIwLDIxMSwgODYsMTUyLAorICAgIDEzNiwyMTUsMTExLDExNywxMzAsMjI1LCAzNywxNTgsMjU0LDIwMiwyNTQsIDE2LDE2NywxMDgsIDM0LCAzOSwKKyAgICAxNTEsMTU5LDE1MywxMzcsICAwLDE3MiwxNDEsICA2LCAgMCwxMTIsMjUwLDIwNCwxNTMsMTgxLDE4MSwgNTMsCisgICAgMTc5LDI0MiwyMjUsMjM4LDIxMywxOTgsMTUyLDEyNSwyMTMsICAwLDE1MiwxNTMsIDUyLCA1NSwgODksMTQ2LAorICAgICA4MSwgMjAsIDQzLDE0MSwgNjgsMjUyLDEyMCwgNDcsMjI0LDE1OCwxNTYsMjI5LCAgNywyNDUsMjUwLDE5OSwKKyAgICAgIDcsIDU3LCA2NiwgMzYsIDc4LCA5MSwyMTcsMTAwLDIzNywyMzQsMTYxLDE2MCwxOTQsMjQ2LDEyMCwxNDksCisgICAgMTk0LDIzNCwxNDcsIDc0LCAgNSwxNzAsMjExLDIzMywgNTIsMTMwLDExMiwxMTcsMTAzLDI1MSwgMjcsIDg3LAorICAgICA0NywxODksMTE5LDEwNiwgNjIsIDc4LCA1MSwxMjIsMTIzLDE4MiwxMzksIDQ4LCAgMCwgOTEsIDc1LDEwMSwKKyAgICAyMDYsMTI3LCA1NSwyNTIsIDQyLCA3NiwgMzYsMjAwLCAgNCwxODIsIDQ3LDExNiwyNDQsIDg3LDE2NiwgMzcsCisgICAgMTc5LDE1MywgNzEsIDg3LDExNSwgMjEsIDE0LDIxOSwgOTEsMTg5LDIzNywxMjYsMTQ2LCA0NCwyMDYsIDQ3LAorICAgIDExNiwgNTgsMjIxLCA0MywgODcsMTc0LDIyOCwxMDcsMjMwLDI0NywxMTksMTQ0LDIwMywyMjYsIDQzLDEyMywKKyAgICAyMTcsMTI4LDE4MCwxNTgsIDc4LCA3NiwgNDksIDU4LDIxNCwxNzMsMjM5LCAzOSwgMzQsMjQ1LDE3MCwyNDksCisgICAgMTE3LCA0OCwxMTMsICAxLCAgMiwxMTYsMTMxLCA5NiwxODQsMjExLCAzNSwgMzQsIDY5LDIwMiwgODQsMTQyLAorICAgIDIzMCwgOTEsMTcyLCAzNCwgOTYsMTY1LCAxMCwgMTgsMTQ0LDE4MCwyMTQsMTYyLDEwMCwgOTcsMjQyLDEwOSwKKyAgICAgMzEsIDQxLCAxMiwgMjcsMjExLCA1MSwyMTEsMTA3LDIzNSwyMzUsMTI3LDI1NCwyMTQsMTk3LDExOSwxOTEsCisgICAgMTAzLCA0MSwgNjUsMjEyLDIwNiwgMzYsMTYzLCA0MywxOTAsIDI4LDEyNiwgNTcsMjUxLDExOCwgNzIsIDg1LAorICAgIDIyNiwgNTIsIDczLCAzOSwgNjQsIDMzLDI0OSwyMDIsMTQwLDExMiwgODIsIDY5LCA0NiwxMTIsMTMwLDI1NSwKKyAgICAxODMsMTIyLDIxOSwgIDAsMjQwLDIyMiwyMzEsMjIzLDIxOSwyMzksMjQ3LDEzNCwxMzEsMTYxLCA1MSwyNDksCisgICAgMTM2LDIyMiwgNzcsIDgxLDExOCwgODksIDMzLDE0MywgMzcsMTIwLCAzMywxNjYsMTQ5LDI1NSwxOTYsMjEwLAorICAgIDE2NCwgMjgsIDk0LCA1MywxOTQsIDM4LDEzNSwxMTEsIDUzLDE5MSwgMzAsIDQwLDE5MywgMTYsIDkxLDE2NCwKKyAgICAxNjIsMjI1LDE3NiwgNTcsIDYxLCAyMSwxMzIsIDY1LDE0NiwgMzYsIDQwLDIzMywxOTAsMjQzLDIyNiwxODksCisgICAgMjUwLCA3NSwgNzMsMTM5LCA3NSwgOTQsIDU4LDIzMCwxNTcsIDM0LCA4OSwgMzUsIDgwLCAgOCwxOTUsIDk2LAorICAgICA5NywxMTMsMTEzLDEwNywxMDcsMjM1LDIyNiwyMTgsMjM3LCA2MywxODUsMjQ0LDIxMSwxNTEsMTUwLDE0MiwKKyAgICAxOTksMTQ0LDEwNiwxNzYsICAyLDE4MiwyMzYsMTAxLDE2NywyMzksMTMyLCA4NCwxNjQsMjQ4LDE0NywgMjAsCisgICAgMTc5LDEwMCwgNzMsMTMzLDE4NCwxMzgsMjEwLCA1MywxNDAsMTMzLDE2NiwgOTEsIDI1LDE4OCwgOTQsMjIyLAorICAgIDE4OCwxNzksIDU0LCAyNiwxODAsIDkxLDE3MywxMTksMTkwLDIzNSwgOTMsIDIzLCA0NiwxODgsMTA2LDI0NiwKKyAgICAxOTMsIDI4LDI0MywgMjYsIDgxLDEyMSwxMzIsIDExLDIzMCwyMDksMjE5LCAzMiwgMjQsMTI4LCA4OSwgNTEsCisgICAgICAxLDEzMiwgNjgsICA0LDEwNCwyMjcsMjUyLDE1NCwgOTYsMjQ3LDE5NiwgNDUsMTIxLCAyNywyNDksIDg1LAorICAgIDExOSwxNTksMjE2LDE1OSwyNTQsMTU0LCA4NiwyMjUsIDg2LDE3NSwyMTUsMTUzLDE1NSwgMTMsMTk1LDE0NCwKKyAgICAyMTEsIDE0LCA5MiwgIDYsIDk1LDE1MiwgNDYsIDM5LCA0NiwgNzMsIDQ4LCA0MSwgNzksMjE3LDIzMSwgMzksCisgICAgIDg4LDEyNiwgNTgsMTUzLDIzNywgMTQsMTQzLCAzMCwgNTksMTE4LDI0OSwyNDIsMjI5LDE3NSwxODksMjQxLAorICAgIDIzNCwyMTcsMTUzLDE4NSwgIDUsIDg0LDE2NiwxNTgsMTkyLDIwMywxOTEsIDI4LDEzMiwxMDEsIDY4LCA0MCwKKyAgICAgNzEsIDk2LCAxOSwgMzcsMTg5LDE3OCwyNTQsMTc2LDExOCwgNDYsIDY2LCAyNCwgNjQsIDExLDI1MSwxNjIsCisgICAgIDc1LCAgNCwxNzYsMTEyLDI0NywgNTUsMjI2LDIzMiwxOTQsMjE0LCA1OCwgIDAsMTI0LDI1NCwgMjMsMTI3LAorICAgIDExMywxMTUsIDk5LDExNSwxMDcsMTA3LDE0NywxMzMsMjAzLDIyMSwgNjIsIDEwLDIzNywxOTIsMTk4LDExMSwKKyAgICAxNTgsMjMwLDExMCwgODIsMTM1LDEzNiwxNDQsIDM2LDE2MiwxODEsIDM4LDE0NSwxODIsIDEwLDIwOCwgODYsCisgICAgMTc4LCA5OCwyMDUsMTY1LDEzNywgNTcsICA2LDE5MywxMTAsMTE5LCA3NiwxMTgsIDY5LCA4OCwgNzcsMTgwLAorICAgICA0MiwxMzIsMjA1LDEzNSwxNDEsMTU1LCA5MSwyMTksMTE2LDEzOCwgIDIsIDIxLCA2OCwgMjQsMjE3LDE4OSwKKyAgICAxODQsIDMyLDExOSwxNDUsMTAxLCAgOSwgODYsIDM3LDIyOCwyMDIsMjE5LCA2MiwxMzgsIDcyLCAxNiwgIDQsCisgICAgMTc5LDE3OSwxMTUsIDU5LCA5MSwyMTksMTE5LCA1NCwgNTUsMjU0LDI0MCwxODEsMTU5LDI1MiwyMTAsIDU5LAorICAgIDIyMiwyMTcsIDY0LDE3NiwxNzksMTQxLCA2OSwgIDksMjMwLDIxNiwgNDksMjA3LCA2MiwgNzQsIDIxLCA2MCwKKyAgICAyMjIsMjQ2LDIxNSwyMzEsIDY2LDI1NCwyMjksMTE2LCA0NCwyNDMsMjQ3LCAxMSwxMTIsMTk4LCA2NCwyMzUsCisgICAgMjM5LDE3MiwyMjEsICA0LDEyOCwyMzEsMjIzLDI0MywyMjIsMjQ5LDI0OSwyNDksIDg3LCA5NCwxODUsIDQ4LAorICAgICAyNCwgMTIsMjEwLCA5MywxNTQsMTg4LDEwOSwgMzIsMTM5LDIzNywxOTIsMTM4LCA4MSwxODksMjE1LCA0MiwKKyAgICAxOTksMjU0LCA2NywgNTIsMTA5LDIxNSwgMTgsMTU3LCAgNCwgIDIsMTA5LDE2NSwgIDgsMTQ0LDIzNCwxOTgsCisgICAgMTcxLCAxOSwgNTQsMTA2LDI1NSwyNDgsMTI4LCAxMywyMjgsIDc2LDIwOCwgMjQsMTA5LDEwOSwgMzQsIDM0LAorICAgICA0MSwgMzQsIDM2LCA3MywgNTksMTc2LDE2NiwgNzcsMjQ1LDE5NiwxNjksMTAwLDE3MywxMjAsMjIxLDE0NCwKKyAgICAxMTQsMTMyLDIzNiwxNTcsIDc4LCAgMCwyMDgsMTA4LCA1NCwxNTgsIDU2LDI1MSwyMjgsMjMyLDE0OSwgODcsCisgICAgIDg2LDEyMywgNTksMjU1LDI0NywgMjcsIDIzLDI1NCwxOTgsMTM3LCA1MSwgNTEsMTY4LCAxOCwgMjIsMTAyLAorICAgICA5MSwgMTUsMTQ5LDEzNywgNDcsIDE3LDE4MiwxMDksIDk1LCAyOSwxMjAsMjQ5LDIyMSwyMzksIDM5LCA1MCwKKyAgICAxOTcsMjIzLCAxNSwyMzAsMTgzLDIyNiwyNDgsMjUxLDExOSwxMTAsMTA5LDE5OSwyMDksMTc3LDE2MywgNzEsCisgICAgIDYzLDI1MywyMTcsMjA3LDE4OCwyNDYsMjE4LDEwNywgMjcsIDI3LDExOSwxNTIsMTg1LCA5NiwgMTQsMTk5LAorICAgICA3MiwxMzMsMTM4LCA2MiwxNzEsMTc0LDI0NiwxNzgsIDkxLDEyOSwgNzIsMTQ2LCAzNiwgNTgsIDczLCA5MCwKKyAgICAgIDIsIDUxLCA2NSwgNzIsMTQ3LDIyMSwgNzMsMTY2LDIzMCwyMTUsMTMyLCA3MCwxMTYsMTM1LDIwMSwgNjMsCisgICAgIDM0LCA1MiwxMzYsMjE4LDEzMCwyNTMsMjM3LCAyOSwgMTAsICAzLCAzNiwxOTQsMTE2LCA5NywgMTUsIDMyLAorICAgIDIxNiwgNDAsIDEyLDEwMCwgNzksMjQ1LDIyOSwgNTcsIDcxLDE1OSwgOTUsIDM0LDIxMCwxMDgsIDU0LDIyMywKKyAgICAyNTMsMTU4LDI0NywyNTQsMjQwLCAgNywyMjMsMTkxLDE4MiwxODksMjQ5LDExMSwgOTUsMjUzLDI0MSwgIDcsCisgICAgMTQzLDE1NiwgNTYsIDYzLDE3OSwxNjAsIDMzLCA4NSwgOTcsMTEwLCA4NSwxNjcsIDI4LDE3MCwxMzUsIDY5LAorICAgIDI0NiwxMDksIDg3LDEyNiwxODYsMTg5LDI0OSwxNDcsMjA1LCA1MywgMjIsIDg5LDE1MiwxNTksMjU1LCA0NywKKyAgICAyNTQsMjIyLDIyMywxODcsMTIyLDI0NSwyMzQsMjA1LDE1NSwgNTUsMjA1LDExMCwgNzksMjIyLCA1NSwxMDEsCisgICAgIDI3LCA2NSwyNTAsIDY2LDIwNiwxNDcsMTgzLDI0OSwgMTIsIDczLCA3NCwgNDcsMTA3LCAzMCwxNDUsIDU3LAorICAgIDEzNywxNjMsICA4LDE4MCwxMTAsIDE3LCA1MywgODAsIDE3LCAzNCwgIDEsMjE0LCA4MywxNDQsIDE5LDExNywKKyAgICAyNTQsICA3LCA1MywxNTAsIDMwLDExNiwgIDQsMTM0LDExNSwgOTcsMTYzLDE4MywxNzcsIDU3LDE3OSwxNzgsCisgICAgIDI4LCAgNCwgIDEsMTA3LCA0NSwxNTIsIDUzLDE3NywgNzMsMTg5LDEwMCwgIDYsMTc5LDE3MCwgIDMsIDQ2LAorICAgICAgNSwyMjksMTQ5LCA0MiwgIDIsMjE5LDE4MSwgNjksIDY4LDE4MCwyMTQsMTczLCA4NiwyNTEsMjI3LDE1OSwKKyAgICAyNDgsMTk2LCAxNSwxMjcsMjQwLDEzMSwyMzUsIDU1LDExMCwxMjQsMjQzLDI1MCwyMjksIDQzLCA1OSwgOTEsCisgICAgMjMxLDEwMiwgMjMsMTUwLCAyNywgNDUsIDQ1LCA5OCwyMjYsMTc2LCA2NywyNTEsMjM2LDE1MSwgOTMsMTEwLAorICAgIDEyOCwgIDAsMTgzLCA3MSwxMzEsMjE1LDE4MywgNTUsMTExLCAxMiwxMjIsICAwLDI0MCwyMzgsMjMxLDE1OCwKKyAgICAyNTEsMTk3LCA0NywxMjQsMjI1LDIwNSwgNTUsMjIzLDE4OCwxMjQsMjQ5LCA3NCwxOTEsIDYzLDIwMCwyMDMsCisgICAgMjM4LDEwOSwgMjEsMTE4LDIzNCwgMjgsMjExLDIzMywgOTMsMTkyLCAxMCwxMjYsIDIxLCA5NSwgMzYsMjQyLAorICAgICAxNSwxMzYsIDgxLDE2NCwgNzEsMTYzLDEzNiwgODgsMTg2LCA2NSwxNjAsIDE2LDE0OSwyMDEsMjM5LDIzNSwKKyAgICAxMDMsMjQ5LDIyNSwyMDksIDk1LCA4MiwgIDMsMjM3LDIzOCwyMjAsMTYzLCAzMiwxNjEsIDI4LDExMSwxMTgsCisgICAgMTI2LDE3NiwxODIsIDU0LDExOSwyNDQsIDcyLCAxNiwgIDQsMTc3LDExMiwxNzAsMTg1LDIwOCwgMTAsMTc3LAorICAgICA1MiwgMTUsMTMxLCA0NCwyMDksIDQ3LCAxMSwxNzgsIDQ5LDEzNywgNzYsMTIyLDE4MiwgNDksMTE1LCAyMCwKKyAgICAxNDEsMTMwLCA2NCwxODksMjU1LCAgMywgMzEsIDg4LDE4OSwxODksMjUwLDE1MSwxMjcsMjQ5LDE1MSwxNTEsCisgICAgMTgzLCA1NSwgNDcsMTExLDExMSwgNDYsMTgzLDE4NywxOTksIDU4LDIyMSwyMTcsMTc2LDE4NSwyMTYsMTA0LAorICAgIDIyNiwxNjQsMTc1LDIxNywxOTAsMTM5LDIzMSwxNDksICAwLDE3MiwxNDEsMTM0LDE1NSwyNDEsMjMyLDEyMiwKKyAgICAxOTEsMTAzLDIzNCwgODQsMTk1LCAzMiwyNDgsMTg3LDEyNywyNDcsMjM5LDE1OCwgNjIsMTE1LDIzMCwxODEsCisgICAgMjE1LCA5NCwxODcsMTIyLDI0NSwxMDYsMTc1LDE4MywgOTksMTQzLCA0NCwgODgsIDk0LDIyOSwyNTEsMTY2LAorICAgIDEwMSwgNzQsIDEyLDE5OSwxMjAsMjQzLDIwNCwgNTEsMjUwLDIzMCwgMTcsMTQ2LCAzNiwxMzcsMTYyLDE2OCwKKyAgICAgIDUsMTg0LCAxNiwgNTQsIDIxLCAzNCwxNjEsIDg5LDIwMiwgOTMsIDExLDE3NiwgNTgsMjU1LDEyMiwxODAsCisgICAgIDM1LDE3NiwgNDgsMTk2LDIzNywgODEsIDE4LDE0MSwgNDAsICA4LDEzNiwgNDAsMjE5LDI1MywgNDMsMTYzLAorICAgIDE1MiwgNTEsIDMxLDE4NSwyMTksMjA3LCAgMSwxNzIsICA4LDEwMSwgNTAsMTMyLCAxMywgIDYsIDY3LCAxNywKKyAgICAgODgsIDU3LDE3OCwyNDIsMTM5LDE5MSwyNDQsMTMzLCAxMSwgNjMsMTIxLDI0OSwxOTQsMTMzLCA4NywxMTAsCisgICAgIDE1LDEyMiwxODMsICA3LDE4OSwgNzEsMjUxLDI0MCwxMTgsIDkwLDIzNywgMTUsMTI3LDIyOCwxOTUsIDMxLAorICAgIDI1NSwxOTYsIDM5LCA1NCwxODMsMTgyLCA5NCwxMjYsMjQ5LDE0OSwyMTksMTgzLDExMSwgMTMsICA2LCA2NywKKyAgICAgMjcsMTIzLCA2NSwxOTAsMjExLDE4MiwxMTcsMTQyLDIwNiwgMjIsMTQ0LDEzMywxNTYsMjAzLCA1OSwxODIsCisgICAgMTMzLCAzNSwxNDAsMTM2LCA3MywxNDYsMTQwLDEzNCwgMzUsIDc4LDIyNiwgMzgsMjI0LCA4NCwgMTYsMTcwLAorICAgICAxMiwgOTQsMjQ1LCAyNCwgOTksMjM0LCAxNSwgMzEsMTkxLDEwNiwgNDksIDg2LCAyNSwxMjksMTQ1LDIyNCwKKyAgICAgODIsMTYzLDE4MSwxNzksMTI2LDEwMywyMzAsMjAwLCAxMCwxNDUsIDUwLDIwMywxNjgsMjM3LDE1NSwgNDEsCisgICAgMjAwLDI0NywxMzgsIDQyLDE5OCwxMjksMTcyLCA2MCwgMjksMTAyLDEyNywxMzEsIDY1LDE1MiwgMzAsMTQxLAorICAgIDEzNCwxNTUsMTU1LDE1NiwgMzYsMjAxLCA1OSwxNTksMTIzLDIzOCwxNjMsIDQ3LDE5MCwxMjAsMjUzLDI1MCwKKyAgICAxODEsMTU5LDE5MCwyNTAsMjM0LDE0MSwgMjcsIDU1LDIxNCwyMzgsMjIwLDEyMSwxOTYsIDE0LDIzNiwyNDIsCisgICAgMjI2LDIyNiwyMzMsMjExLDE2NywxNTksMTI3LDIyNSwxMzMsMTE5LDE4OCwyMjcsMjMzLDI0NSwgNTksMjM1LAorICAgIDExMSwxODgsMTEzLDI0MSwyNDYsMjM3LCA5MSwyMTksIDkxLDIxOSwxMTMsIDE4LCAyMywgNTUsICA2LCAgNiwKKyAgICAgNjUsMjQzLDE3NSwxNzYsMjQzLDE2NiwxMTEsIDIxLDE2MSwgODQsIDQyLDIyNSwxOTQsIDExLCAgMCwxNDcsCisgICAgIDY4LCAxNSwgIDYsICAzLDE5NywgNTAsIDI5LCA1MiwgMjAsMTYyLDE3MCwxOTUsMTc1LDE3NywgMTYsIDQwLAorICAgIDE2MSwgNzYsIDE0LCAgOSwxOTEsMTA2LDEzOCwgODUsIDY2LDEzNSwgMTYsIDc5LDE4MiwxODYsMjIzLDE4NSwKKyAgICAxMTcsMTIzLDI0NiwyMDAsIDE3LDE2NSwxNDgsMjM3LCA2NSwxNTksIDU1LDExNSwyMDYsMTMwLDE3NiwxODAsCisgICAgMTY4LDE2MiwgMTIsIDQ5LDEyOSwxNjIsMTI3LDEzMiwgNTIsMTI1LDExMywyMDIsIDM5LCA4MSwgNjgsMTYyLAorICAgICA0MCwyMTQsMTIyLDEyMywgNTYsIDI2LDIzNywyMzYsMTA4LCA3OSwgNzcsIDc3LDE5MSwyNDgsMjEwLCA3NSwKKyAgICAgODMsMjExLDIxMSwyMjEsIDc4LDE2NywyMDksMTA4LDE1NCwxNzQsMjI5LCA4OCwyMzgsMTA0LCA4NSwyNDUsCisgICAgMjE3LDE5NiwxMjAsIDcxLDE2NywxOTEsMTgxLDIxNiwgOTksIDM1LDE0NiwgMzYsMTIyLCA0OCwyMzIsMTExLAorICAgIDExMCwxMTAsMjU0LDI0MCwxMzUsIDYzLDIxNiwyMjAsMjIwLDIyMCwyMTcsMjMzLDE5NywxMTMsMjA0LDE3MiwKKyAgICAyMzcsIDk1LDE0NiwyMTUsICA2LCA5OSwyMzAsIDMxLDIwNSwgNDIsIDM0LDI1NSwgNzIsIDIyLCA5NSwgMjEsCisgICAgMTc4LDIxNiwyMDMsIDMxLDIwNCwgNjAsIDI2LCAxMywxMzUsMTk1LCA5NywgMjcsMTEyLCAzMywxMDgsMTU0LAorICAgIDEwOSwgNDQsMTY4LDE5OCwyMTUsMjI1LDI0MCwxNDMsIDgyLDE3NywxMDQsMTg3LDEzNCwyMTIsMjU0LCAzNywKKyAgICAgMjQsICAxLCA3OCwgIDUsIDY1LCA3MSwyMDMsMTEyLDEwMywxNjcsIDUzLCA2MSwgNjksIDY0LDIwNiwyMTQsCisgICAgIDI2LDIxNywxOTIsIDEwLCA0NywyMzMsMTI4LCA3NiwxNzgsIDYyLDIxMiwyNTQsMjUyLDE2MywxMjMsMTYyLAorICAgIDE2NiwgMTUsMTQxLDExMiwgNTIsIDI2LCAzNywxMTMsMTg4LDE3OSwxNzksMTc5LDE5MCwyMjIsMTA4LDE4MywKKyAgICAgOTEsMjA1LDEwMiwxNzEsMjA5LCAgOCwxNDUsICA4LDEzOSwxNTQsIDk5LCAgMiwyMzMsIDg1LDE5NCwxNTAsCisgICAgIDY3LCA0NywxMTUsMjE2LDE4MCwyMTQsMTEzLCAyOCwgMTUsMTM0LDEzMSwyMjUsIDk2LCAxNiwgNjksMTQ1LAorICAgIDIxNCwgOTAsMTU2LDE0OSwxNTcsMTUyLCAzMCwxODAsMTA4LDEyMiwyMTQsIDQ0LDE1NSwxNTEsMTE2LDI0MywKKyAgICAgNTgsIDI3LDE4NSwxNTEsMjUzLDE4NCwgMzksMTg3LCAzMiwxMDksIDU3LDEwNSwgNzAsIDI4LDE5OSwyNTMsCisgICAgIDk0LCA5NSwyMjYsMTIwLDEzOCwxMzAsMjMzLCAzMiwgMTIsIDc2LDI0OCwgODUsMTM1LDI0NywxMzUsIDQ3LAorICAgIDI1NSwyMTgsMTI3LDE5MywyNDYsICA0LCAxOSwxNzQsMTg3LDE4OCwgNTYsMTgxLDE4MCwxMDAsIDQ2LDIyMywKKyAgICAxMjEsMjM1LDExNCwyMTIsMjM1LCAzMSwxODAsMTMzLCA4NCwxMzAsMTk5LDE1NCwxNTcsMTA3LDE3MSwxMDcsCisgICAgMjM3LDIzMywgNDEsIDM2LCAxOCwgMTcsIDE3LDE0NiwyMjYsMjE2LDIxOSwgNzUsIDIyLDI0NSwxNTEsMTczLAorICAgICAgMCwxMTksIDc1LCA1OCwxNzksIDUxLCA4NiwxMDcsIDMwLDE0MiwxMzQsIDgxLCA1MiwgNjYsMjIwLDE3OCwKKyAgICAxMzcsMTE2LDIwNiwgNjQsMTg0LDI1NSwxNTgsMjAyLCAxNSwxMzUsIDk1LDIwNiwgOTQsMTg4LDE0NiwyNDcsCisgICAgMTQ5LDIyOSwyMzYsMTI3LDI0NSwgNjUsIDc5LDE5MSwgNDksIDE5LDE4MiwxNjksMTIxLDI0NCwxNzcsIDg1LAorICAgIDIyOSwgMjUsMTkzLCA5NywgMjMsMTY1LDEwMSwgOTUsMTk1LDIyNSwxNzYsMjE1LDIxOSwxMDUsICA4LDIwNCwKKyAgICAgIDUsMTQxLCAxNiwgNzMsIDMzLCA0MSwyMTUsIDYwLCA2MiwyMjIsIDQ3LDIzMCwxNzgsIDYzLCAyMSwgNDIsCisgICAgIDE5LDE5MywxNzUsMTk1LCA2MCwxNDIsMTU2LCA2MywyNDcsMjI4LCA3NSwgMzEsIDkzLDEyNiwyMzEsIDUxLAorICAgIDIxMSwgMjIsIDk0LCAgMCwgNDgsMjM0LDI0NywxOTEsMjQ3LDEyMywxMjcsMjQwLDE5OCwxNTksMjUzLDE5NywKKyAgICAgNjUsIDkxLDIwMCwgMTksMTczLDIwNiwxNTUsMjM1LCA1NSwyMjcsMjI3LDE5OSwxOTQsMTAyLDIxMSwyNDYsCisgICAgMjEwLDIyNSwgMTgsMTk0LCA0MiwxODksMTY0LCAzOSwxOTYsIDkyLDEzMiwxNjUsICA1LCAyNiwxNjUsMTY3LAorICAgIDEzOCwxNjQsIDY5LCAyMywgOTQsMTY5LCA0MiwgMjIsIDk0LDEyNSwgMzgsIDg3LCA2MCwyNDgsIDQ3LDE0NiwKKyAgICAyMTMsMjUyLDIwMiwgODYsIDE4LDIxNiwyMDMsIDg1LDE1NSwxNzQsMjE3LDE2OSwgOTMsIDQ0LDE3MCwyMTUsCisgICAgMTEzLDE1OCwyMDksMTEzLDE0MywxMDAsMTk3LDIxNSwxMDQsIDIwLDEwOSwxMTEsMTExLCA3MSwxMzEsMjI1LAorICAgICAzNCwxNzAsMjI5LCA3MCwgNDMsIDMyLCAxMiwxMDYsMjQzLDE4NCwyMTksIDk5LDEzNSwxMTEsMTYzLDE1NiwKKyAgICAxMjEsICA0LDI0OSwyMTMsMjMyLDExOCwgNzgsMTkwLDI1NSwyNDksMTE5LDEyNSwyNTQsIDIzLCAxMiwxODIsCisgICAgMTgyLDIyNywyNTQsMjE1LDE3NSwyNTUsMjQwLDE2NywxNTUsIDg3LCAgMSwgOTYsIDQyLDEwOCwxMjcsMjMwLAorICAgIDI0NCwxMzUsIDYyLDI0MiwxNDMsMTI2LDE2NSwxMTksMTIzLDIzNywyMzAsMjAzLCAyMywgMTQsMjEyLCA2NiwKKyAgICAgNDIsMTk2LDIyNywxNzMsMjA2LDIzNCwxODEsMjM1LDIwMywgNzksIDYyLCA2NSwxMDAsMTg4LDE0MSwxNzAsCisgICAgIDY2LCA4OCwyMTcsIDc1LCA1OCwxNDIsIDUwLCA5NSwyMTQsIDEzLDExMCwyNTMsMTAxLDI1NCwgMTIsMjAxLAorICAgIDE1MSwyMDEsMjM2LDE3OCwxNzIsIDgyLCAzOCwxNzMsMjI5LDIzNCwgODgsMTQwLDE4NSwyNTEsIDQxLCA2NSwKKyAgICAxOTAsMjQ3LDE1NSwgNzEsMTc3LDIzNCwxNTAsMTE2LCAyNSwyNTUsMTc5LDI0OCwxOTAsMjAyLCA0NSwgMjIsCisgICAgMjM1LDE4OCwgMTAsMjQwLCAzNCwgMTcsIDMwLDI0NCwyNTEsIDkxLDE1NSwgOTEsIDQ1LDE5MiwyNDksMTc2LAorICAgICAyNSwgMTgsMTY1LDIyNSwgODcsMTA5LCAzMCwyMzksIDYxLDIxMSwxNzIsMjQ5LDE4MSwyMzksMTEzLDIzOCwKKyAgICAgNTEsIDYzLDI0NywyMjAsMjMxLDEyNywxNjEsMjE3LDIzMywgIDAsMTkyLDIxNSwxNzUsMjU1LDI0MCwxNzEsCisgICAgMTUxLDI1NSwyMTEsMTU5LCA5NSwyNTUsMTYxLDEyMywxMzEsIDYzLDE5MSwyNDEsMTYzLDI1NSwyMzMsMTk3LAorICAgIDEyNywyNDIsMTYxLDI1NSwyMzQsMjM5LDEyNywyMjksMTU5LDI1NCwyMTgsMTI5LCA5MCwgNzIsICAyLDEyNCwKKyAgICAxNjIsIDYxLDEyNSwxMDksMjUzLDEwMiwxMjQsMjUyLDEwNCwxNjMsMjEzLDE2NiwyMTIsMTU1LDIyNCwgODgsCisgICAgMTMyLCAyMSwxODgsMTAwLDE2OSwxMTEsICA1LDIzOCwxNTAsIDI0LCA4NSwgNjEsMTE5LCA3NiwyNTMsIDY0LAorICAgICA0MiwgNjgsMTk2LDE4MCwxNDMsMTI5LDI1MSwyMTYsMjE0LDI0NSwyMjUsIDY5LCA5NSwgMzAsMTkzLDI0MiwKKyAgICAyMzQsIDE5LDIxOSwxNjIsMTYyLDEzMCwgOTYsMTg1LCA5NiwgNTMsIDY5LDExNywyMjgsMTEyLDIwMywgIDksCisgICAgIDE2LDExMywgODcsMTIwLCAzMywxOTQsIDk2LCAxNiwxMTEsMTA4LDIyMCwxMzcsIDcxLDE5NSwgMjUsIDg0LAorICAgIDE5OSwxNTQsMjM3LCAxNiwgNDEsMTc2LCA1NywgOTgsMjA1LDE3NSwyNTMsMTY5LDE3NiwxMzUsMjUwLDIxMCwKKyAgICAgMjQsMjIwLCA1MSwgNDksIDM5LDIzNywgMjEsMjUyLDIyOCwgIDcsMTU4LDEyNywyMjMsMTUxLDE5MCwxMDQsCisgICAgIDUyLDIxNSwgMzEsMTkxLDI0NSwyMzcsMjIzLDE4NSwyNDAsMTk5LCA1NSwyNTAsMjM1LDIyOSwxNTUsMTI1LAorICAgIDEyNywyNDUsMTgxLDIzOSwxNzMsMTkwLDI0NiwxOTAsMTY1LDE2NywyMDcsMTI1LDIzMCwyMzEsIDQ2LDEyNCwKKyAgICAyNDUsIDYzLCAyOCwxNjAsMTMzLCAgNCwgIDgsIDE2LDE0MywxODMsIDU4LDIxNSwgNDcsIDk0LCA1OCwyNTQsCisgICAgMjM2LCA1MSwgIDAsICAxLCAxNywgIDIsIDMyLCA1MSwxMDIsMTI5LCA3OCwgMTcsIDk3LCAzNCwyMDYsMTIyLAorICAgIDIwMSwgOTIsIDgxLDE2NCwgODksIDUzLDE4NiwxMTQsIDQzLCA5MSwgMjAsMTQ3LCA2MywgMzAsMTk3LCA5NCwKKyAgICAgMTMsMjMyLCAgNSwxMDAsIDg5LCAxOSwxNzIsIDczLCAxMywxMTIsIDEwLDEyNSwyMDIsIDYwLCAgOSwgIDYsCisgICAgIDY5LCA0MywgODksMTA2LDIzNiwxMTEsIDE1LDE4NywxMjgsIDE2LCA4MiwyMTcsIDQ1LCA4NiwxOTQsIDQzLAorICAgIDI0MywxNDAsMTk4LCAzMiwxMDYsMTU3LDIzNiwxMDgsMTExLDExMSwxMDgsMTA4LDExOCwgIDQsMjMxLCAyNywKKyAgICAyMDUsMTQ0LCA0MCwxODAsMTg3LDEwOSwgNjMsIDUyLDEyNCwgMjksIDU3LDEyNywgMTQsICAwLCA4NiwyMDYsCisgICAgIDYzLCA4MywyNDksMjEzLDIyMiwyMzQsIDkwLDIzOSwyNDYsMjE4LCA2NSwxMDMsMTg0LDEzNSwxMDQsIDYwLAorICAgICAxMCwyNTAsMTcxLDIwOSwyMzcsMTI0LDI0OCwgMzEsMjU0LDI1MywgODMsIDMxLDEyMCwgOTUsIDcwLDE3NCwKKyAgICAxNjksMTc2LDI1MywxMzMsMTc5LCA2MywyNTEsMTQyLDIxNywgMTksMjM5LCA5MSwxMjIsMjUwLDIzNSwyMTUsCisgICAgMTI3LDI0OCwgNDcsMTkxLDI0NywyNTEsIDU5LDI0MSwgMzIsMTg3LDI1MywxOTEsMjUyLDIyMiwyMzksMjU1LAorICAgIDIxOSwxNTksMjU1LCAzMSwxNTgsMjUxLDI1MiwgNDcsIDI4LCAzNiwxOTEsMTI4LDE3MiwgIDQsMjE5LDIyMCwKKyAgICAgOTAsMjM1LDIyMSwyMTcsMTUyLCA5NCwgOTIsMTgwLDI0MywgOTEsMTAyLDE0MywgNzAsMjIwLCAyMSwgOTcsCisgICAgIDQ4LCA4NiwxMzQsIDIxLDE1NiwgOTcsMTAyLDE4NiwgNDIsIDU4LDI0MywyMjgsMjI4LCA1MCwyNTEsMTYwLAorICAgIDIyNywxOTYsMTc4LCAxMSwxNjAsIDE4LCA5NCwyNDksMjMwLCA3NCwgIDUsIDI5LCAgNiwxNDQsMTA3LDE3NywKKyAgICAgIDIsMTkyLDEyOCwxMzgsMTEwLDIwOSwgODksIDE4LCA4NCwxNTgsMTA2LCA3NiwxMzEsMTIzLCA2NiwgMTcsCisgICAgIDI1LCAxMiwgIDYsMTA3LDEwNywxNzEsMTQ0LCAzNiwgNTEsIDQyLCA1NiwyMTQsMTA4LCA1NSwxNzIsMjQ4LAorICAgICA1OCwyMzIsIDI5LDIxMiwyMzAsMjA3LDE1NiwxMjIsMjQyLDE2NSwxNDMsIDMwLCA2MSwxMjcsMTEwLDIzOCwKKyAgICAyMDQsMTY5LDEyNSwxMjYsIDc1LDEyNywxMTcsMjM3LDE5OCwgNzksIDQ2LCA5MiwyNDksMjM4LDI0NywxNzUsCisgICAgMjUyLDIxMywyNDcsMTA3LDEyNiwyMjEsMTc1LDIzMCwxMjIsIDI3LDIwNywxMzcsMTQ3LCAzMSwxMjAsMjU0LAorICAgIDE5NSwyNTUsMjMyLCA4NywxNTQsMTU3LDIwNiwxMDcsMTU1LCA4NywyNTQsMTUxLCAzMSwyNTUsIDMzLCAgMCwKKyAgICAyNTIsMTE5LDIzOSwyNTEsMjI5LDI0NywgNDUsIDYxLDE1NywyMjEsMjI0LDE2NSwgOTksMjM5LDI0OSwyMzMsCisgICAgMjMwLDIxMywyMjMsMTg1LDI0MCwxOTksMjE3LCA1MywyMDcsIDQ3LCA2MSwxODksIDI5LDI0NywxNjcsIDU5LAorICAgIDE1NywyNDksIDUxLDE2NywyMzgsIDkyLDE4NiwxMjQsMTEyLCAxOCwgNzYsICAxLCAgNCwxMzYsIDM5LCA5MCwKKyAgICAyMjEsMTUxLCA0NywgOTUsMTA1LDIwNywgNzYsIDE5LDE4MSwgODQsIDY0LDEzMiwgMzYsMTk0LDEzNiwgNTAsCisgICAgIDcwLDEzNiwxMDEsICA4LDE3OSwxMTcsMTUyLDIxNywxOTEsIDk4LDI1NSwxNzQsMTg4LDE4NCwgNjAsIDYxLAorICAgIDIxOSwxNzEsIDU4LCA5MSwxODQsMjI2LDIwMywgODAsIDEyLCA3NCwxMjEsMjE4LDIxOSwxNzEsMTg2LCA0MiwKKyAgICAgMTAsMTE3LCAzNiwxMTEsMTY3LCA1MSwgNzAsMTM2LCA4NSwyNDQsMjU0LDIwMSwgNjgsIDg2LCAzMywyMzQsCisgICAgIDQyLDE1MSwxNjcsMTIyLDIyMiwgNDksIDQ1LCA1MCwxOTMsMjA5LDEwNCwxODQsMTkwLDE4MiwxOTAsMTg5LAorICAgIDE4NSwgNTMsIDQ1LDE3NiwgMjQsIDU0LDE1NSwxNjQsMTQwLDI0OCwgODIsICA3LCA0MSwxOTAsMjMwLDIwNywKKyAgICAxNTYsMTIyLDIyNSwgNzUsIDk1LCA1MiwxNTQsIDExLCAgMCwyMjgsMTk4LCA1MywxODQsMTEzLCAyOSwgNTQsCisgICAgIDU0LDIyNCwyMzAsMTE3LCAyNCwgMTQsIDQyLDE5MCwyMjUsMjA0LCA4OSwxMDQsMTgxLDIyNCwyMzIsMTc3LAorICAgIDIwNiwgMTksMTAzLDIwNywxMjYsMjUyLCA5OSwxMDMsIDYzLDI1NCwxNzcsMjIyLDIzNywyMTMsMTExLDI1MywKKyAgICAyMTQsMjM5LCAzMCwgOTIsMTUyLCA1OSwyMjUsIDg5LDIxNiwyMjUsMjE0LCA5NSwgNDcsMTI0LDIzMywxMzksCisgICAgMjA3LDEyNiwyMzAsMjMxLCAgMCwyMjQsMjU1LDEyMCwyMjksMTQzLDI1NSwyMjEsIDI3LDI1NSwyMjMsMTc1LAorICAgIDE1NiwyNTEsMjM2LCA0NywgNjEsMjQ1LDE3OSwgIDAsMTEyLDI1MywxNDksIDExLDE1MSwyNTQsMjM2LDE1NSwKKyAgICAgODcsMTkwLDI0MywxMjUsICAwLDI0OCwyMjAsMTkxLDI1MCwxNDEsIDQ3LCA2MCwyNDUsMTM3LDE3NSwgOTQsCisgICAgMjU0LDI0NiwxNDEsMjU0LDI1MCwgNTksMTAyLCA3OSwyNTIsMjI3LDIzMSwgNjIsMTExLDIzMiwyNDYsMjAyLAorICAgICA4NywyNTUsMTk1LDE5MywxOTMsIDQzLCA3NSwxOTMsIDIwLDIyNCwgNzQsMTYzLDExNywgMzksIDMwLDE3MywKKyAgICAgOTUsMTg5LDE4MiwxMTYsMjUwLCAyMCwgMTcsIDgyLCAxNiwgMTYsIDQwLDEwMiwgNjUsMTAwLCA0MywxOTYsCisgICAgIDc0LCA1MCwgNDQsMjM5LCA5MCwgODEsICA0LCA4OSwgOTQsMjM5LDEwOCwxNTAsMjAwLDE1MiwyMDQsMjA0LAorICAgIDExOCwyMTcsMTE5LCA4MiwxMjcsIDc5LDEyNCwgODksIDkwLCAyMSwxMDIsMjUwLDExMiwgIDIsMTU5LDIyMSwKKyAgICAyMjYsMjM4LDIzMSwgODEsMTU2LDE0MCwxMTYsMjQ2LDE4NiwyMDQsMTU0LDIwMywgMjYsMjQ1LCA3MywxMTksCisgICAgIDExLCA0NywxMTQsIDk4LCA0NywgNzYsMTQ2LDEwMCwxMTUsIDk5LDIyNywyNDYsMjM3LCA5MSwgNDUsMTI4LAorICAgIDE2NSwxNzYsMTg1LDIyMCwxMDQsIDUzLDEwOCwxMTQsMTI3LDExMiwyNDQsMTU0LCA2MywxMTUsMjM0LDIzMSwKKyAgICAyNTQsMjE3LDE3NSwxMzQsMTU3LDE0MiwxODgsMjQ5LCAgNiwyNTIsMjI0LDE4NywyNDAsMjAyLCA3OSwgOTYsCisgICAgIDU2LCAgNCwgIDAsMTA0LDE4MSwyMjQsMjE3LDExOSwxOTQsMTUzLCAzOSwyMjUsMjMyLDE3NywyNTIsMjE0LAorICAgICAyNywxMTksMjI0LDIzMCwgMTMsMjQ4LDE5MywxMTksIDk3LDIyNywgNzgsMTIyLDIxMiwxNTgsMTI1LCAzOSwKKyAgICAxNTYsIDU5LDIyMywxMjUsMjU0LDI1MywxNTksMjUwLDEwMywxOTEsMjUwLDE3MywyMjMsMjUwLDE1NywgIDMsCisgICAgMTU3LCA4MiwxNTksMjE2LCA3NiwyMzMsMTc2LDI0MiwxNzEsMjA5LDIzNywxODgsMjQwLDIwMywgOTUsIDYwLAorICAgIDI1MSwyNDEsMTQzLDEwOSwxOTksMjUzLDEyNywyNTQsMTU5LDI1NCwyNDcsMTU5LDExMCwgOTQsMjQ5LDIxNSwKKyAgICAgNDcsMjU0LDE0NywxNjcsMTAzLCA3OSwxMTAsMTc1LDE3NCwxMjYsMjM5LDI0NywyNTQsMTkyLCAyMSwyMTMsCisgICAgMTc1LDEyNiwyNDUsMTA3LDIzOSwyNTQsMjUyLDIzMSwyNTQsMjQxLDExNSwxNTksMjIzLDEzNywgIDcsMTU5LAorICAgICA2MSwyNTMsIDk3LCA2NywxODMsMTkxLDI1NCwxOTEsMjU0LDIzMiwyMTQsMTkzLDE5MSwxMDAsIDMzLCAzMiwKKyAgICAgMzMsIDQwLDE5NiwxNzksMTU3LDIzMywgMzEsMTczLDIyMywyMTcsMjM4LCA3OCwyMDUsIDQ2LCA0NywgNDIsCisgICAgMTY1LCA4MCwgNDEsMTMzLCAzNCwxMzAsIDI1LDE5NywyMzYsMTgyLDIxNywgNTQsMTc1LDEzNCwxODgsMTAxLAorICAgIDEzMywxODEsMTQ3LCA0NiwyMDAsIDc2LCA5OSwgNjYsMTQzLDEwNiwxMjYsMTI3LDE5NiwxMzAsMjExLCA1MiwKKyAgICAgNjMsMTYwLDE3MiwxODUsIDM4LDIwMSwgNzUsMTM4LDI1NSwyMDYsMTc3LDE5OCwxOTAsIDEwLCAgMywxNjcsCisgICAgMjIzLDE4MCwgNjUsIDIzLCA4MiwxOTgsIDQxLCA0MCwgNzgsIDQ5LCA4NiwxNTQsMTk4LDE1NiwgOTIsMTMyLAorICAgIDEzMiwyMDAsIDQ0LCA1OSwgNTksMjE5LCA1NSwxMTEsMjIyLDE5MiwgNTYsIDg5LDE2MCwyNDAsMTIwLDE3MSwKKyAgICAyMTEsMTc2LDIyNiwyMzUsIDY0LDIwMywgMzgsIDk0LDI0OCwyMTAsIDIzLDE5NSwgNzgsIDcxLDI1NCwyMjgsCisgICAgMjIzLDE5NSwxODMsMTkwLDE0NSwgOTUsMjUxLDE0NSwgMjMsMjI1LCAxOSwxNTksMTk2LCA4NiwxODcsMjUwLAorICAgIDEyMywgNjIsMjUzLDE4MywyMjgsIDkxLDIyMywxMjgsIDYzLDI0OSwyNDcsICAwLCAgMCwxNzUsMjUyLCAgNCwKKyAgICAgOTQsMjQ5LDEzNywgOTIsMTIwLCAyNSwyNTUsMjA2LDE1MSwyMjIsMjU1LDE2NSwgNDcsIDYyLCA2MCwxMjYsCisgICAgIDc3LCA4MiwgNDUsIDc4LCA0OCwxNjEsMjA3LDIzMCwxODksMTk4LDE2NywxMjYsMjM3LCA4NywyMzEsMjA3LAorICAgIDE1NiwxMjIsMTA5LDI0MywyMDIsIDYzLDI1MywxOTgsMjU1LCAxMiwgIDAsICA2LCA5NCwxNTEsMjU1LDIzNCwKKyAgICAxMjMsMjIzLDI1NCwyMzcsMjIzLCA0NSwgNjgsMTU1LCA2MywyNTAsMjQyLCA4NywxNTgsMjQ4LDI0OCwgNzEsCisgICAgIDk1LCA1OCwyNDYsIDMwLCAgMCwyMTYsIDk0LCA5MywyNTMsMjM1LCA0NywyNTUsMjA5LCA2NywxMjMsMTY0LAorICAgIDEwOSwgMzMsICA1LCA1MywgIDgsIDc4LDE4MCwxODYsIDYzLDE4NSwyNDQsIDg2LDE3OSwyMTksIDg2LCA3NCwKKyAgICAgNTMsIDcyLCAxNywgNDEsIDE3LCAgMywgNDcsIDc2LCA1NSwyMjUsMTkyLCA0MiwgMzcsMTAyLDIwMSwyMjksCisgICAgMTMxLCA0NCwyMDMsMjQ0LCAzNywgOTUsMjM5LCAgNywgODIsMjAyLDE5MiwxMzgsMTc5LCA2NiwyMjYsMTMyLAorICAgIDI1NCwgNTYsIDY1LDIxMiwxNzAsMjUwLCA3NiwgMTAsMjUxLDExNCwxMzksMjQ3LDIwNywyNTIsIDQ5LCAzNywKKyAgICAxMDAsIDIxLDEzOSwgMzYsMTE4LCA3MywyMzUsMjExLCA3NywyMTAsIDczLCA2NCwyNTAsMjUzLDIyMiwxNDEsCisgICAgMjM1LDIxNSwxMjMsIDU5LCA1OSwgNTEsMTMwLDEzOSwxNDEsMTAyLDEzOSwxNDgsIDIxLCA5NSwxMTYsMTYwLAorICAgIDEwMSwgMTksIDcxLDIwNiwxNTksMTQ3LCAyNywyMTUsIDYwLDEyMCwgIDEsMjI0LDE2NywyNTUsIDg2LDIyMCwKKyAgICAyMzksMTkxLDI1NCwyMTMsMjU1LDExMiwyMjksIDU5LCA2MywxMTIsIDk1LCA5OCwgODcsMjA2LDE1OSwxNTUsCisgICAgIDYzLDExNSwyNDIsMjE3LCA3OSwxMjcsMTcwLDI1MSwxNDUsIDIzLDIyOSwxOTQsIDc5LDIyNCwyMDUsMTM5LAorICAgIDIzMywgMjMsIDk0LDI0OSwxMzcsMTI0LDI1NSwgNTksMjI1LDI0MywyMzksIDk1LCA1NywxMjcsMjM4LDIxNCwKKyAgICAgMzYsMTg3LDIwMCwgOTAsMTI3LDIyOSwgNDcsIDgxLDI1NSwyMzIsIDg3LCA1MCwxMjAsMjM3LDE5NiwxMzEsCisgICAgIDk1LCA1NywyNDcsIDg5LCAgMywxNzUsMTc1LDI1NSwyMzUsMTI3LCA4MywxMjEsMjUxLCA2MywyNTUsIDg3LAorICAgIDI1NSwyMzAsMjIwLDE2NywgNjMsMTE3LDIzMSwxNzMsMjAzLCAyMywxOTEsMjU0LDIwNSwxMzUsIDYzLDExMywKKyAgICAgNjcsICA4LCAgMSwyMjQsIDc0LDE2MywxODEsMTU3LDE5NiwyMTUsIDk1LDE5MSwxMjAsMjUyLDI1MiwgNTcsCisgICAgICAwLDEwOCwgNTQsMTU1LDE2NCwgIDgsIDgyLCAgOSwxMDIsIDgyLCA0OCwgMTEsIDUwLDE5MSwyMjIsIDczLAorICAgIDE2MCwgIDIsMTAwLDIyMiwxMjMsIDkxLDIxNSwgODksMjE2LDEwNSwgMTgsMjQyLCA0NiwgMTIsIDIxLDEyOCwKKyAgICAxNDQsIDczLDEyOSwxNTIsMjM2LDE3MywxOTcsIDI4LDEwMiwxMDEsMjUzLDIwOSwgMTAsMjM2LCAgMiwxNzIsCisgICAgMjM4LDIyNSwgODUsMjQwLDE0MCwxNzQsMjQ4LCAzNCwgNjYsIDE3LCAyNCwyNDQsMjUxLCA1NSwxNzQsIDk1LAorICAgICA5MSwgOTMsIDkzLDE1NSwgMjIsIDkyLCAxMiwxNTUsMTA1LDI0MiwxMzMsIDcwLDEyNCwgMjksMjUyLCA5NSwKKyAgICAxMTEsIDEyLDE2MywgNjMsMjE0LCA0NywgOTMsMjU0LDIzOCwyMzksMjUzLCA2NSwyMjUsMjAyLCA5MSwgNDcsCisgICAgIDk1LDE4NCwyNDUsMjQyLDEzMywgNzAsMTY3LDI0MywyMzgsMjA3LDEyNywxNzQsMjQ4LCAxMywgMjcsIDI3LAorICAgIDE0MywxMDcsMTI0LDEyNywgIDgsMjQ5LDE4MSwxMTQsMjU0LDIyMCwyMTcsMTQzLDEyNywyMzYsMTIyLDEyNywKKyAgICAyMDUsMTkyLCAxMSwgIDAsMjIyLCA0OSwxMjMsICAyLCAgMCwxNzQsMTI2LDI0NywgIDcsMjI3LDE5MCwyMjksCisgICAgMjA2LDE2NSwyMDMsMjIzLDI1MCwxNzMsMjIzLDEyMSwgOTEsMjM4LCA0NSwyMTgsMTEyLCAzOCwgNjQsIDU4LAorICAgIDIxOSwxNTMsIDI2LDIzOCwxMDgsMjIwLDE5MCwxMjAsMTA1LDIzMywxMzcsMjExLCA2OCwyMTIsIDgyLCA3NywKKyAgICAgMzYsMjI5LDE5NCwyMDMsIDk0LDE1MCwxNzAsIDUwLDEyNSwgMTcsMTc1LCAzOCwxNzAsIDQwLCA3MCwxODgsCisgICAgMTY4LCAgOCwgNzQsIDM2LDE1NSwxNDgsMTg4LDIyNiwgMzAsMTg5LDEwMCwgNTgsMTE5LCA3NCwxMjgsIDY0LAorICAgICA5OSwyMDMsMjM0LCAxMSwxMDUsMjE1LCA5NCwyMDIsIDExLCAgMCwxMzQsMTk1LDE5MywxNDEsIDI3LCA1NSwKKyAgICAxNzQsIDk1LDE5MSwyMjIsIDE3LCA4OCwgODAsMjI1LDE2OSwxMTgsIDU1LCAxOSwgOTUsMTk4LCA1NywyMTQsCisgICAgIDUzLCA5NSwgMTksMjM4LCAzMywyMzMsMjA4LCAgNSwxMTksMjMxLCA2MiwyNTMsIDczLCAgMCwyNDgsMTUxLAorICAgIDIyMywyNTEsIDYzLDE3OSwxNDYsMTM2LDEyNywyNDcsMTk4LDEyNywgIDQsMTI4LDExOSwxMjUsMjU0LCAyMywKKyAgICAgMzgsMjQzLDE2MSwyMDYsMjAyLDI0MSwgIDMsMTY0LDEwMywxODcsMTE1LDIyMSwyMjIsIDk2LDIzNywyNDIsCisgICAgMjEzLDIyNSwxMTIsIDI0LDE5OSwgNDksICAwLCA0MCwgNjksMTcwLDEwNiwgMTYsIDQxLDE2MiwyMzYsMTM5LAorICAgICA2OCwxMzgsMTM2LDE0OCwgMzQsIDUxLDE0OCwyNDksIDUyLDEyNSwyMzksIDEyLCA2OSwyMDYsIDUzLDEyMCwKKyAgICAxMDQsMjA3LCA2NSwgNzYsIDgzLCA0NSwyMzksMjM5LCA4MiwyMjIsICA1LCA0MiwyNTQsMjE3LDIzMywgIDEsCisgICAgIDgyLDE0OCwgMzAsIDU4LDI0MiwgMTUsMTY2LDI0MywxMzcsIDgyLCA3NCwgMzMsIDk3LCAyMCwxNDEsMTEwLAorICAgIDIyMSwxODYsMTIxLDI0NSwyNDIsMTQ5LCAyMiwxOTUsMTQ2LCAxMCwgNzksMTgzLDE2NywgOTAsIDY4LCAxMywKKyAgICAgODIsMTE3LDE5MywyNTMsMjUzLDE1OSwyNDUsIDE1LDE0MSwgIDcsMTkzLDE4OSwyMTAsMjQ1LDEwOSwxMjMsCisgICAgMjMzLCA5NCwxMjEsMjMxLDE4NSwyMzUsMjUzLDE4MSwyMzksMTc1LDE5MCwxNTAsIDkzLDI0MywyNTMsMjEzLAorICAgIDIxNSwyNTQsMjQ4LDE3MywxMTEsMTI3LDI0NiwyNDQsMTM1LDIyMywyNTMsMjQ5LDIwNywyNTMsMjMyLDIwMywKKyAgICAgOTUsMTUzLDIwNCwxOTksMjE4LDE4NCwgNzIsIDMzLDEyMiwxNjYsIDUxLDI1MSwyMDIsMjMwLDE5OCwxOTgsCisgICAgMjA1LDE1NSwxNzgsMTc4LDIyMCwyMzcsIDY2LDE3MSwyMTMsIDM0LCA4MiwxNDYsIDU1LDEwNCwgNjksIDE3LAorICAgIDE3NywgOTAsMTcyLCAzMiwxOTIsMTc4LDE4MiwgMTEsMTQyLCAxNiwgNDMsMTk2LCA2NywxMjYsMTE0LCA4NCwKKyAgICAyNDUsMTEzLCAgMiwxNDksIDIzLDIzOCwxMjYsMTY5LCA5OCwgNTUsMTg1LCA0OSwxNjYsMjA5LCA3OSwyMzUsCisgICAgMTc3LCA1OCwxNzksIDcxLCAgNCwxNDQsMjI1LCA5NiwxMjAsMjI3LDI1MCwxNDEsIDc1LDExMSwxOTAsIDI1LAorICAgICA0OCwgNDcsMTY5LDI0MCwgODQsMTcxLDIxOSwgMzQsMjEzLDIwNCwgOTksMjUxLDEzNSwyNDUsMTUxLCA2MywKKyAgICAxMTMsIDIyLDI1NCwyNTEsMjIzLDE4NCwyMzUsMjM5LDI1MCwyNTEsMjU1LDE3NiwxMzQsMjMxLDEzMSwyNDEsCisgICAgMTQzLCAxNSwyNTUsIDYwLDEzNiwyNTAsMjUzLDE2OSwyMTcsMjA2LCA4NCwyMTYsMTE4LCA3NSwgODIsMTI3LAorICAgIDIzMSwxOTQsIDMxLDI1NSwyMDQsMTc3LDExOSwgNjMsMjQzLDE1MywgNzksIDc3LCAzOCwxOTEsMTE0LCAyMywKKyAgICAgIDksMjA4LCA4NCwxMTYsMTc4LDIxMywxODksMTI0LDExNSwxMTcsIDkzLDIzNSwxMDAsMTIxLCAyNSwgNjgsCisgICAgMjE4LDE1NywxNDIsIDgyLDEwMCwxMzksIDM4LCA4MCwgNjgsMTQ0LCA0MiwxMjQsMTAwLCA2OSwgMTMsMTQ4LAorICAgIDI1NSwyMjIsMTc5LDE0MiwyMjQsMTUwLCA4NiwgMjksMTk4LDEzNCwgIDksIDg5LDE0NywyMTIsICAyLDE5NywKKyAgICAgNDIsMTgyLCA1MywxMTMsMTg2LCA2MywxNTEsIDk5LCA0NywgNDIsMTczLDExMiwxNDgsIDk0LDE3NSwxMjcsCisgICAgMjM3LDIzNCwyMTMsIDc1LDExMSwxOTAsIDI1LDEzOCwxNzIsIDgwLDE3NiwyMjAsMTA0LDExNywgODQsMjA4LAorICAgICA4MiwyMjIsMTU2LDIyNywgNjcsIDMyLDIxNiwxODMsMTI2LDIzNSwxMTksMTU4LDEyNCwyMzMsMTYzLDIyOSwKKyAgICAyMzUsMTI3LDI0NCwyMjksIDYzLCAyNiwyNDcsIDQ1LDExMSwxMjQsMjUzLCA0NywgNDIsIDc1LDI0MywyMzksCisgICAgIDkyLDE4NiwyNTIsMTgyLDEzNSwyNDcsMTExLDEzOSwxNjUsIDEyLCAxNCwgMjEsMTg3LCAgMCwgIDAsMTc0LAorICAgIDI1NCwyMTMsMjQ3LDE1OSwyNTMsMjA0LDIwNywxMjUsMjI1LDIzNiwyMDcsMTAyLCAzNywxNjksIDcxLCA1OSwKKyAgICAgMTEsMjU1LDI0OCwxODUsMjA3LCA3OSwxMzUsMTU3LCA4MSwgNjAsMTg1LDEzOSwgNDIsIDI4LDEzMiwyMDksCisgICAgIDk4LDIxNiwgMjAsMTI4LCA0MywxNzEsMTE5LDIxNCwxNjMsIDcyLDE1MiwgODksMTY0LCA1OSwyMTMsIDEzLAorICAgICA4NCwgIDAsICAwLCA0MSwxOTEsIDc2LDE4NywgMjksMTc0LDIzMCwgODcsMTk4LDE3NiwgNDIsICA5LDIzMCwKKyAgICAxMzAsMTcyLDIzNCwgNDksMTU0LDEwMCwxNDgsIDk3LDE5NywyMzEsMTAxLDI0MSwgODUsMTcwLDI0MywgNDIsCisgICAgMjQwLDE3MSwxNjIsMTk2LDIyMiwxMDAsIDk0LDEyOCwyMDAsMjA0LCA1OSwgNTksMjE5LDE1MSwyMjMsMTg2LAorICAgIDEyNCwyNDUsMjAyLDE0OSwxNjYsMjAwLCAxOCwgIDUsMjAzLDE0MSwyNDYsIDY2LDIxNiwxMDQsMTQ2LDIwMiwKKyAgICAxNzAsMjM3LCAzMSwxNTQsMjI5LDEyNiwyMjcsMjA3LDI1NCwyMjYsMTEwLDE2NywxOTQsMTIzLDE4MywyMTUsCisgICAgMTkwLDI0NiwgNDcsMTI2LDI0MywxNDUsMTc2LDE1MiwxNDcsMTYxLDE5MSwgMzAsMjU0LDI0OCwyNDEsIDMxLAorICAgIDI1NCwyMDksMTQ3LCAzMSwyNTUsMjE2LCA2MywxMjAsMjQ2LDE3OSwgOTUsMTg5LDI1MiwyMzcsMTU3LDEyMCwKKyAgICAyNDAsMTMzLDE3OSwgNjMsMjUxLCAxNSwxNTgsMjUzLCA0NCwgIDAsMTA4LDE3NSwxNzQsMTI2LDI1MSwxMjcsCisgICAgMjUzLDIyMSwgIDksIDc5LDExNywyMDQsMTk0LCA2MCwgMzIsIDkwLCAxMiwxNTUsIDQ1LDE2MiwgNTUsMTgyLAorICAgIDExOCwgODYsMjI3LDE4MywyNDQsMTM3LCAxOSwgNzMsMTQ2LDIwNCwyMDQsIDc2LCA1NSwgMjYsIDc3LCAzNiwKKyAgICAgIDUsIDI1LDE4NywyMDAsMjE0LDIzMSwxMzEsMjE5LDEzMiwgOTcsIDQ0LDE5MSwyNTIsMjAyLDIwNywxMjUsCisgICAgMTg1LCA3MCwxNTMsIDI4LCA4OCwyMjEsIDI3LDE5MSwgNDIsMjQ0LCA4NywxMDEsMTc3LCA0MiwgMzQsIDY0LAorICAgIDE1NiwgMzYsIDI3LDExOSwgNTQsMjIyLDE4NiwyNDQsMjMwLDIzNywgOTEsMTgzLCA5MSwgNDQsIDc1LCA0MiwKKyAgICAgNjAsMjIyLDIzNCwgNzYsMTY5LDE3NiwgNjksMjEyLCAzMiwgMTAsMTY4LDE0MiwxODksMjM4LCA2NywxMTQsCisgICAgIDIxLDE4NiwxNjEsIDc2LDE0NiwyNTQsMTQ2LDI1MSwxOTAsMTkzLCAgMywyNDUsMTQzLDE4OSwyNTQsMTQzLAorICAgIDE5MSwyNTIsMTQ5LDI0NywxMjcsMjMzLDIzOSwyNTIsMjUwLDEzNSwyNTQsMjAzLDE2MywxNTcsMTMzLDIzMywKKyAgICAxNzYsIDUxLDIzNCwyNDcsMTI3LDI1MiwyMjksMTc1LCA5MiwyNDgsMjM0LDIxNSwgMTQsMTI5LCA0MSwgNTAsCisgICAgICA4LCAgMywgIDAsMTYyLCA0MSwgIDgsMjA3LDExNywxMDMsIDk1LDIzNywxMDksMTc0LCA5NCwxMjQsMTE1LAorICAgIDExNiwyMzYsMTA0LCAyMCwxNDEsMjMwLDIzMSwyMzEsMjE5LDIzNywgMTQsMTQ1LCAgMiwxMTIsMTg2LCAyOSwKKyAgICAgODIsMTY5LDE2MCwgIDIsMjAyLCA2NSwyMTYsIDU2LDI1MywgIDUsIDE5LCA2MSwgIDMsMTM3LDEyMywxMjcsCisgICAgMjA1LDE4MSwxNDUsIDg4LDIzNiwgNjgsMjMyLDIzNywyMTcsMjMyLDI1MiwgNDcsMjE4LCA3MSwgMTYsIDI1LAorICAgICAxMiwxMzQsMTgzLDExMSwyMjMsMTg2LDI0NCwyMzAsMTU1LDE4OSwyMzcsMTU3LCAxNCwyMDMsIDk4LCAyNiwKKyAgICAyMTYsMTcxLCAzOCwxNjksMTY2LDEyOSwgODcsMTg5LDE4OSwyNDYsMjI1LDE3OSwxNDMsMTM1LDE3OSwyNTQsCisgICAgMjM1LDE5NCwgODcsMTkxLDI0NiwxOTYsMTk5LCA2MywyNDYsMjQ0LDIzMywgODMsIDcwLDEzMiwxMjcsMjMxLAorICAgIDI0NywyNTUsIDMyLCA2MiwgODQsMjAzLDI0MSwyMDEsMjQ0LDEwMSwgMzksICAyLDEyOCwxMTUsIDgzLDE3OSwKKyAgICAxNzUsMjQ3LDE4MiwxNzQsMTkxLDI0OSwgODYsMTI0LDEwMCwgNTcsMTQyLDIyNiwxODUsMjQ5LDI0OSwxNjksCisgICAgMjMzLDE2OSwgNzAsIDI0LCAzNCwgODEsIDY1LDExNSwgMjEsIDgzLCA0OCwyNDcsICAyLDE4NCwgNzcsMTAzLAorICAgIDIwMiwgIDgsIDU5LCA5MiwgMTcsIDI0LCA4NiwxMDIsIDk2LCA5OSwgNTQsIDEzLCA0MiwgMzQsMTcyLCA2NCwKKyAgICAgNDgsICAwLDIwOCwgNzMsMTc4LDE4OSwxODksMTI1LDI0NSwyMzQsMjEzLDE4MywgNDYsIDkzLCAzNCwxNTAsCisgICAgIDQ2LDIwMywgODIsMjA4LCA1NiwyMTMsMjM0LCA1NCwxNDksIDc0LDEwOSwxNjMsMTI5LCA4NywyMDUsMTc0LAorICAgICA2NywgNTYsMTMwLDIwMSwxMjQsIDk3LDIyMiwxMTUsMjUyLDIzMywxOTEsMjQ4LDIwNSwyNDksMjExLDE2NywKKyAgICAxMjIsMTcxLDE3MSwxODksMjE5LDEwNywxMzUsMjM1LDEzNiwgOTksMTM0LCA0OCwgIDAsIDM2LCA2NiwxMjksCisgICAgMTY3LDE4NywgNTEsMjIxLDIwOSwyMjQsMjUwLDIzNywxODEsMjEzLDE5MywgOTYsIDQ4LDIzMiwyMDcsMjA0LAorICAgIDIwNCwyMDYsIDQ3LCA0NCwxMTYsMTg3LCAyOSwxNDksIDM4LCA5OCwgNTcsMTk2LDI0MiwxMjYsIDg4LDI0NiwKKyAgICAxMTQsIDk3LCA3MywgMTMsMTIwLDEyMywxMTAsIDIzLCA1OCwyMTAsIDI4LDE2NiwgOTksIDg0LDEwNCwxMTcsCisgICAgIDYxLDExMCwxOTksMTc5LCAxOCwxOTQsIDYwLCAzMywxOTgsMjA0LDEzMSwxOTMsMjI0LDI0NiwyMzcsIDkxLAorICAgIDE1MSwyMjMsMTg2LDE4OCwxODUsMTg1LDIwOSwxMDAsMTUzLCAgNSwxODEsMjE2LDEwOCwxNzQsIDUyLCA5MCwKKyAgICAgNzAsMTE4LDEzMywxODIsMjEyLDE3MSwgODYsIDk0LDEzNSwgNTAsMjUzLCA1OCwxODgsMjM1LCAzMSwyMjcsCisgICAgIDk0LDI1NSwgODAsMTc1LDE1MCwgNDgsIDcwLDIxMCwgMjAsMTAxLCAzNCwyMjUsMTM3LCA4NiwxMDMsIDQ2LAorICAgIDEwNCwxODgsMjE3LDIyMywgODksMjM1LCA5NSwyMzcsMjA3LDExMCwyNDcsMjUxLDE4OSwyNDksMTMzLDEzMywKKyAgICAyMTcsMjE3LDIxNywgODYsMTcxLCA3NywgNjgsMjE0LCAyOCwyMzgsIDE0LDE3NSwgOTIsMTMzLDIzNywgNDEsCisgICAgMTkwLDEwMCwyNDIsMTQyLDE5OCwyMTYsMjM1LDE1NiwyMjIsMjUzLDIyOSwxNDIsMjA4LCAzMCwxOTQsMTU2LAorICAgICAgNiwgOTUsMTk0LCA1MCwgMjYsMTQxLCA1NCwgNTQsMjM4LCA5MiwxODksMTE0LDI0NSwyMTgsMTgxLDE3MSwKKyAgICAxMjksIDY0LDE1MSwxMDEsIDY1LDEzMywxOTksIDkwLDE1NywxNzQsIDEwLDE1NCwxNjQsIDI2LCA2OCwgMzMsCisgICAgMTQ2LDIxNywgMjQsMTczLDE3NCwgODMsMTI1LDE3NiwxOTYsMTIyLDE1MiwyMDcsMTc0LCA5NiwgNDcsMTE0LAorICAgIDIwMiwgOTQsIDg3LDIxNCwyMjcsMTI2LCA3OCwgOTAsIDg0LDEwMiwgNjcsIDE0LCAzMiwgMTAsMTk0LDEwMywKKyAgICAxODcsMTc5LDIxNSwgNzEsMjUzLCAyNywyMzUsMTU1LDIzNSwxODksMjU0LDIwNiwyNDYsMjA2LDE1NywxNTMsCisgICAgMjMzLDEzMywxMzMsMTMzLDE1MywxNTMsMjE3LCA4NiwxODcsMTY1LCA3MiwgMzMsMTYxLDE2NywxOTQsMTg4LAorICAgICAxMCwxMjQsMTAzLCA3MywxMTUsMTc3LDE0NSwyMzMsIDk3LCA2MSwgNTgsIDk0LDE4MywyMzYsMTk0LDIzMCwKKyAgICAxMDMsIDk5LDE1MSwxMDcsICAzLDE3OSwxNDAsMTM0LDE5NSwyMDUsMjA1LDIwNSwgMjcsMjE1LDExMSwgOTIsCisgICAgMTg3LDExOCwgNTMsMTM3LDE0NywgNTQsMjAzLCA1MiwxNzAsMTk3LDEwMiwyMTgsIDg1LDE2MiwxMjksMTY2LAorICAgIDE5NCwgMzAsIDIxLCA5OCwgOTMsMTAwLDI1NSwyMDAsMjUwLDE5OSwgIDksMjA5LDEzNSwxNDMsICAzLDE5NCwKKyAgICAgNDAsIDYxLCAgMywxMzMsIDE2LCA3OCwxODAsMTg2LCA0MywyMDUsMjE0LCAyNywyNTMsMTU3LCAyNywgNTUsCisgICAgMTEwLCAxNCwgNTUsIDU1LCA1NSwyMzksMTA4LCA3NiwyMDcsMjA0LDIwNCwyMDUsMjA3LDIwNSwyMDYsMjA2LAorICAgIDExOCwgNTgsMTU3LCA0OCwxMDgsIDE2LDEwMiwxMTQsMjA0LDIzOSwyNDIsMjMxLDE0NCwxNzEsMTMyLCA0NSwKKyAgICAgNTcsIDQ0LCAxNSwgMjMsMjM4LDE3MCwxOTEsMjIwLDE3MywxNTIsIDEwLDEyMywgIDksMTI5LCA3MiwxNTYsCisgICAgIDM2LDEzMSwyNTQsIDk2LCA5OSwgOTksMjI3LDI0NiwxNzMsIDkxLCA1NSwxMTAsIDkyLDIxNSwxMTMsIDE4LAorICAgIDE3OCwgNzYsMTc3LCA0NCwxMzQsMTQxLCAxOSwxNzMsMTEwLDEzMSwxNjgsIDczLCAyMCwxNjIsIDEwLCAgOSwKKyAgICAxNTcsMjUzLDEzMiwxMDYsMTIwLCA2MSwgMzIsMjEzLDEzMywxMzUsMTQ1LCA5NSwyNDUsMTIwLCA2NCwgIDgsCisgICAgIDUxLDEwOSwgIDgsIDE3LCAgOCwgNzMsMTQ4LDIyNCwyMTEsMjIxLDE1MywgMTksMTg2LDExNSwxMDEsMjE2LAorICAgIDE4NywxMjEsMTIzLDExNywxMTcsMTA3LDEwNywyMzcsMjQ2LDIzNywyMzgsMjQ0LDI0NCwyMzYsMjIwLDIzNiwKKyAgICAyMzYsMjM2LDIyMCwyMTIsIDg0LDE4MywyMTMsMTEwLDEzNSwgNjUsMTM2LCAxMCwgIDEsMTYwLDEwNiwgMTcsCisgICAgMTY0LDE1OSwxMjIsMjAxLCAzMywgNjMsIDUyLCAzMCwyMDAsMTM4LDIxMywyNDcsIDM0LDE0NiwgMzYsMjAxLAorICAgIDExMiwgNTYsMjM2LDIzNywyMzYsMTcyLDIyMywgODksMTkxLDEyNSwyMzUsMjE0LDI1MCwyNTAsIDU4LCAgOSwKKyAgICAgIDQsIDQ0LCA0NSwxNTAsMTk3LDE3NiwxNzcsMjEwLDEwNSwxMTksIDcyLDE1MywxMjYsIDU2LDE1MywgOTcsCisgICAgIDM2LDE3OSwyNTAsMTc3LDEzNCwyMTUsMTYxLDE0MCwxODgsMjM4LDE1NSwgOTUsMTgxLDIzNCwgNTgsIDE2LAorICAgICAyMSwxMDIsMTE5LDI1MywgMzIsIDIwLCAxOCwgODQsMTM2LCA3OSwxMTksMTAyLCA3OCwxMDQsMTI1LDEwOSwKKyAgICAyMTIsIDk1LDIxOSwyMTgsMjE3LDIzMywyNDUsMTgzLCA4NiwgODcsMTc1LDE4MSwgOTEsMjIxLDExMCwxMTksCisgICAgMTE4LDExMCwxMTAsMTIyLDEyMiwxNjYsMjExLDEwNSwgNTUsMTU1LDE3MywgNzAsMTYzLCAxNywgIDQsICAxLAorICAgIDE2OSwxODAsMTk3LDExMywxMDUsMjM3LDIwOCwxNjEsMjE4LDEzMywgMjQsMTcxLDI0MCwyMjksMTcxLCA0OCwKKyAgICAxNzksMTYzLDEwOSwxNDYsIDM2LDExMywgMjgsMTQxLCA3MCwxNjMsMTI2LDEyNywxNzYsMTg1LDE3NywxNzcsCisgICAgMTgyLDE4MiwxODIsMTkwLDE5MCwxOTgsMjA0LCAgMSwgNzUsIDkxLDE2NCwgMzcsIDU2LCAyNywgNTQsMTUwLAorICAgICAyNywxNzMsMTQyLDE5NywgODYsIDk2LDE1NSwgMTcsMjE0LDE3OCwyMzUsMjI1LDE2MiwyMzYsMTkyLDE1OSwKKyAgICAxMTIsIDY1LDE0MSwxNzMsIDczLCAxOSwgOTgsMTAyLDIzOSwgMTUsICA1LDE2NCwgMjAsICA2LCA3MiwgMjksCisgICAgIDUzLDEyNSwgNzAsMTY2LCA4NiwxNjMsMjI1LDIzNywxMDQsMTg0LCA1NywyMjAsMjIwLDIxOCwyMTgsMTg1LAorICAgIDExNSwyNDMsIDU0LCA1MiwxOTQsMTAyLDE3OSwyMTcsMjM3LDExOCwxNjcsMTY2LDE2NiwgNTgsMjIxLCA3OCwKKyAgICAxNzksMjE3LCAxMCwxOTUsIDQ4LCAgOCwgIDIsIDIxLCA0MCwxODMsIDE0LDIyNCwxNDUsMjAwLDE5MSwxOTIsCisgICAgIDUyLDE0NywyMTMsIDkwLCAzOSwgNzMsIDE4LDE5OSwyNDEsMTEyLCA1NiwyMzIsMjQ3LDEyMiwyMTksMjE5LAorICAgICA1OSwyMTksMjE5LCA5MSwxODksIDk0LCAxNSwgIDAsICAyLDE1MCwxMzQsIDY0LDE5MiwgNTAsMTY1LDEzMCwKKyAgICAyNDksIDcwLCA5OSwxOTMsMjM4LDEyMywgMjIsIDM0LCAgNiwgNzIsMTM4LCA0OCwgIDAsIDM2LDE4NywyNDQsCisgICAgMTc3LDE1MCwgOTMsIDE1LCA5NSwxNDMsIDI5LDIyMCwxMTUsMTc2LDI0NiwxNDMsMTQ3LDEwMywxNTIsICAwLAorICAgICA3NiwgMzQsIDcwLCAzMiwxNTQsIDM2LCAgMCwgMTIsIDY4LDE0MiwxODMsIDU4LCA0MywxNDEsMjE0LDEzNiwKKyAgICAxMjEsIDUzLCAzMCwxMTAsMTk2LDIwOSwyMzAsIDc4LCA0NywyMzMsIDE1LDIxNCwgNTUsIDU0LDExMCwgIDMsCisgICAgIDUwLCAgMiwgNDAsIDEwLDEzMSwxNzYsMjA5LDEwOCwxMzIsIDk3LDEwNCwyMzAsIDQzLCAzMSwxNzcsMTkzLAorICAgIDIwNCwgODEsIDIwLDE0MSwxMzQsMTYzLCA1NiwxMzcsICAxLDEyOCwgIDQsIDcyLDEyOCwgNjQsMjE4LCA0NCwKKyAgICAgNzQsMTAwLCA5MCwxMzMsIDUxLCA5NywgNTYsIDIzLCA1NCwxNTUsIDY4LCAgMSwgODIsMTI4LDEwNCwxMzgsCisgICAgMjMzLDIwNSwyMTQsIDY1LCA0MiwxNzEsMTY3LDE2OCwyMDEsMjQ1LDI0NiwgNTcsMjAyLCAgMywgNDIsMjI2LAorICAgIDE2OSwyNDksIDUzLDE3NywgNjYsIDQ0LDExMSwxNjgsMTcwLCAgMCwgMjQsIDY5LCAzNSwgNTMsIDcyLCA1OCwKKyAgICAgNzQsMTU3LDEwNCwxMTgsIDE4LDE0NSwxNDEsIDM2LDIxOCwgNzQsMTYyLDE5MCwyMTQsIDY3LCA3OCwxNjIsCisgICAgIDM2LDIxNCwgODEsMTQ2LDI0NCwgIDcsIDM1LDE5NCwgNzEsMjQ4LDE3NiwgIDQsIDQ0LCAgMSwxMjgsIDE4LAorICAgICAgOSwxNDUsIDkwLCA3NCwxODEsIDcyLCA3NywgNTUsMTk0LDE1MywgNDgsIDg0LDE0NCwyMTAsIDc0LCAzMywKKyAgICAxNzAsIDQ0LDIyOCwyMDIsIDM5LCA3MCwxMDgsMjM0LCA5NSwgNjMsMTgzLCAzOCwgIDAsMTAwLCAxOSwxOTcsCisgICAgMTc1LDIxOCwgODMsIDMwLDEwNCwgMTYsMTQ4LCAyNiwgMzAsIDY2LCA5NiwgNjUsMTMzLDE5NCwgMzQsIDEyLAorICAgIDIwMCwgIDIsIDkwLDE2NCwgNjksMTA2LDE4NSwyMDksIDk4LCA0OSwgODcsMjAyLDEwMiwgMTgsMTM5LDIwMCwKKyAgICAxODIsMTQyLCA2OSwgMzAsMjA1LCAgNywgIDYsICAxLDE2NiwxNTQsICAxLCAgMiwgNzgsICA3LCAzMywgIDEsCisgICAgIDgwLCA3NCwgNDAsIDM2LCA2OCwgODMsIDYxLDE3NSwgMTYsIDQxLCAxMywgMTYsIDE3LCAzMywyMTksMjQ0LAorICAgIDE3MiwgMzgsMjE1LDE5MywxNjAsICA4LCAzOSwxMzAsIDE0LDE4MSwyNTQsIDU4LCAgNCwgMjAsICAzLCAgMCwKKyAgICAxMDEsIDg2LCAyOCwxNTMsICAwLCAyNywxMjksIDY5LCAyNCwgNjQsIDY4LCAyNCwxMzIsICA1LCAgNCwxNjQsCisgICAgIDY5LDEyOSwxMjgsMTcyLCA2NCwgOTEsMTA4LCAgNSwxOTAsIDYwLDExNCwxMzUsIDM0LCA5MywxNjIsMTA5LAorICAgICA1NSwgNzAsIDQ5LDIzOSwgIDksMjEwLDExMCwxNzAsMTAwLDE5MSwgODQsIDExLDE3NCwgNzMsMTAxLDIyMiwKKyAgICAxMzEsMTI3LCA3NCwgMjIsMjQ5LCAzNywgNTAsMTgyLDExNCwxODcsMTI2LCA1NCwgNzYsMTM0LCAyOCwgNjcsCisgICAgICAxLCA4MSwxMzYsMTY2LCAyMSwxOTAsICAwLDE3NiwyMjEsIDE0LDIwOSwgMzMsMTUxLCA2MCwxNjIsMTk5LAorICAgICAgMSwxMjUsMTM4LDEyMSwyMDQsICAyLCAzOSwyNDQsMTc1LDE1OSwxNzEsMTQ3LDIzMywgMjksIDMxLDI0OCwKKyAgICAgNTEsIDUxLCA0MCwxOTIsMTA3LCA2MywgMTcsMTAzLDI1MywyMjgsMTIwLCA5MSwgNDEsMTAyLCA2NiwxNzcsCisgICAgMjQ0LDEyOSwgMTgsICAwLDE5NSwgNTAsMTI4LCAyMCwxMDMsMTQzLDE3MCwxNzcsMTE5LDI1NCwxMjQsMTgzLAorICAgIDEzOCwxODEsIDU0LDEzNywgMTksIDc3LCA0NCwxODcsIDczLDIzMSwgNjUsIDYxLCAzMywgIDMsIDMxLCA5NCwKKyAgICAxMDIsMTcxLCA2NCwyNDQsMTgzLCA2MywgNzgsMTkxLCA5MiwgNjMsIDM2LDE0NywxNjgsMjAwLDIwNCwxMzEsCisgICAgMTQ3LDIwMywxNDIsIDY3LCA5MiwgNTAsMTEzLCA4NywxMzQsMTg2LCAgNiwyMTQsMjI1LCAgMSwxNTMsIDI4LAorICAgICA5MiwgMjEsIDY5LDIyNCwgIDMsMjExLDIyOCwxMTQsMjI2LDIzNiwgNzMsIDQ3LDE4NywxOTQsIDExLDIzNSwKKyAgICAgIDgsMTI3LDE2MiwxODAsIDczLDE3MywgNjgsMjM0LCA0OSwgIDksMTg2LDE3MSwxNTYsMTkyLDEwMiwgNDIsCisgICAgMjMyLDE5MywyNDIsIDM0LDExMiwgNDksMjAxLDEwOCwxODYsMjI5LDEyMSwgNzgsMTgxLCA2MiwgMjUsMjM0LAorICAgICA4MSwxNDMsMTIyLDIyMCwxODEsMTE1LDE4MCwgMzIsMjAzLDE1MiwxMTcsIDE2LCAyMiwgNDYsMTc1LDExNywKKyAgICAgMjAsMjQ2LDE1NCwgMjAsMTMxLDE3OSwxMTksMTA2LCAyMiwgNTksIDMyLDIxMiwgNzYsMTcxLCA3MSwgNjEsCisgICAgMjM0LDE3NywgNDcsMTM2LCAgOSwyMTYsMTUzLCAzNywxNzYsIDkzLCA1NiwgMTUsMjA2LCA2MywgMTAsIDUxLAorICAgICAgMywgIDgsMTYwLCAzMiwxNTIsIDg1LDEwMiwxOTIsIDg5LDExMSwgMjIsMTY5LDI0NiwgNDQsMTMzLDI1MywKKyAgICAyMzQsMjM1LCA4MSwxNDMsMTIyLDIxMiwyMjAsIDc0LCA1MywgODcsMjIyLDE3NCwyMDYsIDgyLDIzNiwgMzIsCisgICAgMjMxLCAzMSwxNTMsIDg5LCAxNiwyMDUsMTIzLCAgMSwxODAsMTczLDEzOCwgNTcsMjM1LDIwNCwxNDMsMTU4LAorICAgIDI0NCwgNTAsMjQ4LDE3MCwgODMsMjUzLDEyMiwyMTIsMTYzLCAzMCwgNDYsMTg4LCA1MCwyNTUsMjMwLDE4OCwKKyAgICAgMjUsMTU2LDEyOSwxMzYsIDQ1LDEyMSwgNTcsIDE2LDEyNiwgNDksMTI4LDE0NCwgNDgsIDE4LCAgMSwgMTAsCisgICAgMTY0LDE0OSwgNjksIDM0LDEzMCwxNDQsMjA2LCA3NSwxNTQsMTczLCAxNiwxNzYsIDU0LDE0NCwyNDUsMTY4LAorICAgICA3MSwgNjEsIDYwLCA0NywyMzAsMjMzLCA0NywxMTIsMTUzLDEwMSwxODMsMTU3LCA0OSwgMzEsMTMwLDIxNywKKyAgICAyMzMsICA3LCAyNCwgNjgsIDU3LDI1MiwyMTAsIDkwLDEzOSwxMDQsICAxLCA2NiwgOTYsIDgzLCA5OCwxOTYsCisgICAgMTQ2LDIzNywyMDQsMTgxLCAxMSwxNzksMjA4LCA3OCwgODksMjE0LDE2MywgMzAsMjQ1LDEyMCwgNjAsMjE3LAorICAgIDEzMywgODksIDU3LCAzNCwxMjgsICAwLCA0OCwgNTYsMjA0LCAgMiwgOTYsICAxLCAgNiwgOTcsIDE2LCAgMSwKKyAgICAgIDgsMTMwLCAgNywxODUsMjMwLCAzOSwyNTUsIDg5LCA5MCwxMDcsMTAxLCA4MiwgNDcsIDIwLCA1NCwxMDEsCisgICAgMjA1LCA0NCwgMzQsIDEyLDIwNCwyMzgsMTI1LCA2OSwyMTYsIDI3LDE1NywgNTMsMjAzLDIzNCwgODEsMTQzLAorICAgICA3MSwgODcsIDk5LDIzNywyNDYsIDM3LDE5OSwgNDgsMTY2LDIwNCwgNTAsMjM1LDExNSwyNDksICAwLDEzOCwKKyAgICAgMzksMTE0LDEyNiwgIDUsIDY1LDE5MiwgNzMsMTYyLCAxNywgNTMsIDQ5LCA0MSwgNjksIDcyLCAgOCwgNzIsCisgICAgIDM0LDE2MiwgODksIDY4LDEyOCwgIDUsMjM2LDE4NiwgMTMsMjExLDE3MiwgNTUsIDExLDIzOSwyMzUsICAyLAorICAgIDE3NiwxMjIsMjEyLDIyNywxMTMsIDI0LDIyMiwxNDYsMTA5LDI0NCwxODcsIDc1LDIzMCwyNTEsMjE0LCA3NCwKKyAgICAxODIsIDczLCA2MCwyMTksMjA1LDE1MSwgODMsMTMyLDEzNywgNDgsMTM2LDEzNiwxODQsMjUzLDE1NywxMTIsCisgICAgIDk1LDEyMCwyMjAsICA3LDE5MSwxODYsMjIxLDIzOCwxMDksIDY5LCAyMCwgMzcsICA5LCAgOSwxNzcsMTQ0LAorICAgIDIxNywgNzEsIDkzLCAgMCwxNTIsMTMzLDIxNywgMjAsMTIwLCA5MSwxMjAsMTY1LDE1NywxMjMsMTc3LDIzMCwKKyAgICAgODYsIDYxLDIzNCwyNDEsIDU2LCA0MywgNTAsIDQ0LCA4MCwgNzEsICAwLDEyOCwxNTcsMTY5LCA3MCwgIDYsCisgICAgIDQ4LDE4OSwgODIsIDQ0LDE5NCwxMjgsIDI3LCA5NywgMjQsMTMyLCAxNSwgODAsMjUxLDE2NSwyNTIsMTU0LAorICAgIDE1OCwxNTgsMjE0LCAgMCwgNzMsIDE4LCAxOSwgNDIsMTczLCA1NiwyMjEsIDc0LCAyOSwgMzIsMTgxLDE3NywKKyAgICAxMDUsIDMzLCAgNSwgODAsMTg2LCA4MywxNDksMTYwLDE2MCwgOTMsMTgxLCA5OCwgMzUsMjUzLCAyNiwxMDMsCisgICAgMjQ1LDE2OCwxOTksIDk5LCAgOSwgNDksMjQ0LDIwNSwgOTksIDcwLCA0MywgNDUsMTYyLCA5MywyNDEsICA1LAorICAgICAgMiwgNjgsMTQxLCA3MCwyMjcsMjIyLDIyMSwxMDUsMjMzLCA3NSwgNDEsMTkxLDIzMCwxMDIsMjMxLDIyNiwKKyAgICAgNzAsMTYwLCA1NCwgOTgsIDM0LCA3NywgMjgsIDE2LDE2NSwgMTgsIDEyLCA2OSwxNDAsMjU0LCAgMiwgMTYsCisgICAgMTE1LCA3OSwyMDksMjE4LCA3MCwxODcsMTM0LDIxNCwxNzIsMTU1LDE3MiwgMzUsMjUyLDEyMiwyMTIsMjI3LAorICAgIDI0MSwgMzIsMjE0LCAyNCwxNjQsICA4LDEwMCwyMTEsMTQxLDE5NCwgMTQsMTg1LDE4MCwxMzYsMTUwLDIxMiwKKyAgICAgNzgsIDc0LCAyNCwgODQsMjQwLDE3MSwgODQsIDgwLDEyOSwgOTksIDYzLDE5NywxMDYsMjUzLCA1MywgNTMsCisgICAgIDYxLDE2NSwgOTEsMjA1LCAzNiwxNDIsIDIxLCA0MSwgOTgsIDMzLCA5OCwgODQsIDEwLDE0MCwgIDYsMTQ3LAorICAgIDE4MCwxNDQsIDIxLDIzNywxMDIsMTIxLDIyOSwgNTUsIDQxLDI1MywxOTAsMTU0LDEwMSwyNDUsMTY4LDE5OSwKKyAgICAgMzUsMTM0LDE3MywgIDIsMTE0LDIwMiwgMzIsIDUxLDE1OCwgODEsIDExLCAyNCwxMjAsMTA1LDE0NSwgNjgsCisgICAgIDg4LDEzMSwgNjUsIDI0LCAgOCwgIDAsICA0LCA2NSwgMjQsMTM0LDI1MSwxNTAsIDg5LDEyMywxMzUsIDk4LAorICAgIDEwNSwxNTAsMjE0LCAgOCwgMjcsMjI1LDE5NCwgOTIsIDE4LDE5OSwxMTMsIDIwLDE5NywgODEsMTQ4LDE5NiwKKyAgICAxNDUsMTQyLCA5OSwxNTcsIDM2LCA1OCwyMDksMTcyLCA4OSwxMzIsIDE3LCAgNCwxMTUsMTMyLDE2NSwgNzMsCisgICAgIDI0LDI1MCwxOTcsMTcyLDExNywgODEsIDg4LCA2MSwyMzQsMjQxLDE4NCwgODEsIDQ1LDE0MywyMzgsMTk3LAorICAgIDE1MywxMDksIDc2LDIwMSwxOTcsMjE4LDIzNCwgNDcsMjI3LDIwNywxNjgsMjE5LCA4MSwgNzQsMTkzLDE5MCwKKyAgICAyMjcsMTIyLDE3MiwyNDgsIDc3LCAzNywxMjYsIDMzLCAgMCwgMTgsMTc0LCA2MCwxMTcsIDU0LCAyMiwxNDIsCisgICAgMjI3LCA0MCwxMzcsMjI2LCA1NiwxMzgsMTQ3LCA0MCwyMTQsMTEzLDE5NCwgNTgsMjI1LCAzNiwgMTcsMjA1LAorICAgIDE5NCwxMDUsICA5LCAyNCwgOTgsMTkwLCA3NywxMjMsMjUwLDEzNCwgMjEsMjQ4LDE3MCwgODksIDg2LDE0MywKKyAgICAxMjIsIDYwLDIxMCwyMDQsMjQyLCA1OCwxNTcsMTAwLDEwNSwgNjEsIDY3LDIzOCwgMjUsIDE5LCA1NCwgMTgsCisgICAgIDQ0LDE3MywyNTIsICAyLDE2MiwyNDYsMjUyLCA0NCwyMzgsMTgzLDI1NCwxMjYsMjE1LCAzMCwxODYsMTUyLAorICAgIDI0MSwyMDMsIDk0LCA1OCwxMTcsMjUwLDE4MCwxNTgsMjM0LCA3MCwxNjMsIDQwLDEzOCwgNzAsMTQyLCAxMCwKKyAgICAgNzUsIDg4LDEwNywgOTcsIDc4LCA3NSwgNDAsMjA4LDIzOCwxMzcsMTQ0LDE1MywgNzEsMTE2LDEwMCwxMDAsCisgICAgIDQ1LDE5MywyMzQsIDgxLDE0MywgNzEsMjE4LCA2MCwgOTgsIDk0LDE3NiwgOTAsIDYwLDIyMSwxNzksMjI4LAorICAgICA2MiwgMTcsIDc4LDE3MiwxMjEsIDc2LDEzMiwxODEsMTEyLDE1NCwxMzksIDUzLCAyNywyMTEsIDgzLDIxMSwKKyAgICAxMjMsMjUzLDExMiwxOTEsIDUyLDE5MSwgODAsMTYxLCA4MSwyMjYsIDc1LCA5NCwxOTEsMTg2LDE3OCwxNzgsCisgICAgMTk0LDE3OSwyMTEsMTI0LDI0NSwgNTgsMTA1LCA2OSwxMzgsIDczLCA0OSwxMTQsICAwLDEzOCwgMjEsMTQ1LAorICAgIDIxNywyMzIsIDI0LCA2OCwgODAsMTk2LCA1MiwgMjksMTAzLCA0OSwgOTMsMTk4LCAzNywyMDUsMjQyLDIwOSwKKyAgICAyNDQsICAwLDI0NSwgODYsMTE1LDIxNSwgNDEsIDg4LCA2MSwyMzQsMjQxLCA3MiwyMTAsIDEyLCAyOSwyMjAsCisgICAgMTUyLCA3OSwgMjQsMTkyLCA3NywyMzUsIDEzLDE4NSwgMTgsIDM1LDE5MCwxOTYsIDU0LDE2MiwxMDQsIDUzLAorICAgICA1OCwxNTcsMTgyLDI1NSwgNTEsIDkyLCA1OCwyMjUsMjM4LDE5OCwxNzMsMjQyLCA0MywxMjEsIDQ1LCA4OSwKKyAgICAxNzEsMjEzLDIzNCwxNTYsIDYxLCA5OSwxMjYsMTAxLDE3MiwxMTcsMTU2LCAzNiwxMTMsIDIwLCAzNywgODEsCisgICAgMTY0LDIyNywxNTIsMTgxLDEzNywyMjUsMTcyLDEzMywxODAsMTU1LDE4NywyMjgsIDIyLDE3OCwxNTAsIDk2LAorICAgIDI0NSwxNjgsMTk5LCA5OSwgMzIsMTkwLDE4OCwgNjIsIDE0LDEwMiwyMDEsMTQ0LDE2NCwxMjMsIDQ3LDExMiwKKyAgICAgNzgsIDQ2LCA3MywgNjgsIDk4LCA1NCwgIDgsMjI3LDE3MiwyNTUsICA0LDIwNSwgNzYsIDQzLCAyMSwxNDgsCisgICAgMjI1LDIyOSwxNjgsIDQ3LDI1MSwxNzksIDE3LCAxMSwxNDcsICAzLDIyNywxNTAsMjUzLCA4MCwgMTQsIDYyLAorICAgIDE5NiwxNjcsMjIzLDI1MSwgMzAsMTUyLDE1OCwgNzQsMjE2LDIyMCwgIDMsIDc4LCA2OCwgMTgsMTAyLDE1NywKKyAgICAxMDQsIDI5LCAzOSwxNTYsMTA0LCA5NiwgIDYsMTQ1LDE3MiwxMjAsMTMwLDE5MiwxMDgsMjUwLDE0NiwgODksCisgICAgIDcyLDE5NiwxNDYsMTAzLDE3MywgODksIDg2LDE0MywxMjIsIDYwLDEyMiwgNDQsIDY3LDE1OSwgNDcsIDM4LAorICAgIDE4NSwyMTUsIDMyLDEzNCwgOTIsMTM3LDExMiwxOTQsIDI4LDEzOSwxOTYsMTQ2LCA0NywyMTksMTM0LCA3MCwKKyAgICAgNTYsMTg3LDE4NCwgODgsICAxLDE3NCwxMTQsMjQxLCAgNCwgNjYsMTA1LCA5NCwgMTYsMTcxLDE5MSwyMzgsCisgICAgMjM0LCA0NywgIDQsMTI0LDIzNCwxNjksMTY3LDI0MCwxMzcsMTQ3LCA3MywgNDYsMjU1LDIxNiwgNTgsIDg4LAorICAgICA5NywgOTcsMTAyLCAgNiwxNzcsMTU1LDE5MCwyMjgsMjA5LDEyNSwxMTgsIDQ5LCA3OSwxOTYsMjQ2LCA4NCwKKyAgICAxMjUsMjQ1LDE2OCwgNzEsIDYxLCAxNCwxNTksMjQ4LDI0MiwxMjAsMTQ3LDE1OSwyMTcsMTAyLCAxOSwxNzIsCisgICAgMjA0LCA1NCwxOTgsMjA0LDE3NywxMTIsIDM0LDIwNCwgMjIsIDk1LCAxMiwxNjAsMTY3LDE4NiwxMTUsMTc5LAorICAgIDE3OSwyMjIsIDI2LCAzNiwxODAsIDkwLCAgNywgNTEsIDI3LDIzNCwxMjUsIDI1LDE3OCwxMjcsMjMyLDI1MiwKKyAgICAxMDYsMjQ0LDIzOCwgMjYsMTg1LDE4MiwxNzUsMjEzLDEwOCwgNDUsMTg5LDIzNSwxODgsIDE0LCA0MCwgMTcsCisgICAgMTQyLDE0MSwgIDIsMTAwLCA3MywgNjgsMTgwLCA0OCwxMDMsMjA1LCAxOSwgMTcsIDE2LDEyOCwgODIsMjUzLAorICAgIDIyOSwgNzUsIDQ4LDEwMywgMjMsIDQzLDE3MiwgMTcsIDg2LDE0MywxMjIsIDYwLCA5OCwgNDQsMTk1LDEzOCwKKyAgICAgMjQsMTU3LDE1NywgODIsMTc1LDEzMiwgODMsMTIwLDE5NywyMDQsIDQ5LDE3OSwxMDUsICA0LDE5OCwgIDAsCisgICAgIDY0LDIxMiwgODgsMTUyLCA4MywxNjUsMjA2LCAxOSwgMjUsMTk0LCA0OCwxOTksMTQ3LDE1NSwxNzAsMTg1LAorICAgIDI0OCwxMTYsMTcyLDE1NywxMzEsMTc3LDE5MiwxOTcsIDEyLCAzNCwxOTAsMjQ3LDEzMSwgMzEsMTg0LDI0MSwKKyAgICAgMzEsMTkxLCAxNywgOTUsMTg5LCA3MywxOTIsIDY4LCA2NCwxNjYsMTUzLCAzMywgMTYsICAwLDE4NywxNDEsCisgICAgMTk5LDE1NiwxNTMsIDcxLCA2OCwgIDEsICAyLDE0NCwgNTIsMjI4LCA3OSwyNDcsMTg5LCAyMywyMTYsMTAxLAorICAgICA3NywgODEsIDI5LDIzNSwyMTUsMTYzLCAzMCwxNDcsIDQ3LDE4NSwgNDIsMTk2LDE1MSwxNjcsMTU1LDEwOCwKKyAgICAxNDcsMjQ5LDIxMiwgNTcsIDI2LDExNCwgIDksIDcxLDIwNCwxNzcsMTc2LDIxNiwgODAsIDk1LCA2OCwxODQsCisgICAgMjExLCA1OCwxNzgsMTc4LDIyNiwgNTcsMjA4LDIwMiwgOTUsMTA3LCAgOSwxMzQsIDY5LCA5MCwgOTAsMTg3LAorICAgIDEzOCwxOTcsMjE5LDE0NiwyMzksMTA3LCA5NywxMjEsMTA1LDE2OSwyNDMsMjM4LDI0MywxMzcsMTUyLDE4NywKKyAgICAgMzQsICA2LDE2NSwyMTQsIDY2LCAxMCwgMTEsMTI4LDE1NywxMTIsMjA0LCAzNywgMjQsIDk4LDI1NCwxNjksCisgICAgMjM5LCAzNCwyMzUsIDMyLDE3MiwgMzAsMjQ1LCA1NiwxMDgsMTYzLDEyMiwyMjcsIDMwLDE4MywgODIsIDQyLAorICAgIDEzMywxNTEsICAwLDE2NywyNDAsIDI4LDExMCwyNTAsIDY5LCAgMCwgIDAsIDMyLCAgMCwgNzMsIDY4LCA2NSwKKyAgICAgODQsMjI2LCA2OCwgNTYsIDE4LDE0MiwgNTYsMTMzLDE1MSwyMDYsMTg2LCA4MCwxNTIsIDMxLDE4MywgNDgsCisgICAgMjE1LDExMCwxODMsMjA5LDIyNywgMzEsMjMwLCAxOCwgMTIsMjQzLDE5MiwgNjIsMjE5LDE0MywgNTYsMTU1LAorICAgIDIyMSwxMTYsMjM0LDIyOCwxNTcsMjQ5LDEzMSwxODgsMjU0LDE3MSwxNDQsMTM1LCAxNywxMjUsMjQwLDIyNywKKyAgICAgNDcsMjA5LDI0MSwgMzUsMTUzLCAgOCwyNDQsIDE2LDEwMiwxNTUsMTQ0LDEwMSwgIDgsIDM2LCAgNCwgNTAsCisgICAgIDYzLCAgNSwgNjAsIDIzLDIzMywxMDgsMTM3LCA5MiwgMzUsMTcyLCAzMCwyNDUsIDU2LDIyMCwxMjIsIDEyLAorICAgIDI0MywxNzAsIDc5LDE4NywyMjksMTA0LCA5MCwxNzksMTU0LDIxNCwxNjksIDI2LCA4NiwgMjQsMTMyLCAzNywKKyAgICAyMDQsIDk4LCA1OSwxMjcsMTM3LCAgOCwxMTksMjE5LCA0MywxOTksMTQzLDEyMywgODUsMTcxLCA0MSwxOTMsCisgICAgMjA4LDI0MywxNDMsIDIyLCA4NCwgNDYsMTg3LDExNCwxMTQsMTg0LDExMywgMjQsMjI4LDEyMSwgMjQsMTAxLAorICAgICAxOSwgIDksMTA0LDIzOSwyMjgsMTc3LCA5OSwxOTksMTg2LDIzOSwxMjEsMTAzLDE5NCwgOTgsMjEyLCA5NiwKKyAgICAxMDgsMTY3LCAxOCwgNDQsMTk0LCA1MCwyNTEsMTUxLDE0NiwxNDcsMjA4LDE5MCwxNTMsMjAzLCAzNywxMzIsCisgICAgIDY1LDE0OSwgMTAsMTczLCA3MSwgNjEsMjM0LCA0OSwxNzcsMjU0LCAxNywxOTksMTU3LDE3OSwyMzIsMTk0LAorICAgICAxMSwgNzYsMTgxLDEwNiwxNTYsMTM5LCA0NywgMjksMTc3LDE4MiwxMzMsMjQ4LDE0NCwgNTQsIDYyLCA5MywKKyAgICAxNTIsMjM1LDExOCwxODcsICAwLDEzMywgOTQsIDIxLDIyNCwgODMsIDM2LDE1NywgMTQsMTE2LCAgNiwxMjgsCisgICAgMTgzLDIxOCwxOTksMTg1LCA5MSwyMDYsMjA3LCAzMiwgNzEsMTk3LDIxNywxMDgsMTU4LDIzMiwgOTksMTU5LAorICAgIDI1MiwgMjcsMTE2LDI0NiwgODQsIDMzLDE0MSwgNTEsICA4LCA5OSwyMjUsMTE2LCA1OSwgMzQsMjA0LDE5MywKKyAgICAxNTYsIDI3LDIwMSwyNDQsIDU1LDEwMiwxNTYsIDcwLDE3MiwyMDYsMjQyLDEwNywxMzIsMjEzLDE2MywgMzAsCisgICAgMTQ3LCAzMCwxMjgsIDk3LDIwMSwgNTcsMjMwLCAzOCwgODMsMTkyLDEwMCwyNDYsIDQ5LDE2NywyMjgsIDI2LAorICAgIDE3NywxNDIsMTUyLCA1MSwgOTMsMTAyLCA0MiwxOTQsMTQ2LDE1MywxNjksIDk5LDE2NywgNzgsMTg2LCA2NiwKKyAgICAgMzgsMjI5LDEzMSwxMzEsIDQxLDIwNywxNzQsMTIxLDIzNSwgMTgsIDI5LDExOCwyMjksIDMwLCAxOSwxMTUsCisgICAgMTc3LDIyOSwyMTUsIDc5LDIyOCwgNDIsMTEwLCA5NywxMTMsMjQxLDIzMiwgIDcsIDk1LDIwOCwxNzMsMTM0LAorICAgIDEyOSwgODcsIDM2LDIxOCwgMzIsMjA0LDE0OCwxMzQsMTUzLCA0NCwyMDQsMjQ4LDIwMCwxMDgsIDQ1LDE4MywKKyAgICAgNzMsMTkwLCAgOCwyMTEsMTY5LCA3MywxOTYsIDYxLCAxNywgODYsMTQzLDEyMiwyMTIsIDk5LDIyNiwyMTYsCisgICAgMTMzLCAyMSwxNTksMTIzLDE0NywxMjksMTA1LDE4MSwgIDQsMTM2LDE4MiwyMDIsIDM4LCA5OCwgNjEsIDk4LAorICAgIDE0MiwxNTIsMTE3LDIxOCwxMjEsMjEzLCA2OCwgOTksICAyLDEyOSwxMDYsMTcyLCA0NCwxODEsMTU0LCA0NSwKKyAgICAxMTIsMTIyLDIxMywgMjAsMTI2LDEzNywxOTUsMTY4LDE0MCwxMDQsIDE0LDIyMCwyMDgsICA3LDEwNCwxMzgsCisgICAgMTQ5LDI1MiwxMTUsMjA3LDIzNywxMDEsMTMyLCAzNSwxOTYsIDE1LDE5MSwyNDgsIDk4LDExMiwyMzgsMTY5LAorICAgICA3NiwxMjcsMTY1LCAgOCwgNzUsMjAzLDEwNiwxOTcsIDI0LDIwMSwgODQsMTk0LCAyNSwxMDIsMjI5LCAyMiwKKyAgICAgNTAsMTg5LCAgNiwyMDUsMTIzLCA3OSwyMjIsMTg1LCAgOCwxNzEsIDU3LCA4NiwxNDMsMTIyLCA3NiwgNDYsCisgICAgMTg4LDE1NiwyNDksIDY0LDE3MSwxODUsMTA4LDE1NywgNjEsIDkxLDEyMCwgNjksMTk0LCAzNSwyMTQsMjMwLAorICAgICA0NSwxNTcsMTE1LDE0OCwgODQsMTI3LCA0OSwgNjQsIDUwLCA1NSwxMTUsMjQ0LDI0OCwxMTMsMTE2LCAgMywKKyAgICAxMjMsIDM5LDE2NywgNDcsMTkzLDIwMiwgMTQsIDQyLCA5NCwxNDUsMjE5LDIwMCwgNjYsMjUzLDEyNywxNTQsCisgICAgMTI3LDE4NSwyMTEsMTMzLDI0NiwxNTAsMTczLCA4NiwyMzUsMjQ5LDE1OSwyNTEsIDM2LCA0NCwgNDUsIDY4LAorICAgIDIwNCwxNDUsIDY5LCA4OCwxOTYsIDU4LDExOCwxMzksIDkwLDE1NywxNjksMTM4LDE4MCwgNDAsMjA0LDE1MywKKyAgICAxMzYsMjA0LCAxNiwgNzAsIDk5LDIyNywyNTIsIDI2LCA5NywyNDUsMTY4LDE5OSwxOTYsMjE3LCA3MCwgMjQsCisgICAgIDUxLDIzNywgMzgsIDg2LDEyNCwxNTMsMjI5LCA2NSwxNDUsMjQwLDEzNiwyMDUsIDkxLDIzNCwgMjgsMjIxLAorICAgIDExMCwyNDcsMjEwLDExMCwgNDYsMTU4LCA2MiwgMjUsIDQwLCAgNSwxNTgsMjE0LCAgMiwxMTIsMTIxLDE4MCwKKyAgICAyMDcsMTQ1LDEzNywgNDYsMTU1LDIyNiwxMDMsMTcxLDE5OSwyMDEsMTI5LDE1MywxMjMsIDM1LCA2OCwxOTYsCisgICAgIDM5LDE1OSwxMjQsMTE0LDIzMywgOTksIDMxLDIxMiwyMDUsIDcwLCA1NCwxNzksIDE2LDIzMSwxOTcsMTgxLAorICAgIDE2MiwxMDksIDgxLCA2OSwxNTAsMTM0LDE2NSwxMzAsMjAzLDI1NCwyMDIsIDEyLCA5NywgIDgsIDk5LDEwMywKKyAgICAgMzYsMjM1LDIyOSwxNDYsMjQ1LDE2OCwxOTksMTAwLDE5MiwxNzEsIDg4LDI0NiwgODUsMTY4LDExOCwgNTUsCisgICAgMTkzLDE1MCwgODksMTU4LDE1NywxOTUsIDc1LDIzNSwgMzMsMjM1LDE0NSwxMzcsMTg5LDIzNiwxODIsIDI5LAorICAgICA5MCwgNjgsICAyLCA2OSwxOTksMTQyLDIwNCwyMDYsMjA2LDEyOSwgOTUsIDMwLCAgMSwgNzgsIDU2LDIzOSwKKyAgICAxNjUsIDk2LDE2OSwyNDAsMTYyLCA0MiwyNDksMTQ5LDE3MSwgNDcsMTE2LDIxOSwgOTQsIDMyLCA2NCwgOTAsCisgICAgIDYzLDIyNSwxNzQsICA0LDExNCwxNzYsIDcyLDE2NCwgOTQsMjUyLDE5NiwgMzksMTU0LDIzOSwxMjUsMTAzLAorICAgIDEzNCwxNzMsMTM2LDEwOSwxMzcsMTM1LDE3MywyNDIsMjA4LDIyNiwgODYsIDg0LCAyNCwxMzIsMTI5LDIzMSwKKyAgICAgMzcsMTkzLCA3OSwyMjUsMTc2LCA3NiwyNTAsIDI2LCA5NywyNDUsMTY4LDE5OSwxNjQsMTk1LDIwMywyNDYsCisgICAgMTUwLCA3MiwgNjksMjA0LDEzNiwxODEsMTMzLDE1MSwgMjIsMjAwLDE1NCwgMjMsMTY2LDI1MSwxMTksIDM2LAorICAgIDIwMywgMTEsIDM5LCA3OCwxNTcsMjQyLCAyMywxMjYsIDk5LDIxNywgNjAsMTg2LDIzNiwgMzQsICA3LCA5NSwKKyAgICAgODQsIDY5LCA0OSwgMjMsIDM0LDIxNywgNzksMTYyLDE4OCwgIDIsMTk1LCA3MywyNTMsMTc5LCAzMSwgMjUsCisgICAgMTM0LDIyNSwxMzksMTI3LDI0MywyMzEsMjMzLDIwMSwyMTEsIDU3LDE4OCwyMDQsICA1LDIwOSwxMzQsIDk4LAorICAgIDE1MywxNDUsIDIwLCA3MSwgODIsIDE3LCA4OCwgMzMsMTAyLCAxNywyMzAsIDIzLCA4NSwgOTYsIDIxLDE5NCwKKyAgICAxMDYsMTM4LDIxMywxNjMsIDMwLDE0NywgIDMsMTc1LDE0MCwgOTIsMjQ5LCAgNiwgMjgsIDkwLCAzNiwgMjIsCisgICAgMTM3LCA4MiwxMjAsMTEzLCAyMSwxODgsMTMyLCA2OSwxNDYsMTg1LDIzMywgMTksIDc5LCA2MCwxNjEsMTM2LAorICAgICA2MCwyMTcsIDg1LCA0MCwgODUsMTE3LDE5NCwgNDYsMTUxLCA4OCwgNjgsICA2LDEwMSwxMzIsIDY4LDIxMywKKyAgICAgMzQsMjA0LCA4OSwgMTIsMTA1LDIxMiwxNDYsIDg3LDEyOSwyMjUsIDQwLCA0OCwgNjYsIDY4LCAzNCwxNTQsCisgICAgMTU1LDE1OSwxMjcsMjM4LDExMSwxMjYsIDc0LDE1MCwgMjMsMTczLDEzOSwyMTIsIDE3LDE2NywyNDAsMTM4LAorICAgICAzNiwyNDMsMTQ2LCA5OCwyMTUsMTA2LDIxOCwxMzgsIDEwLCAyNywyMzQsIDk5LDI0NiwyMjIsIDQ0LDI1MiwKKyAgICAxMTgsMTU1LDE4NCwyMTQsIDk0LDE3OCwgMzAsMjQ1LDE1MiwgNDgsMTIwLDE4NSwxMjEsMTUxLCA0MSwxNjIsCisgICAgIDc5LDIwMSwxOTcsIDk4LDE2NywgMjYsMjQ1LDE0NCwgNTEsMjI5LCAzNywgMzQsMTIxLDIzMSwgODUsIDQ1LAorICAgIDE5NCwxNTcsMjQ2LDE5NCwxNDcsIDc5LCA1MiwgOTEsIDQ1LDExMiwgNDgsMjI3LCAzNCwyMDQsIDgyLCAxMCwKKyAgICAxMTUsIDY2LCAxNywgMTcsMTQ2LCAyNSwyMzMsMTAxLDEyMywgNTMsMjA5LDE1MiwgNDgsMjIzLCA4MiwxNDAsCisgICAgIDQ4LDIzOSwxMDEsMjM5LDIzMSwyNTUsMjA2LCAxNSwxMjcsMjQyLDIwMSwxNzksIDM5LCA2MiwyNDEsIDM0LAorICAgIDExOSwgOTAsMTEwLDE0OSwxNzMsIDQxLDI1MCwyMDAsMjM0LCA0MiwxODAsMjE2LDI0NSwxNTQsMTQ2LDI0NywKKyAgICAgIDgsIDM1LCA2NCwxMzMsMTAyLCA3MCwyMTAsIDgwLCAxMiwgNzYsMTI5LCA0MywyMTMsIDk0LDE3OCwgMzAsCisgICAgMjQ1LDE1MiwgODQsMTIwLDIxNywxNjYsIDU1LCAzMiwgIDAsMTAyLDI0NywgMTMsIDgzLDE2NCwgNTgsIDk4LAorICAgICAzMCwgOTAsMTIwLCAxMywgODksIDUxLDE2NCwxMTYsMjAzLCA5OCwxMjMsICA5LDEzMSwyMTQsMTUzLDE0NywKKyAgICAxMTUsMTE1LDExNSwyNDksIDU4LCAzMywgMzksMjQ2LCAgMiwyMDcsMjE5LCAxNywxNjUsMTc0LDE0NSwxNzgsCisgICAgMjA4LCA0MywgIDMsIDI0LDEyMiwyMjgsIDM0LDIxNSwgNzYsMTAyLDI0NSwyNDcsMjMwLCAgNywgIDYsMjI0LAorICAgIDIzNiwgMzcsIDgyLCAxOCwxMTcsMTE4LCA0MCwxMjIsMjM5LDEyMywyMjIsMTg3LDEyNSwxMDMsIDk5LDI1MywKKyAgICAgMjcsMjIzLDE1MCwxOTMsMTQ0LCAyNSwgIDQsMTMzLCA3MywxNTIsIDczLCAxNiwxNTIsIDY0LCAgMCwgMjUsCisgICAgIDcyLCAgMSwgNDAsMjQ0LDE0OCwgMjAsIDM0LDEyOCwgIDAsMTI5LCA4OSwyMTksMTQxLDEyOCwgMzIsICAyLAorICAgIDE1NiwxNzMsMTU4LDI0MiwyNDcsIDkzLDIwMywgNjYsIDUyLDE2OSwgMjMsMTIwLDIxNSwxNjMsIDMwLCAxNSwKKyAgICAgMTEsIDk0LCA5OSwgNTUsIDY3LDE3OSwxNTAsIDgwLDIxOSwxODEsMjE3LDE4MiwgNzgsMTQ5LCA3MSwxNjIsCisgICAgIDgzLDIwNCwgNTcsMTgyLDE0NSwxOTUsMTI4LCA3OCwgMjksIDYzLDEyMiwyMjgsMTM2LCA4MywgNDAsIDk1LAorICAgIDE2OCwgODUsIDQ1LCA3MCwgOTQsMjI4LCA0OCwxMzQsIDI4LCAgNSwxNTAsMTI1LCA3NiwxMTEsIDg0LCA1NywKKyAgICAgMjcsICA5LDEyOCwgIDAsMTkzLDE1MiwgNjQsMTQxLCAyOCwxNDUsIDcxLCA2OCwgMjAsICA0LDIzNCwxOTUsCisgICAgIDMxLDI1MSwyMzIsIDU1LDE0NiwxMjAsMjI3LCA5MSwyMjMsMTQ1LDIyNSwgNzIsICAwLDE1MywgNjUsIDE2LAorICAgIDE1MiwxMzIsIDg5LCAgNCwgNDEsIDMyLCAxNiwgNjQsIDE3LDE5NSwgNjIsMTkxLCA3MiwgNjcsMTMyLCAgMCwKKyAgICAgMjUsMTMzLCAgNCwgIDUsICA1LCAgNCwgIDUsIDY4LCAxNiwgNTcsMTU3LDE4NSwgNjgsICAwLDE3OSwxMzcsCisgICAgIDM2LCA1NiwgMjksMTIyLDE2MCwxNjYsIDg4LCA2MSwyMzQsMTEzLCA0OCwyMjgsMTMwLCA5MywyMjYsMTAyLAorICAgIDE3NywgOTMsIDM3LDEwOCwgNTEsMTIzLDE4NywgNjYsMTM2LDIxNywgMzYsIDk1LDE3NywxNzYsIDU3LCA1NywKKyAgICAgNjEsMTIwLCA0MSwgIDUsIDM5LDE0MiwxNTgsIDYwLDEyNSwgNTgsIDgzLCA5MywxMTAsIDk3LDE4OSwgMjMsCisgICAgMTIwLCA4OSwxNzQsMTQ0LCAyMSwgOTIsIDYyLDE5NSwxNDgsMTk3LCA4NywxMDIsIDQ5LDExNSwxMjksMjMwLAorICAgIDE1MiwgNzEsIDM5LDE5MSwxODMsIDY4LDI0MywgNDQsMTY0LCAgNSwgMzMsMTAyLCA2MywgNjMsICA4LDE5NSwKKyAgICAgMTUsMTI2LDI0NCwxNjMsMjA1LDEwMywyMjMsMTQ1LCAzMiwxMDIsMTE3LDE4MywyNDYsMTc1LCA3NCwgNDcsCisgICAgMjUxLDExMywgODgsMTAyLDEyOSwgNDksMTcxLCAxNCwyMDMsMjE0LCA3NSwgOTAsIDQ3LDIzMywgNzYsIDQxLAorICAgICA2NCwgMzMsIDE3LDE5NSwyMTgsIDc2LDIxNCwxNjMsIDMwLCAgNywgMzIsMTg3LCA0MiwxMDgsIDk5LDE5MCwKKyAgICAxMTcsMTE4LDIyMiwyMDcsIDc1LCA3NiwgODIsIDUyLCA5OCwgMzAsMTA2LCA2MSwyMTIsMTIyLDIwMCwgNTgsCisgICAgMTAyLDE1MCwgMTgsMTg4LDEzMiwxNDQsIDg3LCAyMiwgNzksMTU3LCA1NywgNjcsIDc4LDE0NSwxMDYsMTIxLAorICAgICA5NywgOTksMTY2LDE2NiwyMDAsIDg1LCA5NCwgNDIsICAzLDE1MSwyNDIsIDYyLDE4MSwgMzQsIDQ0LDE1MSwKKyAgICAgODIsMTMzLCA5MCwgMTAsICA0LCA2OCwxNzEsMTkxLCA0MiwyMDQsIDM1LDI1MCwyMjYsIDc4LCA0MSwgNjksCisgICAgMjEyLCAgOCwxOTUsMTQzLDEyNCwyMzQsMTQ3LDIyMywgODQsIDUyLDI0OCwyNDEsIDQzLCA2MCwxNDAsIDI0LAorICAgIDE0NCwgMjUsIDI0LDEzMywgODEsIDI0LDEzNiwgODEsIDI0LCA0MSwgNjQsIDk2LCA2OCwxNDksMjI5LCA5MiwKKyAgICAgODksMTIwLDEwMywxODIsIDgwLCA1MCwgOTEsMTIyLCAgMywgMTgsMTMwLCAgOCwgIDgsMTM4LCAgMCwxNzgsCisgICAgICA4LDE1NCwgMTMsMTkwLDEyNSwgMzMsMTAyLCAxMywxMDQsIDQ1LDE5NiwyMzQsIDgxLDE0MywgIDcsIDI4LAorICAgIDEyMCwxMjksMTc5LCAzMCwyMDAsMjE2LCAyOSwxNzksIDcxLDE2MywyMTUsMTQzLCA4MCwgMzYsIDc0LDE1NywKKyAgICAxNjMsIDU0LDIwMywxMzEsMjAyLDE4MywyMjgsIDQ4LDIyNCwyMjksMTMzLDIxMSwgNzksIDYxLCA2OSwgNjgsCisgICAgMjQ2LDE0OCwyMDUsIDQ5LCA4OSwxNzIsMTQ1LDE2OCwgNDgsMTQwLDE2NCwyMDQsIDQwLCA3MywgNDgsICA3LAorICAgICA5NiwgNzgsICAyLDE1MCwyNDcsMTY4LCA3MSwgIDAsICA4LDE5OCwyMDUsMTA1LCA4MiwgNDYsMTkzLDE4OCwKKyAgICAgOTUsMjEyLDEwNiwxODIsIDYyLDI0MiwxMzcsIDc5LDI1MiwxMDEsMTYzLDE3NywyNTMsMTU3LCAzMSwyMDIsCisgICAgMTEyLDEwMCwxNTIsMTAxLCA5MiwgMzYsIDM1LDEwNSwgIDQsIDM4LCAgOSwxMjgsIDI0LCA4MCwgIDEsIDQyLAorICAgICA0OCwyMDIsIDQzLDEzMSwgODEsMTA2LCAyNCwgIDksIDY4LCAgNCwgIDUsMjA1LDE3NCwxNDYsIDY2LDEwMiwKKyAgICAyNDcsIDM0LDE0NCwxMzAsMTE5LDE3MiwyMzcsMTAwLCA2MSwyMzQsMTEzLCA2NCwyNDAsMTE0LDIwMSwgIDUsCisgICAgMjE3LDE4NiwgMzEsMTAzLCAgMywgMzMsMTc5LCA4OCwgNDgsIDIyLCAzMCwgMjUsMjE3LDE0OSwyMjIsIDk0LAorICAgICA3NiwgNDUsIDg4LCA5MCwxMDksIDMxLCAgNiwxMjAsMjQyLDIxNiwxNTMsMjExLDE2NywxMzcsMTY4LDE4NCwKKyAgICAxODAsMTk4LDE5NywxMzgsIDIxLCA4MCwxMDEsMTE2LCAyMSwgNTcsIDcwLDIwMiwxNTEsIDk2LCA4OSwgOTcsCisgICAgIDI0LCAyMSwxNjYsIDMxLDE0MSwgNDYsIDEwLCAxMCwgNzUsMTQ1LCAgOCwxMzcsMTM3LDEyNSwyMzcsMjI5LAorICAgIDI1MiwgOTIsMTY1LDE0OCwxNjIsIDcwLCAyNCwxOTAsMjU1LCA2NywgMzEsMjUwLCA0MywxMjksMjM3LDIzOSwKKyAgICAyNTQsMTI4LDEzNSwgMzUsICAxLCA5NiwgNzAsIDcwLDIwOCwgODYsMTM2LDEwNSwxNDgsICAwLCA0MSwgNjQsCisgICAgMTAwLCA2OCwgIDUsMjMzLDE5MCwyMjEsICA4LDEzMCwyMjIsMTU5LCAzOSwxMDQsIDE4LDEyNSwyMDAsMTMzLAorICAgIDE1MiwxNjQsIDkxLCA0NSwyMTMsIDIwLDE3MSwgNzEsIDYxLCAxNCwgNjAsMjQwLCA0MiwxNDQsMTM5LCAgMSwKKyAgICAxMTYsMTg2LDEyMywgMTYsMTk5LDE1NiwyNDYsIDQ2LCA1MywgNzUsICA2LDExNSwxNDMsMTUzLCA0NiwxMTEsCisgICAgICA0LDE3NywxMjksMjUzLDIwMSwyMTEsMTY3LCA0MSwyMzksMTM3LDE0MywxMTAsMTQ1LDE4OSwgMjcsMTY0LAorICAgICAyMywyNDMsMTIxLDE2NSwgMTIsMTg4LCA4NCwgNjIsMjA0LDE0OSwxNjQsMjAwLDE5MCwyNDMsIDQ0LDEwMCwKKyAgICAgNTQsIDEzLDE1MywyMTUsMTc1LCAzNCwgNjYsIDk2LDE0MSwgOTMsMTc3LDE0NCwgNjMsMjA3LDIxMywgMjAsCisgICAgMTQ1LCAzOCwgODIsMTAwLDEyNywxMzMsIDgyLCA3NCwgIDUsIDY1LDI0OCwxOTAsIDE1LDE4OCwyNTUsIDM5LAorICAgIDE1NywyNDYsMTczLDE5MSwyNTAsIDMwLDIyMywyMTcsIDEwLCAxNiwgODMsIDMzLDEzNCwxNjIsIDMzLDE4OSwKKyAgICAxOTIsIDcyLCAxMCwgNDksIDY0LCA4MiwgODksMTQzLCA2NywyNDQsMTE4LDE0MiwgMTksICA0LCAxOCwgMTcsCisgICAgMTkyLCAyOCwgOTQsMjMzLCAgNSwgOTEsMTM0LCA4MSwgNTMsIDU5LCA4OSwgODMsMTcyLCAzMCwyNDUsMTg0LAorICAgICAzMSwyMTcsMjI5LDEyMiwgNjQsMTE5LDE0NiwyMDksMTcyLCAgOCwyMDQsIDkxLDI1NCwxNzcsMTQyLDEzMiwKKyAgICAyMTcsIDU4LCAzNSwyMDAsMjI1LCAzNywgNDQsMTYwLCA1OSwxNzMsMjQ2LDE1MywgODMsIDcxLDE0MywgMjgsCisgICAgMTkzLCA1MCwxODgsMTkyLCA1MywxNDMsIDY5LDIwNywxNjgsMjM2LDEyMywyMjksMTkzLCA0MywgMzUsMTUyLAorICAgICA1MCwgMjAsIDUxLDE4MywgNjcsMTU1LDE5MiwyNTEsMTQxLDE5MywyNDIsMjQ1LDIyNCwxMjksIDY5LDE1MSwKKyAgICAyMjgsMjMyLDIyNiwgODQsMTMwLCA1NywyNDgsIDc0LCAzNywxNTIsMjAyLCA2MiwgIDYsIDQyLDIyOCwyNDAsCisgICAgMjE3LDEwMywxNTksMjM3LDExNiwgNTgsMTExLDEyNCwyNTEsIDQ3LDIyOSwxOTgsMTA5LCAgNiwxMDAsMTI4LAorICAgICA0NCwgMTcsMjExLCA3MiwgMjYsIDM3LCAzMiwgOTgsIDE2LCAgNSwxMDAsMTg4LDE2NCwxNjEsMTUyLDIyMywKKyAgICAgNjUsMjA5LCAgNCwgOTIsMjMwLCAxNCwxNjUsMTE4LCA1MCwxNDksMTM0LDEzNCwgOTgsMTA0LCA1NSwxNTMsCisgICAgMTcxLCA0MSwgODYsMTQzLDEyMiwyMjAsMTUxLDIzNiwgMTgsICA3LCA2NywxODUsMjMwLDI0MiwyNDcsMTA5LAorICAgIDExNiwgOTAsMjU0LCAgOSwxMzksMjQzLDE1NywgMjIsMTIxLDE5NCwgIDAsMjAxLDIzNiwyNDQsMTk0LDIxNywKKyAgICAgMzksMjMwLDIzMCwxMDIsMTU3LDE3MywyMDYsIDE2LCA0MywyNDUsIDg3LCA5NCwxOTksMjI0LDEwMywyMzMsCisgICAgIDQ2LDE4MSwyMjAsIDc5LCA0NSwxODksIDg0LDIwOSwgNjQsMTQ2LDE1MSwxMjksIDg5LCAzMywxMDAsMjQyLAorICAgIDEyMywyNDEsMTg4LCAzNywgMzMsMTEzLDIwOSwxNjUsMjM0LCA3NiwxMzAsIDI1LDI1MywxNjUsIDIwLCA0MywKKyAgICAgMjEsICA0LDE5MywyMDEsMTQ3LCAzOSwgNTksMTU3LDIwNiwxNDMsMTkxLDI0NSwxMDksMTkwLDExNiwxNDksCisgICAgMTUzLCAyNSwgODEsIDkxLDEyMCwxMDUsIDM2LCAxMywxNjIsMTQ1LCAgMiwxNDgsICAwLDE0NSwxNDUsMjAwLAorICAgICA4MiwgMTIsIDExLDIyMSwyNTAsIDc3LCA4OSwgIDUsIDMyLDE4NSwgNDYsMTc4LCA3NiwgNDksICA3LCA4OSwKKyAgICAxNDYsMTkxLDE3NiwgNzIsMTQxLDE3NywxMjIsMjEyLDE2MywgMTAsIDk0LDIzMywgNDMsMTI2LCAyNSwgNjcsCisgICAgIDQ2LDE4NSwgNTAsMjA3LDE1MiwyMTYsMTkyLCA0MywxMDIsMjE0LDI0NiwxNTUsMTQwLDI1MiwyMDIsIDU4LAorICAgICA3OSwgNDgsIDk3LDE3OCwgNTIsMTI3LDI1MiwyMzYsIDg5LDIxMSwyMDcsMjIyLDEzNSwxNTEsIDk1LDE3MCwKKyAgICAxNTQsMTUxLDExMSwxNDksIDUxLCA0NiwgODUsIDY0LDE1MiwxMzEsIDQ3LDE5NSwxNTMsIDk4LCA3NywgMjQsCisgICAgMTQ2LCA4NywgMzEsMTQ1LDIwMSwxNTIsMTkyLCA4MiwxOTQsMTk5LDE2NiwgNjUsIDg4LDE3NCwxOTIsMjE2LAorICAgIDI1MiwxMTYsMTE4LDIyNCwxNDksMTI5LDEwOCwxMTAsMTEwLDIzOCwxMzMsMTUxLDEyNiwyMzAsICA3LDIzNywKKyAgICAyMzksMTk2LCA2MywxODksMjAwLCA4MSwyMDQsMTQ2LDEyMiwgNzMsMTQxLDE2MiwxOTMsMjI0LCAxMiwgNTMsCisgICAgMTQ2LDExNCwgNDAsIDcwLCAzMiwxMDAsIDUyLDE1OSwgMTMsMTk3LCA3NiwyMjEsMTA2LCA1OCwyMjUsIDU2LAorICAgIDE0MiwgOTgsMTAyLCAyNiwyMTEsMjA2LCA4MSwyMTgsICA3LDE5OCwgODcsMTA0LDI0NSwxNjgsIDcxLCA2MSwKKyAgICAyNTIsIDYxLDE5MCwgMzYsMjA1LDE0NSwxMDksMTEwLDIyOSwxNDcsMjAzLDEyMCwgNzAsIDU1LDI0MywxMTQsCisgICAgMTAzLDI1MywgNTEsMjE3LCAzNywgIDAsIDU4LCAxMiwyMjQsMjMyLDI0MiwgMTksIDc5LCA2MCwxNjEsMTMwLAorICAgIDE5MiwyMTksMTY4LCA0OSwxOTUsIDczLDE2MSwxMzMsMTUxLDE2NSwxNTEsMjAyLDIxNiwyMjksIDM2LCA5NCwKKyAgICAxMjksMTE1LCAzMywgNDAsMjQ5LDIwMCwyMjAsIDY0LCAyMiwyMzQsMjM5LDI0MywgODksMjA1LDE4OCwxMjYsCisgICAgIDg1LCAxMCwgMTEsMTM2LCAgOCwxMzMsIDUxLCAxMywxNjYsIDcyLCA0OSwgNDksIDI3LDEyNiwgMjUsMTE4LAorICAgIDIxNywxODMsMTI4LDE1MywgNTcsIDk2LDExMCwxODEsMjE5LDIzOSwyNTEsMjA4LCAgNywgOTUsIDk1LCA5MCwKKyAgICAxODQsMjUzLDIyNywxNTEsMTMxLDE4MSwgMTMsICA2LCA1MiwxODIsMTQ1LCA1NywxNTEsIDk5LCAxMCwgNzMsCisgICAgIDM1LCA0MiwgMjAsMTMzLDE2OCwgMTYsMTQ5LDEwMCwyMjksIDk2LDE5OCwgNTksMTY2LCA0NywgMjYsMTQ2LAorICAgIDExNSwyMjAsMTYzLCAyNCwyMTgsIDg3LCAxNSwxNzYsIDIwLDExNSwxODEsMTUyLDE3OSwyMzAsMTgwLCAgNiwKKyAgICAgODksIDYxLDIzNCwxNDUsIDc1LDE3NSwgOTgsMTg1LDEzMSwyMzcsMTI5LDIyNywyMDYsIDUxLDIxOCwgMjksCisgICAgMTc5LDE1MywxOTcsMjI3LCAyOSwgODgsMjE3LCAzNywgIDAsMjAxLDExNiwxODMsMTIzLDI1MCwxOTYsMjAyLAorICAgIDI0MiwgMTAsIDIyLDE4NiwgNjUsMTAzLCAyMCwgNDMsMjEyLDIxNCwxNTEsICA0LDE1MSwgNTksICAyLDE2NSwKKyAgICAgODQsIDE2LDE2OCwgMzIsMTEyLCAgOCwyMzAsMTE0LCA0NCwgNDcsMTYyLCA2NCwxMjcsMjU0LDE3NywxNzYsCisgICAgIDI5LCA4MSwxNDQsIDIyLCA4MywgNzIsMTU4LDEzMCwgMTcsMTYxLCAgOCwxNDYsMTQ0LCAxNiwgMTksIDQxLAorICAgICA2OSwyMDQsIDg2LDEzMCwxMTMsMTkyLCAxNCwxODcsIDIwLDE1NSwyMDcsMTMwLCAzMiwgOTYsMTUwLCA0OCwKKyAgICAxMjQsMjM0LDIzNiwgODMsMjQzLDExNSwyNDMsMTc1LDEyNiwyMzksMjUxLDI1MCwyMDIsMTE3LDE5NywxNzIsCisgICAgIDgwLCA1MiwgOTgsMTQ0LDEyMiwgNzMsIDg0LDIzMywxMjMsIDEwLCAxMiwxOTEsIDQ0LDE5NCwgIDgsIDE2LAorICAgICA2NSwgNDAsMTY1LCA4MiwgMzAsMjQwLDE2NywgOTEsIDczLCAyNiwxMjMsIDQxLCAzMiwgMzIsMjMwLDI0MywKKyAgICAyNDQsIDUwLDE2MCwgODUsMTEwLDE0OSwgMzIsMTcxLCA0MSwgODYsMTQzLDE5OSwgMjgsIDkxLCAgMCwxNDIsCisgICAgMjI0LCAxOCwgMTcsMjM3LDE1MSwgNzEsMjI4LDIwMiwgNDMsMjM3LDE2OCwyMDQsICA1LDIyNSwxNTAsMjAxLAorICAgICA0NiwyMjcsIDI1LDE0MywgNjEsMjQ5LDEwMCwxNjcsMjExLDEyOSwyNDIsIDE0LDIxOCwgODAsMjIwLDEyNCwKKyAgICAgMzUsMjIzLDIwOCwxOTksIDE1LDE4OCwyMDAsIDg1LCA5MSwgNjUsMTQ0LCA5NCwgMTQsMTMwLCAgMiwxOTAsCisgICAgIDQwLDIwNywxOTEsMTQ4LCA5MywyMDgsMTU3LCAyMSwgOTYsMjQ4LCAyNywxNzIsICAxLCAgNiwyMzgsMjE0LAorICAgIDEwNiwgODgsMTE0LDE0NCwgNjgsIDY2LDE2NCwxNDgsIDk4LDEwMiwgOTgsIDg2LDIwNCwxNzIsMTQ4LCAxMCwKKyAgICAgODQsMTkyLCA4NiwxMjEsIDQ5LDE3OSwxNzYsMTEyLDE5MiwxNjYsMjAxLDE5OCwyNTIsMjUyLDI1MiwxMjMsCisgICAgIDYyLDI0NiwyMDksIDg3LDI1NCwyNTAsMTc1LCA3MSwxNzUsIDk1LDIyNiwgOTQsMTU5LCAxNywyMTcsIDgxLAorICAgICA5NCwyMDYsMTIzLCA4NCwgNzIsIDI1LDE5NCwgMjAsIDM0LDEyOSwxNjAsMTQxLDE5OCwxNTYsIDYxLDIyMiwKKyAgICAgODIsIDI0LDEwMSwgMjAsMjAzLDIyMSwxMDEsMjAxLCA4NCwxODYsMTM4LCA4OSwxMDYsIDU3LCA4NiwxNDMsCisgICAgMTk5LDE0NCwgOTIsMTQ2LDE1MSwxMDQsIDU3LDEzMCwgMTEsIDI4LDIxNywxNDksIDk4LCA0MywgNzcsMjM1LAorICAgICA1NywgNzcsMTkwLDIwMiwgIDQsMjA0LCA2MSwgOTksMTcxLDE2OSwxNDIsMTczLCA2MCwxMTMsMjM0LDE0OCwKKyAgICAgODIsMTcwLCAgMiwgOTQsMTY1LDE5MiwgNjIsIDk1LDE0OSwxNzMsMTM4LDEwNSwxMjUsMTc0LDE4NSwgIDIsCisgICAgMjQzLCA2MywyMDAsIDYzLDEyMiwgMTQsIDUwLDE3MywxNzIsMjAwLDIxOCwgODEsIDg0LDI0NSwgOTksIDc3LAorICAgIDIzOSwgNzMsMjI0LDEzNCwxMjUsMTc0LDI1MCwgMTksIDE3LCA1MCwyNTUsMTcyLDI0NiwgNTAsIDM1LCAgOCwKKyAgICAgIDIsMTAyLDE2MywxOTUsICAyLCA3OCwgNTcsMTk4LDEyOSwgIDQsMjMzLDEyNiwgMzUsIDM0LDE3MywxMDIsCisgICAgMjQzLCA5MywyMzksMTI2LDI0NywxNDEsMjI5LDIyOSwgNDMsIDQ3LDE5MSwxNjIsMTExLDIyMCwgNTQsIDY2LAorICAgIDIwNCwgIDAsMjAzLCA4NSwgOTcsMjMzLDE0OSwxNDQsMTA2LCA0OSwgNjYsMTY0LCA5MiwxNDIsMjI5LCAgMSwKKyAgICAxOTEsMTgzLCA5NywgODIsIDI2LDEyMiwxNjUsMjQ2LDIyMCwgNTMsMTQ5LCA3MCwxNDIsMTY1LDE4MiwxODksCisgICAgICA2LCA4OSwgNjEsIDMwLCA3NSwxODEsMTQ5LDExMywxMzUsMTU3LCA4NiwyMDYsMTg1LCA5MSwgIDQsMjA5LAorICAgIDE5NCwgIDksMTIzLDE3OSwxNDEsMjI5LDIwMCwyMDQsMjI4LDI0NSwxNjksMjM2LDE1NCwxNTksIDkzLCA2MCwKKyAgICAxMjUsMTA2LDExMCwxMTgsMjE0LDIxOSwgMTAsIDQ5LDE3MSwgOTQsIDI0LCAgMywxNzUsIDY2LCA5MywxODksCisgICAgMTA3LCAyNCwgMjksMTA4LDIxNywyMDcsMTcyLCAxOCwgMTEsMTMwLDE5MiwyMDMsMTkxLCA5MiwyNTUsMjMyLAorICAgIDE3MiwgMzEsMjQyLDExOCwgIDIsIDQ5LDIzNSwxMzUsMjEwLDI0MCwgIDksIDEyLCAxOCwyMjAsMTIxLDIwNywKKyAgICAxNDgsIDk3LDE2NCwxMzYsIDM2LCAzNSwgODgsMTM0LCA0OCwgOTcsIDk3LCA0OSwgMTgsMjA0LDE5MiwgNDMsCisgICAgIDcyLCA1OSwgOTUsMTM5LDIwMCwyMDksMTYzLCA3MSwxMDMsMTAzLDEwMywgOTUsMTg3LDExMiwgOTcsMTE2LAorICAgIDIzMywgNzQsMTc2LDIxMSwyMTEsMTMwLCAxMCwxOTcsIDcyLDE3MywgIDQsIDQxLDIwMCwyMjUsIDY5LCA0MiwKKyAgICAxNzksMTQ3LCA1NywxOTQsMTkyLDE2MywgODgsMTYxLDIxMSwxNDIsMTg1LCA0NCwxMDQsMjMwLDEyOCwgODMsCisgICAgMTQ3LCA4OSwxMzEsMTcyLCAzMCwxNDMsMTUzLDIxMiwgIDIsMTY4LDE5MiwxNTAsMjI4LDIxNiwyNDIsMTcwLAorICAgIDE4NiwyMDQsMTIyLCA3MCwgODcsMTI3LCA3MywgNTMsIDEwLDIxMSwxNTksMTY2LCA1OSwgNDUsMTE3LDEwMCwKKyAgICAyNDksMTM3LDE0NywgMzksIDg1LCAxNiwgMjAsMTAwLCAyMywyNDgsMjE5LDEwNCwgODcsMTk0LDIwMywxNzMsCisgICAgIDIxLDExNywyMjQsMTY1LCA0NCwxODQsMjIwLDE2MSwgODQsMjUwLDE5MywxNzUsMTYwLDIwMCwxNTEsMTEzLAorICAgIDEyMywyNDAsMjAyLCA4NiwgNjIsMTU0LDE4NywgMTgsMjE2LDIxMywxMzQsIDg5LDEzOCwyMzgsMjEwLCAxMSwKKyAgICAgODEsMTQ0LDEzMiwgMjAsIDQxLCAzMywxMTgsICA4LDE5OCwgNjUsIDE2LCAgOCwgNTEsIDc1LCAzMiwgMjIsCisgICAgIDk1LDE0NiwgIDksIDQ4LCA3MywxNDksMTAzLDE3MSwyMTMsIDYyLDI1NSwxNzQsMTE5LDE3MywgMjksIDYxLAorICAgIDI1MCwyMTQsIDQzLCAyMywyNDAsMjE0LDE1NCwxMzgsIDk5LCAzNywxNTIsIDc1LCA0OCwxMTIsIDg0LCA4OCwKKyAgICAxOTgsIDQ3LDE3NiwgOTAsIDEyLDE3MCwgNjUsMTUwLCAgNywyNDUsIDcwLCA2NywgMTAsIDc0LCAyNiwxNTAsCisgICAgMjE3LDExNiwyMDQsMjUwLDIwMiwyNTMsMTI4LDE3MiwgNDgsIDc3LCA4MywxNDMsMTIyLCA3NiwgNjIsMTc5LAorICAgIDIwMiwyMTYsMTE0LDIzNSwgMzMsMjEwLCAzOCwxMzAsMTkwLDIzMCwgNDIsMjQwLCAxMSwxMTgsIDM3LDE1MSwKKyAgICAgNDAsIDc0LCAyMiwyMzEsIDg2LCA3OCwxNTksMTU4LDE1OCwxNTQsIDQyLDE4MiwxNDUsMjQ2LDIyNSwxMzMsCisgICAgMTMzLDE1OCwxMjksMjIyLCA4MiwyMzMsMTg4LDIxMCwxODksIDk2LCAyNCwxMzEsMjA4LDI1MSwgMTYsMjQ4LAorICAgIDI0MCwxMTQsMTc5LDI1MSwxODAsMjM2LDE5MCwgODAsMTg3LDIzNCwxMzYsIDQ3LCAgMCwgIDgsMjEwLDE2NCwKKyAgICAgNjAsMTQ5LCA5NiwgMTQsMTkyLDE3MiwxMzksIDIwLCAxNywgODEsIDY2LDE2MiwgNzIsIDY4LDE3NywxMDAsCisgICAgMTc2LCA5OCwyMzAsMTkyLDEyNCwyMDAsMjAxLCAzNywgODksMTA1LCA5MiwyMTgsICAwLCAxMywxMDAsMTEzLAorICAgIDExMywxMTMsMjMwLCA2NywgMzEsMTg4LDEyNCwyMjksMjAyLDE5OCwyMzUsIDIzLDI0NSwxNTcsIDc3LDE5NywKKyAgICAxNzIsMTczLCA5NywgODQsMjI2LDE5MywgNzUsMTUzLCAgMiwxNzcsMjIwLCA3OCwgNjYsIDE0LCA1MCwgIDEsCisgICAgIDUyLCAyNSwgMjUsMTAyLCA1MSwxNDksMTgyLDEyMCwgNzYsIDI4LCA4MSwxMDcsMTI2LCA1MywgMjYsMTA1LAorICAgIDE4MiwgNTUsMjAwLCAzMiwyMjMsIDc4LDE4NCwgIDYsIDg5LCA2MSwgMTQsMTQzLDIxOCwxMTQsIDIzLDI0MSwKKyAgICAgNTYsMTI1LCAzMiwxMTYsMTA1LDEyMiwgNDksMjEzLCA5NSwyNDYsIDc0LCAyNSwyNDMsMTYzLCA4MywxMTQsCisgICAgIDMzLCAzOCwgNTEsIDgzLDIyMSwyMjcsIDcxLCA3OSwxNzMsMTcyLDE1MiwxOTcsMjE2LCAyMSwxNTgsIDQ5LAorICAgIDIxMSwgOTIsMTc0LDI0NiwyMDIsMjE5LCA3NCwgODAsIDk0LCAzNSwxNDUsIDM3LDI0NCwgNzAsIDk2LDEzMywKKyAgICAgNjUsIDE2LDEzMiwgNjUsIDI0LDI1MCwgMjAsMjAzLDIwOSwxNjYsMTMwLCA2NCwxNjksMTI4LDEwOCwyMTAsCisgICAgMTU5LDIxNSwxMjYsMTQ5LCAyNiwxNzUsMTg2LDE4NywxODYsICA1LDIwNiwxNTksMjI2LDE5MiwgNTMsMjM3LAorICAgIDE3MSwgMzUsIDI1LDE5NCwgMjAsIDQxLCAzMywgMTcsIDM3LCA5OCwgNjEsIDk5LCAxNiwgIDQsIDMwLDE4NCwKKyAgICAgMzYsIDM5LDE1MiwxMDksIDM3LDE1NywgOTksMjUxLDIwNCwyMzMsMjExLCA0MywyMDMsMjAzLDE1MSwgNDYsCisgICAgIDk0LCAyOCwgOTIsMTg3LCAxNywxMDgsMjM3LDEwNCwxMDIsIDY2LCA4NCwgIDgsIDM2LDE2OCwxNDQsIDQwLAorICAgIDIyOSwxNTEsMTg0LDExMywxNTIsMTc4LDE1NywxMTgsMTQ4LCAzMiwgMzMsMTYwLDE3NywxNTAsMTk4LDIyNiwKKyAgICAxMDIsIDkxLCA5MCwxMzgsMjE1LDEzNCwgNDUsMTc1LDE4OSwgNDAsMTMwLDE3MiwxOTQsIDkwLDE4NiwgOTMsCisgICAgIDQ2LDEwMCwgNzYsMTg5LCA5NSwgNjEsMjM0LCA0OSwgMjUsMTMwLDEwNywgNTUsMTA4LDIxNywyMjEsMTAwLAorICAgICAxMSwxNzgsIDQzLDE4OSwgMzgsMTc3LDEwNywxMjgsMTcwLDEwMSwxNTEsIDMzLCAyMywxNjEsMjM4LDExOCwKKyAgICAxOTQsMjI5LDE5NywyMTEsMTk5LDE0MywxMzUsIDk3LDIzMiwxNjYsMjA1LCA5OSwgNjAsMTYzLDE3MywyNDUsCisgICAgIDQyLDI0NCwxOTUsMTEzLDIyNCwxMDEsMTI1LDE2MSwgNTEsIDUwLDIwMSwgMjEsIDI2LDE0MCwxMzMsMTEwLAorICAgIDExOCwgMzEsIDg0LDE4NCwgNzEsMjQyLCAyNiwyMjYsIDY0LDE2MSwxOTUsMTUwLDIyOSwgMjMsMTYyLCA3MywKKyAgICAxOTAsMjIwLDEzNCwgOTMsIDY0LDEzMiwgIDAsIDM2LCAgMiwgNDEsMTkzLDE0OCwgNDAsIDMzLCAxNywgMzUsCisgICAgMTk0LDE5OCwgMTMsMjAwLCA2MiwxODQsICA3LDIwMCwyNTIsMjQxLDE1NywgNzgsMjMxLDIzMywxMTUsMjMxLAorICAgIDEyMiwgMzksIDc5LCA5NCwxMjIsMjUzLDI0NSwyMzIsMTk4LDEwOSwxODEsMjExLDIxNSwxNjYsMTc1LDE4MCwKKyAgICAgNzIsICA2LDE3MiwgMjgsIDk0LDI0NiwyMTEsIDkyLDEzMCwgMzMsIDQyLDE2MywxOTQsIDI4LDE1NiwgMzMsCisgICAgICAwLCA2NiwgNzQsIDUyLCA0MSwyNDYsMTk1LCA3NywgMTEsIDY3LDE0MCwgNTcsMjA2LCA1MCwgNTAsMTc2LAorICAgIDIzNSwxOTUsIDUxLDIyNywyMzMsMjI3LDE3MCwxMDIsIDg5LCA2MSwgMzgsIDcyLDExMiwxODUsMjI5LDE2MywKKyAgICAgOTIsMTY1LDE4MiwgNTAsMTAyLDE4NSwyMDIsMjAzLCAzNywgMjYsMTQ4LDE1MCwxMTAsMTM5LDEyNywgNjUsCisgICAgMTE5LCA5MCwxODQsIDU2LDEyNywyMjYsMjI4LDIwMSwxMDIsMTc5LCAgOSwxNjUsMTg5LDExNywyMjAsIDEwLAorICAgIDE3NSwxMzgsMTgxLCA2NSwgODgsMTc0LDE3NCwxODMsMTUzLCA4NywxMDIsIDI1LDE5NSwgNDgsMTE2LCAyNSwKKyAgICAxNTAsMTkzLDIwMywxODUsMjE0LCAyMiwxMzAsMTQ1LCA4NywyNDksMTMzLDEwMSwgIDUsMjMwLCA3OCwgMjgsCisgICAgMTI4LCA4OSwgNjMsICA0LCAgNSwgIDksMjMwLCAgNiwgOTcsMTUwLCA5OCwgIDYsIDk3LCA3NCwgMjEsMTQ2LAorICAgIDE3NCwgMTAsMjA1LCA4NSwgNjUsIDQ2LDExOSwgNzYsIDc3LCA3NywgNjEsMjUxLDIyMCwxMTUsMTU1LDE2NywKKyAgICAgNTQsMTc1LCA5NCwxODYsIDIwLDIyMSwgOTAsIDg1LCA1OSwxMjUsIDY2LDIxMiwgNTQsMTgyLDExOSwyMjUsCisgICAgIDY5LDIyNywgNjYsIDQ5LDEwNywgNDUsMjA5LDEyOCwgMTIsIDI4LCA4MSwyMzAsIDc3LCA4OSwxMjIsMTIzLAorICAgIDE2OSwxODQsIDI1LCAyNSwxNjYsIDEyLDI0MywyMjAsIDM3LDIxMiwgNDQsMTcxLDE5OSwxNjQsIDk2LDE3MSwKKyAgICAxNTYsMTA5LCA4NSwxNTIsMTk2LDI0MiwxMDEsMTgzLDE5NCwxNzEsIDE4LCA4OCwgODAsIDM0LCAyMywgNDQsCisgICAgMjA0LDE3MywgMjgsIDYzLDIyMiwyMzcsMTE2LDE4OCwxNzAsMjA4LDExMywxNzgsMjAzLDIwMSwxODgsMTA0LAorICAgIDE1NiwxMDksMTE2LDIyNCwxNDksMTM5LDE3MiwgNDgsIDI3LDE5OCwgNzEsMjUwLDI0MCwgODIsMTIxLCAgMCwKKyAgICAxNTAsIDU5LDE5OSwxOTQsMTcyLCA5OSwxNDksMjQ4LCAgMiwxODMsMjU0LDE5MCwgMzIsMTkzLCAzMiwgOTUsCisgICAgIDYyLCA0NiwgNzgsIDE2LDIzMCwgMzIsIDEyLDIwMiwyNDIsIDExLDEwMCwyNTIsIDczLDIzOCwyMzgsMTY1LAorICAgICA1MiwgNTUsIDU1LCA1NSwgNjEsIDYxLDE4OSwxODEsMTgxLDExNywyMzcsMjEwLCA5MSwyMDksMjM0LDE4NiwKKyAgICAyMzQsMjQ1LDEzNywxNTMsIDE2LCA4MiwxNDQsIDU3LDI1MiwgMzQsIDc5LDEzNiwgNjUsIDMzLDIyMSwgNzEsCisgICAgMTIzLDEyNSwxOTgsIDUwLCA5MSwyMjAsMjMwLDE3NywgMTIsMjIwLDI0OCwyMjMsMTEwLDE0NiwgIDQsIDU0LAorICAgICA1OCwyMDMsIDg2LDEyMCwyMTMsIDQ0LDE3MSwxOTksIDY1LCAxNSwxNzIsMTY0LDEzNywyMzYsMTA5LCAxOCwKKyAgICAxOTksMTYxLDEzOCwyMzcsMTAxLCAyMiwyMDksMTA1LCAxMCwgNjMsMTU4LDE0MywyMzAsIDYxLDE2MSwyMzgsCisgICAgMTgwLDExMywxMjYsMTE4LDIyOSwyMTYsMTc3LCA0OSwyMjgsMjQyLDIxMSwxNzQsIDY2LDIzMCwxNDksMjQ1LAorICAgIDExNSwgNDYsMTgyLCA1NSwgMzcsMTA3LCAyOCwgODUsMjMwLCAxOSwgNTEsMTE4LCAgNSwyMzgsIDkxLDIyNCwKKyAgICAgNDEsMTc1LDE0MCwgOTQsIDk0LDIzNiwgODUsMjIwLDIwMiwxODIsIDY2LDEyNCwyNDksMjQ5LDE1MSwxNTcsCisgICAgMTM2LDExNiwyNTEsIDk3LCAxNiwxMjksMjMzLCAyNSwxNDUsIDM5LDI0MywgNzQsIDg0LDE1NCwyMDYsMTY3LAorICAgICAgNCwgNDMsIDYyLCAzMiwgODIsMTI5LDE3NCwxMDgsMjI3LCA1NCwgNjgsMjA4LCA5MCwxNjcsIDIwLDE1NSwKKyAgICAxNTcsMTU3LDEyNiwyMzgsIDkzLDE4OSwgOTQsMjM5LDIxOCwxNDksIDQzLDE2MywxNTUsMTgzLDEwNSwxNjcsCisgICAgIDc5LCA5MCwgMjcsMTIzLDEwNCwyMDIsMTkzLCA4NCwxMjksMTAxLDIxNywxMTAsIDcwLDE4NSwgMTYsMjAzLAorICAgIDE4MiwyMDAsMjA1LCA2OCwgODksMTg2LDI0NSwxNDUsMjA3LCA1MCwyNDMsMjAzLDE2NSwxMTQsIDg3LDExNiwKKyAgICAxODMsMjM4LDEyNywgMjMsMTUwLDE4NSwxMjEsIDg5LDE5NywyMzYsIDc3LDEyNSwxMDYsMjE0LDE2MywxMzgsCisgICAgIDg2LCA0OCwyMzgsMjI4LCAxNiwgNDAsMTE5LCAgNCwgNzYsIDc1LDE4MywgODIsIDMwLDEyMSwyNDEsMjE0LAorICAgICA1NiwxMzIsMTc3LDEyOCwxODUsMTc2LDE1OSwgOTUsIDQyLDEzOCwxMTYsMTY3LCAyOSwgNDQsIDQ1LCAyOCwKKyAgICAgNjMsMTIyLDE4MCwxMDEsMjIxLCA5OCwyMTcsIDQ4LDE1MCwxMDEsIDg3LDExNywxNTcsIDY4LCAzMywyNDMsCisgICAgMjAyLDE2NCwxNTEsIDI3LDEyMSwgMjUsMTIwLDEwMSwyMzIsMjQyLDExNywxNTIsMTAxLCA4NywxNTQsMjIwLAorICAgIDIzMSwyMjUsMTUxLDIyNywgMjgsMTkzLDExMSwxNTUsIDgzLDI0OCwyNDMsMTc4LDI1MCwgODUsMjAxLCAzOCwKKyAgICAgMzQsIDY5LDE2MCwgOTIsMjI1LCA2NSwgNjgsMjMwLCA2MCwgODYsMTYwLDE4OCwyNDksMTk3LDE3MiwxNjUsCisgICAgMTA4LDE4MiwyMjcsMTQ2LCAyMCwxMDEsIDg3LDE3NCwyNTIsMTU2LDE2MywxNjAsMTgxLCA3MCwgNjgsMjA4LAorICAgIDEyMiwxMDYsMTA2LDIzNCwgMjksMjA3LCA2MCwgNTEsIDU4LDExNSwyMzAsMTk4LDIwNSwgMjcsIDU5LCA4NywKKyAgICAxMTEsMTkyLDIwNiwxNDIsIDI2LCA3MCwgNzAsMTAwLCAzNywxMzYsMTMyLDE0NCwgIDcsMjQ5LCAxNCwyMDAsCisgICAgIDgyLDE5OCwxMDEsMTAxLCAyMiwyNDYsMTc4LDEwNSwxNzEsMTQzLDE1MCwxMDEsMTQ4LDEwOSwgNTksIDQ2LAorICAgIDEyOCwyNTQsMTEwLDE1NCwyMjQsMjM5LCA2MiwgNTcsMTQyLDEwMSwgOTYsMjAzLDI1NSwgMzcsMTI3LDI0MSwKKyAgICAyMjAsIDI3LDEwMywgNTMsMjA5LCAzMCwxMjMsIDkwLDIxNywgNzIsMjE0LDEyNywgNjIsMjM2LCA3MSwxMDYsCisgICAgMTY1LDE1MSwgOTMsIDkwLDEwMSwgMzIsMjAzLDE3NSwgNDQsIDk4LDEwNywgMjMsMjUzLCAgMCwgIDAsMTg2LAorICAgICAyNSwxMTQsMTY3LDIxMSwgNTcsMTc4LDE4OCwxODAsMTgwLCAyMCwgIDYsMTkzLDE1OCwyMjgsICAyLDE4NywKKyAgICAgNzgsIDU4LCA4NywgOTQsIDY4LDE2NSwyMDEsMTk4LDE2MiwxMDksMjQ0LCA3NCwgODQsMTczLDI0OCwxMTQsCisgICAgMjU0LCA1OSwxNzQsIDQ5LDE4MCwxNzcsIDg3LDE1NCwyMjMsMTQ3LCA4MiwgOTQsMjA1LDEwNiwxODUsMjE2LAorICAgIDIyMiwxNTcsMTE4LDIwNCwyMzgsMTIwLCA4MCwxMTcsMjA0LDEwOSwxNjMsMjMxLDI0NCwyMTksMjEwLDE5OCwKKyAgICAyMTQsIDQxLDE4MiwgNzYsMTUwLCAxNSwgNDIsMjIzLCAzNywxNzQsMTc4LCAzNiwgNTIsMjA3LDE1OSwyMDgsCisgICAgMTQ5LCA5NiwyMzgsIDY1LDIwMSwxMzIsIDI0LCAzNCwxODIsIDkwLDE3MywyMTEsMTY3LCA3OCwgMzksMTk5LAorICAgIDE0MiwxNzUsMTc1LDE3NSwxNzUsIDkzLDE4NywxNTgsMjIwLDIxNywxNjQsMTkzLDE0NCwgODgsIDE5LCA5OCwKKyAgICAgODIsMTUwLCA5MywgOTYsMjUxLDIzNSwgMjMsMTM4LDE5NywxMDgsIDU4LDEzNCwgNjIsMjAzLDIwOCwxMjIsCisgICAgIDc2LDIwMywgNTAsIDY1LDE5MSwyMDMsMjE4LCA1NiwxNTAsMTg1LDE4MiwgODEsMjQyLCA3MCwxMTAsMTIzLAorICAgIDIyNywgNzYsMTg4LDEwMywgNzAsIDc3LDE4MCwgNzEsMTU1LCA4NiwxODcsMjM2LDIyOSwgMzUsMTQ5LDIwNCwKKyAgICAyMDIsIDQyLDE4MiwxNzgsMTE0LCA4MywxODMsIDk4LCA2MiwyMjMsIDExLDIxNCwgNjUsIDg4LDEzNCwgNDUsCisgICAgMTE1LCA5NywxOTEsMTI5LCAyNiwxNjIsMTEwLCA1NSwgOTcsMTE4LDEyMiwxMTAsMTAxLDEwMSwxMTAsMTE4LAorICAgIDE1MCwxNDgsMTcwLDE5MCwyMTEsMjM4LCA0MSwgODAsIDUwLDE0MCwyMjQsMjQ3LDE0NywgNDAsICA3LDI0NiwKKyAgICAxNDgsMjA1LCAzMCwyNTAsMjAyLDE3MSwxOTYsMTc1LCA4NCwxMjksIDU3LDIxMywgMTksIDQyLCA0MCwgNTcsCisgICAgMTk5LCA3NiwyMTksMTIxLCAxMSwxODIsMTc3LDE4NiwxMzcsMTA4LDIyNCwxNjIsIDQzLCA5MSwgNTMsIDQ1LAorICAgIDE1OCwxMzksMjA0LDE2MiwxNzYsIDg0LDEzMSwxMjEsIDE1LCA3OCwxMjYsMTAyLDEzOCwyNDcsMTI4LDI1MCwKKyAgICAyNTIsIDQyLCAyMSwxMTMsMTYwLDI0NiwxMzMsIDg4LCA1NCwgODYsIDg2LCA4NiwgMjIsIDIzLCAyMywxMjMsCisgICAgMTg5LDIyMiwxNzMsMTU1LCA1NSwxMzUsMTcxLDEwNywxODAsMTgxLCA2NywxMTMsMTYyLCAzMywxNjMsIDgyLAorICAgICA3OCwgNDksIDg1LCA4NCwgOTcsMjIyLDE2NywgNzAsMTMwLDE4NSwgNDQsIDY3LDI1MSwgNDEsIDM0LDE0NCwKKyAgICAxMDAsIDk2LDIwNywxMTMsICA2LCAxNCwyMDYsMTc4LCA5OSwyMjksMjI0LDIwNCwxMDEsIDI1LCA1NiwxNzEsCisgICAgMTk2LDExNSwxNTYsIDg1LDE1MywyMDUsMTU0LDEwNCwxNDMsMTU4LDE3NiwyMTgsIDUxLDEzMCwyMDcsMjM2LAorICAgICA5NywxMzMsMjA2LDE3OCwgNDMsIDE5LDEyOSwyMTEsMjA1LDE3MSwyMDMsIDgzLDEzOCwgNjksMjMxLDE1MiwKKyAgICAyMzksMjQ0LCA4MywgODQsIDkwLCA5OSwyMzksIDEyLDEzNSwxMjksMTU4LDIzNCwgNTIsMjMwLDIzMSwxNTAsCisgICAgMTUxLDE1MSwyMTksMjM3LDExOCwxMTMsMjUzLDIwNywyMzgsMjI4LDE3MCwgOTAsMTQ2LCA5MywyMjIsMTI1LAorICAgICA5OSwgMjMsMTIwLCAyMSwyNDksIDIxLDIzMCwgNzMsIDg4LCA4MSwxMjQsMTIxLDE3MywxOTEsMTM4LDIyOSwKKyAgICAxNzAsIDU3LCA2OSwxNjEsIDY2LDEyNCwxNDksMjQ0LDE1MSwgODMsIDc1LCAzMywxNDYsMTgzLDIyNSwgIDcsCisgICAgIDQ4LCAyNiwxNDAsMjExLCA0NCwyMDQsIDYwLCA1NiwxNjksMTQzLDE4MCwxNTAsIDgxLDE5OCwgODgsMjMyLAorICAgIDIyMSwxMTgsMTc2LCA3NiwgIDcsIDUxLDEwMywgMjAsIDk5LDEwMiwgNjgsMTU2LDE1OCwxNTgsMTU4LDE1NCwKKyAgICAxNTQsMTM4LCA3OSwxNTksMjIyLDIxNiwyMTYsIDg4LDE5MSwxMTcsIDQzLCA4OSwyMjMsMTYwLDE5MywxNDQsCisgICAgIDE4LDEwOSwxNTQsIDg1LDE2MCwgNjQsMTMzLDIzNiwgNzQsMTg1LCAgNiwgMjUsMjA2LDIwOCwgOTQsIDQ2LAorICAgIDIxNiwyMDEsIDIwLCA5NCwgOTgsICA1LDE1NCwgNDMsMjA1LCAgMCwgNDgsIDkzLCA4OCwxNTMsMjE1LDI0OSwKKyAgICAxNTAsIDE1LCA5MSwxODIsMTcyLDIyMCwxOTMsIDg5LDI0NiwxODgsMjQ1LDExMiwyMzAsIDE4LCAxMywxOTgsCisgICAgIDkwLDIwNiwgIDcsIDEwLCA1MywxNjksIDczLDExNSwgMzIsMTU2LCA2NiwgNDAsIDYwLDE3MiwgNjksMTAyLAorICAgIDE4NSwyMDMsMTY3LDIxMSwgNjAsMjAzLDIxMCwxNzAsMTc2LDE1NCwgOTAsMTk4LDE4NCwxOTcsIDkyLDEzNiwKKyAgICAgNTcsMTU5LDIzNCwxODcsIDg5LDI0MCwgMzgsMTM4LDExNiwxODcsMTMzLDExNSwgNTEsMTc5LDEzOSwxMzksCisgICAgMTc5LDE3OSwgNTEsIDc0LCA0MSwxMjgsMTg3LCAzNSwgMjMsMTQwLDIyMSwxMDYsIDIyLDIwMywxMDUsMjUzLAorICAgIDE4NCwyMTYsIDQzLDE5NywxNTEsMTQzLCA0NSwgOTEsIDcxLCAxNywxMDIsMTAxLDE3MSwyMzMsMjI2LCAzNCwKKyAgICAgODIsMjIyLDE5OCwxNDMsIDc4LDE3NSwgIDksMjE1LCAzMiwgODUsMTEwLDE2NywgMjQsIDg0LDIwNCwxNDEsCisgICAgMTYwLDEyMywxMDYsMTYyLCA4MywyMTQsMTU0LCAyNywgNzMsMTE1LCA5MCwgNDIsIDgwLDE2NSwgNzEsMjIwLAorICAgICA1NywgMTQsIDgwLDIyMCwyMTUsMTY4LDE0MCwyNDMsIDg0LDEzMCwgNDksMTg3LCAyMCwgMTksMjUxLDEwNSwKKyAgICAxNjMsMjA5LCA4OCwgOTQsIDk0LCA5NCwgOTIsIDkyLCAyOCwgMTMsMTM1LDE3MSwxMDcsMTA3LCA1OSwgNTUsCisgICAgMTExLCAzNywxODksMTkwLCAyNiwgMTIsMTM3LDEzMywgNzcsMjI5LDE1MSwgODMsIDE3LCA4NiwgODYsIDk3LAorICAgIDEwNCwyMzMsMjMwLDIzOCwgNTMsMTUzLDI1MSwyMDIsMTQwLDEwMSwyMzAsIDMwLCAxMCwxNDgsMTEyLDEwMiwKKyAgICAxMzYsIDM4LDIyNCwxMDgsIDcwLCA4OSwgMzgsMTU0LCAyMCwxNTgsICA5LDE5NywyMzYsIDQ0LDExMSwxNTEsCisgICAgMjM3LDEwNSwgNTIsMTI4LDI1MywgNjUsMTczLDE0NCwyNDksMjIyLDIyMywgNTcsIDQ0LCA1MywxNjQsMjAyLAorICAgIDIyMywxNDEsMTE5LDI0NSwxNzksMTk3LDE1MywxNzcsIDI1LCAyMywxMDIsMTUzLDE0MSwgMjAsMTU3LCAgNSwKKyAgICAxMzcsIDQxLDE1OCwxMzgsIDYxLCAzMywxMzgsIDg3LDEyMiwyMDIsIDc1LDI0NiwyNDUsMTM2LDIxNywyMTUsCisgICAgIDYwLCAzNiwyMjEsMTEwLCA3NCwxNjcsMjIxLCA5MywgOTQsIDkwLDE1MiwxNTksMTExLCA1MiwgMjYsIDQ4LAorICAgICA3OCwxMTIsMjM3LCA3NywgNDYsMTc1LCA1NCwgNTMsIDQzLCA3OSwxMTcsMjM1LCAzNiwxODgsIDIyLDIwOCwKKyAgICAyMjIsMTQwLCA5OSwxNjEsIDY0LCA1MywgMTIsMTMxLCA0OCwgNDcsMjQ5LDExNCwxMDcsMTkwLDEwOCwxOTcsCisgICAgMTcwLDIyMSwxNzQsIDY3LDE0OSwxMDgsIDk5LDE5MCwyMDcsIDk5LDEyMSwxMTQsMTE2LDE1NiwyNTQsMjAyLAorICAgICA5MywxMDAsMjIyLDE1MywxOTgsMTI2LCAxNSwgMTcsIDQ4LDE1MSwxMDksMTAwLDE5MywgNTMsIDY2LDE5MCwKKyAgICAgNjcsIDI3LCAyMiwgNjgsMTA0LDEwNSwgMTAsMTk1LDE4MiwyMTgsIDY0LDE3MywyMTcsIDI2LCA3MywxNzksCisgICAgMTkwLCAxOCwxNTMsIDEzLDIwMCwgODgsICA0LCAxNywyMTksMjM3LDI0NiwyMDEsIDE5LCAzOSwyNDQsMTc3LAorICAgICA5OSwyNTMsMTI2LDEyNywyNTMsMjA2LDEyMiwyNTUsMjE0LCA0MiwyNDQsICA3LCAgNiwxMDAsICA4LDE5MiwKKyAgICAgIDYsMTAwLCA4NiwxMTIsMTYxLDE1MSwyMzIsIDY3LDIxNCwgMzcsMTQ1LDE5MiwxODUsIDk2LDExMSwxMDUsCisgICAgIDU0LDIxNCwyMDUsMjQ2LCAzNiwxODMsIDU2LCA3NSwyMTMsIDg5LDEyMiwgIDQsMTk3LDIxNywgNzAsMjE2LAorICAgICAzMCwxNjIsICAyLDIwOSwgOTIsMTE3LDIzNSwgIDksIDgwLDIzMSwgNTMsMjE4LDIxMSwxMDQsICAwLDIyNCwKKyAgICAgMzAsIDkyLCAgNywxMjIsMTY1LCA4NywyNDgsMTg3LCAgMCwxNDYsIDYwLDE2OCwgNTEsIDk1LCAxNCwgMjUsCisgICAgMTQ5LDExOCwyNTMsIDQ5LDEyMCwgNjMsMTkxLCA3NCwgNzQsIDEwLDIwMywxNjYsIDkwLDEzNCwgODMsIDQ2LAorICAgIDE3NiwyMTAsMTY2LDI0MiwxNjUsMTIwLDIwMywxMDcsIDU0LDIzOSwxMzksMTc1LDIzNiwxNTQsMjQ0LDI0MiwKKyAgICAxOTAsIDMxLCAgNCwxMTMsMTc3LDIxMywgOTQsIDkyLCA4OCwxNTgsMTU1LDEwNywxODMsIDkwLCA3MiwxODAsCisgICAgIDQzLDE1NSwxMzksICA5LDEyNSwgNDEsMjIzLCAgMSwxMTEsMTc1LDE5OCwxNzAsMjUzLCAyNiwyMjEsMTI2LAorICAgIDEzMiwgNjUsICA1LDE5MSwgNTAsIDg4LDE2NSwxNjIsIDQzLDIyOSwxNTAsMTkxLCA5NiwyMDAsMjM3LDE1MSwKKyAgICAyMjcsMTQ2LDE3MSwgODAsMTczLCAxMCwyMzIsIDg1LDExMywgODYsMjE0LDEyNywgODUsIDYxLDIyNCwxOTgsCisgICAgIDY5LDI1MCwgNjUsIDI0LCAgMCwgMjQsIDIzLDIwMSwyMjQsIDMxLDE2NCwgNDksICA3LDIwMywgNjksMTIxLAorICAgIDExOCwgNzYsMjA0LDEyNSwgNzcsMTM2LCA0OCwgNzMsIDUwLDEzOCwxNDUsMTM3LDE5NSwxMzYsIDg4LDEwNywKKyAgICAyMDUsMTQwLDIxNCwgNzUsIDI2LCAzNSwyMDMsMjA0LCA5OCwgMTIsIDQ1LDIyNiwyNDQsMjEyLDIxMiwgODQsCisgICAgMTgzLDE3MSwxNDMsMTU5LCAyNCwyNDQsMjUxLDIzNSwxMTksMjM4LDI0NCwxMTEsMTY3LCAzMiwgNjcsIDIyLAorICAgICAxMSwgMjYsIDczLDIxMywxNDcsMTI4LCA1OSwgMzUsIDczLDE4MiwxNjgsIDM0LCA0NywgMjgsIDc1LDIyMywKKyAgICAyNTEsIDQyLDIwNCwxOTcsMTUzLCAxMSwgNTAsIDY4LCAxOCwxMDMsIDU4LDIxMywgMzMsMTU0LCA1NywgOTAsCisgICAgIDg5LDIwOSwxNzIsMjU1LDEwNiwgODEsMTQwLCAxNywgMTEsICA3LDIwMiwyMTcsMjE5LCAzNywyMTksMTgyLAorICAgICAzNiwxMjcsMjI2LCA5OCwgMzMsMTA1LDE4OCwgNTksMTgwLDIzNywxMTMsIDIyLDIwMCwgNjcsMTYxLDIwMSwKKyAgICAxOTMsMTk1LCAxMywyMzksMjQ2LDE5MCwxNjMsIDM5LDEzMiwxNzEsIDE1LDIwMywgNDYsMTg1LDEyMywxNDUsCisgICAgIDg2LCA3OCwxNDksMTA1LDExOCwgNjEsIDU5LCAyMCwxNDcsIDQyLDI0MSwyMjksMTk4LCA5NCwgNTAsMTY2LAorICAgIDEwMCwgNzUsMTE4LDEzNywyMTYsMTQ0LDExNiwxODcsMTgxLCA5NSwxMDgsIDg1LCAxMCwgNDYsIDM5LDE2MSwKKyAgICAxMzUsIDQyLDExNCwgMjEsMTAwLDE1MSwxMDMsIDI2LDE2OSwgNzQsMTIxLCA0MSwxMjcsIDY5LDExOCwgIDksCisgICAgIDkxLDExMCwxODEsMTA2LCAgOSwgOTQsIDEwLCA3NSwgMjEsMTcxLCA5NCwyMzYsIDUzLDI1NCwgMTcsIDEzLAorICAgIDE5OCwgNjAsMTkwLCA5NCwgMTYsMjMwLCA0MywgMTEsIDM0LCA5OCwgIDAsMTAzLCA5NSwyMTgsMTk0LCA5NywKKyAgICAxNzEsIDg0LCA5MSwxMzYsMjI5LDEwMCwxNDIsMTQ0LDE0NCwxNDYsMTg4LCA3OSwgOTksIDM4LDE5MiwxNzIsCisgICAgIDEwLDIwMywxMzMsMTUyLCA2NywgNDksIDE3LCA2NSwxNjIsMTY5LDIzMywyMzMsMjM4LDIxMiwgMjAsIDMxLAorICAgICA2MywyMjIsIDMxLCAxMiwyMzgsIDI0LDE0NCwgMTMsMTM0LCA1MiwgMjQsMTQ1LDIxNCwgIDgsIDk4LCA1NiwKKyAgICAxOTQsMTQ0LDExMCwgNDksMTA1LDE0NywxNzUsMTQ2LDE1NywxMTYsMjQ0LCA5MCwgOTQsIDUzLDIzMCwgNzAsCisgICAgIDk5LCAgMiwxNDIsMTg3LCA2OCwgNzQsMTY1LDE2OSwxMDMsIDU3LDExNSwxMDUsMTAyLCA1NSwgMTcsMjA3LAorICAgIDE3OCwxOTgsMTMwLDI0NywyNDQsMTg0LDIzMCwxMDAsMTM5LDIyMiwxNTEsMTY0LCA5OCwgNjIsIDY4LDE1NiwKKyAgICAyMDIsIDIzLCA0MSwgNjEsIDY1LDIyMSwxMDksIDUwLDE3NywyMjYsICA0LDE5MiwgOTMsIDc4LDIyNywyMDEsCisgICAgMTQ0LCA5NywyNDgsIDY0LCA4OCwxMjIsMjQ3LDE3MCwxNzAsMTcyLDE3MywxMzgsMTUxLDE5NywgMjIsIDYyLAorICAgIDEwMiwxOTIsMTcwLDI0MiwxMzcsMjM4LDEyMywyMjUsMTE2LDEwNywxNTksIDkyLDExNSwgNzMsMTQ5LCAyMiwKKyAgICAyMTksMjUzLDIyNCwgODYsMTI2LDEzNywgMjEsMTEzLDE4NywgMzcsMTczLDIzMCwgNTYsMTA4LCA4NSwgMzgsCisgICAgIDkyLCAzNywyMDksMTgxLCA3MSwyMTIsIDg1LCA1MywyMDUsMTUyLDI0MywgNzUsMTQ5LDE1MCwgIDgsIDIxLAorICAgICAyNywyMjYsMTMyLCA4OSwxMjcsMTM3LDIyNiwgMTAsMTYxLDE3MiwyMzcsMTA2LCA2NSwxMjEsMjE3LDIxMiwKKyAgICAxOTAsICA0LDE3NSwgOTgsMjM2LDEzMywyNTEsMjI1LCA4NywgMzMsICA4LDE3OSwgODksMTkwLDE1NywgNzksCisgICAgIDM2LCAgMiwxMDIsIDI3LDEzMiwyNDksMjM1LCAxMywyNTMsMjUwLDIxNiwgMTAsMTM4LCAyMSwxNDIsIDc0LAorICAgICA2NiwgIDksIDM4LCA3MiwgNjgsMTQ4LCAzNiwxMjEsMjA1LDE1NCwyMTQsMTU0LDEzNiwxODEsMTAyLDEyNywKKyAgICAxNTIsMjUxLCAzMywxMTAsMTgzLCAzMCwgMTcsIDY4LDE1NiwgNzQsIDIxLDIxNywyNDEsMjA5LDEwNCwxODQsCisgICAgMTg1LDE4NSwxODEsMTg5LDE4MiwxOTgsMTg5LCA2MiwgMTMsIDcwLDEwNiwgMjAsMTY1LCAgMCwgMjMsIDY0LAorICAgICAgMCwxMzQsMTgwLDEyNywgNDMsIDU4LDI0MywxNTIsMjMyLDEwNiwgNDksMTE5LDE1NCwgMTgsIDYwLDE5NSwKKyAgICAxNTIsIDg3LDE5NSwxODYsMjUxLCAgNywgNzIsIDczLDE2MywyMTcsMjAyLCAxOSwxNzUsMTAzLDE1MywyMjgsCisgICAgMTUyLDI0MiwxODQsMTAyLCAyNywgOTYsMjI3LDE1MiwyNDksMTIwLDExNiwxNTIsMTMzLDIwNiwgNTEsIDkwLAorICAgICA3NCwgNzksMTExLCA0MSwyMTMsMjQ1LCA3MywyMTMsMTYzLCA5MywxMDQsMTc5LCAxMywxODcsIDg3LCA4NywKKyAgICAxOTAsMTI1LCA1MCwgMTIsMjM5LDI1NSwgNzAsMTk3LCA2MywgNTIsMTkxLDE2MiwgMTYsIDkwLDI0OSwxNjgsCisgICAgICAyLCAxNywxNDMsIDg5LCAyNSwxNzMsMjIwLCA2MCwxNTgsIDExLDIxNSwgODgsIDk2LDEyMSwgMjAsMjAzLAorICAgICA1NywxNDksMTExLDE3NiwgNDAsMjUxLDI0MCwxMzQsIDk5LCA3NSwxODMsIDkwLCA0NSwyMzQsMTgyLDE4NywKKyAgICAyNDMsMjQzLCA1MSwgNTEsIDUxLDIwNSwgNzAsIDk5LCA0NywxMDgsMjQ5LDIxNywgIDUsIDg2LCA4NywyMTAsCisgICAgMTk1LDI0OCwgODQsMjE4LDIyMSwxMDcsIDg2LDI0OSwyNDAsMjQyLCA1OCwxNjksIDU4LDE3NCwgODEsIDIxLAorICAgIDEyMywyMjYsMTg0LCAgNSwxNzAsMjQ5LCA1OSwxNDksMjE0LDEyMiwxNDUsMjQyLCAxMSwgMzgsMjA4LDIwOSwKKyAgICAgOTQsMjI0LDE5MiwgMTEsMTEyLDE0MywxMzUsIDYwLDIxNiwgNjksMTAxLDEwMywyNTUsIDQ5LDEwOSwyMjQsCisgICAgMTI4LCAzNywxMzIsIDQ5LDIxNiwgIDgsIDYzLCAzNywgOTIsMTYxLDIzMiwgMTMsMjUyLDEwOSwxMjAsMTM3LAorICAgIDE0NCwgNDAsMjQxLDE4NywgOTksIDM5LCA3MywgOTgsIDYyLCAzMiwxNDUsIDQ2LCAzMywgNDQsMTgxLDE0NywKKyAgICAgNjgsMTAwLCAyNiwgMzcsMTYyLDIxMywgOTYsIDE0LDIwMCwxNDAsIDgwLCA4NCwxNTcsMTEwLDE4NywyMjEsCisgICAgIDU3LDExNCwyMjgsIDcyLCAyOCwxOTksIDU5LCA1OSwgNTksMTU1LDExOSwyMzgsIDY4LCA5MSwyMTksIDQ4LAorICAgICAyNCwxNzAsIDc2LDE0OCwyMjksMTg5LDExOSwxMjgsMTk3LCA1NCwgMTUsMTMxLDIyMCwxMDIsIDIyLDExMiwKKyAgICAxNTAsMTcwLDE3OSwgMjgsIDkxLCA0NiwyMDAsIDQyLCA4NCwgODgsICA2LCA3MSwgMjMsMTA2LDE0NCwyMjEsCisgICAgIDg4LCA1MCwgODcsMTU3LDExNCwgMTMsMTM4LDExNywgNDUsMTUzLDI0NywxNDgsIDkyLDE2MSwxMzcsMTkxLAorICAgICA4NCwxNjAsMjE4LDIzNSwxNTEsIDMxLDE4OCwyMDIsMTc4LDE5OCwxMTMsIDI1LDE5NCwyMTYsMTk3LDE3MCwKKyAgICAgMTUsIDk2LCA1MCwyMjUsMTkwLDEwNiwgMTcsIDk2LDI0NywxODYsMTcwLCA0OSwxNTYsMTQ2LDExNCwxNjUsCisgICAgMTA0LCA3MywgOTQsMTAxLDEwNywyMjEsIDI4LCA4NCwxODUsMjE1LDEyMywxNzksMTM1LDE4NywxMzAsIDQ0LAorICAgICAgNSwxNTAsIDg3LCAyNywyMjUsMjEwLDEwOSwxNTksMTQ0LDE0NiwxNzAsMTA1LCA2OCwxMDUsIDUzLDE5NSwKKyAgICAxNTMsMTY5LDI0OSwyMTcsMTg1LDE2OSwxMTAsIDU1LDExMiwxMzgsIDc4LDI0NywyMzMsIDE5LCA5NywgOTIsCisgICAgIDI1LDEyNSwgODUsMjM1LCA0NiwgNTUsMjM3LDE3MCwgMTAsMjM1LDE5OSwxOTQsMjAzLCA0NywyNTAsIDQyLAorICAgIDExOSwgMzgsMjA0LDE5MiwxNDksMTc1LCAxOCwyMDIsMTYwLDE1MiwxMDksIDgwLDE1NSwxOTUsIDQzLCA2MywKKyAgICAgNDEsMTU2LDEwOSwgOTgsMTk5LCA2MywgNzksMTMwLDIyMSwxMzEsICAyLDE4MywgNDgsMjIzLDIzNiwgOTEsCisgICAgMTAyLDE0MiwxNjEsMTMxLCA0OCwxOTMsMTQ2LCA4OCwyMDAsMjM4LCAgNSwgMjIsIDg1LCA5NywxMzQsIDQ2LAorICAgICA1MiwgIDksMTUyLDEzNSwgNDgsMTczLDExNywxNDYsIDIwLCAxNiwgNzAsMjA0LDE1NCwxMzYsIDUzLCA1MSwKKyAgICAgNDksIDg5LCA3MSwgNDEsIDM0LDE1NiwxMjksMTcyLCA1MiwxNTQsMTQxLCA3MCwgOTksIDk3LCA5NywxMjYsCisgICAgMTI2LDE1OCwxNTMsIDcxLDE2MywyMDksMjE0LDI0NiwyMTQsMjA2LDE1NywgMTMsMTg5LDIxMSwxOTUsMjI1LAorICAgIDEzNiwgNzAsMTEzLDE5OCwgNTAsIDQzLDE0OCwgMzIsMTU3LDIwMiwxMzIsMjIwLCAyNywgODYsICA5LCA0OSwKKyAgICAyMzEsMTIyLDEzNSwxMDQsMjQ5LCA1MiwxMDEsICA5LCA5NCwyMjQsIDQxLDE4MSwxNTYsIDg2LDI0OSwxNTEsCisgICAgIDMyLCA0NSwgNDIsMjAzLCAzNSwgNTEsMTE5LCA5NywxMjgsMTAwLCA4MywxNTksMTU4LDExOCwyNDMsIDMwLAorICAgICA3OSwxNzIsMTQ4LDExMSwgOTksMTA4LDI1MywxMjUsIDcyLCAzMCwxNjksMTg2LDIzNywyNTMsMTA0LCA1MSwKKyAgICAyMTcsMTg5LDEyNiwgNzQsMTcwLDExMSwgNDQsMjU0LDEwOSwyMjAsIDEzLDE5MCwxOTIsMjIzLDE2OSwgMTYsCisgICAgIDI4LCA1NCwyNDksMTUxLDI1MywgNDgsMTcxLCA4MiwxMTUsMjQ5LCA4NSwxNjYsMTc0LCAxNiwyMDMsMTA4LAorICAgICA5OSwgODEsMTE4LDIyOSwyMTUsIDIwLDIzNSwxOTIsMjQ2LDE0MywgNDUsIDgxLDE2NCwxNTUsIDEzLDEwNSwKKyAgICAgNTQsMjEyLCA4NCwxODMsIDU5LCA1OSwgNTksIDYxLCA2MSwgOTMsIDQxLDE4MSwyMzgsIDE3LCA5MSwxNzYsCisgICAgIDkxLCAyMSwxNDcsMTA3LCAyNCwgODMsMTYyLDEwMCwgIDIsMTY5LDEwNCwgMjcsMTA5LDE4NywxNTUsMTkyLAorICAgIDIzNywgIDAsMjM3LCA1NSwxNzksMTc1LDE0NCwgOTMsMjA2LDE4MiwxNDMsMTgyLCA1NywxODAsIDE5LDE3NiwKKyAgICAgMjEsMjE4LDE3MSwxNjIsMjU1LDIyMCwyMjIsMjM3LDEzNywgMjIsMjM2LDIzMSwgIDUsIDUxLCA5MSwyMjIsCisgICAgIDEzLDE0NCwxOTksIDk3LCAyMiwgOTcsIDQ0LCA2NCwxNzQsMTAxLDIwMiwxNTEsIDkwLCAyMiwyNDIsIDQ3LAorICAgIDE4MCwyMDEsMTI1LDEwMiwgMjEsIDQxLDE5NSwxNDksIDk3LCA4NywgNzQsMTc3LDIzNiwxNDEsMTM3LCA1MiwKKyAgICAgNTEsMTA1LDE1NywxNjIsMjAzLCAyNSwgNzAsMTQ0LCA3MywxNDksIDIyLDIwMywxNTgsIDk3LDEzMiwxNjgsCisgICAgIDU4LDE1NywxMTgsMTg3LDEyNSwxMDAsMTIxLCA2OSwxMDcsIDYxLCAyOCwgMTMsMTgzLDExOSwxMTgsMTIyLAorICAgICAyNywxNTUsIDYyLDIwMywxMTQsMTQzLDE1MywgOTcsIDY5LCA5MSwxNTYsMTI5LCAzMSwyMzEsMTQ3LDEzNSwKKyAgICAxNzMsMTQ2LCAxNiwgIDMsIDQwLCA2NiwyMDUsIDg5LDI0NCwxNDQsMTc3LCAxMiwxNjAsMTYwLDIxNSwgMjgsCisgICAgIDMzLCAzOCwxMjEsMjU1LCA1MCwxMTIsMTAzLDExNCwxMTUsMTk5LDE1MSwxOTEsIDQwLCAzMywgNTYsMTcxLAorICAgICAgMSwgNjAsMjIzLDIyNCwgNjEsMjQwLDE4NCwyMzUsIDYwLCAyOCwgMzAsMTQwLCA2NywxNDgsIDEwLDE1NSwKKyAgICAgOTEsMTY1LCA1MCwyMjAsMTY5LDE4MCwxNjIsMjAzLDIwNSwyNDcsMjM5LDEzMCwxMDYsIDYwLDIyOSwyNDIsCisgICAgMTk4LDE1MywgMTksIDQ0LDI0NCwgMzgsICA1LCA0MCwxMTQsIDEwLCA5NiwgMTIsMTcwLCA3NCwxNjIsMjA0LAorICAgIDIwOCwxNzAsIDU4LDE4MiwyMDcsMTEwLCA4MCwgNDIsMTAwLDIxNiwgMjcsIDkxLDIyNywxNTMsIDUzLDIxMSwKKyAgICAyMzcsIDc4LDE4MSwxNTQsIDc3LCAzNCwyMTgsMTM1LDIxMiwgNDIsMTU0LDE5NiwyMDIsMTQwLDEwNywgNzksCisgICAgMjA1LCA1MywgNTQsMjM3LDE3MCwxNzQsMjQyLDI0MiwgODIsMTIzLCA4NSwgIDYsIDg4LCAgMSwgOTEsMTY1LAorICAgIDE4MCwgNDMsIDIzLCA5NSwyMzMsMTc0LDE0MiwyMjcsMjI0LDEzMywyNTEsMTI0LCA5NCwgIDYsMjUxLDE1MiwKKyAgICAxNzEsMTI5LDE3MiwxNjIsMTYyLDE0MCwgNDgsIDE3LCA5OCwgMTYsMjQyLDE1NCwgMjEsMTAyLCAzOSwxMjEsCisgICAgIDMzLDE5MywgNzksMjM5LCA0MywgODksMTQ0LCAxNywgMTcsIDM3LCA1OCwgNzMsIDYzLDEwNiwxNDMsIDk4LAorICAgICA2OCwyMDIsMjE2LCA3MywxMDIsIDY3LDE3NywxMTQsIDM0LDE1MCwgMzUsMTA4LDE0MCwgMjIsMTc5LCA3NSwKKyAgICAyMDQsIDE3LCA2OCwxNDQsMTY4LCAyNywgIDQsMjIxLCA3OCwgODcsIDg2LDE0MiwxMDQsMTczLDEzNSwxOTUsCisgICAgMjI1LDIwNiwyMDYsIDc4LDExMSwxMTUsIDgzLDIzOSwyNDQsIDMyLDEzOCwyMTMsIDQwLDE2MiwgNTYsIDQ5LAorICAgIDI0OSwxODQsIDQzLDIwNSwyMTAsMjE0LDEzNSwxNTMsIDM1LDE0NywgMTAsMTA4LDE0NSwyMTUsMTYxLDE5MSwKKyAgICAyNDAsIDg1LCAzOSwgMjYsMjAzLCAyOSwxMTgsMjIyLCA1NywgNTQsMTYzLCAyMSwxNjYsMTc1LCAxOCwgNzgsCisgICAgMjQzLCAzMSwyMTksIDkwLDIxNCwxNzksMTUwLCAzNywxOTgsIDU3LCAgMiwgMTMsIDQzLCA4MywyNTIsIDc2LAorICAgICAyNiwgOTksMjQ5LDI0OSwgNDcsIDM3LDE1NCwgNjEsIDI0LDEyMCwyMzcsMTAyLCA1MSwxNjUsMjQwLDE5MSwKKyAgICAyMDIsICAwLCA1OCwyMTgsMTcwLCA2MCwgMjcsMjMyLCA1NiwgNjgsMTAzLCA4MSwxNTEsMTA3LCAxMiwyMjEsCisgICAgIDczLDE5NSwyNDIsICA0LCA5OCwxNDksMTI3LDE3MiwgIDYsIDI1LCA4NywxMjUsMTE3LCA3NiwgMzMsMTMxLAorICAgIDIzNiwxNDMsMjEyLCAgMCwgIDAsIDI4LCAgNiwyMjAsMTA4LCA3MiwgMjQsMTcwLDE2OSwyMDYsMjM4LDIwNCwKKyAgICAgMjYsIDM5LDE4MSwxMTgsIDgxLCA5MSwgNjIsMTgyLDE2MCwgODAsICAwLCA4MCwgMjUsMTE3LDE0MSwxMzksCisgICAgMjM0LDE3MSwgMjMsIDU1LDE3MCwgMzQsMTg3LDI0MiwgMTMsMTMyLCAgMiwgMTUsIDkzLDIwNiwgOTQsMTQyLAorICAgIDEyMywgIDQsIDk0LCA2OSwxMjAsMjQ5LDE0OSwgNzIsMjQ3LDE5NSwxNzUsMjI2LDExNiwxMDAsMTQyLCA0OCwKKyAgICAyMzEsMTE5LCA1NiwgOTQsIDE4LDE3OSwxNDEsMjE3LDE5MiwgOTMsIDM0LDEwMCwgIDksMTAyLDE0MywgODUsCisgICAgIDI2LDIxOSwxNTUsMjIwLDEzOSwgNTIsMTA1LDEwNywgMjQsIDUxLDEzOCwxNTMsMTQ1LDE2OSwgNDgsIDY3LAorICAgICA0OSwgMTksMTM1LDEwMSwgMzUsMjE5LCA1OCwxMzIsMTUzLDE2OSwxNTIsMjM2LDE0MywgIDUsMTUzLCAgMCwKKyAgICAgMTYsIDk4LCA0OCwgNTMsIDUzLDIxMywyMzcsMjAyLDIwMiwxMzgsMTAyLDE0MiwxNjIsMTA0LCA0OCwyMzIsCisgICAgMjQ3LDEyMiwyNTMsMjI1LDE5OCwgMzgsIDEyLCAgNiwgMjQsIDM3LCAyMCwgMzksIDcwLDE1NCwxODUsIDU2LAorICAgIDEzMSwxNzIsMjQ4LCA0MywxMzMsMTM2LCA5MSwyMTEsMTQ0LCA3MSwgOTksIDk2LDEwMSwgMjYsIDIwLCA2OCwKKyAgICAxNTMsMTc1LDE5NywxOTIsIDkzLDIxNCwxNTgsMTUxLCA5OCwgNTYsIDk3LDE5MSwgNTYsIDU1LDIwNiwyMjYsCisgICAgIDg3LDI0MSwyMDQsIDk2LCA3MCwgNDUsMTQ4LDIxMCwyMjgsMTAyLDIyNSwgIDksIDQ3LDE3NiwxNTksIDU2LAorICAgIDE4MCwxNzAsMTQ4LCAxOSwxNzEsMjE0LDE2OSwxNDgsIDQyLCAxNiwxMDAsMjA3LDI0MywyMTQsIDU5LDE5NywKKyAgICAxNjUsIDUyLCAzNSwgMzMsMjU0LDE1MSwxODgsIDUwLDIwOSwyMzYsIDM5LCA3MiwxMTMsMjIyLDE3NiwgNTAsCisgICAgMjI4LCAgMiwxMzUsIDc3LCA4MCwxNDksMTE1LDE5MywxOTAsMjUzLDIyNywgOTQsMTAxLDE2MywxNzgsIDMxLAorICAgIDEwMiwxMzcsIDM0LCAxNCwgNjcsIDE0LCAgMywxMDgsMTgzLDE1NCwxMTUsMTc5LDIxMSwxNTcsIDc4LDE4NywKKyAgICAyMjEsMTEwLDEzMiwyMjUsMTkwLDE1MywgODUsMTQ0LCA5MCwgODAsMjA5LDIyMCwgIDYsMTM4LDIwNSwgODEsCisgICAgMjQ3LDIyNywgMjIsMjExLDI0NywgNDYsMTg0LDExOCwgODUsIDk0LDEyMSwxNDgsIDIxLDEyMCwxOTcsIDE5LAorICAgIDE3MCwyMjQsIDIxLCAxMSwxNzEsMTMwLCAyMCwgMTcsMjA5LDI1MiwyNTIsMTk0LCA2NSwgNDAsMjUzLCA5NiwKKyAgICAgMzEsMTgzLDExMywgMTYsICA2LDIxNCwgNzIsMjUwLCA3OSwxMDUsIDM1LDE5NiwxOTIsIDMyLDIwNiwgODEsCisgICAgIDk1LDE2MCwyNDMsICAzLDEwNSwxNDUsMTU5LCAzMCwgNDksMTYzLDE3OSwgMTgsIDc1LCA0NiwyNDcsMTg5LAorICAgICA0NiwgMTMsMTY1LDE4MSwgODYsMjAyLDE5NiwgOTcsIDY5LCAzMywgMzgsIDY2LDEwMSwgNzEsMTA1LDEyNSwKKyAgICAxMDEsMjMwLCAzNywgMjksMTQ0LDEyOSwxMzYsMTYwLCA4NSwxMDksIDcyLCAyMCwgNDAsMjEzLDExMCwxODMsCisgICAgIDIzLDIzMCwgMjMsMjI4LDE5NiwxMzcsIDU2LCA3MywxMzQsMTk1LCA5NywxOTEsMjIzLDIzOSwxMTEsMTA5LAorICAgIDIzMywyNTQsICAwLDE2MiwxMzYsMTQwLCA1MiwgOTksMTY5LDE5NCwgODksMjQ2LDEwOCwgMTgsMTE4LDIwMiwKKyAgICAgODMsMTkzLDExNSwxMzMsIDc4LCA1MSwxNzgsIDYwLDI0OSwgNjYsMTc1LDIwNCwxOTQsIDQxLDIwMywgIDAsCisgICAgMTU5LDExMCwyMjQsIDg2LDI1MiwxMjMsIDI0LDIwNSwyNTEsMTAwLCA4NywgNzEsIDk5LDI1MSwxNTUsICAxLAorICAgIDE5MiwgOTMsMjQyLDExNiwyMTcsMTc1LCAzMCwxNDcsIDEwLCA2NywgNTYsMjQ2LDE5NiwxMTgsIDk3LCA1MiwKKyAgICAgNTQsMTI1LDE3NSwxMTYsMTQ1LDExMCwyMzcsMTA0LCA4MSwxMDksMTg1LDE5MywxNTAsMjMxLCAyNSwxOTMsCisgICAgMjIzLDIwNSwxMTIsMTU2LDEyNywyMjAsMjA3LDE2NCwgNjgsIDczLCA1MywxNDIsICA3LCAyMiwgMzQsIDU1LAorICAgICAgMiwxMTAsIDUyLDE2MCwyMTcsIDgwLDIzNywxMTgsMTAzLDEwMiwxODYsMjExLDEwNSwgNTUsMTU1LDE3MywKKyAgICAgMzIsICA4LDE5OCwgMjUsIDM1LCAyOCwgNjMsIDQ5LCA4MywyMzcsIDE2LDE5OSwgIDQsMjQzLCA4MCwxNzAsCisgICAgIDY1LCA0MCwyMTIsIDQ1LDEyMSwyMTYsIDQyLCA0MCwgNDcsMTM5LDE3MywgNzQsMTE4LCAyMSwxNzIsMTYzLAorICAgIDI0MiwgNDYsICA2LDExMCwgNTIsIDg2LCA0MSwxODcsIDE0LDEwNCwxODIsIDU4LDIxNiwyMjMsMjA1LCAyOCwKKyAgICAgMzUsMTUzLDE4MiwxNTIsMTEzLDIzNSwxOTQsMjA0LCA4NywyMTcsIDgyLDIwNCwxMjksIDYzLDE2MCwgNzAsCisgICAgMTQxLDE0MCwxMzYsMjMwLCA5MywgMjIsMjIyLDIzMSwxNzcsMTg5LCA1NCwgMjIsIDUwLDIzMSwxNTEsMjEwLAorICAgICA1OCwgNDEsIDM1LDE0MCwxODAsMTAyLDE2NSwyMDQsMjUxLDE3OCwxNTEsIDc2LDEwMSwxNTIsMjUzLDE1MiwKKyAgICAyMjYsMjAyLDE4MCwgOTMsIDc2LCA0MSwyMzAsMTE3LCA5MiwxODAsIDc5LDEwOSwxMzksIDUxLDI1MSwxOTAsCisgICAgIDczLDIxMiwxMDQsIDUyLDEwMiwxNjYsMTY3LDIyOSwyMDAsIDE3LCA5NywxNDIsMjI3LDEyMCwgNDgsIDI4LAorICAgICAxNCwxMzQsMTMxLCA4MSwxMjcsIDE2LDI0NSwxMjIsIDQ4LCAyNCwgOTgsMTQ4LDE0NCwyMTQsIDIwLCAzOSwKKyAgICAxMTAsIDc0LCA4NSwxNDQsIDY5LCA5NCwxMjMsIDY4LCAxNywgNDQsIDg2LCA0NSwxNjAsMTgzLCA3NCwxNjEsCisgICAgMTEyLDIxNywxMjEsMTIxLCA2OSwgNTUsMjE5LDE3MCwxMzgsMjQwLDE3NywyMTIsICA1LCAgNSwgNzUsMTc1LAorICAgIDIxNSwgNTYsMTU4LCA4NiwgMjEsIDk4LCA3NiwgNDIsMTUxLDIxNSwyMDAsMTU4LDE4MSwgMjIsIDUwLDIwNiwKKyAgICAgNjEsMTUwLDExMiwgMzgsIDY5LCA2MSwgMzgsMTI2LCA1MywgODYsMTEwLCAzMiwxMzksIDIyLDIxMCwxMTEsCisgICAgMTUyLCAgNSwxNjUsMTEwLDE2NSwyMjQsICAxLCA3NSwgNzQsIDQ1LDE1MiwgIDEsMjI0LDIzOCwgNDIsIDY5LAorICAgIDIwMywgMzQsMTA3LCAyOCwxNzYsIDU2LCAxMiwgNjgsIDQxLCAxNCwgIDMsMTA0LDE4MywxOTQsMTEwLDE2NywKKyAgICAyMTMsMTA1LDE4MywgOTEsMTczLCA4NiwxNzEsIDI5LCAyNiwgOTYsMjIxLCA2MywxNzksIDc0LCAxNCwyMDksCisgICAgMjQzLDEzNywxOTcsMTA4LDE5MCwxODQsICAwLDEwNCwxMTEsMTE0LCA1NywyMTYsIDI2LCAxMSwgNDcsMTAxLAorICAgIDIwMywyMzAsIDUxLDEyNywgMjQsMTg0LDE2NiwyMTAsMjE5LDEyNiwgNTQsMTMzLCAyMywyMjksMTg3LDEwNCwKKyAgICAxOTEsMTg5LDI1MiwgNDIsIDMyLCA0NCwxNzUsIDExLDE5NSwxNzIsMTgzLCAgMiwgMTgsMTc2LCAgMCwgIDgsCisgICAgIDE3LCAgOCwgMTAsMTc2LCAxOSwgMTcsIDk5LDE5OCwgNDcsIDU1LDE4OCwyMDcsICAyLDI1MiwxMzIsIDUyLAorICAgIDIzMywxNDAsIDk1LCA3NCwyMzUsMTY0LCA2NiwxMzAsMTA1LDE3MywgODksMTA3LDE3MywxNDgsIDMwLDEzNSwKKyAgICAgNDgsMTU5LCA5OCwgNTcsMjAwLDE3OCwyMzAsMTc3LDIxMywxOTAsMjEwLDEyOSwxNTIsMjQ4LCAyMSwxODcsCisgICAgMTM2LDE2NCwgODQsMTc5LDIxNywxNTYsMTU1LDE1NywgMjEsICAwLCA5NywxNDIsMTQ3LCAzNiwgMjYsMTQxLAorICAgICA3MCwgODEsMjEyLCAzMSwyNDQsMTYzLDE0MSwgNDUsMTQyLCA5OSwxNDAsIDE5LDEzOCwgMzQsIDc2LDE1MiwKKyAgICAgNzYsIDQ3LCAzMiwyMjMsMTc4LCAyMSwxNjAsMTAyLDE0MywgOTQsMTAyLCA2MCwyMDMsICA1LCA4OSwgODgsCisgICAgIDc2LDIzOCwgNDMsMTY3LCAzOCwgNDMsICAyLDE3OCwxNDYsICA0LDE5NSwxNzAsMTE2LDE5MSwgMjYsIDk0LAorICAgICA3OCwgNzUsMjE4LDI1MSwxNTksIDgyLDE3MiwgNTgsMjE5LDE2NSwxMzgsMTAxLCAzNCwxOTcsMjAwLDE3MiwKKyAgICAxMDAsIDMzLDEzOSwxMDQsMTE1LCA5MCwgMjQsMTg1LCA3OCwyMDgsMjAxLDI0NSwyNDcsMjQyLDEyNSwxMjMsCisgICAgICAzLCA3NSwyNDYsIDg0LDE0MiwgMzIsMTM4LCA1NiwgODAsMjIwLDEwNCwgNjQsMTYwLDE3NiwyMDksMTA0LAorICAgIDIwNiwyMDYsIDc2LDE4MSwyMTksMTQxLCA3MCwxNjMsMjE3LDEwOCwyMzgsMTYyLDE3NiwgOTYsMjM2LCA5MCwKKyAgICAxMjksMjUzLCA0OSwxNzEsIDUwLDE1MCwxMzUsIDYxLDEyMywgMzUsMjI4LCA1NywyMTEsIDg4LDExNCwyMzcsCisgICAgIDExLCA5NCwxODUsIDQzLDExNiwgODYsMjU1LDIyOCwgMjMsMjAxLCA2NSwxNTEsMjExLCAxMiwgNzEsMTAxLAorICAgIDE2NywyNTEsMjE5LDIwNiwxNzUsMjIxLCAxNywgIDYsICA4LCAzMiwxMDAsIDI2LDEzMCwgMTcsMTc5LCA4MCwKKyAgICAxODYsMTg4LDE0NCwyNTMsIDM3LDE0NCwxNDAsMTA4LCA4NiwgMTEsMjI5LCAzMiwyMTEsMjE4LCA4MiwgNDQsCisgICAgMTM5LDE5MCwxOTgsIDcyLCA0OCwxNzMsMTgxLCA5OCwyMTQsIDkwLDE3OSwxMDIsMTczLCA1MiwgODcsMTMzLAorICAgIDI1MCwxNDksIDY2LDEwOCwxNzUsMTA0LCA0NCwxNTUsMTgwLCAgNCwgNzksMTU0LDIxNywxOTEsIDE1LDIwNCwKKyAgICAgODYsMTA4LCA3NCwgNTMsIDIxLCA1MywgMjcsMTQxLCA0MSwxMjgsIDY5LCA4OCwxNDgsIDE5LDE5NCwxNzIsCisgICAgMTQ3LCA1NiwgMjUsMTQyLCA3MCwgODEsIDUyLCAyNiwgMTQsIDcxLDIwOSwyMTQsIDIyLCAzOSwgIDksMTQyLAorICAgICA5OCwxNDAsIDE5LCAyMCwgODYsMTYzLDIxNiwgNDMsIDk1LDIwMCwgNDgsIDgzLCA0NCwgMzEsMjA1LDE1OSwKKyAgICAxNzUsMTMwLDE3NCwgIDMsMTczLCA0MCwgMzQsIDY0LDI1NSwyNDksMjM4LCA4NywxNDEsMTI5LCAyMywxNDMsCisgICAgICA4LDE0MCwgNDEsMTQyLDI0NSwgODUsIDg4LDE5MCwgIDEsMjIxLCA2MSwgODcsMTM3LCA4NiwgODIsMTA4LAorICAgIDE4MywgMzIsMjIzLCA0NSwgNTAsIDQwLCA5MiwgNDEsIDYyLCA3MCwxNjQsMjAyLCA2NiwgIDIsMjM2LDEyNywKKyAgICAxNDUsMjI0LCA5MywyMDgsMTA2LDE3MiwxODIsMTA2LDEzNCwxMzAsMTk2LCA5NywgOTYsMTA0LDIxMywxNTIsCisgICAgMTUzLDExMCwxODEsIDkwLDE0MSwgNzAsMTYzLDIxMywxMDgsMTcwLCAzMiwgNDgsMTE2LDE4NCwxODcsIDc0LAorICAgIDIxOSwyMjEsIDU4LDIwNSwxMzEsMjE5LDE2NywxNzUsMjEwLCAzNiwyMzAsMjAwLDIxOCwgNzEsIDczLDE5NiwKKyAgICAxMjYsMTAxLDE1MSwyMjcsMjQ1LDExOCwgMTcsIDk1LCA5OSwgNjMsMTE3LCA0MiwxOTYsMTY4LDIwOCwyMDAsCisgICAgMjAzLDIwNiwgNTEsIDc4LCAgMiwxOTEsIDYwLDEzMiwgNjUsMTgyLDE5MiwyMDAsMTg4LDEzMCwgNTksMjAzLAorICAgIDE0MCwyMTMsMTAwLCA2MSwgMjcsICAwLCAgMCwgMTcsIDQyLCA3MywgNjgsIDY1LCA4NCwxNDAsMTQ1LCA3NiwKKyAgICAgMjcsMTg1LCAyMiwxMjMsMjI5LCAzMiwgMzUsIDM0LCA0OSwxMDUsIDM2LDE4MCwgIDUsMTcxLDEwNSwyMTMsCisgICAgMTMyLCAxOSwxMTksIDM3LCA3NCwxMDcsMjM3LCA4MywxNDAsIDUzLDEwNywxMTgsIDQ2LDIyOSwgMjAsMjQzLAorICAgICA2NCwxNTAsMjM5LCAxMCwyMDYsMjE0LCA2MCwxMjIsIDkxLDIzNiwxNTAsIDg4LDIzMCwgMzMsIDQ0LCA4MywKKyAgICAxMDAsMTQyLDE5MywyMDQsIDg5LDE1MCwxNzAsIDMwLCAzNSwgODcsMTQ0LCAxNiwgIDMsIDIxLCA1MiwgOTEsCisgICAgMTczLCA0NCwgODQsIDk3LCAyMiwxNTcsIDM2LCA4MSwgMjgsIDY5LCA4MSwgNjAsIDI4LCAxNCwgNzEsMTg5LAorICAgIDE1OCwgMzAsMTQyLCAzMiwxMzgsIDY4LCA1MSwxOTcsICA5LCAxMCwyMTEsIDQwLDE5OCwxMzgsMTQ4LDE3MCwKKyAgICAxMzYsMTgyLCAgMiwyMjEsMTkyLDEwOSwgOTIsMTI5LCAyMSwxNjgsMTkyLCA5MywgNzksMjE3LDE3NywxNzcsCisgICAgMTI1LCA1MywxODgsIDE2LDIzOCwxMDUsMTMzLDExNSwxNjksMTM2LDEwNywgODcsMjQxLCA1MywyMjIsMTA4LAorICAgIDE0MiwgOTksMjA2LCAgMSwxNjksMTcwLDEwNiwgODQsIDE3LCA2NSwxNzksMTYxLDE1NCwyMDUsMTAyLDE4MywKKyAgICAgOTksMTA0LCAyMSwxMzQsMTYxLCA1NywxODksMjM5LDE1NCwgODYsMTg3LCAgMywxMDcsIDYzLDE5MywgODYsCisgICAgMTAxLDE4OCwgODUsICA1LCA0NywxMTksIDc0LDIwNywgNzgsMjQ2LCA1OSwxNDUsMTc5LCAyNywyMTQsMTAzLAorICAgIDIxMywgOTMsMjM4LCA2MywgIDcsIDY4LDE4NywxOTQsMjAzLDI0MywxMzcsMTUwLCA5MiwgODQsMjEzLDEzMSwKKyAgICAyMDgsMTA1LDEzNCwgNTEsIDI1LDI1MiwgIDIsMTE5LDIyNiwgNDEsIDkxLDIzMCwgOTMsMTUyLDI0MiwyMDIsCisgICAgIDUwLCA4MywgMzQsMTc2LCAzOSwxMjMsMTY5LDIyNywxNTEsMTkzLDE1MSwgNzAsMjM3LDE5MSwgMjgsIDE2LAorICAgIDEwNSwxNDksMjA5LDE0MCwgODUsMjA5LCA2MywxNTQsIDExLCA3MCwxMzMsMjE3LDI0NywxOTgsIDg3LDExNCwKKyAgICAxMDUsMTA2LCA1MCwgMTksIDk5LCAyNSwxODIsIDc2LDIxNiwgNDcsMTg3LDE0MiwgIDIsMTk0LCAxMCwyMzksCisgICAgMTE0LCA4MCwxNjcsMjEwLCA3NiwxMDgsMTMzLCAgNSwxNjIsICA4LCA0MSwgODAsIDc0LCA1MywxNTQsMjA1LAorICAgIDEyNCwgOTEsIDgwLCAxNywyMTQsIDU4LDIwOSwgNTgsMTM3LCA5OSwxOTUsMTgxLCA0MCwxMzgsMjI2LDIzNywKKyAgICAxMDksMTAyLDE5OCwyMjUsIDcyLCAgNCwgODQsIDIwLCAgMSwxMjgsMTUzLCAzNCwgNDAsIDYzLDIwMywgOTMsCisgICAgIDIxLDEzNCwyMjcsMTA3LCA3MywxMDEsMjE1LCAyMiwgMTEsMTc4LCA3MSwxNjcsMjM1LDE4NywgIDUsMTk3LAorICAgICA2MiwgMjYsIDM1LDIyMCwyMTEsMjQ3LCAxMSwyMjAsMjUxLDExMSwyMjIsMTI3LCAxNywxMzEsIDE2LCA3NCwKKyAgICAgMjQsICA4LCAgMCwgNTUsIDI2LCAgOCwgMzIsMTczLCAzOCwgNDEsIDEwLDE2NiwxNjcsIDI2LDE0MSwgNzAsCisgICAgIDM1LDEwOCwgNTIsIDI2LDE0MSwgNDgsIDcyLDI1MSwgMjUsIDIzLDE1NSwxMzgsMjIwLDE3OSwgMzcsIDI4LAorICAgICAxMSwxNzIsMjQxLDEwNiwxNzEsIDQ0LDE4MywyNDYsIDk3LCAyMSwgNTEsIDkwLCA1NiwyMzYsIDQwLDExMiwKKyAgICAyMDMsMTUzLDEwMywyNDQsIDYxLDE2MywyMTksMTQzLDIwOCwgNzEsIDg0LDIyNSwxNjIsMjMxLCAyMCwxOTksCisgICAgMTQ3LCA0MywyMTUsMTI3LDE0NywxOTgsMTc1LDIwMiwgNzMsIDczLCA0NywyMDksIDU1LDEzNywxMzgsMjQxLAorICAgIDE0NiwyMTcsMTY5LDIzOSwyNTAsMjAwLDE4MCwyMjUsICA0LCAzNSwxMDMsMjAxLDEyNSwgNTgsMjU1LDE0NSwKKyAgICAgODYsIDc3LCA4MCwgMjYsMTE2LDE0OSwyMjQsMTAxLDEwNCwyMjksIDkyLCA3NCwyNDEsMTQ5LDE2MSwgNzUsCisgICAgMTAzLCA4NSwgMjIsMTY5LCAxMiwxNDcsMTMwLDE2OSwyMDQsIDE4LDI1MywgNDIsIDU3LCAgNiwgOTksMjMwLAorICAgICA0MywgMTEsMTIxLCA2MywxMjAsMjEwLCAxMiwgMTYsMTk2LDIzOCwyMDYsIDM4LDIyOSwxMjIsIDE5LCAzNCwKKyAgICAgMTAsMTk0LCAgMCwxNTQsIDc3LCA1NSwgMzYsIDk4LCAxNywxMDIsMTU3LCAzNiwgNTgsMTQyLDIyNywgNTYsCisgICAgMTQyLDE0NywgMzYsMTM3LDIyNywgNTYsIDMwLCAxMiwyNDQsMTA0LCAzNiwxMzcsMTk4LCA0MCwgMjIsICAzLAorICAgICA1MywgOTcsIDk2LDE3NywxODEsMTA1LDE0OSwgMjYsIDEwLDE3NywxMTYsMTcwLDIyNiwgOTQsMTMyLCA1NiwKKyAgICAyMzIsMTAxLDE0MSwyNDIsMTYwLDExMSwxOTEsIDMxLCA2MCwgMjEsICAyLDExNywgMzIsIDUyLCA5OCwgMTAsCisgICAgICAxLDE2NCwgMTcsIDk4LDE2MCwxNjgsMjA5LDEwOCwxMTYsMjE4LCA3OCwgNDMsMTg5LCA0OCwgIDgsICAyLAorICAgIDExNSwxODIsMjM3LCAzOSwyNTMsIDI3LCAzMSwxOTQsIDk5LCA2OSwyMDUsIDczLDEwMSwxMTMsIDQxLDE4NCwKKyAgICAyMjEsMjAyLDExMywxMDgsMjIxLDIxNCwyNDgsMjQ5LCA2OCwgMjQsIDQ3LDE4NCwgNjAsMTIwLDE0OSwgMTAsCisgICAgMjM0LCA1MSwxNzcsIDUzLDE2NiwxNTcsMTMyLDE3NSwxNjUsIDg0LDE5NywgNTIsMTYyLDE3MywgNjUsMTczLAorICAgICAxNiwgOTIsMjAyLDIyOSwgOTksMTY5LCA0OCwxMTcsIDUwLDI0OSwgNTMsIDM4LCAxNCwyMDMsMjE4LCA3OSwKKyAgICAgNTksMTgzLCAzMywgMTgsIDE3LCAxOSwyMzQsMTYzLDEwOSwxNDAsIDY3LCA3MiwgMjIsIDU1LDE2NiwxMTEsCisgICAgMTQyLCA0OSwxNDUsMjM2LDExMiwgNzYsMTQ3LDIxMCwgNzQsMTcxLDE2MiwxMjMsMTAwLDEzNSwgOTgsIDY5LAorICAgICAzMywxMDIsMjQ5LDE2NSwxMTUsICA5LCA1NCwyMDYsIDgxLCA5MCwxNDgsMjQ5LCA1NiwyMTksMTY3LDE3NSwKKyAgICAxNzIsMTY0LCAyNSwyMTgsMTcxLCAyOCwxMTcsMTUwLDE1NCwyMDUsMjEyLDE3MCwgNzMsIDc4LDEyNSwgIDUsCisgICAgMTYyLDEzNiwxOTQsIDMyLDEwOCwxODMsIDkwLDEzMywgNjAsIDcyLDE1MiwgNTMsMTc5LCA0MSwyMjksMjA1LAorICAgIDEzNSwgNzgsMTQ2LDE5MywgODAsMTQzLCAzNCwgMTcsMTI5LCA1NiwxOTgsIDY4LCAxMSwgIDAsMTA2LDEwOSwKKyAgICAyMzAsIDEzLCAgMCwgMzIsMTE1LDE2NiwyNTEsMjAzLDE3NiwgMTQsMTcyLDI0NCwyNTQsIDQ2LCA1MSwyNTQsCisgICAgMjUzLDEzMSwyMDQsMTE3LDEyMSwyMzMsICA1LDE2NSwgNjgsIDQxLCAgNCwxNDQsIDY0LCA2NSwgMjQsIDMyLAorICAgICAxOCwgNTMsIDI2LCA5NywxODcsIDg1LDEwOCwyMTYsIDY2LCA2OCwgNzQsIDMzLDIyNiwxMjYsMjQ0LDIxMiwKKyAgICAgMzAsMTI0LDE3NSwxMDgsMTM0LCA4MCwgODUsMTU5LCA4NSwxODIsMTMyLDEyMywgODIsMTA3LDI1NSwgNjIsCisgICAgMTc3LCA2OCwgNDcsIDc5LDExOSwxNDksMjIxLDE2MiwgOTMsMTM0LDE1NywyNDMsMTcxLCAzMiwxODcsIDEwLAorICAgICAgMiwxNDAsIDI4LDE3NywyMjksMjUwLCA3NCwxNzUsMTkyLDE5NCwxNTMsIDkxLCA3NiwxNjksIDg1LCAzNywKKyAgICAxODcsMjUyLCAzOCwxMzIsMTQ3LDE5NywxNzUsMTcwLCA1NiwgNDQsMTA5LDE2MCwyMzksMjA0LDE0NywgNTcsCisgICAgIDY2LCAxMiwgODEsMTUyLCAgMSwgMTcsIDI1LCA3NywxNTEsIDQ2LCAyNywyNDEsMTU1LDE0MiwgNTcsMTAwLAorICAgIDE1MCwgMTEsMTY1LDIxMywxNzAsMTAwLCAxMCwxOTAsMTE2LCAxMCwxNzksIDIwLCA4MiwgOTAsMjM1LCA0NCwKKyAgICAxOTQsMjMxLDE1NiwxMDEsICA1LDEzMiwxMDUsMTY3LDIwOCwgODUsMTE4LDE2MSwgODgsMjMzLDE5NCwxNTgsCisgICAgIDMyLCA0MywxOTYsMjUyLDE5NywyMTIsIDYzLCA5NSwyMTAsIDgyLCA1MiwxNTUsMTA1LDEyNywgMjksMTQzLAorICAgIDEwNCwgMjEsMTAzLCA1MCwgIDIsMTI4LCA4MiwgNzQsIDQxLDE3NywyMTksMTg0LDE4NywgMjIsIDgwLDEwOCwKKyAgICAyMDQsMTAyLDI1NCwxNjAsIDM2LDIwOSwgOTAsIDM5LDIwNCwxOTQsMTcyLDE2MywgNTYsMTAyLDIwNSwgMzQsCisgICAgMTQ2LCA2OCwxNDUsMjM4LDI1NSwyNTUsMjM3LDE1NywyMzUsMTE4LCAyNywgNTcsIDE0LDEzMiwgIDEsMTgyLAorICAgIDE0NiwxNTMsMjIxLDI0NywxMjcsMjE1LCA2MSwgNTEsMTM3LDIwMCwyNTMsMjA5LCA1NSwgOTIsIDEwLCAgMCwKKyAgICAgOTEsMTgyLCA5OSwyNDksIDM0LCAyOSwxMjMsMTY4LCAzMCwxOTcsMjQ2LCA4MSwxNzIsIDQ3LDEzMywgOTgsCisgICAgICAxLDI1MiwyMjMsMjQ5LDI1MywyNTUsMjQ5LCA3MSwxMjYsMTQ3LDI0NiwyMzksMTkxLDIzMCwgODcsMTY5LAorICAgIDI1MywyNTAsIDc3LDE5MCwxMTYsMTI1LDEwNywgNjksMjE0LDE4NCwyNTUsMTg0LDE1MywgMzksMjQ0LDE1OSwKKyAgICAgNjMsMjEzLDE2NiwyMzIsIDk1LDEyNywgMjksMjM5LDIyMywyMjksMTkxLDI1NSwxODUsMjUzLDI1MiwyMDEsCisgICAgMjA0LDEwOSwxMDUsIDYzLDExMCwgNjMsMTUwLDEwMSwgOTcsMjMwLCA1MywgNTgsMTIxLCAyOCwxODEsIDY5LAorICAgICA4NywgIDgsIDg1LDExMywxMzgsMjQyLDE3NywyMDMsIDcwLCA5MSwgODksIDcyLCA4MSwxNDgsMTQwLDE1MSwKKyAgICAyMTIsIDc0LDI0NywgMTgsMjQzLDEwNiwyMDksMTUyLDI0MywgIDEsMTg1LDExNiwgNDgsMjEzLDE5NCwgNzUsCisgICAgMjEwLDEwNywgIDMsMjE0LDE0MiwgNDgsMTY5LDIwMywgMjAsMTg1LDE4OCwgNjEsMTc1LDEyNSwgNDYsIDQ4LAorICAgIDE5MiwxMzksMTAxLDE1MCwyNDEsMjMzLDI0OCwyMjksMjM2LDE3NiwxNjMsMTUwLDE4MCwxOTEsIDcxLDE4OCwKKyAgICAgNTksIDk4LCA2MCwgNzAsMjIzLDEwMywgNjgsMTExLDE0NSwxMzgsMTc5LDE4OSwyNDEsMTA0LCAyMywyMTgsCisgICAgIDQwLDE4MiwxOTQsMTA3LCA4OSwxNTAsMTMxLCA5NSwyNDIsMTc0LCAgNCwxNTIsMjA4LCA5NCwgOTMsIDk0LAorICAgICAxNiwgMjAsMTE1LCAyMSwxNjUsMjQ4LDEyNCwgMzAsIDQzLDE1OCwxMjgsIDQ0LCA0NiwgNDUsMTQxLDIyMSwKKyAgICAgNzksMTkwLDIwNCwgMjAsMTg2LDEwOCwgMzksIDI2LCAyOSwgMjYsMjM3LDEyNCwgIDUsMTYxLCA2MCwgMjUsCisgICAgIDcxLDE1MiwxMzksICA3LCAxOSwxODEsMTgyLCAxNCwyNTMsMjE2LCA3NCwyMTAsICAxLCA3NCwxNzMsIDY3LAorICAgIDIzMywxNzIsIDgyLDExNiwgMTksIDQ0LDE4OSwyNTUsMjUwLDI1MywyMzUsMTI2LCA2MywyNTEsMjQ2LDEyMiwKKyAgICAyMzksMTkxLDEyNywyNTUsMTg2LDIyMywxODcsMTU5LDE0OCwgOTYsIDgwLDEyMCwyNDksMjE1LCA2NiwgNjQsCisgICAgICA3LDI1MiwxNzUsMTY1LDIyMSwxMTAsIDYzLDIyOCwxODIsMTg2LDE4NSwxMTQsMTg4LCA0OSwyMDAsIDE1LAorICAgIDE4MywxODksMjU0LDIxOSwgNTcsICAzLDE2OSwxMzYsIDgzLCAyNCwgODUsMjExLCAzMCwxMjQsMTA0LDE5OSwKKyAgICAgIDcsIDY5LCA5OCwgIDYsIDQ2LDIzOSwyMDcsIDU1LDIxNSwgIDQsIDIwLDE5OCwgODIsMjQ1LDIxMCwgIDksCisgICAgIDQ4LDIyOSwyMjYsMTM5LDEwMywxNTYsIDY2LCAxMSwxMDksIDQ0LCAgNiwxNTQsMjM1LDE5NiwgMjIsMjQzLAorICAgIDEzMywxMDIsMTk4LDExOSwyMjUsMjE1LDE0MCwgMTYsMjE5LDExOCwyMzksMTM0LDIxMywgOTgsMTA3LCA0NSwKKyAgICAxODUsMTA1LDE3NywgMTksMTAwLCAzOSwxOTcsIDg2LDEzNCwyNDUsIDUzLCA1NiwxNzcsIDQ0LDIwMywyNTMsCisgICAgMjIyLDE1MSwxNDIsMjUyLDI1MSwgMjksIDkwLDExOSwxMDEsMTI5LCA3MywgODMsMjA0LDE0OCwxNDgsMTg5LAorICAgIDE3NSwyMzYsMjE4LDIzOSwxNzgsMTc2LDIyMCwgNjQsMTM0LCA4OCwgMzgsIDE3LDE1MCwgODEsIDQ0LDIyOCwKKyAgICAgODksMTg0LDEyOCwgODAsIDE5LCA5MiwgMjcsMjI2LDExMiwgIDIsMTY5LDIwMywgODgsIDI5LCAxMSwxNzQsCisgICAgMTk1LCA5OCwgNjgsMjEyLDE1MCwgMzgsMjU1LDE5MiwyMjMsMjQ0LDI0NywxODEsMTk0LDIzNywgNDksMTIyLAorICAgIDE4OSwgMTIsIDU4LCA0NywxNjIsIDgyLDE4MSwxNDMsMjAyLDE4MSwyMTUsMjM4LCAgNSwgODgsMTI5LDE3MCwKKyAgICAyMDEsIDEzLDE5NiwxNTYsIDkyLCAyNCwgOTQsMTAyLDE3OCwyMjMsMjE3LCA2NywyMDQsICA3LCA2NSwxMDgsCisgICAgICA3LCAzNSwyMDMsIDg2LCAzMiwxNjcsMTkyLCA1NCwgNDQsICAxLDI1NSwyMjIsMjI1LDE3MywgNTMsMTE3LAorICAgIDE3OCwxMzQsMTk0LCA4NiwyMjgsMTE1LCAgNSwyMTEsICA3LDI0OSwyMDEsMjQ5LDE0OSwgMTEsMTc3LCA2NywKKyAgICAxNDIsMTY5LCA3OCwxMDcsMjMwLCA0OSwgNTgsMTE5LDIzOCwgNjAsMTUyLDE4NSwxNDEsMTgyLDE2NiwxOTUsCisgICAgIDM2LDE5NywxMTgsMTUyLCA0NSwxODksMTExLCAgOCwyMzUsMTg5LCA0NywyNDcsMTIzLCA5NSwxODIsMjUyLAorICAgIDIxNSwgOTQsIDQyLDEzOCwxMzMsMjA4LCA5NiwgMTQsMTAwLDEyOCwgOTUsIDM5LDIwMCwxNTYsIDU1LCA4NiwKKyAgICAyMzYsIDg0LDEyMiwxNjgsIDE3LDEzOCwxNDYsIDY5LDExNCwxNDAsMjM2LCA4NSwxNDYsMTczLDIwMywxOTksCisgICAgIDUzLCA4MywxMjYsIDQyLDE4OSwxMTgsMTUyLCA4OCwgOTksICA0LDE4MiwxODksICAyLCA5MiwxMzAsIDQyLAorICAgIDExOCwxMjMsMTQ5LDEyMiwxMjcsMjI0LCA1NywxMTAsIDkyLDIxMywxMjQsMjQzLCAxMCwxMDcsIDc4LCA5NCwKKyAgICAgNTcsIDQ4LDI0OSwgOTMsMTk1LCA3NiwxMTIsIDM3LDE4NywxMzYsIDUxLDIxOSwxMzcsIDY1LDE4MSwyMzIsCisgICAgMTc2LDEzMywxOTksIDcxLCA1MiwyMzMsMjE3LCA0NywxMDYsMTA5LCAyMywgNzQsMTYzLCAgNSwgNjksMTYyLAorICAgICAyMywgOTIsIDU5LDE5NCwgMjgsMTgyLCAyMCwxODcsMjIyLDIxNCwxMDUsMTg5LDE4OSwxOTMsMTc1LCA4OCwKKyAgICAyMzQsMTM2LDEzNywyMzIsIDE3LDE0MywgNDksMTIwLDExMiwyMzEsIDYyLCAgNiwxNzUsMTU5LDE1MiwgNzEsCisgICAgIDI3LDE0NiwgOTgsMTY3LDEyMywyMTMsIDc4LDE2NCwxNzMsIDIwLCA5MSwgNjUsMTgxLDExNiwxMDAsMTIzLAorICAgICAgOSwxMTQsMjIxLDE0MSwgMTAsMjE5LDEyMCwxMDEsIDE5LDE3NSwxNjAsMTY4LDE0OCwgNDQsIDExLDIyOCwKKyAgICAxNTIsMTUxLDEwMCwyMjgsIDQ1LDI1NSwgNzQsMTQ1LCA1NywxMzYsMTI5LDEzMywgNTAsMTkxLDE5NywgNzMsCisgICAgMTQ4LCA4MiwxNzgsICA5LDIxNiwxNDUsICA1LDE1NiwgMTEsIDgxLDEzMiwgMjcsMTQ4LDI1MiwxNTQsIDI3LAorICAgIDEzOSwxNzUsIDQ3LDE3MiwxNzQsIDUyLCA2MCwgNjMsMTk4LDE3MiwgODksMTU3LDExNywgODUsMTA5LDI0OSwKKyAgICAxMzEsIDgwLCAzMywxOTQsIDc2LCA0OSwgMzgsIDM5LCAxMSwyMzQsIDgyLDIwOSwxNzAsIDQ2LCA1NCwgNzcsCisgICAgMjE2LDEwNiwxNzksIDgxLCA5MiwxNDgsMTIwLCA5MCwxNTAsICA1LCAzMywgNzksIDI0LDI1NSwxNTQsIDkyLAorICAgICA5OCwxNjcsIDk2LDI1NSwgMTcsIDE1LCAzMiwgNjcsMjE3LDI0NSwyMTQsMjU1LDI1MCwyMjEsMjIyLDIzNiwKKyAgICAxNTEsMjA4LCAxMCwgNDksMTE1LCAyMCwyMzYsIDU2LDE4MiwyMjcsMjE4LDEwNCwgOTksMTA5LDE2OSwyMzgsCisgICAgMTIzLDIyNiwxODksMTQxLDIxNCwyMTksIDYyLDE3NywxNzYsMTU3LDE5OCwxMjMsMjExLDIyOCwgNTcsIDY1LAorICAgICAgNiwxNTcsMTIzLDE0MSwxNzMsMTcyLDIyMywgNzIsMjE4LDI1MSwgMzksMTkwLDEyNCwyMjQsIDY2LDIxMSwKKyAgICAyMzYsICAyLDIwMywxNDAsIDQ2LCA0MywyNTMsMTc4LDEyNCwgMzMsMTAxLCAyNiwxNTMsMjU0LDIyNywxNzcsCisgICAgMTQzLDEyMiwgODUsMTI4LDE0NywyNDIsIDc3LDEzOCwgNTYsIDExLCAzOCwgMTQsMTM1LCA3OCwgOTUsICA4LAorICAgIDE0NCwxODksIDM0LDE3NiwxMDIsMTA2LCA2NCwyNDcsIDk5LDIwNywgIDIsIDQzLDI1MiwxNTIsMjIwLCA2MSwKKyAgICAxNTYsMTM4LDE1NCwgNzgsIDQ5LCA3NSwxNTksICA5LDExMywxNDAsMTA3LCA1NywgNzQsIDUyLCAgNSwxNzQsCisgICAgIDY3LDEyNywgMzcsMjUzLCA2NCwxOTAsMjM4LCAgMywyNDAsMTMwLCAyNiwxMDcsMTY2LCA3OCwxODAsIDYyLAorICAgICAyMywgNDYsIDI0LDE1MywyNDgsMjAyLCA2MywgNzYsMjA3LDE5NSwgNDcsIDM2LDE5NiwxMTYsIDU3LCA0MSwKKyAgICAyMzYsMjMyLDIxMywgMTcsIDkxLDE3MSwyMDIsMjUzLDEyMCwgMTQsMjM4LCA5OSwxMDgsMTkwLDIxNiwyMzAsCisgICAgMjI3LDI0NywyMTQsMTU1LDI0MywyMjQsMjA1LCAgNiwgOTksMjM5LDEyNSwgNTcsIDk2LDEzNCwyMDMsIDcwLAorICAgIDI1MywxMDgsIDY4LDE3NywgNDksMTIyLCA3MSwgMjAsIDgzLDEzOSwxMzgsIDk4LDE3NSwgMTAsMTc4LDE0NCwKKyAgICAxMDcsIDMzLDIwOSwxNTYsMTA1LCAgNSwxMDMsMTU0LDIzNCwxOTAsMTE0LDE5OCwyMDQsIDk4LCA2MCwxMzksCisgICAgMTg2LDE3MiwgNTgsIDk1LCA4NiwgIDksMjA2LDE2OCwgNDIsMjMyLCA4OCwgNjUsIDg0LCAyNSwgNTEsIDE0LAorICAgIDIxMCwxNzAsIDg0LCA4OCwxMTEsMTQwLCA0NSwgNzcsIDQ2LDE2MSwxODUsMTcyLCA1OSwyMDcsIDI1LDE4NSwKKyAgICAgNTYsIDY3LDIxMSwxNDYsMjQwLDIwMiwxMjYsIDgxLCA0MSwxODQsMjA2LCAzNCwyMDksIDI0LCA5MywxMDAsCisgICAgIDY4LCA4NywgOTIsIDQ4LDI0MiwxOTksMjEwLCA5NSwgNzIsMTM2LDE1NywyMjksIDM2LCAyOSwxOTksIDgzLAorICAgICAzMSwgOTcsIDQwLDIyMiwxNjcsMjE2LDIzOSwgNTEsIDM0LDE4NCwxNDMsMTU3LCA5NiwgOTksMTcyLDE4MSwKKyAgICAxMDAsIDI3LDIzNywyMDgsIDk4LCA2NywgODEsMjA0LCAxOSwxMDksIDIxLDEwMSwyMjcsMTg4LCA1NiwgNzQsCisgICAgMTUwLDEzNywxMTYsMTMzLCA3OSwyMzcsIDQzLDE1NiwyMTcsMjUyLDEwNywgNzgsIDQ5LCA2MSwyNDUsMTk0LAorICAgICA5OCwxMDgsICA2LDEwMywgMjIsMTAwLCA4OCwxNDQsMTI5LCAyMSwgIDQsMTUzLDIyMywxMDEsMTk2LCA1MCwKKyAgICAxMDYsIDc2LDIwNywxODUsIDMxLDIyNywyNDEsMjA5LDEzNSwyNDMsMTg5LCA1NiwyMDksIDYwLCA4MiwxNzUsCisgICAgMTg4LCAgMiwxMDgsIDE3LDIwMiwxODksMTk1LCA4MiwxMDMsIDMwLCA5MSwxMTQsMjI0LCA0OCwyMzUsMTMzLAorICAgICA4MSwgMzgsMTM3LDE4MywgMzcsMjMxLDIyNywxMTMsIDExLDE4MywgMjIsMTYzLDExNiwgIDQsMTY3LCA4MiwKKyAgICAxMzgsIDE3LDIxNywgIDAsICAyLDI0NSwxMzQsMTI4LDE5OSwgODYsIDgzLDEzNSwxODUsMTk4LDIyOCwxMzgsCisgICAgMTY1LDI0MCwgNzEsMjI4LCAyMywgNDAsIDM5LDEzNywgNzgsIDgzLCA0NCwxNjIsIDI0LDIxMSwxNzQsMTk2LAorICAgICAgNiwxNDMsIDQ5LDI1MCwgIDEsMTc4LCA4NSwxMzksMTQxLDExOCwgMTgsIDc2LDIzNywgMzMsMTIyLCAxOCwKKyAgICAxMDUsMTEzLDIyOSwxMzAsIDIwLDEzOCwgOTgsIDY3LDI0MiwgNzgsIDU1LDEyOSwyMDMsMTg3LDE0MCwyMzYsCisgICAgMjUxLCA5NCwgNzQsIDM3LDIwNSwyMzIsIDY0LCAyMywyMjUsICA4LDE5OCwgIDUsMTM4LDIwNSwxNzksIDEyLAorICAgIDIzNSwxNzksMTUxLDE3NiwyMDQsMTIyLDEwNiwxMjcsMTk2LDI1NSwgNzQsMTI0LDE3NCwxMDcsMjA0LCAgMiwKKyAgICAyMzUsMTUxLCA0OCwgNDMsIDM0LCAyMywxMzQsMTUxLDEyMCwxNzksIDc1LDE0NSwxOTcsMjAxLCAyOCwxMDMsCisgICAgMTQzLCAxOCwgMzcsMTQwLCA2OCwxMjMsMTQyLDEwMSwxNDYsMjEzLCA5OSwxMDgsIDQ4LDE2NywgNjMsMjEyLAorICAgICAzOCwxMjgsIDcwLDE2NywyMDcsMjQ2LCA0MywgNjIsICAzLDExNCwxMjEsMTcxLDIzNSwgMTUsMjM3LDI1MCwKKyAgICAyMjAsMjMyLCAxNSwyMjEsMTQ0LCA0MSwyMzAsIDQwLDE4MiwxMTEsIDc5LDE4NiwxMDksMjAyLCAyOSwxMDQsCisgICAgMTQxLCA5MSwgMzEsMTI1LCAyOCwyNTQsMTUyLDIxNSwgNzIsMjE0LDIwMCwgNTAsICA4LCA4MywgNTYsMTM5LAorICAgIDExNywxNTYsMjUzLCAzNCwgODgsMTM5LCAyNSwxMzAsMTE3LCA4MCwgODgsMjEwLCA2OSwgNjksMTE4LDE1OCwKKyAgICAyMzYsIDc2LDE0OSwgNDYsMTM5LDE2MSwxNjYsMjMwLCA1OCwgNzYsMjI2LCA0NCwxMzgsIDc0LCA4NCwgMzksCisgICAgIDIxLDIyNiwxOTIsMjE4LDEwNywxMzcsIDQ3LCA0MCwxODcsMTE0LDEyNiwgNjUsIDk2LCA1NywxOTMsMTAxLAorICAgICA4MCwgODUsIDQ5LCA3NSwxMjcsMTU0LCA4MywgOTEsIDUxLCAgNywxNjEsMTMwLCA0MSwgMTcsIDc4LDExNSwKKyAgICAxNzcsMjExLCA3NCwgODYsIDU1LCA2NSwgOTYsMTA1LDIzOCwxNTMsIDcxLDE5OSwxMDMsIDQxLDE4MSwyNTIsCisgICAgMTI2LCAzNCwxNTYsMjM5LDIzNiwyMDEsMjQ1LDEwMywxNzIsMTc0LDI0NywyMjksMTUxLDE2MiwxNTIsIDUwLAorICAgIDE5NywxNzIsMTg5LDE5MSwxODUsMjUxLCA1OCwxMDgsIDY1LDEzNSwgMzIsIDkxLDE4MSwyMTYsMTA0LCA5OSwKKyAgICAgMTksIDk4LCAyNywxOTcsMTI4LCA3MiwgNTgsIDUyLCAyNiwxOTYsMTUzLDEyOCwxNTEsIDk1LDE4NCwxMDMsCisgICAgMTI5LCA3OCwyNDAsIDk3LDE0NiwyNTIsMTk3LDE2NCwxNTgsICAxLDE4MCwxNTIsIDU3LDExMiwxMzIsICAwLAorICAgIDE5MywxMDYsIDgxLDExOCwyNDQsICA2LCA2MiwgMzQsMjAyLCA2MCwxODEsICAyLDEzOCwyMTMsMTM2LDE1NCwKKyAgICAxNjcsMjE2LCA3NiwgODMsMjQ0LCAxMiwxODUsMjI2LDEzNSwxNjUsMjEyLCAxOCwxNzksMjE0LCA0MywxOTMsCisgICAgMTAxLDIyMCwxMDUsMTI3LCAyOCwxMzQsMjE1LCA5MiwxNjEsMTk3LCAzNywyMjUsIDM3LCAzOSwgNjgsICAwLAorICAgIDEwNiwgIDEsMjI2LCA1NiwgOTEsMjIxLDE5OSwgMjYsIDUyLDE3NiwgODQsIDUxLDE2NCwxODUsIDM1LCA5NiwKKyAgICAxMzMsMTk4LDE4OCwyMDIsMTYxLCA2MiwgIDcsMTg1LDIyMiwxMzMsIDk1LDEyOCwgOTgsMjUxLDE5MywxNzgsCisgICAgMTY3LCA0NywgMzgsIDQwLDExOCwgMzIsIDc2LDE5MCwyMTUsMTMzLCA1NCwxMDcsIDk5LDE5NSwgODcsMjE5LAorICAgIDIzNCwyMDIsMTMxLCAzOSwgNDMsMTk4LCA3MCwxNjQsMTU3LDE4OCwxODIsIDUwLDI1MSwxNDMsIDQ5LDE4NSwKKyAgICAxMDgsMTA4LDIyMywyMzEsMTk3LDE0MiwyMzksIDYyLCAgNSwxNzgsMTczLDIwNCwxNjQsIDI1LDE3MSwxMjcsCisgICAgIDE0LCA5NywxMzYsMTA0LCA1MCwxMjgsMjQxLCA1MCwxNTAsIDc3LCAgMywyMzcsMTM4LCAyMCwyMjcsIDczLAorICAgIDE0NCwyMDUsIDQ4LCAxMSwgODQsIDUzLDIzMCwxNzMsMTUxLDE5NSwyMDMsMjMyLCA0NiwxODQsMTQ0LDE4MSwKKyAgICAyMTIsIDc2LDEzMiwgNzUsMTQ2LDE5NCwyMjksMTg1LCAxOCwyMzcsMTk3LCA0NiwxOTAsMjI0LDIxMCwgMTIsCisgICAgIDY0LCA4NSwgNjUsMTMzLDE2NSwgNDQsIDU0LDE3NywyMDUsMjMzLDE4MCwgMjIsIDE5LDIwNiwgNjcsMTc2LAorICAgICA2MCwgMzksMjQxLCA5MywxNzAsMTk3LCAzOSwyMjUsIDg3LDIyNCwxMzksMTA5LCA1MCwxMDgsMTY4LDIyNSwKKyAgICAgODcsMTAzLCA4NSwxODUsIDc4LCAyNSwyMTEsIDM5LDExNCwxNzIsIDk3LDI1NCwxODEsMTYwLCAyOCwgOTksCisgICAgMTgwLDE5MCwxNDEsIDkxLCA4NSwxNjEsICA3LDIxMSwyMzUsMjMyLDI0NCwxNDcsMTg4LCAyNiwyMjIsMTkzLAorICAgIDE3OSwgMjAsMTkxLCA5MiwgNjMsMTAxLCA5MiwgODMsMTM0LCAgOCwyMTksMTc1LDIwOCwxMjEsIDMzLDE2MCwKKyAgICAxNTIsMTk5LCA4OCwyMDUsIDUwLDEwNSwgOTksMTY5LDIyNSwyMDUsIDQ5LDIwNiwgIDIsIDg1LDI0NSwxODYsCisgICAgMjQwLDIwMiwgMTYsMjMwLDE3NCwxNzAsIDExLCAyNSwxNzcsIDEwLDEwMiwyMjUsIDE4LCA0OSwgMzUsMTUxLAorICAgICA0NywgMTQsIDQ3LDIwNCwgNjIsMTk3LCA5MywxMzksIDYyLCA3NiwyMDcsIDE0LCA5MSwgNjQsIDU1LCAgMSwKKyAgICAgNzQsMjMzLDE0NCwxMzEsIDE0LCA5NCwgODgsMjIzLCA3NywgIDcsMjA0LCA3MiwxODUsMjQyLCA4MSwgIDYsCisgICAgIDUzLCA3MiwgNjksMTg4LCAzOSwxODUsMjIyLDE1NywgOTUsMTkzLCAzMCwxNjUsIDQzLCA0MCwyNDcsMjQzLAorICAgIDExNSwxODEsIDI4LDE0NywxOTgsIDE4LDIzOSwgNzEsMTE0LDE3MiwgNzMsMTc4LDIwOSwgNzEsIDE5LDExNSwKKyAgICAxNjMsIDk3LDEyNywgMzUsIDg4LCAzNiwxMzIsIDgzLDIwOCwgODIsIDIwLCAgMywxMjQsICA0LCAzMSwgIDMsCisgICAgMjE2LDI1MiwyMDgsIDMwLDE1NSwxNTIsMTIzLCAgMSwgNTMsMTUyLDEzMywxNTAsMTg4LDE2MCwgNjMsIDQxLAorICAgIDEzOCwxNDUsIDU2LDE0OSwgOTgsIDY4LDIxNiwyNDIsMjMxLCA4NiwyMjgsMjE1LDE3NSwyNTMsMjM3LDIyNywKKyAgICAxNzMsIDc1LDExOSwgNjEsMjEyLCA5MywxMzYsIDk3LDE2NSwyMDIsICAyLDIxOCwxNjIsIDEyLCA2NSwgIDQsCisgICAgMTgwLCAzNCwgODQsMTIzLCA5NywyMjUsMjI5LDIzNCwgNTQsIDM1LDE0MiwgMzIsMTM4LDEyNCwxMTcsMjMzLAorICAgICA1NywgIDUsMjI4LCAyMSwyMTYsIDQzLDEyOCwgIDEsMTM2LDE2MCwgNzIsIDQ0LCA3NSwxOTcsMjQ3LCAzOSwKKyAgICAyMTUsMTQ3LDI0MCwgNDMsMTY1LCAyNCwxODUsMjQzLCA4NywxMzUsMjQ3LDI0OCwyMDEsMTgxLCAzNiwxODIsCisgICAgMTMxLCAxMiwyMjEsMTc2LCA0NCwyMDAsMTYzLDE4NiwxMDUsIDU4LDEyOSwxNjQsIDU4LDE1MywgIDUsIDIyLAorICAgICA4MiwyNDEsMTkzLCAxNCwyMDIsIDUwLCA2MiwgMzgsMTE2LCA4NywxNTYsMjMwLDE0MywgNzEsMTQ2LDEyOSwKKyAgICAgMjIsMTY1LCA5NywyMDEsIDIxLCAzOCwyNTEsIDM1LCA2OSwgNzAsMTkzLDI0MCwyMTAsMjQxLDIwMCwgMTIsCisgICAgMTk0LDEyNCwgNDYsIDEzLDIzMSwyMjYsIDQzLDI0MCwxODMsICA4LDI0NiwgMzAsICA2LDE5NywgMzMsIDM3LAorICAgIDEzNSwgOTUsIDMyLDEwOCwgMTcsIDU2LCAyNSwxMzEsIDM4LDIwMywgNjgsMjE5LDE4OSwyMzIsMjEyLCA4MCwKKyAgICAxMzksIDIzLDIyNSwxMzYsICA5LDE5NiwxOTYsIDI0LCA4OCwyMTksIDM3LDE1NCwgOTYsMTUwLCA3MywgNjYsCisgICAgMTY4LDE5OCwxMzIsMTY3LCAzNiwyMTUsIDgzLDI0MSwyMDMsMTg4LCA0NiwxMzUsIDUzLDIzMCwyMjksMTUyLAorICAgICA0NCwgNDEsIDE1LDE2NywgMzEsMTMxLDE0MCwgODYsMTUxLDE1OSwgNTIsIDYzLCAyNiwgMTAsMTEwLCAyNSwKKyAgICAxNzcsIDIwLDEwNCwxNjgsIDMwLDE3MiwxNDksMjI1LDIxMywgNjEsMTgwLCA3NiwgNzMsMTA1LCA1MiwgODgsCisgICAgIDIxLDEyNiwyMTMsIDkyLCAxOSwgNjgsMjE5LDE0MSwxNzksMjUzLCA2OCwxNzYsIDY1LCA4MCwxNTcsMTU3LAorICAgIDEwMywgOTIsIDIwLCAgOCwyMDMsMjE0LDEyMiwgMjUsIDMyLDEwOCwgOTIsMjQ5LCA1OSwyNDYsMTE4LDE5MCwKKyAgICAgMzAsMjAzLDExMSwxMTksIDMzLCA0NywgNzksMTI1LCA1NiwgMzYsMTMxLDI0MywxODMsMjI4LCA4OSwyNDEsCisgICAgIDE4LCA3MywgMzksMTczLCAyOCwxNjcsMTY4LDExMiwxODYsMTQ4LDE1NywyMTIsIDkyLCA5MCwxNjIsMjE3LAorICAgIDEzNSwxNDEsIDkxLCA1NCwyNDYsIDU3LDIyOSwxNDgsIDY5LDE0OSwxODEsMTc4LDIxMiwyMzIsIDQ1LDI0MSwKKyAgICAgNDEsMTQ3LCA5MCwxOTgsMjI1LDEyMiwgOTQsMTkzLDI0NSwyMDQsMjUyLCAxMCwyMjksMTUyLDI0MCwyNDgsCisgICAgMTM1LDI1MiwyMzcsIDIxLDIzMSwgIDUsIDY5LCAzMiwgMTksMTk4LDE5MSwgNTgsMTM1LCA0MCwgNTYsMTQ5LAorICAgIDE2OCwgIDcsMTQwLDE5MywxMjUsMTQ0LCA1MCwgNjAsMjI1LCA2MCwyNTEsMTU4LCAzOCwgOTIsIDY3LDEzOCwKKyAgICAxNDUsMjU0LDE0OCwgMzgsMTk5LCA1MiwxODgsIDMwLDEzOCwyNDUsMjAzLCA3OCwxNjQsIDE3LDE0NSwxMDcsCisgICAgMTQ4LCA4OSwxNzYsMTA3LDEzMywxMDAsMTc2LDEwNywxMDEsMjE5LDEyNSwgIDIsMTM4LCA1NywgNTEsMjMwLAorICAgIDExNCwxMjIsMjAzLCAzMiwgMTIsMTA4LCAzOSwxODYsIDI0LCAgNCwgMjEsMTYxLCAgOCwxNjQsMTI1LCAgMCwKKyAgICAgOTEsMTYyLCA5MywgNjMsMTE1LDIxMiwgMjUsMjUwLDE3MCwxNzcsMjI3LDIwNiwxMzMsIDEzLCA5NSwgOTcsCisgICAgIDQzLDEzOCwxNTQsIDYwLCA1MywxODUsMTU4LDE1MywgOTUsIDg2LDE0MiwgNzMsMTQzLDE1OSwyNTIsMTA0LAorICAgIDE3NywgMjYsMTAwLCA2NCwxNTQsIDY5LDI0NiwgODMsMTAyLCA4NywxNDEsIDYyLDEzNywxODcsMTM3LCA0NywKKyAgICAxNDksMTAzLCA0MywyMDQsIDM1LCA4MywgODksMTk4LCAgNiwgNjMsMTk2LDIxNCwxMTMsIDIyLDE1MywgIDIsCisgICAgMTUzLDIxNCwxMDEsMTMyLDE2NywgOTYsMjEyLDI0NSwxMDAsMTY0LDIwNiwgMTAsMjQxLCAgNSwyNTUsMTEzLAorICAgIDEwMywxMjUsMTA4LCAgOSwgMTYsICAzLDE2OCwgNDUsIDgxLCA4MywgNzYsMTM4LDE3NSwgNjAsIDE1LDIyNSwKKyAgICAyMzYsMTIxLDE4NCwxNzUsIDcyLDE0NSwyMjUsIDIxLDIzNSwxNzYsMTUzLCAyOCwgNjksMTQwLDE2MywxMTgsCisgICAgMjI5LCA3NSwgNzcsMTM3LDE3MiwgNzMsMTA4LDEyNSwgIDgsMTkzLDI0NSwxMjksMjQ4LDE0OSwyMDAsMTc3LAorICAgICA3NSwgMzIsICAzLCAyMCwgIDMsIDYwLDE2OCwxMTIsIDU0LDIwMSwxODYsICA3LDExMCwxNjEsMjI2LDE5NCwKKyAgICAgNjMsMTU3LDE3MCwgMzgsIDYxLDIwMCwgIDgsICA0LCA5NiwgNDcsIDI1LCA5OCwxMTcsMjA0LDE5NCwxMTYsCisgICAgIDkxLDIxNCwgMjcsMTUwLDI0MSwgOTEsIDM2LDE3MiwgODUsIDQ2LDEzMywxODUsMjEwLCA3NywgNjksIDE2LAorICAgIDIyNCwxMTQsMjE2LDE3MCwgNDksICA2LDExNSwgODEsMTExLDExNSwxNjMsIDQxLCA5NiwgMTcsMTE2LDIyOSwKKyAgICAyNDIsMjQyLDExMiwgMTQsIDkxLCAzMSwxMzEsIDkyLCAzMSwxMzYsIDk1LCA3MiwxNDIsIDc3LDEzMCwxMDgsCisgICAgMjM3LCAyNSwgMzksMTQyLDIxOSwxMTcsMTA4LCA0MCwxNTgsIDQ4LCA3NCwgNDAsMTk0LCAyNCwxNjUsMTg1LAorICAgIDEzNiwgMjAsMTI0LCAzOCwxNDAsIDk1LDEwNiwgNDUsMTA5LDIyMiwyMDMsMTU5LDIxMiwgNTYsMjUwLDIwOCwKKyAgICAgMTEsMTk1LCAyNywxNDcsIDM4LDExNCwgOTcsIDE5LCAyMywxMTcsIDUzLCA3MywxNDMsMjMxLDIzOSwgODMsCisgICAgMTk1LCA2MiwgMzcsIDI0LDIwNiwgNzAsIDg4LDExMiwxMzMsIDMzLCA4NCwxODEsMTQ0LCAgOSwgODQsMTQ5LAorICAgIDE0NCwxMzYsIDI0LCAxNywyMTMsMTA0LDEzNiwxMTQsIDI1LDE1MSwyMjYsIDYzLDIzMCwxOTAsIDIzLDIxNywKKyAgICAxNjgsMTMxLDEzNywxMDQsMTY1LCAxNywyNDksIDc5LDEzNiwxNzMsMTQzLDIwMCwxNzUsICA3LCA2NCwxMTgsCisgICAgIDI4LDI0MCwgMzgsIDk2LDEzNCwyMjIsMjExLDEyOSwgNTIsMjAzLDE4NCwyMzAsIDY5LCAxOSwgMjEsMTM4LAorICAgIDEzOCwgNTIsICA4LDEzMSwxOTQsIDU0LCAzNiwgMjMsMTUzLDEwOCwgMjQsMjE4LDE0NSwyMTIsMjE2LCA1OCwKKyAgICAgNDYsIDg4LDE1MCwyMjksMTc3LCA0OSwxNTEsMTcyLDE3NiwxODcsMTQ3LDEwMCwgNzksMTY1LDEyNSwgMzYsCisgICAgIDY5LDEyOSwyMzYsIDk3LCAzOCwxNDgsIDcwLCAyMSwxODEsMTYzLCA4OSwxMDQsMTA4LCA1NywxODMsIDk0LAorICAgICAyMCwxNDUsMjA2LDE4OCwxMzUsIDMyLCAzNSwxODIsMTQyLDE5MCwxOTMsMTUwLDE4MSwxOTgsIDQwLDIzNCwKKyAgICAxMTYsIDEyLDI1NSwgNjcsMTg1LDE0OCwxMzksIDU3LCAyMSwxMzYsMTcyLDE4NCwgNTQsICA0LCA2MSwyMTMsCisgICAgMTU5LCAgNywgOTEsIDMxLDE1NCwgOTUsMjQwLDExNywgMzEsMTE0LCA5NSwxMDYsMTU5LDI0NywxNzAsMTE4LAorICAgICA0NSwgMTksIDgxLDE2NiwgOTMsMjQwLDIwNCwgNjIsIDExLDEzOCwgNTUsIDM5LDEzNiwyMzAsMjM1LDE5MCwKKyAgICAyMDIsMTU1LDE5OSwyMzcsMTQ1LDEwNCwyNDMsMjA5LDIzNywgNjksICA2LDExOSwxNTUsMTgwLDE5MiwyMjgsCisgICAgIDQyLDExOCwgMzYsIDM1LDExNiwxMjksICA3LCAyOCwgMjQsIDk2LDIxNCwgIDgsIDc1LDExOSwgMjcsIDUxLAorICAgIDEzOCwgODksMjE5LCA0MywxODYsIDcxLDI1NCwxODksMjMwLDE1NiwxNzksMjQzLCA1MSwxNDMsIDMxLCAyMCwKKyAgICAxNTUsMjMyLDEyNywxMzMsMTkzLDIxNSwxMjgsMTQ5LDE2MSwgODMsIDIzLDI0OCwxMjIsMTA1LDIwOCwyNDQsCisgICAgMTMxLCA4OSwyNDIsIDk1LDEzNSwgOTUsMTMzLDIxNywxOTEsMjM3LCA4NiwgMTQsIDYzLDEzOCwyMjksIDI4LAorICAgIDEyOSwxMTMsMjA0LDI1MSwxOTUsMTc3LDIwOCwgNjQsMTY2LDEyMSwgNTMsIDIwLCA3NCwgMzYsMTgzLDIwNiwKKyAgICAgNDcsIDgyLCA0OSwxMDUsIDM5LDExNSwxODUsIDEwLDEyMCwgNjEsMjMyLDIyMywxNTEsIDk3LDE3NiwgMjMsCisgICAgIDEyLDIwMCwgIDcsIDI3LDE0NSwyNDgsMTA5LDI0NywxNjAsMTI3LCAzMSwgMzUsIDQ0LCA0OCwyMDAsMTgwLAorICAgIDE3NCwyMDEsMTMxLDI0OCwxMTIsMjQ0LCA2OCwgNjAsMTQzLDEzMCwgOTgsIDI1LDEzMywgIDAsMTM4LCA3NSwKKyAgICAgNjYsIDM2LDE3NywgOTYsIDkxLDIwNywgMzksMTQ4LCA5MCwxNTksMTU1LCA5NSwgNjksMTE3LCA0MSwgNTYsCisgICAgIDU0LDI0NiwyNDMsIDQ4LDExOCwxNTIsMTQ1LDEwMywgODksICA4LDE4MCwgNjgsMjM5LDIyNCwgIDUsIDEwLAorICAgIDE1NywgMjIsMTY2LCAyMSwgNDYsICAzLDIxMSwxOTgsMjM4LDE3MiwgNDUsIDUwLDE4MiwyMzcsMTM1LCA1NiwKKyAgICAxNTEsMTQxLCA0NiwgMTIsMTIxLDE3MywgNDQsMjUyLCA1NywxOTcsIDYwLCA4NywgNzMsMTcwLCA1MywxOTIsCisgICAgMTUzLDEzMCwgMjMsIDUyLDI0MiwyNDMsMTYxLCAxOCwgMTksIDYyLDEyNywxODYsMTU1LDE1MSwgNDQsIDYwLAorICAgIDE3OSwyMjAsICAyLDIzNCwxOTMsICA5LDIzNSwgMjksMTkwLCA0MiwxNDgsMjQ1LCA1MSwxMjQsMjEwLDIxOSwKKyAgICAxNDEsIDYyLDIzNywxNDEsMjA1LDE4NywyMzQsMTQwLDE0NiwxNzMsMTEwLDE1MywxMTAsMTc4LCAzNiwxMjcsCisgICAgMjM2LDIwMCwgODYsIDk5LCAzOCwgNTYsMTkyLDEzMywgMzksMTkwLDE2OCwxODgsIDQwLDE2MywxNDEsICAyLAorICAgIDE3NSwgNDIsIDUyLDE3NiwyNDIsMTI1LDE5NywgMjUsMTQzLCA2MiwyMzgsMTM2LCA3NiwyMzQsIDY5LCA1NiwKKyAgICAxOTgsMTgxLDEzNCwgODYsMTA4LDIyNCwyMTEsIDk5LDE2MSwyNTEsMTY0LDIxOSwgMTcsMTY2LDIzOSwgOTcsCisgICAgMTczLCA4NSwyMjYsIDM0LDE4MiwyMDcsIDkyLCA2MSwxNjcsMTY4LCAgNCwxNTksIDk3LCAzNiwgODUsIDE4LAorICAgIDIzOSwxNjAsMjE2LDIwMSwxMzgsMTUyLDI0NSwgNTMsMTY0LDIxNCwgODcsMjI3LDIxNSwxNTYsIDgzLDEzNCwKKyAgICAgODksMTk4LCAxOCwgOTksMjQyLDE5NiwxNTksIDQxLDE1NiwxNjUsMTUyLCAzNSwgNzEsMTY1LDIxNywgIDIsCisgICAgIDQ4LCA0MiwgMTAsIDE5LDIxMywgODUsMTI4LDIzNSwxMzgsMjE3LDIyOSwyMjcsMjQ3LCA1MiwxNTMsMjUwLAorICAgIDE1NCwxNzUsIDMyLDE2OSwgMjYsIDU3LDExMywxNzMsIDk5LDIxOSwyMzAsIDkxLDEyNSwgMjgsMTkxLDExNCwKKyAgICAyMDQsMjQyLDI0MiwyMTEsIDY0LDE0MSwgNDIsIDQ4LDIwNSwgIDIsMTcxLDE0MiwxNDksMTI2LDEwNSwxMDIsCisgICAgMTI1LCA2NSwxMjYsIDc3LDE3NywxNDAsICA4LCAyOCwxNDcsIDY4LCA5OSwyNDcsMjU0LCA2OSwgMzksIDgzLAorICAgIDEzMywxNzksMTYzLDE5MCwxMzgsIDg4LCA3MCwxODYsMTg3LDIzMSwxMzAsMjE1LCAzMCwxOTUsMjAzLDI0NCwKKyAgICAgIDksICA1LDI1MiwgMTAsMTI1LDI1MCwyMjQsICAzLDEzMCwgNDIsMTEzLDIzNywyMzEsMjM0LCA3MSwgNzAsCisgICAgIDY5LCAzNiwgMzcsIDQ1LCA2OCwxNzQsMTY2LDE0MCwxMjUsMTI1LDE5MiwgNDcsMjI5LDI0NCwxODcsMjM3LAorICAgICA3NSwxMTksMTkxLDE3NiwgMzksIDgwLCA3MywgNTksMTg4LCA4NywxNTQsICA1LDE3OCwxMzAsMjEwLCA1NywKKyAgICAgIDAsMjE0LCA4NywxMDAsMjE0LCAyMywyMzEsMjE1LCA3NiwxNDEsICA5LDE4OCwyNTUsICAzLDEwMSwgMzcsCisgICAgMjA2LCAxNiwxOTQsMjQyLDEzNSwyMjUsIDY5LDEzMSwxNzEsICA4LCA4NSwyMTQsMTk4LCA3NCwxODksMjQ5LAorICAgICAgMiwgOTQsIDUxLDI1MiwgNzQsIDQ2LCA5MiwxMjQsMjA5LDIwMSwgODIsIDQyLDIyNywgODcsMjQwLCA4MCwKKyAgICAxMTMsMTcwLDI0MCwyNDgsMjQ1LCAgMiwgNjYsMjA1LCA0OCwgNDMsIDM5LCAxNywxMDAsIDk3LDI0NCwyNDAsCisgICAgIDEwLDE3NiwxOTAsMTUzLDI0NSwyMDUsMTc1LDE5OSwgODksIDIyLCA3MiwxNzksIDI0LDEwMywxMjMsMTA0LAorICAgICA5OSwxNTYsMjI0LDIwMywxMzAsICA5LCA5NywxNDEsMjMxLDIwNSwyNDUsMjE4LDExNiwxNTksIDg5LCA4MCwKKyAgICAgNDgsMjQ0LDIzNSwxMjksMjA5LCA1NywxNDUsICA2LCA0MywgNzMsMTk4LDE0OSwgMzIsMTcxLDIxMSwgMjEsCisgICAgMjQ4LCAzMywxMzIsIDIzLDEwMSwxNTMsMTM5LDExNiwxNDUsIDg2LDE2MSwyMTMsMTUyLDE1OCwxNzgsMjUwLAorICAgICA3NSwyMzYsMjQ2LDExMSwgOTYsMTI1LDI0MywyMzUsMTU3LDExMiwgMzgsMTQ0LCAgNiwgMzgsIDk5LDIzMSwKKyAgICAgNjgsMTcxLCA0OCwyMzEsMTU4LCA5NSwxMTIsIDQyLDE4OSwgNzIsMTkwLDE4OSwyMDksIDYyLDE1NiwgMTMsCisgICAgIDczLDE0MCwgNjQsMTM3LCA5MywxMjAsMTAxLCA1NywgNDAsIDM4LCAgOSwgNzEsIDQzLDExNCwgNjEsMTUwLAorICAgIDE3NCwyNDMsMTM5LDE5MCwyNDgsMTU2LCA5MSwyMTIsMTgwLCA3NCwxMDcsMTkyLDExMSwgOTYsMTI1LDI0MywKKyAgICAyMzUsMTIxLDExMiwyMzAsMjU0LDE5MiwyMjQsMTA4LDIxNCwxMjcsIDU3LDE4MywxNjYsIDMwLDEwOCwxNjMsCisgICAgMTE0LCAxNSwgODQsIDc4LDE5MywxNzcsMTYxLCAgNywyNDcsMTQ0LCAgOCwyMjgsIDM2LCAgOCwxNTgsMjM5LAorICAgIDEwNCwxOTAsMjA0LCAzNSwgNDcsMTA0LCA1NCwgNTcsMTU3LCAxNywyMTgsMTc2LCA3MywgMjIsIDYyLDIyOCwKKyAgICAyMzQsIDg4LCAxNSwxMzYsMTczLCAxOCwgNzksMjE3LDEyMiwxMzQsIDg2LDEzMywgMTgsMjUzLDE5MCwgOTMsCisgICAgMTg1LDI1MywgMzEsMjMwLDIwNCwxNTQsMjI5LDExNSwgNjIsMTQ0LCAxNSwgIDAsICAwLCAgMCwgIDAsIDczLAorICAgICA2OSwgNzgsIDY4LDE3NCwgNjYsIDk2LDEzMAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX2RhdGFfa2V5Ym9hcmRfcG5nWzExMDMyXSA9IHsKKyAgICAxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwLCAgMCwgIDAsICAwLCAxMywgNzMsIDcyLCA2OCwgODIsCisgICAgICAwLCAgMCwgIDEsMTEyLCAgMCwgIDAsICAwLDE3OCwgIDgsICAyLCAgMCwgIDAsICAwLDIxMiwgNDQsICAzLAorICAgICA5OSwgIDAsICAwLCAgMCwgIDksMTEyLCA3MiwgODksMTE1LCAgMCwgIDAsIDExLCAxOSwgIDAsICAwLCAxMSwKKyAgICAgMTksICAxLCAgMCwxNTQsMTU2LCAyNCwgIDAsICAwLCAgMCwgIDcsMTE2LCA3MywgNzcsIDY5LCAgNywyMTYsCisgICAgICAxLCAzMCwgMTMsICA2LCAzMiwyMTgsMjQzLCA0MSwyMjcsICAwLCAgMCwgMzIsICAwLCA3MywgNjgsIDY1LAorICAgICA4NCwxMjAsMjE4LDIzNywxMjUsMjA3LDExMSwgMzUsMTk5LDE4MSwxMTAsMjE3LCAyMCwyMDMsMTYwLCA4OSwKKyAgICAgIDYsMjIxLDEwMSwxMTIsMTg2LCAgNywgODQsIDUxLDE0NCwxNTQsMTk4LDE2OCwgMjEsMTUyLDExNiwgNDgsCisgICAgMjEyLCA5OCwgNTYsMTM5LDE1MywgIDAsIDE3LCAgMywyMjAsMTIwLCAxNywxMDMsMjQxLDIyMiwgOTEsIDM2LAorICAgIDI0OSwyMjcsMjM4LDE4OSwxMzksIDM2LCAxMSwxMjMsIDUxLCA5NCwxNTIsIDUwLDE0NCwgODEsMTI4LDEwNSwKKyAgICAgNDUsMTY2LCAgNywgMzAsMjEwLDE4NCwgNjcsIDE0LDIwNCwxNjYsIDE2LDE4MiwxMzYsMTE2LCAxMywxNDUsCisgICAgMjM4LCAzMywgODIsIDUyLDE0NSwyMjYsIDM3LDI0MCwgMjIsIDUzLDEwNiwyMTEsIDM2LDI0NSwxMzksMjM0LAorICAgIDEwNiwgNzMsMTU2LDI1MCwxNjAsMTMzLDIxMiwgMTgsMTIwLCA4NCwyMTMsMTE3LDE5MCwyNTAsMjA2LDE2OSwKKyAgICAyMTEsMTI1LDIyMiwyMTcsMjIzLDI1NSwgMjcsMTM2LCAgNSwxODUsMTE3LCAyOSwgIDAsMjA4LCA1OSwxMTQsCisgICAgMTY1LCA1NywxMDUsIDc4LDE1NCwgOTEsIDg1LDExNSwyMzksICAyLCAgOSwgIDksICA5LCAgOSwgNzMsIDQwLAorICAgICAxOCwgMTgsIDE4LDE0NiwgODAsIDM2LCAzNiwgMzYsIDM2LDE2MSwgNzIsMTk2LDEzNiwgNjgsIDM0LDE0NSwKKyAgICAgNzQsMTY1LDIyOCwgNjAsMjIwLCA2OCwgMzIsMTMyLCA1MiwgNzcsMTQ3LDEzMiwxMTQsIDg5LDE2NCwgODIsCisgICAgMTY5LCA2NiwxNjEsIDE2LDE1NSwgMjcsMTA4LDEwOCwxMDgsIDY0LCAgOCwgMzMsMTMyLCAyNywgMjcsIDI3LAorICAgICA0OSwxNTIsMjAzLDIzMSwyNDMsMTI0LDEwNCwgMjQsMjI3LCAyNCwxNTAsIDc1LCA0MiwxNDksMjAyLDIyOSwKKyAgICAxMTQsIDY2LCA3NywgOTYsMTQwLCA2MywgNDEsMTI2LDI0MiwyMzMsIDQ3LCA2MiwyMDUsMTAyLDE3OSwyMjUsCisgICAgIDY5LCAgOCwgOTcsMTYxLCA4MCwgNzIsIDM2LCAxOCwxNjIsMjMzLDE3OCwgODAsIDQwLCA2NCwgIDgsIDY5LAorICAgICA3OSwgOTksIDM4LDE0NywyMTcsMjIyLDIyMiwyNTQsMjQ0LCAyMywxNTksMTEwLDExMSwxMTEsIDk5LDE0MCwKKyAgICAyMjcsIDg5LDE1MywxNjksIDg0LCA0MiwxMjMsIDQzLCAyNywxNjcsIDE1LDE2NywgODIsMTY5LDE0MSwxNDEsCisgICAgIDEzLDIwOSwxMTksMTQxLDIyMywxODQsMTQxLDE0MSwxNDEsMjExLDEyNSwyNTIsMjIxLCAgOCwxNDEsMTYxLAorICAgICAxNSwgODAsIDEyLDE2MywyMjYsMjA2LDE0NCwgNzQsMTY1LCAyNCwgOTksMTU0LDE2NiwgNzcsIDM4LDE0NywKKyAgICAgNTYsIDQ0LDEyNiwxMzIsMTg1LCAzMywxMzIsMTQ0LDIzMiwxMjMsMTUwLDIwNywyMzEsIDU1LCA1NCwgNTUsCisgICAgMjA4LCAgNywyMzIsMjExLCA5NSwxMjQsIDkwLCA0MCwgMjAsICA0LCA4OSwyMDQsMTczLDIzMSwgMTQsIDU5LAorICAgIDEzNSwgNDcsMjU0LDIzMSwxMzMsMTE4LCA5MSwgMTEsMTUxLDEzNiwxNjYsMTA1LDE0MCwgNDksMjA5LCA4MywKKyAgICAxNTQsMjA1LDEwMiwgODMsMjM5LDE2NywgNjgsMjQzLCA1MCwxMzIsMTEyLCA5OSwxMTUsMTMxLCA4MiwyMTgsCisgICAgMjU0LDE5MCwgNzcsIDQxLDIwNSwyNTUsIDQ0LCA0NywxNDgsMTk0LCA2NiwgODEsIDU3LCAyNiwxNDEsIDcwLAorICAgICA2MywxNDAsMjI2LDE0OCwxNTMsIDI3LCAyNywgMjcsMTYzLDIwOSwgNDAsICA2LCA3MSwxNTIsIDc2LCAzOCwKKyAgICAxNjMsMjA5LDIzMiwyNDQsIDQ1LDI1MiwgNzAsMTM0LCA2MCwyMTcsMTA4LDE1MCwgODIsMTU0LCA3MiwgMzYsCisgICAgMjQwLCA3MSwxNTIsIDgyLCAyNiwxMzEsMTM2LDE1NywgNzYsIDM4LDE0MCwgNDksMTkwLCAyNywgIDgsMTgxLAorICAgIDIwMCwxMTksMTI4LDI1NCwxNzEsMjU0LDIzMiwxMzUsIDgxLDI1MSwyNTEsMjQ2LDEwNCwgNTIsMjI2LDExOCwKKyAgICAgMzUsIDMxLCA4MSwgMzQsMTQ1LDE2MCwxNDgsIDUwLDE5OCwgNzAsIDYzLDE0MCwgNTYsMTAzLCAzMywxMzIsCisgICAgIDUwLCAzMSwxMDIsMTIyLDE4OSwxNTgsMTA0LDE5OCwyMDQsMjIyLDIwMiwxODIsMTkxLDExMSwyMjcsMTQzLAorICAgIDE3NiwgODAsIDE1LDIzMSwgMzEsMjM4LDI1MSwgNjIsMTY1LDIxMiwyNDcsMjUzLDI0MCwxMzgsIDU2LDE1MywKKyAgICAxMTIsMTAzLDIzNSwyMDYsMjQ2LDI0NiwxODIsMTY2LDEwNSwgOTIsMjMyLDEyNSwgODIsMjUyLCAzNiwxNTksCisgICAgMjA3LDE5OSwxNzYsMTg1LDE5NCwyNDcsIDk2LDE5MSwyMjMsMTQzLDE5OSwyNDUsMjUwLDI1MywgNjIsMTI0LAorICAgICAxNSwxNTgsIDM0LDI0NywyMTQsMTYyLDE3OCwgMjAsMTMxLCA5OSwxMzUsIDExLCAzNywyNDUsMTI2LDE3MCwKKyAgICAyMjMsMjM5LDEwMywgNTAsIDI1LDIwOSwxMTgsMjQ5LCA0NiwxNTQsIDc0LDE2NSwgMzgsMjU1LCA1OSwxMjEsCisgICAgMjQzLDI1MywyNTEsMTY5LCA3NiwgMzgsMTMxLCAxNiwyNDIsIDYwLCA3OSwgIDgsMTIxLDEyNSwxMjgsMTg2LAorICAgIDEyNywyMzksIDUwLDE5OCwgMTYsIDY2LDE0OCwyMTAsMTIwLDEwMiwxNDksMjM1LCA3NCwgNzcsMjExLDI1MCwKKyAgICAxNzUsMjUwLCA0OSwyMDAsMTQ3LDE5MywyMzUsMTkzLDEwNCwgNTIsMjQyLDI1NSwyMzMsMTA3LDE1NCwyMTQsCisgICAgMjM3LDExOCwgIDUsIDI1LCAyNiwxNDEsIDcwLDIyNSwgIDYsMTkyLDE4MywgIDQsMTI2LCA2OSwgMTYsMTg0LAorICAgICAyMCwgIDIsICAwLDIyOCwxMTQsIDU3LDIzOCwyMjUsMTU4LDIzMSwxMzcsMjE2LCAxMiwyMzAsMTk1LDE4NiwKKyAgICAxOTMsMjM1LCA2NSwgNjAsIDU4LDE1NywxMzksMTQ4LDE5MywyMzUsIDY1LCAzOCwxNDcsMjI1LCAyOCwxODksCisgICAgIDEwLCAxMCwxMzMsIDQ5LDI0NiwyNTIsMjE5LDIzMSwxOTAsMjM5LDI1MSwxOTAsMjU1LDI1MiwyMTksMjMxLAorICAgICA0OSwyMjAsIDUxLCAzMCwgOTQsMTEzLCA0NiwgOTksMjU1LCAyMiwgMjcsIDE3LDIwOCwxMjcsMjA5LDEwOCwKKyAgICAgNTQsIDQzLCA1OCwxOTEsIDQ4LCA2MywxMzIsIDc2LCAzOCwgIDMsIDMzLDI0NCwgNjAsIDE1LCAzMywgMzYsCisgICAgIDc4LDE2OCwgNjcsICA4LDE3OSwxODMsMTc4LDE1NiwxMzksIDYxLDIwNywgMTksIDQyLCA4MiwgMzgsMTQ3LAorICAgICA3MywyNTUsIDg1LCA5NSwxODcsMTczLDEwOSwxMDgsMTA4LDEwMCwxMTEsMTAxLDE4NywxMjcsMjM5LDEzOCwKKyAgICAyNDYsIDU4LCA3NCwxMDUsIDQyLDE0OSwgNzQsIDM2LCAxOCwxODksMTYzLCA5NCwgNTQsMTU1LCAyMSwxNjQsCisgICAgIDQ2LDEwMywxMTEsMjIwLDEzNSwgMjUsMTYxLCA2OCwxODUsMTQ0LDE2OSwgNTEsIDMxLDEwMiwgOTgsIDEwLAorICAgIDEyMSwgOTgsMjExLCA0MSwyNDEsMTkyLDI0MywgNjAsMjA3LDI0MywgMzgsMTQ3LCAgOSwyMjMsMTEyLCA3MCwKKyAgICAxNjMsMjA5LDEwNCwgNTIsMjI2LCAyMywgIDUsIDg5LDIzNiwyNDUsMTIyLDE0NywyMDEsMTMyLCAgNywyNTIsCisgICAgIDI0LCA5OSwgNjUsIDU3LCA0MSwgMzAsMTE0LCAzNSwxMzIsMTg0LDIyMCwgMjcsIDEyLCAgNiwxODUsIDkyLAorICAgIDE3NCwyMTUsMjM1LDIyMSwxODUsMTE1LCAzOSwxNTEsMjAzLCAyMSwgNjIsIDQ2LCA3NiwxMDMsMTA2LDE2MywKKyAgICAgODUsMTI0LDEzMSwyMTUsICAzLDIzOCwxMDIsMTQwLCA0OSwgNDYsIDgyLDEzMiwyMzgsIDYxLDEzNywgNjgsCisgICAgIDM0LDI0MywgOTcsMTY2LDI1MSwyNDcsMjM4LCA5NiwgNDgsMTM2LCA2NSwgNTksMjMxLDIxNCwxMTUsMTI0LAorICAgIDE3MSwgNzUsMTcyLCAzNywgNjgsMTY3LDIxMywyNDksIDg2LCAyMywxOTEsMjExLDExMywxMTUsIDM5LDIzNywKKyAgICAgNTgsMjQyLDIxNiwyNDgsIDI4LDE4MywyMzcsMjUzLCA4NCwxNjgsMTU5LCA2OSwyMzksICA2LDE2MywyMDksCisgICAgMTY4LDIyMSwxMTAsMTE5LDI1NSwyMjIsIDc3LDE3MiwgMzcsIDUyLCA3NywxODcsMTE1LDIzMSwxNDIsIDMyLAorICAgIDE4OSwxMTIsMjE2LCA1NywyMjAsMjE2LDIyMCwyMTYsMjU0LDI0OSwxODIsMjU1LCA3OSwgNjMsMTQ3LDIwMSwKKyAgICAxMTIsIDM5LCA3OSwgMzYsIDE4LCA0NywgOTUsMTkwLDEyNCwyMTcsMTIyLDE1MywgOTEsMjA3LDEzNywyNDAsCisgICAgIDU1LDI1MiwgMTcsMTU4LDIzMCwgOTgsMTYxLCAzNCwgMzcsMTUxLDIwMywxMDUsMTgzLDE4MSwyMjIsIDgxLAorICAgIDExMSwyNDQsMTk1LCA0MCwyNTUsMTc5LCA1NSwxMzUsMTE2LDI1MiwgNDQsIDgyLDE0NCwgNjksMTk4LCA4OCwKKyAgICAyNTEsMjUxLDExOCwxOTEsMjIzLDE1OSwgNzYsIDM4LDEzNSwxNTcsIDY3LDIwOSwyMTcsMTY4LCA0OCwgODYsCisgICAgMTg5LCAxOCwxNTYsMTAwLDEyMiwgNzcsMjQyLDE5NywgNzMsMTkyLCAyNCwxMzUsIDI2LDEyOSwxMDMsMjE1LAorICAgICA4MiwyMzksMTY3LCAzOCwyNTUsIDU5LCA2NSwgIDgsMjQxLCA5MywgNzIsMjMyLDIxNCwgNTgsMjUwLCA5NywKKyAgICAxMTYsMTIwLDEyMCwgODgsIDQwLCAyMCwgNTIsIDc3LCA1OSwgNjAsIDYwLCAyMCwxNzcsMjA3LDEyNCwyMTUsCisgICAgMjQ4LDE0MiwxNzUsMTQwLDIzNywxNTksMTExLCAzMSwxMTgsIDE0LCAxNywgNjYsMTYxLDExOCwgIDAsICAwLAorICAgIDI0MCwgMzYsIDc4LDE4MCwgNzAsIDk1LDE4MiwgOTQsIDc4LCA3MSwgIDEsMTQwLDE3NywxNTEsMTczLDE1MSwKKyAgICAyMjYsIDk4LDE3MSwyMjIsIDgxLDE3NSwyMjMsMjM5LDI1MSwxOTAsIDk1LCA0MCwgMjAsMjQyLDI0OSwxMjQsCisgICAgMTg3LDIyMSwyMzAsMjI1LDE2NCwxODQsIDcyLCAzNiwxNTYsMTc3LCAyMSwxNDcsMjM0LDIzMSwgNzEsMTQ4LAorICAgIDEzMiwxOTQsMTQ3LCA4MiwgNDMsICAzLDEyNiwgIDgsMTk0LCAxOSwyMTgsMTI0LCA5NSwgNDUsMTI0LCA5MiwKKyAgICAyMjQsMTYxLDEyMCwgMTIsMTc3LCA0OSwyMDcsICAyLDExMiwyMDksIDQ2LDIxMiwgNzQsIDQ2LDE1MSwgMjcsCisgICAgMTg4LCAzMCwyNDAsMjA0LDE2NSwgODAsIDY3LCAxMSwgMzksIDc3LDE0NCwyMjYsMjI3LCAyNiwxMzIsMTI3LAorICAgIDI0OCwxMDAsIDUwLDEwNSwxODMsMjE5LDEzMywgNjYsMjI1LDIwNiwxNTcsIDU5LDI0MCwgNjEsMTg0LCA5OCwKKyAgICAxNzEsMjQ0LDE4NiwgMzMsMjEwLCA1OCwgMjAsMTMyLDE3NCwgODAsMTMxLDEzNywxMTIsICAwLDE5MCwyMDcsCisgICAgIDEyLCAgNiwgIDMsMjU0LDIwNSwxMDAsIDUwLDIyNSwyMjMsMTM5LCAzNSwxNDgsMjM3LDIzNywyMzcsMTI0LAorICAgICA2MiwxNDMsIDQ5LDIzMCwgNzEsMTQzLDE1MywgMTUsIDUxLCA2NiwgNzksICA0LCA4MywxNjksIDg0LDIzMCwKKyAgICAxOTUsIDEyLDE2NywyMDMsMTUzLCA2NSwxOTcsMTE4LDExMiwgMzIsMTQyLDE4OCwxOTQsMTA0LDExMywgNTAsCisgICAgMTUzLDI0OCwxOTAsIDE1LDIyMywxMzEsMjM2LDIyMywgNDQsMjMwLCAyMCwyMzAsIDIxLDE2NiwgNTEsMTc0LAorICAgICAzNiwxMTMsMTc5LDExOCwxOTAsMjE5LCA1MSwxMTAsIDU0LDE1NSwxMDUsMTMyLCAxMCwxOTgsMjMwLCA3MywKKyAgICAxMjcsMTQ3LDIwNSwxMDIsMTgxLDIxOSwgOTAsMTg0LDE1MywgNDcsIDU5LCA2NSwxOTUsMTAyLDE3MSwyMjksCisgICAgMjUxLCAgMSwgIDAsICAwLCA5OSwxOTcsMjIwLDIxOCwgNjYsIDQwLCA0NSwxMDgsMjA1LDE0MSwxODcsMTc0LAorICAgICA3NSwgIDgsMTYxLDExNiwgIDgsICAwLDIwOCwyMTIsIDkxLDEzNCwgOTcsMjA0LDE1NSwgNzUsMTY1LCA4MiwKKyAgICAgNjAsMTU5LDE1MSwgNzQsMTY1LDEyMCwxOTMsIDgyLCA1MiwxMDYsMjA2LDIzMywgMTIsIDQxLDE1NywxODMsCisgICAgMjE2LDIzOSwyNDcsMTIxLDE3NCwgNTIsMTc3LDE1MCwgMjQsIDEzLCA3MCwyMjEsMTEwLDExOSwgNTcsMjQyLAorICAgIDE2MiwxMTYsMjMyLCA1NiwyMDYsMjA0LDE5NywyNDksIDU5LDE1MiwyMDMsMjI5LDI1MCwxNzUsMjUwLDIyMCwKKyAgICAgIDQsMTY1LCA1MiwxODMsMTU4LDIyNywxMzUsMjI2LCA3NSwgNTksIDk0LDIxOSwyMzMsIDc2LCA3OSwxMDUsCisgICAgMTY5LCA4NCwxNDAsMjUyLDE5OCwxMjEsMTMyLCAxNiwxNDMsIDQ0LDI1MiwgODUsIDU2LCA2NCwxOTgsMjE2LAorICAgIDIyNCwyNDUsIDMyLDE4MywxNTgsMTMxLCAxNiwyNDIsMjQ0LCA1MSwyNTAsICAwLDI0NSwxNDIsMTIyLCAyNCwKKyAgICAyMjcsIDY2LDE2MSwyMDgsMTEwLDE4MywgNDcsIDc0LDE1MSwxNDAsMTQxLDIxOSwxNDIsMjI3LDE4NiwgNzEsCisgICAgICAwLCAgMCwxMzIsMjEwLDEzNCwxNzcsMTY5LDE2OSwxNzAsIDcyLCA2NiwyNTIsMjA5LDIyMCwyMzMsMTQyLAorICAgICA0OCwyNTAsIDk3LCAyMCwgIDksMTYxLDE4MCwxNTcsMTQyLDIyNywxMTYsMjA2LDIyNywxMTksMTY3LCA1OSwKKyAgICAxOTQsMjE3LDEzMiwyMjYsICA3LDE5MywyMjcsMTk5LDI1MSwxNDgsIDgyLCA4NSwyMTMsIDc4LCAzMywxNDgsCisgICAgMTkzLCA5NiwxMjgsIDE2LDE4NiwgNzYsIDQ2LDE4OSwgOTQsMTExLDIxMiwgMjcsIDEzLCAgMCwxMjgsMTcwLAorICAgIDEwNiwyMjcsIDQ5LDEwNywgNTQsMTU1LDE0MiwyMjcsIDg0LDE3MSwxODcsIDg4LCA4MSwgMzQsMTkxLCA5NywKKyAgICAxMjYsIDE2LDIxMiwxMDYsMTIzLDE4OCwyMjAsIDM1LDE1NywgNzAsMjI3LCA0OSwxNzEsIDU1LCAyNiwyMDUsCisgICAgIDg2LDEwNywyMjIsMjIwLCA5NiwgNDgsMjI0LDE3NCwxOTcsMTQzLDEyMCwgMzQsMTc3LDIyMiwxMTcsIDkzLAorICAgIDIwMywxNzgsICAwLCAgMCwxNzAsMTY2LDIwNiwgMTksIDEwLDIzMSwgMjAsIDc3LDIxMSwgNDYsMTQ3LDIxMywKKyAgICAxNjMsIDY3LDIwMiwgMzksMTE1LCAyNiwgNTEsMTE5LDE0NCwyMTUsMTgyLDEzMywgMTAsMTM2LCA0OSwyMTQsCisgICAgMjUzLDEyMywgNTUsMTU1LDIwNSwgNzgsIDM4LDE0NywgMzcsMTc4LCA1NCwxNDAsMTQxLDEwNywxMjMsMTIzLAorICAgIDE5MCwyMzksIDY3LCAgOCwgMjEsICA1LDI0MywgNzMsIDIyLDIyNSwxMDgsMTk2LCAzNSwyNDMsIDY3LDE1NSwKKyAgICAgMzEsMjI0LDIyNSwyMjUsIDk3LCA1NCwxNTUsMjI5LDE5NywgNzQsMTYzLDIwOSwgMjcsMTA2LDI0NiwxMjUsCisgICAgIDYzLDE1NSwyMDUsIDk0LDExNiwxNjEsIDUwLCA1NCwxMjYsMjQ0LDIxMywgODcsMTQ4LCA4MiwxNDAsMTEzLAorICAgICA1MCwgIDksIDkzLDIxNSwxMTcsIDI4LDE2NywgOTIsIDQ2LDExMSwxNTUsIDkxLCA5OCwxMTYsMTk5LDI0MCwKKyAgICAyMDksIDg3LCA5NSwyNDEsMTEyLCA1OSwxNTMsMTMyLDE2NywgNTksMTMwLDIzOSwyNTEsMjE4LDEwOSwgMTMsCisgICAgIDkyLDE3NCwxNTQsMjMxLDIzNSwyMTgsIDU1LDEzMiwxMjAsMjIwLCAyMywyMDYsMjQ0LDE4NywyMDQsMTM1LAorICAgICAyNSwyMzksIDMxLDIyMiwxNDYsMTMyLDI0MiwxNjIsMjE3LDE3OCwxMDksMjUxLCA2MCwyMDcsIDY1LDI0MCwKKyAgICAyMjcsMTM3LCA3NSwgNzgsMTY1LDE3NCwyMzUsMjQ3LCA0MywgMjEsICA4LDE0NywxNTYsIDUwLCA0NSwyMDMsCisgICAgMTcwLDIxNSwgMjcsMTkxLDEyNCwyNDgsIDMyLDI0MiwxMjMsMTM0LDIxMCwgNzIsMjE1LDI0NSwyMzMsMTI1LAorICAgIDEzNCwxNTUsMTIzLDI1MCwyNDQsMjE3LDE3NSwxNzEsMTkxLDI1MCwyMDEsMTI2LDEyMCwgNDQsMTg0LDE2MiwKKyAgICAgNzQsMTc5LCA0OSwgNTQsMTgyLDE3MiwxMzEsMjExLCA4MywxMzEsMTI0LDIzMywgOTUsMTE0LCA4MSwgIDIsCisgICAgICAwLDE3MCwyMTMsMjIxLCA4MywgNTQsMjEwLDIwMSwxMDAsIDUwLCAzNSwgMzksICA3LDEzMSwxOTMsMjEwLAorICAgICA5MSwgIDIsMTAzLCAxOSwxMTMsMTEwLCAyMiwxNjIsIDg0LCA0MiwyMDYsIDExLCAzMSwxNDMsMTQ0LCA5MCwKKyAgICAxMDksIDc5LCA4MywxMTEsMjA1LDE3OSwyNDMsMjMzLCA2NywgNjIsIDE1LDE1OCwyMTgsIDU0LDE2NSwxODAsCisgICAgIDgyLDE2OSwgMjgsMjAzLDE1OSwxMTMsMTA5LDExMSwyMDcsMTgyLDIzNywxODgsMTc0LDEzOSwgODAsMjA4LAorICAgICA3OSwxNzIsICAzLDE5OCwgODgsMTIwLDIzOSwyNDgsMjMwLDI0NywyNDgsMjQxLDI1NCwyMzksIDYyLDI1NSwKKyAgICAyMzcsIDczLDEzMiwxMzAsIDQ5LCA5NCwxMjIsMTkzLDE4MCwxNTcsIDE0LCAzMywxNTgsIDk3LCAyNCwyNDcsCisgICAgIDQzLDI0NywgNjYsMTE1LDE1MCwxMTcsMjQwLDIxNywxMTEsMjU0LCA5OSwyNTQsMTQzLCA1NywgMjEsMTU2LAorICAgICA5OCwyMzUsMjIxLDIxMSwxODEsMTY1LDEwOSwyMTksMTM0LCA5NywgODQsMTE5LDExOSwgOTksMTM2LDIwNSwKKyAgICAgNzQsMTY1LDIyNiwgNDcsIDMxLCA2MiwyMjQsMTA4LCAgMiwgIDAsIDQwLCAyNCwxNTUsIDI0LCA5OSwyMTUsCisgICAgIDIxLDI0MiwxNjYsIDQxLCAgOCwxNDcsMjQ3LCA0MywyNDcsMTY2LDE1NywxNDEsMTU1LCAzNSwxOTYsIDE5LAorICAgICA2MSwyMDQsIDM5LDE1MCwgIDUsICAwLCA0OCwgMTIsMjI3LDI0NCwgMjAsMTkyLCAzNywgIDksMTAxLCAyNCwKKyAgICAyMzksIDQxLCA2NywyMTksMjMzLDI0OCwxOTAsIDk1LCA0MiwgMjIsIDY5LDE3OSwyMDEsIDczLDIyNCwxMTQsCisgICAgMjIxLCA1MiwgNzcsIDY1LDE0NiwxMjksMTc1LDE0NCwxMTIsMjQxLDIzMiwyMzUsMjM1LCA5MiwgIDYsMTM4LAorICAgICAgOCwxMTgsMTg0LDEyMywxMzUsMTM5LCAxOSwgNDMsIDc0LDE4NSwgOTIsMTY2LDE0OCwxODIsMTU3LDIwNiwKKyAgICAxOTQsIDkzLDE2MSwxMTksMjEyLDIxMSwgNTIsMTA5LDIzMywyNDQsMTAxLDE3MSwyMTMsICAyLCAgMCwyMzYsCisgICAgMTQ4LDIwMywxNjEsIDU3LDE5NSwgNDgsMTI0LDIyMywxNTksIDIzLDE1MiwxMzcsIDY4LCA2NiwyMTEsMTgwLAorICAgIDIyMiwgODEsMjM5LDE0OCwxMjgsMjQxLCA1MiwgNjYsMjA5LCA4NCwxODEsIDkwLDIyMSwxODksIDk1LDE4NSwKKyAgICAgMjMsIDU4LDEyMSwyMDQsIDcyLCAzOCwgOTcsMTU2LDIzMCwgMjQsIDk5LDE2MiwgNzUsIDg0LDIxOSwgNzgsCisgICAgMTk5LDExNywyMjEsIDc0LDIyOSwgMzAsIDc2LDE5OCwgNDksMTY1LCA2NiwyMjcsMjUyLDIxNiwyNTIsMjQ5LAorICAgIDE1NiwgIDksIDM1LDE5NSwgNDgsICA0LCA0NSwgODQsIDQ2LCA2NywgNTYsMTczLCAyOCwgNzEsMTQ4LCA2NywKKyAgICAxNzQsMTE1LCAgNSwgIDQsMjI3LCA2MiwgIDAsICAwLDE2NSwxMjcsIDM0LDEyNCwyNDIsMTg2LCAxNCwgIDAsCisgICAgICA4LCA3OCwgIDgsIDMzLDEyNSwyMjMsMTI3LDI0MSwyMjYsMTk3LDIxMCwgNzMsMTE2LDIyMywyNDcsIDg1LAorICAgICA4NSwxNTUsMTU4LCA1OCwgOTMsIDk1LCAgNywgIDAsMTg0LCA5MywxMTksMTU4LDE4OCwgOTQsMTg4LDEyMCwKKyAgICAxMTMsMjUwLCA4NiwyNDcsMjM4LCA1MywgODksMTQ1LCAzOSwgODEsMTgxLDE3MCwxOTgsMjQ0LDEwNiwxMzcsCisgICAgMTgyLDIxMSwxNjEsMTQ4LDE1NCwgOTEsIDkxLCA2NiwyMTUsIDYxLCA4NywxMjQsMTI0LDEyNSwxMzYsMjQ1LAorICAgIDE3NywyMjUsIDQ4LDIwNiwxNTUsMTk3LDIzOSwgMjAsMTMyLCA3MywxOTgsMTk4LCAzMCwgMzMsMTMwLDE3OCwKKyAgICAgMzksIDM5LDE2MSwyMTcsMTA2LCAgMSwgIDAsIDc2LCA5NywyMjYsMTM2LDEyNywyNDIsMjI3LDI1MywxMjUsCisgICAgMjA2LCA0MSwgNDcsMTU0LCA0NSwxOTksMTEzLCA3NiwyMTEsIDIwLDExOSwgOTgsIDQ4LCA0NywxNjgsICAxLAorICAgICAgMCwyNTIsMTc2LCAzNCwxMDYsMjU0LCAxMCwgNjYsMTk4LDE1NiwgNzgsICA4LCA0NCwxNTcsICAyLDE4NywKKyAgICAxOTAsMTMzLDEwOSwyMDUsMTAyLCAxOSwgIDAsIDk2LDE1NiwxNTYsICA2LDE0MiwxMDYsMTAzLCAgMywgIDAsCisgICAgMTIwLDIyOCwgODUsIDE2LDI0OCwxNjUsIDk4LCA4MSwxOTYsMTY5LDE5NiwxMTYsMTA4LCAxMiwgMzMsIDEyLAorICAgIDE4MSwxNjUsMjMyLCA3NywgMjcsICAwLDI0MCwxNjcsIDYzLDI1NSwxMzMsMTAzLDEwNiwgNDgsMTk4LDI1MCwKKyAgICAyNTAsMTg2LDEwNSwxNTQsIDM0LDI0NiwyNDAsMTEyLCA4MSwgNjIsMTgxLDE1OSwyNDEsMTg3LCAgNiwgIDAsCisgICAgIDY0LCAgOCwxNDksMjAzLDExOSwgOTksMTYwLCA3OCwxOTgsMTk4LDE0MiwyMjcsMTY4LDE3MCwgMzgsIDM0LAorICAgIDEyMSwgMzEsIDcwLCAgMSwgMTUsIDMxLCA2MiwxNzYsMTcyLDEzMSwgNDcsMTkwLDI1MiwxNDYsMTUxLDI1NSwKKyAgICAxMzcsIDkxLCA0MiwgODgsMTkzLDEyNCwgNjUsMTUwLDEyNiwxODYsMjE5LDEzNywgODMsMjI5LDI0MywxMzAsCisgICAgMTM2LDI0MywgMTEsIDk5LDIyNywyMTMsIDMzLCAyMCwxNDMsMTQ0LDEyMiwxNjMsMTEzLDI1MCwxODUsIDgyLAorICAgICAyMCwyMTksMjQ4LDE0MywgNzEsIDMzLDE3MCwxNzAsIDM3LCA2OSwxOTgsIDU5LDI0NSwxMjIsMTMxLCAxNiwKKyAgICAxNzUsIDkwLDIyMSwxNDEsIDM5LDEyNiwgNTIsMjA1LCA1OSwgIDAsICAwLDE1OCwxNjQsMTAwLDIyNywxNzcsCisgICAgMjM1LDE4NiwyNDUsIDcwLDE5NSwgNjEsIDU4LDE3MCwyMzgsIDcwLDI1NSwgMTUsMjQwLCA2OSwgNzMsICA4LAorICAgIDEyOSwgMTYsIDYyLDEyNCwyNDgsMTI4LDIzMSwxNTUsMTA5LDI1MSwxNTMsMTAxLCAyOSwyMjQsMjIzLCA5NiwKKyAgICAyMDksMjE5LDEyMCwyMTksMTEzLCAyNCwgOTksIDY2LCA1NSwxNTgsIDk5LDE1MywgIDAsMjQ5LCA5NiwgMjUsCisgICAgIDk5LDEwOCwgNjAsMTAyLDEwOCwgNDQsMjI2LCA4NiwgNjYsMTUyLCA1MiwgNzcsMTc5LDIxNywxMDgsIDYyLAorICAgIDE3NywgMTQsMjQ4LDE2MCwxMzYsIDcxLDIyMCwxNjMsIDM1LDExMiwgNjcsMTEyLCAyOSwgIDksMTMzLCAzMSwKKyAgICAgODQsIDk5LDE0MCwgNjksMTU2LDIzOSwyMDQsICA0LDExNiwxMjcsMjUyLDE5NSwyMzksIDY3LDE2OSwgOTgsCisgICAgMjE5LDExOCwxNjcsMjExLCA4OSwxNTIsMjIwLDE5MCwyNTIsMTM2LDIzNCwxNDEsIDcwLDE2OSwgODgsMTQwLAorICAgICA0NSwxMzIsMjA0LDIzNSwyNTAsMTgwLCA1OCwyMTYsIDQxLDIyMywxMjUsIDk4LCAyOSwgNTYsMTQyLDIxMSwKKyAgICAxMTgsIDI4LDExMywxMjEsMjExLDEwNSwxODIsMTMwLCAxNiwyMTQsMTA2LDEyMywyMDUsIDg2LDEwNywxNjcsCisgICAgMTI0LCA4NywyMzIsIDcyLCA5MSwxNzMsIDIyLCA1OCwxODEsIDY2LCA0MiwxNDYsMTEyLDIxNiwxNzgsIDQ0LAorICAgIDE5NSwgNDgsMTg0LDE4NiwxMDgsIDU0LDE1NSwyNDUsIDcwLDEzMSwgMTYsIDM0LCA5OCwxNjksICAwLCAgMCwKKyAgICAgNzQsMTk3LCAzNCwgOTksMjA0LDExMywgMjgsIDQ2LDE1OSwgMTcsIDY2LDE0OSwyMDIsMTg5LCA5MCwxMDksCisgICAgIDQ3LDE4MiwgIDgsMTA3LDE2NSwgIDgsMTMzLDIxMCwgOTcsMTczLDE4MiwgIDcsICAwLDEyMCwyNDgsMjI0LAorICAgICA2NSwxMDgsMjAxLCA5NiwxMzIsMjEwLCA5MiwxOTMsMjE0LCAyNywxNDEsMTgyLDIxMSwxMzcsMTI0LDExNywKKyAgICAyNDIsMTE1LCA5OCwgODUsIDgzLCA2MSwgNjYsMTY2LDExNSwgMjgsMTExLCA3NCwyNDgsIDIwLCAyOCwxOTUsCisgICAgIDcyLCA3NSwxOTcsMTYyLDIyNywgNTYsMTc0LDEyMywgMzYsMTM2LCA4MCwxNDAsMjA1LDIwNSwyMzMsIDgxLAorICAgIDE4OCwgNTcsMjQyLDI0NCwxOTcsIDM4LCA4MywxMjAsMjMwLDE3MSwgODQsIDQ0LCAxMCwxODEsIDk4LDIxOSwKKyAgICAxODIsMTcwLDEwNiwyNTIsIDg0LCAyMSwgIDAsIDgwLCA0MiwgMjEsMTQ3LCAxNiwyMTgsMTgyLDI1MywxNjIsCisgICAgMjE3LCAxOCwgNDksMTUzLDI1MiwgIDgsMTE0LDE2NywgOTIsMjQ2LCAgMywgMzEsIDY2LDEzNiwgMjEsMTMzLAorICAgICA0NywxNTUsMTUzLDE5MiwgMzYsMTU0LDE0OSwxNTksIDcwLCA5NiwgNDYsMjI3LDE5OCwyMjcsMjI5LDIyOSwKKyAgICAyMTQsMjI4LDI0NSwgMzQsIDIwLDE5OCwxOTgsMTQzLDI0NywyNDcsICAxLCAgMCwyMTMsMjM0LDExMCwyNTIsCisgICAgMTI0LDE3MiwxMDYsIDQyLDEwNCwgIDgsIDU3LDExMiwyMjksMTM3LDExMywgNzgsMTQ4LCA1MSwgNDMsIDIxLAorICAgIDE1NiwgODUsIDQ1LCAxOCwgMzMsMTA1LCAxMCwgNzUsIDQ5LCA5NiwgMTYsMTIzLCAyNiwxNTIsMTk1LDExMywKKyAgICAgNTgsIDE2LCA2NiwxNjEsMTY3LCA3NSwgMzAsIDMzLDE0MCwxNzcsMTUzLCAxMCwxNTEsMTA5LDExNSwyMDMsCisgICAgMTgyLDEwOSwxMTMsMjM2LDIwNCwyNTMsIDU3LCA5MiwgMjEsMTg4LDEwMCwgODYsMjA3LDIzNSwxMzAsIDg2LAorICAgIDE5NywyNDQsICAxLCAyMiwgNTYsIDYyLCAxNCwgOTUsIDQ2LCAzOSwxODEsMTE4LDE3MywyMTYsMTY0LDE4MiwKKyAgICAxODMsIDcxLCA0MSwgMjEsIDg0LCAyOSwxMjMsIDE0LDE4MywgMTUsICAwLCAgMCwgMzQsIDUwLCA0MSwyMTMsCisgICAgMjM0LDIzOCwxODgsIDM5LDI0MCwxMDYsIDc1LDE0MCwgMjEsMjM4LDE0NCwgNDksMTY0LDE2NSwgIDAsICAwLAorICAgICAyNCwgNDMsIDM0LDE1MCwgNjIsMTk4LDE1MiwgMTYsIDUwLDE5MSwyMDMsMTM3LCA0OCwgNTUsIDYxLCAzNCwKKyAgICAgOTQsMTc4LCAxNywxMjcsIDg5LCAgMywgNzksIDg4LDE5OCwgOTksIDg3LDExNiwyMTQsIDg5LDIxNSwxMTcsCisgICAgMjE1LDExNywxNjcsIDgzLCA2NiwxNTYsMTkxLDE0OCwxNjUsMjM4LDIyMSwxODcsMjE1LDEzOCwgNzcsMTIwLAorICAgIDEyOSwgOTYsIDEyLDEwOCwgNTAsMTI3LDE4MCwyMzMsIDE3LDIxMCwxMDQsIDUyLCAzMiwxMzIsMTMzLCA4MywKKyAgICAgNzUsMjA2LDE1MCwgNzgsMjE0LDIwNCwxMjQsMTEzLDI0OSwxMzgsMTc3LDE2MiwxNjksMTcwLDEzNiwxMTcsCisgICAgMjE3LDExOCwgNTgsMjExLCA4OSwxMjIsIDc0LDEzNSwxODIsMjUzLCAxMiwgMjgsMTUxLCAyNCwgNjgsMTQyLAorICAgIDE3MywxNzMsIDQ1LCA3NCwyMzMsIDE5LDIzNSwgMzIsMTg4LDE1NSwgNzksMTA5LCA5MSwxNTYsMTg1LDE0NCwKKyAgICAxNDgsMTIxLCA0MCwgMzksMTE2LDE2OSwxMDQsMTcwLCAxMCwgMzMsMTA4LDE4MiwgOTAsMjExLCAxMSwyMzAsCisgICAgMTIwLDExNiwxMjIsIDEyLCAxMSwxODEsMTgyLDE4MywgIDcsICAwLDIxNiwyMTcsIDE3LDE0OSwxMzgsMjI2LAorICAgIDE2OSwgOTUsIDYyLCAzNCwgIDAsMTI4LCAzMSwgIDQsMTQyLDIyNywgMzIsMTMyLDE1MCwgNTksMTYxLDE4NywKKyAgICAgNDYsIDEwLDE5NywgMTUsMjIyLDE4OCwgOTcsMjI4LDIwOSwxNjMsMTc1LDIzMCwxMzEsMjU1LDIwMCwxNDMsCisgICAgMjMyLDI0OCwyNDMsIDMyLDIyNSwgODMsIDM5LDE5NSwgMzMsMTY1LDE0OCwgNjYsICA4LDIwMywyMjksMjQyLAorICAgICA4NSwgODUsMjQxLCA2OSwxNTcsMTgxLDE3NywgNDQsICAwLDI0OCwxOTUsIDMyLDIyNywyNDEsMTU1LDE4NiwKKyAgICAyMTksIDc0LDE2NSwgMzQsIDQwLDE4MiwgNDIsIDI0LDE1NSwxMzIsIDE2LDE5OSwxMTMsICA4LCAzMywyMzMsCisgICAgIDUyLCAxMCwgIDIsMTU5LCA0OSwxMDIsMTU0LDE2NiwxODQsIDgwLDE0MiwyMzEsMjA5LCA4NSwgODUsMTM5LAorICAgICAzMywgNTIsMTc0LCA4NCwyMzgsIDYxLDEyNiwxODgsMjU1LDIzMiwyMDksIDg3LDE4OCwgNDIsMTM4LDE0MywKKyAgICAyMDYsIDQ4LCAxMiwgNjUsMTUzLCA5NiwyNTQsIDI0LDE5MywgODQsIDg0LDEzMCwxMzIsMjM4LDE3OCwxMjEsCisgICAgIDkzLCA1NSwgMTIsIDM1LDE4OCwxMTksMTMyLDEyMCwyNTIsMTgwLDExMCwxODUsIDc5LCA1OSwgNDcsMTYxLAorICAgIDE0OCwxMzgsMTk3LDE4MCwyMDAsMjQ3LDEwMSwxNjAsIDUyLCA1OCwxMDUsMTcxLCA4MSwxODEsMjMyLCAyMywKKyAgICAxNjUsMTA1LDE1NCwxMDUsMTMyLDE5NCwyMzEsIDk4LCAyMSwgNjksMjE3LDIxOCwyMTgsIDE4LDI0NCwxMDQsCisgICAgMTk4LCA3MywxMzEsIDQyLDEyOSwxNjIsMTM2LCA4MiwgNzUsMTQyLDIwNywgNjIsMjUxLDE0MSwyMTksMTE3LAorICAgICA2MSwyNDIsIDEwLCAgMCwxNDQsIDc2LDE5NCwgODIsMTc3LDE4NCwyNDAsIDg5LDIzNCwgIDgsMTEzLDE5MSwKKyAgICAxMTQsIDc5LCA4NSwgODUsIDQ2LDE1OCwxMDMsMTU4LDE0NywgMTgsIDY2LCA0MCwgNjcsIDkwLCA0MiwgMjIsCisgICAgIDY5LDE2NCwgMjEsIDIyLDE4NiwyMjAsMjM5LCA2MiwyNTUsMjIwLDExMywgMjgsIDYyLDE1OSwxNjIsIDcxLAorICAgIDEzNSwgMjEsIDI4LDI1MCwxMzAsMTcwLDE2OSwgNDksMjI4LDIxNSwxNjYsMjM5LDE1NywxMDUsMTU0LDE1MSwKKyAgICAxMjEsMjAyLDI1NSwxNTcsMjUzLDI1MywxOTEsMTk3LDIyNywgNjYsMTc4LDE5OSwxODksIDUyLCAzOSwyMDUsCisgICAgMTczLDE4OCwgNTcsMjQ5LCA3OCwgODksICA5LCAgOSwgIDksIDczLCA0MCwgMTgsIDE4LCAxOCwxNDYsIDgwLAorICAgICAzNiwgMzYsIDM2LCA4NiwgMjQsMjM5LDE4MCwxNTcsIDY3LCA1NywgMTEsIDE4LCAxOCwgMTgsIDgyLDE2MSwKKyAgICAgNzIsIDcyLCA3MiwgOTIsIDQ3LDE3MiwyMDEsMjI4LDE4MiwgNTIsIDM5LDIwNSwgNzMsMTE1LCA4MiwxNjEsCisgICAgIDcyLCA3MiwgNzIsMjAwLDE0NCwgNzEsIDY2LCA2NiwgNjYsIDE4LDEzOCwxMzIsMTMyLDEzMiwgNjgsMTI0LAorICAgIDEzMiwgIDIsIDMzLDIxMiwgNTIsIDc3LCA3OCwyMzIsMjI5LDE5MywyMjMsIDQ1LCA0NiwxODYsIDQ5LDE2OCwKKyAgICAxMzIsMTk2LDE4MSwgMzksMTQ4LDIxOSwgNDMsIDc1LCA0MCwgMjcsIDI3LCAyNywgMTYsIDY2LCAgOCwyMjUsCisgICAgMTk4LDE5OCwxMzQsMTA0LCA5MSwxNDcsMjAxLCAgNCwgNjYsMTUyLDIwNywyMzEsIDk5LDIzOCwyMzUsMTU0LAorICAgIDIwNSwxMDIsIDExLDEzMywxMzAsMTA0LCA0MywxODUsIDkyLCA0NiwxNTEsMjAzLDE3MywgODIsMjAzLCA5MCwKKyAgICAgIDksIDI1LDI0MiwgOTIsIDEyLCAyNCwyMjcsIDg0LCA0MiwxOTcsIDI0LDIxMSwgNTIsIDQ1LDE1OCwxNDIsCisgICAgMTkxLDIyMSwxMTAsMTUxLCA4MiwgMjYsMTY3LDIyNiwyMTEsIDUyLCA3NywxODcsMTczLCA4MSwyNDEsMjIxLAorICAgIDEyNCwgNzAsMTYzLCAxNywgNjYsIDQwLCAgNiwgOTQsMTUwLDE0NCwxMzIsMTE0LCA3NywxNDUsMjA1LDEwMiwKKyAgICAgNDEsMTY1LDEzNywgNjgsICAyLDEyNywxMzIsMTA1LCA5MiwgMTMsMTgwLDE4NiwyMjEsMjM4LDEwMSwgOTAsCisgICAgMTQ1LCA5NCwgMjAsICA4LDE2MSwyMDksIDE1LDE2MywyMDMsMjQ0LDE2NSwgNjIsIDM5LDEyNCwyMjMsIDMxLAorICAgICAxMiwgIDYsMjMyLCAgMywgMjUsMjA4LCA2OSwxMzEsIDg0LCA0MiwgMjEsMTMxLDE3NCwgNjAsIDYzLDIxNCwKKyAgICAyMjgsIDQ1LCA1NywgNTEsMTQ4LCA3NSwxODksMTU5LDIzNCwyNDcsMjUxLDE4OCwgNzUsIDQ2LDE0MSwxODMsCisgICAgIDM1LDE1OSwxMzIsMTk2LDIzMywgNzIsIDM2LCAxOCwgNDksMTc2LDExNSwgMzQsMTQ1LCA4OCwyMTYsMTQ2LAorICAgIDEyNSwyMjIsIDI5LCAzNiwxNjEsMTU2LCAgMSwxOTgsMjE2LDI0MywxMTEsMTU5LDEzNSwxODcsMTcxLDE1NiwKKyAgICAgMTYsMTM3LDE4MywgODQsICA3LDEyNSwxODgsIDY0LCAgNywxMzMsMTc0LDExMywgODMsICA5LCAzNywxNDUsCisgICAgIDcyLDEwOCwxMDgsMTA4LDE2MCwgMTUsMjA4LDEwMCwgNTAsIDI1LDE4OCwgMzAsMTEyLCAxNSwyMDcsMTAyLAorICAgIDE3OSwxMzUsMTM1LDI0MiwxMzcsMTY0LDIwMywgNzgsMjM2LDEwNCwgNTIsMTM4LDE0MSwxNjMsMTg1LDE5NywKKyAgICAxMjAsIDE4LCA4MiwxNzEsMjM0LDIyNSwxODUsIDkyLDE0MiwgNzksIDM1LCAgMCwgMzIsMTQwLDEyMiwyMTgsCisgICAgMjM3LDE4MiwgIDgsMTE1LDE0OCwyMTAsMTIxLDIzOCwgODgsMTMzLDE0NCwgMzksMTQ5LCA3NCwgODEsIDc0LAorICAgICA2MSwyMDcsIDc1LCAzNiwgMTgsIDI0LCA5OSwyMDYsMTU0LDI1MywgODcsMTI1LDE4NSwxOTQsMTUwLCAgNiwKKyAgICAxOTgsIDI0LCA5OSwxNTYsIDcyLCAzNiwyNTAsMjUzLDE1MiwxNjYsMTEzLCA0OCwgMjQsMjA4LDEyNywyMDksCisgICAgIDU5LDExOSwyMzgsMjQ4LDE5MCwgMzEsIDY3LDIxNCwgMzgsMTAyLCA5NCwgMTQsIDY3LCAgMywyMjIsIDE3LAorICAgICA3NiwxNDQsMTYxLDIwMSwxMDAsMTk0LDE5NSwgMTMsIDMwLDE0NiwgOTUsMTU5LCA3MiwyNTIsMTM0LCAxNywKKyAgICAgMTAsMTY1LCA1MiwxNTYsMTg3LDE5MywgOTYsIDMyLDIzMywgMzIsIDE4LDE0MiwyMzAsMjQyLCA2OCwyMjAsCisgICAgMjM0LDE1OSwxMTksMTM0LDIwOSwxMDQsMTQ4LCA3MiwgMzYsIDg2LDE3NSwyMTQsMTAyLCA1OCwgNTIsMjQwLAorICAgIDI1NCwyMjUsMTM3LDE2MywgNzUsMTk4LCAyNCwyNTUsMTEyLDEzMiwgMTYsMjU0LCAgOCwxMzksMjMwLDEwMSwKKyAgICAxMzIsMjA4LDEwNiwxMzQsIDYwLCAxOCwxNDUsMTMxLDE1OSwgMzcsMTA5LDExMSwxMTEsMTA3LDE1NCwgMjIsCisgICAgMjA3LDE4NSwgODIsIDM4LDE0NywyMDEsMjIyLDIwMiwxOTAsMjQ4LDE1OSwgMjMsMTc3LCA4MSwgODgsMTU2LAorICAgICAyNywyMjIsIDU3LCA2NywxMzEsMTU1LDEzMywyMDksMTA0LDIxMiwyNTQsMjU0LCA5MiwxOTMsMTQ4LCAzNiwKKyAgICAgMjAsMTM3LCA1NSwgNTksMjIyLDE5NCwgNTIsMTkwLDE2MCwxMDksIDI4LCAyOCwxMDMsIDgyLCAzNiwgOTgsCisgICAgMTE1LDI0NSwgNzIsIDM0LDE3MiwyMDMsIDE4LDEzOCwgNzEsMTM2LDIzNSwgMzAsMjQxLCAxNCwgODgsICA4LAorICAgIDE2NSwgODUsIDg1LDE0MSwxNzYsMTE3LCAgMCwyMzksMTMyLDE2MCwgOTYsMTAxLDE2NiwgIDMsIDcyLDIxOSwKKyAgICAyMzMsIDEyLCA0MSwxNTcsMTIxLCA3NSwgNTksMjU1LDIyNywxMTYsMTY0LCA5MywxMDgsMjM1LDI0NSwxOTgsCisgICAgMjUyLCA2OSwgNjUsMTExLDEzNSwyMzEsMTMxLCAxMCwxMjcsIDg0LDE3NiwxNjIsMTY5LDE1NCwxNjAsMTUwLAorICAgICAyOSwgNTEsMTgyLDEwMiwgMTYsMTIxLCA3OSwgMTgsIDYyLDE0MSwyNDMsIDMxLDE4NywyNDAsIDYyLCA3MCwKKyAgICAgNTMsMTg2LDE0NywyMDQsIDY5LCA2MiwxODYsMjA4LCAxNywxMzYsMjQ3LCA5OSwgMzksMTc5LDE4MCwyMjQsCisgICAgMTEwLDIwMiwyMzEsMjQ3LDE4NywyNDMsMTg3LDI1MCwyNDksMTM1LDE2NiwxNjksMjM0LDIxMCwxODMsMTA4LAorICAgIDIzNywyMjgsIDQ1LDEwNywyNTIsMTk2LDE3OCwgOTIsMjE1LDIyOSwgMTcsIDIwLDEzMiwyMDgsMTEzLCA2MCwKKyAgICAxOTksMTEzLCA5MCwxNzMsMjE0LDE5NSwgIDcsIDE1LCAzNCwgODksIDM0LCAxNiwxOTQsMTIyLDE2MywxMjksCisgICAgIDQ5LDE1OCwgMzMsIDIwLDIxOSwxODIsMjQ5LDI0NiwgNTMsMTg5LCA1NiwyNTIsMTkyLDE3NSwgNTUsIDI2LAorICAgIDIwOSwgNTQsMTU3LDE3MiwgNTUsIDIyLCAxNiwxMzgsMTcwLDE2OSwgMzQsICA4LDE5NywxMTMsIDU4LDEzMiwKKyAgICAyMDQsICA2LDE4NiwgMzQsIDkwLCAxNCwxNTcsMTAwLCA3NSwgMjgsMTYxLDIwOCwyMjUsICAyLDE3NCwxNjcsCisgICAgMTE2LDEwNCwgODksIDIyLCA2NiwgNDAsMTE0LDExNSwxMjQsMTE2LDI0MywgMzEsMTIzLDIxMCwyNDUsMTY4LAorICAgIDIyNCwgIDcsICAxLCAzMywxMzIsIDQ5LDE2NiwxNzAsMTU0LCAzMywgNDQsMjUxLCAxOSwxMzEsMjIzLDIwNSwKKyAgICAxMjgsMjQ3LDE2OCwxMzgsMTA2LDEwMSwxNTgsIDcyLCA0MCwxMjQsIDg0LDE4NiwxNzQsMjM5LDE0OCwyMDMsCisgICAgMTI0LCAyNCwxNDAsMTQxLDEyMSwyMjMsMjQ5LDE5OSwyNTEsMjUxLDIxMywyMjEsMjIxLDIwMywyMzksMTc0LAorICAgIDE4OCwxMzMsMTY1LDIzOSwyNTEsMjExLDEwOSwgMTYsMTIxLCA0MywgODksICAwLDEyOCwgNzEsIDk0LDE0OSwKKyAgICAxNjYsMTM1LCA3NywgOTQsICAxLCAgMCwyMTIsMTU5LDE4MiwxNTIsMTg5LCA2MCwgODQsIDg1LDI1MSwxMTcsCisgICAgMjQ1LCA4NywxNzcsICA5LDIxMiwgNjMsMjU0LDIyNSwyNDcsMTI0LCAzOCwgNjEsMjI2LCA4OSwyMTQsIDY1LAorICAgIDE4OSwyMDksMTUyLCAyMywxMDQsMTUxLDE5OSwyNDQsMTM2LDE5MCwxNzQsMTI1LCA2NywxMzYsMTk5LDIzNywKKyAgICAxNTgsIDMwLDI0MiwgMzIsMTMyLCAxNiwgNjYsIDc1LDEwOCwxMTksMTg4LCAxMywxMjMsMTcxLDIxMywxNTQsCisgICAgIDM4LCAyMCwxOTksMTEzLCAgMCwgIDAsMTk3LDE4NSwgOTQsIDc1LDE2OSwgODQsIDQyLDE0OSwgNzQsMTc3LAorICAgIDEyNywyMjMsMTc2LDEyMCwxMzUsMjQ3LDEyMywyMjgsMTQ3LCA0MSwxMTYsMTkzLDE5NiwyMjQsMTE5LCAxMSwKKyAgICAxOTMsIDI3LDEwOCwgOTUsMTI2LDEwMSwxOTAsMTIzLDE3OCwyMjYsMTE0LCA0OSwxOTgsMTkxLDEyNCwyNDgsCisgICAgIDM1LCA0MSwgNjYsMTUyLCA0NCwxNDksMTM4LDE2NSwgOTgsMjA5LDI0NywyNTMsMTAyLDE3OSwgMjUsMjAxLAorICAgICA0OCwyNDQsMjQ1LDExNywgIDAsMTI4LCA1NSwxODEsMTU3LDExNCwyNDUsIDg1LCA0MiwgMjIsICA5LDI0MSwKKyAgICAxNjYsMTU1LDEwNSwxMTQsMjQ5LDE2NywxNjksMTcxLDI0MCwyNTIsIDMzLDEzMiwyMDEsMTg4LDE3NCwgODcsCisgICAgIDQyLDI0NywxOTIsMTEzLCA2MywyMDUsIDQzLCA3MSwxNzUsMjE1LCAyNywxNDEsIDcwLCAxMSwgNTEsMjQ5LAorICAgIDEwMywgIDIsMTYxLDE4MCwgOTcsIDI0LDE5MCwyMzksMTIzLDE5OSwyMzcsMTQxLCAyNSwgMjcsIDU1LCA5MSwKKyAgICAgNDUsMTgwLCA0MCwgNDYsMjAwLDIyOSwxMTQsIDE2LDE5NCwxMjAsMjM0LDEzNCwgMTAsMTMzLDE5NCwxNjcsCisgICAgMTkxLDI0OCwxMTYsMjUwLDIzNSwgOTAsIDg1LDE2OSwgOTUsMTYxLDIyMywxNTcsMTkwLCA1MCwyMDMsMjI5LAorICAgIDI0MiwyMTAsIDQzLDExNSwyMzcsIDM2LCA4NSwgIDksICAwLDIxNiwyMTgsIDkwLDIwOCwgODksMjIyLCA1MiwKKyAgICAyMDUsMTIyLDE2MywyMjUsMTE2LCA1OCwxNDUsMTA0LCA3NSwgODUsIDgzLCA2NSwgIDMsIDE2LDI0MiwgNDIsCisgICAgMjI4LCA2NiwxNDMsMTg4LDE5NCwgMjQsMjQzLCA3MCwyMDUsIDMwLDI0MSwxOTQsMjM1LDEzMiwxMjAsIDI0LAorICAgIDIyNywyMTMsMjMyLCAxOSwgMjYsIDcwLDEyNCwyMjQsMTg0LDIzNywyNDYsMTQ5LCA5OSwgNTAsMTUzLCA5MiwKKyAgICAxOTgsMjAxLDE4NSwgNzIsMTY5LDIxNSwxOTEsMjExLDE3MCwgNDIsICAwLDE2MCwyMzcsIDU2LDE0MCwgNDksCisgICAgMTkwLCA0NiwxMDMsIDUxLCAyOSwyMzcsMTE4LDEwOCwxMzEsMTM4LDIxMSwgODYsIDg0LDIwOSwgOTIsIDYwLAorICAgIDEyNiwxMTksMjMwLCAxNCwxNzcsMjQ0LDIwMiwgOTIsMTcyLCA4MCwxMzAsIDMyLCAgMCwgIDAsIDQ0LCAyMCwKKyAgICAgNjAsIDYwLCA3OCwxNjEsMTQ4LDIwNiwyMTYsIDkxLCA0NiwyMTksMjA0LDIxOSwgNDQsMjQyLDEzNiwxNDUsCisgICAgMTQzLDEyOSwgMTYsIDc5LCA4NSwgODUsMTc0LCA2OCwxMjAsMTUyLDE5NSwxNTMsIDI3LCAgMCwxNjAsMTM4LAorICAgIDIzOSwyMDEsIDI0LCAzOSwxMjAsMTAwLCAyMywgOTEsMjQzLCA4MywyMDksIDc1LDIwOCwgNDgsIDEyLCA2NiwKKyAgICAgNjAsMjIyLCA4MSwxODgsMTE3LDEzMCwgNjAsMTQ1LCA1NiwgMjksIDc1LDI0OCwxNTcsIDgwLDE4MSwgMTgsCisgICAgIDI1LDE2MSwyNDAsMTQ2LDI0NiwxNDcsIDYyLCA0OSwxNTMsMTMyLCAgMCwgIDAsIDYzLDI0MCwxMDMsMTgyLAorICAgIDE4NCwyMjksMTc4LDIwNSwxNzAsMTcwLCA4MSwgNzQsMTIxLDE0MywgOTcsIDMwLDI1MSwxNjgsMjM0LCA0NSwKKyAgICAgIDgsMTQ3LDE3MCwxNzAsMTMzLCA2OCwxOTUsMjI3LDE2MCwyMDAsIDE5LCA0MCwgIDAsMTI4LDIyNSwxNDQsCisgICAgMjE0LDIzNSwxNDEsMjMzLDE3NSwxMjAsMjM4LCAyMiwxNjUsMTk1LCA3MCwyMjcsIDU5LCAgMCwxMjgsMTc3LAorICAgICA0MiwgOTQsMTk5LDIxOSwyNDEsIDU0LDE1NSwxNzMsMTgyLDIxMSwxNjEsMTQ4LCAyMiwxMzksIDY5LCA3MywKKyAgICAgMTYsIDIzLDE5NywgMTgsMTI2LCAzOSwgIDIsMjA1LDEwMiwgMTEsICAwLDE2MCwgNDcsMTQ5LDIxOCwxODcsCisgICAgMjUwLCA1OCwgMjAsIDkzLCA5NSwgMzksMTk2LDI0MywgIDgsIDQxLDE2MCwgNzcsIDQ2LCA3MywxODQsIDYwLAorICAgIDIwOSwyNDUsMTE3LDIxOSwxODIsIDQxLCAyOSwgMzQsMTQ4LDIzMCwyNTEsMTU4LDEzNiwgIDQsIDEwLDE2NSwKKyAgICAxMTYsIDM4LDE5NywgNDUsIDg0LCA4MiwxMjYsIDkzLDI1MSwgIDYsICAwLCA0OCwgMzAsIDUxLDIyMywyNDcsCisgICAgIDMzLDEzMiwxNDksIDc0LCA2OSwgOTEsIDIxLDIxNywxOTcsIDY5LDEzOCwyMjcsIDU2LDEzMiwgMTYsIDQxLAorICAgICA3OSwxMTAsIDI4LCAyOCwxNjcsIDY3LCA2MCwxOTQsMTk4LCA5OSwyMTUsMTE3LCA0MSwxNjUsIDI0LDIyNywKKyAgICAyMjksMjM4LDIyNCwyMTMsIDE5LDEzOCwxNjYsMTY5LCAgMCwgIDAsIDY2LCA3MiwxOTMsMjE2LCAzNiwxMzIsCisgICAgMTMyLDEzNywgMTgsMTI2LDI1MywxNTIsMTA0LDEzNiwxNjAsICA0LCA3NCwyMDQsMTY3LCA2MCwgMzMsMTM5LAorICAgICAgMSwgIDAsMTcwLDIxMywgOTMsMTcyLCA0MCwxNzEsMTgwLCA0MCwxMjEsIDM4LDEzMywgODIsIDkwLDE2OSwKKyAgICAgODQsMTY0LDEzOSwyMjIsIDUyLCA2NiwxMTMsMjQ4LCA1NSwgMjQsMjI3LDExNCwxODUsMTg4LDEwOSwxMTAsCisgICAgIDQ1LDI0NywgNTcsMTM5LCAgOSwxMDEsMjU0LCA1MiwxMTksIDI2LDIyNywgNDksICAzLCAgMCwgOTYsICA1LAorICAgICA3MSwgNTAsIDE4LDE3MiwgNDAsIDE2LDE5NCwgMzIsICA4LCAyNCwgMjcsMjUxLDE5MCwgOTUsIDU4LDE1MCwKKyAgICAyMDIsMjUyLDE4NiwyMzUsMTg2LDE1NCwxNzAsIDUwLDE5OCwgODYsIDM1LDEyOSwxOTQsMjAxLDIwMywgMzUsCisgICAgMTY0LCA4NiwyMTksMTIzLDI1MCwyNDQsIDg5LDI1MiwgOTIsIDM4LCA5MCwxNjQsMTY4LDE3MCwgNzAsMTM2LAorICAgICAzOSwyMjksMjAxLDE0NiwxOTAsIDE2LDE2MywyMjMsMjA1LDEyOCwgMzEsIDI3LCA5NSwyNTQsMTE1LCAyMiwKKyAgICAyMzEsIDgwLCAyMCwgNjksICAxLCAgMCwxMTYsMjIxLCAgNSwyMDUsMTI5LDE4NCwyMTksIDM1LDEzMiwgMzQsCisgICAgMjEyLCAxMSwxNzAsMTcwLDI1MCwxOTAsMjA3LDEzMSwgNjcsIDg1LCA4MywxNjcsMTYyLCAzMywxNTcsIDE2LAorICAgIDI0MiwyMzAsMTg2LDEyOCwgIDQsMjAyLDE0OSwxMzcsIDUwLCA4NSwyMTMsMTE3LDE1NywgMTYsMTExLDIyNSwKKyAgICAgMTIsIDc1LDE1NiwgIDcsMjQzLDE4NSwyMDEsMjI1LDI0MCwxOTgsMTkxLDI1MSwgNDIsMTAyLDE5MSwgMTksCisgICAgMTI5LDE5NywxMzIsMTk0LCA1MSwxMzMsMTczLCA4NiwxMDcsMjU0LCA4NywgNjAsMjI3LCA5NiwxMDgsIDcwLAorICAgIDE4NSwgIDUsMjQxLDI0NCwgNzksMTg5LDI1NCwgMjksIDU2LCA2MiwyNDcsICA5LDEzNywxMzQsIDQ5LDE5OCwKKyAgICAyMDcsMjEwLCA4NiwxNjMsICAyLCAzNywxOTYsIDc4LDE4NSwgMTIsIDMzLDE4MCwyMzcsMTAzLDIxNSwyMjgsCisgICAgMjE2LDI0OCwgIDYsIDY1LDIxNSwyMTUsMjMxLDE4OSwxNDIsMjEwLCAzMywxNjUsIDg0LDE0MywxODYsIDY4LAorICAgICA0OCwxMDIsMTk2LDIzNiwxMTksMjQxLCAxNywgMTAsMjIzLCA2NiwxMjUsMjIzLDI1NSwyMzUsMjI3LDEyNSwKKyAgICAxMjYsMjU0LDE5NCwgNTcsMTc4LCA5NCwxMTEsIDUyLDE1NSwgNzcsMTQwLDExMywxODAsIDM3LDI0MCwxNTYsCisgICAgIDY4LDEzNCwgNjcsMTcwLDI1NCwxNDgsIDUzLDI0OCwyNDksIDg5LCAxNiwgIDQsIDQzLCA4NiwxMjksMTk0LAorICAgIDE2MywgIDMsMTE1LDEwNywxMDcsIDYyLCAzNywgNDQsMTEzLCAzOCwyNDIsMTg2LCAxNCwgMzMsMTgwLDEwOSwKKyAgICAgNTksMTcyLDE2MywxNjMsMTE2LDI0OCwxMjAsMTI3LCAzMSwyMjAsMjUyLCAzNSwxNzksMTUyLDI1MywgNzgsCisgICAgICA0LCA3OCwgNzYsMjAyLDIyMiwxNzUsIDg0LDEyMCwgMjEsMTc2LDIzNSwxODYsMjUyLDE1MywgIDIsMTI2LAorICAgIDE2NiwxMzMsIDQ5LDE0MiwxODgsMjU0LCAyMywxNjEsIDUyLCA0NywyNTAsMTU4LCA0MSwyMzMsICA5LDEwNywKKyAgICAyNDMsMTk3LDIwNSwgMzUsIDMzLDIyMiwxMjcsMjU0LDIxNSwxMjcsMTM5LCAgOCwgMzgsMjA3LCA2OCwxNjksCisgICAgIDg0LDExNiwgNTgsMTU3LDEwMiwxNzksMTA1LCAyNCwxNTUsIDQzLDE1MCwxNTcsIDIxLDIwNSwxOTcsMjI5LAorICAgIDExNCwyMTcsMTc4LDE3MiwgOTAsMTA5LDExMSwxMjIsMTAxLDE1NCwxNjYsMTUzLCAyMywxNjYsIDgwLCA2MCwKKyAgICAgNjYsMTU0LDIwNSwgODYsIDE2LDI0OCwgIDAsMTI4LDE3NSwxMDcsMjIzLCAyNCwxOTgsMTY2LDE2MCwgNjAsCisgICAgIDgxLDE1NiwxMjYsIDIzLCA0MywxNjEsIDY0LDE1MiwyNTIsMjI5LDE5NSwgIDcsMjExLCA3OSwgNjEsMjQyLAorICAgICA4MSwxMjUsMjQ2LDE1NSwyNTUsIDE2LDI0MSwxMjcsIDIwLDEzOSwxOTcsIDMzLDE2NSwyNDMsIDExLDE2MiwKKyAgICAgODgsMjUyLCAzNiwyNDAsICAzLCA2MSwgNDcsMTAwLDE2MSwxNDgsIDIyLDIxMywgNzQsMTYwLDE4MCwxNDQsCisgICAgMjMxLDE5MCwgMTIsIDk5LCA4MywxNTUsIDc1LCAgMywgODUsIDQyLDI0NywxMzYsIDcxLCA0MCwxNjUsMjI2LAorICAgICAgOCwxMDEsMTYxLCA5MywxNjEsMTYyLCA2MSwgIDYsMTE1LCAgNSwgOTksIDgzLCA4MywyMTMsMTAyLDE3MSwKKyAgICAxOTcsIDg3LDE2NiwgOTcsIDI0LDEzNCwxNzcsIDQxLDEyMiwgMjcsMTkyLDEzOCwgMTgsICAzLDIzOSwyMDcsCisgICAgMjUxLDE1NywgOTcsIDI0LDIwOSwgNjIsMjI5LCA2MywgIDMsIDg1LCA4MywgNzUsMTYwLCAyNCwyMTMsMTc4LAorICAgICA5NSwgNTksIDgzLDEzMSwxMzMsMjQ3LDEzNywgNjMsIDI1LDIxMywxMTgsIDU4LCAzNCwxOTgsMTE4LDIxMCwKKyAgICAxMDMsMjMwLDExNywgOTMsMjIwLDE4MiwgMTksIDY3LCAyMSwyNDMsMjMzLCAgMywxNTYsMTU4LDIyMiwgNTYsCisgICAgMjM3LDE3NCwxMjgsIDU3LDEzMiwyMTAsIDU5LDIyOSwxODcsMTEzLCAgNiwgMzUsMTEzLCA4NiwgMTIsMTk3LAorICAgIDEwNSwgNDYsIDkwLCA5MSwgMjMsMjMyLDIwMywxNzksMTc5LDExNSwgMjMsIDY2LDEwNCwgODksIDg2LDI1MSwKKyAgICAxMjIsIDYwLDIwNywgMzgsIDMzLCAzMywxMTMsMjIxLDExMiwgIDEsIDY2LDE5MywxMzgsIDgyLDE3MywyMzgsCisgICAgIDY2LCAgOCwgOTEsMTczLDE1MCwgNjAsMTU1LDE0NCwxNDQsMTQ0LDE4NCwxMTIsMjAwLDE3OSwxNTIsIDgzLAorICAgIDE0NiwxMTIsMTk3LDIwNiwgOTIsIDM2LCAzNiwgMzYsIDM0LDE5MywgNTksMTA5LCA3MSwxMTgsMTgwLDE0NSwKKyAgICAxNDQsMTQ0LDEzNiwgNjEsMjI4LDE0NSwxNDQsMTQ0LDE0NCwgNTYsIDM1LDIyOCwyMzMsIDI5LDE5NywgODQsCisgICAgMjUzLDE1NywgOTEsMjE1LCAgMSwgIDAsMjEwLDE1NiwgNTIsIDM5LDIwNSwxNzMsMTc2LCA1NywxNjksIDgwLAorICAgICAzNiwgMzYsIDM2LCAzNiwxNjEsIDcyLCA3MiwgNzIsIDcyLCA2NiwxNDUsMTQ0LDE0NCwxNDQsMTMyLCAzNCwKKyAgICAgMzMsIDMzLCAzMywxMTMsIDU0LDExMCwgOTQsIDQzLCA4MiwgIDgsIDk3LCA2MiwxNTksMjM5LDExOCwxODcsCisgICAgIDQ5LDI0NywxNzgsMjEyLCA1MiwxMDksIDUyLCAyNiwxOTcsMjExLDE2MSwgNjEsMTUxLDIwMywyNDEsMTI2LAorICAgIDE1NywxODgsMTg3LDEzMywgODAsIDkxLCAyNCwgOTksMTQwLCA0OSwgIDAsMTkyLDI0NywxMjUsMjU0LCAyOCwKKyAgICAxNTQsMTMyLDE5NiwgOTEsMTY0LCA4MCwgMjQsIDk5LCAxNiwxOTQsMTA4LCA1NCwgMjcsMTY3LDIwOSwgNjgsCisgICAgIDM0LDE2MSwyMjEsMjE0LCAzOCwxNDcsIDczLCA2MCwyMzAsIDgyLDE2OSwgMjAsMTMyLDE0NCwgODIsIDI2LAorICAgIDEzMSwgNjksMTk4LCAyNCwxNjUsIDIwLDEyNSwxMjgsMTIwLCA5MSwgMTUsICA5LDEzNywxODMsIDc1LDE2MSwKKyAgICAgIDAsICAwLDI1MCwyNTMsMTkwLDExOCwgOTEsMjM1LDI0NSwxMjIsMTc3LCA4OSwyMDQsMTAwLCA1MCwyMjQsCisgICAgMjQ4LCA5MywxNzYsMTc3LDI0MSwxNjYsMjMxLDEyMSwgNDksIDI0LDE2MiwxNDgsIDgyLCA3NCwxODEsMjE5LAorICAgICA4NywyNDAsMjU0LCA0MiwxMzIsMTQ0LDE2NiwxMDUsMTMwLDE4NiwyMzEsIDMyLDEzMiwgNDgsMTk4LDE1OCwKKyAgICAyMzEsMTk3LDIyMywxNDksMTI1LDE4NSwgIDYsMTQwLCA4NywxMDQsIDQ2LDEwOCwxMzQsIDYxLDIyMSwgNDUsCisgICAgMTEyLDE4NiwgNjcsMTE4LDE2OSwgODQsMjI4LDExMSwxNTksIDU3LDI0MywgNDksMTk0LCAyNywxNTMsIDY3LAorICAgIDI0MSwxMjUsIDYzLDE0NSwgNzIsMTEyLCAzOSwxNDMsMTQxLCA4MCwgNzAsIDYzLDE0MCwxMjgsIDY4LDExNiwKKyAgICAgNjIsIDgwLCA0MCwgMjAsIDU0LCA1NCwgNTUsMTk2LCA1NywgMzAsIDE1LCAyMSwxODMsMTI3LDE5MCwxNTcsCisgICAgMjA3LDIzMSwyMjcsIDIwLCA5NSwyMTcsMTA4LDE4MiwyNDAsMTEzLCAzMywgNTQsICA1LCAyOSwxMzcsIDU3LAorICAgIDE5OSwyMzMsIDM2LCAzMywgODQsMTc2LDIyNiwgNTYsMTU3LCAzOSwyMTQsMTkzLDI0NCwgNjksIDg1LCA4MywKKyAgICAyNDksIDkxLCA4OSwxMzcsMjQ3LDE0NywxNTgsMjM0LCA0MywxNjUsIDgwLCAzOCwxNDcsMTM3LDI1NSwgNzksCisgICAgIDMxLCA5OSwgMjgsIDc5LCA3MCwgIDMsICAwLCAxNiwgNzksMjM1LDIwNCwxODMsMTMyLCA3NCwgNTIsIDc3LAorICAgIDEzMSwgMTYsMTIyLDE1OCwgNTUsIDU2LCAyOCwxMzYsMTM5LDIzMywgMzgsMTQ3LCA3MywxODMsMjE5LDI0NSwKKyAgICAgNjAsIDE1LCA5OSwxMjQsMTAzLDIzNSwyMDYsMjI0LDI0NSwgMzIsIDMwLDE4MSwxOTQsIDc3LDE5NiwgMzgsCisgICAgMTM5LDE2MiwgNTAsMTM1LDE3NywxNjIsMTY5LDEwNiwgOTQsMjE1LDE5MSwxNzQsMTI1LDIyNywgIDcsICAxLAorICAgIDEyNywyNDMsIDExLDE5MSwxODQsMjUwLCAzMywgMTUsICAwLCA5NiwgNDgsIDI0LDEwOCwxMDgsMTEwLCA2NCwKKyAgICAgIDgsMjI3LCAyMywxODAsIDE4LDIwMywxMjksMTAzLDIxMSwgNTcsMTQ5LDE5NiwxNTAsMjUzLDIyOSwxNDUsCisgICAgIDk5LDE5MSwyMjMsMjA3LDEwMiwxNzksMTU2LCA4NiwxODYsMjIxLDE3NCwyMzIsMTQ5LDI0OSwyNTIsMjE5LAorICAgIDIzMSwxMTMsIDU4LCA2NiwxODAsMjMwLCA1MiwyNDUsMTUwLDIxOSwxMTcsIDU3LDE2MSwyNDAsMTAyLCA2MSwKKyAgICAyMzMsMTM5LDExNiwgODksMTIyLDI0NywyMzAsIDE4LCAxMCwyNTEsIDU1LDIyNywxOTksIDE5LCAxOCwgNTUsCisgICAgIDExLDEzNywgNjgsIDM0LDE0NSwgNzIsMTcyLDE4MiwxOTcsMjEzLDEyOCwxNjIsIDQwLDE3MCwxNjYsIDk4LAorICAgIDEyNCwxMjksMjQ3LDIxMiwxNzMsMjIxLDIyMCwyMDksMjUwLDE5MCwyMDcsMTc5LDExMCwyNDIsMTk4LDIyMywKKyAgICAgIDgsIDQ4LDE5OCwyMTgsMjM3LCA1NCwgNjYsIDQwLDE1NSwyMDUsMTA2LDE4MywxODEsMTIwLCA5OCwgMTYsCisgICAgMTEwLCAxNCwxMjUsMTI4LCAgNiwxNzUsICA3LCA0NywgOTEsIDQ3LDE2NSwxNTgsIDYxLDIxOSwxNzMsMTMwLAorICAgICAzMiwxMjQsMjE1LDI0NywgOTEsIDIwLDI0MiwxMTIsIDY2LDIwOSwxMTAsMTA3LCA0OSwxMDMsMjEyLCAzNywKKyAgICAgNDYsICA5LDEyNiwxNjgsICA0LCAzMywyMTIsIDUyLDEwOSwyNTEsMjMxLDIxOSwxMzEsMjE1LCAgMywgNjUsCisgICAgMjQ5LCA0MSwgIDgsMjI1LDE5OCwxOTgsICA2LDEyNCwgMTUsMjQ2LCA5NSwyNDUsMTg3LDIyMSwxMTAsMTA4LAorICAgICA3MSwyNTQsIDU1LDE1MywyNDEsMTk5LDEwOSwxOTksIDI1LCAxNCwxMzUsMTUxLDEyMSwyMzMsMjM0LDIxOCwKKyAgICAgNzcsIDMwLCA2MywgMjcsMTg4LCAzMCwyNDAsMTUwLDI0NCwxMTQsIDUzLDIyMCwxODQsMTIzLDIxNSwyMzcsCisgICAgMTE4LDEyMywxODksMTU4LDE4NCwyMTEsMTQ0LCA2OCwgMzQsMjA5LDIzOSwyNDcsMjI3LCA0NywyMTMsMTMxLAorICAgICAxNiwgNjYsICA4LCA3MSwxNjMsIDgxLCA2MCwgMjAsMTUwLCA3MiwgMzYsMTc4LDIxNywxMDgsMTkxLDIyMywKKyAgICAxOTEsMTQwLCA1NywxNDAsMTQ5LDIyNywxNzQsIDg4LDE4MywxNzAsMTg3LDE4NywyMTEsIDIzLDIzNSwyMjQsCisgICAgIDU5LCAgMCwxOTIsMTc1LDE3MSwxOTEsIDc0LCAzNSwyMjgsIDU2LCAyOSwxNzUsMjQ2LCAxMywgIDAsIDk2LAorICAgIDEwMywyMzEsMjM4LCA3MywyMzksMjM1LCA2MiwgMjMsMTYxLDExNiwgOTMsIDU1LDI0MCwgIDMsMjExLCA1MiwKKyAgICAgNjksMTkxLDE2OCwxNDEsMTE1LDE2NCwyMzUsIDMwLCAgMSwgIDAsIDMyLCA3NiwxNzAsMTcwLDE1NCwyMTUsCisgICAgMTE3LDEzMiwyMTAsMTY3LDEwMCwgODIsMjQyLCA2MywyMDMsMjQ3LDEyMiwxODksMTM5LDIwNiwxNjYsIDcxLAorICAgIDEyNiwxMTQsICA2LDE1MCwxMzIsIDgwLDIxMSwgODQsMjA5LDIzOSwgNTIsMTU5LCA2MiwyMTYsIDE1LDE2MSwKKyAgICAxMDYsICAyLCA5NSwgNzEsMjM2LCAgNywxMjksMjE5LDExNywgNjEsMjQyLCA0MiwgOTIsIDM0LDE3MCwxMjIsCisgICAgIDQzLDI0MiwxNTEsMTI2LDI0MywxMTMsMjA1LDE5MSwyNDEsMjUxLDE2NCwyMzUsIDMzLCAzOCwxNDcsMjAxLAorICAgICAzNywgMzUsMjE0LCA4MywgNzYsMTQwLCA3MCwxNjMsMTY4LDEzOCwxNDAsMjQ5LDEwNiwgNDksIDEyLCA5OSwKKyAgICAxMjIsIDQxLCA1MCwgNTQsMTEwLCA1NCwxNTUsIDczLCAgOCwxMDMsMjE4LCAgMCwgOTksMTQwLDE4MSwyMTksCisgICAgMjE4LDExOSwxNDEsMjM5LCAgNCwxNDEsMTA3LCAgNiwgNjAsMTI2LCAgNCwgIDAsIDkyLDEwMiwgMzgsIDIzLAorICAgIDE5MCwyMzgsMTIzLDIzMCwgOTgsMjI1LDEyNCwxNTcsIDY3LDIwNiwgNjksIDQwLDE1MCwxMTcsMTkyLCAyNCwKKyAgICAxNTUsMTU5LDE4NywyMDAsMjE3LDE2NCwxODIsMTgzLDIzMSwyNTEsIDYyLDEzMiwgODAsIDgxLCA0OCwxMTEsCisgICAgIDc3LCA1MCwgMjgsIDE0LCA3OSwxMjEsMTg1LCA1NywyNTUsMjI3LCA2OCwgMzQsMTEzLCA4MSwgNjYsIDMzLAorICAgICAzMCwxNTMsMjM5LDE3NiwxMzMsIDE2LDEyMiwyNDgsMjQwLDEyOSwgNTYsIDkwLDExMywxNTYsIDE0LCAzMywKKyAgICAxNzksMTE5LDE4OSwgIDQsMTM4LCAzNCwgIDgsMTMzLDE3NywyNDEsIDk1LCAzMSwyMzksMTE1LDExNSwgIDgsCisgICAgMTYxLDExNiwgMjYsIDE3LDIyNiwgMTcsMjI2LCA1MywxNTUsMjA1LCA3NCwxNjUsIDE4LDIzNywxODcsMjMzLAorICAgIDI0OSwxODQsMjMwLCA4NywyNTUsIDczLDIxNSwgOTksIDQ4LCAyOSwgNDUsMjQ4LDEwNiwgODEsIDUzLDExNywKKyAgICAxNTQsIDgwLDI0OCwgOTAsMjUzLDIzNiwxNzksMjIzLDIwNCwxNzUsMTYyLDE5MywyMzUsMjAzLCAzMCwxMzUsCisgICAgMTU5LDEyNywgOTIsMTMxLDE5MywgIDAsIDMzLCAyMCwgNzMsMjUzLCAgNCwgOTksIDk5LDIyMiwyNDYsMjQ3LAorICAgIDEwOCwgNjksMTYzLDE1NiwyMTYsMTIwLDIzOSwxMDgsIDY2LDIzMywxODYsIDQ2LCA5OSwgMTIsIDMzLDIxMiwKKyAgICAyMzMsMTE2LDEzMiwgMTgsIDc0LDE3OSwyMTcsMjQ0LDEyNSwyMjMsIDQ4LDE0MCwyNTEsMTQ5LDEyMywyMjUsCisgICAgMjA2LDExMiwxMDIsMTg3LDE0NCwyMDMsIDE2LDExNSwyMTYsMjExLDEzOSwyMzksMjI4LDIwNSwgODYsMjM1LAorICAgIDIwOSwxNjMsMTc1LCA2OCwgNTUsMjUwLDI1MCwyMjcsIDMxLDEyNiwxMjcsIDc4LCA0MSwxMzksIDE2LCA5MCwKKyAgICAgNzgsIDU3LDEzNSwyMTIsMTcyLDIzNSwyNTAsIDc4LDE4NSwgMjgsMTg2LCAgMSwxNjUsMTk1LDE3NCwyMzUsCisgICAgMjA2LDE3NiwgIDksMTUxLDIzMiwgNTAsIDEwLDE4NywgMTYsMTU4LCA4OCwgIDcsMTkwLDIzOSwgODcsIDQyLAorICAgIDE0OSwyNDksMjM3LCAgNywxMjUsMTI4LDIxOCwyMjMsMTgzLCA5OSwyNTEsIDc5LCA3MCwxNjMsIDgxLCAzNiwKKyAgICAxNjUsMTk4LDIyNSwxNTQsMTg1LDE0NCwyMjcsIDQ0LCA2NywgNDAsMTQyLDIxMSwxMjksIDE2LDExMCwxMDksCisgICAgMTA5LDIxNywxODIsIDI5LCA4NiwxODgsMTM2LCAgMCwgODcsMjMwLCA1OSwyMjksMTE0LDEyMCwgMzcsMTgyLAorICAgIDIxNCwgMzYsMTg4LDEzNSwxNDcsMTcwLDE2OSwxODEsMjE4LDE1OCwxMDEsIDI5LDI1MiwyMzgsMjQzLDIyMywKKyAgICAgOTQsMjQ5LDE0NiwgNzcsMTg5LDE1OSwgNDIsMTI0LCA5MiwxMDQsMTI3LDIyMywgOTQsIDM0LCA2NywyNDQsCisgICAgMjEyLDE4MiwxMDMsMTY4LDI0OSwxMjAsMjQzLCA3NiwyMDcsMTExLCAgOSwgOTIsMTYyLCA3NSwxNDIsIDU2LAorICAgICA2MywgOTQsIDUyLCA5MSwxNDIsMjI3LDE0OCwxMzgsMTk3LDEyMSwxNjEsICA3LCAzMywyMzYsIDI5LDI0NSwKKyAgICAxMTAsIDkyLCA4MiwxNDMsMTc5LCAgOSwxNjUsMjQ0LDE3OSwyMDcsMTI2LCAxOSwgNTgsIDU2LDE2NSwgNjcsCisgICAgMTkwLCAyMSwxMzMsMjIzLDI0MCwgNjEsMTkwLCA4NiwyMTksIDU5LDIyOSwxNjMsMjIyLCA2MSwyMTEsMTQ2LAorICAgIDIzNSwxODYsMjUwLDExMywxODMsIDQ1LCA3MSwxMjQsIDcxLDE1OCwgNDMsIDYwLDIxNiwyMTEsIDg0LDIxMywKKyAgICAgNDgsIDEyLCA3NCwyMzMsMTQ5LCA1NSwgMzAsMTA2LDE4MywyMTksMjA3LDE5MSwxMjUsMjU0LDI1MiwyMTksCisgICAgMjMxLCA3NSwgNDQsIDc3LDE5OCwxOTgsMTQyLDIyNywgNjQsICA4LDE2NywxNjksMjQ5LDExNiwxMzcsMTk5LAorICAgIDEwOSwyMDEsICAzLDI0OCwxMTUsMTAyLCA1NSwxMDgsMjE5LCA1NCwgMTIsIDk5LCA5NywgNjAsMTk0LCAyNCwKKyAgICAyMzUsMjQ3LDI1MSwgNTUsMTQ4LCA3NywxNzAsMjEzLDIyMSwxNDQsIDc3LDIzNCwyNDUsMTk4LDE2MywxNzUsCisgICAgMTkwLDI0MiwxMzEsMTYwLDIzNywxMTYsMTkwLDI0OCwyNDIsMjAzLDE3NiwxNDEsMjQ0LDE1MywxMjAsMjQ3LAorICAgIDE3MiwyMzMsMTE1LCAgMCwgIDAsMTM0LDE3NywxMzcsIDgwLCA5MCwyMTUsMTE3LDE5OSwxMTMsMTk2LCAxMywKKyAgICAgNzYsMjE1LDIxNSwxOTMsMTEzLDE1MSwyNDksMTcxLCAgMiwyNTUsIDMxLDEzMCwgMzIsMTg0LDE4NSwgNDMsCisgICAgMjIyLCAzNSwgMzAsICAwLCA2NCwyMTUsMTE3LDIxNywyMzQsIDM2LDExNCwyNDgsIDY1LCA5NiwyMTksIDU0LAorICAgIDE5OCwxMjAsIDcwLDI1MCwyMjEsIDkyLCA0NCwxMDAsIDE5LCAgMCwxMjgsMTA1LDE1NCwgIDgsMTYxLCA5MCwKKyAgICAxMDksMjA3LDE3OCwgNDQsMTk1LCA0OCwyMDYsIDMxLCA0MywxNTYsIDE3LDI0MiwxMTYsIDU4LCAyOSwxMzIsCisgICAgIDE2LDI1NSwgNTYsIDkzLDIxNSwgOTMsMjE1LDIzNywxODYsMTc0LDE2MCwyMjIsMTYwLCAgNSwxOTUsMjMyLAorICAgIDExNiwgNTgsMTQyLDIyNywgMTYsIDY2LDEzOCwxMzksMjQ0LDEwMCwgMTIsMjI0LDIxNywxMzIsMTc2LDE1MSwKKyAgICAyNDMsIDc3LCA2OCwyMjQsICA3LCAgMCwgIDAsMTQ4LCA3OCwxOTksMTA4LDE4MywgOTQsMTU5LDIyMSwgIDksCisgICAgMTM0LDE5NSwxNDksIDU4LDIwNiwxMDMsMTQwLCA4OSwyMTQsICAxLCAgMCwgMzIsIDYwLCA4OCwgOTMsICAxLAorICAgIDEyMCwxOTYsMjI3LDE4NSwxODIsMTUzLCA4NCwgIDYsMTMyLDIwMSwyMDUsMjA1LCA3NywyMTksMTgyLCAgMSwKKyAgICAgIDAsMjMwLCA2OSwgNTAsMTY3LDEwNywxNjcsMjQzLDE3NywyMzksMjUxLDE2NiwxMDUsMjQyLCAzMSwyNDMsCisgICAgMTg2LDExMCwgIDEsMjI0LCA1NiwgMjksIDY1LDEzMiwgIDIsIDk3LDE3OCwxODYsMTg3LDI1MSwyMTIsMTgyLAorICAgICAyOSwxOTksMTc3LCA0NCwxNzEsMjA5LDEwNCwxNDgsMjAzLDExOSwxOTcsIDUzLCA1NCwxOTAsIDQyLDI1MiwKKyAgICAyMzEsMTI3LDI1MywyNDcsMjQ0LDE0MywxNjIsMTE1LDE5MiwyNDMsIDcwLCA4NSwgODUsMjUxLDExNywyNDUsCisgICAgIDg3LDIwOSwgMTksMjAyLDE0OSwgNzQsMjAzLCAyNCwgOTYsMjE5LDIwNywgMjQsIDk5LDE0MCwxNzcsMTgyLAorICAgIDIyNywgIDgsIDYxLDE1NywxMzYsIDE5LDEyMSwgOTMsMTc1LCA4NCwgNDIsMTUwLDEwMSwgNjEsMTc3LCAxNCwKKyAgICAxNjYsMTAxLCA4NywgMjQsMjE3LCAgNSwgNjUsIDgwLDE3MSwyMzcsMjA1LDIzMiwxNTEsIDM3LCAgOSwxMzMsCisgICAgMTAzLCA3NiwgMjQsIDk5LDIyNSwyMzAsMTMxLCAxNiwxMTQsIDkzLDE1MSwxNzcsMTc3LCAzMiwgNTcsIDEzLAorICAgICA5NywyNDIsMTI2LDIyOSwgOTQsMTY5LCA4OCwxNzIsIDU1LCAyNiwxNDIsMjI3LCA2MCwxMjYsMTg4LDI1NSwKKyAgICAyNDAsMjI1LDEzMSwgMjEsMjI3LDE0OCwgODIsMjQxLCAzOSwxNzcsMTE5LCA4NCwgOTMsMjM5LDIwNywxMDUsCisgICAgIDg0LDE1NiwyMTksMjA3LDE1OSwgOTQsMTI1LCA5MywyNTEsMTAyLDI1NCwxNTIsMjUyLDIzMCwgMzQsMTU3LAorICAgICA3MCwyMTMsMjIxLDEyMywxODEsMTg5LDE4OSwgNzAsMTYzLDExMywxMjIsMTIxLDIxMiwyMDUsICAyLCAxNSwKKyAgICAgIDUsIDQ0LDIwMywgIDIsICAwLDEzMiwxNTYsMTMwLDE3NywgOTgsMTU0LDIzMCwgNzgsMjQ5LCA0NiwgOTksCisgICAgMjI3LCAzOSwxNTAsIDIxLDE0MSwgNjYsMjI1LCAyNSwxNDcsMjQ5LDE4OCwxMzcsMTA0LDEzNCwgNzAsIDQwLAorICAgIDEyNSwxOTEsMTE0LCA3OSwyMTUsMjE1LCAzMSwgNjMsMjIyLDExMSwgNTIsMTkwLDEzOSwxNDcsIDgwLCA0MCwKKyAgICAgMjksICAyLCAgMCwgNTIsMjQ1LDE1MCwgNjQsMjIzLCAyMiwgOTIsIDUyLDE2MSwgOTYsICA1LCAgMCwgNjQsCisgICAgMTM1LDE5NSwxMzMsIDcwLCA4NywgOTQsIDcxLDEzNiwxODgsMTEzLDE1OSwgMzIsMTQ4LDE3NCwgODQsMjM4LAorICAgIDIxMywxMDYsMTIzLCA3OSwxNzIsICAzLCAxNywgNDIsMjM5LDIwMiwgNTcsMTMzLCA0OSwgMjIsIDQyLCAxNywKKyAgICAxNTIsIDc2LDExNCwgMzcsMTI5LCAyMSwxOTcsMjM3LDE4NiwxMTAsMjE1LDE1NywgOTUsIDg3LCAyMywgMzIsCisgICAgIDIwLCA5NCwxMjYsIDgyLCA0NiwxNTEsMTAzLDE4NCwyMjcsIDc5LDEyNywyNTQsMTM5LDIzMiwxMzAsMTQ4LAorICAgICA4MCwxNDAsIDk3LDE0MCwgOTksIDQ2LDE1NywyMzAsMTYyLCA3NiwxOTMsMjAyLDIwNSwgOTMsIDI4LDE1NCwKKyAgICAxNzAsICAxLCAgMCwyMDAsMTg1LDIxMSwyNDIsIDE4LCAyMywxNTYsIDk0LDIxMywgNTIsMjA1LDEwMiwxNzksCisgICAgMjQ5LDE2MiwyMTcsIDkwLDE1MywxOTIsIDM5LDIyOCwgMjAsMTk5LDIzMywxMzIsMTE3LDIxMywgMzksIDY1LAorICAgICA4NSwxODEsIDgzLCAxMCwxNTEsMjE0LCA3OCwxMTksMTczLDEzMCwgOTcsMjA0LCA5MiwgNTUsIDEyLDE2MywKKyAgICAyMTcsMTA4LCAxMCwgNDUsIDcyLDE4NSwgNDIsMTgwLDE1NywgMTQsIDMzLCAzMCwgNjYsMjMyLCA3MCwgIDcsCisgICAgIDg5LCAxNiwgMzgsIDEzLDE5NSwxMTIsIDI4LDE2NywgOTQsMTExLDEzNiwgODYsIDY3LDExMSwxNjksIDg0LAorICAgICA0MSwgMjIsIDkzLDIxNSwgOTMsMTc3LDE5MiwgIDcsMTU2LDE4NywxODQsMjU0LDExNiwgNDQsIDYyLCA1NCwKKyAgICAgMTQsMjAzLCA3OSwyMzAsMTE1LCAzNywxOTgsIDQ5LDE0NywgNjksIDYyLDE1OCwgMjMsMjA1LCAyMiwgOTksCisgICAgMjI3LDEwNSwyNDcsMjMwLDIxMywgODksIDQ5LCA3NiwxNjUsIDcxLDIwMCwgMTksMjM1LDE5MiwxNzgsIDQ0LAorICAgICAgOCwyMjUsMTk1LDEzNSwgMTUsIDg2LCA5NiwxOTcsIDY3LCAgOCwyMzUsMTQxLDE5OCwgODMsMjUxLCAyNSwKKyAgICAgMTUsMjI2LCAzNiwxNjIsMTY1LDIzNiwgNzQsMjI5LCAzMCwgOTksIDQ0LDEyNCwgOTEsMTYyLDE5NiwgMjUsCisgICAgIDEwLDEzMywxNTEsMTU5LDIzMiwxMzksIDU0LDEwNiwxNzIsIDQwLCAgOCwgMzMsMTk5LDExMywgNzgsMTIxLAorICAgIDE5NiwxMDIsIDU3LDIxNiwxODIsMTA5LDIxOSwgNTQsMTI3LDI0MCwxMDAsIDU2LDE2NCwxNDgsIDgyLDE0MCwKKyAgICAyNDEsIDU3LDE3MSwxNzksMTUwLDE5NSwgNzYsMjA1LDE1OSwxNzAsMTA2LDE2NywgNjAsIDcwLDEyMSwxMzEsCisgICAgMTI4LCA4MCwxODYsIDkwLDIyMSwxMjUsMjUyLDEyMCwxOTEsMjE3LDEwOCwgNTQsMTU1LDIwNSwyMzMsIDQxLAorICAgIDE0OSwgNDMsIDYyLDE3MCwxOTIsMTM1LDIwMywgNjQsMTYxLDEyOSwyMDcsMjA0LDEyOSwgOTYsMTY5LCA4OCwKKyAgICAxODgsMjU0LDE0NiwxMTUsMjM3LCAgNCwgMTQsMTM0LDE2NSwgOTgsMjQxLCAzNiwyMjksIDk1LCA0NiwyMjMsCisgICAgIDEzLDI1MiwgOTYsMTg2LCAzMiwgNTUsIDE4LCA4NCwxNzEsMTg3LDE3NCwxMjMsMTk2LDEwNywgNjQsIDIwLAorICAgICA2OSwyMTcsMjE4LDIxOCwgNDIsIDI0LDEzNCwxNjAsMjI3LCAzNiwgODUsIDgzLCA3NSwyMjQsMTk5LDEyMywKKyAgICAxNDcsIDcwLCA3MiwgODMsIDg1LDIwOSwyNDIsMjEzLCA0OCwgNTQsMTMzLDE2NiwxMjMsMTAzLDEyMCwyNTUsCisgICAgMTE5LDE1OSwyNTUsMTgyLDIzNywxMTYsICA4LCAzMywgOTIsMTY0LDE2NCwyMTEsMjAwLDIxNiwyMjAsIDc2LAorICAgICAzMSwgODcsIDIxLDE5NywgNDgsMTc0LCA1NiwxOTksIDQzLCAyMCwxMjQsMTgxLDIwNCwxNTYsMTk5LDIzNywKKyAgICAxNDgsMjAzLDIyNiwxMzgsMTI1LCAyMiwgNzgsIDI5LDEyNywgODksMjQ0LDE0MSwgMzYsMTQ4LDIxMSwgNjcsCisgICAgMTY5LDI1MiwxMTMsIDM3LDEyNiwyMjgsMTcyLCAzMSwyMTksMTk1LCA1OSwxMTMsMjE4LCA1OCwyMzEsMTcyLAorICAgICA5NCwyMTksMTY4LDEyMCwyMzMsMTEzLDE5NywgOTYsMTIyLCA1NiwxNjQsIDQ5LCA2MCwyMTcsMTg0LDExMiwKKyAgICAxODEsIDY0LDE1MiwgMjAsMTY3LCAyMywxNzQsMTY0LDE3MCwgODMsIDMyLDE2MSwgNzIsIDcyLCA5MiwgOTEsCisgICAgIDgwLCA1OCwyNDQsICA4LDEyOSwgNDgsMjMzLCA1NiwgMjksIDc0LDEwNSwgODgsMTIwLCA0MSwgMzMsICA5LAorICAgICA2OSwgNjYsMjI2LDIyNiwxMzIsIDUwLDE2NCwyMTQsMTEzLDE2OSwxNDksMTc0LDIzNSwgNTEsMTMzLDEzMCwKKyAgICAgMTgsMTQ2LCA4MCwgMzYsIDM2LCA0NiwgMjIsMTI4LCA4NCwxNzEsMTg3LCAgMCwgIDAsMTQ4LCA3MCwxNzEsCisgICAgMTE2LDEwNiwxODcsIDI2LDEyMCwxNjcsMjM3LDIwMCwgMjIsIDg2LCAxOCwgMTgsIDE4LDIwOSwyMjQsIDkzLAorICAgICA1NywgIDUsIDE4LCAxOCwgMTgsMTQ1LDEzMywgNjAsMTg5LCAzNSwgNTUsIDMwLCA3NSwxODUsMTE3LCAyOSwKKyAgICAgIDAsIDMyLDIwNSwgNzMsMTE1LDIxMCwyMjAsIDEwLDE1NSwxNDcsIDEwLCA2OSwgNjYsIDY2LCA2NiwgMTgsCisgICAgMTM4LDEzMiwxMzIsMTMyLCAzNiwgMjAsICA5LCAgOSwgIDksIDczLCA0MCwgMTgsIDE4LCAxOCwgMTgsMTQ2LAorICAgICA4MCwgMzYsIDM2LCAzNiwgMzYsMTYxLCA3MiwgNzIsIDcyLCA3MiwgNjYsMTQ1LDE0NCwxNDQsMTQ0LDEzMiwKKyAgICAgMzQsIDMzLCAzMywgMzMsMTEzLCAzNywxMzIsMTk0LDIxNiwxMjAsMTkwLCAgMywxMzksMTMyLDEzMiwxMzIsCisgICAgICA0LDE4NCwyMzIsMTk1LDEyOSwgOTcsIDcxLDEwMSwgNTgsIDI4LDE3NCwgNzYsMjQzLCA1MiwgIDksICA5LAorICAgIDEzNywgNDMsIDgwLCA0MCwgOTcsMjE1LDE5NCwgODIsMTc3LDIzMiwgNTYsMTQyLDEyNCwxNjEsMTY2LDEzMiwKKyAgICAxMzIsMTk2LDE0NiwgMTAsMTAxLDE2NiwgIDcsMTA2LCAyNiwxNjEsMTUzLDIwNiwgNjQsIDE4LCAxOCwgMTgsCisgICAgIDE4LDIzMSwgMzQsMTQ4LDI0OSwxNDIsMjAyLCAxMSwxODcsMTQxLCA3MywgNzIsIDcyLCA3MiwgNjYsMTg1LAorICAgICA0OCwxNTUsMTEyLCA3MiwgNzgsMTQ1LDE0NCwxMjAsMTcxLDIwOCwxMTgsIDU4LDE3MywgODYsIDQzLDE1NywKKyAgICAgNzgsMjIzLDE3NSwgODQsIDc4LDEyMiwxMjMsMjUyLDIxOCwxMTQsMTA4LCAxOCwgNTcsMTY3LCA4MCwgNTgsCisgICAgMTU2LDIzOSwxMjEsMjAyLCA5NywgMjQsIDcwLDIyOCwgNDcsMjMwLDEyMiwyMDksMTA4LDE0MSwgMjUsMTU1LAorICAgIDEyNywyMDEsMTEyLDIxNSwxMTcsICAzLCA2MywgNDgsIDc3LCA4MywyMDgsMjE5LDI0NiwxOTMsMTU1LDExOCwKKyAgICAgOTgsMTExLDIyMiwgNjgsMTQzLCA4MCwgOTAsIDgxLDE0OCwxMDQsIDk1LDIzOCwyMzksIDE3LCA2NiwgNjAsCisgICAgMTYyLDEwNiwgMTEsMjIyLDE3MSwyMDQsIDM5LCA1NywxNDEsIDgwLDIyOCwyMzksIDY0LDE1OCwgNTcsMjQ4LAorICAgICAxOSwyMTgsIDY5LDEyOCwyMTksMjEwLDI0MywyNTAsMjA0LDEzMCwyMjgsMTYzLCA5MSwgNTYsMjQwLDIwMywKKyAgICAyMDQsMjI4LCA2NiwgOTEsMjExLDI1NSwxMzcsMTM2LDI0OSwxODgsMTU4LDExMiwxNTYsMTQyLDIzOSwyNTEsCisgICAgMTkwLDIzOSwxNTksMjEwLDE0MCwyNDgsIDEyLCA2NiwyMjUsMTAzLCA1OCwgIDgsMTYxLDE2NywgNzksMTU5LAorICAgIDI0MSwgNDMsMTg4LDExNSwxNDEsIDMxLCAgNCwyMjUsIDIxLCAgOCwxNjEsMjI3LCA1NiwgMTYsMTk0LDIwMywKKyAgICAxMTYsMjM0LDE2MSwgNjcsMTIyLCA4MiwyMTksIDkzLCA4NSwgMTksMTc4LCA1MiwxODUsMTg1LDEwNSwgNzgsCisgICAgMTYxLDExNiwyNDgsMjQ4LDI0MSwyNTQsMTk0LDI0NiwxMDIsMTQ1LDE5MiwgMTUsICAyLDIwMywgNTgsMjI0LAorICAgIDIwNSwgODUsIDQ5LDE5OCwgIDAsICAwLDE5OSwyNDEsICAwLCAgMCwgMTEsMTY5LDEwOSwxMDUsMjQwLCAyMiwKKyAgICAgOTUsMTk4LDIwOCwxNTIsMjQ3LDE3MSwxNzQsMjM1LDIxNCwgMjcsMTQxLDE3OCwxMjgsIDg2LCA3MSwgMTEsCisgICAgMjM5LCAyOSwyMzksMTgyLCA0NSwyMDAsMTUwLCA3MSwgOTQsMjA1LDExNiwgMjMsMjMwLCA3NSwxNjgsICA0LAorICAgIDEzOCwgODEsIDE3LCAxMCwyNDEsICA4LDE4MywxODEsMjQwLCA3NiwxNDcsIDc5LCAzOCwgIDAsIDY0LCA4NSwKKyAgICAxODEsMTQ5LCAzMywxNDgsMTE1LDExOCwgIDQsIDI5LCA1MSwxODIsMTAwLDIwMCwxNjMsIDQwLCA3NCwgNTAsCisgICAgMjQ5LDE2NiwgNzcsMTkzLDEyMCwyMDQsMTI0LDIyMywxMDMsMTQwLCAgMSwgIDAsIDI0LCA5OSwxMzIsMTIwLAorICAgIDE3MCwxNzAsICAxLCAgMCwgMjAsICA1LCAgMywgIDAsIDk2LDI0MiwgODIsIDc4LDE2OCwxNjksMjM0LCAzMSwKKyAgICAyNTUsMjQwLDI1MSwgMjUsMTEzLDI0NCwxOTcsMTUxLCA5NSwgNjYsICA4LCA2OSwyNDQsMTg3LDIxNiwgNTQsCisgICAgMTgzLCA1OCwxNTcsIDc4LDE3OSwyMTMsMTU0LDE1MCwgNjMsIDc5LDE3MiwgIDMsICA4LDE2MSwxNjAsMjE0LAorICAgICA5OCwxNDAsMTQxLDEwNywxODEsIDYxLDE5OCwxNTIsMTA1LDE1NCwxNjUsIDk4LCA0OSwyMjgsMTcyLDE4MiwKKyAgICAyMTEsMTM3LDE4MiwgMzksICA5LDIzOSwxOTYsMjMwLDE4NiwgNDYsICAwLDE3OSwgNjIsMjI0LDE4NiwgNzEsCisgICAgICAwLCAgMCwgNjUsMTQxLCA4NiwgODUsIDg1LCAxMSwgNjEsMTg4LDIzNSwxODYsMTUwLDExNywyMDgsMTA4LAorICAgICA1NCwgMTMsIDk5LCA4MywgODAsMjI3LCA1MiwgNjYsMTg4LDE3NCwyMzUsMTk4LDIwOCwgNTIsMjQ2LDE0OCwKKyAgICAyMDEsMTMyLCAxNiwxNzgsMTQ3LCA5MywyMzUsIDM4LDE3OCwgNzMsMTczLDE4MiwyNDcsMjU1LDI1NCwyMzksCisgICAgMjU1LCAxNywxNTIsIDY3LDE1MywgMzgsMTAyLDE0MywxNDQsIDkwLDEwOSwyMDcsMTEzLCA1OCwxOTYsIDM1LAorICAgIDE4OCwgIDksMTg3LDIwOCwgIDYsMjQ0LCA3OSwxMDksMTU1LCA0OSwgMzgsMTc0LCA0OSwxMDQsMTY1LDExNCwKKyAgICAyMzksMjA5LDE2MywxNzUsMTU4LCA4OCwgIDcsMTI0LCAyMCwxODgsMTc3LDExMywxODUsIDkyLCAyMiwgMzYsCisgICAgMjEyLDI0OSwxMTIsMjMwLCA1NSwxMDksIDE3LDE1NSwxNTUsMTc0LDIzNSwyMDUsMTAyLDExNSwxOTgsMjIzLAorICAgICAyNCwgMjcsIDE5LDIyNiwgOTcsMTQwLCA5OSwxMjAsMTc3LDExNSwgOTQsMjE1LCA4OSwxMjEsMTA4LCA4OSwKKyAgICAxNTAsMjE5LDExNywgNjksIDE2LDEzOCwxNzAsMTA2LCA2NSwyMjQsMjE5LDI0NiwxNzksIDI0LCAgOCwgNjksCisgICAgIDg1LCA4NywyMzEsMjA2LDI0MywgIDAsICAwLCAxMCwxNzEsIDczLCA2OCwgNjUsIDg0LCA4NSwxOTksMTEzLAorICAgIDIzMCwyMDEsMTM5LDI0NywyMzQsIDYxLCA0MSwgNzgsMTkxLDE2MSwxMDgsMTE0LDEyMSwxMjYsMTg4LDExMiwKKyAgICAxNjUsMTcyLDIyNywgNTYsMjQ1LCA3MCwgNjcsMjQ0LCA2MCwxMjIsMTMyLCA1NiwxNDIsMTYzLDIzNSwxODYsCisgICAgMTg0LDExOCwgOTIsIDg4LCA4MSwgNzYsMjExLDIyOCwgMjcsIDI5LCA5OSwgOTksMjE5LDE4MiwgNDksMTk4LAorICAgIDEzMCwyMTgsIDc0LCA1MCwgNTQsMjMwLCA4MSwgOTcsIDYwLCA2MSwgMzEsMTIwLDI1NSwxMDUsMTc0LCA3MSwKKyAgICAxNjYsIDM3LCA1OCwgIDAsIDk2LDExNSwgNTEsIDM4LDExMywgNDYsMTU0LDE4MiwxMzgsMTk3LCAzNCwxNjUsCisgICAgIDUyLDEzNCwxNjIsMTA5LCA5MywgOTUsIDk1LCA1NiwxNTMsMTQwLCA0OSwgODMsIDg4LCAxOSwyMTAsIDI3LAorICAgIDIwMiwgMzgsMjI0LCA2NiwxNDksMTc4LCA0MCwxNDEsIDk4LDIzNSwxMjksIDk4LDIxOSwyMDcsIDMyLDEzMiwKKyAgICAyNDcsIDQzLCAyMSwxNjEsIDg2LCA3NCwxOTcsMTYyLDIzNSwxODYsMTUwLDExNywxNjAsMjM1LCA1OCwgOTksCisgICAgMTcyLCAzNCwyMzYsMTcyLDIwMiwgMzUsIDMwLCAyMywgMTQsMjI2LDExNCwxODksMTAzLCA3MCwgNjEsMTc0LAorICAgIDIzNSwxMzgsMTM5LDExOSwgMjIsMTA5LCA2MCwgMjksICAwLDEyOCwxNTgsIDIzLDEwMSwxMTAsMjE5LDIyMCwKKyAgICAxMDYsMTgxLCA5MCwyMDUsIDg2LCA3NSwxMDQsICA2LDE1NywyMzEsMTY0LDExNiwgOTMsMTU5LDE1NSwyMDQsCisgICAgIDM1LDEzMiwyMDgsIDEwLDE4MCwxOTMsIDYyLCA2MywxNTUsMjQ4LCA2NSwgNjQsMTM2LCAyMywgMzcsMTYxLAorICAgIDIwNCwyMzEsIDc3LCAgNSwxODEsIDk4LDE3MiwyMTUsIDI3LDE5MCwyMzksMTUxLDIwMywxMDEsMjA5LDIzOCwKKyAgICAgIDcsIDk3LDE3OCwgODIsMTg1LCA4NywxNzEsMjM3LCA1NywxNDIsIDk5LDE1NCwxNjYsMTg0LDI0NSwgMTcsCisgICAgMjQ4LCAgMSwgIDAsIDY0LCA5MiwgNDMsMjIwLCA1MSwxNjMsIDMwLDE5OCwxOTgsMTc0LDIzNSwgMTAsMTQxLAorICAgIDExOSwxMzQsMTk1LCAzMSwyNDUsMTMwLCA3MSwgOTQsICA1LDEyOSwgOTUsMTY5LCA4NCwxMzIsMTg2LCAyOCwKKyAgICAxOTEsMTE5LCA3OSwxMDksIDkxLDExNiwyMTMsICAyLCAzOSwxNDgsMjMzLDE2OCwxOTksMTE3LCA5MywxOTUsCisgICAgIDQ4LCA4NiwxNDYsIDc3LDEwMiwgNTgsMTgwLCA0NywxNTgsMTQ0LDE0NywyNDcsMTM3LCAxMSwgNTUsMjUwLAorICAgIDE3MCwgODYsMTE5LCA1MywgODUsMjI5LDI0OSwgMjAsIDE3LCAzNSwxNjQsMTE2LDIxNiwxMDgsMTgxLDE5NiwKKyAgICAgNjksIDMxLDI0MywxNzgsMTM5LDEyNywxNjMsMTcyLDE5NiwxMTAsIDUxLCAyOSwyNDUsIDUyLDE1NSwgNzcsCisgICAgMjE1LCA2MSwyMjYsIDYyLCAxNiwgNjcsMTg4LCA2NywyMzMsIDc5LDI0NiwgMjcsMjExLCA1MiwgNjksIDcxLAorICAgICA2MSwxNTQsMTcwLDE3MCwxNzAsMjMwLCA1NiwxNDIsIDk3LDEwOCwgMTAsMjM3LCA4NCwxNTcsMjE1LDExNywKKyAgICAgMTEsMTI4LDExMiwgNTAsMjE5LCA3OCwxMzUsIDQ5LDEwMiwyMjAsMjUyLDE0NywgMjksIDc0LDEzNSwgNzUsCisgICAgIDY4LCA1OCwxNzAsMTcwLDE1NywxNzgsIDc5LCA5MiwxNTIsIDgwLDEwOCwyNTEsIDg5LCA1MCwgIDksMTk5LAorICAgICA5OSwgODEsMjAxLDEwOSwxNTgsMTg4LCA0NCwgMTEsIDU2LDExMCwgNjAsMjAxLCAyOCwxMzIsIDE2LCAzMywKKyAgICAxMDAsMjE5LDExOCwgNjIsMTc0LDE0NCwgMzYsMTU4LDE2OCwgIDcsIDk5LCAyOCwgMTAsMTE3LCAzMCwyMzksCisgICAgIDIwLCA2OCwxMTAsMTcwLDIxMSwxNjcsIDYwLDEyNiwgMTYsMjEyLDIzNSwxNDEsIDkwLDEwOSwxNzUsIDgyLAorICAgIDE2OSwgIDgsIDYxLCA4MiwxODksIDk1LDE4NSwyNDcsMTk3LDE1MSwgOTUsMjE0LDIzNSwyMjMsMTA1LCA4NSwKKyAgICAxMjksMTMyLCAgMiwgOTcsMTE0LCA1OCwyMzQsMTEzLCA5MywxMTksIDUzLDIyNiwgMjksMTMyLDIxMCwgMjMsCisgICAgMjA1LCA0MywyMzUsMTg2LDEyNiwxMjIsIDM0LCA5OCwyMzcsIDM0LDEwNywgMjAsIDc5LDIzMSwgODAsIDY4LAorICAgIDEwOCwxMTksIDMwLCAzMywxNzQsMjM1LDE1NCwxNjYsIDQxLDExNiwxOTUsMTUzLCA0OSwgODcsIDQyLCAyMiwKKyAgICAgODUsIDc3LDE3MywyMTMsMjQ2LDIzNCwxNDEsMTk4LDE0MiwgMjQsIDM0LCA4MywxNzYsICAyLCAgMCwgOTYsCisgICAgMjI3LDExMywxNTYsMjAzLDEwMSwxMTUsMTE1LDIxMSwxODIsMjM3LDE3NCwyMzUsMTA2LDE3MCwxOTgsMTQzLAorICAgICAzNiwgOTgsMTYzLCA3NSwxNzIsIDQwLDI0NywgNDMsMTQ5LCA2MywyNTMsMjQ5LDIwNywxNDEsIDcwLCA2NywKKyAgICAgNDAsMTYxLCAzMiwxNDgsIDQ2LCAyMSwxMzksMjQ1LCA3MCwxNjMsMjM3LDExNiwxMzIsIDEwLDE2MiwgNDgsCisgICAgMjM0LDIyNSwxNDcsIDg5LCAyMiwgODMsIDkxLCAxNiwgNjMsMTIwLDE4MCwgNTYsMjA1LCA0MSwxODgsMjA1LAorICAgIDIzNSwgNzMsMTE0LDI1NCwyMDQsIDczLDE5MCwgIDAsMTYxLCA2NCwxNTIsIDIwLDE0OCwgNTIsMjI1LCA5NiwKKyAgICAxMDgsMTA4LCA4OSwgIDcsMTc3LCAyOSwxMzMsICAwLCAgMCwgNDQsMjM1LCAgMCwgMzMsMTk2LCAgNywxNjUsCisgICAgMTcwLDE1NCwxODQsMTg2LCAgOSwxNzIsIDk2LDE5MCwxNzksMjM3LDE5NiwxNjUsMTg4LDE4NCwgODAsMTgzLAorICAgIDEwOSwyMTksMTE3LDE0MywgMjQsIDI3LDExNSwxNTEsMTM2LDExNSwxNjUsMTE0LDI0MiwxNjIsMTQ4LDEzOCwKKyAgICAgNTQsMTAwLDE1NCwxMDIsMTc5LDIxMywxMDYsIDUyLCAyNiwgNjYsIDg1LDEwOSwgMjQsMjQ1LDI0MCwyMDEsCisgICAgMjA0LDE5OSwgNTksMTUzLDExMywxMTQsMjAyLCAzNywyNDcsMjQyLDEwNywyNDQsMTk4LDE4MiwxMDIsMTc5LAorICAgICA3MywgNDEsMTQxLCAzMywgMjMsMjAzLCA4MSwxNzUsIDU1LCA0MCwxNjUsMjI1LDIwMSwgMTQsMTU5LDIxNCwKKyAgICAxNzYsMjUyLCA1NSwyNDIsMTQxLCA4NCwgODUsIDUzLCA3NCwyMzMsMTM5LDEwMiwgNDMsIDc4LCA2NSwxMzksCisgICAgIDQ5LCAzOCwxMzIsIDE2LCA2NiwyMjYsMjQ3LCAgMSwyMzgsMTIwLCAgOCwxNjEsIDI0LDE1MiwxNzEsIDkyLAorICAgICA0NiwgODMsIDc0LDE1NSwyMDUsMTUxLCA0OSwgNjgsIDYxLDE2MiwxMTUsMjE5LCA4NywxOTcsIDQxLCA4MSwKKyAgICAyMjksMTUyLDE3NSwgMTEsMTYxLCA4MCwgNTgsMTcyLCA1NSwgMjYsMTc3LCA4NSwgNDksMjQzLDIxMiwyMzksCisgICAgMTE2LDE1NywgMTEsIDY2LDEwNSwxOTUsIDQ4LCAgOCwyNDEsMjE4LCA3OCwgNzEsMTMyLDE5NywxNTcsMTU3LAorICAgIDE4NywgIDAsICAwLDIxOSwxODIsMjM1LDI0NSwgIDYsMTE5LDE4MiwgNDgsMjIxLCA0OCwyNTMsIDk5LDIyOCwKKyAgICAgODEsIDE1LDE2NSwxNDgsIDE2LDE2MiwxOTksMTU1LCAzMCwyNDIsMTMxLDE2MCwxODIsMTgzLCAgNywgIDAsCisgICAgIDQ4LCA5OCwgNDEsMTIzLCA0MSwgMjQsMTU1LCAyNCwyMjcsMjQzLCAyOCwxMDYsIDk0LCA1MCwyMzQsIDk3LAorICAgIDE0MCwxODUsMTc0LCAyNywgOTEsIDQ1LDIwNywgOTUsIDMxLDIzOSwyNTUsMjMzLDIwNywxMjcsMjQxLCAgOCwKKyAgICAxODUsIDY1LDE1NiwxNzgsMTE4LCA3NywgIDgsMTMzLCA0MywgNDYsIDY2LDE4OCwyNDksIDgzLDE3MSwgODIsCisgICAgMTc3LCAyNCwxMjEsMTY4LDE5NywyMjMsIDE0LCA1MywgODMsMTAxLDE5MSwgODMsIDQ2LDE4NywxNzQsIDQzLAorICAgICA0MCwgNTksMTM5LCAyMSwyMjksMjI1LDE5NSwgIDcsMTUwLDExNywgODAsMTExLCA1MiwyMzQsMTQxLCAgNiwKKyAgICAxOTgsIDU2LDE1MywxMzIsMjIwLCAgNywyNDgsMTkzLDE1MywxODQsMTY4LDEzNSwgODIsIDkwLCAyMCwgMzEsCisgICAgIDY5LDIwNiwyMjMsIDU5LCA5MywyMTUsMTMzLDE5OCwyMDAsMjExLCA0MCwxNTEsMjM5LCAxMCwgNTgsMTE4LAorICAgIDE1NiwxMzcsMTIyLDIyNiwyMTIsMTIyLCA2MCwxNDksIDc4LCA2MCwgMTgsIDc5LCA3NCwyNDEsMTI2LDIyOSwKKyAgICAgMzAsMTMyLDExMiwgNjksICA4LCA2OSwyMTMsMjEyLCAxOCwgNDAsMTU4LDI0NCwxNzEsMjAwLDIxMywxODQsCisgICAgMTY2LDIyMiwgNTAsMjA1LCA1OSwgNTEsMTk0LDE0OSwxNTEsMTY1LCAgNCwxMjYsIDY0LDEzNSwgMjAsIDY3LAorICAgICA2OSwxOTYsMTM4LDIxMiwgNjIsMjE1LDIxOCwxNDIsIDY3LCAgOCwyMjUsMTcwLDE5NiwgNDgsIDEyLCA2OSwKKyAgICAgODEsMTIwLDEzNCwgNjksIDgwLDIxMiwgODMsIDQ2LDE1MSwxOTksMTQwLDEzNywyNDYsMTI5LDE1MywxODAsCisgICAgIDg3LCAxOCwgNjYsIDc3LCA4MywgIDUsMTU3LDEzMSwxNDgsMTM4LDE5NywyNDQsIDkyLCAzNiwxNjUsMTY5LAorICAgICA0MiwgMzEsMTA1LDEzMiwxNzEsMTMzLDE3NSwyMDEsMTc2LDE3NiwgIDAsMTk0LDEwMCwxNjUsIDgyLCA5NywKKyAgICAxNDAsIDc3LCA0NywxNTUsMTMzLDI1NSwgNzYsMTE2LCA0NCwgODksIDM4LDEzMiwxOTYsIDg5LDI0MCwxMTQsCisgICAgMjQ5LCAyOCwyMjMsIDU5LDI1MSwyNTEsMTI3LDEzOSwyMzEsMTI3LDE0OSwgNjEsMjM4LDE2NSwgNTcsMTA1LAorICAgIDExMCwyMjksMjA1LDIwMSwgNTQsIDI2LCAxOCwgMTgsIDE4LDE0NiwgODAsIDM2LCAzNiwgMzYsIDM2LDE2MSwKKyAgICAgNzIsIDcyLCA3MiwxNzIsIDQ4LDIyMiwxMDUsIDU5LDEzNSwxMTQsIDIyLCAzNiwgMzYsIDM2LDE2NCwgNjYsCisgICAgMTQ1LDE0NCwxNDQsMTg0LCA5NCwgODgsMTQ3LDIwMSwyMzcsMTU1LDEwNCwgNzgsIDY2LCA0NiwxNDksMjM1LAorICAgIDEwNSwgNzgsIDQyLCAyMCwgIDksICA5LCAgOSwgNzMsIDQwLCAxOCwgMTgsIDE4LDE0NiwgODAsIDM2LCAzNiwKKyAgICAgMzYsIDM2LDE2MSwgNzIsIDcyLCA3MiwgNzIsMTU2LDE0MSwgNTMsIDU3LCAgNSwgMTgsIDE4LDE0NSwgMzIsCisgICAgMTQ3LDIwMSwgOTYsMTQwLCA1MSwgMzEsMTAyLCAgMCwgIDAsMjQ0LCA5NSwxODAsMjE1LDIzNSwxNDEsIDcwLAorICAgICAzNSwxNjksIDgwLCAzNiwgMzYsIDM2LDE1MCwgIDQsIDk5LDE3MiwyNTMsMTI1LDE4NywyNTMsMTI1LDEyMywKKyAgICAgNTAsMTUzLCAyMCwgNjIsIDQ2LDIwMCwxNDQsIDcxLCA2NiwgOTgsIDUzLDE2MSwxMDUsIDkwLDE2MSwgMzIsCisgICAgMjE0LDE5NSwgIDcsMTMxLCA2NSwxNzUsMjE1LDE2MywxNDgsIDgyLCA3NCwxMjMsMTg5LCA5NCwgMzQsMTQ1LAorICAgIDEzNiwyMjUsMjUzLCA4MiwxNDYsIDgwLCAzNiwgMzYsIDM2LCAzNiwxNjEsIDcyLCA3MiwyMjAsIDY0LDIyOCwKKyAgICAxMTQsMTg1LDE3MSwgMTgsIDY4LDIzNiwyMjMsIDQ0LDEzNCwgODcsMjM0LCA3NCwgNjYsMTQ1LDE0NCwxMzYsCisgICAgIDE1LDIxNywgOTEsMjE3LDEyNCwgNjIsIDMxLDE3OSwyMDksMTI0LCA2MiwxNTksMjQ5LCA0OCwxMTUsMTIwLAorICAgIDI0OCwgNTQsIDYyLCAzNywgMzksIDc5LDEyMSwgMzYsMTEwLCA2MiwxMDcsMTAwLDE3OSwxMzcsIDY4LDIyNiwKKyAgICAxNjQsMjIzLDIyNiwxNDMsIDQ4LCAgMCwgMzIsMTQ2LDE5OCwxODksMjMxLDIxMiwgMzgsMjQ4LCAzNSwyNTIsCisgICAgMTc4LDI0NSwyNDIsIDQ1LCA2MCwyMjYsMTQ1LDEzMiwgMzQsMTc3LCAxOCwxMTMsMjA1LDI1MCwgMjUsMTEzLAorICAgICA3NywyMzAsMTk1LDIwNCwyMjQsMjQ1LCAzMiwxNTgsMTI3LCAgNiwgMzMsMjI4LDI1NSwyMTEsMTI3LCA1OSwKKyAgICAyMTcsIDY4LCAxOCwxMzgsMTk2LCA0MiwyMjQsMTAxLDIzNSwyMjksIDczLCAxMCwxNjUsMjQwLDExMywgOTcsCisgICAgIDUwLDE1MywxODAsMTkxLDExMSwxMDMsIDUwLDE1MywyMDMsMTkxLDEyOSwyNDksIDYwLDIzMiwyNDUsMTIyLAorICAgIDE0NywyMDEsMjI4LDE3MywxODksIDIzLDE0NiwgODAsIDM2LDExMCwgNjAsIDc4LDE0NSwgIDMsMTU2LCA3NywKKyAgICAgNzAsMTYzLCA4MSwgMzgsMTQ3LDEzNywyMzEsMTU5LDIyNSwxODAsIDIxLCA5MSwxMzIsIDM3LCAgOSwyMjksCisgICAgMTIyLDE5MywgMTUsICAyLDIwNywgMzUsIDk5LDE5OCwgIDAsICAwLCAxMCwgODYsIDUyLCA4NSwgOTEsMTUzLAorICAgIDI0NiwxOTgsIDE4LCAgMCwgIDAsMjA2LCAzOCwyMDksMTI2LCAzOCwxNjUsIDY3LDE5OSwxMTMsIDg0LCA3NywKKyAgICAgOTMsMjE2LDIyMSwgOTgsIDk5LDExNSwgIDMsICAwLDI0MCwyNTIsMjE5LDIzMSwxNDYsIDgwLDIyMiwgNDYsCisgICAgMTE2LCA5MywyMTUsMTgyLDE1OSwgODEsIDc0LCAzMywxMzIsMTM4LDEzMCwxOTksIDk5LCA4NiwxMTEsIDUyLAorICAgICAgMCwgIDAsMTY2LDEwNSwxNTAsMTM4LCA2OSwgNzMsIDQzLCA0MywgNDcsIDk0LCA0NiwxNzksMTE0LDIzNCwKKyAgICAxNDEsIDcwLCA4NSwgOTEsMjIwLCAgMywxODQsMjU1LDE3MCwyNTUsIDU0LCA3OSwyNDgsIDkxLCA3NCwgNDAsCisgICAgIDc5LDE3MiwgIDMsMTk5LDExMywgMTIsMTk1LDE2OCwyMzgsMjM4LCA3OCwxODMsIDg5LDEwNSwgNTksIDI5LAorICAgIDIxOSwxODIsICA5LCAzMywyMTMsMjIxLCA5MywyMDEsIDQxLDE3MSwgIDQsMTk4LCA4OCwgODQsMjI4LDIxMCwKKyAgICAxMDYsMTgxLCAxNiwgNjYsIDM5LCA1MywyMjMsMjM0LDI0NSwxMjIsMTExLDI0MywgNjAsMTkxLDE0MSwxMTcsCisgICAgIDQwLDI0NSwxMjIsMTk1LDExNywyMjEsMTA2LDExNywyNDcsMTI2LDIyOSwyMjIsIDc2LDE3NSwxNzUsMTMwLAorICAgIDE3NywgODksMTczLDIzOCwgODIsIDc0LDE1OSwgODgsMTUwLDExNiwxOTQsMTQ5LDEzOCwxMDksMTI1LCA2MywKKyAgICAgMTgsIDg3LDI0NywxMzEsMTI4LCA4MiwxMDYsMTk2LDIxMywxNDEsMTE2LCAgNSwgMjEsIDEwLDEzMiwgMTYsCisgICAgIDk5LCAxMiwgIDAsMjQwLDE4OCwgNTUsMTg5LCA5OSwgNDksMTk4LCAxNiwgNjYsMjU0LCA5OSwyNDgsMjE5LAorICAgIDE2OSwgIDgsMTQ3LCA0NiwgODEsIDMyLDIzMiwgMTcsIDY2LCA2MCwxNDYsMTMyLDE3NiwgOTYsIDI0LDExNiwKKyAgICAgNzIsMjIxLDE3NCwxNzEsMjMxLDExNywyMjIsMTIyLDE0MiwgNTUsIDI0LDIyMywgNTQsMTgzLDIzNCwyNDUsCisgICAgICA2LCAgMCwxOTIsIDQ4LCAxMiwyMDYsICAyLDEyNiwgMTYsMTg0LCA5MywgMjMsICAwLDExMiwxNjEsMTI2LAorICAgIDE1MSwxODgsMTM3LDExNCwxODUsIDkyLDIzMCwgNTksMTQwLCAzMSwgIDQsMjA1LDEwMiwxMzksMjEwLCAzMywKKyAgICAgIDAsICAwLCA5OSwgNjksIDg1LDExMSwyMjksMTE3LDE4OSwgOTIsIDQ2LCA5MSwxNTAsMjI5LCAgNywxMjksCisgICAgMTYwLDIyMiwxMTksIDE4LCA1NSwgMjMsMjA1LDEwMiwxMzksIDQ3LDE5NCwgMjEsIDI3LCA4NywgODQsMTEwLAorICAgIDEyNiwgNTQsMTYxLDEwMCwgNTAsMTUzLDIzNiwxNzMsMTA4LCAzNCwxNDUsIDI0LCAxMiwgIDYsIDkyLCA1MiwKKyAgICAgOTgsMTQwLDIwOSwgIDcsIDQwLDE4MCwxNjQsMjIxLDIxNCwxMjYsIDY2LCAxMywyNTUsMjQwLCA0NiwgNzQsCisgICAgIDQwLCAzMCwgMzMsIDk3LCA5OSwyMTgsMjI1LDExMiwgODgsIDQyLCAyMiwxNTUsMTczLDE1MCwgNzEsIDk0LAorICAgIDI1MywxODYsMjUwLCA0MywgNjMsICA4LDEwOCwyMTksMjMwLDE1NywgNDYsMTIxLDE0MiwxMzEsMTQxLDE5OSwKKyAgICAxODgsIDk3LDE2MiwyMjcsMTE2LDE1NCwyMDUsMjMwLCA2OSwgIDksMTY1LDIyMiwxMDQsIDMyLDEzMiwxODIsCisgICAgMjA1LCA0NSwgMzAsMjI0LCA4OCwxNTAsMTY1LDE3MCwxNTQsMTY2LDIyMiwgIDIsICAwLCA1MiwgOTEsIDQ1LAorICAgIDIyMywgMTUsMjQyLDE4NiwgOTQsIDQ4LCA1NCwxMDksMjE5LDExOCwxODcsMTc0LCAzNiwgMjAsMTM3LCAyNSwKKyAgICAxODQsMTc0LDE3MSwxNzAsMjE4LDE0MCwxNzYsIDkzLCAgMSwgNjgsMjI5LDIzMCwxMDMsIDE5LCA3NCwgNTQsCisgICAgMTU1LCAyOSwxODgsIDMwLCAzMiwxMzIsIDQ4LDE5OCwyNDMsMTYyLDE0NSwgODIsMjUwLDI1MiwyMTksMjMxLAorICAgICAgOCwxNjEsMTk0LDE5OSwgIDUsMjM5LCAzMSwgOTQsIDcyLDExMSwgMjMsICAyLDI0MSwgIDgsICAwLDE2MCwKKyAgICAgOTAsMjIxLDIyOSwgOTMsMTI2LCAzMywgNzYsMTU0LCA5MSwgOTEsMjQ1LCA3MCwxOTUsIDM1LDE5NiwxMTMsCisgICAgIDU4LCAxNiwgNjYsMjExLCA1MiwxMjcsMjUyLDIyNywyMjcsMTAyLDI0NCwxNzQsMjM1LCAzNCwxMzIsIDQ2LAorICAgICA3NCwgOTQsMTc0LDIzNSwxNTQsIDkxLCA5MSwgIDAsICAwLDE5OCwxOTgsMTgyLDEwOSwyMzUsMTg2LDI1NCwKKyAgICAyMDMsMTM1LCAxNSwyMjIsMjUyLDIzNCwyMzIsIDQwLDIwNCwxNTUsIDQwLCAxMCwyNDYsMjAwLDE3MSwxNDYsCisgICAgMTE2LCAzMiwxMzcsIDQxLDE4MCwxNTcsIDE0LCA5OSwyMDQsIDQ4LCA4NiwgNDgsMjIyLDEzNywyMDIsMjA1LAorICAgIDIwNywyMDAsMTYxLDE2NCwgODIsIDQxLDI0OCwgMzAsMTY0LDE0OCwgMTQsICA2LCAgMywgOTQsMTk0LCA0NCwKKyAgICAgIDIsMTg4LDIyMSwgNTIsIDIzLDE0NywyMjAsMTY1LCA3NywyMTEsMTMyLCAxNiwyMTgsMjQ2LCA1MSwxOTksCisgICAgMTEzLDIwNCwxNzMsMTczLDIwOCwyMDcsMTE3LCA5MywyNDcsMTI1LDE1OSwyMTAsIDMzLCAxNSwxMDEsMjEzLAorICAgICAxMSwxMTgsMTY1LDI0NywxMzEsMTI4LCAyOSwyNDcsMjExLDIzOCwxODYsIDQ2LCA5OSwxMDgsIDkwLDIyMSwKKyAgICAyNDgsMTkwLCA0NywgNzgsMTQ2LCA2MCwxODEsMTU5LDEyNSwgOTMsMjUxLDIzMCwyMDQsIDYzLDI1MSwxODYsCisgICAgMjQ2LDIwNSwxMjEsMjU0LCA3NiwyMjYsMTcwLDIyOCwgIDksMTMyLCA4MCwxMTYsMjMxLDI0OSwyNDgsIDE3LAorICAgIDE2MSwxNTUsMTU5LCA2NSwgNDAsIDYwLDExMiwgMjYsIDEyLCAgNiwxNDgsMjEwLCA2OCwgMzQsIDMzLDE2OCwKKyAgICAgNTgsMTY4LCA5NiwxMDgsMTU0LDE2NiwyMzMsMTg2LDIzOCwgMjMsIDk1LDEyNiwyMzMsICA3LCAgMSwxNjcsCisgICAgMTQ5LDExNCwxODUsMjM2LDI1MSwyNTQsMTQwLCA2MCwxOTMsMTM4LCAgMiwgMzMsMjQ0LCAgOCwyNDEsIDYwLAorICAgIDEzMCwgNDksIDcwLDIzMywxMzksIDQxLDIwNywyMzMsMTE0LDE2MywgMzMsMTY1LDI1MiwgIDMsMjI3LDE4NSwKKyAgICAxMDMsMTkwLCAzMSwgMTYsMTE0LDE4MiwxMjQsIDM1LDE5NiwgNTksMjA3LDE1OSwgNzMsMTk2LCAxNSwgNzQsCisgICAgMTM1LDE3NCwyMzUsMjM0LDE4NiwxOTAsMTIyLDE5OSwxMjcsIDE3LDE4NiwyNDksMjE4LDE1MywxNDUsIDIxLAorICAgICAgMCwyMjQsMTQ3LDIyNiwgMzksMjI1LDE0MywxMzEsMTI5LDE0NCwxMDMsIDM0LDExOCwyMDIsMTE5LCAxMywKKyAgICAgOTksMjQzLDIwOSwxNjMsMTc1LDIzNCwyNDUsICA2LDE0MywgNjUsIDEwLDE5OCwxNjYsMTAxLCA4OSwxMzgsCisgICAgMTMwLDEwMywyMzgsMTU5LDE3NCwyMzUsMTc0LDIzNSwgMTQsMTM1LCA2NywxMjUsMTI1LDI1MywyNDIsMTE4LAorICAgICAyNSwgMjcsMjQzLDIwNywyMzEsMTIxLDIxNywgMzEsMjMzLDEwMiwgNDAsIDM2LDE0NywgNDcsMjEzLDE5OSwKKyAgICAyMDUsIDY5LDIxNSwxMTcsICAxLCAgMCwxODYsMTkwLDE5MCwxMjIsIDY3LDEzOSwyMDgsMjA1LDIxNSwyMDYsCisgICAgIDIwLCA2NiwyNTQsIDYzLDEyNSwxOTAsMTc3LCAzNSwxMzIsIDUwLCAzMSwxMDIsIDY0LDI0NywyMDUsMTExLAorICAgIDI0OSwyMTksMTY4LCAzOCwxNDcsMjAxLDIyOSwxNDMsMjQ3LDI0OSwxNzMsIDU4LDIzMSwxNjMsIDIyLDE3MCwKKyAgICAxNzAsMjE4LDE4MiwyMDUsIDI0LDE3MSwgODQsMjM4LDI0MSwgODMsMTU4LDI0MywgOTksMTg2LCA0NCwgOTAsCisgICAgMjA3LDIzNSwyNDUsIDcwLDE2MywyMzcsIDU2LCA2MCwgNjUsIDkxLDExMSwgNTIsIDMyLDEzMiwxMTYsIDU2LAorICAgICAgNCwgIDAsMTIwLDEzMiwgODAsIDc0LCA2OSwxMDAsMjQyLDE2NSwyNTAsMTg0LDE4NSwyMzIsMTE2LCA1OCwKKyAgICAgIDgsMTYxLCA4NSwxNDEsMTE5LDE2MiwxMTQsMjQzLDE4MSwgNTEsMTMzLDE0NCwyMzEsMTIxLDIyMCwgMTgsCisgICAgMTk4LCA1NiwyNTUsIDY1LCA2MiwxNDgsIDY3LDI1MiwxNDksMTUzLDI0NCwgOTUsMTgwLDIyMSwxMTAsIDk1LAorICAgIDExNCwgNzIsMTI5LCAzMSwyNDAsIDE5LCAyOCwgIDgsMTYxLDEwNSwxMTAsMTU3LDI1NCwxOTksMTIxLCA5MywKKyAgICAxODMsIDQ0LCAxMSwgMzMsMTMyLCAyMSwyMjksMTYyLDEzMiwxOTQsIDM1LCAzOCwgNjYsIDk0LDIyOSwxMTcsCisgICAgIDI5LCA0MywxMzgsIDk3LCAyNCwxODIsMTA5LDExOSwgNTgsIDI5LDI1NCwgOTEsMTI2LCA5MCwgNzYsMjMzLAorICAgICA0OCwgIDgsMTI0LDIxMSwgNTIsMTYzLDIwNSwyMjgsMjM5LDIzNiwyMjAsMTI1LDEwNywxNTksMjM5LCA4OCwKKyAgICAgIDEsMjQ4LCA2NSwyMjQsMjUxLDI1NCwxMTYsMjQ0LDE4OSwgOTgsMjQxLCA3OCwgODQsMTEwLDE5MCwxMTgsCisgICAgMTA2LDIxNiwyMzksIDE1LCAgNiwxMzEsMjA4LCAxMywgIDYsMTMxLCA2NSwyNTEsMjUxLCA1NCwgOTksMTQwLAorICAgIDE5MSwgNDcsMTQ3LCA5NSwyMjgsIDE1LCA4NiwxNDIsIDcwLCAzNSwyNTQsMTcxLDIyOSwxMzQsIDg0LCA0MiwKKyAgICAgMjEsMjQ1LDE4OCwyMDYsIDI0LDE5NSwgNjMsIDEzLDExMiwxNzAsMjEzLDIyMSwxMDUsMjE3LCA4MiwxNzMsCisgICAgMjM4LDE2MiwgNTIsMTMwLCA0OCwgMjUsIDk0LCA1NSwgMTIsMTMxLDEwMywgODgsMjA3LCAxNSwgOTMsMjE1LAorICAgICAyOSwxOTksMjI1LDE5NywyNDUsMjQ3LCA0MywyNDcsMTE2LDEyNSwgNjEsMjQwLDEzMSwgNTIsIDY2LCAgNSwKKyAgICAgOTksIDE5LCAgMCwxMjgsIDgwLDE1NCwxMjAsMTY0LCA4NCwyNTAsIDY4LDE4NywgOTYsMTg2LDI0NywgNjAsCisgICAgIDkyLCAzOCwyMjEsMjQyLDIzMCwxOTQsMTEzLCA1OCwgIDAsICAwLDEyNiwgNjIsIDI0LCAyNywxNTgsIDg4LAorICAgICAgNywxNDgsIDE0LDExOSwxMTgsMjM4LCAxMCwgOTMsIDYwLDIwOSwxODYsMjQ5LDEwNSwxMzIsIDUwLCAzNSwKKyAgICAxMTQsIDM4LDE0NywyMDEsIDczLDEwMywxODAsMTY3LDI1MiwyMzQsIDUwLDI1NCwgNTQsMjI3LDIxMywyMjUsCisgICAgMTQzLDIyNSwgNTUsICA4LDE2NSwgNDcsMTcwLCAzNSwxMTgsMjAyLDEwMSwyMTUsMTE3LDEwNywxMjMsMTIzLAorICAgIDE4OCwxODQsIDYyLDE3NSwyMzUsMjExLCAzNCwgODYsIDgzLDIxMywyMDAsMTY5LCA2OCwgOTgsIDM3LCAgOCwKKyAgICAxOTcsMTkzLCAyNCwxOTksIDkyLDEyNiwyMjYsIDU2LCAxNCwxMzIsIDgwLDI0NCwgODYsIDIwLDE3MywxNTUsCisgICAgMTkxLDExNywxNjUsMjQ3LCA5MiwyMjQsIDgwLCA3NCwxOTEsMjQ4LDI0MiwyMDMsMTIyLDE4OSwyMjUsIDI5LAorICAgICA4NywxODEsMTIwLDEzMiwxODAsMTU3LDIwNiwgMTksMjM1LDEyOCwgMzEsIDUxLCA3MywgNzIsMTMyLDE2MCwKKyAgICAxMTYsMTA0LDExMCwxMDksMTQ5LDIwMywxMTksMjI3LCA1MiwyMDIsIDg3LDE2NiwxMjYsMjExLCA4MiwgNTQsCisgICAgMTExLDIyNywxOTUsMTI5LCA4OCwgODEsMTI2LDI0NywyNDksMjMxLDI0NSwgNzAsMTYzLDIxNywxMDYsMjQxLAorICAgIDIyMCwyMDUsMTE2LCA2NCwgIDQsMTQ3LCA4MCwxODYsMTQ0LDE5NiwgNTIsIDE2LCA3NCwgOTUsMTY4LCAyNiwKKyAgICAgNTksMTYyLCA3MiwgMzYsICAwLCAgMCwxNTYsMTUzLCA4MiwxNDgsMTMyLDExNCwgOTMsMTE2LDIwMiwgNzgsCisgICAgMjQ5LDIzOCwgNzgsMjQ5LCA0NiwxNjUsIDY3LCA1OCwxNjQsMTI4LCA2MywxNzMsIDMyLDIxMSwgMjgsIDE4LAorICAgIDIxNSwgIDYsIDY1LCAxNiwgOTYsMTQwLDExMSwyMjAsMTU0LDEyNCwyMTksIDk1LDE3NiwxODAsIDY4LCAyMiwKKyAgICAgNzAsIDY2LCAzNCwgIDYsMjIwLDE3NSwyMjAsMTg3LDEzNywyNTUsMTgyLDEwOCwxNjMsIDMzLCAzMywgMzMsCisgICAgIDE3LCAyNSwyNTQsIDYzLDE4MSwgMzQsMTQ4LDIwNiwyMTksMTc4LCAyMiwxNTMsICAwLCAgMCwgIDAsICAwLAorICAgICA3MywgNjksIDc4LCA2OCwxNzQsIDY2LCA5NiwxMzAKK307CisKKworc3RhdGljIGNvbnN0IEZpbGVFbnRyeSAgX2ZpbGVfZW50cmllc1tdID0KK3sKKworICAgIHsgImFycm93X2Rvd24ucG5nIiwgX2RhdGFfYXJyb3dfZG93bl9wbmcsIDM0MzggfSwKKyAgICB7ICJhcnJvd19sZWZ0LnBuZyIsIF9kYXRhX2Fycm93X2xlZnRfcG5nLCA0MTIyIH0sCisgICAgeyAiYXJyb3dfcmlnaHQucG5nIiwgX2RhdGFfYXJyb3dfcmlnaHRfcG5nLCA0MTQ3IH0sCisgICAgeyAiYXJyb3dfdXAucG5nIiwgX2RhdGFfYXJyb3dfdXBfcG5nLCAzNDkzIH0sCisgICAgeyAiYmFjay5wbmciLCBfZGF0YV9iYWNrX3BuZywgMzU2NCB9LAorICAgIHsgImVuZC5wbmciLCBfZGF0YV9lbmRfcG5nLCAzNTYyIH0sCisgICAgeyAiaG9tZS5wbmciLCBfZGF0YV9ob21lX3BuZywgMzU3OCB9LAorICAgIHsgImtleS5wbmciLCBfZGF0YV9rZXlfcG5nLCAyODU3IH0sCisgICAgeyAibGF5b3V0IiwgX2RhdGFfbGF5b3V0LCA3NzE0IH0sCisgICAgeyAibWVudS5wbmciLCBfZGF0YV9tZW51X3BuZywgMzA3OSB9LAorICAgIHsgInBvd2VyLnBuZyIsIF9kYXRhX3Bvd2VyX3BuZywgMzc4MiB9LAorICAgIHsgInNlbGVjdC5wbmciLCBfZGF0YV9zZWxlY3RfcG5nLCAzMzc0IH0sCisgICAgeyAic2VuZC5wbmciLCBfZGF0YV9zZW5kX3BuZywgMzU2MSB9LAorICAgIHsgInNwYWNlYmFyLnBuZyIsIF9kYXRhX3NwYWNlYmFyX3BuZywgMjkxNiB9LAorICAgIHsgInZvbHVtZV9kb3duLnBuZyIsIF9kYXRhX3ZvbHVtZV9kb3duX3BuZywgMzU4NiB9LAorICAgIHsgInZvbHVtZV91cC5wbmciLCBfZGF0YV92b2x1bWVfdXBfcG5nLCAzODU2IH0sCisgICAgeyAiZGV2aWNlLnBuZyIsIF9kYXRhX2RldmljZV9wbmcsIDQ1NTExIH0sCisgICAgeyAia2V5Ym9hcmQucG5nIiwgX2RhdGFfa2V5Ym9hcmRfcG5nLCAxMTAzMiB9LAorICAgIHsgTlVMTCwgTlVMTCwgMCB9Cit9OworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi9zb3VyY2VzLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vc291cmNlcy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODA2NGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vc291cmNlcy5tawpAQCAtMCwwICsxLDI3IEBACisjIERlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIGVtdWxhdG9yJ3MgVUkgaW1wbGVtZW50YXRpb24uCisKK0FORFJPSURfU0tJTl9MRExJQlMgOj0KK0FORFJPSURfU0tJTl9DRkxBR1MgOj0KK0FORFJPSURfU0tJTl9JTkNMVURFUyA6PQorQU5EUk9JRF9TS0lOX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworQU5EUk9JRF9TS0lOX1FUX01PQ19TUkNfRklMRVMgOj0KK0FORFJPSURfU0tJTl9RVF9SRVNPVVJDRVMgOj0KKworQU5EUk9JRF9TS0lOX1NPVVJDRVMgOj0gXAorICAgIGFuZHJvaWQvc2tpbi9jaGFybWFwLmMgXAorICAgIGFuZHJvaWQvc2tpbi9yZWN0LmMgXAorICAgIGFuZHJvaWQvc2tpbi9pbWFnZS5jIFwKKyAgICBhbmRyb2lkL3NraW4vdHJhY2tiYWxsLmMgXAorICAgIGFuZHJvaWQvc2tpbi9rZXlib2FyZC5jIFwKKyAgICBhbmRyb2lkL3NraW4va2V5Y29kZS5jIFwKKyAgICBhbmRyb2lkL3NraW4va2V5Y29kZS1idWZmZXIuYyBcCisgICAgYW5kcm9pZC9za2luL2ZpbGUuYyBcCisgICAgYW5kcm9pZC9za2luL3dpbmRvdy5jIFwKKyAgICBhbmRyb2lkL3NraW4vcmVzb3VyY2UuYyBcCisgICAgYW5kcm9pZC9za2luL3VpLmMgXAorCisjIGVuYWJsZSBNTVggY29kZSBmb3Igb3VyIHNraW4gc2NhbGVyCitBTkRST0lEX1NLSU5fQ0ZMQUdTICs9IC1EVVNFX01NWD0xIC1tbW14CisKK2luY2x1ZGUgJChfQU5EUk9JRF9FTVVfUk9PVCkvYW5kcm9pZC9za2luL3F0L3NvdXJjZXMubWsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3N1cmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3N1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTAzOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vc3VyZmFjZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBBIFNraW5TdXJmYWNlIG1vZGVscyBhIDMyLWJpdCBBUkdCIHBpeGVsIGltYWdlIHRoYXQgY2FuIGJlIGJsaXR0ZWQgdG8gb3IgZnJvbQorICovCit0eXBlZGVmIHN0cnVjdCBTa2luU3VyZmFjZSAgU2tpblN1cmZhY2U7CisKK3N0cnVjdCBTa2luU2NhbGVyOworCisvKiBEZWNyZW1lbnQgYSBzdXJmYWNlJ3MgcmVmZXJlbmNlIGNvdW50LiBUYWtlcyB0aGUgc3VyZmFjZSdzIGFkZHJlc3MgYXMgcGFyYW1ldGVyLgorICAgSXQgd2lsbCBiZSBzZXQgdG8gTlVMTCBvbiBleGl0ICovCitleHRlcm4gdm9pZCAgICAgICAgICBza2luX3N1cmZhY2VfdW5yZWZwKCBTa2luU3VyZmFjZSogICpwc3VyZmFjZSApOworCitleHRlcm4gaW50IHNraW5fc3VyZmFjZV93aWR0aChTa2luU3VyZmFjZSogcyk7CitleHRlcm4gaW50IHNraW5fc3VyZmFjZV9oZWlnaHQoU2tpblN1cmZhY2UqIHMpOworCisvKiBDcmVhdGUgYSBzdXJmYWNlIGZvciB0aGUgZ2l2ZW4gZGltZW5zaW9ucy4gVGhlICJvcmlnaW5hbCIgZGltZW5zaW9ucyBhcmUgdGhlIGRpbWVuc2lvbnMKKyAqIG9mIHRoZSBvcmlnaW5hbCBpbWFnZSwgd2hpbGUgdGhlIHJlZ3VsYXIgZGltZW5zaW9ucyBhcmUgdGhvc2UgYXQgd2hpY2ggdGhlIGltYWdlIGlzIHNjYWxlZCB0bworICogZm9yIGRpc3BsYXkuCisgKi8KK2V4dGVybiBTa2luU3VyZmFjZSogIHNraW5fc3VyZmFjZV9jcmVhdGUoIGludCB3LCBpbnQgaCwgaW50IG9yaWdpbmFsX3csIGludCBvcmlnaW5hbF9oICk7CisKKy8qIENyZWF0ZSBhIHN1cmZhY2UgZnJvbSBhIGdpdmVuIHBpeGVsIGJ1ZmZlci4gKi8KK2V4dGVybiBTa2luU3VyZmFjZSogIHNraW5fc3VyZmFjZV9jcmVhdGVfYXJnYjMyX2Zyb20oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAgICAgICAgICAgIHBpeGVscyk7CisKKy8qIENoZWNrIGlmIGEgc3VyZmFjZSBuZWVkcyB0byBiZSByZXNpemVkIGF0IGFsbDogb25seSB3aGVuIHRoZSAib3JpZ2luYWwiIGRpbWVuc2lvbnMgY2hhbmdlCisgKiBkb2VzIHRoZSBzdXJmYWNlIG5lZWQgdG8gYmUgcmUtY3JlYXRlZC4gT3RoZXJ3aXNlLCBpdCBjYW4gc2ltcGx5IGJlIHVwZGF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUKKyAqIGluZm9ybWF0aW9uIHRvIGF2b2lkIGV4dHJhIGNvbXB1dGF0aW9uLiBJZiBnaXZlbiBhIE5VTEwgc3VyZmFjZSwgY3JlYXRlIGEgbmV3IG9uZS4KKyAqLworZXh0ZXJuIFNraW5TdXJmYWNlKiAgc2tpbl9zdXJmYWNlX3Jlc2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZ2luYWxfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZ2luYWxfaCApOworCitleHRlcm4gdm9pZCBza2luX3N1cmZhY2VfY3JlYXRlX3dpbmRvdyhTa2luU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoKTsKKworZXh0ZXJuIHZvaWQgc2tpbl9zdXJmYWNlX3JldmVyc2VfbWFwKFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHkpOworCitleHRlcm4gdm9pZCBza2luX3N1cmZhY2VfZ2V0X3NjYWxlZF9yZWN0KFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luUmVjdCogc3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5SZWN0KiBkcmVjdCk7CisKKy8qIFN1cmZhY2UgcGl4ZWxzIGluZm9ybWF0aW9uIGZvciBzdXJmYWNlcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgICAgICAgIHc7CisgICAgaW50ICAgICAgICAgaDsKKyAgICBpbnQgICAgICAgICBwaXRjaDsKKyAgICB1aW50MzJfdCogICBwaXhlbHM7Cit9IFNraW5TdXJmYWNlUGl4ZWxzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgcl9zaGlmdDsKKyAgICB1aW50MzJfdCByX21hc2s7CisgICAgdWludDMyX3QgZ19zaGlmdDsKKyAgICB1aW50MzJfdCBnX21hc2s7CisgICAgdWludDMyX3QgYl9zaGlmdDsKKyAgICB1aW50MzJfdCBiX21hc2s7CisgICAgdWludDMyX3QgYV9zaGlmdDsKKyAgICB1aW50MzJfdCBhX21hc2s7Cit9IFNraW5TdXJmYWNlUGl4ZWxGb3JtYXQ7CisKK2V4dGVybiB2b2lkICAgIHNraW5fc3VyZmFjZV91cGRhdGUoU2tpblN1cmZhY2UqIHN1cmZhY2UsIFNraW5SZWN0KiByZWN0KTsKKworZXh0ZXJuIHZvaWQgICAgc2tpbl9zdXJmYWNlX3VwbG9hZChTa2luU3VyZmFjZSogc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJlY3QqIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoKTsKKworLyogTGlzdCBvZiBjb21wb3NpdGlvbiBvcGVyYXRvcnMgZm9yIHRoZSBibGl0IHJvdXRpbmUgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgU0tJTl9CTElUX0NPUFkgPSAwLAorICAgIFNLSU5fQkxJVF9TUkNPVkVSLAorfSBTa2luQmxpdE9wOworCisKKy8qIEJsaXQgYSBzdXJmYWNlIGludG8gYW5vdGhlciBvbmUgKi8KK2V4dGVybiB2b2lkICAgIHNraW5fc3VyZmFjZV9ibGl0KCBTa2luU3VyZmFjZSogIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUG9zKiAgICAgIGRzdF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblN1cmZhY2UqICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJlY3QqICAgICBzcmNfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luQmxpdE9wICAgIGJsaXRvcCApOworCisvKiBCbGl0IGEgY29sb3JlZCByZWN0YW5nbGUgaW50byBhIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KK2V4dGVybiB2b2lkICAgIHNraW5fc3VyZmFjZV9maWxsKFNraW5TdXJmYWNlKiAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJlY3QqICAgICByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICBhcmdiX3ByZW11bCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi90cmFja2JhbGwuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3RyYWNrYmFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDEzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi90cmFja2JhbGwuYwpAQCAtMCwwICsxLDY0NCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi90cmFja2JhbGwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vaW1hZ2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgc3RhcnQgb2YgdGhpcyBtb2R1bGUuCitzdGF0aWMgdWludDMyX3QgZ2V0X3RpY2tzKHZvaWQpIHsKKyAgICBzdGF0aWMgaW50IHRpY2tfaW5pdDsKKyAgICBzdGF0aWMgdWludDMyX3QgdGlja19vZmZzZXQ7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworICAgIHVpbnQzMl90IG5vdyA9CisgICAgICAgICAgICAodWludDMyX3QpKHR2LnR2X3NlYyAqIDEwMDBVKSArICh1aW50MzJfdCkodHYudHZfdXNlYyAvIDEwMDBVKTsKKworICAgIGlmICghdGlja19pbml0KSB7CisgICAgICAgIHRpY2tfb2Zmc2V0ID0gbm93OworICAgICAgICB0aWNrX2luaXQgPSAxOworICAgIH0KKworICAgIHJldHVybiBub3cgLSB0aWNrX29mZnNldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgIFQgUiBBIEMgSyAgIEIgQSBMIEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBhIDMtZCB2ZWN0b3IKK3R5cGVkZWYgIGRvdWJsZSAgIFZlY3RvclJlY1szXTsKK3R5cGVkZWYgIGRvdWJsZSogIFZlY3RvcjsKKworLyogZGVmaW5lIEZJWDE2X0lTX0ZMT0FUIHRvIHVzZSBmbG9hdHMgZm9yIGNvbXB1dGF0aW9ucyAqLworI2RlZmluZSAgRklYMTZfSVNfRkxPQVQKKworI2lmZGVmIEZJWDE2X0lTX0ZMT0FUCit0eXBlZGVmIGZsb2F0ICAgRml4MTY7CisjZGVmaW5lICBGSVgxNl9PTkUgICAgICAgICAgIDEuMAorI2RlZmluZSAgRklYMTZfRlJPTV9GTE9BVCh4KSAgKHgpCisjZGVmaW5lICBGSVgxNl9UT19GTE9BVCh4KSAgICAoeCkKKworI2Vsc2UKK3R5cGVkZWYgaW50ICAgICBGaXgxNjsKKworI2RlZmluZSAgRklYMTZfU0hJRlQgIDE2CisjZGVmaW5lICBGSVgxNl9PTkUgICAgICAgICAgICAoMSA8PCBGSVgxNl9TSElGVCkKKyNkZWZpbmUgIEZJWDE2X0ZST01fRkxPQVQoeCkgIChGaXgxNikoKHgpICogRklYMTZfT05FKQorI2RlZmluZSAgRklYMTZfVE9fRkxPQVQoeCkgICAgKCh4KS8oMS4wKkZJWDE2X09ORSkpCisKKyNlbmRpZgorCit0eXBlZGVmIEZpeDE2ICAgRml4MTZWZWN0b3JSZWNbM107Cit0eXBlZGVmIEZpeDE2KiAgRml4MTZWZWN0b3I7CisKK3N0YXRpYyBGaXgxNgorZml4ZWR2ZWN0b3JfbGVuKCBGaXgxNlZlY3RvciAgdiApCit7CisgICAgZG91YmxlICB4ID0gRklYMTZfVE9fRkxPQVQodlswXSk7CisgICAgZG91YmxlICB5ID0gRklYMTZfVE9fRkxPQVQodlsxXSk7CisgICAgZG91YmxlICB6ID0gRklYMTZfVE9fRkxPQVQodlsyXSk7CisgICAgZG91YmxlICBsZW4gPSBzcXJ0KCB4KnggKyB5KnkgKyB6KnogKTsKKworICAgIHJldHVybiBGSVgxNl9GUk9NX0ZMT0FUKGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitmaXhlZHZlY3Rvcl9mcm9tX3ZlY3RvciggRml4MTZWZWN0b3IgIGYsIFZlY3RvciAgdiApCit7CisgICAgZlswXSA9IEZJWDE2X0ZST01fRkxPQVQodlswXSk7CisgICAgZlsxXSA9IEZJWDE2X0ZST01fRkxPQVQodlsxXSk7CisgICAgZlsyXSA9IEZJWDE2X0ZST01fRkxPQVQodlsyXSk7Cit9CisKKworI2lmZGVmIEZJWDE2X0lTX0ZMT0FUCitzdGF0aWMgZG91YmxlCitmaXhlZHZlY3Rvcl9kb3QoIEZpeDE2VmVjdG9yICB1LCBGaXgxNlZlY3RvciAgdiApCit7CisgICAgcmV0dXJuIHVbMF0qdlswXSArIHVbMV0qdlsxXSArIHVbMl0qdlsyXTsKK30KKyNlbHNlCitzdGF0aWMgRml4MTYKK2ZpeGVkdmVjdG9yX2RvdCggRml4MTZWZWN0b3IgIHUsIEZpeDE2VmVjdG9yICB2ICkKK3sKKyAgICBsb25nIGxvbmcgIHQ7CisKKyAgICB0ID0gKGxvbmcgbG9uZyl1WzBdICogdlswXSArIChsb25nIGxvbmcpdVsxXSAqIHZbMV0gKyAobG9uZyBsb25nKXVbMl0gKiB2WzJdOworICAgIHJldHVybiAoRml4MTYpKHQgPj4gRklYMTZfU0hJRlQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK25vcm0oIGludCAgZHgsIGludCAgZHkgKQoreworICAgIHJldHVybiAoaW50KSBzcXJ0KCBkeCoxLjAqZHggKyBkeSoxLjAqZHkgKTsKK30KKworLyoqKiBST1RBVE9SOiB1c2VkIHRvIHJvdGF0ZSB0aGUgcmVmZXJlbmNlIGF4aXMgd2hlbiBtb3VzZSBtb3Rpb24gaGFwcGVucworICoqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBWZWN0b3JSZWMgICBkOworICAgIFZlY3RvclJlYyAgIG47CisgICAgZG91YmxlICAgICAgYW5nbGU7CisKK30gUm90YXRvclJlYywgKlJvdGF0b3I7CisKKworI2RlZmluZSAgQU5HTEVfRkFDVE9SICAoTV9QSS8yMDApCisKK3N0YXRpYyB2b2lkCityb3RhdG9yX3Jlc2V0KCBSb3RhdG9yICByb3QsIGludCAgZHgsIGludCAgZHkgKQoreworICAgIGRvdWJsZSAgbGVuID0gc3FydCggZHgqZHggKyBkeSpkeSApOworICAgIGRvdWJsZSAgengsIHp5OworCisgICAgaWYgKGxlbiA8IDFlLTMgKSB7CisgICAgICAgIHp4ID0gMS47CisgICAgICAgIHp5ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB6eCA9IGR4IC8gbGVuOworICAgICAgICB6eSA9IGR5IC8gbGVuOworICAgIH0KKyAgICByb3QtPmRbMF0gPSB6eDsKKyAgICByb3QtPmRbMV0gPSB6eTsKKyAgICByb3QtPmRbMl0gPSAwLjsKKworICAgIHJvdC0+blswXSA9IC1yb3QtPmRbMV07CisgICAgcm90LT5uWzFdID0gIHJvdC0+ZFswXTsKKyAgICByb3QtPm5bMl0gPSAwOworCisgICAgcm90LT5hbmdsZSA9IGxlbiAqIEFOR0xFX0ZBQ1RPUjsKK30KKworc3RhdGljIHZvaWQKK3JvdGF0b3JfYXBwbHkoIFJvdGF0b3IgIHJvdCwgZG91YmxlKiAgdmVjICkKK3sKKyAgICBkb3VibGUgICBkLCBuLCB6LCBkMiwgejIsIGNzLCBzbjsKKworICAgIC8qIHByb2plY3Qgb24gRCwgTiwgWiAqLworICAgIGQgPSB2ZWNbMF0qcm90LT5kWzBdICsgdmVjWzFdKnJvdC0+ZFsxXTsKKyAgICBuID0gdmVjWzBdKnJvdC0+blswXSArIHZlY1sxXSpyb3QtPm5bMV07CisgICAgeiA9IHZlY1syXTsKKworICAgIC8qIHJvdGF0ZSBvbiBELCBaICovCisgICAgY3MgPSBjb3MoIHJvdC0+YW5nbGUgKTsKKyAgICBzbiA9IHNpbiggcm90LT5hbmdsZSApOworCisgICAgZDIgPSAgY3MqZCArIHNuKno7CisgICAgejIgPSAtc24qZCArIGNzKno7CisKKyAgICAvKiBwcm9qZWN0IG9uIFgsIFksIFogKi8KKyAgICB2ZWNbMF0gPSBkMipyb3QtPmRbMF0gKyBuKnJvdC0+blswXTsKKyAgICB2ZWNbMV0gPSBkMipyb3QtPmRbMV0gKyBuKnJvdC0+blsxXTsKKyAgICB2ZWNbMl0gPSB6MjsKK30KKworLyoqKiBUUkFDS0JBTEwgT0JKRUNUCisgKioqLwordHlwZWRlZiBzdHJ1Y3QgeyBpbnQgIHgsIHksIG9mZnNldCwgYWxwaGE7IEZpeDE2VmVjdG9yUmVjICBmOyB9IFNwaGVyZUNvb3JkUmVjLCAqU3BoZXJlQ29vcmQ7CisKK3R5cGVkZWYgc3RydWN0IFNraW5UcmFja0JhbGwKK3sKKyAgICBpbnQgICAgICAgICAgICAgZGlhbWV0ZXI7CisgICAgdW5zaWduZWQqICAgICAgIHBpeGVsczsKKyAgICBTa2luU3VyZmFjZSogICAgc3VyZmFjZTsKKyAgICBWZWN0b3JSZWMgICAgICAgYXhlc1szXTsgIC8qIGN1cnJlbnQgYmFsbCBheGVzICovCisKKyNkZWZpbmUgIERPVF9HUklEICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNlbGxzIHBlciBzaWRlIGdyaWQgKi8KKyNkZWZpbmUgIERPVF9DRUxMUyAgICAgICAyICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJhbmRvbSBkb3RzIHBlciBjZWxsICovCisjZGVmaW5lICBET1RfTUFYICAgICAgICAgKDYqRE9UX0dSSUQqRE9UX0dSSUQqRE9UX0NFTExTKSAgLyogdG90YWwgbnVtYmVyIG9mIGRvdHMgKi8KKyNkZWZpbmUgIERPVF9SQU5ET01fWCAgICAxMDA3ICAgICAgICAgICAgICAgICAgICAgLyogaG9yaXpvbnRhbCByYW5kb20gcmFuZ2UgaW4gZWFjaCBjZWxsICovCisjZGVmaW5lICBET1RfUkFORE9NX1kgICAgMTAwNyAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnRpY2FsIHJhbmRvbSByYW5nZSBpbiBlYWNoIGNlbGwgKi8KKworI2RlZmluZSAgRE9UX1RIUkVTSE9MRCAgRklYMTZfRlJPTV9GTE9BVCgwLjE3KQorCisgICAgRml4MTZWZWN0b3JSZWMgICBkb3RzWyBET1RfTUFYIF07CisKKyAgICBTcGhlcmVDb29yZFJlYyogIHNwaGVyZV9tYXA7CisgICAgaW50ICAgICAgICAgICAgICBzcGhlcmVfY291bnQ7CisKKyAgICB1bnNpZ25lZCAgICAgICAgIGJhbGxfY29sb3I7CisgICAgdW5zaWduZWQgICAgICAgICBkb3RfY29sb3I7CisgICAgdW5zaWduZWQgICAgICAgICByaW5nX2NvbG9yOworCisgICAgdWludDMyX3QgICAgICAgICB0aWNrc19sYXN0OyAgLyogdGlja3Mgc2luY2UgbGFzdCBtb3ZlICovCisgICAgaW50ICAgICAgICAgICAgICBhY2NfeDsKKyAgICBpbnQgICAgICAgICAgICAgIGFjY195OworICAgIGludCAgICAgICAgICAgICAgYWNjX3RocmVzaG9sZDsKKyAgICBkb3VibGUgICAgICAgICAgIGFjY19zY2FsZTsKKworICAgIC8qIHJvdGF0aW9uIGFwcGxpZWQgdG8gZXZlbnRzIHNlbmQgdG8gdGhlIHN5c3RlbSAqLworICAgIFNraW5Sb3RhdGlvbiAgICAgcm90YXRpb247CisKKyAgICBTa2luVHJhY2tCYWxsRXZlbnRGdW5jIGV2ZW50X2Z1bmM7CisKK30gVHJhY2tCYWxsUmVjLCAqVHJhY2tCYWxsOworCisKKy8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFyZSB1c2VkIHRvIGJldHRlciBtaW1pYyBhIHJlYWwgdHJhY2tiYWxsLgorICoKKyAqIEFDQ19USFJFU0hPTEQgaXMgdXNlZCB0byBmaWx0ZXIgc21hbGwgYmFsbCBtb3ZlbWVudHMgb3V0LgorICogSWYgdGhlIGxlbmd0aCBvZiB0aGUgcmVsYXRpdmUgbW91c2UgbW90aW9uIGlzIHNtYWxsZXIgdGhhbiB0aGlzCisgKiBjb25zdGFudCwgdGhlbiBubyBjb3JyZXNwb25kaW5nIGJhbGwgZXZlbnQgd2lsbCBiZSBzZW50IHRvIHRoZQorICogc3lzdGVtLgorICoKKyAqIEFDQ19TQ0FMRSBpcyB1c2VkIHRvIHNjYWxlIHRoZSByZWxhdGl2ZSBtb3VzZSBtb3Rpb24gdmVjdG9yIGludG8KKyAqIHRoZSBjb3JyZXNwb25kaW5nIGJhbGwgbW90aW9uIHZlY3Rvci4KKyAqLworI2RlZmluZSAgQUNDX1RIUkVTSE9MRCAgMjAKKyNkZWZpbmUgIEFDQ19TQ0FMRSAgICAgIDAuMgorCitzdGF0aWMgdm9pZAordHJhY2tiYWxsX2luaXQoVHJhY2tCYWxsICBiYWxsLCBpbnQgIGRpYW1ldGVyLCBpbnQgIHJpbmcsCisgICAgICAgICAgICAgICB1bnNpZ25lZCAgIGJhbGxfY29sb3IsIHVuc2lnbmVkICBkb3RfY29sb3IsCisgICAgICAgICAgICAgICB1bnNpZ25lZCAgIHJpbmdfY29sb3IsCisgICAgICAgICAgICAgICBTa2luVHJhY2tCYWxsRXZlbnRGdW5jIGV2ZW50X2Z1bmMpIHsKKyAgICBpbnQgIGRpYW1ldGVyMiA9IGRpYW1ldGVyICsgcmluZyoyOworCisgICAgbWVtc2V0KCBiYWxsLCAwLCBzaXplb2YoKmJhbGwpICk7CisKKyAgICBiYWxsLT5hY2NfdGhyZXNob2xkID0gQUNDX1RIUkVTSE9MRDsKKyAgICBiYWxsLT5hY2Nfc2NhbGUgICAgID0gQUNDX1NDQUxFOworCisgICAgYmFsbC0+ZXZlbnRfZnVuYyA9IGV2ZW50X2Z1bmM7CisKKyAgICAvKiBpbml0IFNETCBzdXJmYWNlICovCisgICAgYmFsbC0+ZGlhbWV0ZXIgICA9IGRpYW1ldGVyMjsKKyAgICBiYWxsLT5iYWxsX2NvbG9yID0gYmFsbF9jb2xvcjsKKyAgICBiYWxsLT5kb3RfY29sb3IgID0gZG90X2NvbG9yOworICAgIGJhbGwtPnJpbmdfY29sb3IgPSByaW5nX2NvbG9yOworCisgICAgYmFsbC0+cm90YXRpb24gICA9IFNLSU5fUk9UQVRJT05fMDsKKworICAgIGJhbGwtPnBpeGVscyAgID0gKHVuc2lnbmVkKiljYWxsb2MoIGRpYW1ldGVyMipkaWFtZXRlcjIsIHNpemVvZih1bnNpZ25lZCkgKTsKKyAgICBiYWxsLT5zdXJmYWNlICA9IHNraW5fc3VyZmFjZV9jcmVhdGUoZGlhbWV0ZXIyLCBkaWFtZXRlcjIsIGRpYW1ldGVyMiwgZGlhbWV0ZXIyKTsKKworICAgIC8qIGluaXQgYXhlcyAqLworICAgIGJhbGwtPmF4ZXNbMF1bMF0gPSAxLjsgYmFsbC0+YXhlc1swXVsxXSA9IDAuOyBiYWxsLT5heGVzWzBdWzJdID0gMC47CisgICAgYmFsbC0+YXhlc1sxXVswXSA9IDAuOyBiYWxsLT5heGVzWzFdWzFdID0gMS47IGJhbGwtPmF4ZXNbMV1bMl0gPSAwLjsKKyAgICBiYWxsLT5heGVzWzJdWzBdID0gMC47IGJhbGwtPmF4ZXNbMl1bMV0gPSAwLjsgYmFsbC0+YXhlc1syXVsyXSA9IDEuOworCisgICAgLyogaW5pdCBkb3RzICovCisgICAgeworICAgICAgICBpbnQgIHNpZGUsIG5uID0gMDsKKworICAgICAgICBmb3IgKHNpZGUgPSAwOyBzaWRlIDwgNjsgc2lkZSsrKSB7CisgICAgICAgICAgICBWZWN0b3JSZWMgIG9yaWdpbiwgYXhpczEsIGF4aXMyOworICAgICAgICAgICAgaW50ICAgICAgICB4eCwgeXk7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc2lkZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG9yaWdpblswXSA9IC0xOyBvcmlnaW5bMV0gPSAtMTsgb3JpZ2luWzJdID0gKzE7CisgICAgICAgICAgICAgICAgYXhpczEgWzBdID0gIDE7IGF4aXMxIFsxXSA9ICAwOyBheGlzMSBbMl0gPSAgMDsKKyAgICAgICAgICAgICAgICBheGlzMiBbMF0gPSAgMDsgYXhpczIgWzFdID0gIDE7IGF4aXMyIFsyXSA9ICAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIG9yaWdpblswXSA9IC0xOyBvcmlnaW5bMV0gPSAtMTsgb3JpZ2luWzJdID0gLTE7CisgICAgICAgICAgICAgICAgYXhpczEgWzBdID0gIDE7IGF4aXMxIFsxXSA9ICAwOyBheGlzMSBbMl0gPSAgMDsKKyAgICAgICAgICAgICAgICBheGlzMiBbMF0gPSAgMDsgYXhpczIgWzFdID0gIDE7IGF4aXMyIFsyXSA9ICAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIG9yaWdpblswXSA9ICsxOyBvcmlnaW5bMV0gPSAtMTsgb3JpZ2luWzJdID0gLTE7CisgICAgICAgICAgICAgICAgYXhpczEgWzBdID0gIDA7IGF4aXMxIFsxXSA9ICAwOyBheGlzMSBbMl0gPSAgMTsKKyAgICAgICAgICAgICAgICBheGlzMiBbMF0gPSAgMDsgYXhpczIgWzFdID0gIDE7IGF4aXMyIFsyXSA9ICAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIG9yaWdpblswXSA9IC0xOyBvcmlnaW5bMV0gPSAtMTsgb3JpZ2luWzJdID0gLTE7CisgICAgICAgICAgICAgICAgYXhpczEgWzBdID0gIDA7IGF4aXMxIFsxXSA9ICAwOyBheGlzMSBbMl0gPSAgMTsKKyAgICAgICAgICAgICAgICBheGlzMiBbMF0gPSAgMDsgYXhpczIgWzFdID0gIDE7IGF4aXMyIFsyXSA9ICAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIG9yaWdpblswXSA9IC0xOyBvcmlnaW5bMV0gPSAtMTsgb3JpZ2luWzJdID0gLTE7CisgICAgICAgICAgICAgICAgYXhpczEgWzBdID0gIDE7IGF4aXMxIFsxXSA9ICAwOyBheGlzMSBbMl0gPSAgMDsKKyAgICAgICAgICAgICAgICBheGlzMiBbMF0gPSAgMDsgYXhpczIgWzFdID0gIDA7IGF4aXMyIFsyXSA9ICAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBvcmlnaW5bMF0gPSAtMTsgb3JpZ2luWzFdID0gKzE7IG9yaWdpblsyXSA9IC0xOworICAgICAgICAgICAgICAgIGF4aXMxIFswXSA9ICAxOyBheGlzMSBbMV0gPSAgMDsgYXhpczEgWzJdID0gIDA7CisgICAgICAgICAgICAgICAgYXhpczIgWzBdID0gIDA7IGF4aXMyIFsxXSA9ICAwOyBheGlzMiBbMl0gPSAgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgRE9UX0dSSUQ7IHh4KyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgIHR4ID0geHgqKDIuL0RPVF9HUklEKTsKKyAgICAgICAgICAgICAgICBmb3IgKHl5ID0gMDsgeXkgPCBET1RfR1JJRDsgeXkrKykgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHR5ID0geXkqKDIuL0RPVF9HUklEKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlICB4MCAgPSBvcmlnaW5bMF0gKyBheGlzMVswXSp0eCArIGF4aXMyWzBdKnR5OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHkwICA9IG9yaWdpblsxXSArIGF4aXMxWzFdKnR4ICsgYXhpczJbMV0qdHk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgejAgID0gb3JpZ2luWzJdICsgYXhpczFbMl0qdHggKyBheGlzMlsyXSp0eTsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICBjYzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjYyA9IDA7IGNjIDwgRE9UX0NFTExTOyBjYysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGggPSAocmFuZCgpICUgRE9UX1JBTkRPTV9YKS8oKGRvdWJsZSlET1RfUkFORE9NX1gqRE9UX0dSSUQvMik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHYgPSAocmFuZCgpICUgRE9UX1JBTkRPTV9ZKS8oKGRvdWJsZSlET1RfUkFORE9NX1kqRE9UX0dSSUQvMik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHggPSB4MCArIGF4aXMxWzBdKmggKyBheGlzMlswXSp2OworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICB5ID0geTAgKyBheGlzMVsxXSpoICsgYXhpczJbMV0qdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgeiA9IHowICsgYXhpczFbMl0qaCArIGF4aXMyWzJdKnY7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGludmxlbiA9IDEvc3FydCggeCp4ICsgeSp5ICsgeip6ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwtPmRvdHNbbm5dWzBdID0gRklYMTZfRlJPTV9GTE9BVCh4Kmludmxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLT5kb3RzW25uXVsxXSA9IEZJWDE2X0ZST01fRkxPQVQoeSppbnZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYmFsbC0+ZG90c1tubl1bMl0gPSBGSVgxNl9GUk9NX0ZMT0FUKHoqaW52bGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5uKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpbml0IHNwaGVyZSAqLworICAgIHsKKyAgICAgICAgaW50ICAgICBkaWFtZXRlcjIgPSBkaWFtZXRlciArIDIqcmluZzsKKyAgICAgICAgZG91YmxlICByYWRpdXMgICAgPSBkaWFtZXRlciowLjU7CisgICAgICAgIGRvdWJsZSAgcmFkaXVzMiAgID0gZGlhbWV0ZXIyKjAuNTsKKyAgICAgICAgaW50ICAgICB4eCwgeXk7CisgICAgICAgIGludCAgICAgZW1wdHkgPSAwLCB0b3RhbCA9IDA7CisKKyAgICAgICAgYmFsbC0+c3BoZXJlX21hcCA9IGNhbGxvYyggZGlhbWV0ZXIyKmRpYW1ldGVyMiwgc2l6ZW9mKFNwaGVyZUNvb3JkUmVjKSApOworCisgICAgICAgIGZvciAoeXkgPSAwOyB5eSA8IGRpYW1ldGVyMjsgeXkrKykgeworICAgICAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgZGlhbWV0ZXIyOyB4eCsrKSB7CisgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHgwICAgID0geHggLSByYWRpdXMyOworICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB5MCAgICA9IHl5IC0gcmFkaXVzMjsKKyAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgcjAgICAgPSBzcXJ0KCB4MCp4MCArIHkwKnkwICk7CisgICAgICAgICAgICAgICAgU3BoZXJlQ29vcmQgIGNvb3JkID0gJmJhbGwtPnNwaGVyZV9tYXBbdG90YWxdOworCisgICAgICAgICAgICAgICAgaWYgKHIwIDw9IHJhZGl1cykgeyAgLyogYmFsbCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHJ4ID0geDAvcmFkaXVzOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHJ5ID0geTAvcmFkaXVzOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHJ6ID0gc3FydCggMS4wIC0gcngqcnggLSByeSpyeSApOworCisgICAgICAgICAgICAgICAgICAgIGNvb3JkLT54ICAgICAgPSB4eDsKKyAgICAgICAgICAgICAgICAgICAgY29vcmQtPnkgICAgICA9IHl5OworICAgICAgICAgICAgICAgICAgICBjb29yZC0+b2Zmc2V0ID0geHggKyB5eSpkaWFtZXRlcjI7CisgICAgICAgICAgICAgICAgICAgIGNvb3JkLT5hbHBoYSAgPSAyNTY7CisgICAgICAgICAgICAgICAgICAgIGNvb3JkLT5mWzBdICAgPSBGSVgxNl9GUk9NX0ZMT0FUKHJ4KTsKKyAgICAgICAgICAgICAgICAgICAgY29vcmQtPmZbMV0gICA9IEZJWDE2X0ZST01fRkxPQVQocnkpOworICAgICAgICAgICAgICAgICAgICBjb29yZC0+ZlsyXSAgID0gRklYMTZfRlJPTV9GTE9BVChyeik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyMCA+PSByYWRpdXMtMS4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLT5hbHBoYSA9IDI1NioocmFkaXVzIC0gcjApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGlsbHVtaW5hdGlvbiBtb2RlbCAqLworICAgICAgICAgICAgICAgICAgICB7CisjZGVmaW5lICBMSUdIVF9YICAgICAgICAgLTIuMAorI2RlZmluZSAgTElHSFRfWSAgICAgICAgIC0yLjUKKyNkZWZpbmUgIExJR0hUX1ogICAgICAgICAgNS4wCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgbHggPSBMSUdIVF9YIC0gcng7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGx5ID0gTElHSFRfWSAtIHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICBseiA9IExJR0hUX1ogLSByejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgbGlyID0gMS9zcXJ0KGx4Kmx4ICsgbHkqbHkgKyBseipseik7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGNvc3BoaSA9IGxpcioobHgqcnggKyBseSpyeSArIGx6KnJ6KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgc2NhbGUgID0gMS4xKmNvc3BoaSArIDAuMzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLT5hbHBoYSA9IGNvb3JkLT5hbHBoYSAqIHNjYWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyMCA8PSByYWRpdXMyKSB7IC8qIHJpbmcgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgY29vcmQtPnggICAgICA9IHh4OworICAgICAgICAgICAgICAgICAgICBjb29yZC0+eSAgICAgID0geXk7CisgICAgICAgICAgICAgICAgICAgIGNvb3JkLT5vZmZzZXQgPSB4eCArIHl5KmRpYW1ldGVyMjsKKyAgICAgICAgICAgICAgICAgICAgY29vcmQtPmFscGhhICA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChyMCA+PSByYWRpdXMyLTEuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb29yZC0+YWxwaGEgPSAtMjU2KihyMCAtIChyYWRpdXMyLTEuKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgICAgIH0gZWxzZSAgIC8qIG91dHNpZGUgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgZW1wdHkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYWxsLT5zcGhlcmVfY291bnQgPSB0b3RhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0cmFja2JhbGxfZG9uZSggVHJhY2tCYWxsICBiYWxsICkKK3sKKyAgICBmcmVlKCBiYWxsLT5zcGhlcmVfbWFwICk7CisgICAgYmFsbC0+c3BoZXJlX21hcCAgID0gTlVMTDsKKyAgICBiYWxsLT5zcGhlcmVfY291bnQgPSAwOworCisgICAgc2tpbl9zdXJmYWNlX3VucmVmcCgmYmFsbC0+c3VyZmFjZSk7CisKKyAgICBpZiAoYmFsbC0+cGl4ZWxzKSB7CisgICAgICAgIGZyZWUoIGJhbGwtPnBpeGVscyApOworICAgICAgICBiYWxsLT5waXhlbHMgPSBOVUxMOworICAgIH0KK30KKworLyoqKiBUUkFDS0JBTEwgU1BIRVJFIFBJWEVMUworICoqKi8KK3N0YXRpYyB1bnNpZ25lZAorY29sb3JfYmxlbmQoIHVuc2lnbmVkICBmcm9tLCB1bnNpZ25lZCAgdG8sICBpbnQgIGFscGhhICkKK3sKKyAgICB1bnNpZ25lZCAgZnJvbV9hZyAgICA9IChmcm9tID4+IDgpICYgMHgwMGZmMDBmZjsKKyAgICB1bnNpZ25lZCAgdG9fYWcgICAgICA9ICh0byA+PiA4KSAmIDB4MDBmZjAwZmY7CisgICAgdW5zaWduZWQgIGZyb21fcmIgICAgPSBmcm9tICYgMHgwMGZmMDBmZjsKKyAgICB1bnNpZ25lZCAgdG9fcmIgICAgICA9IHRvICYgMHgwMGZmMDBmZjsKKyAgICB1bnNpZ25lZCAgcmVzdWx0X2FnID0gKGZyb21fYWcgKyAoYWxwaGEqKHRvX2FnIC0gZnJvbV9hZykgPj4gOCkpICYgMHhmZjAwZmY7CisgICAgdW5zaWduZWQgIHJlc3VsdF9yYiA9IChmcm9tX3JiICsgKGFscGhhKih0b19yYiAtIGZyb21fcmIpID4+IDgpKSAmIDB4ZmYwMGZmOworCisgICAgcmV0dXJuIChyZXN1bHRfYWcgPDwgOCkgfCByZXN1bHRfcmI7Cit9CisKK3N0YXRpYyBpbnQKK3RyYWNrYmFsbF9tb3ZlKCBUcmFja0JhbGwgIGJhbGwsICBpbnQgIGR4LCBpbnQgIGR5ICkKK3sKKyAgICBSb3RhdG9yUmVjICByb3RbMV07CisgICAgdWludDMyX3QgICAgbm93ID0gZ2V0X3RpY2tzKCk7CisKKyAgICBiYWxsLT5hY2NfeCArPSBkeDsKKyAgICBiYWxsLT5hY2NfeSArPSBkeTsKKworICAgIGlmICggbm9ybSggYmFsbC0+YWNjX3gsIGJhbGwtPmFjY195ICkgPiBiYWxsLT5hY2NfdGhyZXNob2xkICkKKyAgICB7CisgICAgICAgIGludCAgZGR4ID0gYmFsbC0+YWNjX3ggKiBiYWxsLT5hY2Nfc2NhbGU7CisgICAgICAgIGludCAgZGR5ID0gYmFsbC0+YWNjX3kgKiBiYWxsLT5hY2Nfc2NhbGU7CisgICAgICAgIGludCAgZGR0OworCisgICAgICAgIGJhbGwtPmFjY194ID0gMDsKKyAgICAgICAgYmFsbC0+YWNjX3kgPSAwOworCisgICAgICAgIHN3aXRjaCAoYmFsbC0+cm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzA6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNLSU5fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBkZHQgPSBkZHg7CisgICAgICAgICAgICBkZHggPSBkZHk7CisgICAgICAgICAgICBkZHkgPSAtZGR0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIGRkeCA9IC1kZHg7CisgICAgICAgICAgICBkZHkgPSAtZGR5OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGRkdCA9IGRkeDsKKyAgICAgICAgICAgIGRkeCA9IC1kZHk7CisgICAgICAgICAgICBkZHkgPSBkZHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJhbGwtPmV2ZW50X2Z1bmMoZGR4LCBkZHkpOworICAgIH0KKworICAgIHJvdGF0b3JfcmVzZXQoIHJvdCwgZHgsIGR5ICk7CisgICAgcm90YXRvcl9hcHBseSggcm90LCBiYWxsLT5heGVzWzBdICk7CisgICAgcm90YXRvcl9hcHBseSggcm90LCBiYWxsLT5heGVzWzFdICk7CisgICAgcm90YXRvcl9hcHBseSggcm90LCBiYWxsLT5heGVzWzJdICk7CisKKyAgICBpZiAoIGJhbGwtPnRpY2tzX2xhc3QgPT0gMCApCisgICAgICAgIGJhbGwtPnRpY2tzX2xhc3QgPSBub3c7CisgICAgZWxzZSBpZiAoIG5vdyA+IGJhbGwtPnRpY2tzX2xhc3QgKyAoMTAwMC82MCkgKSB7CisgICAgICAgIC8vIEF0IGxlYXN0IDEvNjAgb2YgYSBzZWNvbmQgaGFzIGVsYXBzZWQKKyAgICAgICAgYmFsbC0+dGlja3NfbGFzdCA9IG5vdzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lICBCQUNLX0NPTE9SICAgMHgwMDAwMDAwMAorI2RlZmluZSAgTElHSFRfQ09MT1IgIDB4ZmZmZmZmZmYKKworc3RhdGljIHZvaWQKK3RyYWNrYmFsbF9yZWZyZXNoKCBUcmFja0JhbGwgIGJhbGwgKQoreworICAgIGludCAgICAgICAgICAgICBkaWFtZXRlciA9IGJhbGwtPmRpYW1ldGVyOworICAgIHVuc2lnbmVkKiAgICAgICBwaXhlbHMgICA9IGJhbGwtPnBpeGVsczsKKyAgICBGaXgxNlZlY3RvclJlYyAgZmF4ZXNbM107CisgICAgRml4MTYgICAgICAgICAgIGRvdF90aHJlc2hvbGQgPSBET1RfVEhSRVNIT0xEICogZGlhbWV0ZXI7CisgICAgaW50ICAgICAgICAgICAgIG5uOworICAgIFNraW5SZWN0ICAgICAgICBzUmVjdCA9IHsgeyAwLCAwIH0sIHsgZGlhbWV0ZXIsIGRpYW1ldGVyIH0gfTsKKworICAgIGZpeGVkdmVjdG9yX2Zyb21fdmVjdG9yKCAoRml4MTZWZWN0b3IpJmZheGVzWzBdLCAoVmVjdG9yKSZiYWxsLT5heGVzWzBdICk7CisgICAgZml4ZWR2ZWN0b3JfZnJvbV92ZWN0b3IoIChGaXgxNlZlY3RvcikmZmF4ZXNbMV0sIChWZWN0b3IpJmJhbGwtPmF4ZXNbMV0gKTsKKyAgICBmaXhlZHZlY3Rvcl9mcm9tX3ZlY3RvciggKEZpeDE2VmVjdG9yKSZmYXhlc1syXSwgKFZlY3RvcikmYmFsbC0+YXhlc1syXSApOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgYmFsbC0+c3BoZXJlX2NvdW50OyBubisrKSB7CisgICAgICAgIFNwaGVyZUNvb3JkICBjb29yZCA9ICZiYWxsLT5zcGhlcmVfbWFwW25uXTsKKyAgICAgICAgdW5zaWduZWQgICAgIGNvbG9yID0gQkFDS19DT0xPUjsKKworICAgICAgICBpZiAoY29vcmQtPmFscGhhID4gMCkgeworICAgICAgICAgICAgLyogYXJlIHdlIG5lYXIgb25lIG9mIHRoZSBwb2ludHMgPyAqLworICAgICAgICAgICAgRml4MTYgIGF4ID0gZml4ZWR2ZWN0b3JfZG90KCAoRml4MTZWZWN0b3IpJmNvb3JkLT5mLCAoRml4MTZWZWN0b3IpJmZheGVzWzBdICk7CisgICAgICAgICAgICBGaXgxNiAgYXkgPSBmaXhlZHZlY3Rvcl9kb3QoIChGaXgxNlZlY3RvcikmY29vcmQtPmYsIChGaXgxNlZlY3RvcikmZmF4ZXNbMV0gKTsKKyAgICAgICAgICAgIEZpeDE2ICBheiA9IGZpeGVkdmVjdG9yX2RvdCggKEZpeDE2VmVjdG9yKSZjb29yZC0+ZiwgKEZpeDE2VmVjdG9yKSZmYXhlc1syXSApOworCisgICAgICAgICAgICBGaXgxNiAgYmVzdF9kaXN0ID0gRklYMTZfT05FOworICAgICAgICAgICAgaW50ICAgIHBwOworCisgICAgICAgICAgICBjb2xvciA9IGJhbGwtPmJhbGxfY29sb3I7CisKKyAgICAgICAgICAgIGZvciAocHAgPSAwOyBwcCA8IERPVF9NQVg7IHBwKyspIHsKKyAgICAgICAgICAgICAgICBGaXgxNlZlY3RvclJlYyAgZDsKKyAgICAgICAgICAgICAgICBGaXgxNiAgICAgICAgICAgZGlzdDsKKworICAgICAgICAgICAgICAgIGRbMF0gPSBiYWxsLT5kb3RzW3BwXVswXSAtIGF4OworICAgICAgICAgICAgICAgIGRbMV0gPSBiYWxsLT5kb3RzW3BwXVsxXSAtIGF5OworICAgICAgICAgICAgICAgIGRbMl0gPSBiYWxsLT5kb3RzW3BwXVsyXSAtIGF6OworCisgICAgICAgICAgICAgICAgaWYgKGRbMF0gPiBkb3RfdGhyZXNob2xkIHx8IGRbMF0gPCAtZG90X3RocmVzaG9sZCB8fAorICAgICAgICAgICAgICAgICAgICBkWzFdID4gZG90X3RocmVzaG9sZCB8fCBkWzFdIDwgLWRvdF90aHJlc2hvbGQgfHwKKyAgICAgICAgICAgICAgICAgICAgZFsyXSA+IGRvdF90aHJlc2hvbGQgfHwgZFsyXSA8IC1kb3RfdGhyZXNob2xkICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkaXN0ID0gZml4ZWR2ZWN0b3JfbGVuKCAoRml4MTZWZWN0b3IpJmQgKTsKKworICAgICAgICAgICAgICAgIGlmIChkaXN0IDwgYmVzdF9kaXN0KQorICAgICAgICAgICAgICAgICAgICBiZXN0X2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJlc3RfZGlzdCA8IERPVF9USFJFU0hPTEQpIHsKKyAgICAgICAgICAgICAgICBpbnQgIGEgPSAyNTYqKERPVF9USFJFU0hPTEQgLSBiZXN0X2Rpc3QpIC8gRE9UX1RIUkVTSE9MRDsKKyAgICAgICAgICAgICAgICBjb2xvciA9IGNvbG9yX2JsZW5kKCBjb2xvciwgYmFsbC0+ZG90X2NvbG9yLCBhICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb29yZC0+YWxwaGEgPCAyNTYpIHsKKyAgICAgICAgICAgICAgICBpbnQgIGEgPSBjb29yZC0+YWxwaGE7CisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcl9ibGVuZCggYmFsbC0+cmluZ19jb2xvciwgY29sb3IsIGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGNvb3JkLT5hbHBoYSA+IDI1NikgeworICAgICAgICAgICAgICAgIGludCAgYSA9IChjb29yZC0+YWxwaGEgLSAyNTYpOworICAgICAgICAgICAgICAgIGNvbG9yID0gY29sb3JfYmxlbmQoIGNvbG9yLCBMSUdIVF9DT0xPUiwgYSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY29vcmQtPmFscGhhIDw9IDAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY29sb3IgPSBiYWxsLT5yaW5nX2NvbG9yOworCisgICAgICAgICAgICBpZiAoY29vcmQtPmFscGhhIDwgMCkgeworICAgICAgICAgICAgICAgIGludCAgYSA9IC1jb29yZC0+YWxwaGE7CisgICAgICAgICAgICAgICAgY29sb3IgPSBjb2xvcl9ibGVuZCggY29sb3IsIEJBQ0tfQ09MT1IsIGEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBpeGVsc1tjb29yZC0+eCArIGRpYW1ldGVyKmNvb3JkLT55XSA9IGNvbG9yOworICAgIH0KKyAgICBza2luX3N1cmZhY2VfdXBsb2FkKGJhbGwtPnN1cmZhY2UsICZzUmVjdCwgcGl4ZWxzLCBiYWxsLT5kaWFtZXRlciAqIDQpOworfQorCit2b2lkCit0cmFja2JhbGxfZHJhdyhUcmFja0JhbGwgYmFsbCwgaW50IHgsIGludCB5LCBTa2luU3VyZmFjZSogZHN0KQoreworICAgIFNraW5Qb3MgZHN0X3BvczsKKyAgICBkc3RfcG9zLnggPSB4OworICAgIGRzdF9wb3MueSA9IHk7CisKKyAgICBTa2luUmVjdCBzcmNfcmVjdDsKKyAgICBzcmNfcmVjdC5wb3MueCA9IDA7CisgICAgc3JjX3JlY3QucG9zLnkgPSAwOworICAgIHNyY19yZWN0LnNpemUudyA9IGJhbGwtPmRpYW1ldGVyOworICAgIHNyY19yZWN0LnNpemUuaCA9IGJhbGwtPmRpYW1ldGVyOworCisgICAgc2tpbl9zdXJmYWNlX2JsaXQoZHN0LAorICAgICAgICAgICAgICAgICAgICAgICZkc3RfcG9zLAorICAgICAgICAgICAgICAgICAgICAgIGJhbGwtPnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgJnNyY19yZWN0LAorICAgICAgICAgICAgICAgICAgICAgIFNLSU5fQkxJVF9DT1BZKTsKKyAgICAvL3NraW5fc3VyZmFjZV91cGRhdGUoZHN0LCAmcmQpOworfQorCisKK1NraW5UcmFja0JhbGwqCitza2luX3RyYWNrYmFsbF9jcmVhdGUgICggY29uc3QgU2tpblRyYWNrQmFsbFBhcmFtZXRlcnMqICBwYXJhbXMgKQoreworICAgIFRyYWNrQmFsbCAgYmFsbDsKKworICAgIEFORVcwKGJhbGwpOworICAgIHRyYWNrYmFsbF9pbml0KCBiYWxsLAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRpYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnJpbmcsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+YmFsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kb3RfY29sb3IsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cmluZ19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5ldmVudF9mdW5jCisgICAgICAgICAgICAgICAgICApOworICAgIHJldHVybiAgYmFsbDsKK30KKworaW50Citza2luX3RyYWNrYmFsbF9tb3ZlKCBTa2luVHJhY2tCYWxsKiAgYmFsbCwgaW50ICBkeCwgaW50ICBkeSApCit7CisgICAgcmV0dXJuICB0cmFja2JhbGxfbW92ZShiYWxsLCBkeCwgZHkpOworfQorCit2b2lkCitza2luX3RyYWNrYmFsbF9yZWZyZXNoICggU2tpblRyYWNrQmFsbCogIGJhbGwgKQoreworICAgIHRyYWNrYmFsbF9yZWZyZXNoKGJhbGwpOworfQorCit2b2lkCitza2luX3RyYWNrYmFsbF9kcmF3KFNraW5UcmFja0JhbGwqIGJhbGwsIGludCB4LCBpbnQgeSwgU2tpblN1cmZhY2UqIGRzdCkKK3sKKyAgICB0cmFja2JhbGxfZHJhdyhiYWxsLCB4LCB5LCBkc3QpOworfQorCit2b2lkCitza2luX3RyYWNrYmFsbF9kZXN0cm95ICggU2tpblRyYWNrQmFsbCogIGJhbGwgKQoreworICAgIGlmIChiYWxsKSB7CisgICAgICAgIHRyYWNrYmFsbF9kb25lKGJhbGwpOworICAgICAgICBBRlJFRShiYWxsKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NraW5fdHJhY2tiYWxsX3JlY3QoU2tpblRyYWNrQmFsbCogYmFsbCwgU2tpblJlY3QqICByZWN0KQoreworICAgIHJlY3QtPnBvcy54ID0gMDsKKyAgICByZWN0LT5wb3MueSA9IDA7CisgICAgcmVjdC0+c2l6ZS53ID0gYmFsbC0+ZGlhbWV0ZXI7CisgICAgcmVjdC0+c2l6ZS5oID0gYmFsbC0+ZGlhbWV0ZXI7Cit9CisKKwordm9pZAorc2tpbl90cmFja2JhbGxfc2V0X3JvdGF0aW9uKCBTa2luVHJhY2tCYWxsKiAgYmFsbCwgU2tpblJvdGF0aW9uICByb3RhdGlvbiApCit7CisgICAgYmFsbC0+cm90YXRpb24gPSByb3RhdGlvbiAmIDM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi90cmFja2JhbGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3RyYWNrYmFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjQ1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi90cmFja2JhbGwuaApAQCAtMCwwICsxLDUyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vc3VyZmFjZS5oIgorCit0eXBlZGVmIHN0cnVjdCBTa2luVHJhY2tCYWxsICBTa2luVHJhY2tCYWxsOworCit0eXBlZGVmIHZvaWQgKCpTa2luVHJhY2tCYWxsRXZlbnRGdW5jKShpbnQgZHgsIGludCBkeSk7CisKK3R5cGVkZWYgc3RydWN0IFNraW5UcmFja0JhbGxQYXJhbWV0ZXJzCit7CisgICAgaW50ICAgICAgIGRpYW1ldGVyOworICAgIGludCAgICAgICByaW5nOworICAgIHVuc2lnbmVkICBiYWxsX2NvbG9yOworICAgIHVuc2lnbmVkICBkb3RfY29sb3I7CisgICAgdW5zaWduZWQgIHJpbmdfY29sb3I7CisKKyAgICBTa2luVHJhY2tCYWxsRXZlbnRGdW5jIGV2ZW50X2Z1bmM7Cit9CitTa2luVHJhY2tCYWxsUGFyYW1ldGVyczsKKworCitleHRlcm4gU2tpblRyYWNrQmFsbCogIHNraW5fdHJhY2tiYWxsX2NyZWF0ZSgKKyAgICAgICAgY29uc3QgU2tpblRyYWNrQmFsbFBhcmFtZXRlcnMqICBwYXJhbXMpOworCitleHRlcm4gdm9pZCBza2luX3RyYWNrYmFsbF9yZWN0KFNraW5UcmFja0JhbGwqIGJhbGwsIFNraW5SZWN0KiByZWN0KTsKKworZXh0ZXJuIGludCBza2luX3RyYWNrYmFsbF9tb3ZlKFNraW5UcmFja0JhbGwqIGJhbGwsIGludCBkeCwgaW50IGR5KTsKKworZXh0ZXJuIHZvaWQgc2tpbl90cmFja2JhbGxfcmVmcmVzaChTa2luVHJhY2tCYWxsKiAgYmFsbCk7CisKK2V4dGVybiB2b2lkIHNraW5fdHJhY2tiYWxsX2RyYXcoU2tpblRyYWNrQmFsbCogYmFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luU3VyZmFjZSogZHN0KTsKKworZXh0ZXJuIHZvaWQgc2tpbl90cmFja2JhbGxfZGVzdHJveSAoU2tpblRyYWNrQmFsbCogIGJhbGwpOworCisvKiB0aGlzIHNldHMgdGhlIHJvdGF0aW9uIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIG1vdXNlIGV2ZW50cyBzZW50IHRvIHRoZSBzeXN0ZW0gKi8KK2V4dGVybiB2b2lkIHNraW5fdHJhY2tiYWxsX3NldF9yb3RhdGlvbihTa2luVHJhY2tCYWxsKiAgYmFsbCwgU2tpblJvdGF0aW9uICByb3RhdGlvbik7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi91aS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vdWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFkNTFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vdWkuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3VpLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9pbWFnZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9rZXlib2FyZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZWN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3RyYWNrYmFsbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi93aW5kb3cuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNkZWZpbmUgIEQoLi4uKSAgZG8geyAgaWYgKFZFUkJPU0VfQ0hFQ0soaW5pdCkpIGRwcmludChfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZGVmaW5lICBERSguLi4pIGRvIHsgaWYgKFZFUkJPU0VfQ0hFQ0soa2V5cykpIGRwcmludChfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisKK3N0cnVjdCBTa2luVUkgeworICAgIFNraW5VSVBhcmFtcyAgICAgICAgICAgdWlfcGFyYW1zOworICAgIGNvbnN0IFNraW5VSUZ1bmNzKiAgICAgdWlfZnVuY3M7CisKKyAgICBTa2luRmlsZSogICAgICAgICAgICAgIGxheW91dF9maWxlOworICAgIFNraW5MYXlvdXQqICAgICAgICAgICAgbGF5b3V0OworCisgICAgU2tpbktleWJvYXJkKiAgICAgICAgICBrZXlib2FyZDsKKworICAgIFNraW5XaW5kb3cqICAgICAgICAgICAgd2luZG93OworCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICBzaG93X3RyYWNrYmFsbDsKKyAgICBTa2luVHJhY2tCYWxsKiAgICAgICAgIHRyYWNrYmFsbDsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgbGNkX2JyaWdodG5lc3M7CisKKyAgICBTa2luSW1hZ2UqICAgICAgICAgICAgIG9uaW9uOworICAgIFNraW5Sb3RhdGlvbiAgICAgICAgICAgb25pb25fcm90YXRpb247CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBvbmlvbl9hbHBoYTsKKworfTsKKworc3RhdGljIFNraW5MYXlvdXQqIHNraW5fZmlsZV9zZWxlY3RfbGF5b3V0KFNraW5MYXlvdXQqIGxheW91dHMsCisgICAgICAgIGNvbnN0IGNoYXIqIGxheW91dF9uYW1lKSB7CisgICAgaWYgKCFsYXlvdXRfbmFtZSkgcmV0dXJuIGxheW91dHM7CisgICAgU2tpbkxheW91dCogY3VyckxheW91dCA9IGxheW91dHM7CisgICAgd2hpbGUgKGN1cnJMYXlvdXQpIHsKKyAgICAgICAgaWYgKGN1cnJMYXlvdXQtPm5hbWUgJiYgIXN0cmNtcChjdXJyTGF5b3V0LT5uYW1lLCBsYXlvdXRfbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyTGF5b3V0OworICAgICAgICB9CisgICAgICAgIGN1cnJMYXlvdXQgPSBjdXJyTGF5b3V0LT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gbGF5b3V0czsKK30KKworU2tpblVJKiBza2luX3VpX2NyZWF0ZShTa2luRmlsZSogbGF5b3V0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGluaXRpYWxfb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5VSUZ1bmNzKiB1aV9mdW5jcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpblVJUGFyYW1zKiB1aV9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2VtdWdsX3N1YndpbmRvdykgeworICAgIFNraW5VSSogdWk7CisKKyAgICBBTkVXMCh1aSk7CisKKyAgICB1aS0+bGF5b3V0X2ZpbGUgPSBsYXlvdXRfZmlsZTsKKyAgICB1aS0+bGF5b3V0ID0gc2tpbl9maWxlX3NlbGVjdF9sYXlvdXQobGF5b3V0X2ZpbGUtPmxheW91dHMsIGluaXRpYWxfb3JpZW50YXRpb24pOworCisgICAgdWktPnVpX2Z1bmNzID0gdWlfZnVuY3M7CisgICAgdWktPnVpX3BhcmFtcyA9IHVpX3BhcmFtc1swXTsKKworICAgIHVpLT5rZXlib2FyZCA9IHNraW5fa2V5Ym9hcmRfY3JlYXRlKHVpLT51aV9wYXJhbXMua2V5Ym9hcmRfY2hhcm1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aS0+bGF5b3V0LT5kcGFkX3JvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpX2Z1bmNzLT5rZXlib2FyZF9mbHVzaCk7CisgICAgdWktPndpbmRvdyA9IE5VTEw7CisKKyAgICB1aS0+d2luZG93ID0gc2tpbl93aW5kb3dfY3JlYXRlKAorICAgICAgICAgICAgdWktPmxheW91dCwgdWktPnVpX3BhcmFtcy53aW5kb3dfeCwgdWktPnVpX3BhcmFtcy53aW5kb3dfeSwKKyAgICAgICAgICAgIHVpLT51aV9wYXJhbXMuZW5hYmxlX3NjYWxlLAorICAgICAgICAgICAgdXNlX2VtdWdsX3N1YndpbmRvdywgdWktPnVpX2Z1bmNzLT53aW5kb3dfZnVuY3MpOworICAgIGlmICghdWktPndpbmRvdykgeworICAgICAgICBza2luX3VpX2ZyZWUodWkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAodWktPnVpX3BhcmFtcy5lbmFibGVfdHJhY2tiYWxsKSB7CisgICAgICAgIHVpLT50cmFja2JhbGwgPSBza2luX3RyYWNrYmFsbF9jcmVhdGUodWktPnVpX2Z1bmNzLT50cmFja2JhbGxfcGFyYW1zKTsKKyAgICAgICAgc2tpbl93aW5kb3dfc2V0X3RyYWNrYmFsbCh1aS0+d2luZG93LCB1aS0+dHJhY2tiYWxsKTsKKyAgICB9CisKKyAgICB1aS0+bGNkX2JyaWdodG5lc3MgPSAxMjg7ICAvKiA1MCUgKi8KKyAgICBza2luX3dpbmRvd19zZXRfbGNkX2JyaWdodG5lc3ModWktPndpbmRvdywgdWktPmxjZF9icmlnaHRuZXNzICk7CisKKyAgICBpZiAodWktPm9uaW9uKSB7CisgICAgICAgIHNraW5fd2luZG93X3NldF9vbmlvbih1aS0+d2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWktPm9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWktPm9uaW9uX3JvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWktPm9uaW9uX2FscGhhKTsKKyAgICB9CisKKyAgICBza2luX3VpX3Jlc2V0X3RpdGxlKHVpKTsKKworICAgIHNraW5fd2luZG93X2VuYWJsZV90b3VjaCh1aS0+d2luZG93LCB1aS0+dWlfcGFyYW1zLmVuYWJsZV90b3VjaCk7CisgICAgc2tpbl93aW5kb3dfZW5hYmxlX2RwYWQodWktPndpbmRvdywgdWktPnVpX3BhcmFtcy5lbmFibGVfZHBhZCk7CisgICAgc2tpbl93aW5kb3dfZW5hYmxlX3F3ZXJ0eSh1aS0+d2luZG93LCB1aS0+dWlfcGFyYW1zLmVuYWJsZV9rZXlib2FyZCk7CisgICAgc2tpbl93aW5kb3dfZW5hYmxlX3RyYWNrYmFsbCh1aS0+d2luZG93LCB1aS0+dWlfcGFyYW1zLmVuYWJsZV90cmFja2JhbGwpOworCisgICAgcmV0dXJuIHVpOworfQorCit2b2lkIHNraW5fdWlfZnJlZShTa2luVUkqIHVpKSB7CisgICAgaWYgKHVpLT53aW5kb3cpIHsKKyAgICAgICAgc2tpbl93aW5kb3dfZnJlZSh1aS0+d2luZG93KTsKKyAgICAgICAgdWktPndpbmRvdyA9IE5VTEw7CisgICAgfQorICAgIGlmICh1aS0+dHJhY2tiYWxsKSB7CisgICAgICAgIHNraW5fdHJhY2tiYWxsX2Rlc3Ryb3kodWktPnRyYWNrYmFsbCk7CisgICAgICAgIHVpLT50cmFja2JhbGwgPSBOVUxMOworICAgIH0KKyAgICBpZiAodWktPmtleWJvYXJkKSB7CisgICAgICAgIHNraW5fa2V5Ym9hcmRfZnJlZSh1aS0+a2V5Ym9hcmQpOworICAgICAgICB1aS0+a2V5Ym9hcmQgPSBOVUxMOworICAgIH0KKworICAgIHNraW5faW1hZ2VfdW5yZWYoJnVpLT5vbmlvbik7CisKKyAgICB1aS0+bGF5b3V0ID0gTlVMTDsKKworICAgIEFGUkVFKHVpKTsKK30KKwordm9pZCBza2luX3VpX3NldF9sY2RfYnJpZ2h0bmVzcyhTa2luVUkqIHVpLCBpbnQgbGNkX2JyaWdodG5lc3MpIHsKKyAgICB1aS0+bGNkX2JyaWdodG5lc3MgPSBsY2RfYnJpZ2h0bmVzczsKKyAgICBpZiAodWktPndpbmRvdykgeworICAgICAgICBza2luX3dpbmRvd19zZXRfbGNkX2JyaWdodG5lc3ModWktPndpbmRvdywgbGNkX2JyaWdodG5lc3MpOworICAgIH0KK30KKwordm9pZCBza2luX3VpX3NldF9zY2FsZShTa2luVUkqIHVpLCBkb3VibGUgc2NhbGUpIHsKKyAgICBpZiAodWktPndpbmRvdykgeworICAgICAgICBza2luX3dpbmRvd19zZXRfc2NhbGUodWktPndpbmRvdywgc2NhbGUpOworICAgIH0KK30KKwordm9pZCBza2luX3VpX3Jlc2V0X3RpdGxlKFNraW5VSSogdWkpIHsKKyAgICBjaGFyICB0ZW1wWzEyOF0sICpwPXRlbXAsICplbmQgPSBwICsgc2l6ZW9mKHRlbXApOworCisgICAgaWYgKHVpLT53aW5kb3cgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHVpLT5zaG93X3RyYWNrYmFsbCkgeworICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiUHJlc3MgQ3RybC1UIHRvIGxlYXZlIHRyYWNrYmFsbCBtb2RlLiAiKTsKKyAgICB9CisKKyAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiJXMiLCB1aS0+dWlfcGFyYW1zLndpbmRvd19uYW1lKTsKKyAgICBza2luX3dpbmRvd19zZXRfdGl0bGUodWktPndpbmRvdywgdGVtcCk7Cit9CisKK3ZvaWQgc2tpbl91aV9zZXRfb25pb24oU2tpblVJKiB1aSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2tpbkltYWdlKiBvbmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgU2tpblJvdGF0aW9uIG9uaW9uX3JvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgb25pb25fYWxwaGEpIHsKKyAgICBpZiAob25pb24pIHsKKyAgICAgICAgc2tpbl9pbWFnZV9yZWYob25pb24pOworICAgIH0KKyAgICBza2luX2ltYWdlX3VucmVmKCZ1aS0+b25pb24pOworCisgICAgdWktPm9uaW9uID0gb25pb247CisgICAgdWktPm9uaW9uX3JvdGF0aW9uID0gb25pb25fcm90YXRpb247CisgICAgdWktPm9uaW9uX2FscGhhID0gb25pb25fYWxwaGE7CisKKyAgICBpZiAodWktPndpbmRvdykgeworICAgICAgICBza2luX3dpbmRvd19zZXRfb25pb24odWktPndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25pb25fcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmlvbl9hbHBoYSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBza2luX3VpX3N3aXRjaF90b19sYXlvdXQoU2tpblVJKiB1aSwgU2tpbkxheW91dCogbGF5b3V0KSB7CisgICAgdWktPmxheW91dCA9IGxheW91dDsKKyAgICBza2luX3dpbmRvd19yZXNldCh1aS0+d2luZG93LCBsYXlvdXQpOworICAgIFNraW5Sb3RhdGlvbiByb3RhdGlvbiA9IHNraW5fbGF5b3V0X2dldF9kcGFkX3JvdGF0aW9uKGxheW91dCk7CisKKyAgICBpZiAodWktPmtleWJvYXJkKSB7CisgICAgICAgIHNraW5fa2V5Ym9hcmRfc2V0X3JvdGF0aW9uKHVpLT5rZXlib2FyZCwgcm90YXRpb24pOworICAgIH0KKworICAgIGlmICh1aS0+dHJhY2tiYWxsKSB7CisgICAgICAgIHNraW5fdHJhY2tiYWxsX3NldF9yb3RhdGlvbih1aS0+dHJhY2tiYWxsLCByb3RhdGlvbik7CisgICAgICAgIHNraW5fd2luZG93X3NldF90cmFja2JhbGwodWktPndpbmRvdywgdWktPnRyYWNrYmFsbCk7CisgICAgICAgIHNraW5fd2luZG93X3Nob3dfdHJhY2tiYWxsKHVpLT53aW5kb3csIHVpLT5zaG93X3RyYWNrYmFsbCk7CisgICAgfQorCisgICAgc2tpbl93aW5kb3dfc2V0X2xjZF9icmlnaHRuZXNzKHVpLT53aW5kb3csIHVpLT5sY2RfYnJpZ2h0bmVzcyk7CisgICAgdWktPnVpX2Z1bmNzLT5mcmFtZWJ1ZmZlcl9pbnZhbGlkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9za2luX3VpX2hhbmRsZV9yb3RhdGVfa2V5X2NvbW1hbmQoU2tpblVJKiB1aSwgYm9vbCBuZXh0KSB7CisgICAgU2tpbkxheW91dCogbGF5b3V0ID0gTlVMTDsKKworICAgIGlmIChuZXh0KSB7CisgICAgICAgIGxheW91dCA9IHVpLT5sYXlvdXQtPm5leHQ7CisgICAgICAgIGlmIChsYXlvdXQgPT0gTlVMTCkKKyAgICAgICAgICAgIGxheW91dCA9IHVpLT5sYXlvdXRfZmlsZS0+bGF5b3V0czsKKyAgICB9IGVsc2UgeworICAgICAgICBsYXlvdXQgPSB1aS0+bGF5b3V0X2ZpbGUtPmxheW91dHM7CisgICAgICAgIHdoaWxlIChsYXlvdXQtPm5leHQgJiYgbGF5b3V0LT5uZXh0ICE9IHVpLT5sYXlvdXQpCisgICAgICAgICAgICBsYXlvdXQgPSBsYXlvdXQtPm5leHQ7CisgICAgfQorICAgIGlmIChsYXlvdXQgIT0gTlVMTCkgeworICAgICAgICBza2luX3VpX3N3aXRjaF90b19sYXlvdXQodWksIGxheW91dCk7CisgICAgfQorfQorCit2b2lkIHNraW5fdWlfc2VsZWN0X25leHRfbGF5b3V0KFNraW5VSSogdWkpIHsKKyAgICBfc2tpbl91aV9oYW5kbGVfcm90YXRlX2tleV9jb21tYW5kKHVpLCB0cnVlKTsKK30KKworYm9vbCBza2luX3VpX3Byb2Nlc3NfZXZlbnRzKFNraW5VSSogdWkpIHsKKyAgICBTa2luRXZlbnQgZXY7CisKKyAgICAvLyBJZiBhIHNjcm9sbGVkIHdpbmRvdyBpcyB6b29tZWQgb3IgcmVzaXplZCB3aGlsZSB0aGUgc2Nyb2xsIGJhcnMKKyAgICAvLyBhcmUgbW92ZWQsIFF0IHdpbmRvdyBzY3JvbGwgZXZlbnRzIGFyZSBjcmVhdGVkIGFzIHRoZSB3aW5kb3cgcmVzaXplcy4KKyAgICAvLyBUaGV5IHdpbGwgYmUgaW4gdGhlIGV2ZW50IHF1ZXVlIGJlaGluZCB0aGUgc2V0LXNjYWxlIG9yIHNldC16b29tLiBCZWNhdXNlCisgICAgLy8gc2Nyb2xsIGV2ZW50cyB3b3JrIGJ5ICJtb3ZpbmciIHRoZSBHTCBzdWItd2luZG93IHdoZW4gdXNpbmcgaG9zdCBHUFUgYW5kCisgICAgLy8gZmluZGluZyBpdHMgaW50ZXJzZWN0aW9uIHdpdGggdGhlIFF0IHdpbmRvdywgc2Nyb2xsIGV2ZW50cyBwcm9kdWNlZCBieSBhCisgICAgLy8gcmVzaXplIHNob3VsZCBiZSBpZ25vcmVkLCBzaW5jZSB0aGV5IG1heSBtb3ZlIHRoZSBHTCBzdWItd2luZG93IGZhciBlbm91Z2gKKyAgICAvLyB0aGF0IGl0IG5vIGxvbmdlciBpbnRlcnNlY3RzIHRoZSBRdCB3aW5kb3cgYXQgaXRzIGN1cnJlbnQgc2l6ZS4KKyAgICBib29sIGlnbm9yZVNjcm9sbCA9IGZhbHNlOworCisgICAgd2hpbGUoc2tpbl9ldmVudF9wb2xsKCZldikpIHsKKyAgICAgICAgc3dpdGNoKGV2LnR5cGUpIHsKKyAgICAgICAgY2FzZSBrRXZlbnRGb3JjZVJlZHJhdzoKKyAgICAgICAgICAgIERFKCJFVkVOVDoga0V2ZW50VmlkZW9FeHBvc2VcbiIpOworICAgICAgICAgICAgc2tpbl93aW5kb3dfcmVkcmF3KHVpLT53aW5kb3csIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrRXZlbnRLZXlEb3duOgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRLZXlEb3duIHNjYW5jb2RlPSVkIG1vZD0weCV4XG4iLAorICAgICAgICAgICAgICAgZXYudS5rZXkua2V5Y29kZSwgZXYudS5rZXkubW9kKTsKKyAgICAgICAgICAgIHNraW5fa2V5Ym9hcmRfcHJvY2Vzc19ldmVudCh1aS0+a2V5Ym9hcmQsICZldiwgMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtFdmVudEtleVVwOgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRLZXlVcCBzY2FuY29kZT0lZCBtb2Q9MHgleFxuIiwKKyAgICAgICAgICAgICAgIGV2LnUua2V5LmtleWNvZGUsIGV2LnUua2V5Lm1vZCk7CisgICAgICAgICAgICBza2luX2tleWJvYXJkX3Byb2Nlc3NfZXZlbnQodWktPmtleWJvYXJkLCAmZXYsIDApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrRXZlbnRUZXh0SW5wdXQ6CisgICAgICAgICAgICBERSgiRVZFTlQ6IGtFdmVudFRleHRJbnB1dCB0ZXh0PVslc10gZG93bj0lc1xuIiwKKyAgICAgICAgICAgICAgIGV2LnUudGV4dC50ZXh0LCBldi51LnRleHQuZG93biA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgc2tpbl9rZXlib2FyZF9wcm9jZXNzX2V2ZW50KHVpLT5rZXlib2FyZCwgJmV2LCBldi51LnRleHQuZG93bik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtFdmVudE1vdXNlTW90aW9uOgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRNb3VzZU1vdGlvbiB4PSVkIHk9JWQgeHJlbD0lZCB5cmVsPSVkIGJ1dHRvbj0lZFxuIiwKKyAgICAgICAgICAgICAgIGV2LnUubW91c2UueCwgZXYudS5tb3VzZS55LCBldi51Lm1vdXNlLnhyZWwsIGV2LnUubW91c2UueXJlbCwKKyAgICAgICAgICAgICAgIGV2LnUubW91c2UuYnV0dG9uKTsKKyAgICAgICAgICAgIHNraW5fd2luZG93X3Byb2Nlc3NfZXZlbnQodWktPndpbmRvdywgJmV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtFdmVudExheW91dE5leHQ6CisgICAgICAgICAgICBERSgiRVZFTlQ6IGtFdmVudExheW91dE5leHRcbiIpOworICAgICAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0socm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQb2xsZWQgZXZlbnQ6IExheW91dE5leHRcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3NraW5fdWlfaGFuZGxlX3JvdGF0ZV9rZXlfY29tbWFuZCh1aSwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBrRXZlbnRMYXlvdXRQcmV2OgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRMYXlvdXRQcmV2XG4iKTsKKyAgICAgICAgICAgIGlmIChWRVJCT1NFX0NIRUNLKHJvdGF0aW9uKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUG9sbGVkIGV2ZW50OiBMYXlvdXRQcmV2XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9za2luX3VpX2hhbmRsZV9yb3RhdGVfa2V5X2NvbW1hbmQodWksIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtFdmVudExheW91dFJvdGF0ZToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gcm90ID0gZXYudS5sYXlvdXRfcm90YXRpb24ucm90YXRpb247CisgICAgICAgICAgICAgICAgU2tpbkxheW91dCogbDsKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSB1aS0+bGF5b3V0X2ZpbGUtPmxheW91dHM7CisgICAgICAgICAgICAgICAgICAgICBsOworICAgICAgICAgICAgICAgICAgICAgbCA9IGwtPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGwtPm9yaWVudGF0aW9uID09IHJvdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpbl91aV9zd2l0Y2hfdG9fbGF5b3V0KHVpLCBsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0V2ZW50TW91c2VCdXR0b25Eb3duOgorICAgICAgICBjYXNlIGtFdmVudE1vdXNlQnV0dG9uVXA6CisgICAgICAgICAgICBERSgiRVZFTlQ6IGtFdmVudE1vdXNlQnV0dG9uIHg9JWQgeT0lZCB4cmVsPSVkIHlyZWw9JWQgYnV0dG9uPSVkXG4iLAorICAgICAgICAgICAgICAgZXYudS5tb3VzZS54LCBldi51Lm1vdXNlLnksIGV2LnUubW91c2UueHJlbCwgZXYudS5tb3VzZS55cmVsLAorICAgICAgICAgICAgICAgZXYudS5tb3VzZS5idXR0b24pOworICAgICAgICAgICAgaWYgKGV2LnUubW91c2UuYnV0dG9uID09IGtNb3VzZUJ1dHRvbkxlZnQgfHwKKyAgICAgICAgICAgICAgICBldi51Lm1vdXNlLmJ1dHRvbiA9PSBrTW91c2VCdXR0b25TZWNvbmRhcnlUb3VjaCkgeworICAgICAgICAgICAgICAgIHNraW5fd2luZG93X3Byb2Nlc3NfZXZlbnQodWktPndpbmRvdywgJmV2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0V2ZW50U2Nyb2xsQmFyQ2hhbmdlZDoKKyAgICAgICAgICAgIERFKCJFVkVOVDoga0V2ZW50U2Nyb2xsQmFyQ2hhbmdlZCB4PSVkIHhtYXg9JWQgeT0lZCB5bWF4PSVkIGlnbm9yZWQ9JWRcbiIsCisgICAgICAgICAgICAgICBldi51LnNjcm9sbC54LCBldi51LnNjcm9sbC54bWF4LCBldi51LnNjcm9sbC55LCBldi51LnNjcm9sbC55bWF4LCBpZ25vcmVTY3JvbGwpOworICAgICAgICAgICAgaWYgKCFpZ25vcmVTY3JvbGwpIHsKKyAgICAgICAgICAgICAgICBza2luX3dpbmRvd19zY3JvbGxfdXBkYXRlZCh1aS0+d2luZG93LCBldi51LnNjcm9sbC54LCBldi51LnNjcm9sbC54bWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnUuc2Nyb2xsLnksIGV2LnUuc2Nyb2xsLnltYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrRXZlbnRTZXRTY2FsZToKKyAgICAgICAgICAgIERFKCJFVkVOVDoga0V2ZW50U2V0U2NhbGUgc2NhbGU9JWZcbiIsIGV2LnUud2luZG93LnNjYWxlKTsKKyAgICAgICAgICAgIGlnbm9yZVNjcm9sbCA9IHRydWU7CisgICAgICAgICAgICBza2luX3dpbmRvd19zZXRfc2NhbGUodWktPndpbmRvdywgZXYudS53aW5kb3cuc2NhbGUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrRXZlbnRTZXRab29tOgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRTZXRab29tIHg9JWQgeT0lZCB6b29tPSVmIHNjcm9sbF9oPSVkXG4iLAorICAgICAgICAgICAgICAgZXYudS53aW5kb3cueCwgZXYudS53aW5kb3cueSwgZXYudS53aW5kb3cuc2NhbGUsIGV2LnUud2luZG93LnNjcm9sbF9oKTsKKyAgICAgICAgICAgIHNraW5fd2luZG93X3NldF96b29tKHVpLT53aW5kb3csIGV2LnUud2luZG93LnNjYWxlLCBldi51LndpbmRvdy54LCBldi51LndpbmRvdy55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYudS53aW5kb3cuc2Nyb2xsX2gpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrRXZlbnRRdWl0OgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRRdWl0XG4iKTsKKyAgICAgICAgICAgIC8qIG9ubHkgc2F2ZSBlbXVsYXRvciBjb25maWcgdGhyb3VnaCBjbGVhbiBleGl0ICovCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBjYXNlIGtFdmVudFdpbmRvd01vdmVkOgorICAgICAgICAgICAgREUoIkVWRU5UOiBrRXZlbnRXaW5kb3dNb3ZlZCB4PSVkIHk9JWRcbiIsIGV2LnUud2luZG93LngsIGV2LnUud2luZG93LnkpOworICAgICAgICAgICAgc2tpbl93aW5kb3dfcG9zaXRpb25fY2hhbmdlZCh1aS0+d2luZG93LCBldi51LndpbmRvdy54LCBldi51LndpbmRvdy55KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0V2ZW50U2NyZWVuQ2hhbmdlZDoKKyAgICAgICAgICAgIERFKCJFVkVOVDoga0V2ZW50U2NyZWVuQ2hhbmdlZFxuIik7CisgICAgICAgICAgICBza2luX3dpbmRvd19wcm9jZXNzX2V2ZW50KHVpLT53aW5kb3csICZldik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtFdmVudFpvb21lZFdpbmRvd1Jlc2l6ZWQ6CisgICAgICAgICAgICBERSgiRVZFTlQ6IGtFdmVudFpvb21lZFdpbmRvd1Jlc2l6ZWQgZHg9JWQgZHk9JWQgdz0lZCBoPSVkXG4iLAorICAgICAgICAgICAgICAgZXYudS5zY3JvbGwueCwgZXYudS5zY3JvbGwueSwgZXYudS5zY3JvbGwueG1heCwgZXYudS5zY3JvbGwueW1heCk7CisgICAgICAgICAgICBza2luX3dpbmRvd196b29tZWRfd2luZG93X3Jlc2l6ZWQodWktPndpbmRvdywgZXYudS5zY3JvbGwueCwgZXYudS5zY3JvbGwueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi51LnNjcm9sbC54bWF4LCBldi51LnNjcm9sbC55bWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LnUuc2Nyb2xsLnNjcm9sbF9oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtFdmVudFRvZ2dsZVRyYWNrYmFsbDoKKyAgICAgICAgICAgIGlmICh1aS0+dWlfcGFyYW1zLmVuYWJsZV90cmFja2JhbGwpIHsKKyAgICAgICAgICAgICAgICB1aS0+c2hvd190cmFja2JhbGwgPSAhdWktPnNob3dfdHJhY2tiYWxsOworICAgICAgICAgICAgICAgIHNraW5fd2luZG93X3Nob3dfdHJhY2tiYWxsKHVpLT53aW5kb3csIHVpLT5zaG93X3RyYWNrYmFsbCk7CisgICAgICAgICAgICAgICAgc2tpbl91aV9yZXNldF90aXRsZSh1aSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNraW5fa2V5Ym9hcmRfZmx1c2godWktPmtleWJvYXJkKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc2tpbl91aV91cGRhdGVfZGlzcGxheShTa2luVUkqIHVpLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkgeworICAgIGlmICh1aS0+d2luZG93KSB7CisgICAgICAgIHNraW5fd2luZG93X3VwZGF0ZV9kaXNwbGF5KHVpLT53aW5kb3csIHgsIHksIHcsIGgpOworICAgIH0KK30KKwordm9pZCBza2luX3VpX3VwZGF0ZV9ncHVfZnJhbWUoU2tpblVJKiB1aSwgaW50IHcsIGludCBoLCBjb25zdCB2b2lkKiBwaXhlbHMpIHsKKyAgICBpZiAodWktPndpbmRvdykgeworICAgICAgICBza2luX3dpbmRvd191cGRhdGVfZ3B1X2ZyYW1lKHVpLT53aW5kb3csIHcsIGgsIHBpeGVscyk7CisgICAgfQorfQorCitTa2luTGF5b3V0KiBza2luX3VpX2dldF9jdXJyZW50X2xheW91dChjb25zdCBTa2luVUkqIHVpKSB7CisgICAgcmV0dXJuIHVpLT5sYXlvdXQ7Cit9CisKK1NraW5MYXlvdXQqIHNraW5fdWlfZ2V0X25leHRfbGF5b3V0KGNvbnN0IFNraW5VSSogdWkpIHsKKyAgICByZXR1cm4gdWktPmxheW91dC0+bmV4dCA/IHVpLT5sYXlvdXQtPm5leHQgOiB1aS0+bGF5b3V0X2ZpbGUtPmxheW91dHM7Cit9CisKK1NraW5MYXlvdXQqIHNraW5fdWlfZ2V0X3ByZXZfbGF5b3V0KGNvbnN0IFNraW5VSSogdWkpIHsKKyAgICBTa2luTGF5b3V0KiBsYXlvdXQgPSB1aS0+bGF5b3V0X2ZpbGUtPmxheW91dHM7CisgICAgd2hpbGUgKGxheW91dC0+bmV4dCAmJiBsYXlvdXQtPm5leHQgIT0gdWktPmxheW91dCkgeworICAgICAgICBsYXlvdXQgPSBsYXlvdXQtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBsYXlvdXQ7Cit9CisKK3ZvaWQgc2tpbl91aV9zZXRfbmFtZShTa2luVUkqIHVpLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc25wcmludGYodWktPnVpX3BhcmFtcy53aW5kb3dfbmFtZSwKKyAgICAgICAgICAgICBzaXplb2YodWktPnVpX3BhcmFtcy53aW5kb3dfbmFtZSksCisgICAgICAgICAgICAgIiVzIiwKKyAgICAgICAgICAgICBuYW1lKTsKKyAgICBza2luX3VpX3Jlc2V0X3RpdGxlKHVpKTsKK30KKworYm9vbCBza2luX3VpX2lzX3RyYWNrYmFsbF9hY3RpdmUoU2tpblVJKiB1aSkgeworICAgIHJldHVybiAodWkgJiYgdWktPnVpX3BhcmFtcy5lbmFibGVfdHJhY2tiYWxsICYmIHVpLT5zaG93X3RyYWNrYmFsbCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi91aS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vdWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlmMTAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vdWkuaApAQCAtMCwwICsxLDEzOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9yZWN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWJvYXJkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2tleWNvZGUtYnVmZmVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK3R5cGVkZWYgc3RydWN0IFNraW5VSSBTa2luVUk7CisKKy8vIEF2b2lkIGluY2x1ZGluZyBoZWFkZXJzIGlmIHBvc3NpYmxlLgorc3RydWN0IFNraW5GaWxlOworc3RydWN0IFNraW5LZXlzZXQ7CitzdHJ1Y3QgU2tpbkxheW91dDsKK3N0cnVjdCBTa2luVHJhY2tCYWxsUGFyYW1ldGVyczsKK3N0cnVjdCBTa2luV2luZG93RnVuY3M7CisKKy8vIEZ1bmN0aW9uIHBvaW50ZXIgdXNlZCB0byB0b2dnbGUgbmV0d29yayBlbXVsYXRpb24gb24vb2ZmLgorLy8gUmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG5ldHdvcmsgYWZ0ZXIgdGhlIHRvZ2dsZSwgaS5lLiAndHJ1ZScgdG8KKy8vIGluZGljYXRlIHRoYXQgaXQgaXMgZW5hYmxlZCwgJ2ZhbHNlJyBvdGhlcndpc2UuCit0eXBlZGVmIGJvb2wgKCpTa2luVUlOZXR3b3JrVG9nZ2xlRnVuYykodm9pZCk7CisKKy8vIEZ1bmN0aW9uIHBvaW50ZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmcmFtZWJ1ZmZlciBkaXNwbGF5IGluIHRoZQorLy8gVUkgd2FzIGxvc3QgYW5kIG5lZWRzIHRvIGJlIGZ1bGx5IHJlZ2VuZXJhdGVkLgordHlwZWRlZiB2b2lkICgqU2tpblVJSW52YWxpZGF0ZUZyYW1lQnVmZmVyKSh2b2lkKTsKKworLy8gQSBzdHJ1Y3R1cmUgdXNlZCB0byBwb2ludCB0byBjb25zdGFudCBjYWxsYmFja3MuCit0eXBlZGVmIHN0cnVjdCBTa2luVUlGdW5jcyB7CisgICAgY29uc3Qgc3RydWN0IFNraW5XaW5kb3dGdW5jcyogd2luZG93X2Z1bmNzOworICAgIGNvbnN0IHN0cnVjdCBTa2luVHJhY2tCYWxsUGFyYW1ldGVycyogdHJhY2tiYWxsX3BhcmFtczsKKyAgICBTa2luS2V5RXZlbnRGdW5jIGtleWJvYXJkX2V2ZW50OworICAgIFNraW5LZXlDb2RlRmx1c2hGdW5jIGtleWJvYXJkX2ZsdXNoOworICAgIFNraW5VSU5ldHdvcmtUb2dnbGVGdW5jIG5ldHdvcmtfdG9nZ2xlOworICAgIFNraW5VSUludmFsaWRhdGVGcmFtZUJ1ZmZlciBmcmFtZWJ1ZmZlcl9pbnZhbGlkYXRlOworfSBTa2luVUlGdW5jczsKKworLy8gQSBzdHJ1Y3R1cmUgdXNlZCB0byBncm91cCBpbml0aWFsaXphdGlvbiBzZXR0aW5ncyBmb3IgYSBuZXcgU2tpblVJLgorLy8gfHdpbmRvd19uYW1lfCBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgd2luZG93LiBTaG91bGQgdHlwaWNhbGx5IGJlCisvLyA8cG9ydD46PG5hbWU+IHdoZXJlIDxwb3J0PiBpcyBhIGNvbnNvbGUgcG9ydCBudW1iZXIgKGUuZy4gNTU1NCkgYW5kCisvLyA8bmFtZT4gaXMgdGhlIEFWRCdzIG5hbWUuCisvLyB8d2luZG93X3h8IGFuZCB8d2luZG93X3l8IGFyZSB0aGUgdGhlIGluaXRpYWwgVUkgd2luZG93IGNvb3JkaW5hdGVzLgorLy8gfHdpbmRvd19zY2FsZXwgaXMgdGhlIHdpbmRvdyBzY2FsaW5nIGZhY3Rvci4gVXNlIDEuMCBmb3IgdW5zY2FsZWQgZGlzcGxheS4KKy8vIHxlbmFibGVfdG91Y2h8IGlzIHRydWUgaWZmIHRvdWNoIGVtdWxhdGlvbiBpcyBuZWVkZWQuCisvLyB8ZW5hYmxlX2RwYWR8IGlzIHRydWUgaWZmIERQYWQgZW11bGF0aW9uIGlzIG5lZWRlZC4KKy8vIHxlbmFibGVfa2V5Ym9hcmR8IGlzIHRydWUgaWZmIGEgaGFyZHdhcmUga2V5Ym9hcmQgbXVzdCBiZSBlbXVsYXRlZC4KKy8vIHxlbmFibGVfdHJhY2tiYWxsfCBpcyB0cnVlIGlmZiBhIHRyYWNrYmFsbCBtdXN0IGJlIGVtdWxhdGVkLgorLy8gfGtleWJvYXJkX2NoYXJtYXB8IGlzIHRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBjaGFybWFwLCBpZiBhbnkuIElmIE5VTEwsCisvLyBvciBlbXB0eSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkLgorLy8gfGtleWJvYXJkX3Jhd19rZXlzfCBpcyB0cnVlIHRvIHN0YXJ0IGluIHJhdyBrZXkgaW5wdXQgbW9kZS4gRGVmYXVsdCBpcworLy8gdG8gc3RhcnQgaW4gVW5pY29kZSBtb2RlLiBJdCdzIHBvc3NpYmxlIHRvIHRvZ2dsZSBiZXR3ZWVuIG1vZGVzIGF0IHJ1bnRpbWUKKy8vIGJ5IHVzaW5nIEN0cmwtSy4KK3R5cGVkZWYgc3RydWN0IFNraW5VSVBhcmFtcyB7CisgICAgY2hhciB3aW5kb3dfbmFtZVsyNTZdOworICAgIGludCB3aW5kb3dfeDsKKyAgICBpbnQgd2luZG93X3k7CisKKyAgICBib29sIGVuYWJsZV90b3VjaDsKKyAgICBib29sIGVuYWJsZV9kcGFkOworICAgIGJvb2wgZW5hYmxlX2tleWJvYXJkOworICAgIGJvb2wgZW5hYmxlX3RyYWNrYmFsbDsKKyAgICBib29sIGVuYWJsZV9zY2FsZTsKKworICAgIGNvbnN0IGNoYXIqIGtleWJvYXJkX2NoYXJtYXA7CisKK30gU2tpblVJUGFyYW1zOworCisvLyBDcmVhdGUgYSBuZXcgdXNlci1pbnRlcmZhY2UgU2tpblVJIG9iamVjdAorLy8gfGxheW91dF9maWxlfCBpcyB0aGUgb3JpZ2luYWwgbGF5b3V0IGZpbGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNraW4uCisvLyB8aW5pdGlhbF9vcmllbnRhdGlvbnwgaXMgdGhlIGluaXRpYWwgc2NyZWVuIG9yaWVudGF0aW9uLCBmb3IgZXhhbXBsZSwKKy8vICJwb3J0cmFpdCIgb3IgImxhbmRzY2FwZSIuCisvLyB8a2V5Ym9hcmR8IGlzIHRoZSBjb3JyZXNwb25kaW5nIGtleWJvYXJkIG9iamVjdCwgaWYgYW55LgorLy8gfHVpX2Z1bmNzfCBwb2ludHMgdG8gYSBzZXQgb2YgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcmVzdCBvZiB0aGUKKy8vIHN5c3RlbS4KKy8vIHx1aV9wYXJhbXN8IGFyZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLiBTZWUgU2tpblVJUGFyYW1zIGRvY3VtZW50YXRpb24uCisvLworLy8gTm90ZSB0aGF0IHxsYXlvdXRfZmlsZXwgYW5kIHxrZXlib2FyZHwgYXJlIHN0aWxsIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kCisvLyBtdXN0IGJlIGZyZWVkIGJ5IGl0LiBPZiBjb3Vyc2UsIHRoZXkgbXVzdCBub3QgYmUgZGV0cm95ZWQgYmVmb3JlIHRoZSBTa2luVUkKKy8vIG9iamVjdC4KKy8vCisvLyB8a2V5Ym9hcmR8IHdpbGwgYmUgaWdub3JlZCBpZiB8dWlfcGFyYW1zLmVuYWJsZV9rZXlib2FyZHwgaXMgZmFsc2UuIElmCisvLyBpdCBpcyBOVUxMLgorU2tpblVJKiBza2luX3VpX2NyZWF0ZShzdHJ1Y3QgU2tpbkZpbGUqIGxheW91dF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBpbml0aWFsX29yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa2luVUlGdW5jcyogdWlfZnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5VSVBhcmFtcyogcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9lbXVnbF9zdWJ3aW5kb3cpOworCit2b2lkIHNraW5fdWlfc2V0X29uaW9uKFNraW5VSSogdWksCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBTa2luSW1hZ2UqIG9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gb25pb25fcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvbmlvbl9hbHBoYSk7CisKK3ZvaWQgc2tpbl91aV9mcmVlKFNraW5VSSogdWkpOworCisvLyBSZXNldCB0aGUgbmFtZSBvZiB0aGUgZW11bGF0b3Igd2luZG93LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZQorLy8gb2YgdGhlIHx3aW5kb3dfbmFtZXwgZmlybGVkIG9mIFNraW5VSVBhcmFtcy4KK3ZvaWQgc2tpbl91aV9zZXRfbmFtZShTa2luVUkqIHVpLCBjb25zdCBjaGFyKiBuYW1lKTsKKwordm9pZCBza2luX3VpX3NldF9sY2RfYnJpZ2h0bmVzcyhTa2luVUkqIHVpLCBpbnQgbGNkX2JyaWdodG5lc3MpOworCit2b2lkIHNraW5fdWlfc2V0X3NjYWxlKFNraW5VSSogdWksIGRvdWJsZSBzY2FsZSk7CisKK3ZvaWQgc2tpbl91aV91cGRhdGVfZGlzcGxheShTa2luVUkqIHVpLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7CisKK3ZvaWQgc2tpbl91aV91cGRhdGVfZ3B1X2ZyYW1lKFNraW5VSSogdWksIGludCB3LCBpbnQgaCwgY29uc3Qgdm9pZCogcGl4ZWxzKTsKKworLy8gUmV0dXJuIHRoZSBjdXJyZW50IFNraW5MYXlvdXQgdXNlZCBieSB0aGUgdXNlciBpbnRlcmZhY2UuCitzdHJ1Y3QgU2tpbkxheW91dCogc2tpbl91aV9nZXRfY3VycmVudF9sYXlvdXQoY29uc3QgU2tpblVJKiB1aSk7CitzdHJ1Y3QgU2tpbkxheW91dCogc2tpbl91aV9nZXRfbmV4dF9sYXlvdXQoY29uc3QgU2tpblVJKiB1aSk7CitzdHJ1Y3QgU2tpbkxheW91dCogc2tpbl91aV9nZXRfcHJldl9sYXlvdXQoY29uc3QgU2tpblVJKiB1aSk7CisKKy8vIFByb2Nlc3MgYWxsIHBlbmRpbmcgdXNlciBpbnB1dCBldmVudHMuIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvZ3JhbSBuZWVkcworLy8gdG8gZXhpdC9xdWl0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIHNraW5fdWlfcHJvY2Vzc19ldmVudHMoU2tpblVJKiB1aSk7CisKK3ZvaWQgc2tpbl91aV9yZXNldF90aXRsZShTa2luVUkqIHVpKTsKKworLy8gUmV0dXJuIHRydWUgaWYgYSB0cmFja2JhbGwgZXhpc3RzIGFuZCB0aGUgbW91c2UgaXMKKy8vIGN1cnJlbnRseSBlbXVsYXRpbmcgaXQKK2Jvb2wgc2tpbl91aV9pc190cmFja2JhbGxfYWN0aXZlKFNraW5VSSogdWkpOworCisvLyBTd2l0Y2hlcyB0byB0aGUgbmV4dCBza2luIGxheW91dC4KK3ZvaWQgc2tpbl91aV9zZWxlY3RfbmV4dF9sYXlvdXQoKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi93aW5kb3cuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3dpbmRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjljNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi93aW5kb3cuYwpAQCAtMCwwICsxLDIwMTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luZG93LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2NvbmZpZy9jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL211bHRpdG91Y2gtc2NyZWVuLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2NoYXJtYXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vZXZlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vaW1hZ2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc2V0ZW52LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2R1ZmYuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvKiB3aGVuIHNocmlua2luZywgd2UgcmVkdWNlIHRoZSBwaXhlbCByYXRpbyBieSB0aGlzIGZpeGVkIGFtb3VudCAqLworI2RlZmluZSAgU0hSSU5LX1NDQUxFICAwLjYKKworLyogbWF4aW11bSB2YWx1ZSBvZiBMQ0QgYnJpZ2huZXNzICovCisjZGVmaW5lICBMQ0RfQlJJR0hUTkVTU19NSU4gICAgICAwCisjZGVmaW5lICBMQ0RfQlJJR0hUTkVTU19ERUZBVUxUICAxMjgKKyNkZWZpbmUgIExDRF9CUklHSFRORVNTX01BWCAgICAgIDI1NQorCit0eXBlZGVmIHN0cnVjdCBCYWNrZ3JvdW5kIHsKKyAgICBTa2luSW1hZ2UqICAgaW1hZ2U7CisgICAgU2tpblJlY3QgICAgIHJlY3Q7CisgICAgU2tpblBvcyAgICAgIG9yaWdpbjsKK30gQmFja2dyb3VuZDsKKworc3RhdGljIHZvaWQKK2JhY2tncm91bmRfZG9uZSggQmFja2dyb3VuZCogIGJhY2sgKQoreworICAgIHNraW5faW1hZ2VfdW5yZWYoICZiYWNrLT5pbWFnZSApOworfQorCitzdGF0aWMgdm9pZAorYmFja2dyb3VuZF9pbml0KEJhY2tncm91bmQqIGJhY2ssCisgICAgICAgICAgICAgICAgU2tpbkJhY2tncm91bmQqIHNiYWNrLAorICAgICAgICAgICAgICAgIFNraW5Mb2NhdGlvbiogbG9jLAorICAgICAgICAgICAgICAgIFNraW5SZWN0KiBmcmFtZSkKK3sKKyAgICBTa2luUmVjdCAgcjsKKworICAgIGJhY2stPmltYWdlID0gc2tpbl9pbWFnZV9yb3RhdGUoIHNiYWNrLT5pbWFnZSwgbG9jLT5yb3RhdGlvbiApOworICAgIHNraW5fcmVjdF9yb3RhdGUoICZyLCAmc2JhY2stPnJlY3QsIGxvYy0+cm90YXRpb24gKTsKKyAgICByLnBvcy54ICs9IGxvYy0+YW5jaG9yLng7CisgICAgci5wb3MueSArPSBsb2MtPmFuY2hvci55OworCisgICAgYmFjay0+b3JpZ2luID0gci5wb3M7CisgICAgc2tpbl9yZWN0X2ludGVyc2VjdCggJmJhY2stPnJlY3QsICZyLCBmcmFtZSApOworfQorCitzdGF0aWMgdm9pZAorYmFja2dyb3VuZF9yZWRyYXcoQmFja2dyb3VuZCogYmFjaywgU2tpblJlY3QqIHJlY3QsIFNraW5TdXJmYWNlKiBzdXJmYWNlKQoreworICAgIFNraW5SZWN0ICByOworCisgICAgaWYgKHNraW5fcmVjdF9pbnRlcnNlY3QoICZyLCByZWN0LCAmYmFjay0+cmVjdCApICkKKyAgICB7CisgICAgICAgIFNraW5SZWN0IHNyY19yZWN0OworICAgICAgICBzcmNfcmVjdC5wb3MueCA9IHIucG9zLnggLSBiYWNrLT5vcmlnaW4ueDsKKyAgICAgICAgc3JjX3JlY3QucG9zLnkgPSByLnBvcy55IC0gYmFjay0+b3JpZ2luLnk7CisgICAgICAgIHNyY19yZWN0LnNpemUgPSByLnNpemU7CisKKyAgICAgICAgc2tpbl9zdXJmYWNlX2JsaXQoc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnIucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBza2luX2ltYWdlX3N1cmZhY2UoYmFjay0+aW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSU5fQkxJVF9TUkNPVkVSKTsKKyAgICB9Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgQURpc3BsYXkgeworICAgIFNraW5SZWN0ICAgICAgIHJlY3Q7CisgICAgU2tpblBvcyAgICAgICAgb3JpZ2luOworICAgIFNraW5Sb3RhdGlvbiAgIHJvdGF0aW9uOworICAgIFNraW5TaXplICAgICAgIGRhdGFzaXplOyAgLyogZnJhbWVidWZmZXIgc2l6ZSAqLworICAgIHZvaWQqICAgICAgICAgIGRhdGE7ICAgICAgLyogZnJhbWVidWZmZXIgcGl4ZWxzICovCisgICAgaW50ICAgICAgICAgICAgYml0c19wZXJfcGl4ZWw7ICAvKiBmcmFtZWJ1ZmZlciBkZXB0aCAqLworICAgIFNraW5JbWFnZSogICAgIG9uaW9uOyAgICAgICAvKiBvbmlvbiBpbWFnZSAqLworICAgIFNraW5SZWN0ICAgICAgIG9uaW9uX3JlY3Q7ICAvKiBvbmlvbiByZWN0LCBpZiBhbnkgKi8KKyAgICBpbnQgICAgICAgICAgICBicmlnaHRuZXNzOworICAgIHZvaWQqICAgICAgICAgIGdwdV9mcmFtZTsgICAvKiBHTF9SR0JBLCBkYXRhc2l6ZS53ICogZGF0YXNpemUuaCAqIDQgYnl0ZXMgKi8KKyAgICBTa2luU3VyZmFjZSogICBzdXJmYWNlOyAgICAgLyogZGlzcGxheWVkIHN1cmZhY2UgYWZ0ZXIgcm90YXRpb24gKyBvbmlvbiAqLworfSBBRGlzcGxheTsKKworc3RhdGljIHZvaWQgYWRpc3BsYXlfZG9uZShBRGlzcGxheSogZGlzcCkgeworICAgIGlmIChkaXNwLT5ncHVfZnJhbWUpIHsKKyAgICAgICAgZnJlZShkaXNwLT5ncHVfZnJhbWUpOworICAgICAgICBkaXNwLT5ncHVfZnJhbWUgPSBOVUxMOworICAgIH0KKworICAgIHNraW5fc3VyZmFjZV91bnJlZnAoJmRpc3AtPnN1cmZhY2UpOworICAgIGRpc3AtPmRhdGEgPSBOVUxMOworICAgIHNraW5faW1hZ2VfdW5yZWYoJmRpc3AtPm9uaW9uKTsKK30KKworc3RhdGljIGludCBhZGlzcGxheV9pbml0KEFEaXNwbGF5KiBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5EaXNwbGF5KiBzZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTa2luTG9jYXRpb24qIGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUmVjdCogZnJhbWUpIHsKKyAgICBza2luX3JlY3Rfcm90YXRlKCAmZGlzcC0+cmVjdCwgJnNkaXNwLT5yZWN0LCBsb2MtPnJvdGF0aW9uICk7CisgICAgZGlzcC0+cmVjdC5wb3MueCArPSBsb2MtPmFuY2hvci54OworICAgIGRpc3AtPnJlY3QucG9zLnkgKz0gbG9jLT5hbmNob3IueTsKKworICAgIGRpc3AtPnJvdGF0aW9uID0gKGxvYy0+cm90YXRpb24gKyBzZGlzcC0+cm90YXRpb24pICYgMzsKKyAgICBzd2l0Y2ggKGRpc3AtPnJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8wOgorICAgICAgICAgICAgZGlzcC0+b3JpZ2luID0gZGlzcC0+cmVjdC5wb3M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNLSU5fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBkaXNwLT5vcmlnaW4ueCA9IGRpc3AtPnJlY3QucG9zLnggKyBkaXNwLT5yZWN0LnNpemUudzsKKyAgICAgICAgICAgIGRpc3AtPm9yaWdpbi55ID0gZGlzcC0+cmVjdC5wb3MueTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8xODA6CisgICAgICAgICAgICBkaXNwLT5vcmlnaW4ueCA9IGRpc3AtPnJlY3QucG9zLnggKyBkaXNwLT5yZWN0LnNpemUudzsKKyAgICAgICAgICAgIGRpc3AtPm9yaWdpbi55ID0gZGlzcC0+cmVjdC5wb3MueSArIGRpc3AtPnJlY3Quc2l6ZS5oOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGRpc3AtPm9yaWdpbi54ID0gZGlzcC0+cmVjdC5wb3MueDsKKyAgICAgICAgICAgIGRpc3AtPm9yaWdpbi55ID0gZGlzcC0+cmVjdC5wb3MueSArIGRpc3AtPnJlY3Quc2l6ZS5oOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNraW5fc2l6ZV9yb3RhdGUoICZkaXNwLT5kYXRhc2l6ZSwgJnNkaXNwLT5yZWN0LnNpemUsIHNkaXNwLT5yb3RhdGlvbiApOworICAgIHNraW5fcmVjdF9pbnRlcnNlY3QoICZkaXNwLT5yZWN0LCAmZGlzcC0+cmVjdCwgZnJhbWUgKTsKKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsICIuLi4gZGlzcGxheV9pbml0ICByZWN0LnBvcyglZCwlZCkgcmVjdC5zaXplKCVkLCVkKSBkYXRhc2l6ZSglZCwlZClcbiIsCisgICAgICAgICAgICAgICAgICAgIGRpc3AtPnJlY3QucG9zLngsIGRpc3AtPnJlY3QucG9zLnksCisgICAgICAgICAgICAgICAgICAgIGRpc3AtPnJlY3Quc2l6ZS53LCBkaXNwLT5yZWN0LnNpemUuaCwKKyAgICAgICAgICAgICAgICAgICAgZGlzcC0+ZGF0YXNpemUudywgZGlzcC0+ZGF0YXNpemUuaCk7CisjZW5kaWYKKyAgICBkaXNwLT5kYXRhID0gTlVMTDsKKyAgICBkaXNwLT5iaXRzX3Blcl9waXhlbCA9IDA7CisgICAgaWYgKHNkaXNwLT5mcmFtZWJ1ZmZlcl9mdW5jcykgeworICAgICAgICBkaXNwLT5kYXRhID0KKyAgICAgICAgICAgICAgICBzZGlzcC0+ZnJhbWVidWZmZXJfZnVuY3MtPmdldF9waXhlbHMoc2Rpc3AtPmZyYW1lYnVmZmVyKTsKKyAgICAgICAgZGlzcC0+Yml0c19wZXJfcGl4ZWwgPQorICAgICAgICAgICAgICAgIHNkaXNwLT5mcmFtZWJ1ZmZlcl9mdW5jcy0+Z2V0X2RlcHRoKHNkaXNwLT5mcmFtZWJ1ZmZlcik7CisgICAgfQorICAgIGRpc3AtPm9uaW9uICA9IE5VTEw7CisKKyAgICBkaXNwLT5icmlnaHRuZXNzID0gTENEX0JSSUdIVE5FU1NfREVGQVVMVDsKKworICAgIGRpc3AtPmdwdV9mcmFtZSA9IE5VTEw7CisKKyAgICBkaXNwLT5zdXJmYWNlID0gc2tpbl9zdXJmYWNlX2NyZWF0ZShkaXNwLT5yZWN0LnNpemUudywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwLT5yZWN0LnNpemUuaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwLT5yZWN0LnNpemUudywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwLT5yZWN0LnNpemUuaCk7CisKKyAgICByZXR1cm4gKGRpc3AtPmRhdGEgPT0gTlVMTCkgPyAtMSA6IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90IHJnYjU2NV90b19hcmdiMzIodWludDMyX3QgcGl4KSB7CisjaWYgMQorICAgIHVpbnQzMl90IHI4ID0gKChwaXggJiAweGY4MDApID4+ICA4KSB8ICgocGl4ICYgMHhlMDAwKSA+PiAxMyk7CisgICAgdWludDMyX3QgZzggPSAoKHBpeCAmIDB4MDdlMCkgPj4gIDMpIHwgKChwaXggJiAweDA2MDApID4+ICA5KTsKKyAgICB1aW50MzJfdCBiOCA9ICgocGl4ICYgMHgwMDFmKSA8PCAgMykgfCAoKHBpeCAmIDB4MDAxYykgPj4gIDIpOworICAgIHJldHVybiAocjggPDwgMTYpIHwgKGc4IDw8IDgpIHwgKGI4IDw8IDApIHwgMHhmZjAwMDAwMFU7CisjZWxzZQorICAgIHVpbnQzMl90IHI4ID0gKChwaXggJiAweGY4MDApIDw8IDgpIHwgKChwaXggJiAweGUwMDApID4+IDUpOworICAgIHVpbnQzMl90IGc4ID0gKChwaXggJiAweDA3ZTApIDw8IDUpIHwgKChwaXggJiAweDA2MDApID4+IDEpOworICAgIHVpbnQzMl90IGI4ID0gKChwaXggJiAweDAwMWYpIDw8ICAzKSB8ICgocGl4ICYgMHgwMDFjKSA+PiAgMik7CisgICAgcmV0dXJuIHI4IHwgZzggfCBiOCB8IDB4ZmYwMDAwMDBVOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGFkaXNwbGF5X3NldF9vbmlvbihBRGlzcGxheSogZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luSW1hZ2UqIG9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5Sb3RhdGlvbiByb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJsZW5kKSB7CisgICAgaW50ICAgICAgICBvbmlvbl93LCBvbmlvbl9oOworICAgIFNraW5SZWN0KiAgcmVjdCAgPSAmZGlzcC0+cmVjdDsKKyAgICBTa2luUmVjdCogIG9yZWN0ID0gJmRpc3AtPm9uaW9uX3JlY3Q7CisKKyAgICByb3RhdGlvbiA9IChyb3RhdGlvbiArIGRpc3AtPnJvdGF0aW9uKSAmIDM7CisKKyAgICBza2luX2ltYWdlX3VucmVmKCAmZGlzcC0+b25pb24gKTsKKyAgICBkaXNwLT5vbmlvbiA9IHNraW5faW1hZ2VfY2xvbmVfZnVsbCggb25pb24sIHJvdGF0aW9uLCBibGVuZCApOworCisgICAgb25pb25fdyA9IHNraW5faW1hZ2VfdyhkaXNwLT5vbmlvbik7CisgICAgb25pb25faCA9IHNraW5faW1hZ2VfaChkaXNwLT5vbmlvbik7CisKKyAgICBzd2l0Y2ggKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8wOgorICAgICAgICAgICAgb3JlY3QtPnBvcyA9IHJlY3QtPnBvczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl85MDoKKyAgICAgICAgICAgIG9yZWN0LT5wb3MueCA9IHJlY3QtPnBvcy54ICsgcmVjdC0+c2l6ZS53IC0gb25pb25fdzsKKyAgICAgICAgICAgIG9yZWN0LT5wb3MueSA9IHJlY3QtPnBvcy55OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIG9yZWN0LT5wb3MueCA9IHJlY3QtPnBvcy54ICsgcmVjdC0+c2l6ZS53IC0gb25pb25fdzsKKyAgICAgICAgICAgIG9yZWN0LT5wb3MueSA9IHJlY3QtPnBvcy55ICsgcmVjdC0+c2l6ZS5oIC0gb25pb25faDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU0tJTl9ST1RBVElPTl8yNzA6CisgICAgICAgICAgICBvcmVjdC0+cG9zLnggPSByZWN0LT5wb3MueDsKKyAgICAgICAgICAgIG9yZWN0LT5wb3MueSA9IHJlY3QtPnBvcy55ICsgcmVjdC0+c2l6ZS5oIC0gb25pb25faDsKKyAgICB9CisgICAgb3JlY3QtPnNpemUudyA9IG9uaW9uX3c7CisgICAgb3JlY3QtPnNpemUuaCA9IG9uaW9uX2g7Cit9CisKKy8vIFNldCB0byAxIHRvIGVuYWJsZSBleHBlcmltZW50YWwgZG90LW1hdHJpeCBkaXNwbGF5IG1vZGUuCisjZGVmaW5lICBET1RfTUFUUklYICAwCisKKyNpZiBET1RfTUFUUklYCisKK3N0YXRpYyB2b2lkIGRvdG1hdHJpeF9kaXRoZXJfYXJnYjMyKHVuc2lnbmVkIGNoYXIqIHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRvdG1hdHJpeF9hcmdiMzJbMTZdID0geworICAgICAgICAweDAwM2YwMCwgMHgwMDAwM2YsIDB4M2YwMDAwLCAweDAwMDAwMCwKKyAgICAgICAgMHgzZjNmM2YsIDB4MDAwMDAwLCAweDNmM2YzZiwgMHgwMDAwMDAsCisgICAgICAgIDB4M2YwMDAwLCAweDAwMDAwMCwgMHgwMDNmMDAsIDB4MDAwMDNmLAorICAgICAgICAweDNmM2YzZiwgMHgwMDAwMDAsIDB4M2YzZjNmLCAweDAwMDAwMAorICAgIH07CisKKyAgICBpbnQgeXkgPSB5ICYgMzsKKworICAgIHBpeGVscyArPSAoNCAqIHgpICsgKHkgKiBwaXRjaCk7CisKKyAgICBmb3IgKDsgaCA+IDA7IGgtLSkgeworICAgICAgICB1bnNpZ25lZCogbGluZSA9ICh1bnNpZ25lZCopIHBpeGVsczsKKyAgICAgICAgaW50IG5uLCB4eCA9IHggJiAzOworCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IHc7IG5uKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkICBjID0gbGluZVtubl07CisKKyAgICAgICAgICAgIGMgPSBjIC0gKChjID4+IDIpICYgZG90bWF0cml4X2FyZ2IzMlsoeXkgPDwgMil8eHhdKTsKKworICAgICAgICAgICAgeHggPSAoeHggKyAxKSAmIDM7CisgICAgICAgICAgICBsaW5lW25uXSA9IGM7CisgICAgICAgIH0KKyAgICAgICAgeXkgPSAoeXkgKyAxKSAmIDM7CisgICAgICAgIHBpeGVscyArPSBwaXRjaDsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBET1RfTUFUUklYICovCisKKy8qIHRlY2huaWNhbCBub3RlIGFib3V0IHRoZSBsaWdodG5lc3MgZW11bGF0aW9uCisgKgorICogd2UgdHJ5IHRvIGVtdWxhdGUgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSB0aGUgRHJlYW0ncworICogbm9uLWxpbmVhciBMQ0QgbGlnaHRuZXNzLCB3aXRob3V0IGdvaW5nIHRvbyBkYXJrIG9yIGJyaWdodC4KKyAqCisgKiB0aGUgZGVmYXVsdCBsaWdodG5lc3MgaXMgYXJvdW5kIDEwNSAoYWJvdXQgNDAlKSBhbmQgd2UgcHJlZmVyCisgKiB0byBrZWVwIGZ1bGwgUkdCIGNvbG9ycyBhdCB0aGF0IHNldHRpbmcsIHRvIG5vdCBhbGxldmlhdGUKKyAqIGRldmVsb3BlcnMgd2hvIHdpbGwgbm90IHVuZGVyc3RhbmQgd2h5IHRoZSBlbXVsYXRvcidzIGNvbG9ycworICogbG9vayBzbGlnaHRseSB0b28gZGFyay4KKyAqCisgKiB3ZSBhbHNvIHdhbnQgdG8gaW1wbGVtZW50IGEgJ2JyaWdodCcgbW9kZSBieSBkZS1zYXR1cmF0aW5nCisgKiBjb2xvcnMgdG93YXJkcyBicmlnaHQgd2hpdGUuCisgKgorICogQWxsIG9mIHRoaXMgbGVhZHMgdG8gdGhlIGltcGxlbWVudGF0aW9uIGJlbG93IHRoYXQgbG9va3MgbGlrZQorICogdGhlIGZvbGxvd2luZzoKKyAqCisgKiBpZiAobGV2ZWwgPT0gTUlOKQorICogICAgIHNjcmVlbiBpcyBvZmYKKyAqCisgKiBpZiAobGV2ZWwgPiBNSU4gJiYgbGV2ZWwgPCBMT1cpCisgKiAgICAgaW50ZXJwb2xhdGUgdG93YXJkcyBibGFjaywgd2l0aAorICogICAgIE1JTkFMUEhBID0gMC4yCisgKiAgICAgYWxwaGEgPSBNSU5BTFBIQSArICgxLU1JTkFMUEhBKSoobGV2ZWwtTUlOKS8oTE9XLU1JTikKKyAqCisgKiBpZiAobGV2ZWwgPj0gTE9XICYmIGxldmVsIDw9IEhJR0gpCisgKiAgICAga2VlcCBmdWxsIFJHQiBjb2xvcnMKKyAqCisgKiBpZiAobGV2ZWwgPiBISUdIKQorICogICAgIGludGVycG9sYXRlIHRvd2FyZHMgYnJpZ2h0IHdoaXRlLCB3aXRoCisgKiAgICAgTUFYQUxQSEEgPSAwLjYKKyAqICAgICBhbHBoYSA9IE1BWEFMUEhBKihsZXZlbC1ISUdIKS8oTUFYLUhJR0gpCisgKgorICogd2UgcHJvYmFibHkgd2FudCBzb21lIHNvcnQgb2YgcG93ZXIgbGF3IGluc3RlYWQgb2YgaW50ZXJwb2xhdGluZworICogbGluZWFybHksIGJ1dCBmcmFua2x5LCB0aGlzIGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgdXNlcy4KKyAqLworCisjZGVmaW5lICBMQ0RfQlJJR0hUTkVTU19MT1cgICA4MAorI2RlZmluZSAgTENEX0JSSUdIVE5FU1NfSElHSCAgMTgwCisKKyNkZWZpbmUgIExDRF9BTFBIQV9MT1dfTUlOICAgICAgMC4yCisjZGVmaW5lICBMQ0RfQUxQSEFfSElHSF9NQVggICAgIDAuNgorCisvKiB0cmVhdCBhcyBzcGVjaWFsIHZhbHVlIHRvIHR1cm4gc2NyZWVuIG9mZiAqLworI2RlZmluZSAgTENEX0JSSUdIVE5FU1NfT0ZGICAgTENEX0JSSUdIVE5FU1NfTUlOCisKK3N0YXRpYyB2b2lkIGxjZF9icmlnaHRuZXNzX2FyZ2IzMih1aW50MzJfdCogcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnJpZ2h0bmVzcykKK3sKKyAgICBjb25zdCB1bnNpZ25lZCAgYl9taW4gID0gTENEX0JSSUdIVE5FU1NfTUlOOworICAgIGNvbnN0IHVuc2lnbmVkICBiX21heCAgPSBMQ0RfQlJJR0hUTkVTU19NQVg7CisgICAgY29uc3QgdW5zaWduZWQgIGJfbG93ICA9IExDRF9CUklHSFRORVNTX0xPVzsKKyAgICBjb25zdCB1bnNpZ25lZCAgYl9oaWdoID0gTENEX0JSSUdIVE5FU1NfSElHSDsKKworICAgIHVuc2lnbmVkICAgICAgICBhbHBoYSA9IGJyaWdodG5lc3M7CisKKyAgICBpZiAoYWxwaGEgPD0gYl9taW4pCisgICAgICAgIGFscGhhID0gYl9taW47CisgICAgZWxzZSBpZiAoYWxwaGEgPiBiX21heCkKKyAgICAgICAgYWxwaGEgPSBiX21heDsKKworICAgIGlmIChhbHBoYSA8IGJfbG93KQorICAgIHsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgIGFscGhhX21pbiAgID0gKDI1NSAqIExDRF9BTFBIQV9MT1dfTUlOKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgIGFscGhhX3JhbmdlID0gKDI1NSAtIGFscGhhX21pbik7CisKKyAgICAgICAgYWxwaGEgPSBhbHBoYV9taW4gKyAoKGFscGhhIC0gYl9taW4pICogYWxwaGFfcmFuZ2UpIC8gKGJfbG93IC0gYl9taW4pOworCisgICAgICAgIGZvciAoOyBoID4gMDsgaC0tKSB7CisgICAgICAgICAgICB1bnNpZ25lZCogbGluZSA9ICh1bnNpZ25lZCopIHBpeGVsczsKKyAgICAgICAgICAgIGludCBubiA9IDA7CisKKyAgICAgICAgICAgIERVRkY0KHcsIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjID0gbGluZVtubl07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYWcgPSAoYyA+PiA4KSAmIDB4MDBmZjAwZmY7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgcmIgPSAoYykgICAgICAmIDB4MDBmZjAwZmY7CisKKyAgICAgICAgICAgICAgICBhZyA9IChhZyAqIGFscGhhKSAgICAgICAgJiAweGZmMDBmZjAwOworICAgICAgICAgICAgICAgIHJiID0gKChyYiAqIGFscGhhKSA+PiA4KSAmIDB4MDBmZjAwZmY7CisKKyAgICAgICAgICAgICAgICBsaW5lW25uXSA9ICh1bnNpZ25lZCkoYWcgfCByYik7CisgICAgICAgICAgICAgICAgbm4rKzsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcGl4ZWxzICs9IChwaXRjaCAvIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGFscGhhID4gTENEX0JSSUdIVE5FU1NfSElHSCkgLyogJ3N1cGVybHVtaW5vdXMnIG1vZGUgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkICBhbHBoYV9tYXggICA9ICgyNTUgKiBMQ0RfQUxQSEFfSElHSF9NQVgpOworICAgICAgICBjb25zdCB1bnNpZ25lZCAgYWxwaGFfcmFuZ2UgPSAoMjU1IC0gYWxwaGFfbWF4KTsKKyAgICAgICAgdW5zaWduZWQgaWFscGhhOworCisgICAgICAgIGFscGhhICA9ICgoYWxwaGEgLSBiX2hpZ2gpICogYWxwaGFfcmFuZ2UpIC8gKGJfbWF4IC0gYl9oaWdoKTsKKyAgICAgICAgaWFscGhhID0gMjU1IC0gYWxwaGE7CisKKyAgICAgICAgZm9yICggOyBoID4gMDsgaC0tICkgeworICAgICAgICAgICAgdW5zaWduZWQqIGxpbmUgPSAodW5zaWduZWQqKSBwaXhlbHM7CisgICAgICAgICAgICBpbnQgbm4gPSAwOworCisgICAgICAgICAgICBEVUZGNCh3LCB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYyA9IGxpbmVbbm5dOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFnID0gKGMgPj4gOCkgJiAweDAwZmYwMGZmOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJiID0gKGMpICAgICAgJiAweDAwZmYwMGZmOworCisgICAgICAgICAgICAgICAgLyogaW50ZXJwb2xhdGUgdG93YXJkcyBicmlnaHQgd2hpdGUsIGkuZS4gMHgwMGZmZmZmZiAqLworICAgICAgICAgICAgICAgIGFnID0gKChhZyppYWxwaGEgKyAweDAwZmYwMGZmKmFscGhhKSkgJiAweGZmMDBmZjAwOworICAgICAgICAgICAgICAgIHJiID0gKChyYippYWxwaGEgKyAweDAwZmYwMGZmKmFscGhhKSA+PiA4KSAmIDB4MDBmZjAwZmY7CisKKyAgICAgICAgICAgICAgICBsaW5lW25uXSA9ICh1bnNpZ25lZCkoYWcgfCByYik7CisgICAgICAgICAgICAgICAgbm4rKzsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcGl4ZWxzICs9IChwaXRjaCAvIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGlzcGxheV91cGRhdGVfc3VyZmFjZV9waXhlbHNfMTYoQURpc3BsYXkqIGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tpblJlY3QqIGRzdF9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9waXRjaCkgeworICAgIGludCAgICAgICAgICAgeCAgPSBkc3RfcmVjdC0+cG9zLng7CisgICAgaW50ICAgICAgICAgICB5ICA9IGRzdF9yZWN0LT5wb3MueTsKKyAgICBpbnQgICAgICAgICAgIHcgID0gZHN0X3JlY3QtPnNpemUudzsKKyAgICBpbnQgICAgICAgICAgIGggID0gZHN0X3JlY3QtPnNpemUuaDsKKyAgICBpbnQgICAgICAgICAgIHNyY193ICAgID0gZGlzcC0+ZGF0YXNpemUudzsKKyAgICBpbnQgICAgICAgICAgIHNyY19oICAgID0gZGlzcC0+ZGF0YXNpemUuaDsKKyAgICBpbnQgICAgICAgICAgIHNyY19waXRjaCA9IHNyY193ICogMjsKKyAgICB1aW50OF90KiAgICAgIHNyY19saW5lICA9ICh1aW50OF90KilkaXNwLT5kYXRhOworICAgIHVpbnQ4X3QqICAgICAgZHN0X2xpbmUgID0gZHN0X3BpeGVsczsKKyAgICBpbnQgICAgICAgICAgIHl5LCB4eDsKKworICAgIHN3aXRjaCAoIGRpc3AtPnJvdGF0aW9uICYgMyApCisgICAgeworICAgIGNhc2UgU0tJTl9ST1RBVElPTl8wOgorICAgICAgICBzcmNfbGluZSArPSAoeCAqIDIpICsgKHkgKiBzcmNfcGl0Y2gpOworCisgICAgICAgIGZvciAoeXkgPSBoOyB5eSA+IDA7IHl5LS0pIHsKKyAgICAgICAgICAgIHVpbnQzMl90KiBkc3QgPSAodWludDMyX3QqKWRzdF9saW5lOworICAgICAgICAgICAgdWludDE2X3QqIHNyYyA9ICh1aW50MTZfdCopc3JjX2xpbmU7CisKKyAgICAgICAgICAgIHh4ID0gMDsKKyAgICAgICAgICAgIERVRkY0KHcsIHsKKyAgICAgICAgICAgICAgICBkc3RbeHhdID0gcmdiNTY1X3RvX2FyZ2IzMihzcmNbeHhdKTsKKyAgICAgICAgICAgICAgICB4eCsrOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSArPSBzcmNfcGl0Y2g7CisgICAgICAgICAgICBkc3RfbGluZSArPSBkc3RfcGl0Y2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNLSU5fUk9UQVRJT05fOTA6CisgICAgICAgIHNyY19saW5lICs9ICh5ICogMikgKyAoKHNyY19oIC0geCAtIDEpICogc3JjX3BpdGNoKTsKKworICAgICAgICBmb3IgKHl5ID0gaDsgeXkgPiAwOyB5eS0tKSB7CisgICAgICAgICAgICB1aW50MzJfdCogZHN0ID0gKHVpbnQzMl90Kilkc3RfbGluZTsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHNyYyA9IHNyY19saW5lOworCisgICAgICAgICAgICBEVUZGNCh3LCB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gcmdiNTY1X3RvX2FyZ2IzMigoKHVpbnQxNl90KilzcmMpWzBdKTsKKyAgICAgICAgICAgICAgICBzcmMgLT0gc3JjX3BpdGNoOworICAgICAgICAgICAgICAgIGRzdCArPSAxOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSArPSAyOworICAgICAgICAgICAgZHN0X2xpbmUgKz0gZHN0X3BpdGNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgc3JjX2xpbmUgKz0gKChzcmNfdyAtIDEgLSB4KSAqIDIpICsgKChzcmNfaCAtIDEgLSB5KSAqIHNyY19waXRjaCk7CisKKyAgICAgICAgZm9yICh5eSA9IGg7IHl5ID4gMDsgeXktLSkgeworICAgICAgICAgICAgdWludDE2X3QqIHNyYyA9ICh1aW50MTZfdCopc3JjX2xpbmU7CisgICAgICAgICAgICB1aW50MzJfdCogZHN0ID0gKHVpbnQzMl90Kilkc3RfbGluZTsKKworICAgICAgICAgICAgRFVGRjQodywgeworICAgICAgICAgICAgICAgIGRzdFswXSA9IHJnYjU2NV90b19hcmdiMzIoc3JjWzBdKTsKKyAgICAgICAgICAgICAgICBzcmMgLT0gMTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gMTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc3JjX2xpbmUgLT0gc3JjX3BpdGNoOworICAgICAgICAgICAgZHN0X2xpbmUgKz0gZHN0X3BpdGNoOworICAgIH0KKyAgICBicmVhazsKKworICAgIGRlZmF1bHQ6ICAvKiBTS0lOX1JPVEFUSU9OXzI3MCAqLworICAgICAgICBzcmNfbGluZSArPSAoKHNyY193IC0gMSAtIHkpICogMikgKyAoeCAqIHNyY19waXRjaCk7CisKKyAgICAgICAgZm9yICh5eSA9IGg7IHl5ID4gMDsgeXktLSkgeworICAgICAgICAgICAgdWludDMyX3QqIGRzdCA9ICh1aW50MzJfdCopZHN0X2xpbmU7CisgICAgICAgICAgICB1aW50OF90KiBzcmMgPSBzcmNfbGluZTsKKworICAgICAgICAgICAgRFVGRjQodywgeworICAgICAgICAgICAgICAgIGRzdFswXSA9IHJnYjU2NV90b19hcmdiMzIoKCh1aW50MTZfdCopc3JjKVswXSk7CisgICAgICAgICAgICAgICAgZHN0ICs9IDE7CisgICAgICAgICAgICAgICAgc3JjICs9IHNyY19waXRjaDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc3JjX2xpbmUgLT0gMjsKKyAgICAgICAgICAgIGRzdF9saW5lICs9IGRzdF9waXRjaDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRpc3BsYXlfdXBkYXRlX3N1cmZhY2VfcGl4ZWxzXzMyKEFEaXNwbGF5KiBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5SZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmNfcGl4ZWxzKSB7CisgICAgaW50ICAgICAgICAgICB4ICA9IHJlY3QtPnBvcy54OworICAgIGludCAgICAgICAgICAgeSAgPSByZWN0LT5wb3MueTsKKyAgICBpbnQgICAgICAgICAgIHcgID0gcmVjdC0+c2l6ZS53OworICAgIGludCAgICAgICAgICAgaCAgPSByZWN0LT5zaXplLmg7CisgICAgaW50ICAgICAgICAgICBzcmNfdyAgICAgPSBkaXNwLT5kYXRhc2l6ZS53OworICAgIGludCAgICAgICAgICAgc3JjX2ggICAgID0gZGlzcC0+ZGF0YXNpemUuaDsKKyAgICB1aW50OF90KiAgICAgIGRzdF9saW5lICA9IGRzdF9waXhlbHM7CisgICAgaW50ICAgICAgICAgICBzcmNfcGl0Y2ggPSBkaXNwLT5kYXRhc2l6ZS53ICogNDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfbGluZSAgPSAoY29uc3QgdWludDhfdCopc3JjX3BpeGVsczsKKyAgICBpbnQgICAgICAgICAgIHl5OworCisgICAgc3dpdGNoICggZGlzcC0+cm90YXRpb24gJiAzICkKKyAgICB7CisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzA6CisgICAgICAgIHNyY19saW5lICs9ICh4ICogNCkgKyAoeSAqIHNyY19waXRjaCk7CisKKyAgICAgICAgZm9yICh5eSA9IGg7IHl5ID4gMDsgeXktLSkgeworICAgICAgICAgICAgdWludDMyX3QqICBzcmMgPSAodWludDMyX3QqKXNyY19saW5lOworICAgICAgICAgICAgdWludDMyX3QqICBkc3QgPSAodWludDMyX3QqKWRzdF9saW5lOworCisgICAgICAgICAgICBEVUZGNCh3LCB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSArPSBzcmNfcGl0Y2g7CisgICAgICAgICAgICBkc3RfbGluZSArPSBkc3RfcGl0Y2g7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNLSU5fUk9UQVRJT05fOTA6CisgICAgICAgIHNyY19saW5lICs9ICh5ICogNCkgKyAoKHNyY19oIC0geCAtIDEpICogc3JjX3BpdGNoKTsKKworICAgICAgICBmb3IgKHl5ID0gaDsgeXkgPiAwOyB5eS0tKSB7CisgICAgICAgICAgICB1aW50MzJfdCogZHN0ID0gKHVpbnQzMl90Kilkc3RfbGluZTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqICBzcmMgPSBzcmNfbGluZTsKKworICAgICAgICAgICAgRFVGRjQodywgeworICAgICAgICAgICAgICAgIGRzdFswXSA9ICoodWludDMyX3QqKXNyYzsKKyAgICAgICAgICAgICAgICBzcmMgLT0gc3JjX3BpdGNoOworICAgICAgICAgICAgICAgIGRzdCArPSAxOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSArPSA0OworICAgICAgICAgICAgZHN0X2xpbmUgKz0gZHN0X3BpdGNoOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTS0lOX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgc3JjX2xpbmUgKz0gKChzcmNfdyAtIDEgLSB4KSAqIDQpICsgKChzcmNfaCAtIDEgLSB5KSAqIHNyY19waXRjaCk7CisKKyAgICAgICAgZm9yICh5eSA9IGg7IHl5ID4gMDsgeXktLSkgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QqICBzcmMgPSAoY29uc3QgdWludDMyX3QqKXNyY19saW5lOworICAgICAgICAgICAgdWludDMyX3QqICBkc3QgPSAodWludDMyX3QqKWRzdF9saW5lOworCisgICAgICAgICAgICBEVUZGNCh3LCB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgICAgIHNyYyAtPSAxOworICAgICAgICAgICAgICAgIGRzdCArPSAxOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSAtPSBzcmNfcGl0Y2g7CisgICAgICAgICAgICBkc3RfbGluZSArPSBkc3RfcGl0Y2g7CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogIC8qIFNLSU5fUk9UQVRJT05fMjcwICovCisgICAgICAgIHNyY19saW5lICs9ICgoc3JjX3cgLSAxIC0geSkgKiA0KSArICh4ICogc3JjX3BpdGNoKTsKKworICAgICAgICBmb3IgKHl5ID0gaDsgeXkgPiAwOyB5eS0tKQorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCogIGRzdCA9ICh1aW50MzJfdCopZHN0X2xpbmU7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiAgIHNyYyA9IHNyY19saW5lOworCisgICAgICAgICAgICBEVUZGNCh3LCB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gKih1aW50MzJfdCopc3JjOworICAgICAgICAgICAgICAgIGRzdCAgICs9IDE7CisgICAgICAgICAgICAgICAgc3JjICAgKz0gc3JjX3BpdGNoOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzcmNfbGluZSAtPSA0OworICAgICAgICAgICAgZHN0X2xpbmUgKz0gZHN0X3BpdGNoOworICAgICAgICB9CisgICAgfQorfQorCitzdHJ1Y3QgbG9jYWxfcGl4ZWxzX2J1ZmZlcl90IHsKKyAgICB1aW50OF90KiBwaXhlbHM7CisgICAgaW50IHNpemU7Cit9OworCitzdGF0aWMgc3RydWN0IGxvY2FsX3BpeGVsc19idWZmZXJfdCBsb2NhbF9waXhlbHNfYnVmZmVyID0gey5waXhlbHMgPSBOVUxMLCAuc2l6ZSA9IDB9OworCitzdGF0aWMgdWludDhfdCogbG9jYWxfY2FsbG9jKGludCBzaXplKSB7CisgICAgaWYgKGxvY2FsX3BpeGVsc19idWZmZXIucGl4ZWxzID09IE5VTEwpIHsKKyAgICAgICAgbG9jYWxfcGl4ZWxzX2J1ZmZlci5waXhlbHMgPSBjYWxsb2MoMSwgc2l6ZSk7CisgICAgICAgIGxvY2FsX3BpeGVsc19idWZmZXIuc2l6ZSA9IHNpemU7CisgICAgfSBlbHNlIGlmIChsb2NhbF9waXhlbHNfYnVmZmVyLnNpemUgPCBzaXplKSB7CisgICAgICAgIGxvY2FsX3BpeGVsc19idWZmZXIuc2l6ZSA9IHNpemUgPiAyICogbG9jYWxfcGl4ZWxzX2J1ZmZlci5zaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA6IDIgKiBsb2NhbF9waXhlbHNfYnVmZmVyLnNpemU7CisgICAgICAgIGZyZWUobG9jYWxfcGl4ZWxzX2J1ZmZlci5waXhlbHMpOworICAgICAgICBsb2NhbF9waXhlbHNfYnVmZmVyLnBpeGVscyA9IGNhbGxvYygxLCBsb2NhbF9waXhlbHNfYnVmZmVyLnNpemUpOworICAgIH0KKyAgICByZXR1cm4gbG9jYWxfcGl4ZWxzX2J1ZmZlci5waXhlbHM7Cit9CisKKy8vIFVwZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgZGlzcGxheSBzdXJmYWNlIGZyb20gdGhlIGZyYW1lYnVmZmVyIGNvbnRlbnQuCisvLyB8ZGlzcHwgaXMgdGhlIHRhcmdldCBBRGlzcGxheSBpbnN0YW5jZS4KKy8vIHxyZWN0fCBpcyB0aGUgcmVjdGFuZ2xlIHRvIHVwZGF0ZSwgaW4gY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlCisvLyBkaXNwbGF5IHN1cmZhY2UsIGkuZS4gKDAsMCkgaXMgYWx3YXlzIHRoZSB0b3AtbGVmdCBjb3JuZXIuCitzdGF0aWMgdm9pZCBhZGlzcGxheV91cGRhdGVfc3VyZmFjZShBRGlzcGxheSogZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5SZWN0KiByZWN0KSB7CisgICAgaW50IHggPSByZWN0LT5wb3MueDsKKyAgICBpbnQgeSA9IHJlY3QtPnBvcy55OworICAgIGludCB3ID0gcmVjdC0+c2l6ZS53OworICAgIGludCBoID0gcmVjdC0+c2l6ZS5oOworCisgICAgLy8gQ2xpcCB1cGRhdGUgcmVjdGFuZ2xlIGZvciBzYW5pdHkuCisgICAgaW50IGRlbHRhID0gKHggKyB3KSAtIGRpc3AtPnJlY3Quc2l6ZS53OworICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgdyAtPSBkZWx0YTsKKyAgICB9CisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHcgKz0geDsKKyAgICAgICAgeCA9IDA7CisgICAgfQorICAgIGRlbHRhID0gKHkgKyBoKSAtIGRpc3AtPnJlY3Quc2l6ZS5oOworICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgaCAtPSBkZWx0YTsKKyAgICB9CisgICAgaWYgKHkgPCAwKSB7CisgICAgICAgIGggKz0gZGVsdGE7CisgICAgICAgIHkgPSAwOworICAgIH0KKyAgICBpZiAodyA8PSAwIHx8IGggPD0gMCkgeworICAgICAgICByZXR1cm47ICAvLyBub3RoaW5nIHRvIGRvLgorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0byBnZXQgdGhlIHBvdGVudGlhbGx5IHJvdGF0ZWQgLyBjb252ZXJ0ZWQKKyAgICAvLyBjb250ZW50LgorICAgIGludCBzeiA9IGRpc3AtPmRhdGFzaXplLmggPiBkaXNwLT5kYXRhc2l6ZS53ID8gZGlzcC0+ZGF0YXNpemUuaCA6IGRpc3AtPmRhdGFzaXplLnc7CisgICAgaW50IGRzdF9waXRjaCA9IDQgKiBzejsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHN6ICogZHN0X3BpdGNoOworICAgIHVpbnQ4X3QqIGRzdF9waXhlbHMgPSBsb2NhbF9jYWxsb2Moc2l6ZSk7CisgICAgaWYgKGRzdF9waXhlbHMgPT0gTlVMTCkgeworICAgICAgICBkZXJyb3IoIkVSUk9SOiAlczolZCBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IG9mICVkIGJ5dGVzLlxuIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgc2l6ZSk7CisgICAgICAgIGNyYXNoaGFuZGxlcl9kaWVfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiRGlzcGxheSBzdXJmYWNlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICIocmVxdWVzdGVkICVkIGJ5dGVzKSIsCisgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIH0KKworICAgIFNraW5SZWN0IGRzdF9yID0geworICAgICAgICAucG9zLnggPSB4LAorICAgICAgICAucG9zLnkgPSB5LAorICAgICAgICAuc2l6ZS53ID0gdywKKyAgICAgICAgLnNpemUuaCA9IGggfTsKKworICAgIGlmIChkaXNwLT5ncHVfZnJhbWUpIHsKKyAgICAgICAgLy8gQ29udGVudCBjb21lcyBmcm9tIHRoZSBlbXVsYXRlZCBHUFUuCisgICAgICAgIGFkaXNwbGF5X3VwZGF0ZV9zdXJmYWNlX3BpeGVsc18zMigKKyAgICAgICAgICAgICAgICBkaXNwLCAmZHN0X3IsIGRzdF9waXhlbHMsIGRzdF9waXRjaCwgZGlzcC0+Z3B1X2ZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDb250ZW50IGNvbWVzIGZyb20gdGhlIGVtdWxhdGVkIGZyYW1lYnVmZmVyLgorICAgICAgICBpZiAoZGlzcC0+Yml0c19wZXJfcGl4ZWwgPT0gMzIpIHsKKyAgICAgICAgICAgIGFkaXNwbGF5X3VwZGF0ZV9zdXJmYWNlX3BpeGVsc18zMigKKyAgICAgICAgICAgICAgICAgICAgZGlzcCwgJmRzdF9yLCBkc3RfcGl4ZWxzLCBkc3RfcGl0Y2gsIGRpc3AtPmRhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRpc3BsYXlfdXBkYXRlX3N1cmZhY2VfcGl4ZWxzXzE2KAorICAgICAgICAgICAgICAgICAgICBkaXNwLCAmZHN0X3IsIGRzdF9waXhlbHMsIGRzdF9waXRjaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBcHBseSBicmlnaHRuZXNzIG1vZHVsYXRpb24uCisgICAgbGNkX2JyaWdodG5lc3NfYXJnYjMyKCh1aW50MzJfdCopZHN0X3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcC0+ZGF0YXNpemUudywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcC0+ZGF0YXNpemUuaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwLT5icmlnaHRuZXNzKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgZGlzcGxheSBzdXJmYWNlIGNvbnRlbnQKKyAgICBza2luX3N1cmZhY2VfdXBsb2FkKGRpc3AtPnN1cmZhY2UsICZkc3RfciwgZHN0X3BpeGVscywgZHN0X3BpdGNoKTsKKworICAgIC8vIERvbmUKK30KKworc3RhdGljIHZvaWQgYWRpc3BsYXlfcmVkcmF3KEFEaXNwbGF5KiBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5SZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraW5TdXJmYWNlKiBzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNpbmdfZW11Z2xfc3Vid2luZG93KSB7CisgICAgU2tpblJlY3QgIHI7CisKKyAgICBpZiAoIXNraW5fcmVjdF9pbnRlcnNlY3QoJnIsIHJlY3QsICZkaXNwLT5yZWN0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiLS0tIGRpc3BsYXkgcmVkcmF3IHIucG9zKCVkLCVkKSByLnNpemUoJWQsJWQpICIKKyAgICAgICAgICAgICJkaXNwLnBvcyglZCwlZCkgZGlzcC5zaXplKCVkLCVkKSBkYXRhc2l6ZSglZCwlZCkgcmVjdC5wb3MoJWQsJWQpIHJlY3Quc2l6ZSglZCwlZClcbiIsCisgICAgICAgICAgICByLnBvcy54IC0gZGlzcC0+cmVjdC5wb3MueCwgci5wb3MueSAtIGRpc3AtPnJlY3QucG9zLnksCisgICAgICAgICAgICByLnNpemUudywgci5zaXplLmgsIGRpc3AtPnJlY3QucG9zLngsIGRpc3AtPnJlY3QucG9zLnksCisgICAgICAgICAgICBkaXNwLT5yZWN0LnNpemUudywgZGlzcC0+cmVjdC5zaXplLmgsIGRpc3AtPmRhdGFzaXplLncsIGRpc3AtPmRhdGFzaXplLmgsCisgICAgICAgICAgICByZWN0LT5wb3MueCwgcmVjdC0+cG9zLnksIHJlY3QtPnNpemUudywgcmVjdC0+c2l6ZS5oICk7CisjZW5kaWYKKworICAgIC8vIFVwZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgZGlzcGxheSBzdXJmYWNlLgorICAgIFNraW5SZWN0IHNyY19yID0gcjsKKyAgICBzcmNfci5wb3MueCAtPSBkaXNwLT5yZWN0LnBvcy54OworICAgIHNyY19yLnBvcy55IC09IGRpc3AtPnJlY3QucG9zLnk7CisgICAgaWYgKCF1c2luZ19lbXVnbF9zdWJ3aW5kb3cpIHsKKyAgICAgICAgYWRpc3BsYXlfdXBkYXRlX3N1cmZhY2UoZGlzcCwgJnNyY19yKTsKKyAgICB9CisKKyAgICBpZiAoZGlzcC0+YnJpZ2h0bmVzcyA9PSBMQ0RfQlJJR0hUTkVTU19PRkYpIHsKKyAgICAgICAgLy8gRmlsbCB3aW5kb3cgc3VyZmFjZSB3aXRoIHNvbGlkIGJsYWNrLgorICAgICAgICBza2luX3N1cmZhY2VfZmlsbChzdXJmYWNlLCAmciwgMHhmZjAwMDAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2tpbl9zdXJmYWNlX2JsaXQoc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnIucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwLT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSU5fQkxJVF9DT1BZKTsKKyAgICB9CisKKyAgICAvKiBBcHBseSBvbmlvbiBza2luICovCisgICAgaWYgKGRpc3AtPm9uaW9uICE9IE5VTEwpIHsKKyAgICAgICAgU2tpblJlY3QgIHIyOworCisgICAgICAgIGlmICggc2tpbl9yZWN0X2ludGVyc2VjdCggJnIyLCAmciwgJmRpc3AtPm9uaW9uX3JlY3QgKSApIHsKKyAgICAgICAgICAgIFNraW5SZWN0IHNyY19yZWN0OworICAgICAgICAgICAgc3JjX3JlY3QucG9zLnggPSByMi5wb3MueCAtIGRpc3AtPm9uaW9uX3JlY3QucG9zLng7CisgICAgICAgICAgICBzcmNfcmVjdC5wb3MueSA9IHIyLnBvcy55IC0gZGlzcC0+b25pb25fcmVjdC5wb3MueTsKKyAgICAgICAgICAgIHNyY19yZWN0LnNpemUgPSByMi5zaXplOworCisgICAgICAgICAgICBza2luX3N1cmZhY2VfYmxpdChzdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcjIucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luX2ltYWdlX3N1cmZhY2UoZGlzcC0+b25pb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSU5fQkxJVF9TUkNPVkVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNraW5fc3VyZmFjZV91cGRhdGUoc3VyZmFjZSwgJnIpOworfQorCisKK3R5cGVkZWYgc3RydWN0IEJ1dHRvbiB7CisgICAgU2tpbkltYWdlKiAgICAgICBpbWFnZTsKKyAgICBTa2luUmVjdCAgICAgICAgIHJlY3Q7CisgICAgU2tpblBvcyAgICAgICAgICBvcmlnaW47CisgICAgQmFja2dyb3VuZCogICAgICBiYWNrZ3JvdW5kOworICAgIHVuc2lnbmVkICAgICAgICAga2V5Y29kZTsKKyAgICBpbnQgICAgICAgICAgICAgIGRvd247Cit9IEJ1dHRvbjsKKworc3RhdGljIHZvaWQKK2J1dHRvbl9kb25lKCBCdXR0b24qICBidXR0b24gKQoreworICAgIHNraW5faW1hZ2VfdW5yZWYoICZidXR0b24tPmltYWdlICk7CisgICAgYnV0dG9uLT5iYWNrZ3JvdW5kID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2J1dHRvbl9pbml0KCBCdXR0b24qICBidXR0b24sIFNraW5CdXR0b24qICBzYnV0dG9uLCBTa2luTG9jYXRpb24qICBsb2MsIEJhY2tncm91bmQqICBiYWNrLCBTa2luUmVjdCogIGZyYW1lLCBTa2luTGF5b3V0KiAgc2xheW91dCApCit7CisgICAgU2tpblJlY3QgIHI7CisKKyAgICBidXR0b24tPmltYWdlICAgICAgPSBza2luX2ltYWdlX3JvdGF0ZSggc2J1dHRvbi0+aW1hZ2UsIGxvYy0+cm90YXRpb24gKTsKKyAgICBidXR0b24tPmJhY2tncm91bmQgPSBiYWNrOworICAgIGJ1dHRvbi0+a2V5Y29kZSAgICA9IHNidXR0b24tPmtleWNvZGU7CisgICAgYnV0dG9uLT5kb3duICAgICAgID0gMDsKKworICAgIGlmIChzbGF5b3V0LT5oYXNfZHBhZF9yb3RhdGlvbikgeworICAgICAgICAvKiBEcGFkIGtleXMgbXVzdCBiZSByb3RhdGVkIGlmIHRoZSBza2luIHByb3ZpZGVzIGEgJ2RwYWQtcm90YXRpb24nIGZpZWxkLgorICAgICAgICAgKiB0aGlzIGlzIHVzZWQgYXMgYSBjb3VudGVyLW1lYXN1cmUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgZnJhbWV3b3JrIGFsd2F5cyBhc3N1bWVzCisgICAgICAgICAqIHRoYXQgdGhlIHBoeXNpY2FsIEQtUGFkIGhhcyBiZWVuIHJvdGF0ZWQgd2hlbiBpbiBsYW5kc2NhcGUgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGJ1dHRvbi0+a2V5Y29kZSA9IHNraW5fa2V5Y29kZV9yb3RhdGUoIGJ1dHRvbi0+a2V5Y29kZSwgLXNsYXlvdXQtPmRwYWRfcm90YXRpb24gKTsKKyAgICB9CisKKyAgICBza2luX3JlY3Rfcm90YXRlKCAmciwgJnNidXR0b24tPnJlY3QsIGxvYy0+cm90YXRpb24gKTsKKyAgICByLnBvcy54ICs9IGxvYy0+YW5jaG9yLng7CisgICAgci5wb3MueSArPSBsb2MtPmFuY2hvci55OworICAgIGJ1dHRvbi0+b3JpZ2luID0gci5wb3M7CisgICAgc2tpbl9yZWN0X2ludGVyc2VjdCggJmJ1dHRvbi0+cmVjdCwgJnIsIGZyYW1lICk7Cit9CisKK3N0YXRpYyB2b2lkCitidXR0b25fcmVkcmF3KEJ1dHRvbiogYnV0dG9uLCBTa2luUmVjdCogcmVjdCwgU2tpblN1cmZhY2UqIHN1cmZhY2UpCit7CisgICAgU2tpblJlY3QgIHI7CisKKyAgICBpZiAoc2tpbl9yZWN0X2ludGVyc2VjdCggJnIsIHJlY3QsICZidXR0b24tPnJlY3QgKSkKKyAgICB7CisgICAgICAgIGlmICggYnV0dG9uLT5kb3duICYmIGJ1dHRvbi0+aW1hZ2UgIT0gU0tJTl9JTUFHRV9OT05FICkKKyAgICAgICAgeworICAgICAgICAgICAgU2tpblJlY3Qgc3JjX3JlY3Q7CisgICAgICAgICAgICBzcmNfcmVjdC5wb3MueCA9IHIucG9zLnggLSBidXR0b24tPm9yaWdpbi54OworICAgICAgICAgICAgc3JjX3JlY3QucG9zLnkgPSByLnBvcy55IC0gYnV0dG9uLT5vcmlnaW4ueTsKKyAgICAgICAgICAgIHNyY19yZWN0LnNpemUgPSByLnNpemU7CisKKyAgICAgICAgICAgIGlmIChidXR0b24tPmltYWdlICE9IFNLSU5fSU1BR0VfTk9ORSkgeworICAgICAgICAgICAgICAgIHNraW5fc3VyZmFjZV9ibGl0KHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW5faW1hZ2Vfc3VyZmFjZShidXR0b24tPmltYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJTl9CTElUX1NSQ09WRVIpOworICAgICAgICAgICAgICAgIGlmIChidXR0b24tPmRvd24gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNraW5fc3VyZmFjZV9ibGl0KHN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbl9pbWFnZV9zdXJmYWNlKGJ1dHRvbi0+aW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSU5fQkxJVF9TUkNPVkVSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgICB0cmFja2luZzsKKyAgICBjaGFyICAgICAgaW5zaWRlOworICAgIFNraW5Qb3MgICBwb3M7CisgICAgQURpc3BsYXkqICBkaXNwbGF5OworfSBGaW5nZXJTdGF0ZTsKKworc3RhdGljIHZvaWQKK2Zpbmdlcl9zdGF0ZV9yZXNldCggRmluZ2VyU3RhdGUqICBmaW5nZXIgKQoreworICAgIGZpbmdlci0+dHJhY2tpbmcgPSAwOworICAgIGZpbmdlci0+aW5zaWRlICAgPSAwOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQnV0dG9uKiAgIHByZXNzZWQ7CisgICAgQnV0dG9uKiAgIGhvdmVyOworfSBCdXR0b25TdGF0ZTsKKworc3RhdGljIHZvaWQKK2J1dHRvbl9zdGF0ZV9yZXNldCggQnV0dG9uU3RhdGUqICBidXR0b24gKQoreworICAgIGJ1dHRvbi0+cHJlc3NlZCA9IE5VTEw7CisgICAgYnV0dG9uLT5ob3ZlciAgID0gTlVMTDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgICAgICAgICB0cmFja2luZzsKKyAgICBTa2luVHJhY2tCYWxsKiAgYmFsbDsKKyAgICBTa2luUmVjdCAgICAgICAgcmVjdDsKKyAgICBTa2luV2luZG93KiAgICAgd2luZG93OworfSBCYWxsU3RhdGU7CisKK3N0YXRpYyB2b2lkCitiYWxsX3N0YXRlX3Jlc2V0KCBCYWxsU3RhdGUqICBzdGF0ZSwgU2tpbldpbmRvdyogIHdpbmRvdyApCit7CisgICAgc3RhdGUtPnRyYWNraW5nID0gMDsKKyAgICBzdGF0ZS0+YmFsbCAgICAgPSBOVUxMOworCisgICAgc3RhdGUtPnJlY3QucG9zLnggID0gMDsKKyAgICBzdGF0ZS0+cmVjdC5wb3MueSAgPSAwOworICAgIHN0YXRlLT5yZWN0LnNpemUudyA9IDA7CisgICAgc3RhdGUtPnJlY3Quc2l6ZS5oID0gMDsKKyAgICBzdGF0ZS0+d2luZG93ICAgICAgPSB3aW5kb3c7Cit9CisKK3N0YXRpYyB2b2lkCitiYWxsX3N0YXRlX3JlZHJhdyhCYWxsU3RhdGUqIHN0YXRlLCBTa2luUmVjdCogcmVjdCwgU2tpblN1cmZhY2UqIHN1cmZhY2UpCit7CisgICAgU2tpblJlY3QgIHI7CisKKyAgICBpZiAoc2tpbl9yZWN0X2ludGVyc2VjdCggJnIsIHJlY3QsICZzdGF0ZS0+cmVjdCApKQorICAgICAgICBza2luX3RyYWNrYmFsbF9kcmF3KHN0YXRlLT5iYWxsLCAwLCAwLCBzdXJmYWNlKTsKK30KKworc3RhdGljIHZvaWQKK2JhbGxfc3RhdGVfc2hvdyggQmFsbFN0YXRlKiAgc3RhdGUsIGludCAgZW5hYmxlICkKK3sKKyAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgIGlmICggIXN0YXRlLT50cmFja2luZyApIHsKKyAgICAgICAgICAgIHN0YXRlLT50cmFja2luZyA9IDE7CisgICAgICAgICAgICBza2luX3RyYWNrYmFsbF9yZWZyZXNoKCBzdGF0ZS0+YmFsbCApOworICAgICAgICAgICAgc2tpbl93aW5kb3dfcmVkcmF3KCBzdGF0ZS0+d2luZG93LCAmc3RhdGUtPnJlY3QgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggc3RhdGUtPnRyYWNraW5nICkgeworICAgICAgICAgICAgc3RhdGUtPnRyYWNraW5nID0gMDsKKyAgICAgICAgICAgIHNraW5fd2luZG93X3JlZHJhdyggc3RhdGUtPndpbmRvdywgJnN0YXRlLT5yZWN0ICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2JhbGxfc3RhdGVfc2V0KCBCYWxsU3RhdGUqICBzdGF0ZSwgU2tpblRyYWNrQmFsbCogIGJhbGwgKQoreworICAgIGJhbGxfc3RhdGVfc2hvdyggc3RhdGUsIDAgKTsKKworICAgIHN0YXRlLT5iYWxsID0gYmFsbDsKKyAgICBpZiAoYmFsbCAhPSBOVUxMKSB7CisgICAgICAgIHNraW5fdHJhY2tiYWxsX3JlY3QoYmFsbCwgJnN0YXRlLT5yZWN0KTsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RydWN0IExheW91dCB7CisgICAgaW50ICAgICAgICAgIG51bV9idXR0b25zOworICAgIGludCAgICAgICAgICBudW1fYmFja2dyb3VuZHM7CisgICAgaW50ICAgICAgICAgIG51bV9kaXNwbGF5czsKKyAgICB1bnNpZ25lZCAgICAgY29sb3I7CisgICAgQnV0dG9uKiAgICAgIGJ1dHRvbnM7CisgICAgQmFja2dyb3VuZCogIGJhY2tncm91bmRzOworICAgIEFEaXNwbGF5KiAgICBkaXNwbGF5czsKKyAgICBTa2luUmVjdCAgICAgcmVjdDsKKyAgICBTa2luTGF5b3V0KiAgc2xheW91dDsKK30gTGF5b3V0OworCisjZGVmaW5lICBMQVlPVVRfTE9PUF9CVVRUT05TKGxheW91dCxidXR0b24pICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJ1dHRvbiogIF9fYnV0dG9uID0gKGxheW91dCktPmJ1dHRvbnM7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEJ1dHRvbiogIF9fYnV0dG9uX2VuZCA9IF9fYnV0dG9uICsgKGxheW91dCktPm51bV9idXR0b25zOyAgICBcCisgICAgICAgIGZvciAoIDsgX19idXR0b24gPCBfX2J1dHRvbl9lbmQ7IF9fYnV0dG9uICsrICkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgICBCdXR0b24qICBidXR0b24gPSBfX2J1dHRvbjsKKworI2RlZmluZSAgTEFZT1VUX0xPT1BfRU5EX0JVVFRPTlMgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lICBMQVlPVVRfTE9PUF9ESVNQTEFZUyhsYXlvdXQsZGlzcGxheSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBRGlzcGxheSogIF9fZGlzcGxheSA9IChsYXlvdXQpLT5kaXNwbGF5czsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFEaXNwbGF5KiAgX19kaXNwbGF5X2VuZCA9IF9fZGlzcGxheSArIChsYXlvdXQpLT5udW1fZGlzcGxheXM7IFwKKyAgICAgICAgZm9yICggOyBfX2Rpc3BsYXkgPCBfX2Rpc3BsYXlfZW5kOyBfX2Rpc3BsYXkgKysgKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAgQURpc3BsYXkqICBkaXNwbGF5ID0gX19kaXNwbGF5OworCisjZGVmaW5lICBMQVlPVVRfTE9PUF9FTkRfRElTUExBWVMgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworCitzdGF0aWMgdm9pZAorbGF5b3V0X2RvbmUoIExheW91dCogIGxheW91dCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGxheW91dC0+bnVtX2J1dHRvbnM7IG5uKyspCisgICAgICAgIGJ1dHRvbl9kb25lKCAmbGF5b3V0LT5idXR0b25zW25uXSApOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgbGF5b3V0LT5udW1fYmFja2dyb3VuZHM7IG5uKyspCisgICAgICAgIGJhY2tncm91bmRfZG9uZSggJmxheW91dC0+YmFja2dyb3VuZHNbbm5dICk7CisKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBsYXlvdXQtPm51bV9kaXNwbGF5czsgbm4rKykKKyAgICAgICAgYWRpc3BsYXlfZG9uZSggJmxheW91dC0+ZGlzcGxheXNbbm5dICk7CisKKyAgICBBRlJFRSggbGF5b3V0LT5idXR0b25zICk7CisgICAgbGF5b3V0LT5idXR0b25zID0gTlVMTDsKKworICAgIEFGUkVFKCBsYXlvdXQtPmJhY2tncm91bmRzICk7CisgICAgbGF5b3V0LT5iYWNrZ3JvdW5kcyA9IE5VTEw7CisKKyAgICBBRlJFRSggbGF5b3V0LT5kaXNwbGF5cyApOworICAgIGxheW91dC0+ZGlzcGxheXMgPSBOVUxMOworCisgICAgbGF5b3V0LT5udW1fYnV0dG9ucyAgICAgPSAwOworICAgIGxheW91dC0+bnVtX2JhY2tncm91bmRzID0gMDsKKyAgICBsYXlvdXQtPm51bV9kaXNwbGF5cyAgICA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK2xheW91dF9pbml0KCBMYXlvdXQqICBsYXlvdXQsIFNraW5MYXlvdXQqICBzbGF5b3V0ICkKK3sKKyAgICBpbnQgICAgICAgbl9idXR0b25zLCBuX2JhY2tncm91bmRzLCBuX2Rpc3BsYXlzOworCisgICAgLyogZmlyc3QsIGNvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZWFjaCBraW5kICovCisgICAgbl9idXR0b25zICAgICA9IDA7CisgICAgbl9iYWNrZ3JvdW5kcyA9IDA7CisgICAgbl9kaXNwbGF5cyAgICA9IDA7CisKKyAgICBsYXlvdXQtPmNvbG9yICAgPSBzbGF5b3V0LT5jb2xvcjsKKyAgICBsYXlvdXQtPnNsYXlvdXQgPSBzbGF5b3V0OworCisgICAgU0tJTl9MQVlPVVRfTE9PUF9MT0NTKHNsYXlvdXQsbG9jKQorICAgICAgICBTa2luUGFydCogICAgcGFydCA9IGxvYy0+cGFydDsKKworICAgICAgICBpZiAoIHBhcnQtPmJhY2tncm91bmQtPnZhbGlkICkKKyAgICAgICAgICAgIG5fYmFja2dyb3VuZHMgKz0gMTsKKyAgICAgICAgaWYgKCBwYXJ0LT5kaXNwbGF5LT52YWxpZCApCisgICAgICAgICAgICBuX2Rpc3BsYXlzICs9IDE7CisKKyAgICAgICAgU0tJTl9QQVJUX0xPT1BfQlVUVE9OUyhwYXJ0LCBzYnV0dG9uKQorICAgICAgICAgICAgbl9idXR0b25zICs9IDE7CisgICAgICAgICAgICAodm9pZClzYnV0dG9uOworICAgICAgICBTS0lOX1BBUlRfTE9PUF9FTkQKKyAgICBTS0lOX0xBWU9VVF9MT09QX0VORAorCisgICAgbGF5b3V0LT5udW1fYnV0dG9ucyAgICAgPSBuX2J1dHRvbnM7CisgICAgbGF5b3V0LT5udW1fYmFja2dyb3VuZHMgPSBuX2JhY2tncm91bmRzOworICAgIGxheW91dC0+bnVtX2Rpc3BsYXlzICAgID0gbl9kaXNwbGF5czsKKworICAgIC8qIG5vdyBhbGxvY2F0ZSBhcnJheXMsIHRoZW4gcG9wdWxhdGUgdGhlbSAqLworICAgIEFBUlJBWV9ORVcwKGxheW91dC0+YnV0dG9ucywgICAgIG5fYnV0dG9ucyk7CisgICAgQUFSUkFZX05FVzAobGF5b3V0LT5iYWNrZ3JvdW5kcywgbl9iYWNrZ3JvdW5kcyk7CisgICAgQUFSUkFZX05FVzAobGF5b3V0LT5kaXNwbGF5cywgICAgbl9kaXNwbGF5cyk7CisKKyAgICBpZiAobGF5b3V0LT5idXR0b25zID09IE5VTEwgJiYgbl9idXR0b25zID4gMCkgZ290byBGYWlsOworICAgIGlmIChsYXlvdXQtPmJhY2tncm91bmRzID09IE5VTEwgJiYgbl9iYWNrZ3JvdW5kcyA+IDApIGdvdG8gRmFpbDsKKyAgICBpZiAobGF5b3V0LT5kaXNwbGF5cyA9PSBOVUxMICYmIG5fZGlzcGxheXMgPiAwKSBnb3RvIEZhaWw7CisKKyAgICBuX2J1dHRvbnMgICAgID0gMDsKKyAgICBuX2JhY2tncm91bmRzID0gMDsKKyAgICBuX2Rpc3BsYXlzICAgID0gMDsKKworICAgIGxheW91dC0+cmVjdC5wb3MueCA9IDA7CisgICAgbGF5b3V0LT5yZWN0LnBvcy55ID0gMDsKKyAgICBsYXlvdXQtPnJlY3Quc2l6ZSAgPSBzbGF5b3V0LT5zaXplOworCisgICAgU0tJTl9MQVlPVVRfTE9PUF9MT0NTKHNsYXlvdXQsbG9jKQorICAgICAgICBTa2luUGFydCogICAgcGFydCA9IGxvYy0+cGFydDsKKyAgICAgICAgQmFja2dyb3VuZCogIGJhY2sgPSBOVUxMOworCisgICAgICAgIGlmICggcGFydC0+YmFja2dyb3VuZC0+dmFsaWQgKSB7CisgICAgICAgICAgICBiYWNrID0gbGF5b3V0LT5iYWNrZ3JvdW5kcyArIG5fYmFja2dyb3VuZHM7CisgICAgICAgICAgICBiYWNrZ3JvdW5kX2luaXQoIGJhY2ssIHBhcnQtPmJhY2tncm91bmQsIGxvYywgJmxheW91dC0+cmVjdCApOworICAgICAgICAgICAgbl9iYWNrZ3JvdW5kcyArPSAxOworICAgICAgICB9CisgICAgICAgIGlmICggcGFydC0+ZGlzcGxheS0+dmFsaWQgKSB7CisgICAgICAgICAgICBBRGlzcGxheSogIGRpc3AgPSBsYXlvdXQtPmRpc3BsYXlzICsgbl9kaXNwbGF5czsKKyAgICAgICAgICAgIGFkaXNwbGF5X2luaXQoIGRpc3AsIHBhcnQtPmRpc3BsYXksIGxvYywgJmxheW91dC0+cmVjdCApOworICAgICAgICAgICAgbl9kaXNwbGF5cyArPSAxOworICAgICAgICB9CisKKyAgICAgICAgU0tJTl9QQVJUX0xPT1BfQlVUVE9OUyhwYXJ0LCBzYnV0dG9uKQorICAgICAgICAgICAgQnV0dG9uKiAgYnV0dG9uID0gbGF5b3V0LT5idXR0b25zICsgbl9idXR0b25zOworICAgICAgICAgICAgYnV0dG9uX2luaXQoIGJ1dHRvbiwgc2J1dHRvbiwgbG9jLCBiYWNrLCAmbGF5b3V0LT5yZWN0LCBzbGF5b3V0ICk7CisgICAgICAgICAgICBuX2J1dHRvbnMgKz0gMTsKKyAgICAgICAgU0tJTl9QQVJUX0xPT1BfRU5ECisgICAgU0tJTl9MQVlPVVRfTE9PUF9FTkQKKworICAgIHJldHVybiAwOworCitGYWlsOgorICAgIGxheW91dF9kb25lKGxheW91dCk7CisgICAgcmV0dXJuIC0xOworfQorCitzdHJ1Y3QgU2tpbldpbmRvdyB7CisgICAgY29uc3QgU2tpbldpbmRvd0Z1bmNzKiB3aW5fZnVuY3M7CisgICAgU2tpblN1cmZhY2UqICBzdXJmYWNlOworICAgIExheW91dCAgICAgICAgbGF5b3V0OworICAgIFNraW5Qb3MgICAgICAgcG9zOworICAgIEZpbmdlclN0YXRlICAgZmluZ2VyOworICAgIEZpbmdlclN0YXRlICAgc2Vjb25kYXJ5X2ZpbmdlcjsKKyAgICBCdXR0b25TdGF0ZSAgIGJ1dHRvbjsKKyAgICBCYWxsU3RhdGUgICAgIGJhbGw7CisgICAgYm9vbCAgICAgICAgICB1c2VfZW11Z2xfc3Vid2luZG93OworCisgICAgY2hhciAgICAgICAgICBlbmFibGVfdG91Y2g7CisgICAgY2hhciAgICAgICAgICBlbmFibGVfdHJhY2tiYWxsOworICAgIGNoYXIgICAgICAgICAgZW5hYmxlX2RwYWQ7CisgICAgY2hhciAgICAgICAgICBlbmFibGVfcXdlcnR5OworCisgICAgU2tpbkltYWdlKiAgICBvbmlvbjsKKyAgICBTa2luUm90YXRpb24gIG9uaW9uX3JvdGF0aW9uOworICAgIGludCAgICAgICAgICAgb25pb25fYWxwaGE7CisKKyAgICBpbnQgICAgICAgICAgIHhfcG9zOworICAgIGludCAgICAgICAgICAgeV9wb3M7CisgICAgZG91YmxlICAgICAgICBzY2FsZTsKKworICAgIC8vIFpvb20tcmVsYXRlZCBwYXJhbWV0ZXJzCisgICAgZG91YmxlICAgICAgICB6b29tOworICAgIFNraW5SZWN0ICAgICAgc3Vid2luZG93OworICAgIFNraW5Qb3MgICAgICAgc3Vid2luZG93X29yaWdpbmFsOworICAgIFNraW5TaXplICAgICAgZnJhbWVidWZmZXI7CisgICAgU2tpblNpemUgICAgICBjb250YWluZXI7CisgICAgaW50ICAgICAgICAgICBzY3JvbGxfaDsgLy8gTmVlZGVkIGZvciBPU1gKK307CisKK3N0YXRpYyB2b2lkCithZGRfZmluZ2VyX2V2ZW50KFNraW5XaW5kb3cqIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgeCwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgeSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RhdGUpCit7CisgICAgd2luZG93LT53aW5fZnVuY3MtPm1vdXNlX2V2ZW50KHgsIHksIHN0YXRlKTsKK30KKworc3RhdGljIHZvaWQKK3NraW5fd2luZG93X2ZpbmRfZmluZ2VyKCBTa2luV2luZG93KiAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmdlclN0YXRlKiBmaW5nZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHkgKQoreworICAgIC8qIGZpbmQgdGhlIGRpc3BsYXkgdGhhdCBjb250YWlucyB0aGlzIG1vdmVtZW50ICovCisgICAgZmluZ2VyLT5kaXNwbGF5ID0gTlVMTDsKKyAgICBmaW5nZXItPmluc2lkZSAgPSAwOworCisgICAgaWYgKCF3aW5kb3ctPmVuYWJsZV90b3VjaCkKKyAgICAgICAgcmV0dXJuOworCisgICAgTEFZT1VUX0xPT1BfRElTUExBWVMoJndpbmRvdy0+bGF5b3V0LGRpc3ApCisgICAgICAgIGlmICggc2tpbl9yZWN0X2NvbnRhaW5zKCAmZGlzcC0+cmVjdCwgeCwgeSApICkgeworICAgICAgICAgICAgZmluZ2VyLT5pbnNpZGUgICA9IDE7CisgICAgICAgICAgICBmaW5nZXItPmRpc3BsYXkgID0gZGlzcDsKKyAgICAgICAgICAgIGZpbmdlci0+cG9zLnggICAgPSB4IC0gZGlzcC0+b3JpZ2luLng7CisgICAgICAgICAgICBmaW5nZXItPnBvcy55ICAgID0geSAtIGRpc3AtPm9yaWdpbi55OworCisgICAgICAgICAgICBza2luX3Bvc19yb3RhdGUoICZmaW5nZXItPnBvcywgJmZpbmdlci0+cG9zLCBkaXNwLT5yb3RhdGlvbiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBMQVlPVVRfTE9PUF9FTkRfRElTUExBWVMKK30KKworc3RhdGljIHZvaWQKK3NraW5fd2luZG93X21vdmVfbW91c2UoIFNraW5XaW5kb3cqICB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICBGaW5nZXJTdGF0ZSogZmluZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgeSApCit7CisgICAgQnV0dG9uU3RhdGUqICBidXR0b24gPSAmd2luZG93LT5idXR0b247CisKKyAgICBpZiAoZmluZ2VyLT50cmFja2luZyAmJiBmaW5nZXItPmRpc3BsYXkpIHsKKyAgICAgICAgQURpc3BsYXkqICBkaXNwICAgPSBmaW5nZXItPmRpc3BsYXk7CisgICAgICAgIGNoYXIgICAgICAgaW5zaWRlID0gMTsKKyAgICAgICAgaW50ICAgICAgICBkeCAgICAgPSB4IC0gZGlzcC0+cmVjdC5wb3MueDsKKyAgICAgICAgaW50ICAgICAgICBkeSAgICAgPSB5IC0gZGlzcC0+cmVjdC5wb3MueTsKKworICAgICAgICBpZiAoZHggPCAwKSB7CisgICAgICAgICAgICBkeCA9IDA7CisgICAgICAgICAgICBpbnNpZGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGR4ID49IGRpc3AtPnJlY3Quc2l6ZS53KSB7CisgICAgICAgICAgICBkeCA9IGRpc3AtPnJlY3Quc2l6ZS53IC0gMTsKKyAgICAgICAgICAgIGluc2lkZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR5IDwgMCkgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICAgICAgaW5zaWRlID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChkeSA+PSBkaXNwLT5yZWN0LnNpemUuaCkgeworICAgICAgICAgICAgZHkgPSBkaXNwLT5yZWN0LnNpemUuaC0xOworICAgICAgICAgICAgaW5zaWRlID0gMDsKKyAgICAgICAgfQorICAgICAgICBmaW5nZXItPmluc2lkZSA9IGluc2lkZTsKKyAgICAgICAgZmluZ2VyLT5wb3MueCAgPSBkeCArIChkaXNwLT5yZWN0LnBvcy54IC0gZGlzcC0+b3JpZ2luLngpOworICAgICAgICBmaW5nZXItPnBvcy55ICA9IGR5ICsgKGRpc3AtPnJlY3QucG9zLnkgLSBkaXNwLT5vcmlnaW4ueSk7CisKKyAgICAgICAgc2tpbl9wb3Nfcm90YXRlKCAmZmluZ2VyLT5wb3MsICZmaW5nZXItPnBvcywgZGlzcC0+cm90YXRpb24gKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEJ1dHRvbiogIGhvdmVyID0gYnV0dG9uLT5ob3ZlcjsKKworICAgICAgICBpZiAoaG92ZXIpIHsKKyAgICAgICAgICAgIGlmICggc2tpbl9yZWN0X2NvbnRhaW5zKCAmaG92ZXItPnJlY3QsIHgsIHkgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBob3Zlci0+ZG93biA9IDA7CisgICAgICAgICAgICBza2luX3dpbmRvd19yZWRyYXcoIHdpbmRvdywgJmhvdmVyLT5yZWN0ICk7CisgICAgICAgICAgICBidXR0b24tPmhvdmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGhvdmVyID0gTlVMTDsKKyAgICAgICAgTEFZT1VUX0xPT1BfQlVUVE9OUyggJndpbmRvdy0+bGF5b3V0LCBidXR0ICkKKyAgICAgICAgICAgIGlmICggc2tpbl9yZWN0X2NvbnRhaW5zKCAmYnV0dC0+cmVjdCwgeCwgeSApICkgeworICAgICAgICAgICAgICAgIGhvdmVyID0gYnV0dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgTEFZT1VUX0xPT1BfRU5EX0JVVFRPTlMKKworICAgICAgICAvKiBmaWx0ZXIgRFBBRCBhbmQgUVdFUlRZIGJ1dHRvbnMgcmlnaHQgaGVyZSAqLworICAgICAgICBpZiAoaG92ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc3dpdGNoIChob3Zlci0+a2V5Y29kZSkgeworICAgICAgICAgICAgICAgIC8qIHRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlIERQYWQgKi8KKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlRHBhZFVwOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVEcGFkRG93bjoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlRHBhZExlZnQ6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZURwYWRSaWdodDoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlRHBhZENlbnRlcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3ctPmVuYWJsZV9kcGFkKQorICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8qIHRoZXNlIGNvcnJlc3BvbmQgdG8gbm9uLXF3ZXJ0eSBidXR0b25zICovCisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVNvZnRMZWZ0OgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVTb2Z0UmlnaHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVZvbHVtZVVwOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVWb2x1bWVEb3duOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVQb3dlcjoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlSG9tZToKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlSG9tZVBhZ2U6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZUJhY2s6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZUNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZUVuZENhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVRWOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVFUEc6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZURWUjoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlUHJldmlvdXM6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZU5leHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVBsYXk6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVBsYXlwYXVzZToKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlUGF1c2U6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVN0b3A6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZVJld2luZDoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlRmFzdEZvcndhcmQ6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZUJvb2ttYXJrczoKKyAgICAgICAgICAgICAgICBjYXNlIGtLZXlDb2RlQ3ljbGVXaW5kb3dzOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVDaGFubmVsVXA6CisgICAgICAgICAgICAgICAgY2FzZSBrS2V5Q29kZUNoYW5uZWxEb3duOgorICAgICAgICAgICAgICAgIGNhc2Uga0tleUNvZGVBcHBTd2l0Y2g6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgLyogYWxsIHRoZSByZXN0IGlzIGFzc3VtZWQgdG8gYmUgcXdlcnR5ICovCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3ctPmVuYWJsZV9xd2VydHkpCisgICAgICAgICAgICAgICAgICAgICAgICBob3ZlciA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaG92ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgaG92ZXItPmRvd24gPSAxOworICAgICAgICAgICAgc2tpbl93aW5kb3dfcmVkcmF3KCB3aW5kb3csICZob3Zlci0+cmVjdCApOworICAgICAgICAgICAgYnV0dG9uLT5ob3ZlciA9IGhvdmVyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2tpbl93aW5kb3dfdHJhY2tiYWxsX3ByZXNzKCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgIGRvd24gKQoreworICAgIHdpbmRvdy0+d2luX2Z1bmNzLT5rZXlfZXZlbnQoQlROX01PVVNFLCBkb3duKTsKK30KKworc3RhdGljIHZvaWQKK3NraW5fd2luZG93X3RyYWNrYmFsbF9tb3ZlKCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgIHhyZWwsIGludCAgeXJlbCApCit7CisgICAgQmFsbFN0YXRlKiAgc3RhdGUgPSAmd2luZG93LT5iYWxsOworCisgICAgaWYgKCBza2luX3RyYWNrYmFsbF9tb3ZlKCBzdGF0ZS0+YmFsbCwgeHJlbCwgeXJlbCApICkgeworICAgICAgICBza2luX3RyYWNrYmFsbF9yZWZyZXNoKCBzdGF0ZS0+YmFsbCApOworICAgICAgICBza2luX3dpbmRvd19yZWRyYXcoIHdpbmRvdywgJnN0YXRlLT5yZWN0ICk7CisgICAgfQorfQorCit2b2lkCitza2luX3dpbmRvd19zZXRfdHJhY2tiYWxsKCBTa2luV2luZG93KiAgd2luZG93LCBTa2luVHJhY2tCYWxsKiAgYmFsbCApCit7CisgICAgQmFsbFN0YXRlKiAgc3RhdGUgPSAmd2luZG93LT5iYWxsOworCisgICAgYmFsbF9zdGF0ZV9zZXQoIHN0YXRlLCBiYWxsICk7Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X3Nob3dfdHJhY2tiYWxsKCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgIGVuYWJsZSApCit7CisgICAgQmFsbFN0YXRlKiAgc3RhdGUgPSAmd2luZG93LT5iYWxsOworCisgICAgaWYgKHN0YXRlLT5iYWxsICE9IE5VTEwgJiYgd2luZG93LT5lbmFibGVfdHJhY2tiYWxsKSB7CisgICAgICAgIGJhbGxfc3RhdGVfc2hvdyhzdGF0ZSwgZW5hYmxlKTsKKyAgICB9Cit9CisKKy8qIEhpZGUgdGhlIE9wZW5HTCBFUyBmcmFtZWJ1ZmZlciAqLworc3RhdGljIHZvaWQKK3NraW5fd2luZG93X2hpZGVfb3BlbmdsZXMoIFNraW5XaW5kb3cqIHdpbmRvdyApCit7CisgICAgd2luZG93LT53aW5fZnVuY3MtPm9wZW5nbGVzX2hpZGUoKTsKKyAgICAvL2FuZHJvaWRfaGlkZU9wZW5nbGVzV2luZG93KCk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTa2luV2luZG93KiB3aW5kb3c7CisgICAgdm9pZCogaGFuZGxlOworICAgIGludCB3eDsKKyAgICBpbnQgd3k7CisgICAgaW50IHd3OworICAgIGludCB3aDsKKyAgICBpbnQgZmJ3OworICAgIGludCBmYmg7CisgICAgZmxvYXQgZHByOworICAgIGZsb2F0IHJvdDsKK30gZ2xlc19zaG93X2RhdGE7CisKK3N0YXRpYyB2b2lkIHNraW5fd2luZG93X3J1bl9vcGVuZ2xlc19zaG93KHZvaWQqIHApIHsKKyAgICBjb25zdCBnbGVzX3Nob3dfZGF0YSogZGF0YSA9IChjb25zdCBnbGVzX3Nob3dfZGF0YSopcDsKKyAgICBkYXRhLT53aW5kb3ctPndpbl9mdW5jcy0+b3BlbmdsZXNfc2hvdyhkYXRhLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+d2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+ZmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmZiaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5kcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+cm90KTsKK30KKworc3RhdGljIHZvaWQKK3NraW5fd2luZG93X3NldHVwX29wZW5nbGVzX3N1YndpbmRvdyggU2tpbldpbmRvdyogd2luZG93LCBnbGVzX3Nob3dfZGF0YSogZGF0YSkKK3sKKyAgICBkYXRhLT53aW5kb3cgPSB3aW5kb3c7CisgICAgZGF0YS0+d3ggPSB3aW5kb3ctPnN1YndpbmRvdy5wb3MueDsKKyAgICBkYXRhLT53eSA9IHdpbmRvdy0+c3Vid2luZG93LnBvcy55OworICAgIGRhdGEtPnd3ID0gd2luZG93LT5zdWJ3aW5kb3cuc2l6ZS53OworICAgIGRhdGEtPndoID0gd2luZG93LT5zdWJ3aW5kb3cuc2l6ZS5oOworCisgICAgZGF0YS0+ZmJ3ID0gd2luZG93LT5mcmFtZWJ1ZmZlci53OworICAgIGRhdGEtPmZiaCA9IHdpbmRvdy0+ZnJhbWVidWZmZXIuaDsKKyAgICBkYXRhLT5kcHIgPSAxLjA7CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAvLyBJZiB0aGUgd2luZG93IGlzIG9uIGEgcmV0aW5hIG1vbml0b3IsIHRoZSBmcmFtZWJ1ZmZlciBzaXplIG5lZWRzIHRvIGJlCisgICAgLy8gYWRqdXN0ZWQgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgcGl4ZWxzLgorICAgIGRvdWJsZSBkcHI7CisgICAgaWYgKHNraW5fd2luc3lzX2dldF9kZXZpY2VfcGl4ZWxfcmF0aW8oJmRwcikgPT0gMCkgeworICAgICAgICBkYXRhLT5kcHIgPSBkcHI7CisgICAgfQorCisgICAgLy8gVGhlIG5hdGl2ZSBHTCBzdWJ3aW5kb3cgZm9yIE9TWCAodXNpbmcgQ29jb2EpIHVzZXMgY2FydGVzaWFuICh5LXVwKSBjb29yZGluYXRlcy4gV2UKKyAgICAvLyBoYXZlIGNvZGUgdG8gdHJhbnNmb3JtIHdpbmRvdyAoeS1kb3duKSBjb29yZGluYXRlcyBpbnRvIGNhcnRlc2lhbiBjb29yZGluYXRlcyBhdCB0aGF0CisgICAgLy8gbGV2ZWwsIGJ1dCBRdCBzZWVtcyB0byBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIG9uIGl0cyBvd24uIFRoaXMgbWVhbnMgdGhlIHRyYW5zZm9ybWF0aW9uCisgICAgLy8gaXMgZG9uZSAqdHdpY2UqIHdpdGggUXQgKyBPU1gsIHJlc3VsdGluZyBpbiB0aGUgaW5jb3JyZWN0IHkgdmFsdWUuIFRoZSBmb2xsb3dpbmcgInVuZG9lcyIKKyAgICAvLyB0aGUgdHJhbnNmb3JtYXRpb24gYnkgZG9pbmcgaXQgYSB0aGlyZCB0aW1lLiBBZGRpdGlvbmFsbHksIGJlY2F1c2UgdGhlIHNjcm9sbCBiYXIgbm93CisgICAgLy8gYWZmZWN0cyB0aGUgcmVsYXRpdmUgY29vcmRpbmF0ZSBzeXN0ZW0gaW5zaWRlIHRoZSB3aW5kb3csIGl0IG11c3QgYmUgdGFrZW4gaW50byBhY2NvdW50CisgICAgLy8gYXMgd2VsbC4gQXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLCBkYXRhLT53eSB3aWxsIGVxdWFsIHRoZSBib3R0b20gY29vcmRpbmF0ZSBvZiB0aGUKKyAgICAvLyBzdWJ3aW5kb3cgKGluIHVuaXRzIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgb3ZlcmFsbCB3aW5kb3cpIGlmIHRoaXMgaXMgdGhlIFF0IE9TWCBlbXVsYXRvci4KKyAgICBkYXRhLT53eSA9IHdpbmRvdy0+Y29udGFpbmVyLmggLSAoZGF0YS0+d3kgKyBkYXRhLT53aCk7CisgICAgZGF0YS0+d3kgKz0gd2luZG93LT5zY3JvbGxfaDsKKyNlbmRpZiAgLy8gX19BUFBMRV9fCit9CisKKy8qIFNob3cgdGhlIE9wZW5HTCBFUyBmcmFtZWJ1ZmZlciB3aW5kb3cgKi8KK3N0YXRpYyB2b2lkCitza2luX3dpbmRvd19zaG93X29wZW5nbGVzKCBTa2luV2luZG93KiB3aW5kb3cgKQoreworICAgIEFEaXNwbGF5KiBkaXNwID0gd2luZG93LT5sYXlvdXQuZGlzcGxheXM7CisgICAgdm9pZCogd2luaGFuZGxlID0gc2tpbl93aW5zeXNfZ2V0X3dpbmRvd19oYW5kbGUoKTsKKworICAgIGdsZXNfc2hvd19kYXRhIGRhdGE7CisgICAgc2tpbl93aW5kb3dfc2V0dXBfb3BlbmdsZXNfc3Vid2luZG93KHdpbmRvdywgJmRhdGEpOworCisgICAgZGF0YS5oYW5kbGUgPSB3aW5oYW5kbGU7CisgICAgZGF0YS5yb3QgPSBkaXNwLT5yb3RhdGlvbiAqIDkwLjsKKworICAgIHNraW5fd2luc3lzX3J1bl91aV91cGRhdGUoJnNraW5fd2luZG93X3J1bl9vcGVuZ2xlc19zaG93LCAmZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkCitza2luX3dpbmRvd19yZWRyYXdfb3BlbmdsZXMoIFNraW5XaW5kb3cqIHdpbmRvdyApCit7CisgICAgd2luZG93LT53aW5fZnVuY3MtPm9wZW5nbGVzX3JlZHJhdygpOworICAgIC8vYW5kcm9pZF9yZWRyYXdPcGVuZ2xlc1dpbmRvdygpOworfQorCitzdGF0aWMgaW50ICBza2luX3dpbmRvd19yZXNldF9pbnRlcm5hbCAoU2tpbldpbmRvdyosIFNraW5MYXlvdXQqKTsKKworU2tpbldpbmRvdyogc2tpbl93aW5kb3dfY3JlYXRlKFNraW5MYXlvdXQqIHNsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfZW11Z2xfc3Vid2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNraW5XaW5kb3dGdW5jcyogd2luX2Z1bmNzKSB7CisgICAgU2tpbldpbmRvdyogIHdpbmRvdzsKKworICAgIEFORVcwKHdpbmRvdyk7CisKKyAgICB3aW5kb3ctPndpbl9mdW5jcyAgICA9IHdpbl9mdW5jczsKKyAgICB3aW5kb3ctPnVzZV9lbXVnbF9zdWJ3aW5kb3cgPSB1c2VfZW11Z2xfc3Vid2luZG93OworICAgIHdpbmRvdy0+c3VyZmFjZSA9IE5VTEw7CisKKyAgICAvKiBlbmFibGUgZXZlcnl0aGluZyBieSBkZWZhdWx0ICovCisgICAgd2luZG93LT5lbmFibGVfdG91Y2ggICAgID0gMTsKKyAgICB3aW5kb3ctPmVuYWJsZV90cmFja2JhbGwgPSAxOworICAgIHdpbmRvdy0+ZW5hYmxlX2RwYWQgICAgICA9IDE7CisgICAgd2luZG93LT5lbmFibGVfcXdlcnR5ICAgID0gMTsKKworICAgIHdpbmRvdy0+eF9wb3MgPSB4OworICAgIHdpbmRvdy0+eV9wb3MgPSB5OworICAgIHdpbmRvdy0+c2Nyb2xsX2ggPSAwOworCisgICAgU2tpblJlY3QgIG1vbml0b3I7CisgICAgaW50ICAgICAgIHdpbl93ID0gc2xheW91dC0+c2l6ZS53OworICAgIGludCAgICAgICB3aW5faCA9IHNsYXlvdXQtPnNpemUuaDsKKyAgICBkb3VibGUgICAgc2NhbGVfdyA9IDEuMDsKKyAgICBkb3VibGUgICAgc2NhbGVfaCA9IDEuMDsKKworICAgIHNraW5fd2luc3lzX2dldF9tb25pdG9yX3JlY3QoJm1vbml0b3IpOworCisgICAgLy8gTWFrZSB0aGUgZGVmYXVsdCBzY2FsZSBhYm91dCA4MCUgb2YgdGhlIHNjcmVlbiBzaXplLgorICAgIGlmIChlbmFibGVfc2NhbGUgJiYgbW9uaXRvci5zaXplLncgPCB3aW5fdyAmJiB3aW5fdyA+IDEuKQorICAgICAgICBzY2FsZV93ID0gMC44MCAqIG1vbml0b3Iuc2l6ZS53IC8gd2luX3c7CisgICAgaWYgKGVuYWJsZV9zY2FsZSAmJiBtb25pdG9yLnNpemUuaCA8IHdpbl9oICYmIHdpbl9oID4gMS4pCisgICAgICAgIHNjYWxlX2ggPSAwLjgwICogbW9uaXRvci5zaXplLmggLyB3aW5faDsKKworICAgIHdpbmRvdy0+c2NhbGUgPSAoc2NhbGVfdyA8PSBzY2FsZV9oKSA/IHNjYWxlX3cgOiBzY2FsZV9oOworCisgICAgaWYgKHNraW5fd2luZG93X3Jlc2V0X2ludGVybmFsKHdpbmRvdywgc2xheW91dCkgPCAwKSB7CisgICAgICAgIHNraW5fd2luZG93X2ZyZWUod2luZG93KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNraW5fd2luc3lzX3NldF93aW5kb3dfcG9zKHgsIHkpOworCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgd2luZG93IGlzIGZ1bGx5IHZpc2libGUgKi8KKyAgICBpZiAoZW5hYmxlX3NjYWxlICYmICFza2luX3dpbnN5c19pc193aW5kb3dfZnVsbHlfdmlzaWJsZSgpKSB7CisgICAgICAgIGludCB3aW5feCwgd2luX3ksIHdpbl93LCB3aW5faDsKKyAgICAgICAgaW50IG5ld194LCBuZXdfeTsKKworICAgICAgICBza2luX3dpbnN5c19nZXRfd2luZG93X3Bvcygmd2luX3gsICZ3aW5feSk7CisgICAgICAgIHdpbl93ID0gc2tpbl9zdXJmYWNlX3dpZHRoKHdpbmRvdy0+c3VyZmFjZSk7CisgICAgICAgIHdpbl9oID0gc2tpbl9zdXJmYWNlX2hlaWdodCh3aW5kb3ctPnN1cmZhY2UpOworCisgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIldpbmRvdyB3YXMgbm90IGZ1bGx5IHZpc2libGU6ICIKKyAgICAgICAgICAgICAgICAibW9uaXRvcj1bJWQsJWQsJWQsJWRdIHdpbmRvdz1bJWQsJWQsJWQsJWRdIiwKKyAgICAgICAgICAgICAgICBtb25pdG9yLnBvcy54LAorICAgICAgICAgICAgICAgIG1vbml0b3IucG9zLnksCisgICAgICAgICAgICAgICAgbW9uaXRvci5zaXplLncsCisgICAgICAgICAgICAgICAgbW9uaXRvci5zaXplLmgsCisgICAgICAgICAgICAgICAgd2luX3gsCisgICAgICAgICAgICAgICAgd2luX3ksCisgICAgICAgICAgICAgICAgd2luX3csCisgICAgICAgICAgICAgICAgd2luX2gpOworCisgICAgICAgIC8qIEZpcnN0LCB3ZSByZWNlbnRlciB0aGUgd2luZG93ICovCisgICAgICAgIG5ld194ID0gKG1vbml0b3Iuc2l6ZS53IC0gd2luX3cpLzI7CisgICAgICAgIG5ld195ID0gKG1vbml0b3Iuc2l6ZS5oIC0gd2luX2gpLzI7CisKKyAgICAgICAgLyogSWYgaXQgaXMgc3RpbGwgdG9vIGxhcmdlLCB3ZSBlbnN1cmUgdGhlIHRvcC1ib3JkZXIgaXMgdmlzaWJsZSAqLworICAgICAgICBpZiAobmV3X3kgPCAwKQorICAgICAgICAgICAgbmV3X3kgPSAwOworCisgICAgICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIldpbmRvdyByZXBvc2l0aW9uZWQgdG8gWyVkLCVkXSIsIG5ld194LCBuZXdfeSk7CisKKyAgICAgICAgLyogRG9uZSAqLworICAgICAgICBza2luX3dpbnN5c19zZXRfd2luZG93X3BvcyhuZXdfeCwgbmV3X3kpOworICAgICAgICBkcHJpbnQoICJlbXVsYXRvciB3aW5kb3cgd2FzIG91dCBvZiB2aWV3IGFuZCB3YXMgcmVjZW50ZXJlZFxuIiApOworICAgIH0KKworICAgIHNraW5fd2luZG93X3Nob3dfb3BlbmdsZXMod2luZG93KTsKKworICAgIHJldHVybiB3aW5kb3c7Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X2VuYWJsZV90b3VjaCggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICBlbmFibGVkICkKK3sKKyAgICB3aW5kb3ctPmVuYWJsZV90b3VjaCA9ICEhZW5hYmxlZDsKK30KKwordm9pZAorc2tpbl93aW5kb3dfZW5hYmxlX3RyYWNrYmFsbCggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICBlbmFibGVkICkKK3sKKyAgICB3aW5kb3ctPmVuYWJsZV90cmFja2JhbGwgPSAhIWVuYWJsZWQ7Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X2VuYWJsZV9kcGFkKCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgIGVuYWJsZWQgKQoreworICAgIHdpbmRvdy0+ZW5hYmxlX2RwYWQgPSAhIWVuYWJsZWQ7Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X2VuYWJsZV9xd2VydHkoIFNraW5XaW5kb3cqICB3aW5kb3csIGludCAgZW5hYmxlZCApCit7CisgICAgd2luZG93LT5lbmFibGVfcXdlcnR5ID0gISFlbmFibGVkOworfQorCit2b2lkCitza2luX3dpbmRvd19zZXRfdGl0bGUoIFNraW5XaW5kb3cqICB3aW5kb3csIGNvbnN0IGNoYXIqICB0aXRsZSApCit7CisgICAgaWYgKHdpbmRvdyAmJiB0aXRsZSkgeworICAgICAgICBza2luX3dpbnN5c19zZXRfd2luZG93X3RpdGxlKHRpdGxlKTsKKyAgICB9Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X3Bvc2l0aW9uX2NoYW5nZWQoIFNraW5XaW5kb3cqIHdpbmRvdywgaW50IHgsIGludCB5ICkKK3sKKyAgICB3aW5kb3ctPnhfcG9zID0geDsKKyAgICB3aW5kb3ctPnlfcG9zID0geTsKK30KKworaW50Citza2luX3dpbmRvd19yZWNvbXB1dGVfc3Vid2luZG93X3JlY3QoIFNraW5XaW5kb3cqIHdpbmRvdywgU2tpblJlY3QqIHN1YndpbmRvdyApCit7CisgICAgLy8gVGhlIGZ1bGwgc3Vid2luZG93IG11c3QgYmUgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgY29udGFpbmVyIHRvIGNvbXB1dGUgdGhlIGFjdHVhbCBzdWJ3aW5kb3cKKyAgICBTa2luUmVjdCByZXN1bHQ7CisKKyAgICBTa2luUmVjdCBjb250YWluZXI7CisgICAgY29udGFpbmVyLnBvcy54ID0gMDsKKyAgICBjb250YWluZXIucG9zLnkgPSAwOworICAgIGNvbnRhaW5lci5zaXplLncgPSB3aW5kb3ctPmNvbnRhaW5lci53OworICAgIGNvbnRhaW5lci5zaXplLmggPSB3aW5kb3ctPmNvbnRhaW5lci5oOworCisgICAgLy8gSWYgdGhlIGVtdWxhdG9yIHdpbmRvdyBpcyBzbyBzbWFsbCB0aGF0IHRoZSBuYXRpdmUgc3Vid2luZG93IHdvdWxkbid0IGV2ZW4gYXBwZWFyLAorICAgIC8vIGZvcmNlIHRoZSBzdWJ3aW5kb3cgdG8gYXQgbGVhc3QgaGF2ZSBwb3NpdGl2ZSBzaXplLCBlbHNlIHRoZSBuYXRpdmUgd2luZG93IG1hbmFnZXJzCisgICAgLy8gbWF5IGNyYXNoLiBGb3IgZXhhbXBsZSwgb24gTGludXgsIFgxMSBjcmFzaGVzIHdoZW4gdG9sZCB0byBjcmVhdGUgYSB3aW5kb3cgd2l0aCAwIHNpemUuCisgICAgaWYgKCFza2luX3JlY3RfaW50ZXJzZWN0KCZyZXN1bHQsIHN1YndpbmRvdywgJmNvbnRhaW5lcikpIHsKKyAgICAgICAgcmVzdWx0LnNpemUudyA9IDE7CisgICAgICAgIHJlc3VsdC5zaXplLmggPSAxOworICAgIH0KKworICAgIGlmIChza2luX3JlY3RfZXF1YWxzKCZ3aW5kb3ctPnN1YndpbmRvdywgJnJlc3VsdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2luZG93LT5zdWJ3aW5kb3cucG9zLnggPSByZXN1bHQucG9zLng7CisgICAgd2luZG93LT5zdWJ3aW5kb3cucG9zLnkgPSByZXN1bHQucG9zLnk7CisgICAgd2luZG93LT5zdWJ3aW5kb3cuc2l6ZS53ID0gcmVzdWx0LnNpemUudzsKKyAgICB3aW5kb3ctPnN1YndpbmRvdy5zaXplLmggPSByZXN1bHQuc2l6ZS5oOworCisgICAgc2tpbl93aW5zeXNfc2V0X2RldmljZV9nZW9tZXRyeSgmd2luZG93LT5zdWJ3aW5kb3cpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3NraW5fd2luZG93X3Njcm9sbF91cGRhdGVkKCBTa2luV2luZG93KiB3aW5kb3csIGludCBkeCwgaW50IHhtYXgsIGludCBkeSwgaW50IHltYXggKQoreworICAgIC8vIFByZXRlbmQgdGhlIHN1YndpbmRvdyBoYXMgbW92ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGFtb3VudAorICAgIFNraW5SZWN0IHN1YndpbmRvdzsKKyAgICBzdWJ3aW5kb3cucG9zLnggPSB3aW5kb3ctPnN1YndpbmRvd19vcmlnaW5hbC54IC0gZHg7CisgICAgc3Vid2luZG93LnBvcy55ID0gd2luZG93LT5zdWJ3aW5kb3dfb3JpZ2luYWwueSAtIGR5OworICAgIHN1YndpbmRvdy5zaXplLncgPSB3aW5kb3ctPmZyYW1lYnVmZmVyLnc7CisgICAgc3Vid2luZG93LnNpemUuaCA9IHdpbmRvdy0+ZnJhbWVidWZmZXIuaDsKKworICAgIHNraW5fd2luZG93X3JlY29tcHV0ZV9zdWJ3aW5kb3dfcmVjdCh3aW5kb3csICZzdWJ3aW5kb3cpOworICAgIHNraW5fd2luZG93X3Nob3dfb3BlbmdsZXMod2luZG93KTsKKworICAgIC8vIENvbXB1dGUgdGhlIG1hcmdpbnMgYXJvdW5kIHRoZSBzdWItd2luZG93LCB0aGVuIHRyYW5zZm9ybSB0aGUgY3VycmVudCBzY3JvbGwgdmFsdWVzCisgICAgLy8gdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlc2UgbWFyZ2lucy4KKyAgICBpbnQgbGVmdF9idWYgPSB3aW5kb3ctPnN1YndpbmRvd19vcmlnaW5hbC54OworICAgIGludCByaWdodF9idWYgPSBza2luX3N1cmZhY2Vfd2lkdGgod2luZG93LT5zdXJmYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLSAod2luZG93LT5mcmFtZWJ1ZmZlci53ICsgbGVmdF9idWYpOworICAgIGZsb2F0IHB4OworICAgIGlmIChsZWZ0X2J1ZiArIHJpZ2h0X2J1ZiA+PSB4bWF4KSB7CisgICAgICAgIC8vIFRoZSBzdWJ3aW5kb3cgZml0cyBlbnRpcmVseSBpbiB0aGUgY29udGFpbmVyLCBzbyB0aGVyZSBhcmUgbm8gaW50ZXJtZWRpYXRlIHRyYW5zbGF0aW9ucworICAgICAgICBweCA9IGR4IDwgbGVmdF9idWYgPyAwIDogMTsKKyAgICB9IGVsc2UgeworICAgICAgICBweCA9IChmbG9hdCkgKGR4IC0gbGVmdF9idWYpIC8gKGZsb2F0KSAoeG1heCAtIChsZWZ0X2J1ZiArIHJpZ2h0X2J1ZikpOworICAgIH0KKworICAgIGludCB0b3BfYnVmID0gd2luZG93LT5zdWJ3aW5kb3dfb3JpZ2luYWwueTsKKyAgICBpbnQgYm90dG9tX2J1ZiA9IHNraW5fc3VyZmFjZV9oZWlnaHQod2luZG93LT5zdXJmYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHdpbmRvdy0+ZnJhbWVidWZmZXIuaCArIHRvcF9idWYpOworICAgIGZsb2F0IHB5OworICAgIGlmICh0b3BfYnVmICsgYm90dG9tX2J1ZiA+PSB5bWF4KSB7CisgICAgICAgIC8vIFRoZSBzdWJ3aW5kb3cgZml0cyBlbnRpcmVseSBpbiB0aGUgY29udGFpbmVyLCBzbyB0aGVyZSBhcmUgbm8gaW50ZXJtZWRpYXRlIHRyYW5zbGF0aW9ucworICAgICAgICBweSA9IGR5IDwgdG9wX2J1ZiA/IDEgOiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSAoeW1heCAtIGR5KSBpbnN0ZWFkIG9mIChkeSkgc2luY2UgT0dMIGNvb3JkaW5hdGVzIGFyZSBZLXVwCisgICAgICAgIHB5ID0gKGZsb2F0KSAoKHltYXggLSBkeSkgLSBib3R0b21fYnVmKSAvIChmbG9hdCkgKHltYXggLSAoYm90dG9tX2J1ZiArIHRvcF9idWYpKTsKKyAgICB9CisKKyAgICAvLyBDbGFtcCB0aGUgdmFsdWVzIHRvIFswLDFdLiAoZHgsZHkpID0gKDAsMCkgaW5kaWNhdGVzIHRvIGFsaWduIHRoZSBib3R0b20gbGVmdCBjb3JuZXIgb2YgdGhlCisgICAgLy8gZnJhbWVidWZmZXIgd2l0aCB0aGUgYm90dG9tIGxlZnQgY29ybmVyIG9mIHRoZSBzdWJ3aW5kb3cuICgxLDEpIGluZGljYXRlcyB0byBhbGlnbiB0aGUKKyAgICAvLyB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBmcmFtZWJ1ZmZlciB3aXRoIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBzdWJ3aW5kb3cuIEFsbAorICAgIC8vIGludGVybWVkaWF0ZSB2YWx1ZXMgYXJlIGFuIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGVzZSB0d28gc3RhdGVzLgorICAgIHB4ID0gcHggPiAxID8gMSA6IChweCA8IDAgPyAwIDogcHgpOworICAgIHB5ID0gcHkgPiAxID8gMSA6IChweSA8IDAgPyAwIDogcHkpOworCisgICAgd2luZG93LT53aW5fZnVuY3MtPm9wZW5nbGVzX3NldFRyYW5zbGF0aW9uKHB4LCBweSk7Cit9CisKK3N0YXRpYyB2b2lkCitza2luX3dpbmRvd19yZXNpemUoIFNraW5XaW5kb3cqICB3aW5kb3csIGludCByZXNpemVfY29udGFpbmVyICkKK3sKKyAgICBpbnQgICAgICAgICAgIGxheW91dF93ID0gd2luZG93LT5sYXlvdXQucmVjdC5zaXplLnc7CisgICAgaW50ICAgICAgICAgICBsYXlvdXRfaCA9IHdpbmRvdy0+bGF5b3V0LnJlY3Quc2l6ZS5oOworICAgIGludCAgICAgICAgICAgd2luZG93X3cgPSBsYXlvdXRfdzsKKyAgICBpbnQgICAgICAgICAgIHdpbmRvd19oID0gbGF5b3V0X2g7CisgICAgaW50ICAgICAgICAgICB3aW5kb3dfeCA9IHdpbmRvdy0+eF9wb3M7CisgICAgaW50ICAgICAgICAgICB3aW5kb3dfeSA9IHdpbmRvdy0+eV9wb3M7CisgICAgZG91YmxlICAgICAgICBzY2FsZSA9IHdpbmRvdy0+c2NhbGU7CisKKyAgICAvLyBQcmUtcmVjb3JkIHRoZSBjb250YWluZXIgZGltZW5zaW9ucworICAgIGlmIChyZXNpemVfY29udGFpbmVyKSB7CisgICAgICAgIHdpbmRvdy0+Y29udGFpbmVyLncgPSAoaW50KSBjZWlsKGxheW91dF93ICogc2NhbGUpOworICAgICAgICB3aW5kb3ctPmNvbnRhaW5lci5oID0gKGludCkgY2VpbChsYXlvdXRfaCAqIHNjYWxlKTsKKyAgICB9CisKKyAgICBpZiAod2luZG93LT56b29tICE9IDEuMCkgeworICAgICAgICBzY2FsZSAqPSB3aW5kb3ctPnpvb207CisgICAgfQorCisgICAgaWYgKHNjYWxlICE9IDEuMCkgeworICAgICAgICB3aW5kb3dfdyA9IChpbnQpIGNlaWwobGF5b3V0X3cgKiBzY2FsZSk7CisgICAgICAgIHdpbmRvd19oID0gKGludCkgY2VpbChsYXlvdXRfaCAqIHNjYWxlKTsKKyAgICB9CisKKyAgICAvLyBBdHRlbXB0IHRvIHJlc2l6ZSB0aGUgd2luZG93IHN1cmZhY2UuIElmIGl0IGRvZXNuJ3QgZXhpc3QsIGEgbmV3IG9uZSB3aWxsIGJlCisgICAgLy8gYWxsb2NhdGVkLiBJZiBpdCBkb2VzIGV4aXN0LCBidXQgaXQncyBvcmlnaW5hbCBkaW1lbnNpb25zIGRvIG5vdCBtYXRjaCB0aGUgbmV3CisgICAgLy8gb25lcywgaXQgd2lsbCBiZSBkZS1hbGxvY2F0ZWQgYW5kIGEgbmV3IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICAgIHdpbmRvdy0+c3VyZmFjZSA9IHNraW5fc3VyZmFjZV9yZXNpemUod2luZG93LT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3csIHdpbmRvd19oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3csIGxheW91dF9oKTsKKworICAgIC8vIEZvcmNlIHJlZHJhdyB0aGUgYmFja2dyb3VuZCBhbmQgc2tpbiB0byBhdm9pZCBkcmF3aW5nIGVtcHR5IGZyYW1lcy4gVGhpcyByZWR1Y2VzIGZsaWNrZXIKKyAgICAvLyBvbiByZXNpemUgYW5kIHJvdGF0ZS4KKyAgICBMYXlvdXQqIGxheW91dCA9ICZ3aW5kb3ctPmxheW91dDsKKyAgICBza2luX3N1cmZhY2VfZmlsbCh3aW5kb3ctPnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgJmxheW91dC0+cmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQtPmNvbG9yKTsKKworICAgIEJhY2tncm91bmQqICBiYWNrID0gbGF5b3V0LT5iYWNrZ3JvdW5kczsKKyAgICBCYWNrZ3JvdW5kKiAgZW5kICA9IGJhY2sgKyBsYXlvdXQtPm51bV9iYWNrZ3JvdW5kczsKKyAgICBmb3IgKCA7IGJhY2sgPCBlbmQ7IGJhY2srKyApCisgICAgICAgIGJhY2tncm91bmRfcmVkcmF3KCBiYWNrLCAmbGF5b3V0LT5yZWN0LCB3aW5kb3ctPnN1cmZhY2UgKTsKKworICAgIHNraW5fc3VyZmFjZV9jcmVhdGVfd2luZG93KHdpbmRvdy0+c3VyZmFjZSwgd2luZG93X3gsIHdpbmRvd195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd193LCB3aW5kb3dfaCk7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGZyYW1lYnVmZmVyIGFuZCB3aW5kb3cgc2l6ZXMgYW5kIGxvY2F0aW9ucworICAgIEFEaXNwbGF5KiBkaXNwID0gd2luZG93LT5sYXlvdXQuZGlzcGxheXM7CisgICAgU2tpblJlY3QgZHJlY3QgPSBkaXNwLT5yZWN0OworICAgIHNraW5fc3VyZmFjZV9nZXRfc2NhbGVkX3JlY3Qod2luZG93LT5zdXJmYWNlLCAmZHJlY3QsICZkcmVjdCk7CisKKyAgICAvLyBTdG9yZSBvcmlnaW5hbCB2YWx1ZXMgdG8gdXNlIGZvciBzY3JvbGxpbmcgbGF0ZXIKKyAgICB3aW5kb3ctPnN1YndpbmRvd19vcmlnaW5hbC54ID0gZHJlY3QucG9zLng7CisgICAgd2luZG93LT5zdWJ3aW5kb3dfb3JpZ2luYWwueSA9IGRyZWN0LnBvcy55OworCisgICAgd2luZG93LT5mcmFtZWJ1ZmZlci53ID0gZHJlY3Quc2l6ZS53OworICAgIHdpbmRvdy0+ZnJhbWVidWZmZXIuaCA9IGRyZWN0LnNpemUuaDsKKworICAgIGlmIChza2luX3dpbmRvd19yZWNvbXB1dGVfc3Vid2luZG93X3JlY3Qod2luZG93LCAmZHJlY3QpICYmIHJlc2l6ZV9jb250YWluZXIpIHsKKyAgICAgICAgc2tpbl93aW5kb3dfc2hvd19vcGVuZ2xlcyh3aW5kb3cpOworICAgIH0KK30KKworc3RhdGljIGludAorc2tpbl93aW5kb3dfcmVzZXRfaW50ZXJuYWwgKCBTa2luV2luZG93KiAgd2luZG93LCBTa2luTGF5b3V0KiAgc2xheW91dCApCit7CisgICAgTGF5b3V0ICAgICAgICAgbGF5b3V0OworICAgIEFEaXNwbGF5KiAgICAgIGRpc3A7CisKKyAgICBpZiAoIGxheW91dF9pbml0KCAmbGF5b3V0LCBzbGF5b3V0ICkgPCAwICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbGF5b3V0X2RvbmUoICZ3aW5kb3ctPmxheW91dCApOworICAgIHdpbmRvdy0+bGF5b3V0ID0gbGF5b3V0OworCisgICAgLy8gUmVzZXQgdmlld3BvcnQgcGFyYW1ldGVycworICAgIHdpbmRvdy0+em9vbSA9IDEuMDsKKyAgICB3aW5kb3ctPnNjcm9sbF9oID0gMDsKKyAgICB3aW5kb3ctPmZyYW1lYnVmZmVyLncgPSAwOworICAgIHdpbmRvdy0+ZnJhbWVidWZmZXIuaCA9IDA7CisKKyAgICAvLyBSZXNldHRpbmcgdGhlIHN1YndpbmRvdyBwYXJhbWV0ZXJzIGVuc3VyZXMgdGhhdCBhIHByb3BlciByZXNpemluZyBvZgorICAgIC8vIHRoZSBuYXRpdmUgc3Vid2luZG93IGFjdHVhbGx5IG9jY3Vycy4gV2l0aG91dCB0aGlzLCBpdCBpcyBwb3NzaWJsZSBmb3IKKyAgICAvLyBhIHJvdGF0aW9uIHRvIG5vdCByZWFjaCB0aGUgc3Vid2luZG93IChmb3IgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgYQorICAgIC8vIHNxdWFyZSB3YXRjaCBza2luLCB3aGljaCBtaWdodCBoYXZlIHR3byBsYXlvdXRzIHdpdGggKmV4YWN0bHkqIHRoZSBzYW1lCisgICAgLy8gc3Vid2luZG93KS4KKyAgICB3aW5kb3ctPnN1YndpbmRvdy5wb3MueCA9IC0xOworICAgIHdpbmRvdy0+c3Vid2luZG93LnBvcy55ID0gLTE7CisgICAgd2luZG93LT5zdWJ3aW5kb3cuc2l6ZS53ID0gMDsKKyAgICB3aW5kb3ctPnN1YndpbmRvdy5zaXplLmggPSAwOworCisgICAgZGlzcCA9IHdpbmRvdy0+bGF5b3V0LmRpc3BsYXlzOworICAgIGlmIChkaXNwICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNsYXlvdXQtPm9uaW9uX2ltYWdlKSB7CisgICAgICAgICAgICAvLyBPbmlvbiB3YXMgc3BlY2lmaWVkIGluIGxheW91dCBmaWxlLgorICAgICAgICAgICAgYWRpc3BsYXlfc2V0X29uaW9uKGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xheW91dC0+b25pb25faW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xheW91dC0+b25pb25fcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xheW91dC0+b25pb25fYWxwaGEgKTsKKyAgICAgICAgfSBlbHNlIGlmICh3aW5kb3ctPm9uaW9uKSB7CisgICAgICAgICAgICAvLyBPbmlvbiB3YXMgc3BlY2lmaWVkIHZpYSBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICBhZGlzcGxheV9zZXRfb25pb24oZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPm9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+b25pb25fcm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LT5vbmlvbl9hbHBoYSApOworICAgICAgICB9CisgICAgfQorCisgICAgc2tpbl93aW5kb3dfcmVzaXplKHdpbmRvdywgMSk7CisKKyAgICBmaW5nZXJfc3RhdGVfcmVzZXQoICZ3aW5kb3ctPmZpbmdlciApOworICAgIGZpbmdlcl9zdGF0ZV9yZXNldCggJndpbmRvdy0+c2Vjb25kYXJ5X2ZpbmdlciApOworICAgIGJ1dHRvbl9zdGF0ZV9yZXNldCggJndpbmRvdy0+YnV0dG9uICk7CisgICAgYmFsbF9zdGF0ZV9yZXNldCggJndpbmRvdy0+YmFsbCwgd2luZG93ICk7CisKKyAgICBza2luX3dpbmRvd19yZWRyYXcoIHdpbmRvdywgTlVMTCApOworCisgICAgaWYgKCBsYXlvdXQuZGlzcGxheXMgKSB7CisgICAgICAgIC8vIFRPRE8oZ3JpZ29yeWopOiBkZWJ1ZyBvdXRwdXQgZm9yIGludmVzdGlnYXRpbmcgdGhlIHJvdGF0aW9uIGJ1Zy4KKyAgICAgICAgaWYgKFZFUkJPU0VfQ0hFQ0socm90YXRpb24pKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNldHRpbmcgZGV2aWNlIG9yaWVudGF0aW9uICVkXG4iLCBsYXlvdXQuZGlzcGxheXMtPnJvdGF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICB3aW5kb3ctPndpbl9mdW5jcy0+c2V0X2RldmljZV9vcmllbnRhdGlvbihsYXlvdXQuZGlzcGxheXMtPnJvdGF0aW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50Citza2luX3dpbmRvd19yZXNldCAoIFNraW5XaW5kb3cqICB3aW5kb3csIFNraW5MYXlvdXQqICBzbGF5b3V0ICkKK3sKKyAgICBza2luX3dpbnN5c19nZXRfd2luZG93X3Bvcygmd2luZG93LT54X3BvcywgJndpbmRvdy0+eV9wb3MpOworICAgIGlmIChza2luX3dpbmRvd19yZXNldF9pbnRlcm5hbCggd2luZG93LCBzbGF5b3V0ICkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZAorc2tpbl93aW5kb3dfem9vbWVkX3dpbmRvd19yZXNpemVkKCBTa2luV2luZG93KiB3aW5kb3csIGludCBkeCwgaW50IGR5LCBpbnQgdywgaW50IGgsIGludCBzY3JvbGxfaCApCit7CisgICAgLy8gUHJldGVuZCB0aGUgc3Vid2luZG93IGhhcyBtb3ZlZCBieSB0aGUgYXBwcm9wcmlhdGUgYW1vdW50CisgICAgU2tpblJlY3Qgc3Vid2luZG93OworICAgIHN1YndpbmRvdy5wb3MueCA9IHdpbmRvdy0+c3Vid2luZG93X29yaWdpbmFsLnggLSBkeDsKKyAgICBzdWJ3aW5kb3cucG9zLnkgPSB3aW5kb3ctPnN1YndpbmRvd19vcmlnaW5hbC55IC0gZHk7CisgICAgc3Vid2luZG93LnNpemUudyA9IHdpbmRvdy0+ZnJhbWVidWZmZXIudzsKKyAgICBzdWJ3aW5kb3cuc2l6ZS5oID0gd2luZG93LT5mcmFtZWJ1ZmZlci5oOworCisgICAgd2luZG93LT5jb250YWluZXIudyA9IHc7CisgICAgd2luZG93LT5jb250YWluZXIuaCA9IGg7CisgICAgd2luZG93LT5zY3JvbGxfaCA9IHNjcm9sbF9oOworCisgICAgaWYgKHNraW5fd2luZG93X3JlY29tcHV0ZV9zdWJ3aW5kb3dfcmVjdCh3aW5kb3csICZzdWJ3aW5kb3cpKSB7CisgICAgICAgIHNraW5fd2luZG93X3Nob3dfb3BlbmdsZXMod2luZG93KTsKKyAgICAgICAgc2tpbl93aW5kb3dfcmVkcmF3X29wZW5nbGVzKHdpbmRvdyk7CisgICAgfQorfQorCit2b2lkCitza2luX3dpbmRvd19zZXRfbGNkX2JyaWdodG5lc3MoIFNraW5XaW5kb3cqICB3aW5kb3csIGludCAgYnJpZ2h0bmVzcyApCit7CisgICAgQURpc3BsYXkqICBkaXNwID0gd2luZG93LT5sYXlvdXQuZGlzcGxheXM7CisKKyAgICBpZiAoZGlzcCAhPSBOVUxMKSB7CisgICAgICAgIGRpc3AtPmJyaWdodG5lc3MgPSBicmlnaHRuZXNzOworICAgICAgICBza2luX3dpbmRvd19yZWRyYXcoIHdpbmRvdywgTlVMTCApOworICAgIH0KK30KKwordm9pZAorc2tpbl93aW5kb3dfZnJlZSggU2tpbldpbmRvdyogIHdpbmRvdyApCit7CisgICAgaWYgKHdpbmRvdykgeworICAgICAgICBza2luX3N1cmZhY2VfdW5yZWZwKCZ3aW5kb3ctPnN1cmZhY2UpOworCisgICAgICAgIGlmICh3aW5kb3ctPm9uaW9uKSB7CisgICAgICAgICAgICBza2luX2ltYWdlX3VucmVmKCZ3aW5kb3ctPm9uaW9uKTsKKyAgICAgICAgICAgIHdpbmRvdy0+b25pb25fcm90YXRpb24gPSBTS0lOX1JPVEFUSU9OXzA7CisgICAgICAgIH0KKyAgICAgICAgbGF5b3V0X2RvbmUoICZ3aW5kb3ctPmxheW91dCApOworICAgICAgICBBRlJFRSh3aW5kb3cpOworICAgIH0KK30KKwordm9pZAorc2tpbl93aW5kb3dfc2V0X29uaW9uKCBTa2luV2luZG93KiAgIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgU2tpbkltYWdlKiAgICBvbmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgU2tpblJvdGF0aW9uICBvbmlvbl9yb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBvbmlvbl9hbHBoYSApCit7CisgICAgQURpc3BsYXkqICBkaXNwOworICAgIFNraW5JbWFnZSogIG9sZCA9IHdpbmRvdy0+b25pb247CisKKyAgICB3aW5kb3ctPm9uaW9uICAgICAgICAgID0gc2tpbl9pbWFnZV9yZWYob25pb24pOworICAgIHdpbmRvdy0+b25pb25fcm90YXRpb24gPSBvbmlvbl9yb3RhdGlvbjsKKyAgICB3aW5kb3ctPm9uaW9uX2FscGhhICAgID0gb25pb25fYWxwaGE7CisKKyAgICBza2luX2ltYWdlX3VucmVmKCAmb2xkICk7CisKKyAgICBkaXNwID0gd2luZG93LT5sYXlvdXQuZGlzcGxheXM7CisKKyAgICBpZiAoZGlzcCAhPSBOVUxMKQorICAgICAgICBhZGlzcGxheV9zZXRfb25pb24oZGlzcCwgd2luZG93LT5vbmlvbiwgb25pb25fcm90YXRpb24sIG9uaW9uX2FscGhhKTsKK30KKwordm9pZAorc2tpbl93aW5kb3dfc2V0X3NjYWxlKFNraW5XaW5kb3cqIHdpbmRvdywgZG91YmxlIHNjYWxlKQoreworICAgIHdpbmRvdy0+c2NhbGUgPSBzY2FsZTsKKworICAgIC8vIFRoZSBzY3JvbGwgYmFycyAqd2lsbCogYmUgZ29uZSBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgc28gbWFrZSBzdXJlCisgICAgLy8gdGhleSBhcmUgbm90IHRha2VuIGludG8gYWNjb3VudCB3aGVuIHJlc2l6aW5nIHRoZSB3aW5kb3cuCisgICAgd2luZG93LT5zY3JvbGxfaCA9IDA7CisgICAgd2luZG93LT56b29tID0gMS4wOyAgICAgIC8vIFNjYWxpbmcgdGhlIHdpbmRvdyBzaG91bGQgcmVzZXQgYWxsICJ2aWV3cG9ydCIgcGFyYW1ldGVycworCisgICAgc2tpbl93aW5kb3dfcmVzaXplKCB3aW5kb3csIDEgKTsKKyAgICBza2luX3dpbmRvd19yZWRyYXcoIHdpbmRvdywgTlVMTCApOworfQorCit2b2lkCitza2luX3dpbmRvd19zZXRfem9vbShTa2luV2luZG93KiB3aW5kb3csIGRvdWJsZSB6b29tLCBpbnQgZHcsIGludCBkaCwgaW50IHNjcm9sbF9oKQoreworICAgIC8vIFByZS1yZWNvcmQgdGhlIGNvbnRhaW5lciBkaW1lbnNpb25zCisgICAgd2luZG93LT5jb250YWluZXIudyA9IGR3OworICAgIHdpbmRvdy0+Y29udGFpbmVyLmggPSBkaDsKKyAgICB3aW5kb3ctPnNjcm9sbF9oID0gc2Nyb2xsX2g7CisgICAgd2luZG93LT56b29tID0gem9vbTsKKworICAgIHNraW5fd2luZG93X3Jlc2l6ZSggd2luZG93LCAwICk7CisgICAgc2tpbl93aW5kb3dfcmVkcmF3KCB3aW5kb3csIE5VTEwgKTsKK30KKwordm9pZAorc2tpbl93aW5kb3dfcmVkcmF3KCBTa2luV2luZG93KiAgd2luZG93LCBTa2luUmVjdCogIHJlY3QgKQoreworICAgIGlmICh3aW5kb3cgIT0gTlVMTCAmJiB3aW5kb3ctPnN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICBMYXlvdXQqICBsYXlvdXQgPSAmd2luZG93LT5sYXlvdXQ7CisKKyAgICAgICAgaWYgKHJlY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJlY3QgPSAmbGF5b3V0LT5yZWN0OworCisgICAgICAgIHsKKyAgICAgICAgICAgIFNraW5SZWN0ICByOworCisgICAgICAgICAgICBpZiAoIHNraW5fcmVjdF9pbnRlcnNlY3QoICZyLCByZWN0LCAmbGF5b3V0LT5yZWN0ICkgKSB7CisgICAgICAgICAgICAgICAgc2tpbl9zdXJmYWNlX2ZpbGwod2luZG93LT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dC0+Y29sb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgQmFja2dyb3VuZCogIGJhY2sgPSBsYXlvdXQtPmJhY2tncm91bmRzOworICAgICAgICAgICAgQmFja2dyb3VuZCogIGVuZCAgPSBiYWNrICsgbGF5b3V0LT5udW1fYmFja2dyb3VuZHM7CisgICAgICAgICAgICBmb3IgKCA7IGJhY2sgPCBlbmQ7IGJhY2srKyApCisgICAgICAgICAgICAgICAgYmFja2dyb3VuZF9yZWRyYXcoIGJhY2ssIHJlY3QsIHdpbmRvdy0+c3VyZmFjZSApOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgQURpc3BsYXkqICBkaXNwID0gbGF5b3V0LT5kaXNwbGF5czsKKyAgICAgICAgICAgIEFEaXNwbGF5KiAgZW5kICA9IGRpc3AgKyBsYXlvdXQtPm51bV9kaXNwbGF5czsKKyAgICAgICAgICAgIGZvciAoOyBkaXNwIDwgZW5kOyBkaXNwKyspIHsKKyAgICAgICAgICAgICAgICBhZGlzcGxheV9yZWRyYXcoZGlzcCwgcmVjdCwgd2luZG93LT5zdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPnVzZV9lbXVnbF9zdWJ3aW5kb3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgQnV0dG9uKiAgYnV0dG9uID0gbGF5b3V0LT5idXR0b25zOworICAgICAgICAgICAgQnV0dG9uKiAgZW5kICAgID0gYnV0dG9uICsgbGF5b3V0LT5udW1fYnV0dG9uczsKKyAgICAgICAgICAgIGZvciAoIDsgYnV0dG9uIDwgZW5kOyBidXR0b24rKyApCisgICAgICAgICAgICAgICAgYnV0dG9uX3JlZHJhdyggYnV0dG9uLCByZWN0LCB3aW5kb3ctPnN1cmZhY2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggd2luZG93LT5iYWxsLnRyYWNraW5nICkKKyAgICAgICAgICAgIGJhbGxfc3RhdGVfcmVkcmF3KCAmd2luZG93LT5iYWxsLCByZWN0LCB3aW5kb3ctPnN1cmZhY2UgKTsKKworICAgICAgICBza2luX3N1cmZhY2VfdXBkYXRlKHdpbmRvdy0+c3VyZmFjZSwgcmVjdCk7CisgICAgICAgIHNraW5fd2luZG93X3JlZHJhd19vcGVuZ2xlcyggd2luZG93ICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorc2tpbl93aW5kb3dfbWFwX3RvX3NjYWxlKCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgICp4LCBpbnQgICp5ICkKK3sKKyAgICBza2luX3N1cmZhY2VfcmV2ZXJzZV9tYXAod2luZG93LT5zdXJmYWNlLCB4LCB5KTsKK30KKwordm9pZAorc2tpbl93aW5kb3dfcHJvY2Vzc19ldmVudChTa2luV2luZG93KiAgd2luZG93LCBTa2luRXZlbnQqIGV2KQoreworICAgIEJ1dHRvbiogIGJ1dHRvbjsKKyAgICBpbnQgICAgICBteCwgbXk7CisKKyAgICAvLyBUaGlzIGJ1dHRvbiBzdGF0ZSBzZXQgd2lsbCBzdGlsbCBiZSBpbnRlcnByZXRlZCBjb3JyZWN0bHkgZm9yCisgICAgLy8gc2luZ2xlLXRvdWNoLCB3aGljaCBvbmx5IHVzZXMgdGhlIGZpcnN0IGJpdC4KKyAgICBpbnQgYnV0dG9uX3N0YXRlID0gbXVsdGl0b3VjaF9jcmVhdGVfYnV0dG9uc19zdGF0ZSgKKyAgICAgICAgICAgIGV2LT50eXBlICE9IGtFdmVudE1vdXNlQnV0dG9uVXAsIGV2LT51Lm1vdXNlLnNraXBfc3luYywKKyAgICAgICAgICAgIGV2LT51Lm1vdXNlLmJ1dHRvbik7CisKKyAgICBGaW5nZXJTdGF0ZSogZmluZ2VyOworICAgIGlmIChldi0+dS5tb3VzZS5idXR0b24gPT0ga01vdXNlQnV0dG9uU2Vjb25kYXJ5VG91Y2gpIHsKKyAgICAgICAgZmluZ2VyID0gJndpbmRvdy0+c2Vjb25kYXJ5X2ZpbmdlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5nZXIgPSAmd2luZG93LT5maW5nZXI7CisgICAgfQorCisgICAgaWYgKCF3aW5kb3ctPnN1cmZhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaCAoZXYtPnR5cGUpIHsKKyAgICBjYXNlIGtFdmVudE1vdXNlQnV0dG9uRG93bjoKKyAgICAgICAgaWYgKCB3aW5kb3ctPmJhbGwudHJhY2tpbmcgKSB7CisgICAgICAgICAgICBza2luX3dpbmRvd190cmFja2JhbGxfcHJlc3MoIHdpbmRvdywgMSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBteCA9IGV2LT51Lm1vdXNlLng7CisgICAgICAgIG15ID0gZXYtPnUubW91c2UueTsKKyAgICAgICAgc2tpbl93aW5kb3dfbWFwX3RvX3NjYWxlKCB3aW5kb3csICZteCwgJm15ICk7CisgICAgICAgIHNraW5fd2luZG93X21vdmVfbW91c2UoIHdpbmRvdywgZmluZ2VyLCBteCwgbXkgKTsKKyAgICAgICAgc2tpbl93aW5kb3dfZmluZF9maW5nZXIoIHdpbmRvdywgZmluZ2VyLCBteCwgbXkgKTsKKyNpZiAwCisgICAgICAgIHByaW50ZigiZG93bjogeD0lZCB5PSVkIGZ4PSVkIGZ5PSVkIGZpcz0lZFxuIiwKKyAgICAgICAgICAgICAgIGV2LT51Lm1vdXNlLngsIGV2LT51Lm1vdXNlLnksIHdpbmRvdy0+ZmluZ2VyLnBvcy54LAorICAgICAgICAgICAgICAgd2luZG93LT5maW5nZXIucG9zLnksIHdpbmRvdy0+ZmluZ2VyLmluc2lkZSk7CisjZW5kaWYKKyAgICAgICAgaWYgKGZpbmdlci0+aW5zaWRlKSB7CisgICAgICAgICAgICBmaW5nZXItPnRyYWNraW5nID0gMTsKKyAgICAgICAgICAgIGFkZF9maW5nZXJfZXZlbnQod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5nZXItPnBvcy54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5nZXItPnBvcy55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fc3RhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2luZG93LT5idXR0b24ucHJlc3NlZCA9IE5VTEw7CisgICAgICAgICAgICBidXR0b24gPSB3aW5kb3ctPmJ1dHRvbi5ob3ZlcjsKKyAgICAgICAgICAgIGlmKGJ1dHRvbikgeworICAgICAgICAgICAgICAgIGJ1dHRvbi0+ZG93biArPSAxOworICAgICAgICAgICAgICAgIHNraW5fd2luZG93X3JlZHJhdyggd2luZG93LCAmYnV0dG9uLT5yZWN0ICk7CisgICAgICAgICAgICAgICAgd2luZG93LT5idXR0b24ucHJlc3NlZCA9IGJ1dHRvbjsKKyAgICAgICAgICAgICAgICBpZihidXR0b24tPmtleWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93LT53aW5fZnVuY3MtPmtleV9ldmVudChidXR0b24tPmtleWNvZGUsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0V2ZW50TW91c2VCdXR0b25VcDoKKyAgICAgICAgaWYgKCB3aW5kb3ctPmJhbGwudHJhY2tpbmcgKSB7CisgICAgICAgICAgICBza2luX3dpbmRvd190cmFja2JhbGxfcHJlc3MoIHdpbmRvdywgMCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnV0dG9uID0gd2luZG93LT5idXR0b24ucHJlc3NlZDsKKyAgICAgICAgbXggPSBldi0+dS5tb3VzZS54OworICAgICAgICBteSA9IGV2LT51Lm1vdXNlLnk7CisgICAgICAgIHNraW5fd2luZG93X21hcF90b19zY2FsZSggd2luZG93LCAmbXgsICZteSApOworICAgICAgICBpZiAoYnV0dG9uKQorICAgICAgICB7CisgICAgICAgICAgICBidXR0b24tPmRvd24gPSAwOworICAgICAgICAgICAgc2tpbl93aW5kb3dfcmVkcmF3KCB3aW5kb3csICZidXR0b24tPnJlY3QgKTsKKyAgICAgICAgICAgIGlmKGJ1dHRvbi0+a2V5Y29kZSkgeworICAgICAgICAgICAgICAgIHdpbmRvdy0+d2luX2Z1bmNzLT5rZXlfZXZlbnQoYnV0dG9uLT5rZXljb2RlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpbmRvdy0+YnV0dG9uLnByZXNzZWQgPSBOVUxMOworICAgICAgICAgICAgd2luZG93LT5idXR0b24uaG92ZXIgICA9IE5VTEw7CisgICAgICAgICAgICBza2luX3dpbmRvd19tb3ZlX21vdXNlKCB3aW5kb3csIGZpbmdlciwgbXgsIG15ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZmluZ2VyLT50cmFja2luZykKKyAgICAgICAgeworICAgICAgICAgICAgc2tpbl93aW5kb3dfbW92ZV9tb3VzZSggd2luZG93LCBmaW5nZXIsIG14LCBteSApOworICAgICAgICAgICAgZmluZ2VyLT50cmFja2luZyA9IDA7CisgICAgICAgICAgICBhZGRfZmluZ2VyX2V2ZW50KHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VyLT5wb3MueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VyLT5wb3MueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uX3N0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0V2ZW50TW91c2VNb3Rpb246CisgICAgICAgIGlmICggd2luZG93LT5iYWxsLnRyYWNraW5nICkgeworICAgICAgICAgICAgc2tpbl93aW5kb3dfdHJhY2tiYWxsX21vdmUod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYtPnUubW91c2UueHJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LT51Lm1vdXNlLnlyZWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbXggPSBldi0+dS5tb3VzZS54OworICAgICAgICBteSA9IGV2LT51Lm1vdXNlLnk7CisgICAgICAgIHNraW5fd2luZG93X21hcF90b19zY2FsZSggd2luZG93LCAmbXgsICZteSApOworICAgICAgICBpZiAoICF3aW5kb3ctPmJ1dHRvbi5wcmVzc2VkICkKKyAgICAgICAgeworICAgICAgICAgICAgc2tpbl93aW5kb3dfbW92ZV9tb3VzZSggd2luZG93LCBmaW5nZXIsIG14LCBteSApOworICAgICAgICAgICAgaWYgKCBmaW5nZXItPnRyYWNraW5nICkgeworICAgICAgICAgICAgICAgIGFkZF9maW5nZXJfZXZlbnQod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZ2VyLT5wb3MueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmdlci0+cG9zLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25fc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBrRXZlbnRTY3JlZW5DaGFuZ2VkOgorICAgICAgICAvLyBSZS1zZXR1cCB0aGUgT3BlbkdMIEVTIHN1YndpbmRvdyB3aXRoIGEgcG90ZW50aWFsbHkgZGlmZmVyZW50CisgICAgICAgIC8vIGZyYW1lYnVmZmVyIHNpemUgKGUuZy4sIDJ4IGZvciByZXRpbmEgc2NyZWVucykuCisgICAgICAgIHNraW5fd2luZG93X2hpZGVfb3BlbmdsZXMod2luZG93KTsKKyAgICAgICAgc2tpbl93aW5kb3dfc2hvd19vcGVuZ2xlcyh3aW5kb3cpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIDsKKyAgICB9CisKK30KKworc3RhdGljIEFEaXNwbGF5Kgorc2tpbl93aW5kb3dfZGlzcGxheSggU2tpbldpbmRvdyogIHdpbmRvdyApCit7CisgICAgcmV0dXJuIHdpbmRvdy0+bGF5b3V0LmRpc3BsYXlzOworfQorCit2b2lkCitza2luX3dpbmRvd191cGRhdGVfZGlzcGxheSggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICB4LCBpbnQgIHksIGludCAgdywgaW50ICBoICkKK3sKKyAgICBpZiAoICF3aW5kb3ctPnN1cmZhY2UgKQorICAgICAgICByZXR1cm47CisKKyAgICBBRGlzcGxheSogZGlzcCA9IHNraW5fd2luZG93X2Rpc3BsYXkod2luZG93KTsKKworICAgIGlmIChkaXNwICE9IE5VTEwpIHsKKyAgICAgICAgU2tpblJlY3QgIHI7CisgICAgICAgIHIucG9zLnggID0geDsKKyAgICAgICAgci5wb3MueSAgPSB5OworICAgICAgICByLnNpemUudyA9IHc7CisgICAgICAgIHIuc2l6ZS5oID0gaDsKKworICAgICAgICBza2luX3JlY3Rfcm90YXRlKCAmciwgJnIsIGRpc3AtPnJvdGF0aW9uICk7CisgICAgICAgIHIucG9zLnggKz0gZGlzcC0+b3JpZ2luLng7CisgICAgICAgIHIucG9zLnkgKz0gZGlzcC0+b3JpZ2luLnk7CisKKyAgICAgICAgYWRpc3BsYXlfcmVkcmF3KGRpc3AsICZyLCB3aW5kb3ctPnN1cmZhY2UsIHdpbmRvdy0+dXNlX2VtdWdsX3N1YndpbmRvdyk7CisgICAgfQorfQorCisKK3ZvaWQgc2tpbl93aW5kb3dfdXBkYXRlX2dwdV9mcmFtZShTa2luV2luZG93KiB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcGl4ZWxzKSB7CisgICAgaWYgKCF3aW5kb3cpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFEaXNwbGF5KiBkaXNwID0gc2tpbl93aW5kb3dfZGlzcGxheSh3aW5kb3cpOworICAgIGlmICghZGlzcCB8fCBkaXNwLT5kYXRhc2l6ZS53ICE9IHcgfHwgZGlzcC0+ZGF0YXNpemUuaCAhPSBoKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCB2YWx1ZXMhXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkaXNwLT5ncHVfZnJhbWUpIHsKKyAgICAgICAgY29uc3QgaW50IHNpemUgPSA0ICogdyAqIGg7CisgICAgICAgIGRpc3AtPmdwdV9mcmFtZSA9IGNhbGxvYygxLCBzaXplKTsKKyAgICAgICAgaWYgKCFkaXNwLT5ncHVfZnJhbWUpIHsKKyAgICAgICAgICAgIGRlcnJvcigiRVJST1I6ICVzOiVkIGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgb2YgJWQgYnl0ZXMuXG4iLAorICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgc2l6ZSk7CisgICAgICAgICAgICBjcmFzaGhhbmRsZXJfZGllX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIkdQVSBmcmFtZSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgKHJlcXVlc3RlZCAlZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBDb252ZXJ0IGZyb20gR0xfUkdCQSB0byAzMi1iaXQgQVJHQi4KKyAgICB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IHBpeGVsczsKKyAgICAgICAgdWludDMyX3QqIGRzdCA9ICh1aW50MzJfdCopZGlzcC0+Z3B1X2ZyYW1lOworICAgICAgICB1aW50MzJfdCogZHN0X2VuZCA9IGRzdCArIHcgKiBoOworICAgICAgICBmb3IgKDsgZHN0IDwgZHN0X2VuZDsgc3JjICs9IDQsIGRzdCArPSAxKSB7CisgICAgICAgICAgICBkc3RbMF0gPSAoKHVpbnQzMl90KXNyY1szXSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClzcmNbMF0gPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3Qpc3JjWzFdIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc3JjWzJdOworICAgICAgICB9CisgICAgfQorCisgICAgc2tpbl93aW5kb3dfdXBkYXRlX2Rpc3BsYXkod2luZG93LCAwLCAwLCB3LCBoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3dpbmRvdy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NraW4vd2luZG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljMjE0MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3dpbmRvdy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2V2ZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL2ZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vdHJhY2tiYWxsLmgiCisKK3R5cGVkZWYgc3RydWN0IFNraW5XaW5kb3cgIFNraW5XaW5kb3c7CisKK3R5cGVkZWYgc3RydWN0IFNraW5XaW5kb3dGdW5jcyB7CisgICAgdm9pZCAoKmtleV9ldmVudCkodW5zaWduZWQga2V5Y29kZSwgaW50IGRvd24pOworICAgIHZvaWQgKCptb3VzZV9ldmVudCkodW5zaWduZWQgeCwgdW5zaWduZWQgeSwgdW5zaWduZWQgc3RhdGUpOworICAgIHZvaWQgKCpzZXRfZGV2aWNlX29yaWVudGF0aW9uKShTa2luUm90YXRpb24gcm90YXRpb24pOworICAgIGludCAoKm9wZW5nbGVzX3Nob3cpKHZvaWQqIHdpbmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3dywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZidywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByb3RhdGlvbl9kZWdyZWVzKTsKKyAgICBpbnQgKCpvcGVuZ2xlc19oaWRlKSh2b2lkKTsKKyAgICB2b2lkICgqb3BlbmdsZXNfc2V0VHJhbnNsYXRpb24pKGZsb2F0IHB4LCBmbG9hdCBweSk7CisgICAgdm9pZCAoKm9wZW5nbGVzX3JlZHJhdykodm9pZCk7Cit9IFNraW5XaW5kb3dGdW5jczsKKworLyogTm90ZTogaWYgc2NhbGUgaXMgPD0gMCwgd2UgaW50ZXJwcmV0IHRoaXMgYXMgJ2F1dG8tZGV0ZWN0Jy4KKyAqICAgICAgIFRoZSBiZWhhdmlvdXIgaXMgdG8gdXNlIDEuMCBieSBkZWZhdWx0LCB1bmxlc3MgdGhlIHJlc3VsdGluZworICogICAgICAgd2luZG93IGlzIHRvbyBsYXJnZSwgaW4gd2hpY2ggY2FzZSB0aGUgd2luZG93IHdpbGwgYXV0b21hdGljYWxseQorICogICAgICAgYmUgcmVzaXplZCB0byBmaXQgdGhlIHNjcmVlbi4KKyAqLworZXh0ZXJuIFNraW5XaW5kb3cqIHNraW5fd2luZG93X2NyZWF0ZShTa2luTGF5b3V0KiBsYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2VtdWdsX3N1YndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tpbldpbmRvd0Z1bmNzKiB3aW5fZnVuY3MpOworCitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19lbmFibGVfdG91Y2goIFNraW5XaW5kb3cqICB3aW5kb3csIGludCAgZW5hYmxlZCApOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc2tpbl93aW5kb3dfZW5hYmxlX3RyYWNrYmFsbCggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICBlbmFibGVkICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19lbmFibGVfZHBhZCggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICBlbmFibGVkICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19lbmFibGVfcXdlcnR5KCBTa2luV2luZG93KiAgd2luZG93LCBpbnQgIGVuYWJsZWQgKTsKKworZXh0ZXJuIGludCAgICAgICAgICAgICAgc2tpbl93aW5kb3dfcmVzZXQgKCBTa2luV2luZG93KiAgd2luZG93LCBTa2luTGF5b3V0KiAgbGF5b3V0ICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19mcmVlICAoIFNraW5XaW5kb3cqICB3aW5kb3cgKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3JlZHJhdyggU2tpbldpbmRvdyogIHdpbmRvdywgU2tpblJlY3QqICByZWN0ICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19wcm9jZXNzX2V2ZW50KCBTa2luV2luZG93KiAgd2luZG93LCBTa2luRXZlbnQqICBldiApOworCitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19zZXRfb25pb24oIFNraW5XaW5kb3cqICAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luSW1hZ2UqICAgIG9uaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2luUm90YXRpb24gIHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGFscGhhICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3NldF9zY2FsZSggU2tpbldpbmRvdyogIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICAgICAgIHNjYWxlICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3NldF96b29tKCBTa2luV2luZG93KiAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICB6b29tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBkdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHNjcm9sbF9oICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3Bvc2l0aW9uX2NoYW5nZWQoIFNraW5XaW5kb3cqICAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5ICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3Njcm9sbF91cGRhdGVkKCBTa2luV2luZG93KiAgICB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR4LCBpbnQgeG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHksIGludCB5bWF4ICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3NldF90aXRsZSggU2tpbldpbmRvdyogIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHRpdGxlICk7CisKK2V4dGVybiB2b2lkICAgICAgICAgICAgIHNraW5fd2luZG93X3NldF90cmFja2JhbGwoIFNraW5XaW5kb3cqICB3aW5kb3csIFNraW5UcmFja0JhbGwqICBiYWxsICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19zaG93X3RyYWNrYmFsbCggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICBlbmFibGUgKTsKKworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc2tpbl93aW5kb3dfem9vbWVkX3dpbmRvd19yZXNpemVkKCBTa2luV2luZG93KiAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCBkeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Nyb2xsX2gpOworCisvKiBjaGFuZ2UgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGVtdWxhdG9yIExDRCBzY3JlZW4uICdicmlnaHRuZXNzJyB3aWxsIGJlIGNsYW1wZWQgdG8gMC4uMjU1ICovCitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd19zZXRfbGNkX2JyaWdodG5lc3MoIFNraW5XaW5kb3cqICB3aW5kb3csIGludCAgYnJpZ2h0bmVzcyApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICB3aWR0aDsKKyAgICBpbnQgICAgICAgICAgIGhlaWdodDsKKyAgICBTa2luUm90YXRpb24gIHJvdGF0aW9uOworICAgIHZvaWQqICAgICAgICAgZGF0YTsKK30gQURpc3BsYXlJbmZvOworCitleHRlcm4gdm9pZCAgICAgICAgICAgICBza2luX3dpbmRvd191cGRhdGVfZGlzcGxheSggU2tpbldpbmRvdyogIHdpbmRvdywgaW50ICB4LCBpbnQgIHksIGludCAgdywgaW50ICBoICk7CisKK2V4dGVybiB2b2lkIHNraW5fd2luZG93X3VwZGF0ZV9ncHVfZnJhbWUoU2tpbldpbmRvdyogd2luZG93LCBpbnQgdywgaW50IGgsIGNvbnN0IHZvaWQqIHBpeGVscyk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi93aW5zeXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9za2luL3dpbnN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NTQxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc2tpbi93aW5zeXMuaApAQCAtMCwwICsxLDk0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvLyBXaW5kb3cgc3lzdGVtIHJlbGF0ZWQgZGVmaW5pdGlvbnMuCisjaW5jbHVkZSAiYW5kcm9pZC9za2luL3JlY3QuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLy8gSW5pdCBhcmdzLgordm9pZCBza2luX3dpbnN5c19pbml0X2FyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKKworLy8gUmV0dXJuIHdpbmRvdyBoYW5kbGUgb2YgbWFpbiBVSS4KK3ZvaWQqIHNraW5fd2luc3lzX2dldF93aW5kb3dfaGFuZGxlKHZvaWQpOworCisvLyBSZXR1cm4gcmVjdGFuZ2xlIG9mIGN1cnJlbnQgbW9uaXRvciBpbiBwaXhlbHMuCit2b2lkIHNraW5fd2luc3lzX2dldF9tb25pdG9yX3JlY3QoU2tpblJlY3QqIHJlY3QpOworCisvLyBSZXR1cm5zIHRoZSByYXRpbyBiZXR3ZWVuIHBoeXNpY2FsIHBpeGVscyBhbmQgZGV2aWNlLWluZGVwZW5kZW50IHBpeGVscyBmb3IKKy8vIHRoZSB3aW5kb3cuIFJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgLTEgaW4gY2FzZSBvZiBmYWlsdXJlLgoraW50IHNraW5fd2luc3lzX2dldF9kZXZpY2VfcGl4ZWxfcmF0aW8oZG91YmxlKiBkcHIpOworCisvLyBTZXQgbWFpbiB3aW5kb3cgcG9zaXRpb24uCit2b2lkIHNraW5fd2luc3lzX3NldF93aW5kb3dfcG9zKGludCB3aW5kb3dfeCwgaW50IHdpbmRvd195KTsKKworLy8gR2V0IG1haW4gd2luZG93IHBvc2l0aW9uLgordm9pZCBza2luX3dpbnN5c19nZXRfd2luZG93X3BvcyhpbnQqIHdpbmRvd194LCBpbnQqIHdpbmRvd195KTsKKworLy8gSW5mb3JtIHRoZSBtYWluIHdpbmRvdyBvZiB0aGUgc3Vid2luZG93IGdlb21ldHJ5Cit2b2lkIHNraW5fd2luc3lzX3NldF9kZXZpY2VfZ2VvbWV0cnkoY29uc3QgU2tpblJlY3QqIHJlY3QpOworCisvLyBTZXQgd2luZG93IHRpdGxlLgordm9pZCBza2luX3dpbnN5c19zZXRfd2luZG93X3RpdGxlKGNvbnN0IGNoYXIqIHRpdGxlKTsKKworLy8gUmV0dXJuIHRydWUgaWZmIHRoZSBtYWluIHdpbmRvdyBpcyBmdWxseSB2aXNpYmxlCitib29sIHNraW5fd2luc3lzX2lzX3dpbmRvd19mdWxseV92aXNpYmxlKHZvaWQpOworCisvLyBTdGFydCBtYWluIHdpbmRvdyBzdXBwb3J0LiB8bm9fd2luZG93fCBtdXN0IGJlIHRydWUgdG8gaW5kaWNhdGUgdGhhdAorLy8gbm8gd2luZG93IG5lZWRzIHRvIGJlIHNob3duLCBidXQgdGhhdCB0aGUgR1VJIGJhY2tlbmQgc3RpbGwgbmVlZHMgdG8gYmUKKy8vIGluaXRpYWxpemVkLgordm9pZCBza2luX3dpbnN5c19zdGFydChib29sIG5vX3dpbmRvdyk7CisKKy8vIFNldCB0aGUgbWFpbiB3aW5kb3cncyBpY29uLgorLy8gfGljb25fZGF0YXwgaXMgdGhlIHN0YXJ0IG9mIHRoZSBpY29uIGluIFBORyBmb3JtYXQuCisvLyB8aWNvbl9kYXRhX3NpemV8IGlzIGl0cyBzaXplIGluIGJ5dGVzLgorLy8KKy8vIE5vdGU6IE9uIFdpbmRvd3MsIHRoZSBpY29uIGRhdGEgaXMgaWdub3JlZCwgYW5kIHRoZSBpY29uIGlzIGRpcmVjdGx5CisvLyAgICAgICBleHRyYWN0ZWQgZnJvbSB0aGUgZXhlY3V0YWJsZS4KK3ZvaWQgc2tpbl93aW5zeXNfc2V0X3dpbmRvd19pY29uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGljb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpY29uX2RhdGFfc2l6ZSk7CisKKy8vIFN0b3AgbWFpbiB3aW5kb3cgYW5kIHF1aXQgcHJvZ3JhbS4gTXVzdCBiZSBjYWxsZWQgZnJvbSBpbnNpZGUgZXZlbnQgbG9vcC4KK3ZvaWQgc2tpbl93aW5zeXNfcXVpdF9yZXF1ZXN0KHZvaWQpOworCisvLyBLaWxsIHRoZSBza2luLXJlbGF0ZWQgb2JqZWN0cwordm9pZCBza2luX3dpbnN5c19kZXN0cm95KHZvaWQpOworCit0eXBlZGVmIHZvaWQgKCpTdGFydEZ1bmN0aW9uKShpbnQgYXJnYywgY2hhcioqIGFyZ3YpOworCisvLyBTcGF3biBhIHRocmVhZCBhbmQgcnVuIHRoZSBnaXZlbiBmdW5jdGlvbiBpbiBpdC4KK3ZvaWQgc2tpbl93aW5zeXNfc3Bhd25fdGhyZWFkKGJvb2wgbm9fd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRGdW5jdGlvbiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogYXJndik7CisKKy8vIEVudGVyIHRoZSBtYWluIGV2ZW50IGhhbmRsaW5nIGxvb3AgZm9yIHRoZSBVSSBzdWJzeXN0ZW0uCit2b2lkIHNraW5fd2luc3lzX2VudGVyX21haW5fbG9vcChib29sIG5vX3dpbmRvdyk7CisKKy8vIFJ1biBzb21lIFVJIHVwZGF0ZSBpbiBhIHdheSB0aGF0IFVJIHN1YnN5c3RlbSBuZWVkcworLy8gRS5nLiBmb3IgUXQgVUksIGl0IG1ha2VzIHN1cmUgdGhlIGZ1bmN0aW9uIHJ1bnMgb24gdGhlIG1haW4gUXQgVUkgdGhyZWFkLAorLy8gICBhcyBRdCByZXF1aXJlcyBhbnkgVUkgaW50ZXJhY3Rpb24gdG8gY29tZSBmcm9tIHRoZXJlLgordHlwZWRlZiB2b2lkICgqU2tpbkdlbmVyaWNGdW5jdGlvbikodm9pZCogZGF0YSk7Cit2b2lkIHNraW5fd2luc3lzX3J1bl91aV91cGRhdGUoU2tpbkdlbmVyaWNGdW5jdGlvbiBmLCB2b2lkKiBkYXRhKTsKKworLy8gU2hvdyBhIGJsb2NraW5nIGVycm9yIGRpYWxvZyBydW5uaW5nIG9uIHRoZSBVSSB0aHJlYWQuCit2b2lkIHNraW5fd2luc3lzX2Vycm9yX2RpYWxvZyhjb25zdCBjaGFyKiBtZXNzYWdlLCBjb25zdCBjaGFyKiB0aXRsZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvc25hcGhvc3QtYW5kcm9pZC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NuYXBob3N0LWFuZHJvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFiYTRjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NuYXBob3N0LWFuZHJvaWQuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc25hcGhvc3QtYW5kcm9pZC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lICBFKC4uLikgICAgZGVycm9yKF9fVkFfQVJHU19fKQorI2RlZmluZSAgVyguLi4pICAgIGR3YXJuaW5nKF9fVkFfQVJHU19fKQorI2RlZmluZSAgRCguLi4pICAgIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKworLyogQ29tcGFyZXMgdHdvIGluc3RhbmNlIG9mIGFuIGluaSBmaWxlLgorICogVGhpcyByb3V0aW5lIGNvbXBhcmVzIGFsbCBlbnRyaWVzIChrZXksdmFsdWUgcGFpcnMpIGZvdW5kIGluIG9uZSBpbmkgZmlsZQorICogYWdhaW5zdCBlbnRyaWVzIGluIGFub3RoZXIgZmlsZS4gVGhlIGZpbGVzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVxdWFsIGlmOgorICogMS4gTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCBmaWxlIGlzIGVxdWFsLgorICogMi4gRWFjaCBlbnRyeSBpbiBvbmUgZmlsZSBoYXMgYSBjb3JyZXNwb25kZWQgZW50cnkgaW4gYW5vdGhlciBmaWxlLCBhbmQgdGhlaXIKKyAqICAgIHZhbHVlcyBhcmUgZXF1YWwuCisgKiBQYXJhbToKKyAqICBjdXJyZW50IC0gSW5pIGZpbGUgY29udGFpbmluZyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICogIHNhdmVkIC0gSW5pIGZpbGUgY29udGFpbmluZyBhIHByZXZpb3VzbHkgc2F2ZWQgY29uZmlndXJhdGlvbi4KKyAqIFJldHVybjoKKyAqICAwIGlmIGZpbGVzIGFyZSBlcXVhbCwgb3IgMSBpZiB0aGV5IGFyZSBub3QgZXF1YWwsIG9yIC0xIGlmIGFuIGVycm9yIGhhcworICogb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgX2NtcF9od19jb25maWcoQ0luaUZpbGUqIGN1cnJlbnQsIENJbmlGaWxlKiBzYXZlZCkgeworICAgIGludCBuLCByZXQgPSAwOworICAgIGNvbnN0IGludCBudW1fcGFpcnMgPSBpbmlGaWxlX2dldFBhaXJDb3VudChjdXJyZW50KTsKKworICAgIC8qIENoZWNrIDE6IGJldHRlciBjb250YWluIHNhbWUgbnVtYmVyIG9mIGVudHJpZXM7IGJ1dCB0aGlzIGlzIGEgbm9uLWZhdGFsIHJlcXVpcmVtZW50Ki8KKyAgICBpZiAobnVtX3BhaXJzICE9IGluaUZpbGVfZ2V0UGFpckNvdW50KHNhdmVkKSkgeworICAgICAgICBEKCJEaWZmZXJlbnQgbnVtYmVycyBvZiBlbnRyaWVzIGluIHRoZSBIVyBjb25maWcgZmlsZXMuIEN1cnJlbnQgY29udGFpbnMgJWQsIHdoaWxlIHNhdmVkIGNvbnRhaW5zICVkIGVudHJpZXMuIiwKKyAgICAgICAgICBudW1fcGFpcnMsIGluaUZpbGVfZ2V0UGFpckNvdW50KHNhdmVkKSk7CisgICAgICAgIC8vIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGVudHJpZXMgaW4gdGhlIGN1cnJlbnQgZmlsZSwgY29tcGFyaW5nIHRoZW0gdG8gZW50cmllcworICAgICAqIGluIHRoZSBzYXZlZCBmaWxlLiAqLworICAgIGZvciAobiA9IDA7IG4gPCBudW1fcGFpcnMgJiYgcmV0ID09IDA7IG4rKykgeworICAgICAgICBjaGFyKiBrZXksICp2YWx1ZTEsICp2YWx1ZTI7CisKKyAgICAgICAgaWYgKGluaUZpbGVfZ2V0RW50cnkoY3VycmVudCwgbiwgJmtleSwgJnZhbHVlMSkpIHsKKyAgICAgICAgICAgIEQoIlVuYWJsZSB0byBvYnRhaW4gZW50cnkgJWQgZnJvbSB0aGUgY3VycmVudCBIVyBjb25maWcgZmlsZSIsIG4pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdmFsdWUyID0gaW5pRmlsZV9nZXRTdHJpbmcoc2F2ZWQsIGtleSwgIiIpOworICAgICAgICBpZiAodmFsdWUyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEQoIlNhdmVkIEhXIGNvbmZpZyBmaWxlIGlzIG1pc3NpbmcgZW50cnkgKCclcycsICclcycpIGZvdW5kIGluIHRoZSBjdXJyZW50IEhXIGNvbmZpZy4iLAorICAgICAgICAgICAgICBrZXksIHZhbHVlMSk7CisgICAgICAgICAgICBmcmVlKGtleSk7CisgICAgICAgICAgICBmcmVlKHZhbHVlMSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHN0cmNtcCh2YWx1ZTEsIHZhbHVlMik7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIEQoIkhXIGNvbmZpZyB2YWx1ZSBtaXNtYXRjaCBmb3IgYSBrZXkgJyVzJzogY3VycmVudCBpcyAnJXMnIHdoaWxlIHNhdmVkIHdhcyAnJXMnIiwKKyAgICAgICAgICAgICAga2V5LCB2YWx1ZTEsIHZhbHVlMik7CisgICAgICAgIH0KKworICAgICAgICBmcmVlKHZhbHVlMik7CisgICAgICAgIGZyZWUodmFsdWUxKTsKKyAgICAgICAgZnJlZShrZXkpOworICAgIH0KKworICAgIHJldHVybiByZXQgPyAxIDogMDsKK30KKworLyogQnVpbGRzIHBhdGggdG8gdGhlIEhXIGNvbmZpZyBiYWNrdXAgZmlsZSB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgSFcgY29uZmlnCisgKiBzZXR0aW5ncyB1c2VkIGZvciB0aGF0IHNuYXBzaG90LiBUaGUgYmFja3VwIHBhdGggaXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZQorICogc25hcHNob3Qgc3RvcmFnZSBmaWxlIHBhdGgsIHNuYXBzaG90IG5hbWUsIGFuZCBhbiAnaW5pJyBleHRlbnNpb24uIFRoaXMKKyAqIHdheSB3ZSBjYW4gdHJhY2sgSFcgY29uZmlndXJhdGlvbiBmb3IgZGlmZmVyZW50IHNuYXBzaG90IG5hbWVzIHN0b3JlIGluCisgKiBkaWZmZXJlbnQgc3RvcmFnZSBmaWxlcy4KKyAqIFBhcmFtOgorICogIG5hbWUgLSBOYW1lIG9mIHRoZSBzbmFwc2hvdCBpbnNpZGUgdGhlIHNuYXBzaG90IHN0b3JhZ2UgZmlsZS4KKyAqIFJldHVybjoKKyAqICBQYXRoIHRvIHRoZSBIVyBjb25maWcgYmFja3VwIGZpbGUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBhbiBlcnJvci4KKyAqLworc3RhdGljIGNoYXIqCitfYnVpbGRfaHdjZmdfcGF0aChjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGNvbnN0IGludCBwYXRoX2xlbiA9IHN0cmxlbihhbmRyb2lkX2h3LT5kaXNrX3NuYXBTdG9yYWdlX3BhdGgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obmFtZSkgKyA2OworICAgIGNoYXIqIGJrcF9wYXRoID0gbWFsbG9jKHBhdGhfbGVuKTsKKyAgICBpZiAoYmtwX3BhdGggPT0gTlVMTCkgeworICAgICAgICBFKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIEhXIGNvbmZpZyBwYXRoISIsIHBhdGhfbGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc25wcmludGYoYmtwX3BhdGgsIHBhdGhfbGVuLCAiJXMuJXMuaW5pIiwKKyAgICAgICAgICAgICBhbmRyb2lkX2h3LT5kaXNrX3NuYXBTdG9yYWdlX3BhdGgsIG5hbWUpOworCisgICAgcmV0dXJuIGJrcF9wYXRoOworfQorCitpbnQgc25hcGhvc3RfbWF0Y2hfY29uZmlncyhDSW5pRmlsZSogaHdfaW5pLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgc25hcHNob3Qgc3RvcmFnZSBwYXRoIGlzIHZhbGlkLiAqLworICAgIGlmIChhbmRyb2lkX2h3LT5kaXNrX3NuYXBTdG9yYWdlX3BhdGggPT0gTlVMTCB8fAorICAgICAgICAqYW5kcm9pZF9ody0+ZGlza19zbmFwU3RvcmFnZV9wYXRoID09ICdcMCcpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogQnVpbGQgcGF0aCB0byB0aGUgSFcgY29uZmlnIGZvciB0aGUgbG9hZGluZyBWTS4gKi8KKyAgICBjaGFyKiBia3BfcGF0aCA9IF9idWlsZF9od2NmZ19wYXRoKG5hbWUpOworICAgIGlmIChia3BfcGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIExvYWQgSFcgY29uZmlnIGZyb20gdGhlIHByZXZpb3VzIGVtdWxhdG9yIGxhdW5jaC4gKi8KKyAgICBDSW5pRmlsZSogaHdjZmdfYmtwID0gaW5pRmlsZV9uZXdGcm9tRmlsZShia3BfcGF0aCk7CisKKyAgICBpZiAoaHdjZmdfYmtwICE9IE5VTEwgJiYgaW5pRmlsZV9nZXRQYWlyQ291bnQoaHdjZmdfYmtwKSA+IDApIHsKKyAgICAgICAgaWYgKF9jbXBfaHdfY29uZmlnKGh3X2luaSwgaHdjZmdfYmtwKSkgeworICAgICAgICAgICAgRSgiVW5hYmxlIHRvIGxvYWQgVk0gZnJvbSBzbmFwc2hvdC4gVGhlIHNuYXBzaG90IGhhcyBiZWVuIHNhdmVkIGZvciBhIGRpZmZlcmVudCBoYXJkd2FyZSBjb25maWd1cmF0aW9uLiIpOworICAgICAgICAgICAgZnJlZShia3BfcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpbmlGaWxlX2ZyZWUoaHdjZmdfYmtwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJdCBjb3VsZCBiZSB0aGF0IGEgc25hcHNob3QgZmlsZSBoYXMgYmVlbiBjb3BpZWQgZnJvbSBhbm90aGVyCisgICAgICAgICAqIGxvY2F0aW9uIHdpdGhvdXQgY29weWluZyB0aGUgYmFja3VwIGZpbGUsIG9yIHNuYXBzaG90IGZpbGUgaGFzIG5vdAorICAgICAgICAgKiBiZWVuIGNyZWF0ZWQgeWV0LiBJbiBlaXRoZXIgY2FzZSB3ZSBjYW4ndCBkbyBtdWNoIGNoZWNraW5nIGhlcmUsCisgICAgICAgICAqIHNvLCBsZXRzIGJlIGhvcGVmdWxsIHRoYXQgdXNlciBrbm93cyB3aGF0IChzKWhlIGlzIGRvaW5nLiAqLworICAgICAgICBEKCJNaXNzaW5nIEhXIGNvbmZpZyBiYWNrdXAgZmlsZSAnJXMnIiwgYmtwX3BhdGgpOworICAgIH0KKworICAgIGZyZWUoYmtwX3BhdGgpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQKK3NuYXBob3N0X3NhdmVfY29uZmlnKGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgLyogTWFrZSBzdXJlIHRoYXQgc25hcHNob3Qgc3RvcmFnZSBwYXRoIGlzIHZhbGlkLiAqLworICAgIGlmIChhbmRyb2lkX2h3LT5kaXNrX3NuYXBTdG9yYWdlX3BhdGggPT0gTlVMTCB8fAorICAgICAgICAqYW5kcm9pZF9ody0+ZGlza19zbmFwU3RvcmFnZV9wYXRoID09ICdcMCcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEJ1aWxkIHBhdGggdG8gdGhlIEhXIGNvbmZpZyBmb3IgdGhlIHNhdmluZyBWTS4gKi8KKyAgICBjaGFyKiBia3BfcGF0aCA9IF9idWlsZF9od2NmZ19wYXRoKG5hbWUpOworICAgIGlmIChia3BfcGF0aCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgSFcgY29uZmlnIGJhY2t1cCBmaWxlIGZyb20gdGhlIGN1cnJlbnQgSFcgY29uZmlnIHNldHRpbmdzLiAqLworICAgIENJbmlGaWxlKiBod2NmZ19ia3AgPSBpbmlGaWxlX25ld0VtcHR5KGJrcF9wYXRoKTsKKyAgICBpZiAoaHdjZmdfYmtwID09IE5VTEwpIHsKKyAgICAgICAgVygiVW5hYmxlIHRvIGNyZWF0ZSBiYWNrdXAgSFcgY29uZmlnIGZpbGUgJyVzJy4gRXJyb3I6ICVzIiwKKyAgICAgICAgICBia3BfcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhbmRyb2lkSHdDb25maWdfd3JpdGUoYW5kcm9pZF9odywgaHdjZmdfYmtwKTsKKworICAgIC8qIEludmFsaWRhdGUgZGF0YSBwYXJ0aXRpb24gaW5pdGlhbGl6YXRpb24gcGF0aCBpbiB0aGUgYmFja3VwIGNvcHkgb2YgSFcKKyAgICAgKiBjb25maWcuIFRoZSByZWFzb24gd2UgbmVlZCB0byBkbyB0aGlzIGlzIHRoYXQgd2Ugd2FudCB0aGUgc3lzdGVtIGxvYWRpbmcKKyAgICAgKiBmcm9tIHRoZSBzbmFwc2hvdCB0byBiZSBpbiBzeW5jIHdpdGggdGhlIGRhdGEgcGFydGl0aW9uIHRoZSBzbmFwc2hvdCB3YXMKKyAgICAgKiBzYXZlZCBmb3IuIEZvciB0aGF0IHdlIG11c3QgZGlzYWxvdyBvdmVyd3JpdHRpbmcgaXQgb24gc25hcHNob3QgbG9hZC4gSW4KKyAgICAgKiBvdGhlciB3b3Jkcywgd2Ugc2hvdWxkIGFsbG93IHNuYXBzaG90IGxvYWRpbmcgb25seSBvbiBjb25kaXRpb24KKyAgICAgKiB0aGF0IGRpc2suZGF0YVBhcnRpdGlvbi5pbml0UGF0aCBpcyBlbXB0eS4gKi8KKyAgICBpbmlGaWxlX3NldFZhbHVlKGh3Y2ZnX2JrcCwgImRpc2suZGF0YVBhcnRpdGlvbi5pbml0UGF0aCIsICIiKTsKKworICAgIC8qIFNhdmUgYmFja3VwIGZpbGUuICovCisgICAgaWYgKCFpbmlGaWxlX3NhdmVUb0ZpbGVDbGVhbihod2NmZ19ia3AsIGJrcF9wYXRoKSkgeworICAgICAgICBEKCJIVyBjb25maWcgaGFzIGJlZW4gYmFja2VkIHVwIHRvICclcyciLCBia3BfcGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVHJlYXQgdGhpcyBhcyBhICJzb2Z0IiBlcnJvci4gWWVzLCB3ZSBjb3VsZG4ndCBzYXZlIHRoZSBiYWNrdXAsIGJ1dAorICAgICAgICAgKiB0aGlzIHNob3VsZCBub3QgY2FuY2VsIHNuYXBzaG90IHNhdmluZy4gKi8KKyAgICAgICAgVygiVW5hYmxlIHRvIHNhdmUgSFcgY29uZmlnIGZpbGUgJyVzJy4gRXJyb3I6ICVzIiwgYmtwX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorICAgIGluaUZpbGVfZnJlZShod2NmZ19ia3ApOworICAgIGZyZWUoYmtwX3BhdGgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NuYXBob3N0LWFuZHJvaWQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwaG9zdC1hbmRyb2lkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMjcwYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwaG9zdC1hbmRyb2lkLmgKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2luaS5oIgorCisvKiBNYXRjaGVzIEhXIGNvbmZpZyBzYXZlZCBmb3IgYSBWTSBzbmFwc2hvdCBhZ2FpbnN0IHRoZSBjdXJyZW50IEhXIGNvbmZpZy4KKyAqIFBhcmFtOgorICogIGh3X2luaSAtIENJbmlGaWxlIGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgSFcgY29uZmlnIHNldHRpbmdzLgorICogIG5hbWUgLSBOYW1lIG9mIHRoZSBzbmFwc2hvdCBmb3Igd2hpY2ggdGhlIFZNIGlzIGxvYWRpbmcuCisgKiBSZXR1cm46CisgKiAgQm9vbGVhbjogMSBpZiBIVyBjb25maWd1cmF0aW9ucyBtYXRjaCwgb3IgMCBpZiB0aGV5IGRvbid0IG1hdGNoLgorICovCitleHRlcm4gaW50IHNuYXBob3N0X21hdGNoX2NvbmZpZ3MoQ0luaUZpbGUqIGh3X2luaSwgY29uc3QgY2hhciogbmFtZSk7CisKKy8qIFNhdmVzIEhXIGNvbmZpZyBzZXR0aW5ncyBmb3IgdGhlIGN1cnJlbnQgVk0uCisgKiBQYXJhbToKKyAqICBuYW1lIC0gTmFtZSBvZiB0aGUgc25hcHNob3QgZm9yIHRoZSBjdXJyZW50IFZNLgorICovCitleHRlcm4gdm9pZCBzbmFwaG9zdF9zYXZlX2NvbmZpZyhjb25zdCBjaGFyKiBuYW1lKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwc2hvdC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NuYXBzaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjMmQxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwc2hvdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogTGltaXRlZCBkcml2ZXIgZm9yIHRoZSBRY293MiBmaWxlc3lzdGVtLCBjYXBhYmxlIG9mIGV4dHJhY3Rpbmcgc25hcHNob3QKKyAqIG1ldGFkYXRhIGZyb20gUWNvdzIgZm9ybWF0dGVkIGltYWdlIGZpbGUuCisgKgorICogU2ltaWxhciBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkIGluIGJsb2NrL3Fjb3cyLmMsIGJsb2NrL3Fjb3cyLXNuYXBzaG90LmMKKyAqIGFuZCBibG9jay5jLiBUaGlzIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uIHdhcyBtYWRlIHRvIGZ1cnRoZXIgZGVjb3VwbGUgdGhlIFVJCisgKiBvZiB0aGUgQW5kcm9pZCBlbXVsYXRvciBmcm9tIHRoZSB1bmRlcmx5aW5nIFFlbXUgc3lzdGVtLiBJdCBhbGxvd3MgdGhlIFVJIHRvCisgKiBzaG93IHNuYXBzaG90IGxpc3RpbmdzIHdpdGhvdXQgaGF2aW5nIHRvIGZhbGwgYmFjayBvbiBRZW11J3MgYmxvY2sgZHJpdmVyCisgKiBzeXN0ZW0sIHdoaWNoIHdvdWxkIHB1bGwgaW4gYSBsb3Qgb2YgY29kZSBpcnJlbGV2YW50IGZvciB0aGUgVUkuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvc25hcHNob3QuaCIKKworI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvV2luc29jay5oIgorI2Vsc2UKKyMgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKy8qICJNYWdpYyIgc2VxdWVuY2Ugb2YgZm91ciBieXRlcyByZXF1aXJlZCBieSBzcGVjIHRvIGJlIHRoZSBmaXJzdCBmb3VyIGJ5dGVzCisgKiBvZiBhbnkgUWNvdyBmaWxlLgorICovCisjZGVmaW5lIFFDT1dfTUFHSUMgKCgnUScgPDwgMjQpIHwgKCdGJyA8PCAxNikgfCAoJ0knIDw8IDgpIHwgMHhmYikKKyNkZWZpbmUgUUNPV19WRVJTSU9OIDIKKworLy8gY29udmVydHMgYSA2NC1iaXQgaW50ZWdlciBmcm9tIGJpZyBlbmRpYW4gdG8gYSBjdXJyZW50IGNwdSdzIGJ5dGUgb3JkZXIKK3N0YXRpYyB1aW50NjRfdCBudG9oNjQodWludDY0X3QgbikgeworICAgIC8vIHBsYXRmb3JtLWluZGVwZW5kZW50IGltcGxlbWVudGF0aW9uCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogY29uc3QgbnAgPSAodW5zaWduZWQgY2hhciopJm47CisKKyAgICByZXR1cm4gKCh1aW50NjRfdClucFswXSA8PCA1NikgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW5wWzFdIDw8IDQ4KSB8CisgICAgICAgICAgICgodWludDY0X3QpbnBbMl0gPDwgNDApIHwKKyAgICAgICAgICAgKCh1aW50NjRfdClucFszXSA8PCAzMikgfAorICAgICAgICAgICAoKHVpbnQ2NF90KW5wWzRdIDw8IDI0KSB8CisgICAgICAgICAgICgodWludDY0X3QpbnBbNV0gPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdClucFs2XSA8PCA4KSB8CisgICAgICAgICAgICh1aW50NjRfdClucFs3XTsKK30KKworLyogUmVhZHMgJ25ieXRlJyBieXRlcyBmcm9tICdmZCcgaW50byAnYnVmJywgcmV0cnlpbmcgb24gaW50ZXJydXB0cy4KKyAqIEV4aXQoKXMgaWYgdGhlIHJlYWQgZmFpbHMgZm9yIGFueSBvdGhlciByZWFzb24uCisgKi8KK3N0YXRpYyBpbnQKK3JlYWRfb3JfZGllKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGUpCit7CisgICAgaW50IHJldCA9IEhBTkRMRV9FSU5UUihyZWFkKGZkLCBidWYsIG5ieXRlKSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZGVycm9yKCJyZWFkIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBXcmFwcGVyIGFyb3VuZCBsc2VlaygpLCBleGl0KClzIG9uIGVycm9yLgorICovCitzdGF0aWMgb2ZmX3QKK3NlZWtfb3JfZGllKGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICAgIG9mZl90IHJldCA9IGxzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZGVycm9yKCJzZWVrIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKK3R5cGVkZWYgc3RydWN0IFNuYXBzaG90SW5mbyB7CisgICAgY2hhciAqaWRfc3RyOworICAgIGNoYXIgKm5hbWU7CisKKyAgICB1aW50MzJfdCBkYXRlX3NlYzsKKyAgICB1aW50MzJfdCBkYXRlX25zZWM7CisKKyAgICB1aW50NjRfdCB2bV9jbG9ja19uc2VjOworICAgIHVpbnQzMl90IHZtX3N0YXRlX3NpemU7Cit9IFNuYXBzaG90SW5mbzsKKworc3RhdGljIFNuYXBzaG90SW5mbyoKK3NuYXBzaG90X2luZm9fYWxsb2MoKQoreworICAgIHJldHVybiBhbmRyb2lkX2FsbG9jKHNpemVvZihTbmFwc2hvdEluZm8pKTsKK30KKworc3RhdGljIHZvaWQKK3NuYXBzaG90X2luZm9fZnJlZSggU25hcHNob3RJbmZvKiBpbmZvICkKK3sKKyAgICBBRlJFRShpbmZvLT5pZF9zdHIpOworICAgIEFGUkVFKGluZm8tPm5hbWUpOworICAgIEFGUkVFKGluZm8pOworfQorCisKKy8qIFJlYWRzIGEgc25hcHNob3QgcmVjb3JkIGZyb20gYSBxY293Mi1mb3JtYXR0ZWQgZmlsZS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGUgZmlsZSBwb3NpdGlvbiBvZiAnZmQnIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIFFjb3dTbmFwc2hvdEhlYWRlciByZWNvcmQuIFdoZW4gdGhlIGNhbGwgcmV0dXJucywgdGhlIGZpbGUgcG9zaXRpb24gb2YgZmQgaXMKKyAqIGF0IHRoZSBwbGFjZSB3aGVyZSB0aGUgbmV4dCBRY293U25hcHNob3RIZWFkZXIgc2hvdWxkIHN0YXJ0LCBpZiB0aGVyZSBpcyBvbmUuCisgKgorICogQy5mLiBRQ293U25hcHNob3RIZWFkZXIgaW4gYmxvY2svcWNvdzItc25hcHNob3QuYyBmb3IgdGhlIGNvbXBsZXRlIGxheW91dCBvZgorICogdGhlIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQKK3NuYXBzaG90X2luZm9fcmVhZCggaW50IGZkLCBTbmFwc2hvdEluZm8qIGluZm8gKQoreworICAgIHVpbnQ2NF90IHN0YXJ0X29mZnNldCA9IHNlZWtfb3JfZGllKGZkLCAwLCBTRUVLX0NVUik7CisKKyAgICB1aW50MzJfdCBleHRyYV9kYXRhX3NpemU7CisgICAgdWludDE2X3QgaWRfc3RyX3NpemUsIG5hbWVfc2l6ZTsKKworICAgIC8qIHJlYWQgZml4ZWQtbGVuZ3RoIGZpZWxkcyAqLworICAgIHNlZWtfb3JfZGllKGZkLCAxMiwgU0VFS19DVVIpOyAgLyogc2tpcCBsMSBpbmZvICovCisgICAgcmVhZF9vcl9kaWUoZmQsICZpZF9zdHJfc2l6ZSwgICAgICAgICBzaXplb2YoaWRfc3RyX3NpemUpKTsKKyAgICByZWFkX29yX2RpZShmZCwgJm5hbWVfc2l6ZSwgICAgICAgICAgIHNpemVvZihuYW1lX3NpemUpKTsKKyAgICByZWFkX29yX2RpZShmZCwgJmluZm8tPmRhdGVfc2VjLCAgICAgIHNpemVvZihpbmZvLT5kYXRlX3NlYykpOworICAgIHJlYWRfb3JfZGllKGZkLCAmaW5mby0+ZGF0ZV9uc2VjLCAgICAgc2l6ZW9mKGluZm8tPmRhdGVfbnNlYykpOworICAgIHJlYWRfb3JfZGllKGZkLCAmaW5mby0+dm1fY2xvY2tfbnNlYywgc2l6ZW9mKGluZm8tPnZtX2Nsb2NrX25zZWMpKTsKKyAgICByZWFkX29yX2RpZShmZCwgJmluZm8tPnZtX3N0YXRlX3NpemUsIHNpemVvZihpbmZvLT52bV9zdGF0ZV9zaXplKSk7CisgICAgcmVhZF9vcl9kaWUoZmQsICZleHRyYV9kYXRhX3NpemUsICAgICBzaXplb2YoZXh0cmFfZGF0YV9zaXplKSk7CisKKyAgICAvKiBjb252ZXJ0IHRvIGhvc3QgZW5kaWFubmVzcyAqLworICAgIGlkX3N0cl9zaXplID0gbnRvaHMoaWRfc3RyX3NpemUpOworICAgIG5hbWVfc2l6ZSA9IG50b2hzKG5hbWVfc2l6ZSk7CisgICAgaW5mby0+ZGF0ZV9zZWMgPSBudG9obChpbmZvLT5kYXRlX3NlYyk7CisgICAgaW5mby0+ZGF0ZV9uc2VjID0gbnRvaGwoaW5mby0+ZGF0ZV9uc2VjKTsKKyAgICBpbmZvLT52bV9jbG9ja19uc2VjID0gbnRvaDY0KGluZm8tPnZtX2Nsb2NrX25zZWMpOworICAgIGluZm8tPnZtX3N0YXRlX3NpemUgPSBudG9obChpbmZvLT52bV9zdGF0ZV9zaXplKTsKKyAgICBleHRyYV9kYXRhX3NpemUgPSBudG9obChleHRyYV9kYXRhX3NpemUpOworICAgIGV4dHJhX2RhdGFfc2l6ZSA9IG50b2hsKGV4dHJhX2RhdGFfc2l6ZSk7CisKKyAgICAvKiByZWFkIHZhcmlhYmxlLWxlbmd0aCBidWZmZXJzKi8KKyAgICBpbmZvLT5pZF9zdHIgPSBhbmRyb2lkX2FsbG9jKGlkX3N0cl9zaXplICsgMSk7IC8vICsxOiBtYW51YWwgbnVsbC10ZXJtaW5hdGlvbgorICAgIGluZm8tPm5hbWUgICA9IGFuZHJvaWRfYWxsb2MobmFtZV9zaXplICsgMSk7CisgICAgc2Vla19vcl9kaWUoZmQsIGV4dHJhX2RhdGFfc2l6ZSwgU0VFS19DVVIpOyAgLyogc2tpcCBleHRyYSBkYXRhICovCisgICAgcmVhZF9vcl9kaWUoZmQsIGluZm8tPmlkX3N0ciwgaWRfc3RyX3NpemUpOworICAgIHJlYWRfb3JfZGllKGZkLCBpbmZvLT5uYW1lLCBuYW1lX3NpemUpOworCisgICAgaW5mby0+aWRfc3RyW2lkX3N0cl9zaXplXSA9ICdcMCc7CisgICAgaW5mby0+bmFtZVtuYW1lX3NpemVdID0gJ1wwJzsKKworICAgIC8qIGhlYWRlcnMgYXJlIDggYnl0ZSBhbGlnbmVkLCBjZWlsIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgOCAqLworICAgIHVpbnQ2NF90IGVuZF9vZmZzZXQgICA9IHNlZWtfb3JfZGllKGZkLCAwLCBTRUVLX0NVUik7CisgICAgdWludDMyX3QgdG90YWxfc2l6ZSAgID0gZW5kX29mZnNldCAtIHN0YXJ0X29mZnNldDsKKyAgICB1aW50MzJfdCBhbGlnbmVkX3NpemUgPSAoKHRvdGFsX3NpemUgLSAxKSAvIDggKyAxKSAqIDg7CisKKyAgICAvKiBza2lwIHRvIHN0YXJ0IG9mIG5leHQgcmVjb3JkICovCisgICAgc2Vla19vcl9kaWUoZmQsIHN0YXJ0X29mZnNldCArIGFsaWduZWRfc2l6ZSwgU0VFS19TRVQpOworfQorCisKKyNkZWZpbmUgTkJfU1VGRklYRVMgNAorCisvKiBSZXR1cm5zIHRoZSBzaXplIG9mIGEgc25hcHNob3QgaW4gYSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBjb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKi8KK3N0YXRpYyBjaGFyKgorc25hcHNob3RfZm9ybWF0X3NpemUoIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQ2NF90IHNpemUgKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyIHN1ZmZpeGVzW05CX1NVRkZJWEVTXSA9ICJLTUdUIjsKKyAgICBpbnQ2NF90IGJhc2U7CisgICAgaW50IGk7CisKKyAgICBpZiAoc2l6ZSA8PSA5OTkpIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiUiIFBSSWQ2NCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmFzZSA9IDEwMjQ7CisgICAgICAgIGZvcihpID0gMDsgaSA8IE5CX1NVRkZJWEVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaXplIDwgKDEwICogYmFzZSkpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJTAuMWYlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlzaXplIC8gYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAoMTAwMCAqIGJhc2UpIHx8IGkgPT0gKE5CX1NVRkZJWEVTIC0gMSkpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJSIgUFJJZDY0ICIlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKChzaXplICsgKGJhc2UgPj4gMSkpIC8gYmFzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXNbaV0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmFzZSA9IGJhc2UgKiAxMDI0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBjaGFyKgorc25hcHNob3RfZm9ybWF0X2NyZWF0ZV9kYXRlKCBjaGFyICpidWYsIHNpemVfdCBidWZfc2l6ZSwgdGltZV90ICp0aW1lICkKK3sKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIHRtID0gbG9jYWx0aW1lKHRpbWUpOworICAgIGlmICghdG0pIHsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIjxpbnZhbGlkLXNuYXBzaG90LWRhdGU+Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZnRpbWUoYnVmLCBidWZfc2l6ZSwgIiVZLSVtLSVkICVIOiVNOiVTIiwgdG0pOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhcioKK3NuYXBzaG90X2Zvcm1hdF92bV9jbG9jayggY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIHVpbnQ2NF90IHZtX2Nsb2NrX25zZWMgKQoreworICAgIHVpbnQ2NF90IHNlY3MgPSB2bV9jbG9ja19uc2VjIC8gMTAwMDAwMDAwMDsKKyAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJTAyZDolMDJkOiUwMmQuJTAzZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoc2VjcyAvIDM2MDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChzZWNzIC8gNjApICUgNjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHNlY3MgJSA2MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKHZtX2Nsb2NrX25zZWMgLyAxMDAwMDAwKSAlIDEwMDApKTsKKyAgICByZXR1cm4gYnVmOworfQorCisvKiBQcmludHMgYSByb3cgb2YgdGhlIHNuYXBzaG90IHRhYmxlIHRvIHN0ZG91dC4gKi8KK3N0YXRpYyB2b2lkCitzbmFwc2hvdF9pbmZvX3ByaW50KCBTbmFwc2hvdEluZm8gKmluZm8gKQoreworICAgIGNoYXIgc2l6ZV9idWZbOF07CisgICAgY2hhciBkYXRlX2J1ZlsyMV07CisgICAgY2hhciBjbG9ja19idWZbMjFdOworCisgICAgLy8gTm90ZTogdGltZV90IG1pZ2h0IGJlIGxhcmdlciB0aGFuIHVpbnQzMl90LgorICAgIHRpbWVfdCBkYXRlX3NlYyA9IGluZm8tPmRhdGVfc2VjOworCisgICAgc25hcHNob3RfZm9ybWF0X3NpemUoc2l6ZV9idWYsIHNpemVvZihzaXplX2J1ZiksIGluZm8tPnZtX3N0YXRlX3NpemUpOworICAgIHNuYXBzaG90X2Zvcm1hdF9jcmVhdGVfZGF0ZShkYXRlX2J1Ziwgc2l6ZW9mKGRhdGVfYnVmKSwgJmRhdGVfc2VjKTsKKyAgICBzbmFwc2hvdF9mb3JtYXRfdm1fY2xvY2soY2xvY2tfYnVmLCBzaXplb2YoY2xvY2tfYnVmKSwgaW5mby0+dm1fY2xvY2tfbnNlYyk7CisKKyAgICBwcmludGYoIiAlLTEwcyUtMjBzJTdzJTIwcyUxNXNcbiIsCisgICAgICAgICAgIGluZm8tPmlkX3N0ciwgaW5mby0+bmFtZSwgc2l6ZV9idWYsIGRhdGVfYnVmLCBjbG9ja19idWYpOworfQorCisvKiBQcmludHMgdGFibGUgb2YgYWxsIHNuYXBzaG90cyByZWNvcmRlZCBpbiB0aGUgZmlsZSAnZmQnLgorICovCitzdGF0aWMgdm9pZAorc25hcHNob3RfcHJpbnRfdGFibGUoIGludCBmZCwgdWludDMyX3QgbmJfc25hcHNob3RzLCB1aW50NjRfdCBzbmFwc2hvdHNfb2Zmc2V0ICkKK3sKKyAgICBwcmludGYoIiAlLTEwcyUtMjBzJTdzJTIwcyUxNXNcbiIsCisgICAgICAgICAgICJJRCIsICJUQUciLCAiVk0gU0laRSIsICJEQVRFIiwgIlZNIENMT0NLIik7CisKKyAgICAvKiBza2lwIGFoZWFkIHRvIHNuYXBzaG90IGRhdGEgKi8KKyAgICBzZWVrX29yX2RpZShmZCwgc25hcHNob3RzX29mZnNldCwgU0VFS19TRVQpOworCisgICAgLyogaXRlcmF0ZSBvdmVyIHNuYXBzaG90IHJlY29yZHMgKi8KKyAgICB1aW50MzJfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBTbmFwc2hvdEluZm8gKmluZm8gPSBzbmFwc2hvdF9pbmZvX2FsbG9jKCk7CisgICAgICAgIHNuYXBzaG90X2luZm9fcmVhZChmZCwgaW5mbyk7CisgICAgICAgIHNuYXBzaG90X2luZm9fcHJpbnQoaW5mbyk7CisKKyAgICAgICAgc25hcHNob3RfaW5mb19mcmVlKGluZm8pOworICAgIH0KK30KKworLyogVmFsaWRhdGVzIHRoYXQgJ2ZkJyBzdGFydHMgd2l0aCBhIGNvcnJlY3QgUWNvdyAyIGhlYWRlci4gUHJpbnRzIGFuIGVycm9yIGFuZAorICogZXhpdCgpcyBpZiB2YWxpZGF0aW9uIGZhaWxzLgorICovCitzdGF0aWMgdm9pZAorc25hcHNob3RfdmFsaWRhdGVfcWNvd19maWxlKCBpbnQgZmQgKQoreworICAgIC8qIHJlYWQgbWFnaWMgbnVtYmVyIGFuZCBxY293IHZlcnNpb24gKDJ4NCBieXRlcykgKi8KKyAgICB1aW50MzJfdCBtYWdpYywgdmVyc2lvbjsKKyAgICByZWFkX29yX2RpZShmZCwgJm1hZ2ljLCBzaXplb2YobWFnaWMpKTsKKyAgICByZWFkX29yX2RpZShmZCwgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpYyk7CisgICAgdmVyc2lvbiA9IG50b2hsKHZlcnNpb24pOworCisgICAgaWYgKG1hZ2ljICE9IFFDT1dfTUFHSUMpIHsKKyAgICAgICAgZGVycm9yKCJOb3QgYSB2YWxpZCBRY293IHNuYXBzaG90IGZpbGUgKGV4cGVjdGVkIG1hZ2ljIHZhbHVlICclMDh4JywgZ290ICclMDh4JykuIiwKKyAgICAgICAgICAgICAgIFFDT1dfTUFHSUMsIG1hZ2ljKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgaWYgKHZlcnNpb24gIT0gUUNPV19WRVJTSU9OKSB7CisgICAgICAgIGRlcnJvcigiVW5zdXBwb3J0ZWQgUWNvdyB2ZXJzaW9uIChuZWVkICVkLCBnb3QgJWQpLiIsCisgICAgICAgICAgICAgICBRQ09XX1ZFUlNJT04sIHZlcnNpb24pOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworLyogUmVhZHMgc25hcHNob3QgaW5mb3JtYXRpb24gZnJvbSBhIFFjb3cyIGZpbGUgaGVhZGVyLgorICoKKyAqIEMuZi4gUUNvd0hlYWRlciBpbiBibG9jay9xY293Mi5oIGZvciBhbiBleGFjdCBsaXN0aW5nIG9mIHRoZSBoZWFkZXIKKyAqIGNvbnRlbnRzLgorICovCitzdGF0aWMgdm9pZAorc25hcHNob3RfcmVhZF9xY293X2hlYWRlciggaW50IGZkLCB1aW50MzJfdCAqbmJfc25hcHNob3RzLCB1aW50NjRfdCAqc25hcHNob3RzX29mZnNldCApCit7CisgICAgc25hcHNob3RfdmFsaWRhdGVfcWNvd19maWxlKGZkKTsKKworICAgIC8qIHNraXAgbm9uLXNuYXBzaG90IHJlbGF0ZWQgbWV0YWRhdGEgKDR4OCArIDV4NCA9IDUyIGJ5dGVzKSovCisgICAgc2Vla19vcl9kaWUoZmQsIDUyLCBTRUVLX0NVUik7CisKKyAgICByZWFkX29yX2RpZShmZCwgbmJfc25hcHNob3RzLCBzaXplb2YoKm5iX3NuYXBzaG90cykpOworICAgIHJlYWRfb3JfZGllKGZkLCBzbmFwc2hvdHNfb2Zmc2V0LCBzaXplb2YoKnNuYXBzaG90c19vZmZzZXQpKTsKKworICAgIC8qIGNvbnZlcnQgdG8gaG9zdCBlbmRpYW5uZXNzICovCisgICAgKm5iX3NuYXBzaG90cyA9IG50b2hsKCpuYl9zbmFwc2hvdHMpOworICAgICpzbmFwc2hvdHNfb2Zmc2V0ID0gbnRvaDY0KCpzbmFwc2hvdHNfb2Zmc2V0KTsKK30KKworLyogUHJpbnRzIGEgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUgc25hcHNob3RzIGluIHRoZSBxY293Mi1mb3JtYXR0ZWQgZmlsZQorICogJ3NuYXBzdG9yYWdlJywgdGhlbiBleGl0KClzLgorICovCit2b2lkCitzbmFwc2hvdF9wcmludChjb25zdCBjaGFyICpzbmFwc3RvcmFnZSkKK3sKKyAgICAvKiBvcGVuIHNuYXBzaG90IGZpbGUgKi8KKyAgICBpbnQgZmQgPSBvcGVuKHNuYXBzdG9yYWdlLCBPX1JET05MWSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBkZXJyb3IoIkNvdWxkIG5vdCBvcGVuIHNuYXBzaG90IGZpbGUgJyVzJzogJXMiLCBzbmFwc3RvcmFnZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiByZWFkIHNuYXBzaG90IGluZm8gZnJvbSBmaWxlIGhlYWRlciAqLworICAgIHVpbnQzMl90IG5iX3NuYXBzaG90czsKKyAgICB1aW50NjRfdCBzbmFwc2hvdHNfb2Zmc2V0OworICAgIHNuYXBzaG90X3JlYWRfcWNvd19oZWFkZXIoZmQsICZuYl9zbmFwc2hvdHMsICZzbmFwc2hvdHNfb2Zmc2V0KTsKKworICAgIGlmIChuYl9zbmFwc2hvdHMgPiAwKSB7CisgICAgICAgIHByaW50ZigiU25hcHNob3RzIGluIGZpbGUgJyVzJzpcbiIsIHNuYXBzdG9yYWdlKTsKKyAgICAgICAgc25hcHNob3RfcHJpbnRfdGFibGUoZmQsIG5iX3NuYXBzaG90cywgc25hcHNob3RzX29mZnNldCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludGYoIkZpbGUgJyVzJyBjb250YWlucyBubyBzbmFwc2hvdHMgeWV0LlxuIiwgc25hcHN0b3JhZ2UpOworICAgIH0KKworICAgIGNsb3NlKGZkKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwc2hvdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3NuYXBzaG90LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FmMjVlYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9zbmFwc2hvdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImNvbmZpZy9jb25maWcuaCIKKworLyogUHJpbnRzIGEgdGFibGUgd2l0aCBpbmZvcm1hdGlvbiBvbiB0aGUgc25hcHNob3Qgc3RvcmVkIGluIHRoZSBmaWxlCisgKiAnc25hcHN0b3JhZ2UnLgorICovCit2b2lkIHNuYXBzaG90X3ByaW50KGNvbnN0IGNoYXIgKnNuYXBzdG9yYWdlKTsKKworCitleHRlcm4gaW50IGFuZHJvaWRfc25hcHNob3RfdXBkYXRlX3RpbWU7CitleHRlcm4gaW50IGFuZHJvaWRfc25hcHNob3RfdXBkYXRlX3RpbWVfcmVxdWVzdDsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90Y3BkdW1wLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGNwZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjNkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGNwZHVtcC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaWZuZGVmIF9RRU1VX1RDUERVTVBfSAorI2RlZmluZSBfUUVNVV9UQ1BEVU1QX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBnbG9iYWwgZmxhZywgc2V0IHRvIDEgd2hlbiBwYWNrZXQgY2FwdHVwZSBpcyBhY3RpdmUgKi8KK2V4dGVybiBpbnQgIHFlbXVfdGNwZHVtcF9hY3RpdmU7CisKKy8qIHN0YXJ0IGEgbmV3IHBhY2tldCBjYXB0dXJlLCBjbG9zZSB0aGUgY3VycmVudCBvbmUgaWYgYW55LgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbiBmYWlsdXJlIChzZWUgZXJybm8gdGhlbikgKi8KK2V4dGVybiBpbnQgIHFlbXVfdGNwZHVtcF9zdGFydCggY29uc3QgY2hhciogIGZpbGVwYXRoICk7CisKKy8qIHN0b3AgdGhlIGN1cnJlbnQgcGFja2V0IGNhcHR1cmUsIGlmIGFueSAqLworZXh0ZXJuIHZvaWQgcWVtdV90Y3BkdW1wX3N0b3AoIHZvaWQgKTsKKworLyogc2VuZCBhbiBldGhlcm5ldCBwYWNrZXQgdG8gdGhlIHBhY2tldCBjYXB0dXJlIGZpbGUsIGlmIGFueSAqLworZXh0ZXJuIHZvaWQgcWVtdV90Y3BkdW1wX3BhY2tldCggY29uc3Qgdm9pZCogIGJhc2UsIGludCAgbGVuICk7CisKKy8qIHJldHVybnMgaW50ZXJlc3Rpbmcgc3RhdHMsIGxpa2UgdGhlIG51bWJlciBvZiBwYWNrZXRzIGNhcHR1cmVzLAorICogYW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZXNlIHBhY2tldHMuIE5vdGU6IHRoZSBmaWxlIHdpbGwgYmUgbGFyZ2VyCisgKiBkdWUgdG8gZ2xvYmFsIGFuZCBwYWNrZXQgaGVhZGVycy4KKyAqLworZXh0ZXJuIHZvaWQgIHFlbXVfdGNwZHVtcF9zdGF0cyggdWludDY0X3QgICpwY291bnQsIHVpbnQ2NF90KiAgcHNpemUgKTsKKworI2VuZGlmIC8qIF9RRU1VX1RDUERVTVBfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9TaW1BY2Nlc3NSdWxlcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L1NpbUFjY2Vzc1J1bGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2E5NmEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9TaW1BY2Nlc3NSdWxlcy5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJzaW1fYWNjZXNzX3J1bGVzLmgiCisKKyNpbmNsdWRlICJUYWdMZW5ndGhWYWx1ZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhpcyBpcyB0aGUgaGFzaCBvZiB0aGUgY2VydGlmaWNhdGUgdXNlZCB0byBzaWduIHRoZSBDVFMgdGVzdCBhcHAgZm9yIHRoaXMKKy8vIGZlYXR1cmUuIFRoZSBQZXJtQXJEbyBpcyBhIHNldCBvZiBwZXJtaXNzaW9uIGJpdHMgdGhhdCBhcmUgY3VycmVudGx5IGlnbm9yZWQuCisvLyBUaGUgc3BlY2lmaWNhdGlvbiBhdCBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL3RlY2gvY29uZmlnL3VpY2MuaHRtbAorLy8gbWVudGlvbnMgdGhhdCB0aGUgZmllbGQgaXMgcmVxdWlyZWQgYnV0IGRvZXNuJ3QgbWVudGlvbiB3aGF0IGl0IHNob3VsZAorLy8gY29udGFpbi4gVGhlIHBsYXRmb3JtIGNvZGUgKGFzIG9mIHRoaXMgd3JpdGluZykgcmVhZHMgdGhlIHZhbHVlIGJ1dCBkb2Vzbid0CisvLyBkbyBhbnl0aGluZyB3aXRoIGl0Lgorc3RhdGljIEFsbFJlZkFyRG8ga0N0c0FwcENlcnRpZmljYXRlSGFzaCB7CisgICAgUmVmQXJEbyB7CisgICAgICAgIFJlZkRvIHsKKyAgICAgICAgICAgIERldmljZUFwcElkUmVmRG8geyAiNjFlZDM3N2U4NWQzODZhOGRmZWU2Yjg2NGJkODViMGJmYWE1YWY4MSIgfSwKKyAgICAgICAgICAgIFBrZ1JlZkRvIHsgImFuZHJvaWQuY2FycmllcmFwaS5jdHMiIH0KKyAgICAgICAgfSwKKyAgICAgICAgQXJEbyB7CisgICAgICAgICAgICBQZXJtQXJEbyB7ICIwMDAwMDAwMDAwMDAwMDAwIiB9CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBNYXAgREYgbmFtZSAoYWxzbyBrbm93biBhcyBBcHBsaWNhdGlvbiBJRCwgQUlEKSB0byBhIHNldCBvZiBhY2Nlc3MgcnVsZXMKK3N0YXRpYyBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEFsbFJlZkFyRG8+IGtBY2Nlc3NSdWxlcyA9IHsKKyAgICB7ICJBMDAwMDAwMTUxNDE0MzRDMDAiLCBrQ3RzQXBwQ2VydGlmaWNhdGVIYXNoIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIKK2NvbnN0IGNoYXIqIHNpbV9nZXRfYWNjZXNzX3J1bGVzKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBhdXRvIHJ1bGUgPSBhbmRyb2lkOjprQWNjZXNzUnVsZXMuZmluZChuYW1lKTsKKyAgICBpZiAocnVsZSAhPSBhbmRyb2lkOjprQWNjZXNzUnVsZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHJ1bGUtPnNlY29uZC5jX3N0cigpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvVGFnTGVuZ3RoVmFsdWUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzOGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvVGFnTGVuZ3RoVmFsdWUuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgIlRhZ0xlbmd0aFZhbHVlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRoZSBtYXhpbXVtIHNpemUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gb25lIHNpemUgYnl0ZSwgaWYgdGhlIHNpemUgdmFsdWUKKy8vIGlzIGxlc3MgdGhhbiB0aGlzIGNvbnN0YW50IHRoZW4gdGhhdCdzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YS4gaWYgdGhlCisvLyBkYXRhIGlzIGxhcmdlciB0aGFuIHRoaXMgdGhlbiB0aGUgdmFsdWUgc3RvcmVkIG1pbnVzIHRoaXMgY29uc3RhbnQgd2lsbCBiZQorLy8gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBzaXplLiBTbyBpZiB0aGUgdmFsdWUgaXMgMHg4NAorLy8gdGhlbiA0IGJ5dGVzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBzaXplLiBIZXJlIGFyZSBhIGZldyBleGFtcGxlczoKKy8vIFNpemU6IDB4NzAsICAgIFN0cmluZzogIjcwIgorLy8gU2l6ZTogMHg4MCwgICAgU3RyaW5nOiAiODAiCisvLyBTaXplOiAweDgxLCAgICBTdHJpbmc6ICI4MTgxIiAgICAgLS0gRmlyc3QgODEgaW5kaWNhdGVzIDEgYnl0ZSBuZWVkZWQgKDgxLTgwKQorLy8gU2l6ZTogMHgyMWYzLCAgU3RyaW5nOiAiODIyMWYzIiAgIC0tIDgyIGluZGljYXRlcyAyIGJ5dGVzIG5lZWRlZAorLy8gU2l6ZTogMHgxMjM0NSwgU3RyaW5nOiAiODMwMTIzNDUiIC0tIDgzIGluZGljYXRlcyAzIGJ5dGVzIG5lZWRlZCwgemVybyBwYWRkZWQKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4U2luZ2xlQnl0ZVNpemUgPSAweDgwOworCisvLyBDb252ZXJ0IGEgcGxhaW4gc3RyaW5nIHRvIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlCisvLyB2YWx1ZSBvZiBlYWNoIGNoYXJhY3RlciBvZiB0aGUgcGxhaW4gc3RyaW5nLiBGb3IgZXhhbXBsZSB0aGUgc3RyaW5nICJGT08iCisvLyB3aWxsIGJlIGNvbnZlcnRlZCB0byAiNDY0RjRGIi4KK3N0YXRpYyBzdGQ6OnN0cmluZyBzdHJpbmdUb0hleFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0KHN0ci5zaXplKCkgKiAyLCAnMCcpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgICAgIGludDJoZXgocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnJlc3VsdFtpICogMl0pLCAyLCBzdHJbaV0pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFRhZ0xlbmd0aFZhbHVlOjpwb3B1bGF0ZURhdGEoY29uc3QgY2hhciogdGFnLAorICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8Y29uc3QgVGFnTGVuZ3RoVmFsdWUqPiBkYXRhKSB7CisgICAgcG9wdWxhdGVEYXRhKHRhZywgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK3ZvaWQgVGFnTGVuZ3RoVmFsdWU6OnBvcHVsYXRlRGF0YShjb25zdCBjaGFyKiB0YWcsCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBUKj4gZGF0YSkgeworICAgIHBvcHVsYXRlRGF0YSh0YWcsIGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIFRhZ0xlbmd0aFZhbHVlOjpwb3B1bGF0ZURhdGEoY29uc3QgY2hhciogdGFnLCBUIGJlZ2luLCBUIGVuZCkgeworICAgIHNpemVfdCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgZm9yIChhdXRvIG9iamVjdCA9IGJlZ2luOyBvYmplY3QgIT0gZW5kOyArK29iamVjdCkgeworICAgICAgICBwYXlsb2FkU2l6ZSArPSAoKm9iamVjdCktPnNpemUoKTsKKyAgICB9CisgICAgc2l6ZV90IHRhZ0xlbmd0aCA9IHRhZyA/IHN0cmxlbih0YWcpIDogMDsKKyAgICAvLyBVc2UgaGFsZiB0aGUgc2l6ZSBiZWNhdXNlIGl0J3Mgbm90IHRoZSBzaXplIGluIGNoYXJhY3RlcnMgYnV0IGluCisgICAgLy8gYnl0ZXMuIEVhY2ggYnl0ZSBpcyByZXByZXNlbnRlZCBieSB0d28gY2hhcmFjdGVycworICAgIHN0ZDo6c3RyaW5nIHNpemVTdHJpbmcgPSBjcmVhdGVTaXplU3RyaW5nKHBheWxvYWRTaXplIC8gMik7CisgICAgbURhdGEucmVzaXplKHRhZ0xlbmd0aCArIHNpemVTdHJpbmcuc2l6ZSgpICsgcGF5bG9hZFNpemUpOworICAgIGlmICh0YWcgJiYgdGFnTGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkoJm1EYXRhWzBdLCB0YWcsIHRhZ0xlbmd0aCk7CisgICAgfQorICAgIG1lbWNweSgmbURhdGFbdGFnTGVuZ3RoXSwgc2l6ZVN0cmluZy5jX3N0cigpLCBzaXplU3RyaW5nLnNpemUoKSk7CisgICAgc2l6ZV90IG9mZnNldCA9IHRhZ0xlbmd0aCArIHNpemVTdHJpbmcuc2l6ZSgpOworCisgICAgZm9yIChhdXRvIG9iamVjdCA9IGJlZ2luOyBvYmplY3QgIT0gZW5kOyArK29iamVjdCkgeworICAgICAgICBzaXplX3Qgb2JqZWN0U2l6ZSA9ICgqb2JqZWN0KS0+c2l6ZSgpOworICAgICAgICBtZW1jcHkoJm1EYXRhW29mZnNldF0sICgqb2JqZWN0KS0+Y19zdHIoKSwgb2JqZWN0U2l6ZSk7CisgICAgICAgIG9mZnNldCArPSBvYmplY3RTaXplOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgVGFnTGVuZ3RoVmFsdWU6OmNyZWF0ZVNpemVTdHJpbmcoc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICBjaGFyIHNpemVTdHJpbmdbMTZdOworICAgIGlmIChzaXplIDw9IGtNYXhTaW5nbGVCeXRlU2l6ZSkgeworICAgICAgICBzbnByaW50ZihzaXplU3RyaW5nLCBzaXplb2Yoc2l6ZVN0cmluZyksICIlMDJ4IiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUpKTsKKyAgICAgICAgcmV0dXJuIHNpemVTdHJpbmc7CisgICAgfQorICAgIC8vIFNpemVzIGxhcmdlciB0aGFuIDB4ODAgcmVxdWlyZSBzaXplIGxlbmd0aCBzcGVjaWZpZXIgZm9sbG93ZWQgYnkgc2l6ZQorICAgIGZvciAodWludDMyX3QgbnVtQnl0ZXMgPSAxOyBudW1CeXRlcyA8PSA0OyArK251bUJ5dGVzKSB7CisgICAgICAgIGlmIChzaXplIDwgKDFVTEwgPDwgKG51bUJ5dGVzICogOCkpKSB7CisgICAgICAgICAgICAvLyBUaGUgc2l6ZSByZXF1aXJlcyBudW1CeXRlcyBieXRlKHMpIG9mIHN0b3JhZ2UsIGVhY2ggYnl0ZSB0YWtlcworICAgICAgICAgICAgLy8gdHdvIGNoYXJhY3RlcnMgb2Ygc3BhY2UgaW4gYSBzdHJpbmcgaW4gaGV4IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICAgc25wcmludGYoc2l6ZVN0cmluZywgc2l6ZW9mKHNpemVTdHJpbmcpLCAiJTAyeCUwKngiLAorICAgICAgICAgICAgICAgICAgICAga01heFNpbmdsZUJ5dGVTaXplICsgbnVtQnl0ZXMsIDIgKiBudW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplKSk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZVN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoZmFsc2UpOworICAgIHNpemVTdHJpbmdbMF0gPSAnXDAnOworICAgIHJldHVybiBzaXplU3RyaW5nOworfQorCitjb25zdCBjaGFyIEFpZFJlZkRvOjprVGFnW10gPSAiNEYiOworY29uc3QgY2hhciBQa2dSZWZEbzo6a1RhZ1tdID0gIkNBIjsKK2NvbnN0IGNoYXIgRGV2aWNlQXBwSWRSZWZEbzo6a1RhZ1tdID0gIkMxIjsKK2NvbnN0IGNoYXIgUmVmRG86OmtUYWdbXSA9ICJFMSI7Citjb25zdCBjaGFyIEFwZHVBckRvOjprVGFnW10gPSAiRDAiOworY29uc3QgY2hhciBOZmNBckRvOjprVGFnW10gPSAiRDEiOworY29uc3QgY2hhciBQZXJtQXJEbzo6a1RhZ1tdID0gIkRCIjsKK2NvbnN0IGNoYXIgQXJEbzo6a1RhZ1tdID0gIkUzIjsKK2NvbnN0IGNoYXIgUmVmQXJEbzo6a1RhZ1tdID0gIkUyIjsKK2NvbnN0IGNoYXIgQWxsUmVmQXJEbzo6a1RhZ1tdID0gIkZGNDAiOworCitQa2dSZWZEbzo6UGtnUmVmRG8oY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2VOYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgaGV4UGFja2FnZU5hbWUgPSBzdHJpbmdUb0hleFN0cmluZyhwYWNrYWdlTmFtZSk7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJmhleFBhY2thZ2VOYW1lIH0pOworfQorCitEZXZpY2VBcHBJZFJlZkRvOjpEZXZpY2VBcHBJZFJlZkRvKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdEYXRhKSB7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJnN0cmluZ0RhdGEgfSk7Cit9CisKK1JlZkRvOjpSZWZEbyhjb25zdCBEZXZpY2VBcHBJZFJlZkRvJiBkZXZpY2VBcHBJZFJlZkRvKSB7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJmRldmljZUFwcElkUmVmRG8gfSk7Cit9CisKK1JlZkRvOjpSZWZEbyhjb25zdCBBaWRSZWZEbyYgYWlkUmVmRG8sCisgICAgICAgICAgICAgY29uc3QgRGV2aWNlQXBwSWRSZWZEbyYgZGV2aWNlQXBwSWRSZWZEbykgeworICAgIHBvcHVsYXRlRGF0YShrVGFnLCB7ICZhaWRSZWZEbywgJmRldmljZUFwcElkUmVmRG8gfSk7Cit9CisKK1JlZkRvOjpSZWZEbyhjb25zdCBEZXZpY2VBcHBJZFJlZkRvJiBkZXZpY2VBcHBJZFJlZkRvLAorICAgICAgICAgICAgIGNvbnN0IFBrZ1JlZkRvJiBwa2dSZWZEbykgeworICAgIHBvcHVsYXRlRGF0YShrVGFnLCB7ICZkZXZpY2VBcHBJZFJlZkRvLCAmcGtnUmVmRG8gfSk7Cit9CisKK0FwZHVBckRvOjpBcGR1QXJEbyhBbGxvdyBydWxlKSB7CisgICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgZGF0YSBwbHVzIE5VTEwsIHRoZW4gcmVzaXplIGRvd24gdG8gMiB0bworICAgIC8vIGF2b2lkIG1vZGlmeWluZyB0aGUgdGVybWluYXRpbmcgTlVMTCAod2hpY2ggaXMgdW5kZWZpbmVkIGJlaGF2aW9yKQorICAgIHN0ZDo6c3RyaW5nIGRhdGEoMywgJzAnKTsKKyAgICBzbnByaW50ZigmZGF0YVswXSwgZGF0YS5zaXplKCksICIlMDJ4Iiwgc3RhdGljX2Nhc3Q8aW50PihydWxlKSk7CisgICAgZGF0YS5yZXNpemUoMik7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJmRhdGEgfSk7Cit9CisKK0FwZHVBckRvOjpBcGR1QXJEbyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpzdHJpbmc+IHJ1bGVzKSB7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3Qgc3RkOjpzdHJpbmcqPiBkYXRhOworICAgIGZvcihjb25zdCBhdXRvJiBydWxlIDogcnVsZXMpIHsKKyAgICAgICAgZGF0YS5wdXNoX2JhY2soJnJ1bGUpOworICAgIH0KKyAgICBwb3B1bGF0ZURhdGEoa1RhZywgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKK30KKworTmZjQXJEbzo6TmZjQXJEbyhBbGxvdyBydWxlKSB7CisgICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciB0aGUgZGF0YSBwbHVzIE5VTEwsIHRoZW4gcmVzaXplIGRvd24gdG8gMiB0bworICAgIC8vIGF2b2lkIG1vZGlmeWluZyB0aGUgdGVybWluYXRpbmcgTlVMTCAod2hpY2ggaXMgdW5kZWZpbmVkIGJlaGF2aW9yKQorICAgIHN0ZDo6c3RyaW5nIGRhdGEoMywgJzAnKTsKKyAgICBzbnByaW50ZigmZGF0YVswXSwgZGF0YS5zaXplKCksICIlMDJ4Iiwgc3RhdGljX2Nhc3Q8aW50PihydWxlKSk7CisgICAgZGF0YS5yZXNpemUoMik7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJmRhdGEgfSk7Cit9CisKK1Blcm1BckRvOjpQZXJtQXJEbyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyaW5nRGF0YSkgeworICAgIHBvcHVsYXRlRGF0YShrVGFnLCB7ICZzdHJpbmdEYXRhIH0pOworfQorCitBckRvOjpBckRvKGNvbnN0IEFwZHVBckRvJiBhcGR1QXJEbykgeworICAgIHBvcHVsYXRlRGF0YShrVGFnLCB7ICZhcGR1QXJEbyB9KTsKK30KKworQXJEbzo6QXJEbyhjb25zdCBOZmNBckRvJiBuZmNBckRvKSB7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJm5mY0FyRG8gfSk7Cit9CisKK0FyRG86OkFyRG8oY29uc3QgUGVybUFyRG8mIHBlcm1BckRvKSB7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJnBlcm1BckRvIH0pOworfQorCitBckRvOjpBckRvKGNvbnN0IEFwZHVBckRvJiBhcGR1QXJEbywgY29uc3QgTmZjQXJEbyYgbmZjQXJEbykgeworICAgIHBvcHVsYXRlRGF0YShrVGFnLCB7ICZhcGR1QXJEbywgJm5mY0FyRG8gfSk7Cit9CisKK1JlZkFyRG86OlJlZkFyRG8oY29uc3QgUmVmRG8mIHJlZkRvLCBjb25zdCBBckRvJiBhckRvKSB7CisgICAgcG9wdWxhdGVEYXRhKGtUYWcsIHsgJnJlZkRvLCAmYXJEbyB9KTsKK30KKworQWxsUmVmQXJEbzo6QWxsUmVmQXJEbyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8UmVmQXJEbz4gcmVmQXJEb3MpIHsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBSZWZBckRvKj4gZGF0YTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9iamVjdCA6IHJlZkFyRG9zKSB7CisgICAgICAgIGRhdGEucHVzaF9iYWNrKCZvYmplY3QpOworICAgIH0KKyAgICBwb3B1bGF0ZURhdGEoa1RhZywgZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L1RhZ0xlbmd0aFZhbHVlLmgKQEAgLTAsMCArMSwxNTggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBzZXQgb2YgVGFnIExlbmd0aCBWYWx1ZXMgKFRMVikgdGhhdCBhcmUgc3RvcmVkIG9uIGEgVUlDQworLy8gKGNvbW1vbmx5IGNhbGxlZCBhIFNJTSBjYXJkKS4gVGhlc2UgY2xhc3NlcyBhcmUgbmFtZWQgYWZ0ZXIgdGhlIHNwZWNpZmljYXRpb24KKy8vIGFuZCB0aGVpciBjb25zdHJ1Y3RvcnMgYXJlIHdyaXR0ZW4gc3VjaCB0aGF0IHRoZXkgb25seSBhbGxvdyBzdWIgVExWcyB0aGF0CisvLyBhcmUgYWxsb3dlZCBieSB0aGUgc3BlYy4gVGhlIHNwZWMgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vZ2xvYmFscGxhdGZvcm0ub3JnLworLy8gYW5kIGl0J3MgY2FsbGVkIHRoZSBTZWN1cmUgRWxlbWVudCBBY2Nlc3MgQ29udHJvbCBzcGVjaWZpY2F0aW9uLgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBkYXRhIG9iamVjdHMgdGhhdCBjb25zaXN0IG9mIGEgdGFnLCBsZW5ndGggYW5kIGEgdmFsdWUuCisvLyBUaGlzIGNsYXNzIGRlYWxzIHdpdGggZW5jb2RpbmcgYW5kIHN0b3JpbmcgdGhvc2UgdGhyZWUgZmllbGRzIGludG8gYSBzaW5nbGUKKy8vIHN0cmluZyBvZiBkYXRhLgorY2xhc3MgVGFnTGVuZ3RoVmFsdWUgeworcHVibGljOgorICAgIHZpcnR1YWwgY29uc3QgY2hhciogY19zdHIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGF0YS5jX3N0cigpOworICAgIH0KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGEuc2l6ZSgpOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICAvLyBEaXNhbGxvdyBjb25zdHJ1Y3Rpb24gYW5kIGRlc3RydWN0aW9uIG9mIGJhc2UgY2xhc3MuCisgICAgVGFnTGVuZ3RoVmFsdWUoKSA9IGRlZmF1bHQ7CisgICAgflRhZ0xlbmd0aFZhbHVlKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBwb3B1bGF0ZURhdGEoY29uc3QgY2hhciogdGFnLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBUYWdMZW5ndGhWYWx1ZSo+IGRhdGEpOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICB2b2lkIHBvcHVsYXRlRGF0YShjb25zdCBjaGFyKiB0YWcsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBUKj4gZGF0YSk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIHZvaWQgcG9wdWxhdGVEYXRhKGNvbnN0IGNoYXIqIHRhZywgVCBiZWdpbiwgVCBlbmQpOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZVNpemVTdHJpbmcoc2l6ZV90IHNpemUpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgbURhdGE7Cit9OworCisvLyBBSUQtUkVGLURPLCBjb250YWlucyBhbiBhcHAgSUQgaWRlbnRpZnlpbmcgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uCisvLyBDdXJyZW50bHkgbm90IGltcGxlbWVudGVkIGFzIHRoaXMgaXMgbm90IHVzZWQsIGp1c3QgaGVyZSBmb3IgY29tcGxldGVuZXNzCitjbGFzcyBBaWRSZWZEbyA6IHB1YmxpYyBUYWdMZW5ndGhWYWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1RhZ1tdOworfTsKKworLy8gUEtHLVJFRi1ETywgY29udGFpbnMgYSBwYWNrYWdlIG5hbWUgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFydGljdWxhcgorLy8gYXBwbGljYXRpb24uIElmIGEgcGFja2FnZSBuYW1lIGlzIHByZXNlbnQgdGhlIGFjY2VzcyBydWxlIG9ubHkgYXBwbGllcyB0byB0aGUKKy8vIHBhY2thZ2UgbWF0Y2hpbmcgdGhpcyBuYW1lCitjbGFzcyBQa2dSZWZEbyA6IHB1YmxpYyBUYWdMZW5ndGhWYWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1RhZ1tdOworcHVibGljOgorICAgIGV4cGxpY2l0IFBrZ1JlZkRvKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlTmFtZSk7Cit9OworCisvLyBEZXZpY2VBcHBJRC1SRUYtRE8sIGNvbnRhaW5zIGEgdW5pcXVlIGFwcCBJRCBvciBoYXNoIG9mIGEgY2VydGlmaWNhdGUgdXNlZAorLy8gdG8gc2lnbiBhbiBhcHAuCitjbGFzcyBEZXZpY2VBcHBJZFJlZkRvIDogcHVibGljIFRhZ0xlbmd0aFZhbHVlIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGFnW107CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlIGEgRGV2aWNlQXBwSUQtUkVGLURPIGZyb20gZGF0YSByZXByZXNlbnRlZCBhcyBhIGhleGFkZWNpbWFsIHN0cmluZworICAgIGV4cGxpY2l0IERldmljZUFwcElkUmVmRG8oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cmluZ0RhdGEpOworfTsKKworLy8gUkVGLURPLCBSZWZlcmVuY2UgRGF0YSBPYmplY3QsIGNvbnRhaW5zIGEgRGV2aWNlQXBwSUQgcmVmZXJlbmNlIGFuZAorLy8gb3B0aW9uYWxseSBlaXRoZXIgYW4gQWlkUmVmRG8gb3IgYSBQa2dSZWZEby4gVGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIGFuCisvLyBhcHBsaWNhdGlvbi4KK2NsYXNzIFJlZkRvIDogcHVibGljIFRhZ0xlbmd0aFZhbHVlIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGFnW107CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmVmRG8oY29uc3QgRGV2aWNlQXBwSWRSZWZEbyYgZGV2aWNlQXBwSWRSZWZEbyk7CisgICAgUmVmRG8oY29uc3QgQWlkUmVmRG8mIGFpZFJlZkRvLAorICAgICAgICAgIGNvbnN0IERldmljZUFwcElkUmVmRG8mIGRldmljZUFwcElkUmVmRG8pOworICAgIFJlZkRvKGNvbnN0IERldmljZUFwcElkUmVmRG8mIGRldmljZUFwcElkUmVmRG8sCisgICAgICAgICAgY29uc3QgUGtnUmVmRG8mIHBrZ1JlZkRvKTsKK307CisKKy8vIEFQRFUtQVItRE8sIHVzZWQgdG8gc2V0IGFjY2VzcyBydWxlcyByZWdhcmRpbmcgQVBEVSBjb21tYW5kcywgY2FuIGJlIHVzZWQgdG8KKy8vIGFsbG93IG9yIGRlbnkgYWxsIEFQRFUgY29tbWFuZHMgaW4gb25lIGdvIG9yIHRvIHNldCBmaW5lLWdyYWluZXIgcGVybWlzc2lvbnMKKy8vIGZvciBkaWZmZXJlbnQgQVBEVSBjb21tYW5kIHR5cGVzLgorY2xhc3MgQXBkdUFyRG8gOiBwdWJsaWMgVGFnTGVuZ3RoVmFsdWUgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtUYWdbXTsKK3B1YmxpYzoKKyAgICBlbnVtIGNsYXNzIEFsbG93IHsKKyAgICAgICAgTmV2ZXIgPSAwLAorICAgICAgICBBbHdheXMgPSAxLAorICAgIH07CisgICAgLy8gQ3JlYXRlIGFuIEFwZHVBckRvIHdpdGggYSBnZW5lcmFsIGFjY2VzcyBydWxlLCBhbGxvd2luZyBhbGwgb3Igbm8gQVBEVXMKKyAgICBleHBsaWNpdCBBcGR1QXJEbyhBbGxvdyBydWxlKTsKKworICAgIC8vIENyZWF0ZSBhbiBBcGR1QXJEbyB3aXRoIGEgc2V0IG9mIHNwZWNpZmljIGFjY2VzcyBydWxlcyBmb3IgZWFjaCBBUERVLAorICAgIC8vIFNlZSB0aGUgU2VjdXJlIEVsZW1lbnRzIEFjY2VzcyBDb250cm9sIHNwZWNpZmljYXRpb24gZnJvbQorICAgIC8vIGdsb2JhbHBsYXRmb3JtLm9yZyBmb3IgZGV0YWlscyBvbiB0aGUgZm9ybWF0LgorICAgIGV4cGxpY2l0IEFwZHVBckRvKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnN0cmluZz4gcnVsZXMpOworfTsKKworLy8gTkZDLUFSLURPLCBpbmRpY2F0ZXMgaWYgTkZDIGV2ZW50cyBhcmUgYWxsb3dlZCBmb3IgdGhlIGRldmljZSBhcHBsaWNhdGlvbgorY2xhc3MgTmZjQXJEbyA6IHB1YmxpYyBUYWdMZW5ndGhWYWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1RhZ1tdOworcHVibGljOgorICAgIGVudW0gY2xhc3MgQWxsb3cgeworICAgICAgICBOZXZlciA9IDAsCisgICAgICAgIEFsd2F5cyA9IDEsCisgICAgfTsKKyAgICBleHBsaWNpdCBOZmNBckRvKEFsbG93IHJ1bGUpOworfTsKKworLy8gUEVSTS1BUi1ETywgYW4gOCBieXRlIGJpdG1hc2sgY29udGFpbmluZyA2NCBzZXByYXRlIHBlcm1pc3Npb25zLCBzZWUKKy8vIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvdGVjaC9jb25maWcvdWljYy5odG1sCitjbGFzcyBQZXJtQXJEbyA6IHB1YmxpYyBUYWdMZW5ndGhWYWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1RhZ1tdOworcHVibGljOgorICAgIGV4cGxpY2l0IFBlcm1BckRvKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHJpbmdEYXRhKTsKK307CisKKy8vIEFSLURPLCBjb250YWlucyBhIHBlcm1pc3Npb24sIEFQRFUgYW5kL29yIE5GQyBhY2Nlc3MgcnVsZXMKK2NsYXNzIEFyRG8gOiBwdWJsaWMgVGFnTGVuZ3RoVmFsdWUgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtUYWdbXTsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBckRvKGNvbnN0IEFwZHVBckRvJiBhcGR1QXJEbyk7CisgICAgZXhwbGljaXQgQXJEbyhjb25zdCBOZmNBckRvJiBuZmNBckRvKTsKKyAgICBleHBsaWNpdCBBckRvKGNvbnN0IFBlcm1BckRvJiBwZXJtQXJEbyk7CisgICAgQXJEbyhjb25zdCBBcGR1QXJEbyYgYXBkdUFyRG8sIGNvbnN0IE5mY0FyRG8mIG5mY0FyRG8pOworfTsKKworLy8gUkVGLUFSLURPLCBhIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gYW4gYWNjZXNzIHJ1bGUgYW5kIHRoZQorLy8gY29ycmVzcG9uZGluZyBydWxlLgorY2xhc3MgUmVmQXJEbyA6IHB1YmxpYyBUYWdMZW5ndGhWYWx1ZSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1RhZ1tdOworcHVibGljOgorICAgIFJlZkFyRG8oY29uc3QgUmVmRG8mIHJlZkRvLCBjb25zdCBBckRvJiBhckRvKTsKK307CisKKy8vIEFMTC1SRUYtQVItRE8sIGEgbGlzdCBvZiBhbGwgUmVmQXJEbydzCitjbGFzcyBBbGxSZWZBckRvIDogcHVibGljIFRhZ0xlbmd0aFZhbHVlIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGFnW107CitwdWJsaWM6CisgICAgZXhwbGljaXQgQWxsUmVmQXJEbyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8UmVmQXJEbz4gcmVmQXJEb3MpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L1RhZ0xlbmd0aFZhbHVlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWQ3YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxODUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9UYWdMZW5ndGhWYWx1ZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitURVNUKFRhZ0xlbmd0aFZhbHVlLCBDb25zdHJ1Y3REZXZpY2VBcHBJZFJlZkRvKSB7CisgICAgRGV2aWNlQXBwSWRSZWZEbyBkZXZpY2VBcHBJZFJlZkRvKCJDMEZGRUUiKTsKKworICAgIC8vIEVuc3VyZSB0aGUgY29ycmVjdCB0YWcgaXMgdXNlZCBhbmQgdGhhdCB0aGUgbGVuZ3RoIGFuZCBkYXRhIGFyZSBjb3JyZWN0CisgICAgQVNTRVJUX1NUUkVRKC8qdGFnKi8gIkMxIiAvKmxlbmd0aCovICIwMyIgLypwYXlsb2FkKi8gIkMwRkZFRSIsCisgICAgICAgICAgICAgICAgIGRldmljZUFwcElkUmVmRG8uY19zdHIoKSk7Cit9CisKK1RFU1QoVGFnTGVuZ3RoVmFsdWUsIENvbnN0cnVjdFBrZ1JlZkRvKSB7CisgICAgUGtnUmVmRG8gcGtnUmVmRG8oImNvbS5hbmRyb2lkLmZvbyIpOworCisgICAgQVNTRVJUX1NUUkVRKC8qdGFnKi8gIkNBIiAvKmxlbmd0aCovICIwZiIKKyAgICAgICAgICAgICAgICAgLypwYXlsb2FkKi8gIjYzNmY2ZDJlNjE2ZTY0NzI2ZjY5NjQyZTY2NmY2ZiIsCisgICAgICAgICAgICAgICAgIHBrZ1JlZkRvLmNfc3RyKCkpOworfQorCitURVNUKFRhZ0xlbmd0aFZhbHVlLCBDb25zdHJ1Y3RSZWZEbykgeworICAgIFJlZkRvIHJlZkRve0RldmljZUFwcElkUmVmRG8oIkMwRkZFRSIpfTsKKworICAgIEFTU0VSVF9TVFJFUSgvKnRhZyovICJFMSIgLypsZW5ndGgqLyAiMDUiIC8qcGF5bG9hZCovICJDMTAzQzBGRkVFIiwKKyAgICAgICAgICAgICAgICAgcmVmRG8uY19zdHIoKSk7Cit9CisKK1RFU1QoVGFnTGVuZ3RoVmFsdWUsIENvbnN0cnVjdFJlZkRvV2l0aEFpZFJlZkRvKSB7CisgICAgUmVmRG8gcmVmRG97QWlkUmVmRG8oKSwgRGV2aWNlQXBwSWRSZWZEbygiQzBGRkVFIil9OworCisgICAgLy8gTm90ZSB0aGF0IHRoZSBBSUQtUkVGLURPIGRvZXMgbm90IGVuZCB1cCBpbiB0aGUgcGF5bG9hZCBiZWNhdXNlIHdlCisgICAgLy8gY29uc3RydWN0IGFuIGVtcHR5IG9iamVjdC4KKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRTEiIC8qbGVuZ3RoKi8gIjA1IiAvKnBheWxvYWQqLyAiQzEwM0MwRkZFRSIsCisgICAgICAgICAgICAgICAgIHJlZkRvLmNfc3RyKCkpOworfQorCitURVNUKFRhZ0xlbmd0aFZhbHVlLCBDb25zdHJ1Y3RSZWZEb1dpdGhQa2dSZWZEbykgeworICAgIFJlZkRvIHJlZkRve0RldmljZUFwcElkUmVmRG8oIkMwRkZFRSIpLCBQa2dSZWZEbygiZm9vIil9OworCisgICAgQVNTRVJUX1NUUkVRKC8qdGFnKi8gIkUxIiAvKmxlbmd0aCovICIwYSIKKyAgICAgICAgICAgICAgICAgLypwYXlsb2FkKi8gIkMxMDNDMEZGRUVDQTAzNjY2ZjZmIiwKKyAgICAgICAgICAgICAgICAgcmVmRG8uY19zdHIoKSk7Cit9CisKK1RFU1QoVGFnTGVuZ3RoVmFsdWUsIENvbnN0cnVjdEFwZHVBckRvKSB7CisgICAgQXBkdUFyRG8gZ2xvYmFsRGVueVJ1bGUoQXBkdUFyRG86OkFsbG93OjpOZXZlcik7CisgICAgQVNTRVJUX1NUUkVRKC8qdGFnKi8gIkQwIiAvKmxlbmd0aCovICIwMSIgLypwYXlsb2FkKi8gIjAwIiwKKyAgICAgICAgICAgICAgICAgZ2xvYmFsRGVueVJ1bGUuY19zdHIoKSk7CisKKyAgICBBcGR1QXJEbyBnbG9iYWxBbGxvd1J1bGUoQXBkdUFyRG86OkFsbG93OjpBbHdheXMpOworICAgIEFTU0VSVF9TVFJFUSgvKnRhZyovICJEMCIgLypsZW5ndGgqLyAiMDEiIC8qcGF5bG9hZCovICIwMSIsCisgICAgICAgICAgICAgICAgIGdsb2JhbEFsbG93UnVsZS5jX3N0cigpKTsKKworICAgIC8vIFRoZXNlIHJ1bGVzIGFyZSBhY3R1YWxseSBzdXBwb3NlZCB0byBoYXZlIGEgYmV0dGVyIGZvcm1hdCB0aGFuIHRoaXMKKyAgICAvLyBidXQgdGhpcyB3aWxsIHdvcmsgZm9yIHRlc3RpbmcuCisgICAgQXBkdUFyRG8gc3BlY2lmaWNSdWxlKCB7IkMwRkZFRSIsICJCRUVGIn0gKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRDAiIC8qbGVuZ3RoKi8gIjA1IiAvKnBheWxvYWQqLyAiQzBGRkVFQkVFRiIsCisgICAgICAgICAgICAgICAgIHNwZWNpZmljUnVsZS5jX3N0cigpKTsKK30KKworVEVTVChUYWdMZW5ndGhWYWx1ZSwgQ29uc3RydWN0TmZjQXJEbykgeworICAgIE5mY0FyRG8gbmV2ZXIoTmZjQXJEbzo6QWxsb3c6Ok5ldmVyKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRDEiIC8qbGVuZ3RoKi8gIjAxIiAvKnBheWxvYWQqLyAiMDAiLCBuZXZlci5jX3N0cigpKTsKKworICAgIE5mY0FyRG8gYWx3YXlzKE5mY0FyRG86OkFsbG93OjpBbHdheXMpOworICAgIEFTU0VSVF9TVFJFUSgvKnRhZyovICJEMSIgLypsZW5ndGgqLyAiMDEiIC8qcGF5bG9hZCovICIwMSIsIGFsd2F5cy5jX3N0cigpKTsKK30KKworVEVTVChUYWdMZW5ndGhWYWx1ZSwgQ29uc3RydWN0UGVybUFyRG8pIHsKKyAgICBQZXJtQXJEbyBwZXJtQXJEbygiQzBGRkVFIik7CisKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiREIiIC8qbGVuZ3RoKi8gIjAzIiAvKnBheWxvYWQqLyAiQzBGRkVFIiwKKyAgICAgICAgICAgICAgICAgcGVybUFyRG8uY19zdHIoKSk7Cit9CisKK1RFU1QoVGFnTGVuZ3RoVmFsdWUsIENvbnN0cnVjdEFyRG8pIHsKKyAgICBjb25zdCBBcGR1QXJEbyBhcGR1QXJEbyggeyJDMEZGRUUiLCAiQkVFRiJ9ICk7CisgICAgY29uc3QgTmZjQXJEbyBuZmNBckRvKE5mY0FyRG86OkFsbG93OjpBbHdheXMpOworICAgIGNvbnN0IFBlcm1BckRvIHBlcm1BckRvKCJERUNBREUiKTsKKworICAgIEFyRG8gYXJEb1dpdGhBcGR1KGFwZHVBckRvKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRTMiIC8qbGVuZ3RoKi8gIjA3IiAvKnBheWxvYWQqLyAiRDAwNUMwRkZFRUJFRUYiLAorICAgICAgICAgICAgICAgICBhckRvV2l0aEFwZHUuY19zdHIoKSk7CisKKyAgICBBckRvIGFyRG9XaXRoTmZjKG5mY0FyRG8pOworICAgIEFTU0VSVF9TVFJFUSgvKnRhZyovICJFMyIgLypsZW5ndGgqLyAiMDMiIC8qcGF5bG9hZCovICJEMTAxMDEiLAorICAgICAgICAgICAgICAgICBhckRvV2l0aE5mYy5jX3N0cigpKTsKKworICAgIEFyRG8gYXJEb1dpdGhQZXJtKHBlcm1BckRvKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRTMiIC8qbGVuZ3RoKi8gIjA1IiAvKnBheWxvYWQqLyAiREIwM0RFQ0FERSIsCisgICAgICAgICAgICAgICAgIGFyRG9XaXRoUGVybS5jX3N0cigpKTsKKworICAgIEFyRG8gYXJEb1dpdGhBcGR1QW5kTmZjKGFwZHVBckRvLCBuZmNBckRvKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRTMiIC8qbGVuZ3RoKi8gIjBhIgorICAgICAgICAgICAgICAgICAvKnBheWxvYWQqLyAiRDAwNUMwRkZFRUJFRUZEMTAxMDEiLAorICAgICAgICAgICAgICAgICBhckRvV2l0aEFwZHVBbmROZmMuY19zdHIoKSk7Cit9CisKK1RFU1QoVGFnTGVuZ3RoVmFsdWUsIENvbnN0cnVjdFJlZkFyRG8pIHsKKyAgICBSZWZEbyByZWZEbyhBaWRSZWZEbygpLCBEZXZpY2VBcHBJZFJlZkRvKCJDMEZGRUUiKSk7CisgICAgQXJEbyBhckRve05mY0FyRG97TmZjQXJEbzo6QWxsb3c6OkFsd2F5c319OworCisgICAgUmVmQXJEbyByZWZBckRvKHJlZkRvLCBhckRvKTsKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRTIiIC8qbGVuZ3RoKi8gIjBjIgorICAgICAgICAgICAgICAgICAvKnBheWxvYWQqLyAiRTEwNUMxMDNDMEZGRUVFMzAzRDEwMTAxIiwgcmVmQXJEby5jX3N0cigpKTsKK30KKworVEVTVChUYWdMZW5ndGhWYWx1ZSwgQ29uc3RydWN0QWxsUmVmQXJEbykgeworICAgIC8vIENyZWF0ZSBhbiBBTEwtUkVGLUFSLURPIHdpdGggdHdvIFJFRi1BUi1ET3MgaW4gaXQKKyAgICBBbGxSZWZBckRvIGFsbFJlZkFyRG8geworICAgICAgICBSZWZBckRvIHsKKyAgICAgICAgICAgIFJlZkRvIHsKKyAgICAgICAgICAgICAgICBBaWRSZWZEbygpLAorICAgICAgICAgICAgICAgIERldmljZUFwcElkUmVmRG8geyAiQzBGRkVFIiB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgQXJEbyB7CisgICAgICAgICAgICAgICAgQXBkdUFyRG8geyBBcGR1QXJEbzo6QWxsb3c6Ok5ldmVyIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgUmVmQXJEbyB7CisgICAgICAgICAgICBSZWZEbyB7CisgICAgICAgICAgICAgICAgQWlkUmVmRG8geyB9LAorICAgICAgICAgICAgICAgIERldmljZUFwcElkUmVmRG8geyAiQkVFRiIgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEFyRG8geworICAgICAgICAgICAgICAgIEFwZHVBckRvIHsgQXBkdUFyRG86OkFsbG93OjpBbHdheXMgfSwKKyAgICAgICAgICAgICAgICBOZmNBckRvIHsgTmZjQXJEbzo6QWxsb3c6Ok5ldmVyIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBBU1NFUlRfU1RSRVEoLyp0YWcqLyAiRkY0MCIgLypsZW5ndGgqLyAiMWUiCisgICAgICAgICAgICAgICAgIC8qMXN0IFJFRi1BUi1ETyovICJFMjBjRTEwNUMxMDNDMEZGRUVFMzAzRDAwMTAwIgorICAgICAgICAgICAgICAgICAvKjJuZCBSRUYtQVItRE8qLyAiRTIwZUUxMDRDMTAyQkVFRkUzMDZEMDAxMDFEMTAxMDAiLAorICAgICAgICAgICAgICAgICBhbGxSZWZBckRvLmNfc3RyKCkpOworfQorCitURVNUKFRhZ0xlbmd0aFZhbHVlLCBUZXN0TG9uZ0xlbnRocykgeworICAgIC8vIENyZWF0ZSBhIHN0cmluZyB0aGF0J3MgbG9uZ2VyIHRoYW4gMTI4IGJ5dGVzLCB0aGlzIHdpbGwgZm9yY2UgdGhlIGxlbmd0aAorICAgIC8vIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gc3BhbiB0d28gYnl0ZXMsIHNlZSBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgICAvLyBkZXRhaWxzIG9uIHdoeSB0aGlzIGlzLiBMZW5ndGhzIGFyZSBtdWx0aXBsaWVkIGJ5IHR3byBiZWNhdXNlIGVhY2ggYnl0ZQorICAgIC8vIGlzIHJlcHJlc2VudGVkIGJ5IHR3byBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6c3RyaW5nIHR3b0J5dGVTdHJpbmcoMiAqIDB4YTAsICd4Jyk7CisgICAgRGV2aWNlQXBwSWRSZWZEbyB0d29CeXRlVGx2KHR3b0J5dGVTdHJpbmcpOworICAgIEFTU0VSVF9FUSh0d29CeXRlVGx2LmNfc3RyKCksIHN0cnN0cih0d29CeXRlVGx2LmNfc3RyKCksICJDMTgxYTB4IikpOworCisgICAgLy8gTG9uZ2VyIHRoYW4gMjU1IGJ5dGVzIHJlcXVpcmVzIHRocmVlIGJ5dGUgbGVuZ3RoCisgICAgc3RkOjpzdHJpbmcgdGhyZWVCeXRlU3RyaW5nKDIgKiAweDEyMywgJ3gnKTsKKyAgICBEZXZpY2VBcHBJZFJlZkRvIHRocmVlQnl0ZVRsdih0aHJlZUJ5dGVTdHJpbmcpOworICAgIEFTU0VSVF9FUSh0aHJlZUJ5dGVUbHYuY19zdHIoKSwgc3Ryc3RyKHRocmVlQnl0ZVRsdi5jX3N0cigpLCAiQzE4MjAxMjN4IikpOworCisgICAgLy8gTG9uZ2VyIHRoYW4gNjU1MzUgYnl0ZXMgcmVxdWlyZXMgZm91ciBieXRlIGxlbmd0aAorICAgIHN0ZDo6c3RyaW5nIGZvdXJCeXRlU3RyaW5nKDIgKiAweDEwMzEyLCAneCcpOworICAgIERldmljZUFwcElkUmVmRG8gZm91ckJ5dGVUbHYoZm91ckJ5dGVTdHJpbmcpOworICAgIEFTU0VSVF9FUShmb3VyQnl0ZVRsdi5jX3N0cigpLCBzdHJzdHIoZm91ckJ5dGVUbHYuY19zdHIoKSwgIkMxODMwMTAzMTJ4IikpOworCisgICAgLyoKKyAgICAgVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2Ugb2YgZXhjZXNzaXZlIG1lbW9yeSB1c2FnZSBhbmQgc2xvdworICAgICBwZXJmb3JtYW5jZS4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyBpdCB3b3JrcyBidXQgc2luY2UgaXQncyB1bmxpa2VseQorICAgICB3ZSB3aWxsIGV2ZXIgYmUgcmV0dXJuaW5nIGRhdGEgbGFyZ2VyIHRoYW4gMTYgTUIgc2tpcHBpbmcgdGhpcyBzaG91bGQKKyAgICAgYmUgT0sKKyAgICAvLyBMb25nZXIgdGhhbiAxNiAqIDY1NTM1IHJlcXVpcmVzIGZpdmUgYnl0ZSBsZW5ndGgKKyAgICBzdGQ6OnN0cmluZyBmaXZlQnl0ZVN0cmluZygyICogMHgxMDAxMDAyLCAneCcpOworICAgIERldmljZUFwcElkUmVmRG8gZml2ZUJ5dGVUbHYoZml2ZUJ5dGVTdHJpbmcpOworICAgIEFTU0VSVF9FUShmaXZlQnl0ZVRsdi5jX3N0cigpLAorICAgICAgICAgICAgICBzdHJzdHIoZml2ZUJ5dGVUbHYuY19zdHIoKSwgIkMxODQwMTAwMTAwMngiKSk7CisgICAgKi8KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9kZWJ1Zy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMWE4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2RlYnVnLmMKQEAgLTAsMCArMSwyNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitib29sIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX21vZGVtID0gZmFsc2U7Citib29sIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX3JhZGlvID0gZmFsc2U7Citib29sIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX3NvY2tldCA9IGZhbHNlOworCit2b2lkIGFuZHJvaWRfdGVsZXBob255X2xvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgIHZhX2xpc3QgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2RlYnVnLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMjkyNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvZGVidWcuaApAQCAtMCwwICsxLDQyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFNldCB0byAndHJ1ZScgdG8gZW5hYmxlIGxvZ3MgZnJvbSB0aGUgJ21vZGVtJyBjb21wb25lbnQuCitleHRlcm4gYm9vbCBhbmRyb2lkX3RlbGVwaG9ueV9kZWJ1Z19tb2RlbTsKKworLy8gU2V0IHRvICd0cnVlJyB0byBlbmFibGUgbG9ncyBmcm9tIHRoZSAncmFkaW8nIGNvbXBvbmVudC4KK2V4dGVybiBib29sIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX3JhZGlvOworCisvLyBTZXQgdG8gJ3RydWUnIHRvIGVuYWJsZSBsb2dzIGZyb20gdGhlICdzb2NrZXQnIGNvbXBvbmVudC4KK2V4dGVybiBib29sIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX3NvY2tldDsKKworLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIHRlbGVwaG9ueSBsb2cuIEJ5IGRlZmF1bHQsIHRoaXMgc2VuZHMgc3R1ZmYgdG8gc3RkZXJyLgorZXh0ZXJuIHZvaWQgYW5kcm9pZF90ZWxlcGhvbnlfbG9nKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLy8gVXNlIHRoaXMgbWFjcm8gdG8gc2VuZCBhIGxvZyBtZXNzYWdlIGlmIGEgZ2l2ZW4gZGVidWcgY29tcG9uZW50IGlzIGVuYWJsZWQuCisjZGVmaW5lIEFORFJPSURfVEVMRVBIT05ZX0xPR19PTihjb21wb25lbnQsLi4uKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChhbmRyb2lkX3RlbGVwaG9ueV9kZWJ1Z18gIyMgY29tcG9uZW50KSBcCisgICAgICAgICAgICBhbmRyb2lkX3RlbGVwaG9ueV9sb2coX19WQV9BUkdTX18pOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvZ3NtLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2dzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzQyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2dzbS5jCkBAIC0wLDAgKzEsMTI2MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L2dzbS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qKiBVVElMSVRJRVMKKyAqKi8KK2J5dGVfdAorZ3NtX2ludF90b19iY2RpKCBpbnQgIHZhbHVlICkKK3sKKyAgICByZXR1cm4gKGJ5dGVfdCkoKHZhbHVlIC8gMTApIHwgKCh2YWx1ZSAlIDEwKSA8PCA0KSk7Cit9CisKK2ludAorZ3NtX2ludF9mcm9tX2JjZGkoIGJ5dGVfdCAgdmFsICkKK3sKKyAgICBpbnQgIHJldCA9IDA7CisKKyAgICBpZiAoKHZhbCAmIDB4ZjApIDw9IDB4OTApCisgICAgICAgIHJldCA9ICh2YWwgPj4gNCk7CisKKyAgICBpZiAoKHZhbCAmIDB4MGYpIDw9IDB4OTApCisgICAgICAgIHJldCB8PSAodmFsICUgMHhmKSoxMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50Citnc21fYmNkaV90b19hc2NpaSggY2J5dGVzX3QgIGJjZCwgaW50ICBiY2RsZW4sIGJ5dGVzX3QgIGRzdCApCit7CisgICAgc3RhdGljIGJ5dGVfdCAgYmNkaWNoYXJzWzE0XSA9ICIwMTIzNDU2Nzg5KiMsTiI7CisKKyAgICBpbnQgIHJlc3VsdCA9IDA7CisgICAgaW50ICBzaGlmdCAgPSAwOworCisgICAgd2hpbGUgKGJjZGxlbiA+IDApIHsKKyAgICAgICAgaW50ICBjID0gKGJjZFswXSA+PiBzaGlmdCkgJiAweGY7CisKKyAgICAgICAgaWYgKGMgPT0gMHhmICYmIGJjZGxlbiA9PSAxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGMgPCAxNCkgeworICAgICAgICAgICAgaWYgKGRzdCkgZHN0W3Jlc3VsdF0gPSBiY2RpY2hhcnNbY107CisgICAgICAgICAgICByZXN1bHQgKz0gMTsKKyAgICAgICAgfQorICAgICAgICBiY2RsZW4gLS07CisgICAgICAgIHNoaWZ0ICs9IDQ7CisgICAgICAgIGlmIChzaGlmdCA9PSA4KSB7CisgICAgICAgICAgICBiY2QrKzsKKyAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgaW50Citnc21fYmNkaV9mcm9tX2FzY2lpKCBjYnl0ZXNfdCAgYXNjaWksIGludCAgYXNjaWlsZW4sIGJ5dGVzX3QgIGRzdCApCit7CisgICAgY2J5dGVzX3QgIGVuZCAgICA9IGFzY2lpICsgYXNjaWlsZW47CisgICAgaW50ICAgICAgIHJlc3VsdCA9IDA7CisgICAgaW50ICAgICAgIHBoYXNlICA9IDB4MDE7CisKKyAgICB3aGlsZSAoYXNjaWkgPCBlbmQpIHsKKyAgICAgICAgaW50ICBjID0gKmFzY2lpKys7CisKKyAgICAgICAgaWYgKGMgPT0gJyonKQorICAgICAgICAgICAgYyA9IDExOworICAgICAgICBlbHNlIGlmIChjID09ICcjJykKKyAgICAgICAgICAgIGMgPSAxMjsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnLCcpCisgICAgICAgICAgICBjID0gMTM7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ04nKQorICAgICAgICAgICAgYyA9IDE0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGMgLT0gJzAnOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCljID49IDEwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBoYXNlID0gKHBoYXNlIDw8IDQpIHwgYzsKKyAgICAgICAgaWYgKHBoYXNlICYgMHgxMDApIHsKKyAgICAgICAgICAgIGlmIChkc3QpIGRzdFtyZXN1bHRdID0gKGJ5dGVfdCkgcGhhc2U7CisgICAgICAgICAgICByZXN1bHQgKz0gMTsKKyAgICAgICAgICAgIHBoYXNlICAgPSAweDAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwaGFzZSAhPSAweDAxKSB7CisgICAgICAgIGlmIChkc3QpIGRzdFtyZXN1bHRdID0gKGJ5dGVfdCkoIHBoYXNlIHwgMHhmMCApOworICAgICAgICByZXN1bHQgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisjZW5kaWYKKworaW50Citnc21faGV4Y2hhcl90b19pbnQoIGNoYXIgIGMgKQoreworICAgIGlmICgodW5zaWduZWQpKGMgLSAnMCcpIDwgMTApCisgICAgICAgIHJldHVybiBjIC0gJzAnOworICAgIGlmICgodW5zaWduZWQpKGMgLSAnYScpIDwgNikKKyAgICAgICAgcmV0dXJuIDEwICsgKGMgLSAnYScpOworICAgIGlmICgodW5zaWduZWQpKGMgLSAnQScpIDwgNikKKyAgICAgICAgcmV0dXJuIDEwICsgKGMgLSAnQScpOworICAgIHJldHVybiAtMTsKK30KKworaW50Citnc21faGV4Y2hhcl90b19pbnQwKCBjaGFyICBjICkKK3sKKyAgICBpbnQgIHJldCA9IGdzbV9oZXhjaGFyX3RvX2ludChjKTsKKworICAgIHJldHVybiAocmV0IDwgMCkgPyAwIDogcmV0OworfQorCitpbnQKK2dzbV9oZXgyX3RvX2J5dGUoIGNvbnN0IGNoYXIqICBoZXggKQoreworICAgIGludCAgaGkgPSBnc21faGV4Y2hhcl90b19pbnQoaGV4WzBdKTsKKyAgICBpbnQgIGxvID0gZ3NtX2hleGNoYXJfdG9faW50KGhleFsxXSk7CisKKyAgICBpZiAoaGkgPCAwIHx8IGxvIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuICggKGhpIDw8IDQpIHwgbG8gKTsKK30KKworaW50Citnc21faGV4NF90b19zaG9ydCggY29uc3QgY2hhciogIGhleCApCit7CisgICAgaW50ICBoaSA9IGdzbV9oZXgyX3RvX2J5dGUoaGV4KTsKKyAgICBpbnQgIGxvID0gZ3NtX2hleDJfdG9fYnl0ZShoZXgrMik7CisKKyAgICBpZiAoaGkgPCAwIHx8IGxvIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuICgoaGkgPDwgOCkgfCBsbyk7Cit9CisKK2ludAorZ3NtX2hleDJfdG9fYnl0ZTAoIGNvbnN0IGNoYXIqICBoZXggKQoreworICAgIGludCAgaGkgPSBnc21faGV4Y2hhcl90b19pbnQwKGhleFswXSk7CisgICAgaW50ICBsbyA9IGdzbV9oZXhjaGFyX3RvX2ludDAoaGV4WzFdKTsKKworICAgIHJldHVybiAoYnl0ZV90KSggKGhpIDw8IDQpIHwgbG8gKTsKK30KKwordm9pZAorZ3NtX2hleF9mcm9tX2J5dGUoIGNoYXIqICBoZXgsIGludCB2YWwgKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICBoZXhkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKworICAgIGhleFswXSA9IGhleGRpZ2l0c1sodmFsID4+IDQpICYgMTVdOworICAgIGhleFsxXSA9IGhleGRpZ2l0c1t2YWwgJiAxNV07Cit9CisKK3ZvaWQKK2dzbV9oZXhfZnJvbV9zaG9ydCggY2hhciogIGhleCwgaW50ICB2YWwgKQoreworICAgIGdzbV9oZXhfZnJvbV9ieXRlKCBoZXgsICAgKHZhbCA+PiA4KSApOworICAgIGdzbV9oZXhfZnJvbV9ieXRlKCBoZXgrMiwgdmFsICk7Cit9CisKKworCisvKiogSEVYCisgKiovCit2b2lkCitnc21faGV4X3RvX2J5dGVzMCggY2J5dGVzX3QgIGhleCwgaW50ICBoZXhsZW4sIGJ5dGVzX3QgIGRzdCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGhleGxlbi8yOyBubisrICkgeworICAgICAgICBkc3Rbbm5dID0gKGJ5dGVfdCkgZ3NtX2hleDJfdG9fYnl0ZTAoIChjb25zdCBjaGFyKiloZXgrMipubiApOworICAgIH0KKyAgICBpZiAoaGV4bGVuICYgMSkgeworICAgICAgICBkc3Rbbm5dID0gZ3NtX2hleGNoYXJfdG9faW50MCggaGV4WzIqbm5dICkgPDwgNDsKKyAgICB9Cit9CisKK2ludAorZ3NtX2hleF90b19ieXRlcyggY2J5dGVzX3QgIGhleCwgaW50ICBoZXhsZW4sIGJ5dGVzX3QgIGRzdCApCit7CisgICAgaW50ICBubjsKKworICAgIGlmIChoZXhsZW4gJiAxKSAgLyogbXVzdCBiZSBldmVuICovCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGhleGxlbi8yOyBubisrICkgeworICAgICAgICBpbnQgIGMgPSBnc21faGV4Ml90b19ieXRlKCAoY29uc3QgY2hhciopaGV4KzIqbm4gKTsKKyAgICAgICAgaWYgKGMgPCAwKSByZXR1cm4gLTE7CisgICAgICAgIGRzdFtubl0gPSAoYnl0ZV90KSBjOworICAgIH0KKyAgICByZXR1cm4gaGV4bGVuLzI7Cit9CisKK3ZvaWQKK2dzbV9oZXhfZnJvbV9ieXRlcyggY2hhciogIGhleCwgY2J5dGVzX3QgIHNyYywgaW50ICBzcmNsZW4gKQoreworICAgIGludCAgbm47CisKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBzcmNsZW47IG5uKyspIHsKKyAgICAgICAgZ3NtX2hleF9mcm9tX2J5dGUoIGhleCArIDIqbm4sIHNyY1tubl0gKTsKKyAgICB9Cit9CisKKy8qKiBST1BFUworICoqLworCit2b2lkCitnc21fcm9wZV9pbml0KCBHc21Sb3BlICByb3BlICkKK3sKKyAgICByb3BlLT5kYXRhICA9IE5VTEw7CisgICAgcm9wZS0+cG9zICAgPSAwOworICAgIHJvcGUtPm1heCAgID0gMDsKKyAgICByb3BlLT5lcnJvciA9IDA7Cit9CisKK3ZvaWQKK2dzbV9yb3BlX2luaXRfYWxsb2MoIEdzbVJvcGUgIHJvcGUsIGludCAgY291bnQgKQoreworICAgIHJvcGUtPmRhdGEgID0gcm9wZS0+ZGF0YTA7CisgICAgcm9wZS0+cG9zICAgPSAwOworICAgIHJvcGUtPm1heCAgID0gc2l6ZW9mKHJvcGUtPmRhdGEwKTsKKyAgICByb3BlLT5lcnJvciA9IDA7CisKKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgIHJvcGUtPmRhdGEgPSBjYWxsb2MoIGNvdW50LCAxICk7CisgICAgICAgIHJvcGUtPm1heCAgPSBjb3VudDsKKworICAgICAgICBpZiAocm9wZS0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByb3BlLT5lcnJvciA9IDE7CisgICAgICAgICAgICByb3BlLT5tYXggICA9IDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludAorZ3NtX3JvcGVfZG9uZSggR3NtUm9wZSAgcm9wZSApCit7CisgICAgaW50ICByZXN1bHQgPSByb3BlLT5lcnJvcjsKKworICAgIGlmIChyb3BlLT5kYXRhICYmIHJvcGUtPmRhdGEgIT0gcm9wZS0+ZGF0YTApCisgICAgICAgIGZyZWUocm9wZS0+ZGF0YSk7CisKKyAgICByb3BlLT5kYXRhICA9IE5VTEw7CisgICAgcm9wZS0+cG9zICAgPSAwOworICAgIHJvcGUtPm1heCAgID0gMDsKKyAgICByb3BlLT5lcnJvciA9IDA7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2J5dGVzX3QKK2dzbV9yb3BlX2RvbmVfYWNxdWlyZSggR3NtUm9wZSAgcm9wZSwgaW50ICAqcHNpemUgKQoreworICAgIGJ5dGVzX3QgIHJlc3VsdCA9IHJvcGUtPmRhdGE7CisKKyAgICAqcHNpemUgPSByb3BlLT5wb3M7CisgICAgaWYgKHJlc3VsdCA9PSByb3BlLT5kYXRhMCkgeworICAgICAgICByZXN1bHQgPSBtYWxsb2MoICByb3BlLT5wb3MgKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKQorICAgICAgICAgICAgbWVtY3B5KCByZXN1bHQsIHJvcGUtPmRhdGEsIHJvcGUtPnBvcyApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2ludAorZ3NtX3JvcGVfZW5zdXJlKCBHc21Sb3BlICByb3BlLCBpbnQgIG5ld19jb3VudCApCit7CisgICAgaWYgKHJvcGUtPmRhdGEgIT0gTlVMTCkgeworICAgICAgICBpbnQgICAgICAgb2xkX21heCAgPSByb3BlLT5tYXg7CisgICAgICAgIGJ5dGVzX3QgICBvbGRfZGF0YSA9IHJvcGUtPmRhdGEgPT0gcm9wZS0+ZGF0YTAgPyBOVUxMIDogcm9wZS0+ZGF0YTsKKyAgICAgICAgaW50ICAgICAgIG5ld19tYXggID0gb2xkX21heDsKKyAgICAgICAgYnl0ZXNfdCAgIG5ld19kYXRhOworCisgICAgICAgIHdoaWxlIChuZXdfbWF4IDwgbmV3X2NvdW50KSB7CisgICAgICAgICAgICBuZXdfbWF4ICs9IChuZXdfbWF4ID4+IDEpICsgNDsKKyAgICAgICAgfQorICAgICAgICBuZXdfZGF0YSA9IHJlYWxsb2MoIG9sZF9kYXRhLCBuZXdfbWF4ICk7CisgICAgICAgIGlmIChuZXdfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByb3BlLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcm9wZS0+ZGF0YSA9IG5ld19kYXRhOworICAgICAgICByb3BlLT5tYXggID0gbmV3X21heDsKKyAgICB9IGVsc2UgeworICAgICAgICByb3BlLT5tYXggPSBuZXdfY291bnQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citnc21fcm9wZV9jYW5fZ3JvdyggR3NtUm9wZSAgcm9wZSwgaW50ICBjb3VudCApCit7CisgICAgaWYgKCFyb3BlLT5kYXRhIHx8IHJvcGUtPmVycm9yKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChyb3BlLT5wb3MgKyBjb3VudCA+IHJvcGUtPm1heCkKKyAgICB7CisgICAgICAgIGlmIChyb3BlLT5kYXRhID09IE5VTEwpCisgICAgICAgICAgICByb3BlLT5tYXggPSByb3BlLT5wb3MgKyBjb3VudDsKKworICAgICAgICBlbHNlIGlmIChyb3BlLT5lcnJvciB8fAorICAgICAgICAgICAgICAgICBnc21fcm9wZV9lbnN1cmUoIHJvcGUsIHJvcGUtPnBvcyArIGNvdW50ICkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCit2b2lkCitnc21fcm9wZV9hZGRfYyggR3NtUm9wZSAgcm9wZSwgIGNoYXIgIGMgKQoreworICAgIGlmIChnc21fcm9wZV9jYW5fZ3Jvdyhyb3BlLCAxKSkgeworICAgICAgICByb3BlLT5kYXRhWyByb3BlLT5wb3MgXSA9IChieXRlX3QpIGM7CisgICAgfQorICAgIHJvcGUtPnBvcyArPSAxOworfQorCit2b2lkCitnc21fcm9wZV9hZGQoIEdzbVJvcGUgIHJvcGUsIGNvbnN0IHZvaWQqICBidWYsIGludCAgYnVmbGVuICkKK3sKKyAgICBpZiAoZ3NtX3JvcGVfY2FuX2dyb3cocm9wZSwgYnVmbGVuKSkgeworICAgICAgICBtZW1jcHkoIHJvcGUtPmRhdGEgKyByb3BlLT5wb3MsIChjb25zdCBjaGFyKilidWYsIGJ1ZmxlbiApOworICAgIH0KKyAgICByb3BlLT5wb3MgKz0gYnVmbGVuOworfQorCit2b2lkKgorZ3NtX3JvcGVfcmVzZXJ2ZSggR3NtUm9wZSAgcm9wZSwgaW50ICBjb3VudCApCit7CisgICAgdm9pZCogIHJlc3VsdCA9IE5VTEw7CisKKyAgICBpZiAoZ3NtX3JvcGVfY2FuX2dyb3cocm9wZSwgY291bnQpKQorICAgIHsKKyAgICAgICAgaWYgKHJvcGUtPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJvcGUtPmRhdGEgKyByb3BlLT5wb3M7CisgICAgfQorICAgIHJvcGUtPnBvcyArPSBjb3VudDsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHNraXAgYSBnaXZlbiBudW1iZXIgb2YgVW5pY29kZSBjaGFyYWN0ZXJzIGluIGEgdXRmLTggYnl0ZSBzdHJpbmcgKi8KK2NieXRlc190Cit1dGY4X3NraXAoIGNieXRlc190ICAgdXRmOCwKKyAgICAgICAgICAgY2J5dGVzX3QgICB1dGY4ZW5kLAorICAgICAgICAgICBpbnQgICAgICAgIGNvdW50KQoreworICAgIGNieXRlc190ICBwICAgPSB1dGY4OworICAgIGNieXRlc190ICBlbmQgPSB1dGY4ZW5kOworCisgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKSB7CisgICAgICAgIGludCAgYzsKKworICAgICAgICBpZiAocCA+PSBlbmQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjID0gKnArKzsKKyAgICAgICAgaWYgKGMgPiAxMjgpIHsKKyAgICAgICAgICAgIHdoaWxlIChwIDwgZW5kICYmIChwWzBdICYgMHhjMCkgPT0gMHg4MCkKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICBwOworfQorCisKK3N0YXRpYyBfX2lubGluZV9fIGludAordXRmOF9uZXh0KCBjYnl0ZXNfdCAgKnBwLCBjYnl0ZXNfdCAgZW5kICkKK3sKKyAgICBjYnl0ZXNfdCAgcCAgICAgID0gKnBwOworICAgIGludCAgICAgICByZXN1bHQgPSAtMTsKKworICAgIGlmIChwIDwgZW5kKSB7CisgICAgICAgIGludCAgYz0gKnArKzsKKyAgICAgICAgaWYgKGMgPj0gMTI4KSB7CisgICAgICAgICAgICBpZiAoKGMgJiAweGUwKSA9PSAweGMwKQorICAgICAgICAgICAgICAgIGMgJj0gMHgxZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjICYgMHhmMCkgPT0gMHhlMCkKKyAgICAgICAgICAgICAgICBjICY9IDB4MGY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYyAmPSAweDA3OworCisgICAgICAgICAgICB3aGlsZSAocCA8IGVuZCAmJiAocFswXSAmIDB4YzApID09IDB4ODApIHsKKyAgICAgICAgICAgICAgICBjID0gKGMgPDwgNikgfCAocFswXSAmIDB4M2YpOworICAgICAgICAgICAgICAgIHAgKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gYzsKKyAgICAgICAgKnBwICAgID0gcDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK3V0Zjhfd3JpdGUoIGJ5dGVzX3QgIHV0ZjgsIGludCAgb2Zmc2V0LCBpbnQgIHYgKQoreworICAgIGludCAgcmVzdWx0OworCisgICAgaWYgKHYgPCAxMjgpIHsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgaWYgKHV0ZjgpCisgICAgICAgICAgICB1dGY4W29mZnNldF0gPSAoYnl0ZV90KSB2OworICAgIH0gZWxzZSBpZiAodiA8IDB4ODAwKSB7CisgICAgICAgIHJlc3VsdCA9IDI7CisgICAgICAgIGlmICh1dGY4KSB7CisgICAgICAgICAgICB1dGY4W29mZnNldCswXSA9IChieXRlX3QpKCAweGMwIHwgKHYgPj4gNikgKTsKKyAgICAgICAgICAgIHV0Zjhbb2Zmc2V0KzFdID0gKGJ5dGVfdCkoIDB4ODAgfCAodiAmIDB4M2YpICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHYgPCAweDEwMDAwKSB7CisgICAgICAgIHJlc3VsdCA9IDM7CisgICAgICAgIGlmICh1dGY4KSB7CisgICAgICAgICAgICB1dGY4W29mZnNldCswXSA9IChieXRlX3QpKCAweGUwIHwgICh2ID4+IDEyKSApOworICAgICAgICAgICAgdXRmOFtvZmZzZXQrMV0gPSAoYnl0ZV90KSggMHg4MCB8ICgodiA+PiA2KSAmIDB4M2YpICk7CisgICAgICAgICAgICB1dGY4W29mZnNldCsyXSA9IChieXRlX3QpKCAweDgwIHwgICh2ICYgMHgzZikgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IDQ7CisgICAgICAgIGlmICh1dGY4KSB7CisgICAgICAgICAgICB1dGY4W29mZnNldCswXSA9IChieXRlX3QpKCAweGYwIHwgKCh2ID4+IDE4KSAmIDB4NykgKTsKKyAgICAgICAgICAgIHV0Zjhbb2Zmc2V0KzFdID0gKGJ5dGVfdCkoIDB4ODAgfCAoKHYgPj4gMTIpICYgMHgzZikgKTsKKyAgICAgICAgICAgIHV0Zjhbb2Zmc2V0KzJdID0gKGJ5dGVfdCkoIDB4ODAgfCAoKHYgPj4gNikgJiAweDNmKSApOworICAgICAgICAgICAgdXRmOFtvZmZzZXQrM10gPSAoYnl0ZV90KSggMHg4MCB8ICAodiAmIDB4M2YpICk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAordWNzMl93cml0ZSggYnl0ZXNfdCAgdWNzMiwgaW50ICBvZmZzZXQsIGludCAgdiApCit7CisgICAgaWYgKHVjczIpIHsKKyAgICAgICAgdWNzMltvZmZzZXQrMF0gPSAoYnl0ZV90KSAodiA+PiA4KTsKKyAgICAgICAgdWNzMltvZmZzZXQrMV0gPSAoYnl0ZV90KSAodik7CisgICAgfQorICAgIHJldHVybiAyOworfQorCitpbnQKK3V0ZjhfY2hlY2soIGNieXRlc190ICAgcCwgaW50ICB1dGY4bGVuICkKK3sKKyAgICBjYnl0ZXNfdCAgZW5kICAgID0gcCArIHV0ZjhsZW47CisgICAgaW50ICAgICAgIHJlc3VsdCA9IDA7CisKKyAgICBpZiAocCkgeworICAgICAgICB3aGlsZSAocCA8IGVuZCkgeworICAgICAgICAgICAgaW50ICBjID0gKnArKzsKKyAgICAgICAgICAgIGlmIChjID49IDEyOCkgeworICAgICAgICAgICAgICAgIGludCAgbGVuOworICAgICAgICAgICAgICAgIGlmICgoYyAmIDB4ZTApID09IDB4YzApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGMgJiAweGYwKSA9PSAweGUwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjICYgMHhmOCkgPT0gMHhmMCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsgIC8qIG1hbGZvcm1lZCB1dGYtOCAqLworCisgICAgICAgICAgICAgICAgaWYgKHArbGVuID4gZW5kKSAvKiBzdHJpbmcgdG9vIHNob3J0ICovCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAgICAgICAgIGZvciAoIDsgbGVuID4gMDsgbGVuLS0sIHArKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwWzBdICYgMHhjMCkgIT0gMHg4MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CitFeGl0OgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBVQ1MyIHRvIFVURjgKKyAqKi8KKworLyogY29udmVydCBhIFVDUzIgc3RyaW5nIGludG8gYSBVVEY4IGJ5dGUgc3RyaW5nLCBhc3N1bWVzICdidWYnIGlzIGNvcnJlY3RseSBzaXplZCAqLworaW50Cit1Y3MyX3RvX3V0ZjgoIGNieXRlc190ICB1Y3MyLAorICAgICAgICAgICAgICBpbnQgICAgICAgdWNzMmxlbiwKKyAgICAgICAgICAgICAgYnl0ZXNfdCAgIGJ1ZiApCit7CisgICAgaW50ICBubjsKKyAgICBpbnQgIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKG5uID0gMDsgbm4gPCB1Y3MybGVuOyB1Y3MyICs9IDIsIG5uKyspIHsKKyAgICAgICAgaW50ICBjPSAodWNzMlswXSA8PCA4KSB8IHVjczJbMV07CisgICAgICAgIHJlc3VsdCArPSB1dGY4X3dyaXRlKGJ1ZiwgcmVzdWx0LCBjKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogY291bnQgdGhlIG51bWJlciBvZiBVQ1MyIGNoYXJzIGNvbnRhaW5lZCBpbiBhIHV0ZjggYnl0ZSBzdHJpbmcgKi8KK2ludAordXRmOF90b191Y3MyKCBjYnl0ZXNfdCAgdXRmOCwKKyAgICAgICAgICAgICAgaW50ICAgICAgIHV0ZjhsZW4sCisgICAgICAgICAgICAgIGJ5dGVzX3QgICB1Y3MyICkKK3sKKyAgICBjYnl0ZXNfdCAgcCAgICAgID0gdXRmODsKKyAgICBjYnl0ZXNfdCAgZW5kICAgID0gcCArIHV0ZjhsZW47CisgICAgaW50ICAgICAgIHJlc3VsdCA9IDA7CisKKyAgICB3aGlsZSAocCA8IGVuZCkgeworICAgICAgICBpbnQgIGMgPSB1dGY4X25leHQoJnAsIGVuZCk7CisKKyAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcmVzdWx0ICs9IHVjczJfd3JpdGUodWNzMiwgcmVzdWx0LCBjKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdC8yOworfQorCisKKworLyoqIEdTTSBBTFBIQUJFVAorICoqLworCisjZGVmaW5lICBHU01fN0JJVFNfRVNDQVBFICAgMHgxYgorI2RlZmluZSAgR1NNXzdCSVRTX1VOS05PV04gIDAKKworLyogRm9yIGVhY2ggZ3NtNyBjb2RlIHZhbHVlLCB0aGlzIHRhYmxlIGdpdmVzIHRoZSBlcXVpdmFsZW50CisgKiBVVEYtOCBjb2RlIHBvaW50LgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgICBnc203Yml0c190b191bmljb2RlWzEyOF0gPSB7CisgICdAJywgMHhhMywgICckJywgMHhhNSwgMHhlOCwgMHhlOSwgMHhmOSwgMHhlYywgMHhmMiwgMHhjNywgJ1xuJywgMHhkOCwgMHhmOCwgJ1xyJywgMHhjNSwgMHhlNSwKKzB4Mzk0LCAgJ18nLDB4M2E2LDB4MzkzLDB4MzliLDB4M2E5LDB4M2EwLDB4M2E4LDB4M2EzLDB4Mzk4LDB4MzllLCAgICAwLCAweGM2LCAweGU2LCAweGRmLCAweGM5LAorICAnICcsICAnIScsICAnIicsICAnIycsIDB4YTQsICAnJScsICAnJicsICdcJycsICAnKCcsICAnKScsICAnKicsICAnKycsICAnLCcsICAnLScsICAnLicsICAnLycsCisgICcwJywgICcxJywgICcyJywgICczJywgICc0JywgICc1JywgICc2JywgICc3JywgICc4JywgICc5JywgICc6JywgICc7JywgICc8JywgICc9JywgICc+JywgICc/JywKKyAweGExLCAgJ0EnLCAgJ0InLCAgJ0MnLCAgJ0QnLCAgJ0UnLCAgJ0YnLCAgJ0cnLCAgJ0gnLCAgJ0knLCAgJ0onLCAgJ0snLCAgJ0wnLCAgJ00nLCAgJ04nLCAgJ08nLAorICAnUCcsICAnUScsICAnUicsICAnUycsICAnVCcsICAnVScsICAnVicsICAnVycsICAnWCcsICAnWScsICAnWicsIDB4YzQsIDB4ZDYsMHgxNDcsIDB4ZGMsIDB4YTcsCisgMHhiZiwgICdhJywgICdiJywgICdjJywgICdkJywgICdlJywgICdmJywgICdnJywgICdoJywgICdpJywgICdqJywgICdrJywgICdsJywgICdtJywgICduJywgICdvJywKKyAgJ3AnLCAgJ3EnLCAgJ3InLCAgJ3MnLCAgJ3QnLCAgJ3UnLCAgJ3YnLCAgJ3cnLCAgJ3gnLCAgJ3knLCAgJ3onLCAweGU0LCAweGY2LCAweGYxLCAweGZjLCAweGUwLAorfTsKKworLyogRm9yIGVhY2ggZ3NtNyBleHRlbmRlZCBjb2RlIHZhbHVlLCB0aGlzIHRhYmxlIGdpdmVzIHRoZSBlcXVpdmFsZW50CisgKiBVVEYtOCBjb2RlIHBvaW50LgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgIGdzbTdiaXRzX2V4dGVuZF90b191bmljb2RlWzEyOF0gPSB7CisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwnXGYnLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAnXicsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgJ3snLCAnfScsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCdcXCcsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICdbJywgJ34nLCAnXScsICAgMCwKKyAgJ3wnLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLDB4MjBhYywgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorfTsKKworLyoKKyAqIElucHV0OiAgQSBVbmljb2RlIGNvZGUgcG9pbnQKKyAqIE91dHB1dDogSWYgdGhlIGNoYXJhY3RlciByZXByZXNlbnRlZCBieSB0aGUgaW5wdXQgY2FuCisgKiAgICAgICAgIGJlIGVuY29kZWQgYXMgZ3NtNywgdGhlIGdzbTcgY29kZSB2YWx1ZSBpcworICogICAgICAgICByZXR1cm5lZCAoMCAuLiAxMjcpLgorICogICAgICAgICBJZiB0aGUgaW5wdXQgY2Fubm90IGJlIGV4cHJlc3NlZCBieSBhIChub24tCisgKiAgICAgICAgIGV4dGVuZGVkKSBnc203IGNvZGUgdmFsdWUsIC0xIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50Cit1bmljaGFyX3RvX2dzbTcoIGludCAgdW5pY29kZSApCit7CisgICAgaW50ICBubjsKKyAgICBmb3IgKG5uID0gMDsgbm4gPCAxMjg7IG5uKyspIHsKKyAgICAgICAgaWYgKGdzbTdiaXRzX3RvX3VuaWNvZGVbbm5dID09IHVuaWNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBubjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBJbnB1dDogIEEgVW5pY29kZSBjb2RlIHBvaW50CisgKiBPdXRwdXQ6IElmIHRoZSBjaGFyYWN0ZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGlucHV0IGNhbgorICogICAgICAgICBiZSBlbmNvZGVkIGFzIGV4dGVuZGVkIGdzbTcsIHRoZSBleHRlbnNpb24KKyAqICAgICAgICAgY29kZSB2YWx1ZSBpcyByZXR1cm5lZCAoMCAuLiAxMjcpLgorICogICAgICAgICBJZiB0aGUgaW5wdXQgY2Fubm90IGJlIGV4cHJlc3NlZCBieSBhbgorICogICAgICAgICBleHRlbnNpb24gZ3NtNyBjb2RlIHZhbHVlLCAtMSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludAordW5pY2hhcl90b19nc203X2V4dGVuZCggaW50ICB1bmljaGFyICkKK3sKKyAgICBpbnQgIG5uOworICAgIGZvciAobm4gPSAwOyBubiA8IDEyODsgbm4rKykgeworICAgICAgICBpZiAoZ3NtN2JpdHNfZXh0ZW5kX3RvX3VuaWNvZGVbbm5dID09IHVuaWNoYXIpIHsKKyAgICAgICAgICAgIHJldHVybiBubjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VwdGV0cyBuZWVkZWQgdG8gZW5jb2RlIGEgdW5pY29kZSBjaGFyY29kZS4KKyAqIFJldHVybiAwIGlmIHRoZSBjaGFyY29kZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gZ3NtNy4KKyAqLworc3RhdGljIGludAordW5pY2hhcl90b19nc203X2NvdW50KCBpbnQgIHVuaWNvZGUgKQoreworICAgIGludCAgbm47CisKKyAgICBubiA9IHVuaWNoYXJfdG9fZ3NtNyh1bmljb2RlKTsKKyAgICBpZiAobm4gPj0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBubiA9IHVuaWNoYXJfdG9fZ3NtN19leHRlbmQodW5pY29kZSk7CisgICAgaWYgKG5uID49IDApCisgICAgICAgIHJldHVybiAyOworCisgICAgcmV0dXJuIDA7Cit9CisKK2NieXRlc190Cit1dGY4X3NraXBfZ3NtNyggY2J5dGVzX3QgIHV0ZjgsIGNieXRlc190ICB1dGY4ZW5kLCBpbnQgIGdzbTdsZW4gKQoreworICAgIGNieXRlc190ICBwICAgPSB1dGY4OworICAgIGNieXRlc190ICBlbmQgPSB1dGY4ZW5kOworCisgICAgd2hpbGUgKGdzbTdsZW4gPjApIHsKKyAgICAgICAgY2J5dGVzX3QgIHEgPSBwOworICAgICAgICBpbnQgICAgICAgYyA9IHV0ZjhfbmV4dCggJnEsIGVuZCApOworICAgICAgICBpbnQgICAgICAgbGVuOworCisgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxlbiA9IHVuaWNoYXJfdG9fZ3NtN19jb3VudCggYyApOworICAgICAgICBpZiAobGVuID09IDApICAvKiB1bmtub3duIGNoYXJzIGFyZSByZXBsYWNlZCBieSBzcGFjZXMgKi8KKyAgICAgICAgICAgIGxlbiA9IDE7CisKKyAgICAgICAgaWYgKGxlbiA+IGdzbTdsZW4pIC8qIFdlIHdlbnQgdG9vIGZhciAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZ3NtN2xlbiAtPSBsZW47CisgICAgICAgIHAgICAgICAgID0gcTsKKyAgICB9CisgICAgcmV0dXJuICBwOworfQorCisKK2NieXRlc190Cit1dGY4X3NraXBfdWNzMiggY2J5dGVzX3QgIHV0ZjgsIGNieXRlc190ICB1dGY4ZW5kLCBpbnQgIHVjczJsZW4gKQoreworICAgIGNieXRlc190ICBwICAgPSB1dGY4OworICAgIGNieXRlc190ICBlbmQgPSB1dGY4ZW5kOworCisgICAgd2hpbGUgKHVjczJsZW4gPj0gMikgeworICAgICAgICBjYnl0ZXNfdCAgcSA9IHA7CisgICAgICAgIGludCAgICAgICBjID0gdXRmOF9uZXh0KCAmcSwgZW5kICk7CisKKyAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdWNzMmxlbiAtPSAyOyAvLyBBbGwgc3ltYm9scyB0YWtlIDIgYnl0ZXMKKyAgICAgICAgcCAgICAgICA9ICBxOworICAgIH0KKyAgICByZXR1cm4gIHA7Cit9CisKKworaW50Cit1dGY4X2NoZWNrX2dzbTcoIGNieXRlc190ICB1dGY4LAorICAgICAgICAgICAgICAgICBpbnQgICAgICAgdXRmOGxlbiApCit7CisgICAgY2J5dGVzX3QgIHV0ZjhlbmQgPSB1dGY4ICsgdXRmOGxlbjsKKworICAgIHdoaWxlICh1dGY4IDwgdXRmOGVuZCkgeworICAgICAgICBpbnQgIGMgPSB1dGY4X25leHQoICZ1dGY4LCB1dGY4ZW5kICk7CisgICAgICAgIGlmICh1bmljaGFyX3RvX2dzbTdfY291bnQoYykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworCitpbnQKK3V0ZjhfZnJvbV9nc203KCBjYnl0ZXNfdCAgc3JjLAorICAgICAgICAgICAgICAgIGludCAgICAgICBzZXB0ZXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgIGludCAgICAgICBzZXB0ZXRfY291bnQsCisgICAgICAgICAgICAgICAgYnl0ZXNfdCAgIHV0ZjggKQoreworICAgIGludCAgc2hpZnQgICA9IChzZXB0ZXRfb2Zmc2V0ICYgNyk7CisgICAgaW50ICBlc2NhcGVkID0gMDsKKyAgICBpbnQgIHJlc3VsdCAgPSAwOworCisgICAgc3JjICs9IChzZXB0ZXRfb2Zmc2V0ID4+IDMpOworICAgIGZvciAoIDsgc2VwdGV0X2NvdW50ID4gMDsgc2VwdGV0X2NvdW50LS0gKQorICAgIHsKKyAgICAgICAgaW50ICBjID0gKHNyY1swXSA+PiBzaGlmdCkgJiAweDdmOworICAgICAgICBpbnQgIHY7CisKKyAgICAgICAgaWYgKHNoaWZ0ID4gMSkgeworICAgICAgICAgICAgYyA9ICgoc3JjWzFdIDw8ICg4LXNoaWZ0KSkgfCBjKSAmIDB4N2Y7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXNjYXBlZCkgeworICAgICAgICAgICAgdiA9IGdzbTdiaXRzX2V4dGVuZF90b191bmljb2RlW2NdOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gR1NNXzdCSVRTX0VTQ0FQRSkgeworICAgICAgICAgICAgZXNjYXBlZCA9IDE7CisgICAgICAgICAgICBnb3RvIE5leHRTZXB0ZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gZ3NtN2JpdHNfdG9fdW5pY29kZVtjXTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCArPSB1dGY4X3dyaXRlKCB1dGY4LCByZXN1bHQsIHYgKTsKKworICAgIE5leHRTZXB0ZXQ6CisgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgIGlmIChzaGlmdCA+PSA4KSB7CisgICAgICAgICAgICBzaGlmdCAtPSA4OworICAgICAgICAgICAgc3JjICAgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIHJlc3VsdDsKK30KKworCitpbnQKK3V0ZjhfZnJvbV9nc204KCBjYnl0ZXNfdCAgc3JjLCBpbnQgIGNvdW50LCBieXRlc190ICB1dGY4ICkKK3sKKyAgICBpbnQgIHJlc3VsdCAgPSAwOworICAgIGludCAgZXNjYXBlZCA9IDA7CisKKworICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKKyAgICB7CisgICAgICAgIGludCAgYyA9ICpzcmMrKzsKKworICAgICAgICBpZiAoYyA9PSAweGZmKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGMgPT0gR1NNXzdCSVRTX0VTQ0FQRSkgeworICAgICAgICAgICAgaWYgKGVzY2FwZWQpIHsgLyogdHdvIGVzY2FwZSBjaGFyYWN0ZXJzID0+IG9uZSBzcGFjZSAqLworICAgICAgICAgICAgICAgIGMgPSAweDIwOworICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlc2NhcGVkID0gMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjID49IDB4ODApIHsKKyAgICAgICAgICAgICAgICBjICAgICAgID0gMHgyMDsKKyAgICAgICAgICAgICAgICBlc2NhcGVkID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXNjYXBlZCkgeworICAgICAgICAgICAgICAgIGMgPSBnc203Yml0c19leHRlbmRfdG9fdW5pY29kZVtjXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGMgPSBnc203Yml0c190b191bmljb2RlW2NdOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ICs9IHV0Zjhfd3JpdGUoIHV0ZjgsIHJlc3VsdCwgYyApOworICAgIH0KKyAgICByZXR1cm4gIHJlc3VsdDsKK30KKworLyogY29udmVydCBhIEdTTSA3LWJpdCBtZXNzYWdlIGludG8gYSB1bmljb2RlIGNoYXJhY3RlciBhcnJheQorICogdGhlICdkc3QnIGFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxNjAgY2hhcnMuIHRoZSBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZGVjb2RlZAorICoKKyAqIGFzc3VtZXMgdGhlICdkc3QnIGFycmF5IGhhcyBhdCBsZWFzdCBzZXB0ZXRfY291bnQgaXRlbXMsIHJldHVybnMgdGhlCisgKiBudW1iZXIgb2YgdW5pY2hhcnMgcmVhbGx5IHdyaXR0ZW4KKyAqLworaW50Cit1Y3MyX2Zyb21fZ3NtNyggYnl0ZXNfdCAgIHVjczIsCisgICAgICAgICAgICAgICAgY2J5dGVzX3QgIHNyYywKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgc2VwdGV0X29mZnNldCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgc2VwdGV0X2NvdW50ICkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcCAgICAgPSBzcmMgKyAoc2VwdGV0X29mZnNldCA+PiAzKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoc2VwdGV0X29mZnNldCAmIDcpOworICAgIGludCAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVzdWx0ICA9IDA7CisKKyAgICBmb3IgKCA7IHNlcHRldF9jb3VudCA+IDA7IHNlcHRldF9jb3VudC0tICkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkICB2YWwgID0gKHBbMF0gPj4gc2hpZnQpICYgMHg3ZjsKKworICAgICAgICBpZiAoc2hpZnQgPiAxKQorICAgICAgICAgICAgdmFsID0gKHZhbCB8IChwWzFdIDw8ICg4LXNoaWZ0KSkpICYgMHg3ZjsKKworICAgICAgICBpZiAoZXNjYXBlZCkgeworICAgICAgICAgICAgaW50ICBjID0gZ3NtN2JpdHNfdG9fdW5pY29kZVt2YWxdOworCisgICAgICAgICAgICByZXN1bHQgKz0gdWNzMl93cml0ZSh1Y3MyLCByZXN1bHQsIGMpOworICAgICAgICAgICAgZXNjYXBlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsID09IEdTTV83QklUU19FU0NBUEUpIHsKKyAgICAgICAgICAgIGVzY2FwZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdmFsID0gZ3NtN2JpdHNfZXh0ZW5kX3RvX3VuaWNvZGVbdmFsXTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMCkKKyAgICAgICAgICAgICAgICB2YWwgPSAweDIwOworCisgICAgICAgICAgICByZXN1bHQgKz0gdWNzMl93cml0ZSggdWNzMiwgcmVzdWx0LCB2YWwgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LzI7Cit9CisKKworLyogY291bnQgdGhlIG51bWJlciBvZiBzZXB0ZXRzIHJlcXVpcmVkIHRvIHdyaXRlIGEgdXRmOCBzdHJpbmcgKi8KK3N0YXRpYyBpbnQKK3V0ZjhfdG9fZ3NtN19jb3VudCggY2J5dGVzX3QgIHV0ZjgsIGludCAgdXRmOGxlbiApCit7CisgICAgY2J5dGVzX3QgIHV0ZjhlbmQgPSB1dGY4ICsgdXRmOGxlbjsKKyAgICBpbnQgICAgICAgcmVzdWx0ICA9IDA7CisKKyAgICB3aGlsZSAoIHV0ZjggPCB1dGY4ZW5kICkgeworICAgICAgICBpbnQgIGxlbjsKKyAgICAgICAgaW50ICBjID0gdXRmOF9uZXh0KCAmdXRmOCwgdXRmOGVuZCApOworCisgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGxlbiA9IHVuaWNoYXJfdG9fZ3NtN19jb3VudChjKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSAgICAvKiByZXBsYWNlIG5vbi1yZXByZXNlbnRhYmxlcyB3aXRoIHNwYWNlICovCisgICAgICAgICAgICBsZW4gPSAxOworCisgICAgICAgIHJlc3VsdCArPSBsZW47CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBieXRlc190ICAgZHN0OworICAgIHVuc2lnbmVkICBwYWQ7CisgICAgaW50ICAgICAgIGJpdHM7CisgICAgaW50ICAgICAgIG9mZnNldDsKK30gQldyaXRlclJlYywgKkJXcml0ZXI7CisKK3N0YXRpYyB2b2lkCitid3JpdGVyX2luaXQoIEJXcml0ZXIgIHdyaXRlciwgYnl0ZXNfdCAgZHN0LCBpbnQgIHN0YXJ0ICkKK3sKKyAgICBpbnQgIHNoaWZ0ID0gc3RhcnQgJiA3OworCisgICAgd3JpdGVyLT5kc3QgICAgPSBkc3QgKyAoc3RhcnQgPj4gMyk7CisgICAgd3JpdGVyLT5wYWQgICAgPSAwOworICAgIHdyaXRlci0+Yml0cyAgID0gc2hpZnQ7CisgICAgd3JpdGVyLT5vZmZzZXQgPSBzdGFydDsKKworICAgIGlmIChzaGlmdCA+IDApIHsKKyAgICAgICAgd3JpdGVyLT5wYWQgID0gd3JpdGVyLT5kc3RbMF0gJiB+KDB4RkYgPDwgc2hpZnQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2J3cml0ZXJfYWRkNyggQldyaXRlciAgd3JpdGVyLCB1bnNpZ25lZCAgdmFsdWUgKQoreworICAgIHdyaXRlci0+cGFkICB8PSAodW5zaWduZWQpKHZhbHVlIDw8IHdyaXRlci0+Yml0cyk7CisgICAgd3JpdGVyLT5iaXRzICs9IDc7CisgICAgaWYgKHdyaXRlci0+Yml0cyA+PSA4KSB7CisgICAgICAgIHdyaXRlci0+ZHN0WzBdID0gKGJ5dGVfdCl3cml0ZXItPnBhZDsKKyAgICAgICAgd3JpdGVyLT5iaXRzICAtPSA4OworICAgICAgICB3cml0ZXItPnBhZCAgPj49IDg7CisgICAgICAgIHdyaXRlci0+ZHN0ICAgKz0gMTsKKyAgICB9CisgICAgd3JpdGVyLT5vZmZzZXQgKz0gNzsKK30KKworc3RhdGljIGludAorYndyaXRlcl9kb25lKCBCV3JpdGVyICB3cml0ZXIgKQoreworICAgIGlmICh3cml0ZXItPmJpdHMgPiAwKSB7CisgICAgICAgIHdyaXRlci0+ZHN0WzBdID0gKGJ5dGVfdCl3cml0ZXItPnBhZDsKKyAgICAgICAgd3JpdGVyLT5wYWQgICAgPSAwOworICAgICAgICB3cml0ZXItPmJpdHMgICA9IDA7CisgICAgICAgIHdyaXRlci0+ZHN0ICAgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXRlci0+b2Zmc2V0OworfQorCisvKiBjb252ZXJ0IGEgdXRmOCBzdHJpbmcgdG8gYSBnc203IGJ5dGUgc3RyaW5nIC0gcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VwdGV0cyB3cml0dGVuICovCitpbnQKK3V0ZjhfdG9fZ3NtNyggY2J5dGVzX3QgIHV0ZjgsIGludCAgdXRmOGxlbiwgYnl0ZXNfdCAgZHN0LCBpbnQgb2Zmc2V0ICkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgdXRmOGVuZCA9IHV0ZjggKyB1dGY4bGVuOworICAgIEJXcml0ZXJSZWMgICAgICAgICAgICB3cml0ZXJbMV07CisKKyAgICBpZiAoZHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiB1dGY4X3RvX2dzbTdfY291bnQodXRmOCwgdXRmOGxlbik7CisKKyAgICBid3JpdGVyX2luaXQoIHdyaXRlciwgZHN0LCBvZmZzZXQgKTsKKyAgICB3aGlsZSAoIHV0ZjggPCB1dGY4ZW5kICkgeworICAgICAgICBpbnQgIGMgPSB1dGY4X25leHQoICZ1dGY4LCB1dGY4ZW5kICk7CisgICAgICAgIGludCAgbm47CisKKyAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbm4gPSB1bmljaGFyX3RvX2dzbTcoYyk7CisgICAgICAgIGlmIChubiA+PSAwKSB7CisgICAgICAgICAgICBid3JpdGVyX2FkZDcoIHdyaXRlciwgbm4gKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbm4gPSB1bmljaGFyX3RvX2dzbTdfZXh0ZW5kKGMpOworICAgICAgICBpZiAobm4gPj0gMCkgeworICAgICAgICAgICAgYndyaXRlcl9hZGQ3KCB3cml0ZXIsIEdTTV83QklUU19FU0NBUEUgKTsKKyAgICAgICAgICAgIGJ3cml0ZXJfYWRkNyggd3JpdGVyLCBubiApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiB1bmtub3duID0+IHJlcGxhY2VkIGJ5IHNwYWNlICovCisgICAgICAgIGJ3cml0ZXJfYWRkNyggd3JpdGVyLCAweDIwICk7CisgICAgfQorICAgIHJldHVybiAgYndyaXRlcl9kb25lKCB3cml0ZXIgKTsKK30KKworCitpbnQKK3V0ZjhfdG9fZ3NtOCggY2J5dGVzX3QgIHV0ZjgsIGludCAgdXRmOGxlbiwgYnl0ZXNfdCAgZHN0ICkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgdXRmOGVuZCA9IHV0ZjggKyB1dGY4bGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICByZXN1bHQgID0gMDsKKworICAgIHdoaWxlICggdXRmOCA8IHV0ZjhlbmQgKSB7CisgICAgICAgIGludCAgYyA9IHV0ZjhfbmV4dCggJnV0ZjgsIHV0ZjhlbmQgKTsKKyAgICAgICAgaW50ICBubjsKKworICAgICAgICBpZiAoYyA8IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBubiA9IHVuaWNoYXJfdG9fZ3NtNyhjKTsKKyAgICAgICAgaWYgKG5uID49IDApIHsKKyAgICAgICAgICAgIGlmIChkc3QpCisgICAgICAgICAgICAgICAgZHN0W3Jlc3VsdF0gPSAoYnl0ZV90KW5uOworICAgICAgICAgICAgcmVzdWx0ICs9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG5uID0gdW5pY2hhcl90b19nc203X2V4dGVuZChjKTsKKyAgICAgICAgaWYgKG5uID49IDApIHsKKyAgICAgICAgICAgIGlmIChkc3QpIHsKKyAgICAgICAgICAgICAgICBkc3RbcmVzdWx0KzBdID0gKGJ5dGVfdCkgR1NNXzdCSVRTX0VTQ0FQRTsKKyAgICAgICAgICAgICAgICBkc3RbcmVzdWx0KzFdID0gKGJ5dGVfdCkgbm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgKz0gMjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogdW5rbm93biA9PiBzcGFjZSAqLworICAgICAgICBpZiAoZHN0KQorICAgICAgICAgICAgZHN0W3Jlc3VsdF0gPSAweDIwOworICAgICAgICByZXN1bHQgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisKKworaW50Cit1Y3MyX3RvX2dzbTcoIGNieXRlc190ICB1Y3MyLCBpbnQgIHVjczJsZW4sIGJ5dGVzX3QgIGRzdCwgaW50IG9mZnNldCApCit7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogIHVjczJlbmQgPSB1Y3MyICsgdWNzMmxlbioyOworICAgIEJXcml0ZXJSZWMgICAgICAgICAgICB3cml0ZXJbMV07CisKKyAgICBid3JpdGVyX2luaXQoIHdyaXRlciwgZHN0LCBvZmZzZXQgKTsKKyAgICB3aGlsZSAoIHVjczIgPCB1Y3MyZW5kICkgeworICAgICAgICBpbnQgIGMgPSAqdWNzMisrOworICAgICAgICBpbnQgIG5uOworCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IDEyODsgbm4rKykgeworICAgICAgICAgICAgaWYgKCBnc203Yml0c190b191bmljb2RlW25uXSA9PSBjICkgeworICAgICAgICAgICAgICAgIGJ3cml0ZXJfYWRkNyggd3JpdGVyLCBubiApOworICAgICAgICAgICAgICAgIGdvdG8gTmV4dFVuaWNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgMTI4OyBubisrKSB7CisgICAgICAgICAgICBpZiAoIGdzbTdiaXRzX2V4dGVuZF90b191bmljb2RlW25uXSA9PSBjICkgeworICAgICAgICAgICAgICAgIGJ3cml0ZXJfYWRkNyggd3JpdGVyLCBHU01fN0JJVFNfRVNDQVBFICk7CisgICAgICAgICAgICAgICAgYndyaXRlcl9hZGQ3KCB3cml0ZXIsIG5uICk7CisgICAgICAgICAgICAgICAgZ290byBOZXh0VW5pY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHVua25vd24gKi8KKyAgICAgICAgYndyaXRlcl9hZGQ3KCB3cml0ZXIsIDB4MjAgKTsKKworICAgIE5leHRVbmljb2RlOgorICAgICAgICA7CisgICAgfQorICAgIHJldHVybiAgYndyaXRlcl9kb25lKCB3cml0ZXIgKTsKK30KKworCitpbnQKK3VjczJfdG9fZ3NtOCggY2J5dGVzX3QgIHVjczIsIGludCAgdWNzMmxlbiwgYnl0ZXNfdCAgZHN0ICkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgdWNzMmVuZCA9IHVjczIgKyB1Y3MybGVuKjI7CisgICAgYnl0ZXNfdCAgICAgICAgICAgICAgIGRzdDAgICAgPSBkc3Q7CisKKyAgICB3aGlsZSAoIHVjczIgPCB1Y3MyZW5kICkgeworICAgICAgICBpbnQgIGMgPSAqdWNzMisrOworICAgICAgICBpbnQgIG5uOworCisgICAgICAgIGZvciAobm4gPSAwOyBubiA8IDEyODsgbm4rKykgeworICAgICAgICAgICAgaWYgKCBnc203Yml0c190b191bmljb2RlW25uXSA9PSBjICkgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IChieXRlX3Qpbm47CisgICAgICAgICAgICAgICAgZ290byBOZXh0VW5pY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCAxMjg7IG5uKyspIHsKKyAgICAgICAgICAgIGlmICggZ3NtN2JpdHNfZXh0ZW5kX3RvX3VuaWNvZGVbbm5dID09IGMgKSB7CisgICAgICAgICAgICAgICAgZHN0WzBdID0gKGJ5dGVfdCkgR1NNXzdCSVRTX0VTQ0FQRTsKKyAgICAgICAgICAgICAgICBkc3RbMV0gPSAoYnl0ZV90KSBubjsKKyAgICAgICAgICAgICAgICBkc3QgICArPSAyOworICAgICAgICAgICAgICAgIGdvdG8gTmV4dFVuaWNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiB1bmtub3duICovCisgICAgICAgICpkc3QrKyA9IDB4MjA7CisKKyAgICBOZXh0VW5pY29kZToKKyAgICAgICAgOworICAgIH0KKyAgICByZXR1cm4gKGRzdCAtIGRzdDApOworfQorCitpbnQKK2dzbV9iY2RudW1fdG9fYXNjaWkoIGNieXRlc190ICBiY2QsIGludCAgY291bnQsIGJ5dGVzX3QgIGRzdCApCit7CisgICAgaW50ICByZXN1bHQgPSAwOworICAgIGludCAgc2hpZnQgID0gMDsKKworICAgIHdoaWxlIChjb3VudCA+IDApIHsKKyAgICAgICAgaW50ICBjID0gKGJjZFswXSA+PiBzaGlmdCkgJiAweGY7CisKKyAgICAgICAgaWYgKGMgPT0gMTUgJiYgY291bnQgPT0gMSkgIC8qIGlnbm9yZSB0cmFpbGluZyAweGYgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChjID49IDE0KQorICAgICAgICAgICAgYyA9IDA7CisKKyAgICAgICAgaWYgKGRzdCkgZHN0W3Jlc3VsdF0gPSAiMDEyMzQ1Njc4OSojLE4iW2NdOworICAgICAgICByZXN1bHQgKz0gMTsKKworICAgICAgICBzaGlmdCArPSA0OworICAgICAgICBpZiAoc2hpZnQgPT0gOCkgeworICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgYmNkICs9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisKKworaW50Citnc21fYmNkbnVtX2Zyb21fYXNjaWkoIGNieXRlc190ICBhc2NpaSwgaW50ICBhc2NpaWxlbiwgYnl0ZXNfdCAgZHN0ICkKK3sKKyAgICBjYnl0ZXNfdCAgZW5kID0gYXNjaWkgKyBhc2NpaWxlbjsKKyAgICBpbnQgIHJlc3VsdCAgID0gMDsKKyAgICBpbnQgIHBoYXNlID0gMHgwMTsKKworICAgIHdoaWxlIChhc2NpaSA8IGVuZCkgeworICAgICAgICBpbnQgIGMgPSAqYXNjaWkrKzsKKworICAgICAgICBpZiAoYyA9PSAnKicpCisgICAgICAgICAgICBjID0gMTA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJyMnKQorICAgICAgICAgICAgYyA9IDExOworICAgICAgICBlbHNlIGlmIChjID09ICcsJykKKyAgICAgICAgICAgIGMgPSAxMjsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnTicpCisgICAgICAgICAgICBjID0gMTM7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYyAtPSAnMCc7CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKWMgPj0gMTBVKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBwaGFzZSAgID0gKHBoYXNlIDw8IDQpIHwgYzsKKyAgICAgICAgcmVzdWx0ICs9IDE7CisgICAgICAgIGlmIChwaGFzZSAmIDB4MTAwKSB7CisgICAgICAgICAgICBpZiAoZHN0KSBkc3RbcmVzdWx0LzJdID0gKGJ5dGVfdCkgcGhhc2U7CisgICAgICAgICAgICBwaGFzZSAgID0gMHgwMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHQgJiAxKSB7CisgICAgICAgIGlmIChkc3QpIGRzdFtyZXN1bHQvMl0gPSAoYnl0ZV90KShwaGFzZSB8IDB4ZjApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiogQUROOiBBYmJyZXZpYXRlZCBEaWFsaW5nIE51bWJlcgorICoqLworCisjZGVmaW5lICBBRE5fRk9PVEVSX1NJWkUgICAgIDE0CisjZGVmaW5lICBBRE5fT0ZGU0VUX05VTUJFUl9MRU5HVEggICAwCisjZGVmaW5lICBBRE5fT0ZGU0VUX1RPTl9OUEkgICAgICAgICAxCisjZGVmaW5lICBBRE5fT0ZGU0VUX05VTUJFUl9TVEFSVCAgICAyCisjZGVmaW5lICBBRE5fT0ZGU0VUX05VTUJFUl9FTkQgICAgICAxMQorI2RlZmluZSAgQUROX09GRlNFVF9DQVBBQklMSVRZX0lEICAgMTIKKyNkZWZpbmUgIEFETl9PRkZTRVRfRVhURU5TSU9OX0lEICAgIDEzCisKKy8qIHNlZSAxMC41LjEgb2YgM0dQUCA1MS4wMTEgKi8KK3N0YXRpYyBpbnQKK3NpbV9hZG5fYWxwaGFfdG9fdXRmOCggY2J5dGVzX3QgIGFscGhhLCBjYnl0ZXNfdCAgZW5kLCBieXRlc190ICBkc3QgKQoreworICAgIGludCAgcmVzdWx0ID0gMDsKKworICAgIC8qIGlnbm9yZSB0cmFpbGluZyAweGZmICovCisgICAgd2hpbGUgKGFscGhhIDwgZW5kICYmIGVuZFstMV0gPT0gMHhmZikKKyAgICAgICAgZW5kLS07CisKKyAgICBpZiAoYWxwaGEgPj0gZW5kKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChhbHBoYVswXSA9PSAweDgwKSB7IC8qIFVDUy8yIHNvdXJjZSBlbmNvZGluZyAqLworICAgICAgICBhbHBoYSArPSAxOworICAgICAgICByZXN1bHQgPSB1Y3MyX3RvX3V0ZjgoIGFscGhhLCAoZW5kLWFscGhhKS8yLCBkc3QgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50ICBpc191Y3MyID0gMDsKKyAgICAgICAgaW50ICBsZW4gPSAwLCBiYXNlID0gMDsKKworICAgICAgICBpZiAoYWxwaGErMyA8PSBlbmQgJiYgYWxwaGFbMF0gPT0gMHg4MSkgeworICAgICAgICAgICAgaXNfdWNzMiA9IDE7CisgICAgICAgICAgICBsZW4gICAgID0gYWxwaGFbMV07CisgICAgICAgICAgICBiYXNlICAgID0gYWxwaGFbMl0gPDwgNzsKKyAgICAgICAgICAgIGFscGhhICArPSAzOworICAgICAgICAgICAgaWYgKGxlbiA+IGVuZC1hbHBoYSkKKyAgICAgICAgICAgICAgICBsZW4gPSBlbmQtYWxwaGE7CisgICAgICAgIH0gZWxzZSBpZiAoYWxwaGErNCA8PSBlbmQgJiYgYWxwaGFbMF0gPT0gMHg4MikgeworICAgICAgICAgICAgaXNfdWNzMiA9IDE7CisgICAgICAgICAgICBsZW4gICAgID0gYWxwaGFbMV07CisgICAgICAgICAgICBiYXNlICAgID0gKGFscGhhWzJdIDw8IDgpIHwgYWxwaGFbM107CisgICAgICAgICAgICBhbHBoYSAgKz0gNDsKKyAgICAgICAgICAgIGlmIChsZW4gPiBlbmQtYWxwaGEpCisgICAgICAgICAgICAgICAgbGVuID0gZW5kLWFscGhhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzX3VjczIpIHsKKyAgICAgICAgICAgIGVuZCA9IGFscGhhICsgbGVuOworICAgICAgICAgICAgd2hpbGUgKGFscGhhIDwgZW5kKSB7CisgICAgICAgICAgICAgICAgaW50ICBjID0gYWxwaGFbMF07CisgICAgICAgICAgICAgICAgaWYgKGMgPj0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdXRmOF93cml0ZShkc3QsIHJlc3VsdCwgYmFzZSArIChjICYgMHg3ZikpOworICAgICAgICAgICAgICAgICAgICBhbHBoYSAgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBHU00gY2hhcmFjdGVyIHNldCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgICBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb3VudCA9IDA7IGFscGhhK2NvdW50IDwgZW5kICYmIGFscGhhW2NvdW50XSA8IDEyODsgY291bnQrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHV0ZjhfZnJvbV9nc204KGFscGhhLCBjb3VudCwgKGRzdCA/IGRzdCtyZXN1bHQgOiBOVUxMKSk7CisgICAgICAgICAgICAgICAgICAgIGFscGhhICArPSBjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSB1dGY4X2Zyb21fZ3NtOChhbHBoYSwgZW5kLWFscGhhLCBkc3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50CitzaW1fYWRuX2FscGhhX2Zyb21fdXRmOCggY2J5dGVzX3QgIHV0ZjgsIGludCAgdXRmOGxlbiwgYnl0ZXNfdCAgZHN0ICkKK3sKKyAgICBpbnQgICByZXN1bHQgPSAwOworCisgICAgaWYgKHV0ZjhfY2hlY2tfZ3NtNyh1dGY4LCB1dGY4bGVuKSkgeworICAgICAgICAvKiBHU00gNy1iaXQgY29tcGF0aWJsZSwgZW5jb2RlIGRpcmVjdGx5IGFzIDgtYml0IHN0cmluZyAqLworICAgICAgICByZXN1bHQgPSB1dGY4X3RvX2dzbTgodXRmOCwgdXRmOGxlbiwgZHN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBvdGhlcndpc2UsIHNpbXBseSB0cnkgVUNTLTIgZW5jb2RpbmcsIG5vdGhpbmcgbW9yZSBzZXJpb3VzIGF0IHRoZSBtb21lbnQgKi8KKyAgICAgICAgaWYgKGRzdCkgeworICAgICAgICAgICAgZHN0WzBdID0gMHg4MDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSAxICsgdXRmOF90b191Y3MyKHV0ZjgsIHV0ZjhsZW4sIGRzdCA/IChkc3QrMSkgOiBOVUxMKSoyOworICAgIH0KKyAgICByZXR1cm4gIHJlc3VsdDsKK30KKyNlbmRpZgorCitpbnQKK3NpbV9hZG5fcmVjb3JkX2Zyb21fYnl0ZXMoIFNpbUFkblJlY29yZCAgcmVjLCBjYnl0ZXNfdCAgZGF0YSwgaW50ICBsZW4gKQoreworICAgIGNieXRlc190ICBlbmQgICAgPSBkYXRhICsgbGVuOworICAgIGNieXRlc190ICBmb290ZXIgPSBlbmQgLSBBRE5fRk9PVEVSX1NJWkU7CisgICAgaW50ICAgICAgIG51bV9sZW47CisKKyAgICByZWMtPmFkbi5hbHBoYVswXSAgPSAwOworICAgIHJlYy0+YWRuLm51bWJlclswXSA9IDA7CisgICAgcmVjLT5leHRfcmVjb3JkICAgID0gMHhmZjsKKworICAgIGlmIChsZW4gPCBBRE5fRk9PVEVSX1NJWkUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIGFscGhhIGlzIG9wdGlvbmFsICovCisgICAgaWYgKGxlbiA+IEFETl9GT09URVJfU0laRSkgeworICAgICAgICBjYnl0ZXNfdCAgZGF0YWVuZCA9IGRhdGEgKyBsZW4gLSBBRE5fRk9PVEVSX1NJWkU7CisgICAgICAgIGludCAgICAgICBjb3VudCAgID0gc2ltX2Fkbl9hbHBoYV90b191dGY4KGRhdGEsIGRhdGFlbmQsIE5VTEwpOworCisgICAgICAgIGlmIChjb3VudCA+IHNpemVvZihyZWMtPmFkbi5hbHBoYSktMSkgIC8qIHRvbyBsb25nICovCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgc2ltX2Fkbl9hbHBoYV90b191dGY4KGRhdGEsIGRhdGFlbmQsIHJlYy0+YWRuLmFscGhhKTsKKyAgICAgICAgcmVjLT5hZG4uYWxwaGFbY291bnRdID0gMDsKKyAgICB9CisKKyAgICBudW1fbGVuID0gZm9vdGVyW0FETl9PRkZTRVRfTlVNQkVSX0xFTkdUSF07CisgICAgaWYgKG51bV9sZW4gPiAxMSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogZGVjb2RlIFRPTiBhbmQgbnVtYmVyIHRvIEFTQ0lJLCBOT1RFOiB0aGlzIGlzIGxvc3N5ICEhICovCisgICAgeworICAgICAgICBpbnQgICAgICB0b24gICAgPSBmb290ZXJbQUROX09GRlNFVF9UT05fTlBJXTsKKyAgICAgICAgYnl0ZXNfdCAgbnVtYmVyID0gKGJ5dGVzX3QpIHJlYy0+YWRuLm51bWJlcjsKKyAgICAgICAgaW50ICAgICAgbGVuICAgID0gc2l6ZW9mKHJlYy0+YWRuLm51bWJlciktMTsKKyAgICAgICAgaW50ICAgICAgY291bnQ7CisKKyAgICAgICAgaWYgKHRvbiAhPSAweDgxICYmIHRvbiAhPSAweDkxKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmICh0b24gPT0gMHg5MSkgeworICAgICAgICAgICAgKm51bWJlcisrID0gJysnOworICAgICAgICAgICAgbGVuICAgICAgLT0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50ID0gZ3NtX2JjZG51bV90b19hc2NpaSggZm9vdGVyICsgQUROX09GRlNFVF9OVU1CRVJfU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2xlbioyLCBudW1iZXIgKTsKKyAgICAgICAgbnVtYmVyW2NvdW50XSA9IDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK3NpbV9hZG5fcmVjb3JkX3RvX2J5dGVzKCBTaW1BZG5SZWNvcmQgIHJlYywgYnl0ZXNfdCAgIGRhdGEsIGludCAgZGF0YWxlbiApCit7CisgICAgYnl0ZXNfdCAgIGVuZCAgICA9IGRhdGEgKyBkYXRhbGVuOworICAgIGJ5dGVzX3QgICBmb290ZXIgPSBlbmQgLSBBRE5fRk9PVEVSX1NJWkU7CisgICAgLy9pbnQgICAgICAgdG9uICAgID0gMHg4MTsKKyAgICBjYnl0ZXNfdCAgbnVtYmVyID0gKGNieXRlc190KSByZWMtPmFkbi5udW1iZXI7CisKKyAgICBpZiAobnVtYmVyWzBdID09ICcrJykgeworICAgICAgICAvL3RvbiAgICAgPSAweDkxOworICAgICAgICBudW1iZXIgKz0gMTsKKyAgICB9CisgICAgZm9vdGVyWzBdID0gKHN0cmxlbigoY29uc3QgY2hhciopbnVtYmVyKSsxKS8yICsgMTsKKyAgICAvKiBYWFhYOiBUT0RPICovCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L2dzbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9nc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA5MThlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9nc20uaApAQCAtMCwwICsxLDIwNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworLyoqIFVTRUZVTCBUWVBFUworICoqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIGJ5dGVfdDsKK3R5cGVkZWYgYnl0ZV90KiAgICAgICAgYnl0ZXNfdDsKK3R5cGVkZWYgY29uc3QgYnl0ZV90KiAgY2J5dGVzX3Q7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEJDRAorICoqLworCisvKiBjb252ZXJ0IGEgOC1iaXQgdmFsdWUgaW50byB0aGUgY29ycmVzcG9uZGluZyBuaWJibGUtYmNkIGJ5dGUgKi8KK2V4dGVybiBieXRlX3QgICBnc21faW50X3RvX2JjZGkoIGludCAgdmFsdWUgKTsKKworLyogY29udmVydCBhIG5pYmJsZS1iY2QgYnl0ZSBpbnRvIGFuIGludCwgaW52YWxpZCBuaWJibGVzIGFyZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gMCAqLworZXh0ZXJuIGludCAgICAgIGdzbV9pbnRfZnJvbV9iY2RpKCBieXRlX3QgIHZhbHVlICk7CisKKy8qKiBIRVgKKyAqKi8KKworLyogdHJ5IHRvIGNvbnZlcnQgYSBoZXggc3RyaW5nIGludG8gYSBieXRlIHN0cmluZywgYXNzdW1lcyAnZHN0JyBpcyBwcm9wZXJseSBzaXplZCwgYW5kIGhleGxlbiBpcyBldmVuLgorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9uIGV4aXQsIG9yIC0xIGluIGNhc2Ugb2YgYmFkbHkgZm9ybWF0dGVkIGRhdGEgKi8KK2V4dGVybiBpbnQgICAgICBnc21faGV4X3RvX2J5dGVzICAoIGNieXRlc190ICBoZXgsIGludCAgaGV4bGVuLCBieXRlc190ICBkc3QgKTsKKworLyogY29udmVydCBhIGhleCBzdHJpbmcgaW50byBhIGJ5dGUgc3RyaW5nLCBhc3N1bWVzICdkc3QnIGlzIHByb3Blcmx5IHNpemVkLCBhbmQgaGV4bGVuIGlzIGV2ZW4uCisgKiBubyBjaGVja3MgYXJlIHBlcmZvcm1lZCAqLworZXh0ZXJuIHZvaWQgICAgIGdzbV9oZXhfdG9fYnl0ZXMwICggY2J5dGVzX3QgIGhleCwgaW50ICBoZXhsZW4sIGJ5dGVzX3QgIGRzdCApOworCisvKiBjb252ZXJ0IGEgYnl0ZSBzdHJpbmcgaW50byBhIGhleCBzdHJpbmcsIGFzc3VtZXMgJ2hleCcgaXMgcHJvcGVybHkgc2l6ZWQgKi8KK2V4dGVybiB2b2lkICAgICBnc21faGV4X2Zyb21fYnl0ZXMoIGNoYXIqICBoZXgsIGNieXRlc190ICBzcmMsIGludCAgc3JjbGVuICk7CisKKy8qIGNvbnZlcnQgYSBoZXhjaGFyIHRvIGFuIGludCwgcmV0dXJucyAtMSBvbiBlcnJvciAqLworZXh0ZXJuIGludCAgICAgIGdzbV9oZXhjaGFyX3RvX2ludCggY2hhciAgYyApOworCisvKiBjb252ZXJ0IGEgaGV4Y2hhciB0byBhbiBpbnQsIHJldHVybnMgMCBvbiBlcnJvciAqLworZXh0ZXJuIGludCAgICAgIGdzbV9oZXhjaGFyX3RvX2ludDAoIGNoYXIgIGMgKTsKKworLyogY29udmVydCBhIDItY2hhciBoZXggdmFsdWUgaW50byBhbiBpbnQsIHJldHVybnMgLTEgb24gZXJyb3IgKi8KK2V4dGVybiBpbnQgICAgICBnc21faGV4Ml90b19ieXRlKCBjb25zdCBjaGFyKiAgaGV4ICk7CisKKy8qIGNvbnZlcnQgYSAyLWNoYXIgaGV4IHZhbHVlIGludG8gYW4gaW50LCByZXR1cm5zIDAgb24gZXJyb3IgKi8KK2V4dGVybiBpbnQgICAgICBnc21faGV4Ml90b19ieXRlMCggY29uc3QgY2hhciogIGhleCApOworCisvKiBjb252ZXJ0IGEgNC1jaGFyIGhleCB2YWx1ZSBpbnRvIGFuIGludCwgcmV0dXJucyAtMSBvbiBlcnJvciAqLworZXh0ZXJuIGludCAgICAgIGdzbV9oZXg0X3RvX3Nob3J0KCBjb25zdCBjaGFyKiAgaGV4ICk7CisKKy8qIGNvbnZlcnQgYSA0LWNoYXIgaGV4IHZhbHVlIGludG8gYW4gaW50LCByZXR1cm5zIDAgb24gZXJyb3IgKi8KK2V4dGVybiBpbnQgICAgICBnc21faGV4NF90b19zaG9ydDAoIGNvbnN0IGNoYXIqICBoZXggKTsKKworLyogd3JpdGUgYSBieXRlIHRvIGEgMi1ieXRlIGhleCBzdHJpbmcgKi8KK2V4dGVybiB2b2lkICAgICBnc21faGV4X2Zyb21fYnl0ZSggY2hhciogIGhleCwgaW50ICB2YWwgKTsKKworZXh0ZXJuIHZvaWQgICAgIGdzbV9oZXhfZnJvbV9zaG9ydCggY2hhciogIGhleCwgaW50ICB2YWwgKTsKKworLyoqIFVURi04IGFuZCBHU00gQWxwaGFiZXQKKyAqKi8KKworLyogY2hlY2sgdGhhdCBhIGdpdmVuIHV0Zjggc3RyaW5nIGlzIHdlbGwtZm9ybWVkLCByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UgKi8KK2V4dGVybiBpbnQgICAgICB1dGY4X2NoZWNrKCBjYnl0ZXNfdCAgdXRmOCwgaW50ICB1dGY4bGVuICk7CisKKy8qIGNoZWNrIHRoYXQgYWxsIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiB1dGY4IHN0cmluZyBjYW4gYmUgZW5jb2RlZCBpbnRvIHRoZSBHU00gYWxwaGFiZXQuCisgICByZXR1cm5zIDEgaWYgVFJVRSwgMCBvdGhlcndpc2UgKi8KK2V4dGVybiBpbnQgICAgICB1dGY4X2NoZWNrX2dzbTcoIGNieXRlc190ICB1dGY4LCBpbnQgIHV0ZjhsZW4gKTsKKworLyogdHJ5IHRvIHNraXAgZW5vdWdoIHV0ZjggY2hhcmFjdGVycyB0byBnZW5lcmF0ZSBnc203bGVuIEdTTSBzZXB0ZXRzICovCitleHRlcm4gY2J5dGVzX3QgdXRmOF9za2lwX2dzbTcoIGNieXRlc190ICB1dGY4LCBjYnl0ZXNfdCAgdXRmOGVuZCwgaW50ICBnc203bGVuICk7CisKKy8qIERldGVybWluZSBob3cgbWFueSB1dGY4IGJ5dGVzIGFyZSBuZWVkZWQgdG8gcHJvZHVjZSAndWNzMmxlbicgdWNzMiBieXRlcyAqLworZXh0ZXJuIGNieXRlc190IHV0Zjhfc2tpcF91Y3MyKCBjYnl0ZXNfdCAgdXRmOCwgY2J5dGVzX3QgIHV0ZjhlbmQsIGludCAgdWNzMmxlbiApOworCisvKiBjb252ZXJ0IGEgdXRmLTggc3RyaW5nIGludG8gYSBHU00gc2VwdGV0IHN0cmluZywgYXNzdW1lcyAnZHN0JyBpcyBOVUxMIG9yIGlzIHByb3Blcmx5IHNpemVkLAorICAgYW5kIHRoYXQgYWxsIGNoYXJhY3RlcnMgYXJlIHJlcHJlc2VudGFibGUuICdvZmZzZXQnIGlzIHRoZSBzdGFydGluZyBiaXQgb2Zmc2V0IGluICdkc3QnLgorICAgbm9uLXJlcHJlc2VudGFibGUgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgc3BhY2VzLgorICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlcHRldHMsICovCitleHRlcm4gaW50ICAgICAgdXRmOF90b19nc203KCBjYnl0ZXNfdCAgdXRmOCwgaW50ICB1dGY4bGVuLCBieXRlc190ICBkc3QsIGludCAgb2Zmc2V0ICk7CisKKy8qIGNvbnZlcnQgYSB1dGY4IHN0cmluZyBpbnRvIGFuIGFycmF5IG9mIDgtYml0IHVucGFja2VkIEdTTSBzZXB0ZXRzLAorICogYXNzdW1lcyAnZHN0JyBpcyBOVUxMIG9yIGlzIHByb3Blcmx5IHNpemVkLCByZXR1cm5zIHRoZSBudW1iZXIgb2YgR1NNIGJ5dGVzICovCitleHRlcm4gaW50ICAgICAgdXRmOF90b19nc204KCBjYnl0ZXNfdCAgdXRmOCwgaW50ICB1dGY4bGVuLCBieXRlc190ICBkc3QgKTsKKworLyogY29udmVydCBhIEdTTSBzZXB0ZXRzIHN0cmluZyBpbnRvIGEgdXRmLTggYnl0ZSBzdHJpbmcuIGFzc3VtZXMgdGhhdCAndXRmOCcgaXMgTlVMTCBvciBwcm9wZXJseQorICAgc2l6ZWQuICdvZmZzZXQnIGlzIHRoZSBzdGFydGluZyBiaXQgb2Zmc2V0IGluICdzcmMnLCAnY291bnQnIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgc2VwdGV0cy4KKyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIHV0ZjggYnl0ZXMuICovCitleHRlcm4gaW50ICAgICAgdXRmOF9mcm9tX2dzbTcoIGNieXRlc190ICBzcmMsIGludCAgb2Zmc2V0LCBpbnQgIGNvdW50LCBieXRlc190ICB1dGY4ICk7CisKKy8qIGNvbnZlcnQgYW4gdW5wYWNrZWQgOC1iaXQgR1NNIHNlcHRldHMgc3RyaW5nIGludG8gYSB1dGYtOCBieXRlIHN0cmluZy4gYXNzdW1lcyB0aGF0ICd1dGY4JworICAgaXMgTlVMTCBvciBwcm9wZXJseSBzaXplZC4gJ2NvdW50JyBpcyB0aGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzLgorICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHV0ZjggYnl0ZXMgKi8KK2V4dGVybiBpbnQgICAgICB1dGY4X2Zyb21fZ3NtOCggY2J5dGVzX3QgIHNyYywgaW50ICBjb3VudCwgYnl0ZXNfdCAgdXRmOCApOworCisKKy8qKiBVQ1MtMiBhbmQgR1NNIEFscGhhYmV0CisgKioKKyAqKiBOb3RlIHRoYXQgaGVyZSwgJ3VjczInIHJlYWxseSByZWZlcnMgdG8gbm9uLWFsaWduZWQgVUNTMi1CRSwgYXMgdXNlZCBieSB0aGUgR1NNIHN0YW5kYXJkCisgKiovCisKKy8qIGNoZWNrIHRoYXQgYWxsIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiB1Y3MyIHN0cmluZyBjYW4gYmUgZW5jb2RlZCBpbnRvIHRoZSBHU00gYWxwaGFiZXQuCisgICByZXR1cm5zIDEgaWYgVFJVRSwgMCBvdGhlcndpc2UgKi8KK2V4dGVybiBpbnQgICAgICB1Y3MyX2NoZWNrX2dzbTcoIGNieXRlc190ICB1Y3MyLCBpbnQgIHVjczJsZW4gKTsKKworLyogY29udmVydCBhIHVjczIgc3RyaW5nIGludG8gYSBHU00gc2VwdGV0IHN0cmluZywgYXNzdW1lcyAnZHN0JyBpcyBOVUxMIG9yIHByb3Blcmx5IHNpemVkLAorICAgJ29mZnNldCcgaXMgdGhlIHN0YXJ0aW5nIGJpdCBvZmZzZXQgaW4gJ2RzdCcuIG5vbi1yZXByZXNlbnRhYmxlIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkCisgICBieSBzcGFjZXMuIHJldHVybnMgdGhlIG51bWJlciBvZiBzZXB0ZXRzICovCitleHRlcm4gaW50ICAgICAgdWNzMl90b19nc203KCBjYnl0ZXNfdCAgdWNzMiwgaW50ICB1Y3MybGVuLCBieXRlc190ICBkc3QsIGludCAgb2Zmc2V0ICk7CisKKy8qIGNvbnZlcnQgYSB1Y3MyIHN0cmluZyBpbnRvIGEgR1NNIHNlcHRldCBzdHJpbmcsIGFzc3VtZXMgJ2RzdCcgaXMgTlVMTCBvciBwcm9wZXJseSBzaXplZCwKKyAgIG5vbi1yZXByZXNlbnRhYmxlIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IHNwYWNlcy4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzICovCitleHRlcm4gaW50ICAgICAgdWNzMl90b19nc204KCBjYnl0ZXNfdCAgdWNzMiwgaW50ICB1Y3MybGVuLCBieXRlc190ICBkc3QgKTsKKworLyogY29udmVydCBhIEdTTSBzZXB0ZXRzIHN0cmluZyBpbnRvIGEgdWNzMiBzdHJpbmcuIGFzc3VtZXMgdGhhdCAndWNzMicgaXMgTlVMTCBvcgorICAgcHJvcGVybHkgc2l6ZWQuICdvZmZzZXQnIGlzIHRoZSBzdGFydGluZyBiaXQgb2Zmc2V0IGluICdzcmMnLCAnY291bnQnIGlzIHRoZSBudW1iZXIKKyAgIG9mIGlucHV0IHNlcHRldHMuIHJldHVybiB0aGUgbnVtYmVyIG9mIHVjczIgY2hhcmFjdGVycyAobm90IGJ5dGVzKSAqLworZXh0ZXJuIGludCAgICAgIHVjczJfZnJvbV9nc203KCBieXRlc190ICAgdWNzMiwgY2J5dGVzX3QgIHNyYywgaW50ICBvZmZzZXQsIGludCAgY291bnQgKTsKKworLyogY29udmVydCBhbiA4LWJpdCB1bnBhY2tlZCBHU00gc2VwdGV0cyBzdHJpbmcgaW50byBhIHVjczIgc3RyaW5nLiBhc3N1bWVzIHRoYXQgJ3VjczInCisgICBpcyBOVUxMIG9yIHByb3Blcmx5IHNpemVkLiAnY291bnQnIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgc2VwdGV0cy4gcmV0dXJuIHRoZSBudW1iZXIKKyAgIG9mIHVjczIgY2hhcmFjdGVycyAobm90IGJ5dGVzKSAqLworZXh0ZXJuIGludCAgICAgIHVjczJfZnJvbV9nc204KCBieXRlc190ICAgdWNzMiwgY2J5dGVzX3QgIHNyYywgaW50ICBjb3VudCApOworCisKKy8qKiBVQ1MyIHRvL2Zyb20gVVRGOAorICoqLworCisvKiBjb252ZXJ0IGEgdWNzMiBzdHJpbmcgaW50byBhIHV0ZjggYnl0ZSBzdHJpbmcsIGFzc3VtZXMgJ3V0ZjgnIE5VTEwgb3IgcHJvcGVybHkgc2l6ZWQuCisgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgdXRmOCBieXRlcyovCitleHRlcm4gaW50ICAgICAgdWNzMl90b191dGY4KCBjYnl0ZXNfdCAgdWNzMiwgaW50ICB1Y3MybGVuLCBieXRlc190ICB1dGY4ICk7CisKKy8qIGNvbnZlcnQgYSB1dGY4IGJ5dGUgc3RyaW5nIGludG8gYSB1Y3MyIHN0cmluZywgYXNzdW1lcyAndWNzMicgTlVMTCBvciBwcm9wZXJseSBzaXplZC4KKyAgIHJldHVybnMgdGhlIG51bWJlciBvZiB1Y3MyIGNoYXJzICovCitleHRlcm4gaW50ICAgICAgdXRmOF90b191Y3MyKCBjYnl0ZXNfdCAgdXRmOCwgaW50ICB1dGY4bGVuLCBieXRlc190ICB1Y3MyICk7CisKKy8qIHRyeSB0byBza2lwIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSB1dGYtOCBieXRlIHN0cmluZywgcmV0dXJuIG5ldyBwb3NpdGlvbiAqLworZXh0ZXJuIGNieXRlc190ICB1dGY4X3NraXAoIGNieXRlc190ICAgdXRmOCwgY2J5dGVzX3QgICB1dGY4ZW5kLCBpbnQgIGNvdW50KTsKKworLyoqIERpYWwgTnVtYmVyczogVE9OIGJ5dGUgKyAnY291bnQnIGJjZCBudW1iZXJzCisgKiovCisKKy8qIGNvbnZlcnQgYSBiY2QtY29kZWQgR1NNIGRpYWwgbnVtYmVyIGludG8gYW4gQVNDSUkgc3RyaW5nIChub3QgemVyby10ZXJtaW5hdGVkKQorICAgYXNzdW1lcyAnZHN0JyBpcyBOVUxMIG9yIHByb3Blcmx5IHNpemVkLCByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGVycm9yLgorICAgJ251bV9kaWdpdHMnIGlzIHRoZSBudW1iZXIgb2YgZGlnaXRzLCBub3QgaW5wdXQgYnl0ZXMuIGEgdHJhaWxpbmcgMHhmMCBpcyBpZ25vcmVkIGF1dG9tYXRpY2FsbHkKKyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIEFTQ0lJIGNoYXJzICovCitleHRlcm4gaW50ICBnc21fYmNkbnVtX3RvX2FzY2lpICAoIGNieXRlc190ICBiY2QsIGludCAgbnVtX2RpZ2l0cywgYnl0ZXNfdCAgZHN0ICk7CisKKy8qIGNvbnZlcnQgYW4gQVNDSUkgZGlhbC1udW1iZXIgaW50byBhIGJjZC1jb2RlZCBzdHJpbmcsIHJldHVybnMgdGhlIG51bWJlciBvZiA0LWJpdCBuaWJibGVzIHdyaXR0ZW4sICovCitleHRlcm4gaW50ICBnc21fYmNkbnVtX2Zyb21fYXNjaWkoIGNieXRlc190ICBhc2NpaSwgaW50ICBhc2NpaWxlbiwgYnl0ZXNfdCAgZHN0ICk7CisKKy8qKiBBRE46IEFiYnJldmlhdGVkIERpYWxpbmcgTnVtYmVycworICoqLworI2RlZmluZSAgU0lNX0FETl9NQVhfQUxQSEEgICAgICAgIDIwICAvKiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEFETiBhbHBoYSB0YWcgKi8KKyNkZWZpbmUgIFNJTV9BRE5fTUFYX05VTUJFUiAgICAgICAyMCAgLyogbWF4aW11bSBkaWdpdHMgaW4gQUROIG51bWJlciAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgYnl0ZV90ICBhbHBoYSBbIFNJTV9BRE5fTUFYX0FMUEhBKjMrMSBdOyAgLyogYWxwaGEgdGFnIGluIHplcm8tdGVybWluYXRlZCB1dGYtOCAgICAgICovCisgICAgY2hhciAgICBudW1iZXJbIFNJTV9BRE5fTUFYX05VTUJFUisxIF07ICAgLyogZGlhbGluZyBudW1iZXIgaW4gemVyby10ZXJtaW5hdGVkIEFTQ0lJICovCit9CitTaW1BZG5SZWMsICpTaW1BZG47CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTaW1BZG5SZWMgICAgICAgYWRuOworICAgIGJ5dGVfdCAgICAgICAgICBleHRfcmVjb3JkOyAgLyogMCBvciAweEZGIG1lYW5zIG5vIGV4dGVuc2lvbiAqLworfQorU2ltQWRuUmVjb3JkUmVjLCAqU2ltQWRuUmVjb3JkOworCitleHRlcm4gaW50ICBzaW1fYWRuX3JlY29yZF9mcm9tX2J5dGVzKCBTaW1BZG5SZWNvcmQgIHJlYywgY2J5dGVzX3QgIGRhdGEsIGludCAgZGF0YWxlbiApOworZXh0ZXJuIGludCAgc2ltX2Fkbl9yZWNvcmRfdG9fYnl0ZXMgICggU2ltQWRuUmVjb3JkICByZWMsIGJ5dGVzX3QgICBkYXRhLCBpbnQgIGRhdGFsZW4gKTsKKworLyoqIFJPUEVTCisgKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBieXRlc190ICAgICAgICAgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgbWF4OworICAgIGludCAgICAgICAgICAgICBwb3M7CisgICAgaW50ICAgICAgICAgICAgIGVycm9yOworICAgIHVuc2lnbmVkIGNoYXIgICBkYXRhMFsxNl07Cit9IEdzbVJvcGVSZWMsICpHc21Sb3BlOworCitleHRlcm4gdm9pZCAgICAgIGdzbV9yb3BlX2luaXQoIEdzbVJvcGUgIHJvcGUgKTsKK2V4dGVybiB2b2lkICAgICAgZ3NtX3JvcGVfaW5pdF9hbGxvYyggR3NtUm9wZSAgcm9wZSwgaW50ICBhbGxvYyApOworZXh0ZXJuIGludCAgICAgICBnc21fcm9wZV9kb25lKCBHc21Sb3BlICByb3BlICk7CitleHRlcm4gYnl0ZXNfdCAgIGdzbV9yb3BlX2RvbmVfYWNxdWlyZSggR3NtUm9wZSAgcm9wZSwgaW50ICAqcHNpemUgKTsKK2V4dGVybiB2b2lkICAgICAgZ3NtX3JvcGVfYWRkX2MoIEdzbVJvcGUgIHJvcGUsIGNoYXIgIGMgKTsKK2V4dGVybiB2b2lkICAgICAgZ3NtX3JvcGVfYWRkKCBHc21Sb3BlICByb3BlLCBjb25zdCB2b2lkKiAgc3RyLCBpbnQgIGxlbiApOworZXh0ZXJuIHZvaWQqICAgICBnc21fcm9wZV9yZXNlcnZlKCBHc21Sb3BlICByb3BlLCBpbnQgIGxlbiApOworCisjZGVmaW5lICBQSE9ORV9QUkVGSVggIjE1NTU1MjEiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvZ3NtX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvZ3NtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRkYTgzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9nc21fdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvZ3NtLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgZ3NtIHsKKworVEVTVChHc20sIFV0ZjhDaGVja0dzbTcpIHsKKyAgICBjaGFyIHV0ZjhJbltdID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiAgLy8gWyAgMF0gLi4gWyA0OV0KKyAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQqKio4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiAgLy8gWyA1MF0gLi4gWyA5OV0KKyAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiAgLy8gWzEwMF0gLi4gWzE0OV0KKyAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IjsgLy8gWzE1MF0gLi4gWzE5OV0KKworICAgIHV0ZjhJbls3NV0gPSAweEUyOyAvLyBJbnNlcnQgYSBVVEYtOCAnRXVybyBjdXJyZW5jeScgc3ltYm9sCisgICAgdXRmOEluWzc2XSA9IDB4ODI7CisgICAgdXRmOEluWzc3XSA9IDB4QUM7CisKKyAgICAvLyBUaGUgRXVybyBzeW1ib2wgaXMgYSB0aHJlZS1ieXRlIFVURi04IHN5bWJvbCBhbmQgYQorICAgIC8vIHR3by1ieXRlIEdTTS03IHN5bWJvbC4KKworICAgIGNieXRlc190IHN0YXJ0ID0gKGNieXRlc190KSZ1dGY4SW5bMF07CisKKyAgICBpbnQgaXNHc203ID0gdXRmOF9jaGVja19nc203KHN0YXJ0LCBzdHJsZW4odXRmOEluKSk7CisgICAgRVhQRUNUX1RSVUUoaXNHc203KTsKKworICAgIGNieXRlc190IGVuZCAgICAgPSAoY2J5dGVzX3QpKHN0YXJ0ICsgc3RybGVuKHV0ZjhJbikpOworICAgIGludCAgICAgIGdzbTdsZW4gPSAxNTQ7CisKKyAgICAvLyBUaGUgIkV1cm8iIGdlbmVyYXRlcyAyIG91dHB1dCBHU00tNyBieXRlcyBmcm9tIDMgaW5wdXQKKyAgICAvLyBieXRlcy4KKyAgICAvLyBUaGUgb3RoZXIgKCJyZWd1bGFyIikgaW5wdXQgYnl0ZXMgZ2l2ZSAxIEdTTS03IGJ5dGUKKyAgICAvLyBlYWNoLCBzbyAxNTIgaW5wdXQgYnl0ZXMgYXJlIGJlIG5lZWRlZCB0byBnZW5lcmF0ZSAxNTIKKyAgICAvLyBvdXRwdXQgYnl0ZXMuCisgICAgLy8gSW4gdG90YWwsIHRoaXMgdGVzdCBjYXNlIG5lZWRzIDE1NSBpbnB1dCBieXRlcyB0bworICAgIC8vIGdlbmVyYXRlIDE1NCBvdXRwdXQgYnl0ZXMuCisgICAgY2J5dGVzX3QgcmVzdWx0ID0gdXRmOF9za2lwX2dzbTcoc3RhcnQsIGVuZCwgZ3NtN2xlbik7CisgICAgRVhQRUNUX0VRKChyZXN1bHQgLSBzdGFydCksIDE1NSk7Cit9CisKK1RFU1QoR3NtLCBVdGY4Q2hlY2tVY3MyKSB7CisgICAgY2hhciB1dGY4SW5bXSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIgIC8vIFsgIDBdIC4uIFsgNDldCisgICAgICAgICAgICAgICAgICAgICIwKiozNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIgIC8vIFsgNTBdIC4uIFsgOTldCisgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIgIC8vIFsxMDBdIC4uIFsxNDldCisgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSI7IC8vIFsxNTBdIC4uIFsxOTldCisKKyAgICB1dGY4SW5bNTFdID0gMHhDMjsgLy8gSW5zZXJ0IGEgVVRGLTggJ2NlbnQnIHN5bWJvbAorICAgIHV0ZjhJbls1Ml0gPSAweEEyOworCisgICAgLy8gVGhlIGNlbnQgc3ltYm9sIGlzIG5vdCBpbiBHU00tNy4gSXRzIHByZXNlbmNlIGZvcmNlcworICAgIC8vIHRoZSBTTVMgbWVzc2FnZSB0byB1c2UgVUNTLTIuCisKKyAgICBjYnl0ZXNfdCBzdGFydCAgID0gKGNieXRlc190KSZ1dGY4SW5bMF07CisKKyAgICBpbnQgaXNHc203ID0gdXRmOF9jaGVja19nc203KHN0YXJ0LCBzdHJsZW4odXRmOEluKSk7CisgICAgRVhQRUNUX0ZBTFNFKGlzR3NtNyk7CisKKyAgICBjYnl0ZXNfdCBlbmQgICAgID0gKGNieXRlc190KShzdGFydCArIHN0cmxlbih1dGY4SW4pKTsKKyAgICBpbnQgICAgICB1Y3MybGVuID0gMTI0OworCisgICAgLy8gVGhlICJjZW50IiBnZW5lcmF0ZXMgMiBvdXRwdXQgVUNTLTIgYnl0ZXMgZnJvbSAyIGlucHV0CisgICAgLy8gYnl0ZXMuCisgICAgLy8gVGhlIG90aGVyICgicmVndWxhciIpIGlucHV0IGJ5dGVzIGdpdmUgMiBVQ1MtMiBieXRlcworICAgIC8vIGVhY2gsIHNvIDYxIGlucHV0IGJ5dGVzIGFyZSBiZSBuZWVkZWQgdG8gZ2VuZXJhdGUgMTIyCisgICAgLy8gb3V0cHV0IGJ5dGVzLgorICAgIC8vIEluIHRvdGFsLCB0aGlzIHRlc3QgY2FzZSBuZWVkcyA2MyBpbnB1dCBieXRlcyB0bworICAgIC8vIGdlbmVyYXRlIDEyNCBvdXRwdXQgYnl0ZXMuCisgICAgY2J5dGVzX3QgcmVzdWx0ID0gdXRmOF9za2lwX3VjczIoc3RhcnQsIGVuZCwgdWNzMmxlbik7CisgICAgRVhQRUNUX0VRKChyZXN1bHQgLSBzdGFydCksIDYzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGdzbQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTY3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L21vZGVtLmMKQEAgLTAsMCArMSwyNzQ3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW0uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvcmVtb3RlX2NhbGwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zaW1fYWNjZXNzX3J1bGVzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvc2ltX2NhcmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zbXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbmV0d29yay9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Fjb25maWctZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvdGltZXpvbmUuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisvLyBEZWJ1ZyBsb2dzLgorI2RlZmluZSAgRCguLi4pICAgQU5EUk9JRF9URUxFUEhPTllfTE9HX09OKG1vZGVtLF9fVkFfQVJHU19fKQorI2RlZmluZSAgUiguLi4pICAgQU5EUk9JRF9URUxFUEhPTllfTE9HX09OKHJhZGlvLF9fVkFfQVJHU19fKQorCisjZGVmaW5lICBDQUxMX0RFTEFZX0RJQUwgICAxMDAwCisjZGVmaW5lICBDQUxMX0RFTEFZX0FMRVJUICAxMDAwCisKKy8qIHRoZSBBbmRyb2lkIEdTTSBzdGFjayBjaGVja3MgdGhhdCB0aGUgb3BlcmF0b3IncyBuYW1lIGhhcyBjaGFuZ2VkCisgKiB3aGVuIHJvYW1pbmcgaXMgb24uIElmIG5vdCwgaXQgd2lsbCBub3QgdXBkYXRlIHRoZSBSb2FtaW5nIHN0YXR1cyBpY29uCisgKgorICogdGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZW11bGF0ZSB0d28gZGlzdGluY3Qgb3BlcmF0b3JzOgorICogLSB0aGUgZmlyc3Qgb25lIGZvciB0aGUgJ2hvbWUnIHJlZ2lzdHJhdGlvbiBzdGF0ZSwgbXVzdCBhbHNvIGNvcnJlc3BvbmQKKyAqICAgdG8gdGhlIGVtdWxhdGVkIHVzZXIncyBJTUVJCisgKgorICogLSB0aGUgc2Vjb25kIG9uZSBmb3IgdGhlICdyb2FtaW5nJyByZWdpc3RyYXRpb24gc3RhdGUsIG11c3QgaGF2ZSBhCisgKiAgIGRpZmZlcmVudCBuYW1lIGFuZCBNQ0MvTU5DCisgKi8KKworI2RlZmluZSAgT1BFUkFUT1JfSE9NRV9JTkRFWCAwCisjZGVmaW5lICBPUEVSQVRPUl9IT01FX01DQyAgIDMxMAorI2RlZmluZSAgT1BFUkFUT1JfSE9NRV9NTkMgICAyNjAKKyNkZWZpbmUgIE9QRVJBVE9SX0hPTUVfTkFNRSAgIkFuZHJvaWQiCisjZGVmaW5lICBPUEVSQVRPUl9IT01FX01DQ01OQyAgU1RSSU5HSUZZKE9QRVJBVE9SX0hPTUVfTUNDKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HSUZZKE9QRVJBVE9SX0hPTUVfTU5DKQorCisjZGVmaW5lICBPUEVSQVRPUl9ST0FNSU5HX0lOREVYIDEKKyNkZWZpbmUgIE9QRVJBVE9SX1JPQU1JTkdfTUNDICAgMzEwCisjZGVmaW5lICBPUEVSQVRPUl9ST0FNSU5HX01OQyAgIDI5NQorI2RlZmluZSAgT1BFUkFUT1JfUk9BTUlOR19OQU1FICAiVGVsS2lsYSIKKyNkZWZpbmUgIE9QRVJBVE9SX1JPQU1JTkdfTUNDTU5DICBTVFJJTkdJRlkoT1BFUkFUT1JfUk9BTUlOR19NQ0MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdJRlkoT1BFUkFUT1JfUk9BTUlOR19NTkMpCisKK3N0YXRpYyBjb25zdCBjaGFyKiBfYW1vZGVtX3N3aXRjaF90ZWNobm9sb2d5KEFNb2RlbSBtb2RlbSwgQU1vZGVtVGVjaCBuZXd0ZWNoLCBpbnQzMl90IG5ld3ByZWZlcnJlZCk7CitzdGF0aWMgaW50IF9hbW9kZW1fc2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSggQU1vZGVtIG1vZGVtLCBBQ2RtYVN1YnNjcmlwdGlvblNvdXJjZSBzcyk7CitzdGF0aWMgaW50IF9hbW9kZW1fc2V0X2NkbWFfcHJsX3ZlcnNpb24oIEFNb2RlbSBtb2RlbSwgaW50IHBybFZlcnNpb24pOworCitzdGF0aWMgY29uc3QgY2hhciogIHF1b3RlKCBjb25zdCBjaGFyKiAgbGluZSApCit7CisgICAgc3RhdGljIGNoYXIgIHRlbXBbMTAyNF07CisgICAgY29uc3QgY2hhciogIGhleGRpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICBjaGFyKiAgICAgICAgcCA9IHRlbXA7CisgICAgaW50ICAgICAgICAgIGM7CisKKyAgICB3aGlsZSAoKGMgPSAqbGluZSsrKSAhPSAwKSB7CisgICAgICAgIGMgJj0gMjU1OworICAgICAgICBpZiAoYyA+PSAzMiAmJiBjIDwgMTI3KSB7CisgICAgICAgICAgICAqcCsrID0gYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgIG1lbWNweSggcCwgIjxDUj4iLCA0ICk7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICBtZW1jcHkoIHAsICI8TEY+IiwgNCApO3N0cmNhdCggcCwgIjxMRj4iICk7CisgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwWzBdID0gJ1xcJzsKKyAgICAgICAgICAgIHBbMV0gPSAneCc7CisgICAgICAgICAgICBwWzJdID0gaGV4ZGlnaXRzWyAoYykgPj4gNCBdOworICAgICAgICAgICAgcFszXSA9IGhleGRpZ2l0c1sgKGMpICYgMTUgXTsKKyAgICAgICAgICAgIHAgKz0gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcCA9IDA7CisgICAgcmV0dXJuIHRlbXA7Cit9CisKK2V4dGVybiBBTW9kZW1UZWNoCithbmRyb2lkX3BhcnNlX21vZGVtX3RlY2goIGNvbnN0IGNoYXIgKiB0ZWNoICkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgeyBjb25zdCBjaGFyKiBuYW1lOyBBTW9kZW1UZWNoICB0ZWNoOyB9ICB0ZWNoc1tdID0geworICAgICAgICB7ICJnc20iLCBBX1RFQ0hfR1NNIH0sCisgICAgICAgIHsgImx0ZSIsIEFfVEVDSF9MVEUgfSwKKyAgICAgICAgeyBOVUxMLCAwIH0KKyAgICB9OworICAgIGludCAgbm47CisKKyAgICBmb3IgKG5uID0gMDsgdGVjaHNbbm5dLm5hbWU7IG5uKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAodGVjaCwgdGVjaHNbbm5dLm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHRlY2hzW25uXS50ZWNoOworICAgIH0KKyAgICAvKiBub3QgZm91bmQgKi8KKyAgICByZXR1cm4gQV9URUNIX1VOS05PV047Cit9CisKK2V4dGVybiBBRGF0YU5ldHdvcmtUeXBlCithbmRyb2lkX3BhcnNlX25ldHdvcmtfdHlwZSggY29uc3QgY2hhciogIHNwZWVkICkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgeyBjb25zdCBjaGFyKiBuYW1lOyBBRGF0YU5ldHdvcmtUeXBlICB0eXBlOyB9ICB0eXBlc1tdID0geworICAgICAgICB7ICJnc20iLCAgIEFfREFUQV9ORVRXT1JLX0dQUlMgfSwKKyAgICAgICAgeyAiaHNjc2QiLCBBX0RBVEFfTkVUV09SS19HUFJTIH0sCisgICAgICAgIHsgImdwcnMiLCAgQV9EQVRBX05FVFdPUktfR1BSUyB9LAorICAgICAgICB7ICJlZGdlIiwgIEFfREFUQV9ORVRXT1JLX0VER0UgfSwKKyAgICAgICAgeyAidW10cyIsICBBX0RBVEFfTkVUV09SS19VTVRTIH0sCisgICAgICAgIHsgImhzZHBhIiwgQV9EQVRBX05FVFdPUktfVU1UUyB9LCAgLyogbm90IGhhbmRsZWQgeWV0IGJ5IEFuZHJvaWQgR1NNIGZyYW1ld29yayAqLworICAgICAgICB7ICJsdGUiLCAgIEFfREFUQV9ORVRXT1JLX0xURSB9LAorICAgICAgICB7ICJmdWxsIiwgIEFfREFUQV9ORVRXT1JLX0xURSB9LAorICAgICAgICB7IE5VTEwsIDAgfQorICAgIH07CisgICAgaW50ICBubjsKKworICAgIGlmICghc3BlZWQgfHwgIXNwZWVkWzBdKSB7CisgICAgICAgIHNwZWVkID0ga0FuZHJvaWROZXR3b3JrRGVmYXVsdFNwZWVkOworICAgIH0KKworICAgIGZvciAobm4gPSAwOyB0eXBlc1tubl0ubmFtZTsgbm4rKykgeworICAgICAgICBpZiAoIXN0cmNtcChzcGVlZCwgdHlwZXNbbm5dLm5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHR5cGVzW25uXS50eXBlOworICAgIH0KKyAgICAvKiBub3QgZm91bmQsIGJlIGNvbnNlcnZhdGl2ZSAqLworICAgIHJldHVybiBBX0RBVEFfTkVUV09SS19HUFJTOworfQorCisvKiAnbW9kZScgZm9yICtDUkVHLytDR1JFRyBjb21tYW5kcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBX1JFR0lTVFJBVElPTl9VTlNPTF9ESVNBQkxFRCAgICAgPSAwLAorICAgIEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRUQgICAgICA9IDEsCisgICAgQV9SRUdJU1RSQVRJT05fVU5TT0xfRU5BQkxFRF9GVUxMID0gMgorfSBBUmVnaXN0cmF0aW9uVW5zb2xNb2RlOworCisvKiBPcGVyYXRvciBzZWxlY3Rpb24gbW9kZSwgc2VlICtDT1BTIGNvbW1hbmRzICovCit0eXBlZGVmIGVudW0geworICAgIEFfU0VMRUNUSU9OX0FVVE9NQVRJQywKKyAgICBBX1NFTEVDVElPTl9NQU5VQUwsCisgICAgQV9TRUxFQ1RJT05fREVSRUdJU1RSQVRJT04sCisgICAgQV9TRUxFQ1RJT05fU0VUX0ZPUk1BVCwKKyAgICBBX1NFTEVDVElPTl9NQU5VQUxfQVVUT01BVElDCit9IEFPcGVyYXRvclNlbGVjdGlvbjsKKworLyogT3BlcmF0b3Igc3RhdHVzLCBzZWUgK0NPUFMgY29tbWFuZHMgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQV9TVEFUVVNfVU5LTk9XTiA9IDAsCisgICAgQV9TVEFUVVNfQVZBSUxBQkxFLAorICAgIEFfU1RBVFVTX0NVUlJFTlQsCisgICAgQV9TVEFUVVNfREVOSUVECit9IEFPcGVyYXRvclN0YXR1czsKKworLyogR2VuZXJhbCBlcnJvciBjb2RlcyBmb3IgQVQgY29tbWFuZHMsIHNlZSAzZ3BwLm9yZyBkb2N1bWVudCAyNy4wMDcgKi8KK3R5cGVkZWYgZW51bSB7CisgICAga0NtZUVycm9yTWVtb3J5RnVsbCA9IDIwLAorICAgIGtDbWVFcnJvckludmFsaWRJbmRleCA9IDIxLAorICAgIGtDbWVFcnJvckludmFsaWRDaGFyYWN0ZXJzSW5UZXh0U3RyaW5nID0gMjUsCisgICAga0NtZUVycm9yTm9OZXR3b3JrU2VydmljZSA9IDMwLAorICAgIGtDbWVFcnJvck5ldHdvcmtOb3RBbGxvd2VkRW1lcmdlbmN5Q2FsbHNPbmx5ID0gMzIsCisgICAga0NtZUVycm9yVW5rbm93bkVycm9yID0gMTAwLAorICAgIGtDbWVFcnJvclNlbGVjdGlvbkZhaWx1cmVFbWVyZ2VuY3lDYWxsc09ubHkgPSA1MjksCit9IENtZUVycm9yQ29kZTsKKworLyogQ29tbWFuZCBBUERVIGluc3RydWN0aW9ucywgc2VlIEVUU0kgMTAyIDIyMSBhbmQgZ2xvYmFscGxhdGZvcm0ub3JnJ3MKKyAqIFNlY3VyZSBFbGVtZW50cyBBY2Nlc3MgQ29udHJvbCAoU0VBQykgZG9jdW1lbnQgZm9yIG1vcmUgaW5zdHJ1Y3Rpb25zLiAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBrU2ltQXBkdUdldERhdGEgPSAweENBLCAvLyBHbG9iYWwgUGxhdGZvcm0gU0VBQyBzZWN0aW9uIDQuMSBHRVQgREFUQSBDb21tYW5kCit9IFNpbUFwZHVJbnN0cnVjdGlvbjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQU9wZXJhdG9yU3RhdHVzICBzdGF0dXM7CisgICAgY2hhciAgICAgICAgICAgICBuYW1lWzNdWzE2XTsKK30gQU9wZXJhdG9yUmVjLCAqQU9wZXJhdG9yOworCit0eXBlZGVmIHN0cnVjdCBBVm9pY2VDYWxsUmVjIHsKKyAgICBBQ2FsbFJlYyAgICBjYWxsOworICAgIFN5c1RpbWVyICAgIHRpbWVyOworICAgIEFNb2RlbSAgICAgIG1vZGVtOworICAgIGNoYXIgICAgICAgIGlzX3JlbW90ZTsKK30gQVZvaWNlQ2FsbFJlYywgKkFWb2ljZUNhbGw7CisKKyNkZWZpbmUgIE1BWF9PUEVSQVRPUlMgIDQKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBX0RBVEFfSVAgPSAwLAorICAgIEFfREFUQV9QUFAKK30gQURhdGFUeXBlOworCisjZGVmaW5lICBBX0RBVEFfQVBOX1NJWkUgIDMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgIGlkOworICAgIGludCAgICAgICAgYWN0aXZlOworICAgIEFEYXRhVHlwZSAgdHlwZTsKKyAgICBjaGFyICAgICAgIGFwblsgQV9EQVRBX0FQTl9TSVpFIF07CisKK30gQURhdGFDb250ZXh0UmVjLCAqQURhdGFDb250ZXh0OworCisvKiB0aGUgc3BlYyBzYXlzIHRoYXQgdGhlcmUgY2FuIG9ubHkgYmUgYSBtYXggb2YgNCBjb250ZXh0cyAqLworI2RlZmluZSAgTUFYX0RBVEFfQ09OVEVYVFMgIDQKKyNkZWZpbmUgIE1BWF9DQUxMUyAgICAgICAgICA0CisjZGVmaW5lICBNQVhfRU1FUkdFTkNZX05VTUJFUlMgMTYKKyNkZWZpbmUgIE1BWF9MT0dJQ0FMX0NIQU5ORUxTIDE2CisKKyNkZWZpbmUgIEFfTU9ERU1fU0VMRl9TSVpFICAgMworCit0eXBlZGVmIHN0cnVjdCBfc2lnbmFsIHsKKyAgICBpbnQgZ3NtX3Jzc2k7CisgICAgaW50IGdzbV9iZXI7CisgICAgaW50IGNkbWFfZGJtOworICAgIGludCBjZG1hX2VjaW87CisgICAgaW50IGV2ZG9fZGJtOworICAgIGludCBldmRvX2VjaW87CisgICAgaW50IGV2ZG9fc25yOworICAgIGludCBsdGVfcnNzaTsKKyAgICBpbnQgbHRlX3JzcnA7CisgICAgaW50IGx0ZV9yc3JxOworICAgIGludCBsdGVfcnNzbnI7CisgICAgaW50IGx0ZV9jcWk7CisgICAgaW50IGx0ZV90aW1pbmc7Cit9IHNpZ25hbF90OworCit0eXBlZGVmIGVudW0geworICAgIE5PTkUgPSAwLAorICAgIFBPT1IgPSAxLAorICAgIE1PREVSQVRFID0gMiwKKyAgICBHT09EID0gMywKKyAgICBHUkVBVCA9IDQsCit9IHNpZ25hbF9zdHJlbmd0aDsKKworLyoKKyAqIFZhbHVlcyBkZXJpdmVkIGZyb20gdGhlIHJhbmdlcyB1c2VkIGluIHRoZSBTaWduYWxTdHJlbmd0aAorICogY2xhc3MgaW4gdGhlIGZyYW1ld29ya3MvYmFzZSB0ZWxlcGhvbnkgZnJhbWV3b3JrLgorICovCitzdGF0aWMgY29uc3Qgc2lnbmFsX3QgTkVUX1BST0ZJTEVTWzVdID0geworICAgIC8qIE5PTkUgKi8KKyAgICB7MCwgNywgMTA1LCAxNjAsIDExMCwgMTYwLCAwLCAxMDUsIDE0MCwgMywgLTIwMCwgMCwgNTAwfSwKKyAgICAvKiBQT09SIChvbmUgYmFyKSAqLworICAgIHs1LCA1LCAxMDAsIDE1MCwgMTAwLCAxNTAsIDIsIDEwMCwgMTEwLCAgNSwgMCwgMiwgMzAwfSwKKyAgICAvKiBNT0RFUkFURSAoMiBiYXJzKSAqLworICAgIHsxMiwgNCwgOTAsIDEyMCwgODAsIDEyMCwgNCwgOTAsIDEwMCwgMTAsIDMwLCA3LCAyMDB9LAorICAgIC8qIEdPT0QgKDMgYmFycykgKi8KKyAgICB7MjAsIDIsIDgwLCAxMDAsIDcwLCAxMDAsIDYsIDcwLCA5MCwgMTUsIDEwMCwgMTIsIDEwMH0sCisgICAgLyogR1JFQVQgKDQgYmFycykgKi8KKyAgICB7MzAsIDAsIDcwLCA4MCwgNjAsIDgwLCA3LCA2MCwgODAsIDIwLCAyMDAsIDE1LCA1MH0sCit9OworCit0eXBlZGVmIHN0cnVjdCBBTW9kZW1SZWNfCit7CisgICAgLyogTGVnYWN5IHN1cHBvcnQgKi8KKyAgICBjaGFyICAgICAgICAgIHN1cHBvcnRzTmV0d29ya0RhdGFUeXBlOworCisgICAgLyogUmFkaW8gc3RhdGUgKi8KKyAgICBBUmFkaW9TdGF0ZSAgIHJhZGlvX3N0YXRlOworICAgIGludCAgICAgICAgICAgYXJlYV9jb2RlOworICAgIGludCAgICAgICAgICAgY2VsbF9pZDsKKyAgICBpbnQgICAgICAgICAgIGJhc2VfcG9ydDsKKworICAgIC8qIFNpZ25hbCBzdHJlbmd0aCB2YXJpYWJsZXMgKi8KKyAgICBpbnQgICAgICAgICAgICAgdXNlX3NpZ25hbF9wcm9maWxlOworICAgIHNpZ25hbF9zdHJlbmd0aCBxdWFsaXR5OworICAgIGludCAgICAgICAgICAgICByc3NpOworICAgIGludCAgICAgICAgICAgICBiZXI7CisKKworICAgIC8qIFNNUyAqLworICAgIGludCAgICAgICAgICAgd2FpdF9zbXM7CisKKyAgICAvKiBTSU0gY2FyZCAqLworICAgIEFTaW1DYXJkICAgICAgc2ltOworCisgICAgLyogdm9pY2UgYW5kIGRhdGEgbmV0d29yayByZWdpc3RyYXRpb24gKi8KKyAgICBBUmVnaXN0cmF0aW9uVW5zb2xNb2RlICAgdm9pY2VfbW9kZTsKKyAgICBBUmVnaXN0cmF0aW9uU3RhdGUgICAgICAgdm9pY2Vfc3RhdGU7CisgICAgQVJlZ2lzdHJhdGlvblVuc29sTW9kZSAgIGRhdGFfbW9kZTsKKyAgICBBUmVnaXN0cmF0aW9uU3RhdGUgICAgICAgZGF0YV9zdGF0ZTsKKyAgICBBRGF0YU5ldHdvcmtUeXBlICAgICAgICAgZGF0YV9uZXR3b3JrOworCisgICAgLyogb3BlcmF0b3IgbmFtZXMgKi8KKyAgICBBT3BlcmF0b3JTZWxlY3Rpb24gIG9wZXJfc2VsZWN0aW9uX21vZGU7CisgICAgQU5hbWVJbmRleCAgICAgICAgICBvcGVyX25hbWVfaW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgICBvcGVyX2luZGV4OworICAgIGludCAgICAgICAgICAgICAgICAgb3Blcl9jb3VudDsKKyAgICBBT3BlcmF0b3JSZWMgICAgICAgIG9wZXJhdG9yc1sgTUFYX09QRVJBVE9SUyBdOworCisgICAgLyogZGF0YSBjb25uZWN0aW9uIGNvbnRleHRzICovCisgICAgQURhdGFDb250ZXh0UmVjICAgICBkYXRhX2NvbnRleHRzWyBNQVhfREFUQV9DT05URVhUUyBdOworCisgICAgLyogYWN0aXZlIGNhbGxzICovCisgICAgQVZvaWNlQ2FsbFJlYyAgICAgICBjYWxsc1sgTUFYX0NBTExTIF07CisgICAgaW50ICAgICAgICAgICAgICAgICBjYWxsX2NvdW50OworCisgICAgLyogdW5zb2xpY2l0ZWQgY2FsbGJhY2sgKi8gIC8qIFhYWDogVE9ETzogdXNlIHRoaXMgKi8KKyAgICBBTW9kZW1VbnNvbEZ1bmMgICAgIHVuc29sX2Z1bmM7CisgICAgdm9pZCogICAgICAgICAgICAgICB1bnNvbF9vcGFxdWU7CisKKyAgICBTbXNSZWNlaXZlciAgICAgICAgIHNtc19yZWNlaXZlcjsKKworICAgIGludCAgICAgICAgICAgICAgICAgb3V0X3NpemU7CisgICAgY2hhciAgICAgICAgICAgICAgICBvdXRfYnVmZlsxMDI0XTsKKworICAgIC8qCisgICAgICogSG9sZCBub24tdm9sYXRpbGUgcmFtIGNvbmZpZ3VyYXRpb24gZm9yIG1vZGVtCisgICAgICovCisgICAgQUNvbmZpZyAqbnZyYW1fY29uZmlnOworICAgIGNoYXIgKm52cmFtX2NvbmZpZ19maWxlbmFtZTsKKworICAgIEFNb2RlbVRlY2ggdGVjaG5vbG9neTsKKyAgICAvKgorICAgICAqIFRoaXMgaXMgYXJlIHJlYWxseSA0IGJ5dGUtc2l6ZWQgcHJpb3JpdGl6ZWQgbWFza3MuCisgICAgICogQnl0ZSBvcmRlciBnaXZlcyB0aGUgcHJpb3JpdHkgZm9yIHRoZSBzcGVjaWZpYyBiaXRtYXNrLgorICAgICAqIEVhY2ggYml0IHBvc2l0aW9uIGluIGVhY2ggb2YgdGhlIG1hc2tzIGlzIGluZGV4ZWQgYnkgdGhlIGRpZmZlcmVudAorICAgICAqIEFfVEVDSF9YWFhYIHZhbHVlcy4KKyAgICAgKiBlLmcuIDB4MDEgbWVhbnMgb25seSBHU00gaXMgc2V0IChiaXQgaW5kZXggMCksIHdoZXJlYXMgMHgwZgorICAgICAqIG1lYW5zIHRoYXQgR1NNLFdDRE1BLENETUEgYW5kIEVWRE8gYXJlIHNldAorICAgICAqLworICAgIGludDMyX3QgcHJlZmVycmVkX21hc2s7CisgICAgQUNkbWFTdWJzY3JpcHRpb25Tb3VyY2Ugc3Vic2NyaXB0aW9uX3NvdXJjZTsKKyAgICBBQ2RtYVJvYW1pbmdQcmVmIHJvYW1pbmdfcHJlZjsKKyAgICBpbnQgaW5fZW1lcmdlbmN5X21vZGU7CisgICAgaW50IHBybF92ZXJzaW9uOworCisgICAgY29uc3QgY2hhciAqZW1lcmdlbmN5X251bWJlcnNbTUFYX0VNRVJHRU5DWV9OVU1CRVJTXTsKKworICAgIC8qIExvZ2ljYWwgY2hhbm5lbHMgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBjaGFyKiBkZl9uYW1lOworICAgICAgICBib29sIGlzX29wZW47CisgICAgfSBsb2dpY2FsX2NoYW5uZWxzW01BWF9MT0dJQ0FMX0NIQU5ORUxTXTsKK30gQU1vZGVtUmVjOworCisvLyBBIFNJTSBBUERVIGRhdGEgc3RydWN0dXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQgRVRTSSBUUyAxMDIgMjIxCisvLyAiU21hcnQgQ2FyZHM7IFVJQ0MtVGVybWluYWwgaW50ZXJmYWNlOyBQaHlzaWNhbCBhbmQgbG9naWNhbCBjaGFyYWN0ZXJpc3RpY3MiCisvLyBhdmFpbGFibGUgZnJvbSBodHRwczovL3d3dy5ldHNpLm9yZy8KK3R5cGVkZWYgc3RydWN0IFNJTV9BUERVIHsKKyAgICB1aW50OF90IGNsYTsgLy8gQ2xhc3Mgb2YgaW5zdHJ1Y3Rpb24KKyAgICB1aW50OF90IGluc3RydWN0aW9uOworICAgIHVpbnQ4X3QgcGFyYW0xOworICAgIHVpbnQ4X3QgcGFyYW0yOworICAgIHVpbnQ4X3QgcGFyYW0zOworICAgIGNoYXIqIGRhdGE7Cit9IFNJTV9BUERVOworCitzdGF0aWMgYm9vbCBwYXJzZUhleENoYXJzVG9CdWZmZXIoY29uc3QgY2hhciogc3RyLCBpbnQgbGVuZ3RoLCBjaGFyKiBvdXRwdXQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaW50IHZhbHVlID0gaGV4MmludCgoY29uc3QgdWludDhfdCopc3RyICsgaSAqIDIsIDIpOworICAgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0W2ldID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGcmVlIGRhdGEgYWxsb2NhdGVkIGJ5IHBhcnNlU2ltQXBkdUNvbW1hbmQsIG5vdGUgdGhhdCB0aGlzIG9ubHkgZnJlZXMgdGhlCisvLyBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0LCBub3QgdGhlIHN0cnVjdCBpdHNlbGYuCitzdGF0aWMgdm9pZCBmcmVlU2ltQXBkdUNvbW1hbmQoU0lNX0FQRFUqIGFwZHUpIHsKKyAgICBmcmVlKGFwZHUtPmRhdGEpOworICAgIGFwZHUtPmRhdGEgPSBOVUxMOworfQorCisvLyBQYXJzZSBhIGNvbW1hbmQgc3RyaW5nIGludG8gYW4gQVBEVSBzdHJ1Y3QuIEFmdGVyIHVzaW5nIHRoZSBhcGR1IHN0cnVjdAorLy8gdGhlIGNhbGxlciBzaG91bGQgY2FsbCBmcmVlU2ltQXBkdUNvbW1hbmQgdG8gZnJlZSB0aGUgZGF0YSBhbGxvY2F0ZWQgYnkKKy8vIHRoaXMgZnVuY3Rpb24uCitzdGF0aWMgYm9vbAorcGFyc2VTaW1BcGR1Q29tbWFuZChjb25zdCBjaGFyKiBjb21tYW5kLCBpbnQgbGVuZ3RoLCBTSU1fQVBEVSogYXBkdSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbW1hbmREYXRhID0gKGNvbnN0IHVpbnQ4X3QqKWNvbW1hbmQ7CisgICAgaWYgKGNvbW1hbmQgPT0gTlVMTCB8fCBhcGR1ID09IE5VTEwgfHwgbGVuZ3RoICE9IHN0cmxlbihjb21tYW5kKSkgeworICAgICAgICAvLyBJbnZhbGlkIG9yIG1pc21hdGNoaW5nIHBhcmFtZXRlcnMKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobGVuZ3RoIDwgMTApIHsKKyAgICAgICAgLy8gTGVzcyB0aGFuIG1pbmltYWwgbGVuZ3RoIGZvciBhbiBBUERVCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhcGR1LT5jbGEgPSBoZXgyaW50KGNvbW1hbmREYXRhLCAyKTsKKyAgICBhcGR1LT5pbnN0cnVjdGlvbiA9IGhleDJpbnQoY29tbWFuZERhdGEgKyAyLCAyKTsKKyAgICBhcGR1LT5wYXJhbTEgPSBoZXgyaW50KGNvbW1hbmREYXRhICsgNCwgMik7CisgICAgYXBkdS0+cGFyYW0yID0gaGV4MmludChjb21tYW5kRGF0YSArIDYsIDIpOworICAgIGFwZHUtPnBhcmFtMyA9IGhleDJpbnQoY29tbWFuZERhdGEgKyA4LCAyKTsKKyAgICBpZiAobGVuZ3RoID4gMTApIHsKKyAgICAgICAgYXBkdS0+ZGF0YSA9IChjaGFyKiltYWxsb2MobGVuZ3RoIC0gMTApOworICAgICAgICBwYXJzZUhleENoYXJzVG9CdWZmZXIoY29tbWFuZCArIDEwLCBsZW5ndGggLSAxMCwgYXBkdS0+ZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXBkdS0+ZGF0YSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyB2b2lkCithbW9kZW1fdW5zb2woIEFNb2RlbSAgbW9kZW0sIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uICkKK3sKKyAgICBpZiAobW9kZW0tPnVuc29sX2Z1bmMpIHsKKyAgICAgICAgdmFfbGlzdCAgYXJnczsKKyAgICAgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICAgICAgdnNucHJpbnRmKCBtb2RlbS0+b3V0X2J1ZmYsIHNpemVvZihtb2RlbS0+b3V0X2J1ZmYpLCBmb3JtYXQsIGFyZ3MgKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MpOworCisgICAgICAgIG1vZGVtLT51bnNvbF9mdW5jKCBtb2RlbS0+dW5zb2xfb3BhcXVlLCBtb2RlbS0+b3V0X2J1ZmYgKTsKKyAgICB9Cit9CisKK3ZvaWQKK2Ftb2RlbV9yZWNlaXZlX3NtcyggQU1vZGVtICBtb2RlbSwgU21zUERVICBzbXMgKQoreworI2RlZmluZSAgU01TX1VOU09MX0hFQURFUiAgIitDTVQ6IDBcclxuIgorCisgICAgaWYgKG1vZGVtLT51bnNvbF9mdW5jKSB7CisgICAgICAgIGludCAgICBsZW4sIG1heDsKKyAgICAgICAgY2hhciogIHA7CisKKyAgICAgICAgc3RyY3B5KCBtb2RlbS0+b3V0X2J1ZmYsIFNNU19VTlNPTF9IRUFERVIgKTsKKyAgICAgICAgcCAgID0gbW9kZW0tPm91dF9idWZmICsgKHNpemVvZihTTVNfVU5TT0xfSEVBREVSKS0xKTsKKyAgICAgICAgbWF4ID0gc2l6ZW9mKG1vZGVtLT5vdXRfYnVmZikgLSAzIC0gKHNpemVvZihTTVNfVU5TT0xfSEVBREVSKS0xKTsKKyAgICAgICAgbGVuID0gc21zcGR1X3RvX2hleCggc21zLCBwLCBtYXggKTsKKyAgICAgICAgaWYgKGxlbiA+IG1heCkgLyogdG9vIGxvbmcgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcFtsZW5dICAgPSAnXHInOworICAgICAgICBwW2xlbisxXSA9ICdcbic7CisgICAgICAgIHBbbGVuKzJdID0gMDsKKworICAgICAgICBSKCAiU01TPj4gJXNcbiIsIHAgKTsKKworICAgICAgICBtb2RlbS0+dW5zb2xfZnVuYyggbW9kZW0tPnVuc29sX29wYXF1ZSwgbW9kZW0tPm91dF9idWZmICk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2Ftb2RlbV9wcmludGYoIEFNb2RlbSAgbW9kZW0sIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCAgYXJnczsKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIHZzbnByaW50ZiggbW9kZW0tPm91dF9idWZmLCBzaXplb2YobW9kZW0tPm91dF9idWZmKSwgZm9ybWF0LCBhcmdzICk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgcmV0dXJuIG1vZGVtLT5vdXRfYnVmZjsKK30KKworc3RhdGljIHZvaWQKK2Ftb2RlbV9iZWdpbl9saW5lKCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBtb2RlbS0+b3V0X3NpemUgPSAwOworfQorCitzdGF0aWMgdm9pZAorYW1vZGVtX2FkZF9saW5lKCBBTW9kZW0gIG1vZGVtLCBjb25zdCBjaGFyKiAgZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBtb2RlbS0+b3V0X3NpemUgKz0gdnNucHJpbnRmKCBtb2RlbS0+b3V0X2J1ZmYgKyBtb2RlbS0+b3V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1vZGVtLT5vdXRfYnVmZikgLSBtb2RlbS0+b3V0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBhcmdzICk7CisgICAgdmFfZW5kKGFyZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2Ftb2RlbV9lbmRfbGluZSggQU1vZGVtICBtb2RlbSApCit7CisgICAgbW9kZW0tPm91dF9idWZmWyBtb2RlbS0+b3V0X3NpemUgXSA9IDA7CisgICAgcmV0dXJuIG1vZGVtLT5vdXRfYnVmZjsKK30KKworI2RlZmluZSBOVl9PUEVSX05BTUVfSU5ERVggICAgICAgICAgICAgICAgICAgICAib3Blcl9uYW1lX2luZGV4IgorI2RlZmluZSBOVl9PUEVSX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAib3Blcl9pbmRleCIKKyNkZWZpbmUgTlZfU0VMRUNUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdGlvbl9tb2RlIgorI2RlZmluZSBOVl9PUEVSX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAib3Blcl9jb3VudCIKKyNkZWZpbmUgTlZfTU9ERU1fVEVDSE5PTE9HWSAgICAgICAgICAgICAgICAgICAgIm1vZGVtX3RlY2hub2xvZ3kiCisjZGVmaW5lIE5WX1BSRUZFUlJFRF9NT0RFICAgICAgICAgICAgICAgICAgICAgICJwcmVmZXJyZWRfbW9kZSIKKyNkZWZpbmUgTlZfQ0RNQV9TVUJTQ1JJUFRJT05fU09VUkNFICAgICAgICAgICAgImNkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSIKKyNkZWZpbmUgTlZfQ0RNQV9ST0FNSU5HX1BSRUYgICAgICAgICAgICAgICAgICAgImNkbWFfcm9hbWluZ19wcmVmIgorI2RlZmluZSBOVl9JTl9FQ0JNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5fZWNibSIKKyNkZWZpbmUgTlZfRU1FUkdFTkNZX05VTUJFUl9GTVQgICAgICAgICAgICAgICAgICAgICJlbWVyZ2VuY3lfbnVtYmVyXyVkIgorI2RlZmluZSBOVl9QUkxfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAicHJsX3ZlcnNpb24iCisjZGVmaW5lIE5WX1NSRUdJU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmVnaXN0ZXIiCisKKyNkZWZpbmUgTUFYX0tFWV9OQU1FIDQwCisKK3N0YXRpYyBBQ29uZmlnICoKK2Ftb2RlbV9sb2FkX252cmFtKCBBTW9kZW0gbW9kZW0gKQoreworICAgIEFDb25maWcqIHJvb3QgPSBhY29uZmlnX25vZGUoTlVMTCwgTlVMTCk7CisgICAgRCgiVXNpbmcgY29uZmlnIGZpbGU6ICVzXG4iLCBtb2RlbS0+bnZyYW1fY29uZmlnX2ZpbGVuYW1lKTsKKyAgICBpZiAoYWNvbmZpZ19sb2FkX2ZpbGUocm9vdCwgbW9kZW0tPm52cmFtX2NvbmZpZ19maWxlbmFtZSkpIHsKKyAgICAgICAgRCgiVW5hYmxlIHRvIGxvYWQgY29uZmlnXG4iKTsKKyAgICAgICAgYWNvbmZpZ19zZXQocm9vdCwgTlZfTU9ERU1fVEVDSE5PTE9HWSwgImdzbSIpOworICAgICAgICBhY29uZmlnX3NhdmVfZmlsZShyb290LCBtb2RlbS0+bnZyYW1fY29uZmlnX2ZpbGVuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJvb3Q7Cit9CisKK3N0YXRpYyBpbnQKK2Ftb2RlbV9udnJhbV9nZXRfaW50KCBBTW9kZW0gbW9kZW0sIGNvbnN0IGNoYXIgKm52bmFtZSwgaW50IGRlZnZhbCkKK3sKKyAgICBpbnQgdmFsdWU7CisgICAgY2hhciBzdHJ2YWxbTUFYX0tFWV9OQU1FICsgMV07CisgICAgY2hhciAqbmV3dmFsdWU7CisKKyAgICB2YWx1ZSA9IGFjb25maWdfaW50KG1vZGVtLT5udnJhbV9jb25maWcsIG52bmFtZSwgZGVmdmFsKTsKKyAgICBzbnByaW50ZihzdHJ2YWwsIE1BWF9LRVlfTkFNRSwgIiVkIiwgdmFsdWUpOworICAgIEQoIlNldHRpbmcgdmFsdWUgb2YgJXMgdG8gJWQgKCVzKSIsbnZuYW1lLCB2YWx1ZSwgc3RydmFsKTsKKyAgICBuZXd2YWx1ZSA9IHN0cmR1cChzdHJ2YWwpOworICAgIGlmICghbmV3dmFsdWUpIHsKKyAgICAgICAgbmV3dmFsdWUgPSAiIjsKKyAgICB9CisgICAgYWNvbmZpZ19zZXQobW9kZW0tPm52cmFtX2NvbmZpZywgbnZuYW1lLCBuZXd2YWx1ZSk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK2NvbnN0IGNoYXIgKgorYW1vZGVtX252cmFtX2dldF9zdHIoIEFNb2RlbSBtb2RlbSwgY29uc3QgY2hhciAqbnZuYW1lLCBjb25zdCBjaGFyICpkZWZ2YWwpCit7CisgICAgY29uc3QgY2hhciAqdmFsdWU7CisKKyAgICB2YWx1ZSA9IGFjb25maWdfc3RyKG1vZGVtLT5udnJhbV9jb25maWcsIG52bmFtZSwgZGVmdmFsKTsKKworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgaWYgKCFkZWZ2YWwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdmFsdWUgPSBkZWZ2YWw7CisgICAgfQorCisgICAgYWNvbmZpZ19zZXQobW9kZW0tPm52cmFtX2NvbmZpZywgbnZuYW1lLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyBBQ2RtYVN1YnNjcmlwdGlvblNvdXJjZSBfYW1vZGVtX2dldF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2UoIEFNb2RlbSBtb2RlbSApCit7CisgICBpbnQgaXNzID0gLTE7CisgICBpc3MgPSBhbW9kZW1fbnZyYW1fZ2V0X2ludCggbW9kZW0sIE5WX0NETUFfU1VCU0NSSVBUSU9OX1NPVVJDRSwgQV9TVUJTQ1JJUFRJT05fUlVJTSApOworICAgaWYgKGlzcyA+PSBBX1NVQlNDUklQVElPTl9VTktOT1dOIHx8IGlzcyA8IDApIHsKKyAgICAgICBpc3MgPSBBX1NVQlNDUklQVElPTl9SVUlNOworICAgfQorCisgICByZXR1cm4gaXNzOworfQorCitzdGF0aWMgQUNkbWFSb2FtaW5nUHJlZiBfYW1vZGVtX2dldF9jZG1hX3JvYW1pbmdfcHJlZmVyZW5jZSggQU1vZGVtIG1vZGVtICkKK3sKKyAgIGludCBycCA9IC0xOworICAgcnAgPSBhbW9kZW1fbnZyYW1fZ2V0X2ludCggbW9kZW0sIE5WX0NETUFfUk9BTUlOR19QUkVGLCBBX1JPQU1JTkdfUFJFRl9BTlkgKTsKKyAgIGlmIChycCA+PSBBX1JPQU1JTkdfUFJFRl9VTktOT1dOIHx8IHJwIDwgMCkgeworICAgICAgIHJwID0gQV9ST0FNSU5HX1BSRUZfQU5ZOworICAgfQorCisgICByZXR1cm4gcnA7Cit9CisKK3N0YXRpYyB2b2lkCithbW9kZW1fcmVzZXQoIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGNvbnN0IGNoYXIgKnRtcDsKKyAgICBpbnQgaTsKKyAgICBtb2RlbS0+bnZyYW1fY29uZmlnID0gYW1vZGVtX2xvYWRfbnZyYW0obW9kZW0pOworICAgIG1vZGVtLT5yYWRpb19zdGF0ZSA9IEFfUkFESU9fU1RBVEVfT0ZGOworICAgIG1vZGVtLT53YWl0X3NtcyAgICA9IDA7CisKKyAgICBtb2RlbS0+dXNlX3NpZ25hbF9wcm9maWxlID0gMTsKKyAgICBtb2RlbS0+cXVhbGl0eSA9IE1PREVSQVRFOyAgICAvLyBUd28gc2lnbmFsIHN0cmVuZ3RoIGJhcnMKKyAgICBtb2RlbS0+cnNzaSA9IDc7ICAgLy8gVHdvIHNpZ25hbCBzdHJlbmd0aCBiYXJzCisgICAgbW9kZW0tPmJlciA9IDk5OyAgIC8vIE1lYW5zICd1bmtub3duJworCisgICAgbW9kZW0tPm9wZXJfbmFtZV9pbmRleCAgICAgPSBhbW9kZW1fbnZyYW1fZ2V0X2ludChtb2RlbSwgTlZfT1BFUl9OQU1FX0lOREVYLCAyKTsKKyAgICBtb2RlbS0+b3Blcl9zZWxlY3Rpb25fbW9kZSA9IGFtb2RlbV9udnJhbV9nZXRfaW50KG1vZGVtLCBOVl9TRUxFQ1RJT05fTU9ERSwgQV9TRUxFQ1RJT05fQVVUT01BVElDKTsKKyAgICBtb2RlbS0+b3Blcl9pbmRleCAgICAgICAgICA9IGFtb2RlbV9udnJhbV9nZXRfaW50KG1vZGVtLCBOVl9PUEVSX0lOREVYLCAwKTsKKyAgICBtb2RlbS0+b3Blcl9jb3VudCAgICAgICAgICA9IGFtb2RlbV9udnJhbV9nZXRfaW50KG1vZGVtLCBOVl9PUEVSX0NPVU5ULCAyKTsKKyAgICBtb2RlbS0+aW5fZW1lcmdlbmN5X21vZGUgICA9IGFtb2RlbV9udnJhbV9nZXRfaW50KG1vZGVtLCBOVl9JTl9FQ0JNLCAwKTsKKyAgICBtb2RlbS0+cHJsX3ZlcnNpb24gICAgICAgICA9IGFtb2RlbV9udnJhbV9nZXRfaW50KG1vZGVtLCBOVl9QUkxfVkVSU0lPTiwgMCk7CisKKyAgICBtb2RlbS0+ZW1lcmdlbmN5X251bWJlcnNbMF0gPSAiOTExIjsKKyAgICBjaGFyIGtleV9uYW1lW01BWF9LRVlfTkFNRSArIDFdOworICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfRU1FUkdFTkNZX05VTUJFUlM7IGkrKykgeworICAgICAgICBzbnByaW50ZihrZXlfbmFtZSxNQVhfS0VZX05BTUUsIE5WX0VNRVJHRU5DWV9OVU1CRVJfRk1ULCBpKTsKKyAgICAgICAgbW9kZW0tPmVtZXJnZW5jeV9udW1iZXJzW2ldID0gYW1vZGVtX252cmFtX2dldF9zdHIobW9kZW0sa2V5X25hbWUsIE5VTEwpOworICAgIH0KKworICAgIG1vZGVtLT5hcmVhX2NvZGUgPSAtMTsKKyAgICBtb2RlbS0+Y2VsbF9pZCAgID0gLTE7CisKKyAgICBzdHJjcHkoIG1vZGVtLT5vcGVyYXRvcnNbMF0ubmFtZVswXSwgT1BFUkFUT1JfSE9NRV9OQU1FICk7CisgICAgc3RyY3B5KCBtb2RlbS0+b3BlcmF0b3JzWzBdLm5hbWVbMV0sIE9QRVJBVE9SX0hPTUVfTkFNRSApOworICAgIHN0cmNweSggbW9kZW0tPm9wZXJhdG9yc1swXS5uYW1lWzJdLCBPUEVSQVRPUl9IT01FX01DQ01OQyApOworCisgICAgbW9kZW0tPm9wZXJhdG9yc1swXS5zdGF0dXMgICAgICAgID0gQV9TVEFUVVNfQVZBSUxBQkxFOworCisgICAgc3RyY3B5KCBtb2RlbS0+b3BlcmF0b3JzWzFdLm5hbWVbMF0sIE9QRVJBVE9SX1JPQU1JTkdfTkFNRSApOworICAgIHN0cmNweSggbW9kZW0tPm9wZXJhdG9yc1sxXS5uYW1lWzFdLCBPUEVSQVRPUl9ST0FNSU5HX05BTUUgKTsKKyAgICBzdHJjcHkoIG1vZGVtLT5vcGVyYXRvcnNbMV0ubmFtZVsyXSwgT1BFUkFUT1JfUk9BTUlOR19NQ0NNTkMgKTsKKworICAgIG1vZGVtLT5vcGVyYXRvcnNbMV0uc3RhdHVzICAgICAgICA9IEFfU1RBVFVTX0FWQUlMQUJMRTsKKworICAgIG1vZGVtLT52b2ljZV9tb2RlICAgPSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEX0ZVTEw7CisgICAgbW9kZW0tPnZvaWNlX3N0YXRlICA9IEFfUkVHSVNUUkFUSU9OX0hPTUU7CisgICAgbW9kZW0tPmRhdGFfbW9kZSAgICA9IEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRURfRlVMTDsKKyAgICBtb2RlbS0+ZGF0YV9zdGF0ZSAgID0gQV9SRUdJU1RSQVRJT05fSE9NRTsKKyAgICBtb2RlbS0+ZGF0YV9uZXR3b3JrID0gQV9EQVRBX05FVFdPUktfTFRFOworCisgICAgdG1wID0gYW1vZGVtX252cmFtX2dldF9zdHIoIG1vZGVtLCBOVl9NT0RFTV9URUNITk9MT0dZLCAiZ3NtIiApOworICAgIG1vZGVtLT50ZWNobm9sb2d5ID0gYW5kcm9pZF9wYXJzZV9tb2RlbV90ZWNoKCB0bXAgKTsKKyAgICBpZiAobW9kZW0tPnRlY2hub2xvZ3kgPT0gQV9URUNIX1VOS05PV04pIHsKKyAgICAgICAgbW9kZW0tPnRlY2hub2xvZ3kgPSBhY29uZmlnX2ludCggbW9kZW0tPm52cmFtX2NvbmZpZywgTlZfTU9ERU1fVEVDSE5PTE9HWSwgQV9URUNIX0dTTSApOworICAgIH0KKyAgICAvLyBTdXBwb3J0IEdTTSwgV0NETUEsIENETUEsIEV2RG8KKyAgICBtb2RlbS0+cHJlZmVycmVkX21hc2sgPSBhbW9kZW1fbnZyYW1fZ2V0X2ludCggbW9kZW0sIE5WX1BSRUZFUlJFRF9NT0RFLCAweDBmICk7CisKKyAgICBtb2RlbS0+c3Vic2NyaXB0aW9uX3NvdXJjZSA9IF9hbW9kZW1fZ2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSggbW9kZW0gKTsKKyAgICBtb2RlbS0+cm9hbWluZ19wcmVmID0gX2Ftb2RlbV9nZXRfY2RtYV9yb2FtaW5nX3ByZWZlcmVuY2UoIG1vZGVtICk7CisKKyAgICAvLyBDbGVhciBvdXQgYWxsIGxvZ2ljYWwgY2hhbm5lbHMsIG5vbmUgb2YgdGhlbSBhcmUgb3BlbiwgdGhleSBoYXZlIG5vIG5hbWVzCisgICAgbWVtc2V0KG1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzLCAwLCBzaXplb2YobW9kZW0tPmxvZ2ljYWxfY2hhbm5lbHMpKTsKK30KKworc3RhdGljIEFWb2ljZUNhbGwgYW1vZGVtX2FsbG9jX2NhbGwoIEFNb2RlbSAgIG1vZGVtICk7CitzdGF0aWMgdm9pZCBhbW9kZW1fZnJlZV9jYWxsKCBBTW9kZW0gIG1vZGVtLCBBVm9pY2VDYWxsICBjYWxsICk7CisKK3ZvaWQgYW1vZGVtX3N0YXRlX3NhdmUoQU1vZGVtIG1vZGVtLCBTeXNGaWxlKiBmaWxlKQoreworICAgIC8vIFRPRE86IHNhdmUgbW9yZSB0aGFuIGp1c3QgY2FsbHMgYW5kIGNhbGxfY291bnQgLSByc3NpLCBwb3dlciwgZXRjLgorCisgICAgc3lzX2ZpbGVfcHV0X2J5dGUoZmlsZSwgbW9kZW0tPmNhbGxfY291bnQpOworCisgICAgaW50IG5uOworICAgIGZvciAobm4gPSBtb2RlbS0+Y2FsbF9jb3VudCAtIDE7IG5uID49IDA7IG5uLS0pIHsKKyAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAvLyBOb3RlOiBub3Qgc2F2aW5nIHRpbWVycyBvciByZW1vdGUgY2FsbHMuCisgICAgICBBQ2FsbCAgICAgICBjYWxsICA9ICZ2Y2FsbC0+Y2FsbDsKKyAgICAgIHN5c19maWxlX3B1dF9ieXRlKGZpbGUsIGNhbGwtPmRpcik7CisgICAgICBzeXNfZmlsZV9wdXRfYnl0ZShmaWxlLCBjYWxsLT5zdGF0ZSk7CisgICAgICBzeXNfZmlsZV9wdXRfYnl0ZShmaWxlLCBjYWxsLT5tb2RlKTsKKyAgICAgIHN5c19maWxlX3B1dF9iZTMyKGZpbGUsIGNhbGwtPm11bHRpKTsKKyAgICAgIHN5c19maWxlX3B1dF9idWZmZXIoZmlsZSwgKHVpbnQ4X3QgKiljYWxsLT5udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFfQ0FMTF9OVU1CRVJfTUFYX1NJWkUrMSk7CisgICAgfQorfQorCitpbnQgYW1vZGVtX3N0YXRlX2xvYWQoQU1vZGVtIG1vZGVtLCBTeXNGaWxlKiBmaWxlKQoreworICAgIC8vIEluIGNhc2UgdGhlcmUgYXJlIHRpbWVycyBvciByZW1vdGUgY2FsbHMuCisgICAgaW50IG5uOworICAgIGZvciAobm4gPSBtb2RlbS0+Y2FsbF9jb3VudCAtIDE7IG5uID49IDA7IG5uLS0pIHsKKyAgICAgIGFtb2RlbV9mcmVlX2NhbGwoIG1vZGVtLCBtb2RlbS0+Y2FsbHMgKyBubik7CisgICAgfQorCisgICAgaW50IGNhbGxfY291bnQgPSBzeXNfZmlsZV9nZXRfYnl0ZShmaWxlKTsKKyAgICBmb3IgKG5uID0gY2FsbF9jb3VudDsgbm4gPiAwOyBubi0tKSB7CisgICAgICBBVm9pY2VDYWxsIHZjYWxsID0gYW1vZGVtX2FsbG9jX2NhbGwoIG1vZGVtICk7CisgICAgICBBQ2FsbCAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgICAgY2FsbC0+ZGlyICAgPSBzeXNfZmlsZV9nZXRfYnl0ZShmaWxlKTsKKyAgICAgIGNhbGwtPnN0YXRlID0gc3lzX2ZpbGVfZ2V0X2J5dGUoZmlsZSk7CisgICAgICBjYWxsLT5tb2RlICA9IHN5c19maWxlX2dldF9ieXRlKGZpbGUpOworICAgICAgY2FsbC0+bXVsdGkgPSBzeXNfZmlsZV9nZXRfYmUzMihmaWxlKTsKKyAgICAgIHN5c19maWxlX2dldF9idWZmZXIoZmlsZSwgKHVpbnQ4X3QgKiljYWxsLT5udW1iZXIsIEFfQ0FMTF9OVU1CRVJfTUFYX1NJWkUrMSApOworICAgIH0KKworICAgIHJldHVybiAwOyAvLyA+PTAgSGFwcHkKK30KKworc3RhdGljIEFNb2RlbVJlYyAgIF9hbmRyb2lkX21vZGVtWzFdOworCitBTW9kZW0KK2Ftb2RlbV9jcmVhdGUoIGludCAgYmFzZV9wb3J0LCBBTW9kZW1VbnNvbEZ1bmMgIHVuc29sX2Z1bmMsIHZvaWQqICB1bnNvbF9vcGFxdWUgKQoreworICAgIEFNb2RlbSAgbW9kZW0gPSBfYW5kcm9pZF9tb2RlbTsKKyAgICBjaGFyIG52Zm5hbWVbTUFYX1BBVEhdOworICAgIGNoYXIgKnN0YXJ0ID0gbnZmbmFtZTsKKyAgICBjaGFyICplbmQgPSBzdGFydCArIHNpemVvZihudmZuYW1lKTsKKworICAgIG1vZGVtLT5iYXNlX3BvcnQgICAgPSBiYXNlX3BvcnQ7CisgICAgc3RhcnQgPSBidWZwcmludF9jb25maWdfZmlsZSggc3RhcnQsIGVuZCwgIm1vZGVtLW52LXJhbS0iICk7CisgICAgc3RhcnQgPSBidWZwcmludCggc3RhcnQsIGVuZCwgIiVkIiwgbW9kZW0tPmJhc2VfcG9ydCApOworICAgIG1vZGVtLT5udnJhbV9jb25maWdfZmlsZW5hbWUgPSBzdHJkdXAoIG52Zm5hbWUgKTsKKworICAgIGFtb2RlbV9yZXNldCggbW9kZW0gKTsKKyAgICBtb2RlbS0+c3VwcG9ydHNOZXR3b3JrRGF0YVR5cGUgPSAxOworICAgIG1vZGVtLT51bnNvbF9mdW5jICAgPSB1bnNvbF9mdW5jOworICAgIG1vZGVtLT51bnNvbF9vcGFxdWUgPSB1bnNvbF9vcGFxdWU7CisKKyAgICBtb2RlbS0+c2ltID0gYXNpbWNhcmRfY3JlYXRlKGJhc2VfcG9ydCk7CisKKyAgICBzeXNfbWFpbl9pbml0KCk7CisKKyAgICBhY29uZmlnX3NhdmVfZmlsZSggbW9kZW0tPm52cmFtX2NvbmZpZywgbW9kZW0tPm52cmFtX2NvbmZpZ19maWxlbmFtZSApOworICAgIHJldHVybiAgbW9kZW07Cit9CisKK3ZvaWQKK2Ftb2RlbV9zZXRfbGVnYWN5KCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBtb2RlbS0+c3VwcG9ydHNOZXR3b3JrRGF0YVR5cGUgPSAwOworfQorCit2b2lkCithbW9kZW1fZGVzdHJveSggQU1vZGVtICBtb2RlbSApCit7CisgICAgYXNpbWNhcmRfZGVzdHJveSggbW9kZW0tPnNpbSApOworICAgIG1vZGVtLT5zaW0gPSBOVUxMOworfQorCisKK3N0YXRpYyBpbnQKK2Ftb2RlbV9oYXNfbmV0d29yayggQU1vZGVtICBtb2RlbSApCit7CisgICAgcmV0dXJuICEobW9kZW0tPnJhZGlvX3N0YXRlID09IEFfUkFESU9fU1RBVEVfT0ZGICAgfHwKKyAgICAgICAgICAgICBtb2RlbS0+b3Blcl9pbmRleCA8IDAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgIG1vZGVtLT5vcGVyX2luZGV4ID49IG1vZGVtLT5vcGVyX2NvdW50IHx8CisgICAgICAgICAgICAgbW9kZW0tPm9wZXJfc2VsZWN0aW9uX21vZGUgPT0gQV9TRUxFQ1RJT05fREVSRUdJU1RSQVRJT04gKTsKK30KKworCitBUmFkaW9TdGF0ZQorYW1vZGVtX2dldF9yYWRpb19zdGF0ZSggQU1vZGVtIG1vZGVtICkKK3sKKyAgICByZXR1cm4gbW9kZW0tPnJhZGlvX3N0YXRlOworfQorCit2b2lkCithbW9kZW1fc2V0X3JhZGlvX3N0YXRlKCBBTW9kZW0gbW9kZW0sIEFSYWRpb1N0YXRlICBzdGF0ZSApCit7CisgICAgbW9kZW0tPnJhZGlvX3N0YXRlID0gc3RhdGU7Cit9CisKK0FTaW1DYXJkCithbW9kZW1fZ2V0X3NpbSggQU1vZGVtICBtb2RlbSApCit7CisgICAgcmV0dXJuICBtb2RlbS0+c2ltOworfQorCitBUmVnaXN0cmF0aW9uU3RhdGUKK2Ftb2RlbV9nZXRfdm9pY2VfcmVnaXN0cmF0aW9uKCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICByZXR1cm4gbW9kZW0tPnZvaWNlX3N0YXRlOworfQorCit2b2lkCithbW9kZW1fc2V0X3ZvaWNlX3JlZ2lzdHJhdGlvbiggQU1vZGVtICBtb2RlbSwgQVJlZ2lzdHJhdGlvblN0YXRlICBzdGF0ZSApCit7CisgICAgbW9kZW0tPnZvaWNlX3N0YXRlID0gc3RhdGU7CisKKyAgICBpZiAoc3RhdGUgPT0gQV9SRUdJU1RSQVRJT05fSE9NRSkKKyAgICAgICAgbW9kZW0tPm9wZXJfaW5kZXggPSBPUEVSQVRPUl9IT01FX0lOREVYOworICAgIGVsc2UgaWYgKHN0YXRlID09IEFfUkVHSVNUUkFUSU9OX1JPQU1JTkcpCisgICAgICAgIG1vZGVtLT5vcGVyX2luZGV4ID0gT1BFUkFUT1JfUk9BTUlOR19JTkRFWDsKKworICAgIHN3aXRjaCAobW9kZW0tPnZvaWNlX21vZGUpIHsKKyAgICAgICAgY2FzZSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEOgorICAgICAgICAgICAgYW1vZGVtX3Vuc29sKCBtb2RlbSwgIitDUkVHOiAlZCwlZFxyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPnZvaWNlX21vZGUsIG1vZGVtLT52b2ljZV9zdGF0ZSApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEX0ZVTEw6CisgICAgICAgICAgICBhbW9kZW1fdW5zb2woIG1vZGVtLCAiK0NSRUc6ICVkLCVkLCBcIiUwNHhcIiwgXCIlMDR4XCJcciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT52b2ljZV9tb2RlLCBtb2RlbS0+dm9pY2Vfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5hcmVhX2NvZGUgJiAweGZmZmYsIG1vZGVtLT5jZWxsX2lkICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgOworICAgIH0KK30KKworQVJlZ2lzdHJhdGlvblN0YXRlCithbW9kZW1fZ2V0X2RhdGFfcmVnaXN0cmF0aW9uKCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICByZXR1cm4gbW9kZW0tPmRhdGFfc3RhdGU7Cit9CisKK3ZvaWQKK2Ftb2RlbV9zZXRfZGF0YV9yZWdpc3RyYXRpb24oIEFNb2RlbSAgbW9kZW0sIEFSZWdpc3RyYXRpb25TdGF0ZSAgc3RhdGUgKQoreworICAgIG1vZGVtLT5kYXRhX3N0YXRlID0gc3RhdGU7CisKKyAgICBzd2l0Y2ggKG1vZGVtLT5kYXRhX21vZGUpIHsKKyAgICAgICAgY2FzZSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEOgorICAgICAgICAgICAgYW1vZGVtX3Vuc29sKCBtb2RlbSwgIitDR1JFRzogJWQsJWRcciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX21vZGUsIG1vZGVtLT5kYXRhX3N0YXRlICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRURfRlVMTDoKKyAgICAgICAgICAgIGlmIChtb2RlbS0+c3VwcG9ydHNOZXR3b3JrRGF0YVR5cGUpCisgICAgICAgICAgICAgICAgYW1vZGVtX3Vuc29sKCBtb2RlbSwgIitDR1JFRzogJWQsJWQsXCIlMDR4XCIsXCIlMDR4XCIsXCIlMDR4XCJcciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmRhdGFfbW9kZSwgbW9kZW0tPmRhdGFfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmFyZWFfY29kZSAmIDB4ZmZmZiwgbW9kZW0tPmNlbGxfaWQgJiAweGZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmRhdGFfbmV0d29yayApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFtb2RlbV91bnNvbCggbW9kZW0sICIrQ0dSRUc6ICVkLCVkLFwiJTA0eFwiLFwiJTA0eFwiXHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX21vZGUsIG1vZGVtLT5kYXRhX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5hcmVhX2NvZGUgJiAweGZmZmYsIG1vZGVtLT5jZWxsX2lkICYgMHhmZmZmICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgOworICAgIH0KK30KKworc3RhdGljIGludAorYW1vZGVtX252cmFtX3NldCggQU1vZGVtIG1vZGVtLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSApCit7CisgICAgYWNvbmZpZ19zZXQobW9kZW0tPm52cmFtX2NvbmZpZywgbmFtZSwgdmFsdWUpOworICAgIHJldHVybiAwOworfQorc3RhdGljIEFNb2RlbVRlY2gKK3RlY2hfZnJvbV9uZXR3b3JrX3R5cGUoIEFEYXRhTmV0d29ya1R5cGUgdHlwZSApCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgQV9EQVRBX05FVFdPUktfR1BSUzoKKyAgICAgICAgY2FzZSBBX0RBVEFfTkVUV09SS19FREdFOgorICAgICAgICBjYXNlIEFfREFUQV9ORVRXT1JLX1VNVFM6CisgICAgICAgICAgICByZXR1cm4gQV9URUNIX0dTTTsKKyAgICAgICAgY2FzZSBBX0RBVEFfTkVUV09SS19MVEU6CisgICAgICAgICAgICByZXR1cm4gQV9URUNIX0xURTsKKyAgICAgICAgY2FzZSBBX0RBVEFfTkVUV09SS19VTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFfVEVDSF9VTktOT1dOOworICAgIH0KKyAgICByZXR1cm4gQV9URUNIX1VOS05PV047Cit9CisKK3ZvaWQKK2Ftb2RlbV9zZXRfZGF0YV9uZXR3b3JrX3R5cGUoIEFNb2RlbSAgbW9kZW0sIEFEYXRhTmV0d29ya1R5cGUgICB0eXBlICkKK3sKKyAgICBBTW9kZW1UZWNoIG1vZGVtVGVjaDsKKyAgICBtb2RlbS0+ZGF0YV9uZXR3b3JrID0gdHlwZTsKKyAgICBhbW9kZW1fc2V0X2RhdGFfcmVnaXN0cmF0aW9uKCBtb2RlbSwgbW9kZW0tPmRhdGFfc3RhdGUgKTsKKyAgICBtb2RlbVRlY2ggPSB0ZWNoX2Zyb21fbmV0d29ya190eXBlKHR5cGUpOworICAgIGlmIChtb2RlbS0+dW5zb2xfZnVuYyAmJiBtb2RlbVRlY2ggIT0gQV9URUNIX1VOS05PV04pIHsKKyAgICAgICAgaWYgKF9hbW9kZW1fc3dpdGNoX3RlY2hub2xvZ3koIG1vZGVtLCBtb2RlbVRlY2gsIG1vZGVtLT5wcmVmZXJyZWRfbWFzayApKSB7CisgICAgICAgICAgICBtb2RlbS0+dW5zb2xfZnVuYyggbW9kZW0tPnVuc29sX29wYXF1ZSwgbW9kZW0tPm91dF9idWZmICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludAorYW1vZGVtX2dldF9vcGVyYXRvcl9uYW1lICggQU1vZGVtICBtb2RlbSwgQU5hbWVJbmRleCAgaW5kZXgsIGNoYXIqICBidWZmZXIsIGludCAgYnVmZmVyX3NpemUgKQoreworICAgIEFPcGVyYXRvciAgb3BlcjsKKyAgICBpbnQgICAgICAgIGxlbjsKKworICAgIGlmICggKHVuc2lnbmVkKW1vZGVtLT5vcGVyX2luZGV4ID49ICh1bnNpZ25lZCltb2RlbS0+b3Blcl9jb3VudCB8fAorICAgICAgICAgKHVuc2lnbmVkKWluZGV4ID4gMiApCisgICAgICAgIHJldHVybiAwOworCisgICAgb3BlciA9IG1vZGVtLT5vcGVyYXRvcnMgKyBtb2RlbS0+b3Blcl9pbmRleDsKKyAgICBsZW4gID0gc3RybGVuKG9wZXItPm5hbWVbaW5kZXhdKSArIDE7CisKKyAgICBpZiAoYnVmZmVyX3NpemUgPiBsZW4pCisgICAgICAgIGJ1ZmZlcl9zaXplID0gbGVuOworCisgICAgaWYgKGJ1ZmZlcl9zaXplID4gMCkgeworICAgICAgICBtZW1jcHkoIGJ1ZmZlciwgb3Blci0+bmFtZVtpbmRleF0sIGJ1ZmZlcl9zaXplLTEgKTsKKyAgICAgICAgYnVmZmVyW2J1ZmZlcl9zaXplXSA9IDA7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKKy8qIHJlc2V0IG9uZSBvcGVyYXRvciBuYW1lIGZyb20gYSB1c2VyLXByb3ZpZGVkIGJ1ZmZlciwgc2V0IGJ1ZmZlcl9zaXplIHRvIC0xIGZvciB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5ncyAqLwordm9pZAorYW1vZGVtX3NldF9vcGVyYXRvcl9uYW1lKCBBTW9kZW0gIG1vZGVtLCBBTmFtZUluZGV4ICBpbmRleCwgY29uc3QgY2hhciogIGJ1ZmZlciwgaW50ICBidWZmZXJfc2l6ZSApCit7CisgICAgQU9wZXJhdG9yICBvcGVyOworICAgIGludCAgICAgICAgYXZhaWw7CisKKyAgICBpZiAoICh1bnNpZ25lZCltb2RlbS0+b3Blcl9pbmRleCA+PSAodW5zaWduZWQpbW9kZW0tPm9wZXJfY291bnQgfHwKKyAgICAgICAgICh1bnNpZ25lZClpbmRleCA+IDIgKQorICAgICAgICByZXR1cm47CisKKyAgICBvcGVyID0gbW9kZW0tPm9wZXJhdG9ycyArIG1vZGVtLT5vcGVyX2luZGV4OworCisgICAgYXZhaWwgPSBzaXplb2Yob3Blci0+bmFtZVswXSk7CisgICAgaWYgKGJ1ZmZlcl9zaXplIDwgMCkKKyAgICAgICAgYnVmZmVyX3NpemUgPSBzdHJsZW4oYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyX3NpemUgPiBhdmFpbC0xKQorICAgICAgICBidWZmZXJfc2l6ZSA9IGF2YWlsLTE7CisgICAgbWVtY3B5KCBvcGVyLT5uYW1lW2luZGV4XSwgYnVmZmVyLCBidWZmZXJfc2l6ZSApOworICAgIG9wZXItPm5hbWVbaW5kZXhdW2J1ZmZlcl9zaXplXSA9IDA7Cit9CisKKy8qKiBDQUxMUworICoqLworaW50CithbW9kZW1fZ2V0X2NhbGxfY291bnQoIEFNb2RlbSAgbW9kZW0gKQoreworICAgIHJldHVybiBtb2RlbS0+Y2FsbF9jb3VudDsKK30KKworQUNhbGwKK2Ftb2RlbV9nZXRfY2FsbCggQU1vZGVtICBtb2RlbSwgaW50ICBpbmRleCApCit7CisgICAgaWYgKCh1bnNpZ25lZClpbmRleCA+PSAodW5zaWduZWQpbW9kZW0tPmNhbGxfY291bnQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuICZtb2RlbS0+Y2FsbHNbaW5kZXhdLmNhbGw7Cit9CisKK3N0YXRpYyBBVm9pY2VDYWxsCithbW9kZW1fYWxsb2NfY2FsbCggQU1vZGVtICAgbW9kZW0gKQoreworICAgIEFWb2ljZUNhbGwgIGNhbGwgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICBjb3VudCA9IG1vZGVtLT5jYWxsX2NvdW50OworCisgICAgaWYgKGNvdW50IDwgTUFYX0NBTExTKSB7CisgICAgICAgIGludCAgaWQ7CisKKyAgICAgICAgLyogZmluZCBhIHZhbGlkIGlkIGZvciB0aGlzIGNhbGwgKi8KKyAgICAgICAgZm9yIChpZCA9IDA7IGlkIDwgbW9kZW0tPmNhbGxfY291bnQ7IGlkKyspIHsKKyAgICAgICAgICAgIGludCAgZm91bmQgPSAwOworICAgICAgICAgICAgaW50ICBubjsKKyAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IGNvdW50OyBubisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCBtb2RlbS0+Y2FsbHNbbm5dLmNhbGwuaWQgPT0gKGlkKzEpICkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FsbCAgICAgICAgICA9IG1vZGVtLT5jYWxscyArIGNvdW50OworICAgICAgICBjYWxsLT5jYWxsLmlkID0gaWQgKyAxOworICAgICAgICBjYWxsLT5tb2RlbSAgID0gbW9kZW07CisKKyAgICAgICAgbW9kZW0tPmNhbGxfY291bnQgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIGNhbGw7Cit9CisKKworc3RhdGljIHZvaWQKK2Ftb2RlbV9mcmVlX2NhbGwoIEFNb2RlbSAgbW9kZW0sIEFWb2ljZUNhbGwgIGNhbGwgKQoreworICAgIGludCAgbm47CisKKyAgICBpZiAoY2FsbC0+dGltZXIpIHsKKyAgICAgICAgc3lzX3RpbWVyX2Rlc3Ryb3koIGNhbGwtPnRpbWVyICk7CisgICAgICAgIGNhbGwtPnRpbWVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY2FsbC0+aXNfcmVtb3RlKSB7CisgICAgICAgIHJlbW90ZV9jYWxsX2NhbmNlbCggY2FsbC0+Y2FsbC5udW1iZXIsIG1vZGVtLT5iYXNlX3BvcnQgKTsKKyAgICAgICAgY2FsbC0+aXNfcmVtb3RlID0gMDsKKyAgICB9CisKKyAgICBmb3IgKG5uID0gMDsgbm4gPCBtb2RlbS0+Y2FsbF9jb3VudDsgbm4rKykgeworICAgICAgICBpZiAoIG1vZGVtLT5jYWxscyArIG5uID09IGNhbGwgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGFzc2VydCggbm4gPCBtb2RlbS0+Y2FsbF9jb3VudCApOworCisgICAgbWVtbW92ZSggbW9kZW0tPmNhbGxzICsgbm4sCisgICAgICAgICAgICAgbW9kZW0tPmNhbGxzICsgbm4gKyAxLAorICAgICAgICAgICAgIChtb2RlbS0+Y2FsbF9jb3VudCAtIDEgLSBubikqc2l6ZW9mKCpjYWxsKSApOworCisgICAgbW9kZW0tPmNhbGxfY291bnQgLT0gMTsKK30KKworCitzdGF0aWMgQVZvaWNlQ2FsbAorYW1vZGVtX2ZpbmRfY2FsbCggQU1vZGVtICBtb2RlbSwgaW50ICBpZCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgIEFWb2ljZUNhbGwgY2FsbCA9IG1vZGVtLT5jYWxscyArIG5uOworICAgICAgICBpZiAoY2FsbC0+Y2FsbC5pZCA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiBjYWxsOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2Ftb2RlbV9zZW5kX2NhbGxzX3VwZGF0ZSggQU1vZGVtICBtb2RlbSApCit7CisgICAvKiBkZXNwaXRlIGl0cyBuYW1lLCB0aGlzIHJlYWxseSB0ZWxscyB0aGUgc3lzdGVtIHRoYXQgdGhlIGNhbGwKKyAgICAqIHN0YXRlIGhhcyBjaGFuZ2VkICovCisgICAgYW1vZGVtX3Vuc29sKCBtb2RlbSwgIlJJTkdcciIgKTsKK30KKworCitpbnQKK2Ftb2RlbV9hZGRfaW5ib3VuZF9jYWxsKCBBTW9kZW0gIG1vZGVtLCBjb25zdCBjaGFyKiAgbnVtYmVyICkKK3sKKyAgICBBVm9pY2VDYWxsICB2Y2FsbCA9IGFtb2RlbV9hbGxvY19jYWxsKCBtb2RlbSApOworICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgIGludCAgICAgICAgIGxlbjsKKworICAgIGlmIChjYWxsID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGNhbGwtPmRpciAgID0gQV9DQUxMX0lOQk9VTkQ7CisgICAgY2FsbC0+c3RhdGUgPSBBX0NBTExfSU5DT01JTkc7CisgICAgY2FsbC0+bW9kZSAgPSBBX0NBTExfVk9JQ0U7CisgICAgY2FsbC0+bXVsdGkgPSAwOworCisgICAgdmNhbGwtPmlzX3JlbW90ZSA9IChyZW1vdGVfbnVtYmVyX3N0cmluZ190b19wb3J0KG51bWJlcikgPiAwKTsKKworICAgIGxlbiAgPSBzdHJsZW4obnVtYmVyKTsKKyAgICBpZiAobGVuID49IHNpemVvZihjYWxsLT5udW1iZXIpKQorICAgICAgICBsZW4gPSBzaXplb2YoY2FsbC0+bnVtYmVyKS0xOworCisgICAgbWVtY3B5KCBjYWxsLT5udW1iZXIsIG51bWJlciwgbGVuICk7CisgICAgY2FsbC0+bnVtYmVyW2xlbl0gPSAwOworCisgICAgYW1vZGVtX3NlbmRfY2FsbHNfdXBkYXRlKCBtb2RlbSApOworICAgIHJldHVybiAwOworfQorCitBQ2FsbAorYW1vZGVtX2ZpbmRfY2FsbF9ieV9udW1iZXIoIEFNb2RlbSAgbW9kZW0sIGNvbnN0IGNoYXIqICBudW1iZXIgKQoreworICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzOworICAgIEFWb2ljZUNhbGwgIHZlbmQgID0gdmNhbGwgKyBtb2RlbS0+Y2FsbF9jb3VudDsKKworICAgIGlmICghbnVtYmVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoIDsgdmNhbGwgPCB2ZW5kOyB2Y2FsbCsrICkKKyAgICAgICAgaWYgKCAhc3RyY21wKHZjYWxsLT5jYWxsLm51bWJlciwgbnVtYmVyKSApCisgICAgICAgICAgICByZXR1cm4gJnZjYWxsLT5jYWxsOworCisgICAgcmV0dXJuICBOVUxMOworfQorCit2b2lkCithbW9kZW1fc2V0X3NpZ25hbF9zdHJlbmd0aCggQU1vZGVtIG1vZGVtLCBpbnQgcnNzaSwgaW50IGJlciApCit7CisgICAgbW9kZW0tPnJzc2kgPSByc3NpOworICAgIG1vZGVtLT5iZXIgPSBiZXI7CisgICAgbW9kZW0tPnVzZV9zaWduYWxfcHJvZmlsZSA9IDA7Cit9CisKK3ZvaWQKK2Ftb2RlbV9zZXRfc2lnbmFsX3N0cmVuZ3RoX3Byb2ZpbGUoIEFNb2RlbSBtb2RlbSwgaW50IHF1YWxpdHkgKQoreworICAgIGlmIChxdWFsaXR5ID49IE5PTkUgJiYgcXVhbGl0eSA8PSBHUkVBVCkgeworICAgICAgICBtb2RlbS0+cXVhbGl0eSA9IHF1YWxpdHk7CisgICAgICAgIG1vZGVtLT51c2Vfc2lnbmFsX3Byb2ZpbGUgPSAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2FjYWxsX3NldF9zdGF0ZSggQVZvaWNlQ2FsbCAgICBjYWxsLCBBQ2FsbFN0YXRlICBzdGF0ZSApCit7CisgICAgaWYgKHN0YXRlICE9IGNhbGwtPmNhbGwuc3RhdGUpCisgICAgeworICAgICAgICBpZiAoY2FsbC0+aXNfcmVtb3RlKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiAgbnVtYmVyID0gY2FsbC0+Y2FsbC5udW1iZXI7CisgICAgICAgICAgICBpbnQgICAgICAgICAgcG9ydCAgID0gY2FsbC0+bW9kZW0tPmJhc2VfcG9ydDsKKworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQV9DQUxMX0hFTEQ6CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9jYWxsX290aGVyKCBudW1iZXIsIHBvcnQsIFJFTU9URV9DQUxMX0hPTEQgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEFfQ0FMTF9BQ1RJVkU6CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9jYWxsX290aGVyKCBudW1iZXIsIHBvcnQsIFJFTU9URV9DQUxMX0FDQ0VQVCApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYWxsLT5jYWxsLnN0YXRlID0gc3RhdGU7CisgICAgfQorfQorCisKK2ludAorYW1vZGVtX3VwZGF0ZV9jYWxsKCBBTW9kZW0gIG1vZGVtLCBjb25zdCBjaGFyKiAgZnJvbU51bWJlciwgQUNhbGxTdGF0ZSAgc3RhdGUgKQoreworICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gKEFWb2ljZUNhbGwpIGFtb2RlbV9maW5kX2NhbGxfYnlfbnVtYmVyKG1vZGVtLCBmcm9tTnVtYmVyKTsKKworICAgIGlmICh2Y2FsbCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhY2FsbF9zZXRfc3RhdGUoIHZjYWxsLCBzdGF0ZSApOworICAgIGFtb2RlbV9zZW5kX2NhbGxzX3VwZGF0ZShtb2RlbSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CithbW9kZW1fZGlzY29ubmVjdF9jYWxsKCBBTW9kZW0gIG1vZGVtLCBjb25zdCBjaGFyKiAgbnVtYmVyICkKK3sKKyAgICBBVm9pY2VDYWxsICB2Y2FsbCA9IChBVm9pY2VDYWxsKSBhbW9kZW1fZmluZF9jYWxsX2J5X251bWJlcihtb2RlbSwgbnVtYmVyKTsKKworICAgIGlmICghdmNhbGwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGFtb2RlbV9mcmVlX2NhbGwoIG1vZGVtLCB2Y2FsbCApOworICAgIGFtb2RlbV9zZW5kX2NhbGxzX3VwZGF0ZShtb2RlbSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBDT01NQU5EIEhBTkRMRVJTCisgKiovCisKK3N0YXRpYyBjb25zdCBjaGFyKgordW5rbm93bkNvbW1hbmQoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIG1vZGVtPW1vZGVtOworICAgIGZwcmludGYoc3RkZXJyLCAiPj4+IHVua25vd24gY29tbWFuZCAnJXMnXG4iLCBjbWQgKTsKKyAgICByZXR1cm4gIkVSUk9SOiB1bmtub3duIGNvbW1hbmRcciI7Cit9CisKKy8qCisgKiBUZWxsIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0ZWNoIGlzIHZhbGlkIGZvciB0aGUgcHJlZmVycmVkIG1hc2suCisgKiBAcG1hc2s6IFRoZSBwcmVmZXJyZWQgbWFzaworICogQHRlY2g6IFRoZSBBTW9kZW1UZWNoIHdlIHRyeSB0byB2YWxpZGF0ZQorICogcmV0dXJuOiBJZiB0aGUgc3BlY2lmaWVkIHRlY2hub2xvZ3kgaXMgbm90IHNldCBpbiBhbnkgb2YgdGhlIDQKKyAqICAgICAgICAgYml0bWFza3MsIHJldHVybiAwLgorICogICAgICAgICBPdGhlcndpc2UsIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlLgorICovCitzdGF0aWMgaW50IG1hdGNoUHJlZmVycmVkTWFzayggaW50MzJfdCBwbWFzaywgQU1vZGVtVGVjaCB0ZWNoICkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpPTM7IGkgPj0gMCA7IGktLSApIHsKKyAgICAgICAgaWYgKHBtYXNrICYgKDEgPDwgKHRlY2ggKyBpKjggKSkpIHsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQU1vZGVtVGVjaAorY2hvb3NlVGVjaEZyb21NYXNrKCBBTW9kZW0gbW9kZW0sIGludDMyX3QgcHJlZmVycmVkICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIC8qIFRPRE86IEN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBvbmx5IHJldHVybiB0aGUgaGlnaGVzdCBwcmlvcml0eSwKKyAgICAgKiBsb3dlc3QgbnVtYmVyZWQgdGVjaG5vbG9neSB0aGF0IGlzIHNldCBpbiB0aGUgbWFzay4KKyAgICAgKiBIb3dldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBjaGFuZ2VkIHRvIGNvbnNpZGVyIGN1cnJlbnRseQorICAgICAqIGF2YWlsYWJsZSBuZXR3b3JrcyBzZXQgZnJvbSB0aGUgY29uc29sZSAob3Igc29tZXdoZXJlIGVsc2UpCisgICAgICovCisgICAgZm9yICggaT0zIDsgaSA+PSAwOyBpLS0gKSB7CisgICAgICAgIGZvciAoIGo9MCA7IGogPCBBX1RFQ0hfVU5LTk9XTiA7IGorKyApIHsKKyAgICAgICAgICAgIGlmIChwcmVmZXJyZWQgJiAoMSA8PCAoaiArIDggKiBpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChBTW9kZW1UZWNoKSBqOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydCgiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIiA9PSAwKTsKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIEp1c3QgdG8gcGxlYXNlIHRoZSBjb21waWxlci4KKyAgICByZXR1cm4gQV9URUNIX1VOS05PV047Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorX2Ftb2RlbV9zd2l0Y2hfdGVjaG5vbG9neSggQU1vZGVtIG1vZGVtLCBBTW9kZW1UZWNoIG5ld3RlY2gsIGludDMyX3QgbmV3cHJlZmVycmVkICkKK3sKKyAgICBEKCJfYW1vZGVtX3N3aXRjaF90ZWNobm9sb2d5OiBvbGR0ZWNoOiAlZCwgbmV3dGVjaCAlZCwgcHJlZmVycmVkOiAlZC4gbmV3cHJlZmVycmVkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlbS0+dGVjaG5vbG9neSwgbmV3dGVjaCwgbW9kZW0tPnByZWZlcnJlZF9tYXNrLCBuZXdwcmVmZXJyZWQpOworICAgIGNvbnN0IGNoYXIgKnJldCA9ICIrQ1RFQzogRE9ORSI7CisgICAgYXNzZXJ0KCBtb2RlbSApOworCisgICAgaWYgKCFuZXdwcmVmZXJyZWQpIHsKKyAgICAgICAgcmV0dXJuICJFUlJPUjogQXQgbGVhc3Qgb25lIHRlY2hub2xvZ3kgbXVzdCBiZSBlbmFibGVkIjsKKyAgICB9CisgICAgaWYgKG1vZGVtLT5wcmVmZXJyZWRfbWFzayAhPSBuZXdwcmVmZXJyZWQpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtNQVhfS0VZX05BTUUgKyAxXTsKKyAgICAgICAgbW9kZW0tPnByZWZlcnJlZF9tYXNrID0gbmV3cHJlZmVycmVkOworICAgICAgICBzbnByaW50Zih2YWx1ZSwgTUFYX0tFWV9OQU1FLCAiJWQiLCBuZXdwcmVmZXJyZWQpOworICAgICAgICBhbW9kZW1fbnZyYW1fc2V0KG1vZGVtLCBOVl9QUkVGRVJSRURfTU9ERSwgdmFsdWUpOworICAgICAgICBpZiAoIW1hdGNoUHJlZmVycmVkTWFzayhtb2RlbS0+cHJlZmVycmVkX21hc2ssIG5ld3RlY2gpKSB7CisgICAgICAgICAgICBuZXd0ZWNoID0gY2hvb3NlVGVjaEZyb21NYXNrKG1vZGVtLCBuZXdwcmVmZXJyZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1vZGVtLT50ZWNobm9sb2d5ICE9IG5ld3RlY2gpIHsKKyAgICAgICAgbW9kZW0tPnRlY2hub2xvZ3kgPSBuZXd0ZWNoOworICAgICAgICByZXQgPSBhbW9kZW1fcHJpbnRmKG1vZGVtLCAiK0NURUM6ICVkIiwgbW9kZW0tPnRlY2hub2xvZ3kpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitwYXJzZVByZWZlcnJlZCggY29uc3QgY2hhciAqc3RyLCBpbnQgKnByZWZlcnJlZCApCit7CisgICAgY2hhciAqZW5kcHRyID0gTlVMTDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpZiAoIXN0ciB8fCAhKnN0cikgeyAqcHJlZmVycmVkID0gMDsgcmV0dXJuIDA7IH0KKyAgICBpZiAoKnN0ciA9PSAnIicpIHN0ciArKzsKKyAgICBpZiAoISpzdHIpIHJldHVybiAwOworCisgICAgcmVzdWx0ID0gc3RydG9sKHN0ciwgJmVuZHB0ciwgMTYpOworICAgIGlmICgqZW5kcHRyICYmICplbmRwdHIgIT0gJyInKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAocHJlZmVycmVkKQorICAgICAgICAqcHJlZmVycmVkID0gcmVzdWx0OworICAgIHJldHVybiAxOworfQorCit2b2lkCithbW9kZW1fc2V0X2NkbWFfcHJsX3ZlcnNpb24oIEFNb2RlbSBtb2RlbSwgaW50IHBybFZlcnNpb24pCit7CisgICAgRCgiYW1vZGVtX3NldF9wcmxfdmVyc2lvbigpXG4iKTsKKyAgICBpZiAoIV9hbW9kZW1fc2V0X2NkbWFfcHJsX3ZlcnNpb24oIG1vZGVtLCBwcmxWZXJzaW9uKSkgeworICAgICAgICBhbW9kZW1fdW5zb2wobW9kZW0sICIrV1BSTDogJWQiLCBwcmxWZXJzaW9uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19hbW9kZW1fc2V0X2NkbWFfcHJsX3ZlcnNpb24oIEFNb2RlbSBtb2RlbSwgaW50IHBybFZlcnNpb24pCit7CisgICAgRCgiX2Ftb2RlbV9zZXRfY2RtYV9wcmxfdmVyc2lvbiIpOworICAgIGlmIChtb2RlbS0+cHJsX3ZlcnNpb24gIT0gcHJsVmVyc2lvbikgeworICAgICAgICBtb2RlbS0+cHJsX3ZlcnNpb24gPSBwcmxWZXJzaW9uOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkCithbW9kZW1fc2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSggQU1vZGVtIG1vZGVtLCBBQ2RtYVN1YnNjcmlwdGlvblNvdXJjZSBzcykKK3sKKyAgICBEKCJhbW9kZW1fc2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSgpXG4iKTsKKyAgICBpZiAoIV9hbW9kZW1fc2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSggbW9kZW0sIHNzKSkgeworICAgICAgICBhbW9kZW1fdW5zb2wobW9kZW0sICIrQ0NTUzogJWQiLCAoaW50KXNzKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgTUFYX0lOVF9ESUdJVFMgMTAKK3N0YXRpYyBpbnQKK19hbW9kZW1fc2V0X2NkbWFfc3Vic2NyaXB0aW9uX3NvdXJjZSggQU1vZGVtIG1vZGVtLCBBQ2RtYVN1YnNjcmlwdGlvblNvdXJjZSBzcykKK3sKKyAgICBEKCJfYW1vZGVtX3NldF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2UoKVxuIik7CisgICAgY2hhciB2YWx1ZVtNQVhfSU5UX0RJR0lUUyArIDFdOworCisgICAgaWYgKHNzICE9IG1vZGVtLT5zdWJzY3JpcHRpb25fc291cmNlKSB7CisgICAgICAgIHNucHJpbnRmKCB2YWx1ZSwgTUFYX0lOVF9ESUdJVFMgKyAxLCAiJWQiLCBzcyApOworICAgICAgICBhbW9kZW1fbnZyYW1fc2V0KCBtb2RlbSwgTlZfQ0RNQV9TVUJTQ1JJUFRJT05fU09VUkNFLCB2YWx1ZSApOworICAgICAgICBtb2RlbS0+c3Vic2NyaXB0aW9uX3NvdXJjZSA9IHNzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVN1YnNjcmlwdGlvblNvdXJjZSggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgaW50IG5ld3NvdXJjZTsKKyAgICAvLyBUT0RPOiBBY3R1YWxseSBjaGFuZ2Ugc3Vic2NyaXB0aW9uIGRlcGVuZGluZyBvbiBzb3VyY2UKKyAgICBEKCJoYW5kbGVTdWJzY3JpcHRpb25Tb3VyY2UoJXMpXG4iLGNtZCk7CisKKyAgICBhc3NlcnQoICFtZW1jbXAoICIrQ0NTUyIsIGNtZCwgNSApICk7CisgICAgY21kICs9IDU7CisgICAgaWYgKGNtZFswXSA9PSAnPycpIHsKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiK0NDU1M6ICVkIiwgbW9kZW0tPnN1YnNjcmlwdGlvbl9zb3VyY2UgKTsKKyAgICB9IGVsc2UgaWYgKGNtZFswXSA9PSAnPScpIHsKKyAgICAgICAgc3dpdGNoIChjbWRbMV0pIHsKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgICAgbmV3c291cmNlID0gKEFDZG1hU3Vic2NyaXB0aW9uU291cmNlKWNtZFsxXSAtICcwJzsKKyAgICAgICAgICAgICAgICBfYW1vZGVtX3NldF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2UoIG1vZGVtLCBuZXdzb3VyY2UgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ0NTUzogJWQiLCBtb2RlbS0+c3Vic2NyaXB0aW9uX3NvdXJjZSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIkVSUk9SOiBJbnZhbGlkIHN1YnNjcmlwdGlvbiBzb3VyY2UiKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVSb2FtUHJlZiggY29uc3QgY2hhciAqIGNtZCwgQU1vZGVtIG1vZGVtICkKK3sKKyAgICBpbnQgcm9hbWluZ19wcmVmID0gLTE7CisgICAgY2hhciAqZW5kcHRyID0gTlVMTDsKKyAgICBEKCJoYW5kbGVSb2FtUHJlZiglcylcbiIsIGNtZCk7CisgICAgYXNzZXJ0KCAhbWVtY21wKCAiK1dSTVAiLCBjbWQsIDUgKSApOworICAgIGNtZCArPSA1OworICAgIGlmIChjbWRbMF0gPT0gJz8nKSB7CisgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIitXUk1QOiAlZCIsIG1vZGVtLT5yb2FtaW5nX3ByZWYgKTsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcCggY21kLCAiPT8iKSkgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrV1JNUDogMCwxLDIiICk7CisgICAgfSBlbHNlIGlmIChjbWRbMF0gPT0gJz0nKSB7CisgICAgICAgIGNtZCArKzsKKyAgICAgICAgcm9hbWluZ19wcmVmID0gc3RydG9sKCBjbWQsICZlbmRwdHIsIDEwICk7CisgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQgaXMgdGhlIG51bWJlcgorICAgICAgICAgLy8gKGlmICplbmRwdHIgaXMgbnVsbCwgaXQgbWVhbnMgc3RydG9sIHByb2Nlc3NlZCB0aGUgd2hvbGUgc3RyaW5nIGFzIGEgbnVtYmVyKQorICAgICAgICBpZihlbmRwdHIgJiYgISplbmRwdHIpIHsKKyAgICAgICAgICAgIG1vZGVtLT5yb2FtaW5nX3ByZWYgPSByb2FtaW5nX3ByZWY7CisgICAgICAgICAgICBhY29uZmlnX3NldCggbW9kZW0tPm52cmFtX2NvbmZpZywgTlZfQ0RNQV9ST0FNSU5HX1BSRUYsIGNtZCApOworICAgICAgICAgICAgYWNvbmZpZ19zYXZlX2ZpbGUoIG1vZGVtLT5udnJhbV9jb25maWcsIG1vZGVtLT5udnJhbV9jb25maWdfZmlsZW5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIkVSUk9SIik7Cit9CitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVRlY2goIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIEFNb2RlbVRlY2ggbmV3dGVjaCA9IG1vZGVtLT50ZWNobm9sb2d5OworICAgIGludCBwdCA9IG1vZGVtLT5wcmVmZXJyZWRfbWFzazsKKyAgICBpbnQgaGF2ZW5ld3RlY2ggPSAwOworICAgIEQoImhhbmRsZVRlY2guIGNtZDogJXNcbiIsIGNtZCk7CisgICAgYXNzZXJ0KCAhbWVtY21wKCAiK0NURUMiLCBjbWQsIDUgKSApOworICAgIGNtZCArPSA1OworICAgIGlmIChjbWRbMF0gPT0gJz8nKSB7CisgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIitDVEVDOiAlZCwleCIsbW9kZW0tPnRlY2hub2xvZ3ksIG1vZGVtLT5wcmVmZXJyZWRfbWFzayApOworICAgIH0KKyAgICBhbW9kZW1fYmVnaW5fbGluZSggbW9kZW0gKTsKKyAgICBpZiAoIXN0cmNtcCggY21kLCAiPT8iKSkgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ1RFQzogMCwxLDIsMyIgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kWzBdID09ICc9JykgeworICAgICAgICBzd2l0Y2ggKGNtZFsxXSkgeworICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICAgICAgaGF2ZW5ld3RlY2ggPSAxOworICAgICAgICAgICAgICAgIG5ld3RlY2ggPSBjbWRbMV0gLSAnMCc7CisgICAgICAgICAgICAgICAgY21kICs9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY21kICs9IDE7CisgICAgfQorICAgIGlmIChoYXZlbmV3dGVjaCkgeworICAgICAgICBEKCAiY21kOiAlc1xuIiwgY21kICk7CisgICAgICAgIGlmIChjbWRbMF0gPT0gJywnICYmICEgcGFyc2VQcmVmZXJyZWQoICsrY21kLCAmcHQgKSkKKyAgICAgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIkVSUk9SOiBpbnZhbGlkIHByZWZlcnJlZCBtb2RlIiApOworICAgICAgICByZXR1cm4gX2Ftb2RlbV9zd2l0Y2hfdGVjaG5vbG9neSggbW9kZW0sIG5ld3RlY2gsIHB0ICk7CisgICAgfQorICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIkVSUk9SOiAlczogVW5rbm93biBUZWNobm9sb2d5IiwgY21kICsgMSApOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZUVtZXJnZW5jeU1vZGUoIGNvbnN0IGNoYXIqIGNtZCwgQU1vZGVtIG1vZGVtICkKK3sKKyAgICBsb25nIGFyZzsKKyAgICBjaGFyICplbmRwdHIgPSBOVUxMOworICAgIGFzc2VydCAoICFtZW1jbXAoICIrV1NPUyIsIGNtZCwgNSApICk7CisgICAgY21kICs9IDU7CisgICAgaWYgKGNtZFswXSA9PSAnPycpIHsKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiK1dTT1M6ICVkIiwgbW9kZW0tPmluX2VtZXJnZW5jeV9tb2RlKTsKKyAgICB9CisKKyAgICBpZiAoY21kWzBdID09ICc9JykgeworICAgICAgICBpZiAoY21kWzFdID09ICc/JykgeworICAgICAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIrV1NPUzogKDApIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtZFsxXSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIkVSUk9SIik7CisgICAgICAgIH0KKyAgICAgICAgYXJnID0gc3RydG9sKGNtZCsxLCAmZW5kcHRyLCAxMCk7CisKKyAgICAgICAgaWYgKCFlbmRwdHIgfHwgZW5kcHRyWzBdICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKG1vZGVtLCAiRVJST1IiKTsKKyAgICAgICAgfQorCisgICAgICAgIGFyZyA9IGFyZz8gMSA6IDA7CisKKyAgICAgICAgaWYgKCghYXJnKSAhPSAoIW1vZGVtLT5pbl9lbWVyZ2VuY3lfbW9kZSkpIHsKKyAgICAgICAgICAgIG1vZGVtLT5pbl9lbWVyZ2VuY3lfbW9kZSA9IGFyZzsKKyAgICAgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKG1vZGVtLCAiK1dTT1M6ICVkIiwgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIkVSUk9SIik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlUHJsVmVyc2lvbiggY29uc3QgY2hhciogY21kLCBBTW9kZW0gbW9kZW0gKQoreworICAgIGFzc2VydCAoICFtZW1jbXAoICIrV1BSTCIsIGNtZCwgNSApICk7CisgICAgY21kICs9IDU7CisgICAgaWYgKGNtZFswXSA9PSAnPycpIHsKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiK1dQUkw6ICVkIiwgbW9kZW0tPnBybF92ZXJzaW9uKTsKKyAgICB9CisKKyAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIkVSUk9SIik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlUmFkaW9Qb3dlciggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgaWYgKCAhc3RyY21wKCBjbWQsICIrQ0ZVTj0wIiApICkKKyAgICB7CisgICAgICAgIC8qIHR1cm4gcmFkaW8gb2ZmICovCisgICAgICAgIG1vZGVtLT5yYWRpb19zdGF0ZSA9IEFfUkFESU9fU1RBVEVfT0ZGOworICAgIH0KKyAgICBlbHNlIGlmICggIXN0cmNtcCggY21kLCAiK0NGVU49MSIgKSApCisgICAgeworICAgICAgICAvKiB0dXJuIHJhZGlvIG9uICovCisgICAgICAgIG1vZGVtLT5yYWRpb19zdGF0ZSA9IEFfUkFESU9fU1RBVEVfT047CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVJhZGlvUG93ZXJSZXEoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGlmIChtb2RlbS0+cmFkaW9fc3RhdGUgIT0gQV9SQURJT19TVEFURV9PRkYpCisgICAgICAgIHJldHVybiAiK0NGVU46IDEiOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICIrQ0ZVTjogMCI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlT3BlbkxvZ2ljYWxDaGFubmVsKGNvbnN0IGNoYXIqIGNtZCwgQU1vZGVtIG1vZGVtKQoreworICAgIGludCBjaGFubmVsOworICAgIGNoYXIqIGRmX25hbWUgPSBOVUxMOworICAgIGNoYXIqIGRpdmlkZXIgPSBzdHJjaHIoY21kLCAnPScpOworICAgIGlmIChkaXZpZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIrQ01FIEVSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9ySW52YWxpZENoYXJhY3RlcnNJblRleHRTdHJpbmcpOworICAgIH0KKyAgICBkZl9uYW1lID0gZGl2aWRlciArIDE7CisgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IE1BWF9MT0dJQ0FMX0NIQU5ORUxTOyArK2NoYW5uZWwpIHsKKyAgICAgICAgaWYgKCFtb2RlbS0+bG9naWNhbF9jaGFubmVsc1tjaGFubmVsXS5pc19vcGVuKSB7CisgICAgICAgICAgICBtb2RlbS0+bG9naWNhbF9jaGFubmVsc1tjaGFubmVsXS5pc19vcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgIG1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzW2NoYW5uZWxdLmRmX25hbWUgPSBzdHJkdXAoZGZfbmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2hhbm5lbCA+PSBNQVhfTE9HSUNBTF9DSEFOTkVMUykgeworICAgICAgICAvLyBDb3VsZCBub3QgZmluZCBhbiBhdmFpbGFibGUgY2hhbm5lbCwgd2UncmUgcHJvYmFibHkgbGVha2luZyBjaGFubmVscworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIitDTUUgRVJST1I6ICVkIiwga0NtZUVycm9yTWVtb3J5RnVsbCk7CisgICAgfQorICAgIC8vIE5vdGUgdGhhdCBsb2dpY2FsIGNoYW5uZWxzIHN0YXJ0IGF0IDEgc28gdXNlIGFuIG9mZnNldCBoZXJlCisgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIldSIsIGNoYW5uZWwgKyAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVDbG9zZUxvZ2ljYWxDaGFubmVsKGNvbnN0IGNoYXIqIGNtZCwgQU1vZGVtIG1vZGVtKQoreworICAgIGludCBjaGFubmVsOworICAgIGNoYXIgZHVtbXk7CisgICAgY2hhciogY2hhbm5lbF9zdHIgPSBOVUxMOworICAgIGNoYXIqIGRpdmlkZXIgPSBzdHJjaHIoY21kLCAnPScpOworCisgICAgaWYgKGRpdmlkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIitDTUUgRVJST1I6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ21lRXJyb3JJbnZhbGlkQ2hhcmFjdGVyc0luVGV4dFN0cmluZyk7CisgICAgfQorICAgIGNoYW5uZWxfc3RyID0gZGl2aWRlciArIDE7CisgICAgaWYgKHNzY2FuZihjaGFubmVsX3N0ciwgIiVkJWMiLCAmY2hhbm5lbCwgJmR1bW15KSAhPSAxKSB7CisgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKG1vZGVtLCAiK0NNRSBFUlJPUjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbWVFcnJvckludmFsaWRDaGFyYWN0ZXJzSW5UZXh0U3RyaW5nKTsKKyAgICB9CisgICAgLy8gTG9naWNhbCBjaGFubmVscyBzdGFydCBhdCAxLCBkZWNyZWFzZSBieSBvbmUgdG8gY3JlYXRlIGFuIGluZGV4CisgICAgLS1jaGFubmVsOworICAgIGlmIChjaGFubmVsIDwgMCB8fAorICAgICAgICAgICAgY2hhbm5lbCA+PSBNQVhfTE9HSUNBTF9DSEFOTkVMUyB8fAorICAgICAgICAgICAgIW1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzW2NoYW5uZWxdLmlzX29wZW4pIHsKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIrQ01FIEVSUk9SOiAlZCIsIGtDbWVFcnJvckludmFsaWRJbmRleCk7CisgICAgfQorICAgIG1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzW2NoYW5uZWxdLmlzX29wZW4gPSBmYWxzZTsKKyAgICBmcmVlKG1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzW2NoYW5uZWxdLmRmX25hbWUpOworICAgIG1vZGVtLT5sb2dpY2FsX2NoYW5uZWxzW2NoYW5uZWxdLmRmX25hbWUgPSBOVUxMOworCisgICAgcmV0dXJuICIrQ0NIQyI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlVHJhbnNtaXRMb2dpY2FsQ2hhbm5lbChjb25zdCBjaGFyKiBjbWQsIEFNb2RlbSBtb2RlbSkgeworICAgIGNvbnN0IGNoYXIqIHJlc3VsdCA9IE5VTEw7CisgICAgY2hhciBjb21tYW5kWzEwMjRdOworICAgIGNoYXIgc2Nhbl9zdHJpbmdbMTI4XTsKKyAgICBpbnQgY2hhbm5lbCA9IC0xOworICAgIGludCBsZW5ndGggPSAtMTsKKyAgICBjaGFyIGR1bW15ID0gMDsKKyAgICB1aW50OF90IGFwZHVDbGFzczsKKyAgICBTSU1fQVBEVSBhcGR1OworCisgICAgLy8gQ3JlYXRlIGEgc2NhbiBzdHJpbmcgd2l0aCB0aGUgc2l6ZSBvZiB0aGUgY29tbWFuZCBhcnJheSBpbiBpdAorICAgIHNucHJpbnRmKHNjYW5fc3RyaW5nLCBzaXplb2Yoc2Nhbl9zdHJpbmcpLAorICAgICAgICAgICAgICIrQ0dMQT0lJWQsJSVkLCUlJWRzJSVjIiwgKGludCkoc2l6ZW9mKGNvbW1hbmQpIC0gMSkpOworICAgIC8vIFRoZW4gc2NhbiB0aGUgQVQgc3RyaW5nIHRvIGdldCB0aGUgY29tcG9uZW50cworICAgIGlmIChzc2NhbmYoY21kLCBzY2FuX3N0cmluZywgJmNoYW5uZWwsICZsZW5ndGgsIGNvbW1hbmQsICZkdW1teSkgIT0gMykgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ01FIEVSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ21lRXJyb3JJbnZhbGlkQ2hhcmFjdGVyc0luVGV4dFN0cmluZyk7CisgICAgfQorCisgICAgLy8gTG9naWNhbCBjaGFubmVscyBzdGFydCBhdCAxLCBkZWNyZWFzZSBieSBvbmUgdG8gZ2V0IGEgY2hhbm5lbCBpbmRleAorICAgIC0tY2hhbm5lbDsKKyAgICAvLyBWYWxpZGF0ZSB0aGUgY2hhbm5lbCBudW1iZXIgYW5kIGVuc3VyZSB0aGUgY2hhbm5lbCBpcyBvcGVuCisgICAgaWYgKGNoYW5uZWwgPCAwIHx8CisgICAgICAgICAgICBjaGFubmVsID49IE1BWF9MT0dJQ0FMX0NIQU5ORUxTIHx8CisgICAgICAgICAgICAhbW9kZW0tPmxvZ2ljYWxfY2hhbm5lbHNbY2hhbm5lbF0uaXNfb3BlbikgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIitDTUUgRVJST1I6ICVkIiwga0NtZUVycm9ySW52YWxpZEluZGV4KTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSB0aGUgY29tbWFuZCBwYXJ0IG9mIHRoZSBBVCBzdHJpbmcgaW50byBhIFNJTSBBUERVIHN0cnVjdAorICAgIGlmICghcGFyc2VTaW1BcGR1Q29tbWFuZChjb21tYW5kLCBsZW5ndGgsICZhcGR1KSkgeworICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIitDTUUgRVJST1I6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9ySW52YWxpZENoYXJhY3RlcnNJblRleHRTdHJpbmcpOworICAgIH0KKworICAgIC8vIEdldCB0aGUgaW5zdHJ1Y3Rpb24gY2xhc3NzLCB0aGUgbG93ZXIgZm91ciBiaXRzIGFyZSB1c2VkIHRvIGVuY29kZQorICAgIC8vIHNlY3VyZSBtZXNzYWdpbmcgc2V0dGluZ3MgYW5kIGNoYW5uZWwgbnVtYmVyIGFuZCBkbyBub3QgbWF0dGVyIGZvciB0aGlzLgorICAgIGFwZHVDbGFzcyA9IGFwZHUuY2xhICYgMHhmMDsKKworICAgIC8vIE5vdyBzZWUgaWYgaXQncyBhIHN1cHBvcnRlZCBpbnN0cnVjdGlvbgorICAgIHN3aXRjaCAoYXBkdS5pbnN0cnVjdGlvbikgeworICAgIGNhc2Uga1NpbUFwZHVHZXREYXRhOgorICAgICAgICBpZiAoYXBkdUNsYXNzID09IDB4ODAgJiYgYXBkdS5wYXJhbTEgPT0gMHhGRiAmJiBhcGR1LnBhcmFtMiA9PSAweDQwKSB7CisgICAgICAgICAgICAvLyBHZXQgRGF0YSAoZnJvbSBjbGFzcyBhbmQgaW5zdHJjdXRpb24pIEFMTCAoZnJvbSBwYXJhbXMpIGNvbW1hbmQKKyAgICAgICAgICAgIGNoYXIqIGRmX25hbWUgPSBtb2RlbS0+bG9naWNhbF9jaGFubmVsc1tjaGFubmVsXS5kZl9uYW1lOworICAgICAgICAgICAgY29uc3QgY2hhciogcnVsZXMgPSBzaW1fZ2V0X2FjY2Vzc19ydWxlcyhkZl9uYW1lKTsKKyAgICAgICAgICAgIGlmIChydWxlcykgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFtb2RlbV9wcmludGYobW9kZW0sICIrQ0dMQTogMTQ0LDAsJXMiLCBydWxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBhbW9kZW1fcHJpbnRmKG1vZGVtLCAiK0NNRSBFUlJPUjogJWQgKCVkLCAlZCkgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9yVW5rbm93bkVycm9yLCBhcGR1LnBhcmFtMSwgYXBkdS5wYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kKTsKKyAgICB9CisgICAgZnJlZVNpbUFwZHVDb21tYW5kKCZhcGR1KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVNJTVN0YXR1c1JlcSggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgY29uc3QgY2hhciogIGFuc3dlciA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKGFzaW1jYXJkX2dldF9zdGF0dXMobW9kZW0tPnNpbSkpIHsKKyAgICAgICAgY2FzZSBBX1NJTV9TVEFUVVNfQUJTRU5UOiAgICBhbnN3ZXIgPSAiK0NQSU46IEFCU0VOVCI7IGJyZWFrOworICAgICAgICBjYXNlIEFfU0lNX1NUQVRVU19SRUFEWTogICAgIGFuc3dlciA9ICIrQ1BJTjogUkVBRFkiOyBicmVhazsKKyAgICAgICAgY2FzZSBBX1NJTV9TVEFUVVNfTk9UX1JFQURZOiBhbnN3ZXIgPSAiK0NNRVJST1I6IE5PVCBSRUFEWSI7IGJyZWFrOworICAgICAgICBjYXNlIEFfU0lNX1NUQVRVU19QSU46ICAgICAgIGFuc3dlciA9ICIrQ1BJTjogU0lNIFBJTiI7IGJyZWFrOworICAgICAgICBjYXNlIEFfU0lNX1NUQVRVU19QVUs6ICAgICAgIGFuc3dlciA9ICIrQ1BJTjogU0lNIFBVSyI7IGJyZWFrOworICAgICAgICBjYXNlIEFfU0lNX1NUQVRVU19ORVRXT1JLX1BFUlNPTkFMSVpBVElPTjogYW5zd2VyID0gIitDUElOOiBQSC1ORVQgUElOIjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhbnN3ZXIgPSAiRVJST1I6IGludGVybmFsIGVycm9yIjsKKyAgICB9CisgICAgcmV0dXJuIGFuc3dlcjsKK30KKworLyogVE9ETzogV2lsbCB3ZSBuZWVkIHRoaXM/CitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVNSZWdpc3RlciggY29uc3QgY2hhciAqIGNtZCwgQU1vZGVtIG1vZGVtICkKK3sKKyAgICBjaGFyICplbmQ7CisgICAgYXNzZXJ0KCBjbWRbMF0gPT0gJ1MnIHx8IGNtZFswXSA9PSAncycgKTsKKworICAgICsrIGNtZDsKKworICAgIGludCBsID0gc3RydG9sKGNtZCwgJmVuZCwgMTApOworfSAqLworCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZU5ldHdvcmtSZWdpc3RyYXRpb24oIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGlmICggIW1lbWNtcCggY21kLCAiK0NSRUciLCA1ICkgKSB7CisgICAgICAgIGNtZCArPSA1OworICAgICAgICBpZiAoY21kWzBdID09ICc/JykgeworICAgICAgICAgICAgaWYgKG1vZGVtLT52b2ljZV9tb2RlID09IEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRURfRlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ1JFRzogJWQsJWQsIFwiJTA0eFwiLCBcIiUwNHhcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbS0+dm9pY2VfbW9kZSwgbW9kZW0tPnZvaWNlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmFyZWFfY29kZSwgbW9kZW0tPmNlbGxfaWQgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ1JFRzogJWQsJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPnZvaWNlX21vZGUsIG1vZGVtLT52b2ljZV9zdGF0ZSApOworICAgICAgICB9IGVsc2UgaWYgKGNtZFswXSA9PSAnPScpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY21kWzFdKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgICAgICAgIG1vZGVtLT52b2ljZV9tb2RlICA9IEFfUkVHSVNUUkFUSU9OX1VOU09MX0RJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICAgICAgICBtb2RlbS0+dm9pY2VfbW9kZSAgPSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgICAgICAgICBtb2RlbS0+dm9pY2VfbW9kZSA9IEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRURfRlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlICc/JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIrQ1JFRzogKDAtMikiOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUjogQkFEIENPTU1BTkQiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCAwICYmICJ1bnJlYWNoYWJsZSIgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoICFtZW1jbXAoIGNtZCwgIitDR1JFRyIsIDYgKSApIHsKKyAgICAgICAgY21kICs9IDY7CisgICAgICAgIGlmIChjbWRbMF0gPT0gJz8nKSB7CisgICAgICAgICAgICBpZiAobW9kZW0tPnN1cHBvcnRzTmV0d29ya0RhdGFUeXBlKQorICAgICAgICAgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIitDR1JFRzogJWQsJWQsXCIlMDR4XCIsXCIlMDR4XCIsXCIlMDR4XCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmRhdGFfbW9kZSwgbW9kZW0tPmRhdGFfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbS0+YXJlYV9jb2RlLCBtb2RlbS0+Y2VsbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX25ldHdvcmsgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50ZiggbW9kZW0sICIrQ0dSRUc6ICVkLCVkLFwiJTA0eFwiLFwiJTA0eFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX21vZGUsIG1vZGVtLT5kYXRhX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPmFyZWFfY29kZSwgbW9kZW0tPmNlbGxfaWQgKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbWRbMF0gPT0gJz0nKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNtZFsxXSkgeworICAgICAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgICAgICAgICBtb2RlbS0+ZGF0YV9tb2RlICA9IEFfUkVHSVNUUkFUSU9OX1VOU09MX0RJU0FCTEVEOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICAgICAgICBtb2RlbS0+ZGF0YV9tb2RlICA9IEFfUkVHSVNUUkFUSU9OX1VOU09MX0VOQUJMRUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX21vZGUgPSBBX1JFR0lTVFJBVElPTl9VTlNPTF9FTkFCTEVEX0ZVTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiK0NHUkVHOiAoMC0yKSI7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SOiBCQUQgQ09NTUFORCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoIDAgJiYgInVucmVhY2hhYmxlIiApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVNldERpYWxUb25lKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICAvKiBYWFg6IFRPRE8gKi8KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVEZWxldGVTTVNvblNJTSggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgLyogWFhYOiBUT0RPICovCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlU0lNX0lPKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICByZXR1cm4gYXNpbWNhcmRfaW8oIG1vZGVtLT5zaW0sIGNtZCApOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlT3BlcmF0b3JTZWxlY3Rpb24oIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGFzc2VydCggIW1lbWNtcCggIitDT1BTIiwgY21kLCA1ICkgKTsKKyAgICBjbWQgKz0gNTsKKyAgICBpZiAoY21kWzBdID09ICc/JykgeyAvKiBhc2sgZm9yIGN1cnJlbnQgb3BlcmF0b3IgKi8KKyAgICAgICAgQU9wZXJhdG9yICBvcGVyID0gJm1vZGVtLT5vcGVyYXRvcnNbIG1vZGVtLT5vcGVyX2luZGV4IF07CisKKyAgICAgICAgaWYgKCAhYW1vZGVtX2hhc19uZXR3b3JrKCBtb2RlbSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiK0NNRSBFUlJPUjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDbWVFcnJvck5vTmV0d29ya1NlcnZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgb3BlciA9ICZtb2RlbS0+b3BlcmF0b3JzWyBtb2RlbS0+b3Blcl9pbmRleCBdOworCisgICAgICAgIGlmICggbW9kZW0tPm9wZXJfbmFtZV9pbmRleCA9PSAyICkKKyAgICAgICAgICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIitDT1BTOiAlZCwyLCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbS0+b3Blcl9zZWxlY3Rpb25fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyLT5uYW1lWzJdICk7CisKKyAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiK0NPUFM6ICVkLCVkLFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbS0+b3Blcl9zZWxlY3Rpb25fbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5vcGVyX25hbWVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyLT5uYW1lWyBtb2RlbS0+b3Blcl9uYW1lX2luZGV4IF0gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kWzBdID09ICc9JyAmJiBjbWRbMV0gPT0gJz8nKSB7ICAvKiBhc2sgZm9yIGFsbCBhdmFpbGFibGUgb3BlcmF0b3JzICovCisgICAgICAgIGNvbnN0IGNoYXIqICBjb21tYSA9ICIrQ09QUzogIjsKKyAgICAgICAgaW50ICAgICAgICAgIG5uOworICAgICAgICBhbW9kZW1fYmVnaW5fbGluZSggbW9kZW0gKTsKKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgbW9kZW0tPm9wZXJfY291bnQ7IG5uKyspIHsKKyAgICAgICAgICAgIEFPcGVyYXRvciAgb3BlciA9ICZtb2RlbS0+b3BlcmF0b3JzW25uXTsKKyAgICAgICAgICAgIGFtb2RlbV9hZGRfbGluZSggbW9kZW0sICIlcyglZCxcIiVzXCIsXCIlc1wiLFwiJXNcIikiLCBjb21tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blci0+c3RhdHVzLCBvcGVyLT5uYW1lWzBdLCBvcGVyLT5uYW1lWzFdLCBvcGVyLT5uYW1lWzJdICk7CisgICAgICAgICAgICBjb21tYSA9ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFtb2RlbV9lbmRfbGluZSggbW9kZW0gKTsKKyAgICB9CisgICAgZWxzZSBpZiAoY21kWzBdID09ICc9JykgeworICAgICAgICBzd2l0Y2ggKGNtZFsxXSkgeworICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICAgICAgbW9kZW0tPm9wZXJfc2VsZWN0aW9uX21vZGUgPSBBX1NFTEVDVElPTl9BVVRPTUFUSUM7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgIGNhc2UgJzEnOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICBmb3JtYXQsIG5uLCBsZW4sIGZvdW5kID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtZFsyXSAhPSAnLCcpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEJhZENvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGNtZFszXSAtICcwJzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAodW5zaWduZWQpZm9ybWF0ID4gMiApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEJhZENvbW1hbmQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbWRbNF0gIT0gJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBCYWRDb21tYW5kOworICAgICAgICAgICAgICAgICAgICBjbWQgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICA9IHN0cmxlbihjbWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmNtZCA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBCYWRDb21tYW5kOworCisgICAgICAgICAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5vcGVyX2NvdW50OyBubisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBT3BlcmF0b3IgICAgb3BlciA9IG1vZGVtLT5vcGVyYXRvcnMgKyBubjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICBuYW1lID0gb3Blci0+bmFtZVsgZm9ybWF0IF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIW1lbWNweSggbmFtZSwgY21kLCBsZW4gKSAmJiBuYW1lW2xlbl0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG5uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0aW9uIGZhaWxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIrQ01FIEVSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9yU2VsZWN0aW9uRmFpbHVyZUVtZXJnZW5jeUNhbGxzT25seSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZW0tPm9wZXJhdG9yc1tmb3VuZF0uc3RhdHVzID09IEFfU1RBVFVTX0RFTklFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFtb2RlbV9wcmludGYobW9kZW0sICIrQ01FIEVSUk9SOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9yTmV0d29ya05vdEFsbG93ZWRFbWVyZ2VuY3lDYWxsc09ubHkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5vcGVyX2luZGV4ID0gZm91bmQ7CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRoZSB2b2ljZSBhbmQgZGF0YSByZWdpc3RyYXRpb24gc3RhdGVzIHRvIGhvbWUgb3Igcm9hbWluZworICAgICAgICAgICAgICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdG9yIGluZGV4CisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT0gT1BFUkFUT1JfSE9NRV9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPnZvaWNlX3N0YXRlID0gQV9SRUdJU1RSQVRJT05fSE9NRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX3N0YXRlICA9IEFfUkVHSVNUUkFUSU9OX0hPTUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQgPT0gT1BFUkFUT1JfUk9BTUlOR19JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW0tPnZvaWNlX3N0YXRlID0gQV9SRUdJU1RSQVRJT05fUk9BTUlORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtLT5kYXRhX3N0YXRlICA9IEFfUkVHSVNUUkFUSU9OX1JPQU1JTkc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgICAgICBtb2RlbS0+b3Blcl9zZWxlY3Rpb25fbW9kZSA9IEFfU0VMRUNUSU9OX0RFUkVHSVNUUkFUSU9OOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtZFsyXSAhPSAnLCcpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEJhZENvbW1hbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gY21kWzNdIC0gJzAnOworICAgICAgICAgICAgICAgICAgICBpZiAoICh1bnNpZ25lZClmb3JtYXQgPiAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gQmFkQ29tbWFuZDsKKworICAgICAgICAgICAgICAgICAgICBtb2RlbS0+b3Blcl9uYW1lX2luZGV4ID0gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KK0JhZENvbW1hbmQ6CisgICAgcmV0dXJuIHVua25vd25Db21tYW5kKGNtZCxtb2RlbSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlUmVxdWVzdE9wZXJhdG9yKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBBT3BlcmF0b3IgIG9wZXI7CisgICAgY21kPWNtZDsKKworICAgIGlmICggIWFtb2RlbV9oYXNfbmV0d29yayhtb2RlbSkgKQorICAgICAgICByZXR1cm4gYW1vZGVtX3ByaW50Zihtb2RlbSwgIitDTUUgRVJST1I6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NtZUVycm9yTm9OZXR3b3JrU2VydmljZSk7CisKKyAgICBvcGVyID0gbW9kZW0tPm9wZXJhdG9ycyArIG1vZGVtLT5vcGVyX2luZGV4OworICAgIG1vZGVtLT5vcGVyX25hbWVfaW5kZXggPSAyOworICAgIHJldHVybiBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIitDT1BTOiAwLDAsXCIlc1wiXHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIrQ09QUzogMCwxLFwiJXNcIlxyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiK0NPUFM6IDAsMixcIiVzXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyLT5uYW1lWzBdLCBvcGVyLT5uYW1lWzFdLCBvcGVyLT5uYW1lWzJdICk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlU2VuZFNNU3RvU0lNKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICAvKiBYWFg6IFRPRE8gKi8KKyAgICByZXR1cm4gIkVSUk9SOiB1bmltcGxlbWVudGVkIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVTZW5kU01TKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBtb2RlbS0+d2FpdF9zbXMgPSAxOworICAgIHJldHVybiAiPiAiOworfQorCisjaWYgMAorc3RhdGljIHZvaWQKK3Ntc19hZGRyZXNzX2R1bXAoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIEZJTEUqICBvdXQgKQoreworICAgIGludCAgbm4sIGxlbiA9IGFkZHJlc3MtPmxlbjsKKworICAgIGlmIChhZGRyZXNzLT50b2EgPT0gMHg5MSkgeworICAgICAgICBmcHJpbnRmKCBvdXQsICIrIiApOworICAgIH0KKyAgICBmb3IgKG5uID0gMDsgbm4gPCBsZW47IG5uICs9IDIpCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAgZGlhbGRpZ2l0c1sxNl0gPSAiMDEyMzQ1Njc4OSojLE4lIjsKKyAgICAgICAgaW50ICBjID0gYWRkcmVzcy0+ZGF0YVtubi8yXTsKKworICAgICAgICBmcHJpbnRmKCBvdXQsICIlYyIsIGRpYWxkaWdpdHNbYyAmIDB4Zl0gKTsKKyAgICAgICAgaWYgKG5uKzEgPj0gbGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZnByaW50Ziggb3V0LCAiJWMiLCBkaWFsZGlnaXRzWyhjID4+IDQpICYgMHhmXSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Ntc3BkdV9kdW1wKCBTbXNQRFUgIHBkdSwgRklMRSogIG91dCApCit7CisgICAgU21zQWRkcmVzc1JlYyAgICBhZGRyZXNzOworICAgIHVuc2lnbmVkIGNoYXIgICAgdGVtcFsyNTZdOworICAgIGludCAgICAgICAgICAgICAgbGVuOworCisgICAgaWYgKHBkdSA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoIG91dCwgIlNNUyBQRFUgaXMgKG51bGwpXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcHJpbnRmKCBvdXQsICJTTVMgUERVIHR5cGU6ICAgICAgICIgKTsKKyAgICBzd2l0Y2ggKHNtc3BkdV9nZXRfdHlwZShwZHUpKSB7CisgICAgICAgIGNhc2UgU01TX1BEVV9ERUxJVkVSOiBmcHJpbnRmKG91dCwgIkRFTElWRVIiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgU01TX1BEVV9TVUJNSVQ6ICBmcHJpbnRmKG91dCwgIlNVQk1JVCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBTTVNfUERVX1NUQVRVU19SRVBPUlQ6IGZwcmludGYob3V0LCAiU1RBVFVTX1JFUE9SVCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogZnByaW50ZihvdXQsICJVTktOT1dOIik7CisgICAgfQorICAgIGZwcmludGYoIG91dCwgIlxuICAgICAgICBzZW5kZXI6ICAgIiApOworICAgIGlmIChzbXNwZHVfZ2V0X3NlbmRlcl9hZGRyZXNzKHBkdSwgJmFkZHJlc3MpIDwgMCkKKyAgICAgICAgZnByaW50Ziggb3V0LCAiKE4vQSkiICk7CisgICAgZWxzZQorICAgICAgICBzbXNfYWRkcmVzc19kdW1wKCZhZGRyZXNzLCBvdXQpOworICAgIGZwcmludGYoIG91dCwgIlxuICAgICAgICByZWNlaXZlcjogIiApOworICAgIGlmIChzbXNwZHVfZ2V0X3JlY2VpdmVyX2FkZHJlc3MocGR1LCAmYWRkcmVzcykgPCAwKQorICAgICAgICBmcHJpbnRmKG91dCwgIihOL0EpIik7CisgICAgZWxzZQorICAgICAgICBzbXNfYWRkcmVzc19kdW1wKCZhZGRyZXNzLCBvdXQpOworICAgIGZwcmludGYoIG91dCwgIlxuICAgICAgICB0ZXh0OiAgICAgIiApOworICAgIGxlbiA9IHNtc3BkdV9nZXRfdGV4dF9tZXNzYWdlKCBwZHUsIHRlbXAsIHNpemVvZih0ZW1wKS0xICk7CisgICAgaWYgKGxlbiA+IHNpemVvZih0ZW1wKS0xICkKKyAgICAgICAgbGVuID0gc2l6ZW9mKHRlbXApLTE7CisgICAgZnByaW50Ziggb3V0LCAiJyUuKnMnXG4iLCBsZW4sIHRlbXAgKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVNlbmRTTVNUZXh0KCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBTbXNBZGRyZXNzUmVjICBhZGRyZXNzOworICAgIGNoYXIgICAgICAgICAgIHRlbXBbMTZdOworICAgIGNoYXIgICAgICAgICAgIG51bWJlclsxNl07CisgICAgaW50ICAgICAgICAgICAgbnVtbGVuOworICAgIGludCAgICAgICAgICAgIGxlbiA9IHN0cmxlbihjbWQpOworICAgIFNtc1BEVSAgICAgICAgIHBkdTsKKworICAgIC8qIGdldCByaWQgb2YgdHJhaWxpbmcgZXNjYXBlICovCisgICAgaWYgKGxlbiA+IDAgJiYgY21kW2xlbi0xXSA9PSAweDFhKQorICAgICAgICBsZW4gLT0gMTsKKworICAgIHBkdSA9IHNtc3BkdV9jcmVhdGVfZnJvbV9oZXgoIGNtZCwgbGVuICk7CisgICAgaWYgKHBkdSA9PSBOVUxMKSB7CisgICAgICAgIEQoIiVzOiBpbnZhbGlkIFNNUyBQRFUgPzogJyVzJ1xuIiwgX19GVU5DVElPTl9fLCBjbWQpOworICAgICAgICByZXR1cm4gIitDTVMgRVJST1I6IElOVkFMSUQgU01TIFBEVSI7CisgICAgfQorICAgIGlmIChzbXNwZHVfZ2V0X3JlY2VpdmVyX2FkZHJlc3MocGR1LCAmYWRkcmVzcykgPCAwKSB7CisgICAgICAgIEQoIiVzOiBjb3VsZCBub3QgZ2V0IFNNUyByZWNlaXZlciBhZGRyZXNzIGZyb20gJyVzJ1xuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNtZCk7CisgICAgICAgIHJldHVybiAiK0NNUyBFUlJPUjogQkFEIFNNUyBSRUNFSVZFUiBBRERSRVNTIjsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGludCAgaW5kZXg7CisKKyAgICAgICAgbnVtbGVuID0gc21zX2FkZHJlc3NfdG9fc3RyKCAmYWRkcmVzcywgdGVtcCwgc2l6ZW9mKHRlbXApICk7CisgICAgICAgIGlmIChudW1sZW4gPiBzaXplb2YodGVtcCktMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB0ZW1wW251bWxlbl0gPSAwOworCisgICAgICAgIC8qIENvbnZlcnRzIDQsIDcsIGFuZCAxMCBkaWdpdHMgbnVtYmVyIHRvIDExIGRpZ2l0cyAqLworICAgICAgICBpZiAobnVtbGVuID09IDEwICYmICFzdHJuY21wKHRlbXAsIFBIT05FX1BSRUZJWCsxLCA2KSkgeworICAgICAgICAgICAgbWVtY3B5KCBudW1iZXIsIFBIT05FX1BSRUZJWCwgMSApOworICAgICAgICAgICAgbWVtY3B5KCBudW1iZXIrMSwgdGVtcCwgbnVtbGVuICk7CisgICAgICAgICAgICBudW1iZXJbbnVtbGVuKzFdID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChudW1sZW4gPT0gNyAmJiAhc3RybmNtcCh0ZW1wLCBQSE9ORV9QUkVGSVgrNCwgMykpIHsKKyAgICAgICAgICAgIG1lbWNweSggbnVtYmVyLCBQSE9ORV9QUkVGSVgsIDQgKTsKKyAgICAgICAgICAgIG1lbWNweSggbnVtYmVyKzQsIHRlbXAsIG51bWxlbiApOworICAgICAgICAgICAgbnVtYmVyW251bWxlbis0XSA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAobnVtbGVuID09IDQpIHsKKyAgICAgICAgICAgIG1lbWNweSggbnVtYmVyLCBQSE9ORV9QUkVGSVgsIDcgKTsKKyAgICAgICAgICAgIG1lbWNweSggbnVtYmVyKzcsIHRlbXAsIG51bWxlbiApOworICAgICAgICAgICAgbnVtYmVyW251bWxlbis3XSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoIG51bWJlciwgdGVtcCwgbnVtbGVuICk7CisgICAgICAgICAgICBudW1iZXJbbnVtbGVuXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHJlbW90ZV9udW1iZXJfc3RyaW5nX3RvX3BvcnQoIG51bWJlciApIDwgMCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobW9kZW0tPnNtc19yZWNlaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBtb2RlbS0+c21zX3JlY2VpdmVyID0gc21zX3JlY2VpdmVyX2NyZWF0ZSgpOworICAgICAgICAgICAgaWYgKG1vZGVtLT5zbXNfcmVjZWl2ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEQoICIlczogY291bGQgbm90IGNyZWF0ZSBTTVMgcmVjZWl2ZXJcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBzbXNfcmVjZWl2ZXJfYWRkX3N1Ym1pdF9wZHUoIG1vZGVtLT5zbXNfcmVjZWl2ZXIsIHBkdSApOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBEKCAiJXM6IGNvdWxkIG5vdCBhZGQgc3VibWl0IFBEVVxuIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiB0aGUgUERVIGlzIG5vdyBvd25lZCBieSB0aGUgcmVjZWl2ZXIgKi8KKyAgICAgICAgcGR1ID0gTlVMTDsKKworICAgICAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICBTbXNBZGRyZXNzUmVjICBmcm9tWzFdOworICAgICAgICAgICAgY2hhciAgICAgICAgICAgdGVtcFsxMl07CisgICAgICAgICAgICBTbXNQRFUqICAgICAgICBkZWxpdmVyOworICAgICAgICAgICAgaW50ICAgICAgICAgICAgbm47CisKKyAgICAgICAgICAgIHNucHJpbnRmKCB0ZW1wLCBzaXplb2YodGVtcCksIFBIT05FX1BSRUZJWCAiJWQiLCBtb2RlbS0+YmFzZV9wb3J0ICk7CisgICAgICAgICAgICBzbXNfYWRkcmVzc19mcm9tX3N0ciggZnJvbSwgdGVtcCwgc3RybGVuKHRlbXApICk7CisKKyAgICAgICAgICAgIGRlbGl2ZXIgPSBzbXNfcmVjZWl2ZXJfY3JlYXRlX2RlbGl2ZXIoIG1vZGVtLT5zbXNfcmVjZWl2ZXIsIGluZGV4LCBmcm9tICk7CisgICAgICAgICAgICBpZiAoZGVsaXZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgRCggIiVzOiBjb3VsZCBub3QgY3JlYXRlIGRlbGl2ZXIgUERVcyBmb3IgU01TIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5kZXggKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChubiA9IDA7IGRlbGl2ZXJbbm5dICE9IE5VTEw7IG5uKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlbW90ZV9jYWxsX3NtcyggbnVtYmVyLCBtb2RlbS0+YmFzZV9wb3J0LCBkZWxpdmVyW25uXSApIDwgMCApIHsKKyAgICAgICAgICAgICAgICAgICAgRCggIiVzOiBjb3VsZCBub3Qgc2VuZCBTTVMgUERVIHRvIHJlbW90ZSBlbXVsYXRvclxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc21zcGR1X2ZyZWVfbGlzdChkZWxpdmVyKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBpZiAocGR1ICE9IE5VTEwpCisgICAgICAgIHNtc3BkdV9mcmVlKHBkdSk7CisKKyAgICByZXR1cm4gIitDTUdTOiAwXHJPS1xyIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVDaGFuZ2VPckVudGVyUElOKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBhc3NlcnQoICFtZW1jbXAoIGNtZCwgIitDUElOPSIsIDYgKSApOworICAgIGNtZCArPSA2OworCisgICAgc3dpdGNoIChhc2ltY2FyZF9nZXRfc3RhdHVzKG1vZGVtLT5zaW0pKSB7CisgICAgICAgIGNhc2UgQV9TSU1fU1RBVFVTX0FCU0VOVDoKKyAgICAgICAgICAgIHJldHVybiAiK0NNRSBFUlJPUjogU0lNIEFCU0VOVCI7CisKKyAgICAgICAgY2FzZSBBX1NJTV9TVEFUVVNfTk9UX1JFQURZOgorICAgICAgICAgICAgcmV0dXJuICIrQ01FIEVSUk9SOiBTSU0gTk9UIFJFQURZIjsKKworICAgICAgICBjYXNlIEFfU0lNX1NUQVRVU19SRUFEWToKKyAgICAgICAgICAgIC8qIHRoaXMgbWF5IGJlIGEgcmVxdWVzdCB0byBjaGFuZ2UgdGhlIFBJTiAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJsZW4oY21kKSA9PSA5ICYmIGNtZFs0XSA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgcGluWzVdOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHBpbiwgY21kLCA0ICk7IHBpbls0XSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhYXNpbWNhcmRfY2hlY2tfcGluKCBtb2RlbS0+c2ltLCBwaW4gKSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIitDTUUgRVJST1I6IEJBRCBQSU4iOworCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcGluLCBjbWQrNSwgNCApOworICAgICAgICAgICAgICAgICAgICBhc2ltY2FyZF9zZXRfcGluKCBtb2RlbS0+c2ltLCBwaW4gKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIrQ1BJTjogUkVBRFkiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQV9TSU1fU1RBVFVTX1BJTjogICAvKiB3YWl0aW5nIGZvciBQSU4gKi8KKyAgICAgICAgICAgIGlmICggYXNpbWNhcmRfY2hlY2tfcGluKCBtb2RlbS0+c2ltLCBjbWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuICIrQ1BJTjogUkVBRFkiOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAiK0NNRSBFUlJPUjogQkFEIFBJTiI7CisKKyAgICAgICAgY2FzZSBBX1NJTV9TVEFUVVNfUFVLOgorICAgICAgICAgICAgaWYgKHN0cmxlbihjbWQpID09IDkgJiYgY21kWzRdID09ICcsJykgeworICAgICAgICAgICAgICAgIGNoYXIgIHB1a1s1XTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHB1aywgY21kLCA0ICk7CisgICAgICAgICAgICAgICAgcHVrWzRdID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIGFzaW1jYXJkX2NoZWNrX3B1ayggbW9kZW0tPnNpbSwgcHVrLCBjbWQrNSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIrQ1BJTjogUkVBRFkiOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIrQ01FIEVSUk9SOiBCQUQgUFVLIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiK0NNRSBFUlJPUjogQkFEIFBVSyI7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiK0NQSU46IFBILU5FVCBQSU4iOworICAgIH0KKworICAgIHJldHVybiAiK0NNRSBFUlJPUjogQkFEIEZPUk1BVCI7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVMaXN0Q3VycmVudENhbGxzKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBpbnQgIG5uOworICAgIGFtb2RlbV9iZWdpbl9saW5lKCBtb2RlbSApOworICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgICAgICBpZiAoY2FsbC0+bW9kZSA9PSBBX0NBTExfVk9JQ0UpCisgICAgICAgICAgICBhbW9kZW1fYWRkX2xpbmUoIG1vZGVtLCAiK0NMQ0M6ICVkLCVkLCVkLCVkLCVkLFwiJXNcIiwlZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5pZCwgY2FsbC0+ZGlyLCBjYWxsLT5zdGF0ZSwgY2FsbC0+bW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+bXVsdGksIGNhbGwtPm51bWJlciwgMTI5ICk7CisgICAgfQorICAgIHJldHVybiBhbW9kZW1fZW5kX2xpbmUoIG1vZGVtICk7Cit9CisKKy8qIEFkZCBhKG4gdW5zb2xpY2l0ZWQpIHRpbWUgcmVzcG9uc2UuCisgKgorICogcmV0cmlldmUgdGhlIGN1cnJlbnQgdGltZSBhbmQgem9uZSBpbiBhIGZvcm1hdCBzdWl0YWJsZQorICogZm9yICVDVFpWOiB1bnNvbGljaXRlZCBtZXNzYWdlCisgKiAgInl5L21tL2RkLGhoOm1tOnNzKCsvLSl0eiIKKyAqICAgbW0gaXMgMC1iYXNlZAorICogICB0eiBpcyBpbiBudW1iZXIgb2YgcXVhcnRlci1ob3VycworICoKKyAqIGl0IHNlZW1zIHJlZmVyZW5jZS1yaWwgZG9lc24ndCBwYXJzZSB0aGUgY29tbWEgKCwpIGFzIGFueXRoaW5nIGVsc2UgdGhhbiBhIHRva2VuCisgKiBzZXBhcmF0b3IsIHNvIHVzZSBhIGNvbHVtbiAoOikgaW5zdGVhZCwgdGhlIEphdmEgcGFyc2luZyBjb2RlIHdvbid0IHNlZSBhIGRpZmZlcmVuY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkCithbW9kZW1fYWRkVGltZVVwZGF0ZSggQU1vZGVtICBtb2RlbSApCit7CisgICAgdGltZV90ICAgICAgIG5vdyA9IHRpbWUoTlVMTCk7CisgICAgc3RydWN0IHRtICAgIHV0YzsKKyAgICBsb25nICAgICAgICAgdHpkaWZmOworICAgIGNoYXIgICAgICAgICB0em5hbWVbNjRdOworICAgIGludCAgICAgICAgICBpc2RzdDsKKworICAgIHV0YyAgID0gKmdtdGltZSgmbm93KTsKKyAgICB0emRpZmYgPSBhbmRyb2lkX3R6b2Zmc2V0X2luX3NlY29uZHMoJm5vdykgLyAoMTUgKiA2MCk7ICAvKiB0aW1lem9uZSBvZmZzZXQgaXMgaW4gbnVtYmVyIG9mIHF1YXRlci1ob3VycyAqLworICAgIGlzZHN0ID0gYW5kcm9pZF9sb2NhbHRpbWUoJm5vdyktPnRtX2lzZHN0OworCisgICAvKiByZXRyaWV2ZSBhIHpvbmVpbmZvLWNvbXBhdGlibGUgbmFtZSBmb3IgdGhlIGhvc3QgdGltZXpvbmUKKyAgICAqLworICAgIHsKKyAgICAgICAgY2hhciogIGVuZCA9IHR6bmFtZSArIHNpemVvZih0em5hbWUpOworICAgICAgICBjaGFyKiAgcCA9IGJ1ZnByaW50X3pvbmVpbmZvX3RpbWV6b25lKCB0em5hbWUsIGVuZCApOworICAgICAgICBpZiAocCA+PSBlbmQpCisgICAgICAgICAgICBzdHJjcHkodHpuYW1lLCAiVW5rbm93bi9Vbmtub3duIik7CisKKyAgICAgICAgLyogbm93IHJlcGxhY2UgZXZlcnkgLyBpbiB0aGUgdGltZXpvbmUgbmFtZSBieSBhICIhIgorICAgICAgICAgKiB0aGF0J3MgYmVjYXVzZSB0aGUgY29kZSB0aGF0IHJlYWRzIHRoZSBDVFpWIGxpbmUgaXMKKyAgICAgICAgICogZHVtYiBhbmQgdHJlYXRzIGEgLyBhcyBhIGZpZWxkIHNlcGFyYXRvci4uLgorICAgICAgICAgKi8KKyAgICAgICAgcCA9IHR6bmFtZTsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHAgPSBzdHJjaHIocCwgJy8nKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqcCA9ICchJzsKKyAgICAgICAgICAgIHAgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgLyogYXMgYSBzcGVjaWFsIGV4dGVuc2lvbiwgd2UgYXBwZW5kIHRoZSBuYW1lIG9mIHRoZSBob3N0J3MgdGltZSB6b25lIHRvIHRoZQorICAgICogc3RyaW5nIHJldHVybmVkIHdpdGggJUNUWi4gdGhlIHN5c3RlbSBzaG91bGQgY29udGFpbiBzcGVjaWFsIGNvZGUgdG8gZGV0ZWN0CisgICAgKiBhbmQgZGVhbCB3aXRoIHRoaXMgY2FzZSAoc2luY2UgaXQgbm9ybWFsbHkgcmVsaWVkIG9uIHRoZSBvcGVyYXRvcidzIGNvdW50cnkgY29kZQorICAgICogd2hpY2ggaXMgaGFyZCB0byBzaW11bGF0ZSBvbiBhIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcgorICAgICovCisgICAgYW1vZGVtX2FkZF9saW5lKCBtb2RlbSwgIiUlQ1RaVjogJTAyZC8lMDJkLyUwMmQ6JTAyZDolMDJkOiUwMmQlYyVkOiVkOiVzXHJcbiIsCisgICAgICAgICAgICAgKHV0Yy50bV95ZWFyICsgMTkwMCkgJSAxMDAsIHV0Yy50bV9tb24gKyAxLCB1dGMudG1fbWRheSwKKyAgICAgICAgICAgICB1dGMudG1faG91ciwgdXRjLnRtX21pbiwgdXRjLnRtX3NlYywKKyAgICAgICAgICAgICAodHpkaWZmID49IDApID8gJysnIDogJy0nLCAodHpkaWZmID49IDAgPyB0emRpZmYgOiAtdHpkaWZmKSwKKyAgICAgICAgICAgICAoaXNkc3QgPiAwKSwKKyAgICAgICAgICAgICB0em5hbWUgKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVFbmRPZkluaXQoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGFtb2RlbV9iZWdpbl9saW5lKCBtb2RlbSApOworICAgIGFtb2RlbV9hZGRUaW1lVXBkYXRlKCBtb2RlbSApOworICAgIHJldHVybiBhbW9kZW1fZW5kX2xpbmUoIG1vZGVtICk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVMaXN0UERQQ29udGV4dHMoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGludCAgbm47CisgICAgYXNzZXJ0KCAhbWVtY21wKCBjbWQsICIrQ0dBQ1Q/IiwgNyApICk7CisgICAgYW1vZGVtX2JlZ2luX2xpbmUoIG1vZGVtICk7CisgICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX0RBVEFfQ09OVEVYVFM7IG5uKyspIHsKKyAgICAgICAgQURhdGFDb250ZXh0ICBkYXRhID0gbW9kZW0tPmRhdGFfY29udGV4dHMgKyBubjsKKyAgICAgICAgaWYgKCFkYXRhLT5hY3RpdmUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYW1vZGVtX2FkZF9saW5lKCBtb2RlbSwgIitDR0FDVDogJWQsJWRcclxuIiwgZGF0YS0+aWQsIGRhdGEtPmFjdGl2ZSApOworICAgIH0KKyAgICByZXR1cm4gYW1vZGVtX2VuZF9saW5lKCBtb2RlbSApOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZURlZmluZVBEUENvbnRleHQoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGFzc2VydCggIW1lbWNtcCggY21kLCAiK0NHRENPTlQ9IiwgOSApICk7CisgICAgY21kICs9IDk7CisgICAgaWYgKGNtZFswXSA9PSAnPycpIHsKKyAgICAgICAgLyogK0NHRENPTlQ9PyBpcyB1c2VkIHRvIHF1ZXJ5IHRoZSByYW5nZXMgb2Ygc3VwcG9ydGVkIFBEUCBDb250ZXh0cy4KKyAgICAgICAgICogV2Ugb25seSByZWFsbHkgc3VwcG9ydCBJUCBvbmVzIGluIHRoZSBlbXVsYXRvciwgc28gZG9uJ3QgdHJ5IHRvCisgICAgICAgICAqIGZha2UgUFBQIG9uZXMuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gIitDR0RDT05UOiAoMS0xKSxcIklQXCIsLCwoMC0yKSwoMC00KVxyXG4iOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRlbXBsYXRlIGlzICtDR0RDT05UPTxpZD4sIjx0eXBlPiIsIjxhcG4+IiwsMCwwICovCisgICAgICAgIGludCAgICAgICAgICAgICAgaWQgPSBjbWRbMF0gLSAnMSc7CisgICAgICAgIEFEYXRhVHlwZSAgICAgICAgdHlwZTsKKyAgICAgICAgY2hhciAgICAgICAgICAgICBhcG5bMzJdOworICAgICAgICBBRGF0YUNvbnRleHQgICAgIGRhdGE7CisKKyAgICAgICAgaWYgKCh1bnNpZ25lZClpZCA+IDMpCisgICAgICAgICAgICBnb3RvIEJhZENvbW1hbmQ7CisKKyAgICAgICAgaWYgKCAhbWVtY21wKCBjbWQrMSwgIixcIklQXCIsXCIiLCA3ICkgKSB7CisgICAgICAgICAgICB0eXBlID0gQV9EQVRBX0lQOworICAgICAgICAgICAgY21kICs9IDg7CisgICAgICAgIH0gZWxzZSBpZiAoICFtZW1jbXAoIGNtZCsxLCAiLFwiUFBQXCIsXCIiLCA4ICkgKSB7CisgICAgICAgICAgICB0eXBlID0gQV9EQVRBX1BQUDsKKyAgICAgICAgICAgIGNtZCArPSA5OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGdvdG8gQmFkQ29tbWFuZDsKKworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiAgcCA9IHN0cmNociggY21kLCAnIicgKTsKKyAgICAgICAgICAgIGludCAgICAgICAgICBsZW47CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gQmFkQ29tbWFuZDsKKyAgICAgICAgICAgIGxlbiA9IChpbnQpKCBwIC0gY21kICk7CisgICAgICAgICAgICBpZiAobGVuID4gc2l6ZW9mKGFwbiktMSApCisgICAgICAgICAgICAgICAgbGVuID0gc2l6ZW9mKGFwbiktMTsKKyAgICAgICAgICAgIG1lbWNweSggYXBuLCBjbWQsIGxlbiApOworICAgICAgICAgICAgYXBuW2xlbl0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgZGF0YSA9IG1vZGVtLT5kYXRhX2NvbnRleHRzICsgaWQ7CisKKyAgICAgICAgZGF0YS0+aWQgICAgID0gaWQgKyAxOworICAgICAgICBkYXRhLT5hY3RpdmUgPSAxOworICAgICAgICBkYXRhLT50eXBlICAgPSB0eXBlOworICAgICAgICBtZW1jcHkoIGRhdGEtPmFwbiwgYXBuLCBzaXplb2YoZGF0YS0+YXBuKSApOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK0JhZENvbW1hbmQ6CisgICAgcmV0dXJuICJFUlJPUjogQkFEIENPTU1BTkQiOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVF1ZXJ5UERQQ29udGV4dCggY29uc3QgY2hhciogY21kLCBBTW9kZW0gbW9kZW0gKQoreworICAgIGludCAgbm47CisgICAgYW1vZGVtX2JlZ2luX2xpbmUobW9kZW0pOworICAgIGZvciAobm4gPSAwOyBubiA8IE1BWF9EQVRBX0NPTlRFWFRTOyBubisrKSB7CisgICAgICAgIEFEYXRhQ29udGV4dCAgZGF0YSA9IG1vZGVtLT5kYXRhX2NvbnRleHRzICsgbm47CisgICAgICAgIGlmICghZGF0YS0+YWN0aXZlKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGFtb2RlbV9hZGRfbGluZSggbW9kZW0sICIrQ0dEQ09OVDogJWQsXCIlc1wiLFwiJXNcIixcIiVzXCIsMCwwXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+dHlwZSA9PSBBX0RBVEFfSVAgPyAiSVAiIDogIlBQUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+YXBuLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdGU6IEZvciBub3csIGhhcmQtY29kZSB0aGUgSVAgYWRkcmVzcyBvZiBvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICAgICBuZXR3b3JrIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPnR5cGUgPT0gQV9EQVRBX0lQID8gIjEwLjAuMi4xNSIgOiAiIik7CisgICAgfQorICAgIHJldHVybiBhbW9kZW1fZW5kX2xpbmUobW9kZW0pOworfQorCitzdGF0aWMgY29uc3QgY2hhcioKK2hhbmRsZVN0YXJ0UERQQ29udGV4dCggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgLyogWFhYOiBUT0RPOiBoYW5kbGUgUERQIHN0YXJ0IGFwcHJvcHJpYXRlbHkgKi8KKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgdm9pZAorcmVtb3RlX3ZvaWNlX2NhbGxfZXZlbnQoIHZvaWQqICBfdmNhbGwsIGludCAgc3VjY2VzcyApCit7CisgICAgQVZvaWNlQ2FsbCAgdmNhbGwgPSBfdmNhbGw7CisgICAgQU1vZGVtICAgICAgbW9kZW0gPSB2Y2FsbC0+bW9kZW07CisKKyAgICAvKiBOT1RFOiBzdWNjZXNzIG9ubHkgbWVhbnMgd2UgY291bGQgc2VuZCB0aGUgImdzbSBpbiBuZXciIGNvbW1hbmQKKyAgICAgKiB0byB0aGUgcmVtb3RlIGVtdWxhdG9yLCBub3RoaW5nIG1vcmUgKi8KKworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAvKiBhYXJnaCwgdGhlIHJlbW90ZSBlbXVsYXRvciBwcm9iYWJseSBxdWl0dGVkIGF0IHRoYXQgcG9pbnQgKi8KKyAgICAgICAgYW1vZGVtX2ZyZWVfY2FsbChtb2RlbSwgdmNhbGwpOworICAgICAgICBhbW9kZW1fc2VuZF9jYWxsc191cGRhdGUobW9kZW0pOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAordm9pY2VfY2FsbF9ldmVudCggdm9pZCogIF92Y2FsbCApCit7CisgICAgQVZvaWNlQ2FsbCAgdmNhbGwgPSBfdmNhbGw7CisgICAgQUNhbGwgICAgICAgY2FsbCAgPSAmdmNhbGwtPmNhbGw7CisKKyAgICBzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisgICAgICAgIGNhc2UgQV9DQUxMX0RJQUxJTkc6CisgICAgICAgICAgICBjYWxsLT5zdGF0ZSA9IEFfQ0FMTF9BTEVSVElORzsKKworICAgICAgICAgICAgaWYgKHZjYWxsLT5pc19yZW1vdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJlbW90ZV9jYWxsX2RpYWwoIGNhbGwtPm51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjYWxsLT5tb2RlbS0+YmFzZV9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlX3ZvaWNlX2NhbGxfZXZlbnQsIHZjYWxsICkgPCAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgLyogd2UgY291bGQgbm90IGNvbm5lY3QsIHByb2JhYmx5IGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgKiBlbXVsYXRvciBpcyBub3QgcnVubmluZywgc28gc2ltcGx5IGRlc3Ryb3kgdGhpcyBjYWxsLgorICAgICAgICAgICAgICAgICAgICAqIFhYWDogc2hvdWxkIHdlIHNlbmQgc29tZSBzb3J0IG9mIG1lc3NhZ2UgdG8gaW5kaWNhdGUgQkFEIE5VTUJFUiA/ICovCisgICAgICAgICAgICAgICAgICAgIC8qIGl0IHNlZW1zIHRoZSBBbmRyb2lkIGNvZGUgc2ltcGx5IHdhaXRzIGZvciBjaGFuZ2VzIGluIHRoZSBsaXN0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYW1vZGVtX2ZyZWVfY2FsbCggdmNhbGwtPm1vZGVtLCB2Y2FsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAvKiB0aGlzIGlzIG5vdCBhIHJlbW90ZSBlbXVsYXRvciBudW1iZXIsIHNvIGp1c3Qgc2ltdWxhdGUKKyAgICAgICAgICAgICAgICAqIGEgc21hbGwgcmluZ2luZyBkZWxheSAqLworICAgICAgICAgICAgICAgIHN5c190aW1lcl9zZXQoIHZjYWxsLT50aW1lciwgc3lzX3RpbWVfbXMoKSArIENBTExfREVMQVlfQUxFUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VfY2FsbF9ldmVudCwgdmNhbGwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQV9DQUxMX0FMRVJUSU5HOgorICAgICAgICAgICAgY2FsbC0+c3RhdGUgPSBBX0NBTExfQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCggMCAmJiAidW5yZWFjaGFibGUgZXZlbnQgY2FsbCBzdGF0ZSIgKTsKKyAgICB9CisgICAgYW1vZGVtX3NlbmRfY2FsbHNfdXBkYXRlKHZjYWxsLT5tb2RlbSk7Cit9CisKK3N0YXRpYyBpbnQgYW1vZGVtX2lzX2VtZXJnZW5jeSggQU1vZGVtIG1vZGVtLCBjb25zdCBjaGFyICpudW1iZXIgKQoreworICAgIGludCBpOworCisgICAgaWYgKCFudW1iZXIpIHJldHVybiAwOworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRU1FUkdFTkNZX05VTUJFUlM7IGkrKykgeworICAgICAgICBpZiAoIG1vZGVtLT5lbWVyZ2VuY3lfbnVtYmVyc1tpXSAmJiAhc3RyY21wKCBudW1iZXIsIG1vZGVtLT5lbWVyZ2VuY3lfbnVtYmVyc1tpXSApKSBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA8IE1BWF9FTUVSR0VOQ1lfTlVNQkVSUykgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVEaWFsKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBBVm9pY2VDYWxsICB2Y2FsbCA9IGFtb2RlbV9hbGxvY19jYWxsKCBtb2RlbSApOworICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgIGludCAgICAgICAgIGxlbjsKKworICAgIGlmIChjYWxsID09IE5VTEwpCisgICAgICAgIHJldHVybiAiRVJST1I6IFRPTyBNQU5ZIENBTExTIjsKKworICAgIGFzc2VydCggY21kWzBdID09ICdEJyApOworICAgIGNhbGwtPmRpciAgID0gQV9DQUxMX09VVEJPVU5EOworICAgIGNhbGwtPnN0YXRlID0gQV9DQUxMX0RJQUxJTkc7CisgICAgY2FsbC0+bW9kZSAgPSBBX0NBTExfVk9JQ0U7CisgICAgY2FsbC0+bXVsdGkgPSAwOworCisgICAgY21kICs9IDE7CisgICAgbGVuICA9IHN0cmxlbihjbWQpOworICAgIGlmIChsZW4gPiAwICYmIGNtZFtsZW4tMV0gPT0gJzsnKQorICAgICAgICBsZW4tLTsKKyAgICBpZiAobGVuID49IHNpemVvZihjYWxsLT5udW1iZXIpKQorICAgICAgICBsZW4gPSBzaXplb2YoY2FsbC0+bnVtYmVyKS0xOworCisgICAgLyogQ29udmVydHMgNCwgNywgYW5kIDEwIGRpZ2l0cyBudW1iZXIgdG8gMTEgZGlnaXRzICovCisgICAgaWYgKGxlbiA9PSAxMCAmJiAhc3RybmNtcChjbWQsIFBIT05FX1BSRUZJWCsxLCA2KSkgeworICAgICAgICBtZW1jcHkoIGNhbGwtPm51bWJlciwgUEhPTkVfUFJFRklYLCAxICk7CisgICAgICAgIG1lbWNweSggY2FsbC0+bnVtYmVyKzEsIGNtZCwgbGVuICk7CisgICAgICAgIGNhbGwtPm51bWJlcltsZW4rMV0gPSAwOworICAgIH0gZWxzZSBpZiAobGVuID09IDcgJiYgIXN0cm5jbXAoY21kLCBQSE9ORV9QUkVGSVgrNCwgMykpIHsKKyAgICAgICAgbWVtY3B5KCBjYWxsLT5udW1iZXIsIFBIT05FX1BSRUZJWCwgNCApOworICAgICAgICBtZW1jcHkoIGNhbGwtPm51bWJlcis0LCBjbWQsIGxlbiApOworICAgICAgICBjYWxsLT5udW1iZXJbbGVuKzRdID0gMDsKKyAgICB9IGVsc2UgaWYgKGxlbiA9PSA0KSB7CisgICAgICAgIG1lbWNweSggY2FsbC0+bnVtYmVyLCBQSE9ORV9QUkVGSVgsIDcgKTsKKyAgICAgICAgbWVtY3B5KCBjYWxsLT5udW1iZXIrNywgY21kLCBsZW4gKTsKKyAgICAgICAgY2FsbC0+bnVtYmVyW2xlbis3XSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KCBjYWxsLT5udW1iZXIsIGNtZCwgbGVuICk7CisgICAgICAgIGNhbGwtPm51bWJlcltsZW5dID0gMDsKKyAgICB9CisKKyAgICBhbW9kZW1fYmVnaW5fbGluZSggbW9kZW0gKTsKKyAgICBpZiAoYW1vZGVtX2lzX2VtZXJnZW5jeShtb2RlbSwgY2FsbC0+bnVtYmVyKSkgeworICAgICAgICBtb2RlbS0+aW5fZW1lcmdlbmN5X21vZGUgPSAxOworICAgICAgICBhbW9kZW1fYWRkX2xpbmUoIG1vZGVtLCAiK1dTT1M6IDEiICk7CisgICAgfQorICAgIHZjYWxsLT5pc19yZW1vdGUgPSAocmVtb3RlX251bWJlcl9zdHJpbmdfdG9fcG9ydChjYWxsLT5udW1iZXIpID4gMCk7CisKKyAgICB2Y2FsbC0+dGltZXIgPSBzeXNfdGltZXJfY3JlYXRlKCk7CisgICAgc3lzX3RpbWVyX3NldCggdmNhbGwtPnRpbWVyLCBzeXNfdGltZV9tcygpICsgQ0FMTF9ERUxBWV9ESUFMLAorICAgICAgICAgICAgICAgICAgIHZvaWNlX2NhbGxfZXZlbnQsIHZjYWxsICk7CisKKyAgICByZXR1cm4gYW1vZGVtX2VuZF9saW5lKCBtb2RlbSApOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyKgoraGFuZGxlQW5zd2VyKCBjb25zdCBjaGFyKiAgY21kLCBBTW9kZW0gIG1vZGVtICkKK3sKKyAgICBpbnQgIG5uOworICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworCisgICAgICAgIGlmIChjbWRbMF0gPT0gJ0EnKSB7CisgICAgICAgICAgICBpZiAoY2FsbC0+c3RhdGUgPT0gQV9DQUxMX0lOQ09NSU5HKSB7CisgICAgICAgICAgICAgICAgYWNhbGxfc2V0X3N0YXRlKCB2Y2FsbCwgQV9DQUxMX0FDVElWRSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY2FsbC0+c3RhdGUgPT0gQV9DQUxMX0FDVElWRSkgeworICAgICAgICAgICAgICAgIGFjYWxsX3NldF9zdGF0ZSggdmNhbGwsIEFfQ0FMTF9IRUxEICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY21kWzBdID09ICdIJykgeworICAgICAgICAgICAgLyogQVRIOiBoYW5ndXAsIHNpbmNlIHVzZXIgaXMgYnVzeSAqLworICAgICAgICAgICAgaWYgKGNhbGwtPnN0YXRlID09IEFfQ0FMTF9JTkNPTUlORykgeworICAgICAgICAgICAgICAgIGFtb2RlbV9mcmVlX2NhbGwoIG1vZGVtLCB2Y2FsbCApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitpbnQgYW5kcm9pZF9zbmFwc2hvdF91cGRhdGVfdGltZSA9IDE7CitpbnQgYW5kcm9pZF9zbmFwc2hvdF91cGRhdGVfdGltZV9yZXF1ZXN0ID0gMDsKKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVTaWduYWxTdHJlbmd0aCggY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSApCit7CisgICAgYW1vZGVtX2JlZ2luX2xpbmUoIG1vZGVtICk7CisKKyAgICAvKiBTbmVhayB0aW1lIHVwZGF0ZXMgaW50byB0aGUgU2lnbmFsU3RyZW5ndGggcmVxdWVzdCwgYmVjYXVzZSBpdCdzIHBlcmlvZGljLgorICAgICAqIElkZWFsbHksIHdlJ2QgYmUgYWJsZSB0byBwcm9kIHRoZSBndWVzdCBpbnRvIGFza2luZyBpbW1lZGlhdGVseSBvbiByZXN0b3JlCisgICAgICogZnJvbSBzbmFwc2hvdCwgYnV0IHRoYXQnZCByZXF1aXJlIGEgZHJpdmVyLgorICAgICAqLworICAgIGlmICggYW5kcm9pZF9zbmFwc2hvdF91cGRhdGVfdGltZSAmJiBhbmRyb2lkX3NuYXBzaG90X3VwZGF0ZV90aW1lX3JlcXVlc3QgKSB7CisgICAgICBhbW9kZW1fYWRkVGltZVVwZGF0ZSggbW9kZW0gKTsKKyAgICAgIGFuZHJvaWRfc25hcHNob3RfdXBkYXRlX3RpbWVfcmVxdWVzdCA9IDA7CisgICAgfQorCisgICAgaWYgKG1vZGVtLT51c2Vfc2lnbmFsX3Byb2ZpbGUpIHsKKyAgICAgICAgc2lnbmFsX3QgY3VycmVudF9zaWduYWwgPSBORVRfUFJPRklMRVNbbW9kZW0tPnF1YWxpdHldOworICAgICAgICBhbW9kZW1fYWRkX2xpbmUobW9kZW0sICIrQ1NROiAlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaSwlaVxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zaWduYWwuZ3NtX3Jzc2ksIGN1cnJlbnRfc2lnbmFsLmdzbV9iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NpZ25hbC5jZG1hX2RibSwgY3VycmVudF9zaWduYWwuY2RtYV9lY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zaWduYWwuZXZkb19kYm0sIGN1cnJlbnRfc2lnbmFsLmV2ZG9fZWNpbywgY3VycmVudF9zaWduYWwuZXZkb19zbnIsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NpZ25hbC5sdGVfcnNzaSwgY3VycmVudF9zaWduYWwubHRlX3JzcnAsIGN1cnJlbnRfc2lnbmFsLmx0ZV9yc3JxLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9zaWduYWwubHRlX3Jzc25yLCBjdXJyZW50X3NpZ25hbC5sdGVfY3FpLCBjdXJyZW50X3NpZ25hbC5sdGVfdGltaW5nKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIHJzc2kgPSAwICg8LTExM2RCbSkgMSAoPC0xMTEpIDItMzAgKDwtMTA5LS01MykgMzEgKD49LTUxKSA5OSAoPyEpCisgICAgICAgIC8vIGJlciAoYml0IGVycm9yIHJhdGUpIC0gYWx3YXlzIDk5ICh1bmtub3duKSwgYXBwYXJlbnRseS4KKyAgICAgICAgLy8gVE9ETzogcmV0dXJuIDk5IGlmIG1vZGVtLT5yYWRpb19zdGF0ZT09QV9SQURJT19TVEFURV9PRkYsIG9uY2UgcmFkaW9fc3RhdGUgaXMgaW4gc25hcHNob3QuCisgICAgICAgIGludCByc3NpID0gbW9kZW0tPnJzc2k7CisgICAgICAgIGludCBiZXIgPSBtb2RlbS0+YmVyOworICAgICAgICByc3NpID0gKDAgPiByc3NpICYmIHJzc2kgPiAzMSkgPyA5OSA6IHJzc2k7CisgICAgICAgIGJlciA9ICgwID4gYmVyICYmIGJlciA+IDcgKSA/IDk5IDogYmVyOworICAgICAgICBhbW9kZW1fYWRkX2xpbmUobW9kZW0sICIrQ1NROiAlaSwlaSw4NSwxMzAsOTAsNiw0LDI1LDksNTAsNjgsMTJcclxuIiwgcnNzaSwgYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGFtb2RlbV9lbmRfbGluZSggbW9kZW0gKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqCitoYW5kbGVIYW5ndXAoIGNvbnN0IGNoYXIqICBjbWQsIEFNb2RlbSAgbW9kZW0gKQoreworICAgIGlmICggIW1lbWNtcChjbWQsICIrQ0hMRD0iLCA2KSApIHsKKyAgICAgICAgaW50ICBubjsKKyAgICAgICAgY21kICs9IDY7CisgICAgICAgIHN3aXRjaCAoY21kWzBdKSB7CisgICAgICAgICAgICBjYXNlICcwJzogIC8qIHJlbGVhc2UgYWxsIGhlbGQsIGFuZCBzZXQgYnVzeSBmb3Igd2FpdGluZyBjYWxscyAqLworICAgICAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgICAgICAgICAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAgICAgICAgICAgICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbC0+bW9kZSAhPSBBX0NBTExfVk9JQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwtPnN0YXRlID09IEFfQ0FMTF9IRUxEICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsLT5zdGF0ZSA9PSBBX0NBTExfV0FJVElORyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+c3RhdGUgPT0gQV9DQUxMX0lOQ09NSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbW9kZW1fZnJlZV9jYWxsKG1vZGVtLCB2Y2FsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBubi0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICBpZiAoY21kWzFdID09IDApIHsgLyogcmVsZWFzZSBhbGwgYWN0aXZlLCBhY2NlcHQgaGVsZCBvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgbW9kZW0tPmNhbGxfY291bnQ7IG5uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAgICAgICAgICAgICAgICAgICBBQ2FsbCAgICAgICBjYWxsICA9ICZ2Y2FsbC0+Y2FsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsLT5tb2RlICE9IEFfQ0FMTF9WT0lDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsLT5zdGF0ZSA9PSBBX0NBTExfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vZGVtX2ZyZWVfY2FsbChtb2RlbSwgdmNhbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5uLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYWxsLT5zdGF0ZSA9PSBBX0NBTExfSEVMRCAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPnN0YXRlID09IEFfQ0FMTF9XQUlUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNhbGxfc2V0X3N0YXRlKCB2Y2FsbCwgQV9DQUxMX0FDVElWRSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIHJlbGVhc2Ugc3BlY2lmaWMgY2FsbCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgIGlkID0gY21kWzFdIC0gJzAnOworICAgICAgICAgICAgICAgICAgICBBVm9pY2VDYWxsICB2Y2FsbCA9IGFtb2RlbV9maW5kX2NhbGwoIG1vZGVtLCBpZCApOworICAgICAgICAgICAgICAgICAgICBpZiAodmNhbGwgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFtb2RlbV9mcmVlX2NhbGwoIG1vZGVtLCB2Y2FsbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnMic6CisgICAgICAgICAgICAgICAgaWYgKGNtZFsxXSA9PSAwKSB7ICAvKiBwbGFjZSBhbGwgYWN0aXZlIG9uIGhvbGQsIGFjY2VwdCBoZWxkIG9yIHdhaXRpbmcgb25lICovCisgICAgICAgICAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVm9pY2VDYWxsICB2Y2FsbCA9IG1vZGVtLT5jYWxscyArIG5uOworICAgICAgICAgICAgICAgICAgICAgICAgQUNhbGwgICAgICAgY2FsbCAgPSAmdmNhbGwtPmNhbGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbC0+bW9kZSAhPSBBX0NBTExfVk9JQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbC0+c3RhdGUgPT0gQV9DQUxMX0FDVElWRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYWxsX3NldF9zdGF0ZSggdmNhbGwsIEFfQ0FMTF9IRUxEICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYWxsLT5zdGF0ZSA9PSBBX0NBTExfSEVMRCAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPnN0YXRlID09IEFfQ0FMTF9XQUlUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNhbGxfc2V0X3N0YXRlKCB2Y2FsbCwgQV9DQUxMX0FDVElWRSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIHBsYWNlIGFsbCBhY3RpdmUgb24gaG9sZCwgZXhjZXB0IGEgc3BlY2lmaWMgb25lICovCisgICAgICAgICAgICAgICAgICAgIGludCAgIGlkID0gY21kWzFdIC0gJzAnOworICAgICAgICAgICAgICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBtb2RlbS0+Y2FsbF9jb3VudDsgbm4rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQVZvaWNlQ2FsbCAgdmNhbGwgPSBtb2RlbS0+Y2FsbHMgKyBubjsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwtPm1vZGUgIT0gQV9DQUxMX1ZPSUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwtPnN0YXRlID09IEFfQ0FMTF9BQ1RJVkUgJiYgY2FsbC0+aWQgIT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2FsbF9zZXRfc3RhdGUoIHZjYWxsLCBBX0NBTExfSEVMRCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICczJzogIC8qIGFkZCBhIGhlbGQgY2FsbCB0byB0aGUgY29udmVyc2F0aW9uICovCisgICAgICAgICAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgbW9kZW0tPmNhbGxfY291bnQ7IG5uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQVZvaWNlQ2FsbCAgdmNhbGwgPSBtb2RlbS0+Y2FsbHMgKyBubjsKKyAgICAgICAgICAgICAgICAgICAgQUNhbGwgICAgICAgY2FsbCAgPSAmdmNhbGwtPmNhbGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsLT5tb2RlICE9IEFfQ0FMTF9WT0lDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbC0+c3RhdGUgPT0gQV9DQUxMX0hFTEQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjYWxsX3NldF9zdGF0ZSggdmNhbGwsIEFfQ0FMTF9BQ1RJVkUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICc0JzogIC8qIGNvbm5lY3QgdGhlIHR3byBjYWxscyAqLworICAgICAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IG1vZGVtLT5jYWxsX2NvdW50OyBubisrKSB7CisgICAgICAgICAgICAgICAgICAgIEFWb2ljZUNhbGwgIHZjYWxsID0gbW9kZW0tPmNhbGxzICsgbm47CisgICAgICAgICAgICAgICAgICAgIEFDYWxsICAgICAgIGNhbGwgID0gJnZjYWxsLT5jYWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbC0+bW9kZSAhPSBBX0NBTExfVk9JQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGwtPnN0YXRlID09IEFfQ0FMTF9IRUxEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2FsbF9zZXRfc3RhdGUoIHZjYWxsLCBBX0NBTExfQUNUSVZFICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAiRVJST1I6IEJBRCBDT01NQU5EIjsKKworICAgIHJldHVybiBOVUxMOworfQorCisKKy8qIGEgZnVuY3Rpb24gdXNlZCB0byBkZWFsIHdpdGggYSBub24tdHJpdmlhbCByZXF1ZXN0ICovCit0eXBlZGVmIGNvbnN0IGNoYXIqICAoKlJlc3BvbnNlSGFuZGxlcikoY29uc3QgY2hhciogIGNtZCwgQU1vZGVtICBtb2RlbSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICAgICAgY21kOyAgICAgLyogY29tbWFuZCBjb21pbmcgZnJvbSBsaWJyZWZlcmVuY2UtcmlsLnNvLCBpZiBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGlzICchJywgdGhlbiB0aGUgcmVzdCBpcyBhIHByZWZpeCBvbmx5ICovCisKKyAgICBjb25zdCBjaGFyKiAgICAgIGFuc3dlcjsgIC8qIGRlZmF1bHQgYW5zd2VyLCBOVUxMIGlmIG5lZWRzIHNwZWNpZmljIGhhbmRsaW5nIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBPSyBpcyBnb29kIGVub3VnaCAqLworCisgICAgUmVzcG9uc2VIYW5kbGVyICBoYW5kbGVyOyAvKiBzcGVjaWZpYyBoYW5kbGVyLCBpZ25vcmVkIGlmICdhbnN3ZXInIGlzIG5vdCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBPSyBpcyBnb29kIGVub3VnaCAqLworfSBzRGVmYXVsdFJlc3BvbnNlc1tdID0KK3sKKyAgICAvKiBzZWUgb25SYWRpb1Bvd2VyT24oKSAqLworICAgIHsgIiVDUEhTPTEiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiJUNUWlY9MSIsIE5VTEwsIE5VTEwgfSwKKworICAgIC8qIHNlZSBvblNJTVJlYWR5KCkgKi8KKyAgICB7ICIrQ1NNUz0xIiwgIitDU01TOiAxLCAxLCAxIiwgTlVMTCB9LAorICAgIHsgIitDTk1JPTEsMiwyLDEsMSIsIE5VTEwsIE5VTEwgfSwKKworICAgIC8qIHNlZSByZXF1ZXN0UmFkaW9Qb3dlcigpICovCisgICAgeyAiK0NGVU49MCIsIE5VTEwsIGhhbmRsZVJhZGlvUG93ZXIgfSwKKyAgICB7ICIrQ0ZVTj0xIiwgTlVMTCwgaGFuZGxlUmFkaW9Qb3dlciB9LAorCisgICAgeyAiK0NURUM9PyIsICIrQ1RFQzogMCwxLDIsMyIsIE5VTEwgfSwgLyogUXVlcnkgYXZhaWxhYmxlIFRlY2hzICovCisgICAgeyAiIStDVEVDIiwgTlVMTCwgaGFuZGxlVGVjaCB9LCAvKiBTZXQvZ2V0IGN1cnJlbnQgVGVjaG5vbG9neSBhbmQgcHJlZmVycmVkIG1vZGUgKi8KKworICAgIHsgIitXUk1QPT8iLCAiK1dSTVA6IDAsMSwyIiwgTlVMTCB9LCAvKiBRdWVyeSBSb2FtIFByZWZlcmVuY2UgKi8KKyAgICB7ICIhK1dSTVAiLCBOVUxMLCBoYW5kbGVSb2FtUHJlZiB9LCAvKiBTZXQvZ2V0IFJvYW0gUHJlZmVyZW5jZSAqLworCisgICAgeyAiK0NDU1M9PyIsICIrQ1RFQzogMCwxIiwgTlVMTCB9LCAvKiBRdWVyeSBhdmFpbGFibGUgc3Vic2NyaXB0aW9uIHNvdXJjZXMgKi8KKyAgICB7ICIhK0NDU1MiLCBOVUxMLCBoYW5kbGVTdWJzY3JpcHRpb25Tb3VyY2UgfSwgLyogU2V0L0dldCBjdXJyZW50IHN1YnNjcmlwdGlvbiBzb3VyY2UgKi8KKworICAgIHsgIitXU09TPT8iLCAiK1dTT1M6IDAiLCBOVUxMfSwgLyogUXVlcnkgc3VwcG9ydGVkICtXU09TIHZhbHVlcyAqLworICAgIHsgIiErV1NPUz0iLCBOVUxMLCBoYW5kbGVFbWVyZ2VuY3lNb2RlIH0sCisKKyAgICB7ICIrV1BSTD8iLCBOVUxMLCBoYW5kbGVQcmxWZXJzaW9uIH0sIC8qIFF1ZXJ5IHRoZSBjdXJyZW50IFBSTCB2ZXJzaW9uICovCisKKyAgICAvKiBzZWUgcmVxdWVzdE9yU2VuZFBEUENvbnRleHRMaXN0KCkgKi8KKyAgICB7ICIrQ0dBQ1Q/IiwgTlVMTCwgaGFuZGxlTGlzdFBEUENvbnRleHRzIH0sCisKKyAgICAvKiBzZWUgcmVxdWVzdE9wZXJhdG9yKCkgKi8KKyAgICB7ICIrQ09QUz0zLDA7K0NPUFM/OytDT1BTPTMsMTsrQ09QUz87K0NPUFM9MywyOytDT1BTPyIsIE5VTEwsIGhhbmRsZVJlcXVlc3RPcGVyYXRvciB9LAorCisgICAgLyogc2VlIHJlcXVlc3RRdWVyeU5ldHdvcmtTZWxlY3Rpb25Nb2RlKCkgKi8KKyAgICB7ICIhK0NPUFMiLCBOVUxMLCBoYW5kbGVPcGVyYXRvclNlbGVjdGlvbiB9LAorCisgICAgLyogc2VlIHJlcXVlc3RHZXRDdXJyZW50Q2FsbHMoKSAqLworICAgIHsgIitDTENDIiwgTlVMTCwgaGFuZGxlTGlzdEN1cnJlbnRDYWxscyB9LAorCisgICAgLyogc2VlIHJlcXVlc3RXcml0ZVNtc1RvU2ltKCkgKi8KKyAgICB7ICIhK0NNR1c9IiwgTlVMTCwgaGFuZGxlU2VuZFNNU3RvU0lNIH0sCisKKyAgICAvKiBzZWUgcmVxdWVzdEhhbmd1cCgpICovCisgICAgeyAiIStDSExEPSIsIE5VTEwsIGhhbmRsZUhhbmd1cCB9LAorCisgICAgLyogc2VlIHJlcXVlc3RTaWduYWxTdHJlbmd0aCgpICovCisgICAgeyAiK0NTUSIsIE5VTEwsIGhhbmRsZVNpZ25hbFN0cmVuZ3RoIH0sCisKKyAgICAvKiBzZWUgcmVxdWVzdFJlZ2lzdHJhdGlvblN0YXRlKCkgKi8KKyAgICB7ICIhK0NSRUciLCBOVUxMLCBoYW5kbGVOZXR3b3JrUmVnaXN0cmF0aW9uIH0sCisgICAgeyAiIStDR1JFRyIsIE5VTEwsIGhhbmRsZU5ldHdvcmtSZWdpc3RyYXRpb24gfSwKKworICAgIC8qIHNlZSByZXF1ZXN0U2VuZFNNUygpICovCisgICAgeyAiIStDTUdTPSIsIE5VTEwsIGhhbmRsZVNlbmRTTVMgfSwKKworICAgIC8qIHNlZSByZXF1ZXN0U2V0dXBEZWZhdWx0UERQKCkgKi8KKyAgICB7ICIlQ1BSSU09XCJHTU1cIixcIkNPTkZJRyBNVUxUSVNMT1RfQ0xBU1M9PDEwPlwiIiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIiVEQVRBPTIsXCJVQVJUXCIsMSwsXCJTRVJcIixcIlVBUlRcIiwwIiwgTlVMTCwgTlVMTCB9LAorCisgICAgeyAiIStDR0RDT05UPSIsIE5VTEwsIGhhbmRsZURlZmluZVBEUENvbnRleHQgfSwKKyAgICB7ICIrQ0dEQ09OVD8iLCBOVUxMLCBoYW5kbGVRdWVyeVBEUENvbnRleHQgfSwKKworICAgIHsgIitDR1FSRVE9MSIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICIrQ0dRTUlOPTEiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NHRVJFUD0xLDAiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NHQUNUPTEsMCIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICJEKjk5KioqMSMiLCBOVUxMLCBoYW5kbGVTdGFydFBEUENvbnRleHQgfSwKKworICAgIC8qIHNlZSByZXF1ZXN0RGlhbCgpICovCisgICAgeyAiIUQiLCBOVUxMLCBoYW5kbGVEaWFsIH0sICAvKiB0aGUgY29kZSBzYXlzIHRoYXQgc3VjY2Vzcy9lcnJvciBpcyBpZ25vcmVkLCB0aGUgY2FsbCBzdGF0ZSB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwb2xsZWQgdGhyb3VnaCArQ0xDQyBpbnN0ZWFkICovCisKKyAgICAvKiBzZWUgcmVxdWVzdFNNU0Fja25vd2xlZGdlKCkgKi8KKyAgICB7ICIrQ05NQT0xIiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIitDTk1BPTIiLCBOVUxMLCBOVUxMIH0sCisKKyAgICAvKiBzZWUgcmVxdWVzdFNJTV9JTygpICovCisgICAgeyAiIStDUlNNPSIsIE5VTEwsIGhhbmRsZVNJTV9JTyB9LAorCisgICAgLyogc2VlIG9uUmVxdWVzdCgpICovCisgICAgeyAiK0NITEQ9MCIsIE5VTEwsIGhhbmRsZUhhbmd1cCB9LAorICAgIHsgIitDSExEPTEiLCBOVUxMLCBoYW5kbGVIYW5ndXAgfSwKKyAgICB7ICIrQ0hMRD0yIiwgTlVMTCwgaGFuZGxlSGFuZ3VwIH0sCisgICAgeyAiK0NITEQ9MyIsIE5VTEwsIGhhbmRsZUhhbmd1cCB9LAorICAgIHsgIkEiLCBOVUxMLCBoYW5kbGVBbnN3ZXIgfSwgIC8qIGFuc3dlciB0aGUgY2FsbCAqLworICAgIHsgIkgiLCBOVUxMLCBoYW5kbGVBbnN3ZXIgfSwgIC8qIHVzZXIgaXMgYnVzeSAqLworICAgIHsgIiErVlRTPSIsIE5VTEwsIGhhbmRsZVNldERpYWxUb25lIH0sCisgICAgeyAiK0NJTUkiLCBPUEVSQVRPUl9IT01FX01DQ01OQyAiMDAwMDAwMDAwIiwgTlVMTCB9LCAgIC8qIHJlcXVlc3QgaW50ZXJuYXRpb24gc3Vic2NyaWJlciBpZGVudGlmaWNhdGlvbiBudW1iZXIgKi8KKyAgICB7ICIrQ0dTTiIsICIwMDAwMDAwMDAwMDAwMDAiLCBOVUxMIH0sICAgLyogcmVxdWVzdCBtb2RlbCB2ZXJzaW9uICovCisgICAgeyAiK0NVU0Q9MiIsTlVMTCwgTlVMTCB9LCAvKiBDYW5jZWwgVVNTRCAqLworICAgIHsgIitDT1BTPTAiLCBOVUxMLCBoYW5kbGVPcGVyYXRvclNlbGVjdGlvbiB9LCAvKiBzZXQgbmV0d29yayBzZWxlY3Rpb24gdG8gYXV0b21hdGljICovCisgICAgeyAiIStDTUdEPSIsIE5VTEwsIGhhbmRsZURlbGV0ZVNNU29uU0lNIH0sIC8qIGRlbGV0ZSBTTVMgb24gU0lNICovCisgICAgeyAiIStDUElOPSIsIE5VTEwsIGhhbmRsZUNoYW5nZU9yRW50ZXJQSU4gfSwKKworICAgIC8qIHNlZSBnZXRTSU1TdGF0dXMoKSAqLworICAgIHsgIitDUElOPyIsIE5VTEwsIGhhbmRsZVNJTVN0YXR1c1JlcSB9LAorICAgIHsgIitDTk1JPyIsICIrQ05NSTogMSwyLDIsMSwxIiwgTlVMTCB9LAorCisgICAgLyogc2VlIGlzUmFkaW9PbigpICovCisgICAgeyAiK0NGVU4/IiwgTlVMTCwgaGFuZGxlUmFkaW9Qb3dlclJlcSB9LAorCisgICAgLyogc2VlIGluaXRpYWxpemVDYWxsYmFjaygpICovCisgICAgeyAiRTBRMFYxIiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIlMwPTAiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NNRUU9MSIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICIrQ0NXQT0xIiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIitDTU9EPTAiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NNVVQ9MCIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICIrQ1NTTj0wLDEiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NPTFA9MCIsIE5VTEwsIE5VTEwgfSwKKyAgICB7ICIrQ1NDUz1cIkhFWFwiIiwgTlVMTCwgTlVMTCB9LAorICAgIHsgIitDVVNEPTEiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NHRVJFUD0xLDAiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiK0NNR0Y9MCIsIE5VTEwsIGhhbmRsZUVuZE9mSW5pdCB9LCAgLyogbm93IGlzIGEgZ29vZCB0aW1lIHRvIHNlbmQgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGltZXpvbmUgKi8KKyAgICB7ICIlQ1BJPTMiLCBOVUxMLCBOVUxMIH0sCisgICAgeyAiJUNTVEFUPTEiLCBOVUxMLCBOVUxMIH0sCisKKyAgICAvKiBMb2dpY2FsIGNoYW5uZWxzICovCisgICAgeyAiIStDQ0hPPSIsIE5VTEwsIGhhbmRsZU9wZW5Mb2dpY2FsQ2hhbm5lbCB9LAorICAgIHsgIiErQ0NIQz0iLCBOVUxMLCBoYW5kbGVDbG9zZUxvZ2ljYWxDaGFubmVsIH0sCisgICAgeyAiIStDR0xBPSIsIE5VTEwsIGhhbmRsZVRyYW5zbWl0TG9naWNhbENoYW5uZWwgfSwKKworICAgIC8qIGVuZCBvZiBsaXN0ICovCisgICAge05VTEwsIE5VTEwsIE5VTEx9Cit9OworCisKKyNkZWZpbmUgIFJFUExZKHN0cikgIGRvIHsgY29uc3QgY2hhciogIHMgPSAoc3RyKTsgUigiPj4gJXNcbiIsIHF1b3RlKHMpKTsgcmV0dXJuIHM7IH0gd2hpbGUgKDApCisKK2NvbnN0IGNoYXIqICBhbW9kZW1fc2VuZCggQU1vZGVtICBtb2RlbSwgY29uc3QgY2hhciogIGNtZCApCit7CisgICAgY29uc3QgY2hhciogIGFuc3dlcjsKKworICAgIGlmICggbW9kZW0tPndhaXRfc21zICE9IDAgKSB7CisgICAgICAgIG1vZGVtLT53YWl0X3NtcyA9IDA7CisgICAgICAgIFIoICJTTVM8PCAlc1xuIiwgcXVvdGUoY21kKSApOworICAgICAgICBhbnN3ZXIgPSBoYW5kbGVTZW5kU01TVGV4dCggY21kLCBtb2RlbSApOworICAgICAgICBSRVBMWShhbnN3ZXIpOworICAgIH0KKworICAgIC8qIGV2ZXJ5dGhpbmcgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggJ0FUJyBpcyBub3QgYSBjb21tYW5kLCByaWdodCA/ICovCisgICAgaWYgKCBjbWRbMF0gIT0gJ0EnIHx8IGNtZFsxXSAhPSAnVCcgfHwgY21kWzJdID09IDAgKSB7CisgICAgICAgIC8qIFIoICItLSAlc1xuIiwgcXVvdGUoY21kKSApOyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUiggIjw8ICVzXG4iLCBxdW90ZShjbWQpICk7CisKKyAgICBjbWQgKz0gMjsKKworICAgIC8qIFRPRE86IGltcGxlbWVudCBjb21tYW5kIGhhbmRsaW5nICovCisgICAgeworICAgICAgICBpbnQgIG5uLCBmb3VuZCA9IDA7CisKKyAgICAgICAgZm9yIChubiA9IDA7IDsgbm4rKykgeworICAgICAgICAgICAgY29uc3QgY2hhciogIHNjbWQgPSBzRGVmYXVsdFJlc3BvbnNlc1tubl0uY21kOworCisgICAgICAgICAgICBpZiAoIXNjbWQpIC8qIGVuZCBvZiBsaXN0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzY21kWzBdID09ICchJykgeyAvKiBwcmVmaXggbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICBpbnQgIGxlbiA9IHN0cmxlbigrK3NjbWQpOworCisgICAgICAgICAgICAgICAgaWYgKCAhbWVtY21wKCBzY21kLCBjbWQsIGxlbiApICkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIGZ1bGwgbWF0Y2ggKi8KKyAgICAgICAgICAgICAgICBpZiAoICFzdHJjbXAoIHNjbWQsIGNtZCApICkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggIWZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgRCggIioqIFVOU1VQUE9SVEVEIENPTU1BTkQgKipcbiIgKTsKKyAgICAgICAgICAgIFJFUExZKCAiRVJST1I6IFVOU1VQUE9SVEVEIiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogICAgICBhbnN3ZXIgID0gc0RlZmF1bHRSZXNwb25zZXNbbm5dLmFuc3dlcjsKKyAgICAgICAgICAgIFJlc3BvbnNlSGFuZGxlciAgaGFuZGxlciA9IHNEZWZhdWx0UmVzcG9uc2VzW25uXS5oYW5kbGVyOworCisgICAgICAgICAgICBpZiAoIGFuc3dlciAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIFJFUExZKCBhbW9kZW1fcHJpbnRmKCBtb2RlbSwgIiVzXHJPSyIsIGFuc3dlciApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBSRVBMWSggIk9LIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhbnN3ZXIgPSBoYW5kbGVyKCBjbWQsIG1vZGVtICk7CisgICAgICAgICAgICBpZiAoYW5zd2VyID09IE5VTEwpCisgICAgICAgICAgICAgICAgUkVQTFkoICJPSyIgKTsKKworICAgICAgICAgICAgaWYgKCAhbWVtY21wKCBhbnN3ZXIsICI+ICIsIDIgKSAgICAgfHwKKyAgICAgICAgICAgICAgICAgIW1lbWNtcCggYW5zd2VyLCAiRVJST1IiLCA1ICkgIHx8CisgICAgICAgICAgICAgICAgICFtZW1jbXAoIGFuc3dlciwgIitDTUUgRVJST1IiLCA2ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJFUExZKCBhbnN3ZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFuc3dlciAhPSBtb2RlbS0+b3V0X2J1ZmYpCisgICAgICAgICAgICAgICAgUkVQTFkoIGFtb2RlbV9wcmludGYoIG1vZGVtLCAiJXNcck9LIiwgYW5zd2VyICkgKTsKKworICAgICAgICAgICAgc3RyY2F0KCBtb2RlbS0+b3V0X2J1ZmYsICJcck9LIiApOworICAgICAgICAgICAgUkVQTFkoIGFuc3dlciApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzQwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L21vZGVtLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zaW1fY2FyZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L3Ntcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L3N5c2RlcHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogTU9ERU0gT0JKRUNUCisgKiovCit0eXBlZGVmIHN0cnVjdCBBTW9kZW1SZWNfKiAgICBBTW9kZW07CisKKy8qIGEgZnVuY3Rpb24gdXNlZCBieSB0aGUgbW9kZW0gdG8gc2VuZCB1bnNvbGljaXRlZCBtZXNzYWdlcyB0byB0aGUgY2hhbm5lbCBjb250cm9sbGVyICovCit0eXBlZGVmIHZvaWQgKCpBTW9kZW1VbnNvbEZ1bmMpKCB2b2lkKiAgb3BhcXVlLCBjb25zdCBjaGFyKiAgbWVzc2FnZSApOworCitleHRlcm4gQU1vZGVtICAgICAgYW1vZGVtX2NyZWF0ZSggaW50ICBiYXNlX3BvcnQsIEFNb2RlbVVuc29sRnVuYyAgdW5zb2xfZnVuYywgdm9pZCogIHVuc29sX29wYXF1ZSApOworZXh0ZXJuIHZvaWQgICAgICAgIGFtb2RlbV9zZXRfbGVnYWN5KCBBTW9kZW0gIG1vZGVtICk7CitleHRlcm4gdm9pZCAgICAgICAgYW1vZGVtX2Rlc3Ryb3koIEFNb2RlbSAgbW9kZW0gKTsKKworLyogc2VuZCBhIGNvbW1hbmQgdG8gdGhlIG1vZGVtICovCitleHRlcm4gY29uc3QgY2hhciogIGFtb2RlbV9zZW5kKCBBTW9kZW0gIG1vZGVtLCBjb25zdCBjaGFyKiAgY21kICk7CisKKy8qIHNpbXVsYXRlIHRoZSByZWNlaXB0IG9uIGFuIGluY29taW5nIFNNUyBtZXNzYWdlICovCitleHRlcm4gdm9pZCAgICAgICAgIGFtb2RlbV9yZWNlaXZlX3NtcyggQU1vZGVtICBtb2RlbSwgU21zUERVICBwZHUgKTsKKworLyoqIFJBRElPIFNUQVRFCisgKiovCit0eXBlZGVmIGVudW0geworICAgIEFfUkFESU9fU1RBVEVfT0ZGID0gMCwgICAgICAgICAgLyogUmFkaW8gZXhwbGljdGx5IHBvd2VyZWQgb2ZmIChlZyBDRlVOPTApICovCisgICAgQV9SQURJT19TVEFURV9PTiwgICAgICAgICAgICAgICAvKiBSYWRpbyBvbiAqLworfSBBUmFkaW9TdGF0ZTsKKworZXh0ZXJuIEFSYWRpb1N0YXRlICBhbW9kZW1fZ2V0X3JhZGlvX3N0YXRlKCBBTW9kZW0gbW9kZW0gKTsKK2V4dGVybiB2b2lkICAgICAgICAgYW1vZGVtX3NldF9yYWRpb19zdGF0ZSggQU1vZGVtIG1vZGVtLCBBUmFkaW9TdGF0ZSAgc3RhdGUgKTsKKworLyogU2V0IHRoZSByZWNlaXZlZCBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9yIGFuZCBiaXQgZXJyb3IgcmF0ZSAqLworZXh0ZXJuIHZvaWQgICAgICAgICBhbW9kZW1fc2V0X3NpZ25hbF9zdHJlbmd0aCggQU1vZGVtIG1vZGVtLCBpbnQgcnNzaSwgaW50IGJlciApOworCisvKiBTZXQgdGhlIHJlY2VpdmVkIHNpZ25hbCBzdHJlbmd0aCBwcm9maWxlICovCitleHRlcm4gdm9pZCAgICAgICAgIGFtb2RlbV9zZXRfc2lnbmFsX3N0cmVuZ3RoX3Byb2ZpbGUoIEFNb2RlbSBtb2RlbSwgaW50IHF1YWxpdHkgKTsKKworLyoqIFNJTSBDQVJEIFNUQVRVUworICoqLworZXh0ZXJuIEFTaW1DYXJkICAgIGFtb2RlbV9nZXRfc2ltKCBBTW9kZW0gIG1vZGVtICk7CisKKy8qKiBWT0lDRSBBTkQgREFUQSBORVRXT1JLIFJFR0lTVFJBVElPTgorICoqLworCisvKiAnc3RhdCcgZm9yICtDUkVHLytDR1JFRyBjb21tYW5kcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBBX1JFR0lTVFJBVElPTl9VTlJFR0lTVEVSRUQgPSAwLAorICAgIEFfUkVHSVNUUkFUSU9OX0hPTUUgPSAxLAorICAgIEFfUkVHSVNUUkFUSU9OX1NFQVJDSElORywKKyAgICBBX1JFR0lTVFJBVElPTl9ERU5JRUQsCisgICAgQV9SRUdJU1RSQVRJT05fVU5LTk9XTiwKKyAgICBBX1JFR0lTVFJBVElPTl9ST0FNSU5HCit9IEFSZWdpc3RyYXRpb25TdGF0ZTsKKworLy8gVGhlIHZhbHVlcyBpbiBBRGF0YU5ldHdvcmtUeXBlIGNhbiBiZSBzZW50IHRvIHRoZSBTeXN0ZW0gaW4gYW4KKy8vICdBVCtDUkVHJyBtZXNzYWdlIHRvIGluZGljYXRlICduZXR3b3JrVHlwZScuIFRoZXNlIHZhbHVlcyBtYXRjaCBlbnVtCisvLyBSSUxfUmFkaW9UZWNobm9sb2d5IGluIHRoZSBTeXN0ZW0ncyBoYXJkd2FyZS9yaWwvaW5jbHVkZS90ZWxlcGhvbnkvcmlsLmgKK3R5cGVkZWYgZW51bSB7CisgICAgQV9EQVRBX05FVFdPUktfVU5LTk9XTiA9ICAwLCAgIC8vIFJBRElPX1RFQ0hfVU5LTk9XTgorICAgIEFfREFUQV9ORVRXT1JLX0dQUlMsICAgICAgICAgICAvLyBSQURJT19URUNIX0dQUlMKKyAgICBBX0RBVEFfTkVUV09SS19FREdFLCAgICAgICAgICAgLy8gUkFESU9fVEVDSF9FREdFCisgICAgQV9EQVRBX05FVFdPUktfVU1UUywgICAgICAgICAgIC8vIFJBRElPX1RFQ0hfVU1UUworICAgIEFfREFUQV9ORVRXT1JLX0xURSAgICAgPSAxNCwgICAvLyBSQURJT19URUNIX0xURQorfSBBRGF0YU5ldHdvcmtUeXBlOworLy8gVE9ETzogTWVyZ2UgdGhlIHVzYWdlIG9mIHRoZXNlIHR3byBzdHJ1Y3RzIGFuZCByZW5hbWUgQURhdGFOZXR3b3JrVHlwZQordHlwZWRlZiBlbnVtIHsKKyAgICBBX1RFQ0hfR1NNID0gMCwKKyAgICBBX1RFQ0hfTFRFLAorICAgIEFfVEVDSF9VTktOT1dOIC8vIFRoaXMgbXVzdCBhbHdheXMgYmUgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIGVudW0KK30gQU1vZGVtVGVjaDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBX1NVQlNDUklQVElPTl9OVlJBTSA9IDAsCisgICAgQV9TVUJTQ1JJUFRJT05fUlVJTSwKKyAgICBBX1NVQlNDUklQVElPTl9VTktOT1dOIC8vIFRoaXMgbXVzdCBhbHdheXMgYmUgdGhlIGxhc3QgdmFsdWUgaW4gdGhlIGVudW0KK30gQUNkbWFTdWJzY3JpcHRpb25Tb3VyY2U7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQV9ST0FNSU5HX1BSRUZfSE9NRSA9IDAsCisgICAgQV9ST0FNSU5HX1BSRUZfQUZGSUxJQVRFRCwKKyAgICBBX1JPQU1JTkdfUFJFRl9BTlksCisgICAgQV9ST0FNSU5HX1BSRUZfVU5LTk9XTiAvLyBUaGlzIG11c3QgYWx3YXlzIGJlIHRoZSBsYXN0IHZhbHVlIGluIHRoZSBlbnVtCit9IEFDZG1hUm9hbWluZ1ByZWY7CisKK2V4dGVybiBBUmVnaXN0cmF0aW9uU3RhdGUgIGFtb2RlbV9nZXRfdm9pY2VfcmVnaXN0cmF0aW9uKCBBTW9kZW0gIG1vZGVtICk7CitleHRlcm4gdm9pZCAgICAgICAgICAgICAgICBhbW9kZW1fc2V0X3ZvaWNlX3JlZ2lzdHJhdGlvbiggQU1vZGVtICBtb2RlbSwgQVJlZ2lzdHJhdGlvblN0YXRlICAgIHN0YXRlICk7CisKK2V4dGVybiBBUmVnaXN0cmF0aW9uU3RhdGUgIGFtb2RlbV9nZXRfZGF0YV9yZWdpc3RyYXRpb24oIEFNb2RlbSAgbW9kZW0gKTsKK2V4dGVybiB2b2lkICAgICAgICAgICAgICAgIGFtb2RlbV9zZXRfZGF0YV9yZWdpc3RyYXRpb24oIEFNb2RlbSAgbW9kZW0sIEFSZWdpc3RyYXRpb25TdGF0ZSAgICBzdGF0ZSApOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgYW1vZGVtX3NldF9kYXRhX25ldHdvcmtfdHlwZSggQU1vZGVtICBtb2RlbSwgQURhdGFOZXR3b3JrVHlwZSAgIHR5cGUgKTsKKworZXh0ZXJuIEFEYXRhTmV0d29ya1R5cGUgICAgYW5kcm9pZF9wYXJzZV9uZXR3b3JrX3R5cGUoIGNvbnN0IGNoYXIqICBzcGVlZCApOworZXh0ZXJuIEFNb2RlbVRlY2ggICAgICAgICAgYW5kcm9pZF9wYXJzZV9tb2RlbV90ZWNoKCBjb25zdCBjaGFyKiAgdGVjaCApOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgYW1vZGVtX3NldF9jZG1hX3N1YnNjcmlwdGlvbl9zb3VyY2UoIEFNb2RlbSBtb2RlbSwgQUNkbWFTdWJzY3JpcHRpb25Tb3VyY2Ugc3NvdXJjZSApOworZXh0ZXJuIHZvaWQgICAgICAgICAgICAgICAgYW1vZGVtX3NldF9jZG1hX3BybF92ZXJzaW9uKCBBTW9kZW0gbW9kZW0sIGludCBwcmxWZXJzaW9uKTsKKworCisvKiogT1BFUkFUT1IgTkFNRVMKKyAqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQV9OQU1FX0xPTkcgPSAwLAorICAgIEFfTkFNRV9TSE9SVCwKKyAgICBBX05BTUVfTlVNRVJJQywKKyAgICBBX05BTUVfTUFYICAvKiBkb24ndCByZW1vdmUgKi8KK30gQU5hbWVJbmRleDsKKworLyogcmV0cmlldmUgb3BlcmF0b3IgbmFtZSBpbnRvIHVzZXItcHJvdmlkZWQgYnVmZmVyLiByZXR1cm5zIG51bWJlciBvZiB3cml0ZXMgd3JpdHRlbiwgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gKi8KK2V4dGVybiBpbnQgICBhbW9kZW1fZ2V0X29wZXJhdG9yX25hbWUgKCBBTW9kZW0gIG1vZGVtLCBBTmFtZUluZGV4ICBpbmRleCwgY2hhciogIGJ1ZmZlciwgaW50ICBidWZmZXJfc2l6ZSApOworCisvKiByZXNldCBvbmUgb3BlcmF0b3IgbmFtZSBmcm9tIGEgdXNlci1wcm92aWRlZCBidWZmZXIsIHNldCBidWZmZXJfc2l6ZSB0byAtMSBmb3IgemVyby10ZXJtaW5hdGVkIHN0cmluZ3MgKi8KK2V4dGVybiB2b2lkICBhbW9kZW1fc2V0X29wZXJhdG9yX25hbWUoIEFNb2RlbSAgbW9kZW0sIEFOYW1lSW5kZXggIGluZGV4LCBjb25zdCBjaGFyKiAgYnVmZmVyLCBpbnQgIGJ1ZmZlcl9zaXplICk7CisKKy8qKiBDQUxMIFNUQVRFUworICoqLworCit0eXBlZGVmIGVudW0geworICAgIEFfQ0FMTF9PVVRCT1VORCA9IDAsCisgICAgQV9DQUxMX0lOQk9VTkQgID0gMSwKK30gQUNhbGxEaXI7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQV9DQUxMX0FDVElWRSA9IDAsCisgICAgQV9DQUxMX0hFTEQsCisgICAgQV9DQUxMX0RJQUxJTkcsCisgICAgQV9DQUxMX0FMRVJUSU5HLAorICAgIEFfQ0FMTF9JTkNPTUlORywKKyAgICBBX0NBTExfV0FJVElORworfSBBQ2FsbFN0YXRlOworCit0eXBlZGVmIGVudW0geworICAgIEFfQ0FMTF9WT0lDRSA9IDAsCisgICAgQV9DQUxMX0RBVEEsCisgICAgQV9DQUxMX0ZBWCwKKyAgICBBX0NBTExfVU5LTk9XTiA9IDkKK30gQUNhbGxNb2RlOworCisjZGVmaW5lICBBX0NBTExfTlVNQkVSX01BWF9TSVpFICAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgaWQ7CisgICAgQUNhbGxEaXIgICAgZGlyOworICAgIEFDYWxsU3RhdGUgIHN0YXRlOworICAgIEFDYWxsTW9kZSAgIG1vZGU7CisgICAgaW50ICAgICAgICAgbXVsdGk7CisgICAgY2hhciAgICAgICAgbnVtYmVyWyBBX0NBTExfTlVNQkVSX01BWF9TSVpFKzEgXTsKK30gQUNhbGxSZWMsICpBQ2FsbDsKKworZXh0ZXJuIGludCAgICBhbW9kZW1fZ2V0X2NhbGxfY291bnQoIEFNb2RlbSAgbW9kZW0gKTsKK2V4dGVybiBBQ2FsbCAgYW1vZGVtX2dldF9jYWxsKCBBTW9kZW0gIG1vZGVtLCAgaW50ICBpbmRleCApOworZXh0ZXJuIEFDYWxsICBhbW9kZW1fZmluZF9jYWxsX2J5X251bWJlciggQU1vZGVtICBtb2RlbSwgY29uc3QgY2hhciogIG51bWJlciApOworZXh0ZXJuIGludCAgICBhbW9kZW1fYWRkX2luYm91bmRfY2FsbCggQU1vZGVtICBtb2RlbSwgY29uc3QgY2hhciogIG51bWJlciApOworZXh0ZXJuIGludCAgICBhbW9kZW1fdXBkYXRlX2NhbGwoIEFNb2RlbSAgbW9kZW0sIGNvbnN0IGNoYXIqICBudW1iZXIsIEFDYWxsU3RhdGUgIHN0YXRlICk7CitleHRlcm4gaW50ICAgIGFtb2RlbV9kaXNjb25uZWN0X2NhbGwoIEFNb2RlbSAgbW9kZW0sIGNvbnN0IGNoYXIqICBudW1iZXIgKTsKKworZXh0ZXJuIHZvaWQgICBhbW9kZW1fc3RhdGVfc2F2ZSggQU1vZGVtIG1vZGVtLCBTeXNGaWxlKiBmaWxlICk7CitleHRlcm4gaW50ICAgIGFtb2RlbV9zdGF0ZV9sb2FkKCBBTW9kZW0gbW9kZW0sIFN5c0ZpbGUqIGZpbGUgKTsKKworLyoqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzMWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmMKQEAgLTAsMCArMSwxNTcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKy8qIGltcGxlbWVudCB0aGUgbW9kZW0gY2hhcmFjdGVyIGRldmljZSBmb3IgQW5kcm9pZCB3aXRoaW4gdGhlIFFFTVUgZXZlbnQgbG9vcC4KKyAqIGl0IGNvbW11bmljYXRlcyB0aHJvdWdoIGEgc2VyaWFsIHBvcnQgd2l0aCAicmlsZCIgKFJhZGlvIEludGVyZmFjZSBMYXllciBEYWVtb24pCisgKiBvbiB0aGUgZW11bGF0ZWQgZGV2aWNlLgorICovCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lICB4eERFQlVHCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGRlZmluZSAgRCguLi4pICAgKCBmcHJpbnRmKCBzdGRlcnIsIF9fVkFfQVJHU19fICkgKQorI2Vsc2UKKyMgIGRlZmluZSAgRCguLi4pICAgKCh2b2lkKTApCisjZW5kaWYKKworQU1vZGVtICAgICAgICBhbmRyb2lkX21vZGVtOworQ1NlcmlhbExpbmUqICBhbmRyb2lkX21vZGVtX3NlcmlhbF9saW5lOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQ1NlcmlhbExpbmUqICAgICAgc2VyaWFsX2xpbmU7CisgICAgQU1vZGVtICAgICAgICAgICAgbW9kZW07CisgICAgY2hhciAgICAgICAgICAgICAgaW5fYnVmZlsgMTAyNCBdOworICAgIGludCAgICAgICAgICAgICAgIGluX3BvczsKKyAgICBpbnQgICAgICAgICAgICAgICBpbl9zbXM7Cit9IE1vZGVtRHJpdmVyOworCisvKiBzZW5kIHVuc29sbGljaXRlZCBtZXNzYWdlcyB0byB0aGUgZGV2aWNlICovCitzdGF0aWMgdm9pZAorbW9kZW1fZHJpdmVyX3Vuc29sKCB2b2lkKiAgX21kLCBjb25zdCBjaGFyKiAgbWVzc2FnZSkKK3sKKyAgICBNb2RlbURyaXZlciogICAgICBtZCA9IF9tZDsKKyAgICBpbnQgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4obWVzc2FnZSk7CisKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfd3JpdGUobWQtPnNlcmlhbF9saW5lLCAoY29uc3QgdWludDhfdCopbWVzc2FnZSwgbGVuKTsKK30KKworc3RhdGljIGludAorbW9kZW1fZHJpdmVyX2Nhbl9yZWFkKCB2b2lkKiAgX21kICkKK3sKKyAgICBNb2RlbURyaXZlciogIG1kICA9IF9tZDsKKyAgICBpbnQgICAgICAgICAgIHJldCA9IHNpemVvZihtZC0+aW5fYnVmZikgLSBtZC0+aW5fcG9zOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogZGVzcGl0ZSBpdHMgbmFtZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIHdyaXRlcyB0byB0aGUgbW9kZW0gKi8KK3N0YXRpYyB2b2lkCittb2RlbV9kcml2ZXJfcmVhZCggdm9pZCogIF9tZCwgY29uc3QgdWludDhfdCogIHNyYywgaW50ICBsZW4gKQoreworICAgIE1vZGVtRHJpdmVyKiAgICAgIG1kICA9IF9tZDsKKyAgICBjb25zdCB1aW50OF90KiAgICBlbmQgPSBzcmMgKyBsZW47CisgICAgaW50ICAgICAgICAgICAgICAgbm47CisKKyAgICBEKCAiJXM6IHJlYWRpbmcgJWQgZnJvbSAlcCBieXRlczoiLCBfX0ZVTkNUSU9OX18sIGxlbiwgc3JjICk7CisgICAgZm9yIChubiA9IDA7IG5uIDwgbGVuOyBubisrKSB7CisgICAgICAgIGludCAgYyA9IHNyY1tubl07CisgICAgICAgIGlmIChjID49IDMyICYmIGMgPCAxMjcpCisgICAgICAgICAgICBEKCAiJWMiLCBjICk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIEQoICI8TEY+IiApOworICAgICAgICBlbHNlIGlmIChjID09ICdccicpCisgICAgICAgICAgICBEKCAiPENSPiIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRCggIlxceCUwMngiLCBjICk7CisgICAgfQorICAgIEQoICJcbiIgKTsKKworICAgIGZvciAoIDsgc3JjIDwgZW5kOyBzcmMrKyApIHsKKyAgICAgICAgY2hhciAgYyA9IHNyY1swXTsKKworICAgICAgICBpZiAobWQtPmluX3NtcykgeworICAgICAgICAgICAgaWYgKGMgIT0gMjYpCisgICAgICAgICAgICAgICAgZ290byBBcHBlbmRDaGFyOworCisgICAgICAgICAgICBtZC0+aW5fYnVmZlsgbWQtPmluX3BvcyBdID0gYzsKKyAgICAgICAgICAgIG1kLT5pbl9wb3MrKzsKKyAgICAgICAgICAgIG1kLT5pbl9zbXMgPSAwOworICAgICAgICAgICAgYyA9ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgeworICAgICAgICAgICAgY29uc3QgY2hhciogIGFuc3dlcjsKKworICAgICAgICAgICAgaWYgKG1kLT5pbl9wb3MgPT0gMCkgIC8qIHNraXAgZW1wdHkgbGluZXMgKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbWQtPmluX2J1ZmZbIG1kLT5pbl9wb3MgXSA9IDA7CisgICAgICAgICAgICBtZC0+aW5fcG9zICAgICAgICAgICAgICAgID0gMDsKKworICAgICAgICAgICAgRCggIiVzOiA8PCAlc1xuIiwgX19GVU5DVElPTl9fLCBtZC0+aW5fYnVmZiApOworICAgICAgICAgICAgYW5zd2VyID0gYW1vZGVtX3NlbmQoYW5kcm9pZF9tb2RlbSwgbWQtPmluX2J1ZmYpOworICAgICAgICAgICAgaWYgKGFuc3dlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgRCggIiVzOiA+PiAlc1xuIiwgX19GVU5DVElPTl9fLCBhbnN3ZXIgKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oYW5zd2VyKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDIgJiYgYW5zd2VyWzBdID09ICc+JyAmJiBhbnN3ZXJbMV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICBtZC0+aW5fc21zID0gMTsKKworICAgICAgICAgICAgICAgIGFuZHJvaWRfc2VyaWFsbGluZV93cml0ZShtZC0+c2VyaWFsX2xpbmUsIChjb25zdCB1aW50OF90KilhbnN3ZXIsIGxlbik7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3dyaXRlKG1kLT5zZXJpYWxfbGluZSwgKGNvbnN0IHVpbnQ4X3QqKSJcciIsIDEpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgRCggIiVzOiAtLSBOTyBBTlNXRVJcbiIsIF9fRlVOQ1RJT05fXyApOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIEFwcGVuZENoYXI6CisgICAgICAgIG1kLT5pbl9idWZmWyBtZC0+aW5fcG9zKysgXSA9IGM7CisgICAgICAgIGlmIChtZC0+aW5fcG9zID09IHNpemVvZihtZC0+aW5fYnVmZikpIHsKKyAgICAgICAgICAgIC8qIGlucHV0IGlzIHRvbyBsb25nICEhICovCisgICAgICAgICAgICBtZC0+aW5fcG9zID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBEKCAiJXM6IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworfQorCitzdGF0aWMgdm9pZAorbW9kZW1fZHJpdmVyX2luaXQoaW50IGJhc2VfcG9ydCwgTW9kZW1Ecml2ZXIqIGRtLCBDU2VyaWFsTGluZSogc2wpIHsKKyAgICBkbS0+c2VyaWFsX2xpbmUgPSBzbDsKKyAgICBkbS0+aW5fcG9zID0gMDsKKyAgICBkbS0+aW5fc21zID0gMDsKKyAgICBkbS0+bW9kZW0gPSBhbW9kZW1fY3JlYXRlKCBiYXNlX3BvcnQsIG1vZGVtX2RyaXZlcl91bnNvbCwgZG0gKTsKKworICAgIGFuZHJvaWRfc2VyaWFsbGluZV9hZGRoYW5kbGVycyhzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVtX2RyaXZlcl9jYW5fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW1fZHJpdmVyX3JlYWQpOworfQorCisKK3ZvaWQgYW5kcm9pZF9tb2RlbV9pbml0KCBpbnQgIGJhc2VfcG9ydCApCit7CisgICAgc3RhdGljIE1vZGVtRHJpdmVyICBtb2RlbV9kcml2ZXJbMV07CisKKyAgICBhbmRyb2lkX3RlbGVwaG9ueV9kZWJ1Z19tb2RlbSA9IFZFUkJPU0VfQ0hFQ0sobW9kZW0pOworICAgIGFuZHJvaWRfdGVsZXBob255X2RlYnVnX3JhZGlvID0gVkVSQk9TRV9DSEVDSyhyYWRpbyk7CisgICAgYW5kcm9pZF90ZWxlcGhvbnlfZGVidWdfc29ja2V0ID0gVkVSQk9TRV9DSEVDSyhzb2NrZXQpOworCisgICAgaWYgKGFuZHJvaWRfbW9kZW1fc2VyaWFsX2xpbmUgIT0gTlVMTCkgeworICAgICAgICBtb2RlbV9kcml2ZXJfaW5pdChiYXNlX3BvcnQsIG1vZGVtX2RyaXZlciwgYW5kcm9pZF9tb2RlbV9zZXJpYWxfbGluZSk7CisgICAgICAgIGFuZHJvaWRfbW9kZW0gPSBtb2RlbV9kcml2ZXItPm1vZGVtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L21vZGVtX2RyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L21vZGVtX2RyaXZlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpZm5kZWYgX21vZGVtX2RyaXZlcl9oCisjZGVmaW5lIF9tb2RlbV9kcml2ZXJfaAorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyoqIGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmMgKi8KKy8qIHRoaXMgaXMgdGhlIGludGVybmFsIGNoYXJhY3RlciBkcml2ZXIgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZQorICogZW11bGF0ZWQgR1NNIG1vZGVtLiBzZWUgcWVtdV9jaHJfb3BlbigpIGluIHZsLmMgKi8KK2V4dGVybiBDU2VyaWFsTGluZSogYW5kcm9pZF9tb2RlbV9zZXJpYWxfbGluZTsKKworLyogdGhlIGVtdWxhdGVkIEdTTSBtb2RlbSBpdHNlbGYgKi8KK2V4dGVybiBBTW9kZW0gIGFuZHJvaWRfbW9kZW07CisKKy8qIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgVk0gcnVucyBpZiB0aGVyZSBpcyBhIG1vZGVtIHRvIGVtdWxhdGUgKi8KK2V4dGVybiB2b2lkICAgYW5kcm9pZF9tb2RlbV9pbml0KCBpbnQgIGJhc2VfcG9ydCApOworCitBTkRST0lEX0VORF9IRUFERVIKKworI2VuZGlmIC8qIF9tb2RlbV9kcml2ZXJfaCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L21vZGVtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmNhZDExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9BcnJheVNpemUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgY29uc3QgaW50IGtCYXNlUG9ydCA9IDQyOworCitjbGFzcyBNb2RlbVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtTW9kZW0gPSBhbW9kZW1fY3JlYXRlKGtCYXNlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTW9kZW1UZXN0OjpvblVuc29saWNpdGVkQ29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU1vZGVtKSB7CisgICAgICAgICAgICBhbW9kZW1fZGVzdHJveShtTW9kZW0pOworICAgICAgICAgICAgbU1vZGVtID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uVW5zb2xpY2l0ZWRDb21tYW5kKHZvaWQqIG9wYXF1ZSwgY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIH0KKworICAgIGludCBvcGVuTG9naWNhbENoYW5uZWwoY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAvLyBDcmVhdGUgYW5kIHNlbmQgY29tbWFuZAorICAgICAgICBjaGFyIGNvbW1hbmRbMTAyNF07CisgICAgICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgIkFUK0NDSE89JXMiLCBuYW1lKTsKKyAgICAgICAgY29tbWFuZFtzaXplb2YoY29tbWFuZCkgLSAxXSA9ICdcMCc7CisgICAgICAgIGNvbnN0IGNoYXIqIHJlcGx5ID0gYW1vZGVtX3NlbmQobU1vZGVtLCBjb21tYW5kKTsKKyAgICAgICAgaWYgKHJlcGx5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHRoZSByZXBseQorICAgICAgICBpbnQgY2hhbm5lbDsKKyAgICAgICAgY2hhciBva1s0XSA9IHsgMCB9OworICAgICAgICBjaGFyIGR1bW15OworICAgICAgICBpZiAoc3NjYW5mKHJlcGx5LCAiJWQlM2MlYyIsICZjaGFubmVsLCBvaywgJmR1bW15KSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChvaywgIlxyT0siKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgfQorCisgICAgYm9vbCBjbG9zZUxvZ2ljYWxDaGFubmVsKGludCBjaGFubmVsKSB7CisgICAgICAgIGNoYXIgY29tbWFuZFsxMjhdOworICAgICAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICJBVCtDQ0hDPSVkIiwgY2hhbm5lbCk7CisgICAgICAgIGNvbW1hbmRbc2l6ZW9mKGNvbW1hbmQpIC0gMV0gPSAnXDAnOworICAgICAgICBjb25zdCBjaGFyKiByZXBseSA9IGFtb2RlbV9zZW5kKG1Nb2RlbSwgY29tbWFuZCk7CisgICAgICAgIHJldHVybiBzdHJjbXAoIitDQ0hDXHJPSyIsIHJlcGx5KSA9PSAwOworICAgIH0KKworICAgIEFNb2RlbSBtTW9kZW07Cit9OworCitURVNUX0YoTW9kZW1UZXN0LCBPcGVuTG9naWNhbENoYW5uZWwpIHsKKyAgICAvLyBPcGVuIGEgbGdvaWNhbCBjaGFubmVsIChDQ0hPIG9wZXJhdGlvbikgd2l0aCBzb21lIHJhbmRvbSBuYW1lCisgICAgaW50IGZpcnN0Q2hhbm5lbCA9IG9wZW5Mb2dpY2FsQ2hhbm5lbCgiRjYyMzg3NDgzODMiKTsKKworICAgIC8vIENoYW5uZWxzIG11c3Qgc3RhcnQgYXQgMSBvciBhYm92ZQorICAgIEFTU0VSVF9HRShmaXJzdENoYW5uZWwsIDEpOworCisgICAgaW50IHNlY29uZENoYW5uZWwgPSBvcGVuTG9naWNhbENoYW5uZWwoIkY2MjM4NzQ4MzgzIik7CisgICAgQVNTRVJUX0dFKHNlY29uZENoYW5uZWwsIDEpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGdvdCBhIGRpZmZlcmVudCBjaGFubmVsCisgICAgQVNTRVJUX05FKGZpcnN0Q2hhbm5lbCwgc2Vjb25kQ2hhbm5lbCk7CisKKyAgICBjbG9zZUxvZ2ljYWxDaGFubmVsKGZpcnN0Q2hhbm5lbCk7CisgICAgY2xvc2VMb2dpY2FsQ2hhbm5lbChzZWNvbmRDaGFubmVsKTsKK30KKworVEVTVF9GKE1vZGVtVGVzdCwgQ2xvc2VMb2dpY2FsQ2hhbm5lbCkgeworICAgIGludCBjaGFubmVsID0gb3BlbkxvZ2ljYWxDaGFubmVsKCJGNjIzODc0ODM4MyIpOworICAgIEFTU0VSVF9HRShjaGFubmVsLCAxKTsKKworICAgIC8vIFNob3VsZCBub3QgYmUgYWJsZSB0byBjbG9zZSBhbm90aGVyIGNoYW5uZWwKKyAgICBBU1NFUlRfRkFMU0UoY2xvc2VMb2dpY2FsQ2hhbm5lbChjaGFubmVsICsgMSkpOworCisgICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gY2xvc2UgY2hhbm5lbCBidXQgb25seSBvbmNlCisgICAgQVNTRVJUX1RSVUUoY2xvc2VMb2dpY2FsQ2hhbm5lbChjaGFubmVsKSk7CisgICAgQVNTRVJUX0ZBTFNFKGNsb3NlTG9naWNhbENoYW5uZWwoY2hhbm5lbCkpOworfQorCitzdGF0aWMgY29uc3QgY2hhcioga1ZhbGlkUmVwbHkgPSAiK0NHTEE6IDE0NCwwLEZGNDAzZUUyM2NFMTJlQzExNDYxZWQzNzdlODVkMzg2YThkZmVlNmI4NjRiZDg1YjBiZmFhNWFmODFDQTE2NjE2ZTY0NzI2ZjY5NjQyZTYzNjE3MjcyNjk2NTcyNjE3MDY5MmU2Mzc0NzNFMzBhREIwODAwMDAwMDAwMDAwMDAwMDBcck9LIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrQ21lRXJyb3IgPSAiK0NNRSBFUlJPUjogIjsKKworVEVTVF9GKE1vZGVtVGVzdCwgVHJhbnNtaXRMb2dpY2FsQ2hhbm5lbCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBDaGFubmVsTmFtZTsKKyAgICAgICAgY29uc3QgY2hhciogQ29tbWFuZEZvcm1hdDsKKyAgICAgICAgY29uc3QgY2hhciogRXhwZWN0ZWRSZXBseTsKKyAgICAgICAgYm9vbCBGdWxsTWF0Y2g7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICAvLyBObyBvcGVuIGNoYW5uZWwKKyAgICAgICAgeyBudWxscHRyLCAiQVQrQ0dMQT0xLDEwLDgwQ0FGRjQwMDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgICAgIC8vIE9wZW4gY2hhbm5lbCwgY29ycmVjdCBmb3JtYXQsIGNvcnJlY3QgcmVwbHksIGxvd2VyIDQgYml0cyBpbiBjbGFzcworICAgICAgICAvLyBzaG91bGRuJ3QgbWF0dGVyCisgICAgICAgIHsgIkEwMDAwMDAxNTE0MTQzNEMwMCIsICJBVCtDR0xBPSVkLDEwLDgwQ0FGRjQwMDAiLCBrVmFsaWRSZXBseSwgdHJ1ZSB9LAorICAgICAgICB7ICJBMDAwMDAwMTUxNDE0MzRDMDAiLCAiQVQrQ0dMQT0lZCwxMCw4RkNBRkY0MDAwIiwga1ZhbGlkUmVwbHksIHRydWUgfSwKKyAgICAgICAgeyAiQTAwMDAwMDE1MTQxNDM0QzAwIiwgIkFUK0NHTEE9JWQsMTAsODdDQUZGNDAwMCIsIGtWYWxpZFJlcGx5LCB0cnVlIH0sCisgICAgICAgIHsgIkEwMDAwMDAxNTE0MTQzNEMwMCIsICJBVCtDR0xBPSVkLDEwLDgzQ0FGRjQwMDAiLCBrVmFsaWRSZXBseSwgdHJ1ZSB9LAorICAgICAgICAvLyBDb3JyZWN0IGRhdGEgYnV0IGNoYW5uZWwgbmFtZSB3aXRoIG5vIG1hdGNoaW5nIGRhdGEKKyAgICAgICAgeyAiQUJDREVGIiwgIkFUK0NHTEE9JWQsMTAsODBDQUZGNDAwMCIsIGtDbWVFcnJvciwgZmFsc2UgfSwKKyAgICAgICAgLy8gTWlzbWF0Y2hpbmcgbGVuZ3RoIGFuZCBjb21tYW5kIHNpemUsIHZhcmlvdXMgY29tYmluYXRpb25zCisgICAgICAgIHsgIkY2MjM4NzQ4MzgzIiwgIkFUK0NHTEE9JWQsOSw4MENBRkY0MDAwIiwga0NtZUVycm9yLCBmYWxzZSB9LAorICAgICAgICB7ICJGNjIzODc0ODM4MyIsICJBVCtDR0xBPSVkLDExLDgwQ0FGRjQwMDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgICAgIHsgIkY2MjM4NzQ4MzgzIiwgIkFUK0NHTEE9JWQsMTAsODBDQUZGNDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgICAgIC8vIFRvbyBzaG9ydCwgbXVzdCBiZSBhdCBsZWFzdCAxMCBjaGFyYWN0ZXJzIHRvIGJlIGFuIEFQRFUgY29tbWFuZAorICAgICAgICB7ICJGNjIzODc0ODM4MyIsICJBVCtDR0xBPSVkLDgsODBDQUZGNDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgICAgIC8vIE9wZW4gYSBjaGFubmVsIGJ1dCB1c2UgYW4gaW5jb3JyZWN0IGNoYW5uZWwgbnVtYmVyCisgICAgICAgIHsgIkY2MjM4NzQ4MzgzIiwgIkFUK0NHTEE9MTAwMDAsMTAsODBDQUZGNDAwMCIsIGtDbWVFcnJvciwgZmFsc2UgfSwKKyAgICAgICAgeyAiRjYyMzg3NDgzODMiLCAiQVQrQ0dMQT0wLDEwLDgwQ0FGRjQwMDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgICAgIHsgIkY2MjM4NzQ4MzgzIiwgIkFUK0NHTEE9LTEsMTAsODBDQUZGNDAwMCIsIGtDbWVFcnJvciwgZmFsc2UgfSwKKyAgICAgICAgLy8gQXR0ZW1wdCB0byB1c2UgYW4gaW5jb3JyZWN0IGNsYXNzIG9yIGluc3RydWN0aW9uIChmaXJzdCB0d28gYnl0ZXMpCisgICAgICAgIHsgIkY2MjM4NzQ4MzgzIiwgIkFUK0NHTEE9JWQsMTAsOTBDQUZGNDAwMCIsIGtDbWVFcnJvciwgZmFsc2UgfSwKKyAgICAgICAgeyAiRjYyMzg3NDgzODMiLCAiQVQrQ0dMQT0lZCwxMCw4MENCRkY0MDAwIiwga0NtZUVycm9yLCBmYWxzZSB9LAorICAgICAgICB7ICJGNjIzODc0ODM4MyIsICJBVCtDR0xBPSVkLDEwLEEwREJGRjQwMDAiLCBrQ21lRXJyb3IsIGZhbHNlIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1UZXN0cyA9IGFuZHJvaWQ6OmJhc2U6OmFycmF5U2l6ZShrRGF0YSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1UZXN0czsgKytpKSB7CisgICAgICAgIGludCBjaGFubmVsID0gLTE7CisgICAgICAgIGlmIChrRGF0YVtpXS5DaGFubmVsTmFtZSkgeworICAgICAgICAgICAgY2hhbm5lbCA9IG9wZW5Mb2dpY2FsQ2hhbm5lbChrRGF0YVtpXS5DaGFubmVsTmFtZSk7CisgICAgICAgICAgICBBU1NFUlRfR0UoY2hhbm5lbCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjb21tYW5kWzEwMjRdOworICAgICAgICBpZiAoc3Ryc3RyKGtEYXRhW2ldLkNvbW1hbmRGb3JtYXQsICIlZCIpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIEluc2VydCBjaGFubmVsIG51bWJlciBpZiB0aGVyZSdzIGEgZm9ybWF0IGFyZ3VtZW50IGluIHRoZXJlCisgICAgICAgICAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksIGtEYXRhW2ldLkNvbW1hbmRGb3JtYXQsIGNoYW5uZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAiJXMiLCBrRGF0YVtpXS5Db21tYW5kRm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBjb21tYW5kW3NpemVvZihjb21tYW5kKSAtIDFdID0gJ1wwJzsKKworICAgICAgICBjb25zdCBjaGFyKiByZXBseSA9IGFtb2RlbV9zZW5kKG1Nb2RlbSwgY29tbWFuZCk7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCByZXBseSk7CisgICAgICAgIGlmIChrRGF0YVtpXS5GdWxsTWF0Y2gpIHsKKyAgICAgICAgICAgIEFTU0VSVF9TVFJFUShrRGF0YVtpXS5FeHBlY3RlZFJlcGx5LCByZXBseSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEocmVwbHksIHN0cnN0cihyZXBseSwga0RhdGFbaV0uRXhwZWN0ZWRSZXBseSkpOworICAgICAgICB9CisgICAgICAgIGNsb3NlTG9naWNhbENoYW5uZWwoY2hhbm5lbCk7CisgICAgfQorCisgICAgLy8gQWxzbyB0ZXN0IHRoYXQgdHJhbnNtaXNzaW9uIGZhaWxzIG9uIGEgY2xvc2VkIGNoYW5uZWwKKyAgICBpbnQgY2hhbm5lbCA9IG9wZW5Mb2dpY2FsQ2hhbm5lbCgiQTAwMDAwMDE1MTQxNDM0QzAwIik7CisgICAgQVNTRVJUX0dFKGNoYW5uZWwsIDEpOworCisgICAgLy8gRmlyc3QgdHJhbnNtaXQgc29tZXRoaW5nIHN1Y2Nlc3NmdWxseSwgdGhlbiByZXBlYXQgdGhlIGV4YWN0IHNhbWUgdGhpbmcKKyAgICAvLyBidXQgd2l0aCB0aGUgY2hhbm5lbCBjbG9zZWQKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICBjaGFyIGNvbW1hbmRbMTAyNF07CisgICAgICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgIkFUK0NHTEE9JWQsMTAsODBDQUZGNDAwMCIsIGNoYW5uZWwpOworICAgICAgICBjb21tYW5kW3NpemVvZihjb21tYW5kKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgY29uc3QgY2hhciogcmVwbHkgPSBhbW9kZW1fc2VuZChtTW9kZW0sIGNvbW1hbmQpOworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBBU1NFUlRfU1RSRVEoa1ZhbGlkUmVwbHksIHJlcGx5KTsKKyAgICAgICAgICAgIGNsb3NlTG9naWNhbENoYW5uZWwoY2hhbm5lbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEocmVwbHksIHN0cnN0cihyZXBseSwga0NtZUVycm9yKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3JlbW90ZV9jYWxsLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3JlbW90ZV9jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3ZDRmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvcmVtb3RlX2NhbGwuYwpAQCAtMCwwICsxLDQzMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L3JlbW90ZV9jYWxsLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnNvbGVfYXV0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvZ3NtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvc3lzZGVwcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIGVycm5vX3N0ciBzdHJlcnJvcihlcnJubykKKworLy8gRGVidWcgbG9ncy4KKyNkZWZpbmUgIEQoLi4uKSAgIEFORFJPSURfVEVMRVBIT05ZX0xPR19PTihtb2RlbSxfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFMoLi4uKSAgIEFORFJPSURfVEVMRVBIT05ZX0xPR19PTihzb2NrZXQsX19WQV9BUkdTX18pCisKKy8qKiBCeSBjb252ZW50aW9uLCByZW1vdGUgbnVtYmVycyBhcmUgdGhlIGNvbnNvbGUgcG9ydHMsIGkuZS4gNTU1NCwgNTU1NiwgZXRjLi4uCisgKiovCisjZGVmaW5lICBSRU1PVEVfTlVNQkVSX0JBU0UgICAgICAgNTU1NAorI2RlZmluZSAgUkVNT1RFX05VTUJFUl9NQVggICAgICAgIDE2CisjZGVmaW5lICBSRU1PVEVfTlVNQkVSX01BWF9DSEFSUyAgNAorI2RlZmluZSAgUkVNT1RFX0NPTlNPTEVfUE9SVCAgICAgIDU1NTQKKworaW50CityZW1vdGVfbnVtYmVyX2Zyb21fcG9ydCggaW50ICBwb3J0ICkKK3sKKyAgICBpZiAocG9ydCAmIDEpICAvKiBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcG9ydCA9IChwb3J0IC0gUkVNT1RFX0NPTlNPTEVfUE9SVCkgPj4gMTsKKyAgICBpZiAoKHVuc2lnbmVkKXBvcnQgPj0gUkVNT1RFX05VTUJFUl9NQVgpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBSRU1PVEVfTlVNQkVSX0JBU0UgKyBwb3J0KjI7Cit9CisKK2ludAorcmVtb3RlX251bWJlcl90b19wb3J0KCBpbnQgIG51bWJlciApCit7CisgICAgaWYgKG51bWJlciAmIDEpICAvKiBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbnVtYmVyID0gKG51bWJlciAtIFJFTU9URV9OVU1CRVJfQkFTRSkgPj4gMTsKKyAgICBpZiAoKHVuc2lnbmVkKW51bWJlciA+PSBSRU1PVEVfTlVNQkVSX01BWCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIFJFTU9URV9DT05TT0xFX1BPUlQgKyBudW1iZXIqMjsKK30KKworaW50CityZW1vdGVfbnVtYmVyX3N0cmluZ190b19wb3J0KCBjb25zdCBjaGFyKiAgbnVtYmVyICkKK3sKKyAgICBjaGFyKiAgZW5kOworICAgIGxvbmcgICBudW07CisgICAgY29uc3QgY2hhciogIHRlbXAgPSBudW1iZXI7CisgICAgaW50ICAgIGxlbjsKKworICAgIGxlbiA9IHN0cmxlbihudW1iZXIpOworICAgIGlmIChsZW4gPiAwICYmIG51bWJlcltsZW4tMV0gPT0gJzsnKQorICAgICAgICBsZW4tLTsKKyAgICBpZiAobGVuID09IDExICYmICFtZW1jbXAobnVtYmVyLCBQSE9ORV9QUkVGSVgsIDcpKQorICAgICAgICB0ZW1wICs9IDc7CisgICAgbnVtID0gc3RydG9sKCB0ZW1wLCAmZW5kLCAxMCApOworCisgICAgaWYgKGVuZCA9PSBOVUxMIHx8ICplbmQgfHwgKGludCludW0gIT0gbnVtICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHJlbW90ZV9udW1iZXJfdG9fcG9ydCggKGludCludW0gKTsKK30KKworLyoqIFJFTU9URSBDQUxMIE9CSkVDVFMKKyAqKi8KKwordHlwZWRlZiBzdHJ1Y3QgUmVtb3RlQ2FsbFJlYyB7CisgICAgc3RydWN0IFJlbW90ZUNhbGxSZWMqICAgbmV4dDsKKyAgICBzdHJ1Y3QgUmVtb3RlQ2FsbFJlYyoqICBwcmVmOworICAgIFJlbW90ZUNhbGxUeXBlICAgICAgICAgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdG9fcG9ydDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmcm9tX3BvcnQ7CisgICAgU3lzQ2hhbm5lbCAgICAgICAgICAgICAgY2hhbm5lbDsKKyAgICBSZW1vdGVSZXN1bHRGdW5jICAgICAgICByZXN1bHRfZnVuYzsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICByZXN1bHRfb3BhcXVlOworCisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgcXVpdHRpbmc7CisKKyAgICAvKiB0aGUgb3V0cHV0IGJ1ZmZlciAqLworICAgIGNoYXIqICAgICAgICAgICAgICAgICAgIGJ1ZmY7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnVmZl9wb3M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnVmZl9sZW47CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgYnVmZl9zaXplOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGJ1ZmYwWzEyOF07CisKK30gUmVtb3RlQ2FsbFJlYywgKlJlbW90ZUNhbGw7CisKK3N0YXRpYyB2b2lkCityZW1vdGVfY2FsbF9kb25lKCBSZW1vdGVDYWxsICBjYWxsICkKK3sKKyAgICBjYWxsLT5wcmVmWzBdID0gY2FsbC0+bmV4dDsKKyAgICBjYWxsLT5uZXh0ICAgID0gTlVMTDsKKyAgICBjYWxsLT5wcmVmICAgID0gJmNhbGwtPm5leHQ7CisKKyAgICBpZiAoY2FsbC0+YnVmZiAmJiBjYWxsLT5idWZmICE9IGNhbGwtPmJ1ZmYwKSB7CisgICAgICAgIGZyZWUoY2FsbC0+YnVmZik7CisgICAgICAgIGNhbGwtPmJ1ZmYgICAgICA9IGNhbGwtPmJ1ZmYwOworICAgICAgICBjYWxsLT5idWZmX3NpemUgPSAoaW50KSBzaXplb2YoY2FsbC0+YnVmZjApOworICAgIH0KKworICAgIGlmICggY2FsbC0+Y2hhbm5lbCApIHsKKyAgICAgICAgc3lzX2NoYW5uZWxfY2xvc2UoIGNhbGwtPmNoYW5uZWwgKTsKKyAgICAgICAgY2FsbC0+Y2hhbm5lbCA9IE5VTEw7CisgICAgfQorCisgICAgY2FsbC0+YnVmZl9wb3MgPSAwOworICAgIGNhbGwtPmJ1ZmZfbGVuID0gMDsKK30KKworCitzdGF0aWMgdm9pZAorcmVtb3RlX2NhbGxfZnJlZSggUmVtb3RlQ2FsbCAgY2FsbCApCit7CisgICAgaWYgKGNhbGwpIHsKKyAgICAgICAgcmVtb3RlX2NhbGxfZG9uZSggY2FsbCApOworICAgICAgICBmcmVlKGNhbGwpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCAgcmVtb3RlX2NhbGxfZXZlbnQoIHZvaWQqICBvcGFxdWUsIGludCAgZXZlbnRzICk7ICAvKiBmb3J3YXJkICovCisKK3N0YXRpYyBSZW1vdGVDYWxsCityZW1vdGVfY2FsbF9hbGxvYyggUmVtb3RlQ2FsbFR5cGUgIHR5cGUsIGludCAgdG9fcG9ydCwgaW50ICBmcm9tX3BvcnQgKQoreworICAgIFJlbW90ZUNhbGwgIHJjYWxsICAgID0gY2FsbG9jKCBzaXplb2YoKnJjYWxsKSwgMSApOworICAgIGludCAgICAgICAgIGZyb21fbnVtID0gcmVtb3RlX251bWJlcl9mcm9tX3BvcnQoZnJvbV9wb3J0KTsKKworICAgIGlmIChyY2FsbCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgICpwLCAqZW5kOworCisgICAgICAgIHJjYWxsLT5wcmVmICAgICAgPSAmcmNhbGwtPm5leHQ7CisgICAgICAgIHJjYWxsLT50eXBlICAgICAgPSB0eXBlOworICAgICAgICByY2FsbC0+dG9fcG9ydCAgID0gdG9fcG9ydDsKKyAgICAgICAgcmNhbGwtPmZyb21fcG9ydCA9IGZyb21fcG9ydDsKKyAgICAgICAgcmNhbGwtPmJ1ZmYgICAgICA9IHJjYWxsLT5idWZmMDsKKyAgICAgICAgcmNhbGwtPmJ1ZmZfc2l6ZSA9IHNpemVvZihyY2FsbC0+YnVmZjApOworICAgICAgICByY2FsbC0+YnVmZl9wb3MgID0gMDsKKworICAgICAgICBwICAgPSByY2FsbC0+YnVmZjsKKyAgICAgICAgZW5kID0gcCArIHJjYWxsLT5idWZmX3NpemU7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byBhdXRoZW50aWNhdGUgZmlyc3QKKyAgICAgICAgY2hhciogYXV0aF90b2tlbiA9IGFuZHJvaWRfY29uc29sZV9hdXRoX2dldF90b2tlbl9kdXAoKTsKKyAgICAgICAgaWYgKGF1dGhfdG9rZW4pIHsKKyAgICAgICAgICAgIGlmIChhdXRoX3Rva2VuWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIGEgdG9rZW4gLSBhZGQgYW4gJ2F1dGgnIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiYXV0aCAlc1xuIiwgYXV0aF90b2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKGF1dGhfdG9rZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgiJXM6IGNvdWxkbid0IHJlYWQgYW4gYXV0aCB0b2tlbiwgIgorICAgICAgICAgICAgICAic2tpcHBpbmcgYXV0aGVudGljYXRpb25cbiIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBSRU1PVEVfQ0FMTF9ESUFMOgorICAgICAgICAgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICJnc20gY2FsbCAiIFBIT05FX1BSRUZJWCAiJWRcbiIsIGZyb21fbnVtICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUkVNT1RFX0NBTExfQlVTWToKKyAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiZ3NtIGJ1c3kgIiBQSE9ORV9QUkVGSVggIiVkXG4iLCBmcm9tX251bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUkVNT1RFX0NBTExfSE9MRDoKKyAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiZ3NtIGhvbGQgIiBQSE9ORV9QUkVGSVggIiVkXG4iLCBmcm9tX251bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUkVNT1RFX0NBTExfQUNDRVBUOgorICAgICAgICAgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICJnc20gYWNjZXB0ICIgUEhPTkVfUFJFRklYICIlZFxuIiwgZnJvbV9udW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFJFTU9URV9DQUxMX0hBTkdVUDoKKyAgICAgICAgICAgICAgICBwID0gYnVmcHJpbnQocCwgZW5kLCAiZ3NtIGNhbmNlbCAiIFBIT05FX1BSRUZJWCAiJWRcbiIsIGZyb21fbnVtICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgOworICAgICAgICB9CisgICAgICAgIGlmIChwID49IGVuZCkgeworICAgICAgICAgICAgRCgiJXM6IGJ1ZmZlciB0b28gc2hvcnRcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICAgICAgcmVtb3RlX2NhbGxfZnJlZShyY2FsbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJjYWxsLT5idWZmX2xlbiA9IHAgLSByY2FsbC0+YnVmZjsKKworICAgICAgICByY2FsbC0+Y2hhbm5lbCA9IHN5c19jaGFubmVsX2NyZWF0ZV90Y3BfY2xpZW50KCAibG9jYWxob3N0IiwgdG9fcG9ydCApOworICAgICAgICBpZiAocmNhbGwtPmNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IGNvdWxkIG5vdCBjcmVhdGUgY2hhbm5lbCB0byBwb3J0ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvX3BvcnQpOworICAgICAgICAgICAgcmVtb3RlX2NhbGxfZnJlZShyY2FsbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHN5c19jaGFubmVsX29uKCByY2FsbC0+Y2hhbm5lbCwgU1lTX0VWRU5UX1dSSVRFLCByZW1vdGVfY2FsbF9ldmVudCwgcmNhbGwgKTsKKyAgICB9CisgICAgcmV0dXJuICByY2FsbDsKK30KKworCitzdGF0aWMgaW50CityZW1vdGVfY2FsbF9zZXRfc21zX3BkdSggUmVtb3RlQ2FsbCAgY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbXNQRFUgICAgICBwZHUgKQoreworICAgIGNoYXIgICpwLCAqZW5kOworICAgIGludCAgICBtc2cybGVuLCBidWZmX21zZ19sZW47CisKKyAgICAvLyBBcHBlbmQgYW4gc21zIGNvbW1hbmQgdG8gd2hhdGV2ZXIgaXMgaW4gdGhlIGJ1ZmZlciBhbHJlYWR5LgorICAgIGJ1ZmZfbXNnX2xlbiA9IHN0cmxlbihjYWxsLT5idWZmKTsKKyAgICBtc2cybGVuID0gMzIgKyBzbXNwZHVfdG9faGV4KCBwZHUsIE5VTEwsIDAgKTsKKyAgICBpZiAobXNnMmxlbiA+IGNhbGwtPmJ1ZmZfc2l6ZSAtIGJ1ZmZfbXNnX2xlbikgeworICAgICAgICBjaGFyKiAgbmV3X2J1ZmYgPSBtYWxsb2MobXNnMmxlbiArIGNhbGwtPmJ1ZmZfc2l6ZSk7CisgICAgICAgIGlmIChuZXdfYnVmZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBEKCIlczogbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2MgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIG1zZzJsZW4pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbWNweShuZXdfYnVmZiwgY2FsbC0+YnVmZiwgYnVmZl9tc2dfbGVuICsgMSk7CisgICAgICAgIGNhbGwtPmJ1ZmYgICAgICA9IG5ld19idWZmOworICAgICAgICBjYWxsLT5idWZmX3NpemUgPSBtc2cybGVuICsgY2FsbC0+YnVmZl9zaXplOworICAgIH0KKworICAgIHAgICA9IGNhbGwtPmJ1ZmYgKyBidWZmX21zZ19sZW47CisgICAgZW5kID0gY2FsbC0+YnVmZiArIGNhbGwtPmJ1ZmZfc2l6ZTsKKworICAgIHAgID0gYnVmcHJpbnQocCwgZW5kLCAic21zIHBkdSAiKTsKKyAgICBhc3NlcnQocCA8IGVuZCk7CisKKyAgICBwICs9IHNtc3BkdV90b19oZXgoIHBkdSwgcCwgZW5kLXAgKTsKKyAgICBhc3NlcnQocCArIDEgPCBlbmQpOworCisgICAgKnArKyA9ICdcbic7CisgICAgKnAgPSAwOworCisgICAgY2FsbC0+YnVmZl9sZW4gPSBwIC0gY2FsbC0+YnVmZjsKKyAgICBjYWxsLT5idWZmX3BvcyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK3JlbW90ZV9jYWxsX2FkZCggUmVtb3RlQ2FsbCAgIGNhbGwsCisgICAgICAgICAgICAgICAgIFJlbW90ZUNhbGwgICpwbGlzdCApCit7CisgICAgUmVtb3RlQ2FsbCAgZmlyc3QgPSAqcGxpc3Q7CisKKyAgICBjYWxsLT5uZXh0ID0gZmlyc3Q7CisgICAgY2FsbC0+cHJlZiA9IHBsaXN0OworCisgICAgaWYgKGZpcnN0KQorICAgICAgICBmaXJzdC0+cHJlZiA9ICZjYWxsLT5uZXh0OworfQorCitzdGF0aWMgdm9pZAorcmVtb3RlX2NhbGxfZXZlbnQoIHZvaWQqICBvcGFxdWUsIGludCAgZXZlbnRzICkKK3sKKyAgICBSZW1vdGVDYWxsICBjYWxsID0gb3BhcXVlOworCisgICAgUygiJXM6IGNhbGxlZCBmb3IgY2FsbCAoJWQsJWQpLCBldmVudHM9JTAyeFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgIGNhbGwtPmZyb21fcG9ydCwgY2FsbC0+dG9fcG9ydCwgZXZlbnRzKTsKKworICAgIGlmIChldmVudHMgJiBTWVNfRVZFTlRfUkVBRCkgeworICAgICAgICAvKiBzaW1wbHkgZHJhaW4gdGhlIGNoYW5uZWwgKi8KKyAgICAgICAgY2hhciAgdGVtcFszMl07CisgICAgICAgIGludCAgbiA9IHN5c19jaGFubmVsX3JlYWQoIGNhbGwtPmNoYW5uZWwsIHRlbXAsIHNpemVvZih0ZW1wKSApOworICAgICAgICBpZiAobiA8PSAwKSB7CisgICAgICAgICAgICAvKiByZW1vdGUgZW11bGF0b3IgcHJvYmFibHkgcXVpdHRlZCAqLworICAgICAgICAgICAgLy9TKCIlczogZW11bGF0b3IgJWQgcXVpdHRlZCB3aXRoICVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBjYWxsLT50b19wb3J0LCBlcnJubywgZXJybm9fc3RyKTsKKyAgICAgICAgICAgIHJlbW90ZV9jYWxsX2ZyZWUoIGNhbGwgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChldmVudHMgJiBTWVNfRVZFTlRfV1JJVEUpIHsKKyAgICAgICAgaW50ICBuOworCisgICAgICAgIGlmIChhbmRyb2lkX3RlbGVwaG9ueV9kZWJ1Z19zb2NrZXQpIHsKKyAgICAgICAgICAgIGludCAgbm47CisgICAgICAgICAgICBTKCIlczogY2FsbCAoJWQsJWQpIHNlbmRpbmcgJWQgYnl0ZXMgJyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGNhbGwtPmZyb21fcG9ydCwgY2FsbC0+dG9fcG9ydCwgY2FsbC0+YnVmZl9sZW4gLSBjYWxsLT5idWZmX3BvcyApOworICAgICAgICAgICAgZm9yIChubiA9IGNhbGwtPmJ1ZmZfcG9zOyBubiA8IGNhbGwtPmJ1ZmZfbGVuOyBubisrKSB7CisgICAgICAgICAgICAgICAgaW50ICBjID0gY2FsbC0+YnVmZltubl07CisgICAgICAgICAgICAgICAgaWYgKGMgPCAzMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgUygiXFxuIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIFMoIlxcdCIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdccicpCisgICAgICAgICAgICAgICAgICAgICAgICBTKCJcXHIiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgUygiXFx4JTAyeCIsIGMpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBTKCIlYyIsIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUygiJ1xuIik7CisgICAgICAgIH0KKworICAgICAgICBuID0gc3lzX2NoYW5uZWxfd3JpdGUoIGNhbGwtPmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbC0+YnVmZiArIGNhbGwtPmJ1ZmZfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwtPmJ1ZmZfbGVuIC0gY2FsbC0+YnVmZl9wb3MgKTsKKyAgICAgICAgaWYgKG4gPD0gMCkgeworICAgICAgICAgICAgLyogcmVtb3RlIGVtdWxhdG9yIHByb2JhYmx5IHF1aXR0ZWQgKi8KKyAgICAgICAgICAgIFMoIiVzOiBlbXVsYXRvciAlZCBxdWl0dGVkIHVuZXhwZWN0ZWRseSB3aXRoIGVycm9yICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsLT50b19wb3J0LCBlcnJubywgZXJybm9fc3RyKTsKKyAgICAgICAgICAgIGlmIChjYWxsLT5yZXN1bHRfZnVuYykKKyAgICAgICAgICAgICAgICBjYWxsLT5yZXN1bHRfZnVuYyggY2FsbC0+cmVzdWx0X29wYXF1ZSwgMCApOworICAgICAgICAgICAgcmVtb3RlX2NhbGxfZnJlZSggY2FsbCApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhbGwtPmJ1ZmZfcG9zICs9IG47CisKKyAgICAgICAgaWYgKGNhbGwtPmJ1ZmZfcG9zID49IGNhbGwtPmJ1ZmZfbGVuKSB7CisgICAgICAgICAgICAvKiBjb29sLCB3ZSBzZW50IGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgICAgIFMoIiVzOiBmaW5pc2hlZCBzZW5kaW5nIGRhdGEgdG8gJWRcbiIsIF9fRlVOQ1RJT05fXywgY2FsbC0+dG9fcG9ydCk7CisgICAgICAgICAgICBpZiAoIWNhbGwtPnF1aXR0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGwtPnF1aXR0aW5nID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggY2FsbC0+YnVmZiwgInF1aXRcbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbC0+YnVmZl9sZW4gPSBzdHJsZW4oY2FsbC0+YnVmZik7CisgICAgICAgICAgICAgICAgICAgIGNhbGwtPmJ1ZmZfcG9zID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FsbC0+cXVpdHRpbmcgPSAwOworICAgICAgICAgICAgICAgIGlmIChjYWxsLT5yZXN1bHRfZnVuYykKKyAgICAgICAgICAgICAgICAgICAgY2FsbC0+cmVzdWx0X2Z1bmMoIGNhbGwtPnJlc3VsdF9vcGFxdWUsIDEgKTsKKworICAgICAgICAgICAgICAgIHN5c19jaGFubmVsX29uKCBjYWxsLT5jaGFubmVsLCBTWVNfRVZFTlRfUkVBRCwgcmVtb3RlX2NhbGxfZXZlbnQsIGNhbGwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIFJlbW90ZUNhbGwgIF90aGVfcmVtb3RlX2NhbGxzOworCitzdGF0aWMgUmVtb3RlQ2FsbAorcmVtb3RlX2NhbGxfZ2VuZXJpYyggUmVtb3RlQ2FsbFR5cGUgIHR5cGUsIGNvbnN0IGNoYXIqICB0b19udW1iZXIsIGludCAgZnJvbV9wb3J0ICkKK3sKKyAgICBpbnQgICAgICAgICB0b19wb3J0ID0gcmVtb3RlX251bWJlcl9zdHJpbmdfdG9fcG9ydCh0b19udW1iZXIpOworICAgIFJlbW90ZUNhbGwgIGNhbGw7CisKKyAgICBpZiAoIHJlbW90ZV9udW1iZXJfZnJvbV9wb3J0KGZyb21fcG9ydCkgPCAwICkgeworICAgICAgICBEKCIlczogZnJvbV9wb3J0IHZhbHVlICVkIGlzIG5vdCB2YWxpZCIsIF9fRlVOQ1RJT05fXywgZnJvbV9wb3J0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggdG9fcG9ydCA8IDAgKSB7CisgICAgICAgIEQoIiVzOiBwaG9uZSBudW1iZXIgJyVzJyBpcyBub3QgZGVjaW1hbCBvciByZW1vdGUiLCBfX0ZVTkNUSU9OX18sIHRvX251bWJlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBZb3UgX2Nhbl8gc2VuZCBhbiBTTVMgdG8geW91cnNlbGYuIERpZGphIGtub3c/ICovCisgICAgaWYgKHRvX3BvcnQgPT0gZnJvbV9wb3J0ICYmIHR5cGUgIT0gUkVNT1RFX0NBTExfU01TKSB7CisgICAgICAgIEQoIiVzOiB0cnlpbmcgdG8gY2FsbCBzZWxmXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2FsbCA9IHJlbW90ZV9jYWxsX2FsbG9jKCB0eXBlLCB0b19wb3J0LCBmcm9tX3BvcnQgKTsKKyAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZW1vdGVfY2FsbF9hZGQoIGNhbGwsICZfdGhlX3JlbW90ZV9jYWxscyApOworICAgIEQoIiVzOiBhZGRpbmcgbmV3IGNhbGwgZnJvbSBwb3J0ICVkIHRvIHBvcnQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZnJvbV9wb3J0LCB0b19wb3J0KTsKKyAgICByZXR1cm4gY2FsbDsKK30KKworCitpbnQKK3JlbW90ZV9jYWxsX2RpYWwoIGNvbnN0IGNoYXIqICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGZyb20sCisgICAgICAgICAgICAgICAgICBSZW1vdGVSZXN1bHRGdW5jICByZXN1bHRfZnVuYywKKyAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHJlc3VsdF9vcGFxdWUgKQoreworICAgIFJlbW90ZUNhbGwgICBjYWxsID0gcmVtb3RlX2NhbGxfZ2VuZXJpYyggUkVNT1RFX0NBTExfRElBTCwgbnVtYmVyLCBmcm9tICk7CisKKyAgICBpZiAoY2FsbCAhPSBOVUxMKSB7CisgICAgICAgIGNhbGwtPnJlc3VsdF9mdW5jICAgPSByZXN1bHRfZnVuYzsKKyAgICAgICAgY2FsbC0+cmVzdWx0X29wYXF1ZSA9IHJlc3VsdF9vcGFxdWU7CisgICAgfQorICAgIHJldHVybiBjYWxsID8gMCA6IC0xOworfQorCisKK3ZvaWQKK3JlbW90ZV9jYWxsX290aGVyKCBjb25zdCBjaGFyKiAgdG9fbnVtYmVyLCBpbnQgIGZyb21fcG9ydCwgUmVtb3RlQ2FsbFR5cGUgIHR5cGUgKQoreworICAgIHJlbW90ZV9jYWxsX2dlbmVyaWMoIHR5cGUsIHRvX251bWJlciwgZnJvbV9wb3J0ICk7Cit9CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZW5kIGEgU01TIHRvIGEgcmVtb3RlIGVtdWxhdG9yICovCitpbnQKK3JlbW90ZV9jYWxsX3NtcyggY29uc3QgY2hhciogICBudW1iZXIsCisgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgZnJvbSwKKyAgICAgICAgICAgICAgICAgU21zUERVICAgICAgICBwZHUgKQoreworICAgIFJlbW90ZUNhbGwgICBjYWxsID0gcmVtb3RlX2NhbGxfZ2VuZXJpYyggUkVNT1RFX0NBTExfU01TLCBudW1iZXIsIGZyb20gKTsKKworICAgIGlmIChjYWxsID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChjYWxsICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCByZW1vdGVfY2FsbF9zZXRfc21zX3BkdSggY2FsbCwgcGR1ICkgPCAwICkgeworICAgICAgICAgICAgcmVtb3RlX2NhbGxfZnJlZShjYWxsKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2FsbCA/IDAgOiAtMTsKK30KKworCit2b2lkCityZW1vdGVfY2FsbF9jYW5jZWwoIGNvbnN0IGNoYXIqICB0b19udW1iZXIsIGludCAgZnJvbV9wb3J0ICkKK3sKKyAgICByZW1vdGVfY2FsbF9nZW5lcmljKCBSRU1PVEVfQ0FMTF9IQU5HVVAsIHRvX251bWJlciwgZnJvbV9wb3J0ICk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3JlbW90ZV9jYWxsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3JlbW90ZV9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4NjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvcmVtb3RlX2NhbGwuaApAQCAtMCwwICsxLDYxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvc21zLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogY29udmVydCBhIGJhc2UgY29uc29sZSBwb3J0IGludG8gYSByZW1vdGUgcGhvbmUgbnVtYmVyLCAtMSBvbiBlcnJvciAqLworZXh0ZXJuIGludCAgICAgICAgIHJlbW90ZV9udW1iZXJfZnJvbV9wb3J0KCBpbnQgIHBvcnQgKTsKKworLyogY29udmVydCBhIHJlbW90ZSBwaG9uZSBudW1iZXIgaW50byBhIHJlbW90ZSBjb25zb2xlIHBvcnQsIC0xIG9uIGVycm9yICovCitleHRlcm4gaW50ICAgICAgICAgcmVtb3RlX251bWJlcl90b19wb3J0KCBpbnQgIG51bWJlciApOworCitleHRlcm4gaW50ICAgICAgICAgcmVtb3RlX251bWJlcl9zdHJpbmdfdG9fcG9ydCggY29uc3QgY2hhciogIG51bWJlciApOworCit0eXBlZGVmIHZvaWQgICAoKlJlbW90ZVJlc3VsdEZ1bmMpKCB2b2lkKiAgb3BhcXVlLCBpbnQgIHN1Y2Nlc3MgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBSRU1PVEVfQ0FMTF9ESUFMID0gMCwKKyAgICBSRU1PVEVfQ0FMTF9CVVNZLAorICAgIFJFTU9URV9DQUxMX0hBTkdVUCwKKyAgICBSRU1PVEVfQ0FMTF9IT0xELAorICAgIFJFTU9URV9DQUxMX0FDQ0VQVCwKKyAgICBSRU1PVEVfQ0FMTF9TTVMKK30gUmVtb3RlQ2FsbFR5cGU7CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHlvdSBuZWVkIHRvIGRpYWwgYSByZW1vdGUgdm9pY2UgY2FsbC4KKyAqIHRoaXMgd2lsbCB0cnkgdG8gY29ubmVjdCB0byBhIHJlbW90ZSBlbXVsYXRvci4gdGhlIHJlc3VsdCBmdW5jdGlvbgorICogaXMgY2FsbGVkIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhZnRlciBzb21lIHRpbWUuCisgKgorICogcmV0dXJucyAwIGlmIHRoZSBudW1iZXIgaXMgdG8gYSByZW1vdGUgcGhvbmUsIG9yIC0xIG90aGVyd2lzZQorICovCitleHRlcm4gIGludCAgICAgcmVtb3RlX2NhbGxfZGlhbCggY29uc3QgY2hhciogICAgICAgdG9fbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgIGZyb21fcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVSZXN1bHRGdW5jICByZXN1bHRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICByZXN1bHRfb3BhcXVlICk7CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBzZW5kIGEgU01TIHRvIGEgcmVtb3RlIGVtdWxhdG9yICovCitleHRlcm4gaW50ICAgICAgcmVtb3RlX2NhbGxfc21zKCBjb25zdCBjaGFyKiAgIG51bWJlciwgaW50ICBmcm9tX3BvcnQsIFNtc1BEVSAgcGR1ICk7CisKKy8qIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHlvdSdyZSBidXN5IHRvIGEgcmVtb3RlIGNhbGxlciAqLworZXh0ZXJuIHZvaWQgICAgIHJlbW90ZV9jYWxsX290aGVyKCBjb25zdCBjaGFyKiAgdG9fbnVtYmVyLCBpbnQgIGZyb21fcG9ydCwgUmVtb3RlQ2FsbFR5cGUgIHR5cGUgKTsKKworZXh0ZXJuIHZvaWQgICAgIHJlbW90ZV9jYWxsX2NhbmNlbCggY29uc3QgY2hhciogIHRvX251bWJlciwgaW50IGZyb21fcG9ydCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zaW1fYWNjZXNzX3J1bGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3NpbV9hY2Nlc3NfcnVsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVmNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zaW1fYWNjZXNzX3J1bGVzLmgKQEAgLTAsMCArMSwyMiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBHZXQgdGhlIGFjY2VzcyBydWxlcyBnaXZlbiBieSB8bmFtZXwgaWYgdGhleSBleGlzdCwgb3RoZXJ3aXNlIHJldHVybnMgTlVMTAorY29uc3QgY2hhciogc2ltX2dldF9hY2Nlc3NfcnVsZXMoY29uc3QgY2hhciogbmFtZSk7CisKK0FORFJPSURfRU5EX0hFQURFUgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3NpbV9jYXJkLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3NpbV9jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5Y2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc2ltX2NhcmQuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L3NpbV9jYXJkLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvKiBzZXQgRU5BQkxFX0RZTkFNSUNfUkVDT1JEUyB0byAxIHRvIGVuYWJsZSBkeW5hbWljIHJlY29yZHMKKyAqIGZvciBub3csIHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBuZWVkcyBtb3JlIHRlc3RpbmcKKyAqLworI2RlZmluZSAgRU5BQkxFX0RZTkFNSUNfUkVDT1JEUyAgMAorCisjZGVmaW5lICBBX1NJTV9QSU5fU0laRSAgNAorI2RlZmluZSAgQV9TSU1fUFVLX1NJWkUgIDgKKwordHlwZWRlZiBzdHJ1Y3QgQVNpbUNhcmRSZWNfIHsKKyAgICBBU2ltU3RhdHVzICBzdGF0dXM7CisgICAgY2hhciAgICAgICAgcGluWyBBX1NJTV9QSU5fU0laRSsxIF07CisgICAgY2hhciAgICAgICAgcHVrWyBBX1NJTV9QVUtfU0laRSsxIF07CisgICAgaW50ICAgICAgICAgcGluX3JldHJpZXM7CisgICAgaW50ICAgICAgICAgcG9ydDsKKworICAgIGNoYXIgICAgICAgIG91dF9idWZmWyAyNTYgXTsKKyAgICBpbnQgICAgICAgICBvdXRfc2l6ZTsKKworfSBBU2ltQ2FyZFJlYzsKKworc3RhdGljIEFTaW1DYXJkUmVjICBfc19jYXJkWzFdOworCitBU2ltQ2FyZAorYXNpbWNhcmRfY3JlYXRlKGludCBwb3J0KQoreworICAgIEFTaW1DYXJkICBjYXJkICAgID0gX3NfY2FyZDsKKyAgICBjYXJkLT5zdGF0dXMgICAgICA9IEFfU0lNX1NUQVRVU19SRUFEWTsKKyAgICBjYXJkLT5waW5fcmV0cmllcyA9IDA7CisgICAgc3RybmNweSggY2FyZC0+cGluLCAiMDAwMCIsIHNpemVvZihjYXJkLT5waW4pICk7CisgICAgc3RybmNweSggY2FyZC0+cHVrLCAiMTIzNDU2NzgiLCBzaXplb2YoY2FyZC0+cHVrKSApOworICAgIGNhcmQtPnBvcnQgPSBwb3J0OworICAgIHJldHVybiBjYXJkOworfQorCit2b2lkCithc2ltY2FyZF9kZXN0cm95KCBBU2ltQ2FyZCAgY2FyZCApCit7CisgICAgLyogbm90aGluZyByZWFsbHkgKi8KKyAgICBjYXJkPWNhcmQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorYXNpbWNhcmRfcmVhZHkoIEFTaW1DYXJkICBjYXJkICkKK3sKKyAgICByZXR1cm4gY2FyZC0+c3RhdHVzID09IEFfU0lNX1NUQVRVU19SRUFEWTsKK30KKworQVNpbVN0YXR1cworYXNpbWNhcmRfZ2V0X3N0YXR1cyggQVNpbUNhcmQgIHNpbSApCit7CisgICAgcmV0dXJuIHNpbS0+c3RhdHVzOworfQorCit2b2lkCithc2ltY2FyZF9zZXRfc3RhdHVzKCBBU2ltQ2FyZCAgc2ltLCBBU2ltU3RhdHVzICBzdGF0dXMgKQoreworICAgIHNpbS0+c3RhdHVzID0gc3RhdHVzOworfQorCitjb25zdCBjaGFyKgorYXNpbWNhcmRfZ2V0X3BpbiggQVNpbUNhcmQgIHNpbSApCit7CisgICAgcmV0dXJuIHNpbS0+cGluOworfQorCitjb25zdCBjaGFyKgorYXNpbWNhcmRfZ2V0X3B1ayggQVNpbUNhcmQgIHNpbSApCit7CisgICAgcmV0dXJuIHNpbS0+cHVrOworfQorCit2b2lkCithc2ltY2FyZF9zZXRfcGluKCBBU2ltQ2FyZCAgc2ltLCBjb25zdCBjaGFyKiAgcGluICkKK3sKKyAgICBzdHJuY3B5KCBzaW0tPnBpbiwgcGluLCBBX1NJTV9QSU5fU0laRSApOworICAgIHNpbS0+cGluX3JldHJpZXMgPSAwOworfQorCit2b2lkCithc2ltY2FyZF9zZXRfcHVrKCBBU2ltQ2FyZCAgc2ltLCBjb25zdCBjaGFyKiAgcHVrICkKK3sKKyAgICBzdHJuY3B5KCBzaW0tPnB1aywgcHVrLCBBX1NJTV9QVUtfU0laRSApOworICAgIHNpbS0+cGluX3JldHJpZXMgPSAwOworfQorCisKK2ludAorYXNpbWNhcmRfY2hlY2tfcGluKCBBU2ltQ2FyZCAgc2ltLCBjb25zdCBjaGFyKiAgcGluICkKK3sKKyAgICBpZiAoc2ltLT5zdGF0dXMgIT0gQV9TSU1fU1RBVFVTX1BJTiAgICYmCisgICAgICAgIHNpbS0+c3RhdHVzICE9IEFfU0lNX1NUQVRVU19SRUFEWSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhc3RyY21wKCBzaW0tPnBpbiwgcGluICkgKSB7CisgICAgICAgIHNpbS0+c3RhdHVzICAgICAgPSBBX1NJTV9TVEFUVVNfUkVBRFk7CisgICAgICAgIHNpbS0+cGluX3JldHJpZXMgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoc2ltLT5zdGF0dXMgIT0gQV9TSU1fU1RBVFVTX1JFQURZKSB7CisgICAgICAgIGlmICgrK3NpbS0+cGluX3JldHJpZXMgPT0gMykKKyAgICAgICAgICAgIHNpbS0+c3RhdHVzID0gQV9TSU1fU1RBVFVTX1BVSzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50Cithc2ltY2FyZF9jaGVja19wdWsoIEFTaW1DYXJkICBzaW0sIGNvbnN0IGNoYXIqIHB1aywgY29uc3QgY2hhciogIHBpbiApCit7CisgICAgaWYgKHNpbS0+c3RhdHVzICE9IEFfU0lNX1NUQVRVU19QVUspCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhc3RyY21wKCBzaW0tPnB1aywgcHVrICkgKSB7CisgICAgICAgIHN0cm5jcHkoIHNpbS0+cHVrLCBwdWssIEFfU0lNX1BVS19TSVpFICk7CisgICAgICAgIHN0cm5jcHkoIHNpbS0+cGluLCBwaW4sIEFfU0lNX1BJTl9TSVpFICk7CisgICAgICAgIHNpbS0+c3RhdHVzICAgICAgPSBBX1NJTV9TVEFUVVNfUkVBRFk7CisgICAgICAgIHNpbS0+cGluX3JldHJpZXMgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoICsrc2ltLT5waW5fcmV0cmllcyA9PSA2ICkgeworICAgICAgICBzaW0tPnN0YXR1cyA9IEFfU0lNX1NUQVRVU19BQlNFTlQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIGVudW0geworICAgIFNJTV9GSUxFX0RNID0gMCwKKyAgICBTSU1fRklMRV9ERiwKKyAgICBTSU1fRklMRV9FRl9ERURJQ0FURUQsCisgICAgU0lNX0ZJTEVfRUZfTElORUFSLAorICAgIFNJTV9GSUxFX0VGX0NZQ0xJQworfSBTaW1GaWxlVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTSU1fRklMRV9SRUFEX09OTFkgICAgICAgPSAoMSA8PCAwKSwKKyAgICBTSU1fRklMRV9ORUVEX1BJTiA9ICgxIDw8IDEpLAorfSBTaW1GaWxlRmxhZ3M7CisKKy8qIGRlc2NyaXB0b3IgZm9yIGEga25vd24gU0lNIEZpbGUgKi8KKyNkZWZpbmUgIFNJTV9GSUxFX0hFQUQgICAgICAgXAorICAgIFNpbUZpbGVUeXBlICAgICB0eXBlOyAgICBcCisgICAgdW5zaWduZWQgc2hvcnQgIGlkOyAgICAgIFwKKyAgICB1bnNpZ25lZCBzaG9ydCAgZmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTSU1fRklMRV9IRUFECit9IFNpbUZpbGVBbnlSZWMsICpTaW1GaWxlQW55OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU0lNX0ZJTEVfSEVBRAorICAgIGNieXRlc190ICAgZGF0YTsKKyAgICBpbnQgICAgICAgIGxlbmd0aDsKK30gU2ltRmlsZUVGRGVkaWNhdGVkUmVjLCAqU2ltRmlsZUVGRGVkaWNhdGVkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU0lNX0ZJTEVfSEVBRAorICAgIGJ5dGVfdCAgICAgcmVjX2NvdW50OworICAgIGJ5dGVfdCAgICAgcmVjX2xlbjsKKyAgICBjYnl0ZXNfdCAgIHJlY29yZHM7Cit9IFNpbUZpbGVFRkxpbmVhclJlYywgKlNpbUZpbGVFRkxpbmVhcjsKKwordHlwZWRlZiBTaW1GaWxlRUZMaW5lYXJSZWMgICBTaW1GaWxlRUZDeWNsaWNSZWM7Cit0eXBlZGVmIFNpbUZpbGVFRkN5Y2xpY1JlYyogIFNpbUZpbGVFRkN5Y2xpYzsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgU2ltRmlsZUFueVJlYyAgICAgICAgICBhbnk7CisgICAgU2ltRmlsZUVGRGVkaWNhdGVkUmVjICBkZWRpY2F0ZWQ7CisgICAgU2ltRmlsZUVGTGluZWFyUmVjICAgICBsaW5lYXI7CisgICAgU2ltRmlsZUVGQ3ljbGljUmVjICAgICBjeWNsaWM7Cit9IFNpbUZpbGVSZWMsICpTaW1GaWxlOworCisKKyNpZiBFTkFCTEVfRFlOQU1JQ19SRUNPUkRTCisvKiBjb252ZXJ0IGEgU0lNIEZpbGUgZGVzY3JpcHRvciBpbnRvIGFuIEFTQ0lJIHN0cmluZywKKyAgIGFzc3VtZXMgJ2RzdCcgaXMgTlVMTCBvciBwcm9wZXJseSBzaXplZC4KKyAgIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzLCBvciAtMSBvbiBlcnJvciAqLworc3RhdGljIGludAorc2ltX2ZpbGVfdG9faGV4KCBTaW1GaWxlICBmaWxlLCBieXRlc190ICBkc3QgKQoreworICAgIFNpbUZpbGVUeXBlICB0eXBlICAgPSBmaWxlLT5hbnkudHlwZTsKKyAgICBpbnQgICAgICAgICAgcmVzdWx0ID0gMDsKKworICAgIC8qIHNlZSA5LjIuMSBpbiBUUyA1MS4wMTEgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTSU1fRklMRV9FRl9ERURJQ0FURUQ6CisgICAgICAgIGNhc2UgU0lNX0ZJTEVfRUZfTElORUFSOgorICAgICAgICBjYXNlIFNJTV9GSUxFX0VGX0NZQ0xJQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIGludCAgZmlsZV9zaXplLCBwZXJtOworCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkc3QsICIwMDAwIiwgNCk7ICAvKiBieXRlcyAxLTIgYXJlIFJGVSAqLworICAgICAgICAgICAgICAgICAgICBkc3QgKz0gNDsKKworICAgICAgICAgICAgICAgICAgICAvKiBieXRlcyAzLTQgYXJlIHRoZSBmaWxlIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU0lNX0ZJTEVfRUZfREVESUNBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gZmlsZS0+ZGVkaWNhdGVkLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gZmlsZS0+bGluZWFyLnJlY19jb3VudCAqIGZpbGUtPmxpbmVhci5yZWNfbGVuOworCisgICAgICAgICAgICAgICAgICAgIGdzbV9oZXhfZnJvbV9zaG9ydCggZHN0LCBmaWxlX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0ICs9IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZXMgNS02IGFyZSB0aGUgZmlsZSBpZCAqLworICAgICAgICAgICAgICAgICAgICBnc21faGV4X2Zyb21fc2hvcnQoIGRzdCwgZmlsZS0+YW55LmlkICk7CisgICAgICAgICAgICAgICAgICAgIGRzdCArPSA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGUgNyBpcyB0aGUgZmlsZSB0eXBlIC0gYWx3YXlzIEVGLCBpLmUuIDB4MDQgKi8KKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAnNCc7CisgICAgICAgICAgICAgICAgICAgIGRzdCAgICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSA4IGlzIFJGVSwgZXhjZXB0IGJpdCA3IGZvciBjeWNsaWMgZmlsZXMsIHdoaWNoIGluZGljYXRlcworICAgICAgICAgICAgICAgICAgICAgICB0aGF0IElOQ1JFQVNFIGlzIGFsbG93ZWQuIFNpbmNlIHdlIGRvbid0IHN1cHBvcnQgdGhpcyB5ZXQuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAnMCc7CisgICAgICAgICAgICAgICAgICAgIGRzdCAgICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSA5LTExIGFyZSBhY2Nlc3MgY29uZGl0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+YW55LmZsYWdzICYgU0lNX0ZJTEVfUkVBRF9PTkxZKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+YW55LmZsYWdzICYgU0lNX0ZJTEVfTkVFRF9QSU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSA9IDB4MWE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSA9IDB4MGE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+YW55LmZsYWdzICYgU0lNX0ZJTEVfTkVFRF9QSU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSA9IDB4MTE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ3NtX2hleF9mcm9tX2J5dGUoZHN0LCBwZXJtKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBkc3QrMiwgImEwYWEiLCA0ICk7CisgICAgICAgICAgICAgICAgICAgIGRzdCArPSA2OworCisgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGUgMTIgaXMgZmlsZSBzdGF0dXMsIHdlIGRvbid0IHN1cHBvcnQgaW52YWxpZGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9ICcwJzsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBkc3QgICArPSAyOworCisgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGUgMTMgaXMgbGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgZGF0YSwgYWx3YXlzIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAnMic7CisgICAgICAgICAgICAgICAgICAgIGRzdCAgICs9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSAxNCBpcyBzdHJ1Y3Qgb2YgRUYgKi8KKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTSU1fRklMRV9FRl9ERURJQ0FURUQpCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAnMCc7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gU0lNX0ZJTEVfRUZfTElORUFSKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gJzEnOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAnMyc7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSAxNSBpcyBsZW5naHQgb2YgcmVjb3JkLCBvciAwICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNJTV9GSUxFX0VGX0RFRElDQVRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gJzAnOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gJzAnOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdzbV9oZXhfZnJvbV9ieXRlKCBkc3QsIGZpbGUtPmxpbmVhci5yZWNfbGVuICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IDMwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBjb25zdCBieXRlX3QgIF9jb25zdF9zcG5fY3Boc1syMF0gPSB7CisgICAgMHg0MSwgMHg2ZSwgMHg2NCwgMHg3MiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCitzdGF0aWMgY29uc3QgYnl0ZV90ICBfY29uc3Rfdm9pY2VtYWlsX2NwaHNbMV0gPSB7CisgICAgMHg1NQorfTsKKworc3RhdGljIGNvbnN0IGJ5dGVfdCAgX2NvbnN0X2ljY2lkWzEwXSA9IHsKKyAgICAweDk4LCAweDEwLCAweDE0LCAweDMwLCAweDEyLCAweDExLCAweDgxLCAweDE1LCAweDcwLCAweDAyCit9OworCitzdGF0aWMgY29uc3QgYnl0ZV90ICBfY29uc3RfY2ZmX2NwaHNbMV0gPSB7CisgICAgMHg1NQorfTsKKworc3RhdGljIFNpbUZpbGVFRkRlZGljYXRlZFJlYyAgX2NvbnN0X2ZpbGVzX2RlZGljYXRlZFtdID0KK3sKKyAgICB7IFNJTV9GSUxFX0VGX0RFRElDQVRFRCwgMHg2ZjE0LCBTSU1fRklMRV9SRUFEX09OTFkgfCBTSU1fRklMRV9ORUVEX1BJTiwKKyAgICAgIF9jb25zdF9zcG5fY3Bocywgc2l6ZW9mKF9jb25zdF9zcG5fY3BocykgfSwKKworICAgIHsgU0lNX0ZJTEVfRUZfREVESUNBVEVELCAweDZmMTEsIFNJTV9GSUxFX05FRURfUElOLAorICAgICAgX2NvbnN0X3ZvaWNlbWFpbF9jcGhzLCBzaXplb2YoX2NvbnN0X3ZvaWNlbWFpbF9jcGhzKSB9LAorCisgICAgeyBTSU1fRklMRV9FRl9ERURJQ0FURUQsIDB4MmZlMiwgU0lNX0ZJTEVfUkVBRF9PTkxZLAorICAgICAgX2NvbnN0X2ljY2lkLCBzaXplb2YoX2NvbnN0X2ljY2lkKSB9LAorCisgICAgeyBTSU1fRklMRV9FRl9ERURJQ0FURUQsIDB4NmYxMywgU0lNX0ZJTEVfTkVFRF9QSU4sCisgICAgICBfY29uc3RfY2ZmX2NwaHMsIHNpemVvZihfY29uc3RfY2ZmX2NwaHMpIH0sCisKKyAgICB7IDAsIDAsIDAsIE5VTEwsIDAgfSAgLyogZW5kIG9mIGxpc3QgKi8KK307CisjZW5kaWYgLyogRU5BQkxFX0RZTkFNSUNfUkVDT1JEUyAqLworCitjb25zdCBjaGFyKgorYXNpbWNhcmRfaW8oIEFTaW1DYXJkICBzaW0sIGNvbnN0IGNoYXIqICBjbWQgKQoreworICAgIGludCAgbm47CisjaWYgRU5BQkxFX0RZTkFNSUNfUkVDT1JEUworICAgIGludCAgY29tbWFuZCwgaWQsIHAxLCBwMiwgcDM7CisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsgY29uc3QgY2hhciogIGNtZDsgY29uc3QgY2hhciogIGFuc3dlcjsgfSBhbnN3ZXJzW10gPQorICAgIHsKKyAgICAgICAgeyAiK0NSU009MTkyLDI4NDM2LDAsMCwxNSIsICIrQ1JTTTogMTQ0LDAsMDAwMDAwMTQ2ZjE0MDQwMDFhYTBhYTAxMDIwMDAwIiB9LAorICAgICAgICB7ICIrQ1JTTT0xNzYsMjg0MzYsMCwwLDIwIiwgIitDUlNNOiAxNDQsMCw0MTZlNjQ3MjZmNjk2NGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIiB9LAorCisgICAgICAgIHsgIitDUlNNPTE5MiwyODQzMywwLDAsMTUiLCAiK0NSU006IDE0NCwwLDAwMDAwMDAxNmYxMTA0MDAxMWEwYWEwMTAyMDAwMCIgfSwKKyAgICAgICAgeyAiK0NSU009MTc2LDI4NDMzLDAsMCwxIiwgIitDUlNNOiAxNDQsMCw1NSIgfSwKKworICAgICAgICB7ICIrQ1JTTT0xOTIsMTIyNTgsMCwwLDE1IiwgIitDUlNNOiAxNDQsMCwwMDAwMDAwYTJmZTIwNDAwMGZhMGFhMDEwMjAwMDAiIH0sCisgICAgICAgIHsgIitDUlNNPTE3NiwxMjI1OCwwLDAsMTAiLCAiK0NSU006IDE0NCwwLDk4MTAxNDMwMTIxMTgxMTU3MDAyIiB9LAorCisgICAgICAgIHsgIitDUlNNPTE5MiwyODQzNSwwLDAsMTUiLCAiK0NSU006IDE0NCwwLDAwMDAwMDAxNmYxMzA0MDAxMWEwYWEwMTAyMDAwMCIgfSwKKyAgICAgICAgeyAiK0NSU009MTc2LDI4NDM1LDAsMCwxIiwgICIrQ1JTTTogMTQ0LDAsNTUiIH0sCisKKyAgICAgICAgeyAiK0NSU009MTkyLDI4NDcyLDAsMCwxNSIsICIrQ1JTTTogMTQ0LDAsMDAwMDAwMGY2ZjM4MDQwMDFhYTBhYTAxMDIwMDAwIiB9LAorICAgICAgICB7ICIrQ1JTTT0xNzYsMjg0NzIsMCwwLDE1IiwgIitDUlNNOiAxNDQsMCxmZjMwZmZmZjNjMDAzYzAzMDAwYzAwMDBmMDNmMDAiIH0sCisKKyAgICAgICAgeyAiK0NSU009MTkyLDI4NjE3LDAsMCwxNSIsICIrQ1JTTTogMTQ0LDAsMDAwMDAwMDg2ZmM5MDQwMDExYTBhYTAxMDIwMTA0IiB9LAorICAgICAgICB7ICIrQ1JTTT0xNzgsMjg2MTcsMSw0LDQiLCAgIitDUlNNOiAxNDQsMCwwMTAwMDAwMCIgfSwKKworICAgICAgICB7ICIrQ1JTTT0xOTIsMjg2MTgsMCwwLDE1IiwgIitDUlNNOiAxNDQsMCwwMDAwMDAwYTZmY2EwNDAwMTFhMGFhMDEwMjAxMDUiIH0sCisgICAgICAgIHsgIitDUlNNPTE3OCwyODYxOCwxLDQsNSIsICAiK0NSU006IDE0NCwwLDAwMDAwMDAwMDAiIH0sCisKKyAgICAgICAgeyAiK0NSU009MTkyLDI4NTg5LDAsMCwxNSIsICIrQ1JTTTogMTQ0LDAsMDAwMDAwMDQ2ZmFkMDQwMDBhYTBhYTAxMDIwMDAwIiB9LAorICAgICAgICB7ICIrQ1JTTT0xNzYsMjg1ODksMCwwLDQiLCAgIitDUlNNOiAxNDQsMCwwMDAwMDAwMyIgfSwKKworICAgICAgICB7ICIrQ1JTTT0xOTIsMjg0MzgsMCwwLDE1IiwgIitDUlNNOiAxNDQsMCwwMDAwMDAwMjZmMTYwNDAwMWFhMGFhMDEwMjAwMDAiIH0sCisgICAgICAgIHsgIitDUlNNPTE3NiwyODQzOCwwLDAsMiIsICAiK0NSU006IDE0NCwwLDAyMzMiIH0sCisKKyAgICAgICAgeyAiK0NSU009MTkyLDI4NDg2LDAsMCwxNSIsICIrQ1JTTTogMTQ4LDQiIH0sCisgICAgICAgIHsgIitDUlNNPTE5MiwyODYyMSwwLDAsMTUiLCAiK0NSU006IDE0OCw0IiB9LAorCisgICAgICAgIHsgIitDUlNNPTE5MiwyODYxMywwLDAsMTUiLCAiK0NSU006IDE0NCwwLDAwMDAwMGYwNmZjNTA0MDAwYWEwYWEwMTAyMDExOCIgfSwKKyAgICAgICAgeyAiK0NSU009MTc4LDI4NjEzLDEsNCwyNCIsICIrQ1JTTTogMTQ0LDAsNDMwNTg0NDFhYTg5MGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIiB9LAorCisgICAgICAgIHsgIitDUlNNPTE5MiwyODQ4MCwwLDAsMTUiLCAiK0NSU006IDE0NCwwLDAwMDAwMDgwNmY0MDA0MDAxMWEwYWEwMTAyMDEyMCIgfSwKKyAgICAgICAgeyAiK0NSU009MTc4LDI4NDgwLDEsNCwzMiIsICIrQ1JTTTogMTQ0LDAsZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDc4MTUxNTUyNTgxMzFmNWZmZmZmZmZmZmZmZiIgfSwKKworICAgICAgICB7ICIrQ1JTTT0xOTIsMjg2MTUsMCwwLDE1IiwgIitDUlNNOiAxNDQsMCwwMDAwMDA0MDZmYzcwNDAwMTFhMGFhMDEwMjAxMjAiIH0sCisgICAgICAgIHsgIitDUlNNPTE3OCwyODYxNSwxLDQsMzIiLCAiK0NSU006IDE0NCwwLDU2NmY2OTYzNjU2ZDYxNjk2Y2ZmZmZmZmZmZmZmZmZmZmZmZjA3OTE1MTU1MTI1NzQwZjlmZmZmZmZmZmZmZmYiIH0sCisKKyAgICAgICAgeyBOVUxMLCBOVUxMIH0KKyAgICB9OworCisgICAgYXNzZXJ0KCBtZW1jbXAoIGNtZCwgIitDUlNNPSIsIDYgKSA9PSAwICk7CisKKyNpZiBFTkFCTEVfRFlOQU1JQ19SRUNPUkRTCisgICAgaWYgKCBzc2NhbmYoY21kLCAiK0NSU009JWQsJWQsJWQsJWQsJWQiLCAmY29tbWFuZCwgJmlkLCAmcDEsICZwMiwgJnAzKSA9PSA1ICkgeworICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICAgICAgICAgIGNhc2UgQV9TSU1fQ01EX0dFVF9SRVNQT05TRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbUZpbGVFRkRlZGljYXRlZFJlYyogIGZpbGUgPSBfY29uc3RfZmlsZXNfZGVkaWNhdGVkOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydChwMSA9PSAwICYmIHAyID09IDAgJiYgcDMgPT0gMTUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoIDsgZmlsZS0+aWQgIT0gMDsgZmlsZSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICBvdXQgPSBzaW0tPm91dF9idWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweSggb3V0LCAiK0NSU006IDE0NCwwLCIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgICs9IHN0cmxlbihvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gc2ltX2ZpbGVfdG9faGV4KCAoU2ltRmlsZSkgZmlsZSwgb3V0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUjogSU5URVJOQUwgU0lNIEVSUk9SIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbY291bnRdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2ltLT5vdXRfYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQV9TSU1fQ01EX1JFQURfQklOQVJZOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltRmlsZUVGRGVkaWNhdGVkUmVjKiAgZmlsZSA9IF9jb25zdF9maWxlc19kZWRpY2F0ZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHAxID09IDAgJiYgcDIgPT0gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBmaWxlLT5pZCAhPSAwOyBmaWxlKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgb3V0ID0gc2ltLT5vdXRfYnVmZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwMyA+IGZpbGUtPmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUjogQklOQVJZIExFTkdUSCBJUyBUT08gTE9ORyI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoIG91dCwgIitDUlNNOiAxNDQsMCwiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICArPSBzdHJsZW4ob3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc21faGV4X2Zyb21fYnl0ZXMoIG91dCwgZmlsZS0+ZGF0YSwgcDMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcDMqMl0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaW0tPm91dF9idWZmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBBX1NJTV9DTURfUkVBRF9SRUNPUkQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUjogVU5TVVBQT1JURUQgU0lNIENPTU1BTkQiOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIXN0cmNtcCgiK0NSU009MTc4LDI4NDgwLDEsNCwzMiIsIGNtZCkpIHsKKyAgICAgICAgc25wcmludGYoIHNpbS0+b3V0X2J1ZmYsIHNpemVvZihzaW0tPm91dF9idWZmKSwgIitDUlNNOiAxNDQsMCxmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwNzgxNTE1NTI1JWQxJWQlZGYlZGZmZmZmZmZmZmZmZiIsIChzaW0tPnBvcnQgLyAxMDAwKSAlIDEwLCAoc2ltLT5wb3J0IC8gMTApICUgMTAsIChzaW0tPnBvcnQgLyAxMDApICUgMTAsIHNpbS0+cG9ydCAlIDEwKTsKKyAgICAgICAgcmV0dXJuIHNpbS0+b3V0X2J1ZmY7CisgICAgICAgIH0KKworICAgIGZvciAobm4gPSAwOyBhbnN3ZXJzW25uXS5jbWQgIT0gTlVMTDsgbm4rKykgeworICAgICAgICBpZiAoICFzdHJjbXAoIGFuc3dlcnNbbm5dLmNtZCwgY21kICkgKSB7CisgICAgICAgICAgICByZXR1cm4gYW5zd2Vyc1tubl0uYW5zd2VyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAiRVJST1I6IEJBRCBDT01NQU5EIjsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zaW1fY2FyZC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zaW1fY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWQ3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3NpbV9jYXJkLmgKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L2dzbS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEFTaW1DYXJkUmVjXyogICAgQVNpbUNhcmQ7CisKK2V4dGVybiBBU2ltQ2FyZCAgYXNpbWNhcmRfY3JlYXRlKCBpbnQgZnJvbV9wb3J0ICk7CitleHRlcm4gdm9pZCAgICAgIGFzaW1jYXJkX2Rlc3Ryb3koIEFTaW1DYXJkICBzaW0gKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBX1NJTV9TVEFUVVNfQUJTRU5UID0gMCwKKyAgICBBX1NJTV9TVEFUVVNfTk9UX1JFQURZLAorICAgIEFfU0lNX1NUQVRVU19SRUFEWSwKKyAgICBBX1NJTV9TVEFUVVNfUElOLAorICAgIEFfU0lNX1NUQVRVU19QVUssCisgICAgQV9TSU1fU1RBVFVTX05FVFdPUktfUEVSU09OQUxJWkFUSU9OCit9IEFTaW1TdGF0dXM7CisKK2V4dGVybiBBU2ltU3RhdHVzICBhc2ltY2FyZF9nZXRfc3RhdHVzKCBBU2ltQ2FyZCAgc2ltICk7CitleHRlcm4gdm9pZCAgICAgICAgYXNpbWNhcmRfc2V0X3N0YXR1cyggQVNpbUNhcmQgIHNpbSwgQVNpbVN0YXR1cyAgc3RhdHVzICk7CisKK2V4dGVybiBjb25zdCBjaGFyKiAgYXNpbWNhcmRfZ2V0X3BpbiggQVNpbUNhcmQgIHNpbSApOworZXh0ZXJuIGNvbnN0IGNoYXIqICBhc2ltY2FyZF9nZXRfcHVrKCBBU2ltQ2FyZCAgc2ltICk7CitleHRlcm4gdm9pZCAgICAgICAgIGFzaW1jYXJkX3NldF9waW4oIEFTaW1DYXJkICBzaW0sIGNvbnN0IGNoYXIqICBwaW4gKTsKK2V4dGVybiB2b2lkICAgICAgICAgYXNpbWNhcmRfc2V0X3B1ayggQVNpbUNhcmQgIHNpbSwgY29uc3QgY2hhciogIHB1ayApOworCitleHRlcm4gaW50ICAgICAgICAgYXNpbWNhcmRfY2hlY2tfcGluKCBBU2ltQ2FyZCAgc2ltLCBjb25zdCBjaGFyKiAgcGluICk7CitleHRlcm4gaW50ICAgICAgICAgYXNpbWNhcmRfY2hlY2tfcHVrKCBBU2ltQ2FyZCAgc2ltLCBjb25zdCBjaGFyKiAgcHVrLCBjb25zdCBjaGFyKiAgcGluICk7CisKKy8qIFJlc3RyaWN0ZWQgU0lNIEFjY2VzcyBjb21tYW5kLCBhcyBkZWZpbmVkIGJ5IDguMTggb2YgM0dQUCAyNy4wMDcgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQV9TSU1fQ01EX1JFQURfQklOQVJZID0gMTc2LAorICAgIEFfU0lNX0NNRF9SRUFEX1JFQ09SRCA9IDE3OCwKKyAgICBBX1NJTV9DTURfR0VUX1JFU1BPTlNFID0gMTkyLAorICAgIEFfU0lNX0NNRF9VUERBVEVfQklOQVJZID0gMjE0LAorICAgIEFfU0lNX0NNRF9VUERBVEVfUkVDT1JEID0gMjIwLAorICAgIEFfU0lNX0NNRF9TVEFUVVMgPSAyNDIKK30gQVNpbUNvbW1hbmQ7CisKK2V4dGVybiBjb25zdCBjaGFyKiAgYXNpbWNhcmRfaW8oIEFTaW1DYXJkICBzaW0sIGNvbnN0IGNoYXIqICBjbWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc21zLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3Ntcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWIyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3Ntcy5jCkBAIC0wLDAgKzEsMTY0OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdGVsZXBob255L3Ntcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9nc20uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RpbWV6b25lLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gRGVidWcgbG9ncy4KKyNkZWZpbmUgIEQoLi4uKSAgQU5EUk9JRF9URUxFUEhPTllfTE9HX09OKG1vZGVtLF9fVkFfQVJHU19fKQorCisvKiBtYXhpbXVtIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGEgU01TIGRhdGEgbWVzc2FnZSAqLworI2RlZmluZSAgTUFYX1VTRVJfREFUQV9CWVRFUyAgIDE0MAorCisvKiBtYXhpbXVtIG51bWJlciBvZiA3LWJpdCBzZXB0ZXRzIGluIGEgU01TIHRleHQgbWVzc2FnZSAqLworI2RlZmluZSAgTUFYX1VTRVJfREFUQV9TRVBURVRTICAxNjAKKworLyogc2l6ZSBvZiB0aGUgdXNlciBkYXRhIGhlYWRlciBpbiBieXRlcyAqLworI2RlZmluZSAgVVNFUl9EQVRBX0hFQURFUl9TSVpFICAgNgorCisvKiogTUVTU0FHRSBURVhUCisgKiovCitpbnQKK3Ntc191dGY4X2Zyb21fbWVzc2FnZV9zdHIoIGNvbnN0IGNoYXIqICBzdHIsIGludCAgc3RybGVuLCB1bnNpZ25lZCBjaGFyKiAgdXRmOCwgaW50ICB1dGY4bGVuICkKK3sKKyAgICBjYnl0ZXNfdCAgcCAgICAgICA9IChjYnl0ZXNfdClzdHI7CisgICAgY2J5dGVzX3QgIGVuZCAgICAgPSBwICsgc3RybGVuOworICAgIGludCAgICAgICBjb3VudCAgID0gMDsKKyAgICBpbnQgICAgICAgZXNjYXBlZCA9IDA7CisKKyAgICB3aGlsZSAocCA8IGVuZCkKKyAgICB7CisgICAgICAgIGludCAgYyA9IHBbMF07CisKKyAgICAgICAgLyogcmVhZCB0aGUgdmFsdWUgZnJvbSB0aGUgc3RyaW5nICovCisgICAgICAgIHAgKz0gMTsKKyAgICAgICAgaWYgKGMgPj0gMTI4KSB7CisgICAgICAgICAgICBpZiAoKGMgJiAweGUwKSA9PSAweGMwKQorICAgICAgICAgICAgICAgIGMgJj0gMHgxZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKChjICYgMHhmMCkgPT0gMHhlMCkKKyAgICAgICAgICAgICAgICBjICY9IDB4MGY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYyAmPSAweDA3OworCisgICAgICAgICAgICB3aGlsZSAocCA8IGVuZCAmJiAocFswXSAmIDB4YzApID09IDB4ODApIHsKKyAgICAgICAgICAgICAgICBjID0gKGMgPDwgNikgfCAocFswXSAmIDB4M2YpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXNjYXBlZCkgeworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICduJzogIC8qIFxuIGlzIGxpbmUgZmVlZCAqLworICAgICAgICAgICAgICAgICAgICBjID0gMTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAneCc6ICAvKiBceE5OLCB3aGVyZSBOTiBpcyBhIDItZGlnaXQgaGV4YWRlY2ltYWwgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHArMiA+IGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGdzbV9oZXgyX3RvX2J5dGUoIChjb25zdCBjaGFyKilwICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgJ3UnOiAgLyogXHVOTk5OIHdoZXJlIE5OTk4gaXMgYSA0LWRpZ2l0aSBoZXhhZGVjaW1hbCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAocCArIDQgPiBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGMgPSBnc21faGV4NF90b19zaG9ydCggKGNvbnN0IGNoYXIqKXAgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8qIGludmFsaWQgZXNjYXBlLCByZXR1cm4gLTEgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXNjYXBlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXFwnKQorICAgICAgICB7CisgICAgICAgICAgICBlc2NhcGVkID0gMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogbm93LCB0cnkgdG8gd3JpdGUgaXQgdG8gdGhlIGRlc3RpbmF0aW9uICovCisgICAgICAgIGlmIChjIDwgMTI4KSB7CisgICAgICAgICAgICBpZiAoY291bnQgPCB1dGY4bGVuKQorICAgICAgICAgICAgICAgIHV0ZjhbY291bnRdID0gKGJ5dGVfdCkgYzsKKyAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisgICAgICAgICAgICBpZiAoY291bnQgPCB1dGY4bGVuKQorICAgICAgICAgICAgICAgIHV0ZjhbY291bnRdICAgPSAoYnl0ZV90KSgweGMwIHwgKChjID4+IDYpICYgMHgxZikpOworICAgICAgICAgICAgaWYgKGNvdW50KzEgPCB1dGY4bGVuKQorICAgICAgICAgICAgICAgIHV0ZjhbY291bnQrMV0gPSAoYnl0ZV90KSgweDgwIHwgKGMgJiAweDNmKSk7CisgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGNvdW50IDwgdXRmOGxlbikKKyAgICAgICAgICAgICAgICB1dGY4W2NvdW50XSAgID0gKGJ5dGVfdCkoMHhjMCB8ICgoYyA+PiAxMikgJiAweGYpKTsKKyAgICAgICAgICAgIGlmIChjb3VudCsxIDwgdXRmOGxlbikKKyAgICAgICAgICAgICAgICB1dGY4W2NvdW50KzFdID0gKGJ5dGVfdCkoMHg4MCB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKyAgICAgICAgICAgIGlmIChjb3VudCsyIDwgdXRmOGxlbikKKyAgICAgICAgICAgICAgICB1dGY4W2NvdW50KzJdID0gKGJ5dGVfdCkoMHg4MCB8IChjICYgMHgzZikpOworICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlc2NhcGVkKSAgIC8qIGJhZCBmaW5hbCBlc2NhcGUgKi8KKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGNvdW50OworfQorCisvKiB0byBjb252ZXJ0IHV0Zi04IHRvIGEgbWVzc2FnZSBzdHJpbmcsIHdlIG9ubHkgbmVlZCB0byBkZWFsIHdpdGggY29udHJvbCBjaGFyYWN0ZXJzCisgKiBhbmQgdGhhdCdzIGl0ICovCitpbnQgIHNtc191dGY4X3RvX21lc3NhZ2Vfc3RyKCBjb25zdCB1bnNpZ25lZCBjaGFyKiAgdXRmOCwgaW50ICB1dGY4bGVuLCBjaGFyKiAgc3RyLCBpbnQgIHN0cmxlbiApCit7CisgICAgY2J5dGVzX3QgIHAgPSB1dGY4OworICAgIGNieXRlc190ICBlbmQgPSBwICsgdXRmOGxlbjsKKyAgICBpbnQgICAgICAgY291bnQgICA9IDA7CisKKyAgICB3aGlsZSAocCA8IGVuZCkKKyAgICB7CisgICAgICAgIGludCAgYyAgICAgID0gcFswXTsKKyAgICAgICAgaW50ICBlc2NhcGUgPSAwOworCisgICAgICAgIC8qIHJlYWQgdGhlIHZhbHVlIGZyb20gdGhlIHN0cmluZyAqLworICAgICAgICBwICs9IDE7CisgICAgICAgIGlmIChjID49IDEyOCkgeworICAgICAgICAgICAgaWYgKChjICYgMHhlMCkgPT0gMHhjMCkKKyAgICAgICAgICAgICAgICBjICY9IDB4MWY7CisgICAgICAgICAgICBlbHNlIGlmICgoYyAmIDB4ZjApID09IDB4ZTApCisgICAgICAgICAgICAgICAgYyAmPSAweDBmOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgJj0gMHgwNzsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHdoaWxlIChwIDwgZW5kICYmIChwWzBdICYgMHhjMCkgPT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGMgPSAoYyA8PCA2KSB8IChwWzBdICYgMHgzZik7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgPCAnICcpIHsKKyAgICAgICAgICAgIGVzY2FwZSA9IDE7CisgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYyAgICAgID0gJ24nOworICAgICAgICAgICAgICAgIGVzY2FwZSA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXFwnKQorICAgICAgICAgICAgZXNjYXBlID0gMjsKKworICAgICAgICBzd2l0Y2ggKGVzY2FwZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmIChjIDwgMTI4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IHN0cmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cltjb3VudF0gPSAoY2hhcikgYzsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA8IDB4ODAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IHN0cmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cltjb3VudF0gICA9IChieXRlX3QpKDB4YzAgfCAoKGMgPj4gNikgJiAweDFmKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCsxIDwgc3RybGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2NvdW50KzFdID0gKGJ5dGVfdCkoMHg4MCB8IChjICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgc3RybGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyW2NvdW50XSAgID0gKGJ5dGVfdCkoMHhjMCB8ICgoYyA+PiAxMikgJiAweGYpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50KzEgPCBzdHJsZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJbY291bnQrMV0gPSAoYnl0ZV90KSgweDgwIHwgKChjID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQrMiA8IHN0cmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cltjb3VudCsyXSA9IChieXRlX3QpKDB4ODAgfCAoYyAmIDB4M2YpKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoY291bnQrMyA8IHN0cmxlbikgeworICAgICAgICAgICAgICAgICAgICBzdHJbY291bnQrMF0gPSAnXFwnOworICAgICAgICAgICAgICAgICAgICBzdHJbY291bnQrMV0gPSAneCc7CisgICAgICAgICAgICAgICAgICAgIGdzbV9oZXhfZnJvbV9ieXRlKHN0ciArIGNvdW50ICsgMiwgYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGNvdW50KzIgPCBzdHJsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyW2NvdW50KzBdID0gJ1xcJzsKKyAgICAgICAgICAgICAgICAgICAgc3RyW2NvdW50KzFdID0gKGNoYXIpIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisKKy8qKiBUSU1FU1RBTVBTCisgKiovCit2b2lkCitzbXNfdGltZXN0YW1wX25vdyggU21zVGltZVN0YW1wICBzdGFtcCApCit7CisgICAgdGltZV90ICAgICBub3dfdGltZSA9IHRpbWUoTlVMTCk7CisgICAgc3RydWN0IHRtICBsb2NhbCAgICA9ICooYW5kcm9pZF9sb2NhbHRpbWUoJm5vd190aW1lKSk7CisgICAgaW50ICAgICAgICB0emRpZmYgICA9IGFuZHJvaWRfdHpvZmZzZXRfaW5fc2Vjb25kcygmbm93X3RpbWUpIC8gKDE1ICogNjApOyAvKnR6ZGlmZiBpcyBpbiBudW1iZXIgb2YgcXVhdGVyLWhvdXJzKi8KKworICAgIHN0YW1wLT5kYXRhWzBdID0gZ3NtX2ludF90b19iY2RpKCBsb2NhbC50bV95ZWFyICUgMTAwICk7CisgICAgc3RhbXAtPmRhdGFbMV0gPSBnc21faW50X3RvX2JjZGkoIGxvY2FsLnRtX21vbisxICk7CisgICAgc3RhbXAtPmRhdGFbMl0gPSBnc21faW50X3RvX2JjZGkoIGxvY2FsLnRtX21kYXkgKTsKKyAgICBzdGFtcC0+ZGF0YVszXSA9IGdzbV9pbnRfdG9fYmNkaSggbG9jYWwudG1faG91ciApOworICAgIHN0YW1wLT5kYXRhWzRdID0gZ3NtX2ludF90b19iY2RpKCBsb2NhbC50bV9taW4gKTsKKyAgICBzdGFtcC0+ZGF0YVs1XSA9IGdzbV9pbnRfdG9fYmNkaSggbG9jYWwudG1fc2VjICk7CisKKworICAgIHN0YW1wLT5kYXRhWzZdID0gZ3NtX2ludF90b19iY2RpKCB0emRpZmYgPj0gMCA/IHR6ZGlmZiA6IC10emRpZmYgKTsKKyAgICBpZiAodHpkaWZmIDwgMCkKKyAgICAgICAgc3RhbXAtPmRhdGFbNl0gfD0gMHgwODsKK30KKworaW50CitzbXNfdGltZXN0YW1wX3RvX3RtKCBTbXNUaW1lU3RhbXAgIHN0YW1wLCBzdHJ1Y3QgdG0qICB0bSApCit7CisgICAgaW50ICB0emRpZmY7CisKKyAgICB0bS0+dG1feWVhciA9IGdzbV9pbnRfZnJvbV9iY2RpKCBzdGFtcC0+ZGF0YVswXSApOworICAgIGlmICh0bS0+dG1feWVhciA8IDUwKQorICAgICAgICB0bS0+dG1feWVhciArPSAxMDA7CisgICAgdG0tPnRtX21vbiAgPSBnc21faW50X2Zyb21fYmNkaSggc3RhbXAtPmRhdGFbMV0gKSAtMTsKKyAgICB0bS0+dG1fbWRheSA9IGdzbV9pbnRfZnJvbV9iY2RpKCBzdGFtcC0+ZGF0YVsyXSApOworICAgIHRtLT50bV9ob3VyID0gZ3NtX2ludF9mcm9tX2JjZGkoIHN0YW1wLT5kYXRhWzNdICk7CisgICAgdG0tPnRtX21pbiAgPSBnc21faW50X2Zyb21fYmNkaSggc3RhbXAtPmRhdGFbNF0gKTsKKyAgICB0bS0+dG1fc2VjICA9IGdzbV9pbnRfZnJvbV9iY2RpKCBzdGFtcC0+ZGF0YVs1XSApOworCisgICAgdG0tPnRtX2lzZHN0ID0gLTE7CisKKyAgICB0emRpZmYgPSBnc21faW50X2Zyb21fYmNkaSggc3RhbXAtPmRhdGFbNl0gJiAweGY3ICk7CisgICAgaWYgKHN0YW1wLT5kYXRhWzZdICYgMHg4KQorICAgICAgICB0emRpZmYgPSAtdHpkaWZmOworCisgICAgcmV0dXJuIHR6ZGlmZjsKK30KKworc3RhdGljIHZvaWQKK2dzbV9yb3BlX2FkZF90aW1lc3RhbXAoIEdzbVJvcGUgIHJvcGUsIGNvbnN0IFNtc1RpbWVTdGFtcFJlYyogIHRzICkKK3sKKyAgICBnc21fcm9wZV9hZGQoIHJvcGUsIHRzLT5kYXRhLCA3ICk7Cit9CisKKworLyoqIFNNUyBBRERSRVNTRVMKKyAqKi8KKworaW50CitzbXNfYWRkcmVzc19mcm9tX3N0ciggU21zQWRkcmVzcyAgYWRkcmVzcywgY29uc3QgY2hhciogIHNyYywgaW50ICBzcmNsZW4gKQoreworICAgIGNvbnN0IGNoYXIqICBlbmQgICA9IHNyYyArIHNyY2xlbjsKKyAgICBpbnQgICAgICAgICAgc2hpZnQgPSAwLCBsZW4gPSAwOworICAgIGJ5dGVzX3QgICAgICBkYXRhID0gYWRkcmVzcy0+ZGF0YTsKKworICAgIGFkZHJlc3MtPmxlbiA9IDA7CisgICAgYWRkcmVzcy0+dG9hID0gMHg4MTsgLy8gVHlwZSBvZiBhZGRyZXNzOiBkb21lc3RpYworCisgICAgaWYgKHNyYyA+PSBlbmQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmICggc3JjWzBdID09ICcrJyApIHsKKyAgICAgICAgYWRkcmVzcy0+dG9hID0gMHg5MTsgLy8gVHlwZSBvZiBhZGRyZXNzOiBpbnRlcm5hdGlvbmFsCisgICAgICAgIGlmICgrK3NyYyA9PSBlbmQpCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgbWVtc2V0KCBhZGRyZXNzLT5kYXRhLCAwLCBzaXplb2YoYWRkcmVzcy0+ZGF0YSkgKTsKKworICAgIHNoaWZ0ID0gMDsKKworICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKKyAgICAgICAgaW50ICBjID0gKnNyYysrOworICAgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgICAgIGlmIChkYXRhID49IGFkZHJlc3MtPmRhdGEgKyBzaXplb2YoYWRkcmVzcy0+ZGF0YSkgKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgYyAtPSAnMCc7CisgICAgICAgICAgICBkYXRhWzBdIHw9IGMgPDwgc2hpZnQ7CisgICAgICAgICAgICBsZW4gICArPSAxOworICAgICAgICAgICAgc2hpZnQgKz0gNDsKKyAgICAgICAgICAgIGlmIChzaGlmdCA9PSA4KSB7CisgICAgICAgICAgICAgICAgc2hpZnQgPSAwOworICAgICAgICAgICAgICAgIGRhdGEgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBlbmRpZiAoMC4uOSkKKyAgICB9CisgICAgaWYgKHNoaWZ0ICE9IDApCisgICAgICAgIGRhdGFbMF0gfD0gMHhmMDsKKworICAgIGFkZHJlc3MtPmxlbiA9IGxlbjsKKyAgICByZXR1cm4gKGxlbiA+IDApID8gMCA6IC0xOworCitGYWlsOgorICAgIHJldHVybiAtMTsKK30KKworaW50CitzbXNfYWRkcmVzc190b19zdHIoIFNtc0FkZHJlc3MgYWRkcmVzcywgY2hhciogIHN0ciwgaW50ICBzdHJsZW4gKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICBkaWFsZGlnaXRzWzE2XSA9ICIwMTIzNDU2Nzg5KiMsTiUiOworICAgIGludCAgICAgICAgICAgICAgICBuLCBjb3VudCA9IDA7CisKKyAgICBpZiAoYWRkcmVzcy0+dG9hID09IDB4OTEpIHsKKyAgICAgICAgaWYgKGNvdW50IDwgc3RybGVuKQorICAgICAgICAgICAgc3RyW2NvdW50XSA9ICcrJzsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgZm9yIChuID0gMDsgbiA8IGFkZHJlc3MtPmxlbjsgbiArPSAyKQorICAgIHsKKyAgICAgICAgaW50ICAgYyA9IGFkZHJlc3MtPmRhdGFbbi8yXTsKKworICAgICAgICBpZiAoY291bnQgPCBzdHJsZW4pCisgICAgICAgICAgICBzdHJbY291bnRdID0gZGlhbGRpZ2l0c1tjICYgMHhmXTsKKyAgICAgICAgY291bnQgKz0gMTsKKworICAgICAgICBpZiAobisxID4gYWRkcmVzcy0+bGVuKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGNvdW50IDwgc3RybGVuKQorICAgICAgICAgICAgc3RyW2NvdW50XSA9IGRpYWxkaWdpdHNbKGMgPj4gNCkgJiAweGZdOworICAgICAgICBpZiAoc3RyW2NvdW50XSkKKyAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50CitzbXNfYWRkcmVzc19mcm9tX2J5dGVzKCBTbXNBZGRyZXNzICBhZGRyZXNzLCBjb25zdCB1bnNpZ25lZCBjaGFyKiAgYnVmLCBpbnQgIGJ1ZmxlbiApCit7CisgICAgaW50ICAgbGVuID0gc2l6ZW9mKGFkZHJlc3MtPmRhdGEpLCBudW1fZGlnaXRzOworCisgICAgaWYgKGJ1ZmxlbiA8IDIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGFkZHJlc3MtPmxlbiA9IG51bV9kaWdpdHMgPSBidWZbMF07CisgICAgYWRkcmVzcy0+dG9hID0gYnVmWzFdOworCisgICAgbGVuID0gKG51bV9kaWdpdHMrMSkvMjsKKyAgICBpZiAoIGxlbiA+IHNpemVvZihhZGRyZXNzLT5kYXRhKSApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG1lbWNweSggYWRkcmVzcy0+ZGF0YSwgYnVmKzIsIGxlbiApOworICAgIHJldHVybiAwOworfQorCitpbnQKK3Ntc19hZGRyZXNzX3RvX2J5dGVzKCBTbXNBZGRyZXNzICBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyKiAgYnVmLCBpbnQgIGJ1ZnNpemUgKQoreworICAgIGludCAgbGVuID0gKGFkZHJlc3MtPmxlbiArIDEpLzIgKyAyOworCisgICAgaWYgKGJ1ZiA9PSBOVUxMKQorICAgICAgICBidWZzaXplID0gMDsKKworICAgIGlmIChidWZzaXplIDwgMSkgZ290byBFeGl0OworICAgIGJ1ZlswXSA9IGFkZHJlc3MtPmxlbjsKKworICAgIGlmIChidWZzaXplIDwgMikgZ290byBFeGl0OworICAgIGJ1ZlsxXSA9IGFkZHJlc3MtPnRvYTsKKworICAgIGJ1ZiAgICAgKz0gMjsKKyAgICBidWZzaXplIC09IDI7CisgICAgaWYgKGJ1ZnNpemUgPiBsZW4tMikKKyAgICAgICAgYnVmc2l6ZSA9IGxlbiAtIDI7CisKKyAgICBtZW1jcHkoIGJ1ZiwgYWRkcmVzcy0+ZGF0YSwgYnVmc2l6ZSApOworRXhpdDoKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQKK3Ntc19hZGRyZXNzX2Zyb21faGV4ICAoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIGNvbnN0IGNoYXIqICBoZXgsIGludCAgaGV4bGVuICkKK3sKKyAgICBjb25zdCBjaGFyKiAgaGV4ZW5kID0gaGV4ICsgaGV4bGVuOworICAgIGludCAgICAgICAgICBubiwgbGVuLCBudW1fZGlnaXRzOworCisgICAgaWYgKGhleGxlbiA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGFkZHJlc3MtPmxlbiA9IG51bV9kaWdpdHMgPSBnc21faGV4Ml90b19ieXRlKCBoZXggKTsKKyAgICBhZGRyZXNzLT50b2EgPSBnc21faGV4Ml90b19ieXRlKCBoZXgrMiApOworICAgIGhleCArPSA0OworCisgICAgbGVuID0gKG51bV9kaWdpdHMgKyAxKS8yOworICAgIGlmIChoZXggKyBsZW4qMiA+IGhleGVuZCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yICggbm4gPSAwOyBubiA8IGxlbjsgbm4rKyApCisgICAgICAgIGFkZHJlc3MtPmRhdGFbbm5dID0gZ3NtX2hleDJfdG9fYnl0ZSggaGV4ICsgbm4qMiApOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorc21zX2FkZHJlc3NfdG9faGV4ICAgICggU21zQWRkcmVzcyAgYWRkcmVzcywgY2hhciogICBoZXgsIGludCAgaGV4bGVuICkKK3sKKyAgICBpbnQgIGxlbiA9IChhZGRyZXNzLT5sZW4gKyAxKS8yICsgMjsKKyAgICBpbnQgIG5uOworCisgICAgaWYgKGhleCA9PSBOVUxMKQorICAgICAgICBoZXhsZW4gPSAwOworCisgICAgaWYgKGhleGxlbiA8IDIpIGdvdG8gRXhpdDsKKyAgICBnc21faGV4X2Zyb21fYnl0ZSggaGV4LCBhZGRyZXNzLT5sZW4gKTsKKyAgICBpZiAoaGV4bGVuIDwgNCkgZ290byBFeGl0OworICAgIGdzbV9oZXhfZnJvbV9ieXRlKCBoZXgrMiwgYWRkcmVzcy0+dG9hICk7CisgICAgaGV4ICAgICs9IDQ7CisgICAgaGV4bGVuIC09IDQ7CisgICAgaWYgKCBoZXhsZW4gPiAyKihsZW4gLSAyKSApCisgICAgICAgIGhleGxlbiA9IChsZW4gLSAyKS8yOworCisgICAgZm9yICggbm4gPSAwOyBubiA8IGhleGxlbjsgbm4gKz0gMiApCisgICAgICAgIGdzbV9oZXhfZnJvbV9ieXRlKCBoZXgrbm4sIGFkZHJlc3MtPmRhdGFbbm4vMl0gKTsKKworRXhpdDoKKyAgICByZXR1cm4gbGVuKjI7Cit9CisKK3N0YXRpYyB2b2lkCitnc21fcm9wZV9hZGRfYWRkcmVzcyggR3NtUm9wZSAgcm9wZSwgY29uc3QgU21zQWRkcmVzc1JlYyogIGFkZHIgKQoreworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCBhZGRyLT5sZW4gKTsKKyAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgYWRkci0+dG9hICk7CisgICAgZ3NtX3JvcGVfYWRkKCByb3BlLCBhZGRyLT5kYXRhLCAoYWRkci0+bGVuKzEpLzIgKTsKKyAgICBpZiAoYWRkci0+bGVuICYgMSkgeworICAgICAgICBpZiAoIXJvcGUtPmVycm9yICYmIHJvcGUtPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgICAgIHJvcGUtPmRhdGFbIHJvcGUtPnBvcy0xIF0gfD0gMHhmMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3Ntc19hZGRyZXNzX2VxKCBjb25zdCBTbXNBZGRyZXNzUmVjKiAgYWRkcjEsIGNvbnN0IFNtc0FkZHJlc3NSZWMqICBhZGRyMiApCit7CisgICAgaWYgKCBhZGRyMS0+dG9hICE9IGFkZHIyLT50b2EgfHwKKyAgICAgICAgIGFkZHIxLT5sZW4gIT0gYWRkcjItPmxlbiApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuICggIW1lbWNtcCggYWRkcjEtPmRhdGEsIGFkZHIyLT5kYXRhLCBhZGRyMS0+bGVuICkgKTsKK30KKworLyoqIFNNUyBQQVJTRVIKKyAqKi8KK3N0YXRpYyBpbnQKK3Ntc19nZXRfYnl0ZSggY2J5dGVzX3QgICpwY3VyLCBjYnl0ZXNfdCAgZW5kICkKK3sKKyAgICBjYnl0ZXNfdCAgY3VyICAgID0gKnBjdXI7CisgICAgaW50ICAgICAgIHJlc3VsdCA9IC0xOworCisgICAgaWYgKGN1ciA8IGVuZCkgeworICAgICAgICByZXN1bHQgPSBjdXJbMF07CisgICAgICAgICpwY3VyICA9IGN1ciArIDE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHBhcnNlIGEgc2VydmljZSBjZW50ZXIgYWRkcmVzcywgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yICovCitzdGF0aWMgaW50CitzbXNfZ2V0X3NjX2FkZHJlc3MoIGNieXRlc190ICAgKnBjdXIsCisgICAgICAgICAgICAgICAgICAgIGNieXRlc190ICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgU21zQWRkcmVzcyAgYWRkcmVzcyApCit7CisgICAgY2J5dGVzX3QgIGN1ciAgICA9ICpwY3VyOworICAgIGludCAgICAgICByZXN1bHQgPSAtMTsKKworICAgIGlmIChjdXIgPCBlbmQpIHsKKyAgICAgICAgaW50ICBsZW4gPSBjdXJbMF07CisgICAgICAgIGludCAgZGxlbiwgYWRqdXN0ID0gMDsKKworICAgICAgICBjdXIgKz0gMTsKKworICAgICAgICBpZiAobGVuID09IDApIHsgICAvKiBlbXB0eSBhZGRyZXNzICovCisgICAgICAgICAgICBhZGRyZXNzLT5sZW4gPSAwOworICAgICAgICAgICAgYWRkcmVzcy0+dG9hID0gMHgwMDsKKyAgICAgICAgICAgIHJlc3VsdCAgICAgICA9IDA7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyICsgbGVuID4gZW5kKSB7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBhZGRyZXNzLT50b2EgPSAqY3VyKys7CisgICAgICAgIGxlbiAgICAgICAgIC09IDE7CisgICAgICAgIHJlc3VsdCAgICAgICA9IDA7CisKKyAgICAgICAgZm9yIChkbGVuID0gMDsgZGxlbiA8IGxlbjsgZGxlbis9MSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICBjID0gY3VyW2RsZW5dOworICAgICAgICAgICAgaW50ICB2OworCisgICAgICAgICAgICBhZGp1c3QgPSAwOworICAgICAgICAgICAgaWYgKGRsZW4gPj0gc2l6ZW9mKGFkZHJlc3MtPmRhdGEpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHYgPSAoYyAmIDB4Zik7CisgICAgICAgICAgICBpZiAodiA+PSAweGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGFkanVzdCAgICAgICAgICAgICAgPSAxOworICAgICAgICAgICAgYWRkcmVzcy0+ZGF0YVtkbGVuXSA9IChieXRlX3QpIGM7CisKKyAgICAgICAgICAgIHYgPSAoYyA+PiA0KSAmIDB4ZjsKKyAgICAgICAgICAgIGlmICh2ID49IDB4ZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZHJlc3MtPmxlbiA9IDIqZGxlbiArIGFkanVzdDsKKyAgICB9CitFeGl0OgorICAgIGlmICghcmVzdWx0KQorICAgICAgICAqcGN1ciA9IGN1cjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3Ntc19za2lwX3NjX2FkZHJlc3MoIGNieXRlc190ICAgKnBjdXIsCisgICAgICAgICAgICAgICAgICAgICBjYnl0ZXNfdCAgICBlbmQgKQoreworICAgIGNieXRlc190ICBjdXIgICAgPSAqcGN1cjsKKyAgICBpbnQgICAgICAgcmVzdWx0ID0gLTE7CisgICAgaW50ICAgICAgIGxlbjsKKworICAgIGlmIChjdXIgPj0gZW5kKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICBsZW4gID0gY3VyWzBdOworICAgIGN1ciArPSAxICsgbGVuOworICAgIGlmIChjdXIgPiBlbmQpCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICpwY3VyICA9IGN1cjsKKyAgICByZXN1bHQgPSAwOworRXhpdDoKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBwYXJzZSBhIHNlbmRlci9yZWNlaXZlciBhZGRyZXNzLCByZXR1cm5zIC0xIGluIGNhc2Ugb2YgZXJyb3IgKi8KK3N0YXRpYyBpbnQKK3Ntc19nZXRfYWRkcmVzcyggY2J5dGVzX3QgICAqcGN1ciwKKyAgICAgICAgICAgICAgICAgY2J5dGVzX3QgICAgZW5kLAorICAgICAgICAgICAgICAgICBTbXNBZGRyZXNzICBhZGRyZXNzICkKK3sKKyAgICBjYnl0ZXNfdCAgY3VyICAgID0gKnBjdXI7CisgICAgaW50ICAgICAgIHJlc3VsdCA9IC0xOworICAgIGludCAgICAgICBsZW4sIGRsZW47CisKKyAgICBpZiAoY3VyID49IGVuZCkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgZGxlbiA9ICpjdXIrKzsKKworICAgIGlmIChkbGVuID09IDApIHsKKyAgICAgICAgYWRkcmVzcy0+bGVuID0gMDsKKyAgICAgICAgYWRkcmVzcy0+dG9hID0gMDsKKyAgICAgICAgcmVzdWx0ICAgICAgID0gMDsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmIChjdXIgKyAxICsgKGRsZW4rMSkvMiA+IGVuZCkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgYWRkcmVzcy0+bGVuID0gZGxlbjsKKyAgICBhZGRyZXNzLT50b2EgPSAqY3VyKys7CisKKyAgICBsZW4gPSAoZGxlbiArIDEpLzI7CisgICAgaWYgKGxlbiA+IHNpemVvZihhZGRyZXNzLT5kYXRhKSkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgbWVtY3B5KCBhZGRyZXNzLT5kYXRhLCBjdXIsIGxlbiApOworICAgIGN1ciAgICs9IGxlbjsKKyAgICByZXN1bHQgPSAwOworCitFeGl0OgorICAgIGlmICghcmVzdWx0KQorICAgICAgICAqcGN1ciA9IGN1cjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3Ntc19za2lwX2FkZHJlc3MoIGNieXRlc190ICAgKnBjdXIsCisgICAgICAgICAgICAgICAgICBjYnl0ZXNfdCAgICBlbmQgICkKK3sKKyAgICBjYnl0ZXNfdCAgY3VyICAgID0gKnBjdXI7CisgICAgaW50ICAgICAgIHJlc3VsdCA9IC0xOworICAgIGludCAgICAgICBkbGVuOworCisgICAgaWYgKGN1ciArIDIgPiBlbmQpCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgIGRsZW4gPSBjdXJbMF07CisgICAgY3VyICs9IDIgKyAoZGxlbiArIDEpLzI7CisgICAgaWYgKGN1ciA+IGVuZCkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgcmVzdWx0ID0gMDsKK0V4aXQ6CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogcGFyc2UgYSBzZXJ2aWNlIGNlbnRlciB0aW1lc3RhbXAgKi8KK3N0YXRpYyBpbnQKK3Ntc19nZXRfdGltZXN0YW1wKCBjYnl0ZXNfdCAgICAgKnBjdXIsCisgICAgICAgICAgICAgICAgICAgY2J5dGVzX3QgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgU21zVGltZVN0YW1wICB0cyApCit7CisgICAgY2J5dGVzX3QgIGN1ciA9ICpwY3VyOworCisgICAgaWYgKGN1ciArIDcgPiBlbmQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG1lbWNweSggdHMtPmRhdGEsIGN1ciwgNyApOworICAgICpwY3VyID0gY3VyICsgNzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc21zX3NraXBfdGltZXN0YW1wKCBjYnl0ZXNfdCAgKnBjdXIsCisgICAgICAgICAgICAgICAgICAgIGNieXRlc190ICAgZW5kICkKK3sKKyAgICBjYnl0ZXNfdCAgY3VyID0gKnBjdXI7CisKKyAgICBpZiAoY3VyICsgNyA+IGVuZCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgKnBjdXIgPSBjdXIgKyA3OworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3Ntc19za2lwX3ZhbGlkaXR5X3BlcmlvZCggY2J5dGVzX3QgICpwY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYnl0ZXNfdCAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICBtdGlCeXRlICkKK3sKKyAgICBjYnl0ZXNfdCAgY3VyID0gKnBjdXI7CisKKyAgICBzd2l0Y2ggKChtdGlCeXRlID4+IDMpICYgMykgeworICAgICAgICBjYXNlIDE6ICAvKiByZWxhdGl2ZSBmb3JtYXQgKi8KKyAgICAgICAgICAgIGN1ciArPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOiAgLyogZW5oYW5jZWQgZm9ybWF0ICovCisgICAgICAgIGNhc2UgMzogIC8qIGFic29sdXRlIGZvcm1hdCAqLworICAgICAgICAgICAgY3VyICs9IDc7CisgICAgfQorICAgIGlmIChjdXIgPiBlbmQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICpwY3VyID0gY3VyOworICAgIHJldHVybiAwOworfQorCisvKiogU01TIFBEVQorICoqLworCit0eXBlZGVmIHN0cnVjdCBTbXNQRFVSZWMgeworICAgIGJ5dGVzX3QgIGJhc2U7CisgICAgYnl0ZXNfdCAgZW5kOworICAgIGJ5dGVzX3QgIHRwZHU7Cit9IFNtc1BEVVJlYzsKKwordm9pZAorc21zcGR1X2ZyZWUoIFNtc1BEVSAgcGR1ICkKK3sKKyAgICBpZiAocGR1KSB7CisgICAgICAgIGZyZWUoIHBkdS0+YmFzZSApOworICAgICAgICBwZHUtPmJhc2UgPSBOVUxMOworICAgICAgICBwZHUtPmVuZCAgPSBOVUxMOworICAgICAgICBwZHUtPnRwZHUgPSBOVUxMOworICAgIH0KK30KKworU21zUGR1VHlwZQorc21zcGR1X2dldF90eXBlKCBTbXNQRFUgIHBkdSApCit7CisgICAgY2J5dGVzX3QgIGRhdGEgICAgPSBwZHUtPnRwZHU7CisgICAgY2J5dGVzX3QgIGVuZCAgICAgPSBwZHUtPmVuZDsKKyAgICBpbnQgICAgICAgbXRpQnl0ZSA9IHNtc19nZXRfYnl0ZSgmZGF0YSwgZW5kKTsKKworICAgIHN3aXRjaCAobXRpQnl0ZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOiAgcmV0dXJuIFNNU19QRFVfREVMSVZFUjsKKyAgICAgICAgY2FzZSAxOiAgcmV0dXJuIFNNU19QRFVfU1VCTUlUOworICAgICAgICBjYXNlIDI6ICByZXR1cm4gU01TX1BEVV9TVEFUVVNfUkVQT1JUOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gU01TX1BEVV9JTlZBTElEOworICAgIH0KK30KKworaW50CitzbXNwZHVfZ2V0X3NlbmRlcl9hZGRyZXNzKCBTbXNQRFUgIHBkdSwgU21zQWRkcmVzcyAgYWRkcmVzcyApCit7CisgICAgY2J5dGVzX3QgIGRhdGEgICAgPSBwZHUtPnRwZHU7CisgICAgY2J5dGVzX3QgIGVuZCAgICAgPSBwZHUtPmVuZDsKKyAgICBpbnQgICAgICAgbXRpQnl0ZSA9IHNtc19nZXRfYnl0ZSgmZGF0YSwgZW5kKTsKKworICAgIHN3aXRjaCAobXRpQnl0ZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOiAvKiBTTVNfUERVX0RFTElWRVI7ICovCisgICAgICAgICAgICByZXR1cm4gc21zX2dldF9zY19hZGRyZXNzKCAmZGF0YSwgZW5kLCBhZGRyZXNzICk7CisKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOworICAgIH0KK30KKworaW50CitzbXNwZHVfZ2V0X3NjX3RpbWVzdGFtcCggU21zUERVICBwZHUsIFNtc1RpbWVTdGFtcCAgdHMgKQoreworICAgIGNieXRlc190ICBkYXRhICAgID0gcGR1LT50cGR1OworICAgIGNieXRlc190ICBlbmQgICAgID0gcGR1LT5lbmQ7CisgICAgaW50ICAgICAgIG10aUJ5dGUgPSBzbXNfZ2V0X2J5dGUoICZkYXRhLCBlbmQgKTsKKworICAgIHN3aXRjaCAobXRpQnl0ZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOiAgLyogU01TX1BEVV9ERUxJVkVSICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU21zQWRkcmVzc1JlYyAgYWRkcmVzczsKKworICAgICAgICAgICAgICAgIGlmICggc21zX2dldF9zY19hZGRyZXNzKCAmZGF0YSwgZW5kLCAmYWRkcmVzcyApIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgICAgIGRhdGEgKz0gMjsgIC8qIHNraXAgcHJvdG9jb2wgaWRlbnRpZmVyICsgY29kaW5nIHNjaGVtZSAqLworCisgICAgICAgICAgICAgICAgcmV0dXJuIHNtc19nZXRfdGltZXN0YW1wKCAmZGF0YSwgZW5kLCB0cyApOworICAgICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludAorc21zcGR1X2dldF9yZWNlaXZlcl9hZGRyZXNzKCBTbXNQRFUgIHBkdSwgU21zQWRkcmVzcyAgYWRkcmVzcyApCit7CisgICAgY2J5dGVzX3QgIGRhdGEgICAgPSBwZHUtPnRwZHU7CisgICAgY2J5dGVzX3QgIGVuZCAgICAgPSBwZHUtPmVuZDsKKyAgICBpbnQgICAgICAgbXRpQnl0ZSA9IHNtc19nZXRfYnl0ZSggJmRhdGEsIGVuZCApOworCisgICAgc3dpdGNoIChtdGlCeXRlICYgMykgeworICAgICAgICBjYXNlIDE6ICAvKiBTTVNfUERVX1NVQk1JVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEgKz0gMTsgIC8qIHNraXAgbWVzc2FnZSByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gc21zX2dldF9hZGRyZXNzKCAmZGF0YSwgZW5kLCBhZGRyZXNzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIC0xOworICAgIH0KK30KKwordHlwZWRlZiBlbnVtIHsKKyAgICBTTVNfQ09ESU5HX1NDSEVNRV9VTktOT1dOID0gMCwKKyAgICBTTVNfQ09ESU5HX1NDSEVNRV9HU003LAorICAgIFNNU19DT0RJTkdfU0NIRU1FX1VDUzIKKworfSBTbXNDb2RpbmdTY2hlbWU7CisKKy8qIHNlZSBUUyAyMy4wMzggU2VjdGlvbiA1IGZvciBkZXRhaWxzICovCitzdGF0aWMgU21zQ29kaW5nU2NoZW1lCitzbXNfZ2V0X2NvZGluZ19zY2hlbWUoIGNieXRlc190ICAqcGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY2J5dGVzX3QgICBlbmQgKQoreworICAgIGNieXRlc190ICBjdXIgPSAqcGN1cjsKKyAgICBpbnQgICAgICAgZGF0YUNvZGluZzsKKworICAgIGlmIChjdXIgPj0gZW5kKQorICAgICAgICByZXR1cm4gU01TX0NPRElOR19TQ0hFTUVfVU5LTk9XTjsKKworICAgIGRhdGFDb2RpbmcgPSAqY3VyKys7CisgICAgKnBjdXIgICAgICA9IGN1cjsKKworICAgIHN3aXRjaCAoZGF0YUNvZGluZyA+PiA0KSB7CisgICAgICAgIGNhc2UgMHgwMDoKKyAgICAgICAgY2FzZSAweDAyOgorICAgICAgICBjYXNlIDB4MDM6CisgICAgICAgICAgICByZXR1cm4gU01TX0NPRElOR19TQ0hFTUVfR1NNNzsKKworICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICBpZiAoZGF0YUNvZGluZyA9PSAweDEwKSByZXR1cm4gU01TX0NPRElOR19TQ0hFTUVfR1NNNzsKKyAgICAgICAgICAgIGlmIChkYXRhQ29kaW5nID09IDB4MTEpIHJldHVybiBTTVNfQ09ESU5HX1NDSEVNRV9VQ1MyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDA0OiBjYXNlIDB4MDU6IGNhc2UgMHgwNjogY2FzZSAweDA3OgorICAgICAgICAgICAgaWYgKGRhdGFDb2RpbmcgJiAweDIwKSAgICAgICAgICAgcmV0dXJuIFNNU19DT0RJTkdfU0NIRU1FX1VOS05PV047IC8qIGNvbXByZXNzZWQgNy1iaXRzICovCisgICAgICAgICAgICBpZiAoKChkYXRhQ29kaW5nID4+IDIpICYgMykgPT0gMCkgcmV0dXJuIFNNU19DT0RJTkdfU0NIRU1FX0dTTTc7CisgICAgICAgICAgICBpZiAoKChkYXRhQ29kaW5nID4+IDIpICYgMykgPT0gMikgcmV0dXJuIFNNU19DT0RJTkdfU0NIRU1FX1VDUzI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4RjoKKyAgICAgICAgICAgIGlmICghKGRhdGFDb2RpbmcgJiA0KSkgcmV0dXJuIFNNU19DT0RJTkdfU0NIRU1FX0dTTTc7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFNNU19DT0RJTkdfU0NIRU1FX1VOS05PV047Cit9CisKKworLyogc2VlIFRTIDIzLjA0MCBzZWN0aW9uIDkuMi4zLjI0IGZvciBkZXRhaWxzICovCitzdGF0aWMgaW50CitzbXNfZ2V0X3RleHRfdXRmOCggY2J5dGVzX3QgICAgICAgICpwY3VyLAorICAgICAgICAgICAgICAgICAgIGNieXRlc190ICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgaGFzVURILAorICAgICAgICAgICAgICAgICAgIFNtc0NvZGluZ1NjaGVtZSAgY29kaW5nLAorICAgICAgICAgICAgICAgICAgIEdzbVJvcGUgICAgICAgICAgcm9wZSApCit7CisgICAgY2J5dGVzX3QgIGN1ciAgICA9ICpwY3VyOworICAgIGludCAgICAgICByZXN1bHQgPSAtMTsKKyAgICBpbnQgICAgICAgbGVuOworCisgICAgaWYgKGN1ciA+PSBlbmQpCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgIGxlbiA9ICpjdXIrKzsKKworICAgIC8qIHNraXAgdXNlciBkYXRhIGhlYWRlciBpZiBhbnkgKi8KKyAgICBpZiAoIGhhc1VESCApCisgICAgeworICAgICAgICBpbnQgIGhsZW47CisKKyAgICAgICAgaWYgKGN1ciA+PSBlbmQpCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgaGxlbiA9ICpjdXIrKzsKKyAgICAgICAgaWYgKGN1ciArIGhsZW4gPiBlbmQpCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICAgY3VyICs9IGhsZW47CisKKyAgICAgICAgaWYgKGNvZGluZyA9PSBTTVNfQ09ESU5HX1NDSEVNRV9HU003KQorICAgICAgICAgICAgbGVuIC09IDIqKGhsZW4rMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbiAtPSBobGVuKzE7CisKKyAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogc3dpdGNoIHRoZSB1c2VyIGRhdGEgaGVhZGVyIGlmIGFueSAqLworICAgIGlmIChjb2RpbmcgPT0gU01TX0NPRElOR19TQ0hFTUVfR1NNNykKKyAgICB7CisgICAgICAgIGludCAgY291bnQgPSB1dGY4X2Zyb21fZ3NtNyggY3VyLCAwLCBsZW4sIE5VTEwgKTsKKworICAgICAgICBpZiAocm9wZSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlc190ICBkc3QgPSBnc21fcm9wZV9yZXNlcnZlKCByb3BlLCBjb3VudCApOworICAgICAgICAgICAgaWYgKGRzdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHV0ZjhfZnJvbV9nc203KCBjdXIsIDAsIGxlbiwgZHN0ICk7CisgICAgICAgIH0KKyAgICAgICAgY3VyICs9IChsZW4rMSkvMjsKKyAgICB9CisgICAgZWxzZSBpZiAoY29kaW5nID09IFNNU19DT0RJTkdfU0NIRU1FX1VDUzIpCisgICAgeworICAgICAgICBpbnQgIGNvdW50ID0gdWNzMl90b191dGY4KCBjdXIsIGxlbi8yLCBOVUxMICk7CisKKyAgICAgICAgaWYgKHJvcGUgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZXNfdCAgZHN0ID0gZ3NtX3JvcGVfcmVzZXJ2ZSggcm9wZSwgY291bnQgKTsKKyAgICAgICAgICAgIGlmIChkc3QgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB1Y3MyX3RvX3V0ZjgoIGN1ciwgbGVuLzIsIGRzdCApOworICAgICAgICB9CisgICAgICAgIGN1ciArPSBsZW47CisgICAgfQorICAgIHJlc3VsdCA9IDA7CisKK0V4aXQ6CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICpwY3VyID0gY3VyOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogZ2V0IHRoZSBtZXNzYWdlIGVtYmVkZGVkIGluIGEgU01TIFBEVSBhcyBhIHV0ZjggYnl0ZSBhcnJheSwgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGluIGJ5dGVzICovCisvKiBvciAtMSBpbiBjYXNlIG9mIGVycm9yICovCitpbnQKK3Ntc3BkdV9nZXRfdGV4dF9tZXNzYWdlKCBTbXNQRFUgIHBkdSwgdW5zaWduZWQgY2hhciogIHV0ZjgsIGludCAgdXRmOGxlbiApCit7CisgICAgY2J5dGVzX3QgIGRhdGEgICAgPSBwZHUtPnRwZHU7CisgICAgY2J5dGVzX3QgIGVuZCAgICAgPSBwZHUtPmVuZDsKKyAgICBpbnQgICAgICAgbXRpQnl0ZSA9IHNtc19nZXRfYnl0ZSggJmRhdGEsIGVuZCApOworCisgICAgc3dpdGNoIChtdGlCeXRlICYgMykgeworICAgICAgICBjYXNlIDA6ICAvKiBTTVNfUERVX0RFTElWRVIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTbXNBZGRyZXNzUmVjICAgIGFkZHJlc3M7CisgICAgICAgICAgICAgICAgU21zVGltZVN0YW1wUmVjICB0aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgU21zQ29kaW5nU2NoZW1lICBjb2Rpbmc7CisgICAgICAgICAgICAgICAgR3NtUm9wZVJlYyAgICAgICByb3BlWzFdOworICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgcmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKCBzbXNfZ2V0X3NjX2FkZHJlc3MoICZkYXRhLCBlbmQsICZhZGRyZXNzICkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICAgICAgICAgZGF0YSAgKz0gMTsgIC8qIHNraXAgcHJvdG9jb2wgaWRlbnRpZmllciAqLworICAgICAgICAgICAgICAgIGNvZGluZyA9IHNtc19nZXRfY29kaW5nX3NjaGVtZSggJmRhdGEsIGVuZCApOworICAgICAgICAgICAgICAgIGlmIChjb2RpbmcgPT0gU01TX0NPRElOR19TQ0hFTUVfVU5LTk9XTikKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICAgICAgICAgaWYgKCBzbXNfZ2V0X3RpbWVzdGFtcCggJmRhdGEsIGVuZCwgJnRpbWVzdGFtcCApIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgICAgIGlmICggc21zX2dldF90ZXh0X3V0ZjgoICZkYXRhLCBlbmQsIChtdGlCeXRlICYgMHg0MCksIGNvZGluZywgcm9wZSApIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJvcGUtPnBvczsKKyAgICAgICAgICAgICAgICBpZiAodXRmOGxlbiA+IHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdXRmOGxlbiA9IHJlc3VsdDsKKworICAgICAgICAgICAgICAgIGlmICh1dGY4bGVuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCB1dGY4LCByb3BlLT5kYXRhLCB1dGY4bGVuICk7CisKKyAgICAgICAgICAgICAgICBnc21fcm9wZV9kb25lKCByb3BlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjYXNlIDE6ICAvKiBTTVNfUERVX1NVQk1JVCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNtc0FkZHJlc3NSZWMgICAgYWRkcmVzczsKKyAgICAgICAgICAgICAgICBTbXNDb2RpbmdTY2hlbWUgIGNvZGluZzsKKyAgICAgICAgICAgICAgICBHc21Sb3BlUmVjICAgICAgIHJvcGVbMV07CisgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICByZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBkYXRhICs9IDE7ICAvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCisgICAgICAgICAgICAgICAgaWYgKCBzbXNfZ2V0X2FkZHJlc3MoICZkYXRhLCBlbmQsICZhZGRyZXNzICkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICAgICAgICAgZGF0YSAgKz0gMTsgIC8qIHNraXAgcHJvdG9jb2wgaWRlbnRpZmllciAqLworICAgICAgICAgICAgICAgIGNvZGluZyA9IHNtc19nZXRfY29kaW5nX3NjaGVtZSggJmRhdGEsIGVuZCApOworICAgICAgICAgICAgICAgIGlmIChjb2RpbmcgPT0gU01TX0NPRElOR19TQ0hFTUVfVU5LTk9XTikKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgICAgICAgICAgZ3NtX3JvcGVfaW5pdF9hbGxvYyggcm9wZSwgMCApOworICAgICAgICAgICAgICAgIGlmICggc21zX2dldF90ZXh0X3V0ZjgoICZkYXRhLCBlbmQsIChtdGlCeXRlICYgMHg0MCksIGNvZGluZywgcm9wZSApIDwgMCApIHsKKyAgICAgICAgICAgICAgICAgICAgZ3NtX3JvcGVfZG9uZSggcm9wZSApOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcm9wZS0+cG9zOworICAgICAgICAgICAgICAgIGlmICh1dGY4bGVuID4gcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICB1dGY4bGVuID0gcmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKHV0ZjhsZW4gPiAwKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHV0ZjgsIHJvcGUtPmRhdGEsIHV0ZjhsZW4gKTsKKworICAgICAgICAgICAgICAgIGdzbV9yb3BlX2RvbmUoIHJvcGUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgIH0KK0ZhaWw6CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgY2J5dGVzX3QKK3Ntc3BkdV9nZXRfdXNlcl9kYXRhX3JlZiggU21zUERVICBwZHUgKQoreworICAgIGNieXRlc190ICBkYXRhICAgID0gcGR1LT50cGR1OworICAgIGNieXRlc190ICBlbmQgICAgID0gcGR1LT5lbmQ7CisgICAgaW50ICAgICAgIG10aUJ5dGUgPSBzbXNfZ2V0X2J5dGUoICZkYXRhLCBlbmQgKTsKKyAgICBpbnQgICAgICAgbGVuOworCisgICAgLyogaWYgdGhlcmUgaXMgbm8gdXNlci1kYXRhLWhlYWRlciwgdGhlcmUgaXMgbm8gbWVzc2FnZSByZWZlcmVuY2UgaGVyZSAqLworICAgIGlmICgobXRpQnl0ZSAmIDB4NDApID09IDApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIHN3aXRjaCAobXRpQnl0ZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOiAgLyogU01TX1BEVV9ERUxJVkVSICovCisgICAgICAgICAgICBpZiAoIHNtc19za2lwX2FkZHJlc3MoICZkYXRhLCBlbmQgKSA8IDAgKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgZGF0YSAgKz0gMjsgIC8qIHNraXAgcHJvdG9jb2wgaWRlbnRpZmllciArIGNvZGluZyBzY2hlbWUgKi8KKworICAgICAgICAgICAgaWYgKCBzbXNfc2tpcF90aW1lc3RhbXAoICZkYXRhLCBlbmQgKSA8IDAgKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxOiAgLyogU01TX1BEVV9TVUJNSVQgKi8KKyAgICAgICAgICAgIGRhdGEgKz0gMTsgIC8qIHNraXAgbWVzc2FnZSByZWZlcmVuY2UgKi8KKworICAgICAgICAgICAgaWYgKCBzbXNfc2tpcF9hZGRyZXNzKCAmZGF0YSwgZW5kICkgPCAwICkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgICAgIGRhdGEgKz0gMjsgIC8qIHByb3RvY29sIGlkZW50aWZpZXIgKyBvZGluZyBzY2hlbmUgKi8KKyAgICAgICAgICAgIGlmICggc21zX3NraXBfdmFsaWRpdHlfcGVyaW9kKCAmZGF0YSwgZW5kLCBtdGlCeXRlICkgPCAwICkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgLyogc2tpcCB1c2VyLWRhdGEgbGVuZ3RoICovCisgICAgaWYgKGRhdGErMSA+PSBlbmQpCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIGxlbiAgID0gZGF0YVsxXTsKKyAgICBkYXRhICs9IDI7CisKKyAgICB3aGlsZSAobGVuID49IDIgJiYgZGF0YSArIDIgPD0gZW5kKSB7CisgICAgICAgIGludCAgaHR5cGUgPSBkYXRhWzBdOworICAgICAgICBpbnQgIGhsZW4gPSBkYXRhWzFdOworCisgICAgICAgIGlmIChodHlwZSA9PSAwMCAmJiBobGVuID09IDMgJiYgZGF0YSArIDUgPD0gZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YSArIDI7CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGhsZW47CisgICAgICAgIGxlbiAgLT0gaGxlbiAtIDI7CisgICAgfQorRmFpbDoKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50CitzbXNwZHVfZ2V0X3JlZiggU21zUERVICBwZHUgKQoreworICAgIGNieXRlc190ICB1c2VyX3JlZiA9IHNtc3BkdV9nZXRfdXNlcl9kYXRhX3JlZiggcGR1ICk7CisKKyAgICBpZiAodXNlcl9yZWYgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiB1c2VyX3JlZlswXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2J5dGVzX3QgIGRhdGEgICAgPSBwZHUtPnRwZHU7CisgICAgICAgIGNieXRlc190ICBlbmQgICAgID0gcGR1LT5lbmQ7CisgICAgICAgIGludCAgICAgICBtdGlCeXRlID0gc21zX2dldF9ieXRlKCAmZGF0YSwgZW5kICk7CisKKyAgICAgICAgaWYgKChtdGlCeXRlICYgMykgPT0gMSkgeworICAgICAgICAgICAgLyogdHJ5IHRvIGV4dHJhY3QgZGlyZWN0bHkgdGhlIHJlZmVyZW5jZSBmb3IgYSBTTVMtU1VCTUlUICovCisgICAgICAgICAgICBpZiAoZGF0YSA8IGVuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVswXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK2ludAorc21zcGR1X2dldF9tYXhfaW5kZXgoIFNtc1BEVSAgcGR1ICkKK3sKKyAgICBjYnl0ZXNfdCAgdXNlcl9yZWYgPSBzbXNwZHVfZ2V0X3VzZXJfZGF0YV9yZWYoIHBkdSApOworCisgICAgaWYgKHVzZXJfcmVmICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHVzZXJfcmVmWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworaW50CitzbXNwZHVfZ2V0X2N1cl9pbmRleCggU21zUERVICBwZHUgKQoreworICAgIGNieXRlc190ICB1c2VyX3JlZiA9IHNtc3BkdV9nZXRfdXNlcl9kYXRhX3JlZiggcGR1ICk7CisKKyAgICBpZiAodXNlcl9yZWYgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdXNlcl9yZWZbMl0gLSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAorZ3NtX3JvcGVfYWRkX3Ntc191c2VyX2hlYWRlciggR3NtUm9wZSAgcm9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgIHJlZl9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBwZHVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICBwZHVfaW5kZXggKQoreworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCAweDA1ICk7ICAgICAvKiB0b3RhbCBoZWFkZXIgbGVuZ3RoID09IDUgYnl0ZXMgKi8KKyAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgMHgwMCApOyAgICAgLyogZWxlbWVudCBpZDogY29uY2F0ZW5hdGVkIG1lc3NhZ2UgcmVmZXJlbmNlIG51bWJlciAqLworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCAweDAzICk7ICAgICAvKiBlbGVtZW50IGxlbjogMyBieXRlcyAqLworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCAoYnl0ZV90KXJlZl9udW1iZXIgKTsgIC8qIHJlZmVyZW5jZSBudW1iZXIgKi8KKyAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgKGJ5dGVfdClwZHVfY291bnQgKTsgICAgIC8qIG1heCBwZHUgaW5kZXggKi8KKyAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgKGJ5dGVfdClwZHVfaW5kZXgrMSApOyAgIC8qIGN1cnJlbnQgcGR1IGluZGV4ICovCit9CisKKy8qIHdyaXRlIGEgU01TLURFTElWRVIgUERVIGludG8gYSByb3BlICovCitzdGF0aWMgdm9pZAorZ3NtX3JvcGVfYWRkX3Ntc19kZWxpdmVyX3BkdSggR3NtUm9wZSAgICAgICAgICAgICAgICAgcm9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNieXRlc190ICAgICAgICAgICAgICAgIHV0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICB1dGY4bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgdXNlX2dzbTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbXNBZGRyZXNzUmVjKiAgICBzZW5kZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtc1RpbWVTdGFtcFJlYyogIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlZl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBwZHVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBwZHVfaW5kZXgpCit7CisgICAgaW50ICBjb2Rpbmc7CisgICAgaW50ICBtdGlCeXRlICA9IDB4MjA7ICAvKiBtZXNzYWdlIHR5cGUgLSBTTVMgREVMSVZFUiAqLworCisgICAgaWYgKHBkdV9jb3VudCA+IDEpCisgICAgICAgIG10aUJ5dGUgfD0gMHg0MDsgIC8qIHVzZXIgZGF0YSBoZWFkZXIgaW5kaWNhdG9yICovCisKKyAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgMCApOyAgICAgICAgLyogbm8gU0MgQWRkcmVzcyAqLworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCBtdGlCeXRlICk7ICAgICAvKiBtZXNzYWdlIHR5cGUgLSBTTVMtREVMSVZFUiAqLworICAgIGdzbV9yb3BlX2FkZF9hZGRyZXNzKCByb3BlLCBzZW5kZXJfYWRkcmVzcyApOworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCAwICk7ICAgICAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCisKKyAgICAvKiBkYXRhIGNvZGluZyBzY2hlbWUgLSBHU00gNyBiaXRzIC8gbm8gY2xhc3MgLSBvciAtIDE2LWJpdCBVQ1MyIC8gY2xhc3MgMSAqLworICAgIGNvZGluZyA9ICh1c2VfZ3NtNyA/IDB4MDAgOiAweDA5KTsKKworICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCBjb2RpbmcgKTsgICAgICAgICAgICAgICAvKiBkYXRhIGNvZGluZyBzY2hlbWUgICAgICAgKi8KKyAgICBnc21fcm9wZV9hZGRfdGltZXN0YW1wKCByb3BlLCB0aW1lc3RhbXAgKTsgICAgLyogc2VydmljZSBjZW50ZXIgdGltZXN0YW1wICovCisKKyAgICBpZiAodXNlX2dzbTcpIHsKKyAgICAgICAgYnl0ZXNfdCAgZHN0OworICAgICAgICBpbnQgICAgY291bnQgPSB1dGY4X3RvX2dzbTcoIHV0ZjgsIHV0ZjhsZW4sIE5VTEwsIDAgKTsKKyAgICAgICAgaW50ICAgIHBhZCAgID0gMDsKKworICAgICAgICBhc3NlcnQoIGNvdW50IDw9IE1BWF9VU0VSX0RBVEFfU0VQVEVUUyAtIFVTRVJfREFUQV9IRUFERVJfU0laRSApOworCisgICAgICAgIGlmIChwZHVfY291bnQgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgIGhlYWRlckJpdHMgICAgPSA2Kjg7ICAvKiA2IGlzIHNpemUgb2YgaGVhZGVyIGluIGJ5dGVzICovCisgICAgICAgICAgICBpbnQgIGhlYWRlclNlcHRldHMgPSBoZWFkZXJCaXRzIC8gNzsKKyAgICAgICAgICAgIGlmIChoZWFkZXJCaXRzICUgNyA+IDApCisgICAgICAgICAgICAgICAgaGVhZGVyU2VwdGV0cyArPSAxOworCisgICAgICAgICAgICBwYWQgPSBoZWFkZXJTZXB0ZXRzKjcgLSBoZWFkZXJCaXRzOworCisgICAgICAgICAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgY291bnQgKyBoZWFkZXJTZXB0ZXRzICk7CisgICAgICAgICAgICBnc21fcm9wZV9hZGRfc21zX3VzZXJfaGVhZGVyKHJvcGUsIHJlZl9udW0sIHBkdV9jb3VudCwgcGR1X2luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBnc21fcm9wZV9hZGRfYyggcm9wZSwgY291bnQgKTsKKworICAgICAgICBjb3VudCA9IChjb3VudCo3K3BhZCs3KS84OyAgLyogY29udmVydCB0byBieXRlIGNvdW50ICovCisKKyAgICAgICAgZHN0ID0gZ3NtX3JvcGVfcmVzZXJ2ZSggcm9wZSwgY291bnQgKTsKKyAgICAgICAgaWYgKGRzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICB1dGY4X3RvX2dzbTcoIHV0ZjgsIHV0ZjhsZW4sIGRzdCwgcGFkICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBieXRlc190ICBkc3Q7CisgICAgICAgIGludCAgICAgIGNvdW50ID0gdXRmOF90b191Y3MyKCB1dGY4LCB1dGY4bGVuLCBOVUxMICk7CisKKyAgICAgICAgYXNzZXJ0KCBjb3VudCoyIDw9IE1BWF9VU0VSX0RBVEFfQllURVMgLSBVU0VSX0RBVEFfSEVBREVSX1NJWkUgKTsKKworICAgICAgICBpZiAocGR1X2NvdW50ID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgZ3NtX3JvcGVfYWRkX2MoIHJvcGUsIGNvdW50KjIgKyA2ICk7CisgICAgICAgICAgICBnc21fcm9wZV9hZGRfc21zX3VzZXJfaGVhZGVyKCByb3BlLCByZWZfbnVtLCBwZHVfY291bnQsIHBkdV9pbmRleCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdzbV9yb3BlX2FkZF9jKCByb3BlLCBjb3VudCoyICk7CisKKyAgICAgICAgZHN0ID0gZ3NtX3JvcGVfcmVzZXJ2ZSggcm9wZSwgY291bnQqMiApOworICAgICAgICBpZiAoZHN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHV0ZjhfdG9fdWNzMiggdXRmOCwgdXRmOGxlbiwgZHN0ICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIFNtc1BEVQorc21zcGR1X2NyZWF0ZV9kZWxpdmVyKCBjYnl0ZXNfdCAgICAgICAgICAgICAgIHV0ZjgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgdXRmOGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB1c2VfZ3NtNywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21zQWRkcmVzc1JlYyogICBzZW5kZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21zVGltZVN0YW1wUmVjKiB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgcmVmX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBwZHVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgcGR1X2luZGV4ICkKK3sKKyAgICBTbXNQRFUgICAgICBwOworICAgIEdzbVJvcGVSZWMgIHJvcGVbMV07CisgICAgaW50ICAgICAgICAgc2l6ZTsKKworICAgIHAgPSBjYWxsb2MoIHNpemVvZigqcCksIDEgKTsKKyAgICBpZiAoIXApIGdvdG8gRXhpdDsKKworICAgIGdzbV9yb3BlX2luaXQoIHJvcGUgKTsKKyAgICBnc21fcm9wZV9hZGRfc21zX2RlbGl2ZXJfcGR1KCByb3BlLCB1dGY4LCB1dGY4bGVuLCB1c2VfZ3NtNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcl9hZGRyZXNzLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfbnVtLCBwZHVfY291bnQsIHBkdV9pbmRleCk7CisgICAgaWYgKHJvcGUtPmVycm9yKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICBnc21fcm9wZV9pbml0X2FsbG9jKCByb3BlLCByb3BlLT5wb3MgKTsKKworICAgIGdzbV9yb3BlX2FkZF9zbXNfZGVsaXZlcl9wZHUoIHJvcGUsIHV0ZjgsIHV0ZjhsZW4sIHVzZV9nc203LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGVyX2FkZHJlc3MsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl9udW0sIHBkdV9jb3VudCwgcGR1X2luZGV4ICk7CisKKyAgICBwLT5iYXNlID0gZ3NtX3JvcGVfZG9uZV9hY3F1aXJlKCByb3BlLCAmc2l6ZSApOworICAgIGlmIChwLT5iYXNlID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIHAtPmVuZCAgPSBwLT5iYXNlICsgc2l6ZTsKKyAgICBwLT50cGR1ID0gcC0+YmFzZSArIDE7CitFeGl0OgorICAgIHJldHVybiBwOworCitGYWlsOgorICAgIGZyZWUocCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKwordm9pZAorc21zcGR1X2ZyZWVfbGlzdCggU21zUERVKiAgcGR1cyApCit7CisgICAgaWYgKHBkdXMpIHsKKyAgICAgICAgaW50ICBubjsKKyAgICAgICAgZm9yIChubiA9IDA7IHBkdXNbbm5dICE9IE5VTEw7IG5uKyspCisgICAgICAgICAgICBzbXNwZHVfZnJlZSggcGR1c1tubl0gKTsKKworICAgICAgICBmcmVlKCBwZHVzICk7CisgICAgfQorfQorCisKKworU21zUERVKgorc21zcGR1X2NyZWF0ZV9kZWxpdmVyX3V0ZjgoIGNvbnN0IHVuc2lnbmVkIGNoYXIqICAgdXRmOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIHV0ZjhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21zQWRkcmVzc1JlYyogICBzZW5kZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbXNUaW1lU3RhbXBSZWMqIHRpbWVzdGFtcCApCit7CisgICAgU21zVGltZVN0YW1wUmVjICB0czA7CisgICAgaW50ICAgICAgICAgICAgICB1c2VfZ3NtNzsKKyAgICBpbnQgICAgICAgICAgICAgIGNvdW50LCBibG9jazsKKyAgICBpbnQgICAgICAgICAgICAgIG51bV9wZHVzID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgIGxlZnRvdmVyID0gMDsKKyAgICBTbXNQRFUqICAgICAgICAgIGxpc3QgPSBOVUxMOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgIHJlZl9udW0gPSAwOworCisgICAgaWYgKHRpbWVzdGFtcCA9PSBOVUxMKSB7CisgICAgICAgIHNtc190aW1lc3RhbXBfbm93KCAmdHMwICk7CisgICAgICAgIHRpbWVzdGFtcCA9ICZ0czA7CisgICAgfQorCisgICAgLyogY2FuIHdlIGVuY29kZSB0aGUgbWVzc2FnZSB3aXRoIHRoZSBHU00gNy1iaXQgYWxwaGFiZXQgPyAqLworICAgIHVzZV9nc203ID0gdXRmOF9jaGVja19nc203KCB1dGY4LCB1dGY4bGVuICk7CisKKyAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIFNNUyBQRFVzIHdlJ2xsIG5lZWQgKi8KKworICAgIGlmICh1c2VfZ3NtNykgeworICAgICAgICBjb3VudCA9IHV0ZjhfdG9fZ3NtNyggdXRmOCwgdXRmOGxlbiwgTlVMTCwgMCApOworICAgICAgICBibG9jayA9IE1BWF9VU0VSX0RBVEFfU0VQVEVUUyAtIFVTRVJfREFUQV9IRUFERVJfU0laRTsKKyAgICAgICAgbnVtX3BkdXMgPSBjb3VudCAvIGJsb2NrOworICAgICAgICBsZWZ0b3ZlciA9IGNvdW50IC0gbnVtX3BkdXMqYmxvY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY291bnQgPSB1dGY4X3RvX3VjczIoIHV0ZjgsIHV0ZjhsZW4sIE5VTEwgKTsKKyAgICAgICAgYmxvY2sgPSBNQVhfVVNFUl9EQVRBX0JZVEVTIC0gVVNFUl9EQVRBX0hFQURFUl9TSVpFOworICAgICAgICBudW1fcGR1cyA9ICgyICogY291bnQpIC8gYmxvY2s7CisgICAgICAgIGxlZnRvdmVyID0gKDIgKiBjb3VudCkgLSBudW1fcGR1cypibG9jazsKKyAgICB9CisKKyAgICBpZiAobGVmdG92ZXIgPiAwKQorICAgICAgICBudW1fcGR1cyArPSAxOworCisgICAgbGlzdCA9IGNhbGxvYyggc2l6ZW9mKFNtc1BEVSopLCBudW1fcGR1cyArIDEgKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIG5vdyBjcmVhdGUgZWFjaCBTTVMgUERVICovCisgICAgeworICAgICAgICBjYnl0ZXNfdCAgIHNyYyAgICAgPSB1dGY4OworICAgICAgICBjYnl0ZXNfdCAgIHNyY19lbmQgPSB1dGY4ICsgdXRmOGxlbjsKKyAgICAgICAgaW50ICAgICAgICBubjsKKworICAgICAgICBmb3IgKG5uID0gMDsgbm4gPCBudW1fcGR1czsgbm4rKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICAgICAgIHNraXAgPSBibG9jazsKKyAgICAgICAgICAgIGNieXRlc190ICBzcmNfbmV4dDsKKworICAgICAgICAgICAgaWYgKGxlZnRvdmVyID4gMCAmJiBubiA9PSBudW1fcGR1cy0xKQorICAgICAgICAgICAgICAgIHNraXAgPSBsZWZ0b3ZlcjsKKworICAgICAgICAgICAgLyogSG93IG1hbnkgdXRmOCBzeW1ib2xzIHdpbGwgZml0IGluIHRoaXMgUERVPyAqLworICAgICAgICAgICAgaWYgKHVzZV9nc203KSB7CisgICAgICAgICAgICAgICAgc3JjX25leHQgPSB1dGY4X3NraXBfZ3NtNyggc3JjLCBzcmNfZW5kLCBza2lwICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNyY19uZXh0ID0gdXRmOF9za2lwX3VjczIoIHNyYywgc3JjX2VuZCwgc2tpcCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaXN0W25uXSA9IHNtc3BkdV9jcmVhdGVfZGVsaXZlciggc3JjLCBzcmNfbmV4dCAtIHNyYywgdXNlX2dzbTcsIHNlbmRlcl9hZGRyZXNzLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX251bSwgbnVtX3BkdXMsIG5uICk7CisgICAgICAgICAgICBpZiAobGlzdFtubl0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgICAgIHNyYyA9IHNyY19uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcmVmX251bSsrOworICAgIHJldHVybiBsaXN0OworCitGYWlsOgorICAgIHNtc3BkdV9mcmVlX2xpc3QobGlzdCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworU21zUERVCitzbXNwZHVfY3JlYXRlX2Zyb21faGV4KCBjb25zdCBjaGFyKiAgaGV4LCBpbnQgIGhleGxlbiApCit7CisgICAgU21zUERVICAgIHA7CisgICAgY2J5dGVzX3QgIGRhdGE7CisKKyAgICBwID0gY2FsbG9jKCBzaXplb2YoKnApLCAxICk7CisgICAgaWYgKCFwKSBnb3RvIEV4aXQ7CisKKyAgICBwLT5iYXNlID0gbWFsbG9jKCAoaGV4bGVuKzEpLzIgKTsKKyAgICBpZiAocC0+YmFzZSA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUocCk7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCBnc21faGV4X3RvX2J5dGVzKCAoY2J5dGVzX3QpaGV4LCBoZXhsZW4sIHAtPmJhc2UgKSA8IDAgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICBwLT5lbmQgPSBwLT5iYXNlICsgKGhleGxlbisxKS8yOworCisgICAgZGF0YSA9IHAtPmJhc2U7CisgICAgaWYgKCBzbXNfc2tpcF9zY19hZGRyZXNzKCAmZGF0YSwgcC0+ZW5kICkgPCAwICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgcC0+dHBkdSA9IChieXRlc190KSBkYXRhOworCitFeGl0OgorICAgIHJldHVybiBwOworCitGYWlsOgorICAgIGZyZWUocC0+YmFzZSk7CisgICAgZnJlZShwKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50CitzbXNwZHVfdG9faGV4KCBTbXNQRFUgIHBkdSwgY2hhciogIGhleCwgaW50ICBoZXhsZW4gKQoreworICAgIGludCAgcmVzdWx0ID0gKHBkdS0+ZW5kIC0gcGR1LT5iYXNlKSoyOworICAgIGludCAgbm47CisKKyAgICBpZiAoaGV4bGVuID4gcmVzdWx0KQorICAgICAgICBoZXhsZW4gPSByZXN1bHQ7CisKKyAgICBmb3IgKG5uID0gMDsgbm4qMiA8IGhleGxlbjsgbm4rKykgeworICAgICAgICBnc21faGV4X2Zyb21fYnl0ZSggJmhleFtubioyXSwgcGR1LT5iYXNlW25uXSApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qKiBTTVMgU1VCTUlUIFJFQ0VJVkVSCisgKiogY29sbGVjdHMgb25lIG9yIG1vcmUgU01TLVNVQk1JVCBQRFVzIHRvIGdlbmVyYXRlIGEgc2luZ2xlIG1lc3NhZ2UgdG8gZGVsaXZlcgorICoqLworCit0eXBlZGVmIHN0cnVjdCBTbXNGcmFnbWVudFJlYyB7CisgICAgc3RydWN0IFNtc0ZyYWdtZW50UmVjKiAgbmV4dDsKKyAgICBTbXNBZGRyZXNzUmVjICAgICAgICAgICBmcm9tWzFdOworICAgIGJ5dGVfdCAgICAgICAgICAgICAgICAgIHJlZjsKKyAgICBieXRlX3QgICAgICAgICAgICAgICAgICBtYXg7CisgICAgYnl0ZV90ICAgICAgICAgICAgICAgICAgY291bnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisgICAgU21zUERVKiAgICAgICAgICAgICAgICAgcGR1czsKKworfSBTbXNGcmFnbWVudFJlYywgKlNtc0ZyYWdtZW50OworCisKK3R5cGVkZWYgc3RydWN0IFNtc1JlY2VpdmVyUmVjIHsKKyAgICBpbnQgICAgICAgICAgIGxhc3Q7CisgICAgU21zRnJhZ21lbnQgICBmcmFnbWVudHM7CisKK30gU21zUmVjZWl2ZXJSZWM7CisKKworc3RhdGljIHZvaWQKK3Ntc19mcmFnbWVudF9mcmVlKCBTbXNGcmFnbWVudCAgZnJhZyApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAobm4gPSAwOyBubiA8IGZyYWctPm1heDsgbm4rKykgeworICAgICAgICBpZiAoZnJhZy0+cGR1c1tubl0gIT0gTlVMTCkgeworICAgICAgICAgICAgc21zcGR1X2ZyZWUoIGZyYWctPnBkdXNbbm5dICk7CisgICAgICAgICAgICBmcmFnLT5wZHVzW25uXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJhZy0+cGR1cyAgPSBOVUxMOworICAgIGZyYWctPmNvdW50ID0gMDsKKyAgICBmcmFnLT5tYXggICA9IDA7CisgICAgZnJhZy0+aW5kZXggPSAwOworICAgIGZyZWUoIGZyYWcgKTsKK30KKworc3RhdGljIFNtc0ZyYWdtZW50CitzbXNfZnJhZ21lbnRfYWxsb2MoIFNtc1JlY2VpdmVyICByZWMsIGNvbnN0IFNtc0FkZHJlc3NSZWMqICBmcm9tLCBpbnQgICByZWYsIGludCAgbWF4ICkKK3sKKyAgICBTbXNGcmFnbWVudCAgZnJhZyA9IGNhbGxvYyhzaXplb2YoKmZyYWcpICsgbWF4KnNpemVvZihTbXNQRFUpLCAxICk7CisKKyAgICBpZiAoZnJhZyAhPSBOVUxMKSB7CisgICAgICAgIGZyYWctPmZyb21bMF0gPSBmcm9tWzBdOworICAgICAgICBmcmFnLT5yZWYgICAgID0gcmVmOworICAgICAgICBmcmFnLT5tYXggICAgID0gbWF4OworICAgICAgICBmcmFnLT5wZHVzICAgID0gKFNtc1BEVSopKGZyYWcgKyAxKTsKKyAgICAgICAgZnJhZy0+aW5kZXggICA9ICsrcmVjLT5sYXN0OworICAgIH0KKyAgICByZXR1cm4gIGZyYWc7Cit9CisKKworCitTbXNSZWNlaXZlciAgIHNtc19yZWNlaXZlcl9jcmVhdGUoIHZvaWQgKQoreworICAgIFNtc1JlY2VpdmVyICByZWMgPSBjYWxsb2Moc2l6ZW9mKCpyZWMpLDEpOworICAgIHJldHVybiByZWM7Cit9CisKK3ZvaWQKK3Ntc19yZWNlaXZlcl9kZXN0cm95KCBTbXNSZWNlaXZlciAgcmVjICkKK3sKKyAgICB3aGlsZSAocmVjLT5mcmFnbWVudHMpIHsKKyAgICAgICAgU21zRnJhZ21lbnQgIGZyYWcgPSByZWMtPmZyYWdtZW50czsKKyAgICAgICAgcmVjLT5mcmFnbWVudHMgPSBmcmFnLT5uZXh0OworICAgICAgICBzbXNfZnJhZ21lbnRfZnJlZShmcmFnKTsKKyAgICB9Cit9CisKK3N0YXRpYyBTbXNGcmFnbWVudCoKK3Ntc19yZWNlaXZlcl9maW5kX3AoIFNtc1JlY2VpdmVyICByZWMsIGNvbnN0IFNtc0FkZHJlc3NSZWMqICBmcm9tLCBpbnQgIHJlZiApCit7CisgICAgU21zRnJhZ21lbnQqICBwbm9kZSA9ICZyZWMtPmZyYWdtZW50czsKKyAgICBTbXNGcmFnbWVudCAgIG5vZGU7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIG5vZGUgPSAqcG5vZGU7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKG5vZGUtPnJlZiA9PSByZWYgJiYgc21zX2FkZHJlc3NfZXEoIG5vZGUtPmZyb20sIGZyb20gKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwbm9kZSA9ICZub2RlLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gIHBub2RlOworfQorCitzdGF0aWMgU21zRnJhZ21lbnQqCitzbXNfcmVjZWl2ZXJfZmluZF9pbmRleF9wKCBTbXNSZWNlaXZlciAgcmVjLCBpbnQgIGluZGV4ICkKK3sKKyAgICBTbXNGcmFnbWVudCogIHBub2RlID0gJnJlYy0+ZnJhZ21lbnRzOworICAgIFNtc0ZyYWdtZW50ICAgbm9kZTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbm9kZSA9ICpwbm9kZTsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAobm9kZS0+aW5kZXggPT0gaW5kZXgpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcG5vZGUgPSAmbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuICBwbm9kZTsKK30KKworaW50CitzbXNfcmVjZWl2ZXJfYWRkX3N1Ym1pdF9wZHUoIFNtc1JlY2VpdmVyICByZWMsIFNtc1BEVSAgICAgICBzdWJtaXRfcGR1ICkKK3sKKyAgICBTbXNBZGRyZXNzUmVjICBmcm9tWzFdOworICAgIGludCAgICAgICAgICAgIHJlZiwgbWF4LCBjdXI7CisgICAgU21zRnJhZ21lbnQqICAgcG5vZGU7CisgICAgU21zRnJhZ21lbnQgICAgZnJhZzsKKworICAgIGlmICggc21zcGR1X2dldF9yZWNlaXZlcl9hZGRyZXNzKCBzdWJtaXRfcGR1LCBmcm9tICkgPCAwICkgeworICAgICAgICBEKCAiJXM6IGNvdWxkIG5vdCBleHRyYWN0IHJlY2VpdmVyIGFkZHJlc3NcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmVmID0gc21zcGR1X2dldF9yZWYoIHN1Ym1pdF9wZHUgKTsKKyAgICBpZiAocmVmIDwgMCkgeworICAgICAgICBEKCAiJXM6IGNvdWxkIG5vdCBleHRyYWN0IG1lc3NhZ2UgcmVmZXJlbmNlIGZyb20gcGR1XG4iLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtYXggPSBzbXNwZHVfZ2V0X21heF9pbmRleCggc3VibWl0X3BkdSApOworICAgIGlmIChtYXggPCAwKSB7CisgICAgICAgIEQoICIlczogaW52YWxpZCBtYXggZnJhZ21lbnQgdmFsdWU6ICVkIHNob3VsZCBiZSA+PSAxXG4iLAorICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1heCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBub2RlID0gc21zX3JlY2VpdmVyX2ZpbmRfcCggcmVjLCBmcm9tLCByZWYgKTsKKyAgICBmcmFnICA9ICpwbm9kZTsKKyAgICBpZiAoZnJhZyA9PSBOVUxMKSB7CisgICAgICAgIGZyYWcgPSBzbXNfZnJhZ21lbnRfYWxsb2MoIHJlYywgZnJvbSwgcmVmLCBtYXggKTsKKyAgICAgICAgaWYgKGZyYWcgPT0gTlVMTCkgeworICAgICAgICAgICAgRCgiJXM6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIG5ldyBmcmFnbWVudFxuIiwgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFuZHJvaWRfdGVsZXBob255X2RlYnVnX21vZGVtKSB7CisgICAgICAgICAgICBjaGFyICB0bXBbMzJdOworICAgICAgICAgICAgaW50ICAgbGVuOworCisgICAgICAgICAgICBsZW4gPSBzbXNfYWRkcmVzc190b19zdHIoIGZyb20sIHRtcCwgc2l6ZW9mKHRtcCkgKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICI8dW5rbm93bj4iICk7CisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEKCIlczogY3JlYXRlZCBTTVMgaW5kZXggJWQsIGZyb20gJS4qcywgcmVmICVkLCBtYXggJWRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgIGZyYWctPmluZGV4LCBsZW4sIHRtcCwgZnJhZy0+cmVmLCBmcmFnLT5tYXgpOworICAgICAgICB9CisgICAgICAgICpwbm9kZSA9IGZyYWc7CisgICAgfQorCisgICAgY3VyID0gc21zcGR1X2dldF9jdXJfaW5kZXgoIHN1Ym1pdF9wZHUgKTsKKyAgICBpZiAoY3VyIDwgMCkgeworICAgICAgICBEKCIlczogU01TIGZyYWdtZW50IGluZGV4IGlzIHRvbyBzbWFsbDogJWQgc2hvdWxkIGJlID49IDFcbiIsIF9fRlVOQ1RJT05fXywgY3VyKzEgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoY3VyID49IG1heCkgeworICAgICAgICBEKCIlczogU01TIGZyYWdtZW50IGluZGV4IGlzIHRvbyBsYXJnZSAoJWQgPj0gJWQpXG4iLCBfX0ZVTkNUSU9OX18sIGN1ciwgbWF4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIGZyYWctPnBkdXNbY3VyXSAhPSBOVUxMICkgeworICAgICAgICBEKCIlczogcmVjZWl2aW5nIGR1cGxpY2F0ZSBTTVMgZnJhZ21lbnQgZm9yICVkLyVkLCByZWY9JWQsIGRpc2NhcmRpbmcgb2xkIG9uZVxuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIGN1cisxLCBtYXgsIHJlZik7CisgICAgICAgIHNtc3BkdV9mcmVlKCBmcmFnLT5wZHVzW2N1cl0gKTsKKyAgICAgICAgZnJhZy0+Y291bnQgLT0gMTsKKyAgICB9CisgICAgZnJhZy0+cGR1c1tjdXJdID0gc3VibWl0X3BkdTsKKyAgICBmcmFnLT5jb3VudCAgICArPSAxOworCisgICAgaWYgKGZyYWctPmNvdW50ID49IGZyYWctPm1heCkgeworICAgICAgICAvKiB5ZXMsIHdlIHJlY2VpdmVkIGFsbCBmcmFnbWVudHMgZm9yIHRoaXMgU01TICovCisgICAgICAgIEQoICIlczogU01TIGluZGV4ICVkLCByZWNlaXZlZCBhbGwgJWQgZnJhZ21lbnRzXG4iLCBfX0ZVTkNUSU9OX18sIGZyYWctPmluZGV4LCBmcmFnLT5jb3VudCApOworICAgICAgICByZXR1cm4gZnJhZy0+aW5kZXg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBzdGlsbCB3YWl0aW5nIGZvciBtb3JlICovCisgICAgICAgIEQoICIlczogU01TIGluZGV4ICVkLCByZWNlaXZlZCAlZC8lZCwgd2FpdGluZyBmb3IgJWQgbW9yZVxuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgZnJhZy0+aW5kZXgsIGN1cisxLCBtYXgsIGZyYWctPm1heCAtIGZyYWctPmNvdW50ICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworCitpbnQKK3Ntc19yZWNlaXZlcl9nZXRfdGV4dF9tZXNzYWdlKCBTbXNSZWNlaXZlciAgcmVjLCBpbnQgIGluZGV4LCBieXRlc190ICB1dGY4LCBpbnQgIHV0ZjhsZW4gKQoreworICAgIFNtc0ZyYWdtZW50KiAgcG5vZGUgPSBzbXNfcmVjZWl2ZXJfZmluZF9pbmRleF9wKCByZWMsIGluZGV4ICk7CisgICAgU21zRnJhZ21lbnQgICBmcmFnICA9ICpwbm9kZTsKKyAgICBpbnQgICAgICAgICAgIG5uLCB0b3RhbDsKKworICAgIGlmIChmcmFnID09IE5VTEwpIHsKKyAgICAgICAgRCggIiVzOiBpbnZhbGlkIFNNUyBpbmRleCAlZFxuIiwgX19GVU5DVElPTl9fLCBpbmRleCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChmcmFnLT5jb3VudCAhPSBmcmFnLT5tYXgpIHsKKyAgICAgICAgRCggIiVzOiBTTVMgaW5kZXggJWQgc3RpbGwgbmVlZHMgJWQgZnJhZ21lbnRzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgIGZyYWctPmluZGV4LCBmcmFnLT5tYXggLSBmcmFnLT5jb3VudCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIGdldCB0aGUgc2l6ZSBvZiBhbGwgY29tYmluZWQgdGV4dCAqLworICAgIHRvdGFsID0gMDsKKyAgICBmb3IgKCBubiA9IDA7IG5uIDwgZnJhZy0+Y291bnQ7IG5uKysgKSB7CisgICAgICAgIGludCAgcGFydGlhbDsKKyAgICAgICAgaWYgKHV0ZjggJiYgdXRmOGxlbiA+IDApIHsKKyAgICAgICAgICAgIHBhcnRpYWwgID0gc21zcGR1X2dldF90ZXh0X21lc3NhZ2UoIGZyYWctPnBkdXNbbm5dLCB1dGY4LCB1dGY4bGVuICk7CisgICAgICAgICAgICB1dGY4ICAgICs9IHBhcnRpYWw7CisgICAgICAgICAgICB1dGY4bGVuIC09IHBhcnRpYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJ0aWFsICA9IHNtc3BkdV9nZXRfdGV4dF9tZXNzYWdlKCBmcmFnLT5wZHVzW25uXSwgTlVMTCwgMCApOworICAgICAgICB9CisgICAgICAgIHRvdGFsICs9IHBhcnRpYWw7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKK30KKworCitzdGF0aWMgdm9pZAorc21zX3JlY2VpdmVyX3JlbW92ZSggU21zUmVjZWl2ZXIgIHJlYywgaW50ICBpbmRleCApCit7CisgICAgU21zRnJhZ21lbnQqICBwbm9kZSA9IHNtc19yZWNlaXZlcl9maW5kX2luZGV4X3AoIHJlYywgaW5kZXggKTsKKyAgICBTbXNGcmFnbWVudCAgIGZyYWcgID0gKnBub2RlOworICAgIGlmIChmcmFnICE9IE5VTEwpIHsKKyAgICAgICAgKnBub2RlID0gZnJhZy0+bmV4dDsKKyAgICAgICAgc21zX2ZyYWdtZW50X2ZyZWUoZnJhZyk7CisgICAgfQorfQorCisKK1Ntc1BEVSoKK3Ntc19yZWNlaXZlcl9jcmVhdGVfZGVsaXZlciggU21zUmVjZWl2ZXIgIHJlYywgaW50ICBpbmRleCwgY29uc3QgU21zQWRkcmVzc1JlYyogIGZyb20gKQoreworICAgIFNtc1BEVSogICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICBTbXNGcmFnbWVudCogICAgIHBub2RlID0gc21zX3JlY2VpdmVyX2ZpbmRfaW5kZXhfcCggcmVjLCBpbmRleCApOworICAgIFNtc0ZyYWdtZW50ICAgICAgZnJhZyAgPSAqcG5vZGU7CisgICAgU21zVGltZVN0YW1wUmVjICBub3dbMV07CisgICAgaW50ICAgICAgICAgICAgICBubiwgdG90YWw7CisgICAgYnl0ZXNfdCAgICAgICAgICB1dGY4OworICAgIGludCAgICAgICAgICAgICAgdXRmOGxlbjsKKworICAgIGlmIChmcmFnID09IE5VTEwpIHsKKyAgICAgICAgRCggIiVzOiBpbnZhbGlkIFNNUyBpbmRleCAlZFxuIiwgX19GVU5DVElPTl9fLCBpbmRleCApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGZyYWctPmNvdW50ICE9IGZyYWctPm1heCkgeworICAgICAgICBEKCAiJXM6IFNNUyBpbmRleCAlZCBzdGlsbCBuZWVkcyAlZCBmcmFnbWVudHNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgZnJhZy0+aW5kZXgsIGZyYWctPm1heCAtIGZyYWctPmNvdW50ICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGdldCB0aGUgY29tYmluZWQgdGV4dCBtZXNzYWdlICovCisgICAgdXRmOGxlbiA9IHNtc19yZWNlaXZlcl9nZXRfdGV4dF9tZXNzYWdlKCByZWMsIGluZGV4LCBOVUxMLCAwICk7CisgICAgaWYgKHV0ZjhsZW4gPCAwKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICB1dGY4ID0gbWFsbG9jKCB1dGY4bGVuICsgMSApOworICAgIGlmICh1dGY4ID09IE5VTEwpIHsKKyAgICAgICAgRCggIiVzOiBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgX19GVU5DVElPTl9fLCB1dGY4bGVuKzEgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHRvdGFsID0gMDsKKyAgICBmb3IgKCBubiA9IDA7IG5uIDwgZnJhZy0+Y291bnQ7IG5uKysgKSB7CisgICAgICAgIHRvdGFsICs9IHNtc3BkdV9nZXRfdGV4dF9tZXNzYWdlKCBmcmFnLT5wZHVzW25uXSwgdXRmOCArIHRvdGFsLCB1dGY4bGVuIC0gdG90YWwgKTsKKyAgICB9CisKKyAgICBzbXNfdGltZXN0YW1wX25vdyggbm93ICk7CisKKyAgICByZXN1bHQgPSBzbXNwZHVfY3JlYXRlX2RlbGl2ZXJfdXRmOCggdXRmOCwgdXRmOGxlbiwgZnJvbSwgbm93ICk7CisKKyAgICBmcmVlKHV0ZjgpOworCitFeGl0OgorICAgIHNtc19yZWNlaXZlcl9yZW1vdmUoIHJlYywgaW5kZXggKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zbXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5Y2MwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc21zLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIE1FU1NBR0UgVEVYVAorICoqLworLyogY29udmVydCBhIHF1b3RlZCBtZXNzYWdlIHRleHQgaW50byBhIHV0Zjggc3RyaW5nLiBOb3RlOiB5b3UgY2FuIHVzZSAnc3RyJyBhcyB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgKiB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLiBhbHdheXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgdXRmOCBieXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvcmlnaW5hbAorICogbWVzc2FnZSBzdHJpbmcsIGV2ZW4gaWYgdXRmOCBpcyBOVUxMIGFuZCB1dGY4bGVuIGlzIDAKKyAqLworZXh0ZXJuIGludCAgc21zX3V0ZjhfZnJvbV9tZXNzYWdlX3N0ciggY29uc3QgY2hhciogIHN0ciwgaW50ICBzdHJsZW4sIHVuc2lnbmVkIGNoYXIqICB1dGY4LCBpbnQgIHV0ZjhsZW4gKTsKKworLyogdGhlIGVxdWl2YWxlbnQgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvbgorICovCitleHRlcm4gaW50ICBzbXNfdXRmOF90b19tZXNzYWdlX3N0ciggY29uc3QgdW5zaWduZWQgY2hhciogIHV0ZjgsIGludCAgdXRmOGxlbiwgY2hhciogIHN0ciwgaW50ICBzdHJsZW4gKTsKKworLyoqIFRJTUVTVEFNUFMKKyAqKi8KKworLyogQW4gU01TIHRpbWVzdGFtcCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBjaGFyICBkYXRhWzddOworfSBTbXNUaW1lU3RhbXBSZWMsICpTbXNUaW1lU3RhbXA7CisKK2V4dGVybiB2b2lkICBzbXNfdGltZXN0YW1wX25vdyggU21zVGltZVN0YW1wICBzdGFtcCApOworZXh0ZXJuIGludCAgIHNtc190aW1lc3RhbXBfdG9fdG0oIFNtc1RpbWVTdGFtcCAgc3RhbXAsIHN0cnVjdCB0bSogIHRtICk7CisKKy8qKiBTTVMgQUREUkVTU0VTCisgKiovCisKKyNkZWZpbmUgIFNNU19BRERSRVNTX01BWF9TSVpFICAxNgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciAgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgIHRvYTsKKyAgICB1bnNpZ25lZCBjaGFyICBkYXRhWyBTTVNfQUREUkVTU19NQVhfU0laRSBdOworfSBTbXNBZGRyZXNzUmVjLCAqU21zQWRkcmVzczsKKworZXh0ZXJuIGludCAgc21zX2FkZHJlc3NfZnJvbV9zdHIoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIGNvbnN0IGNoYXIqICBzcmMsIGludCAgc3JjbGVuICk7CitleHRlcm4gaW50ICBzbXNfYWRkcmVzc190b19zdHIoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIGNoYXIqICBzcmMsIGludCAgc3JjbGVuICk7CisKK2V4dGVybiBpbnQgIHNtc19hZGRyZXNzX2Zyb21fYnl0ZXMoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBidWYsIGludCAgYnVmbGVuICk7CitleHRlcm4gaW50ICBzbXNfYWRkcmVzc190b19ieXRlcyAgKCBTbXNBZGRyZXNzICBhZGRyZXNzLCB1bnNpZ25lZCBjaGFyKiAgYnVmLCBpbnQgIGJ1ZnNpemUgKTsKK2V4dGVybiBpbnQgIHNtc19hZGRyZXNzX2Zyb21faGV4ICAoIFNtc0FkZHJlc3MgIGFkZHJlc3MsIGNvbnN0IGNoYXIqICBoZXgsIGludCAgaGV4bGVuICk7CitleHRlcm4gaW50ICBzbXNfYWRkcmVzc190b19oZXggICAgKCBTbXNBZGRyZXNzICBhZGRyZXNzLCBjaGFyKiAgIGhleCwgaW50ICBoZXhzaXplICk7CisKKy8qKiBTTVMgUFJPVE9DT0wgREFUQSBVTklUUworICoqLworCit0eXBlZGVmIHN0cnVjdCBTbXNQRFVSZWMqICAgU21zUERVOworCitleHRlcm4gU21zUERVKiAgc21zcGR1X2NyZWF0ZV9kZWxpdmVyX3V0ZjgoIGNvbnN0IHVuc2lnbmVkIGNoYXIqICAgdXRmOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICB1dGY4bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbXNBZGRyZXNzUmVjKiAgIHNlbmRlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbXNUaW1lU3RhbXBSZWMqIHRpbWVzdGFtcCApOworCitleHRlcm4gdm9pZCAgICAgc21zcGR1X2ZyZWVfbGlzdCggU21zUERVKiAgcGR1cyApOworCitleHRlcm4gU21zUERVICAgc21zcGR1X2NyZWF0ZV9mcm9tX2hleCggY29uc3QgY2hhciogIGhleCwgaW50ICBoZXhsZW4gKTsKKworZXh0ZXJuIGludCAgICAgIHNtc3BkdV90b19oZXgoIFNtc1BEVSAgcGR1LCBjaGFyKiAgaGV4LCBpbnQgIGhleHNpemUgKTsKKworLyogZnJlZSBhIGdpdmVuIFNNUyBQRFUgKi8KK2V4dGVybiB2b2lkICAgICBzbXNwZHVfZnJlZSggU21zUERVICBwZHUgKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTTVNfUERVX0lOVkFMSUQgPSAwLAorICAgIFNNU19QRFVfREVMSVZFUiwKKyAgICBTTVNfUERVX1NVQk1JVCwKKyAgICBTTVNfUERVX1NUQVRVU19SRVBPUlQKK30gU21zUGR1VHlwZTsKKworZXh0ZXJuIFNtc1BkdVR5cGUgICAgc21zcGR1X2dldF90eXBlKCBTbXNQRFUgIHBkdSApOworCisvKiByZXRyaWV2ZSB0aGUgc2VuZGVyIGFkZHJlc3Mgb2YgYSBTTVMtREVMSVZFUiBwZHUsIHJldHVybnMgLTEgb3RoZXJ3aXNlICovCitleHRlcm4gaW50ICBzbXNwZHVfZ2V0X3NlbmRlcl9hZGRyZXNzKCBTbXNQRFUgIHBkdSwgU21zQWRkcmVzcyAgYWRkcmVzcyApOworCisvKiByZXRyaWV2ZSB0aGUgc2VydmljZSBjZW50ZXIgdGltZXN0YW1wIG9mIGEgU01TLURFTElWRVIgcGR1LCByZXR1cm4gLTEgb3RoZXJ3aXNlICovCitleHRlcm4gaW50ICBzbXNwZHVfZ2V0X3NjX3RpbWVzdGFtcCggU21zUERVICBwZHUsIFNtc1RpbWVTdGFtcCAgdGltZXN0YW1wICk7CisKKy8qIHJldHJpZXZlIHRoZSByZWNlaXZlciBhZGRyZXNzIG9mIGEgU01TLVNVQk1JVCBwZHUsIHJldHVybiAtMSBvdGhlcndpc2UgKi8KK2V4dGVybiBpbnQgIHNtc3BkdV9nZXRfcmVjZWl2ZXJfYWRkcmVzcyggU21zUERVICBwZHUsIFNtc0FkZHJlc3MgIGFkZHJlc3MgKTsKKworZXh0ZXJuIGludCAgc21zcGR1X2dldF9yZWYgICAgICAoIFNtc1BEVSAgcGR1ICk7CitleHRlcm4gaW50ICBzbXNwZHVfZ2V0X21heF9pbmRleCggU21zUERVICBwZHUgKTsKK2V4dGVybiBpbnQgIHNtc3BkdV9nZXRfY3VyX2luZGV4KCBTbXNQRFUgIHBkdSApOworCisvKiBnZXQgdGhlIG1lc3NhZ2UgZW1iZWRkZWQgaW4gYSBTTVMgUERVIGFzIGEgdXRmOCBieXRlIGFycmF5LCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMgKi8KKy8qIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IgKi8KK2V4dGVybiBpbnQgIHNtc3BkdV9nZXRfdGV4dF9tZXNzYWdlKCBTbXNQRFUgIHBkdSwgdW5zaWduZWQgY2hhciogIHV0ZjgsIGludCAgdXRmOGxlbiApOworCisvKiogU01TIFNVQk1JVCBSRUNFSVZFUgorICoqIGNvbGxlY3RzIG9uZSBvciBtb3JlIFNNUy1TVUJNSVQgUERVcyB0byBnZW5lcmF0ZSBhIHNpbmdsZSBtZXNzYWdlIHRvIGRlbGl2ZXIKKyAqKi8KKwordHlwZWRlZiBzdHJ1Y3QgU21zUmVjZWl2ZXJSZWMgICpTbXNSZWNlaXZlcjsKKworZXh0ZXJuIFNtc1JlY2VpdmVyICAgc21zX3JlY2VpdmVyX2NyZWF0ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgICAgICAgc21zX3JlY2VpdmVyX2Rlc3Ryb3koIFNtc1JlY2VpdmVyICByZWMgKTsKKworZXh0ZXJuIGludCAgICAgICAgICAgc21zX3JlY2VpdmVyX2FkZF9zdWJtaXRfcGR1KCBTbXNSZWNlaXZlciAgcmVjLCBTbXNQRFUgICAgICAgc3VibWl0X3BkdSApOworZXh0ZXJuIGludCAgICAgICAgICAgc21zX3JlY2VpdmVyX2dldF90ZXh0X21lc3NhZ2UoIFNtc1JlY2VpdmVyICByZWMsIGludCAgaW5kZXgsIHVuc2lnbmVkIGNoYXIqICB1dGY4LCBpbnQgIHV0ZjhsZW4gKTsKK2V4dGVybiBTbXNQRFUqICAgICAgIHNtc19yZWNlaXZlcl9jcmVhdGVfZGVsaXZlciggU21zUmVjZWl2ZXIgIHJlYywgaW50ICBpbmRleCwgY29uc3QgU21zQWRkcmVzc1JlYyogIGZyb20gKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc21zX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC90ZWxlcGhvbnkvc21zX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI5NjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zbXNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTA2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvc21zLmgiCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK25hbWVzcGFjZSBzbXMgeworCitURVNUKFNtcywgQWRkckZyb21TdHIpIHsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgIGlucHV0OworICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGV4cGVjdGVkUmV0OworICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGV4cGVjdGVkVG9hOworICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGV4cGVjdGVkTGVuOworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGV4cGVjdGVkRGF0YVsxNl07CisgICAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgeyAiKDY1MCkgMTIzLTQ1NjciLCAgIDAsIDB4ODEsIDEwLCB7IDB4NTYsIDB4MTAsIDB4MzIsIDB4NTQsIDB4NzYgfSB9LAorICAgICAgICAgIHsgIisxLjY1MCAxMjMvNDU2NyIsICAwLCAweDkxLCAxMSwgeyAweDYxLCAweDA1LCAweDIxLCAweDQzLCAweDY1LCAweGY3IH0gfSwKKyAgICAgICAgICB7ICI1IiwgICAgICAgICAgICAgICAgMCwgMHg4MSwgIDEsIHsgMHhmNSB9IH0sCisgICAgICAgICAgeyAiKygpIiwgICAgICAgICAgICAgLTEsIDAsICAgICAwLCB7IH0gfSwgLy8gTm8gZGlnaXRzCisgICAgICAgICAgeyAiIiwgICAgICAgICAgICAgICAgLTEsIDAsICAgICAwLCB7IH0gfSwgLy8gTm8gZGlnaXRzCisgICAgICAgICAgeyAiMTIzIDQ1Ni43ODkwIgorICAgICAgICAgICAgIigxMikzNDU2Nzg5MCIKKyAgICAgICAgICAgICIxMjM0NTY3ODkwIDEyIiwgICAgMCwgMHg4MSwgMzIsIHsgMHgyMSwgMHg0MywgMHg2NSwgMHg4NywgMHgwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMSwgMHg0MywgMHg2NSwgMHg4NywgMHgwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMSwgMHg0MywgMHg2NSwgMHg4NywgMHgwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMSAgICAgICAgICAgICAgICAgICAgICAgICAgfSB9LAorICAgICAgICAgIHsgIjEyMyA0NTYuNzg5MCIKKyAgICAgICAgICAgICIoMTIpMzQ1Njc4OTAiCisgICAgICAgICAgICAiMTIzNDU2Nzg5MCAxMjMiLCAgLTEsIDAsICAgICAwLCB7IH0gfSwgLy8gVG9vIGxvbmcKKyAgICAgIH07CisKKyAgICBTbXNBZGRyZXNzUmVjIHNtc0FkZHJSZWM7CisKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytpZHgpIHsKKyAgICAgICAgY29uc3QgY2hhciogaW5wdXQgPSBrRGF0YVtpZHhdLmlucHV0OworCisgICAgICAgIG1lbXNldChzbXNBZGRyUmVjLmRhdGEsIDAsIHNpemVvZihzbXNBZGRyUmVjLmRhdGEpKTsKKworICAgICAgICBpbnQgclZhbCA9IHNtc19hZGRyZXNzX2Zyb21fc3RyKCZzbXNBZGRyUmVjLCBpbnB1dCwgc3RybGVuKGlucHV0KSk7CisKKyAgICAgICAgRVhQRUNUX0VRKHJWYWwsIGtEYXRhW2lkeF0uZXhwZWN0ZWRSZXQpOworICAgICAgICBpZiAoclZhbCA9PSAwKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoc21zQWRkclJlYy5sZW4sIGtEYXRhW2lkeF0uZXhwZWN0ZWRMZW4pOworICAgICAgICAgICAgY29uc3QgY2hhciBjbXBSZXN1bHQgPSBtZW1jbXAoIHNtc0FkZHJSZWMuZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRGF0YVtpZHhdLmV4cGVjdGVkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa0RhdGFbaWR4XS5leHBlY3RlZExlbiArIDEpIC8gMiApOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGNtcFJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1QoU21zLCBVdGY4RnJvbVN0cikgeworCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAgaW5wdXRbMzJdOworICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIG91dHB1dEJ1ZmZTaXplOworICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgIGV4cGVjdGVkUmV0OworICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGV4cGVjdGVkVXRmOFszMl07CisgICAgICB9IGtEYXRhW10gPSB7CisgICAgICAgICAgeyAiQSB0ZXh0IG1lc3NhZ2UiLCAgICAgICAgICAgICAgICAgICAgMzIsIDE0LCAiQSB0ZXh0IG1lc3NhZ2UifSwKKyAgICAgICAgICB7ICJBIHRleHQgbWVzc2FnZSIsICAgICAgICAgICAgICAgICAgICAxMSwgMTQsICJBIHRleHQgbWVzcyJ9LAorICAgICAgICAgIHsgIkEgdHdvIGxpbmVcbnRleHQgbWVzc2FnZSIsICAgICAgICAgIDMyLCAyMywgIkEgdHdvIGxpbmVcbnRleHQgbWVzc2FnZSJ9LAorICAgICAgICAgIHsgIkEgdHdvIGxpbmVcXG50ZXh0IG1lc3NhZ2UiLCAgICAgICAgIDMyLCAyMywgIkEgdHdvIGxpbmVcbnRleHQgbWVzc2FnZSJ9LAorICAgICAgICAgIHsgIk15IFxceDQxIFxcdTAwNDIgQ3MiLCAgICAgICAgICAgICAgIDMyLCAgOSwgIk15IEEgQiBDcyIgfSwKKyAgICAgICAgICB7ICI1IFxceGUyXFx4ODJcXHUwMGFDIGVhY2ggXFx1MTIzNDUiLCAzMiwgMTgsCisgICAgICAgICAgICAiNSBcMzAzXDI0MlwzMDJcMjAyXDMwMlwyNTQgZWFjaCBcMzAxXDIxMFwyNjQ1In0sCisgICAgICB9OworCisgICAgdW5zaWduZWQgY2hhciBhY3R1YWxPdXRwdXRbMjU2XTsKKworICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoa0RhdGEpOyArK2lkeCkgeworCisgICAgICAgIG1lbXNldChhY3R1YWxPdXRwdXQsIDAsIHNpemVvZihhY3R1YWxPdXRwdXQpKTsKKworICAgICAgICBjb25zdCBjaGFyICppbnB1dCA9IChjaGFyICopa0RhdGFbaWR4XS5pbnB1dDsKKworICAgICAgICBpbnQgbkNoYXJzT3V0ID0gc21zX3V0ZjhfZnJvbV9tZXNzYWdlX3N0ciggaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RhdGFbaWR4XS5vdXRwdXRCdWZmU2l6ZSApOworCisgICAgICAgIEVYUEVDVF9FUShuQ2hhcnNPdXQsIGtEYXRhW2lkeF0uZXhwZWN0ZWRSZXQpOworICAgICAgICBpZiAobkNoYXJzT3V0ID4gMCkgeworICAgICAgICAgICAgY2hhciAqZXhwZWN0ZWRPdXRwdXQgPSAoY2hhciAqKWtEYXRhW2lkeF0uZXhwZWN0ZWRVdGY4OworCisgICAgICAgICAgICBjb25zdCBjaGFyIGNtcFJlc3VsdCA9IHN0cm5jbXAoIChjb25zdCBjaGFyICopYWN0dWFsT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzT3V0ICk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoY21wUmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHNtcwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3N5c2RlcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWU0NTY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lICBERUJVRyAgMAorCisjZGVmaW5lICBEX0FDVElWRSAgREVCVUcKKworI2lmIERFQlVHCisjZGVmaW5lICBEKC4uLikgIGRvIHsgaWYgKERfQUNUSVZFKSBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworLyoqIFRJTUUKKyAqKi8KKworU3lzVGltZQorc3lzX3RpbWVfbXMoIHZvaWQgKQoreworICAgIHJldHVybiBsb29wZXJfbm93V2l0aENsb2NrKGxvb3Blcl9nZXRGb3JUaHJlYWQoKSwgTE9PUEVSX0NMT0NLX1JFQUxUSU1FKTsKK30KKworLyoqIFRJTUVSUworICoqLworCit0eXBlZGVmIHN0cnVjdCBTeXNUaW1lclJlY18geworICAgIExvb3BUaW1lciogICAgIHRpbWVyOworICAgIFN5c0NhbGxiYWNrICAgIGNhbGxiYWNrOworICAgIHZvaWQqICAgICAgICAgIG9wYXF1ZTsKKyAgICBTeXNUaW1lciAgICAgICBuZXh0OworfSBTeXNUaW1lclJlYzsKKworI2RlZmluZSAgTUFYX1RJTUVSUyAgMzIKKworc3RhdGljIFN5c1RpbWVyUmVjICBfc190aW1lcnMwWyBNQVhfVElNRVJTIF07CitzdGF0aWMgU3lzVGltZXIgICAgIF9zX2ZyZWVfdGltZXJzOworCitzdGF0aWMgdm9pZCBzeXNfdGltZXJfY2FsbGJhY2sodm9pZCogb3BhcXVlLCBMb29wVGltZXIqIHVudXNlZCkgeworICAgIFN5c1RpbWVyIHRpbWVyID0gKFN5c1RpbWVyKW9wYXF1ZTsKKyAgICBhc3NlcnQodGltZXIgJiYgdGltZXItPmNhbGxiYWNrKTsKKyAgICB0aW1lci0+Y2FsbGJhY2sodGltZXItPm9wYXF1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitzeXNfaW5pdF90aW1lcnMoIHZvaWQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgTUFYX1RJTUVSUy0xOyBubisrKQorICAgICAgICBfc190aW1lcnMwW25uXS5uZXh0ID0gX3NfdGltZXJzMCArIChubisxKTsKKworICAgIF9zX2ZyZWVfdGltZXJzID0gX3NfdGltZXJzMDsKK30KKworc3RhdGljIFN5c1RpbWVyCitzeXNfdGltZXJfYWxsb2MoIHZvaWQgKQoreworICAgIFN5c1RpbWVyICB0aW1lciA9IF9zX2ZyZWVfdGltZXJzOworCisgICAgaWYgKHRpbWVyICE9IE5VTEwpIHsKKyAgICAgICAgX3NfZnJlZV90aW1lcnMgPSB0aW1lci0+bmV4dDsKKyAgICAgICAgdGltZXItPm5leHQgICAgPSBOVUxMOworICAgICAgICB0aW1lci0+dGltZXIgICA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiB0aW1lcjsKK30KKworCitzdGF0aWMgdm9pZAorc3lzX3RpbWVyX2ZyZWUoIFN5c1RpbWVyICB0aW1lciApCit7CisgICAgaWYgKHRpbWVyLT50aW1lcikgeworICAgICAgICBsb29wVGltZXJfc3RvcCggdGltZXItPnRpbWVyICk7CisgICAgICAgIGxvb3BUaW1lcl9mcmVlKCB0aW1lci0+dGltZXIgKTsKKyAgICAgICAgdGltZXItPnRpbWVyID0gTlVMTDsKKyAgICB9CisgICAgdGltZXItPm5leHQgICAgPSBfc19mcmVlX3RpbWVyczsKKyAgICBfc19mcmVlX3RpbWVycyA9IHRpbWVyOworfQorCisKK1N5c1RpbWVyICAgc3lzX3RpbWVyX2NyZWF0ZSggdm9pZCApCit7CisgICAgU3lzVGltZXIgIHRpbWVyID0gc3lzX3RpbWVyX2FsbG9jKCk7CisgICAgcmV0dXJuIHRpbWVyOworfQorCit2b2lkCitzeXNfdGltZXJfc2V0KCBTeXNUaW1lciAgdGltZXIsIFN5c1RpbWUgIHdoZW4sIFN5c0NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkKiAgb3BhcXVlICkKK3sKKyAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkgeyAgLyogdW5zZXR0aW5nIHRoZSB0aW1lciAqLworICAgICAgICBpZiAodGltZXItPnRpbWVyKSB7CisgICAgICAgICAgICBsb29wVGltZXJfc3RvcCggdGltZXItPnRpbWVyICk7CisgICAgICAgICAgICBsb29wVGltZXJfZnJlZSggdGltZXItPnRpbWVyICk7CisgICAgICAgICAgICB0aW1lci0+dGltZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHRpbWVyLT5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB0aW1lci0+b3BhcXVlICAgPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0aW1lci0+dGltZXIgKSB7CisgICAgICAgIGlmICggdGltZXItPmNhbGxiYWNrID09IGNhbGxiYWNrICYmIHRpbWVyLT5vcGFxdWUgPT0gb3BhcXVlICkKKyAgICAgICAgICAgIGdvdG8gUmV1c2VUaW1lcjsKKworICAgICAgICAvKiBuZWVkIHRvIHJlcGxhY2UgdGhlIHRpbWVyICovCisgICAgICAgIGxvb3BUaW1lcl9zdG9wKCB0aW1lci0+dGltZXIgKTsKKyAgICAgICAgbG9vcFRpbWVyX2ZyZWUoIHRpbWVyLT50aW1lciApOworICAgIH0KKworICAgIHRpbWVyLT50aW1lciA9IGxvb3BUaW1lcl9uZXdXaXRoQ2xvY2soCisgICAgICAgICAgICBsb29wZXJfZ2V0Rm9yVGhyZWFkKCksICZzeXNfdGltZXJfY2FsbGJhY2ssIAorICAgICAgICAgICAgdGltZXIsIExPT1BFUl9DTE9DS19SRUFMVElNRSk7CisgICAgdGltZXItPmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgdGltZXItPm9wYXF1ZSAgID0gb3BhcXVlOworCitSZXVzZVRpbWVyOgorICAgIGxvb3BUaW1lcl9zdGFydEFic29sdXRlKCB0aW1lci0+dGltZXIsIHdoZW4gKTsKK30KKwordm9pZAorc3lzX3RpbWVyX3Vuc2V0KCBTeXNUaW1lciAgdGltZXIgKQoreworICAgIGlmICh0aW1lci0+dGltZXIpIHsKKyAgICAgICAgbG9vcFRpbWVyX3N0b3AoIHRpbWVyLT50aW1lciApOworICAgIH0KK30KKwordm9pZAorc3lzX3RpbWVyX2Rlc3Ryb3koIFN5c1RpbWVyICB0aW1lciApCit7CisgICAgc3lzX3RpbWVyX2ZyZWUoIHRpbWVyICk7Cit9CisKKworLyoqIENIQU5ORUxTCisgKiovCisKK3R5cGVkZWYgc3RydWN0IFN5c0NoYW5uZWxSZWNfIHsKKyAgICBMb29wSW8qICAgICAgICAgICAgIGlvOworICAgIFN5c0NoYW5uZWxDYWxsYmFjayAgY2FsbGJhY2s7CisgICAgdm9pZCogICAgICAgICAgICAgICBvcGFxdWU7CisgICAgU3lzQ2hhbm5lbCAgICAgICAgICBuZXh0OworfSBTeXNDaGFubmVsUmVjOworCisjZGVmaW5lICBNQVhfQ0hBTk5FTFMgIDE2CisKK3N0YXRpYyBTeXNDaGFubmVsUmVjICBfc19jaGFubmVsczBbIE1BWF9DSEFOTkVMUyBdOworc3RhdGljIFN5c0NoYW5uZWwgICAgIF9zX2ZyZWVfY2hhbm5lbHM7CisKK3N0YXRpYyB2b2lkCitzeXNfaW5pdF9jaGFubmVscyggdm9pZCApCit7CisgICAgaW50ICBubjsKKworICAgIGZvciAoIG5uID0gMDsgbm4gPCBNQVhfQ0hBTk5FTFMtMTsgbm4rKyApIHsKKyAgICAgICAgX3NfY2hhbm5lbHMwW25uXS5uZXh0ID0gX3NfY2hhbm5lbHMwICsgKG5uKzEpOworICAgIH0KKyAgICBfc19mcmVlX2NoYW5uZWxzID0gX3NfY2hhbm5lbHMwOworfQorCitzdGF0aWMgU3lzQ2hhbm5lbAorc3lzX2NoYW5uZWxfYWxsb2MoICkKK3sKKyAgICBTeXNDaGFubmVsICBjaGFubmVsID0gX3NfZnJlZV9jaGFubmVsczsKKyAgICBpZiAoY2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgIF9zX2ZyZWVfY2hhbm5lbHMgID0gY2hhbm5lbC0+bmV4dDsKKyAgICAgICAgY2hhbm5lbC0+bmV4dCAgICAgPSBOVUxMOworICAgICAgICBjaGFubmVsLT5pbyAgICAgICA9IE5VTEw7CisgICAgICAgIGNoYW5uZWwtPmNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgY2hhbm5lbC0+b3BhcXVlICAgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKworc3RhdGljIHZvaWQKK3N5c19jaGFubmVsX2ZyZWUoIFN5c0NoYW5uZWwgIGNoYW5uZWwgKQoreworICAgIGlmIChjaGFubmVsLT5pbykgeworICAgICAgICBzb2NrZXRfY2xvc2UobG9vcElvX2ZkKGNoYW5uZWwtPmlvKSk7CisgICAgICAgIGxvb3BJb19mcmVlKGNoYW5uZWwtPmlvKTsKKyAgICAgICAgY2hhbm5lbC0+aW8gPSBOVUxMOworICAgIH0KKyAgICBjaGFubmVsLT5uZXh0ICAgID0gX3NfZnJlZV9jaGFubmVsczsKKyAgICBfc19mcmVlX2NoYW5uZWxzID0gY2hhbm5lbDsKK30KKworCitzdGF0aWMgdm9pZCBzeXNfY2hhbm5lbF9oYW5kbGVyKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBTeXNDaGFubmVsIGNoYW5uZWwgPSAoU3lzQ2hhbm5lbClvcGFxdWU7CisgICAgYXNzZXJ0KGNoYW5uZWwgJiYgY2hhbm5lbC0+Y2FsbGJhY2spOworCisgICAgaWYgKChldmVudHMgJiBMT09QX0lPX1JFQUQpICE9IDApIHsKKyAgICAgICAgRCgiJXM6IHJlYWQgZXZlbnQgZm9yIGNoYW5uZWwgJXA6JWRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgY2hhbm5lbCwgbG9vcElvX2ZkKGNoYW5uZWwtPmlvKSk7CisgICAgICAgIGNoYW5uZWwtPmNhbGxiYWNrKCBjaGFubmVsLT5vcGFxdWUsIFNZU19FVkVOVF9SRUFEICk7CisgICAgfQorICAgIGlmICgoZXZlbnRzICYgTE9PUF9JT19XUklURSkgIT0gMCkgeworICAgICAgICBEKCIlczogd3JpdGUgZXZlbnQgZm9yIGNoYW5uZWwgJXA6JWRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgY2hhbm5lbCwgbG9vcElvX2ZkKGNoYW5uZWwtPmlvKSk7CisgICAgICAgIGNoYW5uZWwtPmNhbGxiYWNrKCBjaGFubmVsLT5vcGFxdWUsIFNZU19FVkVOVF9XUklURSApOworICAgIH0KK30KKwordm9pZAorc3lzX2NoYW5uZWxfb24oIFN5c0NoYW5uZWwgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGV2ZW50cywKKyAgICAgICAgICAgICAgICBTeXNDaGFubmVsQ2FsbGJhY2sgIGV2ZW50X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgZXZlbnRfb3BhcXVlICkKK3sKKyAgICBjaGFubmVsLT5jYWxsYmFjayA9IGV2ZW50X2NhbGxiYWNrOworICAgIGNoYW5uZWwtPm9wYXF1ZSAgID0gZXZlbnRfb3BhcXVlOworICAgICgoZXZlbnRzICYgU1lTX0VWRU5UX1JFQUQpID8gbG9vcElvX3dhbnRSZWFkIDogbG9vcElvX2RvbnRXYW50UmVhZCkoY2hhbm5lbC0+aW8pOworICAgICgoZXZlbnRzICYgU1lTX0VWRU5UX1dSSVRFKSA/IGxvb3BJb193YW50V3JpdGUgOiBsb29wSW9fZG9udFdhbnRXcml0ZSkoY2hhbm5lbC0+aW8pOworfQorCitpbnQKK3N5c19jaGFubmVsX3JlYWQoIFN5c0NoYW5uZWwgIGNoYW5uZWwsIHZvaWQqICBidWZmZXIsIGludCAgc2l6ZSApCit7CisgICAgaW50ICAgbGVuID0gc2l6ZTsKKyAgICBjaGFyKiBidWYgPSAoY2hhciopIGJ1ZmZlcjsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCAgcmV0ID0gc29ja2V0X3JlY3YobG9vcElvX2ZkKGNoYW5uZWwtPmlvKSwgYnVmLCBsZW4pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEQoICIlczogYWZ0ZXIgcmVhZGluZyAlZCBieXRlcywgcmVjdigpIHJldHVybmVkIGVycm9yICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpemUgLSBsZW4sIGVycm5vLCBlcnJub19zdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgICAgICBsZW4gLT0gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaXplIC0gbGVuOworfQorCisKK2ludAorc3lzX2NoYW5uZWxfd3JpdGUoIFN5c0NoYW5uZWwgIGNoYW5uZWwsIGNvbnN0IHZvaWQqICBidWZmZXIsIGludCAgc2l6ZSApCit7CisgICAgaW50ICAgICAgICAgbGVuID0gc2l6ZTsKKyAgICBjb25zdCBjaGFyKiBidWYgPSAoY29uc3QgY2hhciopIGJ1ZmZlcjsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCAgcmV0ID0gc29ja2V0X3NlbmQobG9vcElvX2ZkKGNoYW5uZWwtPmlvKSwgYnVmLCBsZW4pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEQoICIlczogc2VuZCgpIHJldHVybmVkIGVycm9yICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycm5vLCBlcnJub19zdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgICAgICBsZW4gLT0gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaXplIC0gbGVuOworfQorCit2b2lkICBzeXNfY2hhbm5lbF9jbG9zZShTeXNDaGFubmVsIGNoYW5uZWwpCit7CisgICAgc3lzX2NoYW5uZWxfZnJlZShjaGFubmVsKTsKK30KKwordm9pZCAgc3lzX21haW5faW5pdCggdm9pZCApCit7CisgICAgc3lzX2luaXRfY2hhbm5lbHMoKTsKKyAgICBzeXNfaW5pdF90aW1lcnMoKTsKK30KKworCitpbnQgICBzeXNfbWFpbl9sb29wKCB2b2lkICkKK3sKKyAgICAvKiBubyBsb29waW5nLCBxZW11IGhhcyBpdHMgb3duIGV2ZW50IGxvb3AgKi8KKyAgICByZXR1cm4gMDsKK30KKworCisKKworU3lzQ2hhbm5lbAorc3lzX2NoYW5uZWxfY3JlYXRlX3RjcF9zZXJ2ZXIoIGludCBwb3J0ICkKK3sKKyAgICBTeXNDaGFubmVsICBjaGFubmVsID0gc3lzX2NoYW5uZWxfYWxsb2MoKTsKKworICAgIGNvbnN0IGludCBmZCA9IHNvY2tldF9hbnlhZGRyX3NlcnZlciggcG9ydCwgU09DS0VUX1NUUkVBTSApOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgRCggIiVzOiBmYWlsZWQgdG8gY3JlYXRlZCBuZXR3b3JrIHNvY2tldCBvbiBUQ1A6JWRcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBvcnQgKTsKKyAgICAgICAgc3lzX2NoYW5uZWxfZnJlZSggY2hhbm5lbCApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjaGFubmVsLT5pbyA9IGxvb3BJb19uZXcoCisgICAgICAgICAgICBsb29wZXJfZ2V0Rm9yVGhyZWFkKCksIGZkLCAmc3lzX2NoYW5uZWxfaGFuZGxlciwgY2hhbm5lbCk7CisKKyAgICBEKCAiJXM6IHNlcnZlciBjaGFubmVsICVwOiVkIG5vdyBsaXN0ZW5pbmcgb24gcG9ydCAlZFxuIiwKKyAgICAgICBfX0ZVTkNUSU9OX18sIGNoYW5uZWwsIGZkLCBwb3J0ICk7CisKKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKworCitTeXNDaGFubmVsCitzeXNfY2hhbm5lbF9jcmVhdGVfdGNwX2hhbmRsZXIoIFN5c0NoYW5uZWwgIHNlcnZlcl9jaGFubmVsICkKK3sKKyAgICBTeXNDaGFubmVsICBjaGFubmVsID0gc3lzX2NoYW5uZWxfYWxsb2MoKTsKKworICAgIEQoICIlczogY3JlYXRpbmcgaGFuZGxlciBmcm9tIHNlcnZlciBjaGFubmVsICVwOiVkXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgc2VydmVyX2NoYW5uZWwsIGxvb3BJb19mZChzZXJ2ZXJfY2hhbm5lbC0+aW8pICk7CisKKyAgICBjb25zdCBpbnQgZmQgPSBzb2NrZXRfYWNjZXB0X2FueShsb29wSW9fZmQoc2VydmVyX2NoYW5uZWwtPmlvKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoICJhY2NlcHQiICk7CisgICAgICAgIHN5c19jaGFubmVsX2ZyZWUoIGNoYW5uZWwgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogZGlzYWJsZSBOYWdsZSBhbGdvcml0aG0gKi8KKyAgICBzb2NrZXRfc2V0X25vZGVsYXkoZmQpOworCisgICAgY2hhbm5lbC0+aW8gPSBsb29wSW9fbmV3KAorICAgICAgICAgICAgbG9vcGVyX2dldEZvclRocmVhZCgpLCBmZCwgJnN5c19jaGFubmVsX2hhbmRsZXIsIGNoYW5uZWwpOworCisgICAgRCggIiVzOiBoYW5kbGVyICVwOiVkIGNyZWF0ZWQgZnJvbSBzZXJ2ZXIgJXA6JWRcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgc2VydmVyX2NoYW5uZWwsIGxvb3BJb19mZChzZXJ2ZXJfY2hhbm5lbC0+aW8pLCBjaGFubmVsLCBmZCApOworCisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKKworU3lzQ2hhbm5lbAorc3lzX2NoYW5uZWxfY3JlYXRlX3RjcF9jbGllbnQoIGNvbnN0IGNoYXIqICBob3N0bmFtZSwgaW50ICBwb3J0ICkKK3sKKyAgICBTeXNDaGFubmVsICBjaGFubmVsID0gc3lzX2NoYW5uZWxfYWxsb2MoKTsKKworICAgIGNvbnN0IGludCBmZCA9IHNvY2tldF9uZXR3b3JrX2NsaWVudCggaG9zdG5hbWUsIHBvcnQsIFNPQ0tFVF9TVFJFQU0gKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHN5c19jaGFubmVsX2ZyZWUoY2hhbm5lbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07CisKKyAgICAvKiBzZXQgdG8gbm9uLWJsb2NraW5nIGFuZCBkaXNhYmxlIE5hZ2xlIGFsZ29yaXRobSAqLworICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworICAgIHNvY2tldF9zZXRfbm9kZWxheShmZCk7CisKKyAgICBjaGFubmVsLT5pbyA9IGxvb3BJb19uZXcoCisgICAgICAgICAgICBsb29wZXJfZ2V0Rm9yVGhyZWFkKCksIGZkLCAmc3lzX2NoYW5uZWxfaGFuZGxlciwgY2hhbm5lbCk7CisKKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKwordm9pZAorc3lzX2ZpbGVfcHV0X2J5dGUoU3lzRmlsZSogZmlsZSwgaW50IGMpIHsKKyAgICBzdHJlYW1fcHV0X2J5dGUoKFN0cmVhbSopZmlsZSwgYyk7Cit9CisKK3ZvaWQKK3N5c19maWxlX3B1dF9iZTMyKFN5c0ZpbGUqIGZpbGUsIHVpbnQzMl90IHYpIHsKKyAgICBzdHJlYW1fcHV0X2JlMzIoKFN0cmVhbSopZmlsZSwgdik7Cit9CisKK3ZvaWQKK3N5c19maWxlX3B1dF9idWZmZXIoU3lzRmlsZSogZmlsZSwgY29uc3Qgdm9pZCogYnVmZiwgaW50IGxlbikgeworICAgIHN0cmVhbV93cml0ZSgoU3RyZWFtKilmaWxlLCBidWZmLCBsZW4pOworfQorCit1aW50OF90CitzeXNfZmlsZV9nZXRfYnl0ZShTeXNGaWxlKiBmaWxlKSB7CisgICAgcmV0dXJuIHN0cmVhbV9nZXRfYnl0ZSgoU3RyZWFtKilmaWxlKTsKK30KKwordWludDMyX3QKK3N5c19maWxlX2dldF9iZTMyKFN5c0ZpbGUqIGZpbGUpIHsKKyAgICByZXR1cm4gc3RyZWFtX2dldF9iZTMyKChTdHJlYW0qKWZpbGUpOworfQorCit2b2lkCitzeXNfZmlsZV9nZXRfYnVmZmVyKFN5c0ZpbGUqIGZpbGUsIHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKKyAgICBzdHJlYW1fcmVhZCgoU3RyZWFtKilmaWxlLCBidWZmLCBsZW4pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdGVsZXBob255L3N5c2RlcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTBhMDZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3RlbGVwaG9ueS9zeXNkZXBzLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBzeXN0ZW0tZGVwZW5kZW50IHBsYXRmb3JtIGFic3RyYWN0aW9uIHVzZWQgYnkgdGhlIGVtdWxhdGVkIEdTTSBtb2RlbQorICovCisKKy8qIHRvIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSAqLworCitleHRlcm4gdm9pZCAgc3lzX21haW5faW5pdCggdm9pZCApOworCisvKiogY2FsbGJhY2tzCisgKiovCit0eXBlZGVmIHZvaWQgICgqU3lzQ2FsbGJhY2spKCB2b2lkKiAgb3BhcXVlICk7CisKKy8qKiBldmVudHMKKyAqKi8KK2VudW0geworICAgIFNZU19FVkVOVF9SRUFEICA9IDB4MDEsCisgICAgU1lTX0VWRU5UX1dSSVRFID0gMHgwMiwKKyAgICBTWVNfRVZFTlRfRVJST1IgPSAweDA0LAorICAgIFNZU19FVkVOVF9BTEwgICA9IDB4MDcKK307CisKKy8qKiBjaGFubmVscworICoqLwordHlwZWRlZiBzdHJ1Y3QgU3lzQ2hhbm5lbFJlY18qICBTeXNDaGFubmVsOworCit0eXBlZGVmIHZvaWQgKCpTeXNDaGFubmVsQ2FsbGJhY2spKCB2b2lkKiAgb3BhcXVlLCBpbnQgIGV2ZW50X2ZsYWdzICk7CisKKy8qIFhYWDogVE9ETzogY2hhbm5lbCBjcmVhdGlvbiBmdW5jdGlvbnMgKi8KK2V4dGVybiBTeXNDaGFubmVsICBzeXNfY2hhbm5lbF9jcmVhdGVfdGNwX3NlcnZlciggaW50IHBvcnQgKTsKK2V4dGVybiBTeXNDaGFubmVsICBzeXNfY2hhbm5lbF9jcmVhdGVfdGNwX2hhbmRsZXIoIFN5c0NoYW5uZWwgIHNlcnZlcl9jaGFubmVsICk7CitleHRlcm4gU3lzQ2hhbm5lbCAgc3lzX2NoYW5uZWxfY3JlYXRlX3RjcF9jbGllbnQoIGNvbnN0IGNoYXIqICBob3N0bmFtZSwgaW50ICBwb3J0ICk7CitleHRlcm4gaW50ICAgICAgICAgc3lzX2NoYW5uZWxfc2V0X25vbl9ibG9jayggU3lzQ2hhbm5lbCAgY2hhbm5lbCApOworCitleHRlcm4gIHZvaWQgICBzeXNfY2hhbm5lbF9vbiggU3lzQ2hhbm5lbCAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgZXZlbnRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzQ2hhbm5lbENhbGxiYWNrICBldmVudF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgIGV2ZW50X29wYXFlICk7CisKK2V4dGVybiAgaW50ICAgc3lzX2NoYW5uZWxfcmVhZCggU3lzQ2hhbm5lbCAgY2hhbm5lbCwgdm9pZCogIGJ1ZmZlciwgaW50ICBzaXplICk7CisKK2V4dGVybiAgaW50ICAgc3lzX2NoYW5uZWxfd3JpdGUoIFN5c0NoYW5uZWwgIGNoYW5uZWwsIGNvbnN0IHZvaWQqICBidWZmZXIsIGludCAgc2l6ZSApOworCitleHRlcm4gIHZvaWQgIHN5c19jaGFubmVsX2Nsb3NlKCBTeXNDaGFubmVsICBjaGFubmVsICk7CisKKworLyoqIHRpbWUgbWVhc3VyZW1lbnQKKyAqKi8KK3R5cGVkZWYgbG9uZyBsb25nICAgU3lzVGltZTsKKworZXh0ZXJuIFN5c1RpbWUgICBzeXNfdGltZV9ub3coIHZvaWQgKTsKKworLyoqIHRpbWVycworICoqLwordHlwZWRlZiBzdHJ1Y3QgU3lzVGltZXJSZWNfKiAgICBTeXNUaW1lcjsKKworZXh0ZXJuIFN5c1RpbWVyICAgc3lzX3RpbWVyX2NyZWF0ZSggdm9pZCApOworZXh0ZXJuIHZvaWQgICAgICAgc3lzX3RpbWVyX3NldCggU3lzVGltZXIgIHRpbWVyLCBTeXNUaW1lICB3aGVuLCBTeXNDYWxsYmFjayAgIGNhbGxiYWNrLCB2b2lkKiAgb3BhcXVlICk7CitleHRlcm4gdm9pZCAgICAgICBzeXNfdGltZXJfdW5zZXQoIFN5c1RpbWVyICB0aW1lciApOworZXh0ZXJuIHZvaWQgICAgICAgc3lzX3RpbWVyX2Rlc3Ryb3koIFN5c1RpbWVyICB0aW1lciApOworCitleHRlcm4gbG9uZyBsb25nICBzeXNfdGltZV9tcyggdm9pZCApOworCisvKiogZmlsZXMgKGZvciBzYXZpbmcvbG9hZGluZyBzdGF0ZSkKKyAqKi8KK3R5cGVkZWYgc3RydWN0IFN5c0ZpbGUgU3lzRmlsZTsKKworZXh0ZXJuIHZvaWQgc3lzX2ZpbGVfcHV0X2J5dGUoU3lzRmlsZSogZmlsZSwgaW50IGIpOworZXh0ZXJuIHZvaWQgc3lzX2ZpbGVfcHV0X2JlMzIoU3lzRmlsZSogZmlsZSwgdWludDMyX3QgdmFsdWUpOworZXh0ZXJuIHZvaWQgc3lzX2ZpbGVfcHV0X2J1ZmZlcihTeXNGaWxlKiBmaWxlLCBjb25zdCB2b2lkKiBidWZmZXIsIGludCBsZW4pOworCitleHRlcm4gdWludDhfdCBzeXNfZmlsZV9nZXRfYnl0ZShTeXNGaWxlKiBmaWxlKTsKK2V4dGVybiB1aW50MzJfdCBzeXNfZmlsZV9nZXRfYmUzMihTeXNGaWxlKiBmaWxlKTsKK2V4dGVybiB2b2lkIHN5c19maWxlX2dldF9idWZmZXIoU3lzRmlsZSogZmlsZSwgdm9pZCogYnVmZmVyLCBpbnQgbGVuKTsKKworLyoqIG1haW4gbG9vcCAobWF5IHJldHVybiBpbW1lZGlhdGVseSBvbiBzb21lIHBsYXRmb3JtKQorICoqLworZXh0ZXJuIGludCAgIHN5c19tYWluX2xvb3AoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91aS1lbXUtYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91aS1lbXUtYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI4NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VpLWVtdS1hZ2VudC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjcHJhZ21hIG9uY2UKKworLy8gQWdlbnQgaXRlcmZhY2VzIGZvciBzZW5kaW5nIGNvbW1hbmRzIGZyb20gdGhlIFVJIHRvIHRoZSBlbXVsYXRvcgorCit0eXBlZGVmIHN0cnVjdCBVaUVtdUFnZW50IHsKKyAgICBjb25zdCBzdHJ1Y3QgUUFuZHJvaWRCYXR0ZXJ5QWdlbnQqIGJhdHRlcnk7CisgICAgY29uc3Qgc3RydWN0IFFBbmRyb2lkQ2VsbHVsYXJBZ2VudCogY2VsbHVsYXI7CisgICAgY29uc3Qgc3RydWN0IFFBbmRyb2lkQ2xpcGJvYXJkQWdlbnQqIGNsaXBib2FyZDsKKyAgICBjb25zdCBzdHJ1Y3QgUUFuZHJvaWRFbXVsYXRvcldpbmRvd0FnZW50KiB3aW5kb3c7CisgICAgY29uc3Qgc3RydWN0IFFBbmRyb2lkRmluZ2VyQWdlbnQqIGZpbmdlcjsKKyAgICBjb25zdCBzdHJ1Y3QgUUFuZHJvaWRMb2NhdGlvbkFnZW50KiBsb2NhdGlvbjsKKyAgICBjb25zdCBzdHJ1Y3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIHNlbnNvcnM7CisgICAgY29uc3Qgc3RydWN0IFFBbmRyb2lkVGVsZXBob255QWdlbnQqIHRlbGVwaG9ueTsKKyAgICBjb25zdCBzdHJ1Y3QgUUFuZHJvaWRVc2VyRXZlbnRBZ2VudCogdXNlckV2ZW50czsKKyAgICBjb25zdCBzdHJ1Y3QgU2V0dGluZ3NBZ2VudCogc2V0dGluZ3M7Cit9IFVpRW11QWdlbnQ7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdW5jb21wcmVzcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdW5jb21wcmVzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkNjYyMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91bmNvbXByZXNzLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgInpsaWIuaCIKKworYm9vbCB1bmNvbXByZXNzX2d6aXBTdHJlYW0odWludDhfdCogZHN0LCBzaXplX3QqIGRzdExlbiwgY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNMZW4pIHsKKyAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgc3RyZWFtLm5leHRfaW4gPSAoQnl0ZWYqKXNyYzsKKyAgICBzdHJlYW0uYXZhaWxfaW4gPSBzcmNMZW47CisgICAgc3RyZWFtLm5leHRfb3V0ID0gZHN0OworICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAqZHN0TGVuOworICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOworICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKworICAgIC8vIG1hZ2ljIG51bWJlciBmcm9tIGd6X3JlYWQKKyAgICBjb25zdCBpbnQgR1pJUF9XSU5ET1dfQklUUyA9IDE1ICsgMTY7CisKKyAgICBpbnQgcmVzdWx0ID0gaW5mbGF0ZUluaXQyKCZzdHJlYW0sIEdaSVBfV0lORE9XX0JJVFMpOworICAgIGlmIChyZXN1bHQgIT0gWl9PSykgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJlc3VsdCA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworICAgICpkc3RMZW4gPSBzdHJlYW0udG90YWxfb3V0OworICAgIGlmIChyZXN1bHQgPT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIHJlc3VsdCA9IGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBwcmVzZXJ2ZSBlcnJvciBjb2RlCisgICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQgPT0gWl9PSzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91bmNvbXByZXNzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMWJjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdW5jb21wcmVzcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIHVuY29tcHJlc3MgYSBnemlwIGZpbGUgaW4gbWVtb3J5IGludG8gbWVtb3J5IGluIG9uZSBmdW5jdGlvbiBjYWxsCisvLyB0aGUgZHN0TGVuIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSBkZWNvbXByZXNzZWQgZGF0YQorLy8KKy8vIHNyYyAtIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3ppcCBmaWxlIGRhdGEKKy8vIHNyY0xlbiAtIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZ3ppcCBmaWxlCisvLyBkc3QgLSBwb2ludGVyIHRoYXQgcmVjZWl2ZXMgdGhlIGRlY29tcHJlc3NlZCBieXRlcworLy8gZHN0TGVuIC0gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgZGVjb21wcmVzc2VkIGRhdGEKKy8vCisvLyByZXR1cm4gdmFsdWVzCisvLyB0cnVlIC0gYWxsIGRhdGEgZGVjb21wcmVzc2VkIGNvcnJlY3RseQorLy8gZmFsc2UgLSBkc3QgYnVmZmVyIHRvbyBzbWFsbCBvciBjb3JydXB0IHpzdHJlYW0gb3Igb3V0IG9mIG1lbW9yeQorLy8gfGRzdExlbnwgaG9sZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gZHN0Citib29sIHVuY29tcHJlc3NfZ3ppcFN0cmVhbSh1aW50OF90KiBkc3QsIHNpemVfdCogZHN0TGVuLCBjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjTGVuKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL0lWZXJzaW9uRXh0cmFjdG9yLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL0lWZXJzaW9uRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhODZkMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91cGRhdGUtY2hlY2svSVZlcnNpb25FeHRyYWN0b3IuaApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNS0yMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9WZXJzaW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWcuaCIKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVwZGF0ZV9jaGVjayB7CisKKy8vIEludGVyZmFjZSBJVmVyc2lvbkV4dHJhY3RvciAtIGV4dHJhY3QgYWxsIGVtdWxhdG9yIHZlcnNpb25zCisvLyB3aXRoIHRoZWlyIHVwZGF0ZSBjaGFubmVscyBmcm9tIHRoZSB4bWwgbWFuaWZlc3QKK2NsYXNzIElWZXJzaW9uRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICB1c2luZyBTdHJpbmdWaWV3ID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKKyAgICB1c2luZyBVcGRhdGVDaGFubmVsID0gYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsOworICAgIHVzaW5nIFZlcnNpb24gPSBhbmRyb2lkOjpiYXNlOjpWZXJzaW9uOworCisgICAgdXNpbmcgVmVyc2lvbnMgPSBzdGQ6Om1hcDxVcGRhdGVDaGFubmVsLCBWZXJzaW9uPjsKKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIHZlcnNpb25zIGJ5IGNoYW5uZWwgZXh0cmFjdGVkIGZyb20gdGhlIHxkYXRhfCwKKyAgICAvLyBvciBlbXB0eSBjb2xsZWN0aW9uIGlmIHRoZSBkYXRhIGZvcm1hdCBpcyBpbmNvcnJlY3QKKyAgICB2aXJ0dWFsIFZlcnNpb25zIGV4dHJhY3RWZXJzaW9ucyhTdHJpbmdWaWV3IGRhdGEpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gdmVyc2lvbgorICAgIHZpcnR1YWwgVmVyc2lvbiBnZXRDdXJyZW50VmVyc2lvbigpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfklWZXJzaW9uRXh0cmFjdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHVwZGF0ZV9jaGVjaworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91cGRhdGUtY2hlY2svVXBkYXRlQ2hlY2tlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTk3YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXIuY3BwCkBAIC0wLDAgKzEsMjc3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9JbmlGaWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0FzeW5jLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1VyaS5oIgorI2luY2x1ZGUgImFuZHJvaWQvY3VybC1zdXBwb3J0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQ29uZmlnRGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9TdHVkaW9Db25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay91cGRhdGVfY2hlY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZWxvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3ZlcnNpb24uaCIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjphc3luYzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ1B0cjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXc7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpVcmk7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpWZXJzaW9uOwordXNpbmcgYW5kcm9pZDo6dXBkYXRlX2NoZWNrOjpVcGRhdGVDaGVja2VyOworCitzdGF0aWMgY29uc3QgY2hhciBrRGF0YUZpbGVOYW1lW10gPSAiZW11LXVwZGF0ZS1sYXN0LWNoZWNrLmluaSI7CisvLyBUT0RPOiBrVmVyc2lvblVybCBzaG91bGQgbm90IGJlIGZpeGVkOyBYWSBpbiByZXBvc2l0b3J5LVhZLnhtbAorLy8gICAgICAgbWlnaHQgY2hhbmdlIHdpdGggc3R1ZGlvIHVwZGF0ZXMgaXJyZWxldmFudCB0byB0aGUgZW11bGF0b3IKK3N0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBrVmVyc2lvblVybCA9CisgICAgICAgICJodHRwczovL2RsLmdvb2dsZS5jb20vYW5kcm9pZC9yZXBvc2l0b3J5L3JlcG9zaXRvcnkyLTEueG1sIjsKKworc3RhdGljIGNvbnN0IGNoYXIga05ld2VyVmVyc2lvbk1lc3NhZ2VbXSA9CisgICAgICAgIFIiKFlvdXIgZW11bGF0b3IgaXMgb3V0IG9mIGRhdGUsIHBsZWFzZSB1cGRhdGUgYnkgbGF1bmNoaW5nIEFuZHJvaWQgU3R1ZGlvOgorIC0gU3RhcnQgQW5kcm9pZCBTdHVkaW8KKyAtIFNlbGVjdCBtZW51ICJUb29scyA+IEFuZHJvaWQgPiBTREsgTWFuYWdlciIKKyAtIENsaWNrICJTREsgVG9vbHMiIHRhYgorIC0gQ2hlY2sgIkFuZHJvaWQgU0RLIFRvb2xzIiBjaGVja2JveAorIC0gQ2xpY2sgIk9LIgorKSI7CisKK3ZvaWQgYW5kcm9pZF9jaGVja0ZvclVwZGF0ZXMoY29uc3QgY2hhciogY29yZVZlcnNpb24pIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VXBkYXRlQ2hlY2tlcj4gY2hlY2tlcihuZXcgVXBkYXRlQ2hlY2tlcihjb3JlVmVyc2lvbikpOworCisgICAgaWYgKGNoZWNrZXItPmluaXQoKSAmJiBjaGVja2VyLT5uZWVkc0NoZWNrKCkgJiYgY2hlY2tlci0+cnVuQXN5bmNDaGVjaygpKSB7CisgICAgICAgIC8vIGNoZWNrZXIgd2lsbCBkZWxldGUgaXRzZWxmIGFmdGVyIHRoZSBjaGVjayBpbiB0aGUgd29ya2VyIHRocmVhZAorICAgICAgICBjaGVja2VyLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBWRVJCT1NFX1BSSU5UKHVwZGF0ZXIsICJVcGRhdGVDaGVja2VyOiBza2lwcGVkIHZlcnNpb24gY2hlY2siKTsKKyAgICB9Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1cGRhdGVfY2hlY2sgeworCitzdGF0aWMgc2l6ZV90IGN1cmxXcml0ZUNhbGxiYWNrKGNoYXIqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5tZW1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VycCkgeworICAgIGF1dG8mIHhtbCA9ICpzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZyo+KHVzZXJwKTsKKyAgICBjb25zdCBzaXplX3QgdG90YWwgPSBzaXplICogbm1lbWI7CisKKyAgICB4bWwuaW5zZXJ0KHhtbC5lbmQoKSwgY29udGVudHMsIGNvbnRlbnRzICsgdG90YWwpOworCisgICAgcmV0dXJuIHRvdGFsOworfQorCitjbGFzcyBEYXRhTG9hZGVyIGZpbmFsIDogcHVibGljIElEYXRhTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBEYXRhTG9hZGVyKFN0cmluZ1ZpZXcgY29yZVZlcnNpb24pIDogbUNvcmVWZXJzaW9uKGNvcmVWZXJzaW9uKSB7fQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBsb2FkKCkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnN0cmluZyB4bWw7CisgICAgICAgIHN0ZDo6c3RyaW5nIHVybCA9IGtWZXJzaW9uVXJsOworICAgICAgICBpZiAoIW1Db3JlVmVyc2lvbi5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvJiBpZCA9IGFuZHJvaWQ6OnN0dWRpbzo6Z2V0SW5zdGFsbGF0aW9uSWQoKTsKKyAgICAgICAgICAgIHVybCArPSBVcmk6OkZvcm1hdEVuY29kZUFyZ3VtZW50cygKKyAgICAgICAgICAgICAgICAgICAgIj90b29sPWVtdWxhdG9yJnVpZD0lcyZvcz0lcyIsIGlkLAorICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhTeXN0ZW06OmdldCgpLT5nZXRPc1R5cGUoKSkpOworICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBmaWVsZHMgd2hpY2ggbWF5IGNoYW5nZSBmcm9tIHJ1biB0byBydW46IHZlcnNpb24gYW5kCisgICAgICAgICAgICAvLyBjb3JlIHZlcnNpb24KKyAgICAgICAgICAgIHVybCArPSBnZXRWZXJzaW9uVXJpRmllbGRzKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZXJyb3IgPSBudWxscHRyOworICAgICAgICBpZiAoIWN1cmxfZG93bmxvYWQodXJsLmNfc3RyKCksIG51bGxwdHIsICZjdXJsV3JpdGVDYWxsYmFjaywgJnhtbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCJVcGRhdGVDaGVjazogRmFpbHVyZTogJXMiLCBlcnJvcik7CisgICAgICAgICAgICA6OmZyZWUoZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB4bWw7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRVbmlxdWVEYXRhS2V5KCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZ2V0VmVyc2lvblVyaUZpZWxkcygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBnZXRWZXJzaW9uVXJpRmllbGRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gVXJpOjpGb3JtYXRFbmNvZGVBcmd1bWVudHMoInZlcnNpb249IiBFTVVMQVRPUl9WRVJTSU9OX1NUUklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZjb3JlVmVyc2lvbj0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29yZVZlcnNpb24pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtQ29yZVZlcnNpb247Cit9OworCitjbGFzcyBUaW1lU3RvcmFnZSBmaW5hbCA6IHB1YmxpYyBJVGltZVN0b3JhZ2UgeworICAgIHVzaW5nIEluaUZpbGUgPSBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlOworCitwdWJsaWM6CisgICAgVGltZVN0b3JhZ2UoKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGNvbmZpZ1BhdGggPSBhbmRyb2lkOjpDb25maWdEaXJzOjpnZXRVc2VyRGlyZWN0b3J5KCk7CisgICAgICAgIG1EYXRhRmlsZU5hbWUgPSBQYXRoVXRpbHM6OmpvaW4oY29uZmlnUGF0aCwga0RhdGFGaWxlTmFtZSk7CisgICAgfQorCisgICAgflRpbWVTdG9yYWdlKCkgeworICAgICAgICBpZiAobUZpbGVMb2NrKSB7CisgICAgICAgICAgICBmaWxlbG9ja19yZWxlYXNlKG1GaWxlTG9jayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGxvY2soKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtRmlsZUxvY2spIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCJVcGRhdGVDaGVjazogbG9jaygpIGNhbGxlZCB0d2ljZSBieSB0aGUgc2FtZSBwcm9jZXNzIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1GaWxlTG9jayA9IGZpbGVsb2NrX2NyZWF0ZShtRGF0YUZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBpZiBzb21lb25lJ3MgYWxyZWFkeSBjaGVja2luZyBpdCAtIGRvbid0IGRvIGl0IHR3aWNlCisgICAgICAgIHJldHVybiBtRmlsZUxvY2sgIT0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB0aW1lX3QgZ2V0VGltZShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSB7CisgICAgICAgIEluaUZpbGUgZmlsZShtRGF0YUZpbGVOYW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLnJlYWQoKSkgeworICAgICAgICAgICAgLy8gbm8gZmlsZSBhdCBhbGwsIHJldHVybiB0aGUgbG93ZXN0IHBvc3NpYmxlIHRpbWVzdGFtcAorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsZS5nZXRJbnQ2NChJbmlGaWxlOjptYWtlVmFsaWRLZXkoa2V5KSwgMCk7CisgICAgfQorCisgICAgdm9pZCBzZXRUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHRpbWVfdCB0aW1lKSB7CisgICAgICAgIEluaUZpbGUgZmlsZShtRGF0YUZpbGVOYW1lKTsKKyAgICAgICAgZmlsZS5yZWFkKCk7ICAvLyB3aG8gY2FyZXMgaWYgaXQgZGlkbid0IGV4aXN0IC0gd2UnbGwgY3JlYXRlIGl0IGFueXdheQorICAgICAgICBmaWxlLnNldEludDY0KEluaUZpbGU6Om1ha2VWYWxpZEtleShrZXkpLCB0aW1lKTsKKyAgICAgICAgaWYgKCFmaWxlLndyaXRlKCkpIHsKKyAgICAgICAgICAgIGR3YXJuaW5nKCJVcGRhdGVDaGVjazogY291bGRuJ3Qgc2F2ZSB0aGUgZGF0YSBmaWxlIik7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbURhdGFGaWxlTmFtZTsKKyAgICBGaWxlTG9jayogbUZpbGVMb2NrID0gbnVsbHB0cjsKK307CisKK2NsYXNzIE5ld2VyVmVyc2lvblJlcG9ydGVyIGZpbmFsIDogcHVibGljIElOZXdlclZlcnNpb25SZXBvcnRlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHJlcG9ydE5ld2VyVmVyc2lvbigKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OlZlcnNpb24mIC8qZXhpc3RpbmcqLywKKyAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OlZlcnNpb24mIC8qbmV3ZXIqLykgb3ZlcnJpZGUgeworICAgICAgICBwcmludGYoIiVzXG4iLCBrTmV3ZXJWZXJzaW9uTWVzc2FnZSk7CisgICAgfQorfTsKKworVXBkYXRlQ2hlY2tlcjo6VXBkYXRlQ2hlY2tlcihjb25zdCBjaGFyKiBjb3JlVmVyc2lvbikKKyAgICA6IG1WZXJzaW9uRXh0cmFjdG9yKG5ldyBWZXJzaW9uRXh0cmFjdG9yKCkpLAorICAgICAgbURhdGFMb2FkZXIobmV3IERhdGFMb2FkZXIoY29yZVZlcnNpb24pKSwKKyAgICAgIG1UaW1lU3RvcmFnZShuZXcgVGltZVN0b3JhZ2UoKSksCisgICAgICBtUmVwb3J0ZXIobmV3IE5ld2VyVmVyc2lvblJlcG9ydGVyKCkpIHt9CisKK1VwZGF0ZUNoZWNrZXI6OlVwZGF0ZUNoZWNrZXIoSVZlcnNpb25FeHRyYWN0b3IqIGV4dHJhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURhdGFMb2FkZXIqIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRpbWVTdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTmV3ZXJWZXJzaW9uUmVwb3J0ZXIqIHJlcG9ydGVyKQorICAgIDogbVZlcnNpb25FeHRyYWN0b3IoZXh0cmFjdG9yKSwKKyAgICAgIG1EYXRhTG9hZGVyKGxvYWRlciksCisgICAgICBtVGltZVN0b3JhZ2Uoc3RvcmFnZSksCisgICAgICBtUmVwb3J0ZXIocmVwb3J0ZXIpIHt9CisKK2Jvb2wgVXBkYXRlQ2hlY2tlcjo6aW5pdCgpIHsKKyAgICBpZiAoIW1UaW1lU3RvcmFnZS0+bG9jaygpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBVcGRhdGVDaGVja2VyOjpuZWVkc0NoZWNrKCkgY29uc3QgeworICAgIGNvbnN0IHRpbWVfdCBub3cgPSBTeXN0ZW06OmdldCgpLT5nZXRVbml4VGltZSgpOworICAgIC8vIENoZWNrIG9ubHkgaWYgdGhlIHByZXZpb3VzIGNoZWNrIHdhcyA0KyBob3VycyBhZ28KKyAgICByZXR1cm4gbm93IC0gbVRpbWVTdG9yYWdlLT5nZXRUaW1lKG1EYXRhTG9hZGVyLT5nZXRVbmlxdWVEYXRhS2V5KCkpID49CisgICAgICAgICAgIDQgKiA2MCAqIDYwOworfQorCitib29sIFVwZGF0ZUNoZWNrZXI6OnJ1bkFzeW5jQ2hlY2soKSB7CisgICAgcmV0dXJuIGFzeW5jKFt0aGlzXSB7CisgICAgICAgIGFzeW5jV29ya2VyKCk7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0pOworfQorCit2b2lkIFVwZGF0ZUNoZWNrZXI6OmFzeW5jV29ya2VyKCkgeworICAgIFZlcnNpb24gY3VycmVudCA9IG1WZXJzaW9uRXh0cmFjdG9yLT5nZXRDdXJyZW50VmVyc2lvbigpOworICAgIGNvbnN0IGF1dG8gbGFzdCA9IGdldExhdGVzdFZlcnNpb24oKTsKKworICAgIGlmICghbGFzdCkgeworICAgICAgICAvLyBkb24ndCByZWNvcmQgdGhlIGxhc3QgY2hlY2sgdGltZSBpZiB3ZSB3ZXJlIG5vdCBhYmxlIHRvIHJldHJpZXZlCisgICAgICAgIC8vIHRoZSBsYXN0IHZlcnNpb24gLSBuZXh0IHRpbWUgd2UgbWF5IGJlIG1vcmUgbHVja3kKKyAgICAgICAgZHdhcm5pbmcoCisgICAgICAgICAgICAgICAgIlVwZGF0ZUNoZWNrOiBmYWlsZWQgdG8gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiwgc2tpcHBpbmcgIgorICAgICAgICAgICAgICAgICJjaGVjayAoY3VycmVudCB2ZXJzaW9uICclcycpIiwKKyAgICAgICAgICAgICAgICBjdXJyZW50LnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWRVJCT1NFX1BSSU5UKHVwZGF0ZXIsCisgICAgICAgICAgICAgICAgICAiVXBkYXRlQ2hlY2s6IGN1cnJlbnQgdmVyc2lvbiAnJXMnLCBsYXN0IHZlcnNpb24gJyVzJyIsCisgICAgICAgICAgICAgICAgICBjdXJyZW50LnRvU3RyaW5nKCkuY19zdHIoKSwgbGFzdC0+Zmlyc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKworICAgIGlmIChjdXJyZW50IDwgbGFzdC0+Zmlyc3QpIHsKKyAgICAgICAgbVJlcG9ydGVyLT5yZXBvcnROZXdlclZlcnNpb24oY3VycmVudCwgbGFzdC0+Zmlyc3QpOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCB2ZXJzaW9uIGNoZWNrIHRpbWUKKyAgICBtVGltZVN0b3JhZ2UtPnNldFRpbWUobURhdGFMb2FkZXItPmdldFVuaXF1ZURhdGFLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpnZXQoKS0+Z2V0VW5peFRpbWUoKSk7Cit9CisKK09wdGlvbmFsPFVwZGF0ZUNoZWNrZXI6OlZlcnNpb25JbmZvPiBVcGRhdGVDaGVja2VyOjpnZXRMYXRlc3RWZXJzaW9uKCkgeworICAgIGNvbnN0IGF1dG8gcmVwb3NpdG9yeVhtbCA9IG1EYXRhTG9hZGVyLT5sb2FkKCk7CisgICAgY29uc3QgYXV0byB2ZXJzaW9ucyA9IG1WZXJzaW9uRXh0cmFjdG9yLT5leHRyYWN0VmVyc2lvbnMocmVwb3NpdG9yeVhtbCk7CisgICAgaWYgKHZlcnNpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGNvbnN0IGF1dG8gdXBkYXRlQ2hhbm5lbCA9IGFuZHJvaWQ6OnN0dWRpbzo6dXBkYXRlQ2hhbm5lbCgpOworCisgICAgLy8gbm93IGZpbmQgdGhlIGZpcnN0IGNoYW5uZWwgd2hpY2ggaXMgZXF1YWwgdG8gb3IgbG93ZXIgdGhhbiB0aGUgc2VsZWN0ZWQKKyAgICAvLyB1cGRhdGUgY2hhbm5lbAorICAgIGNvbnN0IGF1dG8gZ3JlYXRlckl0ID0gdmVyc2lvbnMudXBwZXJfYm91bmQodXBkYXRlQ2hhbm5lbCk7CisgICAgaWYgKGdyZWF0ZXJJdCA9PSB2ZXJzaW9ucy5iZWdpbigpKSB7CisgICAgICAgIC8vIGV2ZW4gdGhlIGZpcnN0IHVwZGF0ZSBjaGFubmVsIGluIHRoZSBsaXN0IGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgICAgLy8gb25lIGZyb20gQW5kcm9pZCBTdHVkaW8gc2V0dGluZ3MKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGQ6OnByZXYoZ3JlYXRlckl0KS0+c2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnByZXYoZ3JlYXRlckl0KS0+Zmlyc3QpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXBkYXRlX2NoZWNrCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI5NmNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1ZlcnNpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay9JVmVyc2lvbkV4dHJhY3Rvci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8dGltZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdXBkYXRlX2NoZWNrIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKKworLy8gU2V0IG9mIGludGVyZmFjZXMgZm9yIHRoZSBvcGVyYXRpb25zIFVwZGF0ZUNoZWNrZXIgcGVyZm9ybXM6CisvLyAgSURhdGFMb2FkZXIgLSBkb3dubG9hZCB0aGUgeG1sIG1hbmlmZXN0IGZyb20gdGhlIFdlYiBzaXRlCisvLyAgSVRpbWVTdG9yYWdlIC0gbG9jayB0aGUgZmlsZSB0byBzdG9yZSBsYXN0IHVwZGF0ZSBjaGVja2luZyB0aW1lLAorLy8gICAgICAgICAgICAgICAgIHNhdmUvbG9hZCB0aW1lIGZyb20gdGhlIGZpbGUKKy8vICBJTmV3ZXJWZXJzaW9uUmVwb3J0ZXIgLSByZXBvcnQgdG8gdGhlIHVzZXIgYWJvdXQgYXZhaWxhYmxlIG5ld2VyIHZlcnNpb24KKworY2xhc3MgSURhdGFMb2FkZXIgeworcHVibGljOgorICAgIHZpcnR1YWwgfklEYXRhTG9hZGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBsb2FkKCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VW5pcXVlRGF0YUtleSgpID0gMDsKK307CisKK2NsYXNzIElUaW1lU3RvcmFnZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVRpbWVTdG9yYWdlKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBib29sIGxvY2soKSA9IDA7CisgICAgdmlydHVhbCB0aW1lX3QgZ2V0VGltZShjb25zdCBzdGQ6OnN0cmluZyYga2V5KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFRpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgdGltZV90IHRpbWUpID0gMDsKK307CisKK2NsYXNzIElOZXdlclZlcnNpb25SZXBvcnRlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SU5ld2VyVmVyc2lvblJlcG9ydGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIHJlcG9ydE5ld2VyVmVyc2lvbihjb25zdCBhbmRyb2lkOjpiYXNlOjpWZXJzaW9uJiBleGlzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OmJhc2U6OlZlcnNpb24mIG5ld2VyKSA9IDA7Cit9OworCisvLyBVcGRhdGVDaGVja2VyIC0gQ2xhc3MgdGhhdCBpbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIGZvciB1cGRhdGUgY2hlY2tpbmcKKy8vICBvbmNlIGEgZGF5LiBJdCBydW5zIHRoZSBjaGVjayBhc3luY2hyb25vdXNseSBhbmQgb25seSBpZiB0aGVyZSB3YXMgbm8KKy8vICBjaGVjayBwZXJmb3JtZWQgdG9kYXkuCisvLyAgVGhlIGNsYXNzIGNhbiBhbHNvIHJldHVybiB0aGUgdmVyc2lvbiB0aGF0IGl0IGRpc2NvdmVyZWQgaXMgYXZhaWxhYmxlLgorLy8KKy8vIFVzYWdlOgorLy8gICBUbyBjaGVjayB0aGUgdmVyc2lvbiBkYWlseToKKy8vICAgICBDcmVhdGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGR5bmFtaWNhbGx5LCBhbmQgaWYgaW5pdCgpIGFuZAorLy8gICAgIG5lZWRzQ2hlY2soKSByZXR1cm4gdHJ1ZSwgY2FsbCBydW5Bc3luY0NoZWNrKCkuIEl0IHdpbGwgZG8gdGhlCisvLyAgICAgY2hlY2tpbmcgYW5kIGRlbGV0ZSBpdHNlbGYgaWYgcnVuQXN5bmNDaGVjaygpIHJldHVybmVkIHRydWUuCisvLyAgICAgSWYgYW55IG9mIHRoZSBjYWxscyByZXR1cm5lZCBmYWxzZSwgb25lIGhhcyB0byBkZWxldGUgdGhlIG9iamVjdCBpdHNlbGYuCisvLworLy8gICBUbyBnZXQgdGhlIHZlcnNpb24gZGlzY292ZWQgYnkgdGhlIGxhc3QgJ3J1bkFzeW5jQ2hlY2soKSc6CisvLyAgICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBhbmQgY2FsbCBnZXRMYXRlc3RWZXJzaW9uKCkuCisKK2NsYXNzIFVwZGF0ZUNoZWNrZXIgeworcHVibGljOgorICAgIHVzaW5nIFZlcnNpb25JbmZvID0KKyAgICAgICAgc3RkOjpwYWlyPGFuZHJvaWQ6OmJhc2U6OlZlcnNpb24sIGFuZHJvaWQ6OnN0dWRpbzo6VXBkYXRlQ2hhbm5lbD47CisKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICB1c2luZyBPcHRpb25hbCA9IGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsPFQ+OworCisgICAgLy8gfGNvcmVWZXJzaW9ufCBpcyB0aGUgYXBwbGljYXRpb24ncyBjb3JlIHZlcnNpb24gKGUuZy4gcWVtdTIgMi4yLjApCisgICAgLy8gICAgICAnbnVsbHB0cicgbWVhbnMgJ2Rvbid0IHNlbmQgYW55IGVtdWxhdG9yLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZQorICAgIC8vICAgICAgcmVxdWVzdCwganVzdCBjaGVjayB0aGUgdmVyc2lvbgorICAgIGV4cGxpY2l0IFVwZGF0ZUNoZWNrZXIoY29uc3QgY2hhciogY29yZVZlcnNpb24gPSBudWxscHRyKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgYm9vbCBuZWVkc0NoZWNrKCkgY29uc3Q7CisKKyAgICBib29sIHJ1bkFzeW5jQ2hlY2soKTsKKworICAgIE9wdGlvbmFsPFZlcnNpb25JbmZvPiBnZXRMYXRlc3RWZXJzaW9uKCk7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBjb25zdHJ1Y3RvciBmb3IgdGVzdHMKKyAgICBVcGRhdGVDaGVja2VyKElWZXJzaW9uRXh0cmFjdG9yKiwKKyAgICAgICAgICAgICAgICAgIElEYXRhTG9hZGVyKiwKKyAgICAgICAgICAgICAgICAgIElUaW1lU3RvcmFnZSosCisgICAgICAgICAgICAgICAgICBJTmV3ZXJWZXJzaW9uUmVwb3J0ZXIqKTsKKworICAgIHZvaWQgYXN5bmNXb3JrZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZlcnNpb25FeHRyYWN0b3I+IG1WZXJzaW9uRXh0cmFjdG9yOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJRGF0YUxvYWRlcj4gbURhdGFMb2FkZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPElUaW1lU3RvcmFnZT4gbVRpbWVTdG9yYWdlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJTmV3ZXJWZXJzaW9uUmVwb3J0ZXI+IG1SZXBvcnRlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1cGRhdGVfY2hlY2sKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1VwZGF0ZUNoZWNrZXJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZhNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay9VcGRhdGVDaGVja2VyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91cGRhdGUtY2hlY2svVmVyc2lvbkV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9PcHRpb25hbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVmVyc2lvbi5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVwZGF0ZV9jaGVjayB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlZlcnNpb247Cit1c2luZyBhbmRyb2lkOjpzdHVkaW86OlVwZGF0ZUNoYW5uZWw7CisKK2NsYXNzIE1vY2tWZXJzaW9uRXh0cmFjdG9yIDogcHVibGljIElWZXJzaW9uRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIFZlcnNpb25zIGV4dHJhY3RWZXJzaW9ucygKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcgZGF0YSkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICArK21FeHRyYWN0VmVyc2lvbkNhbGxDb3VudDsKKyAgICAgICAgRVhQRUNUX0VRKG1FeHRyYWN0VmVyc2lvbkRhdGFQYXJhbSwgZGF0YSk7CisgICAgICAgIHJldHVybiBtRXh0cmFjdFZlcnNpb25SZXN1bHQgPyBWZXJzaW9uc3t7VXBkYXRlQ2hhbm5lbDo6Q2FuYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptRXh0cmFjdFZlcnNpb25SZXN1bHR9fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVmVyc2lvbnN7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFZlcnNpb24gZ2V0Q3VycmVudFZlcnNpb24oKSBjb25zdCB7CisgICAgICAgICsrbUdldEN1cnJlbnRWZXJzaW9uQ2FsbENvdW50OworICAgICAgICByZXR1cm4gbUdldEN1cnJlbnRWZXJzaW9uUmVzdWx0OworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIG1FeHRyYWN0VmVyc2lvbkRhdGFQYXJhbTsKKyAgICBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDxWZXJzaW9uPiBtRXh0cmFjdFZlcnNpb25SZXN1bHQgPSB7ezAsIDAsIDB9fTsKKyAgICBtdXRhYmxlIGludCBtRXh0cmFjdFZlcnNpb25DYWxsQ291bnQgPSAwOworICAgIFZlcnNpb24gbUdldEN1cnJlbnRWZXJzaW9uUmVzdWx0ID0gezAsIDAsIDB9OworICAgIG11dGFibGUgaW50IG1HZXRDdXJyZW50VmVyc2lvbkNhbGxDb3VudCA9IDA7Cit9OworCitjbGFzcyBNb2NrRGF0YUxvYWRlciA6IHB1YmxpYyBJRGF0YUxvYWRlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBsb2FkKCkgb3ZlcnJpZGUgeworICAgICAgICArK21Mb2FkQ2FsbENvdW50OworICAgICAgICByZXR1cm4gbUxvYWRSZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRVbmlxdWVEYXRhS2V5KCkgb3ZlcnJpZGUgeworICAgICAgICArK21HZXRVbmlxdWVEYXRhS2V5Q2FsbENvdW50OworICAgICAgICByZXR1cm4gbVVuaXF1ZURhdGFLZXk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgbUxvYWRSZXN1bHQ7CisgICAgaW50IG1Mb2FkQ2FsbENvdW50ID0gMDsKKworICAgIHN0ZDo6c3RyaW5nIG1VbmlxdWVEYXRhS2V5OworICAgIGludCBtR2V0VW5pcXVlRGF0YUtleUNhbGxDb3VudCA9IDA7Cit9OworCitjbGFzcyBNb2NrVGltZVN0b3JhZ2UgOiBwdWJsaWMgSVRpbWVTdG9yYWdlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgbG9jaygpIG92ZXJyaWRlIHsKKyAgICAgICAgKyttTG9ja0NhbGxDb3VudDsKKyAgICAgICAgcmV0dXJuIG1Mb2NrUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdGltZV90IGdldFRpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGtleSkgb3ZlcnJpZGUgeworICAgICAgICBFWFBFQ1RfU1RSRVEobUtleVBhcmFtLmNfc3RyKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgKyttR2V0VGltZUNhbGxDb3VudDsKKyAgICAgICAgcmV0dXJuIG1HZXRUaW1lUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZXRUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHRpbWVfdCB0aW1lKSBvdmVycmlkZSB7CisgICAgICAgIEVYUEVDVF9TVFJFUShtS2V5UGFyYW0uY19zdHIoKSwga2V5LmNfc3RyKCkpOworICAgICAgICArK21TZXRUaW1lQ2FsbENvdW50OworICAgICAgICBFWFBFQ1RfRVEobVNldFRpbWVQYXJhbSwgdGltZSk7CisgICAgfQorCisgICAgaW50IG1Mb2NrQ2FsbENvdW50ID0gMDsKKyAgICBpbnQgbUdldFRpbWVDYWxsQ291bnQgPSAwOworICAgIGludCBtU2V0VGltZUNhbGxDb3VudCA9IDA7CisgICAgYm9vbCBtTG9ja1Jlc3VsdCA9IGZhbHNlOworICAgIHRpbWVfdCBtR2V0VGltZVJlc3VsdCA9IDA7CisgICAgdGltZV90IG1TZXRUaW1lUGFyYW0gPSAwOworICAgIHN0ZDo6c3RyaW5nIG1LZXlQYXJhbTsKK307CisKK2NsYXNzIE1vY2tOZXdlclZlcnNpb25SZXBvcnRlciA6IHB1YmxpYyBJTmV3ZXJWZXJzaW9uUmVwb3J0ZXIgeworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCByZXBvcnROZXdlclZlcnNpb24oY29uc3QgVmVyc2lvbiYgZXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZXJzaW9uJiBuZXdlcikgeworICAgICAgICBFWFBFQ1RfRVEobVJlcG9ydE5ld2VyVmVyc2lvbkV4aXN0aW5nUGFyYW0sIGV4aXN0aW5nKTsKKyAgICAgICAgRVhQRUNUX0VRKG1SZXBvcnROZXdlclZlcnNpb25OZXdlclBhcmFtLCBuZXdlcik7CisgICAgICAgICsrbVJlcG9ydE5ld2VyVmVyc2lvbkNhbGxDb3VudDsKKyAgICB9CisKKyAgICBWZXJzaW9uIG1SZXBvcnROZXdlclZlcnNpb25FeGlzdGluZ1BhcmFtID0gezAsIDAsIDB9OworICAgIFZlcnNpb24gbVJlcG9ydE5ld2VyVmVyc2lvbk5ld2VyUGFyYW0gPSB7MCwgMCwgMH07CisgICAgaW50IG1SZXBvcnROZXdlclZlcnNpb25DYWxsQ291bnQgPSAwOworfTsKKworY2xhc3MgVGVzdFVwZGF0ZUNoZWNrZXIgOiBwdWJsaWMgVXBkYXRlQ2hlY2tlciB7CitwdWJsaWM6CisgICAgVGVzdFVwZGF0ZUNoZWNrZXIoSVZlcnNpb25FeHRyYWN0b3IqIGV4dHJhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBJRGF0YUxvYWRlciogbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgIElUaW1lU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBJTmV3ZXJWZXJzaW9uUmVwb3J0ZXIqIHJlcG9ydGVyKQorICAgICAgICA6IFVwZGF0ZUNoZWNrZXIoZXh0cmFjdG9yLCBsb2FkZXIsIHN0b3JhZ2UsIHJlcG9ydGVyKSB7fQorCisgICAgLy8gbWFrZSBpdCBwdWJsaWMgZm9yIHRlc3RpbmcKKyAgICB1c2luZyBVcGRhdGVDaGVja2VyOjphc3luY1dvcmtlcjsKK307CisKK2NsYXNzIFRlc3REYXRhIHsKK3B1YmxpYzoKKyAgICBUZXN0RGF0YSgpIDogbVN5c3RlbSgiIiwgMzIpIHsKKyAgICAgICAgbVN5c3RlbS5nZXRUZW1wUm9vdCgpOworICAgICAgICBtRGF0YUxvYWRlciA9IG5ldyBNb2NrRGF0YUxvYWRlcigpOworICAgICAgICBtUmVwb3J0ZXIgPSBuZXcgTW9ja05ld2VyVmVyc2lvblJlcG9ydGVyKCk7CisgICAgICAgIG1UaW1lU3RvcmFnZSA9IG5ldyBNb2NrVGltZVN0b3JhZ2UoKTsKKyAgICAgICAgbVZlcnNpb25FeHRyYWN0b3IgPSBuZXcgTW9ja1ZlcnNpb25FeHRyYWN0b3IoKTsKKyAgICAgICAgbVVDLnJlc2V0KG5ldyBUZXN0VXBkYXRlQ2hlY2tlcihtVmVyc2lvbkV4dHJhY3RvciwgbURhdGFMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVTdG9yYWdlLCBtUmVwb3J0ZXIpKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VGVzdFVwZGF0ZUNoZWNrZXI+IG1VQzsKKyAgICBNb2NrRGF0YUxvYWRlciogbURhdGFMb2FkZXI7CisgICAgTW9ja05ld2VyVmVyc2lvblJlcG9ydGVyKiBtUmVwb3J0ZXI7CisgICAgTW9ja1RpbWVTdG9yYWdlKiBtVGltZVN0b3JhZ2U7CisgICAgTW9ja1ZlcnNpb25FeHRyYWN0b3IqIG1WZXJzaW9uRXh0cmFjdG9yOworICAgIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW0gbVN5c3RlbTsKK307CisKK1RFU1QoVXBkYXRlQ2hlY2tlciwgaW5pdCkgeworICAgIFRlc3REYXRhIHRlc3Q7CisgICAgdGVzdC5tVGltZVN0b3JhZ2UtPm1Mb2NrUmVzdWx0ID0gZmFsc2U7CisgICAgRVhQRUNUX0ZBTFNFKHRlc3QubVVDLT5pbml0KCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0Lm1UaW1lU3RvcmFnZS0+bUxvY2tDYWxsQ291bnQpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgdGVzdC5tVGltZVN0b3JhZ2UtPm1Mb2NrUmVzdWx0ID0gdHJ1ZTsKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0Lm1VQy0+aW5pdCgpKTsKKyAgICBFWFBFQ1RfRVEoMiwgdGVzdC5tVGltZVN0b3JhZ2UtPm1Mb2NrQ2FsbENvdW50KTsKK30KKworVEVTVChVcGRhdGVDaGVja2VyLCBuZWVkc0NoZWNrKSB7CisgICAgVGVzdERhdGEgdGVzdDsKKyAgICAvLyBzZXQgbGFzdCBjaGVjayB0aW1lIGFuZCBjdXJyZW50IHRpbWUgdG8gYmUgY2xvc2UgZW5vdWdoIC0KKyAgICAvLyBubyBuZXcgY2hlY2sgaXMgbmVlZGVkCisgICAgdGVzdC5tVGltZVN0b3JhZ2UtPm1LZXlQYXJhbSA9IHRlc3QubURhdGFMb2FkZXItPm1VbmlxdWVEYXRhS2V5ID0gImtleSI7CisgICAgdGVzdC5tVGltZVN0b3JhZ2UtPm1HZXRUaW1lUmVzdWx0ID0gdGltZV90KDEpOworICAgIHRlc3QubVN5c3RlbS5zZXRVbml4VGltZSh0aW1lX3QoMikpOworCisgICAgRVhQRUNUX0ZBTFNFKHRlc3QubVVDLT5uZWVkc0NoZWNrKCkpOworICAgIEVYUEVDVF9FUSgxLCB0ZXN0Lm1EYXRhTG9hZGVyLT5tR2V0VW5pcXVlRGF0YUtleUNhbGxDb3VudCk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3QubVRpbWVTdG9yYWdlLT5tR2V0VGltZUNhbGxDb3VudCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBub3cgc2V0IHRoZSBjdXJyZW50IHRpbWUgdG8gcmVxdWlyZSB0aGUgY2hlY2sgKCtvbmUgeWVhciBmcm9tIHRoZSBlcG9jaCkKKyAgICB0ZXN0Lm1TeXN0ZW0uc2V0VW5peFRpbWUodGltZV90KDM2NSAqIDI0ICogNjAgKiA2MCkpOworICAgIEVYUEVDVF9UUlVFKHRlc3QubVVDLT5uZWVkc0NoZWNrKCkpOworICAgIEVYUEVDVF9FUSgyLCB0ZXN0Lm1UaW1lU3RvcmFnZS0+bUdldFRpbWVDYWxsQ291bnQpOworfQorCitURVNUKFVwZGF0ZUNoZWNrZXIsIGdldFZlcnNpb24pIHsKKyAgICBUZXN0RGF0YSB0ZXN0OworCisgICAgdGVzdC5tRGF0YUxvYWRlci0+bUxvYWRSZXN1bHQgPQorICAgICAgICAgICAgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUV4dHJhY3RWZXJzaW9uRGF0YVBhcmFtID0gInRlc3QiOworICAgIHRlc3QubVZlcnNpb25FeHRyYWN0b3ItPm1FeHRyYWN0VmVyc2lvblJlc3VsdCA9IFZlcnNpb24oMSwgMCwgMCk7CisKKyAgICBhdXRvIHJldHVybmVkVmVyc2lvbiA9IHRlc3QubVVDLT5nZXRMYXRlc3RWZXJzaW9uKCk7CisgICAgRVhQRUNUX1RSVUUocmV0dXJuZWRWZXJzaW9uKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbigxLCAwLCAwKSwgcmV0dXJuZWRWZXJzaW9uLT5maXJzdCk7CisgICAgRVhQRUNUX0VRKFVwZGF0ZUNoYW5uZWw6OkNhbmFyeSwgcmV0dXJuZWRWZXJzaW9uLT5zZWNvbmQpOworfQorCitURVNUKFVwZGF0ZUNoZWNrZXIsIGFzeW5jV29ya2VyKSB7CisgICAgVGVzdERhdGEgdGVzdDsKKworICAgIC8vIGZpcnN0IHNldCB2ZXJzaW9uIHRvIGJlIHRoZSBuZXdlc3QKKyAgICB0ZXN0Lm1EYXRhTG9hZGVyLT5tTG9hZFJlc3VsdCA9CisgICAgICAgICAgICB0ZXN0Lm1WZXJzaW9uRXh0cmFjdG9yLT5tRXh0cmFjdFZlcnNpb25EYXRhUGFyYW0gPSAidGVzdCI7CisgICAgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUV4dHJhY3RWZXJzaW9uUmVzdWx0ID0gVmVyc2lvbigxLCAwLCAwKTsKKyAgICB0ZXN0Lm1WZXJzaW9uRXh0cmFjdG9yLT5tR2V0Q3VycmVudFZlcnNpb25SZXN1bHQgPSBWZXJzaW9uKDEsIDAsIDApOworICAgIHRlc3QubVN5c3RlbS5zZXRVbml4VGltZSh0aW1lX3QoMSkpOworICAgIHRlc3QubVRpbWVTdG9yYWdlLT5tS2V5UGFyYW0gPSB0ZXN0Lm1EYXRhTG9hZGVyLT5tVW5pcXVlRGF0YUtleSA9ICJrZXkiOworICAgIHRlc3QubVRpbWVTdG9yYWdlLT5tU2V0VGltZVBhcmFtID0gdGltZV90KDEpOworCisgICAgdGVzdC5tVUMtPmFzeW5jV29ya2VyKCk7CisgICAgRVhQRUNUX0VRKDEsIHRlc3QubURhdGFMb2FkZXItPm1Mb2FkQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMSwgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUV4dHJhY3RWZXJzaW9uQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMSwgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUdldEN1cnJlbnRWZXJzaW9uQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMSwgdGVzdC5tVGltZVN0b3JhZ2UtPm1TZXRUaW1lQ2FsbENvdW50KTsKKworICAgIC8vIGRpZG4ndCByZXBvcnQgdGhlIG5ld2VyIHZlcnNpb24KKyAgICBFWFBFQ1RfRVEoMCwgdGVzdC5tUmVwb3J0ZXItPm1SZXBvcnROZXdlclZlcnNpb25DYWxsQ291bnQpOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gbm93IHRoZXJlJ3MgYSBuZXdlciB2ZXJzaW9uIGF2YWlsYWJsZQorICAgIHRlc3QubVZlcnNpb25FeHRyYWN0b3ItPm1FeHRyYWN0VmVyc2lvblJlc3VsdCA9IFZlcnNpb24oMiwgMCwgMCk7CisgICAgdGVzdC5tUmVwb3J0ZXItPm1SZXBvcnROZXdlclZlcnNpb25FeGlzdGluZ1BhcmFtID0gVmVyc2lvbigxLCAwLCAwKTsKKyAgICB0ZXN0Lm1SZXBvcnRlci0+bVJlcG9ydE5ld2VyVmVyc2lvbk5ld2VyUGFyYW0gPSBWZXJzaW9uKDIsIDAsIDApOworCisgICAgdGVzdC5tVUMtPmFzeW5jV29ya2VyKCk7CisgICAgRVhQRUNUX0VRKDIsIHRlc3QubURhdGFMb2FkZXItPm1Mb2FkQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMiwgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUV4dHJhY3RWZXJzaW9uQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMiwgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUdldEN1cnJlbnRWZXJzaW9uQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMiwgdGVzdC5tVGltZVN0b3JhZ2UtPm1TZXRUaW1lQ2FsbENvdW50KTsKKworICAgIC8vIHJlcG9ydGVkIHRoZSBuZXdlciB2ZXJzaW9uCisgICAgRVhQRUNUX0VRKDEsIHRlc3QubVJlcG9ydGVyLT5tUmVwb3J0TmV3ZXJWZXJzaW9uQ2FsbENvdW50KTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIGZhaWxlZCB0byBnZXQgdGhlIGxhc3QgdmVyc2lvbgorICAgIHRlc3QubVZlcnNpb25FeHRyYWN0b3ItPm1FeHRyYWN0VmVyc2lvblJlc3VsdCA9IHt9OworCisgICAgdGVzdC5tVUMtPmFzeW5jV29ya2VyKCk7CisgICAgRVhQRUNUX0VRKDMsIHRlc3QubURhdGFMb2FkZXItPm1Mb2FkQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMywgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUV4dHJhY3RWZXJzaW9uQ2FsbENvdW50KTsKKyAgICBFWFBFQ1RfRVEoMywgdGVzdC5tVmVyc2lvbkV4dHJhY3Rvci0+bUdldEN1cnJlbnRWZXJzaW9uQ2FsbENvdW50KTsKKworICAgIC8vIGRpZG4ndCBzdG9yZSB0aGUgbGFzdCBjaGVjayB0aW1lCisgICAgRVhQRUNUX0VRKDIsIHRlc3QubVRpbWVTdG9yYWdlLT5tU2V0VGltZUNhbGxDb3VudCk7CisgICAgLy8gZGlkbid0IHJlcG9ydCB0aGUgbmV3ZXIgdmVyc2lvbgorICAgIEVYUEVDVF9FUSgxLCB0ZXN0Lm1SZXBvcnRlci0+bVJlcG9ydE5ld2VyVmVyc2lvbkNhbGxDb3VudCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1cGRhdGVfY2hlY2sKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1ZlcnNpb25FeHRyYWN0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzc2N2VlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDI0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJWZXJzaW9uRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQXJyYXlTaXplLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvTG9va3VwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC92ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKworI2luY2x1ZGUgPGxpYnhtbC90cmVlLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHVwZGF0ZV9jaGVjayB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OmZpbmRPckRlZmF1bHQ7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpPcHRpb25hbDsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlZlcnNpb247Cit1c2luZyBhbmRyb2lkOjpzdHVkaW86OlVwZGF0ZUNoYW5uZWw7CisKK2NvbnN0IGNoYXIqIGNvbnN0IFZlcnNpb25FeHRyYWN0b3I6OmtYbWxOYW1lc3BhY2UgPQorICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9yZXBvc2l0b3J5Mi8wMSI7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBEZWxldGVYbWxPYmplY3QgeworICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgIHZvaWQgb3BlcmF0b3IoKShUIHQpIGNvbnN0IHsKKyAgICAgICAgeG1sRnJlZSh0KTsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoeG1sRG9jUHRyIGRvYykgY29uc3QgeyB4bWxGcmVlRG9jKGRvYyk7IH0KK307Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgeG1sQXV0b1B0ciA9IHN0ZDo6dW5pcXVlX3B0cjxULCBEZWxldGVYbWxPYmplY3Q+OworCitzdGF0aWMgT3B0aW9uYWw8VmVyc2lvbjo6Q29tcG9uZW50VHlwZT4gcGFyc2VJbnQoY29uc3QgeG1sQ2hhciogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0b3BDaGFycyA9ICIiKSB7CisgICAgaWYgKCFzdHIpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIGNoYXIqIGVuZDsKKyAgICBlcnJubyA9IDA7CisgICAgY29uc3QgYXV0byB2YWx1ZSA9IHN0cnRvdWwocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3RyKSwgJmVuZCwgMTApOworICAgIGlmIChlcnJubyB8fCBzdHJjaHIoc3RvcENoYXJzLCAqZW5kKSA9PSBudWxscHRyIHx8CisgICAgICAgIHZhbHVlID4gc3RkOjpudW1lcmljX2xpbWl0czxWZXJzaW9uOjpDb21wb25lbnRUeXBlPjo6bWF4KCkgfHwKKyAgICAgICAgdmFsdWUgPT0gVmVyc2lvbjo6a05vbmUpIHsKKyAgICAgICAgZHdhcm5pbmcoIlVwZGF0ZUNoZWNrOiBpbnZhbGlkIHZhbHVlIG9mIGEgdmVyc2lvbiBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmVyc2lvbjo6Q29tcG9uZW50VHlwZT4odmFsdWUpOworfQorCitzdGF0aWMgY29uc3QgeG1sQ2hhciogZ2V0Q29udGVudCh4bWxOb2RlUHRyIG5vZGUpIHsKKyAgICAvLyBsaWJ4bWwyIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZSBvZiB0aGUgbm9kZSBjb250ZW50OgorICAgIC8vIDxhPmFhYTwvYT4gLT4KKyAgICAvLyAgeG1sTm9kZShuYW1lID0gImEiLCB0eXBlPWVsZW1lbnRfbm9kZSkKKyAgICAvLyAgICAtPiBmaXJzdCBjaGlsZCB4bWxOb2RlKG5hbWUgPSAidGV4dCIsIHR5cGU9ZWxlbWVudF90ZXh0KQorICAgIC8vICAgICAgLT5jb250ZW50CisgICAgaWYgKG5vZGUtPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSB8fCAhbm9kZS0+Y2hpbGRyZW4gfHwKKyAgICAgICAgbm9kZS0+Y2hpbGRyZW4tPnR5cGUgIT0gWE1MX1RFWFRfTk9ERSB8fCAhbm9kZS0+Y2hpbGRyZW4tPmNvbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHJldHVybiBub2RlLT5jaGlsZHJlbi0+Y29udGVudDsKK30KKworc3RhdGljIHN0ZDo6cGFpcjxWZXJzaW9uLCBzdGQ6OnN0cmluZz4gcGFyc2VWZXJzaW9uKHhtbE5vZGVQdHIgbm9kZSkgeworICAgIE9wdGlvbmFsPFZlcnNpb246OkNvbXBvbmVudFR5cGU+IG1ham9yLCBtaW5vciwgbWljcm8sIGJ1aWxkOworICAgIHhtbE5vZGVQdHIgcmV2Tm9kZSA9IG51bGxwdHI7CisgICAgc3RkOjpzdHJpbmcgY2hhbm5lbE5hbWU7CisKKyAgICBmb3IgKGF1dG8gY2hpbGQgPSBub2RlLT5jaGlsZHJlbjsKKyAgICAgICAgIGNoaWxkICYmICghcmV2Tm9kZSB8fCAhYnVpbGQgfHwgY2hhbm5lbE5hbWUuZW1wdHkoKSk7CisgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmIChjaGlsZC0+dHlwZSA9PSBYTUxfQ09NTUVOVF9OT0RFICYmIGNoaWxkLT5jb250ZW50KSB7CisgICAgICAgICAgICAvLyB0aGUgY29tbWVudCB3aXRoIGJ1aWxkIG51bWJlciBoYXMgYSBzdHJpbmcgImJpZDo8YnVpbGQ+IgorICAgICAgICAgICAgY29uc3QgYXV0byBidWlsZFN0ciA9IHhtbFN0cnN0cihjaGlsZC0+Y29udGVudCwgQkFEX0NBU1QgImJpZDoiKTsKKyAgICAgICAgICAgIGlmIChidWlsZFN0cikgeworICAgICAgICAgICAgICAgIGJ1aWxkID0gcGFyc2VJbnQoYnVpbGRTdHIgKyBTVFJJTkdfTElURVJBTF9MRU5HVEgoImJpZDoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIFxyXG5cdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLT50eXBlID09IFhNTF9FTEVNRU5UX05PREUgJiYKKyAgICAgICAgICAgICAgICAgICB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIEJBRF9DQVNUICJyZXZpc2lvbiIpID09IDApIHsKKyAgICAgICAgICAgIHJldk5vZGUgPSBjaGlsZDsKKyAgICAgICAgfSBlbHNlIGlmIChjaGlsZC0+dHlwZSA9PSBYTUxfRUxFTUVOVF9OT0RFICYmCisgICAgICAgICAgICAgICAgICAgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCBCQURfQ0FTVCAiY2hhbm5lbFJlZiIpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IHhtbEF1dG9QdHI8eG1sQ2hhcj4gY2hhbm5lbFJlZigKKyAgICAgICAgICAgICAgICAgICAgeG1sR2V0UHJvcChjaGlsZCwgQkFEX0NBU1QgInJlZiIpKTsKKyAgICAgICAgICAgIGlmIChjaGFubmVsUmVmKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbE5hbWUgPSBzdGQ6OnN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNoYW5uZWxSZWYuZ2V0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmV2Tm9kZSkgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgZm9yICh4bWxOb2RlUHRyIHZlclBhcnQgPSByZXZOb2RlLT5jaGlsZHJlbjsgdmVyUGFydDsKKyAgICAgICAgIHZlclBhcnQgPSB2ZXJQYXJ0LT5uZXh0KSB7CisgICAgICAgIGNvbnN0IGF1dG8gY29udGVudCA9IGdldENvbnRlbnQodmVyUGFydCk7CisgICAgICAgIGlmIChjb25zdCBhdXRvIHZhbCA9IHBhcnNlSW50KGNvbnRlbnQpKSB7CisgICAgICAgICAgICBpZiAoeG1sU3RyY21wKHZlclBhcnQtPm5hbWUsIEJBRF9DQVNUICJtYWpvciIpID09IDApIHsKKyAgICAgICAgICAgICAgICBtYWpvciA9IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeG1sU3RyY21wKHZlclBhcnQtPm5hbWUsIEJBRF9DQVNUICJtaW5vciIpID09IDApIHsKKyAgICAgICAgICAgICAgICBtaW5vciA9IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeG1sU3RyY21wKHZlclBhcnQtPm5hbWUsIEJBRF9DQVNUICJtaWNybyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBtaWNybyA9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbWFqb3IgfHwgIW1pbm9yIHx8ICFtaWNybykgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgcmV0dXJuIHtWZXJzaW9uKCptYWpvciwgKm1pbm9yLCAqbWljcm8sIGJ1aWxkLnZhbHVlT3IoMCkpLAorICAgICAgICAgICAgc3RkOjptb3ZlKGNoYW5uZWxOYW1lKX07Cit9CisKK3N0YXRpYyBVcGRhdGVDaGFubmVsIHBhcnNlVXBkYXRlQ2hhbm5lbE5hbWUoY29uc3QgeG1sQ2hhciogbmFtZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgTmFtZWRDaGFubmVsIHsKKyAgICAgICAgY29uc3QgeG1sQ2hhciogbmFtZTsKKyAgICAgICAgVXBkYXRlQ2hhbm5lbCBjaGFubmVsOworICAgIH0gY2hhbm5lbHNbXSA9IHt7QkFEX0NBU1QgInN0YWJsZSIsIFVwZGF0ZUNoYW5uZWw6OlN0YWJsZX0sCisgICAgICAgICAgICAgICAgICAgIHtCQURfQ0FTVCAiYmV0YSIsIFVwZGF0ZUNoYW5uZWw6OkJldGF9LAorICAgICAgICAgICAgICAgICAgICB7QkFEX0NBU1QgImRldiIsIFVwZGF0ZUNoYW5uZWw6OkRldn0sCisgICAgICAgICAgICAgICAgICAgIHtCQURfQ0FTVCAiY2FuYXJ5IiwgVXBkYXRlQ2hhbm5lbDo6Q2FuYXJ5fX07CisgICAgY29uc3QgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihzdGQ6OmJlZ2luKGNoYW5uZWxzKSwgc3RkOjplbmQoY2hhbm5lbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdKGNvbnN0IE5hbWVkQ2hhbm5lbCYgbmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG1sU3RyY21wKG5jLm5hbWUsIG5hbWUpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoaXQgPT0gc3RkOjplbmQoY2hhbm5lbHMpKSB7CisgICAgICAgIHJldHVybiBVcGRhdGVDaGFubmVsOjpVbmtub3duOworICAgIH0KKworICAgIHJldHVybiBpdC0+Y2hhbm5lbDsKK30KKworSVZlcnNpb25FeHRyYWN0b3I6OlZlcnNpb25zIFZlcnNpb25FeHRyYWN0b3I6OmV4dHJhY3RWZXJzaW9ucygKKyAgICAgICAgU3RyaW5nVmlldyBkYXRhKSBjb25zdCB7CisgICAgLy8gbWFrZSBzdXJlIGxpYnhtbDIgaXMgaW5pdGlhbGl6ZWQgYW5kIGlzIG9mIHByb3BlciB2ZXJzaW9uCisgICAgTElCWE1MX1RFU1RfVkVSU0lPTgorCisgICAgY29uc3QgeG1sQXV0b1B0cjx4bWxEb2M+IGRvYygKKyAgICAgICAgICAgIHhtbFJlYWRNZW1vcnkoZGF0YS5jX3N0cigpLCBkYXRhLnNpemUoKSwgIm5vbmUueG1sIiwgbnVsbHB0ciwgMCkpOworICAgIGlmICghZG9jKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBjb25zdCB4bWxOb2RlUHRyIHJvb3QgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MuZ2V0KCkpOworICAgIGlmICghcm9vdC0+bnMgfHwgeG1sU3RyY21wKHJvb3QtPm5zLT5ocmVmLCBCQURfQ0FTVCBrWG1sTmFtZXNwYWNlKSAhPSAwKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIFVwZGF0ZUNoYW5uZWw+IGNoYW5uZWxNYXA7CisgICAgVmVyc2lvbnMgcmVzOworCisgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZG9jdW1lbnQgYW5kIGZpbmQgYWxsIDx0b29sPiBvbmVzCisgICAgZm9yICh4bWxOb2RlUHRyIG5vZGUgPSByb290LT5jaGlsZHJlbjsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKG5vZGUtPnR5cGUgIT0gWE1MX0VMRU1FTlRfTk9ERSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhtbFN0cmNtcChub2RlLT5uYW1lLCBCQURfQ0FTVCAiY2hhbm5lbCIpID09IDApIHsKKyAgICAgICAgICAgIC8vIDxjaGFubmVsIGlkPSJpZCI+bmFtZTwvY2hhbm5lbD4KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gY2hhbm5lbE5hbWUgPSBnZXRDb250ZW50KG5vZGUpOworICAgICAgICAgICAgaWYgKCFjaGFubmVsTmFtZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgeG1sQXV0b1B0cjx4bWxDaGFyPiBpZCh4bWxHZXRQcm9wKG5vZGUsIEJBRF9DQVNUICJpZCIpKTsKKyAgICAgICAgICAgIGlmICghaWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IFVwZGF0ZUNoYW5uZWwgY2hhbm5lbCA9IHBhcnNlVXBkYXRlQ2hhbm5lbE5hbWUoY2hhbm5lbE5hbWUpOworICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT0gVXBkYXRlQ2hhbm5lbDo6VW5rbm93bikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbE1hcFtzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpZC5nZXQoKSkpXSA9CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw7CisgICAgICAgIH0gZWxzZSBpZiAoeG1sU3RyY21wKG5vZGUtPm5hbWUsIEJBRF9DQVNUICJyZW1vdGVQYWNrYWdlIikgPT0gMCkgeworICAgICAgICAgICAgLy8gPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPgorICAgICAgICAgICAgLy8gICF2ZXJzaW9uCisgICAgICAgICAgICAvLyAgIWNoYW5uZWwgaW5mbworICAgICAgICAgICAgLy8gICFidWlsZCBpbmZvCisgICAgICAgICAgICAvLyA8L3Jldm90ZVBhY2hhZ2U+CisgICAgICAgICAgICB4bWxBdXRvUHRyPHhtbENoYXI+IHBhdGhWYWwoeG1sR2V0UHJvcChub2RlLCBCQURfQ0FTVCAicGF0aCIpKTsKKyAgICAgICAgICAgIGlmICghcGF0aFZhbCB8fCB4bWxTdHJjbXAocGF0aFZhbC5nZXQoKSwgQkFEX0NBU1QgInRvb2xzIikgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWZXJzaW9uIG5vZGVWZXI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjaGFubmVsTmFtZTsKKyAgICAgICAgICAgIHN0ZDo6dGllKG5vZGVWZXIsIGNoYW5uZWxOYW1lKSA9IHBhcnNlVmVyc2lvbihub2RlKTsKKyAgICAgICAgICAgIGlmICghbm9kZVZlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgYXV0byBjaGFubmVsID0gZmluZE9yRGVmYXVsdChjaGFubmVsTWFwLCBjaGFubmVsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlQ2hhbm5lbDo6Q2FuYXJ5KTsKKyAgICAgICAgICAgIFZlcnNpb24mIGV4aXN0aW5nVmVyID0gcmVzW2NoYW5uZWxdOworICAgICAgICAgICAgaWYgKCFleGlzdGluZ1Zlci5pc1ZhbGlkKCkgfHwgZXhpc3RpbmdWZXIgPCBub2RlVmVyKSB7CisgICAgICAgICAgICAgICAgZXhpc3RpbmdWZXIgPSBub2RlVmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworVmVyc2lvbiBWZXJzaW9uRXh0cmFjdG9yOjpnZXRDdXJyZW50VmVyc2lvbigpIGNvbnN0IHsKKyAgICBzdGF0aWMgY29uc3QgVmVyc2lvbiBjdXJyZW50VmVyc2lvbiA9CisgICAgICAgICAgICBWZXJzaW9uKEVNVUxBVE9SX0ZVTExfVkVSU0lPTl9TVFJJTkcpOworICAgIHJldHVybiBjdXJyZW50VmVyc2lvbjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHVwZGF0ZV9jaGVjaworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91cGRhdGUtY2hlY2svVmVyc2lvbkV4dHJhY3Rvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlOWMzMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91cGRhdGUtY2hlY2svVmVyc2lvbkV4dHJhY3Rvci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXBkYXRlLWNoZWNrL0lWZXJzaW9uRXh0cmFjdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB1cGRhdGVfY2hlY2sgeworCitjbGFzcyBWZXJzaW9uRXh0cmFjdG9yIDogcHVibGljIElWZXJzaW9uRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga1htbE5hbWVzcGFjZTsKKworICAgIHZpcnR1YWwgVmVyc2lvbnMgZXh0cmFjdFZlcnNpb25zKFN0cmluZ1ZpZXcgZGF0YSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFZlcnNpb24gZ2V0Q3VycmVudFZlcnNpb24oKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1cGRhdGVfY2hlY2sKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL1ZlcnNpb25FeHRyYWN0b3JfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJiYTQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDMyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay9WZXJzaW9uRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpWZXJzaW9uOwordXNpbmcgYW5kcm9pZDo6c3R1ZGlvOjpVcGRhdGVDaGFubmVsOwordXNpbmcgYW5kcm9pZDo6dXBkYXRlX2NoZWNrOjpWZXJzaW9uRXh0cmFjdG9yOworCitURVNUKFZlcnNpb25FeHRyYWN0b3JUZXN0LCB2YWxpZFZlcnNpb24pIHsKKyAgICBzdGQ6OnN0cmluZyB4bWwgPQorICAgICAgICAgICAgUiIoPHNkazpzZGstcmVwb3NpdG9yeQorICAgICAgICAgICAgICAgIHhtbG5zOmNvbW1vbj0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vcmVwb3NpdG9yeS9hbmRyb2lkL2NvbW1vbi8wMSIKKyAgICAgICAgICAgICAgICB4bWxuczpnZW5lcmljPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9yZXBvc2l0b3J5L2FuZHJvaWQvZ2VuZXJpYy8wMSIKKyAgICAgICAgICAgICAgICB4bWxuczpzZGs9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG8vcmVwb3NpdG9yeTIvMDEiCisgICAgICAgICAgICAgICAgeG1sbnM6c2RrLWNvbW1vbj0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9jb21tb24vMDEiCisgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+ICkiCisgICAgICAgICAgICBSIig8cmVtb3RlUGFja2FnZSBwYXRoPSJ0b29scyI+KSIKKyAgICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgICAgUiIoPG1ham9yPjE8L21ham9yPikiCisgICAgICAgICAgICBSIig8bWlub3I+MjwvbWlub3I+KSIKKyAgICAgICAgICAgIFIiKDxtaWNybz4zPC9taWNybz4pIgorICAgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgICAgUiIoPC9yZW1vdGVQYWNrYWdlPikiCisgICAgICAgICAgICBSIig8L3NkazpzZGstcmVwb3NpdG9yeT4pIjsKKworICAgIGF1dG8gdmVyID0gVmVyc2lvbkV4dHJhY3RvcigpLmV4dHJhY3RWZXJzaW9ucyh4bWwpOworICAgIEVYUEVDVF9FUSgxLCB2ZXIuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbigxLDIsMyksIHZlcltVcGRhdGVDaGFubmVsOjpDYW5hcnldKTsKK30KKworVEVTVChWZXJzaW9uRXh0cmFjdG9yVGVzdCwgd2l0aEJ1aWxkKSB7CisgICAgc3RkOjpzdHJpbmcgeG1sID0KKyAgICAgICAgICAgIFIiKDxzZGs6c2RrLXJlcG9zaXRvcnkgeG1sbnM6c2RrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvL3JlcG9zaXRvcnkyLzAxIj4gKSIKKyAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgUiIoPCEtLQorICAgICAgICAgICAgR2VuZXJhdGVkIGZyb20gYmlkOjI2NjU0MzIsIGJyYW5jaDpueWNfcHJldmlld19yZWxlYXNlCisgICAgICAgICAgICAtLT4pIgorICAgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgICBSIig8bWFqb3I+MTwvbWFqb3I+KSIKKyAgICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgICBSIig8L3JldmlzaW9uPikiCisgICAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgYXV0byB2ZXIgPSBWZXJzaW9uRXh0cmFjdG9yKCkuZXh0cmFjdFZlcnNpb25zKHhtbCk7CisgICAgRVhQRUNUX0VRKDEsIHZlci5zaXplKCkpOworICAgIEVYUEVDVF9FUShWZXJzaW9uKDEsMiwzLDI2NjU0MzIpLCB2ZXJbVXBkYXRlQ2hhbm5lbDo6Q2FuYXJ5XSk7Cit9CisKK1RFU1QoVmVyc2lvbkV4dHJhY3RvclRlc3QsIHdpdGhDaGFubmVsKSB7CisgICAgc3RkOjpzdHJpbmcgeG1sID0KKyAgICAgICAgICAgIFIiKDxzZGs6c2RrLXJlcG9zaXRvcnkgeG1sbnM6c2RrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvL3JlcG9zaXRvcnkyLzAxIj4gKSIKKyAgICAgICAgICAgIFIiKDxjaGFubmVsIGlkPSJjaDEiPnN0YWJsZTwvY2hhbm5lbD4pIgorICAgICAgICAgICAgUiIoPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPikiCisgICAgICAgICAgICBSIig8IS0tCisgICAgICAgICAgICBHZW5lcmF0ZWQgZnJvbSBiaWQ6MjY2NTQzMiwgYnJhbmNoOm55Y19wcmV2aWV3X3JlbGVhc2UKKyAgICAgICAgICAgIC0tPikiCisgICAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgICAgUiIoPG1pbm9yPjI8L21pbm9yPikiCisgICAgICAgICAgICBSIig8bWljcm8+MzwvbWljcm8+KSIKKyAgICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICAgIFIiKDxjaGFubmVsUmVmIHJlZj0iY2gxIi8+KSIKKyAgICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgICAgUiIoPC9zZGs6c2RrLXJlcG9zaXRvcnk+KSI7CisKKyAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICBBU1NFUlRfRVEoMSwgdmVyLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMSwyLDMsMjY2NTQzMiksIHZlcltVcGRhdGVDaGFubmVsOjpTdGFibGVdKTsKK30KKworVEVTVChWZXJzaW9uRXh0cmFjdG9yVGVzdCwgcGlja01heFZlcnNpb24pIHsKKyAgICBzdGQ6OnN0cmluZyB4bWwgPQorICAgICAgICAgICAgUiIoPHNkazpzZGstcmVwb3NpdG9yeSB4bWxuczpzZGs9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG8vcmVwb3NpdG9yeTIvMDEiPiApIgorICAgICAgICAgICAgUiIoPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPikiCisgICAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgICAgUiIoPG1pbm9yPjI8L21pbm9yPikiCisgICAgICAgICAgICBSIig8bWljcm8+MzA8L21pY3JvPikiCisgICAgICAgICAgICBSIig8L3JldmlzaW9uPikiCisgICAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgICBSIig8bWFqb3I+MTwvbWFqb3I+KSIKKyAgICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgICAgUiIoPG1pY3JvPjA8L21pY3JvPikiCisgICAgICAgICAgICBSIig8L3JldmlzaW9uPikiCisgICAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgICBSIig8bWFqb3I+MDwvbWFqb3I+KSIKKyAgICAgICAgICAgIFIiKDxtaW5vcj45OTwvbWlub3I+KSIKKyAgICAgICAgICAgIFIiKDxtaWNybz4wOTwvbWljcm8+KSIKKyAgICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgICAgUiIoPC9zZGs6c2RrLXJlcG9zaXRvcnk+KSI7CisKKyAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICBFWFBFQ1RfRVEoMSwgdmVyLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMSwyLDMwKSwgdmVyW1VwZGF0ZUNoYW5uZWw6OkNhbmFyeV0pOworfQorCitURVNUKFZlcnNpb25FeHRyYWN0b3JUZXN0LCBwaWNrTWF4VmVyc2lvbk1hbnlDaGFubmVscykgeworICAgIHN0ZDo6c3RyaW5nIHhtbCA9CisgICAgICAgICAgICBSIig8c2RrOnNkay1yZXBvc2l0b3J5IHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9yZXBvc2l0b3J5Mi8wMSI+ICkiCisgICAgICAgICAgICAgICAgUiIoPGNoYW5uZWwgaWQ9ImNoMSI+c3RhYmxlPC9jaGFubmVsPikiCisgICAgICAgICAgICAgICAgUiIoPGNoYW5uZWwgaWQ9ImNoMiI+ZGV2PC9jaGFubmVsPikiCisgICAgICAgICAgICAgICAgUiIoPGNoYW5uZWwgaWQ9ImNoMyI+YmV0YTwvY2hhbm5lbD4pIgorICAgICAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPG1ham9yPjE8L21ham9yPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8bWljcm8+MzA8L21pY3JvPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPGNoYW5uZWxSZWYgcmVmPSJjaDEiLz4pIgorICAgICAgICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPG1ham9yPjE8L21ham9yPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8bWljcm8+MDwvbWljcm8+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8Y2hhbm5lbFJlZiByZWY9ImNoMSIvPikiCisgICAgICAgICAgICAgICAgUiIoPC9yZW1vdGVQYWNrYWdlPikiCisgICAgICAgICAgICAgICAgUiIoPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8bWFqb3I+MDwvbWFqb3I+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPG1pbm9yPjk5PC9taW5vcj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8bWljcm8+MDk8L21pY3JvPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPGNoYW5uZWxSZWYgcmVmPSJjaDEiLz4pIgorICAgICAgICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPG1ham9yPjI8L21ham9yPikiCisgICAgICAgICAgICAgICAgICAgIFIiKDxtaW5vcj4wPC9taW5vcj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8bWljcm8+MDwvbWljcm8+KSIKKyAgICAgICAgICAgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgICAgICAgICAgICBSIig8Y2hhbm5lbFJlZiByZWY9ImNoMyIvPikiCisgICAgICAgICAgICAgICAgUiIoPC9yZW1vdGVQYWNrYWdlPikiCisgICAgICAgICAgICBSIig8L3NkazpzZGstcmVwb3NpdG9yeT4pIjsKKworICAgIGF1dG8gdmVyID0gVmVyc2lvbkV4dHJhY3RvcigpLmV4dHJhY3RWZXJzaW9ucyh4bWwpOworICAgIEFTU0VSVF9FUSgyLCB2ZXIuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoVmVyc2lvbigxLDIsMzApLCB2ZXJbVXBkYXRlQ2hhbm5lbDo6U3RhYmxlXSk7CisgICAgRVhQRUNUX0VRKFZlcnNpb24oMiwwLDApLCB2ZXJbVXBkYXRlQ2hhbm5lbDo6QmV0YV0pOworfQorCitURVNUKFZlcnNpb25FeHRyYWN0b3JUZXN0LCBiYWRWZXJzaW9uKSB7CisgICAgLy8gYmFkIHhtbAorICAgIHN0ZDo6c3RyaW5nIHhtbCA9CisgICAgICAgICAgICBSIihzZGs6c2RrLXJlcG9zaXRvcnkgeG1sbnM6c2RrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvL3JlcG9zaXRvcnkyLzAxIj4gKSIKKyAgICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgICBSIig8bWFqb3I+MTwvbWFqb3I+KSIKKyAgICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgICBSIig8L3JldmlzaW9uPikiCisgICAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgeworICAgICAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHZlci5zaXplKCkpOworICAgIH0KKworICAgIC8vIG5vIG5hbWVzcGFjZQorICAgIHhtbCA9IFIiKDxzZGstcmVwb3NpdG9yeT4pIgorICAgICAgICAgIFIiKDx0b29sPikiCisgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgUiIoPG1ham9yPjE8L21ham9yPikiCisgICAgICAgICAgUiIoPG1pbm9yPjI8L21pbm9yPikiCisgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDwvdG9vbD4pIgorICAgICAgICAgIFIiKDwvc2RrLXJlcG9zaXRvcnk+KSI7CisKKyAgICB7CisgICAgICAgIGF1dG8gdmVyID0gVmVyc2lvbkV4dHJhY3RvcigpLmV4dHJhY3RWZXJzaW9ucyh4bWwpOworICAgICAgICBFWFBFQ1RfRVEoMCwgdmVyLnNpemUoKSk7CisgICAgfQorCisgICAgLy8gbm8gJ3Rvb2wnIGVsZW1lbnQKKyAgICB4bWwgPSBSIig8c2RrOnNkay1yZXBvc2l0b3J5IHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9yZXBvc2l0b3J5Mi8wMSI+ICkiCisgICAgICAgICAgUiIoPHNkazp0b29sMT4pIgorICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgIFIiKDxtaWNybz4zPC9taWNybz4pIgorICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICBSIig8L3Nkazp0b29sMT4pIgorICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgeworICAgICAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHZlci5zaXplKCkpOworICAgIH0KKworICAgIC8vIHdyb25nIG5hbWVzcGFjZQorICAgIHhtbCA9IFIiKDxzZGs6c2RrLXJlcG9zaXRvcnkgeG1sbnM6c2RrPSJodHRwOi8vc2NoZW1hcy53aW5kb3dzLXBob25lLmNvbS9zZGsvaU9TL3JlcG9zaXRvcnkvMTIiPiApIgorICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgIFIiKDxtaWNybz4zPC9taWNybz4pIgorICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICBSIig8L3NkazpzZGstcmVwb3NpdG9yeT4pIjsKKworICAgIHsKKyAgICAgICAgYXV0byB2ZXIgPSBWZXJzaW9uRXh0cmFjdG9yKCkuZXh0cmFjdFZlcnNpb25zKHhtbCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCB2ZXIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBubyAncmV2aXNpb24nCisgICAgeG1sID0gUiIoPHNkazpzZGstcmVwb3NpdG9yeSB4bWxuczpzZGs9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG8vcmVwb3NpdG9yeTIvMDEiPiApIgorICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgIFIiKDxzZGs6ZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgIFIiKDxtaWNybz4zPC9taWNybz4pIgorICAgICAgICAgIFIiKDwvc2RrOmV2aXNpb24+KSIKKyAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICBSIig8L3NkazpzZGstcmVwb3NpdG9yeT4pIjsKKworICAgIHsKKyAgICAgICAgYXV0byB2ZXIgPSBWZXJzaW9uRXh0cmFjdG9yKCkuZXh0cmFjdFZlcnNpb25zKHhtbCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCB2ZXIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBubyBtYWpvcgorICAgIHhtbCA9IFIiKDxzZGs6c2RrLXJlcG9zaXRvcnkgeG1sbnM6c2RrPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC9yZXBvL3JlcG9zaXRvcnkyLzAxIj4gKSIKKyAgICAgICAgICBSIig8cmVtb3RlUGFja2FnZSBwYXRoPSJ0b29scyI+KSIKKyAgICAgICAgICBSIig8cmV2aXNpb24+KSIKKyAgICAgICAgICBSIig8bWlub3I+MjwvbWlub3I+KSIKKyAgICAgICAgICBSIig8bWljcm8+MzwvbWljcm8+KSIKKyAgICAgICAgICBSIig8L3JldmlzaW9uPikiCisgICAgICAgICAgUiIoPC9yZW1vdGVQYWNrYWdlPikiCisgICAgICAgICAgUiIoPC9zZGs6c2RrLXJlcG9zaXRvcnk+KSI7CisKKyAgICB7CisgICAgICAgIGF1dG8gdmVyID0gVmVyc2lvbkV4dHJhY3RvcigpLmV4dHJhY3RWZXJzaW9ucyh4bWwpOworICAgICAgICBFWFBFQ1RfRVEoMCwgdmVyLnNpemUoKSk7CisgICAgfQorCisgICAgLy8gbm8gbWlub3IKKyAgICB4bWwgPSBSIig8c2RrOnNkay1yZXBvc2l0b3J5IHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9yZXBvc2l0b3J5Mi8wMSI+ICkiCisgICAgICAgICAgUiIoPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPikiCisgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgUiIoPG1ham9yPjI8L21ham9yPikiCisgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgeworICAgICAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHZlci5zaXplKCkpOworICAgIH0KKworICAgIC8vIG5vIG1pY3JvCisgICAgeG1sID0gUiIoPHNkazpzZGstcmVwb3NpdG9yeSB4bWxuczpzZGs9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG8vcmVwb3NpdG9yeTIvMDEiPiApIgorICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDxtYWpvcj4xPC9tYWpvcj4pIgorICAgICAgICAgIFIiKDxtaW5vcj4yPC9taW5vcj4pIgorICAgICAgICAgIFIiKDwvcmV2aXNpb24+KSIKKyAgICAgICAgICBSIig8L3JlbW90ZVBhY2thZ2U+KSIKKyAgICAgICAgICBSIig8L3NkazpzZGstcmVwb3NpdG9yeT4pIjsKKworICAgIHsKKyAgICAgICAgYXV0byB2ZXIgPSBWZXJzaW9uRXh0cmFjdG9yKCkuZXh0cmFjdFZlcnNpb25zKHhtbCk7CisgICAgICAgIEVYUEVDVF9FUSgwLCB2ZXIuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvLyBiYWQgbnVtYmVyIGluIHZlcnNpb24KKyAgICB4bWwgPSBSIig8c2RrOnNkay1yZXBvc2l0b3J5IHhtbG5zOnNkaz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vc2RrL2FuZHJvaWQvcmVwby9yZXBvc2l0b3J5Mi8wMSI+ICkiCisgICAgICAgICAgUiIoPHJlbW90ZVBhY2thZ2UgcGF0aD0idG9vbHMiPikiCisgICAgICAgICAgUiIoPHJldmlzaW9uPikiCisgICAgICAgICAgUiIoPG1ham9yPjFhc2Q8L21ham9yPikiCisgICAgICAgICAgUiIoPG1pbm9yPjI8L21pbm9yPikiCisgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgeworICAgICAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHZlci5zaXplKCkpOworICAgIH0KKworICAgIC8vIGJhZCBudW1iZXIgaW4gdmVyc2lvbiAyCisgICAgeG1sID0gUiIoPHNkazpzZGstcmVwb3NpdG9yeSB4bWxuczpzZGs9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkL3JlcG8vcmVwb3NpdG9yeTIvMDEiPiApIgorICAgICAgICAgIFIiKDxyZW1vdGVQYWNrYWdlIHBhdGg9InRvb2xzIj4pIgorICAgICAgICAgIFIiKDxyZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDxtYWpvcj48L21ham9yPikiCisgICAgICAgICAgUiIoPG1pbm9yPjI8L21pbm9yPikiCisgICAgICAgICAgUiIoPG1pY3JvPjM8L21pY3JvPikiCisgICAgICAgICAgUiIoPC9yZXZpc2lvbj4pIgorICAgICAgICAgIFIiKDwvcmVtb3RlUGFja2FnZT4pIgorICAgICAgICAgIFIiKDwvc2RrOnNkay1yZXBvc2l0b3J5PikiOworCisgICAgeworICAgICAgICBhdXRvIHZlciA9IFZlcnNpb25FeHRyYWN0b3IoKS5leHRyYWN0VmVyc2lvbnMoeG1sKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHZlci5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91cGRhdGUtY2hlY2svdXBkYXRlX2NoZWNrLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL3VwZGF0ZV9jaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDIyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXBkYXRlLWNoZWNrL3VwZGF0ZV9jaGVjay5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gVGhpcyBpcyB0aGUgb25seSBrbm9iIHlvdSBuZWVkIHRvIHRvdWNoIHRvIHBlcmZvcm0gYSBkYWlseQorLy8gZW11bGF0b3IgdXBkYXRlcyBjaGVjay4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGFzeW5jcm9ub3VzIHVwZGF0ZSBjaGVjaworLy8gYW5kIHByaW50cyBhIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaWYgdGhlcmUncyBhIG5ld2VyIHZlcnNpb24gYXZhaWxhYmxlLgorLy8gSXQgd2lsbCBza2lwIHRoZSBjaGVjayBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgb24gdGhlIHNhbWUgZGF5CisvLyB8Y29yZVZlcnNpb258IC0gY29yZS1zcGVjaWZpYyB2ZXJzaW9uLCBlLmcuICJxZW11MiAyLjIuMCIKK2V4dGVybiB2b2lkIGFuZHJvaWRfY2hlY2tGb3JVcGRhdGVzKGNvbnN0IGNoYXIqIGNvcmVWZXJzaW9uKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXNlci1jb25maWcuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VzZXItY29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJkMmFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3VzZXItY29uZmlnLmNwcApAQCAtMCwwICsxLDIxNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3VzZXItY29uZmlnLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vYnVmcHJpbnRfY29uZmlnX2RpcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZGVmaW5lICBEKC4uLikgICBWRVJCT1NFX1BSSU5UKGluaXQsX19WQV9BUkdTX18pCisKKyNpZiAwIC8qIHNldCB0byAxIGZvciBtb3JlIGRlYnVnZ2luZyAqLworIyAgZGVmaW5lICBERCguLi4pICBEKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgIGRlZmluZSAgREQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworc3RydWN0IEFVc2VyQ29uZmlnIHsKKyAgICBBQm9vbCAgICAgICAgY2hhbmdlZDsKKyAgICBpbnQgICAgICAgICAgd2luZG93WDsKKyAgICBpbnQgICAgICAgICAgd2luZG93WTsKKyAgICB1aW50NjRfdCAgICAgdXVpZDsKKyAgICBjaGFyKiAgICAgICAgaW5pUGF0aDsKK307CisKKy8qIE5hbWUgb2YgdGhlIHVzZXItY29uZmlnIGZpbGUgKi8KKyNkZWZpbmUgIFVTRVJfQ09ORklHX0ZJTEUgICJlbXVsYXRvci11c2VyLmluaSIKKworI2RlZmluZSAgS0VZX1dJTkRPV19YICAid2luZG93LngiCisjZGVmaW5lICBLRVlfV0lORE9XX1kgICJ3aW5kb3cueSIKKyNkZWZpbmUgIEtFWV9VVUlEICAgICAgInV1aWQiCisKKyNkZWZpbmUgIERFRkFVTFRfWCAgMTAwCisjZGVmaW5lICBERUZBVUxUX1kgIDEwMAorCit2b2lkIGF1c2VyQ29uZmlnX2ZyZWUoIEFVc2VyQ29uZmlnKiB1Y29uZmlnKSB7CisgICAgaWYgKHVjb25maWctPmluaVBhdGgpIHsKKyAgICAgICAgZnJlZSh1Y29uZmlnLT5pbmlQYXRoKTsKKyAgICB9CisgICAgZGVsZXRlIHVjb25maWc7Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBBVXNlckNvbmZpZyBvYmplY3QgZnJvbSBhIGdpdmVuIEF2ZEluZm8gKi8KK0FVc2VyQ29uZmlnKgorYXVzZXJDb25maWdfbmV3KCBBdmRJbmZvKiAgaW5mbyApCit7CisgICAgY2hhciAgICAgICAgICBpbkFuZHJvaWRCdWlsZCA9IGF2ZEluZm9faW5BbmRyb2lkQnVpbGQoaW5mbyk7CisgICAgY2hhciAgICAgICAgICBuZWVkVVVJRCA9IDE7CisgICAgY2hhciAgICAgICAgICB0ZW1wW1BBVEhfTUFYXSwgKnA9dGVtcCwgKmVuZD1wK3NpemVvZih0ZW1wKTsKKyAgICBDSW5pRmlsZSogICAgIGluaSA9IE5VTEw7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QVVzZXJDb25maWc+IHVjKG5ldyBBVXNlckNvbmZpZygpKTsKKyAgICBtZW1zZXQodWMuZ2V0KCksIDAsIHNpemVvZigqdWMpKTsKKworICAgIC8qIElmIHdlIGFyZSBpbiB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0sIHN0b3JlIHRoZSBjb25maWd1cmF0aW9uCisgICAgICogaW4gfi8uYW5kcm9pZC9lbXVsYXRvci11c2VyLmluaS4gb3RoZXJ3aXNlLCBzdG9yZSBpdCBpbiB0aGUgZmlsZQorICAgICAqIGVtdWxhdG9yLXVzZXIuaW5pIGluIHRoZSBBVkQncyBjb250ZW50IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBpZiAoaW5BbmRyb2lkQnVpbGQpIHsKKyAgICAgICAgcCA9IGJ1ZnByaW50X2NvbmZpZ19maWxlKHRlbXAsIGVuZCwgVVNFUl9DT05GSUdfRklMRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcCA9IGJ1ZnByaW50KHRlbXAsIGVuZCwgIiVzLyVzIiwgYXZkSW5mb19nZXRDb250ZW50UGF0aChpbmZvKSwKKyAgICAgICAgICAgICAgICAgICAgIFVTRVJfQ09ORklHX0ZJTEUpOworICAgIH0KKworICAgIC8qIGhhbmRsZSB0aGUgdW5leHBlY3RlZCAqLworICAgIGlmIChwID49IGVuZCkgeworICAgICAgICAvKiBIbW1tLCBzb21ldGhpbmcgaXMgd2VpcmQsIGxldCdzIHVzZSBhIHRlbXBvcmFyeSBmaWxlIGluc3RlYWQgKi8KKyAgICAgICAgcCA9IGJ1ZnByaW50X3RlbXBfZmlsZSh0ZW1wLCBlbmQsIFVTRVJfQ09ORklHX0ZJTEUpOworICAgICAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgICAgIGRlcnJvcigiV2VpcmQ6IENhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IHVzZXItY29uZmlnIGZpbGU/Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkd2FybmluZygiV2VpcmQ6IENvbnRlbnQgcGF0aCB0b28gbG9uZywgdXNpbmcgdGVtcG9yYXJ5IHVzZXItY29uZmlnLiIpOworICAgIH0KKworICAgIHVjLT5pbmlQYXRoID0gQVNUUkRVUCh0ZW1wKTsKKyAgICBERCgibG9va2luZyB1c2VyLWNvbmZpZyBpbjogJXMiLCB1Yy0+aW5pUGF0aCk7CisKKyAgICB7CisgICAgICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0cyAqLworICAgICAgICBhbmRyb2lkOjpiYXNlOjpTY29wZWRDUHRyPGNoYXI+IHBhcmVudFBhdGgocGF0aF9wYXJlbnQodWMtPmluaVBhdGgsIDEpKTsKKyAgICAgICAgaWYgKHBhcmVudFBhdGggPT0gTlVMTCkgeworICAgICAgICAgICAgZGVycm9yKCJXZWlyZDogQ2FuJ3QgZmluZCBwYXJlbnQgb2YgdXNlci1jb25maWcgZmlsZTogJXMiLAorICAgICAgICAgICAgICAgICAgIHVjLT5pbmlQYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFwYXRoX2V4aXN0cyhwYXJlbnRQYXRoLmdldCgpKSkgeworICAgICAgICAgICAgaWYgKCFpbkFuZHJvaWRCdWlsZCkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiV2VpcmQ6IE5vIGNvbnRlbnQgcGF0aCBmb3IgdGhpcyBBVkQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aC5nZXQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERCgiY3JlYXRpbmcgbWlzc2luZyBkaXJlY3Rvcnk6ICVzIiwgcGFyZW50UGF0aC5nZXQoKSk7CisgICAgICAgICAgICBpZiAocGF0aF9ta2Rpcl9pZl9uZWVkZWQocGFyZW50UGF0aC5nZXQoKSwgMDc1NSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVycm9yKCJVc2luZyBlbXB0eSB1c2VyLWNvbmZpZywgY2FuJ3QgY3JlYXRlICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGguZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGF0aF9leGlzdHModWMtPmluaVBhdGgpKSB7CisgICAgICAgIEREKCJyZWFkaW5nIHVzZXItY29uZmlnIGZpbGUiKTsKKyAgICAgICAgaW5pID0gaW5pRmlsZV9uZXdGcm9tRmlsZSh1Yy0+aW5pUGF0aCk7CisgICAgICAgIGlmIChpbmkgPT0gTlVMTCkgeworICAgICAgICAgICAgZHdhcm5pbmcoIkNhbid0IHJlYWQgdXNlci1jb25maWcgZmlsZTogJXNcblVzaW5nIGRlZmF1bHQgdmFsdWVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHVjLT5pbmlQYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbmkgIT0gTlVMTCkgeworICAgICAgICB1Yy0+d2luZG93WCA9IGluaUZpbGVfZ2V0SW50ZWdlcihpbmksIEtFWV9XSU5ET1dfWCwgREVGQVVMVF9YKTsKKyAgICAgICAgREQoIiAgICBmb3VuZCAlcyA9ICVkIiwgS0VZX1dJTkRPV19YLCB1Yy0+d2luZG93WCk7CisKKyAgICAgICAgdWMtPndpbmRvd1kgPSBpbmlGaWxlX2dldEludGVnZXIoaW5pLCBLRVlfV0lORE9XX1ksIERFRkFVTFRfWSk7CisgICAgICAgIEREKCIgICAgZm91bmQgJXMgPSAlZCIsIEtFWV9XSU5ET1dfWSwgdWMtPndpbmRvd1kpOworCisgICAgICAgIGlmIChpbmlGaWxlX2hhc0tleShpbmksIEtFWV9VVUlEKSkgeworICAgICAgICAgICAgdWMtPnV1aWQgPSAodWludDY0X3QpIGluaUZpbGVfZ2V0SW50NjQoaW5pLCBLRVlfVVVJRCwgMExMKTsKKyAgICAgICAgICAgIG5lZWRVVUlEID0gMDsKKyAgICAgICAgICAgIEREKCIgICAgZm91bmQgJXMgPSAlbGxkIiwgS0VZX1VVSUQsIHVjLT51dWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIGluaUZpbGVfZnJlZShpbmkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdWMtPndpbmRvd1ggID0gREVGQVVMVF9YOworICAgICAgICB1Yy0+d2luZG93WSAgPSBERUZBVUxUX1k7CisgICAgICAgIHVjLT5jaGFuZ2VkICA9IDE7CisgICAgfQorCisgICAgLyogR2VuZXJhdGUgYSA2NC1iaXQgVVVJRCBpZiBuZWNlc3NhcnkuIFdlIHNpbXBseSB0YWtlIHRoZQorICAgICAqIGN1cnJlbnQgdGltZSwgd2hpY2ggYXZvaWRzIGFueSBwcml2YWN5LXJlbGF0ZWQgdmFsdWUuCisgICAgICovCisgICAgaWYgKG5lZWRVVUlEKSB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0bTsKKworICAgICAgICBnZXR0aW1lb2ZkYXkoICZ0bSwgTlVMTCApOworICAgICAgICB1Yy0+dXVpZCAgICA9ICh1aW50NjRfdCl0bS50dl9zZWMqMTAwMCArIHRtLnR2X3VzZWMvMTAwMDsKKyAgICAgICAgdWMtPmNoYW5nZWQgPSAxOworICAgICAgICBERCgiICAgIEdlbmVyYXRlZCBVVUlEID0gJWxsZCIsIHVjLT51dWlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gdWMucmVsZWFzZSgpOworfQorCisKK3VpbnQ2NF90CithdXNlckNvbmZpZ19nZXRVVUlEKCBBVXNlckNvbmZpZyogIHVjb25maWcgKQoreworICAgIHJldHVybiB1Y29uZmlnLT51dWlkOworfQorCit2b2lkCithdXNlckNvbmZpZ19nZXRXaW5kb3dQb3MoIEFVc2VyQ29uZmlnKiAgdWNvbmZpZywgaW50ICAqcFgsIGludCAgKnBZICkKK3sKKyAgICAqcFggPSB1Y29uZmlnLT53aW5kb3dYOworICAgICpwWSA9IHVjb25maWctPndpbmRvd1k7Cit9CisKKwordm9pZAorYXVzZXJDb25maWdfc2V0V2luZG93UG9zKCBBVXNlckNvbmZpZyogIHVjb25maWcsIGludCAgeCwgaW50ICB5ICkKK3sKKyAgICBpZiAoeCAhPSB1Y29uZmlnLT53aW5kb3dYIHx8IHkgIT0gdWNvbmZpZy0+d2luZG93WSkgeworICAgICAgICB1Y29uZmlnLT53aW5kb3dYID0geDsKKyAgICAgICAgdWNvbmZpZy0+d2luZG93WSA9IHk7CisgICAgICAgIHVjb25maWctPmNoYW5nZWQgPSAxOworICAgIH0KK30KKworLyogU2F2ZSB0aGUgdXNlciBjb25maWd1cmF0aW9uIGJhY2sgdG8gdGhlIGNvbnRlbnQgZGlyZWN0b3J5LgorICogU2hvdWxkIGJlIHVzZWQgaW4gYW4gYXRleGl0KCkgaGFuZGxlciAqLwordm9pZAorYXVzZXJDb25maWdfc2F2ZSggQVVzZXJDb25maWcqICB1Y29uZmlnICkKK3sKKyAgICBDSW5pRmlsZSogaW5pOworCisgICAgaWYgKHVjb25maWctPmNoYW5nZWQgPT0gMCkgeworICAgICAgICBEKCJVc2VyLWNvbmZpZyB3YXMgbm90IGNoYW5nZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbmkgPSBpbmlGaWxlX25ld0VtcHR5KHVjb25maWctPmluaVBhdGgpOworICAgIGlmIChpbmkgPT0gTlVMTCkgeworICAgICAgICBEKCJXZWlyZDogY2FuJ3QgYWxsb2NhdGUgdXNlci1jb25maWcgaW5pRmlsZT8iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGluaUZpbGVfc2V0SW50ZWdlcihpbmksIEtFWV9XSU5ET1dfWCwgdWNvbmZpZy0+d2luZG93WCk7CisgICAgaW5pRmlsZV9zZXRJbnRlZ2VyKGluaSwgS0VZX1dJTkRPV19ZLCB1Y29uZmlnLT53aW5kb3dZKTsKKyAgICBpbmlGaWxlX3NldEludDY0KGluaSwgS0VZX1VVSUQsIHVjb25maWctPnV1aWQpOworICAgIGlmIChpbmlGaWxlX3NhdmVUb0ZpbGUoaW5pLCB1Y29uZmlnLT5pbmlQYXRoKSA8IDApIHsKKyAgICAgICAgZHdhcm5pbmcoImNvdWxkIG5vdCBzYXZlIHVzZXIgY29uZmlndXJhdGlvbjogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgdWNvbmZpZy0+aW5pUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEKCJVc2VyIGNvbmZpZ3VyYXRpb24gc2F2ZWQgdG8gJXMiLCB1Y29uZmlnLT5pbmlQYXRoKTsKKyAgICB9CisgICAgaW5pRmlsZV9mcmVlKGluaSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXNlci1jb25maWcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91c2VyLWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTZkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXNlci1jb25maWcuaApAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL2luZm8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIGEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIHVzZXItY29uZmlndXJhdGlvbiBzZXR0aW5ncworICoKKyAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgb25seSB1c2VkIHRvIHN0b3JlIHRoZSBsYXN0IHBvc2l0aW9uCisgKiBvZiB0aGUgZW11bGF0b3Igd2luZG93IGFuZCBhIHVuaXF1ZSA2NC1iaXQgVVVJRC4gV2UgbWlnaHQKKyAqIGFkZCBtb3JlIEFWRC1zcGVjaWZpYyBwcmVmZXJlbmNlcyBoZXJlIGluIHRoZSBmdXR1cmUuCisgKgorICogQnkgZGVmaW5pdGlvbiwgdGhlc2Ugc2V0dGluZ3Mgc2hvdWxkIGJlIG9wdGlvbmFsIGFuZCB3ZQorICogc2hvdWxkIGJlIGFibGUgdG8gd29yayB3aXRob3V0IHRoZW0sIHVubGlrZSB0aGUgQVZECisgKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIGNvbmZpZy5pbmkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVVzZXJDb25maWcgICBBVXNlckNvbmZpZzsKKworLyogQ3JlYXRlIGEgbmV3IEFVc2VyQ29uZmlnIG9iamVjdCBmcm9tIGEgZ2l2ZW4gQXZkSW5mbyAqLworQVVzZXJDb25maWcqICAgYXVzZXJDb25maWdfbmV3KCBBdmRJbmZvKiAgaW5mbyApOwordm9pZCAgICAgICAgICAgYXVzZXJDb25maWdfZnJlZSggQVVzZXJDb25maWcqIHVjb25maWcgKTsKKworLyogUmV0cmlldmUgdGhlIHVuaXF1ZSBVSUQgZm9yIHRoaXMgQVZEICovCit1aW50NjRfdCAgICAgICBhdXNlckNvbmZpZ19nZXRVVUlEKCBBVXNlckNvbmZpZyogIHVjb25maWcgKTsKKworLyogUmV0cmlldmUgdGhlIHN0b3JlZCB3aW5kb3cgcG9zaXRpb24gZm9yIHRoaXMgQVZEICovCit2b2lkICAgICAgICAgICBhdXNlckNvbmZpZ19nZXRXaW5kb3dQb3MoIEFVc2VyQ29uZmlnKiAgdWNvbmZpZywgaW50ICAqcFgsIGludCAgKnBZICk7CisKKy8qIENoYW5nZSB0aGUgc3RvcmVkIHdpbmRvdyBwb3NpdGlvbiBmb3IgdGhpcyBBVkQgKi8KK3ZvaWQgICAgICAgICAgIGF1c2VyQ29uZmlnX3NldFdpbmRvd1BvcyggQVVzZXJDb25maWcqICB1Y29uZmlnLCBpbnQgIHgsIGludCAgeSApOworCisvKiBTYXZlIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gYmFjayB0byB0aGUgY29udGVudCBkaXJlY3RvcnkuCisgKiBTaG91bGQgYmUgdXNlZCBpbiBhbiBhdGV4aXQoKSBoYW5kbGVyLiBUaGlzIHdpbGwgZWZmZWN0aXZlbHkKKyAqIG9ubHkgc2F2ZSB0aGUgdXNlciBjb25maWd1cmF0aW9uIHRvIGRpc2sgaWYgaXRzIGNvbnRlbnQKKyAqIGhhcyBjaGFuZ2VkLgorICovCit2b2lkICAgICAgICAgICBhdXNlckNvbmZpZ19zYXZlKCBBVXNlckNvbmZpZyogIHVjb25maWcgKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYWNvbmZpZy1maWxlLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYWNvbmZpZy1maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyZTViYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCitBQ29uZmlnKgorYWNvbmZpZ19ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIEFDb25maWcgKm47CisKKyAgICBuID0gKEFDb25maWcqKSBjYWxsb2Moc2l6ZW9mKEFDb25maWcpLCAxKTsKKyAgICBuLT5uYW1lID0gbmFtZSA/IG5hbWUgOiAiIjsKKyAgICBuLT52YWx1ZSA9IHZhbHVlID8gdmFsdWUgOiAiIjsKKworICAgIHJldHVybiBuOworfQorCit2b2lkCithY29uZmlnX25vZGVfZnJlZShBQ29uZmlnICpyb290KSB7CisgICAgQUNvbmZpZyAqbm9kZSwgKm5leHQ7CisgICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGU7IG5vZGUgPSBuZXh0KSB7CisgICAgICAgIG5leHQgPSBub2RlLT5uZXh0OworICAgICAgICBhY29uZmlnX25vZGVfZnJlZShub2RlKTsKKyAgICB9CisgICAgZnJlZShub2RlKTsKK30KKworc3RhdGljIEFDb25maWcqIF9hY29uZmlnX2ZpbmRfY3JlYXRlKEFDb25maWcqIHJvb3QsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBBQ29uZmlnICpub2RlOworCisgICAgZm9yKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobm9kZS0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgfQorCisgICAgbm9kZSA9IGFjb25maWdfbm9kZShuYW1lLCBOVUxMKTsKKworICAgIGlmIChyb290LT5sYXN0X2NoaWxkKSB7CisgICAgICAgIHJvb3QtPmxhc3RfY2hpbGQtPm5leHQgPSBub2RlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvb3QtPmZpcnN0X2NoaWxkID0gbm9kZTsKKyAgICB9CisgICAgcm9vdC0+bGFzdF9jaGlsZCA9IG5vZGU7CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworY29uc3QgQUNvbmZpZyogYWNvbmZpZ19maW5kX2NvbnN0KGNvbnN0IEFDb25maWcqIHJvb3QsIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBjb25zdCBBQ29uZmlnKiBub2RlOworCisgICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKG5vZGUtPm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0FDb25maWcqIGFjb25maWdfZmluZChBQ29uZmlnKiByb290LCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgcmV0dXJuIChBQ29uZmlnKilhY29uZmlnX2ZpbmRfY29uc3Qocm9vdCwgbmFtZSk7Cit9CisKK2ludCBhY29uZmlnX2Jvb2woY29uc3QgQUNvbmZpZyogcm9vdCwgY29uc3QgY2hhciogbmFtZSwgaW50IF9kZWZhdWx0KSB7CisgICAgY29uc3QgQUNvbmZpZyogbiA9IGFjb25maWdfZmluZF9jb25zdChyb290LCBuYW1lKTsKKyAgICBpZihuID09IDApIHsKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0OworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaChuLT52YWx1ZVswXSl7CisgICAgICAgIGNhc2UgJ3knOgorICAgICAgICBjYXNlICdZJzoKKyAgICAgICAgY2FzZSAnMSc6CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICBjYXNlICdUJzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Vuc2lnbmVkIGFjb25maWdfdW5zaWduZWQoY29uc3QgQUNvbmZpZyogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX2RlZmF1bHQpIHsKKyAgICBjb25zdCBBQ29uZmlnKiBuID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsIG5hbWUpOworICAgIGlmKG4gPT0gMCkgeworICAgICAgICByZXR1cm4gX2RlZmF1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0cnRvdWwobi0+dmFsdWUsIDAsIDApOworICAgIH0KK30KKworaW50IGFjb25maWdfaW50KGNvbnN0IEFDb25maWcqIHJvb3QsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBfZGVmYXVsdCkgeworICAgIGNvbnN0IEFDb25maWcqIG4gPSBhY29uZmlnX2ZpbmRfY29uc3Qocm9vdCwgbmFtZSk7CisgICAgaWYobiA9PSAwKSB7CisgICAgICAgIHJldHVybiBfZGVmYXVsdDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3RydG9sKG4tPnZhbHVlLCAwLCAwKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIqIGFjb25maWdfc3RyKGNvbnN0IEFDb25maWcqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogX2RlZmF1bHQpIHsKKyAgICBjb25zdCBBQ29uZmlnKiBuID0gYWNvbmZpZ19maW5kX2NvbnN0KHJvb3QsIG5hbWUpOworICAgIGlmKG4gPT0gMCkgeworICAgICAgICByZXR1cm4gX2RlZmF1bHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG4tPnZhbHVlOworICAgIH0KK30KKwordm9pZAorYWNvbmZpZ19zZXQoQUNvbmZpZyAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgQUNvbmZpZyogbm9kZSA9IF9hY29uZmlnX2ZpbmRfY3JlYXRlKHJvb3QsIG5hbWUpOworICAgIG5vZGUtPnZhbHVlID0gdmFsdWU7Cit9CisKKyNkZWZpbmUgVF9FT0YgMAorI2RlZmluZSBUX1RFWFQgMQorI2RlZmluZSBUX0RPVCAyCisjZGVmaW5lIFRfT0JSQUNFIDMKKyNkZWZpbmUgVF9DQlJBQ0UgNAorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgKmRhdGE7CisgICAgY2hhciAqdGV4dDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgbmV4dDsKK30gY3N0YXRlOworCisKK3N0YXRpYyBpbnQgX2xleChjc3RhdGUgKmNzLCBpbnQgdmFsdWUpCit7CisgICAgY2hhciBjOworICAgIGNoYXIgKnM7CisgICAgY2hhciAqZGF0YTsKKworICAgIGRhdGEgPSBjcy0+ZGF0YTsKKworICAgIGlmKGNzLT5uZXh0ICE9IDApIHsKKyAgICAgICAgYyA9IGNzLT5uZXh0OworICAgICAgICBjcy0+bmV4dCA9IDA7CisgICAgICAgIGdvdG8gZ290X2M7CisgICAgfQorCityZXN0YXJ0OgorICAgIGZvcig7OykgeworICAgICAgICBjID0gKmRhdGErKzsKKyAgICBnb3RfYzoKKyAgICAgICAgaWYoaXNzcGFjZShjKSkgY29udGludWU7CisKKyAgICAgICAgc3dpdGNoKGMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmV0dXJuIFRfRU9GOworCisgICAgICAgIC8qIGEgc2hhcnAgc2lnbiAoIykgc3RhcnRzIGEgbGluZSBjb21tZW50IGFuZCBldmVyeXRoaW5nCisgICAgICAgICAqIGJlaGluZCB0aGF0IGlzIGlnbm9yZWQgdW50aWwgdGhlIGVuZCBvZiBsaW5lCisgICAgICAgICAqLworICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgIGZvcig7OykgeworICAgICAgICAgICAgICAgIHN3aXRjaCgqZGF0YSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVF9FT0Y7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICAgICAgICBjcy0+ZGF0YSA9IGRhdGEgKyAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgcmV0dXJuIFRfRE9UOworCisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgcmV0dXJuIFRfT0JSQUNFOworCisgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgcmV0dXJuIFRfQ0JSQUNFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzID0gZGF0YSAtIDE7CisKKyAgICAgICAgICAgIGlmKHZhbHVlKSB7CisgICAgICAgICAgICAgICAvKiBpZiB3ZSdyZSBsb29raW5nIGZvciBhIHZhbHVlLCB0aGVuIHRha2UgYW55dGhpbmcKKyAgICAgICAgICAgICAgICAqIHVudGlsIHRoZSBlbmQgb2YgbGluZS4gbm90ZSB0aGF0IHNoYXJwIHNpZ25zIGRvCisgICAgICAgICAgICAgICAgKiBub3Qgc3RhcnQgY29tbWVudHMgdGhlbi4gdGhlIHJlc3VsdCB3aWxsIGJlIHN0cmlwcGVkCisgICAgICAgICAgICAgICAgKiBmcm9tIHRyYWlsaW5nIHdoaXRlc3BhY2UuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKmRhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoKmRhdGEgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhLS0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisgICAgICAgICAgICAgICAgd2hpbGUoZGF0YSA+IHMpeworICAgICAgICAgICAgICAgICAgICBpZighaXNzcGFjZSgqZGF0YSkpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAqZGF0YS0tID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBnb3RvIGdvdF90ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIGEga2V5IG5hbWUuIHdlIHN0b3AgYXQgd2hpdGVzcGFjZSwKKyAgICAgICAgICAgICAgICAqIEVPRiwgb2YgVF9ET1QvVF9PQlJBQ0UvVF9DQlJBQ0UgY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICAqIG5vdGUgdGhhdCB0aGUgbmFtZSBjYW4gaW5jbHVkZSBzaGFycCBzaWducworICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZm9yKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGlzc3BhY2UoKmRhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjcy0+ZGF0YSA9IGRhdGEgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmRhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzLT5uZXh0ID0gKmRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjcy0+ZGF0YSA9IGRhdGEgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfdGV4dDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGErKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworZ290X3RleHQ6CisgICAgY3MtPnRleHQgPSBzOworICAgIHJldHVybiBUX1RFWFQ7Cit9CisKKyNpZiAwCitjaGFyICpUT0tFTk5BTUVTW10gPSB7ICJFT0YiLCAiVEVYVCIsICJET1QiLCAiT0JSQUNFIiwgIkNCUkFDRSIgfTsKKworc3RhdGljIGludCBsZXgoY3N0YXRlICpjcywgaW50IHZhbHVlKQoreworICAgIGludCB0b2sgPSBfbGV4KGNzLCB2YWx1ZSk7CisgICAgcHJpbnRmKCJUT0tFTiglZCkgJXMgJXNcbiIsIHZhbHVlLCBUT0tFTk5BTUVTW3Rva10sCisgICAgICAgICAgIHRvayA9PSBUX1RFWFQgPyBjcy0+dGV4dCA6ICIiKTsKKyAgICByZXR1cm4gdG9rOworfQorI2Vsc2UKKyNkZWZpbmUgbGV4KGNzLHYpIF9sZXgoY3MsdikKKyNlbmRpZgorCitzdGF0aWMgaW50IHBhcnNlX2V4cHIoY3N0YXRlICpjcywgQUNvbmZpZyAqbm9kZSk7CisKK3N0YXRpYyBpbnQKK3BhcnNlX2Jsb2NrKGNzdGF0ZSAqY3MsIEFDb25maWcgKm5vZGUpCit7CisgICAgZm9yKDs7KXsKKyAgICAgICAgc3dpdGNoKGxleChjcywgMCkpeworICAgICAgICBjYXNlIFRfVEVYVDoKKyAgICAgICAgICAgIGlmKHBhcnNlX2V4cHIoY3MsIG5vZGUpKSByZXR1cm4gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjYXNlIFRfQ0JSQUNFOgorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludAorcGFyc2VfZXhwcihjc3RhdGUgKmNzLCBBQ29uZmlnICpub2RlKQoreworICAgICAgICAvKiBsYXN0IHRva2VuIHdhcyBUX1RFWFQgKi8KKyAgICAgICAgbm9kZSA9IF9hY29uZmlnX2ZpbmRfY3JlYXRlKG5vZGUsIGNzLT50ZXh0KTsKKworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGxleChjcywgMSkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRfRE9UOgorICAgICAgICAgICAgICAgICAgICBpZiAobGV4KGNzLCAwKSAhPSBUX1RFWFQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBfYWNvbmZpZ19maW5kX2NyZWF0ZShub2RlLCBjcy0+dGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSBUX1RFWFQ6CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPnZhbHVlID0gY3MtPnRleHQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgY2FzZSBUX09CUkFDRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2Jsb2NrKGNzLCBub2RlKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQKK2Fjb25maWdfbG9hZChBQ29uZmlnICpyb290LCBjaGFyICpkYXRhKQoreworICAgIGlmKGRhdGEgIT0gMCkgeworICAgICAgICBjc3RhdGUgY3M7CisgICAgICAgIGNzLmRhdGEgPSBkYXRhOworICAgICAgICBjcy5uZXh0ID0gMDsKKworICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgIHN3aXRjaChsZXgoJmNzLCAwKSl7CisgICAgICAgICAgICBjYXNlIFRfVEVYVDoKKyAgICAgICAgICAgICAgICBpZihwYXJzZV9leHByKCZjcywgcm9vdCkpIHJldHVybjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitpbnQKK2Fjb25maWdfbG9hZF9maWxlKEFDb25maWcgKnJvb3QsIGNvbnN0IGNoYXIgKmZuKQoreworICAgIGNoYXIgKmRhdGE7CisgICAgZGF0YSA9IHBhdGhfbG9hZF9maWxlKGZuLCBOVUxMKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisgICAgcmV0dXJuIDA7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjaGFyICAgYnVmZlsxMDI0XTsKKyAgICBjaGFyKiAgcDsKKyAgICBjaGFyKiAgZW5kOworICAgIGludCAgICBmZDsKK30gV3JpdGVyOworCitzdGF0aWMgaW50Cit3cml0ZXJfaW5pdCggV3JpdGVyKiAgdywgY29uc3QgY2hhciogIGZuICkKK3sKKyAgICB3LT5wICAgPSB3LT5idWZmOworICAgIHctPmVuZCA9IHctPmJ1ZmYgKyBzaXplb2Yody0+YnVmZik7CisKKyAgICB3LT5mZCAgPSBjcmVhdCggZm4sIDA3NTUgKTsKKyAgICBpZiAody0+ZmQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyNpZmRlZiBfV0lOMzIKKyAgICBfc2V0bW9kZSggdy0+ZmQsIF9PX0JJTkFSWSApOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfd3JpdGUoIFdyaXRlciogIHcsIGNvbnN0IGNoYXIqICBzcmMsIGludCAgbGVuICkKK3sKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpbnQgIGF2YWlsID0gdy0+ZW5kIC0gdy0+cDsKKworICAgICAgICBpZiAoYXZhaWwgPiBsZW4pCisgICAgICAgICAgICBhdmFpbCA9IGxlbjsKKworICAgICAgICBtZW1jcHkoIHctPnAsIHNyYywgYXZhaWwgKTsKKyAgICAgICAgc3JjICs9IGF2YWlsOworICAgICAgICBsZW4gLT0gYXZhaWw7CisKKyAgICAgICAgdy0+cCArPSBhdmFpbDsKKyAgICAgICAgaWYgKHctPnAgPT0gdy0+ZW5kKSB7CisgICAgICAgICAgICBpZiAoSEFORExFX0VJTlRSKHdyaXRlKHctPmZkLCB3LT5idWZmLCB3LT5wIC0gdy0+YnVmZikpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHctPnAgPSB3LT5idWZmOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAord3JpdGVyX2RvbmUoIFdyaXRlciogIHcgKQoreworICAgIGlmICh3LT5wID4gdy0+YnVmZikgeworICAgICAgICBIQU5ETEVfRUlOVFIod3JpdGUody0+ZmQsIHctPmJ1ZmYsIHctPnAgLSB3LT5idWZmKSk7CisgICAgfQorICAgIElHTk9SRV9FSU5UUihjbG9zZSggdy0+ZmQgKSk7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZXJfbWFyZ2luKCBXcml0ZXIqICB3LCBpbnQgIG1hcmdpbikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAgc3BhY2VzWzEwXSA9ICIgICAgICAgICAgIjsKKyAgICB3aGlsZSAobWFyZ2luID49IDEwKSB7CisgICAgICAgIHdyaXRlcl93cml0ZSh3LHNwYWNlcywxMCk7CisgICAgICAgIG1hcmdpbiAtPSAxMDsKKyAgICB9CisgICAgaWYgKG1hcmdpbiA+IDApCisgICAgICAgIHdyaXRlcl93cml0ZSh3LHNwYWNlcyxtYXJnaW4pOworfQorCitzdGF0aWMgdm9pZAord3JpdGVyX2MoV3JpdGVyKiAgdywgY2hhciAgYykKK3sKKyAgICB3cml0ZXJfd3JpdGUodywgJmMsIDEpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVyX3N0cihXcml0ZXIqICB3LCBjb25zdCBjaGFyKiAgc3RyKQoreworICAgIHdyaXRlcl93cml0ZSh3LCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVyX25vZGUoV3JpdGVyKiB3LCBjb25zdCBBQ29uZmlnKiBub2RlLCBpbnQgbWFyZ2luKSB7CisgICAgd3JpdGVyX21hcmdpbih3LG1hcmdpbik7CisgICAgd3JpdGVyX3N0cih3LCBub2RlLT5uYW1lKTsKKyAgICB3cml0ZXJfYyh3LCcgJyk7CisKKyAgICBpZiAobm9kZS0+dmFsdWVbMF0pIHsKKyAgICAgICAgd3JpdGVyX3N0cih3LCBub2RlLT52YWx1ZSk7CisgICAgICAgIHdyaXRlcl9jKHcsJ1xuJyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFDb25maWcqICBjaGlsZDsKKworICAgICAgICB3cml0ZXJfYyh3LCAneycpOworICAgICAgICB3cml0ZXJfYyh3LCAnXG4nKTsKKworICAgICAgICBmb3IgKGNoaWxkID0gbm9kZS0+Zmlyc3RfY2hpbGQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorICAgICAgICAgICAgd3JpdGVyX25vZGUodyxjaGlsZCxtYXJnaW4rNCk7CisKKyAgICAgICAgd3JpdGVyX21hcmdpbih3LG1hcmdpbik7CisgICAgICAgIHdyaXRlcl9jKHcsJ30nKTsKKyAgICAgICAgd3JpdGVyX2ModywnXG4nKTsKKyAgICB9Cit9CisKK2ludCBhY29uZmlnX3NhdmVfZmlsZShjb25zdCBBQ29uZmlnKiByb290LCBjb25zdCBjaGFyKiBmbikgeworICAgIEFDb25maWcqICBjaGlsZDsKKyAgICBXcml0ZXIgICAgd1sxXTsKKworICAgIGlmICh3cml0ZXJfaW5pdCh3LGZuKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoY2hpbGQgPSByb290LT5maXJzdF9jaGlsZDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisgICAgICAgIHdyaXRlcl9ub2RlKHcsY2hpbGQsMCk7CisKKyAgICB3cml0ZXJfZG9uZSh3KTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjlmZGFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Fjb25maWctZmlsZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qKiBBTkRST0lEIENPTkZJR1VSQVRJT04gRklMRSBTVVBQT1JUCisgKioKKyAqKiBBIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBsb2FkZWQgYXMgYSBzaW1wbHJlIHRyZWUgb2YgKGtleSx2YWx1ZSkKKyAqKiBwYWlycy4ga2V5cyBhbmQgdmFsdWVzIGFyZSBzaW1wbGUgc3RyaW5ncworICoqLwordHlwZWRlZiBzdHJ1Y3QgQUNvbmZpZyAgQUNvbmZpZzsKKworc3RydWN0IEFDb25maWcKK3sKKyAgICBBQ29uZmlnKiAgICAgbmV4dDsKKyAgICBBQ29uZmlnKiAgICAgZmlyc3RfY2hpbGQ7CisgICAgQUNvbmZpZyogICAgIGxhc3RfY2hpbGQ7CisgICAgY29uc3QgY2hhciogIG5hbWU7CisgICAgY29uc3QgY2hhciogIHZhbHVlOworfTsKKworLyogcGFyc2UgYSB0ZXh0IHN0cmluZyBpbnRvIGEgY29uZmlnIG5vZGUgdHJlZSAqLworZXh0ZXJuIHZvaWQgICBhY29uZmlnX2xvYWQoQUNvbmZpZyogIHJvb3QsIGNoYXIqICBkYXRhKTsKKworLyogcGFyc2UgYSBmaWxlIGludG8gYSBjb25maWcgbm9kZSB0cmVlLCByZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZSAqLworZXh0ZXJuIGludCAgICBhY29uZmlnX2xvYWRfZmlsZShBQ29uZmlnKiAgcm9vdCwgY29uc3QgY2hhciogIHBhdGgpOworCisvKiBzYXZlIGEgY29uZmlnIG5vZGUgdHJlZSBpbnRvIGEgZmlsZSwgcmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCAtMSBvdGhlcndpc2UgKi8KK2V4dGVybiBpbnQgYWNvbmZpZ19zYXZlX2ZpbGUoY29uc3QgQUNvbmZpZyogcm9vdCwgY29uc3QgY2hhciogcGF0aCk7CisKKy8qIGNyZWF0ZSBhIHNpbmdsZSBjb25maWcgbm9kZSAqLworZXh0ZXJuIEFDb25maWcqICBhY29uZmlnX25vZGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworCisvKiBsb2NhdGUgYSBuYW1lZCBjaGlsZCBvZiBhIGNvbmZpZyBub2RlICovCitleHRlcm4gY29uc3QgQUNvbmZpZyogYWNvbmZpZ19maW5kX2NvbnN0KGNvbnN0IEFDb25maWcqIHJvb3QsIGNvbnN0IGNoYXIqIG5hbWUpOworCisvKiBsb2NhdGUgYSBuYW1lZCBjaGlsZCBvZiBhIGNvbmZpZyBub2RlLiBOVUxMIGlmIGl0IGRvZXNuJ3QgZXhpc3QuICovCitleHRlcm4gQUNvbmZpZyogYWNvbmZpZ19maW5kKEFDb25maWcqIHJvb3QsIGNvbnN0IGNoYXIqIG5hbWUpOworCisvKiBhZGQgYSBuYW1lZCBjaGlsZCB0byBhIGNvbmZpZyBub2RlIChvciBtb2RpZnkgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMpICovCitleHRlcm4gdm9pZCBhY29uZmlnX3NldChBQ29uZmlnKiByb290LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7CisKKy8qIGxvb2sgdXAgYSBjaGlsZCBieSBuYW1lIGFuZCByZXR1cm4gaXRzIHZhbHVlLCBldmVudHVhbGx5IGNvbnZlcnRlZAorICogaW50byBhIGJvb2xlYW4gb3IgaW50ZWdlciAqLworZXh0ZXJuIGludCBhY29uZmlnX2Jvb2woY29uc3QgQUNvbmZpZyogcm9vdCwgY29uc3QgY2hhciogbmFtZSwgaW50IF9kZWZhdWx0KTsKK2V4dGVybiB1bnNpZ25lZCBhY29uZmlnX3Vuc2lnbmVkKGNvbnN0IEFDb25maWcqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgX2RlZmF1bHQpOworZXh0ZXJuIGludCBhY29uZmlnX2ludChjb25zdCBBQ29uZmlnKiByb290LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgX2RlZmF1bHQpOworZXh0ZXJuIGNvbnN0IGNoYXIqIGFjb25maWdfc3RyKGNvbnN0IEFDb25maWcqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfZGVmYXVsdCk7CisKKy8qIFJlY3VzaXZlbHkgZGVzdHJveSBhIG5vZGUgYW5kIGl0cyBjaGlsZHJlbi4gKi8KK2V4dGVybiB2b2lkIGFjb25maWdfbm9kZV9mcmVlKEFDb25maWcgKnJvb3QpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Fjb25maWctZmlsZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwYTBiZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworbmFtZXNwYWNlIHsKKworY2xhc3MgU2NvcGVkQUNvbmZpZyB7CitwdWJsaWM6CisgICAgU2NvcGVkQUNvbmZpZygpIDogbU5vZGUoTlVMTCkge30KKworICAgIGV4cGxpY2l0IFNjb3BlZEFDb25maWcoQUNvbmZpZyogbm9kZSkgOiBtTm9kZShub2RlKSB7fQorCisgICAgflNjb3BlZEFDb25maWcoKSB7CisgICAgICAgIGlmIChtTm9kZSkgeworICAgICAgICAgICAgYWNvbmZpZ19ub2RlX2ZyZWUobU5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbU5vZGUgIT0gTlVMTDsgfQorCisgICAgQUNvbmZpZyogZ2V0KCkgY29uc3QgeyByZXR1cm4gbU5vZGU7IH0KKworcHJpdmF0ZToKKyAgICBBQ29uZmlnKiBtTm9kZTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKEFDb25maWdGaWxlLCBFbXB0eSkgeworICAgIFNjb3BlZEFDb25maWcgbm9kZShhY29uZmlnX25vZGUoIiIsICIiKSk7CisgICAgRVhQRUNUX1RSVUUobm9kZS5pc1ZhbGlkKCkpOworICAgIEVYUEVDVF9GQUxTRShhY29uZmlnX2ZpbmQobm9kZS5nZXQoKSwgImZsYWciKSk7Cit9CisKK1RFU1QoQUNvbmZpZ0ZpbGUsIFNldCkgeworICAgIFNjb3BlZEFDb25maWcgbm9kZShhY29uZmlnX25vZGUoIiIsICIiKSk7CisKKyAgICBhY29uZmlnX3NldChub2RlLmdldCgpLCAiZm9vIiwgIjEyMyIpOworICAgIEVYUEVDVF9FUSgxMjMsIGFjb25maWdfaW50KG5vZGUuZ2V0KCksICJmb28iLCA2NzgpKTsKKworICAgIGFjb25maWdfc2V0KG5vZGUuZ2V0KCksICJmb28iLCAiLTc4OSIpOworICAgIEVYUEVDVF9FUSgtNzg5LCBhY29uZmlnX2ludChub2RlLmdldCgpLCAiZm9vIiwgOTk5KSk7CisKKyAgICBhY29uZmlnX3NldChub2RlLmdldCgpLCAiYmFyLmZvbyIsICIxMTEiKTsKKyAgICBFWFBFQ1RfRVEoLTc4OSwgYWNvbmZpZ19pbnQobm9kZS5nZXQoKSwgImZvbyIsIDk5OSkpOworICAgIEVYUEVDVF9FUSgxMTEsIGFjb25maWdfaW50KG5vZGUuZ2V0KCksICJiYXIuZm9vIiwgOTk5KSk7Cit9CisKK1RFU1QoQUNvbmZpZ0ZpbGUsIFNpbXBsZVZhbHVlcykgeworICAgIFNjb3BlZEFDb25maWcgbm9kZShhY29uZmlnX25vZGUoIiIsICIiKSk7CisKKyAgICBjaGFyIGtEYXRhW10gPQorICAgICAgICAiaW50ZWdlciAtMTIzNFxuIgorICAgICAgICAiYm9vbGVhbiB0cnVlXG4iCisgICAgICAgICJ1bnNpZ25lZCAxMjhcbiIKKyAgICAgICAgInN0cmluZyAgVGhpcyBpcyBhIHN0cmluZyI7CisKKyAgICBhY29uZmlnX2xvYWQobm9kZS5nZXQoKSwga0RhdGEpOworICAgIEVYUEVDVF9FUSgtMTIzNCwgYWNvbmZpZ19pbnQobm9kZS5nZXQoKSwgImludGVnZXIiLCAwKSk7CisgICAgRVhQRUNUX1RSVUUoYWNvbmZpZ19ib29sKG5vZGUuZ2V0KCksICJib29sZWFuIiwgMCkpOworICAgIEVYUEVDVF9FUSgxMjhVLCBhY29uZmlnX3Vuc2lnbmVkKG5vZGUuZ2V0KCksICJ1bnNpZ25lZCIsIDApKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlRoaXMgaXMgYSBzdHJpbmciLCBhY29uZmlnX3N0cihub2RlLmdldCgpLCAic3RyaW5nIiwgImJhaCIpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hc3NlcnQuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hc3NlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGIyYzlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Fzc2VydC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hc3NlcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhbmljLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICBmaWxlOworICAgIGxvbmcgICAgICAgICBsaW5lbm87CisgICAgY29uc3QgY2hhciogIGZ1bmN0aW9uOworfSBBc3NlcnRMb2M7CisKK0Fzc2VydExvYyoKK19nZXRfYXNzZXJ0X2xvYyh2b2lkKQoreworICAgIC8qIFhYWDogVXNlIHRocmVhZC1sb2NhbCBzdG9yYWdlIGluc3RlYWQgPyAqLworICAgIHN0YXRpYyBBc3NlcnRMb2MgIGxvY1sxXTsKKyAgICByZXR1cm4gbG9jOworfQorCit2b2lkCitfYW5kcm9pZF9hc3NlcnRfbG9jKCBjb25zdCBjaGFyKiAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgZmlsZUxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmdW5jdGlvbk5hbWUgKQoreworICAgIEFzc2VydExvYyogIGxvYyA9IF9nZXRfYXNzZXJ0X2xvYygpOworCisgICAgbG9jLT5maWxlICAgICA9IGZpbGVOYW1lOworICAgIGxvYy0+bGluZW5vICAgPSBmaWxlTGluZW5vOworICAgIGxvYy0+ZnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7Cit9CisKK3N0YXRpYyB2b2lkCitfYW5kcm9pZF9hc3NlcnRfbG9nX2RlZmF1bHQoIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKQoreworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKK30KKworc3RhdGljIEFBc3NlcnRMb2dGdW5jICBfYXNzZXJ0X2xvZyA9IF9hbmRyb2lkX2Fzc2VydF9sb2dfZGVmYXVsdDsKKwordm9pZCAgYW5kcm9pZF9hc3NlcnRfZmFpbChjb25zdCBjaGFyKiAgbWVzc2FnZUZtdCwgLi4uKQoreworICAgIEFzc2VydExvYyogIGxvYyA9IF9nZXRfYXNzZXJ0X2xvYygpOworICAgIHZhX2xpc3QgIGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBtZXNzYWdlRm10KTsKKyAgICBfYXNzZXJ0X2xvZyhtZXNzYWdlRm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICBhbmRyb2lkX3BhbmljKCJBU1NFUlRJT04gRkFJTFVSRSAoJXM6JWQpIGluICVzXG4iLCBsb2MtPmZpbGUsIGxvYy0+bGluZW5vLCBsb2MtPmZ1bmN0aW9uKTsKK30KKwordm9pZCAgYW5kcm9pZF9hc3NlcnRfcmVnaXN0ZXJMb2coIEFBc3NlcnRMb2dGdW5jICBsb2dnZXIgKQoreworICAgIGlmIChsb2dnZXIgPT0gTlVMTCkKKyAgICAgICAgYW5kcm9pZF9wYW5pYygiUGFzc2luZyBOVUxMIHRvICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisgICAgX2Fzc2VydF9sb2cgPSBsb2dnZXI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYXNzZXJ0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYXNzZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzNzRkZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hc3NlcnQuaApAQCAtMCwwICsxLDE4NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogVGhlc2UgYXJlIGFsd2F5cyBkZWZpbmVkLCBzbyB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIG1hY3JvcyB0aGF0CisgKiBjYWxsIHRoZW0sIGluZGVwZW5kZW50bHkgb2YgdGhlIHZhbHVlIG9mIEFDT05GSUdfVVNFX0FTU0VSVAorICovCisKKy8qIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgbWFjcm9zIHRvIHJlZ2lzdGVyIHRoZSBjdXJyZW50IHNvdXJjZSBsb2NhdGlvbiAqLwordm9pZCAgX2FuZHJvaWRfYXNzZXJ0X2xvYyhjb25zdCBjaGFyKiAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICBmaWxlTGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZnVuY3Rpb25OYW1lKTsKKworLyogQ2FsbCB0aGlzIGFmdGVyIF9hbmRyb2lkX2Fzc2VydF9sb2MoKSB0byBkdW1wIGFuIGFzc2VydGlvbiBmYWlsZWQgbWVzc2FnZQorICoganVzdCBiZWZvcmUgcGFuaWNraW5nLCBpLmUuIGFib3J0IHRoZSBjdXJyZW50IHByb2dyYW0KKyAqLwordm9pZCBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpIGFuZHJvaWRfYXNzZXJ0X2ZhaWwoY29uc3QgY2hhciogIG1lc3NhZ2VGbXQsIC4uLik7CisKKy8qIFNlZSBfYW5kcm9pZF9hc3NlcnRfbG9jKCkgKi8KKyNkZWZpbmUgIF9BTkRST0lEX0FTU0VSVF9MT0MoKSAgXAorICAgIF9hbmRyb2lkX2Fzc2VydF9sb2MoX19GSUxFX18sX19MSU5FX18sX19GVU5DVElPTl9fKQorCisvKiBSZXBvcnQgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgdGhlbiBwYW5pYy4gQXJndW1lbnRzIGFyZSBmb3JtYXR0ZWQgc3RyaW5nICovCisjZGVmaW5lICBfQU5EUk9JRF9BU1NFUlRfRkFJTCguLi4pIFwKKyAgICBhbmRyb2lkX2Fzc2VydF9mYWlsKF9fVkFfQVJHU19fKQorCisvKiBSZXBvcnQgYW4gdW5yZWFjaGFibGUgY29kZSAqLworI2RlZmluZSAgX0FORFJPSURfQVNTRVJUX1VOUkVBQ0hFRCguLi4pICAgXAorICAgIGRvIHsgXAorICAgICAgICBfQU5EUk9JRF9BU1NFUlRfTE9DKCk7IFwKKyAgICAgICAgYW5kcm9pZF9hc3NlcnRfZmFpbChfX1ZBX0FSR1NfXyk7IFwKKyAgICB9IHdoaWxlICgwKTsKKworLyogQ2hlY2sgdGhhdCAnY29uZCcgaXMgdHJ1ZSwgYW5kIHJlcG9ydCBhbiBhc3NlcnRpb24gZmFpbHVyZSBvdGhlcndpc2UgKi8KKyNkZWZpbmUgIF9BTkRST0lEX0FTU0VSVChjb25kLC4uLikgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKCEoY29uZCkpIHsgXAorICAgICAgICAgICAgX0FORFJPSURfQVNTRVJUX0xPQygpOyBcCisgICAgICAgICAgICBhbmRyb2lkX2Fzc2VydF9mYWlsKF9fVkFfQVJHU19fKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBDaGVjayB0aGF0ICdjb25kJyBpcyBib29sZWFuIHRydWUgKGkuZS4gbm90IDApLCBhbmQgcmVwb3J0IGFuIGFzc2VydGlvbgorICogZmFpbHVyZSBvdGhlcndpc2UuICovCisjZGVmaW5lICBfQU5EUk9JRF9BU1NFUlRfQk9PTChjb25kXyxleHBlY3RlZF8pICAgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaW50ICBjb25kX3Jlc3VsdF8gICA9ICEhKGNvbmRfKTsgXAorICAgICAgICBpbnQgIGNvbmRfZXhwZWN0ZWRfID0gISEoZXhwZWN0ZWRfKTsgXAorICAgICAgICBpZiAoY29uZF9yZXN1bHRfICE9IGNvbmRfZXhwZWN0ZWRfKSB7IFwKKyAgICAgICAgICAgIF9BTkRST0lEX0FTU0VSVF9MT0MoKTsgXAorICAgICAgICAgICAgYW5kcm9pZF9hc3NlcnRfZmFpbCgiJXMgaXMgJXMgaW5zdGVhZCBvZiAlc1xuIixcCisgICAgICAgICAgICAgICAjY29uZF8sIFwKKyAgICAgICAgICAgICAgIGNvbmRfcmVzdWx0XyA/ICJUUlVFIiA6ICJGQUxTRSIsIFwKKyAgICAgICAgICAgICAgIGNvbmRfZXhwZWN0ZWRfID8gIlRSVUUiIDogIkZBTFNFIiApOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc2VydCB0aGF0IGEgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBvZiBhIGdpdmVuIGludGVnZXIgdmFsdWUgKi8KKyNkZWZpbmUgIF9BTkRST0lEX0FTU0VSVF9JTlQoY29uZF8sZXhwZWN0ZWRfKSAgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgIGNvbmRfcmVzdWx0XyA9IChjb25kXyk7IFwKKyAgICAgICAgaW50ICBjb25kX2V4cGVjdGVkXyA9IChleHBlY3RlZF8pOyBcCisgICAgICAgIGlmIChjb25kX3Jlc3VsdF8gIT0gY29uZF9leHBlY3RlZF8pIHsgXAorICAgICAgICAgICAgX0FORFJPSURfQVNTRVJUX0xPQygpOyBcCisgICAgICAgICAgICBhbmRyb2lkX2Fzc2VydF9mYWlsKCIlcyBpcyAlZCBpbnN0ZWFkIG9mICVkXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNjb25kXyAsIGNvbmRfcmVzdWx0XywgY29uZF9leHBlY3RlZF8pOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgIF9BTkRST0lEX0FTU0VSVF9JTlRfT1AoY29uZF8sZXhwZWN0ZWRfLG9wXykgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgIGNvbmRfcmVzdWx0XyA9IChjb25kXyk7IFwKKyAgICAgICAgaW50ICBjb25kX2V4cGVjdGVkXyA9IChleHBlY3RlZF8pOyBcCisgICAgICAgIGlmICghKGNvbmRfcmVzdWx0XyBfb3AgY29uZF9leHBlY3RlZF8pKSB7IFwKKyAgICAgICAgICAgIF9BTkRST0lEX0FTU0VSVF9MT0MoKTsgXAorICAgICAgICAgICAgYW5kcm9pZF9hc3NlcnRfZmFpbCgiJXMgaXMgJWQgYW5kIHNob3VsZCBiZSAlcyAlZFxuIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjY29uZF8gLCBjb25kX3Jlc3VsdF8sICNvcF8sIGNvbmRfZXhwZWN0ZWRfKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjICBkZWZpbmUgIF9BTkRST0lEX0FTU0VSVF9QVFIoY29uZF8sZXhwZWN0ZWRfKSAgXAorICAgIGRvIHsgXAorICAgICAgICB2b2lkKiAgY29uZF9yZXN1bHRfID0gKGNvbmRfKTsgXAorICAgICAgICB2b2lkKiAgY29uZF9leHBlY3RlZF8gPSAodm9pZCopKGV4cGVjdGVkXyk7IFwKKyAgICAgICAgaWYgKGNvbmRfcmVzdWx0XyAhPSBjb25kX2V4cGVjdGVkXykgeyBcCisgICAgICAgICAgICBfQU5EUk9JRF9BU1NFUlRfTE9DKCk7IFwKKyAgICAgICAgICAgIGFuZHJvaWRfYXNzZXJ0X2ZhaWwoIiVzIGlzICVwIGluc3RlYWQgb2YgJXBcbiIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2NvbmRfICwgY29uZF9yZXN1bHRfLCBjb25kX2V4cGVjdGVkXyk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworIyAgZGVmaW5lICBfQU5EUk9JRF9ORVZFUl9OVUxMKHB0cl8pICBcCisgICAgZG8geyBcCisgICAgICAgIHZvaWQqICBuZXZlcl9wdHJfID0gKHB0cl8pOyBcCisgICAgICAgIGlmIChuZXZlcl9wdHJfID09IE5VTEwpIHsgXAorICAgICAgICAgICAgX0FORFJPSURfQVNTRVJUX0xPQygpOyBcCisgICAgICAgICAgICBhbmRyb2lkX2Fzc2VydF9mYWlsKCIlcyBpcyBOVUxMXG4iLCAjcHRyXyk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworCisKKyNpZmRlZiBBQ09ORklHX1VTRV9BU1NFUlQKKworIyAgZGVmaW5lICBBQVNTRVJUX0xPQygpICAgX0FORFJPSURfQVNTRVJUX0xPQygpCisjICBkZWZpbmUgIEFBU1NFUlRfRkFJTCguLi4pIF9BTkRST0lEX0FTU0VSVF9GQUlMKF9fVkFfQVJHU19fKQorCisvKiBBc3NlcnQgd2UgbmV2ZXIgcmVhY2ggc29tZSBjb2RlIHBvaW50ICovCisjICBkZWZpbmUgIEFBU1NFUlRfVU5SRUFDSEVEKC4uLikgICBfQU5EUk9JRF9BU1NFUlRfVU5SRUFDSEVEKF9fVkFfQVJHU19fKQorCisKKy8qIEdlbmVyaWMgYXNzZXJ0aW9uLCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGZvcm1hdHRlZCBzdHJpbmcgcGFyYW1ldGVycyAqLworIyAgZGVmaW5lICBBQVNTRVJUKGNvbmQsLi4uKSAgX0FORFJPSURfQVNTRVJUKGNvbmQsX19WQV9BUkdTX18pCisKKy8qIEFzc2VydCBhIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gYSBnaXZlbiBib29sZWFuICovCisjICBkZWZpbmUgIEFBU1NFUlRfQk9PTChjb25kXyxleHBlY3RlZF8pICAgX0FORFJPSURfQVNTRVJUX0JPT0woY29uZF8sZXhwZWN0ZWRfKQorCisvKiBBc3NlcnQgYSBjb25kaXRpb24gZXZhbHVhdGVzIHRvIGEgZ2l2ZW4gaW50ZWdlciAqLworIyAgZGVmaW5lICBBQVNTRVJUX0lOVChjb25kXyxleHBlY3RlZF8pICBfQU5EUk9JRF9BU1NFUlRfSU5UKGNvbmRfLGV4cGVjdGVkXykKKworIyAgZGVmaW5lICBBQVNTRVJUX0lOVF9MVChjb25kXyxleHBlY3RlZF8pICBfQU5EUk9JRF9BU1NFUlRfSU5UX09QKGNvbmRfLGV4cGVjdGVkXyw8ICkKKyMgIGRlZmluZSAgQUFTU0VSVF9JTlRfTFRFKGNvbmRfLGV4cGVjdGVkXykgX0FORFJPSURfQVNTRVJUX0lOVF9PUChjb25kXyxleHBlY3RlZF8sPD0gKQorIyAgZGVmaW5lICBBQVNTRVJUX0lOVF9HVChjb25kXyxleHBlY3RlZF8pICBfQU5EUk9JRF9BU1NFUlRfSU5UX09QKGNvbmRfLGV4cGVjdGVkXyw+ICkKKyMgIGRlZmluZSAgQUFTU0VSVF9JTlRfR1RFKGNvbmRfLGV4cGVjdGVkXykgX0FORFJPSURfQVNTRVJUX0lOVF9PUChjb25kXyxleHBlY3RlZF8sPj0gKQorIyAgZGVmaW5lICBBQVNTRVJUX0lOVF9FUShjb25kXyxleHBlY3RlZF8pICBfQU5EUk9JRF9BU1NFUlRfSU5UX09QKGNvbmRfLGV4cGVjdGVkXyw9PSkKKyMgIGRlZmluZSAgQUFTU0VSVF9JTlRfTkVRKGNvbmRfLGV4cGVjdGVkXykgX0FORFJPSURfQVNTRVJUX0lOVF9PUChjb25kXyxleHBlY3RlZF8sIT0pCisKKyMgIGRlZmluZSAgQUFTU0VSVF9QVFIoY29uZF8sZXhwZWN0ZWRfKSAgX0FORFJPSURfQVNTRVJUX1BUUihjb25kXyxleHBlY3RlZF8pCisKKyMgIGRlZmluZSAgQU5FVkVSX05VTEwocHRyXykgICBfQU5EUk9JRF9ORVZFUl9OVUxMKHB0cl8pCisKKyNlbHNlIC8qICFBQ09ORklHX1VTRV9BU1NFUlQgKi8KKworIyAgZGVmaW5lIEFBU1NFUlRfTE9DKCkgICAgICAgICAgICAgICgodm9pZCkwKQorIyAgZGVmaW5lICBBQVNTRVJUX0ZBSUwoLi4uKSAgICAgICAgKCh2b2lkKTApCisjICBkZWZpbmUgIEFBU1NFUlRfVU5SRUFDSEVEKC4uLikgICAoKHZvaWQpMCkKKworLyogZm9yIHNpZGUtZWZmZWN0cyAqLworIyAgZGVmaW5lICBBQVNTRVJUKGNvbmQsLi4uKSAgICAgICAgICAgICAoKHZvaWQpKGNvbmQpLCAodm9pZCkwKQorIyAgZGVmaW5lICBBQVNTRVJUX0JPT0woY29uZCx2YWwpICAgICAgICAoKHZvaWQpKGNvbmQpLCAodm9pZCkwKQorIyAgZGVmaW5lICBBQVNTRVJUX0lOVChjb25kLHZhbCkgICAgICAgICBBQVNTRVJUX0JPT0woY29uZCx2YWwpCisjICBkZWZpbmUgIEFBU1NFUlRfUFRSKGNvbmQsdmFsKSAgICAgICAgIEFBU1NFUlRfQk9PTChjb25kLHZhbCkKKyMgIGRlZmluZSAgQU5FVkVSX05VTEwocHRyKSAgICAgICAgICAgICAgKCh2b2lkKShwdHIpLCAodm9pZCkwKQorCisjZW5kaWYgLyogIUFDT05GSUdfVVNFX0FTU0VSVCAqLworCisjICBkZWZpbmUgIEFBU1NFUlRfVFJVRShjb25kXykgICBBQVNTRVJUX0JPT0woY29uZF8sMSkKKyMgIGRlZmluZSAgQUFTU0VSVF9GQUxTRShjb25kXykgIEFBU1NFUlRfQk9PTChjb25kXywwKQorCisKKy8qIHRoaXMgY2FuIGJlIHVzZWQgdG8gcmVkaXJlY3QgdGhlIGFzc2VydGlvbiBsb2cgdG8gc29tZXRoaW5nCisgKiBvdGhlciB0aGFuIHN0ZGVyci4gTm90ZSB0aGF0IGFuZHJvaWRfYXNzZXJ0X2ZhaWwgYWxzbyBjYWxscworICogYW5kcm9pZF92cGFuaWMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFBc3NlcnRMb2dGdW5jKSggY29uc3QgY2hhciogIGZtdCwgdmFfbGlzdCAgYXJncyApOwordm9pZCAgYW5kcm9pZF9hc3NlcnRfcmVnaXN0ZXJMb2coIEFBc3NlcnRMb2dGdW5jICBsb2dnZXIgKTsKKworLy8gQ29tcGlsZS10aW1lIGFzc2VydGlvbi4gSWYgfGNvbmR8IGlzIGZhbHNlIGF0IGNvbXBpbGUgdGltZSwgYW4KKy8vIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBlbWl0dGVkIGJ5IHRoZSBjb21waWxlci4KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBBQVNTRVJUX1NUQVRJQyhjb25kKSAgIHN0YXRpY19hc3NlcnQoY29uZCkKKyNlbHNlICAvLyAhX19jcGx1cGx1cworI2RlZmluZSBBQVNTRVJUX1NUQVRJQyhjb25kKSBcCisgICAgdHlwZWRlZiBjaGFyIF9BQVNTRVJUX0NPTkNBVChfX2FuZHJvaWRfYXNzZXJ0aW9uX2ZhaWxlZF8sX19MSU5FX18pIFwKKyAgICAgICAgWzIqISEoY29uZCkgLSAxXTsKKworI2RlZmluZSBfQUFTU0VSVF9DT05DQVQoeCwgeSkgX0FBU1NFUlRfQ09OQ0FUXyh4LCB5KQorI2RlZmluZSBfQUFTU0VSVF9DT05DQVRfKHgsIHkpIHggIyMgeQorI2VuZGlmICAvLyAhX19jcGx1c3BsdXMKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYXN5bmMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2FzeW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQyNDhkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2FzeW5jLmNwcApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2FzeW5jLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGhyZWFkcy9Bc3luYy5oIgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpUaHJlYWRGbGFnczsKKworYm9vbCBhc3luY1dpdGhQYXJhbShhc3luY19mdW5jdGlvbl90IGZ1bmMsIGJvb2wgbWFza1NpZ25hbHMpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6YXN5bmMoZnVuYywKKyAgICAgICAgICAgICAgICBtYXNrU2lnbmFscyA/IFRocmVhZEZsYWdzOjpNYXNrU2lnbmFscyA6IFRocmVhZEZsYWdzOjpOb0ZsYWdzKTsKK30KKworYm9vbCBhc3luYyhhc3luY19mdW5jdGlvbl90IGZ1bmMpIHsKKyAgICByZXR1cm4gYXN5bmNXaXRoUGFyYW0oZnVuYywgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYXN5bmMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9hc3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzNlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYXN5bmMuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKwordHlwZWRlZiBpbnRwdHJfdCAoKmFzeW5jX2Z1bmN0aW9uX3QpKHZvaWQpOworCisvLyBSdW4gdGhlIHBhc3NlZCB8ZnVuY3wgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsIG5vdCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2gKKy8vIElmIHxtYXNrU2lnbmFsc3wgaXMgdHJ1ZSwgbWFzayBhbGwgUG9zaXggc2lnbmFscyBpbiB0aGUgbmV3IHRocmVhZAorLy8gUmV0dXJucyB0cnVlIGlmIHRocmVhZCBzdGFydGVkIHN1Y2Nlc2Z1bGx5Citib29sIGFzeW5jV2l0aFBhcmFtKGFzeW5jX2Z1bmN0aW9uX3QgZnVuYywgYm9vbCBtYXNrU2lnbmFscyk7CisKKy8vIEVxdWl2YWxlbnQgdG8gYXN5bmNXaXRoUGFyYW0oZnVuYywgdHJ1ZSk7Citib29sIGFzeW5jKGFzeW5jX2Z1bmN0aW9uX3QgZnVuYyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2J1ZnByaW50LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYnVmcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGE2MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2J1ZnByaW50LmMKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgaW5jbHVkZSAid2luZG93cy5oIgorIyAgaW5jbHVkZSAic2hsb2JqLmgiCisjZWxzZQorIyAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNkZWZpbmUgIEQoLi4uKSAgVkVSQk9TRV9QUklOVChpbml0LF9fVkFfQVJHU19fKQorCisKKy8qKiBVU0VGVUwgU1RSSU5HIEJVRkZFUiBGVU5DVElPTlMKKyAqKi8KKworY2hhcioKK3ZidWZwcmludCggY2hhciogICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgY2hhciogICAgICAgIGJ1ZmZlcl9lbmQsCisgICAgICAgICAgIGNvbnN0IGNoYXIqICBmbXQsCisgICAgICAgICAgIHZhX2xpc3QgICAgICBhcmdzICkKK3sKKyAgICBpbnQgIGxlbiA9IHZzbnByaW50ZiggYnVmZmVyLCBidWZmZXJfZW5kIC0gYnVmZmVyLCBmbXQsIGFyZ3MgKTsKKyAgICBpZiAobGVuIDwgMCB8fCBidWZmZXIrbGVuID49IGJ1ZmZlcl9lbmQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlciA8IGJ1ZmZlcl9lbmQpCisgICAgICAgICAgICBidWZmZXJfZW5kWy0xXSA9IDA7CisgICAgICAgIHJldHVybiBidWZmZXJfZW5kOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyICsgbGVuOworfQorCitjaGFyKgorYnVmcHJpbnQoY2hhciogIGJ1ZmZlciwgY2hhciogIGVuZCwgY29uc3QgY2hhciogIGZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0ICBhcmdzOworICAgIGNoYXIqICAgIHJlc3VsdDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgcmVzdWx0ID0gdmJ1ZnByaW50KGJ1ZmZlciwgZW5kLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm4gIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9idWZwcmludC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwMWI1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9idWZwcmludC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gV0FSTklORzogVXNhZ2Ugb2YgYnVmcHJpbnQgZnVuY3Rpb25zIGlzIGNvbnNpZGVyZWQgZGVwcmVjYXRlZC4gVHJ5IHRvCisvLyAgICAgICAgICBhdm9pZCB0aGVtIHdoZW5ldmVyIHBvc3NpYmxlLgorCisvKiogRk9STUFUVEVEIEJVRkZFUiBQUklOVElORworICoqCisgKiogIGJ1ZnByaW50KCkgYWxsb3dzIHlvdXIgdG8gZWFzaWx5IGFuZCBzYWZlbHkgYXBwZW5kIGZvcm1hdHRlZCBzdHJpbmcKKyAqKiAgY29udGVudCB0byBhIGdpdmVuIGJvdW5kZWQgY2hhcmFjdGVyIGJ1ZmZlciwgaW4gYSB3YXkgdGhhdCBpcyBlYXNpZXIKKyAqKiAgdG8gdXNlIHRoYW4gcmF3IHNucHJpbnRmKCkKKyAqKgorICoqICAnYnVmZmVyJyAgaXMgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIsCisgKiogICdidWZmZW5kJyBpcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHRoZSBmdW5jdGlvbiBhc3N1bWVzIChidWZmZXIgPD0gYnVmZmVuZCkKKyAqKiAgJ2Zvcm1hdCcgIGlzIGEgc3RhbmRhcmQgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcsIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIKKyAqKiAgICAgICAgICAgIG9mIGZvcm1hdHRpbmcgYXJndW1lbnRzCisgKioKKyAqKiAgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG5leHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciBpZiBldmVyeXRoaW5nIGZpdHMKKyAqKiAgaW4gaXQuIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb3IgZm9ybWF0dGluZyBlcnJvciwgaXQgd2lsbCBhbHdheXMgcmV0dXJuICJidWZmZW5kIgorICoqCisgKiogIHRoaXMgYWxsb3dzIHlvdSB0byBjaGFpbiBzZXZlcmFsIGNhbGxzIHRvIGJ1ZnByaW50KCkgYW5kIG9ubHkgY2hlY2sgZm9yCisgKiogIG92ZXJmbG93IGF0IHRoZSBlbmQsIGZvciBleGVtcGxlOgorICoqCisgKiogICAgIGNoYXIgICBidWZmZXJbMTAyNF07CisgKiogICAgIGNoYXIqICBwICAgPSBidWZmZXI7CisgKiogICAgIGNoYXIqICBlbmQgPSBwICsgc2l6ZW9mKGJ1ZmZlcik7CisgKioKKyAqKiAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiVzLyVzIiwgZmlyc3QsIHNlY29uZCk7CisgKiogICAgIHAgPSBidWZwcmludChwLCBlbmQsICIvJXMiLCB0aGlyZCk7CisgKiogICAgIGlmIChwID49IGVuZCkgLS0tPiBvdmVyZmxvdworICoqCisgKiogIGFzIGEgY29udmVuaWVuY2UsIHRoZSBhcHBlbmRlZCBzdHJpbmcgaXMgemVyby10ZXJtaW5hdGVkIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICoqICAodGhpcyBtZWFucyB0aGF0IGV2ZW4gaWYgcCA+PSBlbmQsIHRoZSBjb250ZW50IG9mICJidWZmZXIiIGlzIHplcm8tdGVybWluYXRlZCkKKyAqKgorICoqICB2YnVmcHJpbnQoKSBpcyBhIHZhcmlhbnQgdGhhdCBhY2NlcHRzIGEgdmFfbGlzdCBhcmd1bWVudAorICoqLworCitleHRlcm4gY2hhciogICB2YnVmcHJpbnQoY2hhciogIGJ1ZmZlciwgY2hhciogIGJ1ZmZlbmQsIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKTsKK2V4dGVybiBjaGFyKiAgIGJ1ZnByaW50IChjaGFyKiAgYnVmZmVyLCBjaGFyKiAgYnVmZmVuZCwgY29uc3QgY2hhciogIGZtdCwgLi4uICk7CisKKy8vIEFwcGVuZCB0aGUgcGF0aCB0byBhbGwgZW11bGF0b3IgdGVtcG9yYXJ5IGZpbGVzIHRvIGEgYm91bmRlZCB8YnVmZmVyfCB0aGF0CisvLyBzdG9wcyBhdCB8YnVmZmVuZHwsIGFuZCByZXR1cm4gdGhlIG5ldyBwb3NpdGlvbi4KK2V4dGVybiBjaGFyKiAgYnVmcHJpbnRfdGVtcF9kaXIgICAoY2hhciogIGJ1ZmZlciwgY2hhciogIGJ1ZmZlbmQpOworCisvLyBBcHBlbmQgdGhlIHBhdGggb2YgYSBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lZCB8c3VmZml4fCByZWxhdGl2ZSB0byB0aGUKKy8vIG91dHB1dCBvZiBidWZwcmludF90ZW1wX2RpcigpIHRvIGEgYm91bmRlZCB8YnVmZmVyfCB0aGF0IHN0b3BzIGF0CisvLyB8YnVmZmVuZHwsIGFuZCByZXR1cm4gdGhlIG5ldyBwb3NpdGlvbi4KK2V4dGVybiBjaGFyKiAgYnVmcHJpbnRfdGVtcF9maWxlICAoY2hhciogIGJ1ZmZlciwgY2hhciogIGJ1ZmZlbmQsIGNvbnN0IGNoYXIqICBzdWZmaXgpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9idWZwcmludF9zeXN0ZW0uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2J1ZnByaW50X3N5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0MzcwMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9idWZwcmludF9zeXN0ZW0uY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgYnVmcHJpbnRmX3h4eCgpIGZ1bmN0aW9ucyB0aGF0IHJlbHkgb24KKy8vIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbSB0byBtYWtlIHRoZW0gbW9ja2FibGUgZHVyaW5nIHVuaXQtdGVzdGluZy4KKworY2hhciogYnVmcHJpbnRfdGVtcF9kaXIoY2hhciogYnVmZiwgY2hhciogZW5kKSB7CisgICAgcmV0dXJuIGJ1ZnByaW50KGJ1ZmYsIGVuZCwgIiVzIiwgU3lzdGVtOjpnZXQoKS0+Z2V0VGVtcERpcigpLmNfc3RyKCkpOworfQorCitjaGFyKiBidWZwcmludF90ZW1wX2ZpbGUoY2hhciogYnVmZiwgY2hhciogZW5kLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgICByZXR1cm4gYnVmcHJpbnQoYnVmZiwgZW5kLCAiJXMlYyVzIiwgU3lzdGVtOjpnZXQoKS0+Z2V0VGVtcERpcigpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbTo6a0RpclNlcGFyYXRvciwgc3VmZml4KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9idWZwcmludF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYnVmcHJpbnRfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDA1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvYnVmcHJpbnRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworCitURVNUKGJ1ZnByaW50LCBTaW1wbGVTdHJpbmcpIHsKKyAgICBjaGFyIGJ1ZmZlclsxMjhdLCAqcCA9IGJ1ZmZlciwgKmVuZCA9IHAgKyBzaXplb2YoYnVmZmVyKTsKKworICAgIHAgPSBidWZwcmludChwLCBlbmQsICIlcy8lcyIsICJmb28iLCAiYmFyIik7CisgICAgRVhQRUNUX0VRKGJ1ZmZlciArIDcsIHApOworICAgIEVYUEVDVF9TVFJFUSgiZm9vL2JhciIsIGJ1ZmZlcik7Cit9CisKK1RFU1QoYnVmcHJpbnQsIFRydW5jYXRpb25Pbk92ZXJmbG93KSB7CisgICAgY2hhciBidWZmZXJbNF0sICpwLCAqZW5kID0gYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgcCA9IGJ1ZnByaW50KGJ1ZmZlciwgZW5kLCAiZm9vYmFyIik7CisgICAgRVhQRUNUX0VRKGJ1ZmZlciArIDQsIHApOworICAgIEVYUEVDVF9TVFJFUSgiZm9vIiwgYnVmZmVyKTsKK30KKworVEVTVChidWZwcmludCwgVGVtcEZpbGUpIHsKKyAgICBUZXN0U3lzdGVtIHN5cygiL2JpbiIsIDMyKTsKKyAgICBjaGFyIGJ1ZmZlclszMl0sICpwID0gYnVmZmVyLCAqZW5kID0gYnVmZmVyICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgcCA9IGJ1ZnByaW50X3RlbXBfZmlsZShwLCBlbmQsICJ0ZW1wZmlsZSIpOworICAgIEVYUEVDVF9FUShidWZmZXIgKyAxMywgcCk7CisjaWZkZWYgX1dJTjMyCisgICAgRVhQRUNUX1NUUkVRKCIvdG1wXFx0ZW1wZmlsZSIsIGJ1ZmZlcik7CisjZWxzZQorICAgIEVYUEVDVF9TVFJFUSgiL3RtcC90ZW1wZmlsZSIsIGJ1ZmZlcik7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9jYnVmZmVyLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvY2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGFiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvY2J1ZmZlci5jCkBAIC0wLDAgKzEsMjMyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jYnVmZmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJhbGxvYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSAgREVCVUcgIDAKKworI2lmIERFQlVHCisjICBkZWZpbmUgIEFTU0VSVChjb25kLGZtdCwuLi4pICAoeyBpZiAoIShjb25kKSkgeyBmcHJpbnRmKHN0ZGVyciwgZm10LCBfX1ZBX0FSR1NfXyk7IGFzc2VydChjb25kKTsgfSB9KQorI2Vsc2UKKyMgIGRlZmluZSAgQVNTRVJUKGNvbmQsZm10LC4uLikgICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBERUJVRwordm9pZAorY2J1ZmZlcl9hc3NlcnQoIENCdWZmZXIqICBjYiwgY29uc3QgY2hhciogIGZpbGUsIGxvbmcgIGxpbmVubyApCit7CisgICAgY29uc3QgY2hhciogIHJlYXNvbiA9IE5VTEw7CisKKyAgICBpZiAoY2ItPnJwb3MgPCAwIHx8IGNiLT5ycG9zID49IGNiLT5zaXplKSB7CisgICAgICAgIHJlYXNvbiA9ICJycG9zIGlzIG91dCBvZiBib3VuZHMiOworICAgIH0KKyAgICBlbHNlIGlmIChjYi0+Y291bnQgPCAwIHx8IGNiLT5jb3VudCA+IGNiLT5zaXplKSB7CisgICAgICAgIHJlYXNvbiA9ICJjb3VudCBpcyBpbmNvcnJlY3QiOworICAgIH0KKyAgICBpZiAoIXJlYXNvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgZnByaW50ZihzdGRlcnIsICJhc3NlcnQ6JXM6JWxkOiBhc3NlcnRpb24gZmFpbGVkOiAlcyAocG9zPSVkIGNvdW50PSVkIHNpemU9JWQpXG4iLAorICAgICAgICAgICAgZmlsZSwgbGluZW5vLCByZWFzb24sIGNiLT5ycG9zLCBjYi0+Y291bnQsIGNiLT5zaXplKTsKKyAgICBhc3NlcnQoMCk7Cit9CisjICBkZWZpbmUgIENCVUZGRVJfQVNTRVJUKGNiKSAgY2J1ZmZlcl9hc3NlcnQoY2IsX19GVU5DVElPTl9fLF9fTElORV9fKQorI2Vsc2UKKyMgIGRlZmluZSAgQ0JVRkZFUl9BU1NFUlQoY2IpICAoKHZvaWQpMCkKKyNlbmRpZgorCitpbnQKK2NidWZmZXJfd3JpdGVfcGVlayggQ0J1ZmZlciogIGNiLCB1aW50OF90KiAgKnBiYXNlICkKK3sKKyAgICBpbnQgIHdwb3MgID0gY2ItPnJwb3MgKyBjYi0+Y291bnQ7CisgICAgaW50ICBhdmFpbCA9IGNiLT5zaXplIC0gY2ItPmNvdW50OworCisgICAgQ0JVRkZFUl9BU1NFUlQoY2IpOworCisgICAgaWYgKHdwb3MgPj0gY2ItPnNpemUpCisgICAgICAgIHdwb3MgLT0gY2ItPnNpemU7CisKKyAgICBpZiAod3BvcyArIGF2YWlsID4gY2ItPnNpemUpCisgICAgICAgIGF2YWlsID0gY2ItPnNpemUgLSB3cG9zOworCisgICAgKnBiYXNlID0gY2ItPmJ1ZmYgKyB3cG9zOworICAgIHJldHVybiBhdmFpbDsKK30KKwordm9pZAorY2J1ZmZlcl93cml0ZV9zdGVwKCBDQnVmZmVyKiAgY2IsIGludCAgbGVuICkKK3sKKyAgICBDQlVGRkVSX0FTU0VSVChjYik7CisKKyAgICBjYi0+Y291bnQgKz0gbGVuOworICAgIGlmIChjYi0+Y291bnQgPiBjYi0+c2l6ZSkKKyAgICAgICAgY2ItPmNvdW50ID0gY2ItPnNpemU7Cit9CisKKworaW50CitjYnVmZmVyX3dyaXRlKCBDQnVmZmVyKiAgY2IsIGNvbnN0IHZvaWQqICBmcm9tLCBpbnQgIGxlbiApCit7CisgICAgaW50ICBsZW4yID0gbGVuOworCisgICAgQ0JVRkZFUl9BU1NFUlQoY2IpOworCisgICAgd2hpbGUgKGxlbjIgPiAwKSB7CisgICAgICAgIGludCAgYXZhaWwgPSBjYi0+c2l6ZSAtIGNiLT5jb3VudDsKKyAgICAgICAgaW50ICB3cG9zICA9IGNiLT5ycG9zICsgY2ItPmNvdW50OworCisgICAgICAgIEFTU0VSVChhdmFpbCA+PSAwLCAiYXZhaWwgaXMgbmVnYXRpdmU6ICVkIiwgYXZhaWwpOworCisgICAgICAgIGlmIChhdmFpbCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHdwb3MgPj0gY2ItPnNpemUpCisgICAgICAgICAgICB3cG9zIC09IGNiLT5zaXplOworCisgICAgICAgIEFTU0VSVCggd3BvcyA+PSAwICYmIHdwb3MgPCBjYi0+c2l6ZSwgIndwb3MgaXMgb3V0LW9mLWJvdW5kczogJWQgKHJwb3M9JWQpIiwgd3BvcywgY2ItPnJwb3MpOworCisgICAgICAgIGlmICh3cG9zICsgYXZhaWwgPiBjYi0+c2l6ZSkKKyAgICAgICAgICAgIGF2YWlsID0gY2ItPnNpemUgLSB3cG9zOworCisgICAgICAgIGlmIChhdmFpbCA+IGxlbjIpCisgICAgICAgICAgICBhdmFpbCA9IGxlbjI7CisKKyAgICAgICAgbWVtY3B5KCBjYi0+YnVmZiArIHdwb3MsIChjb25zdCBjaGFyKilmcm9tLCBhdmFpbCApOworCisgICAgICAgIGZyb20gID0gKGNoYXIqKWZyb20gKyBhdmFpbDsKKyAgICAgICAgbGVuMiAtPSBhdmFpbDsKKyAgICAgICAgY2ItPmNvdW50ICs9IGF2YWlsOworICAgIH0KKyAgICByZXR1cm4gbGVuIC0gbGVuMjsKK30KKworaW50CitjYnVmZmVyX3JlYWQoIENCdWZmZXIqICBjYiwgdm9pZCogIHRvLCBpbnQgIGxlbiApCit7CisgICAgaW50ICAgbGVuMiA9IGxlbjsKKworICAgIENCVUZGRVJfQVNTRVJUKGNiKTsKKworICAgIHdoaWxlIChsZW4yID4gMCkgeworICAgICAgICBpbnQgIGF2YWlsID0gY2ItPmNvdW50OworICAgICAgICBpbnQgIHJwb3MgPSBjYi0+cnBvczsKKworICAgICAgICBBU1NFUlQoYXZhaWwgPj0gMCwgImF2YWlsIGlzIG5lZ2F0aXZlOiAlZCIsIGF2YWlsKTsKKworICAgICAgICBpZiAoYXZhaWwgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEFTU0VSVCgocnBvcyA+PSAwICYmIHJwb3MgPCBjYi0+c2l6ZSksICJycG9zIGlzIG91dC1vZi1ib3VuZHM6ICVkIiwgcnBvcyk7CisKKyAgICAgICAgaWYgKHJwb3MrYXZhaWwgPiBjYi0+c2l6ZSkKKyAgICAgICAgICAgIGF2YWlsID0gY2ItPnNpemUgLSBycG9zOworCisgICAgICAgIGlmIChhdmFpbCA+IGxlbjIpCisgICAgICAgICAgICBhdmFpbCA9IGxlbjI7CisKKyAgICAgICAgbWVtY3B5KCAoY2hhciopdG8sIChjb25zdCBjaGFyKiljYi0+YnVmZiArIHJwb3MsIGF2YWlsICk7CisgICAgICAgIHRvICAgID0gKGNoYXIqKXRvICsgYXZhaWw7CisgICAgICAgIGxlbjIgLT0gYXZhaWw7CisgICAgICAgIGNiLT5jb3VudCAtPSBhdmFpbDsKKyAgICAgICAgY2ItPnJwb3MgICs9IGF2YWlsOworICAgICAgICBpZiAoY2ItPnJwb3MgPj0gY2ItPnNpemUpCisgICAgICAgICAgICBjYi0+cnBvcyAtPSBjYi0+c2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGxlbiAtIGxlbjI7Cit9CisKK2ludAorY2J1ZmZlcl9yZWFkX3BlZWsoIENCdWZmZXIqICBjYiwgdWludDhfdCogICpwYmFzZSApCit7CisgICAgaW50ICAgcnBvcyAgPSBjYi0+cnBvczsKKyAgICBpbnQgICBhdmFpbCA9IGNiLT5jb3VudDsKKworICAgIENCVUZGRVJfQVNTRVJUKGNiKTsKKworICAgIGlmIChycG9zICsgYXZhaWwgPiBjYi0+c2l6ZSkKKyAgICAgICAgYXZhaWwgPSBjYi0+c2l6ZSAtIHJwb3M7CisKKyAgICAqcGJhc2UgPSBjYi0+YnVmZiArIHJwb3M7CisgICAgcmV0dXJuIGF2YWlsOworfQorCisKK3ZvaWQKK2NidWZmZXJfcmVhZF9zdGVwKCBDQnVmZmVyKiAgY2IsIGludCAgbGVuICkKK3sKKyAgICBDQlVGRkVSX0FTU0VSVChjYik7CisKKyAgICBpZiAobGVuID4gY2ItPmNvdW50KQorICAgICAgICBsZW4gPSBjYi0+Y291bnQ7CisKKyAgICBjYi0+cnBvcyAgKz0gbGVuOworICAgIGlmIChjYi0+cnBvcyA+PSBjYi0+c2l6ZSkKKyAgICAgICAgY2ItPnJwb3MgLT0gY2ItPnNpemU7CisKKyAgICBjYi0+Y291bnQgLT0gbGVuOworfQorCitjb25zdCBjaGFyKgorY2J1ZmZlcl9xdW90ZSggQ0J1ZmZlciogIGNiICkKK3sKKyAgICBTVFJBTExPQ19ERUZJTkUocyk7CisgICAgY2hhciogcTsKKworICAgIHN0cmFsbG9jX2Zvcm1hdCggcywgImNidWZmZXIgJXAgKHBvcz0lZCBjb3VudD0lZCBzaXplPSVkKSIsCisgICAgICAgICAgICAgICAgICAgICBjYiwgY2ItPnJwb3MsIGNiLT5jb3VudCwgY2ItPnNpemUgKTsKKworICAgIHEgPSBzdHJhbGxvY190b190ZW1wc3RyKCBzICk7CisgICAgc3RyYWxsb2NfcmVzZXQocyk7CisKKyAgICByZXR1cm4gcTsKK30KKworY29uc3QgY2hhcioKK2NidWZmZXJfcXVvdGVfZGF0YSggQ0J1ZmZlciogIGNiICkKK3sKKyAgICBTVFJBTExPQ19ERUZJTkUocyk7CisgICAgaW50ICAgbGVuICA9IGNiLT5jb3VudDsKKyAgICBpbnQgICBycG9zID0gY2ItPnJwb3M7CisgICAgY2hhciogcmVzdWx0OworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50ICBhdmFpbCA9IGxlbjsKKworICAgICAgICBpZiAocnBvcyA+PSBjYi0+c2l6ZSkKKyAgICAgICAgICAgIHJwb3MgLT0gY2ItPnNpemU7CisKKyAgICAgICAgaWYgKHJwb3MgKyBhdmFpbCA+IGNiLT5zaXplKQorICAgICAgICAgICAgYXZhaWwgPSBjYi0+c2l6ZSAtIHJwb3M7CisKKyAgICAgICAgc3RyYWxsb2NfYWRkX3F1b3RlX2J5dGVzKCBzLCBjYi0+YnVmZiArIHJwb3MsIGF2YWlsICk7CisgICAgICAgIHJwb3MgKz0gYXZhaWw7CisgICAgICAgIGxlbiAgLT0gYXZhaWw7CisgICAgfQorCisgICAgcmVzdWx0ID0gc3RyYWxsb2NfdG9fdGVtcHN0cihzKTsKKyAgICBzdHJhbGxvY19yZXNldChzKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK2NidWZmZXJfcHJpbnQoIENCdWZmZXIqICBjYiApCit7CisgICAgLyogcHJpbnQgdGhlIGNvbnRlbnQgb2YgYSBjYnVmZmVyICovCisgICAgcHJpbnRmKCAiJXM6ICVzIiwgY2J1ZmZlcl9xdW90ZShjYiksIGNidWZmZXJfcXVvdGVfZGF0YShjYikgKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2NidWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9jYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkYTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9jYnVmZmVyLmgKQEAgLTAsMCArMSw1NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvKiBCYXNpYyBjaXJjdWxhciBidWZmZXIgdHlwZSBhbmQgbWV0aG9kcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCogIGJ1ZmY7CisgICAgaW50ICAgICAgIHNpemU7CisgICAgaW50ICAgICAgIHJwb3M7CisgICAgaW50ICAgICAgIGNvdW50OworfSBDQnVmZmVyOworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitjYnVmZmVyX3Jlc2V0KCBDQnVmZmVyKiAgY2IsIHZvaWQqICBidWZmLCBpbnQgIHNpemUgKQoreworICAgIGNiLT5idWZmICA9IGJ1ZmY7CisgICAgY2ItPnNpemUgID0gc2l6ZTsKKyAgICBjYi0+cnBvcyAgPSAwOworICAgIGNiLT5jb3VudCA9IDA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorY2J1ZmZlcl93cml0ZV9hdmFpbCggQ0J1ZmZlciogIGNiICkKK3sKKyAgICByZXR1cm4gY2ItPnNpemUgLSBjYi0+Y291bnQ7Cit9CisKK2V4dGVybiBpbnQgIGNidWZmZXJfd3JpdGUoIENCdWZmZXIqICBjYiwgY29uc3Qgdm9pZCogIGZyb20sIGludCAgbGVuICk7CitleHRlcm4gaW50ICBjYnVmZmVyX3dyaXRlX3BlZWsoIENCdWZmZXIqICBjYiwgdWludDhfdCogICpwYmFzZSApOworZXh0ZXJuIHZvaWQgY2J1ZmZlcl93cml0ZV9zdGVwKCBDQnVmZmVyKiAgY2IsIGludCAgbGVuICk7CisKK3N0YXRpYyBfX2lubGluZV9fIGludAorY2J1ZmZlcl9yZWFkX2F2YWlsKCBDQnVmZmVyKiAgY2IgKQoreworICAgIHJldHVybiBjYi0+Y291bnQ7Cit9CisKK2V4dGVybiBpbnQgIGNidWZmZXJfcmVhZCggQ0J1ZmZlciogIGNiLCB2b2lkKiAgdG8sIGludCAgbGVuICk7CitleHRlcm4gaW50ICBjYnVmZmVyX3JlYWRfcGVlayggQ0J1ZmZlciogIGNiLCB1aW50OF90KiAgKnBiYXNlICk7CitleHRlcm4gdm9pZCBjYnVmZmVyX3JlYWRfc3RlcCggQ0J1ZmZlciogIGNiLCBpbnQgIGxlbiApOworCitleHRlcm4gY29uc3QgY2hhciogIGNidWZmZXJfcXVvdGUoIENCdWZmZXIqICBjYiApOworZXh0ZXJuIGNvbnN0IGNoYXIqICBjYnVmZmVyX3F1b3RlX2RhdGEoIENCdWZmZXIqICBjYiApOworZXh0ZXJuIHZvaWQgICAgICAgICBjYnVmZmVyX3ByaW50KCBDQnVmZmVyKiAgY2IgKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9jb21waWxlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3MmZlZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9jb21waWxlci5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEFORFJPSURfQkVHSU5fSEVBREVSIGV4dGVybiAiQyIgeworI2RlZmluZSBBTkRST0lEX0VORF9IRUFERVIgICB9CisjZWxzZQorI2RlZmluZSBBTkRST0lEX0JFR0lOX0hFQURFUiAvKiBub3RoaW5nICovCisjZGVmaW5lIEFORFJPSURfRU5EX0hFQURFUiAgLyogbm90aGluZyAqLworI2VuZGlmCisKKy8vIEFORFJPSURfR0NDX1BSRVJFUSg8bWFqb3I+LDxtaW5vcj4pIHdpbGwgZXZhbHVhdGUgdG8gdHJ1ZQorLy8gaWZmIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgR0NDIGlzIDxtYWpvcj4uPG1pbm9yPiBvciBoaWdoZXIuCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykKKyMgZGVmaW5lIEFORFJPSURfR0NDX1BSRVJFUShtYWosIG1pbikgXAorICAgICAgICAgKChfX0dOVUNfXyA8PCAxNikgKyBfX0dOVUNfTUlOT1JfXyA+PSAoKG1haikgPDwgMTYpICsgKG1pbikpCisjZWxzZQorIyBkZWZpbmUgQU5EUk9JRF9HQ0NfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kZWJ1Zy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkYjFhMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VpbnQ2NF90IGFuZHJvaWRfdmVyYm9zZSA9IDA7CisKK3ZvaWQKK2RwcmludCggY29uc3QgY2hhciogIGZvcm1hdCwgIC4uLiApCit7CisgICAgdmFfbGlzdCAgYXJnczsKKyAgICB2YV9zdGFydCggYXJncywgZm9ybWF0ICk7CisgICAgZnByaW50Ziggc3Rkb3V0LCAiZW11bGF0b3I6ICIpOworICAgIHZmcHJpbnRmKCBzdGRvdXQsIGZvcm1hdCwgYXJncyApOworICAgIGZwcmludGYoIHN0ZG91dCwgIlxuIiApOworICAgIHZhX2VuZCggYXJncyApOworfQorCisKK3ZvaWQKK2RwcmludG4oIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCAgYXJnczsKKyAgICB2YV9zdGFydCggYXJncywgZm9ybWF0ICk7CisgICAgdmZwcmludGYoIHN0ZG91dCwgZm9ybWF0LCBhcmdzICk7CisgICAgdmFfZW5kKCBhcmdzICk7Cit9CisKK3ZvaWQKK2RwcmludG52KCBjb25zdCBjaGFyKiAgZm9ybWF0LCB2YV9saXN0IGFyZ3MgKQoreworICAgIHZmcHJpbnRmKCBzdGRvdXQsIGZvcm1hdCwgYXJncyApOworfQorCisKK3ZvaWQKK2R3YXJuaW5nKCBjb25zdCBjaGFyKiAgZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgIGRwcmludG4oICJlbXVsYXRvcjogV0FSTklORzogIiApOworICAgIGRwcmludG52KCBmb3JtYXQsIGFyZ3MgKTsKKyAgICBkcHJpbnRuKCAiXG4iICk7CisgICAgdmFfZW5kKCBhcmdzICk7Cit9CisKKwordm9pZAorZGVycm9yKCBjb25zdCBjaGFyKiAgZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgIGRwcmludG4oICJlbXVsYXRvcjogRVJST1I6ICIgKTsKKyAgICBkcHJpbnRudiggZm9ybWF0LCBhcmdzICk7CisgICAgZHByaW50biggIlxuIiApOworICAgIHZhX2VuZCggYXJncyApOworfQorCit2b2lkCithbmRyb2lkX3RpZF9mdW5jdGlvbl9wcmludCgKKyAgICAgICAgYm9vbCB1c2VfZW11bGF0b3JfcHJlZml4LAorICAgICAgICBjb25zdCBjaGFyKiBmdW5jdGlvbiwKKyAgICAgICAgY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKQoreworICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgdGlkID0gYW5kcm9pZF9nZXRfdGhyZWFkX2lkKCk7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgY29uc3QgY2hhciogcHJlZml4ID0gdXNlX2VtdWxhdG9yX3ByZWZpeCA/ICJlbXVsYXRvcjogIiA6ICIiOworICAgIGlmIChmdW5jdGlvbikgeworICAgICAgICBwcmludGYoIiVzdGlkPTB4JSIgQU5EUk9JRF9USFJFQURJRF9GTVQgIjogJXM6ICIsIHByZWZpeCwgdGlkLAorICAgICAgICAgICAgICAgZnVuY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJXN0aWQ9MHglIiBBTkRST0lEX1RIUkVBRElEX0ZNVCAiOiAiLCBwcmVmaXgsIHRpZCk7CisgICAgfQorCisgICAgdnByaW50Zihmb3JtYXQsIGFyZ3MpOworICAgIHByaW50ZigiXG4iKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKy8qKiBTVERPVVQvU1RERVJSIFJFRElSRUNUSU9OCisgKioKKyAqKiBhbGxvd3MgeW91IHRvIHNodXQgdGVtcG9yYXJpbHkgc2h1dGRvd24gc3Rkb3V0L3N0ZGVycgorICoqIHRoaXMgaXMgdXNlZnVsIHRvIGdldCByaWQgb2YgZGVidWcgbWVzc2FnZXMgZnJvbSBBTFNBIGFuZCBlc2QKKyAqKiBvbiBMaW51eC4KKyAqKi8KK3N0YXRpYyBpbnQgICAgc3RkaW9fZGlzYWJsZV9jb3VudDsKK3N0YXRpYyBpbnQgICAgc3RkaW9fc2F2ZV9vdXRfZmQ7CitzdGF0aWMgaW50ICAgIHN0ZGlvX3NhdmVfZXJyX2ZkOworCisjaWZkZWYgX1dJTjMyCitleHRlcm4gdm9pZAorc3RkaW9fZGlzYWJsZSggdm9pZCApCit7CisgICAgaWYgKCsrc3RkaW9fZGlzYWJsZV9jb3VudCA9PSAxKSB7CisgICAgICAgIGludCAgbnVsbF9mZCwgb3V0X2ZkLCBlcnJfZmQ7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBvdXRfZmQgPSBfZmlsZW5vKHN0ZG91dCk7CisgICAgICAgIGVycl9mZCA9IF9maWxlbm8oc3RkZXJyKTsKKyAgICAgICAgc3RkaW9fc2F2ZV9vdXRfZmQgPSBfZHVwKG91dF9mZCk7CisgICAgICAgIHN0ZGlvX3NhdmVfZXJyX2ZkID0gX2R1cChlcnJfZmQpOworICAgICAgICBudWxsX2ZkID0gX29wZW4oICJOVUwiLCBfT19XUk9OTFkgKTsKKyAgICAgICAgX2R1cDIobnVsbF9mZCwgb3V0X2ZkKTsKKyAgICAgICAgX2R1cDIobnVsbF9mZCwgZXJyX2ZkKTsKKyAgICAgICAgY2xvc2UobnVsbF9mZCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZAorc3RkaW9fZW5hYmxlKCB2b2lkICkKK3sKKyAgICBpZiAoLS1zdGRpb19kaXNhYmxlX2NvdW50ID09IDApIHsKKyAgICAgICAgaW50ICBvdXRfZmQsIGVycl9mZDsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIG91dF9mZCA9IF9maWxlbm8oc3Rkb3V0KTsKKyAgICAgICAgZXJyX2ZkID0gX2ZpbGVubyhzdGRlcnIpOworICAgICAgICBfZHVwMihzdGRpb19zYXZlX291dF9mZCwgb3V0X2ZkKTsKKyAgICAgICAgX2R1cDIoc3RkaW9fc2F2ZV9lcnJfZmQsIGVycl9mZCk7CisgICAgICAgIF9jbG9zZShzdGRpb19zYXZlX291dF9mZCk7CisgICAgICAgIF9jbG9zZShzdGRpb19zYXZlX2Vycl9mZCk7CisgICAgfQorfQorI2Vsc2UKK2V4dGVybiB2b2lkCitzdGRpb19kaXNhYmxlKCB2b2lkICkKK3sKKyAgICBpZiAoKytzdGRpb19kaXNhYmxlX2NvdW50ID09IDEpIHsKKyAgICAgICAgaW50ICBudWxsX2ZkLCBvdXRfZmQsIGVycl9mZDsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIG91dF9mZCA9IGZpbGVubyhzdGRvdXQpOworICAgICAgICBlcnJfZmQgPSBmaWxlbm8oc3RkZXJyKTsKKyAgICAgICAgc3RkaW9fc2F2ZV9vdXRfZmQgPSBkdXAob3V0X2ZkKTsKKyAgICAgICAgc3RkaW9fc2F2ZV9lcnJfZmQgPSBkdXAoZXJyX2ZkKTsKKyAgICAgICAgbnVsbF9mZCA9IG9wZW4oICIvZGV2L251bGwiLCBPX1dST05MWSApOworICAgICAgICBkdXAyKG51bGxfZmQsIG91dF9mZCk7CisgICAgICAgIGR1cDIobnVsbF9mZCwgZXJyX2ZkKTsKKyAgICAgICAgY2xvc2UobnVsbF9mZCk7CisgICAgfQorfQorCitleHRlcm4gdm9pZAorc3RkaW9fZW5hYmxlKCB2b2lkICkKK3sKKyAgICBpZiAoLS1zdGRpb19kaXNhYmxlX2NvdW50ID09IDApIHsKKyAgICAgICAgaW50ICBvdXRfZmQsIGVycl9mZDsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIG91dF9mZCA9IGZpbGVubyhzdGRvdXQpOworICAgICAgICBlcnJfZmQgPSBmaWxlbm8oc3RkZXJyKTsKKyAgICAgICAgZHVwMihzdGRpb19zYXZlX291dF9mZCwgb3V0X2ZkKTsKKyAgICAgICAgZHVwMihzdGRpb19zYXZlX2Vycl9mZCwgZXJyX2ZkKTsKKyAgICAgICAgY2xvc2Uoc3RkaW9fc2F2ZV9vdXRfZmQpOworICAgICAgICBjbG9zZShzdGRpb19zYXZlX2Vycl9mZCk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGVidWcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNTNmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGVidWcuaApAQCAtMCwwICsxLDE2NyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworI2RlZmluZSAgVkVSQk9TRV9UQUdfTElTVCAgICBcCisgICAgX1ZFUkJPU0VfVEFHKGluaXQsICAgICAgICAgImVtdWxhdG9yIGluaXRpYWxpemF0aW9uIikgIFwKKyAgICBfVkVSQk9TRV9UQUcoY29uc29sZSwgICAgICAiY29udHJvbCBjb25zb2xlIikgIFwKKyAgICBfVkVSQk9TRV9UQUcobW9kZW0sICAgICAgICAiZW11bGF0ZWQgR1NNIG1vZGVtIikgIFwKKyAgICBfVkVSQk9TRV9UQUcocmFkaW8sICAgICAgICAiZW11bGF0ZWQgR1NNIEFUIENvbW1hbmQgY2hhbm5lbCIpIFwKKyAgICBfVkVSQk9TRV9UQUcoa2V5cywgICAgICAgICAia2V5IGJpbmRpbmdzICYgcHJlc3NlcyIpIFwKKyAgICBfVkVSQk9TRV9UQUcoc2xpcnAsICAgICAgICAiaW50ZXJuYWwgcm91dGVyL2ZpcmV3YWxsIikgXAorICAgIF9WRVJCT1NFX1RBRyh0aW1lem9uZSwgICAgICJob3N0IHRpbWV6b25lIGRldGVjdGlvbiIgKSBcCisgICAgX1ZFUkJPU0VfVEFHKHNvY2tldCwgICAgICAgIm5ldHdvcmsgc29ja2V0cyIpIFwKKyAgICBfVkVSQk9TRV9UQUcocHJveHksICAgICAgICAibmV0d29yayBwcm94eSBzdXBwb3J0IikgXAorICAgIF9WRVJCT1NFX1RBRyhhdWRpbywgICAgICAgICJhdWRpbyBzdWItc3lzdGVtIikgXAorICAgIF9WRVJCT1NFX1RBRyhhdWRpb2luLCAgICAgICJhdWRpbyBpbnB1dCBiYWNrZW5kIikgXAorICAgIF9WRVJCT1NFX1RBRyhhdWRpb291dCwgICAgICJhdWRpbyBvdXRwdXQgYmFja2VuZCIpIFwKKyAgICBfVkVSQk9TRV9UQUcoc3VyZmFjZSwgICAgICAidmlkZW8gc3VyZmFjZSBzdXBwb3J0IikgXAorICAgIF9WRVJCT1NFX1RBRyhxZW11ZCwgICAgICAgICJxZW11ZCBtdWx0aXBsZXhlciBkYWVtb24iKSBcCisgICAgX1ZFUkJPU0VfVEFHKGdwcywgICAgICAgICAgImVtdWxhdGVkIEdQUyIpIFwKKyAgICBfVkVSQk9TRV9UQUcobmFuZF9saW1pdHMsICAibmFuZC9mbGFzaCByZWFkL3dyaXRlIHRocmVzaG9sZGluZyIpIFwKKyAgICBfVkVSQk9TRV9UQUcoaHdfY29udHJvbCwgICAiZW11bGF0ZWQgcG93ZXIvZmxhc2hsaWdodC9sZWQvdmlicmF0b3IiKSBcCisgICAgX1ZFUkJPU0VfVEFHKGF2ZF9jb25maWcsICAgImFuZHJvaWQgdmlydHVhbCBkZXZpY2UgY29uZmlndXJhdGlvbiIpIFwKKyAgICBfVkVSQk9TRV9UQUcoc2Vuc29ycywgICAgICAiZW11bGF0ZWQgc2Vuc29ycyIpIFwKKyAgICBfVkVSQk9TRV9UQUcobWVtY2hlY2ssICAgICAibWVtb3J5IGNoZWNrZXIiKSBcCisgICAgX1ZFUkJPU0VfVEFHKGNhbWVyYSwgICAgICAgImNhbWVyYSIpIFwKKyAgICBfVkVSQk9TRV9UQUcoYWRldmljZSwgICAgICAiYW5kcm9pZCBkZXZpY2UgY29ubmVjdGVkIHZpYSBwb3J0IGZvcndhcmRpbmciKSBcCisgICAgX1ZFUkJPU0VfVEFHKHNlbnNvcnNfcG9ydCwgInNlbnNvcnMgZW11bGF0b3IgY29ubmVjdGVkIHRvIGFuZHJvaWQgZGV2aWNlIikgXAorICAgIF9WRVJCT1NFX1RBRyhtdHBvcnQsICAgICAgICJtdWx0aS10b3VjaCBlbXVsYXRvciBjb25uZWN0ZWQgdG8gYW5kcm9pZCBkZXZpY2UiKSBcCisgICAgX1ZFUkJPU0VfVEFHKG10c2NyZWVuLCAgICAgIm11bHRpLXRvdWNoIHNjcmVlbiBlbXVsYXRpb24iKSBcCisgICAgX1ZFUkJPU0VfVEFHKGdsZXMsICAgICAgICAgImhhcmR3YXJlIE9wZW5HTEVTIGVtdWxhdGlvbiIpIFwKKyAgICBfVkVSQk9TRV9UQUcoZ2xlczFlbXUsICAgICAiZW11bGF0ZWQgR0xFU3YxIHJlbmRlcmVyIikgXAorICAgIF9WRVJCT1NFX1RBRyhhZGJzZXJ2ZXIsICAgICJBREIgc2VydmVyIikgXAorICAgIF9WRVJCT1NFX1RBRyhhZGJjbGllbnQsICAgICJBREIgUUVNVSBjbGllbnQiKSBcCisgICAgX1ZFUkJPU0VfVEFHKGFkYiwgICAgICAgICAgIkFEQiBkZWJ1Z2dlciIpIFwKKyAgICBfVkVSQk9TRV9UQUcoYXNjb25uZWN0b3IsICAiQXN5bmNocm9ub3VzIHNvY2tldCBjb25uZWN0b3IiKSBcCisgICAgX1ZFUkJPU0VfVEFHKGFzeW5jc29ja2V0LCAgIkFzeW5jaHJvbm91cyBzb2NrZXQiKSBcCisgICAgX1ZFUkJPU0VfVEFHKHNka2N0bHNvY2tldCwgIlNvY2tldCB0ZXRoZXJpbmcgdG8gU2RrQ29udHJvbCBzZXJ2ZXIiKSBcCisgICAgX1ZFUkJPU0VfVEFHKHVwZGF0ZXIsICAgICAgIlVwZGF0ZSBjaGVja2VyIikgIFwKKyAgICBfVkVSQk9TRV9UQUcobWV0cmljcywgICAgICAiTWV0cmljcyByZXBvcnRpbmciKSBcCisgICAgX1ZFUkJPU0VfVEFHKHJvdGF0aW9uLCAgICAgIkRldmljZSByb3RhdGlvbiBkZWJ1Z2dpbmciKSBcCisgICAgX1ZFUkJPU0VfVEFHKGdvbGRmaXNoc3luYywgIkdvbGRmaXNoIFN5bmMgRGV2aWNlIikgXAorICAgIF9WRVJCT1NFX1RBRyhzeW5jdGhyZWFkcywgICJIb3N0R1BVIFN5bmMgVGhyZWFkcyIpIFwKKworI2RlZmluZSAgX1ZFUkJPU0VfVEFHKHgseSkgIFZFUkJPU0VfIyN4LAordHlwZWRlZiBlbnVtIHsKKyAgICBWRVJCT1NFX1RBR19MSVNUCisgICAgVkVSQk9TRV9NQVggIC8qIGRvIG5vdCByZW1vdmUgKi8KK30gVmVyYm9zZVRhZzsKKyN1bmRlZiAgX1ZFUkJPU0VfVEFHCisKK2V4dGVybiB1aW50NjRfdCBhbmRyb2lkX3ZlcmJvc2U7CisKKy8vIEVuYWJsZS9kaXNhYmxlIHZlcmJvc2UgbG9ncyBmcm9tIHRoZSBiYXNlLyogZmFtaWx5LgorZXh0ZXJuIHZvaWQgYmFzZV9lbmFibGVfdmVyYm9zZV9sb2dzKCk7CitleHRlcm4gdm9pZCBiYXNlX2Rpc2FibGVfdmVyYm9zZV9sb2dzKCk7CisKKyNkZWZpbmUgIFZFUkJPU0VfRU5BQkxFKHRhZykgICAgXAorICAgIGFuZHJvaWRfdmVyYm9zZSB8PSAoMVVMTCA8PCBWRVJCT1NFXyMjdGFnKQorCisjZGVmaW5lICBWRVJCT1NFX0RJU0FCTEUodGFnKSAgIFwKKyAgICBhbmRyb2lkX3ZlcmJvc2UgJj0gKDFVTEwgPDwgVkVSQk9TRV8jI3RhZykKKworI2RlZmluZSAgVkVSQk9TRV9DSEVDSyh0YWcpICAgIFwKKyAgICAoKGFuZHJvaWRfdmVyYm9zZSAmICgxVUxMIDw8IFZFUkJPU0VfIyN0YWcpKSAhPSAwKQorCisjZGVmaW5lICBWRVJCT1NFX0NIRUNLX0FOWSgpICAgIFwKKyAgICAoYW5kcm9pZF92ZXJib3NlICE9IDApCisKKyNkZWZpbmUgIFZFUkJPU0VfUFJJTlQodGFnLC4uLikgIFwKKyAgICBkbyB7IGlmIChWRVJCT1NFX0NIRUNLKHRhZykpIGRwcmludChfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisKKy8vIFRoaXMgb21pdHMgdGhlICJlbXVsYXRvcjogIiBwcmVmaXguCisjZGVmaW5lICBWRVJCT1NFX0RQUklOVCh0YWcsZm9ybWF0LC4uLikgIFwKKyAgICBkbyB7IGlmIChWRVJCT1NFX0NIRUNLKHRhZykpIHsgXAorICAgICAgICAgZHByaW50bihmb3JtYXQgIlxuIiwgXAorICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKTsgfSB9IHdoaWxlKDApCisKKyNkZWZpbmUgIFZFUkJPU0VfRlVOQ1RJT05fUFJJTlQodGFnLGZvcm1hdCwuLi4pICBcCisgICAgZG8geyBpZiAoVkVSQk9TRV9DSEVDSyh0YWcpKSBcCisgICAgICAgICBkcHJpbnRuKCJlbXVsYXRvcjogJXM6ICIgZm9ybWF0ICJcbiIsIFwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sICMjX19WQV9BUkdTX18pOyB9IHdoaWxlKDApCisKKy8vIFRoaXMgb21pdHMgdGhlICJlbXVsYXRvcjogIiBwcmVmaXguCisjZGVmaW5lICBWRVJCT1NFX0ZVTkNUSU9OX0RQUklOVCh0YWcsZm9ybWF0LC4uLikgIFwKKyAgICBkbyB7IGlmIChWRVJCT1NFX0NIRUNLKHRhZykpIFwKKyAgICAgICAgIGRwcmludG4oIiVzOiAiIGZvcm1hdCAiXG4iLCBcCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lICBWRVJCT1NFX1RJRF9QUklOVCh0YWcsLi4uKSAgXAorICAgIGRvIHsgaWYgKFZFUkJPU0VfQ0hFQ0sodGFnKSkgXAorICAgICAgICAgYW5kcm9pZF90aWRfZnVuY3Rpb25fcHJpbnQodHJ1ZSwgTlVMTCwgX19WQV9BUkdTX18pOyBcCisgICAgfSB3aGlsZSAoMCkKKworLy8gVGhpcyBvbWl0cyB0aGUgImVtdWxhdG9yOiAiIHByZWZpeC4KKyNkZWZpbmUgIFZFUkJPU0VfVElEX0RQUklOVCh0YWcsLi4uKSAgXAorICAgIGRvIHsgaWYgKFZFUkJPU0VfQ0hFQ0sodGFnKSkgXAorICAgICAgICAgYW5kcm9pZF90aWRfZnVuY3Rpb25fcHJpbnQoZmFsc2UsIE5VTEwsIF9fVkFfQVJHU19fKTsgfSBcCisgICAgd2hpbGUgKDApCisKKyNkZWZpbmUgIFZFUkJPU0VfVElEX0ZVTkNUSU9OX1BSSU5UKHRhZywuLi4pIFwKKyAgICBkbyB7IGlmIChWRVJCT1NFX0NIRUNLKHRhZykpIFwKKyAgICAgICAgIGFuZHJvaWRfdGlkX2Z1bmN0aW9uX3ByaW50KHRydWUsIF9fZnVuY19fLCBfX1ZBX0FSR1NfXyk7IH0gXAorICAgIHdoaWxlICgwKQorCisvLyBUaGlzIG9taXRzIHRoZSAiZW11bGF0b3I6ICIgcHJlZml4LgorI2RlZmluZSAgVkVSQk9TRV9USURfRlVOQ1RJT05fRFBSSU5UKHRhZywuLi4pIFwKKyAgICBkbyB7IGlmIChWRVJCT1NFX0NIRUNLKHRhZykpIFwKKyAgICAgICAgIGFuZHJvaWRfdGlkX2Z1bmN0aW9uX3ByaW50KGZhbHNlLCBfX2Z1bmNfXywgX19WQV9BUkdTX18pOyB9IFwKKyAgICB3aGlsZSAoMCkKKworLyoqIERFQlVHIFRSQUNFIFNVUFBPUlQKKyAqKgorICoqIERlYnVnIG1lc3NhZ2VzIGNhbiBiZSBzZW50IGJ5IGNhbGxpbmcgdGhlc2UgZnVuY3Rpb25zOgorICoqCisgKiogJ2RwcmludCcgcHJpbnRzICJlbXVsYXRvcjogIiwgdGhlIG1lc3NhZ2UsIHRoZW4gYXBwZW5kcyBhICdcbicKKyAqKiAnZHByaW50bicgcHJpbnRzIHRoZSBtZXNzYWdlIGFzIGlzCisgKiogJ2RwcmludG52JyBpcyAnZHByaW50bicgYnV0IGFsbG93cyB5b3UgdG8gdXNlIGEgdmFfbGlzdCBhcmd1bWVudAorICoqICdkd2FybmluZycgcHJpbnRzICJlbXVsYXRvcjogV0FSTklORzogIiwgdGhlbiBhcHBlbmRzIGEgJ1xuJworICoqICdkZXJyb3InIHByaW50cyAiZW11bGF0b3I6IEVSUk9SOiAiLCB0aGVuIGFwcGVuZHMgYSAnXG4nCisgKi8KKworZXh0ZXJuIHZvaWQgICBkcHJpbnQoIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApOworZXh0ZXJuIHZvaWQgICBkcHJpbnRuKCBjb25zdCBjaGFyKiAgZm9ybWF0LCAuLi4gKTsKK2V4dGVybiB2b2lkICAgZHByaW50bnYoIGNvbnN0IGNoYXIqICBmb3JtYXQsIHZhX2xpc3QgIGFyZ3MgKTsKK2V4dGVybiB2b2lkICAgZHdhcm5pbmcoIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApOworZXh0ZXJuIHZvaWQgICBkZXJyb3IoIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApOworCisvKiogTVVMVElUSFJFQURFRCBERUJVRyBUUkFDSU5HCisgKioKKyAqKiAnYW5kcm9pZF90aWRfZnVuY3Rpb25fcHJpbnQnIGlzIGZvciB0cmFjaW5nIGluIG11bHRpLXRocmVhZGVkIHNpdHVhdGlvbnMuCisgKiogSXQgcHJpbnRzICJlbXVsYXRvcjogIiBvciBub3QgKGRlcGVuZGluZyBvbiB8dXNlX2VtdWxhdG9yX3ByZWZpeHwpLAorICoqIHRoZSB0aHJlYWQgaWQsIGEgZnVuY3Rpb24gbmFtZSAofGZ1bmN0aW9ufCksIHRoZSBtZXNzYWdlLCBhbmQgZmluYWxseSAnXG4nLgorICovCitleHRlcm4gdm9pZCAgIGFuZHJvaWRfdGlkX2Z1bmN0aW9uX3ByaW50KGJvb2wgdXNlX2VtdWxhdG9yX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmb3JtYXQsIC4uLiApOworCisvKiogU1RET1VUL1NUREVSUiBSRURJUkVDVElPTgorICoqCisgKiogYWxsb3dzIHlvdSB0byBzaHV0IHRlbXBvcmFyaWx5IHNodXRkb3duIHN0ZG91dC9zdGRlcnIKKyAqKiB0aGlzIGlzIHVzZWZ1bCB0byBnZXQgcmlkIG9mIGRlYnVnIG1lc3NhZ2VzIGZyb20gQUxTQSBhbmQgZXNkCisgKiogb24gTGludXguCisgKiovCisKK2V4dGVybiB2b2lkICBzdGRpb19kaXNhYmxlKCB2b2lkICk7CitleHRlcm4gdm9pZCAgc3RkaW9fZW5hYmxlKCB2b2lkICk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RlYnVnX3dyYXBwZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RlYnVnX3dyYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZGIxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGVidWdfd3JhcHBlci5jcHAKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisKK3ZvaWQgYmFzZV9lbmFibGVfdmVyYm9zZV9sb2dzKCkgeworICAgIGFuZHJvaWRfdmVyYm9zZSA9IH4wOworICAgIGFuZHJvaWQ6OmJhc2U6OnNldE1pbkxvZ0xldmVsKGFuZHJvaWQ6OmJhc2U6OkxPR19WRVJCT1NFKTsKK30KKwordm9pZCBiYXNlX2Rpc2FibGVfdmVyYm9zZV9sb2dzKCkgeworICAgIGFuZHJvaWRfdmVyYm9zZSA9IDA7CisgICAgYW5kcm9pZDo6YmFzZTo6c2V0TWluTG9nTGV2ZWwoYW5kcm9pZDo6YmFzZTo6TE9HX0lORk8pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNzg5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvUGF0aFV0aWxzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7CisKK3N0cnVjdCBEaXJTY2FubmVyIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW50cmllczsKKyAgICBzdGQ6OnN0cmluZyBwcmVmaXg7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHNpemVfdCBwb3M7CisKKyAgICBleHBsaWNpdCBEaXJTY2FubmVyKGNvbnN0IGNoYXIqIGRpcikgOgorICAgICAgICAgICAgZW50cmllcygpLAorICAgICAgICAgICAgcHJlZml4KGRpciksCisgICAgICAgICAgICByZXN1bHQoKSwKKyAgICAgICAgICAgIHBvcygwdSkgeworICAgICAgICBlbnRyaWVzID0gYW5kcm9pZDo6YmFzZTo6U3lzdGVtOjpnZXQoKS0+c2NhbkRpckVudHJpZXMoZGlyKTsKKyAgICAgICAgLy8gQXBwZW5kIGRpcmVjdG9yeSBzZXBhcmF0b3IgaWYgbmVlZGVkLgorICAgICAgICBwcmVmaXggPSBQYXRoVXRpbHM6OmFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKHByZWZpeCk7CisgICAgfQorfTsKKworY29uc3QgY2hhciogZGlyU2Nhbm5lcl9uZXh0KERpclNjYW5uZXIqIHMpIHsKKyAgICBpZiAocy0+cG9zIDwgcy0+ZW50cmllcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIHMtPmVudHJpZXNbcy0+cG9zKytdLmNfc3RyKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyKiBkaXJTY2FubmVyX25leHRGdWxsKERpclNjYW5uZXIqIHMpIHsKKyAgICBpZiAocy0+cG9zIDwgcy0+ZW50cmllcy5zaXplKCkpIHsKKyAgICAgICAgcy0+cmVzdWx0ID0gcy0+cHJlZml4OworICAgICAgICBzLT5yZXN1bHQgKz0gcy0+ZW50cmllc1tzLT5wb3MrK107CisgICAgICAgIHJldHVybiBzLT5yZXN1bHQuY19zdHIoKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3NpemVfdCBkaXJTY2FubmVyX251bUVudHJpZXMoRGlyU2Nhbm5lciogcykgeworICAgIHJldHVybiBzLT5lbnRyaWVzLnNpemUoKTsKK30KKworRGlyU2Nhbm5lciogZGlyU2Nhbm5lcl9uZXcoY29uc3QgY2hhciogcm9vdFBhdGgpIHsKKyAgICBEaXJTY2FubmVyKiBzID0gbmV3IERpclNjYW5uZXIocm9vdFBhdGgpOworICAgIHJldHVybiBzOworfQorCit2b2lkIGRpclNjYW5uZXJfZnJlZShEaXJTY2FubmVyKiBzKSB7CisgICAgZGVsZXRlIHM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkwMjNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXIuaApAQCAtMCwwICsxLDU4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIHNpbXBsZSB1dGlsaXR5IHRvIHBhcnNlIGRpcmVjdG9yaWVzIGZvciBmaWxlcyAgICAgICAgICAgICovCisvKiBuZWVkZWQgYmVjYXVzZSBVbml4IGFuZCBXaW5kb3dzIGRvbid0IHVzZSB0aGUgc2FtZSBzdHVmZiAqLworCit0eXBlZGVmIHN0cnVjdCBEaXJTY2FubmVyICBEaXJTY2FubmVyOworCisvKiBDcmVhdGUgYSBuZXcgZGlyZWN0b3J5IHNjYW5uZXIgb2JqZWN0IGZyb20gYSBnaXZlbiByb290UGF0aC4KKyAqIHJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUgKGVycm9yIGNvZGUgaW4gZXJybm8pCisgKi8KK0RpclNjYW5uZXIqICAgIGRpclNjYW5uZXJfbmV3ICggY29uc3QgY2hhciogIHJvb3RQYXRoICk7CisKKy8qIERlc3Ryb3kgYSBnaXZlbiBkaXJlY3Rvcnkgc2Nhbm5lci4gWW91IG11c3QgYWx3YXlzIGNhbGwKKyAqIHRoaXMgZnVuY3Rpb24gdG8gcmVsZWFzZSBwcm9wZXIgc3lzdGVtIHJlc291cmNlcy4KKyAqLwordm9pZCAgICAgICAgICAgZGlyU2Nhbm5lcl9mcmVlKCBEaXJTY2FubmVyKiAgcyApOworCisvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG5leHQgZmlsZSBmcm9tIGEgZGlyZWN0b3J5IHNjYW5uZXIuCisgKiBSZXR1cm5zIE5VTEwgd2hlbiB0aGVyZSBpcyBubyBtb3JlIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICoKKyAqIFRoaXMgaXMgb25seSB0aGUgZmlsZSBuYW1lLCB1c2UgZGlyU2Nhbm5lcl9uZXh0RnVsbCB0bworICogZ2V0IGl0cyBmdWxsIHBhdGguCisgKgorICogVGhpcyB3aWxsIG5ldmVyIHJldHVybiAnLicgYW5kICcuLicuCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSB0aGUgc2Nhbm5lciwgYW5kIHdpbGwKKyAqIGNoYW5nZSBvbiB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gb3Igd2hlbiB0aGUKKyAqIHNjYW5uZXIgaXMgZGVzdHJveWVkLgorICovCitjb25zdCBjaGFyKiAgICBkaXJTY2FubmVyX25leHQoIERpclNjYW5uZXIqICBzICk7CisKKy8qIEEgdmFyaWFudCBvZiBkaXJTY2FubmVyX25leHQoKSB3aGljaCByZXR1cm5zIHRoZSBmdWxsIHBhdGgKKyAqIHRvIHRoZSBuZXh0IGRpcmVjdG9yeSBlbGVtZW50LgorICovCitjb25zdCBjaGFyKiAgICBkaXJTY2FubmVyX25leHRGdWxsKCBEaXJTY2FubmVyKiAgcyApOworCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBnaXZlbiBpbml0aWFsaXplZCBEaXJTY2FubmVyLiAqLworc2l6ZV90ICAgICAgICAgZGlyU2Nhbm5lcl9udW1FbnRyaWVzKCBEaXJTY2FubmVyKiAgcyApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kaXJzY2FubmVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kaXJzY2FubmVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGNjMWFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RpcnNjYW5uZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIEFSUkFZTEVOKHgpICAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6VGVzdFRlbXBEaXI7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7CisKK3N0YXRpYyB2b2lkIG1ha2Vfc3ViZmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZGlyLCBjb25zdCBjaGFyKiBmaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGRpcjsKKyAgICBwYXRoLmFwcGVuZCgiLyIpOworICAgIHBhdGguYXBwZW5kKGZpbGUpOworICAgIGludCBmZCA9IDo6b3BlbihwYXRoLmNfc3RyKCksIE9fV1JPTkxZfE9fQ1JFQVQsIDA3NTUpOworICAgIEVYUEVDVF9HRShmZCwgMCk7CisgICAgOjpjbG9zZShmZCk7Cit9CisKK1RFU1QoRGlyU2Nhbm5lciwgc2NhbkVtcHR5RGlyKSB7CisgICAgVGVzdFRlbXBEaXIgbXlEaXIoIkRpclNjYW5uZXJUZXN0Iik7CisgICAgRGlyU2Nhbm5lciogc2Nhbm5lciA9IGRpclNjYW5uZXJfbmV3KG15RGlyLnBhdGgoKSk7CisgICAgRVhQRUNUX1RSVUUoc2Nhbm5lcik7CisgICAgRVhQRUNUX0VRKDAsIGRpclNjYW5uZXJfbnVtRW50cmllcyhzY2FubmVyKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRpclNjYW5uZXJfbmV4dChzY2FubmVyKSk7CisgICAgZGlyU2Nhbm5lcl9mcmVlKHNjYW5uZXIpOworfQorCitURVNUKERpclNjYW5uZXIsIHNjYW5Ob3JtYWwpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0V4cGVjdGVkW10gPSB7CisgICAgICAgICJmaWZ0aCIsICJmaXJzdCIsICJmb3VydGgiLCAic2Vjb25kIiwgInNpeHRoIiwgInRoaXJkIgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtJbnB1dFtdID0geworICAgICAgICAiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCIsICJzaXh0aCIKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSBBUlJBWUxFTihrSW5wdXQpOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoIkRpclNjYW5uZXJUZXN0Iik7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBtYWtlX3N1YmZpbGUobXlEaXIucGF0aCgpLCBrSW5wdXRbbl0pOworICAgIH0KKworICAgIERpclNjYW5uZXIqIHNjYW5uZXIgPSBkaXJTY2FubmVyX25ldyhteURpci5wYXRoKCkpOworICAgIEVYUEVDVF9UUlVFKHNjYW5uZXIpOworICAgIEVYUEVDVF9FUShrQ291bnQsIGRpclNjYW5uZXJfbnVtRW50cmllcyhzY2FubmVyKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW50cmllczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5ID0gZGlyU2Nhbm5lcl9uZXh0KHNjYW5uZXIpOworICAgICAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbnRyaWVzLnB1c2hfYmFjayhzdGQ6OnN0cmluZyhlbnRyeSkpOworICAgIH0KKyAgICBkaXJTY2FubmVyX2ZyZWUoc2Nhbm5lcik7CisKKyAgICAvLyBUaGVyZSBpcyBubyBndWFyYW50ZWUgb24gdGhlIG9yZGVyIG9mIGZpbGVzIHJldHVybmVkIGJ5CisgICAgLy8gdGhlIGZpbGUgc3lzdGVtLCBzbyBzb3J0IHRoZW0gaGVyZSB0byBlbnN1cmUgY29uc2lzdGVudAorICAgIC8vIGNvbXBhcmlzb25zLgorICAgIHN0ZDo6c29ydChlbnRyaWVzLmJlZ2luKCksIGVudHJpZXMuZW5kKCkpOworCisgICAgRVhQRUNUX0VRKGtDb3VudCwgZW50cmllcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0NvdW50OyArK24pIHsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtFeHBlY3RlZFtuXSwgZW50cmllc1tuXS5jX3N0cigpKSA8PCAiIyIgPDwgbjsKKyAgICB9Cit9CisKK1RFU1QoRGlyU2Nhbm5lciwgc2NhbkZ1bGwpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0V4cGVjdGVkW10gPSB7CisgICAgICAgICJmaWZ0aCIsICJmaXJzdCIsICJmb3VydGgiLCAic2Vjb25kIiwgInNpeHRoIiwgInRoaXJkIgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtJbnB1dFtdID0geworICAgICAgICAiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCIsICJzaXh0aCIKKyAgICB9OworICAgIGNvbnN0IHNpemVfdCBrQ291bnQgPSBBUlJBWUxFTihrSW5wdXQpOworCisgICAgVGVzdFRlbXBEaXIgbXlEaXIoIkRpclNjYW5uZXJUZXN0Iik7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBrQ291bnQ7ICsrbikgeworICAgICAgICBtYWtlX3N1YmZpbGUobXlEaXIucGF0aCgpLCBrSW5wdXRbbl0pOworICAgIH0KKworICAgIERpclNjYW5uZXIqIHNjYW5uZXIgPSBkaXJTY2FubmVyX25ldyhteURpci5wYXRoKCkpOworICAgIEVYUEVDVF9UUlVFKHNjYW5uZXIpOworICAgIEVYUEVDVF9FUShrQ291bnQsIGRpclNjYW5uZXJfbnVtRW50cmllcyhzY2FubmVyKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW50cmllczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5ID0gZGlyU2Nhbm5lcl9uZXh0RnVsbChzY2FubmVyKTsKKyAgICAgICAgaWYgKCFlbnRyeSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW50cmllcy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoZW50cnkpKTsKKyAgICB9CisgICAgZGlyU2Nhbm5lcl9mcmVlKHNjYW5uZXIpOworCisgICAgLy8gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9uIHRoZSBvcmRlciBvZiBmaWxlcyByZXR1cm5lZCBieQorICAgIC8vIHRoZSBmaWxlIHN5c3RlbSwgc28gc29ydCB0aGVtIGhlcmUgdG8gZW5zdXJlIGNvbnNpc3RlbnQKKyAgICAvLyBjb21wYXJpc29ucy4KKyAgICBzdGQ6OnNvcnQoZW50cmllcy5iZWdpbigpLCBlbnRyaWVzLmVuZCgpKTsKKworICAgIEVYUEVDVF9FUShrQ291bnQsIGVudHJpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtDb3VudDsgKytuKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkID0KKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM6OmFkZFRyYWlsaW5nRGlyU2VwYXJhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcobXlEaXIucGF0aCgpKSk7CisgICAgICAgIGV4cGVjdGVkICs9IGtFeHBlY3RlZFtuXTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLmNfc3RyKCksIGVudHJpZXNbbl0uY19zdHIoKSkgPDwgIiMiIDw8IG47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RsbC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTlmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZGxsLmMKQEAgLTAsMCArMSwxNjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSA8YW5kcm9pZC91dGlscy9kbGwuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3V0aWxzL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvdXRpbHMvcGF0aC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24sIGFwcGVuZCBvbmUgc3RyaW5nIHRvIGFub3RoZXIsIGNhbGxlciBtdXN0IGZyZWUgcmVzdWx0ICovCitzdGF0aWMgY2hhcioKK2FwcGVuZF9zdHJpbmcoIGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIgKQoreworICAgIGludCAgIGxlbjEgICA9IHN0cmxlbihzdHIxKTsKKyAgICBpbnQgICBsZW4yICAgPSBzdHJsZW4oc3RyMik7CisgICAgY2hhciogcmVzdWx0ID0gbWFsbG9jKGxlbjErbGVuMisxKTsKKworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocmVzdWx0LCBzdHIxLCBsZW4xKTsKKyAgICAgICAgbWVtY3B5KHJlc3VsdCArIGxlbjEsIHN0cjIsIGxlbjIpOworICAgICAgICByZXN1bHRbbGVuMStsZW4yXSA9ICdcMCc7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBfV0lOMzIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworQUR5bmFtaWNMaWJyYXJ5KgorYWR5bmFtaWNMaWJyYXJ5X29wZW4oIGNvbnN0IGNoYXIqICBsaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICAgcEVycm9yKQoreworICAgIGNoYXIqICBsaWJOYW1lID0gKGNoYXIqKSBsaWJyYXJ5TmFtZTsKKyAgICB2b2lkKiAgcmVzdWx0OworCisgICAgLyogQXBwZW5kIGEgLmRsbCB0byB0aGUgbGlicmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhbiBleHRlbnNpb24gKi8KKyAgICBpZiAoc3RyY2hyKGxpYnJhcnlOYW1lLCcuJykgPT0gTlVMTCkgeworICAgICAgICBsaWJOYW1lID0gYXBwZW5kX3N0cmluZyhsaWJyYXJ5TmFtZSwgIi5kbGwiKTsKKyAgICB9CisKKyAgICAvKiBOb3cgZG8gb3VyIG1hZ2ljICovCisgICAgKnBFcnJvciA9IE5VTEw7CisgICAgcmVzdWx0ID0gKEFEeW5hbWljTGlicmFyeSopIExvYWRMaWJyYXJ5KCBsaWJOYW1lICk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICpwRXJyb3IgPSBBU1RSRFVQKCJDb3VsZCBub3QgbG9hZCBETEwhIik7CisgICAgfQorCisgICAgLyogRnJlZSB0aGUgbGlicmFyeSBuYW1lIGlmIHdlIG1vZGlmaWVkIGl0ICovCisgICAgaWYgKGxpYk5hbWUgIT0gbGlicmFyeU5hbWUpIHsKKyAgICAgICAgZnJlZShsaWJOYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gKEFEeW5hbWljTGlicmFyeSopIHJlc3VsdDsKK30KKwordm9pZCoKK2FkeW5hbWljTGlicmFyeV9maW5kU3ltYm9sKCBBRHluYW1pY0xpYnJhcnkqICBsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgc3ltYm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICAgICAgICBwRXJyb3IpCit7CisgICAgdm9pZCogcmVzdWx0OworCisgICAgKnBFcnJvciA9IE5VTEw7CisKKyAgICBpZiAobGliID09IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvciA9IHN0cmR1cCgiTlVMTCBsaWJyYXJ5IHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzeW1ib2xOYW1lID09IE5VTEwgfHwgc3ltYm9sTmFtZVswXSA9PSAnXDAnKSB7CisgICAgICAgICpwRXJyb3IgPSBzdHJkdXAoIk5VTEwgb3IgZW1wdHkgc3ltYm9sTmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gR2V0UHJvY0FkZHJlc3MoIChITU9EVUxFKWxpYiwgc3ltYm9sTmFtZSApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAqcEVycm9yID0gQVNUUkRVUCgiQ291bGQgbm90IGZpbmQgc3ltYm9sIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIENsb3NlL3VubG9hZCBhIGdpdmVuIGR5bmFtaWMgbGlicmFyeSAqLwordm9pZAorYWR5bmFtaWNMaWJyYXJ5X2Nsb3NlKCBBRHluYW1pY0xpYnJhcnkqICBsaWIgKQoreworICAgIGlmIChsaWIgIT0gTlVMTCkgeworICAgICAgICBGcmVlTGlicmFyeSggKEhNT0RVTEUpbGliICk7CisgICAgfQorfQorCisjZWxzZSAvKiAhX1dJTjMyICovCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitBRHluYW1pY0xpYnJhcnkqCithZHluYW1pY0xpYnJhcnlfb3BlbiggY29uc3QgY2hhciogIGxpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgICBwRXJyb3IpCit7CisgICAgY2hhciogIGxpYk5hbWUgPSAoY2hhciopIGxpYnJhcnlOYW1lOworICAgIHZvaWQqICByZXN1bHQ7CisKKyNpZmRlZiBfX0FQUExFX18KKyMgIGRlZmluZSBTT19FWFRFTlNJT04gIi5keWxpYiIKKyNlbHNlCisjICBkZWZpbmUgU09fRVhURU5TSU9OICIuc28iCisjZW5kaWYKKworICAgIC8qIEFwcGVuZCBhIC5zbyB0byB0aGUgbGlicmFyeSBuYW1lIGlmIGl0IGRvZXNuJ3QgaGF2ZSBhbiBleHRlbnNpb24gKi8KKyAgICBpZiAoc3RyY2hyKGxpYnJhcnlOYW1lLCcuJykgPT0gTlVMTCkgeworICAgICAgICBsaWJOYW1lID0gYXBwZW5kX3N0cmluZyhsaWJyYXJ5TmFtZSwgU09fRVhURU5TSU9OKTsKKyAgICB9CisKKyAgICAvKiBOb3cgZG8gb3VyIG1hZ2ljICovCisgICAgKnBFcnJvciA9IE5VTEw7CisgICAgcmVzdWx0ICA9IGRsb3BlbiggbGliTmFtZSwgUlRMRF9MQVpZICk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICpwRXJyb3IgPSBzdHJkdXAoZGxlcnJvcigpKTsKKyAgICB9CisKKyAgICAvKiBGcmVlIHRoZSBsaWJyYXJ5IG5hbWUgaWYgd2UgbW9kaWZpZWQgaXQgKi8KKyAgICBpZiAobGliTmFtZSAhPSAoY2hhciopbGlicmFyeU5hbWUpIHsKKyAgICAgICAgZnJlZShsaWJOYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gKEFEeW5hbWljTGlicmFyeSopIHJlc3VsdDsKK30KKwordm9pZCoKK2FkeW5hbWljTGlicmFyeV9maW5kU3ltYm9sKCBBRHluYW1pY0xpYnJhcnkqICBsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgc3ltYm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICAgICAgICBwRXJyb3IpCit7CisgICAgdm9pZCogcmVzdWx0OworCisgICAgKnBFcnJvciA9IE5VTEw7CisKKyAgICBpZiAobGliID09IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvciA9IHN0cmR1cCgiTlVMTCBsaWJyYXJ5IHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzeW1ib2xOYW1lID09IE5VTEwgfHwgc3ltYm9sTmFtZVswXSA9PSAnXDAnKSB7CisgICAgICAgICpwRXJyb3IgPSBzdHJkdXAoIk5VTEwgb3IgZW1wdHkgc3ltYm9sTmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gZGxzeW0obGliLCBzeW1ib2xOYW1lKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgKnBFcnJvciA9IHN0cmR1cChkbGVycm9yKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBDbG9zZS91bmxvYWQgYSBnaXZlbiBkeW5hbWljIGxpYnJhcnkgKi8KK3ZvaWQKK2FkeW5hbWljTGlicmFyeV9jbG9zZSggQUR5bmFtaWNMaWJyYXJ5KiAgbGliICkKK3sKKyAgICBpZiAobGliICE9IE5VTEwpIHsKKyAgICAgICAgZGxjbG9zZShsaWIpOworICAgIH0KK30KKworI2VuZGlmIC8qICFfV0lOMzIgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kbGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQxMWNiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2RsbC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBPcGFxdWUgdHlwZSB0byBtb2RlbCBhIGR5bmFtaWMgbGlicmFyeSBoYW5kbGUgKi8KK3R5cGVkZWYgc3RydWN0IEFEeW5hbWljTGlicmFyeSAgIEFEeW5hbWljTGlicmFyeTsKKworLyogVHJ5IHRvIGxvYWQvb3BlbiBhIGR5bmFtaWMgbGlicmFyeSBuYW1lZCAnbGlicmFyeU5hbWUnLCBsb29raW5nIGZvcgorICogaXQgaW4gdGhlIG9wdGlvbmFsIHBhdGhzIGxpc3RlZCBieSAnbGlicmFyeVBhdGhzJy4KKyAqCisgKiBPbmNlIG9wZW5lZCwgeW91IGNhbiB1c2UgYWR5bmFtaWNMaWJyYXJ5X2ZpbmRTeW1ib2woKSBhbmQKKyAqIGFkeW5hbWljTGlicmFyeV9jbG9zZSgpIG9uIGl0LgorICoKKyAqIGxpYnJhcnlOYW1lIDo6IGxpYnJhcnkgbmFtZSwgaWYgbm8gZXh0ZW5zaW9uIGlzIHByb3ZpZGVkLCB0aGVuICcuc28nCisgKiAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIG9uIFVuaXggc3lzdGVtcywgb3IgJy5kbGwnIG9uIFdpbmRvd3MuCisgKgorICogcEVycm9yIDo6IE9uIHN1Y2Nlc3MsICcqcEVycm9yJyB3aWxsIGJlIHNldCB0byBOVUxMLiBPbiBlcnJvciwgaXQgd2lsbAorICogICAgICAgICAgIHBvaW50IHRvIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yLCB3aGljaCBtdXN0IGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgdGhlIGNhbGxlci4KKyAqCisgKiByZXR1cm5zIGFuIEFEeW5hbWljTGlicmFyeSBwb2ludGVyLgorICovCitBRHluYW1pY0xpYnJhcnkqICAgYWR5bmFtaWNMaWJyYXJ5X29wZW4oIGNvbnN0IGNoYXIqICBsaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcioqICAgICAgIHBFcnJvcik7CisKKy8qIEZpbmQgYSBzeW1ib2wgaW5zaWRlIGEgZHluYW1pYyBsaWJyYXJ5LiAqLwordm9pZCogYWR5bmFtaWNMaWJyYXJ5X2ZpbmRTeW1ib2woIEFEeW5hbWljTGlicmFyeSogIGxpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBzeW1ib2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiAgICAgICAgICAgIHBFcnJvcik7CisKKy8qIENsb3NlL3VubG9hZCBhIGdpdmVuIGR5bmFtaWMgbGlicmFyeSAqLwordm9pZCAgYWR5bmFtaWNMaWJyYXJ5X2Nsb3NlKCBBRHluYW1pY0xpYnJhcnkqICBsaWIgKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZG5zLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTc2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZG5zLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImRucy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvRG5zLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL25ldHdvcmsvSXBBZGRyZXNzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpEbnM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpJcEFkZHJlc3M7CisKK2ludCBhbmRyb2lkX2Ruc19nZXRfc3lzdGVtX3NlcnZlcnModWludDMyX3QqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBEbnM6OkFkZHJlc3NMaXN0IGxpc3QgPSBEbnM6OmdldFN5c3RlbVNlcnZlckxpc3QoKTsKKyAgICBpZiAobGlzdC5lbXB0eSgpKSB7CisgICAgICAgIGRlcnJvcigiRmFpbGVkIHRvIHJldHJpZXZlIEROUyBzZXJ2ZXJzIGxpc3QgZnJvbSB0aGUgc3lzdGVtIik7CisgICAgICAgIHJldHVybiBrQW5kcm9pZERuc0Vycm9yQmFkU2VydmVyOworICAgIH0KKworICAgIHNpemVfdCBuID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGFkZHIgOiBsaXN0KSB7CisgICAgICAgIGlmICghYWRkci5pc0lwdjQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPj0gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyW24rK10gPSBhZGRyLmlwdjQoKTsKKyAgICB9CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGRlcnJvcigiVGhlcmUgYXJlIG5vIElQdjQgRE5TIHNlcnZlcnMgdXNlZCBpbiB0aGlzIHN5c3RlbSIpOworICAgICAgICByZXR1cm4ga0FuZHJvaWREbnNFcnJvckJhZFNlcnZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihuKTsKK30KKworaW50IGFuZHJvaWRfZG5zX3BhcnNlX3NlcnZlcnMoY29uc3QgY2hhciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnN0cmluZyBzZXJ2ZXJzKGlucHV0KTsKKworICAgIHN0ZDo6cmVwbGFjZShzZXJ2ZXJzLmJlZ2luKCksIHNlcnZlcnMuZW5kKCksICcsJywgJ1wwJyk7CisKKyAgICBzaXplX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IHBvcyA9IDA7IHBvcyA8IHNlcnZlcnMuc2l6ZSgpOykgeworICAgICAgICBjb25zdCBjaGFyKiBzZXJ2ZXIgPSAmc2VydmVyc1twb3NdOworICAgICAgICBJcEFkZHJlc3MgYWRkcihzZXJ2ZXIpOworICAgICAgICBpZiAoIWFkZHIudmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGtBbmRyb2lkRG5zRXJyb3JCYWRTZXJ2ZXI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZHIuaXNJcHY0KCkpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCA+PSBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtBbmRyb2lkRG5zRXJyb3JUb29NYW55U2VydmVyczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZmVyW2NvdW50KytdID0gYWRkci5pcHY0KCk7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gc2VydmVycy5maW5kKCdcMCcsIHBvcyk7CisgICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICsrcG9zOyAvLyBTa2lwIHRoZSBhY3R1YWwgbnVsbCB0ZXJtaW5hdG9yCisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50IGFuZHJvaWRfZG5zX2dldF9zZXJ2ZXJzKGNvbnN0IGNoYXIqIGRuc1NlcnZlck9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZG5zU2VydmVySXBzKSB7CisgICAgY29uc3QgaW50IGtNYXhEbnNTZXJ2ZXJzID0gQU5EUk9JRF9NQVhfRE5TX1NFUlZFUlM7CisgICAgaW50IGRuc0NvdW50ID0gMDsKKyAgICBpZiAoZG5zU2VydmVyT3B0aW9uICYmIGRuc1NlcnZlck9wdGlvblswXSkgeworICAgICAgICBkbnNDb3VudCA9IGFuZHJvaWRfZG5zX3BhcnNlX3NlcnZlcnMoZG5zU2VydmVyT3B0aW9uLCBkbnNTZXJ2ZXJJcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4RG5zU2VydmVycyk7CisgICAgICAgIGlmIChkbnNDb3VudCA9PSBrQW5kcm9pZERuc0Vycm9yVG9vTWFueVNlcnZlcnMpIHsKKyAgICAgICAgICAgIGRlcnJvcigiVG9vIG1heSBETlMgc2VydmVycyBsaXN0ZWQgaW4gLWRucy1zZXJ2ZXIgb3B0aW9uLCBhICIKKyAgICAgICAgICAgICAgICAgICAibWF4aW11bSBvZiAlZCB2YWx1ZXMgaXMgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgIEFORFJPSURfTUFYX0ROU19TRVJWRVJTKTsKKyAgICAgICAgICAgIHJldHVybiBrQW5kcm9pZERuc0Vycm9yVG9vTWFueVNlcnZlcnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRuc0NvdW50IDwgMCkgeyAgLy8gQmFkIGZvcm1hdCBpbiB0aGUgb3B0aW9uLgorICAgICAgICAgICAgZGVycm9yKCJNYWxmb3JtZWQgb3IgaW52YWxpZCAtZG5zLXNlcnZlciBwYXJhbWV0ZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICBkbnNTZXJ2ZXJPcHRpb24pOworICAgICAgICAgICAgcmV0dXJuIGtBbmRyb2lkRG5zRXJyb3JCYWRTZXJ2ZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFkbnNDb3VudCkgeworICAgICAgICBkbnNDb3VudCA9IGFuZHJvaWRfZG5zX2dldF9zeXN0ZW1fc2VydmVycyhkbnNTZXJ2ZXJJcHMsIGtNYXhEbnNTZXJ2ZXJzKTsKKyAgICAgICAgaWYgKGRuc0NvdW50IDwgMCkgeworICAgICAgICAgICAgZG5zQ291bnQgPSAwOworICAgICAgICAgICAgZHdhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCBzeXN0ZW0gRE5TIHNlcnZlcnMhIE5hbWUgcmVzb2x1dGlvbiB3aWxsICIKKyAgICAgICAgICAgICAgICAgICAgImJlIGRpc2FibGVkLiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSB7CisgICAgICAgIGRwcmludG4oImVtdWxhdG9yOiBGb3VuZCAlZCBETlMgc2VydmVyczoiLCBkbnNDb3VudCk7CisgICAgICAgIGZvciAoaW50IG4gPSAwOyBuIDwgZG5zQ291bnQ7ICsrbikgeworICAgICAgICAgICAgdWludDMyX3QgaXAgPSBkbnNTZXJ2ZXJJcHNbbl07CisgICAgICAgICAgICBkcHJpbnRuKCIgJWQuJWQuJWQuJWQiLCAodWludDhfdCkoaXAgPj4gMjQpLCAodWludDhfdCkoaXAgPj4gMTYpLAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCkoaXAgPj4gOCksICh1aW50OF90KShpcCkpOworICAgICAgICB9CisgICAgICAgIGRwcmludG4oIlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIGRuc0NvdW50OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Rucy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Rucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2Y0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZG5zLmgKQEAgLTAsMCArMSw3NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gTWF4aW11bSBudW1iZXIgb2YgRE5TIHNlcnZlcnMgc3VwcG9ydGVkIGJ5IHRoZSBBbmRyb2lkIGVtdWxhdG9yLgorI2RlZmluZSBBTkRST0lEX01BWF9ETlNfU0VSVkVSUyA0CisKKy8vIExpc3Qgb2YgdmFsdWVzIHJldHVybmVkIGJ5IGFuZHJvaWRfZG5zX2dldF9zZXJ2ZXJzKCkgdG8gaW5kaWNhdGUgYW4KKy8vIGVycm9yOgorLy8KKy8vIGtBbmRyb2lkRG5zRXJyb3JCYWRTZXJ2ZXIKKy8vICAgIEVpdGhlciB0aGF0IHRoZSBzZXJ2ZXIgbGlzdCBpcyBtYWxmb3JtZWQKKy8vICAgIG9yIHRoYXQgb25lIG9mIHRoZSBzZXJ2ZXIgbmFtZXMgY291bGQgbm90IGJlIHJlc29sdmVkLgorLy8KKy8vIGtBbmRyb2lkRG5zRXJyb3JUb29NYW55U2VydmVycworLy8gICAgVGhlcmUgYXJlIHRvbyBtYW55IHNlcnZlcnMgaW4gdGhlIGxpc3QuCisvLworZW51bSB7CisgICAga0FuZHJvaWREbnNFcnJvckJhZFNlcnZlciA9IC0xLAorICAgIGtBbmRyb2lkRG5zRXJyb3JUb29NYW55U2VydmVycyA9IC0yLAorfTsKKworLy8gUmV0cmlldmUgdGhlIElQIGFkZHJlc3NlcyBvZiBETlMgc2VydmVycyB0byBiZSB1c2VkIGR1cmluZyBlbXVsYXRpb24uCisvLyB8ZG5zU2VydmVyc09wdGlvbnwgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIC1kbnMtc2VydmVyCisvLyBjb21tYW5kLWxpbmUgb3B0aW9uLiBJZiBub3QgZW1wdHksIHRoaXMgbXVzdCBiZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCisvLyBETlMgc2VydmVyIG5hbWVzIG9yIGFkZHJlc3Nlcy4gSWYgdGhlIGxpc3QgaXMgaW52YWxpZCBvciB0aGUgcGFyYW1ldGVyCisvLyBOVUxMIG9yIGVtcHR5LCB0aGUgbGlzdCBvZiBzeXN0ZW0gRE5TIHNlcnZlcnMgd2lsbCBiZSBwcm9iZWQgaW5zdGVhZC4KKy8vIHxkbnNTZXJ2ZXJJcHN8IGlzIGFuIGFycmF5IG9mIEFORFJPSURfTUFYX0ROU19TRVJWRVJTIDMyLWJpdCBJUCBhZGRyZXNzZXMKKy8vIHRoYXQgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGZ1bmN0aW9uIG9uIHN1Y2Nlc3MuIFJldHVybiB0aGUgbnVtYmVyIG9mCisvLyBJUCBhZGRyZXNzZXMgZmlsbGVkIGluIHRoZSBhcnJheSwgb3IgYSBuZWdhdGl2ZSBrQW5kcm9pZERuc0Vycm9yWFhYIHZhbHVlCisvLyBvbiBlcnJvci4gQSByZXR1cm4gdmFsdWUgb2YgMCBpcyBwb3NzaWJsZSBhbmQgbWVhbnMgbm8gRE5TIHNlcnZlciB3YXMgZm91bmQuCisvLyBBIG5lZ2F0aXZlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGEgc2V2ZXJlIGVycm9yIHdoaWNoIHNob3VsZCBzdG9wIGVtdWxhdGlvbgorLy8gKHRoZSBmdW5jdGlvbiB3aWxsIGhhdmUgcHJpbnRlZCBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgdG8gZXhwbGFpbiB3aHkKKy8vIGJlZm9yZSByZXR1cm5pbmcpLgoraW50IGFuZHJvaWRfZG5zX2dldF9zZXJ2ZXJzKGNvbnN0IGNoYXIqIGRuc1NlcnZlcnNPcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRuc1NlcnZlcklwcyk7CisKKy8vIFRPRE86IFJlbW92ZSB0aGUgZGVjbGFyYXRpb25zIGJlbG93IG9uY2UgUUVNVTIgdXNlcworLy8gICAgICAgYW5kcm9pZF9kbnNfZ2V0X3NlcnZlcnMoKS4KKworLyogUmV0cmlldmUgRE5TIHNlcnZlcnMgY29uZmlndXJlZCBieSB0aGUgaG9zdCBzeXN0ZW0gYW5kIHBsYWNlIHRoZW0gaW4gYQorICogcHJvdmlkZWQgfGJ1ZmZlcnwuIFVwIHRvIHxidWZmZXJTaXplfCBETlMgc2VydmVycyBhcmUgcmV0cmlldmVkLiBPbiBzdWNjZXNzCisgKiB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgaXMgcmV0dXJuZWQsIG9uIGZhaWx1cmUgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZC4KKyAqLworaW50IGFuZHJvaWRfZG5zX2dldF9zeXN0ZW1fc2VydmVycyh1aW50MzJfdCogYnVmZmVyLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisKKy8qIFBhcnNlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mIEROUyBzZXJ2ZXJzIHNlcGFyYXRlZCBieSBjb21tYSBhbmQgcGxhY2UKKyAqIHRoZSBzZXJ2ZXJzIGludG8gdGhlIHByb3ZpZGVkIHxidWZmZXJ8LiBVcCB0byB8YnVmZmVyU2l6ZXwgc2VydmVycyBhcmUKKyAqIHBhcnNlZC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlcnZlcnMgYWRkZWQgdG8gfGJ1ZmZlcnwgb3IgYSBuZWdhdGl2ZSB2YWx1ZQorICogb24gZXJyb3IuIEN1cnJlbnRseSB0aGUgZm9sbG93aW5nIG5lZ2F0aXZlIHJldHVybiB2YWx1ZXMgaGF2ZSBzcGVjaWFsCisgKiBtZWFuaW5nOgorICogLTIgTnVtYmVyIG9mIHNlcnZlcnMgaW4gfHNlcnZlcnN8IHN0cmluZyBleGNlZWRzIHxidWZmZXJTaXplfAorICovCitpbnQgYW5kcm9pZF9kbnNfcGFyc2Vfc2VydmVycyhjb25zdCBjaGFyKiBzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZG5zX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kbnNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYTk5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZG5zX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Rucy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBpcFRvU3RyaW5nKHVpbnQzMl90IGlwKSB7CisgICAgY2hhciB0ZW1wWzMyXTsKKyAgICBzbnByaW50Zih0ZW1wLCBzaXplb2YodGVtcCksICIlZC4lZC4lZC4lZCIsIChpcCA+PiAyNCkgJiAyNTUsCisgICAgICAgICAgICAgKGlwID4+IDE2KSAmIDI1NSwgKGlwID4+IDgpICYgMjU1LCBpcCAmIDI1NSk7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRlbXApOworfQorCitURVNUKGFuZHJvaWRfZG5zX3BhcnNlX3NlcnZlcnMsIElnbm9yZUlwdjYpIHsKKyAgICBjb25zdCBpbnQga01heEFkZHJlc3NlcyA9IDM7CisgICAgdWludDMyX3QgYWRkcmVzc2VzW2tNYXhBZGRyZXNzZXNdID0ge307CisgICAgY29uc3QgY2hhciBrTGlzdFtdID0gIjEyNy4wLjAuMSw6OjEsMTI3LjAuMS4xIjsKKyAgICBFWFBFQ1RfRVEoMiwgYW5kcm9pZF9kbnNfcGFyc2Vfc2VydmVycyhrTGlzdCwgYWRkcmVzc2VzLCBrTWF4QWRkcmVzc2VzKSk7CisgICAgRVhQRUNUX0VRKDB4N2YwMDAwMDEsIGFkZHJlc3Nlc1swXSk7CisgICAgRVhQRUNUX0VRKDB4N2YwMDAxMDEsIGFkZHJlc3Nlc1sxXSk7Cit9CisKK1RFU1QoYW5kcm9pZF9kbnNfZ2V0X3N5c3RlbV9zZXJ2ZXJzLCBEdW1wTGlzdCkgeworICAgIGNvbnN0IHNpemVfdCBrTWF4U2VydmVycyA9IEFORFJPSURfTUFYX0ROU19TRVJWRVJTOworICAgIHVpbnQzMl90IGlwc1trTWF4U2VydmVyc107CisgICAgaW50IGNvdW50ID0gYW5kcm9pZF9kbnNfZ2V0X3N5c3RlbV9zZXJ2ZXJzKGlwcywga01heFNlcnZlcnMpOworICAgIEVYUEVDVF9HVChjb3VudCwgMCk7CisgICAgRVhQRUNUX0xUKGNvdW50LCBrTWF4U2VydmVycyk7CisgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBjb3VudDsgKytuKSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiRE5TIG5hbWVzZXJ2ZXIgIiA8PCBpcFRvU3RyaW5nKGlwc1tuXSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2R1ZmYuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kdWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwNzdlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9kdWZmLmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICAgIERVRkYnUyBERVZJQ0VTCisgKioqKioKKyAqKioqKi8KKworI2RlZmluZSAgRFVGRjEoX2NvdW50LF9zdG1udCkgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgX19uID0gKF9jb3VudCk7IFwKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBfc3RtbnQ7IFwKKyAgICAgICAgfSB3aGlsZSAoLS1fX24gPiAwKTsgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lICBEVUZGMihfY291bnQsX3N0bW50KSAgXAorICAgICh7IFwKKyAgICAgICAgaW50ICAgX19jb3VudCA9IChfY291bnQpOyBcCisgICAgICAgIGludCAgIF9fbiAgICAgPSAoX19jb3VudCArMSkvMjsgXAorICAgICAgICBzd2l0Y2ggKF9fY291bnQgJiAxKSB7IFwKKyAgICAgICAgY2FzZSAwOiBkbyB7IF9zdG1udDsgXAorICAgICAgICBjYXNlIDE6ICAgICAgX3N0bW50OyBcCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1fX24gPiAwKTsgXAorICAgICAgICB9IFwKKyAgICB9KQorCisjZGVmaW5lICBEVUZGNChfY291bnQsX3N0bW50KSAgXAorICAgICh7IFwKKyAgICAgICAgaW50ICAgX19jb3VudCA9IChfY291bnQpOyBcCisgICAgICAgIGludCAgIF9fbiAgICAgPSAoX19jb3VudCArMykvNDsgXAorICAgICAgICBzd2l0Y2ggKF9fY291bnQgJiAzKSB7IFwKKyAgICAgICAgY2FzZSAwOiBkbyB7IF9zdG1udDsgXAorICAgICAgICBjYXNlIDM6ICAgICAgX3N0bW50OyBcCisgICAgICAgIGNhc2UgMjogICAgICBfc3RtbnQ7IFwKKyAgICAgICAgY2FzZSAxOiAgICAgIF9zdG1udDsgXAorICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tX19uID4gMCk7IFwKKyAgICAgICAgfSBcCisgICAgfSkKKworI2RlZmluZSAgRFVGRjgoX2NvdW50LF9zdG1udCkgIFwKKyAgICAoeyBcCisgICAgICAgIGludCAgIF9fY291bnQgPSAoX2NvdW50KTsgXAorICAgICAgICBpbnQgICBfX24gICAgID0gKF9fY291bnQrNykvODsgXAorICAgICAgICBzd2l0Y2ggKF9fY291bnQgJiA3KSB7IFwKKyAgICAgICAgY2FzZSAwOiBkbyB7IF9zdG1udDsgXAorICAgICAgICBjYXNlIDc6ICAgICAgX3N0bW50OyBcCisgICAgICAgIGNhc2UgNjogICAgICBfc3RtbnQ7IFwKKyAgICAgICAgY2FzZSA1OiAgICAgIF9zdG1udDsgXAorICAgICAgICBjYXNlIDQ6ICAgICAgX3N0bW50OyBcCisgICAgICAgIGNhc2UgMzogICAgICBfc3RtbnQ7IFwKKyAgICAgICAgY2FzZSAyOiAgICAgIF9zdG1udDsgXAorICAgICAgICBjYXNlIDE6ICAgICAgX3N0bW50OyBcCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1fX24gPiAwKTsgXAorICAgICAgICB9IFwKKyAgICB9KQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjMzY5NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmMKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKworI2lmbmRlZiBfV0lOMzIKK3ZvaWQgYW5kcm9pZF9laW50cl93cmFwcGVyX2ZhdGFsKGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbCkgeworICAgIGFuZHJvaWRfcGFuaWMoCisgICAgICAgICAgICAiJXM6JWxkOiVzJXMgU3lzdGVtIGNhbGwgbG9vcGVkIGFyb3VuZCBFSU5UUiAlZCB0aW1lczogJXNcbiIsCisgICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgbGluZW5vLAorICAgICAgICAgICAgZnVuY3Rpb24gPyBmdW5jdGlvbiA6ICIiLAorICAgICAgICAgICAgZnVuY3Rpb24gPyAiOiIgOiAiIiwKKyAgICAgICAgICAgIE1BWF9FSU5UUl9MT09QX0NPVU5ULAorICAgICAgICAgICAgY2FsbCk7Cit9CisjZW5kaWYgIC8vICFfV0lOMzIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjRkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlci5oCkBAIC0wLDAgKzEsMTE4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBTZXQgRUlOVFJfV1JBUFBFUl9ERUJVRyB0byAxIHRvIGZvcmNlIHRoZSBkZWJ1ZyB2ZXJzaW9uIG9mIEhBTkRMRV9FSU5UUgorLy8gd2hpY2ggd2lsbCBjYWxsIGFuZHJvaWRfZWludHJfd3JhcHBlcl9mYXRhbCgpIGlzIHRoZSBzeXN0ZW0gY2FsbCBsb29wcworLy8gdG9vIG1hbnkgdGltZXMsIG9yIDAgdG8gZ2V0IGl0IHRvIGxvb3AgaW5kZWZpbml0bHkuCisvLyBNb3N0bHkgdXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorLy8gSWYgdGhlIG1hY3JvIGlzIHVuZGVmaW5lZCwgYXV0by1kZXRlY3QgdGhlIHZhbHVlIGJhc2VkIG9uIE5ERUJVRy4KKyNpZiAhZGVmaW5lZChFSU5UUl9XUkFQUEVSX0RFQlVHKQorIyAgaWZkZWYgTkRFQlVHCisjICAgIGRlZmluZSBFSU5UUl9XUkFQUEVSX0RFQlVHIDAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEVJTlRSX1dSQVBQRVJfREVCVUcgMQorIyAgZW5kaWYKKyNlbmRpZgorCisvLyBIQU5ETEVfRUlOVFIoKSBpcyBhIG1hY3JvIHVzZWQgdG8gaGFuZGxlIEVJTlRSIHJldHVybiB2YWx1ZXMgd2hlbgorLy8gY2FsbGluZyBzeXN0ZW0gY2FsbHMgbGlrZSBvcGVuKCkgb3IgcmVhZCgpIG9uIFBvc2l4IHN5c3RlbXMuCisvLworLy8gQnkgZGVmYXVsdCwgdGhpcyB3aWxsIGxvb3AgaW5kZWZpbml0bHksIHJldHJ5aW5nIHRoZSBjYWxsIHVudGlsCisvLyB0aGUgcmVzdWx0IGlzIG5vIGxvbmdlciAtMS9FSU5UUiwgZXhjZXB0IGluIGRlYnVnIG1vZGUsIHdoZXJlIGEKKy8vIGxvb3AgY291bnRlciBpcyBhY3R1YWxseSB1c2VkIGFuZCB0byBwcm92b2tlIGEgZmF0YWwgZXJyb3IgaWYgdGhlcmUKKy8vIGFyZSB0b28gbWFueSBsb29wcy4KKy8vCisvLyBVc2FnZSBleGFtcGxlOgorLy8gICAgIGludCByZXQgPSBIQU5ETEVfRUlOVFIob3BlbigiL3NvbWUvZmlsZS9wYXRoIiwgT19SRE9OTFkpKTsKKy8vCisvLyBJTVBPUlRBTlQ6IERvIG5vdCB1c2Ugd2l0aCB0aGUgY2xvc2UoKSBzeXN0ZW0gY2FsbCAodXNlIElHTk9SRV9FSU5UUigpCisvLyBpbnN0ZWFkKS4KKy8vCisvLyAtIE9uIExpbnV4LCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGFsd2F5cyBhbHJlYWR5IGNsb3NlZCB3aGVuIHRoaXMKKy8vICAgZnVuY3Rpb24gcmV0dXJucyAtMS9FSU5UUiwgYW5kIGNhbGxpbmcgaXQgYWdhaW4gd2l0aCB0aGUgc2FtZQorLy8gICBwYXJhbWV0ZXJzIHJpc2tzIGNsb3NpbmcgYW5vdGhlciBmaWxlIGRlc2NyaXB0b3Igb3BlbiBieSBhbm90aGVyCisvLyAgIHRocmVhZCBpbiBwYXJhbGxlbCEKKy8vCisvLyAtIE9uIE9TIFgsIHdoZXRoZXIgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQgb3Igbm90IGlzIHByZXR0eQorLy8gICBtdWNoIHJhbmRvbSEgSXQncyBiZXR0ZXIgdG8gbGVhdmUgdGhlIGRlc2NyaXB0b3Igb3BlbiB0aGFuIHJpc2sKKy8vICAgY2xvc2luZyBhbm90aGVyIG9uZSBieSBtaXN0YWtlIDooCisvLworI2RlZmluZSBNQVhfRUlOVFJfTE9PUF9DT1VOVCAgMTAwCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBIQU5ETEVfRUlOVFIoeCkgICh4KQorI2VsaWYgRUlOVFJfV1JBUFBFUl9ERUJVRyA9PSAwCisjICBkZWZpbmUgSEFORExFX0VJTlRSKHgpIFwKKyAgICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgICAgICAgX190eXBlb2ZfXyh4KSBlaW50cl93cmFwcGVyX3Jlc3VsdDsgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIGVpbnRyX3dyYXBwZXJfcmVzdWx0ID0gKHgpOyBcCisgICAgICAgIH0gd2hpbGUgKGVpbnRyX3dyYXBwZXJfcmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7IFwKKyAgICAgICAgZWludHJfd3JhcHBlcl9yZXN1bHQ7IFwKKyAgICB9KQorI2Vsc2UgIC8vICFfV0lOMzIgJiYgRUlOVFJfV1JBUFBFUl9ERUJVRworCisjICBkZWZpbmUgSEFORExFX0VJTlRSKHgpIFwKKyAgICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgICAgICAgX190eXBlb2ZfXyh4KSBlaW50cl93cmFwcGVyX3Jlc3VsdDsgXAorICAgICAgICBpbnQgZWludHJfd3JhcHBlcl9sb29wX2NvdW50ID0gMDsgXAorICAgICAgICBmb3IgKDs7KSB7IFwKKyAgICAgICAgICAgIGVpbnRyX3dyYXBwZXJfcmVzdWx0ID0gKHgpOyBcCisgICAgICAgICAgICBpZiAoZWludHJfd3JhcHBlcl9yZXN1bHQgIT0gLTEgfHwgZXJybm8gIT0gRUlOVFIpIFwKKyAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgaWYgKCsrZWludHJfd3JhcHBlcl9sb29wX2NvdW50ID49IE1BWF9FSU5UUl9MT09QX0NPVU5UKSB7IFwKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2VpbnRyX3dyYXBwZXJfZmF0YWwoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLF9fTElORV9fLF9fUFJFVFRZX0ZVTkNUSU9OX18sI3gpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfTsgXAorICAgICAgICBlaW50cl93cmFwcGVyX3Jlc3VsdDsgXAorICAgIH0pCisjZW5kaWYgIC8vICFfV0lOMzIgJiYgRUlOVFJfV1JBUFBFUl9ERUJVRworCisvLyBJR05PUkVfRUlOVFIoKSBpcyBhIG1hY3JvIHVzZWQgdG8gcGVyZm9ybSBhIHN5c3RlbSBjYWxsIGFuZCBpZ25vcmUKKy8vIGFuIEVJTlRSIHJlc3VsdCwgaS5lLiBpdCB3aWxsIHJldHVybiAwIGluc3RlYWQgb2YgLTEgaWYgdGhpcyBvY2N1cnMuCisvLyBUaGlzIGlzIG1vc3RseSB1c2VkIHdpdGggdGhlIGNsb3NlKCkgc3lzdGVtIGNhbGwsIGFzIGRlc2NyaWJlZAorLy8gaW4gdGhlIEhBTkRMRV9FSU5UUigpIGRvY3VtZW50YXRpb24uCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgSUdOT1JFX0VJTlRSKHgpICAoeCkKKyNlbHNlCisjICBkZWZpbmUgSUdOT1JFX0VJTlRSKHgpIFwKKyAgICBfX2V4dGVuc2lvbl9fICh7IFwKKyAgICAgICAgX190eXBlb2ZfXyh4KSBlaW50cl93cmFwcGVyX3Jlc3VsdCA9ICh4KTsgXAorICAgICAgICBpZiAoZWludHJfd3JhcHBlcl9yZXN1bHQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIFwKKyAgICAgICAgICAgIGVpbnRyX3dyYXBwZXJfcmVzdWx0ID0gMDsgXAorICAgICAgICBlaW50cl93cmFwcGVyX3Jlc3VsdDsgXAorICAgIH0pCisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGRlYnVnIG1vZGUgb25seSB3aGVuIGEgc3lzdGVtIGNhbGwgd3JhcHBlZAorLy8gYnkgSEFORExFX0VJTlRSKCkgZmFpbGVkIG1vcmUgdGhhbiBNQVhfRUlOVFJfTE9PUF9DT1VOVCB0aW1lcy4KKy8vIHxmaWxlfCBpcyB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uCisvLyB8bGluZW5vfCBpcyB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlLgorLy8gfGZ1bmN0aW9ufCBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24sIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKy8vIHxjYWxsfCBpcyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzeXN0ZW0gY2FsbCB0aGF0IGZhaWxlZC4KK3ZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBhbmRyb2lkX2VpbnRyX3dyYXBwZXJfZmF0YWwoCisgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsCisgICAgICAgIGxvbmcgbGluZW5vLAorICAgICAgICBjb25zdCBjaGFyKiBmdW5jdGlvbiwKKyAgICAgICAgY29uc3QgY2hhciogY2FsbCk7CisjZW5kaWYgIC8vICFfV0lOMzIKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZWludHJfd3JhcHBlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNmFiZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIEZvcmNlcyBkZWJ1ZyBtb2RlCisjZGVmaW5lIEVJTlRSX1dSQVBQRVJfREVCVUcgMQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIExvb3AgY291bnRlciB1c2VkIGJ5IHNldmVyYWwgZnVuY3Rpb25zIGJlbG93Lgorc3RhdGljIGludCBsb29wX2NvdW50ID0gMDsKKworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZCwgb3IgLTEvRUlOVkFMCisvLyBvdGhlcndpc2UuCitzdGF0aWMgaW50IHJldHVybl9laW52YWxfYWZ0ZXJfZmlyc3RfY2FsbCh2b2lkKSB7CisgICAgaWYgKCsrbG9vcF9jb3VudCA9PSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGVycm5vID0gRUlOVkFMOworICAgIHJldHVybiAtMTsKK30KKworVEVTVChlaW50cl93cmFwcGVyLE5vTG9vcE9uU3VjY2VzcykgeworICAgIGxvb3BfY291bnQgPSAwOworICAgIEVYUEVDVF9FUSgwLCBIQU5ETEVfRUlOVFIocmV0dXJuX2VpbnZhbF9hZnRlcl9maXJzdF9jYWxsKCkpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbG9vcF9jb3VudCk7Cit9CisKK1RFU1QoZWludHJfd3JhcHBlcixOb0xvb3BPblJlZ3VsYXJFcnJvcikgeworICAgIGxvb3BfY291bnQgPSAwOworICAgIEVYUEVDVF9FUSgwLCBIQU5ETEVfRUlOVFIocmV0dXJuX2VpbnZhbF9hZnRlcl9maXJzdF9jYWxsKCkpKTsKKyAgICBFWFBFQ1RfRVEoLTEsIEhBTkRMRV9FSU5UUihyZXR1cm5fZWludmFsX2FmdGVyX2ZpcnN0X2NhbGwoKSkpOworICAgIEVYUEVDVF9FUShFSU5WQUwsIGVycm5vKTsKKyAgICBFWFBFQ1RfRVEoMiwgbG9vcF9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgYWx3YXlzX3JldHVybl9laW50cih2b2lkKSB7CisgICAgbG9vcF9jb3VudCsrOworI2lmZGVmIF9XSU4zMgorICAgIC8vIFdpbjMyIGNhbm5vdCBnZW5lcmF0ZSBFSU5UUi4KKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgZXJybm8gPSBFSU5UUjsKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworVEVTVChlaW50cl93cmFwcGVyLElnbm9yZUVpbnRyKSB7CisgICAgbG9vcF9jb3VudCA9IDA7CisgICAgRVhQRUNUX0VRKDAsIElHTk9SRV9FSU5UUihhbHdheXNfcmV0dXJuX2VpbnRyKCkpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbG9vcF9jb3VudCk7Cit9CisKKyNpZm5kZWYgX1dJTjMyCisKKy8vIFRoaXMgZnVuY3Rpb24gbG9vcHMgMTAgdGltZXMgYXJvdW5kIHxsb29wX2NvdW50fCwgd2hpbGUgcmV0dXJuaW5nCisvLyAtMS9lcnJuby4KK3N0YXRpYyBpbnQgbG9vcF9laW50cl8xMCh2b2lkKSB7CisgICAgaWYgKCsrbG9vcF9jb3VudCA8IDEwKSB7CisgICAgICAgIGVycm5vID0gRUlOVFI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1RFU1QoZWludHJfd3JhcHBlcixMb29wT25FaW50cikgeworICAgIGxvb3BfY291bnQgPSAwOworICAgIEVYUEVDVF9FUSgwLCBIQU5ETEVfRUlOVFIobG9vcF9laW50cl8xMCgpKSk7CisgICAgRVhQRUNUX0VRKDEwLCBsb29wX2NvdW50KTsKK30KKworLy8gSW1wbGVtZW50YXRpb24gb2YgYSBjdXN0b20gcGFuaWMgZnVuY3Rpb24gdXNlZCB0byBkZXRlY3QgdGhhdAorLy8gSEFORExFX0VJTlRSKCkgY2FsbGVkIHBhbmljIGFmdGVyIHRvbyBtYW55IGxvb3AgaXRlcmF0aW9ucy4KKy8vIFVzZXMgc2V0am1wKCkvbG9uZ2ptcCgpIHNpbmNlIHRoZSBwYW5pYyBoYW5kbGVyIG11c3QgYmUKKy8vIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkuCitzdGF0aWMgam1wX2J1ZiBwYW5pY19qdW1wZXI7CitzdGF0aWMgYm9vbCBwYW5pY19jYWxsZWQgPSBmYWxzZTsKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorICAgICAgICBteV9wYW5pY19oYW5kbGVyKGNvbnN0IGNoYXIqLCB2YV9saXN0KTsKKworc3RhdGljIHZvaWQgbXlfcGFuaWNfaGFuZGxlcihjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncykgeworICAgIHBhbmljX2NhbGxlZCA9IHRydWU7CisgICAgbG9uZ2ptcChwYW5pY19qdW1wZXIsIDEpOworfQorCitzdGF0aWMgaW50IGxvb3BfZWludHJfMjAwKHZvaWQpIHsKKyAgICBpZiAoKytsb29wX2NvdW50IDwgMjAwKSB7CisgICAgICAgIGVycm5vID0gRUlOVFI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1RFU1QoZWludHJfd3JhcHBlcixQYW5pY09uVG9vTWFueUxvb3BzKSB7CisgICAgbG9vcF9jb3VudCA9IDA7CisgICAgYW5kcm9pZF9wYW5pY19yZWdpc3RlckhhbmRsZXIobXlfcGFuaWNfaGFuZGxlcik7CisgICAgaWYgKHNldGptcChwYW5pY19qdW1wZXIpID09IDApIHsKKyAgICAgICAgSEFORExFX0VJTlRSKGxvb3BfZWludHJfMjAwKCkpOworICAgICAgICBBU1NFUlRfVFJVRSgwKSA8PCAiSEFORExFX0VJTlRSKCkgZGlkbid0IHBhbmljISI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0VRKHRydWUsIHBhbmljX2NhbGxlZCk7CisgICAgICAgIEVYUEVDVF9FUShNQVhfRUlOVFJfTE9PUF9DT1VOVCwgbG9vcF9jb3VudCk7CisgICAgfQorfQorCisjZW5kaWYgIC8vICFfV0lOMzIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9leGVjLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9leGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWYzMTQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2V4ZWMuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9leGVjLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx2ZWN0b3I+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vIENvbnNvbGUgY29udHJvbCBoYW5kbGVyIGhhcyBubyB3YXkgb2YgcGFzc2luZyBkYXRhLCBzbyBsZXQncyBoYXZlCisvLyBhIGdsb2JhbCB2YXJpYWJsZSBoZXJlLgorc3RhdGljIEhBTkRMRSBzQ2hpbGRQcm9jZXNzSGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKK3N0YXRpYyBCT09MIFdJTkFQSSBjdHJsSGFuZGxlcihEV09SRCB0eXBlKQoreworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGZmbHVzaChzdGRlcnIpOworCisgICAgaWYgKHNDaGlsZFByb2Nlc3NIYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgLy8gSnVzdCBpbnZva2UgdGhlIG5leHQgaGFuZGxlciAtIHRoaXMgb25lIGhhcyBub3RoaW5nIHRvIGRvLgorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gV2luZG93cyA3IGtpbGxzIGFwcGxpY2F0aW9uIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuCisgICAgLy8gU2xlZXAgaGVyZSB0byBnaXZlIFFFTVUgZW5naW5lIGEgY2hhbmNlIGZvciBjbG9zaW5nLgorICAgIC8vIFdpbmRvd3MgYWxzbyBraWxscyB0aGUgcHJvZ3JhbSBhZnRlciAxMCBzZWNvbmRzIGFueXdheS4KKyAgICBpZiAoOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHNDaGlsZFByb2Nlc3NIYW5kbGUsIDkwMDApICE9IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgOjpUZXJtaW5hdGVQcm9jZXNzKHNDaGlsZFByb2Nlc3NIYW5kbGUsIDEwMCk7CisgICAgfQorICAgIGV4aXQoMSk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOworCitpbnQgc2FmZV9leGVjdihjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiBjb25zdCogYXJndikgeworICAgc3RkOjp2ZWN0b3I8V2luMzJVbmljb2RlU3RyaW5nPiBhcmd1bWVudHM7CisgICBmb3IgKHNpemVfdCBpID0gMDsgYXJndltpXSAhPSBudWxscHRyOyArK2kpIHsKKyAgICAgIGFyZ3VtZW50cy5wdXNoX2JhY2soV2luMzJVbmljb2RlU3RyaW5nKGFyZ3ZbaV0pKTsKKyAgIH0KKyAgIC8vIERvIHRoaXMgaW4gdHdvIHN0ZXBzIHNpbmNlIHRoZSBwb2ludGVycyBtaWdodCBjaGFuZ2UgYmVjYXVzZSBvZiBwdXNoX2JhY2sKKyAgIC8vIGluIHRoZSBsb29wIGFib3ZlLgorICAgc3RkOjp2ZWN0b3I8Y29uc3Qgd2NoYXJfdCo+IGFyZ3VtZW50UG9pbnRlcnM7CisgICBmb3IgKGNvbnN0IGF1dG8mIGFyZyA6IGFyZ3VtZW50cykgeworICAgICAgYXJndW1lbnRQb2ludGVycy5wdXNoX2JhY2soYXJnLmNfc3RyKCkpOworICAgfQorICAgYXJndW1lbnRQb2ludGVycy5wdXNoX2JhY2sobnVsbHB0cik7CisgICBXaW4zMlVuaWNvZGVTdHJpbmcgcHJvZ3JhbShwYXRoKTsKKworICAgOjpTZXRDb25zb2xlQ3RybEhhbmRsZXIoY3RybEhhbmRsZXIsIFRSVUUpOworCisgICBzQ2hpbGRQcm9jZXNzSGFuZGxlID0gKEhBTkRMRSlfd3NwYXdudihfUF9OT1dBSVQsIHByb2dyYW0uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJndW1lbnRQb2ludGVyc1swXSk7CisgICBpZiAoc0NoaWxkUHJvY2Vzc0hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgIDo6U2V0Q29uc29sZUN0cmxIYW5kbGVyKGN0cmxIYW5kbGVyLCBGQUxTRSk7CisgICAgICAgcmV0dXJuIDE7CisgICB9CisgICA6OldhaXRGb3JTaW5nbGVPYmplY3Qoc0NoaWxkUHJvY2Vzc0hhbmRsZSwgSU5GSU5JVEUpOworICAgRFdPUkQgZXhpdENvZGU7CisgICBpZiAoITo6R2V0RXhpdENvZGVQcm9jZXNzKHNDaGlsZFByb2Nlc3NIYW5kbGUsICZleGl0Q29kZSkpIHsKKyAgICAgICBleGl0Q29kZSA9IDI7CisgICB9CisgICBleGl0KGV4aXRDb2RlKTsKK30KKworI2Vsc2UKKworaW50IHNhZmVfZXhlY3YoY29uc3QgY2hhciogcGF0aCwgY2hhciogY29uc3QqIGFyZ3YpIHsKKyAgICByZXR1cm4gZXhlY3YocGF0aCwgYXJndik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2V4ZWMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9leGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0NzliNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9leGVjLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBUaGlzIGlzIGEgZ2VuZXJpYyB3cmFwcGVyIG92ZXIgdGhlIGV4ZWMoKSBzeXN0ZW0gY2FsbC4gSXQgdHJpZXMgdG8gaGlkZQorLy8gdGhlIE9TLWRlcGVuZGVkIGRpZmZlcmVuY2VzIGZyb20gdGhlIHVzZXIuCisvLyAgT24gUG9zaXggaXQncyBqdXN0IGEgcmF3IGV4ZWN2KCkgd2l0aCBwYXNzZWQgYXJndW1lbnRzCisvLyAgT24gV2luZG93cyB0aGlzIGFjdHVhbGx5IHNwYXducyBhIGNoaWxkIHByb2Nlc3MgYW5kIHdhaXRzIGZvciBpdCB0byBmaW5pc2gKKy8vICAgdGhpcyBpcyBuZWVkZWQgdG8gd29ya2Fyb3VuZCBwb29yIGNvbnNvbGUgaW1wbGVtZW50YXRpb24gd2hpY2ggY2FuJ3QKKy8vICAgcmVhbGx5IHN1cHBvcnQgbXVsdGlwbGUgcHJvY2Vzc2VzIG9uIHRoZSBzYW1lIGNvbnNvbGUgd2VsbAorCitpbnQgc2FmZV9leGVjdihjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiBjb25zdCogYXJndik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmM0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZV9kYXRhLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2RhdGEuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gVXNlIGEgbWFnaWMgdmFsdWUgaW4gdGhlIHxmbGFnc3wgZmllbGQgdG8gaW5kaWNhdGUgdGhhdCBhIEZpbGVEYXRhCisvLyB2YWx1ZSB3YXMgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEhlbHBzIGNhdGNoIGVycm9ycyBhdCBydW50aW1lLgorI2RlZmluZSBGSUxFX0RBVEFfTUFHSUMgICAoKHNpemVfdCkweDg3MDAyMDEzVSkKKworCitib29sIGZpbGVEYXRhX2lzVmFsaWQoY29uc3QgRmlsZURhdGEqIGRhdGEpIHsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZGF0YS0+ZmxhZ3MgPT0gRklMRV9EQVRBX01BR0lDKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoZGF0YS0+ZmxhZ3MgPT0gMCAmJiBkYXRhLT5kYXRhID09IE5VTEwgJiYgZGF0YS0+c2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxlRGF0YV9zZXRWYWxpZChGaWxlRGF0YSogZGF0YSkgeworICAgIGRhdGEtPmZsYWdzID0gRklMRV9EQVRBX01BR0lDOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxlRGF0YV9zZXRJbnZhbGlkKEZpbGVEYXRhKiBkYXRhKSB7CisgICAgZGF0YS0+ZmxhZ3MgPSAoc2l6ZV90KTB4REVBREJFRUZVOworfQorCisKK3N0YXRpYyB2b2lkIGZpbGVEYXRhX2luaXRXaXRoKEZpbGVEYXRhKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgICAgZGF0YS0+ZGF0YSA9IHNpemUgPyAodWludDhfdCopYnVmZiA6IE5VTEw7CisgICAgZGF0YS0+c2l6ZSA9IHNpemU7CisgICAgZmlsZURhdGFfc2V0VmFsaWQoZGF0YSk7Cit9CisKKwordm9pZCBmaWxlRGF0YV9pbml0RW1wdHkoRmlsZURhdGEqIGRhdGEpIHsKKyAgICBmaWxlRGF0YV9pbml0V2l0aChkYXRhLCBOVUxMLCAwKTsKK30KKworCitpbnQgZmlsZURhdGFfaW5pdEZyb21GaWxlKEZpbGVEYXRhKiBkYXRhLCBjb25zdCBjaGFyKiBmaWxlUGF0aCkgeworICAgIEZJTEUqIGYgPSBmb3BlbihmaWxlUGF0aCwgInJiIik7CisgICAgaWYgKCFmKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaW50IHJldCA9IDA7CisgICAgZG8geworICAgICAgICBpZiAoZnNlZWsoZiwgMCwgU0VFS19FTkQpIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGZpbGVTaXplID0gZnRlbGwoZik7CisgICAgICAgIGlmIChmaWxlU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbGVTaXplID09IDApIHsKKyAgICAgICAgICAgIGZpbGVEYXRhX2luaXRFbXB0eShkYXRhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2hhciogYnVmZmVyID0gbWFsbG9jKChzaXplX3QpZmlsZVNpemUpOworICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgcmVhZExlbiA9IGZyZWFkKGJ1ZmZlciwgMSwgKHNpemVfdClmaWxlU2l6ZSwgZik7CisgICAgICAgIGlmIChyZWFkTGVuICE9IChzaXplX3QpZmlsZVNpemUpIHsKKyAgICAgICAgICAgIGlmIChmZW9mKGYpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLWZlcnJvcihmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZmlsZURhdGFfaW5pdFdpdGgoZGF0YSwgYnVmZmVyLCByZWFkTGVuKTsKKworICAgIH0gd2hpbGUgKDApOworCisgICAgZmNsb3NlKGYpOworICAgIHJldHVybiByZXQ7Cit9CisKKworaW50IGZpbGVEYXRhX2luaXRGcm9tKEZpbGVEYXRhKiBkYXRhLCBjb25zdCBGaWxlRGF0YSogb3RoZXIpIHsKKyAgICBpZiAoIW90aGVyIHx8ICFmaWxlRGF0YV9pc1ZhbGlkKG90aGVyKSkgeworICAgICAgICBBUEFOSUMoIlRyeWluZyB0byBjb3B5IGFuIHVuaW5pdGlhbGl6ZWQgRmlsZURhdGEgaW5zdGFuY2VcbiIpOworICAgIH0KKyAgICBpZiAob3RoZXItPnNpemUgPT0gMCkgeworICAgICAgICBmaWxlRGF0YV9pbml0RW1wdHkoZGF0YSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB2b2lkKiBjb3B5ID0gbWFsbG9jKG90aGVyLT5zaXplKTsKKyAgICBpZiAoIWNvcHkpIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICBtZW1jcHkoY29weSwgb3RoZXItPmRhdGEsIG90aGVyLT5zaXplKTsKKyAgICBmaWxlRGF0YV9pbml0V2l0aChkYXRhLCBjb3B5LCBvdGhlci0+c2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IGZpbGVEYXRhX2luaXRGcm9tTWVtb3J5KEZpbGVEYXRhKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlucHV0TGVuKSB7CisgICAgRmlsZURhdGEgb3RoZXI7CisgICAgZmlsZURhdGFfaW5pdFdpdGgoJm90aGVyLCBpbnB1dCwgaW5wdXRMZW4pOworICAgIG1lbXNldChkYXRhLCAwLCBzaXplb2YoKmRhdGEpKTsgIC8vIG1ha2UgdmFsZ3JpbmQgaGFwcHkuCisgICAgcmV0dXJuIGZpbGVEYXRhX2luaXRGcm9tKGRhdGEsICZvdGhlcik7Cit9CisKKwordm9pZCBmaWxlRGF0YV9zd2FwKEZpbGVEYXRhKiBkYXRhLCBGaWxlRGF0YSogb3RoZXIpIHsKKyAgICBpZiAoIWZpbGVEYXRhX2lzVmFsaWQoZGF0YSkgfHwgIWZpbGVEYXRhX2lzVmFsaWQoZGF0YSkpCisgICAgICAgIEFQQU5JQygiVHJ5aW5nIHRvIHN3YXAgdW4taW5pdGlhbGl6ZWQgRmlsZURhdGEgaW5zdGFuY2VcbiIpOworCisgICAgdWludDhfdCogYnVmZmVyID0gZGF0YS0+ZGF0YTsKKyAgICBkYXRhLT5kYXRhID0gb3RoZXItPmRhdGE7CisgICAgb3RoZXItPmRhdGEgPSBidWZmZXI7CisKKyAgICBzaXplX3Qgc2l6ZSA9IGRhdGEtPnNpemU7CisgICAgZGF0YS0+c2l6ZSA9IG90aGVyLT5zaXplOworICAgIG90aGVyLT5zaXplID0gc2l6ZTsKK30KKworCit2b2lkIGZpbGVEYXRhX2RvbmUoRmlsZURhdGEqIGRhdGEpIHsKKyAgICBpZiAoIWZpbGVEYXRhX2lzVmFsaWQoZGF0YSkpIHsKKyAgICAgICAgQVBBTklDKCJUcnlpbmcgdG8gZmluYWxpemUgYW4gdW4taW5pdGlhbGl6ZWQgRmlsZURhdGEgaW5zdGFuY2VcbiIpOworICAgIH0KKworICAgIGZyZWUoZGF0YS0+ZGF0YSk7CisgICAgZmlsZURhdGFfaW5pdFdpdGgoZGF0YSwgTlVMTCwgMCk7CisgICAgZmlsZURhdGFfc2V0SW52YWxpZChkYXRhKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9maWxlX2RhdGEuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9maWxlX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZiYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gb3duIGEgYnVmZmVyIG9mIGhlYXAtYWxsb2NhdGVkIG1lbW9yeSB0aGF0CisvLyB0eXBpY2FsbHkgY29tZXMgZnJvbSBhIGZpbGUuCisvLyB8ZGF0YXwgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBpbiBtZW1vcnkuCisvLyB8c2l6ZXwgaXMgdGhlIHNpemUgb2YgdGhlIGRhdGEgaW4gYnl0ZXMuCisvLyB8ZmxhZ3N8IGlzIHVzZWQgaW50ZXJuYWxseSwgZG8gbm90IHVzZSBpdC4KKy8vIE5vdGUgdGhhdCB8ZGF0YXwgd2lsbCBhbHdheXMgYmUgTlVMTCBpZiB8c2l6ZXwgaXMgMC4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90KiBkYXRhOworICAgIHNpemVfdCBzaXplOworICAgIC8vIHByaXZhdGUKKyAgICBzaXplX3QgZmxhZ3M7Cit9IEZpbGVEYXRhOworCisvLyBJbml0aWFsaXplciB2YWx1ZSBmb3IgYSBGaWxlRGF0YSBpbnN0YW5jZS4KKy8vIEl0cyBpbXBvcnRhbnQgdGhhdCB0aGlzIGlzIGFsbCB6ZXJvZXMuCisjZGVmaW5lIEZJTEVfREFUQV9JTklUICB7IE5VTEwsIDAsIDAgfQorCisvLyBSZXR1cm4gdHJ1ZSBpZmYgYSB8ZmlsZURhdGF8IGlzIGVtcHR5Lgorc3RhdGljIGlubGluZSBib29sIGZpbGVEYXRhX2lzRW1wdHkoY29uc3QgRmlsZURhdGEqIGZpbGVEYXRhKSB7CisgICAgcmV0dXJuIGZpbGVEYXRhLT5zaXplID09IDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZmYgfGZpbGVEYXRhfCBpcyB2YWxpZC4gVXNlZCBmb3IgdW5pdC10ZXN0aW5nLgorYm9vbCBmaWxlRGF0YV9pc1ZhbGlkKGNvbnN0IEZpbGVEYXRhKiBmaWxlRGF0YSk7CisKKy8vIEluaXRpYWxpemUgYSBGaWxlRGF0YSB2YWx1ZSB0byB0aGUgZW1wdHkgdmFsdWUuCit2b2lkIGZpbGVEYXRhX2luaXRFbXB0eShGaWxlRGF0YSogZmlsZURhdGEpOworCisvLyBJbml0aWFsaXplIGEgRmlsZURhdGEgdmFsdWUgYnkgcmVhZGluZyB0aGUgY29udGVudCBvZiBhIGdpdmVuIGZpbGUKKy8vIGF0IHxmaWxlUGF0aHwuIE9uIHN1Y2Nlc3MsIHJldHVybiAwIGFuZCBpbml0aWFsaXplcyB8ZmlsZURhdGF8IHByb3Blcmx5LgorLy8gT24gZmFpbHVyZSwgcmV0dXJuIC1lcnJubyBjb2RlLCBhbmQgc2V0IHxmaWxlRGF0YXwgdG8gRklMRV9EQVRBX0lOSVQuCitpbnQgZmlsZURhdGFfaW5pdEZyb21GaWxlKEZpbGVEYXRhKiBmaWxlRGF0YSwgY29uc3QgY2hhciogZmlsZVBhdGgpOworCisvLyBJbml0aWFsaXplIGEgRmlsZURhdGEgYnkgY29weWluZyBhIG1lbW9yeSBidWZmZXIuCisvLyB8ZmlsZURhdGF8IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBGaWxlRGF0YSB2YWx1ZSB0byBpbml0aWFsaXplLgorLy8gfGJ1ZmZlcnwgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGlucHV0IGJ1ZmZlciB0aGF0IHdpbGwgYmUgY29waWVkCisvLyBpbnRvIHRoZSBGaWxlRGF0YS4KKy8vIHxidWZmZXJMZW58IGlzIHRoZSBidWZmZXIgbGVuZ3RoIGluIGJ5dGVzLgorLy8gUmV0dXJuIDAgb24gc3VjY2VzcywgLWVycm5vIGNvZGUgb24gZmFpbHVyZS4KK2ludCBmaWxlRGF0YV9pbml0RnJvbU1lbW9yeShGaWxlRGF0YSogZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJMZW4pOworCisvLyBDb3B5IGEgRmlsZURhdGEgdmFsdWUgaW50byBhbm90aGVyIG9uZS4gVGhpcyBjb3BpZXMgdGhlIGNvbnRlbnRzIGluCisvLyB0aGUgaGVhcC4gT24gc3VjY2VzcyByZXR1cm4gMCwgb24gZmFpbHVyZSAtZXJybm8gY29kZS4KK2ludCBmaWxlRGF0YV9pbml0RnJvbShGaWxlRGF0YSogZmlsZURhdGEsIGNvbnN0IEZpbGVEYXRhKiBvdGhlcik7CisKKy8vIFN3YXAgdHdvIEZpbGVEYXRhIHZhbHVlcy4KK3ZvaWQgZmlsZURhdGFfc3dhcChGaWxlRGF0YSogZmlsZURhdGEsIEZpbGVEYXRhKiBvdGhlcik7CisKKy8vIEZpbmFsaXplIGEgRmlsZURhdGEgdmFsdWUuIFRoaXMgcmVsZWFzZXMgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5Lgordm9pZCBmaWxlRGF0YV9kb25lKEZpbGVEYXRhKiBmaWxlRGF0YSk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZV9kYXRhX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhhMDgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfZGF0YV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2RhdGEuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK2NsYXNzIFNjb3BlZEZpbGVEYXRhIHsKK3B1YmxpYzoKKyAgICBTY29wZWRGaWxlRGF0YSgpIDogbVN0YXR1cygwKSB7IGZpbGVEYXRhX2luaXRFbXB0eSgmbUZpbGVEYXRhKTsgfQorCisgICAgU2NvcGVkRmlsZURhdGEoY29uc3Qgdm9pZCogYnVmZiwgc2l6ZV90IGxlbmd0aCkgeworICAgICAgICBtU3RhdHVzID0gZmlsZURhdGFfaW5pdEZyb21NZW1vcnkoJm1GaWxlRGF0YSwgYnVmZiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBTY29wZWRGaWxlRGF0YShjb25zdCBTY29wZWRGaWxlRGF0YSYgb3RoZXIpIHsKKyAgICAgICAgbVN0YXR1cyA9IGZpbGVEYXRhX2luaXRGcm9tKCZtRmlsZURhdGEsIG90aGVyLnB0cigpKTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBTY29wZWRGaWxlRGF0YShjb25zdCBGaWxlRGF0YSogb3RoZXIpIHsKKyAgICAgICAgbVN0YXR1cyA9IGZpbGVEYXRhX2luaXRGcm9tKCZtRmlsZURhdGEsIG90aGVyKTsKKyAgICB9CisKKyAgICB+U2NvcGVkRmlsZURhdGEoKSB7IGZpbGVEYXRhX2RvbmUoJm1GaWxlRGF0YSk7IH0KKworICAgIGludCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisgICAgRmlsZURhdGEqIHB0cigpIHsgcmV0dXJuICZtRmlsZURhdGE7IH0KKyAgICBjb25zdCBGaWxlRGF0YSogcHRyKCkgY29uc3QgeyByZXR1cm4gJm1GaWxlRGF0YTsgfQorICAgIEZpbGVEYXRhJiBvcGVyYXRvciooKSB7IHJldHVybiBtRmlsZURhdGE7IH0KKyAgICBGaWxlRGF0YSogb3BlcmF0b3ItPigpIHsgcmV0dXJuICZtRmlsZURhdGE7IH0KK3ByaXZhdGU6CisgICAgRmlsZURhdGEgbUZpbGVEYXRhOworICAgIGludCBtU3RhdHVzOworfTsKKworVEVTVChGaWxlRGF0YSwgSXNWYWxpZCkgeworICAgIEVYUEVDVF9GQUxTRShmaWxlRGF0YV9pc1ZhbGlkKE5VTEwpKTsKKworICAgIEZpbGVEYXRhIGZha2VEYXRhID0geyAodWludDhfdCopMHgwMTIzNDU2NzgsIDEyMzQ1LCAyMzk4MyB9OworICAgIEVYUEVDVF9GQUxTRShmaWxlRGF0YV9pc1ZhbGlkKCZmYWtlRGF0YSkpOworfQorCitURVNUKEZpbGVEYXRhLCBJbml0aWFsaXplckNvbnN0YW50KSB7CisgICAgRmlsZURhdGEgZGF0YSA9IEZJTEVfREFUQV9JTklUOworICAgIEVYUEVDVF9UUlVFKGZpbGVEYXRhX2lzVmFsaWQoJmRhdGEpKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlRGF0YV9pc0VtcHR5KCZkYXRhKSk7Cit9CisKK1RFU1QoRmlsZURhdGEsIEluaXRpYWxpemVySXNGdWxsT2ZaZXJvZXMpIHsKKyAgICBGaWxlRGF0YSBkYXRhOworICAgIG1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mIGRhdGEpOworICAgIEVYUEVDVF9UUlVFKGZpbGVEYXRhX2lzRW1wdHkoJmRhdGEpKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlRGF0YV9pc1ZhbGlkKCZkYXRhKSk7Cit9CisKK1RFU1QoRmlsZURhdGEsIEVtcHR5SW5pdGlhbGl6ZXIpIHsKKyAgICBTY29wZWRGaWxlRGF0YSBkYXRhOworICAgIEVYUEVDVF9FUSgwLCBkYXRhLnN0YXR1cygpKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlRGF0YV9pc0VtcHR5KGRhdGEucHRyKCkpKTsKK30KKworVEVTVChGaWxlRGF0YSwgSW5pdEVtcHR5KSB7CisgICAgU2NvcGVkRmlsZURhdGEgZGF0YSgiIiwgMFUpOworICAgIEVYUEVDVF9FUSgwLCBkYXRhLnN0YXR1cygpKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlRGF0YV9pc0VtcHR5KGRhdGEucHRyKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGF0YS0+ZGF0YSk7CisgICAgRVhQRUNUX0VRKDBVLCBkYXRhLT5zaXplKTsKK30KKworVEVTVChGaWxlRGF0YSwgSW5pdEZyb21NZW1vcnkpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRGF0YVtdID0gIkhlbGxvIFdvcmxkISI7CisgICAgU2NvcGVkRmlsZURhdGEgZGF0YShrRGF0YSwgc2l6ZW9mIGtEYXRhKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGF0YS5zdGF0dXMoKSk7CisgICAgRVhQRUNUX05FKGtEYXRhLCAoY29uc3QgY2hhciopZGF0YS0+ZGF0YSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBzaXplb2Yga0RhdGE7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0sIGRhdGEtPmRhdGFbbl0pIDw8ICJpbmRleCAiIDw8IG47CisgICAgfQorfQorCitURVNUKEZpbGVEYXRhLCBJbml0RnJvbU90aGVyKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0RhdGFbXSA9ICJIZWxsbyBXb3JsZCEiOworICAgIFNjb3BlZEZpbGVEYXRhIGRhdGExKGtEYXRhLCBzaXplb2Yga0RhdGEpOworICAgIEVYUEVDVF9FUSgwLCBkYXRhMS5zdGF0dXMoKSk7CisKKyAgICBTY29wZWRGaWxlRGF0YSBkYXRhMihkYXRhMS5wdHIoKSk7CisgICAgRVhQRUNUX0VRKDAsIGRhdGEyLnN0YXR1cygpKTsKKworICAgIEVYUEVDVF9FUShkYXRhMS0+c2l6ZSwgZGF0YTItPnNpemUpOworICAgIEVYUEVDVF9ORShkYXRhMS0+ZGF0YSwgZGF0YTItPmRhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgZGF0YTEtPnNpemU7ICsrbikgeworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0sIGRhdGExLT5kYXRhW25dKSA8PCAiaW5kZXggIiA8PCBuOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0sIGRhdGEyLT5kYXRhW25dKSA8PCAiaW5kZXggIiA8PCBuOworICAgIH0KK30KKworVEVTVChGaWxlRGF0YSwgU3dhcCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtEYXRhW10gPSAiSGVsbG8gV29ybGQhIjsKKyAgICBTY29wZWRGaWxlRGF0YSBkYXRhMShrRGF0YSwgc2l6ZW9mIGtEYXRhKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGF0YTEuc3RhdHVzKCkpOworCisgICAgU2NvcGVkRmlsZURhdGEgZGF0YTI7CisgICAgRVhQRUNUX0VRKDAsIGRhdGEyLnN0YXR1cygpKTsKKyAgICBmaWxlRGF0YV9zd2FwKGRhdGExLnB0cigpLCBkYXRhMi5wdHIoKSk7CisKKyAgICBFWFBFQ1RfVFJVRShmaWxlRGF0YV9pc0VtcHR5KGRhdGExLnB0cigpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZpbGVEYXRhX2lzRW1wdHkoZGF0YTIucHRyKCkpKTsKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mIGtEYXRhLCBkYXRhMi0+c2l6ZSk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBkYXRhMi0+c2l6ZTsgKytuKSB7CisgICAgICAgIEVYUEVDVF9FUShrRGF0YVtuXSwgZGF0YTItPmRhdGFbbl0pIDw8ICJpbmRleCAiIDw8IG47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfaW8uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfaW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MzI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZV9pby5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlX2lvLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlVuaWNvZGVTdHJpbmcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2NvcGVkQ1B0cjsKKyNlbmRpZgorCisvLyBQcm92aWRlIGRpZmZlcmVudCBtYWNyb3MgZm9yIGRpZmZlcmVudCBudW1iZXIgb2Ygc3RyaW5nIGFyZ3VtZW50cyB3aGVyZSBlYWNoCisvLyBzdHJpbmcgYXJndW1lbnQgcmVxdWlyZXMgY29udmVyc2lvbgorI2lmZGVmIF9XSU4zMgorI2RlZmluZSBXSURFTl9DQUxMXzEoZnVuYywgc3RyMSwgLi4uKSBcCisgICAgICBfdyAjIyBmdW5jKFdpbjMyVW5pY29kZVN0cmluZyhzdHIxKS5jX3N0cigpICwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgV0lERU5fQ0FMTF8yKGZ1bmMsIHN0cjEsIHN0cjIsIC4uLikgXAorICAgICAgX3cgIyMgZnVuYyhXaW4zMlVuaWNvZGVTdHJpbmcoc3RyMSkuY19zdHIoKSwgXAorICAgICAgICAgICAgICAgICBXaW4zMlVuaWNvZGVTdHJpbmcoc3RyMikuY19zdHIoKSAsICMjX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBXSURFTl9DQUxMXzEoZnVuYywgc3RyMSwgLi4uKSBmdW5jKHN0cjEgLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBXSURFTl9DQUxMXzIoZnVuYywgc3RyMSwgc3RyMiwgLi4uKSBmdW5jKHN0cjEsIHN0cjIgLCAjI19fVkFfQVJHU19fKQorI2VuZGlmCisKK2V4dGVybiAiQyIgeworCitGSUxFKiBhbmRyb2lkX2ZvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgICByZXR1cm4gV0lERU5fQ0FMTF8yKGZvcGVuLCBwYXRoLCBtb2RlKTsKK30KKworRklMRSogYW5kcm9pZF9wb3Blbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBtb2RlKSB7CisgICAgcmV0dXJuIFdJREVOX0NBTExfMihwb3BlbiwgcGF0aCwgbW9kZSk7Cit9CisKK2ludCBhbmRyb2lkX29wZW5fd2l0aG91dF9tb2RlKGNvbnN0IGNoYXIqIHBhdGgsIGludCBmbGFncykgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEob3BlbiwgcGF0aCwgZmxhZ3MpOworfQorCitpbnQgYW5kcm9pZF9vcGVuX3dpdGhfbW9kZShjb25zdCBjaGFyKiBwYXRoLCBpbnQgZmxhZ3MsIG1vZGVfdCBtb2RlKSB7CisgICAgcmV0dXJuIFdJREVOX0NBTExfMShvcGVuLCBwYXRoLCBmbGFncywgbW9kZSk7Cit9CisKK2ludCBhbmRyb2lkX3N0YXQoY29uc3QgY2hhciogcGF0aCwgc3RydWN0IHN0YXQqIGJ1ZikgeworI2lmZGVmIF9XSU4zMgorICAgIC8vIE1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHN0YXQgY2FsbCB0aGF0IG1hdGNoZXMgdGhlIHR5cGUgb2Ygc3RhdCBzdHJ1Y3Qgd2UKKyAgICAvLyBhcmUgZ2V0dGluZy4gVGhlIGluY29taW5nIHN0cnVjdCBpcyBhICJzdHJ1Y3QgX3N0YXRpNjQiIGFuZCB0aGlzIGlzIHRoZQorICAgIC8vIG1hdGNoaW5nIGNhbGwgZm9yIHRoYXQgc3RydWN0LiBVbmZvcnR1bmF0ZWx5IHRoZSBtYWNybyBkb2Vzbid0IHRha2UgY2FyZQorICAgIC8vIG9mIHRoYXQuCisgICAgcmV0dXJuIF93c3RhdGk2NChXaW4zMlVuaWNvZGVTdHJpbmcocGF0aCkuY19zdHIoKSwgYnVmKTsKKyNlbHNlCisgICAgcmV0dXJuIHN0YXQocGF0aCwgYnVmKTsKKyNlbmRpZgorfQorCitpbnQgYW5kcm9pZF9sc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3Qgc3RhdCogYnVmKSB7CisjaWZkZWYgX1dJTjMyCisgICAgLy8gV2luZG93cyBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBhbiBsc3RhdCBmdW5jdGlvbiBzbyBqdXN0IHVzZSByZWd1bGFyIHN0YXQKKyAgICByZXR1cm4gYW5kcm9pZF9zdGF0KHBhdGgsIGJ1Zik7CisjZWxzZQorICAgIHJldHVybiBsc3RhdChwYXRoLCBidWYpOworI2VuZGlmCit9CisKK2ludCBhbmRyb2lkX2FjY2Vzcyhjb25zdCBjaGFyKiBwYXRoLCBpbnQgbW9kZSkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEoYWNjZXNzLCBwYXRoLCBtb2RlKTsKK30KKworI2lmZGVmIF9XSU4zMgorLy8gVGhlIFdpbmRvd3MgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIGEgbW9kZSBwYXJhbWV0ZXIgc28ganVzdCBkcm9wIHRoYXQgbmFtZSB0bworLy8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgdW51c2VkIHBhcmFtZXRlcnMKK2ludCBhbmRyb2lkX21rZGlyKGNvbnN0IGNoYXIqIHBhdGgsIG1vZGVfdCkgeworICAgIHJldHVybiBfd21rZGlyKFdpbjMyVW5pY29kZVN0cmluZyhwYXRoKS5jX3N0cigpKTsKK30KKyNlbHNlCitpbnQgYW5kcm9pZF9ta2Rpcihjb25zdCBjaGFyKiBwYXRoLCBtb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBta2RpcihwYXRoLCBtb2RlKTsKK30KKyNlbmRpZgorCitpbnQgYW5kcm9pZF9jcmVhdChjb25zdCBjaGFyKiBwYXRoLCBtb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEoY3JlYXQsIHBhdGgsIG1vZGUpOworfQorCitpbnQgYW5kcm9pZF91bmxpbmsoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEodW5saW5rLCBwYXRoKTsKK30KKworaW50IGFuZHJvaWRfY2htb2QoY29uc3QgY2hhciogcGF0aCwgbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gV0lERU5fQ0FMTF8xKGNobW9kLCBwYXRoLCBtb2RlKTsKK30KKworLy8gVGhlIGNvZGUgYmVsb3cgdXNlcyB0aGUgZmFjdCB0aGF0IEdDQyBzdXBwb3J0cyBzb21ldGhpbmcgY2FsbGVkIHdlYWsgbGlua2luZy4KKy8vIFNldmVyYWwgZnVuY3Rpb25zIGluIGdsaWJjIGFyZSB3ZWFrbHkgbGlua2VkIHdoaWNoIG1lYW5zIHRoYXQgaWYgdGhlIHNhbWUKKy8vIGZ1bmN0aW9uIG5hbWUgaXMgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uIGJpbmFyeSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgdXNlZAorLy8gaW5zdGVhZC4gT24gV2luZG93cyB3ZSB1c2UgdGhpcyB0byBjaGFuZ2UgdGhlc2UgY2FsbHMgdG8gY2FsbCB0aGUgd2NoYXJfdAorLy8gZXF1aXZhbGVudCBmdW5jdGlvbiB3aXRoIHRoZSBwYXJhbWV0ZXIgY29udmVydGVkIGZyb20gVVRGLTggdG8gVVRGLTE2LgorLy8KKy8vIFVuZm9ydHVuYXRlbHkgc3RhdCBpcyBub3Qgd2Vha2x5IGxpbmtlZCB3aGljaCBpcyB3aHkgaXQgaXMgbm90IGxpc3RlZCBoZXJlCisvLyBhbmQgYW55IGNvZGUgdGhhdCBjYWxscyBzdGF0IHNob3VsZCB1c2UgYW5kcm9pZF9zdGF0IGluc3RlYWQuCisjaWZkZWYgX1dJTjMyCisKKy8vIGdldGN3ZCBjYW5ub3QgdXNlIHRoZSBzYW1lIG1hY3JvIGFzIHRoZSBvdGhlciBjYWxscyBiZWNhdXNlIGl0IHBsYWNlcyBkYXRhCisvLyBpbiBvbmUgb2YgaXRzIHBhcmFtZXRlcnMgYW5kIGl0IHJldHVybnMgYSBjaGFyIHBvaW50ZXIsIG5vdCBhIHJlc3VsdCBjb2RlCitjaGFyKiBfX2NkZWNsIGdldGN3ZChjaGFyKiBidWZmZXIsIGludCBtYXhsZW4pIHsKKyAgICBTY29wZWRDUHRyPHdjaGFyX3Q+IHdpZGVDd2QoX3dnZXRjd2QobnVsbHB0ciwgMCkpOworICAgIGlmICh3aWRlQ3dkLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUaGlzIGlzIGEgdmFsaWQgdXNlIGNhc2UgYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGFuZCByZXR1cm4gaXQKKyAgICAgICAgYXV0byBuYXJyb3dDd2QgPSBXaW4zMlVuaWNvZGVTdHJpbmc6OmNvbnZlcnRUb1V0Zjgod2lkZUN3ZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBzdHJkdXAobmFycm93Q3dkLmNfc3RyKCkpOworICAgIH0KKworICAgIGludCB3cml0dGVuID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZUN3ZC5nZXQoKSk7CisgICAgaWYgKHdyaXR0ZW4gPCAwIHx8IHdyaXR0ZW4gPj0gbWF4bGVuKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyOworfQorCitpbnQgX19jZGVjbCByZW1vdmUoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEocmVtb3ZlLCBwYXRoKTsKK30KKworaW50IF9fY2RlY2wgcm1kaXIoY29uc3QgY2hhciogZGlybmFtZSkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEocm1kaXIsIGRpcm5hbWUpOworfQorCitpbnQgX19jZGVjbCBjaG1vZChjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IHBtb2RlKSB7CisgICAgcmV0dXJuIFdJREVOX0NBTExfMShjaG1vZCwgZmlsZW5hbWUsIHBtb2RlKTsKK30KKworaW50IF9fY2RlY2wgdW5saW5rKGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgICAgcmV0dXJuIFdJREVOX0NBTExfMSh1bmxpbmssIGZpbGVuYW1lKTsKK30KKworaW50IF9fY2RlY2wgbWtkaXIoY29uc3QgY2hhciogZGlybmFtZSkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEobWtkaXIsIGRpcm5hbWUpOworfQorCitpbnQgX19jZGVjbCBjcmVhdChjb25zdCBjaGFyKiBwYXRoLCBpbnQgbW9kZSkgeworICAgIHJldHVybiBXSURFTl9DQUxMXzEoY3JlYXQsIHBhdGgsIG1vZGUpOworfQorCitpbnQgX19jZGVjbCBhY2Nlc3MoY29uc3QgY2hhciogcGF0aCwgaW50IG1vZGUpIHsKKyAgICByZXR1cm4gV0lERU5fQ0FMTF8xKGFjY2VzcywgcGF0aCwgbW9kZSk7Cit9CisKK2ludCBfX2NkZWNsIG9wZW4oY29uc3QgY2hhciogcGF0aG5hbWUsIGludCBmbGFncywgLi4uKSB7CisgICAgdmFfbGlzdCBhcDsKKworICAgIC8vIFNpbmNlIG9wZW4gY29tZXMgaW4gdHdvIHZlcnNpb25zIGFuZCBDIGRvZXMgbm90IHN1cHBvcnQgZnVuY3Rpb24KKyAgICAvLyBvdmVybG9hZGluZyB3ZSB1c2UgdmFyYXJncyBmb3IgdGhlIG1vZGUgcGFyYW1ldGVycyBpbnN0ZWFkLgorICAgIHZhX3N0YXJ0KGFwLCBmbGFncyk7CisgICAgaW50IHJlc3VsdCA9IFdJREVOX0NBTExfMShvcGVuLCBwYXRobmFtZSwgZmxhZ3MsIHZhX2FyZyhhcCwgaW50KSk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitGSUxFKiBfX2NkZWNsIGZvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpIHsKKyAgICByZXR1cm4gV0lERU5fQ0FMTF8yKGZvcGVuLCBwYXRoLCBtb2RlKTsKK30KKworI2VuZGlmICAvLyBfV0lOMzIKKworfSAgLy8gZXh0ZXJuICJDIgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZV9pby5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDRkODgzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKK0ZJTEUqIGFuZHJvaWRfZm9wZW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogbW9kZSk7CitGSUxFKiBhbmRyb2lkX3BvcGVuKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG1vZGUpOworCisvLyBUaGlzIHRoaW5nIHVzZXMgbWFjcm8gdmFyYXJncyB0byBzZWxlY3Qgd2hpY2ggb3BlbiBmdW5jdGlvbiB0byB1c2UuCisvLyBCZWNhdXNlIF9fVkFfQVJHU19fIGNvbnN1bWVzIGEgZGlmZmVyZW50IGFtb3VudCBvZiBhcmd1bWVudHMgdGhlIGNhbGxfbmFtZQorLy8gd2lsbCBoYXZlIGEgZGlmZmVyZW50IG5hbWUgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkCisjZGVmaW5lIERFVEVSTUlORV9PUEVOX0NBTEwoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGNhbGxfbmFtZSwgLi4uKSBjYWxsX25hbWUKKyNkZWZpbmUgYW5kcm9pZF9vcGVuKC4uLikgREVURVJNSU5FX09QRU5fQ0FMTChfX1ZBX0FSR1NfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfb3Blbl93aXRoX21vZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX29wZW5fd2l0aG91dF9tb2RlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfX1ZBX0FSR1NfXykKKworLy8gV0FSTklORzogRG8gbm90IHVzZSB0aGVzZSwganVzdCB1c2UgdGhlIGFuZHJvaWRfb3BlbiBtYWNybyBhYm92ZSB0aGUgd2F5CisvLyB5b3Ugd291bGQgdXNlIG9wZW4uIFRoZSB2ZXJzaW9uIHRvIHVzZSBnZXRzIHBpY2tlZCBhdXRvbWF0aWNhbGx5CitpbnQgYW5kcm9pZF9vcGVuX3dpdGhvdXRfbW9kZShjb25zdCBjaGFyKiBwYXRoLCBpbnQgZmxhZ3MpOworaW50IGFuZHJvaWRfb3Blbl93aXRoX21vZGUoY29uc3QgY2hhciogcGF0aCwgaW50IGZsYWdzLCBtb2RlX3QgbW9kZSk7CisKK2ludCBhbmRyb2lkX3N0YXQoY29uc3QgY2hhciogcGF0aCwgc3RydWN0IHN0YXQqIGJ1Zik7CitpbnQgYW5kcm9pZF9sc3RhdChjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3Qgc3RhdCogYnVmKTsKKworaW50IGFuZHJvaWRfYWNjZXNzKGNvbnN0IGNoYXIqIHBhdGgsIGludCBtb2RlKTsKK2ludCBhbmRyb2lkX21rZGlyKGNvbnN0IGNoYXIqIHBhdGgsIG1vZGVfdCBtb2RlKTsKKworaW50IGFuZHJvaWRfY3JlYXQoY29uc3QgY2hhciogcGF0aCwgbW9kZV90IG1vZGUpOworCitpbnQgYW5kcm9pZF91bmxpbmsoY29uc3QgY2hhciogcGF0aCk7CitpbnQgYW5kcm9pZF9jaG1vZChjb25zdCBjaGFyKiBwYXRoLCBtb2RlX3QgbW9kZSk7CisKK0FORFJPSURfRU5EX0hFQURFUgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZWxvY2suY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVsb2NrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMxZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVsb2NrLmNwcApAQCAtMCwwICsxLDQ3MyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlbG9jay5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjICBpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorIyAgaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgICAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGVuZGlmCisjICBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgIGluY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworLy8gU2V0IHRvIDEgdG8gZW5hYmxlIGRlYnVnIHRyYWNlcyBoZXJlLgorI2lmIDAKKyNkZWZpbmUgIEQoLi4uKSAgcHJpbnRmKF9fVkFfQVJHU19fKSwgcHJpbnRmKCJcbiIpLCBmZmx1c2goc3Rkb3V0KQorI2Vsc2UKKyNkZWZpbmUgRCguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qKiBGSUxFIExPQ0tTIFNVUFBPUlQKKyAqKgorICoqIEEgRmlsZUxvY2sgaXMgdXNlZnVsIHRvIHByZXZlbnQgc2V2ZXJhbCBlbXVsYXRvciBpbnN0YW5jZXMgZnJvbSB1c2luZworICoqIHRoZSBzYW1lIHdyaXRhYmxlIGZpbGUgKGUuZy4gdGhlIHVzZXJkYXRhLmltZyBkaXNrIGltYWdlcykuCisgKioKKyAqKiBDcmVhdGUgYSBGaWxlTG9jayBvYmplY3Qgd2l0aCBmaWxlbG9ja19jcmVhdGUoKSwgdGhpcyBmdW5jdGlvbiBzaG91bGQKKyAqKiByZXR1cm4gTlVMTCBvbmx5IGlmIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgcGF0aCBjb3VsZCBub3QgYmUgbG9ja2VkLgorICoqCisgKiogQWxsIGZpbGUgbG9ja3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgYW5kIGRlc3Ryb3llZCB3aGVuIHRoZSBwcm9ncmFtCisgKiogZXhpdHMuIFRoZSBmaWxlbG9ja19sb2NrKCkgZnVuY3Rpb24gY2FuIGFsc28gZGV0ZWN0IHN0YWxlIGZpbGUgbG9ja3MKKyAqKiB0aGF0IGNhbiBsaW5nZXIgd2hlbiB0aGUgZW11bGF0b3IgY3Jhc2hlcyB1bmV4cGVjdGVkbHksIGFuZCB3aWxsIGhhcHBpbHkKKyAqKiBjbGVhbiB0aGVtIGZvciB5b3UKKyAqKgorICoqIEhlcmUncyBob3cgaXQgd29ya3MsIHRocmVlIGZpbGVzIGFyZSB1c2VkOgorICoqICAgICBmaWxlICAtIHRoZSBkYXRhIGZpbGUgYWNjZXNzZWQgYnkgdGhlIGVtdWxhdG9yCisgKiogICAgIGxvY2sgIC0gYSBsb2NrIGZpbGUgIChmaWxlICsgJy5sb2NrJykKKyAqKiAgICAgdGVtcCAgLSBhIHRlbXBvcmFyeSBmaWxlIG1hZGUgdW5pcXVlIHdpdGggbWtzdGVtcAorICoqCisgKiogV2hlbiBsb2NraW5nOgorICoqICAgICAgY3JlYXRlICd0ZW1wJyBhbmQgc3RvcmUgb3VyIHBpZCBpbiBpdAorICoqICAgICAgYXR0ZW1wIHRvIGxpbmsgJ2xvY2snIHRvICd0ZW1wJworICoqICAgICAgICAgaWYgdGhlIGxpbmsgc3VjY2VlZHMsIHdlIG9idGFpbiB0aGUgbG9jaworICoqICAgICAgdW5saW5rICd0ZW1wJworICoqCisgKiogV2hlbiB1bmxvY2tpbmc6CisgKiogICAgICB1bmxpbmsgJ2xvY2snCisgKioKKyAqKi8KKworCisvKiBUaHJlYWQgc2FmZXR5OgorICogICAgIF9hbGxfZmlsZWxvY2tzX3RsOiBIb2xkIHRoaXMgd2hlbiBhY2Nlc3NpbmcgfF9hbGxfZmlsZWxvY2tzfC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBsb2NrZWQgYXQgZXhpdCwgc28gaG9sZCB0aGlzIGZvciB2ZXJ5LCAqdmVyeSoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQuCisgKi8KK3N0YXRpYyBDTG9jayogX2FsbF9maWxlbG9ja3NfdGw7CisvKiBUaGlzIGlzIHNldCB0byB0cnVlIGR1cmluZyBleGl0LgorICogQWxsIGFjY2Vzc2VzIG9mIF9hbGxfZmlsZWxvY2tzIHNob3VsZCBzdHJpY3RseSBmb2xsb3cgdGhpcyBzY2hlbWU6CisgKiAgIGFuZHJvaWRfbG9ja19hY3F1aXJlKF9hbGxfZmlsZWxvY2tzX3RsKTsKKyAqICAgaWYgKCFfaXNfZXhpdGluZykgeworICogICAgIC8vIFNhZmUgdG8gYWNjZXNzIF9hbGxfZmlsZWxvY2tzIG5vdy4KKyAqICAgfQorICogICBhbmRyb2lkX2xvY2tfcmVsZWFzZShfYWxsX2ZpbGVsb2Nrc190bCk7CisgKi8KK3N0YXRpYyBib29sIF9pc19leGl0aW5nID0gZmFsc2U7CisKK3N0cnVjdCBGaWxlTG9jaworeworICBjb25zdCBjaGFyKiAgZmlsZTsKKyAgY29uc3QgY2hhciogIGxvY2s7CisgIGNoYXIqICAgICAgICB0ZW1wOworI2lmZGVmIF9XSU4zMgorICBIQU5ETEUgICAgICAgbG9ja19oYW5kbGU7CisjZW5kaWYKKyAgaW50ICAgICAgICAgIGxvY2tlZDsKKyAgRmlsZUxvY2sqICAgIG5leHQ7Cit9OworCisvKiB1c2VkIHRvIGNsZWFudXAgYWxsIGxvY2tzIGF0IGVtdWxhdG9yIGV4aXQgKi8KK3N0YXRpYyBGaWxlTG9jayogICBfYWxsX2ZpbGVsb2NrczsKKworI2RlZmluZSAgTE9DS19OQU1FICAgIi5sb2NrIgorI2RlZmluZSAgVEVNUF9OQU1FICAgIi50bXAtWFhYWFhYIgorI2RlZmluZSAgV0lOX1BJREZJTEVfTkFNRSAgInBpZCIKKwordm9pZAorZmlsZWxvY2tfaW5pdCgpIHsKKyAgICBfYWxsX2ZpbGVsb2Nrc190bCA9IGFuZHJvaWRfbG9ja19uZXcoKTsKK30KKworI2lmZGVmIF9XSU4zMgordGVtcGxhdGUgPGNsYXNzIEZ1bmM+CitzdGF0aWMgYm9vbCByZXRyeShGdW5jIGZ1bmMsIGludCB0cmllcyA9IDQsIGludCB0aW1lb3V0TXMgPSAxMDApIHsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChmdW5jKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICgtLXRyaWVzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW06OmdldCgpLT5zbGVlcE1zKHRpbWVvdXRNcyk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBkZWxldGVfZmlsZShjb25zdCBhbmRyb2lkOjpiYXNlOjpXaW4zMlVuaWNvZGVTdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gcmV0cnkoWyZuYW1lXSgpIHsKKyAgICAgICAgcmV0dXJuIDo6RGVsZXRlRmlsZVcobmFtZS5jX3N0cigpKSAhPSAwIHx8CisgICAgICAgICAgICAgICA6OkdldExhc3RFcnJvcigpID09IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOworICAgIH0pOworfQorCitzdGF0aWMgYm9vbCBkZWxldGVfZGlyKGNvbnN0IGFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiByZXRyeShbJm5hbWVdKCkgeworICAgICAgICByZXR1cm4gOjpSZW1vdmVEaXJlY3RvcnlXKG5hbWUuY19zdHIoKSkgIT0gMCB8fAorICAgICAgICAgICAgICAgOjpHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9GSUxFX05PVF9GT1VORDsKKyAgICB9KTsKK30KKworLyogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKi8KK3N0YXRpYyBpbnQgZmlsZWxvY2tfbG9jayhGaWxlTG9jayogbG9jaykgeworICAgIGxvY2stPmxvY2tfaGFuZGxlID0gbnVsbHB0cjsKKyAgICBjb25zdCBhdXRvIHVuaWNvZGVEaXIgPSBhbmRyb2lkOjpiYXNlOjpXaW4zMlVuaWNvZGVTdHJpbmcobG9jay0+bG9jayk7CisgICAgY29uc3QgYXV0byB1bmljb2RlTmFtZSA9IGFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZyhsb2NrLT50ZW1wKTsKKworICAgIEhBTkRMRSBsb2NrSGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgY29uc3QgYm9vbCBjcmVhdGVGaWxlUmVzdWx0ID0gcmV0cnkoCisgICAgICAgIFsmbG9ja0hhbmRsZSwgJnVuaWNvZGVEaXIsICZ1bmljb2RlTmFtZV0oKSB7CisgICAgICAgICAgICBpZiAoITo6Q3JlYXRlRGlyZWN0b3J5Vyh1bmljb2RlRGlyLmNfc3RyKCksIG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgOjpHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9BTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT3Blbi9jcmVhdGUgYSBsb2NrIGZpbGUgd2l0aCBhIGZsYWdzIGNvbWJpbmF0aW9uIGxpa2U6CisgICAgICAgICAgICAvLyAgLSBvcGVuIGZvciB3cml0aW5nIG9ubHkKKyAgICAgICAgICAgIC8vICAtIGFsbG93IG9ubHkgb25lIHByb2Nlc3MgdG8gb3BlbiBmaWxlIGZvciB3cml0aW5nIChvdXIgcHJvY2VzcykKKyAgICAgICAgICAgIC8vIFRvZ2V0aGVyLCB0aGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgZmlsZSBjYW4gb25seSBiZSBvcGVuZWQgd2hlbgorICAgICAgICAgICAgLy8gb3VyIHByb2Nlc3MgaXMgYWxpdmUgYW5kIGtlZXBzIGEgaGFuZGxlIHRvIGl0LgorICAgICAgICAgICAgLy8gQXMgc29vbiBhcyBvdXIgcHJvY2VzcyBlbmRzIG9yIHdlIGNsb3NlL2RlbGV0ZSBpdCAtIG90aGVyIGxvY2sKKyAgICAgICAgICAgIC8vIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgICAgIC8vIE5vdGU6IEZJTEVfRkxBR19ERUxFVEVfT05fQ0xPU0UgZG9lc24ndCB3b3JrIHdlbGwgaGVyZSwgYXMKKyAgICAgICAgICAgIC8vICBldmVyeW9uZSBlbHNlIHdvdWxkIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSBpbiBGSUxFX1NIQVJFX0RFTEVURQorICAgICAgICAgICAgLy8gIG1vZGUsIGFuZCBib3RoIEFuZHJvaWQgU3R1ZGlvIGFuZCBjbWQuZXhlIGRvbid0IHVzZSBpdC4gRml4CisgICAgICAgICAgICAvLyAgYXQgbGVhc3QgdGhlIEFuZHJvaWQgU3R1ZGlvIHBhcnQgYmVmb3JlIHRyeWluZyB0byBhZGQgdGhpcyBmbGFnCisgICAgICAgICAgICAvLyAgaW5zdGVhZCBvZiB0aGUgbWFudWFsIGRlbGV0aW9uIGNvZGUuCisgICAgICAgICAgICBsb2NrSGFuZGxlID0gOjpDcmVhdGVGaWxlVygKKyAgICAgICAgICAgICAgICAgICAgdW5pY29kZU5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSwgICAgLy8gb3BlbiBvbmx5IGZvciB3cml0aW5nCisgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwgIC8vIGFsbG93IG90aGVycyB0byByZWFkIHRoZSBmaWxlLCBidXQgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdyaXRlIHRvIGl0IG9yIG5vdCB0byBkZWxldGUgaXQKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgICAgICAgICAgLy8gbm8gc3BlY2lhbCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgIENSRUFURV9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX1RFTVBPUkFSWSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7ICAvLyBubyB0ZW1wbGF0ZSBmaWxlCisgICAgICAgICAgICByZXR1cm4gbG9ja0hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgfSwKKyAgICAgICAgNSwgICAgICAvLyB0cmllcworICAgICAgICAyMDApOyAgIC8vIHNsZWVwIHRpbWVvdXQgYmV0d2VlbiB0cmllcworCisgICAgaWYgKCFjcmVhdGVGaWxlUmVzdWx0KSB7CisgICAgICAgIGFzc2VydChsb2NrSGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzc2VydChsb2NrSGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBraWxsIHRoZSBmaWxlL2RpcmVjdG9yeSBvbiBhbnkgZmFpbHVyZS4KKyAgICBhdXRvIGZpbGVEZWxldGVyID0gYW5kcm9pZDo6YmFzZTo6bWFrZUN1c3RvbVNjb3BlZFB0cigKKyAgICAgICAgICAgIGxvY2tIYW5kbGUsIFsmdW5pY29kZU5hbWUsICZ1bmljb2RlRGlyXShIQU5ETEUgaCkgeworICAgICAgICAgICAgICAgIDo6Q2xvc2VIYW5kbGUoaCk7CisgICAgICAgICAgICAgICAgZGVsZXRlX2ZpbGUodW5pY29kZU5hbWUpOworICAgICAgICAgICAgICAgIGRlbGV0ZV9kaXIodW5pY29kZURpcik7CisgICAgICAgICAgICB9KTsKKworICAgIC8vIFdlJ3JlIGdvb2QuIE5vdyB3cml0ZSBkb3duIHRoZSBwcm9jZXNzIElEIGFzIEFuZHJvaWQgU3R1ZGlvIHJlbGllcyBvbiBpdC4KKyAgICBjb25zdCBEV09SRCBwaWQgPSA6OkdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKyAgICBjaGFyIHBpZEJ1ZlsxMl07CisgICAgY29uc3QgaW50IGxlbiA9IHNucHJpbnRmKHBpZEJ1Ziwgc2l6ZW9mKHBpZEJ1ZiksICIlbHUiLCBwaWQpOworICAgIGFzc2VydChsZW4gPiAwICYmIGxlbiA8IChpbnQpc2l6ZW9mKHBpZEJ1ZikpOworICAgIERXT1JEIGJ5dGVzV3JpdHRlbjsKKyAgICBpZiAoITo6V3JpdGVGaWxlKGxvY2tIYW5kbGUsIHBpZEJ1Ziwgc3RhdGljX2Nhc3Q8RFdPUkQ+KGxlbiksICZieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSB8fAorICAgICAgICBieXRlc1dyaXR0ZW4gIT0gc3RhdGljX2Nhc3Q8RFdPUkQ+KGxlbikpIHsKKyAgICAgICAgRCgiRmFpbGVkIHRvIHdyaXRlIHRoZSBjdXJyZW50IFBJRCBpbnRvIHRoZSBsb2NrIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBsb2NrLT5sb2NrZWQgPSAxOworICAgIGxvY2stPmxvY2tfaGFuZGxlID0gZmlsZURlbGV0ZXIucmVsZWFzZSgpOworICAgIHJldHVybiAwOyAgLy8gd2UncmUgYWxsIGdvb2QKK30KKyNlbHNlCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworc3RhdGljIGludCBmaWxlbG9ja19sb2NrKEZpbGVMb2NrKiBsb2NrKSB7CisgICAgaW50ICAgIHJldDsKKyAgICBpbnQgICAgdGVtcF9mZCA9IC0xOworICAgIGludCAgICBsb2NrX2ZkID0gLTE7CisgICAgaW50ICAgIHJjLCB0cmllczsKKyAgICBGSUxFKiAgZiA9IE5VTEw7CisgICAgY2hhciAgIHBpZFs4XTsKKyAgICBzdHJ1Y3Qgc3RhdCAgc3RfdGVtcDsKKyAgICBpbnQgc2xlZXBfZHVyYXRpb25fbXMgPSAwOworCisgICAgdGVtcF9mZCA9IG1rc3RlbXAobG9jay0+dGVtcCk7CisKKyAgICBpZiAodGVtcF9mZCA8IDApIHsKKyAgICAgICAgRCgiQ2Fubm90IGNyZWF0ZSBsb2NraW5nIHRlbXAgZmlsZSAnJXMnIiwgbG9jay0+dGVtcCk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICBzbnByaW50ZihwaWQsIHNpemVvZiBwaWQsICIlZCIsIGdldHBpZCgpKTsKKyAgICByZXQgPSBIQU5ETEVfRUlOVFIod3JpdGUodGVtcF9mZCwgcGlkLCBzdHJsZW4ocGlkKSArIDEpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBEKCJDYW5ub3Qgd3JpdGUgdG8gbG9ja2luZyB0ZW1wIGZpbGUgJyVzJyIsIGxvY2stPnRlbXApOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIGNsb3NlKHRlbXBfZmQpOworICAgIHRlbXBfZmQgPSAtMTsKKworICAgIHJjID0gSEFORExFX0VJTlRSKGxzdGF0KGxvY2stPnRlbXAsICZzdF90ZW1wKSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBEKCJDYW4ndCBwcm9wZXJseSBzdGF0IG91ciBsb2NraW5nIHRlbXAgZmlsZSAnJXMnIiwgbG9jay0+dGVtcCk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICAvKiBub3cgYXR0ZW1wdCB0byBsaW5rIHRoZSB0ZW1wIGZpbGUgdG8gdGhlIGxvY2sgZmlsZSAqLworICAgIGZvciAodHJpZXMgPSA0OyB0cmllcyA+IDA7IHRyaWVzLS0pCisgICAgeworICAgICAgICBjb25zdCBpbnQga1NsZWVwRHVyYXRpb25Nc01heCA9IDIwMDA7ICAvLyAyIHNlY29uZHMuCisgICAgICAgIGNvbnN0IGludCBrU2xlZXBEdXJhdGlvbk1zSW5jcmVtZW50ID0gNTA7CisKKyAgICAgICAgaWYgKHNsZWVwX2R1cmF0aW9uX21zID4gMCkgeworICAgICAgICAgICAgaWYgKHNsZWVwX2R1cmF0aW9uX21zID4ga1NsZWVwRHVyYXRpb25Nc01heCkgeworICAgICAgICAgICAgICAgIEQoIkNhbm5vdCBhY3F1aXJlIGxvY2sgZmlsZSAnJXMnIiwgbG9jay0+bG9jayk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3lzdGVtOjpnZXQoKS0+c2xlZXBNcyhzbGVlcF9kdXJhdGlvbl9tcyk7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXBfZHVyYXRpb25fbXMgKz0ga1NsZWVwRHVyYXRpb25Nc0luY3JlbWVudDsKKworICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIG9mIGxpbmsoKSBpcyBidWdneSBvbiBORlMsIHNvIGlnbm9yZSBpdC4KKyAgICAgICAgLy8gYW5kIHVzZSBsc3RhdCgpIHRvIGxvb2sgYXQgdGhlIHJlc3VsdC4KKyAgICAgICAgcmMgPSBIQU5ETEVfRUlOVFIobGluayhsb2NrLT50ZW1wLCBsb2NrLT5sb2NrKSk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgc3RfbG9jazsKKyAgICAgICAgcmMgPSBIQU5ETEVfRUlOVFIobHN0YXQobG9jay0+bG9jaywgJnN0X2xvY2spKTsKKyAgICAgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgICAgIC8vIFRyeSBhZ2FpbiBhZnRlciBzbGVlcGluZyBhIGxpdHRsZS4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0X3RlbXAuc3RfcmRldiA9PSBzdF9sb2NrLnN0X3JkZXYgJiYKKyAgICAgICAgICAgIHN0X3RlbXAuc3RfaW5vICA9PSBzdF9sb2NrLnN0X2lubyAgKSB7CisgICAgICAgICAgICAvKiBUaGUgbGluaygpIG9wZXJhdGlvbiBzdWNlZWRlZCAqLworICAgICAgICAgICAgbG9jay0+bG9ja2VkID0gMTsKKyAgICAgICAgICAgIHJjID0gSEFORExFX0VJTlRSKHVubGluayhsb2NrLT50ZW1wKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChTX0lTRElSKHN0X2xvY2suc3RfbW9kZSkpIHsKKyAgICAgICAgICAgIGNoYXIgKndpbl9waWQ7CisgICAgICAgICAgICBpbnQgd2luX3BpZF9sZW47CisgICAgICAgICAgICAvLyBUaGUgLmxvY2sgZmlsZSBpcyBhIGRpcmVjdG9yeS4gVGhpcyBjYW4gb25seSBoYXBwZW4KKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIEFWRCB3YXMgcHJldmlvdXNseSB1c2VkIGJ5IGEgV2luMzIgZW11bGF0b3IKKyAgICAgICAgICAgIC8vIGluc3RhbmNlIHJ1bm5pbmcgdW5kZXIgV2luZSBvbiB0aGUgc2FtZSBtYWNoaW5lLgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJTdGFsZSBXaW4zMiBsb2NrIGZpbGUgZGV0ZWN0ZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBsb2NrLT5sb2NrKTsKKworICAgICAgICAgICAgLyogVHJ5IGRlbGV0aW5nIHRoZSBwaWQgZmlsZSBkcm9wcGVkIGluIHdpbmRvd3MuCisgICAgICAgICAgICAgKiBJZ25vcmUgZXJyb3IgLS0gdHJ5IGJsb3dpbmcgYXdheSB0aGUgZGlyZWN0b3J5IGFueXdheS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2luX3BpZF9sZW4gPSBzdHJsZW4obG9jay0+bG9jaykgKyAxICsgc2l6ZW9mKFdJTl9QSURGSUxFX05BTUUpOworICAgICAgICAgICAgd2luX3BpZCA9IChjaGFyICopIG1hbGxvYyh3aW5fcGlkX2xlbik7CisgICAgICAgICAgICBzbnByaW50Zih3aW5fcGlkLCB3aW5fcGlkX2xlbiwgIiVzLyIgV0lOX1BJREZJTEVfTkFNRSwgbG9jay0+bG9jayk7CisgICAgICAgICAgICBIQU5ETEVfRUlOVFIodW5saW5rKHdpbl9waWQpKTsKKyAgICAgICAgICAgIGZyZWUod2luX3BpZCk7CisKKyAgICAgICAgICAgIHJjID0gSEFORExFX0VJTlRSKHJtZGlyKGxvY2stPmxvY2spKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgRCgiUmVtb3Zpbmcgc3RhbGUgV2luMzIgbG9ja2ZpbGUgJyVzJyBmYWlsZWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICBsb2NrLT5sb2NrLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBpZiB3ZSBnZXQgdGhlcmUsIGl0IG1lYW5zIHRoYXQgdGhlIGxpbmsoKSBjYWxsIGZhaWxlZCAqLworICAgICAgICAvKiBjaGVjayB0aGUgbG9ja2ZpbGUgdG8gc2VlIGlmIGl0IGlzIHN0YWxlICAgICAgICAgICAgICAqLworICAgICAgICB0eXBlZGVmIGVudW0geworICAgICAgICAgICAgRlJFU0hORVNTX1VOS05PV04gPSAwLAorICAgICAgICAgICAgRlJFU0hORVNTX0ZSRVNILAorICAgICAgICAgICAgRlJFU0hORVNTX1NUQUxFLAorICAgICAgICB9IEZyZXNobmVzczsKKworICAgICAgICBGcmVzaG5lc3MgZnJlc2huZXNzID0gRlJFU0hORVNTX1VOS05PV047CisKKyAgICAgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgICAgIHRpbWVfdCBub3c7CisgICAgICAgIHJjID0gSEFORExFX0VJTlRSKHRpbWUoJm5vdykpOworICAgICAgICBzdC5zdF9tdGltZSA9IG5vdyAtIDEyMDsKKworICAgICAgICBpbnQgbG9ja3BpZCA9IDA7CisgICAgICAgIGludCBsb2NrZmQgPSBIQU5ETEVfRUlOVFIob3Blbihsb2NrLT5sb2NrLE9fUkRPTkxZKSk7CisgICAgICAgIGlmIChsb2NrZmQgPj0gMCkgeworICAgICAgICAgICAgY2hhciBidWZbMTZdOworICAgICAgICAgICAgaW50IGxlbiA9IEhBTkRMRV9FSU5UUihyZWFkKGxvY2tmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDFVKSk7CisgICAgICAgICAgICBpZiAobGVuIDwgMCkgeworICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZbbGVuXSA9IDA7CisgICAgICAgICAgICBsb2NrcGlkID0gYXRvaShidWYpOworCisgICAgICAgICAgICByYyA9IEhBTkRMRV9FSU5UUihmc3RhdChsb2NrZmQsICZzdCkpOworICAgICAgICAgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBub3cgPSBzdC5zdF9hdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElHTk9SRV9FSU5UUihjbG9zZShsb2NrZmQpKTsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB0aGVyZSBpcyBhIFBJRCwgY2hlY2sgdGhhdCBpdCBpcyBzdGlsbCBhbGl2ZSAqLworICAgICAgICBpZiAobG9ja3BpZCA+IDApIHsKKyAgICAgICAgICAgIHJjID0gSEFORExFX0VJTlRSKGtpbGwobG9ja3BpZCwgMCkpOworICAgICAgICAgICAgaWYgKHJjID09IDAgfHwgZXJybm8gPT0gRVBFUk0pIHsKKyAgICAgICAgICAgICAgICBmcmVzaG5lc3MgPSBGUkVTSE5FU1NfRlJFU0g7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJjIDwgMCAmJiBlcnJubyA9PSBFU1JDSCkgeworICAgICAgICAgICAgICAgIGZyZXNobmVzcyA9IEZSRVNITkVTU19TVEFMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZnJlc2huZXNzID09IEZSRVNITkVTU19VTktOT1dOKSB7CisgICAgICAgICAgICAvKiBubyBwaWQsIHN0YWxlIGlmIHRoZSBmaWxlIGlzIG9sZGVyIHRoYW4gMSBtaW51dGUgKi8KKyAgICAgICAgICAgIGZyZXNobmVzcyA9IChub3cgPj0gc3Quc3RfbXRpbWUgKyA2MCkgPworICAgICAgICAgICAgICAgICAgICBGUkVTSE5FU1NfU1RBTEUgOgorICAgICAgICAgICAgICAgICAgICBGUkVTSE5FU1NfRlJFU0g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJlc2huZXNzID09IEZSRVNITkVTU19TVEFMRSkgeworICAgICAgICAgICAgRCgiUmVtb3Zpbmcgc3RhbGUgbG9ja2ZpbGUgJyVzJyIsIGxvY2stPmxvY2spOworICAgICAgICAgICAgcmMgPSBIQU5ETEVfRUlOVFIodW5saW5rKGxvY2stPmxvY2spKTsKKyAgICAgICAgICAgIHNsZWVwX2R1cmF0aW9uX21zID0gMDsKKyAgICAgICAgICAgIHRyaWVzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgRCgiZmlsZSAnJXMnIGlzIGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcHJvY2VzcyIsIGxvY2stPmZpbGUpOworCitGYWlsOgorICAgIGlmIChmKSB7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisKKyAgICBpZiAodGVtcF9mZCA+PSAwKSB7CisgICAgICAgIElHTk9SRV9FSU5UUihjbG9zZSh0ZW1wX2ZkKSk7CisgICAgfQorCisgICAgaWYgKGxvY2tfZmQgPj0gMCkgeworICAgICAgICBJR05PUkVfRUlOVFIoY2xvc2UobG9ja19mZCkpOworICAgIH0KKworICAgIEhBTkRMRV9FSU5UUih1bmxpbmsobG9jay0+dGVtcCkpOworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZgorCit2b2lkCitmaWxlbG9ja19yZWxlYXNlKCBGaWxlTG9jayogIGxvY2sgKQoreworICAgIGlmIChsb2NrLT5sb2NrZWQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgOjpDbG9zZUhhbmRsZShsb2NrLT5sb2NrX2hhbmRsZSk7CisgICAgICAgIGxvY2stPmxvY2tfaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgZGVsZXRlX2ZpbGUoYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nKGxvY2stPnRlbXApKTsKKyAgICAgICAgZGVsZXRlX2RpcihhbmRyb2lkOjpiYXNlOjpXaW4zMlVuaWNvZGVTdHJpbmcobG9jay0+bG9jaykpOworI2Vsc2UKKyAgICAgICAgdW5saW5rKCAoY2hhciopbG9jay0+bG9jayApOworI2VuZGlmCisgICAgICAgIGxvY2stPmxvY2tlZCA9IDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZmlsZWxvY2tfYXRleGl0KCB2b2lkICkKK3sKKyAgRmlsZUxvY2sqICBsb2NrOworCisgIGFuZHJvaWRfbG9ja19hY3F1aXJlKF9hbGxfZmlsZWxvY2tzX3RsKTsKKyAgaWYgKCFfaXNfZXhpdGluZykgeworICAgIGZvciAobG9jayA9IF9hbGxfZmlsZWxvY2tzOyBsb2NrICE9IE5VTEw7IGxvY2sgPSBsb2NrLT5uZXh0KSB7CisgICAgICAgIGZpbGVsb2NrX3JlbGVhc2UoIGxvY2sgKTsKKyAgICB9CisgIH0KKyAgX2lzX2V4aXRpbmcgPSB0cnVlOworICBhbmRyb2lkX2xvY2tfcmVsZWFzZShfYWxsX2ZpbGVsb2Nrc190bCk7CisgIC8vIFdlIGxlYWsgfF9hbGxfZmlsZWxvY2tzX3RsfCBoZXJlLiBXZSBjYW4gbmV2ZXIgZ3VhcmFudGVlIHRoYXQgYW5vdGhlcgorICAvLyB0aHJlYWQgaXNuJ3QgdHJ5aW5nIHRvIHVzZSBmaWxlbG9jayBjb25jdXJyZW50bHksIHNvIHdlIGNhbiBub3Qgc2FmZWx5CisgIC8vIGNsZWFuIHVwIHRoZSBtdXRleC4gU2VlIGIuYW5kcm9pZC5jb20vMjA5NjM1Cit9CisKKy8qIGNyZWF0ZSBhIGZpbGUgbG9jayAqLworRmlsZUxvY2sqCitmaWxlbG9ja19jcmVhdGUoIGNvbnN0IGNoYXIqICBmaWxlICkKK3sKKyAgICBpbnQgICAgZmlsZV9sZW4gPSBzdHJsZW4oZmlsZSk7CisgICAgaW50ICAgIGxvY2tfbGVuID0gZmlsZV9sZW4gKyBzaXplb2YoTE9DS19OQU1FKTsKKyNpZmRlZiBfV0lOMzIKKyAgICBpbnQgICAgdGVtcF9sZW4gPSBsb2NrX2xlbiArIDEgKyBzaXplb2YoV0lOX1BJREZJTEVfTkFNRSk7CisjZWxzZQorICAgIGludCAgICB0ZW1wX2xlbiA9IGZpbGVfbGVuICsgc2l6ZW9mKFRFTVBfTkFNRSk7CisjZW5kaWYKKyAgICBpbnQgICAgdG90YWxfbGVuID0gc2l6ZW9mKEZpbGVMb2NrKSArIGZpbGVfbGVuICsgbG9ja19sZW4gKyB0ZW1wX2xlbiArIDM7CisKKyAgICBGaWxlTG9jayogbG9jayA9IChGaWxlTG9jayopbWFsbG9jKHRvdGFsX2xlbik7CisKKyAgICBsb2NrLT5maWxlID0gKGNvbnN0IGNoYXIqKShsb2NrICsgMSk7CisgICAgbWVtY3B5KCAoY2hhciopbG9jay0+ZmlsZSwgZmlsZSwgZmlsZV9sZW4rMSApOworCisgICAgbG9jay0+bG9jayA9IGxvY2stPmZpbGUgKyBmaWxlX2xlbiArIDE7CisgICAgbWVtY3B5KCAoY2hhciopbG9jay0+bG9jaywgZmlsZSwgZmlsZV9sZW4rMSApOworICAgIHN0cmNhdCggKGNoYXIqKWxvY2stPmxvY2ssIExPQ0tfTkFNRSApOworCisgICAgbG9jay0+dGVtcCAgICA9IChjaGFyKilsb2NrLT5sb2NrICsgbG9ja19sZW4gKyAxOworI2lmZGVmIF9XSU4zMgorICAgIHNucHJpbnRmKCAoY2hhciopbG9jay0+dGVtcCwgdGVtcF9sZW4sICIlc1xcIiBXSU5fUElERklMRV9OQU1FLAorICAgICAgICAgICAgICBsb2NrLT5sb2NrICk7CisjZWxzZQorICAgIHNucHJpbnRmKChjaGFyKilsb2NrLT50ZW1wLCB0ZW1wX2xlbiwgIiVzJXMiLCBsb2NrLT5maWxlLCBURU1QX05BTUUpOworI2VuZGlmCisgICAgbG9jay0+bG9ja2VkID0gMDsKKworICAgIGlmIChmaWxlbG9ja19sb2NrKGxvY2spIDwgMCkgeworICAgICAgICBmcmVlKGxvY2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhbmRyb2lkX2xvY2tfYWNxdWlyZShfYWxsX2ZpbGVsb2Nrc190bCk7CisgICAgaWYgKF9pc19leGl0aW5nKSB7CisgICAgICAgIGFuZHJvaWRfbG9ja19yZWxlYXNlKF9hbGxfZmlsZWxvY2tzX3RsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbG9jay0+bmV4dCAgICAgPSBfYWxsX2ZpbGVsb2NrczsKKyAgICBfYWxsX2ZpbGVsb2NrcyA9IGxvY2s7CisgICAgYW5kcm9pZF9sb2NrX3JlbGVhc2UoX2FsbF9maWxlbG9ja3NfdGwpOworCisgICAgaWYgKGxvY2stPm5leHQgPT0gTlVMTCkKKyAgICAgICAgYXRleGl0KCBmaWxlbG9ja19hdGV4aXQgKTsKKworICAgIHJldHVybiBsb2NrOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVsb2NrLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZmlsZWxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YThmOWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ZpbGVsb2NrLmgKQEAgLTAsMCArMSw0OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyoqIEZJTEUgTE9DS1MgU1VQUE9SVAorICoqCisgKiogYSBGaWxlTG9jayBpcyB1c2VmdWwgdG8gcHJldmVudCBzZXZlcmFsIGVtdWxhdG9yIGluc3RhbmNlcyBmcm9tIHVzaW5nIHRoZSBzYW1lCisgKiogd3JpdGFibGUgZmlsZSAoZS5nLiB0aGUgdXNlcmRhdGEuaW1nIGRpc2sgaW1hZ2VzKS4KKyAqKgorICoqIEluaXRpYWxpemUgdGhlIG1vZHVsZSBieSBjYWxsaW5nIHxmaWxlbG9ja19pbml0fCBmcm9tIGEgc2luZ2xlIHRocmVhZC4gT25jZQorICoqIGluaXRpYWxpemVkLCB0aGlzIG1vZHVsZSBpcyB0aHJlYWQgc2FmZSB0byB1c2UsIGJ1dCB0d28gdGhyZWFkcyBjYW4gbm90CisgKiogc2FmZWx5IGxvY2sgdGhlIHNhbWUgcGF0aCBjb25jdXJyZW50bHkuCisgKioKKyAqKiBjcmVhdGUgYSBGaWxlTG9jayBvYmplY3Qgd2l0aCBmaWxlbG9ja19jcmVhdGUoKSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgKiogTlVMTCBvbmx5IGlmIHRoZSBjb3JyZXNwb25kaW5nIHBhdGggaXMgYWxyZWFkeSBsb2NrZWQgYnkgYW5vdGhlciBlbXVsYXRvcgorICoqIG9yIGlmIHRoZSBwYXRoIGlzIHJlYWQtb25seS4KKyAqKgorICoqIG5vdGUgdGhhdCAncGF0aCcgY2FuIGRlc2lnbmF0ZSBhIG5vbi1leGlzdGluZyBwYXRoIGFuZCB0aGF0IHRoZSBsb2NrIGNyZWF0aW9uCisgKiogZnVuY3Rpb24gY2FuIGRldGVjdCBzdGFsZSBmaWxlIGxvY2tzIHRoYXQgY2FuIGxvbmdlciB3aGVuIHRoZSBlbXVsYXRvcgorICoqIGNyYXNoZXMgdW5leHBlY3RlZGx5LCBhbmQgd2lsbCBoYXBwaWx5IGNsZWFuIHRoZW0gZm9yIHlvdS4KKyAqKgorICoqIFlvdSBjYW4gY2FsbCBmaWxlbG9ja19yZWxlYXNlKCkgdG8gcmVsZWFzZSBhIGZpbGUgbG9jayBleHBsaWNpdGVseS4gb3RoZXJ3aXNlCisgKiogYWxsIGZpbGUgbG9ja3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQgd2hlbiB0aGUgcHJvZ3JhbSBleGl0cy4KKyAqKiBJdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgb3JpZ2luYWxseSBsb2NrZWQgZmlsZSB3aGlsZSB0aGUgbG9jayBpcyBoZWxkLgorICoqLworCitleHRlcm4gdm9pZCBmaWxlbG9ja19pbml0KCk7CisKK3R5cGVkZWYgc3RydWN0IEZpbGVMb2NrICBGaWxlTG9jazsKKworZXh0ZXJuIEZpbGVMb2NrKiAgZmlsZWxvY2tfY3JlYXRlICggY29uc3QgY2hhciogIHBhdGggKTsKK2V4dGVybiB2b2lkICAgICAgIGZpbGVsb2NrX3JlbGVhc2UoIEZpbGVMb2NrKiAgbG9jayApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9mb3JtYXQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Zvcm1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3NjA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9mb3JtYXQuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9mb3JtYXQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBhcHBlbmQgYSBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQgKGFuZCBhIHRlcm1pbmF0aW5nIG51bGwpCisvLyBhbHdheXMgaW5jcmVtZW50IHRoZSByZXN1bHQKKyNkZWZpbmUgRFNUX0FQUEVORF9TQUZFKGMpIGlmIChkc3RQb3MrMSA8IGRzdExlbikgeyBkc3RbZHN0UG9zKytdID0gYzsgfSByZXN1bHQrKzsKKworc2l6ZV90IGZvcm1hdF9oZXgoY2hhciogZHN0LCBzaXplX3QgZHN0TGVuLCBjb25zdCB2b2lkKiBzcmNWb2lkLCBzaXplX3Qgc3JjTGVuKSB7CisgICAgc2l6ZV90IGRzdFBvcyA9IDA7CisgICAgc2l6ZV90IHJlc3VsdCA9IDA7CisKKyAgICAvLyBpbnNlcnQgYSBzcGFjZSBiZXR3ZWVuIGV2ZXJ5IGtTcGFjZUludGVydmFsIHNyYyBieXRlcworICAgIHN0YXRpYyBjb25zdCBpbnQga1NwYWNlSW50ZXJ2YWwgPSA0OworCisgICAgY29uc3Qgc3RhdGljIGNoYXIgZGlnaXRNYXBbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICBjb25zdCB1aW50OF90KiBzcmMgPSAoY29uc3QgdWludDhfdCopc3JjVm9pZDsKKyAgICBmb3IgKHNpemVfdCBzcmNQb3MgPSAwOyBzcmNQb3MgPCBzcmNMZW47ICsrc3JjUG9zKSB7CisgICAgICAgIGlmIChzcmNQb3MgPiAwICYmIChzcmNQb3MgJSBrU3BhY2VJbnRlcnZhbCkgPT0gMCkgeworICAgICAgICAgICAgLy8gdGltZSB0byBhcHBlbmQgYSBzcGFjZQorICAgICAgICAgICAgRFNUX0FQUEVORF9TQUZFKCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBiID0gc3JjW3NyY1Bvc107CisgICAgICAgIGNoYXIgaGkgPSBkaWdpdE1hcFtiPj40XTsKKyAgICAgICAgY2hhciBsbyA9IGRpZ2l0TWFwW2ImMHhmXTsKKyAgICAgICAgRFNUX0FQUEVORF9TQUZFKGhpKTsKKyAgICAgICAgRFNUX0FQUEVORF9TQUZFKGxvKTsKKyAgICB9CisgICAgLy8gbnVsbC10ZXJtaW5hdGUgaWYgcG9zc2libGUKKyAgICBpZiAoZHN0TGVuID4gMCkgeworICAgICAgICBkc3RbZHN0UG9zXSA9IDA7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBmb3JtYXRfcHJpbnRhYmxlKGNoYXIqIGRzdCwgc2l6ZV90IGRzdExlbiwgY29uc3Qgdm9pZCogc3JjVm9pZCwgc2l6ZV90IHNyY0xlbikgeworICAgIHNpemVfdCBkc3RQb3MgPSAwOworICAgIHNpemVfdCByZXN1bHQgPSAwOworCisgICAgLy8gaW5zZXJ0IGEgc3BhY2UgYmV0d2VlbiBldmVyeSBrU3BhY2VJbnRlcnZhbCBzcmMgYnl0ZXMKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTcGFjZUludGVydmFsID0gODsKKworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IChjb25zdCB1aW50OF90KilzcmNWb2lkOworICAgIGZvciAoc2l6ZV90IHNyY1BvcyA9IDA7IHNyY1BvcyA8IHNyY0xlbjsgKytzcmNQb3MpIHsKKyAgICAgICAgaWYgKHNyY1BvcyA+IDAgJiYgKHNyY1BvcyAlIGtTcGFjZUludGVydmFsKSA9PSAwKSB7CisgICAgICAgICAgICAvLyB0aW1lIHRvIGFwcGVuZCBhIHNwYWNlCisgICAgICAgICAgICBEU1RfQVBQRU5EX1NBRkUoJyAnKTsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IGIgPSBzcmNbc3JjUG9zXTsKKyAgICAgICAgY2hhciBvdXQgPSBpc3ByaW50KGIpID8gKGNoYXIpYiA6ICcuJzsKKyAgICAgICAgRFNUX0FQUEVORF9TQUZFKG91dCk7CisgICAgfQorCisgICAgLy8gbnVsbC10ZXJtaW5hdGUgaWYgcG9zc2libGUKKyAgICBpZiAoZHN0TGVuID4gMCkgeworICAgICAgICBkc3RbZHN0UG9zXSA9IDA7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemVfdCBmb3JtYXRfaGV4X3ByaW50YWJsZShjaGFyKiBkc3QsIHNpemVfdCBkc3RMZW4sIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IHNyY0xlbikgeworICAgIHNpemVfdCByZXN1bHQgPSBmb3JtYXRfaGV4KGRzdCwgZHN0TGVuLCBzcmMsIHNyY0xlbik7CisKKyAgICBzaXplX3QgZHN0UG9zID0gKGRzdExlbiA9PSAwKSA/IDAgOiBzdGQ6Om1pbihyZXN1bHQsZHN0TGVuLTEpOworCisgICAgRFNUX0FQUEVORF9TQUZFKCcgJyk7CisgICAgRFNUX0FQUEVORF9TQUZFKCcgJyk7CisgICAgRFNUX0FQUEVORF9TQUZFKCcgJyk7CisgICAgRFNUX0FQUEVORF9TQUZFKCcgJyk7CisgICAgLy8gbnVsbC10ZXJtaW5hdGUgaWYgcG9zc2libGUKKyAgICBpZiAoZHN0TGVuID4gMCkgeworICAgICAgICBkc3RbZHN0UG9zXSA9IDA7CisgICAgfQorCisgICAgcmVzdWx0ICs9IGZvcm1hdF9wcmludGFibGUoZHN0K2RzdFBvcywgZHN0TGVuLWRzdFBvcywgc3JjLCBzcmNMZW4pOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY2hhciogZm9ybWF0X2hleF9wcmludGFibGUyKGNoYXIqIGRzdCwgc2l6ZV90IGRzdExlbiwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3Qgc3JjTGVuKSB7CisgICAgZm9ybWF0X2hleF9wcmludGFibGUoZHN0LCBkc3RMZW4sIHNyYywgc3JjTGVuKTsKKyAgICByZXR1cm4gZHN0OworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZm9ybWF0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5ZjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9mb3JtYXQuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gZm9ybWF0X2hleCwgZm9ybWF0X3ByaW50YWJsZSwgZm9ybWF0X2hleF9wcmludGFibGUsCisvLyBmb3JtYXRfaGV4X3ByaW50YWJsZTIKKy8vCisvLyBIZXggZm9ybWF0IHByaW50cyBkYXRhIGludG8gYSBjaGFyYWN0ZXIgYnVmZmVyCisvLworLy8gfGRzdHwgY2hhcmFjdGVyIGJ1ZmZlciB0byByZWNlaXZlIGZvcm1hdHRlZCB0ZXh0IG91dHB1dCBpcyBhbHdheXMKKy8vICAgICAgIE5VTC10ZXJtaW5hdGVkIGlmIHxkc3RMZW58ID4gMAorLy8gfGRzdExlbnwgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiB0byB8ZHN0fAorLy8gfHNyY3wgZGF0YSB0byBiZSBwcmludGVkCisvLyB8c3JjTGVufCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJpbnRlZAorLy8KKy8vIGZvcm1hdF9oZXgsIGZvcm1hdF9wcmludGFibGUsIGZvcm1hdF9oZXhfcHJpbnRhYmxlOgorLy8gUmV0dXJucyBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGUgZnVuY3Rpb24gdHJpZWQgdG8gY3JlYXRlCisvLyAoTGlrZSBzbnByaW50Ziwgc3RybGNweSgpIGFuZCBzdHJsY2F0KCkpCisvLworLy8gZm9ybWF0X2hleF9wcmludGFibGUyOgorLy8gUmV0dXJucyB8ZHN0fAorCisvLyBPdXRwdXQgaXMgaGV4IGZvcm1hdHRlZCB3aXRoIGEgc3BhY2UgYmV0d2VlbiBldmVyeSA0IHNyYyBieXRlcworc2l6ZV90IGZvcm1hdF9oZXgoY2hhciogZHN0LCBzaXplX3QgZHN0TGVuLCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBzcmNMZW4pOworCisvLyBPdXRwdXQgaXMgQVNDaWkgZm9ybWF0dGVkIHdpdGggYSBzcGFjZSBiZXR3ZWVuIGV2ZXJ5IDggc3JjIGJ5dGVzCisvLyBVbnByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoICcuJworc2l6ZV90IGZvcm1hdF9wcmludGFibGUoY2hhciogZHN0LCBzaXplX3QgZHN0TGVuLCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBzcmNMZW4pOworCisvLyBPdXRwdXQgaXMgaGV4IGZvcm1hdHRlZCB3aXRoIGEgc3BhY2UgYmV0d2VlbiBldmVyeSA0IHNyYyBieXRlcworLy8gZm9sbG93ZWQgYnkgNCBzcGFjZXMgZm9sbG93ZWQgYnkKKy8vIEFTQ2lpIGZvcm1hdHRlZCB3aXRoIGEgc3BhY2UgYmV0d2VlbiBldmVyeSA4IHNyYyBieXRlcworLy8gVW5wcmludGFibGUgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCAnLicKK3NpemVfdCBmb3JtYXRfaGV4X3ByaW50YWJsZShjaGFyKiBkc3QsIHNpemVfdCBkc3RMZW4sIGNvbnN0IHZvaWQqIHNyYywgc2l6ZV90IHNyY0xlbik7CisKKy8vIE91dHB1dCBpcyBzYW1lIGFzIGZvcm1hdF9oZXhfcHJpbnRhYmxlCitjaGFyKiBmb3JtYXRfaGV4X3ByaW50YWJsZTIoY2hhciogZHN0LCBzaXplX3QgZHN0TGVuLCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBzcmNMZW4pOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9mb3JtYXRfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2Zvcm1hdF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmOWI1YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9mb3JtYXRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZm9ybWF0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJpbmcuaCIKKyNpbmNsdWRlICJndGVzdC9ndGVzdC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdXRpbHMgeworCitzdGF0aWMgY29uc3QgY2hhciogZHVtbXkgPSAiRHVtbXkiOworCitURVNUKFV0aWxzLCBGb3JtYXRIZXgpIHsKKyAgICBjaGFyIHRtcFsxMjhdOworCisgICAgdWludDhfdCB0ZXN0W10gPSB7IDB4MSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiB9OworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDBVLCBmb3JtYXRfaGV4KHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDApKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMlUsIGZvcm1hdF9oZXgodG1wLCBzaXplb2YodG1wKSwgdGVzdCwgMSkpOworICAgIEVYUEVDVF9TVFJFUSgiMDEiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDRVLCBmb3JtYXRfaGV4KHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAxMjMiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDhVLCBmb3JtYXRfaGV4KHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDQpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAxMjM0NTY3IiwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxMVUsIGZvcm1hdF9oZXgodG1wLCBzaXplb2YodG1wKSwgdGVzdCwgNSkpOworICAgIEVYUEVDVF9TVFJFUSgiMDEyMzQ1NjcgODkiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE3VSwgZm9ybWF0X2hleCh0bXAsIHNpemVvZih0bXApLCB0ZXN0LCA4KSk7CisgICAgRVhQRUNUX1NUUkVRKCIwMTIzNDU2NyA4OWFiY2RlZiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMTdVLCBmb3JtYXRfaGV4KHRtcCwgMCwgdGVzdCwgOCkpOworICAgIEVYUEVDVF9TVFJFUShkdW1teSwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxN1UsIGZvcm1hdF9oZXgodG1wLCAxLCB0ZXN0LCA4KSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE3VSwgZm9ybWF0X2hleCh0bXAsIDIsIHRlc3QsIDgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE3VSwgZm9ybWF0X2hleCh0bXAsIDMsIHRlc3QsIDgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAxIiwgdG1wKTsKK30KKworVEVTVChVdGlscywgRm9ybWF0UHJpbnRhYmxlKSB7CisgICAgY2hhciB0bXBbMTI4XTsKKworICAgIHVpbnQ4X3QgdGVzdFtdID0geyAweDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsICd0JywgJ2UnLCAncycsICd0JyB9OworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDBVLCBmb3JtYXRfcHJpbnRhYmxlKHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDApKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMVUsIGZvcm1hdF9wcmludGFibGUodG1wLCBzaXplb2YodG1wKSwgdGVzdCwgMSkpOworICAgIEVYUEVDVF9TVFJFUSgiLiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMlUsIGZvcm1hdF9wcmludGFibGUodG1wLCBzaXplb2YodG1wKSwgdGVzdCwgMikpOworICAgIEVYUEVDVF9TVFJFUSgiLiMiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDRVLCBmb3JtYXRfcHJpbnRhYmxlKHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDQpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi4jRWciLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDVVLCBmb3JtYXRfcHJpbnRhYmxlKHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi4jRWcuIiwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSg4VSwgZm9ybWF0X3ByaW50YWJsZSh0bXAsIHNpemVvZih0bXApLCB0ZXN0LCA4KSk7CisgICAgRVhQRUNUX1NUUkVRKCIuI0VnLi4uLiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMTNVLCBmb3JtYXRfcHJpbnRhYmxlKHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDEyKSk7CisgICAgRVhQRUNUX1NUUkVRKCIuI0VnLi4uLiB0ZXN0IiwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxM1UsIGZvcm1hdF9wcmludGFibGUodG1wLCAwLCB0ZXN0LCAxMikpOworICAgIEVYUEVDVF9TVFJFUShkdW1teSwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxM1UsIGZvcm1hdF9wcmludGFibGUodG1wLCAxLCB0ZXN0LCAxMikpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgdG1wKTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxM1UsIGZvcm1hdF9wcmludGFibGUodG1wLCAyLCB0ZXN0LCAxMikpOworICAgIEVYUEVDVF9TVFJFUSgiLiIsIHRtcCk7CisKKyAgICBzdHJsY3B5KHRtcCwgZHVtbXksIHNpemVvZih0bXApKTsKKyAgICBFWFBFQ1RfRVEoMTNVLCBmb3JtYXRfcHJpbnRhYmxlKHRtcCwgMywgdGVzdCwgMTIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIi4jIiwgdG1wKTsKK30KKworVEVTVChVdGlscywgRm9ybWF0SGV4UHJpbnRhYmxlKSB7CisgICAgY2hhciB0bXBbMTI4XTsKKworICAgIHVpbnQ4X3QgdGVzdFtdID0geyAweDEsIDB4MjMsIDB4NDUsIDB4NjcgfTsKKworICAgIHN0cmxjcHkodG1wLCBkdW1teSwgc2l6ZW9mKHRtcCkpOworICAgIEVYUEVDVF9FUSgxNlUsIGZvcm1hdF9oZXhfcHJpbnRhYmxlKHRtcCwgc2l6ZW9mKHRtcCksIHRlc3QsIDQpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjAxMjM0NTY3ICAgIC4jRWciLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE2VSwgZm9ybWF0X2hleF9wcmludGFibGUodG1wLCAwLCB0ZXN0LCA0KSk7CisgICAgRVhQRUNUX1NUUkVRKGR1bW15LCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE2VSwgZm9ybWF0X2hleF9wcmludGFibGUodG1wLCAxLCB0ZXN0LCA0KSk7CisgICAgRVhQRUNUX1NUUkVRKCIiLCB0bXApOworCisgICAgc3RybGNweSh0bXAsIGR1bW15LCBzaXplb2YodG1wKSk7CisgICAgRVhQRUNUX0VRKDE2VSwgZm9ybWF0X2hleF9wcmludGFibGUodG1wLCAyLCB0ZXN0LCA0KSk7CisgICAgRVhQRUNUX1NUUkVRKCIwIiwgdG1wKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzcy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA4ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzcy5jcHAKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKworaW50IGFuZHJvaWRfZ2V0SG9zdEJpdG5lc3Modm9pZCkgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmdldCgpLT5nZXRIb3N0Qml0bmVzcygpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2hvc3RfYml0bmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmJlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBSZXR1cm4gdGhlIGJpdG5lc3Mgb2YgdGhlIGhvc3QgbWFjaGluZSB0aGlzIHByb2dyYW0gaXMgcnVubmluZyBvbi4KKy8vIFRoaXMgaXMgaW5kZXBlbmRlbnQgb2Ygd2hldGhlciB0aGUgY3VycmVudCBleGVjdXRhYmxlIGlzIGEgMzIgb3IgNjQKKy8vIGJpdCBiaW5hcnkuIFJldHVybnMgMzIgb3IgNjQuCitpbnQgYW5kcm9pZF9nZXRIb3N0Qml0bmVzcyh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9ob3N0X2JpdG5lc3NfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjQ3MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaG9zdF9iaXRuZXNzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworVEVTVChIb3N0Qml0bmVzcywgYW5kcm9pZF9nZXRIb3N0Qml0bmVzcykgeworICAgIGludCBob3N0X2JpdG5lc3MgPSBhbmRyb2lkX2dldEhvc3RCaXRuZXNzKCk7CisgICAgcHJpbnRmKCJGb3VuZCBob3N0IGJpdG5lc3M6ICVkXG4iLCBob3N0X2JpdG5lc3MpOworICAgIEVYUEVDVF9UUlVFKGhvc3RfYml0bmVzcyA9PSAzMiB8fCBob3N0X2JpdG5lc3MgPT0gNjQpIDw8CisgICAgICAgICJJbnZhbGlkIGhvc3QgYml0bmVzczogIiA8PCBob3N0X2JpdG5lc3M7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaHR0cF91dGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaHR0cF91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhYThkMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9odHRwX3V0aWxzLmNwcApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaHR0cF91dGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvSHR0cFV0aWxzLmgiCisKK2Jvb2wgYW5kcm9pZF9odHRwX2lzX3JlcXVlc3RfbGluZShjb25zdCBjaGFyKiBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsaW5lX2xlbikgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpodHRwSXNSZXF1ZXN0TGluZShsaW5lLCBsaW5lX2xlbik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaHR0cF91dGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2h0dHBfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM4NWJjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2h0dHBfdXRpbHMuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFNpbXBsZSBDIHdyYXBwZXIgZm9yIGFuZHJvaWQ6OmJhc2U6Omh0dHBJc1JlcXVlc3RMaW5lKCkuCitib29sIGFuZHJvaWRfaHR0cF9pc19yZXF1ZXN0X2xpbmUoY29uc3QgY2hhciogbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGluZV9sZW4pOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbmkuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2luaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YWU2NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbmkuY3BwCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW5pLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvSW5pRmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKwordHlwZWRlZiA6OkNJbmlGaWxlIENJbmlGaWxlOwordHlwZWRlZiBhbmRyb2lkOjpiYXNlOjpJbmlGaWxlIEJhc2VJbmlGaWxlOworCitzdGF0aWMgQmFzZUluaUZpbGUqIGFzQmFzZUluaUZpbGUoQ0luaUZpbGUqIGkpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYXNlSW5pRmlsZSo+KGkpOworfQorCit2b2lkIGluaUZpbGVfZnJlZShDSW5pRmlsZSogaSkgeworICAgIGRlbGV0ZSBhc0Jhc2VJbmlGaWxlKGkpOworfQorCitib29sIGluaUZpbGVfaGFzS2V5KENJbmlGaWxlKiBpLCBjb25zdCBjaGFyKiBrZXkpIHsKKyAgICByZXR1cm4gYXNCYXNlSW5pRmlsZShpKS0+aGFzS2V5KGtleSk7Cit9CisKK2ludCBpbmlGaWxlX2dldFBhaXJDb3VudChDSW5pRmlsZSogaSkgeworICAgIHJldHVybiBhc0Jhc2VJbmlGaWxlKGkpLT5zaXplKCk7Cit9CisKK0NJbmlGaWxlKiBpbmlGaWxlX25ld0VtcHR5KGNvbnN0IGNoYXIqIGZpbGVwYXRoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q0luaUZpbGUqPihuZXcgQmFzZUluaUZpbGUoKSk7Cit9CisKK0NJbmlGaWxlKiBpbmlGaWxlX25ld0Zyb21GaWxlKGNvbnN0IGNoYXIqIGZpbGVwYXRoKSB7CisgICAgQmFzZUluaUZpbGUqIGluaSA9IG5ldyBCYXNlSW5pRmlsZShmaWxlcGF0aCk7CisgICAgaW5pLT5yZWFkKCk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q0luaUZpbGUqPihpbmkpOworfQorCisvLyBOQjogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCitpbnQgaW5pRmlsZV9zYXZlVG9GaWxlKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBmaWxlcGF0aCkgeworICAgIGFzQmFzZUluaUZpbGUoZiktPnNldEJhY2tpbmdGaWxlKGZpbGVwYXRoKTsKKyAgICByZXR1cm4gIWFzQmFzZUluaUZpbGUoZiktPndyaXRlKCk7Cit9CisKKy8vIE5COiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KK2ludCBpbmlGaWxlX3NhdmVUb0ZpbGVDbGVhbihDSW5pRmlsZSogZiwgY29uc3QgY2hhciogZmlsZXBhdGgpIHsKKyAgICBhc0Jhc2VJbmlGaWxlKGYpLT5zZXRCYWNraW5nRmlsZShmaWxlcGF0aCk7CisgICAgcmV0dXJuICFhc0Jhc2VJbmlGaWxlKGYpLT53cml0ZURpc2NhcmRpbmdFbXB0eSgpOworfQorCitpbnQgaW5pRmlsZV9nZXRFbnRyeShDSW5pRmlsZSogZiwgaW50IGluZGV4LCBjaGFyKioga2V5LCBjaGFyKiogdmFsdWUpIHsKKyAgICBCYXNlSW5pRmlsZSogaW5pID0gYXNCYXNlSW5pRmlsZShmKTsKKyAgICBpZiAoaW5kZXggPj0gaW5pLT5zaXplKCkpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbmRleCAiIDw8IGluZGV4CisgICAgICAgICAgICAgICAgICAgICA8PCAiZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGluaSBmaWxlIGVudHJpZXMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgaW5pLT5zaXplKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBCYXNlSW5pRmlsZTo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gaW5pLT5iZWdpbigpOworICAgIGZvciAoOyBpbmRleCA+IDA7IC0taW5kZXgpIHsKKyAgICAgICAgKytjaXQ7CisgICAgfQorICAgICprZXkgPSBzdHJkdXAoY2l0LT5jX3N0cigpKTsKKyAgICAqdmFsdWUgPSBzdHJkdXAoaW5pLT5nZXRTdHJpbmcoKmNpdCwgIiIpLmNfc3RyKCkpOworICAgIHJldHVybiAwOworfQorCitjaGFyKiBpbmlGaWxlX2dldFN0cmluZyhDSW5pRmlsZSogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSkgeworICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIHN0cmR1cChhc0Jhc2VJbmlGaWxlKGYpLT5nZXRTdHJpbmcoa2V5LCBkZWZhdWx0VmFsdWUpLmNfc3RyKCkpOworICAgIH0KKyAgICAvLyB8ZGVmYXVsdFZhbHVlfCBvZiBOVUxMIGlzIG5vdCBoYW5kbGVkIHdlbGwgYnkgZ2V0U3RyaW5nLgorICAgIGlmICghYXNCYXNlSW5pRmlsZShmKS0+aGFzS2V5KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdHJkdXAoYXNCYXNlSW5pRmlsZShmKS0+Z2V0U3RyaW5nKGtleSwgIiIpLmNfc3RyKCkpOworfQorCitpbnQgaW5pRmlsZV9nZXRJbnRlZ2VyKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICByZXR1cm4gYXNCYXNlSW5pRmlsZShmKS0+Z2V0SW50KGtleSwgZGVmYXVsdFZhbHVlKTsKK30KKworZG91YmxlIGluaUZpbGVfZ2V0RG91YmxlKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHsKKyAgICByZXR1cm4gYXNCYXNlSW5pRmlsZShmKS0+Z2V0RG91YmxlKGtleSwgZGVmYXVsdFZhbHVlKTsKK30KKworaW50IGluaUZpbGVfZ2V0Qm9vbGVhbihDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBkZWZhdWx0VmFsdWUpIHsKKyAgICByZXR1cm4gYXNCYXNlSW5pRmlsZShmKS0+Z2V0Qm9vbFN0cihrZXksIGRlZmF1bHRWYWx1ZSk7Cit9CisKK2ludDY0X3QgaW5pRmlsZV9nZXREaXNrU2l6ZShDSW5pRmlsZSogZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdFZhbHVlKSB7CisgICAgcmV0dXJuIGFzQmFzZUluaUZpbGUoZiktPmdldERpc2tTaXplU3RyKGtleSwgZGVmYXVsdFZhbHVlKTsKK30KKworaW50NjRfdCBpbmlGaWxlX2dldEludDY0KENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludDY0X3QgZGVmYXVsdFZhbHVlKSB7CisgICAgcmV0dXJuIGFzQmFzZUluaUZpbGUoZiktPmdldEludDY0KGtleSwgZGVmYXVsdFZhbHVlKTsKK30KKwordm9pZCBpbmlGaWxlX3NldFZhbHVlKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgLy8gU2lsZW50bHkgcHJvdGVjdCB1cyBmcm9tIGJsb3dpbmcgdXAuCisgICAgYXNCYXNlSW5pRmlsZShmKS0+c2V0U3RyaW5nKGtleSwgKHZhbHVlID09IE5VTEwpID8gIiIgOiB2YWx1ZSk7Cit9CisKK3ZvaWQgaW5pRmlsZV9zZXRJbnRlZ2VyKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSkgeworICAgIGFzQmFzZUluaUZpbGUoZiktPnNldEludChrZXksIHZhbHVlKTsKK30KKwordm9pZCBpbmlGaWxlX3NldEludDY0KENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludDY0X3QgdmFsdWUpIHsKKyAgICBhc0Jhc2VJbmlGaWxlKGYpLT5zZXRJbnQ2NChrZXksIHZhbHVlKTsKK30KKwordm9pZCBpbmlGaWxlX3NldERvdWJsZShDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5LCBkb3VibGUgdmFsdWUpIHsKKyAgICBhc0Jhc2VJbmlGaWxlKGYpLT5zZXREb3VibGUoa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgaW5pRmlsZV9zZXRCb29sZWFuKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSkgeworICAgIGFzQmFzZUluaUZpbGUoZiktPnNldEJvb2woa2V5LCB2YWx1ZSk7Cit9CisKK3ZvaWQgaW5pRmlsZV9zZXREaXNrU2l6ZShDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5LCBpbnQ2NF90IHNpemUpIHsKKyAgICBhc0Jhc2VJbmlGaWxlKGYpLT5zZXREaXNrU2l6ZShrZXksIHNpemUpOworfQorCit2b2lkIGluaUZpbGVfc2V0U3RyaW5nKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHN0cikgeworICAgIGFzQmFzZUluaUZpbGUoZiktPnNldFN0cmluZyhrZXksIHN0cik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaW5pLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaW5pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjZmE2YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbmkuaApAQCAtMCwwICsxLDExOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogdGhlIGVtdWxhdG9yIHN1cHBvcnRzIGEgc2ltcGxlIC5pbmkgZmlsZSBmb3JtYXQgZm9yIGl0cyBjb25maWd1cmF0aW9uCisgKiBmaWxlcy4gU2VlIGRvY3MvQU5EUk9JRC1DT05GSUctRklMRVMuVFhUIGZvciBkZXRhaWxzLgorICovCisKKy8qIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhbiAuaW5pIGNvbmZpZ3VyYXRpb24gZmlsZSAqLwordHlwZWRlZiBzdHJ1Y3QgQ0luaUZpbGUgQ0luaUZpbGU7CisKKy8qCisgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IENJbmlGaWxlIG5vdCBib3VuZCB0byBhbnkgdW5kZXJseWluZyBmaWxlLCBhbmQgd2l0aG91dAorICogYW55CisgKiBkYXRhLiB8ZmlsZVBhdGh8IGlzIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgYSB3YXJuaW5nIHRvIHN0ZGVyciwgaW4gY2FzZSBvZgorICogYmFkbHkgZm9ybWVkIG91dHB1dC4KKyAqLworQ0luaUZpbGUqIGluaUZpbGVfbmV3RW1wdHkoY29uc3QgY2hhciogZmlsZVBhdGgpOworCisvKiBjcmVhdGVzIGEgbmV3IENJbmlGaWxlIG9iamVjdCBmcm9tIGEgZmlsZSBwYXRoLAorICogcmV0dXJucyBOVUxMIGlmIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuCisgKi8KK0NJbmlGaWxlKiBpbmlGaWxlX25ld0Zyb21GaWxlKGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKworLyogdHJ5IHRvIHdyaXRlIGFuIENJbmlGaWxlIGludG8gYSBnaXZlbiBmaWxlLgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yIChzZWUgZXJybm8gZm9yIGVycm9yIGNvZGUpCisgKi8KK2ludCBpbmlGaWxlX3NhdmVUb0ZpbGUoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGZpbGVQYXRoKTsKKworLyogdHJ5IHRvIHdyaXRlIGFuIENJbmlGaWxlIGludG8gYSBnaXZlbiBmaWxlLCBpZ25vcmlnIHBhaXJzIHdpdGggZW1wdHkgdmFsdWVzLgorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yIChzZWUgZXJybm8gZm9yIGVycm9yIGNvZGUpCisgKi8KK2ludCBpbmlGaWxlX3NhdmVUb0ZpbGVDbGVhbihDSW5pRmlsZSogZiwgY29uc3QgY2hhciogZmlsZXBhdGgpOworCisvKiBmcmVlIGFuIENJbmlGaWxlIG9iamVjdCAqLwordm9pZCBpbmlGaWxlX2ZyZWUoQ0luaUZpbGUqIGYpOworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgKGtleS52YWx1ZSkgcGFpcnMgaW4gYW4gQ0luaUZpbGUgKi8KK2ludCBpbmlGaWxlX2dldFBhaXJDb3VudChDSW5pRmlsZSogZik7CisKKy8qIENoZWNrIGlmIGEga2V5IGV4aXN0cyBpbiB0aGUgaW5pRmlsZSAqLworYm9vbCBpbmlGaWxlX2hhc0tleShDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5KTsKKworLyogQ29waWVzIGEgJ2tleSwgdmFsdWUnIHBhaXIgZm9yIGFuIGVudHJ5IGluIHRoZSBmaWxlLgorICogUGFyYW06CisgKiAgZiAtIEluaXRpYWxpemVkIENJbmlGaWxlIGluc3RhbmNlLgorICogIGluZGV4IC0gSW5kZXggb2YgdGhlIGVudHJ5IHRvIGNvcHkuIE11c3QgYmUgbGVzcyB0aGFuIHZhbHVlIHJldHVybmVkIGZyb20KKyAqIHRoZQorICogICAgICBpbmlGaWxlX2dldFBhaXJDb3VudCByb3V0aW5lLgorICogIGtleSwgdmFsdWUgLSBSZWNlaXZlcyBrZXksIGFuZCB2YWx1ZSBzdHJpbmdzIGZvciB0aGUgZW50cnkuIElmIHRoaXMgcm91dGluZQorICogICAgICBzdWNjZWVkcywgdGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciB0aGUgc3RyaW5ncy4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIC0xIGlmIHRoZSBpbmRleCBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUgZmlsZQorICovCitpbnQgaW5pRmlsZV9nZXRFbnRyeShDSW5pRmlsZSogZiwgaW50IGluZGV4LCBjaGFyKioga2V5LCBjaGFyKiogdmFsdWUpOworCisvKiByZXR1cm5zIGEgY29weSBvZiB0aGUgdmFsdWUgb2YgYSBnaXZlbiBrZXksIG9yIE5VTEwgaWYgZGVmYXVsdFZhbHVlIGlzIE5VTEwuCisgKiBjYWxsZXIgbXVzdCBmcmVlKCkgaXQuCisgKi8KK2NoYXIqIGluaUZpbGVfZ2V0U3RyaW5nKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSk7CisKKy8qIHJldHVybnMgYW4gaW50ZWdlciB2YWx1ZSwgb3IgYSBkZWZhdWx0IGluIGNhc2UgdGhlIHZhbHVlIHN0cmluZyBpcworICogbWlzc2luZyBvciBiYWRseSBmb3JtYXR0ZWQKKyAqLworaW50IGluaUZpbGVfZ2V0SW50ZWdlcihDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5LCBpbnQgZGVmYXVsdFZhbHVlKTsKKworLyogcmV0dXJucyBhIDY0LWJpdCBpbnRlZ2VyIHZhbHVlLCBvciBhIGRlZmF1bHQgaW4gY2FzZSB0aGUgdmFsdWUgc3RyaW5nIGlzCisgKiBtaXNzaW5nIG9yIGJhZGx5IGZvcm1hdHRlZAorICovCitpbnQ2NF90IGluaUZpbGVfZ2V0SW50NjQoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgaW50NjRfdCBkZWZhdWx0VmFsdWUpOworCisvKiByZXR1cm5zIGEgZG91YmxlIHZhbHVlLCBvciBhIGRlZmF1bHQgaW4gY2FzZSB0aGUgdmFsdWUgc3RyaW5nIGlzCisgKiBtaXNzaW5nIG9yIGJhZGx5IGZvcm1hdHRlZAorICovCitkb3VibGUgaW5pRmlsZV9nZXREb3VibGUoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgZG91YmxlIGRlZmF1bHRWYWx1ZSk7CisKKy8qIHBhcnNlcyBhIGtleSB2YWx1ZSBhcyBhIGJvb2xlYW4uIEFjY2VwdGVkIHZhbHVlcyBhcmUgIjEiLCAiMCIsICJ5ZXMiLCAiWUVTIiwKKyAqICJubyIgYW5kICJOTyIuIFJldHVybnMgZWl0aGVyIDEgb3IgMC4KKyAqIG5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgc3RyaW5nIHRvbworICovCitpbnQgaW5pRmlsZV9nZXRCb29sZWFuKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSk7CisKKy8qIHBhcnNlcyBhIGtleSB2YWx1ZSBhcyBhIGRpc2sgc2l6ZS4gdGhpcyBtZWFucyBpdCBjYW4gYmUgYW4gaW50ZWdlciBmb2xsb3dlZAorICogYnkgYSBzdWZmaXggdGhhdCBjYW4gYmUgb25lIG9mICJtTWtLZ0ciIHdoaWNoIGNvcnJlc3BvbmQgdG8gS2lCLCBNaUIgYW5kIEdpQgorICogbXVsdGlwbGllcnMuCisgKgorICogTk9URTogd2UgY29uc2lkZXIgdGhhdCAxSyA9IDEwMjQsIG5vdCAxMDAwLgorICovCitpbnQ2NF90IGluaUZpbGVfZ2V0RGlza1NpemUoQ0luaUZpbGUqIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBzZXQgdmFsdWVzIGluIGFuIENJbmlGaWxlICovCit2b2lkIGluaUZpbGVfc2V0VmFsdWUoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUpOwordm9pZCBpbmlGaWxlX3NldEludGVnZXIoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlKTsKK3ZvaWQgaW5pRmlsZV9zZXRJbnQ2NChDSW5pRmlsZSogZiwgY29uc3QgY2hhcioga2V5LCBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgaW5pRmlsZV9zZXREb3VibGUoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgZG91YmxlIHZhbHVlKTsKK3ZvaWQgaW5pRmlsZV9zZXRCb29sZWFuKENJbmlGaWxlKiBmLCBjb25zdCBjaGFyKiBrZXksIGludCB2YWx1ZSk7Cit2b2lkIGluaUZpbGVfc2V0RGlza1NpemUoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgaW50NjRfdCBzaXplKTsKK3ZvaWQgaW5pRmlsZV9zZXRTdHJpbmcoQ0luaUZpbGUqIGYsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogc3RyKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaW50bWFwLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaW50bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxNWI2NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbnRtYXAuYwpAQCAtMCwwICsxLDIyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW50bWFwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2R1ZmYuaCIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyogV2UgaW1wbGVtZW50IHRoZSBtYXAgYXMgdHdvIHBhcmFsbGVsIGFycmF5cy4KKyAqCisgKiBPbmUgYXJyYXkgZm9yIHRoZSBpbnRlZ2VyIGtleXMsIGFuZCB0aGUgb3RoZXIgb25lCisgKiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnRlcnMuCisgKgorICogQSBtb3JlIHNvcGhpc3RpY2F0ZWQgaW1wbGVtZW50YXRpb24gd2lsbCBwcm9iYWJseSBiZQorICogbmVlZGVkIGluIHRoZSBjYXNlIHdoZXJlIHdlIHdvdWxkIG5lZWQgdG8gc3RvcmUgYSBsYXJnZQorICogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBtYXAuCisgKi8KKworc3RydWN0IEFJbnRNYXAgeworICAgIGludCAgICAgc2l6ZTsKKyAgICBpbnQgICAgIGNhcGFjaXR5OworICAgIGludCogICAga2V5czsKKyAgICB2b2lkKiogIHZhbHVlczsKKworI2RlZmluZSBJTklUX0NBUEFDSVRZICA4CisgICAgaW50ICAgICBrZXlzMFtJTklUX0NBUEFDSVRZXTsKKyAgICB2b2lkKiAgIHZhbHVlczBbSU5JVF9DQVBBQ0lUWV07Cit9OworCitBSW50TWFwKgorYWludE1hcF9uZXcodm9pZCkKK3sKKyAgICBBSW50TWFwKiAgbWFwOworCisgICAgQU5FVzAobWFwKTsKKyAgICBtYXAtPnNpemUgICAgID0gMDsKKyAgICBtYXAtPmNhcGFjaXR5ID0gNDsKKyAgICBtYXAtPmtleXMgICAgID0gbWFwLT5rZXlzMDsKKyAgICBtYXAtPnZhbHVlcyAgID0gbWFwLT52YWx1ZXMwOworCisgICAgcmV0dXJuIG1hcDsKK30KKwordm9pZAorYWludE1hcF9mcmVlKCBBSW50TWFwKiAgbWFwICkKK3sKKyAgICBpZiAobWFwKSB7CisgICAgICAgIGlmIChtYXAtPmtleXMgIT0gbWFwLT5rZXlzMCkKKyAgICAgICAgICAgIEFGUkVFKG1hcC0+a2V5cyk7CisgICAgICAgIGlmIChtYXAtPnZhbHVlcyAhPSBtYXAtPnZhbHVlczApCisgICAgICAgICAgICBBRlJFRShtYXAtPnZhbHVlcyk7CisKKyAgICAgICAgbWFwLT5zaXplID0gMDsKKyAgICAgICAgbWFwLT5jYXBhY2l0eSA9IDA7CisgICAgICAgIEFGUkVFKG1hcCk7CisgICAgfQorfQorCitpbnQKK2FpbnRNYXBfZ2V0Q291bnQoIEFJbnRNYXAqIG1hcCApCit7CisgICAgcmV0dXJuIG1hcC0+c2l6ZTsKK30KKwordm9pZCoKK2FpbnRNYXBfZ2V0KCBBSW50TWFwKiAgbWFwLCBpbnQgIGtleSApCit7CisgICAgcmV0dXJuIGFpbnRNYXBfZ2V0V2l0aERlZmF1bHQobWFwLCBrZXksIE5VTEwpOworfQorCit2b2lkKgorYWludE1hcF9nZXRXaXRoRGVmYXVsdCggQUludE1hcCogIG1hcCwgaW50IGtleSwgdm9pZCogIGRlZiApCit7CisgICAgaW50ICBsaW1pdCAgID0gbWFwLT5zaXplICsgMTsKKyAgICBpbnQgIGluZGV4ICAgPSAwOworICAgIGludCoga2V5cyAgICA9IG1hcC0+a2V5czsKKworICAgIGluZGV4ID0gMDsKKyAgICBEVUZGNChsaW1pdCx7CisgICAgICAgIGlmIChrZXlzW2luZGV4XSA9PSBrZXkpCisgICAgICAgICAgICByZXR1cm4gbWFwLT52YWx1ZXNbaW5kZXhdOworICAgICAgICBpbmRleCsrOworICAgIH0pOworICAgIHJldHVybiBkZWY7Cit9CisKK3N0YXRpYyB2b2lkCithaW50TWFwX2dyb3coIEFJbnRNYXAqIG1hcCApCit7CisgICAgaW50ICAgb2xkQ2FwYWNpdHkgPSBtYXAtPmNhcGFjaXR5OworICAgIGludCAgIG5ld0NhcGFjaXR5OworICAgIHZvaWQqIGtleXMgPSBtYXAtPmtleXM7CisgICAgdm9pZCogdmFsdWVzID0gbWFwLT52YWx1ZXM7CisKKyAgICBpZiAoa2V5cyA9PSBtYXAtPmtleXMwKQorICAgICAgICBrZXlzID0gTlVMTDsKKworICAgIGlmICh2YWx1ZXMgPT0gbWFwLT52YWx1ZXMwKQorICAgICAgICB2YWx1ZXMgPSBOVUxMOworCisgICAgaWYgKG9sZENhcGFjaXR5IDwgMjU2KQorICAgICAgICBuZXdDYXBhY2l0eSA9IG9sZENhcGFjaXR5KjI7CisgICAgZWxzZQorICAgICAgICBuZXdDYXBhY2l0eSA9IG9sZENhcGFjaXR5ICsgKG9sZENhcGFjaXR5ID4+IDIpOworCisgICAgQUFSUkFZX1JFTkVXKGtleXMsIG5ld0NhcGFjaXR5KTsKKyAgICBBQVJSQVlfUkVORVcodmFsdWVzLCBuZXdDYXBhY2l0eSk7CisKKyAgICBtYXAtPmtleXMgPSBrZXlzOworICAgIG1hcC0+dmFsdWVzID0gdmFsdWVzOworICAgIG1hcC0+Y2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKK30KKworCit2b2lkKgorYWludE1hcF9zZXQoIEFJbnRNYXAqIG1hcCwgaW50IGtleSwgdm9pZCogdmFsdWUgKQoreworICAgIGludCAgaW5kZXgsIGxpbWl0OworICAgIGludCoga2V5czsKKyAgICB2b2lkKiByZXN1bHQgPSBOVUxMOworCisgICAgLyogRmlyc3QsIHRyeSB0byBmaW5kIHRoZSBpdGVtIGluIG91ciBoZWFwICovCisgICAga2V5cyAgPSBtYXAtPmtleXM7CisgICAgbGltaXQgPSBtYXAtPnNpemU7CisgICAgaW5kZXggPSAwOworICAgIERVRkY0KGxpbWl0LHsKKyAgICAgICAgaWYgKGtleXNbaW5kZXhdID09IGtleSkKKyAgICAgICAgICAgIGdvdG8gRk9VTkQ7CisgICAgICAgIGluZGV4Kys7CisgICAgfSk7CisKKyAgICAvKiBOb3QgZm91bmQsIG5lZWQgdG8gYWRkIGl0ICovCisgICAgaWYgKG1hcC0+c2l6ZSA+PSBtYXAtPmNhcGFjaXR5KQorICAgICAgICBhaW50TWFwX2dyb3cobWFwKTsKKworICAgIG1hcC0+a2V5c1tsaW1pdF0gICA9IGtleTsKKyAgICBtYXAtPnZhbHVlc1tsaW1pdF0gPSB2YWx1ZTsKKyAgICBtYXAtPnNpemUgKys7CisgICAgcmV0dXJuIE5VTEw7CisKK0ZPVU5EOgorICAgIHJlc3VsdCA9IG1hcC0+dmFsdWVzW2luZGV4XTsKKyAgICBtYXAtPnZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQqCithaW50TWFwX2RlbCggQUludE1hcCogbWFwLCBpbnQga2V5ICkKK3sKKyAgICBpbnQgIGluZGV4LCBsaW1pdDsKKyAgICBpbnQqIGtleXM7CisgICAgdm9pZCogcmVzdWx0ID0gTlVMTDsKKworICAgIGtleXMgID0gbWFwLT5rZXlzOworICAgIGxpbWl0ID0gbWFwLT5zaXplOworICAgIGluZGV4ID0gMDsKKyAgICBEVUZGNChsaW1pdCx7CisgICAgICAgIGlmIChrZXlzW2luZGV4XSA9PSBrZXkpCisgICAgICAgICAgICBnb3RvIEZPVU5EOworICAgICAgICBpbmRleCsrOworICAgIH0pOworICAgIHJldHVybiBOVUxMOworCitGT1VORDoKKyAgICByZXN1bHQgPSBtYXAtPnZhbHVlc1tpbmRleF07CisgICAgaWYgKGluZGV4KzEgPCBsaW1pdCkgeworICAgICAgICAvKiBNb3ZlIGxhc3QgaXRlbSB0byAnaW5kZXgnICovCisgICAgICAgIC0tbGltaXQ7CisgICAgICAgIG1hcC0+a2V5c1tpbmRleF0gPSBtYXAtPmtleXNbbGltaXRdOworICAgICAgICBtYXAtPnZhbHVlc1tpbmRleF0gPSBtYXAtPnZhbHVlc1tsaW1pdF07CisgICAgfQorICAgIG1hcC0+c2l6ZSAtPSAxOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2RlZmluZSBJVEVSX01BR0lDICAoKHZvaWQqKShwdHJkaWZmX3QpMHgxN2U4YWYxYykKKwordm9pZAorYWludE1hcEl0ZXJhdG9yX2luaXQoIEFJbnRNYXBJdGVyYXRvciogaXRlciwgQUludE1hcCogbWFwICkKK3sKKyAgICBBWkVSTyhpdGVyKTsKKyAgICBpdGVyLT5tYWdpY1swXSA9IElURVJfTUFHSUM7CisgICAgaXRlci0+bWFnaWNbMV0gPSAodm9pZCopKHB0cmRpZmZfdCkgMDsKKyAgICBpdGVyLT5tYWdpY1syXSA9IG1hcDsKKyAgICBpdGVyLT5tYWdpY1szXSA9IE5VTEw7Cit9CisKK2ludAorYWludE1hcEl0ZXJhdG9yX25leHQoIEFJbnRNYXBJdGVyYXRvciogaXRlciApCit7CisgICAgQUludE1hcCogbWFwOworICAgIGludCAgICAgIGluZGV4OworCisgICAgaWYgKGl0ZXIgPT0gTlVMTCB8fCBpdGVyLT5tYWdpY1swXSAhPSBJVEVSX01BR0lDKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1hcCAgID0gaXRlci0+bWFnaWNbMl07CisgICAgaW5kZXggPSAoaW50KShwdHJkaWZmX3QpaXRlci0+bWFnaWNbMV07CisgICAgaWYgKGluZGV4ID49IG1hcC0+c2l6ZSkgeworICAgICAgICBBWkVSTyhpdGVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaXRlci0+a2V5ICAgPSBtYXAtPmtleXNbaW5kZXhdOworICAgIGl0ZXItPnZhbHVlID0gbWFwLT52YWx1ZXNbaW5kZXhdOworCisgICAgaW5kZXggKz0gMTsKKyAgICBpdGVyLT5tYWdpY1sxXSA9ICh2b2lkKikocHRyZGlmZl90KWluZGV4OworICAgIHJldHVybiAxOworfQorCit2b2lkCithaW50TWFwSXRlcmF0b3JfZG9uZSggQUludE1hcEl0ZXJhdG9yKiBpdGVyICkKK3sKKyAgICBBWkVSTyhpdGVyKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbnRtYXAuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pbnRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmYyNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2ludG1hcC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogQSBzaW1wbGUgY29udGFpbmVyIHRoYXQgY2FuIGhvbGQgYSBzaW1wbGUgbWFwcGluZyBmcm9tIGludGVnZXJzIHRvCisgKiByZWZlcmVuY2VzLiBJLmUuIGEgZGljdGlvbmFyeSB3aGVyZSBrZXlzIGFyZSBpbnRlZ2VycywgYW5kIHZhbHVlcworICogYXJlIGxpYmVyYWwgcG9pbnRlciB2YWx1ZXMgKE5VTEwgaXMgYWxsb3dlZCkuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgQUludE1hcCAgQUludE1hcDsKKworLyogQ3JlYXRlIG5ldyBpbnRlZ2VyIG1hcCAqLworQUludE1hcCogIGFpbnRNYXBfbmV3KHZvaWQpOworCisvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBzdG9yZWQgaW4gdGhlIG1hcCAqLworaW50ICAgICAgIGFpbnRtYXBfZ2V0Q291bnQoIEFJbnRNYXAqIG1hcCApOworCisvKiBSZXR1cm5zIFRSVUUgaWYgdGhlIG1hcCBoYXMgYSB2YWx1ZSBmb3IgdGhlICdrZXknLiBOZWNlc3NhcnkgYmVjYXVzZQorICogTlVMTCBpcyBhIHZhbGlkIHZhbHVlIGZvciB0aGUgbWFwLgorICovCitpbnQgICAgICAgYWludG1hcF9oYXMoIEFJbnRNYXAqICBtYXAsIGludCBrZXkgKTsKKworLyogR2V0IHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSAna2V5Jywgb3IgTlVMTCBpZiBub3QgaW4gbWFwICovCit2b2lkKiAgICAgYWludE1hcF9nZXQoIEFJbnRNYXAqICBtYXAsIGludCAga2V5ICk7CisKKy8qIEdldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgJ2tleScsIG9yICdkZWYnIGlmIG5vdCBpbiBtYXAgKi8KK3ZvaWQqICAgICBhaW50TWFwX2dldFdpdGhEZWZhdWx0KCBBSW50TWFwKiAgbWFwLCBpbnQga2V5LCB2b2lkKiAgZGVmICk7CisKKy8qIFNldCB0aGUgdmFsdWUgYXNzb2NpYXRlZCB0byBhICdrZXknLCByZXR1cm4gdGhlIG9sZCB2YWx1ZSwgaWYgYW55LCBvciBOVUxMICovCit2b2lkKiAgICAgYWludE1hcF9zZXQoIEFJbnRNYXAqIG1hcCwgaW50IGtleSwgdm9pZCogdmFsdWUgKTsKKworLyogRGVsZXRlIGEgZ2l2ZW4gdmFsdWUgYXNzb2NpYXRlZCB0byBhICdrZXknLCByZXR1cm4gdGhlIG9sZCB2YWx1ZSwgb3IgTlVMTCAqLwordm9pZCogICAgIGFpbnRNYXBfZGVsKCBBSW50TWFwKiBtYXAsIGludCBrZXkgKTsKKworLyogRGVzdHJveSBhIGdpdmVuIGludGVnZXIgbWFwICovCit2b2lkICAgICAgYWludE1hcF9mcmVlKCBBSW50TWFwKiAgbWFwICk7CisKKy8qIEludGVnZXIgbWFwIGl0ZXJhdG9yLiBGaXJzdCBjYWxsIGFpbnRNYXBJdGVyYXRvcl9pbml0KCksIHRoZW4gY2FsbAorICogYWludE1hcEl0ZXJhdG9yX25leHQoKSB1bnRpbCBpdCByZXR1cm5zIDAuIFRoZW4gZmluaXNoIHdpdGgKKyAqIGFpbnRNYXBJdGVyYXRvcl9kb25lKCkuCisgKgorICogRXhhbXBsZToKKyAqICAgIEFJbnRNYXBJdGVyYXRvciAgaXRlclsxXTsKKyAqICAgIGFpbnRNYXBJdGVyYXRvcl9pbml0KGl0ZXIsIG1hcCk7CisgKiAgICB3aGlsZSAoYWludE1hcEl0ZXJhdG9yX25leHQoaXRlciwgJmtleSwgJnZhbHVlKSkgeworICogICAgICAgIC8vIGRvIHNvbWV0aGluZworICogICAgfQorICogICAgYWludE1hcEl0ZXJhdG9yX2RvbmUoaXRlcik7CisgKi8KK3R5cGVkZWYgc3RydWN0IEFJbnRNYXBJdGVyYXRvciB7CisgICAgaW50ICAgIGtleTsKKyAgICB2b2lkKiAgdmFsdWU7CisgICAgdm9pZCogIG1hZ2ljWzRdOworfSBBSW50TWFwSXRlcmF0b3I7CisKKy8qIEluaXRpYWxpemUgaXRlcmF0b3IuIFJldHVybnMgLTEgaWYgdGhlIG1hcCBpcyBlbXB0eSwgb3IgMCBvdGhlcndpc2UKKyAqIE9uIHN1Y2Nlc3MsIHRoZSBmaXJzdCAoa2V5LHZhbHVlKSBwYWlyIGNhbiBiZSByZWFkIGZyb20gdGhlIGl0ZXJhdG9yCisgKiBkaXJlY3RseS4KKyAqLwordm9pZCBhaW50TWFwSXRlcmF0b3JfaW5pdCggQUludE1hcEl0ZXJhdG9yKiBpdGVyLCBBSW50TWFwKiBtYXAgKTsKKworLyogUmVhZCB0aGUgbmV4dCAoa2V5LHZhbHVlKSBwYWlyIHdpdGggYW4gaXRlcmF0b3IsIHJldHVybnMgLTEgd2hlbgorICogdGhlcmUgaXNuJ3QgYW55dGhpbmcgbW9yZSwgb3IgMCBvdGhlcndpc2UuIE9uIHN1Y2Nlc3MsIHRoZSBrZXkgYW5kCisgKiB2YWx1ZSBjYW4gYmUgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBpdGVyYXRvci4KKyAqLworaW50ICBhaW50TWFwSXRlcmF0b3JfbmV4dCggQUludE1hcEl0ZXJhdG9yKiBpdGVyICk7CisKKy8qIEZpbmFsaXplIGFuIGl0ZXJhdG9yLiBUaGlzIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIHlvdSBzdG9wCisgKiB0aGUgaXRlcmF0aW9uIGJlZm9yZSBhaW50TWFwSXRlcmF0b3JfaW5pdCgpIG9yIGFpbnRNYXBJdGVyYXRvcl9uZXh0KCkKKyAqIHJldHVybiAtMS4KKyAqLwordm9pZCBhaW50TWFwSXRlcmF0b3JfZG9uZSggQUludE1hcEl0ZXJhdG9yKiBpdGVyICk7CisKKyNkZWZpbmUgQUlOVE1BUF9GT1JFQUNIX0tFWShtYXAsIGtleXZhcm5hbWUsIHN0bW50KSBcCisgICAgZG8geyBcCisgICAgICAgIEFJbnRNYXBJdGVyYXRvciAgX19haW50bWFwX2ZvcmVhY2hfaXRlclsxXTsgXAorICAgICAgICBhaW50TWFwSXRlcmF0b3JfaW5pdChfX2FpbnRtYXBfZm9yZWFjaF9pdGVyLCAobWFwKSk7IFwKKyAgICAgICAgd2hpbGUgKGFpbnRNYXBJdGVyYXRvcl9uZXh0KF9fYWludG1hcF9mb3JlYWNoX2l0ZXIpKSB7IFwKKyAgICAgICAgICAgIGludCBrZXl2YXJuYW1lID0gX19haW50bWFwX2ZvcmVhY2hfaXRlci0+a2V5OyBcCisgICAgICAgICAgICBzdG1udDsgXAorICAgICAgICB9IFwKKyAgICAgICAgYWludE1hcEl0ZXJhdG9yX2RvbmUoX19haW50bWFwX2ZvcmVhY2hfaXRlcik7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEFJTlRNQVBfRk9SRUFDSF9WQUxVRShtYXAsIHZhbHZhcm5hbWUsIHN0bW50KSBcCisgICAgZG8geyBcCisgICAgICAgIEFJbnRNYXBJdGVyYXRvciAgX19haW50bWFwX2ZvcmVhY2hfaXRlclsxXTsgXAorICAgICAgICBhaW50TWFwSXRlcmF0b3JfaW5pdChfX2FpbnRtYXBfZm9yZWFjaF9pdGVyLCAobWFwKSk7IFwKKyAgICAgICAgd2hpbGUgKGFpbnRNYXBJdGVyYXRvcl9uZXh0KF9fYWludG1hcF9mb3JlYWNoX2l0ZXIpKSB7IFwKKyAgICAgICAgICAgIHZvaWQqIHZhbHZhcm5hbWUgPSBfX2FpbnRtYXBfZm9yZWFjaF9pdGVyLT52YWx1ZTsgXAorICAgICAgICAgICAgc3RtbnQ7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGFpbnRNYXBJdGVyYXRvcl9kb25lKF9fYWludG1hcF9mb3JlYWNoX2l0ZXIpOyBcCisgICAgfSB3aGlsZSAoMCkKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaW9sb29wZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBiNWRlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaW9sb29wZXIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFdhaXRlci5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSB7CisKK1NvY2tldFdhaXRlciogYXNXYWl0ZXIoSW9Mb29wZXIqIGlvbCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNvY2tldFdhaXRlcio+KGlvbCk7Cit9CisKK3Vuc2lnbmVkIHRvV2FpdGVyRXZlbnRzKGludCBmbGFncykgeworICAgIHVuc2lnbmVkIGV2ZW50cyA9IDA7CisgICAgaWYgKGZsYWdzICYgSU9MT09QRVJfUkVBRCkgeworICAgICAgICBldmVudHMgfD0gU29ja2V0V2FpdGVyOjprRXZlbnRSZWFkOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBJT0xPT1BFUl9XUklURSkgeworICAgICAgICBldmVudHMgfD0gU29ja2V0V2FpdGVyOjprRXZlbnRXcml0ZTsKKyAgICB9CisgICAgcmV0dXJuIGV2ZW50czsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0lvTG9vcGVyKiBpb2xvb3Blcl9uZXcodm9pZCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PElvTG9vcGVyKj4oU29ja2V0V2FpdGVyOjpjcmVhdGUoKSk7Cit9CisKK3ZvaWQgaW9sb29wZXJfZnJlZShJb0xvb3BlciogIGlvbCkgeworICAgIGRlbGV0ZSBhc1dhaXRlcihpb2wpOworfQorCit2b2lkIGlvbG9vcGVyX3Jlc2V0KElvTG9vcGVyKiAgaW9sKSB7CisgICAgYXNXYWl0ZXIoaW9sKS0+cmVzZXQoKTsKK30KKwordm9pZCBpb2xvb3Blcl9tb2RpZnkoSW9Mb29wZXIqIGlvbCwgaW50IGZkLCBpbnQgb2xkZmxhZ3MsIGludCBuZXdmbGFncykgeworICAgIGFzV2FpdGVyKGlvbCktPnVwZGF0ZShmZCwgdG9XYWl0ZXJFdmVudHMobmV3ZmxhZ3MpKTsKK30KKwordm9pZCBpb2xvb3Blcl9hZGRfcmVhZChJb0xvb3BlciogaW9sLCBpbnQgZmQpIHsKKyAgICBTb2NrZXRXYWl0ZXIqIHdhaXRlciA9IGFzV2FpdGVyKGlvbCk7CisgICAgdW5zaWduZWQgZXZlbnRzID0gd2FpdGVyLT53YW50ZWRFdmVudHNGb3IoZmQpOworICAgIHdhaXRlci0+dXBkYXRlKGZkLCBldmVudHMgfCBTb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQpOworfQorCit2b2lkIGlvbG9vcGVyX2FkZF93cml0ZShJb0xvb3BlciogaW9sLCBpbnQgZmQpIHsKKyAgICBTb2NrZXRXYWl0ZXIqIHdhaXRlciA9IGFzV2FpdGVyKGlvbCk7CisgICAgdW5zaWduZWQgZXZlbnRzID0gd2FpdGVyLT53YW50ZWRFdmVudHNGb3IoZmQpOworICAgIHdhaXRlci0+dXBkYXRlKGZkLCBldmVudHMgfCBTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlKTsKK30KKwordm9pZCBpb2xvb3Blcl9kZWxfcmVhZChJb0xvb3BlciogIGlvbCwgaW50ICBmZCkgeworICAgIFNvY2tldFdhaXRlciogd2FpdGVyID0gYXNXYWl0ZXIoaW9sKTsKKyAgICB1bnNpZ25lZCBldmVudHMgPSB3YWl0ZXItPndhbnRlZEV2ZW50c0ZvcihmZCk7CisgICAgd2FpdGVyLT51cGRhdGUoZmQsIGV2ZW50cyAmIH5Tb2NrZXRXYWl0ZXI6OmtFdmVudFJlYWQpOworfQorCit2b2lkIGlvbG9vcGVyX2RlbF93cml0ZShJb0xvb3BlciogIGlvbCwgaW50ICBmZCkgeworICAgIFNvY2tldFdhaXRlciogd2FpdGVyID0gYXNXYWl0ZXIoaW9sKTsKKyAgICB1bnNpZ25lZCBldmVudHMgPSB3YWl0ZXItPndhbnRlZEV2ZW50c0ZvcihmZCk7CisgICAgd2FpdGVyLT51cGRhdGUoZmQsIGV2ZW50cyAmIH5Tb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlKTsKK30KKworaW50IGlvbG9vcGVyX3dhaXQoSW9Mb29wZXIqIGlvbCwgaW50NjRfdCAgZHVyYXRpb24pIHsKKyAgICByZXR1cm4gYXNXYWl0ZXIoaW9sKS0+d2FpdChkdXJhdGlvbik7Cit9CisKK2ludCBpb2xvb3Blcl9pc19yZWFkKElvTG9vcGVyKiBpb2wsIGludCBmZCkgeworICAgIHJldHVybiBhc1dhaXRlcihpb2wpLT5wZW5kaW5nRXZlbnRzRm9yKGZkKSAmIFNvY2tldFdhaXRlcjo6a0V2ZW50UmVhZDsKK30KKworaW50IGlvbG9vcGVyX2lzX3dyaXRlKElvTG9vcGVyKiBpb2wsIGludCAgZmQpIHsKKyAgICByZXR1cm4gYXNXYWl0ZXIoaW9sKS0+cGVuZGluZ0V2ZW50c0ZvcihmZCkgJiBTb2NrZXRXYWl0ZXI6OmtFdmVudFdyaXRlOworfQorCitpbnQgaW9sb29wZXJfaGFzX29wZXJhdGlvbnMoSW9Mb29wZXIqIGlvbCkgeworICAgIHJldHVybiBhc1dhaXRlcihpb2wpLT5oYXNGZHMoKTsKK30KKworaW50NjRfdCBpb2xvb3Blcl9ub3codm9pZCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVfbm93OworICAgIHJldHVybiBnZXR0aW1lb2ZkYXkoJnRpbWVfbm93LCBOVUxMKSA/IC0xIDogKGludDY0X3QpdGltZV9ub3cudHZfc2VjICogMTAwMExMICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfbm93LnR2X3VzZWMgLyAxMDAwOworfQorCitpbnQgaW9sb29wZXJfd2FpdF9hYnNvbHV0ZShJb0xvb3BlciogaW9sLCBpbnQ2NF90IGRlYWRsaW5lKSB7CisgICAgaW50NjRfdCB0aW1lb3V0ID0gZGVhZGxpbmUgLSBpb2xvb3Blcl9ub3coKTsKKworICAgIC8qIElmIHRoZSBkZWFkbGluZSBoYXMgcGFzc2VkLCBzZXQgdGhlIHRpbWVvdXQgdG8gMCwgdGhpcyBhbGxvd3MgdXMKKyAgICAgKiB0byBwb2xsIHRoZSBmaWxlIGRlc2NyaXB0b3Igbm9uZXRoZWxlc3MgKi8KKyAgICBpZiAodGltZW91dCA8IDApCisgICAgICAgIHRpbWVvdXQgPSAwOworCisgICAgcmV0dXJuIGlvbG9vcGVyX3dhaXQoaW9sLCB0aW1lb3V0KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pb2xvb3Blci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZmJlZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pb2xvb3Blci5oCkBAIC0wLDAgKzEsNzEgQEAKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIEFuIElPTG9vcGVyIGlzIGFuIGFic3RyYWN0aW9uIGZvciBzZWxlY3QoKSAqLworCit0eXBlZGVmIHN0cnVjdCBJb0xvb3BlciAgSW9Mb29wZXI7CisKK0lvTG9vcGVyKiAgaW9sb29wZXJfbmV3KHZvaWQpOwordm9pZCAgICAgICBpb2xvb3Blcl9mcmVlKCBJb0xvb3BlciogIGlvbCApOwordm9pZCAgICAgICBpb2xvb3Blcl9yZXNldCggSW9Mb29wZXIqICBpb2wgKTsKKwordm9pZCAgICAgICBpb2xvb3Blcl9hZGRfcmVhZCggSW9Mb29wZXIqICBpb2wsIGludCAgZmQgKTsKK3ZvaWQgICAgICAgaW9sb29wZXJfYWRkX3dyaXRlKCBJb0xvb3BlciogIGlvbCwgaW50ICBmZCApOwordm9pZCAgICAgICBpb2xvb3Blcl9kZWxfcmVhZCggSW9Mb29wZXIqICBpb2wsIGludCAgZmQgKTsKK3ZvaWQgICAgICAgaW9sb29wZXJfZGVsX3dyaXRlKCBJb0xvb3BlciogIGlvbCwgaW50ICBmZCApOworCitlbnVtIHsKKyAgICBJT0xPT1BFUl9SRUFEID0gKDE8PDApLAorICAgIElPTE9PUEVSX1dSSVRFID0gKDE8PDEpLAorfTsKK3ZvaWQgICAgICAgaW9sb29wZXJfbW9kaWZ5KCBJb0xvb3BlciogIGlvbCwgaW50IGZkLCBpbnQgb2xkZmxhZ3MsIGludCBuZXdmbGFncyk7CisKK2ludCAgICAgICAgaW9sb29wZXJfcG9sbCggSW9Mb29wZXIqICBpb2wgKTsKKy8qIFdyYXBwZXIgYXJvdW5kIHNlbGVjdCgpCisgKiBSZXR1cm46CisgKiAgPiAwIGluIGNhc2UgYW4gSS9PIGhhcyBvY2N1cnJlZCwgb3IgPCAwIG9uIGVycm9yLCBvciAwIG9uIHRpbWVvdXQgd2l0aAorICogIGVycm5vIHNldCB0byBFVElNRURPVVQuCisgKi8KK2ludCAgICAgICAgaW9sb29wZXJfd2FpdCggSW9Mb29wZXIqICBpb2wsIGludDY0X3QgIGR1cmF0aW9uICk7CisKK2ludCAgICAgICAgaW9sb29wZXJfaXNfcmVhZCggSW9Mb29wZXIqICBpb2wsIGludCAgZmQgKTsKK2ludCAgICAgICAgaW9sb29wZXJfaXNfd3JpdGUoIElvTG9vcGVyKiAgaW9sLCBpbnQgIGZkICk7CisvKiBSZXR1cm5zIDEgaWYgdGhpcyBJb0xvb3BlciBoYXMgb25lIG9yIG1vcmUgZmlsZSBkZXNjcmlwdG9yIHRvIGludGVyYWN0IHdpdGggKi8KK2ludCAgICAgICAgaW9sb29wZXJfaGFzX29wZXJhdGlvbnMoIElvTG9vcGVyKiAgaW9sICk7CisvKiBHZXRzIGN1cnJlbnQgdGltZSBpbiBtaWxsaXNlY29uZHMuCisgKiBSZXR1cm46CisgKiAgTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBjb3JyZXNwb25kZWQgdG8gdGhlIGN1cnJlbnQgdGltZSBvbiBzdWNjZXNzLCBvciAtMQorICogIG9uIGZhaWx1cmUuCisgKi8KK2ludDY0X3QgICAgaW9sb29wZXJfbm93KHZvaWQpOworLyogV2FpdHMgZm9yIGFuIEkvTyB0byBvY2N1ciBiZWZvcmUgc3BlY2lmaWMgYWJzb2x1dGUgdGltZS4KKyAqIFRoaXMgcm91dGluZSBzaG91bGQgYmUgdXNlZCAoaW5zdGVhZCBvZiBpb2xvb3Blcl93YWl0KSBpbiBjYXNlcyB3aGVuIG11bHRpcGxlCisgKiBzZXF1ZW50aWFsIEkvTyBzaG91bGQgYmUgY29tcGxldGVkIHdpdGhpbiBnaXZlbiB0aW1lIGludGVydmFsLiBGb3IgaW5zdGFuY2UsCisgKiBjb25zaWRlciB0aGUgc2NlbmFyaW8sIHdoZW4gInNlcnZlciIgZG9lcyB0d28gc2VxdWVudGlhbCB3cml0ZXMsIGFuZCAiY2xpZW50IgorICogbm93IGhhcyB0byByZWFkIGRhdGEgdHJhbnNmZXJyZWQgd2l0aCB0aGVzZSB0d28gZGlzdGluY3Qgd3JpdGVzLiBJdCBtaWdodCBiZQorICogd2FzdGVmdWwgdG8gZG8gdHdvIHJlYWRzLCBlYWNoIHdpdGggdGhlIHNhbWUgKGxhcmdlKSB0aW1lb3V0LiBJbnN0ZWFkLCBpdAorICogd291bGQgYmUgYmV0dGVyIHRvIGFzc2lnbiBhIGRlYWRsaW5lIGZvciBib3RoIHJlYWRzIGJlZm9yZSB0aGUgZmlyc3QgcmVhZCwKKyAqIGFuZCBjYWxsIGlvbG9vcGVyX3dhaXRfYWJzb3VsdGUgd2l0aCB0aGUgc2FtZSBkZWFkbGluZSB2YWx1ZToKKyAqICBpbnQ2NF90IGRlYWRsaW5lID0gaW9sb29wZXJfbm93KCkgKyBUSU1FT1VUOworICogIGlmIChpb2xvb3Blcl93YWl0X2Fic291bHRlKGlvbCwgZGVhZGxpbmUpKSB7CisgKiAgICAgIC8vIFByb2Nlc3MgZmlyc3QgYnVmZmVyLgorICogICAgICAoaW9sb29wZXJfd2FpdF9hYnNvdWx0ZShpb2wsIGRlYWRsaW5lKSkgeworICogICAgICAgICAgLy8gUHJvY2VzcyBzZWNvbmQgcmVhZAorICogICAgICB9CisgKiAgfQorICogUGFyYW06CisgKiAgaW9sIElvTG9vcGVyIGluc3RhbmNlIGZvciBhbiBJL08uCisgKiAgZGVhZGxpbmUgRGVhZGxpbmUgKGFic291bHRlIHRpbWUgaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgd2hpY2ggYW4gSS9PIHNob3VsZAorICogICAgICBvY2N1ci4KKyAqIFJldHVybjoKKyAqICBOdW1iZXIgb2YgSS9PIGRlc2NyaXB0b3JzIHNldCBpbiBpb2wsIGlmIGFuIEkvTyBoYXMgb2NjdXJyZWQsIDAgaWYgbm8gSS9PCisgKiAgb2NjdXJyZWQgYmVmb3JlIHRoZSBkZWFkbGluZSwgb3IgLTEgb24gZXJyb3IuCisgKi8KK2ludCBpb2xvb3Blcl93YWl0X2Fic29sdXRlKElvTG9vcGVyKiBpb2wsIGludDY0X3QgZGVhZGxpbmUpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pcGFkZHIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2lwYWRkci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhYjAzOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pcGFkZHIuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9pcGFkZHIuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9uZXR3b3JrL0lwQWRkcmVzcy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IGluZXRfc3RydG9pcChjb25zdCBjaGFyKiBzdHIsIHVpbnQzMl90KiBpcCkKK3sKKyAgICBhbmRyb2lkOjpiYXNlOjpJcEFkZHJlc3MgYWRkcihzdHIpOworICAgIGlmICghYWRkci5pc0lwdjQoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICppcCA9IGFkZHIuaXB2NCgpOworICAgIHJldHVybiAwOworfQorCitjaGFyKiBpbmV0X2lwdG9zdHIodWludDMyX3QgaXApCit7CisgICAgc3RhdGljIGNoYXIgYnVmZlszMl07CisKKyAgICBzbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksICIlZC4lZC4lZC4lZCIsCisgICAgICAgICAgICAgKGlwID4+IDI0KSAmIDI1NSwKKyAgICAgICAgICAgICAoaXAgPj4gMTYpICYgMjU1LAorICAgICAgICAgICAgIChpcCA+PiA4KSAmIDI1NSwKKyAgICAgICAgICAgICBpcCAmIDI1NSk7CisgICAgcmV0dXJuIGJ1ZmY7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaXBhZGRyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvaXBhZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjYWQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9pcGFkZHIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gY29udmVydCBhbiBJUHY0IHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBpbnQKKy8vIHJldHVybnMgMCBvbiBzdWNjZXNzCitpbnQgaW5ldF9zdHJ0b2lwKGNvbnN0IGNoYXIqIHN0ciwgdWludDMyX3QqIGlwKTsKKworLy8gY29udmVydCBhbiBJUHY0IHRvIGEgc3RyaW5nCisvLyByZXR1cm5zIGEgc3RhdGljIHN0cmluZyBidWZmZXIKK2NoYXIqIGluZXRfaXB0b3N0cih1aW50MzJfdCBpcCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xpbmVpbnB1dC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xpbmVpbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGE1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbGluZWlucHV0LmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYXNzZXJ0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9saW5laW5wdXQuaCIKKworc3RydWN0IExpbmVJbnB1dCB7CisgICAgY2hhciogICBsaW5lOworICAgIHNpemVfdCAgbGluZV9zaXplOworICAgIGludCAgICAgbGluZV9udW07CisgICAgaW50ICAgICBlcnJvcjsKKyAgICBpbnQgICAgIGVvZjsKKworICAgIHN0cnVjdCB7CisgICAgICAgIEZJTEUqICBmaWxlOworICAgIH0gc3RkOworCisgICAgY2hhciAgICBsaW5lMFsxMjhdOworfTsKKworLyogRXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgdGhlIGludGVybmFsIGxpbmUgcmVhZGluZyBmdW5jdGlvbihzKSAqLworZW51bSB7CisgICAgTElORUlOUFVUX0VSUk9SID0gLTEsCisgICAgTElORUlOUFVUX0VPRiA9IC0yLAorfTsKKworCitzdGF0aWMgTGluZUlucHV0KgorX2xpbmVJbnB1dF9uZXcoIHZvaWQgKQoreworICAgIExpbmVJbnB1dCogIGlucHV0OworCisgICAgQU5FVzAoaW5wdXQpOworICAgIGlucHV0LT5saW5lICAgICAgPSBpbnB1dC0+bGluZTA7CisgICAgaW5wdXQtPmxpbmVfc2l6ZSA9IHNpemVvZihpbnB1dC0+bGluZTApOworCisgICAgcmV0dXJuIGlucHV0OworfQorCisvKiBDcmVhdGUgYSBMaW5lSW5wdXQgb2JqZWN0IHRoYXQgcmVhZHMgZnJvbSBhIEZJTEUqIG9iamVjdCAqLworTGluZUlucHV0KgorbGluZUlucHV0X25ld0Zyb21TdGRGaWxlKCBGSUxFKiBmaWxlICkKK3sKKyAgICBMaW5lSW5wdXQqIGlucHV0ID0gX2xpbmVJbnB1dF9uZXcoKTsKKworICAgIGlucHV0LT5zdGQuZmlsZSA9IGZpbGU7CisgICAgcmV0dXJuIGlucHV0OworfQorCisvKiBHcm93IHRoZSBsaW5lIGJ1ZmZlciBhIGJpdCAqLworc3RhdGljIHZvaWQKK19saW5lSW5wdXRfZ3JvdyggTGluZUlucHV0KiBpbnB1dCApCit7CisgICAgY2hhciogIGxpbmU7CisgICAgY2hhciBncm93X2Zyb21fbGluZTAgPSAwOworCisgICAgaW5wdXQtPmxpbmVfc2l6ZSArPSBpbnB1dC0+bGluZV9zaXplID4+IDE7CisgICAgbGluZSA9IGlucHV0LT5saW5lOworICAgIGlmIChsaW5lID09IGlucHV0LT5saW5lMCkgeworICAgICAgICBncm93X2Zyb21fbGluZTAgPSAxOworICAgICAgICBsaW5lID0gTlVMTDsKKyAgICB9CisgICAgQUFSUkFZX1JFTkVXKGxpbmUsIGlucHV0LT5saW5lX3NpemUpOworICAgIGlmIChncm93X2Zyb21fbGluZTApIHsKKyAgICAgICAgbWVtY3B5KGxpbmUsIGlucHV0LT5saW5lMCwgc2l6ZW9mKGlucHV0LT5saW5lMCkpOworICAgIH0KKyAgICBpbnB1dC0+bGluZSA9IGxpbmU7Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgX2xpbmVJbnB1dF9nZXRMaW5lRnJvbVN0ZEZpbGUoIExpbmVJbnB1dCogaW5wdXQsIEZJTEUqIGZpbGUgKTsKKworY29uc3QgY2hhcioKK2xpbmVJbnB1dF9nZXRMaW5lKCBMaW5lSW5wdXQqIGlucHV0ICkKK3sKKyAgICByZXR1cm4gbGluZUlucHV0X2dldExpbmVBbmRTaXplKGlucHV0LCBOVUxMKTsKK30KKworY29uc3QgY2hhcioKK2xpbmVJbnB1dF9nZXRMaW5lQW5kU2l6ZSggTGluZUlucHV0KiBpbnB1dCwgc2l6ZV90ICpwU2l6ZSApCit7CisgICAgaW50IHJldDsKKworICAgIC8qIGJlIHNhZmUgKi8KKyAgICBpZiAocFNpemUpCisgICAgICAgICpwU2l6ZSA9IDA7CisKKyAgICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCisgICAgaWYgKGlucHV0ID09IE5VTEwpIHsKKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGNoZWNrIHN0YXRlICovCisgICAgaWYgKGlucHV0LT5lcnJvcikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGlucHV0LT5lb2YpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gX2xpbmVJbnB1dF9nZXRMaW5lRnJvbVN0ZEZpbGUoaW5wdXQsIGlucHV0LT5zdGQuZmlsZSk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIGlucHV0LT5saW5lX251bSArPSAxOworICAgICAgICBpZiAocFNpemUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnBTaXplID0gcmV0OworICAgICAgICAgICAgcmV0dXJuIGlucHV0LT5saW5lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnB1dC0+bGluZTsKKyAgICB9CisgICAgaWYgKHJldCA9PSBMSU5FSU5QVVRfRU9GKSB7CisgICAgICAgIGlucHV0LT5saW5lX251bSArPSAxOworICAgICAgICBpbnB1dC0+ZW9mID0gMTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZXQgPT0gTElORUlOUFVUX0VSUk9SKSB7CisgICAgICAgIGlucHV0LT5lcnJvciA9IGVycm5vOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQUFTU0VSVF9VTlJFQUNIRUQoKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxpbmUgcmVhZCBieSBsaW5lSW5wdXRfZ2V0TGluZSAqLworaW50CitsaW5lSW5wdXRfZ2V0TGluZU51bWJlciggTGluZUlucHV0KiBpbnB1dCApCit7CisgICAgcmV0dXJuIGlucHV0LT5saW5lX251bTsKK30KKworLyogUmV0dXJucyBUUlVFIGlmZiB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQgKi8KK2ludAorbGluZUlucHV0X2lzRW9mKCBMaW5lSW5wdXQqIGlucHV0ICkKK3sKKyAgICByZXR1cm4gKGlucHV0LT5lb2YgIT0gMCk7Cit9CisKKy8qIFJldHVybiB0aGUgZXJyb3IgY29uZGl0aW9uIG9mIGEgTGluZUlucHV0IG9iamVjdC4KKyAqIFRoZXNlIGFyZSBzdGFuZGFyZCBlcnJubyBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24uCisgKiBOb3RlOiBFT0YgY29ycmVzcG9uZHMgdG8gMCBoZXJlLgorICovCitpbnQKK2xpbmVJbnB1dF9nZXRFcnJvciggTGluZUlucHV0KiBpbnB1dCApCit7CisgICAgcmV0dXJuIGlucHV0LT5lcnJvcjsKK30KKwordm9pZAorbGluZUlucHV0X2ZyZWUoIExpbmVJbnB1dCogaW5wdXQgKQoreworICAgIGlmIChpbnB1dCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChpbnB1dC0+bGluZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoaW5wdXQtPmxpbmUgIT0gaW5wdXQtPmxpbmUwKQorICAgICAgICAgICAgICAgIEFGUkVFKGlucHV0LT5saW5lKTsKKyAgICAgICAgICAgIGlucHV0LT5saW5lID0gTlVMTDsKKyAgICAgICAgICAgIGlucHV0LT5saW5lX3NpemUgPSAwOworICAgICAgICB9CisgICAgICAgIEFGUkVFKGlucHV0KTsKKyAgICB9Cit9CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgbmV3IGxpbmUgZnJvbSBhIEZJTEUqIHVzaW5nIGZnZXRzKCkuCisgKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyBmZ2V0YygpIGluIGEgbG9vcC4KKyAqCisgKiBSZXR1cm4gbGVuZ3RoIG9mIGxpbmUsIG9yIGVpdGhlciBMSU5FSU5QVVRfRU9GIC8gTElORUlOUFVUX0VSUk9SCisgKi8KK3N0YXRpYyBpbnQKK19saW5lSW5wdXRfZ2V0TGluZUZyb21TdGRGaWxlKCBMaW5lSW5wdXQqIGlucHV0LCBGSUxFKiBmaWxlICkKK3sKKyAgICBpbnQgICBvZmZzZXQgPSAwOworICAgIGNoYXIqIHA7CisKKyAgICBpbnB1dC0+bGluZVswXSA9ICdcMCc7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIqIGJ1ZmZlciA9IGlucHV0LT5saW5lICsgb2Zmc2V0OworICAgICAgICBpbnQgICBhdmFpbCAgPSBpbnB1dC0+bGluZV9zaXplIC0gb2Zmc2V0OworCisgICAgICAgIGlmICghZmdldHMoYnVmZmVyLCBhdmFpbCwgZmlsZSkpIHsKKyAgICAgICAgICAgIC8qIFdlIGVpdGhlciByZWFjaGVkIHRoZSBlbmQgb2YgZmlsZSBvciBhbiBpL28gZXJyb3Igb2NjdXJlZC4KKyAgICAgICAgICAgICAqIElmIHdlIGFscmVhZHkgcmVhZCBsaW5lIGRhdGEsIGp1c3QgcmV0dXJuIGl0IHRoaXMgdGltZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBJTlBVVF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZpbmQgdGhlIHRlcm1pbmF0aW5nIHplcm8gKi8KKyAgICAgICAgcCA9IG1lbWNocihidWZmZXIsICdcMCcsIGF2YWlsKTsKKyAgICAgICAgQUFTU0VSVChwICE9IE5VTEwpOworCisgICAgICAgIGlmIChwID09IGJ1ZmZlcikgeworICAgICAgICAgICAgLyogVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGZpbGUgaGFzIGFuIGVtYmVkZGVkICdcMCcsIHRyZWF0IGl0CisgICAgICAgICAgICAgKiBhcyBhbiBlb2YsIG9yIGJhZCB0aGluZ3MgdXN1YWxseSBoYXBwZW4gYWZ0ZXIgdGhhdC4gKi8KKyAgICAgICAgICAgIGlucHV0LT5lb2YgPSAxOworICAgICAgICAgICAgaWYgKG9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTElORUlOUFVUX0VPRjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwWy0xXSAhPSAnXG4nICYmIHBbLTFdICE9ICdccicpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIG91ciBjdXJyZW50IGJ1ZmZlciwKKyAgICAgICAgICAgICogc28gZ3JvdyBpdHMgc2l6ZSBhbmQgdHJ5IGFnYWluLiAqLworICAgICAgICAgICAgb2Zmc2V0ID0gcCAtIGlucHV0LT5saW5lOworICAgICAgICAgICAgX2xpbmVJbnB1dF9ncm93KGlucHV0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogR2V0IHJpZCBvZiB0cmFpbGluZyBuZXdsaW5lKHMpLiBDb25zaWRlcjogXG4sIFxyLCBhbmQgXHJcbiAqLworICAgIGlmIChwWy0xXSA9PSAnXG4nKSB7CisgICAgICAgIHAgLT0gMTsKKyAgICAgICAgaWYgKHAgPiBpbnB1dC0+bGluZSAmJiBwWy0xXSA9PSAnXHInKSB7CisgICAgICAgICAgICBwIC09IDE7CisgICAgICAgIH0KKyAgICAgICAgcFswXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgaWYgKHBbLTFdID09ICdccicpIHsKKyAgICAgICAgcCAtPSAxOworICAgICAgICBwWzBdID0gJ1wwJzsKKyAgICB9CisKKyAgICAvKiBXZSBkaWQgaXQgKi8KKyAgICByZXR1cm4gKHAgLSBpbnB1dC0+bGluZSk7CisKK0lOUFVUX0VSUk9SOgorICAgIGlmIChmZW9mKGZpbGUpKSB7CisgICAgICAgIGlucHV0LT5lb2YgPSAxOworICAgICAgICByZXR1cm4gTElORUlOUFVUX0VPRjsKKyAgICB9CisgICAgaW5wdXQtPmVycm9yID0gZXJybm87CisgICAgcmV0dXJuIExJTkVJTlBVVF9FUlJPUjsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xpbmVpbnB1dC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xpbmVpbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NWRjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbGluZWlucHV0LmgKQEAgLTAsMCArMSw2MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBBIExpbmVJbnB1dCBpcyB1c2VkIHRvIHJlYWQgaW5wdXQgdGV4dCwgb25lIGxpbmUgYXQgYSB0aW1lLAorICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIgb3duZXIgYnkgdGhlIExpbmVJbnB1dCBvYmplY3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IExpbmVJbnB1dCBMaW5lSW5wdXQ7CisKKy8qIENyZWF0ZSBhIExpbmVJbnB1dCBvYmplY3QgdGhhdCByZWFkcyBmcm9tIGEgRklMRSogb2JqZWN0ICovCitMaW5lSW5wdXQqICBsaW5lSW5wdXRfbmV3RnJvbVN0ZEZpbGUoIEZJTEUqIGZpbGUgKTsKKworLyogUmVhZCBuZXh0IGxpbmUgZnJvbSBpbnB1dC4gVGhlIHJlc3VsdCBpcyB6ZXJvLXRlcm1pbmF0ZWQgd2l0aAorICogYWxsIG5ld2xpbmVzIHJlbW92ZWQgKFxuLCBcciBvciBcclxuKSBhdXRvbWF0aWNhbGx5LgorICoKKyAqIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yLCBvciB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkLgorICogU2VlIGxpbmVJbnB1dF9pc0VvZigpIGFuZCBsaW5lSW5wdXRfZ2V0RXJyb3IoKQorICoKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIExpbmVJbnB1dCBvYmplY3QgYW5kIGl0cworICogdmFsdWUgd2lsbCBub3QgcGVyc2lzdCBhbnkgb3RoZXIgY2FsbCB0byBhbnkgTGluZUlucHV0IGZ1bmN0aW9ucy4KKyAqLworY29uc3QgY2hhciogbGluZUlucHV0X2dldExpbmUoIExpbmVJbnB1dCogaW5wdXQgKTsKKworLyogU2FtZSBhcyBsaW5lSW5wdXRfZ2V0TGluZSgpLCBidXQgYWxzbyByZXR1cm5zIHRoZSBsaW5lIHNpemUgaW50bworICogJypwU2l6ZScgdG8gc2F2ZSB5b3UgYSBzdHJsZW4oKSBjYWxsLgorICovCitjb25zdCBjaGFyKiBsaW5lSW5wdXRfZ2V0TGluZUFuZFNpemUoIExpbmVJbnB1dCogaW5wdXQsIHNpemVfdCAqcFNpemUgKTsKKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxpbmUgcmVhZCBieSBsaW5lSW5wdXRfZ2V0TGluZSAqLworaW50IGxpbmVJbnB1dF9nZXRMaW5lTnVtYmVyKCBMaW5lSW5wdXQqIGlucHV0ICk7CisKKy8qIFJldHVybnMgVFJVRSBpZmYgdGhlIGVuZCBvZiBmaWxlIHdhcyByZWFjaGVkICovCitpbnQgbGluZUlucHV0X2lzRW9mKCBMaW5lSW5wdXQqIGlucHV0ICk7CisKKy8qIFJldHVybiB0aGUgZXJyb3IgY29uZGl0aW9uIG9mIGEgTGluZUlucHV0IG9iamVjdC4KKyAqIFRoZXNlIGFyZSBzdGFuZGFyZCBlcnJubyBjb2RlIGZvciB0aGUgbGFzdCBvcGVyYXRpb24uCisgKiBOb3RlOiBFT0YgY29ycmVzcG9uZHMgdG8gMCBoZXJlLgorICovCitpbnQgbGluZUlucHV0X2dldEVycm9yKCBMaW5lSW5wdXQqIGlucHV0ICk7CisKKy8qIEZyZWUgYSBMaW5lSW5wdXQgb2JqZWN0LiAqLwordm9pZCBsaW5lSW5wdXRfZnJlZSggTGluZUlucHV0KiBpbnB1dCApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9saXN0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjFhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbGlzdC5oCkBAIC0wLDAgKzEsMTE2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIEVuY2Fwc3VsYXRlcyBhIGRvdWJsZS1saW5rZWQsIGNpcmN1bGFyIGxpc3QuCisgKiBUaGUgbGlzdCBpcyBvcmdhbml6ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgKiAtIExpc3QgZW50cmllcyBjb250YWluIHJlZmVyZW5jZXMgdG8gdGhlIG5leHQsIGFuZCB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlCisgKiAgIGxpc3QuCisgKiAtIFRoZSBsaXN0IGlzIGNpcmN1bGFyLCBpLmUuIHRoZSAibGFzdCIgbGlzdCBlbnRyeSByZWZlcmVuY2VzIHRoZSAibGlzdCBoZWFkIgorICogICBpbiBpdHMgJ25leHQnIHJlZmVyZW5jZSwgYW5kIHRoZSAibGlzdCBoZWFkIiByZWZlcmVuY2VzIHRoZSAibGFzdCIgZW50cnkgaW4KKyAqICAgaXRzICdwcmV2aW91cycgcmVmZXJlbmNlLgorICogLSBUaGUgbGlzdCBpcyBlbXB0eSBpZiBpdHMgJ25leHQnIGFuZCAncHJldmlvdXMnIHJlZmVyZW5jZXMgYXJlIGFkZHJlc3NpbmcgdGhlCisgKiAgIGhlYWQgb2YgdGhlIGxpc3QuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDTGlzdCBBQ0xpc3Q7CitzdHJ1Y3QgQUNMaXN0IHsKKyAgICAvKiBOZXh0IGVudHJ5IGluIHRoZSBsaXN0ICovCisgICAgQUNMaXN0KiAgbmV4dDsKKyAgICAvKiBQcmV2aW91cyBlbnRyeSBpbiB0aGUgbGlzdCAqLworICAgIEFDTGlzdCogIHByZXY7Cit9OworCisvKiBJbml0aWFsaXplcyB0aGUgbGlzdC4gKi8KK0FJTkxJTkVEIHZvaWQKK2FsaXN0X2luaXQoQUNMaXN0KiBsaXN0KQoreworICAgIGxpc3QtPm5leHQgPSBsaXN0LT5wcmV2ID0gbGlzdDsKK30KKworLyogQ2hlY2tzIGlmIHRoZSBsaXN0IGlzIGVtcHR5LiAqLworQUlOTElORUQgaW50CithbGlzdF9pc19lbXB0eShjb25zdCBBQ0xpc3QqIGxpc3QpCit7CisgICAgcmV0dXJuIGxpc3QtPm5leHQgPT0gbGlzdDsKK30KKworLyogSW5zZXJ0cyBhbiBlbnRyeSB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworQUlOTElORUQgdm9pZAorYWxpc3RfaW5zZXJ0X2hlYWQoQUNMaXN0KiBsaXN0LCBBQ0xpc3QqIGVudHJ5KQoreworICAgIEFDTGlzdCogY29uc3QgbmV4dCA9IGxpc3QtPm5leHQ7CisgICAgZW50cnktPm5leHQgPSBuZXh0OworICAgIGVudHJ5LT5wcmV2ID0gbGlzdDsKKyAgICBuZXh0LT5wcmV2ID0gZW50cnk7CisgICAgbGlzdC0+bmV4dCA9IGVudHJ5OworfQorLyogSW5zZXJ0cyBhbiBlbnRyeSB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdCAqLworQUlOTElORUQgdm9pZAorYWxpc3RfaW5zZXJ0X3RhaWwoQUNMaXN0KiBsaXN0LCBBQ0xpc3QqIGVudHJ5KQoreworICAgIEFDTGlzdCogY29uc3QgcHJldiA9IGxpc3QtPnByZXY7CisgICAgZW50cnktPm5leHQgPSBsaXN0OworICAgIGVudHJ5LT5wcmV2ID0gcHJldjsKKyAgICBwcmV2LT5uZXh0ID0gZW50cnk7CisgICAgbGlzdC0+cHJldiA9IGVudHJ5OworfQorCisvKiBSZW1vdmVzIGFuIGVudHJ5IGZyb20gdGhlIGxpc3QuIE5PVEU6IEVudHJ5IG11c3QgYmUgaW4gdGhlIGxpc3Qgd2hlbiB0aGlzCisgKiByb3V0aW5lIGlzIGNhbGxlZC4gKi8KK0FJTkxJTkVEIHZvaWQKK2FsaXN0X3JlbW92ZShBQ0xpc3QqIGVudHJ5KQoreworICAgIEFDTGlzdCogY29uc3QgbmV4dCA9IGVudHJ5LT5uZXh0OworICAgIEFDTGlzdCogY29uc3QgcHJldiA9IGVudHJ5LT5wcmV2OworICAgIHByZXYtPm5leHQgPSBuZXh0OworICAgIG5leHQtPnByZXYgPSBwcmV2OworICAgIGVudHJ5LT5uZXh0ID0gZW50cnktPnByZXYgPSBlbnRyeTsKK30KKworLyogUmV0dXJucyBhbiBlbnRyeSByZW1vdmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuIElmIHRoZSBsaXN0IHdhcyBlbXB0eSwKKyAqIHRoaXMgcm91dGluZSByZXR1cm5zIE5VTEwuICovCitBSU5MSU5FRCBBQ0xpc3QqCithbGlzdF9yZW1vdmVfaGVhZChBQ0xpc3QqIGxpc3QpCit7CisgICAgQUNMaXN0KiBlbnRyeSA9IE5VTEw7CisgICAgaWYgKCFhbGlzdF9pc19lbXB0eShsaXN0KSkgeworICAgICAgICBlbnRyeSA9IGxpc3QtPm5leHQ7CisgICAgICAgIGxpc3QtPm5leHQgPSBlbnRyeS0+bmV4dDsKKyAgICAgICAgZW50cnktPm5leHQtPnByZXYgPSBsaXN0OworICAgICAgICBlbnRyeS0+bmV4dCA9IGVudHJ5LT5wcmV2ID0gZW50cnk7CisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworLyogUmV0dXJucyBhbiBlbnRyeSByZW1vdmVkIGZyb20gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIElmIHRoZSBsaXN0IHdhcyBlbXB0eSwKKyAqIHRoaXMgcm91dGluZSByZXR1cm5zIE5VTEwuICovCitBSU5MSU5FRCBBQ0xpc3QqCithbGlzdF9yZW1vdmVfdGFpbChBQ0xpc3QqIGxpc3QpCit7CisgICAgQUNMaXN0KiBlbnRyeSA9IE5VTEw7CisgICAgaWYgKCFhbGlzdF9pc19lbXB0eShsaXN0KSkgeworICAgICAgICBlbnRyeSA9IGxpc3QtPnByZXY7CisgICAgICAgIGxpc3QtPnByZXYgPSBlbnRyeS0+cHJldjsKKyAgICAgICAgZW50cnktPnByZXYtPm5leHQgPSBsaXN0OworICAgICAgICBlbnRyeS0+bmV4dCA9IGVudHJ5LT5wcmV2ID0gZW50cnk7CisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbG9jay5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5MDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9sb2NrLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9jay5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxvY2s7CisKK3N0YXRpYyBMb2NrKiBhc0Jhc2VMb2NrKENMb2NrKiBsKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TG9jayo+KGwpOworfQorCitDTG9jayogYW5kcm9pZF9sb2NrX25ldygpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDTG9jayo+KG5ldyBMb2NrKCkpOworfQorCit2b2lkIGFuZHJvaWRfbG9ja19hY3F1aXJlKENMb2NrKiBsKSB7CisgICAgaWYgKGwpIHsKKyAgICAgICAgYXNCYXNlTG9jayhsKS0+bG9jaygpOworICAgIH0KK30KKwordm9pZCBhbmRyb2lkX2xvY2tfcmVsZWFzZShDTG9jayogbCkgeworICAgIGlmIChsKSB7CisgICAgICAgIGFzQmFzZUxvY2sobCktPnVubG9jaygpOworICAgIH0KK30KKwordm9pZCBhbmRyb2lkX2xvY2tfZnJlZShDTG9jayogbCkgeworICAgIGRlbGV0ZSBhc0Jhc2VMb2NrKGwpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xvY2suaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1NzQyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9sb2NrLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBBIHRoaW4gd3JhcHBlciBhcm91bmQgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbG9ja3MuCisvLyBUaGlzIGhlYWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGxlZ2FjeSBDIGNvZGUuICBBbG1vc3QgYWx3YXlzLCB5b3Ugd2FudAorLy8gc29tZXRoaW5nIGVsc2U6CisvLyAtIEFuZHJvaWRFbXUgc2hvdWxkIG1vc3RseSBiZSBjKyssIGFuZCB1c2UKKy8vICAgYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgKKy8vIC0gUWVtdSBjb2RlIHNob3VsZCB1c2UgcWVtdSdzIG93biBwbGF0Zm9ybSBpbmRlcGVuZGVudCBvYmplY3RzLgorCisvLyBUbyB1c2U6CisvLyBDTG9jayogbCA9IGFuZHJvaWRfbG9ja19uZXcoKTsKKy8vIGFuZHJvaWRfbG9ja19hY3F1aXJlKGwpOworLy8gLyogTm93IGRvIGltcG9ydGFudCBzdHVmZiAqLworLy8gYW5kcm9pZF9sb2NrX3JlbGVhc2UobCk7CisvLyBhbmRyb2lkX2xvY2tfZnJlZShsKTsKK3R5cGVkZWYgc3RydWN0IENMb2NrIENMb2NrOworCitleHRlcm4gQ0xvY2sqIGFuZHJvaWRfbG9ja19uZXcoKTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfbG9ja19hY3F1aXJlKENMb2NrKiBsKTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfbG9ja19yZWxlYXNlKENMb2NrKiBsKTsKK2V4dGVybiB2b2lkIGFuZHJvaWRfbG9ja19mcmVlKENMb2NrKiBsKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbG9vcGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9sb29wZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYjM2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbG9vcGVyLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2xvb3Blci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9UaHJlYWRMb29wZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvU3RyZWFtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKwordHlwZWRlZiA6Okxvb3BlciBDTG9vcGVyOwordHlwZWRlZiBhbmRyb2lkOjpiYXNlOjpMb29wZXIgQmFzZUxvb3BlcjsKKworc3RhdGljIEJhc2VMb29wZXI6OkNsb2NrVHlwZSB0b0Jhc2VMb29wZXJDbG9ja1R5cGUoTG9vcGVyQ2xvY2tUeXBlIGNsb2NrKSB7CisgICAgc3RhdGljX2Fzc2VydCgoaW50KSBMT09QRVJfQ0xPQ0tfSE9TVCA9PSAoaW50KSBCYXNlTG9vcGVyOjpDbG9ja1R5cGU6OmtIb3N0ICYmCisgICAgICAgICAgICAgICAgICAoaW50KSBMT09QRVJfQ0xPQ0tfVklSVFVBTCA9PSAoaW50KSBCYXNlTG9vcGVyOjpDbG9ja1R5cGU6OmtWaXJ0dWFsICYmCisgICAgICAgICAgICAgICAgICAoaW50KSBMT09QRVJfQ0xPQ0tfUkVBTFRJTUUgPT0gKGludCkgQmFzZUxvb3Blcjo6Q2xvY2tUeXBlOjprUmVhbHRpbWUsCisgICAgICAgICAgICAgICAgICAiVmFsdWVzIGluIHRoZSBMb29wZXI6OkNsb2NrVHlwZSBlbnVtZXJhdGlvbiBhcmUgb3V0IG9mIHN5bmMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJMb29wZXJDbG9ja1R5cGUiKTsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxCYXNlTG9vcGVyOjpDbG9ja1R5cGU+KGNsb2NrKTsKK30KKworc3RhdGljIEJhc2VMb29wZXIqIGFzQmFzZUxvb3BlcihDTG9vcGVyKiBsb29wZXIpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYXNlTG9vcGVyKj4obG9vcGVyKTsKK30KKworRHVyYXRpb24gbG9vcGVyX25vdyhMb29wZXIqIGxvb3BlcikgeworICAgIHJldHVybiBsb29wZXJfbm93V2l0aENsb2NrKGxvb3BlciwgTE9PUEVSX0NMT0NLX0hPU1QpOworfQorCitEdXJhdGlvbiBsb29wZXJfbm93V2l0aENsb2NrKExvb3BlciogbG9vcGVyLCBMb29wZXJDbG9ja1R5cGUgY2xvY2spIHsKKyAgICByZXR1cm4gYXNCYXNlTG9vcGVyKGxvb3BlciktPm5vd01zKHRvQmFzZUxvb3BlckNsb2NrVHlwZShjbG9jaykpOworfQorCitEdXJhdGlvbk5zIGxvb3Blcl9ub3dOcyhMb29wZXIqIGxvb3BlcikgeworICAgIHJldHVybiBsb29wZXJfbm93TnNXaXRoQ2xvY2sobG9vcGVyLCBMT09QRVJfQ0xPQ0tfSE9TVCk7Cit9CisKK0R1cmF0aW9uTnMgbG9vcGVyX25vd05zV2l0aENsb2NrKExvb3BlciogbG9vcGVyLCBMb29wZXJDbG9ja1R5cGUgY2xvY2spIHsKKyAgICByZXR1cm4gYXNCYXNlTG9vcGVyKGxvb3BlciktPm5vd05zKHRvQmFzZUxvb3BlckNsb2NrVHlwZShjbG9jaykpOworfQorCitpbnQgbG9vcGVyX3J1bldpdGhEZWFkbGluZShMb29wZXIqIGxvb3BlciwgRHVyYXRpb24gZGVhZGxpbmUpIHsKKyAgICByZXR1cm4gYXNCYXNlTG9vcGVyKGxvb3BlciktPnJ1bldpdGhEZWFkbGluZU1zKGRlYWRsaW5lKTsKK30KKwordm9pZCBsb29wZXJfZm9yY2VRdWl0KExvb3BlciogbG9vcGVyKSB7CisgICAgYXNCYXNlTG9vcGVyKGxvb3BlciktPmZvcmNlUXVpdCgpOworfQorCit2b2lkIGxvb3Blcl9mcmVlKExvb3BlciogbG9vcGVyKSB7CisgICAgZGVsZXRlIGFzQmFzZUxvb3Blcihsb29wZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBUIEkgTSBFIFIgUworICoqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgOjphbmRyb2lkOjpiYXNlOjpMb29wZXI6OlRpbWVyIEJhc2VUaW1lcjsKKworc3RhdGljIEJhc2VUaW1lciogYXNCYXNlVGltZXIoTG9vcFRpbWVyKiB0aW1lcikgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEJhc2VUaW1lcio+KHRpbWVyKTsKK30KKwordm9pZCBsb29wVGltZXJfc3RvcChMb29wVGltZXIqIHRpbWVyKSB7CisgICAgYXNCYXNlVGltZXIodGltZXIpLT5zdG9wKCk7Cit9CisKK3ZvaWQgbG9vcFRpbWVyX3N0YXJ0QWJzb2x1dGUoTG9vcFRpbWVyKiB0aW1lciwgRHVyYXRpb24gZGVhZGxpbmVfbXMpIHsKKyAgICBhc0Jhc2VUaW1lcih0aW1lciktPnN0YXJ0QWJzb2x1dGUoZGVhZGxpbmVfbXMpOworfQorCit2b2lkIGxvb3BUaW1lcl9zdGFydFJlbGF0aXZlKExvb3BUaW1lciogdGltZXIsIER1cmF0aW9uICB0aW1lb3V0X21zKSB7CisgICAgYXNCYXNlVGltZXIodGltZXIpLT5zdGFydFJlbGF0aXZlKHRpbWVvdXRfbXMpOworfQorCitpbnQgbG9vcFRpbWVyX2lzQWN0aXZlKExvb3BUaW1lciogdGltZXIpIHsKKyAgICByZXR1cm4gYXNCYXNlVGltZXIodGltZXIpLT5pc0FjdGl2ZSgpOworfQorCit2b2lkIGxvb3BUaW1lcl9mcmVlKExvb3BUaW1lciogdGltZXIpIHsKKyAgICBkZWxldGUgYXNCYXNlVGltZXIodGltZXIpOworfQorCitMb29wVGltZXIqIGxvb3BUaW1lcl9uZXcoQ0xvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BUaW1lckZ1bmMgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKSB7CisgICAgcmV0dXJuIGxvb3BUaW1lcl9uZXdXaXRoQ2xvY2sobG9vcGVyLCBjYWxsYmFjaywgb3BhcXVlLCBMT09QRVJfQ0xPQ0tfSE9TVCk7Cit9CisKK0xvb3BUaW1lciogbG9vcFRpbWVyX25ld1dpdGhDbG9jayhDTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFRpbWVyRnVuYyBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyQ2xvY2tUeXBlIGNsb2NrVHlwZSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PExvb3BUaW1lcio+KAorICAgICAgICAgICAgYXNCYXNlTG9vcGVyKGxvb3BlciktPmNyZWF0ZVRpbWVyKAorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEJhc2VMb29wZXI6OlRpbWVyOjpDYWxsYmFjaz4oY2FsbGJhY2spLAorICAgICAgICAgICAgICAgICAgICBvcGFxdWUsIHRvQmFzZUxvb3BlckNsb2NrVHlwZShjbG9ja1R5cGUpKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqCisgKioqKiogIEkgLyBPCisgKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBhbmRyb2lkOjpiYXNlOjpMb29wZXI6OkZkV2F0Y2ggQmFzZUZkV2F0Y2g7CisKK3N0YXRpYyBCYXNlRmRXYXRjaCogYXNCYXNlRmRXYXRjaChMb29wSW8qIGlvKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QmFzZUZkV2F0Y2gqPihpbyk7Cit9CisKK2ludCBsb29wSW9fZmQoTG9vcElvKiBpbykgeworICAgIHJldHVybiBhc0Jhc2VGZFdhdGNoKGlvKS0+ZmQoKTsKK30KKwordm9pZCBsb29wSW9fd2FudFJlYWQoTG9vcElvKiBpbykgeworICAgIGFzQmFzZUZkV2F0Y2goaW8pLT53YW50UmVhZCgpOworfQorCit2b2lkIGxvb3BJb193YW50V3JpdGUoTG9vcElvKiBpbykgeworICAgIGFzQmFzZUZkV2F0Y2goaW8pLT53YW50V3JpdGUoKTsKK30KKwordm9pZCBsb29wSW9fZG9udFdhbnRSZWFkKExvb3BJbyogaW8pIHsKKyAgICBhc0Jhc2VGZFdhdGNoKGlvKS0+ZG9udFdhbnRSZWFkKCk7Cit9CisKK3ZvaWQgbG9vcElvX2RvbnRXYW50V3JpdGUoTG9vcElvKiBpbykgeworICAgIGFzQmFzZUZkV2F0Y2goaW8pLT5kb250V2FudFdyaXRlKCk7Cit9CisKK3Vuc2lnbmVkIGxvb3BJb19wb2xsKExvb3BJbyogaW8pIHsKKyAgICByZXR1cm4gYXNCYXNlRmRXYXRjaChpbyktPnBvbGwoKTsKK307CisKK3ZvaWQgbG9vcElvX2ZyZWUoTG9vcElvKiBpbykgeworICAgIGRlbGV0ZSBhc0Jhc2VGZFdhdGNoKGlvKTsKK30KKworTG9vcElvKiBsb29wSW9fbmV3KENMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgTG9vcElvRnVuYyBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpzb2NrZXRTZXROb25CbG9ja2luZyhmZCk7CisKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxMb29wSW8qPigKKyAgICAgICAgICAgIGFzQmFzZUxvb3Blcihsb29wZXIpLT5jcmVhdGVGZFdhdGNoKGZkLCBjYWxsYmFjaywgb3BhcXVlKSk7Cit9CisKK0NMb29wZXIqIGxvb3Blcl9nZXRGb3JUaHJlYWQodm9pZCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PENMb29wZXIqPigKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCkpOworfQorCit2b2lkIGxvb3Blcl9zZXRGb3JUaHJlYWQoTG9vcGVyKiBsb29wZXIpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpUaHJlYWRMb29wZXI6OnNldExvb3BlcigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QmFzZUxvb3Blcio+KGxvb3BlcikpOworfQorCit2b2lkIGxvb3Blcl9zZXRGb3JUaHJlYWRUb093bihMb29wZXIqIGxvb3BlcikgeworICAgIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6c2V0TG9vcGVyKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxCYXNlTG9vcGVyKj4obG9vcGVyKSwgdHJ1ZSk7Cit9CisKK0NMb29wZXIqIGxvb3Blcl9uZXdHZW5lcmljKHZvaWQpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDTG9vcGVyKj4oCisgICAgICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6Okxvb3Blcjo6Y3JlYXRlKCkpOworfQorCit2b2lkIHN0cmVhbV9wdXRfdGltZXIoOjpTdHJlYW0qIHN0cmVhbSwgTG9vcFRpbWVyKiB0aW1lcikgeworICAgIGFzQmFzZVRpbWVyKHRpbWVyKS0+c2F2ZShyZWludGVycHJldF9jYXN0PGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSo+KHN0cmVhbSkpOworfQorCit2b2lkIHN0cmVhbV9nZXRfdGltZXIoOjpTdHJlYW0qIHN0cmVhbSwgTG9vcFRpbWVyKiB0aW1lcikgeworICAgIGFzQmFzZVRpbWVyKHRpbWVyKS0+bG9hZChyZWludGVycHJldF9jYXN0PGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSo+KHN0cmVhbSkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xvb3Blci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL2xvb3Blci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmE3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbG9vcGVyLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBzdGRpbnQuaCB3aWxsIG5vdCBkZWZpbmUgbmVjZXNzYXJ5IG1hY3JvcyBpbiBzb21lIGMrKyBjb21waWxlcgorICogaW1wbGVtZW50YXRpb25zIHdpdGhvdXQgdGhpcyBtYWNybyBkZWZpbml0aW9uLgorICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgIWRlZmluZWQoX19TVERDX0xJTUlUX01BQ1JPUykKKyNlcnJvciAiVGhpcyBoZWFkZXIgcmVxdWlyZXMgeW91IHRvIGRlZmluZSBfX1NURENfTElNSVRfTUFDUk9TLiIKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBUIEkgTSBFICAgUiBFIFAgUiBFIFMgRSBOIFQgQSBUIEkgTyBOCisgKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQSBEdXJhdGlvbiByZXByZXNlbnRzIGEgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzICovCit0eXBlZGVmIGludDY0X3QgICBEdXJhdGlvbjsKKworLyogSGlnaC1wcmVjaXNpb24gZHVyYXRpb24sIGluIG5hbm9zZWNvbmRzICovCit0eXBlZGVmIHVpbnQ2NF90ICBEdXJhdGlvbk5zOworCisvKiBBIHNwZWNpYWwgRHVyYXRpb24gdmFsdWUgdXNlZCB0byBtZWFuICJpbmZpbml0ZSIgKi8KKyNkZWZpbmUgIERVUkFUSU9OX0lORklOSVRFICAgICAgICgoRHVyYXRpb24pSU5UNjRfTUFYKQorCisvLyBUeXBlIG9mIHRoZSBjbG9jayB1c2VkIGluIGEgTG9vcGVyIG9iamVjdAorLy8gIExPT1BFUl9DTE9DS19SRUFMVElNRSAtIHJlYWx0aW1lIG1vbm90b25pYyBob3N0IGNsb2NrCisvLyAgTE9PUEVSX0NMT0NLX1ZJUlRVQUwgLSB2aXJ0dWFsIG1hY2hpbmUgZ3Vlc3QgdGltZSwgc3RvcHMgd2hlbiBndWVzdCBpcworLy8gICAgICBzdXNwZW5kZWQKKy8vICBMT09QRVJfQ0xPQ0tfSE9TVCAtIGhvc3QgdGltZSwgbWltaWNzIHRoZSBjdXJyZW50IHRpbWUgc2V0IGluIHRoZSBPUywgc28KKy8vICAgICAgaXMgbWF5IGdvIGJhY2sgd2hlbiBPUyB0aW1lIGlzIHNldCBiYWNrCisvLworLy8gIE5vdGU6IHRoZSBvbmx5IHRpbWUgd2hpY2ggaXMgYWx3YXlzIHN1cHBvcnRlZCBpcyBMT09QRVJfQ0xPQ0tfSE9TVDsKKy8vICAgICAgICBvdGhlciB0eXBlcyBtYXkgYmUgbm90IGltcGxlbWVudGVkIGJ5IGRpZmZlcmVudCB0aW1lcyBhbmQgZmFsbCBiYWNrCisvLyAgICAgICAgdG8gTE9PUEVSX0NMT0NLX0hPU1QKKwordHlwZWRlZiBlbnVtIHsKKyAgICBMT09QRVJfQ0xPQ0tfUkVBTFRJTUUsCisgICAgTE9PUEVSX0NMT0NLX1ZJUlRVQUwsCisgICAgTE9PUEVSX0NMT0NLX0hPU1QKK30gTG9vcGVyQ2xvY2tUeXBlOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBFIFYgRSBOIFQgICBMIE8gTyBQICAgTyBCIEogRSBDIFQgUworICoqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogQSBMb29wZXIgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGFuIGV2ZW50IGxvb3AsIHdoaWNoIGNhbgorICogYmUgaW1wbGVtZW50ZWQgaW4gZGlmZmVyZW50IHdheXMuIEZvciBleGFtcGxlLCB0aGUgVUkgcHJvZ3JhbSBtYXkKKyAqIHdhbnQgdG8gaW1wbGVtZW50IGEgY3VzdG9tIGV2ZW50IGxvb3Agb24gdG9wIG9mIHRoZSBTREwgZXZlbnQgcXVldWUsCisgKiB3aGlsZSB0aGUgUUVNVSBjb3JlIHdvdWxkIGltcGxlbWVudCBpdCBvbiB0b3Agb2YgUUVNVSdzIGludGVybmFsCisgKiBtYWluIGxvb3Agd2hpY2ggd29ya3MgZGlmZmVyZW50bHkuCisgKgorICogT25jZSB5b3UgaGF2ZSBhIExvb3BlciBwb2ludGVyLCB5b3UgY2FuIHJlZ2lzdGVyICJ3YXRjaGVycyIgdGhhdAorICogd2lsbCB0cmlnZ2VyIGNhbGxiYWNrcyB3aGVuZXZlciBjZXJ0YWluIGV2ZW50cyBvY2N1ci4gU3VwcG9ydGVkIGV2ZW50CisgKiB0eXBlcyBhcmU6CisgKgorICogICAtIHRpbWVyIGV4cGlyYXRpb24KKyAqICAgLSBpL28gZmlsZSBkZXNjcmlwdG9yIGlucHV0L291dHB1dAorICoKKyAqIFNlZSB0aGUgcmVsZXZhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlc2UgYmVsb3cuCisgKgorICogT25jZSB5b3UgaGF2ZSByZWdpc3RlcmVkIG9uZSBvciBtb3JlIHdhdGNoZXJzLCB5b3UgY2FuIGNhbGwgbG9vcGVyX3J1bigpCisgKiB3aGljaCB3aWxsIHJ1biB0aGUgZXZlbnQgbG9vcCB1bnRpbCBsb29wZXJfZm9yY2VRdWl0KCkgaXMgY2FsbGVkIGZyb20gYQorICogY2FsbGJhY2ssIG9yIG5vIG1vcmUgd2F0Y2hlcnMgYXJlIHJlZ2lzdGVyZWQuCisgKgorICogWW91IGNhbiByZWdpc3Rlci91bnJlZ2lzdGVyIHdhdGNoZXJzIGZyb20gYSBjYWxsYmFjaywgb3IgY2FsbCB2YXJpb3VzCisgKiBMb29wZXIgbWV0aG9kcyBmcm9tIHRoZW0gKGUuZy4gbG9vcGVyX25vdygpLCBsb29wZXJfZm9yY2VRdWl0KCksIGV0Yy4uKQorICoKKyAqIFlvdSBjYW4gY3JlYXRlIGEgbmV3IExvb3BlciBieSBjYWxsaW5nIGxvb3Blcl9uZXdHZW5lcmljKCkuIFRoaXMgcHJvdmlkZXMKKyAqIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluIGFsbCB0aHJlYWRzLgorICoKKyAqIEZvciB0aGUgUUVNVSBjb3JlLCB5b3UgY2FuIGdyYWIgYSBMb29wZXIgcG9pbnRlciBieSBjYWxsaW5nCisgKiBsb29wZXJfZ2V0Rm9yVGhyZWFkKCkgaW5zdGVhZC4gSXRzIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0b3Agb2YKKyAqIHRoZSBRRU1VIGV2ZW50IGxvb3AgaW5zdGVhZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTG9vcGVyICAgIExvb3BlcjsKKworLyogUmV0dXJuIHRoZSBMb29wZXIgaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4gSWYgbm9uZSBleGlzdHMsCisgKiBjcmVhdGUgYSBuZXcgb25lIHdpdGggbG9vcGVyX25ld0dlbmVyaWMoKS4KKyAqIElNUE9SVEFOVDogbmV2ZXIgY2FsbCBsb29wZXJfZnJlZSgpIG9uIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbi4KKyAqLworTG9vcGVyKiBsb29wZXJfZ2V0Rm9yVGhyZWFkKHZvaWQpOworCisvKiBTZXQgdGhlIGN1cnJlbnQgdGhyZWFkJ3MgTG9vcGVyIGluc3RhbmNlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIGlmIHlvdQorICogaGF2ZSBhIExvb3BlciBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGZvcmVpZ24gbWFpbiBsb29wLiAqLwordm9pZCBsb29wZXJfc2V0Rm9yVGhyZWFkKExvb3BlciogbG9vcGVyKTsKKworLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBzZXQgZnVuY3Rpb24gcGFzc2VzIHRoZSBsb29wZXIgb3duZXJzaGlwIC0gc28gaXQgaXMKKy8vIGRlYWxsb2NhdGVkIG9uIHRocmVhZCBleGl0Lgordm9pZCBsb29wZXJfc2V0Rm9yVGhyZWFkVG9Pd24oTG9vcGVyKiBsb29wZXIpOworCisvKiBDcmVhdGUgYSBuZXcgZ2VuZXJpYyBsb29wZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbnkgY29udGV4dCAvIHRocmVhZC4gKi8KK0xvb3BlciogIGxvb3Blcl9uZXdHZW5lcmljKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBMb29wVGltZXIgTG9vcFRpbWVyOwordHlwZWRlZiB2b2lkICgqTG9vcFRpbWVyRnVuYykodm9pZCogb3BhcXVlLCBMb29wVGltZXIqIHRpbWVyKTsKKwordHlwZWRlZiBzdHJ1Y3QgTG9vcElvICAgIExvb3BJbzsKK3R5cGVkZWYgdm9pZCAoKkxvb3BJb0Z1bmMpKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBUIEkgTSBFIFIgUworICoqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemUgYSBMb29wVGltZXIgd2l0aCBhIGNhbGxiYWNrIGFuZCBhbiAnb3BhcXVlJyB2YWx1ZS4KKyAqIEVhY2ggdGltZXIgYmVsb25ncyB0byBvbmx5IG9uZSBsb29wZXIgb2JqZWN0LgorICovCitMb29wVGltZXIqIGxvb3BUaW1lcl9uZXcoTG9vcGVyKiAgICAgICAgbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BUaW1lckZ1bmMgIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIG9wYXF1ZSk7CitMb29wVGltZXIqIGxvb3BUaW1lcl9uZXdXaXRoQ2xvY2soTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFRpbWVyRnVuYyBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcGVyQ2xvY2tUeXBlIGNsb2NrKTsKKworLyogRmluYWxpemUgYSBMb29wVGltZXIgKi8KK3ZvaWQgbG9vcFRpbWVyX2ZyZWUoTG9vcFRpbWVyKiB0aW1lcik7CisKKy8qIFN0YXJ0IGEgdGltZXIsIGkuZS4gYXJtIGl0IHRvIGV4cGlyZSBpbiAndGltZW91dF9tcycgbWlsbGlzZWNvbmRzLAorICogdW5sZXNzIGxvb3BUaW1lcl9zdG9wKCkgaXMgY2FsbGVkIGJlZm9yZSB0aGF0LCBvciB0aGUgdGltZXIgaXMKKyAqIHJlcHJvZ3JhbW1lZCB3aXRoIGFub3RoZXIgbG9vcFRpbWVyX3N0YXJ0WFhYKCkgY2FsbC4KKyAqLwordm9pZCBsb29wVGltZXJfc3RhcnRSZWxhdGl2ZShMb29wVGltZXIqIHRpbWVyLCBEdXJhdGlvbiB0aW1lb3V0X21zKTsKKworLyogQSB2YXJpYW50IG9mIGxvb3BUaW1lcl9zdGFydFJlbGF0aXZlIHRoYXQgZmlyZXMgb24gYSBnaXZlbiBkZWFkbGluZQorICogaW4gbWlsbGlzZWNvbmRzIGluc3RlYWQuIElmIHRoZSBkZWFkbGluZSBhbHJlYWR5IHBhc3NlZCwgdGhlIHRpbWVyIGlzCisgKiBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgZXZlbnQgd2F0Y2hlcnMgYW5kIHdpbGwKKyAqIGZpcmUgYXMgc29vbiBhcyBwb3NzaWJsZS4gTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIGluZmluaXRlIGxvb3BzCisgKiBpbiB5b3VyIGNvZGUgaWYgeW91J3JlIG5vdCBjYXJlZnVsLgorICovCit2b2lkIGxvb3BUaW1lcl9zdGFydEFic29sdXRlKExvb3BUaW1lciogdGltZXIsIER1cmF0aW9uIGRlYWRsaW5lX21zKTsKKworLyogU3RvcCBhIGdpdmVuIHRpbWVyICovCit2b2lkIGxvb3BUaW1lcl9zdG9wKExvb3BUaW1lciogdGltZXIpOworCisvKiBSZXR1cm5zIHRydWUgaWZmIHRoZSB0aW1lciBpcyBhY3RpdmUgLyBzdGFydGVkICovCitpbnQgbG9vcFRpbWVyX2lzQWN0aXZlKExvb3BUaW1lciogdGltZXIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBGIEkgTCBFICAgRCBFIFMgQyBSIEkgUCBUIE8gUiBTCisgKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQml0bWFza3MgYWJvdXQgaS9vIGV2ZW50cy4gTm90ZSB0aGF0IGVycm9ycyAoZS5nLiBuZXR3b3JrIGRpc2Nvbm5lY3Rpb25zKQorICogYXJlIG1hcHBlZCB0byBib3RoIHJlYWQgYW5kIHdyaXRlIGV2ZW50cy4gVGhlIGlkZWEgaXMgdGhhdCBhIHJlYWQoKSBvcgorICogd3JpdGUoKSB3aWxsIHJldHVybiAwIG9yIGV2ZW4gLTEgb24gbm9uLWJsb2NraW5nIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhpcworICogY2FzZS4KKyAqCisgKiBZb3UgY2FuIHJlY2VpdmUgc2V2ZXJhbCBldmVudHMgYXQgdGhlIHNhbWUgdGltZSBvbiBhIHNpbmdsZSBMb29wSW8KKyAqCisgKiBTb2NrZXQgY29ubmVjdCgpcyBhcmUgbWFwcGVkIHRvIExPT1BfSU9fV1JJVEUgZXZlbnRzLgorICogU29ja2V0IGFjY2VwdCgpcyBhcmUgbWFwcGVkIHRvIExPT1BfSU9fUkVBRCBldmVudHMuCisgKi8KK2VudW0geworICAgIExPT1BfSU9fUkVBRCAgPSAoMSA8PCAwKSwKKyAgICBMT09QX0lPX1dSSVRFID0gKDEgPDwgMSksCit9OworCitMb29wSW8qIGxvb3BJb19uZXcoTG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgIExvb3BJb0Z1bmMgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKTsKKworLyogTm90ZTogVGhpcyBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yISAqLwordm9pZCBsb29wSW9fZnJlZShMb29wSW8qIGlvKTsKKworaW50IGxvb3BJb19mZChMb29wSW8qIGlvKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB5b3Ugd2FudCB0aGUgY2FsbGJhY2sKKyAqIHRvIGJlIGZpcmVkIHdoZW4gdGhlcmUgaXMgZGF0YSB0byBiZSByZWFkIG9yIHdoZW4gdGhlIGZpbGUgaXMgcmVhZHkgdG8KKyAqIGJlIHdyaXR0ZW4gdG8uICovCit2b2lkIGxvb3BJb193YW50UmVhZChMb29wSW8qIGlvKTsKK3ZvaWQgbG9vcElvX3dhbnRXcml0ZShMb29wSW8qIGlvKTsKK3ZvaWQgbG9vcElvX2RvbnRXYW50UmVhZChMb29wSW8qIGlvKTsKK3ZvaWQgbG9vcElvX2RvbnRXYW50V3JpdGUoTG9vcElvKiBpbyk7CisKK3Vuc2lnbmVkIGxvb3BJb19wb2xsKExvb3BJbyogaW8pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICBMIE8gTyBQIEUgUgorICoqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJldHVybiB0aGUgY3VycmVudCBsb29wZXIgdGltZSBpbiBtaWxsaXNlY29uZHMuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqIGNvbXB1dGUgZGVhZGxpbmVzIGZvciBsb29wZXJfcnVuV2l0aERlYWRsaW5lKCkuICovCitEdXJhdGlvbiBsb29wZXJfbm93KExvb3BlciogbG9vcGVyKTsKK0R1cmF0aW9uIGxvb3Blcl9ub3dXaXRoQ2xvY2soTG9vcGVyKiBsb29wZXIsIExvb3BlckNsb2NrVHlwZSBjbG9jayk7CisKKy8qIEN1cnJlbnQgdGltZSBpbiBuYW5vc2Vjb25kcyAqLworRHVyYXRpb25OcyBsb29wZXJfbm93TnMoTG9vcGVyKiBsb29wZXIpOworRHVyYXRpb25OcyBsb29wZXJfbm93TnNXaXRoQ2xvY2soTG9vcGVyKiBsb29wZXIsIExvb3BlckNsb2NrVHlwZSBjbG9jayk7CisKKy8qIFJ1biB0aGUgZXZlbnQgbG9vcCwgdW50aWwgbG9vcGVyX2ZvcmNlUXVpdCgpIGlzIGNhbGxlZCwgb3IgdGhlcmUgaXMgbm8KKyAqIG1vcmUgcmVnaXN0ZXJlZCB3YXRjaGVycyBmb3IgZXZlbnRzL3RpbWVycyBpbiB0aGUgbG9vcGVyLCBvciBhIGNlcnRhaW4KKyAqIGRlYWRsaW5lIGV4cGlyZXMuCisgKgorICogfGRlYWRsaW5lX21zfCBpcyBhIGRlYWRsaW5lIGluIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaW5kaWNhdGVzIHRoZSByZWFzb246CisgKiAgICAwICAgICAgICAgICAtPiBub3JtYWwgZXhpdCB0aHJvdWdoIGxvb3Blcl9mb3JjZVF1aXQoKQorICogICAgRVdPVUxEQkxPQ0sgLT4gdGhlcmUgYXJlIG5vdCBtb3JlIHdhdGNoZXJzIHJlZ2lzdGVyZWQgKHRoZSBsb29wZXIKKyAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGxvb3AgaW5maW5pdGVseSkKKyAqICAgIEVUSU1FRE9VVCAgIC0+IGRlYWRsaW5lIGV4cGlyZWQuCisgKi8KK2ludCBsb29wZXJfcnVuV2l0aERlYWRsaW5lKExvb3BlciogbG9vcGVyLCBEdXJhdGlvbiBkZWFkbGluZV9tcyk7CisKKy8qIFJ1biB0aGUgZXZlbnQgbG9vcCwgdW50aWwgbG9vcGVyX2ZvcmNlUXVpdCgpIGlzIGNhbGxlZCwgb3IgdGhlcmUgaXMgbm8KKyAqIG1vcmUgcmVnaXN0ZXJlZCB3YXRjaGVycyBmb3IgZXZlbnRzL3RpbWVycyBpbiB0aGUgbG9vcGVyLgorICovCitBSU5MSU5FRCB2b2lkIGxvb3Blcl9ydW4oTG9vcGVyKiBsb29wZXIpIHsKKyAgICAodm9pZCkgbG9vcGVyX3J1bldpdGhEZWFkbGluZShsb29wZXIsIERVUkFUSU9OX0lORklOSVRFKTsKK30KKworLyogQSB2YXJpYW50IG9mIGxvb3Blcl9ydW4oKSB0aGF0IGFsbG93cyB0byBydW4gdGhlIGV2ZW50IGxvb3Agb25seQorICogdW50aWwgYSBjZXJ0YWluIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGhhcyBwYXNzZWQuCisgKgorICogUmV0dXJucyB0aGUgcmVhc29uIHdoeSB0aGUgbG9vcGVyIHN0b3BwZWQ6CisgKiAgICAwICAgICAgICAgICAtPiBub3JtYWwgZXhpdCB0aHJvdWdoIGxvb3Blcl9mb3JjZVF1aXQoKQorICogICAgRVdPVUxEQkxPQ0sgLT4gdGhlcmUgYXJlIG5vdCBtb3JlIHdhdGNoZXJzIHJlZ2lzdGVyZWQgKHRoZSBsb29wZXIKKyAqICAgICAgICAgICAgICAgICAgIHdvdWxkIGxvb3AgaW5maW5pdGVseSkKKyAqICAgIEVUSU1FRE9VVCAgIC0+IHRpbWVvdXQgcmVhY2hlZAorICoKKyAqLworQUlOTElORUQgaW50IGxvb3Blcl9ydW5XaXRoVGltZW91dChMb29wZXIqIGxvb3BlciwgRHVyYXRpb24gdGltZW91dF9tcykgeworICAgIGlmICh0aW1lb3V0X21zICE9IERVUkFUSU9OX0lORklOSVRFKQorICAgICAgICB0aW1lb3V0X21zICs9IGxvb3Blcl9ub3cobG9vcGVyKTsKKworICAgIHJldHVybiBsb29wZXJfcnVuV2l0aERlYWRsaW5lKGxvb3BlciwgdGltZW91dF9tcyk7Cit9CisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIHdpdGhpbiB0aGUgZXZlbnQgbG9vcCB0byBmb3JjZSBpdCB0byBxdWl0CisgKiBhcyBzb29uIGFzIHBvc3NpYmxlLiBsb29wZXJfcnVuKCkgLyBfcnVuV2l0aFRpbWVvdXQoKSAvIF9ydW5XaXRoRGVhZGxpbmUoKQorICogd2lsbCB0aGVuIHJldHVybiAwLgorICovCit2b2lkIGxvb3Blcl9mb3JjZVF1aXQoTG9vcGVyKiBsb29wZXIpOworCisvKiBEZXN0cm95IGEgZ2l2ZW4gbG9vcGVyIG9iamVjdC4gT25seSB3b3JrcyBmb3IgdGhvc2UgY3JlYXRlZAorICogd2l0aCBsb29wZXJfbmV3KCkuIENhbm5vdCBiZSBjYWxsZWQgd2l0aGluIGxvb3Blcl9ydW4oKSEhCisgKgorICogTk9URTogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIHVzZXIgaGFzIGRlc3Ryb3llZCBhbGwgaXRzCisgKiAgICAgICAgdGltZXJzIGFuZCBpb3MgcHJvcGVybHkKKyAqLwordm9pZCBsb29wZXJfZnJlZShMb29wZXIqIGxvb3Blcik7CisKKy8vIFNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIHN1cHBvcnQKK3ZvaWQgc3RyZWFtX3B1dF90aW1lcihTdHJlYW0qIHN0cmVhbSwgTG9vcFRpbWVyKiB0aW1lcik7Cit2b2lkIHN0cmVhbV9nZXRfdGltZXIoU3RyZWFtKiBzdHJlYW0sIExvb3BUaW1lciogdGltZXIpOworCisvKiAqLworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9tYXBmaWxlLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWFwZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZWRhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWFwZmlsZS5jCkBAIC0wLDAgKzEsMjQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKy8qCisgKiBDb250YWlucyBpbXBsZW1lbnRhdGlvbiBvZiByb3V0aW5lcyB0aGF0IGltcGxlbWVudCBwbGF0Zm9ybS1pbmRlcGVuZGVudAorICogZmlsZSBJL08uCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWFwZmlsZS5oIgorCisjaW5jbHVkZSAic3RkZGVmLmgiCisjaW5jbHVkZSAic3lzL3R5cGVzLmgiCisjaW5jbHVkZSAiZXJybm8uaCIKKyNpZmRlZiAgV0lOMzIKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjZWxzZSAgIC8vIFdJTjMyCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZiAgLy8gV0lOMzIKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKworTWFwRmlsZSoKK21hcGZpbGVfb3Blbihjb25zdCBjaGFyKiBwYXRoLCBpbnQgb2ZsYWcsIGludCBzaGFyZV9tb2RlKQoreworI2lmZGVmIFdJTjMyCisgICAgRFdPUkQgd2luMzJfc2hhcmU7CisgICAgRFdPUkQgd2luMzJfZGVzaXJlZF9hY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisgICAgRFdPUkQgd2luMzJfZGlzcG9zaXRpb24gPSBPUEVOX0VYSVNUSU5HOworICAgIERXT1JEIHdpbjMyX2ZsYWdzOworCisgICAgLyogQ29udmVydCB0byBXaW4zMiBkZXNpcmVkIGFjY2Vzcy4gKi8KKyAgICBpZiAoKG9mbGFnICYgT19SRFdSKSA9PSBPX1JEV1IpIHsKKyAgICAgICAgd2luMzJfZGVzaXJlZF9hY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworICAgIH0gZWxzZSBpZiAoKG9mbGFnICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkgeworICAgICAgICB3aW4zMl9kZXNpcmVkX2FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKKyAgICB9IGVsc2UgaWYgKChvZmxhZyAmIE9fV1JPTkxZKSA9PSBPX1dST05MWSkgeworICAgICAgICB3aW4zMl9kZXNpcmVkX2FjY2VzcyA9IEdFTkVSSUNfV1JJVEU7CisgICAgfQorCisgICAgLyogQ29udmVydCB0byBXaW4zMiBzaGFyaW5nLiAqLworICAgIHdpbjMyX3NoYXJlID0gMDsKKyAgICBpZiAoKHNoYXJlX21vZGUgJiBTX0lXUklURSkgIT0gMCkgeworICAgICAgICB3aW4zMl9zaGFyZSB8PSBGSUxFX1NIQVJFX1dSSVRFOworICAgIH0KKyAgICBpZiAoKHNoYXJlX21vZGUgJiBTX0lSRUFEKSAhPSAwKSB7CisgICAgICAgIHdpbjMyX3NoYXJlIHw9IEZJTEVfU0hBUkVfUkVBRDsKKyAgICB9CisKKyAgICAvKiBDb252ZXJ0IHRvIFdpbjMyIGRpc3Bvc2l0aW9uLiAqLworICAgIGlmICgob2ZsYWcgJiBPX0NSRUFUKSA9PSBPX0NSRUFUKSB7CisgICAgICAgIGlmICgob2ZsYWcgJiBPX0VYQ0wpID09IE9fRVhDTCkgeworICAgICAgICAgICAgd2luMzJfZGlzcG9zaXRpb24gPSBDUkVBVEVfTkVXOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2luMzJfZGlzcG9zaXRpb24gPSBPUEVOX0FMV0FZUzsKKyAgICAgICAgfQorICAgIH0gaWYgKChvZmxhZyAmIE9fVFJVTkMpID09IE9fVFJVTkMpIHsKKyAgICAgICAgd2luMzJfZGVzaXJlZF9hY2Nlc3MgPSBUUlVOQ0FURV9FWElTVElORzsKKyAgICB9IGVsc2UgeworICAgICAgICB3aW4zMl9kaXNwb3NpdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgICAgfQorCisgICAgLyogQ29udmVydCB0byBXaW4zMiBmbGFncy4gKi8KKyAgICB3aW4zMl9mbGFncyA9IDA7CisjaWYgZGVmaW5lZChPX0RTWU5DKQorICAgIGlmICgob2ZsYWcgJiBPX0RTWU5DKSA9PSBPX0RTWU5DIHx8CisgICAgICAgIChvZmxhZyAmIE9fUlNZTkMpID09IE9fUlNZTkMgfHwKKyAgICAgICAgKG9mbGFnICYgT19SU1lOQykgPT0gT19TWU5DKSB7CisgICAgICAgIHdpbjMyX2ZsYWdzIHw9IEZJTEVfRkxBR19XUklURV9USFJPVUdIOworICAgIH0KKyNlbmRpZiAgLy8gT19EU1lOQworCisgICAgSEFORExFIGZpbGVfaGFuZGxlID0gQ3JlYXRlRmlsZShwYXRoLCB3aW4zMl9kZXNpcmVkX2FjY2Vzcywgd2luMzJfc2hhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB3aW4zMl9kaXNwb3NpdGlvbiwgd2luMzJfZmxhZ3MsIE5VTEwpOworICAgIGlmIChmaWxlX2hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBlcnJubyA9IEdldExhc3RFcnJvcigpOworICAgIH0KKyNlbHNlICAgLy8gV0lOMzIKKyAgICBpbnQgZmlsZV9oYW5kbGUgPSBvcGVuKHBhdGgsIG9mbGFnLCBzaGFyZV9tb2RlKTsKKyNlbmRpZiAgLy8gV0lOMzIKKworICAgIHJldHVybiAoTWFwRmlsZSopKHB0cmRpZmZfdClmaWxlX2hhbmRsZTsKK30KKworaW50CittYXBmaWxlX2Nsb3NlKE1hcEZpbGUqIGhhbmRsZSkKK3sKKyNpZmRlZiBXSU4zMgorICAgIGlmIChDbG9zZUhhbmRsZShoYW5kbGUpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGVycm5vID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZWxzZSAgIC8vIFdJTjMyCisgICAgcmV0dXJuIGNsb3NlKChpbnQpKHB0cmRpZmZfdCloYW5kbGUpOworI2VuZGlmICAvLyBXSU4zMgorfQorCitzc2l6ZV90CittYXBmaWxlX3JlYWQoTWFwRmlsZSogaGFuZGxlLCB2b2lkKiBidWYsIHNpemVfdCBuYnl0ZSkKK3sKKyNpZmRlZiBXSU4zMgorICAgIHNzaXplX3QgcmV0X2J5dGVzOworICAgIERXT1JEIHJlYWRfYnl0ZXM7CisgICAgaWYgKFJlYWRGaWxlKGhhbmRsZSwgYnVmLCBuYnl0ZSwgJnJlYWRfYnl0ZXMsIE5VTEwpKSB7CisgICAgICAgIHJldF9ieXRlcyA9IChzc2l6ZV90KXJlYWRfYnl0ZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgcmV0X2J5dGVzID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXRfYnl0ZXM7CisjZWxzZSAgIC8vIFdJTjMyCisgICAgcmV0dXJuIEhBTkRMRV9FSU5UUihyZWFkKChpbnQpKHB0cmRpZmZfdCloYW5kbGUsIGJ1ZiwgbmJ5dGUpKTsKKyNlbmRpZiAgLy8gV0lOMzIKK30KKworc3NpemVfdAorbWFwZmlsZV9yZWFkX2F0KE1hcEZpbGUqIGhhbmRsZSwgc2l6ZV90IG9mZnNldCwgdm9pZCogYnVmLCBzaXplX3QgbmJ5dGUpCit7CisjaWZkZWYgV0lOMzIKKyAgICBMQVJHRV9JTlRFR0VSIGNvbnZlcnQ7CisgICAgY29udmVydC5RdWFkUGFydCA9IG9mZnNldDsKKyAgICBpZiAoKFNldEZpbGVQb2ludGVyKGhhbmRsZSwgY29udmVydC5Mb3dQYXJ0LCAmY29udmVydC5IaWdoUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQkVHSU4pID09IElOVkFMSURfU0VUX0ZJTEVfUE9JTlRFUikgJiYKKyAgICAgICAgICAgIChHZXRMYXN0RXJyb3IoKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbWFwZmlsZV9yZWFkKGhhbmRsZSwgYnVmLCBuYnl0ZSk7CisjZWxzZSAgIC8vIFdJTjMyCisgICAgc3NpemVfdCByZXMgPSBsc2VlaygoaW50KShwdHJkaWZmX3QpaGFuZGxlLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gcmVzID49IDAgPyBtYXBmaWxlX3JlYWQoaGFuZGxlLCBidWYsIG5ieXRlKSA6IHJlczsKKyNlbmRpZiAgLy8gV0lOMzIKK30KKwordm9pZCoKK21hcGZpbGVfbWFwKE1hcEZpbGUqIGhhbmRsZSwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCBwcm90LAorICAgICAgICAgICAgdm9pZCoqIG1hcHBlZF9vZmZzZXQsCisgICAgICAgICAgICBzaXplX3QqIG1hcHBlZF9zaXplKQoreworICAgIHZvaWQqIG1hcHBlZF9hdCA9IE5VTEw7CisgICAgc2l6ZV90IGFsaWduX21hc2s7CisgICAgc2l6ZV90IG1hcF9vZmZzZXQ7CisgICAgc2l6ZV90IG1hcF9zaXplOworCisgIC8qIEdldCB0aGUgbWFzayBmb3IgbWFwcGluZyBvZmZzZXQgYWxpZ25tZW50LiAqLworI2lmZGVmICBXSU4zMgorICAgIERXT1JEIHdpbjMyX3Byb3Q7CisgICAgRFdPUkQgd2luMzJfbWFwOworICAgIEhBTkRMRSBtYXBfaGFuZGxlOworICAgIExBUkdFX0lOVEVHRVIgY29udmVydGVyOworICAgIFNZU1RFTV9JTkZPIHN5c19pbmZvOworICAgIEdldFN5c3RlbUluZm8oJnN5c19pbmZvKTsKKyAgICBhbGlnbl9tYXNrID0gc3lzX2luZm8uZHdBbGxvY2F0aW9uR3JhbnVsYXJpdHkgLSAxOworI2Vsc2UgICAvLyBXSU4zMgorICAgIGFsaWduX21hc2sgPSBnZXRwYWdlc2l6ZSgpIC0gMTsKKyNlbmRpZiAgLy8gV0lOMzIKKworICAgIC8qIEFkanVzdCBtYXBwaW5nIG9mZnNldCBhbmQgbWFwcGluZyBzaXplIGFjY29yZGluZ2x5IHRvCisgICAgICogdGhlIG1hcHBpbmcgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gKi8KKyAgICBtYXBfb2Zmc2V0ID0gb2Zmc2V0ICYgfmFsaWduX21hc2s7CisgICAgbWFwX3NpemUgPSAoc2l6ZV90KShvZmZzZXQgLSBtYXBfb2Zmc2V0ICsgc2l6ZSk7CisKKyAgICAvKiBNYWtlIHN1cmUgbWFwcGluZyBzaXplIGRvZXNuJ3QgZXhjZWVkIDRHLiAqLworICAgIGlmIChtYXBfc2l6ZSA8IHNpemUpIHsKKyAgICAgICAgZXJybm8gPSBFRkJJRzsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogTWFwIHRoZSBzZWN0aW9uLiAqLworI2lmZGVmICBXSU4zMgorICAgIC8qIENvbnZlcnQgdG8gV2luMzIgcGFnZSBwcm90ZWN0aW9uIGFuZCBtYXBwaW5nIHR5cGUuICovCisgICAgd2luMzJfcHJvdCA9IFBBR0VfUkVBRE9OTFk7CisgICAgd2luMzJfbWFwID0gRklMRV9NQVBfUkVBRDsKKyAgICBpZiAocHJvdCAhPSBQUk9UX05PTkUpIHsKKyAgICAgICAgaWYgKChwcm90ICYgKFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpKSA9PSAwKSB7CisgICAgICAgICAgICB3aW4zMl9wcm90ID0gUEFHRV9SRUFET05MWTsKKyAgICAgICAgICAgIHdpbjMyX21hcCA9IEZJTEVfTUFQX1JFQUQ7CisgICAgICAgIH0gZWxzZSBpZiAoKHByb3QgJiAoUFJPVF9XUklURSB8IFBST1RfRVhFQykpID09CisgICAgICAgICAgICAgICAgICAgKFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpKSB7CisgICAgICAgICAgICB3aW4zMl9wcm90ID0gUEFHRV9FWEVDVVRFX1JFQURXUklURTsKKyAgICAgICAgICAgIHdpbjMyX21hcCA9IEZJTEVfTUFQX1dSSVRFOworICAgICAgICB9IGVsc2UgaWYgKChwcm90ICYgUFJPVF9XUklURSkgPT0gUFJPVF9XUklURSkgeworICAgICAgICAgICAgd2luMzJfcHJvdCA9IFBBR0VfUkVBRFdSSVRFOworICAgICAgICAgICAgd2luMzJfbWFwID0gRklMRV9NQVBfV1JJVEU7CisgICAgICAgIH0gZWxzZSBpZiAoKHByb3QgJiBQUk9UX0VYRUMpID09IFBST1RfRVhFQykgeworICAgICAgICAgICAgd2luMzJfcHJvdCA9IFBBR0VfRVhFQ1VURV9SRUFEOworICAgICAgICAgICAgd2luMzJfbWFwID0gRklMRV9NQVBfUkVBRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnZlcnRlci5RdWFkUGFydCA9IG1hcF9vZmZzZXQgKyBtYXBfc2l6ZTsKKyAgICBtYXBfaGFuZGxlID0gQ3JlYXRlRmlsZU1hcHBpbmcoaGFuZGxlLCBOVUxMLCB3aW4zMl9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuSGlnaFBhcnQsIGNvbnZlcnRlci5Mb3dQYXJ0LCBOVUxMKTsKKyAgICBpZiAobWFwX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGNvbnZlcnRlci5RdWFkUGFydCA9IG1hcF9vZmZzZXQ7CisgICAgICAgIG1hcHBlZF9hdCA9IE1hcFZpZXdPZkZpbGUobWFwX2hhbmRsZSwgd2luMzJfbWFwLCBjb252ZXJ0ZXIuSGlnaFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLkxvd1BhcnQsIG1hcF9zaXplKTsKKyAgICAgICAgLyogTWVtb3J5IG1hcHBpbmcgKGlmIHN1Y2Nlc3NmdWwpIHdpbGwgaG9sZCBleHRyYSByZWZlcmVuY2VzIHRvIHRoZQorICAgICAgICAqIG1hcHBpbmcsIHNvIHdlIGNhbiBjbG9zZSBpdCByaWdodCBhZnRlciB3ZSBtYXBwZWQgZmlsZSB2aWV3LiAqLworICAgICAgICBDbG9zZUhhbmRsZShtYXBfaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKG1hcHBlZF9hdCA9PSBOVUxMKSB7CisgICAgICAgIGVycm5vID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbHNlICAgLy8gV0lOMzIKKyAgICBtYXBwZWRfYXQgPQorICAgICAgICBtbWFwKDAsIG1hcF9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIChpbnQpKHB0cmRpZmZfdCloYW5kbGUsIG1hcF9vZmZzZXQpOworICAgIGlmIChtYXBwZWRfYXQgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYgIC8vIFdJTjMyCisKKyAgICAqbWFwcGVkX29mZnNldCA9IChjaGFyKiltYXBwZWRfYXQgKyAob2Zmc2V0IC0gbWFwX29mZnNldCk7CisgICAgKm1hcHBlZF9zaXplID0gc2l6ZTsKKworICAgIHJldHVybiBtYXBwZWRfYXQ7Cit9CisKK2ludAorbWFwZmlsZV91bm1hcCh2b2lkKiBtYXBwZWRfYXQsIHNpemVfdCBsZW4pCit7CisjaWZkZWYgV0lOMzIKKyAgICBpZiAoIVVubWFwVmlld09mRmlsZShtYXBwZWRfYXQpKSB7CisgICAgICAgIGVycm5vID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZWxzZSAgIC8vIFdJTjMyCisgICAgcmV0dXJuIG11bm1hcChtYXBwZWRfYXQsIGxlbik7CisjZW5kaWYgIC8vIFdJTjMyCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWFwZmlsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL21hcGZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYwMjFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL21hcGZpbGUuaApAQCAtMCwwICsxLDEzMSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworLyoKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiByb3V0aW5lcyB0aGF0IGltcGxlbWVudCBwbGF0Zm9ybS1pbmRlcGVuZGVudAorICogZmlsZSBJL08uCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCit0eXBlZGVmIHN0cnVjdCBNYXBGaWxlIE1hcEZpbGU7CisKKyNpZmRlZiBXSU4zMgorLyogRGVjbGFyZSBjb25zdGFudHMgdGhhdCBhcmUgbWlzc2luZyBpbiBXaW4zMiBoZWFkZXJzLiAqLworI2RlZmluZSBQUk9UX1JFQUQgICAweDEKKyNkZWZpbmUgUFJPVF9XUklURSAgMHgyCisjZGVmaW5lIFBST1RfRVhFQyAgIDB4NAorI2RlZmluZSBQUk9UX05PTkUgICAweDAKKyNlbmRpZgorCisvKiBDaGVja3MgaWYgZmlsZSBoYW5kbGUgaXMgYSB2YWxpZCBvbmUuCisgKiBSZXR1cm46CisgKiAgYm9vbGVhbjogMSBpZiBoYW5kbGUgaXMgdmFsaWQsIG9yIDAgaWYgaXQncyBub3QgdmFsaWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CittYXBmaWxlX2lzX3ZhbGlkKE1hcEZpbGUqIGhhbmRsZSkKK3sKKyAgICByZXR1cm4gaGFuZGxlICE9ICh2b2lkKikocHRyZGlmZl90KS0xOworfQorCisvKiBPcGVucyBmaWxlIGluIHNlbGVjdGVkIG1vZGUuCisgKiBQYXJhbToKKyAqICBwYXRoIC0gUGF0aCB0byB0aGUgZmlsZSB0byBvcGVuLgorICogIG9mbGFnIC0gRGVmaW5lcyBtb2RlIGluIHdoaWNoIGZpbGUgaXMgdG8gYmUgb3BlbmVkLiBUaGlzIHZhbHVlIGZvbGxvd3MgdGhlCisgKiAgICAgIHN5bWFudGljcyBvZiBPX1hYWCBmbGFncyBkZWZpbmVkIGZvciBzdGFuZGFyZCBvcGVuIHJvdXRpbmUuCisgKiAgc2hhcmVfbW9kZSBEZWZpbmVzIHNoYXJpbmcgbW9kZSBmb3IgdGhlIG9wZW5lZCBmaWxlLiBUaGlzIHZhbHVlIGZvbGxvd3MgdGhlCisgKiAgICAgIHN5bWFudGljcyBvZiBTX0lYWFggZmxhZ3MgZGVmaW5lZCBmb3Igc3RhbmRhcmQgb3BlbiByb3V0aW5lLgorICogUmV0dXJuOgorICogIEEgdmFsaWQgaGFuZGxlIHRvIHRoZSBvcGVuZWQgZmlsZSBvbiBzdWNjZXNzLCBvciBhbiBpbnZhbGlkIHZhbHVlIG9uCisgKiAgZmFpbHVyZS4gSW4gY2FzZSBvZiBmYWlsdXJlIGVycm5vIGNvbnRhaW5zIGVycm9yIGNvZGUuCisgKi8KK2V4dGVybiBNYXBGaWxlKiBtYXBmaWxlX29wZW4oY29uc3QgY2hhciogcGF0aCwgaW50IG9mbGFnLCBpbnQgc2hhcmVfbW9kZSk7CisKKy8qIENsb3NlcyBhIGZpbGUgaGFuZGxlIG9wZW5lZCB3aXRoIG1hcGZpbGVfb3BlbiByb3V0aW5lLgorICogUGFyYW06CisgKiAgaGFuZGxlIC0gQSBoYW5kbGUgdG8gYSBmaWxlIHByZXZpb3VzbHkgb2J0YWluZWQgdmlhIHN1Y2Nlc3NmdWwgY2FsbCB0bworICogICAgICBtYXBmaWxlX29wZW4gcm91dGluZS4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUgd2l0aCBlcnJubyBjb250YWluaW5nIHRoZSBlcnJvciBjb2RlLgorICovCitleHRlcm4gaW50IG1hcGZpbGVfY2xvc2UoTWFwRmlsZSogaGFuZGxlKTsKKworLyogUmVhZHMgZnJvbSBhIGZpbGUgb3BlbmVkIHdpdGggbWFwZmlsZV9vcGVuIHJvdXRpbmUuCisgKiBFeGNlcHQgZm9yIGhhbmRsZSBwYXJhbWV0ZXIsIHNlbWFudGljcyBvZiB0aGlzIGNhbGwgYXJlIHRoZSBzYW1lIGFzIGZvcgorICogdGhlIHJlZ3VhbGFyIHJlYWQgcm91dGluZS4KKyAqIFBhcmFtOgorICogIGhhbmRsZSAtIEEgaGFuZGxlIHRvIGEgZmlsZSBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSBzdWNjZXNzZnVsIGNhbGwgdG8KKyAqICAgICAgbWFwZmlsZV9vcGVuIHJvdXRpbmUuCisgKi8KK2V4dGVybiBzc2l6ZV90IG1hcGZpbGVfcmVhZChNYXBGaWxlKiBoYW5kbGUsIHZvaWQqIGJ1Ziwgc2l6ZV90IG5ieXRlKTsKKworLyogUmVhZHMgZnJvbSBhIHNwZWNpZmljIG9mZnNldCBpbiBhIGZpbGUgb3BlbmVkIHdpdGggbWFwZmlsZV9vcGVuIHJvdXRpbmUuCisgKiBQYXJhbToKKyAqICBoYW5kbGUgLSBBIGhhbmRsZSB0byBhIGZpbGUgcHJldmlvdXNseSBvYnRhaW5lZCB2aWEgc3VjY2Vzc2Z1bCBjYWxsIHRvCisgKiAgICAgIG1hcGZpbGVfb3BlbiByb3V0aW5lLgorICogIG9mZnNldCAtIE9mZnNldCBpbiB0aGUgZmlsZSB3aGVyZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKiAgUmVzdCBvZiB0aGUgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlIGFyZSB0aGUgc2FtZSBhcyBpbiBmaWxlX3JlYWQuCisgKi8KK2V4dGVybiBzc2l6ZV90IG1hcGZpbGVfcmVhZF9hdChNYXBGaWxlKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ieXRlKTsKKworLyogTWFwcyBhIHNlY3Rpb24gb2YgYSBmaWxlIHRvIG1lbW9yeS4KKyAqIFBhcmFtOgorICogIGhhbmRsZSAtIEEgaGFuZGxlIHRvIGEgZmlsZSBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSBzdWNjZXNzZnVsIGNhbGwgdG8KKyAqICAgICAgbWFwZmlsZV9vcGVuIHJvdXRpbmUuCisgKiAgb2Zmc2V0IC0gT2Zmc2V0IGluIHRoZSBmaWxlIHdoZXJlIG1hcHBpbmcgc2hvdWxkIGJlZ2luLgorICogIHNpemUgLSBOdW1iZXIgb2YgYnl0ZXMgc3RhcnRpbmcgd2l0aCBvZmZzZXQgdGhhdCBzaG91bGQgYmUgbWFwcGVkLgorICogIHByb3QgLSBEZXRlcm1pbmVzIHdoZXRoZXIgcmVhZCwgd3JpdGUsIGV4ZWN1dGUsIG9yIHNvbWUgY29tYmluYXRpb24gb2YKKyAqICAgICAgYWNjZXNzZXMgYXJlIHBlcm1pdHRlZCB0byB0aGUgZGF0YSBiZWluZyBtYXBwZWQuIFRoaXMgcGFyYW1ldGVyIGhhcyB0aGUKKyAqICAgICAgc2FtZSBzZW1hbnRpY3MgYXMgaW4gcmVndWxhciBtbWFwIHJvdXRlbmUuCisgKiAgbWFwcGVkX29mZnNldCAtIFVwb24gc3VjY2VzcywgY29udGFpbnMgcG9pbnRlciB0byB0aGUgcmVxdWVzdGVkIG9mZnNldAorICogICAgICB3aXRoaW4gdGhlIG1hcHBlZCBzZWN0aW9uIG9mIHRoZSBmaWxlLgorICogIHNpemUgLSBVcG9uIHN1Y2Nlc3MsIGNvbnRhaW5zIHRvdGFsIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgYWN0dWFsbHkKKyAqICAgICAgbWFwcGVkLgorICogUmV0dXJuOgorICogIFVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIHJldHVybnMgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIG1lbW9yeQorICogIG1hcHBpbmcsIGNvbnRhaW5pbmcgbWFwcGluZyBvZiB0aGUgcmVxdWVzdGVkIHNlY3Rpb24gb2YgYSBmaWxlLiBOb3RlIHRoYXQKKyAqICB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoaXMgcm91dGluZSBkb2Vzbid0IG5lY2Vzc2FyaWx5IHBvaW50cyB0byB0aGUgYmVnaW5uaW5nCisgKiAgb2YgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIG1hcHBpbmcuIFVzZSB2YWx1ZSByZXR1cm5lZCBpbiBtYXBwZWRfb2Zmc2V0CisgKiAgcGFyYW1ldGVyIHRvIGdldCBhY3R1YWwgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXF1ZXN0ZWQgc2VjdGlvbgorICogIG1hcHBpbmcuIFZhbHVlIHJldHVybmVkIGZyb20gdGhpcyByb3V0aW5lIG11c3QgZXZlbnR1YWxseSBiZSBwYXNzZWQgdG8KKyAqICBmaWxlX3VubWFwX3NlY3Rpb24gcmVvdXRpbmUgdG8gdW5tYXAgc2VjdGlvbiBtYXBwZWQgd2l0aCB0aGlzIHJvdXRpbmUuCisgKiAgVGhpcyByb3V0aW5lIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlIGFuZCBzZXRzIGVycm5vIHRvIGluZGljYXRlIHRoZSBlcnJvci4KKyAqLworZXh0ZXJuIHZvaWQqIG1hcGZpbGVfbWFwKE1hcEZpbGUqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBtYXBwZWRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogbWFwcGVkX3NpemUpOworCisvKiBVbWFwcyBzZWN0aW9uIG9mIGEgZmlsZSBwcmV2aW91c2x5IG1hcHBlZCB3aXRoIG1hcGZpbGVfbWFwIHJvdXRpbmUuCisgKiBQYXJhbToKKyAqICBtYXBwZWRfYXQgLSBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHNlY3Rpb24gb2YgYSBmaWxlCisgKiAgICAgIHRoYXQgaXMgdG8gYmUgdW5tYXBwZWQuCisgKiAgbGVuIC0gQnl0ZSBzaXplIG9mIHRoZSBzZWN0aW9uIHRoYXQgaXMgdG8gYmUgdW5tYXBwZWQuCisgKiBSZXR1cm46CisgKiAgVXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gcmV0dXJucyAwLiBPdGhlcndpc2UsIHJldHVybnMgLTEgYW5kIHNldHMKKyAqICBlcnJubyB0byBpbmRpY2F0ZSB0aGUgZXJyb3IuCisgKi8KK2V4dGVybiBpbnQgbWFwZmlsZV91bm1hcCh2b2lkKiBtYXBwZWRfYXQsIHNpemVfdCBsZW4pOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9taXNjLmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYTQ2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWlzYy5jCkBAIC0wLDAgKzEsMzI2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL21pc2MuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgIEUoLi4uKSAgICBkZXJyb3IoX19WQV9BUkdTX18pCisKK2V4dGVybiB2b2lkCitwcmludF90YWJ1bGFyKCBjb25zdCBjaGFyKiogc3RyaW5ncywgaW50ICBjb3VudCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcmVmaXgsICBpbnQgIHdpZHRoICkKK3sKKyAgICBpbnQgIG5yb3dzLCBuY29scywgciwgYywgbiwgbWF4dyA9IDA7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworICAgICAgICBpbnQgIGxlbiA9IHN0cmxlbihzdHJpbmdzW25dKTsKKyAgICAgICAgaWYgKGxlbiA+IG1heHcpCisgICAgICAgICAgICBtYXh3ID0gbGVuOworICAgIH0KKyAgICBtYXh3ICs9IDI7CisgICAgbmNvbHMgPSB3aWR0aC9tYXh3OworICAgIG5yb3dzID0gKGNvdW50ICsgbmNvbHMtMSkvbmNvbHM7CisKKyAgICBmb3IgKHIgPSAwOyByIDwgbnJvd3M7IHIrKykgeworICAgICAgICBwcmludGYoICIlcyIsIHByZWZpeCApOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgbmNvbHM7IGMrKykgeworICAgICAgICAgICAgaW50ICBpbmRleCA9IGMqbnJvd3MgKyByOworICAgICAgICAgICAgaWYgKGluZGV4ID49IGNvdW50KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoICIlLSpzIiwgbWF4dywgc3RyaW5nc1tpbmRleF0gKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoICJcbiIgKTsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkCitzdHJpbmdfdHJhbnNsYXRlX2NoYXIoIGNoYXIqICBzdHIsIGNoYXIgZnJvbSwgY2hhciB0byApCit7CisgICAgY2hhciogIHAgPSBzdHI7CisgICAgd2hpbGUgKHAgIT0gTlVMTCAmJiAocCA9IHN0cmNocihwLCBmcm9tKSkgIT0gTlVMTCkKKyAgICAgICAgKnArKyA9IHRvOworfQorCitleHRlcm4gdm9pZAorYnVmZmVyX3RyYW5zbGF0ZV9jaGFyKCBjaGFyKiAgICAgICAgYnVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgIGJ1ZmZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICBmcm9tQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgIHRvQ2hhciApCit7CisgICAgaW50IGxlbiA9IHN0cmxlbihzcmMpOworICAgIGJ1ZmZlcl90cmFuc2xhdGVfY2hhcl93aXRoX2xlbihidWZmLCBidWZmTGVuLCBzcmMsIGxlbiwgZnJvbUNoYXIsIHRvQ2hhcik7Cit9CisKK2V4dGVybiB2b2lkCitidWZmZXJfdHJhbnNsYXRlX2NoYXJfd2l0aF9sZW4oY2hhciogICAgICAgIGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgIGJ1ZmZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgc3JjTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICBmcm9tQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgdG9DaGFyKQoreworICAgIGlmIChzcmNMZW4gPj0gYnVmZkxlbikKKyAgICAgICAgc3JjTGVuID0gYnVmZkxlbi0xOworCisgICAgbWVtY3B5KGJ1ZmYsIHNyYywgc3JjTGVuKTsKKyAgICBidWZmW3NyY0xlbl0gPSAwOworCisgICAgc3RyaW5nX3RyYW5zbGF0ZV9jaGFyKCBidWZmLCBmcm9tQ2hhciwgdG9DaGFyICk7Cit9CisKKworLyoqIFRFTVAgQ0hBUiBTVFJJTkdTCisgKioKKyAqKiBpbXBsZW1lbnQgYSBjaXJjdWxhciByaW5nIG9mIHRlbXBvcmFyeSBzdHJpbmcgYnVmZmVycworICoqLworCit0eXBlZGVmIHN0cnVjdCBUZW1wdHJpbmcgeworICAgIHN0cnVjdCBUZW1wU3RyaW5nKiAgbmV4dDsKKyAgICBjaGFyKiAgICAgICAgICAgICAgIGJ1ZmZlcjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNpemU7Cit9IFRlbXBTdHJpbmc7CisKKyNkZWZpbmUgIE1BWF9URU1QX1NUUklOR1MgICAxNgorCitzdGF0aWMgVGVtcFN0cmluZyAgX3RlbXBfc3RyaW5nc1sgTUFYX1RFTVBfU1RSSU5HUyBdOworc3RhdGljIGludCAgICAgICAgIF90ZW1wX3N0cmluZ19uOworCitleHRlcm4gY2hhcioKK3RlbXBzdHJfZ2V0KCBpbnQgIHNpemUgKQoreworICAgIFRlbXBTdHJpbmcqICB0ID0gJl90ZW1wX3N0cmluZ3NbX3RlbXBfc3RyaW5nX25dOworCisgICAgaWYgKCArK190ZW1wX3N0cmluZ19uID49IE1BWF9URU1QX1NUUklOR1MgKQorICAgICAgICBfdGVtcF9zdHJpbmdfbiA9IDA7CisKKyAgICBzaXplICs9IDE7ICAvKiByZXNlcnZlIDEgY2hhciBmb3IgdGVybWluYXRpbmcgemVybyAqLworCisgICAgaWYgKHQtPnNpemUgPCBzaXplKSB7CisgICAgICAgIHQtPmJ1ZmZlciA9IHJlYWxsb2MoIHQtPmJ1ZmZlciwgc2l6ZSApOworICAgICAgICBpZiAodC0+YnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlcnJvciggIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpemUgKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgdC0+c2l6ZSAgID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuICB0LT5idWZmZXI7Cit9CisKK2V4dGVybiBjaGFyKgordGVtcHN0cl9mb3JtYXQoIGNvbnN0IGNoYXIqICBmbXQsIC4uLiApCit7CisgICAgdmFfbGlzdCAgYXJnczsKKyAgICBjaGFyKiAgICByZXN1bHQ7CisgICAgU1RSQUxMT0NfREVGSU5FKHMpOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgc3RyYWxsb2NfZm9ybWF0dihzLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXN1bHQgPSBzdHJhbGxvY190b190ZW1wc3RyKHMpOworICAgIHN0cmFsbG9jX3Jlc2V0KHMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBRVU9USU5HCisgKioKKyAqKiBkdW1wcyBhIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgYSBzdHJpbmcuIHRoaXMgcmVwbGFjZXMKKyAqKiBuZXdsaW5lcyB3aXRoIFxuLCBldGMuLi4KKyAqKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIqCitxdW90ZV9ieXRlcyggY29uc3QgY2hhciogIHN0ciwgaW50ICBsZW4gKQoreworICAgIFNUUkFMTE9DX0RFRklORShzKTsKKyAgICBjaGFyKiAgcTsKKworICAgIHN0cmFsbG9jX2FkZF9xdW90ZV9ieXRlcyggcywgc3RyLCBsZW4gKTsKKyAgICBxID0gc3RyYWxsb2NfdG9fdGVtcHN0ciggcyApOworICAgIHN0cmFsbG9jX3Jlc2V0KHMpOworICAgIHJldHVybiBxOworfQorCitleHRlcm4gY29uc3QgY2hhcioKK3F1b3RlX3N0ciggY29uc3QgY2hhciogIHN0ciApCit7CisgICAgaW50ICBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgICByZXR1cm4gcXVvdGVfYnl0ZXMoIHN0ciwgbGVuICk7Cit9CisKKy8qKiBIRVhBREVDSU1BTCBDSEFSQUNURVIgU0VRVUVOQ0VTCisgKiovCisKK3N0YXRpYyBpbnQKK2hleGRpZ2l0KCBpbnQgIGMgKQoreworICAgIHVuc2lnbmVkICBkOworCisgICAgZCA9ICh1bnNpZ25lZCkoYyAtICcwJyk7CisgICAgaWYgKGQgPCAxMCkgcmV0dXJuIGQ7CisKKyAgICBkID0gKHVuc2lnbmVkKShjIC0gJ2EnKTsKKyAgICBpZiAoZCA8IDYpIHJldHVybiBkKzEwOworCisgICAgZCA9ICh1bnNpZ25lZCkoYyAtICdBJyk7CisgICAgaWYgKGQgPCA2KSByZXR1cm4gZCsxMDsKKworICAgIHJldHVybiAtMTsKK30KKworaW50CitoZXgyaW50KCBjb25zdCB1aW50OF90KiAgaGV4LCBpbnQgIGxlbiApCit7CisgICAgaW50ICByZXN1bHQgPSAwOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGludCAgYyA9IGhleGRpZ2l0KCpoZXgrKyk7CisgICAgICAgIGlmIChjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByZXN1bHQgPSAocmVzdWx0IDw8IDQpIHwgYzsKKyAgICAgICAgbGVuIC0tOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitpbnQyaGV4KCB1aW50OF90KiAgaGV4LCBpbnQgIGxlbiwgaW50ICB2YWwgKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICBoZXhjaGFyc1sxNl0gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgd2hpbGUgKCAtLWxlbiA+PSAwICkKKyAgICAgICAgKmhleCsrID0gaGV4Y2hhcnNbKHZhbCA+PiAobGVuKjQpKSAmIDE1XTsKK30KKworLyoqIFNUUklORyBQQVJBTUVURVIgUEFSU0lORworICoqLworCitpbnQKK3N0cnRvaShjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkKK3sKKyAgICBsb25nIHZhbDsKKworICAgIGVycm5vID0gMDsKKyAgICB2YWwgPSBzdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyAgICBpZiAoZXJybm8pIHsKKyAgICAgICAgcmV0dXJuICh2YWwgPT0gTE9OR19NQVgpID8gSU5UX01BWCA6IElOVF9NSU47CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZhbCA9PSAoaW50KXZhbCkgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgICAgICByZXR1cm4gdmFsID4gMCA/IElOVF9NQVggOiBJTlRfTUlOOworICAgICAgICB9CisgICAgfQorfQorCitpbnQKK2dldF90b2tlbl92YWx1ZShjb25zdCBjaGFyKiBwYXJhbXMsIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIHZhbHVlLCBpbnQgdmFsX3NpemUpCit7CisgICAgY29uc3QgY2hhciogdmFsX2VuZDsKKyAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpOworICAgIGNvbnN0IGNoYXIqIHBhcl9lbmQgPSBwYXJhbXMgKyBzdHJsZW4ocGFyYW1zKTsKKyAgICBjb25zdCBjaGFyKiBwYXJfc3RhcnQgPSBzdHJzdHIocGFyYW1zLCBuYW1lKTsKKworICAgIC8qIFNlYXJjaCBmb3IgJ25hbWU9JyAqLworICAgIHdoaWxlIChwYXJfc3RhcnQgIT0gTlVMTCkgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3aXRoaW4gdGhlIHBhcmFtZXRlcnMgYnVmZmVyLiAqLworICAgICAgICBpZiAoKHBhcl9lbmQgLSBwYXJfc3RhcnQpIDwgbGVuKSB7CisgICAgICAgICAgICBwYXJfc3RhcnQgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgcGFyX3N0YXJ0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIDxuYW1lPiwgYW5kIG9ubHkKKyAgICAgICAgICogdGhlbiBjaGVjayBmb3IgJz0nIHZhbHVlIHNlcGFyYXRvci4gKi8KKyAgICAgICAgaWYgKChwYXJfc3RhcnQgPT0gcGFyYW1zIHx8ICgqKHBhcl9zdGFydCAtIDEpID09ICcgJykpICYmCisgICAgICAgICAgICAgICAgcGFyX3N0YXJ0W2xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBGYWxzZSBwb3NpdGl2ZS4gTW92ZSBvbi4uLiAqLworICAgICAgICBwYXJfc3RhcnQgPSBzdHJzdHIocGFyX3N0YXJ0ICsgMSwgbmFtZSk7CisgICAgfQorICAgIGlmIChwYXJfc3RhcnQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogQWR2YW5jZSBwYXN0ICduYW1lPScsIGFuZCBjYWxjdWxhdGUgdmFsdWUncyBzdHJpbmcgbGVuZ3RoLiAqLworICAgIHBhcl9zdGFydCArPSBsZW4gKyAxOworICAgIHZhbF9lbmQgPSBzdHJjaHIocGFyX3N0YXJ0LCAnICcpOworICAgIGlmICh2YWxfZW5kID09IE5VTEwpIHsKKyAgICAgICAgdmFsX2VuZCA9IHBhcl9zdGFydCArIHN0cmxlbihwYXJfc3RhcnQpOworICAgIH0KKyAgICBsZW4gPSB2YWxfZW5kIC0gcGFyX3N0YXJ0OworCisgICAgLyogQ2hlY2sgaWYgZml0cy4uLiAqLworICAgIGlmICgobGVuICsgMSkgPD0gdmFsX3NpemUpIHsKKyAgICAgICAgbWVtY3B5KHZhbHVlLCBwYXJfc3RhcnQsIGxlbik7CisgICAgICAgIHZhbHVlW2xlbl0gPSAnXDAnOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbGVuICsgMTsKKyAgICB9Cit9CisKK2ludAorZ2V0X3Rva2VuX3ZhbHVlX2FsbG9jKGNvbnN0IGNoYXIqIHBhcmFtcywgY29uc3QgY2hhciogbmFtZSwgY2hhcioqIHZhbHVlKQoreworICAgIGNoYXIgdG1wOworICAgIGludCByZXM7CisKKyAgICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiBzdHJpbmcgYnVmZmVyIHJlcXVpcmVkIGZvciB0aGUgdmFsdWUuICovCisgICAgY29uc3QgaW50IHZhbF9zaXplID0gZ2V0X3Rva2VuX3ZhbHVlKHBhcmFtcywgbmFtZSwgJnRtcCwgMCk7CisgICAgaWYgKHZhbF9zaXplIDwgMCkgeworICAgICAgICAqdmFsdWUgPSBOVUxMOworICAgICAgICByZXR1cm4gdmFsX3NpemU7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgc3RyaW5nIGJ1ZmZlciwgYW5kIHJldHJpZXZlIHRoZSB2YWx1ZS4gKi8KKyAgICAqdmFsdWUgPSAoY2hhciopbWFsbG9jKHZhbF9zaXplKTsKKyAgICBpZiAoKnZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgRSgiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZWQgJWQgYnl0ZXMgZm9yIHN0cmluZyBidWZmZXIuIiwKKyAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbF9zaXplKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICByZXMgPSBnZXRfdG9rZW5fdmFsdWUocGFyYW1zLCBuYW1lLCAqdmFsdWUsIHZhbF9zaXplKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEUoIiVzOiBVbmFibGUgdG8gcmV0cmlldmUgdmFsdWUgaW50byBhbGxvY2F0ZWQgYnVmZmVyLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGZyZWUoKnZhbHVlKTsKKyAgICAgICAgKnZhbHVlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitpbnQKK2dldF90b2tlbl92YWx1ZV9pbnQoY29uc3QgY2hhciogcGFyYW1zLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQqIHZhbHVlKQoreworICAgIGNoYXIgdmFsX3N0cls2NF07ICAgLy8gU2hvdWxkIGJlIGVub3VnaCBmb3IgYWxsIG51bWVyaWMgdmFsdWVzLgorICAgIGlmICghZ2V0X3Rva2VuX3ZhbHVlKHBhcmFtcywgbmFtZSwgdmFsX3N0ciwgc2l6ZW9mKHZhbF9zdHIpKSkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICp2YWx1ZSA9IHN0cnRvaSh2YWxfc3RyLCAoY2hhcioqKU5VTEwsIDEwKTsKKyAgICAgICAgaWYgKGVycm5vKSB7CisgICAgICAgICAgICBFKCIlczogVmFsdWUgJyVzJyBvZiB0aGUgcGFyYW1ldGVyICclcycgaW4gJyVzJyBpcyBub3QgYSBkZWNpbWFsIG51bWJlci4iLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHZhbF9zdHIsIG5hbWUsIHBhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvbWlzYy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzNjNmZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL21pc2MuaApAQCAtMCwwICsxLDE1MCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiogVEFCVUxBUiBPVVRQVVQKKyAqKgorICoqIHByaW50cyBhIGxpc3Qgb2Ygc3RyaW5ncyBpbiByb3cvY29sdW1uIGZvcm1hdAorICoqCisgKiovCisKK2V4dGVybiB2b2lkICAgcHJpbnRfdGFidWxhciggY29uc3QgY2hhcioqIHN0cmluZ3MsIGludCAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcmVmaXgsICBpbnQgIHdpZHRoICk7CisKKy8qKiBDSEFSQUNURVIgVFJBTlNMQVRJT04KKyAqKgorICoqIGNvbnZlcnRzIG9uZSBjaGFyYWN0ZXIgaW50byBhbm90aGVyIGluIHN0cmluZ3MKKyAqKi8KKworZXh0ZXJuIHZvaWQgICBidWZmZXJfdHJhbnNsYXRlX2NoYXIoIGNoYXIqICAgICAgICBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICBidWZmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgIGZyb21DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICB0b0NoYXIgKTsKKy8vIE5vdGU6IHxzcmNMZW58IGRvZXNuJ3QgaW5jbHVkZSB0aGUgbnVsbC10ZXJtaW5hdG9yLgorZXh0ZXJuIHZvaWQgICBidWZmZXJfdHJhbnNsYXRlX2NoYXJfd2l0aF9sZW4oY2hhciogICAgICAgIGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgYnVmZkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgc3JjTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgIGZyb21DaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgIHRvQ2hhciApOworCitleHRlcm4gdm9pZCAgIHN0cmluZ190cmFuc2xhdGVfY2hhciggY2hhciogIHN0ciwgY2hhciBmcm9tLCBjaGFyIHRvICk7CisKKy8qKiBURU1QIENIQVIgU1RSSU5HUworICoqCisgKiogaW1wbGVtZW50IGEgY2lyY3VsYXIgcmluZyBvZiB0ZW1wb3Jhcnkgc3RyaW5nIGJ1ZmZlcnMKKyAqKi8KKworZXh0ZXJuIGNoYXIqICB0ZW1wc3RyX2dldCggaW50ICAgc2l6ZSApOworZXh0ZXJuIGNoYXIqICB0ZW1wc3RyX2Zvcm1hdCggY29uc3QgY2hhciogIGZtdCwgLi4uICk7CisKKy8qKiBRVU9USU5HCisgKioKKyAqKiBkdW1wcyBhIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgYSBzdHJpbmcuIHRoaXMgcmVwbGFjZXMKKyAqKiBuZXdsaW5lcyB3aXRoIFxuLCBldGMuLi4KKyAqKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIqICAgcXVvdGVfYnl0ZXMoIGNvbnN0IGNoYXIqICBzdHIsIGludCAgbGVuICk7CitleHRlcm4gY29uc3QgY2hhciogICBxdW90ZV9zdHIoIGNvbnN0IGNoYXIqICBzdHIgKTsKKworLyoqIERFQ0lNQUwgQU5EIEhFWEFERUNJTUFMIENIQVJBQ1RFUiBTRVFVRU5DRVMKKyAqKi8KKworLyogZGVjb2RlcyBhIHNlcXVlbmNlIG9mICdsZW4nIGhleGFkZWNpbWFsIGNoYXJzIGZyb20gJ2hleCcgaW50bworICogYW4gaW50ZWdlci4gcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yIChpLmUuIGJhZGx5IGZvcm1lZCBjaGFycykKKyAqLworZXh0ZXJuIGludCAgICBoZXgyaW50KCBjb25zdCB1aW50OF90KiAgaGV4LCBpbnQgIGxlbiApOworCisvKiBlbmNvZGVzIGFuIGludGVnZXIgJ3ZhbCcgaW50byAnbGVuJyBoZXhhZGVjaW1hbCBjaGFyYXRlcnMgaW50byAnaGV4JyAqLworZXh0ZXJuIHZvaWQgICBpbnQyaGV4KCB1aW50OF90KiAgaGV4LCBpbnQgIGxlbiwgaW50ICB2YWwgKTsKKworLyoqIFNUUklORyBQQVJBTUVURVIgUEFSU0lORworICoqLworCisvKiBBIHN0cmljdCAnaW50JyB2ZXJzaW9uIG9mIHRoZSAnc3RydG9sJy4KKyAqIFRoaXMgcm91dGluZSBpcyBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlIHN0YW5kYXJkICdzdHJ0b2wnIGZvciAzMi82NCBiaXQKKyAqIHBvcnRhYmlsaXR5LgorICovCitleHRlcm4gaW50IHN0cnRvaShjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSk7CisKKy8qIEdldHMgYSBwYXJhbWV0ZXIgdmFsdWUgb3V0IG9mIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLgorICogUGFyYW1ldGVyIGZvcm1hdCBmb3IgdGhpcyByb3V0aW5lIGlzIGFzIHN1Y2g6CisgKiAgICAgICI8bmFtZTE+PTx2YWx1ZTE+IDxuYW1lMj49PHZhbHVlMj4gLi4uIDxuYW1lTj49PHZhbHVlTj4iCisgKiBJLmUuOgorICogIC0gRXZlcnkgcGFyYW1ldGVyIG11c3QgaGF2ZSBhIG5hbWUsIGFuZCBhIHZhbHVlLgorICogIC0gTmFtZSBhbmQgdmFsdWUgbXVzdCBiZSBzZXBhcmF0ZWQgd2l0aCAnPScuCisgKiAgLSBObyBzcGFjZXMgYXJlIGFsbG93ZWQgYXJvdW5kICc9JyBzZXBhcmF0aW5nIG5hbWUgYW5kIHZhbHVlLgorICogIC0gUGFyYW1ldGVycyBtdXN0IGJlIHNlcGFyYXRlZCB3aXRoIGEgc2luZ2xlICcgJyBjaGFyYWN0ZXIuCisgKiAgLSBObyAnPScgY2hhcmFjdGVyIGlzIGFsbG93ZWQgaW4gbmFtZSBhbmQgaW4gdmFsdWUuCisgKiBQYXJhbToKKyAqICBwYXJhbXMgLSBTdHJpbmcsIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMuCisgKiAgbmFtZSAtIFBhcmFtZXRlciBuYW1lLgorICogIHZhbHVlIC0gVXBvbiBzdWNjZXNzIGNvbnRhaW5zIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVyLgorICogIHZhbF9zaXplIC0gU2l6ZSBvZiB0aGUgJ3ZhbHVlJyBzdHJpbmcgYnVmZmVyLgorICogUmV0dXJuOgorICogIDAgb24gc3VjY2VzcywgLTEgaWYgcmVxdWVzdGVkIHBhcmFtZXRlciBpcyBub3QgZm91bmQsIG9yIChhIHBvc2l0aXZlKSBudW1iZXIKKyAqICBvZiBieXRlcywgcmVxdWlyZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGlmICd2YWx1ZScgc3RyaW5nCisgKiAgd2FzIHRvbyBzbWFsbCB0byBjb250YWluIGl0LgorICovCitleHRlcm4gaW50IGdldF90b2tlbl92YWx1ZShjb25zdCBjaGFyKiBwYXJhbXMsIGNvbnN0IGNoYXIqIG5hbWUsIGNoYXIqIHZhbHVlLCBpbnQgdmFsX3NpemUpOworCisvKiBHZXRzIGEgcGFyYW1ldGVyIHZhbHVlIG91dCBvZiB0aGUgcGFyYW1ldGVyIHN0cmluZy4KKyAqIFRoaXMgcm91dGluZSBpcyBzaW1pbGFyIHRvIGdldF90b2tlbl92YWx1ZSwgZXhjZXB0IGl0IHdpbGwgYWx3YXlzIGFsbG9jYXRlCisgKiBhIHN0cmluZyBidWZmZXIgZm9yIHRoZSB2YWx1ZS4KKyAqIFBhcmFtOgorICogIHBhcmFtcyAtIFN0cmluZywgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycy4KKyAqICBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuCisgKiAgdmFsdWUgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgYW4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW50IHRoZSB2YWx1ZSBmb3IKKyAqICAgICAgdGhlIGdpdmVuIHBhcmFtZXRlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgYnVmZmVyCisgKiAgICAgIHJldHVybmVkIGluIHRoaXMgcGFyYW1ldGVyIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm46CisgKiAgMCBvbiBzdWNjZXNzLCAtMSBpZiByZXF1ZXN0ZWQgcGFyYW1ldGVyIGlzIG5vdCBmb3VuZCwgb3IgLTIgb24KKyAqICBtZW1vcnkgZmFpbHVyZS4KKyAqLworZXh0ZXJuIGludCBnZXRfdG9rZW5fdmFsdWVfYWxsb2MoY29uc3QgY2hhciogcGFyYW1zLCBjb25zdCBjaGFyKiBuYW1lLCBjaGFyKiogdmFsdWUpOworCisvKiBHZXRzIGFuIGludGVnZXIgcGFyYW1ldGVyIHZhbHVlIG91dCBvZiB0aGUgcGFyYW1ldGVyIHN0cmluZy4KKyAqIFBhcmFtOgorICogIHBhcmFtcyAtIFN0cmluZywgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycy4gU2VlIGNvbW1lbnRzIHRvIGdldF90b2tlbl92YWx1ZQorICogICAgICByb3V0aW5lIG9uIHRoZSBwYXJhbWV0ZXJzIGZvcm1hdC4KKyAqICBuYW1lIC0gUGFyYW1ldGVyIG5hbWUuIFBhcmFtZXRlciB2YWx1ZSBtdXN0IGJlIGEgZGVjaW1hbCBudW1iZXIuCisgKiAgdmFsdWUgLSBVcG9uIHN1Y2Nlc3MgY29udGFpbnMgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlci4KKyAqIFJldHVybjoKKyAqICAwIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmIHJlcXVlc3RlZCBwYXJhbWV0ZXIgaXMgbm90IGZvdW5kLCBvciAtMiBpZiBwYXJhbWV0ZXIncworICogIGZvcm1hdCB3YXMgYmFkIChpLmUuIHZhbHVlIHdhcyBub3QgYSBkZWNpbWFsIG51bWJlcikuCisgKi8KK2V4dGVybiBpbnQgZ2V0X3Rva2VuX3ZhbHVlX2ludChjb25zdCBjaGFyKiBwYXJhbXMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCogdmFsdWUpOworCisvKiogQUxJR05NRU5UCisgKiovCisKKy8qIEFsaWduIGEgdmFsdWUgdG8gdGhlIG5leHQgbGFyZ2VyIHZhbHVlIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBhbGlnbm1lbnQuCisgKiBUaGlzIG9ubHkgd29ya3MgZm9yIGFsaWdubWVudHMgdGhhdCBhcmUgcG93ZXJzIG9mIDIuCisgKiBQYXJhbToKKyAqICB2YWx1ZSAtIFRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBhbGlnbmVkCisgKiAgYWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0aGF0IHZhbHVlIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mCisgKiBSZXR1cm46CisgKiAgVGhlIGFsaWduZWQgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxpZ24oaW50IHZhbHVlLCBpbnQgYWxpZ25tZW50KSB7CisgICAgcmV0dXJuICh2YWx1ZSArIGFsaWdubWVudCAtIDEpICYgKH4oYWxpZ25tZW50IC0gMSkpOworfQorCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wYW5pYy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhbmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5NTYwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wYW5pYy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYW5pYy5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkKK19hbmRyb2lkX3BhbmljX2RlZmF1bHRIYW5kbGVyKCBjb25zdCBjaGFyKiAgZm10LCB2YV9saXN0ICBhcmdzICkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBBTklDOiAiKTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgZXhpdCgxKTsKK30KKworc3RhdGljIEFQYW5pY0hhbmRsZXJGdW5jICBfcGFuaWNIYW5kbGVyID0gX2FuZHJvaWRfcGFuaWNfZGVmYXVsdEhhbmRsZXI7CisKK3ZvaWQgYW5kcm9pZF9wYW5pYyggY29uc3QgY2hhciogIGZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0ICBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgYW5kcm9pZF92cGFuaWMoZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKy8qIFZhcmlhbnQgb2YgYW5kcm9pZF92cGFuaWMgd2hpY2ggdGFrZSB2YV9saXN0IGZvcm1hdGluZyBhcmd1bWVudHMgKi8KK3ZvaWQgYW5kcm9pZF92cGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKQoreworICAgIF9wYW5pY0hhbmRsZXIoZm10LCBhcmdzKTsKKyAgICBhYm9ydCgpOworfQorCit2b2lkIGFuZHJvaWRfcGFuaWNfcmVnaXN0ZXJIYW5kbGVyKCBBUGFuaWNIYW5kbGVyRnVuYyAgaGFuZGxlciApCit7CisgICAgaWYgKGhhbmRsZXIgPT0gTlVMTCkKKyAgICAgICAgYW5kcm9pZF9wYW5pYygiUGFzc2luZyBOVUxMIHRvICVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIF9wYW5pY0hhbmRsZXIgPSBoYW5kbGVyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhbmljLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcGFuaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2MzZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhbmljLmgKQEAgLTAsMCArMSwzNSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogUHJpbnQgZm9ybWF0dGVkIHBhbmljIG1lc3NhZ2UgYW5kIGhhbHRzIHRoZSBwcm9jZXNzICovCit2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgYW5kcm9pZF9wYW5pYyAoIGNvbnN0IGNoYXIqICBmbXQsIC4uLiApOworCisvKiBWYXJpYW50IG9mIGFuZHJvaWRfdnBhbmljIHdoaWNoIHRha2UgdmFfbGlzdCBmb3JtYXRpbmcgYXJndW1lbnRzICovCit2b2lkIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSkgYW5kcm9pZF92cGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKTsKKworLyogQ29udmVuaWVuY2UgbWFjcm8gKi8KKyNkZWZpbmUgIEFQQU5JQyguLi4pICAgIGFuZHJvaWRfcGFuaWMoX19WQV9BUkdTX18pCisKK3R5cGVkZWYgdm9pZCAoKkFQYW5pY0hhbmRsZXJGdW5jKShjb25zdCBjaGFyKiwgdmFfbGlzdCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworLyogUmVnaXN0ZXIgYSBuZXcgcGFuaWMgaGFuZGxlci4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB1bml0LXRlc3RpbmcgKi8KK3ZvaWQgYW5kcm9pZF9wYW5pY19yZWdpc3RlckhhbmRsZXIoIEFQYW5pY0hhbmRsZXJGdW5jICBoYW5kbGVyICk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGguY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTA0YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGguY3BwCkBAIC0wLDAgKzEsNTIzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGlyc2Nhbm5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2VpbnRyX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhdGguaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8c2hsb2JqLmg+CisjaW5jbHVkZSA8dGxoZWxwMzIuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8d2luYmFzZS5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisjZGVmaW5lICBEKC4uLikgIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKworI2lmZGVmIF9XSU4zMgordXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVbmljb2RlU3RyaW5nOworI2VuZGlmICAvLyBfV0lOMzIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6UGF0aFV0aWxzOworCisvKiogUEFUSCBIQU5ETElORyBST1VUSU5FUworICoqCisgKiogIHBhdGhfcGFyZW50KCkgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBuLWxldmVsIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQorICoqICB0aGlzIHVuZGVyc3RhbmRzIC4gYW5kIC4uIHdoZW4gZW5jb3VudGVyZWQgaW4gdGhlIGlucHV0IHBhdGgKKyAqKi8KKworc3RhdGljIF9faW5saW5lX18gaW50Citpc3BhdGhzZXAoaW50ICBjKQoreworI2lmZGVmIF9XSU4zMgorICAgIHJldHVybiAoYyA9PSAnLycgfHwgYyA9PSAnXFwnKTsKKyNlbHNlCisgICAgcmV0dXJuIChjID09ICcvJyk7CisjZW5kaWYKK30KKworY2hhcioKK3BhdGhfcGFyZW50KCBjb25zdCBjaGFyKiAgcGF0aCwgaW50ICBsZXZlbHMgKQoreworICAgIGNvbnN0IGNoYXIqICBlbmQgPSBwYXRoICsgc3RybGVuKHBhdGgpOworICAgIGNoYXIqICAgICAgICByZXN1bHQ7CisKKyAgICB3aGlsZSAobGV2ZWxzID4gMCkgeworICAgICAgICBjb25zdCBjaGFyKiAgYmFzZTsKKworICAgICAgICAvKiB0cmltIGFueSB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciAqLworICAgICAgICB3aGlsZSAoZW5kID4gcGF0aCAmJiBpc3BhdGhzZXAoZW5kWy0xXSkpCisgICAgICAgICAgICBlbmQtLTsKKworICAgICAgICBiYXNlID0gZW5kOworICAgICAgICB3aGlsZSAoYmFzZSA+IHBhdGggJiYgIWlzcGF0aHNlcChiYXNlWy0xXSkpCisgICAgICAgICAgICBiYXNlLS07CisKKyAgICAgICAgaWYgKGJhc2UgPD0gcGF0aCkgeworICAgICAgICAgICAgaWYgKGVuZCA9PSBiYXNlKzEgJiYgYmFzZVswXSA9PSAnLicgJiYgbGV2ZWxzID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmR1cCgiLi4iKTsKKyAgICAgICAgICAvKiB3ZSBjYW4ndCBnbyB0aGF0IGZhciAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5kID09IGJhc2UrMSAmJiBiYXNlWzBdID09ICcuJykKKyAgICAgICAgICAgIGdvdG8gTmV4dDsKKworICAgICAgICBpZiAoZW5kID09IGJhc2UrMiAmJiBiYXNlWzBdID09ICcuJyAmJiBiYXNlWzFdID09ICcuJykgeworICAgICAgICAgICAgbGV2ZWxzICs9IDE7CisgICAgICAgICAgICBnb3RvIE5leHQ7CisgICAgICAgIH0KKworICAgICAgICBsZXZlbHMgLT0gMTsKKworICAgIE5leHQ6CisgICAgICAgIGVuZCA9IGJhc2UgLSAxOworICAgIH0KKyAgICByZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihtYWxsb2MoIGVuZC1wYXRoKzEgKSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweSggcmVzdWx0LCBwYXRoLCBlbmQtcGF0aCApOworICAgICAgICByZXN1bHRbZW5kLXBhdGhdID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIE1JU0MgRklMRSBBTkQgRElSRUNUT1JZIEhBTkRMSU5HCisgKiovCisKKy8qIHRyeSB0byBtYWtlIGEgZGlyZWN0b3J5LiByZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQorICogKGVycm9yIGNvZGUgaW4gZXJybm8pICovCitBUG9zaXhTdGF0dXMKK3BhdGhfbWtkaXIoIGNvbnN0IGNoYXIqICBwYXRoLCBpbnQgIG1vZGUgKQoreworICAgIHJldHVybiBIQU5ETEVfRUlOVFIoYW5kcm9pZF9ta2RpcihwYXRoLCBtb2RlKSk7Cit9CisKK3N0YXRpYyBBUG9zaXhTdGF0dXMKK3BhdGhfbWtkaXJfcmVjdXJzaXZlKCBjaGFyKiAgcGF0aCwgdW5zaWduZWQgIGxlbiwgaW50ICBtb2RlICkKK3sKKyAgICBjaGFyICAgICAgb2xkX2M7CisgICAgaW50ICAgICAgIHJldDsKKyAgICB1bnNpZ25lZCAgbGVuMjsKKworICAgIC8qIGdldCByaWQgb2YgdHJhaWxpbmcgc2VwYXJhdG9ycyAqLworICAgIHdoaWxlIChsZW4gPiAwICYmIGlzcGF0aHNlcChwYXRoW2xlbi0xXSkpCisgICAgICAgIGxlbiAtPSAxOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGVycm5vID0gRU5PRU5UOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCB0aGUgcGFyZW50IGV4aXN0cywgJ2xlbjInIGlzIHRoZSBsZW5ndGggb2YKKyAgICAgKiB0aGUgcGFyZW50IHBhcnQgb2YgdGhlIHBhdGggKi8KKyAgICBsZW4yID0gbGVuLTE7CisgICAgd2hpbGUgKGxlbjIgPiAwICYmICFpc3BhdGhzZXAocGF0aFtsZW4yLTFdKSkKKyAgICAgICAgbGVuMiAtPSAxOworCisgICAgaWYgKGxlbjIgPiAwKSB7CisgICAgICAgIG9sZF9jICAgICAgPSBwYXRoW2xlbjJdOworICAgICAgICBwYXRoW2xlbjJdID0gMDsKKyAgICAgICAgcmV0ICAgICAgICA9IDA7CisgICAgICAgIGlmICggIXBhdGhfZXhpc3RzKHBhdGgpICkgeworICAgICAgICAgICAgLyogdGhlIHBhcmVudCBkb2Vzbid0IGV4aXN0LCBzbyB0cnkgdG8gY3JlYXRlIGl0ICovCisgICAgICAgICAgICByZXQgPSBwYXRoX21rZGlyX3JlY3Vyc2l2ZSggcGF0aCwgbGVuMiwgbW9kZSApOworICAgICAgICB9CisgICAgICAgIHBhdGhbbGVuMl0gPSBvbGRfYzsKKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogYXQgdGhpcyBwb2ludCwgd2Ugbm93IHRoZSBwYXJlbnQgZXhpc3RzICovCisgICAgb2xkX2MgICAgID0gcGF0aFtsZW5dOworICAgIHBhdGhbbGVuXSA9IDA7CisgICAgcmV0ICAgICAgID0gcGF0aF9ta2RpciggcGF0aCwgbW9kZSApOworICAgIHBhdGhbbGVuXSA9IG9sZF9jOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogZW5zdXJlIHRoYXQgYSBnaXZlbiBkaXJlY3RvcnkgZXhpc3RzLCBjcmVhdGUgaXQgaWYgbm90LAorICAgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlIChlcnJvciBjb2RlIGluIGVycm5vKSAqLworQVBvc2l4U3RhdHVzCitwYXRoX21rZGlyX2lmX25lZWRlZCggY29uc3QgY2hhciogIHBhdGgsIGludCAgbW9kZSApCit7CisgICAgaW50ICByZXQgPSAwOworCisgICAgaWYgKCFwYXRoX2V4aXN0cyhwYXRoKSkgeworICAgICAgICByZXQgPSBwYXRoX21rZGlyKHBhdGgsIG1vZGUpOworCisgICAgICAgIGlmIChyZXQgPCAwICYmIGVycm5vID09IEVOT0VOVCkgeworICAgICAgICAgICAgY2hhciAgICAgIHRlbXBbTUFYX1BBVEhdOworICAgICAgICAgICAgdW5zaWduZWQgIGxlbiA9ICh1bnNpZ25lZClzdHJsZW4ocGF0aCk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiBzaXplb2YodGVtcCktMSkgeworICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSggdGVtcCwgcGF0aCwgbGVuICk7CisgICAgICAgICAgICB0ZW1wW2xlbl0gPSAwOworCisgICAgICAgICAgICByZXR1cm4gcGF0aF9ta2Rpcl9yZWN1cnNpdmUodGVtcCwgbGVuLCBtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiByZXR1cm4gdGhlIHNpemUgb2YgYSBnaXZlbiBmaWxlIGluICcqcHNpemUnLiByZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKGVycm9yIGNvZGUgaW4gZXJybm8pICovCitBUG9zaXhTdGF0dXMKK3BhdGhfZ2V0X3NpemUoIGNvbnN0IGNoYXIqICBwYXRoLCB1aW50NjRfdCAgKnBzaXplICkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICAvKiBhdm9pZCBfc3RhdDY0IHdoaWNoIGlzIG9ubHkgZGVmaW5lZCBpbiBNU1ZDUlQuRExMLCBub3QgQ1JURExMLkRMTCAqLworICAgIC8qIGRvIG5vdCB1c2UgT3BlbkZpbGUoKSBiZWNhdXNlIGl0IGhhcyBzdHJhbmdlIHNlYXJjaCBiZWhhdmlvdXIgdGhhdCBjb3VsZCAqLworICAgIC8qIHJlc3VsdCBpbiBnZXR0aW5nIHRoZSBzaXplIG9mIGEgZGlmZmVyZW50IGZpbGUgKi8KKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgdXRmMTZQYXRoKHBhdGgpOworICAgIExBUkdFX0lOVEVHRVIgIHNpemU7CisgICAgSEFORExFICBmaWxlID0gQ3JlYXRlRmlsZVcoLyogbHBGaWxlbmFtZSAqLyAgICAgICAgdXRmMTZQYXRoLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHdEZXNpcmVkQWNjZXNzICovICAgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR3U2hhcmVkTW9kZSAqLyAgICAgRklMRV9TSEFSRV9SRUFEfEZJTEVfU0hBUkVfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbHBTZWN1cml0eUF0dHJpYnV0ZXMgKi8gIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHdDcmVhdGlvbkRpc3Bvc2l0aW9uICovIE9QRU5fRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHdGbGFnc0FuZEF0dHJpYnV0ZXMgKi8gIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaFRlbXBsYXRlRmlsZSAqLyAgICAgIE5VTEwgKTsKKyAgICBpZiAoZmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICAvKiBvaywganVzdCB0byBwbGF5IGZhaXIgKi8KKyAgICAgICAgZXJybm8gPSBFTk9FTlQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFHZXRGaWxlU2l6ZUV4KGZpbGUsICZzaXplKSkgeworICAgICAgICAvKiBtYXliZSB3ZSB0cmllZCB0byBnZXQgdGhlIHNpemUgb2YgYSBwaXBlIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgPyAqLworICAgICAgICAqcHNpemUgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKnBzaXplID0gKHVpbnQ2NF90KSBzaXplLlF1YWRQYXJ0OworICAgIH0KKyAgICBDbG9zZUhhbmRsZShmaWxlKTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgc3RydWN0IHN0YXQgIHN0OworICAgIGludCByZXQgPSBIQU5ETEVfRUlOVFIoc3RhdChwYXRoLCAmc3QpKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgKnBzaXplID0gKHVpbnQ2NF90KSBzdC5zdF9zaXplOworICAgIH0KKyAgICByZXR1cm4gcmV0OworI2VuZGlmCit9CisKKy8qKiBPVEhFUiBGSUxFIFVUSUxJVElFUworICoqCisgKiogIHBhdGhfZW1wdHlfZmlsZSgpIGNyZWF0ZXMgYW4gZW1wdHkgZmlsZSBhdCBhIGdpdmVuIHBhdGggbG9jYXRpb24uCisgKiogIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCBpcyB0cnVuY2F0ZWQgd2l0aG91dCB3YXJuaW5nCisgKioKKyAqKiAgcGF0aF9jb3B5X2ZpbGUoKSBjb3BpZXMgb25lIGZpbGUgaW50byBhbm90aGVyLgorICoqCisgKiogIGJvdGggZnVuY3Rpb25zIHJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbiBlcnJvcgorICoqLworCitBUG9zaXhTdGF0dXMKK3BhdGhfZW1wdHlfZmlsZSggY29uc3QgY2hhciogIHBhdGggKQoreworI2lmZGVmIF9XSU4zMgorICAgIGludCBmZCA9IGFuZHJvaWRfY3JlYXQocGF0aCwgU19JV1JJVEUpOworI2Vsc2UKKyAgICAvKiBvbiBVbml4LCBvbmx5IGFsbG93IHRoZSBvd25lciB0byByZWFkL3dyaXRlLCBzaW5jZSB0aGUgZmlsZSAqCisgICAgICogbWF5IGNvbnRhaW4gc29tZSBwZXJzb25hbCBkYXRhIHdlIGRvbid0IHdhbnQgdG8gc2VlIGV4cG9zZWQgKi8KKyAgICBpbnQgZmQgPSBjcmVhdChwYXRoLCBTX0lSVVNSIHwgU19JV1VTUik7CisjZW5kaWYKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK0FQb3NpeFN0YXR1cworcGF0aF9jb3B5X2ZpbGUoIGNvbnN0IGNoYXIqICBkZXN0LCBjb25zdCBjaGFyKiAgc291cmNlICkKK3sKKyAgICBpbnQgIGZkLCBmcywgcmVzdWx0ID0gLTE7CisKKyAgICAvKiBpZiB0aGUgZGVzdGluYXRpb24gZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0ICovCisgICAgaWYgKGFuZHJvaWRfYWNjZXNzKHNvdXJjZSwgRl9PSykgPCAwIHx8IHBhdGhfZW1wdHlfZmlsZShkZXN0KSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhbmRyb2lkX2FjY2Vzcyhzb3VyY2UsIFJfT0spIDwgMCkgeworICAgICAgICBEKCIlczogc291cmNlIGZpbGUgaXMgdW4tcmVhZGFibGU6ICVzXG4iLAorICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworI2lmZGVmIF9XSU4zMgorICAgIGZkID0gYW5kcm9pZF9vcGVuKGRlc3QsIF9PX1JEV1IgfCBfT19CSU5BUlkpOworICAgIGZzID0gYW5kcm9pZF9vcGVuKHNvdXJjZSwgX09fUkRPTkxZIHwgIF9PX0JJTkFSWSk7CisjZWxzZQorICAgIGZkID0gY3JlYXQoZGVzdCwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIGZzID0gb3Blbihzb3VyY2UsIFNfSVJFQUQpOworI2VuZGlmCisgICAgaWYgKGZzID49IDAgJiYgZmQgPj0gMCkgeworICAgICAgICBjaGFyIGJ1Zls0MDk2XTsKKyAgICAgICAgc3NpemVfdCB0b3RhbCA9IDA7CisgICAgICAgIHNzaXplX3QgbjsKKyAgICAgICAgcmVzdWx0ID0gMDsgLyogc3VjY2VzcyAqLworICAgICAgICB3aGlsZSAoKG4gPSByZWFkKGZzLCBidWYsIDQwOTYpKSA+IDApIHsKKyAgICAgICAgICAgIGlmICh3cml0ZShmZCwgYnVmLCBuKSAhPSBuKSB7CisgICAgICAgICAgICAgICAgLyogd3JpdGUgZmFpbGVkLiBNYWtlIGl0IHJldHVybiAtMSBzbyB0aGF0IGFuCisgICAgICAgICAgICAgICAgICogZW1wdHkgZmlsZSBiZSBjcmVhdGVkLiAqLworICAgICAgICAgICAgICAgIEQoIkZhaWxlZCB0byBjb3B5ICclcycgdG8gJyVzJzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgZGVzdCwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbCArPSBuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZzID49IDApIHsKKyAgICAgICAgY2xvc2UoZnMpOworICAgIH0KKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworQVBvc2l4U3RhdHVzCitwYXRoX2RlbGV0ZV9maWxlKCBjb25zdCBjaGFyKiAgcGF0aCApCit7CisgICAgaW50IHJldCA9IGFuZHJvaWRfdW5saW5rKHBhdGgpOworI2lmZGVmIF9XSU4zMgorICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUFDQ0VTKSB7CisgICAgICAgIC8qIGEgZmlyc3QgY2FsbCB0byBfdW5saW5rIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBpcyBzZXQgcmVhZC1vbmx5ICovCisgICAgICAgIC8qIHdlIGNhbiBob3dldmVyIHRyeSB0byBjaGFuZ2UgaXRzIG1vZGUgZmlyc3QgYW5kIGNhbGwgdW5saW5rICAgICovCisgICAgICAgIC8qIGFnYWluLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHJldCA9IGFuZHJvaWRfY2htb2QocGF0aCwgX1NfSVJFQUQgfCBfU19JV1JJVEUpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IGFuZHJvaWRfdW5saW5rKHBhdGgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworCit2b2lkKgorcGF0aF9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZm4sIHNpemVfdCAgKnBTaXplKQoreworICAgIGNoYXIqICBkYXRhOworICAgIGludCAgICBzejsKKyAgICBpbnQgICAgZmQ7CisKKyAgICBpZiAocFNpemUpCisgICAgICAgICpwU2l6ZSA9IDA7CisKKyAgICBkYXRhICAgPSBOVUxMOworCisgICAgZmQgPSBhbmRyb2lkX29wZW4oZm4sIE9fQklOQVJZIHwgT19SRE9OTFkpOworICAgIGlmKGZkIDwgMCkgcmV0dXJuIE5VTEw7CisKKyAgICBkbyB7CisgICAgICAgIHN6ID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICAgICAgaWYoc3ogPCAwKSBicmVhazsKKworICAgICAgICBpZiAocFNpemUpCisgICAgICAgICAgICAqcFNpemUgPSAoc2l6ZV90KSBzejsKKworICAgICAgICBpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGF0YSA9IChjaGFyKikgbWFsbG9jKHN6ICsgMSk7CisgICAgICAgIGlmKGRhdGEgPT0gTlVMTCkgYnJlYWs7CisKKyAgICAgICAgaWYgKHJlYWQoZmQsIGRhdGEsIHN6KSAhPSBzeikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgZGF0YVtzel0gPSAwOworCisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0gd2hpbGUgKDApOworCisgICAgY2xvc2UoZmQpOworCisgICAgaWYoZGF0YSAhPSBOVUxMKQorICAgICAgICBmcmVlKGRhdGEpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBESVJfU0VQICAnOycKKyNlbHNlCisjICBkZWZpbmUgRElSX1NFUCAgJzonCisjZW5kaWYKKworY2hhcioKK3BhdGhfc2VhcmNoX2V4ZWMoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBjb25zdCBjaGFyKiBzeXNQYXRoID0gZ2V0ZW52KCJQQVRIIik7CisgICAgY2hhciAgICAgICAgdGVtcFtQQVRIX01BWF07CisgICAgY29uc3QgY2hhciogcDsKKworICAgIC8qIElmIHRoZSBmaWxlIGNvbnRhaW5zIGEgZGlyZWN0b3J5IHNlcGFyYXRvciwgZG9uJ3Qgc2VhcmNoICovCisjaWZkZWYgX1dJTjMyCisgICAgaWYgKHN0cmNocihmaWxlbmFtZSwgJy8nKSAhPSBOVUxMIHx8IHN0cmNocihmaWxlbmFtZSwgJ1xcJykgIT0gTlVMTCkgeworI2Vsc2UKKyAgICBpZiAoc3RyY2hyKGZpbGVuYW1lLCAnLycpICE9IE5VTEwpIHsKKyNlbmRpZgorICAgICAgICBpZiAocGF0aF9leGlzdHMoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZHVwKGZpbGVuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgc3lzdGVtIHBhdGggaXMgZW1wdHksIGRvbid0IHNlYXJjaCAqLworICAgIGlmIChzeXNQYXRoID09IE5VTEwgfHwgc3lzUGF0aFswXSA9PSAnXDAnKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2Ygbm9uLWVtcHR5IGl0ZW1zIGluIHRoZSBzeXN0ZW0gcGF0aAorICAgICAqIEl0ZW1zIGFyZSBzZXBhcmF0ZWQgYnkgRElSX1NFUCwgYW5kIHR3byBzdWNjZXNzaXZlIHNlcGFyYXRvcnMKKyAgICAgKiBjb3JyZXNwb25kIHRvIGFuIGVtcHR5IGl0ZW0gdGhhdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQWxzbyBjb21wdXRlIHRoZSByZXF1aXJlZCBzdHJpbmcgc3RvcmFnZSBsZW5ndGguICovCisgICAgcCA9IHN5c1BhdGg7CisKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgY29uc3QgY2hhciogcDIgPSBzdHJjaHIocCwgRElSX1NFUCk7CisgICAgICAgIGludCAgIGxlbjsKKyAgICAgICAgaWYgKHAyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGxlbiA9IHN0cmxlbihwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9IHAyIC0gcDsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mKHRlbXApLCAiJS4qcy8lcyIsIGxlbiwgcCwgZmlsZW5hbWUpOworCisgICAgICAgICAgICBpZiAocGF0aF9leGlzdHModGVtcCkgJiYgcGF0aF9jYW5fZXhlYyh0ZW1wKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdHJkdXAodGVtcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAoMCk7CisKKyAgICAgICAgcCArPSBsZW47CisgICAgICAgIGlmICgqcCA9PSBESVJfU0VQKQorICAgICAgICAgICAgcCsrOworICAgIH0KKworICAgIC8qIE5vdGhpbmcsIHJlYWxseSAqLworICAgIHJldHVybiBOVUxMOworfQorCitjaGFyICoKK3BhdGhfZXNjYXBlX3BhdGgoY29uc3QgY2hhciogc3JjKQoreworICAgIGlmICghc3JjKSByZXR1cm4gTlVMTDsKKworICAgIC8vIEFsbG9jYXRlIGZvciB0aGUgbWF4aW11bSBvdXRwdXQgc2l6ZSwgaW5jbHVkaW5nIHRlcm1pbmF0b3IKKyAgICBjaGFyICpyZXRTdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihtYWxsb2MoMiAqIHN0cmxlbihzcmMpICsgMSkpOworICAgIGlmIChyZXRTdHIgPT0gMCkgcmV0dXJuIDA7CisKKyAgICBjaGFyICpkc3QgPSByZXRTdHI7CisgICAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgeworICAgICAgICBzd2l0Y2ggKCpzcmMpIHsKKyAgICAgICAgICAgIGNhc2UgJz0nOiAgKmRzdCsrID0gJyUnOyAqZHN0KysgPSAnRSc7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnLCc6ICAqZHN0KysgPSAnJSc7ICpkc3QrKyA9ICdDJzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICclJzogICpkc3QrKyA9ICclJzsgKmRzdCsrID0gJ1AnOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgKmRzdCsrID0gKnNyYzsKKyAgICAgICAgfQorICAgICAgICBzcmMrKzsKKyAgICB9CisgICAgKmRzdCA9ICdcMCc7CisgICAgcmV0dXJuIHJldFN0cjsKK30KKworCit2b2lkCitwYXRoX3VuZXNjYXBlX3BhdGgoY2hhciogc3RyKQoreworICAgIGNoYXIgKnNyYyA9IHN0cjsKKyAgICBjaGFyICpkc3QgPSBzdHI7CisKKyAgICB3aGlsZSAoKnNyYyAhPSAnXDAnKSB7CisgICAgICAgIGlmICgqc3JjICE9ICclJykgeworICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRXNjYXBlZCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgc3dpdGNoICgqc3JjKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6ICpkc3QrKyA9ICcsJzsgc3JjKys7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0UnOiAqZHN0KysgPSAnPSc7IHNyYysrOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdQJzogKmRzdCsrID0gJyUnOyBzcmMrKzsgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAgIDsgICAvLyBKdXN0IGRyb3AgdGhlICclJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICpkc3QgPSAnXDAnOworfQorCitjaGFyKiBwYXRoX2pvaW4oY29uc3QgY2hhciogcGFydDEsIGNvbnN0IGNoYXIqIHBhcnQyKSB7CisgIHJldHVybiBzdHJkdXAoUGF0aFV0aWxzOjpqb2luKHBhcnQxLCBwYXJ0MikuY19zdHIoKSk7Cit9CisKK0FQb3NpeFN0YXR1cyBwYXRoX2NvcHlfZGlyKGNvbnN0IGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjKSB7CisgICAgYXV0byBkaXJTY2FubmVyID0gYW5kcm9pZDo6YmFzZTo6bWFrZUN1c3RvbVNjb3BlZFB0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJTY2FubmVyX25ldyhzcmMpLCBkaXJTY2FubmVyX2ZyZWUpOworICAgIGlmICghZGlyU2Nhbm5lcikgcmV0dXJuIGZhbHNlOworICAgIGlmIChwYXRoX21rZGlyX2lmX25lZWRlZChkc3QsIDA3NzcpIDwgMCkgcmV0dXJuIC0xOworICAgIGNvbnN0IGNoYXIqIGJhc2VOYW1lID0gZGlyU2Nhbm5lcl9uZXh0KGRpclNjYW5uZXIuZ2V0KCkpOworICAgIHdoaWxlIChiYXNlTmFtZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmdWxsRHN0TmFtZSA9IFBhdGhVdGlsczo6am9pbihkc3QsIGJhc2VOYW1lKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZnVsbFNyY05hbWUgPSBQYXRoVXRpbHM6OmpvaW4oc3JjLCBiYXNlTmFtZSk7CisgICAgICAgIGlmIChwYXRoX2lzX2RpcihmdWxsU3JjTmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgaWYgKHBhdGhfY29weV9kaXIoZnVsbERzdE5hbWUuY19zdHIoKSwgZnVsbFNyY05hbWUuY19zdHIoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBhdGhfY29weV9maWxlKGZ1bGxEc3ROYW1lLmNfc3RyKCksIGZ1bGxTcmNOYW1lLmNfc3RyKCkpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYXNlTmFtZSA9IGRpclNjYW5uZXJfbmV4dChkaXJTY2FubmVyLmdldCgpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcGF0aC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM0NzI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGguaApAQCAtMCwwICsxLDIxNiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL3V0aWxzL3N5c3RlbS5oPgorI2luY2x1ZGUgPHN0ZGludC5oPiAgLyogZm9yIHVpbnQ2NF90ICovCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyoqIE1JU0MgRklMRSBBTkQgRElSRUNUT1JZIEhBTkRMSU5HCisgKiovCisKKy8qIE9fQklOQVJZIGlzIHJlcXVpcmVkIGluIHRoZSBNUyBDIGxpYnJhcnkgdG8gYXZvaWQgb3BlbmluZyBmaWxlCisgKiBpbiB0ZXh0IG1vZGUgKHRoZSBkZWZhdWx0LCBhaGhoaGgpCisgKi8KKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKE9fQklOQVJZKQorIyAgZGVmaW5lICBPX0JJTkFSWSAgMAorI2VuZGlmCisKKy8qIGRlZmluZSAgUEFUSF9TRVAgYXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciAqLworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lICBQQVRIX1NFUCAgICJcXCIKKyMgIGRlZmluZSAgUEFUSF9TRVBfQyAnXFwnCisjZWxzZQorIyAgZGVmaW5lICBQQVRIX1NFUCAgICIvIgorIyAgZGVmaW5lICBQQVRIX1NFUF9DICcvJworI2VuZGlmCisKKy8qIEhlcmUgd2UgdXNlZCB0byBoYXZlIGEgbWFjcm8gcmVkZWZpbmluZyBNQVhfUEFUSCB0byBiZSAxMDI0IG9uIFdpbmRvd3MuCisgKiBUaGF0J3MgaW5jb3JyZWN0IGFzIGlmIG9uZSB3YW50cyB0byBnbyBiZXlvbmQgdGhlIFdpbmRvd3MgU0RLIE1BWF9QQVRILCBoZQorICogaGFzIHRvIGZvcm1hdCBwYXRocyBpbiBhIHZlcnkgc3BlY2lhbCB3YXkgLSB3aGljaCBpc24ndCBmb2xsb3dlZCBhbnl3aGVyZQorICogaW4gb3VyIGNvZGViYXNlLgorICogU28gbGV0J3MganVzdCB1c2Ugd2hhdCB3ZSBnb3QgZnJvbSB3aW5kb3dzLmggaGVyZSAoMjYwIGlmIGl0J3Mgbm90IGluIHlldCkKKyAqLworI2lmZGVmIF9XSU4zMgorIyAgaWZuZGVmIE1BWF9QQVRICisgICAgIC8vIHdlIGhhdmVuJ3QgaW5jbHVkZWQgPHdpbmRvd3MuaD4geWV0IGFuZCB3ZSBjYW4ndCBoZXJlIC0gaXQgbWlnaHQgYnJlYWsKKyAgICAgLy8gc29tZSBoYXJkY29yZSBDIGNvZGUKKyMgICAgZGVmaW5lIE1BWF9QQVRIIDI2MAorIyAgZW5kaWYKKworIyAgaWZkZWYgUEFUSF9NQVgKKyMgICAgdW5kZWYgICBQQVRIX01BWAorIyAgZW5kaWYKKworIyAgZGVmaW5lICBQQVRIX01BWCAgICBNQVhfUEFUSAorCisjZWxzZQorIyAgZGVmaW5lICBNQVhfUEFUSCAgICBQQVRIX01BWAorI2VuZGlmCisKKy8qIGNoZWNrcyB0aGF0IGEgZ2l2ZW4gZmlsZSBleGlzdHMgKi8KK2V4dGVybiBBQm9vbCAgcGF0aF9leGlzdHMoIGNvbnN0IGNoYXIqICBwYXRoICk7CisKKy8qIGNoZWNrcyB0aGF0IGEgcGF0aCBwb2ludHMgdG8gYSByZWd1bGFyIGZpbGUgKi8KK2V4dGVybiBBQm9vbCAgcGF0aF9pc19yZWd1bGFyKCBjb25zdCBjaGFyKiAgcGF0aCApOworCisvKiBjaGVja3MgdGhhdCBhIHBhdGggcG9pbnRzIHRvIGEgZGlyZWN0b3J5ICovCitleHRlcm4gQUJvb2wgIHBhdGhfaXNfZGlyKCBjb25zdCBjaGFyKiAgcGF0aCApOworCisvKiBjaGVja3MgdGhhdCBhIHBhdGggaXMgYWJzb2x1dGUgb3Igbm90ICovCitleHRlcm4gQUJvb2wgIHBhdGhfaXNfYWJzb2x1dGUoIGNvbnN0IGNoYXIqICBwYXRoICk7CisKKy8qIGNoZWNrcyB0aGF0IG9uZSBjYW4gcmVhZC93cml0ZSBhIGdpdmVuIChyZWd1bGFyKSBmaWxlICovCitleHRlcm4gQUJvb2wgIHBhdGhfY2FuX3JlYWQoIGNvbnN0IGNoYXIqICBwYXRoICk7CitleHRlcm4gQUJvb2wgIHBhdGhfY2FuX3dyaXRlKCBjb25zdCBjaGFyKiAgcGF0aCApOworCisvKiBjaGVja3MgdGhhdCBvbmUgY2FuIGV4ZWN1dGUgYSBnaXZlbiBmaWxlICovCitleHRlcm4gQUJvb2wgIHBhdGhfY2FuX2V4ZWMoIGNvbnN0IGNoYXIqIHBhdGggKTsKKworLyogdHJ5IHRvIG1ha2UgYSBkaXJlY3RvcnkgKi8KK2V4dGVybiBBUG9zaXhTdGF0dXMgICBwYXRoX21rZGlyKCBjb25zdCBjaGFyKiAgcGF0aCwgaW50ICBtb2RlICk7CisKKy8qIGVuc3VyZSB0aGF0IGEgZ2l2ZW4gZGlyZWN0b3J5IGV4aXN0cywgY3JlYXRlIGl0IGlmIG5vdCwKKyAgIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKi8KK2V4dGVybiBBUG9zaXhTdGF0dXMgICBwYXRoX21rZGlyX2lmX25lZWRlZCggY29uc3QgY2hhciogIHBhdGgsIGludCAgbW9kZSApOworCisvKiByZXR1cm4gdGhlIHNpemUgb2YgYSBnaXZlbiBmaWxlIGluICcqcHNpemUnLiByZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKGVycm9yIGNvZGUgaW4gZXJybm8pICovCitleHRlcm4gQVBvc2l4U3RhdHVzICAgcGF0aF9nZXRfc2l6ZSggY29uc3QgY2hhciogIHBhdGgsIHVpbnQ2NF90ICAqcHNpemUgKTsKKworLyogIHBhdGhfcGFyZW50KCkgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBuLWxldmVsIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeQorICogIHRoaXMgdW5kZXJzdGFuZHMgLiBhbmQgLi4gd2hlbiBlbmNvdW50ZXJlZCBpbiB0aGUgaW5wdXQgcGF0aC4KKyAqCisgKiAgdGhlIHJldHVybmVkIHN0cmluZyBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2V4dGVybiBjaGFyKiAgcGF0aF9wYXJlbnQoIGNvbnN0IGNoYXIqICBwYXRoLCBpbnQgIGxldmVscyApOworCisvKiBzcGxpdCBhIHBhdGggaW50byBhIChkaXJuYW1lLGJhc2VuYW1lKSBwYWlyLiB0aGUgcmVzdWx0IHN0cmluZ3MgbXVzdCBiZSBmcmVlZAorICogYnkgdGhlIGNhbGxlci4gUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuIEVycm9yIGNvbmRpdGlvbnMgaW5jbHVkZQorICogdGhlIGZvbGxvd2luZzoKKyAqICAgLSAncGF0aCcgaXMgZW1wdHkKKyAqICAgLSAncGF0aCcgaXMgIi8iIG9yIGRlZ2VuZXJhdGUgY2FzZXMgbGlrZSAiLy8vLyIKKyAqICAgLSBiYXNlbmFtZSBpcyAiLiIgb3IgIi4uIgorICoKKyAqIGlmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4gcGF0aCwgKmRpcm5hbWUgd2lsbCBiZSBzZXQgdG8gIi4iCisgKiBpZiB0aGUgcGF0aCBpcyBvZiB0eXBlICIvZm9vIiwgdGhlbiAqZGlybmFtZSB3aWxsIGJlIHNldCB0byAiLyIKKyAqCisgKiBwZGlybmFtZSBjYW4gYmUgTlVMTCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZGlyZWN0b3J5IG5hbWUKKyAqIHBiYXNlbmFtZSBjYW4gYmUgTlVMTCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgYmFzZSBuYW1lCisgKi8KK2V4dGVybiBpbnQgICAgcGF0aF9zcGxpdCggY29uc3QgY2hhciogIHBhdGgsIGNoYXIqICpwZGlybmFtZSwgY2hhciogKnBiYXNlbmFtZSApOworCisvKiBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBkaXJlY3RvcnkgbmFtZSBhcyByZXR1cm5lZCBieQorICogcGF0aF9zcGxpdCgpLiBSZXR1cm5zIE5VTEwgaWYgcGF0aF9zcGxpdCgpIHJldHVybnMgYW4gZXJyb3IuCisgKiB0aGUgcmVzdWx0IHN0cmluZyBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIKKyAqLworZXh0ZXJuIGNoYXIqICBwYXRoX2Rpcm5hbWUoIGNvbnN0IGNoYXIqICBwYXRoICk7CisKKy8qIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmV0cmlldmUgdGhlIGJhc2UgbmFtZSBhcyByZXR1cm5lZCBieQorICogcGF0aF9zcGxpdCgpLiBSZXR1cm5zIE5VTEwgaWYgcGF0aF9zcGxpdCgpIHJldHVybnMgYW4gZXJyb3IuCisgKiB0aGUgcmVzdWx0IG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworZXh0ZXJuIGNoYXIqICBwYXRoX2Jhc2VuYW1lKCBjb25zdCBjaGFyKiAgcGF0aCApOworCisvKiBsb29rIGZvciBhIGdpdmVuIGV4ZWN1dGFibGUgaW4gdGhlIHN5c3RlbSBwYXRoIGFuZCByZXR1cm4gaXRzIGZ1bGwgcGF0aC4KKyAqIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuIE5vdGUgdGhhdCBvbiBXaW5kb3dzIHRoaXMgZG9lc24ndCBhcHBlbmQKKyAqIGFuIC5leGUgcHJlZml4LCBvciBvdGhlciBtYWdpY2FsIHRoaW5nIGxpa2UgQ3lnd2luIHVzdWFsbHkgZG9lcy4KKyAqLworZXh0ZXJuIGNoYXIqICBwYXRoX3NlYXJjaF9leGVjKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworCisvKiBSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoLiBJZiAncGF0aCcgaXMgYWxyZWFkeSBhYnNvbHV0ZSwKKyAqIHRoaXMgd2lsbCBiZSBhIHNpbXBsZSBjb3B5LiBPdGhlcndpc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCBwcmVwZW5kIHRoZQorICogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcmVzdWx0LgorICovCitleHRlcm4gY2hhciogIHBhdGhfZ2V0X2Fic29sdXRlKCBjb25zdCBjaGFyKiBwYXRoICk7CisKKy8qKiBPVEhFUiBGSUxFIFVUSUxJVElFUworICoqCisgKiogIHBhdGhfZW1wdHlfZmlsZSgpIGNyZWF0ZXMgYW4gZW1wdHkgZmlsZSBhdCBhIGdpdmVuIHBhdGggbG9jYXRpb24uCisgKiogIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCBpcyB0cnVuY2F0ZWQgd2l0aG91dCB3YXJuaW5nCisgKioKKyAqKiAgcGF0aF9jb3B5X2ZpbGUoKSBjb3BpZXMgb25lIGZpbGUgaW50byBhbm90aGVyLgorICoqCisgKiogIHBhdGhfZGVsZXRlX2ZpbGUoKSBpcyBlcXVpdmFsZW50IHRvIHVubGluaygpIG9uIFVuaXgsIG9uIFdpbmRvd3MsCisgKiogIGl0IHdpbGwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIF91bmxpbmsoKSBmYWlscyBiZWNhdXNlIHRoZSBmaWxlIGlzCisgKiogIHJlYWQtb25seSBieSB0cnlpbmcgdG8gY2hhbmdlIGl0cyBhY2Nlc3MgcmlnaHRzIHRoZW4gY2FsbGluZyBfdW5saW5rKCkKKyAqKiAgYWdhaW4uCisgKioKKyAqKiAgdGhlc2UgZnVuY3Rpb25zIHJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbiBlcnJvcgorICoqCisgKiogIGxvYWRfdGV4dF9maWxlKCkgcmVhZHMgYSBmaWxlIGludG8gYSBoZWFwLWFsbG9jYXRlZCBtZW1vcnkgYmxvY2ssCisgKiogIGFuZCBhcHBlbmRzIGEgMCB0byBpdC4gdGhlIGNhbGxlciBtdXN0IGZyZWUgaXQKKyAqKi8KKworLyogY3JlYXRlcyBhbiBlbXB0eSBmaWxlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uIElmIHRoZSBmaWxlIGFscmVhZHkKKyAqIGV4aXN0cywgaXQgaXMgdHJ1bmNhdGVkIHdpdGhvdXQgd2FybmluZy4gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgKiBvciAtMSBvbiBmYWlsdXJlLgorICovCitleHRlcm4gQVBvc2l4U3RhdHVzICAgcGF0aF9lbXB0eV9maWxlKCBjb25zdCBjaGFyKiAgcGF0aCApOworCisvKiBjb3BpZXMgb24gZmlsZSBpbnRvIGFub3RoZXIgb25lLiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqIChlcnJvciBjb2RlIGluIGVycm5vKS4gRG9lcyBub3Qgd29yayBvbiBkaXJlY3RvcmllcyAqLworZXh0ZXJuIEFQb3NpeFN0YXR1cyAgIHBhdGhfY29weV9maWxlKCBjb25zdCBjaGFyKiAgZGVzdCwgY29uc3QgY2hhciogIHNvdXJjZSApOworCisvKiB1bmxpbmsvZGVsZXRlIGEgZ2l2ZW4gZmlsZS4gTm90ZSB0aGF0IG9uIFdpbjMyLCB0aGlzIHdpbGwKKyAqIGZhaWwgaWYgdGhlIHByb2dyYW0gaGFzIGFuIG9wZW5lZCBoYW5kbGUgdG8gdGhlIGZpbGUKKyAqLworZXh0ZXJuIEFQb3NpeFN0YXR1cyAgIHBhdGhfZGVsZXRlX2ZpbGUoIGNvbnN0IGNoYXIqICBwYXRoICk7CisKKy8qIHRyeSB0byBsb2FkIGEgZ2l2ZW4gZmlsZSBpbnRvIGEgaGVhcC1hbGxvY2F0ZWQgYmxvY2suCisgKiBpZiAncFNpemUnIGlzIG5vdCBOVUxMLCB0aGlzIHdpbGwgc2V0IHRoZSBmaWxlJ3Mgc2l6ZSBpbiAnKnBTaXplJworICogbm90ZSB0aGF0IHRoaXMgYWN0dWFsbHkgemVyby10ZXJtaW5hdGVzIHRoZSBmaWxlIGZvciBjb252ZW5pZW5jZS4KKyAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgTlVMTCBpcyByZXR1cm5lZCBhbmQgdGhlIGVycm9yIGNvZGUgaXMgaW4gZXJybm8KKyAqLworZXh0ZXJuIHZvaWQqICAgICAgICAgIHBhdGhfbG9hZF9maWxlKCBjb25zdCBjaGFyKiAgcGF0aCwgc2l6ZV90ICAqcFNpemUgKTsKKworLyogTW9kaWZ5IHRoZSBwYXRoIHRvIGVsaW1pbmF0ZSAnLCcgYW5kICc9Jywgd2hpY2ggY29uZnVzZSBwYXJzZXJzCisgKiB0aGF0IGxvb2sgYXQgc3RyaW5ncyB3aXRoIG11bHRpcGxlIHBhcmFtZXRlcnMuCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHRoZXNlIGNvbnZlcnNpb25zOiAnLCcgLS0+ICclJyAnQycKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9JyAtLT4gJyUnICdFJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyUnIC0tPiAnJScgJ1AnCisgKgorICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbiB0aGUgaGVhcC4gVGhlIGNhbGxlciBpcyByZXBvbnNpYmxlCisgKiBmb3IgZnJlZWluZyB0aGlzIG1lbW9yeS4KKyAqLworZXh0ZXJuIGNoYXIqICAgICAgICAgIHBhdGhfZXNjYXBlX3BhdGgoIGNvbnN0IGNoYXIqIHNyYyApOworCisvKiBNb2RpZnkgdGhlIHBhdGggdG8gcmVzdG9yZSAnLCcgYW5kICc9Jy4KKyAqIFRoaXMgZnVuY3Rpb24gbWFrZXMgdGhlc2UgY29udmVyc2lvbnM6ICclJyAnQycgLS0+ICcsJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyUnICdFJyAtLT4gJz0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJScgJ1AnIC0tPiAnJScKKyAqCisgKiBCZWNhdXNlIHRoaXMgY2FuIG9ubHkgcmVkdWNlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywKKyAqIHRoaXMgY29udmVyc2lvbiBpcyBkb25lIGluIHBsYWNlLgorICovCitleHRlcm4gdm9pZCAgICAgICAgICAgcGF0aF91bmVzY2FwZV9wYXRoKCBjaGFyKiBzdHIgKTsKKworLyogSm9pbnMgdHdvIGNvbXBvbmVudHMgb2YgYSBwYXRoIHVzaW5nIGEgcGF0aCBzZXBhcmF0b3IgKG9wdGlvbmFsbHkpLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIHRoYXQgbXVzdCBiZQorICogZnJlZWQgYnkgdGhlIGNhbGxlcgorICovCitleHRlcm4gY2hhciogICAgICAgICAgcGF0aF9qb2luKCBjb25zdCBjaGFyKiBwYXJ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcnQyKTsKKworLyogQ29weSBmb2xkZXIgZnJvbSBzcmMgdG8gZHN0LiBJZiBhbiBlcnJvciBoYXBwZW5zIGluIHRoZSBtaWRkbGUgKHBlcm1pc3Npb24KKyAqIGVycm9ycywgZXRjKSwgdGhlIHxkc3R8IGZvbGRlciB3aWxsIGJlIGluIGhhbGYtY29waWVkIHN0YXRlLgorICovCitleHRlcm4gQVBvc2l4U3RhdHVzICAgcGF0aF9jb3B5X2Rpcihjb25zdCBjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGhfc3lzdGVtLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wYXRoX3N5c3RlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkZDc3YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wYXRoX3N5c3RlbS5jcHAKQEAgLTAsMCArMSwxMzIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGF0aC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpQYXRoVXRpbHM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTY29wZWRDUHRyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6c3RyRHVwOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCitBQm9vbCBwYXRoX2V4aXN0cyhjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcmV0dXJuIFN5c3RlbTo6Z2V0KCktPnBhdGhFeGlzdHMocGF0aCk7Cit9CisKK0FCb29sIHBhdGhfaXNfcmVndWxhcihjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgcmV0dXJuIFN5c3RlbTo6Z2V0KCktPnBhdGhJc0ZpbGUocGF0aCk7Cit9CisKK0FCb29sIHBhdGhfaXNfZGlyKGNvbnN0IGNoYXIqICBwYXRoKSB7CisgICAgcmV0dXJuIFN5c3RlbTo6Z2V0KCktPnBhdGhJc0RpcihwYXRoKTsKK30KKworQUJvb2wgcGF0aF9jYW5fcmVhZChjb25zdCBjaGFyKiAgcGF0aCkgeworICAgIHJldHVybiBTeXN0ZW06OmdldCgpLT5wYXRoQ2FuUmVhZChwYXRoKTsKK30KKworQUJvb2wgcGF0aF9jYW5fd3JpdGUoY29uc3QgY2hhciogIHBhdGgpIHsKKyAgICByZXR1cm4gU3lzdGVtOjpnZXQoKS0+cGF0aENhbldyaXRlKHBhdGgpOworfQorCitBQm9vbCBwYXRoX2Nhbl9leGVjKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICByZXR1cm4gU3lzdGVtOjpnZXQoKS0+cGF0aENhbkV4ZWMocGF0aCk7Cit9CisKK0FCb29sIHBhdGhfaXNfYWJzb2x1dGUoY29uc3QgY2hhciogcGF0aCkgeworICAgIHJldHVybiBQYXRoVXRpbHM6OmlzQWJzb2x1dGUocGF0aCk7Cit9CisKK2NoYXIqIHBhdGhfZ2V0X2Fic29sdXRlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBpZiAocGF0aF9pc19hYnNvbHV0ZShwYXRoKSkgeworICAgICAgICByZXR1cm4gQVNUUkRVUChwYXRoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBjdXJyZW50RGlyID0gU3lzdGVtOjpnZXQoKS0+Z2V0Q3VycmVudERpcmVjdG9yeSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjdXJyZW50SXRlbXMgPQorICAgICAgICAgICAgUGF0aFV0aWxzOjpkZWNvbXBvc2UoY3VycmVudERpci5jX3N0cigpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGF0aEl0ZW1zID0gUGF0aFV0aWxzOjpkZWNvbXBvc2UocGF0aCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogcGF0aEl0ZW1zKSB7CisgICAgICAgIGN1cnJlbnRJdGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgfQorICAgIHJldHVybiBzdHJEdXAoUGF0aFV0aWxzOjpyZWNvbXBvc2UoY3VycmVudEl0ZW1zKSk7Cit9CisKK2ludCBwYXRoX3NwbGl0KGNvbnN0IGNoYXIqIHBhdGgsIGNoYXIqKiBkaXJuYW1lLCBjaGFyKiogYmFzZW5hbWUpIHsKKyAgICBzdGQ6OnN0cmluZyBkaXIsIGZpbGU7CisgICAgaWYgKCFQYXRoVXRpbHM6OnNwbGl0KHBhdGgsICZkaXIsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkaXJuYW1lKSB7CisgICAgICAgICpkaXJuYW1lID0gc3RyRHVwKGRpcik7CisgICAgfQorICAgIGlmIChiYXNlbmFtZSkgeworICAgICAgICAqYmFzZW5hbWUgPSBzdHJEdXAoZmlsZSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitjaGFyKiBwYXRoX2Rpcm5hbWUoY29uc3QgY2hhciogcGF0aCkgeworICAgIHN0ZDo6c3RyaW5nIGRpcjsKKyAgICBpZiAoIVBhdGhVdGlsczo6c3BsaXQocGF0aCwgJmRpciwgbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBzdHJEdXAoZGlyKTsKK30KKworY2hhciogcGF0aF9iYXNlbmFtZShjb25zdCBjaGFyKiBwYXRoKSB7CisgICAgc3RkOjpzdHJpbmcgZmlsZTsKKyAgICBpZiAoIVBhdGhVdGlsczo6c3BsaXQocGF0aCwgbnVsbHB0ciwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gc3RyRHVwKGZpbGUpOworfQorCisjaWZkZWYgX1dJTjMyCit1c2luZyBhbmRyb2lkOjpiYXNlOjpXaW4zMlVuaWNvZGVTdHJpbmc7CisKK2V4dGVybiAiQyIKK2NoYXIqIHJlYWxwYXRoX3dpdGhfbGVuZ3RoKGNvbnN0IGNoYXIqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiByZXNvbHZlZF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9sZW5ndGgpIHsKKyAgICBXaW4zMlVuaWNvZGVTdHJpbmcgd2lkZVBhdGgocGF0aCk7CisgICAgLy8gTGV0IHRoZSBjYWxsIGFsbG9jYXRlIG1lbW9yeSBmb3IgdXMsIHRoZW4gd2UgY2FuIGNoZWNrIGFnYWluc3QgbWF4X2xlbmd0aAorICAgIFNjb3BlZENQdHI8d2NoYXJfdD4gcmVzdWx0KF93ZnVsbHBhdGgobnVsbHB0ciwgd2lkZVBhdGguY19zdHIoKSwgMCkpOworICAgIGlmIChyZXN1bHQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYXV0byB1dGY4UGF0aCA9IFdpbjMyVW5pY29kZVN0cmluZzo6Y29udmVydFRvVXRmOChyZXN1bHQuZ2V0KCkpOworICAgIGlmIChyZXNvbHZlZF9wYXRoID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gUGFzc2luZyBpbiBhIG51bGwgcG9pbnRlciBpcyB2YWxpZCBhbmQgc2hvdWxkIGxlYWQgdG8gYWxsb2NhdGlvbgorICAgICAgICAvLyB3aXRob3V0IGNoZWNraW5nIHRoZSBsZW5ndGggYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIHN0ckR1cCh1dGY4UGF0aCk7CisgICAgfQorCisgICAgaWYgKHV0ZjhQYXRoLnNpemUoKSArIDEgPj0gbWF4X2xlbmd0aCkgeworICAgICAgICAvLyBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgX3dmdWxscGF0aCB3aGVyZSBpZiB0aGUgYnVmZmVyIGlzIG5vdAorICAgICAgICAvLyBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gaG9sZCB0aGUgc3RyaW5nIHBsdXMgYSBudWxsIHRlcm1pbmF0b3IgdGhlIGNhbGwKKyAgICAgICAgLy8gd2lsbCBmYWlsIGFuZCByZXR1cm4gbnVsbHB0cgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHV0ZjhQYXRoLmNfc3RyKCkpOworICAgIHJldHVybiByZXNvbHZlZF9wYXRoOworfQorI2VuZGlmICAvLyBfV0lOMzIKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGhfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3BhdGhfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWQzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcGF0aF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvdGVzdGluZy9UZXN0U3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVGVzdFRlbXBEaXIuaCIKKworI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRlc3RUZW1wRGlyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcGF0aCB7CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgSUZfV0lOMzIoeCwgeSkgIHgKKyNlbHNlCisjZGVmaW5lIElGX1dJTjMyKHgsIHkpICB5CisjZW5kaWYKKworVEVTVChQYXRoLCBpc0Fic29sdXRlKSB7CisgICAgY29uc3QgYm9vbCBpc1dpbjMyID0gSUZfV0lOMzIodHJ1ZSwgZmFsc2UpOworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBwYXRoOworICAgICAgICBib29sIGV4cGVjdGVkOworICAgIH0ga0RhdGFbXSA9IHsKKyAgICAgICAgeyAiZm9vIiwgZmFsc2UgfSwKKyAgICAgICAgeyAiL2ZvbyIsIHRydWUgfSwKKyAgICAgICAgeyAiXFxmb28iLCBpc1dpbjMyIH0sCisgICAgICAgIHsgIi9mb28vYmFyIiwgdHJ1ZSB9LAorICAgICAgICB7ICJcXGZvb1xcYmFyIiwgaXNXaW4zMiB9LAorICAgICAgICB7ICJDOmZvbyIsIGZhbHNlIH0sCisgICAgICAgIHsgIkM6L2ZvbyIsIGlzV2luMzIgfSwKKyAgICAgICAgeyAiQzpcXGZvbyIsIGlzV2luMzIgfSwKKyAgICAgICAgeyAiLy9zZXJ2ZXIiLCAhaXNXaW4zMiB9LAorICAgICAgICB7ICIvL3NlcnZlci9wYXRoIiwgdHJ1ZSB9LAorICAgIH07CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBrRGF0YVtuXS5wYXRoOworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQsIHBhdGhfaXNfYWJzb2x1dGUocGF0aCkpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgKHBhdGggPyBwYXRoIDogIjxOVUxMPiIpIDw8ICInIjsKKyAgICB9Cit9CisKK1RFU1QoUGF0aCwgR2V0QWJzb2x1dGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogcGF0aDsKKyAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQ7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICJmb28iLCBJRl9XSU4zMigiL2hvbWVcXGZvbyIsICIvaG9tZS9mb28iKSB9LAorICAgICAgICB7ICIvZm9vIiwgIi9mb28iIH0sCisgICAgICAgIHsgIlxcZm9vIiwgSUZfV0lOMzIoIlxcZm9vIiwgIi9ob21lL1xcZm9vIikgfSwKKyAgICAgICAgeyAiL2Zvby9iYXIiLCAiL2Zvby9iYXIiIH0sCisgICAgICAgIHsgIlxcZm9vXFxiYXIiLCBJRl9XSU4zMigiXFxmb29cXGJhciIsICIvaG9tZS9cXGZvb1xcYmFyIikgfSwKKyAgICAgICAgeyAiQzovZm9vIiwgSUZfV0lOMzIoIkM6L2ZvbyIsICIvaG9tZS9DOi9mb28iKSB9LAorICAgICAgICB7ICIvL3NlcnZlci9wYXRoIiwgIi8vc2VydmVyL3BhdGgiIH0sCisgICAgICAgIC8vIE5PVEU6IFBlciBkZWZpbml0aW9uLCBpZiB8cGF0aHwgaXMgbm90IGFic29sdXRlLCBwcmVwZW5kIHRoZQorICAgICAgICAvLyBjdXJyZW50IGRpcmVjdG9yeS4gT24gV2luZG93cywgQzpmb28gYW5kIC8vc2VydmVyIGFyZSBub3QKKyAgICAgICAgLy8gYWJzb2x1dGUgcGF0aHMsIGhlbmNlIHRoZSBmdW5reSByZXN1bHRzLiBUaGVyZSBpcyBubyB3YXkgdG8KKyAgICAgICAgLy8gZ2V0IGEgY29ycmVjdCByZXN1bHQgb3RoZXJ3aXNlLgorICAgICAgICB7ICJDOmZvbyIsIElGX1dJTjMyKCIvaG9tZVxcQzpcXGZvbyIsICIvaG9tZS9DOmZvbyIpIH0sCisgICAgICAgIHsgIi8vc2VydmVyIiwgSUZfV0lOMzIoIi9ob21lXFwvL3NlcnZlciIsICIvL3NlcnZlciIpIH0sCisgICAgfTsKKworICAgIGFuZHJvaWQ6OmJhc2U6OlRlc3RTeXN0ZW0gdGVzdFN5c3RlbSgiL2JpbiIsIDMyKTsKKyAgICB0ZXN0U3lzdGVtLnNldEN1cnJlbnREaXJlY3RvcnlGb3JUZXN0aW5nKCIvaG9tZSIpOworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBhdGggPSBrRGF0YVtuXS5wYXRoOworICAgICAgICBjaGFyKiByZXN1bHQgPSBwYXRoX2dldF9hYnNvbHV0ZShwYXRoKTsKKyAgICAgICAgRVhQRUNUX1NUUkVRKGtEYXRhW25dLmV4cGVjdGVkLCByZXN1bHQpCisgICAgICAgICAgICAgICAgPDwgIlRlc3RpbmcgJyIgPDwgKHBhdGggPyBwYXRoIDogIjxOVUxMPiIpIDw8ICInIjsKKyAgICAgICAgZnJlZShyZXN1bHQpOworICAgIH0KK30KKworVEVTVChQYXRoLCBFc2NhcGVQYXRoKSB7CisgICAgY29uc3QgY2hhciBsaW51eElucHV0UGF0aFtdICAgID0gIi9MaW51eC9zdHlsZV93aXRoL3ZhcmlvdXMsc3BlY2lhbD09Y2hhcmFjdGVyJXMiOworICAgIGNvbnN0IGNoYXIgbGludXhPdXRwdXRQYXRoW10gICA9ICIvTGludXgvc3R5bGVfd2l0aC92YXJpb3VzJUNzcGVjaWFsJUUlRWNoYXJhY3RlciVQcyI7CisKKyAgICBjb25zdCBjaGFyIHdpbmRvd3NJbnB1dFBhdGhbXSAgPSAiQzpcXFdpbmRvd3NcXHN0eWxlOj13aXRoLCxvdGhlciVcXHR5cGVzIG9mIGNoYXJhY3RlcnMiOworICAgIGNvbnN0IGNoYXIgd2luZG93c091dHB1dFBhdGhbXSA9ICJDOlxcV2luZG93c1xcc3R5bGU6JUV3aXRoJUMlQ290aGVyJVBcXHR5cGVzIG9mIGNoYXJhY3RlcnMiOworCisgICAgY2hhciAqcmVzdWx0OworCisgICAgLy8gRXNjYXBlIExpbnV4IHN0eWxlIHBhdGhzCisgICAgcmVzdWx0ID0gcGF0aF9lc2NhcGVfcGF0aChsaW51eElucHV0UGF0aCk7CisgICAgRVhQRUNUX05FKHJlc3VsdCwgKGNoYXIqKU5VTEwpOworICAgIEVYUEVDVF9TVFJFUShsaW51eE91dHB1dFBhdGgsIHJlc3VsdCk7CisKKyAgICBwYXRoX3VuZXNjYXBlX3BhdGgocmVzdWx0KTsKKyAgICBFWFBFQ1RfTkUocmVzdWx0LCAoY2hhciopTlVMTCk7CisgICAgRVhQRUNUX1NUUkVRKGxpbnV4SW5wdXRQYXRoLCByZXN1bHQpOworCisgICAgZnJlZShyZXN1bHQpOworCisgICAgLy8gRXNjYXBlIFdpbmRvd3Mgc3R5bGUgcGF0aHMKKyAgICByZXN1bHQgPSBwYXRoX2VzY2FwZV9wYXRoKHdpbmRvd3NJbnB1dFBhdGgpOworICAgIEVYUEVDVF9ORShyZXN1bHQsIChjaGFyKilOVUxMKTsKKyAgICBFWFBFQ1RfU1RSRVEod2luZG93c091dHB1dFBhdGgsIHJlc3VsdCk7CisKKyAgICBwYXRoX3VuZXNjYXBlX3BhdGgocmVzdWx0KTsKKyAgICBFWFBFQ1RfTkUocmVzdWx0LCAoY2hhciopTlVMTCk7CisgICAgRVhQRUNUX1NUUkVRKHdpbmRvd3NJbnB1dFBhdGgsIHJlc3VsdCk7CisKKyAgICBmcmVlKHJlc3VsdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwYXRoCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3Byb3BlcnR5X2ZpbGUuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNTNlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vIFJldHVybiB0cnVlIGlmZiB8Y2h8IGlzIHdoaXRlc3BhY2UuIERvbid0IHVzZSBpc3NwYWNlKCkgdG8gYXZvaWQKKy8vIGxvY2FsZS1yZWxhdGVkIHJlc3VsdHMgYW5kIGFzc29jaWF0ZWQgaXNzdWVzLgorc3RhdGljIGludCBpc3NwYWNlKGludCBjaCkgeworICAgIHJldHVybiAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpOworfQorCit2b2lkIHByb3BlcnR5RmlsZUl0ZXJhdG9yX2luaXQoUHJvcGVydHlGaWxlSXRlcmF0b3IqIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcHJvcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByb3BGaWxlTGVuKSB7CisgICAgaXRlci0+bmFtZVswXSA9ICdcMCc7CisgICAgaXRlci0+dmFsdWVbMF0gPSAnXDAnOworICAgIGl0ZXItPnAgPSBwcm9wRmlsZTsKKyAgICBpdGVyLT5lbmQgPSBpdGVyLT5wICsgcHJvcEZpbGVMZW47Cit9CisKKworYm9vbCBwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KFByb3BlcnR5RmlsZUl0ZXJhdG9yKiBpdGVyKSB7CisgICAgY29uc3QgY2hhciogcCA9IGl0ZXItPnA7CisgICAgY29uc3QgY2hhciogZW5kID0gaXRlci0+ZW5kOworICAgIHdoaWxlIChwIDwgZW5kKSB7CisgICAgICAgIC8vIEdldCBlbmQgb2YgbGluZSwgYW5kIGNvbXB1dGUgbmV4dCBsaW5lIHBvc2l0aW9uLgorICAgICAgICBjb25zdCBjaGFyKiBsaW5lID0gcDsKKyAgICAgICAgY29uc3QgY2hhciogbGluZUVuZCA9IChjb25zdCBjaGFyKiltZW1jaHIocCwgJ1xuJywgZW5kIC0gcCk7CisgICAgICAgIGlmICghbGluZUVuZCkgeworICAgICAgICAgICAgbGluZUVuZCA9IGVuZDsKKyAgICAgICAgICAgIHAgPSBlbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gbGluZUVuZCArIDE7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1vdmUgdHJhaWxpbmcgXHIgYmVmb3JlIHRoZSBcbiwgaWYgYW55LgorICAgICAgICBpZiAobGluZUVuZCA+IGxpbmUgJiYgbGluZUVuZFstMV0gPT0gJ1xyJykKKyAgICAgICAgICAgIGxpbmVFbmQtLTsKKworICAgICAgICAvLyBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgd2hpbGUgKGxpbmUgPCBsaW5lRW5kICYmIGlzc3BhY2UobGluZVswXSkpCisgICAgICAgICAgICBsaW5lKys7CisKKyAgICAgICAgLy8gU2tpcCBlbXB0eSBsaW5lcywgYW5kIHRob3NlIHRoYXQgYmVnaW4gd2l0aCAnIycgZm9yIGNvbW1lbnRzLgorICAgICAgICBpZiAobGluZUVuZCA9PSBsaW5lIHx8IGxpbmVbMF0gPT0gJyMnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IGxpbmU7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWVFbmQgPQorICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKiltZW1jaHIobmFtZSwgJz0nLCBsaW5lRW5kIC0gbmFtZSk7CisgICAgICAgIGlmICghbmFtZUVuZCkgeworICAgICAgICAgICAgLy8gU2tpcHBpbmcgbGluZXMgd2l0aG91dCBhID0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIqIHZhbHVlID0gbmFtZUVuZCArIDE7CisgICAgICAgIHdoaWxlIChuYW1lRW5kID4gbmFtZSAmJiBpc3NwYWNlKG5hbWVFbmRbLTFdKSkKKyAgICAgICAgICAgIG5hbWVFbmQtLTsKKworICAgICAgICBzaXplX3QgbmFtZUxlbiA9IG5hbWVFbmQgLSBuYW1lOworICAgICAgICBpZiAobmFtZUxlbiA9PSAwIHx8IG5hbWVMZW4gPj0gTUFYX1BST1BFUlRZX05BTUVfTEVOKSB7CisgICAgICAgICAgICAvLyBTa2lwIGxpbmVzIHdpdGhvdXQgbmFtZXMsIG9yIHdpdGggbmFtZXMgdG9vIGxvbmcuCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShpdGVyLT5uYW1lLCBuYW1lLCBuYW1lTGVuKTsKKyAgICAgICAgaXRlci0+bmFtZVtuYW1lTGVuXSA9ICdcMCc7CisKKyAgICAgICAgLy8gVHJ1bmNhdGUgdmFsdWUncyBsZW5ndGguCisgICAgICAgIHNpemVfdCB2YWx1ZUxlbiA9IChsaW5lRW5kIC0gdmFsdWUpOworICAgICAgICBpZiAodmFsdWVMZW4gPj0gTUFYX1BST1BFUlRZX1ZBTFVFX0xFTikKKyAgICAgICAgICAgIHZhbHVlTGVuID0gKE1BWF9QUk9QRVJUWV9WQUxVRV9MRU4gLSAxKTsKKworICAgICAgICBtZW1jcHkoaXRlci0+dmFsdWUsIHZhbHVlLCB2YWx1ZUxlbik7CisgICAgICAgIGl0ZXItPnZhbHVlW3ZhbHVlTGVuXSA9ICdcMCc7CisKKyAgICAgICAgaXRlci0+cCA9IHA7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpdGVyLT5wID0gcDsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2NoYXIqIHByb3BlcnR5RmlsZV9nZXRWYWx1ZShjb25zdCBjaGFyKiBwcm9wRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJvcEZpbGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcE5hbWUpIHsKKyAgICBzaXplX3QgcHJvcE5hbWVMZW4gPSBzdHJsZW4ocHJvcE5hbWUpOworICAgIGlmIChwcm9wTmFtZUxlbiA+PSBNQVhfUFJPUEVSVFlfTkFNRV9MRU4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY2hhciogcmV0ID0gTlVMTDsKKyAgICBQcm9wZXJ0eUZpbGVJdGVyYXRvciBpdGVyWzFdOworICAgIHByb3BlcnR5RmlsZUl0ZXJhdG9yX2luaXQoaXRlciwgcHJvcEZpbGUsIHByb3BGaWxlTGVuKTsKKyAgICB3aGlsZSAocHJvcGVydHlGaWxlSXRlcmF0b3JfbmV4dChpdGVyKSkgeworICAgICAgICBpZiAoIXN0cmNtcChpdGVyLT5uYW1lLCBwcm9wTmFtZSkpIHsKKyAgICAgICAgICAgIGZyZWUocmV0KTsKKyAgICAgICAgICAgIHJldCA9IEFTVFJEVVAoaXRlci0+dmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcHJvcGVydHlfZmlsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3Byb3BlcnR5X2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWU1ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3Byb3BlcnR5X2ZpbGUuaApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFBhcnNlIHRoZSBjb250ZW50IG9mIGEgcHJvcGVydHkgZmlsZSBhbmQgcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4KKy8vIG5hbWVkIHByb3BlcnR5LCBvciBOVUxMIGlmIGl0IGlzIHVuZGVmaW5lZCBvciBlbXB0eS4gSWYgYSBwcm9wZXJ0eQorLy8gYXBwZWFycyBzZXZlcmFsIHRpbWVzIGluIGEgZmlsZSwgdGhlIGxhc3QgZGVmaW5pdGlvbiBpcyByZXR1cm5lZC4KKy8vIHxwcm9wZXJ0eUZpbGV8IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4KKy8vIHxwcm9wZXJ0eUZpbGVMZW58IGlzIGl0cyBsZW5ndGggaW4gYnl0ZXMuCisvLyB8cHJvcGVydHlOYW1lfCBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCitjaGFyKiBwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoY29uc3QgY2hhciogcHJvcGVydHlGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwcm9wZXJ0eUZpbGVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcGVydHlOYW1lKTsKKworLy8gTWF4aW11bSBsZW5ndGggb2YgYSBwcm9wZXJ0eSBuYW1lIChpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybykuCisvLyBBbnkgcHJvcGVydHkgbmFtZSB0aGF0IGlzIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiB0aGlzIHZhbHVlIHdpbGwgYmUKKy8vIGNvbnNpZGVyZWQgdW5kZWZpbmVkIC8gaWdub3JlZC4KKyNkZWZpbmUgTUFYX1BST1BFUlRZX05BTUVfTEVOICAzMgorCisvLyBNYXhpbXVtIGxlbmd0aCBvZiBhIHByb3BlcnR5IHZhbHVlIChpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybykuCisvLyBBbnkgdmFsdWUgc3RvcmVkIGluIGEgZmlsZSB0aGF0IGhhcyBhIGxlbmd0aCBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhpcworLy8gd2lsbCBiZSB0cnVuY2F0ZWQhLgorI2RlZmluZSBNQVhfUFJPUEVSVFlfVkFMVUVfTEVOIDkyCisKKy8vIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gaXRlcmF0b3Igb3ZlciBhIHByb3BlcnR5IGZpbGUuCisvLyBVc2FnZSBpcyBzaW1wbGU6CisvLyAgICAxKSBJbml0aWFsaXplIGl0ZXJhdG9yIHdpdGggcHJvcGVydHlGaWxlSXRlcmF0b3JfaW5pdCgpCisvLworLy8gICAgMikgQ2FsbCBwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KCkgaW4gYSBsb29wLiBJZiBpdCByZXR1cm5zIHRydWUKKy8vICAgICAgIG9uZSBjYW4gcmVhZCB0aGUgfG5hbWV8IGFuZCB8dmFsdWV8IHplcm8tdGVybWluYXRlZCBzdHJpbmdzIHRvCisvLyAgICAgICBnZXQgcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZQorLy8gICAgICAgZmlsZS4KKy8vCisvLyAgICAgICBPbmNlIHByb3BlcnR5RmlsZUl0ZXJhdG9yX25leHQoKSByZXR1cm5zIGZhbHNlLCB5b3UncmUgZG9uZS4KKy8vCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciBuYW1lW01BWF9QUk9QRVJUWV9OQU1FX0xFTl07CisgICAgY2hhciB2YWx1ZVtNQVhfUFJPUEVSVFlfVkFMVUVfTEVOXTsKKyAgICAvLyBwcml2YXRlLgorICAgIGNvbnN0IGNoYXIqIHA7CisgICAgY29uc3QgY2hhciogZW5kOworfSBQcm9wZXJ0eUZpbGVJdGVyYXRvcjsKKworLy8gSW5pdGlhbGl6ZSBhIFByb3BlcnR5RmlsZUl0ZXJhdG9yLgorLy8gfGl0ZXJ8IGlzIHRoZSBpdGVyYXRvciBpbnN0YW5jZS4KKy8vIHxwcm9wZXJ0eUZpbGV8IGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIGluIG1lbW9yeS4KKy8vIHxwcm9wZXJ0eUZpbGVMZW58IGlzIGl0cyBsZW5naCBpbiBieXRlcy4KK3ZvaWQgcHJvcGVydHlGaWxlSXRlcmF0b3JfaW5pdChQcm9wZXJ0eUZpbGVJdGVyYXRvciogaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwcm9wZXJ0eUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHByb3BlcnR5RmlsZUxlbik7CisKKy8vIEV4dHJhY3Qgb25lIHByb3BlcnR5IGZyb20gYSBwcm9wZXJ0eSBmaWxlIGl0ZXJhdG9yLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG9uZSwgb3IgZmFsc2UgaWYgdGhlIGl0ZXJhdGlvbiBoYXMgc3RvcHBlZC4KKy8vIElmIHRydWUsIG9uZSBjYW4gcmVhZCB8aXRlci0+bmFtZXwgYW5kIHxpdGVyLT52YWx1ZXwgdG8gZ2V0IHRoZQorLy8gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUsIHJlc3BlY3RpdmVseSwgYXMgemVyby10ZXJtaW5hdGVkIHN0cmluZ3MKKy8vIHRoYXQgbmVlZCB0byBiZSBjb3BpZWQgYnkgdGhlIGNhbGxlci4KK2Jvb2wgcHJvcGVydHlGaWxlSXRlcmF0b3JfbmV4dChQcm9wZXJ0eUZpbGVJdGVyYXRvciogaXRlcik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3Byb3BlcnR5X2ZpbGVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3Byb3BlcnR5X2ZpbGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4NzdmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcHJvcGVydHlfZmlsZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wcm9wZXJ0eV9maWxlLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIFVubGlrZSBzdGQ6OnN0cmluZywgYWNjZXB0IE5VTEwgYXMgaW5wdXQuCitjbGFzcyBTdHJpbmcgeworcHVibGljOgorICAgIGV4cGxpY2l0IFN0cmluZyhjb25zdCBjaGFyKiBzdHIpIDogbVN0cihzdHIpIHt9CisgICAgflN0cmluZygpIHsgZnJlZShjb25zdF9jYXN0PGNoYXIqPihtU3RyKSk7IH0KKyAgICBjb25zdCBjaGFyKiBzdHIoKSBjb25zdCB7IHJldHVybiBtU3RyOyB9Citwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIG1TdHI7Cit9OworCitURVNUKFByb3BlcnR5RmlsZSwgRW1wdHlGaWxlKSB7CisgICAgRVhQRUNUX0ZBTFNFKHByb3BlcnR5RmlsZV9nZXRWYWx1ZSgiIiwgMFUsICJzZGsudmVyc2lvbiIpKTsKK30KKworVEVTVChQcm9wZXJ0eUZpbGUsIFNpbmdsZUxpbmVGaWxlKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ZpbGVbXSA9ICJmb289YmFyXG4iOworICAgIFN0cmluZyB2YWx1ZShwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoa0ZpbGUsIHNpemVvZiBrRmlsZSwgImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS5zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCB2YWx1ZS5zdHIoKSk7CisKKyAgICBTdHJpbmcgdmFsdWUyKHByb3BlcnR5RmlsZV9nZXRWYWx1ZShrRmlsZSwgc2l6ZW9mIGtGaWxlLCAiYmFyIikpOworICAgIEVYUEVDVF9GQUxTRSh2YWx1ZTIuc3RyKCkpOworfQorCitURVNUKFByb3BlcnR5RmlsZSwgU2luZ2xlTGluZUZpbGVXaXRoWmVyb1Rlcm1pbmF0b3IpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRmlsZVtdID0gImZvbz1iYXIiOworICAgIFN0cmluZyB2YWx1ZShwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoa0ZpbGUsIHNpemVvZiBrRmlsZSwgImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS5zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCB2YWx1ZS5zdHIoKSk7CisKKyAgICBTdHJpbmcgdmFsdWUyKHByb3BlcnR5RmlsZV9nZXRWYWx1ZShrRmlsZSwgc2l6ZW9mIGtGaWxlLCAiYmFyIikpOworICAgIEVYUEVDVF9GQUxTRSh2YWx1ZTIuc3RyKCkpOworfQorCitURVNUKFByb3BlcnR5RmlsZSwgTXVsdGlMaW5lRmlsZSkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtGaWxlW10gPQorICAgICAgICAiZm9vPWJhclxuIgorICAgICAgICAiYmFyPXpvb1xuIgorICAgICAgICAic2RrPTQuMlxuIjsKKworICAgIFN0cmluZyBmb28ocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJmb28iKSk7CisgICAgU3RyaW5nIGJhcihwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoa0ZpbGUsIHNpemVvZiBrRmlsZSwgImJhciIpKTsKKyAgICBTdHJpbmcgc2RrKHByb3BlcnR5RmlsZV9nZXRWYWx1ZShrRmlsZSwgc2l6ZW9mIGtGaWxlLCAic2RrIikpOworCisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBmb28uc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiem9vIiwgYmFyLnN0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQuMiIsIHNkay5zdHIoKSk7Cit9CisKK1RFU1QoUHJvcGVydHlGaWxlLCBNdWx0aUxpbmVGaWxlV2l0aFplcm9UZXJtaW5hdG9yKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ZpbGVbXSA9CisgICAgICAgICJmb289YmFyXG4iCisgICAgICAgICJiYXI9em9vXG4iCisgICAgICAgICJzZGs9NC4yIjsKKworICAgIFN0cmluZyBmb28ocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJmb28iKSk7CisgICAgU3RyaW5nIGJhcihwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoa0ZpbGUsIHNpemVvZiBrRmlsZSwgImJhciIpKTsKKyAgICBTdHJpbmcgc2RrKHByb3BlcnR5RmlsZV9nZXRWYWx1ZShrRmlsZSwgc2l6ZW9mIGtGaWxlLCAic2RrIikpOworCisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBmb28uc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiem9vIiwgYmFyLnN0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjQuMiIsIHNkay5zdHIoKSk7Cit9CisKK1RFU1QoUHJvcGVydHlGaWxlLCBNdWx0aUxpbmVGaWxlV2l0aENSTEYpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRmlsZVtdID0KKyAgICAgICAgImZvbz1iYXJcclxuIgorICAgICAgICAiYmFyPXpvb1xyXG4iCisgICAgICAgICJzZGs9NC4yXG4iOworCisgICAgU3RyaW5nIGZvbyhwcm9wZXJ0eUZpbGVfZ2V0VmFsdWUoa0ZpbGUsIHNpemVvZiBrRmlsZSwgImZvbyIpKTsKKyAgICBTdHJpbmcgYmFyKHByb3BlcnR5RmlsZV9nZXRWYWx1ZShrRmlsZSwgc2l6ZW9mIGtGaWxlLCAiYmFyIikpOworICAgIFN0cmluZyBzZGsocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJzZGsiKSk7CisKKyAgICBFWFBFQ1RfU1RSRVEoImJhciIsIGZvby5zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJ6b28iLCBiYXIuc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiNC4yIiwgc2RrLnN0cigpKTsKK30KKworVEVTVChQcm9wZXJ0eUZpbGUsIFNwYWNlQXJvdW5kUHJvcGVydHlOYW1lQW5kVmFsdWVzKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ZpbGVbXSA9ICIgIGZvbyA9IGJhciB6b28gXG4iOworICAgIFN0cmluZyBmb28ocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJmb28iKSk7CisgICAgRVhQRUNUX1NUUkVRKCIgYmFyIHpvbyAiLCBmb28uc3RyKCkpOworfQorCitURVNUKFByb3BlcnR5RmlsZSwgVmFsdWVUb29Mb25nSXNUcnVuY2F0ZWQpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRmlsZVtdID0KKyAgICAgICAgImZvbz1UaGlzIGlzIGFuIGluY3JlZGlibGUgbG9uZyB2YWx1ZSB0aGF0IGlzIGdvaW5nIHRvIGJlIHRydW5jYXRlZCIKKyAgICAgICAgIiBieSB0aGUgcHJvcGVydHkgZmlsZSBwYXJzZXIgc2luY2UgaXQgaXMgbG9uZ2VyIHRoYW4gIgorICAgICAgICAiTUFYX1BST1BFUlRZX1ZBTFVFX0xFTlxuIjsKKyAgICBjaGFyIGV4cGVjdGVkW01BWF9QUk9QRVJUWV9WQUxVRV9MRU5dOworICAgIG1lbWNweShleHBlY3RlZCwga0ZpbGUgKyA0LCBzaXplb2YgZXhwZWN0ZWQpOworICAgIGV4cGVjdGVkWyhzaXplb2YgZXhwZWN0ZWQpIC0gMVVdID0gMDsKKworICAgIFN0cmluZyBmb28ocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJmb28iKSk7CisgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLCBmb28uc3RyKCkpOworfQorCitURVNUKFByb3BlcnR5RmlsZSwgUmV0dXJuTGF0ZXN0VmFyaWFibGVEZWZpbml0aW9uKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0ZpbGVbXSA9ICJmb289YmFyXG5mb289em9vXG4iOworICAgIFN0cmluZyBmb28ocHJvcGVydHlGaWxlX2dldFZhbHVlKGtGaWxlLCBzaXplb2Yga0ZpbGUsICJmb28iKSk7CisgICAgRVhQRUNUX1NUUkVRKCJ6b28iLCBmb28uc3RyKCkpOworfQorCitURVNUKFByb3BlcnR5RmlsZSwgSXRlcmF0b3IpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRmlsZVtdID0KKyAgICAgICAgICAgICJmb289YmFyXG4iCisgICAgICAgICAgICAidGhpcy1uYW1lLWlzLXRvby1sb25nLWFuZC13aWxsLWJlLWlnbm9yZWQtYnktdGhlLXBhcnNlcj1haGFoXG4iCisgICAgICAgICAgICAiZm9vMj10aGlzLXZhbHVlLWlzLXRvby1sb25nLWFuZC13aWxsLWJlLXRydW5jYXRlZC1ieS10aGUtcGFyc2VyIgorICAgICAgICAgICAgICAgICAgICAiLXdoaWNoLW9ubHktd2FudHMtc29tZXRoaW5nLXNtYWxsZXItdGhhbi05Mi1ieXRlc1xuIgorICAgICAgICAgICAgImZvbzM9YmFyXHJcbiIKKyAgICAgICAgICAgICJiYXI9IHpvbyI7CisKKyAgICBQcm9wZXJ0eUZpbGVJdGVyYXRvciBpdGVyWzFdOworICAgIHByb3BlcnR5RmlsZUl0ZXJhdG9yX2luaXQoaXRlciwga0ZpbGUsIHNpemVvZiBrRmlsZSk7CisKKyAgICBFWFBFQ1RfVFJVRShwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KGl0ZXIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImZvbyIsIGl0ZXItPm5hbWUpOworICAgIEVYUEVDVF9TVFJFUSgiYmFyIiwgaXRlci0+dmFsdWUpOworCisgICAgRVhQRUNUX1RSVUUocHJvcGVydHlGaWxlSXRlcmF0b3JfbmV4dChpdGVyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb28yIiwgaXRlci0+bmFtZSk7CisgICAgRVhQRUNUX1NUUkVRKCJ0aGlzLXZhbHVlLWlzLXRvby1sb25nLWFuZC13aWxsLWJlLXRydW5jYXRlZC1ieS10aGUtIgorICAgICAgICAgICAgICAgICAicGFyc2VyLXdoaWNoLW9ubHktd2FudHMtc29tZXRoaW5nLXNtYWxsIiwgaXRlci0+dmFsdWUpOworCisgICAgRVhQRUNUX1RSVUUocHJvcGVydHlGaWxlSXRlcmF0b3JfbmV4dChpdGVyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJmb28zIiwgaXRlci0+bmFtZSk7CisgICAgRVhQRUNUX1NUUkVRKCJiYXIiLCBpdGVyLT52YWx1ZSk7CisKKyAgICBFWFBFQ1RfVFJVRShwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KGl0ZXIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImJhciIsIGl0ZXItPm5hbWUpOworICAgIEVYUEVDVF9TVFJFUSgiIHpvbyIsIGl0ZXItPnZhbHVlKTsKKworICAgIEVYUEVDVF9GQUxTRShwcm9wZXJ0eUZpbGVJdGVyYXRvcl9uZXh0KGl0ZXIpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9yZWZsaXN0LmMgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcmVmbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Mzk5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcmVmbGlzdC5jCkBAIC0wLDAgKzEsMjg4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9yZWZsaXN0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Fzc2VydC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgdm9pZCoqIF9hcmVmbGlzdF9pdGVtcyhjb25zdCBBUmVmTGlzdCogIGwpCit7CisgICAgaWYgKGwtPm1heCA9PSAxKQorICAgICAgICByZXR1cm4gKHZvaWQqKikmbC0+dS5pdGVtMDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBsLT51Lml0ZW1zOworfQorCitzdGF0aWMgdm9pZAorX2FyZWZsaXN0X2NoZWNrU2l6ZTAoQVJlZkxpc3QqICBsKQoreworICAgIGlmIChsLT5zaXplID09IDAgJiYgbC0+bWF4ID4gMSkgeworICAgICAgICBBRlJFRShsLT51Lml0ZW1zKTsKKyAgICAgICAgbC0+bWF4ICAgICA9IDE7CisgICAgICAgIGwtPnUuaXRlbTAgPSBOVUxMOworICAgIH0KK30KKwordm9pZAorYXJlZmxpc3Rfc2V0RW1wdHkoQVJlZkxpc3QqICBsKQoreworICAgIGlmIChsLT5pdGVyYXRpb24gPiAwKSB7CisgICAgICAgIC8qIGRlZmVycmVkIGVtcHR5LCBzZXQgYWxsIGl0ZW1zIHRvIE5VTEwKKyAgICAgICAgICogdG8gc3RvcCBpdGVyYXRpb25zICovCisgICAgICAgIHZvaWQqKiAgaXRlbXMgPSBfYXJlZmxpc3RfaXRlbXMobCk7CisgICAgICAgIEFBUlJBWV9aRVJPKGl0ZW1zLCBsLT5jb3VudCk7CisgICAgICAgIGwtPml0ZXJhdGlvbiB8PSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRpcmVjdCBlbXB0eSAqLworICAgICAgICBsLT5zaXplID0gMDsKKyAgICAgICAgX2FyZWZsaXN0X2NoZWNrU2l6ZTAobCk7CisgICAgfQorICAgIGwtPmNvdW50ID0gMDsKK30KKworaW50CithcmVmbGlzdF9pbmRleE9mKGNvbnN0IEFSZWZMaXN0KiAgbCwgdm9pZCogIGl0ZW0pCit7CisgICAgaWYgKGl0ZW0pIHsKKyAgICAgICAgdm9pZCoqICBpdGVtcyA9IF9hcmVmbGlzdF9pdGVtcyhsKTsKKyAgICAgICAgdm9pZCoqICBlbmQgICA9IGl0ZW1zICsgbC0+Y291bnQ7CisgICAgICAgIHZvaWQqKiAgaWkgICAgPSBpdGVtczsKKworICAgICAgICBmb3IgKCA7IGlpIDwgZW5kOyBpaSArPSAxICkKKyAgICAgICAgICAgIGlmICgqaWkgPT0gaXRlbSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGlpIC0gaXRlbXMpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCithcmVmbGlzdF9ncm93KEFSZWZMaXN0KiAgbCwgaW50ICBjb3VudCkKK3sKKyAgICBpbnQgICBuZXdjb3VudCA9IGwtPnNpemUgKyBjb3VudDsKKyAgICBpZiAobmV3Y291bnQgPiBsLT5tYXgpIHsKKyAgICAgICAgaW50ICBvbGRtYXggPSBsLT5tYXg7CisgICAgICAgIGludCAgbmV3bWF4OworICAgICAgICB2b2lkKiogIGl0ZW1zOworCisgICAgICAgIGlmIChvbGRtYXggPT0gMSkgeworICAgICAgICAgICAgb2xkbWF4ICAgPSAwOworICAgICAgICAgICAgaXRlbXMgICAgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXRlbXMgPSBsLT51Lml0ZW1zOworICAgICAgICB9CisgICAgICAgIG5ld21heCA9IG9sZG1heDsKKyAgICAgICAgd2hpbGUgKG5ld21heCA8IG5ld2NvdW50KQorICAgICAgICAgICAgbmV3bWF4ICs9IChuZXdtYXggPj4gMSkgKyA0OworCisgICAgICAgIEFBUlJBWV9SRU5FVyhpdGVtcywgbmV3bWF4KTsKKworICAgICAgICBpZiAobC0+bWF4ID09IDEpCisgICAgICAgICAgICBpdGVtc1swXSA9IGwtPnUuaXRlbTA7CisKKyAgICAgICAgbC0+dS5pdGVtcyA9IGl0ZW1zOworICAgICAgICBsLT5tYXggICAgID0gKHVpbnQxNl90KSBuZXdtYXg7CisgICAgfQorfQorCisKK3ZvaWQKK2FyZWZsaXN0X2FkZChBUmVmTGlzdCogIGwsIHZvaWQqICBpdGVtKQoreworICAgIGlmIChpdGVtKSB7CisgICAgICAgIHZvaWQqKiAgaXRlbXM7CisKKyAgICAgICAgaWYgKGwtPnNpemUgPj0gbC0+bWF4KSB7CisgICAgICAgICAgICBhcmVmbGlzdF9ncm93KGwsIDEpOworICAgICAgICB9CisgICAgICAgIGl0ZW1zID0gX2FyZWZsaXN0X2l0ZW1zKGwpOworICAgICAgICBpdGVtc1tsLT5zaXplXSA9IGl0ZW07CisgICAgICAgIGwtPnNpemUgICs9IDE7CisgICAgICAgIGwtPmNvdW50ICs9IDE7CisgICAgfQorfQorCit2b2lkCithcmVmbGlzdF9hcHBlbmQoQVJlZkxpc3QqICBsLCBjb25zdCBBUmVmTGlzdCogIGwyKQoreworICAgIEFSRUZMSVNUX0ZPUkVBQ0hfQ09OU1QobDIsIGl0ZW0sIHsKKyAgICAgICAgYXJlZmxpc3RfYWRkKGwsIGl0ZW0pOworICAgIH0pOworfQorCit2b2lkKgorYXJlZmxpc3RfcG9wTGFzdChBUmVmTGlzdCogIGwpCit7CisgICAgdm9pZCogICBpdGVtID0gTlVMTDsKKyAgICB2b2lkKiogIGl0ZW1zID0gX2FyZWZsaXN0X2l0ZW1zKGwpOworICAgIGludCAgICAgbm47CisKKyAgICBpZiAobC0+Y291bnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKG5uID0gbC0+c2l6ZTsgbm4gPiAwOyBubi0tKSB7CisgICAgICAgIGl0ZW0gPSBpdGVtc1tubi0xXTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRk9VTkRfTEFTVDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisKK0ZPVU5EX0xBU1Q6CisgICAgLyogd2UgZm91bmQgdGhlIGxhc3Qgbm9uLU5VTEwgaXRlbSBpbiB0aGUgYXJyYXkgKi8KKyAgICBsLT5jb3VudCAgIC09IDE7CisgICAgaXRlbXNbbm4tMV0gPSBOVUxMOworCisgICAgaWYgKGwtPml0ZXJhdGlvbiA9PSAwKSB7CisgICAgICAgIGwtPnNpemUgPSBubjsKKyAgICAgICAgX2FyZWZsaXN0X2NoZWNrU2l6ZTAobCk7CisgICAgfQorICAgIHJldHVybiBpdGVtOworfQorCitBQm9vbAorYXJlZmxpc3RfZGVsRmlyc3QoQVJlZkxpc3QqICBsLCB2b2lkKiAgaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGludCAgaW5kZXggPSBhcmVmbGlzdF9pbmRleE9mKGwsIGl0ZW0pOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgdm9pZCoqIGl0ZW1zID0gX2FyZWZsaXN0X2l0ZW1zKGwpOworCisgICAgaWYgKGwtPml0ZXJhdGlvbiA+IDApIHsKKyAgICAgICAgLyogZGVmZXJyZWQgZGVsZXRpb24gKi8KKyAgICAgICAgaXRlbXNbaW5kZXhdICA9IE5VTEw7CisgICAgICAgIGwtPml0ZXJhdGlvbiB8PSAxOworICAgICAgICBsLT5jb3VudCAgICAgLT0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBkaXJlY3QgZGVsZXRpb24gKi8KKyAgICAgICAgaWYgKGwtPm1heCA+IDEpIHsKKyAgICAgICAgICAgIEFBUlJBWV9NT1ZFKGl0ZW1zICsgaW5kZXgsIGl0ZW1zICsgaW5kZXggKyAxLCBsLT5zaXplIC0gaW5kZXggLSAxKTsKKyAgICAgICAgICAgIGwtPnNpemUgLT0gMTsKKyAgICBsLT5jb3VudCAtPSAxOworICAgICAgICAgICAgX2FyZWZsaXN0X2NoZWNrU2l6ZTAobCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsLT51Lml0ZW0wID0gTlVMTDsKKyAgICAgICAgICAgIGwtPnNpemUgICAgPSAwOworICAgICAgICAgICAgbC0+Y291bnQgICA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK0FCb29sCithcmVmbGlzdF9kZWxBbGwoQVJlZkxpc3QqICBsLCB2b2lkKiAgaXRlbSkKK3sKKyAgICBBQm9vbCAgIHJlc3VsdCA9IDA7CisKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHZvaWQqKiAgaXRlbXMgICAgPSBfYXJlZmxpc3RfaXRlbXMobCk7CisgICAgaW50ICAgICByZWFkUG9zICA9IDA7CisgICAgaW50ICAgICB3cml0ZVBvcyA9IDA7CisKKyAgICAvKiBkb24ndCBtb2RpZnkgdGhlIGxpc3QgdW50aWwgd2UgZmluZCB0aGUgaXRlbQorICAgICAqIG9yIGFuIEVNUFRZIHNsb3QgKi8KKyAgICBmb3IgKCA7IHJlYWRQb3MgPCBsLT5zaXplOyByZWFkUG9zKysgKSB7CisgICAgICAgIGlmIChpdGVtc1tyZWFkUG9zXSA9PSBOVUxMIHx8IGl0ZW1zW3JlYWRQb3NdID09IGl0ZW0pCisgICAgICAgICAgICBnb3RvIENPUFlfTElTVDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK0NPUFlfTElTVDoKKyAgICB3cml0ZVBvcyA9IHJlYWRQb3M7CisgICAgZm9yICggOyByZWFkUG9zIDwgbC0+c2l6ZTsgcmVhZFBvcysrICkgeworICAgICAgICBpZiAoaXRlbXNbcmVhZFBvc10gPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZW1zW3JlYWRQb3NdID09IGl0ZW0pIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpdGVtc1t3cml0ZVBvc10gPSBpdGVtc1tyZWFkUG9zXTsKKyAgICAgICAgd3JpdGVQb3MrKzsKKyAgICB9CisgICAgbC0+Y291bnQgPSBsLT5zaXplID0gKHVpbnQxNl90KSB3cml0ZVBvczsKKyAgICBfYXJlZmxpc3RfY2hlY2tTaXplMChsKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZAorX2FyZWZsaXN0X3JlbW92ZV9kZWZlcnJlZChBUmVmTGlzdCogIGwpCit7CisgICAgaWYgKGwtPml0ZXJhdGlvbiAmIDEpIHsKKyAgICAgICAgLyogcmVtb3ZlIGFsbCBOVUxMIGVsZW1lbnRzIGZyb20gdGhlIGFycmF5ICovCisgICAgICAgIHZvaWQqKiAgaXRlbXMgPSBfYXJlZmxpc3RfaXRlbXMobCk7CisgICAgICAgIGludCAgICAgcnIgPSAwOworICAgICAgICBpbnQgICAgIHd3ID0gMDsKKyAgICAgICAgZm9yICggOyByciA8IGwtPnNpemU7IHJyKysgKSB7CisgICAgICAgICAgICBpZiAoaXRlbXNbcnJdICE9IE5VTEwpCisgICAgICAgICAgICAgICAgaXRlbXNbd3crK10gPSBpdGVtc1tycl07CisgICAgICAgIH0KKyAgICAgICAgbC0+Y291bnQgPSBsLT5zaXplID0gKHVpbnQxNl90KSB3dzsKKyAgICAgICAgX2FyZWZsaXN0X2NoZWNrU2l6ZTAobCk7CisgICAgfQorICAgIGwtPml0ZXJhdGlvbiA9IDA7Cit9CisKK3ZvaWQKK2FyZWZsaXN0X2NvcHkoQVJlZkxpc3QqICBkc3QsIGNvbnN0IEFSZWZMaXN0KiAgc3JjKQoreworICAgIGRzdFswXSA9IHNyY1swXTsKKworICAgIGlmIChzcmMtPm1heCA+IDEpIHsKKyAgICAgICAgZHN0LT5tYXggID0gZHN0LT5jb3VudDsKKyAgICAgICAgQUFSUkFZX05FVyhkc3QtPnUuaXRlbXMsIGRzdC0+bWF4KTsKKworICAgICAgICB2b2lkKiogIHJpdGVtcyA9IHNyYy0+dS5pdGVtczsKKyAgICAgICAgdm9pZCoqICB3aXRlbXMgPSBfYXJlZmxpc3RfaXRlbXMoZHN0KTsKKyAgICAgICAgaW50ICByciA9IDA7CisgICAgICAgIGludCAgd3cgPSAwOworICAgICAgICBmb3IgKCA7IHJyIDwgc3JjLT5zaXplOyBycisrICkgeworICAgICAgICAgICAgaWYgKHJpdGVtc1tycl0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHdpdGVtc1t3dysrXSA9IHJpdGVtc1tycl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5zaXplID0gd3c7CisgICAgICAgIEFBU1NFUlRfVFJVRSh3dyA9PSBkc3QtPmNvdW50KTsKKyAgICAgICAgX2FyZWZsaXN0X2NoZWNrU2l6ZTAoZHN0KTsKKyAgICB9Cit9CisKK3ZvaWQqCithcmVmbGlzdF9nZXQoY29uc3QgQVJlZkxpc3QqICBsLCBpbnQgIG4pCit7CisgICAgaWYgKCh1bnNpZ25lZCluID49ICh1bnNpZ25lZClsLT5jb3VudCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobC0+bWF4ID09IDEpCisgICAgICAgIHJldHVybiBsLT51Lml0ZW0wOworCisgICAgcmV0dXJuIGwtPnUuaXRlbXNbbl07Cit9CisKK3ZvaWQqKgorX2FyZWZsaXN0X2F0KGNvbnN0IEFSZWZMaXN0KiAgbCwgaW50ICBuKQoreworICAgIHZvaWQqKiAgaXRlbXM7CisKKyAgICBpZiAoKHVuc2lnbmVkKW4gPj0gKHVuc2lnbmVkKWwtPnNpemUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaXRlbXMgPSBfYXJlZmxpc3RfaXRlbXMobCk7CisgICAgcmV0dXJuIGl0ZW1zICsgbjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9yZWZsaXN0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcmVmbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NGYwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcmVmbGlzdC5oCkBAIC0wLDAgKzEsMjEyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhbmRyb2lkL3V0aWxzL3N5c3RlbS5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBEZWZpbml0aW9ucyBmb3IgYSBzbWFydCBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gZ2VuZXJpYyBvYmplY3RzLgorICogc3VwcG9ydHMgc2FmZSBkZWxldGlvbiBhbmQgYWRkaXRpb24gd2hpbGUgdGhleSBhcmUgYmVpbmcgaXRlcmF0ZWQKKyAqIHdpdGggQVJFRkxJU1RfRk9SRUFDSCgpIG1hY3JvLgorICoKKyAqIG5vdGUgdGhhdCB5b3UgY2Fubm90IGFkZCBOVUxMIHRvIGFuIEFSZWZMaXN0LgorICovCisKKy8qIENsaWVudHMgc2hvdWxkIGlnbm9yZSB0aGVzZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLCB3aGljaAorICogd2UncmUgZ29pbmcgdG8gZXhwbGFpbiB0aGVyZToKKyAqICAgLSAnY291bnQnIGlzIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGxpc3QKKyAqICAgLSAnc2l6ZScgaXMgdGhlIG51bWJlciBvZiBzbG90cyBpbiB0aGUgbGlzdCdzIGFycmF5LiBJdCBpcworICogICAgIGFsd2F5cyA+PSAnY291bnQnLiBTb21lIHNsb3RzIGNvcnJlc3BvbmQgdG8gZGVsZXRlZCBpdGVtcworICogICAgIGFuZCB3aWxsIGhvbGQgYSBOVUxMIHZhbHVlLgorICogICAtICdtYXgnIGlzIHRoZSBzaXplIG9mIHRoZSBzbG90cyBhcnJheQorICogICAtICd1Lml0ZW0wJyBpcyB1c2VkIHdoZW4gJ21heCcgaXMgMQorICogICAtICd1Lml0ZW1zJyBpcyB0aGUgc2xvdCBhcnJheSBpZiAnbWF4ID4gMScKKyAqICAgLSAndS5uZXh0JyBpcyBvbmx5IHVzZWQgZm9yIGZyZWUtbGlzdCBzdG9yYWdlLgorICovCit0eXBlZGVmIHN0cnVjdCBBUmVmTGlzdCB7CisgICAgLyogWFhYOiBzaG91bGQgd2UgdXNlIHVpbnQzMl90IGluc3RlYWQgPyAqLworICAgIHVpbnQxNl90ICAgY291bnQsIHNpemUsIG1heDsKKyAgICB1aW50MTZfdCAgIGl0ZXJhdGlvbjsKKyAgICB1bmlvbiB7CisgICAgICAgIHZvaWQqICAgaXRlbTA7CisgICAgICAgIHZvaWQqKiAgaXRlbXM7CisgICAgfSB1OworfSBBUmVmTGlzdDsKKworLyogSW5pdGlhbGl6ZSBhbiBlbXB0eSBBUmVmTGlzdCAqLworQUlOTElORUQgdm9pZAorYXJlZmxpc3RfaW5pdChBUmVmTGlzdCogIGwpCit7CisgICAgbC0+Y291bnQgICAgID0gMDsKKyAgICBsLT5zaXplICAgICAgPSAwOworICAgIGwtPm1heCAgICAgICA9IDE7CisgICAgbC0+aXRlcmF0aW9uID0gMDsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBsaXN0ICovCitBSU5MSU5FRCBpbnQKK2FyZWZsaXN0X2dldENvdW50KGNvbnN0IEFSZWZMaXN0KiAgbCkKK3sKKyAgICByZXR1cm4gbC0+Y291bnQ7Cit9CisKKy8qIENsZWFyIGFuIEFSZWZMaXN0ICovCit2b2lkICBhcmVmbGlzdF9zZXRFbXB0eShBUmVmTGlzdCogIGwpOworCisvKiBGaW5hbGl6ZSwgaS5lLiBjbGVhciwgYW4gQVJlZkxpc3QgKi8KK0FJTkxJTkVEIHZvaWQKK2FyZWZsaXN0X2RvbmUoQVJlZkxpc3QqICBsKQoreworICAgIGFyZWZsaXN0X3NldEVtcHR5KGwpOworfQorCisvKiBSZXR1cm4gVFJVRSBpZmYgYW4gQVJlZkxpc3QgaGFzIG5vIGl0ZW0gKi8KK0FJTkxJTkVEIEFCb29sCithcmVmbGlzdF9pc0VtcHR5KGNvbnN0IEFSZWZMaXN0KiAgbCkKK3sKKyAgICByZXR1cm4gKGFyZWZsaXN0X2dldENvdW50KGwpID09IDApOworfQorCisvKiBSZXR1cm4gdGhlIGluZGV4IG9mICdpdGVtJyBpbiB0aGUgQVJlZkxpc3QsIG9yIC0xLgorICogVGhpcyByZXR1cm5zIC0xIGlmICdpdGVtJyBpcyBOVUxMLgorICovCitpbnQgICAgYXJlZmxpc3RfaW5kZXhPZihjb25zdCBBUmVmTGlzdCogIGwsIHZvaWQqICBpdGVtKTsKKworLyogUmV0dXJuIFRSVUUgaWZmIGFuIEFSZWZMaXN0IGNvbnRhaW5zICdpdGVtJyAqLworQUlOTElORUQgQUJvb2wKK2FyZWZsaXN0X2hhcyhjb25zdCBBUmVmTGlzdCogIGwsIHZvaWQqICBpdGVtKQoreworICAgIHJldHVybiBhcmVmbGlzdF9pbmRleE9mKGwsIGl0ZW0pID49IDA7Cit9CisKKy8qIEFwcGVuZCAnaXRlbScgdG8gYSBsaXN0LiBBbiBpdGVtIGNhbiBiZSBhZGRlZCBzZXZlcmFsCisgKiB0aW1lcyB0byB0aGUgc2FtZSBsaXN0LiBEbyBub3RoaW5nIGlmICdpdGVtJyBpcyBOVUxMLiAqLwordm9pZCAgICBhcmVmbGlzdF9hZGQoQVJlZkxpc3QqICBsLCB2b2lkKiAgaXRlbSk7CisKKy8qIFJlbW92ZSBmaXJzdCBpbnN0YW5jZSBvZiAnaXRlbScgZnJvbSBhbiBBUmVmTGlzdC4KKyAqIFJldHVybnMgVFJVRSBpZmYgdGhlIGl0ZW0gd2FzIGZvdW5kIGluIHRoZSBsaXN0LiAqLworQUJvb2wgICBhcmVmbGlzdF9kZWxGaXJzdChBUmVmTGlzdCogIGwsIHZvaWQqICBpdGVtKTsKKworLyogUmVtb3ZlIGFsbCBpbnN0YW5jZXMgb2YgJ2l0ZW0nIGZyb20gYW4gQVJlZkxpc3QuCisgKiByZXR1cm5zIFRSVUUgaWZmIHRoZSBpdGVtIHdhcyBmb3VuZCBpbiB0aGUgbGlzdCAqLworQUJvb2wgICBhcmVmbGlzdF9kZWxBbGwoQVJlZkxpc3QqICBsLCB2b2lkKiAgaXRlbSk7CisKKy8qIFNhbWUgYXMgYXJlZmxpc3RfYWRkKCkgKi8KK0FJTkxJTkVEIHZvaWQKK2FyZWZsaXN0X3B1c2goQVJlZkxpc3QqICBsLCB2b2lkKiAgaXRlbSkKK3sKKyAgICBhcmVmbGlzdF9hZGQobCwgaXRlbSk7Cit9CisKKy8qIFJlbW92ZSBsYXN0IGl0ZW0gZnJvbSBhbiBBUmVmTGlzdCBhbmQgcmV0dXJuIGl0LgorICogTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgbGlzdCBpcyBlbXB0eSAqLwordm9pZCogIGFyZWZsaXN0X3BvcExhc3QoQVJlZkxpc3QqICBsKTsKKworLyogUmV0dXJuIHRoZSBuLXRoIGFycmF5IGVudHJ5LCBvciBOVUxMIGluIGNhc2Ugb2YgaW52YWxpZCBpbmRleCAqLwordm9pZCogICBhcmVmbGlzdF9nZXQoY29uc3QgQVJlZkxpc3QqICBsLCBpbnQgIG4pOworCitBSU5MSU5FRCBpbnQKK2FyZWZsaXN0X2NvdW50KEFSZWZMaXN0KiAgbCkKK3sKKyAgICByZXR1cm4gbC0+Y291bnQ7Cit9CisKK3ZvaWQgIGFyZWZsaXN0X2FwcGVuZChBUmVmTGlzdCogIGwsIGNvbnN0IEFSZWZMaXN0KiAgc3JjKTsKKworLyogdXNlZCBpbnRlcm5hbGx5ICovCit2b2lkICAgIF9hcmVmbGlzdF9yZW1vdmVfZGVmZXJyZWQoQVJlZkxpc3QqICBsKTsKKwordm9pZCoqICBfYXJlZmxpc3RfYXQoY29uc3QgQVJlZkxpc3QqICBsLCBpbnQgIG4pOworCisjZGVmaW5lICBBUkVGTElTVF9MT09QKGxpc3RfLGl0ZW12YXJfKSBcCisgICAgZG8geyBcCisgICAgICAgIEFSZWZMaXN0KiAgX3JlZmxpc3RfbG9vcCAgID0gKGxpc3RfKTsgXAorICAgICAgICBpbnQgICAgICAgIF9yZWZsaXN0X2xvb3BfaSA9IDA7IFwKKyAgICAgICAgaW50ICAgICAgICBfcmVmbGlzdF9sb29wX24gPSBfcmVmbGlzdF9sb29wLT5zaXplOyBcCisgICAgICAgIF9yZWZsaXN0X2xvb3AtPml0ZXJhdGlvbiArPSAyOyBcCisgICAgICAgIGZvciAoIDsgX3JlZmxpc3RfbG9vcF9pIDwgX3JlZmxpc3RfbG9vcF9uOyBfcmVmbGlzdF9sb29wX2krKyApIHsgXAorICAgICAgICAgICAgdm9pZCoqIF9yZWZsaXN0X2xvb3BfYXQgPSBfYXJlZmxpc3RfYXQoX3JlZmxpc3RfbG9vcCwgX3JlZmxpc3RfbG9vcF9pKTsgXAorICAgICAgICAgICAgKGl0ZW12YXJfKSA9ICooX3JlZmxpc3RfbG9vcF9hdCk7IFwKKyAgICAgICAgICAgIGlmICgoaXRlbXZhcl8pICE9IE5VTEwpIHsKKworI2RlZmluZSAgQVJFRkxJU1RfTE9PUF9FTkQgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBpZiAoX3JlZmxpc3RfbG9vcC0+aXRlcmF0aW9uICYgMSkgXAorICAgICAgICAgICAgX2FyZWZsaXN0X3JlbW92ZV9kZWZlcnJlZChfcmVmbGlzdF9sb29wKTsgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lICBBUkVGTElTVF9MT09QX0NPTlNUKGxpc3RfLGl0ZW12YXJfKSBcCisgICAgZG8geyBcCisgICAgICAgIGNvbnN0IEFSZWZMaXN0KiAgX3JlZmxpc3RfbG9vcCAgID0gKGxpc3RfKTsgXAorICAgICAgICBpbnQgICAgICAgICAgICAgIF9yZWZsaXN0X2xvb3BfaSA9IDA7IFwKKyAgICAgICAgaW50ICAgICAgICAgICAgICBfcmVmbGlzdF9sb29wX24gPSBfcmVmbGlzdF9sb29wLT5zaXplOyBcCisgICAgICAgIGZvciAoIDsgX3JlZmxpc3RfbG9vcF9pIDwgX3JlZmxpc3RfbG9vcF9uOyBfcmVmbGlzdF9sb29wX2krKyApIHsgXAorICAgICAgICAgICAgdm9pZCoqIF9yZWZsaXN0X2xvb3BfYXQgPSBfYXJlZmxpc3RfYXQoX3JlZmxpc3RfbG9vcCwgX3JlZmxpc3RfbG9vcF9pKTsgXAorICAgICAgICAgICAgKGl0ZW12YXJfKSA9ICooX3JlZmxpc3RfbG9vcF9hdCk7IFwKKyAgICAgICAgICAgIGlmICgoaXRlbXZhcl8pICE9IE5VTEwpIHsKKworI2RlZmluZSAgQVJFRkxJU1RfTE9PUF9ERUwoKSBcCisgICAgKF9yZWZsaXN0X2xvb3AtPml0ZXJhdGlvbiB8PSAxLCAqX3JlZmxpc3RfbG9vcF9hdCA9IE5VTEwpCisKKyNkZWZpbmUgIEFSRUZMSVNUX0xPT1BfU0VUKHZhbCkgXAorICAgIChfcmVmbGlzdF9sb29wLT5pdGVyYXRpb24gfD0gMSwgKl9yZWZsaXN0X2xvb3BfYXQgPSAodmFsKSkKKworCisjZGVmaW5lICBBUkVGTElTVF9GT1JFQUNIKGxpc3RfLGl0ZW1fLHN0YXRlbWVudF8pIFwKKyAgICAoeyBBUmVmTGlzdCogIF9yZWZsaXN0ICAgPSAobGlzdF8pOyBcCisgICAgICAgaW50ICAgICAgICBfcmVmbGlzdF9pID0gMDsgXAorICAgICAgIGludCAgICAgICAgX3JlZmxpc3RfbiA9IF9yZWZsaXN0LT5zaXplOyBcCisgICAgICAgX3JlZmxpc3QtPml0ZXJhdGlvbiArPSAyOyBcCisgICAgICAgZm9yICggOyBfcmVmbGlzdF9pIDwgX3JlZmxpc3RfbjsgX3JlZmxpc3RfaSsrICkgeyBcCisgICAgICAgICAgIHZvaWQqKiAgX19yZWZsaXN0X2F0ICAgPSBfYXJlZmxpc3RfYXQoX3JlZmxpc3QsIF9yZWZsaXN0X2kpOyBcCisgICAgICAgICAgIHZvaWQqICBpdGVtXyA9ICpfX3JlZmxpc3RfYXQ7IFwKKyAgICAgICAgICAgaWYgKGl0ZW1fICE9IE5VTEwpIHsgXAorICAgICAgICAgICAgICAgc3RhdGVtZW50XzsgXAorICAgICAgICAgICB9IFwKKyAgICAgICB9IFwKKyAgICAgICBfcmVmbGlzdC0+aXRlcmF0aW9uIC09IDI7IFwKKyAgICAgICBpZiAoX3JlZmxpc3QtPml0ZXJhdGlvbiA9PSAxKSBcCisgICAgICAgICAgIF9hcmVmbGlzdF9yZW1vdmVfZGVmZXJyZWQoX3JlZmxpc3QpOyBcCisgICAgfSkKKworI2RlZmluZSAgQVJFRkxJU1RfRk9SRUFDSF9DT05TVChsaXN0XyxpdGVtXyxzdGF0ZW1lbnRfKSBcCisgICAgKHsgY29uc3QgQVJlZkxpc3QqICBfcmVmbGlzdCA9IChsaXN0Xyk7IFwKKyAgICAgICBpbnQgICAgICAgIF9yZWZsaXN0X2kgPSAwOyBcCisgICAgICAgaW50ICAgICAgICBfcmVmbGlzdF9uID0gX3JlZmxpc3QtPnNpemU7IFwKKyAgICAgICBmb3IgKCA7IF9yZWZsaXN0X2kgPCBfcmVmbGlzdF9uOyBfcmVmbGlzdF9pKysgKSB7IFwKKyAgICAgICAgICAgdm9pZCoqICBfX3JlZmxpc3RfYXQgPSBfYXJlZmxpc3RfYXQoX3JlZmxpc3QsIF9yZWZsaXN0X2kpOyBcCisgICAgICAgICAgIHZvaWQqICBpdGVtXyA9ICpfX3JlZmxpc3RfYXQ7IFwKKyAgICAgICAgICAgaWYgKGl0ZW1fICE9IE5VTEwpIHsgXAorICAgICAgICAgICAgICAgc3RhdGVtZW50XzsgXAorICAgICAgICAgICB9IFwKKyAgICAgICB9IFwKKyAgICB9KQorCisvKiB1c2UgdGhpcyB0byBkZWxldGUgdGhlIGN1cnJlbnRseSBpdGVyYXRlZCBlbGVtZW50ICovCisjZGVmaW5lICBBUkVGTElTVF9ERUxfSVRFUkFURUQoKSAgXAorICAgICh7ICpfX3JlZmxpc3RfYXQgPSBOVUxMOyBcCisgICAgICAgX3JlZmxpc3QtPml0ZXJhdGlvbiB8PSAxOyB9KQorCisvKiB1c2UgdGhpcyB0byByZXBsYWNlIHRoZSBjdXJyZW50bHkgaXRlcmF0ZWQgZWxlbWVudCAqLworI2RlZmluZSAgQVJFRkxJU1RfU0VUX0lURVJBVEVEKGl0ZW0pIFwKKyAgICAoeyAqX19yZWZsaXN0X2F0ID0gKGl0ZW0pOyBcCisgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgX3JlZmxpc3QtPml0ZXJhdGlvbiB8PSAxOyB9KQorCit2b2lkICBhcmVmbGlzdF9jb3B5KEFSZWZMaXN0KiAgZHN0LCBjb25zdCBBUmVmTGlzdCogIHNyYyk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3JlZnNldC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3JlZnNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvcmVmc2V0LmMKQEAgLTAsMCArMSwxODEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSA8YW5kcm9pZC91dGlscy9yZWZzZXQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2RlZmluZSAgQVJFRlNFVF9TVEVQICAgIDUKKyNkZWZpbmUgIEFSRUZTRVRfSU5JVF9TSVpFICAgIDQKKworQUlOTElORUQgdWludDMyX3QKK19hcmVmU2V0X2hhc2hJdGVtKCB2b2lkKiAgaXRlbSApCit7CisgICAgdWludDMyX3QgIGhhc2g7CisKKyAgICBoYXNoID0gKHVpbnQzMl90KShwdHJkaWZmX3QpaXRlbSA+PiAyOworICAgIGlmIChzaXplb2YoaXRlbSkgPiA0KQorICAgICAgICBoYXNoIF49ICgodWludDY0X3QpKHB0cmRpZmZfdClpdGVtID4+IDMyKTsKKworICAgIHJldHVybiBoYXNoOworfQorCitzdGF0aWMgdm9pZCoqCitfYXJlZlNldF9sb29rdXAoIEFSZWZTZXQqICBzLCB2b2lkKiAgaXRlbSkKK3sKKyAgICB1aW50MzJfdCAgaGFzaCA9IF9hcmVmU2V0X2hhc2hJdGVtKGl0ZW0pOworICAgIHVuc2lnbmVkICBpbmRleCA9IGhhc2ggJiAocy0+bWF4X2J1Y2tldHMtMSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHZvaWQqKiAgcG5vZGUgPSAmcy0+YnVja2V0c1tpbmRleF07CisKKyAgICAgICAgaWYgKCpwbm9kZSA9PSBpdGVtIHx8ICpwbm9kZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIHBub2RlOworCisgICAgICAgIGluZGV4ICs9IEFSRUZTRVRfU1RFUDsKKyAgICAgICAgaWYgKGluZGV4ID49IHMtPm1heF9idWNrZXRzKQorICAgICAgICAgICAgaW5kZXggLT0gcy0+bWF4X2J1Y2tldHM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCoqCitfYXJlZlNldF9sb29rdXBJbnNlcnQoIEFSZWZTZXQqICBzLCB2b2lkKiAgaXRlbSkKK3sKKyAgICB1aW50MzJfdCAgaGFzaCA9IF9hcmVmU2V0X2hhc2hJdGVtKGl0ZW0pOworICAgIHVuc2lnbmVkICBpbmRleCA9IGhhc2ggJiAocy0+bWF4X2J1Y2tldHMtMSk7CisgICAgdm9pZCoqICAgIGluc2VydCA9IE5VTEw7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHZvaWQqKiAgcG5vZGUgPSAmcy0+YnVja2V0c1tpbmRleF07CisKKyAgICAgICAgaWYgKCpwbm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zZXJ0ID8gaW5zZXJ0IDogcG5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoKnBub2RlID09IEFSRUZTRVRfREVMRVRFRCkgeworICAgICAgICAgICAgaWYgKCFpbnNlcnQpCisgICAgICAgICAgICAgICAgaW5zZXJ0ID0gcG5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoKnBub2RlID09IGl0ZW0pCisgICAgICAgICAgICByZXR1cm4gcG5vZGU7CisKKyAgICAgICAgaW5kZXggPSAoaW5kZXggKyBBUkVGU0VUX1NURVApICYgKHMtPm1heF9idWNrZXRzLTEpOworICAgIH0KK30KKworZXh0ZXJuIEFCb29sCithcmVmU2V0X2hhcyggQVJlZlNldCogIHMsIHZvaWQqICBpdGVtICkKK3sKKyAgICB2b2lkKiogIGxvb2t1cDsKKworICAgIGlmIChpdGVtID09IE5VTEwgfHwgcy0+bWF4X2J1Y2tldHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBsb29rdXAgPSBfYXJlZlNldF9sb29rdXAocywgaXRlbSk7CisgICAgcmV0dXJuICgqbG9va3VwID09IGl0ZW0pOworfQorCisvKiB0aGUgY29kZSBiZWxvdyBhc3N1bWVzLCBpbiB0aGUgY2FzZSBvZiBhIGRvd24tc2l6ZSwKKyAqIHRoYXQgdGhlcmUgYXJlbid0IHRvbyBtYW55IGl0ZW1zIGluIHRoZSBzZXQuCisgKi8KK3N0YXRpYyB2b2lkCitfYXJlZlNldF9yZXNpemUoIEFSZWZTZXQqICBzLCB1bnNpZ25lZCAgbmV3U2l6ZSApCit7CisgICAgQVJlZlNldCAgIG5ld1NldDsKKyAgICB1bnNpZ25lZCAgbm4sIGNvdW50ID0gcy0+bnVtX2J1Y2tldHM7CisKKyAgICBBVkVDVE9SX0lOSVRfQUxMT0MoJm5ld1NldCxidWNrZXRzLCBuZXdTaXplKTsKKworICAgIGZvciAobm4gPSAwOyBubiA8IHMtPm1heF9idWNrZXRzOyBubisrKSB7CisgICAgICAgIHZvaWQqICBpdGVtICA9IHMtPmJ1Y2tldHNbbm5dOworICAgICAgICBpZiAoaXRlbSAhPSBOVUxMICYmIGl0ZW0gIT0gQVJFRlNFVF9ERUxFVEVEKSB7CisgICAgICAgICAgICB2b2lkKiogbG9va3VwID0gX2FyZWZTZXRfbG9va3VwKCZuZXdTZXQsIGl0ZW0pOworICAgICAgICAgICAgKmxvb2t1cCA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVkVDVE9SX0RPTkUocyxidWNrZXRzKTsKKyAgICBzLT5idWNrZXRzICAgICA9IG5ld1NldC5idWNrZXRzOworICAgIHMtPm51bV9idWNrZXRzID0gY291bnQ7CisgICAgcy0+bWF4X2J1Y2tldHMgPSBuZXdTZXQubWF4X2J1Y2tldHM7Cit9CisKK2V4dGVybiB2b2lkCithcmVmU2V0X2FkZCggQVJlZlNldCogIHMsIHZvaWQqICBpdGVtICkKK3sKKyAgICB2b2lkKiogIGxvb2t1cDsKKworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFlvdSBjYW4ndCBhZGQgaXRlbXMgdG8gYSBzZXQgZHVyaW5nIGl0ZXJhdGlvbiEgKi8KKyAgICBBQVNTRVJUKHMtPml0ZXJhdGlvbiA9PSAwKTsKKworICAgIGlmIChzLT5tYXhfYnVja2V0cyA9PSAwKQorICAgICAgICBBVkVDVE9SX0lOSVRfQUxMT0MocyxidWNrZXRzLEFSRUZTRVRfSU5JVF9TSVpFKTsKKworICAgIGxvb2t1cCA9IF9hcmVmU2V0X2xvb2t1cEluc2VydChzLCBpdGVtKTsKKyAgICBpZiAoKmxvb2t1cCA9PSBpdGVtKQorICAgICAgICByZXR1cm47CisKKyAgICAqbG9va3VwID0gaXRlbTsKKyAgICBzLT5udW1fYnVja2V0cyArPSAxOworCisgICAgaWYgKHMtPml0ZXJhdGlvbiA9PSAwKSB7CisgICAgICAgIGlmIChzLT5udW1fYnVja2V0cyA+IHMtPm1heF9idWNrZXRzKjAuODUpCisgICAgICAgICAgICBfYXJlZlNldF9yZXNpemUocywgcy0+bWF4X2J1Y2tldHMqMik7CisgICAgfQorfQorCitleHRlcm4gdm9pZAorYXJlZlNldF9kZWwoIEFSZWZTZXQqICBzLCB2b2lkKiAgaXRlbSApCit7CisgICAgdm9pZCoqICBsb29rdXA7CisKKyAgICBpZiAoaXRlbSA9PSBOVUxMIHx8IHMtPm1heF9idWNrZXRzID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGxvb2t1cCA9IF9hcmVmU2V0X2xvb2t1cChzLCBpdGVtKTsKKyAgICBpZiAoKmxvb2t1cCAhPSBpdGVtKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocy0+aXRlcmF0aW9uID09IDApIHsKKyAgICAgICAgLyogZGlyZWN0IGRlbGV0aW9uICovCisgICAgICAgICpsb29rdXAgPSBOVUxMOworICAgICAgICBzLT5udW1fYnVja2V0cyAtPSAxOworICAgICAgICBpZiAocy0+bnVtX2J1Y2tldHMgPCBzLT5tYXhfYnVja2V0cyowLjI1KQorICAgICAgICAgICAgX2FyZWZTZXRfcmVzaXplKHMsIHMtPm1heF9idWNrZXRzLzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRlZmVycmVkIGRlbGV0aW9uICovCisgICAgICAgICpsb29rdXAgPSBBUkVGU0VUX0RFTEVURUQ7CisgICAgICAgIHMtPm51bV9idWNrZXRzIC09IDE7CisgICAgICAgIHMtPml0ZXJhdGlvbiAgIHw9IDE7CisgICAgfQorfQorCit2b2lkCitfYXJlZlNldF9yZW1vdmVEZWZlcnJlZCggQVJlZlNldCogIHMgKQoreworICAgIHVuc2lnbmVkIG5uLCBuZXdTaXplOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgcy0+bWF4X2J1Y2tldHM7IG5uKyspIHsKKyAgICAgICAgaWYgKHMtPmJ1Y2tldHNbbm5dID09IEFSRUZTRVRfREVMRVRFRCkgeworICAgICAgICAgICAgcy0+YnVja2V0c1tubl0gID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5pdGVyYXRpb24gPSAwOworCisgICAgbmV3U2l6ZSA9IHMtPm1heF9idWNrZXRzOworICAgIHdoaWxlIChzLT5udW1fYnVja2V0cyA8IG5ld1NpemUqMC4yNSkKKyAgICAgICAgbmV3U2l6ZSAvPSAyOworCisgICAgaWYgKG5ld1NpemUgPCBBUkVGU0VUX0lOSVRfU0laRSkKKyAgICAgICAgbmV3U2l6ZSA9IEFSRUZTRVRfSU5JVF9TSVpFOworICAgIGlmIChuZXdTaXplICE9IHMtPm1heF9idWNrZXRzKQorICAgICAgICBfYXJlZlNldF9yZXNpemUocywgbmV3U2l6ZSk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9yZWZzZXQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9yZWZzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNjZWVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3JlZnNldC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgPGFuZHJvaWQvdXRpbHMvdmVjdG9yLmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIHRoaXMgaW1wbGVtZW50cyBhIHNldCBvZiBhZGRyZXNzZXMgaW4gbWVtb3J5LgorICogTlVMTCBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBzZXQuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEFWRUNUT1JfREVDTCh2b2lkKixidWNrZXRzKTsKKyAgICBpbnQgaXRlcmF0aW9uOworfSBBUmVmU2V0OworCitBSU5MSU5FRCB2b2lkCithcmVmU2V0X2luaXQoIEFSZWZTZXQqICBzICkKK3sKKyAgICBBVkVDVE9SX0lOSVQocyxidWNrZXRzKTsKK30KKworQUlOTElORUQgdm9pZAorYXJlZlNldF9kb25lKCBBUmVmU2V0KiAgcyApCit7CisgICAgQVZFQ1RPUl9ET05FKHMsYnVja2V0cyk7Cit9CisKK0FJTkxJTkVEIHZvaWQKK2FyZWZTZXRfY2xlYXIoIEFSZWZTZXQqICBzICkKK3sKKyAgICBBVkVDVE9SX0NMRUFSKHMsYnVja2V0cyk7CisgICAgcy0+aXRlcmF0aW9uID0gMDsKK30KKworQUlOTElORUQgaW50CithcmVmU2V0X2NvdW50KCBBUmVmU2V0KiAgcyApCit7CisgICAgcmV0dXJuIChpbnQpIEFWRUNUT1JfU0laRShzLGJ1Y2tldHMpOworfQorCitleHRlcm4gQUJvb2wgIGFyZWZTZXRfaGFzKCBBUmVmU2V0KiAgcywgdm9pZCogIGl0ZW0gKTsKK2V4dGVybiB2b2lkICAgYXJlZlNldF9hZGQoIEFSZWZTZXQqICBzLCB2b2lkKiAgaXRlbSApOworZXh0ZXJuIHZvaWQgICBhcmVmU2V0X2RlbCggQVJlZlNldCogIHMsIHZvaWQqICBpdGVtICk7CisKK2V4dGVybiB2b2lkICAgX2FyZWZTZXRfcmVtb3ZlRGVmZXJyZWQoIEFSZWZTZXQqIHMgKTsKKworI2RlZmluZSAgQVJFRlNFVF9ERUxFVEVEICgodm9pZCopfihzaXplX3QpMCkKKworI2RlZmluZSAgQVJFRlNFVF9GT1JFQUNIKF9zZXQsX2l0ZW0sX3N0YXRlbWVudCkgXAorICAgIGRvIHsgXAorICAgICAgICBpbnQgIF9fcmVmc2V0X25uID0gMDsgXAorICAgICAgICBpbnQgIF9fcmVmc2V0X21heCA9IChfc2V0KS0+bWF4X2J1Y2tldHM7IFwKKyAgICAgICAgKF9zZXQpLT5pdGVyYXRpb24gKz0gMjsgXAorICAgICAgICBmb3IgKCA7IF9fcmVmc2V0X25uIDwgX19yZWZzZXRfbWF4OyBfX3JlZnNldF9ubisrICkgeyBcCisgICAgICAgICAgICB2b2lkKiAgX19yZWZzZXRfaXRlbSA9IChfc2V0KS0+YnVja2V0c1tfX3JlZnNldF9ubl07IFwKKyAgICAgICAgICAgIGlmIChfX3JlZnNldF9pdGVtID09IE5VTEwgfHwgX19yZWZzZXRfaXRlbSA9PSBBUkVGU0VUX0RFTEVURUQpIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgXAorICAgICAgICAgICAgX2l0ZW0gPSBfX3JlZnNldF9pdGVtOyBcCisgICAgICAgICAgICBfc3RhdGVtZW50OyBcCisgICAgICAgIH0gXAorICAgICAgICAoX3NldCktPml0ZXJhdGlvbiAtPSAyOyBcCisgICAgICAgIGlmICgoX3NldCktPml0ZXJhdGlvbiA9PSAxKSBcCisgICAgICAgICAgICBfYXJlZlNldF9yZW1vdmVEZWZlcnJlZChfc2V0KTsgXAorICAgIH0gd2hpbGUgKDApCisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NldGVudi5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NldGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMWI0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc2V0ZW52LmMKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX1dJTjMyCitpbnQgc2V0ZW52KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgb3ZlcndyaXRlKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIGlmIChvdmVyd3JpdGUgfHwgIWdldGVudihuYW1lKSkgeworICAgICAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgc3RybGVuKHZhbHVlKSArIDI7CisgICAgICAgIGNoYXIgKnN0cmluZyA9IG1hbGxvYyhsZW5ndGgpOworICAgICAgICBzbnByaW50ZihzdHJpbmcsIGxlbmd0aCwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXN1bHQgPSBwdXRlbnYoc3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc2V0ZW52LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc2V0ZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2NGFlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zZXRlbnYuaApAQCAtMCwwICsxLDI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCitleHRlcm4gdm9pZCBzZXRlbnYoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUsIGludCBvdmVyd3JpdGUpOworI2VuZGlmCisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldF9kcmFpbmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRfZHJhaW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkOWE5NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRfZHJhaW5lci5jcHAKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldF9kcmFpbmVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK25hbWVzcGFjZSB7CisKK3R5cGVkZWYgOjpMb29wZXIgQ0xvb3BlcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpiYXNlOjpMb29wZXIgQmFzZUxvb3BlcjsKKworYW5kcm9pZDo6YmFzZTo6U29ja2V0RHJhaW5lciAqc19zb2NrZXRfZHJhaW5lciA9IE5VTEw7CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIHNvY2tldF9kcmFpbmVyX3N0YXJ0KENMb29wZXIqIGxvb3BlcikgeworICAgIGlmICghbG9vcGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFzX3NvY2tldF9kcmFpbmVyKSB7CisgICAgICAgIHNfc29ja2V0X2RyYWluZXIgPSBuZXcgU29ja2V0RHJhaW5lcigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEJhc2VMb29wZXIqPihsb29wZXIpKTsKKyAgICB9Cit9CisKK3ZvaWQgc29ja2V0X2RyYWluZXJfZHJhaW5fYW5kX2Nsb3NlKGludCBzb2NrZXRGZCkgeworICAgIGlmIChzb2NrZXRGZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzb2NrZXRTZXROb25CbG9ja2luZyhzb2NrZXRGZCk7CisgICAgaWYgKHNfc29ja2V0X2RyYWluZXIpIHsKKyAgICAgICAgc19zb2NrZXRfZHJhaW5lci0+ZHJhaW5BbmRDbG9zZShzb2NrZXRGZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU29ja2V0RHJhaW5lcjo6ZHJhaW5BbmRDbG9zZUJsb2NraW5nKHNvY2tldEZkKTsKKyAgICB9Cit9CisKK3ZvaWQgc29ja2V0X2RyYWluZXJfc3RvcCgpIHsKKyAgICBpZiAoc19zb2NrZXRfZHJhaW5lcikgeworICAgICAgICBkZWxldGUgc19zb2NrZXRfZHJhaW5lcjsKKyAgICAgICAgc19zb2NrZXRfZHJhaW5lciA9IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldF9kcmFpbmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc29ja2V0X2RyYWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNiMzc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldF9kcmFpbmVyLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmFnZSBncmFjZWZ1bCBjbG9zZSBvZiBzb2NrZXRzCisvLyBhcyBkZXNjcmliZWQgYnkgIlRoZSB1bHRpbWF0ZSBTT19MSU5HRVIgcGFnZSIgWzFdLCB3aGljaCByZXF1aXJlcworLy8gc2V2ZXJhbCBzdGVwcyB0byBkbyBwcm9wZXJseS4KKy8vCisvLyBUaGlzIGlzIHJlYWxseSBhIEMgd3JhcHBlciBhcm91bmQgYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0RHJhaW5lci5oCisvLyBTZWUgdGhlIGNvbW1lbnRzIGluIHRoYXQgaGVhZGVyIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gVG8gdXNlIHRoaXMgaGVhZGVyIGZyb20gQyBjb2RlLCBjYWxsIHRoZSBmb2xsb3dpbmcgYWZ0ZXIgY3JlYXRpbmcgYQorLy8gbG9vcGVyOgorLy8KKy8vICAgICBzb2NrZXRfZHJhaW5lcl9zdGFydChsb29wZXIpOworLy8KKy8vIFdoZW4gYSBzb2NrZXQgbmVlZHMgdG8gYmUgZ3JhY2VmdWxseSBjbG9zZWQsIGNhbGwgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgICAgc29ja2V0X2RyYWluZXJfZHJhaW5fYW5kX2Nsb3NlKHNvY2tldF9mZCk7CisvLworLy8gQWZ0ZXIgdGhlIGxvb3BlciBydW4gY29tcGxldGVzLCBjYWxsIHRoZSBmb2xsb3dpbmc6CisvLworLy8gICAgIHNvY2tldF9kcmFpbmVyX3N0b3AoKTsKKy8vCisvLyBOb3RlOiBzb2NrZXRfZHJhaW5lcl9kcmFpbl9hbmRfY2xvc2UoKSBjYW4gYmUgY2FsbGVkIGJlZm9yZQorLy8gc29ja2V0X2RyYWluZXJfc3RhcnQoKSBvciBhZnRlciBzb2NrZXRfZHJhaW5lcl9zdG9wKCkuIEluIHRob3NlIGNhc2VzCisvLyB0aGUgc29ja2V0IGlzIHNpbXBseSBzaHV0ZG93biBhbmQgY2xvc2VkIHdpdGhvdXQgcmVjZWl2aW5nIGFsbCBwZW5kaW5nCisvLyBkYXRhLgorCit2b2lkIHNvY2tldF9kcmFpbmVyX3N0YXJ0KExvb3BlciogbG9vcGVyKTsKK3ZvaWQgc29ja2V0X2RyYWluZXJfZHJhaW5fYW5kX2Nsb3NlKGludCBzb2NrZXRfZmQpOwordm9pZCBzb2NrZXRfZHJhaW5lcl9zdG9wKCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldHMuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmNDExZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRzLmMKQEAgLTAsMCArMSwxNjI1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaWZkZWYgX19saW51eF9fIC8qIFJlY2VudCB2ZXJzaW9ucyBvZiBnbGliYyBvbmx5IGRlZmluZSBFQUlfTk9EQVRBLCB3aGljaCBpcyBhbgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24gdG8gdGhlIFBPU0lYIHN0YW5kYXJkLCBpZiBfR05VX1NPVVJDRSBpcyBkZWZpbmVkLiAqLworIyAgZGVmaW5lIF9HTlVfU09VUkNFIDEKKyNlbmRpZgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9taXNjLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRfZHJhaW5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKy8vI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSAgRCguLi4pIFZFUkJPU0VfUFJJTlQoc29ja2V0LF9fVkFfQVJHU19fKQorCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgeHhXSU4zMl9MRUFOX0FORF9NRUFOCisjICBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyNlbHNlIC8qICFfV0lOMzIgKi8KKyMgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorIyAgaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyMgIGluY2x1ZGUgPG5ldGRiLmg+CisjICBpZiBIQVZFX1VOSVhfU09DS0VUUworIyAgICBpbmNsdWRlIDxzeXMvdW4uaD4KKyMgICAgaWZuZGVmIFVOSVhfUEFUSF9NQVgKKyMgICAgICBkZWZpbmUgIFVOSVhfUEFUSF9NQVggIChzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfdW4qKTApLT5zdW5fcGF0aCktMSkKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYgLyogIV9XSU4zMiAqLworCisKKworLyogUVNPQ0tFVF9DQUxMIGlzIHVzZWQgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgRUlOVFIgaGFwcGVucyBwcmV0dHkKKyAqIGVhc2lseSBpbiBRRU1VIHNpbmNlIHdlIHVzZSBTSUdBTFJNIHRvIGltcGxlbWVudCBwZXJpb2RpYyB0aW1lcnMKKyAqLworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lICBRU09DS0VUX0NBTEwoX3JldCxfY21kKSAgIFwKKyAgICBkbyB7IF9yZXQgPSAoX2NtZCk7IH0gd2hpbGUgKCBfcmV0IDwgMCAmJiBXU0FHZXRMYXN0RXJyb3IoKSA9PSBXU0FFSU5UUiApCisjZWxzZQorIyAgZGVmaW5lICBRU09DS0VUX0NBTEwoX3JldCxfY21kKSAgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgZXJybm8gPSAwOyBcCisgICAgICAgIF9yZXQgPSBIQU5ETEVfRUlOVFIoX2NtZCk7IFwKKyAgICB9IHdoaWxlICgwKTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCitzdGF0aWMgaW50ICB3aW5zb2NrX2Vycm9yOworCisjZGVmaW5lICBXSU5TT0NLX0VSUk9SU19MSVNUIFwKKyAgICBFRShXU0FfSU5WQUxJRF9IQU5ETEUsRUlOVkFMLCJpbnZhbGlkIGhhbmRsZSIpIFwKKyAgICBFRShXU0FfTk9UX0VOT1VHSF9NRU1PUlksRU5PTUVNLCJub3QgZW5vdWdoIG1lbW9yeSIpIFwKKyAgICBFRShXU0FfSU5WQUxJRF9QQVJBTUVURVIsRUlOVkFMLCJpbnZhbGlkIHBhcmFtZXRlciIpIFwKKyAgICBFRShXU0FFSU5UUixFSU5UUiwiaW50ZXJydXB0ZWQgZnVuY3Rpb24gY2FsbCIpIFwKKyAgICBFRShXU0FFQUxSRUFEWSxFQUxSRUFEWSwib3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSBcCisgICAgRUUoV1NBRUJBREYsRUJBREYsImJhZCBmaWxlIGRlc2NyaXB0b3IiKSBcCisgICAgRUUoV1NBRUFDQ0VTLEVBQ0NFUywicGVybWlzc2lvbiBkZW5pZWQiKSBcCisgICAgRUUoV1NBRUZBVUxULEVGQVVMVCwiYmFkIGFkZHJlc3MiKSBcCisgICAgRUUoV1NBRUlOVkFMLEVJTlZBTCwiaW52YWxpZCBhcmd1bWVudCIpIFwKKyAgICBFRShXU0FFTUZJTEUsRU1GSUxFLCJ0b28gbWFueSBvcGVuZWQgZmlsZXMiKSBcCisgICAgRUUoV1NBRVdPVUxEQkxPQ0ssRVdPVUxEQkxPQ0ssInJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIikgXAorICAgIEVFKFdTQUVJTlBST0dSRVNTLEVJTlBST0dSRVNTLCJvcGVyYXRpb24gbm93IGluIHByb2dyZXNzIikgXAorICAgIEVFKFdTQUVBTFJFQURZLEVBR0FJTiwib3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSBcCisgICAgRUUoV1NBRU5PVFNPQ0ssRUJBREYsInNvY2tldCBvcGVyYXRpb24gbm90IG9uIHNvY2tldCIpIFwKKyAgICBFRShXU0FFREVTVEFERFJSRVEsRURFU1RBRERSUkVRLCJkZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIikgXAorICAgIEVFKFdTQUVNU0dTSVpFLEVNU0dTSVpFLCJtZXNzYWdlIHRvbyBsb25nIikgXAorICAgIEVFKFdTQUVQUk9UT1RZUEUsRVBST1RPVFlQRSwid3JvbmcgcHJvdG9jb2wgdHlwZSBmb3Igc29ja2V0IikgXAorICAgIEVFKFdTQUVOT1BST1RPT1BULEVOT1BST1RPT1BULCJiYWQgcHJvdG9jb2wgb3B0aW9uIikgXAorICAgIEVFKFdTQUVBRERSSU5VU0UsRUFERFJJTlVTRSwiYWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpIFwKKyAgICBFRShXU0FFQUREUk5PVEFWQUlMLEVBRERSTk9UQVZBSUwsImNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKSBcCisgICAgRUUoV1NBRU5FVERPV04sRU5FVERPV04sIm5ldHdvcmsgaXMgZG93biIpIFwKKyAgICBFRShXU0FFTkVUVU5SRUFDSCxFTkVUVU5SRUFDSCwibmV0d29yayB1bnJlYWNoYWJsZSIpIFwKKyAgICBFRShXU0FFTkVUUkVTRVQsRU5FVFJFU0VULCJuZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldCIpIFwKKyAgICBFRShXU0FFQ09OTkFCT1JURUQsRUNPTk5BQk9SVEVELCJzb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpIFwKKyAgICBFRShXU0FFQ09OTlJFU0VULEVDT05OUkVTRVQsImNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpIFwKKyAgICBFRShXU0FFTk9CVUZTLEVOT0JVRlMsIm5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKSBcCisgICAgRUUoV1NBRUlTQ09OTixFSVNDT05OLCJzb2NrZXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKSBcCisgICAgRUUoV1NBRU5PVENPTk4sRU5PVENPTk4sInNvY2tldCBpcyBub3QgY29ubmVjdGVkIikgXAorICAgIEVFKFdTQUVTSFVURE9XTixFU0hVVERPV04sImNhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93biIpIFwKKyAgICBFRShXU0FFVE9PTUFOWVJFRlMsRVRPT01BTllSRUZTLCJ0b28gbWFueSByZWZlcmVuY2VzIikgXAorICAgIEVFKFdTQUVUSU1FRE9VVCxFVElNRURPVVQsImNvbm5lY3Rpb24gdGltZWQgb3V0IikgXAorICAgIEVFKFdTQUVDT05OUkVGVVNFRCxFQ09OTlJFRlVTRUQsImNvbm5lY3Rpb24gcmVmdXNlZCIpIFwKKyAgICBFRShXU0FFTE9PUCxFTE9PUCwiY2Fubm90IHRyYW5zbGF0ZSBuYW1lIikgXAorICAgIEVFKFdTQUVOQU1FVE9PTE9ORyxFTkFNRVRPT0xPTkcsIm5hbWUgdG9vIGxvbmciKSBcCisgICAgRUUoV1NBRUhPU1RET1dOLEVIT1NURE9XTiwiaG9zdCBpcyBkb3duIikgXAorICAgIEVFKFdTQUVIT1NUVU5SRUFDSCxFSE9TVFVOUkVBQ0gsIm5vIHJvdXRlIHRvIGhvc3QiKSBcCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgICAgICAgd2luc29jazsKKyAgICBpbnQgICAgICAgICAgdW5peDsKKyAgICBjb25zdCBjaGFyKiAgc3RyaW5nOworfSBXaW5zb2NrRXJyb3I7CisKK3N0YXRpYyBjb25zdCBXaW5zb2NrRXJyb3IgIF93aW5zb2NrX2Vycm9yc1tdID0geworI2RlZmluZSAgRUUodyx1LHMpICAgeyB3LCB1LCBzIH0sCisgICAgV0lOU09DS19FUlJPUlNfTElTVAorI3VuZGVmICAgRUUKKyAgICB7IC0xLCAtMSwgTlVMTCB9Cit9OworCisvKiB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBsYXRlc3Qgd2luc29jayBlcnJvciBjb2RlIGFuZCB1cGRhdGVzCisgKiBlcnJubyB0byBhIG1hdGNoaW5nIHZhbHVlLiBJdCBhbHNvIHJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZgorICogZXJybm8uCisgKi8KK3N0YXRpYyBpbnQKK2ZpeF9lcnJubyggdm9pZCApCit7CisgICAgY29uc3QgV2luc29ja0Vycm9yKiAgd2VyciA9IF93aW5zb2NrX2Vycm9yczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICB1bml4ID0gRUlOVkFMOyAgLyogZ2VuZXJpYyBlcnJvciBjb2RlICovCisKKyAgICB3aW5zb2NrX2Vycm9yID0gV1NBR2V0TGFzdEVycm9yKCk7CisKKyAgICBmb3IgKCA7IHdlcnItPnN0cmluZyAhPSBOVUxMOyB3ZXJyKysgKSB7CisgICAgICAgIGlmICh3ZXJyLT53aW5zb2NrID09IHdpbnNvY2tfZXJyb3IpIHsKKyAgICAgICAgICAgIHVuaXggPSB3ZXJyLT51bml4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJybm8gPSB1bml4OworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludAorc2V0X2Vycm5vKCBpbnQgIGNvZGUgKQoreworICAgIHdpbnNvY2tfZXJyb3IgPSAtMTsKKyAgICBlcnJubyAgICAgICAgID0gY29kZTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBsYXRlc3QgV2luc29jayBlcnJvciAqLworY29uc3QgY2hhcioKK19lcnJub19zdHIodm9pZCkKK3sKKyAgICBjb25zdCBXaW5zb2NrRXJyb3IqICB3ZXJyICAgPSBfd2luc29ja19lcnJvcnM7CisgICAgY29uc3QgY2hhciogICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKworICAgIGZvciAoIDsgd2Vyci0+c3RyaW5nOyB3ZXJyKysgKSB7CisgICAgICAgIGlmICh3ZXJyLT53aW5zb2NrID09IHdpbnNvY2tfZXJyb3IpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHdlcnItPnN0cmluZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IHRlbXBzdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiVW5rb3duIHNvY2tldCBlcnJvciAoV2luc29jaz0weCUwOHgpIGVycm5vPSVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIHdpbnNvY2tfZXJyb3IsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorI2Vsc2UKK3N0YXRpYyBpbnQKK2ZpeF9lcnJubyggdm9pZCApCit7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitzZXRfZXJybm8oIGludCAgY29kZSApCit7CisgICAgZXJybm8gPSBjb2RlOworICAgIHJldHVybiAtMTsKK30KKyNlbmRpZgorCisvKiBzb2NrZXQgdHlwZXMgKi8KKworc3RhdGljIGludAorc29ja2V0X2ZhbWlseV90b19ic2QoIFNvY2tldEZhbWlseSAgZmFtaWx5ICkKK3sKKyAgICBzd2l0Y2ggKGZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6IHJldHVybiBBRl9JTkVUOworICAgIGNhc2UgU09DS0VUX0lONjogIHJldHVybiBBRl9JTkVUNjsKKyNpZiBIQVZFX1VOSVhfU09DS0VUUworICAgIGNhc2UgU09DS0VUX1VOSVg6IHJldHVybiBBRl9MT0NBTDsKKyNlbmRpZgorICAgIGRlZmF1bHQ6IHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3NvY2tldF90eXBlX3RvX2JzZCggU29ja2V0VHlwZSAgdHlwZSApCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU09DS0VUX0RHUkFNOiAgcmV0dXJuIFNPQ0tfREdSQU07CisgICAgICAgIGNhc2UgU09DS0VUX1NUUkVBTTogcmV0dXJuIFNPQ0tfU1RSRUFNOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBTb2NrZXRUeXBlCitzb2NrZXRfdHlwZV9mcm9tX2JzZCggaW50ICB0eXBlICkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTT0NLX0RHUkFNOiAgcmV0dXJuIFNPQ0tFVF9ER1JBTTsKKyAgICAgICAgY2FzZSBTT0NLX1NUUkVBTTogcmV0dXJuIFNPQ0tFVF9TVFJFQU07CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgIHJldHVybiAoU29ja2V0VHlwZSkgU09DS0VUX1VOU1BFQzsKKyAgICB9Cit9CisKKyNpZiAwCitzdGF0aWMgaW50Citzb2NrZXRfdHlwZV9jaGVjayggU29ja2V0VHlwZSAgdHlwZSApCit7CisgICAgcmV0dXJuICh0eXBlID09IFNPQ0tFVF9ER1JBTSB8fCB0eXBlID09IFNPQ0tFVF9TVFJFQU0pOworfQorI2VuZGlmCisKK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCBzb2NrYWRkciAgICAgc2FbMV07CisgICAgc3RydWN0IHNvY2thZGRyX2luICBpblsxXTsKKyNpZiBIQVZFX0lONl9TT0NLRVRTCisgICAgc3RydWN0IHNvY2thZGRyX2luNiBpbjZbMV07CisjZW5kaWYKKyNpZiBIQVZFX1VOSVhfU09DS0VUUworICAgIHN0cnVjdCBzb2NrYWRkcl91biAgdW5bMV07CisjZW5kaWYKK30gc29ja2FkZHJfc3RvcmFnZTsKKworLyogc29ja2V0IGFkZHJlc3NlcyAqLworCit2b2lkCitzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KCBTb2NrQWRkcmVzcyogIGEsIHVpbnQzMl90ICBpcCwgdWludDE2X3QgIHBvcnQgKQoreworICAgIGEtPmZhbWlseSAgICAgICAgID0gU09DS0VUX0lORVQ7CisgICAgYS0+dS5pbmV0LnBvcnQgICAgPSBwb3J0OworICAgIGEtPnUuaW5ldC5hZGRyZXNzID0gaXA7Cit9CisKK3ZvaWQKK3NvY2tfYWRkcmVzc19pbml0X2luNiAoIFNvY2tBZGRyZXNzKiAgYSwgY29uc3QgdWludDhfdCBpcDZbMTZdLCB1aW50MTZfdCAgcG9ydCApCit7CisgICAgYS0+ZmFtaWx5ID0gU09DS0VUX0lONjsKKyAgICBhLT51LmluNi5wb3J0ID0gcG9ydDsKKyAgICBtZW1jcHkoIGEtPnUuaW42LmFkZHJlc3MsIGlwNiwgc2l6ZW9mKGEtPnUuaW42LmFkZHJlc3MpICk7Cit9CisKK3ZvaWQKK3NvY2tfYWRkcmVzc19pbml0X2luNl9sb29wYmFjayggU29ja0FkZHJlc3MqIGEsIHVpbnQxNl90IHBvcnQgKQoreworICAgIC8vIFRoZSA6OjEgSVB2NiBhZGRyZXNzIGFzIGEgMTYtYnl0ZSBhcnJheS4KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrTG9vcGJhY2tbMTZdID0geyAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwxIH07CisgICAgc29ja19hZGRyZXNzX2luaXRfaW42KGEsIGtMb29wYmFjaywgcG9ydCk7Cit9CisKK3ZvaWQKK3NvY2tfYWRkcmVzc19pbml0X3VuaXgoIFNvY2tBZGRyZXNzKiAgYSwgY29uc3QgY2hhciogIHBhdGggKQoreworICAgIGEtPmZhbWlseSAgICAgICA9IFNPQ0tFVF9VTklYOworICAgIGEtPnUuX3VuaXgucGF0aCAgPSBzdHJkdXAocGF0aCA/IHBhdGggOiAiIik7CisgICAgYS0+dS5fdW5peC5vd25lciA9IDE7Cit9CisKK3ZvaWQgIHNvY2tfYWRkcmVzc19kb25lKCBTb2NrQWRkcmVzcyogIGEgKQoreworICAgIGlmIChhLT5mYW1pbHkgPT0gU09DS0VUX1VOSVggJiYgYS0+dS5fdW5peC5vd25lcikgeworICAgICAgICBhLT51Ll91bml4Lm93bmVyID0gMDsKKyAgICAgICAgZnJlZSgoY2hhciopYS0+dS5fdW5peC5wYXRoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyKgorZm9ybWF0X2NoYXIoIGNoYXIqICBidWYsIGNoYXIqICBlbmQsIGludCAgYyApCit7CisgICAgaWYgKGJ1ZiA8IGVuZCkgeworICAgICAgICBpZiAoYnVmKzEgPT0gZW5kKSB7CisgICAgICAgICAgICAqYnVmKysgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZisrID0gKGNoYXIpIGM7CisgICAgICAgICAgICAqYnVmICAgID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhcioKK2Zvcm1hdF9zdHIoIGNoYXIqICBidWYsIGNoYXIqICBlbmQsIGNvbnN0IGNoYXIqICBzdHIgKQoreworICAgIGludCAgbGVuICAgPSBzdHJsZW4oc3RyKTsKKyAgICBpbnQgIGF2YWlsID0gZW5kIC0gYnVmOworCisgICAgaWYgKGxlbiA+IGF2YWlsKQorICAgICAgICBsZW4gPSBhdmFpbDsKKworICAgIG1lbWNweSggYnVmLCBzdHIsIGxlbiApOworICAgIGJ1ZiArPSBsZW47CisKKyAgICBpZiAoYnVmID09IGVuZCkKKyAgICAgICAgYnVmWy0xXSA9IDA7CisgICAgZWxzZQorICAgICAgICBidWZbMF0gPSAwOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGNoYXIqCitmb3JtYXRfdW5zaWduZWQoIGNoYXIqICBidWYsIGNoYXIqICBlbmQsIHVuc2lnbmVkICB2YWwgKQoreworICAgIGNoYXIgIHRlbXBbMTZdOworICAgIGludCAgIG5uOworCisgICAgZm9yICggbm4gPSAwOyB2YWwgIT0gMDsgbm4rKyApIHsKKyAgICAgICAgaW50ICByZW0gPSB2YWwgJSAxMDsKKyAgICAgICAgdGVtcFtubl0gPSAnMCcrcmVtOworICAgICAgICB2YWwgLz0gMTA7CisgICAgfQorCisgICAgaWYgKG5uID09IDApCisgICAgICAgIHRlbXBbbm4rK10gPSAnMCc7CisKKyAgICB3aGlsZSAobm4gPiAwKQorICAgICAgICBidWYgPSBmb3JtYXRfY2hhcihidWYsIGVuZCwgdGVtcFstLW5uXSk7CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhcioKK2Zvcm1hdF9pcDQoIGNoYXIqICBidWYsIGNoYXIqICBlbmQsIHVpbnQzMl90ICBpcCApCit7CisgICAgYnVmID0gZm9ybWF0X3Vuc2lnbmVkKCBidWYsIGVuZCwgKHVuc2lnbmVkKShpcCA+PiAyNCkgKTsKKyAgICBidWYgPSBmb3JtYXRfY2hhciggYnVmLCBlbmQsICcuJyk7CisgICAgYnVmID0gZm9ybWF0X3Vuc2lnbmVkKCBidWYsIGVuZCwgKHVuc2lnbmVkKSgoaXAgPj4gMTYpICYgMjU1KSk7CisgICAgYnVmID0gZm9ybWF0X2NoYXIoIGJ1ZiwgZW5kLCAnLicpOworICAgIGJ1ZiA9IGZvcm1hdF91bnNpZ25lZCggYnVmLCBlbmQsICh1bnNpZ25lZCkoKGlwID4+IDgpICYgMjU1KSk7CisgICAgYnVmID0gZm9ybWF0X2NoYXIoIGJ1ZiwgZW5kLCAnLicpOworICAgIGJ1ZiA9IGZvcm1hdF91bnNpZ25lZCggYnVmLCBlbmQsICh1bnNpZ25lZCkoaXAgJiAyNTUpKTsKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhcioKK2Zvcm1hdF9pcDYoIGNoYXIqICBidWYsIGNoYXIqICBlbmQsIGNvbnN0IHVpbnQ4X3QqICBpcDYgKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgc2FbMV07CisgICAgbWVtc2V0KHNhLCAwLCBzaXplb2Yoc2EpKTsKKyAgICBzYS0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICBtZW1jcHkoc2EtPnNpbjZfYWRkci5zNl9hZGRyLCBpcDYsIDE2KTsKKyAgICBpZiAoZ2V0bmFtZWluZm8oKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKXNhLCBzaXplb2Yoc2EpLCBidWYsIGVuZCAtIGJ1ZiwgTlVMTCwgMCwgTklfTlVNRVJJQ0hPU1QpKQorICAgICAgICByZXR1cm4gYnVmOworICAgIGNoYXIqIHB0ciA9IG1lbWNocihidWYsIDAsIGVuZCAtIGJ1Zik7CisgICAgYXNzZXJ0KHB0ciAhPSBOVUxMKTsKKyAgICByZXR1cm4gcHRyOworfQorCitjb25zdCBjaGFyKgorc29ja19hZGRyZXNzX3RvX3N0cmluZyggY29uc3QgU29ja0FkZHJlc3MqICBhICkKK3sKKyAgICBzdGF0aWMgY2hhciBidWYwW01BWF9QQVRIXTsKKyAgICBjaGFyICpidWYgPSBidWYwLCAqZW5kID0gYnVmICsgc2l6ZW9mKGJ1ZjApOworCisgICAgc3dpdGNoIChhLT5mYW1pbHkpIHsKKyAgICBjYXNlIFNPQ0tFVF9JTkVUOgorICAgICAgICBidWYgPSBmb3JtYXRfaXA0KCBidWYsIGVuZCwgYS0+dS5pbmV0LmFkZHJlc3MgKTsKKyAgICAgICAgYnVmID0gZm9ybWF0X2NoYXIoIGJ1ZiwgZW5kLCAnOicgKTsKKyAgICAgICAgYnVmID0gZm9ybWF0X3Vuc2lnbmVkKCBidWYsIGVuZCwgKHVuc2lnbmVkKSBhLT51LmluZXQucG9ydCApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU09DS0VUX0lONjoKKyAgICAgICAgYnVmID0gZm9ybWF0X2NoYXIoIGJ1ZiwgZW5kLCAnWycpOworICAgICAgICBidWYgPSBmb3JtYXRfaXA2KCBidWYsIGVuZCwgYS0+dS5pbjYuYWRkcmVzcyApOworICAgICAgICBidWYgPSBmb3JtYXRfY2hhciggYnVmLCBlbmQsICddJyk7CisgICAgICAgIGJ1ZiA9IGZvcm1hdF9jaGFyKCBidWYsIGVuZCwgJzonICk7CisgICAgICAgIGJ1ZiA9IGZvcm1hdF91bnNpZ25lZCggYnVmLCBlbmQsICh1bnNpZ25lZCkgYS0+dS5pbjYucG9ydCApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU09DS0VUX1VOSVg6CisgICAgICAgIGJ1ZiA9IGZvcm1hdF9zdHIoIGJ1ZiwgZW5kLCBhLT51Ll91bml4LnBhdGggKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmMDsKK30KKworaW50Citzb2NrX2FkZHJlc3NfZXF1YWwoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSwgY29uc3QgU29ja0FkZHJlc3MqICBiICkKK3sKKyAgICBpZiAoYS0+ZmFtaWx5ICE9IGItPmZhbWlseSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2ggKGEtPmZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6CisgICAgICAgIHJldHVybiAoYS0+dS5pbmV0LmFkZHJlc3MgPT0gYi0+dS5pbmV0LmFkZHJlc3MgJiYKKyAgICAgICAgICAgICAgICBhLT51LmluZXQucG9ydCAgICA9PSBiLT51LmluZXQucG9ydCk7CisKKyAgICBjYXNlIFNPQ0tFVF9JTjY6CisgICAgICAgIHJldHVybiAoIW1lbWNtcChhLT51LmluNi5hZGRyZXNzLCBiLT51LmluNi5hZGRyZXNzLCAxNikgJiYKKyAgICAgICAgICAgICAgICBhLT51LmluNi5wb3J0ID09IGItPnUuaW42LnBvcnQpOworCisgICAgY2FzZSBTT0NLRVRfVU5JWDoKKyAgICAgICAgcmV0dXJuICghc3RyY21wKGEtPnUuX3VuaXgucGF0aCwgYi0+dS5fdW5peC5wYXRoKSk7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK2ludAorc29ja19hZGRyZXNzX2dldF9wb3J0KCBjb25zdCBTb2NrQWRkcmVzcyogIGEgKQoreworICAgIHN3aXRjaCAoYS0+ZmFtaWx5KSB7CisgICAgY2FzZSBTT0NLRVRfSU5FVDoKKyAgICAgICAgcmV0dXJuIGEtPnUuaW5ldC5wb3J0OworICAgIGNhc2UgU09DS0VUX0lONjoKKyAgICAgICAgcmV0dXJuIGEtPnUuaW42LnBvcnQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwordm9pZAorc29ja19hZGRyZXNzX3NldF9wb3J0KCBTb2NrQWRkcmVzcyogIGEsIHVpbnQxNl90ICBwb3J0ICkKK3sKKyAgICBzd2l0Y2ggKGEtPmZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6CisgICAgICAgIGEtPnUuaW5ldC5wb3J0ID0gcG9ydDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTT0NLRVRfSU42OgorICAgICAgICBhLT51LmluNi5wb3J0ID0gcG9ydDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgOworICAgIH0KK30KKworY29uc3QgY2hhcioKK3NvY2tfYWRkcmVzc19nZXRfcGF0aCggY29uc3QgU29ja0FkZHJlc3MqICBhICkKK3sKKyAgICBpZiAoYS0+ZmFtaWx5ID09IFNPQ0tFVF9VTklYKQorICAgICAgICByZXR1cm4gYS0+dS5fdW5peC5wYXRoOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludAorc29ja19hZGRyZXNzX2dldF9pcCggY29uc3QgU29ja0FkZHJlc3MqICBhICkKK3sKKyAgICBpZiAoYS0+ZmFtaWx5ID09IFNPQ0tFVF9JTkVUKQorICAgICAgICByZXR1cm4gYS0+dS5pbmV0LmFkZHJlc3M7CisKKyAgICByZXR1cm4gLTE7Cit9CisKKyNpZiAwCitjaGFyKgorYnVmcHJpbnRfc29ja19hZGRyZXNzKCBjaGFyKiAgcCwgY2hhciogIGVuZCwgY29uc3QgU29ja0FkZHJlc3MqICBhICkKK3sKKyAgICBzd2l0Y2ggKGEtPmZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICBpcCA9IGEtPnUuaW5ldC5hZGRyZXNzOworCisgICAgICAgICAgICByZXR1cm4gYnVmcHJpbnQoIHAsIGVuZCwgIiVkLiVkLiVkLiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gMjQpICYgMjU1LCAoaXAgPj4gMTYpICYgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpcCA+PiA4KSAmIDI1NSwgaXAgJiAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYS0+dS5pbmV0LnBvcnQgKTsKKyAgICAgICAgfQorICAgIGNhc2UgU09DS0VUX0lONjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG5uICAgICA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgY29sdW1uID0gIiI7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiAgdGFiICAgID0gYS0+dS5pbjYuYWRkcmVzczsKKyAgICAgICAgICAgIGZvciAobm4gPSAwOyBubiA8IDE2OyBubiArPSAyKSB7CisgICAgICAgICAgICAgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiVzJTA0eCIsIGNvbHVtbiwgKHRhYltuXSA8PCA4KSB8IHRhYltuKzFdKTsKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSAiOiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVmcHJpbnQocCwgZW5kLCAiOiVkIiwgYS0+dS5pbjYucG9ydCk7CisgICAgICAgIH0KKyAgICBjYXNlIFNPQ0tFVF9VTklYOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmcHJpbnQocCwgZW5kLCAiJXMiLCBhLT51Ll91bml4LnBhdGgpOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3NvY2tfYWRkcmVzc190b19ic2QoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSwgc29ja2FkZHJfc3RvcmFnZSogIHBhZGRyZXNzLCBzb2NrbGVuX3QgICpwc2l6ZSApCit7CisgICAgc3dpdGNoIChhLT5mYW1pbHkpIHsKKyAgICBjYXNlIFNPQ0tFVF9JTkVUOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4qICBkc3QgPSBwYWRkcmVzcy0+aW47CisKKyAgICAgICAgICAgICpwc2l6ZSA9IHNpemVvZigqZHN0KTsKKworICAgICAgICAgICAgbWVtc2V0KCBwYWRkcmVzcywgMCwgKnBzaXplICk7CisKKyAgICAgICAgICAgIGRzdC0+c2luX2ZhbWlseSAgICAgID0gQUZfSU5FVDsKKyAgICAgICAgICAgIGRzdC0+c2luX3BvcnQgICAgICAgID0gaHRvbnMoYS0+dS5pbmV0LnBvcnQpOworICAgICAgICAgICAgZHN0LT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChhLT51LmluZXQuYWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBIQVZFX0lONl9TT0NLRVRTCisgICAgY2FzZSBTT0NLRVRfSU42OgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiAgZHN0ID0gcGFkZHJlc3MtPmluNjsKKworICAgICAgICAgICAgKnBzaXplID0gc2l6ZW9mKCpkc3QpOworCisgICAgICAgICAgICBtZW1zZXQoIHBhZGRyZXNzLCAwLCAqcHNpemUgKTsKKworICAgICAgICAgICAgZHN0LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICAgICAgZHN0LT5zaW42X3BvcnQgICA9IGh0b25zKGEtPnUuaW42LnBvcnQpOworICAgICAgICAgICAgbWVtY3B5KCBkc3QtPnNpbjZfYWRkci5zNl9hZGRyLCBhLT51LmluNi5hZGRyZXNzLCAxNiApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIEhBVkVfSU42X1NPQ0tFVFMgKi8KKworI2lmIEhBVkVfVU5JWF9TT0NLRVRTCisgICAgY2FzZSBTT0NLRVRfVU5JWDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgc2xlbiA9IHN0cmxlbihhLT51Ll91bml4LnBhdGgpOworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuKiAgZHN0ID0gcGFkZHJlc3MtPnVuOworCisgICAgICAgICAgICBpZiAoc2xlbiA+PSBVTklYX1BBVEhfTUFYKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgbWVtc2V0KCBkc3QsIDAsIHNpemVvZigqZHN0KSApOworCisgICAgICAgICAgICBkc3QtPnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgICAgICAgICAgIG1lbWNweSggZHN0LT5zdW5fcGF0aCwgYS0+dS5fdW5peC5wYXRoLCBzbGVuICk7CisgICAgICAgICAgICBkc3QtPnN1bl9wYXRoW3NsZW5dID0gMDsKKworICAgICAgICAgICAgKnBzaXplID0gKGNoYXIqKSZkc3QtPnN1bl9wYXRoW3NsZW4gKyAxXSAtIChjaGFyKilkc3Q7CisjaWZkZWYgX19saW51eF9fCisgICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBMaW51eCBhYnN0cmFjdCBzb2NrZXQgbmFtZXNwYWNlCisgICAgICAgICAgICBpZiAoZHN0LT5zdW5fcGF0aFswXSA9PSAnQCcpIHsKKyAgICAgICAgICAgICAgICBkc3QtPnN1bl9wYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAqcHNpemUgLT0xOyAgLy8gdHJhaWxpbmcgemVybyBpcyBub3QgcGFydCBvZiB0aGUgYWJzdHJhY3QgbmFtZS4KKyAgICAgICAgICAgIH0KKyNlbmRpZiAgLy8gX19saW51eF9fCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogSEFWRV9VTklYX1NPQ0tFVFMgKi8KKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzZXRfZXJybm8oRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc29ja19hZGRyZXNzX2Zyb21fYnNkKCBTb2NrQWRkcmVzcyogIGEsIGNvbnN0IHZvaWQqICBmcm9tLCBzaXplX3QgIGZyb21sZW4gKQoreworICAgIHN3aXRjaCAoKChzdHJ1Y3Qgc29ja2FkZHIgKilmcm9tKS0+c2FfZmFtaWx5KSB7CisgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICB7CisgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogIHNyYyA9IGZyb207CisKKyAgICAgICAgICAgIGlmIChmcm9tbGVuIDwgc2l6ZW9mKCpzcmMpKQorICAgICAgICAgICAgICAgIHJldHVybiBzZXRfZXJybm8oRUlOVkFMKTsKKworICAgICAgICAgICAgYS0+ZmFtaWx5ICAgICAgICAgPSBTT0NLRVRfSU5FVDsKKyAgICAgICAgICAgIGEtPnUuaW5ldC5wb3J0ICAgID0gbnRvaHMoc3JjLT5zaW5fcG9ydCk7CisgICAgICAgICAgICBhLT51LmluZXQuYWRkcmVzcyA9IG50b2hsKHNyYy0+c2luX2FkZHIuc19hZGRyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmZGVmIEhBVkVfSU42X1NPQ0tFVFMKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiAgc3JjID0gZnJvbTsKKworICAgICAgICAgICAgaWYgKGZyb21sZW4gPCBzaXplb2YoKnNyYykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJubyhFSU5WQUwpOworCisgICAgICAgICAgICBhLT5mYW1pbHkgICAgID0gU09DS0VUX0lONjsKKyAgICAgICAgICAgIGEtPnUuaW42LnBvcnQgPSBudG9ocyhzcmMtPnNpbjZfcG9ydCk7CisgICAgICAgICAgICBtZW1jcHkoYS0+dS5pbjYuYWRkcmVzcywgc3JjLT5zaW42X2FkZHIuczZfYWRkciwgMTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VOSVhfU09DS0VUUworICAgIGNhc2UgQUZfTE9DQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl91biogIHNyYyA9IGZyb207CisgICAgICAgICAgICBjaGFyKiBlbmQ7CisgICAgICAgICAgICBzaXplX3Qgc3VuX3BhdGhfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX3VuLCBzdW5fcGF0aCk7CisgICAgICAgICAgICBpZiAoZnJvbWxlbiA8IHN1bl9wYXRoX29mZnNldCArIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJubyhFSU5WQUwpOworCisgICAgICAgICAgICBjaGFyKiBhYnN0cmFjdF9wYXRoID0gTlVMTDsKKworI2lmZGVmIF9fbGludXhfXworICAgICAgICAgICAgaWYgKHNyYy0+c3VuX3BhdGhbMF0gPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IG9mIHN1bl9wYXRoWzBdIGlzIGFuIGluaXRpYWwtemVybyBmb2xsb3dlZAorICAgICAgICAgICAgICAgIC8vIGJ5IGEgbGliZXJhbCBudW1iZXIgb2YgYnl0ZXMgKHdoaWNoIGNhbiBiZSAwIHRvbykuIEFsbG9jYXRlCisgICAgICAgICAgICAgICAgLy8gYSBoZWFwLWFsbG9jYXRlZCBibG9jayB3aXRoIG9uZSBtb3JlIGJ5dGUsIHJlcGxhY2UgdGhlCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbCBvbmUgd2l0aCAnQCcsIGFuZCBhZGQgYSB0cmFpbGluZyB6ZXJvLgorICAgICAgICAgICAgICAgIHNpemVfdCBhYnN0cmFjdF9sZW4gPSBmcm9tbGVuIC0gc3VuX3BhdGhfb2Zmc2V0OworICAgICAgICAgICAgICAgIGFic3RyYWN0X3BhdGggPSBtYWxsb2MoYWJzdHJhY3RfbGVuICsgMSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGFic3RyYWN0X3BhdGgsIHNyYy0+c3VuX3BhdGgsIGFic3RyYWN0X2xlbik7CisgICAgICAgICAgICAgICAgYWJzdHJhY3RfcGF0aFswXSA9ICdAJzsKKyAgICAgICAgICAgICAgICBhYnN0cmFjdF9wYXRoW2Fic3RyYWN0X2xlbl0gPSAnXDAnOworICAgICAgICAgICAgfQorI2VuZGlmICAvLyBfX2xpbnV4X18KKworICAgICAgICAgICAgaWYgKCFhYnN0cmFjdF9wYXRoKSB7CisgICAgICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyB6ZXJvLXRlcm1pbmF0ZWQgKi8KKyAgICAgICAgICAgICAgICBlbmQgPSBtZW1jaHIoc3JjLT5zdW5fcGF0aCwgMCwgZnJvbWxlbiAtIHN1bl9wYXRoX29mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2Vycm5vKEVJTlZBTCk7CisKKyAgICAgICAgICAgICAgICBhYnN0cmFjdF9wYXRoID0gc3RyZHVwKHNyYy0+c3VuX3BhdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhLT5mYW1pbHkgPSBTT0NLRVRfVU5JWDsKKyAgICAgICAgICAgIGEtPnUuX3VuaXgub3duZXIgPSAxOworICAgICAgICAgICAgYS0+dS5fdW5peC5wYXRoICA9IGFic3RyYWN0X3BhdGg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzZXRfZXJybm8oRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50Citzb2NrX2FkZHJlc3NfaW5pdF9yZXNvbHZlKCBTb2NrQWRkcmVzcyogIGEsIGNvbnN0IGNoYXIqICBob3N0bmFtZSwgdWludDE2X3QgIHBvcnQsIGludCAgcHJlZmVySW42ICkKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gICBoaW50c1sxXTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8qICByZXM7CisgICAgaW50ICAgICAgICAgICAgICAgIHJldDsKKworICAgIG1lbXNldChoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMtPmFpX2ZhbWlseSAgID0gcHJlZmVySW42ID8gQUZfSU5FVDYgOiBBRl9VTlNQRUM7CisKKyAgICByZXQgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgaGludHMsICZyZXMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBpbnQgIGVycjsKKworICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIEVBSV9BR0FJTjogIC8qIHNlcnZlciBpcyBkb3duICovCisgICAgICAgIGNhc2UgRUFJX0ZBSUw6ICAgLyogc2VydmVyIGlzIHNpY2sgKi8KKyAgICAgICAgICAgIGVyciA9IEVIT1NURE9XTjsKKyAgICAgICAgICAgIGJyZWFrOworCisvKiBOT1RFIHRoYXQgaW4geDg2XzY0LXc2NC1taW5ndzMyIGJvdGggRUFJX05PREFUQSBhbmQgRUFJX05PTkFNRSBhcmUgdGhlIHNhbWUgKi8KKyNpZiBkZWZpbmVkKEVBSV9OT0RBVEEpICYmIChFQUlfTk9EQVRBICE9IEVBSV9OT05BTUUpCisgICAgICAgIGNhc2UgRUFJX05PREFUQToKKyNlbmRpZgorICAgICAgICBjYXNlIEVBSV9OT05BTUU6CisgICAgICAgICAgICBlcnIgPSBFTk9FTlQ7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVBSV9NRU1PUlk6CisgICAgICAgICAgICBlcnIgPSBFTk9NRU07CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyID0gRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzZXRfZXJybm8oZXJyKTsKKyAgICB9CisKKyAgICAvKiBQYXJzZSB0aGUgcmV0dXJuZWQgbGlzdCBvZiBhZGRyZXNzZXMuICovCisgICAgeworICAgICAgICBzdHJ1Y3QgYWRkcmluZm8qICByZXNfaXB2NCA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBhZGRyaW5mbyogIHJlc19pcHY2ID0gTlVMTDsKKyAgICAgICAgc3RydWN0IGFkZHJpbmZvKiAgcjsKKworICAgICAgIC8qIElmIHByZWZlckluNiBpcyBmYWxzZSwgd2Ugc3RvcCBvbiB0aGUgZmlyc3QgSVB2NCBhZGRyZXNzLAorICAgICAgICAqIG90aGVyd2lzZSwgd2Ugc3RvcCBvbiB0aGUgZmlyc3QgSVB2NiBvbmUKKyAgICAgICAgKi8KKyAgICAgICAgZm9yIChyID0gcmVzOyByICE9IE5VTEw7IHIgPSByLT5haV9uZXh0KSB7CisgICAgICAgICAgICBpZiAoci0+YWlfZmFtaWx5ID09IEFGX0lORVQgJiYgcmVzX2lwdjQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc19pcHY0ID0gcjsKKyAgICAgICAgICAgICAgICBpZiAoIXByZWZlckluNikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChyLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgJiYgcmVzX2lwdjYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJlc19pcHY2ID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocHJlZmVySW42KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNlbGVjdCB0aGUgYmVzdCBhZGRyZXNzIGluICdyJywgd2hpY2ggd2lsbCBiZSBOVUxMCisgICAgICAgICAqIGlmIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgYWRkcmVzcy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwcmVmZXJJbjYpIHsKKyAgICAgICAgICAgIHIgPSByZXNfaXB2NjsKKyAgICAgICAgICAgIGlmIChyID09IE5VTEwpCisgICAgICAgICAgICAgICAgciA9IHJlc19pcHY0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgciA9IHJlc19pcHY0OworICAgICAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByID0gcmVzX2lwdjY7CisgICAgICAgIH0KKworICAgICAgICBpZiAociA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBzZXRfZXJybm8oRU5PRU5UKTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvbnZlcnQgdG8gYSBTb2NrQWRkcmVzcyAqLworICAgICAgICByZXQgPSBzb2NrX2FkZHJlc3NfZnJvbV9ic2QoIGEsIHItPmFpX2FkZHIsIHItPmFpX2FkZHJsZW4gKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogbmVlZCB0byBzZXQgdGhlIHBvcnQgKi8KKyAgICBzd2l0Y2ggKGEtPmZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6IGEtPnUuaW5ldC5wb3J0ID0gcG9ydDsgYnJlYWs7CisgICAgY2FzZSBTT0NLRVRfSU42OiAgYS0+dS5pbjYucG9ydCAgPSBwb3J0OyBicmVhazsKKyAgICBkZWZhdWx0OiA7CisgICAgfQorCitFeGl0OgorICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBXaW5zb2NrIGhlYWRlcnMgZm9yIG1pbmd3IGxhY2sgc29tZSBkZWZpbml0aW9ucyAqLworI2lmbmRlZiBBSV9BRERSQ09ORklHCisjICBkZWZpbmUgIEFJX0FERFJDT05GSUcgIDAKKyNlbmRpZgorCitTb2NrQWRkcmVzcyoqCitzb2NrX2FkZHJlc3NfbGlzdF9jcmVhdGUoIGNvbnN0IGNoYXIqICBob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgICBmbGFncyApCit7CisgICAgU29ja0FkZHJlc3MqKiAgICBsaXN0ID0gTlVMTDsKKyAgICBTb2NrQWRkcmVzcyogICAgIGFkZHI7CisgICAgaW50ICAgICAgICAgICAgICBubiwgY291bnQsIHJldDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gIGFpLCAqcmVzLCAqZTsKKworICAgIG1lbXNldCgmYWksIDAsIHNpemVvZihhaSkpOworICAgIGFpLmFpX2ZsYWdzICAgfD0gQUlfQUREUkNPTkZJRzsKKyAgICBhaS5haV9mYW1pbHkgICA9IFBGX1VOU1BFQzsKKworICAgIGlmIChmbGFncyAmIFNPQ0tFVF9MSVNUX0ZPUkNFX0lORVQpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ7CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBTT0NLRVRfTElTVF9GT1JDRV9JTjYpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ2OworCisgICAgaWYgKGZsYWdzICYgU09DS0VUX0xJU1RfUEFTU0lWRSkKKyAgICAgICAgYWkuYWlfZmxhZ3MgfD0gQUlfUEFTU0lWRTsKKyAgICBlbHNlCisgICAgICAgIGFpLmFpX2ZsYWdzIHw9IEFJX0NBTk9OTkFNRTsKKworICAgIGlmIChmbGFncyAmIFNPQ0tFVF9MSVNUX0RHUkFNKQorICAgICAgICBhaS5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gIGhpbnRzID0gYWk7CisKKyAgICAgICAgcmV0ID0gZ2V0YWRkcmluZm8oaG9zdG5hbWUsIHBvcnQsICZoaW50cywgJnJlcyk7CisgICAgICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHN3aXRjaCAocmV0KSB7CisjaWZkZWYgRUFJX0FERFJGQU1JTFkKKyAgICAgICAgY2FzZSBFQUlfQUREUkZBTUlMWToKKyNlbmRpZgorICAgICAgICBjYXNlIEVBSV9OT0RBVEE6CisgICAgICAgICAgICBzZXRfZXJybm8oRU5PRU5UKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBSV9GQU1JTFk6CisgICAgICAgICAgICBzZXRfZXJybm8oRUFGTk9TVVBQT1JUKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBSV9BR0FJTjoKKyAgICAgICAgICAgIHNldF9lcnJubyhFQUdBSU4pOworICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgRUFJX1NZU1RFTQorICAgICAgICBjYXNlIEVBSV9TWVNURU06CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc2V0X2Vycm5vKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgcmVzdWx0IGxpc3QgKi8KKyAgICBmb3IgKGNvdW50ID0gMCwgZSA9IHJlczsgZSAhPSBOVUxMOyBlID0gZS0+YWlfbmV4dCkKKyAgICAgICAgY291bnQgKz0gMTsKKworICAgIEFBUlJBWV9ORVcobGlzdCwgY291bnQrMSk7CisgICAgQUFSUkFZX05FVyhhZGRyLCBjb3VudCk7CisKKyAgICBmb3IgKG5uID0gMCwgZSA9IHJlczsgZSAhPSBOVUxMOyBlID0gZS0+YWlfbmV4dCkgeworCisgICAgICAgIHJldCA9IHNvY2tfYWRkcmVzc19mcm9tX2JzZChhZGRyLCBlLT5haV9hZGRyLCBlLT5haV9hZGRybGVuKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBsaXN0W25uKytdID0gYWRkcisrOworICAgIH0KKyAgICBsaXN0W25uXSA9IE5VTEw7CisgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIGxpc3Q7Cit9CisKKyNkZWZpbmUgTUlOKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitTb2NrQWRkcmVzcyoqCitzb2NrX2FkZHJlc3NfbGlzdF9jcmVhdGUyKGNvbnN0IGNoYXIqIGhvc3RfYW5kX3BvcnQsIHVuc2lnbmVkIGZsYWdzICkKK3sKKyAgICBjaGFyIGhvc3RfbmFtZVs1MTJdOworICAgIGNvbnN0IGNoYXIqIGFjdHVhbF9ob3N0X25hbWUgPSAibG9jYWxob3N0IjsKKyAgICAvLyBQYXJzZSBob3N0IGFuZCBwb3J0IG5hbWUuCisgICAgY29uc3QgY2hhciogcG9ydF9uYW1lID0gc3RyY2hyKGhvc3RfYW5kX3BvcnQsICc6Jyk7CisgICAgaWYgKHBvcnRfbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGludCB0b19jb3B5ID0gTUlOKHNpemVvZihob3N0X25hbWUpLTEsIHBvcnRfbmFtZSAtIGhvc3RfYW5kX3BvcnQpOworICAgICAgICBpZiAodG9fY29weSAhPSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoaG9zdF9uYW1lLCBob3N0X2FuZF9wb3J0LCB0b19jb3B5KTsKKyAgICAgICAgICAgIGhvc3RfbmFtZVt0b19jb3B5XSA9ICdcMCc7CisgICAgICAgICAgICBhY3R1YWxfaG9zdF9uYW1lID0gaG9zdF9uYW1lOworICAgICAgICAgICAgcG9ydF9uYW1lKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvcnRfbmFtZSA9IGhvc3RfYW5kX3BvcnQ7CisgICAgfQorICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHBvcnRfbmFtZSBpcyBub3QgZW1wdHkuCisgICAgaWYgKHBvcnRfbmFtZVswXSA9PSAnXDAnKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc29ja19hZGRyZXNzX2xpc3RfY3JlYXRlKGFjdHVhbF9ob3N0X25hbWUsIHBvcnRfbmFtZSwgZmxhZ3MpOworfQorCit2b2lkCitzb2NrX2FkZHJlc3NfbGlzdF9mcmVlKCBTb2NrQWRkcmVzcyoqICBsaXN0ICkKK3sKKyAgICBpbnQgIG5uOworICAgIFNvY2tBZGRyZXNzKiAgYWRkcjsKKworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGFkZHIgPSBsaXN0WzBdOworICAgIGZvciAobm4gPSAwOyBsaXN0W25uXSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgIHNvY2tfYWRkcmVzc19kb25lKGxpc3Rbbm5dKTsKKyAgICAgICAgbGlzdFtubl0gPSBOVUxMOworICAgIH0KKyAgICBBRlJFRShhZGRyKTsKKyAgICBBRlJFRShsaXN0KTsKK30KKworaW50Citzb2NrX2FkZHJlc3NfZ2V0X251bWVyaWNfaW5mbyggU29ja0FkZHJlc3MqICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIGhvc3RsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICBzZXJ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgc2VydmxlbiApCit7CisgICAgc3RydWN0IHNvY2thZGRyKiAgc2FkZHI7CisgICAgc29ja2xlbl90ICAgICAgICAgc2xlbjsKKyAgICBpbnQgICAgICAgICAgICAgICByZXQ7CisKKyAgICBzd2l0Y2ggKGEtPmZhbWlseSkgeworICAgIGNhc2UgU09DS0VUX0lORVQ6CisgICAgICAgIHNhZGRyID0gKHN0cnVjdCBzb2NrYWRkciopICZhLT51LmluZXQuYWRkcmVzczsKKyAgICAgICAgc2xlbiAgPSBzaXplb2YoYS0+dS5pbmV0LmFkZHJlc3MpOworICAgICAgICBicmVhazsKKworI2lmIEhBVkVfSU42X1NPQ0tFVAorICAgIGNhc2UgU09DS0VUX0lONjoKKyAgICAgICAgc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyKikgJmEtPnUuaW42LmFkZHJlc3M7CisgICAgICAgIHNsZW4gID0gc2l6ZW9mKGEtPnUuaW42LmFkZHJlc3MpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzZXRfZXJybm8oRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXQgPSBnZXRuYW1laW5mbyggc2FkZHIsIHNsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYgKTsKKworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVBSV9BR0FJTjoKKyAgICAgICAgcmV0ID0gRUFHQUlOOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBFSU5WQUw7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludAorc29ja2V0X2NyZWF0ZSggU29ja2V0RmFtaWx5ICBmYW1pbHksIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIGludCAgIHJldDsKKyAgICBpbnQgICBzZmFtaWx5ID0gc29ja2V0X2ZhbWlseV90b19ic2QoZmFtaWx5KTsKKyAgICBpbnQgICBzdHlwZSAgID0gc29ja2V0X3R5cGVfdG9fYnNkKHR5cGUpOworCisgICAgaWYgKHNmYW1pbHkgPCAwIHx8IHN0eXBlIDwgMCkgeworICAgICAgICByZXR1cm4gc2V0X2Vycm5vKEVJTlZBTCk7CisgICAgfQorCisgICAgUVNPQ0tFVF9DQUxMKHJldCwgc29ja2V0KHNmYW1pbHksIHN0eXBlLCAwKSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBmaXhfZXJybm8oKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworaW50Citzb2NrZXRfY3JlYXRlX2luZXQoIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIHJldHVybiBzb2NrZXRfY3JlYXRlKCBTT0NLRVRfSU5FVCwgdHlwZSApOworfQorCisjaWYgSEFWRV9JTjZfU09DS0VUUworaW50Citzb2NrZXRfY3JlYXRlX2luNiAoIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIHJldHVybiBzb2NrZXRfY3JlYXRlKCBTT0NLRVRfSU42LCB0eXBlICk7Cit9CisjZW5kaWYKKworI2lmIEhBVkVfVU5JWF9TT0NLRVRTCitpbnQKK3NvY2tldF9jcmVhdGVfdW5peCggU29ja2V0VHlwZSAgdHlwZSApCit7CisgICAgcmV0dXJuIHNvY2tldF9jcmVhdGUoIFNPQ0tFVF9VTklYLCB0eXBlICk7Cit9CisjZW5kaWYKKworaW50ICBzb2NrZXRfY2FuX3JlYWQoaW50ICBmZCkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICB1bnNpZ25lZCBsb25nICBvcHQ7CisKKyAgICBpZiAoaW9jdGxzb2NrZXQoZmQsIEZJT05SRUFELCAmb3B0KSA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG9wdDsKKyNlbHNlCisgICAgaW50ICBvcHQ7CisKKyAgICBpZiAoaW9jdGwoZmQsIEZJT05SRUFELCAmb3B0KSA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIG9wdDsKKyNlbmRpZgorfQorCisjZGVmaW5lICAgU09DS0VUX0NBTEwoY21kKSAgXAorICAgIGludCAgcmV0OyBcCisgICAgUVNPQ0tFVF9DQUxMKHJldCwgKGNtZCkpOyBcCisgICAgaWYgKHJldCA8IDApIFwKKyAgICAgICAgcmV0dXJuIGZpeF9lcnJubygpOyBcCisgICAgcmV0dXJuIHJldDsgXAorCitpbnQKK3NvY2tldF9zZW5kKGludCAgZmQsIGNvbnN0IHZvaWQqICBidWYsIGludCAgYnVmbGVuKQoreworICAgIFNPQ0tFVF9DQUxMKHNlbmQoZmQsIGJ1ZiwgYnVmbGVuLCAwKSkKK30KKworaW50Citzb2NrZXRfc2VuZF9vb2IoIGludCAgZmQsIGNvbnN0IHZvaWQqICBidWYsIGludCAgYnVmbGVuICkKK3sKKyAgICBTT0NLRVRfQ0FMTChzZW5kKGZkLCBidWYsIGJ1ZmxlbiwgTVNHX09PQikpOworfQorCitpbnQKK3NvY2tldF9zZW5kdG8oaW50ICBmZCwgY29uc3Qgdm9pZCogIGJ1ZiwgaW50ICBidWZsZW4sIGNvbnN0IFNvY2tBZGRyZXNzKiAgdG8pCit7CisgICAgc29ja2FkZHJfc3RvcmFnZSAgc2E7CisgICAgc29ja2xlbl90ICAgICAgICAgc2FsZW47CisKKyAgICBpZiAoc29ja19hZGRyZXNzX3RvX2JzZCh0bywgJnNhLCAmc2FsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgU09DS0VUX0NBTEwoc2VuZHRvKGZkLCBidWYsIGJ1ZmxlbiwgMCwgc2Euc2EsIHNhbGVuKSk7Cit9CisKK2ludAorc29ja2V0X3JlY3YoaW50ICBmZCwgdm9pZCogIGJ1ZiwgaW50ICBsZW4pCit7CisgICAgU09DS0VUX0NBTEwocmVjdihmZCwgYnVmLCBsZW4sIDApKTsKK30KKworaW50Citzb2NrZXRfcmVjdmZyb20oaW50ICBmZCwgdm9pZCogIGJ1ZiwgaW50ICBsZW4sIFNvY2tBZGRyZXNzKiAgZnJvbSkKK3sKKyAgICBzb2NrYWRkcl9zdG9yYWdlICBzYTsKKyAgICBzb2NrbGVuX3QgICAgICAgICBzYWxlbiA9IHNpemVvZihzYSk7CisgICAgaW50ICAgICAgICAgICAgICAgcmV0OworCisgICAgUVNPQ0tFVF9DQUxMKHJldCxyZWN2ZnJvbShmZCxidWYsbGVuLDAsc2Euc2EsJnNhbGVuKSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBmaXhfZXJybm8oKTsKKworICAgIGlmIChzb2NrX2FkZHJlc3NfZnJvbV9ic2QoZnJvbSwgJnNhLCBzYWxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQKK3NvY2tldF9jb25uZWN0X25vX3NpZ2Fscm0oaW50IHNvY2tldCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICphZGRyZXNzLCBzb2NrbGVuX3QgYWRkcmVzc19sZW4pCit7CisgICAgaW50IHJldDsKKyAgICBCRUdJTl9OT1NJR0FMUk0KKyAgICByZXQgPSBjb25uZWN0KHNvY2tldCwgYWRkcmVzcywgYWRkcmVzc19sZW4pOworICAgIEVORF9OT1NJR0FMUk0KKyAgICByZXR1cm4gcmV0OworfQorCitpbnQKK3NvY2tldF9jb25uZWN0KCBpbnQgIGZkLCBjb25zdCBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIHNvY2thZGRyX3N0b3JhZ2UgIGFkZHI7CisgICAgc29ja2xlbl90ICAgICAgICAgYWRkcmxlbjsKKworICAgIGlmIChzb2NrX2FkZHJlc3NfdG9fYnNkKGFkZHJlc3MsICZhZGRyLCAmYWRkcmxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTT0NLRVRfQ0FMTChzb2NrZXRfY29ubmVjdF9ub19zaWdhbHJtKGZkLGFkZHIuc2EsYWRkcmxlbikpOworfQorCitpbnQKK3NvY2tldF9iaW5kKCBpbnQgIGZkLCBjb25zdCBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIHNvY2thZGRyX3N0b3JhZ2UgIGFkZHI7CisgICAgc29ja2xlbl90ICAgICAgICAgYWRkcmxlbjsKKworICAgIGlmIChzb2NrX2FkZHJlc3NfdG9fYnNkKGFkZHJlc3MsICZhZGRyLCAmYWRkcmxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTT0NLRVRfQ0FMTChiaW5kKGZkLCBhZGRyLnNhLCBhZGRybGVuKSk7Cit9CisKK2ludAorc29ja2V0X2dldF9hZGRyZXNzKCBpbnQgIGZkLCBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKQoreworICAgIHNvY2thZGRyX3N0b3JhZ2UgIGFkZHI7CisgICAgc29ja2xlbl90ICAgICAgICAgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKyAgICBpbnQgICAgICAgICAgICAgICByZXQ7CisKKyAgICBRU09DS0VUX0NBTEwocmV0LCBnZXRzb2NrbmFtZShmZCwgYWRkci5zYSwgJmFkZHJsZW4pKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGZpeF9lcnJubygpOworCisgICAgcmV0dXJuIHNvY2tfYWRkcmVzc19mcm9tX2JzZChhZGRyZXNzLCAmYWRkciwgYWRkcmxlbik7Cit9CisKK2ludAorc29ja2V0X2dldF9wZWVyX2FkZHJlc3MoIGludCAgZmQsIFNvY2tBZGRyZXNzKiAgYWRkcmVzcyApCit7CisgICAgc29ja2FkZHJfc3RvcmFnZSAgYWRkcjsKKyAgICBzb2NrbGVuX3QgICAgICAgICBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworICAgIGludCAgICAgICAgICAgICAgIHJldDsKKworICAgIFFTT0NLRVRfQ0FMTChyZXQsIGdldHBlZXJuYW1lKGZkLCBhZGRyLnNhLCAmYWRkcmxlbikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gZml4X2Vycm5vKCk7CisKKyAgICByZXR1cm4gc29ja19hZGRyZXNzX2Zyb21fYnNkKGFkZHJlc3MsICZhZGRyLCBhZGRybGVuKTsKK30KKworaW50Citzb2NrZXRfbGlzdGVuKCBpbnQgIGZkLCBpbnQgIGJhY2tsb2cgKQoreworICAgIFNPQ0tFVF9DQUxMKGxpc3RlbihmZCwgYmFja2xvZykpOworfQorCitpbnQKK3NvY2tldF9hY2NlcHQoIGludCAgZmQsIFNvY2tBZGRyZXNzKiAgYWRkcmVzcyApCit7CisgICAgc29ja2FkZHJfc3RvcmFnZSAgYWRkcjsKKyAgICBzb2NrbGVuX3QgICAgICAgICBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworICAgIGludCAgICAgICAgICAgICAgIHJldDsKKworICAgIFFTT0NLRVRfQ0FMTChyZXQsIGFjY2VwdChmZCwgYWRkci5zYSwgJmFkZHJsZW4pKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGZpeF9lcnJubygpOworCisgICAgaWYgKGFkZHJlc3MpIHsKKyAgICAgICAgaWYgKHNvY2tfYWRkcmVzc19mcm9tX2JzZChhZGRyZXNzLCAmYWRkciwgYWRkcmxlbikgPCAwKSB7CisgICAgICAgICAgICBzb2NrZXRfY2xvc2UocmV0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citzb2NrZXRfZ2V0b3B0aW9uKGludCAgZmQsIGludCAgZG9tYWluLCBpbnQgIG9wdGlvbiwgaW50ICBkZWZhdXQpCit7CisgICAgaW50ICByZXQ7CisgICAgd2hpbGUgKDEpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgRFdPUkQgb3B0ID0gKERXT1JEKS0xOworI2Vsc2UKKyAgICAgICAgaW50ICBvcHQgID0gLTE7CisjZW5kaWYKKyAgICAgICAgc29ja2xlbl90ICBvcHRsZW4gPSBzaXplb2Yob3B0KTsKKyAgICAgICAgcmV0ID0gSEFORExFX0VJTlRSKAorICAgICAgICAgICAgICAgIGdldHNvY2tvcHQoZmQsIGRvbWFpbiwgb3B0aW9uLCAoY2hhciopJm9wdCwgJm9wdGxlbikpOworICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICByZXR1cm4gKGludClvcHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBkZWZhdXQ7CisgICAgfQorI3VuZGVmIE9QVF9DQVNUCit9CisKKworU29ja2V0VHlwZSBzb2NrZXRfZ2V0X3R5cGUoaW50IGZkKQoreworICAgIGludCAgIHNvX3R5cGUgPSBzb2NrZXRfZ2V0b3B0aW9uKGZkLCBTT0xfU09DS0VULCBTT19UWVBFLCAtMSk7CisgICAgcmV0dXJuIHNvY2tldF90eXBlX2Zyb21fYnNkKHNvX3R5cGUpOworfQorCitpbnQgc29ja2V0X3NldF9ub25ibG9jayhpbnQgZmQpCit7CisjaWZkZWYgX1dJTjMyCisgICAgdW5zaWduZWQgbG9uZyBvcHQgPSAxOworICAgIHJldHVybiBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7CisjZWxzZQorICAgIGludCAgIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwpOworICAgIHJldHVybiBmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKTsKKyNlbmRpZgorfQorCitpbnQgc29ja2V0X3NldF9ibG9ja2luZyhpbnQgZmQpCit7CisjaWZkZWYgX1dJTjMyCisgICAgdW5zaWduZWQgbG9uZyBvcHQgPSAwOworICAgIHJldHVybiBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7CisjZWxzZQorICAgIGludCAgIGZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwpOworICAgIHJldHVybiBmY250bChmZCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSyk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorc29ja2V0X3NldG9wdGlvbihpbnQgIGZkLCBpbnQgIGRvbWFpbiwgaW50ICBvcHRpb24sIGludCAgX2ZsYWcpCit7CisjaWZkZWYgX1dJTjMyCisgICAgRFdPUkQgIGZsYWcgPSAoRFdPUkQpIF9mbGFnOworI2Vsc2UKKyAgICBpbnQgICAgZmxhZyA9IF9mbGFnOworI2VuZGlmCisgICAgcmV0dXJuIHNldHNvY2tvcHQoIGZkLCBkb21haW4sIG9wdGlvbiwgKGNvbnN0IGNoYXIqKSZmbGFnLCBzaXplb2YoZmxhZykgKTsKK30KKworaW50IHNvY2tldF9zZXRfeHJldXNlYWRkcihpbnQgIGZkKQoreworI2lmZGVmIF9XSU4zMgorICAgLyogb24gV2luZG93cywgU09fUkVVU0VBRERSIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBzZXZlcmFsIHByb2dyYW1zIGNhbgorICAgICogYmluZCB0byB0aGUgc2FtZSBwb3J0LiB0aGlzIGlzIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZyb20gdGhlIFVuaXgKKyAgICAqIHNlbWFudGljcy4gaW5zdGVhZCBvZiBTT19FWENMVVNJVkVBRERSIHRvIGVuc3VyZSB0aGF0IGV4cGxpY2l0ZWx5IHByZXZlbnQKKyAgICAqIHRoaXMuCisgICAgKi8KKyAgICByZXR1cm4gc29ja2V0X3NldG9wdGlvbihmZCwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwgMSk7CisjZWxzZQorICAgIHJldHVybiBzb2NrZXRfc2V0b3B0aW9uKGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIDEpOworI2VuZGlmCit9CisKKworaW50IHNvY2tldF9zZXRfb29iaW5saW5lKGludCAgZmQpCit7CisgICAgcmV0dXJuIHNvY2tldF9zZXRvcHRpb24oZmQsIFNPTF9TT0NLRVQsIFNPX09PQklOTElORSwgMSk7Cit9CisKK2ludCBzb2NrZXRfc2V0X2NvcmsoaW50IGZkLCBpbnQgdikKK3sKKyNpZiBkZWZpbmVkKFNPTF9UQ1ApICYmIGRlZmluZWQoVENQX0NPUkspCisgICAgcmV0dXJuIHNvY2tldF9zZXRvcHRpb24oZmQsIFNPTF9UQ1AsIFRDUF9DT1JLLCB2KTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50ICBzb2NrZXRfc2V0X25vZGVsYXkoaW50ICBmZCkKK3sKKyAgICByZXR1cm4gc29ja2V0X3NldG9wdGlvbihmZCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCAxKTsKK30KKworaW50IHNvY2tldF9zZXRfaXB2Nm9ubHkoaW50ICBmZCkKK3sKKy8qIElQVjZfT05MWSBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBWaXN0YSBvbiBXaW5kb3dzLAorICogYW5kIHRoZSBNaW5ndyBoZWFkZXJzIGxhY2sgaXRzIGRlZmluaXRpb24gYW55d2F5LgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKElQVjZfVjZPTkxZKQorCXJldHVybiAwOworI2Vsc2UKKyAgICByZXR1cm4gc29ja2V0X3NldG9wdGlvbihmZCwgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgMSk7CisjZW5kaWYKK30KKworCitpbnQgc29ja2V0X2dldF9lcnJvcihpbnQgZmQpCit7CisgICAgcmV0dXJuIHNvY2tldF9nZXRvcHRpb24oZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAtMSk7Cit9CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgc29ja2V0X2NsZWFudXAodm9pZCkKK3sKKyAgICBXU0FDbGVhbnVwKCk7Cit9CisKKy8vIFNvY2tldHMgc2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZSBwZXIgcHJvY2Vzcy4gU2ltcGx5IGVuZm9yY2UgaXQuCitzdGF0aWMgYm9vbCBzb2NrZXRfaW5pdF9jYWxsZWQgPSBmYWxzZTsKK2ludCBhbmRyb2lkX3NvY2tldF9pbml0KHZvaWQpCit7CisgICAgaWYgKHNvY2tldF9pbml0X2NhbGxlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc29ja2V0X2luaXRfY2FsbGVkID0gdHJ1ZTsKKworICAgIFdTQURBVEEgRGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gV1NBU3RhcnR1cChNQUtFV09SRCgyLDIpLCAmRGF0YSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICh2b2lkKSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdGV4aXQoc29ja2V0X2NsZWFudXApOworICAgIHJldHVybiAwOworfQorCisjZWxzZSAvKiAhX1dJTjMyICovCisKK2ludCBhbmRyb2lkX3NvY2tldF9pbml0KHZvaWQpCit7CisgICByZXR1cm4gMDsgICAvKiBub3RoaW5nIHRvIGRvIG9uIFVuaXggKi8KK30KKworI2VuZGlmIC8qICFfV0lOMzIgKi8KKworCit2b2lkCitzb2NrZXRfY2xvc2UoIGludCAgZmQgKSB7CisgICAgc29ja2V0X2RyYWluZXJfZHJhaW5fYW5kX2Nsb3NlKGZkKTsKK30KKworc3RhdGljIGludAorc29ja2V0X2JpbmRfc2VydmVyKCBpbnQgIHMsIGNvbnN0IFNvY2tBZGRyZXNzKiAgdG8sIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIHNvY2tldF9zZXRfeHJldXNlYWRkcihzKTsKKworICAgIGlmIChzb2NrZXRfYmluZChzLCB0bykgPCAwKSB7CisgICAgICAgIEQoImNvdWxkIG5vdCBiaW5kIHNlcnZlciBzb2NrZXQgYWRkcmVzcyAlczogJXMiLAorICAgICAgICAgIHNvY2tfYWRkcmVzc190b19zdHJpbmcodG8pLCBlcnJub19zdHIpOworICAgICAgICBnb3RvIEZBSUw7CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gU09DS0VUX1NUUkVBTSkgeworICAgICAgICBpZiAoc29ja2V0X2xpc3RlbihzLCA0KSA8IDApIHsKKyAgICAgICAgICAgIEQoImNvdWxkIG5vdCBsaXN0ZW4gc2VydmVyIHNvY2tldCAlczogJXMiLAorICAgICAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKHRvKSwgZXJybm9fc3RyKTsKKyAgICAgICAgICAgIGdvdG8gRkFJTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIHM7CisKK0ZBSUw6CisgICAgc29ja2V0X2Nsb3NlKHMpOworICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50Citzb2NrZXRfY29ubmVjdF9jbGllbnQoIGludCAgcywgY29uc3QgU29ja0FkZHJlc3MqICB0byApCit7CisgICAgaWYgKHNvY2tldF9jb25uZWN0KHMsIHRvKSA8IDApIHsKKyAgICAgICAgRCggImNvdWxkIG5vdCBjb25uZWN0IGNsaWVudCBzb2NrZXQgdG8gJXM6ICVzXG4iLAorICAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKHRvKSwgZXJybm9fc3RyICk7CisgICAgICAgIHNvY2tldF9jbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNvY2tldF9zZXRfbm9uYmxvY2soIHMgKTsKKyAgICByZXR1cm4gczsKK30KKworCitzdGF0aWMgaW50Citzb2NrZXRfaW5fc2VydmVyKCBpbnQgIGFkZHJlc3MsIGludCAgcG9ydCwgU29ja2V0VHlwZSAgdHlwZSApCit7CisgICAgU29ja0FkZHJlc3MgIGFkZHI7CisgICAgaW50ICAgICAgICAgIHM7CisKKyAgICBzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KCAmYWRkciwgYWRkcmVzcywgcG9ydCApOworICAgIHMgPSBzb2NrZXRfY3JlYXRlX2luZXQoIHR5cGUgKTsKKyAgICBpZiAocyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBzb2NrZXRfYmluZF9zZXJ2ZXIoIHMsICZhZGRyLCB0eXBlICk7Cit9CisKKworc3RhdGljIGludAorc29ja2V0X2luX2NsaWVudCggU29ja0FkZHJlc3MqICB0bywgU29ja2V0VHlwZSAgdHlwZSApCit7CisgICAgaW50ICBzOworCisgICAgcyA9IHNvY2tldF9jcmVhdGVfaW5ldCggdHlwZSApOworICAgIGlmIChzIDwgMCkgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHNvY2tldF9jb25uZWN0X2NsaWVudCggcywgdG8gKTsKK30KKworCitpbnQKK3NvY2tldF9sb29wYmFjazRfc2VydmVyKCBpbnQgIHBvcnQsIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIHJldHVybiBzb2NrZXRfaW5fc2VydmVyKCBTT0NLX0FERFJFU1NfSU5FVF9MT09QQkFDSywgcG9ydCwgdHlwZSApOworfQorCitpbnQKK3NvY2tldF9sb29wYmFjazZfc2VydmVyKCBpbnQgIHBvcnQsIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIFNvY2tBZGRyZXNzICBhZGRyOworICAgIGludCAgICAgICAgICBzOworCisgICAgc29ja19hZGRyZXNzX2luaXRfaW42X2xvb3BiYWNrKCAmYWRkciwgcG9ydCApOworICAgIHMgPSBzb2NrZXRfY3JlYXRlX2luNiggdHlwZSApOworICAgIGlmIChzIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHNvY2tldF9iaW5kX3NlcnZlciggcywgJmFkZHIsIHR5cGUgKTsKK30KKworaW50Citzb2NrZXRfbG9vcGJhY2s0X2NsaWVudCggaW50ICBwb3J0LCBTb2NrZXRUeXBlICB0eXBlICkKK3sKKyAgICBTb2NrQWRkcmVzcyAgYWRkcjsKKworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZhZGRyLCBTT0NLX0FERFJFU1NfSU5FVF9MT09QQkFDSywgcG9ydCApOworICAgIHJldHVybiBzb2NrZXRfaW5fY2xpZW50KCAmYWRkciwgdHlwZSApOworfQorCitpbnQKK3NvY2tldF9sb29wYmFjazZfY2xpZW50KCBpbnQgIHBvcnQsIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIFNvY2tBZGRyZXNzICBhZGRyOworCisgICAgc29ja19hZGRyZXNzX2luaXRfaW42X2xvb3BiYWNrKCAmYWRkciwgcG9ydCApOworCisgICAgaW50IHMgPSBzb2NrZXRfY3JlYXRlX2luZXQoIHR5cGUgKTsKKyAgICBpZiAocyA8IDApIHJldHVybiAtMTsKKworICAgIHJldHVybiBzb2NrZXRfY29ubmVjdF9jbGllbnQoIHMsICZhZGRyICk7Cit9CisKK2ludAorc29ja2V0X25ldHdvcmtfY2xpZW50KCBjb25zdCBjaGFyKiAgaG9zdCwgaW50ICBwb3J0LCBTb2NrZXRUeXBlICB0eXBlICkKK3sKKyAgICBTb2NrQWRkcmVzcyAgYWRkcjsKKworICAgIGlmIChzb2NrX2FkZHJlc3NfaW5pdF9yZXNvbHZlKCAmYWRkciwgaG9zdCwgcG9ydCwgMCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gc29ja2V0X2luX2NsaWVudCggJmFkZHIsIHR5cGUgKTsKK30KKworCitpbnQKK3NvY2tldF9hbnlhZGRyX3NlcnZlciggaW50ICBwb3J0LCBTb2NrZXRUeXBlICB0eXBlICkKK3sKKyAgICByZXR1cm4gc29ja2V0X2luX3NlcnZlciggU09DS19BRERSRVNTX0lORVRfQU5ZLCBwb3J0LCB0eXBlICk7Cit9CisKK2ludAorc29ja2V0X2FjY2VwdF9hbnkoIGludCAgc2VydmVyX2ZkICkKK3sKKyAgICBpbnQgIGZkOworCisgICAgUVNPQ0tFVF9DQUxMKGZkLCBhY2NlcHQoIHNlcnZlcl9mZCwgTlVMTCwgMCApKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIEQoICJjb3VsZCBub3QgYWNjZXB0IGNsaWVudCBjb25uZWN0aW9uIGZyb20gZmQgJWQ6ICVzIiwKKyAgICAgICAgICAgc2VydmVyX2ZkLCBlcnJub19zdHIgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHNldCB0byBub24tYmxvY2tpbmcgKi8KKyAgICBzb2NrZXRfc2V0X25vbmJsb2NrKCBmZCApOworICAgIHJldHVybiBmZDsKK30KKworCisjaWYgSEFWRV9VTklYX1NPQ0tFVFMKKworaW50Citzb2NrZXRfdW5peF9zZXJ2ZXIoIGNvbnN0IGNoYXIqICBuYW1lLCBTb2NrZXRUeXBlICB0eXBlICkKK3sKKyAgICBTb2NrQWRkcmVzcyAgIGFkZHI7CisgICAgaW50ICAgICAgICAgICBzLCByZXQ7CisKKyAgICBzID0gc29ja2V0X2NyZWF0ZV91bml4KCB0eXBlICk7CisgICAgaWYgKHMgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzb2NrX2FkZHJlc3NfaW5pdF91bml4KCAmYWRkciwgbmFtZSApOworCisgICAgSEFORExFX0VJTlRSKHVubGluayhuYW1lKSk7CisKKyAgICByZXQgPSBzb2NrZXRfYmluZF9zZXJ2ZXIoIHMsICZhZGRyLCB0eXBlICk7CisKKyAgICBzb2NrX2FkZHJlc3NfZG9uZSggJmFkZHIgKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQKK3NvY2tldF91bml4X2NsaWVudCggY29uc3QgY2hhciogIG5hbWUsIFNvY2tldFR5cGUgIHR5cGUgKQoreworICAgIFNvY2tBZGRyZXNzICAgYWRkcjsKKyAgICBpbnQgICAgICAgICAgIHMsIHJldDsKKworICAgIHMgPSBzb2NrZXRfY3JlYXRlX3VuaXgodHlwZSk7CisgICAgaWYgKHMgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzb2NrX2FkZHJlc3NfaW5pdF91bml4KCAmYWRkciwgbmFtZSApOworCisgICAgcmV0ID0gIHNvY2tldF9jb25uZWN0X2NsaWVudCggcywgJmFkZHIgKTsKKworICAgIHNvY2tfYWRkcmVzc19kb25lKCAmYWRkciApOworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1VOSVhfU09DS0VUUyAqLworCisKKworaW50Citzb2NrZXRfcGFpcihpbnQgKmZkMSwgaW50ICpmZDIpCit7CisjaWZuZGVmIF9XSU4zMgorICAgIGludCAgIGZkc1syXTsKKyAgICBpbnQgICByZXQgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZHMpOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgc29ja2V0X3NldF9ub25ibG9jayhmZHNbMF0pOworICAgICAgICBzb2NrZXRfc2V0X25vbmJsb2NrKGZkc1sxXSk7CisgICAgICAgICpmZDEgPSBmZHNbMF07CisgICAgICAgICpmZDIgPSBmZHNbMV07CisgICAgfQorICAgIHJldHVybiByZXQ7CisjZWxzZSAvKiBfV0lOMzIgKi8KKyAgICAvKiBvbiBXaW5kb3dzLCBzZWxlY3QoKSBvbmx5IHdvcmtzIHdpdGggbmV0d29yayBzb2NrZXRzLCB3aGljaAorICAgICAqIG1lYW5zIHdlIGFic29sdXRlbHkgY2Fubm90IHVzZSBXaW4zMiBQSVBFcyB0byBpbXBsZW1lbnQKKyAgICAgKiBzb2NrZXQgcGFpcnMgd2l0aCB0aGUgY3VycmVudCBldmVudCBsb29wIGltcGxlbWVudGF0aW9uLgorICAgICAqIFdlJ3JlIGdvaW5nIHRvIGRvIGxpa2UgQ3lnd2luOiBjcmVhdGUgYSByYW5kb20gcGFpcgorICAgICAqIG9mIGxvY2FsaG9zdCBUQ1Agc29ja2V0cyBhbmQgY29ubmVjdCB0aGVtIHRvZ2V0aGVyCisgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgICBzMCwgczEsIHMyLCBwb3J0OworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAgc29ja2luOworICAgIHNvY2tsZW5fdCAgICAgICAgICAgbGVuOworCisgICAgLyogZmlyc3QsIGNyZWF0ZSB0aGUgJ3NlcnZlcicgc29ja2V0LgorICAgICAqIGEgcG9ydCBudW1iZXIgb2YgMCBtZWFucyAnYW55IHBvcnQgYmV0d2VlbiAxMDI0IGFuZCA1MDAwLgorICAgICAqIHNlZSBXaW5zb2NrIGJpbmQoKSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzICovCisgICAgczAgPSBzb2NrZXRfbG9vcGJhY2s0X3NlcnZlciggMCwgU09DS19TVFJFQU0gKTsKKyAgICBpZiAoczAgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBub3cgY29ubmVjdCBhIGNsaWVudCBzb2NrZXQgdG8gaXQsIHdlIGZpcnN0IG5lZWQgdG8KKyAgICAgKiBleHRyYWN0IHRoZSBzZXJ2ZXIgc29ja2V0J3MgcG9ydCBudW1iZXIgKi8KKyAgICBsZW4gPSBzaXplb2Ygc29ja2luOworICAgIGlmIChnZXRzb2NrbmFtZShzMCwgKHN0cnVjdCBzb2NrYWRkciopICZzb2NraW4sICZsZW4pIDwgMCkgeworICAgICAgICBjbG9zZXNvY2tldCAoczApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcG9ydCA9IG50b2hzKHNvY2tpbi5zaW5fcG9ydCk7CisgICAgczIgICA9IHNvY2tldF9sb29wYmFjazRfY2xpZW50KCBwb3J0LCBTT0NLX1NUUkVBTSApOworICAgIGlmIChzMiA8IDApIHsKKyAgICAgICAgY2xvc2Vzb2NrZXQoczApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogd2UgbmVlZCB0byBhY2NlcHQgdGhlIGNvbm5lY3Rpb24gb24gdGhlIHNlcnZlciBzb2NrZXQKKyAgICAgKiB0aGlzIHdpbGwgY3JlYXRlIHRoZSBzZWNvbmQgc29ja2V0IGZvciB0aGUgcGFpcgorICAgICAqLworICAgIGxlbiA9IHNpemVvZiBzb2NraW47CisgICAgczEgID0gYWNjZXB0KHMwLCAoc3RydWN0IHNvY2thZGRyKikgJnNvY2tpbiwgJmxlbik7CisgICAgaWYgKHMxID09IElOVkFMSURfU09DS0VUKSB7CisgICAgICAgIGNsb3Nlc29ja2V0IChzMCk7CisgICAgICAgIGNsb3Nlc29ja2V0IChzMik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc29ja2V0X3NldF9ub25ibG9jayhzMSk7CisKKyAgICAvKiBjbG9zZSBzZXJ2ZXIgc29ja2V0ICovCisgICAgY2xvc2Vzb2NrZXQoczApOworICAgICpmZDEgPSBzMTsKKyAgICAqZmQyID0gczI7CisgICAgcmV0dXJuIDA7CisjZW5kaWYgLyogX1dJTjMyICovCit9CisKKworCitpbnQKK3NvY2tldF9tY2FzdF9pbmV0X2FkZF9tZW1iZXJzaGlwKCBpbnQgIHMsIHVpbnQzMl90ICBpcCApCit7CisgICAgc3RydWN0IGlwX21yZXEgaW1yOworCisgICAgaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyID0gaHRvbmwoaXApOworICAgIGltci5pbXJfaW50ZXJmYWNlLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworCisgICAgaWYgKCBzZXRzb2Nrb3B0KCBzLCBJUFBST1RPX0lQLCBJUF9BRERfTUVNQkVSU0hJUCwKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopJmltciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaXBfbXJlcSkpIDwgMCApCisgICAgeworICAgICAgICByZXR1cm4gZml4X2Vycm5vKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQKK3NvY2tldF9tY2FzdF9pbmV0X2Ryb3BfbWVtYmVyc2hpcCggaW50ICBzLCB1aW50MzJfdCAgaXAgKQoreworICAgIHN0cnVjdCBpcF9tcmVxIGltcjsKKworICAgIGltci5pbXJfbXVsdGlhZGRyLnNfYWRkciA9IGh0b25sKGlwKTsKKyAgICBpbXIuaW1yX2ludGVyZmFjZS5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKKworICAgIGlmICggc2V0c29ja29wdCggcywgSVBQUk9UT19JUCwgSVBfRFJPUF9NRU1CRVJTSElQLAorICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikmaW1yLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpcF9tcmVxKSkgPCAwICkKKyAgICB7CisgICAgICAgIHJldHVybiBmaXhfZXJybm8oKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorc29ja2V0X21jYXN0X2luZXRfc2V0X2xvb3AoIGludCAgcywgaW50ICBlbmFibGVkICkKK3sKKyAgICByZXR1cm4gc29ja2V0X3NldG9wdGlvbiggcywgSVBQUk9UT19JUCwgSVBfTVVMVElDQVNUX0xPT1AsICEhZW5hYmxlZCApOworfQorCitpbnQKK3NvY2tldF9tY2FzdF9pbmV0X3NldF90dGwoIGludCAgcywgaW50ICB0dGwgKQoreworICAgIHJldHVybiBzb2NrZXRfc2V0b3B0aW9uKCBzLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCB0dGwgKTsKK30KKworCitjaGFyKgoraG9zdF9uYW1lKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgY2hhciBidWZbMjU2XTsgIC8qIDI1NSBpcyB0aGUgbWF4IGhvc3QgbmFtZSBsZW5ndGggc3VwcG9ydGVkIGJ5IEROUyAqLworICAgIGludCAgICAgICAgIHJldDsKKworICAgIFFTT0NLRVRfQ0FMTChyZXQsIGdldGhvc3RuYW1lKGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gImxvY2FsaG9zdCI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYnVmOworfQorCisKKy8vIFRlbXBvcmFyeSB3b3JrLWFyb3VuZHMgdW50aWwgd2UgZ2V0IHJpZCBvZiB0aGlzIHNvdXJjZSBmaWxlLgorCitpbnQgcWVtdV9nZXRzb2Nrb3B0KGludCBzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCB2b2lkKiBvcHR2YWwsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCogb3B0bGVuKSB7CisgICAgc29ja2xlbl90IGxlbiA9IChzb2NrbGVuX3QpICpvcHRsZW47CisgICAgaW50IHJldCA9IGdldHNvY2tvcHQoc29jaywgbGV2ZWwsIG9wdG5hbWUsIChjaGFyKilvcHR2YWwsICZsZW4pOworICAgICpvcHRsZW4gPSAoc2l6ZV90KSBsZW47CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHFlbXVfc2V0c29ja29wdChpbnQgc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY29uc3Qgdm9pZCogb3B0dmFsLAorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3B0bGVuKSB7CisgIHJldHVybiBzZXRzb2Nrb3B0KHNvY2ssIGxldmVsLCBvcHRuYW1lLCAoY29uc3QgY2hhciopb3B0dmFsLAorICAgICAgICAgICAgICAgICAgICAoc29ja2xlbl90KW9wdGxlbik7Cit9CisKK2ludCBxZW11X3JlY3YoaW50IHNvY2ssIHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzKSB7CisgIHJldHVybiByZWN2KHNvY2ssIGJ1ZiwgbGVuLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc29ja2V0cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFhNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldHMuaApAQCAtMCwwICsxLDQzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworLyogaGVhZGVycyB0byB1c2UgdGhlIEJTRCBzb2NrZXRzICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YW5kcm9pZC91dGlscy9jb21waWxlci5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLyogd2UncmUgZ29pbmcgdG8gaGlkZSB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBzb2NrZXRzIGJlaGluZAorICogYSBzaW1wbGUgd3JhcHBlciBpbnRlcmZhY2UgZGVjbGFyZWQgaGVyZS4KKyAqCisgKiBhbGwgc29ja2V0IG9wZXJhdGlvbnMgc2V0IHRoZSBnbG9iYWwgJ2Vycm5vJyB2YXJpYWJsZSBvbiBlcnJvci4KKyAqIHRoaXMgaXMgdW5saWtlIFdpbnNvY2sgd2hpY2ggaW5zdGVhZCBtb2RpZmllcyBhbm90aGVyIGludGVybmFsCisgKiB2YXJpYWJsZSBhY2Nlc3NlZCB0aHJvdWdoIFdTQUdldExhc3RFcnJvcigpIGFuZCBXU0FTZXRMYXN0RXJyb3IoKQorICovCisKKy8qIHRoZSB3cmFwcGVyIHdpbGwgY29udmVydCBhbnkgV2luc29jayBlcnJvciBtZXNzYWdlIGludG8gYW4gZXJybm8KKyAqIGNvZGUgZm9yIHlvdS4gVGhlcmUgYXJlIGhvd2V2ZXIgYSBmZXcgc3RhbmRhcmQgVW5peCBlcnJvciBjb2RlcworICogdGhhdCBhcmUgbm90IGRlZmluZWQgYnkgdGhlIE1TIEMgbGlicmFyeSBoZWFkZXJzLCBzbyB3ZSBhZGQgdGhlbQorICogaGVyZS4gV2UgdXNlIHRoZSBvZmZpY2lhbCBXaW5zb2NrIGVycm9yIGNvZGVzLCB3aGljaCBhcmUgZG9jdW1lbnRlZAorICogZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSBXaW5zb2NrIGhlYWRlcnMKKyAqLworI2lmZGVmIF9XSU4zMgorIyAgaWZuZGVmIEVJTlRSCisjICAgIGRlZmluZSBFSU5UUiAgICAgICAgMTAwMDQKKyMgIGVuZGlmCisjICBpZm5kZWYgRUFHQUlOCisjICAgIGRlZmluZSBFQUdBSU4gICAgICAgMTAwMzUKKyMgIGVuZGlmCisjICBpZm5kZWYgRVdPVUxEQkxPQ0sKKyMgICAgZGVmaW5lIEVXT1VMREJMT0NLICBFQUdBSU4KKyMgIGVuZGlmCisjICBpZm5kZWYgRUlOUFJPR1JFU1MKKyMgICAgZGVmaW5lIEVJTlBST0dSRVNTICAxMDAzNgorIyAgZW5kaWYKKyMgIGlmbmRlZiBFQUxSRUFEWQorIyAgICBkZWZpbmUgRUFMUkVBRFkgICAgIDEwMDM3CisjICBlbmRpZgorIyAgaWZuZGVmIEVERVNUQUREUlJFUQorIyAgICBkZWZpbmUgRURFU1RBRERSUkVRIDEwMDM5CisjICBlbmRpZgorIyAgaWZuZGVmIEVNU0dTSVpFCisjICAgIGRlZmluZSBFTVNHU0laRSAgICAgMTAwNDAKKyMgIGVuZGlmCisjICBpZm5kZWYgRVBST1RPVFlQRQorIyAgICBkZWZpbmUgRVBST1RPVFlQRSAgIDEwMDQxCisjICBlbmRpZgorIyAgaWZuZGVmIEVOT1BST1RPT1BUCisjICAgIGRlZmluZSBFTk9QUk9UT09QVCAgMTAwNDIKKyMgIGVuZGlmCisjICBpZm5kZWYgRUFGTk9TVVBQT1JUCisjICAgIGRlZmluZSBFQUZOT1NVUFBPUlQgMTAwNDcKKyMgIGVuZGlmCisjICBpZm5kZWYgRUFERFJJTlVTRQorIyAgICBkZWZpbmUgRUFERFJJTlVTRSAgIDEwMDQ4CisjICBlbmRpZgorIyAgaWZuZGVmIEVBRERSTk9UQVZBSUwKKyMgICAgZGVmaW5lIEVBRERSTk9UQVZBSUwgMTAwNDkKKyMgIGVuZGlmCisjICBpZm5kZWYgRU5FVERPV04KKyMgICAgZGVmaW5lIEVORVRET1dOICAgICAxMDA1MAorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTkVUVU5SRUFDSAorIyAgICBkZWZpbmUgRU5FVFVOUkVBQ0ggIDEwMDUxCisjICBlbmRpZgorIyAgaWZuZGVmIEVORVRSRVNFVAorIyAgICBkZWZpbmUgRU5FVFJFU0VUICAgIDEwMDUyCisjICBlbmRpZgorIyAgaWZuZGVmIEVDT05OQUJPUlRFRAorIyAgICBkZWZpbmUgRUNPTk5BQk9SVEVEIDEwMDUzCisjICBlbmRpZgorIyAgaWZuZGVmIEVDT05OUkVTRVQKKyMgICAgZGVmaW5lIEVDT05OUkVTRVQgICAxMDA1NAorIyAgZW5kaWYKKyMgIGlmbmRlZiBFTk9CVUZTCisjICAgIGRlZmluZSBFTk9CVUZTICAgICAgMTAwNTUKKyMgIGVuZGlmCisjICBpZm5kZWYgRUlTQ09OTgorIyAgICBkZWZpbmUgRUlTQ09OTiAgICAgIDEwMDU2CisjICBlbmRpZgorIyAgaWZuZGVmIEVOT1RDT05OCisjICAgIGRlZmluZSBFTk9UQ09OTiAgICAgMTAwNTcKKyMgIGVuZGlmCisjICBpZm5kZWYgRVNIVVRET1dOCisjICAgIGRlZmluZSBFU0hVVERPV04gICAgIDEwMDU4CisjICBlbmRpZgorIyAgaWZuZGVmIEVUT09NQU5ZUkVGUworIyAgICBkZWZpbmUgRVRPT01BTllSRUZTICAxMDA1OQorIyAgZW5kaWYKKyMgIGlmbmRlZiBFVElNRURPVVQKKyMgICAgZGVmaW5lIEVUSU1FRE9VVCAgICAgMTAwNjAKKyMgIGVuZGlmCisjICBpZm5kZWYgRUNPTk5SRUZVU0VECisjICAgIGRlZmluZSBFQ09OTlJFRlVTRUQgIDEwMDYxCisjICBlbmRpZgorIyAgaWZuZGVmIEVMT09QCisjICAgIGRlZmluZSBFTE9PUCAgICAgICAgIDEwMDYyCisjICBlbmRpZgorIyAgaWZuZGVmIEVIT1NURE9XTgorIyAgICBkZWZpbmUgRUhPU1RET1dOICAgICAxMDA2NAorIyAgZW5kaWYKKyMgIGlmbmRlZiBFSE9TVFVOUkVBQ0gKKyMgICAgZGVmaW5lIEVIT1NUVU5SRUFDSCAgMTAwNjUKKyMgIGVuZGlmCisjZW5kaWYgLyogX1dJTjMyICovCisKKy8qIERlZmluZSAnZXJybm9fc3RyJyBhcyBhIGhhbmR5IG1hY3JvIHRvIHJldHVybiB0aGUgc3RyaW5nCisgKiBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZXJybm8gY29kZS4gT24gVW5peCwgdGhpcyBpcworICogZXF1aXZhbGVudCB0byBzdHJlcnJvcihlcnJubyksIGJ1dCBvbiBXaW5kb3dzLCB0aGlzIHdpbGwKKyAqIHRha2UgY2FyZSBvZiBXaW5zb2NrLW9yaWdpbmF0ZWQgZXJyb3JzIGFzIHdlbGwuCisgKi8KKyNpZmRlZiBfV0lOMzIKKyAgZXh0ZXJuIGNvbnN0IGNoYXIqICBfZXJybm9fc3RyKHZvaWQpOworIyAgZGVmaW5lICBlcnJub19zdHIgICBfZXJybm9fc3RyKCkKKyNlbHNlCisjICBkZWZpbmUgIGVycm5vX3N0ciAgIHN0cmVycm9yKGVycm5vKQorI2VuZGlmCisKKy8qIGFsd2F5cyBlbmFibGUgSVB2NiBzb2NrZXRzIGZvciBub3cuCisgKiB0aGUgUUVNVSBpbnRlcm5hbCByb3V0ZXIgaXMgbm90IGNhcGFibGUgb2YKKyAqIHN1cHBvcnRpbmcgdGhlbSwgYnV0IHdlIHBsYW4gdG8gcmVwbGFjZSBpdAorICogd2l0aCBzb21ldGhpbmcgYmV0dGVyIGluIHRoZSBmdXR1cmUuCisgKi8KKyNkZWZpbmUgIEhBVkVfSU42X1NPQ0tFVFMgICAxCisKKy8qIFVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiBXaW4zMiAqLworI2lmbmRlZiBfV0lOMzIKKyMgIGRlZmluZSAgSEFWRV9VTklYX1NPQ0tFVFMgIDEKKyNlbmRpZgorCisvKiBpbml0aWFsaXplIHRoZSBzb2NrZXQgc3ViLXN5c3RlbS4gdGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqIHVzaW5nIGFueSBvZiB0aGUgZGVjbGFyYXRpb25zIGJlbG93LgorICovCitpbnQgIGFuZHJvaWRfc29ja2V0X2luaXQoIHZvaWQgKTsKKworLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGhvc3QgKi8KK2NoYXIqICBob3N0X25hbWUoIHZvaWQgKTsKKworLyogc3VwcG9ydGVkIHNvY2tldCB0eXBlcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTT0NLRVRfREdSQU0gPSAwLAorICAgIFNPQ0tFVF9TVFJFQU0KK30gU29ja2V0VHlwZTsKKworLyogc3VwcG9ydGVkIHNvY2tldCBmYW1pbGllcyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTT0NLRVRfVU5TUEVDLAorICAgIFNPQ0tFVF9JTkVULAorICAgIFNPQ0tFVF9JTjYsCisgICAgU09DS0VUX1VOSVgKK30gU29ja2V0RmFtaWx5OworCisvKiBHZW5lcmljIHNvY2tldCBhZGRyZXNzIHN0cnVjdHVyZS4gTm90ZSB0aGF0IGZvciBVbml4CisgKiBzb2NrZXRzLCB0aGUgcGF0aCBpcyBzdG9yZWQgaW4gYSBoZWFwLWFsbG9jYXRlZCBibG9jaywKKyAqIHVubGVzcyB0aGUgJ293bmVyJyBmaWVsZCBpcyBjbGVhcmVkLiBJZiB0aGlzIGlzIHRoZSBjYXNlLAorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU29ja2V0RmFtaWx5ICBmYW1pbHk7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDE2X3QgICBwb3J0OworICAgICAgICAgICAgdWludDMyX3QgICBhZGRyZXNzOworICAgICAgICB9IGluZXQ7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MTZfdCAgIHBvcnQ7CisgICAgICAgICAgICB1aW50OF90ICAgIGFkZHJlc3NbMTZdOworICAgICAgICB9IGluNjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGludCAgICAgICAgICBvd25lcjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwYXRoOworICAgICAgICB9IF91bml4OworICAgIH0gdTsKK30gU29ja0FkZHJlc3M7CisKKyNkZWZpbmUgIFNPQ0tfQUREUkVTU19JTkVUX0FOWSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lICBTT0NLX0FERFJFU1NfSU5FVF9MT09QQkFDSyAgMHg3ZjAwMDAwMQorCisvKiBpbml0aWFsaXplIGEgbmV3IElQdjQgc29ja2V0IGFkZHJlc3MsIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IGFyZQorICogaW4gaG9zdCBlbmRpYW5lc3MuCisgKi8KK3ZvaWQgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoIFNvY2tBZGRyZXNzKiAgYSwgdWludDMyX3QgIGlwLCB1aW50MTZfdCAgcG9ydCApOworCisvKiBJbml0aWFsaXplIGFuIElQdjYgc29ja2V0IGFkZHJlc3MsIHRoZSBhZGRyZXNzIGlzIGluIG5ldHdvcmsgb3JkZXIKKyAqIGFuZCB0aGUgcG9ydCBpbiBob3N0IGVuZGlhbmVzcy4KKyAqLworI2lmIEhBVkVfSU42X1NPQ0tFVFMKK3ZvaWQgIHNvY2tfYWRkcmVzc19pbml0X2luNiAoIFNvY2tBZGRyZXNzKiAgYSwgY29uc3QgdWludDhfdCBpcDZbMTZdLCB1aW50MTZfdCAgcG9ydCApOwordm9pZCAgc29ja19hZGRyZXNzX2luaXRfaW42X2xvb3BiYWNrICggU29ja0FkZHJlc3MqIGEsIHVpbnQxNl90IHBvcnQgKTsKKyNlbmRpZgorCisvKiBJbnRpYWxpemUgYSBVbml4IHNvY2tldCBhZGRyZXNzLCB0aGlzIHdpbGwgY29weSB0aGUgJ3BhdGgnIHN0cmluZyBpbnRvIHRoZQorICogaGVhcC4gWW91IG5lZWQgdG8gY2FsbCBzb2NrX2FkZHJlc3NfZG9uZSgpIHRvIHJlbGVhc2UgdGhlIGNvcHkKKyAqLworI2lmIEhBVkVfVU5JWF9TT0NLRVRTCit2b2lkICBzb2NrX2FkZHJlc3NfaW5pdF91bml4KCBTb2NrQWRkcmVzcyogIGEsIGNvbnN0IGNoYXIqICBwYXRoICk7CisjZW5kaWYKKworLyogRmluYWxpemUgYSBzb2NrZXQgYWRkcmVzcywgb25seSBuZWVkZWQgZm9yIG5vdyBmb3IgVW5peCBhZGRyZXNzZXMgKi8KK3ZvaWQgIHNvY2tfYWRkcmVzc19kb25lKCBTb2NrQWRkcmVzcyogIGEgKTsKKworaW50ICAgc29ja19hZGRyZXNzX2VxdWFsKCBjb25zdCBTb2NrQWRkcmVzcyogIGEsIGNvbnN0IFNvY2tBZGRyZXNzKiAgYiApOworCisvKiByZXR1cm4gYSBzdGF0aWMgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFkZHJlc3MgKi8KK2NvbnN0IGNoYXIqICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKCBjb25zdCBTb2NrQWRkcmVzcyogIGEgKTsKKworc3RhdGljIF9faW5saW5lX18KK1NvY2tldEZhbWlseSAgc29ja19hZGRyZXNzX2dldF9mYW1pbHkoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSApCit7CisgICAgcmV0dXJuIGEtPmZhbWlseTsKK30KKworLyogcmV0dXJuIHRoZSBwb3J0IG51bWJlciBvZiBhIGdpdmVuIHNvY2tldCBhZGRyZXNzLCBvciAtMSBpZiBpdCdzIGEgVW5peCBvbmUgKi8KK2ludCAgIHNvY2tfYWRkcmVzc19nZXRfcG9ydCggY29uc3QgU29ja0FkZHJlc3MqICBhICk7CisKKy8qIHNldCB0aGUgcG9ydCBudW1iZXIgb2YgYSBnaXZlbiBzb2NrZXQgYWRkcmVzcywgZG9uJ3QgZG8gYW55dGhpbmcgZm9yIFVuaXggb25lcyAqLwordm9pZCAgc29ja19hZGRyZXNzX3NldF9wb3J0KCBTb2NrQWRkcmVzcyogIGEsIHVpbnQxNl90ICBwb3J0ICk7CisKKy8qIHJldHVybiB0aGUgcGF0aCBvZiBhIGdpdmVuIFVuaXggc29ja2V0LCByZXR1cm5zIE5VTEwgZm9yIG5vbi1Vbml4IG9uZXMgKi8KK2NvbnN0IGNoYXIqICBzb2NrX2FkZHJlc3NfZ2V0X3BhdGgoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSApOworCisvKiByZXR1cm4gdGhlIGluZXQgYWRkcmVzcywgb3IgLTEgaWYgaXQncyBub3QgU09DS0VUX0lORVQgKi8KK2ludCAgIHNvY2tfYWRkcmVzc19nZXRfaXAoIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSApOworCisvKiBidWZwcmludCBhIHNvY2tldCBhZGRyZXNzIGludG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgKi8KK2NoYXIqIGJ1ZnByaW50X3NvY2tfYWRkcmVzcyggY2hhciogIHAsIGNoYXIqICBlbmQsIGNvbnN0IFNvY2tBZGRyZXNzKiAgYSApOworCisvKiByZXNvbHZlIGEgaG9zdG5hbWUgb3IgZGVjaW1hbCBJUHY0L0lQdjYgYWRkcmVzcyBpbnRvIGEgc29ja2V0IGFkZHJlc3MuCisgKiByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gTm90ZSB0aGF0IHRoZSB2YWx1ZXMgb3IgZXJybm8KKyAqIHNldCBieSB0aGlzIGZ1bmN0aW9uIGFyZSB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgRUlOVkFMICAgIDogaW52YWxpZCBhcmd1bWVudAorICogICBFSE9TVERPV04gOiBjb3VsZCBub3QgcmVhY2ggRE5TIHNlcnZlcgorICogICBFTk9FTlQgICAgOiBubyBob3N0IHdpdGggdGhpcyBuYW1lLCBvciBob3N0IGRvZXNuJ3QgaGF2ZSBhbnkgSVAgYWRkcmVzcworICogICBFTk9NRU0gICAgOiBub3QgZW5vdWdoIG1lbW9yeSB0byBwZXJmb3JtIHJlcXVlc3QKKyAqLworaW50ICAgc29ja19hZGRyZXNzX2luaXRfcmVzb2x2ZSggU29ja0FkZHJlc3MqICBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICBob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgcHJlZmVySW42ICk7CisKK2ludCAgc29ja19hZGRyZXNzX2dldF9udW1lcmljX2luZm8oIFNvY2tBZGRyZXNzKiAgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgaG9zdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgc2VydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgc2VydmxlbiApOworCisvKiBTdXBwb3J0IGZvciBsaXN0aW5nIGFsbCBzb2NrZXQgYWRkcmVzc2VzIG9mIGEgZ2l2ZW4gaG9zdCAqLworZW51bSB7CisgICAgU09DS0VUX0xJU1RfUEFTU0lWRSAgICA9ICgxIDw8IDApLAorICAgIFNPQ0tFVF9MSVNUX0ZPUkNFX0lORVQgPSAoMSA8PCAxKSwKKyAgICBTT0NLRVRfTElTVF9GT1JDRV9JTjYgID0gKDEgPDwgMiksCisgICAgU09DS0VUX0xJU1RfREdSQU0gICAgICA9ICgxIDw8IDMpLAorfTsKKworLyogcmVzb2x2ZSBhIGhvc3QgYW5kIHNlcnZpY2UvcG9ydCBuYW1lIGludG8gYSBsaXN0IG9mIFNvY2tBZGRyZXNzIG9iamVjdHMuCisgKiByZXR1cm5zIGEgTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIFNvY2tBZGRyZXNzIHBvaW50ZXJzIG9uIHN1Y2Nlc3MsCisgKiBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2l0aCB0aGUgdmFsdWUgb2YgZXJybm8gc2V0IHRvIG9uZSBvZiB0aGUKKyAqIGZvbGxvd2luZzoKKyAqCisgKiAgICBFSU5WQUwgICAgOiBpbnZhbGlkIGFyZ3VtZW50CisgKiAgICBFSE9TVERPV04gOiBjb3VsZCBub3QgcmVhY2ggRE5TIHNlcnZlcgorICogICAgRU5PRU5UICAgIDogbm8gaG9zdCB3aXRoIHRoaXMgbmFtZSwgb3IgaG9zdCBkb2Vzbid0IGhhdmUgSVAgYWRkcmVzcworICogICAgRU5PTUVNICAgIDogbm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSByZXF1ZXN0CisgKgorICogb3RoZXIgc3lzdGVtLWxldmVsIGVycm9ycyBjYW4gYWxzbyBiZSBzZXQgZGVwZW5kaW5nIG9uIHRoZSBob3N0IHNvY2tldHMKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbG9vcHMgb24gRUlOVFIgc28gdGhlIGNhbGxlciBzaG91bGRuJ3QgaGF2ZSB0byBjaGVjayBmb3IgaXQuCisgKi8KK1NvY2tBZGRyZXNzKiogIHNvY2tfYWRkcmVzc19saXN0X2NyZWF0ZSggY29uc3QgY2hhciogIGhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICAgIGZsYWdzICk7CisKKy8qIHJlc29sdmUgYSBzdHJpbmcgY29udGFpbmluZyBob3N0IGFuZCBwb3J0IG5hbWUgaW50byBhIGxpc3Qgb2YgU29ja0FkZHJlc3MKKyAqIG9iamVjdHMuIFBhcmFtZXRlciBob3N0X2FuZF9wb3J0IHNob3VsZCBiZSBpbiBmb3JtYXQgW2hvc3Q6XXBvcnQsIHdoZXJlCisgKiAnaG9zdCcgYWRkcmVzc2VzIHRoZSBtYWNoaW5lIGFuZCBtdXN0IGJlIHJlc29sdmFibGUgaW50byBhbiBJUCBhZGRyZXNzLCBhbmQKKyAqICdwb3J0JyBpcyBhIGRlY2ltYWwgbnVtZXJpYyB2YWx1ZSBmb3IgdGhlIHBvcnQuICdob3N0JyBpcyBvcHRpb25hbCwgYW5kIGlmCisgKiBvbW1pdGVkLCBsb2NhbGhvc3Qgd2lsbCBiZSB1c2VkLgorICogcmV0dXJucyBhIE5VTEwtdGVybWluYXRlZCBhcnJheSBvZiBTb2NrQWRkcmVzcyBwb2ludGVycyBvbiBzdWNjZXNzLAorICogb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUsIHdpdGggdGhlIHZhbHVlIG9mIGVycm5vIHNldCB0byBvbmUgb2YgdGhlCisgKiBmb2xsb3dpbmc6CisgKgorICogICAgRUlOVkFMICAgIDogaW52YWxpZCBhcmd1bWVudAorICogICAgRUhPU1RET1dOIDogY291bGQgbm90IHJlYWNoIEROUyBzZXJ2ZXIKKyAqICAgIEVOT0VOVCAgICA6IG5vIGhvc3Qgd2l0aCB0aGlzIG5hbWUsIG9yIGhvc3QgZG9lc24ndCBoYXZlIElQIGFkZHJlc3MKKyAqICAgIEVOT01FTSAgICA6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gcmVxdWVzdAorICoKKyAqIG90aGVyIHN5c3RlbS1sZXZlbCBlcnJvcnMgY2FuIGFsc28gYmUgc2V0IGRlcGVuZGluZyBvbiB0aGUgaG9zdCBzb2NrZXRzCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxvb3BzIG9uIEVJTlRSIHNvIHRoZSBjYWxsZXIgc2hvdWxkbid0IGhhdmUgdG8gY2hlY2sgZm9yIGl0LgorICovCitTb2NrQWRkcmVzcyoqICBzb2NrX2FkZHJlc3NfbGlzdF9jcmVhdGUyKGNvbnN0IGNoYXIqICBob3N0X2FuZF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAgICAgZmxhZ3MgKTsKKwordm9pZCBzb2NrX2FkZHJlc3NfbGlzdF9mcmVlKCBTb2NrQWRkcmVzcyoqICBsaXN0ICk7CisKKy8qIGNyZWF0ZSBhIG5ldyBzb2NrZXQsIHJldHVybiB0aGUgc29ja2V0IG51bWJlciBvZiAtMSBvbiBmYWlsdXJlICovCitpbnQgIHNvY2tldF9jcmVhdGUoIFNvY2tldEZhbWlseSAgZmFtaWx5LCBTb2NrZXRUeXBlICB0eXBlICk7CisKKy8qIGNyZWF0ZSBhIG5ldyBzb2NrZXQgaW50ZW5kZWQgZm9yIElQdjQgY29tbXVuaWNhdGlvbi4gcmV0dXJucyB0aGUgc29ja2V0IG51bWJlciwKKyAqIG9yIC0xIG9uIGZhaWx1cmUuCisgKi8KK2ludCAgIHNvY2tldF9jcmVhdGVfaW5ldCggU29ja2V0VHlwZSAgdHlwZSApOworCisvKiBjcmVhdGUgYSBuZXcgc29ja2V0IGludGVuZGVkIGZvciBJUHY2IGNvbW11bmljYXRpb24uIHJldHVybnMgdGhlIHNvY2tldCBudW1iZXIsCisgKiBvciAtMSBvbiBmYWlsdXJlLgorICovCisjaWYgSEFWRV9JTjZfU09DS0VUUworaW50ICAgc29ja2V0X2NyZWF0ZV9pbjYgKCBTb2NrZXRUeXBlICB0eXBlICk7CisjZW5kaWYKKworLyogY3JlYXRlIGEgdW5peC9sb2NhbCBkb21haW4gc29ja2V0LiByZXR1cm5zIHRoZSBzb2NrZXQgbnVtYmVyLAorICogb3IgLTEgb24gZmFpbHVyZS4KKyAqLworI2lmIEhBVkVfVU5JWF9TT0NLRVRTCitpbnQgICBzb2NrZXRfY3JlYXRlX3VuaXgoIFNvY2tldFR5cGUgIHR5cGUgKTsKKyNlbmRpZgorCisvKiByZXR1cm4gdGhlIHR5cGUgb2YgYSBnaXZlbiBzb2NrZXQgKi8KK1NvY2tldFR5cGUgIHNvY2tldF9nZXRfdHlwZShpbnQgIGZkKTsKKworLyogc2V0IFNPX1JFVVNFQUREUiBvbiBVbml4LCBTT19FWENMVVNJVkVBRERSIG9uIFdpbmRvd3MgKi8KK2ludCAgc29ja2V0X3NldF94cmV1c2VhZGRyKGludCAgZmQpOworCisvKiBzZXQgc29ja2V0IGluIG5vbi1ibG9ja2luZyBtb2RlICovCitpbnQgIHNvY2tldF9zZXRfbm9uYmxvY2soaW50IGZkKTsKKworLyogc2V0IHNvY2tldCBpbiBibG9ja2luZyBtb2RlICovCitpbnQgIHNvY2tldF9zZXRfYmxvY2tpbmcoaW50IGZkKTsKKworLyogc2V0IGNvcmsgbW9kZSBvbiBMaW51eCAoaWYgc2V0LCBkb24ndCBzZW5kIHBhcnRpYWwgZnJhbWVzKS4gKi8KK2ludCBzb2NrZXRfc2V0X2NvcmsoaW50IGZkLCBpbnQgdmFsdWUpOworCisvKiBkaXNhYmxlIHRoZSBUQ1AgTmFnbGUgYWxnb3JpdGhtIGZvciBsb3dlciBsYXRlbmN5ICovCitpbnQgIHNvY2tldF9zZXRfbm9kZWxheShpbnQgZmQpOworCisvKiBzZW5kIE9PQiBkYXRhIGlubGluZSBmb3IgdGhpcyBzb2NrZXQgKi8KK2ludCAgc29ja2V0X3NldF9vb2JpbmxpbmUoaW50ICBmZCk7CisKKy8qIGZvcmNlIGxpc3RlbmluZyB0byBJUHY2IGludGVyZmFjZXMgb25seSAqLworaW50ICBzb2NrZXRfc2V0X2lwdjZvbmx5KGludCAgZmQpOworCisvKiByZXRyaWV2ZSBsYXN0IHNvY2tldCBlcnJvciBjb2RlICovCitpbnQgIHNvY2tldF9nZXRfZXJyb3IoaW50ICBmZCk7CisKKy8qIGNsb3NlIGFuIG9wZW5lZCBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGlzIHVubGlrZSB0aGUgVW5peCAnY2xvc2UnIGJlY2F1c2U6CisgKiAtIGl0IHdpbGwgcHJvcGVybHkgc2h1dGRvd24gdGhlIHNvY2tldCBpbiB0aGUgYmFja2dyb3VuZAorICogLSBpdCBkb2VzIG5vdCBtb2RpZnkgZXJybm8KKyAqLwordm9pZCAgc29ja2V0X2Nsb3NlKCBpbnQgIGZkICk7CisKKy8qIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBCU0Qgc29ja2V0cyBvbmVzCisgKi8KK2ludCAgIHNvY2tldF9yZWN2ICAgICggaW50ICBmZCwgdm9pZCogIGJ1ZiwgaW50ICBidWZsZW4gKTsKK2ludCAgIHNvY2tldF9yZWN2ZnJvbSggaW50ICBmZCwgdm9pZCogIGJ1ZiwgaW50ICBidWZsZW4sIFNvY2tBZGRyZXNzKiAgZnJvbSApOworCitpbnQgICBzb2NrZXRfc2VuZCAgKCBpbnQgIGZkLCBjb25zdCB2b2lkKiAgYnVmLCBpbnQgIGJ1ZmxlbiApOworaW50ICAgc29ja2V0X3NlbmRfb29iKCBpbnQgIGZkLCBjb25zdCB2b2lkKiAgYnVmLCBpbnQgIGJ1ZmxlbiApOworaW50ICAgc29ja2V0X3NlbmR0byggaW50ICBmZCwgY29uc3Qgdm9pZCogIGJ1ZiwgaW50ICBidWZsZW4sIGNvbnN0IFNvY2tBZGRyZXNzKiAgdG8gKTsKKworaW50ICAgc29ja2V0X2Nvbm5lY3QoIGludCAgZmQsIGNvbnN0IFNvY2tBZGRyZXNzKiAgYWRkcmVzcyApOworaW50ICAgc29ja2V0X2JpbmQoIGludCAgZmQsIGNvbnN0IFNvY2tBZGRyZXNzKiAgYWRkcmVzcyApOworaW50ICAgc29ja2V0X2dldF9hZGRyZXNzKCBpbnQgIGZkLCBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKTsKK2ludCAgIHNvY2tldF9nZXRfcGVlcl9hZGRyZXNzKCBpbnQgIGZkLCBTb2NrQWRkcmVzcyogIGFkZHJlc3MgKTsKK2ludCAgIHNvY2tldF9saXN0ZW4oIGludCAgZmQsIGludCAgYmFja2xvZyApOworaW50ICAgc29ja2V0X2FjY2VwdCggaW50ICBmZCwgU29ja0FkZHJlc3MqICBhZGRyZXNzICk7CisKKy8qIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGZyb20gYSBzb2NrZXQgKi8KK2ludCAgIHNvY2tldF9jYW5fcmVhZCggaW50ICBmZCApOworCisvKiB0aGlzIGNhbGwgY3JlYXRlcyBhIHBhaXIgb2Ygbm9uLWJsb2NraW5nIHNvY2tldHMgY29ubmVjdGVkCisgKiB0byBlYWNoIG90aGVyLiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgVW5peCBmdW5jdGlvbjoKKyAqIHNvY2tldHBhaXIoQUZfTE9DQUwsU09DS19TVFJFQU0sMCwmZmRzKQorICoKKyAqIG9uIFdpbmRvd3MsIHRoaXMgd2lsbCB1c2UgYSBwYWlyIG9mIFRDUCBsb29wYmFjayBzb2NrZXRzIGluc3RlYWQKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4KKyAqLworaW50ICBzb2NrZXRfcGFpcihpbnQgICpmZDEsIGludCAqZmQyKTsKKworLyogY3JlYXRlIGEgc2VydmVyIHNvY2tldCBsaXN0ZW5pbmcgb24gdGhlIGhvc3QncyBsb29wYmFjayBpbnRlcmZhY2UgKi8KK2ludCAgc29ja2V0X2xvb3BiYWNrNF9zZXJ2ZXIoIGludCAgcG9ydCwgU29ja2V0VHlwZSAgdHlwZSApOworaW50ICBzb2NrZXRfbG9vcGJhY2s2X3NlcnZlciggaW50ICBwb3J0LCBTb2NrZXRUeXBlICB0eXBlICk7CisKKy8qIGNvbm5lY3QgdG8gYSBwb3J0IG9uIHRoZSBob3N0J3MgbG9vcGJhY2sgaW50ZXJmYWNlICovCitpbnQgIHNvY2tldF9sb29wYmFjazRfY2xpZW50KCBpbnQgIHBvcnQsIFNvY2tldFR5cGUgIHR5cGUgKTsKK2ludCAgc29ja2V0X2xvb3BiYWNrNl9jbGllbnQoIGludCAgcG9ydCwgU29ja2V0VHlwZSAgdHlwZSApOworCisvKiBjcmVhdGUgYSBzZXJ2ZXIgc29ja2V0IGxpc3RlbmluZyB0byBhIFVuaXggZG9tYWluIHBhdGggKi8KKyNpZiBIQVZFX1VOSVhfU09DS0VUUworaW50ICBzb2NrZXRfdW5peF9zZXJ2ZXIoIGNvbnN0IGNoYXIqICBuYW1lLCBTb2NrZXRUeXBlICB0eXBlICk7CisjZW5kaWYKKworLyogY3JlYXRlIGEgVW5peCBzb2NrZXRzIGFuZCBjb25uZWN0cyBpdCB0byBhIFVuaXggc2VydmVyICovCisjaWYgSEFWRV9VTklYX1NPQ0tFVFMKK2ludCAgc29ja2V0X3VuaXhfY2xpZW50KCBjb25zdCBjaGFyKiAgbmFtZSwgU29ja2V0VHlwZSAgdHlwZSApOworI2VuZGlmCisKKy8qIGNyZWF0ZSBhbiBJUHY0IGNsaWVudCBzb2NrZXQgYW5kIGNvbm5lY3QgaXQgdG8gYSBnaXZlbiBob3N0ICovCitpbnQgIHNvY2tldF9uZXR3b3JrX2NsaWVudCggY29uc3QgY2hhciogIGhvc3QsIGludCAgcG9ydCwgU29ja2V0VHlwZSAgdHlwZSApOworCisvKiBjcmVhdGUgYW4gSVB2NCBzb2NrZXQgYW5kIGJpbmRzIGl0IHRvIGEgZ2l2ZW4gcG9ydCBvZiB0aGUgaG9zdCdzIGludGVyZmFjZSAqLworaW50ICBzb2NrZXRfYW55YWRkcl9zZXJ2ZXIoIGludCAgcG9ydCwgU29ja2V0VHlwZSAgdHlwZSApOworCisvKiBhY2NlcHQgYSBjb25uZWN0aW9uIGZyb20gdGhlIGhvc3QncyBhbnkgaW50ZXJmYWNlLCByZXR1cm4gdGhlIG5ldyBzb2NrZXQKKyAqIGRlc2NyaXB0b3Igb3IgLTEgKi8KK2ludCAgc29ja2V0X2FjY2VwdF9hbnkoIGludCAgc2VydmVyX2ZkICk7CisKKworaW50ICBzb2NrZXRfbWNhc3RfaW5ldF9hZGRfbWVtYmVyc2hpcCggaW50ICBzLCB1aW50MzJfdCAgaXAgKTsKK2ludCAgc29ja2V0X21jYXN0X2luZXRfZHJvcF9tZW1iZXJzaGlwKCBpbnQgIHMsIHVpbnQzMl90ICBpcCApOworaW50ICBzb2NrZXRfbWNhc3RfaW5ldF9zZXRfbG9vcCggaW50ICBzLCBpbnQgIGVuYWJsZWQgKTsKK2ludCAgc29ja2V0X21jYXN0X2luZXRfc2V0X3R0bCggaW50ICBzLCBpbnQgIHR0bCApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRzX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zb2NrZXRzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjA0OTZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3NvY2tldHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisKK1RFU1QoU29ja0FkZHJlc3MsIFJlc29sdmVBbmRUb1N0cmluZykgeworICAgIFNvY2tBZGRyZXNzIHNbMV07CisKKyAgICBFWFBFQ1RfRVEoMCAsc29ja19hZGRyZXNzX2luaXRfcmVzb2x2ZShzLCAiMjE2LjU4LjE5NC4xNjQiLCA1MywgMCkpOworICAgIEVYUEVDVF9TVFJFUSgiMjE2LjU4LjE5NC4xNjQ6NTMiLCBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKHMpKTsKKworICAgIEVYUEVDVF9FUSgwICxzb2NrX2FkZHJlc3NfaW5pdF9yZXNvbHZlKHMsICIyMDAxOjQ4NjA6ZjgwMjo6OWIiLCA1MywgMCkpOworICAgIEVYUEVDVF9TVFJFUSgiWzIwMDE6NDg2MDpmODAyOjo5Yl06NTMiLCBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKHMpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJhbGxvYy5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZDgwMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJhbGxvYy5jCkBAIC0wLDAgKzEsMzM0IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmFsbG9jLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbWlzYy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY190YWJ1bGFyKCBzdHJhbGxvY190KiAgb3V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHN0cmluZ3MsIGludCAgY291bnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJlZml4LCAgaW50ICB3aWR0aCApCit7CisgICAgaW50ICBucm93cywgbmNvbHMsIHIsIGMsIG4sIG1heHcgPSAwOworCisgICAgZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKyAgICAgICAgaW50ICBsZW4gPSBzdHJsZW4oc3RyaW5nc1tuXSk7CisgICAgICAgIGlmIChsZW4gPiBtYXh3KQorICAgICAgICAgICAgbWF4dyA9IGxlbjsKKyAgICB9CisgICAgbWF4dyArPSAyOworICAgIG5jb2xzID0gd2lkdGgvbWF4dzsKKyAgICBucm93cyA9IChjb3VudCArIG5jb2xzLTEpL25jb2xzOworCisgICAgZm9yIChyID0gMDsgciA8IG5yb3dzOyByKyspIHsKKyAgICAgICAgc3RyYWxsb2NfYWRkX3N0ciggb3V0LCBwcmVmaXggKTsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IG5jb2xzOyBjKyspIHsKKyAgICAgICAgICAgIGludCAgaW5kZXggPSBjKm5yb3dzICsgcjsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyYWxsb2NfYWRkX2Zvcm1hdCggb3V0LCAiJS0qcyIsIG1heHcsIHN0cmluZ3NbaW5kZXhdICk7CisgICAgICAgIH0KKyAgICAgICAgc3RyYWxsb2NfYWRkX3N0ciggb3V0LCAiXG4iICk7CisgICAgfQorfQorCisvKiogRFlOQU1JQyBTVFJJTkdTCisgKiovCisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19yZXNldCggc3RyYWxsb2NfdCogIHMgKQoreworICAgIGZyZWUocy0+cyk7CisgICAgcy0+cyA9IE5VTEw7CisgICAgcy0+biA9IDA7CisgICAgcy0+YSA9IDA7Cit9CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19yZWFkeSggc3RyYWxsb2NfdCogIHMsIHVuc2lnbmVkIGludCAgbGVuICkKK3sKKyAgICB1bnNpZ25lZCAgb2xkX21heCA9IHMtPmE7CisgICAgdW5zaWduZWQgIG5ld19tYXggPSBvbGRfbWF4OworCisgICAgd2hpbGUgKG5ld19tYXggPCBsZW4pIHsKKyAgICAgICAgdW5zaWduZWQgIG5ld19tYXgyID0gbmV3X21heCArIChuZXdfbWF4ID4+IDEpICsgMTY7CisgICAgICAgIGlmIChuZXdfbWF4MiA8IG5ld19tYXgpCisgICAgICAgICAgICBuZXdfbWF4MiA9IFVJTlRfTUFYOworICAgICAgICBuZXdfbWF4ID0gbmV3X21heDI7CisgICAgfQorCisgICAgcy0+cyA9IHJlYWxsb2MoIHMtPnMsIG5ld19tYXggKTsKKyAgICBpZiAocy0+cyA9PSBOVUxMKSB7CisgICAgICAgIGRlcnJvciggIiVzOiBub3QgZW5vdWdoIG1lbW9yeSB0byByZWFsbG9jYXRlICVsZCBieXRlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdfbWF4ICk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHMtPmEgPSBuZXdfbWF4OworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfcmVhZHlwbHVzKCBzdHJhbGxvY190KiAgcywgdW5zaWduZWQgaW50ICBsZW4gKQoreworICAgIHVuc2lnbmVkICBsZW4yID0gcy0+biArIGxlbjsKKworICAgIGlmIChsZW4yIDwgcy0+bikgeyAvKiBvdmVyZmxvdyA/ICovCisgICAgICAgIGRlcnJvcigiJXM6IHRyeWluZyB0byBncm93IGJ5IHRvbyBtYW55IGJ5dGVzOiAlbGQiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsZW4pOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBzdHJhbGxvY19yZWFkeSggcywgbGVuMiApOworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfY29weSggc3RyYWxsb2NfdCogIHMsIHN0cmFsbG9jX3QqICBmcm9tICkKK3sKKyAgICBzdHJhbGxvY19yZWFkeShzLCBmcm9tLT5uKTsKKyAgICBtZW1jcHkoIHMtPnMsIGZyb20tPnMsIGZyb20tPm4gKTsKKyAgICBzLT5uID0gZnJvbS0+bjsKK30KKworZXh0ZXJuIHZvaWQKK3N0cmFsbG9jX2FwcGVuZCggc3RyYWxsb2NfdCogIHMsIHN0cmFsbG9jX3QqICBmcm9tICkKK3sKKyAgICBzdHJhbGxvY19yZWFkeXBsdXMoIHMsIGZyb20tPm4gKTsKKyAgICBtZW1jcHkoIHMtPnMgKyBzLT5uLCBmcm9tLT5zLCBmcm9tLT5uICk7CisgICAgcy0+biArPSBmcm9tLT5uOworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfYWRkX2MoIHN0cmFsbG9jX3QqICBzLCBpbnQgIGMgKQoreworICAgIHN0cmFsbG9jX2FkZF9ieXRlcyggcywgKGNoYXIqKSZjLCAxICk7Cit9CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19hZGRfc3RyKCBzdHJhbGxvY190KiAgcywgY29uc3QgY2hhciogIHN0ciApCit7CisgICAgc3RyYWxsb2NfYWRkX2J5dGVzKCBzLCBzdHIsIHN0cmxlbihzdHIpICk7Cit9CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19hZGRfYnl0ZXMoIHN0cmFsbG9jX3QqICBzLCBjb25zdCB2b2lkKiAgZnJvbSwgdW5zaWduZWQgbGVuICkKK3sKKyAgICBzdHJhbGxvY19yZWFkeXBsdXMoIHMsIGxlbiApOworICAgIG1lbWNweSggcy0+cyArIHMtPm4sIGZyb20sIGxlbiApOworICAgIHMtPm4gKz0gbGVuOworfQorCitleHRlcm4gY2hhcioKK3N0cmFsbG9jX2NzdHIoIHN0cmFsbG9jX3QqICBzICkKK3sKKyAgICBzdHJhbGxvY19yZWFkeXBsdXMoIHMsIDEgKTsKKyAgICBzLT5zW3MtPm5dID0gMDsKKyAgICByZXR1cm4gcy0+czsKK30KKwordm9pZAorc3RyYWxsb2NfbHN0cmlwKCBzdHJhbGxvY190KiAgcyApCit7CisgICAgaW50ICBjb3VudDsKKworICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHMtPm47IGNvdW50KyspIHsKKyAgICAgICAgaWYgKHMtPnNbY291bnRdICE9ICcgJyAmJiBzLT5zW2NvdW50XSAhPSAnXHQnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICBtZW1tb3ZlKHMtPnMsIHMtPnMgKyBjb3VudCwgcy0+biAtIGNvdW50KTsKKyAgICAgICAgcy0+biAtPSBjb3VudDsKKyAgICB9Cit9CisKK3ZvaWQKK3N0cmFsbG9jX3JzdHJpcCggc3RyYWxsb2NfdCogIHMgKQoreworICAgIGludCAgY291bnQgPSBzLT5uOworCisgICAgd2hpbGUgKGNvdW50ID4gMCAmJiAocy0+c1tjb3VudC0xXSA9PSAnICcgfHwgcy0+c1tjb3VudC0xXSA9PSAnXHQnKSkKKyAgICAgICAgY291bnQtLTsKKworICAgIHMtPm4gPSBjb3VudDsKK30KKwordm9pZAorc3RyYWxsb2Nfc3RyaXAoIHN0cmFsbG9jX3QqIHMgKQoreworICAgIHN0cmFsbG9jX3JzdHJpcChzKTsKKyAgICBzdHJhbGxvY19sc3RyaXAocyk7Cit9CisKK2V4dGVybiBjaGFyKgorc3RyYWxsb2NfdG9fdGVtcHN0ciggc3RyYWxsb2NfdCogIHMgKQoreworICAgIGNoYXIqICBxID0gdGVtcHN0cl9nZXQoIHMtPm4gKTsKKworICAgIG1lbWNweSggcSwgcy0+cywgcy0+biApOworICAgIHFbcy0+bl0gPSAwOworICAgIHJldHVybiBxOworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfZm9ybWF0diggc3RyYWxsb2NfdCogIHMsIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKQoreworICAgIHN0cmFsbG9jX3Jlc2V0KHMpOworICAgIHN0cmFsbG9jX3JlYWR5KHMsMTApOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50ICAgICAgbjsKKyAgICAgICAgdmFfbGlzdCAgYXJnczI7CisKKyAgICAgICAgdmFfY29weShhcmdzMiwgYXJncyk7CisgICAgICAgIG4gPSB2c25wcmludGYoIHMtPnMsIHMtPmEsIGZtdCwgYXJnczIgKTsKKyAgICAgICAgdmFfZW5kKGFyZ3MyKTsKKworICAgICAgICAvKiBmdW5reSBvbGQgQyBsaWJyYXJpZXMgcmV0dXJucyAtMSB3aGVuIHRydW5jYXRpb24gb2NjdXJzICovCisgICAgICAgIGlmIChuID4gLTEgJiYgbiA8IHMtPmEpIHsKKyAgICAgICAgICAgIHMtPm4gPSBuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG4gPiAtMSkgeyAgLyogd2Ugbm93IHByZWNpc2VseSB3aGF0IHdlIG5lZWQgKi8KKyAgICAgICAgICAgIHN0cmFsbG9jX3JlYWR5KCBzLCBuKzEgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmFsbG9jX3JlYWR5KCBzLCBzLT5hKjIgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitleHRlcm4gdm9pZAorc3RyYWxsb2NfZm9ybWF0KCBzdHJhbGxvY190KiAgcywgY29uc3QgY2hhciogIGZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0ICBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgc3RyYWxsb2NfZm9ybWF0dihzLCBmbXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKworZXh0ZXJuIHZvaWQKK3N0cmFsbG9jX2FkZF9mb3JtYXR2KCBzdHJhbGxvY190KiAgcywgY29uc3QgY2hhciogIGZtdCwgdmFfbGlzdCAgYXJncyApCit7CisgICAgU1RSQUxMT0NfREVGSU5FKHMyKTsKKyAgICBzdHJhbGxvY19mb3JtYXR2KHMyLCBmbXQsIGFyZ3MpOworICAgIHN0cmFsbG9jX2FwcGVuZCggcywgczIgKTsKKyAgICBzdHJhbGxvY19yZXNldCggczIgKTsKK30KKworZXh0ZXJuIHZvaWQKK3N0cmFsbG9jX2FkZF9mb3JtYXQoIHN0cmFsbG9jX3QqICBzLCBjb25zdCBjaGFyKiAgZm10LCAuLi4gKQoreworICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICBzdHJhbGxvY19hZGRfZm9ybWF0diggcywgZm10LCBhcmdzICk7CisgICAgdmFfZW5kKGFyZ3MpOworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfYWRkX3F1b3RlX2MoIHN0cmFsbG9jX3QqICBzLCBpbnQgIGMgKQoreworICAgIHN0cmFsbG9jX2FkZF9xdW90ZV9ieXRlcyggcywgKGNoYXIqKSZjLCAxICk7Cit9CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19hZGRfcXVvdGVfc3RyKCBzdHJhbGxvY190KiAgcywgY29uc3QgY2hhciogIHN0ciApCit7CisgICAgc3RyYWxsb2NfYWRkX3F1b3RlX2J5dGVzKCBzLCBzdHIsIHN0cmxlbihzdHIpICk7Cit9CisKK2V4dGVybiB2b2lkCitzdHJhbGxvY19hZGRfcXVvdGVfYnl0ZXMoIHN0cmFsbG9jX3QqICBzLCBjb25zdCB2b2lkKiAgZnJvbSwgdW5zaWduZWQgIGxlbiApCit7CisgICAgdWludDhfdCogICBwICAgPSAodWludDhfdCopIGZyb207CisgICAgdWludDhfdCogICBlbmQgPSBwICsgbGVuOworCisgICAgZm9yICggOyBwIDwgZW5kOyBwKysgKSB7CisgICAgICAgIGludCAgYyA9IHBbMF07CisKKyAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX3N0ciggcywgIlxcXFwiICk7CisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnICcgJiYgYyA8IDEyOCkgeworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX2MoIHMsIGMgKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgIHN0cmFsbG9jX2FkZF9zdHIoIHMsICJcXG4iICk7CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHQnKSB7CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfc3RyKCBzLCAiXFx0IiApOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgc3RyYWxsb2NfYWRkX3N0ciggcywgIlxcciIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmFsbG9jX2FkZF9mb3JtYXQoIHMsICJcXHglMDJ4IiwgYyApOworICAgICAgICB9CisgICAgfQorfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfYWRkX2hleCggc3RyYWxsb2NfdCogIHMsIHVuc2lnbmVkICB2YWx1ZSwgaW50ICBudW1fZGlnaXRzICkKK3sKKyAgICBjb25zdCBjaGFyICAgaGV4ZGlnaXRzWzE2XSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICBpbnQgICAgICAgICAgbm47CisKKyAgICBpZiAobnVtX2RpZ2l0cyA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBzdHJhbGxvY19yZWFkeXBsdXMocywgbnVtX2RpZ2l0cyk7CisgICAgZm9yIChubiA9IG51bV9kaWdpdHMtMTsgbm4gPj0gMDsgbm4tLSkgeworICAgICAgICBzLT5zW3MtPm4rbm5dID0gaGV4ZGlnaXRzW3ZhbHVlICYgMTVdOworICAgICAgICB2YWx1ZSA+Pj0gNDsKKyAgICB9CisgICAgcy0+biArPSBudW1fZGlnaXRzOworfQorCitleHRlcm4gdm9pZAorc3RyYWxsb2NfYWRkX2hleGR1bXAoIHN0cmFsbG9jX3QqICBzLCB2b2lkKiAgYmFzZSwgaW50ICBzaXplLCBjb25zdCBjaGFyKiAgcHJlZml4ICkKK3sKKyAgICB1aW50OF90KiAgIHAgICAgICAgICAgPSAodWludDhfdCopYmFzZTsKKyAgICBjb25zdCBpbnQgIG1heF9jb3VudCAgPSAxNjsKKyAgICBpbnQgICAgICAgIHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBpbnQgICAgICAgICAgY291bnQgPSBzaXplID4gbWF4X2NvdW50ID8gbWF4X2NvdW50IDogc2l6ZTsKKyAgICAgICAgaW50ICAgICAgICAgIGNvdW50MjsKKyAgICAgICAgaW50ICAgICAgICAgIG47CisKKyAgICAgICAgc3RyYWxsb2NfYWRkX2J5dGVzKCBzLCBwcmVmaXgsIHByZWZpeF9sZW4gKTsKKyAgICAgICAgc3RyYWxsb2NfYWRkX2hleCggcywgcFswXSwgMiApOworCisgICAgICAgIGZvciAobiA9IDE7IG4gPCBjb3VudDsgbisrKSB7CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfYyggcywgJyAnICk7CisgICAgICAgICAgICBzdHJhbGxvY19hZGRfaGV4KCBzLCBwW25dLCAyICk7CisgICAgICAgIH0KKworICAgICAgICBjb3VudDIgPSA0ICsgMyoobWF4X2NvdW50IC0gY291bnQpOworICAgICAgICBzdHJhbGxvY19yZWFkeXBsdXMoIHMsIGNvdW50MiApOworICAgICAgICBtZW1zZXQoIHMtPnMgKyBzLT5uLCAnICcsIGNvdW50MiApOworICAgICAgICBzLT5uICs9IGNvdW50MjsKKworICAgICAgICBzdHJhbGxvY19yZWFkeXBsdXMocywgY291bnQrMSk7CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisgICAgICAgICAgICBpbnQgIGMgPSBwW25dOworCisgICAgICAgICAgICBpZiAoYyA8IDMyIHx8IGMgPiAxMjcpCisgICAgICAgICAgICAgICAgYyA9ICcuJzsKKworICAgICAgICAgICAgcy0+c1tzLT5uKytdID0gYzsKKyAgICAgICAgfQorICAgICAgICBzLT5zW3MtPm4rK10gPSAnXG4nOworCisgICAgICAgIHNpemUgLT0gY291bnQ7CisgICAgICAgIHAgICAgKz0gY291bnQ7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyYWxsb2MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2JmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyYWxsb2MuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qKiBEWU5BTUlDIFNUUklOR1MKKyAqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIqICAgICBzOworICAgIHVuc2lnbmVkICBuOworICAgIHVuc2lnbmVkICBhOworfSBzdHJhbGxvY190OworCisjZGVmaW5lICBTVFJBTExPQ19JTklUICAgICAgICB7IE5VTEwsIDAsIDAgfQorI2RlZmluZSAgU1RSQUxMT0NfREVGSU5FKHMpICAgc3RyYWxsb2NfdCAgIHNbMV0gPSB7IFNUUkFMTE9DX0lOSVQgfQorCitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX3Jlc2V0KCBzdHJhbGxvY190KiAgcyApOworZXh0ZXJuIHZvaWQgICBzdHJhbGxvY19yZWFkeSggc3RyYWxsb2NfdCogIHMsIHVuc2lnbmVkICBsZW4gKTsKK2V4dGVybiB2b2lkICAgc3RyYWxsb2NfcmVhZHlwbHVzKCBzdHJhbGxvY190KiAgcywgdW5zaWduZWQgIGxlbiApOworCitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2NvcHkoIHN0cmFsbG9jX3QqICBzLCBzdHJhbGxvY190KiAgZnJvbSApOworZXh0ZXJuIHZvaWQgICBzdHJhbGxvY19hcHBlbmQoIHN0cmFsbG9jX3QqICBzLCBzdHJhbGxvY190KiAgZnJvbSApOworCitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9jKCBzdHJhbGxvY190KiAgcywgaW50ICBjICk7CitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9zdHIoIHN0cmFsbG9jX3QqICBzLCBjb25zdCBjaGFyKiAgc3RyICk7CitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9ieXRlcyggc3RyYWxsb2NfdCogIHMsIGNvbnN0IHZvaWQqICBmcm9tLCB1bnNpZ25lZCAgbGVuICk7CisKK2V4dGVybiBjaGFyKiAgc3RyYWxsb2NfY3N0ciggc3RyYWxsb2NfdCogIHMgKTsKKworZXh0ZXJuIHZvaWQgICBzdHJhbGxvY19mb3JtYXQoIHN0cmFsbG9jX3QqICBzLCBjb25zdCBjaGFyKiAgZm10LCAuLi4gKTsKK2V4dGVybiB2b2lkICAgc3RyYWxsb2NfZm9ybWF0diggc3RyYWxsb2NfdCogIHMsIGNvbnN0IGNoYXIqICBmbXQsIHZhX2xpc3QgIGFyZ3MgKTsKK2V4dGVybiB2b2lkICAgc3RyYWxsb2NfYWRkX2Zvcm1hdCggc3RyYWxsb2NfdCogIHMsIGNvbnN0IGNoYXIqICBmbXQsIC4uLiApOworCitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9xdW90ZV9jKCBzdHJhbGxvY190KiAgcywgaW50ICBjICk7CitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9xdW90ZV9zdHIoIHN0cmFsbG9jX3QqICBzLCBjb25zdCBjaGFyKiAgc3RyICk7CitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9xdW90ZV9ieXRlcyggc3RyYWxsb2NfdCogIHMsIGNvbnN0IHZvaWQqICBmcm9tLCB1bnNpZ25lZCAgIGxlbiApOworCitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX2FkZF9oZXgoIHN0cmFsbG9jX3QqICBzLCB1bnNpZ25lZCAgdmFsdWUsIGludCAgbnVtX2RpZ2l0cyApOworZXh0ZXJuIHZvaWQgICBzdHJhbGxvY19hZGRfaGV4ZHVtcCggc3RyYWxsb2NfdCogIHMsIHZvaWQqICBiYXNlLCBpbnQgIHNpemUsIGNvbnN0IGNoYXIqICBwcmVmaXggKTsKKworLyogUmVtb3ZlIGxlYWRpbmcsIHRyYWlsaW5nIG9yIGxlYWRpbmcrdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworZXh0ZXJuIHZvaWQgICBzdHJhbGxvY19sc3RyaXAoIHN0cmFsbG9jX3QqICBzICk7CitleHRlcm4gdm9pZCAgIHN0cmFsbG9jX3JzdHJpcCggc3RyYWxsb2NfdCogIHMgKTsKK2V4dGVybiB2b2lkICAgc3RyYWxsb2Nfc3RyaXAoIHN0cmFsbG9jX3QqICBzICk7CisKK2V4dGVybiB2b2lkICAgc3RyYWxsb2NfdGFidWxhciggc3RyYWxsb2NfdCogIHMsIGNvbnN0IGNoYXIqKiBzdHJpbmdzLCBpbnQgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByZWZpeCwgIGludCAgd2lkdGggKTsKKworZXh0ZXJuIGNoYXIqICBzdHJhbGxvY190b190ZW1wc3RyKCBzdHJhbGxvY190KiAgcyApOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJlYW0uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJlYW0uY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJlYW0uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9maWxlcy9TdHJlYW0uaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSBCYXNlU3RyZWFtOworCitzdGF0aWMgQmFzZVN0cmVhbSogYXNCYXNlU3RyZWFtKFN0cmVhbSogc3RyZWFtKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QmFzZVN0cmVhbSo+KHN0cmVhbSk7Cit9CisKK3NzaXplX3Qgc3RyZWFtX3JlYWQoU3RyZWFtKiBzdHJlYW0sIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgeworICAgIHJldHVybiBhc0Jhc2VTdHJlYW0oc3RyZWFtKS0+cmVhZChidWZmZXIsIGxlbik7Cit9CisKK3NzaXplX3Qgc3RyZWFtX3dyaXRlKFN0cmVhbSogc3RyZWFtLCBjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKKyAgICByZXR1cm4gYXNCYXNlU3RyZWFtKHN0cmVhbSktPndyaXRlKGJ1ZmZlciwgbGVuKTsKK30KKwordm9pZCBzdHJlYW1fcHV0X2J5dGUoU3RyZWFtKiBzdHJlYW0sIGludCB2KSB7CisgICAgYXNCYXNlU3RyZWFtKHN0cmVhbSktPnB1dEJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4odikpOworfQorCit2b2lkIHN0cmVhbV9wdXRfYmUxNihTdHJlYW0qIHN0cmVhbSwgdWludDE2X3QgdikgeworICAgIGFzQmFzZVN0cmVhbShzdHJlYW0pLT5wdXRCZTE2KHYpOworfQorCit2b2lkIHN0cmVhbV9wdXRfYmUzMihTdHJlYW0qIHN0cmVhbSwgdWludDMyX3QgdikgeworICAgIGFzQmFzZVN0cmVhbShzdHJlYW0pLT5wdXRCZTMyKHYpOworfQorCit2b2lkIHN0cmVhbV9wdXRfYmU2NChTdHJlYW0qIHN0cmVhbSwgdWludDY0X3QgdikgeworICAgIGFzQmFzZVN0cmVhbShzdHJlYW0pLT5wdXRCZTY0KHYpOworfQorCit1aW50OF90IHN0cmVhbV9nZXRfYnl0ZShTdHJlYW0qIHN0cmVhbSkgeworICAgIHJldHVybiBhc0Jhc2VTdHJlYW0oc3RyZWFtKS0+Z2V0Qnl0ZSgpOworfQorCit1aW50MTZfdCBzdHJlYW1fZ2V0X2JlMTYoU3RyZWFtKiBzdHJlYW0pIHsKKyAgICByZXR1cm4gYXNCYXNlU3RyZWFtKHN0cmVhbSktPmdldEJlMTYoKTsKK30KKwordWludDMyX3Qgc3RyZWFtX2dldF9iZTMyKFN0cmVhbSogc3RyZWFtKSB7CisgICAgcmV0dXJuIGFzQmFzZVN0cmVhbShzdHJlYW0pLT5nZXRCZTMyKCk7Cit9CisKK3VpbnQ2NF90IHN0cmVhbV9nZXRfYmU2NChTdHJlYW0qIHN0cmVhbSkgeworICAgIHJldHVybiBhc0Jhc2VTdHJlYW0oc3RyZWFtKS0+Z2V0QmU2NCgpOworfQorCit2b2lkIHN0cmVhbV9wdXRfZmxvYXQoU3RyZWFtKiBzdHJlYW0sIGZsb2F0IHYpIHsKKyAgICBhc0Jhc2VTdHJlYW0oc3RyZWFtKS0+cHV0RmxvYXQodik7Cit9CisKK2Zsb2F0IHN0cmVhbV9nZXRfZmxvYXQoU3RyZWFtKiBzdHJlYW0pIHsKKyAgICByZXR1cm4gYXNCYXNlU3RyZWFtKHN0cmVhbSktPmdldEZsb2F0KCk7Cit9CisKK3ZvaWQgc3RyZWFtX3B1dF9zdHJpbmcoU3RyZWFtKiBzdHJlYW0sIGNvbnN0IGNoYXIqIHN0cikgeworICAgIGFzQmFzZVN0cmVhbShzdHJlYW0pLT5wdXRTdHJpbmcoc3RyKTsKK30KKworY2hhciogc3RyZWFtX2dldF9zdHJpbmcoU3RyZWFtKiBzdHJlYW0pIHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBhc0Jhc2VTdHJlYW0oc3RyZWFtKS0+Z2V0U3RyaW5nKCk7CisgICAgaWYgKHJldC5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjaGFyKiByZXN1bHQgPSBzdGF0aWNfY2FzdDxjaGFyKj4oOjptYWxsb2MocmV0LnNpemUoKSArIDFVKSk7CisgICAgOjptZW1jcHkocmVzdWx0LCByZXQuY19zdHIoKSwgcmV0LnNpemUoKSArIDFVKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHN0cmVhbV9mcmVlKFN0cmVhbSogc3RyZWFtKSB7CisgICAgZGVsZXRlIGFzQmFzZVN0cmVhbShzdHJlYW0pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmVhbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTRhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyZWFtLmgKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gT3BhcXVlIGRlY2xhcmF0aW9uIGZvciBhbiBvYmplY3QgbW9kZWxsaW5nIGEgc3RyZWFtIG9mIGJ5dGVzLgorLy8gVGhpcyByZWFsbHkgaXMgYmFja2VkIGJ5IGFuIGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSBpbXBsZW1lbnRhdGlvbi4KK3R5cGVkZWYgc3RydWN0IFN0cmVhbSBTdHJlYW07CisKK3NzaXplX3Qgc3RyZWFtX3JlYWQoU3RyZWFtKiBzdHJlYW0sIHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworc3NpemVfdCBzdHJlYW1fd3JpdGUoU3RyZWFtKiBzdHJlYW0sIGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOworCit2b2lkIHN0cmVhbV9wdXRfYnl0ZShTdHJlYW0qIHN0cmVhbSwgaW50IHYpOwordm9pZCBzdHJlYW1fcHV0X2JlMTYoU3RyZWFtKiBzdHJlYW0sIHVpbnQxNl90IHYpOwordm9pZCBzdHJlYW1fcHV0X2JlMzIoU3RyZWFtKiBzdHJlYW0sIHVpbnQzMl90IHYpOwordm9pZCBzdHJlYW1fcHV0X2JlNjQoU3RyZWFtKiBzdHJlYW0sIHVpbnQ2NF90IHYpOworCit1aW50OF90IHN0cmVhbV9nZXRfYnl0ZShTdHJlYW0qIHN0cmVhbSk7Cit1aW50MTZfdCBzdHJlYW1fZ2V0X2JlMTYoU3RyZWFtKiBzdHJlYW0pOwordWludDMyX3Qgc3RyZWFtX2dldF9iZTMyKFN0cmVhbSogc3RyZWFtKTsKK3VpbnQ2NF90IHN0cmVhbV9nZXRfYmU2NChTdHJlYW0qIHN0cmVhbSk7CisKK3ZvaWQgc3RyZWFtX3B1dF9mbG9hdChTdHJlYW0qIHN0cmVhbSwgZmxvYXQgdik7CitmbG9hdCBzdHJlYW1fZ2V0X2Zsb2F0KFN0cmVhbSogc3RyZWFtKTsKKwordm9pZCBzdHJlYW1fcHV0X3N0cmluZyhTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogc3RyKTsKKworLy8gUmV0dXJuIGEgaGVhcC1hbGxvY2F0ZWQgc3RyaW5nLCBvciBOVUxMIGlmIGVtcHR5IHN0cmluZyBvciBlcnJvci4KKy8vIENhbGxlciBtdXN0IGZyZWUoKSB0aGUgcmVzdHVybmVkIHZhbHVlLgorY2hhciogc3RyZWFtX2dldF9zdHJpbmcoU3RyZWFtKiBzdHJlYW0pOworCit2b2lkIHN0cmVhbV9mcmVlKFN0cmVhbSogc3RyZWFtKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5nLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGI5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5nLmNwcApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQorCisvLyBhbHJlYWR5IGRlZmluZWQgaW4gQyBsaWJyYXJ5CisKKyNlbHNlIC8vIF9fbGludXhfXyAmJiBfV0lOMzIKKworLy8gTk9URTogbGludXggaGFzIHRoaXMgZGVmaW5lZCBpbiBsaWJic2QgaWYgd2Ugd2FudCB0byBzd2l0Y2ggdG8KKy8vIHRoYXQgc29tZSBkYXkKKworc2l6ZV90IHN0cmxjcHkoY2hhciogZHN0LCBjb25zdCBjaGFyICogc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBzaXplX3Qgc3JjTGVuID0gc3RybGVuKHNyYyk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHNpemVfdCBjb3B5TGVuID0gc3RkOjptaW4oc3JjTGVuLCBzaXplLTEpOworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGNvcHlMZW4pOworICAgICAgICBkc3RbY29weUxlbl0gPSAwOworICAgIH0KKyAgICByZXR1cm4gc3JjTGVuOworfQorCisjZW5kaWYKKworYm9vbCBzdHJfYmVnaW5zX3dpdGgoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICByZXR1cm4gc3RybmNtcChwcmVmaXgsIHN0cmluZywgc3RybGVuKHByZWZpeCkpID09IDA7Cit9CisKK2Jvb2wgc3RyX2VuZHNfd2l0aChjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgIGludCBzdHJfbGVuID0gc3RybGVuKHN0cik7CisgICAgaW50IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICByZXR1cm4gKHN0cl9sZW4gPj0gc3VmZml4X2xlbikgJiYKKyAgICAgICAgICAgKDAgPT0gc3RyY21wKHN0ciArIChzdHJfbGVuIC0gc3VmZml4X2xlbiksIHN1ZmZpeCkpOworfQorCitjb25zdCBjaGFyKiBzdHJfc2tpcF93aGl0ZV9zcGFjZV9pZl9hbnkoY29uc3QgY2hhciogcG9zKSB7CisgICAgd2hpbGUgKGlzc3BhY2UoKnBvcykpIHsKKyAgICAgICAgcG9zKys7CisgICAgfQorICAgIHJldHVybiBwb3M7Cit9CisKK3ZvaWQgc3RyX3Jlc2V0KGNoYXIqKiBzdHJpbmcsIGNvbnN0IGNoYXIqIG5ld192YWx1ZSkgeworICAgIDo6ZnJlZSgqc3RyaW5nKTsKKyAgICAqc3RyaW5nID0gbmV3X3ZhbHVlID8gOjpzdHJkdXAobmV3X3ZhbHVlKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgc3RyX3Jlc2V0X25vY29weShjaGFyKiogc3RyaW5nLCBjaGFyKiBuZXdfdmFsdWUpIHsKKyAgICA6OmZyZWUoKnN0cmluZyk7CisgICAgKnN0cmluZyA9IG5ld192YWx1ZTsKK30KKwordm9pZCBzdHJfcmVzZXRfbnVsbChjaGFyKiogc3RyaW5nKSB7CisgICAgOjpmcmVlKCpzdHJpbmcpOworICAgICpzdHJpbmcgPSBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmluZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTc3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5nLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pCitzaXplX3Qgc3RybGNweShjaGFyKiBkc3QsIGNvbnN0IGNoYXIgKiBzcmMsIHNpemVfdCBzaXplKTsKKyNlbmRpZgorCisvKiByZXR1cm5zIHRydWUgaWYgfHN0cmluZ3wgZW5kcyB3aXRoIHxzdWZmaXh8ICovCitib29sIHN0cl9lbmRzX3dpdGgoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBzdWZmaXgpOworCisvKiByZXR1cm5zIHRydWUgaWYgfHN0cmluZ3wgYmVnaW5zIHdpdGggfHByZWZpeHwgKi8KK2Jvb2wgc3RyX2JlZ2luc193aXRoKGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogcHJlZml4KTsKKworLyogc2tpcHMgd2hpdGUgc3BhY2UgYXQgcG9zIGlmIGFueSwgcmV0dXJucyBwb2ludGVyIHRvIGZpcnN0CisgKiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIKKyAqLworY29uc3QgY2hhciogc3RyX3NraXBfd2hpdGVfc3BhY2VfaWZfYW55KGNvbnN0IGNoYXIqIHN0cik7CisKKy8vIFJlc2V0IHRoZSB2YWx1ZSBvZiB8KnN0cmluZ3wgdG8gYSBjb3B5IG9mIHxuZXdfdmFsdWV8LiBUaGlzCisvLyB3aWxsIGZyZWUoKSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgfCpzdHJpbmd8IGZpcnN0LiBOb3RlIHRoYXQKKy8vIHxuZXdfdmFsdWV8IGNhbiBiZSBOVUxMIGlmIG9uZSB3YW50cyB0byBzaW1wbHkgdW5zZXQgdGhlIHN0cmluZyBwb2ludGVyLgordm9pZCBzdHJfcmVzZXQoY2hhcioqIHN0cmluZywgY29uc3QgY2hhciogbmV3X3ZhbHVlKTsKKworLy8gU2FtZSBhcyBzdHJfcmVzZXQoKSBidXQgZG8gbm90IGNvcHkgfG5ld192YWx1ZXwsIGluc3RlYWQgdHJhbnNmZXIgaXRzCisvLyBvd25lcnNoaXAgdG8gfCpzdHJpbmd8LiBOb3RlIHRoYXQgfG5ld192YWx1ZXwgY2FuIGJlIE5VTEwuCit2b2lkIHN0cl9yZXNldF9ub2NvcHkoY2hhcioqIHN0cmluZywgY2hhciogbmV3X3ZhbHVlKTsKKworLy8gU2FtZSBhcyBzdHJfcmVzZXQoc3RyaW5nLCBOVUxMKSwgaS5lLiB1bnNldCBhIHN0cmluZyBwb2ludGVyLgordm9pZCBzdHJfcmVzZXRfbnVsbChjaGFyKiogc3RyaW5nKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5nX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zdHJpbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YTRlNjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgVEVTVF9TS0lQKHN0cmluZywgc2tpcHBlZCkgXAorICAgIEVYUEVDVF9FUShzdHJpbmcgKyBza2lwcGVkLCBzdHJfc2tpcF93aGl0ZV9zcGFjZV9pZl9hbnkoc3RyaW5nKSkKK1RFU1QoU3RyaW5nLCBzdHJfc2tpcF93aGl0ZV9zcGFjZV9pZl9hbnkpIHsKKyAgICBURVNUX1NLSVAoIm5vIGNoYW5nZSIsIDApOworICAgIFRFU1RfU0tJUCgiIiwgMCk7CisgICAgVEVTVF9TS0lQKCIgbGVmdCIsIDEpOworICAgIFRFU1RfU0tJUCgicmlnaHQgIiwgMCk7CisgICAgVEVTVF9TS0lQKCJcbm5ld2xpbmVcciIsIDEpOworICAgIFRFU1RfU0tJUCgiIFxyXG5cdG11bHRpIFx0XHJcbiIsIDQpOworfQorCitURVNUKFN0cmluZywgc3RyX2JlZ2luc193aXRoKSB7CisgICAgRVhQRUNUX1RSVUUoc3RyX2JlZ2luc193aXRoKCIxMjM0NTY3OCIsICIxMjM0IikpOworICAgIEVYUEVDVF9UUlVFKHN0cl9iZWdpbnNfd2l0aCgiYXV0aCIsICJhdXRoIikpOworICAgIEVYUEVDVF9UUlVFKHN0cl9iZWdpbnNfd2l0aCgiIiwgIiIpKTsKKyAgICBFWFBFQ1RfVFJVRShzdHJfYmVnaW5zX3dpdGgoIjEyMzQ1Njc4IiwgIiIpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RyX2JlZ2luc193aXRoKCIxMjM0NTY3OCIsICJhYmNkIikpOworICAgIEVYUEVDVF9GQUxTRShzdHJfYmVnaW5zX3dpdGgoIjEyMzQ1Njc4IiwgIjEyMzRhYmNkIikpOworICAgIEVYUEVDVF9GQUxTRShzdHJfYmVnaW5zX3dpdGgoIjEyMzQiLCAiMTIzNDU2NzgiKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0cl9iZWdpbnNfd2l0aCgiIiwgImFiY2QiKSk7Cit9CisKK1RFU1QoU3RyaW5nLCBzdHJfZW5kc193aXRoRmFpbHVyZSkgeworICAgIEVYUEVDVF9GQUxTRShzdHJfZW5kc193aXRoKCIiLCAic3VmZml4IikpOworICAgIEVYUEVDVF9GQUxTRShzdHJfZW5kc193aXRoKCJmaXgiLCAic3VmZml4IikpOworICAgIEVYUEVDVF9GQUxTRShzdHJfZW5kc193aXRoKCJhYmMiLCAieHh5eXp6IikpOworfQorCitURVNUKFN0cmluZywgc3RyX2VuZHNfd2l0aFN1Y2Nlc3MpIHsKKyAgICBFWFBFQ1RfVFJVRShzdHJfZW5kc193aXRoKCJzdHJpbmciLCAiIikpOworICAgIEVYUEVDVF9UUlVFKHN0cl9lbmRzX3dpdGgoIiIsICIiKSk7CisgICAgRVhQRUNUX1RSVUUoc3RyX2VuZHNfd2l0aCgiYWJjIiwgImFiYyIpKTsKKyAgICBFWFBFQ1RfVFJVRShzdHJfZW5kc193aXRoKCJhYmMiLCAiYyIpKTsKKyAgICBFWFBFQ1RfVFJVRShzdHJfZW5kc193aXRoKCIwMTIzIiwgIjIzIikpOworfQorCitURVNUKFN0cmluZywgc3RyX3Jlc2V0KSB7CisgICAgY2hhciogc3RyID0gc3RyZHVwKCJGb28gQmFyIik7CisgICAgY29uc3QgY2hhciBrVGV4dFtdID0gIkhlbGxvIFdvcmxkIjsKKyAgICBzdHJfcmVzZXQoJnN0ciwga1RleHQpOworICAgIEVYUEVDVF9ORShrVGV4dCwgc3RyKTsKKyAgICBFWFBFQ1RfU1RSRVEoa1RleHQsIHN0cik7CisgICAgOjpmcmVlKHN0cik7Cit9CisKK1RFU1QoU3RyaW5nLCBzdHJfcmVzZXRfd2l0aE5VTEwpIHsKKyAgICBjaGFyKiBzdHIgPSBzdHJkdXAoIkZvbyBCYXIiKTsKKyAgICBzdHJfcmVzZXQoJnN0ciwgTlVMTCk7CisgICAgRVhQRUNUX0ZBTFNFKHN0cik7Cit9CisKK1RFU1QoU3RyaW5nLCBzdHJfcmVzZXRfbm9jb3B5KSB7CisgICAgY2hhciogc3RyID0gc3RyZHVwKCJGb28gQmFyIik7CisgICAgY2hhciogdGV4dCA9IHN0cmR1cCgiSGVsbG8gV29ybGQiKTsKKyAgICBzdHJfcmVzZXRfbm9jb3B5KCZzdHIsIHRleHQpOworICAgIEVYUEVDVF9FUSh0ZXh0LCBzdHIpOworICAgIDo6ZnJlZSh0ZXh0KTsKK30KKworVEVTVChTdHJpbmcsIHN0cl9yZXNldF9udWxsKSB7CisgICAgY2hhciogc3RyID0gc3RyZHVwKCJIZWxsbyBXb3JsZCIpOworICAgIHN0cl9yZXNldF9udWxsKCZzdHIpOworICAgIEVYUEVDVF9GQUxTRShzdHIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmluZ2lmeS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N0cmluZ2lmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzN2UxODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3RyaW5naWZ5LmgKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaWZuZGVmIFNUUklOR0lGWQorIyAgIGRlZmluZSBTVFJJTkdJRlkyKHgpICN4CisjICAgZGVmaW5lIFNUUklOR0lGWSh4KSBTVFJJTkdJRlkyKHgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zeXN0ZW0uYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmRiMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N5c3RlbS5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvKiAqKiogREVQUkVDQVRJT04gV0FSTklORyAqKioKKyAqIFRoaXMgZmlsZSBpcyBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCBhIG5ldyBzeXN0ZW0gZnVuY3Rpb24gaW4gQyBjb2RlLCBkbyB0aGUKKyAqIGZvbGxvd2luZzoKKyAqIC0gRXh0ZW5kIGFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLntoLGNwcH0gaWYgbmVlZGVkIHRvIGltcGxlbWVudCBuZXcKKyAqICAgZnVuY3Rpb24gaW4gQysrCisgKiAtIEV4cG9zZSBhIEMgZnVuY3Rpb24gdGhyb3VnaCBhIHRoaW4gd3JhcHBlciBkZWNsYXJlZCBpbgorICogICBhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIGFuZCBpbXBsZW1lbnRlZCBpbiBhbmRyb2lkL3V0aWxzL3N5c3RlbV93cmFwcGVyLmMKKyAqCisgKiBUaGlzIGZpbGUgd2lsbCBiZSBhY3RpdmVseSBwb3J0ZWQgb3ZlciB1c2luZyB0aGUgYWJvdmUgbWVudGlvbmVkIHNjaGVtZSBhbmQKKyAqIHRoZW4gZGVsZXRlZC4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Fzc2VydC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgaW5jbHVkZSA8d2luZG93cy5oPiAgLyogZm9yIFNsZWVwICovCisjZWxzZQorIyAgaW5jbHVkZSA8dW5pc3RkLmg+ICAvKiBmb3IgdXNsZWVwICovCisjICBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPiAvLyBGb3IgZ2V0dGluZyB0aHJlYWQgaWQncworIyAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKwordm9pZCoKK2FuZHJvaWRfYWxsb2MoIHNpemVfdCAgc2l6ZSApCit7CisgICAgdm9pZCogICBibG9jazsKKworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYmxvY2sgPSBtYWxsb2Moc2l6ZSk7CisgICAgaWYgKGJsb2NrICE9IE5VTEwpCisgICAgICAgIHJldHVybiBibG9jazsKKworICAgIGZwcmludGYoc3RkZXJyLCAiUEFOSUM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICBleGl0KDEpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKgorYW5kcm9pZF9hbGxvYzAoIHNpemVfdCAgc2l6ZSApCit7CisgICAgdm9pZCogICBibG9jazsKKworICAgIGlmIChzaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYmxvY2sgPSBjYWxsb2MoMSwgc2l6ZSk7CisgICAgaWYgKGJsb2NrICE9IE5VTEwpCisgICAgICAgIHJldHVybiBibG9jazsKKworICAgIGZwcmludGYoc3RkZXJyLCAiUEFOSUM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICBleGl0KDEpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkKgorYW5kcm9pZF9yZWFsbG9jKCB2b2lkKiAgYmxvY2ssIHNpemVfdCAgc2l6ZSApCit7CisgICAgdm9pZCogICBibG9jazI7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGZyZWUoYmxvY2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYmxvY2syID0gcmVhbGxvYyhibG9jaywgc2l6ZSk7CisgICAgaWYgKGJsb2NrMiAhPSBOVUxMKQorICAgICAgICByZXR1cm4gYmxvY2syOworCisgICAgZnByaW50ZihzdGRlcnIsICJQQU5JQzogbm90IGVub3VnaCBtZW1vcnkgdG8gcmVhbGxvY2F0ZSAldSBieXRlc1xuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZClzaXplKTsKKyAgICBleGl0KDEpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkCithbmRyb2lkX2ZyZWUoIHZvaWQqICBibG9jayApCit7CisgICAgaWYgKGJsb2NrKQorICAgICAgICBmcmVlKGJsb2NrKTsKK30KKwordm9pZCoKK19hbmRyb2lkX2FycmF5X2FsbG9jKCBzaXplX3QgIGl0ZW1TaXplLCBzaXplX3QgIGNvdW50ICkKK3sKKyNpZiBBQ09ORklHX1VTRV9BU1NFUlQKKyAgICBzaXplX3QgIG1heFNpemU7CisKKyAgICBpZiAoaXRlbVNpemUgPT0gMCkKKyAgICAgICAgQUFTU0VSVF9GQUlMKCJpdGVtIHNpemUgaXMgMFxuIik7CisKKyAgICBtYXhTaXplID0gKH4oc2l6ZV90KTApIC8gaXRlbVNpemU7CisgICAgaWYgKGNvdW50ID4gbWF4U2l6ZSkKKyAgICAgICAgQUFTU0VSVF9GQUlMKCJhbGxvY2F0aW9uIHRvbyBsYXJnZSAoJWQgPiAlZClcbiIsIGNvdW50LCBtYXhTaXplKTsKKyNlbmRpZgorICAgIHJldHVybiBhbmRyb2lkX2FsbG9jKGl0ZW1TaXplICogY291bnQpOworfQorCit2b2lkKgorX2FuZHJvaWRfYXJyYXlfYWxsb2MwKCBzaXplX3QgIGl0ZW1TaXplLCBzaXplX3QgIGNvdW50ICkKK3sKKyAgICB2b2lkKiAgYmxvY2sgPSBfYW5kcm9pZF9hcnJheV9hbGxvYyhpdGVtU2l6ZSwgY291bnQpOworICAgIG1lbXNldChibG9jaywgMCwgaXRlbVNpemUqY291bnQpOworICAgIHJldHVybiBibG9jazsKK30KKwordm9pZCoKK19hbmRyb2lkX2FycmF5X3JlYWxsb2MoIHZvaWQqIGJsb2NrLCBzaXplX3QgIGl0ZW1TaXplLCBzaXplX3QgIGNvdW50ICkKK3sKKyNpZiBBQ09ORklHX1VTRV9BU1NFUlQKKyAgICBzaXplX3QgIG1heFNpemU7CisKKyAgICBpZiAoaXRlbVNpemUgPT0gMCkKKyAgICAgICAgQUFTU0VSVF9GQUlMKCJpdGVtIHNpemUgaXMgMFxuIik7CisKKyAgICBtYXhTaXplID0gKH4oc2l6ZV90KTApIC8gaXRlbVNpemU7CisgICAgaWYgKGNvdW50ID4gbWF4U2l6ZSkKKyAgICAgICAgQUFTU0VSVF9GQUlMKCJyZWFsbG9jYXRpb24gb2YgJWQtYnl0ZXMgYXJyYXkgdG9vIGxhcmdlICglZCA+ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGl0ZW1TaXplLCBjb3VudCwgbWF4U2l6ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gYW5kcm9pZF9yZWFsbG9jKGJsb2NrLCBpdGVtU2l6ZSpjb3VudCk7Cit9CisKK2NoYXIqCithbmRyb2lkX3N0cmR1cCggY29uc3QgY2hhciogIHN0ciApCit7CisgICAgaW50ICAgIGxlbjsKKyAgICBjaGFyKiAgY29weTsKKworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBsZW4gID0gc3RybGVuKHN0cik7CisgICAgY29weSA9IG1hbGxvYyhsZW4rMSk7CisgICAgbWVtY3B5KGNvcHksIHN0ciwgbGVuKTsKKyAgICBjb3B5W2xlbl0gPSAwOworCisgICAgcmV0dXJuIGNvcHk7Cit9CisKKyNpZmRlZiBfV0lOMzIKK2NoYXIqCit3aW4zMl9zdHJzZXAoY2hhcioqICBwbGluZSwgY29uc3QgY2hhciogIGRlbGltKQoreworICAgIGNoYXIqICBsaW5lID0gKnBsaW5lOworICAgIGNoYXIqICBwICAgID0gbGluZTsKKworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgICAgICAgICAgYyA9ICpwKys7CisgICAgICAgIGNvbnN0IGNoYXIqICBxID0gZGVsaW07CisKKyAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgqcSkgeworICAgICAgICAgICAgaWYgKCpxID09IGMpIHsKKyAgICAgICAgICAgICAgICBwWy0xXSA9IDA7CisgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcSsrOworICAgICAgICB9CisgICAgfQorRXhpdDoKKyAgICAqcGxpbmUgPSBwOworICAgIHJldHVybiBsaW5lOworfQorI2VuZGlmCisKKwordm9pZAorZGlzYWJsZV9zaWdhbHJtKCBzaWduYWxfc3RhdGVfdCAgKnN0YXRlICkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICAodm9pZClzdGF0ZTsKKyNlbHNlCisgICAgc2lnc2V0X3QgIHNldDsKKworICAgIHNpZ2VtcHR5c2V0KCZzZXQpOworICAgIHNpZ2FkZHNldCgmc2V0LCBTSUdBTFJNKTsKKyAgICBwdGhyZWFkX3NpZ21hc2sgKFNJR19CTE9DSywgJnNldCwgJnN0YXRlLT5vbGQpOworI2VuZGlmCit9CisKK3ZvaWQKK3Jlc3RvcmVfc2lnYWxybSggc2lnbmFsX3N0YXRlX3QgICpzdGF0ZSApCit7CisjaWZkZWYgX1dJTjMyCisgICAgKHZvaWQpc3RhdGU7CisjZWxzZQorICAgIHB0aHJlYWRfc2lnbWFzayAoU0lHX1NFVE1BU0ssICZzdGF0ZS0+b2xkLCBOVUxMKTsKKyNlbmRpZgorfQorCit2b2lkCitzbGVlcF9tcyggaW50ICB0aW1lb3V0X21zICkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAodGltZW91dF9tcyA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBTbGVlcCggdGltZW91dF9tcyApOworI2Vsc2UKKyAgICBpZiAodGltZW91dF9tcyA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBCRUdJTl9OT1NJR0FMUk0KKyAgICB1c2xlZXAoIHRpbWVvdXRfbXMqMTAwMCApOworICAgIEVORF9OT1NJR0FMUk0KKyNlbmRpZgorfQorCithbmRyb2lkX3RocmVhZF9pZF90CithbmRyb2lkX2dldF90aHJlYWRfaWQoKSB7CisjaWZkZWYgX1dJTjMyCisgICAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgcmV0dXJuIHN5c2NhbGwoU1lTX3RocmVhZF9zZWxmaWQpOworI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgcmV0dXJuIHN5c2NhbGwoX19OUl9nZXR0aWQpOworI2Vsc2UKKyNlcnJvciAiT3BlcmF0aW5nIHN5c3RlbSBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3lzdGVtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2YWM4YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy9zeXN0ZW0uaApAQCAtMCwwICsxLDIyMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MgMQorI2VuZGlmCisjaW5jbHVkZSA8aW50dHlwZXMuaD4gIC8qIGZvciBQUklkNjQgZXQgYWwuICovCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hc3NlcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIGludGVybmFsIGhlbHBlcnMgKi8KK3ZvaWQqICBfYW5kcm9pZF9hcnJheV9hbGxvYyggc2l6ZV90ICBpdGVtU2l6ZSwgc2l6ZV90ICBjb3VudCApOwordm9pZCogIF9hbmRyb2lkX2FycmF5X2FsbG9jMCggc2l6ZV90ICBpdGVtU2l6ZSwgc2l6ZV90ICBjb3VudCApOwordm9pZCogIF9hbmRyb2lkX2FycmF5X3JlYWxsb2MoIHZvaWQqIGJsb2NrLCBzaXplX3QgIGl0ZW1TaXplLCBzaXplX3QgIGNvdW50ICk7CisKKy8qIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHBlcmZvcm0gJ2NoZWNrZWQgYWxsb2NhdGlvbnMnLCBpLmUuCisgKiB0aGV5IGFib3J0IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5LgorICovCisKKy8qIGNoZWNrZWQgbWFsbG9jLCBvbmx5IHJldHVybnMgTlVMTCBpZiBzaXplIGlzIDAgKi8KK3ZvaWQqICBhbmRyb2lkX2FsbG9jKCBzaXplX3QgIHNpemUgKTsKKworLyogY2hlY2tlZCBjYWxsb2MsIG9ubHkgcmV0dXJucyBOVUxMIGlmIHNpemUgaXMgMCAqLwordm9pZCogIGFuZHJvaWRfYWxsb2MwKCBzaXplX3QgIHNpemUgKTsKKworLyogY2hlY2tlZCByZWFsbG9jLCBvbmx5IHJldHVybnMgTlVMTCBpZiBzaXplIGlmIDAgKi8KK3ZvaWQqICBhbmRyb2lkX3JlYWxsb2MoIHZvaWQqICBibG9jaywgc2l6ZV90ICBzaXplICk7CisKKy8qIGZyZWUgbWVtb3J5IGJsb2NrICovCit2b2lkICAgYW5kcm9pZF9mcmVlKCB2b2lkKiAgYmxvY2sgKTsKKworLyogY29udmVuaWVuY2UgbWFjcm9zICovCisKKyNkZWZpbmUgIEFaRVJPKHApICAgICAgICAgICAgIG1lbXNldCgoY2hhciopKHApLDAsc2l6ZW9mKCoocCkpKQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lICBBTkVXKHApICAgICAgICAgICAgICAocCA9IHJlaW50ZXJwcmV0X2Nhc3Q8X190eXBlb2ZfXygqcCk+KGFuZHJvaWRfYWxsb2Moc2l6ZW9mKCpwKSkpKQorI2RlZmluZSAgQU5FVzAocCkgICAgICAgICAgICAgKHAgPSByZWludGVycHJldF9jYXN0PF9fdHlwZW9mX18oKnApPihhbmRyb2lkX2FsbG9jKHNpemVvZigqcCkpKSkKKyNlbHNlICAvLyAhX19jcGx1c3BsdXMKKyNkZWZpbmUgIEFORVcocCkgICAgICAgICAgICAgIChwID0gYW5kcm9pZF9hbGxvYyhzaXplb2YoKnApKSkKKyNkZWZpbmUgIEFORVcwKHApICAgICAgICAgICAgIChwID0gYW5kcm9pZF9hbGxvYzAoc2l6ZW9mKCpwKSkpCisjZW5kaWYgIC8vICFfX2NwbHVzcGx1cworI2RlZmluZSAgQUZSRUUocCkgICAgICAgICAgICAgYW5kcm9pZF9mcmVlKHApCisKKyNkZWZpbmUgIEFNRU1fWkVSTyhkc3Qsc2l6ZSkgICAgICBtZW1zZXQoKGNoYXIqKShkc3QpLCAwLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgIEFNRU1fQ09QWShkc3Qsc3JjLHNpemUpICBtZW1jcHkoKGNoYXIqKShkc3QpLChjb25zdCBjaGFyKikoc3JjKSwoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgIEFNRU1fTU9WRShkc3Qsc3JjLHNpemUpICBtZW1tb3ZlKChjaGFyKikoZHN0KSwoY29uc3QgY2hhciopKHNyYyksKHNpemVfdCkoc2l6ZSkpCisKKyNkZWZpbmUgIEFBUlJBWV9ORVcocCxjb3VudCkgICAgICAgICAgKEFBU1NFUlRfTE9DKCksIChwKSA9IF9hbmRyb2lkX2FycmF5X2FsbG9jKHNpemVvZigqcCksKGNvdW50KSkpCisjZGVmaW5lICBBQVJSQVlfTkVXMChwLGNvdW50KSAgICAgICAgIChBQVNTRVJUX0xPQygpLCAocCkgPSBfYW5kcm9pZF9hcnJheV9hbGxvYzAoc2l6ZW9mKCpwKSwoY291bnQpKSkKKyNkZWZpbmUgIEFBUlJBWV9SRU5FVyhwLGNvdW50KSAgICAgICAgKEFBU1NFUlRfTE9DKCksIChwKSA9IF9hbmRyb2lkX2FycmF5X3JlYWxsb2MoKHApLHNpemVvZigqKHApKSwoY291bnQpKSkKKworI2RlZmluZSAgQUFSUkFZX0NPUFkoZHN0LHNyYyxjb3VudCkgICBBTUVNX0NPUFkoZHN0LHNyYywoY291bnQpKnNpemVvZigoZHN0KVswXSkpCisjZGVmaW5lICBBQVJSQVlfTU9WRShkc3Qsc3JjLGNvdW50KSAgIEFNRU1fTU9WRShkc3Qsc3JjLChjb3VudCkqc2l6ZW9mKChkc3QpWzBdKSkKKyNkZWZpbmUgIEFBUlJBWV9aRVJPKGRzdCxjb3VudCkgICAgICAgQU1FTV9aRVJPKGRzdCwoY291bnQpKnNpemVvZigoZHN0KVswXSkpCisKKyNkZWZpbmUgIEFBUlJBWV9TVEFUSUNfTEVOKGEpICAgICAgICAgKHNpemVvZigoYSkpL3NpemVvZigoYSlbMF0pKQorCisjZGVmaW5lICBBSU5MSU5FRCAgc3RhdGljIF9faW5saW5lX18KKworLyogdW5saWtlIHN0cmR1cCgpLCB0aGlzIGFjY2VwdHMgTlVMTCBhcyB2YWxpZCBpbnB1dCAoYW5kIHdpbGwgcmV0dXJuIE5VTEwgdGhlbikgKi8KK2NoYXIqICAgYW5kcm9pZF9zdHJkdXAoY29uc3QgY2hhciogIHNyYyk7CisKKyNkZWZpbmUgIEFTVFJEVVAoc3RyKSAgYW5kcm9pZF9zdHJkdXAoc3RyKQorCisvKiB1c2VkIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSBQb3NpeC1zdHlsZSBzdGF0dXMgY29kZSwgaS5lLgorICogMCBtZWFucyBzdWNjZXNzLCAtMSBtZWFucyBmYWlsdXJlIHdpdGggdGhlIGVycm9yIGNvZGUgaW4gJ2Vycm5vJworICovCit0eXBlZGVmIGludCAgQVBvc2l4U3RhdHVzOworCisvKiB1c2VkIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb3IgYWNjZXB0IGEgYm9vbGVhbiB0eXBlICovCit0eXBlZGVmIGludCAgQUJvb2w7CisKKy8qKiBTdHJpbmdpZmljYXRpb24gbWFjcm8KKyAqKi8KKyNpZm5kZWYgU1RSSU5HSUZZCisjZGVmaW5lICBfU1RSSU5HSUZZKHgpICAjeAorI2RlZmluZSAgU1RSSU5HSUZZKHgpICBfU1RSSU5HSUZZKHgpCisjZW5kaWYKKworLyoqIENvbmNhdGVuYXRpb24gbWFjcm9zCisgKiovCisjaWZuZGVmIEdMVUUKKyNkZWZpbmUgIF9HTFVFKHgseSkgIHgjI3kKKyNkZWZpbmUgIEdMVUUoeCx5KSAgIF9HTFVFKHgseSkKKworI2RlZmluZSAgX0dMVUUzKHgseSx6KSAgeCMjeSMjegorI2RlZmluZSAgR0xVRTMoeCx5LHopICAgIF9HTFVFMyh4LHkseikKKyNlbmRpZgorCisvKiogSGFuZGxlIHN0cnNlcCgpIG9uIFdpbjMyCisgKiovCisjaWZkZWYgX1dJTjMyCisjICB1bmRlZiAgIHN0cnNlcAorIyAgZGVmaW5lICBzdHJzZXAgICAgd2luMzJfc3Ryc2VwCitleHRlcm4gY2hhciogIHdpbjMyX3N0cnNlcChjaGFyKiogIHBsaW5lLCBjb25zdCBjaGFyKiAgZGVsaW0pOworI2VuZGlmCisKKy8qKiBIYW5kbGUgc3RyY2FzZWNtcCBvbiBXaW5kb3dzIChhbmQgb2xkZXIgTWluZ3czMiB0b29sY2hhaW4pCisgKiovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFBTkRST0lEX0dDQ19QUkVSRVEoNCw0KQorIyAgZGVmaW5lICBzdHJjYXNlY21wICBzdHJpY21wCisjZW5kaWYKKworLyoqIFNJR05BTCBIQU5ETElORworICoqCisgKiogdGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZCB0byBibG9jayBTSUdBTFJNIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lLgorICoqIHVzZSB3aXRoIGNhdXRpb24sIHRoZSBRRU1VIGV4ZWN1dGlvbiBsb29wIHVzZXMgU0lHQUxSTSBleHRlbnNpdmVseQorICoqCisgKiovCisjaWZkZWYgX1dJTjMyCit0eXBlZGVmIHN0cnVjdCB7IGludCAgZHVteTsgfSAgICAgIHNpZ25hbF9zdGF0ZV90OworI2Vsc2UKKyNpbmNsdWRlIDxzaWduYWwuaD4KK3R5cGVkZWYgc3RydWN0IHsgc2lnc2V0X3QgIG9sZDsgfSAgc2lnbmFsX3N0YXRlX3Q7CisjZW5kaWYKKworZXh0ZXJuICB2b2lkICAgZGlzYWJsZV9zaWdhbHJtKCBzaWduYWxfc3RhdGVfdCAgKnN0YXRlICk7CitleHRlcm4gIHZvaWQgICByZXN0b3JlX3NpZ2Fscm0oIHNpZ25hbF9zdGF0ZV90ICAqc3RhdGUgKTsKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lICAgQkVHSU5fTk9TSUdBTFJNICBcCisgICAgeworCisjZGVmaW5lICAgRU5EX05PU0lHQUxSTSAgXAorICAgIH0KKworI2Vsc2UgLyogIVdJTjMyICovCisKKyNkZWZpbmUgICBCRUdJTl9OT1NJR0FMUk0gIFwKKyAgICB7IHNpZ25hbF9zdGF0ZV90ICBfX3NpZ2Fscm1fc3RhdGU7IFwKKyAgICAgIGRpc2FibGVfc2lnYWxybSggJl9fc2lnYWxybV9zdGF0ZSApOworCisjZGVmaW5lICAgRU5EX05PU0lHQUxSTSAgXAorICAgICAgcmVzdG9yZV9zaWdhbHJtKCAmX19zaWdhbHJtX3N0YXRlICk7ICBcCisgICAgfQorCisjZW5kaWYgLyogIVdJTjMyICovCisKKy8qKiBUSU1FIEhBTkRMSU5HCisgKioKKyAqKiBzbGVlcCBmb3IgYSBnaXZlbiB0aW1lIGluIG1pbGxpc2Vjb25kcy4gbm90ZTogdGhpcyB1c2VzCisgKiogZGlzYWJsZV9zaWdhbHJtKCkvcmVzdG9yZV9zaWdhbHJtKCkKKyAqKi8KKworZXh0ZXJuICB2b2lkICAgc2xlZXBfbXMoIGludCAgdGltZW91dCApOworCisvKiogRk9STUFUVElORyBpbnQ2NF90IGluIHByaW50ZigpIHN0YXRlbWVudHMKKyAqKgorICoqIE5vcm1hbGx5IGRlZmluZWQgaW4gPGludHR5cGVzLmg+IGV4Y2VwdCBvbiBXaW5kb3dzIGFuZCBtYXliZSBvdGhlcnMuCisgKiovCisKKyNpZm5kZWYgUFJJZDY0CisjICBkZWZpbmUgUFJJZDY0ICAibGxkIgorI2VuZGlmCisjaWZuZGVmIFBSSXg2NAorIyAgZGVmaW5lIFBSSXg2NCAgImxseCIKKyNlbmRpZgorI2lmbmRlZiBQUkl1NjQKKyMgIGRlZmluZSBQUkl1NjQgICJsbHUiCisjZW5kaWYKKworLy8gR2V0dGluZyB0aHJlYWQgaWQncyAoY3Jvc3MgcGxhdGZvcm0pCisKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lIEFORFJPSURfVEhSRUFESURfRk1UICJseCIKKy8vIGNhbm5vdCBpbmNsdWRlIHdpbmRvd3MgeWV0LCBoZXJlLgorLy8gU2hvdWxkIGJlIGVxdWl2LiB0byBEV09SRAorI2RlZmluZSBhbmRyb2lkX3RocmVhZF9pZF90IGxvbmcgdW5zaWduZWQgaW50CisKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorCisjZGVmaW5lIEFORFJPSURfVEhSRUFESURfRk1UICJ4IgorI2RlZmluZSBhbmRyb2lkX3RocmVhZF9pZF90IGludAorCisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKworI2RlZmluZSBBTkRST0lEX1RIUkVBRElEX0ZNVCAibHgiCisjZGVmaW5lIGFuZHJvaWRfdGhyZWFkX2lkX3QgbG9uZworCisjZWxzZQorCisjZXJyb3IgIk9wZXJhdGluZyBzeXN0ZW0gbm90IHN1cHBvcnRlZCIKKyNlbmRpZgorCitleHRlcm4gYW5kcm9pZF90aHJlYWRfaWRfdCBhbmRyb2lkX2dldF90aHJlYWRfaWQoKTsKKworLyoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKiBWYXJpb3VzIHN5c3RlbSBmdW5jdGlvbnMgZXhwb3NlZCBmcm9tIHRoZSBtb2Rlcm4KKyAqKiBhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIGltcGxlbWVudGF0aW9uLgorICoqLworCisvKiogR2V0IHN5c3RlbSAvIHVzZXIgdGltZSBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcywgaW4gbWlsbGlzZWNvbmRzICoqLworLyogVHlwZSBkdXBsaWNhdGVkIGZyb20gYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCAqLworZXh0ZXJuIGludDY0X3QgZ2V0X3VzZXJfdGltZV9tcygpOworZXh0ZXJuIGludDY0X3QgZ2V0X3N5c3RlbV90aW1lX21zKCk7CisKKy8vIENhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIHN0cmluZy4KK2V4dGVybiBjaGFyKiBnZXRfbGF1bmNoZXJfZGlyZWN0b3J5KCk7CitleHRlcm4gY2hhciogZ2V0X2hvc3Rfb3NfdHlwZSgpOworZXh0ZXJuIHZvaWQgYWRkX2xpYnJhcnlfc2VhcmNoX2Rpcihjb25zdCBjaGFyKiBkaXJQYXRoKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvc3lzdGVtX3dyYXBwZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N5c3RlbV93cmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDE0YTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3N5c3RlbV93cmFwcGVyLmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8qIE5PVEU6CisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhpbiB3cmFwcGVycyBhcm91bmQgYWN0dWFsIHN5c3RlbSByZWxhdGVkIGxpYnJhcnkKKyAqIGZ1bmN0aW9ucyBmcm9tIGFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmguCisgKiBLZWVwIHRoaXMgbGVhbi4gRE8gTk9UIGltcGxlbWVudCBhbnkgcmVhbCBmdW5jdGlvbmFsaXR5IGhlcmUuCisgKi8KKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKworLy8gVGhpcyBpcyBhIHZlcnkgdGhpbiB3cmFwcGVyIGFyb3VuZCBDKysgaW1wbGVtZW50YXRpb25zIG9mIHNvbWUgZnVuY3Rpb25zCisvLyBOT1RFOiBjcHAgaGVhZGVycyBuZWVkIHRvIGdvIGJlZm9yZSB0aGlzIHNvIHRoYXQgaW50dHlwZXMuaCBkb2Vzbid0IHBvbGx1dGUKKy8vIHR5cGVzLgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3lzdGVtOworCitpbnQ2NF90IGdldF91c2VyX3RpbWVfbXMoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KFN5c3RlbTo6Z2V0KCktPmdldFByb2Nlc3NUaW1lcygpLnVzZXJNcyk7Cit9CisKK2ludDY0X3QgZ2V0X3N5c3RlbV90aW1lX21zKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ2NF90PihTeXN0ZW06OmdldCgpLT5nZXRQcm9jZXNzVGltZXMoKS5zeXN0ZW1Ncyk7Cit9CisKK2NoYXIqIGdldF9sYXVuY2hlcl9kaXJlY3RvcnkoKSB7CisgICAgcmV0dXJuIHN0cmR1cChTeXN0ZW06OmdldCgpLT5nZXRMYXVuY2hlckRpcmVjdG9yeSgpLmNfc3RyKCkpOworfQorCit2b2lkIGFkZF9saWJyYXJ5X3NlYXJjaF9kaXIoY29uc3QgY2hhciogZGlyUGF0aCkgeworICAgIFN5c3RlbTo6Z2V0KCktPmFkZExpYnJhcnlTZWFyY2hEaXIoZGlyUGF0aCk7Cit9CisKK2NoYXIqIGdldF9ob3N0X29zX3R5cGUoKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OnN0ckR1cCgKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnRvU3RyaW5nKFN5c3RlbTo6Z2V0KCktPmdldE9zVHlwZSgpKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdGVtcGZpbGUuYyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy90ZW1wZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzRjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdGVtcGZpbGUuYwpAQCAtMCwwICsxLDE5OCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCisKKy8qKiBURU1QIEZJTEUgU1VQUE9SVAorICoqCisgKiogc2ltcGxlIGludGVyZmFjZSB0byBjcmVhdGUgYW4gZW1wdHkgdGVtcG9yYXJ5IGZpbGUgb24gdGhlIHN5c3RlbS4KKyAqKgorICoqIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIHRlbXBmaWxlX2NyZWF0ZSgpLCB3aGljaCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgVGVtcEZpbGUKKyAqKiBvYmplY3QsIG9yIE5VTEwgaWYgeW91ciBzeXN0ZW0gaXMgc28gd2VpcmQgaXQgZG9lc24ndCBoYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAqKgorICoqIHlvdSBjYW4gdGhlbiBjYWxsIHRlbXBmaWxlX3BhdGgoKSB0byByZXRyaWV2ZSB0aGUgVGVtcEZpbGUncyByZWFsIHBhdGggdG8gb3BlbgorICoqIGl0LiB0aGUgcmV0dXJuZWQgcGF0aCBpcyBvd25lZCBieSB0aGUgVGVtcEZpbGUgb2JqZWN0IGFuZCBzaG91bGQgbm90IGJlIGZyZWVkLgorICoqCisgKiogYWxsIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVzdHJveWVkIHdoZW4gdGhlIHByb2dyYW0gcXVpdHMsIHVubGVzcyB5b3UgZXhwbGljaXRlbHkKKyAqKiBjbG9zZSB0aGVtIGJlZm9yZSB0aGF0IHdpdGggdGVtcGZpbGVfY2xvc2UoKQorICoqLworCitzdHJ1Y3QgVGVtcEZpbGUKK3sKKyAgICBjb25zdCBjaGFyKiAgbmFtZTsKKyAgICBUZW1wRmlsZSogICAgbmV4dDsKK307CisKK3N0YXRpYyB2b2lkICAgICAgIHRlbXBmaWxlX2F0ZXhpdCgpOworc3RhdGljIFRlbXBGaWxlKiAgX2FsbF90ZW1wZmlsZXM7CisKK1RlbXBGaWxlKgordGVtcGZpbGVfY3JlYXRlKCB2b2lkICkKK3sKKyAgICBUZW1wRmlsZSogICAgdGVtcGZpbGU7CisgICAgY29uc3QgY2hhciogIHRlbXBuYW1lID0gTlVMTDsKKworI2lmZGVmIF9XSU4zMgorICAgIGNoYXIgIHRlbXBfbmFtZWJ1ZmZbTUFYX1BBVEhdOworICAgIGNoYXIgIHRlbXBfZGlyW01BWF9QQVRIXTsKKyAgICBjaGFyICAqcCA9IHRlbXBfZGlyLCAqZW5kID0gcCArIHNpemVvZih0ZW1wX2Rpcik7CisgICAgVUlOVCAgcmV0dmFsOworCisgICAgcCA9IGJ1ZnByaW50X3RlbXBfZGlyKCBwLCBlbmQgKTsKKyAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgRCggIlRFTVAgZGlyZWN0b3J5IHBhdGggaXMgdG9vIGxvbmciICk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHZhbCA9IEdldFRlbXBGaWxlTmFtZSh0ZW1wX2RpciwgIlRNUCIsIDAsIHRlbXBfbmFtZWJ1ZmYpOworICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBEKCAiY2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIGluICclcyciLCB0ZW1wX2RpciApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0ZW1wbmFtZSA9IHRlbXBfbmFtZWJ1ZmY7CisjZWxzZQorI2RlZmluZSAgVEVNUExBVEUgICIvdG1wLy5hbmRyb2lkLWVtdWxhdG9yLVhYWFhYWCIKKyAgICBpbnQgICB0ZW1wZmQgPSAtMTsKKyAgICBjaGFyICB0ZW1wbGF0ZVs1MTJdOworICAgIGNoYXIgICpwID0gdGVtcGxhdGUsICplbmQgPSBwICsgc2l6ZW9mKHRlbXBsYXRlKTsKKworICAgIHAgPSBidWZwcmludF90ZW1wX2ZpbGUoIHAsIGVuZCwgImVtdWxhdG9yLVhYWFhYWCIgKTsKKyAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgRCggIlhjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIGluIC90bXAvYW5kcm9pZCAhISIgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgRCggInRlbXBsYXRlOiAlcyIsIHRlbXBsYXRlICk7CisgICAgdGVtcGZkID0gbWtzdGVtcCggdGVtcGxhdGUgKTsKKyAgICBpZiAodGVtcGZkIDwgMCkgeworICAgICAgICBEKCJjYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIGluIC90bXAvYW5kcm9pZCAhISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2xvc2UodGVtcGZkKTsKKyAgICB0ZW1wbmFtZSA9IHRlbXBsYXRlOworI2VuZGlmCisgICAgdGVtcGZpbGUgPSBtYWxsb2MoIHNpemVvZigqdGVtcGZpbGUpICsgc3RybGVuKHRlbXBuYW1lKSArIDEgKTsKKyAgICB0ZW1wZmlsZS0+bmFtZSA9IChjaGFyKikodGVtcGZpbGUgKyAxKTsKKyAgICBzdHJjcHkoIChjaGFyKil0ZW1wZmlsZS0+bmFtZSwgdGVtcG5hbWUgKTsKKworICAgIHRlbXBmaWxlLT5uZXh0ID0gX2FsbF90ZW1wZmlsZXM7CisgICAgX2FsbF90ZW1wZmlsZXMgPSB0ZW1wZmlsZTsKKworICAgIGlmICggIXRlbXBmaWxlLT5uZXh0ICkgeworICAgICAgICBhdGV4aXQoIHRlbXBmaWxlX2F0ZXhpdCApOworICAgIH0KKworICAgIHJldHVybiB0ZW1wZmlsZTsKK30KKworY29uc3QgY2hhcioKK3RlbXBmaWxlX3BhdGgoVGVtcEZpbGUqICB0ZW1wKQoreworICAgIHJldHVybiB0ZW1wID8gdGVtcC0+bmFtZSA6IE5VTEw7Cit9CisKK3ZvaWQKK3RlbXBmaWxlX2Nsb3NlKFRlbXBGaWxlKiAgdGVtcGZpbGUpCit7CisjaWZkZWYgX1dJTjMyCisgICAgRGVsZXRlRmlsZSh0ZW1wZmlsZS0+bmFtZSk7CisjZWxzZQorICAgIHVubGluayh0ZW1wZmlsZS0+bmFtZSk7CisjZW5kaWYKK30KKworLyoqIFRFTVAgRklMRSBDTEVBTlVQCisgKioKKyAqKi8KKworLyogd2UgZG9uJ3QgZXhwZWN0IHRvIHVzZSBtYW55IHRlbXBvcmFyeSBmaWxlcyAqLworI2RlZmluZSBNQVhfQVRFWElUX0ZEUyAgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAgIGNvdW50OworICAgIGludCAgIGZkc1sgTUFYX0FURVhJVF9GRFMgXTsKK30gQXRFeGl0RmRzOworCitzdGF0aWMgdm9pZAorYXRleGl0X2Zkc19hZGQoIEF0RXhpdEZkcyogIHQsIGludCAgZmQgKQoreworICAgIGlmICh0LT5jb3VudCA8IE1BWF9BVEVYSVRfRkRTKQorICAgICAgICB0LT5mZHNbdC0+Y291bnQrK10gPSBmZDsKKyAgICBlbHNlIHsKKyAgICAgICAgZHdhcm5pbmcoIiVzOiBvdmVyICVkIGNhbGxzLiBQcm9ncmFtIGV4aXQgbWF5IG5vdCBjbGVhbnVwIGFsbCB0ZW1wb3JhcnkgZmlsZXMiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBNQVhfQVRFWElUX0ZEUyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYXRleGl0X2Zkc19kZWwoIEF0RXhpdEZkcyogIHQsIGludCAgZmQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgdC0+Y291bnQ7IG5uKyspCisgICAgICAgIGlmICh0LT5mZHNbbm5dID09IGZkKSB7CisgICAgICAgICAgICAvKiBtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIHQtPmNvdW50ICAtPSAxOworICAgICAgICAgICAgdC0+ZmRzW25uXSA9IHQtPmZkc1t0LT5jb3VudF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZAorYXRleGl0X2Zkc19jbG9zZV9hbGwoIEF0RXhpdEZkcyogIHQgKQoreworICAgIGludCAgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgdC0+Y291bnQ7IG5uKyspCisgICAgICAgIGNsb3NlKHQtPmZkc1tubl0pOworfQorCitzdGF0aWMgQXRFeGl0RmRzICAgX2F0ZXhpdF9mZHNbMV07CisKK3ZvaWQKK2F0ZXhpdF9jbG9zZV9mZChpbnQgIGZkKQoreworICAgIGlmIChmZCA+PSAwKQorICAgICAgICBhdGV4aXRfZmRzX2FkZChfYXRleGl0X2ZkcywgZmQpOworfQorCit2b2lkCithdGV4aXRfY2xvc2VfZmRfcmVtb3ZlKGludCAgZmQpCit7CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGF0ZXhpdF9mZHNfZGVsKF9hdGV4aXRfZmRzLCBmZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZW1wZmlsZV9hdGV4aXQoIHZvaWQgKQoreworICAgIFRlbXBGaWxlKiAgdGVtcGZpbGU7CisKKyAgICBhdGV4aXRfZmRzX2Nsb3NlX2FsbCggX2F0ZXhpdF9mZHMgKTsKKworICAgIGZvciAodGVtcGZpbGUgPSBfYWxsX3RlbXBmaWxlczsgdGVtcGZpbGU7IHRlbXBmaWxlID0gdGVtcGZpbGUtPm5leHQpCisgICAgICAgIHRlbXBmaWxlX2Nsb3NlKHRlbXBmaWxlKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RlbXBmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZWMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qKiBURU1QIEZJTEUgU1VQUE9SVAorICoqCisgKiogc2ltcGxlIGludGVyZmFjZSB0byBjcmVhdGUgYW4gZW1wdHkgdGVtcG9yYXJ5IGZpbGUgb24gdGhlIHN5c3RlbS4KKyAqKgorICoqIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIHRlbXBmaWxlX2NyZWF0ZSgpLCB3aGljaCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgVGVtcEZpbGUKKyAqKiBvYmplY3QsIG9yIE5VTEwgaWYgeW91ciBzeXN0ZW0gaXMgc28gd2VpcmQgaXQgZG9lc24ndCBoYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKyAqKgorICoqIHlvdSBjYW4gdGhlbiBjYWxsIHRlbXBmaWxlX3BhdGgoKSB0byByZXRyaWV2ZSB0aGUgVGVtcEZpbGUncyByZWFsIHBhdGggdG8gb3BlbgorICoqIGl0LiB0aGUgcmV0dXJuZWQgcGF0aCBpcyBvd25lZCBieSB0aGUgVGVtcEZpbGUgb2JqZWN0IGFuZCBzaG91bGQgbm90IGJlIGZyZWVkLgorICoqCisgKiogYWxsIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVzdHJveWVkIHdoZW4gdGhlIHByb2dyYW0gcXVpdHMsIHVubGVzcyB5b3UgZXhwbGljaXRlbHkKKyAqKiBjbG9zZSB0aGVtIGJlZm9yZSB0aGF0IHdpdGggdGVtcGZpbGVfY2xvc2UoKQorICoqLworCit0eXBlZGVmIHN0cnVjdCBUZW1wRmlsZSAgIFRlbXBGaWxlOworCitleHRlcm4gIFRlbXBGaWxlKiAgICB0ZW1wZmlsZV9jcmVhdGUoIHZvaWQgKTsKK2V4dGVybiAgY29uc3QgY2hhciogIHRlbXBmaWxlX3BhdGgoIFRlbXBGaWxlKiAgdGVtcCApOworZXh0ZXJuICB2b2lkICAgICAgICAgdGVtcGZpbGVfY2xvc2UoIFRlbXBGaWxlKiAgdGVtcCApOworCisvKiogVEVNUCBGSUxFIENMRUFOVVAKKyAqKgorICoqIFdlIGRlbGV0ZSBhbGwgdGVtcG9yYXJ5IGZpbGVzIGluIGF0ZXhpdCgpLXJlZ2lzdGVyZWQgY2FsbGJhY2tzLgorICoqIGhvd2V2ZXIsIHRoZSBXaW4zMiBEZWxldGVGaWxlIGlzIHVuYWJsZSB0byByZW1vdmUgYSBmaWxlIHVubGVzcworICoqIGFsbCBIQU5ETEVzIHRvIGl0IGFyZSBjbG9zZWQgaW4gdGhlIHRlcm1pbmF0aW5nIHByb2Nlc3MuCisgKioKKyAqKiBDYWxsICdhdGV4aXRfY2xvc2VfZmQnIG9uIGEgbmV3bHkgb3Blbi1lZCBmaWxlIGRlc2NyaXB0b3IgdG8gaW5kaWNhdGUKKyAqKiB0aGF0IHlvdSB3YW50IGl0IGNsb3NlZCBpbiBhdGV4aXQoKSB0aW1lLiBZb3Ugc2hvdWxkIGFsd2F5cyBjYWxsCisgKiogdGhpcyBmdW5jdGlvbiB1bmxlc3MgeW91J3JlIGNlcnRhaW4gdGhhdCB0aGUgY29ycmVzcG9uZGluZyBmaWxlCisgKiogY2Fubm90IGJlIHRlbXBvcmFyeS4KKyAqKgorICoqIENhbGwgJ2F0ZXhpdF9jbG9zZV9mZF9yZW1vdmUnIGJlZm9yZSBleHBsaWNpdGVseSBjbG9zaW5nIGEgJ2ZkJworICoqLworZXh0ZXJuIHZvaWQgICAgICAgICAgYXRleGl0X2Nsb3NlX2ZkKGludCAgZmQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgYXRleGl0X2Nsb3NlX2ZkX3JlbW92ZShpbnQgIGZkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdGltZXpvbmUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RpbWV6b25lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzhlMDNkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RpbWV6b25lLmNwcApAQCAtMCwwICsxLDE0MDggQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RpbWV6b25lLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L1Njb3BlZFB0ci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYnVmcHJpbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9laW50cl93cmFwcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ0Zvcm1hdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjZGVmaW5lICBERUJVRyAgMQorCisjaWYgMQorIyAgZGVmaW5lICBEX0FDVElWRSAgIFZFUkJPU0VfQ0hFQ0sodGltZXpvbmUpCisjZWxzZQorIyAgZGVmaW5lICBEX0FDVElWRSAgIERFQlVHCisjZW5kaWYKKworI2lmIERFQlVHCisjICBkZWZpbmUgIEQoLi4uKSAgZG8geyBpZiAoRF9BQ1RJVkUpIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZWxzZQorIyAgZGVmaW5lICBEKC4uLikgICgodm9pZCkwKQorI2VuZGlmCisKKworCitzdGF0aWMgY29uc3QgY2hhciogZ2V0X3pvbmVpbmZvX3RpbWV6b25lKCB2b2lkICk7ICAvKiBmb3J3YXJkICovCisKK3N0YXRpYyBjaGFyICAgICAgICAgYW5kcm9pZF90aW1lem9uZTBbMjU2XTsKK3N0YXRpYyBjb25zdCBjaGFyKiAgYW5kcm9pZF90aW1lem9uZTsKK3N0YXRpYyBpbnQgICAgICAgICAgYW5kcm9pZF90aW1lem9uZV9pbml0OworCitzdGF0aWMgaW50CitjaGVja190aW1lem9uZV9pc196b25laW5mbyhjb25zdCBjaGFyKiAgdHopCit7CisgICAgY29uc3QgY2hhciogIHNsYXNoMSA9IE5VTEwsICpzbGFzaDIgPSBOVUxMOworCisgICAgaWYgKHR6ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogdGhlIG5hbWUgbXVzdCBiZSBvZiB0aGUgZm9ybSBBcmVhL0xvY2F0aW9uIG9yIEFyZWEvTG9jYXRpb24vU3ViTG9jYXRpb24gKi8KKyAgICBzbGFzaDEgPSBzdHJjaHIoIHR6LCAnLycgKTsKKyAgICBpZiAoc2xhc2gxID09IE5VTEwgfHwgc2xhc2gxWzFdID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgc2xhc2gyID0gc3RyY2hyKCBzbGFzaDErMSwgJy8nKTsKKyAgICBpZiAoc2xhc2gyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNsYXNoMlsxXSA9PSAwIHx8IHN0cmNocihzbGFzaDIrMSwgJy8nKSAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK2NoYXIqCitidWZwcmludF96b25laW5mb190aW1lem9uZSggY2hhciogIHAsIGNoYXIqICBlbmQgKQoreworICAgIGNvbnN0IGNoYXIqICB0eiA9IGdldF96b25laW5mb190aW1lem9uZSgpOworCisgICAgaWYgKHR6ID09IE5VTEwgfHwgIWNoZWNrX3RpbWV6b25lX2lzX3pvbmVpbmZvKHR6KSkKKyAgICAgICAgcmV0dXJuIGJ1ZnByaW50KHAsIGVuZCwgIlVua25vd24vVW5rbm93biIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJ1ZnByaW50KHAsIGVuZCwgIiVzIiwgdHopOworfQorCisvKiBvbiBPUyBYLCB0aGUgdGltZXpvbmUgZGlyZWN0b3J5IGlzIGFsd2F5cyAvdXNyL3NoYXJlL3pvbmVpbmZvCisgKiB0aGlzIG1ha2VzIHRoaW5ncyBlYXN5LgorICovCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNkZWZpbmUgIExPQ0FMVElNRV9GSUxFICAiL2V0Yy9sb2NhbHRpbWUiCisjZGVmaW5lICBaT05FSU5GT19ESVIgICAgIi91c3Ivc2hhcmUvem9uZWluZm8vIgorc3RhdGljIGNvbnN0IGNoYXIqCitnZXRfem9uZWluZm9fdGltZXpvbmUoIHZvaWQgKQoreworICAgIGlmICghYW5kcm9pZF90aW1lem9uZV9pbml0KSB7CisgICAgICAgIGNvbnN0IGNoYXIqICB0eiA9IGdldGVudigiVFoiKTsKKyAgICAgICAgY2hhciAgICAgICAgIGJ1ZmZbUEFUSF9NQVgrMV07CisKKyAgICAgICAgYW5kcm9pZF90aW1lem9uZV9pbml0ID0gMTsKKyAgICAgICAgaWYgKHR6ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCAgIGxlbiA9IHJlYWRsaW5rKExPQ0FMVElNRV9GSUxFLCBidWZmLCBzaXplb2YoYnVmZikpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICBkcHJpbnQoICIjIyMgV0FSTklORzogQ291bGQgbm90IHJlYWQgJXMsIHNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nIG9uIHlvdXIgc3lzdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMVElNRV9GSUxFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVmZltsZW5dID0gMDsKKyAgICAgICAgICAgIEQoIiVzOiAlcyBwb2ludHMgdG8gJXNcbiIsIF9fRlVOQ1RJT05fXywgTE9DQUxUSU1FX0ZJTEUsIGJ1ZmYpOworICAgICAgICAgICAgaWYgKCBtZW1jbXAoYnVmZiwgWk9ORUlORk9fRElSLCBzaXplb2YoWk9ORUlORk9fRElSKS0xKSApIHsKKyAgICAgICAgICAgICAgICBkcHJpbnQoICIjIyMgV0FSTklORzogJXMgZG9lcyBub3QgcG9pbnQgdG8gJXMsIGNhbid0IGRldGVybWluZSB6b25laW5mbyB0aW1lem9uZSBuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMVElNRV9GSUxFLCBaT05FSU5GT19ESVIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR6ID0gYnVmZiArIHNpemVvZihaT05FSU5GT19ESVIpLTE7CisgICAgICAgICAgICBpZiAoICFjaGVja190aW1lem9uZV9pc196b25laW5mbyh0eikgKSB7CisgICAgICAgICAgICAgICAgZHByaW50KCAiIyMjIFdBUk5JTkc6ICVzIGRvZXMgbm90IHBvaW50IHRvIHpvbmVpbmZvLWNvbXBhdGlibGUgdGltZXpvbmUgbmFtZVxuIiwgTE9DQUxUSU1FX0ZJTEUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihhbmRyb2lkX3RpbWV6b25lMCwgc2l6ZW9mKGFuZHJvaWRfdGltZXpvbmUwKSwgIiVzIiwgdHogKTsKKyAgICAgICAgYW5kcm9pZF90aW1lem9uZSA9IGFuZHJvaWRfdGltZXpvbmUwOworICAgIH0KKyAgICBEKCAiZm91bmQgdGltZXpvbmUgJXMiLCBhbmRyb2lkX3RpbWV6b25lICk7CisgICAgcmV0dXJuIGFuZHJvaWRfdGltZXpvbmU7Cit9CisKKyNlbmRpZiAgLyogX19BUFBMRV9fICovCisKKy8qIG9uIExpbnV4LCB3aXRoIGdsaWJjMiwgdGhlIHpvbmVpbmZvIGRpcmVjdG9yeSBjYW4gYmUgY2hhbmdlZCB3aXRoIFRaRElSIGVudmlyb25tZW50IHZhcmlhYmxlCisgKiBidXQgc2hvdWxkIGJlIC91c3Ivc2hhcmUvem9uZWluZm8gYnkgZGVmYXVsdC4gL2V0Yy9sb2NhbHRpbWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24KKyAqIGFsbCBwbGF0Zm9ybXMsIHNvIGlmIGl0IGRvZXNuJ3QsIHRyeSAkVFpESVIvbG9jYWx0aW1lLCB0aGVuIC91c3Ivc2hhcmUvem9uZWluZm8vbG9jYXRpbWUKKyAqIHVnbHksIGlzbid0IGl0ID8KKyAqCisgKiBiZXNpZGVzLCBtb2Rlcm4gTGludXggZGlzdHJpYnV0aW9uIGRvbid0IG1ha2UgL2V0Yy9sb2NhbHRpbWUgYSBzeW1saW5rIGJ1dCBhIHN0cmFpZ2h0IGNvcHkgb2YKKyAqIHRoZSBvcmlnaW5hbCB0aW1lem9uZSBmaWxlLiB0aGUgb25seSB3YXkgdG8ga25vdyB3aGljaCB6b25laW5mbyBuYW1lIHRvIHJldHJpZXZlIGlzIHRvIGNvbXBhcmUKKyAqIGl0IHdpdGggYWxsIGZpbGVzIGluICRUWkRJUiAoYXQgbGVhc3QgdGhvc2UgdGhhdCBtYXRjaCBBcmVhL0xvY2F0aW9uIG9yIEFyZWEvTG9jYXRpb24vU3ViTG9jYXRpb24KKyAqLworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lICBaT05FSU5GT19ESVIgICIvdXNyL3NoYXJlL3pvbmVpbmZvLyIKKyNkZWZpbmUgIExPQ0FMVElNRV9GSUxFMSAgIi9ldGMvbG9jYWx0aW1lIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogICBsb2NhbHRpbWU7CisgICAgc3RydWN0IHN0YXQgICBsb2NhbHRpbWVfc3Q7CisgICAgY2hhciogICAgICAgICBwYXRoX2VuZDsKKyAgICBjaGFyKiAgICAgICAgIHBhdGhfcm9vdDsKKyAgICBjaGFyICAgICAgICAgIHBhdGhbIFBBVEhfTUFYIF07Cit9IFNjYW5EYXRhUmVjOworCitzdGF0aWMgaW50Citjb21wYXJlX3RpbWV6b25lX3RvX2xvY2FsdGltZSggU2NhbkRhdGFSZWMqICBzY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgcGF0aCApCit7CisgICAgc3RydWN0ICBzdGF0ICBzdDsKKyAgICBpbnQgICAgICAgICAgIGZkMSwgZmQyLCByZXN1bHQgPSAwOworCisgICAgRCggIiVzOiBjb21wYXJpbmcgJXM6IiwgX19GVU5DVElPTl9fLCBwYXRoICk7CisKKyAgICBpZiAoIHN0YXQoIHBhdGgsICZzdCApIDwgMCApIHsKKyAgICAgICAgRCggIiBjYW4ndCBzdGF0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggc3Quc3Rfc2l6ZSAhPSBzY2FuLT5sb2NhbHRpbWVfc3Quc3Rfc2l6ZSApIHsKKyAgICAgICAgRCggIiBzaXplIG1pc3RtYXRjaCAoJXpkICE9ICV6ZClcbiIsIChzaXplX3Qpc3Quc3Rfc2l6ZSwgKHNpemVfdClzY2FuLT5sb2NhbHRpbWVfc3Quc3Rfc2l6ZSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmZDEgPSBvcGVuKCBzY2FuLT5sb2NhbHRpbWUsIE9fUkRPTkxZICk7CisgICAgaWYgKGZkMSA8IDApIHsKKyAgICAgICAgRCgiIGNhbid0IG9wZW4gJXM6ICVzXG4iLCBzY2FuLT5sb2NhbHRpbWUsIHN0cmVycm9yKGVycm5vKSApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmQyID0gb3BlbiggcGF0aCwgT19SRE9OTFkgKTsKKyAgICBpZiAoZmQyIDwgMCkgeworICAgICAgICBEKCIgY2FuJ3Qgb3BlbiAlczogJXNcbiIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSApOworICAgICAgICBjbG9zZShmZDEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZG8geworICAgICAgICBvZmZfdCAgbm47CisKKyAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgc3Quc3Rfc2l6ZTsgbm4rKykgeworICAgICAgICAgICAgY2hhciAgdGVtcFsyXTsKKyAgICAgICAgICAgIGludCAgIHJldDsKKworICAgICAgICAgICAgcmV0ID0gSEFORExFX0VJTlRSKHJlYWQoZmQxLCAmdGVtcFswXSwgMSkpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIGJyZWFrOworCisgICAgICAgICAgICByZXQgPSBIQU5ETEVfRUlOVFIocmVhZChmZDIsICZ0ZW1wWzFdLCAxKSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgYnJlYWs7CisKKyAgICAgICAgICAgIGlmICh0ZW1wWzBdICE9IHRlbXBbMV0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSAobm4gPT0gc3Quc3Rfc2l6ZSk7CisKKyAgICB9IHdoaWxlICgwKTsKKworICAgIEQoIHJlc3VsdCA/ICIgTUFUQ0hcbiIgOiAibm8gbWF0Y2hcbiIgKTsKKworICAgIGNsb3NlKGZkMik7CisgICAgY2xvc2UoZmQxKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorc2Nhbl90aW1lem9uZV9kaXIoIFNjYW5EYXRhUmVjKiAgc2NhbiwKKyAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGRlcHRoICkKK3sKKyAgICBESVIqICAgICAgICAgZCA9IG9wZW5kaXIoIHNjYW4tPnBhdGggKTsKKyAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKKworICAgIEQoICIlczogZW50ZXJpbmcgJyVzXG4iLCBfX0ZVTkNUSU9OX18sIHNjYW4tPnBhdGggKTsKKyAgICBpZiAoZCAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCAgZGlyZW50KiAgZW50OworICAgICAgICB3aGlsZSAoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cnVjdCBzdGF0ICAgZW50X3N0OworICAgICAgICAgICAgY2hhciogICAgICAgICBwID0gdG9wOworCisgICAgICAgICAgICBpZiAgKGVudC0+ZF9uYW1lWzBdID09ICcuJykgIC8qIGF2b2lkIGhpZGRlbiBhbmQgc3BlY2lhbCBmaWxlcyAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBwID0gYnVmcHJpbnQoIHAsIHNjYW4tPnBhdGhfZW5kLCAiLyVzIiwgZW50LT5kX25hbWUgKTsKKyAgICAgICAgICAgIGlmIChwID49IHNjYW4tPnBhdGhfZW5kKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvL0QoICIlczogc2Nhbm5pbmcgJyVzJ1xuIiwgX19GVU5DVElPTl9fLCBzY2FuLT5wYXRoICk7CisKKyAgICAgICAgICAgIC8vIEltcG9ydGFudDogdXNlIGxzdGF0KCkgaW5zdGVhZCBvZiBzdGF0KCkgYmVjYXVzZSByZWNlbnQKKyAgICAgICAgICAgIC8vIFVidW50dSBkaXN0cmlidXRpb25zIGNyZWF0ZXMgZGlyZWN0b3JpZXMgZnVsbCBvZiBsaW5rcywgZS5nLgorICAgICAgICAgICAgLy8gL3Vzci9zaGFyZS9pbmZvL3Bvc2l4L0F1c3RyYWxpYS9TeWRuZXkgLT4gLi4vLi4vQXVzdHJhbGlhL1N5ZG5leQorICAgICAgICAgICAgLy8gYW5kIHdlIHdhbnQgdG8gaWdub3JlIHRoZW0uCisgICAgICAgICAgICBpZiAoIGxzdGF0KCBzY2FuLT5wYXRoLCAmZW50X3N0ICkgPCAwICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCBTX0lTRElSKGVudF9zdC5zdF9tb2RlKSAmJiBkZXB0aCA8IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vRCggIiVzOiBkaXJlY3RvcnkgJyVzJ1xuIiwgX19GVU5DVElPTl9fLCBzY2FuLT5wYXRoICk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2Nhbl90aW1lem9uZV9kaXIoIHNjYW4sIHAsIGRlcHRoICsgMSApOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggU19JU1JFRyhlbnRfc3Quc3RfbW9kZSkgJiYgKGRlcHRoID49IDEgJiYgZGVwdGggPD0gMikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIqICAgbmFtZSA9IHNjYW4tPnBhdGhfcm9vdCArIDE7CisKKyAgICAgICAgICAgICAgICBpZiAoIGNoZWNrX3RpbWV6b25lX2lzX3pvbmVpbmZvKCBuYW1lICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVfdGltZXpvbmVfdG9fbG9jYWx0aW1lKCBzY2FuLCBzY2FuLT5wYXRoICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmR1cCggbmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgRCggIiVzOiBmb3VuZCAnJXMnXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EKCAiJXM6IGlnbm9yaW5nICclcydcbiIsIF9fRlVOQ1RJT05fXywgc2Nhbi0+cGF0aCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkKTsKKyAgICB9CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKgorZ2V0X3pvbmVpbmZvX3RpbWV6b25lKCB2b2lkICkKK3sKKyAgICBpZiAoIWFuZHJvaWRfdGltZXpvbmVfaW5pdCkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqICB0eiA9IGdldGVudiggIlRaIiApOworCisgICAgICAgIC8vIGlmIHdlIGV2ZXIgYWxsb2NhdGUgaW50byB0eiwgdGhpcyBvYmplY3Qgd2lsbCB0YWtlIGNhcmUgb2YgaXQuCisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNjb3BlZENQdHI8Y29uc3QgY2hhcj4gdHpEZWxldGVyOworCisgICAgICAgIGFuZHJvaWRfdGltZXpvbmVfaW5pdCA9IDE7CisKKyAgICAgICAgaWYgKCB0eiAhPSBOVUxMICYmICFjaGVja190aW1lem9uZV9pc196b25laW5mbyh0eikgKSB7CisgICAgICAgICAgICBEKCAiJXM6IGlnbm9yaW5nIG5vbiB6b25laW5mbyBmb3JtYXR0ZWQgVFogZW52aXJvbm1lbnQgdmFyaWFibGU6ICclcydcbiIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR6ICk7CisgICAgICAgICAgICB0eiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHogPT0gTlVMTCkgeworICAgICAgICAgICAgaW50ICAgICAgICAgIGxlbjsKKyAgICAgICAgICAgIGNoYXIgICAgICAgICB0ZW1wWyBQQVRIX01BWCBdOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgIHR6ZGlyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgIGxvY2FsdGltZTsKKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHRpbWV6b25lIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBlbnYgPSBnZXRlbnYoIlRaRElSIik7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHpvbmVpbmZvX2RpciA9IFpPTkVJTkZPX0RJUjsKKworICAgICAgICAgICAgICAgIGlmIChlbnYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZW52ID0gem9uZWluZm9fZGlyOworCisgICAgICAgICAgICAgICAgaWYgKCBhY2Nlc3MoIGVudiwgUl9PSyApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggZW52ID09IHpvbmVpbmZvX2RpciApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIyMgV0FSTklORzogY291bGQgbm90IGZpbmQgJXMgZGlyZWN0b3J5LiB1bmFibGUgdG8gZGV0ZXJtaW5lIGhvc3QgdGltZXpvbmVcbiIsIGVudiApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgRCggIiVzOiBUWkRJUiBkb2VzIG5vdCBwb2ludCB0byB2YWxpZCBkaXJlY3RvcnksIHVzaW5nICVzIGluc3RlYWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHpvbmVpbmZvX2RpciApOworICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gem9uZWluZm9fZGlyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0emRpciA9IGVudjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCBpZiBhbnkgKi8KKyAgICAgICAgICAgIGlmICghdHpkaXIuZW1wdHkoKSAmJiB0emRpci5iYWNrKCkgPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgdHpkaXIucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEQoICIlczogZm91bmQgdGltZXpvbmUgZGlyIGFzICVzXG4iLCBfX0ZVTkNUSU9OX18sIHR6ZGlyLmNfc3RyKCkgKTsKKworICAgICAgICAgICAgLyogdHJ5IHRvIGZpbmQgdGhlIGxvY2FsdGltZSBmaWxlICovCisgICAgICAgICAgICBjb25zdCBjaGFyKiBsb2NhbHRpbWVQdHIgPSBMT0NBTFRJTUVfRklMRTE7CisgICAgICAgICAgICBpZiAoIGFjY2VzcyggbG9jYWx0aW1lUHRyLCBSX09LICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBjaGFyICAqcCA9IHRlbXAsICplbmQgPSBwICsgc2l6ZW9mKHRlbXApOworCisgICAgICAgICAgICAgICAgcCA9IGJ1ZnByaW50KCBwLCBlbmQsICIlcy8lcyIsIHR6ZGlyLmNfc3RyKCksICJsb2NhbHRpbWUiICk7CisgICAgICAgICAgICAgICAgaWYgKHAgPj0gZW5kIHx8IGFjY2VzcyggdGVtcCwgUl9PSyApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiMjIyBXQVJOSU5HOiBjb3VsZCBub3QgZmluZCAlcyBvciAlcy4gdW5hYmxlIHRvIGRldGVybWluZSBob3N0IHRpbWV6b25lXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMVElNRV9GSUxFMSwgdGVtcCApOworICAgICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvY2FsdGltZVB0ciA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NhbHRpbWUgPSBsb2NhbHRpbWVQdHI7CisgICAgICAgICAgICBEKCAiJXM6IGZvdW5kIGxvY2FsdGltZSBmaWxlIGFzICVzXG4iLCBfX0ZVTkNUSU9OX18sIGxvY2FsdGltZS5jX3N0cigpICk7CisKKyNpZiAxCisgICAgICAgICAgICAvKiBpZiB0aGUgbG9jYWx0aW1lIGZpbGUgaXMgYSBsaW5rLCBtYWtlIGEgcXVpY2sgY2hlY2sgKi8KKyAgICAgICAgICAgIGxlbiA9IHJlYWRsaW5rKCBsb2NhbHRpbWUuY19zdHIoKSwgdGVtcCwgc2l6ZW9mKHRlbXApLTEgKTsKKyAgICAgICAgICAgIGlmIChsZW4gPj0gMCAmJiBsZW4gPiBzdGF0aWNfY2FzdDxpbnQ+KHR6ZGlyLnNpemUoKSkgKyAyKSB7CisgICAgICAgICAgICAgICAgdGVtcFtsZW5dID0gMDsKKworICAgICAgICAgICAgICAgIC8qIHZlcmlmeSB0aGF0IHRoZSBsaW5rIHBvaW50cyB0byB0emRpci88c29tZXRoaW5nPiB3aGVyZSA8c29tZXRoaW5nPiBpcyBhIHZhbGlkIHpvbmVpbmZvIG5hbWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoICFtZW1jbXAoIHRlbXAsIHR6ZGlyLmNfc3RyKCksIHR6ZGlyLnNpemUoKSApICYmIHRlbXBbdHpkaXIuc2l6ZSgpXSA9PSAnLycgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggY2hlY2tfdGltZXpvbmVfaXNfem9uZWluZm8oIHRlbXAgKyB0emRpci5zaXplKCkgKyAxICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIGl0ICEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdGVtcCArIHR6ZGlyLnNpemUoKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBEKCAiJXM6IGZvdW5kIHpvbmVpbmZvIHRpbWV6b25lICVzIGZyb20gJXMgc3ltbGlua1xuIiwgX19GVU5DVElPTl9fLCB0eiwgbG9jYWx0aW1lLmNfc3RyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBEKCAiJXM6ICVzIGxpbmsgcG9pbnRzIHRvIG5vbi16b25laW5mbyBmaWxlbmFtZSAlcywgY29tcGFyaW5nIGNvbnRlbnRzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxvY2FsdGltZS5jX3N0cigpLCB0ZW1wICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgcGFyc2UgYWxsIGZpbGVzIHVuZGVyIHR6ZGlyIGFuZCBzZWUgaWYgd2UgaGF2ZSBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIGl0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU2NhbkRhdGFSZWMgIHNjYW5bMV07CisKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXQoIGxvY2FsdGltZS5jX3N0cigpLCAmc2Nhbi0+bG9jYWx0aW1lX3N0ICkgPCAwICkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIjIyMgV0FSTklORzogY2FuJ3QgYWNjZXNzICclcycsIHVuYWJsZSB0byBkZXRlcm1pbmUgaG9zdCB0aW1lem9uZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWx0aW1lLmNfc3RyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNjYW4tPmxvY2FsdGltZSA9IGxvY2FsdGltZS5jX3N0cigpOworICAgICAgICAgICAgICAgIHNjYW4tPnBhdGhfZW5kICA9IHNjYW4tPnBhdGggKyBzaXplb2Yoc2Nhbi0+cGF0aCk7CisgICAgICAgICAgICAgICAgc2Nhbi0+cGF0aF9yb290ID0gYnVmcHJpbnQoIHNjYW4tPnBhdGgsIHNjYW4tPnBhdGhfZW5kLCAiJXMiLCB0emRpci5jX3N0cigpICk7CisKKyAgICAgICAgICAgICAgICB0eiA9IHNjYW5fdGltZXpvbmVfZGlyKCBzY2FuLCBzY2FuLT5wYXRoX3Jvb3QsIDAgKTsKKyAgICAgICAgICAgICAgICB0ekRlbGV0ZXIucmVzZXQodHopOworICAgICAgICAgICAgfQorCisgICAgICAgIEV4aXQ6CisgICAgICAgICAgICBpZiAodHogPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGFuZHJvaWRfdGltZXpvbmUwLCBzaXplb2YoYW5kcm9pZF90aW1lem9uZTApLCAiJXMiLCB0eik7CisgICAgICAgIGFuZHJvaWRfdGltZXpvbmUgPSBhbmRyb2lkX3RpbWV6b25lMDsKKworICAgICAgICBEKCAiZm91bmQgdGltZXpvbmUgJXNcbiIsIGFuZHJvaWRfdGltZXpvbmUgKTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWRfdGltZXpvbmU7Cit9CisKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworCisvKiBvbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHRyYW5zbGF0ZSB0aGUgV2luZG93cyB0aW1lem9uZSBpbnRvIGEgWm9uZUluZm8gb25lICovCisjaWZkZWYgX1dJTjMyCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvZmlsZXMvU2NvcGVkUmVnS2V5LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqICB3aW5fbmFtZTsKKyAgICBjb25zdCBjaGFyKiAgem9uZWluZm9fbmFtZTsKK30gV2luMzJUaW1lem9uZTsKKworLyogdGFibGUgZ2VuZXJhdGVkIGZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9jbGRyL2NoYXJ0cy9sYXRlc3Qvc3VwcGxlbWVudGFsL3pvbmVfdHppZC5odG1sICovCitzdGF0aWMgY29uc3QgV2luMzJUaW1lem9uZSAgX3dpbjMyX3RpbWV6b25lc1tdID0geworICAgIHsgIkFVUyBDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQXVzdHJhbGlhL0RhcndpbiIgfSwKKyAgICB7ICJBVVMgRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkF1c3RyYWxpYS9TeWRuZXkiIH0sCisgICAgeyAiQVVTIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvTWVsYm91cm5lIiB9LAorICAgIHsgIkFmZ2hhbmlzdGFuIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LYWJ1bCIgfSwKKyAgICB7ICJBbGFza2FuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BbmNob3JhZ2UiIH0sCisgICAgeyAiQWxhc2thbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSnVuZWF1IiB9LAorICAgIHsgIkFsYXNrYW4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL01ldGxha2F0bGEiIH0sCisgICAgeyAiQWxhc2thbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTm9tZSIgfSwKKyAgICB7ICJBbGFza2FuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TaXRrYSIgfSwKKyAgICB7ICJBbGFza2FuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9ZYWt1dGF0IiB9LAorICAgIHsgIkFsZXV0aWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BZGFrIiB9LAorICAgIHsgIkFsdGFpIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9CYXJuYXVsIiB9LAorICAgIHsgIkFyYWIgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1JpeWFkaCIgfSwKKyAgICB7ICJBcmFiIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9CYWhyYWluIiB9LAorICAgIHsgIkFyYWIgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0t1d2FpdCIgfSwKKyAgICB7ICJBcmFiIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9RYXRhciIgfSwKKyAgICB7ICJBcmFiIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9BZGVuIiB9LAorICAgIHsgIkFyYWJpYW4gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0R1YmFpIiB9LAorICAgIHsgIkFyYWJpYW4gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL011c2NhdCIgfSwKKyAgICB7ICJBcmFiaWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC00IiB9LAorICAgIHsgIkFyYWJpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQmFnaGRhZCIgfSwKKyAgICB7ICJBcmdlbnRpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0J1ZW5vc19BaXJlcyIgfSwKKyAgICB7ICJBcmdlbnRpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0FyZ2VudGluYS9MYV9SaW9qYSIgfSwKKyAgICB7ICJBcmdlbnRpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0FyZ2VudGluYS9SaW9fR2FsbGVnb3MiIH0sCisgICAgeyAiQXJnZW50aW5hIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BcmdlbnRpbmEvU2FsdGEiIH0sCisgICAgeyAiQXJnZW50aW5hIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BcmdlbnRpbmEvU2FuX0p1YW4iIH0sCisgICAgeyAiQXJnZW50aW5hIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BcmdlbnRpbmEvU2FuX0x1aXMiIH0sCisgICAgeyAiQXJnZW50aW5hIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BcmdlbnRpbmEvVHVjdW1hbiIgfSwKKyAgICB7ICJBcmdlbnRpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0FyZ2VudGluYS9Vc2h1YWlhIiB9LAorICAgIHsgIkFyZ2VudGluYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ2F0YW1hcmNhIiB9LAorICAgIHsgIkFyZ2VudGluYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ29yZG9iYSIgfSwKKyAgICB7ICJBcmdlbnRpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0p1anV5IiB9LAorICAgIHsgIkFyZ2VudGluYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTWVuZG96YSIgfSwKKyAgICB7ICJBc3RyYWtoYW4gU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQXN0cmFraGFuIiB9LAorICAgIHsgIkFzdHJha2hhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9VbHlhbm92c2siIH0sCisgICAgeyAiQXRsYW50aWMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0hhbGlmYXgiIH0sCisgICAgeyAiQXRsYW50aWMgU3RhbmRhcmQgVGltZSIsICAgICJBdGxhbnRpYy9CZXJtdWRhIiB9LAorICAgIHsgIkF0bGFudGljIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9HbGFjZV9CYXkiIH0sCisgICAgeyAiQXRsYW50aWMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0dvb3NlX0JheSIgfSwKKyAgICB7ICJBdGxhbnRpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTW9uY3RvbiIgfSwKKyAgICB7ICJBdGxhbnRpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvVGh1bGUiIH0sCisgICAgeyAiQXVzIENlbnRyYWwgVy4gU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvRXVjbGEiIH0sCisgICAgeyAiQXplcmJhaWphbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQmFrdSIgfSwKKyAgICB7ICJBem9yZXMgU3RhbmRhcmQgVGltZSIsICAgICJBdGxhbnRpYy9Bem9yZXMiIH0sCisgICAgeyAiQXpvcmVzIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TY29yZXNieXN1bmQiIH0sCisgICAgeyAiQmFoaWEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0JhaGlhIiB9LAorICAgIHsgIkJhbmdsYWRlc2ggU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0RoYWthIiB9LAorICAgIHsgIkJhbmdsYWRlc2ggU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1RoaW1waHUiIH0sCisgICAgeyAiQmVsYXJ1cyBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9NaW5zayIgfSwKKyAgICB7ICJCb3VnYWludmlsbGUgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL0JvdWdhaW52aWxsZSIgfSwKKyAgICB7ICJDYW5hZGEgQ2VudHJhbCBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvUmVnaW5hIiB9LAorICAgIHsgIkNhbmFkYSBDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Td2lmdF9DdXJyZW50IiB9LAorICAgIHsgIkNhcGUgVmVyZGUgU3RhbmRhcmQgVGltZSIsICAgICJBdGxhbnRpYy9DYXBlX1ZlcmRlIiB9LAorICAgIHsgIkNhcGUgVmVyZGUgU3RhbmRhcmQgVGltZSIsICAgICJFdGMvR01UKzEiIH0sCisgICAgeyAiQ2F1Y2FzdXMgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1llcmV2YW4iIH0sCisgICAgeyAiQ2VuLiBBdXN0cmFsaWEgU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvQWRlbGFpZGUiIH0sCisgICAgeyAiQ2VuLiBBdXN0cmFsaWEgU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvQnJva2VuX0hpbGwiIH0sCisgICAgeyAiQ2VudHJhbCBBbWVyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9HdWF0ZW1hbGEiIH0sCisgICAgeyAiQ2VudHJhbCBBbWVyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9CZWxpemUiIH0sCisgICAgeyAiQ2VudHJhbCBBbWVyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Db3N0YV9SaWNhIiB9LAorICAgIHsgIkNlbnRyYWwgQW1lcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvR2FsYXBhZ29zIiB9LAorICAgIHsgIkNlbnRyYWwgQW1lcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvVGVndWNpZ2FscGEiIH0sCisgICAgeyAiQ2VudHJhbCBBbWVyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9NYW5hZ3VhIiB9LAorICAgIHsgIkNlbnRyYWwgQW1lcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvRWxfU2FsdmFkb3IiIH0sCisgICAgeyAiQ2VudHJhbCBBbWVyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVCs2IiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQWxtYXR5IiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFudGFyY3RpY2EvVm9zdG9rIiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvVXJ1bXFpIiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9DaGFnb3MiIH0sCisgICAgeyAiQ2VudHJhbCBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9CaXNoa2VrIiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvUXl6eWxvcmRhIiB9LAorICAgIHsgIkNlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQtNiIgfSwKKyAgICB7ICJDZW50cmFsIEJyYXppbGlhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ3VpYWJhIiB9LAorICAgIHsgIkNlbnRyYWwgQnJhemlsaWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9DYW1wb19HcmFuZGUiIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQnVkYXBlc3QiIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvVGlyYW5lIiB9LAorICAgIHsgIkNlbnRyYWwgRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1ByYWd1ZSIgfSwKKyAgICB7ICJDZW50cmFsIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Qb2Rnb3JpY2EiIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQmVsZ3JhZGUiIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTGp1YmxqYW5hIiB9LAorICAgIHsgIkNlbnRyYWwgRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0JyYXRpc2xhdmEiIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGVhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9XYXJzYXciIH0sCisgICAgeyAiQ2VudHJhbCBFdXJvcGVhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9TYXJhamV2byIgfSwKKyAgICB7ICJDZW50cmFsIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1phZ3JlYiIgfSwKKyAgICB7ICJDZW50cmFsIEV1cm9wZWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1Nrb3BqZSIgfSwKKyAgICB7ICJDZW50cmFsIFBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL0d1YWRhbGNhbmFsIiB9LAorICAgIHsgIkNlbnRyYWwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFudGFyY3RpY2EvTWFjcXVhcmllIiB9LAorICAgIHsgIkNlbnRyYWwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvUG9uYXBlIiB9LAorICAgIHsgIkNlbnRyYWwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvS29zcmFlIiB9LAorICAgIHsgIkNlbnRyYWwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvTm91bWVhIiB9LAorICAgIHsgIkNlbnRyYWwgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvRWZhdGUiIH0sCisgICAgeyAiQ2VudHJhbCBQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC0xMSIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9DaGljYWdvIiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1dpbm5pcGVnIiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1JhaW55X1JpdmVyIiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1Jhbmtpbl9JbmxldCIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9SZXNvbHV0ZSIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9NYXRhbW9yb3MiIH0sCisgICAgeyAiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSW5kaWFuYS9Lbm94IiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0luZGlhbmEvVGVsbF9DaXR5IiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL01lbm9taW5lZSIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Ob3J0aF9EYWtvdGEvQmV1bGFoIiB9LAorICAgIHsgIkNlbnRyYWwgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL05vcnRoX0Rha290YS9DZW50ZXIiIH0sCisgICAgeyAiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTm9ydGhfRGFrb3RhL05ld19TYWxlbSIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQ1NUNkNEVCIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUgKE1leGljbykiLCAgICAiQW1lcmljYS9NZXhpY29fQ2l0eSIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUgKE1leGljbykiLCAgICAiQW1lcmljYS9CYWhpYV9CYW5kZXJhcyIgfSwKKyAgICB7ICJDZW50cmFsIFN0YW5kYXJkIFRpbWUgKE1leGljbykiLCAgICAiQW1lcmljYS9NZXJpZGEiIH0sCisgICAgeyAiQ2VudHJhbCBTdGFuZGFyZCBUaW1lIChNZXhpY28pIiwgICAgIkFtZXJpY2EvTW9udGVycmV5IiB9LAorICAgIHsgIkNoYXRoYW0gSXNsYW5kcyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvQ2hhdGhhbSIgfSwKKyAgICB7ICJDaGluYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvU2hhbmdoYWkiIH0sCisgICAgeyAiQ2hpbmEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0hvbmdfS29uZyIgfSwKKyAgICB7ICJDaGluYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvTWFjYXUiIH0sCisgICAgeyAiQ3ViYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSGF2YW5hIiB9LAorICAgIHsgIkRhdGVsaW5lIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVCsxMiIgfSwKKyAgICB7ICJFLiBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvTmFpcm9iaSIgfSwKKyAgICB7ICJFLiBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBbnRhcmN0aWNhL1N5b3dhIiB9LAorICAgIHsgIkUuIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9Eamlib3V0aSIgfSwKKyAgICB7ICJFLiBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvQXNtZXJhIiB9LAorICAgIHsgIkUuIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9BZGRpc19BYmFiYSIgfSwKKyAgICB7ICJFLiBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJJbmRpYW4vQ29tb3JvIiB9LAorICAgIHsgIkUuIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9BbnRhbmFuYXJpdm8iIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0toYXJ0b3VtIiB9LAorICAgIHsgIkUuIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9Nb2dhZGlzaHUiIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0p1YmEiIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0Rhcl9lc19TYWxhYW0iIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0thbXBhbGEiIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiSW5kaWFuL01heW90dGUiIH0sCisgICAgeyAiRS4gQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC0zIiB9LAorICAgIHsgIkUuIEF1c3RyYWxpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkF1c3RyYWxpYS9CcmlzYmFuZSIgfSwKKyAgICB7ICJFLiBBdXN0cmFsaWEgU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvTGluZGVtYW4iIH0sCisgICAgeyAiRS4gRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0NoaXNpbmF1IiB9LAorICAgIHsgIkUuIFNvdXRoIEFtZXJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1Nhb19QYXVsbyIgfSwKKyAgICB7ICJFYXN0ZXIgSXNsYW5kIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9FYXN0ZXIiIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTmV3X1lvcmsiIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTmFzc2F1IiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1Rvcm9udG8iIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSXFhbHVpdCIgfSwKKyAgICB7ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Nb250cmVhbCIgfSwKKyAgICB7ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9OaXBpZ29uIiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1BhbmduaXJ0dW5nIiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1RodW5kZXJfQmF5IiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0RldHJvaXQiIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSW5kaWFuYS9QZXRlcnNidXJnIiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0luZGlhbmEvVmluY2VubmVzIiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0luZGlhbmEvV2luYW1hYyIgfSwKKyAgICB7ICJFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9LZW50dWNreS9Nb250aWNlbGxvIiB9LAorICAgIHsgIkVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0xvdWlzdmlsbGUiIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkVTVDVFRFQiIH0sCisgICAgeyAiRWFzdGVybiBTdGFuZGFyZCBUaW1lIChNZXhpY28pIiwgICAgIkFtZXJpY2EvQ2FuY3VuIiB9LAorICAgIHsgIkVneXB0IFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0NhaXJvIiB9LAorICAgIHsgIkVrYXRlcmluYnVyZyBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvWWVrYXRlcmluYnVyZyIgfSwKKyAgICB7ICJGTEUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvS2lldiIgfSwKKyAgICB7ICJGTEUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTWFyaWVoYW1uIiB9LAorICAgIHsgIkZMRSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Tb2ZpYSIgfSwKKyAgICB7ICJGTEUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvVGFsbGlubiIgfSwKKyAgICB7ICJGTEUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvSGVsc2lua2kiIH0sCisgICAgeyAiRkxFIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1ZpbG5pdXMiIH0sCisgICAgeyAiRkxFIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1JpZ2EiIH0sCisgICAgeyAiRkxFIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1V6aGdvcm9kIiB9LAorICAgIHsgIkZMRSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9aYXBvcm96aHllIiB9LAorICAgIHsgIkZpamkgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL0ZpamkiIH0sCisgICAgeyAiR01UIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0xvbmRvbiIgfSwKKyAgICB7ICJHTVQgU3RhbmRhcmQgVGltZSIsICAgICJBdGxhbnRpYy9DYW5hcnkiIH0sCisgICAgeyAiR01UIFN0YW5kYXJkIFRpbWUiLCAgICAiQXRsYW50aWMvRmFlcm9lIiB9LAorICAgIHsgIkdNVCBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9HdWVybnNleSIgfSwKKyAgICB7ICJHTVQgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvRHVibGluIiB9LAorICAgIHsgIkdNVCBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Jc2xlX29mX01hbiIgfSwKKyAgICB7ICJHTVQgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvSmVyc2V5IiB9LAorICAgIHsgIkdNVCBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9MaXNib24iIH0sCisgICAgeyAiR01UIFN0YW5kYXJkIFRpbWUiLCAgICAiQXRsYW50aWMvTWFkZWlyYSIgfSwKKyAgICB7ICJHVEIgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQnVjaGFyZXN0IiB9LAorICAgIHsgIkdUQiBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvTmljb3NpYSIgfSwKKyAgICB7ICJHVEIgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQXRoZW5zIiB9LAorICAgIHsgIkdlb3JnaWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9UYmlsaXNpIiB9LAorICAgIHsgIkdyZWVubGFuZCBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvR29kdGhhYiIgfSwKKyAgICB7ICJHcmVlbndpY2ggU3RhbmRhcmQgVGltZSIsICAgICJBdGxhbnRpYy9SZXlramF2aWsiIH0sCisgICAgeyAiR3JlZW53aWNoIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL091YWdhZG91Z291IiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9BYmlkamFuIiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9BY2NyYSIgfSwKKyAgICB7ICJHcmVlbndpY2ggU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvQmFuanVsIiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9Db25ha3J5IiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9CaXNzYXUiIH0sCisgICAgeyAiR3JlZW53aWNoIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL01vbnJvdmlhIiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9CYW1ha28iIH0sCisgICAgeyAiR3JlZW53aWNoIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL05vdWFrY2hvdHQiIH0sCisgICAgeyAiR3JlZW53aWNoIFN0YW5kYXJkIFRpbWUiLCAgICAiQXRsYW50aWMvU3RfSGVsZW5hIiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9GcmVldG93biIgfSwKKyAgICB7ICJHcmVlbndpY2ggU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvRGFrYXIiIH0sCisgICAgeyAiR3JlZW53aWNoIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL1Nhb19Ub21lIiB9LAorICAgIHsgIkdyZWVud2ljaCBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9Mb21lIiB9LAorICAgIHsgIkhhaXRpIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Qb3J0LWF1LVByaW5jZSIgfSwKKyAgICB7ICJIYXdhaWlhbiBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvSG9ub2x1bHUiIH0sCisgICAgeyAiSGF3YWlpYW4gU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL1Jhcm90b25nYSIgfSwKKyAgICB7ICJIYXdhaWlhbiBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvVGFoaXRpIiB9LAorICAgIHsgIkhhd2FpaWFuIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9Kb2huc3RvbiIgfSwKKyAgICB7ICJIYXdhaWlhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQrMTAiIH0sCisgICAgeyAiSW5kaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0NhbGN1dHRhIiB9LAorICAgIHsgIklyYW4gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1RlaHJhbiIgfSwKKyAgICB7ICJJc3JhZWwgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0plcnVzYWxlbSIgfSwKKyAgICB7ICJKb3JkYW4gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0FtbWFuIiB9LAorICAgIHsgIkthbGluaW5ncmFkIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0thbGluaW5ncmFkIiB9LAorICAgIHsgIktvcmVhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9TZW91bCIgfSwKKyAgICB7ICJMaWJ5YSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9Ucmlwb2xpIiB9LAorICAgIHsgIkxpbmUgSXNsYW5kcyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvS2lyaXRpbWF0aSIgfSwKKyAgICB7ICJMaW5lIElzbGFuZHMgU3RhbmRhcmQgVGltZSIsICAgICJFdGMvR01ULTE0IiB9LAorICAgIHsgIkxvcmQgSG93ZSBTdGFuZGFyZCBUaW1lIiwgICAgIkF1c3RyYWxpYS9Mb3JkX0hvd2UiIH0sCisgICAgeyAiTWFnYWRhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvTWFnYWRhbiIgfSwKKyAgICB7ICJNYXJxdWVzYXMgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL01hcnF1ZXNhcyIgfSwKKyAgICB7ICJNYXVyaXRpdXMgU3RhbmRhcmQgVGltZSIsICAgICJJbmRpYW4vTWF1cml0aXVzIiB9LAorICAgIHsgIk1hdXJpdGl1cyBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9SZXVuaW9uIiB9LAorICAgIHsgIk1hdXJpdGl1cyBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9NYWhlIiB9LAorICAgIHsgIk1pZGRsZSBFYXN0IFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9CZWlydXQiIH0sCisgICAgeyAiTW9udGV2aWRlbyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTW9udGV2aWRlbyIgfSwKKyAgICB7ICJNb3JvY2NvIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0Nhc2FibGFuY2EiIH0sCisgICAgeyAiTW9yb2NjbyBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9FbF9BYWl1biIgfSwKKyAgICB7ICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvRGVudmVyIiB9LAorICAgIHsgIk1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9FZG1vbnRvbiIgfSwKKyAgICB7ICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ2FtYnJpZGdlX0JheSIgfSwKKyAgICB7ICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSW51dmlrIiB9LAorICAgIHsgIk1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9ZZWxsb3drbmlmZSIgfSwKKyAgICB7ICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvT2ppbmFnYSIgfSwKKyAgICB7ICJNb3VudGFpbiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQm9pc2UiIH0sCisgICAgeyAiTW91bnRhaW4gU3RhbmRhcmQgVGltZSIsICAgICJNU1Q3TURUIiB9LAorICAgIHsgIk1vdW50YWluIFN0YW5kYXJkIFRpbWUgKE1leGljbykiLCAgICAiQW1lcmljYS9DaGlodWFodWEiIH0sCisgICAgeyAiTW91bnRhaW4gU3RhbmRhcmQgVGltZSAoTWV4aWNvKSIsICAgICJBbWVyaWNhL01hemF0bGFuIiB9LAorICAgIHsgIk15YW5tYXIgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1Jhbmdvb24iIH0sCisgICAgeyAiTXlhbm1hciBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9Db2NvcyIgfSwKKyAgICB7ICJOLiBDZW50cmFsIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL05vdm9zaWJpcnNrIiB9LAorICAgIHsgIk4uIENlbnRyYWwgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvT21zayIgfSwKKyAgICB7ICJOYW1pYmlhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL1dpbmRob2VrIiB9LAorICAgIHsgIk5lcGFsIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LYXRtYW5kdSIgfSwKKyAgICB7ICJOZXcgWmVhbGFuZCBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvQXVja2xhbmQiIH0sCisgICAgeyAiTmV3IFplYWxhbmQgU3RhbmRhcmQgVGltZSIsICAgICJBbnRhcmN0aWNhL01jTXVyZG8iIH0sCisgICAgeyAiTmV3Zm91bmRsYW5kIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TdF9Kb2hucyIgfSwKKyAgICB7ICJOb3Jmb2xrIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9Ob3Jmb2xrIiB9LAorICAgIHsgIk5vcnRoIEFzaWEgRWFzdCBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvSXJrdXRzayIgfSwKKyAgICB7ICJOb3J0aCBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LcmFzbm95YXJzayIgfSwKKyAgICB7ICJOb3J0aCBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9Ob3Zva3V6bmV0c2siIH0sCisgICAgeyAiTm9ydGggS29yZWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1B5b25neWFuZyIgfSwKKyAgICB7ICJQYWNpZmljIFNBIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TYW50aWFnbyIgfSwKKyAgICB7ICJQYWNpZmljIFNBIFN0YW5kYXJkIFRpbWUiLCAgICAiQW50YXJjdGljYS9QYWxtZXIiIH0sCisgICAgeyAiUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTG9zX0FuZ2VsZXMiIH0sCisgICAgeyAiUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvVmFuY291dmVyIiB9LAorICAgIHsgIlBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0Rhd3NvbiIgfSwKKyAgICB7ICJQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9XaGl0ZWhvcnNlIiB9LAorICAgIHsgIlBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJQU1Q4UERUIiB9LAorICAgIHsgIlBhY2lmaWMgU3RhbmRhcmQgVGltZSAoTWV4aWNvKSIsICAgICJBbWVyaWNhL1RpanVhbmEiIH0sCisgICAgeyAiUGFjaWZpYyBTdGFuZGFyZCBUaW1lIChNZXhpY28pIiwgICAgIkFtZXJpY2EvU2FudGFfSXNhYmVsIiB9LAorICAgIHsgIlBha2lzdGFuIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LYXJhY2hpIiB9LAorICAgIHsgIlBhcmFndWF5IFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Bc3VuY2lvbiIgfSwKKyAgICB7ICJSb21hbmNlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1BhcmlzIiB9LAorICAgIHsgIlJvbWFuY2UgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQnJ1c3NlbHMiIH0sCisgICAgeyAiUm9tYW5jZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Db3BlbmhhZ2VuIiB9LAorICAgIHsgIlJvbWFuY2UgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTWFkcmlkIiB9LAorICAgIHsgIlJvbWFuY2UgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvQ2V1dGEiIH0sCisgICAgeyAiUnVzc2lhIFRpbWUgWm9uZSAxMCIsICAgICJBc2lhL1NyZWRuZWtvbHltc2siIH0sCisgICAgeyAiUnVzc2lhIFRpbWUgWm9uZSAxMSIsICAgICJBc2lhL0thbWNoYXRrYSIgfSwKKyAgICB7ICJSdXNzaWEgVGltZSBab25lIDExIiwgICAgIkFzaWEvQW5hZHlyIiB9LAorICAgIHsgIlJ1c3NpYSBUaW1lIFpvbmUgMyIsICAgICJFdXJvcGUvU2FtYXJhIiB9LAorICAgIHsgIlJ1c3NpYW4gU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTW9zY293IiB9LAorICAgIHsgIlJ1c3NpYW4gU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvS2lyb3YiIH0sCisgICAgeyAiUnVzc2lhbiBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9TaW1mZXJvcG9sIiB9LAorICAgIHsgIlJ1c3NpYW4gU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvVm9sZ29ncmFkIiB9LAorICAgIHsgIlNBIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0NheWVubmUiIH0sCisgICAgeyAiU0EgRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFudGFyY3RpY2EvUm90aGVyYSIgfSwKKyAgICB7ICJTQSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Gb3J0YWxlemEiIH0sCisgICAgeyAiU0EgRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQmVsZW0iIH0sCisgICAgeyAiU0EgRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTWFjZWlvIiB9LAorICAgIHsgIlNBIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1JlY2lmZSIgfSwKKyAgICB7ICJTQSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TYW50YXJlbSIgfSwKKyAgICB7ICJTQSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQXRsYW50aWMvU3RhbmxleSIgfSwKKyAgICB7ICJTQSBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9QYXJhbWFyaWJvIiB9LAorICAgIHsgIlNBIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJFdGMvR01UKzMiIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQm9nb3RhIiB9LAorICAgIHsgIlNBIFBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1Jpb19CcmFuY28iIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvRWlydW5lcGUiIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ29yYWxfSGFyYm91ciIgfSwKKyAgICB7ICJTQSBQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9HdWF5YXF1aWwiIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSmFtYWljYSIgfSwKKyAgICB7ICJTQSBQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9DYXltYW4iIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvUGFuYW1hIiB9LAorICAgIHsgIlNBIFBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0xpbWEiIH0sCisgICAgeyAiU0EgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQrNSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9MYV9QYXoiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQW50aWd1YSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Bbmd1aWxsYSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9BcnViYSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9CYXJiYWRvcyIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TdF9CYXJ0aGVsZW15IiB9LAorICAgIHsgIlNBIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0tyYWxlbmRpamsiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTWFuYXVzIiB9LAorICAgIHsgIlNBIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0JvYV9WaXN0YSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Qb3J0b19WZWxobyIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9CbGFuYy1TYWJsb24iIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvQ3VyYWNhbyIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Eb21pbmljYSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TYW50b19Eb21pbmdvIiB9LAorICAgIHsgIlNBIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0dyZW5hZGEiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvR3VhZGVsb3VwZSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9HdXlhbmEiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvU3RfS2l0dHMiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvU3RfTHVjaWEiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTWFyaWdvdCIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9NYXJ0aW5pcXVlIiB9LAorICAgIHsgIlNBIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL01vbnRzZXJyYXQiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvUHVlcnRvX1JpY28iIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTG93ZXJfUHJpbmNlcyIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9Qb3J0X29mX1NwYWluIiB9LAorICAgIHsgIlNBIFdlc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL1N0X1ZpbmNlbnQiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvVG9ydG9sYSIgfSwKKyAgICB7ICJTQSBXZXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9TdF9UaG9tYXMiIH0sCisgICAgeyAiU0EgV2VzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQrNCIgfSwKKyAgICB7ICJTRSBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9CYW5na29rIiB9LAorICAgIHsgIlNFIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBbnRhcmN0aWNhL0RhdmlzIiB9LAorICAgIHsgIlNFIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJJbmRpYW4vQ2hyaXN0bWFzIiB9LAorICAgIHsgIlNFIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0pha2FydGEiIH0sCisgICAgeyAiU0UgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvUG9udGlhbmFrIiB9LAorICAgIHsgIlNFIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1Bobm9tX1BlbmgiIH0sCisgICAgeyAiU0UgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvVmllbnRpYW5lIiB9LAorICAgIHsgIlNFIEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1NhaWdvbiIgfSwKKyAgICB7ICJTRSBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC03IiB9LAorICAgIHsgIlNhaW50IFBpZXJyZSBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvTWlxdWVsb24iIH0sCisgICAgeyAiU2FraGFsaW4gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1Nha2hhbGluIiB9LAorICAgIHsgIlNhbW9hIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9BcGlhIiB9LAorICAgIHsgIlNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvU2luZ2Fwb3JlIiB9LAorICAgIHsgIlNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQnJ1bmVpIiB9LAorICAgIHsgIlNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvTWFrYXNzYXIiIH0sCisgICAgeyAiU2luZ2Fwb3JlIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LdWFsYV9MdW1wdXIiIH0sCisgICAgeyAiU2luZ2Fwb3JlIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9LdWNoaW5nIiB9LAorICAgIHsgIlNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvTWFuaWxhIiB9LAorICAgIHsgIlNpbmdhcG9yZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQtOCIgfSwKKyAgICB7ICJTb3V0aCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvSm9oYW5uZXNidXJnIiB9LAorICAgIHsgIlNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9CdWp1bWJ1cmEiIH0sCisgICAgeyAiU291dGggQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0dhYm9yb25lIiB9LAorICAgIHsgIlNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9MdWJ1bWJhc2hpIiB9LAorICAgIHsgIlNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9NYXNlcnUiIH0sCisgICAgeyAiU291dGggQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0JsYW50eXJlIiB9LAorICAgIHsgIlNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9NYXB1dG8iIH0sCisgICAgeyAiU291dGggQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0tpZ2FsaSIgfSwKKyAgICB7ICJTb3V0aCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvTWJhYmFuZSIgfSwKKyAgICB7ICJTb3V0aCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvTHVzYWthIiB9LAorICAgIHsgIlNvdXRoIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9IYXJhcmUiIH0sCisgICAgeyAiU291dGggQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC0yIiB9LAorICAgIHsgIlNyaSBMYW5rYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQ29sb21ibyIgfSwKKyAgICB7ICJTeXJpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvRGFtYXNjdXMiIH0sCisgICAgeyAiVGFpcGVpIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9UYWlwZWkiIH0sCisgICAgeyAiVGFzbWFuaWEgU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvSG9iYXJ0IiB9LAorICAgIHsgIlRhc21hbmlhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXVzdHJhbGlhL0N1cnJpZSIgfSwKKyAgICB7ICJUb2NhbnRpbnMgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0FyYWd1YWluYSIgfSwKKyAgICB7ICJUb2t5byBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvVG9reW8iIH0sCisgICAgeyAiVG9reW8gU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0pheWFwdXJhIiB9LAorICAgIHsgIlRva3lvIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9QYWxhdSIgfSwKKyAgICB7ICJUb2t5byBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvRGlsaSIgfSwKKyAgICB7ICJUb2t5byBTdGFuZGFyZCBUaW1lIiwgICAgIkV0Yy9HTVQtOSIgfSwKKyAgICB7ICJUb21zayBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvVG9tc2siIH0sCisgICAgeyAiVG9uZ2EgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL1RvbmdhdGFwdSIgfSwKKyAgICB7ICJUb25nYSBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvRW5kZXJidXJ5IiB9LAorICAgIHsgIlRvbmdhIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9GYWthb2ZvIiB9LAorICAgIHsgIlRvbmdhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC0xMyIgfSwKKyAgICB7ICJUcmFuc2JhaWthbCBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQ2hpdGEiIH0sCisgICAgeyAiVHVya2V5IFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0lzdGFuYnVsIiB9LAorICAgIHsgIlR1cmtzIEFuZCBDYWljb3MgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0dyYW5kX1R1cmsiIH0sCisgICAgeyAiVVMgRWFzdGVybiBTdGFuZGFyZCBUaW1lIiwgICAgIkFtZXJpY2EvSW5kaWFuYXBvbGlzIiB9LAorICAgIHsgIlVTIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0luZGlhbmEvTWFyZW5nbyIgfSwKKyAgICB7ICJVUyBFYXN0ZXJuIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9JbmRpYW5hL1ZldmF5IiB9LAorICAgIHsgIlVTIE1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9QaG9lbml4IiB9LAorICAgIHsgIlVTIE1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9EYXdzb25fQ3JlZWsiIH0sCisgICAgeyAiVVMgTW91bnRhaW4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0NyZXN0b24iIH0sCisgICAgeyAiVVMgTW91bnRhaW4gU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0ZvcnRfTmVsc29uIiB9LAorICAgIHsgIlVTIE1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiQW1lcmljYS9IZXJtb3NpbGxvIiB9LAorICAgIHsgIlVTIE1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVCs3IiB9LAorICAgIHsgIlVUQyIsICAgICJFdGMvR01UIiB9LAorICAgIHsgIlVUQyIsICAgICJBbWVyaWNhL0Rhbm1hcmtzaGF2biIgfSwKKyAgICB7ICJVVEMrMTIiLCAgICAiRXRjL0dNVC0xMiIgfSwKKyAgICB7ICJVVEMrMTIiLCAgICAiUGFjaWZpYy9UYXJhd2EiIH0sCisgICAgeyAiVVRDKzEyIiwgICAgIlBhY2lmaWMvTWFqdXJvIiB9LAorICAgIHsgIlVUQysxMiIsICAgICJQYWNpZmljL0t3YWphbGVpbiIgfSwKKyAgICB7ICJVVEMrMTIiLCAgICAiUGFjaWZpYy9OYXVydSIgfSwKKyAgICB7ICJVVEMrMTIiLCAgICAiUGFjaWZpYy9GdW5hZnV0aSIgfSwKKyAgICB7ICJVVEMrMTIiLCAgICAiUGFjaWZpYy9XYWtlIiB9LAorICAgIHsgIlVUQysxMiIsICAgICJQYWNpZmljL1dhbGxpcyIgfSwKKyAgICB7ICJVVEMtMDIiLCAgICAiRXRjL0dNVCsyIiB9LAorICAgIHsgIlVUQy0wMiIsICAgICJBbWVyaWNhL05vcm9uaGEiIH0sCisgICAgeyAiVVRDLTAyIiwgICAgIkF0bGFudGljL1NvdXRoX0dlb3JnaWEiIH0sCisgICAgeyAiVVRDLTA4IiwgICAgIkV0Yy9HTVQrOCIgfSwKKyAgICB7ICJVVEMtMDgiLCAgICAiUGFjaWZpYy9QaXRjYWlybiIgfSwKKyAgICB7ICJVVEMtMDkiLCAgICAiRXRjL0dNVCs5IiB9LAorICAgIHsgIlVUQy0wOSIsICAgICJQYWNpZmljL0dhbWJpZXIiIH0sCisgICAgeyAiVVRDLTExIiwgICAgIkV0Yy9HTVQrMTEiIH0sCisgICAgeyAiVVRDLTExIiwgICAgIlBhY2lmaWMvUGFnb19QYWdvIiB9LAorICAgIHsgIlVUQy0xMSIsICAgICJQYWNpZmljL05pdWUiIH0sCisgICAgeyAiVVRDLTExIiwgICAgIlBhY2lmaWMvTWlkd2F5IiB9LAorICAgIHsgIlVsYWFuYmFhdGFyIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9VbGFhbmJhYXRhciIgfSwKKyAgICB7ICJVbGFhbmJhYXRhciBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQ2hvaWJhbHNhbiIgfSwKKyAgICB7ICJWZW5lenVlbGEgU3RhbmRhcmQgVGltZSIsICAgICJBbWVyaWNhL0NhcmFjYXMiIH0sCisgICAgeyAiVmxhZGl2b3N0b2sgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1ZsYWRpdm9zdG9rIiB9LAorICAgIHsgIlZsYWRpdm9zdG9rIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9Vc3QtTmVyYSIgfSwKKyAgICB7ICJXLiBBdXN0cmFsaWEgU3RhbmRhcmQgVGltZSIsICAgICJBdXN0cmFsaWEvUGVydGgiIH0sCisgICAgeyAiVy4gQXVzdHJhbGlhIFN0YW5kYXJkIFRpbWUiLCAgICAiQW50YXJjdGljYS9DYXNleSIgfSwKKyAgICB7ICJXLiBDZW50cmFsIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9MYWdvcyIgfSwKKyAgICB7ICJXLiBDZW50cmFsIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9MdWFuZGEiIH0sCisgICAgeyAiVy4gQ2VudHJhbCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvUG9ydG8tTm92byIgfSwKKyAgICB7ICJXLiBDZW50cmFsIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9LaW5zaGFzYSIgfSwKKyAgICB7ICJXLiBDZW50cmFsIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9CYW5ndWkiIH0sCisgICAgeyAiVy4gQ2VudHJhbCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvQnJhenphdmlsbGUiIH0sCisgICAgeyAiVy4gQ2VudHJhbCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvRG91YWxhIiB9LAorICAgIHsgIlcuIENlbnRyYWwgQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL0FsZ2llcnMiIH0sCisgICAgeyAiVy4gQ2VudHJhbCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvTGlicmV2aWxsZSIgfSwKKyAgICB7ICJXLiBDZW50cmFsIEFmcmljYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFmcmljYS9NYWxhYm8iIH0sCisgICAgeyAiVy4gQ2VudHJhbCBBZnJpY2EgU3RhbmRhcmQgVGltZSIsICAgICJBZnJpY2EvTmlhbWV5IiB9LAorICAgIHsgIlcuIENlbnRyYWwgQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL05kamFtZW5hIiB9LAorICAgIHsgIlcuIENlbnRyYWwgQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiQWZyaWNhL1R1bmlzIiB9LAorICAgIHsgIlcuIENlbnRyYWwgQWZyaWNhIFN0YW5kYXJkIFRpbWUiLCAgICAiRXRjL0dNVC0xIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9CZXJsaW4iIH0sCisgICAgeyAiVy4gRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL0FuZG9ycmEiIH0sCisgICAgeyAiVy4gRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiRXVyb3BlL1ZpZW5uYSIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvWnVyaWNoIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9CdXNpbmdlbiIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvR2licmFsdGFyIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Sb21lIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9WYWR1eiIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTHV4ZW1ib3VyZyIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvTW9uYWNvIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9NYWx0YSIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvQW1zdGVyZGFtIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9Pc2xvIiB9LAorICAgIHsgIlcuIEV1cm9wZSBTdGFuZGFyZCBUaW1lIiwgICAgIkV1cm9wZS9TdG9ja2hvbG0iIH0sCisgICAgeyAiVy4gRXVyb3BlIFN0YW5kYXJkIFRpbWUiLCAgICAiQXJjdGljL0xvbmd5ZWFyYnllbiIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvU2FuX01hcmlubyIgfSwKKyAgICB7ICJXLiBFdXJvcGUgU3RhbmRhcmQgVGltZSIsICAgICJFdXJvcGUvVmF0aWNhbiIgfSwKKyAgICB7ICJXLiBNb25nb2xpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvSG92ZCIgfSwKKyAgICB7ICJXZXN0IEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1Rhc2hrZW50IiB9LAorICAgIHsgIldlc3QgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFudGFyY3RpY2EvTWF3c29uIiB9LAorICAgIHsgIldlc3QgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvT3JhbCIgfSwKKyAgICB7ICJXZXN0IEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL0FxdGF1IiB9LAorICAgIHsgIldlc3QgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvQXF0b2JlIiB9LAorICAgIHsgIldlc3QgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkluZGlhbi9NYWxkaXZlcyIgfSwKKyAgICB7ICJXZXN0IEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJJbmRpYW4vS2VyZ3VlbGVuIiB9LAorICAgIHsgIldlc3QgQXNpYSBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvRHVzaGFuYmUiIH0sCisgICAgeyAiV2VzdCBBc2lhIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9Bc2hnYWJhdCIgfSwKKyAgICB7ICJXZXN0IEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1NhbWFya2FuZCIgfSwKKyAgICB7ICJXZXN0IEFzaWEgU3RhbmRhcmQgVGltZSIsICAgICJFdGMvR01ULTUiIH0sCisgICAgeyAiV2VzdCBCYW5rIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9IZWJyb24iIH0sCisgICAgeyAiV2VzdCBCYW5rIFN0YW5kYXJkIFRpbWUiLCAgICAiQXNpYS9HYXphIiB9LAorICAgIHsgIldlc3QgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvUG9ydF9Nb3Jlc2J5IiB9LAorICAgIHsgIldlc3QgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIkFudGFyY3RpY2EvRHVtb250RFVydmlsbGUiIH0sCisgICAgeyAiV2VzdCBQYWNpZmljIFN0YW5kYXJkIFRpbWUiLCAgICAiUGFjaWZpYy9UcnVrIiB9LAorICAgIHsgIldlc3QgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIiwgICAgIlBhY2lmaWMvR3VhbSIgfSwKKyAgICB7ICJXZXN0IFBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJQYWNpZmljL1NhaXBhbiIgfSwKKyAgICB7ICJXZXN0IFBhY2lmaWMgU3RhbmRhcmQgVGltZSIsICAgICJFdGMvR01ULTEwIiB9LAorICAgIHsgIllha3V0c2sgU3RhbmRhcmQgVGltZSIsICAgICJBc2lhL1lha3V0c2siIH0sCisgICAgeyAiWWFrdXRzayBTdGFuZGFyZCBUaW1lIiwgICAgIkFzaWEvS2hhbmR5Z2EiIH0sCisgICAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyKgorZ2V0X3pvbmVpbmZvX3RpbWV6b25lKCB2b2lkICkKK3sKKyAgICBpZiAoIWFuZHJvaWRfdGltZXpvbmVfaW5pdCkKKyAgICB7CisgICAgICAgIGNoYXIJCSAgICAgICAgICB0em5hbWVbMTI4XTsKKyAgICAgICAgdGltZV90CQkgICAgICAgICAgdCA9IHRpbWUoTlVMTCk7CisgICAgICAgIHN0cnVjdCB0bSogICAgICAgICAgICB0bSA9IGxvY2FsdGltZSgmdCk7CisgICAgICAgIGNvbnN0IFdpbjMyVGltZXpvbmUqICB3aW4zMnR6ID0gX3dpbjMyX3RpbWV6b25lczsKKworICAgICAgICBhbmRyb2lkX3RpbWV6b25lX2luaXQgPSAxOworCisgICAgICAgIGlmICghdG0pIHsKKyAgICAgICAgICAgIEQoIiVzOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgZGF0ZS90aW1lXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQodHpuYW1lLCAwLCBzaXplb2YodHpuYW1lKSk7CisgICAgICAgIHN0cmZ0aW1lKHR6bmFtZSwgc2l6ZW9mKHR6bmFtZSkgLSAxLCAiJVoiLCB0bSk7CisKKyAgICAgICAgZm9yICh3aW4zMnR6ID0gX3dpbjMyX3RpbWV6b25lczsgd2luMzJ0ei0+d2luX25hbWUgIT0gTlVMTDsgd2luMzJ0eisrKQorICAgICAgICAgICAgaWYgKCAhc3RyY21wKHdpbjMydHotPndpbl9uYW1lLCB0em5hbWUpICkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfdGltZXpvbmUgPSB3aW4zMnR6LT56b25laW5mb19uYW1lOworICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKworI2lmIDAgIC8qIFRPRE8gKi8KKyAgICAvKiB3ZSBkaWRuJ3QgZmluZCBpdCwgdGhpcyBtYXkgY29tZSBmcm9tIGxvY2FsaXplZCB2ZXJzaW9ucyBvZiBXaW5kb3dzLiB3ZSdyZSBnb2luZyB0byBleHBsb3JlIHRoZSByZWdpc3RyeSwKKyAgICAqIGFzIHRoZSBjb2RlIGluIFBvc3RncmVzcWwgZG9lcy4uLgorICAgICovCisjZW5kaWYKKyAgICAgICAgRCggIiVzOiBjb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgdGltZXpvbmVcbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CitFeGl0OgorICAgIEQoICJlbXVsYXRvcjogZm91bmQgdGltZXpvbmUgJXNcbiIsIGFuZHJvaWRfdGltZXpvbmUgKTsKKyAgICByZXR1cm4gYW5kcm9pZF90aW1lem9uZTsKK30KKworI2VuZGlmIC8qIF9XSU4zMiAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcga01vbnRoTmFtZVtdID0geworICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCit9OworY2xhc3MgVGltZVpvbmUgeworcHVibGljOgorICAgIFRpbWVab25lKCk7CisKKyAgICAvKiBSZXR1cm4gbG9jYWwgdGltZSBiYXNlZCBvbiBhbmRyb2lkIHRpbWV6b25lIHNldCBieSBmdW5jdGlvbiBhbmRyb2lkVGltZVpvbmVTZXQoKS4KKyAgICAgKiBGYWxsIGJhY2sgdG8gaG9zdCBPUyBsb2NhbHRpbWUoKSBpZiBhbmRyb2lkIHRpbWV6b25lIGlzIG5vdCBzZXQuCisgICAgICogKi8KKyAgICBzdHJ1Y3QgdG0qIGFuZHJvaWRMb2NhbHRpbWUoY29uc3QgdGltZV90JiB0aW1lTm93KTsKKworICAgIC8qIFJldHVybiB0aGUgdGltZXpvbmUgb2Zmc2V0IGluY2x1ZGluZyBkYXkgbGlnaHQgc2F2aW5nIGluIHNlY29uZHMgd2l0aCByZXNwZWN0IHRvCisgICAgICogVVRDIGluIGd1ZXN0IGFuZHJvaWQgT1MuIEZhbGwgYmFjayB0byB1c2UgaG9zdCBPUyB0aW1lem9uZSBvZmZzZXQgaWYgYW5kcm9pZCB0aW1lCisgICAgICogem9uZSBpcyBub3Qgc2V0IG9yIGludmFsaWQuCisgICAgICogKi8KKyAgICBsb25nIGFuZHJvaWRUaW1lWm9uZU9mZnNldChjb25zdCB0aW1lX3QmIHRpbWVOb3cpOworCisgICAgLyogVHJ5IHRvIHNldCB0aGUgZGVmYXVsdCBhbmRyb2lkIE9TIHRpbWV6b25lLiBUaGlzIG9wZXJhdGlvbiB3aWxsIGFmZmVjdCB0aGUKKyAgICAgKiBlbXVsYXRlZCBuZXR3b3JrZWQgdGltZSBpbiB2aXJ0dWFsIG1vZGVtLgorICAgICAqIFdoZW4gfHR6bmFtZXwgaXMgbm90IGZvdW5kIG9yIGludmFsaWQsIGZhbGwgYmFjayB0byB1c2UgaG9zdCBPUyBsb2NhbCB0aW1lem9uZS4KKyAgICAqICovCisgICAgaW50IGFuZHJvaWRUaW1lWm9uZVNldChjb25zdCBjaGFyKiB0em5hbWUpOworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgdG0gbVN0YW5kYXJkRGF0ZVV0YzsKKyAgICBzdHJ1Y3QgdG0gbURheWxpZ2h0RGF0ZVV0YzsKKyAgICBsb25nIG1TdGFuZGFyZE9mZnNldDsKKyAgICBsb25nIG1EYXlsaWdodE9mZnNldDsKKyAgICBpbnQgbUN1cnJlbnRZZWFyOworICAgIGludCBtQW5kcm9pZFRpbWVab25lSW5pdDsKKyAgICBzdGQ6OnN0cmluZyBtVGltZVpvbmVOYW1lOworICAgIHN0YXRpYyBjb25zdCBpbnQga1NlY29uZHNQZXJEYXkgPSA2MCAqIDYwICogMjQ7CisgICAgbG9uZyBnZXRUaW1lWm9uZURpZmYoY29uc3QgdGltZV90JiB0aW1lTm93KTsKKworICAgIC8qCisgICAgICogUmV0dXJuIDEgaWYgY3VycmVudCB0aW1lem9uZSBpcyBpbiBkYXlsaWdodCBzYXZpbmcsCisgICAgICogICAgICAgIDAgaWYgY3VycmVudCB0aW1lem9uZSBpcyBOT1QgaW4gZGF5bGlnaHQgc2F2aW5nLgorICAgICAqICAgICAgICAtMSBpZiBjdXJyZW50IHRpbWV6b25lIGRvZXMgTk9UIGhhdmUgZGF5bGlnaHQgc2F2aW5nCisgICAgICogKi8KKyAgICBpbnQgZ2V0SXNEYXlsaWdodFNhdmluZ1RpbWUoY29uc3QgdGltZV90JiB0aW1lTm93KTsKKworICAgIC8qCisgICAgICogUmV0dXJuIDEgaWYgc3RydWN0IHRtIGEgaXMgYmlnZ2VyIHRoYW4gc3RydWN0IHRtIGIKKyAgICAgKiAgICAgICAgMCBpZiBlcXVhbAorICAgICAqICAgICAgICAtMSBpZiBzdHJ1Y3QgdG0gYSBpcyBsZXNzIHRoYW4gc3RydWN0IHRtIGIKKyAgICAgKiAqLworICAgIHN0YXRpYyBpbnQgdXRjQ29tcGFyZShjb25zdCBzdHJ1Y3QgdG0mIHRtMSwgY29uc3Qgc3RydWN0IHRtJiB0bTIpOworCisgICAgLyoKKyAgICAgKiBSZXR1cm4gdGhlIHN0cnVjdCB0bSBkaWZmZXJlbmNlIGluIHNlY29uZHMgYXNzdW1pbmcgdGhlIGRpZmYgaXMgd2l0aGluIDI0IGhvdXJzIGFuZAorICAgICAqIHxlbmR8IGFuZCB8YmVnaW5uaW5nfCByZXByZXNlbnQgdXRjIHRpbWUuCisgICAgICogKi8KKyAgICBzdGF0aWMgbG9uZyBkaWZmVGltZShjb25zdCBzdHJ1Y3QgdG0mIGVuZCxjb25zdCBzdHJ1Y3QgdG0mIGJlZ2lubmluZyk7CisjaWZkZWYgX1dJTjMyCisgICAgc3RhdGljIHZvaWQgcGFyc2VTeXN0ZW1UaW1lKGNvbnN0IFNZU1RFTVRJTUUmIHdpblRpbWUsIHN0cnVjdCB0bSogYW5kcm9pZFRpbWUpOworCisgICAgLyoKKyAgICAgKiBUcmFuc2xhdGUgdHppZCB0byB3aW5kb3dzIHRpbWV6b25lIG5hbWUuIFRoZW4gcmV0cmlldmUgdGltZSB6b25lCisgICAgICogaW5mb3JtYXRpb24gZnJvbSByZWdpc3RyeS4gIERvZXMgTk9UIHdvcmsgb24gV0lORS4KKyAgICAgKiAqLworICAgIHN0YXRpYyBpbnQgcGFyc2VUaW1lWm9uZUluZm9ybWF0aW9uRnJvbVJlZ2lzdHJ5KGNvbnN0IGNoYXIqIHdpbk5hbWUsIFRJTUVfWk9ORV9JTkZPUk1BVElPTiogdHppKTsKKyNlbHNlIC8vICFfV0lOMzIKKworICAgIC8qCisgICAgICogU2FtcGxlIGZvcm1hdDogTWFyIDEzIDA3OjAwOjAwIDIwMTYgYW5kIHRoZSBpbnB1dCBuZWVkcyB0byBiZSB0b2tlbml6ZWQgYmVmb3JlaGFuZAorICAgICAqICovCisgICAgc3RhdGljIGludCBwYXJzZVpkdW1wRGF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRva2Vucywgc3RydWN0IHRtKiBkYXRlKTsKKworICAgIC8qCisgICAgICogUnVuIHNhbXBsZSBzaGVsbCBjbWQ6IHpkdW1wIC12IEFtZXJpY2EvTmV3X1lvcmsgfCBncmVwIDIwMTYgdG8gcmV0cml2ZSB0aW1lem9uZSBpbmZvcm1hdGlvbgorICAgICAqIFNhbXBsZSBPdXRwdXQ6CisgICAgICogQW1lcmljYS9OZXdfWW9yayAgU3VuIE1hciAxMyAwNjo1OTo1OSAyMDE2IFVUID0gU3VuIE1hciAxMyAwMTo1OTo1OSAyMDE2IEVTVCBpc2RzdD0wIFtnbXRvZmY9LTE4MDAwXQorICAgICAqIEFtZXJpY2EvTmV3X1lvcmsgIFN1biBNYXIgMTMgMDc6MDA6MDAgMjAxNiBVVCA9IFN1biBNYXIgMTMgMDM6MDA6MDAgMjAxNiBFRFQgaXNkc3Q9MSBbZ210b2ZmPS0xNDQwMF0KKyAgICAgKiBBbWVyaWNhL05ld19Zb3JrICBTdW4gTm92ICA2IDA1OjU5OjU5IDIwMTYgVVQgPSBTdW4gTm92ICA2IDAxOjU5OjU5IDIwMTYgRURUIGlzZHN0PTEgW2dtdG9mZj0tMTQ0MDBdCisgICAgICogQW1lcmljYS9OZXdfWW9yayAgU3VuIE5vdiAgNiAwNjowMDowMCAyMDE2IFVUID0gU3VuIE5vdiAgNiAwMTowMDowMCAyMDE2IEVTVCBpc2RzdD0wIFtnbXRvZmY9LTE4MDAwXQorICAgICAqCisgICAgICogQ2F1dGlvbjogZ210b2ZmIGlzIG5vdCBzaG93biBvbiBkYXJ3aW4uCisgICAgICogUmV0dXJuIDAgaWYgdGhlIHRpbWV6b25lIGlzIGZvdW5kIGFuZCBoYXMgZGF5bGlnaHQgc2F2aW5nIGdpdmVuIHRoZSBjdXJyZW50CisgICAgICogeWVhci4gT3RoZXJ3aXNlIHJldHVybiAtMQorICAgICAqICovCisgICAgaW50IHNldEFuZHJvaWRUaW1lWm9uZVVzaW5nWmR1bXAoKTsKKworICAgIC8qCisgICAgICogUnVuIHNhbXBsZSBzaGVsbCBjbWQ6IFRaPUFtZXJpY2EvTmV3X1lvcmsgZGF0ZSArJTp6ICB0byByZXRyaXZlIHRpbWV6b25lIGluZm9ybWF0aW9uCisgICAgICogU2FtcGxlIG91dHB1dDogLTA0MDAKKyAgICAgKgorICAgICAqIEFzc3VtaW5nIHRoYXQgdGhlIHRpbWV6b25lIGRvZXNuJ3QgaGF2ZSBkYXlsaWdodCBzYXZpbmcsCisgICAgICogUmV0dXJuIDAgaWYgdGhlIHRpbWV6b25lIGlzIGZvdW5kIG90aGVyd2lzZSByZXR1cm4gLTEuCisgICAgICogKi8KKyAgICBpbnQgc2V0QW5kcm9pZFRpbWVab25lVXNpbmdEYXRlKCk7CisjZW5kaWYKK307CisKK1RpbWVab25lOjpUaW1lWm9uZSgpeworICAgIHRpbWVfdCB0aW1lTm93ID0gdGltZShOVUxMKTsKKyAgICAvL2luaXRpYWxpemUgdGhlIGN1cnJlbnQKKyAgICBtQ3VycmVudFllYXIgPSBnbXRpbWUoJnRpbWVOb3cpLT50bV95ZWFyICsgMTkwMDsKKyAgICBtQW5kcm9pZFRpbWVab25lSW5pdCA9IDA7Cit9CisKK2xvbmcgVGltZVpvbmU6OmFuZHJvaWRUaW1lWm9uZU9mZnNldChjb25zdCB0aW1lX3QmIHRpbWVOb3cpCit7CisgICAgaWYgKHRoaXMtPm1BbmRyb2lkVGltZVpvbmVJbml0KSB7CisgICAgICAgIC8vcmVzZXQgYW5kcm9pZCB0aW1lem9uZSBpZiB5ZWFyIGhhcyBjaGFuZ2VkCisgICAgICAgIGludCB5ZWFyID0gZ210aW1lKCZ0aW1lTm93KS0+dG1feWVhciArIDE5MDA7CisgICAgICAgIGlmICh5ZWFyICE9IG1DdXJyZW50WWVhcil7CisgICAgICAgICAgICBtQ3VycmVudFllYXIgPSB5ZWFyOworICAgICAgICAgICAgYW5kcm9pZFRpbWVab25lU2V0KG1UaW1lWm9uZU5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFRpbWVab25lRGlmZih0aW1lTm93KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJ1Y3QgdG0gbG9jYWwgPSAqbG9jYWx0aW1lKCZ0aW1lTm93KTsKKyAgICAgICAgc3RydWN0IHRtIHV0YyA9ICpnbXRpbWUoJnRpbWVOb3cpOworICAgICAgICByZXR1cm4gdGhpcy0+ZGlmZlRpbWUobG9jYWwsIHV0Yyk7CisgICAgfQorfQorCitzdHJ1Y3QgdG0qIFRpbWVab25lOjphbmRyb2lkTG9jYWx0aW1lKGNvbnN0IHRpbWVfdCYgdGltZU5vdykKK3sKKyAgICBpZiAodGhpcy0+bUFuZHJvaWRUaW1lWm9uZUluaXQpIHsKKyAgICAgICAgLy9yZXNldCBhbmRyb2lkIHRpbWV6b25lIGlmIHllYXIgaGFzIGNoYW5nZWQKKyAgICAgICAgaW50IHllYXIgPSBnbXRpbWUoJnRpbWVOb3cpLT50bV95ZWFyICsgMTkwMDsKKyAgICAgICAgaWYgKHllYXIgIT0gbUN1cnJlbnRZZWFyKSB7CisgICAgICAgICAgICBtQ3VycmVudFllYXIgPSB5ZWFyOworICAgICAgICAgICAgYW5kcm9pZFRpbWVab25lU2V0KG1UaW1lWm9uZU5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaXNkc3QgPSBnZXRJc0RheWxpZ2h0U2F2aW5nVGltZSh0aW1lTm93KTsKKyAgICAgICAgbG9uZyB0emRpZmYgPSBnZXRUaW1lWm9uZURpZmYodGltZU5vdyk7CisgICAgICAgIHRpbWVfdCBsb2NhbFRpbWUgPSB0aW1lTm93ICsgdHpkaWZmOworICAgICAgICBzdHJ1Y3QgdG0qIGxvY2FsID0gTlVMTDsKKyAgICAgICAgbG9jYWwgPSBnbXRpbWUoJmxvY2FsVGltZSk7CisgICAgICAgIGxvY2FsLT50bV9pc2RzdCA9IGlzZHN0OworICAgICAgICByZXR1cm4gbG9jYWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsdGltZSgmdGltZU5vdyk7CisgICAgfQorfQorCitpbnQgVGltZVpvbmU6OnV0Y0NvbXBhcmUoY29uc3Qgc3RydWN0IHRtJiB1dGMxLCBjb25zdCBzdHJ1Y3QgdG0mIHV0YzIpCit7CisgICAgaWYgKHV0YzEudG1feWVhciA+IHV0YzIudG1feWVhcikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKHV0YzEudG1feWVhciA8IHV0YzIudG1feWVhcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHV0YzEudG1fbW9uID4gdXRjMi50bV9tb24pIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgaWYgKHV0YzEudG1fbW9uIDwgdXRjMi50bV9tb24pIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh1dGMxLnRtX21kYXkgPiB1dGMyLnRtX21kYXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXRjMS50bV9tZGF5IDwgdXRjMi50bV9tZGF5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodXRjMS50bV9ob3VyID4gdXRjMi50bV9ob3VyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRjMS50bV9ob3VyIDwgdXRjMi50bV9ob3VyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodXRjMS50bV9taW4gPiB1dGMyLnRtX21pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRjMS50bV9taW4gPCB1dGMyLnRtX21pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0YzEudG1fc2VjID4gdXRjMi50bV9zZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXRjMS50bV9zZWMgPCB1dGMyLnRtX3NlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBUaW1lWm9uZTo6Z2V0SXNEYXlsaWdodFNhdmluZ1RpbWUoY29uc3QgdGltZV90JiB0aW1lTm93KQoreworICAgIGlmIChtRGF5bGlnaHRPZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHRtIHV0YyA9ICpnbXRpbWUoJnRpbWVOb3cpOworICAgICAgICBpZiAodXRjQ29tcGFyZSh1dGMsIG1TdGFuZGFyZERhdGVVdGMpIDwgMCB8fCB1dGNDb21wYXJlKHV0YywgbURheWxpZ2h0RGF0ZVV0YykgPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KK30KKworbG9uZyBUaW1lWm9uZTo6Z2V0VGltZVpvbmVEaWZmKGNvbnN0IHRpbWVfdCYgdGltZU5vdykKK3sKKyAgICBpbnQgaXNkc3QgPSBnZXRJc0RheWxpZ2h0U2F2aW5nVGltZSh0aW1lTm93KTsKKyAgICByZXR1cm4gKGlzZHN0IDw9IDApID8gbVN0YW5kYXJkT2Zmc2V0IDogbVN0YW5kYXJkT2Zmc2V0ICsgbURheWxpZ2h0T2Zmc2V0OworfQorCitsb25nIFRpbWVab25lOjpkaWZmVGltZShjb25zdCBzdHJ1Y3QgdG0mIGVuZCwgY29uc3Qgc3RydWN0IHRtJiBiZWdpbm5pbmcpCit7CisgICAgbG9uZyBlbmRJblNlY3MgPSBlbmQudG1fc2VjICsgNjAgKiAoZW5kLnRtX21pbiArIDYwICogZW5kLnRtX2hvdXIpOworICAgIGxvbmcgYmVnaW5uaW5nSW5TZWNzID0gYmVnaW5uaW5nLnRtX3NlYyArIDYwICogKGJlZ2lubmluZy50bV9taW4gKyA2MCAqIGJlZ2lubmluZy50bV9ob3VyKTsKKyAgICBpZiAoZW5kLnRtX3llYXIgPiBiZWdpbm5pbmcudG1feWVhcikgeworICAgICAgICBlbmRJblNlY3MgKz0ga1NlY29uZHNQZXJEYXk7CisgICAgfSBlbHNlIGlmIChlbmQudG1feWVhciA8IGJlZ2lubmluZy50bV95ZWFyKSB7CisgICAgICAgIGJlZ2lubmluZ0luU2VjcyArPSBrU2Vjb25kc1BlckRheTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZW5kLnRtX21vbiA+IGJlZ2lubmluZy50bV9tb24pIHsKKyAgICAgICAgICAgIGVuZEluU2VjcyArPSBrU2Vjb25kc1BlckRheTsKKyAgICAgICAgfSBlbHNlIGlmIChlbmQudG1fbW9uIDwgYmVnaW5uaW5nLnRtX21vbikgeworICAgICAgICAgICAgYmVnaW5uaW5nSW5TZWNzICs9IGtTZWNvbmRzUGVyRGF5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5kSW5TZWNzICs9IGtTZWNvbmRzUGVyRGF5ICogZW5kLnRtX21kYXk7CisgICAgICAgICAgICBiZWdpbm5pbmdJblNlY3MgKz0ga1NlY29uZHNQZXJEYXkgKiBiZWdpbm5pbmcudG1fbWRheTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlbmRJblNlY3MgLSBiZWdpbm5pbmdJblNlY3M7Cit9CisKKyNpZmRlZiBfV0lOMzIKKy8qIFN0cnVjdCByZWZlcmVuY2VkIGZyb20gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM3MjU0ODEodj12cy44NSkuYXNweCAqLwordHlwZWRlZiBzdHJ1Y3QgX1JFR19UWklfRk9STUFUCit7CisgICAgTE9ORyBCaWFzOworICAgIExPTkcgU3RhbmRhcmRCaWFzOworICAgIExPTkcgRGF5bGlnaHRCaWFzOworICAgIFNZU1RFTVRJTUUgU3RhbmRhcmREYXRlOworICAgIFNZU1RFTVRJTUUgRGF5bGlnaHREYXRlOworfVJFR19UWklfRk9STUFUOworCitpbnQgVGltZVpvbmU6OnBhcnNlVGltZVpvbmVJbmZvcm1hdGlvbkZyb21SZWdpc3RyeShjb25zdCBjaGFyKiB3aW5OYW1lLCBUSU1FX1pPTkVfSU5GT1JNQVRJT04qIHR6aSkKK3sKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKyAgICB1c2luZyBhbmRyb2lkOjpiYXNlOjpTY29wZWRSZWdLZXk7CisgICAgdXNpbmcgYW5kcm9pZDo6YmFzZTo6V2luMzJVdGlsczsKKyAgICBIS0VZIGhrZXkgPSAwOworICAgIHN0ZDo6c3RyaW5nIHJlZ2lzdHJ5UGF0aCA9IFN0cmluZ0Zvcm1hdCgiU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93cyBOVFxcQ3VycmVudFZlcnNpb25cXFRpbWUgWm9uZXNcXCVzIiwgd2luTmFtZSk7CisKKyAgICBMT05HIHJlc3VsdCA9IFJlZ09wZW5LZXlFeCgKKyAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICByZWdpc3RyeVBhdGguY19zdHIoKSwKKyAgICAgICAgMCwKKyAgICAgICAgS0VZX1JFQUQsCisgICAgICAgICZoa2V5KTsKKworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvclN0cmluZyA9IFdpbjMyVXRpbHM6OmdldEVycm9yU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIEQoICJSZWdPcGVuS2V5RXggZmFpbGVkICVsaSAlc1xuIiwgcmVzdWx0LCBlcnJvclN0cmluZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFJFR19UWklfRk9STUFUIGJpbmFyeVR6aTsKKyAgICBEV09SRCBkYXRhVHlwZTsKKyAgICBEV09SRCBsZW4gPSBzaXplb2YoYmluYXJ5VHppKTsKKyAgICBTY29wZWRSZWdLZXkgdGltZXpvbmVLZXkoaGtleSk7CisKKyAgICByZXN1bHQgPSBSZWdRdWVyeVZhbHVlRXgoCisgICAgICAgIHRpbWV6b25lS2V5LmdldCgpLAorICAgICAgICAiVFpJIiwKKyAgICAgICAgTlVMTCwKKyAgICAgICAgJmRhdGFUeXBlLAorICAgICAgICAoTFBCWVRFKSAmYmluYXJ5VHppLAorICAgICAgICAmbGVuKTsKKworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyB8fCBkYXRhVHlwZSAhPSBSRUdfQklOQVJZKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yU3RyaW5nID0gV2luMzJVdGlsczo6Z2V0RXJyb3JTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgRCggIlJlZ1F1ZXJ5VmFsdWVFeCBmYWlsZWQgJWxpICVzXG4iLCByZXN1bHQsIGVycm9yU3RyaW5nLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHR6aS0+QmlhcyA9IGJpbmFyeVR6aS5CaWFzOworICAgIHR6aS0+RGF5bGlnaHRCaWFzID0gYmluYXJ5VHppLkRheWxpZ2h0QmlhczsKKyAgICB0emktPkRheWxpZ2h0RGF0ZSA9IGJpbmFyeVR6aS5EYXlsaWdodERhdGU7CisgICAgdHppLT5TdGFuZGFyZEJpYXMgPSBiaW5hcnlUemkuU3RhbmRhcmRCaWFzOworICAgIHR6aS0+U3RhbmRhcmREYXRlID0gYmluYXJ5VHppLlN0YW5kYXJkRGF0ZTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIFRpbWVab25lOjpwYXJzZVN5c3RlbVRpbWUoY29uc3QgU1lTVEVNVElNRSYgd2luVGltZSwgc3RydWN0IHRtKiBhbmRyb2lkVGltZSkKK3sKKyAgICBhbmRyb2lkVGltZS0+dG1feWVhciA9IChpbnQpd2luVGltZS53WWVhciAtIDE5MDA7CisgICAgYW5kcm9pZFRpbWUtPnRtX21vbiA9IChpbnQpd2luVGltZS53TW9udGggLSAxOworICAgIGFuZHJvaWRUaW1lLT50bV9tZGF5ID0gKGludCl3aW5UaW1lLndEYXk7CisgICAgYW5kcm9pZFRpbWUtPnRtX2hvdXIgPSAoaW50KXdpblRpbWUud0hvdXI7CisgICAgYW5kcm9pZFRpbWUtPnRtX21pbiA9IChpbnQpd2luVGltZS53TWludXRlOworICAgIGFuZHJvaWRUaW1lLT50bV9zZWMgPSAoaW50KXdpblRpbWUud1NlY29uZDsKK30KKworI2Vsc2UKKworaW50IFRpbWVab25lOjpwYXJzZVpkdW1wRGF0ZShjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRva2Vucywgc3RydWN0IHRtKiBkYXRlKQoreworICAgIGlmICh0b2tlbnMuc2l6ZSgpID49IDQpIHsKKyAgICAgICAgaW50IG1vbklkeCA9IC0xOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICAgICAgaWYgKCF0b2tlbnNbMF0uY29tcGFyZShrTW9udGhOYW1lW2ldKSkgeworICAgICAgICAgICAgICAgIG1vbklkeCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vbklkeCA9PSAtMSkgeyByZXR1cm4gLTE7IH0KKworICAgICAgICBkYXRlLT50bV9tb24gPSBtb25JZHg7CisgICAgICAgIGRhdGUtPnRtX21kYXkgPSBzdGQ6OnN0b2kodG9rZW5zWzFdKTsKKyAgICAgICAgZGF0ZS0+dG1faG91ciA9IHN0ZDo6c3RvaSh0b2tlbnNbMl0uc3Vic3RyKDAsMikpOworICAgICAgICBkYXRlLT50bV9taW4gPSBzdGQ6OnN0b2kodG9rZW5zWzJdLnN1YnN0cigzLCAyKSk7CisgICAgICAgIGRhdGUtPnRtX3NlYyA9IHN0ZDo6c3RvaSh0b2tlbnNbMl0uc3Vic3RyKDYsMikpOworICAgICAgICBkYXRlLT50bV95ZWFyID0gc3RkOjpzdG9pKHRva2Vuc1szXSkgLSAxOTAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludCBUaW1lWm9uZTo6c2V0QW5kcm9pZFRpbWVab25lVXNpbmdaZHVtcCgpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisgICAgc3RkOjpzdHJpbmcgemR1bXBDbWQgPSBTdHJpbmdGb3JtYXQoCisgICAgICAgICJ6ZHVtcCAtdiAlcyB8IGdyZXAgJWQiLCBtVGltZVpvbmVOYW1lLCBtQ3VycmVudFllYXIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzaGVsbENtZCA9IHsiL2Jpbi9iYXNoIiwgIi1jIiwgc3RkOjptb3ZlKHpkdW1wQ21kKX07CisgICAgUnVuT3B0aW9ucyBydW5GbGFncyA9IFN5c3RlbTo6UnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpSdW5PcHRpb25zOjpUZXJtaW5hdGVPblRpbWVvdXQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpSdW5PcHRpb25zOjpEdW1wT3V0cHV0VG9GaWxlOworICAgIFN5c3RlbTo6RHVyYXRpb24gdGltZW91dCA9IDEwMDA7CisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdENvZGU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZSA9IFBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPmdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nRm9ybWF0KCJhbmRyb2lkX3R6b2Zmc2V0JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpU3lzdGVtOjpnZXQoKS0+Z2V0Q3VycmVudFByb2Nlc3NJZCgpKSk7CisKKyAgICBib29sIGNvbW1hbmRSYW4gPSBTeXN0ZW06OmdldCgpLT5ydW5Db21tYW5kKAorICAgICAgICAgICAgc2hlbGxDbWQsIHJ1bkZsYWdzLCB0aW1lb3V0LCAmZXhpdENvZGUsIG51bGxwdHIsIG91dHB1dEZpbGUpOworCisgICAgaWYgKGNvbW1hbmRSYW4gJiYgIWV4aXRDb2RlKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZmlsZShvdXRwdXRGaWxlLmNfc3RyKCkpOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnVsZXM7CisgICAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZmlsZSwgbGluZSkpIHsKKyAgICAgICAgICAgIHJ1bGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUobGluZSkpOworICAgICAgICB9CisgICAgICAgIGxvbmcgdXRjT2Zmc2V0RFNUID0gMDsKKyAgICAgICAgbG9uZyB1dGNPZmZzZXRTdGFuZGFyZCA9IDA7CisgICAgICAgIGlmIChydWxlcy5zaXplKCkgPT0gNCkgeworICAgICAgICAgICAgLy90b2tlbml6ZSBvbmx5IHRoZSAybmQgYW5kIDR0aCBydWxlCisgICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgNDsgaSArPSAyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3MocnVsZXNbaV0pOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9rZW47CisgICAgICAgICAgICAgICAgd2hpbGUgKHNzID4+IHRva2VuKSB7CisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soc3RkOjptb3ZlKHRva2VuKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB1dGNUb2tlbnModG9rZW5zLmJlZ2luKCkgKyAyLCB0b2tlbnMuYmVnaW4oKSArIDYpOworICAgICAgICAgICAgICAgIGlmIChwYXJzZVpkdW1wRGF0ZSh1dGNUb2tlbnMsIGkgPT0gMSA/ICZtU3RhbmRhcmREYXRlVXRjIDogJm1EYXlsaWdodERhdGVVdGMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RydWN0IHRtIGxvY2FsRGF0ZTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbG9jYWxUb2tlbnModG9rZW5zLmJlZ2luKCkgKyA5LCB0b2tlbnMuYmVnaW4oKSArIDEzKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VaZHVtcERhdGUobG9jYWxUb2tlbnMsICZsb2NhbERhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICB1dGNPZmZzZXREU1QgPSB0aGlzLT5kaWZmVGltZShsb2NhbERhdGUsIG1TdGFuZGFyZERhdGVVdGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHV0Y09mZnNldFN0YW5kYXJkID0gdGhpcy0+ZGlmZlRpbWUobG9jYWxEYXRlLCBtRGF5bGlnaHREYXRlVXRjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhbmRhcmRPZmZzZXQgPSB1dGNPZmZzZXRTdGFuZGFyZDsKKyAgICAgICAgICAgIG1EYXlsaWdodE9mZnNldCA9IHV0Y09mZnNldERTVCAtIHV0Y09mZnNldFN0YW5kYXJkOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgVGltZVpvbmU6OnNldEFuZHJvaWRUaW1lWm9uZVVzaW5nRGF0ZSgpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisgICAgc3RkOjpzdHJpbmcgZGF0ZUNtZCA9IFN0cmluZ0Zvcm1hdCgiVFo9JXMgZGF0ZSArJSV6IiwgbVRpbWVab25lTmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2hlbGxDbWQgPSB7Ii9iaW4vYmFzaCIsICItYyIsIHN0ZDo6bW92ZShkYXRlQ21kKX07CisgICAgUnVuT3B0aW9ucyBydW5GbGFncyA9IFN5c3RlbTo6UnVuT3B0aW9uczo6V2FpdEZvckNvbXBsZXRpb24gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpSdW5PcHRpb25zOjpUZXJtaW5hdGVPblRpbWVvdXQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtOjpSdW5PcHRpb25zOjpEdW1wT3V0cHV0VG9GaWxlOworICAgIFN5c3RlbTo6RHVyYXRpb24gdGltZW91dCA9IDEwMDA7CisgICAgU3lzdGVtOjpQcm9jZXNzRXhpdENvZGUgZXhpdENvZGU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgb3V0cHV0RmlsZSA9IFBhdGhVdGlsczo6am9pbigKKyAgICAgICAgICAgIFN5c3RlbTo6Z2V0KCktPmdldFRlbXBEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nRm9ybWF0KCJhbmRyb2lkX3R6b2Zmc2V0JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpU3lzdGVtOjpnZXQoKS0+Z2V0Q3VycmVudFByb2Nlc3NJZCgpKSk7CisKKyAgICBib29sIGNvbW1hbmRSYW4gPSBTeXN0ZW06OmdldCgpLT5ydW5Db21tYW5kKAorICAgICAgICAgICAgc2hlbGxDbWQsIHJ1bkZsYWdzLCB0aW1lb3V0LCAmZXhpdENvZGUsIG51bGxwdHIsIG91dHB1dEZpbGUpOworCisgICAgaWYgKGNvbW1hbmRSYW4gJiYgIWV4aXRDb2RlKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZmlsZShvdXRwdXRGaWxlLmNfc3RyKCkpOworICAgICAgICBzdGQ6OnN0cmluZyB0emRpZmY7CisgICAgICAgIHN0ZDo6Z2V0bGluZShmaWxlLCB0emRpZmYpOworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICAgIGludCBzaWduID0gKHR6ZGlmZlswXSA9PSAnKycpID8gMSA6IC0xOworICAgICAgICBtU3RhbmRhcmRPZmZzZXQgPSBzaWduICogKDYwICogKHN0ZDo6c3RvaSh0emRpZmYuc3Vic3RyKDEsIDIpKSAqIDYwICsgc3RkOjpzdG9pKHR6ZGlmZi5zdWJzdHIoMywyKSkpKTsKKyAgICAgICAgbURheWxpZ2h0T2Zmc2V0ID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworI2VuZGlmCisKK2ludCBUaW1lWm9uZTo6YW5kcm9pZFRpbWVab25lU2V0KGNvbnN0IGNoYXIqIHR6bmFtZSkKK3sKKyAgICBtVGltZVpvbmVOYW1lID0gc3RkOjpzdHJpbmcodHpuYW1lKTsKKyAgICB0aGlzLT5tQW5kcm9pZFRpbWVab25lSW5pdCA9IDA7CisjaWZkZWYgX1dJTjMyCisgICAgY29uc3QgY2hhciogd2luTmFtZSA9IE5VTEw7CisgICAgZm9yIChjb25zdCBXaW4zMlRpbWV6b25lKiB3aW4zMnR6ID0gX3dpbjMyX3RpbWV6b25lczsgd2luMzJ0ei0+d2luX25hbWUgIT0gTlVMTDsgd2luMzJ0eisrKSB7CisgICAgICAgIGlmICghc3RyY21wKHdpbjMydHotPnpvbmVpbmZvX25hbWUsIHR6bmFtZSkpIHsKKyAgICAgICAgICAgIHdpbk5hbWUgPSB3aW4zMnR6LT53aW5fbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdpbk5hbWUpIHsKKyAgICAgICAgVElNRV9aT05FX0lORk9STUFUSU9OIHdpbl90emk7CisgICAgICAgIGlmIChwYXJzZVRpbWVab25lSW5mb3JtYXRpb25Gcm9tUmVnaXN0cnkod2luTmFtZSwgJndpbl90emkpKSB7CisgICAgICAgICAgICBEKCAiJXM6IGNvdWxkIG5vdCByZXRyaWV2ZSB0aW1lIHpvbmUgaW5mb3JtYXRpb24gZnJvbSByZWdpc3RyeSBvbiBXaW5kb3dzLCB1c2UgaG9zdCBsb2NhbHRpbWUgYnkgZGVmYXVsdC5cbiIsIF9fRlVOQ1RJT05fXyApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9VVEMgPSBsb2NhbHRpbWUgKyBCaWFzCisgICAgICAgICAgICBtU3RhbmRhcmRPZmZzZXQgPSAtd2luX3R6aS5TdGFuZGFyZEJpYXMgKiA2MDsKKyAgICAgICAgICAgIG1EYXlsaWdodE9mZnNldCA9IC13aW5fdHppLkRheWxpZ2h0QmlhcyAqIDYwOworICAgICAgICAgICAgaWYgKG1EYXlsaWdodE9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcGFyc2VTeXN0ZW1UaW1lKHdpbl90emkuU3RhbmRhcmREYXRlLCAmbVN0YW5kYXJkRGF0ZVV0Yyk7CisgICAgICAgICAgICAgICAgcGFyc2VTeXN0ZW1UaW1lKHdpbl90emkuRGF5bGlnaHREYXRlLCAmbVN0YW5kYXJkRGF0ZVV0Yyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLT5tQW5kcm9pZFRpbWVab25lSW5pdCA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBEKCAiJXM6IGNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCB0aW1lem9uZVxuIiwgX19GVU5DVElPTl9fICk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoc2V0QW5kcm9pZFRpbWVab25lVXNpbmdaZHVtcCgpICYmIHNldEFuZHJvaWRUaW1lWm9uZVVzaW5nRGF0ZSgpKSB7CisgICAgICAgIEQoICIlczogY291bGQgbm90IHJldHJpZXZlIHRpbWUgem9uZSBpbmZvcm1hdGlvbiBmcm9tIHpkdW1wIG9yIGRhdGUgIgorICAgICAgICAgICAiY29tbWFuZCwgdXNlIGhvc3QgbG9jYWx0aW1lIGJ5IGRlZmF1bHQuXG4iLCBfX2Z1bmNfXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhpcy0+bUFuZHJvaWRUaW1lWm9uZUluaXQgPSAxOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiB0aGlzLT5tQW5kcm9pZFRpbWVab25lSW5pdCA/IDAgOiAtMTsKK30KKworYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPFRpbWVab25lPiBzQW5kcm9pZFRpbWVab25lID0gTEFaWV9JTlNUQU5DRV9JTklUOworCit9IC8vbmFtZXNwYWNlCisKK2ludAordGltZXpvbmVfc2V0KGNvbnN0IGNoYXIgKnR6bmFtZSkKK3sKKyAgICBpbnQgICBsZW47CisgICAgYW5kcm9pZF90aW1lem9uZV9pbml0ID0gMDsKKyAgICBpZiAoIWNoZWNrX3RpbWV6b25lX2lzX3pvbmVpbmZvKHR6bmFtZSkpeyByZXR1cm4gLTE7IH0KKyAgICBsZW4gPSBzdHJsZW4odHpuYW1lKTsKKyAgICBpZiAobGVuID4gKGludClzaXplb2YoYW5kcm9pZF90aW1lem9uZTApLTEpIHsgcmV0dXJuIC0xOyB9CisgICAgc3RyY3B5KGFuZHJvaWRfdGltZXpvbmUwLCB0em5hbWUpOworICAgIGFuZHJvaWRfdGltZXpvbmUgPSBhbmRyb2lkX3RpbWV6b25lMDsKKyAgICBpZiAoc0FuZHJvaWRUaW1lWm9uZS0+YW5kcm9pZFRpbWVab25lU2V0KHR6bmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfdGltZXpvbmVfaW5pdCA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworbG9uZworYW5kcm9pZF90em9mZnNldF9pbl9zZWNvbmRzKHRpbWVfdCogdGltZV9wKQoreworICAgIHRpbWVfdCB0aW1lID0gKnRpbWVfcDsKKyAgICByZXR1cm4gc0FuZHJvaWRUaW1lWm9uZS0+YW5kcm9pZFRpbWVab25lT2Zmc2V0KHRpbWUpOworfQorCitzdHJ1Y3QgdG0qIGFuZHJvaWRfbG9jYWx0aW1lKHRpbWVfdCogdGltZV9wKQoreworICAgIHRpbWVfdCB0aW1lID0gKnRpbWVfcDsKKyAgICByZXR1cm4gc0FuZHJvaWRUaW1lWm9uZS0+YW5kcm9pZExvY2FsdGltZSh0aW1lKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy90aW1lem9uZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RpbWV6b25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOTc5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy90aW1lem9uZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSA8dGltZS5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBUcnkgdG8gc2V0IHRoZSBkZWZhdWx0IGFuZHJvaWQgT1MgdGltZXpvbmUuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWZmZWN0IHRoZQorICogZW11bGF0ZWQgbmV0d29ya2VkIHRpbWUgaW4gdmlydHVhbCBtb2RlbQorICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIC0xIGlmICd0em5hbWUnIGlzIG5vdCBpbiB6b25laW5mbyBmb3JtYXQgKGUuZy4gQXJlYS9Mb2NhdGlvbikKKyAqLworZXh0ZXJuIGludCAgdGltZXpvbmVfc2V0KCBjb25zdCBjaGFyKiAgdHpuYW1lICk7CisKKy8qIGFwcGVuZCB0aGUgY3VycmVudCBob3N0ICJ6b25laW5mbyIgdGltZXpvbmUgbmFtZSB0byBhIGdpdmVuIGJ1ZmZlci4gbm90ZQorICogdGhhdCB0aGlzIGlzIHNvbWV0aGluZyBsaWtlICJBbWVyaWNhL0xvc19BbmdlbGVzIiwgYW5kIG5vdCB0aGUgaHVtYW4tZnJpZW5kbHkgIlBTVCIKKyAqIHRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIEFuZHJvaWQgZW11bGF0ZWQgc3lzdGVtLi4uCisgKgorICogdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaXMgcmVhbGx5IHRyaWNreSBhbmQgaXMgT1MtZGVwZW5kZW50CisgKiBvbiBVbml4IHN5c3RlbXMsIGl0IG5lZWRzIHRvIGNhdGVyIHRvIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdWhoaAorICoKKyAqIGlmIFRaIGlzIGRlZmluZWQgdG8gc29tZXRoaW5nIGxpa2UgIkNFVCIgb3IgIlBTVCIsIHRoaXMgd2lsbCByZXR1cm4gdGhlIG5hbWUgIlVua25vd24vVW5rbm93biIKKyAqLworZXh0ZXJuIGNoYXIqICBidWZwcmludF96b25laW5mb190aW1lem9uZSggY2hhciogIGJ1ZmZlciwgY2hhciogIGVuZCApOworCisvKiBSZXR1cm4gdGhlIHRpbWV6b25lIG9mZnNldCBpbmNsdWRpbmcgZGF5IGxpZ2h0IHNhdmluZyBpbiBzZWNvbmRzIHdpdGggcmVzcGVjdCB0bworICogVVRDIGluIGd1ZXN0IGFuZHJvaWQgT1MKKyAqICsgcG9zaXRpdmUgaWYgdGhlIHRpbWV6b25lIGlzIGVhc3Qgb2YgR01UCisgKiAtIG5lZ2F0aXZlIGlmIHRoZSB0aW1lem9uZSBpcyB3ZXN0IG9mIEdNVAorICovCitleHRlcm4gbG9uZyBhbmRyb2lkX3R6b2Zmc2V0X2luX3NlY29uZHModGltZV90KiB0aW1lKTsKKworLyogUmV0dXJuIGxvY2FsIHRpbWUgYmFzZWQgb24gYW5kcm9pZCB0aW1lem9uZSBOT1QgaG9zdCBPUy4KKyAqIHRoZSBjYWxsZXIgbXVzdCBkZXJlZmVyZW5jZSB0aGUgcmV0dXJuZWQgcGFyYW1ldGVyIHN0cnVjdCB0bSogYmVmb3JlIHVzZS4KKyAqLworZXh0ZXJuIHN0cnVjdCB0bSogYW5kcm9pZF9sb2NhbHRpbWUodGltZV90KiB0aW1lKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdGltZXpvbmVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RpbWV6b25lX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgyNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3RpbWV6b25lX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gLy8KKy8vIC8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIC8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyAvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8gLy8KKy8vIC8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIC8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIC8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RpbWV6b25lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3Rlc3RpbmcvVXRpbHMuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTeXN0ZW07CitURVNUKFRpbWVab25lLCBzZXRUaW1lWm9uZVRvRVNUKSB7CisgICAgLy90aGlzIHRlc3QgcmVsaWVzIG9uIHRoZSB3aW5kb3dzIHJlZ2lzdHJ5IGFuZCBpdCB3b24ndCB3b3JrIG9uIHdpbmUKKyAgICBTS0lQX1RFU1RfT05fV0lORSgpOworICAgIHRpbWV6b25lX3NldCgiQW1lcmljYS9OZXdfWW9yayIpOworICAgIC8vdXRjIHRpbWUgZm9yIDIwMTctMTAtMDEgMDA6MDA6MDAKKyAgICB0aW1lX3QgY3VycmVudF90aW1lID0gMTUwNjgxNjAwMDsKKyAgICBFWFBFQ1RfRVEoLTYwICogNjAgKiA0LCBhbmRyb2lkX3R6b2Zmc2V0X2luX3NlY29uZHMoJmN1cnJlbnRfdGltZSkpOworICAgIHN0cnVjdCB0bSBsb2NhbCA9ICphbmRyb2lkX2xvY2FsdGltZSgmY3VycmVudF90aW1lKTsKKyAgICBFWFBFQ1RfRVEoMjAxNyAtIDE5MDAsIGxvY2FsLnRtX3llYXIpOworICAgIEVYUEVDVF9FUSg4LCBsb2NhbC50bV9tb24pOworICAgIEVYUEVDVF9FUSgzMCwgbG9jYWwudG1fbWRheSk7CisgICAgRVhQRUNUX0VRKDIwLCBsb2NhbC50bV9ob3VyKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYWwudG1fbWluKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYWwudG1fc2VjKTsKKyAgICBFWFBFQ1RfRVEoMSwgbG9jYWwudG1faXNkc3QpOworCisgICAgLy9jaGFuZ2UgY3VycmVudCB0aW1lIHRvIHV0YyB0aW1lIGZvciAyMDE2LTEyLTEwIDAwOjAwOjAwCisgICAgY3VycmVudF90aW1lID0gMTQ4MTMyODAwMDsKKworICAgIEVYUEVDVF9FUSgtNjAgKiA2MCAqIDUsIGFuZHJvaWRfdHpvZmZzZXRfaW5fc2Vjb25kcygmY3VycmVudF90aW1lKSk7CisgICAgbG9jYWwgPSAqYW5kcm9pZF9sb2NhbHRpbWUoJmN1cnJlbnRfdGltZSk7CisgICAgRVhQRUNUX0VRKDIwMTYgLSAxOTAwLCBsb2NhbC50bV95ZWFyKTsKKyAgICBFWFBFQ1RfRVEoMTEsIGxvY2FsLnRtX21vbik7CisgICAgRVhQRUNUX0VRKDksIGxvY2FsLnRtX21kYXkpOworICAgIEVYUEVDVF9FUSgxOSwgbG9jYWwudG1faG91cik7CisgICAgRVhQRUNUX0VRKDAsIGxvY2FsLnRtX21pbik7CisgICAgRVhQRUNUX0VRKDAsIGxvY2FsLnRtX3NlYyk7CisgICAgRVhQRUNUX0VRKDAsIGxvY2FsLnRtX2lzZHN0KTsKKworfQorCitURVNUKFRpbWVab25lLCBzZXRUaW1lWm9uZVRvQ2hpbmFTdGFuZGFyZFRpbWUpIHsKKyAgICAvL3RoaXMgdGVzdCByZWxpZXMgb24gdGhlIHdpbmRvd3MgcmVnaXN0cnkgYW5kIGl0IHdvbid0IHdvcmsgb24gd2luZQorICAgIFNLSVBfVEVTVF9PTl9XSU5FKCk7CisgICAgdGltZXpvbmVfc2V0KCJBc2lhL1NoYW5naGFpIik7CisgICAgLy91dGMgdGltZSBmb3IgMjAxNy0xMC0wMSAwMDowMDowMAorICAgIHRpbWVfdCBjdXJyZW50X3RpbWUgPSAxNTA2ODE2MDAwOworICAgIEVYUEVDVF9FUSg2MCAqIDYwICogOCwgYW5kcm9pZF90em9mZnNldF9pbl9zZWNvbmRzKCZjdXJyZW50X3RpbWUpKTsKKyAgICBzdHJ1Y3QgdG0gbG9jYWwgPSAqYW5kcm9pZF9sb2NhbHRpbWUoJmN1cnJlbnRfdGltZSk7CisgICAgRVhQRUNUX0VRKDIwMTcgLSAxOTAwLCBsb2NhbC50bV95ZWFyKTsKKyAgICBFWFBFQ1RfRVEoOSwgbG9jYWwudG1fbW9uKTsKKyAgICBFWFBFQ1RfRVEoMSwgbG9jYWwudG1fbWRheSk7CisgICAgRVhQRUNUX0VRKDgsIGxvY2FsLnRtX2hvdXIpOworICAgIEVYUEVDVF9FUSgwLCBsb2NhbC50bV9taW4pOworICAgIEVYUEVDVF9FUSgwLCBsb2NhbC50bV9zZWMpOworICAgIEVYUEVDVF9FUSgtMSwgbG9jYWwudG1faXNkc3QpOworCisgICAgLy9jaGFuZ2UgY3VycmVudCB0aW1lIHRvIHV0YyB0aW1lIGZvciAyMDE2LTEyLTEwIDAwOjAwOjAwCisgICAgY3VycmVudF90aW1lID0gMTQ4MTMyODAwMDsKKworICAgIEVYUEVDVF9FUSg2MCAqIDYwICogOCwgYW5kcm9pZF90em9mZnNldF9pbl9zZWNvbmRzKCZjdXJyZW50X3RpbWUpKTsKKyAgICBsb2NhbCA9ICphbmRyb2lkX2xvY2FsdGltZSgmY3VycmVudF90aW1lKTsKKyAgICBFWFBFQ1RfRVEoMjAxNiAtIDE5MDAsIGxvY2FsLnRtX3llYXIpOworICAgIEVYUEVDVF9FUSgxMSwgbG9jYWwudG1fbW9uKTsKKyAgICBFWFBFQ1RfRVEoMTAsIGxvY2FsLnRtX21kYXkpOworICAgIEVYUEVDVF9FUSg4LCBsb2NhbC50bV9ob3VyKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYWwudG1fbWluKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYWwudG1fc2VjKTsKKyAgICBFWFBFQ1RfRVEoLTEsIGxvY2FsLnRtX2lzZHN0KTsKKworfQorCitURVNUKFRpbWVab25lLCBzZXRUaW1lWm9uZVRvSW5kaWFTdGFuZGFyZFRpbWUpIHsKKyAgICAvL3RoaXMgdGVzdCByZWxpZXMgb24gdGhlIHdpbmRvd3MgcmVnaXN0cnkgYW5kIGl0IHdvbid0IHdvcmsgb24gd2luZQorICAgIFNLSVBfVEVTVF9PTl9XSU5FKCk7CisgICAgdGltZXpvbmVfc2V0KCJBc2lhL0NhbGN1dHRhIik7CisgICAgLy91dGMgdGltZSBmb3IgMjAxNi0xMC0xMyAyMTo1NToxOAorICAgIHRpbWVfdCBjdXJyZW50X3RpbWUgPSAxNDc2Mzk1NzE4OworICAgIEVYUEVDVF9FUSg2MCAqIDYwICogNSArIDYwICogMzAsIGFuZHJvaWRfdHpvZmZzZXRfaW5fc2Vjb25kcygmY3VycmVudF90aW1lKSk7CisgICAgc3RydWN0IHRtIGxvY2FsID0gKmFuZHJvaWRfbG9jYWx0aW1lKCZjdXJyZW50X3RpbWUpOworICAgIEVYUEVDVF9FUSgyMDE2IC0gMTkwMCwgbG9jYWwudG1feWVhcik7CisgICAgRVhQRUNUX0VRKDksIGxvY2FsLnRtX21vbik7CisgICAgRVhQRUNUX0VRKDE0LCBsb2NhbC50bV9tZGF5KTsKKyAgICBFWFBFQ1RfRVEoMywgbG9jYWwudG1faG91cik7CisgICAgRVhQRUNUX0VRKDI1LCBsb2NhbC50bV9taW4pOworICAgIEVYUEVDVF9FUSgxOCwgbG9jYWwudG1fc2VjKTsKKyAgICBFWFBFQ1RfRVEoLTEsIGxvY2FsLnRtX2lzZHN0KTsKKworICAgIC8vY2hhbmdlIGN1cnJlbnQgdGltZSB0byB1dGMgdGltZSBmb3IgMjAxNi0xMi0xMCAwMDowMDowMAorICAgIGN1cnJlbnRfdGltZSA9IDE0ODEzMjgwMDA7CisKKyAgICBFWFBFQ1RfRVEoNjAgKiA2MCAqIDUgKyA2MCAqIDMwLCBhbmRyb2lkX3R6b2Zmc2V0X2luX3NlY29uZHMoJmN1cnJlbnRfdGltZSkpOworICAgIGxvY2FsID0gKmFuZHJvaWRfbG9jYWx0aW1lKCZjdXJyZW50X3RpbWUpOworICAgIEVYUEVDVF9FUSgyMDE2IC0gMTkwMCwgbG9jYWwudG1feWVhcik7CisgICAgRVhQRUNUX0VRKDExLCBsb2NhbC50bV9tb24pOworICAgIEVYUEVDVF9FUSgxMCwgbG9jYWwudG1fbWRheSk7CisgICAgRVhQRUNUX0VRKDUsIGxvY2FsLnRtX2hvdXIpOworICAgIEVYUEVDVF9FUSgzMCwgbG9jYWwudG1fbWluKTsKKyAgICBFWFBFQ1RfRVEoMCwgbG9jYWwudG1fc2VjKTsKKyAgICBFWFBFQ1RfRVEoLTEsIGxvY2FsLnRtX2lzZHN0KTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3VyaS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdXJpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWIyYWVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3VyaS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKy8vIFNvbWUgZnJlZSBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBzdHJpbmdzIGFzIFVSSXMuIFdoZXJldmVyIHBvc3NpYmxlLAorLy8gdGhlc2UgZnVuY3Rpb25zIHRha2UgY29uc3QgcmVmZXJlbmNlcyB0byBTdHJpbmdWaWV3IHRvIGF2b2lkIHVubmVjZXNzYXJ5CisvLyBjb3BpZXMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3VyaS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvVXJpLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlVyaTsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OnN0ckR1cDsKKworY2hhciogdXJpX2VuY29kZShjb25zdCBjaGFyKiB1cmkpIHsKKyAgICByZXR1cm4gc3RyRHVwKFVyaTo6RW5jb2RlKHVyaSkpOworfQorCitjaGFyKiB1cmlfZGVjb2RlKGNvbnN0IGNoYXIqIHVyaSkgeworICAgIHJldHVybiBzdHJEdXAoVXJpOjpEZWNvZGUodXJpKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdXJpLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdXJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2ZDE1YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy91cmkuaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworLy8gU29tZSBmcmVlIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHN0cmluZ3MgYXMgVVJJcy4gV2hlcmV2ZXIgcG9zc2libGUsCisvLyB0aGVzZSBmdW5jdGlvbnMgdGFrZSBjb25zdCByZWZlcmVuY2VzIHRvIFN0cmluZ1ZpZXcgdG8gYXZvaWQgdW5uZWNlc3NhcnkKKy8vIGNvcGllcy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYW5kcm9pZC9iYXNlL1VyaS5oIHRvIGV4cG9zZSB0aGUgc2FtZQorLy8gZnVuY3Rpb25hbGl0eSB0byBDIGNvZGUuCisKKy8vIFJldHVybnMgcGVyY2VudCBlbmNvZGVkIFVSSS4gQ2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgc3RyaW5nLgorLy8gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nICIiIG9uIGVuY29kZSBlcnJvciwgTlVMTCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK2V4dGVybiBjaGFyKiB1cmlfZW5jb2RlKGNvbnN0IGNoYXIqIHVyaSk7CisKKy8vIERlY29kZXMgYSBwZXJjZW50IGVuY29kZWQgVVJJLiBDYWxsZXIgbXVzdCBmcmVlIHRoZSByZXR1cm5lZCBzdHJpbmcuCisvLyBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgIiIgb24gZGVjb2RlIGVycm9yLCBOVUxMIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorZXh0ZXJuIGNoYXIqIHVyaV9kZWNvZGUoY29uc3QgY2hhciogdXJpKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdXRmOF91dGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdXRmOF91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmZGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy91dGY4X3V0aWxzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvdXRmOF91dGlscy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvVXRmOFV0aWxzLmgiCisKK2Jvb2wgYW5kcm9pZF91dGY4X2lzX3ZhbGlkKGNvbnN0IGNoYXIqIHRleHQsIHNpemVfdCB0ZXh0X2xlbikgeworICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjp1dGY4SXNWYWxpZCh0ZXh0LCB0ZXh0X2xlbik7Cit9CisKK2ludCBhbmRyb2lkX3V0ZjhfZGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGV4dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29kZXBvaW50KSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OnV0ZjhEZWNvZGUodGV4dCwgdGV4dF9sZW4sIGNvZGVwb2ludCk7Cit9CisKK2ludCBhbmRyb2lkX3V0ZjhfZW5jb2RlKHVpbnQzMl90IGNvZGVwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJfbGVuKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OnV0ZjhFbmNvZGUoY29kZXBvaW50LCBidWZmZXIsIGJ1ZmZlcl9sZW4pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3V0ZjhfdXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy91dGY4X3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxMzUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy91dGY4X3V0aWxzLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisvLyBTaW1wbGUgQyB3cmFwcGVyIGZvciBhbmRyb2lkL2Jhc2UvbWlzYy9VdGY4VXRpbHMuaAorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCitib29sIGFuZHJvaWRfdXRmOF9pc192YWxpZChjb25zdCBjaGFyKiB0ZXh0LCBzaXplX3QgdGV4dF9sZW4pOworCisvLyBUcnkgdG8gZGVjb2RlIGFuIFVURi04IGVuY29kZWQgVW5pY29kZSBjb2RlcG9pbnQgZnJvbSB0aGUgfHRleHRfbGVufCBieXRlcworLy8gYXQgfHRleHR8LiBPbiBzdWNjZXNzLCByZXR1cm4gdGhlIGVuY29kZWQgbGVuZ3RoLCBhbmQgc2V0cyB8KmNvZGVwb2ludHwgdG8KKy8vIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgdmFsdWUuIE9uIGZhaWx1cmUgKGludmFsaWQgaW5wdXQpLCByZXR1cm4gLTEuCitpbnQgYW5kcm9pZF91dGY4X2RlY29kZShjb25zdCB1aW50OF90KiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRleHRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvZGVwb2ludCk7CisKKy8vIFRyeSB0byBlbmNvZGUgYSBVbmljb2RlIHxjb2RlcG9pbnR8IGludG8gaXRzIFVURi04IHJlcHJlc2VudGF0aW9uIGludG8KKy8vIHxidWZmZXJ8LCB3aGljaCBtdXN0IGhvbGQgYXQgbGVhc3QgfGJ1ZmZlcl9sZW58IGJ5dGVzLgorLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBlbmNvZGluZyBpbiBieXRlcywgb3IgLTEgaW4gY2FzZSBvZiBlcnJvcgorLy8gKGUuZy4gaW52YWxpZCB2YWx1ZSkuCitpbnQgYW5kcm9pZF91dGY4X2VuY29kZSh1aW50MzJfdCBjb2RlcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyX2xlbik7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3ZlY3Rvci5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3ZlY3Rvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjlkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdmVjdG9yLmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGFuZHJvaWQvdXRpbHMvdmVjdG9yLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK2V4dGVybiB2b2lkCitfYXZlY3Rvcl9lbnN1cmUoIHZvaWQqKiAgaXRlbXMsIHNpemVfdCAgaXRlbVNpemUsIHVuc2lnbmVkKiAgcE1heEl0ZW1zLCB1bnNpZ25lZCAgbmV3Q291bnQgKQoreworICAgIHVuc2lnbmVkICBvbGRNYXggPSAqcE1heEl0ZW1zOworCisgICAgaWYgKG5ld0NvdW50ID4gb2xkTWF4KSB7CisgICAgICAgIHVuc2lnbmVkICBuZXdNYXggPSBvbGRNYXg7CisgICAgICAgIHVuc2lnbmVkICBiaWdNYXggPSBVSU5UX01BWCAvIGl0ZW1TaXplOworCisgICAgICAgIGlmIChpdGVtU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBBQVNTRVJUX0ZBSUwoInRyeWluZyB0byByZWFsbG9jYXRlIGFycmF5IG9mIDAtc2l6ZSBpdGVtcyAoY291bnQ9JWQpXG4iLCBuZXdDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmV3Q291bnQgPiBiaWdNYXgpIHsKKyAgICAgICAgICAgIEFBU1NFUlRfRkFJTCgidHJ5aW5nIHRvIHJlYWxsb2NhdGUgb3Zlci1zaXplZCBhcnJheSBvZiAlZC1ieXRlcyBpdGVtcyAoJWQgPiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVNpemUsIG5ld0NvdW50LCBiaWdNYXgpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKG5ld01heCA8IG5ld0NvdW50KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBuZXdNYXgyID0gbmV3TWF4ICsgKG5ld01heCA+PiAxKSArIDQ7CisgICAgICAgICAgICBpZiAobmV3TWF4MiA8IG5ld01heCB8fCBuZXdNYXgyID4gYmlnTWF4KQorICAgICAgICAgICAgICAgIG5ld01heDIgPSBiaWdNYXg7CisgICAgICAgICAgICBuZXdNYXggPSBuZXdNYXgyOworICAgICAgICB9CisKKyAgICAgICAgKml0ZW1zICAgICA9IF9hbmRyb2lkX2FycmF5X3JlYWxsb2MoICppdGVtcywgaXRlbVNpemUsIG5ld01heCApOworICAgICAgICAqcE1heEl0ZW1zID0gbmV3TWF4OworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3ZlY3Rvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmVkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvdmVjdG9yLmgKQEAgLTAsMCArMSw4NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2Fzc2VydC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisjZGVmaW5lICBBVkVDVE9SX0RFQ0woY3R5cGUsbmFtZSkgIFwKKyAgICBjdHlwZSogICAgbmFtZTsgXAorICAgIHVuc2lnbmVkICBudW1fIyNuYW1lOyBcCisgICAgdW5zaWduZWQgIG1heF8jI25hbWUgXAorCisjZGVmaW5lICBBVkVDVE9SX1NJWkUob2JqLG5hbWUpICBcCisgICAgKG9iaiktPm51bV8jI25hbWUKKworI2RlZmluZSAgQVZFQ1RPUl9JTklUKG9iaixuYW1lKSAgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgKG9iaiktPm5hbWUgPSBOVUxMOyBcCisgICAgICAgIChvYmopLT5udW1fIyNuYW1lID0gMDsgXAorICAgICAgICAob2JqKS0+bWF4XyMjbmFtZSA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lICBBVkVDVE9SX0lOSVRfQUxMT0Mob2JqLG5hbWUsY291bnQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQUFSUkFZX05FVzAoIChvYmopLT5uYW1lLCAoY291bnQpICk7IFwKKyAgICAgICAgKG9iaiktPm51bV8jI25hbWUgPSAwOyBcCisgICAgICAgIChvYmopLT5tYXhfIyNuYW1lID0gKGNvdW50KTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgIEFWRUNUT1JfRE9ORShvYmosbmFtZSkgIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQUZSRUUoKG9iaiktPm5hbWUpOyBcCisgICAgICAgIChvYmopLT5udW1fIyNuYW1lID0gMDsgXAorICAgICAgICAob2JqKS0+bWF4XyMjbmFtZSA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lICBBVkVDVE9SX0NMRUFSKG9iaixuYW1lKSBcCisgICAgZG8geyBcCisgICAgICAgIChvYmopLT5udW1fIyNuYW1lID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgIEFWRUNUT1JfQVQob2JqLG5hbWUsaW5kZXgpICBcCisgICAgKCYob2JqKS0+bmFtZVsoaW5kZXgpXSkKKworI2RlZmluZSAgQVZFQ1RPUl9SRUFMTE9DKG9iaixuYW1lLG5ld01heCkgXAorICAgIGRvIHsgXAorICAgICAgICBBQVJSQVlfUkVORVcoKG9iaiktPm5hbWUsbmV3TWF4KTsgXAorICAgICAgICAob2JqKS0+bWF4XyMjbmFtZSA9IChuZXdNYXgpOyBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lICBBVkVDVE9SX0VOU1VSRShvYmosbmFtZSxuZXdDb3VudCkgXAorICAgIGRvIHsgXAorICAgICAgICB1bnNpZ25lZCAgX25ld0NvdW50ID0gKG5ld0NvdW50KTsgXAorICAgICAgICBpZiAoX25ld0NvdW50ID4gKG9iaiktPm1heF8jI25hbWUpIFwKKyAgICAgICAgICAgIEFBU1NFUlRfTE9DKCk7IFwKKyAgICAgICAgICAgIF9hdmVjdG9yX2Vuc3VyZSggKHZvaWQqKikmKG9iaiktPm5hbWUsIHNpemVvZigob2JqKS0+bmFtZVswXSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihvYmopLT5tYXhfIyNuYW1lLCBfbmV3Q291bnQgKTsgXAorICAgIH0gd2hpbGUgKDApOworCitleHRlcm4gdm9pZCAgX2F2ZWN0b3JfZW5zdXJlKCB2b2lkKiogIGl0ZW1zLCBzaXplX3QgIGl0ZW1TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQqICBwTWF4SXRlbXMsIHVuc2lnbmVkICBuZXdDb3VudCApOworCisjZGVmaW5lICBBVkVDVE9SX0ZPUkVBQ0gob2JqLG5hbWUsaXRlbXB0cixzdGF0ZW1lbnQpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgdW5zaWduZWQgX192ZWN0b3Jfbm4gPSAwOyBcCisgICAgICAgIHVuc2lnbmVkIF9fdmVjdG9yX21heCA9IChvYmopLT5udW1fIyNuYW1lOyBcCisgICAgICAgIGZvciAoIDsgX192ZWN0b3Jfbm4gPCBfX3ZlY3Rvcl9tYXg7IF9fdmVjdG9yX25uKysgKSB7IFwKKyAgICAgICAgICAgIGl0ZW1wdHIgPSAmKG9iaiktPm5hbWVbX192ZWN0b3Jfbm5dOyBcCisgICAgICAgICAgICBzdGF0ZW1lbnQ7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZGMzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfY21kbGluZV9xdW90ZS5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9taXNjL1N0cmluZ1V0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9XaW4zMlV0aWxzLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N5c3RlbS5oIgorCitjaGFyKiB3aW4zMl9jbWRsaW5lX3F1b3RlKGNvbnN0IGNoYXIqIHBhcmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gYW5kcm9pZDo6YmFzZTo6V2luMzJVdGlsczo6cXVvdGVDb21tYW5kTGluZShwYXJhbSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OnN0ckR1cChyZXN1bHQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3dpbjMyX2NtZGxpbmVfcXVvdGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy93aW4zMl9jbWRsaW5lX3F1b3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyZDFiYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy93aW4zMl9jbWRsaW5lX3F1b3RlLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvLyBRdW90ZSBhIGdpdmVuIGNvbW1hbmQtbGluZSBjb21tYW5kIG9yIHBhcmFtZXRlciBzbyB0aGF0IGl0IGNhbiBiZQorLy8gc2VudCB0byBfZXhlY3YoKSBvbiBXaW5kb3dzLCBhbmQgYmUgcmVjZWl2ZWQgcHJvcGVybHkgYnkgdGhlIG5ldworLy8gcHJvY2Vzcy4KKy8vCisvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byB3b3JrLWFyb3VuZCBhbiBhbm5veWluZyBpc3N1ZSBvbiBXaW5kb3dzLCB3aGVyZQorLy8gc3Bhd24oKSAvIGV4ZWMoKSBmdW5jdGlvbnMgYXJlIG1lcmUgd3JhcHBlcnMgYXJvdW5kIENyZWF0ZVByb2Nlc3MsIHdoaWNoCisvLyBhbHdheXMgcGFzcyB0aGUgY29tbWFuZC1saW5lIGFzIGEgX3NpbmdsZV8gc3RyaW5nIG1hZGUgb2YgdGhlIHNpbXBsZQorLy8gY29uY2F0ZW5hdGlvbnMgb2YgdGhlaXIgYXJndW1lbnRzLCB3aGlsZSB0aGUgbmV3IHByb2Nlc3Mgd2lsbCB0eXBpY2FsbHkKKy8vIHVzZSBDb21tYW5kTGluZVRvQXJndiB0byBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsCisvLyBleHBlY3RlZCB0aGUgdmFsdWVzIHRvIGJlIHF1b3RlZCBwcm9wZXJseS4KKy8vCisvLyBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoaXMgbWVzcywgcmVhZCB0aGUgTVNETiBibG9nIHBvc3QgbmFtZWQKKy8vICJFdmVyeW9uZSBxdW90ZXMgYXJndW1lbnRzIHRoZSB3cm9uZyB3YXkiLgorLy8KKy8vIHxwYXJhbXwgaXMgYW4gaW5wdXQgc3RyaW5nLCB0aGF0IG1heSBjb250YWluIHNwYWNlcywgcXVvdGVzIG9yIGJhY2tzbGFzaGVzLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZXcgaGVhcC1hbGxvY2F0ZWQgZnVuY3Rpb24gdGhhdCBjb250YWlucyBhIHZlcnNpb24KKy8vIG9mIHxwYXJhbXwgdGhhdCBjYW4gYmUgZGVjb2RlZCBwcm9wZXJseSBieSBDb21tYW5kTGluZVRvQXJndigpLiBUaGUgY2FsbGVyCisvLyBtdXN0IGZyZWUgdGhlIHN0cmluZyB3aXRoIGFuZHJvaWRfZnJlZSgpIG9yIEFGUkVFKCkuCitjaGFyKiB3aW4zMl9jbWRsaW5lX3F1b3RlKGNvbnN0IGNoYXIqIHBhcmFtKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfY21kbGluZV9xdW90ZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfY21kbGluZV9xdW90ZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyYmUwZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy93aW4zMl9jbWRsaW5lX3F1b3RlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvd2luMzJfY21kbGluZV9xdW90ZS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKy8vIEhlbHBlciBjbGFzcyB0byBob2xkIGEgc2NvcGVkIGhlYXAtYWxsb2NhdGVkIHN0cmluZyBwb2ludGVyIHRoYXQgZ2V0cworLy8gZGVsZXRlZCBvbiBzY29wZSBleGl0LgorY2xhc3MgU2NvcGVkQ1N0cmluZyB7CitwdWJsaWM6CisgIFNjb3BlZENTdHJpbmcoY29uc3QgY2hhciogc3RyKSA6IHN0cl8oc3RyKSB7fQorICBjb25zdCBjaGFyKiBzdHIoKSBjb25zdCB7IHJldHVybiBzdHJfOyB9CisgIH5TY29wZWRDU3RyaW5nKCkgeyBBRlJFRSgodm9pZCopc3RyXyk7IH0KK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqIHN0cl87Cit9OworCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK1RFU1Qod2luMzJfY21kbGluZV9xdW90ZSxUZXN0KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgY29uc3QgY2hhciogaW5wdXQ7CisgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZDsKKyAgfSBrRGF0YVtdID0geworICAgICAgeyAiZm9vIiwgImZvbyIgfSwKKyAgICAgIHsgImZvbyBiYXIiLCAiXCJmb28gYmFyXCIiIH0sCisgICAgICB7ICJmb29cXGJhciIsICJmb29cXGJhciIgfSwKKyAgICAgIHsgImZvb1xcXFxiYXIiLCAiZm9vXFxcXGJhciIgfSwKKyAgICAgIHsgImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIiB9LAorICAgICAgeyAiZm9vXFxcImJhciIsICJcImZvb1xcXFxcXFwiYmFyXCIiIH0sCisgICAgICB7ICJmb29cXGJhciB6b28iLCAiXCJmb29cXGJhciB6b29cIiIgfSwKKyAgfTsKKyAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBBUlJBWV9TSVpFKGtEYXRhKTsgKytuKSB7CisgICAgICBjb25zdCBjaGFyKiBpbnB1dCA9IGtEYXRhW25dLmlucHV0OworICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWQgPSBrRGF0YVtuXS5leHBlY3RlZDsKKworICAgICAgU2NvcGVkQ1N0cmluZyBvdXQod2luMzJfY21kbGluZV9xdW90ZShpbnB1dCkpOworICAgICAgRVhQRUNUX1NUUkVRKGV4cGVjdGVkLCBvdXQuc3RyKCkpIDw8ICJRdW90aW5nICciIDw8IGlucHV0IDw8ICInIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3dpbjMyX3VuaWNvZGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3dpbjMyX3VuaWNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzkwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfdW5pY29kZS5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3dpbjMyX3VuaWNvZGUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVbmljb2RlU3RyaW5nLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OldpbjMyVW5pY29kZVN0cmluZzsKKworZXh0ZXJuICJDIiB7CisKK2NoYXIqIHdpbjMyX3V0ZjE2X3RvX3V0Zjhfc3RyKGNvbnN0IHdjaGFyX3QqIHN0cikgeworICAgIGF1dG8gbmFycm93ID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KHN0cik7CisgICAgaWYgKG5hcnJvdy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gc3RyZHVwKG5hcnJvdy5jX3N0cigpKTsKK30KKworaW50IHdpbjMyX3V0ZjE2X3RvX3V0ZjhfYnVmKGNvbnN0IHdjaGFyX3QqIHN0ciwgY2hhciogYnVmZmVyLCBpbnQgc2l6ZSkgeworICAgIGludCB3cml0dGVuID0gV2luMzJVbmljb2RlU3RyaW5nOjpjb252ZXJ0VG9VdGY4KGJ1ZmZlciwgc2l6ZSwgc3RyKTsKKyAgICBpZiAod3JpdHRlbiA8IDAgfHwgd3JpdHRlbiA+PSBzaXplKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHdyaXR0ZW47Cit9CisKK3djaGFyX3QqIHdpbjMyX3V0ZjhfdG9fdXRmMTZfc3RyKGNvbnN0IGNoYXIqIHN0cikgeworICAgIFdpbjMyVW5pY29kZVN0cmluZyB3aWRlKHN0cik7CisgICAgcmV0dXJuIHdpZGUucmVsZWFzZSgpOworfQorCit9ICAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy93aW4zMl91bmljb2RlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfdW5pY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MGQ2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMvd2luMzJfdW5pY29kZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgfHN0cnwgZnJvbSBVVEYtMTYgdG8gVVRGLTggYW5kIHJldHVybiBhCisvLyBwb2ludGVyIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIHRoaXMgbWVtb3J5IHRvIG1hdGNoCisvLyB0aGUgcmVxdWlyZWQgc2l6ZSBhbmQgaXQncyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBmcmVlIGl0LiBSZXR1cm5zCisvLyBOVUxMIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLgorY2hhciogd2luMzJfdXRmMTZfdG9fdXRmOF9zdHIoY29uc3Qgd2NoYXJfdCogc3RyKTsKKworLy8gQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgfHN0cnwgZnJvbSBVVEYtMTYgdG8gVVRGLTggYW5kIHBsYWNlIHRoZQorLy8gcmVzdWx0IGluIHxidWZmZXJ8LiBBIG1heGltdW0gb2YgfHNpemV8IGNoYXJhY3RlcnMgaW4gfGJ1ZmZlcnwgd2lsbCBiZSB1c2VkLgorLy8gSWYgdGhlIGNvbnZlcnNpb24gZmFpbHMgb3IgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBpbiB8YnVmZmVyfCBhcworLy8gaW5kaWNhdGVkIGJ5IHxzaXplfCB0aGUgZnVuY3Rpb24gcmV0dXJucyAtMS4gT24gc3VjY2VzcyB0aGUgbnVtYmVyIG9mCisvLyBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gfGJ1ZmZlcnwgaXMgcmV0dXJuZWQuCitpbnQgd2luMzJfdXRmMTZfdG9fdXRmOF9idWYoY29uc3Qgd2NoYXJfdCogc3RyLCBjaGFyKiBidWZmZXIsIGludCBzaXplKTsKKworLy8gQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgfHN0cnwgZnJvbSBVVEYtOCB0byBVVEYtMTYgYW5kIHJldHVybiBhCisvLyBwb2ludGVyIHRvIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIHRoaXMgbWVtb3J5IHRvIG1hdGNoCisvLyB0aGUgcmVxdWlyZWQgc2l6ZSBhbmQgaXQncyB0aGUgY2FsbGVycyByZXNwb25zaWJpbGl0eSB0byBmcmVlIGl0LiBSZXR1cm5zCisvLyBOVUxMIGlmIHRoZSBjb252ZXJzaW9uIGZhaWxzLgord2NoYXJfdCogd2luMzJfdXRmOF90b191dGYxNl9zdHIoY29uc3QgY2hhciogc3RyKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy94ODZfY3B1aWQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3g4Nl9jcHVpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0ODc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy94ODZfY3B1aWQuY3BwCkBAIC0wLDAgKzEsMjQxIEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbgorKiogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUsIEluYy4KKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMveDg2X2NwdWlkLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3VpbnQzMl90IGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9mdW5jdGlvbl9tYXgoKQoreworICAgIHVpbnQzMl90IGZ1bmN0aW9uX21heDsKKyAgICBhbmRyb2lkX2dldF94ODZfY3B1aWQoMCwgMCwgJmZ1bmN0aW9uX21heCwgMCwgMCwgMCk7CisgICAgcmV0dXJuIGZ1bmN0aW9uX21heDsKK30KKwordWludDMyX3QgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX2V4dGVuZGVkX2Z1bmN0aW9uX21heCgpCit7CisgICAgdWludDMyX3QgZnVuY3Rpb25fbWF4OworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgweDgwMDAwMDAwLCAwLCAmZnVuY3Rpb25fbWF4LCAwLCAwLCAwKTsKKyAgICByZXR1cm4gZnVuY3Rpb25fbWF4OworfQorCit2b2lkIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCh1aW50MzJfdCBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplYngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWN4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVkeCkgeworI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKKyAgICB1aW50MzJfdCB2ZWNbNF07CisKKyNpZmRlZiBfX3g4Nl82NF9fCisgICAgYXNtIHZvbGF0aWxlKCJjcHVpZCIKKyAgICAgICAgICAgICAgICAgOiAiPWEiKHZlY1swXSksICI9YiIodmVjWzFdKSwKKyAgICAgICAgICAgICAgICAgICAiPWMiKHZlY1syXSksICI9ZCIodmVjWzNdKQorICAgICAgICAgICAgICAgICA6ICIwIihmdW5jdGlvbiksICJjIihjb3VudCkgOiAiY2MiKTsKKyNlbHNlIC8qICFfX3g4Nl82NF9fICovCisgICAgYXNtIHZvbGF0aWxlKCJwdXNoYSBcblx0IgorICAgICAgICAgICAgICAgICAiY3B1aWQgXG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAlJWVheCwgMCglMikgXG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAlJWVieCwgNCglMikgXG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAlJWVjeCwgOCglMikgXG5cdCIKKyAgICAgICAgICAgICAgICAgIm1vdiAlJWVkeCwgMTIoJTIpIFxuXHQiCisgICAgICAgICAgICAgICAgICJwb3BhIgorICAgICAgICAgICAgICAgICA6IDogImEiKGZ1bmN0aW9uKSwgImMiKGNvdW50KSwgIlMiKHZlYykKKyAgICAgICAgICAgICAgICAgOiAibWVtb3J5IiwgImNjIik7CisjZW5kaWYgLyogIV9feDg2XzY0X18gKi8KKworICAgIGlmIChlYXgpIHsKKyAgICAgICAgKmVheCA9IHZlY1swXTsKKyAgICB9CisgICAgaWYgKGVieCkgeworICAgICAgICAqZWJ4ID0gdmVjWzFdOworICAgIH0KKyAgICBpZiAoZWN4KSB7CisgICAgICAgICplY3ggPSB2ZWNbMl07CisgICAgfQorICAgIGlmIChlZHgpIHsKKyAgICAgICAgKmVkeCA9IHZlY1szXTsKKyAgICB9CisjZW5kaWYgLyogZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9faTM4Nl9fKSAqLworfQorCisKKworYm9vbCBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkX2lzX3ZtaG9zdChjb25zdCBjaGFyKiB2ZW5kb3JfaWQpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgVk1Ib3N0Q1BVSURbXSA9IHsKKyAgICAgICAgIktWTUtWTUtWTSIsICAgIC8vIEtWTQorICAgICAgICAiTWljcm9zb2Z0IEh2IiwgLy8gTWljcm9zb2Z0IEh5cGVyLVYgb3IgV2luZG93cyBWaXJ0dWFsIFBDCisgICAgICAgICJWTXdhcmVWTXdhcmUiLCAvLyBWTXdhcmUKKyAgICAgICAgIlhlblZNTVhlblZNTSIsIC8vIFhlbiBIVk0KKyAgICB9OworCisgICAgY29uc3QgaW50IFZNSG9zdENQVUlEQ291bnQgPSBzaXplb2YoVk1Ib3N0Q1BVSUQpL3NpemVvZihWTUhvc3RDUFVJRFswXSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWTUhvc3RDUFVJRENvdW50OyBpKyspIHsKKyAgICAgICAgLyogSSBkb24ndCB0aGluayBIQVhNIHN1cHBvcnRzIG5lc3RpbmcgKi8KKyAgICAgICAgaWYgKG1lbWNtcCh2ZW5kb3JfaWQsIFZNSG9zdENQVUlEW2ldLCBzdHJsZW4oVk1Ib3N0Q1BVSURbaV0pKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkKGNoYXIqIGJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisgICAgbWVtc2V0KGJ1ZiwgMCwgYnVmX2xlbik7CisgICAgaWYgKGJ1Zl9sZW4gPCAxMykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkKDAsIDAsCisgICAgICAgICAgICAwLCAodWludDMyX3QqKWJ1ZiwgKHVpbnQzMl90KikoYnVmKzgpLCAodWludDMyX3QqKShidWYrNCkpOworfQorCit2b2lkIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92bWhvc3RfdmVuZG9yX2lkKGNoYXIqIGJ1Ziwgc2l6ZV90IGJ1Zl9sZW4pCit7CisgICAgbWVtc2V0KGJ1ZiwgMCwgYnVmX2xlbik7CisgICAgaWYgKGJ1Zl9sZW4gPCAxMykKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkKDB4NDAwMDAwMDAsIDAsCisgICAgICAgICAgICAwLCAodWludDMyX3QqKWJ1ZiwgKHVpbnQzMl90KikoYnVmKzQpLCAodWludDMyX3QqKShidWYrOCkpOworfQorCitDcHVWZW5kb3JJZFR5cGUgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF90eXBlKGNvbnN0IGNoYXIqIHZlbmRvcl9pZCkKK3sKKyAgICBpZiAoIXZlbmRvcl9pZCkgeworICAgICAgICByZXR1cm4gVkVORE9SX0lEX09USEVSOworICAgIH0KKworICAgIGlmIChzdHJjbXAodmVuZG9yX2lkLCAiQXV0aGVudGljQU1EIikgPT0gMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX0lEX0FNRDsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh2ZW5kb3JfaWQsICJHZW51aW5lSW50ZWwiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfSURfSU5URUw7CisgICAgfQorICAgIGlmIChzdHJjbXAodmVuZG9yX2lkLCAiVklBIFZJQSBWSUEgIikgPT0gMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX0lEX1ZJQTsKKyAgICB9CisgICAgaWYgKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfaXNfdm1ob3N0KHZlbmRvcl9pZCkpIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9JRF9WTTsKKyAgICB9CisKKyAgICByZXR1cm4gVkVORE9SX0lEX09USEVSOworfQorCitDcHVWZW5kb3JWbVR5cGUgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl92bWhvc3RfdHlwZShjb25zdCBjaGFyKiB2ZW5kb3JfaWQpIHsKKyAgICBpZiAoIXZlbmRvcl9pZCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1ZNX09USEVSOworICAgIH0KKworICAgIGlmICh2ZW5kb3JfaWRbMF0gPT0gMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1ZNX05PVFZNOworICAgIH0KKyAgICBpZiAoc3RyY21wKHZlbmRvcl9pZCwgIlZNV2FyZVZNV2FyZSIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIFZFTkRPUl9WTV9WTVdBUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAodmVuZG9yX2lkLCAiS1ZNS1ZNS1ZNIikgPT0gMCkgeworICAgICAgICByZXR1cm4gVkVORE9SX1ZNX0tWTTsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh2ZW5kb3JfaWQsICJWQm94VkJveFZCb3giKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVk1fVkJPWDsKKyAgICB9CisgICAgaWYgKHN0cmNtcCh2ZW5kb3JfaWQsICJNaWNyb3NvZnQgSHYiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBWRU5ET1JfVk1fSFlQRVJWOworICAgIH0KKworICAgIHJldHVybiBWRU5ET1JfVk1fT1RIRVI7Cit9CisKK2Jvb2wgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZteF9zdXBwb3J0KCkKK3sKKyAgICB1aW50MzJfdCBjcHVpZF9mdW5jdGlvbjFfZWN4OworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgxLCAwLCBOVUxMLCBOVUxMLCAmY3B1aWRfZnVuY3Rpb24xX2VjeCwgTlVMTCk7CisKKyAgICBjb25zdCB1aW50MzJfdCBDUFVJRF8xX0VDWF9WTVggPSAoMTw8NSk7IC8vIEludGVsIFZNWCBzdXBwb3J0CisgICAgaWYgKChjcHVpZF9mdW5jdGlvbjFfZWN4ICYgQ1BVSURfMV9FQ1hfVk1YKSAhPSAwKSB7CisgICAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGNvbmZpcm0gdGhhdCB0aGlzIGlzIGFuIEludGVsIENQVQorICAgICAgICBjaGFyIHZlbmRvcl9pZFsxM107CisgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWQodmVuZG9yX2lkLCBzaXplb2YodmVuZG9yX2lkKSk7CisgICAgICAgIGlmIChhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkX3R5cGUodmVuZG9yX2lkKSA9PSBWRU5ET1JfSURfSU5URUwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9zdm1fc3VwcG9ydCgpCit7CisgICAgdWludDMyX3QgY3B1aWRfZWN4OworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgweDgwMDAwMDAxLCAwLCBOVUxMLCBOVUxMLCAmY3B1aWRfZWN4LCBOVUxMKTsKKworICAgIGNvbnN0IHVpbnQzMl90IENQVUlEX0VDWF9TVk0gPSAoMTw8Mik7IC8vIEFNRCBTVk0gc3VwcG9ydAorICAgIGlmICgoY3B1aWRfZWN4ICYgQ1BVSURfRUNYX1NWTSkgIT0gMCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgaXQncyBhbiBBTUQgcHJvY2Vzc29yCisgICAgICAgIGNoYXIgdmVuZG9yX2lkWzEzXTsKKyAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZCh2ZW5kb3JfaWQsIHNpemVvZih2ZW5kb3JfaWQpKTsKKyAgICAgICAgaWYgKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfdHlwZSh2ZW5kb3JfaWQpID09IFZFTkRPUl9JRF9BTUQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9pc192Y3B1KCkKK3sKKyAgICB1aW50MzJfdCBjcHVpZF9mdW5jdGlvbjFfZWN4OworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgxLCAwLCBOVUxMLCBOVUxMLCAmY3B1aWRfZnVuY3Rpb24xX2VjeCwgTlVMTCk7CisKKyAgICAvLyBIeXBlcnZpc29ycyBhcmUgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhlaXIgcHJlc2VuY2Ugd2l0aCBhIGJpdCBpbiB0aGUKKyAgICAvLyBvdXRwdXQgb2YgcnVubmluZyBDUFVJRCB3aGVuIGVheD0xOiBpZiB0aGUgb3V0cHV0IEVDWCBoYXMgYml0IDMxIHNldAorICAgIC8vIChjaXRlOiBodHRwczovL2x3bi5uZXQvQXJ0aWNsZXMvMzAxODg4LyApLgorICAgIGNvbnN0IHVpbnQzMl90IENQVUlEXzFfRUNYX1ZDUFUgPSAoMTw8MzEpOyAvLyBUaGlzIGlzIGEgdmlydHVhbCBDUFUKKyAgICByZXR1cm4gKGNwdWlkX2Z1bmN0aW9uMV9lY3ggJiBDUFVJRF8xX0VDWF9WQ1BVKSAhPSAwOworfQorCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9ueF9zdXBwb3J0KCkKK3sKKyAgICBpZiAoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX2V4dGVuZGVkX2Z1bmN0aW9uX21heCgpIDwgMHg4MDAwMDAwMSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdWludDMyX3QgY3B1aWRfODAwMDAwMDFfZWR4OworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgweDgwMDAwMDAxLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAmY3B1aWRfODAwMDAwMDFfZWR4KTsKKworICAgIGNvbnN0IHVpbnQzMl90IENQVUlEXzgwMDAwMDAxX0VEWF9OWCA9ICgxPDwyMCk7IC8vIE5YIHN1cHBvcnQKKyAgICByZXR1cm4gKGNwdWlkXzgwMDAwMDAxX2VkeCAmIENQVUlEXzgwMDAwMDAxX0VEWF9OWCkgIT0gMDsKK30KKworYm9vbCBhbmRyb2lkX2dldF94ODZfY3B1aWRfaXNfNjRiaXRfY2FwYWJsZSgpCit7CisjaWZkZWYgX194ODZfNjRfXworICAgIHJldHVybiB0cnVlOyAgICAvLyB0aGlzIHdhcyBlYXN5CisjZWxzZQorICAgIGNvbnN0IHVpbnQzMl90IGtCaXRuZXNzU3VwcG9ydEZ1bmMgPSAweDgwMDAwMDAxOworCisgICAgY29uc3QgYXV0byBtYXhGdW5jID0gYW5kcm9pZF9nZXRfeDg2X2NwdWlkX2V4dGVuZGVkX2Z1bmN0aW9uX21heCgpOworICAgIGlmIChtYXhGdW5jIDwga0JpdG5lc3NTdXBwb3J0RnVuYykgeworICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGlmIGl0J3MgdGhhdCBvbGQsIGl0IGlzIG5vdCBhIDY0LWJpdCBvbmUKKyAgICB9CisKKyAgICB1aW50MzJfdCBlZHggPSAwOworICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZChrQml0bmVzc1N1cHBvcnRGdW5jLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCAmZWR4KTsKKyAgICAvLyBiaXQgMjkgaXMgdGhlIDY0LWJpdCBtb2RlIHN1cHBvcnQKKyAgICBpZiAoKGVkeCAmICgxIDw8IDI5KSkgIT0gMCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMveDg2X2NwdWlkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMveDg2X2NwdWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZjMzExMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC91dGlscy94ODZfY3B1aWQuaApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyoqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24KKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfZnVuY3Rpb25fbWF4OiByZXRyaWV2ZSB4ODYgQ1BVSUQgZnVuY3Rpb24gbWF4CisgKiBzdXBwb3J0ZWQgYnkgdGhpcyBwcm9jZXNzb3IuICBUaGlzIGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1ZSBwYXNzZWQKKyAqIHRvIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCB8ZnVuY3Rpb258IHBhcmFtZXRlcgorICovCit1aW50MzJfdCBhbmRyb2lkX2dldF94ODZfY3B1aWRfZnVuY3Rpb25fbWF4KCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfZXh0ZW5kZWRfZnVuY3Rpb25fbWF4OiByZXRyaWV2ZSB4ODYgQ1BVSUQgZXh0ZW5kZWQKKyAqIGZ1bmN0aW9uIG1heCBzdXBwb3J0ZWQgYnkgdGhpcyBwcm9jZXNzb3IuICBUaGlzIGlzIGNvcnJlc3BvbmRzIHRvIHRoZQorICogdmFsdWUgcGFzc2VkIHRvIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCB8ZnVuY3Rpb258IHBhcmFtZXRlcgorICovCit1aW50MzJfdCBhbmRyb2lkX2dldF94ODZfY3B1aWRfZXh0ZW5kZWRfZnVuY3Rpb25fbWF4KCk7CisKKy8qIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBDUFVJRCBmZWF0dXJlcyBpcyBiYXNlZCBvbiBUYWJsZSAxIGluIHNlY3Rpb24gJ0FCSQorICogTWFuYWdlbWVudCcgb2YgTkRLIFByb2dyYW1tZXIncyBHdWlkZSAoQW5kcm9pZCBOREsgcjEwYykuICovCisvKiBBcHBsaWNhYmxlIHdoZW4gY2FsbGluZyBDUFVJRCB3aXRoIEVBWD0xICovCisjZGVmaW5lIENQVUlEX0VEWF9NTVggICAgICAoMSA8PCAyMykKKyNkZWZpbmUgQ1BVSURfRURYX1NTRSAgICAgICgxIDw8IDI1KQorI2RlZmluZSBDUFVJRF9FRFhfU1NFMiAgICAgKDEgPDwgMjYpCisjZGVmaW5lIENQVUlEX0VDWF9TU0UzICAgICAoMSA8PCAwKQorI2RlZmluZSBDUFVJRF9FQ1hfU1NTRTMgICAgKDEgPDwgOSkKKyNkZWZpbmUgQ1BVSURfRUNYX1NTRTQxICAgICgxIDw8IDE5KQorI2RlZmluZSBDUFVJRF9FQ1hfU1NFNDIgICAgKDEgPDwgMjApCisjZGVmaW5lIENQVUlEX0VDWF9QT1BDTlQgICAoMSA8PCAyMykKKworLyoKKyAqIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZDogcmV0cmlldmUgeDg2IENQVUlEIGZvciBob3N0IENQVS4KKyAqCisgKiBFeGVjdXRlcyB0aGUgeDg2IENQVUlEIGluc3RydWN0aW9uIG9uIHRoZSBob3N0IENQVSB3aXRoIHRoZSBnaXZlbgorICogcGFyYW1ldGVycywgYW5kIHNhdmVzIHRoZSByZXN1bHRzIGluIHRoZSBnaXZlbiBsb2NhdGlvbnMuIERvZXMgbm90aGluZyBvbgorICogbm9uLXg4NiBob3N0cy4KKyAqCisgKiB8ZnVuY3Rpb258IGlzIHRoZSAnQ1BVSUQgbGVhZicgKHRoZSBFQVggcGFyYW1ldGVyIHRvIENQVUlEKSwgYW5kIHxjb3VudHwKKyAqIHRoZSAnQ1BVSUQgc3ViLWxlYWYnICh0aGUgRUNYIHBhcmFtZXRlciB0byBDUFVJRCksIGdpdm5lIGFzIGlucHV0CisgKgorICogcGFyYW1ldGVycy4gfGVheHwsfGVieHwsfGVjeHwgYW5kIHxlZHh8IGFyZSBvcHRpb25hbCBwb2ludGVycyB0byB2YXJpYWJsZXMKKyAqIHRoYXQgd2lsbCBiZSBzZXQgb24gZXhpdCB0byB0aGUgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXI7CisgKiBpZiBvbmUgb2YgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgaXQgaXMgaWdub3JlZC4KKyAqLwordm9pZCBhbmRyb2lkX2dldF94ODZfY3B1aWQodWludDMyX3QgZnVuY3Rpb24sIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVheCwgdWludDMyX3QgKmVieCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplY3gsIHVpbnQzMl90ICplZHgpOworCisvKgorICogYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZDogcmV0cmlldmUgeDg2IENQVUlEIHZlbmRvciBpZCBhcyBhIG51bGwKKyAqIHRlcm1pbmF0ZWQgc3RyaW5nCisgKgorICogZXhhbXBsZXM6ICJHZW51aW5lSW50ZWwiICJBdXRoZW50aWNBTUQiICJWTXdhcmVWTXdhcmUiCisgKgorICogfHZlbmRvcl9pZF9sZW58IC0gbXVzdCBiZSBhdCBsZWFzdCAxMyBieXRlcworICovCit2b2lkIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWQoY2hhciogdmVuZG9yX2lkLCBzaXplX3QgdmVuZG9yX2lkX2xlbik7CisKKy8vIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92bWhvc3RfdmVuZG9yX2lkOiBnZXQgdGhlIHZlbmRvciBJRCBmb3IgdGhlCisvLyBjdXJyZW50bHkgcnVubmluZyBoeXBlcnZpc29yLiBJZiB0aGVyZSdzIG5vIGh5cGVydmlzb3IsIGVtcHR5IHN0cmluZyBpcworLy8gcmV0dXJuZWQKKy8vCisvLyBleGFtcGxlczogIlZNV2FyZVZNV2FyZSIgIktWTUtWTUtWTSIgIlZCb3hWQm94VkJveCIsICIiCisvLworLy8gfHZlbmRvcl9pZHwgLSBhbiBvdXRwdXQgYnVmZmVyLCBpcyBhbHdheXMgbnVsbC10ZXJtaW5hdGVkIGFmdGVyIHRoZSBjYWxsCisvLyB8dmVuZG9yX2lkX2xlbnwgLSBtdXN0IGJlIGF0IGxlYXN0IDEzIGJ5dGVzCisvLwordm9pZCBhbmRyb2lkX2dldF94ODZfY3B1aWRfdm1ob3N0X3ZlbmRvcl9pZChjaGFyKiB2ZW5kb3JfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2ZW5kb3JfaWRfbGVuKTsKKworLy8gUG9zc2libGUgQ1BVIHZlbmRvciBJRCB0eXBlcworLy8gU29tZSBWTXMgcmVwb3J0IHRoZWlyIG93biBDUFUgdmVuZG9yIElEIGluc3RlYWQgb2YgdGhlIHJlYWwgaGFyZHdhcmUsCisvLyBpbiB0aGF0IGNhc2UgVkVORE9SX0lEX1ZNIGlzIHVzZWQKK3R5cGVkZWYgZW51bSB7CisgICAgVkVORE9SX0lEX0FNRCwKKyAgICBWRU5ET1JfSURfSU5URUwsCisgICAgVkVORE9SX0lEX1ZJQSwKKyAgICBWRU5ET1JfSURfVk0sCisgICAgVkVORE9SX0lEX09USEVSLAorfSBDcHVWZW5kb3JJZFR5cGU7CisKKy8vIFBvc3NpYmxlIFZNIFZlbmRvciBJRHMKKy8vIFNwZWNpYWwgdmFsdWVzOgorLy8gICBWRU5ET1JfVk1fTk9UVk0gLSBub3QgYSBWTSwgdGhlIHN0cmluZyBpcyBrbm93biB0byBpZGVudGlmeSBhIHJlYWwgQ1BVCisvLyAgIFZFTkRPUl9WTV9PVEhFUiAtIGhhdmUgbm8gaWRlYSBvZiB0aGUgbWVhbmluZyBvZiB0aGUgdmVuZG9yIElEIHN0cmluZwordHlwZWRlZiBlbnVtIHsKKyAgICBWRU5ET1JfVk1fVk1XQVJFLAorICAgIFZFTkRPUl9WTV9WQk9YLAorICAgIFZFTkRPUl9WTV9IWVBFUlYsCisgICAgVkVORE9SX1ZNX0tWTSwKKyAgICBWRU5ET1JfVk1fTk9UVk0sCisgICAgVkVORE9SX1ZNX09USEVSCit9IENwdVZlbmRvclZtVHlwZTsKKworLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB2ZW5kb3IgSUQKK0NwdVZlbmRvcklkVHlwZSBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkX3R5cGUoY29uc3QgY2hhciogdmVuZG9yX2lkKTsKK0NwdVZlbmRvclZtVHlwZSBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX3ZtaG9zdF90eXBlKGNvbnN0IGNoYXIqIHZlbmRvcl9pZCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfdmVuZG9yX2lkX3ZtaG9zdDogaWRlbnRpZnkga25vd24gVk0gdmVuZG9yIGlkcyBieSB0aGUKKyAqIENQVSB2ZW5kb3JJRCAtIGRvIG5vdCBjb25mdXNlIHdpdGggVk1Ib3N0IHZlbmRvcklECisgKgorICogUmV0dXJucyAxIGlmIHx2ZW5kb3JfaWR8IHJldHJpZXZlZCBmcm9tIGNwdWlkIGlzIG9uZSBvZiBmb3VyIGtub3duIFZNCisgKiBob3N0IHZlbmRvciBpZCBzdHJpbmdzLiBUaGlzIGlzIGp1c3QgYW5vdGhlciB3YXkgb2Ygd3JpdGluZyB0aGlzOgorICogIGJvb2wgcmVzID0gYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF90eXBlKHZlbmRvcl9pZCkgPT0gVkVORE9SX0lEX1ZNOworICovCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfaXNfdm1ob3N0KGNvbnN0IGNoYXIqIHZlbmRvcl9pZCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfdm14X3N1cHBvcnQ6IHJldHVybnMgMSBpZiB0aGUgQ1BVIHN1cHBvcnRzIEludGVsCisgKiBWTS14IGZlYXR1cmVzLCByZXR1cm5zIDAgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZteF9zdXBwb3J0KCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfc3ZtX3N1cHBvcnQ6IHJldHVybnMgMSBpZiB0aGUgQ1BVIHN1cHBvcnRzIEFNRAorICogU1ZNIGZlYXR1cmVzLCByZXR1cm5zIDAgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3N2bV9zdXBwb3J0KCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfbnhfc3VwcG9ydDogcmV0dXJucyAxIGlmIHRoZSBDUFUgc3VwcG9ydHMgSW50ZWwKKyAqIE5YIChubyBleGVjdXRlKSBmZWF0dXJlcywgcmV0dXJucyAwIG90aGVyd2lzZQorICovCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9ueF9zdXBwb3J0KCk7CisKKy8qCisgKiBhbmRyb2lkX2dldF94ODZfY3B1aWRfaXNfdmNwdTogcmV0dXJucyAxIGlmIHRoZSBDUFUgaXMgYSBydW5uaW5nIHVuZGVyCisgKiBhIEh5cGVydmlzb3IKKyAqLworYm9vbCBhbmRyb2lkX2dldF94ODZfY3B1aWRfaXNfdmNwdSgpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIENQVSBzdXBwb3J0cyBBTUQ2NCBpbnN0cnVjdGlvbiBzZXQuCitib29sIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9pc182NGJpdF9jYXBhYmxlKCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3g4Nl9jcHVpZF91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdXRpbHMveDg2X2NwdWlkX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU1MjY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3V0aWxzL3g4Nl9jcHVpZF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy94ODZfY3B1aWQuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBBcHBsaWNhYmxlIHdoZW4gY2FsbGluZyBDUFVJRCB3aXRoIEVBWD0weDgwMDAwMDAxCisvLyBMb25nIG1vZGUsIHdoaWNoIGlzIG9uZSBvZiB0aGUgZmVhdHVyZXMgdGhhdCBkaXN0aW5ndWlzaCB4ODZfNjQgZnJvbSB4ODYKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBDUFVJRF9FRFhfTE0gPSAxIDw8IDI5OworCisvLyBQcmludHMgdG8gc3Rkb3V0IGEgbGluZSBzdGF0aW5nIHdoZXRoZXIgYSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBvciBub3QuCitzdGF0aWMgdm9pZCBQcmludENwdUZlYXR1cmVUZXN0UmVzdWx0KGNvbnN0IGNoYXIgKmZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1cHBvcnRlZCkgeworICAgIHByaW50ZigiJXMgLSVzIHN1cHBvcnRlZFxuIiwgZmVhdHVyZSwgc3VwcG9ydGVkID8gIiIgOiAiIG5vdCIpOworfQorCisvLyBOb3QgcmVhbGx5IGEgdGVzdC4gUHJpbnRzIGEgc3VtbWFyeSBvZiB0aGUgaG9zdCBDUFUncyBBQkkgY29tcGF0aWJpbGl0eSBmb3IKKy8vIG1hbnVhbCB2ZXJpZmljYXRpb24uCitURVNUKHg4Nl9jcHVpZCwgRGVmYXVsdCkgeworICAgIHVpbnQzMl90IGVjeCA9IDAsIGVkeCA9IDA7CisKKyAgICAvLyBDYWxsIENQVUlEIHdpdGggRUFYPTEgYW5kIEVDWD0wIHRvIGdldCBDUFUgZmVhdHVyZSBiaXRzLgorICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgxLCAwLCBOVUxMLCBOVUxMLCAmZWN4LCAmZWR4KTsKKworICAgIGlmICghZWN4ICYmICFlZHgpIHsKKyAgICAgICAgLy8gQm90aCBvdXRwdXQgdmFyaWFibGVzIGFyZSB1bmNoYW5nZWQsIHdoaWNoIHByb2JhYmx5IG1lYW5zIHRoYXQKKyAgICAgICAgLy8gYW5kcm9pZF9nZXRfeDg2X2NwdWlkKC4uKSB3YXMgY29tcGlsZWQgdG8gYSBuby1vcC4KKyAgICAgICAgcHJpbnRmKCJIb3N0IENQVSBhcmNoaXRlY3R1cmUgaXMgbmVpdGhlciB4ODYgbm9yIHg4Nl82NCFcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVEWCByZXR1cm5lZCBieSBDUFVJRCAoRUFYPTEpIHNob3VsZCBuZXZlciBiZSB6ZXJvLgorICAgICAgICBFWFBFQ1RfVFJVRShlZHgpOworCisgICAgICAgIHVpbnQzMl90IGVkeDIgPSAwOworCisgICAgICAgIC8vIENhbGwgQ1BVSUQgd2l0aCBFQVg9MHg4MDAwMDAwMSBhbmQgRUNYPTAgdG8gZ2V0IGV4dGVuZGVkIENQVSBmZWF0dXJlCisgICAgICAgIC8vIGJpdHMuCisgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZCgweDgwMDAwMDAxLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCAmZWR4Mik7CisKKyAgICAgICAgLy8gTG9uZyBtb2RlIGlzIGEgZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZSBvZiB4ODZfNjQuCisgICAgICAgIGJvb2wgaXNYODZfNjQgPSBlZHgyICYgQ1BVSURfRURYX0xNOworICAgICAgICBwcmludGYoIkhvc3QgQ1BVIGFyY2hpdGVjdHVyZSBpcyAlcy5cbiIsIGlzWDg2XzY0ID8gIng4Nl82NCIgOiAieDg2Iik7CisKKyAgICAgICAgcHJpbnRmKCJBQkkgY29tcGF0aWJpbGl0eTpcbiIpOworCisgICAgICAgIC8vIFNlZSBUYWJsZSAxIGluIHNlY3Rpb24gJ0FCSSBNYW5hZ2VtZW50JyBvZiBOREsgUHJvZ3JhbW1lcidzIEd1aWRlCisgICAgICAgIC8vIChBbmRyb2lkIE5ESyByMTBjKSBmb3IgdGhlIGZlYXR1cmVzIHJlcXVpcmVkIGJ5IHg4Ni94ODZfNjQgQUJJcy4KKyAgICAgICAgUHJpbnRDcHVGZWF0dXJlVGVzdFJlc3VsdCgiTU1YIiwgZWR4ICYgQ1BVSURfRURYX01NWCk7CisgICAgICAgIFByaW50Q3B1RmVhdHVyZVRlc3RSZXN1bHQoIlNTRSIsIGVkeCAmIENQVUlEX0VEWF9TU0UpOworICAgICAgICBQcmludENwdUZlYXR1cmVUZXN0UmVzdWx0KCJTU0UyIiwgZWR4ICYgQ1BVSURfRURYX1NTRTIpOworICAgICAgICBQcmludENwdUZlYXR1cmVUZXN0UmVzdWx0KCJTU0UzIiwgZWN4ICYgQ1BVSURfRUNYX1NTRTMpOworICAgICAgICBQcmludENwdUZlYXR1cmVUZXN0UmVzdWx0KCJTU1NFMyIsIGVjeCAmIENQVUlEX0VDWF9TU1NFMyk7CisgICAgICAgIGlmIChpc1g4Nl82NCkgeworICAgICAgICAgICAgUHJpbnRDcHVGZWF0dXJlVGVzdFJlc3VsdCgiU1NFNC4xIiwgZWN4ICYgQ1BVSURfRUNYX1NTRTQxKTsKKyAgICAgICAgICAgIFByaW50Q3B1RmVhdHVyZVRlc3RSZXN1bHQoIlNTRTQuMiIsIGVjeCAmIENQVUlEX0VDWF9TU0U0Mik7CisgICAgICAgICAgICBQcmludENwdUZlYXR1cmVUZXN0UmVzdWx0KCJQT1BDTlQiLCBlY3ggJiBDUFVJRF9FQ1hfUE9QQ05UKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVCh4ODZfY3B1aWQsIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfaXNfdm1ob3N0KSB7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF9pc192bWhvc3QoIktWTUtWTUtWTSIpKTsKKyAgICBFWFBFQ1RfVFJVRShhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX2lkX2lzX3ZtaG9zdCgiTWljcm9zb2Z0IEh2IikpOworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfaXNfdm1ob3N0KCJWTXdhcmVWTXdhcmUiKSk7CisgICAgRVhQRUNUX1RSVUUoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF9pc192bWhvc3QoIlhlblZNTVhlblZNTSIpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF9pc192bWhvc3QoIkdlbnVpbmVJbnRlbCIpKTsKK30KKworVEVTVCh4ODZfY3B1aWQsIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92bXhfc3VwcG9ydCkgeworICAgIC8vIFRoZXNlIG1pZ2h0IGZhaWwgaWYgeW91IGhhdmUgYW4gQU1ELCBBdG9tIHByb2Nlc3NvciBvciBhbiBpbmNyZWRpYmx5CisgICAgLy8gb2xkIEludGVsIHByb2Nlc3NvcgorICAgIEVYUEVDVF9MRSgweDgwMDAwMDAxLCBhbmRyb2lkX2dldF94ODZfY3B1aWRfZXh0ZW5kZWRfZnVuY3Rpb25fbWF4KCkpOworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92bXhfc3VwcG9ydCgpIHx8CisgICAgICAgICAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3N2bV9zdXBwb3J0KCkpOworICAgIEVYUEVDVF9UUlVFKGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF9ueF9zdXBwb3J0KCkpOworfQorCitURVNUKHg4Nl9jcHVpZCwgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl9pZF90eXBlKSB7CisgICAgRVhQRUNUX0VRKFZFTkRPUl9JRF9BTUQsCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfdHlwZSgiQXV0aGVudGljQU1EIikpOworICAgIEVYUEVDVF9FUShWRU5ET1JfSURfSU5URUwsCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfdHlwZSgiR2VudWluZUludGVsIikpOworICAgIEVYUEVDVF9FUShWRU5ET1JfSURfVk0sCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfdHlwZSgiS1ZNS1ZNS1ZNIikpOworICAgIEVYUEVDVF9FUShWRU5ET1JfSURfT1RIRVIsCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3JfaWRfdHlwZSgiYW55IG90aGVyIHN0cmluZyIpKTsKK30KKworVEVTVCh4ODZfY3B1aWQsIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3Jfdm1ob3N0X3R5cGUpIHsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1ZNX1ZNV0FSRSwKKyAgICAgICAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl92bWhvc3RfdHlwZSgiVk1XYXJlVk1XYXJlIikpOworICAgIEVYUEVDVF9FUShWRU5ET1JfVk1fSFlQRVJWLAorICAgICAgICAgICAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX3ZtaG9zdF90eXBlKCJNaWNyb3NvZnQgSHYiKSk7CisgICAgRVhQRUNUX0VRKFZFTkRPUl9WTV9LVk0sCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3Jfdm1ob3N0X3R5cGUoIktWTUtWTUtWTSIpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1ZNX1ZCT1gsCisgICAgICAgICAgICAgIGFuZHJvaWRfZ2V0X3g4Nl9jcHVpZF92ZW5kb3Jfdm1ob3N0X3R5cGUoIlZCb3hWQm94VkJveCIpKTsKKyAgICBFWFBFQ1RfRVEoVkVORE9SX1ZNX05PVFZNLAorICAgICAgICAgICAgICBhbmRyb2lkX2dldF94ODZfY3B1aWRfdmVuZG9yX3ZtaG9zdF90eXBlKCIiKSk7CisgICAgRVhQRUNUX0VRKFZFTkRPUl9WTV9PVEhFUiwKKyAgICAgICAgICAgICAgYW5kcm9pZF9nZXRfeDg2X2NwdWlkX3ZlbmRvcl92bWhvc3RfdHlwZSgiYmxhaCIpKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvdmVyc2lvbi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3ZlcnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU5MmQxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3ZlcnNpb24uaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmluZ2lmeS5oIgorCisvLyBEZWZpbmUgdGhlIGNvbW1vbiBlbXVsYXRvciB2ZXJzaW9uIHN0cmluZ3MKKyNpZmRlZiBBTkRST0lEX1NES19UT09MU19SRVZJU0lPTgorIyAgZGVmaW5lICBFTVVMQVRPUl9WRVJTSU9OX1NUUklOR19TSE9SVCAgU1RSSU5HSUZZKEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OKQorIyAgZGVmaW5lICBFTVVMQVRPUl9WRVJTSU9OX1NUUklORyAgICAgICAgRU1VTEFUT1JfVkVSU0lPTl9TVFJJTkdfU0hPUlQgIi4wIgorI2Vsc2UKKyMgIGRlZmluZSAgRU1VTEFUT1JfVkVSU0lPTl9TVFJJTkdfU0hPUlQgICJzdGFuZGFsb25lIgorIyAgZGVmaW5lICBFTVVMQVRPUl9WRVJTSU9OX1NUUklORyAgICAgICAgRU1VTEFUT1JfVkVSU0lPTl9TVFJJTkdfU0hPUlQKKyNlbmRpZgorCisvLyBEZWZpbmUgdGhlIGVtdWxhdG9yIGJ1aWxkIG51bWJlciBzdHJpbmcKKyNpZmRlZiBBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIKKyMgIGRlZmluZSBFTVVMQVRPUl9CVUlMRF9TVFJJTkcgU1RSSU5HSUZZKEFORFJPSURfU0RLX1RPT0xTX0JVSUxEX05VTUJFUikKKyNlbHNlCisjICBkZWZpbmUgRU1VTEFUT1JfQlVJTERfU1RSSU5HICIwIgorI2VuZGlmCisKKy8vIEZ1bGwgdmVyc2lvbiwgd2l0aCBidWlsZCBzdWZmaXgKKyNkZWZpbmUgRU1VTEFUT1JfRlVMTF9WRVJTSU9OX1NUUklORyBcCisgICAgRU1VTEFUT1JfVkVSU0lPTl9TVFJJTkdfU0hPUlQgIi0iIEVNVUxBVE9SX0JVSUxEX1NUUklORwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvUGFpclVwV2VhclBob25lLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4MzFhNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5jcHAKQEAgLTAsMCArMSw2NTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5oIgorCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNSZWFkZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNTdGF0dXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21pc2MvU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRFcnJvcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgIERQUklOVCguLi4pICBkbyB7ICBpZiAoVkVSQk9TRV9DSEVDSyhhZGIpKSBkcHJpbnRuKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHdlYXIgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpiYXNlOworCit0eXBlZGVmIFNjb3BlZFB0cjxMb29wZXI6OkZkV2F0Y2g+IEZkV2F0Y2g7Cit0eXBlZGVmIFNjb3BlZFB0cjxMb29wZXI6OlRpbWVyPiBUaW1lcjsKKworY2xhc3MgUGFpclVwV2VhclBob25lSW1wbCB7CitwdWJsaWM6CisgICAgUGFpclVwV2VhclBob25lSW1wbChMb29wZXIqIGxvb3BlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGJIb3N0UG9ydCk7CisKKyAgICB+UGFpclVwV2VhclBob25lSW1wbCgpOworCisgICAgdm9pZCB3cml0ZUFkYlNlcnZlclNvY2tldCgpOworICAgIHZvaWQgcmVhZEFkYlNlcnZlclNvY2tldCgpOworCisgICAgdm9pZCB3cml0ZUVtdWxhdG9yQ29uc29sZVNvY2tldCgpOworICAgIHZvaWQgcmVhZEVtdWxhdG9yQ29uc29sZVNvY2tldCgpOworCisgICAgYm9vbCBpc0RvbmUoKSBjb25zdDsKKyAgICB2b2lkIGNsZWFuVXAoKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdHJRdWV1ZTsKKyAgICBlbnVtIENvbW11bmljYXRpb25TdGF0ZSB7CisKKyAgICAgICAgIFBBSVJVUF9FUlJPUiA9IDAsCisKKyAgICAgICAgIC8vIHdoZW4gYXNrIGFkYiBmb3IgZGV2aWNlIHByb3BlcnR5LCBuZWVkIHRvIGZpcnN0IGFzayBhZGIgdG8gc2V0dXAgdHJhbnNmZXIsCisgICAgICAgICAvLyB3YWl0IGZvciAiT0tBWSIgZnJvbSBhZGIsIHRoZW4gc2VuZCB0aGUgcXVlcnkgY29tbWFuZCh3aGljaCBpcyB0cmFuc2ZlcnJlZAorICAgICAgICAgLy8gYnkgYWRiIHRvIHRoZSBkZXZpY2UpLCBhbmQgcmVhZCByZXBseSBmcm9tIGFkYiB1bnRpbCBhZGIgZGlzY29ubmVjdAorCisgICAgICAgICAvLyBnZXQgcHJvZHVjdCBuYW1lIHRvIGRpc3Rpbmd1aXNoIHdlYXIgZnJvbSBwaG9uZQorICAgICAgICAgVE9fR0VUX1BST0RVQ1RfTkFNRV9JTklUX1hGRVIsCisgICAgICAgICBUT19HRVRfUFJPRFVDVF9OQU1FX1dBSVRfT0tBWSwKKyAgICAgICAgIFRPX0dFVF9QUk9EVUNUX05BTUVfU0VORF9DTUQsCisgICAgICAgICBUT19HRVRfUFJPRFVDVF9OQU1FX1JFQURfUkVQTFksCisKKyAgICAgICAgIC8vIGZpbmQgb3V0IGlmIHRoZSBwaG9uZSBoYXMgd2VhcmFibGUgYXBwLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgY29tbXVuaWNhdGlvbgorICAgICAgICAgLy8gd2l0aCB3ZWFyCisgICAgICAgICBUT19HRVRfV0VBUkFCTEVfQVBQX0lOSVRfWEZFUiwKKyAgICAgICAgIFRPX0dFVF9XRUFSQUJMRV9BUFBfV0FJVF9PS0FZLAorICAgICAgICAgVE9fR0VUX1dFQVJBQkxFX0FQUF9TRU5EX0NNRCwKKyAgICAgICAgIFRPX0dFVF9XRUFSQUJMRV9BUFBfUkVBRF9SRVBMWSwKKworICAgICAgICAgLy8gcGVyZm9ybSBpcCBmb3J3YXJkaW5nIG9uIHJlYWwgZGV2aWNlCisgICAgICAgICAvLyAiaG9zdC1zZXJpYWw6cGhvbmUtc2VyaWFsLW51bWJlcjpmb3J3YXJkOnRjcDo1NjAxOzU2MDEiCisgICAgICAgICBUT19GT1JXQVJEX0lQX1NFTkRfQ01ELAorICAgICAgICAgVE9fRk9SV0FSRF9JUF9XQUlUX09LQVksCisKKyAgICAgICAgIC8vIHBlcmZvcm0gaXAgcmVkaXJlY3Rpb24gb24gZW11bGF0b3IKKyAgICAgICAgIC8vIHRoZSBhYm92ZSBjb21tYW5kIGRvZXMgbm90IHdvcmsgb24gZW11bGF0b3IsIHNvIHdlIGhhdmUgdG8gY29ubmVjdCB0byB0aGUgZW11bGF0b3IKKyAgICAgICAgIC8vIGNvbnNvbGUgYW5kIGlzc3VlIGNvbW1hbmQgInJlZGlyIGFkZCIKKyAgICAgICAgIFRPX1JFQURfR1JFRVRJTkdTX0ZST01fQ09OU09MRSwKKyAgICAgICAgIFRPX1NFTkRfUkVESVJfQ01EX1RPX0NPTlNPTEUsCisKKyAgICAgICAgIFBBSVJVUF9TVUNDRVNTLAorCisgICAgICAgICBQQUlSVVBfQUxSRUFEWV9DTEVBTkVEVVAKKyAgICB9OworICAgIGVudW0gTWVzc2FnZVR5cGUgeworICAgICAgICAgVFJBTlNGRVIgPSAxLAorICAgICAgICAgRk9SV0FSRElQLAorICAgICAgICAgUFJPUEVSVFksCisgICAgICAgICBXRUFSQUJMRV9BUFBfUEtHCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFJFQURfQlVGRkVSX1NJWkUgID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3QgaW50IFdSSVRFX0JVRkZFUl9TSVpFID0gMTAyNDsKKworICAgIExvb3BlciogbUxvb3BlcjsKKworICAgIC8vIG1lbWJlciByZWxhdGVkIHRvIGFkYiBob3N0CisgICAgaW50IG1BZGJIb3N0UG9ydDsKKyAgICBGZFdhdGNoIG1BZGJXYXRjaDsKKworICAgIC8vIG1lbWJlciByZWxhdGVkIHRvIGVtdWxhdG9yIGNvbnNvbGUKKyAgICBpbnQgbUNvbnNvbGVQb3J0OworICAgIEZkV2F0Y2ggbUNvbnNvbGVXYXRjaDsKKworICAgIC8vIGRldmljZSBjYXRlZ29yaWVzCisgICAgc3RkOjpzdHJpbmcgbURldmljZUluUHJvYmluZzsKKyAgICBTdHJRdWV1ZSBtVW5wcm9iZWREZXZpY2VzOworICAgIFN0clF1ZXVlIG1XZWFyRGV2aWNlczsKKyAgICBTdHJRdWV1ZSBtUGhvbmVEZXZpY2VzOworCisgICAgQ29tbXVuaWNhdGlvblN0YXRlIG1TdGF0ZTsKKworICAgIC8vIGFzeW5jaHJvbm91cyByZWFkZXIgYW5kIHdyaXRlcgorICAgIEFzeW5jUmVhZGVyIG1Bc3luY1JlYWRlcjsKKyAgICBBc3luY1dyaXRlciBtQXN5bmNXcml0ZXI7CisgICAgY2hhciogbVJlYWRCdWZmZXI7CisgICAgY2hhciogbVdyaXRlQnVmZmVyOworICAgIHN0ZDo6c3RyaW5nIG1SZXBseTsKKworICAgIC8vIHdoZW5ldmVyIGRldmljZSBsaXN0IGNoYW5nZXMsIGNhbGwgdGhlIGZvbGxvd2luZworICAgIHZvaWQgdXBkYXRlRGV2aWNlcyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZXMpOworICAgIHZvaWQgc3RhcnRQcm9iZU5leHREZXZpY2UoKTsKKworICAgIC8vIHNvY2tldCBjb25uZWN0aW9uIG1ldGhvZHMKKyAgICBib29sIG9wZW5Db25uZWN0aW9uKGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgRmRXYXRjaCogd2F0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OkZkV2F0Y2g6OkNhbGxiYWNrIGNhbGxiYWNrKTsKKworICAgIHZvaWQgY2xvc2VDb25uZWN0aW9uKEZkV2F0Y2gqIHdhdGNoKTsKKyAgICB2b2lkIG9wZW5BZGJDb25uZWN0aW9uKCk7CisgICAgdm9pZCBvcGVuQ29uc29sZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIHJlYWQgYW5kIHdyaXRlIG1vZGUgaGFuZGxpbmcgbWV0aG9kcworICAgIHZvaWQgc3dpdGNoVG9SZWFkKEZkV2F0Y2gqIHdhdGNoKSB7CisgICAgICAgICgqd2F0Y2gpLT53YW50UmVhZCgpOworICAgICAgICAoKndhdGNoKS0+ZG9udFdhbnRXcml0ZSgpOworICAgIH0KKworICAgIHZvaWQgc3dpdGNoVG9Xcml0ZShGZFdhdGNoKiB3YXRjaCkgeworICAgICAgICAoKndhdGNoKS0+d2FudFdyaXRlKCk7CisgICAgICAgICgqd2F0Y2gpLT5kb250V2FudFJlYWQoKTsKKyAgICB9CisKKyAgICAvLyBjb25uZWN0IHdlYXIgdG8gcGhvbmUgYnkgc2V0dXBpbmcgcG9ydCBmb3J3YXJkaW5nIG9uIGVtdWxhdG9yIG9yIHJlYWwgZGV2aWNlCisgICAgYm9vbCBjaGVja0ZvcldlYXJEZXZpY2UoKTsKKyAgICBib29sIGNoZWNrRm9yQ29tcGF0aWJsZVBob25lKCk7CisgICAgdm9pZCBzdGFydENvbm5lY3RXZWFyQW5kUGhvbmUoKTsKKworICAgIGJvb2wgc3RhcnRSZWFkQ29uc29sZSgpOworCisgICAgLy8gYWRiIGFzeW5jaHJvbm91cyByZWFkL3dyaXRlIG1ldGhvZHM6IGFsbCByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCisgICAgLy8gZmFsc2UgaWYgbmVlZCB0byB0cnkgYWdhaW4gb3Igb24gZXJyb3IuIFdoZW4gZXJyb3IgaGFwcGVucywKKyAgICAvLyB3aWxsIGNhbGwgc3RhcnRQcm9iZU5leHREZXZpY2UKKyAgICBib29sIHN0YXJ0V3JpdGVDb21tYW5kVG9BZGIoaW50IHF1ZXJ5VHlwZSwgY29uc3QgY2hhciogbWVzc2FnZSk7CisgICAgYm9vbCBjb21wbGV0ZVdyaXRlQ29tbWFuZFRvQWRiKCk7CisgICAgYm9vbCBzdGFydFJlYWRIZWFkZXJGcm9tQWRiKCk7CisgICAgYm9vbCBjb21wbGV0ZVJlYWRIZWFkZXJGcm9tQWRiKCk7CisgICAgYm9vbCBjb21wbGV0ZVJlYWRBbGxEYXRhRnJvbUFkYigpOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIga1dlYXJhYmxlQXBwTmFtZVtdID0gImNvbS5nb29nbGUuYW5kcm9pZC53ZWFyYWJsZSI7CisKKy8vIGNhbGxiYWNrIHRoYXQgdGFsa3MgdG8gYWRiIHNlcnZlciBvbiB0aGUgaG9zdCBjb21wdXRlcgorc3RhdGljIHZvaWQgX29uX2FkYl9zZXJ2ZXJfc29ja2V0X2ZkKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBQYWlyVXBXZWFyUGhvbmVJbXBsICogcGFpcnVwID0gc3RhdGljX2Nhc3Q8UGFpclVwV2VhclBob25lSW1wbCo+KG9wYXF1ZSk7CisgICAgaWYgKCFwYWlydXApIHJldHVybjsKKworICAgIGlmIChldmVudHMgJiBMb29wZXI6OkZkV2F0Y2g6OmtFdmVudFJlYWQpIHsKKyAgICAgICAgcGFpcnVwLT5yZWFkQWRiU2VydmVyU29ja2V0KCk7CisgICAgfSBlbHNlIGlmIChldmVudHMgJiBMb29wZXI6OkZkV2F0Y2g6OmtFdmVudFdyaXRlKSB7CisgICAgICAgIHBhaXJ1cC0+d3JpdGVBZGJTZXJ2ZXJTb2NrZXQoKTsKKyAgICB9CisgICAgaWYgKHBhaXJ1cC0+aXNEb25lKCkpIHsKKyAgICAgICAgcGFpcnVwLT5jbGVhblVwKCk7CisgICAgfQorfQorCisvLyBjYWxsYmFjayB0aGF0IHRhbGtzIHRvIGVtdWxhdG9yIGNvbnNvbGUKK3N0YXRpYyB2b2lkIF9vbl9lbXVsYXRvcl9jb25zb2xlX3NvY2tldF9mZCh2b2lkKiBvcGFxdWUsIGludCBmZCwgdW5zaWduZWQgZXZlbnRzKSB7CisgICAgUGFpclVwV2VhclBob25lSW1wbCAqIHBhaXJ1cCA9IHN0YXRpY19jYXN0PFBhaXJVcFdlYXJQaG9uZUltcGwqPihvcGFxdWUpOworICAgIGlmICghcGFpcnVwKSByZXR1cm47CisKKyAgICBpZiAoZXZlbnRzICYgTG9vcGVyOjpGZFdhdGNoOjprRXZlbnRSZWFkKSB7CisgICAgICAgIHBhaXJ1cC0+cmVhZEVtdWxhdG9yQ29uc29sZVNvY2tldCgpOworICAgIH0gZWxzZSBpZiAoZXZlbnRzICYgTG9vcGVyOjpGZFdhdGNoOjprRXZlbnRXcml0ZSkgeworICAgICAgICBwYWlydXAtPndyaXRlRW11bGF0b3JDb25zb2xlU29ja2V0KCk7CisgICAgfQorICAgIGlmIChwYWlydXAtPmlzRG9uZSgpKSB7CisgICAgICAgIHBhaXJ1cC0+Y2xlYW5VcCgpOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLSBjYWxsYmFja3MgZm9yIElPIHdpdGggYWRiIHNlcnZlciBhbmQgZW11bGF0b3IgY29uc29sZQordm9pZCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpyZWFkQWRiU2VydmVyU29ja2V0KCkgeworCisgICAgc3dpdGNoKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFRPX0dFVF9QUk9EVUNUX05BTUVfV0FJVF9PS0FZOgorICAgICAgICAgICAgaWYgKCFjb21wbGV0ZVJlYWRIZWFkZXJGcm9tQWRiKCkpIHJldHVybjsKKyAgICAgICAgICAgIGlmICghc3RhcnRXcml0ZUNvbW1hbmRUb0FkYihQUk9QRVJUWSwgInJvLnByb2R1Y3QubmFtZSIpKSByZXR1cm47CisgICAgICAgICAgICBtU3RhdGUgPSBUT19HRVRfUFJPRFVDVF9OQU1FX1NFTkRfQ01EOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgVE9fR0VUX1BST0RVQ1RfTkFNRV9SRUFEX1JFUExZOgorICAgICAgICAgICAgaWYgKCFjb21wbGV0ZVJlYWRBbGxEYXRhRnJvbUFkYigpKSByZXR1cm47CisgICAgICAgICAgICBpZiAoY2hlY2tGb3JXZWFyRGV2aWNlKCkpIHsKKyAgICAgICAgICAgICAgICBzdGFydENvbm5lY3RXZWFyQW5kUGhvbmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN0YXJ0V3JpdGVDb21tYW5kVG9BZGIoVFJBTlNGRVIsIG1EZXZpY2VJblByb2JpbmcuY19zdHIoKSkpIHJldHVybjsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0dFVF9XRUFSQUJMRV9BUFBfSU5JVF9YRkVSOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgVE9fR0VUX1dFQVJBQkxFX0FQUF9XQUlUX09LQVk6CisgICAgICAgICAgICBpZiAoIWNvbXBsZXRlUmVhZEhlYWRlckZyb21BZGIoKSkgcmV0dXJuOworICAgICAgICAgICAgaWYgKCFzdGFydFdyaXRlQ29tbWFuZFRvQWRiKFdFQVJBQkxFX0FQUF9QS0csIGtXZWFyYWJsZUFwcE5hbWUpKSByZXR1cm47CisgICAgICAgICAgICBtU3RhdGUgPSBUT19HRVRfV0VBUkFCTEVfQVBQX1NFTkRfQ01EOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgVE9fR0VUX1dFQVJBQkxFX0FQUF9SRUFEX1JFUExZOgorICAgICAgICAgICAgaWYgKCFjb21wbGV0ZVJlYWRBbGxEYXRhRnJvbUFkYigpKSByZXR1cm47CisgICAgICAgICAgICBpZiAoY2hlY2tGb3JDb21wYXRpYmxlUGhvbmUoKSkgeworICAgICAgICAgICAgICAgIHN0YXJ0Q29ubmVjdFdlYXJBbmRQaG9uZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBUT19GT1JXQVJEX0lQX1dBSVRfT0tBWToKKyAgICAgICAgICAgIGlmICghY29tcGxldGVSZWFkSGVhZGVyRnJvbUFkYigpKSByZXR1cm47CisgICAgICAgICAgICBtU3RhdGUgPSBQQUlSVVBfU1VDQ0VTUzsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhcnRQcm9iZU5leHREZXZpY2UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgUGFpclVwV2VhclBob25lSW1wbDo6d3JpdGVBZGJTZXJ2ZXJTb2NrZXQoKSB7CisKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIFRPX0dFVF9QUk9EVUNUX05BTUVfSU5JVF9YRkVSOgorICAgICAgICAgICAgaWYgKCFjb21wbGV0ZVdyaXRlQ29tbWFuZFRvQWRiKCkpIHJldHVybjsKKyAgICAgICAgICAgIGlmICghc3RhcnRSZWFkSGVhZGVyRnJvbUFkYigpKSByZXR1cm47CisgICAgICAgICAgICBtU3RhdGUgPSBUT19HRVRfUFJPRFVDVF9OQU1FX1dBSVRfT0tBWTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYXNlIFRPX0dFVF9QUk9EVUNUX05BTUVfU0VORF9DTUQ6CisgICAgICAgICAgICBpZiAoIWNvbXBsZXRlV3JpdGVDb21tYW5kVG9BZGIoKSkgcmV0dXJuOworICAgICAgICAgICAgbVN0YXRlID0gVE9fR0VUX1BST0RVQ1RfTkFNRV9SRUFEX1JFUExZOworICAgICAgICAgICAgbVJlcGx5LmNsZWFyKCk7CisgICAgICAgICAgICBzd2l0Y2hUb1JlYWQoJm1BZGJXYXRjaCk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBUT19HRVRfV0VBUkFCTEVfQVBQX0lOSVRfWEZFUjoKKyAgICAgICAgICAgIGlmICghY29tcGxldGVXcml0ZUNvbW1hbmRUb0FkYigpKSByZXR1cm47CisgICAgICAgICAgICBpZiAoIXN0YXJ0UmVhZEhlYWRlckZyb21BZGIoKSkgcmV0dXJuOworICAgICAgICAgICAgbVN0YXRlID0gVE9fR0VUX1dFQVJBQkxFX0FQUF9XQUlUX09LQVk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBUT19HRVRfV0VBUkFCTEVfQVBQX1NFTkRfQ01EOgorICAgICAgICAgICAgaWYgKCFjb21wbGV0ZVdyaXRlQ29tbWFuZFRvQWRiKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0dFVF9XRUFSQUJMRV9BUFBfUkVBRF9SRVBMWTsKKyAgICAgICAgICAgIG1SZXBseS5jbGVhcigpOworICAgICAgICAgICAgc3dpdGNoVG9SZWFkKCZtQWRiV2F0Y2gpOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgVE9fRk9SV0FSRF9JUF9TRU5EX0NNRDoKKyAgICAgICAgICAgIGlmICghY29tcGxldGVXcml0ZUNvbW1hbmRUb0FkYigpKSByZXR1cm47CisgICAgICAgICAgICBpZiAoIXN0YXJ0UmVhZEhlYWRlckZyb21BZGIoKSkgcmV0dXJuOworICAgICAgICAgICAgbVN0YXRlID0gVE9fRk9SV0FSRF9JUF9XQUlUX09LQVk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCit9CisKK3ZvaWQgUGFpclVwV2VhclBob25lSW1wbDo6cmVhZEVtdWxhdG9yQ29uc29sZVNvY2tldCgpIHsKKyAgICBjb25zdCBzc2l6ZV90IHNpemUgPSBzb2NrZXRSZWN2KG1Db25zb2xlV2F0Y2gtPmZkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfQlVGRkVSX1NJWkUpOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBtUmVwbHkuYXBwZW5kKG1SZWFkQnVmZmVyLCBzaXplKTsKKyAgICAgICAgRFBSSU5UKCJyZWFkIGNvbnNvbGUgbWVzc2FnZTogJXNcbiIsIG1SZXBseS5jX3N0cigpKTsKKyAgICAgICAgaWYgKHN0ckNvbnRhaW5zKG1SZXBseSwgIk9LIikpIHsKKyAgICAgICAgICAgIERQUklOVCgicmVjZWl2ZWQgbWVzZyBmcm9tIGNvbnNvbGU6XG4lc1xuIiwgbVJlcGx5LmNfc3RyKCkpOworICAgICAgICAgICAgc25wcmludGYobVdyaXRlQnVmZmVyLCBXUklURV9CVUZGRVJfU0laRSwgInJlZGlyIGFkZCB0Y3A6NTYwMTo1NjAxXG5xdWl0XG4iKTsKKyAgICAgICAgICAgIERQUklOVCgic2VuZGluZyBxdWVyeSB0byBjb25zb2xlOlxuJXMiLCBtV3JpdGVCdWZmZXIpOworICAgICAgICAgICAgbUFzeW5jV3JpdGVyLnJlc2V0KG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0cmxlbihtV3JpdGVCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25zb2xlV2F0Y2guZ2V0KCkpOworICAgICAgICAgICAgc3dpdGNoVG9Xcml0ZSgmbUNvbnNvbGVXYXRjaCk7CisgICAgICAgICAgICBtU3RhdGUgPSBUT19TRU5EX1JFRElSX0NNRF9UT19DT05TT0xFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgRFBSSU5UKCJlcnJvciBoYXBwZW5lZCB3aGVuIHJlYWRpbmcgY29uc29sZVxuIik7CisgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgfQorfQorCit2b2lkIFBhaXJVcFdlYXJQaG9uZUltcGw6OndyaXRlRW11bGF0b3JDb25zb2xlU29ja2V0KCkgeworICAgIGNvbnN0IEFzeW5jU3RhdHVzIHN0YXR1cyA9IG1Bc3luY1dyaXRlci5ydW4oKTsKKworICAgIGlmIChzdGF0dXMgPT0ga0FzeW5jQ29tcGxldGVkKSB7CisgICAgICAgIG1TdGF0ZSA9IFBBSVJVUF9TVUNDRVNTOworICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IGtBc3luY0Vycm9yKSB7CisgICAgICAgIERQUklOVCgiRXJyb3I6IGNhbm5vdCB3cml0ZSB0byBjb25zb2xlXG4iKTsKKyAgICAgICAgc3RhcnRQcm9iZU5leHREZXZpY2UoKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICBPdGhlciBoZWxwZXIgbWV0aG9kcworYm9vbCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpjaGVja0ZvcldlYXJEZXZpY2UoKSB7CisgICAgY29uc3QgYm9vbCBpc1dlYXJEZXZpY2UgPQorICAgICAgICAgICAgc3RyQ29udGFpbnMobVJlcGx5LCAiY2xvY2t3b3JrIikgJiYKKyAgICAgICAgICAgICFzdHJuY21wKG1EZXZpY2VJblByb2JpbmcuY19zdHIoKSwgImVtdWxhdG9yLSIsIDkpOworCisgICAgaWYgKGlzV2VhckRldmljZSkgeworICAgICAgICBEUFJJTlQoImZvdW5kIHdlYXIgJXNcblxuIiwgbURldmljZUluUHJvYmluZy5jX3N0cigpKTsKKyAgICAgICAgbVdlYXJEZXZpY2VzLnB1c2hfYmFjayhtRGV2aWNlSW5Qcm9iaW5nKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXNXZWFyRGV2aWNlOworfQorCitib29sIFBhaXJVcFdlYXJQaG9uZUltcGw6OmNoZWNrRm9yQ29tcGF0aWJsZVBob25lKCkgeworICAgIGNvbnN0IGJvb2wgaXNDb21wYXRpYmxlUGhvbmUgPSBzdHJDb250YWlucyhtUmVwbHksIGtXZWFyYWJsZUFwcE5hbWUpOworCisgICAgaWYgKGlzQ29tcGF0aWJsZVBob25lKSB7CisgICAgICAgIERQUklOVCgiZm91bmQgY29tcGF0aWJsZSBwaG9uZSAlc1xuXG4iLCBtRGV2aWNlSW5Qcm9iaW5nLmNfc3RyKCkpOworICAgICAgICBtUGhvbmVEZXZpY2VzLnB1c2hfYmFjayhtRGV2aWNlSW5Qcm9iaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBib29sIHNob3VsZFRyeUFnYWluTGF0ZXIgPQorICAgICAgICAgICAgICAgIHN0ckNvbnRhaW5zKG1SZXBseSwgIkVycm9yOiIpICYmCisgICAgICAgICAgICAgICAgc3RyQ29udGFpbnMobVJlcGx5LCAiSXMgdGhlIHN5c3RlbSBydW5uaW5nPyIpOworCisgICAgICAgIGlmIChzaG91bGRUcnlBZ2FpbkxhdGVyKSBtVW5wcm9iZWREZXZpY2VzLnB1c2hfYmFjayhtRGV2aWNlSW5Qcm9iaW5nKTsKKyAgICB9CisKKyAgICByZXR1cm4gaXNDb21wYXRpYmxlUGhvbmU7Cit9CisKK2Jvb2wgUGFpclVwV2VhclBob25lSW1wbDo6c3RhcnRSZWFkQ29uc29sZSgpIHsKKyAgICBvcGVuQ29uc29sZUNvbm5lY3Rpb24oKTsKKworICAgIGlmIChtQ29uc29sZVdhdGNoLT5mZCgpIDwgMCkgeworICAgICAgICBzdGFydFByb2JlTmV4dERldmljZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRFBSSU5UKCJyZWFkeSB0byByZWFkIGNvbnNvbGUgZ3JlZXRpbmdzXG4iKTsKKyAgICAgICAgc3dpdGNoVG9SZWFkKCZtQ29uc29sZVdhdGNoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCitib29sIFBhaXJVcFdlYXJQaG9uZUltcGw6OnN0YXJ0V3JpdGVDb21tYW5kVG9BZGIoaW50IHF1ZXJ5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgaWYgKFRSQU5TRkVSID09IHF1ZXJ5VHlwZSB8fCBGT1JXQVJESVAgPT0gcXVlcnlUeXBlKSB7CisgICAgICAgIGNsb3NlQ29ubmVjdGlvbigmbUFkYldhdGNoKTsKKyAgICAgICAgb3BlbkFkYkNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBpZiAoIW1BZGJXYXRjaC5nZXQoKSB8fCAhbWVzc2FnZSkgeworICAgICAgICBzdGFydFByb2JlTmV4dERldmljZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2hhciBidWYyWzEwMjRdOworICAgIHN3aXRjaChxdWVyeVR5cGUpIHsKKyAgICAgICAgY2FzZSBUUkFOU0ZFUjoKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgImhvc3Q6dHJhbnNwb3J0OiVzIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQUk9QRVJUWToKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZjIsIHNpemVvZihidWYyKSwgInNoZWxsOmdldHByb3AgJXMiLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdFQVJBQkxFX0FQUF9QS0c6CisgICAgICAgICAgICBzbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICJzaGVsbDpwbSBsaXN0IHBhY2thZ2VzICVzIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGT1JXQVJESVA6CisgICAgICAgICAgICBzbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICJob3N0LXNlcmlhbDolczpmb3J3YXJkOnRjcDo1NjAxO3RjcDo1NjAxIiwgbWVzc2FnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc25wcmludGYobVdyaXRlQnVmZmVyLCBXUklURV9CVUZGRVJfU0laRSwgIiUwNHglcyIsICh1bnNpZ25lZCkoOjpzdHJsZW4oYnVmMikpLCBidWYyKTsKKyAgICBEUFJJTlQoInNlbmRpbmcgcXVlcnkgJyVzJyB0byBhZGJcbiIsIG1Xcml0ZUJ1ZmZlcik7CisgICAgbUFzeW5jV3JpdGVyLnJlc2V0KG1Xcml0ZUJ1ZmZlciwgOjpzdHJsZW4obVdyaXRlQnVmZmVyKSwgbUFkYldhdGNoLmdldCgpKTsKKyAgICBzd2l0Y2hUb1dyaXRlKCZtQWRiV2F0Y2gpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFBhaXJVcFdlYXJQaG9uZUltcGw6OmNvbXBsZXRlV3JpdGVDb21tYW5kVG9BZGIoKSB7CisgICAgQXN5bmNTdGF0dXMgc3RhdHVzID0gbUFzeW5jV3JpdGVyLnJ1bigpOworCisgICAgaWYgKHN0YXR1cyA9PSBrQXN5bmNFcnJvcikgeworICAgICAgICBzdGFydFByb2JlTmV4dERldmljZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0ga0FzeW5jQWdhaW4pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpzdGFydFJlYWRIZWFkZXJGcm9tQWRiKCkgeworICAgIGlmICghbUFkYldhdGNoLmdldCgpKSB7CisgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtUmVwbHkuY2xlYXIoKTsKKyAgICBtUmVhZEJ1ZmZlcls0XT0nXDAnOworICAgIG1Bc3luY1JlYWRlci5yZXNldChtUmVhZEJ1ZmZlciwgNCwgbUFkYldhdGNoLmdldCgpKTsKKyAgICBzd2l0Y2hUb1JlYWQoJm1BZGJXYXRjaCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGFpclVwV2VhclBob25lSW1wbDo6Y29tcGxldGVSZWFkSGVhZGVyRnJvbUFkYigpIHsKKyAgICBBc3luY1N0YXR1cyBzdGF0dXMgPSBtQXN5bmNSZWFkZXIucnVuKCk7CisKKyAgICBpZiAoc3RhdHVzID09IGtBc3luY0FnYWluKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBrQXN5bmNDb21wbGV0ZWQgJiYgIXN0cm5jbXAoIk9LQVkiLCBtUmVhZEJ1ZmZlciw0KSkgeworICAgICAgICBEUFJJTlQoInJlY2VpdmVkIG1lc2cgZnJvbSBhZGIgaG9zdDolc1xuIiwgbVJlYWRCdWZmZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydFByb2JlTmV4dERldmljZSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIFBhaXJVcFdlYXJQaG9uZUltcGw6OmNvbXBsZXRlUmVhZEFsbERhdGFGcm9tQWRiKCkgeworICAgIGlmICghbUFkYldhdGNoLmdldCgpKSB7CisgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjaGFyIGJ1ZmZbMTAyNF07CisgICAgc3NpemVfdCBzaXplID0gc29ja2V0UmVjdihtQWRiV2F0Y2gtPmZkKCksIGJ1ZmYsIHNpemVvZihidWZmKSk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFV09VTERCTE9DSyAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKyAgICAgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgbVJlcGx5LmFwcGVuZChidWZmLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBEUFJJTlQoInJlY2VpdmVkIG1lc2cgZnJvbSBhZGIgaG9zdDolc1xuIiwgbVJlcGx5LmNfc3RyKCkpOworICAgIHJldHVybiB0cnVlOworfQorCitQYWlyVXBXZWFyUGhvbmVJbXBsOjpQYWlyVXBXZWFyUGhvbmVJbXBsKAorICAgICAgICBMb29wZXIqIGxvb3BlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZXZpY2VzLAorICAgICAgICBpbnQgYWRiSG9zdFBvcnQpCisgICAgOiBtTG9vcGVyKGxvb3BlciksCisgICAgICBtQWRiSG9zdFBvcnQoYWRiSG9zdFBvcnQpLAorICAgICAgbUFkYldhdGNoKCksCisgICAgICBtQ29uc29sZVBvcnQoLTEpLAorICAgICAgbUNvbnNvbGVXYXRjaCgpLAorICAgICAgbVVucHJvYmVkRGV2aWNlcygpLAorICAgICAgbVdlYXJEZXZpY2VzKCksCisgICAgICBtUGhvbmVEZXZpY2VzKCksCisgICAgICBtU3RhdGUoUEFJUlVQX0VSUk9SKSwKKyAgICAgIG1Bc3luY1JlYWRlcigpLAorICAgICAgbUFzeW5jV3JpdGVyKCksCisgICAgICBtUmVhZEJ1ZmZlcihzdGF0aWNfY2FzdDxjaGFyKj4oY2FsbG9jKFJFQURfQlVGRkVSX1NJWkUsIDEpKSksCisgICAgICBtV3JpdGVCdWZmZXIoc3RhdGljX2Nhc3Q8Y2hhcio+KGNhbGxvYyhXUklURV9CVUZGRVJfU0laRSwgMSkpKSwKKyAgICAgIG1SZXBseSgpIHsKKyAgICB1cGRhdGVEZXZpY2VzKGRldmljZXMpOworCisgICAgaWYgKGlzRG9uZSgpKSB7CisgICAgICAgIGNsZWFuVXAoKTsKKyAgICB9Cit9CisKK1BhaXJVcFdlYXJQaG9uZUltcGw6On5QYWlyVXBXZWFyUGhvbmVJbXBsKCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBtTG9vcGVyID0gMDsKK30KKwordm9pZCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpzdGFydFByb2JlTmV4dERldmljZSgpIHsKKyAgICBjbG9zZUNvbm5lY3Rpb24oJm1BZGJXYXRjaCk7CisgICAgY2xvc2VDb25uZWN0aW9uKCZtQ29uc29sZVdhdGNoKTsKKworICAgIGlmIChtVW5wcm9iZWREZXZpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgbVN0YXRlID0gUEFJUlVQX0VSUk9SOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbURldmljZUluUHJvYmluZyA9IG1VbnByb2JlZERldmljZXNbMF07CisgICAgbVVucHJvYmVkRGV2aWNlcy5lcmFzZShtVW5wcm9iZWREZXZpY2VzLmJlZ2luKCkpOworCisgICAgaWYgKHN0YXJ0V3JpdGVDb21tYW5kVG9BZGIoVFJBTlNGRVIsIG1EZXZpY2VJblByb2JpbmcuY19zdHIoKSkpIHsKKyAgICAgICAgbVN0YXRlID0gVE9fR0VUX1BST0RVQ1RfTkFNRV9JTklUX1hGRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0YXRlID0gUEFJUlVQX0VSUk9SOworICAgIH0KK30KKwordm9pZCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpjbGVhblVwKCkgeworICAgIGNsb3NlQ29ubmVjdGlvbigmbUFkYldhdGNoKTsKKyAgICBjbG9zZUNvbm5lY3Rpb24oJm1Db25zb2xlV2F0Y2gpOworCisgICAgbVVucHJvYmVkRGV2aWNlcy5yZXNpemUoMFUpOworICAgIG1QaG9uZURldmljZXMucmVzaXplKDBVKTsKKyAgICBtV2VhckRldmljZXMucmVzaXplKDBVKTsKKyAgICBtUmVwbHkuY2xlYXIoKTsKKyAgICBpZiAobVJlYWRCdWZmZXIpIHsKKyAgICAgICAgZnJlZShtUmVhZEJ1ZmZlcik7CisgICAgICAgIG1SZWFkQnVmZmVyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1Xcml0ZUJ1ZmZlcikgeworICAgICAgICBmcmVlKG1Xcml0ZUJ1ZmZlcik7CisgICAgICAgIG1Xcml0ZUJ1ZmZlciA9IE5VTEw7CisgICAgfQorICAgIGlmIChQQUlSVVBfU1VDQ0VTUyA9PSBtU3RhdGUpIHsKKyAgICAgICAgRFBSSU5UKCJcblNVQ0NFU1NcbiIpOworICAgIH0gZWxzZSBpZiAoUEFJUlVQX0FMUkVBRFlfQ0xFQU5FRFVQICE9IG1TdGF0ZSkgeworICAgICAgICBEUFJJTlQoIlxuRkFJTFxuIik7CisgICAgfQorICAgIG1TdGF0ZSA9IFBBSVJVUF9BTFJFQURZX0NMRUFORURVUDsKKyAgICBEUFJJTlQoIlxuY2xlYW4gdXBcblxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7IC8vIGFjdHVhbGx5LCBuZWVkIHRvIGZsdXNoIHN0ZG91dAorfQorCitib29sIFBhaXJVcFdlYXJQaG9uZUltcGw6OmlzRG9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFBBSVJVUF9FUlJPUiA9PSBtU3RhdGUgfHwgUEFJUlVQX1NVQ0NFU1MgPT0gbVN0YXRlKTsKK30KKwordm9pZCBQYWlyVXBXZWFyUGhvbmVJbXBsOjp1cGRhdGVEZXZpY2VzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZXMpIHsKKyAgICBpZiAoZGV2aWNlcy5zaXplKCkgPCAyKSB7CisgICAgICAgIERQUklOVCgiRXJyb3I6IFRoZXJlIGFyZSBsZXNzIHRoYW4gdHdvIGRldmljZXMsIGNhbm5vdCBwcm9jZWVkLlxuIik7CisgICAgICAgIG1TdGF0ZSA9IFBBSVJVUF9FUlJPUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBEUFJJTlQoInN0YXJ0IHBhaXJpbmcgdXAgd2VhciB0byBwaG9uZVxuIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZVF1ZXVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBkZXZpY2VRdWV1ZS5wdXNoX2JhY2soZGV2aWNlc1tpXSk7CisgICAgfQorICAgIG1VbnByb2JlZERldmljZXMuc3dhcChkZXZpY2VRdWV1ZSk7CisgICAgc3RhcnRQcm9iZU5leHREZXZpY2UoKTsKK30KKwordm9pZCBQYWlyVXBXZWFyUGhvbmVJbXBsOjpzdGFydENvbm5lY3RXZWFyQW5kUGhvbmUoKSB7CisgICAgY2xvc2VDb25uZWN0aW9uKCZtQWRiV2F0Y2gpOworICAgIGNsb3NlQ29ubmVjdGlvbigmbUNvbnNvbGVXYXRjaCk7CisKKyAgICBpZiAobVBob25lRGV2aWNlcy5lbXB0eSgpIHx8IG1XZWFyRGV2aWNlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0YXJ0UHJvYmVOZXh0RGV2aWNlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwaG9uZSA9IG1QaG9uZURldmljZXNbMF07CisgICAgbVBob25lRGV2aWNlcy5lcmFzZShtUGhvbmVEZXZpY2VzLmJlZ2luKCkpOworICAgIGNvbnN0IGNoYXIgZW11W10gPSAiZW11bGF0b3ItIjsKKyAgICBjb25zdCBpbnQgc3ogPSBzaXplb2YoZW11KSAtIDE7CisgICAgaWYgKHN0cm5jbXAoZW11LCBwaG9uZS5jX3N0cigpLCBzeikgIT0gMCkgeworICAgICAgICAvLyByZWFsIHBob25lCisgICAgICAgIGlmIChzdGFydFdyaXRlQ29tbWFuZFRvQWRiKEZPUldBUkRJUCwgcGhvbmUuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPX0ZPUldBUkRfSVBfU0VORF9DTUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlbXVsYXRvcgorICAgICAgICBtQ29uc29sZVBvcnQgPSBhdG9pKHBob25lLmNfc3RyKCkgKyBzeik7CisgICAgICAgIGlmIChzdGFydFJlYWRDb25zb2xlKCkpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFRPX1JFQURfR1JFRVRJTkdTX0ZST01fQ09OU09MRTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgIGhlbHBlciBtZXRob2RzCisKK3ZvaWQgUGFpclVwV2VhclBob25lSW1wbDo6b3BlbkFkYkNvbm5lY3Rpb24oKSB7CisgICAgbVJlcGx5LmNsZWFyKCk7CisgICAgaWYgKCFvcGVuQ29ubmVjdGlvbihtQWRiSG9zdFBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmbUFkYldhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgX29uX2FkYl9zZXJ2ZXJfc29ja2V0X2ZkKSkgeworICAgICAgICBtU3RhdGUgPSBQQUlSVVBfRVJST1I7CisgICAgfQorfQorCit2b2lkIFBhaXJVcFdlYXJQaG9uZUltcGw6Om9wZW5Db25zb2xlQ29ubmVjdGlvbigpIHsKKyAgICBtUmVwbHkuY2xlYXIoKTsKKyAgICBpZiAoIW9wZW5Db25uZWN0aW9uKG1Db25zb2xlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uc29sZVdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgX29uX2VtdWxhdG9yX2NvbnNvbGVfc29ja2V0X2ZkKSkgeworICAgICAgICBtU3RhdGUgPSBQQUlSVVBfRVJST1I7CisgICAgfQorfQorCit2b2lkIFBhaXJVcFdlYXJQaG9uZUltcGw6OmNsb3NlQ29ubmVjdGlvbihGZFdhdGNoKiB3YXRjaCkgeworICAgIGlmICh3YXRjaC0+Z2V0KCkpIHsKKyAgICAgICAgKCp3YXRjaCktPmRvbnRXYW50UmVhZCgpOworICAgICAgICAoKndhdGNoKS0+ZG9udFdhbnRXcml0ZSgpOworICAgICAgICBzb2NrZXRDbG9zZSgoKndhdGNoKS0+ZmQoKSk7CisgICAgICAgIHdhdGNoLT5yZXNldChOVUxMKTsKKyAgICB9Cit9CisKK2Jvb2wgUGFpclVwV2VhclBob25lSW1wbDo6b3BlbkNvbm5lY3Rpb24oaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZkV2F0Y2gqIHdhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wZXI6OkZkV2F0Y2g6OkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgaW50IHNvID0gc29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KHBvcnQpOworICAgIGlmIChzbyA8IDApIHsKKyAgICAgICAgRFBSSU5UKCJmYWlsZWQgdG8gb3BlbiB1cCBjb25uZWN0aW9uIHRvIHBvcnQgJWRcbiIsIHBvcnQpOworICAgICAgICB3YXRjaC0+cmVzZXQoTlVMTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc29ja2V0U2V0Tm9uQmxvY2tpbmcoc28pOworICAgIHdhdGNoLT5yZXNldChtTG9vcGVyLT5jcmVhdGVGZFdhdGNoKHNvLCBjYWxsYmFjaywgdGhpcykpOworICAgIERQUklOVCgic3VjY2Vzc2Z1bGx5IG9wZW5lZCB1cCBjb25uZWN0aW9uIHRvIHBvcnQgJWRcbiIsIHBvcnQpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgICAgICBQYWlyVXBXZWFyUGhvbmUgIGltcGxlbWVudGF0aW9uCisvLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BhaXJVcFdlYXJQaG9uZTo6UGFpclVwV2VhclBob25lKExvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkYkhvc3RQb3J0KQorICAgIDogbVBhaXJVcFdlYXJQaG9uZUltcGwoCisgICAgICAgICAgICAgIG5ldyBQYWlyVXBXZWFyUGhvbmVJbXBsKGxvb3BlciwgZGV2aWNlcywgYWRiSG9zdFBvcnQpKSB7CisgICAgLy9WRVJCT1NFX0VOQUJMRShhZGIpOworfQorCitQYWlyVXBXZWFyUGhvbmU6On5QYWlyVXBXZWFyUGhvbmUoKSB7CisgICAgZGVsZXRlIG1QYWlyVXBXZWFyUGhvbmVJbXBsOworfQorCitib29sIFBhaXJVcFdlYXJQaG9uZTo6aXNEb25lKCkgY29uc3QgeworICAgIHJldHVybiBtUGFpclVwV2VhclBob25lSW1wbC0+aXNEb25lKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIHdlYXIKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvUGFpclVwV2VhclBob25lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5YTY3YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgYmFzZSB7CitjbGFzcyBMb29wZXI7Cit9ICAvLyBuYW1lc3BhY2UgYmFzZQorCituYW1lc3BhY2Ugd2VhciB7CisKKy8qCisgKiAgVGhpcyBvYmplY3Qgc2V0cyB1cCBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGZpcnN0IHBhaXIgb2YgY29tcGF0aWJsZQorICogIHdlYXIgYW5kIHBob25lIGluIHRoZSAiZGV2aWNlcyIgKHdoaWNoIGNvbWVzIGZyb20gImFkYiBkZXZpY2VzIiBjb21tYW5kKSwKKyAqICBzbyB0aGF0IHRoZSB3ZWFyIGNhbiByZWNlaXZlIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBwaG9uZS4KKyAqCisgKiAgVG8gdXNlIHRoaXMgY2xhc3MsIHNpbXBseSBjcmVhdGUgYW4gaW5zdGFuY2UgYXMgZm9sbG93czoKKyAqCisgKiAgUGFpclVwV2VhclBob25lICpwYWlydXAgPSBuZXcgUGFpclVwV2VhclBob25lKGxvb3BlciwgZGV2aWNlcyk7CisgKgorICogIEl0IGlzIGFkdmlzZWQgdG8gZGVsZXRlIHRoZSBwYWlydXAgb2JqZWN0IG9ubHkgYWZ0ZXIgcGFpcnVwLT5pc0RvbmUoKQorICogIHJldHVybnMgdHJ1ZSB0byBhdm9pZCBhYm9ydGluZyB0aGUgcGFpcmluZyB1cCBwcm9jZXNzLgorICovCisKK2NsYXNzIFBhaXJVcFdlYXJQaG9uZUltcGw7CisKK2NsYXNzIFBhaXJVcFdlYXJQaG9uZSB7CitwdWJsaWM6CisgICAgLy8gImRldmljZXMiIGlzIGEgbGlzdCBvZiBzZXJpYWwtaWRzLCBjb3VsZCBjb250YWluIGJvdGggZW11bGF0b3JzIGFuZCByZWFsIGRldmljZXMuCisgICAgUGFpclVwV2VhclBob25lKDo6YW5kcm9pZDo6YmFzZTo6TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgaW50IGFkYkhvc3RQb3J0KTsKKworICAgIH5QYWlyVXBXZWFyUGhvbmUoKTsKKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGhhcyBjb21wbGV0ZWQgaXRzIHRhc2sgYW5kIGNhbiBiZSBzYWZlbHkgZGVsZXRlZC4KKyAgICBib29sIGlzRG9uZSgpIGNvbnN0OworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUGFpclVwV2VhclBob25lKTsKKworICAgIFBhaXJVcFdlYXJQaG9uZUltcGwqIG1QYWlyVXBXZWFyUGhvbmVJbXBsOworfTsKKworCit9IC8vIG5hbWVzcGFjZSB3ZWFyCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9QYWlyVXBXZWFyUGhvbmVfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvUGFpclVwV2VhclBob25lX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA5MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvUGFpclVwV2VhclBob25lX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU2NvcGVkU29ja2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC90ZXN0aW5nL1dlYXJBZ2VudFRlc3RVdGlscy5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3VuaXN0ZC5oPgorCisjZGVmaW5lIERFQlVHX1RFU1QgMAorCisjaWYgREVCVUdfVEVTVAorI2RlZmluZSBEUFJJTlQoLi4uKSAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5UKC4uLikgICgodm9pZCkwKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB3ZWFyIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6YmFzZTsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OndlYXI6OnRlc3Rpbmc7CisKKy8vIFRoaXMgZG9lc24ndCBydW4gb24gV2luZG93cyBiZWNhdXNlIHRoZSB0ZXN0IGN1cnJlbnRseSByZWxpZXMgb24KKy8vIGZvcmsoKSB0byBydW4gdGhlIHBhaXJpbmcgYWdlbnQgaW4gYSBjaGlsZCBwcm9jZXNzLgorI2lmbmRlZiBfV0lOMzIKKworc3RhdGljIHZvaWQgcnVuUGFpclVwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRiSG9zdFBvcnQpIHsKKyAgICBMb29wZXIqIGxvb3BlciA9IExvb3Blcjo6Y3JlYXRlKCk7CisgICAgeworICAgICAgICBQYWlyVXBXZWFyUGhvbmUgcGFpclVwKGxvb3BlciwgZGV2aWNlTGlzdCwgYWRiSG9zdFBvcnQpOworICAgICAgICBsb29wZXItPnJ1bigpOworICAgIH0KKyAgICBkZWxldGUgbG9vcGVyOworfQorCitzdGF0aWMgYm9vbCB0ZXN0V3JhcHBlcihib29sIHVzYlBob25lKSB7CisgICAgaW50IGFkYk1vY2tTZXJ2ZXJQb3J0ID0gLTE7CisgICAgU2NvcGVkU29ja2V0IGFkYk1vY2tTZXJ2ZXJTb2NrZXQoCisgICAgICAgICAgICB0ZXN0U3RhcnRNb2NrU2VydmVyKCZhZGJNb2NrU2VydmVyUG9ydCkpOworICAgIGlmICghYWRiTW9ja1NlcnZlclNvY2tldC52YWxpZCgpKSB7CisgICAgICAgIERQUklOVCgiRVJST1I6IGNhbm5vdCBvcGVuIGFkYiBzZXJ2ZXIgcG9ydDogJWRcbiIsCisgICAgICAgICAgICAgICBhZGJNb2NrU2VydmVyUG9ydCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaW50IGNvbnNvbGVTZXJ2ZXJQb3J0ID0gLTE7CisgICAgU2NvcGVkU29ja2V0IGNvbnNvbGVTZXJ2ZXJTb2NrZXQ7CisgICAgY2hhciBwaG9uZURldmljZVsxMjhdID0geydcMCd9OworICAgIGNvbnN0IGNoYXIga1VzYlBob25lRGV2aWNlW10gPSAiMDcwZmU5M2EwYjJjMWZkYiI7CisgICAgaWYgKHVzYlBob25lKSB7CisgICAgICAgIHNucHJpbnRmKHBob25lRGV2aWNlLCBzaXplb2YocGhvbmVEZXZpY2UpLCBrVXNiUGhvbmVEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnNvbGVTZXJ2ZXJTb2NrZXQucmVzZXQodGVzdFN0YXJ0TW9ja1NlcnZlcigmY29uc29sZVNlcnZlclBvcnQpKTsKKyAgICAgICAgaWYgKCFjb25zb2xlU2VydmVyU29ja2V0LnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzbnByaW50ZihwaG9uZURldmljZSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKHBob25lRGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgImVtdWxhdG9yLSVkIiwKKyAgICAgICAgICAgICAgICAgY29uc29sZVNlcnZlclBvcnQpOworICAgIH0KKyAgICBjb25zdCBjaGFyIGtXZWFyRGV2aWNlW10gPSAiZW11bGF0b3ItNjU1OCI7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlTGlzdDsKKyAgICBkZXZpY2VMaXN0LnB1c2hfYmFjayhrV2VhckRldmljZSk7CisgICAgZGV2aWNlTGlzdC5wdXNoX2JhY2socGhvbmVEZXZpY2UpOworICAgIGludCBjaGlsZHBpZCA9IGZvcmsoKTsKKyAgICBpZiAoY2hpbGRwaWQgPT0gMCkgeworICAgICAgICAvLyBDaGlsZCBwcm9jZXNzIHJ1bnMgdGhlIHBhaXJpbmcgYWdlbnQuCisgICAgICAgIHJ1blBhaXJVcChkZXZpY2VMaXN0LCBhZGJNb2NrU2VydmVyUG9ydCk7CisgICAgICAgIF9leGl0KDApOworICAgIH0gZWxzZSBpZiAoY2hpbGRwaWQgPCAwKSB7CisgICAgICAgIERQUklOVCgiQ291bGQgbm90IGZvcmshXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBJbiB0aGUgcGFyZW50IHByb2Nlc3MuCisgICAgYm9vbCBzdGF0dXMgPSB0ZXN0UnVuTW9ja0FkYlNlcnZlcihhZGJNb2NrU2VydmVyU29ja2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVNlcnZlclNvY2tldC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXZWFyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JQaG9uZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworVEVTVChQYWlyVXBXZWFyUGhvbmUsIFRlc3RVc2JQaG9uZSkgeworICAgIEVYUEVDVF9UUlVFKHRlc3RXcmFwcGVyKHRydWUpKTsKK30KKworVEVTVChQYWlyVXBXZWFyUGhvbmUsIFRlc3RFbXVsYXRvclBob25lKSB7CisgICAgRVhQRUNUX1RSVUUodGVzdFdyYXBwZXIoZmFsc2UpKTsKK30KKworI2VuZGlmICAvLyAhX1dJTjMyCisKK30gLy8gbmFtZXNwYWNlIHdlYXIKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1dlYXJBZ2VudC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTc3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNSZWFkZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvQXN5bmNXcml0ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9TY29wZWRQdHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vQ29uZGl0aW9uVmFyaWFibGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS90aHJlYWRzL0Z1bmN0b3JUaHJlYWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC93ZWFyLWFnZW50L1BhaXJVcFdlYXJQaG9uZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBEUFJJTlQoLi4uKSAgKCh2b2lkKTApCisKKy8vI2RlZmluZSAgRFBSSU5UKC4uLikgIGRvIHsgIGlmIChWRVJCT1NFX0NIRUNLKGFkYikpIGRwcmludG4oX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugd2VhciB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmJhc2U7CisKKy8qCisgKiBXZWFyIEFnZW50IGxpc3RlbnMgdG8gYWRiIGhvc3Qgc2VydmVyIGZvciBkZXZpY2UgbGlzdCB1cGRhdGUuCisgKiBXaGVuZXZlciBpdCByZWNlaXZlcyBhbiB1cGRhdGUsIGl0IHdpbGwgYWJvcnQgY3VycmVudCBwYWlyaW5nIHByb2Nlc3MKKyAqIGFuZCBzdGFydCBhIG5ldyBvbmUuIFdoZW4gYWRiIGhvc3QgZGllcywgV2VhciBBZ2VudCB3aWxsIHRyeSB0byByZWNvbm5lY3QKKyAqIGV2ZXJ5IHR3byBzZWNvbmRzLgorICovCisKK2NsYXNzIFdlYXJBZ2VudEltcGwgeworcHVibGljOgorICAgIFdlYXJBZ2VudEltcGwoTG9vcGVyKiBsb29wZXIsIGludCBhZGJIb3N0UG9ydCk7CisgICAgfldlYXJBZ2VudEltcGwoKTsKKworICAgIGJvb2wgY29ubmVjdGVkKCkgY29uc3Q7CisKKyAgICB2b2lkIG9uV3JpdGUoKTsKKyAgICB2b2lkIG9uUmVhZCgpOworICAgIHZvaWQgY29ubmVjdFRvQWRiSG9zdEFzeW5jKCk7CisgICAgdm9pZCBjb21wbGV0ZUNvbm5lY3QoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIGNvbm5lY3RUb0FkYkhvc3RXb3JrZXIoKTsKKyAgICB2b2lkIGNvbm5lY3RUb0FkYkhvc3QoKTsKKyAgICB2b2lkIGNsZWFudXBDb25uZWN0aW9uKCk7CisgICAgdm9pZCBjb25uZWN0TGF0ZXIoKTsKKyAgICB2b2lkIGNvbXBsZXRlQ29ubmVjdExhdGVyKCk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfUkVBRF9CVUZGRVJfU0laRSA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0IGludCBXUklURV9CVUZGRVJfU0laRSA9IDEwMjQ7CisgICAgaW50ICAgICAgICAgIG1BZGJIb3N0UG9ydDsKKworICAgIGVudW0gY2xhc3MgU29ja2V0T3BlblN0YXRlIHsKKyAgICAgICAgUGVuZGluZywKKyAgICAgICAgU3VjY2VkZWQsCisgICAgICAgIEZhaWxlZAorICAgIH07CisgICAgU29ja2V0T3BlblN0YXRlIG1Tb2NrZXRPcGVuU3RhdGUgPSBTb2NrZXRPcGVuU3RhdGU6OlBlbmRpbmc7CisgICAgaW50ICAgICAgICAgIG1Tb2NrZXQ7CisgICAgYW5kcm9pZDo6YmFzZTo6TG9jayBtU29ja2V0TG9jazsKKworICAgIExvb3BlciogbUxvb3BlcjsKKyAgICBTY29wZWRQdHI8TG9vcGVyOjpGZFdhdGNoPiBtRmRXYXRjaDsKKyAgICBTY29wZWRQdHI8TG9vcGVyOjpUaW1lcj4gbVRpbWVyOworICAgIGludCAgICAgICAgICBtUmV0cnlBZnRlclNlY29uZHM7CisgICAgOjphbmRyb2lkOjpiYXNlOjpBc3luY1JlYWRlciAgbUFzeW5jUmVhZGVyOworICAgIDo6YW5kcm9pZDo6YmFzZTo6QXN5bmNXcml0ZXIgIG1Bc3luY1dyaXRlcjsKKyAgICBpbnQgICAgICAgICAgbVNpemVPZlJlYWRCdWZmZXI7CisgICAgY2hhciAgICAgICAgICptUmVhZEJ1ZmZlcjsKKyAgICBjaGFyICAgICAgICAgbVdyaXRlQnVmZmVyW1dSSVRFX0JVRkZFUl9TSVpFXTsKKyAgICBpbnQgICAgICAgICAgbUV4cGVjdFJlcGxheVR5cGU7CisgICAgU2NvcGVkUHRyPFBhaXJVcFdlYXJQaG9uZT4gbVBhaXJVcFdlYXJQaG9uZTsKKworICAgIGVudW0gY2xhc3MgQ29ubmVjdEFjdGlvbiB7CisgICAgICAgIE5vbmUsCisgICAgICAgIENvbm5lY3QsCisgICAgICAgIFF1aXQKKyAgICB9OworCisgICAgQ29ubmVjdEFjdGlvbiBtQ29ubmVjdEFjdGlvbiA9IENvbm5lY3RBY3Rpb246Ok5vbmU7CisgICAgYW5kcm9pZDo6YmFzZTo6RnVuY3RvclRocmVhZCBtQ29ubmVjdFRocmVhZDsKKyAgICBhbmRyb2lkOjpiYXNlOjpDb25kaXRpb25WYXJpYWJsZSBtQ29ubmVjdENvbmRpdGlvbjsKKyAgICBhbmRyb2lkOjpiYXNlOjpMb2NrIG1Db25uZWN0TG9jazsKKworICAgIC8vIEFueSBsb29wZXIgaW50ZXJhY3Rpb24gaXMgc2FmZSBvbmx5IG9uIHRoZSBsb29wZXIncyBvd24KKyAgICAvLyB0aHJlYWQuIFRoaXMgdGltZXIgd2lsbCBjYWxsIHRoZSBjb21wbGV0ZUNvbm5lY3QoKQorICAgIC8vIGZ1bmN0aW9uIG9uIHRoZSBtYWluIHRocmVhZCB3aGVyZSBpdCdzIHNhZmUKKyAgICBTY29wZWRQdHI8TG9vcGVyOjpUaW1lcj4gbUNvbm5lY3RDb21wbGV0ZVRpbWVyOworCisgICAgZW51bSBFeHBlY3RNZXNzYWdlIHsKKyAgICAgICAgT0tBWSA9IDAsCisgICAgICAgIExFTkdUSCwKKyAgICAgICAgTUVTU0FHRQorICAgIH07CisKKyAgICBib29sIGV4cGVjdE9rYXkgKCkgY29uc3QgeyByZXR1cm4gT0tBWSA9PSBtRXhwZWN0UmVwbGF5VHlwZTsgfQorICAgIGJvb2wgZXhwZWN0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTEVOR1RIID09IG1FeHBlY3RSZXBsYXlUeXBlOyB9CisgICAgYm9vbCBleHBlY3RNc2coKSBjb25zdCB7IHJldHVybiBNRVNTQUdFID09IG1FeHBlY3RSZXBsYXlUeXBlOyB9CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEhleE51bWJlcihjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGludCBzeik7CisgICAgc3RhdGljIHZvaWQgcGFyc2VBZGJEZXZpY2VzKGNoYXIqIGJ1Ziwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBkZXZpY2VzKTsKKworICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKFdlYXJBZ2VudEltcGwpOworfTsKKworLy8gVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gSS9PIGV2ZW50IGhhcHBlbnMgb24gdGhlIHNvY2tldAorLy8gY29ubmVjdGluZyB0aGUgYWdlbnQgdG8gdGhlIGhvc3QgQURCIHNlcnZlci4KK3N0YXRpYyB2b2lkIG9uX2FkYl9zZXJ2ZXJfc29ja2V0X2ZkKHZvaWQqIG9wYXF1ZSwgaW50IGZkLCB1bnNpZ25lZCBldmVudHMpIHsKKyAgICBjb25zdCBhdXRvIGFnZW50ID0gc3RhdGljX2Nhc3Q8V2VhckFnZW50SW1wbCo+KG9wYXF1ZSk7CisgICAgaWYgKCFhZ2VudCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoZXZlbnRzICYgTG9vcGVyOjpGZFdhdGNoOjprRXZlbnRSZWFkKSAhPSAwKSB7CisgICAgICAgIGFnZW50LT5vblJlYWQoKTsKKyAgICB9IGVsc2UgaWYgKChldmVudHMgJiBMb29wZXI6OkZkV2F0Y2g6OmtFdmVudFdyaXRlKSAhPSAwKSB7CisgICAgICAgIGFnZW50LT5vbldyaXRlKCk7CisgICAgfQorfQorCitib29sIFdlYXJBZ2VudEltcGw6OmNvbm5lY3RlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1GZFdhdGNoLmdldCgpICE9IG51bGxwdHI7Cit9CisKK3ZvaWQgV2VhckFnZW50SW1wbDo6b25SZWFkKCkgeworICAgIGlmICghY29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNFcnJvciA9IGZhbHNlOworICAgIGludCBtc2dzaXplID0gMDsKKyAgICBBc3luY1N0YXR1cyBzdGF0dXMgPSBtQXN5bmNSZWFkZXIucnVuKCk7CisKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIGtBc3luY0NvbXBsZXRlZDoKKyAgICAgICAgICAgIGlmIChleHBlY3RPa2F5KCkgJiYgIXN0cm5jbXAoIk9LQVkiLCBtUmVhZEJ1ZmZlciwgNCkpIHsKKyAgICAgICAgICAgICAgICBtVGltZXItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlcls0XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgbUFzeW5jUmVhZGVyLnJlc2V0KG1SZWFkQnVmZmVyLCA0LCBtRmRXYXRjaC5nZXQoKSk7CisgICAgICAgICAgICAgICAgbUV4cGVjdFJlcGxheVR5cGUgPSBMRU5HVEg7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwZWN0TGVuZ3RoKCkgJiYgaXNWYWxpZEhleE51bWJlcihtUmVhZEJ1ZmZlciwgNCkKKyAgICAgICAgICAgICAgICAgICAgJiYgMSA9PSBzc2NhbmYobVJlYWRCdWZmZXIsICIleCIsICZtc2dzaXplKSkgeworICAgICAgICAgICAgICAgIGlmIChtc2dzaXplIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKDAgPT0gbXNnc2l6ZSkgeyAvL3RoaXMgaXMgbm90IGVycm9yOiBqdXN0IG5vIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgbUV4cGVjdFJlcGxheVR5cGUgPSBMRU5HVEg7CisgICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyW21zZ3NpemVdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgbUFzeW5jUmVhZGVyLnJlc2V0KG1SZWFkQnVmZmVyLCA0LCBtRmRXYXRjaC5nZXQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZ3NpemUgPj0gbVNpemVPZlJlYWRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IChjaGFyKiljYWxsb2MoMiAqIG1zZ3NpemUsIHNpemVvZihjaGFyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpemVPZlJlYWRCdWZmZXIgPSAyICogbXNnc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1SZWFkQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRXhwZWN0UmVwbGF5VHlwZSA9IE1FU1NBR0U7CisgICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyW21zZ3NpemVdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgbUFzeW5jUmVhZGVyLnJlc2V0KG1SZWFkQnVmZmVyLCBtc2dzaXplLCBtRmRXYXRjaC5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4cGVjdE1zZygpKSB7CisgICAgICAgICAgICAgICAgRFBSSU5UKCJtZXNzYWdlIHJlY2VpdmVkIGZyb20gQURCOlxuJXMiLCBtUmVhZEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgbVBhaXJVcFdlYXJQaG9uZS5yZXNldCgpOworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRldmljZXM7CisgICAgICAgICAgICAgICAgcGFyc2VBZGJEZXZpY2VzKG1SZWFkQnVmZmVyLCAmZGV2aWNlcyk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBhaXJVcFdlYXJQaG9uZS5yZXNldChuZXcgUGFpclVwV2VhclBob25lKG1Mb29wZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFkYkhvc3RQb3J0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHByZXBhcmUgZm9yIG5leHQgYWRiIGRldmljZXMgbWVzc2FnZQorICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyWzRdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBtQXN5bmNSZWFkZXIucmVzZXQobVJlYWRCdWZmZXIsIDQsIG1GZFdhdGNoLmdldCgpKTsKKyAgICAgICAgICAgICAgICBtRXhwZWN0UmVwbGF5VHlwZSA9IExFTkdUSDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXNFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtBc3luY0FnYWluOgorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2Uga0FzeW5jRXJyb3I6CisgICAgICAgICAgICBpc0Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc0Vycm9yKSB7CisgICAgICAgIGNsZWFudXBDb25uZWN0aW9uKCk7CisgICAgICAgIGNvbm5lY3RMYXRlcigpOworICAgIH0KK30KKwordm9pZCBXZWFyQWdlbnRJbXBsOjpvbldyaXRlKCkgeworICAgIGlmICghY29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFzeW5jU3RhdHVzIHN0YXR1cyA9IG1Bc3luY1dyaXRlci5ydW4oKTsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIGtBc3luY0NvbXBsZXRlZDoKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyWzRdID0gJ1wwJzsKKyAgICAgICAgICAgIG1Bc3luY1JlYWRlci5yZXNldChtUmVhZEJ1ZmZlciwgNCwgbUZkV2F0Y2guZ2V0KCkpOworICAgICAgICAgICAgbUV4cGVjdFJlcGxheVR5cGUgPSBPS0FZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIGtBc3luY0Vycm9yOgorICAgICAgICAgICAgY2xlYW51cENvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbm5lY3RMYXRlcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIGtBc3luY0FnYWluOgorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwordm9pZCBXZWFyQWdlbnRJbXBsOjpjb25uZWN0VG9BZGJIb3N0QXN5bmMoKSB7CisgICAgaWYgKGNvbm5lY3RlZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIGxvY2sobVNvY2tldExvY2spOworICAgICAgICBtU29ja2V0T3BlblN0YXRlID0gU29ja2V0T3BlblN0YXRlOjpQZW5kaW5nOworICAgIH0KKyAgICBjb21wbGV0ZUNvbm5lY3RMYXRlcigpOworCisgICAgeworICAgICAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBsb2NrKG1Db25uZWN0TG9jayk7CisgICAgICAgIG1Db25uZWN0QWN0aW9uID0gQ29ubmVjdEFjdGlvbjo6Q29ubmVjdDsKKyAgICAgICAgbUNvbm5lY3RDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIFdlYXJBZ2VudEltcGw6OmNvbm5lY3RUb0FkYkhvc3RXb3JrZXIoKQoreworICAgIFRocmVhZDo6bWFza0FsbFNpZ25hbHMoKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtQ29ubmVjdExvY2spOworICAgICAgICB3aGlsZSAobUNvbm5lY3RBY3Rpb24gPT0gQ29ubmVjdEFjdGlvbjo6Tm9uZSkgeworICAgICAgICAgICAgbUNvbm5lY3RDb25kaXRpb24ud2FpdCgmbUNvbm5lY3RMb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobUNvbm5lY3RBY3Rpb24pIHsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gbWFrZSB0aGUgY29tcGlsZXIgaGFwcHkKKworICAgICAgICBjYXNlIENvbm5lY3RBY3Rpb246OlF1aXQ6CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBDb25uZWN0QWN0aW9uOjpDb25uZWN0OgorICAgICAgICAgICAgbUNvbm5lY3RBY3Rpb24gPSBDb25uZWN0QWN0aW9uOjpOb25lOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNvbm5lY3RUb0FkYkhvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFdlYXJBZ2VudEltcGw6OmNvbm5lY3RUb0FkYkhvc3QoKSB7CisgICAgLy8gdGhpcyBpcyB0aGUgb25seSBmdW5jdGlvbiB3aGljaCBtb2RpZmllcyBtZW1iZXJzIGZyb20gYSBzZXBhcmF0ZSB0aHJlYWQKKyAgICAvLyBpdCBtZWFucyB3ZSBuZWVkIHRvIGJlIGV4dHJhIGNhcmVmdWwgY2hhbmdpbmcgaXQ6CisgICAgLy8gLSBtYWtlIHN1cmUgY29ycmVjdCBsb2NrcyBhcmUgbG9ja2VkCisgICAgLy8gLSBtYWtlIHN1cmUgdGhlIHN0YXRlIGlzIHVwZGF0ZWQgb25seSBhZnRlciBldmVyeXRoaW5nIGVsc2UKKyAgICAvLyAtIGRvbid0IGhvbGQgbG9ja3MgZm9yIHRvbyBsb25nCisKKyAgICBjb25zdCBpbnQgc29ja2V0ID0gc29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KG1BZGJIb3N0UG9ydCk7CisgICAgaWYgKHNvY2tldCA8IDApIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtU29ja2V0TG9jayk7CisgICAgICAgIG1Tb2NrZXRPcGVuU3RhdGUgPSBTb2NrZXRPcGVuU3RhdGU6OkZhaWxlZDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNvY2tldFNldE5vbkJsb2NraW5nKHNvY2tldCk7CisKKyAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBsb2NrKG1Tb2NrZXRMb2NrKTsKKyAgICBpZiAobVNvY2tldCA+PSAwKSB7CisgICAgICAgIC8vIGFscmVhZHkgY3JlYXRlZCwgbWFrZSBzdXJlIHRoZSBjb21wbGV0aW9uIHJ1bnMKKyAgICAgICAgbVNvY2tldE9wZW5TdGF0ZSA9IFNvY2tldE9wZW5TdGF0ZTo6U3VjY2VkZWQ7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIHNvY2tldENsb3NlKHNvY2tldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU29ja2V0ID0gc29ja2V0OworICAgIG1Tb2NrZXRPcGVuU3RhdGUgPSBTb2NrZXRPcGVuU3RhdGU6OlN1Y2NlZGVkOworfQorCit2b2lkIFdlYXJBZ2VudEltcGw6OmNvbm5lY3RMYXRlcigpIHsKKyAgICBEUFJJTlQoIldhcm5pbmc6IGNhbm5vdCBjb25uZWN0IHRvIGFkYiBzZXJ2ZXIsIHdpbGwgdHJ5IGFnYWluIGluICVkIHNlY29uZHMuIFxuIiwKKyAgICAgICAgICAgIG1SZXRyeUFmdGVyU2Vjb25kcyk7CisgICAgY29uc3QgTG9vcGVyOjpEdXJhdGlvbiBkbCA9IDEwMDAgKiBtUmV0cnlBZnRlclNlY29uZHM7CisgICAgbVRpbWVyLT5zdGFydFJlbGF0aXZlKGRsKTsKK30KKwordm9pZCBXZWFyQWdlbnRJbXBsOjpjb21wbGV0ZUNvbm5lY3RMYXRlcigpCit7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNvbXBsZXRlQ29ubmVjdFRpbWVvdXRNcyA9IDE2OworCisgICAgRFBSSU5UKCJJbmZvOiBzY2hlZHVsaW5nIGEgY29ubmVjdGlvbiBjb21wbGV0aW9uIGhhbmRsZXIgaW4gJWQgbXMuIFxuIiwKKyAgICAgICAgICAgIGNvbXBsZXRlQ29ubmVjdFRpbWVvdXRNcyk7CisgICAgbUNvbm5lY3RDb21wbGV0ZVRpbWVyLT5zdGFydFJlbGF0aXZlKGNvbXBsZXRlQ29ubmVjdFRpbWVvdXRNcyk7Cit9CisKK3ZvaWQgV2VhckFnZW50SW1wbDo6Y29tcGxldGVDb25uZWN0KCkKK3sKKyAgICBpZiAoY29ubmVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIGxvY2sobVNvY2tldExvY2spOworICAgIGNvbnN0IGF1dG8gc3RhdGUgPSBtU29ja2V0T3BlblN0YXRlOworICAgIG1Tb2NrZXRPcGVuU3RhdGUgPSBTb2NrZXRPcGVuU3RhdGU6OlBlbmRpbmc7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIFNvY2tldE9wZW5TdGF0ZTo6UGVuZGluZzoKKyAgICAgICAgLy8ganVzdCByZXNjaGVkdWxlIHRvIGNoZWNrIGxhdGVyCisgICAgICAgIGNvbXBsZXRlQ29ubmVjdExhdGVyKCk7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgU29ja2V0T3BlblN0YXRlOjpGYWlsZWQ6CisgICAgICAgIGNvbm5lY3RMYXRlcigpOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIFNvY2tldE9wZW5TdGF0ZTo6U3VjY2VkZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydChtU29ja2V0ID49IDApOworCisgICAgICAgICAgICBTY29wZWRQdHI8TG9vcGVyOjpGZFdhdGNoPiBmZFdhdGNoKG1Mb29wZXItPmNyZWF0ZUZkV2F0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fYWRiX3NlcnZlcl9zb2NrZXRfZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgICAgICAgICBtQXN5bmNXcml0ZXIucmVzZXQobVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RybGVuKG1Xcml0ZUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRXYXRjaC5nZXQoKSk7CisKKyAgICAgICAgICAgIC8vIGNvbm5lY3RlZCgpIGNoZWNrcyBpZiBtRmRXYXRjaCBpcyBub3QgbnVsbCwgc28gc2V0IGl0IGxhc3QKKyAgICAgICAgICAgIG1GZFdhdGNoLnJlc2V0KGZkV2F0Y2gucmVsZWFzZSgpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgV2VhckFnZW50SW1wbDo6Y2xlYW51cENvbm5lY3Rpb24oKSB7CisgICAgbUZkV2F0Y2gucmVzZXQoKTsKKworICAgIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtU29ja2V0TG9jayk7CisgICAgICAgIGlmIChtU29ja2V0ID49IDApIHsKKyAgICAgICAgICAgIHNvY2tldENsb3NlKG1Tb2NrZXQpOworICAgICAgICAgICAgbVNvY2tldCA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgbVBhaXJVcFdlYXJQaG9uZS5yZXNldCgpOworfQorCit2b2lkIFdlYXJBZ2VudEltcGw6OnBhcnNlQWRiRGV2aWNlcyhjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIGRldmljZXMpIHsKKyAgICBpZiAoIWJ1ZikgcmV0dXJuOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0RlbGltaXRlcnNbXSA9ICIgXHRcclxuIjsKKworICAgIGNoYXIqIHBjaCA9IHN0cnRvayhidWYsIGtEZWxpbWl0ZXJzKTsKKyAgICBjaGFyKiBwcmV2ID0gTlVMTDsKKyAgICB3aGlsZSAocGNoKSB7CisgICAgICAgIGlmICghc3RyY21wKCJkZXZpY2UiLCBwY2gpICYmIHByZXYpIHsKKyAgICAgICAgICAgIGRldmljZXMtPnB1c2hfYmFjayhzdGQ6OnN0cmluZyhwcmV2KSk7CisgICAgICAgIH0KKyAgICAgICAgcHJldiA9IHBjaDsKKyAgICAgICAgcGNoID0gc3RydG9rKE5VTEwsIGtEZWxpbWl0ZXJzKTsKKyAgICB9Cit9CisKK2Jvb2wgV2VhckFnZW50SW1wbDo6aXNWYWxpZEhleE51bWJlcihjb25zdCBjaGFyKiBzdHIsIGNvbnN0IGludCBzeikgeworICAgIGlmICghc3RyIHx8IHN6IDw9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3IgKGludCBpPTA7IGkgPCBzejsgKytpKSB7CisgICAgICAgIGludCBjaCA9IHRvbG93ZXIoc3RyW2ldKTsKKyAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBvbl9jb25uZWN0X2NvbXBsZXRlKHZvaWQqIG9wYXF1ZSwgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBjb25zdCBhdXRvIGFnZW50ID0gc3RhdGljX2Nhc3Q8V2VhckFnZW50SW1wbCo+KG9wYXF1ZSk7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGFnZW50LT5jb21wbGV0ZUNvbm5lY3QoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9uX3JlY29ubmVjdF90aW1lb3V0KHZvaWQqIG9wYXF1ZSwgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBjb25zdCBhdXRvIGFnZW50ID0gc3RhdGljX2Nhc3Q8V2VhckFnZW50SW1wbCo+KG9wYXF1ZSk7CisgICAgaWYgKGFnZW50KSB7CisgICAgICAgIGFnZW50LT5jb25uZWN0VG9BZGJIb3N0QXN5bmMoKTsKKyAgICB9Cit9CisKK1dlYXJBZ2VudEltcGw6OldlYXJBZ2VudEltcGwoTG9vcGVyKiBsb29wZXIsIGludCBhZGJIb3N0UG9ydCkgOgorICAgICAgICBtQWRiSG9zdFBvcnQoYWRiSG9zdFBvcnQpLAorICAgICAgICBtU29ja2V0KC0xKSwKKyAgICAgICAgbUxvb3Blcihsb29wZXIpLAorICAgICAgICBtRmRXYXRjaCgpLAorICAgICAgICBtVGltZXIoKSwKKyAgICAgICAgbVJldHJ5QWZ0ZXJTZWNvbmRzKDIpLAorICAgICAgICBtQXN5bmNSZWFkZXIoKSwKKyAgICAgICAgbUFzeW5jV3JpdGVyKCksCisgICAgICAgIG1TaXplT2ZSZWFkQnVmZmVyKERFRkFVTFRfUkVBRF9CVUZGRVJfU0laRSksCisgICAgICAgIG1SZWFkQnVmZmVyKDApLAorICAgICAgICBtV3JpdGVCdWZmZXIoKSwKKyAgICAgICAgbUV4cGVjdFJlcGxheVR5cGUoT0tBWSksCisgICAgICAgIG1QYWlyVXBXZWFyUGhvbmUoKSwKKyAgICAgICAgbUNvbm5lY3RUaHJlYWQoW3RoaXNdKCkgeyBjb25uZWN0VG9BZGJIb3N0V29ya2VyKCk7IHJldHVybiAwOyB9KQoreworICAgIG1SZWFkQnVmZmVyID0gKGNoYXIqKWNhbGxvYyhtU2l6ZU9mUmVhZEJ1ZmZlcixzaXplb2YoY2hhcikpOworICAgIG1UaW1lci5yZXNldChsb29wZXItPmNyZWF0ZVRpbWVyKG9uX3JlY29ubmVjdF90aW1lb3V0LCB0aGlzKSk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVHJhY2tEZXZpY2VzUmVxdWVzdFtdID0gImhvc3Q6dHJhY2stZGV2aWNlcyI7CisgICAgc25wcmludGYobVdyaXRlQnVmZmVyLCBzaXplb2YobVdyaXRlQnVmZmVyKSwgIiUwNHglcyIsCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihrVHJhY2tEZXZpY2VzUmVxdWVzdCkgLSAxVSksCisgICAgICAgICAgICAga1RyYWNrRGV2aWNlc1JlcXVlc3QpOworCisgICAgbUNvbm5lY3RDb21wbGV0ZVRpbWVyLnJlc2V0KGxvb3Blci0+Y3JlYXRlVGltZXIob25fY29ubmVjdF9jb21wbGV0ZSwgdGhpcykpOworCisgICAgbUNvbm5lY3RUaHJlYWQuc3RhcnQoKTsKKyAgICBjb25uZWN0VG9BZGJIb3N0QXN5bmMoKTsKK30KKworV2VhckFnZW50SW1wbDo6fldlYXJBZ2VudEltcGwoKSB7CisgICAgeworICAgICAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBsb2NrKG1Db25uZWN0TG9jayk7CisgICAgICAgIG1Db25uZWN0QWN0aW9uID0gQ29ubmVjdEFjdGlvbjo6UXVpdDsKKyAgICAgICAgbUNvbm5lY3RDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorICAgIG1Db25uZWN0VGhyZWFkLndhaXQoKTsKKworICAgIGNsZWFudXBDb25uZWN0aW9uKCk7CisgICAgZnJlZShtUmVhZEJ1ZmZlcik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXZWFyQWdlbnQgQ2xhc3MKK1dlYXJBZ2VudDo6V2VhckFnZW50KExvb3BlciogbG9vcGVyLCBpbnQgYWRiSG9zdFBvcnQpIDogbVdlYXJBZ2VudEltcGwoMCkgeworICAgIGlmIChsb29wZXIgJiYgYWRiSG9zdFBvcnQgPj0gNTAzNykgeworICAgICAgICBtV2VhckFnZW50SW1wbCA9IG5ldyBXZWFyQWdlbnRJbXBsKGxvb3BlciwgYWRiSG9zdFBvcnQpOworICAgIH0KK30KKworV2VhckFnZW50Ojp+V2VhckFnZW50KCkgeworICAgIGlmIChtV2VhckFnZW50SW1wbCkgeworICAgICAgICBkZWxldGUgbVdlYXJBZ2VudEltcGw7CisgICAgICAgIG1XZWFyQWdlbnRJbXBsID0gMDsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIHdlYXIKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1dlYXJBZ2VudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvV2VhckFnZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhN2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L1dlYXJBZ2VudC5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuaCIKKworLy8gVGhpcyBjbGFzcyBlc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gYmV0d2VlbiBvbmUgQW5kcm9pZCBXZWFyIGFuZCBvbmUKKy8vIGNvbXBhdGlibGUgcGhvbmUsIHNvIHRoYXQgdGhlIHdlYXIgY2FuIGdldCBub3RpZmljYXRpb25zIGF1dG9tYXRpY2FsbHkKKy8vIGZyb20gdGhlIHBob25lLiBUaGUgcGhvbmUgY291bGQgYmUgZW11bGF0ZWQgcGhvbmUgb3IgYSByZWFsIHBob25lLgorLy8KKy8vIFVzYWdlIGlzIHNpbXBseToKKy8vCisvLyAgICAgV2VhckFnZW50IGFnZW50KGxvb3Blcik7CisvLworLy8gVGhlbiBzaW1wbHkgcnVuIHRoZSB8bG9vcGVyfCBhcyB1c3VhbC4KKy8vCisvLyBXaGVuIHxhZ2VudHwgZmFsbHMgb3V0IG9mIHNjb3BlIGJlZm9yZSB0aGUgbG9vcGVyIHN0b3BzLCBhbnkgb24tZ29pbmcKKy8vIHBhaXJpbmcgYWN0aXZpdHkgd2lsbCBiZSBhYm9ydGVkLiBJbiBhZGRpdGlvbiwgdGhlIGxvb3BlciBzaG91bGQgbm90IGJlCisvLyBkZXN0cm95ZWQgd2hlbiB0aGUgYWdlbnQgaXMgZGVzdHJveWVkLgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIExvb3BlcjsKK30gIC8vIG5hbWVzcGFjZSBiYXNlCisKK25hbWVzcGFjZSB3ZWFyIHsKKworY2xhc3MgV2VhckFnZW50SW1wbDsKKworY2xhc3MgV2VhckFnZW50IHsKK3B1YmxpYzoKKyAgICAvLyBDcmVhdGUgYSBuZXcgQW5kcm9pZCBXZWFyIGFnZW50IGluc3RhbmNlLgorICAgIC8vCisgICAgLy8gfGxvb3BlcnwgaXMgYSBMb29wZXIgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIHRvIGJ5IHRoZSBhZ2VudCB0byBwcm9jZXNzCisgICAgLy8gcGFpcmluZyByZXF1ZXN0cyBhc3luY2hyb25vdXNseS4KKyAgICAvLworICAgIC8vIHxhZGJIb3N0UG9ydHwgaXMgdGhlIGxvY2FsaG9zdCBUQ1AgcG9ydCBudW1iZXIgdXNlZCB0byB0YWxrIHRvCisgICAgLy8gdGhlIEFEQiBzZXJ2ZXIgb24gdGhlIGhvc3QuCisgICAgLy8KKyAgICAvLyBDcmVhdGluZyB0aGUgaW5zdGFuY2UgZG9lc24ndCBkbyBhbnl0aGluZywgb25lIGhhcyB0byBydW4gdGhlIGxvb3BlcgorICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBhZ2VudCB3b3Jrcy4KKyAgICBXZWFyQWdlbnQoOjphbmRyb2lkOjpiYXNlOjpMb29wZXIqIGxvb3BlciwgaW50IGFkYkhvc3RQb3J0ID0gNTAzNyk7CisKKyAgICAvLyBEZXN0cm95IGEgZ2l2ZW4gQW5kcm9pZCBXZWFyIGFnZW50IGluc3RhbmNlLiBUaGlzIHJlbW92ZXMgaXQgZnJvbQorICAgIC8vIGl0cyBsb29wZXIuIE5PVEU6IFRoaXMgbXVzdCBoYXBwZW4gX2JlZm9yZV8gdGhlIGxvb3BlciBpcyBkZXN0cm95ZWQuCisgICAgfldlYXJBZ2VudCgpOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWFyQWdlbnQpOworCisgICAgV2VhckFnZW50SW1wbCogIG1XZWFyQWdlbnRJbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHdlYXIKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnRfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvV2VhckFnZW50X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRhZmFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvV2VhckFnZW50X3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldERyYWluZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc29ja2V0cy9Tb2NrZXRVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC90ZXN0aW5nL1dlYXJBZ2VudFRlc3RVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKy8vIFNldCB0byAxIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgdHJhY2VzLgorI2RlZmluZSBERUJVR19URVNUIDAKKworI2lmIERFQlVHX1RFU1QKKyNkZWZpbmUgIERQUklOVCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEUFJJTlQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugd2VhciB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmJhc2U7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjp3ZWFyOjp0ZXN0aW5nOworCitzdGF0aWMgdm9sYXRpbGUgYm9vbCBzdG9wcGVkID0gZmFsc2U7CisKK3N0YXRpYyB2b2lkIG9uX3RpbWVfdXAgKHZvaWQqIG9wYXF1ZSwgTG9vcGVyOjpUaW1lciogdGltZXIpIHsKKyAgICBMb29wZXIqIGxvb3BlciA9IHN0YXRpY19jYXN0PExvb3Blcio+KG9wYXF1ZSk7CisgICAgbG9vcGVyLT5mb3JjZVF1aXQoKTsKKyAgICBzdG9wcGVkID0gdHJ1ZTsKK30KKworLy8gU2ltcGxlIHRlc3QgdG8gcnVuIGFnZW50IGZvciAxIG1pbCBzZWNvbmQgYW5kIGV4aXQgd2l0aG91dCBjcmFzaAorVEVTVChXZWFyQWdlbnQsIFNpbXBsZVRlc3QpIHsKKyAgICBpbnQgYWRiSG9zdFBvcnQgPSA1MDM4OyAvLyBpbnRlbnRpb25hbGx5IGRpZmZlcmVudCBmcm9tIGFkYiBkZWZhdXQgcG9ydCA1MDM3CisgICAgaW50IHNlcnZlclNvY2tldCA9IHRlc3RTdGFydE1vY2tTZXJ2ZXIoJmFkYkhvc3RQb3J0KTsKKyAgICBBU1NFUlRfR0Uoc2VydmVyU29ja2V0LCAwKTsKKyAgICBpbnQgbWlsU2Vjb25kc1RvUnVuID0gMTsKKyAgICBMb29wZXIqIG1haW5Mb29wZXIgPSBMb29wZXI6OmNyZWF0ZSgpOworICAgIHsKKyAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworCisgICAgICAgIGFuZHJvaWQ6OndlYXI6OldlYXJBZ2VudCBhZ2VudChtYWluTG9vcGVyLCBhZGJIb3N0UG9ydCk7CisgICAgICAgIFNvY2tldERyYWluZXIgZHJhaW5lcihtYWluTG9vcGVyKTsKKworICAgICAgICBMb29wZXI6OlRpbWVyKiB0aW1lciA9IG1haW5Mb29wZXItPmNyZWF0ZVRpbWVyKG9uX3RpbWVfdXAsIG1haW5Mb29wZXIpOworICAgICAgICBjb25zdCBMb29wZXI6OkR1cmF0aW9uIGRsID0gbWlsU2Vjb25kc1RvUnVuOworICAgICAgICB0aW1lci0+c3RhcnRSZWxhdGl2ZShkbCk7CisKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkKSB7CisgICAgICAgICAgICBtYWluTG9vcGVyLT5ydW4oKTsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgdGltZXI7CisgICAgfQorICAgIGRlbGV0ZSBtYWluTG9vcGVyOworfQorCisjaWZuZGVmIF9XSU4zMgorCitzdGF0aWMgYm9vbCB0ZXN0VHJhY2tEZXZpY2VzUXVlcnkoaW50IHNvY2tldEZkLCBTY29wZWRTb2NrZXQqIGFnZW50U29ja2V0KSB7CisgICAgYWdlbnRTb2NrZXQtPnJlc2V0KHNvY2tldEFjY2VwdEFueShzb2NrZXRGZCkpOworICAgIGlmICghYWdlbnRTb2NrZXQtPnZhbGlkKCkpIHsKKyAgICAgICAgRFBSSU5UKCJlcnJvciBoYXBwZW5zOiAlZCA8IDBcbiIsIGFnZW50U29ja2V0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdGVzdEV4cGVjdE1lc3NhZ2VGcm9tU29ja2V0KGFnZW50U29ja2V0LT5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0OnRyYWNrLWRldmljZXMiKTsKK30KKworc3RhdGljIHZvaWQgcnVuV2VhckFnZW50KGludCBhZGJIb3N0UG9ydCwgaW50IG1pbFNlY29uZHNUb1J1bikgeworICAgIExvb3BlciogbWFpbkxvb3BlciA9IExvb3Blcjo6Y3JlYXRlKCk7CisgICAgeworICAgICAgICBzdG9wcGVkID0gZmFsc2U7CisKKyAgICAgICAgYW5kcm9pZDo6d2Vhcjo6V2VhckFnZW50IGFnZW50KG1haW5Mb29wZXIsIGFkYkhvc3RQb3J0KTsKKyAgICAgICAgU29ja2V0RHJhaW5lciBkcmFpbmVyKG1haW5Mb29wZXIpOworCisgICAgICAgIExvb3Blcjo6VGltZXIqIHRpbWVyID0gTlVMTDsKKyAgICAgICAgaWYgKG1pbFNlY29uZHNUb1J1biA+IDApIHsKKyAgICAgICAgICAgIHRpbWVyID0gbWFpbkxvb3Blci0+Y3JlYXRlVGltZXIob25fdGltZV91cCwgbWFpbkxvb3Blcik7CisgICAgICAgICAgICBjb25zdCBMb29wZXI6OkR1cmF0aW9uIGRsID0gbWlsU2Vjb25kc1RvUnVuOworICAgICAgICAgICAgdGltZXItPnN0YXJ0UmVsYXRpdmUoZGwpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCFzdG9wcGVkKSB7CisgICAgICAgICAgICBtYWluTG9vcGVyLT5ydW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaWxTZWNvbmRzVG9SdW4gPiAwKSB7CisgICAgICAgICAgICBkZWxldGUgdGltZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEUFJJTlQoIndlYXIgYWdlbnQgZXhpdHNcbiIpOworICAgIGZmbHVzaChzdGRvdXQpOworICAgIGRlbGV0ZSBtYWluTG9vcGVyOworfQorCisvLyBUZXN0IHRoYXQgdGhlIGFnZW50IHNob3VsZCBwcm9wZXJseSBzZXR1cCBpcCBmb3J3YXJkaW5nIHdoZW4gdGhlcmUKKy8vIGFyZSBvbmUgd2VhciBhbmQgb25lIHBob25lCisKK3N0YXRpYyBib29sIHRlc3RXZWFyQWdlbnQoYm9vbCB1c2JQaG9uZSkgeworICAgIC8vVkVSQk9TRV9ESVNBQkxFKGFkYik7CisgICAgaW50IGFkYkhvc3RQb3J0ID0gLTE7IC8vIGRpZmZlcmVudCBmcm9tIGFkYiBkZWZhdXQgcG9ydCA1MDM3CisgICAgU2NvcGVkU29ja2V0IGFkYlNlcnZlclNvY2tldCh0ZXN0U3RhcnRNb2NrU2VydmVyKCZhZGJIb3N0UG9ydCkpOworICAgIGlmICghYWRiU2VydmVyU29ja2V0LnZhbGlkKCkpIHsKKyAgICAgICAgRFBSSU5UKCJFUlJPUjogY2Fubm90IG9wZW4gYWRiIHNlcnZlciBwb3J0OiAlZFxuIiwgYWRiSG9zdFBvcnQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGludCBtaWxTZWNvbmRzVG9SdW4gPSAxMDA7CisgICAgaW50IGNoaWxkcGlkID0gZm9yaygpOworICAgIGlmIChjaGlsZHBpZCA9PSAwKSB7CisgICAgICAgIHJ1bldlYXJBZ2VudChhZGJIb3N0UG9ydCwgbWlsU2Vjb25kc1RvUnVuKTsKKyAgICAgICAgX2V4aXQoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNoaWxkcGlkIDwgMCkgeworICAgICAgICAgICAgRFBSSU5UKCJDYW5ub3QgZm9yayFcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIFNjb3BlZFNvY2tldCBhZ2VudFNvY2tldFRyYWNraW5nOworICAgIGlmICghdGVzdFRyYWNrRGV2aWNlc1F1ZXJ5KGFkYlNlcnZlclNvY2tldC5nZXQoKSwgJmFnZW50U29ja2V0VHJhY2tpbmcpIHx8CisgICAgICAgICF0ZXN0U2VuZFRvU29ja2V0KGFnZW50U29ja2V0VHJhY2tpbmcuZ2V0KCksICJPS0FZIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFNjb3BlZFNvY2tldCBjb25zb2xlU29ja2V0OworCisgICAgY2hhciBwaG9uZURldmljZVsxMjhdPXsnXDAnfTsKKyAgICBpZiAodXNiUGhvbmUpIHsKKyAgICAgICAgc25wcmludGYocGhvbmVEZXZpY2UsIHNpemVvZihwaG9uZURldmljZSksICIwNzBmZTkzYTBiMmMxZmRiIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gc3RhcnQgYSBuZXcgc2VydmVyIGF0IHBvcnQgNjU1NgorICAgICAgICBpbnQgY29uc29sZVBvcnQgPSA2NTU2OworICAgICAgICBjb25zb2xlU29ja2V0LnJlc2V0KHRlc3RTdGFydE1vY2tTZXJ2ZXIoJmNvbnNvbGVQb3J0KSk7CisgICAgICAgIGlmICghY29uc29sZVNvY2tldC52YWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYocGhvbmVEZXZpY2UsIHNpemVvZihwaG9uZURldmljZSksICJlbXVsYXRvci0lZCIsIGNvbnNvbGVQb3J0KTsKKyAgICB9CisgICAgY29uc3QgY2hhciBrV2VhckRldmljZVtdID0gImVtdWxhdG9yLTY1NTQiOworICAgIGNoYXIga0RldmljZXNbMTAyNF0gPSB7J1wwJ307CisgICAgc25wcmludGYoa0RldmljZXMsCisgICAgICAgICAgICAgc2l6ZW9mKGtEZXZpY2VzKSwKKyAgICAgICAgICAgICAiJXMgZGV2aWNlICVzIGRldmljZSIsCisgICAgICAgICAgICAga1dlYXJEZXZpY2UsCisgICAgICAgICAgICAgcGhvbmVEZXZpY2UpOworICAgIGNoYXIgYnVmWzEwMjRdID0geydcMCd9OworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlMDR4JXMiLCAoaW50KShzdHJsZW4oa0RldmljZXMpKSwga0RldmljZXMpOworICAgIHJldHVybiB0ZXN0U2VuZFRvU29ja2V0KGFnZW50U29ja2V0VHJhY2tpbmcuZ2V0KCksIGJ1ZikgJiYKKyAgICAgICAgICAgdGVzdFJ1bk1vY2tBZGJTZXJ2ZXIoYWRiU2VydmVyU29ja2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlU29ja2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV2VhckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYlBob25lKTsKK30KKworVEVTVChXZWFyQWdlbnQsIFBhaXJVcFdlYXJUb1VzYlBob25lKSB7CisgICAgRVhQRUNUX1RSVUUodGVzdFdlYXJBZ2VudCh0cnVlKSk7Cit9CisKK1RFU1QoV2VhckFnZW50LCBQYWlyVXBXZWFyVG9FbXVsYXRvclBob25lKSB7CisgICAgRVhQRUNUX1RSVUUodGVzdFdlYXJBZ2VudChmYWxzZSkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHdlYXIKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L2FuZHJvaWRfd2Vhcl9hZ2VudC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9hbmRyb2lkX3dlYXJfYWdlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MmVmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9hbmRyb2lkX3dlYXJfYWdlbnQuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC93ZWFyLWFnZW50L2FuZHJvaWRfd2Vhcl9hZ2VudC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuaCIKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiA6Okxvb3BlciBDTG9vcGVyOworCithbmRyb2lkOjp3ZWFyOjpXZWFyQWdlbnQqIHNBZ2VudCA9IE5VTEw7CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIGFuZHJvaWRfd2Vhcl9hZ2VudF9zdGFydChDTG9vcGVyKiBsb29wZXIpIHsKKyAgICBEQ0hFQ0sobG9vcGVyKTsKKyAgICAvLyBUT0RPKGRpZ2l0KTogTWFrZSB0aGlzIHRocmVhZC1zYWZlPworICAgIGlmICghc0FnZW50KSB7CisgICAgICAgIHNBZ2VudCA9IG5ldyBhbmRyb2lkOjp3ZWFyOjpXZWFyQWdlbnQoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxhbmRyb2lkOjpiYXNlOjpMb29wZXIqPihsb29wZXIpKTsKKyAgICB9Cit9CisKK3ZvaWQgYW5kcm9pZF93ZWFyX2FnZW50X3N0b3Aodm9pZCkgeworICAgIERDSEVDSyhzQWdlbnQpOworICAgIGFuZHJvaWQ6OndlYXI6OldlYXJBZ2VudCogYWdlbnQgPSBzQWdlbnQ7CisgICAgc0FnZW50ID0gTlVMTDsKKyAgICBkZWxldGUgYWdlbnQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9hbmRyb2lkX3dlYXJfYWdlbnQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L2FuZHJvaWRfd2Vhcl9hZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzc3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9hbmRyb2lkX3dlYXJfYWdlbnQuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKy8vIEMgaW50ZXJmYWNlIHRvIGFuZHJvaWQvd2Vhci1hZ2VudC9XZWFyQWdlbnQuaAorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFN0YXJ0IHRoZSBhZ2VudCwgdXNpbmcgfGxvb3BlcnwgdG8gcGVyZm9ybSBhc3luY2hyb25vdXMgdGFza3MuCit2b2lkIGFuZHJvaWRfd2Vhcl9hZ2VudF9zdGFydChMb29wZXIqIGxvb3Blcik7CisKKy8vIFN0b3AgdGhlIGFnZW50Lgordm9pZCBhbmRyb2lkX3dlYXJfYWdlbnRfc3RvcCh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9kdW1teS5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvZHVtbXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDYyNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvZHVtbXkuYwpAQCAtMCwwICsxLDIgQEAKKy8vIER1bW15IHNvdXJjZSBmaWxlIHRvIGNvbXBpbGUgZW11bGF0b3ItbGlid2Vhci1hZ2VudAorY2hhciBkdW1teV9saWJ3ZWFyX2FnZW50ID0gMDsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L3NvdXJjZXMubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9zb3VyY2VzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjNjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC9zb3VyY2VzLm1rCkBAIC0wLDAgKzEsMTQgQEAKKyMgQnVpbGQgZmlsZXMgZm9yIHRoZSBBbmRyb2lkIFdlYXIgYWdlbnQgbGlicmFyeSBhbmQgdGVzdCBwcm9ncmFtcy4KKworIyBGaXJzdCwgdGhlIFdlYXIgYWdlbnQgbGlicmFyeSwgd2hpY2ggd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgZW11bGF0b3IKKyMgYW5kIHRoZSBzdGFuZGFsb25lIGV4ZWN1dGFibGUuCisKK0xJQldFQVJfQUdFTlRfU09VUkNFUyA6PSBcCisKK0xJQldFQVJfQUdFTlRfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworIyBEdW1teSBsaWJyYXJ5IHVzZWQgdG8gYXZvaWQgYnJlYWtpbmcgdGhlIFFFTVUyIGJ1aWxkIHRoYXQgc3RpbGwgZGVwZW5kcyBvbgorIyBpdCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiBSZW1vdmUgdGhpcyBvbmNlIGl0IGlzIGNsZWFuZWQgdXAuCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSwgbGliYW5kcm9pZC13ZWFyLWFnZW50KQorTE9DQUxfU1JDX0ZJTEVTIDo9IGFuZHJvaWQvd2Vhci1hZ2VudC9kdW1teS5jCiskKGNhbGwgZW5kLWVtdWxhdG9yLWxpYnJhcnkpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC90ZXN0aW5nL1dlYXJBZ2VudFRlc3RVdGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2Vhci1hZ2VudC90ZXN0aW5nL1dlYXJBZ2VudFRlc3RVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwY2RiNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L3Rlc3RpbmcvV2VhckFnZW50VGVzdFV0aWxzLmNwcApAQCAtMCwwICsxLDIxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3dlYXItYWdlbnQvdGVzdGluZy9XZWFyQWdlbnRUZXN0VXRpbHMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1Njb3BlZFNvY2tldC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldEVycm9ycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zb2NrZXRzL1NvY2tldFV0aWxzLmgiCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgREVCVUdfVEVTVCAwCisKKyNpZiBERUJVR19URVNUCisjZGVmaW5lIERQUklOVCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBEUFJJTlQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHdlYXIgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKKworYm9vbCB0ZXN0U2VuZFRvU29ja2V0KGludCBzb2NrZXRGZCwgY29uc3QgY2hhciogbWVzc2FnZSkgeworICAgIERQUklOVCgiLS0tc2VuZGluZyBtZXNzYWdlOiBbJXNdXG4iLCBtZXNzYWdlKTsKKyAgICBpbnQgc2l6ZSA9IHN0cmxlbihtZXNzYWdlKTsKKyAgICBjb25zdCBjaGFyKiBwdHIgPSBtZXNzYWdlOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBzc2l6ZV90IHJldCA9IHNvY2tldFNlbmQoc29ja2V0RmQsIHB0ciwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIChlcnJubyA9PSBFV09VTERCTE9DSyB8fCBlcnJubyA9PSBFQUdBSU4pKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgRFBSSU5UKCItLS1mYWlsdXJlIFslc11cbiIsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHRyICs9IHJldDsKKyAgICAgICAgICAgIHNpemUgLT0gcmV0OworICAgICAgICB9CisgICAgfQorICAgIERQUklOVCgiLS0tc3VjY2VzcyBbJXNdXG4iLCBtZXNzYWdlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB0ZXN0UmVjZWl2ZU1lc3NhZ2VGcm9tU29ja2V0KGludCBzb2NrZXRGZCwgY2hhciogcHRyLCBpbnQgc2l6ZSkgeworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBpbnQgcmV0ID0gc29ja2V0UmVjdihzb2NrZXRGZCwgcHRyLCBzaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgKGVycm5vID09IEVXT1VMREJMT0NLIHx8IGVycm5vID09IEVBR0FJTikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdHIgKz0gcmV0OworICAgICAgICAgICAgc2l6ZSAtPSByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdGVzdEV4cGVjdE1lc3NhZ2VGcm9tU29ja2V0KGludCBzb2NrZXRGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKSB7CisgICAgaW50IHNpemU9MDsKKyAgICBpZiAoaGVhZGVyKSB7CisgICAgICAgIGNoYXIgYnVmWzEwMjRdID0geydcMCd9OworICAgICAgICBpZiAoIXRlc3RSZWNlaXZlTWVzc2FnZUZyb21Tb2NrZXQoc29ja2V0RmQsIGJ1ZiwgNCkpIHsKKyAgICAgICAgICAgIERQUklOVCgiLS0tY2Fubm90IHJlY2VpdmUgNCBieXRlc1xuIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gMDsKKyAgICAgICAgYnVmWzRdID0gJ1wwJzsKKyAgICAgICAgaWYgKDEgIT0gc3NjYW5mKGJ1ZiwgIiV4IiwgJnNpemUpIHx8IHNpemUgPD0gMCkgeworICAgICAgICAgICAgRFBSSU5UKCItLS1jYW5ub3QgcmVjZWl2ZSBtZXNzYWdlIGxlbmd0aFxuIik7CisgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgPSBzdHJsZW4obWVzc2FnZSk7CisgICAgfQorICAgIGNoYXIgYnVmMlsxMDI0XSA9IHsnXDAnfTsKKyAgICBib29sIHN0YXR1cyA9IHRlc3RSZWNlaXZlTWVzc2FnZUZyb21Tb2NrZXQoc29ja2V0RmQsIGJ1ZjIsIHNpemUpOworICAgIERQUklOVCgiPT09cmVjZWl2ZWQgbWVzc2FnZTogWyUuKnNdXG4iLCBzaXplLCBidWYyKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoMCA9PSBzdHJuY21wKG1lc3NhZ2UsIGJ1ZjIsIHNpemUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIERQUklOVCgiPT09TUlTTUFUQ0ggWyUuKnNdIGV4cGVjdGVkIFslLipzXVxuIiwgc2l6ZSwgYnVmMiwgc2l6ZSwgbWVzc2FnZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgdGVzdFJ1bk1vY2tBZGJTZXJ2ZXIoaW50IGFkYlNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnNvbGVTZXJ2ZXJTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHdlYXJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBob25lRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzYlBob25lKSB7CisgICAgY2hhciBidWZbMTAyNF0gPSB7J1wwJ307CisgICAgY29uc3QgY2hhciBrUHJvcGVydHlbXSA9ICJzaGVsbDpnZXRwcm9wIHJvLnByb2R1Y3QubmFtZSI7CisKKyAgICAvLyBxdWVyeSByZWdhcmRpbmcgdGhlIHdhdGNoCisgICAgeworICAgICAgICBTY29wZWRTb2NrZXQgcyhzb2NrZXRBY2NlcHRBbnkoYWRiU2VydmVyU29ja2V0KSk7CisgICAgICAgIGlmICghcy52YWxpZCgpKSB7CisgICAgICAgICAgICBEUFJJTlQoIkNvdWxkIG5vdCBhY2NlcHQgY29ubmVjdGlvbiE/XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgImhvc3Q6dHJhbnNwb3J0OiVzIiwgd2VhckRldmljZSk7CisKKyAgICAgICAgaWYgKCF0ZXN0RXhwZWN0TWVzc2FnZUZyb21Tb2NrZXQocy5nZXQoKSwgYnVmKSB8fAorICAgICAgICAgICAgIXRlc3RTZW5kVG9Tb2NrZXQocy5nZXQoKSwgIk9LQVkiKSB8fAorICAgICAgICAgICAgIXRlc3RFeHBlY3RNZXNzYWdlRnJvbVNvY2tldChzLmdldCgpLCBrUHJvcGVydHkpIHx8CisgICAgICAgICAgICAhdGVzdFNlbmRUb1NvY2tldChzLmdldCgpLCAiT0tBWWNsb2Nrd29yayIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBxdWVyeSByZWdhcmRpbmcgdGhlIHBob25lCisgICAgeworICAgICAgICBTY29wZWRTb2NrZXQgcyhzb2NrZXRBY2NlcHRBbnkoYWRiU2VydmVyU29ja2V0KSk7CisgICAgICAgIGlmICghcy52YWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiaG9zdDp0cmFuc3BvcnQ6JXMiLCBwaG9uZURldmljZSk7CisgICAgICAgIGlmICghdGVzdEV4cGVjdE1lc3NhZ2VGcm9tU29ja2V0KHMuZ2V0KCksIGJ1ZikgfHwKKyAgICAgICAgICAgICF0ZXN0U2VuZFRvU29ja2V0KHMuZ2V0KCksICJPS0FZIikgfHwKKyAgICAgICAgICAgICF0ZXN0RXhwZWN0TWVzc2FnZUZyb21Tb2NrZXQocy5nZXQoKSwga1Byb3BlcnR5KSB8fAorICAgICAgICAgICAgIXRlc3RTZW5kVG9Tb2NrZXQocy5nZXQoKSwgIk9LQVlzZGsiKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgY2hhciBrUGFja2FnZXNbXSA9CisgICAgICAgICAgICAic2hlbGw6cG0gbGlzdCBwYWNrYWdlcyBjb20uZ29vZ2xlLmFuZHJvaWQud2VhcmFibGUiOworCisgICAgeworICAgICAgICBTY29wZWRTb2NrZXQgcyhzb2NrZXRBY2NlcHRBbnkoYWRiU2VydmVyU29ja2V0KSk7CisgICAgICAgIGlmICghcy52YWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiaG9zdDp0cmFuc3BvcnQ6JXMiLCBwaG9uZURldmljZSk7CisgICAgICAgIGlmICghdGVzdEV4cGVjdE1lc3NhZ2VGcm9tU29ja2V0KHMuZ2V0KCksIGJ1ZikgfHwKKyAgICAgICAgICAgICF0ZXN0U2VuZFRvU29ja2V0KHMuZ2V0KCksICJPS0FZIikgfHwKKyAgICAgICAgICAgICF0ZXN0RXhwZWN0TWVzc2FnZUZyb21Tb2NrZXQocy5nZXQoKSwga1BhY2thZ2VzKSB8fAorICAgICAgICAgICAgIXRlc3RTZW5kVG9Tb2NrZXQocy5nZXQoKSwgImNvbS5nb29nbGUuYW5kcm9pZC53ZWFyYWJsZS5hcHAiKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHBob25lLWNvbnNvbGUgYW5kIGFnZW50CisgICAgaWYgKHVzYlBob25lKSB7CisgICAgICAgIFNjb3BlZFNvY2tldCBzKHNvY2tldEFjY2VwdEFueShhZGJTZXJ2ZXJTb2NrZXQpKTsKKyAgICAgICAgaWYgKCFzLnZhbGlkKCkpIHsKKyAgICAgICAgICAgIERQUklOVCgiWlpaIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgIHNucHJpbnRmKGJ1ZiwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICJob3N0LXNlcmlhbDolczpmb3J3YXJkOnRjcDo1NjAxO3RjcDo1NjAxIiwKKyAgICAgICAgICAgICAgICAgcGhvbmVEZXZpY2UpOworICAgICAgICBpZiAoIXRlc3RFeHBlY3RNZXNzYWdlRnJvbVNvY2tldChzLmdldCgpLCBidWYpIHx8CisgICAgICAgICAgICAhdGVzdFNlbmRUb1NvY2tldChzLmdldCgpLCAiT0tBWSIpKSB7CisgICAgICAgICAgICBEUFJJTlQoIllZWSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgU2NvcGVkU29ja2V0IHMoc29ja2V0QWNjZXB0QW55KGNvbnNvbGVTZXJ2ZXJTb2NrZXQpKTsKKyAgICAgICAgaWYgKCFzLnZhbGlkKCkpIHsKKyAgICAgICAgICAgIERQUklOVCgiRVJST1I6IGNhbm5vdCBhY2NlcHQgY29uc29sZSBwb3J0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXRlc3RTZW5kVG9Tb2NrZXQocy5nZXQoKSwgIkFuZHJvaWQgQ29uc29sZVxuT0tcbiIpIHx8CisgICAgICAgICAgICAhdGVzdEV4cGVjdE1lc3NhZ2VGcm9tU29ja2V0KHMuZ2V0KCksCisgICAgICAgICAgICAgICAgInJlZGlyIGFkZCB0Y3A6NTYwMTo1NjAxXG5xdWl0XG4iLCAwKSkgeworICAgICAgICAgICAgRFBSSU5UKCJYWFgiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitpbnQgdGVzdFN0YXJ0TW9ja1NlcnZlcihpbnQqIGhvc3RQb3J0KSB7CisgICAgaW50IHNvY2tldCA9IHNvY2tldFRjcDRMb29wYmFja1NlcnZlcigwKTsKKyAgICBpZiAoc29ja2V0IDwgMCkgeworICAgICAgICBEUFJJTlQoIkNvdWxkIG5vdCBmaW5kIGF2YWlsYWJsZSBUQ1AgcG9ydCBmb3IgdGVzdCFcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIEdldCBzb2NrZXQgcG9ydCBub3cuCisgICAgKmhvc3RQb3J0ID0gc29ja2V0R2V0UG9ydChzb2NrZXQpOworICAgIERQUklOVCgiVXNpbmcgVENQIGxvb3BiYWNrIHBvcnQgJWRcbiIsICpob3N0UG9ydCk7CisgICAgcmV0dXJuIHNvY2tldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSB3ZWFyCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dlYXItYWdlbnQvdGVzdGluZy9XZWFyQWdlbnRUZXN0VXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L3Rlc3RpbmcvV2VhckFnZW50VGVzdFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzODM3MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93ZWFyLWFnZW50L3Rlc3RpbmcvV2VhckFnZW50VGVzdFV0aWxzLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugd2VhciB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKKy8vIEJpbmQgdG8gYSByYW5kb20gVENQIGxvb3BiYWNrIHBvcnQuCisvLyBPbiBzdWNjZXNzLCByZXR1cm4gbmV3IHNlcnZlciBzb2NrZXQgZGVzY3JpcHRvciwgYW5kIHNldHMgfCpob3N0UG9ydHwKKy8vIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBvcnQgbnVtYmVyLiBPbiBmYWlsdXJlLCByZXR1cm4gLTEvZXJybm8uCitpbnQgdGVzdFN0YXJ0TW9ja1NlcnZlcihpbnQqIGhvc3RQb3J0KTsKKworLy8gUnVuIGEgbW9jayBob3N0IEFEQiBzZXJ2ZXIgaW5zdGFuY2Ugd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGludGVyYWN0CisvLyB3aXRoIHRoZSBXZWFyQWdlbnQgaW1wbGVtZW50YXRpb24gZHVyaW5nIHVuaXQgdGVzdGluZy4KKy8vCisvLyB8YWRiU2VydmVyU29ja2V0fCBpcyB0aGUgc2VydmVyIHNvY2tldCBkZXNjcmlwdG9yIGZvciBBREIgY29ubmVjdGlvbgorLy8gdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGFnZW50LgorLy8gfGNvbnNvbGVTZXJ2ZXJTb2NrZXR8IGlzIHRoZSBjb25zb2xlIHNlcnZlciBzb2NrZXQgZm9yIGNvbnNvbGUKKy8vIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBhZ2VudCBpZiBpdCB0aGlua3MgaXQgaXMgdGFsa2luZworLy8gdG8gYW4gZW11bGF0b3IsIGluc3RlYWQgb2YgYSByZWFsIGRldmljZS4gVGhpcyBpcyBpZ25vcmVkIGlmIHx1c2JQaG9uZXwKKy8vIGlzIHRydWUuCisvLyB8d2VhckRldmljZXwgaXMgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSBzaW11bGF0ZWQgd2VhciBkZXZpY2Ugb3IgZW11bGF0b3IuCisvLyB8cGhvbmVEZXZpY2V8IGlzIHRoZSBzZXJpYWwgbnVtYmVyIG9mIGEgc2ltdWxhdGVkIGNvbXBhdGlibGUgZGV2aWNlIG9yCisvLyBlbXVsYXRvciB0byBiZSBwYWlyZWQtdXAgd2l0aCB8d2VhckRldmljZXwKKy8vIHx1c2JQaG9uZXwgaXMgdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHxwaG9uZURldmljZXwgaXMgYSBzaW11bGF0ZWQgZGV2aWNlLAorLy8gYW5kIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgaXQgaXMgYSBzaW11bGF0ZWQgZW11bGF0b3IuCisvLworLy8gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UvZXJybm8gb3RoZXJ3aXNlLgorYm9vbCB0ZXN0UnVuTW9ja0FkYlNlcnZlcihpbnQgYWRiU2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29uc29sZVNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogd2VhckRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGhvbmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNiUGhvbmUpOworCisvLyBTZW5kIGEgZ2l2ZW4gemVyby10ZXJtaW5hdGVkIHxtZXNzYWdlfCB0byBzb2NrZXQgfHNvY2tldEZkfC4KKy8vIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlLCBvbiBlcnJvciByZXR1cm4gZmFsc2UvZXJybm8uCitib29sIHRlc3RTZW5kVG9Tb2NrZXQoaW50IHNvY2tldEZkLCBjb25zdCBjaGFyKiBtZXNzYWdlKTsKKworLy8gUmVjZWl2ZSBhIG1lc3NhZ2Ugb2YgZXhhY3RseSB8c2l6ZXwgYnl0ZXMgZnJvbSBzb2NrZXQgfHNvY2tldEZkfCBhbmQKKy8vIHN0b3JlIHRoZSBkYXRhIGludG8gfHB0cnwuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlLiBPbiBmYWlsdXJlIHJldHVybgorLy8gZmFsc2UvZXJybm8uCitib29sIHRlc3RSZWNlaXZlTWVzc2FnZUZyb21Tb2NrZXQoaW50IHNvY2tldEZkLCBjaGFyKiBwdHIsIGludCBzaXplKTsKKworLy8gUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBzb2NrZXQgfHNvY2tldEZkfC4KKy8vIElmIHxoZWFkZXJ8IGlzIDEsIHRoZW4gdGhpcyByZWFkcyBhIDQtYnl0ZSBoZXhjaGFyIGhlYWRlciBnaXZpbmcgdGhlCisvLyBzaXplIG9mIHRoZSBtZXNzYWdlLCB0aGVuIHRoZSBwYXlsb2FkLiBPdGhlcndpc2UsIHJlYWQgZGF0YSB1bnRpbAorLy8gdGhlIHNvY2tldCBpcyBkaXNjb25uZWN0ZWQuCisvLyBUaGUgcmVjZWl2ZWQgZGF0YSBtdXN0IG1hdGNoIHxtZXNzYWdlfC4KKy8vIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlL2Vycm5vIG9uIGZhaWx1cmUuCitib29sIHRlc3RFeHBlY3RNZXNzYWdlRnJvbVNvY2tldChpbnQgc29ja2V0RmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlciA9IDEpOworCit9IC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9IC8vIG5hbWVzcGFjZSB3ZWFyCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvd2luZG93c19pbnN0YWxsZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDE0NTEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1Njb3BlZFJlZ0tleS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdGb3JtYXQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1dpbjMyVW5pY29kZVN0cmluZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vV2luMzJVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2luZG93c19pbnN0YWxsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBiYXNlOjpTdHJpbmdBcHBlbmRGb3JtYXQ7Cit1c2luZyBiYXNlOjpTY29wZWRSZWdLZXk7Cit1c2luZyBiYXNlOjpXaW4zMlVuaWNvZGVTdHJpbmc7Cit1c2luZyBiYXNlOjpXaW4zMlV0aWxzOworCitpbnQzMl90IFdpbmRvd3NJbnN0YWxsZXI6OmdldFZlcnNpb24oY29uc3QgY2hhciogcHJvZHVjdERpc3BsYXlOYW1lKSB7CisgICAgRFdPUkQgY1N1YktleXMgPSAwOyAgLy8gbnVtYmVyIG9mIHN1YmtleXMKKyAgICBSRUdTQU0gc2FtRGVzaXJlZCA9IEtFWV9SRUFEOworICAgIERXT1JEIGR3R2V0VmFsdWVGbGFncyA9IDA7CisKKyNpZiAhX1dJTjY0CisgICAgLy8gMzIgYml0IGJpbmFyeQorICAgIEJPT0wgYklzV293NjQgPSBGQUxTRTsKKyAgICBpZiAoSXNXb3c2NFByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmJJc1dvdzY0KSkgeworICAgICAgICBpZiAoYklzV293NjQpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSAzMiBiaXQgYmluYXJ5IHJ1bm5pbmcgb24gYSA2NCBiaXQgaG9zdCwgY2hlY2sgdGhlIDY0CisgICAgICAgICAgICAvLyBiaXQgcmVnaXN0cnkKKyAgICAgICAgICAgIHNhbURlc2lyZWQgfD0gS0VZX1dPVzY0XzY0S0VZOworICAgICAgICAgICAgY29uc3QgaW50IFJSRl9TVUJLRVlfV09XNjQ2NEtFWSA9IDB4MDAwMTAwMDA7CisgICAgICAgICAgICBkd0dldFZhbHVlRmxhZ3MgfD0gUlJGX1NVQktFWV9XT1c2NDY0S0VZOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBIS0VZIGhrZXkgPSAwOworICAgIGNvbnN0IGNoYXIqIHJlZ2lzdHJ5X3BhdGggPQorICAgICAgICAgICAgIlNPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFwiCisgICAgICAgICAgICAiSW5zdGFsbGVyXFxVc2VyRGF0YVxcUy0xLTUtMThcXFByb2R1Y3RzIjsKKyAgICBMT05HIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIHJlZ2lzdHJ5X3BhdGgsIDAsIHNhbURlc2lyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhrZXkpOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHJpbmcgPSBXaW4zMlV0aWxzOjpnZXRFcnJvclN0cmluZyhyZXN1bHQpOworICAgICAgICBwcmludGYoIlJlZ09wZW5LZXlFeCBmYWlsZWQgJWxpICVzXG4iLCByZXN1bHQsIGVycm9yX3N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGtVbmtub3duOworICAgIH0KKyAgICBTY29wZWRSZWdLZXkgaFByb2R1Y3RzS2V5KGhrZXkpOworCisgICAgcmVzdWx0ID0gUmVnUXVlcnlJbmZvS2V5VyhoUHJvZHVjdHNLZXkuZ2V0KCksIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY1N1YktleXMsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyaW5nID0gV2luMzJVdGlsczo6Z2V0RXJyb3JTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgcHJpbnRmKCJSZWdRdWVyeUluZm9LZXlXIGZhaWxlZCAlbGkgJXNcbiIsIHJlc3VsdCwKKyAgICAgICAgICAgICAgIGVycm9yX3N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGtVbmtub3duOworICAgIH0KKworICAgIGZvciAoRFdPUkQgaSA9IDA7IGkgPCBjU3ViS2V5czsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBrTWF4S2V5TGVuZ3RoID0gMjU2OworICAgICAgICBjaGFyIHByb2R1Y3RfZ3VpZFtrTWF4S2V5TGVuZ3RoXTsgIC8vIGJ1ZmZlciBmb3Igc3Via2V5IG5hbWUKKyAgICAgICAgRFdPUkQgcHJvZHVjdF9ndWlkX2xlbiA9IGtNYXhLZXlMZW5ndGg7CisgICAgICAgIHJlc3VsdCA9IFJlZ0VudW1LZXlFeEEoaFByb2R1Y3RzS2V5LmdldCgpLCBpLCBwcm9kdWN0X2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2R1Y3RfZ3VpZF9sZW4sIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyaW5nID0gV2luMzJVdGlsczo6Z2V0RXJyb3JTdHJpbmcocmVzdWx0KTsKKyAgICAgICAgICAgIHByaW50ZigiUmVnRW51bUtleUV4QSBmYWlsZWQgJWxpICVzXG4iLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgZXJyb3Jfc3RyaW5nLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBpbnN0YWxsX3Byb3BlcnRpZXMocmVnaXN0cnlfcGF0aCk7CisgICAgICAgIGluc3RhbGxfcHJvcGVydGllcyArPSAiXFwiOworICAgICAgICBpbnN0YWxsX3Byb3BlcnRpZXMgKz0gcHJvZHVjdF9ndWlkOworICAgICAgICBpbnN0YWxsX3Byb3BlcnRpZXMgKz0gIlxcSW5zdGFsbFByb3BlcnRpZXMiOworCisgICAgICAgIEhLRVkgaGtleSA9IDA7CisgICAgICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIGluc3RhbGxfcHJvcGVydGllcy5jX3N0cigpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtRGVzaXJlZCwgJmhrZXkpOworICAgICAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm9ybWFsIGF0IGxlYXN0IG9uY2UKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFNjb3BlZFJlZ0tleSBoSW5zdGFsbFByb3BlcnRpZXNLZXkoaGtleSk7CisKKyAgICAgICAgRFdPUkQgZGlzcGxheV9uYW1lX3NpemUgPSAwOworICAgICAgICBjb25zdCBXQ0hBUiBkaXNwbGF5TmFtZUtleVtdID0gTCJEaXNwbGF5TmFtZSI7CisgICAgICAgIHJlc3VsdCA9IFJlZ0dldFZhbHVlVyhoSW5zdGFsbFByb3BlcnRpZXNLZXkuZ2V0KCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZUtleSwgUlJGX1JUX1JFR19TWiB8IGR3R2V0VmFsdWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsICZkaXNwbGF5X25hbWVfc2l6ZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyAmJiBFUlJPUl9NT1JFX0RBVEEgIT0gcmVzdWx0KSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHJpbmcgPSBXaW4zMlV0aWxzOjpnZXRFcnJvclN0cmluZyhyZXN1bHQpOworICAgICAgICAgICAgcHJpbnRmKCJSZWdHZXRWYWx1ZVcgZmFpbGVkICVsaSAlc1xuIiwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgIGVycm9yX3N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgV2luMzJVbmljb2RlU3RyaW5nIGRpc3BsYXlfbmFtZTE2OworICAgICAgICBkaXNwbGF5X25hbWUxNi5yZXNpemUoZGlzcGxheV9uYW1lX3NpemUgLyAyKTsKKyAgICAgICAgcmVzdWx0ID0gUmVnR2V0VmFsdWVXKGhJbnN0YWxsUHJvcGVydGllc0tleS5nZXQoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lS2V5LCBSUkZfUlRfUkVHX1NaIHwgZHdHZXRWYWx1ZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgZGlzcGxheV9uYW1lMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlfbmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9zdHJpbmcgPSBXaW4zMlV0aWxzOjpnZXRFcnJvclN0cmluZyhyZXN1bHQpOworICAgICAgICAgICAgcHJpbnRmKCJSZWdHZXRWYWx1ZVcgZmFpbGVkICVsaSAlc1xuIiwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgIGVycm9yX3N0cmluZy5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZGlzcGxheV9uYW1lOCA9IGRpc3BsYXlfbmFtZTE2LnRvU3RyaW5nKCk7CisgICAgICAgIGlmICgwID09IHN0cmNtcChkaXNwbGF5X25hbWU4LmNfc3RyKCksIHByb2R1Y3REaXNwbGF5TmFtZSkpIHsKKyAgICAgICAgICAgIC8vIFdlJ3ZlIGZvdW5kIHRoZSBlbnRyeSBmb3IgcHJvZHVjdERpc3BsYXlOYW1lCisgICAgICAgICAgICBEV09SRCB2ZXJzaW9uOworICAgICAgICAgICAgRFdPUkQgdmVyc2lvbl9sZW4gPSBzaXplb2YodmVyc2lvbik7CisgICAgICAgICAgICByZXN1bHQgPSBSZWdHZXRWYWx1ZShoSW5zdGFsbFByb3BlcnRpZXNLZXkuZ2V0KCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVmVyc2lvbiIsIFJSRl9SVF9EV09SRCB8IGR3R2V0VmFsdWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZ2ZXJzaW9uLCAmdmVyc2lvbl9sZW4pOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQzMl90KXZlcnNpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbgorICAgICAgICAgICAgICAgIHJldHVybiBrVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByb2R1Y3REaXNwbGF5TmFtZSBub3QgZm91bmQgaW4gYW55IG9mIHRoZSBzdWJrZXlzLCBpdCdzIG5vdCBpbnN0YWxsZWQKKyAgICByZXR1cm4ga05vdEluc3RhbGxlZDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lONjQpCisjZXJyb3IgIk9ubHkgY29tcGlsZSB0aGlzIGZpbGUgd2hlbiB0YXJnZXR0aW5nIFdpbmRvd3MhIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBXaW5kb3dzSW5zdGFsbGVyCit7CitwdWJsaWM6CisgICAgLyoKKyAgICAgKiBHZXRWZXJzaW9uCisgICAgICoKKyAgICAgKiBTZWFyY2hlcworICAgICAqICJIS0VZX0xPQ0FMX01BQ0hJTkVcU09GVFdBUkVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cCisgICAgICogICAgSW5zdGFsbGVyXFVzZXJEYXRhXFMtMS01LTE4XFByb2R1Y3RzIgorICAgICAqIEZvciB0aGUgZmlyc3QgcHJvZHVjdCB3aXRoIGEgIkRpc3BsYXlOYW1lIiBzdHJpbmcgdGhhdCBtYXRjaGVzCisgICAgICogfHByb2R1Y3REaXNwbGF5TmFtZXwKKyAgICAgKiBSZXR1cm5zIHRoZSAiVmVyc2lvbiIgRFdPUkQgdmFsdWUgb2YgdGhhdCBwcm9kdWN0IGlmIGZvdW5kCisgICAgICogcmV0dXJucyBrTm90SW5zdGFsbGVkIGlmIHxwcm9kdWN0RGlzcGxheU5hbWV8IHdhcyBub3QgZm91bmQgaW4gYW55CisgICAgICogRGlzcGxheU5hbWUgdmFsdWVzCisgICAgICogcmV0dXJucyBrVW5rbm93biBpZiBhbiBlcnJvciBvY2N1cnJlZAorICAgICAqLworICAgIGVudW0geworICAgICAgICAvLyBMZWdhbCB2ZXJzaW9uIG51bWJlcnMgYXJlIHBvc2l0aXZlLiAgVGhlc2UgY29uc3RhbnRzIG11c3QgYmUKKyAgICAgICAgLy8gbm9uLXBvc2l0aXZlIHNvIChnZXRWZXJzaW9uIDwgbWluX3ZlcnNpb24pIHdpbGwgYmUgdHJ1ZSByZWdhcmRsZXNzIG9mCisgICAgICAgIC8vIHdoZXRoZXIgdGhlIHBhY2thZ2Ugc3RhdHVzIGlzIG5vdC1pbnN0YWxsZWQsIG9ic29sZXRlIG9yIHVua25vd24KKyAgICAgICAga05vdEluc3RhbGxlZCA9IDAsCisgICAgICAgIGtVbmtub3duID0gLTEsICAvLyBzb21lIGVycm9yIG9jY3VycmVkCisgICAgfTsKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRWZXJzaW9uKGNvbnN0IGNoYXIqIHByb2R1Y3REaXNwbGF5TmFtZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MTNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC93aW5kb3dzX2luc3RhbGxlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL3dpbmRvd3NfaW5zdGFsbGVyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6c3RyaW5nIHJlbWluZEZvcldpbmUodm9pZCkgeworICAgIGlmICghYmFzZTo6U3lzdGVtOjpnZXQoKS0+aXNSdW5uaW5nVW5kZXJXaW5lKCkpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gIkhhdmUgeW91IGV2ZXIgcnVuIGFuZHJvaWQvdGVzdHMvcHJlcGFyZS1yZWdpc3RyeS1mb3Itd2luZS5zaD8iOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChXaW5kb3dzSW5zdGFsbGVyLCBnZXRWZXJzaW9uKSB7CisgICAgRVhQRUNUX0VRKFdpbmRvd3NJbnN0YWxsZXI6OmtOb3RJbnN0YWxsZWQsCisgICAgICAgICAgICAgIFdpbmRvd3NJbnN0YWxsZXI6OmdldFZlcnNpb24oIkdvb2dsZSBQbGF5IikpIDw8IHJlbWluZEZvcldpbmUoKTsKKworICAgIC8vIEkga25vdyBvZiBubyBwYWNrYWdlIHRoYXQgY2FuIGJlIGRlcGVuZGVkIG9uIGFjcm9zcyBhbGwgV2luZG93cyB2ZXJzaW9ucworICAgIC8vIGVzcGVjaWFsbHkgY29uc2lkZXJpbmcgV2luZQorICAgIC8vIG5vdCByZWFsbHkgYSB1bml0IHRlc3QsIHZpc3VhbGx5IGluc3BlY3QgcmVzdWx0CisgICAgaW50MzJfdCB2ZXJzaW9uID0gV2luZG93c0luc3RhbGxlcjo6Z2V0VmVyc2lvbih1OCJJbnRlbMKuIEhhcmR3YXJlIEFjY2VsZXJhdGVkIEV4ZWN1dGlvbiBNYW5hZ2VyIik7CisgICAgcHJpbnRmKCJIQVhNIHZlcnNpb246ICUwOHhcbiIsIHZlcnNpb24pOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGFhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvQW5kcm9pZC5tawpAQCAtMCwwICsxLDkyIEBACisjIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBidWlsZCBmaWxlIGZvciB0aGUgQW5kcm9pZCBIVyBPcGVuR0wgRVMgZW11bGF0aW9uCisjIGluIEFuZHJvaWQuCisjCisjIFlvdSBtdXN0IGRlZmluZSBCVUlMRF9FTVVMQVRPUl9IT1NUX09QRU5HTCB0byAndHJ1ZScgaW4geW91ciBlbnZpcm9ubWVudCB0bworIyBidWlsZCB0aGUgZm9sbG93aW5nIGZpbGVzLgorIworIyBUb3AtbGV2ZWwgZm9yIGFsbCBtb2R1bGVzCitFTVVHTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0VNVUdMX09MRF9MT0NBTF9QQVRIIDo9ICQoTE9DQUxfUEFUSCkKKworIyBEaXJlY3RvcnkgY29udGFpbmluZyBjb21tb24gaGVhZGVycyB0aGF0IGFyZSBwYXJ0IG9mIEVtdUdMJ3MgcHVibGljIEFQSS4KKyMgVGhpcyBpcyBhbHdheXMgc2V0IHRvIGEgbW9kdWxlJ3MgTE9DQUxfQ19JTkNMVURFUy4gU2VlIHRoZSBkZWZpbml0aW9uIG9mCisjIGVtdWdsLWJlZ2luLW1vZHVsZSBpbiBjb21tb24ubWsKK0VNVUdMX0NPTU1PTl9JTkNMVURFUyA6PSAkKEVNVUdMX0lOQ0xVREVTKQorCisjIGNvbW1vbiBjZmxhZ3MgdXNlZCBieSBzZXZlcmFsIG1vZHVsZXMKKyMgVGhpcyBpcyBhbHdheXMgc2V0IHRvIGEgbW9kdWxlJ3MgTE9DQUxfQ0ZMQUdTCisjIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBlbXVnbC1iZWdpbi1tb2R1bGUgaW4gY29tbW9uLm1rCisKKyMgTmVlZGVkIHRvIGVuc3VyZSBTSVpFX01BWCBpcyBwcm9wZXJseSBkZWZpbmVkIHdoZW4gaW5jbHVkaW5nIDxzdGRpbnQuaD4KK0VNVUdMX0NPTU1PTl9DRkxBR1MgKz0gLURfX1NURENfTElNSVRfTUFDUk9TPTEKKworaWZuZXEgKCwkKHN0cmlwICQoQlVJTERfREVCVUcpKSkKK0VNVUdMX0NPTU1PTl9DRkxBR1MgKz0gLURFTVVHTF9ERUJVRz0xCitlbmRpZgorCitFTVVHTF9DT01NT05fQ0ZMQUdTICs9IC1ERU1VR0xfQlVJTEQ9MQoraWZlcSAobGludXgsJChCVUlMRF9UQVJHRVRfT1MpKQorRU1VR0xfQ09NTU9OX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aW50ZXJuYWwKK2VuZGlmCitpZmVxIChkYXJ3aW4sJChCVUlMRF9UQVJHRVRfT1MpKQorRU1VR0xfQ09NTU9OX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCitlbmRpZgorCisjIEluY2x1ZGUgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIHRoZSBtb2R1bGVzIGluY2x1ZGVkIGxhdGVyCisjIGluIHRoaXMgYnVpbGQgZmlsZS4gVGhpcyBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBhbGwgdXNlZnVsCisjIGVtdWdsLXh4eHggZnVuY3Rpb25zLgorIworaW5jbHVkZSAkKEVNVUdMX1BBVEgpL2NvbW1vbi5taworCisjIElNUE9SVEFOVDogT1JERVIgSVMgQ1JVQ0lBTCBIRVJFCisjCisjIEZvciB0aGUgaW1wb3J0L2V4cG9ydCBmZWF0dXJlIHRvIHdvcmsgcHJvcGVybHksIHlvdSBtdXN0IGluY2x1ZGUKKyMgbW9kdWxlcyBiZWxvdyBpbiBjb3JyZWN0IG9yZGVyLiBUaGF0IGlzLCBpZiBtb2R1bGUgQiBkZXBlbmRzIG9uCisjIG1vZHVsZSBBLCB0aGVuIGl0IG11c3QgYmUgaW5jbHVkZWQgYWZ0ZXIgbW9kdWxlIEEgYmVsb3cuCisjCisjIFRoaXMgZW5zdXJlcyB0aGF0IGFueXRoaW5nIGV4cG9ydGVkIGJ5IG1vZHVsZSBBIHdpbGwgYmUgY29ycmVjdGx5CisjIGJlIGltcG9ydGVkIGJ5IG1vZHVsZSBCIHdoZW4gaXQgaXMgZGVjbGFyZWQuCisjCisjIE5vdGUgdGhhdCB0aGUgYnVpbGQgc3lzdGVtIHdpbGwgY29tcGxhaW4gaWYgeW91IHRyeSB0byBpbXBvcnQgYQorIyBtb2R1bGUgdGhhdCBoYXNuJ3QgYmVlbiBkZWNsYXJlZCB5ZXQgYW55d2F5LgorIworCisjIFJlcXVpcmVkIGJ5IG91ciB1bml0cyB0ZXN0LgoraW5jbHVkZSAkKEVNVUdMX1BBVEgpL2dvb2dsZXRlc3QubWsKKworIyBGaXJzdCwgYnVpbGQgdGhlIGVtdWdlbiBob3N0IHNvdXJjZS1nZW5lcmF0aW9uIHRvb2wKKyMKKyMgSXQgd2lsbCBiZSB1c2VkIGJ5IG90aGVyIG1vZHVsZXMgdG8gZ2VuZXJhdGUgd2lyZSBwcm90b2NvbCBlbmNvZGUvZGVjb2RlcgorIyBzb3VyY2UgZmlsZXMgKHNlZSBhbGwgZW11Z2wtZ2VuLWRlY29kZXIvZW5jb2RlciBpbiBjb21tb24ubWspCisjCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC90b29scy9lbXVnZW4vQW5kcm9pZC5taworCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvc2hhcmVkL2VtdWdsL2NvbW1vbi9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0FuZHJvaWQubWsKKworaWZlcSAodHJ1ZSwkKEVNVUxBVE9SX1VTRV9BTkdMRSkpCisjIEFsdGVybmF0aXZlIGdyYXBoaWNzIHRyYW5zbGF0aW9uIChHVCkgaW1wbGVtZW50YXRpb24sIHN0cmlwcGVkIG9mZgorIyBhbmQgYWRqdXN0IGZyb20gdGhlIGVxdWl2YWxlbnQgbW9kIGluIHRoZSBBUkMgcHJvamVjdC4KKyMgVGhpcyBHVCBhY3RzIGFzIGEgdGhpbiB3cmFwcGVyICsgR0xFU3YxLXRvLXYyIHRyYW5zbGF0b3IKKyMgYW5kIGZvcndhcmRzIEdMRVMgY2FsbHMgdG8gdW5kZXJseWluZyBHTEVTIEFQSSAoZS5nLiBBTkdMRSkKKyMKK2luY2x1ZGUgJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvZ3JhcGhpY3NfdHJhbnNsYXRpb24vY29tbW9uL0FuZHJvaWQubWsKK2luY2x1ZGUgJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvZ3JhcGhpY3NfdHJhbnNsYXRpb24vZ2xlcy9BbmRyb2lkLm1rCitlbmRpZgorCisjIEhvc3Qgc3RhdGljIGxpYnJhcmllcworaW5jbHVkZSAkKEVNVUdMX1BBVEgpL2hvc3QvbGlicy9HTEVTdjFfZGVjL0FuZHJvaWQubWsKK2luY2x1ZGUgJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvR0xFU3YyX2RlYy9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL0FuZHJvaWQubWsKK2luY2x1ZGUgJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0FuZHJvaWQubWsKK2luY2x1ZGUgJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9BbmRyb2lkLm1rCisKKyMgSG9zdCBzaGFyZWQgbGlicmFyaWVzCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9BbmRyb2lkLm1rCitpbmNsdWRlICQoRU1VR0xfUEFUSCkvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvQW5kcm9pZC5taworCitMT0NBTF9QQVRIIDo9ICQoRU1VR0xfT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvREVTSUdOIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL0RFU0lHTgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjZkNGUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL0RFU0lHTgpAQCAtMCwwICsxLDYxNSBAQAorQW5kcm9pZCBIYXJkd2FyZSBPcGVuR0xFUyBlbXVsYXRpb24gZGVzaWduIG92ZXJ2aWV3Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uOgorLS0tLS0tLS0tLS0tLQorCitIYXJkd2FyZSBHTEVTIGVtdWxhdGlvbiBpbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgbWl4CitvZiBjb21wb25lbnRzLCB3aGljaCBhcmU6CisKKyAgLSBTZXZlcmFsIGhvc3QgInRyYW5zbGF0b3IiIGxpYnJhcmllcy4gVGhleSBpbXBsZW1lbnQgdGhlIEVHTCwgR0xFUyAxLjEgYW5kCisgICAgR0xFUyAyLjAgQUJJcyBkZWZpbmVkIGJ5IEtocm9ub3MsIGFuZCB0cmFuc2xhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAgICBjYWxscyBpbnRvIGNhbGxzIHRvIHRoZSBhcHByb3ByaWF0ZSBkZXNrdG9wIEFQSXMsIGkuZS46CisKKyAgICAgIC0gR0xYIChMaW51eCksIEFHTCAoT1MgWCkgb3IgV0dMIChXaW5kb3dzKSBmb3IgRUdMCisgICAgICAtIGRlc2t0b3AgR0wgMi4wIGZvciBHTEVTIDEuMSBhbmQgR0xFUyAyLjAKKworICAgICAgICAgX19fX19fX19fICAgICAgICAgICAgX19fX19fX19fXyAgICAgICAgICBfX19fX19fX19fCisgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgIHxUUkFOU0xBVE9SICAgICAgICAgIHxUUkFOU0xBVE9SfCAgICAgICAgfFRSQU5TTEFUT1J8ICAgICBIT1NUCisgICAgICAgIHwgICBFR0wgICB8ICAgICAgICAgIHwgR0xFUyAxLjEgfCAgICAgICAgfCBHTEVTIDIuMCB8ICAgICBUUkFOU0xBVE9SCisgICAgICAgIHxfX19fX19fX198ICAgICAgICAgIHxfX19fX19fX19ffCAgICAgICAgfF9fX19fX19fX198ICAgICBMSUJSQVJJRVMKKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLSAtIC0gfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0KKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBfX19fdl9fX18gICAgICAgICAgICBfX19fdl9fX19fICAgICAgICAgIF9fX19fdl9fX18gICAgICBIT1NUCisgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICBTWVNURU0KKyAgICAgICAgfCAgIEdMWCAgIHwgICAgICAgICAgfCAgR0wgMi4wICB8ICAgICAgICB8ICBHTCAyLjAgIHwgICAgIExJQlJBUklFUworICAgICAgICB8X19fX19fX19ffCAgICAgICAgICB8X19fX19fX19fX3wgICAgICAgIHxfX19fX19fX19ffAorCisKKworICAtIFNldmVyYWwgc3lzdGVtIGxpYnJhcmllcyBpbnNpZGUgdGhlIGVtdWxhdGVkIGd1ZXN0IHN5c3RlbSB0aGF0IGltcGxlbWVudAorICAgIHRoZSBzYW1lIEVHTCAvIEdMRVMgMS4xIGFuZCBHTEVTIDIuMCBBQklzLgorCisgICAgVGhleSBjb2xsZWN0IHRoZSBzZXF1ZW5jZSBvZiBFR0wvR0xFUyBmdW5jdGlvbiBjYWxscyBhbmQgdHJhbnNsYXRlIHRoZW4KKyAgICBpbnRvIGEgY3VzdG9tIHdpcmUgcHJvdG9jb2wgc3RyZWFtIHRoYXQgaXMgc2VudCB0byB0aGUgZW11bGF0b3IgcHJvZ3JhbQorICAgIHRocm91Z2ggYSBoaWdoLXNwZWVkIGNvbW11bmljYXRpb24gY2hhbm5lbCBjYWxsZWQgYSAiUUVNVSBQaXBlIi4KKworICAgIEZvciBub3csIGFsbCB5b3UgbmVlZCB0byBrbm93IGlzIHRoYXQgdGhlIHBpcGUgaXMgaW1wbGVtZW50ZWQgd2l0aCBhCisgICAgY3VzdG9tIGtlcm5lbCBkcml2ZXIsIGFuZCBwcm92aWRlcyBmb3IgX3ZlcnlfIGZhc3QgYmFuZHdpZHRoLiBBbGwgcmVhZCgpCisgICAgYW5kIHdyaXRlcygpIGZyb20vdG8gdGhlIHBpcGVzIGFyZSBlc3NlbnRpYWxseSBpbnN0YW50YW5lb3VzIGZyb20gdGhlCisgICAgZ3Vlc3QncyBwb2ludCBvZiB2aWV3LgorCisKKyAgICAgICAgIF9fX19fX19fXyAgICAgICAgICAgIF9fX19fX19fX18gICAgICAgICAgX19fX19fX19fXworICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgfAorICAgICAgICB8RU1VTEFUSU9OfCAgICAgICAgICB8RU1VTEFUSU9OIHwgICAgICAgIHxFTVVMQVRJT04gfCAgICAgR1VFU1QKKyAgICAgICAgfCAgIEVHTCAgIHwgICAgICAgICAgfCBHTEVTIDEuMSB8ICAgICAgICB8IEdMRVMgMi4wIHwgICAgIFNZU1RFTQorICAgICAgICB8X19fX19fX19ffCAgICAgICAgICB8X19fX19fX19fX3wgICAgICAgIHxfX19fX19fX19ffCAgICAgTElCUkFSSUVTCisgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICAgICAgIC0gLSAtIHwgLSAtIC0gLSAtIC0gLSAtIC0gIHwgLSAtIC0gLSAtIC0gLSAtIC0gIHwgLSAtIC0gLSAtCisgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgX19fX3ZfX19fX19fX19fX19fX19fX19fX3ZfX19fX19fX19fX19fX19fX19fX3ZfX19fICAgICAgR1VFU1QKKyAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIEtFUk5FTAorICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICBRRU1VIFBJUEUgICAgICAgICAgICAgICAgICAgfAorICAgICAgICB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1VTEFUT1IKKworICAtIFNwZWNpZmljIGNvZGUgaW5zaWRlIHRoZSBlbXVsYXRvciBwcm9ncmFtIHRoYXQgaXMgY2FwYWJsZSBvZiB0cmFuc21pdHRpbmcKKyAgICB0aGUgd2lyZSBwcm90b2NvbCBzdHJlYW0gdG8gYSBzcGVjaWFsIHJlbmRlcmluZyBsaWJyYXJ5IG9yIHByb2Nlc3MgKGNhbGxlZAorICAgIHRoZSAicmVuZGVyZXIiIGhlcmUpLCB3aGljaCB1bmRlcnN0YW5kcyB0aGUgZm9ybWF0LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIFBST1RPQ09MIEJZVEUgU1RSRUFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX192X19fX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIEVNVUxBVE9SIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBVTk1PRElGSUVEIFBST1RPQ09MIEJZVEUgU1RSRUFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX192X19fX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFJFTkRFUkVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX3wKKworCisgIC0gVGhlIHJlbmRlcmVyIGRlY29kZXMgdGhlIEVHTC9HTEVTIGNvbW1hbmRzIGZyb20gdGhlIHdpcmUKKyAgICBwcm90b2NvbCBzdHJlYW0sIGFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIHRyYW5zbGF0b3IgbGlicmFyaWVzCisgICAgYXBwcm9wcmlhdGVseS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIFBST1RPQ09MIEJZVEUgU1RSRUFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX192X19fX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFJFTkRFUkVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgIHwKKyAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0rIHwgICstLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIF9fX192X19fXyAgICAgICAgICAgIF9fX3ZfX19fX18gICAgICAgICAgX19fX3ZfX19fXworICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgfCAgICAgSE9TVAorICAgICAgICB8VFJBTlNMQVRPUiAgICAgICAgICB8VFJBTlNMQVRPUnwgICAgICAgIHxUUkFOU0xBVE9SfCAgICAgSE9TVAorICAgICAgICB8ICAgRUdMICAgfCAgICAgICAgICB8IEdMRVMgMS4xIHwgICAgICAgIHwgR0xFUyAyLjAgfCAgICAgVFJBTlNMQVRPUgorICAgICAgICB8X19fX19fX19ffCAgICAgICAgICB8X19fX19fX19fX3wgICAgICAgIHxfX19fX19fX19ffCAgICAgTElCUkFSSUVTCisKKworCisgIC0gSW4gcmVhbGl0eSwgdGhlIHByb3RvY29sIHN0cmVhbSBmbG93cyBpbiBib3RoIGRpcmVjdGlvbnMsIGV2ZW4gdGhvdWdoIG1vc3QKKyAgICBvZiB0aGUgY29tbWFuZHMgcmVzdWx0IGluIGRhdGEgZ29pbmcgZnJvbSB0aGUgZ3Vlc3QgdG8gdGhlIGhvc3QuIEEgY29tcGxldGUKKyAgICBwaWN0dXJlIG9mIHRoZSBlbXVsYXRpb24gd291bGQgdGh1cyBiZToKKworCisKKworCisgICAgICAgICBfX19fX19fX18gICAgICAgICAgICBfX19fX19fX19fICAgICAgICAgIF9fX19fX19fX18KKyAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgIHwKKyAgICAgICAgfEVNVUxBVElPTnwgICAgICAgICAgfEVNVUxBVElPTiB8ICAgICAgICB8RU1VTEFUSU9OIHwgICAgIEdVRVNUCisgICAgICAgIHwgICBFR0wgICB8ICAgICAgICAgIHwgR0xFUyAxLjEgfCAgICAgICAgfCBHTEVTIDIuMCB8ICAgICBTWVNURU0KKyAgICAgICAgfF9fX19fX19fX3wgICAgICAgICAgfF9fX19fX19fX198ICAgICAgICB8X19fX19fX19fX3wgICAgIExJQlJBUklFUworICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLSAtIC0gfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0KKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBfX19fdl9fX19fX19fX19fX19fX19fX19fdl9fX19fX19fX19fX19fX19fX19fdl9fX18gICAgICBHVUVTVAorICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgS0VSTkVMCisgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIFFFTVUgUElQRSAgICAgICAgICAgICAgICAgICB8CisgICAgICAgIHxfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC18LSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBQUk9UT0NPTCBCWVRFIFNUUkVBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fdl9fX19fCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBFTVVMQVRPUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX198CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgVU5NT0RJRklFRCBQUk9UT0NPTCBCWVRFIFNUUkVBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fdl9fX19fCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBSRU5ERVJFUiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX198CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBeICBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8ICB8CisgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKyB8ICArLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBfX19fdl9fX18gICAgICAgICAgICBfX192X19fX19fICAgICAgICAgIF9fX192X19fX18KKyAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgIHwKKyAgICAgICAgfFRSQU5TTEFUT1IgICAgICAgICAgfFRSQU5TTEFUT1J8ICAgICAgICB8VFJBTlNMQVRPUnwgICAgIEhPU1QKKyAgICAgICAgfCAgIEVHTCAgIHwgICAgICAgICAgfCBHTEVTIDEuMSB8ICAgICAgICB8IEdMRVMgMi4wIHwgICAgIFRSQU5TTEFUT1IKKyAgICAgICAgfF9fX19fX19fX3wgICAgICAgICAgfF9fX19fX19fX198ICAgICAgICB8X19fX19fX19fX3wgICAgIExJQlJBUklFUworICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgLSAtIC0gfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0gLSAtIC0gLSAgfCAtIC0gLSAtIC0KKyAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBfX19fdl9fX18gICAgICAgICAgICBfX19fdl9fX19fICAgICAgICAgIF9fX19fdl9fX18gICAgICBIT1NUIAorICAgICAgICB8ICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgfCAgICAgU1lTVEVNCisgICAgICAgIHwgICBHTFggICB8ICAgICAgICAgIHwgIEdMIDIuMCAgfCAgICAgICAgfCAgR0wgMi4wICB8ICAgICBMSUJSQVJJRVMKKyAgICAgICAgfF9fX19fX19fX3wgICAgICAgICAgfF9fX19fX19fX198ICAgICAgICB8X19fX19fX19fX3wKKworICAgIChOT1RFOiAnR0xYJyBpcyBmb3IgTGludXggb25seSwgcmVwbGFjZSAnQUdMJyBvbiBPUyBYLCBhbmQgJ1dHTCcgb24gV2luZG93cykuCisKKworTm90ZSB0aGF0LCBpbiB0aGUgYWJvdmUgZ3JhcGhpY3MsIG9ubHkgdGhlIGhvc3Qgc3lzdGVtIGxpYnJhcmllcyBhdCB0aGUgYm90dG9tCithcmUgX25vdF8gcHJvdmlkZWQgYnkgQW5kcm9pZC4KKworCitEZXNpZ24gUmVxdWlyZW1lbnRzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFib3ZlIGRlc2lnbiBjb21lcyBmcm9tIHNldmVyYWwgaW1wb3J0YW50IHJlcXVpcmVtZW50cyB0aGF0IHdlcmUgZGVjaWRlZAorZWFybHkgaW4gdGhlIHByb2plY3Q6CisKKzEgLSBUaGUgYWJpbGl0eSB0byBydW4gdGhlIHJlbmRlcmVyIGluIGEgc2VwYXJhdGUgcHJvY2VzcyBmcm9tIHRoZSBlbXVsYXRvcgorICAgIGl0c2VsZiBpcyBpbXBvcnRhbnQuCisKKyAgICBGb3IgdmFyaW91cyBwcmFjdGljYWwgcmVhc29ucywgd2UgcGxhbiB0byBjb21wbGV0ZWx5IHNlcGFyYXRlIHRoZSBjb3JlIFFFTVUKKyAgICBlbXVsYXRpb24gZnJvbSB0aGUgVUkgd2luZG93IGJ5IHVzaW5nIHR3byBkaXN0aW5jdCBwcm9jZXNzZXMuIEFzIHN1Y2gsIHRoZQorICAgIHJlbmRlcmVyIHdpbGwgYmUgaW1wbGVtZW50ZWQgYXMgYSBsaWJyYXJ5IGluc2lkZSB0aGUgVUkgcHJvZ3JhbSwgYnV0IHdpbGwKKyAgICBuZWVkIHRvIHJlY2VpdmUgcHJvdG9jb2wgYnl0ZXMgZnJvbSB0aGUgUUVNVSBwcm9jZXNzLgorCisgICAgVGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCB3aWxsIGJlIGVpdGhlciBhIGZhc3QgVW5peCBzb2NrZXQgb3IgYSBXaW4zMgorICAgIG5hbWVkIHBpcGUgYmV0d2VlbiB0aGVzZSB0d28uIEEgc2hhcmVkIG1lbW9yeSBzZWdtZW50IHdpdGggYXBwcm9wcmlhdGUKKyAgICBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBtaWdodCBhbHNvIGJlIHVzZWQgaWYgcGVyZm9ybWFuY2UgYmVjb21lcworICAgIGFuIGlzc3VlLgorCisgICAgVGhpcyBleHBsYWlucyB3aHkgdGhlIGVtdWxhdG9yIGRvZXNuJ3QgYWx0ZXIgb3IgZXZlbiB0cnkgdG8gcGFyc2UgdGhlCisgICAgcHJvdG9jb2wgYnl0ZSBzdHJlYW0uIEl0IG9ubHkgYWN0cyBhcyBhIGR1bWIgcHJveHkgYmV0d2VlbiB0aGUgZ3Vlc3QKKyAgICBzeXN0ZW0gYW5kIHRoZSByZW5kZXJlci4gVGhpcyBhbHNvIGF2b2lkcyBhZGRpbmcgbG90cyBvZiBHTEVTLXNwZWNpZmljCisgICAgY29kZSBpbnNpZGUgdGhlIFFFTVUgY29kZSBiYXNlIHdoaWNoIGlzIHRlcnJpYmx5IGNvbXBsZXguCisKKzIgLSBUaGUgYWJpbGl0eSB0byB1c2UgdmVuZG9yLXNwZWNpZmljIGRlc2t0b3AgRUdML0dMRVMgbGlicmFyaWVzIGlzCisgICAgaW1wb3J0YW50LgorCisgICAgR1BVIHZlbmRvcnMgbGlrZSBOVmlkaWEsIEFNRCBvciBBUk0gYWxsIHByb3ZpZGUgaG9zdCB2ZXJzaW9ucyBvZiB0aGUKKyAgICBFR0wvR0xFUyBsaWJyYXJpZXMgdGhhdCBlbXVsYXRlIHRoZWlyIHJlc3BlY3RpdmllIGVtYmVkZGVkIGdyYXBoaWNzCisgICAgY2hpcHNldC4KKworICAgIFRoZSByZW5kZXJlciBsaWJyYXJ5IGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSB0aGVzZSBpbnN0ZWFkIG9mIHRoZQorICAgIHRyYW5zbGF0b3IgbGlicmFyaWVzIHByb3ZpZGVkIHdpdGggdGhpcyBwcm9qZWN0LiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8KKyAgICBtb3JlIGFjY3VyYXRlbHkgZW11bGF0ZSB0aGUgYmVoYXZpb3VyIG9mIHNwZWNpZmljIGRldmljZXMuCisKKyAgICBNb3Jlb3ZlciwgdGhlc2UgdmVuZG9yIGxpYnJhcmllcyB0eXBpY2FsbHkgZXhwb3NlIHZlbmRvci1zcGVjaWZpYworICAgIGV4dGVuc2lvbnMgdGhhdCBhcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSB0cmFuc2xhdG9yIGxpYnJhcmllcy4gV2UgY2Fubm90CisgICAgZXhwb3NlIHRoZW0gd2l0aG91dCBtb2RpZnlpbmcgb3VyIGNvZGUsIGJ1dCBpdCdzIGltcG9ydGFudCB0byBiZSBhYmxlCisgICAgdG8gZG8gc28gd2l0aG91dCB0b28gbXVjaCBwYWluLgorCisKK0NvZGUgb3JnYW5pemF0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGNvbXBvbmVudHMgYWJvdmUgaXMgc3ByZWFkIG92ZXIgbXVsdGlwbGUgZGlyZWN0b3JpZXMKK2luIHRoZSBBbmRyb2lkIHNvdXJjZSB0cmVlczoKKworICAtIFRoZSBlbXVsYXRvciBzb3VyY2VzIGFyZSB1bmRlciAkQU5EUk9JRC9leHRlcm5hbC9xZW11LCB3aGljaCB3ZSdsbAorICAgIGNhbGwgJFFFTVUgaW4gdGhlIHJlc3Qgb2YgdGhpcyBkb2N1bWVudC4KKworICAtIFRoZSBndWVzdCBsaWJyYXJpZXMgYXJlIHVuZGVyCisgICAgJEFORFJPSUQvZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvb3BlbmdsLCB3aGljaCB3ZSdsbCBjYWxsICRFTVVHTF9HVUVTVAorCisgIC0gVGhlIGhvc3QgcmVuZGVyZXIgYW5kIHRyYW5zbGF0b3IgbGlicmFyaWVzIGFyZSB1bmRlcgorICAgICRRRU1VL2FuZHJvaWQvYW5kcm9pZC1lbXVnbCwgd2hpY2ggd2UnbGwgY2FsbCAkRU1VR0xfSE9TVAorCisgIC0gVGhlIFFFTVUgUGlwZSBrZXJuZWwgZHJpdmVyIGlzIHVuZGVyICRLRVJORUwvZHJpdmVycy9taXNjL3FlbXVwaXBlICgzLjQpCisgICAgb3IgJEtFUk5FTC9kcml2ZXJzL3BsYXRmb3JtL2dvbGRmaXNoL2dvbGRmaXNoX3BpcGUuYyAoMy4xMCkKKworV2hlcmUgJEFORFJPSUQgaXMgdGhlIHRvcCBvZiB0aGUgb3Blbi1zb3VyY2UgQW5kcm9pZCBzb3VyY2UgdHJlZSwgYW5kCiskS0VSTkVMIGlzIHRoZSB0b3Agb2YgdGhlIHFlbXUtc3BlY2lmaWMga2VybmVsIHNvdXJjZSB0cmVlICh1c2luZyBvbmUKK29mIHRoZSBhbmRyb2lkLWdvbGRmaXNoLXh4eHggYnJhbmNoZXMgaGVyZSkuCisKK1RoZSBlbXVsYXRvciBzb3VyY2VzIHJlbGF0ZWQgdG8gdGhpcyBwcm9qZWN0cyBhcmU6CisKKyAgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvcGlwZS5jIC0+IGltcGxlbWVudHMgUUVNVSBwaXBlIHZpcnR1YWwgaGFyZHdhcmUuCisgICAkUUVNVS9hbmRyb2lkL29wZW5nbGVzLmMgICAgICAgICAtPiBpbXBsZW1lbnRzIEdMRVMgaW5pdGlhbGl6YXRpb24uCisgICAkUUVNVS9hbmRyb2lkL2h3LXBpcGUtbmV0LmMgICAgICAtPiBpbXBsZW1lbnRzIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwKKyAgICAgICAgICAgIGJldHdlZW4gdGhlIFFFTVUgUGlwZSBhbmQgdGhlIHJlbmRlcmVyIGxpYnJhcnkKKworVGhlIG90aGVyIHNvdXJjZXMgYXJlOgorCisgICAkRU1VR0xfR1VFU1Qvc3lzdGVtICAgLT4gc3lzdGVtIGxpYnJhcmllcworICAgJEVNVUdMX0dVRVNUL3NoYXJlZCAgIC0+IGd1ZXN0IGNvcHkgb2Ygc2hhcmVkIGxpYnJhcmllcworICAgJEVNVUdMX0dVRVNUL3Rlc3RzICAgIC0+IHZhcmlvdXMgdGVzdCBwcm9ncmFtcworCisgICAkRU1VR0xfSE9TVC9ob3N0ICAgICAgLT4gaG9zdCBsaWJyYXJpZXMgKHRyYW5zbGF0b3IgKyByZW5kZXJlcikKKyAgICRFTVVHTF9IT1NUL3NoYXJlZCAgICAtPiBob3N0IGNvcHkgb2Ygc2hhcmVkIGxpYnJhcmllcworCitUaGUgcmVhc29uIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFyZW4ndCBhY3R1YWxseSBzaGFyZWQgaXMgaGlzdG9yaWNhbDogYXQgb25lCitwb2ludCBib3RoIGd1ZXN0IGFuZCBob3N0IGNvZGUgbGl2ZWQgaW4gdGhlIHNhbWUgcGxhY2UuIFRoYXQgdHVybmVkIG91dCB0byBiZQoraW1wcmFjdGljYWwgd2l0aCB0aGUgd2F5IHRoZSBBbmRyb2lkIFNESyBpcyBicmFuY2hlZCwgYW5kIGRpZG4ndCBzdXBwb3J0IHRoZQorcmVxdWlyZW1lbnQgdGhhdCBhIHNpbmdsZSBlbXVsYXRvciBiaW5hcnkgYmUgYWJsZSB0byBydW4gc2V2ZXJhbCByZWxlYXNlcworb2YgQW5kcm9pZC4KKworCitUcmFuc2xhdG9yIGxpYnJhcmllczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgdGhyZWUgdHJhbnNsYXRvciBob3N0IGxpYnJhcmllcyBwcm92aWRlZCBieSB0aGlzIHByb2plY3Q6CisKKyAgIGxpYkVHTF90cmFuc2xhdG9yICAgICAgIC0+IEVHTCAxLjIgdHJhbnNsYXRpb24KKyAgIGxpYkdMRVNfQ01fdHJhbnNsYXRvciAgIC0+IEdMRVMgMS4xIHRyYW5zbGF0aW9uCisgICBsaWJHTEVTX1YyX3RyYW5zbGF0b3IgICAtPiBHTEVTIDIuMCB0cmFuc2xhdGlvbgorCitUaGUgZnVsbCBuYW1lIG9mIHRoZSBsaWJyYXJ5IHdpbGwgZGVwZW5kIG9uIHRoZSBob3N0IHN5c3RlbS4KK0ZvciBzaW1wbGljaXR5LCBvbmx5IHRoZSBsaWJyYXJ5IG5hbWUgc3VmZml4IHdpbGwgY2hhbmdlIChpLmUuIHRoZQorJ2xpYicgcHJlZml4IGlzIG5vdCBkcm9wcGVkIG9uIFdpbmRvd3MpLCBpLmUuOgorCisgICBsaWJFR0xfdHJhbnNsYXRvci5zbyAgICAtPiBmb3IgTGludXgKKyAgIGxpYkVHTF90cmFuc2xhdG9yLmR5bGliIC0+IGZvciBPUyBYCisgICBsaWJFR0xfdHJhbnNsYXRvci5kbGwgICAtPiBmb3IgV2luZG93cworCitUaGUgc291cmNlIGNvZGUgZm9yIHRoZXNlIGxpYnJhcmllcyBpcyBsb2NhdGVkIHVuZGVyIHRoZSBmb2xsb3dpbmcKK3BhdGggaW4gdGhlIEFuZHJvaWQgc291cmNlIHRyZWU6CisKKyAgICRFTVVHTF9IT1NUL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTAorICAgJEVNVUdMX0hPU1QvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTQorICAgJEVNVUdMX0hPU1QvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMgorCitUaGUgdHJhbnNsYXRvciBsaWJyYXJpZXMgYWxzbyB1c2UgYSBjb21tb24gcm91dGluZXMgZGVmaW5lZCB1bmRlcjoKKworICAgJEVNVUdMX0hPU1QvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24KKworCitXaXJlIFByb3RvY29sIE92ZXJpZXc6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSAid2lyZSBwcm90b2NvbCIgaXMgaW1wbGVtZW50ZWQgYXMgZm9sbG93czoKKworICAtIEVHTC9HTEVTIGZ1bmN0aW9uIGNhbGxzIGFyZSBkZXNjcmliZWQgdGhyb3VnaCBzZXZlcmFsICJzcGVjaWZpY2F0aW9uIgorICAgIGZpbGVzLCB3aGljaCBkZXNjcmliZXMgdGhlIHR5cGVzLCBmdW5jdGlvbiBzaWduYXR1cmVzIGFuZCB2YXJpb3VzCisgICAgYXR0cmlidXRlcyBmb3IgZWFjaCBvbmUgb2YgdGhlbS4KKworICAtIFRoZXNlIGZpbGVzIGFyZSByZWFkIGJ5IGEgdG9vbCBjYWxsZWQgImVtdWdlbiIgd2hpY2ggZ2VuZXJhdGVzIEMKKyAgICBzb3VyY2UgZmlsZXMgYW5kIGhlYWRlcnMgYmFzZWQgb24gdGhlIHNwZWNpZmljYXRpb24uIFRoZXNlIGNvcnJlc3BvbmQKKyAgICB0byBib3RoIGVuY29kaW5nLCBkZWNvZGluZyBhbmQgIndyYXBwZXJzIiAobW9yZSBvbiB0aGlzIGxhdGVyKS4KKworICAtIFN5c3RlbSAiZW5jb2RlciIgc3RhdGljIGxpYnJhcmllcyBhcmUgYnVpbHQgdXNpbmcgc29tZSBvZiB0aGVzZSBnZW5lcmF0ZWQKKyAgICBmaWxlcy4gVGhleSBjb250YWluIGNvZGUgdGhhdCBjYW4gc2VyaWFsaXplIEVHTC9HTEVTIGNhbGxzIGludG8gc2ltcGxlCisgICAgYnl0ZSBtZXNzYWdlcyBhbmQgc2VuZCBpdCB0aHJvdWdoIGEgZ2VuZXJpYyAiSU9TdHJlYW0iIG9iamVjdC4KKworICAtIEhvc3QgImRlY29kZXIiIHN0YXRpYyBsaWJyYXJpZXMgYXJlIGFsc28gYnVpbHQgdXNpbmcgc29tZSBvZiB0aGVzZQorICAgIGdlbmVyYXRlZCBmaWxlcy4gVGhlaXIgY29kZSByZXRyaWV2ZXMgYnl0ZSBtZXNzYWdlcyBmcm9tIGFuICJJT1N0cmVhbSIKKyAgICBvYmplY3QsIGFuZCB0cmFuc2xhdGVzIHRoZW0gaW50byBmdW5jdGlvbiBjYWxsYmFja3MuCisKK0lPU3RyZWFtIGFic3RyYWN0aW9uOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoZSAiSU9TdHJlYW0iIGlzIGEgdmVyeSBzaW1wbGUgYWJzdHJhY3QgY2xhc3MgdXNlZCB0byBzZW5kIGJ5dGUgbWVzc2FnZXMKK2JvdGggaW4gdGhlIGd1ZXN0IGFuZCBob3N0LiBJdCBpcyBkZWZpbmVkIHRocm91Z2ggYSBzaGFyZWQgaGVhZGVyIHVuZGVyCiskRU1VR0wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9JT1N0cmVhbS5oCisKK05vdGUgdGhhdCBkZXNwaXRlIHRoZSBwYXRoLCB0aGlzIGhlYWRlciBpcyBpbmNsdWRlZCBieSAqYm90aCogaG9zdCBhbmQgZ3Vlc3QKK3NvdXJjZSBjb2RlLiBUaGUgbWFpbiBpZGVhIGFyb3VuZCBJT1N0cmVhbSdzIGRlc2lnbiBpcyB0aGF0IHRvIHNlbmQgYSBtZXNzYWdlLAorb25lIGRvZXMgdGhlIGZvbGxvd2luZzoKKworICAxLyBjYWxsIHN0cmVhbS0+YWxsb2NCdWZmZXIoc2l6ZSksIHdoaWNoIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgYQorICAgICBtZW1vcnkgYnVmZmVyIG9mIGF0IGxlYXN0ICdzaXplJyBieXRlcy4KKworICAyLyB3cml0ZSB0aGUgY29udGVudCBvZiB0aGUgc2VyaWFsaXplZCBjb21tYW5kICh1c3VhbGx5IGEgaGVhZGVyICsgc29tZQorICAgICBwYXlsb2FkKSBkaXJlY3RseSBpbnRvIHRoZSBidWZmZXIKKworICAzLyBjYWxsIHN0cmVhbS0+Y29tbWl0QnVmZmVyKCkgdG8gc2VuZCBpdC4KKworQWx0ZXJuYXRpdmVseSwgb25lIGNhbiBhbHNvIHBhY2sgc2V2ZXJhbCBjb21tYW5kcyBpbnRvIGEgc2luZ2xlIGJ1ZmZlciB3aXRoCitzdHJlYW0tPmFsbG9jKCkgYW5kIHN0cmVhbS0+Zmx1c2goKSwgYXMgaW46CisKKyAgMS8gYnVmMSA9ICBzdHJlYW0tPmFsbG9jKHNpemUxKQorICAyLyB3cml0ZSBmaXJzdCBjb21tYW5kIGJ5dGVzIGludG8gYnVmMQorICAzLyBidWYyID0gc3RyZWFtLT5hbGxvYyhzaXplMikKKyAgNC8gd3JpdGUgc2Vjb25kIGNvbW1hbmQgYnl0ZXMgaW50byBidWYyCisgIDUvIHN0cmVhbS0+Zmx1c2goKQorCitGaW5hbGx5LCB0aGVyZSBhcmUgYWxzbyBleHBsaWN0IHJlYWQvd3JpdGUgbWV0aG9kcyBsaWtlIHN0cmVhbS0+cmVhZEZ1bGx5KCkKK29yIHN0cmVhbS0+d3JpdGVGdWxseSgpIHdoaWNoIGNhbiBiZSB1c2VkIHdoZW4geW91IGRvbid0IHdhbnQgYW4gaW50ZXJtZWRpYXRlCitidWZmZXIuIFRoaXMgaXMgdXNlZCBpbiBjZXJ0YWluIGNhc2VzIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiwgZS5nLiB0byBhdm9pZAorYW4gaW50ZXJtZWRpYXRlIG1lbW9yeSBjb3B5IHdoZW4gc2VuZGluZyB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgZ3Vlc3QgdG8gdGhlCitob3N0LgorCitUaGUgaG9zdCBJT1N0cmVhbSBpbXBsZW1lbnRhdGlvbnMgYXJlIHVuZGVyICRFTVVHTC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vLAorc2VlIGluIHBhcnRpY3VsYXI6CisKKyAgICRFTVVHTF9IT1NUL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9UY3BTdHJlYW0uY3BwCisgICAgICAtPiB1c2luZyBsb2NhbCBUQ1Agc29ja2V0cworICAgJEVNVUdMX0hPU1Qvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL1VuaXhTdHJlYW0uY3BwCisgICAgICAtPiB1c2luZyBVbml4IHNvY2tldHMKKyAgICRFTVVHTF9IT1NUL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9XaW4zMlBpcGVTdHJlYW0uY3BwCisgICAgICAtPiB1c2luZyBXaW4zMiBuYW1lZCBwaXBlcworCitUaGUgZ3Vlc3QgSU9TdHJlYW0gaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgVGNwU3RyZWFtLmNwcCBhYm92ZSwgYXMgd2VsbCBhcworYW4gYWx0ZXJuYXRpdmUgUUVNVS1zcGVjaWZpYyBzb3VyY2U6CisKKyAgICRFTVVHTF9HVUVTVC9zeXN0ZW0vT3BlbmdsU3lzdGVtQ29tbW9uL1FlbXVQaXBlU3RyZWFtLmNwcAorICAgICAgLT4gdXNlcyBRRU1VIHBpcGUgZnJvbSB0aGUgZ3Vlc3QKKworVGhlIFFFTVUgUGlwZSBpbXBsZW1lbnRhdGlvbiBpcyBfc2lnbmlmaWNhbnRseV8gZmFzdGVyIChhYm91dCAyMHgpIGR1ZSB0bworc2V2ZXJhbCByZWFzb25zOgorCisgIC0gYWxsIHN1Y2Nlc2Z1bCByZWFkKCkgYW5kIHdyaXRlKCkgb3BlcmF0aW9ucyB0aHJvdWdoIGl0IGFyZSBpbnN0YW50YW5lb3VzCisgICAgZnJvbSB0aGUgZ3Vlc3QncyBwb2ludCBvZiB2aWV3LgorCisgIC0gYWxsIGJ1ZmZlci9tZW1vcnkgY29waWVzIGFyZSBwZXJmb3JtZWQgZGlyZWN0bHkgYnkgdGhlIGVtdWxhdG9yLCBhbmQgdGh1cworICAgIG11Y2ggZmFzdGVyIHRoYW4gcGVyZm9ybWluZyB0aGUgc2FtZSB0aGluZyBpbnNpZGUgdGhlIGtlcm5lbCB3aXRoIGVtdWxhdGVkCisgICAgQVJNIGluc3RydWN0aW9ucy4KKworICAtIGl0IGRvZXNuJ3QgbmVlZCB0byBnbyB0aHJvdWdoIGEga2VybmVsIFRDUC9JUCBzdGFjayB0aGF0IHdpbGwgd3JhcCB0aGUKKyAgICBkYXRhIGludG8gVENQL0lQL01BQyBwYWNrZXRzLCBzZW5kIHRoZW0gdG8gYW4gZW11bGF0ZWQgZXRoZXJuZXQgZGV2aWNlLAorICAgIHdoaWNoIGlzIGl0c2VsZiBjb25uZWN0ZWQgdG8gYW4gaW50ZXJuYWwgZmlyZXdhbGwgaW1wbGVtZW50YXRpb24gdGhhdAorICAgIHdpbGwgdW53cmFwIHRoZSBwYWNrZXRzLCByZS1hc3NlbWJsZSB0aGVtLCB0aGVuIHNlbmQgdGhlbSB0aHJvdWdoIEJTRAorICAgIHNvY2tldHMgdG8gdGhlIGhvc3Qga2VybmVsLgorCitIb3dldmVyLCB3b3VsZCBpdCBiZSBuZWNlc3NhcnksIHlvdSBjb3VsZCB3cml0ZSBhIGd1ZXN0IElPU3RyZWFtIGltcGxlbWVudGF0aW9uCit0aGF0IHVzZXMgYSBkaWZmZXJlbnQgdHJhbnNwb3J0LiBJZiB5b3UgZG8sIHBsZWFzZSBsb29rIGF0CiskRU1VR0xfR1VFU1Qvc3lzdGVtL09wZW5nbENvZGVjQ29tbW9uL0hvc3RDb25uZWN0aW9uLmNwcCB3aGljaCBjb250YWlucyB0aGUKK2NvZGUgdXNlZCB0byBjb25uZWN0IHRoZSBndWVzdCB0byB0aGUgaG9zdCwgb24gYSBwZXItdGhyZWFkIGJhc2lzLgorCisKK1NvdXJjZSBjb2RlIGF1dG8tZ2VuZXJhdGlvbjoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgJ2VtdWdlbicgdG9vbCBpcyBsb2NhdGVkIHVuZGVyICRFTVVHTF9IT1NUL2hvc3QvdG9vbHMvZW11Z2VuLiBUaGVyZSBpcyBhCitSRUFETUUgZmlsZSB0aGF0IGV4cGxhaW5zIGhvdyBpdCB3b3Jrcy4KKworWW91IGNhbiBhbHNvIGxvb2sgYXQgdGhlIGZvbGxvd2luZyBzcGVjaWZpY2F0aW9ucyBmaWxlczoKKworRm9yIEdMRVMgMS4xOgorICAgICRFTVVHTF9IT1NUL2hvc3QvR0xFU3YxX2RlYy9nbC50eXBlcworICAgICRFTVVHTF9IT1NUL2hvc3QvR0xFU3YxX2RlYy9nbC5pbgorICAgICRFTVVHTF9IT1NUL2hvc3QvR0xFU3YxX2RlYy9nbC5hdHRyaWIKKworRm9yIEdMRVMgMi4wOgorICAgICRFTVVHTF9IT1NUL2hvc3QvR0xFU3YyX2RlYy9nbDIudHlwZXMKKyAgICAkRU1VR0xfSE9TVC9ob3N0L0dMRVN2Ml9kZWMvZ2wyLmluCisgICAgJEVNVUdMX0hPU1QvaG9zdC9HTEVTdjJfZGVjL2dsMi5hdHRyaWIKKworRm9yIEVHTDoKKyAgICAkRU1VR0xfSE9TVC9ob3N0L3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wudHlwZXMKKyAgICAkRU1VR0xfSE9TVC9ob3N0L3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wuaW4KKyAgICAkRU1VR0xfSE9TVC9ob3N0L3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wuYXR0cmliCisKK05vdGUgdGhhdCB0aGUgRUdMIHNwZWNpZmljYXRpb24gZmlsZXMgYXJlIHVuZGVyIGEgZGlyZWN0b3J5IG5hbWVkCisicmVuZGVyQ29udHJvbF9kZWMiIGFuZCBoYXZlIGZpbGVuYW1lcyB0aGF0IGJlZ2luIHdpdGggInJlbmRlckNvbnRyb2wiCisKK1RoaXMgaXMgbWFpbmx5IGZvciBoaXN0b3JpYyByZWFzb25zIG5vdywgYnV0IGlzIGFsc28gcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0Cit0aGlzIHBhcnQgb2YgdGhlIHdpcmUgcHJvdG9jb2wgY29udGFpbnMgc3VwcG9ydCBmdW5jdGlvbnMvY2FsbHMvc3BlY2lmaWNhdGlvbnMKK3RoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBFR0wgc3BlY2lmaWNhdGlvbiBpdHNlbGYsIGJ1dCBhZGQgYSBmZXcgZmVhdHVyZXMKK3JlcXVpcmVkIHRvIG1ha2UgZXZlcnl0aGluZyB3b3Jrcy4gRm9yIGV4YW1wbGUsIHRoZXkgaGF2ZSBjYWxscyByZWxhdGVkIHRvCit0aGUgImdyYWxsb2MiIHN5c3RlbSBsaWJyYXJ5IG1vZHVsZSB1c2VkIHRvIG1hbmFnZSBncmFwaGljcyBzdXJmYWNlcyBhdCBhCitsb3dlciBsZXZlbCB0aGFuIEVHTC4KKworR2VuZXJhbGx5IHNwZWFraW5nLCBndWVzdCBlbmNvZGVyIHNvdXJjZXMgYXJlIGxvY2F0ZWQgdW5kZXIgZGlyZWN0b3JpZXMKK25hbWVkICRFTVVHTF9HVUVTVC9zeXN0ZW0vPG5hbWU+X2VuYy8sIHdoaWxlIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QgZGVjb2Rlcgorc291cmNlcyB3aWxsIGJlIHVuZGVyICRFTVVHTF9IT1NUL2hvc3QvbGlicy88bmFtZT5fZGVjLworCitIb3dldmVyLCBhbGwgdGhlc2Ugc291cmNlcyB1c2UgdGhlIHNhbWUgc3BlYyBmaWxlcyBsb2NhdGVkIHVuZGVyIHRoZQorZGVjb2RpbmcgZGlyZWN0b3JpZXMuCisKK1RoZSBlbmNvZGVyIGZpbGVzIGFyZSBidWlsdCBmcm9tIGVtdWdlbiBhbmQgc3BlYyBmaWxlcyBsb2NhdGVkIGluICRFTVVHTF9IT1NUCithbmQgY29waWVkIHRvIHRoZSBlbmNvZGVyIGRpcmVjdG9yaWVzIGluICRFTVVHTF9HVUVTVCBieSB0aGUgZ2VuLWVuY29kZXIuc2gKK3NjcmlwdC4gVGhleSBhcmUgY2hlY2tlZCBpbiwgc28gdGhhdCBhIGdpdmVuIHZlcnNpb24gb2YgQW5kcm9pZCBzdXBwb3J0cyBhCitzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBwcm90b2NvbCwgZXZlbiBpZiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgcmVuZGVyZXIgKGFuZAorZnV0dXJlIEFuZHJvaWQgdmVyc2lvbnMpIHN1cHBvcnQgYSBuZXdlciBwcm90b2NvbCB2ZXJzaW9uLiBUaGlzIHN0ZXAgbmVlZHMgdG8KK2JlIGRvbmUgbWFudWFsbHkgd2hlbiB0aGUgcHJvdG9jb2wgY2hhbmdlczsgdGhlc2UgY2hhbmdlcyBhbHNvIG5lZWQgdG8gYmUKK2FjY29tcGFuaWVkIGJ5IGNoYW5nZXMgaW4gdGhlIHJlbmRlcmVyIHRvIGhhbmRsZSB0aGUgb2xkIHZlcnNpb24gb2YgdGhlCitwcm90b2NvbC4KKworCitTeXN0ZW0gbGlicmFyaWVzOgorLS0tLS0tLS0tLS0tLS0tLS0KKworTWV0YSBFR0wvR0xFUyBzeXN0ZW0gbGlicmFyaWVzLCBhbmQgZWdsLmNmZzoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgZW11bGF0aW9uLXNwZWNpZmljIEVHTC9HTEVTIGxpYnJhcmllcworYXJlIG5vdCBkaXJlY3RseSBsaW5rZWQgYnkgYXBwbGljYXRpb25zIGF0IHJ1bnRpbWUuIEluc3RlYWQsIHRoZSBzeXN0ZW0KK3Byb3ZpZGVzIGEgc2V0IG9mICJtZXRhIiBFR0wvR0xFUyBsaWJyYXJpZXMgdGhhdCB3aWxsIGxvYWQgdGhlIGFwcHJvcHJpYXRlCitoYXJkd2FyZS1zcGVjaWZpYyBsaWJyYXJpZXMgb24gZmlyc3QgdXNlLgorCitNb3JlIHNwZWNpZmljYWxseSwgdGhlIHN5c3RlbSBsaWJFR0wuc28gY29udGFpbnMgYSAibG9hZGVyIiB3aGljaCB3aWxsIHRyeQordG8gbG9hZDoKKworICAtIGhhcmR3YXJlLXNwZWNpZmljIEVHTC9HTEVTIGxpYnJhcmllcworICAtIHRoZSBzb2Z0d2FyZS1iYXNlZCByZW5kZXJpbmcgbGlicmFyaWVzIChjYWxsZWQgImxpYmFnbCIpCisKK1RoZSBzeXN0ZW0gbGliRUdMLnNvIGlzIGFsc28gY2FwYWJsZSBvZiBtZXJnaW5nIHRoZSBFR0wgY29uZmlncyBvZiBib3RoIHRoZQoraGFyZHdhcmUgYW5kIHNvZnR3YXJlIGxpYnJhcmllcyB0cmFuc3BhcmVudGx5IHRvIHRoZSBhcHBsaWNhdGlvbi4gVGhlIHN5c3RlbQorbGliR0xFU3YxX0NNLnNvIGFuZCBsaWJHTEVTdjIuc28sIHdvcmsgd2l0aCBpdCB0byBlbnN1cmUgdGhhdCB0aGUgdGhyZWFkJ3MKK2N1cnJlbnQgY29udGV4dCB3aWxsIGJlIGxpbmtlZCB0byBlaXRoZXIgdGhlIGhhcmR3YXJlIG9yIHNvZnR3YXJlIGxpYnJhcmllcworZGVwZW5kaW5nIG9uIHRoZSBjb25maWcgc2VsZWN0ZWQuCisKK0ZvciB0aGUgcmVjb3JkLCB0aGUgbG9hZGVyJ3Mgc291cmNlIGNvZGUgaW4gdW5kZXIKK2ZyYW1ld29ya3MvYmFzZS9vcGVuZ2wvbGlicy9FR0wvTG9hZGVyLmNwcC4gSXQgZGVwZW5kcyBvbiBhIGZpbGUgbmFtZWQKKy9zeXN0ZW0vbGliL2VnbC9lZ2wuY2ZnIHdoaWNoIG11c3QgY29udGFpbiB0d28gbGluZXMgdGhhdCBsb29rIGxpa2U6CisKKyAgICAwIDEgPG5hbWU+CisgICAgMCAwIGFuZHJvaWQKKworVGhlIGZpcnN0IG51bWJlciBpbiBlYWNoIGxpbmUgaXMgYSBkaXNwbGF5IG51bWJlciwgYW5kIG11c3QgYmUgMCBzaW5jZSB0aGUKK3N5c3RlbSdzIEVHTC9HTEVTIGxpYnJhcmllcyBkb24ndCBzdXBwb3J0IGFueXRoaW5nIGVsc2UuCisKK1RoZSBzZWNvbmQgbnVtYmVyIG11c3QgYmUgMSB0byBpbmRpY2F0ZSBoYXJkd2FyZSBsaWJyYXJpZXMsIGFuZCAwIHRvIGluZGljYXRlCithIHNvZnR3YXJlIG9uZS4gVGhlIGxpbmUgY29ycmVzcG9uZGluZyB0byB0aGUgaGFyZHdhcmUgbGlicmFyeSwgaWYgYW55LCBtdXN0CithbHdheXMgYXBwZWFyIGJlZm9yZSB0aGUgb25lIGZvciB0aGUgc29mdHdhcmUgbGlicmFyeS4KKworVGhlIHRoaXJkIGZpZWxkIGlzIGEgbmFtZSBjb3JyZXNwb25kaW5nIHRvIGEgc2hhcmVkIGxpYnJhcnkgc3VmZml4LiBJdCByZWFsbHkKK21lYW5zIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyaWVzIHdpbGwgYmUgbmFtZWQgbGliRUdMXzxuYW1lPi5zbywKK2xpYkdMRVN2MV9DTV88bmFtZT4uc28gYW5kIGxpYkdMRVN2Ml88bmFtZT4uc28uIE1vcmVvdmVyIHRoZXNlIGxpYnJhcmllcyBtdXN0CitiZSBwbGFjZWQgdW5kZXIgL3N5c3RlbS9saWIvZWdsLworCitUaGUgbmFtZSAiYW5kcm9pZCIgaXMgcmVzZXJ2ZWQgZm9yIHRoZSBzeXN0ZW0gc29mdHdhcmUgcmVuZGVyZXIuCisKK1RoZSBlZ2wuY2ZnIHRoYXQgY29tZXMgd2l0aCB0aGlzIHByb2plY3QgdXNlcyB0aGUgbmFtZSAiZW11bGF0aW9uIiBmb3IgdGhlCitoYXJkd2FyZSBsaWJyYXJpZXMuIFRoaXMgbWVhbnMgdGhhdCBpdCBwcm92aWRlcyBhbiBlZ2wuY2ZnIGZpbGUgdGhhdCBjb250YWlucwordGhlIGZvbGxvd2luZyBsaW5lczoKKworICAgMCAxIGVtdWxhdGlvbgorICAgMCAwIGFuZHJvaWQKKworU2VlICRFTVVHTF9HVUVTVC9zeXN0ZW0vZWdsL2VnbC5jZmcgYW5kIG1vcmUgZ2VuZXJhbGx5IHRoZSBmb2xsb3dpbmcgYnVpbGQKK2ZpbGVzOgorCisgICAkRU1VR0xfR1VFU1Qvc3lzdGVtL2VnbC9BbmRyb2lkLm1rCisgICAkRU1VR0xfR1VFU1Qvc3lzdGVtL0dMRVN2MS9BbmRyb2lkLm1rCisgICAkRU1VR0xfR1VFU1Qvc3lzdGVtL0dMRVN2Mi9BbmRyb2lkLm1rCisKK3RvIHNlZSBob3cgdGhlIGxpYnJhcmllcyBhcmUgbmFtZWQgYW5kIHBsYWNlZCB1bmRlciAvc3lzdGVtL2xpYi9lZ2wvIGJ5IHRoZQorYnVpbGQgc3lzdGVtLgorCisKK0VtdWxhdGlvbiBsaWJyYXJpZXM6CistIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworVGhlIGVtdWxhdG9yLXNwZWNpZmljIGxpYnJhcmllcyBhcmUgdW5kZXIgdGhlIGZvbGxvd2luZzoKKworICAkRU1VR0xfR1VFU1Qvc3lzdGVtL2VnbC8KKyAgJEVNVUdMX0dVRVNUL3N5c3RlbS9HTEVTdjEvCisgICRFTVVHTF9HVUVTVC9zeXN0ZW0vR0xFU3YyLworCitUaGUgY29kZSBmb3IgR0xFU3YxIGFuZCBHTEVTdjIgaXMgcHJldHR5IHNtYWxsLCBzaW5jZSBpdCBtb3N0bHkgbGluayBhZ2FpbnN0Cit0aGUgc3RhdGljIGVuY29kaW5nIGxpYnJhcmllcy4KKworVGhlIGNvZGUgZm9yIEVHTCBpcyBhIGJpdCBtb3JlIGNvbXBsZXgsIGJlY2F1c2UgaXQgbmVlZHMgdG8gZGVhbCB3aXRoCitleHRlbnNpb25zIGR5bmFtaWNhbGx5LiBJLmUuIGlmIGFuIGV4dGVuc2lvbiBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0CitpdCBzaG91bGRuJ3QgYmUgZXhwb3NlZCBieSB0aGUgbGlicmFyeSBhdCBydW50aW1lLiBTbyB0aGUgRUdMIGNvZGUgcXVlcmllcwordGhlIGhvc3QgZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zIGluIG9yZGVyIHRvIHJldHVybiB0aGVtIHRvCitjbGllbnRzLiBTaW1pbGFybHksIGl0IG11c3QgcXVlcnkgdGhlIGxpc3Qgb2YgdmFsaWQgRUdMQ29uZmlncyBmb3IgdGhlCitjdXJyZW50IGhvc3Qgc3lzdGVtLgorCisKKyJncmFsbG9jIiBtb2R1bGUgaW1wbGVtZW50YXRpb246CistIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSW4gYWRkaXRpb24gdG8gRUdML0dMRVMgbGlicmFyaWVzLCB0aGUgQW5kcm9pZCBzeXN0ZW0gcmVxdWlyZXMgYQoraGFyZHdhcmUtc3BlY2lmaWMgbGlicmFyeSB0byBtYW5hZ2UgZ3JhcGhpY3Mgc3VyZmFjZXMgYXQgYSBsZXZlbCBsb3dlciB0aGFuCitFR0wuIFRoaXMgbGlicmFyeSBtdXN0IGJlIHdoYXQgaXMgY2FsbGVkIGluIEFuZHJvaWQgbGFuZCBhcyBhICJIQUwgbW9kdWxlIi4KKworQSAiSEFMIG1vZHVsZSIgbXVzdCBwcm92aWRlIGludGVyZmFjZXMgZGVmaW5lZCBieSBBbmRyb2lkJ3MgSEFMCisoSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGlicmFyeSkuIFRoZXNlIGludGVyZmFjZSBkZWZpbml0aW9ucyBjYW4gYmUgZm91bmQKK3VuZGVyICRBTkRST0lEL2hhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvCisKK09mIGFsbCBwb3NzaWJsZSBIQUwgbW9kdWxlcywgdGhlICJncmFsbG9jIiBvbmUgaXMgdXNlZCBieSB0aGUgc3lzdGVtJ3MKK1N1cmZhY2VGbGluZ2VyIHRvIGFsbG9jYXRlIGZyYW1lYnVmZmVycyBhbmQgb3RoZXIgZ3JhcGhpY3MgbWVtb3J5IHJlZ2lvbnMsCithcyB3ZWxsIGFzIGV2ZW50dWFsbHkgbG9jay91bmxvY2svc3dhcCB0aGVtIHdoZW4gbmVlZGVkLgorCitUaGUgY29kZSB1bmRlciAkRU1VR0wvc3lzdGVtL2dyYWxsb2MvIGltcGxlbWVudHMgdGhlIG1vZHVsZSByZXF1aXJlZCBieSB0aGUKK0dMRVMgZW11bGF0aW9uIHByb2plY3QuIEl0J3Mgbm90IHZlcnkgbG9uZywgYnV0IHRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdG8KK25vdGljZSBoZXJlOgorCistIGZpcnN0LCBpdCB3aWxsIHByb2JlIHRoZSBndWVzdCBzeXN0ZW0gdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbXVsYXRvciB0aGF0CisgIGlzIHJ1bm5pbmcgdGhlIHZpcnR1YWwgZGV2aWNlIHJlYWxseSBzdXBwb3J0cyBHUFUgZW11bGF0aW9uLiBJbiBjZXJ0YWluCisgIGNpcmN1bXN0YW5jZXMgdGhpcyBtYXkgbm90IGJlIHBvc3NpYmxlLgorCisgIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gdGhlIG1vZHVsZSB3aWxsIHJlZGlyZWN0IGFsbCBjYWxscyB0byB0aGUKKyAgImRlZmF1bHQiIGdyYWxsb2MgbW9kdWxlIHRoYXQgaXMgbm9ybWFsbHkgdXNlZCBieSB0aGUgc3lzdGVtIHdoZW4KKyAgc29mdHdhcmUtb25seSByZW5kZXJpbmcgaXMgZW5hYmxlZC4KKworICBUaGUgcHJvYmluZyBoYXBwZW5zIGluIHRoZSBmdW5jdGlvbiAiZmFsbGJhY2tfaW5pdCIgd2hpY2ggZ2V0cyBjYWxsZWQKKyAgd2hlbiB0aGUgbW9kdWxlIGlzIGZpcnN0IG9wZW5lZC4gVGhpcyBpbml0aWFsaXplcyB0aGUgJ3NGYWxsYmFjaycgdmFyaWFibGUKKyAgdG8gYSBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGdyYWxsb2MgbW9kdWxlIHdoZW4gcmVxdWlyZWQuCisKKy0gc2Vjb25kLCB0aGlzIG1vZHVsZSBpcyB1c2VkIGJ5IFN1cmZhY2VGbGluZ2VyIHRvIGRpc3BsYXkgInNvZnR3YXJlIHN1cmZhY2VzIiwKKyAgaS5lLiB0aG9zZSB0aGF0IGFyZSBiYWNrZWQgYnkgc3lzdGVtIG1lbW9yeSBwaXhlbCBidWZmZXJzLCBhbmQgd3JpdHRlbiB0bworICBkaXJlY3RseSB0aHJvdWdoIHRoZSBTa2lhIGdyYXBoaWNzIGxpYnJhcnkgKGkuZS4gdGhlIG5vbi1hY2NlbGVyYXRlZCBvbmVzKS4KKworICB0aGUgZGVmYXVsdCBtb2R1bGUgc2ltcGx5IGNvcGllcyB0aGUgcGl4ZWwgZGF0YSBmcm9tIHRoZSBzdXJmYWNlIHRvIHRoZQorICB2aXJ0dWFsIGZyYW1lYnVmZmVyIGkvbyBtZW1vcnksIGJ1dCB0aGlzIHByb2plY3QncyBncmFsbG9jIG1vZHVsZSBzZW5kcyBpdAorICB0byB0aGUgcmVuZGVyZXIgdGhyb3VnaCB0aGUgUUVNVSBQaXBlIGluc3RlYWQuCisKKyAgSXQgdHVybnMgb3V0IHRoYXQgdGhpcyByZXN1bHRzIGluIF9mYXN0ZXJfIHJlbmRlcmluZy9mcmFtZS1yYXRlcyBvdmVyYWxsLAorICBiZWNhdXNlIG1lbW9yeSBjb3BpZXMgaW5zaWRlIHRoZSBndWVzdCBhcmUgc2xvdywgd2hpbGUgUUVNVSBwaXBlIHRyYW5zZmVycworICBhcmUgZG9uZSBkaXJlY3RseSBpbiB0aGUgZW11bGF0b3IuCisKKworSG9zdCBSZW5kZXJlcjoKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBob3N0IHJlbmRlcmVyIGxpYnJhcnkgaXMgbG9jYXRlZCB1bmRlcgorJEVNVUdMX0hPU1QvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlciwgYW5kIGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSBkZXNjcmliZWQKK2J5IHRoZSBoZWFkZXJzIHVuZGVyICRFTVVHTF9IT1NUL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaS5oCisoZS5nLiBmb3IgdXNlIGJ5IHRoZSBlbXVsYXRvcikuCisKK0luIGEgbnV0c2hlbGwsIHRoZSByZW5kZXJpbmcgbGlicmFyeSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGZvbGxvd2luZzoKKworICAtIFByb3ZpZGluZyBhIHZpcnR1YWwgb2ZmLXNjcmVlbiB2aWRlbyBzdXJmYWNlIHdoZXJlIGV2ZXJ5dGhpbmcgd2lsbCBnZXQKKyAgICByZW5kZXJlZCBhdCBydW50aW1lLiBJdHMgZGltZW5zaW9ucyBhcmUgZml4ZWQgYnkgdGhlIGNhbGwgdG8KKyAgICBpbml0T3BlbmdsUmVuZGVyKCkgdGhhdCBtdXN0IGhhcHBlbiBqdXN0IGFmdGVyIHRoZSBsaWJyYXJ5IGlzCisgICAgaW5pdGlhbGl6ZWQuCisKKyAgLSBQcm92aWRlIGEgd2F5IHRvIGRpc3BsYXkgdGhlIHZpcnR1YWwgdmlkZW8gc3VyZmFjZSBvbiBhIGhvc3QgYXBwbGljYXRpb24ncworICAgIFVJLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZyBjcmVhdGVPcGVuR0xTdWJXaW5kb3coKSB3aGljaCB0YWtlcyBhcyBhcmd1bWVudAorICAgIHRoZSB3aW5kb3cgSUQgb3IgaGFuZGxlIG9mIGEgcGFyZW50IHdpbmRvdywgc29tZSBkaXNwbGF5IGRpbWVuc2lvbnMgYW5kCisgICAgYSByb3RhdGlvbiBhbmdsZS4gVGhpcyBhbGxvd3MgdGhlIHN1cmZhY2UgdG8gYmUgc2NhbGVkL3JvdGF0ZWQgd2hlbiBpdCBpcworICAgIGRpc3BsYXllZCwgZXZlbiBpZiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdmlkZW8gc3VyZmFjZSBkbyBub3QgY2hhbmdlLgorCisgIC0gUHJvdmlkZSBhIHdheSB0byBsaXN0ZW4gdG8gaW5jb21pbmcgRUdML0dMRVMgY29tbWFuZHMgZnJvbSB0aGUgZ3Vlc3QuCisgICAgVGhpcyBpcyBkb25lIGJ5IHByb3ZpZGluZyBhIHNvLWNhbGxlZCAicG9ydCBudW1iZXIiIHRvIGluaXRPcGVuZ2xSZW5kZXIoKS4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBwb3J0IG51bWJlciBjb3JyZXNwb25kcyB0byBhIGxvY2FsIFRDUCBwb3J0IG51bWJlciB0aGF0IHRoZQorICAgIHJlbmRlcmVyIHdpbGwgYmluZCB0byBhbmQgbGlzdGVuLiBFdmVyeSBuZXcgY29ubmVjdGlvbiB0byB0aGlzIHBvcnQgd2lsbAorICAgIGNvcnJlc3BvbmQgdG8gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGd1ZXN0IGhvc3QgY29ubmVjdGlvbiwgZWFjaCBzdWNoCisgICAgY29ubmVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIGEgZGlzdGluY3QgdGhyZWFkIGluIHRoZSBndWVzdCBzeXN0ZW0uCisKKyAgICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQgaXMgcG9zc2libGUgdG8gbGlzdGVuIHRvIGVpdGhlciBVbml4IHNvY2tldHMKKyAgICAob24gTGludXggYW5kIE9TIFgpLCBvciB0byBhIFdpbjMyIG5hbWVkIHBpcGUgKG9uIFdpbmRvd3MpLiBUbyBkbyBzbywgb25lCisgICAgaGFkIHRvIGNhbGwgc2V0U3RyZWFtVHlwZSgpIGJldHdlZW4gbGlicmFyeSBpbml0aWFsaXphdGlvbgorICAgIChpLmUuIGluaXRMaWJyYXJ5KCkpIGFuZCBjb25zdHJ1Y3Rpb24gKGkuZS4gaW5pdE9wZW5nbFJlbmRlcigpKS4KKworICAgIE5vdGUgdGhhdCBpbiB0aGVzZSBtb2RlcywgdGhlIHBvcnQgbnVtYmVyIGlzIHN0aWxsIHVzZWQgdG8gZGlmZmVyZW50aWF0ZQorICAgIGJldHdlZW4gc2V2ZXJhbCBlbXVsYXRvciBpbnN0YW5jZXMuIFRoZXNlIGRldGFpbHMgYXJlIG5vcm1hbGx5IGhhbmRsZWQgYnkKKyAgICB0aGUgZW11bGF0b3IgY29kZSBzbyB5b3Ugc2hvdWxkbid0IGNhcmUgdG9vIG11Y2guCisKK05vdGUgdGhhdCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSBhbGxvd2VkIGEgY2xpZW50IG9mIHRoZSByZW5kZXJlcgorbGlicmFyeSB0byBwcm92aWRlIGl0cyBvd24gSU9TdHJlYW0gaW1wbGVtZW50YXRpb24uIEhvd2V2ZXIsIHRoaXMgd2Fzbid0IHZlcnkKK2NvbnZlbmllbnQgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuIFRoaXMgbWF5YmUgc29tZXRoaW5nIHRoYXQgY291bGQgYmUgZG9uZQorYWdhaW4gaWYgaXQgbWFrZXMgc2Vuc2UsIGJ1dCBmb3Igbm93IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIGFyZSBwcmV0dHkgZ29vZC4KKworCitIb3N0IGVtdWxhdG9yOgorLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvZGUgdW5kZXIgJFFFTVUvYW5kcm9pZC9vcGVuZ2xlcy5jIGlzIGluIGNoYXJnZSBvZiBkeW5hbWljYWxseSBsb2FkaW5nCit0aGUgcmVuZGVyaW5nIGxpYnJhcnkgYW5kIGluaXRpYWxpemluZyAvIGNvbnN0cnVjdGluZyBpdCBwcm9wZXJseS4KKworUUVNVSBwaXBlIGNvbm5lY3Rpb25zIHRvIHRoZSAnb3BlbmdsZXMnIHNlcnZpY2UgYXJlIHBpcGVkIHRocm91Z2ggdGhlIGNvZGUKK2luICRRRU1VL2FuZHJvaWQvaHctcGlwZS1uZXQuYy4gTG9vayBmb3IgdGhlIG9wZW5nbGVzUGlwZV9pbml0KCkgZnVuY3Rpb24sCit3aGljaCBpcyBpbiBjaGFyZ2Ugb2YgY3JlYXRpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSByZW5kZXJlciBsaWJyYXJ5CisoZWl0aGVyIHRocm91Z2ggYSBUQ1Agc29ja2V0LCBvciBhIFVuaXggcGlwZSBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbi4KK3N1cHBvcnQgZm9yIFdpbjMyIG5hbWVkIHBpcGVzIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIHlldCBpbiB0aGUgZW11bGF0b3IpCit3aGVuZXZlciBhIGd1ZXN0IHByb2Nlc3Mgb3BlbnMgdGhlICJvcGVuZ2xlcyIgc2VydmljZSB0aHJvdWdoIC9kZXYvcWVtdV9waXBlLgorCitUaGVyZSBpcyBhbHNvIHNvbWUgc3VwcG9ydCBjb2RlIGZvciB0aGUgZGlzcGxheSBvZiB0aGUgR0xFUyBmcmFtZWJ1ZmZlcgorKHRocm91Z2ggdGhlIHJlbmRlcmVyIGxpYnJhcnkncyBzdWJ3aW5kb3cpIHVuZGVyICRRRU1VL3NraW4vd2luZG93LgorCitOb3RlIHRoYXQgYXQgdGhlIG1vbWVudCwgc2NhbGluZyBhbmQgcm90YXRpb24gYXJlIHN1cHBvcnRlZC4gSG93ZXZlciwKK2JyaWdodG5lc3MgZW11bGF0aW9uICh3aGljaCB1c2VkIHRvIG1vZGlmeSB0aGUgcGl4ZWwgdmFsdWVzIGZyb20gdGhlCitoYXJkd2FyZSBmcmFtZWJ1ZmZlciBiZWZvcmUgZGlzcGxheWluZyB0aGVtKSBkb2Vzbid0IHdvcmsuCisKK0Fub3RoZXIgaXNzdWUgaXMgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gZGlzcGxheSBhbnl0aGluZyBvbiB0b3Agb2YgdGhlCitHTCBzdWJ3aW5kb3cgYXQgdGhlIG1vbWVudC4gRS5nLiB0aGlzIHdpbGwgb2JzY3VyZSB0aGUgZW11bGF0ZWQgdHJhY2tiYWxsCitpbWFnZSAodGhhdCBpcyBub3JtYWxseSB0b2dnbGVkIHdpdGggQ3RybC1UIGR1cmluZyBlbXVsYXRpb24sIG9yIGVuYWJsZWQKK2J5IHByZXNzaW5nIHRoZSBEZWxldGUga2V5KS4KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL1JFQURNRSBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiMmQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9SRUFETUUKQEAgLTAsMCArMSw5NiBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGhvc3Qtc2lkZSBtb2R1bGVzIHJlbGF0ZWQgdG8gaGFyZHdhcmUgT3BlbkdMIEVTCitlbXVsYXRpb24uIFRoZSBndWVzdC1zaWRlIG1vZHVsZXMgYXJlIGluCiskQU5EUk9JRF9CVUlMRF9UT1AvZGV2aWNlL2dlbmVyaWMvZ29sZGZpc2gvb3BlbmdsCisKK0kuIE92ZXJ2aWV3IG9mIGNvbXBvbmVudHM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgJ2VtdWdlbicgdG9vbCBpcyB1c2VkIHRvIGdlbmVyYXRlIHNldmVyYWwgc291cmNlIGZpbGVzIHJlbGF0ZWQgdG8gdGhlCitFR0wvR0xFUyBjb21tYW5kIHN0cmVhbSB1c2VkIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUgaG9zdCBkdXJpbmcgZW11bGF0aW9uLgorCisgIGhvc3QvdG9vbHMvZW11Z2VuICAgLT4gZW11Z2VuIHByb2dyYW0KKworTm90ZSB0aGF0IGVtdWdlbiBpcyBjYXBhYmxlIG9mIGdlbmVyYXRpbmcsIGZyb20gYSBzaW5nbGUgc2V0IG9mIHNwZWNpZmljYXRpb24KK2ZpbGVzLCB0aHJlZSB0eXBlcyBvZiBhdXRvLWdlbmVyYXRlZCBzb3VyY2VzOgorCisgIC0gc291cmNlcyB0byBlbmNvZGUgY29tbWFuZHMgaW50byBhIGJ5dGUgc3RyZWFtLgorICAtIHNvdXJjZXMgdG8gZGVjb2RlIHRoZSBieXRlIHN0cmVhbSBpbnRvIGNvbW1hbmRzLgorICAtIHNvdXJjZXMgdG8gd3JhcCBub3JtYWwgcHJvY2VkdXJhbCBFR0wvR0xFUyBjYWxscyBpbnRvIGNvbnRleHQtYXdhcmUgb25lcy4KKworTW9kdWxlcyB1bmRlciB0aGUgc3lzdGVtLyBkaXJlY3RvcnkgY29ycmVzcG9uZHMgdG8gY29kZSB0aGF0IHJ1bnMgb24gdGhlCitndWVzdCwgYW5kIGltcGxlbWVudCB0aGUgbWFyc2hhbGxpbmcgb2YgRUdML0dMRVMgY29tbWFuZHMgaW50byBhIHN0cmVhbSBvZgorYnl0ZXMgc2VudCB0byB0aGUgaG9zdCB0aHJvdWdoIGEgZmFzdCBwaXBlIG1lY2hhbmlzbS4KKworICAgc3lzdGVtL0dMRVN2MV9lbmMgICAgICAgIC0+IGVuY29kZXIgZm9yIEdMRVMgMS4xIGNvbW1hbmRzCisgICBzeXN0ZW0vR0xFU3YyX2VuYyAgICAgICAgLT4gZW5jb2RlciBmb3IgR0xFUyAyLjAgY29tbWFuZHMKKyAgIHN5c3RlbS9yZW5kZXJDb250cm9sX2VuYyAtPiBlbmNvZGVyIGZvciByZW5kZXJpbmcgY29udHJvbCBjb21tYW5kcworICAgc3lzdGVtL2VnbCAgICAgICAgICAgICAgIC0+IGVtdWxhdG9yLXNwZWNpZmljIGd1ZXN0IEVHTCBsaWJyYXJ5CisgICBzeXN0ZW0vR0xFU3YxICAgICAgICAgICAgLT4gZW11bGF0b3Itc3BlY2lmaWMgZ3Vlc3QgR0xFUyAxLjEgbGlicmFyeQorICAgc3lzdGVtL2dyYWxsb2MgICAgICAgICAgIC0+IGVtdWxhdG9yLXNwZWNpZmljIGdyYWxsb2MgbW9kdWxlCisgICBzeXN0ZW0vT3BlbmdsU3lzdGVtQ29tbW9uIC0+IGxpYnJhcnkgb2YgY29tbW9uIHJvdXRpbmVzCisKK01vZHVsZXMgdW5kZXIgdGhlIGhvc3QvIGRpcmVjdG9yeSBjb3JyZXNwb25kcyB0byBjb2RlIHRoYXQgcnVucyBvbiB0aGUKK2hvc3QsIGFuZCBpbXBsZW1lbnQgdGhlIGRlY29kaW5nIG9mIHRoZSBjb21tYW5kIHN0cmVhbSwgdHJhbnNsYXRpb24gb2YKK0VHTC9HTEVTIGNvbW1hbmRzIGludG8gZGVza3RvcCBHTCAyLjAgb25lcywgYW5kIHJlbmRlcmluZyB0byBhbiBvZmYtc2NyZWVuCitidWZmZXIuCisKKyAgaG9zdC9saWJzL0dMRVN2MV9kZWMgICAgICAgIC0+IGRlY29kZXIgZm9yIEdMRVMgMS4xIGNvbW1hbmRzCisgIGhvc3QvbGlicy9HTEVTdjJfZGVjICAgICAgICAtPiBkZWNvZGVyIGZvciBHTEVTIDIuMCBjb21tYW5kcworICBob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMgLT4gZGVjb2RlciBmb3IgcmVuZGVyaW5nIGNvbnRyb2wgY29tbWFuZHMKKworICBob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wgICAgLT4gdHJhbnNsYXRvciBmb3IgRUdMIGNvbW1hbmRzCisgIGhvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00gLT4gdHJhbnNsYXRvciBmb3IgR0xFUyAxLjEgY29tbWFuZHMKKyAgaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMiAtPiB0cmFuc2xhdG9yIGZvciBHTEVTIDIuMCBjb21tYW5kcworICBob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbiAtPiBsaWJyYXJ5IG9mIGNvbW1vbiB0cmFuc2xhdGlvbiByb3V0aW5lcworCisgIGhvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIgLT4gcmVuZGVyaW5nIGxpYnJhcnkgKHVzZXMgYWxsIGhvc3QgbGlicyBhYm92ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdXNlZCBieSB0aGUgJ3JlbmRlcmVyJyBwcm9ncmFtIGJlbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpcmVjdGx5IGxpbmtlZCBpbnRvIHRoZSBlbXVsYXRvciBVSSBwcm9ncmFtLgorCisgIGhvc3QvcmVuZGVyZXIvIC0+IHN0YW5kLWFsb25lIHJlbmRlcmVyIHByb2dyYW0gZXhlY3V0YWJsZS4KKyAgICAgICAgICAgICAgICAgICAgdGhpcyBjYW4gcnVuIGluIGhlYWQtbGVzcyBtb2RlIGFuZCByZWNlaXZlIHJlcXVlc3RzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgc2V2ZXJhbCBlbXVsYXRvcnMgYXQgdGhlIHNhbWUgdGltZS4gSXQgaXMgdGhlIHJlY2VpdmluZworICAgICAgICAgICAgICAgICAgICBlbmQgb2YgYWxsIGNvbW1hbmQgc3RyZWFtcy4KKworTW9kdWxlcyB1bmRlciB0aGUgdGVzdC8gZGlyZWN0b3J5IGNvcnJlc3BvbmQgdG8gdGVzdCBwcm9ncmFtcyB0aGF0IGFyZSB1c2VmdWwKK3RvIGRlYnVnIHRoZSB2YXJpb3VzIG1vZHVsZXMgZGVzY3JpYmVkIGFib3ZlOgorCisgIHRlc3RzL0VHTF9ob3N0X3dyYXBwZXIgIC0+IGEgc21hbGwgbGlicmFyeSB1c2VkIHRvIGR5bmFtaWNhbGx5IGxvYWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2t0b3AgbGliRUdMLnNvIG9yIGEgcmVwbGFjZW1lbnQgbmFtZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfRUdMX0xJQiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhpcyBsaWIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgYWxsIEVHTCBlbnRyeSBwb2ludHMuCisKKyAgdGVzdHMvZW11bGF0b3JfdGVzdF9yZW5kZXJlciAtPiBhIHNtYWxsIHByb2dyYW0gdG8gcnVuIHRoZSByZW5kZXJpbmcgbGlicmFyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgc2luZ2xlIFNETCB3aW5kb3cgb24gdGhlIGhvc3QgZGVza3RvcC4KKworICB0ZXN0cy9nbGVzX2FuZHJvaWRfd3JhcHBlciAtPiBndWVzdCBFR0wgLyBHTEVTIGxpYnJhcmllcyB0aGF0IGFyZSBydW4gb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRldmljZSB0byBydW4gc29tZSB0ZXN0cy4gUmVwbGFjZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtL2VnbCBhbmQgc3lzdGVtL0dMRVN2MSBtb2R1bGVzIGZvciBub3cuCisKKyAgdGVzdHMvdHJhbnNsYXRvcl90ZXN0cy9HTEVTX0NNIC0+IGRlc2t0b3AgR0xFU3YxIHRyYW5zbGF0aW9uIHVuaXQgdGVzdAorICB0ZXN0cy90cmFuc2xhdG9yX3Rlc3RzL0dMRVNfVjIgLT4gZGVza3RvcCBHTEVTdjIgdHJhbnNsYXRpb24gdW5pdCB0ZXN0CisgIHRlc3RzL3RyYW5zbGF0b3JfdGVzdHMvTWFjQ29tbW9uIC0+IHVzZWQgYnkgdHJhbnNsYXRpb24gdGVzdHMgb24gTWFjIG9ubHkuCisKKyAgdGVzdHMvdXRfcmVuZGVyY29udHJvbF9lbmMgLT4gZ3Vlc3QgbGlicmFyeSB1c2VkIGJ5IHRlc3RzL3V0X3JlbmRlcmVyCisgIHRlc3RzL3V0X3JlbmRlcmNvbnRyb2xfZGVjIC0+IGhvc3QgbGlicmFyeSB1c2VkIGJ5IHRlc3RzL3V0X3JlbmRlcmVyCisgIHRlc3RzL3V0X3JlbmRlcmVyICAgICAgICAgIC0+IHVuaXQtdGVzdCBmb3IgcmVuZGVyIGNvbnRyb2wgYW5kIHJlbmRlcmluZyBsaWJyYXJ5LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorSUkuIEJ1aWxkIHN5c3RlbSBjb25zaWRlcmF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkZXBlbmRlbmNpZXMgb24gdGhlIG1vcmUgdGhhbiAyMCBjb21wb25lbnRzIGRlc2NyaWJlZCBpbiB0aGUgcHJldmlvdXMKK3NlY3Rpb24gYXJlIHByZXR0eSBzb3BoaXN0aWNhdGVkLCBpbnZvbHZpbmcgbG90cyBvZiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFuZAorbm9uLXRyaXZpYWwgcGxhY2VtZW50IGZvciBndWVzdC9kZXZpY2UgbGlicmFyaWVzLgorCitUbyBzaW1wbGlmeSB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIG9mIHRoZXNlIG1vZHVsZXMsIGEgc2V0IG9mCitoZWxwZXIgR05VIE1ha2UgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbiBjb21tb24ubWssIGFuZCBpbmNsdWRlZCBmcm9tIHRoZQorQW5kcm9pZC5tayBpbiB0aGlzIGRpcmVjdG9yeS4KKworVGhlc2UgZnVuY3Rpb25zIGFsbCBiZWdpbiB3aXRoIHRoZSAiZW11Z2wtIiBwcmVmaXgsIGFuZCBjYW4gYmUgdXNlZCB0bworZGVjbGFyZSBtb2R1bGVzLCB3aGF0IGluZm9ybWF0aW9uIHRoZXkgZXhwb3J0IHRvIG90aGVyIG1vZHVsZXMsIG9yIGltcG9ydAorZnJvbSB0aGVtLCBhbmQgYWxzbyB3aGF0IGtpbmQgb2YgYXV0by1nZW5lcmF0ZWQgc291cmNlcyB0aGV5IGRlcGVuZCBvbi4KKworTG9vayBhdCB0aGUgY29tbWVudHMgaW5zaWRlIGNvbW1vbi5tayBhbmQgdGhlIEFuZHJvaWQubWsgb2YgdGhlIG1vZHVsZXMKK3RvIGJldHRlciB1bmRlcnN0YW5kIHdoYXQncyBoYXBwZW5pbmcuCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9jb21tb24ubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjNmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvY29tbW9uLm1rCkBAIC0wLDAgKzEsMjM3IEBACisjIFRoaXMgdG9wLWxldmVsIGJ1aWxkIGZpbGUgaXMgaW5jbHVkZWQgYnkgYWxsIG1vZHVsZXMgdGhhdCBpbXBsZW1lbnQKKyMgdGhlIGhhcmR3YXJlIE9wZW5HTCBFUyBlbXVsYXRpb24gZm9yIEFuZHJvaWQuCisjCisjIFdlIHVzZSBpdCB0byBlbnN1cmUgdGhhdCBhbGwgc3ViLU1ha2VmaWxlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJpZ2h0CisjIG9yZGVyIGZvciB2YXJpb3VzIHZhcmlhYmxlIGRlZmluaXRpb25zIGFuZCB1c2FnZSB0byBoYXBwZW4gaW4gdGhlIGNvcnJlY3QKKyMgb3JkZXIuCisjCisKKyMgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIHVzZWQgdG8gc3RhcnQgYSBuZXcgR0xFUyBlbXVsYXRpb24gbW9kdWxlLgorIworIyBUaGlzIHdpbGwgZGVmaW5lIExPQ0FMX01PRFVMRSBhcyAkMSwgcGx1cyBhIGZldyBvdGhlciB2YXJpYWJsZXMKKyMgbmVlZGVkIGJ5IHRoZSBidWlsZCBzeXN0ZW0gKGUuZy4gTE9DQUxfTU9EVUxFX1RBR1MsIExPQ0FMX01PRFVMRV9DTEFTUy4uLikKKyMKKyMgTk9URTogWW91IHN0aWxsIG5lZWQgdG8gZGVmaW5lIExPQ0FMX1BBVEggYmVmb3JlIHRoaXMKKyMKKyMgVXNhZ2UgZXhhbXBsZToKKyMKKyMgICAkKGNhbGwgZW11Z2wtYmVnaW4tc3RhdGljLWxpYnJhcnksPG5hbWU+KQorIyAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gLi4uLgorIyAgICAgICBMT0NBTF9DX0lOQ0xVREVTICs9IC4uLi4KKyMgICAkKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKKyMKK2VtdWdsLWJlZ2luLXN0YXRpYy1saWJyYXJ5ID0gJChjYWxsIGVtdWdsLWJlZ2luLW1vZHVsZSwkMSxIT1NUX1NUQVRJQ19MSUJSQVJZKQorZW11Z2wtYmVnaW4tc2hhcmVkLWxpYnJhcnkgPSAkKGNhbGwgZW11Z2wtYmVnaW4tbW9kdWxlLCQxLEhPU1RfU0hBUkVEX0xJQlJBUlkpCitlbXVnbC1iZWdpbi1leGVjdXRhYmxlID0gJChjYWxsIGVtdWdsLWJlZ2luLW1vZHVsZSwkMSxIT1NUX0VYRUNVVEFCTEUpCisKKyMgVmFyaWFudHMgb2YgZW11Z2wtYmVnaW4tPG1vZHVsZS10eXBlPiBmb3IgaG9zdCBiaW5hcmllcywgaS5lLiB0aG9zZSBnZW5lcmF0ZWQKKyMgZm9yIHRoZSBidWlsZCBtYWNoaW5lJ3Mgb3BlcmF0aW5nIHN5c3RlbSAod2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUKKyMgdGFyZ2V0IG9uZSBpbiBjYXNlIG9mIGNyb3NzLWNvbXBpbGF0aW9uKS4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSAnZW11Z2VuJworIyB0b29sIGZvciBleGFtcGxlLCBzaW5jZSBpdCBpcyBpbnZva2VkIGxhdGVyIGJ5IHRoZSBidWlsZCBzeXN0ZW0gdG8gZ2VuZXJhdGUKKyMgZGVjb2RlciBzb3VyY2VzLgorZW11Z2wtYmVnaW4taG9zdC1zdGF0aWMtbGlicmFyeSA9ICQoY2FsbCBlbXVnbC1iZWdpbi1tb2R1bGUsJDEsSE9TVF9TVEFUSUNfTElCUkFSWSxIT1NUKQorZW11Z2wtYmVnaW4taG9zdC1zaGFyZWQtbGlicmFyeSA9ICQoY2FsbCBlbXVnbC1iZWdpbi1tb2R1bGUsJDEsSE9TVF9TSEFSRURfTElCUkFSWSxIT1NUKQorZW11Z2wtYmVnaW4taG9zdC1leGVjdXRhYmxlID0gJChjYWxsIGVtdWdsLWJlZ2luLW1vZHVsZSwkMSxIT1NUX0VYRUNVVEFCTEUsSE9TVCkKKworIyBJbnRlcm5hbCBsaXN0IG9mIGFsbCBkZWNsYXJlZCBtb2R1bGVzICh1c2VkIGZvciBzYW5pdHkgY2hlY2tpbmcpCitfZW11Z2xfbW9kdWxlcyA6PQorX2VtdWdsX0hPU1RfbW9kdWxlcyA6PQorCisjIGRvIG5vdCB1c2UgZGlyZWN0bHksIHNlZSBmdW5jdGlvbnMgYWJvdmUgaW5zdGVhZAorZW11Z2wtYmVnaW4tbW9kdWxlID0gXAorICAgICQoZXZhbCBpbmNsdWRlICQoQ0xFQVJfVkFSUykpIFwKKyAgICAkKGV2YWwgTE9DQUxfTU9EVUxFIDo9ICQxKSBcCisgICAgJChldmFsIExPQ0FMX01PRFVMRV9DTEFTUyA6PSAkKHBhdHN1YnN0IEhPU1RfJSwlLCQocGF0c3Vic3QgJUVYRUNVVEFCTEUsJUVYRUNVVEFCTEVTLCQocGF0c3Vic3QgJUxJQlJBUlksJUxJQlJBUklFUywkMikpKSkgXAorICAgICQoZXZhbCBMT0NBTF9DX0lOQ0xVREVTICs9ICQoaWYgJDMsLCQoQU5EUk9JRF9FTVVfQkFTRV9JTkNMVURFUykpICQoRU1VR0xfQ09NTU9OX0lOQ0xVREVTKSkgXAorICAgICQoZXZhbCBMT0NBTF9DRkxBR1MgKz0gJChFTVVHTF9DT01NT05fQ0ZMQUdTKSkgXAorICAgICQoZXZhbCBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9ICQoaWYgJDMsLCQoQU5EUk9JRF9FTVVfQkFTRV9TVEFUSUNfTElCUkFSSUVTKSkpIFwKKyAgICAkKGV2YWwgTE9DQUxfTERMSUJTICs9ICQoaWYgJDMsLCQoQU5EUk9JRF9FTVVfQkFTRV9MRExJQlMpKSAkKENYWF9TVERfTElCKSkgXAorICAgICQoZXZhbCBMT0NBTF9CVUlMRF9GSUxFIDo9ICQoQlVJTERfJDIpKSBcCisgICAgJChjYWxsIF9lbXVnbC1pbml0LW1vZHVsZSwkMSwkMiwkMykKKworIyBVc2VkIHRvIGVuZCBhIG1vZHVsZSBkZWZpbml0aW9uLCBzZWUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYWJvdmUKK2VtdWdsLWVuZC1tb2R1bGUgPSBcCisgICAgJChpZiAkKF9lbXVnbF9IT1NUKSwkKGV2YWwgTE9DQUxfSE9TVF9CVUlMRCA6PSB0cnVlKSlcCisgICAgJChldmFsICQoZW5kLWVtdWxhdG9yLW1vZHVsZS1ldikpIFwKKyAgICAkKGV2YWwgTE9DQUxfQlVJTERfRklMRSA6PSkgXAorICAgICQoZXZhbCBfZW11Z2xfJChfZW11Z2xfSE9TVCltb2R1bGVzICs9ICQoX2VtdWdsX01PRFVMRSkpXAorICAgICQoaWYgJChFTVVHTF9ERUJVRyksJChjYWxsIGVtdWdsLWR1bXAtbW9kdWxlKSkKKworIyBNYW5hZ2luZyBtb2R1bGUgZXhwb3J0cyBhbmQgaW1wb3J0cy4KKyMKKyMgQSBtb2R1bGUgY2FuICdpbXBvcnQnIGFub3RoZXIgbW9kdWxlLCBieSBjYWxsaW5nIGVtdWdsLWltcG9ydC4gVGhpcyB3aWxsCisjIG1ha2UgdGhlIGN1cnJlbnQgTE9DQUxfTU9EVUxFIGluaGVyaXQgdmFyaW91cyBkZWZpbml0aW9ucyBleHBvcnRlZCBmcm9tCisjIHRoZSBpbXBvcnRlZCBtb2R1bGUuCisjCisjIE1vZHVsZSBleHBvcnRzIGFyZSBkZWZpbmVkIGJ5IGNhbGxpbmcgZW11Z2wtZXhwb3J0LiBIZXJlIGlzIGFuIGV4YW1wbGU6CisjCisjICAgICAgJChjYWxsIGVtdWdsLWJlZ2luLXN0YXRpYy1saWJyYXJ5LGZvbykKKyMgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gZm9vLmMKKyMgICAgICAkKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChMT0NBTF9QQVRIKSkKKyMgICAgICAkKGNhbGwgZW11Z2wtZXhwb3J0LFNIQVJFRF9MSUJSQVJJRVMsbGliY3V0aWxzKQorIyAgICAgICQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQorIworIyAgICAgICQoY2FsbCBlbXVnbC1iZWdpbi1zaGFyZWQtbGlicmFyeSxiYXIpCisjICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IGJhci5jcHAKKyMgICAgICAkKGNhbGwgZW11Z2wtaW1wb3J0LGZvbykKKyMgICAgICAkKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKKyMKKyMgSGVyZSwgd2UgZGVmaW5lIGEgc3RhdGljIGxpYnJhcnkgbmFtZWQgJ2Zvbycgd2hpY2ggZXhwb3J0cyBhbiBpbmNsdWRlCisjIHBhdGggYW5kIGEgc2hhcmVkIGxpYnJhcnkgcmVxdWlyZW1lbnQsIGFuZCBhIHNoYXJlZCBsaWJyYXJ5ICdiYXInIHdoaWNoCisjIGltcG9ydHMgaXQuCisjCisjIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0OgorIworIyAgICAtICdiYXInIHdpbGwgYXV0b21hdGljYWxseSBpbmhlcml0IGZvbydzIExPQ0FMX1BBVEggaW4gaXRzIExPQ0FMX0NfSU5DTFVERVMKKyMgICAgLSAnYmFyJyB3aWxsIGF1dG9tYXRpY2FsbHkgaW5oZXJpdCBsaWJjdXRpbHMgaW4gaXRzIG93biBMT0NBTF9TSEFSRURfTElCUkFSSUVTCisjCisjIE5vdGUgdGhhdCBvcmRlciBvZiBkZWNsYXJhdGlvbiBtYXR0ZXJzLiBJZiAnZm9vJyBpcyBkZWZpbmVkIGFmdGVyICdiYXInIGluCisjIHRoZSBleGFtcGxlIGFib3ZlLCBub3RoaW5nIHdpbGwgd29yayBjb3JyZWN0bHkgYmVjYXVzZSBkZXBlbmRlbmNpZXMgYXJlCisjIGNvbXB1dGVkIGF0IGltcG9ydCB0aW1lLgorIworIworIyBJTVBPUlRBTlQ6IEltcG9ydHMgYXJlIHRyYW5zaXRpdmUsIGkuZS4gd2hlbiBtb2R1bGUgQSBpbXBvcnRzIEIsCisjICAgICAgICAgICAgaXQgYXV0b21hdGljYWxseSBpbXBvcnRzIGFueXRoaW5nIGltcG9ydGVkIGJ5IEIgdG9vLgorCisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgcmVjb2duaXplZCBleHBvcnQgdHlwZXMgd2Ugc3VwcG9ydCBmb3Igbm93LgorRU1VR0xfRVhQT1JUX1RZUEVTIDo9IFwKKyAgICBDRkxBR1MgXAorICAgIENYWEZMQUdTIFwKKyAgICBMRExJQlMgXAorICAgIExERkxBR1MgXAorICAgIENfSU5DTFVERVMgXAorICAgIFNIQVJFRF9MSUJSQVJJRVMgXAorICAgIFNUQVRJQ19MSUJSQVJJRVMgXAorICAgIEFERElUSU9OQUxfREVQRU5ERU5DSUVTCisKKyMgSW5pdGlhbGl6ZSBhIG1vZHVsZSBpbiBvdXIgZGF0YWJhc2UKKyMgJDE6IE1vZHVsZSBuYW1lCisjICQyOiBNb2R1bGUgdHlwZQorIyAkMzogIkhPU1QiIGZvciBhIGhvc3QgbW9kdWxlLCBlbXB0eSBmb3IgYSB0YXJnZXQgb25lLgorX2VtdWdsLWluaXQtbW9kdWxlID0gXAorICAgICQoZXZhbCBfZW11Z2xfSE9TVCA6PSAkKGlmICQzLEhPU1RfLCkpXAorICAgICQoZXZhbCBfZW11Z2xfTU9EVUxFIDo9ICQoX2VtdWdsX0hPU1QpJDEpXAorICAgICQoaWYgJChmaWx0ZXIgJChfZW11Z2xfJChfZW11Z2xfSE9TVCltb2R1bGVzKSwkKF9lbXVnbF9NT0RVTEUpKSxcCisgICAgICAgICQoZXJyb3IgVGhlcmUgaXMgYWxyZWFkeSBhICQoaWYgJDMsaG9zdCwpIG1vZHVsZSBuYW1lZCAkMSEpXAorICAgIClcCisgICAgJChldmFsIF9tb2QgPSAkKF9lbXVnbF9NT0RVTEUpKSBcCisgICAgJChldmFsIF9lbXVnbC4kKF9tb2QpLnR5cGUgOj0gJChwYXRzdWJzdCBIT1NUXyUsJSwkMikpXAorICAgICQoZXZhbCBfZW11Z2wuJChfbW9kKS5pbXBvcnRzIDo9KSBcCisgICAgJChldmFsIF9lbXVnbCwkKF9tb2QpLm1vdmVkIDo9KSBcCisgICAgJChmb3JlYWNoIF90eXBlLCQoRU1VR0xfRVhQT1JUX1RZUEVTKSxcCisgICAgICAgICQoZXZhbCBfZW11Z2wuJChfbW9kKS5leHBvcnQuJChfdHlwZSkgOj0pXAorICAgICkKKworIyBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG1vZHVsZSBleHBvcnRzIGEgZ2l2ZW4gbG9jYWwgdmFyaWFibGUgZm9yIGl0cworIyB1c2Vycy4gVGhpcyBhbHNvIGFkZHMgdGhpcyB0byBMT0NBTF8kMQorIyAkMTogTG9jYWwgdmFyaWFibGUgdHlwZSAoZS5nLiBDRkxBR1MsIExETElCUywgZXRjLi4uKQorIyAkMjogVmFsdWUocykgdG8gYXBwZW5kIHRvIHRoZSBleHBvcnQKK2VtdWdsLWV4cG9ydCA9IFwKKyAgICAkKGV2YWwgX2VtdWdsLiQoX2VtdWdsX01PRFVMRSkuZXhwb3J0LiQxICs9ICQyKVwKKyAgICAkKGV2YWwgTE9DQUxfJDEgOj0gJChMT0NBTF8kMSkgJDIpCisKKyMgQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgYSBtb2R1bGUgaW1wb3J0cyB0aGUgZXhwb3J0cyBvZiBhbm90aGVyIG1vZHVsZQorIyAkMTogbGlzdCBvZiBtb2R1bGVzIHRvIGltcG9ydAorIworZW11Z2wtaW1wb3J0ID0gXAorICAgICQoZm9yZWFjaCBfaW1vZCwkMSxcCisgICAgICAgICQoY2FsbCBfZW11Z2wtbW9kdWxlLWltcG9ydCwkKF9lbXVnbF9IT1NUKSQoX2ltb2QpKVwKKyAgICApCisKK19lbXVnbC1tb2R1bGUtaW1wb3J0ID0gXAorICAgICQoZXZhbCBfbW9kIDo9ICQoX2VtdWdsX01PRFVMRSkpXAorICAgICQoaWYgJChmaWx0ZXItb3V0ICQoX2VtdWdsXyQoX2VtdWdsX0hPU1QpbW9kdWxlcyksJDEpLFwKKyAgICAgICAgJChpbmZvIFVua25vd24gaW1wb3J0ZWQgZW11Z2xlcyBtb2R1bGU6ICQxKVwKKyAgICAgICAgJChpZiAkKF9lbXVnbF9IT1NUKSxcCisgICAgICAgICAgICAkKGV2YWwgX25hbWVzIDo9ICQocGF0c3Vic3QgSE9TVF8lLCUsJChfZW11Z2xfSE9TVF9tb2R1bGVzKSkpLFwKKyAgICAgICAgICAgICQoZXZhbCBfbmFtZXMgOj0gJChfZW11Z2xfbW9kdWxlcykpXAorICAgICAgICApXAorICAgICAgICAkKGluZm8gUGxlYXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIG5hbWVzOiAkKF9uYW1lcykpXAorICAgICAgICAkKGVycm9yIEFib3J0aW5nKVwKKyAgICApXAorICAgICQoaWYgJChmaWx0ZXItb3V0ICQoX2VtdWdsLiQoX21vZCkuaW1wb3J0cyksJDEpLFwKKyAgICAgICAgJChldmFsIF9lbXVnbC4kKF9tb2QpLmltcG9ydHMgKz0gJDEpXAorICAgICAgICAkKGZvcmVhY2ggX3N1YiwkKF9lbXVnbC4kMS5pbXBvcnRzKSxcCisgICAgICAgICAgICAkKGNhbGwgX2VtdWdsLW1vZHVsZS1pbXBvcnQsJChfc3ViKSlcCisgICAgICAgIClcCisgICAgICAgICQoZm9yZWFjaCBfdHlwZSwkKEVNVUdMX0VYUE9SVF9UWVBFUyksXAorICAgICAgICAgICAgJChldmFsIExPQ0FMXyQoX3R5cGUpIDo9ICQoTE9DQUxfJChfdHlwZSkpICQoX2VtdWdsLiQxLmV4cG9ydC4kKF90eXBlKSkpXAorICAgICAgICApXAorICAgICAgICAkKGlmICQoZmlsdGVyIEVYRUNVVEFCTEUgU0hBUkVEX0xJQlJBUlksJChfZW11Z2wuJChfZW11Z2xfTU9EVUxFKS50eXBlKSksXAorICAgICAgICAgICAgJChpZiAkKGZpbHRlciBTVEFUSUNfTElCUkFSWSwkKF9lbXVnbC4kMS50eXBlKSksXAorICAgICAgICAgICAgICAgICQoZXZhbCBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICQoMTpIT1NUXyU9JSkgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSlcCisgICAgICAgICAgICApXAorICAgICAgICAgICAgJChpZiAkKGZpbHRlciBTSEFSRURfTElCUkFSWSwkKF9lbXVnbC4kMS50eXBlKSksXAorICAgICAgICAgICAgICAgICQoaWYgJChfZW11Z2wuJDEubW92ZWQpLCxcCisgICAgICAgICAgICAgICAgICAkKGV2YWwgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAkKDE6SE9TVF8lPSUpICQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUykpXAorICAgICAgICAgICAgICAgIClcCisgICAgICAgICAgICApXAorICAgICAgICApXAorICAgICkKKworX2VtdWdsLWR1bXAtbGlzdCA9IFwKKyAgICAkKGZvcmVhY2ggX2xpc3RfaXRlbSwkKHN0cmlwICQxKSwkKGluZm8gLiAgICAkKF9saXN0X2l0ZW0pKSkKKworZW11Z2wtZHVtcC1tb2R1bGUgPSBcCisgICAgJChpbmZvIE1PRFVMRT0kKF9lbXVnbF9NT0RVTEUpKVwKKyAgICAkKGluZm8gLiAgSE9TVD0kKF9lbXVnbF9IT1NUKSlcCisgICAgJChpbmZvIC4gIFRZUEU9JChfZW11Z2wuJChfZW11Z2xfTU9EVUxFKS50eXBlKSlcCisgICAgJChpbmZvIC4gIElNUE9SVFM9JChfZW11Z2wuJChfZW11Z2xfTU9EVUxFKS5pbXBvcnRzKSlcCisgICAgJChmb3JlYWNoIF90eXBlLCQoRU1VR0xfRVhQT1JUX1RZUEVTKSxcCisgICAgICAgICQoaWYgJChmaWx0ZXIgQ19JTkNMVURFUyBBRERJVElPTkFMX0RFUEVOREVOQ0lFUywkKF90eXBlKSksXAorICAgICAgICAgICAgJChpbmZvIC4gIEVYUE9SVC4kKF90eXBlKSA6PSlcCisgICAgICAgICAgICAkKGNhbGwgX2VtdWdsLWR1bXAtbGlzdCwkKF9lbXVnbC4kKF9lbXVnbF9NT0RVTEUpLmV4cG9ydC4kKF90eXBlKSkpXAorICAgICAgICAgICAgJChpbmZvIC4gIExPQ0FMXyQoX3R5cGUpICA6PSlcCisgICAgICAgICAgICAkKGNhbGwgX2VtdWdsLWR1bXAtbGlzdCwkKExPQ0FMXyQoX3R5cGUpKSlcCisgICAgICAgICxcCisgICAgICAgICAgICAkKGluZm8gLiAgRVhQT1JULiQoX3R5cGUpIDo9ICQoc3RyaXAgJChfZW11Z2wuJChfZW11Z2xfTU9EVUxFKS5leHBvcnQuJChfdHlwZSkpKSlcCisgICAgICAgICAgICAkKGluZm8gLiAgTE9DQUxfJChfdHlwZSkgIDo9ICQoc3RyaXAgJChMT0NBTF8kKF90eXBlKSkpKVwKKyAgICAgICAgKVwKKyAgICApXAorICAgICQoaW5mbyAuICBMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpKVwKKworIyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgdGhlIGRlY29kZXIgc291cmNlIGZpbGVzLgorIyBMT0NBTF9NT0RVTEUgYW5kIExPQ0FMX01PRFVMRV9DTEFTUyBtdXN0IGJlIGRlZmluZWQgb3IgdGhlIGJ1aWxkIHdpbGwgYWJvcnQuCisjIFNvdXJjZSBmaWxlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgbG9jYWwgaW50ZXJtZWRpYXRlcyBkaXJlY3RvcnkgdGhhdCB3aWxsCisjIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8geW91ciBMT0NBTF9DX0lOQ0xVREVTLgorIworIyBVc2FnZToKKyMgICAgJChjYWxsIGVtdWdsLWdlbi1kZWNvZGVyLDxpbnB1dC1kaXI+LDxiYXNlbmFtZT4pCisjCitlbXVnbC1nZW4tZGVjb2RlciA9IFwKKyAgICAkKGV2YWwgX2VtdWdsX291dCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCQoQlVJTERfVEFSR0VUX0JJVFMpLCQyKSlcCisgICAgJChjYWxsIGVtdWdsLWdlbi1kZWNvZGVyLWdlbmVyaWMsJChfZW11Z2xfb3V0KSwkMSwkMilcCisgICAgJChjYWxsIGVtdWdsLWV4cG9ydCxDX0lOQ0xVREVTLCQoX2VtdWdsX291dCkpCisKKyMgRE8gTk9UIENBTEwgRElSRUNUTFksIFVTRSBlbXVnbC1nZW4tZGVjb2RlciBpbnN0ZWFkLgorIworIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgd2lyZSBwcm90b2NvbCBkZWNvZGVyCisjIHNvdXJjZSBmaWxlcywgVXNhZ2UgaXM6CisjCisjICAkKGNhbGwgZW11Z2wtZ2VuLWRlY29kZXItZ2VuZXJpYyw8ZHN0LWRpcj4sPHNyYy1kaXI+LDxiYXNlbmFtZT4pCisjCisjICA8ZHN0LWRpcj4gaXMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB3aGVyZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgYXJlIHN0b3JlZAorIyAgPHNyYy1kaXI+IGlzIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgPGJhc2VuYW1lPi5hdHRyaWIsIGV0Yy4uCisjICA8YmFzZW5hbWU+IGlzIHRoZSBlbXVnZW4gYmFzZW5hbWUgKHNlZSBob3N0L3Rvb2xzL2VtdWdlbi9SRUFETUUpCisjCitlbXVnbC1nZW4tZGVjb2Rlci1nZW5lcmljID0gJChldmFsICQoZW11Z2wtZ2VuLWRlY29kZXItZ2VuZXJpYy1ldikpCisKK2RlZmluZSBlbXVnbC1nZW4tZGVjb2Rlci1nZW5lcmljLWV2CitfZW11Z2xfZGVjIDo9ICQkMS8kJDMKK19lbXVnbF9zcmMgOj0gJCQyLyQkMworR0VOIDo9ICQkKF9lbXVnbF9kZWMpX2RlYy5jcHAgXAorICAgICAgICQkKF9lbXVnbF9kZWMpX2RlYy5oIFwKKyAgICAgICAkJChfZW11Z2xfZGVjKV9vcGNvZGVzLmggXAorICAgICAgICQkKF9lbXVnbF9kZWMpX3NlcnZlcl9jb250ZXh0LmggXAorICAgICAgICQkKF9lbXVnbF9kZWMpX3NlcnZlcl9jb250ZXh0LmNwcAorCiskJChHRU4pOiBQUklWQVRFX1BBVEggOj0gJCQoTE9DQUxfUEFUSCkKKyQkKEdFTik6IFBSSVZBVEVfQ1VTVE9NX1RPT0wgOj0gJCQoRU1VR0xfRU1VR0VOKSAtRCAkJDEgLWkgJCQyICQkMworJCQoR0VOKTogJCQoRU1VR0xfRU1VR0VOKSAkJChfZW11Z2xfc3JjKS5hdHRyaWIgJCQoX2VtdWdsX3NyYykuaW4gJCQoX2VtdWdsX3NyYykudHlwZXMKKwkkJCh0cmFuc2Zvcm0tZ2VuZXJhdGVkLXNvdXJjZSkKKworJCQoY2FsbCBlbXVnbC1leHBvcnQsQURESVRJT05BTF9ERVBFTkRFTkNJRVMsJCQoR0VOKSkKK0xPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTICs9ICQkKEdFTikKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJCQxCitlbmRlZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvZ29vZ2xldGVzdC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9nb29nbGV0ZXN0Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MmY4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvZ29vZ2xldGVzdC5tawpAQCAtMCwwICsxLDM2IEBACisjIFRoaXMgY29udGFpbnMgY29tbW9uIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lIGEgaG9zdCBtb2R1bGUKKyMgdG8gbGluayBHb29nbGVUZXN0IHdpdGggdGhlIEVtdUdMIHRlc3QgcHJvZ3JhbXMuCisjCisjIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIGluY2x1ZGluZyBleHRlcm5hbC9ndGVzdC9BbmRyb2lkLm1rIHRvCisjIGJlIGFibGUgdG8gYnVpbGQgYm90aCB0aGUgMzItYml0IGFuZCA2NC1iaXQgYmluYXJpZXMgd2hpbGUKKyMgYnVpbGRpbmcgYSAzMi1iaXQgb25seSBTREsgKHNkay1lbmcsIHNka194ODYtZW5nLCBzZGtfbWlwcy1lbmcpLgorCisKK0xPQ0FMX1BBVEggOj0gJChFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTX0RJUikKKworY29tbW9uX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL2d0ZXN0LWFsbC5jYyBcCisgICAgc3JjL2d0ZXN0X21haW4uY2MKKworY29tbW9uX0NGTEFHUyA6PSAtTzAgLVduby11bnVzZWQtdmFyaWFibGUKKworaWZuZXEgKHdpbmRvd3MsJChCVUlMRF9UQVJHRVRfT1MpKQorICAgIGNvbW1vbl9MRExJQlMgKz0gLWxwdGhyZWFkCitlbmRpZgorCiskKGNhbGwgZW11Z2wtYmVnaW4tc3RhdGljLWxpYnJhcnksbGliZW11Z2xfZ3Rlc3QpCitMT0NBTF9TUkNfRklMRVMgOj0gJChjb21tb25fU1JDX0ZJTEVTKQorTE9DQUxfQ0ZMQUdTICs9ICQoY29tbW9uX0NGTEFHUykKK0xPQ0FMX0NQUF9FWFRFTlNJT04gOj0gLmNjCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChMT0NBTF9QQVRIKS9pbmNsdWRlKQorJChjYWxsIGVtdWdsLWV4cG9ydCxMRExJQlMsJChjb21tb25fTERMSUJTKSkKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQorCiskKGNhbGwgZW11Z2wtYmVnaW4taG9zdC1zdGF0aWMtbGlicmFyeSxsaWJlbXVnbF9ndGVzdF9ob3N0KQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY29tbW9uX1NSQ19GSUxFUykKK0xPQ0FMX0NGTEFHUyArPSAkKGNvbW1vbl9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorTE9DQUxfQ1BQX0VYVEVOU0lPTiA6PSAuY2MKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ19JTkNMVURFUywkKExPQ0FMX1BBVEgpL2luY2x1ZGUpCiskKGNhbGwgZW11Z2wtZXhwb3J0LExETElCUywkKGNvbW1vbl9MRExJQlMpIC1scHRocmVhZCkKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FR0wvZWdsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0VHTC9lZ2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTUyZWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FR0wvZWdsLmgKQEAgLTAsMCArMSwzMDMgQEAKKyNpZm5kZWYgX19lZ2xfaF8KKyNkZWZpbmUgX19lZ2xfaF8gMQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisqKgorKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bworKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyoqCisqKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgorKioKKyoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisqKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisqKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCisqLworLyoKKyoqIFRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBLaHJvbm9zIE9wZW5HTCAvIE9wZW5HTCBFUyBYTUwKKyoqIEFQSSBSZWdpc3RyeS4gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgUmVnaXN0cnksIGdlbmVyYXRvciBzY3JpcHRzCisqKiB1c2VkIHRvIG1ha2UgdGhlIGhlYWRlciwgYW5kIHRoZSBoZWFkZXIgY2FuIGJlIGZvdW5kIGF0CisqKiAgIGh0dHA6Ly93d3cub3BlbmdsLm9yZy9yZWdpc3RyeS8KKyoqCisqKiBLaHJvbm9zICRSZXZpc2lvbjogMzI4ODkgJCBvbiAkRGF0ZTogMjAxNi0wNS0zMSAwNDowOTo1MSAtMDcwMCAoVHVlLCAzMSBNYXkgMjAxNikgJAorKi8KKworI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgorCisvKiBHZW5lcmF0ZWQgb24gZGF0ZSAyMDE2MDUzMSAqLworCisvKiBHZW5lcmF0ZWQgQyBoZWFkZXIgZm9yOgorICogQVBJOiBlZ2wKKyAqIFZlcnNpb25zIGNvbnNpZGVyZWQ6IC4qCisgKiBWZXJzaW9ucyBlbWl0dGVkOiAuKgorICogRGVmYXVsdCBleHRlbnNpb25zIGluY2x1ZGVkOiBOb25lCisgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgaW5jbHVkZWQ6IF9ub21hdGNoX14KKyAqIEV4dGVuc2lvbnMgcmVtb3ZlZDogX25vbWF0Y2hfXgorICovCisKKyNpZm5kZWYgRUdMX1ZFUlNJT05fMV8wCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMCAxCit0eXBlZGVmIHVuc2lnbmVkIGludCBFR0xCb29sZWFuOwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7Cit0eXBlZGVmIHZvaWQgKCpfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSh2b2lkKTsKKyNkZWZpbmUgRUdMX0FMUEhBX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4MzAyMQorI2RlZmluZSBFR0xfQkFEX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgMHgzMDAyCisjZGVmaW5lIEVHTF9CQURfQUxMT0MgICAgICAgICAgICAgICAgICAgICAweDMwMDMKKyNkZWZpbmUgRUdMX0JBRF9BVFRSSUJVVEUgICAgICAgICAgICAgICAgIDB4MzAwNAorI2RlZmluZSBFR0xfQkFEX0NPTkZJRyAgICAgICAgICAgICAgICAgICAgMHgzMDA1CisjZGVmaW5lIEVHTF9CQURfQ09OVEVYVCAgICAgICAgICAgICAgICAgICAweDMwMDYKKyNkZWZpbmUgRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UgICAgICAgICAgIDB4MzAwNworI2RlZmluZSBFR0xfQkFEX0RJU1BMQVkgICAgICAgICAgICAgICAgICAgMHgzMDA4CisjZGVmaW5lIEVHTF9CQURfTUFUQ0ggICAgICAgICAgICAgICAgICAgICAweDMwMDkKKyNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQICAgICAgICAgICAgIDB4MzAwQQorI2RlZmluZSBFR0xfQkFEX05BVElWRV9XSU5ET1cgICAgICAgICAgICAgMHgzMDBCCisjZGVmaW5lIEVHTF9CQURfUEFSQU1FVEVSICAgICAgICAgICAgICAgICAweDMwMEMKKyNkZWZpbmUgRUdMX0JBRF9TVVJGQUNFICAgICAgICAgICAgICAgICAgIDB4MzAwRAorI2RlZmluZSBFR0xfQkxVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgMHgzMDIyCisjZGVmaW5lIEVHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAweDMwMjAKKyNkZWZpbmUgRUdMX0NPTkZJR19DQVZFQVQgICAgICAgICAgICAgICAgIDB4MzAyNworI2RlZmluZSBFR0xfQ09ORklHX0lEICAgICAgICAgICAgICAgICAgICAgMHgzMDI4CisjZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUgICAgICAgICAgICAweDMwNUIKKyNkZWZpbmUgRUdMX0RFUFRIX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4MzAyNQorI2RlZmluZSBFR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgKChFR0xpbnQpLTEpCisjZGVmaW5lIEVHTF9EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwNTkKKyNkZWZpbmUgRUdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgIDB4MzA1NQorI2RlZmluZSBFR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFR0xfR1JFRU5fU0laRSAgICAgICAgICAgICAgICAgICAgMHgzMDIzCisjZGVmaW5lIEVHTF9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAweDMwNTYKKyNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUiAgICAgICAgICAgICAgIDB4MzA1OAorI2RlZmluZSBFR0xfTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDI5CisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDMwMkEKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1BJWEVMUyAgICAgICAgICAgIDB4MzAyQgorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHgzMDJDCisjZGVmaW5lIEVHTF9OQVRJVkVfUkVOREVSQUJMRSAgICAgICAgICAgICAweDMwMkQKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfSUQgICAgICAgICAgICAgIDB4MzAyRQorI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFICAgICAgICAgICAgMHgzMDJGCisjZGVmaW5lIEVHTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMzgKKyNkZWZpbmUgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRyAgICAgICAgIDB4MzA1MQorI2RlZmluZSBFR0xfTk9UX0lOSVRJQUxJWkVEICAgICAgICAgICAgICAgMHgzMDAxCisjZGVmaW5lIEVHTF9OT19DT05URVhUICAgICAgICAgICAgICAgICAgICAoKEVHTENvbnRleHQpMCkKKyNkZWZpbmUgRUdMX05PX0RJU1BMQVkgICAgICAgICAgICAgICAgICAgICgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAgICAgICAgICAgICAgICAgICAgKChFR0xTdXJmYWNlKTApCisjZGVmaW5lIEVHTF9QQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRUdMX1BJWE1BUF9CSVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBFR0xfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDVBCisjZGVmaW5lIEVHTF9SRURfU0laRSAgICAgICAgICAgICAgICAgICAgICAweDMwMjQKKyNkZWZpbmUgRUdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgIDB4MzAzMQorI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgMHgzMDMyCisjZGVmaW5lIEVHTF9TTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICAweDMwNTAKKyNkZWZpbmUgRUdMX1NURU5DSUxfU0laRSAgICAgICAgICAgICAgICAgIDB4MzAyNgorI2RlZmluZSBFR0xfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUgICAgICAgICAgICAgICAgICAweDMwMzMKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgICAgIDB4MzAzNQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgICAgMHgzMDM2CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAgICAweDMwMzcKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQiAgICAgICAgICAgICAgIDB4MzA1MgorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRSAgICAgICAgICAgICAgMHgzMDM0CisjZGVmaW5lIEVHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEVHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAweDMwNTMKKyNkZWZpbmUgRUdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MzA1NAorI2RlZmluZSBFR0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDU3CisjZGVmaW5lIEVHTF9XSU5ET1dfQklUICAgICAgICAgICAgICAgICAgICAweDAwMDQKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbENob29zZUNvbmZpZyAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKK0VHTEFQSSBFR0xDb250ZXh0IEVHTEFQSUVOVFJZIGVnbENyZWF0ZUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xDb250ZXh0IHNoYXJlX2NvbnRleHQsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4sIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRDb25maWdBdHRyaWIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldENvbmZpZ3MgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKK0VHTEFQSSBFR0xEaXNwbGF5IEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnREaXNwbGF5ICh2b2lkKTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnRTdXJmYWNlIChFR0xpbnQgcmVhZGRyYXcpOworRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0RGlzcGxheSAoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheV9pZCk7CitFR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbEdldEVycm9yICh2b2lkKTsKK0VHTEFQSSBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIEVHTEFQSUVOVFJZIGVnbEdldFByb2NBZGRyZXNzIChjb25zdCBjaGFyICpwcm9jbmFtZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xJbml0aWFsaXplIChFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcik7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xNYWtlQ3VycmVudCAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdywgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CitFR0xBUEkgY29uc3QgY2hhciAqRUdMQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcgKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsVGVybWluYXRlIChFR0xEaXNwbGF5IGRweSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xXYWl0R0wgKHZvaWQpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZSAoRUdMaW50IGVuZ2luZSk7CisjZW5kaWYgLyogRUdMX1ZFUlNJT05fMV8wICovCisKKyNpZm5kZWYgRUdMX1ZFUlNJT05fMV8xCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMSAxCisjZGVmaW5lIEVHTF9CQUNLX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDMwODQKKyNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IgICAgICAgICAgIDB4MzAzOQorI2RlZmluZSBFR0xfQklORF9UT19URVhUVVJFX1JHQkEgICAgICAgICAgMHgzMDNBCisjZGVmaW5lIEVHTF9DT05URVhUX0xPU1QgICAgICAgICAgICAgICAgICAweDMwMEUKKyNkZWZpbmUgRUdMX01JTl9TV0FQX0lOVEVSVkFMICAgICAgICAgICAgIDB4MzAzQgorI2RlZmluZSBFR0xfTUFYX1NXQVBfSU5URVJWQUwgICAgICAgICAgICAgMHgzMDNDCisjZGVmaW5lIEVHTF9NSVBNQVBfVEVYVFVSRSAgICAgICAgICAgICAgICAweDMwODIKKyNkZWZpbmUgRUdMX01JUE1BUF9MRVZFTCAgICAgICAgICAgICAgICAgIDB4MzA4MworI2RlZmluZSBFR0xfTk9fVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgMHgzMDVDCisjZGVmaW5lIEVHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAweDMwNUYKKyNkZWZpbmUgRUdMX1RFWFRVUkVfRk9STUFUICAgICAgICAgICAgICAgIDB4MzA4MAorI2RlZmluZSBFR0xfVEVYVFVSRV9SR0IgICAgICAgICAgICAgICAgICAgMHgzMDVECisjZGVmaW5lIEVHTF9URVhUVVJFX1JHQkEgICAgICAgICAgICAgICAgICAweDMwNUUKKyNkZWZpbmUgRUdMX1RFWFRVUkVfVEFSR0VUICAgICAgICAgICAgICAgIDB4MzA4MQorRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZFRleEltYWdlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYnVmZmVyKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFJlbGVhc2VUZXhJbWFnZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcik7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTdXJmYWNlQXR0cmliIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEludGVydmFsIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGludGVydmFsKTsKKyNlbmRpZiAvKiBFR0xfVkVSU0lPTl8xXzEgKi8KKworI2lmbmRlZiBFR0xfVkVSU0lPTl8xXzIKKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV8yIDEKK3R5cGVkZWYgdW5zaWduZWQgaW50IEVHTGVudW07Cit0eXBlZGVmIHZvaWQgKkVHTENsaWVudEJ1ZmZlcjsKKyNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVCAgICAgICAgICAgICAgICAgIDB4MzA4OAorI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUX05PTlBSRSAgICAgICAgICAgMHgzMDhCCisjZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfUFJFICAgICAgICAgICAgICAweDMwOEMKKyNkZWZpbmUgRUdMX0FMUEhBX01BU0tfU0laRSAgICAgICAgICAgICAgIDB4MzAzRQorI2RlZmluZSBFR0xfQlVGRkVSX1BSRVNFUlZFRCAgICAgICAgICAgICAgMHgzMDk0CisjZGVmaW5lIEVHTF9CVUZGRVJfREVTVFJPWUVEICAgICAgICAgICAgICAweDMwOTUKKyNkZWZpbmUgRUdMX0NMSUVOVF9BUElTICAgICAgICAgICAgICAgICAgIDB4MzA4RAorI2RlZmluZSBFR0xfQ09MT1JTUEFDRSAgICAgICAgICAgICAgICAgICAgMHgzMDg3CisjZGVmaW5lIEVHTF9DT0xPUlNQQUNFX3NSR0IgICAgICAgICAgICAgICAweDMwODkKKyNkZWZpbmUgRUdMX0NPTE9SU1BBQ0VfTElORUFSICAgICAgICAgICAgIDB4MzA4QQorI2RlZmluZSBFR0xfQ09MT1JfQlVGRkVSX1RZUEUgICAgICAgICAgICAgMHgzMDNGCisjZGVmaW5lIEVHTF9DT05URVhUX0NMSUVOVF9UWVBFICAgICAgICAgICAweDMwOTcKKyNkZWZpbmUgRUdMX0RJU1BMQVlfU0NBTElORyAgICAgICAgICAgICAgIDEwMDAwCisjZGVmaW5lIEVHTF9IT1JJWk9OVEFMX1JFU09MVVRJT04gICAgICAgICAweDMwOTAKKyNkZWZpbmUgRUdMX0xVTUlOQU5DRV9CVUZGRVIgICAgICAgICAgICAgIDB4MzA4RgorI2RlZmluZSBFR0xfTFVNSU5BTkNFX1NJWkUgICAgICAgICAgICAgICAgMHgzMDNECisjZGVmaW5lIEVHTF9PUEVOR0xfRVNfQklUICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgRUdMX09QRU5WR19CSVQgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBFR0xfT1BFTkdMX0VTX0FQSSAgICAgICAgICAgICAgICAgMHgzMEEwCisjZGVmaW5lIEVHTF9PUEVOVkdfQVBJICAgICAgICAgICAgICAgICAgICAweDMwQTEKKyNkZWZpbmUgRUdMX09QRU5WR19JTUFHRSAgICAgICAgICAgICAgICAgIDB4MzA5NgorI2RlZmluZSBFR0xfUElYRUxfQVNQRUNUX1JBVElPICAgICAgICAgICAgMHgzMDkyCisjZGVmaW5lIEVHTF9SRU5ERVJBQkxFX1RZUEUgICAgICAgICAgICAgICAweDMwNDAKKyNkZWZpbmUgRUdMX1JFTkRFUl9CVUZGRVIgICAgICAgICAgICAgICAgIDB4MzA4NgorI2RlZmluZSBFR0xfUkdCX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgMHgzMDhFCisjZGVmaW5lIEVHTF9TSU5HTEVfQlVGRkVSICAgICAgICAgICAgICAgICAweDMwODUKKyNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1IgICAgICAgICAgICAgICAgIDB4MzA5MworI2RlZmluZSBFR0xfVU5LTk9XTiAgICAgICAgICAgICAgICAgICAgICAgKChFR0xpbnQpLTEpCisjZGVmaW5lIEVHTF9WRVJUSUNBTF9SRVNPTFVUSU9OICAgICAgICAgICAweDMwOTEKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEJpbmRBUEkgKEVHTGVudW0gYXBpKTsKK0VHTEFQSSBFR0xlbnVtIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5QVBJICh2b2lkKTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSBidWZ0eXBlLCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLCBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFJlbGVhc2VUaHJlYWQgKHZvaWQpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsV2FpdENsaWVudCAodm9pZCk7CisjZW5kaWYgLyogRUdMX1ZFUlNJT05fMV8yICovCisKKyNpZm5kZWYgRUdMX1ZFUlNJT05fMV8zCisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfMyAxCisjZGVmaW5lIEVHTF9DT05GT1JNQU5UICAgICAgICAgICAgICAgICAgICAweDMwNDIKKyNkZWZpbmUgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gICAgICAgIDB4MzA5OAorI2RlZmluZSBFR0xfTUFUQ0hfTkFUSVZFX1BJWE1BUCAgICAgICAgICAgMHgzMDQxCisjZGVmaW5lIEVHTF9PUEVOR0xfRVMyX0JJVCAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVCAgICAgICAgICAgICAgIDB4MzA4OAorI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX05PTlBSRSAgICAgICAgMHgzMDhCCisjZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFICAgICAgICAgICAweDMwOEMKKyNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkVfQklUICAgICAgIDB4MDA0MAorI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRSAgICAgICAgICAgICAgICAgMHgzMDg3CisjZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX3NSR0IgICAgICAgICAgICAweDMwODkKKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSICAgICAgICAgIDB4MzA4QQorI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVJfQklUICAgICAgMHgwMDIwCisjZW5kaWYgLyogRUdMX1ZFUlNJT05fMV8zICovCisKKyNpZm5kZWYgRUdMX1ZFUlNJT05fMV80CisjZGVmaW5lIEVHTF9WRVJTSU9OXzFfNCAxCisjZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgICAgICAgICAgICAgICAoKEVHTE5hdGl2ZURpc3BsYXlUeXBlKTApCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0JPWF9CSVQgICAweDAyMDAKKyNkZWZpbmUgRUdMX01VTFRJU0FNUExFX1JFU09MVkUgICAgICAgICAgIDB4MzA5OQorI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9ERUZBVUxUICAgMHgzMDlBCisjZGVmaW5lIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFX0JPWCAgICAgICAweDMwOUIKKyNkZWZpbmUgRUdMX09QRU5HTF9BUEkgICAgICAgICAgICAgICAgICAgIDB4MzBBMgorI2RlZmluZSBFR0xfT1BFTkdMX0JJVCAgICAgICAgICAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lIEVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQgICAweDA0MDAKK0VHTEFQSSBFR0xDb250ZXh0IEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnRDb250ZXh0ICh2b2lkKTsKKyNlbmRpZiAvKiBFR0xfVkVSU0lPTl8xXzQgKi8KKworI2lmbmRlZiBFR0xfVkVSU0lPTl8xXzUKKyNkZWZpbmUgRUdMX1ZFUlNJT05fMV81IDEKK3R5cGVkZWYgdm9pZCAqRUdMU3luYzsKK3R5cGVkZWYgaW50cHRyX3QgRUdMQXR0cmliOwordHlwZWRlZiBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgRUdMVGltZTsKK3R5cGVkZWYgdm9pZCAqRUdMSW1hZ2U7CisjZGVmaW5lIEVHTF9DT05URVhUX01BSk9SX1ZFUlNJT04gICAgICAgICAweDMwOTgKKyNkZWZpbmUgRUdMX0NPTlRFWFRfTUlOT1JfVkVSU0lPTiAgICAgICAgIDB4MzBGQgorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfUFJPRklMRV9NQVNLICAgMHgzMEZECisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1kgMHgzMUJECisjZGVmaW5lIEVHTF9OT19SRVNFVF9OT1RJRklDQVRJT04gICAgICAgICAweDMxQkUKKyNkZWZpbmUgRUdMX0xPU0VfQ09OVEVYVF9PTl9SRVNFVCAgICAgICAgIDB4MzFCRgorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfQ09SRV9QUk9GSUxFX0JJVCAweDAwMDAwMDAxCisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9DT01QQVRJQklMSVRZX1BST0ZJTEVfQklUIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUdMX0NPTlRFWFRfT1BFTkdMX0RFQlVHICAgICAgICAgIDB4MzFCMAorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfRk9SV0FSRF9DT01QQVRJQkxFIDB4MzFCMQorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfUk9CVVNUX0FDQ0VTUyAgMHgzMUIyCisjZGVmaW5lIEVHTF9PUEVOR0xfRVMzX0JJVCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEVHTF9DTF9FVkVOVF9IQU5ETEUgICAgICAgICAgICAgICAweDMwOUMKKyNkZWZpbmUgRUdMX1NZTkNfQ0xfRVZFTlQgICAgICAgICAgICAgICAgIDB4MzBGRQorI2RlZmluZSBFR0xfU1lOQ19DTF9FVkVOVF9DT01QTEVURSAgICAgICAgMHgzMEZGCisjZGVmaW5lIEVHTF9TWU5DX1BSSU9SX0NPTU1BTkRTX0NPTVBMRVRFICAweDMwRjAKKyNkZWZpbmUgRUdMX1NZTkNfVFlQRSAgICAgICAgICAgICAgICAgICAgIDB4MzBGNworI2RlZmluZSBFR0xfU1lOQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgMHgzMEYxCisjZGVmaW5lIEVHTF9TWU5DX0NPTkRJVElPTiAgICAgICAgICAgICAgICAweDMwRjgKKyNkZWZpbmUgRUdMX1NJR05BTEVEICAgICAgICAgICAgICAgICAgICAgIDB4MzBGMgorI2RlZmluZSBFR0xfVU5TSUdOQUxFRCAgICAgICAgICAgICAgICAgICAgMHgzMEYzCisjZGVmaW5lIEVHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVCAgICAgICAweDAwMDEKKyNkZWZpbmUgRUdMX0ZPUkVWRVIgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRnVsbAorI2RlZmluZSBFR0xfVElNRU9VVF9FWFBJUkVEICAgICAgICAgICAgICAgMHgzMEY1CisjZGVmaW5lIEVHTF9DT05ESVRJT05fU0FUSVNGSUVEICAgICAgICAgICAweDMwRjYKKyNkZWZpbmUgRUdMX05PX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICgoRUdMU3luYykwKQorI2RlZmluZSBFR0xfU1lOQ19GRU5DRSAgICAgICAgICAgICAgICAgICAgMHgzMEY5CisjZGVmaW5lIEVHTF9HTF9DT0xPUlNQQUNFICAgICAgICAgICAgICAgICAweDMwOUQKKyNkZWZpbmUgRUdMX0dMX0NPTE9SU1BBQ0VfU1JHQiAgICAgICAgICAgIDB4MzA4OQorI2RlZmluZSBFR0xfR0xfQ09MT1JTUEFDRV9MSU5FQVIgICAgICAgICAgMHgzMDhBCisjZGVmaW5lIEVHTF9HTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAweDMwQjkKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgIDB4MzBCMQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9MRVZFTCAgICAgICAgICAgICAgMHgzMEJDCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFXzNEICAgICAgICAgICAgICAgICAweDMwQjIKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfWk9GRlNFVCAgICAgICAgICAgIDB4MzBCRAorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIDB4MzBCMworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YIDB4MzBCNAorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZIDB4MzBCNQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZIDB4MzBCNgorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aIDB4MzBCNworI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aIDB4MzBCOAorI2RlZmluZSBFR0xfSU1BR0VfUFJFU0VSVkVEICAgICAgICAgICAgICAgMHgzMEQyCisjZGVmaW5lIEVHTF9OT19JTUFHRSAgICAgICAgICAgICAgICAgICAgICAoKEVHTEltYWdlKTApCitFR0xBUEkgRUdMU3luYyBFR0xBUElFTlRSWSBlZ2xDcmVhdGVTeW5jIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTeW5jIChFR0xEaXNwbGF5IGRweSwgRUdMU3luYyBzeW5jKTsKK0VHTEFQSSBFR0xpbnQgRUdMQVBJRU5UUlkgZWdsQ2xpZW50V2FpdFN5bmMgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZSB0aW1lb3V0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldFN5bmNBdHRyaWIgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOworRUdMQVBJIEVHTEltYWdlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZUltYWdlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGVudW0gdGFyZ2V0LCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lJbWFnZSAoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlIGltYWdlKTsKK0VHTEFQSSBFR0xEaXNwbGF5IEVHTEFQSUVOVFJZIGVnbEdldFBsYXRmb3JtRGlzcGxheSAoRUdMZW51bSBwbGF0Zm9ybSwgdm9pZCAqbmF0aXZlX2Rpc3BsYXksIGNvbnN0IEVHTEF0dHJpYiAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGxhdGZvcm1XaW5kb3dTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgdm9pZCAqbmF0aXZlX3dpbmRvdywgY29uc3QgRUdMQXR0cmliICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVQbGF0Zm9ybVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCB2b2lkICpuYXRpdmVfcGl4bWFwLCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXRTeW5jIChFR0xEaXNwbGF5IGRweSwgRUdMU3luYyBzeW5jLCBFR0xpbnQgZmxhZ3MpOworI2VuZGlmIC8qIEVHTF9WRVJTSU9OXzFfNSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvRUdML2VnbGV4dC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FR0wvZWdsZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5N2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvRUdML2VnbGV4dC5oCkBAIC0wLDAgKzEsOTk2IEBACisjaWZuZGVmIF9fZWdsZXh0X2hfCisjZGVmaW5lIF9fZWdsZXh0X2hfIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBPcGVuR0wgLyBPcGVuR0wgRVMgWE1MCisqKiBBUEkgUmVnaXN0cnkuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJlZ2lzdHJ5LCBnZW5lcmF0b3Igc2NyaXB0cworKiogdXNlZCB0byBtYWtlIHRoZSBoZWFkZXIsIGFuZCB0aGUgaGVhZGVyIGNhbiBiZSBmb3VuZCBhdAorKiogICBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvCisqKgorKiogS2hyb25vcyAkUmV2aXNpb246IDMyOTM4ICQgb24gJERhdGU6IDIwMTYtMDYtMDYgMTc6NTY6MTUgLTA3MDAgKE1vbiwgMDYgSnVuIDIwMTYpICQKKyovCisKKyNpbmNsdWRlIDxFR0wvZWdscGxhdGZvcm0uaD4KKworI2RlZmluZSBFR0xfRUdMRVhUX1ZFUlNJT04gMjAxNjA2MDYKKworLyogR2VuZXJhdGVkIEMgaGVhZGVyIGZvcjoKKyAqIEFQSTogZWdsCisgKiBWZXJzaW9ucyBjb25zaWRlcmVkOiAuKgorICogVmVyc2lvbnMgZW1pdHRlZDogX25vbWF0Y2hfXgorICogRGVmYXVsdCBleHRlbnNpb25zIGluY2x1ZGVkOiBlZ2wKKyAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBpbmNsdWRlZDogX25vbWF0Y2hfXgorICogRXh0ZW5zaW9ucyByZW1vdmVkOiBfbm9tYXRjaF9eCisgKi8KKworI2lmbmRlZiBFR0xfS0hSX2NsX2V2ZW50CisjZGVmaW5lIEVHTF9LSFJfY2xfZXZlbnQgMQorI2RlZmluZSBFR0xfQ0xfRVZFTlRfSEFORExFX0tIUiAgICAgICAgICAgMHgzMDlDCisjZGVmaW5lIEVHTF9TWU5DX0NMX0VWRU5UX0tIUiAgICAgICAgICAgICAweDMwRkUKKyNkZWZpbmUgRUdMX1NZTkNfQ0xfRVZFTlRfQ09NUExFVEVfS0hSICAgIDB4MzBGRgorI2VuZGlmIC8qIEVHTF9LSFJfY2xfZXZlbnQgKi8KKworI2lmbmRlZiBFR0xfS0hSX2NsX2V2ZW50MgorI2RlZmluZSBFR0xfS0hSX2NsX2V2ZW50MiAxCit0eXBlZGVmIHZvaWQgKkVHTFN5bmNLSFI7Cit0eXBlZGVmIGludHB0cl90IEVHTEF0dHJpYktIUjsKK3R5cGVkZWYgRUdMU3luY0tIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURVNZTkM2NEtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xBdHRyaWJLSFIgKmF0dHJpYl9saXN0KTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xTeW5jS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVN5bmM2NEtIUiAoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMQXR0cmliS0hSICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX2NsX2V2ZW50MiAqLworCisjaWZuZGVmIEVHTF9LSFJfY2xpZW50X2dldF9hbGxfcHJvY19hZGRyZXNzZXMKKyNkZWZpbmUgRUdMX0tIUl9jbGllbnRfZ2V0X2FsbF9wcm9jX2FkZHJlc3NlcyAxCisjZW5kaWYgLyogRUdMX0tIUl9jbGllbnRfZ2V0X2FsbF9wcm9jX2FkZHJlc3NlcyAqLworCisjaWZuZGVmIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMKKyNkZWZpbmUgRUdMX0tIUl9jb25maWdfYXR0cmlicyAxCisjZGVmaW5lIEVHTF9DT05GT1JNQU5UX0tIUiAgICAgICAgICAgICAgICAweDMwNDIKKyNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSX0JJVF9LSFIgIDB4MDAyMAorI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRV9CSVRfS0hSICAgMHgwMDQwCisjZW5kaWYgLyogRUdMX0tIUl9jb25maWdfYXR0cmlicyAqLworCisjaWZuZGVmIEVHTF9LSFJfY3JlYXRlX2NvbnRleHQKKyNkZWZpbmUgRUdMX0tIUl9jcmVhdGVfY29udGV4dCAxCisjZGVmaW5lIEVHTF9DT05URVhUX01BSk9SX1ZFUlNJT05fS0hSICAgICAweDMwOTgKKyNkZWZpbmUgRUdMX0NPTlRFWFRfTUlOT1JfVkVSU0lPTl9LSFIgICAgIDB4MzBGQgorI2RlZmluZSBFR0xfQ09OVEVYVF9GTEFHU19LSFIgICAgICAgICAgICAgMHgzMEZDCisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9QUk9GSUxFX01BU0tfS0hSIDB4MzBGRAorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0tIUiAweDMxQkQKKyNkZWZpbmUgRUdMX05PX1JFU0VUX05PVElGSUNBVElPTl9LSFIgICAgIDB4MzFCRQorI2RlZmluZSBFR0xfTE9TRV9DT05URVhUX09OX1JFU0VUX0tIUiAgICAgMHgzMUJGCisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9ERUJVR19CSVRfS0hSICAweDAwMDAwMDAxCisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9GT1JXQVJEX0NPTVBBVElCTEVfQklUX0tIUiAweDAwMDAwMDAyCisjZGVmaW5lIEVHTF9DT05URVhUX09QRU5HTF9ST0JVU1RfQUNDRVNTX0JJVF9LSFIgMHgwMDAwMDAwNAorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfQ09SRV9QUk9GSUxFX0JJVF9LSFIgMHgwMDAwMDAwMQorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfQ09NUEFUSUJJTElUWV9QUk9GSUxFX0JJVF9LSFIgMHgwMDAwMDAwMgorI2RlZmluZSBFR0xfT1BFTkdMX0VTM19CSVRfS0hSICAgICAgICAgICAgMHgwMDAwMDA0MAorI2VuZGlmIC8qIEVHTF9LSFJfY3JlYXRlX2NvbnRleHQgKi8KKworI2lmbmRlZiBFR0xfS0hSX2NyZWF0ZV9jb250ZXh0X25vX2Vycm9yCisjZGVmaW5lIEVHTF9LSFJfY3JlYXRlX2NvbnRleHRfbm9fZXJyb3IgMQorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfTk9fRVJST1JfS0hSICAgMHgzMUIzCisjZW5kaWYgLyogRUdMX0tIUl9jcmVhdGVfY29udGV4dF9ub19lcnJvciAqLworCisjaWZuZGVmIEVHTF9LSFJfZGVidWcKKyNkZWZpbmUgRUdMX0tIUl9kZWJ1ZyAxCit0eXBlZGVmIHZvaWQgKkVHTExhYmVsS0hSOwordHlwZWRlZiB2b2lkICpFR0xPYmplY3RLSFI7Cit0eXBlZGVmIHZvaWQgKEVHTEFQSUVOVFJZICAqRUdMREVCVUdQUk9DS0hSKShFR0xlbnVtIGVycm9yLGNvbnN0IGNoYXIgKmNvbW1hbmQsRUdMaW50IG1lc3NhZ2VUeXBlLEVHTExhYmVsS0hSIHRocmVhZExhYmVsLEVHTExhYmVsS0hSIG9iamVjdExhYmVsLGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworI2RlZmluZSBFR0xfT0JKRUNUX1RIUkVBRF9LSFIgICAgICAgICAgICAgMHgzM0IwCisjZGVmaW5lIEVHTF9PQkpFQ1RfRElTUExBWV9LSFIgICAgICAgICAgICAweDMzQjEKKyNkZWZpbmUgRUdMX09CSkVDVF9DT05URVhUX0tIUiAgICAgICAgICAgIDB4MzNCMgorI2RlZmluZSBFR0xfT0JKRUNUX1NVUkZBQ0VfS0hSICAgICAgICAgICAgMHgzM0IzCisjZGVmaW5lIEVHTF9PQkpFQ1RfSU1BR0VfS0hSICAgICAgICAgICAgICAweDMzQjQKKyNkZWZpbmUgRUdMX09CSkVDVF9TWU5DX0tIUiAgICAgICAgICAgICAgIDB4MzNCNQorI2RlZmluZSBFR0xfT0JKRUNUX1NUUkVBTV9LSFIgICAgICAgICAgICAgMHgzM0I2CisjZGVmaW5lIEVHTF9ERUJVR19NU0dfQ1JJVElDQUxfS0hSICAgICAgICAweDMzQjkKKyNkZWZpbmUgRUdMX0RFQlVHX01TR19FUlJPUl9LSFIgICAgICAgICAgIDB4MzNCQQorI2RlZmluZSBFR0xfREVCVUdfTVNHX1dBUk5fS0hSICAgICAgICAgICAgMHgzM0JCCisjZGVmaW5lIEVHTF9ERUJVR19NU0dfSU5GT19LSFIgICAgICAgICAgICAweDMzQkMKKyNkZWZpbmUgRUdMX0RFQlVHX0NBTExCQUNLX0tIUiAgICAgICAgICAgIDB4MzNCOAordHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xERUJVR01FU1NBR0VDT05UUk9MS0hSUFJPQykgKEVHTERFQlVHUFJPQ0tIUiBjYWxsYmFjaywgY29uc3QgRUdMQXR0cmliICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWURFQlVHS0hSUFJPQykgKEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOwordHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xMQUJFTE9CSkVDVEtIUlBST0MpIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGVudW0gb2JqZWN0VHlwZSwgRUdMT2JqZWN0S0hSIG9iamVjdCwgRUdMTGFiZWxLSFIgbGFiZWwpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xEZWJ1Z01lc3NhZ2VDb250cm9sS0hSIChFR0xERUJVR1BST0NLSFIgY2FsbGJhY2ssIGNvbnN0IEVHTEF0dHJpYiAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlEZWJ1Z0tIUiAoRUdMaW50IGF0dHJpYnV0ZSwgRUdMQXR0cmliICp2YWx1ZSk7CitFR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbExhYmVsT2JqZWN0S0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGVudW0gb2JqZWN0VHlwZSwgRUdMT2JqZWN0S0hSIG9iamVjdCwgRUdMTGFiZWxLSFIgbGFiZWwpOworI2VuZGlmCisjZW5kaWYgLyogRUdMX0tIUl9kZWJ1ZyAqLworCisjaWZuZGVmIEVHTF9LSFJfZmVuY2Vfc3luYworI2RlZmluZSBFR0xfS0hSX2ZlbmNlX3N5bmMgMQordHlwZWRlZiBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgRUdMVGltZUtIUjsKKyNpZmRlZiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQKKyNkZWZpbmUgRUdMX1NZTkNfUFJJT1JfQ09NTUFORFNfQ09NUExFVEVfS0hSIDB4MzBGMAorI2RlZmluZSBFR0xfU1lOQ19DT05ESVRJT05fS0hSICAgICAgICAgICAgMHgzMEY4CisjZGVmaW5lIEVHTF9TWU5DX0ZFTkNFX0tIUiAgICAgICAgICAgICAgICAweDMwRjkKK3R5cGVkZWYgRUdMU3luY0tIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURVNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xERVNUUk9ZU1lOQ0tIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jKTsKK3R5cGVkZWYgRUdMaW50IChFR0xBUElFTlRSWVAgUEZORUdMQ0xJRU5UV0FJVFNZTkNLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lS0hSIHRpbWVvdXQpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMR0VUU1lOQ0FUVFJJQktIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xTeW5jS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVN5bmNLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveVN5bmNLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpOworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xDbGllbnRXYWl0U3luY0tIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lS0hSIHRpbWVvdXQpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0U3luY0F0dHJpYktIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgKi8KKyNlbmRpZiAvKiBFR0xfS0hSX2ZlbmNlX3N5bmMgKi8KKworI2lmbmRlZiBFR0xfS0hSX2dldF9hbGxfcHJvY19hZGRyZXNzZXMKKyNkZWZpbmUgRUdMX0tIUl9nZXRfYWxsX3Byb2NfYWRkcmVzc2VzIDEKKyNlbmRpZiAvKiBFR0xfS0hSX2dldF9hbGxfcHJvY19hZGRyZXNzZXMgKi8KKworI2lmbmRlZiBFR0xfS0hSX2dsX2NvbG9yc3BhY2UKKyNkZWZpbmUgRUdMX0tIUl9nbF9jb2xvcnNwYWNlIDEKKyNkZWZpbmUgRUdMX0dMX0NPTE9SU1BBQ0VfS0hSICAgICAgICAgICAgIDB4MzA5RAorI2RlZmluZSBFR0xfR0xfQ09MT1JTUEFDRV9TUkdCX0tIUiAgICAgICAgMHgzMDg5CisjZGVmaW5lIEVHTF9HTF9DT0xPUlNQQUNFX0xJTkVBUl9LSFIgICAgICAweDMwOEEKKyNlbmRpZiAvKiBFR0xfS0hSX2dsX2NvbG9yc3BhY2UgKi8KKworI2lmbmRlZiBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZSAxCisjZGVmaW5lIEVHTF9HTF9SRU5ERVJCVUZGRVJfS0hSICAgICAgICAgICAweDMwQjkKKyNlbmRpZiAvKiBFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZSAqLworCisjaWZuZGVmIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UgMQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV8yRF9LSFIgICAgICAgICAgICAgMHgzMEIxCisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0xFVkVMX0tIUiAgICAgICAgICAweDMwQkMKKyNlbmRpZiAvKiBFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UgKi8KKworI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzNEX2ltYWdlIDEKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfM0RfS0hSICAgICAgICAgICAgIDB4MzBCMgorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9aT0ZGU0VUX0tIUiAgICAgICAgMHgzMEJECisjZW5kaWYgLyogRUdMX0tIUl9nbF90ZXh0dXJlXzNEX2ltYWdlICovCisKKyNpZm5kZWYgRUdMX0tIUl9nbF90ZXh0dXJlX2N1YmVtYXBfaW1hZ2UKKyNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlX2N1YmVtYXBfaW1hZ2UgMQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YX0tIUiAweDMwQjMKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9LSFIgMHgzMEI0CisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfS0hSIDB4MzBCNQorI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZX0tIUiAweDMwQjYKKyNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9LSFIgMHgzMEI3CisjZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfS0hSIDB4MzBCOAorI2VuZGlmIC8qIEVHTF9LSFJfZ2xfdGV4dHVyZV9jdWJlbWFwX2ltYWdlICovCisKKyNpZm5kZWYgRUdMX0tIUl9pbWFnZQorI2RlZmluZSBFR0xfS0hSX2ltYWdlIDEKK3R5cGVkZWYgdm9pZCAqRUdMSW1hZ2VLSFI7CisjZGVmaW5lIEVHTF9OQVRJVkVfUElYTUFQX0tIUiAgICAgICAgICAgICAweDMwQjAKKyNkZWZpbmUgRUdMX05PX0lNQUdFX0tIUiAgICAgICAgICAgICAgICAgICgoRUdMSW1hZ2VLSFIpMCkKK3R5cGVkZWYgRUdMSW1hZ2VLSFIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVJTUFHRUtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGVudW0gdGFyZ2V0LCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTERFU1RST1lJTUFHRUtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEltYWdlS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZUltYWdlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGVudW0gdGFyZ2V0LCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lJbWFnZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlS0hSIGltYWdlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9LSFJfaW1hZ2UgKi8KKworI2lmbmRlZiBFR0xfS0hSX2ltYWdlX2Jhc2UKKyNkZWZpbmUgRUdMX0tIUl9pbWFnZV9iYXNlIDEKKyNkZWZpbmUgRUdMX0lNQUdFX1BSRVNFUlZFRF9LSFIgICAgICAgICAgIDB4MzBEMgorI2VuZGlmIC8qIEVHTF9LSFJfaW1hZ2VfYmFzZSAqLworCisjaWZuZGVmIEVHTF9LSFJfaW1hZ2VfcGl4bWFwCisjZGVmaW5lIEVHTF9LSFJfaW1hZ2VfcGl4bWFwIDEKKyNlbmRpZiAvKiBFR0xfS0hSX2ltYWdlX3BpeG1hcCAqLworCisjaWZuZGVmIEVHTF9LSFJfbG9ja19zdXJmYWNlCisjZGVmaW5lIEVHTF9LSFJfbG9ja19zdXJmYWNlIDEKKyNkZWZpbmUgRUdMX1JFQURfU1VSRkFDRV9CSVRfS0hSICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBFR0xfV1JJVEVfU1VSRkFDRV9CSVRfS0hSICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEVHTF9MT0NLX1NVUkZBQ0VfQklUX0tIUiAgICAgICAgICAweDAwODAKKyNkZWZpbmUgRUdMX09QVElNQUxfRk9STUFUX0JJVF9LSFIgICAgICAgIDB4MDEwMAorI2RlZmluZSBFR0xfTUFUQ0hfRk9STUFUX0tIUiAgICAgICAgICAgICAgMHgzMDQzCisjZGVmaW5lIEVHTF9GT1JNQVRfUkdCXzU2NV9FWEFDVF9LSFIgICAgICAweDMwQzAKKyNkZWZpbmUgRUdMX0ZPUk1BVF9SR0JfNTY1X0tIUiAgICAgICAgICAgIDB4MzBDMQorI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9FWEFDVF9LSFIgICAgMHgzMEMyCisjZGVmaW5lIEVHTF9GT1JNQVRfUkdCQV84ODg4X0tIUiAgICAgICAgICAweDMwQzMKKyNkZWZpbmUgRUdMX01BUF9QUkVTRVJWRV9QSVhFTFNfS0hSICAgICAgIDB4MzBDNAorI2RlZmluZSBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiAgICAgICAgICAgMHgzMEM1CisjZGVmaW5lIEVHTF9CSVRNQVBfUE9JTlRFUl9LSFIgICAgICAgICAgICAweDMwQzYKKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVRDSF9LSFIgICAgICAgICAgICAgIDB4MzBDNworI2RlZmluZSBFR0xfQklUTUFQX09SSUdJTl9LSFIgICAgICAgICAgICAgMHgzMEM4CisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfUkVEX09GRlNFVF9LSFIgICAweDMwQzkKKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9HUkVFTl9PRkZTRVRfS0hSIDB4MzBDQQorI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0JMVUVfT0ZGU0VUX0tIUiAgMHgzMENCCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfQUxQSEFfT0ZGU0VUX0tIUiAweDMwQ0MKKyNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9MVU1JTkFOQ0VfT0ZGU0VUX0tIUiAweDMwQ0QKKyNkZWZpbmUgRUdMX0xPV0VSX0xFRlRfS0hSICAgICAgICAgICAgICAgIDB4MzBDRQorI2RlZmluZSBFR0xfVVBQRVJfTEVGVF9LSFIgICAgICAgICAgICAgICAgMHgzMENGCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xMT0NLU1VSRkFDRUtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFVOTE9DS1NVUkZBQ0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xMb2NrU3VyZmFjZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xVbmxvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9LSFJfbG9ja19zdXJmYWNlICovCisKKyNpZm5kZWYgRUdMX0tIUl9sb2NrX3N1cmZhY2UyCisjZGVmaW5lIEVHTF9LSFJfbG9ja19zdXJmYWNlMiAxCisjZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfU0laRV9LSFIgICAgICAgICAweDMxMTAKKyNlbmRpZiAvKiBFR0xfS0hSX2xvY2tfc3VyZmFjZTIgKi8KKworI2lmbmRlZiBFR0xfS0hSX2xvY2tfc3VyZmFjZTMKKyNkZWZpbmUgRUdMX0tIUl9sb2NrX3N1cmZhY2UzIDEKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZU1VSRkFDRTY0S0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYktIUiAqdmFsdWUpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlNjRLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYktIUiAqdmFsdWUpOworI2VuZGlmCisjZW5kaWYgLyogRUdMX0tIUl9sb2NrX3N1cmZhY2UzICovCisKKyNpZm5kZWYgRUdMX0tIUl9tdXRhYmxlX3JlbmRlcl9idWZmZXIKKyNkZWZpbmUgRUdMX0tIUl9tdXRhYmxlX3JlbmRlcl9idWZmZXIgMQorI2RlZmluZSBFR0xfTVVUQUJMRV9SRU5ERVJfQlVGRkVSX0JJVF9LSFIgMHgxMDAwCisjZW5kaWYgLyogRUdMX0tIUl9tdXRhYmxlX3JlbmRlcl9idWZmZXIgKi8KKworI2lmbmRlZiBFR0xfS0hSX3BhcnRpYWxfdXBkYXRlCisjZGVmaW5lIEVHTF9LSFJfcGFydGlhbF91cGRhdGUgMQorI2RlZmluZSBFR0xfQlVGRkVSX0FHRV9LSFIgICAgICAgICAgICAgICAgMHgzMTNECit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTRVREQU1BR0VSRUdJT05LSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50ICpyZWN0cywgRUdMaW50IG5fcmVjdHMpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU2V0RGFtYWdlUmVnaW9uS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgKnJlY3RzLCBFR0xpbnQgbl9yZWN0cyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3BhcnRpYWxfdXBkYXRlICovCisKKyNpZm5kZWYgRUdMX0tIUl9wbGF0Zm9ybV9hbmRyb2lkCisjZGVmaW5lIEVHTF9LSFJfcGxhdGZvcm1fYW5kcm9pZCAxCisjZGVmaW5lIEVHTF9QTEFURk9STV9BTkRST0lEX0tIUiAgICAgICAgICAweDMxNDEKKyNlbmRpZiAvKiBFR0xfS0hSX3BsYXRmb3JtX2FuZHJvaWQgKi8KKworI2lmbmRlZiBFR0xfS0hSX3BsYXRmb3JtX2dibQorI2RlZmluZSBFR0xfS0hSX3BsYXRmb3JtX2dibSAxCisjZGVmaW5lIEVHTF9QTEFURk9STV9HQk1fS0hSICAgICAgICAgICAgICAweDMxRDcKKyNlbmRpZiAvKiBFR0xfS0hSX3BsYXRmb3JtX2dibSAqLworCisjaWZuZGVmIEVHTF9LSFJfcGxhdGZvcm1fd2F5bGFuZAorI2RlZmluZSBFR0xfS0hSX3BsYXRmb3JtX3dheWxhbmQgMQorI2RlZmluZSBFR0xfUExBVEZPUk1fV0FZTEFORF9LSFIgICAgICAgICAgMHgzMUQ4CisjZW5kaWYgLyogRUdMX0tIUl9wbGF0Zm9ybV93YXlsYW5kICovCisKKyNpZm5kZWYgRUdMX0tIUl9wbGF0Zm9ybV94MTEKKyNkZWZpbmUgRUdMX0tIUl9wbGF0Zm9ybV94MTEgMQorI2RlZmluZSBFR0xfUExBVEZPUk1fWDExX0tIUiAgICAgICAgICAgICAgMHgzMUQ1CisjZGVmaW5lIEVHTF9QTEFURk9STV9YMTFfU0NSRUVOX0tIUiAgICAgICAweDMxRDYKKyNlbmRpZiAvKiBFR0xfS0hSX3BsYXRmb3JtX3gxMSAqLworCisjaWZuZGVmIEVHTF9LSFJfcmV1c2FibGVfc3luYworI2RlZmluZSBFR0xfS0hSX3JldXNhYmxlX3N5bmMgMQorI2lmZGVmIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NAorI2RlZmluZSBFR0xfU1lOQ19TVEFUVVNfS0hSICAgICAgICAgICAgICAgMHgzMEYxCisjZGVmaW5lIEVHTF9TSUdOQUxFRF9LSFIgICAgICAgICAgICAgICAgICAweDMwRjIKKyNkZWZpbmUgRUdMX1VOU0lHTkFMRURfS0hSICAgICAgICAgICAgICAgIDB4MzBGMworI2RlZmluZSBFR0xfVElNRU9VVF9FWFBJUkVEX0tIUiAgICAgICAgICAgMHgzMEY1CisjZGVmaW5lIEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX0tIUiAgICAgICAweDMwRjYKKyNkZWZpbmUgRUdMX1NZTkNfVFlQRV9LSFIgICAgICAgICAgICAgICAgIDB4MzBGNworI2RlZmluZSBFR0xfU1lOQ19SRVVTQUJMRV9LSFIgICAgICAgICAgICAgMHgzMEZBCisjZGVmaW5lIEVHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVF9LSFIgICAweDAwMDEKKyNkZWZpbmUgRUdMX0ZPUkVWRVJfS0hSICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRnVsbAorI2RlZmluZSBFR0xfTk9fU1lOQ19LSFIgICAgICAgICAgICAgICAgICAgKChFR0xTeW5jS0hSKTApCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTSUdOQUxTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGVudW0gbW9kZSk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTaWduYWxTeW5jS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xlbnVtIG1vZGUpOworI2VuZGlmCisjZW5kaWYgLyogS0hST05PU19TVVBQT1JUX0lOVDY0ICovCisjZW5kaWYgLyogRUdMX0tIUl9yZXVzYWJsZV9zeW5jICovCisKKyNpZm5kZWYgRUdMX0tIUl9zdHJlYW0KKyNkZWZpbmUgRUdMX0tIUl9zdHJlYW0gMQordHlwZWRlZiB2b2lkICpFR0xTdHJlYW1LSFI7Cit0eXBlZGVmIGtocm9ub3NfdWludDY0X3QgRUdMdWludDY0S0hSOworI2lmZGVmIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NAorI2RlZmluZSBFR0xfTk9fU1RSRUFNX0tIUiAgICAgICAgICAgICAgICAgKChFR0xTdHJlYW1LSFIpMCkKKyNkZWZpbmUgRUdMX0NPTlNVTUVSX0xBVEVOQ1lfVVNFQ19LSFIgICAgIDB4MzIxMAorI2RlZmluZSBFR0xfUFJPRFVDRVJfRlJBTUVfS0hSICAgICAgICAgICAgMHgzMjEyCisjZGVmaW5lIEVHTF9DT05TVU1FUl9GUkFNRV9LSFIgICAgICAgICAgICAweDMyMTMKKyNkZWZpbmUgRUdMX1NUUkVBTV9TVEFURV9LSFIgICAgICAgICAgICAgIDB4MzIxNAorI2RlZmluZSBFR0xfU1RSRUFNX1NUQVRFX0NSRUFURURfS0hSICAgICAgMHgzMjE1CisjZGVmaW5lIEVHTF9TVFJFQU1fU1RBVEVfQ09OTkVDVElOR19LSFIgICAweDMyMTYKKyNkZWZpbmUgRUdMX1NUUkVBTV9TVEFURV9FTVBUWV9LSFIgICAgICAgIDB4MzIxNworI2RlZmluZSBFR0xfU1RSRUFNX1NUQVRFX05FV19GUkFNRV9BVkFJTEFCTEVfS0hSIDB4MzIxOAorI2RlZmluZSBFR0xfU1RSRUFNX1NUQVRFX09MRF9GUkFNRV9BVkFJTEFCTEVfS0hSIDB4MzIxOQorI2RlZmluZSBFR0xfU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRF9LSFIgMHgzMjFBCisjZGVmaW5lIEVHTF9CQURfU1RSRUFNX0tIUiAgICAgICAgICAgICAgICAweDMyMUIKKyNkZWZpbmUgRUdMX0JBRF9TVEFURV9LSFIgICAgICAgICAgICAgICAgIDB4MzIxQwordHlwZWRlZiBFR0xTdHJlYW1LSFIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVTVFJFQU1LSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWVNUUkVBTUtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTVFJFQU1BVFRSSUJLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGVudW0gYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMUVVFUllTVFJFQU1LSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGVudW0gYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZU1RSRUFNVTY0S0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xlbnVtIGF0dHJpYnV0ZSwgRUdMdWludDY0S0hSICp2YWx1ZSk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMU3RyZWFtS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVN0cmVhbUtIUiAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveVN0cmVhbUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0pOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3RyZWFtQXR0cmliS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSwgRUdMZW51bSBhdHRyaWJ1dGUsIEVHTGludCB2YWx1ZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmVhbUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGVudW0gYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3RyZWFtdTY0S0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSwgRUdMZW51bSBhdHRyaWJ1dGUsIEVHTHVpbnQ2NEtIUiAqdmFsdWUpOworI2VuZGlmCisjZW5kaWYgLyogS0hST05PU19TVVBQT1JUX0lOVDY0ICovCisjZW5kaWYgLyogRUdMX0tIUl9zdHJlYW0gKi8KKworI2lmbmRlZiBFR0xfS0hSX3N0cmVhbV9jb25zdW1lcl9nbHRleHR1cmUKKyNkZWZpbmUgRUdMX0tIUl9zdHJlYW1fY29uc3VtZXJfZ2x0ZXh0dXJlIDEKKyNpZmRlZiBFR0xfS0hSX3N0cmVhbQorI2RlZmluZSBFR0xfQ09OU1VNRVJfQUNRVUlSRV9USU1FT1VUX1VTRUNfS0hSIDB4MzIxRQordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMU1RSRUFNQ09OU1VNRVJHTFRFWFRVUkVFWFRFUk5BTEtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTVFJFQU1DT05TVU1FUkFDUVVJUkVLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0pOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMU1RSRUFNQ09OU1VNRVJSRUxFQVNFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN0cmVhbUNvbnN1bWVyR0xUZXh0dXJlRXh0ZXJuYWxLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN0cmVhbUNvbnN1bWVyQWNxdWlyZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0pOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3RyZWFtQ29uc3VtZXJSZWxlYXNlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3N0cmVhbSAqLworI2VuZGlmIC8qIEVHTF9LSFJfc3RyZWFtX2NvbnN1bWVyX2dsdGV4dHVyZSAqLworCisjaWZuZGVmIEVHTF9LSFJfc3RyZWFtX2Nyb3NzX3Byb2Nlc3NfZmQKKyNkZWZpbmUgRUdMX0tIUl9zdHJlYW1fY3Jvc3NfcHJvY2Vzc19mZCAxCit0eXBlZGVmIGludCBFR0xOYXRpdmVGaWxlRGVzY3JpcHRvcktIUjsKKyNpZmRlZiBFR0xfS0hSX3N0cmVhbQorI2RlZmluZSBFR0xfTk9fRklMRV9ERVNDUklQVE9SX0tIUiAgICAgICAgKChFR0xOYXRpdmVGaWxlRGVzY3JpcHRvcktIUikoLTEpKQordHlwZWRlZiBFR0xOYXRpdmVGaWxlRGVzY3JpcHRvcktIUiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVFNUUkVBTUZJTEVERVNDUklQVE9SS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtKTsKK3R5cGVkZWYgRUdMU3RyZWFtS0hSIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFU1RSRUFNRlJPTUZJTEVERVNDUklQVE9SS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xOYXRpdmVGaWxlRGVzY3JpcHRvcktIUiBmaWxlX2Rlc2NyaXB0b3IpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTE5hdGl2ZUZpbGVEZXNjcmlwdG9yS0hSIEVHTEFQSUVOVFJZIGVnbEdldFN0cmVhbUZpbGVEZXNjcmlwdG9yS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSk7CitFR0xBUEkgRUdMU3RyZWFtS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVN0cmVhbUZyb21GaWxlRGVzY3JpcHRvcktIUiAoRUdMRGlzcGxheSBkcHksIEVHTE5hdGl2ZUZpbGVEZXNjcmlwdG9yS0hSIGZpbGVfZGVzY3JpcHRvcik7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3N0cmVhbSAqLworI2VuZGlmIC8qIEVHTF9LSFJfc3RyZWFtX2Nyb3NzX3Byb2Nlc3NfZmQgKi8KKworI2lmbmRlZiBFR0xfS0hSX3N0cmVhbV9maWZvCisjZGVmaW5lIEVHTF9LSFJfc3RyZWFtX2ZpZm8gMQorI2lmZGVmIEVHTF9LSFJfc3RyZWFtCisjZGVmaW5lIEVHTF9TVFJFQU1fRklGT19MRU5HVEhfS0hSICAgICAgICAweDMxRkMKKyNkZWZpbmUgRUdMX1NUUkVBTV9USU1FX05PV19LSFIgICAgICAgICAgIDB4MzFGRAorI2RlZmluZSBFR0xfU1RSRUFNX1RJTUVfQ09OU1VNRVJfS0hSICAgICAgMHgzMUZFCisjZGVmaW5lIEVHTF9TVFJFQU1fVElNRV9QUk9EVUNFUl9LSFIgICAgICAweDMxRkYKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZU1RSRUFNVElNRUtIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSwgRUdMZW51bSBhdHRyaWJ1dGUsIEVHTFRpbWVLSFIgKnZhbHVlKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3RyZWFtVGltZUtIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGVudW0gYXR0cmlidXRlLCBFR0xUaW1lS0hSICp2YWx1ZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3N0cmVhbSAqLworI2VuZGlmIC8qIEVHTF9LSFJfc3RyZWFtX2ZpZm8gKi8KKworI2lmbmRlZiBFR0xfS0hSX3N0cmVhbV9wcm9kdWNlcl9hbGRhdGFsb2NhdG9yCisjZGVmaW5lIEVHTF9LSFJfc3RyZWFtX3Byb2R1Y2VyX2FsZGF0YWxvY2F0b3IgMQorI2lmZGVmIEVHTF9LSFJfc3RyZWFtCisjZW5kaWYgLyogRUdMX0tIUl9zdHJlYW0gKi8KKyNlbmRpZiAvKiBFR0xfS0hSX3N0cmVhbV9wcm9kdWNlcl9hbGRhdGFsb2NhdG9yICovCisKKyNpZm5kZWYgRUdMX0tIUl9zdHJlYW1fcHJvZHVjZXJfZWdsc3VyZmFjZQorI2RlZmluZSBFR0xfS0hSX3N0cmVhbV9wcm9kdWNlcl9lZ2xzdXJmYWNlIDEKKyNpZmRlZiBFR0xfS0hSX3N0cmVhbQorI2RlZmluZSBFR0xfU1RSRUFNX0JJVF9LSFIgICAgICAgICAgICAgICAgMHgwODAwCit0eXBlZGVmIEVHTFN1cmZhY2UgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVTVFJFQU1QUk9EVUNFUlNVUkZBQ0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTFN0cmVhbUtIUiBzdHJlYW0sIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlU3RyZWFtUHJvZHVjZXJTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMU3RyZWFtS0hSIHN0cmVhbSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3N0cmVhbSAqLworI2VuZGlmIC8qIEVHTF9LSFJfc3RyZWFtX3Byb2R1Y2VyX2VnbHN1cmZhY2UgKi8KKworI2lmbmRlZiBFR0xfS0hSX3N1cmZhY2VsZXNzX2NvbnRleHQKKyNkZWZpbmUgRUdMX0tIUl9zdXJmYWNlbGVzc19jb250ZXh0IDEKKyNlbmRpZiAvKiBFR0xfS0hSX3N1cmZhY2VsZXNzX2NvbnRleHQgKi8KKworI2lmbmRlZiBFR0xfS0hSX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZQorI2RlZmluZSBFR0xfS0hSX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZSAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTV0FQQlVGRkVSU1dJVEhEQU1BR0VLSFJQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50ICpyZWN0cywgRUdMaW50IG5fcmVjdHMpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnNXaXRoRGFtYWdlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgKnJlY3RzLCBFR0xpbnQgbl9yZWN0cyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfS0hSX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZSAqLworCisjaWZuZGVmIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlCisjZGVmaW5lIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlIDEKKyNkZWZpbmUgRUdMX1ZHX1BBUkVOVF9JTUFHRV9LSFIgICAgICAgICAgIDB4MzBCQQorI2VuZGlmIC8qIEVHTF9LSFJfdmdfcGFyZW50X2ltYWdlICovCisKKyNpZm5kZWYgRUdMX0tIUl93YWl0X3N5bmMKKyNkZWZpbmUgRUdMX0tIUl93YWl0X3N5bmMgMQordHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xXQUlUU1lOQ0tIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xXYWl0U3luY0tIUiAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGZsYWdzKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9LSFJfd2FpdF9zeW5jICovCisKKyNpZm5kZWYgRUdMX0FORFJPSURfYmxvYl9jYWNoZQorI2RlZmluZSBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIDEKK3R5cGVkZWYga2hyb25vc19zc2l6ZV90IEVHTHNpemVpQU5EUk9JRDsKK3R5cGVkZWYgdm9pZCAoKkVHTFNldEJsb2JGdW5jQU5EUk9JRCkgKGNvbnN0IHZvaWQgKmtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsIGNvbnN0IHZvaWQgKnZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKTsKK3R5cGVkZWYgRUdMc2l6ZWlBTkRST0lEICgqRUdMR2V0QmxvYkZ1bmNBTkRST0lEKSAoY29uc3Qgdm9pZCAqa2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgdm9pZCAqdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpOwordHlwZWRlZiB2b2lkIChFR0xBUElFTlRSWVAgUEZORUdMU0VUQkxPQkNBQ0hFRlVOQ1NBTkRST0lEUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTZXRCbG9iRnVuY0FORFJPSUQgc2V0LCBFR0xHZXRCbG9iRnVuY0FORFJPSUQgZ2V0KTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSB2b2lkIEVHTEFQSUVOVFJZIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCAoRUdMRGlzcGxheSBkcHksIEVHTFNldEJsb2JGdW5jQU5EUk9JRCBzZXQsIEVHTEdldEJsb2JGdW5jQU5EUk9JRCBnZXQpOworI2VuZGlmCisjZW5kaWYgLyogRUdMX0FORFJPSURfYmxvYl9jYWNoZSAqLworCisjaWZuZGVmIEVHTF9BTkRST0lEX2NyZWF0ZV9uYXRpdmVfY2xpZW50X2J1ZmZlcgorI2RlZmluZSBFR0xfQU5EUk9JRF9jcmVhdGVfbmF0aXZlX2NsaWVudF9idWZmZXIgMQorI2RlZmluZSBFR0xfTkFUSVZFX0JVRkZFUl9VU0FHRV9BTkRST0lEICAgMHgzMTQzCisjZGVmaW5lIEVHTF9OQVRJVkVfQlVGRkVSX1VTQUdFX1BST1RFQ1RFRF9CSVRfQU5EUk9JRCAweDAwMDAwMDAxCisjZGVmaW5lIEVHTF9OQVRJVkVfQlVGRkVSX1VTQUdFX1JFTkRFUkJVRkZFUl9CSVRfQU5EUk9JRCAweDAwMDAwMDAyCisjZGVmaW5lIEVHTF9OQVRJVkVfQlVGRkVSX1VTQUdFX1RFWFRVUkVfQklUX0FORFJPSUQgMHgwMDAwMDAwNAordHlwZWRlZiBFR0xDbGllbnRCdWZmZXIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVOQVRJVkVDTElFTlRCVUZGRVJBTkRST0lEUFJPQykgKGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTENsaWVudEJ1ZmZlciBFR0xBUElFTlRSWSBlZ2xDcmVhdGVOYXRpdmVDbGllbnRCdWZmZXJBTkRST0lEIChjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9BTkRST0lEX2NyZWF0ZV9uYXRpdmVfY2xpZW50X2J1ZmZlciAqLworCisjaWZuZGVmIEVHTF9BTkRST0lEX2ZyYW1lYnVmZmVyX3RhcmdldAorI2RlZmluZSBFR0xfQU5EUk9JRF9mcmFtZWJ1ZmZlcl90YXJnZXQgMQorI2RlZmluZSBFR0xfRlJBTUVCVUZGRVJfVEFSR0VUX0FORFJPSUQgICAgMHgzMTQ3CisjZW5kaWYgLyogRUdMX0FORFJPSURfZnJhbWVidWZmZXJfdGFyZ2V0ICovCisKKyNpZm5kZWYgRUdMX0FORFJPSURfZnJvbnRfYnVmZmVyX2F1dG9fcmVmcmVzaAorI2RlZmluZSBFR0xfQU5EUk9JRF9mcm9udF9idWZmZXJfYXV0b19yZWZyZXNoIDEKKyNkZWZpbmUgRUdMX0ZST05UX0JVRkZFUl9BVVRPX1JFRlJFU0hfQU5EUk9JRCAweDMxNEMKKyNlbmRpZiAvKiBFR0xfQU5EUk9JRF9mcm9udF9idWZmZXJfYXV0b19yZWZyZXNoICovCisKKyNpZm5kZWYgRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlcgorI2RlZmluZSBFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyIDEKKyNkZWZpbmUgRUdMX05BVElWRV9CVUZGRVJfQU5EUk9JRCAgICAgICAgIDB4MzE0MAorI2VuZGlmIC8qIEVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgKi8KKworI2lmbmRlZiBFR0xfQU5EUk9JRF9uYXRpdmVfZmVuY2Vfc3luYworI2RlZmluZSBFR0xfQU5EUk9JRF9uYXRpdmVfZmVuY2Vfc3luYyAxCisjZGVmaW5lIEVHTF9TWU5DX05BVElWRV9GRU5DRV9BTkRST0lEICAgICAweDMxNDQKKyNkZWZpbmUgRUdMX1NZTkNfTkFUSVZFX0ZFTkNFX0ZEX0FORFJPSUQgIDB4MzE0NQorI2RlZmluZSBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfU0lHTkFMRURfQU5EUk9JRCAweDMxNDYKKyNkZWZpbmUgRUdMX05PX05BVElWRV9GRU5DRV9GRF9BTkRST0lEICAgIC0xCit0eXBlZGVmIEVHTGludCAoRUdMQVBJRU5UUllQIFBGTkVHTERVUE5BVElWRUZFTkNFRkRBTkRST0lEUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xEdXBOYXRpdmVGZW5jZUZEQU5EUk9JRCAoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfQU5EUk9JRF9uYXRpdmVfZmVuY2Vfc3luYyAqLworCisjaWZuZGVmIEVHTF9BTkRST0lEX3ByZXNlbnRhdGlvbl90aW1lCisjZGVmaW5lIEVHTF9BTkRST0lEX3ByZXNlbnRhdGlvbl90aW1lIDEKK3R5cGVkZWYga2hyb25vc19zdGltZV9uYW5vc2Vjb25kc190IEVHTG5zZWNzQU5EUk9JRDsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFBSRVNFTlRBVElPTlRJTUVBTkRST0lEUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTG5zZWNzQU5EUk9JRCB0aW1lKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFByZXNlbnRhdGlvblRpbWVBTkRST0lEIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xuc2Vjc0FORFJPSUQgdGltZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfQU5EUk9JRF9wcmVzZW50YXRpb25fdGltZSAqLworCisjaWZuZGVmIEVHTF9BTkRST0lEX3JlY29yZGFibGUKKyNkZWZpbmUgRUdMX0FORFJPSURfcmVjb3JkYWJsZSAxCisjZGVmaW5lIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQgICAgICAgICAgICAweDMxNDIKKyNlbmRpZiAvKiBFR0xfQU5EUk9JRF9yZWNvcmRhYmxlICovCisKKyNpZm5kZWYgRUdMX0FOR0xFX2QzZF9zaGFyZV9oYW5kbGVfY2xpZW50X2J1ZmZlcgorI2RlZmluZSBFR0xfQU5HTEVfZDNkX3NoYXJlX2hhbmRsZV9jbGllbnRfYnVmZmVyIDEKKyNkZWZpbmUgRUdMX0QzRF9URVhUVVJFXzJEX1NIQVJFX0hBTkRMRV9BTkdMRSAweDMyMDAKKyNlbmRpZiAvKiBFR0xfQU5HTEVfZDNkX3NoYXJlX2hhbmRsZV9jbGllbnRfYnVmZmVyICovCisKKyNpZm5kZWYgRUdMX0FOR0xFX2RldmljZV9kM2QKKyNkZWZpbmUgRUdMX0FOR0xFX2RldmljZV9kM2QgMQorI2RlZmluZSBFR0xfRDNEOV9ERVZJQ0VfQU5HTEUgICAgICAgICAgICAgMHgzM0EwCisjZGVmaW5lIEVHTF9EM0QxMV9ERVZJQ0VfQU5HTEUgICAgICAgICAgICAweDMzQTEKKyNlbmRpZiAvKiBFR0xfQU5HTEVfZGV2aWNlX2QzZCAqLworCisjaWZuZGVmIEVHTF9BTkdMRV9xdWVyeV9zdXJmYWNlX3BvaW50ZXIKKyNkZWZpbmUgRUdMX0FOR0xFX3F1ZXJ5X3N1cmZhY2VfcG9pbnRlciAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWVNVUkZBQ0VQT0lOVEVSQU5HTEVQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgdm9pZCAqKnZhbHVlKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZVBvaW50ZXJBTkdMRSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgdm9pZCAqKnZhbHVlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9BTkdMRV9xdWVyeV9zdXJmYWNlX3BvaW50ZXIgKi8KKworI2lmbmRlZiBFR0xfQU5HTEVfc3VyZmFjZV9kM2RfdGV4dHVyZV8yZF9zaGFyZV9oYW5kbGUKKyNkZWZpbmUgRUdMX0FOR0xFX3N1cmZhY2VfZDNkX3RleHR1cmVfMmRfc2hhcmVfaGFuZGxlIDEKKyNlbmRpZiAvKiBFR0xfQU5HTEVfc3VyZmFjZV9kM2RfdGV4dHVyZV8yZF9zaGFyZV9oYW5kbGUgKi8KKworI2lmbmRlZiBFR0xfQU5HTEVfd2luZG93X2ZpeGVkX3NpemUKKyNkZWZpbmUgRUdMX0FOR0xFX3dpbmRvd19maXhlZF9zaXplIDEKKyNkZWZpbmUgRUdMX0ZJWEVEX1NJWkVfQU5HTEUgICAgICAgICAgICAgIDB4MzIwMQorI2VuZGlmIC8qIEVHTF9BTkdMRV93aW5kb3dfZml4ZWRfc2l6ZSAqLworCisjaWZuZGVmIEVHTF9BUk1fcGl4bWFwX211bHRpc2FtcGxlX2Rpc2NhcmQKKyNkZWZpbmUgRUdMX0FSTV9waXhtYXBfbXVsdGlzYW1wbGVfZGlzY2FyZCAxCisjZGVmaW5lIEVHTF9ESVNDQVJEX1NBTVBMRVNfQVJNICAgICAgICAgICAweDMyODYKKyNlbmRpZiAvKiBFR0xfQVJNX3BpeG1hcF9tdWx0aXNhbXBsZV9kaXNjYXJkICovCisKKyNpZm5kZWYgRUdMX0VYVF9idWZmZXJfYWdlCisjZGVmaW5lIEVHTF9FWFRfYnVmZmVyX2FnZSAxCisjZGVmaW5lIEVHTF9CVUZGRVJfQUdFX0VYVCAgICAgICAgICAgICAgICAweDMxM0QKKyNlbmRpZiAvKiBFR0xfRVhUX2J1ZmZlcl9hZ2UgKi8KKworI2lmbmRlZiBFR0xfRVhUX2NsaWVudF9leHRlbnNpb25zCisjZGVmaW5lIEVHTF9FWFRfY2xpZW50X2V4dGVuc2lvbnMgMQorI2VuZGlmIC8qIEVHTF9FWFRfY2xpZW50X2V4dGVuc2lvbnMgKi8KKworI2lmbmRlZiBFR0xfRVhUX2NyZWF0ZV9jb250ZXh0X3JvYnVzdG5lc3MKKyNkZWZpbmUgRUdMX0VYVF9jcmVhdGVfY29udGV4dF9yb2J1c3RuZXNzIDEKKyNkZWZpbmUgRUdMX0NPTlRFWFRfT1BFTkdMX1JPQlVTVF9BQ0NFU1NfRVhUIDB4MzBCRgorI2RlZmluZSBFR0xfQ09OVEVYVF9PUEVOR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0VYVCAweDMxMzgKKyNkZWZpbmUgRUdMX05PX1JFU0VUX05PVElGSUNBVElPTl9FWFQgICAgIDB4MzFCRQorI2RlZmluZSBFR0xfTE9TRV9DT05URVhUX09OX1JFU0VUX0VYVCAgICAgMHgzMUJGCisjZW5kaWYgLyogRUdMX0VYVF9jcmVhdGVfY29udGV4dF9yb2J1c3RuZXNzICovCisKKyNpZm5kZWYgRUdMX0VYVF9kZXZpY2VfYmFzZQorI2RlZmluZSBFR0xfRVhUX2RldmljZV9iYXNlIDEKK3R5cGVkZWYgdm9pZCAqRUdMRGV2aWNlRVhUOworI2RlZmluZSBFR0xfTk9fREVWSUNFX0VYVCAgICAgICAgICAgICAgICAgKChFR0xEZXZpY2VFWFQpKDApKQorI2RlZmluZSBFR0xfQkFEX0RFVklDRV9FWFQgICAgICAgICAgICAgICAgMHgzMjJCCisjZGVmaW5lIEVHTF9ERVZJQ0VfRVhUICAgICAgICAgICAgICAgICAgICAweDMyMkMKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZREVWSUNFQVRUUklCRVhUUFJPQykgKEVHTERldmljZUVYVCBkZXZpY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOwordHlwZWRlZiBjb25zdCBjaGFyICooRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZREVWSUNFU1RSSU5HRVhUUFJPQykgKEVHTERldmljZUVYVCBkZXZpY2UsIEVHTGludCBuYW1lKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZREVWSUNFU0VYVFBST0MpIChFR0xpbnQgbWF4X2RldmljZXMsIEVHTERldmljZUVYVCAqZGV2aWNlcywgRUdMaW50ICpudW1fZGV2aWNlcyk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWURJU1BMQVlBVFRSSUJFWFRQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlEZXZpY2VBdHRyaWJFWFQgKEVHTERldmljZUVYVCBkZXZpY2UsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOworRUdMQVBJIGNvbnN0IGNoYXIgKkVHTEFQSUVOVFJZIGVnbFF1ZXJ5RGV2aWNlU3RyaW5nRVhUIChFR0xEZXZpY2VFWFQgZGV2aWNlLCBFR0xpbnQgbmFtZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeURldmljZXNFWFQgKEVHTGludCBtYXhfZGV2aWNlcywgRUdMRGV2aWNlRVhUICpkZXZpY2VzLCBFR0xpbnQgKm51bV9kZXZpY2VzKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5RGlzcGxheUF0dHJpYkVYVCAoRUdMRGlzcGxheSBkcHksIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOworI2VuZGlmCisjZW5kaWYgLyogRUdMX0VYVF9kZXZpY2VfYmFzZSAqLworCisjaWZuZGVmIEVHTF9FWFRfZGV2aWNlX2RybQorI2RlZmluZSBFR0xfRVhUX2RldmljZV9kcm0gMQorI2RlZmluZSBFR0xfRFJNX0RFVklDRV9GSUxFX0VYVCAgICAgICAgICAgMHgzMjMzCisjZW5kaWYgLyogRUdMX0VYVF9kZXZpY2VfZHJtICovCisKKyNpZm5kZWYgRUdMX0VYVF9kZXZpY2VfZW51bWVyYXRpb24KKyNkZWZpbmUgRUdMX0VYVF9kZXZpY2VfZW51bWVyYXRpb24gMQorI2VuZGlmIC8qIEVHTF9FWFRfZGV2aWNlX2VudW1lcmF0aW9uICovCisKKyNpZm5kZWYgRUdMX0VYVF9kZXZpY2Vfb3BlbndmCisjZGVmaW5lIEVHTF9FWFRfZGV2aWNlX29wZW53ZiAxCisjZGVmaW5lIEVHTF9PUEVOV0ZfREVWSUNFX0lEX0VYVCAgICAgICAgICAweDMyMzcKKyNlbmRpZiAvKiBFR0xfRVhUX2RldmljZV9vcGVud2YgKi8KKworI2lmbmRlZiBFR0xfRVhUX2RldmljZV9xdWVyeQorI2RlZmluZSBFR0xfRVhUX2RldmljZV9xdWVyeSAxCisjZW5kaWYgLyogRUdMX0VYVF9kZXZpY2VfcXVlcnkgKi8KKworI2lmbmRlZiBFR0xfRVhUX2ltYWdlX2RtYV9idWZfaW1wb3J0CisjZGVmaW5lIEVHTF9FWFRfaW1hZ2VfZG1hX2J1Zl9pbXBvcnQgMQorI2RlZmluZSBFR0xfTElOVVhfRE1BX0JVRl9FWFQgICAgICAgICAgICAgMHgzMjcwCisjZGVmaW5lIEVHTF9MSU5VWF9EUk1fRk9VUkNDX0VYVCAgICAgICAgICAweDMyNzEKKyNkZWZpbmUgRUdMX0RNQV9CVUZfUExBTkUwX0ZEX0VYVCAgICAgICAgIDB4MzI3MgorI2RlZmluZSBFR0xfRE1BX0JVRl9QTEFORTBfT0ZGU0VUX0VYVCAgICAgMHgzMjczCisjZGVmaW5lIEVHTF9ETUFfQlVGX1BMQU5FMF9QSVRDSF9FWFQgICAgICAweDMyNzQKKyNkZWZpbmUgRUdMX0RNQV9CVUZfUExBTkUxX0ZEX0VYVCAgICAgICAgIDB4MzI3NQorI2RlZmluZSBFR0xfRE1BX0JVRl9QTEFORTFfT0ZGU0VUX0VYVCAgICAgMHgzMjc2CisjZGVmaW5lIEVHTF9ETUFfQlVGX1BMQU5FMV9QSVRDSF9FWFQgICAgICAweDMyNzcKKyNkZWZpbmUgRUdMX0RNQV9CVUZfUExBTkUyX0ZEX0VYVCAgICAgICAgIDB4MzI3OAorI2RlZmluZSBFR0xfRE1BX0JVRl9QTEFORTJfT0ZGU0VUX0VYVCAgICAgMHgzMjc5CisjZGVmaW5lIEVHTF9ETUFfQlVGX1BMQU5FMl9QSVRDSF9FWFQgICAgICAweDMyN0EKKyNkZWZpbmUgRUdMX1lVVl9DT0xPUl9TUEFDRV9ISU5UX0VYVCAgICAgIDB4MzI3QgorI2RlZmluZSBFR0xfU0FNUExFX1JBTkdFX0hJTlRfRVhUICAgICAgICAgMHgzMjdDCisjZGVmaW5lIEVHTF9ZVVZfQ0hST01BX0hPUklaT05UQUxfU0lUSU5HX0hJTlRfRVhUIDB4MzI3RAorI2RlZmluZSBFR0xfWVVWX0NIUk9NQV9WRVJUSUNBTF9TSVRJTkdfSElOVF9FWFQgMHgzMjdFCisjZGVmaW5lIEVHTF9JVFVfUkVDNjAxX0VYVCAgICAgICAgICAgICAgICAweDMyN0YKKyNkZWZpbmUgRUdMX0lUVV9SRUM3MDlfRVhUICAgICAgICAgICAgICAgIDB4MzI4MAorI2RlZmluZSBFR0xfSVRVX1JFQzIwMjBfRVhUICAgICAgICAgICAgICAgMHgzMjgxCisjZGVmaW5lIEVHTF9ZVVZfRlVMTF9SQU5HRV9FWFQgICAgICAgICAgICAweDMyODIKKyNkZWZpbmUgRUdMX1lVVl9OQVJST1dfUkFOR0VfRVhUICAgICAgICAgIDB4MzI4MworI2RlZmluZSBFR0xfWVVWX0NIUk9NQV9TSVRJTkdfMF9FWFQgICAgICAgMHgzMjg0CisjZGVmaW5lIEVHTF9ZVVZfQ0hST01BX1NJVElOR18wXzVfRVhUICAgICAweDMyODUKKyNlbmRpZiAvKiBFR0xfRVhUX2ltYWdlX2RtYV9idWZfaW1wb3J0ICovCisKKyNpZm5kZWYgRUdMX0VYVF9tdWx0aXZpZXdfd2luZG93CisjZGVmaW5lIEVHTF9FWFRfbXVsdGl2aWV3X3dpbmRvdyAxCisjZGVmaW5lIEVHTF9NVUxUSVZJRVdfVklFV19DT1VOVF9FWFQgICAgICAweDMxMzQKKyNlbmRpZiAvKiBFR0xfRVhUX211bHRpdmlld193aW5kb3cgKi8KKworI2lmbmRlZiBFR0xfRVhUX291dHB1dF9iYXNlCisjZGVmaW5lIEVHTF9FWFRfb3V0cHV0X2Jhc2UgMQordHlwZWRlZiB2b2lkICpFR0xPdXRwdXRMYXllckVYVDsKK3R5cGVkZWYgdm9pZCAqRUdMT3V0cHV0UG9ydEVYVDsKKyNkZWZpbmUgRUdMX05PX09VVFBVVF9MQVlFUl9FWFQgICAgICAgICAgICgoRUdMT3V0cHV0TGF5ZXJFWFQpMCkKKyNkZWZpbmUgRUdMX05PX09VVFBVVF9QT1JUX0VYVCAgICAgICAgICAgICgoRUdMT3V0cHV0UG9ydEVYVCkwKQorI2RlZmluZSBFR0xfQkFEX09VVFBVVF9MQVlFUl9FWFQgICAgICAgICAgMHgzMjJECisjZGVmaW5lIEVHTF9CQURfT1VUUFVUX1BPUlRfRVhUICAgICAgICAgICAweDMyMkUKKyNkZWZpbmUgRUdMX1NXQVBfSU5URVJWQUxfRVhUICAgICAgICAgICAgIDB4MzIyRgordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMR0VUT1VUUFVUTEFZRVJTRVhUUFJPQykgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0LCBFR0xPdXRwdXRMYXllckVYVCAqbGF5ZXJzLCBFR0xpbnQgbWF4X2xheWVycywgRUdMaW50ICpudW1fbGF5ZXJzKTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEdFVE9VVFBVVFBPUlRTRVhUUFJPQykgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0LCBFR0xPdXRwdXRQb3J0RVhUICpwb3J0cywgRUdMaW50IG1heF9wb3J0cywgRUdMaW50ICpudW1fcG9ydHMpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMT1VUUFVUTEFZRVJBVFRSSUJFWFRQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTE91dHB1dExheWVyRVhUIGxheWVyLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xBdHRyaWIgdmFsdWUpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMUVVFUllPVVRQVVRMQVlFUkFUVFJJQkVYVFBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMT3V0cHV0TGF5ZXJFWFQgbGF5ZXIsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOwordHlwZWRlZiBjb25zdCBjaGFyICooRUdMQVBJRU5UUllQIFBGTkVHTFFVRVJZT1VUUFVUTEFZRVJTVFJJTkdFWFRQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTE91dHB1dExheWVyRVhUIGxheWVyLCBFR0xpbnQgbmFtZSk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xPVVRQVVRQT1JUQVRUUklCRVhUUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xPdXRwdXRQb3J0RVhUIHBvcnQsIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiB2YWx1ZSk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWU9VVFBVVFBPUlRBVFRSSUJFWFRQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTE91dHB1dFBvcnRFWFQgcG9ydCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMQXR0cmliICp2YWx1ZSk7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKihFR0xBUElFTlRSWVAgUEZORUdMUVVFUllPVVRQVVRQT1JUU1RSSU5HRVhUUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xPdXRwdXRQb3J0RVhUIHBvcnQsIEVHTGludCBuYW1lKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldE91dHB1dExheWVyc0VYVCAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTEF0dHJpYiAqYXR0cmliX2xpc3QsIEVHTE91dHB1dExheWVyRVhUICpsYXllcnMsIEVHTGludCBtYXhfbGF5ZXJzLCBFR0xpbnQgKm51bV9sYXllcnMpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0T3V0cHV0UG9ydHNFWFQgKEVHTERpc3BsYXkgZHB5LCBjb25zdCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0LCBFR0xPdXRwdXRQb3J0RVhUICpwb3J0cywgRUdMaW50IG1heF9wb3J0cywgRUdMaW50ICpudW1fcG9ydHMpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsT3V0cHV0TGF5ZXJBdHRyaWJFWFQgKEVHTERpc3BsYXkgZHB5LCBFR0xPdXRwdXRMYXllckVYVCBsYXllciwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMQXR0cmliIHZhbHVlKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5T3V0cHV0TGF5ZXJBdHRyaWJFWFQgKEVHTERpc3BsYXkgZHB5LCBFR0xPdXRwdXRMYXllckVYVCBsYXllciwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMQXR0cmliICp2YWx1ZSk7CitFR0xBUEkgY29uc3QgY2hhciAqRUdMQVBJRU5UUlkgZWdsUXVlcnlPdXRwdXRMYXllclN0cmluZ0VYVCAoRUdMRGlzcGxheSBkcHksIEVHTE91dHB1dExheWVyRVhUIGxheWVyLCBFR0xpbnQgbmFtZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xPdXRwdXRQb3J0QXR0cmliRVhUIChFR0xEaXNwbGF5IGRweSwgRUdMT3V0cHV0UG9ydEVYVCBwb3J0LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xBdHRyaWIgdmFsdWUpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlPdXRwdXRQb3J0QXR0cmliRVhUIChFR0xEaXNwbGF5IGRweSwgRUdMT3V0cHV0UG9ydEVYVCBwb3J0LCBFR0xpbnQgYXR0cmlidXRlLCBFR0xBdHRyaWIgKnZhbHVlKTsKK0VHTEFQSSBjb25zdCBjaGFyICpFR0xBUElFTlRSWSBlZ2xRdWVyeU91dHB1dFBvcnRTdHJpbmdFWFQgKEVHTERpc3BsYXkgZHB5LCBFR0xPdXRwdXRQb3J0RVhUIHBvcnQsIEVHTGludCBuYW1lKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9FWFRfb3V0cHV0X2Jhc2UgKi8KKworI2lmbmRlZiBFR0xfRVhUX291dHB1dF9kcm0KKyNkZWZpbmUgRUdMX0VYVF9vdXRwdXRfZHJtIDEKKyNkZWZpbmUgRUdMX0RSTV9DUlRDX0VYVCAgICAgICAgICAgICAgICAgIDB4MzIzNAorI2RlZmluZSBFR0xfRFJNX1BMQU5FX0VYVCAgICAgICAgICAgICAgICAgMHgzMjM1CisjZGVmaW5lIEVHTF9EUk1fQ09OTkVDVE9SX0VYVCAgICAgICAgICAgICAweDMyMzYKKyNlbmRpZiAvKiBFR0xfRVhUX291dHB1dF9kcm0gKi8KKworI2lmbmRlZiBFR0xfRVhUX291dHB1dF9vcGVud2YKKyNkZWZpbmUgRUdMX0VYVF9vdXRwdXRfb3BlbndmIDEKKyNkZWZpbmUgRUdMX09QRU5XRl9QSVBFTElORV9JRF9FWFQgICAgICAgIDB4MzIzOAorI2RlZmluZSBFR0xfT1BFTldGX1BPUlRfSURfRVhUICAgICAgICAgICAgMHgzMjM5CisjZW5kaWYgLyogRUdMX0VYVF9vdXRwdXRfb3BlbndmICovCisKKyNpZm5kZWYgRUdMX0VYVF9wbGF0Zm9ybV9iYXNlCisjZGVmaW5lIEVHTF9FWFRfcGxhdGZvcm1fYmFzZSAxCit0eXBlZGVmIEVHTERpc3BsYXkgKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRQTEFURk9STURJU1BMQVlFWFRQUk9DKSAoRUdMZW51bSBwbGF0Zm9ybSwgdm9pZCAqbmF0aXZlX2Rpc3BsYXksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xTdXJmYWNlIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFUExBVEZPUk1XSU5ET1dTVVJGQUNFRVhUUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCB2b2lkICpuYXRpdmVfd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgRUdMU3VyZmFjZSAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURVBMQVRGT1JNUElYTUFQU1VSRkFDRUVYVFBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgdm9pZCAqbmF0aXZlX3BpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMRGlzcGxheSBFR0xBUElFTlRSWSBlZ2xHZXRQbGF0Zm9ybURpc3BsYXlFWFQgKEVHTGVudW0gcGxhdGZvcm0sIHZvaWQgKm5hdGl2ZV9kaXNwbGF5LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBsYXRmb3JtV2luZG93U3VyZmFjZUVYVCAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIHZvaWQgKm5hdGl2ZV93aW5kb3csIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGxhdGZvcm1QaXhtYXBTdXJmYWNlRVhUIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgdm9pZCAqbmF0aXZlX3BpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfRVhUX3BsYXRmb3JtX2Jhc2UgKi8KKworI2lmbmRlZiBFR0xfRVhUX3BsYXRmb3JtX2RldmljZQorI2RlZmluZSBFR0xfRVhUX3BsYXRmb3JtX2RldmljZSAxCisjZGVmaW5lIEVHTF9QTEFURk9STV9ERVZJQ0VfRVhUICAgICAgICAgICAweDMxM0YKKyNlbmRpZiAvKiBFR0xfRVhUX3BsYXRmb3JtX2RldmljZSAqLworCisjaWZuZGVmIEVHTF9FWFRfcGxhdGZvcm1fd2F5bGFuZAorI2RlZmluZSBFR0xfRVhUX3BsYXRmb3JtX3dheWxhbmQgMQorI2RlZmluZSBFR0xfUExBVEZPUk1fV0FZTEFORF9FWFQgICAgICAgICAgMHgzMUQ4CisjZW5kaWYgLyogRUdMX0VYVF9wbGF0Zm9ybV93YXlsYW5kICovCisKKyNpZm5kZWYgRUdMX0VYVF9wbGF0Zm9ybV94MTEKKyNkZWZpbmUgRUdMX0VYVF9wbGF0Zm9ybV94MTEgMQorI2RlZmluZSBFR0xfUExBVEZPUk1fWDExX0VYVCAgICAgICAgICAgICAgMHgzMUQ1CisjZGVmaW5lIEVHTF9QTEFURk9STV9YMTFfU0NSRUVOX0VYVCAgICAgICAweDMxRDYKKyNlbmRpZiAvKiBFR0xfRVhUX3BsYXRmb3JtX3gxMSAqLworCisjaWZuZGVmIEVHTF9FWFRfcHJvdGVjdGVkX2NvbnRlbnQKKyNkZWZpbmUgRUdMX0VYVF9wcm90ZWN0ZWRfY29udGVudCAxCisjZGVmaW5lIEVHTF9QUk9URUNURURfQ09OVEVOVF9FWFQgICAgICAgICAweDMyQzAKKyNlbmRpZiAvKiBFR0xfRVhUX3Byb3RlY3RlZF9jb250ZW50ICovCisKKyNpZm5kZWYgRUdMX0VYVF9wcm90ZWN0ZWRfc3VyZmFjZQorI2RlZmluZSBFR0xfRVhUX3Byb3RlY3RlZF9zdXJmYWNlIDEKKyNlbmRpZiAvKiBFR0xfRVhUX3Byb3RlY3RlZF9zdXJmYWNlICovCisKKyNpZm5kZWYgRUdMX0VYVF9zdHJlYW1fY29uc3VtZXJfZWdsb3V0cHV0CisjZGVmaW5lIEVHTF9FWFRfc3RyZWFtX2NvbnN1bWVyX2VnbG91dHB1dCAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTVFJFQU1DT05TVU1FUk9VVFBVVEVYVFBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSwgRUdMT3V0cHV0TGF5ZXJFWFQgbGF5ZXIpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3RyZWFtQ29uc3VtZXJPdXRwdXRFWFQgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xPdXRwdXRMYXllckVYVCBsYXllcik7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfRVhUX3N0cmVhbV9jb25zdW1lcl9lZ2xvdXRwdXQgKi8KKworI2lmbmRlZiBFR0xfRVhUX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZQorI2RlZmluZSBFR0xfRVhUX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZSAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTV0FQQlVGRkVSU1dJVEhEQU1BR0VFWFRQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50ICpyZWN0cywgRUdMaW50IG5fcmVjdHMpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnNXaXRoRGFtYWdlRVhUIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgKnJlY3RzLCBFR0xpbnQgbl9yZWN0cyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfRVhUX3N3YXBfYnVmZmVyc193aXRoX2RhbWFnZSAqLworCisjaWZuZGVmIEVHTF9FWFRfeXV2X3N1cmZhY2UKKyNkZWZpbmUgRUdMX0VYVF95dXZfc3VyZmFjZSAxCisjZGVmaW5lIEVHTF9ZVVZfT1JERVJfRVhUICAgICAgICAgICAgICAgICAweDMzMDEKKyNkZWZpbmUgRUdMX1lVVl9OVU1CRVJfT0ZfUExBTkVTX0VYVCAgICAgIDB4MzMxMQorI2RlZmluZSBFR0xfWVVWX1NVQlNBTVBMRV9FWFQgICAgICAgICAgICAgMHgzMzEyCisjZGVmaW5lIEVHTF9ZVVZfREVQVEhfUkFOR0VfRVhUICAgICAgICAgICAweDMzMTcKKyNkZWZpbmUgRUdMX1lVVl9DU0NfU1RBTkRBUkRfRVhUICAgICAgICAgIDB4MzMwQQorI2RlZmluZSBFR0xfWVVWX1BMQU5FX0JQUF9FWFQgICAgICAgICAgICAgMHgzMzFBCisjZGVmaW5lIEVHTF9ZVVZfQlVGRkVSX0VYVCAgICAgICAgICAgICAgICAweDMzMDAKKyNkZWZpbmUgRUdMX1lVVl9PUkRFUl9ZVVZfRVhUICAgICAgICAgICAgIDB4MzMwMgorI2RlZmluZSBFR0xfWVVWX09SREVSX1lWVV9FWFQgICAgICAgICAgICAgMHgzMzAzCisjZGVmaW5lIEVHTF9ZVVZfT1JERVJfWVVZVl9FWFQgICAgICAgICAgICAweDMzMDQKKyNkZWZpbmUgRUdMX1lVVl9PUkRFUl9VWVZZX0VYVCAgICAgICAgICAgIDB4MzMwNQorI2RlZmluZSBFR0xfWVVWX09SREVSX1lWWVVfRVhUICAgICAgICAgICAgMHgzMzA2CisjZGVmaW5lIEVHTF9ZVVZfT1JERVJfVllVWV9FWFQgICAgICAgICAgICAweDMzMDcKKyNkZWZpbmUgRUdMX1lVVl9PUkRFUl9BWVVWX0VYVCAgICAgICAgICAgIDB4MzMwOAorI2RlZmluZSBFR0xfWVVWX1NVQlNBTVBMRV80XzJfMF9FWFQgICAgICAgMHgzMzEzCisjZGVmaW5lIEVHTF9ZVVZfU1VCU0FNUExFXzRfMl8yX0VYVCAgICAgICAweDMzMTQKKyNkZWZpbmUgRUdMX1lVVl9TVUJTQU1QTEVfNF80XzRfRVhUICAgICAgIDB4MzMxNQorI2RlZmluZSBFR0xfWVVWX0RFUFRIX1JBTkdFX0xJTUlURURfRVhUICAgMHgzMzE4CisjZGVmaW5lIEVHTF9ZVVZfREVQVEhfUkFOR0VfRlVMTF9FWFQgICAgICAweDMzMTkKKyNkZWZpbmUgRUdMX1lVVl9DU0NfU1RBTkRBUkRfNjAxX0VYVCAgICAgIDB4MzMwQgorI2RlZmluZSBFR0xfWVVWX0NTQ19TVEFOREFSRF83MDlfRVhUICAgICAgMHgzMzBDCisjZGVmaW5lIEVHTF9ZVVZfQ1NDX1NUQU5EQVJEXzIwMjBfRVhUICAgICAweDMzMEQKKyNkZWZpbmUgRUdMX1lVVl9QTEFORV9CUFBfMF9FWFQgICAgICAgICAgIDB4MzMxQgorI2RlZmluZSBFR0xfWVVWX1BMQU5FX0JQUF84X0VYVCAgICAgICAgICAgMHgzMzFDCisjZGVmaW5lIEVHTF9ZVVZfUExBTkVfQlBQXzEwX0VYVCAgICAgICAgICAweDMzMUQKKyNlbmRpZiAvKiBFR0xfRVhUX3l1dl9zdXJmYWNlICovCisKKyNpZm5kZWYgRUdMX0hJX2NsaWVudHBpeG1hcAorI2RlZmluZSBFR0xfSElfY2xpZW50cGl4bWFwIDEKK3N0cnVjdCBFR0xDbGllbnRQaXhtYXBISSB7CisgICAgdm9pZCAgKnBEYXRhOworICAgIEVHTGludCBpV2lkdGg7CisgICAgRUdMaW50IGlIZWlnaHQ7CisgICAgRUdMaW50IGlTdHJpZGU7Cit9OworI2RlZmluZSBFR0xfQ0xJRU5UX1BJWE1BUF9QT0lOVEVSX0hJICAgICAgMHg4Rjc0Cit0eXBlZGVmIEVHTFN1cmZhY2UgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVQSVhNQVBTVVJGQUNFSElQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIHN0cnVjdCBFR0xDbGllbnRQaXhtYXBISSAqcGl4bWFwKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2VISSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIHN0cnVjdCBFR0xDbGllbnRQaXhtYXBISSAqcGl4bWFwKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9ISV9jbGllbnRwaXhtYXAgKi8KKworI2lmbmRlZiBFR0xfSElfY29sb3Jmb3JtYXRzCisjZGVmaW5lIEVHTF9ISV9jb2xvcmZvcm1hdHMgMQorI2RlZmluZSBFR0xfQ09MT1JfRk9STUFUX0hJICAgICAgICAgICAgICAgMHg4RjcwCisjZGVmaW5lIEVHTF9DT0xPUl9SR0JfSEkgICAgICAgICAgICAgICAgICAweDhGNzEKKyNkZWZpbmUgRUdMX0NPTE9SX1JHQkFfSEkgICAgICAgICAgICAgICAgIDB4OEY3MgorI2RlZmluZSBFR0xfQ09MT1JfQVJHQl9ISSAgICAgICAgICAgICAgICAgMHg4RjczCisjZW5kaWYgLyogRUdMX0hJX2NvbG9yZm9ybWF0cyAqLworCisjaWZuZGVmIEVHTF9JTUdfY29udGV4dF9wcmlvcml0eQorI2RlZmluZSBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkgMQorI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MRVZFTF9JTUcgICAgMHgzMTAwCisjZGVmaW5lIEVHTF9DT05URVhUX1BSSU9SSVRZX0hJR0hfSU1HICAgICAweDMxMDEKKyNkZWZpbmUgRUdMX0NPTlRFWFRfUFJJT1JJVFlfTUVESVVNX0lNRyAgIDB4MzEwMgorI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9MT1dfSU1HICAgICAgMHgzMTAzCisjZW5kaWYgLyogRUdMX0lNR19jb250ZXh0X3ByaW9yaXR5ICovCisKKyNpZm5kZWYgRUdMX0lNR19pbWFnZV9wbGFuZV9hdHRyaWJzCisjZGVmaW5lIEVHTF9JTUdfaW1hZ2VfcGxhbmVfYXR0cmlicyAxCisjZGVmaW5lIEVHTF9OQVRJVkVfQlVGRkVSX01VTFRJUExBTkVfU0VQQVJBVEVfSU1HIDB4MzEwNQorI2RlZmluZSBFR0xfTkFUSVZFX0JVRkZFUl9QTEFORV9PRkZTRVRfSU1HIDB4MzEwNgorI2VuZGlmIC8qIEVHTF9JTUdfaW1hZ2VfcGxhbmVfYXR0cmlicyAqLworCisjaWZuZGVmIEVHTF9NRVNBX2RybV9pbWFnZQorI2RlZmluZSBFR0xfTUVTQV9kcm1faW1hZ2UgMQorI2RlZmluZSBFR0xfRFJNX0JVRkZFUl9GT1JNQVRfTUVTQSAgICAgICAgMHgzMUQwCisjZGVmaW5lIEVHTF9EUk1fQlVGRkVSX1VTRV9NRVNBICAgICAgICAgICAweDMxRDEKKyNkZWZpbmUgRUdMX0RSTV9CVUZGRVJfRk9STUFUX0FSR0IzMl9NRVNBIDB4MzFEMgorI2RlZmluZSBFR0xfRFJNX0JVRkZFUl9NRVNBICAgICAgICAgICAgICAgMHgzMUQzCisjZGVmaW5lIEVHTF9EUk1fQlVGRkVSX1NUUklERV9NRVNBICAgICAgICAweDMxRDQKKyNkZWZpbmUgRUdMX0RSTV9CVUZGRVJfVVNFX1NDQU5PVVRfTUVTQSAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUdMX0RSTV9CVUZGRVJfVVNFX1NIQVJFX01FU0EgICAgIDB4MDAwMDAwMDIKK3R5cGVkZWYgRUdMSW1hZ2VLSFIgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVEUk1JTUFHRU1FU0FQUk9DKSAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMRVhQT1JURFJNSU1BR0VNRVNBUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSwgRUdMaW50ICpuYW1lLCBFR0xpbnQgKmhhbmRsZSwgRUdMaW50ICpzdHJpZGUpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEltYWdlS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZURSTUltYWdlTUVTQSAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRXhwb3J0RFJNSW1hZ2VNRVNBIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UsIEVHTGludCAqbmFtZSwgRUdMaW50ICpoYW5kbGUsIEVHTGludCAqc3RyaWRlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9NRVNBX2RybV9pbWFnZSAqLworCisjaWZuZGVmIEVHTF9NRVNBX2ltYWdlX2RtYV9idWZfZXhwb3J0CisjZGVmaW5lIEVHTF9NRVNBX2ltYWdlX2RtYV9idWZfZXhwb3J0IDEKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTEVYUE9SVERNQUJVRklNQUdFUVVFUllNRVNBUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSwgaW50ICpmb3VyY2MsIGludCAqbnVtX3BsYW5lcywgRUdMdWludDY0S0hSICptb2RpZmllcnMpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMRVhQT1JURE1BQlVGSU1BR0VNRVNBUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSwgaW50ICpmZHMsIEVHTGludCAqc3RyaWRlcywgRUdMaW50ICpvZmZzZXRzKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEV4cG9ydERNQUJVRkltYWdlUXVlcnlNRVNBIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UsIGludCAqZm91cmNjLCBpbnQgKm51bV9wbGFuZXMsIEVHTHVpbnQ2NEtIUiAqbW9kaWZpZXJzKTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEV4cG9ydERNQUJVRkltYWdlTUVTQSAoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlS0hSIGltYWdlLCBpbnQgKmZkcywgRUdMaW50ICpzdHJpZGVzLCBFR0xpbnQgKm9mZnNldHMpOworI2VuZGlmCisjZW5kaWYgLyogRUdMX01FU0FfaW1hZ2VfZG1hX2J1Zl9leHBvcnQgKi8KKworI2lmbmRlZiBFR0xfTUVTQV9wbGF0Zm9ybV9nYm0KKyNkZWZpbmUgRUdMX01FU0FfcGxhdGZvcm1fZ2JtIDEKKyNkZWZpbmUgRUdMX1BMQVRGT1JNX0dCTV9NRVNBICAgICAgICAgICAgIDB4MzFENworI2VuZGlmIC8qIEVHTF9NRVNBX3BsYXRmb3JtX2dibSAqLworCisjaWZuZGVmIEVHTF9OT0tfc3dhcF9yZWdpb24KKyNkZWZpbmUgRUdMX05PS19zd2FwX3JlZ2lvbiAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTV0FQQlVGRkVSU1JFR0lPTk5PS1BST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgbnVtUmVjdHMsIGNvbnN0IEVHTGludCAqcmVjdHMpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU3dhcEJ1ZmZlcnNSZWdpb25OT0sgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBudW1SZWN0cywgY29uc3QgRUdMaW50ICpyZWN0cyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfTk9LX3N3YXBfcmVnaW9uICovCisKKyNpZm5kZWYgRUdMX05PS19zd2FwX3JlZ2lvbjIKKyNkZWZpbmUgRUdMX05PS19zd2FwX3JlZ2lvbjIgMQordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMU1dBUEJVRkZFUlNSRUdJT04yTk9LUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBudW1SZWN0cywgY29uc3QgRUdMaW50ICpyZWN0cyk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTd2FwQnVmZmVyc1JlZ2lvbjJOT0sgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBudW1SZWN0cywgY29uc3QgRUdMaW50ICpyZWN0cyk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfTk9LX3N3YXBfcmVnaW9uMiAqLworCisjaWZuZGVmIEVHTF9OT0tfdGV4dHVyZV9mcm9tX3BpeG1hcAorI2RlZmluZSBFR0xfTk9LX3RleHR1cmVfZnJvbV9waXhtYXAgMQorI2RlZmluZSBFR0xfWV9JTlZFUlRFRF9OT0sgICAgICAgICAgICAgICAgMHgzMDdGCisjZW5kaWYgLyogRUdMX05PS190ZXh0dXJlX2Zyb21fcGl4bWFwICovCisKKyNpZm5kZWYgRUdMX05WXzNkdmlzaW9uX3N1cmZhY2UKKyNkZWZpbmUgRUdMX05WXzNkdmlzaW9uX3N1cmZhY2UgMQorI2RlZmluZSBFR0xfQVVUT19TVEVSRU9fTlYgICAgICAgICAgICAgICAgMHgzMTM2CisjZW5kaWYgLyogRUdMX05WXzNkdmlzaW9uX3N1cmZhY2UgKi8KKworI2lmbmRlZiBFR0xfTlZfY292ZXJhZ2Vfc2FtcGxlCisjZGVmaW5lIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgMQorI2RlZmluZSBFR0xfQ09WRVJBR0VfQlVGRkVSU19OViAgICAgICAgICAgMHgzMEUwCisjZGVmaW5lIEVHTF9DT1ZFUkFHRV9TQU1QTEVTX05WICAgICAgICAgICAweDMwRTEKKyNlbmRpZiAvKiBFR0xfTlZfY292ZXJhZ2Vfc2FtcGxlICovCisKKyNpZm5kZWYgRUdMX05WX2NvdmVyYWdlX3NhbXBsZV9yZXNvbHZlCisjZGVmaW5lIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGVfcmVzb2x2ZSAxCisjZGVmaW5lIEVHTF9DT1ZFUkFHRV9TQU1QTEVfUkVTT0xWRV9OViAgICAweDMxMzEKKyNkZWZpbmUgRUdMX0NPVkVSQUdFX1NBTVBMRV9SRVNPTFZFX0RFRkFVTFRfTlYgMHgzMTMyCisjZGVmaW5lIEVHTF9DT1ZFUkFHRV9TQU1QTEVfUkVTT0xWRV9OT05FX05WIDB4MzEzMworI2VuZGlmIC8qIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGVfcmVzb2x2ZSAqLworCisjaWZuZGVmIEVHTF9OVl9jdWRhX2V2ZW50CisjZGVmaW5lIEVHTF9OVl9jdWRhX2V2ZW50IDEKKyNkZWZpbmUgRUdMX0NVREFfRVZFTlRfSEFORExFX05WICAgICAgICAgIDB4MzIzQgorI2RlZmluZSBFR0xfU1lOQ19DVURBX0VWRU5UX05WICAgICAgICAgICAgMHgzMjNDCisjZGVmaW5lIEVHTF9TWU5DX0NVREFfRVZFTlRfQ09NUExFVEVfTlYgICAweDMyM0QKKyNlbmRpZiAvKiBFR0xfTlZfY3VkYV9ldmVudCAqLworCisjaWZuZGVmIEVHTF9OVl9kZXB0aF9ub25saW5lYXIKKyNkZWZpbmUgRUdMX05WX2RlcHRoX25vbmxpbmVhciAxCisjZGVmaW5lIEVHTF9ERVBUSF9FTkNPRElOR19OViAgICAgICAgICAgICAweDMwRTIKKyNkZWZpbmUgRUdMX0RFUFRIX0VOQ09ESU5HX05PTkVfTlYgICAgICAgIDAKKyNkZWZpbmUgRUdMX0RFUFRIX0VOQ09ESU5HX05PTkxJTkVBUl9OViAgIDB4MzBFMworI2VuZGlmIC8qIEVHTF9OVl9kZXB0aF9ub25saW5lYXIgKi8KKworI2lmbmRlZiBFR0xfTlZfZGV2aWNlX2N1ZGEKKyNkZWZpbmUgRUdMX05WX2RldmljZV9jdWRhIDEKKyNkZWZpbmUgRUdMX0NVREFfREVWSUNFX05WICAgICAgICAgICAgICAgIDB4MzIzQQorI2VuZGlmIC8qIEVHTF9OVl9kZXZpY2VfY3VkYSAqLworCisjaWZuZGVmIEVHTF9OVl9uYXRpdmVfcXVlcnkKKyNkZWZpbmUgRUdMX05WX25hdGl2ZV9xdWVyeSAxCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWU5BVElWRURJU1BMQVlOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMTmF0aXZlRGlzcGxheVR5cGUgKmRpc3BsYXlfaWQpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMUVVFUllOQVRJVkVXSU5ET1dOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmLCBFR0xOYXRpdmVXaW5kb3dUeXBlICp3aW5kb3cpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMUVVFUllOQVRJVkVQSVhNQVBOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmLCBFR0xOYXRpdmVQaXhtYXBUeXBlICpwaXhtYXApOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlOYXRpdmVEaXNwbGF5TlYgKEVHTERpc3BsYXkgZHB5LCBFR0xOYXRpdmVEaXNwbGF5VHlwZSAqZGlzcGxheV9pZCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeU5hdGl2ZVdpbmRvd05WIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmLCBFR0xOYXRpdmVXaW5kb3dUeXBlICp3aW5kb3cpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUXVlcnlOYXRpdmVQaXhtYXBOViAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZiwgRUdMTmF0aXZlUGl4bWFwVHlwZSAqcGl4bWFwKTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9OVl9uYXRpdmVfcXVlcnkgKi8KKworI2lmbmRlZiBFR0xfTlZfcG9zdF9jb252ZXJ0X3JvdW5kaW5nCisjZGVmaW5lIEVHTF9OVl9wb3N0X2NvbnZlcnRfcm91bmRpbmcgMQorI2VuZGlmIC8qIEVHTF9OVl9wb3N0X2NvbnZlcnRfcm91bmRpbmcgKi8KKworI2lmbmRlZiBFR0xfTlZfcG9zdF9zdWJfYnVmZmVyCisjZGVmaW5lIEVHTF9OVl9wb3N0X3N1Yl9idWZmZXIgMQorI2RlZmluZSBFR0xfUE9TVF9TVUJfQlVGRkVSX1NVUFBPUlRFRF9OViAgMHgzMEJFCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xQT1NUU1VCQlVGRkVSTlZQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IHgsIEVHTGludCB5LCBFR0xpbnQgd2lkdGgsIEVHTGludCBoZWlnaHQpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUG9zdFN1YkJ1ZmZlck5WIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgeCwgRUdMaW50IHksIEVHTGludCB3aWR0aCwgRUdMaW50IGhlaWdodCk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfTlZfcG9zdF9zdWJfYnVmZmVyICovCisKKyNpZm5kZWYgRUdMX05WX3JvYnVzdG5lc3NfdmlkZW9fbWVtb3J5X3B1cmdlCisjZGVmaW5lIEVHTF9OVl9yb2J1c3RuZXNzX3ZpZGVvX21lbW9yeV9wdXJnZSAxCisjZGVmaW5lIEVHTF9HRU5FUkFURV9SRVNFVF9PTl9WSURFT19NRU1PUllfUFVSR0VfTlYgMHgzMzRDCisjZW5kaWYgLyogRUdMX05WX3JvYnVzdG5lc3NfdmlkZW9fbWVtb3J5X3B1cmdlICovCisKKyNpZm5kZWYgRUdMX05WX3N0cmVhbV9jb25zdW1lcl9nbHRleHR1cmVfeXV2CisjZGVmaW5lIEVHTF9OVl9zdHJlYW1fY29uc3VtZXJfZ2x0ZXh0dXJlX3l1diAxCisjZGVmaW5lIEVHTF9ZVVZfUExBTkUwX1RFWFRVUkVfVU5JVF9OViAgICAweDMzMkMKKyNkZWZpbmUgRUdMX1lVVl9QTEFORTFfVEVYVFVSRV9VTklUX05WICAgIDB4MzMyRAorI2RlZmluZSBFR0xfWVVWX1BMQU5FMl9URVhUVVJFX1VOSVRfTlYgICAgMHgzMzJFCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTVFJFQU1DT05TVU1FUkdMVEVYVFVSRUVYVEVSTkFMQVRUUklCU05WUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0KTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN0cmVhbUNvbnN1bWVyR0xUZXh0dXJlRXh0ZXJuYWxBdHRyaWJzTlYgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xBdHRyaWIgKmF0dHJpYl9saXN0KTsKKyNlbmRpZgorI2VuZGlmIC8qIEVHTF9OVl9zdHJlYW1fY29uc3VtZXJfZ2x0ZXh0dXJlX3l1diAqLworCisjaWZuZGVmIEVHTF9OVl9zdHJlYW1fbWV0YWRhdGEKKyNkZWZpbmUgRUdMX05WX3N0cmVhbV9tZXRhZGF0YSAxCisjZGVmaW5lIEVHTF9NQVhfU1RSRUFNX01FVEFEQVRBX0JMT0NLU19OViAweDMyNTAKKyNkZWZpbmUgRUdMX01BWF9TVFJFQU1fTUVUQURBVEFfQkxPQ0tfU0laRV9OViAweDMyNTEKKyNkZWZpbmUgRUdMX01BWF9TVFJFQU1fTUVUQURBVEFfVE9UQUxfU0laRV9OViAweDMyNTIKKyNkZWZpbmUgRUdMX1BST0RVQ0VSX01FVEFEQVRBX05WICAgICAgICAgIDB4MzI1MworI2RlZmluZSBFR0xfQ09OU1VNRVJfTUVUQURBVEFfTlYgICAgICAgICAgMHgzMjU0CisjZGVmaW5lIEVHTF9QRU5ESU5HX01FVEFEQVRBX05WICAgICAgICAgICAweDMzMjgKKyNkZWZpbmUgRUdMX01FVEFEQVRBMF9TSVpFX05WICAgICAgICAgICAgIDB4MzI1NQorI2RlZmluZSBFR0xfTUVUQURBVEExX1NJWkVfTlYgICAgICAgICAgICAgMHgzMjU2CisjZGVmaW5lIEVHTF9NRVRBREFUQTJfU0laRV9OViAgICAgICAgICAgICAweDMyNTcKKyNkZWZpbmUgRUdMX01FVEFEQVRBM19TSVpFX05WICAgICAgICAgICAgIDB4MzI1OAorI2RlZmluZSBFR0xfTUVUQURBVEEwX1RZUEVfTlYgICAgICAgICAgICAgMHgzMjU5CisjZGVmaW5lIEVHTF9NRVRBREFUQTFfVFlQRV9OViAgICAgICAgICAgICAweDMyNUEKKyNkZWZpbmUgRUdMX01FVEFEQVRBMl9UWVBFX05WICAgICAgICAgICAgIDB4MzI1QgorI2RlZmluZSBFR0xfTUVUQURBVEEzX1RZUEVfTlYgICAgICAgICAgICAgMHgzMjVDCit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xRVUVSWURJU1BMQVlBVFRSSUJOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMQXR0cmliICp2YWx1ZSk7Cit0eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTRVRTVFJFQU1NRVRBREFUQU5WUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xpbnQgbiwgRUdMaW50IG9mZnNldCwgRUdMaW50IHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMUVVFUllTVFJFQU1NRVRBREFUQU5WUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xlbnVtIG5hbWUsIEVHTGludCBuLCBFR0xpbnQgb2Zmc2V0LCBFR0xpbnQgc2l6ZSwgdm9pZCAqZGF0YSk7CisjaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeURpc3BsYXlBdHRyaWJOViAoRUdMRGlzcGxheSBkcHksIEVHTGludCBhdHRyaWJ1dGUsIEVHTEF0dHJpYiAqdmFsdWUpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsU2V0U3RyZWFtTWV0YWRhdGFOViAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGludCBuLCBFR0xpbnQgb2Zmc2V0LCBFR0xpbnQgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmVhbU1ldGFkYXRhTlYgKEVHTERpc3BsYXkgZHB5LCBFR0xTdHJlYW1LSFIgc3RyZWFtLCBFR0xlbnVtIG5hbWUsIEVHTGludCBuLCBFR0xpbnQgb2Zmc2V0LCBFR0xpbnQgc2l6ZSwgdm9pZCAqZGF0YSk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfTlZfc3RyZWFtX21ldGFkYXRhICovCisKKyNpZm5kZWYgRUdMX05WX3N0cmVhbV9zeW5jCisjZGVmaW5lIEVHTF9OVl9zdHJlYW1fc3luYyAxCisjZGVmaW5lIEVHTF9TWU5DX05FV19GUkFNRV9OViAgICAgICAgICAgICAweDMyMUYKK3R5cGVkZWYgRUdMU3luY0tIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURVNUUkVBTVNZTkNOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3RyZWFtS0hSIHN0cmVhbSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xTeW5jS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVN0cmVhbVN5bmNOViAoRUdMRGlzcGxheSBkcHksIEVHTFN0cmVhbUtIUiBzdHJlYW0sIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CisjZW5kaWYKKyNlbmRpZiAvKiBFR0xfTlZfc3RyZWFtX3N5bmMgKi8KKworI2lmbmRlZiBFR0xfTlZfc3luYworI2RlZmluZSBFR0xfTlZfc3luYyAxCit0eXBlZGVmIHZvaWQgKkVHTFN5bmNOVjsKK3R5cGVkZWYga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190IEVHTFRpbWVOVjsKKyNpZmRlZiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQKKyNkZWZpbmUgRUdMX1NZTkNfUFJJT1JfQ09NTUFORFNfQ09NUExFVEVfTlYgMHgzMEU2CisjZGVmaW5lIEVHTF9TWU5DX1NUQVRVU19OViAgICAgICAgICAgICAgICAweDMwRTcKKyNkZWZpbmUgRUdMX1NJR05BTEVEX05WICAgICAgICAgICAgICAgICAgIDB4MzBFOAorI2RlZmluZSBFR0xfVU5TSUdOQUxFRF9OViAgICAgICAgICAgICAgICAgMHgzMEU5CisjZGVmaW5lIEVHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVF9OViAgICAweDAwMDEKKyNkZWZpbmUgRUdMX0ZPUkVWRVJfTlYgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRnVsbAorI2RlZmluZSBFR0xfQUxSRUFEWV9TSUdOQUxFRF9OViAgICAgICAgICAgMHgzMEVBCisjZGVmaW5lIEVHTF9USU1FT1VUX0VYUElSRURfTlYgICAgICAgICAgICAweDMwRUIKKyNkZWZpbmUgRUdMX0NPTkRJVElPTl9TQVRJU0ZJRURfTlYgICAgICAgIDB4MzBFQworI2RlZmluZSBFR0xfU1lOQ19UWVBFX05WICAgICAgICAgICAgICAgICAgMHgzMEVECisjZGVmaW5lIEVHTF9TWU5DX0NPTkRJVElPTl9OViAgICAgICAgICAgICAweDMwRUUKKyNkZWZpbmUgRUdMX1NZTkNfRkVOQ0VfTlYgICAgICAgICAgICAgICAgIDB4MzBFRgorI2RlZmluZSBFR0xfTk9fU1lOQ19OViAgICAgICAgICAgICAgICAgICAgKChFR0xTeW5jTlYpMCkKK3R5cGVkZWYgRUdMU3luY05WIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFRkVOQ0VTWU5DTlZQUk9DKSAoRUdMRGlzcGxheSBkcHksIEVHTGVudW0gY29uZGl0aW9uLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKK3R5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTERFU1RST1lTWU5DTlZQUk9DKSAoRUdMU3luY05WIHN5bmMpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMRkVOQ0VOVlBST0MpIChFR0xTeW5jTlYgc3luYyk7Cit0eXBlZGVmIEVHTGludCAoRUdMQVBJRU5UUllQIFBGTkVHTENMSUVOVFdBSVRTWU5DTlZQUk9DKSAoRUdMU3luY05WIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZU5WIHRpbWVvdXQpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMU0lHTkFMU1lOQ05WUFJPQykgKEVHTFN5bmNOViBzeW5jLCBFR0xlbnVtIG1vZGUpOwordHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMR0VUU1lOQ0FUVFJJQk5WUFJPQykgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKyNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKK0VHTEFQSSBFR0xTeW5jTlYgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlRmVuY2VTeW5jTlYgKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGNvbmRpdGlvbiwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95U3luY05WIChFR0xTeW5jTlYgc3luYyk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xGZW5jZU5WIChFR0xTeW5jTlYgc3luYyk7CitFR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbENsaWVudFdhaXRTeW5jTlYgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVOViB0aW1lb3V0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFNpZ25hbFN5bmNOViAoRUdMU3luY05WIHN5bmMsIEVHTGVudW0gbW9kZSk7CitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRTeW5jQXR0cmliTlYgKEVHTFN5bmNOViBzeW5jLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAqLworI2VuZGlmIC8qIEVHTF9OVl9zeW5jICovCisKKyNpZm5kZWYgRUdMX05WX3N5c3RlbV90aW1lCisjZGVmaW5lIEVHTF9OVl9zeXN0ZW1fdGltZSAxCit0eXBlZGVmIGtocm9ub3NfdXRpbWVfbmFub3NlY29uZHNfdCBFR0x1aW50NjROVjsKKyNpZmRlZiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQKK3R5cGVkZWYgRUdMdWludDY0TlYgKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRTWVNURU1USU1FRlJFUVVFTkNZTlZQUk9DKSAodm9pZCk7Cit0eXBlZGVmIEVHTHVpbnQ2NE5WIChFR0xBUElFTlRSWVAgUEZORUdMR0VUU1lTVEVNVElNRU5WUFJPQykgKHZvaWQpOworI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUworRUdMQVBJIEVHTHVpbnQ2NE5WIEVHTEFQSUVOVFJZIGVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOViAodm9pZCk7CitFR0xBUEkgRUdMdWludDY0TlYgRUdMQVBJRU5UUlkgZWdsR2V0U3lzdGVtVGltZU5WICh2b2lkKTsKKyNlbmRpZgorI2VuZGlmIC8qIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAqLworI2VuZGlmIC8qIEVHTF9OVl9zeXN0ZW1fdGltZSAqLworCisjaWZuZGVmIEVHTF9USVpFTl9pbWFnZV9uYXRpdmVfYnVmZmVyCisjZGVmaW5lIEVHTF9USVpFTl9pbWFnZV9uYXRpdmVfYnVmZmVyIDEKKyNkZWZpbmUgRUdMX05BVElWRV9CVUZGRVJfVElaRU4gICAgICAgICAgIDB4MzJBMAorI2VuZGlmIC8qIEVHTF9USVpFTl9pbWFnZV9uYXRpdmVfYnVmZmVyICovCisKKyNpZm5kZWYgRUdMX1RJWkVOX2ltYWdlX25hdGl2ZV9zdXJmYWNlCisjZGVmaW5lIEVHTF9USVpFTl9pbWFnZV9uYXRpdmVfc3VyZmFjZSAxCisjZGVmaW5lIEVHTF9OQVRJVkVfU1VSRkFDRV9USVpFTiAgICAgICAgICAweDMyQTEKKyNlbmRpZiAvKiBFR0xfVElaRU5faW1hZ2VfbmF0aXZlX3N1cmZhY2UgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FR0wvZWdscGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjg0MDg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FR0wvZWdscGxhdGZvcm0uaApAQCAtMCwwICsxLDEyNSBAQAorI2lmbmRlZiBfX2VnbHBsYXRmb3JtX2hfCisjZGVmaW5lIF9fZWdscGxhdGZvcm1faF8KKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAwNy0yMDEzIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKioKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKgorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyovCisKKy8qIFBsYXRmb3JtLXNwZWNpZmljIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBmb3IgZWdsLmgKKyAqICRSZXZpc2lvbjogMzA5OTQgJCBvbiAkRGF0ZTogMjAxNS0wNC0zMCAxMzozNjo0OCAtMDcwMCAoVGh1LCAzMCBBcHIgMjAxNSkgJAorICoKKyAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCisgKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKKyAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKKyAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKKyAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIkVHTCIgY29tcG9uZW50ICJSZWdpc3RyeSIuCisgKi8KKworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorCisvKiBNYWNyb3MgdXNlZCBpbiBFR0wgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBFR0wgZnVuY3Rpb25zIHNob3VsZCBiZSBwcm90b3R5cGVkIGFzOgorICoKKyAqIEVHTEFQSSByZXR1cm4tdHlwZSBFR0xBUElFTlRSWSBlZ2xGdW5jdGlvbihhcmd1bWVudHMpOworICogdHlwZWRlZiByZXR1cm4tdHlwZSAoRVhQQVBJRU5UUllQIFBGTkVHTEZVTkNUSU9OUFJPQykgKGFyZ3VtZW50cyk7CisgKgorICogS0hST05PU19BUElDQUxMIGFuZCBLSFJPTk9TX0FQSUVOVFJZIGFyZSBkZWZpbmVkIGluIEtIUi9raHJwbGF0Zm9ybS5oCisgKi8KKworI2lmbmRlZiBFR0xBUEkKKyNkZWZpbmUgRUdMQVBJIEtIUk9OT1NfQVBJQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgRUdMQVBJRU5UUlkKKyNkZWZpbmUgRUdMQVBJRU5UUlkgIEtIUk9OT1NfQVBJRU5UUlkKKyNlbmRpZgorI2RlZmluZSBFR0xBUElFTlRSWVAgRUdMQVBJRU5UUlkqCisKKy8qIFRoZSB0eXBlcyBOYXRpdmVEaXNwbGF5VHlwZSwgTmF0aXZlV2luZG93VHlwZSwgYW5kIE5hdGl2ZVBpeG1hcFR5cGUKKyAqIGFyZSBhbGlhc2VzIG9mIHdpbmRvdy1zeXN0ZW0tZGVwZW5kZW50IHR5cGVzLCBzdWNoIGFzIFggRGlzcGxheSAqIG9yCisgKiBXaW5kb3dzIERldmljZSBDb250ZXh0LiBUaGV5IG11c3QgYmUgZGVmaW5lZCBpbiBwbGF0Zm9ybS1zcGVjaWZpYworICogY29kZSBiZWxvdy4gVGhlIEVHTC1wcmVmaXhlZCB2ZXJzaW9ucyBvZiBOYXRpdmUqVHlwZSBhcmUgdGhlIHNhbWUKKyAqIHR5cGVzLCByZW5hbWVkIGluIEVHTCAxLjMgc28gYWxsIHR5cGVzIGluIHRoZSBBUEkgc3RhcnQgd2l0aCAiRUdMIi4KKyAqCisgKiBLaHJvbm9zIFNUUk9OR0xZIFJFQ09NTUVORFMgdGhhdCB5b3UgdXNlIHRoZSBkZWZhdWx0IGRlZmluaXRpb25zCisgKiBwcm92aWRlZCBiZWxvdywgc2luY2UgdGhlc2UgY2hhbmdlcyBhZmZlY3QgYm90aCBiaW5hcnkgYW5kIHNvdXJjZQorICogcG9ydGFiaWxpdHkgb2YgYXBwbGljYXRpb25zIHVzaW5nIEVHTCBydW5uaW5nIG9uIGRpZmZlcmVudCBFR0wKKyAqIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19WQzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pIC8qIFdpbjMyIGFuZCBXaW5DRSAqLworI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2VuZGlmCisjaW5jbHVkZSA8d2luZG93cy5oPgorCit0eXBlZGVmIEhEQyAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEhCSVRNQVAgRUdMTmF0aXZlUGl4bWFwVHlwZTsKK3R5cGVkZWYgSFdORCAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOworCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX1dJTlNDV19fKSB8fCBkZWZpbmVkKF9fU1lNQklBTjMyX18pICAvKiBTeW1iaWFuICovCisKK3R5cGVkZWYgaW50ICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHZvaWQgKkVHTE5hdGl2ZVBpeG1hcFR5cGU7CisKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pIHx8IGRlZmluZWQoQU5EUk9JRCkKKworI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorCitzdHJ1Y3QgZWdsX25hdGl2ZV9waXhtYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdyogICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHN0cnVjdCBlZ2xfbmF0aXZlX3BpeG1hcF90KiAgICAgRUdMTmF0aXZlUGl4bWFwVHlwZTsKK3R5cGVkZWYgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xOYXRpdmVEaXNwbGF5VHlwZTsKKworI2VsaWYgZGVmaW5lZChfX3VuaXhfXykKKworLyogWDExICh0ZW50YXRpdmUpICAqLworI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisKK3R5cGVkZWYgRGlzcGxheSAqRUdMTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIFBpeG1hcCAgIEVHTE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIFdpbmRvdyAgIEVHTE5hdGl2ZVdpbmRvd1R5cGU7CisKKyNlbHNlCisjZXJyb3IgIlBsYXRmb3JtIG5vdCByZWNvZ25pemVkIgorI2VuZGlmCisKKy8qIEVHTCAxLjIgdHlwZXMsIHJlbmFtZWQgZm9yIGNvbnNpc3RlbmN5IGluIEVHTCAxLjMgKi8KK3R5cGVkZWYgRUdMTmF0aXZlRGlzcGxheVR5cGUgTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVBpeG1hcFR5cGUgIE5hdGl2ZVBpeG1hcFR5cGU7Cit0eXBlZGVmIEVHTE5hdGl2ZVdpbmRvd1R5cGUgIE5hdGl2ZVdpbmRvd1R5cGU7CisKKworLyogRGVmaW5lIEVHTGludC4gVGhpcyBtdXN0IGJlIGEgc2lnbmVkIGludGVncmFsIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4KKyAqIGFsbCBsZWdhbCBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcyBwYXNzZWQgaW50byBhbmQgb3V0IG9mIEVHTCwgd2hldGhlcgorICogdGhlaXIgdHlwZSBpcyBib29sZWFuLCBiaXRtYXNrLCBlbnVtZXJhbnQgKHN5bWJvbGljIGNvbnN0YW50KSwgaW50ZWdlciwKKyAqIGhhbmRsZSwgb3Igb3RoZXIuICBXaGlsZSBpbiBnZW5lcmFsIGEgMzItYml0IGludGVnZXIgd2lsbCBzdWZmaWNlLCBpZgorICogaGFuZGxlcyBhcmUgNjQgYml0IHR5cGVzLCB0aGVuIEVHTGludCBzaG91bGQgYmUgZGVmaW5lZCBhcyBhIHNpZ25lZCA2NC1iaXQKKyAqIGludGVnZXIgdHlwZS4KKyAqLwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgRUdMaW50OworCisjZW5kaWYgLyogX19lZ2xwbGF0Zm9ybV9oICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0VUQzEvZXRjMS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FVEMxL2V0YzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDM4OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9FVEMxL2V0YzEuaApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBfX2V0YzFfaF9fCisjZGVmaW5lIF9fZXRjMV9oX18KKworI2RlZmluZSBFVEMxX0VOQ09ERURfQkxPQ0tfU0laRSA4CisjZGVmaW5lIEVUQzFfREVDT0RFRF9CTE9DS19TSVpFIDQ4CisKKyNpZm5kZWYgRVRDMV9SR0I4X09FUworI2RlZmluZSBFVEMxX1JHQjhfT0VTIDB4OEQ2NAorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBldGMxX2J5dGU7Cit0eXBlZGVmIGludCBldGMxX2Jvb2w7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBldGMxX3VpbnQzMjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBFbmNvZGUgYSBibG9jayBvZiBwaXhlbHMuCisvLworLy8gcEluIGlzIGEgcG9pbnRlciB0byBhIEVUQ19ERUNPREVEX0JMT0NLX1NJWkUgYXJyYXkgb2YgYnl0ZXMgdGhhdCByZXByZXNlbnQgYQorLy8gNCB4IDQgc3F1YXJlIG9mIDMtYnl0ZSBwaXhlbHMgaW4gZm9ybSBSLCBHLCBCLiBCeXRlICgzICogKHggKyA0ICogeSkgaXMgdGhlIFIKKy8vIHZhbHVlIG9mIHBpeGVsICh4LCB5KS4KKy8vCisvLyB2YWxpZFBpeGVsTWFzayBpcyBhIDE2LWJpdCBtYXNrIHdoZXJlIGJpdCAoMSA8PCAoeCArIHkgKiA0KSkgaW5kaWNhdGVzIHdoZXRoZXIKKy8vIHRoZSBjb3JyZXNwb25kaW5nICh4LHkpIHBpeGVsIGlzIHZhbGlkLiBJbnZhbGlkIHBpeGVsIGNvbG9yIHZhbHVlcyBhcmUgaWdub3JlZCB3aGVuIGNvbXByZXNzaW5nLgorLy8KKy8vIHBPdXQgaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCisKK3ZvaWQgZXRjMV9lbmNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHZhbGlkUGl4ZWxNYXNrLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBEZWNvZGUgYSBibG9jayBvZiBwaXhlbHMuCisvLworLy8gcEluIGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgorLy8KKy8vIHBPdXQgaXMgYSBwb2ludGVyIHRvIGEgRVRDX0RFQ09ERURfQkxPQ0tfU0laRSBhcnJheSBvZiBieXRlcyB0aGF0IHJlcHJlc2VudCBhCisvLyA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIuIEJ5dGUgKDMgKiAoeCArIDQgKiB5KSBpcyB0aGUgUgorLy8gdmFsdWUgb2YgcGl4ZWwgKHgsIHkpLgorCit2b2lkIGV0YzFfZGVjb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGVuY29kZWQgaW1hZ2UgZGF0YSAoZG9lcyBub3QgaW5jbHVkZSBzaXplIG9mIFBLTSBoZWFkZXIpLgorCitldGMxX3VpbnQzMiBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZShldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KTsKKworLy8gRW5jb2RlIGFuIGVudGlyZSBpbWFnZS4KKy8vIHBJbiAtIHBvaW50ZXIgdG8gdGhlIGltYWdlIGRhdGEuIEZvcm1hdHRlZCBzdWNoIHRoYXQKKy8vICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5OworLy8gcE91dCAtIHBvaW50ZXIgdG8gZW5jb2RlZCBkYXRhLiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgZW5jb2RlZCBpbWFnZS4KKy8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCisvLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorCitpbnQgZXRjMV9lbmNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCisgICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBEZWNvZGUgYW4gZW50aXJlIGltYWdlLgorLy8gcEluIC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuCisvLyBwT3V0IC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gV2lsbCBiZSB3cml0dGVuIHN1Y2ggdGhhdAorLy8gICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5LiBNdXN0IGJlCisvLyAgICAgICAgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBpbWFnZS4KKy8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCisvLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorCitpbnQgZXRjMV9kZWNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCwKKyAgICAgICAgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKKyAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUpOworCisvLyBTaXplIG9mIGEgUEtNIGhlYWRlciwgaW4gYnl0ZXMuCisKKyNkZWZpbmUgRVRDX1BLTV9IRUFERVJfU0laRSAxNgorCisvLyBGb3JtYXQgYSBQS00gaGVhZGVyCisKK3ZvaWQgZXRjMV9wa21fZm9ybWF0X2hlYWRlcihldGMxX2J5dGUqIHBIZWFkZXIsIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpOworCisvLyBDaGVjayBpZiBhIFBLTSBoZWFkZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4KKworZXRjMV9ib29sIGV0YzFfcGttX2lzX3ZhbGlkKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcik7CisKKy8vIFJlYWQgdGhlIGltYWdlIHdpZHRoIGZyb20gYSBQS00gaGVhZGVyCisKK2V0YzFfdWludDMyIGV0YzFfcGttX2dldF93aWR0aChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOworCisvLyBSZWFkIHRoZSBpbWFnZSBoZWlnaHQgZnJvbSBhIFBLTSBoZWFkZXIKKworZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X2hlaWdodChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0wvd2dsZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dML3dnbGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDZkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dML3dnbGV4dC5oCkBAIC0wLDAgKzEsOTAxIEBACisjaWZuZGVmIF9fd2dsZXh0X2hfCisjZGVmaW5lIF9fd2dsZXh0X2hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKioKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKgorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyovCisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9uIG1hY3JvcyAtIHRvIG1vdmUgaW50byBnbHBsYXRmb3JtLmggKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgQVBJRU5UUlkKKyNkZWZpbmUgQVBJRU5UUlkKKyNlbmRpZgorI2lmbmRlZiBBUElFTlRSWVAKKyNkZWZpbmUgQVBJRU5UUllQIEFQSUVOVFJZICoKKyNlbmRpZgorI2lmbmRlZiBHTEFQSQorI2RlZmluZSBHTEFQSSBleHRlcm4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSGVhZGVyIGZpbGUgdmVyc2lvbiBudW1iZXIgKi8KKy8qIHdnbGV4dC5oIGxhc3QgdXBkYXRlZCAyMDEwLzA4LzA2ICovCisvKiBDdXJyZW50IHZlcnNpb24gYXQgaHR0cDovL3d3dy5vcGVuZ2wub3JnL3JlZ2lzdHJ5LyAqLworI2RlZmluZSBXR0xfV0dMRVhUX1ZFUlNJT04gMjIKKworI2lmbmRlZiBXR0xfQVJCX2J1ZmZlcl9yZWdpb24KKyNkZWZpbmUgV0dMX0ZST05UX0NPTE9SX0JVRkZFUl9CSVRfQVJCIDB4MDAwMDAwMDEKKyNkZWZpbmUgV0dMX0JBQ0tfQ09MT1JfQlVGRkVSX0JJVF9BUkIgIDB4MDAwMDAwMDIKKyNkZWZpbmUgV0dMX0RFUFRIX0JVRkZFUl9CSVRfQVJCICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgV0dMX1NURU5DSUxfQlVGRkVSX0JJVF9BUkIgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9BUkJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgV0dMX1NBTVBMRV9CVUZGRVJTX0FSQiAgICAgICAgIDB4MjA0MQorI2RlZmluZSBXR0xfU0FNUExFU19BUkIgICAgICAgICAgICAgICAgMHgyMDQyCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2V4dGVuc2lvbnNfc3RyaW5nCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX3BpeGVsX2Zvcm1hdAorI2RlZmluZSBXR0xfTlVNQkVSX1BJWEVMX0ZPUk1BVFNfQVJCICAgMHgyMDAwCisjZGVmaW5lIFdHTF9EUkFXX1RPX1dJTkRPV19BUkIgICAgICAgICAweDIwMDEKKyNkZWZpbmUgV0dMX0RSQVdfVE9fQklUTUFQX0FSQiAgICAgICAgIDB4MjAwMgorI2RlZmluZSBXR0xfQUNDRUxFUkFUSU9OX0FSQiAgICAgICAgICAgMHgyMDAzCisjZGVmaW5lIFdHTF9ORUVEX1BBTEVUVEVfQVJCICAgICAgICAgICAweDIwMDQKKyNkZWZpbmUgV0dMX05FRURfU1lTVEVNX1BBTEVUVEVfQVJCICAgIDB4MjAwNQorI2RlZmluZSBXR0xfU1dBUF9MQVlFUl9CVUZGRVJTX0FSQiAgICAgMHgyMDA2CisjZGVmaW5lIFdHTF9TV0FQX01FVEhPRF9BUkIgICAgICAgICAgICAweDIwMDcKKyNkZWZpbmUgV0dMX05VTUJFUl9PVkVSTEFZU19BUkIgICAgICAgIDB4MjAwOAorI2RlZmluZSBXR0xfTlVNQkVSX1VOREVSTEFZU19BUkIgICAgICAgMHgyMDA5CisjZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9BUkIgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRV9BUkIgIDB4MjAzNworI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUVfQVJCIDB4MjAzOAorI2RlZmluZSBXR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRV9BUkIgMHgyMDM5CisjZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9BTFBIQV9WQUxVRV9BUkIgMHgyMDNBCisjZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9JTkRFWF9WQUxVRV9BUkIgMHgyMDNCCisjZGVmaW5lIFdHTF9TSEFSRV9ERVBUSF9BUkIgICAgICAgICAgICAweDIwMEMKKyNkZWZpbmUgV0dMX1NIQVJFX1NURU5DSUxfQVJCICAgICAgICAgIDB4MjAwRAorI2RlZmluZSBXR0xfU0hBUkVfQUNDVU1fQVJCICAgICAgICAgICAgMHgyMDBFCisjZGVmaW5lIFdHTF9TVVBQT1JUX0dESV9BUkIgICAgICAgICAgICAweDIwMEYKKyNkZWZpbmUgV0dMX1NVUFBPUlRfT1BFTkdMX0FSQiAgICAgICAgIDB4MjAxMAorI2RlZmluZSBXR0xfRE9VQkxFX0JVRkZFUl9BUkIgICAgICAgICAgMHgyMDExCisjZGVmaW5lIFdHTF9TVEVSRU9fQVJCICAgICAgICAgICAgICAgICAweDIwMTIKKyNkZWZpbmUgV0dMX1BJWEVMX1RZUEVfQVJCICAgICAgICAgICAgIDB4MjAxMworI2RlZmluZSBXR0xfQ09MT1JfQklUU19BUkIgICAgICAgICAgICAgMHgyMDE0CisjZGVmaW5lIFdHTF9SRURfQklUU19BUkIgICAgICAgICAgICAgICAweDIwMTUKKyNkZWZpbmUgV0dMX1JFRF9TSElGVF9BUkIgICAgICAgICAgICAgIDB4MjAxNgorI2RlZmluZSBXR0xfR1JFRU5fQklUU19BUkIgICAgICAgICAgICAgMHgyMDE3CisjZGVmaW5lIFdHTF9HUkVFTl9TSElGVF9BUkIgICAgICAgICAgICAweDIwMTgKKyNkZWZpbmUgV0dMX0JMVUVfQklUU19BUkIgICAgICAgICAgICAgIDB4MjAxOQorI2RlZmluZSBXR0xfQkxVRV9TSElGVF9BUkIgICAgICAgICAgICAgMHgyMDFBCisjZGVmaW5lIFdHTF9BTFBIQV9CSVRTX0FSQiAgICAgICAgICAgICAweDIwMUIKKyNkZWZpbmUgV0dMX0FMUEhBX1NISUZUX0FSQiAgICAgICAgICAgIDB4MjAxQworI2RlZmluZSBXR0xfQUNDVU1fQklUU19BUkIgICAgICAgICAgICAgMHgyMDFECisjZGVmaW5lIFdHTF9BQ0NVTV9SRURfQklUU19BUkIgICAgICAgICAweDIwMUUKKyNkZWZpbmUgV0dMX0FDQ1VNX0dSRUVOX0JJVFNfQVJCICAgICAgIDB4MjAxRgorI2RlZmluZSBXR0xfQUNDVU1fQkxVRV9CSVRTX0FSQiAgICAgICAgMHgyMDIwCisjZGVmaW5lIFdHTF9BQ0NVTV9BTFBIQV9CSVRTX0FSQiAgICAgICAweDIwMjEKKyNkZWZpbmUgV0dMX0RFUFRIX0JJVFNfQVJCICAgICAgICAgICAgIDB4MjAyMgorI2RlZmluZSBXR0xfU1RFTkNJTF9CSVRTX0FSQiAgICAgICAgICAgMHgyMDIzCisjZGVmaW5lIFdHTF9BVVhfQlVGRkVSU19BUkIgICAgICAgICAgICAweDIwMjQKKyNkZWZpbmUgV0dMX05PX0FDQ0VMRVJBVElPTl9BUkIgICAgICAgIDB4MjAyNQorI2RlZmluZSBXR0xfR0VORVJJQ19BQ0NFTEVSQVRJT05fQVJCICAgMHgyMDI2CisjZGVmaW5lIFdHTF9GVUxMX0FDQ0VMRVJBVElPTl9BUkIgICAgICAweDIwMjcKKyNkZWZpbmUgV0dMX1NXQVBfRVhDSEFOR0VfQVJCICAgICAgICAgIDB4MjAyOAorI2RlZmluZSBXR0xfU1dBUF9DT1BZX0FSQiAgICAgICAgICAgICAgMHgyMDI5CisjZGVmaW5lIFdHTF9TV0FQX1VOREVGSU5FRF9BUkIgICAgICAgICAweDIwMkEKKyNkZWZpbmUgV0dMX1RZUEVfUkdCQV9BUkIgICAgICAgICAgICAgIDB4MjAyQgorI2RlZmluZSBXR0xfVFlQRV9DT0xPUklOREVYX0FSQiAgICAgICAgMHgyMDJDCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX21ha2VfY3VycmVudF9yZWFkCisjZGVmaW5lIEVSUk9SX0lOVkFMSURfUElYRUxfVFlQRV9BUkIgICAweDIwNDMKKyNkZWZpbmUgRVJST1JfSU5DT01QQVRJQkxFX0RFVklDRV9DT05URVhUU19BUkIgMHgyMDU0CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX3BidWZmZXIKKyNkZWZpbmUgV0dMX0RSQVdfVE9fUEJVRkZFUl9BUkIgICAgICAgIDB4MjAyRAorI2RlZmluZSBXR0xfTUFYX1BCVUZGRVJfUElYRUxTX0FSQiAgICAgMHgyMDJFCisjZGVmaW5lIFdHTF9NQVhfUEJVRkZFUl9XSURUSF9BUkIgICAgICAweDIwMkYKKyNkZWZpbmUgV0dMX01BWF9QQlVGRkVSX0hFSUdIVF9BUkIgICAgIDB4MjAzMAorI2RlZmluZSBXR0xfUEJVRkZFUl9MQVJHRVNUX0FSQiAgICAgICAgMHgyMDMzCisjZGVmaW5lIFdHTF9QQlVGRkVSX1dJRFRIX0FSQiAgICAgICAgICAweDIwMzQKKyNkZWZpbmUgV0dMX1BCVUZGRVJfSEVJR0hUX0FSQiAgICAgICAgIDB4MjAzNQorI2RlZmluZSBXR0xfUEJVRkZFUl9MT1NUX0FSQiAgICAgICAgICAgMHgyMDM2CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX3JlbmRlcl90ZXh0dXJlCisjZGVmaW5lIFdHTF9CSU5EX1RPX1RFWFRVUkVfUkdCX0FSQiAgICAweDIwNzAKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9SR0JBX0FSQiAgIDB4MjA3MQorI2RlZmluZSBXR0xfVEVYVFVSRV9GT1JNQVRfQVJCICAgICAgICAgMHgyMDcyCisjZGVmaW5lIFdHTF9URVhUVVJFX1RBUkdFVF9BUkIgICAgICAgICAweDIwNzMKKyNkZWZpbmUgV0dMX01JUE1BUF9URVhUVVJFX0FSQiAgICAgICAgIDB4MjA3NAorI2RlZmluZSBXR0xfVEVYVFVSRV9SR0JfQVJCICAgICAgICAgICAgMHgyMDc1CisjZGVmaW5lIFdHTF9URVhUVVJFX1JHQkFfQVJCICAgICAgICAgICAweDIwNzYKKyNkZWZpbmUgV0dMX05PX1RFWFRVUkVfQVJCICAgICAgICAgICAgIDB4MjA3NworI2RlZmluZSBXR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIgICAgICAgMHgyMDc4CisjZGVmaW5lIFdHTF9URVhUVVJFXzFEX0FSQiAgICAgICAgICAgICAweDIwNzkKKyNkZWZpbmUgV0dMX1RFWFRVUkVfMkRfQVJCICAgICAgICAgICAgIDB4MjA3QQorI2RlZmluZSBXR0xfTUlQTUFQX0xFVkVMX0FSQiAgICAgICAgICAgMHgyMDdCCisjZGVmaW5lIFdHTF9DVUJFX01BUF9GQUNFX0FSQiAgICAgICAgICAweDIwN0MKKyNkZWZpbmUgV0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9BUkIgMHgyMDdECisjZGVmaW5lIFdHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfQVJCIDB4MjA3RQorI2RlZmluZSBXR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0FSQiAweDIwN0YKKyNkZWZpbmUgV0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9BUkIgMHgyMDgwCisjZGVmaW5lIFdHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfQVJCIDB4MjA4MQorI2RlZmluZSBXR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0FSQiAweDIwODIKKyNkZWZpbmUgV0dMX0ZST05UX0xFRlRfQVJCICAgICAgICAgICAgIDB4MjA4MworI2RlZmluZSBXR0xfRlJPTlRfUklHSFRfQVJCICAgICAgICAgICAgMHgyMDg0CisjZGVmaW5lIFdHTF9CQUNLX0xFRlRfQVJCICAgICAgICAgICAgICAweDIwODUKKyNkZWZpbmUgV0dMX0JBQ0tfUklHSFRfQVJCICAgICAgICAgICAgIDB4MjA4NgorI2RlZmluZSBXR0xfQVVYMF9BUkIgICAgICAgICAgICAgICAgICAgMHgyMDg3CisjZGVmaW5lIFdHTF9BVVgxX0FSQiAgICAgICAgICAgICAgICAgICAweDIwODgKKyNkZWZpbmUgV0dMX0FVWDJfQVJCICAgICAgICAgICAgICAgICAgIDB4MjA4OQorI2RlZmluZSBXR0xfQVVYM19BUkIgICAgICAgICAgICAgICAgICAgMHgyMDhBCisjZGVmaW5lIFdHTF9BVVg0X0FSQiAgICAgICAgICAgICAgICAgICAweDIwOEIKKyNkZWZpbmUgV0dMX0FVWDVfQVJCICAgICAgICAgICAgICAgICAgIDB4MjA4QworI2RlZmluZSBXR0xfQVVYNl9BUkIgICAgICAgICAgICAgICAgICAgMHgyMDhECisjZGVmaW5lIFdHTF9BVVg3X0FSQiAgICAgICAgICAgICAgICAgICAweDIwOEUKKyNkZWZpbmUgV0dMX0FVWDhfQVJCICAgICAgICAgICAgICAgICAgIDB4MjA4RgorI2RlZmluZSBXR0xfQVVYOV9BUkIgICAgICAgICAgICAgICAgICAgMHgyMDkwCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX3BpeGVsX2Zvcm1hdF9mbG9hdAorI2RlZmluZSBXR0xfVFlQRV9SR0JBX0ZMT0FUX0FSQiAgICAgICAgMHgyMUEwCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgV0dMX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9BUkIgMHgyMEE5CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2NyZWF0ZV9jb250ZXh0CisjZGVmaW5lIFdHTF9DT05URVhUX0RFQlVHX0JJVF9BUkIgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdHTF9DT05URVhUX0ZPUldBUkRfQ09NUEFUSUJMRV9CSVRfQVJCIDB4MDAwMDAwMDIKKyNkZWZpbmUgV0dMX0NPTlRFWFRfTUFKT1JfVkVSU0lPTl9BUkIgIDB4MjA5MQorI2RlZmluZSBXR0xfQ09OVEVYVF9NSU5PUl9WRVJTSU9OX0FSQiAgMHgyMDkyCisjZGVmaW5lIFdHTF9DT05URVhUX0xBWUVSX1BMQU5FX0FSQiAgICAweDIwOTMKKyNkZWZpbmUgV0dMX0NPTlRFWFRfRkxBR1NfQVJCICAgICAgICAgIDB4MjA5NAorI2RlZmluZSBFUlJPUl9JTlZBTElEX1ZFUlNJT05fQVJCICAgICAgMHgyMDk1CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2NyZWF0ZV9jb250ZXh0X3Byb2ZpbGUKKyNkZWZpbmUgV0dMX0NPTlRFWFRfUFJPRklMRV9NQVNLX0FSQiAgIDB4OTEyNgorI2RlZmluZSBXR0xfQ09OVEVYVF9DT1JFX1BST0ZJTEVfQklUX0FSQiAweDAwMDAwMDAxCisjZGVmaW5lIFdHTF9DT05URVhUX0NPTVBBVElCSUxJVFlfUFJPRklMRV9CSVRfQVJCIDB4MDAwMDAwMDIKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9QUk9GSUxFX0FSQiAgICAgIDB4MjA5NgorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FSQl9jcmVhdGVfY29udGV4dF9yb2J1c3RuZXNzCisjZGVmaW5lIFdHTF9DT05URVhUX1JPQlVTVF9BQ0NFU1NfQklUX0FSQiAweDAwMDAwMDA0CisjZGVmaW5lIFdHTF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfQVJCICAweDgyNTIKKyNkZWZpbmUgV0dMX0NPTlRFWFRfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0FSQiAweDgyNTYKKyNkZWZpbmUgV0dMX05PX1JFU0VUX05PVElGSUNBVElPTl9BUkIgIDB4ODI2MQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9tYWtlX2N1cnJlbnRfcmVhZAorI2RlZmluZSBFUlJPUl9JTlZBTElEX1BJWEVMX1RZUEVfRVhUICAgMHgyMDQzCisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX3BpeGVsX2Zvcm1hdAorI2RlZmluZSBXR0xfTlVNQkVSX1BJWEVMX0ZPUk1BVFNfRVhUICAgMHgyMDAwCisjZGVmaW5lIFdHTF9EUkFXX1RPX1dJTkRPV19FWFQgICAgICAgICAweDIwMDEKKyNkZWZpbmUgV0dMX0RSQVdfVE9fQklUTUFQX0VYVCAgICAgICAgIDB4MjAwMgorI2RlZmluZSBXR0xfQUNDRUxFUkFUSU9OX0VYVCAgICAgICAgICAgMHgyMDAzCisjZGVmaW5lIFdHTF9ORUVEX1BBTEVUVEVfRVhUICAgICAgICAgICAweDIwMDQKKyNkZWZpbmUgV0dMX05FRURfU1lTVEVNX1BBTEVUVEVfRVhUICAgIDB4MjAwNQorI2RlZmluZSBXR0xfU1dBUF9MQVlFUl9CVUZGRVJTX0VYVCAgICAgMHgyMDA2CisjZGVmaW5lIFdHTF9TV0FQX01FVEhPRF9FWFQgICAgICAgICAgICAweDIwMDcKKyNkZWZpbmUgV0dMX05VTUJFUl9PVkVSTEFZU19FWFQgICAgICAgIDB4MjAwOAorI2RlZmluZSBXR0xfTlVNQkVSX1VOREVSTEFZU19FWFQgICAgICAgMHgyMDA5CisjZGVmaW5lIFdHTF9UUkFOU1BBUkVOVF9FWFQgICAgICAgICAgICAweDIwMEEKKyNkZWZpbmUgV0dMX1RSQU5TUEFSRU5UX1ZBTFVFX0VYVCAgICAgIDB4MjAwQgorI2RlZmluZSBXR0xfU0hBUkVfREVQVEhfRVhUICAgICAgICAgICAgMHgyMDBDCisjZGVmaW5lIFdHTF9TSEFSRV9TVEVOQ0lMX0VYVCAgICAgICAgICAweDIwMEQKKyNkZWZpbmUgV0dMX1NIQVJFX0FDQ1VNX0VYVCAgICAgICAgICAgIDB4MjAwRQorI2RlZmluZSBXR0xfU1VQUE9SVF9HRElfRVhUICAgICAgICAgICAgMHgyMDBGCisjZGVmaW5lIFdHTF9TVVBQT1JUX09QRU5HTF9FWFQgICAgICAgICAweDIwMTAKKyNkZWZpbmUgV0dMX0RPVUJMRV9CVUZGRVJfRVhUICAgICAgICAgIDB4MjAxMQorI2RlZmluZSBXR0xfU1RFUkVPX0VYVCAgICAgICAgICAgICAgICAgMHgyMDEyCisjZGVmaW5lIFdHTF9QSVhFTF9UWVBFX0VYVCAgICAgICAgICAgICAweDIwMTMKKyNkZWZpbmUgV0dMX0NPTE9SX0JJVFNfRVhUICAgICAgICAgICAgIDB4MjAxNAorI2RlZmluZSBXR0xfUkVEX0JJVFNfRVhUICAgICAgICAgICAgICAgMHgyMDE1CisjZGVmaW5lIFdHTF9SRURfU0hJRlRfRVhUICAgICAgICAgICAgICAweDIwMTYKKyNkZWZpbmUgV0dMX0dSRUVOX0JJVFNfRVhUICAgICAgICAgICAgIDB4MjAxNworI2RlZmluZSBXR0xfR1JFRU5fU0hJRlRfRVhUICAgICAgICAgICAgMHgyMDE4CisjZGVmaW5lIFdHTF9CTFVFX0JJVFNfRVhUICAgICAgICAgICAgICAweDIwMTkKKyNkZWZpbmUgV0dMX0JMVUVfU0hJRlRfRVhUICAgICAgICAgICAgIDB4MjAxQQorI2RlZmluZSBXR0xfQUxQSEFfQklUU19FWFQgICAgICAgICAgICAgMHgyMDFCCisjZGVmaW5lIFdHTF9BTFBIQV9TSElGVF9FWFQgICAgICAgICAgICAweDIwMUMKKyNkZWZpbmUgV0dMX0FDQ1VNX0JJVFNfRVhUICAgICAgICAgICAgIDB4MjAxRAorI2RlZmluZSBXR0xfQUNDVU1fUkVEX0JJVFNfRVhUICAgICAgICAgMHgyMDFFCisjZGVmaW5lIFdHTF9BQ0NVTV9HUkVFTl9CSVRTX0VYVCAgICAgICAweDIwMUYKKyNkZWZpbmUgV0dMX0FDQ1VNX0JMVUVfQklUU19FWFQgICAgICAgIDB4MjAyMAorI2RlZmluZSBXR0xfQUNDVU1fQUxQSEFfQklUU19FWFQgICAgICAgMHgyMDIxCisjZGVmaW5lIFdHTF9ERVBUSF9CSVRTX0VYVCAgICAgICAgICAgICAweDIwMjIKKyNkZWZpbmUgV0dMX1NURU5DSUxfQklUU19FWFQgICAgICAgICAgIDB4MjAyMworI2RlZmluZSBXR0xfQVVYX0JVRkZFUlNfRVhUICAgICAgICAgICAgMHgyMDI0CisjZGVmaW5lIFdHTF9OT19BQ0NFTEVSQVRJT05fRVhUICAgICAgICAweDIwMjUKKyNkZWZpbmUgV0dMX0dFTkVSSUNfQUNDRUxFUkFUSU9OX0VYVCAgIDB4MjAyNgorI2RlZmluZSBXR0xfRlVMTF9BQ0NFTEVSQVRJT05fRVhUICAgICAgMHgyMDI3CisjZGVmaW5lIFdHTF9TV0FQX0VYQ0hBTkdFX0VYVCAgICAgICAgICAweDIwMjgKKyNkZWZpbmUgV0dMX1NXQVBfQ09QWV9FWFQgICAgICAgICAgICAgIDB4MjAyOQorI2RlZmluZSBXR0xfU1dBUF9VTkRFRklORURfRVhUICAgICAgICAgMHgyMDJBCisjZGVmaW5lIFdHTF9UWVBFX1JHQkFfRVhUICAgICAgICAgICAgICAweDIwMkIKKyNkZWZpbmUgV0dMX1RZUEVfQ09MT1JJTkRFWF9FWFQgICAgICAgIDB4MjAyQworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9wYnVmZmVyCisjZGVmaW5lIFdHTF9EUkFXX1RPX1BCVUZGRVJfRVhUICAgICAgICAweDIwMkQKKyNkZWZpbmUgV0dMX01BWF9QQlVGRkVSX1BJWEVMU19FWFQgICAgIDB4MjAyRQorI2RlZmluZSBXR0xfTUFYX1BCVUZGRVJfV0lEVEhfRVhUICAgICAgMHgyMDJGCisjZGVmaW5lIFdHTF9NQVhfUEJVRkZFUl9IRUlHSFRfRVhUICAgICAweDIwMzAKKyNkZWZpbmUgV0dMX09QVElNQUxfUEJVRkZFUl9XSURUSF9FWFQgIDB4MjAzMQorI2RlZmluZSBXR0xfT1BUSU1BTF9QQlVGRkVSX0hFSUdIVF9FWFQgMHgyMDMyCisjZGVmaW5lIFdHTF9QQlVGRkVSX0xBUkdFU1RfRVhUICAgICAgICAweDIwMzMKKyNkZWZpbmUgV0dMX1BCVUZGRVJfV0lEVEhfRVhUICAgICAgICAgIDB4MjAzNAorI2RlZmluZSBXR0xfUEJVRkZFUl9IRUlHSFRfRVhUICAgICAgICAgMHgyMDM1CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX2RlcHRoX2Zsb2F0CisjZGVmaW5lIFdHTF9ERVBUSF9GTE9BVF9FWFQgICAgICAgICAgICAweDIwNDAKKyNlbmRpZgorCisjaWZuZGVmIFdHTF8zREZYX211bHRpc2FtcGxlCisjZGVmaW5lIFdHTF9TQU1QTEVfQlVGRkVSU18zREZYICAgICAgICAweDIwNjAKKyNkZWZpbmUgV0dMX1NBTVBMRVNfM0RGWCAgICAgICAgICAgICAgIDB4MjA2MQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBXR0xfU0FNUExFX0JVRkZFUlNfRVhUICAgICAgICAgMHgyMDQxCisjZGVmaW5lIFdHTF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAweDIwNDIKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9JM0RfZGlnaXRhbF92aWRlb19jb250cm9sCisjZGVmaW5lIFdHTF9ESUdJVEFMX1ZJREVPX0NVUlNPUl9BTFBIQV9GUkFNRUJVRkZFUl9JM0QgMHgyMDUwCisjZGVmaW5lIFdHTF9ESUdJVEFMX1ZJREVPX0NVUlNPUl9BTFBIQV9WQUxVRV9JM0QgMHgyMDUxCisjZGVmaW5lIFdHTF9ESUdJVEFMX1ZJREVPX0NVUlNPUl9JTkNMVURFRF9JM0QgMHgyMDUyCisjZGVmaW5lIFdHTF9ESUdJVEFMX1ZJREVPX0dBTU1BX0NPUlJFQ1RFRF9JM0QgMHgyMDUzCisjZW5kaWYKKworI2lmbmRlZiBXR0xfSTNEX2dhbW1hCisjZGVmaW5lIFdHTF9HQU1NQV9UQUJMRV9TSVpFX0kzRCAgICAgICAweDIwNEUKKyNkZWZpbmUgV0dMX0dBTU1BX0VYQ0xVREVfREVTS1RPUF9JM0QgIDB4MjA0RgorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0kzRF9nZW5sb2NrCisjZGVmaW5lIFdHTF9HRU5MT0NLX1NPVVJDRV9NVUxUSVZJRVdfSTNEIDB4MjA0NAorI2RlZmluZSBXR0xfR0VOTE9DS19TT1VSQ0VfRVhURU5BTF9TWU5DX0kzRCAweDIwNDUKKyNkZWZpbmUgV0dMX0dFTkxPQ0tfU09VUkNFX0VYVEVOQUxfRklFTERfSTNEIDB4MjA0NgorI2RlZmluZSBXR0xfR0VOTE9DS19TT1VSQ0VfRVhURU5BTF9UVExfSTNEIDB4MjA0NworI2RlZmluZSBXR0xfR0VOTE9DS19TT1VSQ0VfRElHSVRBTF9TWU5DX0kzRCAweDIwNDgKKyNkZWZpbmUgV0dMX0dFTkxPQ0tfU09VUkNFX0RJR0lUQUxfRklFTERfSTNEIDB4MjA0OQorI2RlZmluZSBXR0xfR0VOTE9DS19TT1VSQ0VfRURHRV9GQUxMSU5HX0kzRCAweDIwNEEKKyNkZWZpbmUgV0dMX0dFTkxPQ0tfU09VUkNFX0VER0VfUklTSU5HX0kzRCAweDIwNEIKKyNkZWZpbmUgV0dMX0dFTkxPQ0tfU09VUkNFX0VER0VfQk9USF9JM0QgMHgyMDRDCisjZW5kaWYKKworI2lmbmRlZiBXR0xfSTNEX2ltYWdlX2J1ZmZlcgorI2RlZmluZSBXR0xfSU1BR0VfQlVGRkVSX01JTl9BQ0NFU1NfSTNEIDB4MDAwMDAwMDEKKyNkZWZpbmUgV0dMX0lNQUdFX0JVRkZFUl9MT0NLX0kzRCAgICAgIDB4MDAwMDAwMDIKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9JM0Rfc3dhcF9mcmFtZV9sb2NrCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfcmVuZGVyX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9ERVBUSF9OViAgIDB4MjBBMworI2RlZmluZSBXR0xfQklORF9UT19URVhUVVJFX1JFQ1RBTkdMRV9ERVBUSF9OViAweDIwQTQKKyNkZWZpbmUgV0dMX0RFUFRIX1RFWFRVUkVfRk9STUFUX05WICAgIDB4MjBBNQorI2RlZmluZSBXR0xfVEVYVFVSRV9ERVBUSF9DT01QT05FTlRfTlYgMHgyMEE2CisjZGVmaW5lIFdHTF9ERVBUSF9DT01QT05FTlRfTlYgICAgICAgICAweDIwQTcKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9OVl9yZW5kZXJfdGV4dHVyZV9yZWN0YW5nbGUKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9SRUNUQU5HTEVfUkdCX05WIDB4MjBBMAorI2RlZmluZSBXR0xfQklORF9UT19URVhUVVJFX1JFQ1RBTkdMRV9SR0JBX05WIDB4MjBBMQorI2RlZmluZSBXR0xfVEVYVFVSRV9SRUNUQU5HTEVfTlYgICAgICAgMHgyMEEyCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVRJX3BpeGVsX2Zvcm1hdF9mbG9hdAorI2RlZmluZSBXR0xfVFlQRV9SR0JBX0ZMT0FUX0FUSSAgICAgICAgMHgyMUEwCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfZmxvYXRfYnVmZmVyCisjZGVmaW5lIFdHTF9GTE9BVF9DT01QT05FTlRTX05WICAgICAgICAweDIwQjAKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9SRUNUQU5HTEVfRkxPQVRfUl9OViAweDIwQjEKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9SRUNUQU5HTEVfRkxPQVRfUkdfTlYgMHgyMEIyCisjZGVmaW5lIFdHTF9CSU5EX1RPX1RFWFRVUkVfUkVDVEFOR0xFX0ZMT0FUX1JHQl9OViAweDIwQjMKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVEVYVFVSRV9SRUNUQU5HTEVfRkxPQVRfUkdCQV9OViAweDIwQjQKKyNkZWZpbmUgV0dMX1RFWFRVUkVfRkxPQVRfUl9OViAgICAgICAgIDB4MjBCNQorI2RlZmluZSBXR0xfVEVYVFVSRV9GTE9BVF9SR19OViAgICAgICAgMHgyMEI2CisjZGVmaW5lIFdHTF9URVhUVVJFX0ZMT0FUX1JHQl9OViAgICAgICAweDIwQjcKKyNkZWZpbmUgV0dMX1RFWFRVUkVfRkxPQVRfUkdCQV9OViAgICAgIDB4MjBCOAorI2VuZGlmCisKKyNpZm5kZWYgV0dMXzNETF9zdGVyZW9fY29udHJvbAorI2RlZmluZSBXR0xfU1RFUkVPX0VNSVRURVJfRU5BQkxFXzNETCAgMHgyMDU1CisjZGVmaW5lIFdHTF9TVEVSRU9fRU1JVFRFUl9ESVNBQkxFXzNETCAweDIwNTYKKyNkZWZpbmUgV0dMX1NURVJFT19QT0xBUklUWV9OT1JNQUxfM0RMIDB4MjA1NworI2RlZmluZSBXR0xfU1RFUkVPX1BPTEFSSVRZX0lOVkVSVF8zREwgMHgyMDU4CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX3BpeGVsX2Zvcm1hdF9wYWNrZWRfZmxvYXQKKyNkZWZpbmUgV0dMX1RZUEVfUkdCQV9VTlNJR05FRF9GTE9BVF9FWFQgMHgyMEE4CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX2ZyYW1lYnVmZmVyX3NSR0IKKyNkZWZpbmUgV0dMX0ZSQU1FQlVGRkVSX1NSR0JfQ0FQQUJMRV9FWFQgMHgyMEE5CisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfcHJlc2VudF92aWRlbworI2RlZmluZSBXR0xfTlVNX1ZJREVPX1NMT1RTX05WICAgICAgICAgMHgyMEYwCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfdmlkZW9fb3V0CisjZGVmaW5lIFdHTF9CSU5EX1RPX1ZJREVPX1JHQl9OViAgICAgICAweDIwQzAKKyNkZWZpbmUgV0dMX0JJTkRfVE9fVklERU9fUkdCQV9OViAgICAgIDB4MjBDMQorI2RlZmluZSBXR0xfQklORF9UT19WSURFT19SR0JfQU5EX0RFUFRIX05WIDB4MjBDMgorI2RlZmluZSBXR0xfVklERU9fT1VUX0NPTE9SX05WICAgICAgICAgMHgyMEMzCisjZGVmaW5lIFdHTF9WSURFT19PVVRfQUxQSEFfTlYgICAgICAgICAweDIwQzQKKyNkZWZpbmUgV0dMX1ZJREVPX09VVF9ERVBUSF9OViAgICAgICAgIDB4MjBDNQorI2RlZmluZSBXR0xfVklERU9fT1VUX0NPTE9SX0FORF9BTFBIQV9OViAweDIwQzYKKyNkZWZpbmUgV0dMX1ZJREVPX09VVF9DT0xPUl9BTkRfREVQVEhfTlYgMHgyMEM3CisjZGVmaW5lIFdHTF9WSURFT19PVVRfRlJBTUUgICAgICAgICAgICAweDIwQzgKKyNkZWZpbmUgV0dMX1ZJREVPX09VVF9GSUVMRF8xICAgICAgICAgIDB4MjBDOQorI2RlZmluZSBXR0xfVklERU9fT1VUX0ZJRUxEXzIgICAgICAgICAgMHgyMENBCisjZGVmaW5lIFdHTF9WSURFT19PVVRfU1RBQ0tFRF9GSUVMRFNfMV8yIDB4MjBDQgorI2RlZmluZSBXR0xfVklERU9fT1VUX1NUQUNLRURfRklFTERTXzJfMSAweDIwQ0MKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9OVl9zd2FwX2dyb3VwCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfZ3B1X2FmZmluaXR5CisjZGVmaW5lIFdHTF9FUlJPUl9JTkNPTVBBVElCTEVfQUZGSU5JVFlfTUFTS1NfTlYgMHgyMEQwCisjZGVmaW5lIFdHTF9FUlJPUl9NSVNTSU5HX0FGRklOSVRZX01BU0tfTlYgMHgyMEQxCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQU1EX2dwdV9hc3NvY2lhdGlvbgorI2RlZmluZSBXR0xfR1BVX1ZFTkRPUl9BTUQgICAgICAgICAgICAgMHgxRjAwCisjZGVmaW5lIFdHTF9HUFVfUkVOREVSRVJfU1RSSU5HX0FNRCAgICAweDFGMDEKKyNkZWZpbmUgV0dMX0dQVV9PUEVOR0xfVkVSU0lPTl9TVFJJTkdfQU1EIDB4MUYwMgorI2RlZmluZSBXR0xfR1BVX0ZBU1RFU1RfVEFSR0VUX0dQVVNfQU1EIDB4MjFBMgorI2RlZmluZSBXR0xfR1BVX1JBTV9BTUQgICAgICAgICAgICAgICAgMHgyMUEzCisjZGVmaW5lIFdHTF9HUFVfQ0xPQ0tfQU1EICAgICAgICAgICAgICAweDIxQTQKKyNkZWZpbmUgV0dMX0dQVV9OVU1fUElQRVNfQU1EICAgICAgICAgIDB4MjFBNQorI2RlZmluZSBXR0xfR1BVX05VTV9TSU1EX0FNRCAgICAgICAgICAgMHgyMUE2CisjZGVmaW5lIFdHTF9HUFVfTlVNX1JCX0FNRCAgICAgICAgICAgICAweDIxQTcKKyNkZWZpbmUgV0dMX0dQVV9OVU1fU1BJX0FNRCAgICAgICAgICAgIDB4MjFBOAorI2VuZGlmCisKKyNpZm5kZWYgV0dMX05WX3ZpZGVvX2NhcHR1cmUKKyNkZWZpbmUgV0dMX1VOSVFVRV9JRF9OViAgICAgICAgICAgICAgIDB4MjBDRQorI2RlZmluZSBXR0xfTlVNX1ZJREVPX0NBUFRVUkVfU0xPVFNfTlYgMHgyMENGCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfY29weV9pbWFnZQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX05WX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIFdHTF9DT1ZFUkFHRV9TQU1QTEVTX05WICAgICAgICAweDIwNDIKKyNkZWZpbmUgV0dMX0NPTE9SX1NBTVBMRVNfTlYgICAgICAgICAgIDB4MjBCOQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9jcmVhdGVfY29udGV4dF9lczJfcHJvZmlsZQorI2RlZmluZSBXR0xfQ09OVEVYVF9FUzJfUFJPRklMRV9CSVRfRVhUIDB4MDAwMDAwMDQKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFdHTF9BUkJfcGJ1ZmZlcgorREVDTEFSRV9IQU5ETEUoSFBCVUZGRVJBUkIpOworI2VuZGlmCisjaWZuZGVmIFdHTF9FWFRfcGJ1ZmZlcgorREVDTEFSRV9IQU5ETEUoSFBCVUZGRVJFWFQpOworI2VuZGlmCisjaWZuZGVmIFdHTF9OVl9wcmVzZW50X3ZpZGVvCitERUNMQVJFX0hBTkRMRShIVklERU9PVVRQVVRERVZJQ0VOVik7CisjZW5kaWYKKyNpZm5kZWYgV0dMX05WX3ZpZGVvX291dHB1dAorREVDTEFSRV9IQU5ETEUoSFBWSURFT0RFVik7CisjZW5kaWYKKyNpZm5kZWYgV0dMX05WX2dwdV9hZmZpbml0eQorREVDTEFSRV9IQU5ETEUoSFBHUFVOVik7CitERUNMQVJFX0hBTkRMRShIR1BVTlYpOworCit0eXBlZGVmIHN0cnVjdCBfR1BVX0RFVklDRSB7CisgICAgRFdPUkQgIGNiOworICAgIENIQVIgICBEZXZpY2VOYW1lWzMyXTsKKyAgICBDSEFSICAgRGV2aWNlU3RyaW5nWzEyOF07CisgICAgRFdPUkQgIEZsYWdzOworICAgIFJFQ1QgICByY1ZpcnR1YWxTY3JlZW47Cit9IEdQVV9ERVZJQ0UsICpQR1BVX0RFVklDRTsKKyNlbmRpZgorI2lmbmRlZiBXR0xfTlZfdmlkZW9fY2FwdHVyZQorREVDTEFSRV9IQU5ETEUoSFZJREVPSU5QVVRERVZJQ0VOVik7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2J1ZmZlcl9yZWdpb24KKyNkZWZpbmUgV0dMX0FSQl9idWZmZXJfcmVnaW9uIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBIQU5ETEUgV0lOQVBJIHdnbENyZWF0ZUJ1ZmZlclJlZ2lvbkFSQiAoSERDIGhEQywgaW50IGlMYXllclBsYW5lLCBVSU5UIHVUeXBlKTsKK2V4dGVybiBWT0lEIFdJTkFQSSB3Z2xEZWxldGVCdWZmZXJSZWdpb25BUkIgKEhBTkRMRSBoUmVnaW9uKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xTYXZlQnVmZmVyUmVnaW9uQVJCIChIQU5ETEUgaFJlZ2lvbiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFJlc3RvcmVCdWZmZXJSZWdpb25BUkIgKEhBTkRMRSBoUmVnaW9uLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhTcmMsIGludCB5U3JjKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgSEFORExFIChXSU5BUEkgKiBQRk5XR0xDUkVBVEVCVUZGRVJSRUdJT05BUkJQUk9DKSAoSERDIGhEQywgaW50IGlMYXllclBsYW5lLCBVSU5UIHVUeXBlKTsKK3R5cGVkZWYgVk9JRCAoV0lOQVBJICogUEZOV0dMREVMRVRFQlVGRkVSUkVHSU9OQVJCUFJPQykgKEhBTkRMRSBoUmVnaW9uKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMU0FWRUJVRkZFUlJFR0lPTkFSQlBST0MpIChIQU5ETEUgaFJlZ2lvbiwgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xSRVNUT1JFQlVGRkVSUkVHSU9OQVJCUFJPQykgKEhBTkRMRSBoUmVnaW9uLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhTcmMsIGludCB5U3JjKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9BUkJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgV0dMX0FSQl9tdWx0aXNhbXBsZSAxCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2V4dGVuc2lvbnNfc3RyaW5nCisjZGVmaW5lIFdHTF9BUkJfZXh0ZW5zaW9uc19zdHJpbmcgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGNvbnN0IGNoYXIgKiBXSU5BUEkgd2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQiAoSERDIGhkYyk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKiAoV0lOQVBJICogUEZOV0dMR0VURVhURU5TSU9OU1NUUklOR0FSQlBST0MpIChIREMgaGRjKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9BUkJfcGl4ZWxfZm9ybWF0CisjZGVmaW5lIFdHTF9BUkJfcGl4ZWxfZm9ybWF0IDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaUxheWVyUGxhbmUsIFVJTlQgbkF0dHJpYnV0ZXMsIGNvbnN0IGludCAqcGlBdHRyaWJ1dGVzLCBpbnQgKnBpVmFsdWVzKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYmZ2QVJCIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaUxheWVyUGxhbmUsIFVJTlQgbkF0dHJpYnV0ZXMsIGNvbnN0IGludCAqcGlBdHRyaWJ1dGVzLCBGTE9BVCAqcGZWYWx1ZXMpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbENob29zZVBpeGVsRm9ybWF0QVJCIChIREMgaGRjLCBjb25zdCBpbnQgKnBpQXR0cmliSUxpc3QsIGNvbnN0IEZMT0FUICpwZkF0dHJpYkZMaXN0LCBVSU5UIG5NYXhGb3JtYXRzLCBpbnQgKnBpRm9ybWF0cywgVUlOVCAqbk51bUZvcm1hdHMpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRQSVhFTEZPUk1BVEFUVFJJQklWQVJCUFJPQykgKEhEQyBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgVUlOVCBuQXR0cmlidXRlcywgY29uc3QgaW50ICpwaUF0dHJpYnV0ZXMsIGludCAqcGlWYWx1ZXMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRQSVhFTEZPUk1BVEFUVFJJQkZWQVJCUFJPQykgKEhEQyBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgVUlOVCBuQXR0cmlidXRlcywgY29uc3QgaW50ICpwaUF0dHJpYnV0ZXMsIEZMT0FUICpwZlZhbHVlcyk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTENIT09TRVBJWEVMRk9STUFUQVJCUFJPQykgKEhEQyBoZGMsIGNvbnN0IGludCAqcGlBdHRyaWJJTGlzdCwgY29uc3QgRkxPQVQgKnBmQXR0cmliRkxpc3QsIFVJTlQgbk1heEZvcm1hdHMsIGludCAqcGlGb3JtYXRzLCBVSU5UICpuTnVtRm9ybWF0cyk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX21ha2VfY3VycmVudF9yZWFkCisjZGVmaW5lIFdHTF9BUkJfbWFrZV9jdXJyZW50X3JlYWQgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbE1ha2VDb250ZXh0Q3VycmVudEFSQiAoSERDIGhEcmF3REMsIEhEQyBoUmVhZERDLCBIR0xSQyBoZ2xyYyk7CitleHRlcm4gSERDIFdJTkFQSSB3Z2xHZXRDdXJyZW50UmVhZERDQVJCICh2b2lkKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMTUFLRUNPTlRFWFRDVVJSRU5UQVJCUFJPQykgKEhEQyBoRHJhd0RDLCBIREMgaFJlYWREQywgSEdMUkMgaGdscmMpOwordHlwZWRlZiBIREMgKFdJTkFQSSAqIFBGTldHTEdFVENVUlJFTlRSRUFERENBUkJQUk9DKSAodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX3BidWZmZXIKKyNkZWZpbmUgV0dMX0FSQl9wYnVmZmVyIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBIUEJVRkZFUkFSQiBXSU5BUEkgd2dsQ3JlYXRlUGJ1ZmZlckFSQiAoSERDIGhEQywgaW50IGlQaXhlbEZvcm1hdCwgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIGNvbnN0IGludCAqcGlBdHRyaWJMaXN0KTsKK2V4dGVybiBIREMgV0lOQVBJIHdnbEdldFBidWZmZXJEQ0FSQiAoSFBCVUZGRVJBUkIgaFBidWZmZXIpOworZXh0ZXJuIGludCBXSU5BUEkgd2dsUmVsZWFzZVBidWZmZXJEQ0FSQiAoSFBCVUZGRVJBUkIgaFBidWZmZXIsIEhEQyBoREMpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbERlc3Ryb3lQYnVmZmVyQVJCIChIUEJVRkZFUkFSQiBoUGJ1ZmZlcik7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUXVlcnlQYnVmZmVyQVJCIChIUEJVRkZFUkFSQiBoUGJ1ZmZlciwgaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEhQQlVGRkVSQVJCIChXSU5BUEkgKiBQRk5XR0xDUkVBVEVQQlVGRkVSQVJCUFJPQykgKEhEQyBoREMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpV2lkdGgsIGludCBpSGVpZ2h0LCBjb25zdCBpbnQgKnBpQXR0cmliTGlzdCk7Cit0eXBlZGVmIEhEQyAoV0lOQVBJICogUEZOV0dMR0VUUEJVRkZFUkRDQVJCUFJPQykgKEhQQlVGRkVSQVJCIGhQYnVmZmVyKTsKK3R5cGVkZWYgaW50IChXSU5BUEkgKiBQRk5XR0xSRUxFQVNFUEJVRkZFUkRDQVJCUFJPQykgKEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBIREMgaERDKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMREVTVFJPWVBCVUZGRVJBUkJQUk9DKSAoSFBCVUZGRVJBUkIgaFBidWZmZXIpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xRVUVSWVBCVUZGRVJBUkJQUk9DKSAoSFBCVUZGRVJBUkIgaFBidWZmZXIsIGludCBpQXR0cmlidXRlLCBpbnQgKnBpVmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FSQl9yZW5kZXJfdGV4dHVyZQorI2RlZmluZSBXR0xfQVJCX3JlbmRlcl90ZXh0dXJlIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xCaW5kVGV4SW1hZ2VBUkIgKEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBpbnQgaUJ1ZmZlcik7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUmVsZWFzZVRleEltYWdlQVJCIChIUEJVRkZFUkFSQiBoUGJ1ZmZlciwgaW50IGlCdWZmZXIpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFNldFBidWZmZXJBdHRyaWJBUkIgKEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBjb25zdCBpbnQgKnBpQXR0cmliTGlzdCk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEJJTkRURVhJTUFHRUFSQlBST0MpIChIUEJVRkZFUkFSQiBoUGJ1ZmZlciwgaW50IGlCdWZmZXIpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xSRUxFQVNFVEVYSU1BR0VBUkJQUk9DKSAoSFBCVUZGRVJBUkIgaFBidWZmZXIsIGludCBpQnVmZmVyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMU0VUUEJVRkZFUkFUVFJJQkFSQlBST0MpIChIUEJVRkZFUkFSQiBoUGJ1ZmZlciwgY29uc3QgaW50ICpwaUF0dHJpYkxpc3QpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FSQl9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgV0dMX0FSQl9waXhlbF9mb3JtYXRfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FSQl9mcmFtZWJ1ZmZlcl9zUkdCCisjZGVmaW5lIFdHTF9BUkJfZnJhbWVidWZmZXJfc1JHQiAxCisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2NyZWF0ZV9jb250ZXh0CisjZGVmaW5lIFdHTF9BUkJfY3JlYXRlX2NvbnRleHQgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEhHTFJDIFdJTkFQSSB3Z2xDcmVhdGVDb250ZXh0QXR0cmlic0FSQiAoSERDIGhEQywgSEdMUkMgaFNoYXJlQ29udGV4dCwgY29uc3QgaW50ICphdHRyaWJMaXN0KTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgSEdMUkMgKFdJTkFQSSAqIFBGTldHTENSRUFURUNPTlRFWFRBVFRSSUJTQVJCUFJPQykgKEhEQyBoREMsIEhHTFJDIGhTaGFyZUNvbnRleHQsIGNvbnN0IGludCAqYXR0cmliTGlzdCk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQVJCX2NyZWF0ZV9jb250ZXh0X3Byb2ZpbGUKKyNkZWZpbmUgV0dMX0FSQl9jcmVhdGVfY29udGV4dF9wcm9maWxlIDEKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9BUkJfY3JlYXRlX2NvbnRleHRfcm9idXN0bmVzcworI2RlZmluZSBXR0xfQVJCX2NyZWF0ZV9jb250ZXh0X3JvYnVzdG5lc3MgMQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9kaXNwbGF5X2NvbG9yX3RhYmxlCisjZGVmaW5lIFdHTF9FWFRfZGlzcGxheV9jb2xvcl90YWJsZSAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gR0xib29sZWFuIFdJTkFQSSB3Z2xDcmVhdGVEaXNwbGF5Q29sb3JUYWJsZUVYVCAoR0x1c2hvcnQgaWQpOworZXh0ZXJuIEdMYm9vbGVhbiBXSU5BUEkgd2dsTG9hZERpc3BsYXlDb2xvclRhYmxlRVhUIChjb25zdCBHTHVzaG9ydCAqdGFibGUsIEdMdWludCBsZW5ndGgpOworZXh0ZXJuIEdMYm9vbGVhbiBXSU5BUEkgd2dsQmluZERpc3BsYXlDb2xvclRhYmxlRVhUIChHTHVzaG9ydCBpZCk7CitleHRlcm4gVk9JRCBXSU5BUEkgd2dsRGVzdHJveURpc3BsYXlDb2xvclRhYmxlRVhUIChHTHVzaG9ydCBpZCk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEdMYm9vbGVhbiAoV0lOQVBJICogUEZOV0dMQ1JFQVRFRElTUExBWUNPTE9SVEFCTEVFWFRQUk9DKSAoR0x1c2hvcnQgaWQpOwordHlwZWRlZiBHTGJvb2xlYW4gKFdJTkFQSSAqIFBGTldHTExPQURESVNQTEFZQ09MT1JUQUJMRUVYVFBST0MpIChjb25zdCBHTHVzaG9ydCAqdGFibGUsIEdMdWludCBsZW5ndGgpOwordHlwZWRlZiBHTGJvb2xlYW4gKFdJTkFQSSAqIFBGTldHTEJJTkRESVNQTEFZQ09MT1JUQUJMRUVYVFBST0MpIChHTHVzaG9ydCBpZCk7Cit0eXBlZGVmIFZPSUQgKFdJTkFQSSAqIFBGTldHTERFU1RST1lESVNQTEFZQ09MT1JUQUJMRUVYVFBST0MpIChHTHVzaG9ydCBpZCk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX2V4dGVuc2lvbnNfc3RyaW5nCisjZGVmaW5lIFdHTF9FWFRfZXh0ZW5zaW9uc19zdHJpbmcgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGNvbnN0IGNoYXIgKiBXSU5BUEkgd2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0VYVCAodm9pZCk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIGNvbnN0IGNoYXIgKiAoV0lOQVBJICogUEZOV0dMR0VURVhURU5TSU9OU1NUUklOR0VYVFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9FWFRfbWFrZV9jdXJyZW50X3JlYWQKKyNkZWZpbmUgV0dMX0VYVF9tYWtlX2N1cnJlbnRfcmVhZCAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQk9PTCBXSU5BUEkgd2dsTWFrZUNvbnRleHRDdXJyZW50RVhUIChIREMgaERyYXdEQywgSERDIGhSZWFkREMsIEhHTFJDIGhnbHJjKTsKK2V4dGVybiBIREMgV0lOQVBJIHdnbEdldEN1cnJlbnRSZWFkRENFWFQgKHZvaWQpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xNQUtFQ09OVEVYVENVUlJFTlRFWFRQUk9DKSAoSERDIGhEcmF3REMsIEhEQyBoUmVhZERDLCBIR0xSQyBoZ2xyYyk7Cit0eXBlZGVmIEhEQyAoV0lOQVBJICogUEZOV0dMR0VUQ1VSUkVOVFJFQUREQ0VYVFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9FWFRfcGJ1ZmZlcgorI2RlZmluZSBXR0xfRVhUX3BidWZmZXIgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEhQQlVGRkVSRVhUIFdJTkFQSSB3Z2xDcmVhdGVQYnVmZmVyRVhUIChIREMgaERDLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaVdpZHRoLCBpbnQgaUhlaWdodCwgY29uc3QgaW50ICpwaUF0dHJpYkxpc3QpOworZXh0ZXJuIEhEQyBXSU5BUEkgd2dsR2V0UGJ1ZmZlckRDRVhUIChIUEJVRkZFUkVYVCBoUGJ1ZmZlcik7CitleHRlcm4gaW50IFdJTkFQSSB3Z2xSZWxlYXNlUGJ1ZmZlckRDRVhUIChIUEJVRkZFUkVYVCBoUGJ1ZmZlciwgSERDIGhEQyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsRGVzdHJveVBidWZmZXJFWFQgKEhQQlVGRkVSRVhUIGhQYnVmZmVyKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xRdWVyeVBidWZmZXJFWFQgKEhQQlVGRkVSRVhUIGhQYnVmZmVyLCBpbnQgaUF0dHJpYnV0ZSwgaW50ICpwaVZhbHVlKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgSFBCVUZGRVJFWFQgKFdJTkFQSSAqIFBGTldHTENSRUFURVBCVUZGRVJFWFRQUk9DKSAoSERDIGhEQywgaW50IGlQaXhlbEZvcm1hdCwgaW50IGlXaWR0aCwgaW50IGlIZWlnaHQsIGNvbnN0IGludCAqcGlBdHRyaWJMaXN0KTsKK3R5cGVkZWYgSERDIChXSU5BUEkgKiBQRk5XR0xHRVRQQlVGRkVSRENFWFRQUk9DKSAoSFBCVUZGRVJFWFQgaFBidWZmZXIpOwordHlwZWRlZiBpbnQgKFdJTkFQSSAqIFBGTldHTFJFTEVBU0VQQlVGRkVSRENFWFRQUk9DKSAoSFBCVUZGRVJFWFQgaFBidWZmZXIsIEhEQyBoREMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xERVNUUk9ZUEJVRkZFUkVYVFBST0MpIChIUEJVRkZFUkVYVCBoUGJ1ZmZlcik7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFFVRVJZUEJVRkZFUkVYVFBST0MpIChIUEJVRkZFUkVYVCBoUGJ1ZmZlciwgaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX3BpeGVsX2Zvcm1hdAorI2RlZmluZSBXR0xfRVhUX3BpeGVsX2Zvcm1hdCAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkVYVCAoSERDIGhkYywgaW50IGlQaXhlbEZvcm1hdCwgaW50IGlMYXllclBsYW5lLCBVSU5UIG5BdHRyaWJ1dGVzLCBpbnQgKnBpQXR0cmlidXRlcywgaW50ICpwaVZhbHVlcyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJmdkVYVCAoSERDIGhkYywgaW50IGlQaXhlbEZvcm1hdCwgaW50IGlMYXllclBsYW5lLCBVSU5UIG5BdHRyaWJ1dGVzLCBpbnQgKnBpQXR0cmlidXRlcywgRkxPQVQgKnBmVmFsdWVzKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xDaG9vc2VQaXhlbEZvcm1hdEVYVCAoSERDIGhkYywgY29uc3QgaW50ICpwaUF0dHJpYklMaXN0LCBjb25zdCBGTE9BVCAqcGZBdHRyaWJGTGlzdCwgVUlOVCBuTWF4Rm9ybWF0cywgaW50ICpwaUZvcm1hdHMsIFVJTlQgKm5OdW1Gb3JtYXRzKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMR0VUUElYRUxGT1JNQVRBVFRSSUJJVkVYVFBST0MpIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaUxheWVyUGxhbmUsIFVJTlQgbkF0dHJpYnV0ZXMsIGludCAqcGlBdHRyaWJ1dGVzLCBpbnQgKnBpVmFsdWVzKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMR0VUUElYRUxGT1JNQVRBVFRSSUJGVkVYVFBST0MpIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaUxheWVyUGxhbmUsIFVJTlQgbkF0dHJpYnV0ZXMsIGludCAqcGlBdHRyaWJ1dGVzLCBGTE9BVCAqcGZWYWx1ZXMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xDSE9PU0VQSVhFTEZPUk1BVEVYVFBST0MpIChIREMgaGRjLCBjb25zdCBpbnQgKnBpQXR0cmliSUxpc3QsIGNvbnN0IEZMT0FUICpwZkF0dHJpYkZMaXN0LCBVSU5UIG5NYXhGb3JtYXRzLCBpbnQgKnBpRm9ybWF0cywgVUlOVCAqbk51bUZvcm1hdHMpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9zd2FwX2NvbnRyb2wKKyNkZWZpbmUgV0dMX0VYVF9zd2FwX2NvbnRyb2wgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFN3YXBJbnRlcnZhbEVYVCAoaW50IGludGVydmFsKTsKK2V4dGVybiBpbnQgV0lOQVBJIHdnbEdldFN3YXBJbnRlcnZhbEVYVCAodm9pZCk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFNXQVBJTlRFUlZBTEVYVFBST0MpIChpbnQgaW50ZXJ2YWwpOwordHlwZWRlZiBpbnQgKFdJTkFQSSAqIFBGTldHTEdFVFNXQVBJTlRFUlZBTEVYVFBST0MpICh2b2lkKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9FWFRfZGVwdGhfZmxvYXQKKyNkZWZpbmUgV0dMX0VYVF9kZXB0aF9mbG9hdCAxCisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfdmVydGV4X2FycmF5X3JhbmdlCisjZGVmaW5lIFdHTF9OVl92ZXJ0ZXhfYXJyYXlfcmFuZ2UgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIHZvaWQqIFdJTkFQSSB3Z2xBbGxvY2F0ZU1lbW9yeU5WIChHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5KTsKK2V4dGVybiB2b2lkIFdJTkFQSSB3Z2xGcmVlTWVtb3J5TlYgKHZvaWQgKnBvaW50ZXIpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkKiAoV0lOQVBJICogUEZOV0dMQUxMT0NBVEVNRU1PUllOVlBST0MpIChHTHNpemVpIHNpemUsIEdMZmxvYXQgcmVhZGZyZXEsIEdMZmxvYXQgd3JpdGVmcmVxLCBHTGZsb2F0IHByaW9yaXR5KTsKK3R5cGVkZWYgdm9pZCAoV0lOQVBJICogUEZOV0dMRlJFRU1FTU9SWU5WUFJPQykgKHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMXzNERlhfbXVsdGlzYW1wbGUKKyNkZWZpbmUgV0dMXzNERlhfbXVsdGlzYW1wbGUgMQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX0VYVF9tdWx0aXNhbXBsZQorI2RlZmluZSBXR0xfRVhUX211bHRpc2FtcGxlIDEKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9PTUxfc3luY19jb250cm9sCisjZGVmaW5lIFdHTF9PTUxfc3luY19jb250cm9sIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRTeW5jVmFsdWVzT01MIChIREMgaGRjLCBJTlQ2NCAqdXN0LCBJTlQ2NCAqbXNjLCBJTlQ2NCAqc2JjKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRNc2NSYXRlT01MIChIREMgaGRjLCBJTlQzMiAqbnVtZXJhdG9yLCBJTlQzMiAqZGVub21pbmF0b3IpOworZXh0ZXJuIElOVDY0IFdJTkFQSSB3Z2xTd2FwQnVmZmVyc01zY09NTCAoSERDIGhkYywgSU5UNjQgdGFyZ2V0X21zYywgSU5UNjQgZGl2aXNvciwgSU5UNjQgcmVtYWluZGVyKTsKK2V4dGVybiBJTlQ2NCBXSU5BUEkgd2dsU3dhcExheWVyQnVmZmVyc01zY09NTCAoSERDIGhkYywgaW50IGZ1UGxhbmVzLCBJTlQ2NCB0YXJnZXRfbXNjLCBJTlQ2NCBkaXZpc29yLCBJTlQ2NCByZW1haW5kZXIpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFdhaXRGb3JNc2NPTUwgKEhEQyBoZGMsIElOVDY0IHRhcmdldF9tc2MsIElOVDY0IGRpdmlzb3IsIElOVDY0IHJlbWFpbmRlciwgSU5UNjQgKnVzdCwgSU5UNjQgKm1zYywgSU5UNjQgKnNiYyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsV2FpdEZvclNiY09NTCAoSERDIGhkYywgSU5UNjQgdGFyZ2V0X3NiYywgSU5UNjQgKnVzdCwgSU5UNjQgKm1zYywgSU5UNjQgKnNiYyk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFVFNZTkNWQUxVRVNPTUxQUk9DKSAoSERDIGhkYywgSU5UNjQgKnVzdCwgSU5UNjQgKm1zYywgSU5UNjQgKnNiYyk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFVE1TQ1JBVEVPTUxQUk9DKSAoSERDIGhkYywgSU5UMzIgKm51bWVyYXRvciwgSU5UMzIgKmRlbm9taW5hdG9yKTsKK3R5cGVkZWYgSU5UNjQgKFdJTkFQSSAqIFBGTldHTFNXQVBCVUZGRVJTTVNDT01MUFJPQykgKEhEQyBoZGMsIElOVDY0IHRhcmdldF9tc2MsIElOVDY0IGRpdmlzb3IsIElOVDY0IHJlbWFpbmRlcik7Cit0eXBlZGVmIElOVDY0IChXSU5BUEkgKiBQRk5XR0xTV0FQTEFZRVJCVUZGRVJTTVNDT01MUFJPQykgKEhEQyBoZGMsIGludCBmdVBsYW5lcywgSU5UNjQgdGFyZ2V0X21zYywgSU5UNjQgZGl2aXNvciwgSU5UNjQgcmVtYWluZGVyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMV0FJVEZPUk1TQ09NTFBST0MpIChIREMgaGRjLCBJTlQ2NCB0YXJnZXRfbXNjLCBJTlQ2NCBkaXZpc29yLCBJTlQ2NCByZW1haW5kZXIsIElOVDY0ICp1c3QsIElOVDY0ICptc2MsIElOVDY0ICpzYmMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xXQUlURk9SU0JDT01MUFJPQykgKEhEQyBoZGMsIElOVDY0IHRhcmdldF9zYmMsIElOVDY0ICp1c3QsIElOVDY0ICptc2MsIElOVDY0ICpzYmMpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0kzRF9kaWdpdGFsX3ZpZGVvX2NvbnRyb2wKKyNkZWZpbmUgV0dMX0kzRF9kaWdpdGFsX3ZpZGVvX2NvbnRyb2wgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEdldERpZ2l0YWxWaWRlb1BhcmFtZXRlcnNJM0QgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBpbnQgKnBpVmFsdWUpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFNldERpZ2l0YWxWaWRlb1BhcmFtZXRlcnNJM0QgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBjb25zdCBpbnQgKnBpVmFsdWUpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRESUdJVEFMVklERU9QQVJBTUVURVJTSTNEUFJPQykgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBpbnQgKnBpVmFsdWUpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xTRVRESUdJVEFMVklERU9QQVJBTUVURVJTSTNEUFJPQykgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBjb25zdCBpbnQgKnBpVmFsdWUpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0kzRF9nYW1tYQorI2RlZmluZSBXR0xfSTNEX2dhbW1hIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRHYW1tYVRhYmxlUGFyYW1ldGVyc0kzRCAoSERDIGhEQywgaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsU2V0R2FtbWFUYWJsZVBhcmFtZXRlcnNJM0QgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBjb25zdCBpbnQgKnBpVmFsdWUpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEdldEdhbW1hVGFibGVJM0QgKEhEQyBoREMsIGludCBpRW50cmllcywgVVNIT1JUICpwdVJlZCwgVVNIT1JUICpwdUdyZWVuLCBVU0hPUlQgKnB1Qmx1ZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsU2V0R2FtbWFUYWJsZUkzRCAoSERDIGhEQywgaW50IGlFbnRyaWVzLCBjb25zdCBVU0hPUlQgKnB1UmVkLCBjb25zdCBVU0hPUlQgKnB1R3JlZW4sIGNvbnN0IFVTSE9SVCAqcHVCbHVlKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMR0VUR0FNTUFUQUJMRVBBUkFNRVRFUlNJM0RQUk9DKSAoSERDIGhEQywgaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFNFVEdBTU1BVEFCTEVQQVJBTUVURVJTSTNEUFJPQykgKEhEQyBoREMsIGludCBpQXR0cmlidXRlLCBjb25zdCBpbnQgKnBpVmFsdWUpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRHQU1NQVRBQkxFSTNEUFJPQykgKEhEQyBoREMsIGludCBpRW50cmllcywgVVNIT1JUICpwdVJlZCwgVVNIT1JUICpwdUdyZWVuLCBVU0hPUlQgKnB1Qmx1ZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFNFVEdBTU1BVEFCTEVJM0RQUk9DKSAoSERDIGhEQywgaW50IGlFbnRyaWVzLCBjb25zdCBVU0hPUlQgKnB1UmVkLCBjb25zdCBVU0hPUlQgKnB1R3JlZW4sIGNvbnN0IFVTSE9SVCAqcHVCbHVlKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9JM0RfZ2VubG9jaworI2RlZmluZSBXR0xfSTNEX2dlbmxvY2sgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEVuYWJsZUdlbmxvY2tJM0QgKEhEQyBoREMpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbERpc2FibGVHZW5sb2NrSTNEIChIREMgaERDKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xJc0VuYWJsZWRHZW5sb2NrSTNEIChIREMgaERDLCBCT09MICpwRmxhZyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2VubG9ja1NvdXJjZUkzRCAoSERDIGhEQywgVUlOVCB1U291cmNlKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRHZW5sb2NrU291cmNlSTNEIChIREMgaERDLCBVSU5UICp1U291cmNlKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZW5sb2NrU291cmNlRWRnZUkzRCAoSERDIGhEQywgVUlOVCB1RWRnZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0R2VubG9ja1NvdXJjZUVkZ2VJM0QgKEhEQyBoREMsIFVJTlQgKnVFZGdlKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZW5sb2NrU2FtcGxlUmF0ZUkzRCAoSERDIGhEQywgVUlOVCB1UmF0ZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0R2VubG9ja1NhbXBsZVJhdGVJM0QgKEhEQyBoREMsIFVJTlQgKnVSYXRlKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZW5sb2NrU291cmNlRGVsYXlJM0QgKEhEQyBoREMsIFVJTlQgdURlbGF5KTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xHZXRHZW5sb2NrU291cmNlRGVsYXlJM0QgKEhEQyBoREMsIFVJTlQgKnVEZWxheSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUXVlcnlHZW5sb2NrTWF4U291cmNlRGVsYXlJM0QgKEhEQyBoREMsIFVJTlQgKnVNYXhMaW5lRGVsYXksIFVJTlQgKnVNYXhQaXhlbERlbGF5KTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMRU5BQkxFR0VOTE9DS0kzRFBST0MpIChIREMgaERDKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMRElTQUJMRUdFTkxPQ0tJM0RQUk9DKSAoSERDIGhEQyk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTElTRU5BQkxFREdFTkxPQ0tJM0RQUk9DKSAoSERDIGhEQywgQk9PTCAqcEZsYWcpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRU5MT0NLU09VUkNFSTNEUFJPQykgKEhEQyBoREMsIFVJTlQgdVNvdXJjZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFVEdFTkxPQ0tTT1VSQ0VJM0RQUk9DKSAoSERDIGhEQywgVUlOVCAqdVNvdXJjZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFTkxPQ0tTT1VSQ0VFREdFSTNEUFJPQykgKEhEQyBoREMsIFVJTlQgdUVkZ2UpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRHRU5MT0NLU09VUkNFRURHRUkzRFBST0MpIChIREMgaERDLCBVSU5UICp1RWRnZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFTkxPQ0tTQU1QTEVSQVRFSTNEUFJPQykgKEhEQyBoREMsIFVJTlQgdVJhdGUpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xHRVRHRU5MT0NLU0FNUExFUkFURUkzRFBST0MpIChIREMgaERDLCBVSU5UICp1UmF0ZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFTkxPQ0tTT1VSQ0VERUxBWUkzRFBST0MpIChIREMgaERDLCBVSU5UIHVEZWxheSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFVEdFTkxPQ0tTT1VSQ0VERUxBWUkzRFBST0MpIChIREMgaERDLCBVSU5UICp1RGVsYXkpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xRVUVSWUdFTkxPQ0tNQVhTT1VSQ0VERUxBWUkzRFBST0MpIChIREMgaERDLCBVSU5UICp1TWF4TGluZURlbGF5LCBVSU5UICp1TWF4UGl4ZWxEZWxheSk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfSTNEX2ltYWdlX2J1ZmZlcgorI2RlZmluZSBXR0xfSTNEX2ltYWdlX2J1ZmZlciAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gTFBWT0lEIFdJTkFQSSB3Z2xDcmVhdGVJbWFnZUJ1ZmZlckkzRCAoSERDIGhEQywgRFdPUkQgZHdTaXplLCBVSU5UIHVGbGFncyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsRGVzdHJveUltYWdlQnVmZmVySTNEIChIREMgaERDLCBMUFZPSUQgcEFkZHJlc3MpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEFzc29jaWF0ZUltYWdlQnVmZmVyRXZlbnRzSTNEIChIREMgaERDLCBjb25zdCBIQU5ETEUgKnBFdmVudCwgY29uc3QgTFBWT0lEICpwQWRkcmVzcywgY29uc3QgRFdPUkQgKnBTaXplLCBVSU5UIGNvdW50KTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xSZWxlYXNlSW1hZ2VCdWZmZXJFdmVudHNJM0QgKEhEQyBoREMsIGNvbnN0IExQVk9JRCAqcEFkZHJlc3MsIFVJTlQgY291bnQpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBMUFZPSUQgKFdJTkFQSSAqIFBGTldHTENSRUFURUlNQUdFQlVGRkVSSTNEUFJPQykgKEhEQyBoREMsIERXT1JEIGR3U2l6ZSwgVUlOVCB1RmxhZ3MpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xERVNUUk9ZSU1BR0VCVUZGRVJJM0RQUk9DKSAoSERDIGhEQywgTFBWT0lEIHBBZGRyZXNzKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQVNTT0NJQVRFSU1BR0VCVUZGRVJFVkVOVFNJM0RQUk9DKSAoSERDIGhEQywgY29uc3QgSEFORExFICpwRXZlbnQsIGNvbnN0IExQVk9JRCAqcEFkZHJlc3MsIGNvbnN0IERXT1JEICpwU2l6ZSwgVUlOVCBjb3VudCk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFJFTEVBU0VJTUFHRUJVRkZFUkVWRU5UU0kzRFBST0MpIChIREMgaERDLCBjb25zdCBMUFZPSUQgKnBBZGRyZXNzLCBVSU5UIGNvdW50KTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9JM0Rfc3dhcF9mcmFtZV9sb2NrCisjZGVmaW5lIFdHTF9JM0Rfc3dhcF9mcmFtZV9sb2NrIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xFbmFibGVGcmFtZUxvY2tJM0QgKHZvaWQpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbERpc2FibGVGcmFtZUxvY2tJM0QgKHZvaWQpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbElzRW5hYmxlZEZyYW1lTG9ja0kzRCAoQk9PTCAqcEZsYWcpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFF1ZXJ5RnJhbWVMb2NrTWFzdGVySTNEIChCT09MICpwRmxhZyk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEVOQUJMRUZSQU1FTE9DS0kzRFBST0MpICh2b2lkKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMRElTQUJMRUZSQU1FTE9DS0kzRFBST0MpICh2b2lkKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMSVNFTkFCTEVERlJBTUVMT0NLSTNEUFJPQykgKEJPT0wgKnBGbGFnKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMUVVFUllGUkFNRUxPQ0tNQVNURVJJM0RQUk9DKSAoQk9PTCAqcEZsYWcpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0kzRF9zd2FwX2ZyYW1lX3VzYWdlCisjZGVmaW5lIFdHTF9JM0Rfc3dhcF9mcmFtZV91c2FnZSAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0RnJhbWVVc2FnZUkzRCAoZmxvYXQgKnBVc2FnZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsQmVnaW5GcmFtZVRyYWNraW5nSTNEICh2b2lkKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xFbmRGcmFtZVRyYWNraW5nSTNEICh2b2lkKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xRdWVyeUZyYW1lVHJhY2tpbmdJM0QgKERXT1JEICpwRnJhbWVDb3VudCwgRFdPUkQgKnBNaXNzZWRGcmFtZXMsIGZsb2F0ICpwTGFzdE1pc3NlZFVzYWdlKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMR0VURlJBTUVVU0FHRUkzRFBST0MpIChmbG9hdCAqcFVzYWdlKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQkVHSU5GUkFNRVRSQUNLSU5HSTNEUFJPQykgKHZvaWQpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xFTkRGUkFNRVRSQUNLSU5HSTNEUFJPQykgKHZvaWQpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xRVUVSWUZSQU1FVFJBQ0tJTkdJM0RQUk9DKSAoRFdPUkQgKnBGcmFtZUNvdW50LCBEV09SRCAqcE1pc3NlZEZyYW1lcywgZmxvYXQgKnBMYXN0TWlzc2VkVXNhZ2UpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQKKyNkZWZpbmUgV0dMX0FUSV9waXhlbF9mb3JtYXRfZmxvYXQgMQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX05WX2Zsb2F0X2J1ZmZlcgorI2RlZmluZSBXR0xfTlZfZmxvYXRfYnVmZmVyIDEKKyNlbmRpZgorCisjaWZuZGVmIFdHTF8zRExfc3RlcmVvX2NvbnRyb2wKKyNkZWZpbmUgV0dMXzNETF9zdGVyZW9fY29udHJvbCAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQk9PTCBXSU5BUEkgd2dsU2V0U3RlcmVvRW1pdHRlclN0YXRlM0RMIChIREMgaERDLCBVSU5UIHVTdGF0ZSk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFNFVFNURVJFT0VNSVRURVJTVEFURTNETFBST0MpIChIREMgaERDLCBVSU5UIHVTdGF0ZSk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfRVhUX3BpeGVsX2Zvcm1hdF9wYWNrZWRfZmxvYXQKKyNkZWZpbmUgV0dMX0VYVF9waXhlbF9mb3JtYXRfcGFja2VkX2Zsb2F0IDEKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9FWFRfZnJhbWVidWZmZXJfc1JHQgorI2RlZmluZSBXR0xfRVhUX2ZyYW1lYnVmZmVyX3NSR0IgMQorI2VuZGlmCisKKyNpZm5kZWYgV0dMX05WX3ByZXNlbnRfdmlkZW8KKyNkZWZpbmUgV0dMX05WX3ByZXNlbnRfdmlkZW8gMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIGludCBXSU5BUEkgd2dsRW51bWVyYXRlVmlkZW9EZXZpY2VzTlYgKEhEQyBoREMsIEhWSURFT09VVFBVVERFVklDRU5WICpwaERldmljZUxpc3QpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEJpbmRWaWRlb0RldmljZU5WIChIREMgaERDLCB1bnNpZ25lZCBpbnQgdVZpZGVvU2xvdCwgSFZJREVPT1VUUFVUREVWSUNFTlYgaFZpZGVvRGV2aWNlLCBjb25zdCBpbnQgKnBpQXR0cmliTGlzdCk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUXVlcnlDdXJyZW50Q29udGV4dE5WIChpbnQgaUF0dHJpYnV0ZSwgaW50ICpwaVZhbHVlKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgaW50IChXSU5BUEkgKiBQRk5XR0xFTlVNRVJBVEVWSURFT0RFVklDRVNOVlBST0MpIChIREMgaERDLCBIVklERU9PVVRQVVRERVZJQ0VOViAqcGhEZXZpY2VMaXN0KTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQklORFZJREVPREVWSUNFTlZQUk9DKSAoSERDIGhEQywgdW5zaWduZWQgaW50IHVWaWRlb1Nsb3QsIEhWSURFT09VVFBVVERFVklDRU5WIGhWaWRlb0RldmljZSwgY29uc3QgaW50ICpwaUF0dHJpYkxpc3QpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xRVUVSWUNVUlJFTlRDT05URVhUTlZQUk9DKSAoaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfdmlkZW9fb3V0cHV0CisjZGVmaW5lIFdHTF9OVl92aWRlb19vdXRwdXQgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEdldFZpZGVvRGV2aWNlTlYgKEhEQyBoREMsIGludCBudW1EZXZpY2VzLCBIUFZJREVPREVWICpoVmlkZW9EZXZpY2UpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFJlbGVhc2VWaWRlb0RldmljZU5WIChIUFZJREVPREVWIGhWaWRlb0RldmljZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsQmluZFZpZGVvSW1hZ2VOViAoSFBWSURFT0RFViBoVmlkZW9EZXZpY2UsIEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBpbnQgaVZpZGVvQnVmZmVyKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xSZWxlYXNlVmlkZW9JbWFnZU5WIChIUEJVRkZFUkFSQiBoUGJ1ZmZlciwgaW50IGlWaWRlb0J1ZmZlcik7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsU2VuZFBidWZmZXJUb1ZpZGVvTlYgKEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBpbnQgaUJ1ZmZlclR5cGUsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJQYnVmZmVyLCBCT09MIGJCbG9jayk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsR2V0VmlkZW9JbmZvTlYgKEhQVklERU9ERVYgaHBWaWRlb0RldmljZSwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlck91dHB1dFBidWZmZXIsIHVuc2lnbmVkIGxvbmcgKnB1bENvdW50ZXJPdXRwdXRWaWRlbyk7CisjZW5kaWYgLyogV0dMX1dHTEVYVF9QUk9UT1RZUEVTICovCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEdFVFZJREVPREVWSUNFTlZQUk9DKSAoSERDIGhEQywgaW50IG51bURldmljZXMsIEhQVklERU9ERVYgKmhWaWRlb0RldmljZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFJFTEVBU0VWSURFT0RFVklDRU5WUFJPQykgKEhQVklERU9ERVYgaFZpZGVvRGV2aWNlKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQklORFZJREVPSU1BR0VOVlBST0MpIChIUFZJREVPREVWIGhWaWRlb0RldmljZSwgSFBCVUZGRVJBUkIgaFBidWZmZXIsIGludCBpVmlkZW9CdWZmZXIpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xSRUxFQVNFVklERU9JTUFHRU5WUFJPQykgKEhQQlVGRkVSQVJCIGhQYnVmZmVyLCBpbnQgaVZpZGVvQnVmZmVyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMU0VORFBCVUZGRVJUT1ZJREVPTlZQUk9DKSAoSFBCVUZGRVJBUkIgaFBidWZmZXIsIGludCBpQnVmZmVyVHlwZSwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlclBidWZmZXIsIEJPT0wgYkJsb2NrKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMR0VUVklERU9JTkZPTlZQUk9DKSAoSFBWSURFT0RFViBocFZpZGVvRGV2aWNlLCB1bnNpZ25lZCBsb25nICpwdWxDb3VudGVyT3V0cHV0UGJ1ZmZlciwgdW5zaWduZWQgbG9uZyAqcHVsQ291bnRlck91dHB1dFZpZGVvKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9OVl9zd2FwX2dyb3VwCisjZGVmaW5lIFdHTF9OVl9zd2FwX2dyb3VwIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xKb2luU3dhcEdyb3VwTlYgKEhEQyBoREMsIEdMdWludCBncm91cCk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsQmluZFN3YXBCYXJyaWVyTlYgKEdMdWludCBncm91cCwgR0x1aW50IGJhcnJpZXIpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFF1ZXJ5U3dhcEdyb3VwTlYgKEhEQyBoREMsIEdMdWludCAqZ3JvdXAsIEdMdWludCAqYmFycmllcik7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUXVlcnlNYXhTd2FwR3JvdXBzTlYgKEhEQyBoREMsIEdMdWludCAqbWF4R3JvdXBzLCBHTHVpbnQgKm1heEJhcnJpZXJzKTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xRdWVyeUZyYW1lQ291bnROViAoSERDIGhEQywgR0x1aW50ICpjb3VudCk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUmVzZXRGcmFtZUNvdW50TlYgKEhEQyBoREMpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xKT0lOU1dBUEdST1VQTlZQUk9DKSAoSERDIGhEQywgR0x1aW50IGdyb3VwKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQklORFNXQVBCQVJSSUVSTlZQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHVpbnQgYmFycmllcik7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFFVRVJZU1dBUEdST1VQTlZQUk9DKSAoSERDIGhEQywgR0x1aW50ICpncm91cCwgR0x1aW50ICpiYXJyaWVyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMUVVFUllNQVhTV0FQR1JPVVBTTlZQUk9DKSAoSERDIGhEQywgR0x1aW50ICptYXhHcm91cHMsIEdMdWludCAqbWF4QmFycmllcnMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xRVUVSWUZSQU1FQ09VTlROVlBST0MpIChIREMgaERDLCBHTHVpbnQgKmNvdW50KTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMUkVTRVRGUkFNRUNPVU5UTlZQUk9DKSAoSERDIGhEQyk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfZ3B1X2FmZmluaXR5CisjZGVmaW5lIFdHTF9OVl9ncHVfYWZmaW5pdHkgMQorI2lmZGVmIFdHTF9XR0xFWFRfUFJPVE9UWVBFUworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEVudW1HcHVzTlYgKFVJTlQgaUdwdUluZGV4LCBIR1BVTlYgKnBoR3B1KTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xFbnVtR3B1RGV2aWNlc05WIChIR1BVTlYgaEdwdSwgVUlOVCBpRGV2aWNlSW5kZXgsIFBHUFVfREVWSUNFIGxwR3B1RGV2aWNlKTsKK2V4dGVybiBIREMgV0lOQVBJIHdnbENyZWF0ZUFmZmluaXR5RENOViAoY29uc3QgSEdQVU5WICpwaEdwdUxpc3QpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbEVudW1HcHVzRnJvbUFmZmluaXR5RENOViAoSERDIGhBZmZpbml0eURDLCBVSU5UIGlHcHVJbmRleCwgSEdQVU5WICpoR3B1KTsKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xEZWxldGVEQ05WIChIREMgaGRjKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMRU5VTUdQVVNOVlBST0MpIChVSU5UIGlHcHVJbmRleCwgSEdQVU5WICpwaEdwdSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTEVOVU1HUFVERVZJQ0VTTlZQUk9DKSAoSEdQVU5WIGhHcHUsIFVJTlQgaURldmljZUluZGV4LCBQR1BVX0RFVklDRSBscEdwdURldmljZSk7Cit0eXBlZGVmIEhEQyAoV0lOQVBJICogUEZOV0dMQ1JFQVRFQUZGSU5JVFlEQ05WUFJPQykgKGNvbnN0IEhHUFVOViAqcGhHcHVMaXN0KTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMRU5VTUdQVVNGUk9NQUZGSU5JVFlEQ05WUFJPQykgKEhEQyBoQWZmaW5pdHlEQywgVUlOVCBpR3B1SW5kZXgsIEhHUFVOViAqaEdwdSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTERFTEVURURDTlZQUk9DKSAoSERDIGhkYyk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfQU1EX2dwdV9hc3NvY2lhdGlvbgorI2RlZmluZSBXR0xfQU1EX2dwdV9hc3NvY2lhdGlvbiAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gVUlOVCBXSU5BUEkgd2dsR2V0R1BVSURzQU1EIChVSU5UIG1heENvdW50LCBVSU5UICppZHMpOworZXh0ZXJuIElOVCBXSU5BUEkgd2dsR2V0R1BVSW5mb0FNRCAoVUlOVCBpZCwgaW50IHByb3BlcnR5LCBHTGVudW0gZGF0YVR5cGUsIFVJTlQgc2l6ZSwgdm9pZCAqZGF0YSk7CitleHRlcm4gVUlOVCBXSU5BUEkgd2dsR2V0Q29udGV4dEdQVUlEQU1EIChIR0xSQyBoZ2xyYyk7CitleHRlcm4gSEdMUkMgV0lOQVBJIHdnbENyZWF0ZUFzc29jaWF0ZWRDb250ZXh0QU1EIChVSU5UIGlkKTsKK2V4dGVybiBIR0xSQyBXSU5BUEkgd2dsQ3JlYXRlQXNzb2NpYXRlZENvbnRleHRBdHRyaWJzQU1EIChVSU5UIGlkLCBIR0xSQyBoU2hhcmVDb250ZXh0LCBjb25zdCBpbnQgKmF0dHJpYkxpc3QpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbERlbGV0ZUFzc29jaWF0ZWRDb250ZXh0QU1EIChIR0xSQyBoZ2xyYyk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsTWFrZUFzc29jaWF0ZWRDb250ZXh0Q3VycmVudEFNRCAoSEdMUkMgaGdscmMpOworZXh0ZXJuIEhHTFJDIFdJTkFQSSB3Z2xHZXRDdXJyZW50QXNzb2NpYXRlZENvbnRleHRBTUQgKHZvaWQpOworZXh0ZXJuIFZPSUQgV0lOQVBJIHdnbEJsaXRDb250ZXh0RnJhbWVidWZmZXJBTUQgKEhHTFJDIGRzdEN0eCwgR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBVSU5UIChXSU5BUEkgKiBQRk5XR0xHRVRHUFVJRFNBTURQUk9DKSAoVUlOVCBtYXhDb3VudCwgVUlOVCAqaWRzKTsKK3R5cGVkZWYgSU5UIChXSU5BUEkgKiBQRk5XR0xHRVRHUFVJTkZPQU1EUFJPQykgKFVJTlQgaWQsIGludCBwcm9wZXJ0eSwgR0xlbnVtIGRhdGFUeXBlLCBVSU5UIHNpemUsIHZvaWQgKmRhdGEpOwordHlwZWRlZiBVSU5UIChXSU5BUEkgKiBQRk5XR0xHRVRDT05URVhUR1BVSURBTURQUk9DKSAoSEdMUkMgaGdscmMpOwordHlwZWRlZiBIR0xSQyAoV0lOQVBJICogUEZOV0dMQ1JFQVRFQVNTT0NJQVRFRENPTlRFWFRBTURQUk9DKSAoVUlOVCBpZCk7Cit0eXBlZGVmIEhHTFJDIChXSU5BUEkgKiBQRk5XR0xDUkVBVEVBU1NPQ0lBVEVEQ09OVEVYVEFUVFJJQlNBTURQUk9DKSAoVUlOVCBpZCwgSEdMUkMgaFNoYXJlQ29udGV4dCwgY29uc3QgaW50ICphdHRyaWJMaXN0KTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMREVMRVRFQVNTT0NJQVRFRENPTlRFWFRBTURQUk9DKSAoSEdMUkMgaGdscmMpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xNQUtFQVNTT0NJQVRFRENPTlRFWFRDVVJSRU5UQU1EUFJPQykgKEhHTFJDIGhnbHJjKTsKK3R5cGVkZWYgSEdMUkMgKFdJTkFQSSAqIFBGTldHTEdFVENVUlJFTlRBU1NPQ0lBVEVEQ09OVEVYVEFNRFBST0MpICh2b2lkKTsKK3R5cGVkZWYgVk9JRCAoV0lOQVBJICogUEZOV0dMQkxJVENPTlRFWFRGUkFNRUJVRkZFUkFNRFBST0MpIChIR0xSQyBkc3RDdHgsIEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKKyNlbmRpZgorCisjaWZuZGVmIFdHTF9OVl92aWRlb19jYXB0dXJlCisjZGVmaW5lIFdHTF9OVl92aWRlb19jYXB0dXJlIDEKKyNpZmRlZiBXR0xfV0dMRVhUX1BST1RPVFlQRVMKK2V4dGVybiBCT09MIFdJTkFQSSB3Z2xCaW5kVmlkZW9DYXB0dXJlRGV2aWNlTlYgKFVJTlQgdVZpZGVvU2xvdCwgSFZJREVPSU5QVVRERVZJQ0VOViBoRGV2aWNlKTsKK2V4dGVybiBVSU5UIFdJTkFQSSB3Z2xFbnVtZXJhdGVWaWRlb0NhcHR1cmVEZXZpY2VzTlYgKEhEQyBoRGMsIEhWSURFT0lOUFVUREVWSUNFTlYgKnBoRGV2aWNlTGlzdCk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsTG9ja1ZpZGVvQ2FwdHVyZURldmljZU5WIChIREMgaERjLCBIVklERU9JTlBVVERFVklDRU5WIGhEZXZpY2UpOworZXh0ZXJuIEJPT0wgV0lOQVBJIHdnbFF1ZXJ5VmlkZW9DYXB0dXJlRGV2aWNlTlYgKEhEQyBoRGMsIEhWSURFT0lOUFVUREVWSUNFTlYgaERldmljZSwgaW50IGlBdHRyaWJ1dGUsIGludCAqcGlWYWx1ZSk7CitleHRlcm4gQk9PTCBXSU5BUEkgd2dsUmVsZWFzZVZpZGVvQ2FwdHVyZURldmljZU5WIChIREMgaERjLCBIVklERU9JTlBVVERFVklDRU5WIGhEZXZpY2UpOworI2VuZGlmIC8qIFdHTF9XR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiBCT09MIChXSU5BUEkgKiBQRk5XR0xCSU5EVklERU9DQVBUVVJFREVWSUNFTlZQUk9DKSAoVUlOVCB1VmlkZW9TbG90LCBIVklERU9JTlBVVERFVklDRU5WIGhEZXZpY2UpOwordHlwZWRlZiBVSU5UIChXSU5BUEkgKiBQRk5XR0xFTlVNRVJBVEVWSURFT0NBUFRVUkVERVZJQ0VTTlZQUk9DKSAoSERDIGhEYywgSFZJREVPSU5QVVRERVZJQ0VOViAqcGhEZXZpY2VMaXN0KTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMTE9DS1ZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKEhEQyBoRGMsIEhWSURFT0lOUFVUREVWSUNFTlYgaERldmljZSk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqIFBGTldHTFFVRVJZVklERU9DQVBUVVJFREVWSUNFTlZQUk9DKSAoSERDIGhEYywgSFZJREVPSU5QVVRERVZJQ0VOViBoRGV2aWNlLCBpbnQgaUF0dHJpYnV0ZSwgaW50ICpwaVZhbHVlKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMUkVMRUFTRVZJREVPQ0FQVFVSRURFVklDRU5WUFJPQykgKEhEQyBoRGMsIEhWSURFT0lOUFVUREVWSUNFTlYgaERldmljZSk7CisjZW5kaWYKKworI2lmbmRlZiBXR0xfTlZfY29weV9pbWFnZQorI2RlZmluZSBXR0xfTlZfY29weV9pbWFnZSAxCisjaWZkZWYgV0dMX1dHTEVYVF9QUk9UT1RZUEVTCitleHRlcm4gQk9PTCBXSU5BUEkgd2dsQ29weUltYWdlU3ViRGF0YU5WIChIR0xSQyBoU3JjUkMsIEdMdWludCBzcmNOYW1lLCBHTGVudW0gc3JjVGFyZ2V0LCBHTGludCBzcmNMZXZlbCwgR0xpbnQgc3JjWCwgR0xpbnQgc3JjWSwgR0xpbnQgc3JjWiwgSEdMUkMgaERzdFJDLCBHTHVpbnQgZHN0TmFtZSwgR0xlbnVtIGRzdFRhcmdldCwgR0xpbnQgZHN0TGV2ZWwsIEdMaW50IGRzdFgsIEdMaW50IGRzdFksIEdMaW50IGRzdFosIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKyNlbmRpZiAvKiBXR0xfV0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgQk9PTCAoV0lOQVBJICogUEZOV0dMQ09QWUlNQUdFU1VCREFUQU5WUFJPQykgKEhHTFJDIGhTcmNSQywgR0x1aW50IHNyY05hbWUsIEdMZW51bSBzcmNUYXJnZXQsIEdMaW50IHNyY0xldmVsLCBHTGludCBzcmNYLCBHTGludCBzcmNZLCBHTGludCBzcmNaLCBIR0xSQyBoRHN0UkMsIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworI2VuZGlmCisKKyNpZm5kZWYgV0dMX05WX211bHRpc2FtcGxlX2NvdmVyYWdlCisjZGVmaW5lIFdHTF9OVl9tdWx0aXNhbXBsZV9jb3ZlcmFnZSAxCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUy9nbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9HTEVTL2dsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI4ZDg1YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUy9nbC5oCkBAIC0wLDAgKzEsNzcwIEBACisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisvKiAkUmV2aXNpb246IDEwNjAxICQgb24gJERhdGU6OiAyMDEwLTAzLTA0IDIyOjE1OjI3IC0wODAwICMkICovCisKKyNpbmNsdWRlIDxHTEVTL2dscGxhdGZvcm0uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KKyAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KKyAqLworCit0eXBlZGVmIHZvaWQgICAgICAgICAgICAgR0x2b2lkOwordHlwZWRlZiBjaGFyICAgICAgICAgICAgIEdMY2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgR0xib29sZWFuOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMYml0ZmllbGQ7Cit0eXBlZGVmIGtocm9ub3NfaW50OF90ICAgR0xieXRlOwordHlwZWRlZiBzaG9ydCAgICAgICAgICAgIEdMc2hvcnQ7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgR0xpbnQ7Cit0eXBlZGVmIGludCAgICAgICAgICAgICAgR0xzaXplaTsKK3R5cGVkZWYga2hyb25vc191aW50OF90ICBHTHVieXRlOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgIEdMdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMdWludDsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGZsb2F0OwordHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgIEdMY2xhbXBmOwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMZml4ZWQ7Cit0eXBlZGVmIGtocm9ub3NfaW50MzJfdCAgR0xjbGFtcHg7CisKK3R5cGVkZWYga2hyb25vc19pbnRwdHJfdCBHTGludHB0cjsKK3R5cGVkZWYga2hyb25vc19zc2l6ZV90ICBHTHNpemVpcHRyOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPcGVuR0wgRVMgY29yZSB2ZXJzaW9ucyAqLworI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NNXzFfMCAgICAgICAgICAxCisjZGVmaW5lIEdMX1ZFUlNJT05fRVNfQ0xfMV8wICAgICAgICAgIDEKKyNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTV8xXzEgICAgICAgICAgMQorI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NMXzFfMSAgICAgICAgICAxCisKKy8qIENsZWFyQnVmZmVyTWFzayAqLworI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorCisvKiBCb29sZWFuICovCisjZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEJlZ2luTW9kZSAqLworI2RlZmluZSBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgMHgwMDA2CisKKy8qIEFscGhhRnVuY3Rpb24gKi8KKyNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisKKy8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqLworI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQorCisvKiBCbGVuZGluZ0ZhY3RvclNyYyAqLworLyogICAgICBHTF9aRVJPICovCisvKiAgICAgIEdMX09ORSAqLworI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAorLyogICAgICBHTF9TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9EU1RfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLworCisvKiBDbGlwUGxhbmVOYW1lICovCisjZGVmaW5lIEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAweDMwMDAKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgIDB4MzAwMQorI2RlZmluZSBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgMHgzMDAyCisjZGVmaW5lIEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAweDMwMDMKKyNkZWZpbmUgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgIDB4MzAwNAorI2RlZmluZSBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgMHgzMDA1CisKKy8qIENvbG9yTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIENvbG9yTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKy8qICAgICAgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAqLworCisvKiBDb2xvclBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogQ3VsbEZhY2VNb2RlICovCisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisKKy8qIERlcHRoRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIEVuYWJsZUNhcCAqLworI2RlZmluZSBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjYwCisjZGVmaW5lIEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAweDBCNTAKKyNkZWZpbmUgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgIDB4MERFMQorI2RlZmluZSBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwQjQ0CisjZGVmaW5lIEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCQzAKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgMHgwQkYyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisvKiAgICAgIEdMX0xJR0hUMCAqLworLyogICAgICBHTF9MSUdIVDEgKi8KKy8qICAgICAgR0xfTElHSFQyICovCisvKiAgICAgIEdMX0xJR0hUMyAqLworLyogICAgICBHTF9MSUdIVDQgKi8KKy8qICAgICAgR0xfTElHSFQ1ICovCisvKiAgICAgIEdMX0xJR0hUNiAqLworLyogICAgICBHTF9MSUdIVDcgKi8KKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgIDB4MEIxMAorI2RlZmluZSBHTF9MSU5FX1NNT09USCAgICAgICAgICAgICAgICAgICAgMHgwQjIwCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgIDB4MEI1NworI2RlZmluZSBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgMHgwQkExCisjZGVmaW5lIEdMX1JFU0NBTEVfTk9STUFMICAgICAgICAgICAgICAgICAweDgwM0EKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9WRVJURVhfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzUKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgIDB4ODA3NgorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgMHg4MDc4CisjZGVmaW5lIEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAweDgwOUQKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgMHg4MDlGCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKworLyogRXJyb3JDb2RlICovCisjZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCisjZGVmaW5lIEdMX1NUQUNLX09WRVJGTE9XICAgICAgICAgICAgICAgICAweDA1MDMKKyNkZWZpbmUgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgIDB4MDUwNAorI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1CisKKy8qIEZvZ01vZGUgKi8KKy8qICAgICAgR0xfTElORUFSICovCisjZGVmaW5lIEdMX0VYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAKKyNkZWZpbmUgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMQorCisvKiBGb2dQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgIDB4MEI2MgorI2RlZmluZSBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgMHgwQjYzCisjZGVmaW5lIEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjQKKyNkZWZpbmUgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NQorI2RlZmluZSBHTF9GT0dfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwQjY2CisKKy8qIEZyb250RmFjZURpcmVjdGlvbiAqLworI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKworLyogR2V0UE5hbWUgKi8KKyNkZWZpbmUgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgIDB4MEIwMAorI2RlZmluZSBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgMHgwQjAyCisjZGVmaW5lIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAweDBCMDMKKyNkZWZpbmUgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4MEIxMQorI2RlZmluZSBHTF9QT0lOVF9TSVpFX01JTiAgICAgICAgICAgICAgICAgMHg4MTI2CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAweDgxMjcKKyNkZWZpbmUgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgIDB4ODEyOAorI2RlZmluZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTiAgICAgMHg4MTI5CisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKKyNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQorI2RlZmluZSBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgMHgwQjIyCisjZGVmaW5lIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAweDg0NkQKKyNkZWZpbmUgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgIDB4ODQ2RQorI2RlZmluZSBHTF9DVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgMHgwQjQ1CisjZGVmaW5lIEdMX0ZST05UX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAweDBCNDYKKyNkZWZpbmUgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgIDB4MEI1NAorI2RlZmluZSBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgMHgwQjcwCisjZGVmaW5lIEdMX0RFUFRIX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBCNzIKKyNkZWZpbmUgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEI3MworI2RlZmluZSBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgMHgwQjc0CisjZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAweDBCOTEKKyNkZWZpbmUgR0xfU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgIDB4MEI5MgorI2RlZmluZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgMHgwQjkzCisjZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2CisjZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgIDB4MEI5OAorI2RlZmluZSBHTF9NQVRSSVhfTU9ERSAgICAgICAgICAgICAgICAgICAgMHgwQkEwCisjZGVmaW5lIEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAweDBCQTIKKyNkZWZpbmUgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgIDB4MEJBMworI2RlZmluZSBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgMHgwQkE0CisjZGVmaW5lIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAweDBCQTUKKyNkZWZpbmUgR0xfTU9ERUxWSUVXX01BVFJJWCAgICAgICAgICAgICAgIDB4MEJBNgorI2RlZmluZSBHTF9QUk9KRUNUSU9OX01BVFJJWCAgICAgICAgICAgICAgMHgwQkE3CisjZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAweDBCQTgKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9GVU5DICAgICAgICAgICAgICAgIDB4MEJDMQorI2RlZmluZSBHTF9BTFBIQV9URVNUX1JFRiAgICAgICAgICAgICAgICAgMHgwQkMyCisjZGVmaW5lIEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAweDBCRTAKKyNkZWZpbmUgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMQorI2RlZmluZSBHTF9MT0dJQ19PUF9NT0RFICAgICAgICAgICAgICAgICAgMHgwQkYwCisjZGVmaW5lIEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAweDBDMTAKKyNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQzIyCisjZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBDMjMKKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisjZGVmaW5lIEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAweDBEMzEKKyNkZWZpbmUgR0xfTUFYX0NMSVBfUExBTkVTICAgICAgICAgICAgICAgIDB4MEQzMgorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCisjZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKKyNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5CisjZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgorI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAweDJBMDAKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1NJWkUgICAgICAgICAgICAgIDB4ODA3QQorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfVFlQRSAgICAgICAgICAgICAgMHg4MDdCCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAweDgwN0MKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1RZUEUgICAgICAgICAgICAgIDB4ODA3RQorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgMHg4MDdGCisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAweDgwODEKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgIDB4ODA4MgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TVFJJREUgICAgICAgICAgICAgMHg4MDgzCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAweDgwODgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFICAgICAgIDB4ODA4OQorI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERSAgICAgMHg4MDhBCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAweDgwOEUKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgIDB4ODA4RgorI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgMHg4MDkwCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAweDgwOTIKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorCisvKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCisvKiAgICAgIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAqLworLyogICAgICBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KKy8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1QgKi8KKworI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKworLyogSGludE1vZGUgKi8KKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKworLyogSGludFRhcmdldCAqLworI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKKyNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgorI2RlZmluZSBHTF9GT0dfSElOVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQzU0CisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAweDgxOTIKKworLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKKworLyogTGlnaHRQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAorI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCisjZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKKyNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMworI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0CisjZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKKyNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgorI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3CisjZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKKyNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQorCisvKiBEYXRhVHlwZSAqLworI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKKyNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworCisvKiBMb2dpY09wICovCisjZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKKyNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQorI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCisjZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKKyNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAorI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1CisjZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKKyNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNworI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4CisjZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCisjZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKKyNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAorI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCisjZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKKworLyogTWF0ZXJpYWxGYWNlICovCisvKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCisKKy8qIE1hdGVyaWFsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKKyNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQorI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCisvKiAgICAgIEdMX0FNQklFTlQgKi8KKy8qICAgICAgR0xfRElGRlVTRSAqLworLyogICAgICBHTF9TUEVDVUxBUiAqLworCisvKiBNYXRyaXhNb2RlICovCisjZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKKyNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQorI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCisKKy8qIE5vcm1hbFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX0JZVEUgKi8KKy8qICAgICAgR0xfU0hPUlQgKi8KKy8qICAgICAgR0xfRkxPQVQgKi8KKy8qICAgICAgR0xfRklYRUQgKi8KKworLyogUGl4ZWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgorI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCisKKy8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisKKy8qIFBpeGVsVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisKKy8qIFNoYWRpbmdNb2RlbCAqLworI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCisjZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKKworLyogU3RlbmNpbEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBTdGVuY2lsT3AgKi8KKy8qICAgICAgR0xfWkVSTyAqLworI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKKyNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgorI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCisvKiAgICAgIEdMX0lOVkVSVCAqLworCisvKiBTdHJpbmdOYW1lICovCisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKworLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIFRleHR1cmVFbnZNb2RlICovCisjZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKKyNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQorLyogICAgICBHTF9CTEVORCAqLworI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0CisvKiAgICAgIEdMX1JFUExBQ0UgKi8KKworLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKKworLyogVGV4dHVyZUVudlRhcmdldCAqLworI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCisKKy8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAorI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCisKKy8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KKy8qICAgICAgR0xfTkVBUkVTVCAqLworLyogICAgICBHTF9MSU5FQVIgKi8KKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworCisvKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAweDgxOTEKKworLyogVGV4dHVyZVRhcmdldCAqLworLyogICAgICBHTF9URVhUVVJFXzJEICovCisKKy8qIFRleHR1cmVVbml0ICovCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCisjZGVmaW5lIEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAweDg0RTEKKworLyogVGV4dHVyZVdyYXBNb2RlICovCisjZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorCisvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIExpZ2h0TmFtZSAqLworI2RlZmluZSBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKKyNkZWZpbmUgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDcKKworLyogQnVmZmVyIE9iamVjdHMgKi8KKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCisKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgICAweDg4OTQKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAweDg4OTUKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAweDg4OTYKKyNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAweDg4OTcKKyNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAweDg4OTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUEKKworI2RlZmluZSBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEU0CisjZGVmaW5lIEdMX0RZTkFNSUNfRFJBVyAgICAgICAgICAgICAgICAgICAweDg4RTgKKworI2RlZmluZSBHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgMHg4NzY0CisjZGVmaW5lIEdMX0JVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICAweDg3NjUKKworLyogVGV4dHVyZSBjb21iaW5lICsgZG90MyAqLworI2RlZmluZSBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEU3CisjZGVmaW5lIEdMX0NPTUJJTkUgICAgICAgICAgICAgICAgICAgICAgICAweDg1NzAKKyNkZWZpbmUgR0xfQ09NQklORV9SR0IgICAgICAgICAgICAgICAgICAgIDB4ODU3MQorI2RlZmluZSBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgMHg4NTcyCisjZGVmaW5lIEdMX1JHQl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAweDg1NzMKKyNkZWZpbmUgR0xfQUREX1NJR05FRCAgICAgICAgICAgICAgICAgICAgIDB4ODU3NAorI2RlZmluZSBHTF9JTlRFUlBPTEFURSAgICAgICAgICAgICAgICAgICAgMHg4NTc1CisjZGVmaW5lIEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAweDg1NzYKKyNkZWZpbmUgR0xfUFJJTUFSWV9DT0xPUiAgICAgICAgICAgICAgICAgIDB4ODU3NworI2RlZmluZSBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc4CisjZGVmaW5lIEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTAKKyNkZWZpbmUgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MQorI2RlZmluZSBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkyCisjZGVmaW5lIEdMX09QRVJBTkQwX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTgKKyNkZWZpbmUgR0xfT1BFUkFORDFfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5OQorI2RlZmluZSBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTlBCisKKyNkZWZpbmUgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgIDB4MEQxQworCisjZGVmaW5lIEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODAKKyNkZWZpbmUgR0xfU1JDMV9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MQorI2RlZmluZSBHTF9TUkMyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgyCisjZGVmaW5lIEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODgKKyNkZWZpbmUgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4OQorI2RlZmluZSBHTF9TUkMyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NThBCisKKyNkZWZpbmUgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRQorI2RlZmluZSBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgMHg4NkFGCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogcmVxdWlyZWQgT0VTIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogT0VTX3JlYWRfZm9ybWF0ICovCisjaWZuZGVmIEdMX09FU19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgICAgICAgICAgICAgICAgIDB4OEI5QgorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MAorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MQorI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MgorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5MworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NQorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NgorI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5NworI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OAorI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5OQorI2VuZGlmCisKKy8qIE9FU19wb2ludF9zaXplX2FycmF5ICovCisjaWZuZGVmIEdMX09FU19wb2ludF9zaXplX2FycmF5CisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjlDCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThBCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThCCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OThDCisjZGVmaW5lIEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgMHg4QjlGCisjZW5kaWYKKworLyogR0xfT0VTX3BvaW50X3Nwcml0ZSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODYxCisjZGVmaW5lIEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODYyCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEF2YWlsYWJsZSBvbmx5IGluIENvbW1vbiBwcm9maWxlICovCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuYyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMY2xhbXBmIGRlcHRoKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZiAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNGYgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2dmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVtZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZWYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRGbG9hdHYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudmZ2IChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWxmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkTWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFsZiAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDRmIChHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWwzZiAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJmdiAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemUgKEdMZmxvYXQgc2l6ZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUm90YXRlZiAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zbGF0ZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworCisvKiBBdmFpbGFibGUgaW4gYm90aCBDb21tb24gYW5kIENvbW1vbi1MaXRlIHByb2ZpbGVzICovCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQWxwaGFGdW5jeCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJ1ZmZlckRhdGEgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXIgKEdMYml0ZmllbGQgbWFzayk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3J4IChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5leCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHViIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yTWFzayAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZXggKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3ggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZvZ3h2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52IChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZXggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlblRleHR1cmVzIChHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOworR0xfQVBJIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Rml4ZWR2IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UG9pbnRlcnYgKEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zKTsKK0dMX0FQSSBjb25zdCBHTHVieXRlICogR0xfQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4RW52aXYgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudnh2IChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNCdWZmZXIgKEdMdWludCBidWZmZXIpOworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRW5hYmxlZCAoR0xlbnVtIGNhcCk7CitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNUZXh0dXJlIChHTHVpbnQgdGV4dHVyZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVseHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0eHYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZElkZW50aXR5ICh2b2lkKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2dpY09wIChHTGVudW0gb3Bjb2RlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4TW9kZSAoR0xlbnVtIG1vZGUpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM3ggKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhveCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvcE1hdHJpeCAodm9pZCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFB1c2hNYXRyaXggKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUm90YXRleCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNoYWRlTW9kZWwgKEdMZW51bSBtb2RlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52aSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4UG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIFJlcXVpcmVkIE9FUyBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX09FU19yZWFkX2Zvcm1hdCAqLworI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKKyNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKKyNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCisjZW5kaWYKKworLyogR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgKi8KKyNpZm5kZWYgR0xfT0VTX3BvaW50X3NpemVfYXJyYXkKKyNkZWZpbmUgR0xfT0VTX3BvaW50X3NpemVfYXJyYXkgMQorR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemVQb2ludGVyT0VTIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CisjZW5kaWYKKworLyogR0xfT0VTX3BvaW50X3Nwcml0ZSAqLworI2lmbmRlZiBHTF9PRVNfcG9pbnRfc3ByaXRlCisjZGVmaW5lIEdMX09FU19wb2ludF9zcHJpdGUgMQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsX2hfICovCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUy9nbGV4dC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9HTEVTL2dsZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZTRiMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUy9nbGV4dC5oCkBAIC0wLDAgKzEsMTA3MyBAQAorI2lmbmRlZiBfX2dsZXh0X2hfCisjZGVmaW5lIF9fZ2xleHRfaF8KKworLyogJFJldmlzaW9uOiAxMzI0MCAkIG9uICREYXRlOjogMjAxMC0xMi0xNyAxNToxNjowMCAtMDgwMCAjJCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKyNpZm5kZWYgR0xfQVBJRU5UUllQCisjICAgZGVmaW5lIEdMX0FQSUVOVFJZUCBHTF9BUElFTlRSWSoKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE9FUyBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKKy8qIEJMRU5EX0VRVUFUSU9OX1JHQl9PRVMgc2FtZSBhcyBCTEVORF9FUVVBVElPTl9PRVMgKi8KKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4M0QKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDOQorI2RlZmluZSBHTF9CTEVORF9EU1RfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBDQgorI2VuZGlmCisKKy8qIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfc3VidHJhY3QKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfRlVOQ19BRERfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDYKKyNkZWZpbmUgR0xfRlVOQ19TVUJUUkFDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMEIKKyNlbmRpZgorCisvKiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQorI2RlZmluZSBHTF9FVEMxX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2NAorI2VuZGlmCisKKy8qIEdMX09FU19kZXB0aDI0ICovCisjaWZuZGVmIEdMX09FU19kZXB0aDI0CisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MUE2CisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTcKKyNlbmRpZgorCisvKiBHTF9PRVNfZHJhd190ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19kcmF3X3RleHR1cmUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOUQKKyNlbmRpZgorCisvKiBHTF9PRVNfRUdMX2ltYWdlICovCisjaWZuZGVmIEdMX09FU19FR0xfaW1hZ2UKK3R5cGVkZWYgdm9pZCogR0xlZ2xJbWFnZU9FUzsKKyNlbmRpZgorCisvKiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsICovCisjaWZuZGVmIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwKKy8qIEdMZWdsSW1hZ2VPRVMgZGVmaW5lZCBpbiBHTF9PRVNfRUdMX2ltYWdlIGFscmVhZHkuICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY1CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY3CisjZGVmaW5lIEdMX1JFUVVJUkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgICAgMHg4RDY4CisjZW5kaWYKKworLyogR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAqLworI2lmbmRlZiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA1CisjZW5kaWYKKworLyogR0xfT0VTX2ZpeGVkX3BvaW50ICovCisjaWZuZGVmIEdMX09FU19maXhlZF9wb2ludAorI2RlZmluZSBHTF9GSVhFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQworI2VuZGlmCisKKy8qIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdAorI2RlZmluZSBHTF9OT05FX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDEKKyNkZWZpbmUgR0xfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTcKKyNkZWZpbmUgR0xfUkdCNTY1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjIKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTZfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1dJRFRIX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDIKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVF9PRVMgICAgICAgICAgICAgICAgICAgICAweDhENDQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTIKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENTQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAweDhENTUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVMgICAgICAgICAgICAgICAweDhDRDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgICAgICAweDhDRDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgICAgICAweDhDRDIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfT0VTICAgICAweDhDRDMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhEMjAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDRDUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAweDhDRDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlRfT0VTICAgICAgICAweDhDRDcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX09FUyAgICAgICAgICAgICAgICAweDhDRDkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgICAgICAweDhDREEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDREQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTYKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RTgKKyNkZWZpbmUgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICAweDA1MDYKKyNlbmRpZgorCisvKiBHTF9PRVNfbWFwYnVmZmVyICovCisjaWZuZGVmIEdMX09FU19tYXBidWZmZXIKKyNkZWZpbmUgR0xfV1JJVEVfT05MWV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QjkKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkIKKyNkZWZpbmUgR0xfQlVGRkVSX01BUFBFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkQKKyNlbmRpZgorCisvKiBHTF9PRVNfbWF0cml4X2dldCAqLworI2lmbmRlZiBHTF9PRVNfbWF0cml4X2dldAorI2RlZmluZSBHTF9NT0RFTFZJRVdfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgIDB4ODk4RAorI2RlZmluZSBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgIDB4ODk4RQorI2RlZmluZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgICAgIDB4ODk4RgorI2VuZGlmCisKKy8qIEdMX09FU19tYXRyaXhfcGFsZXR0ZSAqLworI2lmbmRlZiBHTF9PRVNfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QTQKKyNkZWZpbmUgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDIKKyNkZWZpbmUgR0xfTUFUUklYX1BBTEVUVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDAKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDQKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QUQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9QQUxFVFRFX01BVFJJWF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDMKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDYKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDcKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAweDg4NDgKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAweDg4NDkKKyNkZWZpbmUgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAweDhCOUUKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QUIKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QTkKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QUEKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg2QUMKKyNkZWZpbmUgR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAweDg4OUUKKyNlbmRpZgorCisvKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKyNpZm5kZWYgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEZBCisjZGVmaW5lIEdMX0RFUFRIMjRfU1RFTkNJTDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEYwCisjZW5kaWYKKworLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KKyNpZm5kZWYgR0xfT0VTX3JnYjhfcmdiYTgKKyNkZWZpbmUgR0xfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTEKKyNkZWZpbmUgR0xfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTgKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDEgKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWwxCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ2CisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWw0ICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsNAorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NworI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsOCAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDgKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDgKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbF93cmFwICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsX3dyYXAKKyNkZWZpbmUgR0xfSU5DUl9XUkFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKKyNkZWZpbmUgR0xfREVDUl9XUkFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MDgKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9jdWJlX21hcAorI2RlZmluZSBHTF9OT1JNQUxfTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUxMQorI2RlZmluZSBHTF9SRUZMRUNUSU9OX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUxMgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxNQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxOAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODUxQQorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUxQworI2RlZmluZSBHTF9URVhUVVJFX0dFTl9NT0RFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjUwMAorI2RlZmluZSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MAorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAqLworI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQKKyNkZWZpbmUgR0xfTUlSUk9SRURfUkVQRUFUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzNzAKKyNlbmRpZgorCisvKiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdCAqLworI2lmbmRlZiBHTF9PRVNfdmVydGV4X2FycmF5X29iamVjdAorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODVCNQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQU1EIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RjkKKyNkZWZpbmUgR0xfM0RDX1hZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkEKKyNlbmRpZgorCisvKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQorI2RlZmluZSBHTF9BVENfUkdCX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MgorI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM5MworI2RlZmluZSBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgIDB4ODdFRQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQVBQTEUgZXh0ZW5zaW9uIHRva2VucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9BUFBMRV90ZXh0dXJlXzJEX2xpbWl0ZWRfbnBvdCAqLworLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLworCisvKiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAqLworI2lmbmRlZiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0FQUExFICAgICAgICAgICAgIDB4OEQ1NgorI2RlZmluZSBHTF9NQVhfU0FNUExFU19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NworI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBOAorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgIDB4OENBQQorI2VuZGlmCisKKy8qIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCisjaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4CisjZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZW5kaWYKKworLyogR0xfQVBQTEVfdGV4dHVyZV9tYXhfbGV2ZWwgKi8KKyNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9tYXhfbGV2ZWwKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUxfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxM0QKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEFSTSBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0FSTV9yZ2JhOCAqLworLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIEVYVCBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX0VYVF9ibGVuZF9taW5tYXggKi8KKyNpZm5kZWYgR0xfRVhUX2JsZW5kX21pbm1heAorI2RlZmluZSBHTF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNworI2RlZmluZSBHTF9NQVhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2VuZGlmCisKKy8qIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyICovCisjaWZuZGVmIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyCisjZGVmaW5lIEdMX0NPTE9SX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAwCisjZGVmaW5lIEdMX0RFUFRIX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAxCisjZGVmaW5lIEdMX1NURU5DSUxfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAyCisjZW5kaWYKKworLyogR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzICovCisvKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCisKKy8qIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhICovCisjaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCisjZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzFfNV81XzVfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY2CisjZW5kaWYKKworLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgorI2VuZGlmCisKKy8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKKyNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAqLworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRAorI2RlZmluZSBHTF9URVhUVVJFX0ZJTFRFUl9DT05UUk9MX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwMAorI2RlZmluZSBHTF9URVhUVVJFX0xPRF9CSUFTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogSU1HIGV4dGVuc2lvbiB0b2tlbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfSU1HX3JlYWRfZm9ybWF0ICovCisjaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9CR1JBX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9JTUcgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NQorI2VuZGlmCisKKy8qIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjICovCisjaWZuZGVmIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAgMHg4QzAwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAgMHg4QzAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgMHg4QzAyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HICAgICAgICAgICAgICAgICAgICAgMHg4QzAzCisjZW5kaWYKKworLyogR0xfSU1HX3RleHR1cmVfZW52X2VuaGFuY2VkX2ZpeGVkX2Z1bmN0aW9uICovCisjaWZuZGVmIEdMX0lNR190ZXh0dXJlX2Vudl9lbmhhbmNlZF9maXhlZF9mdW5jdGlvbgorI2RlZmluZSBHTF9NT0RVTEFURV9DT0xPUl9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwNAorI2RlZmluZSBHTF9SRUNJUF9BRERfU0lHTkVEX0FMUEhBX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwNQorI2RlZmluZSBHTF9URVhUVVJFX0FMUEhBX01PRFVMQVRFX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwNgorI2RlZmluZSBHTF9GQUNUT1JfQUxQSEFfTU9EVUxBVEVfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwNworI2RlZmluZSBHTF9GUkFHTUVOVF9BTFBIQV9NT0RVTEFURV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwOAorI2RlZmluZSBHTF9BRERfQkxFTkRfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMwOQorI2RlZmluZSBHTF9ET1QzX1JHQkFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgorI2VuZGlmCisKKy8qIEdMX0lNR191c2VyX2NsaXBfcGxhbmUgKi8KKyNpZm5kZWYgR0xfSU1HX3VzZXJfY2xpcF9wbGFuZQorI2RlZmluZSBHTF9DTElQX1BMQU5FMF9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMAorI2RlZmluZSBHTF9DTElQX1BMQU5FMV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMQorI2RlZmluZSBHTF9DTElQX1BMQU5FMl9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMgorI2RlZmluZSBHTF9DTElQX1BMQU5FM19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwMworI2RlZmluZSBHTF9DTElQX1BMQU5FNF9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNAorI2RlZmluZSBHTF9DTElQX1BMQU5FNV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAwNQorI2RlZmluZSBHTF9NQVhfQ0xJUF9QTEFORVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQzMgorI2VuZGlmCisKKy8qIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0lNRyAgICAgICAgICAgICAgIDB4OTEzNAorI2RlZmluZSBHTF9NQVhfU0FNUExFU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzNQorI2RlZmluZSBHTF9URVhUVVJFX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEzNgorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogTlYgZXh0ZW5zaW9uIHRva2VucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9OVl9mZW5jZSAqLworI2lmbmRlZiBHTF9OVl9mZW5jZQorI2RlZmluZSBHTF9BTExfQ09NUExFVEVEX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGMgorI2RlZmluZSBHTF9GRU5DRV9TVEFUVVNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGMworI2RlZmluZSBHTF9GRU5DRV9DT05ESVRJT05fTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGNAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogUUNPTSBleHRlbnNpb24gdG9rZW5zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KKy8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KKworLyogR0xfUUNPTV9leHRlbmRlZF9nZXQgKi8KKyNpZm5kZWYgR0xfUUNPTV9leHRlbmRlZF9nZXQKKyNkZWZpbmUgR0xfVEVYVFVSRV9XSURUSF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9IRUlHSFRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDQKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9GT1JNQVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9UWVBFX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDcKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTUFHRV9WQUxJRF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDgKKyNkZWZpbmUgR0xfVEVYVFVSRV9OVU1fTEVWRUxTX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCRDkKKyNkZWZpbmUgR0xfVEVYVFVSRV9UQVJHRVRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREEKKyNkZWZpbmUgR0xfVEVYVFVSRV9PQkpFQ1RfVkFMSURfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREIKKyNkZWZpbmUgR0xfU1RBVEVfUkVTVE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCREMKKyNlbmRpZgorCisvKiBHTF9RQ09NX2V4dGVuZGVkX2dldDIgKi8KKy8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KKworLyogR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlICovCisjaWZuZGVmIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZQorI2RlZmluZSBHTF9QRVJGTU9OX0dMT0JBTF9NT0RFX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEZBMAorI2VuZGlmCisKKy8qIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAqLworI2lmbmRlZiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcKKyNkZWZpbmUgR0xfV1JJVEVPTkxZX1JFTkRFUklOR19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MjMKKyNlbmRpZgorCisvKiBHTF9RQ09NX3RpbGVkX3JlbmRlcmluZyAqLworI2lmbmRlZiBHTF9RQ09NX3RpbGVkX3JlbmRlcmluZworI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFbmQgb2YgZXh0ZW5zaW9uIHRva2Vucywgc3RhcnQgb2YgY29ycmVzcG9uZGluZyBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogT0VTIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCisjaWZuZGVmIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAqLworI2lmbmRlZiBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZQorI2RlZmluZSBHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFT0VTUFJPQykgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfYmxlbmRfc3VidHJhY3QgKi8KKyNpZm5kZWYgR0xfT0VTX2JsZW5kX3N1YnRyYWN0CisjZGVmaW5lIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uT0VTIChHTGVudW0gbW9kZSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTk9FU1BST0MpIChHTGVudW0gbW9kZSk7CisjZW5kaWYKKworLyogR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgKi8KKyNpZm5kZWYgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMKKyNkZWZpbmUgR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgMQorI2VuZGlmCisKKy8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZGVwdGgyNCAqLworI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAorI2RlZmluZSBHTF9PRVNfZGVwdGgyNCAxCisjZW5kaWYKKworLyogR0xfT0VTX2RlcHRoMzIgKi8KKyNpZm5kZWYgR0xfT0VTX2RlcHRoMzIKKyNkZWZpbmUgR0xfT0VTX2RlcHRoMzIgMQorI2VuZGlmCisKKy8qIEdMX09FU19kcmF3X3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfT0VTX2RyYXdfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfZHJhd190ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhzT0VTIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhpT0VTIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHN2T0VTIChjb25zdCBHTHNob3J0ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aXZPRVMgKGNvbnN0IEdMaW50ICpjb29yZHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4eHZPRVMgKGNvbnN0IEdMZml4ZWQgKmNvb3Jkcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmT0VTIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhmdk9FUyAoY29uc3QgR0xmbG9hdCAqY29vcmRzKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYU09FU1BST0MpIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhJT0VTUFJPQykgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhTVk9FU1BST0MpIChjb25zdCBHTHNob3J0ICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYSVZPRVNQUk9DKSAoY29uc3QgR0xpbnQgKmNvb3Jkcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhYVk9FU1BST0MpIChjb25zdCBHTGZpeGVkICpjb29yZHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXVEVYRk9FU1BST0MpIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhGVk9FU1BST0MpIChjb25zdCBHTGZsb2F0ICpjb29yZHMpOworI2VuZGlmCisKKy8qIEdMX09FU19FR0xfaW1hZ2UgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2VuZGlmCisKKy8qIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgKi8KKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbAorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDEKKy8qIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgZGVmaW5lZCBpbiBHTF9PRVNfRUdMX2ltYWdlIGFscmVhZHkuICovCisjZW5kaWYKKworLyogR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAqLworI2lmbmRlZiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50CisjZGVmaW5lIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgMQorI2VuZGlmCisKKy8qIEdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZSAqLworI2lmbmRlZiBHTF9PRVNfZXh0ZW5kZWRfbWF0cml4X3BhbGV0dGUKKyNkZWZpbmUgR0xfT0VTX2V4dGVuZGVkX21hdHJpeF9wYWxldHRlIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgKi8KKyNpZm5kZWYgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwCisjZGVmaW5lIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcCAxCisjZW5kaWYKKworLyogR0xfT0VTX2ZpeGVkX3BvaW50ICovCisjaWZuZGVmIEdMX09FU19maXhlZF9wb2ludAorI2RlZmluZSBHTF9PRVNfZml4ZWRfcG9pbnQgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQWxwaGFGdW5jeE9FUyAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3J4T0VTIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGh4T0VTIChHTGNsYW1weCBkZXB0aCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXhPRVMgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjR4T0VTIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZXhPRVMgKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9neE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9neHZPRVMgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bXhPRVMgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmV4T0VTIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Rml4ZWR2T0VTIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldExpZ2h0eHZPRVMgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbHh2T0VTIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZ4dk9FUyAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVseE9FUyAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHh2T0VTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0eE9FUyAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHh2T0VTIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoeE9FUyAoR0xmaXhlZCB3aWR0aCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvYWRNYXRyaXh4T0VTIChjb25zdCBHTGZpeGVkICptKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4T0VTIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0ZXJpYWx4dk9FUyAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdE1hdHJpeHhPRVMgKGNvbnN0IEdMZml4ZWQgKm0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHhPRVMgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbDN4T0VTIChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsT3J0aG94T0VTIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4T0VTIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnh2T0VTIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZXhPRVMgKEdMZml4ZWQgc2l6ZSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4T0VTIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJvdGF0ZXhPRVMgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZXhPRVMgKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2NhbGV4T0VTIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52eE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52eHZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeHZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVHJhbnNsYXRleE9FUyAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQUxQSEFGVU5DWE9FU1BST0MpIChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xFQVJDT0xPUlhPRVNQUk9DKSAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTEVBUkRFUFRIWE9FU1BST0MpIChHTGNsYW1weCBkZXB0aCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMSVBQTEFORVhPRVNQUk9DKSAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTE9SNFhPRVNQUk9DKSAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFUFRIUkFOR0VYT0VTUFJPQykgKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRk9HWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGT0dYVk9FU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSVVNUVU1YT0VTUFJPQykgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRDTElQUExBTkVYT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRGSVhFRFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRMSUdIVFhWT0VTUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRNQVRFUklBTFhWT0VTUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEVOVlhWT0VTUFJPQykgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYUEFSQU1FVEVSWFZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMSUdIVE1PREVMWE9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMSUdIVE1PREVMWFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMSUdIVFhPRVNQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMSUdIVFhWT0VTUFJPQykgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMSU5FV0lEVEhYT0VTUFJPQykgKEdMZml4ZWQgd2lkdGgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMT0FETUFUUklYWE9FU1BST0MpIChjb25zdCBHTGZpeGVkICptKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTUFURVJJQUxYT0VTUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNQVRFUklBTFhWT0VTUFJPQykgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRNQVRSSVhYT0VTUFJPQykgKGNvbnN0IEdMZml4ZWQgKm0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUSVRFWENPT1JENFhPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTk9STUFMM1hPRVNQUk9DKSAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE9SVEhPWE9FU1BST0MpIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJYT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPSU5UUEFSQU1FVEVSWFZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0lOVFNJWkVYT0VTUFJPQykgKEdMZml4ZWQgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPTFlHT05PRkZTRVRYT0VTUFJPQykgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUk9UQVRFWE9FU1BST0MpIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0FNUExFQ09WRVJBR0VYT0VTUFJPQykgKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0NBTEVYT0VTUFJPQykgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhFTlZYT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEVOVlhWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYUEFSQU1FVEVSWE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJYVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRSQU5TTEFURVhPRVNQUk9DKSAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7CisjZW5kaWYKKworLyogR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAqLworI2lmbmRlZiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0CisjZGVmaW5lIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlck9FUyAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRnJhbWVidWZmZXJPRVMgKEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRGcmFtZWJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuRnJhbWVidWZmZXJzT0VTIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKTsKK0dMX0FQSSBHTGVudW0gR0xfQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwT0VTIChHTGVudW0gdGFyZ2V0KTsKKyNlbmRpZgordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTUkVOREVSQlVGRkVST0VTUFJPQykgKEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCSU5EUkVOREVSQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVSRU5ERVJCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOUkVOREVSQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFJFTkRFUkJVRkZFUlBBUkFNRVRFUklWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNGUkFNRUJVRkZFUk9FU1BST0MpIChHTHVpbnQgZnJhbWVidWZmZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCSU5ERlJBTUVCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFRlJBTUVCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5GUkFNRUJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIEdMZW51bSAoR0xfQVBJRU5UUllQIFBGTkdMQ0hFQ0tGUkFNRUJVRkZFUlNUQVRVU09FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJSRU5ERVJCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURlJBTUVCVUZGRVJBVFRBQ0hNRU5UUEFSQU1FVEVSSVZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkVSQVRFTUlQTUFQT0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOworI2VuZGlmCisKKy8qIEdMX09FU19tYXBidWZmZXIgKi8KKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9PRVNfbWFwYnVmZmVyIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCogR0xfQVBJRU5UUlkgZ2xNYXBCdWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbFVubWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqIHBhcmFtcyk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCogKEdMX0FQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKK3R5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfbWF0cml4X2dldCAqLworI2lmbmRlZiBHTF9PRVNfbWF0cml4X2dldAorI2RlZmluZSBHTF9PRVNfbWF0cml4X2dldCAxCisjZW5kaWYKKworLyogR0xfT0VTX21hdHJpeF9wYWxldHRlICovCisjaWZuZGVmIEdMX09FU19tYXRyaXhfcGFsZXR0ZQorI2RlZmluZSBHTF9PRVNfbWF0cml4X3BhbGV0dGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgKHZvaWQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlck9FUyAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENVUlJFTlRQQUxFVFRFTUFUUklYT0VTUFJPQykgKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMT0FEUEFMRVRURUZST01NT0RFTFZJRVdNQVRSSVhPRVNQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1BVFJJWElOREVYUE9JTlRFUk9FU1BST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFdFSUdIVFBPSU5URVJPRVNQUk9DKSAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOworI2VuZGlmCisKKy8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLworI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKKyNlbmRpZgorCisvKiBHTF9PRVNfcXVlcnlfbWF0cml4ICovCisjaWZuZGVmIEdMX09FU19xdWVyeV9tYXRyaXgKKyNkZWZpbmUgR0xfT0VTX3F1ZXJ5X21hdHJpeCAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIEdMYml0ZmllbGQgR0xfQVBJRU5UUlkgZ2xRdWVyeU1hdHJpeHhPRVMgKEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pOworI2VuZGlmCit0eXBlZGVmIEdMYml0ZmllbGQgKEdMX0FQSUVOVFJZUCBQRk5HTFFVRVJZTUFUUklYWE9FU1BST0MpIChHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLworI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAorI2RlZmluZSBHTF9PRVNfcmdiOF9yZ2JhOCAxCisjZW5kaWYKKworLyogR0xfT0VTX3NpbmdsZV9wcmVjaXNpb24gKi8KKyNpZm5kZWYgR0xfT0VTX3NpbmdsZV9wcmVjaXNpb24KKyNkZWZpbmUgR0xfT0VTX3NpbmdsZV9wcmVjaXNpb24gMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWZPRVMgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bWZPRVMgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob2ZPRVMgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmVmT0VTIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0Q2xpcFBsYW5lZk9FUyAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGhmT0VTIChHTGNsYW1wZiBkZXB0aCk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVQVEhSQU5HRUZPRVNQUk9DKSAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUlVTVFVNRk9FU1BST0MpIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMT1JUSE9GT0VTUFJPQykgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVGT0VTUFJPQykgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRDTElQUExBTkVGT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTEVBUkRFUFRIRk9FU1BST0MpIChHTGNsYW1wZiBkZXB0aCk7CisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWwxICovCisjaWZuZGVmIEdMX09FU19zdGVuY2lsMQorI2RlZmluZSBHTF9PRVNfc3RlbmNpbDEgMQorI2VuZGlmCisKKy8qIEdMX09FU19zdGVuY2lsNCAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDQKKyNkZWZpbmUgR0xfT0VTX3N0ZW5jaWw0IDEKKyNlbmRpZgorCisvKiBHTF9PRVNfc3RlbmNpbDggKi8KKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw4CisjZGVmaW5lIEdMX09FU19zdGVuY2lsOCAxCisjZW5kaWYKKworLyogR0xfT0VTX3N0ZW5jaWxfd3JhcCAqLworI2lmbmRlZiBHTF9PRVNfc3RlbmNpbF93cmFwCisjZGVmaW5lIEdMX09FU19zdGVuY2lsX3dyYXAgMQorI2VuZGlmCisKKy8qIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwCisjZGVmaW5lIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuZnZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5pT0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5pdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW54T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbnh2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VuZnZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhHZW5pdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhHZW54dk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VORk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTkZWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5JT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTklWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOWE9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTlhWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhHRU5GVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYR0VOSVZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhHRU5YVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKKyNlbmRpZgorCisvKiBHTF9PRVNfdGV4dHVyZV9lbnZfY3Jvc3NiYXIgKi8KKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyCisjZGVmaW5lIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhciAxCisjZW5kaWYKKworLyogR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0ICovCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgMQorI2VuZGlmCisKKy8qIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0ICovCisjaWZuZGVmIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRWZXJ0ZXhBcnJheU9FUyAoR0x1aW50IGFycmF5KTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuVmVydGV4QXJyYXlzT0VTIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1ZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhBUlJBWU9FU1BST0MpIChHTHVpbnQgYXJyYXkpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVWRVJURVhBUlJBWVNPRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU09FU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK3R5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFSUkFZT0VTUFJPQykgKEdMdWludCBhcnJheSk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBBTUQgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZSAqLworI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZQorI2RlZmluZSBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZSAxCisjZW5kaWYKKworLyogR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUKKyNkZWZpbmUgR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUgMQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogQVBQTEUgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9BUFBMRV90ZXh0dXJlXzJEX2xpbWl0ZWRfbnBvdCAqLworI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlXzJEX2xpbWl0ZWRfbnBvdAorI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlXzJEX2xpbWl0ZWRfbnBvdCAxCisjZW5kaWYKKworLyogR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KKyNpZm5kZWYgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUgKEdMZW51bSwgR0xzaXplaSwgR0xlbnVtLCBHTHNpemVpLCBHTHNpemVpKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSAodm9pZCk7CisjZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBUFBMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRVNPTFZFTVVMVElTQU1QTEVGUkFNRUJVRkZFUkFQUExFUFJPQykgKHZvaWQpOworI2VuZGlmCisKKy8qIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCisjaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4CisjZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IDEKKyNlbmRpZgorCisvKiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAqLworI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbAorI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBBUk0gZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9BUk1fcmdiYTggKi8KKyNpZm5kZWYgR0xfQVJNX3JnYmE4CisjZGVmaW5lIEdMX0FSTV9yZ2JhOCAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBFWFQgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCisjaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKKyNkZWZpbmUgR0xfRVhUX2JsZW5kX21pbm1heCAxCisjZW5kaWYKKworLyogR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgKi8KKyNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKKyNkZWZpbmUgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNDQVJERlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7CisjZW5kaWYKKworLyogR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzICovCisjaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cworI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzRVhUIChHTGVudW0sIEdMaW50ICosIEdMc2l6ZWkgKiwgR0xzaXplaSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpRHJhd0VsZW1lbnRzRVhUIChHTGVudW0sIGNvbnN0IEdMc2l6ZWkgKiwgR0xlbnVtLCBjb25zdCBHTHZvaWQqICosIEdMc2l6ZWkpOworI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorCisvKiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAqLworI2lmbmRlZiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYQorI2RlZmluZSBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAxCisjZW5kaWYKKworLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgMQorI2VuZGlmCisKKy8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IDEKKyNlbmRpZgorCisvKiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAqLworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcworI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9sb2RfYmlhcyAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiBJTUcgZXh0ZW5zaW9uIGZ1bmN0aW9ucworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KKyNpZm5kZWYgR0xfSU1HX3JlYWRfZm9ybWF0CisjZGVmaW5lIEdMX0lNR19yZWFkX2Zvcm1hdCAxCisjZW5kaWYKKworLyogR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgKi8KKyNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMKKyNkZWZpbmUgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgMQorI2VuZGlmCisKKy8qIEdMX0lNR190ZXh0dXJlX2Vudl9lbmhhbmNlZF9maXhlZF9mdW5jdGlvbiAqLworI2lmbmRlZiBHTF9JTUdfdGV4dHVyZV9lbnZfZW5oYW5jZWRfZml4ZWRfZnVuY3Rpb24KKyNkZWZpbmUgR0xfSU1HX3RleHR1cmVfZW52X2VuaGFuY2VkX2ZpeGVkX2Z1bmN0aW9uIDEKKyNlbmRpZgorCisvKiBHTF9JTUdfdXNlcl9jbGlwX3BsYW5lICovCisjaWZuZGVmIEdMX0lNR191c2VyX2NsaXBfcGxhbmUKKyNkZWZpbmUgR0xfSU1HX3VzZXJfY2xpcF9wbGFuZSAxCisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGlwUGxhbmVmSU1HIChHTGVudW0sIGNvbnN0IEdMZmxvYXQgKik7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXhJTUcgKEdMZW51bSwgY29uc3QgR0xmaXhlZCAqKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVGSU1HUFJPQykgKEdMZW51bSBwLCBjb25zdCBHTGZsb2F0ICplcW4pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTElQUExBTkVYSU1HUFJPQykgKEdMZW51bSBwLCBjb25zdCBHTGZpeGVkICplcW4pOworI2VuZGlmCisKKy8qIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KKyNpZm5kZWYgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQorI2RlZmluZSBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRyAoR0xlbnVtLCBHTHNpemVpLCBHTGVudW0sIEdMc2l6ZWksIEdMc2l6ZWkpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HIChHTGVudW0sIEdMZW51bSwgR0xlbnVtLCBHTHVpbnQsIEdMaW50LCBHTHNpemVpKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVJTUcpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRE1VTFRJU0FNUExFSU1HKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqIE5WIGV4dGVuc2lvbiBmdW5jdGlvbnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogTlZfZmVuY2UgKi8KKyNpZm5kZWYgR0xfTlZfZmVuY2UKKyNkZWZpbmUgR0xfTlZfZmVuY2UgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlRmVuY2VzTlYgKEdMc2l6ZWksIGNvbnN0IEdMdWludCAqKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuRmVuY2VzTlYgKEdMc2l6ZWksIEdMdWludCAqKTsKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCk7CitHTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsVGVzdEZlbmNlTlYgKEdMdWludCk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50LCBHTGVudW0sIEdMaW50ICopOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTZXRGZW5jZU5WIChHTHVpbnQsIEdMZW51bSk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFRkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFRFU1RGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZFTkNFSVZOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZJTklTSEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgorICogUUNPTSBleHRlbnNpb24gZnVuY3Rpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KKyNpZm5kZWYgR0xfUUNPTV9kcml2ZXJfY29udHJvbAorI2RlZmluZSBHTF9RQ09NX2RyaXZlcl9jb250cm9sIDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldERyaXZlckNvbnRyb2xzUUNPTSAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gKEdMdWludCBkcml2ZXJDb250cm9sKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURFJJVkVSQ09OVFJPTFNRQ09NUFJPQykgKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTVFJJTkdRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5BQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNBQkxFRFJJVkVSQ09OVFJPTFFDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOworI2VuZGlmCisKKy8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0ICovCisjaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0CisjZGVmaW5lIEdMX1FDT01fZXh0ZW5kZWRfZ2V0IDEKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleHR1cmVzUUNPTSAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlcnNRQ09NIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00gKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00gKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleFN1YkltYWdlUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYVFVSRVNRQ09NUFJPQykgKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUkVOREVSQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEZSQU1FQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWExFVkVMUEFSQU1FVEVSSVZRQ09NUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVFRFWE9CSkVDVFNUQVRFT1ZFUlJJREVJUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYU1VCSU1BR0VRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSUE9JTlRFUlZRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7CisjZW5kaWYKKworLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCisjaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MgorI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldDIgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0U2hhZGVyc1FDT00gKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRQcm9ncmFtc1FDT00gKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00gKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOworI2VuZGlmCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFNIQURFUlNRQ09NUFJPQykgKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNU1FDT01QUk9DKSAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMRVhUSVNQUk9HUkFNQklOQVJZUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFBST0dSQU1CSU5BUllTT1VSQ0VRQ09NUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOworI2VuZGlmCisKKy8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLworI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKKyNkZWZpbmUgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlIDEKKyNlbmRpZgorCisvKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KKyNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCisjZGVmaW5lIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAxCisjZW5kaWYKKworLyogR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgKi8KKyNpZm5kZWYgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcKKyNkZWZpbmUgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgMQorI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU3RhcnRUaWxpbmdRQ09NIChHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRUaWxpbmdRQ09NIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7CisjZW5kaWYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU1RBUlRUSUxJTkdRQ09NUFJPQykgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFRJTElOR1FDT01QUk9DKSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsZXh0X2hfICovCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUy9nbHBsYXRmb3JtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjZlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX19nbHBsYXRmb3JtX2hfCisjZGVmaW5lIF9fZ2xwbGF0Zm9ybV9oXworCisvKiAkUmV2aXNpb246IDEwNjAxICQgb24gJERhdGU6OiAyMDEwLTAzLTA0IDIyOjE1OjI3IC0wODAwICMkICovCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKy8qIFBsYXRmb3JtLXNwZWNpZmljIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBmb3IgT3BlbkdMIEVTIDEuWCAgZ2wuaAorICoKKyAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCisgKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKKyAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKKyAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKKyAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIk9wZW5HTC1FUyIgY29tcG9uZW50ICJSZWdpc3RyeSIuCisgKi8KKworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorCisjaWZuZGVmIEdMX0FQSQorI2RlZmluZSBHTF9BUEkgICAgICBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisjaWZuZGVmIEdMX0FQSUVOVFJZCisjZGVmaW5lIEdMX0FQSUVOVFJZIEtIUk9OT1NfQVBJRU5UUlkKKyNlbmRpZgorCisjZW5kaWYgLyogX19nbHBsYXRmb3JtX2hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMxMlRyYW5zbGF0b3IvYW5nbGVfZ2xlczIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzEyVHJhbnNsYXRvci9hbmdsZV9nbGVzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjViMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMxMlRyYW5zbGF0b3IvYW5nbGVfZ2xlczIuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fVU5ERVJMWUlOR19BUElTX0FOR0xFX0dMRVMyX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX1VOREVSTFlJTkdfQVBJU19BTkdMRV9HTEVTMl9IXworCisjZGVmaW5lIEFOR0xFX0dMRVMyX0lOVEVSRkFDRSAiQU5HTEVfR0xFUzIiCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZGVmcy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiCisjaW5jbHVkZSAiS0hSL2tocnBsYXRmb3JtLmgiCisKKy8vIERlZmluZSBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLgorI2RlZmluZSBHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRShyZXR1cm5fdHlwZSxmdW5jX25hbWUsc2lnbmF0dXJlLGNhbGxhcmdzKSBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoS0hST05PU19BUElFTlRSWSAqIGZ1bmNfbmFtZSAjIyBfdCkgc2lnbmF0dXJlOworCitMSVNUX0dMRVMyX0ZVTkNUSU9OUyhHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRSxHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRSkKKworc3RydWN0IEFOR0xFX0dMRVMyIHsKKyNkZWZpbmUgR0xFUzJfRElTUEFUQ0hfREVDTEFSRV9QT0lOVEVSKHJldHVybl90eXBlLGZ1bmNfbmFtZSxzaWduYXR1cmUsY2FsbGFyZ3MpIFwKKyAgICAgICAgZnVuY19uYW1lICMjIF90IGZ1bmNfbmFtZTsKKyAgICBMSVNUX0dMRVMyX0ZVTkNUSU9OUyhHTEVTMl9ESVNQQVRDSF9ERUNMQVJFX1BPSU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xFUzJfRElTUEFUQ0hfREVDTEFSRV9QT0lOVEVSKQorfTsKKworI2VuZGlmICAvKiBHUkFQSElDU19UUkFOU0xBVElPTl9VTkRFUkxZSU5HX0FQSVNfQU5HTEVfR0xFUzJfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzEyVHJhbnNsYXRvci91bmRlcmx5aW5nX2FwaXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzEyVHJhbnNsYXRvci91bmRlcmx5aW5nX2FwaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI1MTMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9HTEVTMTJUcmFuc2xhdG9yL3VuZGVybHlpbmdfYXBpcy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9VTkRFUkxZSU5HX0FQSVNfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fVU5ERVJMWUlOR19BUElTX0hfCisKKyNpbmNsdWRlICJhbmdsZV9nbGVzMi5oIgorCisvLyBBbmdsZSBVbmRlcmx5aW5nIEFQSVMKK3N0cnVjdCBVbmRlcmx5aW5nQXBpcyB7CisgICAgQU5HTEVfR0xFUzIqIGFuZ2xlOworICAgIC8vIG90aGVyIGVudHJpZXMgaGVyZSBjb3VsZCBhcHBseSB0byBzcGVjaWZpYyBleHRlbnNpb25zLCBsaWtlCisgICAgLy8gICAgY29uc3QgQU5HTEVfR0xFUzJfZXh0ICphbmdsZV9leHQKKyAgICAvLyBhc3N1bWluZyB0aGF0IGlzIGhvdyBVbmRlbHJ5aW5nQXBpcyBpbXBsZW1lbnQgdGhlbQorfTsKK3R5cGVkZWYgVW5kZXJseWluZ0FwaXMgR3JhcGhpY3NBcGlzOworCisvLyBTd2lmdHNoYWRlciBjb3VsZCBvZmZlciBkaWZmZXJlbnQgVW5kZXJseWluZ0FwaXMKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9VTkRFUkxZSU5HX0FQSVNfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzIvZ2wyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMyL2dsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNGQ0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMyL2dsMi5oCkBAIC0wLDAgKzEsNTI1IEBACisjaWZuZGVmIF9fZ2wyX2hfCisjZGVmaW5lIF9fZ2wyX2hfIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBPcGVuR0wgLyBPcGVuR0wgRVMgWE1MCisqKiBBUEkgUmVnaXN0cnkuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJlZ2lzdHJ5LCBnZW5lcmF0b3Igc2NyaXB0cworKiogdXNlZCB0byBtYWtlIHRoZSBoZWFkZXIsIGFuZCB0aGUgaGVhZGVyIGNhbiBiZSBmb3VuZCBhdAorKiogICBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvCisqKgorKiogS2hyb25vcyAkUmV2aXNpb246IDI2Njk2ICQgb24gJERhdGU6IDIwMTQtMDUtMTcgMTQ6NDg6NTUgLTA3MDAgKFNhdCwgMTcgTWF5IDIwMTQpICQKKyovCisKKyNpbmNsdWRlIDxHTEVTMi9nbDJwbGF0Zm9ybS5oPgorCisvKiBHZW5lcmF0ZWQgb24gZGF0ZSAyMDE0MDUxNyAqLworCisvKiBHZW5lcmF0ZWQgQyBoZWFkZXIgZm9yOgorICogQVBJOiBnbGVzMgorICogUHJvZmlsZTogY29tbW9uCisgKiBWZXJzaW9ucyBjb25zaWRlcmVkOiAyXC5bMC05XQorICogVmVyc2lvbnMgZW1pdHRlZDogLioKKyAqIERlZmF1bHQgZXh0ZW5zaW9ucyBpbmNsdWRlZDogTm9uZQorICogQWRkaXRpb25hbCBleHRlbnNpb25zIGluY2x1ZGVkOiBfbm9tYXRjaF9eCisgKiBFeHRlbnNpb25zIHJlbW92ZWQ6IF9ub21hdGNoX14KKyAqLworCisjaWZuZGVmIEdMX0VTX1ZFUlNJT05fMl8wCisjZGVmaW5lIEdMX0VTX1ZFUlNJT05fMl8wIDEKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KK3R5cGVkZWYga2hyb25vc19pbnQ4X3QgR0xieXRlOwordHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgR0xjbGFtcGY7Cit0eXBlZGVmIGtocm9ub3NfaW50MzJfdCBHTGZpeGVkOwordHlwZWRlZiBzaG9ydCBHTHNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKK3R5cGVkZWYgdm9pZCBHTHZvaWQ7Cit0eXBlZGVmIHN0cnVjdCBfX0dMc3luYyAqR0xzeW5jOwordHlwZWRlZiBraHJvbm9zX2ludDY0X3QgR0xpbnQ2NDsKK3R5cGVkZWYga2hyb25vc191aW50NjRfdCBHTHVpbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKK3R5cGVkZWYgY2hhciBHTGNoYXI7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCBHTGZsb2F0OwordHlwZWRlZiBraHJvbm9zX3NzaXplX3QgR0xzaXplaXB0cjsKK3R5cGVkZWYga2hyb25vc19pbnRwdHJfdCBHTGludHB0cjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Cit0eXBlZGVmIGludCBHTGludDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTGJvb2xlYW47Cit0eXBlZGVmIGludCBHTHNpemVpOwordHlwZWRlZiBraHJvbm9zX3VpbnQ4X3QgR0x1Ynl0ZTsKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQorI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAorI2RlZmluZSBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgMHg4ODNECisjZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgIDB4ODAwQgorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENCCisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SICAgICAgIDB4ODAwMgorI2RlZmluZSBHTF9DT05TVEFOVF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAgICAgICAweDgwMDQKKyNkZWZpbmUgR0xfQkxFTkRfQ09MT1IgICAgICAgICAgICAgICAgICAgIDB4ODAwNQorI2RlZmluZSBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAweDg4OTMKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgIDB4ODg5NAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgMHg4ODk1CisjZGVmaW5lIEdMX1NUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTAKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKyNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2CisjZGVmaW5lIEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAweDBCNzAKKyNkZWZpbmUgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEI3MgorI2RlZmluZSBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQjczCisjZGVmaW5lIEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAweDBCNzQKKyNkZWZpbmUgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgIDB4MEI5MQorI2RlZmluZSBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgMHgwQjkyCisjZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2CisjZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgMHgwQjk4CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICAweDg4MDMKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMworI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKKyNkZWZpbmUgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMgorI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCisjZGVmaW5lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBDMjIKKyNkZWZpbmUgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEMyMworI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1CisjZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKKyNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKKyNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQorI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2CisjZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgIDB4MkEwMAorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgIDB4ODE5MgorI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgIDB4MTQwNQorI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgIDB4MTkwMgorI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2CisjZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKKyNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSICAgICAgICAgICAgICAgIDB4OEIzMAorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSICAgICAgICAgICAgICAgICAgMHg4QjMxCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAweDg4NjkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgICAgIDB4OERGQgorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0RAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRDCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAweDg4NzIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyAgIDB4OERGRAorI2RlZmluZSBHTF9TSEFERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0RFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4OEI4MgorI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgMHg4QjgzCisjZGVmaW5lIEdMX0FUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAweDhCODUKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1TICAgICAgICAgICAgICAgIDB4OEI4NgorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICAgICAgMHg4Qjg3CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAweDhCODkKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgIDB4OEI4QQorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgMHg4QjhDCisjZGVmaW5lIEdMX0NVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAweDhCOEQKKyNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisjZGVmaW5lIEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMQorI2RlZmluZSBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAyCisjZGVmaW5lIEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDMKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9JTkNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA3CisjZGVmaW5lIEdMX0RFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDgKKyNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCisjZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKKyNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMworI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCisjZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisjZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAweDg1MTUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAweDg1MTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgMHg4NTFBCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAweDg1MUMKKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1MAorI2RlZmluZSBHTF9GTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgMHg4QjUxCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzQgICAgICAgICAgICAgICAgICAgICAweDhCNTIKKyNkZWZpbmUgR0xfSU5UX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1MworI2RlZmluZSBHTF9JTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU0CisjZGVmaW5lIEdMX0lOVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDhCNTUKKyNkZWZpbmUgR0xfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NgorI2RlZmluZSBHTF9CT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgMHg4QjU3CisjZGVmaW5lIEdMX0JPT0xfVkVDMyAgICAgICAgICAgICAgICAgICAgICAweDhCNTgKKyNkZWZpbmUgR0xfQk9PTF9WRUM0ICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OQorI2RlZmluZSBHTF9GTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgMHg4QjVBCisjZGVmaW5lIEdMX0ZMT0FUX01BVDMgICAgICAgICAgICAgICAgICAgICAweDhCNUIKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1QworI2RlZmluZSBHTF9TQU1QTEVSXzJEICAgICAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgICAgICAweDhCNjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICAgIDB4ODYyMgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAweDg2MjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgMHg4ODZBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAweDg2NDUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAweDhCOUIKKyNkZWZpbmUgR0xfQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9JTkZPX0xPR19MRU5HVEggICAgICAgICAgICAgICAgMHg4Qjg0CisjZGVmaW5lIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICAgICAgICAgICAweDhCODgKKyNkZWZpbmUgR0xfU0hBREVSX0NPTVBJTEVSICAgICAgICAgICAgICAgIDB4OERGQQorI2RlZmluZSBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgICAgMHg4REY4CisjZGVmaW5lIEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAweDhERjkKKyNkZWZpbmUgR0xfTE9XX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4OERGMAorI2RlZmluZSBHTF9NRURJVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgMHg4REYxCisjZGVmaW5lIEdMX0hJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICAweDhERjIKKyNkZWZpbmUgR0xfTE9XX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGMworI2RlZmluZSBHTF9NRURJVU1fSU5UICAgICAgICAgICAgICAgICAgICAgMHg4REY0CisjZGVmaW5lIEdMX0hJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDhERjUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4RDQxCisjZGVmaW5lIEdMX1JHQkE0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYyCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDggICAgICAgICAgICAgICAgIDB4OEQ0OAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgIDB4OEQ0NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgICAgICAgICAgMHg4RDUwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAweDhENTEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAgICAgICAgMHg4RDUzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAweDhENTQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgIDB4OEQ1NQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgMHg4Q0QyCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIDB4OENEMworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMCAgICAgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlQgICAgICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgMHg4Q0Q1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCAweDhDRDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUyAweDhDRDkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgIDB4OENERAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HICAgICAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiAgMHgwNTA2CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBdHRhY2hTaGFkZXIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRDb2xvciAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uIChHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCB2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCBHTGVudW0gR0xfQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xmbG9hdCBkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlUHJvZ3JhbSAodm9pZCk7CitHTF9BUElDQUxMIEdMdWludCBHTF9BUElFTlRSWSBnbENyZWF0ZVNoYWRlciAoR0xlbnVtIHR5cGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoTWFzayAoR0xib29sZWFuIGZsYWcpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMZmxvYXQgbiwgR0xmbG9hdCBmKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCBpbmRleCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmluZGljZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5SZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEF0dGFjaGVkU2hhZGVycyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKnNoYWRlcnMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52IChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0xlbnVtIEdMX0FQSUVOVFJZIGdsR2V0RXJyb3IgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1JbmZvTG9nIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNoYWRlcml2IChHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVySW5mb0xvZyAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQgKnJhbmdlLCBHTGludCAqcHJlY2lzaW9uKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqc291cmNlKTsKK0dMX0FQSUNBTEwgY29uc3QgR0x1Ynl0ZSAqR0xfQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1mdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1Mb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcG9pbnRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlciAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aCAoR0xmbG9hdCB3aWR0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMZmxvYXQgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVyQmluYXJ5IChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKmNvbnN0KnN0cmluZywgY29uc3QgR0xpbnQgKmxlbmd0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0yaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMml2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliMWYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliNGYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3Qgdm9pZCAqcG9pbnRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmIC8qIEdMX0VTX1ZFUlNJT05fMl8wICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9HTEVTMi9nbDJleHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0OWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgKQEAgLTAsMCArMSwxOTMyIEBACisjaWZuZGVmIF9fZ2wyZXh0X2hfCisjZGVmaW5lIF9fZ2wyZXh0X2hfIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBPcGVuR0wgLyBPcGVuR0wgRVMgWE1MCisqKiBBUEkgUmVnaXN0cnkuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJlZ2lzdHJ5LCBnZW5lcmF0b3Igc2NyaXB0cworKiogdXNlZCB0byBtYWtlIHRoZSBoZWFkZXIsIGFuZCB0aGUgaGVhZGVyIGNhbiBiZSBmb3VuZCBhdAorKiogICBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvCisqKgorKiogS2hyb25vcyAkUmV2aXNpb24kIG9uICREYXRlJAorKi8KKworI2lmbmRlZiBHTF9BUElFTlRSWVAKKyNkZWZpbmUgR0xfQVBJRU5UUllQIEdMX0FQSUVOVFJZKgorI2VuZGlmCisKKy8qIEdlbmVyYXRlZCBvbiBkYXRlIDIwMTQwNTE5ICovCisKKy8qIEdlbmVyYXRlZCBDIGhlYWRlciBmb3I6CisgKiBBUEk6IGdsZXMyCisgKiBQcm9maWxlOiBjb21tb24KKyAqIFZlcnNpb25zIGNvbnNpZGVyZWQ6IDJcLlswLTldCisgKiBWZXJzaW9ucyBlbWl0dGVkOiBfbm9tYXRjaF9eCisgKiBEZWZhdWx0IGV4dGVuc2lvbnMgaW5jbHVkZWQ6IGdsZXMyCisgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgaW5jbHVkZWQ6IF9ub21hdGNoX14KKyAqIEV4dGVuc2lvbnMgcmVtb3ZlZDogX25vbWF0Y2hfXgorICovCisKKyNpZm5kZWYgR0xfS0hSX2JsZW5kX2VxdWF0aW9uX2FkdmFuY2VkCisjZGVmaW5lIEdMX0tIUl9ibGVuZF9lcXVhdGlvbl9hZHZhbmNlZCAxCisjZGVmaW5lIEdMX0JMRU5EX0FEVkFOQ0VEX0NPSEVSRU5UX0tIUiAgICAweDkyODUKKyNkZWZpbmUgR0xfTVVMVElQTFlfS0hSICAgICAgICAgICAgICAgICAgIDB4OTI5NAorI2RlZmluZSBHTF9TQ1JFRU5fS0hSICAgICAgICAgICAgICAgICAgICAgMHg5Mjk1CisjZGVmaW5lIEdMX09WRVJMQVlfS0hSICAgICAgICAgICAgICAgICAgICAweDkyOTYKKyNkZWZpbmUgR0xfREFSS0VOX0tIUiAgICAgICAgICAgICAgICAgICAgIDB4OTI5NworI2RlZmluZSBHTF9MSUdIVEVOX0tIUiAgICAgICAgICAgICAgICAgICAgMHg5Mjk4CisjZGVmaW5lIEdMX0NPTE9SRE9ER0VfS0hSICAgICAgICAgICAgICAgICAweDkyOTkKKyNkZWZpbmUgR0xfQ09MT1JCVVJOX0tIUiAgICAgICAgICAgICAgICAgIDB4OTI5QQorI2RlZmluZSBHTF9IQVJETElHSFRfS0hSICAgICAgICAgICAgICAgICAgMHg5MjlCCisjZGVmaW5lIEdMX1NPRlRMSUdIVF9LSFIgICAgICAgICAgICAgICAgICAweDkyOUMKKyNkZWZpbmUgR0xfRElGRkVSRU5DRV9LSFIgICAgICAgICAgICAgICAgIDB4OTI5RQorI2RlZmluZSBHTF9FWENMVVNJT05fS0hSICAgICAgICAgICAgICAgICAgMHg5MkEwCisjZGVmaW5lIEdMX0hTTF9IVUVfS0hSICAgICAgICAgICAgICAgICAgICAweDkyQUQKKyNkZWZpbmUgR0xfSFNMX1NBVFVSQVRJT05fS0hSICAgICAgICAgICAgIDB4OTJBRQorI2RlZmluZSBHTF9IU0xfQ09MT1JfS0hSICAgICAgICAgICAgICAgICAgMHg5MkFGCisjZGVmaW5lIEdMX0hTTF9MVU1JTk9TSVRZX0tIUiAgICAgICAgICAgICAweDkyQjAKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRCQVJSSUVSS0hSUFJPQykgKHZvaWQpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kQmFycmllcktIUiAodm9pZCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9LSFJfYmxlbmRfZXF1YXRpb25fYWR2YW5jZWQgKi8KKworI2lmbmRlZiBHTF9LSFJfZGVidWcKKyNkZWZpbmUgR0xfS0hSX2RlYnVnIDEKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUlkgICpHTERFQlVHUFJPQ0tIUikoR0xlbnVtIHNvdXJjZSxHTGVudW0gdHlwZSxHTHVpbnQgaWQsR0xlbnVtIHNldmVyaXR5LEdMc2l6ZWkgbGVuZ3RoLGNvbnN0IEdMY2hhciAqbWVzc2FnZSxjb25zdCB2b2lkICp1c2VyUGFyYW0pOworI2RlZmluZSBHTF9TQU1QTEVSICAgICAgICAgICAgICAgICAgICAgICAgMHg4MkU2CisjZGVmaW5lIEdMX0RFQlVHX09VVFBVVF9TWU5DSFJPTk9VU19LSFIgICAweDgyNDIKKyNkZWZpbmUgR0xfREVCVUdfTkVYVF9MT0dHRURfTUVTU0FHRV9MRU5HVEhfS0hSIDB4ODI0MworI2RlZmluZSBHTF9ERUJVR19DQUxMQkFDS19GVU5DVElPTl9LSFIgICAgMHg4MjQ0CisjZGVmaW5lIEdMX0RFQlVHX0NBTExCQUNLX1VTRVJfUEFSQU1fS0hSICAweDgyNDUKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX0FQSV9LSFIgICAgICAgICAgIDB4ODI0NgorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfV0lORE9XX1NZU1RFTV9LSFIgMHg4MjQ3CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9TSEFERVJfQ09NUElMRVJfS0hSIDB4ODI0OAorI2RlZmluZSBHTF9ERUJVR19TT1VSQ0VfVEhJUkRfUEFSVFlfS0hSICAgMHg4MjQ5CisjZGVmaW5lIEdMX0RFQlVHX1NPVVJDRV9BUFBMSUNBVElPTl9LSFIgICAweDgyNEEKKyNkZWZpbmUgR0xfREVCVUdfU09VUkNFX09USEVSX0tIUiAgICAgICAgIDB4ODI0QgorI2RlZmluZSBHTF9ERUJVR19UWVBFX0VSUk9SX0tIUiAgICAgICAgICAgMHg4MjRDCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfREVQUkVDQVRFRF9CRUhBVklPUl9LSFIgMHg4MjRECisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfVU5ERUZJTkVEX0JFSEFWSU9SX0tIUiAweDgyNEUKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9QT1JUQUJJTElUWV9LSFIgICAgIDB4ODI0RgorI2RlZmluZSBHTF9ERUJVR19UWVBFX1BFUkZPUk1BTkNFX0tIUiAgICAgMHg4MjUwCisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfT1RIRVJfS0hSICAgICAgICAgICAweDgyNTEKKyNkZWZpbmUgR0xfREVCVUdfVFlQRV9NQVJLRVJfS0hSICAgICAgICAgIDB4ODI2OAorI2RlZmluZSBHTF9ERUJVR19UWVBFX1BVU0hfR1JPVVBfS0hSICAgICAgMHg4MjY5CisjZGVmaW5lIEdMX0RFQlVHX1RZUEVfUE9QX0dST1VQX0tIUiAgICAgICAweDgyNkEKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfTk9USUZJQ0FUSU9OX0tIUiAweDgyNkIKKyNkZWZpbmUgR0xfTUFYX0RFQlVHX0dST1VQX1NUQUNLX0RFUFRIX0tIUiAweDgyNkMKKyNkZWZpbmUgR0xfREVCVUdfR1JPVVBfU1RBQ0tfREVQVEhfS0hSICAgIDB4ODI2RAorI2RlZmluZSBHTF9CVUZGRVJfS0hSICAgICAgICAgICAgICAgICAgICAgMHg4MkUwCisjZGVmaW5lIEdMX1NIQURFUl9LSFIgICAgICAgICAgICAgICAgICAgICAweDgyRTEKKyNkZWZpbmUgR0xfUFJPR1JBTV9LSFIgICAgICAgICAgICAgICAgICAgIDB4ODJFMgorI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfS0hSICAgICAgICAgICAgICAgMHg4MDc0CisjZGVmaW5lIEdMX1FVRVJZX0tIUiAgICAgICAgICAgICAgICAgICAgICAweDgyRTMKKyNkZWZpbmUgR0xfU0FNUExFUl9LSFIgICAgICAgICAgICAgICAgICAgIDB4ODJFNgorI2RlZmluZSBHTF9NQVhfTEFCRUxfTEVOR1RIX0tIUiAgICAgICAgICAgMHg4MkU4CisjZGVmaW5lIEdMX01BWF9ERUJVR19NRVNTQUdFX0xFTkdUSF9LSFIgICAweDkxNDMKKyNkZWZpbmUgR0xfTUFYX0RFQlVHX0xPR0dFRF9NRVNTQUdFU19LSFIgIDB4OTE0NAorI2RlZmluZSBHTF9ERUJVR19MT0dHRURfTUVTU0FHRVNfS0hSICAgICAgMHg5MTQ1CisjZGVmaW5lIEdMX0RFQlVHX1NFVkVSSVRZX0hJR0hfS0hSICAgICAgICAweDkxNDYKKyNkZWZpbmUgR0xfREVCVUdfU0VWRVJJVFlfTUVESVVNX0tIUiAgICAgIDB4OTE0NworI2RlZmluZSBHTF9ERUJVR19TRVZFUklUWV9MT1dfS0hSICAgICAgICAgMHg5MTQ4CisjZGVmaW5lIEdMX0RFQlVHX09VVFBVVF9LSFIgICAgICAgICAgICAgICAweDkyRTAKKyNkZWZpbmUgR0xfQ09OVEVYVF9GTEFHX0RFQlVHX0JJVF9LSFIgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1dfS0hSICAgICAgICAgICAgIDB4MDUwMworI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1dfS0hSICAgICAgICAgICAgMHgwNTA0Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFQlVHTUVTU0FHRUNPTlRST0xLSFJQUk9DKSAoR0xlbnVtIHNvdXJjZSwgR0xlbnVtIHR5cGUsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICppZHMsIEdMYm9vbGVhbiBlbmFibGVkKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFSU5TRVJUS0hSUFJPQykgKEdMZW51bSBzb3VyY2UsIEdMZW51bSB0eXBlLCBHTHVpbnQgaWQsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqYnVmKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVCVUdNRVNTQUdFQ0FMTEJBQ0tLSFJQUk9DKSAoR0xERUJVR1BST0NLSFIgY2FsbGJhY2ssIGNvbnN0IHZvaWQgKnVzZXJQYXJhbSk7Cit0eXBlZGVmIEdMdWludCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUREVCVUdNRVNTQUdFTE9HS0hSUFJPQykgKEdMdWludCBjb3VudCwgR0xzaXplaSBidWZTaXplLCBHTGVudW0gKnNvdXJjZXMsIEdMZW51bSAqdHlwZXMsIEdMdWludCAqaWRzLCBHTGVudW0gKnNldmVyaXRpZXMsIEdMc2l6ZWkgKmxlbmd0aHMsIEdMY2hhciAqbWVzc2FnZUxvZyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBVU0hERUJVR0dST1VQS0hSUFJPQykgKEdMZW51bSBzb3VyY2UsIEdMdWludCBpZCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWVzc2FnZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPUERFQlVHR1JPVVBLSFJQUk9DKSAodm9pZCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE9CSkVDVExBQkVMS0hSUFJPQykgKEdMZW51bSBpZGVudGlmaWVyLCBHTHVpbnQgbmFtZSwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RMQUJFTEtIUlBST0MpIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMT0JKRUNUUFRSTEFCRUxLSFJQUk9DKSAoY29uc3Qgdm9pZCAqcHRyLCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE9CSkVDVFBUUkxBQkVMS0hSUFJPQykgKGNvbnN0IHZvaWQgKnB0ciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQT0lOVEVSVktIUlBST0MpIChHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlYnVnTWVzc2FnZUNvbnRyb2xLSFIgKEdMZW51bSBzb3VyY2UsIEdMZW51bSB0eXBlLCBHTGVudW0gc2V2ZXJpdHksIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqaWRzLCBHTGJvb2xlYW4gZW5hYmxlZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWJ1Z01lc3NhZ2VJbnNlcnRLSFIgKEdMZW51bSBzb3VyY2UsIEdMZW51bSB0eXBlLCBHTHVpbnQgaWQsIEdMZW51bSBzZXZlcml0eSwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqYnVmKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlYnVnTWVzc2FnZUNhbGxiYWNrS0hSIChHTERFQlVHUFJPQ0tIUiBjYWxsYmFjaywgY29uc3Qgdm9pZCAqdXNlclBhcmFtKTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsR2V0RGVidWdNZXNzYWdlTG9nS0hSIChHTHVpbnQgY291bnQsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xlbnVtICpzb3VyY2VzLCBHTGVudW0gKnR5cGVzLCBHTHVpbnQgKmlkcywgR0xlbnVtICpzZXZlcml0aWVzLCBHTHNpemVpICpsZW5ndGhzLCBHTGNoYXIgKm1lc3NhZ2VMb2cpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHVzaERlYnVnR3JvdXBLSFIgKEdMZW51bSBzb3VyY2UsIEdMdWludCBpZCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWVzc2FnZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb3BEZWJ1Z0dyb3VwS0hSICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE9iamVjdExhYmVsS0hSIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG5hbWUsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldE9iamVjdExhYmVsS0hSIChHTGVudW0gaWRlbnRpZmllciwgR0x1aW50IG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE9iamVjdFB0ckxhYmVsS0hSIChjb25zdCB2b2lkICpwdHIsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldE9iamVjdFB0ckxhYmVsS0hSIChjb25zdCB2b2lkICpwdHIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBvaW50ZXJ2S0hSIChHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworI2VuZGlmCisjZW5kaWYgLyogR0xfS0hSX2RlYnVnICovCisKKyNpZm5kZWYgR0xfS0hSX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIKKyNkZWZpbmUgR0xfS0hSX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIgMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSICAgMHg5M0IwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzV4NF9LSFIgICAweDkzQjEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg1X0tIUiAgIDB4OTNCMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSICAgMHg5M0IzCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nl9LSFIgICAweDkzQjQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg1X0tIUiAgIDB4OTNCNQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSICAgMHg5M0I2CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzh4OF9LSFIgICAweDkzQjcKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4NV9LSFIgIDB4OTNCOAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg2X0tIUiAgMHg5M0I5CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzEweDhfS0hSICAweDkzQkEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSIDB4OTNCQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFIgMHg5M0JDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUiAweDkzQkQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ180eDRfS0hSIDB4OTNEMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NF9LSFIgMHg5M0QxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUiAweDkzRDIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDVfS0hSIDB4OTNEMworI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9LSFIgMHg5M0Q0CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUiAweDkzRDUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDZfS0hSIDB4OTNENgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4OF9LSFIgMHg5M0Q3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFIgMHg5M0Q4CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFIgMHg5M0Q5CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFIgMHg5M0RBCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4MTBfS0hSIDB4OTNEQgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0tIUiAweDkzREMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMl9LSFIgMHg5M0RECisjZW5kaWYgLyogR0xfS0hSX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19oZHIgKi8KKworI2lmbmRlZiBHTF9LSFJfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2xkcgorI2RlZmluZSBHTF9LSFJfdGV4dHVyZV9jb21wcmVzc2lvbl9hc3RjX2xkciAxCisjZW5kaWYgLyogR0xfS0hSX3RleHR1cmVfY29tcHJlc3Npb25fYXN0Y19sZHIgKi8KKworI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCisjZGVmaW5lIEdMX09FU19FR0xfaW1hZ2UgMQordHlwZWRlZiB2b2lkICpHTGVnbEltYWdlT0VTOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFRFWFRVUkUyRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRUdMSU1BR0VUQVJHRVRSRU5ERVJCVUZGRVJTVE9SQUdFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9PRVNfRUdMX2ltYWdlICovCisKKyNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbAorI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgICAgICAgICAgIDB4OEQ2NQorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTICAgMHg4RDY3CisjZGVmaW5lIEdMX1JFUVVJUkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfT0VTIDB4OEQ2OAorI2RlZmluZSBHTF9TQU1QTEVSX0VYVEVSTkFMX09FUyAgICAgICAgICAgMHg4RDY2CisjZW5kaWYgLyogR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAqLworCisjaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCisjZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIDEKKyNkZWZpbmUgR0xfRVRDMV9SR0I4X09FUyAgICAgICAgICAgICAgICAgIDB4OEQ2NAorI2VuZGlmIC8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCisKKyNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZQorI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIDEKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5MAorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4QjkxCisjZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTIKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5MworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk0CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTUKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5NgorI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4Qjk3CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTgKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5OQorI2VuZGlmIC8qIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgKi8KKworI2lmbmRlZiBHTF9PRVNfZGVwdGgyNAorI2RlZmluZSBHTF9PRVNfZGVwdGgyNCAxCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUyAgICAgICAgICAweDgxQTYKKyNlbmRpZiAvKiBHTF9PRVNfZGVwdGgyNCAqLworCisjaWZuZGVmIEdMX09FU19kZXB0aDMyCisjZGVmaW5lIEdMX09FU19kZXB0aDMyIDEKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJfT0VTICAgICAgICAgIDB4ODFBNworI2VuZGlmIC8qIEdMX09FU19kZXB0aDMyICovCisKKyNpZm5kZWYgR0xfT0VTX2RlcHRoX3RleHR1cmUKKyNkZWZpbmUgR0xfT0VTX2RlcHRoX3RleHR1cmUgMQorI2VuZGlmIC8qIEdMX09FU19kZXB0aF90ZXh0dXJlICovCisKKyNpZm5kZWYgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludAorI2RlZmluZSBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50IDEKKyNlbmRpZiAvKiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICovCisKKyNpZm5kZWYgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwCisjZGVmaW5lIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcCAxCisjZW5kaWYgLyogR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICovCisKKyNpZm5kZWYgR0xfT0VTX2ZyYWdtZW50X3ByZWNpc2lvbl9oaWdoCisjZGVmaW5lIEdMX09FU19mcmFnbWVudF9wcmVjaXNpb25faGlnaCAxCisjZW5kaWYgLyogR0xfT0VTX2ZyYWdtZW50X3ByZWNpc2lvbl9oaWdoICovCisKKyNpZm5kZWYgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeQorI2RlZmluZSBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5IDEKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIX09FUyAgICAgIDB4ODc0MQorI2RlZmluZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMgMHg4N0ZFCisjZGVmaW5lIEdMX1BST0dSQU1fQklOQVJZX0ZPUk1BVFNfT0VTICAgICAweDg3RkYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTUJJTkFSWU9FU1BST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCB2b2lkICpiaW5hcnkpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNQklOQVJZT0VTUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCB2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbUJpbmFyeU9FUyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgdm9pZCAqYmluYXJ5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1CaW5hcnlPRVMgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCB2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5ICovCisKKyNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgorI2RlZmluZSBHTF9PRVNfbWFwYnVmZmVyIDEKKyNkZWZpbmUgR0xfV1JJVEVfT05MWV9PRVMgICAgICAgICAgICAgICAgIDB4ODhCOQorI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgMHg4OEJCCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRURfT0VTICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX09FUyAgICAgICAgIDB4ODhCRAordHlwZWRlZiB2b2lkICooR0xfQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCAqR0xfQVBJRU5UUlkgZ2xNYXBCdWZmZXJPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQb2ludGVydk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcGFyYW1zKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX09FU19tYXBidWZmZXIgKi8KKworI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKKyNkZWZpbmUgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgIDB4ODRGOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOF9PRVMgICAgICAgICAgMHg4NEZBCisjZGVmaW5lIEdMX0RFUFRIMjRfU1RFTkNJTDhfT0VTICAgICAgICAgICAweDg4RjAKKyNlbmRpZiAvKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KKworI2lmbmRlZiBHTF9PRVNfcmVxdWlyZWRfaW50ZXJuYWxmb3JtYXQKKyNkZWZpbmUgR0xfT0VTX3JlcXVpcmVkX2ludGVybmFsZm9ybWF0IDEKKyNkZWZpbmUgR0xfQUxQSEE4X09FUyAgICAgICAgICAgICAgICAgICAgIDB4ODAzQworI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVMgICAgICAgICAgMHg4MUE1CisjZGVmaW5lIEdMX0xVTUlOQU5DRTRfQUxQSEE0X09FUyAgICAgICAgICAweDgwNDMKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9BTFBIQThfT0VTICAgICAgICAgIDB4ODA0NQorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X09FUyAgICAgICAgICAgICAgICAgMHg4MDQwCisjZGVmaW5lIEdMX1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgMHg4RDYyCisjZGVmaW5lIEdMX1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAweDgwNTEKKyNkZWZpbmUgR0xfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAorI2RlZmluZSBHTF9SR0IxMF9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MDUyCisjZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAweDgwNTkKKyNlbmRpZiAvKiBHTF9PRVNfcmVxdWlyZWRfaW50ZXJuYWxmb3JtYXQgKi8KKworI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAorI2RlZmluZSBHTF9PRVNfcmdiOF9yZ2JhOCAxCisjZW5kaWYgLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KKworI2lmbmRlZiBHTF9PRVNfc2FtcGxlX3NoYWRpbmcKKyNkZWZpbmUgR0xfT0VTX3NhbXBsZV9zaGFkaW5nIDEKKyNkZWZpbmUgR0xfU0FNUExFX1NIQURJTkdfT0VTICAgICAgICAgICAgIDB4OEMzNgorI2RlZmluZSBHTF9NSU5fU0FNUExFX1NIQURJTkdfVkFMVUVfT0VTICAgMHg4QzM3Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1JTlNBTVBMRVNIQURJTkdPRVNQUk9DKSAoR0xmbG9hdCB2YWx1ZSk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTWluU2FtcGxlU2hhZGluZ09FUyAoR0xmbG9hdCB2YWx1ZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9PRVNfc2FtcGxlX3NoYWRpbmcgKi8KKworI2lmbmRlZiBHTF9PRVNfc2FtcGxlX3ZhcmlhYmxlcworI2RlZmluZSBHTF9PRVNfc2FtcGxlX3ZhcmlhYmxlcyAxCisjZW5kaWYgLyogR0xfT0VTX3NhbXBsZV92YXJpYWJsZXMgKi8KKworI2lmbmRlZiBHTF9PRVNfc2hhZGVyX2ltYWdlX2F0b21pYworI2RlZmluZSBHTF9PRVNfc2hhZGVyX2ltYWdlX2F0b21pYyAxCisjZW5kaWYgLyogR0xfT0VTX3NoYWRlcl9pbWFnZV9hdG9taWMgKi8KKworI2lmbmRlZiBHTF9PRVNfc2hhZGVyX211bHRpc2FtcGxlX2ludGVycG9sYXRpb24KKyNkZWZpbmUgR0xfT0VTX3NoYWRlcl9tdWx0aXNhbXBsZV9pbnRlcnBvbGF0aW9uIDEKKyNkZWZpbmUgR0xfTUlOX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX09FUyAweDhFNUIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0lOVEVSUE9MQVRJT05fT0ZGU0VUX09FUyAweDhFNUMKKyNkZWZpbmUgR0xfRlJBR01FTlRfSU5URVJQT0xBVElPTl9PRkZTRVRfQklUU19PRVMgMHg4RTVECisjZW5kaWYgLyogR0xfT0VTX3NoYWRlcl9tdWx0aXNhbXBsZV9pbnRlcnBvbGF0aW9uICovCisKKyNpZm5kZWYgR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzCisjZGVmaW5lIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlRfT0VTIDB4OEI4QgorI2VuZGlmIC8qIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAqLworCisjaWZuZGVmIEdMX09FU19zdGVuY2lsMQorI2RlZmluZSBHTF9PRVNfc3RlbmNpbDEgMQorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgMHg4RDQ2CisjZW5kaWYgLyogR0xfT0VTX3N0ZW5jaWwxICovCisKKyNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0CisjZGVmaW5lIEdMX09FU19zdGVuY2lsNCAxCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAweDhENDcKKyNlbmRpZiAvKiBHTF9PRVNfc3RlbmNpbDQgKi8KKworI2lmbmRlZiBHTF9PRVNfc3VyZmFjZWxlc3NfY29udGV4dAorI2RlZmluZSBHTF9PRVNfc3VyZmFjZWxlc3NfY29udGV4dCAxCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOREVGSU5FRF9PRVMgICAgICAweDgyMTkKKyNlbmRpZiAvKiBHTF9PRVNfc3VyZmFjZWxlc3NfY29udGV4dCAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlXzNECisjZGVmaW5lIEdMX09FU190ZXh0dXJlXzNEIDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1JfT0VTICAgICAgICAgICAgIDB4ODA3MgorI2RlZmluZSBHTF9URVhUVVJFXzNEX09FUyAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18zRF9PRVMgICAgICAgICAweDgwNkEKKyNkZWZpbmUgR0xfTUFYXzNEX1RFWFRVUkVfU0laRV9PRVMgICAgICAgIDB4ODA3MworI2RlZmluZSBHTF9TQU1QTEVSXzNEX09FUyAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV8zRF9aT0ZGU0VUX09FUyAweDhDRDQKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT1BZVEVYU1VCSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9PRVNfdGV4dHVyZV8zRCAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2NvbXByZXNzaW9uX2FzdGMKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfY29tcHJlc3Npb25fYXN0YyAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzN4M3gzX09FUyAweDkzQzAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNHgzeDNfT0VTIDB4OTNDMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ180eDR4M19PRVMgMHg5M0MyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzR4NHg0X09FUyAweDkzQzMKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg0eDRfT0VTIDB4OTNDNAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ181eDV4NF9PRVMgMHg5M0M1CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzV4NXg1X09FUyAweDkzQzYKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX0FTVENfNng1eDVfT0VTIDB4OTNDNworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfQVNUQ182eDZ4NV9PRVMgMHg5M0M4CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9BU1RDXzZ4Nng2X09FUyAweDkzQzkKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18zeDN4M19PRVMgMHg5M0UwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNHgzeDNfT0VTIDB4OTNFMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NHgzX09FUyAweDkzRTIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ180eDR4NF9PRVMgMHg5M0UzCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg0eDRfT0VTIDB4OTNFNAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NXg0X09FUyAweDkzRTUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDV4NV9PRVMgMHg5M0U2CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNng1eDVfT0VTIDB4OTNFNworI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nng1X09FUyAweDkzRTgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZ4Nl9PRVMgMHg5M0U5CisjZW5kaWYgLyogR0xfT0VTX3RleHR1cmVfY29tcHJlc3Npb25fYXN0YyAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2Zsb2F0CisjZGVmaW5lIEdMX09FU190ZXh0dXJlX2Zsb2F0IDEKKyNlbmRpZiAvKiBHTF9PRVNfdGV4dHVyZV9mbG9hdCAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcgorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIgMQorI2VuZGlmIC8qIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCAxCisjZGVmaW5lIEdMX0hBTEZfRkxPQVRfT0VTICAgICAgICAgICAgICAgICAweDhENjEKKyNlbmRpZiAvKiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0ICovCisKKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgMQorI2VuZGlmIC8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyICovCisKKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfbnBvdAorI2RlZmluZSBHTF9PRVNfdGV4dHVyZV9ucG90IDEKKyNlbmRpZiAvKiBHTF9PRVNfdGV4dHVyZV9ucG90ICovCisKKyNpZm5kZWYgR0xfT0VTX3RleHR1cmVfc3RlbmNpbDgKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfc3RlbmNpbDggMQorI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYX09FUyAgICAgICAgICAgICAgMHgxOTAxCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4X09FUyAgICAgICAgICAgICAweDhENDgKKyNlbmRpZiAvKiBHTF9PRVNfdGV4dHVyZV9zdGVuY2lsOCAqLworCisjaWZuZGVmIEdMX09FU190ZXh0dXJlX3N0b3JhZ2VfbXVsdGlzYW1wbGVfMmRfYXJyYXkKKyNkZWZpbmUgR0xfT0VTX3RleHR1cmVfc3RvcmFnZV9tdWx0aXNhbXBsZV8yZF9hcnJheSAxCisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEVfQVJSQVlfT0VTIDB4OTEwMgorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfTVVMVElTQU1QTEVfQVJSQVlfT0VTIDB4OTEwNQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX01VTFRJU0FNUExFX0FSUkFZX09FUyAweDkxMEIKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfTVVMVElTQU1QTEVfQVJSQVlfT0VTIDB4OTEwQworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRV9BUlJBWV9PRVMgMHg5MTBECit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UzRE1VTFRJU0FNUExFT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xib29sZWFuIGZpeGVkc2FtcGxlbG9jYXRpb25zKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdG9yYWdlM0RNdWx0aXNhbXBsZU9FUyAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGJvb2xlYW4gZml4ZWRzYW1wbGVsb2NhdGlvbnMpOworI2VuZGlmCisjZW5kaWYgLyogR0xfT0VTX3RleHR1cmVfc3RvcmFnZV9tdWx0aXNhbXBsZV8yZF9hcnJheSAqLworCisjaWZuZGVmIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0CisjZGVmaW5lIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IDEKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkdfT0VTICAgICAgIDB4ODVCNQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCSU5EVkVSVEVYQVJSQVlPRVNQUk9DKSAoR0x1aW50IGFycmF5KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFVkVSVEVYQVJSQVlTT0VTUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5WRVJURVhBUlJBWVNPRVNQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNWRVJURVhBUlJBWU9FU1BST0MpIChHTHVpbnQgYXJyYXkpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRWZXJ0ZXhBcnJheU9FUyAoR0x1aW50IGFycmF5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1ZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOworI2VuZGlmCisjZW5kaWYgLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KKworI2lmbmRlZiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQKKyNkZWZpbmUgR0xfT0VTX3ZlcnRleF9oYWxmX2Zsb2F0IDEKKyNlbmRpZiAvKiBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgKi8KKworI2lmbmRlZiBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMgorI2RlZmluZSBHTF9PRVNfdmVydGV4X3R5cGVfMTBfMTBfMTBfMiAxCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMF8xMF8xMF8yX09FUyAgICAweDhERjYKKyNkZWZpbmUgR0xfSU5UXzEwXzEwXzEwXzJfT0VTICAgICAgICAgICAgIDB4OERGNworI2VuZGlmIC8qIEdMX09FU192ZXJ0ZXhfdHlwZV8xMF8xMF8xMF8yICovCisKKyNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUKKyNkZWZpbmUgR0xfQU1EX2NvbXByZXNzZWRfM0RDX3RleHR1cmUgMQorI2RlZmluZSBHTF8zRENfWF9BTUQgICAgICAgICAgICAgICAgICAgICAgMHg4N0Y5CisjZGVmaW5lIEdMXzNEQ19YWV9BTUQgICAgICAgICAgICAgICAgICAgICAweDg3RkEKKyNlbmRpZiAvKiBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZSAqLworCisjaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlCisjZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlIDEKKyNkZWZpbmUgR0xfQVRDX1JHQl9BTUQgICAgICAgICAgICAgICAgICAgIDB4OEM5MgorI2RlZmluZSBHTF9BVENfUkdCQV9FWFBMSUNJVF9BTFBIQV9BTUQgICAgMHg4QzkzCisjZGVmaW5lIEdMX0FUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQV9BTUQgMHg4N0VFCisjZW5kaWYgLyogR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUgKi8KKworI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgorI2RlZmluZSBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAxCisjZGVmaW5lIEdMX0NPVU5URVJfVFlQRV9BTUQgICAgICAgICAgICAgICAweDhCQzAKKyNkZWZpbmUgR0xfQ09VTlRFUl9SQU5HRV9BTUQgICAgICAgICAgICAgIDB4OEJDMQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ2NF9BTUQgICAgICAgICAgICAgMHg4QkMyCisjZGVmaW5lIEdMX1BFUkNFTlRBR0VfQU1EICAgICAgICAgICAgICAgICAweDhCQzMKKyNkZWZpbmUgR0xfUEVSRk1PTl9SRVNVTFRfQVZBSUxBQkxFX0FNRCAgIDB4OEJDNAorI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9TSVpFX0FNRCAgICAgICAgMHg4QkM1CisjZGVmaW5lIEdMX1BFUkZNT05fUkVTVUxUX0FNRCAgICAgICAgICAgICAweDhCQzYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JHUk9VUFNBTURQUk9DKSAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3Vwcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUlNUUklOR0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JDT1VOVEVSSU5GT0FNRFBST0MpIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5QRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUEVSRk1PTklUT1JTQU1EUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNFTEVDVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlckxpc3QpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCRUdJTlBFUkZNT05JVE9SQU1EUFJPQykgKEdMdWludCBtb25pdG9yKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUEVSRk1PTklUT1JBTURQUk9DKSAoR0x1aW50IG1vbml0b3IpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJEQVRBQU1EUFJPQykgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTGVudW0gcG5hbWUsIHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlckxpc3QpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmVnaW5QZXJmTW9uaXRvckFNRCAoR0x1aW50IG1vbml0b3IpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUGVyZk1vbml0b3JBTUQgKEdMdWludCBtb25pdG9yKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQgKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbik7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAqLworCisjaWZuZGVmIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwCisjZGVmaW5lIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwIDEKKyNkZWZpbmUgR0xfWjQwMF9CSU5BUllfQU1EICAgICAgICAgICAgICAgIDB4ODc0MAorI2VuZGlmIC8qIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwICovCisKKyNpZm5kZWYgR0xfQU5HTEVfZGVwdGhfdGV4dHVyZQorI2RlZmluZSBHTF9BTkdMRV9kZXB0aF90ZXh0dXJlIDEKKyNlbmRpZiAvKiBHTF9BTkdMRV9kZXB0aF90ZXh0dXJlICovCisKKyNpZm5kZWYgR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdAorI2RlZmluZSBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0IDEKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9BTkdMRSAgICAgICAgIDB4OENBOAorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0FOR0xFICAgICAgICAgMHg4Q0E5CisjZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19BTkdMRSAweDhDQTYKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUl9CSU5ESU5HX0FOR0xFIDB4OENBQQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTElURlJBTUVCVUZGRVJBTkdMRVBST0MpIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX2JsaXQgKi8KKworI2lmbmRlZiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAxCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FOR0xFICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9BTkdMRSAweDhENTYKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQU5HTEUgICAgICAgICAgICAgIDB4OEQ1NwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBTkdMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmCisjZW5kaWYgLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KKworI2lmbmRlZiBHTF9BTkdMRV9pbnN0YW5jZWRfYXJyYXlzCisjZGVmaW5lIEdMX0FOR0xFX2luc3RhbmNlZF9hcnJheXMgMQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1JfQU5HTEUgMHg4OEZFCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdBUlJBWVNJTlNUQU5DRURBTkdMRVBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5TVEFOQ0VEQU5HTEVQUk9DKSAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFZFUlRFWEFUVFJJQkRJVklTT1JBTkdMRVBST0MpIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliRGl2aXNvckFOR0xFIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0FOR0xFX2luc3RhbmNlZF9hcnJheXMgKi8KKworI2lmbmRlZiBHTF9BTkdMRV9wYWNrX3JldmVyc2Vfcm93X29yZGVyCisjZGVmaW5lIEdMX0FOR0xFX3BhY2tfcmV2ZXJzZV9yb3dfb3JkZXIgMQorI2RlZmluZSBHTF9QQUNLX1JFVkVSU0VfUk9XX09SREVSX0FOR0xFICAgMHg5M0E0CisjZW5kaWYgLyogR0xfQU5HTEVfcGFja19yZXZlcnNlX3Jvd19vcmRlciAqLworCisjaWZuZGVmIEdMX0FOR0xFX3Byb2dyYW1fYmluYXJ5CisjZGVmaW5lIEdMX0FOR0xFX3Byb2dyYW1fYmluYXJ5IDEKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfQU5HTEUgICAgICAgICAgIDB4OTNBNgorI2VuZGlmIC8qIEdMX0FOR0xFX3Byb2dyYW1fYmluYXJ5ICovCisKKyNpZm5kZWYgR0xfQU5HTEVfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQzCisjZGVmaW5lIEdMX0FOR0xFX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MyAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfQU5HTEUgMHg4M0YyCisjZW5kaWYgLyogR0xfQU5HTEVfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQzICovCisKKyNpZm5kZWYgR0xfQU5HTEVfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQ1CisjZGVmaW5lIEdMX0FOR0xFX3RleHR1cmVfY29tcHJlc3Npb25fZHh0NSAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfQU5HTEUgMHg4M0YzCisjZW5kaWYgLyogR0xfQU5HTEVfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQ1ICovCisKKyNpZm5kZWYgR0xfQU5HTEVfdGV4dHVyZV91c2FnZQorI2RlZmluZSBHTF9BTkdMRV90ZXh0dXJlX3VzYWdlIDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9VU0FHRV9BTkdMRSAgICAgICAgICAgIDB4OTNBMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0FOR0xFICAgMHg5M0EzCisjZW5kaWYgLyogR0xfQU5HTEVfdGV4dHVyZV91c2FnZSAqLworCisjaWZuZGVmIEdMX0FOR0xFX3RyYW5zbGF0ZWRfc2hhZGVyX3NvdXJjZQorI2RlZmluZSBHTF9BTkdMRV90cmFuc2xhdGVkX3NoYWRlcl9zb3VyY2UgMQorI2RlZmluZSBHTF9UUkFOU0xBVEVEX1NIQURFUl9TT1VSQ0VfTEVOR1RIX0FOR0xFIDB4OTNBMAordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRUUkFOU0xBVEVEU0hBREVSU09VUkNFQU5HTEVQUk9DKSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqc291cmNlKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlQU5HTEUgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnNvdXJjZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9BTkdMRV90cmFuc2xhdGVkX3NoYWRlcl9zb3VyY2UgKi8KKworI2lmbmRlZiBHTF9BUFBMRV9jb3B5X3RleHR1cmVfbGV2ZWxzCisjZGVmaW5lIEdMX0FQUExFX2NvcHlfdGV4dHVyZV9sZXZlbHMgMQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT1BZVEVYVFVSRUxFVkVMU0FQUExFUFJPQykgKEdMdWludCBkZXN0aW5hdGlvblRleHR1cmUsIEdMdWludCBzb3VyY2VUZXh0dXJlLCBHTGludCBzb3VyY2VCYXNlTGV2ZWwsIEdMc2l6ZWkgc291cmNlTGV2ZWxDb3VudCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleHR1cmVMZXZlbHNBUFBMRSAoR0x1aW50IGRlc3RpbmF0aW9uVGV4dHVyZSwgR0x1aW50IHNvdXJjZVRleHR1cmUsIEdMaW50IHNvdXJjZUJhc2VMZXZlbCwgR0xzaXplaSBzb3VyY2VMZXZlbENvdW50KTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0FQUExFX2NvcHlfdGV4dHVyZV9sZXZlbHMgKi8KKworI2lmbmRlZiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQorI2RlZmluZSBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAxCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FQUExFICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9BUFBMRSAweDhENTYKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfQVBQTEUgICAgICAgICAgICAgIDB4OEQ1NworI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0FQUExFICAgICAgICAgMHg4Q0E4CisjZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQVBQTEUgICAgICAgICAweDhDQTkKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9CSU5ESU5HX0FQUExFIDB4OENBNgorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQVBQTEUgMHg4Q0FBCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUFQUExFUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFU09MVkVNVUxUSVNBTVBMRUZSQU1FQlVGRkVSQVBQTEVQUk9DKSAodm9pZCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFICh2b2lkKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCisKKyNpZm5kZWYgR0xfQVBQTEVfcmdiXzQyMgorI2RlZmluZSBHTF9BUFBMRV9yZ2JfNDIyIDEKKyNkZWZpbmUgR0xfUkdCXzQyMl9BUFBMRSAgICAgICAgICAgICAgICAgIDB4OEExRgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgICAgICAgMHg4NUJBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUgICAweDg1QkIKKyNkZWZpbmUgR0xfUkdCX1JBV180MjJfQVBQTEUgICAgICAgICAgICAgIDB4OEE1MQorI2VuZGlmIC8qIEdMX0FQUExFX3JnYl80MjIgKi8KKworI2lmbmRlZiBHTF9BUFBMRV9zeW5jCisjZGVmaW5lIEdMX0FQUExFX3N5bmMgMQorI2RlZmluZSBHTF9TWU5DX09CSkVDVF9BUFBMRSAgICAgICAgICAgICAgMHg4QTUzCisjZGVmaW5lIEdMX01BWF9TRVJWRVJfV0FJVF9USU1FT1VUX0FQUExFICAweDkxMTEKKyNkZWZpbmUgR0xfT0JKRUNUX1RZUEVfQVBQTEUgICAgICAgICAgICAgIDB4OTExMgorI2RlZmluZSBHTF9TWU5DX0NPTkRJVElPTl9BUFBMRSAgICAgICAgICAgMHg5MTEzCisjZGVmaW5lIEdMX1NZTkNfU1RBVFVTX0FQUExFICAgICAgICAgICAgICAweDkxMTQKKyNkZWZpbmUgR0xfU1lOQ19GTEFHU19BUFBMRSAgICAgICAgICAgICAgIDB4OTExNQorI2RlZmluZSBHTF9TWU5DX0ZFTkNFX0FQUExFICAgICAgICAgICAgICAgMHg5MTE2CisjZGVmaW5lIEdMX1NZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFX0FQUExFIDB4OTExNworI2RlZmluZSBHTF9VTlNJR05BTEVEX0FQUExFICAgICAgICAgICAgICAgMHg5MTE4CisjZGVmaW5lIEdMX1NJR05BTEVEX0FQUExFICAgICAgICAgICAgICAgICAweDkxMTkKKyNkZWZpbmUgR0xfQUxSRUFEWV9TSUdOQUxFRF9BUFBMRSAgICAgICAgIDB4OTExQQorI2RlZmluZSBHTF9USU1FT1VUX0VYUElSRURfQVBQTEUgICAgICAgICAgMHg5MTFCCisjZGVmaW5lIEdMX0NPTkRJVElPTl9TQVRJU0ZJRURfQVBQTEUgICAgICAweDkxMUMKKyNkZWZpbmUgR0xfV0FJVF9GQUlMRURfQVBQTEUgICAgICAgICAgICAgIDB4OTExRAorI2RlZmluZSBHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVF9BUFBMRSAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9USU1FT1VUX0lHTk9SRURfQVBQTEUgICAgICAgICAgMHhGRkZGRkZGRkZGRkZGRkZGdWxsCit0eXBlZGVmIEdMc3luYyAoR0xfQVBJRU5UUllQIFBGTkdMRkVOQ0VTWU5DQVBQTEVQUk9DKSAoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNTWU5DQVBQTEVQUk9DKSAoR0xzeW5jIHN5bmMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVTWU5DQVBQTEVQUk9DKSAoR0xzeW5jIHN5bmMpOwordHlwZWRlZiBHTGVudW0gKEdMX0FQSUVOVFJZUCBQRk5HTENMSUVOVFdBSVRTWU5DQVBQTEVQUk9DKSAoR0xzeW5jIHN5bmMsIEdMYml0ZmllbGQgZmxhZ3MsIEdMdWludDY0IHRpbWVvdXQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xXQUlUU1lOQ0FQUExFUFJPQykgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUSU5URUdFUjY0VkFQUExFUFJPQykgKEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUU1lOQ0lWQVBQTEVQUk9DKSAoR0xzeW5jIHN5bmMsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICp2YWx1ZXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgR0xzeW5jIEdMX0FQSUVOVFJZIGdsRmVuY2VTeW5jQVBQTEUgKEdMZW51bSBjb25kaXRpb24sIEdMYml0ZmllbGQgZmxhZ3MpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1N5bmNBUFBMRSAoR0xzeW5jIHN5bmMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlU3luY0FQUExFIChHTHN5bmMgc3luYyk7CitHTF9BUElDQUxMIEdMZW51bSBHTF9BUElFTlRSWSBnbENsaWVudFdhaXRTeW5jQVBQTEUgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFdhaXRTeW5jQVBQTEUgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXI2NHZBUFBMRSAoR0xlbnVtIHBuYW1lLCBHTGludDY0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U3luY2l2QVBQTEUgKEdMc3luYyBzeW5jLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqdmFsdWVzKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0FQUExFX3N5bmMgKi8KKworI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAorI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAxCisjZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKKyNkZWZpbmUgR0xfQkdSQThfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4OTNBMQorI2VuZGlmIC8qIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCisKKyNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9tYXhfbGV2ZWwKKyNkZWZpbmUgR0xfQVBQTEVfdGV4dHVyZV9tYXhfbGV2ZWwgMQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTF9BUFBMRSAgICAgICAgMHg4MTNECisjZW5kaWYgLyogR0xfQVBQTEVfdGV4dHVyZV9tYXhfbGV2ZWwgKi8KKworI2lmbmRlZiBHTF9BUk1fbWFsaV9wcm9ncmFtX2JpbmFyeQorI2RlZmluZSBHTF9BUk1fbWFsaV9wcm9ncmFtX2JpbmFyeSAxCisjZGVmaW5lIEdMX01BTElfUFJPR1JBTV9CSU5BUllfQVJNICAgICAgICAweDhGNjEKKyNlbmRpZiAvKiBHTF9BUk1fbWFsaV9wcm9ncmFtX2JpbmFyeSAqLworCisjaWZuZGVmIEdMX0FSTV9tYWxpX3NoYWRlcl9iaW5hcnkKKyNkZWZpbmUgR0xfQVJNX21hbGlfc2hhZGVyX2JpbmFyeSAxCisjZGVmaW5lIEdMX01BTElfU0hBREVSX0JJTkFSWV9BUk0gICAgICAgICAweDhGNjAKKyNlbmRpZiAvKiBHTF9BUk1fbWFsaV9zaGFkZXJfYmluYXJ5ICovCisKKyNpZm5kZWYgR0xfQVJNX3JnYmE4CisjZGVmaW5lIEdMX0FSTV9yZ2JhOCAxCisjZW5kaWYgLyogR0xfQVJNX3JnYmE4ICovCisKKyNpZm5kZWYgR0xfQVJNX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaAorI2RlZmluZSBHTF9BUk1fc2hhZGVyX2ZyYW1lYnVmZmVyX2ZldGNoIDEKKyNkZWZpbmUgR0xfRkVUQ0hfUEVSX1NBTVBMRV9BUk0gICAgICAgICAgIDB4OEY2NQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfRlJBTUVCVUZGRVJfRkVUQ0hfTVJUX0FSTSAweDhGNjYKKyNlbmRpZiAvKiBHTF9BUk1fc2hhZGVyX2ZyYW1lYnVmZmVyX2ZldGNoICovCisKKyNpZm5kZWYgR0xfQVJNX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX0FSTV9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2hfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYgLyogR0xfQVJNX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaF9kZXB0aF9zdGVuY2lsICovCisKKyNpZm5kZWYgR0xfRE1QX3NoYWRlcl9iaW5hcnkKKyNkZWZpbmUgR0xfRE1QX3NoYWRlcl9iaW5hcnkgMQorI2RlZmluZSBHTF9TSEFERVJfQklOQVJZX0RNUCAgICAgICAgICAgICAgMHg5MjUwCisjZW5kaWYgLyogR0xfRE1QX3NoYWRlcl9iaW5hcnkgKi8KKworI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4CisjZGVmaW5lIEdMX0VYVF9ibGVuZF9taW5tYXggMQorI2RlZmluZSBHTF9NSU5fRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKKyNlbmRpZiAvKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCisKKyNpZm5kZWYgR0xfRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0CisjZGVmaW5lIEdMX0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCAxCisjZGVmaW5lIEdMX1JHQkExNkZfRVhUICAgICAgICAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgorI2RlZmluZSBHTF9SRzE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHg4MjJGCisjZGVmaW5lIEdMX1IxNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgyMkQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRV9FWFQgMHg4MjExCisjZGVmaW5lIEdMX1VOU0lHTkVEX05PUk1BTElaRURfRVhUICAgICAgICAweDhDMTcKKyNlbmRpZiAvKiBHTF9FWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQgKi8KKworI2lmbmRlZiBHTF9FWFRfY29weV9pbWFnZQorI2RlZmluZSBHTF9FWFRfY29weV9pbWFnZSAxCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPUFlJTUFHRVNVQkRBVEFFWFRQUk9DKSAoR0x1aW50IHNyY05hbWUsIEdMZW51bSBzcmNUYXJnZXQsIEdMaW50IHNyY0xldmVsLCBHTGludCBzcmNYLCBHTGludCBzcmNZLCBHTGludCBzcmNaLCBHTHVpbnQgZHN0TmFtZSwgR0xlbnVtIGRzdFRhcmdldCwgR0xpbnQgZHN0TGV2ZWwsIEdMaW50IGRzdFgsIEdMaW50IGRzdFksIEdMaW50IGRzdFosIEdMc2l6ZWkgc3JjV2lkdGgsIEdMc2l6ZWkgc3JjSGVpZ2h0LCBHTHNpemVpIHNyY0RlcHRoKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5SW1hZ2VTdWJEYXRhRVhUIChHTHVpbnQgc3JjTmFtZSwgR0xlbnVtIHNyY1RhcmdldCwgR0xpbnQgc3JjTGV2ZWwsIEdMaW50IHNyY1gsIEdMaW50IHNyY1ksIEdMaW50IHNyY1osIEdMdWludCBkc3ROYW1lLCBHTGVudW0gZHN0VGFyZ2V0LCBHTGludCBkc3RMZXZlbCwgR0xpbnQgZHN0WCwgR0xpbnQgZHN0WSwgR0xpbnQgZHN0WiwgR0xzaXplaSBzcmNXaWR0aCwgR0xzaXplaSBzcmNIZWlnaHQsIEdMc2l6ZWkgc3JjRGVwdGgpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX2NvcHlfaW1hZ2UgKi8KKworI2lmbmRlZiBHTF9FWFRfZGVidWdfbGFiZWwKKyNkZWZpbmUgR0xfRVhUX2RlYnVnX2xhYmVsIDEKKyNkZWZpbmUgR0xfUFJPR1JBTV9QSVBFTElORV9PQkpFQ1RfRVhUICAgIDB4OEE0RgorI2RlZmluZSBHTF9QUk9HUkFNX09CSkVDVF9FWFQgICAgICAgICAgICAgMHg4QjQwCisjZGVmaW5lIEdMX1NIQURFUl9PQkpFQ1RfRVhUICAgICAgICAgICAgICAweDhCNDgKKyNkZWZpbmUgR0xfQlVGRkVSX09CSkVDVF9FWFQgICAgICAgICAgICAgIDB4OTE1MQorI2RlZmluZSBHTF9RVUVSWV9PQkpFQ1RfRVhUICAgICAgICAgICAgICAgMHg5MTUzCisjZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9PQkpFQ1RfRVhUICAgICAgICAweDkxNTQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLICAgICAgICAgICAgIDB4OEUyMgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMQUJFTE9CSkVDVEVYVFBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RMQUJFTEVYVFBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbExhYmVsT2JqZWN0RVhUIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0T2JqZWN0TGFiZWxFWFQgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfZGVidWdfbGFiZWwgKi8KKworI2lmbmRlZiBHTF9FWFRfZGVidWdfbWFya2VyCisjZGVmaW5lIEdMX0VYVF9kZWJ1Z19tYXJrZXIgMQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xJTlNFUlRFVkVOVE1BUktFUkVYVFBST0MpIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQVVNIR1JPVVBNQVJLRVJFWFRQUk9DKSAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9QR1JPVVBNQVJLRVJFWFRQUk9DKSAodm9pZCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQgKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQdXNoR3JvdXBNYXJrZXJFWFQgKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb3BHcm91cE1hcmtlckVYVCAodm9pZCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfZGVidWdfbWFya2VyICovCisKKyNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKKyNkZWZpbmUgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgMQorI2RlZmluZSBHTF9DT0xPUl9FWFQgICAgICAgICAgICAgICAgICAgICAgMHgxODAwCisjZGVmaW5lIEdMX0RFUFRIX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDE4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9FWFQgICAgICAgICAgICAgICAgICAgIDB4MTgwMgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNDQVJERlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyICovCisKKyNpZm5kZWYgR0xfRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5CisjZGVmaW5lIEdMX0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeSAxCisjZGVmaW5lIEdMX1FVRVJZX0NPVU5URVJfQklUU19FWFQgICAgICAgICAweDg4NjQKKyNkZWZpbmUgR0xfQ1VSUkVOVF9RVUVSWV9FWFQgICAgICAgICAgICAgIDB4ODg2NQorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfRVhUICAgICAgICAgICAgICAgMHg4ODY2CisjZGVmaW5lIEdMX1FVRVJZX1JFU1VMVF9BVkFJTEFCTEVfRVhUICAgICAweDg4NjcKKyNkZWZpbmUgR0xfVElNRV9FTEFQU0VEX0VYVCAgICAgICAgICAgICAgIDB4ODhCRgorI2RlZmluZSBHTF9USU1FU1RBTVBfRVhUICAgICAgICAgICAgICAgICAgMHg4RTI4CisjZGVmaW5lIEdMX0dQVV9ESVNKT0lOVF9FWFQgICAgICAgICAgICAgICAweDhGQkIKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOUVVFUklFU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUVVFUklFU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK3R5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1FVRVJZRVhUUFJPQykgKEdMdWludCBpZCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUVVFUllFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFFVRVJZQ09VTlRFUkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSB0YXJnZXQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRRVUVSWUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUSVZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVFVJVkVYVFBST0MpIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRRVUVSWU9CSkVDVEk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFFVRVJZT0JKRUNUVUk2NFZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludDY0ICpwYXJhbXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblF1ZXJpZXNFWFQgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUXVlcmllc0VYVCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUXVlcnlFWFQgKEdMdWludCBpZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCZWdpblF1ZXJ5RVhUIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUXVlcnlFWFQgKEdMZW51bSB0YXJnZXQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUXVlcnlDb3VudGVyRVhUIChHTHVpbnQgaWQsIEdMZW51bSB0YXJnZXQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UXVlcnlpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0aXZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWl2RVhUIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3RpNjR2RVhUIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWk2NHZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQ2NCAqcGFyYW1zKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeSAqLworCisjaWZuZGVmIEdMX0VYVF9kcmF3X2J1ZmZlcnMKKyNkZWZpbmUgR0xfRVhUX2RyYXdfYnVmZmVycyAxCisjZGVmaW5lIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19FWFQgICAgICAweDhDREYKKyNkZWZpbmUgR0xfTUFYX0RSQVdfQlVGRkVSU19FWFQgICAgICAgICAgIDB4ODgyNAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjBfRVhUICAgICAgICAgICAgICAgMHg4ODI1CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMV9FWFQgICAgICAgICAgICAgICAweDg4MjYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIyX0VYVCAgICAgICAgICAgICAgIDB4ODgyNworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjNfRVhUICAgICAgICAgICAgICAgMHg4ODI4CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNF9FWFQgICAgICAgICAgICAgICAweDg4MjkKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI1X0VYVCAgICAgICAgICAgICAgIDB4ODgyQQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjZfRVhUICAgICAgICAgICAgICAgMHg4ODJCCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSN19FWFQgICAgICAgICAgICAgICAweDg4MkMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI4X0VYVCAgICAgICAgICAgICAgIDB4ODgyRAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjlfRVhUICAgICAgICAgICAgICAgMHg4ODJFCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTBfRVhUICAgICAgICAgICAgICAweDg4MkYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMV9FWFQgICAgICAgICAgICAgIDB4ODgzMAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEyX0VYVCAgICAgICAgICAgICAgMHg4ODMxCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTNfRVhUICAgICAgICAgICAgICAweDg4MzIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNF9FWFQgICAgICAgICAgICAgIDB4ODgzMworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE1X0VYVCAgICAgICAgICAgICAgMHg4ODM0CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCAgICAgICAgICAweDhDRTAKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDFfRVhUICAgICAgICAgIDB4OENFMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9FWFQgICAgICAgICAgMHg4Q0UyCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzX0VYVCAgICAgICAgICAweDhDRTMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDRfRVhUICAgICAgICAgIDB4OENFNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9FWFQgICAgICAgICAgMHg4Q0U1CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X0VYVCAgICAgICAgICAweDhDRTYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDdfRVhUICAgICAgICAgIDB4OENFNworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9FWFQgICAgICAgICAgMHg4Q0U4CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X0VYVCAgICAgICAgICAweDhDRTkKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwX0VYVCAgICAgICAgIDB4OENFQQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfRVhUICAgICAgICAgMHg4Q0VCCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9FWFQgICAgICAgICAweDhDRUMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzX0VYVCAgICAgICAgIDB4OENFRAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfRVhUICAgICAgICAgMHg4Q0VFCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9FWFQgICAgICAgICAweDhDRUYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV0JVRkZFUlNFWFRQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdCdWZmZXJzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfZHJhd19idWZmZXJzICovCisKKyNpZm5kZWYgR0xfRVhUX2RyYXdfYnVmZmVyc19pbmRleGVkCisjZGVmaW5lIEdMX0VYVF9kcmF3X2J1ZmZlcnNfaW5kZXhlZCAxCisjZGVmaW5lIEdMX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFTkFCTEVJRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERJU0FCTEVJRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERVFVQVRJT05JRVhUUFJPQykgKEdMdWludCBidWYsIEdMZW51bSBtb2RlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRFUVVBVElPTlNFUEFSQVRFSUVYVFBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ0lFWFRQUk9DKSAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyYywgR0xlbnVtIGRzdCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJMRU5ERlVOQ1NFUEFSQVRFSUVYVFBST0MpIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTE9STUFTS0lFWFRQUk9DKSAoR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNFTkFCTEVESUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZWlFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlaUVYVCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25pRVhUIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVpRVhUIChHTHVpbnQgYnVmLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNpRVhUIChHTHVpbnQgYnVmLCBHTGVudW0gc3JjLCBHTGVudW0gZHN0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlaUVYVCAoR0x1aW50IGJ1ZiwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JNYXNraUVYVCAoR0x1aW50IGluZGV4LCBHTGJvb2xlYW4gciwgR0xib29sZWFuIGcsIEdMYm9vbGVhbiBiLCBHTGJvb2xlYW4gYSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRW5hYmxlZGlFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfZHJhd19idWZmZXJzX2luZGV4ZWQgKi8KKworI2lmbmRlZiBHTF9FWFRfZHJhd19pbnN0YW5jZWQKKyNkZWZpbmUgR0xfRVhUX2RyYXdfaW5zdGFuY2VkIDEKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lOU1RBTkNFREVYVFBST0MpIChHTGVudW0gbW9kZSwgR0xpbnQgc3RhcnQsIEdMc2l6ZWkgY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV0VMRU1FTlRTSU5TVEFOQ0VERVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdBcnJheXNJbnN0YW5jZWRFWFQgKEdMZW51bSBtb2RlLCBHTGludCBzdGFydCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkRVhUIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9kcmF3X2luc3RhbmNlZCAqLworCisjaWZuZGVmIEdMX0VYVF9nZW9tZXRyeV9zaGFkZXIKKyNkZWZpbmUgR0xfRVhUX2dlb21ldHJ5X3NoYWRlciAxCisjZGVmaW5lIEdMX0dFT01FVFJZX1NIQURFUl9FWFQgICAgICAgICAgICAweDhERDkKKyNkZWZpbmUgR0xfR0VPTUVUUllfU0hBREVSX0JJVF9FWFQgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfR0VPTUVUUllfTElOS0VEX1ZFUlRJQ0VTX09VVF9FWFQgMHg4OTE2CisjZGVmaW5lIEdMX0dFT01FVFJZX0xJTktFRF9JTlBVVF9UWVBFX0VYVCAweDg5MTcKKyNkZWZpbmUgR0xfR0VPTUVUUllfTElOS0VEX09VVFBVVF9UWVBFX0VYVCAweDg5MTgKKyNkZWZpbmUgR0xfR0VPTUVUUllfU0hBREVSX0lOVk9DQVRJT05TX0VYVCAweDg4N0YKKyNkZWZpbmUgR0xfTEFZRVJfUFJPVk9LSU5HX1ZFUlRFWF9FWFQgICAgIDB4ODI1RQorI2RlZmluZSBHTF9MSU5FU19BREpBQ0VOQ1lfRVhUICAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lIEdMX0xJTkVfU1RSSVBfQURKQUNFTkNZX0VYVCAgICAgICAweDAwMEIKKyNkZWZpbmUgR0xfVFJJQU5HTEVTX0FESkFDRU5DWV9FWFQgICAgICAgIDB4MDAwQworI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUF9BREpBQ0VOQ1lfRVhUICAgMHgwMDBECisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9VTklGT1JNX0NPTVBPTkVOVFNfRVhUIDB4OERERgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfVU5JRk9STV9CTE9DS1NfRVhUIDB4OEEyQworI2RlZmluZSBHTF9NQVhfQ09NQklORURfR0VPTUVUUllfVU5JRk9STV9DT01QT05FTlRTX0VYVCAweDhBMzIKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0lOUFVUX0NPTVBPTkVOVFNfRVhUIDB4OTEyMworI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfT1VUUFVUX0NPTVBPTkVOVFNfRVhUIDB4OTEyNAorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfT1VUUFVUX1ZFUlRJQ0VTX0VYVCAweDhERTAKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1RPVEFMX09VVFBVVF9DT01QT05FTlRTX0VYVCAweDhERTEKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1NIQURFUl9JTlZPQ0FUSU9OU19FWFQgMHg4RTVBCisjZGVmaW5lIEdMX01BWF9HRU9NRVRSWV9URVhUVVJFX0lNQUdFX1VOSVRTX0VYVCAweDhDMjkKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0FUT01JQ19DT1VOVEVSX0JVRkZFUlNfRVhUIDB4OTJDRgorI2RlZmluZSBHTF9NQVhfR0VPTUVUUllfQVRPTUlDX0NPVU5URVJTX0VYVCAweDkyRDUKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX0lNQUdFX1VOSUZPUk1TX0VYVCAweDkwQ0QKKyNkZWZpbmUgR0xfTUFYX0dFT01FVFJZX1NIQURFUl9TVE9SQUdFX0JMT0NLU19FWFQgMHg5MEQ3CisjZGVmaW5lIEdMX0ZJUlNUX1ZFUlRFWF9DT05WRU5USU9OX0VYVCAgICAweDhFNEQKKyNkZWZpbmUgR0xfTEFTVF9WRVJURVhfQ09OVkVOVElPTl9FWFQgICAgIDB4OEU0RQorI2RlZmluZSBHTF9VTkRFRklORURfVkVSVEVYX0VYVCAgICAgICAgICAgMHg4MjYwCisjZGVmaW5lIEdMX1BSSU1JVElWRVNfR0VORVJBVEVEX0VYVCAgICAgICAweDhDODcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfREVGQVVMVF9MQVlFUlNfRVhUIDB4OTMxMgorI2RlZmluZSBHTF9NQVhfRlJBTUVCVUZGRVJfTEFZRVJTX0VYVCAgICAgMHg5MzE3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTEFZRVJfVEFSR0VUU19FWFQgMHg4REE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfTEFZRVJFRF9FWFQgMHg4REE3CisjZGVmaW5lIEdMX1JFRkVSRU5DRURfQllfR0VPTUVUUllfU0hBREVSX0VYVCAweDkzMDkKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfZ2VvbWV0cnlfc2hhZGVyICovCisKKyNpZm5kZWYgR0xfRVhUX2dwdV9zaGFkZXI1CisjZGVmaW5lIEdMX0VYVF9ncHVfc2hhZGVyNSAxCisjZW5kaWYgLyogR0xfRVhUX2dwdV9zaGFkZXI1ICovCisKKyNpZm5kZWYgR0xfRVhUX2luc3RhbmNlZF9hcnJheXMKKyNkZWZpbmUgR0xfRVhUX2luc3RhbmNlZF9hcnJheXMgMQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1JfRVhUIDB4ODhGRQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJESVZJU09SRVhUUFJPQykgKEdMdWludCBpbmRleCwgR0x1aW50IGRpdmlzb3IpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYkRpdmlzb3JFWFQgKEdMdWludCBpbmRleCwgR0x1aW50IGRpdmlzb3IpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX2luc3RhbmNlZF9hcnJheXMgKi8KKworI2lmbmRlZiBHTF9FWFRfbWFwX2J1ZmZlcl9yYW5nZQorI2RlZmluZSBHTF9FWFRfbWFwX2J1ZmZlcl9yYW5nZSAxCisjZGVmaW5lIEdMX01BUF9SRUFEX0JJVF9FWFQgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTUFQX1dSSVRFX0JJVF9FWFQgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9NQVBfSU5WQUxJREFURV9SQU5HRV9CSVRfRVhUICAgMHgwMDA0CisjZGVmaW5lIEdMX01BUF9JTlZBTElEQVRFX0JVRkZFUl9CSVRfRVhUICAweDAwMDgKKyNkZWZpbmUgR0xfTUFQX0ZMVVNIX0VYUExJQ0lUX0JJVF9FWFQgICAgIDB4MDAxMAorI2RlZmluZSBHTF9NQVBfVU5TWU5DSFJPTklaRURfQklUX0VYVCAgICAgMHgwMDIwCit0eXBlZGVmIHZvaWQgKihHTF9BUElFTlRSWVAgUEZOR0xNQVBCVUZGRVJSQU5HRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoLCBHTGJpdGZpZWxkIGFjY2Vzcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZMVVNITUFQUEVEQlVGRkVSUkFOR0VFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkICpHTF9BUElFTlRSWSBnbE1hcEJ1ZmZlclJhbmdlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoLCBHTGJpdGZpZWxkIGFjY2Vzcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGbHVzaE1hcHBlZEJ1ZmZlclJhbmdlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgbGVuZ3RoKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9tYXBfYnVmZmVyX3JhbmdlICovCisKKyNpZm5kZWYgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzCisjZGVmaW5lIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAxCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0FSUkFZU0VYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNVUxUSURSQVdFTEVNRU5UU0VYVFBST0MpIChHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpjb25zdCppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzRVhUIChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmNvbnN0KmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cyAqLworCisjaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKKyNkZWZpbmUgR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAxCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9TQU1QTEVTX0VYVCAweDhENkMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfRVhUICAgICAgIDB4OENBQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0VYVCAweDhENTYKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfRVhUICAgICAgICAgICAgICAgIDB4OEQ1NwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJBTUVCVUZGRVJURVhUVVJFMkRNVUxUSVNBTVBMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCisKKyNpZm5kZWYgR0xfRVhUX211bHRpdmlld19kcmF3X2J1ZmZlcnMKKyNkZWZpbmUgR0xfRVhUX211bHRpdmlld19kcmF3X2J1ZmZlcnMgMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UX0VYVCAgICAgICAgICAgMHg5MEYwCisjZGVmaW5lIEdMX01VTFRJVklFV19FWFQgICAgICAgICAgICAgICAgICAweDkwRjEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVJfRVhUICAgICAgICAgICAgICAgIDB4MEMwMQorI2RlZmluZSBHTF9SRUFEX0JVRkZFUl9FWFQgICAgICAgICAgICAgICAgMHgwQzAyCisjZGVmaW5lIEdMX01BWF9NVUxUSVZJRVdfQlVGRkVSU19FWFQgICAgICAweDkwRjIKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVBREJVRkZFUklOREVYRURFWFRQUk9DKSAoR0xlbnVtIHNyYywgR0xpbnQgaW5kZXgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU0lOREVYRURFWFRQUk9DKSAoR0xpbnQgbiwgY29uc3QgR0xlbnVtICpsb2NhdGlvbiwgY29uc3QgR0xpbnQgKmluZGljZXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRJTlRFR0VSSV9WRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRCdWZmZXJJbmRleGVkRVhUIChHTGVudW0gc3JjLCBHTGludCBpbmRleCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QnVmZmVyc0luZGV4ZWRFWFQgKEdMaW50IG4sIGNvbnN0IEdMZW51bSAqbG9jYXRpb24sIGNvbnN0IEdMaW50ICppbmRpY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXJpX3ZFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX211bHRpdmlld19kcmF3X2J1ZmZlcnMgKi8KKworI2lmbmRlZiBHTF9FWFRfb2NjbHVzaW9uX3F1ZXJ5X2Jvb2xlYW4KKyNkZWZpbmUgR0xfRVhUX29jY2x1c2lvbl9xdWVyeV9ib29sZWFuIDEKKyNkZWZpbmUgR0xfQU5ZX1NBTVBMRVNfUEFTU0VEX0VYVCAgICAgICAgIDB4OEMyRgorI2RlZmluZSBHTF9BTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFX0VYVCAweDhENkEKKyNlbmRpZiAvKiBHTF9FWFRfb2NjbHVzaW9uX3F1ZXJ5X2Jvb2xlYW4gKi8KKworI2lmbmRlZiBHTF9FWFRfcHJpbWl0aXZlX2JvdW5kaW5nX2JveAorI2RlZmluZSBHTF9FWFRfcHJpbWl0aXZlX2JvdW5kaW5nX2JveCAxCisjZGVmaW5lIEdMX1BSSU1JVElWRV9CT1VORElOR19CT1hfRVhUICAgICAweDkyQkUKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJJTUlUSVZFQk9VTkRJTkdCT1hFWFRQUk9DKSAoR0xmbG9hdCBtaW5YLCBHTGZsb2F0IG1pblksIEdMZmxvYXQgbWluWiwgR0xmbG9hdCBtaW5XLCBHTGZsb2F0IG1heFgsIEdMZmxvYXQgbWF4WSwgR0xmbG9hdCBtYXhaLCBHTGZsb2F0IG1heFcpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByaW1pdGl2ZUJvdW5kaW5nQm94RVhUIChHTGZsb2F0IG1pblgsIEdMZmxvYXQgbWluWSwgR0xmbG9hdCBtaW5aLCBHTGZsb2F0IG1pblcsIEdMZmxvYXQgbWF4WCwgR0xmbG9hdCBtYXhZLCBHTGZsb2F0IG1heFosIEdMZmxvYXQgbWF4Vyk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9FWFRfcHJpbWl0aXZlX2JvdW5kaW5nX2JveCAqLworCisjaWZuZGVmIEdMX0VYVF9wdnJ0Y19zUkdCCisjZGVmaW5lIEdMX0VYVF9wdnJ0Y19zUkdCIDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX1BWUlRDXzJCUFBWMV9FWFQgMHg4QTU0CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9QVlJUQ180QlBQVjFfRVhUIDB4OEE1NQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUFZSVENfMkJQUFYxX0VYVCAweDhBNTYKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1BWUlRDXzRCUFBWMV9FWFQgMHg4QTU3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9QVlJUQ18yQlBQVjJfSU1HIDB4OTNGMAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfQUxQSEFfUFZSVENfNEJQUFYyX0lNRyAweDkzRjEKKyNlbmRpZiAvKiBHTF9FWFRfcHZydGNfc1JHQiAqLworCisjaWZuZGVmIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhCisjZGVmaW5lIEdMX0VYVF9yZWFkX2Zvcm1hdF9iZ3JhIDEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVZfRVhUIDB4ODM2NQorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVl9FWFQgMHg4MzY2CisjZW5kaWYgLyogR0xfRVhUX3JlYWRfZm9ybWF0X2JncmEgKi8KKworI2lmbmRlZiBHTF9FWFRfcm9idXN0bmVzcworI2RlZmluZSBHTF9FWFRfcm9idXN0bmVzcyAxCisjZGVmaW5lIEdMX0dVSUxUWV9DT05URVhUX1JFU0VUX0VYVCAgICAgICAweDgyNTMKKyNkZWZpbmUgR0xfSU5OT0NFTlRfQ09OVEVYVF9SRVNFVF9FWFQgICAgIDB4ODI1NAorI2RlZmluZSBHTF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfRVhUICAgICAgMHg4MjU1CisjZGVmaW5lIEdMX0NPTlRFWFRfUk9CVVNUX0FDQ0VTU19FWFQgICAgICAweDkwRjMKKyNkZWZpbmUgR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0VYVCAweDgyNTYKKyNkZWZpbmUgR0xfTE9TRV9DT05URVhUX09OX1JFU0VUX0VYVCAgICAgIDB4ODI1MgorI2RlZmluZSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fRVhUICAgICAgMHg4MjYxCit0eXBlZGVmIEdMZW51bSAoR0xfQVBJRU5UUllQIFBGTkdMR0VUR1JBUEhJQ1NSRVNFVFNUQVRVU0VYVFBST0MpICh2b2lkKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVBRE5QSVhFTFNFWFRQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZG5QaXhlbHNFWFQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldG5Vbmlmb3JtZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0blVuaWZvcm1pdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX3JvYnVzdG5lc3MgKi8KKworI2lmbmRlZiBHTF9FWFRfc1JHQgorI2RlZmluZSBHTF9FWFRfc1JHQiAxCisjZGVmaW5lIEdMX1NSR0JfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDhDNDAKKyNkZWZpbmUgR0xfU1JHQl9BTFBIQV9FWFQgICAgICAgICAgICAgICAgIDB4OEM0MgorI2RlZmluZSBHTF9TUkdCOF9BTFBIQThfRVhUICAgICAgICAgICAgICAgMHg4QzQzCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkdfRVhUIDB4ODIxMAorI2VuZGlmIC8qIEdMX0VYVF9zUkdCICovCisKKyNpZm5kZWYgR0xfRVhUX3NSR0Jfd3JpdGVfY29udHJvbAorI2RlZmluZSBHTF9FWFRfc1JHQl93cml0ZV9jb250cm9sIDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfU1JHQl9FWFQgICAgICAgICAgIDB4OERCOQorI2VuZGlmIC8qIEdMX0VYVF9zUkdCX3dyaXRlX2NvbnRyb2wgKi8KKworI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMKKyNkZWZpbmUgR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzIDEKKyNkZWZpbmUgR0xfQUNUSVZFX1BST0dSQU1fRVhUICAgICAgICAgICAgIDB4ODI1OQorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSX0JJVF9FWFQgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVJfQklUX0VYVCAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9BTExfU0hBREVSX0JJVFNfRVhUICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBHTF9QUk9HUkFNX1NFUEFSQUJMRV9FWFQgICAgICAgICAgMHg4MjU4CisjZGVmaW5lIEdMX1BST0dSQU1fUElQRUxJTkVfQklORElOR19FWFQgICAweDgyNUEKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQUNUSVZFU0hBREVSUFJPR1JBTUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFBST0dSQU1QSVBFTElORUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwordHlwZWRlZiBHTHVpbnQgKEdMX0FQSUVOVFJZUCBQRk5HTENSRUFURVNIQURFUlBST0dSQU1WRVhUUFJPQykgKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKipzdHJpbmdzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUFJPR1JBTVBJUEVMSU5FU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOUFJPR1JBTVBJUEVMSU5FU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBJUEVMSU5FSU5GT0xPR0VYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQUk9HUkFNUElQRUxJTkVJVkVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNQUk9HUkFNUElQRUxJTkVFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVBBUkFNRVRFUklFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMUZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMkZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMklFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0ZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVg0RlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFVTRVBST0dSQU1TVEFHRVNFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xWQUxJREFURVBST0dSQU1QSVBFTElORUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMlVJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTNVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRVSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNMVVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJVSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zVUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNNFVJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDJYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYMkZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDNYNEZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQgKEdMdWludCBwaXBlbGluZSwgR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCAoR0x1aW50IHBpcGVsaW5lKTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQgKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKipzdHJpbmdzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQgKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQgKEdMdWludCBwaXBlbGluZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2lFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2Mik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVzZVByb2dyYW1TdGFnZXNFWFQgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUIChHTHVpbnQgcGlwZWxpbmUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMXVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNHVpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MngzZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDJmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJ4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgyZnZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzeDRmdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDR4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAqLworCisjaWZuZGVmIEdMX0VYVF9zaGFkZXJfZnJhbWVidWZmZXJfZmV0Y2gKKyNkZWZpbmUgR0xfRVhUX3NoYWRlcl9mcmFtZWJ1ZmZlcl9mZXRjaCAxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9ESVNDQVJEU19TQU1QTEVTX0VYVCAweDhBNTIKKyNlbmRpZiAvKiBHTF9FWFRfc2hhZGVyX2ZyYW1lYnVmZmVyX2ZldGNoICovCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRlcl9pbXBsaWNpdF9jb252ZXJzaW9ucworI2RlZmluZSBHTF9FWFRfc2hhZGVyX2ltcGxpY2l0X2NvbnZlcnNpb25zIDEKKyNlbmRpZiAvKiBHTF9FWFRfc2hhZGVyX2ltcGxpY2l0X2NvbnZlcnNpb25zICovCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRlcl9pbnRlZ2VyX21peAorI2RlZmluZSBHTF9FWFRfc2hhZGVyX2ludGVnZXJfbWl4IDEKKyNlbmRpZiAvKiBHTF9FWFRfc2hhZGVyX2ludGVnZXJfbWl4ICovCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRlcl9pb19ibG9ja3MKKyNkZWZpbmUgR0xfRVhUX3NoYWRlcl9pb19ibG9ja3MgMQorI2VuZGlmIC8qIEdMX0VYVF9zaGFkZXJfaW9fYmxvY2tzICovCisKKyNpZm5kZWYgR0xfRVhUX3NoYWRlcl9waXhlbF9sb2NhbF9zdG9yYWdlCisjZGVmaW5lIEdMX0VYVF9zaGFkZXJfcGl4ZWxfbG9jYWxfc3RvcmFnZSAxCisjZGVmaW5lIEdMX01BWF9TSEFERVJfUElYRUxfTE9DQUxfU1RPUkFHRV9GQVNUX1NJWkVfRVhUIDB4OEY2MworI2RlZmluZSBHTF9NQVhfU0hBREVSX1BJWEVMX0xPQ0FMX1NUT1JBR0VfU0laRV9FWFQgMHg4RjY3CisjZGVmaW5lIEdMX1NIQURFUl9QSVhFTF9MT0NBTF9TVE9SQUdFX0VYVCAweDhGNjQKKyNlbmRpZiAvKiBHTF9FWFRfc2hhZGVyX3BpeGVsX2xvY2FsX3N0b3JhZ2UgKi8KKworI2lmbmRlZiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kCisjZGVmaW5lIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgMQorI2VuZGlmIC8qIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgKi8KKworI2lmbmRlZiBHTF9FWFRfc2hhZG93X3NhbXBsZXJzCisjZGVmaW5lIEdMX0VYVF9zaGFkb3dfc2FtcGxlcnMgMQorI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9FWFQgICAgICAgMHg4ODRDCisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9GVU5DX0VYVCAgICAgICAweDg4NEQKKyNkZWZpbmUgR0xfQ09NUEFSRV9SRUZfVE9fVEVYVFVSRV9FWFQgICAgIDB4ODg0RQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPV19FWFQgICAgICAgICAgMHg4QjYyCisjZW5kaWYgLyogR0xfRVhUX3NoYWRvd19zYW1wbGVycyAqLworCisjaWZuZGVmIEdMX0VYVF90ZXNzZWxsYXRpb25fc2hhZGVyCisjZGVmaW5lIEdMX0VYVF90ZXNzZWxsYXRpb25fc2hhZGVyIDEKKyNkZWZpbmUgR0xfUEFUQ0hFU19FWFQgICAgICAgICAgICAgICAgICAgIDB4MDAwRQorI2RlZmluZSBHTF9QQVRDSF9WRVJUSUNFU19FWFQgICAgICAgICAgICAgMHg4RTcyCisjZGVmaW5lIEdMX1RFU1NfQ09OVFJPTF9PVVRQVVRfVkVSVElDRVNfRVhUIDB4OEU3NQorI2RlZmluZSBHTF9URVNTX0dFTl9NT0RFX0VYVCAgICAgICAgICAgICAgMHg4RTc2CisjZGVmaW5lIEdMX1RFU1NfR0VOX1NQQUNJTkdfRVhUICAgICAgICAgICAweDhFNzcKKyNkZWZpbmUgR0xfVEVTU19HRU5fVkVSVEVYX09SREVSX0VYVCAgICAgIDB4OEU3OAorI2RlZmluZSBHTF9URVNTX0dFTl9QT0lOVF9NT0RFX0VYVCAgICAgICAgMHg4RTc5CisjZGVmaW5lIEdMX0lTT0xJTkVTX0VYVCAgICAgICAgICAgICAgICAgICAweDhFN0EKKyNkZWZpbmUgR0xfUVVBRFNfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBHTF9GUkFDVElPTkFMX09ERF9FWFQgICAgICAgICAgICAgMHg4RTdCCisjZGVmaW5lIEdMX0ZSQUNUSU9OQUxfRVZFTl9FWFQgICAgICAgICAgICAweDhFN0MKKyNkZWZpbmUgR0xfTUFYX1BBVENIX1ZFUlRJQ0VTX0VYVCAgICAgICAgIDB4OEU3RAorI2RlZmluZSBHTF9NQVhfVEVTU19HRU5fTEVWRUxfRVhUICAgICAgICAgMHg4RTdFCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9DT01QT05FTlRTX0VYVCAweDhFN0YKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9VTklGT1JNX0NPTVBPTkVOVFNfRVhUIDB4OEU4MAorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX1RFWFRVUkVfSU1BR0VfVU5JVFNfRVhUIDB4OEU4MQorI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1RFWFRVUkVfSU1BR0VfVU5JVFNfRVhUIDB4OEU4MgorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX09VVFBVVF9DT01QT05FTlRTX0VYVCAweDhFODMKKyNkZWZpbmUgR0xfTUFYX1RFU1NfUEFUQ0hfQ09NUE9ORU5UU19FWFQgIDB4OEU4NAorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX1RPVEFMX09VVFBVVF9DT01QT05FTlRTX0VYVCAweDhFODUKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9PVVRQVVRfQ09NUE9ORU5UU19FWFQgMHg4RTg2CisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfVU5JRk9STV9CTE9DS1NfRVhUIDB4OEU4OQorI2RlZmluZSBHTF9NQVhfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQkxPQ0tTX0VYVCAweDhFOEEKKyNkZWZpbmUgR0xfTUFYX1RFU1NfQ09OVFJPTF9JTlBVVF9DT01QT05FTlRTX0VYVCAweDg4NkMKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTlBVVF9DT01QT05FTlRTX0VYVCAweDg4NkQKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1RFU1NfQ09OVFJPTF9VTklGT1JNX0NPTVBPTkVOVFNfRVhUIDB4OEUxRQorI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVTU19FVkFMVUFUSU9OX1VOSUZPUk1fQ09NUE9ORU5UU19FWFQgMHg4RTFGCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSU19FWFQgMHg5MkNECisjZGVmaW5lIEdMX01BWF9URVNTX0VWQUxVQVRJT05fQVRPTUlDX0NPVU5URVJfQlVGRkVSU19FWFQgMHg5MkNFCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfQVRPTUlDX0NPVU5URVJTX0VYVCAweDkyRDMKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9BVE9NSUNfQ09VTlRFUlNfRVhUIDB4OTJENAorI2RlZmluZSBHTF9NQVhfVEVTU19DT05UUk9MX0lNQUdFX1VOSUZPUk1TX0VYVCAweDkwQ0IKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9JTUFHRV9VTklGT1JNU19FWFQgMHg5MENDCisjZGVmaW5lIEdMX01BWF9URVNTX0NPTlRST0xfU0hBREVSX1NUT1JBR0VfQkxPQ0tTX0VYVCAweDkwRDgKKyNkZWZpbmUgR0xfTUFYX1RFU1NfRVZBTFVBVElPTl9TSEFERVJfU1RPUkFHRV9CTE9DS1NfRVhUIDB4OTBEOQorI2RlZmluZSBHTF9QUklNSVRJVkVfUkVTVEFSVF9GT1JfUEFUQ0hFU19TVVBQT1JURUQgMHg4MjIxCisjZGVmaW5lIEdMX0lTX1BFUl9QQVRDSF9FWFQgICAgICAgICAgICAgICAweDkyRTcKKyNkZWZpbmUgR0xfUkVGRVJFTkNFRF9CWV9URVNTX0NPTlRST0xfU0hBREVSX0VYVCAweDkzMDcKKyNkZWZpbmUgR0xfUkVGRVJFTkNFRF9CWV9URVNTX0VWQUxVQVRJT05fU0hBREVSX0VYVCAweDkzMDgKKyNkZWZpbmUgR0xfVEVTU19DT05UUk9MX1NIQURFUl9FWFQgICAgICAgIDB4OEU4OAorI2RlZmluZSBHTF9URVNTX0VWQUxVQVRJT05fU0hBREVSX0VYVCAgICAgMHg4RTg3CisjZGVmaW5lIEdMX1RFU1NfQ09OVFJPTF9TSEFERVJfQklUX0VYVCAgICAweDAwMDAwMDA4CisjZGVmaW5lIEdMX1RFU1NfRVZBTFVBVElPTl9TSEFERVJfQklUX0VYVCAweDAwMDAwMDEwCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBBVENIUEFSQU1FVEVSSUVYVFBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQYXRjaFBhcmFtZXRlcmlFWFQgKEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX3Rlc3NlbGxhdGlvbl9zaGFkZXIgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfYm9yZGVyX2NsYW1wIDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CT1JERVJfQ09MT1JfRVhUICAgICAgIDB4MTAwNAorI2RlZmluZSBHTF9DTEFNUF9UT19CT1JERVJfRVhUICAgICAgICAgICAgMHg4MTJECit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUklJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJJVUlWRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJJSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0FNUExFUlBBUkFNRVRFUklJVkVYVFBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTQU1QTEVSUEFSQU1FVEVSSVVJVkVYVFBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTHVpbnQgKnBhcmFtKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUU0FNUExFUlBBUkFNRVRFUklJVkVYVFBST0MpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUU0FNUExFUlBBUkFNRVRFUklVSVZFWFRQUk9DKSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcklpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlckl1aXZFWFQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0x1aW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySWl2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVySXVpdkVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVySWl2RVhUIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlckl1aXZFWFQgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMdWludCAqcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U2FtcGxlclBhcmFtZXRlcklpdkVYVCAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVySXVpdkVYVCAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfYm9yZGVyX2NsYW1wICovCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfYnVmZmVyCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2J1ZmZlciAxCisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX0VYVCAgICAgICAgICAgICAweDhDMkEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfQklORElOR19FWFQgICAgIDB4OEMyQQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9CVUZGRVJfU0laRV9FWFQgICAgMHg4QzJCCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19CVUZGRVJfRVhUICAgICAweDhDMkMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfREFUQV9TVE9SRV9CSU5ESU5HX0VYVCAweDhDMkQKKyNkZWZpbmUgR0xfVEVYVFVSRV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVF9FWFQgMHg5MTlGCisjZGVmaW5lIEdMX1NBTVBMRVJfQlVGRkVSX0VYVCAgICAgICAgICAgICAweDhEQzIKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQlVGRkVSX0VYVCAgICAgICAgIDB4OEREMAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9CVUZGRVJfRVhUIDB4OEREOAorI2RlZmluZSBHTF9JTUFHRV9CVUZGRVJfRVhUICAgICAgICAgICAgICAgMHg5MDUxCisjZGVmaW5lIEdMX0lOVF9JTUFHRV9CVUZGRVJfRVhUICAgICAgICAgICAweDkwNUMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFX0JVRkZFUl9FWFQgIDB4OTA2NworI2RlZmluZSBHTF9URVhUVVJFX0JVRkZFUl9PRkZTRVRfRVhUICAgICAgMHg5MTlECisjZGVmaW5lIEdMX1RFWFRVUkVfQlVGRkVSX1NJWkVfRVhUICAgICAgICAweDkxOUUKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYQlVGRkVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlcik7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEJVRkZFUlJBTkdFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IGJ1ZmZlciwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleEJ1ZmZlckVYVCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleEJ1ZmZlclJhbmdlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF90ZXh0dXJlX2J1ZmZlciAqLworCisjaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAweDgzRjAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQgIDB4ODNGMQorI2VuZGlmIC8qIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGMgMQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCAgMHg4M0YyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUICAweDgzRjMKKyNlbmRpZiAvKiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjICovCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkgMQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX0FSUkFZX0VYVCAgICAgMHg5MDA5CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9BUlJBWV9FWFQgMHg5MDBBCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9NQVBfQVJSQVlfRVhUICAgICAweDkwMEMKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9TSEFET1dfRVhUIDB4OTAwRAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl9DVUJFX01BUF9BUlJBWV9FWFQgMHg5MDBFCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSX0NVQkVfTUFQX0FSUkFZX0VYVCAweDkwMEYKKyNkZWZpbmUgR0xfSU1BR0VfQ1VCRV9NQVBfQVJSQVlfRVhUICAgICAgIDB4OTA1NAorI2RlZmluZSBHTF9JTlRfSU1BR0VfQ1VCRV9NQVBfQVJSQVlfRVhUICAgMHg5MDVGCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV9DVUJFX01BUF9BUlJBWV9FWFQgMHg5MDZBCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfY3ViZV9tYXBfYXJyYXkgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgIDB4ODRGRQorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgMHg4NEZGCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAxCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCisKKyNpZm5kZWYgR0xfRVhUX3RleHR1cmVfcmcKKyNkZWZpbmUgR0xfRVhUX3RleHR1cmVfcmcgMQorI2RlZmluZSBHTF9SRURfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTAzCisjZGVmaW5lIEdMX1JHX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMjcKKyNkZWZpbmUgR0xfUjhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyOQorI2RlZmluZSBHTF9SRzhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJCCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfcmcgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zUkdCX2RlY29kZQorI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zUkdCX2RlY29kZSAxCisjZGVmaW5lIEdMX1RFWFRVUkVfU1JHQl9ERUNPREVfRVhUICAgICAgICAweDhBNDgKKyNkZWZpbmUgR0xfREVDT0RFX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4OEE0OQorI2RlZmluZSBHTF9TS0lQX0RFQ09ERV9FWFQgICAgICAgICAgICAgICAgMHg4QTRBCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfc1JHQl9kZWNvZGUgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgMQorI2RlZmluZSBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVRfRVhUICAgMHg5MTJGCisjZGVmaW5lIEdMX0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAweDgwM0MKKyNkZWZpbmUgR0xfTFVNSU5BTkNFOF9FWFQgICAgICAgICAgICAgICAgIDB4ODA0MAorI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0FMUEhBOF9FWFQgICAgICAgICAgMHg4MDQ1CisjZGVmaW5lIEdMX1JHQkEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQorI2RlZmluZSBHTF9BTFBIQTMyRl9FWFQgICAgICAgICAgICAgICAgICAgMHg4ODE2CisjZGVmaW5lIEdMX0xVTUlOQU5DRTMyRl9FWFQgICAgICAgICAgICAgICAweDg4MTgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMzJGX0VYVCAgICAgICAgIDB4ODgxOQorI2RlZmluZSBHTF9BTFBIQTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgMHg4ODFDCisjZGVmaW5lIEdMX0xVTUlOQU5DRTE2Rl9FWFQgICAgICAgICAgICAgICAweDg4MUUKKyNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMTZGX0VYVCAgICAgICAgIDB4ODgxRgorI2RlZmluZSBHTF9SMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJFCisjZGVmaW5lIEdMX1JHMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgyMzAKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTFERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFMkRFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFM0RFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTFERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UyREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTNERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTFERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTNERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTJERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWCisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYgMQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVZfRVhUIDB4ODM2OAorI2VuZGlmIC8qIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYgKi8KKworI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV92aWV3CisjZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3ZpZXcgMQorI2RlZmluZSBHTF9URVhUVVJFX1ZJRVdfTUlOX0xFVkVMX0VYVCAgICAgMHg4MkRCCisjZGVmaW5lIEdMX1RFWFRVUkVfVklFV19OVU1fTEVWRUxTX0VYVCAgICAweDgyREMKKyNkZWZpbmUgR0xfVEVYVFVSRV9WSUVXX01JTl9MQVlFUl9FWFQgICAgIDB4ODJERAorI2RlZmluZSBHTF9URVhUVVJFX1ZJRVdfTlVNX0xBWUVSU19FWFQgICAgMHg4MkRFCisjZGVmaW5lIEdMX1RFWFRVUkVfSU1NVVRBQkxFX0xFVkVMUyAgICAgICAweDgyREYKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVZJRVdFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMdWludCBvcmlndGV4dHVyZSwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHVpbnQgbWlubGV2ZWwsIEdMdWludCBudW1sZXZlbHMsIEdMdWludCBtaW5sYXllciwgR0x1aW50IG51bWxheWVycyk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4dHVyZVZpZXdFWFQgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgb3JpZ3RleHR1cmUsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0x1aW50IG1pbmxldmVsLCBHTHVpbnQgbnVtbGV2ZWxzLCBHTHVpbnQgbWlubGF5ZXIsIEdMdWludCBudW1sYXllcnMpOworI2VuZGlmCisjZW5kaWYgLyogR0xfRVhUX3RleHR1cmVfdmlldyAqLworCisjaWZuZGVmIEdMX0VYVF91bnBhY2tfc3ViaW1hZ2UKKyNkZWZpbmUgR0xfRVhUX3VucGFja19zdWJpbWFnZSAxCisjZGVmaW5lIEdMX1VOUEFDS19ST1dfTEVOR1RIX0VYVCAgICAgICAgICAweDBDRjIKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUk9XU19FWFQgICAgICAgICAgIDB4MENGMworI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9QSVhFTFNfRVhUICAgICAgICAgMHgwQ0Y0CisjZW5kaWYgLyogR0xfRVhUX3VucGFja19zdWJpbWFnZSAqLworCisjaWZuZGVmIEdMX0ZKX3NoYWRlcl9iaW5hcnlfR0NDU08KKyNkZWZpbmUgR0xfRkpfc2hhZGVyX2JpbmFyeV9HQ0NTTyAxCisjZGVmaW5lIEdMX0dDQ1NPX1NIQURFUl9CSU5BUllfRkogICAgICAgICAweDkyNjAKKyNlbmRpZiAvKiBHTF9GSl9zaGFkZXJfYmluYXJ5X0dDQ1NPICovCisKKyNpZm5kZWYgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQorI2RlZmluZSBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIDEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfSU1HICAgICAgIDB4OTEzMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0lNRyAweDkxMzQKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgIDB4OTEzNQorI2RlZmluZSBHTF9URVhUVVJFX1NBTVBMRVNfSU1HICAgICAgICAgICAgMHg5MTM2Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUlNR1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRE1VTFRJU0FNUExFSU1HUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KKworI2lmbmRlZiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkKKyNkZWZpbmUgR0xfSU1HX3Byb2dyYW1fYmluYXJ5IDEKKyNkZWZpbmUgR0xfU0dYX1BST0dSQU1fQklOQVJZX0lNRyAgICAgICAgIDB4OTEzMAorI2VuZGlmIC8qIEdMX0lNR19wcm9ncmFtX2JpbmFyeSAqLworCisjaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAorI2RlZmluZSBHTF9JTUdfcmVhZF9mb3JtYXQgMQorI2RlZmluZSBHTF9CR1JBX0lNRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0lNRyAweDgzNjUKKyNlbmRpZiAvKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KKworI2lmbmRlZiBHTF9JTUdfc2hhZGVyX2JpbmFyeQorI2RlZmluZSBHTF9JTUdfc2hhZGVyX2JpbmFyeSAxCisjZGVmaW5lIEdMX1NHWF9CSU5BUllfSU1HICAgICAgICAgICAgICAgICAweDhDMEEKKyNlbmRpZiAvKiBHTF9JTUdfc2hhZGVyX2JpbmFyeSAqLworCisjaWZuZGVmIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjCisjZGVmaW5lIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjIDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRyAweDhDMDAKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyAweDhDMDEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcgMHg4QzAyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HIDB4OEMwMworI2VuZGlmIC8qIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjICovCisKKyNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMyCisjZGVmaW5lIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjMiAxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjJfSU1HIDB4OTEzNworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYyX0lNRyAweDkxMzgKKyNlbmRpZiAvKiBHTF9JTUdfdGV4dHVyZV9jb21wcmVzc2lvbl9wdnJ0YzIgKi8KKworI2lmbmRlZiBHTF9JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeQorI2RlZmluZSBHTF9JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSAxCisjZGVmaW5lIEdMX1BFUkZRVUVSWV9TSU5HTEVfQ09OVEVYVF9JTlRFTCAweDAwMDAwMDAwCisjZGVmaW5lIEdMX1BFUkZRVUVSWV9HTE9CQUxfQ09OVEVYVF9JTlRFTCAweDAwMDAwMDAxCisjZGVmaW5lIEdMX1BFUkZRVUVSWV9XQUlUX0lOVEVMICAgICAgICAgICAweDgzRkIKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0ZMVVNIX0lOVEVMICAgICAgICAgIDB4ODNGQQorI2RlZmluZSBHTF9QRVJGUVVFUllfRE9OT1RfRkxVU0hfSU5URUwgICAgMHg4M0Y5CisjZGVmaW5lIEdMX1BFUkZRVUVSWV9DT1VOVEVSX0VWRU5UX0lOVEVMICAweDk0RjAKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0NPVU5URVJfRFVSQVRJT05fTk9STV9JTlRFTCAweDk0RjEKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0NPVU5URVJfRFVSQVRJT05fUkFXX0lOVEVMIDB4OTRGMgorI2RlZmluZSBHTF9QRVJGUVVFUllfQ09VTlRFUl9USFJPVUdIUFVUX0lOVEVMIDB4OTRGMworI2RlZmluZSBHTF9QRVJGUVVFUllfQ09VTlRFUl9SQVdfSU5URUwgICAgMHg5NEY0CisjZGVmaW5lIEdMX1BFUkZRVUVSWV9DT1VOVEVSX1RJTUVTVEFNUF9JTlRFTCAweDk0RjUKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9VSU5UMzJfSU5URUwgMHg5NEY4CisjZGVmaW5lIEdMX1BFUkZRVUVSWV9DT1VOVEVSX0RBVEFfVUlOVDY0X0lOVEVMIDB4OTRGOQorI2RlZmluZSBHTF9QRVJGUVVFUllfQ09VTlRFUl9EQVRBX0ZMT0FUX0lOVEVMIDB4OTRGQQorI2RlZmluZSBHTF9QRVJGUVVFUllfQ09VTlRFUl9EQVRBX0RPVUJMRV9JTlRFTCAweDk0RkIKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0NPVU5URVJfREFUQV9CT09MMzJfSU5URUwgMHg5NEZDCisjZGVmaW5lIEdMX1BFUkZRVUVSWV9RVUVSWV9OQU1FX0xFTkdUSF9NQVhfSU5URUwgMHg5NEZECisjZGVmaW5lIEdMX1BFUkZRVUVSWV9DT1VOVEVSX05BTUVfTEVOR1RIX01BWF9JTlRFTCAweDk0RkUKKyNkZWZpbmUgR0xfUEVSRlFVRVJZX0NPVU5URVJfREVTQ19MRU5HVEhfTUFYX0lOVEVMIDB4OTRGRgorI2RlZmluZSBHTF9QRVJGUVVFUllfR1BBX0VYVEVOREVEX0NPVU5URVJTX0lOVEVMIDB4OTUwMAordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCRUdJTlBFUkZRVUVSWUlOVEVMUFJPQykgKEdMdWludCBxdWVyeUhhbmRsZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENSRUFURVBFUkZRVUVSWUlOVEVMUFJPQykgKEdMdWludCBxdWVyeUlkLCBHTHVpbnQgKnF1ZXJ5SGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUEVSRlFVRVJZSU5URUxQUk9DKSAoR0x1aW50IHF1ZXJ5SGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUEVSRlFVRVJZSU5URUxQUk9DKSAoR0x1aW50IHF1ZXJ5SGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURklSU1RQRVJGUVVFUllJRElOVEVMUFJPQykgKEdMdWludCAqcXVlcnlJZCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE5FWFRQRVJGUVVFUllJRElOVEVMUFJPQykgKEdMdWludCBxdWVyeUlkLCBHTHVpbnQgKm5leHRRdWVyeUlkKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRkNPVU5URVJJTkZPSU5URUxQUk9DKSAoR0x1aW50IHF1ZXJ5SWQsIEdMdWludCBjb3VudGVySWQsIEdMdWludCBjb3VudGVyTmFtZUxlbmd0aCwgR0xjaGFyICpjb3VudGVyTmFtZSwgR0x1aW50IGNvdW50ZXJEZXNjTGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJEZXNjLCBHTHVpbnQgKmNvdW50ZXJPZmZzZXQsIEdMdWludCAqY291bnRlckRhdGFTaXplLCBHTHVpbnQgKmNvdW50ZXJUeXBlRW51bSwgR0x1aW50ICpjb3VudGVyRGF0YVR5cGVFbnVtLCBHTHVpbnQ2NCAqcmF3Q291bnRlck1heFZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRlFVRVJZREFUQUlOVEVMUFJPQykgKEdMdWludCBxdWVyeUhhbmRsZSwgR0x1aW50IGZsYWdzLCBHTHNpemVpIGRhdGFTaXplLCBHTHZvaWQgKmRhdGEsIEdMdWludCAqYnl0ZXNXcml0dGVuKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRlFVRVJZSURCWU5BTUVJTlRFTFBST0MpIChHTGNoYXIgKnF1ZXJ5TmFtZSwgR0x1aW50ICpxdWVyeUlkKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRlFVRVJZSU5GT0lOVEVMUFJPQykgKEdMdWludCBxdWVyeUlkLCBHTHVpbnQgcXVlcnlOYW1lTGVuZ3RoLCBHTGNoYXIgKnF1ZXJ5TmFtZSwgR0x1aW50ICpkYXRhU2l6ZSwgR0x1aW50ICpub0NvdW50ZXJzLCBHTHVpbnQgKm5vSW5zdGFuY2VzLCBHTHVpbnQgKmNhcHNNYXNrKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCZWdpblBlcmZRdWVyeUlOVEVMIChHTHVpbnQgcXVlcnlIYW5kbGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ3JlYXRlUGVyZlF1ZXJ5SU5URUwgKEdMdWludCBxdWVyeUlkLCBHTHVpbnQgKnF1ZXJ5SGFuZGxlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVBlcmZRdWVyeUlOVEVMIChHTHVpbnQgcXVlcnlIYW5kbGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUGVyZlF1ZXJ5SU5URUwgKEdMdWludCBxdWVyeUhhbmRsZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRGaXJzdFBlcmZRdWVyeUlkSU5URUwgKEdMdWludCAqcXVlcnlJZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXROZXh0UGVyZlF1ZXJ5SWRJTlRFTCAoR0x1aW50IHF1ZXJ5SWQsIEdMdWludCAqbmV4dFF1ZXJ5SWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZkNvdW50ZXJJbmZvSU5URUwgKEdMdWludCBxdWVyeUlkLCBHTHVpbnQgY291bnRlcklkLCBHTHVpbnQgY291bnRlck5hbWVMZW5ndGgsIEdMY2hhciAqY291bnRlck5hbWUsIEdMdWludCBjb3VudGVyRGVzY0xlbmd0aCwgR0xjaGFyICpjb3VudGVyRGVzYywgR0x1aW50ICpjb3VudGVyT2Zmc2V0LCBHTHVpbnQgKmNvdW50ZXJEYXRhU2l6ZSwgR0x1aW50ICpjb3VudGVyVHlwZUVudW0sIEdMdWludCAqY291bnRlckRhdGFUeXBlRW51bSwgR0x1aW50NjQgKnJhd0NvdW50ZXJNYXhWYWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmUXVlcnlEYXRhSU5URUwgKEdMdWludCBxdWVyeUhhbmRsZSwgR0x1aW50IGZsYWdzLCBHTHNpemVpIGRhdGFTaXplLCBHTHZvaWQgKmRhdGEsIEdMdWludCAqYnl0ZXNXcml0dGVuKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZRdWVyeUlkQnlOYW1lSU5URUwgKEdMY2hhciAqcXVlcnlOYW1lLCBHTHVpbnQgKnF1ZXJ5SWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZlF1ZXJ5SW5mb0lOVEVMIChHTHVpbnQgcXVlcnlJZCwgR0x1aW50IHF1ZXJ5TmFtZUxlbmd0aCwgR0xjaGFyICpxdWVyeU5hbWUsIEdMdWludCAqZGF0YVNpemUsIEdMdWludCAqbm9Db3VudGVycywgR0x1aW50ICpub0luc3RhbmNlcywgR0x1aW50ICpjYXBzTWFzayk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9JTlRFTF9wZXJmb3JtYW5jZV9xdWVyeSAqLworCisjaWZuZGVmIEdMX05WX2JsZW5kX2VxdWF0aW9uX2FkdmFuY2VkCisjZGVmaW5lIEdMX05WX2JsZW5kX2VxdWF0aW9uX2FkdmFuY2VkIDEKKyNkZWZpbmUgR0xfQkxFTkRfT1ZFUkxBUF9OViAgICAgICAgICAgICAgIDB4OTI4MQorI2RlZmluZSBHTF9CTEVORF9QUkVNVUxUSVBMSUVEX1NSQ19OViAgICAgMHg5MjgwCisjZGVmaW5lIEdMX0JMVUVfTlYgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDUKKyNkZWZpbmUgR0xfQ09MT1JCVVJOX05WICAgICAgICAgICAgICAgICAgIDB4OTI5QQorI2RlZmluZSBHTF9DT0xPUkRPREdFX05WICAgICAgICAgICAgICAgICAgMHg5Mjk5CisjZGVmaW5lIEdMX0NPTkpPSU5UX05WICAgICAgICAgICAgICAgICAgICAweDkyODQKKyNkZWZpbmUgR0xfQ09OVFJBU1RfTlYgICAgICAgICAgICAgICAgICAgIDB4OTJBMQorI2RlZmluZSBHTF9EQVJLRU5fTlYgICAgICAgICAgICAgICAgICAgICAgMHg5Mjk3CisjZGVmaW5lIEdMX0RJRkZFUkVOQ0VfTlYgICAgICAgICAgICAgICAgICAweDkyOUUKKyNkZWZpbmUgR0xfRElTSk9JTlRfTlYgICAgICAgICAgICAgICAgICAgIDB4OTI4MworI2RlZmluZSBHTF9EU1RfQVRPUF9OViAgICAgICAgICAgICAgICAgICAgMHg5MjhGCisjZGVmaW5lIEdMX0RTVF9JTl9OViAgICAgICAgICAgICAgICAgICAgICAweDkyOEIKKyNkZWZpbmUgR0xfRFNUX05WICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTI4NworI2RlZmluZSBHTF9EU1RfT1VUX05WICAgICAgICAgICAgICAgICAgICAgMHg5MjhECisjZGVmaW5lIEdMX0RTVF9PVkVSX05WICAgICAgICAgICAgICAgICAgICAweDkyODkKKyNkZWZpbmUgR0xfRVhDTFVTSU9OX05WICAgICAgICAgICAgICAgICAgIDB4OTJBMAorI2RlZmluZSBHTF9HUkVFTl9OViAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA0CisjZGVmaW5lIEdMX0hBUkRMSUdIVF9OViAgICAgICAgICAgICAgICAgICAweDkyOUIKKyNkZWZpbmUgR0xfSEFSRE1JWF9OViAgICAgICAgICAgICAgICAgICAgIDB4OTJBOQorI2RlZmluZSBHTF9IU0xfQ09MT1JfTlYgICAgICAgICAgICAgICAgICAgMHg5MkFGCisjZGVmaW5lIEdMX0hTTF9IVUVfTlYgICAgICAgICAgICAgICAgICAgICAweDkyQUQKKyNkZWZpbmUgR0xfSFNMX0xVTUlOT1NJVFlfTlYgICAgICAgICAgICAgIDB4OTJCMAorI2RlZmluZSBHTF9IU0xfU0FUVVJBVElPTl9OViAgICAgICAgICAgICAgMHg5MkFFCisjZGVmaW5lIEdMX0lOVkVSVF9PVkdfTlYgICAgICAgICAgICAgICAgICAweDkyQjQKKyNkZWZpbmUgR0xfSU5WRVJUX1JHQl9OViAgICAgICAgICAgICAgICAgIDB4OTJBMworI2RlZmluZSBHTF9MSUdIVEVOX05WICAgICAgICAgICAgICAgICAgICAgMHg5Mjk4CisjZGVmaW5lIEdMX0xJTkVBUkJVUk5fTlYgICAgICAgICAgICAgICAgICAweDkyQTUKKyNkZWZpbmUgR0xfTElORUFSRE9ER0VfTlYgICAgICAgICAgICAgICAgIDB4OTJBNAorI2RlZmluZSBHTF9MSU5FQVJMSUdIVF9OViAgICAgICAgICAgICAgICAgMHg5MkE3CisjZGVmaW5lIEdMX01JTlVTX0NMQU1QRURfTlYgICAgICAgICAgICAgICAweDkyQjMKKyNkZWZpbmUgR0xfTUlOVVNfTlYgICAgICAgICAgICAgICAgICAgICAgIDB4OTI5RgorI2RlZmluZSBHTF9NVUxUSVBMWV9OViAgICAgICAgICAgICAgICAgICAgMHg5Mjk0CisjZGVmaW5lIEdMX09WRVJMQVlfTlYgICAgICAgICAgICAgICAgICAgICAweDkyOTYKKyNkZWZpbmUgR0xfUElOTElHSFRfTlYgICAgICAgICAgICAgICAgICAgIDB4OTJBOAorI2RlZmluZSBHTF9QTFVTX0NMQU1QRURfQUxQSEFfTlYgICAgICAgICAgMHg5MkIyCisjZGVmaW5lIEdMX1BMVVNfQ0xBTVBFRF9OViAgICAgICAgICAgICAgICAweDkyQjEKKyNkZWZpbmUgR0xfUExVU19EQVJLRVJfTlYgICAgICAgICAgICAgICAgIDB4OTI5MgorI2RlZmluZSBHTF9QTFVTX05WICAgICAgICAgICAgICAgICAgICAgICAgMHg5MjkxCisjZGVmaW5lIEdMX1JFRF9OViAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDMKKyNkZWZpbmUgR0xfU0NSRUVOX05WICAgICAgICAgICAgICAgICAgICAgIDB4OTI5NQorI2RlZmluZSBHTF9TT0ZUTElHSFRfTlYgICAgICAgICAgICAgICAgICAgMHg5MjlDCisjZGVmaW5lIEdMX1NSQ19BVE9QX05WICAgICAgICAgICAgICAgICAgICAweDkyOEUKKyNkZWZpbmUgR0xfU1JDX0lOX05WICAgICAgICAgICAgICAgICAgICAgIDB4OTI4QQorI2RlZmluZSBHTF9TUkNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgMHg5Mjg2CisjZGVmaW5lIEdMX1NSQ19PVVRfTlYgICAgICAgICAgICAgICAgICAgICAweDkyOEMKKyNkZWZpbmUgR0xfU1JDX09WRVJfTlYgICAgICAgICAgICAgICAgICAgIDB4OTI4OAorI2RlZmluZSBHTF9VTkNPUlJFTEFURURfTlYgICAgICAgICAgICAgICAgMHg5MjgyCisjZGVmaW5lIEdMX1ZJVklETElHSFRfTlYgICAgICAgICAgICAgICAgICAweDkyQTYKKyNkZWZpbmUgR0xfWE9SX05WICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTEVORFBBUkFNRVRFUklOVlBST0MpIChHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRCQVJSSUVSTlZQUk9DKSAodm9pZCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRQYXJhbWV0ZXJpTlYgKEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRCYXJyaWVyTlYgKHZvaWQpOworI2VuZGlmCisjZW5kaWYgLyogR0xfTlZfYmxlbmRfZXF1YXRpb25fYWR2YW5jZWQgKi8KKworI2lmbmRlZiBHTF9OVl9ibGVuZF9lcXVhdGlvbl9hZHZhbmNlZF9jb2hlcmVudAorI2RlZmluZSBHTF9OVl9ibGVuZF9lcXVhdGlvbl9hZHZhbmNlZF9jb2hlcmVudCAxCisjZGVmaW5lIEdMX0JMRU5EX0FEVkFOQ0VEX0NPSEVSRU5UX05WICAgICAweDkyODUKKyNlbmRpZiAvKiBHTF9OVl9ibGVuZF9lcXVhdGlvbl9hZHZhbmNlZF9jb2hlcmVudCAqLworCisjaWZuZGVmIEdMX05WX2NvcHlfYnVmZmVyCisjZGVmaW5lIEdMX05WX2NvcHlfYnVmZmVyIDEKKyNkZWZpbmUgR0xfQ09QWV9SRUFEX0JVRkZFUl9OViAgICAgICAgICAgIDB4OEYzNgorI2RlZmluZSBHTF9DT1BZX1dSSVRFX0JVRkZFUl9OViAgICAgICAgICAgMHg4RjM3Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPUFlCVUZGRVJTVUJEQVRBTlZQUk9DKSAoR0xlbnVtIHJlYWRUYXJnZXQsIEdMZW51bSB3cml0ZVRhcmdldCwgR0xpbnRwdHIgcmVhZE9mZnNldCwgR0xpbnRwdHIgd3JpdGVPZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weUJ1ZmZlclN1YkRhdGFOViAoR0xlbnVtIHJlYWRUYXJnZXQsIEdMZW51bSB3cml0ZVRhcmdldCwgR0xpbnRwdHIgcmVhZE9mZnNldCwgR0xpbnRwdHIgd3JpdGVPZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9OVl9jb3B5X2J1ZmZlciAqLworCisjaWZuZGVmIEdMX05WX2NvdmVyYWdlX3NhbXBsZQorI2RlZmluZSBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgMQorI2RlZmluZSBHTF9DT1ZFUkFHRV9DT01QT05FTlRfTlYgICAgICAgICAgMHg4RUQwCisjZGVmaW5lIEdMX0NPVkVSQUdFX0NPTVBPTkVOVDRfTlYgICAgICAgICAweDhFRDEKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQVRUQUNITUVOVF9OViAgICAgICAgIDB4OEVEMgorI2RlZmluZSBHTF9DT1ZFUkFHRV9CVUZGRVJTX05WICAgICAgICAgICAgMHg4RUQzCisjZGVmaW5lIEdMX0NPVkVSQUdFX1NBTVBMRVNfTlYgICAgICAgICAgICAweDhFRDQKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQUxMX0ZSQUdNRU5UU19OViAgICAgIDB4OEVENQorI2RlZmluZSBHTF9DT1ZFUkFHRV9FREdFX0ZSQUdNRU5UU19OViAgICAgMHg4RUQ2CisjZGVmaW5lIEdMX0NPVkVSQUdFX0FVVE9NQVRJQ19OViAgICAgICAgICAweDhFRDcKKyNkZWZpbmUgR0xfQ09WRVJBR0VfQlVGRkVSX0JJVF9OViAgICAgICAgIDB4MDAwMDgwMDAKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09WRVJBR0VNQVNLTlZQUk9DKSAoR0xib29sZWFuIG1hc2spOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT1ZFUkFHRU9QRVJBVElPTk5WUFJPQykgKEdMZW51bSBvcGVyYXRpb24pOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvdmVyYWdlTWFza05WIChHTGJvb2xlYW4gbWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WIChHTGVudW0gb3BlcmF0aW9uKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX2NvdmVyYWdlX3NhbXBsZSAqLworCisjaWZuZGVmIEdMX05WX2RlcHRoX25vbmxpbmVhcgorI2RlZmluZSBHTF9OVl9kZXB0aF9ub25saW5lYXIgMQorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9OT05MSU5FQVJfTlYgMHg4RTJDCisjZW5kaWYgLyogR0xfTlZfZGVwdGhfbm9ubGluZWFyICovCisKKyNpZm5kZWYgR0xfTlZfZHJhd19idWZmZXJzCisjZGVmaW5lIEdMX05WX2RyYXdfYnVmZmVycyAxCisjZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfTlYgICAgICAgICAgICAweDg4MjQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIwX05WICAgICAgICAgICAgICAgIDB4ODgyNQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjFfTlYgICAgICAgICAgICAgICAgMHg4ODI2CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9OViAgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIzX05WICAgICAgICAgICAgICAgIDB4ODgyOAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjRfTlYgICAgICAgICAgICAgICAgMHg4ODI5CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9OViAgICAgICAgICAgICAgICAweDg4MkEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI2X05WICAgICAgICAgICAgICAgIDB4ODgyQgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjdfTlYgICAgICAgICAgICAgICAgMHg4ODJDCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9OViAgICAgICAgICAgICAgICAweDg4MkQKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI5X05WICAgICAgICAgICAgICAgIDB4ODgyRQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEwX05WICAgICAgICAgICAgICAgMHg4ODJGCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfTlYgICAgICAgICAgICAgICAweDg4MzAKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMl9OViAgICAgICAgICAgICAgIDB4ODgzMQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEzX05WICAgICAgICAgICAgICAgMHg4ODMyCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfTlYgICAgICAgICAgICAgICAweDg4MzMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNV9OViAgICAgICAgICAgICAgIDB4ODgzNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9OViAgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxX05WICAgICAgICAgICAweDhDRTEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDJfTlYgICAgICAgICAgIDB4OENFMgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UM19OViAgICAgICAgICAgMHg4Q0UzCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X05WICAgICAgICAgICAweDhDRTQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDVfTlYgICAgICAgICAgIDB4OENFNQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNl9OViAgICAgICAgICAgMHg4Q0U2CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X05WICAgICAgICAgICAweDhDRTcKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDhfTlYgICAgICAgICAgIDB4OENFOAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOV9OViAgICAgICAgICAgMHg4Q0U5CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9OViAgICAgICAgICAweDhDRUEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExX05WICAgICAgICAgIDB4OENFQgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTJfTlYgICAgICAgICAgMHg4Q0VDCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19OViAgICAgICAgICAweDhDRUQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0X05WICAgICAgICAgIDB4OENFRQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTVfTlYgICAgICAgICAgMHg4Q0VGCit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdCVUZGRVJTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdCdWZmZXJzTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX2RyYXdfYnVmZmVycyAqLworCisjaWZuZGVmIEdMX05WX2RyYXdfaW5zdGFuY2VkCisjZGVmaW5lIEdMX05WX2RyYXdfaW5zdGFuY2VkIDEKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV0FSUkFZU0lOU1RBTkNFRE5WUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXRUxFTUVOVFNJTlNUQU5DRUROVlBST0MpIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5zdGFuY2VkTlYgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBwcmltY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkTlYgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOworI2VuZGlmCisjZW5kaWYgLyogR0xfTlZfZHJhd19pbnN0YW5jZWQgKi8KKworI2lmbmRlZiBHTF9OVl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24KKyNkZWZpbmUgR0xfTlZfZXhwbGljaXRfYXR0cmliX2xvY2F0aW9uIDEKKyNlbmRpZiAvKiBHTF9OVl9leHBsaWNpdF9hdHRyaWJfbG9jYXRpb24gKi8KKworI2lmbmRlZiBHTF9OVl9mYm9fY29sb3JfYXR0YWNobWVudHMKKyNkZWZpbmUgR0xfTlZfZmJvX2NvbG9yX2F0dGFjaG1lbnRzIDEKKyNkZWZpbmUgR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX05WICAgICAgIDB4OENERgorI2VuZGlmIC8qIEdMX05WX2Zib19jb2xvcl9hdHRhY2htZW50cyAqLworCisjaWZuZGVmIEdMX05WX2ZlbmNlCisjZGVmaW5lIEdMX05WX2ZlbmNlIDEKKyNkZWZpbmUgR0xfQUxMX0NPTVBMRVRFRF9OViAgICAgICAgICAgICAgIDB4ODRGMgorI2RlZmluZSBHTF9GRU5DRV9TVEFUVVNfTlYgICAgICAgICAgICAgICAgMHg4NEYzCisjZGVmaW5lIEdMX0ZFTkNFX0NPTkRJVElPTl9OViAgICAgICAgICAgICAweDg0RjQKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFRkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFRFU1RGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZFTkNFSVZOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZJTklTSEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZlbmNlc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGZW5jZU5WIChHTHVpbnQgZmVuY2UpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50IGZlbmNlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoRmVuY2VOViAoR0x1aW50IGZlbmNlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9OVl9mZW5jZSAqLworCisjaWZuZGVmIEdMX05WX2ZyYW1lYnVmZmVyX2JsaXQKKyNkZWZpbmUgR0xfTlZfZnJhbWVidWZmZXJfYmxpdCAxCisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfTlYgICAgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUl9OViAgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfTlYgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19OViAgICAweDhDQUEKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxJVEZSQU1FQlVGRkVSTlZQUk9DKSAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsaXRGcmFtZWJ1ZmZlck5WIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9OVl9mcmFtZWJ1ZmZlcl9ibGl0ICovCisKKyNpZm5kZWYgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKKyNkZWZpbmUgR0xfTlZfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgMQorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19OViAgICAgICAgMHg4Q0FCCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfTlYgMHg4RDU2CisjZGVmaW5lIEdMX01BWF9TQU1QTEVTX05WICAgICAgICAgICAgICAgICAweDhENTcKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU1VTFRJU0FNUExFTlZQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVOViAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCisKKyNpZm5kZWYgR0xfTlZfZ2VuZXJhdGVfbWlwbWFwX3NSR0IKKyNkZWZpbmUgR0xfTlZfZ2VuZXJhdGVfbWlwbWFwX3NSR0IgMQorI2VuZGlmIC8qIEdMX05WX2dlbmVyYXRlX21pcG1hcF9zUkdCICovCisKKyNpZm5kZWYgR0xfTlZfaW5zdGFuY2VkX2FycmF5cworI2RlZmluZSBHTF9OVl9pbnN0YW5jZWRfYXJyYXlzIDEKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SX05WIDB4ODhGRQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xWRVJURVhBVFRSSUJESVZJU09STlZQUk9DKSAoR0x1aW50IGluZGV4LCBHTHVpbnQgZGl2aXNvcik7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliRGl2aXNvck5WIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX2luc3RhbmNlZF9hcnJheXMgKi8KKworI2lmbmRlZiBHTF9OVl9ub25fc3F1YXJlX21hdHJpY2VzCisjZGVmaW5lIEdMX05WX25vbl9zcXVhcmVfbWF0cmljZXMgMQorI2RlZmluZSBHTF9GTE9BVF9NQVQyeDNfTlYgICAgICAgICAgICAgICAgMHg4QjY1CisjZGVmaW5lIEdMX0ZMT0FUX01BVDJ4NF9OViAgICAgICAgICAgICAgICAweDhCNjYKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM3gyX05WICAgICAgICAgICAgICAgIDB4OEI2NworI2RlZmluZSBHTF9GTE9BVF9NQVQzeDRfTlYgICAgICAgICAgICAgICAgMHg4QjY4CisjZGVmaW5lIEdMX0ZMT0FUX01BVDR4Ml9OViAgICAgICAgICAgICAgICAweDhCNjkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNHgzX05WICAgICAgICAgICAgICAgIDB4OEI2QQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlgzRlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM1gyRlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYMlg0RlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgyRlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYM1g0RlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVTklGT1JNTUFUUklYNFgzRlZOVlBST0MpIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDNmdk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDN4MmZ2TlYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4Mng0ZnZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDJmdk5WIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDN4NGZ2TlYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NHgzZnZOViAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX25vbl9zcXVhcmVfbWF0cmljZXMgKi8KKworI2lmbmRlZiBHTF9OVl9yZWFkX2J1ZmZlcgorI2RlZmluZSBHTF9OVl9yZWFkX2J1ZmZlciAxCisjZGVmaW5lIEdMX1JFQURfQlVGRkVSX05WICAgICAgICAgICAgICAgICAweDBDMDIKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVBREJVRkZFUk5WUFJPQykgKEdMZW51bSBtb2RlKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkQnVmZmVyTlYgKEdMZW51bSBtb2RlKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX05WX3JlYWRfYnVmZmVyICovCisKKyNpZm5kZWYgR0xfTlZfcmVhZF9idWZmZXJfZnJvbnQKKyNkZWZpbmUgR0xfTlZfcmVhZF9idWZmZXJfZnJvbnQgMQorI2VuZGlmIC8qIEdMX05WX3JlYWRfYnVmZmVyX2Zyb250ICovCisKKyNpZm5kZWYgR0xfTlZfcmVhZF9kZXB0aAorI2RlZmluZSBHTF9OVl9yZWFkX2RlcHRoIDEKKyNlbmRpZiAvKiBHTF9OVl9yZWFkX2RlcHRoICovCisKKyNpZm5kZWYgR0xfTlZfcmVhZF9kZXB0aF9zdGVuY2lsCisjZGVmaW5lIEdMX05WX3JlYWRfZGVwdGhfc3RlbmNpbCAxCisjZW5kaWYgLyogR0xfTlZfcmVhZF9kZXB0aF9zdGVuY2lsICovCisKKyNpZm5kZWYgR0xfTlZfcmVhZF9zdGVuY2lsCisjZGVmaW5lIEdMX05WX3JlYWRfc3RlbmNpbCAxCisjZW5kaWYgLyogR0xfTlZfcmVhZF9zdGVuY2lsICovCisKKyNpZm5kZWYgR0xfTlZfc1JHQl9mb3JtYXRzCisjZGVmaW5lIEdMX05WX3NSR0JfZm9ybWF0cyAxCisjZGVmaW5lIEdMX1NMVU1JTkFOQ0VfTlYgICAgICAgICAgICAgICAgICAweDhDNDYKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRV9BTFBIQV9OViAgICAgICAgICAgIDB4OEM0NAorI2RlZmluZSBHTF9TUkdCOF9OViAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQxCisjZGVmaW5lIEdMX1NMVU1JTkFOQ0U4X05WICAgICAgICAgICAgICAgICAweDhDNDcKKyNkZWZpbmUgR0xfU0xVTUlOQU5DRThfQUxQSEE4X05WICAgICAgICAgIDB4OEM0NQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX05WICAgMHg4QzRDCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDFfTlYgMHg4QzRECisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfTlYgMHg4QzRFCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDVfTlYgMHg4QzRGCisjZGVmaW5lIEdMX0VUQzFfU1JHQjhfTlYgICAgICAgICAgICAgICAgICAweDg4RUUKKyNlbmRpZiAvKiBHTF9OVl9zUkdCX2Zvcm1hdHMgKi8KKworI2lmbmRlZiBHTF9OVl9zaGFkb3dfc2FtcGxlcnNfYXJyYXkKKyNkZWZpbmUgR0xfTlZfc2hhZG93X3NhbXBsZXJzX2FycmF5IDEKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUlJBWV9TSEFET1dfTlYgICAgIDB4OERDNAorI2VuZGlmIC8qIEdMX05WX3NoYWRvd19zYW1wbGVyc19hcnJheSAqLworCisjaWZuZGVmIEdMX05WX3NoYWRvd19zYW1wbGVyc19jdWJlCisjZGVmaW5lIEdMX05WX3NoYWRvd19zYW1wbGVyc19jdWJlIDEKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX1NIQURPV19OViAgICAgICAgIDB4OERDNQorI2VuZGlmIC8qIEdMX05WX3NoYWRvd19zYW1wbGVyc19jdWJlICovCisKKyNpZm5kZWYgR0xfTlZfdGV4dHVyZV9ib3JkZXJfY2xhbXAKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9ib3JkZXJfY2xhbXAgMQorI2RlZmluZSBHTF9URVhUVVJFX0JPUkRFUl9DT0xPUl9OViAgICAgICAgMHgxMDA0CisjZGVmaW5lIEdMX0NMQU1QX1RPX0JPUkRFUl9OViAgICAgICAgICAgICAweDgxMkQKKyNlbmRpZiAvKiBHTF9OVl90ZXh0dXJlX2JvcmRlcl9jbGFtcCAqLworCisjaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fczN0Y191cGRhdGUKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjX3VwZGF0ZSAxCisjZW5kaWYgLyogR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjX3VwZGF0ZSAqLworCisjaWZuZGVmIEdMX05WX3RleHR1cmVfbnBvdF8yRF9taXBtYXAKKyNkZWZpbmUgR0xfTlZfdGV4dHVyZV9ucG90XzJEX21pcG1hcCAxCisjZW5kaWYgLyogR0xfTlZfdGV4dHVyZV9ucG90XzJEX21pcG1hcCAqLworCisjaWZuZGVmIEdMX1FDT01fYWxwaGFfdGVzdAorI2RlZmluZSBHTF9RQ09NX2FscGhhX3Rlc3QgMQorI2RlZmluZSBHTF9BTFBIQV9URVNUX1FDT00gICAgICAgICAgICAgICAgMHgwQkMwCisjZGVmaW5lIEdMX0FMUEhBX1RFU1RfRlVOQ19RQ09NICAgICAgICAgICAweDBCQzEKKyNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUZfUUNPTSAgICAgICAgICAgIDB4MEJDMgordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xBTFBIQUZVTkNRQ09NUFJPQykgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY1FDT00gKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworI2VuZGlmCisjZW5kaWYgLyogR0xfUUNPTV9hbHBoYV90ZXN0ICovCisKKyNpZm5kZWYgR0xfUUNPTV9iaW5uaW5nX2NvbnRyb2wKKyNkZWZpbmUgR0xfUUNPTV9iaW5uaW5nX2NvbnRyb2wgMQorI2RlZmluZSBHTF9CSU5OSU5HX0NPTlRST0xfSElOVF9RQ09NICAgICAgMHg4RkIwCisjZGVmaW5lIEdMX0NQVV9PUFRJTUlaRURfUUNPTSAgICAgICAgICAgICAweDhGQjEKKyNkZWZpbmUgR0xfR1BVX09QVElNSVpFRF9RQ09NICAgICAgICAgICAgIDB4OEZCMgorI2RlZmluZSBHTF9SRU5ERVJfRElSRUNUX1RPX0ZSQU1FQlVGRkVSX1FDT00gMHg4RkIzCisjZW5kaWYgLyogR0xfUUNPTV9iaW5uaW5nX2NvbnRyb2wgKi8KKworI2lmbmRlZiBHTF9RQ09NX2RyaXZlcl9jb250cm9sCisjZGVmaW5lIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgMQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVREUklWRVJDT05UUk9MU1FDT01QUk9DKSAoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VURFJJVkVSQ09OVFJPTFNUUklOR1FDT01QUk9DKSAoR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFTkFCTEVEUklWRVJDT05UUk9MUUNPTVBST0MpIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERJU0FCTEVEUklWRVJDT05UUk9MUUNPTVBST0MpIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7CisjaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NIChHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00gKEdMdWludCBkcml2ZXJDb250cm9sKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KKworI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAorI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldCAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV0lEVEhfUUNPTSAgICAgICAgICAgICAweDhCRDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9IRUlHSFRfUUNPTSAgICAgICAgICAgIDB4OEJEMworI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1FDT00gICAgICAgICAgICAgMHg4QkQ0CisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUX1FDT00gICAweDhCRDUKKyNkZWZpbmUgR0xfVEVYVFVSRV9GT1JNQVRfUUNPTSAgICAgICAgICAgIDB4OEJENgorI2RlZmluZSBHTF9URVhUVVJFX1RZUEVfUUNPTSAgICAgICAgICAgICAgMHg4QkQ3CisjZGVmaW5lIEdMX1RFWFRVUkVfSU1BR0VfVkFMSURfUUNPTSAgICAgICAweDhCRDgKKyNkZWZpbmUgR0xfVEVYVFVSRV9OVU1fTEVWRUxTX1FDT00gICAgICAgIDB4OEJEOQorI2RlZmluZSBHTF9URVhUVVJFX1RBUkdFVF9RQ09NICAgICAgICAgICAgMHg4QkRBCisjZGVmaW5lIEdMX1RFWFRVUkVfT0JKRUNUX1ZBTElEX1FDT00gICAgICAweDhCREIKKyNkZWZpbmUgR0xfU1RBVEVfUkVTVE9SRSAgICAgICAgICAgICAgICAgIDB4OEJEQwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRURVhUVVJFU1FDT01QUk9DKSAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEJVRkZFUlNRQ09NUFJPQykgKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRSRU5ERVJCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VURlJBTUVCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYTEVWRUxQQVJBTUVURVJJVlFDT01QUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUVEVYT0JKRUNUU1RBVEVPVkVSUklERUlRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRURVhTVUJJTUFHRVFDT01QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCAqdGV4ZWxzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSUE9JTlRFUlZRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIHZvaWQgKipwYXJhbXMpOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleHR1cmVzUUNPTSAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJzUUNPTSAoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleFN1YkltYWdlUUNPTSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCAqdGV4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSAoR0xlbnVtIHRhcmdldCwgdm9pZCAqKnBhcmFtcyk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLworCisjaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MgorI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldDIgMQordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRTSEFERVJTUUNPTVBST0MpIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUFJPR1JBTVNRQ09NUFJPQykgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwordHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTEVYVElTUFJPR1JBTUJJTkFSWVFDT01QUk9DKSAoR0x1aW50IHByb2dyYW0pOwordHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNQklOQVJZU09VUkNFUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKKyNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRTaGFkZXJzUUNPTSAoR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRQcm9ncmFtc1FDT00gKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGNoYXIgKnNvdXJjZSwgR0xpbnQgKmxlbmd0aCk7CisjZW5kaWYKKyNlbmRpZiAvKiBHTF9RQ09NX2V4dGVuZGVkX2dldDIgKi8KKworI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKKyNkZWZpbmUgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlIDEKKyNkZWZpbmUgR0xfUEVSRk1PTl9HTE9CQUxfTU9ERV9RQ09NICAgICAgIDB4OEZBMAorI2VuZGlmIC8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLworCisjaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCisjZGVmaW5lIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nIDEKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMF9RQ09NICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMV9RQ09NICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMl9RQ09NICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUM19RQ09NICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNF9RQ09NICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNV9RQ09NICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNl9RQ09NICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUN19RQ09NICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDBfUUNPTSAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDFfUUNPTSAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDJfUUNPTSAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDNfUUNPTSAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDRfUUNPTSAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDVfUUNPTSAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDZfUUNPTSAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDdfUUNPTSAgIDB4ODAwMDAwMDAKK3R5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU1RBUlRUSUxJTkdRQ09NUFJPQykgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Cit0eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFRJTElOR1FDT01QUk9DKSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOworI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0YXJ0VGlsaW5nUUNPTSAoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuZFRpbGluZ1FDT00gKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKKyNlbmRpZgorI2VuZGlmIC8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCisKKyNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCisjZGVmaW5lIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZyAxCisjZGVmaW5lIEdMX1dSSVRFT05MWV9SRU5ERVJJTkdfUUNPTSAgICAgICAweDg4MjMKKyNlbmRpZiAvKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KKworI2lmbmRlZiBHTF9WSVZfc2hhZGVyX2JpbmFyeQorI2RlZmluZSBHTF9WSVZfc2hhZGVyX2JpbmFyeSAxCisjZGVmaW5lIEdMX1NIQURFUl9CSU5BUllfVklWICAgICAgICAgICAgICAweDhGQzQKKyNlbmRpZiAvKiBHTF9WSVZfc2hhZGVyX2JpbmFyeSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzIvZ2wycGxhdGZvcm0uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzIvZ2wycGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ0ZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9HTEVTMi9nbDJwbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMzAgQEAKKyNpZm5kZWYgX19nbDJwbGF0Zm9ybV9oXworI2RlZmluZSBfX2dsMnBsYXRmb3JtX2hfCisKKy8qICRSZXZpc2lvbjogMjMzMjggJCBvbiAkRGF0ZTo6IDIwMTMtMTAtMDIgMDI6Mjg6MjggLTA3MDAgIyQgKi8KKworLyoKKyAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCisgKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCisgKi8KKworLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBPcGVuR0wgRVMgMi5YICBnbDIuaAorICoKKyAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCisgKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKKyAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKKyAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKKyAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIk9wZW5HTC1FUyIgY29tcG9uZW50ICJSZWdpc3RyeSIuCisgKi8KKworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorCisjaWZuZGVmIEdMX0FQSUNBTEwKKyNkZWZpbmUgR0xfQVBJQ0FMTCAgS0hST05PU19BUElDQUxMCisjZW5kaWYKKworI2lmbmRlZiBHTF9BUElFTlRSWQorI2RlZmluZSBHTF9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCisjZW5kaWYKKworI2VuZGlmIC8qIF9fZ2wycGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzMvZ2wzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTMxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsMy5oCkBAIC0wLDAgKzEsOTM5IEBACisjaWZuZGVmIF9fZ2wzX2hfCisjZGVmaW5lIF9fZ2wzX2hfIDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorKiogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorKioKKyoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisqKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisqKiAiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyoqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyoqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8KKyoqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisqKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqKgorKiogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyoqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4KKyoqCisqKiBUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorKiogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisqKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisqKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorKiogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyoqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisqKiBNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLgorKi8KKy8qCisqKiBUaGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgS2hyb25vcyBPcGVuR0wgLyBPcGVuR0wgRVMgWE1MCisqKiBBUEkgUmVnaXN0cnkuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJlZ2lzdHJ5LCBnZW5lcmF0b3Igc2NyaXB0cworKiogdXNlZCB0byBtYWtlIHRoZSBoZWFkZXIsIGFuZCB0aGUgaGVhZGVyIGNhbiBiZSBmb3VuZCBhdAorKiogICBodHRwOi8vd3d3Lm9wZW5nbC5vcmcvcmVnaXN0cnkvCisqKgorKiogS2hyb25vcyAkUmV2aXNpb246IDI2Njk2ICQgb24gJERhdGU6IDIwMTQtMDUtMTcgMTQ6NDg6NTUgLTA3MDAgKFNhdCwgMTcgTWF5IDIwMTQpICQKKyovCisKKyNpbmNsdWRlIDxHTEVTMy9nbDNwbGF0Zm9ybS5oPgorCisvKiBHZW5lcmF0ZWQgb24gZGF0ZSAyMDE0MDUxNyAqLworCisvKiBHZW5lcmF0ZWQgQyBoZWFkZXIgZm9yOgorICogQVBJOiBnbGVzMgorICogUHJvZmlsZTogY29tbW9uCisgKiBWZXJzaW9ucyBjb25zaWRlcmVkOiAyXC5bMC05XXwzLjAKKyAqIFZlcnNpb25zIGVtaXR0ZWQ6IC4qCisgKiBEZWZhdWx0IGV4dGVuc2lvbnMgaW5jbHVkZWQ6IE5vbmUKKyAqIEFkZGl0aW9uYWwgZXh0ZW5zaW9ucyBpbmNsdWRlZDogX25vbWF0Y2hfXgorICogRXh0ZW5zaW9ucyByZW1vdmVkOiBfbm9tYXRjaF9eCisgKi8KKworI2lmbmRlZiBHTF9FU19WRVJTSU9OXzJfMAorI2RlZmluZSBHTF9FU19WRVJTSU9OXzJfMCAxCisjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+Cit0eXBlZGVmIGtocm9ub3NfaW50OF90IEdMYnl0ZTsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90IEdMY2xhbXBmOwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgR0xmaXhlZDsKK3R5cGVkZWYgc2hvcnQgR0xzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0x1c2hvcnQ7Cit0eXBlZGVmIHZvaWQgR0x2b2lkOwordHlwZWRlZiBzdHJ1Y3QgX19HTHN5bmMgKkdMc3luYzsKK3R5cGVkZWYga2hyb25vc19pbnQ2NF90IEdMaW50NjQ7Cit0eXBlZGVmIGtocm9ub3NfdWludDY0X3QgR0x1aW50NjQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTHVpbnQ7Cit0eXBlZGVmIGNoYXIgR0xjaGFyOwordHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgR0xmbG9hdDsKK3R5cGVkZWYga2hyb25vc19zc2l6ZV90IEdMc2l6ZWlwdHI7Cit0eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGJpdGZpZWxkOwordHlwZWRlZiBpbnQgR0xpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0xib29sZWFuOwordHlwZWRlZiBpbnQgR0xzaXplaTsKK3R5cGVkZWYga2hyb25vc191aW50OF90IEdMdWJ5dGU7CisjZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCisjZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKKyNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMworI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKKyNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgorI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3CisjZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKKyNkZWZpbmUgR0xfRlVOQ19BREQgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTiAgICAgICAgICAgICAgICAgMHg4MDA5CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgIDB4ODgzRAorI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgMHg4MDBBCisjZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAweDgwMEIKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOAorI2RlZmluZSBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM5CisjZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0EKKyNkZWZpbmUgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQgorI2RlZmluZSBHTF9DT05TVEFOVF9DT0xPUiAgICAgICAgICAgICAgICAgMHg4MDAxCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUiAgICAgICAweDgwMDIKKyNkZWZpbmUgR0xfQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODAwMworI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEEgICAgICAgMHg4MDA0CisjZGVmaW5lIEdMX0JMRU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAweDgwMDUKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4ODg5MgorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgMHg4ODkzCisjZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDg4OTQKKyNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgIDB4ODg5NQorI2RlZmluZSBHTF9TVFJFQU1fRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEUwCisjZGVmaW5lIEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTQKKyNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAorI2RlZmluZSBHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgMHg4NzY0CisjZGVmaW5lIEdMX0JVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICAweDg3NjUKKyNkZWZpbmUgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICAgICAgICAgIDB4ODYyNgorI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAorI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCisjZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKKyNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisjZGVmaW5lIEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAweDA1MDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgIDB4MDUwMQorI2RlZmluZSBHTF9JTlZBTElEX09QRVJBVElPTiAgICAgICAgICAgICAgMHgwNTAyCisjZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKKyNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAorI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCisjZGVmaW5lIEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAweDBCMjEKKyNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAorI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCisjZGVmaW5lIEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAweDBCNDUKKyNkZWZpbmUgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgIDB4MEI0NgorI2RlZmluZSBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgMHgwQjcwCisjZGVmaW5lIEdMX0RFUFRIX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBCNzIKKyNkZWZpbmUgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEI3MworI2RlZmluZSBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgMHgwQjc0CisjZGVmaW5lIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAweDBCOTEKKyNkZWZpbmUgR0xfU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgIDB4MEI5MgorI2RlZmluZSBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgMHgwQjk0CisjZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAweDBCOTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDB4MEI5NgorI2RlZmluZSBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgMHgwQjk3CisjZGVmaW5lIEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAweDBCOTMKKyNkZWZpbmUgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgIDB4MEI5OAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQyAgICAgICAgICAgICAgMHg4ODAwCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GQUlMICAgICAgICAgICAgICAweDg4MDEKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCAgIDB4ODgwMgorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTICAgMHg4ODAzCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19SRUYgICAgICAgICAgICAgICAweDhDQTMKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0sgICAgICAgIDB4OENBNAorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLICAgICAgICAgMHg4Q0E1CisjZGVmaW5lIEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAweDBCQTIKKyNkZWZpbmUgR0xfU0NJU1NPUl9CT1ggICAgICAgICAgICAgICAgICAgIDB4MEMxMAorI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQzIyCisjZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBDMjMKKyNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQorI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKKyNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQorI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCisjZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKKyNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MworI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0CisjZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKKyNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgorI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3CisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAweDJBMDAKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgIDB4ODAzOAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgMHg4MDY5CisjZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAweDgwQTgKKyNkZWZpbmUgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBBOQorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgMHg4MEFBCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAweDgwQUIKKyNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCisjZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKKyNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQorI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCisjZGVmaW5lIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAweDgxOTIKKyNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAorI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCisjZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMworI2RlZmluZSBHTF9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICAweDE0MDUKKyNkZWZpbmUgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNgorI2RlZmluZSBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAweDE5MDIKKyNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgorI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3CisjZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKKyNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQorI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAweDhCMzAKKyNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgIDB4OEIzMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQlMgICAgICAgICAgICAgMHg4ODY5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAweDhERkIKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAgICAgICAgICAgIDB4OERGQworI2RlZmluZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyAweDhCNEQKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0QworI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgICAgICAgMHg4ODcyCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAweDhERkQKKyNkZWZpbmUgR0xfU0hBREVSX1RZUEUgICAgICAgICAgICAgICAgICAgIDB4OEI0RgorI2RlZmluZSBHTF9ERUxFVEVfU1RBVFVTICAgICAgICAgICAgICAgICAgMHg4QjgwCisjZGVmaW5lIEdMX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDhCODIKKyNkZWZpbmUgR0xfVkFMSURBVEVfU1RBVFVTICAgICAgICAgICAgICAgIDB4OEI4MworI2RlZmluZSBHTF9BVFRBQ0hFRF9TSEFERVJTICAgICAgICAgICAgICAgMHg4Qjg1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAweDhCODYKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCAgICAgIDB4OEI4NworI2RlZmluZSBHTF9BQ1RJVkVfQVRUUklCVVRFUyAgICAgICAgICAgICAgMHg4Qjg5CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAweDhCOEEKKyNkZWZpbmUgR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OICAgICAgIDB4OEI4QworI2RlZmluZSBHTF9DVVJSRU5UX1BST0dSQU0gICAgICAgICAgICAgICAgMHg4QjhECisjZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKKyNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQorI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCisjZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKKyNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAorI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1CisjZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKKyNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNworI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCisjZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKKyNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgorI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCisjZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKKyNkZWZpbmUgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNworI2RlZmluZSBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA4CisjZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKKyNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQorI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCisjZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKKyNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAorI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQorI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAorI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMworI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAweDg1MTMKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgIDB4ODUxNAorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggICAgMHg4NTE1CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAweDg1MTYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgIDB4ODUxNworI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgMHg4NTE4CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAweDg1MTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aICAgIDB4ODUxQQorI2RlZmluZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICAgICAgMHg4NTFDCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorI2RlZmluZSBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgMHg4NEUwCisjZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKKyNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgorI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgMHg4MzcwCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzIgICAgICAgICAgICAgICAgICAgICAweDhCNTAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1MQorI2RlZmluZSBHTF9GTE9BVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgMHg4QjUyCisjZGVmaW5lIEdMX0lOVF9WRUMyICAgICAgICAgICAgICAgICAgICAgICAweDhCNTMKKyNkZWZpbmUgR0xfSU5UX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NAorI2RlZmluZSBHTF9JTlRfVkVDNCAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU1CisjZGVmaW5lIEdMX0JPT0wgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCNTYKKyNkZWZpbmUgR0xfQk9PTF9WRUMyICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NworI2RlZmluZSBHTF9CT09MX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgMHg4QjU4CisjZGVmaW5lIEdMX0JPT0xfVkVDNCAgICAgICAgICAgICAgICAgICAgICAweDhCNTkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1QQorI2RlZmluZSBHTF9GTE9BVF9NQVQzICAgICAgICAgICAgICAgICAgICAgMHg4QjVCCisjZGVmaW5lIEdMX0ZMT0FUX01BVDQgICAgICAgICAgICAgICAgICAgICAweDhCNUMKKyNkZWZpbmUgR0xfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RQorI2RlZmluZSBHTF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAgICAgMHg4QjYwCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAweDg2MjIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFICAgICAgIDB4ODYyMworI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSAgICAgMHg4NjI0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAweDg2MjUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEIDB4ODg2QQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIgICAgMHg4NjQ1CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlGCisjZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQgMHg4QjlCCisjZGVmaW5lIEdMX0NPTVBJTEVfU1RBVFVTICAgICAgICAgICAgICAgICAweDhCODEKKyNkZWZpbmUgR0xfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgICAgIDB4OEI4NAorI2RlZmluZSBHTF9TSEFERVJfU09VUkNFX0xFTkdUSCAgICAgICAgICAgMHg4Qjg4CisjZGVmaW5lIEdMX1NIQURFUl9DT01QSUxFUiAgICAgICAgICAgICAgICAweDhERkEKKyNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgICAgIDB4OERGOAorI2RlZmluZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgMHg4REY5CisjZGVmaW5lIEdMX0xPV19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDhERjAKKyNkZWZpbmUgR0xfTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4OERGMQorI2RlZmluZSBHTF9ISUdIX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgMHg4REYyCisjZGVmaW5lIEdMX0xPV19JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDhERjMKKyNkZWZpbmUgR0xfTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgIDB4OERGNAorI2RlZmluZSBHTF9ISUdIX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4REY1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSICAgICAgICAgICAgICAgICAgICAweDhENDAKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSICAgICAgICAgICAgICAgICAgIDB4OEQ0MQorI2RlZmluZSBHTF9SR0JBNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU2CisjZGVmaW5lIEdMX1JHQjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTcKKyNkZWZpbmUgR0xfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MgorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgMHg4MUE1CisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4ICAgICAgICAgICAgICAgICAweDhENDgKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1dJRFRIICAgICAgICAgICAgIDB4OEQ0MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUICAgICAgICAgICAgMHg4RDQzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQgICAweDhENDQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFICAgICAgICAgIDB4OEQ1MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRSAgICAgICAgMHg4RDUxCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkUgICAgICAgICAweDhENTIKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUgICAgICAgIDB4OEQ1MworI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRSAgICAgICAgMHg4RDU0CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkUgICAgICAweDhENTUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSAweDhDRDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSAweDhDRDEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMIDB4OENEMgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRSAweDhDRDMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDAgICAgICAgICAgICAgIDB4OENFMAorI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgMHg4RDAwCisjZGVmaW5lIEdMX1NURU5DSUxfQVRUQUNITUVOVCAgICAgICAgICAgICAweDhEMjAKKyNkZWZpbmUgR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUgICAgICAgICAgIDB4OENENQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQgMHg4Q0Q2CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIDB4OENENworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgMHg4Q0Q5CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEICAgICAgICAweDhDREQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAgICAgIDB4OENBNgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgMHg4Q0E3CisjZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSAgICAgICAgICAweDg0RTgKKyNkZWZpbmUgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gIDB4MDUwNgorR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZSAoR0xlbnVtIHRleHR1cmUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQXR0YWNoU2hhZGVyIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRGcmFtZWJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kQ29sb3IgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvbiAoR0xlbnVtIG1vZGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmMgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIHNmYWN0b3JSR0IsIEdMZW51bSBkZmFjdG9yUkdCLCBHTGVudW0gc2ZhY3RvckFscGhhLCBHTGVudW0gZGZhY3RvckFscGhhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJ1ZmZlckRhdGEgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJ1ZmZlclN1YkRhdGEgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCB2b2lkICpkYXRhKTsKK0dMX0FQSUNBTEwgR0xlbnVtIEdMX0FQSUVOVFJZIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aGYgKEdMZmxvYXQgZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JNYXNrIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcGlsZVNoYWRlciAoR0x1aW50IHNoYWRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUElDQUxMIEdMdWludCBHTF9BUElFTlRSWSBnbENyZWF0ZVByb2dyYW0gKHZvaWQpOworR0xfQVBJQ0FMTCBHTHVpbnQgR0xfQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXIgKEdMZW51bSB0eXBlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhGdW5jIChHTGVudW0gZnVuYyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGZsb2F0IG4sIEdMZmxvYXQgZik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXRhY2hTaGFkZXIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZSAoR0xlbnVtIGNhcCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSAoR0x1aW50IGluZGV4KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGbHVzaCAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRnJvbnRGYWNlIChHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5CdWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcCAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBY3RpdmVBdHRyaWIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybSAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBdHRhY2hlZFNoYWRlcnMgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heENvdW50LCBHTHNpemVpICpjb3VudCwgR0x1aW50ICpzaGFkZXJzKTsKK0dMX0FQSUNBTEwgR0xpbnQgR0xfQVBJRU5UUlkgZ2xHZXRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZsb2F0diAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50ICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1pdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtSW5mb0xvZyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJpdiAoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNoYWRlckluZm9Mb2cgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0IChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50ICpyYW5nZSwgR0xpbnQgKnByZWNpc2lvbik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJTb3VyY2UgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnNvdXJjZSk7CitHTF9BUElDQUxMIGNvbnN0IEdMdWJ5dGUgKkdMX0FQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1pdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0xpbnQgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliaXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgdm9pZCAqKnBvaW50ZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsSGludCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0J1ZmZlciAoR0x1aW50IGJ1ZmZlcik7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRW5hYmxlZCAoR0xlbnVtIGNhcCk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzRnJhbWVidWZmZXIgKEdMdWludCBmcmFtZWJ1ZmZlcik7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlciAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNUZXh0dXJlIChHTHVpbnQgdGV4dHVyZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTGlua1Byb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFBvbHlnb25PZmZzZXQgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbGVhc2VTaGFkZXJDb21waWxlciAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGZsb2F0IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNoYWRlckJpbmFyeSAoR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCB2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNoYWRlclNvdXJjZSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICpjb25zdCpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxPcFNlcGFyYXRlIChHTGVudW0gZmFjZSwgR0xlbnVtIHNmYWlsLCBHTGVudW0gZHBmYWlsLCBHTGVudW0gZHBwYXNzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZnYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2YgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2kgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTRmIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTRpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTRpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVc2VQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWYWxpZGF0ZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZiAoR0x1aW50IGluZGV4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZnYgKEdMdWludCBpbmRleCwgY29uc3QgR0xmbG9hdCAqdik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IHZvaWQgKnBvaW50ZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKyNlbmRpZiAvKiBHTF9FU19WRVJTSU9OXzJfMCAqLworCisjaWZuZGVmIEdMX0VTX1ZFUlNJT05fM18wCisjZGVmaW5lIEdMX0VTX1ZFUlNJT05fM18wIDEKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgR0xoYWxmOworI2RlZmluZSBHTF9SRUFEX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgMHgwQzAyCisjZGVmaW5lIEdMX1VOUEFDS19ST1dfTEVOR1RIICAgICAgICAgICAgICAweDBDRjIKKyNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUk9XUyAgICAgICAgICAgICAgIDB4MENGMworI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9QSVhFTFMgICAgICAgICAgICAgMHgwQ0Y0CisjZGVmaW5lIEdMX1BBQ0tfUk9XX0xFTkdUSCAgICAgICAgICAgICAgICAweDBEMDIKKyNkZWZpbmUgR0xfUEFDS19TS0lQX1JPV1MgICAgICAgICAgICAgICAgIDB4MEQwMworI2RlZmluZSBHTF9QQUNLX1NLSVBfUElYRUxTICAgICAgICAgICAgICAgMHgwRDA0CisjZGVmaW5lIEdMX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDAKKyNkZWZpbmUgR0xfREVQVEggICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMQorI2RlZmluZSBHTF9TVEVOQ0lMICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAyCisjZGVmaW5lIEdMX1JFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDMKKyNkZWZpbmUgR0xfUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQorI2RlZmluZSBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU4CisjZGVmaW5lIEdMX1JHQjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAweDgwNTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzNEICAgICAgICAgICAgIDB4ODA2QQorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9JTUFHRVMgICAgICAgICAgICAgMHg4MDZECisjZGVmaW5lIEdMX1VOUEFDS19JTUFHRV9IRUlHSFQgICAgICAgICAgICAweDgwNkUKKyNkZWZpbmUgR0xfVEVYVFVSRV8zRCAgICAgICAgICAgICAgICAgICAgIDB4ODA2RgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUiAgICAgICAgICAgICAgICAgMHg4MDcyCisjZGVmaW5lIEdMX01BWF8zRF9URVhUVVJFX1NJWkUgICAgICAgICAgICAweDgwNzMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWICAgIDB4ODM2OAorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAweDgwRTkKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fTE9EICAgICAgICAgICAgICAgIDB4ODEzQQorI2RlZmluZSBHTF9URVhUVVJFX01BWF9MT0QgICAgICAgICAgICAgICAgMHg4MTNCCisjZGVmaW5lIEdMX1RFWFRVUkVfQkFTRV9MRVZFTCAgICAgICAgICAgICAweDgxM0MKKyNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfTEVWRUwgICAgICAgICAgICAgIDB4ODEzRAorI2RlZmluZSBHTF9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3CisjZGVmaW5lIEdMX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDgKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjQgICAgICAgICAgICAgIDB4ODFBNgorI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9MT0RfQklBUyAgICAgICAgICAgMHg4NEZECisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUEFSRV9NT0RFICAgICAgICAgICAweDg4NEMKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkMgICAgICAgICAgIDB4ODg0RAorI2RlZmluZSBHTF9DVVJSRU5UX1FVRVJZICAgICAgICAgICAgICAgICAgMHg4ODY1CisjZGVmaW5lIEdMX1FVRVJZX1JFU1VMVCAgICAgICAgICAgICAgICAgICAweDg4NjYKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRSAgICAgICAgIDB4ODg2NworI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEICAgICAgICAgICAgICAgICAgMHg4OEJDCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfUE9JTlRFUiAgICAgICAgICAgICAweDg4QkQKKyNkZWZpbmUgR0xfU1RSRUFNX1JFQUQgICAgICAgICAgICAgICAgICAgIDB4ODhFMQorI2RlZmluZSBHTF9TVFJFQU1fQ09QWSAgICAgICAgICAgICAgICAgICAgMHg4OEUyCisjZGVmaW5lIEdMX1NUQVRJQ19SRUFEICAgICAgICAgICAgICAgICAgICAweDg4RTUKKyNkZWZpbmUgR0xfU1RBVElDX0NPUFkgICAgICAgICAgICAgICAgICAgIDB4ODhFNgorI2RlZmluZSBHTF9EWU5BTUlDX1JFQUQgICAgICAgICAgICAgICAgICAgMHg4OEU5CisjZGVmaW5lIEdMX0RZTkFNSUNfQ09QWSAgICAgICAgICAgICAgICAgICAweDg4RUEKKyNkZWZpbmUgR0xfTUFYX0RSQVdfQlVGRkVSUyAgICAgICAgICAgICAgIDB4ODgyNAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjAgICAgICAgICAgICAgICAgICAgMHg4ODI1CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMSAgICAgICAgICAgICAgICAgICAweDg4MjYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIyICAgICAgICAgICAgICAgICAgIDB4ODgyNworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjMgICAgICAgICAgICAgICAgICAgMHg4ODI4CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNCAgICAgICAgICAgICAgICAgICAweDg4MjkKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI1ICAgICAgICAgICAgICAgICAgIDB4ODgyQQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjYgICAgICAgICAgICAgICAgICAgMHg4ODJCCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNyAgICAgICAgICAgICAgICAgICAweDg4MkMKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI4ICAgICAgICAgICAgICAgICAgIDB4ODgyRAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjkgICAgICAgICAgICAgICAgICAgMHg4ODJFCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTAgICAgICAgICAgICAgICAgICAweDg4MkYKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMSAgICAgICAgICAgICAgICAgIDB4ODgzMAorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjEyICAgICAgICAgICAgICAgICAgMHg4ODMxCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTMgICAgICAgICAgICAgICAgICAweDg4MzIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxNCAgICAgICAgICAgICAgICAgIDB4ODgzMworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE1ICAgICAgICAgICAgICAgICAgMHg4ODM0CisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgMHg4QjQ5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTICAweDhCNEEKKyNkZWZpbmUgR0xfU0FNUExFUl8zRCAgICAgICAgICAgICAgICAgICAgIDB4OEI1RgorI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPVyAgICAgICAgICAgICAgMHg4QjYyCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlQgMHg4QjhCCisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSICAgICAgICAgICAgICAweDg4RUIKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUiAgICAgICAgICAgIDB4ODhFQworI2RlZmluZSBHTF9QSVhFTF9QQUNLX0JVRkZFUl9CSU5ESU5HICAgICAgMHg4OEVECisjZGVmaW5lIEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQklORElORyAgICAweDg4RUYKKyNkZWZpbmUgR0xfRkxPQVRfTUFUMngzICAgICAgICAgICAgICAgICAgIDB4OEI2NQorI2RlZmluZSBHTF9GTE9BVF9NQVQyeDQgICAgICAgICAgICAgICAgICAgMHg4QjY2CisjZGVmaW5lIEdMX0ZMT0FUX01BVDN4MiAgICAgICAgICAgICAgICAgICAweDhCNjcKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM3g0ICAgICAgICAgICAgICAgICAgIDB4OEI2OAorI2RlZmluZSBHTF9GTE9BVF9NQVQ0eDIgICAgICAgICAgICAgICAgICAgMHg4QjY5CisjZGVmaW5lIEdMX0ZMT0FUX01BVDR4MyAgICAgICAgICAgICAgICAgICAweDhCNkEKKyNkZWZpbmUgR0xfU1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MAorI2RlZmluZSBHTF9TUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQxCisjZGVmaW5lIEdMX1NSR0I4X0FMUEhBOCAgICAgICAgICAgICAgICAgICAweDhDNDMKKyNkZWZpbmUgR0xfQ09NUEFSRV9SRUZfVE9fVEVYVFVSRSAgICAgICAgIDB4ODg0RQorI2RlZmluZSBHTF9NQUpPUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgMHg4MjFCCisjZGVmaW5lIEdMX01JTk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAweDgyMUMKKyNkZWZpbmUgR0xfTlVNX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgIDB4ODIxRAorI2RlZmluZSBHTF9SR0JBMzJGICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE0CisjZGVmaW5lIEdMX1JHQjMyRiAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTUKKyNkZWZpbmUgR0xfUkdCQTE2RiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQQorI2RlZmluZSBHTF9SR0IxNkYgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfSU5URUdFUiAgICAweDg4RkQKKyNkZWZpbmUgR0xfTUFYX0FSUkFZX1RFWFRVUkVfTEFZRVJTICAgICAgIDB4ODhGRgorI2RlZmluZSBHTF9NSU5fUFJPR1JBTV9URVhFTF9PRkZTRVQgICAgICAgMHg4OTA0CisjZGVmaW5lIEdMX01BWF9QUk9HUkFNX1RFWEVMX09GRlNFVCAgICAgICAweDg5MDUKKyNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfQ09NUE9ORU5UUyAgICAgICAgIDB4OEI0QgorI2RlZmluZSBHTF9URVhUVVJFXzJEX0FSUkFZICAgICAgICAgICAgICAgMHg4QzFBCisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRF9BUlJBWSAgICAgICAweDhDMUQKKyNkZWZpbmUgR0xfUjExRl9HMTFGX0IxMEYgICAgICAgICAgICAgICAgIDB4OEMzQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWICAgMHg4QzNCCisjZGVmaW5lIEdMX1JHQjlfRTUgICAgICAgICAgICAgICAgICAgICAgICAweDhDM0QKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzVfOV85XzlfUkVWICAgICAgIDB4OEMzRQorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR19NQVhfTEVOR1RIIDB4OEM3NgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX01PREUgMHg4QzdGCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQ09NUE9ORU5UUyAweDhDODAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkdTICAgIDB4OEM4MworI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NUQVJUIDB4OEM4NAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSX1NJWkUgMHg4Qzg1CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19QUklNSVRJVkVTX1dSSVRURU4gMHg4Qzg4CisjZGVmaW5lIEdMX1JBU1RFUklaRVJfRElTQ0FSRCAgICAgICAgICAgICAweDhDODkKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19JTlRFUkxFQVZFRF9DT01QT05FTlRTIDB4OEM4QQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX1NFUEFSQVRFX0FUVFJJQlMgMHg4QzhCCisjZGVmaW5lIEdMX0lOVEVSTEVBVkVEX0FUVFJJQlMgICAgICAgICAgICAweDhDOEMKKyNkZWZpbmUgR0xfU0VQQVJBVEVfQVRUUklCUyAgICAgICAgICAgICAgIDB4OEM4RAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQlVGRkVSICAgICAgMHg4QzhFCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfQklORElORyAweDhDOEYKKyNkZWZpbmUgR0xfUkdCQTMyVUkgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3MAorI2RlZmluZSBHTF9SR0IzMlVJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDcxCisjZGVmaW5lIEdMX1JHQkExNlVJICAgICAgICAgICAgICAgICAgICAgICAweDhENzYKKyNkZWZpbmUgR0xfUkdCMTZVSSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3NworI2RlZmluZSBHTF9SR0JBOFVJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDdDCisjZGVmaW5lIEdMX1JHQjhVSSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEN0QKKyNkZWZpbmUgR0xfUkdCQTMySSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4MgorI2RlZmluZSBHTF9SR0IzMkkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDgzCisjZGVmaW5lIEdMX1JHQkExNkkgICAgICAgICAgICAgICAgICAgICAgICAweDhEODgKKyNkZWZpbmUgR0xfUkdCMTZJICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4OQorI2RlZmluZSBHTF9SR0JBOEkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDhFCisjZGVmaW5lIEdMX1JHQjhJICAgICAgICAgICAgICAgICAgICAgICAgICAweDhEOEYKKyNkZWZpbmUgR0xfUkVEX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ5NAorI2RlZmluZSBHTF9SR0JfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgMHg4RDk4CisjZGVmaW5lIEdMX1JHQkFfSU5URUdFUiAgICAgICAgICAgICAgICAgICAweDhEOTkKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9BUlJBWSAgICAgICAgICAgICAgIDB4OERDMQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSUkFZX1NIQURPVyAgICAgICAgMHg4REM0CisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRV9TSEFET1cgICAgICAgICAgICAweDhEQzUKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzIgICAgICAgICAgICAgIDB4OERDNgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDMyAgICAgICAgICAgICAgMHg4REM3CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUM0ICAgICAgICAgICAgICAweDhEQzgKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgIDB4OERDQQorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8zRCAgICAgICAgICAgICAgICAgMHg4RENCCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAweDhEQ0MKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfMkRfQVJSQVkgICAgICAgICAgIDB4OERDRgorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRCAgICAgICAgMHg4REQyCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzNEICAgICAgICAweDhERDMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRSAgICAgIDB4OERENAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl8yRF9BUlJBWSAgMHg4REQ3CisjZGVmaW5lIEdMX0JVRkZFUl9BQ0NFU1NfRkxBR1MgICAgICAgICAgICAweDkxMUYKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9MRU5HVEggICAgICAgICAgICAgIDB4OTEyMAorI2RlZmluZSBHTF9CVUZGRVJfTUFQX09GRlNFVCAgICAgICAgICAgICAgMHg5MTIxCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDMyRiAgICAgICAgICAgICAweDhDQUMKKyNkZWZpbmUgR0xfREVQVEgzMkZfU1RFTkNJTDggICAgICAgICAgICAgIDB4OENBRAorI2RlZmluZSBHTF9GTE9BVF8zMl9VTlNJR05FRF9JTlRfMjRfOF9SRVYgMHg4REFECisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkcgMHg4MjEwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09NUE9ORU5UX1RZUEUgMHg4MjExCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfUkVEX1NJWkUgMHg4MjEyCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfR1JFRU5fU0laRSAweDgyMTMKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9CTFVFX1NJWkUgMHg4MjE0CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQUxQSEFfU0laRSAweDgyMTUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9ERVBUSF9TSVpFIDB4ODIxNgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1NURU5DSUxfU0laRSAweDgyMTcKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfREVGQVVMVCAgICAgICAgICAgIDB4ODIxOAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTkRFRklORUQgICAgICAgICAgMHg4MjE5CisjZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfQVRUQUNITUVOVCAgICAgICAweDgyMUEKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTCAgICAgICAgICAgICAgICAgIDB4ODRGOQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMjRfOCAgICAgICAgICAgICAgMHg4NEZBCisjZGVmaW5lIEdMX0RFUFRIMjRfU1RFTkNJTDggICAgICAgICAgICAgICAweDg4RjAKKyNkZWZpbmUgR0xfVU5TSUdORURfTk9STUFMSVpFRCAgICAgICAgICAgIDB4OEMxNworI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAweDhDQTgKKyNkZWZpbmUgR0xfRFJBV19GUkFNRUJVRkZFUiAgICAgICAgICAgICAgIDB4OENBOQorI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4Q0FBCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTICAgICAgICAgICAweDhDQUIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xBWUVSIDB4OENENAorI2RlZmluZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFMgICAgICAgICAgMHg4Q0RGCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxICAgICAgICAgICAgICAweDhDRTEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDIgICAgICAgICAgICAgIDB4OENFMgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMyAgICAgICAgICAgICAgMHg4Q0UzCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0ICAgICAgICAgICAgICAweDhDRTQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDUgICAgICAgICAgICAgIDB4OENFNQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNiAgICAgICAgICAgICAgMHg4Q0U2CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3ICAgICAgICAgICAgICAweDhDRTcKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDggICAgICAgICAgICAgIDB4OENFOAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOSAgICAgICAgICAgICAgMHg4Q0U5CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMCAgICAgICAgICAgICAweDhDRUEKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDExICAgICAgICAgICAgIDB4OENFQgorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTIgICAgICAgICAgICAgMHg4Q0VDCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMyAgICAgICAgICAgICAweDhDRUQKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDE0ICAgICAgICAgICAgIDB4OENFRQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTUgICAgICAgICAgICAgMHg4Q0VGCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEUgMHg4RDU2CisjZGVmaW5lIEdMX01BWF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAweDhENTcKKyNkZWZpbmUgR0xfSEFMRl9GTE9BVCAgICAgICAgICAgICAgICAgICAgIDB4MTQwQgorI2RlZmluZSBHTF9NQVBfUkVBRF9CSVQgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX01BUF9XUklURV9CSVQgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTUFQX0lOVkFMSURBVEVfUkFOR0VfQklUICAgICAgIDB4MDAwNAorI2RlZmluZSBHTF9NQVBfSU5WQUxJREFURV9CVUZGRVJfQklUICAgICAgMHgwMDA4CisjZGVmaW5lIEdMX01BUF9GTFVTSF9FWFBMSUNJVF9CSVQgICAgICAgICAweDAwMTAKKyNkZWZpbmUgR0xfTUFQX1VOU1lOQ0hST05JWkVEX0JJVCAgICAgICAgIDB4MDAyMAorI2RlZmluZSBHTF9SRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI3CisjZGVmaW5lIEdMX1JHX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgICAweDgyMjgKKyNkZWZpbmUgR0xfUjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyOQorI2RlZmluZSBHTF9SRzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJCCisjZGVmaW5lIEdMX1IxNkYgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkQKKyNkZWZpbmUgR0xfUjMyRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRQorI2RlZmluZSBHTF9SRzE2RiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJGCisjZGVmaW5lIEdMX1JHMzJGICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzAKKyNkZWZpbmUgR0xfUjhJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMQorI2RlZmluZSBHTF9SOFVJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjMyCisjZGVmaW5lIEdMX1IxNkkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzMKKyNkZWZpbmUgR0xfUjE2VUkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNAorI2RlZmluZSBHTF9SMzJJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM1CisjZGVmaW5lIEdMX1IzMlVJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzYKKyNkZWZpbmUgR0xfUkc4SSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNworI2RlZmluZSBHTF9SRzhVSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM4CisjZGVmaW5lIEdMX1JHMTZJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzkKKyNkZWZpbmUgR0xfUkcxNlVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzQQorI2RlZmluZSBHTF9SRzMySSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjNCCisjZGVmaW5lIEdMX1JHMzJVSSAgICAgICAgICAgICAgICAgICAgICAgICAweDgyM0MKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX0JJTkRJTkcgICAgICAgICAgIDB4ODVCNQorI2RlZmluZSBHTF9SOF9TTk9STSAgICAgICAgICAgICAgICAgICAgICAgMHg4Rjk0CisjZGVmaW5lIEdMX1JHOF9TTk9STSAgICAgICAgICAgICAgICAgICAgICAweDhGOTUKKyNkZWZpbmUgR0xfUkdCOF9TTk9STSAgICAgICAgICAgICAgICAgICAgIDB4OEY5NgorI2RlZmluZSBHTF9SR0JBOF9TTk9STSAgICAgICAgICAgICAgICAgICAgMHg4Rjk3CisjZGVmaW5lIEdMX1NJR05FRF9OT1JNQUxJWkVEICAgICAgICAgICAgICAweDhGOUMKKyNkZWZpbmUgR0xfUFJJTUlUSVZFX1JFU1RBUlRfRklYRURfSU5ERVggIDB4OEQ2OQorI2RlZmluZSBHTF9DT1BZX1JFQURfQlVGRkVSICAgICAgICAgICAgICAgMHg4RjM2CisjZGVmaW5lIEdMX0NPUFlfV1JJVEVfQlVGRkVSICAgICAgICAgICAgICAweDhGMzcKKyNkZWZpbmUgR0xfQ09QWV9SRUFEX0JVRkZFUl9CSU5ESU5HICAgICAgIDB4OEYzNgorI2RlZmluZSBHTF9DT1BZX1dSSVRFX0JVRkZFUl9CSU5ESU5HICAgICAgMHg4RjM3CisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSICAgICAgICAgICAgICAgICAweDhBMTEKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfQklORElORyAgICAgICAgIDB4OEEyOAorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9TVEFSVCAgICAgICAgICAgMHg4QTI5CisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX1NJWkUgICAgICAgICAgICAweDhBMkEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0JMT0NLUyAgICAgIDB4OEEyQgorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9CTE9DS1MgICAgMHg4QTJECisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9VTklGT1JNX0JMT0NLUyAgICAweDhBMkUKKyNkZWZpbmUgR0xfTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTICAgIDB4OEEyRgorI2RlZmluZSBHTF9NQVhfVU5JRk9STV9CTE9DS19TSVpFICAgICAgICAgMHg4QTMwCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTIDB4OEEzMQorI2RlZmluZSBHTF9NQVhfQ09NQklORURfRlJBR01FTlRfVU5JRk9STV9DT01QT05FTlRTIDB4OEEzMworI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9PRkZTRVRfQUxJR05NRU5UIDB4OEEzNAorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9CTE9DS19NQVhfTkFNRV9MRU5HVEggMHg4QTM1CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX0JMT0NLUyAgICAgICAgICAweDhBMzYKKyNkZWZpbmUgR0xfVU5JRk9STV9UWVBFICAgICAgICAgICAgICAgICAgIDB4OEEzNworI2RlZmluZSBHTF9VTklGT1JNX1NJWkUgICAgICAgICAgICAgICAgICAgMHg4QTM4CisjZGVmaW5lIEdMX1VOSUZPUk1fTkFNRV9MRU5HVEggICAgICAgICAgICAweDhBMzkKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19JTkRFWCAgICAgICAgICAgIDB4OEEzQQorI2RlZmluZSBHTF9VTklGT1JNX09GRlNFVCAgICAgICAgICAgICAgICAgMHg4QTNCCisjZGVmaW5lIEdMX1VOSUZPUk1fQVJSQVlfU1RSSURFICAgICAgICAgICAweDhBM0MKKyNkZWZpbmUgR0xfVU5JRk9STV9NQVRSSVhfU1RSSURFICAgICAgICAgIDB4OEEzRAorI2RlZmluZSBHTF9VTklGT1JNX0lTX1JPV19NQUpPUiAgICAgICAgICAgMHg4QTNFCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfQklORElORyAgICAgICAgICAweDhBM0YKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19EQVRBX1NJWkUgICAgICAgIDB4OEE0MAorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX05BTUVfTEVOR1RIICAgICAgMHg4QTQxCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfQUNUSVZFX1VOSUZPUk1TICAweDhBNDIKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STV9JTkRJQ0VTIDB4OEE0MworI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUiAweDhBNDQKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19SRUZFUkVOQ0VEX0JZX0ZSQUdNRU5UX1NIQURFUiAweDhBNDYKKyNkZWZpbmUgR0xfSU5WQUxJRF9JTkRFWCAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZ1CisjZGVmaW5lIEdMX01BWF9WRVJURVhfT1VUUFVUX0NPTVBPTkVOVFMgICAweDkxMjIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0lOUFVUX0NPTVBPTkVOVFMgIDB4OTEyNQorI2RlZmluZSBHTF9NQVhfU0VSVkVSX1dBSVRfVElNRU9VVCAgICAgICAgMHg5MTExCisjZGVmaW5lIEdMX09CSkVDVF9UWVBFICAgICAgICAgICAgICAgICAgICAweDkxMTIKKyNkZWZpbmUgR0xfU1lOQ19DT05ESVRJT04gICAgICAgICAgICAgICAgIDB4OTExMworI2RlZmluZSBHTF9TWU5DX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg5MTE0CisjZGVmaW5lIEdMX1NZTkNfRkxBR1MgICAgICAgICAgICAgICAgICAgICAweDkxMTUKKyNkZWZpbmUgR0xfU1lOQ19GRU5DRSAgICAgICAgICAgICAgICAgICAgIDB4OTExNgorI2RlZmluZSBHTF9TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSAgICAgMHg5MTE3CisjZGVmaW5lIEdMX1VOU0lHTkFMRUQgICAgICAgICAgICAgICAgICAgICAweDkxMTgKKyNkZWZpbmUgR0xfU0lHTkFMRUQgICAgICAgICAgICAgICAgICAgICAgIDB4OTExOQorI2RlZmluZSBHTF9BTFJFQURZX1NJR05BTEVEICAgICAgICAgICAgICAgMHg5MTFBCisjZGVmaW5lIEdMX1RJTUVPVVRfRVhQSVJFRCAgICAgICAgICAgICAgICAweDkxMUIKKyNkZWZpbmUgR0xfQ09ORElUSU9OX1NBVElTRklFRCAgICAgICAgICAgIDB4OTExQworI2RlZmluZSBHTF9XQUlUX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgMHg5MTFECisjZGVmaW5lIEdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklUICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMX1RJTUVPVVRfSUdOT1JFRCAgICAgICAgICAgICAgICAweEZGRkZGRkZGRkZGRkZGRkZ1bGwKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9ESVZJU09SICAgIDB4ODhGRQorI2RlZmluZSBHTF9BTllfU0FNUExFU19QQVNTRUQgICAgICAgICAgICAgMHg4QzJGCisjZGVmaW5lIEdMX0FOWV9TQU1QTEVTX1BBU1NFRF9DT05TRVJWQVRJVkUgMHg4RDZBCisjZGVmaW5lIEdMX1NBTVBMRVJfQklORElORyAgICAgICAgICAgICAgICAweDg5MTkKKyNkZWZpbmUgR0xfUkdCMTBfQTJVSSAgICAgICAgICAgICAgICAgICAgIDB4OTA2RgorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfUiAgICAgICAgICAgICAgMHg4RTQyCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9HICAgICAgICAgICAgICAweDhFNDMKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0IgICAgICAgICAgICAgIDB4OEU0NAorI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfQSAgICAgICAgICAgICAgMHg4RTQ1CisjZGVmaW5lIEdMX0dSRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDQKKyNkZWZpbmUgR0xfQkxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNQorI2RlZmluZSBHTF9JTlRfMl8xMF8xMF8xMF9SRVYgICAgICAgICAgICAgMHg4RDlGCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDSyAgICAgICAgICAgICAweDhFMjIKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BBVVNFRCAgICAgIDB4OEUyMworI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfQUNUSVZFICAgICAgMHg4RTI0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CSU5ESU5HICAgICAweDhFMjUKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfUkVUUklFVkFCTEVfSElOVCAweDgyNTcKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIICAgICAgICAgIDB4ODc0MQorI2RlZmluZSBHTF9OVU1fUFJPR1JBTV9CSU5BUllfRk9STUFUUyAgICAgMHg4N0ZFCisjZGVmaW5lIEdMX1BST0dSQU1fQklOQVJZX0ZPUk1BVFMgICAgICAgICAweDg3RkYKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SMTFfRUFDICAgICAgICAgICAgIDB4OTI3MAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SMTFfRUFDICAgICAgMHg5MjcxCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkcxMV9FQUMgICAgICAgICAgICAweDkyNzIKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TSUdORURfUkcxMV9FQUMgICAgIDB4OTI3MworI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQjhfRVRDMiAgICAgICAgICAgMHg5Mjc0CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU1JHQjhfRVRDMiAgICAgICAgICAweDkyNzUKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMiAweDkyNzYKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9QVU5DSFRIUk9VR0hfQUxQSEExX0VUQzIgMHg5Mjc3CisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQThfRVRDMl9FQUMgICAgICAweDkyNzgKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUMgMHg5Mjc5CisjZGVmaW5lIEdMX1RFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVCAgICAgICAweDkxMkYKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRfSU5ERVggICAgICAgICAgICAgIDB4OEQ2QgorI2RlZmluZSBHTF9OVU1fU0FNUExFX0NPVU5UUyAgICAgICAgICAgICAgMHg5MzgwCisjZGVmaW5lIEdMX1RFWFRVUkVfSU1NVVRBQkxFX0xFVkVMUyAgICAgICAweDgyREYKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlYWRCdWZmZXIgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdSYW5nZUVsZW1lbnRzIChHTGVudW0gbW9kZSwgR0x1aW50IHN0YXJ0LCBHTHVpbnQgZW5kLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqaW5kaWNlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblF1ZXJpZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUXVlcmllcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUXVlcnkgKEdMdWludCBpZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCZWdpblF1ZXJ5IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kUXVlcnkgKEdMZW51bSB0YXJnZXQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UXVlcnlpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFF1ZXJ5T2JqZWN0dWl2IChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xVbm1hcEJ1ZmZlciAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQb2ludGVydiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MngzZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3gyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4Mng0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NHgyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M3g0ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NHgzZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGl0RnJhbWVidWZmZXIgKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZUxheWVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCBsYXllcik7CitHTF9BUElDQUxMIHZvaWQgKkdMX0FQSUVOVFJZIGdsTWFwQnVmZmVyUmFuZ2UgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgsIEdMYml0ZmllbGQgYWNjZXNzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZsdXNoTWFwcGVkQnVmZmVyUmFuZ2UgKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5IChHTHVpbnQgYXJyYXkpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVmVydGV4QXJyYXlzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblZlcnRleEFycmF5cyAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzVmVydGV4QXJyYXkgKEdMdWludCBhcnJheSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyaV92IChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMaW50ICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJlZ2luVHJhbnNmb3JtRmVlZGJhY2sgKEdMZW51bSBwcmltaXRpdmVNb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuZFRyYW5zZm9ybUZlZWRiYWNrICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyLCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQnVmZmVyQmFzZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZ3MgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKmNvbnN0KnZhcnlpbmdzLCBHTGVudW0gYnVmZmVyTW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUcmFuc2Zvcm1GZWVkYmFja1ZhcnlpbmcgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTHNpemVpICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJUG9pbnRlciAoR0x1aW50IGluZGV4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IHZvaWQgKnBvaW50ZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliSWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJdWl2IChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliSTRpIChHTHVpbnQgaW5kZXgsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aSAoR0x1aW50IGluZGV4LCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB6LCBHTHVpbnQgdyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMaW50ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0dWl2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMdWludCAqdik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0xpbnQgR0xfQVBJRU5UUlkgZ2xHZXRGcmFnRGF0YUxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0xdWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjApOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJ1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zdWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm00dWkgKEdMaW50IGxvY2F0aW9uLCBHTHVpbnQgdjAsIEdMdWludCB2MSwgR0x1aW50IHYyLCBHTHVpbnQgdjMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTF1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0ydWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM3VpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTR1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQnVmZmVyaXYgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcnVpdiAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcmZ2IChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckJ1ZmZlcmZpIChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBHTGZsb2F0IGRlcHRoLCBHTGludCBzdGVuY2lsKTsKK0dMX0FQSUNBTEwgY29uc3QgR0x1Ynl0ZSAqR0xfQVBJRU5UUlkgZ2xHZXRTdHJpbmdpIChHTGVudW0gbmFtZSwgR0x1aW50IGluZGV4KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlCdWZmZXJTdWJEYXRhIChHTGVudW0gcmVhZFRhcmdldCwgR0xlbnVtIHdyaXRlVGFyZ2V0LCBHTGludHB0ciByZWFkT2Zmc2V0LCBHTGludHB0ciB3cml0ZU9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1JbmRpY2VzIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSB1bmlmb3JtQ291bnQsIGNvbnN0IEdMY2hhciAqY29uc3QqdW5pZm9ybU5hbWVzLCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1zaXYgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIHVuaWZvcm1Db3VudCwgY29uc3QgR0x1aW50ICp1bmlmb3JtSW5kaWNlcywgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybUJsb2NrSW5kZXggKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybUJsb2NraXYgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQmxvY2tOYW1lIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHVuaWZvcm1CbG9ja0luZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICp1bmlmb3JtQmxvY2tOYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1CbG9ja0JpbmRpbmcgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMdWludCB1bmlmb3JtQmxvY2tCaW5kaW5nKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdBcnJheXNJbnN0YW5jZWQgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCwgR0xzaXplaSBpbnN0YW5jZWNvdW50KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50c0luc3RhbmNlZCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzLCBHTHNpemVpIGluc3RhbmNlY291bnQpOworR0xfQVBJQ0FMTCBHTHN5bmMgR0xfQVBJRU5UUlkgZ2xGZW5jZVN5bmMgKEdMZW51bSBjb25kaXRpb24sIEdMYml0ZmllbGQgZmxhZ3MpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1N5bmMgKEdMc3luYyBzeW5jKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVN5bmMgKEdMc3luYyBzeW5jKTsKK0dMX0FQSUNBTEwgR0xlbnVtIEdMX0FQSUVOVFJZIGdsQ2xpZW50V2FpdFN5bmMgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFdhaXRTeW5jIChHTHN5bmMgc3luYywgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyNjR2IChHTGVudW0gcG5hbWUsIEdMaW50NjQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U3luY2l2IChHTHN5bmMgc3luYywgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnZhbHVlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VyNjRpX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQ2NCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpNjR2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50NjQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5TYW1wbGVycyAoR0xzaXplaSBjb3VudCwgR0x1aW50ICpzYW1wbGVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVTYW1wbGVycyAoR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICpzYW1wbGVycyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzU2FtcGxlciAoR0x1aW50IHNhbXBsZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFNhbXBsZXIgKEdMdWludCB1bml0LCBHTHVpbnQgc2FtcGxlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyaSAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcml2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcmYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlclBhcmFtZXRlcmZ2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyaXYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U2FtcGxlclBhcmFtZXRlcmZ2IChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliRGl2aXNvciAoR0x1aW50IGluZGV4LCBHTHVpbnQgZGl2aXNvcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVHJhbnNmb3JtRmVlZGJhY2sgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVUcmFuc2Zvcm1GZWVkYmFja3MgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICppZHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuVHJhbnNmb3JtRmVlZGJhY2tzIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNUcmFuc2Zvcm1GZWVkYmFjayAoR0x1aW50IGlkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFBhdXNlVHJhbnNmb3JtRmVlZGJhY2sgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVzdW1lVHJhbnNmb3JtRmVlZGJhY2sgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbUJpbmFyeSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgdm9pZCAqYmluYXJ5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1CaW5hcnkgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCB2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1QYXJhbWV0ZXJpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xJbnZhbGlkYXRlRnJhbWVidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsSW52YWxpZGF0ZVN1YkZyYW1lYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdG9yYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0SW50ZXJuYWxmb3JtYXRpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7CisjZW5kaWYgLyogR0xfRVNfVkVSU0lPTl8zXzAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsMzEuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzMvZ2wzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYjkwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsMzEuaApAQCAtMCwwICsxLDExODQgQEAKKyNpZm5kZWYgX19nbDMxX2hfCisjZGVmaW5lIF9fZ2wzMV9oXyAxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKioKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKgorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyovCisvKgorKiogVGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIEtocm9ub3MgT3BlbkdMIC8gT3BlbkdMIEVTIFhNTAorKiogQVBJIFJlZ2lzdHJ5LiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBSZWdpc3RyeSwgZ2VuZXJhdG9yIHNjcmlwdHMKKyoqIHVzZWQgdG8gbWFrZSB0aGUgaGVhZGVyLCBhbmQgdGhlIGhlYWRlciBjYW4gYmUgZm91bmQgYXQKKyoqICAgaHR0cDovL3d3dy5vcGVuZ2wub3JnL3JlZ2lzdHJ5LworKioKKyoqIEtocm9ub3MgJFJldmlzaW9uJCBvbiAkRGF0ZSQKKyovCisKKyNpbmNsdWRlIDxHTEVTMy9nbDNwbGF0Zm9ybS5oPgorCisvKiBHZW5lcmF0ZWQgb24gZGF0ZSAyMDE0MDUxNyAqLworCisvKiBHZW5lcmF0ZWQgQyBoZWFkZXIgZm9yOgorICogQVBJOiBnbGVzMgorICogUHJvZmlsZTogY29tbW9uCisgKiBWZXJzaW9ucyBjb25zaWRlcmVkOiAyLlswLTldfDMuWzAxXQorICogVmVyc2lvbnMgZW1pdHRlZDogLioKKyAqIERlZmF1bHQgZXh0ZW5zaW9ucyBpbmNsdWRlZDogTm9uZQorICogQWRkaXRpb25hbCBleHRlbnNpb25zIGluY2x1ZGVkOiBfbm9tYXRjaF9eCisgKiBFeHRlbnNpb25zIHJlbW92ZWQ6IF9ub21hdGNoX14KKyAqLworCisjaWZuZGVmIEdMX0VTX1ZFUlNJT05fMl8wCisjZGVmaW5lIEdMX0VTX1ZFUlNJT05fMl8wIDEKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KK3R5cGVkZWYga2hyb25vc19pbnQ4X3QgR0xieXRlOwordHlwZWRlZiBraHJvbm9zX2Zsb2F0X3QgR0xjbGFtcGY7Cit0eXBlZGVmIGtocm9ub3NfaW50MzJfdCBHTGZpeGVkOwordHlwZWRlZiBzaG9ydCBHTHNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKK3R5cGVkZWYgdm9pZCBHTHZvaWQ7Cit0eXBlZGVmIHN0cnVjdCBfX0dMc3luYyAqR0xzeW5jOwordHlwZWRlZiBraHJvbm9zX2ludDY0X3QgR0xpbnQ2NDsKK3R5cGVkZWYga2hyb25vc191aW50NjRfdCBHTHVpbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMZW51bTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKK3R5cGVkZWYgY2hhciBHTGNoYXI7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCBHTGZsb2F0OwordHlwZWRlZiBraHJvbm9zX3NzaXplX3QgR0xzaXplaXB0cjsKK3R5cGVkZWYga2hyb25vc19pbnRwdHJfdCBHTGludHB0cjsKK3R5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Cit0eXBlZGVmIGludCBHTGludDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBHTGJvb2xlYW47Cit0eXBlZGVmIGludCBHTHNpemVpOwordHlwZWRlZiBraHJvbm9zX3VpbnQ4X3QgR0x1Ynl0ZTsKKyNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMworI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKKyNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgorI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQorI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAorI2RlZmluZSBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2CisjZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKKyNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIDB4ODAwOQorI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgMHg4ODNECisjZGVmaW5lIEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAweDgwMEEKKyNkZWZpbmUgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgIDB4ODAwQgorI2RlZmluZSBHTF9CTEVORF9EU1RfUkdCICAgICAgICAgICAgICAgICAgMHg4MEM4CisjZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAweDgwQzkKKyNkZWZpbmUgR0xfQkxFTkRfRFNUX0FMUEhBICAgICAgICAgICAgICAgIDB4ODBDQQorI2RlZmluZSBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENCCisjZGVmaW5lIEdMX0NPTlNUQU5UX0NPTE9SICAgICAgICAgICAgICAgICAweDgwMDEKKyNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SICAgICAgIDB4ODAwMgorI2RlZmluZSBHTF9DT05TVEFOVF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4MDAzCisjZGVmaW5lIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAgICAgICAweDgwMDQKKyNkZWZpbmUgR0xfQkxFTkRfQ09MT1IgICAgICAgICAgICAgICAgICAgIDB4ODAwNQorI2RlZmluZSBHTF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4ODkyCisjZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAweDg4OTMKKyNkZWZpbmUgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgIDB4ODg5NAorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgMHg4ODk1CisjZGVmaW5lIEdMX1NUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTAKKyNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAorI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4CisjZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKKyNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQorI2RlZmluZSBHTF9DVVJSRU5UX1ZFUlRFWF9BVFRSSUIgICAgICAgICAgMHg4NjI2CisjZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKKyNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQorI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCisjZGVmaW5lIEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgIDB4MEI5MAorI2RlZmluZSBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQjcxCisjZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgIDB4ODAzNworI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAweDgwQTAKKyNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAorI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCisjZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCisjZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKKyNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQorI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2CisjZGVmaW5lIEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAweDBCNzAKKyNkZWZpbmUgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEI3MgorI2RlZmluZSBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQjczCisjZGVmaW5lIEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAweDBCNzQKKyNkZWZpbmUgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgIDB4MEI5MQorI2RlZmluZSBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgMHgwQjkyCisjZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKKyNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQorI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2CisjZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKKyNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MworI2RlZmluZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgMHgwQjk4CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICAweDg4MDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgIDB4ODgwMQorI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgMHg4ODAyCisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICAweDg4MDMKKyNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMworI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0CisjZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKKyNkZWZpbmUgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMgorI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCisjZGVmaW5lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBDMjIKKyNkZWZpbmUgR0xfQ09MT1JfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEMyMworI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1CisjZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMworI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCisjZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKKyNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgorI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCisjZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKKyNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQorI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2CisjZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKKyNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgIDB4MkEwMAorI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4CisjZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKKyNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAorI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5CisjZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKKyNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAorI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCisjZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKKyNkZWZpbmUgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQgICAgICAgICAgIDB4ODE5MgorI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCisjZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKKyNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgorI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCisjZGVmaW5lIEdMX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDQKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgIDB4MTQwNQorI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2CisjZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgIDB4MTkwMgorI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2CisjZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKKyNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSICAgICAgICAgICAgICAgIDB4OEIzMAorI2RlZmluZSBHTF9WRVJURVhfU0hBREVSICAgICAgICAgICAgICAgICAgMHg4QjMxCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAweDg4NjkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgICAgIDB4OERGQgorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTICAgICAgICAgICAgMHg4REZDCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0RAorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg4QjRDCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAweDg4NzIKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyAgIDB4OERGRAorI2RlZmluZSBHTF9TSEFERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgMHg4QjRGCisjZGVmaW5lIEdMX0RFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODAKKyNkZWZpbmUgR0xfTElOS19TVEFUVVMgICAgICAgICAgICAgICAgICAgIDB4OEI4MgorI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgMHg4QjgzCisjZGVmaW5lIEdMX0FUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAweDhCODUKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1TICAgICAgICAgICAgICAgIDB4OEI4NgorI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICAgICAgMHg4Qjg3CisjZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAweDhCODkKKyNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIICAgIDB4OEI4QQorI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgMHg4QjhDCisjZGVmaW5lIEdMX0NVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAweDhCOEQKKyNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisjZGVmaW5lIEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMQorI2RlZmluZSBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAyCisjZGVmaW5lIEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDMKKyNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQorI2RlZmluZSBHTF9JTkNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgMHg4NTA3CisjZGVmaW5lIEdMX0RFQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDgKKyNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCisjZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKKyNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMworI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCisjZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCisjZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKKyNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMworI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCisjZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCisjZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUCAgICAgICAgICAgICAgIDB4ODUxMworI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgMHg4NTE0CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAweDg1MTUKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgIDB4ODUxNgorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgMHg4NTE3CisjZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWSAgICAweDg1MTgKKyNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aICAgIDB4ODUxOQorI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgMHg4NTFBCisjZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAweDg1MUMKKyNkZWZpbmUgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMAorI2RlZmluZSBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMxCisjZGVmaW5lIEdMX1RFWFRVUkUyICAgICAgICAgICAgICAgICAgICAgICAweDg0QzIKKyNkZWZpbmUgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMworI2RlZmluZSBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM0CisjZGVmaW5lIEdMX1RFWFRVUkU1ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzUKKyNkZWZpbmUgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNgorI2RlZmluZSBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM3CisjZGVmaW5lIEdMX1RFWFRVUkU4ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzgKKyNkZWZpbmUgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOQorI2RlZmluZSBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgMHg4NENBCisjZGVmaW5lIEdMX1RFWFRVUkUxMSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0IKKyNkZWZpbmUgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQworI2RlZmluZSBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgMHg4NENECisjZGVmaW5lIEdMX1RFWFRVUkUxNCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0UKKyNkZWZpbmUgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRgorI2RlZmluZSBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgMHg4NEQwCisjZGVmaW5lIEdMX1RFWFRVUkUxNyAgICAgICAgICAgICAgICAgICAgICAweDg0RDEKKyNkZWZpbmUgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMgorI2RlZmluZSBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgMHg4NEQzCisjZGVmaW5lIEdMX1RFWFRVUkUyMCAgICAgICAgICAgICAgICAgICAgICAweDg0RDQKKyNkZWZpbmUgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgIDB4ODRENQorI2RlZmluZSBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ2CisjZGVmaW5lIEdMX1RFWFRVUkUyMyAgICAgICAgICAgICAgICAgICAgICAweDg0RDcKKyNkZWZpbmUgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOAorI2RlZmluZSBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ5CisjZGVmaW5lIEdMX1RFWFRVUkUyNiAgICAgICAgICAgICAgICAgICAgICAweDg0REEKKyNkZWZpbmUgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQgorI2RlZmluZSBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgMHg4NERDCisjZGVmaW5lIEdMX1RFWFRVUkUyOSAgICAgICAgICAgICAgICAgICAgICAweDg0REQKKyNkZWZpbmUgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgIDB4ODRERQorI2RlZmluZSBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgMHg4NERGCisjZGVmaW5lIEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAweDg0RTAKKyNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisjZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKKyNkZWZpbmUgR0xfRkxPQVRfVkVDMiAgICAgICAgICAgICAgICAgICAgIDB4OEI1MAorI2RlZmluZSBHTF9GTE9BVF9WRUMzICAgICAgICAgICAgICAgICAgICAgMHg4QjUxCisjZGVmaW5lIEdMX0ZMT0FUX1ZFQzQgICAgICAgICAgICAgICAgICAgICAweDhCNTIKKyNkZWZpbmUgR0xfSU5UX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1MworI2RlZmluZSBHTF9JTlRfVkVDMyAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU0CisjZGVmaW5lIEdMX0lOVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAweDhCNTUKKyNkZWZpbmUgR0xfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NgorI2RlZmluZSBHTF9CT09MX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgMHg4QjU3CisjZGVmaW5lIEdMX0JPT0xfVkVDMyAgICAgICAgICAgICAgICAgICAgICAweDhCNTgKKyNkZWZpbmUgR0xfQk9PTF9WRUM0ICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OQorI2RlZmluZSBHTF9GTE9BVF9NQVQyICAgICAgICAgICAgICAgICAgICAgMHg4QjVBCisjZGVmaW5lIEdMX0ZMT0FUX01BVDMgICAgICAgICAgICAgICAgICAgICAweDhCNUIKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1QworI2RlZmluZSBHTF9TQU1QTEVSXzJEICAgICAgICAgICAgICAgICAgICAgMHg4QjVFCisjZGVmaW5lIEdMX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgICAgICAweDhCNjAKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICAgIDB4ODYyMgorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgICAgICAgMHg4NjIzCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAweDg2MjQKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFICAgICAgIDB4ODYyNQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgMHg4ODZBCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAweDg2NDUKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAweDg4OUYKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIDB4OEI5QQorI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAweDhCOUIKKyNkZWZpbmUgR0xfQ09NUElMRV9TVEFUVVMgICAgICAgICAgICAgICAgIDB4OEI4MQorI2RlZmluZSBHTF9JTkZPX0xPR19MRU5HVEggICAgICAgICAgICAgICAgMHg4Qjg0CisjZGVmaW5lIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICAgICAgICAgICAweDhCODgKKyNkZWZpbmUgR0xfU0hBREVSX0NPTVBJTEVSICAgICAgICAgICAgICAgIDB4OERGQQorI2RlZmluZSBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgICAgMHg4REY4CisjZGVmaW5lIEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAweDhERjkKKyNkZWZpbmUgR0xfTE9XX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgIDB4OERGMAorI2RlZmluZSBHTF9NRURJVU1fRkxPQVQgICAgICAgICAgICAgICAgICAgMHg4REYxCisjZGVmaW5lIEdMX0hJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICAweDhERjIKKyNkZWZpbmUgR0xfTE9XX0lOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4OERGMworI2RlZmluZSBHTF9NRURJVU1fSU5UICAgICAgICAgICAgICAgICAgICAgMHg4REY0CisjZGVmaW5lIEdMX0hJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICAweDhERjUKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4RDQxCisjZGVmaW5lIEdMX1JHQkE0ICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTYKKyNkZWZpbmUgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NworI2RlZmluZSBHTF9SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYyCisjZGVmaW5lIEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAweDgxQTUKKyNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDggICAgICAgICAgICAgICAgIDB4OEQ0OAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHg4RDQyCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDhENDMKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgIDB4OEQ0NAorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgICAgICAgICAgMHg4RDUwCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAweDhENTEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgIDB4OEQ1MgorI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAgICAgICAgMHg4RDUzCisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAweDhENTQKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgIDB4OEQ1NQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFIDB4OENEMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIDB4OENEMQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwgMHg4Q0QyCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIDB4OENEMworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMCAgICAgICAgICAgICAgMHg4Q0UwCisjZGVmaW5lIEdMX0RFUFRIX0FUVEFDSE1FTlQgICAgICAgICAgICAgICAweDhEMDAKKyNkZWZpbmUgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgIDB4OEQyMAorI2RlZmluZSBHTF9OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgMHg4Q0Q1CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCAweDhDRDYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQgMHg4Q0Q3CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUyAweDhDRDkKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgIDB4OENERAorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HICAgICAgICAgICAgMHg4Q0E2CisjZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HICAgICAgICAgICAweDhDQTcKKyNkZWZpbmUgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgIDB4ODRFOAorI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiAgMHgwNTA2CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBdHRhY2hTaGFkZXIgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRBdHRyaWJMb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRDb2xvciAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uIChHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlIChHTGVudW0gc2ZhY3RvclJHQiwgR0xlbnVtIGRmYWN0b3JSR0IsIEdMZW51bSBzZmFjdG9yQWxwaGEsIEdMZW51bSBkZmFjdG9yQWxwaGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCB2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCBHTGVudW0gR0xfQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xmbG9hdCBkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbCAoR0xpbnQgcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21waWxlU2hhZGVyIChHTHVpbnQgc2hhZGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlUHJvZ3JhbSAodm9pZCk7CitHTF9BUElDQUxMIEdMdWludCBHTF9BUElFTlRSWSBnbENyZWF0ZVNoYWRlciAoR0xlbnVtIHR5cGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlVGV4dHVyZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoTWFzayAoR0xib29sZWFuIGZsYWcpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMZmxvYXQgbiwgR0xmbG9hdCBmKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCBpbmRleCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmluZGljZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbmVyYXRlTWlwbWFwIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5SZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEF0dGFjaGVkU2hhZGVycyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Q291bnQsIEdMc2l6ZWkgKmNvdW50LCBHTHVpbnQgKnNoYWRlcnMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52IChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgR0xlbnVtIEdMX0FQSUVOVFJZIGdsR2V0RXJyb3IgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1JbmZvTG9nIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNoYWRlcml2IChHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVySW5mb0xvZyAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQgKnJhbmdlLCBHTGludCAqcHJlY2lzaW9uKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZSAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqc291cmNlKTsKK0dMX0FQSUNBTEwgY29uc3QgR0x1Ynl0ZSAqR0xfQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1mdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1Mb2NhdGlvbiAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcG9pbnRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlciAoR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCBzaGFkZXIpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbExpbmVXaWR0aCAoR0xmbG9hdCB3aWR0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5rUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyICh2b2lkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMZmxvYXQgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVyQmluYXJ5IChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKmNvbnN0KnN0cmluZywgY29uc3QgR0xpbnQgKmxlbmd0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wIChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSBkcGZhaWwsIEdMZW51bSBkcHBhc3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3Qgdm9pZCAqcGl4ZWxzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0xZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0yaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMml2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEsIEdMZmxvYXQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHYwLCBHTGludCB2MSwgR0xpbnQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTNpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyLCBHTGZsb2F0IHYzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm00ZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGkgKEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyLCBHTGludCB2Myk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVzZVByb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliMWYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmIChHTHVpbnQgaW5kZXgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliM2Z2IChHTHVpbnQgaW5kZXgsIGNvbnN0IEdMZmxvYXQgKnYpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliNGYgKEdMdWludCBpbmRleCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdiAoR0x1aW50IGluZGV4LCBjb25zdCBHTGZsb2F0ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3Qgdm9pZCAqcG9pbnRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworI2VuZGlmIC8qIEdMX0VTX1ZFUlNJT05fMl8wICovCisKKyNpZm5kZWYgR0xfRVNfVkVSU0lPTl8zXzAKKyNkZWZpbmUgR0xfRVNfVkVSU0lPTl8zXzAgMQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTGhhbGY7CisjZGVmaW5lIEdMX1JFQURfQlVGRkVSICAgICAgICAgICAgICAgICAgICAweDBDMDIKKyNkZWZpbmUgR0xfVU5QQUNLX1JPV19MRU5HVEggICAgICAgICAgICAgIDB4MENGMgorI2RlZmluZSBHTF9VTlBBQ0tfU0tJUF9ST1dTICAgICAgICAgICAgICAgMHgwQ0YzCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX1BJWEVMUyAgICAgICAgICAgICAweDBDRjQKKyNkZWZpbmUgR0xfUEFDS19ST1dfTEVOR1RIICAgICAgICAgICAgICAgIDB4MEQwMgorI2RlZmluZSBHTF9QQUNLX1NLSVBfUk9XUyAgICAgICAgICAgICAgICAgMHgwRDAzCisjZGVmaW5lIEdMX1BBQ0tfU0tJUF9QSVhFTFMgICAgICAgICAgICAgICAweDBEMDQKKyNkZWZpbmUgR0xfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMAorI2RlZmluZSBHTF9ERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAxCisjZGVmaW5lIEdMX1NURU5DSUwgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDIKKyNkZWZpbmUgR0xfUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwMworI2RlZmluZSBHTF9SR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDUxCisjZGVmaW5lIEdMX1JHQkE4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTgKKyNkZWZpbmUgR0xfUkdCMTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OQorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfM0QgICAgICAgICAgICAgMHg4MDZBCisjZGVmaW5lIEdMX1VOUEFDS19TS0lQX0lNQUdFUyAgICAgICAgICAgICAweDgwNkQKKyNkZWZpbmUgR0xfVU5QQUNLX0lNQUdFX0hFSUdIVCAgICAgICAgICAgIDB4ODA2RQorI2RlZmluZSBHTF9URVhUVVJFXzNEICAgICAgICAgICAgICAgICAgICAgMHg4MDZGCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9SICAgICAgICAgICAgICAgICAweDgwNzIKKyNkZWZpbmUgR0xfTUFYXzNEX1RFWFRVUkVfU0laRSAgICAgICAgICAgIDB4ODA3MworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVYgICAgMHg4MzY4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAweDgwRTgKKyNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgIDB4ODBFOQorI2RlZmluZSBHTF9URVhUVVJFX01JTl9MT0QgICAgICAgICAgICAgICAgMHg4MTNBCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFYX0xPRCAgICAgICAgICAgICAgICAweDgxM0IKKyNkZWZpbmUgR0xfVEVYVFVSRV9CQVNFX0xFVkVMICAgICAgICAgICAgIDB4ODEzQworI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTCAgICAgICAgICAgICAgMHg4MTNECisjZGVmaW5lIEdMX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDcKKyNkZWZpbmUgR0xfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOAorI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgMHg4MUE2CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX0xPRF9CSUFTICAgICAgICAgICAweDg0RkQKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT01QQVJFX01PREUgICAgICAgICAgIDB4ODg0QworI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQyAgICAgICAgICAgMHg4ODRECisjZGVmaW5lIEdMX0NVUlJFTlRfUVVFUlkgICAgICAgICAgICAgICAgICAweDg4NjUKKyNkZWZpbmUgR0xfUVVFUllfUkVTVUxUICAgICAgICAgICAgICAgICAgIDB4ODg2NgorI2RlZmluZSBHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFICAgICAgICAgMHg4ODY3CisjZGVmaW5lIEdMX0JVRkZFUl9NQVBQRUQgICAgICAgICAgICAgICAgICAweDg4QkMKKyNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSICAgICAgICAgICAgIDB4ODhCRAorI2RlZmluZSBHTF9TVFJFQU1fUkVBRCAgICAgICAgICAgICAgICAgICAgMHg4OEUxCisjZGVmaW5lIEdMX1NUUkVBTV9DT1BZICAgICAgICAgICAgICAgICAgICAweDg4RTIKKyNkZWZpbmUgR0xfU1RBVElDX1JFQUQgICAgICAgICAgICAgICAgICAgIDB4ODhFNQorI2RlZmluZSBHTF9TVEFUSUNfQ09QWSAgICAgICAgICAgICAgICAgICAgMHg4OEU2CisjZGVmaW5lIEdMX0RZTkFNSUNfUkVBRCAgICAgICAgICAgICAgICAgICAweDg4RTkKKyNkZWZpbmUgR0xfRFlOQU1JQ19DT1BZICAgICAgICAgICAgICAgICAgIDB4ODhFQQorI2RlZmluZSBHTF9NQVhfRFJBV19CVUZGRVJTICAgICAgICAgICAgICAgMHg4ODI0CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMCAgICAgICAgICAgICAgICAgICAweDg4MjUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxICAgICAgICAgICAgICAgICAgIDB4ODgyNgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjIgICAgICAgICAgICAgICAgICAgMHg4ODI3CisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMyAgICAgICAgICAgICAgICAgICAweDg4MjgKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI0ICAgICAgICAgICAgICAgICAgIDB4ODgyOQorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjUgICAgICAgICAgICAgICAgICAgMHg4ODJBCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSNiAgICAgICAgICAgICAgICAgICAweDg4MkIKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVI3ICAgICAgICAgICAgICAgICAgIDB4ODgyQworI2RlZmluZSBHTF9EUkFXX0JVRkZFUjggICAgICAgICAgICAgICAgICAgMHg4ODJECisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSOSAgICAgICAgICAgICAgICAgICAweDg4MkUKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMCAgICAgICAgICAgICAgICAgIDB4ODgyRgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjExICAgICAgICAgICAgICAgICAgMHg4ODMwCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTIgICAgICAgICAgICAgICAgICAweDg4MzEKKyNkZWZpbmUgR0xfRFJBV19CVUZGRVIxMyAgICAgICAgICAgICAgICAgIDB4ODgzMgorI2RlZmluZSBHTF9EUkFXX0JVRkZFUjE0ICAgICAgICAgICAgICAgICAgMHg4ODMzCisjZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTUgICAgICAgICAgICAgICAgICAweDg4MzQKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUyAweDhCNDkKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgIDB4OEI0QQorI2RlZmluZSBHTF9TQU1QTEVSXzNEICAgICAgICAgICAgICAgICAgICAgMHg4QjVGCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfU0hBRE9XICAgICAgICAgICAgICAweDhCNjIKKyNkZWZpbmUgR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVCAweDhCOEIKKyNkZWZpbmUgR0xfUElYRUxfUEFDS19CVUZGRVIgICAgICAgICAgICAgIDB4ODhFQgorI2RlZmluZSBHTF9QSVhFTF9VTlBBQ0tfQlVGRkVSICAgICAgICAgICAgMHg4OEVDCisjZGVmaW5lIEdMX1BJWEVMX1BBQ0tfQlVGRkVSX0JJTkRJTkcgICAgICAweDg4RUQKKyNkZWZpbmUgR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9CSU5ESU5HICAgIDB4ODhFRgorI2RlZmluZSBHTF9GTE9BVF9NQVQyeDMgICAgICAgICAgICAgICAgICAgMHg4QjY1CisjZGVmaW5lIEdMX0ZMT0FUX01BVDJ4NCAgICAgICAgICAgICAgICAgICAweDhCNjYKKyNkZWZpbmUgR0xfRkxPQVRfTUFUM3gyICAgICAgICAgICAgICAgICAgIDB4OEI2NworI2RlZmluZSBHTF9GTE9BVF9NQVQzeDQgICAgICAgICAgICAgICAgICAgMHg4QjY4CisjZGVmaW5lIEdMX0ZMT0FUX01BVDR4MiAgICAgICAgICAgICAgICAgICAweDhCNjkKKyNkZWZpbmUgR0xfRkxPQVRfTUFUNHgzICAgICAgICAgICAgICAgICAgIDB4OEI2QQorI2RlZmluZSBHTF9TUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQwCisjZGVmaW5lIEdMX1NSR0I4ICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDNDEKKyNkZWZpbmUgR0xfU1JHQjhfQUxQSEE4ICAgICAgICAgICAgICAgICAgIDB4OEM0MworI2RlZmluZSBHTF9DT01QQVJFX1JFRl9UT19URVhUVVJFICAgICAgICAgMHg4ODRFCisjZGVmaW5lIEdMX01BSk9SX1ZFUlNJT04gICAgICAgICAgICAgICAgICAweDgyMUIKKyNkZWZpbmUgR0xfTUlOT1JfVkVSU0lPTiAgICAgICAgICAgICAgICAgIDB4ODIxQworI2RlZmluZSBHTF9OVU1fRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgMHg4MjFECisjZGVmaW5lIEdMX1JHQkEzMkYgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCMzJGICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQorI2RlZmluZSBHTF9SR0JBMTZGICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFBCisjZGVmaW5lIEdMX1JHQjE2RiAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUIKKyNkZWZpbmUgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9JTlRFR0VSICAgIDB4ODhGRAorI2RlZmluZSBHTF9NQVhfQVJSQVlfVEVYVFVSRV9MQVlFUlMgICAgICAgMHg4OEZGCisjZGVmaW5lIEdMX01JTl9QUk9HUkFNX1RFWEVMX09GRlNFVCAgICAgICAweDg5MDQKKyNkZWZpbmUgR0xfTUFYX1BST0dSQU1fVEVYRUxfT0ZGU0VUICAgICAgIDB4ODkwNQorI2RlZmluZSBHTF9NQVhfVkFSWUlOR19DT01QT05FTlRTICAgICAgICAgMHg4QjRCCisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfQVJSQVkgICAgICAgICAgICAgICAweDhDMUEKKyNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HXzJEX0FSUkFZICAgICAgIDB4OEMxRAorI2RlZmluZSBHTF9SMTFGX0cxMUZfQjEwRiAgICAgICAgICAgICAgICAgMHg4QzNBCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8xMEZfMTFGXzExRl9SRVYgICAweDhDM0IKKyNkZWZpbmUgR0xfUkdCOV9FNSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMzRAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfNV85XzlfOV9SRVYgICAgICAgMHg4QzNFCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19WQVJZSU5HX01BWF9MRU5HVEggMHg4Qzc2CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfTU9ERSAweDhDN0YKKyNkZWZpbmUgR0xfTUFYX1RSQU5TRk9STV9GRUVEQkFDS19TRVBBUkFURV9DT01QT05FTlRTIDB4OEM4MAorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfVkFSWUlOR1MgICAgMHg4QzgzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU1RBUlQgMHg4Qzg0CisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVJfU0laRSAweDhDODUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1BSSU1JVElWRVNfV1JJVFRFTiAweDhDODgKKyNkZWZpbmUgR0xfUkFTVEVSSVpFUl9ESVNDQVJEICAgICAgICAgICAgIDB4OEM4OQorI2RlZmluZSBHTF9NQVhfVFJBTlNGT1JNX0ZFRURCQUNLX0lOVEVSTEVBVkVEX0NPTVBPTkVOVFMgMHg4QzhBCisjZGVmaW5lIEdMX01BWF9UUkFOU0ZPUk1fRkVFREJBQ0tfU0VQQVJBVEVfQVRUUklCUyAweDhDOEIKKyNkZWZpbmUgR0xfSU5URVJMRUFWRURfQVRUUklCUyAgICAgICAgICAgIDB4OEM4QworI2RlZmluZSBHTF9TRVBBUkFURV9BVFRSSUJTICAgICAgICAgICAgICAgMHg4QzhECisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19CVUZGRVIgICAgICAweDhDOEUKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JVRkZFUl9CSU5ESU5HIDB4OEM4RgorI2RlZmluZSBHTF9SR0JBMzJVSSAgICAgICAgICAgICAgICAgICAgICAgMHg4RDcwCisjZGVmaW5lIEdMX1JHQjMyVUkgICAgICAgICAgICAgICAgICAgICAgICAweDhENzEKKyNkZWZpbmUgR0xfUkdCQTE2VUkgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3NgorI2RlZmluZSBHTF9SR0IxNlVJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDc3CisjZGVmaW5lIEdMX1JHQkE4VUkgICAgICAgICAgICAgICAgICAgICAgICAweDhEN0MKKyNkZWZpbmUgR0xfUkdCOFVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ3RAorI2RlZmluZSBHTF9SR0JBMzJJICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDgyCisjZGVmaW5lIEdMX1JHQjMySSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEODMKKyNkZWZpbmUgR0xfUkdCQTE2SSAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4OAorI2RlZmluZSBHTF9SR0IxNkkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDg5CisjZGVmaW5lIEdMX1JHQkE4SSAgICAgICAgICAgICAgICAgICAgICAgICAweDhEOEUKKyNkZWZpbmUgR0xfUkdCOEkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ4RgorI2RlZmluZSBHTF9SRURfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgMHg4RDk0CisjZGVmaW5lIEdMX1JHQl9JTlRFR0VSICAgICAgICAgICAgICAgICAgICAweDhEOTgKKyNkZWZpbmUgR0xfUkdCQV9JTlRFR0VSICAgICAgICAgICAgICAgICAgIDB4OEQ5OQorI2RlZmluZSBHTF9TQU1QTEVSXzJEX0FSUkFZICAgICAgICAgICAgICAgMHg4REMxCisjZGVmaW5lIEdMX1NBTVBMRVJfMkRfQVJSQVlfU0hBRE9XICAgICAgICAweDhEQzQKKyNkZWZpbmUgR0xfU0FNUExFUl9DVUJFX1NIQURPVyAgICAgICAgICAgIDB4OERDNQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfVkVDMiAgICAgICAgICAgICAgMHg4REM2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9WRUMzICAgICAgICAgICAgICAweDhEQzcKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1ZFQzQgICAgICAgICAgICAgIDB4OERDOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRCAgICAgICAgICAgICAgICAgMHg4RENBCisjZGVmaW5lIEdMX0lOVF9TQU1QTEVSXzNEICAgICAgICAgICAgICAgICAweDhEQ0IKKyNkZWZpbmUgR0xfSU5UX1NBTVBMRVJfQ1VCRSAgICAgICAgICAgICAgIDB4OERDQworI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9BUlJBWSAgICAgICAgICAgMHg4RENGCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEICAgICAgICAweDhERDIKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX1NBTVBMRVJfM0QgICAgICAgIDB4OEREMworI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFICAgICAgMHg4REQ0CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZICAweDhERDcKKyNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19GTEFHUyAgICAgICAgICAgIDB4OTExRgorI2RlZmluZSBHTF9CVUZGRVJfTUFQX0xFTkdUSCAgICAgICAgICAgICAgMHg5MTIwCisjZGVmaW5lIEdMX0JVRkZFUl9NQVBfT0ZGU0VUICAgICAgICAgICAgICAweDkxMjEKKyNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMzJGICAgICAgICAgICAgIDB4OENBQworI2RlZmluZSBHTF9ERVBUSDMyRl9TVEVOQ0lMOCAgICAgICAgICAgICAgMHg4Q0FECisjZGVmaW5lIEdMX0ZMT0FUXzMyX1VOU0lHTkVEX0lOVF8yNF84X1JFViAweDhEQUQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT0xPUl9FTkNPRElORyAweDgyMTAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRSAweDgyMTEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9SRURfU0laRSAweDgyMTIKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9HUkVFTl9TSVpFIDB4ODIxMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0JMVUVfU0laRSAweDgyMTQKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9BTFBIQV9TSVpFIDB4ODIxNQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0RFUFRIX1NJWkUgMHg4MjE2CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfU1RFTkNJTF9TSVpFIDB4ODIxNworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9ERUZBVUxUICAgICAgICAgICAgMHg4MjE4CisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX1VOREVGSU5FRCAgICAgICAgICAweDgyMTkKKyNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgIDB4ODIxQQorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMICAgICAgICAgICAgICAgICAgMHg4NEY5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84ICAgICAgICAgICAgICAweDg0RkEKKyNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOCAgICAgICAgICAgICAgIDB4ODhGMAorI2RlZmluZSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEICAgICAgICAgICAgMHg4QzE3CisjZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAweDhDQTYKKyNkZWZpbmUgR0xfUkVBRF9GUkFNRUJVRkZFUiAgICAgICAgICAgICAgIDB4OENBOAorI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSICAgICAgICAgICAgICAgMHg4Q0E5CisjZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAweDhDQUEKKyNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVMgICAgICAgICAgIDB4OENBQgorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEFZRVIgMHg4Q0Q0CisjZGVmaW5lIEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UUyAgICAgICAgICAweDhDREYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEgICAgICAgICAgICAgIDB4OENFMQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMiAgICAgICAgICAgICAgMHg4Q0UyCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzICAgICAgICAgICAgICAweDhDRTMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDQgICAgICAgICAgICAgIDB4OENFNAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UNSAgICAgICAgICAgICAgMHg4Q0U1CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2ICAgICAgICAgICAgICAweDhDRTYKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDcgICAgICAgICAgICAgIDB4OENFNworI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UOCAgICAgICAgICAgICAgMHg4Q0U4CisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5ICAgICAgICAgICAgICAweDhDRTkKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEwICAgICAgICAgICAgIDB4OENFQQorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTEgICAgICAgICAgICAgMHg4Q0VCCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMiAgICAgICAgICAgICAweDhDRUMKKyNkZWZpbmUgR0xfQ09MT1JfQVRUQUNITUVOVDEzICAgICAgICAgICAgIDB4OENFRAorI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMTQgICAgICAgICAgICAgMHg4Q0VFCisjZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNSAgICAgICAgICAgICAweDhDRUYKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRSAweDhENTYKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgIDB4OEQ1NworI2RlZmluZSBHTF9IQUxGX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgMHgxNDBCCisjZGVmaW5lIEdMX01BUF9SRUFEX0JJVCAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTUFQX1dSSVRFX0JJVCAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9NQVBfSU5WQUxJREFURV9SQU5HRV9CSVQgICAgICAgMHgwMDA0CisjZGVmaW5lIEdMX01BUF9JTlZBTElEQVRFX0JVRkZFUl9CSVQgICAgICAweDAwMDgKKyNkZWZpbmUgR0xfTUFQX0ZMVVNIX0VYUExJQ0lUX0JJVCAgICAgICAgIDB4MDAxMAorI2RlZmluZSBHTF9NQVBfVU5TWU5DSFJPTklaRURfQklUICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEdMX1JHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMjcKKyNkZWZpbmUgR0xfUkdfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgIDB4ODIyOAorI2RlZmluZSBHTF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI5CisjZGVmaW5lIEdMX1JHOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkIKKyNkZWZpbmUgR0xfUjE2RiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRAorI2RlZmluZSBHTF9SMzJGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJFCisjZGVmaW5lIEdMX1JHMTZGICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkYKKyNkZWZpbmUgR0xfUkczMkYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMAorI2RlZmluZSBHTF9SOEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjMxCisjZGVmaW5lIEdMX1I4VUkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzIKKyNkZWZpbmUgR0xfUjE2SSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzMworI2RlZmluZSBHTF9SMTZVSSAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM0CisjZGVmaW5lIEdMX1IzMkkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzUKKyNkZWZpbmUgR0xfUjMyVUkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzNgorI2RlZmluZSBHTF9SRzhJICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjM3CisjZGVmaW5lIEdMX1JHOFVJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMzgKKyNkZWZpbmUgR0xfUkcxNkkgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzOQorI2RlZmluZSBHTF9SRzE2VUkgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjNBCisjZGVmaW5lIEdMX1JHMzJJICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyM0IKKyNkZWZpbmUgR0xfUkczMlVJICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIzQworI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfQklORElORyAgICAgICAgICAgMHg4NUI1CisjZGVmaW5lIEdMX1I4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgICAweDhGOTQKKyNkZWZpbmUgR0xfUkc4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgIDB4OEY5NQorI2RlZmluZSBHTF9SR0I4X1NOT1JNICAgICAgICAgICAgICAgICAgICAgMHg4Rjk2CisjZGVmaW5lIEdMX1JHQkE4X1NOT1JNICAgICAgICAgICAgICAgICAgICAweDhGOTcKKyNkZWZpbmUgR0xfU0lHTkVEX05PUk1BTElaRUQgICAgICAgICAgICAgIDB4OEY5QworI2RlZmluZSBHTF9QUklNSVRJVkVfUkVTVEFSVF9GSVhFRF9JTkRFWCAgMHg4RDY5CisjZGVmaW5lIEdMX0NPUFlfUkVBRF9CVUZGRVIgICAgICAgICAgICAgICAweDhGMzYKKyNkZWZpbmUgR0xfQ09QWV9XUklURV9CVUZGRVIgICAgICAgICAgICAgIDB4OEYzNworI2RlZmluZSBHTF9DT1BZX1JFQURfQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4RjM2CisjZGVmaW5lIEdMX0NPUFlfV1JJVEVfQlVGRkVSX0JJTkRJTkcgICAgICAweDhGMzcKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVIgICAgICAgICAgICAgICAgIDB4OEExMQorI2RlZmluZSBHTF9VTklGT1JNX0JVRkZFUl9CSU5ESU5HICAgICAgICAgMHg4QTI4CisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX1NUQVJUICAgICAgICAgICAweDhBMjkKKyNkZWZpbmUgR0xfVU5JRk9STV9CVUZGRVJfU0laRSAgICAgICAgICAgIDB4OEEyQQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQkxPQ0tTICAgICAgMHg4QTJCCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0JMT0NLUyAgICAweDhBMkQKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1VOSUZPUk1fQkxPQ0tTICAgIDB4OEEyRQorI2RlZmluZSBHTF9NQVhfVU5JRk9STV9CVUZGRVJfQklORElOR1MgICAgMHg4QTJGCisjZGVmaW5lIEdMX01BWF9VTklGT1JNX0JMT0NLX1NJWkUgICAgICAgICAweDhBMzAKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMgMHg4QTMxCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMgMHg4QTMzCisjZGVmaW5lIEdMX1VOSUZPUk1fQlVGRkVSX09GRlNFVF9BTElHTk1FTlQgMHg4QTM0CisjZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNX0JMT0NLX01BWF9OQU1FX0xFTkdUSCAweDhBMzUKKyNkZWZpbmUgR0xfQUNUSVZFX1VOSUZPUk1fQkxPQ0tTICAgICAgICAgIDB4OEEzNgorI2RlZmluZSBHTF9VTklGT1JNX1RZUEUgICAgICAgICAgICAgICAgICAgMHg4QTM3CisjZGVmaW5lIEdMX1VOSUZPUk1fU0laRSAgICAgICAgICAgICAgICAgICAweDhBMzgKKyNkZWZpbmUgR0xfVU5JRk9STV9OQU1FX0xFTkdUSCAgICAgICAgICAgIDB4OEEzOQorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX0lOREVYICAgICAgICAgICAgMHg4QTNBCisjZGVmaW5lIEdMX1VOSUZPUk1fT0ZGU0VUICAgICAgICAgICAgICAgICAweDhBM0IKKyNkZWZpbmUgR0xfVU5JRk9STV9BUlJBWV9TVFJJREUgICAgICAgICAgIDB4OEEzQworI2RlZmluZSBHTF9VTklGT1JNX01BVFJJWF9TVFJJREUgICAgICAgICAgMHg4QTNECisjZGVmaW5lIEdMX1VOSUZPUk1fSVNfUk9XX01BSk9SICAgICAgICAgICAweDhBM0UKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19CSU5ESU5HICAgICAgICAgIDB4OEEzRgorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX0RBVEFfU0laRSAgICAgICAgMHg4QTQwCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfTkFNRV9MRU5HVEggICAgICAweDhBNDEKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DS19BQ1RJVkVfVU5JRk9STVMgIDB4OEE0MgorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX0FDVElWRV9VTklGT1JNX0lORElDRVMgMHg4QTQzCisjZGVmaW5lIEdMX1VOSUZPUk1fQkxPQ0tfUkVGRVJFTkNFRF9CWV9WRVJURVhfU0hBREVSIDB4OEE0NAorI2RlZmluZSBHTF9VTklGT1JNX0JMT0NLX1JFRkVSRU5DRURfQllfRlJBR01FTlRfU0hBREVSIDB4OEE0NgorI2RlZmluZSBHTF9JTlZBTElEX0lOREVYICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRnUKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9PVVRQVVRfQ09NUE9ORU5UUyAgIDB4OTEyMgorI2RlZmluZSBHTF9NQVhfRlJBR01FTlRfSU5QVVRfQ09NUE9ORU5UUyAgMHg5MTI1CisjZGVmaW5lIEdMX01BWF9TRVJWRVJfV0FJVF9USU1FT1VUICAgICAgICAweDkxMTEKKyNkZWZpbmUgR0xfT0JKRUNUX1RZUEUgICAgICAgICAgICAgICAgICAgIDB4OTExMgorI2RlZmluZSBHTF9TWU5DX0NPTkRJVElPTiAgICAgICAgICAgICAgICAgMHg5MTEzCisjZGVmaW5lIEdMX1NZTkNfU1RBVFVTICAgICAgICAgICAgICAgICAgICAweDkxMTQKKyNkZWZpbmUgR0xfU1lOQ19GTEFHUyAgICAgICAgICAgICAgICAgICAgIDB4OTExNQorI2RlZmluZSBHTF9TWU5DX0ZFTkNFICAgICAgICAgICAgICAgICAgICAgMHg5MTE2CisjZGVmaW5lIEdMX1NZTkNfR1BVX0NPTU1BTkRTX0NPTVBMRVRFICAgICAweDkxMTcKKyNkZWZpbmUgR0xfVU5TSUdOQUxFRCAgICAgICAgICAgICAgICAgICAgIDB4OTExOAorI2RlZmluZSBHTF9TSUdOQUxFRCAgICAgICAgICAgICAgICAgICAgICAgMHg5MTE5CisjZGVmaW5lIEdMX0FMUkVBRFlfU0lHTkFMRUQgICAgICAgICAgICAgICAweDkxMUEKKyNkZWZpbmUgR0xfVElNRU9VVF9FWFBJUkVEICAgICAgICAgICAgICAgIDB4OTExQgorI2RlZmluZSBHTF9DT05ESVRJT05fU0FUSVNGSUVEICAgICAgICAgICAgMHg5MTFDCisjZGVmaW5lIEdMX1dBSVRfRkFJTEVEICAgICAgICAgICAgICAgICAgICAweDkxMUQKKyNkZWZpbmUgR0xfU1lOQ19GTFVTSF9DT01NQU5EU19CSVQgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR0xfVElNRU9VVF9JR05PUkVEICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZGRkZGRkZGRnVsbAorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0RJVklTT1IgICAgMHg4OEZFCisjZGVmaW5lIEdMX0FOWV9TQU1QTEVTX1BBU1NFRCAgICAgICAgICAgICAweDhDMkYKKyNkZWZpbmUgR0xfQU5ZX1NBTVBMRVNfUEFTU0VEX0NPTlNFUlZBVElWRSAweDhENkEKKyNkZWZpbmUgR0xfU0FNUExFUl9CSU5ESU5HICAgICAgICAgICAgICAgIDB4ODkxOQorI2RlZmluZSBHTF9SR0IxMF9BMlVJICAgICAgICAgICAgICAgICAgICAgMHg5MDZGCisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9SICAgICAgICAgICAgICAweDhFNDIKKyNkZWZpbmUgR0xfVEVYVFVSRV9TV0laWkxFX0cgICAgICAgICAgICAgIDB4OEU0MworI2RlZmluZSBHTF9URVhUVVJFX1NXSVpaTEVfQiAgICAgICAgICAgICAgMHg4RTQ0CisjZGVmaW5lIEdMX1RFWFRVUkVfU1dJWlpMRV9BICAgICAgICAgICAgICAweDhFNDUKKyNkZWZpbmUgR0xfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNAorI2RlZmluZSBHTF9CTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA1CisjZGVmaW5lIEdMX0lOVF8yXzEwXzEwXzEwX1JFViAgICAgICAgICAgICAweDhEOUYKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLICAgICAgICAgICAgIDB4OEUyMgorI2RlZmluZSBHTF9UUkFOU0ZPUk1fRkVFREJBQ0tfUEFVU0VEICAgICAgMHg4RTIzCisjZGVmaW5lIEdMX1RSQU5TRk9STV9GRUVEQkFDS19BQ1RJVkUgICAgICAweDhFMjQKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JJTkRJTkcgICAgIDB4OEUyNQorI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9SRVRSSUVWQUJMRV9ISU5UIDB4ODI1NworI2RlZmluZSBHTF9QUk9HUkFNX0JJTkFSWV9MRU5HVEggICAgICAgICAgMHg4NzQxCisjZGVmaW5lIEdMX05VTV9QUk9HUkFNX0JJTkFSWV9GT1JNQVRTICAgICAweDg3RkUKKyNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfRk9STUFUUyAgICAgICAgIDB4ODdGRgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1IxMV9FQUMgICAgICAgICAgICAgMHg5MjcwCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfU0lHTkVEX1IxMV9FQUMgICAgICAweDkyNzEKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SRzExX0VBQyAgICAgICAgICAgIDB4OTI3MgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NJR05FRF9SRzExX0VBQyAgICAgMHg5MjczCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCOF9FVEMyICAgICAgICAgICAweDkyNzQKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9TUkdCOF9FVEMyICAgICAgICAgIDB4OTI3NQorI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQjhfUFVOQ0hUSFJPVUdIX0FMUEhBMV9FVEMyIDB4OTI3NgorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X1BVTkNIVEhST1VHSF9BTFBIQTFfRVRDMiAweDkyNzcKKyNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQyAgICAgIDB4OTI3OAorI2RlZmluZSBHTF9DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQyAweDkyNzkKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTU1VVEFCTEVfRk9STUFUICAgICAgIDB4OTEyRgorI2RlZmluZSBHTF9NQVhfRUxFTUVOVF9JTkRFWCAgICAgICAgICAgICAgMHg4RDZCCisjZGVmaW5lIEdMX05VTV9TQU1QTEVfQ09VTlRTICAgICAgICAgICAgICAweDkzODAKKyNkZWZpbmUgR0xfVEVYVFVSRV9JTU1VVEFCTEVfTEVWRUxTICAgICAgIDB4ODJERgorR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZEJ1ZmZlciAoR0xlbnVtIG1vZGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1JhbmdlRWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHVpbnQgc3RhcnQsIEdMdWludCBlbmQsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpY2VzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleEltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKnBpeGVscyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICpwaXhlbHMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0QgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUXVlcmllcyAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVRdWVyaWVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNRdWVyeSAoR0x1aW50IGlkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJlZ2luUXVlcnkgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRRdWVyeSAoR0xlbnVtIHRhcmdldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRRdWVyeWl2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXYgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbFVubWFwQnVmZmVyIChHTGVudW0gdGFyZ2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0J1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzeDJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgyeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDJmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXgzeDRmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm1NYXRyaXg0eDNmdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsaXRGcmFtZWJ1ZmZlciAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlTGF5ZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IGxheWVyKTsKK0dMX0FQSUNBTEwgdm9pZCAqR0xfQVBJRU5UUlkgZ2xNYXBCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCwgR0xiaXRmaWVsZCBhY2Nlc3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmx1c2hNYXBwZWRCdWZmZXJSYW5nZSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIGxlbmd0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kVmVydGV4QXJyYXkgKEdMdWludCBhcnJheSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhBcnJheXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuVmVydGV4QXJyYXlzIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNWZXJ0ZXhBcnJheSAoR0x1aW50IGFycmF5KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXJpX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xpbnQgKmRhdGEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmVnaW5UcmFuc2Zvcm1GZWVkYmFjayAoR0xlbnVtIHByaW1pdGl2ZU1vZGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kVHJhbnNmb3JtRmVlZGJhY2sgKHZvaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZEJ1ZmZlclJhbmdlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXJCYXNlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgaW5kZXgsIEdMdWludCBidWZmZXIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVHJhbnNmb3JtRmVlZGJhY2tWYXJ5aW5ncyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqY29uc3QqdmFyeWluZ3MsIEdMZW51bSBidWZmZXJNb2RlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRyYW5zZm9ybUZlZWRiYWNrVmFyeWluZyAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMc2l6ZWkgKnNpemUsIEdMZW51bSAqdHlwZSwgR0xjaGFyICpuYW1lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYklQb2ludGVyIChHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3Qgdm9pZCAqcG9pbnRlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJJaXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYkl1aXYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNGkgKEdMdWludCBpbmRleCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJJNHVpIChHTHVpbnQgaW5kZXgsIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHosIEdMdWludCB3KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYkk0aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0xpbnQgKnYpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliSTR1aXYgKEdMdWludCBpbmRleCwgY29uc3QgR0x1aW50ICp2KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm11aXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldEZyYWdEYXRhTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTF1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMnVpIChHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTN1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTR1aSAoR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIsIEdMdWludCB2Myk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMXVpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJ1aXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVuaWZvcm0zdWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0x1aW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNHVpdiAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJCdWZmZXJpdiAoR0xlbnVtIGJ1ZmZlciwgR0xpbnQgZHJhd2J1ZmZlciwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQnVmZmVydWl2IChHTGVudW0gYnVmZmVyLCBHTGludCBkcmF3YnVmZmVyLCBjb25zdCBHTHVpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQnVmZmVyZnYgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyQnVmZmVyZmkgKEdMZW51bSBidWZmZXIsIEdMaW50IGRyYXdidWZmZXIsIEdMZmxvYXQgZGVwdGgsIEdMaW50IHN0ZW5jaWwpOworR0xfQVBJQ0FMTCBjb25zdCBHTHVieXRlICpHTF9BUElFTlRSWSBnbEdldFN0cmluZ2kgKEdMZW51bSBuYW1lLCBHTHVpbnQgaW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ29weUJ1ZmZlclN1YkRhdGEgKEdMZW51bSByZWFkVGFyZ2V0LCBHTGVudW0gd3JpdGVUYXJnZXQsIEdMaW50cHRyIHJlYWRPZmZzZXQsIEdMaW50cHRyIHdyaXRlT2Zmc2V0LCBHTHNpemVpcHRyIHNpemUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybUluZGljZXMgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIHVuaWZvcm1Db3VudCwgY29uc3QgR0xjaGFyICpjb25zdCp1bmlmb3JtTmFtZXMsIEdMdWludCAqdW5pZm9ybUluZGljZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybXNpdiAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgdW5pZm9ybUNvdW50LCBjb25zdCBHTHVpbnQgKnVuaWZvcm1JbmRpY2VzLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTHVpbnQgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtQmxvY2tJbmRleCAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciAqdW5pZm9ybUJsb2NrTmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRBY3RpdmVVbmlmb3JtQmxvY2tpdiAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtQmxvY2tJbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm1CbG9ja05hbWUgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgdW5pZm9ybUJsb2NrSW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKnVuaWZvcm1CbG9ja05hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVW5pZm9ybUJsb2NrQmluZGluZyAoR0x1aW50IHByb2dyYW0sIEdMdWludCB1bmlmb3JtQmxvY2tJbmRleCwgR0x1aW50IHVuaWZvcm1CbG9ja0JpbmRpbmcpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0FycmF5c0luc3RhbmNlZCAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBHTHNpemVpIGluc3RhbmNlY291bnQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd0VsZW1lbnRzSW5zdGFuY2VkIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgaW5zdGFuY2Vjb3VudCk7CitHTF9BUElDQUxMIEdMc3luYyBHTF9BUElFTlRSWSBnbEZlbmNlU3luYyAoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzU3luYyAoR0xzeW5jIHN5bmMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlU3luYyAoR0xzeW5jIHN5bmMpOworR0xfQVBJQ0FMTCBHTGVudW0gR0xfQVBJRU5UUlkgZ2xDbGllbnRXYWl0U3luYyAoR0xzeW5jIHN5bmMsIEdMYml0ZmllbGQgZmxhZ3MsIEdMdWludDY0IHRpbWVvdXQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsV2FpdFN5bmMgKEdMc3luYyBzeW5jLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXI2NHYgKEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqZGF0YSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTeW5jaXYgKEdMc3luYyBzeW5jLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqdmFsdWVzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEludGVnZXI2NGlfdiAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGluZGV4LCBHTGludDY0ICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcmk2NHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQ2NCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlblNhbXBsZXJzIChHTHNpemVpIGNvdW50LCBHTHVpbnQgKnNhbXBsZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVNhbXBsZXJzIChHTHNpemVpIGNvdW50LCBjb25zdCBHTHVpbnQgKnNhbXBsZXJzKTsKK0dMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNTYW1wbGVyIChHTHVpbnQgc2FtcGxlcik7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kU2FtcGxlciAoR0x1aW50IHVuaXQsIEdMdWludCBzYW1wbGVyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZXJQYXJhbWV0ZXJpIChHTHVpbnQgc2FtcGxlciwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyaXYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyZiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVyUGFyYW1ldGVyZnYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFNhbXBsZXJQYXJhbWV0ZXJpdiAoR0x1aW50IHNhbXBsZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRTYW1wbGVyUGFyYW1ldGVyZnYgKEdMdWludCBzYW1wbGVyLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJEaXZpc29yIChHTHVpbnQgaW5kZXgsIEdMdWludCBkaXZpc29yKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRUcmFuc2Zvcm1GZWVkYmFjayAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVRyYW5zZm9ybUZlZWRiYWNrcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UcmFuc2Zvcm1GZWVkYmFja3MgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpOworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1RyYW5zZm9ybUZlZWRiYWNrIChHTHVpbnQgaWQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUGF1c2VUcmFuc2Zvcm1GZWVkYmFjayAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZXN1bWVUcmFuc2Zvcm1GZWVkYmFjayAodm9pZCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtQmluYXJ5IChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCB2b2lkICpiaW5hcnkpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbUJpbmFyeSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IHZvaWQgKmJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcmkgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEludmFsaWRhdGVGcmFtZWJ1ZmZlciAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xJbnZhbGlkYXRlU3ViRnJhbWVidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTNEIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlcm5hbGZvcm1hdGl2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKKyNlbmRpZiAvKiBHTF9FU19WRVJTSU9OXzNfMCAqLworCisjaWZuZGVmIEdMX0VTX1ZFUlNJT05fM18xCisjZGVmaW5lIEdMX0VTX1ZFUlNJT05fM18xIDEKKyNkZWZpbmUgR0xfQ09NUFVURV9TSEFERVIgICAgICAgICAgICAgICAgIDB4OTFCOQorI2RlZmluZSBHTF9NQVhfQ09NUFVURV9VTklGT1JNX0JMT0NLUyAgICAgMHg5MUJCCisjZGVmaW5lIEdMX01BWF9DT01QVVRFX1RFWFRVUkVfSU1BR0VfVU5JVFMgMHg5MUJDCisjZGVmaW5lIEdMX01BWF9DT01QVVRFX0lNQUdFX1VOSUZPUk1TICAgICAweDkxQkQKKyNkZWZpbmUgR0xfTUFYX0NPTVBVVEVfU0hBUkVEX01FTU9SWV9TSVpFIDB4ODI2MgorI2RlZmluZSBHTF9NQVhfQ09NUFVURV9VTklGT1JNX0NPTVBPTkVOVFMgMHg4MjYzCisjZGVmaW5lIEdMX01BWF9DT01QVVRFX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg4MjY0CisjZGVmaW5lIEdMX01BWF9DT01QVVRFX0FUT01JQ19DT1VOVEVSUyAgICAweDgyNjUKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX0NPTVBVVEVfVU5JRk9STV9DT01QT05FTlRTIDB4ODI2NgorI2RlZmluZSBHTF9NQVhfQ09NUFVURV9XT1JLX0dST1VQX0lOVk9DQVRJT05TIDB4OTBFQgorI2RlZmluZSBHTF9NQVhfQ09NUFVURV9XT1JLX0dST1VQX0NPVU5UICAgMHg5MUJFCisjZGVmaW5lIEdMX01BWF9DT01QVVRFX1dPUktfR1JPVVBfU0laRSAgICAweDkxQkYKKyNkZWZpbmUgR0xfQ09NUFVURV9XT1JLX0dST1VQX1NJWkUgICAgICAgIDB4ODI2NworI2RlZmluZSBHTF9ESVNQQVRDSF9JTkRJUkVDVF9CVUZGRVIgICAgICAgMHg5MEVFCisjZGVmaW5lIEdMX0RJU1BBVENIX0lORElSRUNUX0JVRkZFUl9CSU5ESU5HIDB4OTBFRgorI2RlZmluZSBHTF9DT01QVVRFX1NIQURFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBHTF9EUkFXX0lORElSRUNUX0JVRkZFUiAgICAgICAgICAgMHg4RjNGCisjZGVmaW5lIEdMX0RSQVdfSU5ESVJFQ1RfQlVGRkVSX0JJTkRJTkcgICAweDhGNDMKKyNkZWZpbmUgR0xfTUFYX1VOSUZPUk1fTE9DQVRJT05TICAgICAgICAgIDB4ODI2RQorI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9ERUZBVUxUX1dJRFRIICAgICAgMHg5MzEwCisjZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0RFRkFVTFRfSEVJR0hUICAgICAweDkzMTEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfREVGQVVMVF9TQU1QTEVTICAgIDB4OTMxMworI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9ERUZBVUxUX0ZJWEVEX1NBTVBMRV9MT0NBVElPTlMgMHg5MzE0CisjZGVmaW5lIEdMX01BWF9GUkFNRUJVRkZFUl9XSURUSCAgICAgICAgICAweDkzMTUKKyNkZWZpbmUgR0xfTUFYX0ZSQU1FQlVGRkVSX0hFSUdIVCAgICAgICAgIDB4OTMxNgorI2RlZmluZSBHTF9NQVhfRlJBTUVCVUZGRVJfU0FNUExFUyAgICAgICAgMHg5MzE4CisjZGVmaW5lIEdMX1VOSUZPUk0gICAgICAgICAgICAgICAgICAgICAgICAweDkyRTEKKyNkZWZpbmUgR0xfVU5JRk9STV9CTE9DSyAgICAgICAgICAgICAgICAgIDB4OTJFMgorI2RlZmluZSBHTF9QUk9HUkFNX0lOUFVUICAgICAgICAgICAgICAgICAgMHg5MkUzCisjZGVmaW5lIEdMX1BST0dSQU1fT1VUUFVUICAgICAgICAgICAgICAgICAweDkyRTQKKyNkZWZpbmUgR0xfQlVGRkVSX1ZBUklBQkxFICAgICAgICAgICAgICAgIDB4OTJFNQorI2RlZmluZSBHTF9TSEFERVJfU1RPUkFHRV9CTE9DSyAgICAgICAgICAgMHg5MkU2CisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUiAgICAgICAgICAweDkyQzAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX1ZBUllJTkcgICAgIDB4OTJGNAorI2RlZmluZSBHTF9BQ1RJVkVfUkVTT1VSQ0VTICAgICAgICAgICAgICAgMHg5MkY1CisjZGVmaW5lIEdMX01BWF9OQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAweDkyRjYKKyNkZWZpbmUgR0xfTUFYX05VTV9BQ1RJVkVfVkFSSUFCTEVTICAgICAgIDB4OTJGNworI2RlZmluZSBHTF9OQU1FX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgMHg5MkY5CisjZGVmaW5lIEdMX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkyRkEKKyNkZWZpbmUgR0xfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgIDB4OTJGQgorI2RlZmluZSBHTF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MkZDCisjZGVmaW5lIEdMX0JMT0NLX0lOREVYICAgICAgICAgICAgICAgICAgICAweDkyRkQKKyNkZWZpbmUgR0xfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgIDB4OTJGRQorI2RlZmluZSBHTF9NQVRSSVhfU1RSSURFICAgICAgICAgICAgICAgICAgMHg5MkZGCisjZGVmaW5lIEdMX0lTX1JPV19NQUpPUiAgICAgICAgICAgICAgICAgICAweDkzMDAKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX0lOREVYICAgIDB4OTMwMQorI2RlZmluZSBHTF9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgMHg5MzAyCisjZGVmaW5lIEdMX0JVRkZFUl9EQVRBX1NJWkUgICAgICAgICAgICAgICAweDkzMDMKKyNkZWZpbmUgR0xfTlVNX0FDVElWRV9WQVJJQUJMRVMgICAgICAgICAgIDB4OTMwNAorI2RlZmluZSBHTF9BQ1RJVkVfVkFSSUFCTEVTICAgICAgICAgICAgICAgMHg5MzA1CisjZGVmaW5lIEdMX1JFRkVSRU5DRURfQllfVkVSVEVYX1NIQURFUiAgICAweDkzMDYKKyNkZWZpbmUgR0xfUkVGRVJFTkNFRF9CWV9GUkFHTUVOVF9TSEFERVIgIDB4OTMwQQorI2RlZmluZSBHTF9SRUZFUkVOQ0VEX0JZX0NPTVBVVEVfU0hBREVSICAgMHg5MzBCCisjZGVmaW5lIEdMX1RPUF9MRVZFTF9BUlJBWV9TSVpFICAgICAgICAgICAweDkzMEMKKyNkZWZpbmUgR0xfVE9QX0xFVkVMX0FSUkFZX1NUUklERSAgICAgICAgIDB4OTMwRAorI2RlZmluZSBHTF9MT0NBVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHg5MzBFCisjZGVmaW5lIEdMX1ZFUlRFWF9TSEFERVJfQklUICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9CSVQgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMX0FMTF9TSEFERVJfQklUUyAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIEdMX1BST0dSQU1fU0VQQVJBQkxFICAgICAgICAgICAgICAweDgyNTgKKyNkZWZpbmUgR0xfQUNUSVZFX1BST0dSQU0gICAgICAgICAgICAgICAgIDB4ODI1OQorI2RlZmluZSBHTF9QUk9HUkFNX1BJUEVMSU5FX0JJTkRJTkcgICAgICAgMHg4MjVBCisjZGVmaW5lIEdMX0FUT01JQ19DT1VOVEVSX0JVRkZFUl9CSU5ESU5HICAweDkyQzEKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1NUQVJUICAgIDB4OTJDMgorI2RlZmluZSBHTF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfU0laRSAgICAgMHg5MkMzCisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSUyAweDkyQ0MKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0FUT01JQ19DT1VOVEVSX0JVRkZFUlMgMHg5MkQwCisjZGVmaW5lIEdMX01BWF9DT01CSU5FRF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTIDB4OTJEMQorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUT01JQ19DT1VOVEVSUyAgICAgMHg5MkQyCisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9BVE9NSUNfQ09VTlRFUlMgICAweDkyRDYKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX0FUT01JQ19DT1VOVEVSUyAgIDB4OTJENworI2RlZmluZSBHTF9NQVhfQVRPTUlDX0NPVU5URVJfQlVGRkVSX1NJWkUgMHg5MkQ4CisjZGVmaW5lIEdMX01BWF9BVE9NSUNfQ09VTlRFUl9CVUZGRVJfQklORElOR1MgMHg5MkRDCisjZGVmaW5lIEdMX0FDVElWRV9BVE9NSUNfQ09VTlRFUl9CVUZGRVJTICAweDkyRDkKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0FUT01JQ19DT1VOVEVSICAgIDB4OTJEQgorI2RlZmluZSBHTF9NQVhfSU1BR0VfVU5JVFMgICAgICAgICAgICAgICAgMHg4RjM4CisjZGVmaW5lIEdMX01BWF9WRVJURVhfSU1BR0VfVU5JRk9STVMgICAgICAweDkwQ0EKKyNkZWZpbmUgR0xfTUFYX0ZSQUdNRU5UX0lNQUdFX1VOSUZPUk1TICAgIDB4OTBDRQorI2RlZmluZSBHTF9NQVhfQ09NQklORURfSU1BR0VfVU5JRk9STVMgICAgMHg5MENGCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTkFNRSAgICAgICAgICAgICAweDhGM0EKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19MRVZFTCAgICAgICAgICAgIDB4OEYzQgorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0xBWUVSRUQgICAgICAgICAgMHg4RjNDCisjZGVmaW5lIEdMX0lNQUdFX0JJTkRJTkdfTEFZRVIgICAgICAgICAgICAweDhGM0QKKyNkZWZpbmUgR0xfSU1BR0VfQklORElOR19BQ0NFU1MgICAgICAgICAgIDB4OEYzRQorI2RlZmluZSBHTF9JTUFHRV9CSU5ESU5HX0ZPUk1BVCAgICAgICAgICAgMHg5MDZFCisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQkFSUklFUl9CSVQgMHgwMDAwMDAwMQorI2RlZmluZSBHTF9FTEVNRU5UX0FSUkFZX0JBUlJJRVJfQklUICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHTF9VTklGT1JNX0JBUlJJRVJfQklUICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBHTF9URVhUVVJFX0ZFVENIX0JBUlJJRVJfQklUICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBHTF9TSEFERVJfSU1BR0VfQUNDRVNTX0JBUlJJRVJfQklUIDB4MDAwMDAwMjAKKyNkZWZpbmUgR0xfQ09NTUFORF9CQVJSSUVSX0JJVCAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgR0xfUElYRUxfQlVGRkVSX0JBUlJJRVJfQklUICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgR0xfVEVYVFVSRV9VUERBVEVfQkFSUklFUl9CSVQgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgR0xfQlVGRkVSX1VQREFURV9CQVJSSUVSX0JJVCAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQkFSUklFUl9CSVQgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgR0xfVFJBTlNGT1JNX0ZFRURCQUNLX0JBUlJJRVJfQklUIDB4MDAwMDA4MDAKKyNkZWZpbmUgR0xfQVRPTUlDX0NPVU5URVJfQkFSUklFUl9CSVQgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgR0xfQUxMX0JBUlJJRVJfQklUUyAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgR0xfSU1BR0VfMkQgICAgICAgICAgICAgICAgICAgICAgIDB4OTA0RAorI2RlZmluZSBHTF9JTUFHRV8zRCAgICAgICAgICAgICAgICAgICAgICAgMHg5MDRFCisjZGVmaW5lIEdMX0lNQUdFX0NVQkUgICAgICAgICAgICAgICAgICAgICAweDkwNTAKKyNkZWZpbmUgR0xfSU1BR0VfMkRfQVJSQVkgICAgICAgICAgICAgICAgIDB4OTA1MworI2RlZmluZSBHTF9JTlRfSU1BR0VfMkQgICAgICAgICAgICAgICAgICAgMHg5MDU4CisjZGVmaW5lIEdMX0lOVF9JTUFHRV8zRCAgICAgICAgICAgICAgICAgICAweDkwNTkKKyNkZWZpbmUgR0xfSU5UX0lNQUdFX0NVQkUgICAgICAgICAgICAgICAgIDB4OTA1QgorI2RlZmluZSBHTF9JTlRfSU1BR0VfMkRfQVJSQVkgICAgICAgICAgICAgMHg5MDVFCisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRCAgICAgICAgICAweDkwNjMKKyNkZWZpbmUgR0xfVU5TSUdORURfSU5UX0lNQUdFXzNEICAgICAgICAgIDB4OTA2NAorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfSU1BR0VfQ1VCRSAgICAgICAgMHg5MDY2CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9JTUFHRV8yRF9BUlJBWSAgICAweDkwNjkKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfVFlQRSAweDkwQzcKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfU0laRSAweDkwQzgKKyNkZWZpbmUgR0xfSU1BR0VfRk9STUFUX0NPTVBBVElCSUxJVFlfQllfQ0xBU1MgMHg5MEM5CisjZGVmaW5lIEdMX1JFQURfT05MWSAgICAgICAgICAgICAgICAgICAgICAweDg4QjgKKyNkZWZpbmUgR0xfV1JJVEVfT05MWSAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQorI2RlZmluZSBHTF9SRUFEX1dSSVRFICAgICAgICAgICAgICAgICAgICAgMHg4OEJBCisjZGVmaW5lIEdMX1NIQURFUl9TVE9SQUdFX0JVRkZFUiAgICAgICAgICAweDkwRDIKKyNkZWZpbmUgR0xfU0hBREVSX1NUT1JBR0VfQlVGRkVSX0JJTkRJTkcgIDB4OTBEMworI2RlZmluZSBHTF9TSEFERVJfU1RPUkFHRV9CVUZGRVJfU1RBUlQgICAgMHg5MEQ0CisjZGVmaW5lIEdMX1NIQURFUl9TVE9SQUdFX0JVRkZFUl9TSVpFICAgICAweDkwRDUKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9TSEFERVJfU1RPUkFHRV9CTE9DS1MgMHg5MEQ2CisjZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9TSEFERVJfU1RPUkFHRV9CTE9DS1MgMHg5MERBCisjZGVmaW5lIEdMX01BWF9DT01QVVRFX1NIQURFUl9TVE9SQUdFX0JMT0NLUyAweDkwREIKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1NIQURFUl9TVE9SQUdFX0JMT0NLUyAweDkwREMKKyNkZWZpbmUgR0xfTUFYX1NIQURFUl9TVE9SQUdFX0JVRkZFUl9CSU5ESU5HUyAweDkwREQKKyNkZWZpbmUgR0xfTUFYX1NIQURFUl9TVE9SQUdFX0JMT0NLX1NJWkUgIDB4OTBERQorI2RlZmluZSBHTF9TSEFERVJfU1RPUkFHRV9CVUZGRVJfT0ZGU0VUX0FMSUdOTUVOVCAweDkwREYKKyNkZWZpbmUgR0xfU0hBREVSX1NUT1JBR0VfQkFSUklFUl9CSVQgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgR0xfTUFYX0NPTUJJTkVEX1NIQURFUl9PVVRQVVRfUkVTT1VSQ0VTIDB4OEYzOQorI2RlZmluZSBHTF9ERVBUSF9TVEVOQ0lMX1RFWFRVUkVfTU9ERSAgICAgMHg5MEVBCisjZGVmaW5lIEdMX1NURU5DSUxfSU5ERVggICAgICAgICAgICAgICAgICAweDE5MDEKKyNkZWZpbmUgR0xfTUlOX1BST0dSQU1fVEVYVFVSRV9HQVRIRVJfT0ZGU0VUIDB4OEU1RQorI2RlZmluZSBHTF9NQVhfUFJPR1JBTV9URVhUVVJFX0dBVEhFUl9PRkZTRVQgMHg4RTVGCisjZGVmaW5lIEdMX1NBTVBMRV9QT1NJVElPTiAgICAgICAgICAgICAgICAweDhFNTAKKyNkZWZpbmUgR0xfU0FNUExFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4OEU1MQorI2RlZmluZSBHTF9TQU1QTEVfTUFTS19WQUxVRSAgICAgICAgICAgICAgMHg4RTUyCisjZGVmaW5lIEdMX1RFWFRVUkVfMkRfTVVMVElTQU1QTEUgICAgICAgICAweDkxMDAKKyNkZWZpbmUgR0xfTUFYX1NBTVBMRV9NQVNLX1dPUkRTICAgICAgICAgIDB4OEU1OQorI2RlZmluZSBHTF9NQVhfQ09MT1JfVEVYVFVSRV9TQU1QTEVTICAgICAgMHg5MTBFCisjZGVmaW5lIEdMX01BWF9ERVBUSF9URVhUVVJFX1NBTVBMRVMgICAgICAweDkxMEYKKyNkZWZpbmUgR0xfTUFYX0lOVEVHRVJfU0FNUExFUyAgICAgICAgICAgIDB4OTExMAorI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkRfTVVMVElTQU1QTEUgMHg5MTA0CisjZGVmaW5lIEdMX1RFWFRVUkVfU0FNUExFUyAgICAgICAgICAgICAgICAweDkxMDYKKyNkZWZpbmUgR0xfVEVYVFVSRV9GSVhFRF9TQU1QTEVfTE9DQVRJT05TIDB4OTEwNworI2RlZmluZSBHTF9URVhUVVJFX1dJRFRIICAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEdMX1RFWFRVUkVfSEVJR0hUICAgICAgICAgICAgICAgICAweDEwMDEKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSCAgICAgICAgICAgICAgICAgIDB4ODA3MQorI2RlZmluZSBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVCAgICAgICAgMHgxMDAzCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVEX1NJWkUgICAgICAgICAgICAgICAweDgwNUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HUkVFTl9TSVpFICAgICAgICAgICAgIDB4ODA1RAorI2RlZmluZSBHTF9URVhUVVJFX0JMVUVfU0laRSAgICAgICAgICAgICAgMHg4MDVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfU0laRSAgICAgICAgICAgICAweDgwNUYKKyNkZWZpbmUgR0xfVEVYVFVSRV9ERVBUSF9TSVpFICAgICAgICAgICAgIDB4ODg0QQorI2RlZmluZSBHTF9URVhUVVJFX1NURU5DSUxfU0laRSAgICAgICAgICAgMHg4OEYxCisjZGVmaW5lIEdMX1RFWFRVUkVfU0hBUkVEX1NJWkUgICAgICAgICAgICAweDhDM0YKKyNkZWZpbmUgR0xfVEVYVFVSRV9SRURfVFlQRSAgICAgICAgICAgICAgIDB4OEMxMAorI2RlZmluZSBHTF9URVhUVVJFX0dSRUVOX1RZUEUgICAgICAgICAgICAgMHg4QzExCisjZGVmaW5lIEdMX1RFWFRVUkVfQkxVRV9UWVBFICAgICAgICAgICAgICAweDhDMTIKKyNkZWZpbmUgR0xfVEVYVFVSRV9BTFBIQV9UWVBFICAgICAgICAgICAgIDB4OEMxMworI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1RZUEUgICAgICAgICAgICAgMHg4QzE2CisjZGVmaW5lIEdMX1RFWFRVUkVfQ09NUFJFU1NFRCAgICAgICAgICAgICAweDg2QTEKKyNkZWZpbmUgR0xfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAgICAgICAgIDB4OTEwOAorI2RlZmluZSBHTF9JTlRfU0FNUExFUl8yRF9NVUxUSVNBTVBMRSAgICAgMHg5MTA5CisjZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX01VTFRJU0FNUExFIDB4OTEwQQorI2RlZmluZSBHTF9WRVJURVhfQVRUUklCX0JJTkRJTkcgICAgICAgICAgMHg4MkQ0CisjZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfUkVMQVRJVkVfT0ZGU0VUICAweDgyRDUKKyNkZWZpbmUgR0xfVkVSVEVYX0JJTkRJTkdfRElWSVNPUiAgICAgICAgIDB4ODJENgorI2RlZmluZSBHTF9WRVJURVhfQklORElOR19PRkZTRVQgICAgICAgICAgMHg4MkQ3CisjZGVmaW5lIEdMX1ZFUlRFWF9CSU5ESU5HX1NUUklERSAgICAgICAgICAweDgyRDgKKyNkZWZpbmUgR0xfVkVSVEVYX0JJTkRJTkdfQlVGRkVSICAgICAgICAgIDB4OEY0RgorI2RlZmluZSBHTF9NQVhfVkVSVEVYX0FUVFJJQl9SRUxBVElWRV9PRkZTRVQgMHg4MkQ5CisjZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCX0JJTkRJTkdTICAgICAweDgyREEKKyNkZWZpbmUgR0xfTUFYX1ZFUlRFWF9BVFRSSUJfU1RSSURFICAgICAgIDB4ODJFNQorR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzcGF0Y2hDb21wdXRlIChHTHVpbnQgbnVtX2dyb3Vwc194LCBHTHVpbnQgbnVtX2dyb3Vwc195LCBHTHVpbnQgbnVtX2dyb3Vwc196KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERpc3BhdGNoQ29tcHV0ZUluZGlyZWN0IChHTGludHB0ciBpbmRpcmVjdCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzSW5kaXJlY3QgKEdMZW51bSBtb2RlLCBjb25zdCB2b2lkICppbmRpcmVjdCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHNJbmRpcmVjdCAoR0xlbnVtIG1vZGUsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkICppbmRpcmVjdCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RnJhbWVidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1JbnRlcmZhY2VpdiAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwcm9ncmFtSW50ZXJmYWNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTHVpbnQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUmVzb3VyY2VJbmRleCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwcm9ncmFtSW50ZXJmYWNlLCBjb25zdCBHTGNoYXIgKm5hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVJlc291cmNlTmFtZSAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwcm9ncmFtSW50ZXJmYWNlLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKm5hbWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVJlc291cmNlaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcHJvZ3JhbUludGVyZmFjZSwgR0x1aW50IGluZGV4LCBHTHNpemVpIHByb3BDb3VudCwgY29uc3QgR0xlbnVtICpwcm9wcywgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCBHTGludCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1SZXNvdXJjZUxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHByb2dyYW1JbnRlcmZhY2UsIGNvbnN0IEdMY2hhciAqbmFtZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xVc2VQcm9ncmFtU3RhZ2VzIChHTHVpbnQgcGlwZWxpbmUsIEdMYml0ZmllbGQgc3RhZ2VzLCBHTHVpbnQgcHJvZ3JhbSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVTaGFkZXJQcm9ncmFtIChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyUHJvZ3JhbXYgKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKmNvbnN0KnN0cmluZ3MpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFByb2dyYW1QaXBlbGluZSAoR0x1aW50IHBpcGVsaW5lKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUHJvZ3JhbVBpcGVsaW5lcyAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7CitHTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUHJvZ3JhbVBpcGVsaW5lIChHTHVpbnQgcGlwZWxpbmUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXYgKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjApOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zaSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB2MCwgR0xpbnQgdjEsIEdMaW50IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgdjAsIEdMaW50IHYxLCBHTGludCB2MiwgR0xpbnQgdjMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMnVpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM3VpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMdWludCB2MCwgR0x1aW50IHYxLCBHTHVpbnQgdjIpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWkgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0x1aW50IHYwLCBHTHVpbnQgdjEsIEdMdWludCB2MiwgR0x1aW50IHYzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTJmIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgdjAsIEdMZmxvYXQgdjEpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHYwLCBHTGZsb2F0IHYxLCBHTGZsb2F0IHYyKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB2MCwgR0xmbG9hdCB2MSwgR0xmbG9hdCB2MiwgR0xmbG9hdCB2Myk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaXYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2l2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRpdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0ydWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zdWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00dWl2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdWludCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0zZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyeDNmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4MmZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4Mng0ZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0eDJmdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDN4NGZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NHgzZnYgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmUgKEdMdWludCBwaXBlbGluZSk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZEltYWdlVGV4dHVyZSAoR0x1aW50IHVuaXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xib29sZWFuIGxheWVyZWQsIEdMaW50IGxheWVyLCBHTGVudW0gYWNjZXNzLCBHTGVudW0gZm9ybWF0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW5pX3YgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpbmRleCwgR0xib29sZWFuICpkYXRhKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbE1lbW9yeUJhcnJpZXIgKEdMYml0ZmllbGQgYmFycmllcnMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTWVtb3J5QmFycmllckJ5UmVnaW9uIChHTGJpdGZpZWxkIGJhcnJpZXJzKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UyRE11bHRpc2FtcGxlIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMYm9vbGVhbiBmaXhlZHNhbXBsZWxvY2F0aW9ucyk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRNdWx0aXNhbXBsZWZ2IChHTGVudW0gcG5hbWUsIEdMdWludCBpbmRleCwgR0xmbG9hdCAqdmFsKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZU1hc2tpIChHTHVpbnQgbWFza051bWJlciwgR0xiaXRmaWVsZCBtYXNrKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleExldmVsUGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRWZXJ0ZXhCdWZmZXIgKEdMdWludCBiaW5kaW5naW5kZXgsIEdMdWludCBidWZmZXIsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaSBzdHJpZGUpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliRm9ybWF0IChHTHVpbnQgYXR0cmliaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0x1aW50IHJlbGF0aXZlb2Zmc2V0KTsKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYklGb3JtYXQgKEdMdWludCBhdHRyaWJpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMdWludCByZWxhdGl2ZW9mZnNldCk7CitHTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWJCaW5kaW5nIChHTHVpbnQgYXR0cmliaW5kZXgsIEdMdWludCBiaW5kaW5naW5kZXgpOworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4QmluZGluZ0Rpdmlzb3IgKEdMdWludCBiaW5kaW5naW5kZXgsIEdMdWludCBkaXZpc29yKTsKKyNlbmRpZiAvKiBHTF9FU19WRVJTSU9OXzNfMSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzMvZ2wzZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsM2V4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2U3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsM2V4dC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19nbDNleHRfaF8KKyNkZWZpbmUgX19nbDNleHRfaF8KKworLyogJFJldmlzaW9uOiAxNzgwOSAkIG9uICREYXRlOjogMjAxMi0wNS0xNCAwODowMzozNiAtMDcwMCAjJCAqLworCisvKgorICogVGhpcyBkb2N1bWVudCBpcyBsaWNlbnNlZCB1bmRlciB0aGUgU0dJIEZyZWUgU29mdHdhcmUgQiBMaWNlbnNlIFZlcnNpb24KKyAqIDIuMC4gRm9yIGRldGFpbHMsIHNlZSBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIvIC4KKyAqLworCisvKiBPcGVuR0wgRVMgMyBFeHRlbnNpb25zCisgKgorICogQWZ0ZXIgYW4gT0VTIGV4dGVuc2lvbidzIGludGVyYWN0aW9ucyB3aXRoIE9wZW5HbCBFUyAzLjAgaGF2ZSBiZWVuIGRvY3VtZW50ZWQsCisgKiBpdHMgdG9rZW5zIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBzaG91bGQgYmUgYWRkZWQgdG8gdGhpcyBmaWxlIGluIGEgbWFubmVyCisgKiB0aGF0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggZ2wyZXh0Lmggb3IgZ2wzLmguCisgKgorICogVG9rZW5zIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVjb21lIHN0YW5kYXJkCisgKiBmZWF0dXJlcyBpbiBPcGVuR0wgRVMgMy4wIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoaXMgZmlsZS4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdXNpbmcgT3BlbkdMLUVTLTItb25seSBleHRlbnNpb25zIHNob3VsZCBpbmNsdWRlIGdsMmV4dC5oCisgKi8KKworI2VuZGlmIC8qIF9fZ2wzZXh0X2hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsM3BsYXRmb3JtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0dMRVMzL2dsM3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkMWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvR0xFUzMvZ2wzcGxhdGZvcm0uaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIF9fZ2wzcGxhdGZvcm1faF8KKyNkZWZpbmUgX19nbDNwbGF0Zm9ybV9oXworCisvKiAkUmV2aXNpb246IDE4NDM3ICQgb24gJERhdGU6OiAyMDEyLTA3LTA4IDIzOjMxOjM5IC0wNzAwICMkICovCisKKy8qCisgKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgorICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgorICovCisKKy8qIFBsYXRmb3JtLXNwZWNpZmljIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBmb3IgT3BlbkdMIEVTIDMuWCAgZ2wzLmgKKyAqCisgKiBBZG9wdGVycyBtYXkgbW9kaWZ5IGtocnBsYXRmb3JtLmggYW5kIHRoaXMgZmlsZSB0byBzdWl0IHRoZWlyIHBsYXRmb3JtLgorICogWW91IGFyZSBlbmNvdXJhZ2VkIHRvIHN1Ym1pdCBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcyBncm91cCBzbyB0aGF0CisgKiB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLiAgUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzCisgKiBieSBzZW5kaW5nIHRoZW0gdG8gdGhlIHB1YmxpYyBLaHJvbm9zIEJ1Z3ppbGxhIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpCisgKiBieSBmaWxpbmcgYSBidWcgYWdhaW5zdCBwcm9kdWN0ICJPcGVuR0wtRVMiIGNvbXBvbmVudCAiUmVnaXN0cnkiLgorICovCisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworI2lmbmRlZiBHTF9BUElDQUxMCisjZGVmaW5lIEdMX0FQSUNBTEwgIEtIUk9OT1NfQVBJQ0FMTAorI2VuZGlmCisKKyNpZm5kZWYgR0xfQVBJRU5UUlkKKyNkZWZpbmUgR0xfQVBJRU5UUlkgS0hST05PU19BUElFTlRSWQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2dsM3BsYXRmb3JtX2hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9LSFIva2hycGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThhNmZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9LSFIva2hycGxhdGZvcm0uaApAQCAtMCwwICsxLDI4OCBAQAorI2lmbmRlZiBfX2tocnBsYXRmb3JtX2hfCisjZGVmaW5lIF9fa2hycGxhdGZvcm1faF8KKworLyoKKyoqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyoqCisqKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisqKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisqKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCisqKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bworKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorKioKKyoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisqKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCisqKgorKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisqKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KKyovCisKKy8qIEtocm9ub3MgcGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zLgorICoKKyAqICRSZXZpc2lvbjogMjMyOTggJCBvbiAkRGF0ZTogMjAxMy0wOS0zMCAxNzowNzoxMyAtMDcwMCAoTW9uLCAzMCBTZXAgMjAxMykgJAorICoKKyAqIEFkb3B0ZXJzIG1heSBtb2RpZnkgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uIEFkb3B0ZXJzIGFyZQorICogZW5jb3VyYWdlZCB0byBzdWJtaXQgcGxhdGZvcm0gc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcworICogZ3JvdXAgc28gdGhhdCB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLgorICogUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEKKyAqIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QKKyAqICJLaHJvbm9zIChnZW5lcmFsKSIgY29tcG9uZW50ICJSZWdpc3RyeSIuCisgKgorICogQSBwcmVkZWZpbmVkIHRlbXBsYXRlIHdoaWNoIGZpbGxzIGluIHNvbWUgb2YgdGhlIGJ1ZyBmaWVsZHMgY2FuIGJlCisgKiByZWFjaGVkIHVzaW5nIGh0dHA6Ly90aW55dXJsLmNvbS9raHJwbGF0Zm9ybS1oLWJ1Z3JlcG9ydCwgYnV0IHlvdQorICogbXVzdCBjcmVhdGUgYSBCdWd6aWxsYSBsb2dpbiBmaXJzdC4KKyAqCisgKgorICogU2VlIHRoZSBJbXBsZW1lbnRlcidzIEd1aWRlbGluZXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoaXMgZmlsZQorICogc2hvdWxkIGJlIGxvY2F0ZWQgb24geW91ciBzeXN0ZW0gYW5kIGZvciBtb3JlIGRldGFpbHMgb2YgaXRzIHVzZToKKyAqICAgIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvaW1wbGVtZW50ZXJzX2d1aWRlLnBkZgorICoKKyAqIFRoaXMgZmlsZSBzaG91bGQgYmUgaW5jbHVkZWQgYXMKKyAqICAgICAgICAjaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+CisgKiBieSBLaHJvbm9zIGNsaWVudCBBUEkgaGVhZGVyIGZpbGVzIHRoYXQgdXNlIGl0cyB0eXBlcyBhbmQgZGVmaW5lcy4KKyAqCisgKiBUaGUgdHlwZXMgaW4ga2hycGxhdGZvcm0uaCBzaG91bGQgb25seSBiZSB1c2VkIHRvIGRlZmluZSBBUEktc3BlY2lmaWMgdHlwZXMuCisgKgorICogVHlwZXMgZGVmaW5lZCBpbiBraHJwbGF0Zm9ybS5oOgorICogICAga2hyb25vc19pbnQ4X3QgICAgICAgICAgICAgIHNpZ25lZCAgIDggIGJpdAorICogICAga2hyb25vc191aW50OF90ICAgICAgICAgICAgIHVuc2lnbmVkIDggIGJpdAorICogICAga2hyb25vc19pbnQxNl90ICAgICAgICAgICAgIHNpZ25lZCAgIDE2IGJpdAorICogICAga2hyb25vc191aW50MTZfdCAgICAgICAgICAgIHVuc2lnbmVkIDE2IGJpdAorICogICAga2hyb25vc19pbnQzMl90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdAorICogICAga2hyb25vc191aW50MzJfdCAgICAgICAgICAgIHVuc2lnbmVkIDMyIGJpdAorICogICAga2hyb25vc19pbnQ2NF90ICAgICAgICAgICAgIHNpZ25lZCAgIDY0IGJpdAorICogICAga2hyb25vc191aW50NjRfdCAgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdAorICogICAga2hyb25vc19pbnRwdHJfdCAgICAgICAgICAgIHNpZ25lZCAgIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCisgKiAgICBraHJvbm9zX3VpbnRwdHJfdCAgICAgICAgICAgdW5zaWduZWQgc2FtZSBudW1iZXIgb2YgYml0cyBhcyBhIHBvaW50ZXIKKyAqICAgIGtocm9ub3Nfc3NpemVfdCAgICAgICAgICAgICBzaWduZWQgICBzaXplCisgKiAgICBraHJvbm9zX3VzaXplX3QgICAgICAgICAgICAgdW5zaWduZWQgc2l6ZQorICogICAga2hyb25vc19mbG9hdF90ICAgICAgICAgICAgIHNpZ25lZCAgIDMyIGJpdCBmbG9hdGluZyBwb2ludAorICogICAga2hyb25vc190aW1lX25zX3QgICAgICAgICAgIHVuc2lnbmVkIDY0IGJpdCB0aW1lIGluIG5hbm9zZWNvbmRzCisgKiAgICBraHJvbm9zX3V0aW1lX25hbm9zZWNvbmRzX3QgdW5zaWduZWQgdGltZSBpbnRlcnZhbCBvciBhYnNvbHV0ZSB0aW1lIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3NlY29uZHMKKyAqICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdCBzaWduZWQgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcworICogICAga2hyb25vc19ib29sZWFuX2VudW1fdCAgICAgIGVudW1lcmF0ZWQgYm9vbGVhbiB0eXBlLiBUaGlzIHNob3VsZAorICogICAgICBvbmx5IGJlIHVzZWQgYXMgYSBiYXNlIHR5cGUgd2hlbiBhIGNsaWVudCBBUEkncyBib29sZWFuIHR5cGUgaXMKKyAqICAgICAgYW4gZW51bS4gQ2xpZW50IEFQSXMgd2hpY2ggdXNlIGFuIGludGVnZXIgb3Igb3RoZXIgdHlwZSBmb3IKKyAqICAgICAgYm9vbGVhbnMgY2Fubm90IHVzZSB0aGlzIGFzIHRoZSBiYXNlIHR5cGUgZm9yIHRoZWlyIGJvb2xlYW4uCisgKgorICogVG9rZW5zIGRlZmluZWQgaW4ga2hycGxhdGZvcm0uaDoKKyAqCisgKiAgICBLSFJPTk9TX0ZBTFNFLCBLSFJPTk9TX1RSVUUgRW51bWVyYXRlZCBib29sZWFuIGZhbHNlL3RydWUgdmFsdWVzLgorICoKKyAqICAgIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCBpcyAxIGlmIDY0IGJpdCBpbnRlZ2VycyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqICAgIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCBpcyAxIGlmIGZsb2F0cyBhcmUgc3VwcG9ydGVkOyBvdGhlcndpc2UgMC4KKyAqCisgKiBDYWxsaW5nIGNvbnZlbnRpb24gbWFjcm9zIGRlZmluZWQgaW4gdGhpcyBmaWxlOgorICogICAgS0hST05PU19BUElDQUxMCisgKiAgICBLSFJPTk9TX0FQSUVOVFJZCisgKiAgICBLSFJPTk9TX0FQSUFUVFJJQlVURVMKKyAqCisgKiBUaGVzZSBtYXkgYmUgdXNlZCBpbiBmdW5jdGlvbiBwcm90b3R5cGVzIGFzOgorICoKKyAqICAgICAgS0hST05PU19BUElDQUxMIHZvaWQgS0hST05PU19BUElFTlRSWSBmdW5jbmFtZSgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcxLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzIpIEtIUk9OT1NfQVBJQVRUUklCVVRFUzsKKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElDQUxMCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgcHJlY2VkZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisjICBpZiBkZWZpbmVkKEVNVUdMX0JVSUxEKQorIyAgICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgZWxzZQorIyAgICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fU1lNQklBTjMyX18pCisjICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTCBJTVBPUlRfQworI2VsaWYgZGVmaW5lZCAoRU1VR0xfQlVJTEQpCisjICBkZWZpbmUgS0hST05PU19BUElDQUxMIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZWxzZQorIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElFTlRSWQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGlzIGZvbGxvd3MgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiAgYW5kIHByZWNlZGVzIHRoZSBmdW5jdGlvbgorICogbmFtZSBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgorICovCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisgICAgLyogV2luMzIgYnV0IG5vdCBXaW5DRSAqLworIyAgIGRlZmluZSBLSFJPTk9TX0FQSUVOVFJZIF9fc3RkY2FsbAorI2Vsc2UKKyMgICBkZWZpbmUgS0hST05PU19BUElFTlRSWQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUFUVFJJQlVURVMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmb2xsb3dzIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIG9mIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgYXJndW1lbnRzLgorICovCisjaWYgZGVmaW5lZCAoX19BUk1DQ18yX18pCisjZGVmaW5lIEtIUk9OT1NfQVBJQVRUUklCVVRFUyBfX3NvZnRmcAorI2Vsc2UKKyNkZWZpbmUgS0hST05PU19BUElBVFRSSUJVVEVTCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBiYXNpYyB0eXBlIGRlZmluaXRpb25zCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpIHx8IGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19TQ09fXykgfHwgZGVmaW5lZChfX1VTTENfXykKKworCisvKgorICogVXNpbmcgPHN0ZGludC5oPgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX1ZNUyApIHx8IGRlZmluZWQoX19zZ2kpCisKKy8qCisgKiBVc2luZyA8aW50dHlwZXMuaD4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDMyX3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgICAgICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgaW50NjRfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1aW50NjRfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCisKKy8qCisgKiBXaW4zMgorICovCit0eXBlZGVmIF9faW50MzIgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQzMiAgICAgICAga2hyb25vc191aW50MzJfdDsKK3R5cGVkZWYgX19pbnQ2NCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICAgICAgICBraHJvbm9zX3VpbnQ2NF90OworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9fZGlnaXRhbF9fKQorCisvKgorICogU3VuIG9yIERpZ2l0YWwKKyAqLwordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7CisjaWYgZGVmaW5lZChfX2FyY2g2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KQordHlwZWRlZiBsb25nIGludCAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZWxzZQordHlwZWRlZiBsb25nIGxvbmcgaW50ICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgIGtocm9ub3NfdWludDY0X3Q7CisjZW5kaWYgLyogX19hcmNoNjRfXyAqLworI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAxCisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDEKKworI2VsaWYgMAorCisvKgorICogSHlwb3RoZXRpY2FsIHBsYXRmb3JtIHdpdGggbm8gZmxvYXQgb3IgaW50NjQgc3VwcG9ydAorICovCit0eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMAorI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAwCisKKyNlbHNlCisKKy8qCisgKiBHZW5lcmljIGZhbGxiYWNrCisgKi8KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwordHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Cit0eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7CisjZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKKyNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQorCisjZW5kaWYKKworCisvKgorICogVHlwZXMgdGhhdCBhcmUgKHNvIGZhcikgdGhlIHNhbWUgb24gYWxsIHBsYXRmb3JtcworICovCit0eXBlZGVmIHNpZ25lZCAgIGNoYXIgICAgICAgICAga2hyb25vc19pbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAga2hyb25vc191aW50OF90OwordHlwZWRlZiBzaWduZWQgICBzaG9ydCBpbnQgICAgIGtocm9ub3NfaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50ICAgICBraHJvbm9zX3VpbnQxNl90OworCisvKgorICogVHlwZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiBMTFA2NCBhbmQgTFA2NCBhcmNoaXRlY3R1cmVzIC0gaW4gTExQNjQsIAorICogcG9pbnRlcnMgYXJlIDY0IGJpdHMsIGJ1dCAnbG9uZycgaXMgc3RpbGwgMzIgYml0cy4gV2luNjQgYXBwZWFycworICogdG8gYmUgdGhlIG9ubHkgTExQNjQgYXJjaGl0ZWN0dXJlIGluIGN1cnJlbnQgdXNlLgorICovCisjaWZkZWYgX1dJTjY0Cit0eXBlZGVmIHNpZ25lZCAgIGxvbmcgbG9uZyBpbnQga2hyb25vc19pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCBraHJvbm9zX3VpbnRwdHJfdDsKK3R5cGVkZWYgc2lnbmVkICAgbG9uZyBsb25nIGludCBraHJvbm9zX3NzaXplX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQga2hyb25vc191c2l6ZV90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkICAgbG9uZyAgaW50ICAgICBraHJvbm9zX2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBpbnQgICAgIGtocm9ub3NfdWludHB0cl90OwordHlwZWRlZiBzaWduZWQgICBsb25nICBpbnQgICAgIGtocm9ub3Nfc3NpemVfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgaW50ICAgICBraHJvbm9zX3VzaXplX3Q7CisjZW5kaWYKKworI2lmIEtIUk9OT1NfU1VQUE9SVF9GTE9BVAorLyoKKyAqIEZsb2F0IHR5cGUKKyAqLwordHlwZWRlZiAgICAgICAgICBmbG9hdCAgICAgICAgIGtocm9ub3NfZmxvYXRfdDsKKyNlbmRpZgorCisjaWYgS0hST05PU19TVVBQT1JUX0lOVDY0CisvKiBUaW1lIHR5cGVzCisgKgorICogVGhlc2UgdHlwZXMgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdGltZSBpbnRlcnZhbCBpbiBuYW5vc2Vjb25kcyBvcgorICogYW4gYWJzb2x1dGUgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZS4gIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgdGhlIG51bWJlcgorICogb2YgbmFub3NlY29uZHMgc2luY2Ugc29tZSBhcmJpdHJhcnkgc3lzdGVtIGV2ZW50IChlLmcuIHNpbmNlIHRoZSBsYXN0CisgKiB0aW1lIHRoZSBzeXN0ZW0gYm9vdGVkKS4gIFRoZSBVbmFkanVzdGVkIFN5c3RlbSBUaW1lIGlzIGFuIHVuc2lnbmVkCisgKiA2NCBiaXQgdmFsdWUgdGhhdCB3cmFwcyBiYWNrIHRvIDAgZXZlcnkgNTg0IHllYXJzLiAgVGltZSBpbnRlcnZhbHMKKyAqIG1heSBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgorICovCit0eXBlZGVmIGtocm9ub3NfdWludDY0X3QgICAgICAga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190OwordHlwZWRlZiBraHJvbm9zX2ludDY0X3QgICAgICAgIGtocm9ub3Nfc3RpbWVfbmFub3NlY29uZHNfdDsKKyNlbmRpZgorCisvKgorICogRHVtbXkgdmFsdWUgdXNlZCB0byBwYWQgZW51bSB0eXBlcyB0byAzMiBiaXRzLgorICovCisjaWZuZGVmIEtIUk9OT1NfTUFYX0VOVU0KKyNkZWZpbmUgS0hST05PU19NQVhfRU5VTSAweDdGRkZGRkZGCisjZW5kaWYKKworLyoKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbiB0eXBlCisgKgorICogVmFsdWVzIG90aGVyIHRoYW4gemVybyBzaG91bGQgYmUgY29uc2lkZXJlZCB0byBiZSB0cnVlLiAgVGhlcmVmb3JlCisgKiBjb21wYXJpc29ucyBzaG91bGQgbm90IGJlIG1hZGUgYWdhaW5zdCBLSFJPTk9TX1RSVUUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgS0hST05PU19GQUxTRSA9IDAsCisgICAgS0hST05PU19UUlVFICA9IDEsCisgICAgS0hST05PU19CT09MRUFOX0VOVU1fRk9SQ0VfU0laRSA9IEtIUk9OT1NfTUFYX0VOVU0KK30ga2hyb25vc19ib29sZWFuX2VudW1fdDsKKworI2VuZGlmIC8qIF9fa2hycGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL0VHTERpc3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM2MTk1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvUmVuZGVyRUdMX2Z1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvUmVuZGVyRUdMX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmgiCisKKy8vIFRoaXMgaGVhZGVyIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBFR0xEaXNwYXRjaCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucworLy8gcG9pbnRlcnMgdG8gdGhlIEVHTCBzaGFyZWQgbGlicmFyeSB1c2VkIGJ5IGxpYk9wZW5nbFJlbmRlci4gTm9ybWFsbHksCisvLyB0aGlzIHdpbGwgYmUgb3VyIG93biBsaWJFR0xfdHJhbnNsYXRvciwgYnV0IG9uZSBjb3VsZCBpbWFnaW5lIGEKKy8vIHZlbmRvci1zcGVjaWZpYyBiZWluZyB1c2VkIGluc3RlYWQuCisKKy8vIFRoZXJlIGlzIGEgc2luZ2xlIGdsb2JhbCBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSwgbmFtZWQgfHNfZWdsfCwKKy8vIHdoaWNoIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBpbml0X2VnbF9kaXNwYXRjaCgpIGJlZm9yZSB1c2UuCisKKy8vIE5vdGUgdGhhdCBvdXIgY29kZSByZXF1aXJlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgbWlzYyBFR0wgZXh0ZW5zaW9ucworLy8gaW5jbHVkaW5nIGVnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEKCksIHNlZSBSZW5kZXJFR0xfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaAorLy8gZm9yIGEgZnVsbCBsaXN0LgorCisjZGVmaW5lIFJFTkRFUl9FR0xfREVGSU5FX1RZUEUocmV0dXJuX3R5cGUsIGZ1bmN0aW9uX25hbWUsIHNpZ25hdHVyZSkgXAorICAgIHR5cGVkZWYgcmV0dXJuX3R5cGUgKEVHTEFQSUVOVFJZICpmdW5jdGlvbl9uYW1lICMjIF90KSBzaWduYXR1cmU7CisKKyNkZWZpbmUgUkVOREVSX0VHTF9ERUNMQVJFX01FTUJFUihyZXR1cm5fdHlwZSwgZnVuY3Rpb25fbmFtZSwgc2lnbmF0dXJlKSBcCisgICAgZnVuY3Rpb25fbmFtZSAjIyBfdCBmdW5jdGlvbl9uYW1lOworCisvLyBEZWZpbmUgZnVuY3Rpb24gdHlwZWRlZnMuCitMSVNUX1JFTkRFUl9FR0xfRlVOQ1RJT05TKFJFTkRFUl9FR0xfREVGSU5FX1RZUEUpCitMSVNUX1JFTkRFUl9FR0xfRVhURU5TSU9OU19GVU5DVElPTlMoUkVOREVSX0VHTF9ERUZJTkVfVFlQRSkKKworLy8gRGVmaW5lIEVHTERpc3BhdGNoIHN0cnVjdHVyZS4KK3N0cnVjdCBFR0xEaXNwYXRjaCB7CisgICAgTElTVF9SRU5ERVJfRUdMX0ZVTkNUSU9OUyhSRU5ERVJfRUdMX0RFQ0xBUkVfTUVNQkVSKQorICAgIExJU1RfUkVOREVSX0VHTF9FWFRFTlNJT05TX0ZVTkNUSU9OUyhSRU5ERVJfRUdMX0RFQ0xBUkVfTUVNQkVSKQorfTsKKworLy8gSW5pdGlhbGl6ZSBFR0xEaXNwYXRjaCBmdW5jdGlvbi4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KK2Jvb2wgaW5pdF9lZ2xfZGlzcGF0Y2goKTsKKworLy8gR2xvYmFsIEVHTERpc3BhdGNoIGluc3RhbmNlLiBDYWxsIGluaXRfZWdsX2Rpc3BhdGNoKCkgYmVmb3JlIHVzaW5nIGl0LgorZXh0ZXJuIEVHTERpc3BhdGNoIHNfZWdsOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MURpc3BhdGNoLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvR0xFU3YxRGlzcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmNiN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MURpc3BhdGNoLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiS0hSL2tocnBsYXRmb3JtLmgiCisKKyNpbmNsdWRlICJHTEVTMTJUcmFuc2xhdG9yL3VuZGVybHlpbmdfYXBpcy5oIgorCisvLyBEZWZpbmUgZnVuY3Rpb24gcG9pbnRlciB0eXBlcy4KKyNkZWZpbmUgR0xFUzFfRElTUEFUQ0hfREVGSU5FX1RZUEUocmV0dXJuX3R5cGUsZnVuY19uYW1lLHNpZ25hdHVyZSxjYWxsYXJncykgXAorICAgIHR5cGVkZWYgcmV0dXJuX3R5cGUgKEtIUk9OT1NfQVBJRU5UUlkgKiBmdW5jX25hbWUgIyMgX3QpIHNpZ25hdHVyZTsKKworTElTVF9HTEVTMV9GVU5DVElPTlMoR0xFUzFfRElTUEFUQ0hfREVGSU5FX1RZUEUsR0xFUzFfRElTUEFUQ0hfREVGSU5FX1RZUEUpCisgICAgTElTVF9HTEVTMTJfVFJfRlVOQ1RJT05TKEdMRVMxX0RJU1BBVENIX0RFRklORV9UWVBFKQorCitzdHJ1Y3QgR0xFU3YxRGlzcGF0Y2ggeworI2RlZmluZSBHTEVTMV9ESVNQQVRDSF9ERUNMQVJFX1BPSU5URVIocmV0dXJuX3R5cGUsZnVuY19uYW1lLHNpZ25hdHVyZSxjYWxsYXJncykgXAorICAgICAgICBmdW5jX25hbWUgIyMgX3QgZnVuY19uYW1lOworICAgIExJU1RfR0xFUzFfRlVOQ1RJT05TKEdMRVMxX0RJU1BBVENIX0RFQ0xBUkVfUE9JTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTEVTMV9ESVNQQVRDSF9ERUNMQVJFX1BPSU5URVIpCisgICAgTElTVF9HTEVTMTJfVFJfRlVOQ1RJT05TKEdMRVMxX0RJU1BBVENIX0RFQ0xBUkVfUE9JTlRFUikKKyAgICBVbmRlcmx5aW5nQXBpcyogdW5kZXJseWluZ19nbGVzMl9hcGk7Cit9OworCisjdW5kZWYgR0xFUzFfRElTUEFUQ0hfREVDTEFSRV9QT0lOVEVSCisjdW5kZWYgR0xFUzFfRElTUEFUQ0hfREVGSU5FX1RZUEUKKworYm9vbCBnbGVzMV9kaXNwYXRjaF9pbml0KEdMRVN2MURpc3BhdGNoKiBkaXNwYXRjaF90YWJsZSk7CisKKy8vIFVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4KK3ZvaWQqIGdsZXMxX2Rpc3BhdGNoX2dldF9wcm9jX2Z1bmMoY29uc3QgY2hhciogbmFtZSwgdm9pZCogdXNlckRhdGEpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvR0xFU3YyRGlzcGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFlN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiS0hSL2tocnBsYXRmb3JtLmgiCisKKy8vIERlZmluZSBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLgorI2RlZmluZSBHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRShyZXR1cm5fdHlwZSxmdW5jX25hbWUsc2lnbmF0dXJlLGNhbGxhcmdzKSBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoS0hST05PU19BUElFTlRSWSAqIGZ1bmNfbmFtZSAjIyBfdCkgc2lnbmF0dXJlOworCitMSVNUX0dMRVMyX0ZVTkNUSU9OUyhHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRSxHTEVTMl9ESVNQQVRDSF9ERUZJTkVfVFlQRSkKKworc3RydWN0IEdMRVN2MkRpc3BhdGNoIHsKKyNkZWZpbmUgR0xFUzJfRElTUEFUQ0hfREVDTEFSRV9QT0lOVEVSKHJldHVybl90eXBlLGZ1bmNfbmFtZSxzaWduYXR1cmUsY2FsbGFyZ3MpIFwKKyAgICAgICAgZnVuY19uYW1lICMjIF90IGZ1bmNfbmFtZTsKKyAgICBMSVNUX0dMRVMyX0ZVTkNUSU9OUyhHTEVTMl9ESVNQQVRDSF9ERUNMQVJFX1BPSU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xFUzJfRElTUEFUQ0hfREVDTEFSRV9QT0lOVEVSKQorfTsKKworI3VuZGVmIEdMRVMyX0RJU1BBVENIX0RFQ0xBUkVfUE9JTlRFUgorI3VuZGVmIEdMRVMyX0RJU1BBVENIX0RFRklORV9UWVBFCisKK2Jvb2wgZ2xlczJfZGlzcGF0Y2hfaW5pdChHTEVTdjJEaXNwYXRjaCogZGlzcGF0Y2hfdGFibGUpOworCisvLyBVc2VkIHRvIGluaXRpYWxpemUgdGhlIGRlY29kZXIuCit2b2lkKiBnbGVzMl9kaXNwYXRjaF9nZXRfcHJvY19mdW5jKGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIHVzZXJEYXRhKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9SZW5kZXJFR0xfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9SZW5kZXJFR0xfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDcyOTBlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL1JlbmRlckVHTF9leHRlbnNpb25zX2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY3Rpb25zIGFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9yZW5kZXJfZWdsX2V4dGVuc2lvbnMuZW50cmllcyAtLW91dHB1dD1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvUmVuZGVyRUdMX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIFJFTkRFUl9FR0xfRVhURU5TSU9OU19GVU5DVElPTlNfSAorI2RlZmluZSBSRU5ERVJfRUdMX0VYVEVOU0lPTlNfRlVOQ1RJT05TX0gKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNkZWZpbmUgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2RlZmluZSBMSVNUX1JFTkRFUl9FR0xfRVhURU5TSU9OU19GVU5DVElPTlMoWCkgXAorICBYKEVHTEltYWdlS0hSLCBlZ2xDcmVhdGVJbWFnZUtIUiwgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50KiBhdHRyaWJfbGlzdCkpIFwKKyAgWChFR0xCb29sZWFuLCBlZ2xEZXN0cm95SW1hZ2VLSFIsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTEltYWdlS0hSIGltYWdlKSkgXAorICBYKEVHTFN5bmNLSFIsIGVnbENyZWF0ZVN5bmNLSFIsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50KiBhdHRyaWJzKSkgXAorICBYKEVHTGludCwgZWdsQ2xpZW50V2FpdFN5bmNLSFIsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN5bmNLSFIgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lS0hSIHRpbWVvdXQpKSBcCisgIFgoRUdMQm9vbGVhbiwgZWdsRGVzdHJveVN5bmNLSFIsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN5bmNLSFIgc3luYykpIFwKKworCisjZW5kaWYgIC8vIFJFTkRFUl9FR0xfRVhURU5TSU9OU19GVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL1JlbmRlckVHTF9mdW5jdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9SZW5kZXJFR0xfZnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MTMxNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9SZW5kZXJFR0xfZnVuY3Rpb25zLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQXV0by1nZW5lcmF0ZWQgd2l0aDogYW5kcm9pZC9zY3JpcHRzL2dlbi1lbnRyaWVzLnB5IC0tbW9kZT1mdW5jdGlvbnMgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL3JlbmRlcl9lZ2wuZW50cmllcyAtLW91dHB1dD1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvUmVuZGVyRUdMX2Z1bmN0aW9ucy5oCisvLyBETyBOT1QgRURJVCBUSElTIEZJTEUKKworI2lmbmRlZiBSRU5ERVJfRUdMX0ZVTkNUSU9OU19ICisjZGVmaW5lIFJFTkRFUl9FR0xfRlVOQ1RJT05TX0gKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNkZWZpbmUgTElTVF9SRU5ERVJfRUdMX0ZVTkNUSU9OUyhYKSBcCisgIFgoRUdMaW50LCBlZ2xHZXRFcnJvciwgKCkpIFwKKyAgWChFR0xEaXNwbGF5LCBlZ2xHZXREaXNwbGF5LCAoRUdMTmF0aXZlRGlzcGxheVR5cGUgZHB5KSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbFRlcm1pbmF0ZSwgKEVHTERpc3BsYXkgZHB5KSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbEluaXRpYWxpemUsIChFR0xEaXNwbGF5IGRweSwgRUdMaW50KiBtYWpvciwgRUdMaW50KiBtaW5vcikpIFwKKyAgWChjaGFyKiwgZWdsUXVlcnlTdHJpbmcsIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGlkKSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ3MsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyogY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQqIG51bV9jb25maWcpKSBcCisgIFgoRUdMQm9vbGVhbiwgZWdsQ2hvb3NlQ29uZmlnLCAoRUdMRGlzcGxheSBkaXNwbGF5LCBjb25zdCBFR0xpbnQqIGF0dHJpYnMsIEVHTENvbmZpZyogY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQqIG51bV9jb25maWcpKSBcCisgIFgoRUdMQm9vbGVhbiwgZWdsR2V0Q29uZmlnQXR0cmliLCAoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQqIHZhbHVlKSkgXAorICBYKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIEVHTE5hdGl2ZVdpbmRvd1R5cGUgbmF0aXZlX3dpbmRvdywgY29uc3QgRUdMaW50KiBhdHRyaWJfbGlzdCkpIFwKKyAgWChFR0xTdXJmYWNlLCBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSwgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50KiBhdHRyaWJfbGlzdCkpIFwKKyAgWChFR0xCb29sZWFuLCBlZ2xEZXN0cm95U3VyZmFjZSwgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbEJpbmRBUEksIChFR0xlbnVtIGFwaSkpIFwKKyAgWChFR0xlbnVtLCBlZ2xRdWVyeUFQSSwgKCkpIFwKKyAgWChFR0xCb29sZWFuLCBlZ2xSZWxlYXNlVGhyZWFkLCAoKSkgXAorICBYKEVHTENvbnRleHQsIGVnbENyZWF0ZUNvbnRleHQsIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgc2hhcmVfY29udGV4dCwgY29uc3QgRUdMaW50KiBhdHRyaWJfbGlzdCkpIFwKKyAgWChFR0xCb29sZWFuLCBlZ2xEZXN0cm95Q29udGV4dCwgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbE1ha2VDdXJyZW50LCAoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjb250ZXh0KSkgXAorICBYKEVHTENvbnRleHQsIGVnbEdldEN1cnJlbnRDb250ZXh0LCAoKSkgXAorICBYKEVHTFN1cmZhY2UsIGVnbEdldEN1cnJlbnRTdXJmYWNlLCAoRUdMaW50IHJlYWRkcmF3KSkgXAorICBYKEVHTEJvb2xlYW4sIGVnbFN3YXBCdWZmZXJzLCAoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIHN1cmZhY2UpKSBcCisgIFgodm9pZCosIGVnbEdldFByb2NBZGRyZXNzLCAoY29uc3QgY2hhciogZnVuY3Rpb25fbmFtZSkpIFwKKworCisjZW5kaWYgIC8vIFJFTkRFUl9FR0xfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RmMTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZGVmcy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNwcmFnbWEgb25jZQorCit0eXBlZGVmIGRvdWJsZSAgICAgIEdMY2xhbXBkOyAgIC8qIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQgaW4gWzAsMV0gKi8KK3R5cGVkZWYgZG91YmxlICAgICAgR0xkb3VibGU7ICAgLyogZG91YmxlIHByZWNpc2lvbiBmbG9hdCAqLwordHlwZWRlZiB2b2lkKiAgICAgICBHTGVnbEltYWdlT0VTOworCisjZGVmaW5lIEdMX1MgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBHTF9UICAgICAgICAgICAgICAgICAgICAweDIwMDEKKyNkZWZpbmUgR0xfUiAgICAgICAgICAgICAgICAgICAgMHgyMDAyCisjZGVmaW5lIEdMX1EgICAgICAgICAgICAgICAgICAgIDB4MjAwMworI2RlZmluZSBHTF9URVhUVVJFX0dFTl9TICAgICAgICAgICAgMHgwQzYwCisjZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1QgICAgICAgICAgICAweDBDNjEKKyNkZWZpbmUgR0xfVEVYVFVSRV9HRU5fUiAgICAgICAgICAgIDB4MEM2MgorI2RlZmluZSBHTF9DTElFTlRfVkVSVEVYX0FSUkFZX0JJVCAgICAweDAwMDAwMDAyCisjZGVmaW5lIEdMX1RSQU5TRk9STV9CSVQgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEdMX0lOVCAgICAgICAgICAgICAgICAweDE0MDQKKyNkZWZpbmUgR0xfSEFMRl9GTE9BVF9OViAgICAgIDB4MTQwQgorI2RlZmluZSBHTF9IQUxGX0ZMT0FUICAgICAgICAgMHgxNDBCCisjZGVmaW5lIEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUgMHg4NjQyCisjZGVmaW5lIEdMX1BPSU5UX1NQUklURSAgICAgICAweDg4NjEKKyNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfRVhUICAgICAgICAgICAgICAgIDB4OEQ0MAorI2RlZmluZSBHTF9URVhUVVJFX1dJRFRICQkJMHgxMDAwCisjZGVmaW5lIEdMX1RFWFRVUkVfSEVJR0hUCQkJMHgxMDAxCisjZGVmaW5lIEdMX1RFWFRVUkVfUkVEX1NJWkUJCQkweDgwNUMKKyNkZWZpbmUgR0xfVEVYVFVSRV9HUkVFTl9TSVpFCQkJMHg4MDVECisjZGVmaW5lIEdMX1RFWFRVUkVfQkxVRV9TSVpFCQkJMHg4MDVFCisjZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfU0laRQkJCTB4ODA1RgorI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1NJWkUgICAgICAgICAgICAgMHg4ODRBCisjZGVmaW5lIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUCQkweDEwMDMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0ci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhODM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0ci5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyLmVudHJpZXMgLS1vdXRwdXQ9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIEdMRVMxMl9UUl9GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTMTJfVFJfRlVOQ1RJT05TX0gKKwordHlwZWRlZiB2b2lkKiB2b2lkcHRyOworI2RlZmluZSBMSVNUX0dMRVMxMl9UUl9GVU5DVElPTlMoWCkgXAorICBYKHZvaWRwdHIsIGNyZWF0ZV9nbGVzMV9jb250ZXh0LCAodm9pZCogc2hhcmUsIGNvbnN0IHZvaWQqIHVuZGVybHlpbmdfYXBpcyksIChzaGFyZSwgdW5kZXJseWluZ19hcGlzKSkgXAorICBYKHZvaWRwdHIsIGdldF9jdXJyZW50X2dsZXNfY29udGV4dCwgKCksICgpKSBcCisgIFgodm9pZCwgc2V0X2N1cnJlbnRfZ2xlc19jb250ZXh0LCAodm9pZCogY3R4KSwgKGN0eCkpIFwKKyAgWCh2b2lkcHRyLCBjcmVhdGVfdW5kZXJseWluZ19hcGksICgpLCAoKSkgXAorICBYKHZvaWQsIG1ha2VfY3VycmVudF9zZXR1cCwgKHVpbnQzMl90IHN1cmZfd2lkdGgsIHVpbnQzMl90IHN1cmZfaGVpZ2h0KSwgKHN1cmZfd2lkdGgsIHN1cmZfaGVpZ2h0KSkgXAorICBYKHZvaWQsIGRlc3Ryb3lfZ2xlczFfY29udGV4dCwgKHZvaWQqIGN0eCksIChjdHgpKSBcCisKKworI2VuZGlmICAvLyBHTEVTMTJfVFJfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0cl9pbnRlcm5hbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlZjg4MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0cl9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzMxIEBACisvLyBBdXRvLWdlbmVyYXRlZCB3aXRoOiBhbmRyb2lkL3NjcmlwdHMvZ2VuLWVudHJpZXMucHkgLS1tb2RlPWZ1bmNhcmdzIGFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0cl9pbnRlcm5hbC5lbnRyaWVzIC0tb3V0cHV0PWFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0cl9pbnRlcm5hbC5oCisvLyBETyBOT1QgRURJVCBUSElTIEZJTEUKKworI2lmbmRlZiBHTEVTMTJUUl9JTlRFUk5BTF9GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTMTJUUl9JTlRFUk5BTF9GVU5DVElPTlNfSAorCit0eXBlZGVmIEdMdm9pZCogR0x2b2lkcHRyOwordHlwZWRlZiBjb25zdCBHTHVieXRlKiBjb25zdEdMdWJ5dGU7CisjZGVmaW5lIExJU1RfR0xFUzEyVFJfSU5URVJOQUxfRlVOQ1RJT05TKFgpIFwKKyAgWCh2b2lkLCBnbEFjdGl2ZVRleHR1cmUsIChHTGVudW0gdGV4dHVyZSksICh0ZXh0dXJlKSkgXAorICBYKHZvaWQsIGdsQWxwaGFGdW5jLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiksIChmdW5jLCByZWYpKSBcCisgIFgodm9pZCwgZ2xBbHBoYUZ1bmN4LCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiksIChmdW5jLCByZWYpKSBcCisgIFgodm9pZCwgZ2xBbHBoYUZ1bmN4T0VTLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiksIChmdW5jLCByZWYpKSBcCisgIFgodm9pZCwgZ2xBdHRhY2hTaGFkZXIsIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlciksIChwcm9ncmFtLCBzaGFkZXIpKSBcCisgIFgodm9pZCwgZ2xCaW5kQXR0cmliTG9jYXRpb24sIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgaW5kZXgsIG5hbWUpKSBcCisgIFgodm9pZCwgZ2xCaW5kQnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciksICh0YXJnZXQsIGJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEJpbmRGcmFtZWJ1ZmZlciwgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlciksICh0YXJnZXQsIGZyYW1lYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsQmluZEZyYW1lYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwgKHRhcmdldCwgZnJhbWVidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xCaW5kUmVuZGVyYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciksICh0YXJnZXQsIHJlbmRlcmJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEJpbmRSZW5kZXJidWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgcmVuZGVyYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsQmluZFRleHR1cmUsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSksICh0YXJnZXQsIHRleHR1cmUpKSBcCisgIFgodm9pZCwgZ2xCbGVuZENvbG9yLCAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkpIFwKKyAgWCh2b2lkLCBnbEJsZW5kRXF1YXRpb24sIChHTGVudW0gbW9kZSksIChtb2RlKSkgXAorICBYKHZvaWQsIGdsQmxlbmRFcXVhdGlvbk9FUywgKEdMZW51bSBtb2RlKSwgKG1vZGUpKSBcCisgIFgodm9pZCwgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUsIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSksIChtb2RlUkdCLCBtb2RlQWxwaGEpKSBcCisgIFgodm9pZCwgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMsIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSksIChtb2RlUkdCLCBtb2RlQWxwaGEpKSBcCisgIFgodm9pZCwgZ2xCbGVuZEZ1bmMsIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpLCAoc2ZhY3RvciwgZGZhY3RvcikpIFwKKyAgWCh2b2lkLCBnbEJsZW5kRnVuY1NlcGFyYXRlLCAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpLCAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSkpIFwKKyAgWCh2b2lkLCBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTLCAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpLCAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSkpIFwKKyAgWCh2b2lkLCBnbEJ1ZmZlckRhdGEsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSwgKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpKSBcCisgIFgodm9pZCwgZ2xCdWZmZXJTdWJEYXRhLCAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSksICh0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSkpIFwKKyAgWChHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cywgKEdMZW51bSB0YXJnZXQpLCAodGFyZ2V0KSkgXAorICBYKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpKSBcCisgIFgodm9pZCwgZ2xDbGVhciwgKEdMYml0ZmllbGQgbWFzayksIChtYXNrKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJDb2xvciwgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJDb2xvcngsIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkpIFwKKyAgWCh2b2lkLCBnbENsZWFyQ29sb3J4T0VTLCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKSBcCisgIFgodm9pZCwgZ2xDbGVhckRlcHRoZiwgKEdMZmxvYXQgZGVwdGgpLCAoZGVwdGgpKSBcCisgIFgodm9pZCwgZ2xDbGVhckRlcHRoZk9FUywgKEdMY2xhbXBmIGRlcHRoKSwgKGRlcHRoKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJEZXB0aHgsIChHTGNsYW1weCBkZXB0aCksIChkZXB0aCkpIFwKKyAgWCh2b2lkLCBnbENsZWFyRGVwdGh4T0VTLCAoR0xjbGFtcHggZGVwdGgpLCAoZGVwdGgpKSBcCisgIFgodm9pZCwgZ2xDbGVhclN0ZW5jaWwsIChHTGludCBzKSwgKHMpKSBcCisgIFgodm9pZCwgZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCAoR0xlbnVtIHRleHR1cmUpLCAodGV4dHVyZSkpIFwKKyAgWCh2b2lkLCBnbENsaXBQbGFuZWYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIGVxdWF0aW9uKSwgKHBuYW1lLCBlcXVhdGlvbikpIFwKKyAgWCh2b2lkLCBnbENsaXBQbGFuZWZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIGVxdWF0aW9uKSwgKHBuYW1lLCBlcXVhdGlvbikpIFwKKyAgWCh2b2lkLCBnbENsaXBQbGFuZXgsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIGVxdWF0aW9uKSwgKHBuYW1lLCBlcXVhdGlvbikpIFwKKyAgWCh2b2lkLCBnbENsaXBQbGFuZXhPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIGVxdWF0aW9uKSwgKHBuYW1lLCBlcXVhdGlvbikpIFwKKyAgWCh2b2lkLCBnbENvbG9yNGYsIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ29sb3I0ZnYsIChjb25zdCBHTGZsb2F0KiBjb21wb25lbnRzKSwgKGNvbXBvbmVudHMpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjR1YiwgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjR1YnYsIChjb25zdCBHTHVieXRlKiBjb21wb25lbnRzKSwgKGNvbXBvbmVudHMpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjR4LCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkpIFwKKyAgWCh2b2lkLCBnbENvbG9yNHhPRVMsIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ29sb3JNYXNrLCAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ29sb3JQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSkgXAorICBYKHZvaWQsIGdsQ29sb3JQb2ludGVyQm91bmRzLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjb3VudCkpIFwKKyAgWCh2b2lkLCBnbENvbXBpbGVTaGFkZXIsIChHTHVpbnQgc2hhZGVyKSwgKHNoYWRlcikpIFwKKyAgWCh2b2lkLCBnbENvbXByZXNzZWRUZXhJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZV9zaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2Vfc2l6ZSwgZGF0YSkpIFwKKyAgWCh2b2lkLCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlX3NpemUsIGNvbnN0IEdMdm9pZCogZGF0YSksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlX3NpemUsIGRhdGEpKSBcCisgIFgodm9pZCwgZ2xDb3B5VGV4SW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcikpIFwKKyAgWCh2b2lkLCBnbENvcHlUZXhTdWJJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpKSBcCisgIFgoR0x1aW50LCBnbENyZWF0ZVByb2dyYW0sICgpLCAoKSkgXAorICBYKEdMdWludCwgZ2xDcmVhdGVTaGFkZXIsIChHTGVudW0gdHlwZSksICh0eXBlKSkgXAorICBYKHZvaWQsIGdsQ3VsbEZhY2UsIChHTGVudW0gbW9kZSksIChtb2RlKSkgXAorICBYKHZvaWQsIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMsIChHTHVpbnQgaW5kZXgpLCAoaW5kZXgpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVCdWZmZXJzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpLCAobiwgYnVmZmVycykpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZUZyYW1lYnVmZmVycywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSkgXAorICBYKHZvaWQsIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyksIChuLCBmcmFtZWJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSkpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyksIChuLCByZW5kZXJidWZmZXJzKSkgXAorICBYKHZvaWQsIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVTaGFkZXIsIChHTHVpbnQgc2hhZGVyKSwgKHNoYWRlcikpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZVRleHR1cmVzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHRleHR1cmVzKSwgKG4sIHRleHR1cmVzKSkgXAorICBYKHZvaWQsIGdsRGVwdGhGdW5jLCAoR0xlbnVtIGZ1bmMpLCAoZnVuYykpIFwKKyAgWCh2b2lkLCBnbERlcHRoTWFzaywgKEdMYm9vbGVhbiBmbGFnKSwgKGZsYWcpKSBcCisgIFgodm9pZCwgZ2xEZXB0aFJhbmdlZiwgKEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksICh6TmVhciwgekZhcikpIFwKKyAgWCh2b2lkLCBnbERlcHRoUmFuZ2VmT0VTLCAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpLCAoek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xEZXB0aFJhbmdleCwgKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKSwgKHpOZWFyLCB6RmFyKSkgXAorICBYKHZvaWQsIGdsRGVwdGhSYW5nZXhPRVMsIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciksICh6TmVhciwgekZhcikpIFwKKyAgWCh2b2lkLCBnbERldGFjaFNoYWRlciwgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSwgKHByb2dyYW0sIHNoYWRlcikpIFwKKyAgWCh2b2lkLCBnbERpc2FibGUsIChHTGVudW0gY2FwKSwgKGNhcCkpIFwKKyAgWCh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBjYXApLCAoY2FwKSkgXAorICBYKHZvaWQsIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCAoR0x1aW50IGluZGV4KSwgKGluZGV4KSkgXAorICBYKHZvaWQsIGdsRHJhd0FycmF5cywgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCksIChtb2RlLCBmaXJzdCwgY291bnQpKSBcCisgIFgodm9pZCwgZ2xEcmF3RWxlbWVudHMsIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcyksIChtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcykpIFwKKyAgWCh2b2lkLCBnbERyYXdUZXhmT0VTLCAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbERyYXdUZXhmdk9FUywgKGNvbnN0IEdMZmxvYXQqIGNvb3JkcyksIChjb29yZHMpKSBcCisgIFgodm9pZCwgZ2xEcmF3VGV4aU9FUywgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbERyYXdUZXhpdk9FUywgKGNvbnN0IEdMaW50KiBjb29yZHMpLCAoY29vcmRzKSkgXAorICBYKHZvaWQsIGdsRHJhd1RleHNPRVMsIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCksICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSkgXAorICBYKHZvaWQsIGdsRHJhd1RleHN2T0VTLCAoY29uc3QgR0xzaG9ydCogY29vcmRzKSwgKGNvb3JkcykpIFwKKyAgWCh2b2lkLCBnbERyYXdUZXh4T0VTLCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbERyYXdUZXh4dk9FUywgKGNvbnN0IEdMZml4ZWQqIGNvb3JkcyksIChjb29yZHMpKSBcCisgIFgodm9pZCwgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGJ1ZmZlciksICh0YXJnZXQsIGJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBidWZmZXIpLCAodGFyZ2V0LCBidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xFbmFibGUsIChHTGVudW0gY2FwKSwgKGNhcCkpIFwKKyAgWCh2b2lkLCBnbEVuYWJsZUNsaWVudFN0YXRlLCAoR0xlbnVtIGNhcCksIChjYXApKSBcCisgIFgodm9pZCwgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwgKEdMdWludCBpbmRleCksIChpbmRleCkpIFwKKyAgWCh2b2lkLCBnbEZpbmlzaCwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xGbHVzaCwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xGb2dmLCAoR0xlbnVtIG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAobmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xGb2dmdiwgKEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpLCAobmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsRm9neCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xGb2d4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbEZvZ3h2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEZvZ3h2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJELCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpKSBcCisgIFgodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSkgXAorICBYKHZvaWQsIGdsRnJvbnRGYWNlLCAoR0xlbnVtIG1vZGUpLCAobW9kZSkpIFwKKyAgWCh2b2lkLCBnbEZydXN0dW1mLCAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSkgXAorICBYKHZvaWQsIGdsRnJ1c3R1bWZPRVMsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xGcnVzdHVteCwgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcikpIFwKKyAgWCh2b2lkLCBnbEZydXN0dW14T0VTLCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSkgXAorICBYKHZvaWQsIGdsR2VuQnVmZmVycywgKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKSwgKG4sIGJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xHZW5GcmFtZWJ1ZmZlcnMsIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSwgKG4sIGZyYW1lYnVmZmVycykpIFwKKyAgWCh2b2lkLCBnbEdlbkZyYW1lYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSkgXAorICBYKHZvaWQsIGdsR2VuUmVuZGVyYnVmZmVycywgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xHZW5SZW5kZXJidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLCAobiwgcmVuZGVyYnVmZmVycykpIFwKKyAgWCh2b2lkLCBnbEdlblRleHR1cmVzLCAoR0xzaXplaSBuLCBHTHVpbnQqIHRleHR1cmVzKSwgKG4sIHRleHR1cmVzKSkgXAorICBYKHZvaWQsIGdsR2VuZXJhdGVNaXBtYXAsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCkpIFwKKyAgWCh2b2lkLCBnbEdlbmVyYXRlTWlwbWFwT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpKSBcCisgIFgodm9pZCwgZ2xHZXRBY3RpdmVBdHRyaWIsIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpKSBcCisgIFgodm9pZCwgZ2xHZXRBY3RpdmVVbmlmb3JtLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKSkgXAorICBYKHZvaWQsIGdsR2V0QXR0YWNoZWRTaGFkZXJzLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpLCAocHJvZ3JhbSwgbWF4Y291bnQsIGNvdW50LCBzaGFkZXJzKSkgXAorICBYKEdMaW50LCBnbEdldEF0dHJpYkxvY2F0aW9uLCAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBuYW1lKSkgXAorICBYKHZvaWQsIGdsR2V0Qm9vbGVhbnYsIChHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiogcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRDbGlwUGxhbmVmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBlcW4pLCAocG5hbWUsIGVxbikpIFwKKyAgWCh2b2lkLCBnbEdldENsaXBQbGFuZWZPRVMsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQqIGVxbiksIChwbmFtZSwgZXFuKSkgXAorICBYKHZvaWQsIGdsR2V0Q2xpcFBsYW5leCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCogZXFuKSwgKHBuYW1lLCBlcW4pKSBcCisgIFgodm9pZCwgZ2xHZXRDbGlwUGxhbmV4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBlcW4pLCAocG5hbWUsIGVxbikpIFwKKyAgWChHTGVudW0sIGdsR2V0RXJyb3IsICgpLCAoKSkgXAorICBYKHZvaWQsIGdsR2V0Rml4ZWR2LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldEZpeGVkdk9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRGbG9hdHYsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRJbnRlZ2VydiwgKEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0TGlnaHRmdiwgKEdMZW51bSBsaWdodGlkLCBHTGVudW0gbmFtZSwgR0xmbG9hdCogcGFyYW1zKSwgKGxpZ2h0aWQsIG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0TGlnaHR4dk9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRNYXRlcmlhbGZ2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpLCAoZmFjZSwgbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0TWF0ZXJpYWx4diwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0TWF0ZXJpYWx4dk9FUywgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0UG9pbnRlcnYsIChHTGVudW0gcG5hbWUsIHZvaWQqKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFByb2dyYW1JbmZvTG9nLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpLCAocHJvZ3JhbSwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKSkgXAorICBYKHZvaWQsIGdsR2V0UHJvZ3JhbWl2LCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChwcm9ncmFtLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0U2hhZGVySW5mb0xvZywgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpLCAoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpKSBcCisgIFgodm9pZCwgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbiksIChzaGFkZXJ0eXBlLCBwcmVjaXNpb250eXBlLCByYW5nZSwgcHJlY2lzaW9uKSkgXAorICBYKHZvaWQsIGdsR2V0U2hhZGVyU291cmNlLCAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKSwgKHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBzb3VyY2UpKSBcCisgIFgodm9pZCwgZ2xHZXRTaGFkZXJpdiwgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChzaGFkZXIsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgoY29uc3RHTHVieXRlLCBnbEdldFN0cmluZywgKEdMZW51bSBuYW1lKSwgKG5hbWUpKSBcCisgIFgodm9pZCwgZ2xHZXRUZXhFbnZmdiwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleEVudml2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleEVudnh2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4RW52eHZPRVMsIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleFBhcmFtZXRlcml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleFBhcmFtZXRlcnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRVbmlmb3JtZnYsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcyksIChwcm9ncmFtLCBsb2NhdGlvbiwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VW5pZm9ybWl2LCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpKSBcCisgIFgoR0xpbnQsIGdsR2V0VW5pZm9ybUxvY2F0aW9uLCAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBuYW1lKSkgXAorICBYKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYsIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcG9pbnRlciksIChpbmRleCwgcG5hbWUsIHBvaW50ZXIpKSBcCisgIFgodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiwgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpLCAoaW5kZXgsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiwgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKGluZGV4LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsSGludCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSwgKHRhcmdldCwgbW9kZSkpIFwKKyAgWChHTGJvb2xlYW4sIGdsSXNCdWZmZXIsIChHTHVpbnQgYnVmZmVyKSwgKGJ1ZmZlcikpIFwKKyAgWChHTGJvb2xlYW4sIGdsSXNFbmFibGVkLCAoR0xlbnVtIGNhcCksIChjYXApKSBcCisgIFgoR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXIsIChHTHVpbnQgZnJhbWVidWZmZXIpLCAoZnJhbWVidWZmZXIpKSBcCisgIFgoR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXJPRVMsIChHTHVpbnQgZnJhbWVidWZmZXIpLCAoZnJhbWVidWZmZXIpKSBcCisgIFgoR0xib29sZWFuLCBnbElzUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pKSBcCisgIFgoR0xib29sZWFuLCBnbElzUmVuZGVyYnVmZmVyLCAoR0x1aW50IHJlbmRlcmJ1ZmZlciksIChyZW5kZXJidWZmZXIpKSBcCisgIFgoR0xib29sZWFuLCBnbElzUmVuZGVyYnVmZmVyT0VTLCAoR0x1aW50IHJlbmRlcmJ1ZmZlciksIChyZW5kZXJidWZmZXIpKSBcCisgIFgoR0xib29sZWFuLCBnbElzU2hhZGVyLCAoR0x1aW50IHNoYWRlciksIChzaGFkZXIpKSBcCisgIFgoR0xib29sZWFuLCBnbElzVGV4dHVyZSwgKEdMdWludCB0ZXh0dXJlKSwgKHRleHR1cmUpKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVsZiwgKEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsTGlnaHRNb2RlbGZ2LCAoR0xlbnVtIG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyksIChuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVseCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVseE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVseHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsTGlnaHRNb2RlbHh2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbExpZ2h0ZiwgKEdMZW51bSBsaWdodGlkLCBHTGVudW0gbmFtZSwgR0xmbG9hdCBwYXJhbSksIChsaWdodGlkLCBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbExpZ2h0ZnYsIChHTGVudW0gbGlnaHRpZCwgR0xlbnVtIG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyksIChsaWdodGlkLCBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xMaWdodHgsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsTGlnaHR4T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAobGlnaHQsIHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsTGlnaHR4dk9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xMaW5lV2lkdGgsIChHTGZsb2F0IHdpZHRoKSwgKHdpZHRoKSkgXAorICBYKHZvaWQsIGdsTGluZVdpZHRoeCwgKEdMZml4ZWQgd2lkdGgpLCAod2lkdGgpKSBcCisgIFgodm9pZCwgZ2xMaW5lV2lkdGh4T0VTLCAoR0xmaXhlZCB3aWR0aCksICh3aWR0aCkpIFwKKyAgWCh2b2lkLCBnbExpbmtQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSkpIFwKKyAgWCh2b2lkLCBnbExvYWRJZGVudGl0eSwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xMb2FkTWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQqIG0pLCAobSkpIFwKKyAgWCh2b2lkLCBnbExvYWRNYXRyaXh4LCAoY29uc3QgR0xmaXhlZCogbSksIChtKSkgXAorICBYKHZvaWQsIGdsTG9hZE1hdHJpeHhPRVMsIChjb25zdCBHTGZpeGVkKiBtKSwgKG0pKSBcCisgIFgodm9pZCwgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMsICgpLCAoKSkgXAorICBYKEdMdm9pZHB0ciwgZ2xNYXBUZXhTdWJJbWFnZTJEQ0hST01JVU0sIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTGVudW0gYWNjZXNzKSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgYWNjZXNzKSkgXAorICBYKHZvaWQsIGdsTWF0ZXJpYWxmLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGZhY2UsIG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsTWF0ZXJpYWxmdiwgKEdMZW51bSBmYWNlLCBHTGVudW0gbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSwgKGZhY2UsIG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbE1hdGVyaWFseCwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsTWF0ZXJpYWx4T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChmYWNlLCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xNYXRlcmlhbHh2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xNYXRlcmlhbHh2T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xNYXRyaXhNb2RlLCAoR0xlbnVtIG1vZGUpLCAobW9kZSkpIFwKKyAgWCh2b2lkLCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUywgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbE1hdHJpeEluZGV4UG9pbnRlck9FU0JvdW5kcywgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgY291bnQpKSBcCisgIFgodm9pZCwgZ2xNdWx0TWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQqIG0pLCAobSkpIFwKKyAgWCh2b2lkLCBnbE11bHRNYXRyaXh4LCAoY29uc3QgR0xmaXhlZCogbSksIChtKSkgXAorICBYKHZvaWQsIGdsTXVsdE1hdHJpeHhPRVMsIChjb25zdCBHTGZpeGVkKiBtKSwgKG0pKSBcCisgIFgodm9pZCwgZ2xOb3JtYWwzZiwgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopLCAobngsIG55LCBueikpIFwKKyAgWCh2b2lkLCBnbE5vcm1hbDNmdiwgKGNvbnN0IEdMZmxvYXQqIGNvb3JkcyksIChjb29yZHMpKSBcCisgIFgodm9pZCwgZ2xOb3JtYWwzc3YsIChjb25zdCBHTHNob3J0KiBjb29yZHMpLCAoY29vcmRzKSkgXAorICBYKHZvaWQsIGdsTm9ybWFsM3gsIChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSwgKG54LCBueSwgbnopKSBcCisgIFgodm9pZCwgZ2xOb3JtYWwzeE9FUywgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopLCAobngsIG55LCBueikpIFwKKyAgWCh2b2lkLCBnbE5vcm1hbFBvaW50ZXIsIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciksICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKSBcCisgIFgodm9pZCwgZ2xOb3JtYWxQb2ludGVyQm91bmRzLCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpLCAodHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjb3VudCkpIFwKKyAgWCh2b2lkLCBnbE9ydGhvZiwgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpfbmVhciwgR0xmbG9hdCB6X2ZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpfbmVhciwgel9mYXIpKSBcCisgIFgodm9pZCwgZ2xPcnRob2ZPRVMsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xPcnRob3gsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xPcnRob3hPRVMsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xQaXhlbFN0b3JlaSwgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbFBvaW50UGFyYW1ldGVyZnYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJ4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnh2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsUG9pbnRTaXplLCAoR0xmbG9hdCBzaXplKSwgKHNpemUpKSBcCisgIFgodm9pZCwgZ2xQb2ludFNpemV4LCAoR0xmaXhlZCBzaXplKSwgKHNpemUpKSBcCisgIFgodm9pZCwgZ2xQb2ludFNpemV4T0VTLCAoR0xmaXhlZCBzaXplKSwgKHNpemUpKSBcCisgIFgodm9pZCwgZ2xQb2ludFNpemVQb2ludGVyT0VTLCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpLCAodHlwZSwgc3RyaWRlLCBwb2ludGVyKSkgXAorICBYKHZvaWQsIGdsUG9pbnRTaXplUG9pbnRlciwgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSwgKHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbFBvaW50U2l6ZVBvaW50ZXJPRVNCb3VuZHMsIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCksICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIGNvdW50KSkgXAorICBYKHZvaWQsIGdsUG9seWdvbk9mZnNldCwgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpKSBcCisgIFgodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0eCwgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpKSBcCisgIFgodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0eE9FUywgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpKSBcCisgIFgodm9pZCwgZ2xQb3BNYXRyaXgsICgpLCAoKSkgXAorICBYKHZvaWQsIGdsUHVzaE1hdHJpeCwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xSZWFkUGl4ZWxzLCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQqIHBpeGVscyksICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscykpIFwKKyAgWCh2b2lkLCBnbFJlbGVhc2VTaGFkZXJDb21waWxlciwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSkgXAorICBYKHZvaWQsIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbFJvdGF0ZWYsIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKGFuZ2xlLCB4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsUm90YXRleCwgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoYW5nbGUsIHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xSb3RhdGV4T0VTLCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksIChhbmdsZSwgeCwgeSwgeikpIFwKKyAgWCh2b2lkLCBnbFNhbXBsZUNvdmVyYWdlLCAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpLCAodmFsdWUsIGludmVydCkpIFwKKyAgWCh2b2lkLCBnbFNhbXBsZUNvdmVyYWdleCwgKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSwgKHZhbHVlLCBpbnZlcnQpKSBcCisgIFgodm9pZCwgZ2xTYW1wbGVDb3ZlcmFnZXhPRVMsIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCksICh2YWx1ZSwgaW52ZXJ0KSkgXAorICBYKHZvaWQsIGdsU2NhbGVmLCAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksICh4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsU2NhbGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsU2NhbGV4T0VTLCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsU2Npc3NvciwgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHgsIHksIHdpZHRoLCBoZWlnaHQpKSBcCisgIFgodm9pZCwgZ2xTaGFkZU1vZGVsLCAoR0xlbnVtIG1vZGUpLCAobW9kZSkpIFwKKyAgWCh2b2lkLCBnbFNoYWRlclNvdXJjZSwgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogY29uc3QqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCksIChzaGFkZXIsIGNvdW50LCBzdHJpbmcsIGxlbmd0aCkpIFwKKyAgWCh2b2lkLCBnbFN0ZW5jaWxGdW5jLCAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spLCAoZnVuYywgcmVmLCBtYXNrKSkgXAorICBYKHZvaWQsIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSwgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayksIChmYWNlLCBmdW5jLCByZWYsIG1hc2spKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsTWFzaywgKEdMdWludCBtYXNrKSwgKG1hc2spKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsTWFza1NlcGFyYXRlLCAoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKSwgKGZhY2UsIG1hc2spKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsT3AsIChHTGVudW0gc2ZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSwgKHNmYWlsLCB6ZmFpbCwgenBhc3MpKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsT3BTZXBhcmF0ZSwgKEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSwgKGZhY2UsIHNmYWlsLCB6ZmFpbCwgenBhc3MpKSBcCisgIFgodm9pZCwgZ2xUZXhDb29yZFBvaW50ZXIsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKSBcCisgIFgodm9pZCwgZ2xUZXhDb29yZFBvaW50ZXJCb3VuZHMsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIGNvdW50KSkgXAorICBYKHZvaWQsIGdsVGV4RW52ZiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbFRleEVudmZ2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsVGV4RW52aSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xUZXhFbnZpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xUZXhFbnZ4LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4RW52eE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbFRleEVudnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsVGV4RW52eHZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xUZXhHZW5pT0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xUZXhHZW5pdk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsVGV4R2VueE9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xUZXhHZW54dk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xUZXhJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4UGFyYW1ldGVyZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJpLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbFRleFBhcmFtZXRlcml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbFRleFBhcmFtZXRlcngsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJ4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4UGFyYW1ldGVyeHYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJ4dk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbFRleFN1YkltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscykpIFwKKyAgWCh2b2lkLCBnbFRyYW5zbGF0ZWYsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xUcmFuc2xhdGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsVHJhbnNsYXRleE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0xZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpLCAobG9jYXRpb24sIHgpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtMWZ2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTFpLCAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpLCAobG9jYXRpb24sIHgpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtMWl2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0yZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSksIChsb2NhdGlvbiwgeCwgeSkpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0yZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtMmksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSksIChsb2NhdGlvbiwgeCwgeSkpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0yaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTNmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAobG9jYXRpb24sIHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtM2Z2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTNpLCAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopLCAobG9jYXRpb24sIHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtM2l2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm00ZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpLCAobG9jYXRpb24sIHgsIHksIHosIHcpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtNGZ2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTRpLCAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpLCAobG9jYXRpb24sIHgsIHksIHosIHcpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtNGl2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm1NYXRyaXgyZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpLCAobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybU1hdHJpeDNmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSksIChsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtTWF0cml4NGZ2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSwgKGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSkpIFwKKyAgWCh2b2lkLCBnbFVubWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCAoY29uc3QgR0x2b2lkKiBtZW0pLCAobWVtKSkgXAorICBYKHZvaWQsIGdsVXNlUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pKSBcCisgIFgodm9pZCwgZ2xWYWxpZGF0ZVByb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliMWYsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4KSwgKGluZHgsIHgpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIxZnYsIChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSwgKGluZHgsIHZhbHVlcykpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjJmLCAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSwgKGluZHgsIHgsIHkpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIyZnYsIChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSwgKGluZHgsIHZhbHVlcykpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjNmLCAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoaW5keCwgeCwgeSwgeikpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjNmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliNGYsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSwgKGluZHgsIHgsIHksIHosIHcpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhBdHRyaWI0ZnYsIChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSwgKGluZHgsIHZhbHVlcykpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYlBvaW50ZXIsIChHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSwgKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbFZlcnRleFBvaW50ZXIsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjb3VudCkpIFwKKyAgWCh2b2lkLCBnbFZpZXdwb3J0LCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAoeCwgeSwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbFdlaWdodFBvaW50ZXJPRVMsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKSBcCisgIFgodm9pZCwgZ2xXZWlnaHRQb2ludGVyT0VTQm91bmRzLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjb3VudCkpIFwKKworCisjZW5kaWYgIC8vIEdMRVMxMlRSX0lOVEVSTkFMX0ZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9leHRlbnNpb25zX2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDkyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaApAQCAtMCwwICsxLDIwIEBACisvLyBBdXRvLWdlbmVyYXRlZCB3aXRoOiBhbmRyb2lkL3NjcmlwdHMvZ2VuLWVudHJpZXMucHkgLS1tb2RlPWZ1bmNhcmdzIGFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9leHRlbnNpb25zLmVudHJpZXMgLS1vdXRwdXQ9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIEdMRVMxX0VYVEVOU0lPTlNfRlVOQ1RJT05TX0gKKyNkZWZpbmUgR0xFUzFfRVhURU5TSU9OU19GVU5DVElPTlNfSAorCisjZGVmaW5lIExJU1RfR0xFUzFfRVhURU5TSU9OU19GVU5DVElPTlMoWCkgXAorICBYKHZvaWQsIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhBUkIsIChHTGludCBpbmRleCksIChpbmRleCkpIFwKKyAgWCh2b2lkLCBnbE1hdHJpeEluZGV4dWl2QVJCLCAoR0xpbnQgc2l6ZSwgR0x1aW50ICogaW5kaWNlcyksIChzaXplLCBpbmRpY2VzKSkgXAorICBYKHZvaWQsIGdsTWF0cml4SW5kZXhQb2ludGVyQVJCLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSkgXAorICBYKHZvaWQsIGdsV2VpZ2h0UG9pbnRlckFSQiwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbFRleEdlbmYsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4R2VuaSwgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4R2VuZnYsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqIHBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbFRleEdlbml2LCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICogcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4R2VuZnYsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqIHBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleEdlbml2LCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSkgXAorCisKKyNlbmRpZiAgLy8gR0xFUzFfRVhURU5TSU9OU19GVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxX29ubHlfZnVuY3Rpb25zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfb25seV9mdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjU0ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMxX29ubHlfZnVuY3Rpb25zLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQXV0by1nZW5lcmF0ZWQgd2l0aDogYW5kcm9pZC9zY3JpcHRzL2dlbi1lbnRyaWVzLnB5IC0tbW9kZT1mdW5jYXJncyBhbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfb25seS5lbnRyaWVzIC0tb3V0cHV0PWFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9vbmx5X2Z1bmN0aW9ucy5oCisvLyBETyBOT1QgRURJVCBUSElTIEZJTEUKKworI2lmbmRlZiBHTEVTMV9PTkxZX0ZVTkNUSU9OU19ICisjZGVmaW5lIEdMRVMxX09OTFlfRlVOQ1RJT05TX0gKKworI2RlZmluZSBMSVNUX0dMRVMxX09OTFlfRlVOQ1RJT05TKFgpIFwKKyAgWCh2b2lkLCBnbEFscGhhRnVuYywgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpLCAoZnVuYywgcmVmKSkgXAorICBYKHZvaWQsIGdsQmVnaW4sIChHTGVudW0gbW9kZSksIChtb2RlKSkgXAorICBYKHZvaWQsIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgKEdMZW51bSB0ZXh0dXJlKSwgKHRleHR1cmUpKSBcCisgIFgodm9pZCwgZ2xDbGlwUGxhbmUsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZG91YmxlICogZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSkgXAorICBYKHZvaWQsIGdsQ29sb3I0ZCwgKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUsIEdMZG91YmxlIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ29sb3I0ZiwgKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjRmdiwgKGNvbnN0IEdMZmxvYXQgKiB2KSwgKHYpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjR1YiwgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKSBcCisgIFgodm9pZCwgZ2xDb2xvcjR1YnYsIChjb25zdCBHTHVieXRlICogdiksICh2KSkgXAorICBYKHZvaWQsIGdsQ29sb3JQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKiBwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBhcnJheSksIChhcnJheSkpIFwKKyAgWCh2b2lkLCBnbEVuYWJsZUNsaWVudFN0YXRlLCAoR0xlbnVtIGFycmF5KSwgKGFycmF5KSkgXAorICBYKHZvaWQsIGdsRW5kLCAoKSwgKCkpIFwKKyAgWCh2b2lkLCBnbEZvZ2YsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsRm9nZnYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEZydXN0dW0sIChHTGRvdWJsZSBsZWZ0LCBHTGRvdWJsZSByaWdodCwgR0xkb3VibGUgYm90dG9tLCBHTGRvdWJsZSB0b3AsIEdMZG91YmxlIHpOZWFyLCBHTGRvdWJsZSB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKSBcCisgIFgodm9pZCwgZ2xHZXRDbGlwUGxhbmUsIChHTGVudW0gcGxhbmUsIEdMZG91YmxlICogZXF1YXRpb24pLCAocGxhbmUsIGVxdWF0aW9uKSkgXAorICBYKHZvaWQsIGdsR2V0RG91YmxldiwgKEdMZW51bSBwbmFtZSwgR0xkb3VibGUgKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldExpZ2h0ZnYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqIHBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldE1hdGVyaWFsZnYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICogcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRQb2ludGVydiwgKEdMZW51bSBwbmFtZSwgR0x2b2lkKiAqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4RW52ZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4RW52aXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbExpZ2h0ZiwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xMaWdodGZ2LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVsZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xMaWdodE1vZGVsZnYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbExvYWRJZGVudGl0eSwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xMb2FkTWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQgKiBtKSwgKG0pKSBcCisgIFgodm9pZCwgZ2xMb2dpY09wLCAoR0xlbnVtIG9wY29kZSksIChvcGNvZGUpKSBcCisgIFgodm9pZCwgZ2xNYXRlcmlhbGYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGZhY2UsIHBuYW1lLCBwYXJhbSkpIFwKKyAgWCh2b2lkLCBnbE1hdGVyaWFsZnYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICogcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xNdWx0aVRleENvb3JkMmZ2LCAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqIHYpLCAodGFyZ2V0LCB2KSkgXAorICBYKHZvaWQsIGdsTXVsdGlUZXhDb29yZDJzdiwgKEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKiB2KSwgKHRhcmdldCwgdikpIFwKKyAgWCh2b2lkLCBnbE11bHRpVGV4Q29vcmQzZnYsIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICogdiksICh0YXJnZXQsIHYpKSBcCisgIFgodm9pZCwgZ2xNdWx0aVRleENvb3JkM3N2LCAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqIHYpLCAodGFyZ2V0LCB2KSkgXAorICBYKHZvaWQsIGdsTXVsdGlUZXhDb29yZDRmLCAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSwgKHRhcmdldCwgcywgdCwgciwgcSkpIFwKKyAgWCh2b2lkLCBnbE11bHRpVGV4Q29vcmQ0ZnYsIChHTGVudW0gdGFyZ2V0LCBjb25zdCBHTGZsb2F0ICogdiksICh0YXJnZXQsIHYpKSBcCisgIFgodm9pZCwgZ2xNdWx0aVRleENvb3JkNHN2LCAoR0xlbnVtIHRhcmdldCwgY29uc3QgR0xzaG9ydCAqIHYpLCAodGFyZ2V0LCB2KSkgXAorICBYKHZvaWQsIGdsTXVsdE1hdHJpeGYsIChjb25zdCBHTGZsb2F0ICogbSksIChtKSkgXAorICBYKHZvaWQsIGdsTm9ybWFsM2YsIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSwgKG54LCBueSwgbnopKSBcCisgIFgodm9pZCwgZ2xOb3JtYWwzZnYsIChjb25zdCBHTGZsb2F0ICogdiksICh2KSkgXAorICBYKHZvaWQsIGdsTm9ybWFsM3N2LCAoY29uc3QgR0xzaG9ydCAqIHYpLCAodikpIFwKKyAgWCh2b2lkLCBnbE9ydGhvLCAoR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSkgXAorICBYKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmLCAoR0xlbnVtIHBhcmFtLCBHTGZsb2F0IHZhbHVlKSwgKHBhcmFtLCB2YWx1ZSkpIFwKKyAgWCh2b2lkLCBnbFBvaW50UGFyYW1ldGVyZnYsIChHTGVudW0gcGFyYW0sIGNvbnN0IEdMZmxvYXQgKiB2YWx1ZXMpLCAocGFyYW0sIHZhbHVlcykpIFwKKyAgWCh2b2lkLCBnbFBvaW50U2l6ZSwgKEdMZmxvYXQgc2l6ZSksIChzaXplKSkgXAorICBYKHZvaWQsIGdsUm90YXRlZiwgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoYW5nbGUsIHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xTY2FsZWYsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xUZXhFbnZmLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4RW52ZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsTWF0cml4TW9kZSwgKEdMZW51bSBtb2RlKSwgKG1vZGUpKSBcCisgIFgodm9pZCwgZ2xOb3JtYWxQb2ludGVyLCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKiBwb2ludGVyKSwgKHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbFBvcE1hdHJpeCwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xQdXNoTWF0cml4LCAoKSwgKCkpIFwKKyAgWCh2b2lkLCBnbFNoYWRlTW9kZWwsIChHTGVudW0gbW9kZSksIChtb2RlKSkgXAorICBYKHZvaWQsIGdsVGV4Q29vcmRQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKiBwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKyAgWCh2b2lkLCBnbFRleEVudmksIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4RW52aXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbFRyYW5zbGF0ZWYsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHgsIHksIHopKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKiBwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpIFwKKworCisjZW5kaWYgIC8vIEdMRVMxX09OTFlfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9leHRlbnNpb25zX2Z1bmN0aW9ucy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxODU0MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9leHRlbnNpb25zX2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX2V4dGVuc2lvbnMuZW50cmllcyAtLW91dHB1dD1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczJfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaAorLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpZm5kZWYgR0xFUzJfRVhURU5TSU9OU19GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTMl9FWFRFTlNJT05TX0ZVTkNUSU9OU19ICisKKyNkZWZpbmUgTElTVF9HTEVTMl9FWFRFTlNJT05TX0ZVTkNUSU9OUyhYKSBcCisgIFgodm9pZCwgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbiksIChzaGFkZXJ0eXBlLCBwcmVjaXNpb250eXBlLCByYW5nZSwgcHJlY2lzaW9uKSkgXAorICBYKHZvaWQsIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyLCAoKSwgKCkpIFwKKyAgWCh2b2lkLCBnbFNoYWRlckJpbmFyeSwgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpLCAobiwgc2hhZGVycywgYmluYXJ5Zm9ybWF0LCBiaW5hcnksIGxlbmd0aCkpIFwKKworCisjZW5kaWYgIC8vIEdMRVMyX0VYVEVOU0lPTlNfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9vbmx5X2Z1bmN0aW9ucy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX29ubHlfZnVuY3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjM2FiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9vbmx5X2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsODYgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX29ubHkuZW50cmllcyAtLW91dHB1dD1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczJfb25seV9mdW5jdGlvbnMuaAorLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpZm5kZWYgR0xFUzJfT05MWV9GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTMl9PTkxZX0ZVTkNUSU9OU19ICisKKyNkZWZpbmUgTElTVF9HTEVTMl9PTkxZX0ZVTkNUSU9OUyhYKSBcCisgIFgodm9pZCwgZ2xCbGVuZENvbG9yLCAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSwgKGZhY2UsIGZ1bmMsIHJlZiwgbWFzaykpIFwKKyAgWCh2b2lkLCBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUsIChHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spLCAoZmFjZSwgbWFzaykpIFwKKyAgWCh2b2lkLCBnbFN0ZW5jaWxPcFNlcGFyYXRlLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyksIChmYWNlLCBmYWlsLCB6ZmFpbCwgenBhc3MpKSBcCisgIFgoR0xib29sZWFuLCBnbElzUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pKSBcCisgIFgoR0xib29sZWFuLCBnbElzU2hhZGVyLCAoR0x1aW50IHNoYWRlciksIChzaGFkZXIpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIxZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpLCAoaW5keCwgeCkpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjFmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliMmYsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpLCAoaW5keCwgeCwgeSkpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjJmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliM2YsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChpbmR4LCB4LCB5LCB6KSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliM2Z2LCAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyksIChpbmR4LCB2YWx1ZXMpKSBcCisgIFgodm9pZCwgZ2xWZXJ0ZXhBdHRyaWI0ZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpLCAoaW5keCwgeCwgeSwgeiwgdykpIFwKKyAgWCh2b2lkLCBnbFZlcnRleEF0dHJpYjRmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSkgXAorICBYKHZvaWQsIGdsVmVydGV4QXR0cmliUG9pbnRlciwgKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0ciksIChpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHB0cikpIFwKKyAgWCh2b2lkLCBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgKEdMdWludCBpbmRleCksIChpbmRleCkpIFwKKyAgWCh2b2lkLCBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCAoR0x1aW50IGluZGV4KSwgKGluZGV4KSkgXAorICBYKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliZnYsIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSwgKGluZGV4LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliaXYsIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChpbmRleCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2LCAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpLCAoaW5kZXgsIHBuYW1lLCBwb2ludGVyKSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTFmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCksIChsb2NhdGlvbiwgeCkpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0xZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtMWksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCksIChsb2NhdGlvbiwgeCkpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0xaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTJmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSwgKGxvY2F0aW9uLCB4LCB5KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTJmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0yaSwgKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSwgKGxvY2F0aW9uLCB4LCB5KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTJpdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtM2YsIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChsb2NhdGlvbiwgeCwgeSwgeikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0zZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtM2ksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiksIChsb2NhdGlvbiwgeCwgeSwgeikpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm0zaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybTRmLCAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyksIChsb2NhdGlvbiwgeCwgeSwgeiwgdykpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm00ZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtNGksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyksIChsb2NhdGlvbiwgeCwgeSwgeiwgdykpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm00aXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSkgXAorICBYKHZvaWQsIGdsVW5pZm9ybU1hdHJpeDJmdiwgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSksIChsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpKSBcCisgIFgodm9pZCwgZ2xVbmlmb3JtTWF0cml4M2Z2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSwgKGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSkpIFwKKyAgWCh2b2lkLCBnbFVuaWZvcm1NYXRyaXg0ZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpLCAobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSkgXAorICBYKHZvaWQsIGdsQXR0YWNoU2hhZGVyLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpLCAocHJvZ3JhbSwgc2hhZGVyKSkgXAorICBYKHZvaWQsIGdsQmluZEF0dHJpYkxvY2F0aW9uLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIGluZGV4LCBuYW1lKSkgXAorICBYKHZvaWQsIGdsQ29tcGlsZVNoYWRlciwgKEdMdWludCBzaGFkZXIpLCAoc2hhZGVyKSkgXAorICBYKEdMdWludCwgZ2xDcmVhdGVQcm9ncmFtLCAoKSwgKCkpIFwKKyAgWChHTHVpbnQsIGdsQ3JlYXRlU2hhZGVyLCAoR0xlbnVtIHR5cGUpLCAodHlwZSkpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZVByb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSkgXAorICBYKHZvaWQsIGdsRGVsZXRlU2hhZGVyLCAoR0x1aW50IHNoYWRlciksIChzaGFkZXIpKSBcCisgIFgodm9pZCwgZ2xEZXRhY2hTaGFkZXIsIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlciksIChwcm9ncmFtLCBzaGFkZXIpKSBcCisgIFgodm9pZCwgZ2xMaW5rUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pKSBcCisgIFgodm9pZCwgZ2xVc2VQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSkpIFwKKyAgWCh2b2lkLCBnbFZhbGlkYXRlUHJvZ3JhbSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pKSBcCisgIFgodm9pZCwgZ2xHZXRBY3RpdmVBdHRyaWIsIChHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpKSBcCisgIFgodm9pZCwgZ2xHZXRBY3RpdmVVbmlmb3JtLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKSkgXAorICBYKHZvaWQsIGdsR2V0QXR0YWNoZWRTaGFkZXJzLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpLCAocHJvZ3JhbSwgbWF4Y291bnQsIGNvdW50LCBzaGFkZXJzKSkgXAorICBYKGludCwgZ2xHZXRBdHRyaWJMb2NhdGlvbiwgKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgbmFtZSkpIFwKKyAgWCh2b2lkLCBnbEdldFByb2dyYW1pdiwgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAocHJvZ3JhbSwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFByb2dyYW1JbmZvTG9nLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpLCAocHJvZ3JhbSwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKSkgXAorICBYKHZvaWQsIGdsR2V0U2hhZGVyaXYsIChHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAoc2hhZGVyLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0U2hhZGVySW5mb0xvZywgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpLCAoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpKSBcCisgIFgodm9pZCwgZ2xHZXRTaGFkZXJTb3VyY2UsIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpLCAoc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIHNvdXJjZSkpIFwKKyAgWCh2b2lkLCBnbEdldFVuaWZvcm1mdiwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpKSBcCisgIFgodm9pZCwgZ2xHZXRVbmlmb3JtaXYsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpLCAocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcykpIFwKKyAgWChpbnQsIGdsR2V0VW5pZm9ybUxvY2F0aW9uLCAoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBuYW1lKSkgXAorICBYKHZvaWQsIGdsU2hhZGVyU291cmNlLCAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiBjb25zdCogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKSwgKHNoYWRlciwgY291bnQsIHN0cmluZywgbGVuZ3RoKSkgXAorICBYKHZvaWQsIGdsQmluZEZyYW1lYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwgKHRhcmdldCwgZnJhbWVidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xHZW5GcmFtZWJ1ZmZlcnMsIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSwgKG4sIGZyYW1lYnVmZmVycykpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJELCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpKSBcCisgIFgoR0xlbnVtLCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCkpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZUZyYW1lYnVmZmVycywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSkgXAorICBYKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlciwgKEdMdWludCByZW5kZXJidWZmZXIpLCAocmVuZGVyYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsQmluZFJlbmRlcmJ1ZmZlciwgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCByZW5kZXJidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVSZW5kZXJidWZmZXJzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xHZW5SZW5kZXJidWZmZXJzLCAoR0xzaXplaSBuLCBHTHVpbnQgKiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSkgXAorICBYKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEdlbmVyYXRlTWlwbWFwLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpKSBcCisKKworI2VuZGlmICAvLyBHTEVTMl9PTkxZX0ZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczNfb25seV9mdW5jdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzM19vbmx5X2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWI5MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlczNfb25seV9mdW5jdGlvbnMuaApAQCAtMCwwICsxLDE3IEBACisvLyBBdXRvLWdlbmVyYXRlZCB3aXRoOiBhbmRyb2lkL3NjcmlwdHMvZ2VuLWVudHJpZXMucHkgLS1tb2RlPWZ1bmNhcmdzIGFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzM19vbmx5LmVudHJpZXMgLS1vdXRwdXQ9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXMzX29ubHlfZnVuY3Rpb25zLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIEdMRVMzX09OTFlfRlVOQ1RJT05TX0gKKyNkZWZpbmUgR0xFUzNfT05MWV9GVU5DVElPTlNfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMzL2dsMy5oPgorI2RlZmluZSBMSVNUX0dMRVMzX09OTFlfRlVOQ1RJT05TKFgpIFwKKyAgWChHTGNvbnN0dWJ5dGVwdHIsIGdsR2V0U3RyaW5naSwgKEdMZW51bSBuYW1lLCBHTGludCBpbmRleCksIChuYW1lLCBpbmRleCkpIFwKKyAgWChHTHN5bmMsIGdsRmVuY2VTeW5jLCAoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyksIChjb25kaXRpb24sIGZsYWdzKSkgXAorICBYKEdMZW51bSwgZ2xDbGllbnRXYWl0U3luYywgKEdMc3luYyB3YWl0X29uLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KSwgKHdhaXRfb24sIGZsYWdzLCB0aW1lb3V0KSkgXAorICBYKHZvaWQsIGdsV2FpdFN5bmMsIChHTHN5bmMgd2FpdF9vbiwgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCksICh3YWl0X29uLCBmbGFncywgdGltZW91dCkpIFwKKyAgWCh2b2lkLCBnbERlbGV0ZVN5bmMsIChHTHN5bmMgdG9fZGVsZXRlKSwgKHRvX2RlbGV0ZSkpIFwKKworCisjZW5kaWYgIC8vIEdMRVMzX09OTFlfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2NvbW1vbl9mdW5jdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2NvbW1vbl9mdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRkNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXNfY29tbW9uX2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfY29tbW9uLmVudHJpZXMgLS1vdXRwdXQ9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXNfY29tbW9uX2Z1bmN0aW9ucy5oCisvLyBETyBOT1QgRURJVCBUSElTIEZJTEUKKworI2lmbmRlZiBHTEVTX0NPTU1PTl9GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTX0NPTU1PTl9GVU5DVElPTlNfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorLy8gUmV0dXJuIHR5cGVzIG11c3QgYmUgc2luZ2xlIHdvcmRzLCBzZWUgR0xEaXNwYXRjaC5jcHAKK3R5cGVkZWYgY29uc3QgR0x1Ynl0ZSogR0xjb25zdHVieXRlcHRyOworI2RlZmluZSBMSVNUX0dMRVNfQ09NTU9OX0ZVTkNUSU9OUyhYKSBcCisgIFgodm9pZCwgZ2xBY3RpdmVUZXh0dXJlLCAoR0xlbnVtIHRleHR1cmUpLCAodGV4dHVyZSkpIFwKKyAgWCh2b2lkLCBnbEJpbmRCdWZmZXIsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKSwgKHRhcmdldCwgYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsQmluZFRleHR1cmUsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSksICh0YXJnZXQsIHRleHR1cmUpKSBcCisgIFgodm9pZCwgZ2xCbGVuZEZ1bmMsIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpLCAoc2ZhY3RvciwgZGZhY3RvcikpIFwKKyAgWCh2b2lkLCBnbEJsZW5kRXF1YXRpb24sIChHTGVudW0gbW9kZSksIChtb2RlKSkgXAorICBYKHZvaWQsIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlLCAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpLCAobW9kZVJHQiwgbW9kZUFscGhhKSkgXAorICBYKHZvaWQsIGdsQmxlbmRGdW5jU2VwYXJhdGUsIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSksIChzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKSkgXAorICBYKHZvaWQsIGdsQnVmZmVyRGF0YSwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICogZGF0YSwgR0xlbnVtIHVzYWdlKSwgKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpKSBcCisgIFgodm9pZCwgZ2xCdWZmZXJTdWJEYXRhLCAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqIGRhdGEpLCAodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpKSBcCisgIFgodm9pZCwgZ2xDbGVhciwgKEdMYml0ZmllbGQgbWFzayksIChtYXNrKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJDb2xvciwgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJEZXB0aCwgKEdMY2xhbXBkIGRlcHRoKSwgKGRlcHRoKSkgXAorICBYKHZvaWQsIGdsQ2xlYXJTdGVuY2lsLCAoR0xpbnQgcyksIChzKSkgXAorICBYKHZvaWQsIGdsQ29sb3JNYXNrLCAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSkgXAorICBYKHZvaWQsIGdsQ29tcHJlc3NlZFRleEltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICogZGF0YSksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpKSBcCisgIFgodm9pZCwgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpKSBcCisgIFgodm9pZCwgZ2xDb3B5VGV4SW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxGb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxGb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcikpIFwKKyAgWCh2b2lkLCBnbENvcHlUZXhTdWJJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpKSBcCisgIFgodm9pZCwgZ2xDdWxsRmFjZSwgKEdMZW51bSBtb2RlKSwgKG1vZGUpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVCdWZmZXJzLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKiBidWZmZXJzKSwgKG4sIGJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVUZXh0dXJlcywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICogdGV4dHVyZXMpLCAobiwgdGV4dHVyZXMpKSBcCisgIFgodm9pZCwgZ2xEZXB0aEZ1bmMsIChHTGVudW0gZnVuYyksIChmdW5jKSkgXAorICBYKHZvaWQsIGdsRGVwdGhNYXNrLCAoR0xib29sZWFuIGZsYWcpLCAoZmxhZykpIFwKKyAgWCh2b2lkLCBnbERlcHRoUmFuZ2UsIChHTGNsYW1wZCB6TmVhciwgR0xjbGFtcGQgekZhciksICh6TmVhciwgekZhcikpIFwKKyAgWCh2b2lkLCBnbERpc2FibGUsIChHTGVudW0gY2FwKSwgKGNhcCkpIFwKKyAgWCh2b2lkLCBnbERyYXdBcnJheXMsIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpLCAobW9kZSwgZmlyc3QsIGNvdW50KSkgXAorICBYKHZvaWQsIGdsRHJhd0VsZW1lbnRzLCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKiBpbmRpY2VzKSwgKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzKSkgXAorICBYKHZvaWQsIGdsRW5hYmxlLCAoR0xlbnVtIGNhcCksIChjYXApKSBcCisgIFgodm9pZCwgZ2xGaW5pc2gsICgpLCAoKSkgXAorICBYKHZvaWQsIGdsRmx1c2gsICgpLCAoKSkgXAorICBYKHZvaWQsIGdsRnJvbnRGYWNlLCAoR0xlbnVtIG1vZGUpLCAobW9kZSkpIFwKKyAgWCh2b2lkLCBnbEdlbkJ1ZmZlcnMsIChHTHNpemVpIG4sIEdMdWludCAqIGJ1ZmZlcnMpLCAobiwgYnVmZmVycykpIFwKKyAgWCh2b2lkLCBnbEdlblRleHR1cmVzLCAoR0xzaXplaSBuLCBHTHVpbnQgKiB0ZXh0dXJlcyksIChuLCB0ZXh0dXJlcykpIFwKKyAgWCh2b2lkLCBnbEdldEJvb2xlYW52LCAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKiBwYXJhbXMpLCAocG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCAoR0xlbnVtIGJ1ZmZlciwgR0xlbnVtIHBhcmFtZXRlciwgR0xpbnQgKiB2YWx1ZSksIChidWZmZXIsIHBhcmFtZXRlciwgdmFsdWUpKSBcCisgIFgoR0xlbnVtLCBnbEdldEVycm9yLCAoKSwgKCkpIFwKKyAgWCh2b2lkLCBnbEdldEZsb2F0diwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqIHBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0SW50ZWdlcnYsIChHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpKSBcCisgIFgoR0xjb25zdHVieXRlcHRyLCBnbEdldFN0cmluZywgKEdMZW51bSBuYW1lKSwgKG5hbWUpKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsVGV4UGFyYW1ldGVyZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdldFRleExldmVsUGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqIHBhcmFtcyksICh0YXJnZXQsIGxldmVsLCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsSGludCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSwgKHRhcmdldCwgbW9kZSkpIFwKKyAgWChHTGJvb2xlYW4sIGdsSXNCdWZmZXIsIChHTHVpbnQgYnVmZmVyKSwgKGJ1ZmZlcikpIFwKKyAgWChHTGJvb2xlYW4sIGdsSXNFbmFibGVkLCAoR0xlbnVtIGNhcCksIChjYXApKSBcCisgIFgoR0xib29sZWFuLCBnbElzVGV4dHVyZSwgKEdMdWludCB0ZXh0dXJlKSwgKHRleHR1cmUpKSBcCisgIFgodm9pZCwgZ2xMaW5lV2lkdGgsIChHTGZsb2F0IHdpZHRoKSwgKHdpZHRoKSkgXAorICBYKHZvaWQsIGdsUG9seWdvbk9mZnNldCwgKEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKSwgKGZhY3RvciwgdW5pdHMpKSBcCisgIFgodm9pZCwgZ2xQaXhlbFN0b3JlaSwgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSkgXAorICBYKHZvaWQsIGdsUmVhZFBpeGVscywgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICogcGl4ZWxzKSwgKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSkgXAorICBYKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2UsIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCksICh2YWx1ZSwgaW52ZXJ0KSkgXAorICBYKHZvaWQsIGdsU2Npc3NvciwgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHgsIHksIHdpZHRoLCBoZWlnaHQpKSBcCisgIFgodm9pZCwgZ2xTdGVuY2lsRnVuYywgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSwgKGZ1bmMsIHJlZiwgbWFzaykpIFwKKyAgWCh2b2lkLCBnbFN0ZW5jaWxNYXNrLCAoR0x1aW50IG1hc2spLCAobWFzaykpIFwKKyAgWCh2b2lkLCBnbFN0ZW5jaWxPcCwgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyksIChmYWlsLCB6ZmFpbCwgenBhc3MpKSBcCisgIFgodm9pZCwgZ2xUZXhJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICogcGl4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSkgXAorICBYKHZvaWQsIGdsVGV4UGFyYW1ldGVyaSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pKSBcCisgIFgodm9pZCwgZ2xUZXhQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkgXAorICBYKHZvaWQsIGdsVGV4U3ViSW1hZ2UyRCwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqIHBpeGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscykpIFwKKyAgWCh2b2lkLCBnbFZpZXdwb3J0LCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAoeCwgeSwgd2lkdGgsIGhlaWdodCkpIFwKKyAgWCh2b2lkLCBnbFB1c2hBdHRyaWIsIChHTGJpdGZpZWxkIG1hc2spLCAobWFzaykpIFwKKyAgWCh2b2lkLCBnbFB1c2hDbGllbnRBdHRyaWIsIChHTGJpdGZpZWxkIG1hc2spLCAobWFzaykpIFwKKyAgWCh2b2lkLCBnbFBvcEF0dHJpYiwgKCksICgpKSBcCisgIFgodm9pZCwgZ2xQb3BDbGllbnRBdHRyaWIsICgpLCAoKSkgXAorCisKKyNlbmRpZiAgLy8gR0xFU19DT01NT05fRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlc19leHRlbnNpb25zX2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjRjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlc19leHRlbnNpb25zX2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZXh0ZW5zaW9ucy5lbnRyaWVzIC0tb3V0cHV0PWFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2V4dGVuc2lvbnNfZnVuY3Rpb25zLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIEdMRVNfRVhURU5TSU9OU19GVU5DVElPTlNfSAorI2RlZmluZSBHTEVTX0VYVEVOU0lPTlNfRlVOQ1RJT05TX0gKKworI2RlZmluZSBMSVNUX0dMRVNfRVhURU5TSU9OU19GVU5DVElPTlMoWCkgXAorICBYKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlckVYVCwgKEdMdWludCByZW5kZXJidWZmZXIpLCAocmVuZGVyYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsQmluZFJlbmRlcmJ1ZmZlckVYVCwgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCByZW5kZXJidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhULCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xHZW5SZW5kZXJidWZmZXJzRVhULCAoR0xzaXplaSBuLCBHTHVpbnQgKiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpKSBcCisgIFgodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlRVhULCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSkgXAorICBYKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWChHTGJvb2xlYW4sIGdsSXNGcmFtZWJ1ZmZlckVYVCwgKEdMdWludCBmcmFtZWJ1ZmZlciksIChmcmFtZWJ1ZmZlcikpIFwKKyAgWCh2b2lkLCBnbEJpbmRGcmFtZWJ1ZmZlckVYVCwgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlciksICh0YXJnZXQsIGZyYW1lYnVmZmVyKSkgXAorICBYKHZvaWQsIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhULCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSkgXAorICBYKHZvaWQsIGdsR2VuRnJhbWVidWZmZXJzRVhULCAoR0xzaXplaSBuLCBHTHVpbnQgKiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSkgXAorICBYKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhULCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpKSBcCisgIFgodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUxREVYVCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSkgXAorICBYKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKSwgKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCkpIFwKKyAgWCh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTNERVhULCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHpvZmZzZXQpKSBcCisgIFgodm9pZCwgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpKSBcCisgIFgodm9pZCwgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICogcGFyYW1zKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcykpIFwKKyAgWCh2b2lkLCBnbEdlbmVyYXRlTWlwbWFwRVhULCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpKSBcCisgIFgodm9pZCwgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpLCAodGFyZ2V0LCBpbWFnZSkpIFwKKyAgWCh2b2lkLCBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpLCAodGFyZ2V0LCBpbWFnZSkpIFwKKworCisjZW5kaWYgIC8vIEdMRVNfRVhURU5TSU9OU19GVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZnVuY3Rpb25zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5HTEVTRGlzcGF0Y2gvZ2xlc19mdW5jdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWVlMTVhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZnVuY3Rpb25zLmgKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2NvbW1vbl9mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZXh0ZW5zaW9uc19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxX29ubHlfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9leHRlbnNpb25zX2Z1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczEydHIuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX29ubHlfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9leHRlbnNpb25zX2Z1bmN0aW9ucy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczNfb25seV9mdW5jdGlvbnMuaCIKKworLy8gQXMgYSBzcGVjaWFsIGNhc2UsIExJU1RfR0xFUzNfT05MWV9GVU5DVElPTlMgYmVsb3cgdXNlcyB0aGUgWSBwYXJhbWV0ZXIKKy8vIGluc3RlYWQgb2YgdGhlIFggb25lLCBtZWFuaW5nIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGFyZQorLy8gb3B0aW9uYWwgZXh0ZW5zaW9ucy4gRm9yIGV4YW1wbGUsIGdsR2V0U3RyaW5naSBpcyBwYXJ0IG9mIEdMRVN2MworLy8gYW5kIGlzIG5vdCBhbHdheXMgcHJvdmlkZWQgYnkgaG9zdCBkZXNrdG9wIEdMIGRyaXZlcnMuCisvLyBJZiB0aGVyZSBhcmUgYW55IG1vcmUgR0xFUzMgZnVuY3Rpb25zIG9uIHRvcCBvZiB0aGF0LCB0aGV5J3JlIGFzc3VtZWQKKy8vIHRvIGV4dGVuZCB0aGUgR0xFUzIgZHJpdmVyLgorI2RlZmluZSBMSVNUX0dMRVNfRlVOQ1RJT05TKFgsWSkgXAorICAgIExJU1RfR0xFU19DT01NT05fRlVOQ1RJT05TKFgpIFwKKyAgICBMSVNUX0dMRVNfRVhURU5TSU9OU19GVU5DVElPTlMoWSkgXAorICAgIExJU1RfR0xFUzFfT05MWV9GVU5DVElPTlMoWCkgXAorICAgIExJU1RfR0xFUzFfRVhURU5TSU9OU19GVU5DVElPTlMoWSkgXAorICAgIExJU1RfR0xFUzJfT05MWV9GVU5DVElPTlMoWCkgXAorICAgIExJU1RfR0xFUzJfRVhURU5TSU9OU19GVU5DVElPTlMoWSkgXAorICAgIExJU1RfR0xFUzNfT05MWV9GVU5DVElPTlMoWSkgXAorCisjZGVmaW5lIExJU1RfR0xFUzFfRlVOQ1RJT05TKFgsIFkpIFwKKyAgICBMSVNUX0dMRVNfQ09NTU9OX0ZVTkNUSU9OUyhYKSBcCisgICAgTElTVF9HTEVTX0VYVEVOU0lPTlNfRlVOQ1RJT05TKFkpIFwKKyAgICBMSVNUX0dMRVMxX09OTFlfRlVOQ1RJT05TKFgpIFwKKyAgICBMSVNUX0dMRVMxX0VYVEVOU0lPTlNfRlVOQ1RJT05TKFkpIFwKKworI2RlZmluZSBMSVNUX0dMRVMyX0ZVTkNUSU9OUyhYLCBZKSBcCisgICAgTElTVF9HTEVTX0NPTU1PTl9GVU5DVElPTlMoWCkgXAorICAgIExJU1RfR0xFU19FWFRFTlNJT05TX0ZVTkNUSU9OUyhZKSBcCisgICAgTElTVF9HTEVTMl9PTkxZX0ZVTkNUSU9OUyhYKSBcCisgICAgTElTVF9HTEVTMl9FWFRFTlNJT05TX0ZVTkNUSU9OUyhZKSBcCisgICAgTElTVF9HTEVTM19PTkxZX0ZVTkNUSU9OUyhZKSBcCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL0lPU3RyZWFtLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9JT1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjhjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9JT1N0cmVhbS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVycm9yTG9nLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitjbGFzcyBJT1N0cmVhbSB7Citwcm90ZWN0ZWQ6CisgICAgZXhwbGljaXQgSU9TdHJlYW0oc2l6ZV90IGJ1ZlNpemUpIDogbV9idWZzaXplKGJ1ZlNpemUpIHt9CisKKyAgICB+SU9TdHJlYW0oKSB7CisgICAgICAgIC8vIE5PVEU6IG1fYnVmIHdhcyBvd25lZCBieSB0aGUgY2hpbGQgY2xhc3MgdGh1cyB3ZSBleHBlY3QgaXQgdG8gYmUKKyAgICAgICAgLy8gcmVsZWFzZWQgYW5kIGZsdXNoZWQgYmVmb3JlIHRoZSBvYmplY3QgZGVzdHJ1Y3Rpb24uCisgICAgICAgIGFzc2VydCghbV9idWYgfHwgbV9mcmVlID09IG1fYnVmc2l6ZSk7CisgICAgfQorCitwdWJsaWM6CisgICAgc2l6ZV90IHJlYWQodm9pZCogYnVmLCBzaXplX3QgYnVmTGVuKSB7CisgICAgICAgIGlmICghcmVhZFJhdyhidWYsICZidWZMZW4pKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmTGVuOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIqIGFsbG9jKHNpemVfdCBsZW4pIHsKKyAgICAgICAgaWYgKG1fYnVmICYmIGxlbiA+IG1fZnJlZSkgeworICAgICAgICAgICAgaWYgKGZsdXNoKCkgPCAwKSB7CisgICAgICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gZmx1c2ggaW4gYWxsb2NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvLyB3ZSBmYWlsZWQgdG8gZmx1c2ggc28gc29tZXRoaW5nIGlzIHdyb25nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1fYnVmIHx8IGxlbiA+IG1fYnVmc2l6ZSkgeworICAgICAgICAgICAgaW50IGFsbG9jTGVuID0gbV9idWZzaXplIDwgbGVuID8gbGVuIDogbV9idWZzaXplOworICAgICAgICAgICAgbV9idWYgPSAodW5zaWduZWQgY2hhciAqKWFsbG9jQnVmZmVyKGFsbG9jTGVuKTsKKyAgICAgICAgICAgIGlmICghbV9idWYpIHsKKyAgICAgICAgICAgICAgICBFUlIoIkFsbG9jICgldSBieXRlcykgZmFpbGVkXG4iLCBhbGxvY0xlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2J1ZnNpemUgPSBtX2ZyZWUgPSBhbGxvY0xlbjsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHB0ciA9IG1fYnVmICsgKG1fYnVmc2l6ZSAtIG1fZnJlZSk7CisgICAgICAgIG1fZnJlZSAtPSBsZW47CisKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisKKyAgICBpbnQgZmx1c2goKSB7CisgICAgICAgIGlmICghbV9idWYgfHwgbV9mcmVlID09IG1fYnVmc2l6ZSkgcmV0dXJuIDA7CisKKyAgICAgICAgaW50IHN0YXQgPSBjb21taXRCdWZmZXIobV9idWZzaXplIC0gbV9mcmVlKTsKKyAgICAgICAgbV9idWYgPSBOVUxMOworICAgICAgICBtX2ZyZWUgPSAwOworICAgICAgICByZXR1cm4gc3RhdDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgKmFsbG9jQnVmZmVyKHNpemVfdCBtaW5TaXplKSA9IDA7CisgICAgdmlydHVhbCBpbnQgY29tbWl0QnVmZmVyKHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkUmF3KHZvaWQgKmJ1Ziwgc2l6ZV90ICppbm91dF9sZW4pID0gMDsKKworcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBjaGFyKiBtX2J1ZiA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1fYnVmc2l6ZTsKKyAgICBzaXplX3QgbV9mcmVlID0gMDsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9SZW5kZXJDaGFubmVsLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9SZW5kZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMzJlMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL1JlbmRlckNoYW5uZWwuaApAQCAtMCwwICsxLDExNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaCIKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgZW11Z2wgeworCisvLyBUdXJuIHRoZSBSZW5kZXJDaGFubmVsOjpTdGF0ZSBlbnVtIGludG8gZmxhZ3MuCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpiYXNlOjpFbnVtRmxhZ3M7CisKKy8vIFJlbmRlckNoYW5uZWwgLSBGb3IgZWFjaCBndWVzdC10by1ob3N0IHJlbmRlcmVyIGNvbm5lY3Rpb24sIHRoaXMgcHJvdmlkZXMKKy8vIGFuIGludGVyZmFjZSBmb3IgdGhlIGd1ZXN0IHNpZGUgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyByZW5kZXJlcgorLy8gdGhyZWFkIG9uIHRoZSBob3N0LiBJdHMgbWFpbiBwdXJwb3NlIGlzIHRvIHNlbmQgYW5kIHJlY2VpdmUgd2lyZSBwcm90b2NvbAorLy8gYnl0ZXMgaW4gYW4gYXN5bmNocm9ub3VzIHdheSAoY29tcGF0aWJsZSB3aXRoIEFuZHJvaWQgcGlwZXMpLgorLy8KKy8vIFVzYWdlIGlzIHRoZSBmb2xsb3dpbmc6CisvLyAgICAxKSBHZXQgYW4gaW5zdGFuY2UgcG9pbnRlciB0aHJvdWdoIGEgZGVkaWNhdGVkIFJlbmRlcmVyIGZ1bmN0aW9uCisvLyAgICAgICAoZS5nLiBSZW5kZXJlckltcGw6OmNyZWF0ZVJlbmRlckNoYW5uZWwoKSkuCisvLworLy8gICAgMikgQ2FsbCBzZXRFdmVudENhbGxiYWNrKCkgdG8gaW5kaWNhdGUgd2hpY2ggY2FsbGJhY2sgc2hvdWxkIGJlIGNhbGxlZAorLy8gICAgICAgd2hlbiB0aGUgY2hhbm5lbCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGR1ZSB0byBhIGhvc3QgdGhyZWFkIGV2ZW50LgorLy8KK2NsYXNzIFJlbmRlckNoYW5uZWwgeworcHVibGljOgorICAgIC8vIEEgdHlwZSB1c2VkIHRvIHBhc3MgYnl0ZSBwYWNrZXRzIGJldHdlZW4gdGhlIGd1ZXN0IGFuZCB0aGUKKyAgICAvLyBSZW5kZXJDaGFubmVsIGluc3RhbmNlLiBFeHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHVzaW5nIGEKKyAgICAvLyBTbWFsbEZpeGVkVmVjdG9yPGNoYXIsIE4+IGluc3RhbmNlIGluc3RlYWQgb2YgYSBzdGQ6OnZlY3RvcjxjaGFyPgorICAgIC8vIGF2b2lkcyBhIGxvdCBvZiB1bi1uZWNlc3NhcnkgaGVhcCBhbGxvY2F0aW9ucy4gVGhlIGN1cnJlbnQgc2l6ZQorICAgIC8vIG9mIDUxMiB3YXMgc2VsZWN0ZWQgYWZ0ZXIgcHJvZmlsaW5nIGV4aXN0aW5nIHRyYWZmaWMsIGluY2x1ZGluZworICAgIC8vIHRoZSBvbmUgdXNlZCBpbiBwcm90b2NvbC1oZWF2eSBiZW5jaG1hcmsgbGlrZSBBbnR1dHUzRC4KKyAgICB1c2luZyBCdWZmZXIgPSBhbmRyb2lkOjpiYXNlOjpTbWFsbEZpeGVkVmVjdG9yPGNoYXIsIDUxMj47CisKKyAgICAvLyBCaXQtZmxhZ3MgZm9yIHRoZSBjaGFubmVsIHN0YXRlLgorICAgIC8vIHxDYW5SZWFkfCBtZWFucyB0aGVyZSBpcyBkYXRhIGZyb20gdGhlIGhvc3QgdG8gcmVhZC4KKyAgICAvLyB8Q2FuV3JpdGV8IG1lYW5zIHRoZXJlIGlzIHJvb20gdG8gc2VuZCBkYXRhIHRvIHRoZSBob3N0LgorICAgIC8vIHxTdG9wcGVkfCBtZWFucyB0aGUgY2hhbm5lbCB3YXMgc3RvcHBlZC4KKyAgICBlbnVtIGNsYXNzIFN0YXRlIHsKKyAgICAgICAgLy8gQ2FuJ3QgdXNlIE5vbmUgaGVyZSwgc29tZSBzeXN0ZW0gaGVhZGVyIGRlY2xhcmVzIGl0IGFzIGEgbWFjcm8uCisgICAgICAgIEVtcHR5ID0gMCwKKyAgICAgICAgQ2FuUmVhZCA9IDEgPDwgMCwKKyAgICAgICAgQ2FuV3JpdGUgPSAxIDw8IDEsCisgICAgICAgIFN0b3BwZWQgPSAxIDw8IDIsCisgICAgfTsKKworICAgIC8vIFZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXN1bHQgb2YgaS9vIG9wZXJhdGlvbnMuCisgICAgLy8gfE9rfCBtZWFucyBldmVyeXRoaW5nIHdlbnQgd2VsbC4KKyAgICAvLyB8VHJ5QWdhaW58IG1lYW5zIHRoZSBvcGVyYXRpb24gY291bGQgbm90IGJlIHBlcmZvcm1lZCBhbmQgc2hvdWxkIGJlCisgICAgLy8gdHJpZWQgbGF0ZXIuCisgICAgLy8gfEVycm9yfCBtZWFucyBhbiBlcnJvciBoYXBwZW5lZCAoaS5lLiB0aGUgY2hhbm5lbCBpcyBzdG9wcGVkKS4KKyAgICBlbnVtIGNsYXNzIElvUmVzdWx0IHsKKyAgICAgICAgT2sgPSAwLAorICAgICAgICBUcnlBZ2FpbiA9IDEsCisgICAgICAgIEVycm9yID0gMiwKKyAgICB9OworCisgICAgLy8gVHlwZSBvZiBhIGNhbGxiYWNrIHVzZWQgdG8gdGVsbCB0aGUgZ3Vlc3Qgd2hlbiB0aGUgUmVuZGVyQ2hhbm5lbAorICAgIC8vIHN0YXRlIGNoYW5nZXMuIFVzZWQgYnkgc2V0RXZlbnRDYWxsYmFjaygpLiBUaGUgcGFyYW1ldGVyIGNvbnRhaW5zCisgICAgLy8gdGhlIFN0YXRlIGJpdHMgbWF0Y2hpbmcgdGhlIGV2ZW50LCBpLmUuIGl0IGlzIHRoZSBsb2dpY2FsIEFORCBvZgorICAgIC8vIHRoZSBsYXN0IHZhbHVlIHBhc3NlZCB0byBzZXRXYW50ZWRFdmVudHMoKSBhbmQgdGhlIGN1cnJlbnQKKyAgICAvLyBSZW5kZXJDaGFubmVsIHN0YXRlLgorICAgIHVzaW5nIEV2ZW50Q2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoU3RhdGUpPjsKKworICAgIC8vIFNldHMgYSBzaW5nbGUgKCEpIGNhbGxiYWNrIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGNoYW5uZWwgc3RhdGUncworICAgIC8vIGNoYW5nZXMgZHVlIHRvIGFuIGV2ZW50ICpmcm9tKiAqdGhlKiAqaG9zdCogb25seS4gfGNhbGxiYWNrfCBpcyBhCisgICAgLy8gZ3Vlc3QtcHJvdmlkZWQgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBmcm9tIHRoZSBob3N0IHJlbmRlcmVyCisgICAgLy8gdGhyZWFkLCBub3QgdGhlIGd1ZXN0IG9uZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXZlbnRDYWxsYmFjayhFdmVudENhbGxiYWNrJiYgY2FsbGJhY2spID0gMDsKKworICAgIC8vIFVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggaS9vIGV2ZW50cyB0aGUgZ3Vlc3Qgd2FudHMgdG8gYmUgbm90aWZpZWQKKyAgICAvLyB0aHJvdWdoIGl0cyBTdGF0ZUNoYW5nZUNhbGxiYWNrLiB8c3RhdGV8IG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZgorICAgIC8vIFN0YXRlOjpDYW5SZWFkIG9yIFN0YXRlOjpDYW5Xcml0ZSBvbmx5LiBUaGlzIHdpbGwgKm5vdCogY2FsbCB0aGUKKyAgICAvLyBjYWxsYmFjayBkaXJlY3RseSBzaW5jZSB0aGlzIGhhcHBlbnMgaW4gdGhlIGd1ZXN0IHRocmVhZC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2FudGVkRXZlbnRzKFN0YXRlIHN0YXRlKSA9IDA7CisKKyAgICAvLyBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgZmxhZ3MuCisgICAgdmlydHVhbCBTdGF0ZSBzdGF0ZSgpIGNvbnN0ID0gMDsKKworICAgIC8vIFRyeSB0byB3cml0ZXMgdGhlIGRhdGEgaW4gfGJ1ZmZlcnwgaW50byB0aGUgY2hhbm5lbC4gT24gc3VjY2VzcywKKyAgICAvLyByZXR1cm4gSW9SZXN1bHQ6Ok9rIGFuZCBtb3ZlcyB8YnVmZmVyfC4gT24gZmFpbHVyZSwgcmV0dXJuCisgICAgLy8gSW9SZXN1bHQ6OlRyeUFnYWluIGlmIHRoZSBjaGFubmVsIHdhcyBmdWxsLCBvciBJb1Jlc3VsdDo6RXJyb3IKKyAgICAvLyBpZiBpdCBpcyBzdG9wcGVkLgorICAgIHZpcnR1YWwgSW9SZXN1bHQgdHJ5V3JpdGUoQnVmZmVyJiYgYnVmZmVyKSA9IDA7CisKKyAgICAvLyBUcnkgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGNoYW5uZWwuIE9uIHN1Y2Nlc3MsIHJldHVybiBJb1Jlc3VsdDo6T2sgYW5kCisgICAgLy8gc2V0cyB8KmJ1ZmZlcnwgdG8gY29udGFpbiB0aGUgZGF0YS4gT24gZmFpbHVyZSwgcmV0dXJuCisgICAgLy8gSW9SZXN1bHQ6OlRyeUFnYWluIGlmIHRoZSBjaGFubmVsIHdhcyBlbXB0eSwgb3IgSW9SZXN1bHQ6OkVycm9yIGlmCisgICAgLy8gaXQgd2FzIHN0b3BwZWQuCisgICAgdmlydHVhbCBJb1Jlc3VsdCB0cnlSZWFkKEJ1ZmZlciogYnVmZmVyKSA9IDA7CisKKyAgICAvLyBBYm9ydCBhbGwgcGVuZGluZyBvcGVyYXRpb25zLiBBbnkgZm9sbG93aW5nIG9wZXJhdGlvbiBpcyBhIG5vb3AuCisgICAgLy8gT25jZSBhIGNoYW5uZWwgaXMgc3RvcHBlZCwgaXQgY2Fubm90IGJlIHJlLXN0YXJ0ZWQuCisgICAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB+UmVuZGVyQ2hhbm5lbCgpID0gZGVmYXVsdDsKK307CisKKy8vIFNoYXJlZCBwb2ludGVyIHRvIFJlbmRlckNoYW5uZWwgaW5zdGFuY2UuCit1c2luZyBSZW5kZXJDaGFubmVsUHRyID0gc3RkOjpzaGFyZWRfcHRyPFJlbmRlckNoYW5uZWw+OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL1JlbmRlckxpYi5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIvUmVuZGVyTGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwMTkzMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL1JlbmRlckxpYi5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlcmVyLmgiCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfdHlwZXMuaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gUmVuZGVyTGliIC0gcm9vdCBpbnRlcmZhY2UgZm9yIHRoZSBHUFUgZW11bGF0aW9uIGxpYnJhcnkKKy8vICBVc2UgaXQgdG8gc2V0IHRoZSBsaWJyYXJ5LXdpZGUgcGFyYW1ldGVycyAobG9nZ2luZywgY3Jhc2ggcmVwb3J0aW5nKSBhbmQKKy8vICBjcmVhdGUgaW5kaXZ1ZHVhbCByZW5kZXJlcnMgdGhhdCB0YWtlIGNhcmUgb2YgZHJhd2luZyB3aW5kb3dzLgorY2xhc3MgUmVuZGVyTGliIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5SZW5kZXJMaWIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBUZWxsIGVtdWdsIHRoZSBBUEkgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIGltYWdlCisgICAgLy8gUGxlYXNlIGV4dGVuZCBpdCB0byBzZXRBdmQsIGlmIG1vcmUgYXZkIGluZm8gaXMgbmVlZGVkIGluIGZ1dHVyZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXBpTGV2ZWwoaW50IGFwaSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRMb2dnZXIoZW11Z2xfbG9nZ2VyX3N0cnVjdCBsb2dnZXIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q3Jhc2hSZXBvcnRlcihlbXVnbF9jcmFzaF9yZXBvcnRlcl90IHJlcG9ydGVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldEZlYXR1cmVDb250cm9sbGVyKGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZF90IGZlYXR1cmVDb250cm9sbGVyKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFN5bmNEZXZpY2UoZW11Z2xfc3luY19jcmVhdGVfdGltZWxpbmVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVnbF9zeW5jX2NyZWF0ZV9mZW5jZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWdsX3N5bmNfdGltZWxpbmVfaW5jX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11Z2xfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVnbF9zeW5jX2RldmljZV9leGlzdHNfdCkgPSAwOworCisgICAgLy8gaW5pdFJlbmRlcmVyIC0gaW5pdGlhbGl6ZSB0aGUgT3BlbkdMIHJlbmRlcmVyIG9iamVjdC4KKyAgICAvLworICAgIC8vIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgZnJhbWVidWZmZXIgZGltZW5zaW9ucyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQKKyAgICAvLyB0byB0aGUgZ3Vlc3QgZGlzcGxheSBkcml2ZXIuCisgICAgLy8KKyAgICAvLyB8dXNlU3ViV2luZG93fCBpcyB0cnVlIHRvIGluZGljYXRlIHRoYXQgcmVuZGVyZXIgaGFzIHRvIHN1cHBvcnQgYW4KKyAgICAvLyBPcGVuR0wgc3Vid2luZG93LiBJZiBmYWxzZSwgaXQgb25seSBzdXBwb3J0cyBzZXRQb3N0Q2FsbGJhY2soKS4KKyAgICAvLyBTZWUgUmVuZGVyZXIuaCBmb3IgbW9yZSBpbmZvLgorICAgIC8vCisgICAgLy8gVGhlcmUgbWlnaHQgYmUgb25seSBvbmUgcmVuZGVyZXIuCisgICAgdmlydHVhbCBSZW5kZXJlclB0ciBpbml0UmVuZGVyZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlU3ViV2luZG93KSA9IDA7Cit9OworCit1c2luZyBSZW5kZXJMaWJQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyTGliPjsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9SZW5kZXJlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIvUmVuZGVyZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThmMmNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIvUmVuZGVyZXIuaApAQCAtMCwwICsxLDE0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpX3BsYXRmb3JtX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKKy8vIFJlbmRlcmVyIC0gYW4gb2JqZWN0IHRoYXQgbWFuYWdlcyBhIHNpbmdsZSBPcGVuR0wgd2luZG93IHVzZWQgZm9yIGRyYXdpbmcKKy8vIGFuZCBpcyBhYmxlIHRvIGNyZWF0ZSBpbmRpdmlkdWFsIHJlbmRlciBjaGFubmVscyBmb3IgdGhhdCB3aW5kb3cuCisvLworY2xhc3MgUmVuZGVyZXIgeworcHVibGljOgorICAgIC8vIGNyZWF0ZVJlbmRlckNoYW5uZWwgLSBjcmVhdGUgYSBzZXBhcmF0ZSBjaGFubmVsIGZvciB0aGUgcmVuZGVyaW5nIGRhdGEuCisgICAgLy8gVGhpcyBjYWxsIGluc3RhbnRpYXRlcyBhIG5ldyBvYmplY3QgdGhhdCB3YWl0cyBmb3IgdGhlIHNlcmlhbGl6ZWQgZGF0YQorICAgIC8vIGZyb20gdGhlIGd1ZXN0LCBkZXNlcmlhbGl6ZXMgaXQsIGV4ZWN1dGVzIHRoZSBwYXNzZWQgR0wgY29tbWFuZHMgYW5kCisgICAgLy8gcmV0dXJucyB0aGUgcmVzdWx0cyBiYWNrLgorICAgIHZpcnR1YWwgUmVuZGVyQ2hhbm5lbFB0ciBjcmVhdGVSZW5kZXJDaGFubmVsKCkgPSAwOworCisgICAgLy8gZ2V0SGFyZHdhcmVTdHJpbmdzIC0gZGVzY3JpYmUgdGhlIEdQVSBoYXJkd2FyZSBhbmQgZHJpdmVyLgorICAgIC8vIFRoZSB1bmRlcmx5aW5nIEdMJ3MgdmVuZG9yL3JlbmRlcmVyL3ZlcnNpb24gc3RyaW5ncyBhcmUgcmV0dXJuZWQgdG8gdGhlCisgICAgLy8gY2FsbGVyLgorICAgIHN0cnVjdCBIYXJkd2FyZVN0cmluZ3MgeworICAgICAgICBzdGQ6OnN0cmluZyB2ZW5kb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlbmRlcmVyOworICAgICAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uOworICAgIH07CisgICAgdmlydHVhbCBIYXJkd2FyZVN0cmluZ3MgZ2V0SGFyZHdhcmVTdHJpbmdzKCkgPSAwOworCisgICAgLy8gQSBwZXItZnJhbWUgY2FsbGJhY2sgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBzZXRQb3N0Q2FsbGJhY2soKTsgdG8gcmVtb3ZlCisgICAgLy8gaXQgcGFzcyBhbiBlbXB0eSBjYWxsYmFjay4gV2hpbGUgYSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLCB0aGUgcmVuZGVyZXIKKyAgICAvLyB3aWxsIGNhbGwgaXQganVzdCBiZWZvcmUgZWFjaCBuZXcgZnJhbWUgaXMgZGlzcGxheWVkLCBwcm92aWRpbmcgYSBjb3B5IG9mCisgICAgLy8gdGhlIGZyYW1lYnVmZmVyIGNvbnRlbnRzLgorICAgIC8vCisgICAgLy8gVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZyb20gb25lIG9mIHRoZSByZW5kZXJlcidzIHRocmVhZHMsIHNvIHdpbGwKKyAgICAvLyBwcm9iYWJseSBuZWVkIHN5bmNocm9uaXphdGlvbiBvbiBhbnkgZGF0YSBzdHJ1Y3R1cmVzIGl0IG1vZGlmaWVzLiBUaGUKKyAgICAvLyBwaXhlbHMgYnVmZmVyIG1heSBiZSBvdmVyd3JpdHRlbiBhcyBzb29uIGFzIHRoZSBjYWxsYmFjayByZXR1cm5zOyBpdAorICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBzeW5jaHJvbml6ZWQsIGJ1dCBpZiB0aGUgY2FsbGJhY2sgbmVlZHMgdGhlIHBpeGVscworICAgIC8vIGFmdGVyd2FyZHMgaXQgbXVzdCBjb3B5IHRoZW0uCisgICAgLy8KKyAgICAvLyBUaGUgcGl4ZWxzIGJ1ZmZlciBpcyBpbnRlbnRpb25hbGx5IG5vdCBjb25zdDogdGhlIGNhbGxiYWNrIG1heSBtb2RpZnkgdGhlCisgICAgLy8gZGF0YSB3aXRob3V0IGNvcHlpbmcgdG8gYW5vdGhlciBidWZmZXIgaWYgaXQgd2FudHMsIGUuZy4gaW4tcGxhY2UgUkdCQSB0bworICAgIC8vIFJHQiBjb252ZXJzaW9uLCBvciBpbi1wbGFjZSB5LWludmVyc2lvbi4KKyAgICAvLworICAgIC8vIFBhcmFtZXRlcnMgYXJlOgorICAgIC8vICAgd2lkdGgsIGhlaWdodCAgRGltZW5zaW9ucyBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4gUm93cyBhcmUgdGlnaHRseQorICAgIC8vICAgICAgICAgICAgICAgICAgcGFja2VkOyB0aGVyZSBpcyBubyBpbnRlci1yb3cgcGFkZGluZy4KKyAgICAvLyAgIHlkaXIgICAgICAgICAgIEluZGljYXRlcyByb3cgb3JkZXI6IDEgbWVhbnMgdG9wLXRvLWJvdHRvbSBvcmRlciwgLTEKKyAgICAvLyAgICAgICAgICAgICAgICAgIG1lYW5zIGJvdHRvbS10by10b3Agb3JkZXIuCisgICAgLy8gICBmb3JtYXQsIHR5cGUgICBGb3JtYXQgYW5kIHR5cGUgR0wgZW51bXMsIGFzIHVzZWQgaW4gZ2xUZXhJbWFnZTJEKCkgb3IKKyAgICAvLyAgICAgICAgICAgICAgICAgIGdsUmVhZFBpeGVscygpLCBkZXNjcmliaW5nIHRoZSBwaXhlbCBmb3JtYXQuCisgICAgLy8gICBwaXhlbHMgICAgICAgICBUaGUgZnJhbWVidWZmZXIgaW1hZ2UuCisgICAgLy8KKyAgICAvLyBJbiB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24sIHlkaXIgaXMgYWx3YXlzIC0xIChib3R0b20gdG8gdG9wKSwgZm9ybWF0CisgICAgLy8gYW5kIHR5cGUgYXJlIGFsd2F5cyBHTF9SR0JBIGFuZCBHTF9VTlNJR05FRF9CWVRFLCBhbmQgdGhlIHdpZHRoIGFuZAorICAgIC8vIGhlaWdodCB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcmVuZGVyZXIuCisgICAgdXNpbmcgT25Qb3N0Q2FsbGJhY2sgPSB2b2lkICgqKSh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcGl4ZWxzKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UG9zdENhbGxiYWNrKE9uUG9zdENhbGxiYWNrIG9uUG9zdCwgdm9pZCogY29udGV4dCkgPSAwOworCisgICAgLy8gc2hvd09wZW5HTFN1YndpbmRvdyAtCisgICAgLy8gICAgIENyZWF0ZSBvciBtb2RpZnkgYSBuYXRpdmUgc3Vid2luZG93IHdoaWNoIGlzIGEgY2hpbGQgb2YgJ3dpbmRvdycKKyAgICAvLyAgICAgdG8gYmUgdXNlZCBmb3IgZnJhbWVidWZmZXIgZGlzcGxheS4gSWYgYSBzdWJ3aW5kb3cgYWxyZWFkeSBleGlzdHMsCisgICAgLy8gICAgIGl0cyBwcm9wZXJ0aWVzIHdpbGwgYmUgdXBkYXRlZCB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KKyAgICAvLyAgICAgd3gsd3kgaXMgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVuZGVyaW5nIHN1YndpbmRvdy4KKyAgICAvLyAgICAgd3csd2ggYXJlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSByZW5kZXJpbmcgc3Vid2luZG93LgorICAgIC8vICAgICBmYncsZmJoIGFyZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdW5kZXJseWluZyBndWVzdCBmcmFtZWJ1ZmZlci4KKyAgICAvLyAgICAgZHByIGlzIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8sIHdoaWNoIGlzIG5lZWRlZCBmb3IgaGlnaGVyIGRlbnNpdHkKKyAgICAvLyAgICAgZGlzcGxheXMgbGlrZSByZXRpbmEuCisgICAgLy8gICAgIHpSb3QgaXMgdGhlIHJvdGF0aW9uIHRvIGFwcGx5IG9uIHRoZSBmcmFtZWJ1ZmZlciBkaXNwbGF5IGltYWdlLgorICAgIC8vCisgICAgLy8gICAgIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB1c2luZworICAgIC8vICAgICBhIHNvZnR3YXJlLW9ubHkgcmVuZGVyZXIgbGlrZSBPU01lc2EuIEluIHRoaXMgY2FzZSwgdGhlIGNsaWVudCBzaG91bGQKKyAgICAvLyAgICAgY2FsbCBzZXRQb3N0Q2FsbGJhY2sgdG8gZ2V0IHRoZSBjb250ZW50IG9mIGVhY2ggbmV3IGZyYW1lIHdoZW4gaXQgaXMKKyAgICAvLyAgICAgcG9zdGVkLCBhbmQgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyBpdC4KKyAgICB2aXJ0dWFsIGJvb2wgc2hvd09wZW5HTFN1YndpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpSb3QpID0gMDsKKworICAgIC8vIGRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3cgLQorICAgIC8vICAgZGVzdHJveXMgdGhlIGNyZWF0ZWQgbmF0aXZlIHN1YndpbmRvdy4gT25jZSBkZXN0cm95ZWQsCisgICAgLy8gICBGcmFtZWJ1ZmZlciBjb250ZW50IHdpbGwgbm90IGJlIHZpc2libGUgdW50aWwgYSBuZXcKKyAgICAvLyAgIHN1YndpbmRvdyB3aWxsIGJlIGNyZWF0ZWQuCisgICAgdmlydHVhbCBib29sIGRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3coKSA9IDA7CisKKyAgICAvLyBzZXRPcGVuR0xEaXNwbGF5Um90YXRpb24gLQorICAgIC8vICAgIHNldCB0aGUgZnJhbWVidWZmZXIgZGlzcGxheSBpbWFnZSByb3RhdGlvbiBpbiB1bml0cworICAgIC8vICAgIG9mIGRlZ3JlZXMgYXJvdW5kIHRoZSB6IGF4aXMKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T3BlbkdMRGlzcGxheVJvdGF0aW9uKGZsb2F0IHpSb3QpID0gMDsKKworICAgIC8vIHNldE9wZW5HTERpc3BsYXlUcmFuc2xhdGlvbgorICAgIC8vICAgIGNoYW5nZSB3aGF0IGNvb3JkaW5hdGUgb2YgdGhlIGd1ZXN0IGZyYW1lYnVmZmVyIHdpbGwgYmUgZGlzcGxheWVkIGF0CisgICAgLy8gICAgdGhlIGNvcm5lciBvZiB0aGUgR1BVIHN1Yi13aW5kb3cuIFNwZWNpZmljYWxseSwgfHB4fCBhbmQgfHB5fCA9IDAKKyAgICAvLyAgICBtZWFucworICAgIC8vICAgIGFsaWduIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgZnJhbWVidWZmZXIgd2l0aCB0aGUgYm90dG9tLWxlZnQgb2YgdGhlCisgICAgLy8gICAgc3ViLXdpbmRvdywgYW5kIHxweHwgYW5kIHxweXwgPSAxIG1lYW5zIGFsaWduIHRoZSB0b3AgcmlnaHQgb2YgdGhlCisgICAgLy8gICAgZnJhbWVidWZmZXIgd2l0aCB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBzdWItd2luZG93LiBJbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgLy8gICAgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVzZSBzdGF0ZXMuCisgICAgdmlydHVhbCB2b2lkIHNldE9wZW5HTERpc3BsYXlUcmFuc2xhdGlvbihmbG9hdCBweCwgZmxvYXQgcHkpID0gMDsKKworICAgIC8vIHJlcGFpbnRPcGVuR0xEaXNwbGF5IC0KKyAgICAvLyAgICBjYXVzZXMgdGhlIE9wZW5HTCBzdWJ3aW5kb3cgdG8gZ2V0IHJlcGFpbnRlZCB3aXRoIHRoZQorICAgIC8vICAgIGxhdGVzdCBmcmFtZWJ1ZmZlciBjb250ZW50LgorICAgIHZpcnR1YWwgdm9pZCByZXBhaW50T3BlbkdMRGlzcGxheSgpID0gMDsKKworICAgIC8vIGNsZWFudXBQcm9jR0xPYmplY3RzIC0KKyAgICAvLyAgICBjbGVhbiB1cCBhbGwgcGVyLXByb2Nlc3MgcmVzb3VyY2VzIHdoZW4gZ3Vlc3QgcHJvY2VzcyBleGl0cyAob3IgaXMKKyAgICAvLyBraWxsZWQpLiBTdWNoIHJlc291cmNlcyBpbmNsdWRlIGNvbG9yIGJ1ZmZlciBoYW5kbGVzIGFuZCBFZ2xJbWFnZSBoYW5kbGVzLgorICAgIHZpcnR1YWwgdm9pZCBjbGVhbnVwUHJvY0dMT2JqZWN0cyh1aW50NjRfdCBwdWlkKSA9IDA7CisKKyAgICAvLyBTdG9wcyBhbGwgY2hhbm5lbHMgYW5kIHJlbmRlciB0aHJlYWRzLgorICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkgPSAwOworcHJvdGVjdGVkOgorICAgIH5SZW5kZXJlcigpID0gZGVmYXVsdDsKK307CisKK3VzaW5nIFJlbmRlcmVyUHRyID0gc3RkOjpzaGFyZWRfcHRyPFJlbmRlcmVyPjsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9yZW5kZXJfYXBpLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9yZW5kZXJfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMwZGUwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGkuaApAQCAtMCwwICsxLDQwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV9mdW5jdGlvbnMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgorCisvLyBBbGwgaW50ZXJmYWNlcyB3aGljaCBjYW4gZmFpbCByZXR1cm4gYW4gaW50LCB3aXRoIHplcm8gaW5kaWNhdGluZyBmYWlsdXJlCisvLyBhbmQgYW55dGhpbmcgZWxzZSBpbmRpY2F0aW5nIHN1Y2Nlc3MuCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFVzZSBLSFJPTk9TX0FQSUNBTEwgdG8gY29udHJvbCB2aXNpYmlsaXR5LCBidXQgZG8gbm90IHVzZSBLSFJPTk9TX0FQSUVOVFJZCisvLyBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdGhlIGZ1bmN0aW9ucyB0byBiZSBfX3N0ZGNhbGwgb24gV2luMzIuCisjZGVmaW5lIFJFTkRFUl9BUElDQUxMICBLSFJPTk9TX0FQSUNBTEwKKyNkZWZpbmUgUkVOREVSX0FQSUVOVFJZCisKKyNkZWZpbmUgUkVOREVSX0FQSV9ERUNMQVJFKHJldHVybl90eXBlLCBmdW5jX25hbWUsIHNpZ25hdHVyZSwgY2FsbGFyZ3MpIFwKKyAgICB0eXBlZGVmIHJldHVybl90eXBlIChSRU5ERVJfQVBJRU5UUlkgKmZ1bmNfbmFtZSAjIyBGbikgc2lnbmF0dXJlOyBcCisgICAgUkVOREVSX0FQSUNBTEwgcmV0dXJuX3R5cGUgUkVOREVSX0FQSUVOVFJZIGZ1bmNfbmFtZSBzaWduYXR1cmU7CisKK0xJU1RfUkVOREVSX0FQSV9GVU5DVElPTlMoUkVOREVSX0FQSV9ERUNMQVJFKQorCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfZnVuY3Rpb25zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9yZW5kZXJfYXBpX2Z1bmN0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTU3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9pbmNsdWRlL09wZW5nbFJlbmRlci9yZW5kZXJfYXBpX2Z1bmN0aW9ucy5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaS5lbnRyaWVzIC0tb3V0cHV0PWFuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfZnVuY3Rpb25zLmgKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIFJFTkRFUl9BUElfRlVOQ1RJT05TX0gKKyNkZWZpbmUgUkVOREVSX0FQSV9GVU5DVElPTlNfSAorCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlckxpYi5oIgorCisjZGVmaW5lIExJU1RfUkVOREVSX0FQSV9GVU5DVElPTlMoWCkgXAorICBYKGVtdWdsOjpSZW5kZXJMaWJQdHIsIGluaXRMaWJyYXJ5LCAoKSwgKCkpIFwKKworCisjZW5kaWYgIC8vIFJFTkRFUl9BUElfRlVOQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfcGxhdGZvcm1fdHlwZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfcGxhdGZvcm1fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmI5OTNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV9wbGF0Zm9ybV90eXBlcy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKy8vIERlZmluZSBGQk5hdGl2ZVdpbmRvd1R5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIHR5cGUgb2YgbmF0aXZlCisvLyBob3N0IFVJIHdpbmRvdyBoYW5kbGVzLgorCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19WQzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pIC8qIFdpbjMyIGFuZCBXaW5DRSAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordHlwZWRlZiBIV05EICAgIEZCTmF0aXZlV2luZG93VHlwZTsKKworI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisKKy8vIFJlYWxseSBhIFdpbmRvdyBoYW5kbGUsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIFgxMSBoZWFkZXJzIGhlcmUuCisjaW5jbHVkZSA8c3RkaW50Lmg+Cit0eXBlZGVmIHVpbnQzMl90IEZCTmF0aXZlV2luZG93VHlwZTsKKworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisKK3R5cGVkZWYgdm9pZCogICBGQk5hdGl2ZVdpbmRvd1R5cGU7CisKKyNlbHNlCisjd2FybmluZyAiVW5zdXBwb3J0ZWQgcGxhdGZvcm0iCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfdHlwZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2luY2x1ZGUvT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTAxN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV90eXBlcy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNwcmFnbWEgb25jZQorCisvLyBJbnRlcmZhY2UgYmV0d2VlbiBhbmRyb2lkLWVtdSBub24tYmFzZSBsaWJyYXJpZXMgYW5kIGVtdWdsCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9nb2xkZmlzaF9zeW5jLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mZWF0dXJlY29udHJvbC9GZWF0dXJlQ29udHJvbC5oIgorCisvLyBDcmFzaCByZXBvcnRlcgordHlwZWRlZiB2b2lkICgqZW11Z2xfY3Jhc2hfcmVwb3J0ZXJfdCkoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworCisvLyBGZWF0dXJlIGNvbnRyb2wKK3R5cGVkZWYgYm9vbCAoKmVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZF90KShhbmRyb2lkOjpmZWF0dXJlY29udHJvbDo6RmVhdHVyZSBmZWF0dXJlKTsKKworLy8gR29sZGZpc2ggc3luYyBkZXZpY2UKK3R5cGVkZWYgdWludDY0X3QgKCplbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZV90KSgpOwordHlwZWRlZiBpbnQgKCplbXVnbF9zeW5jX2NyZWF0ZV9mZW5jZV90KSh1aW50NjRfdCB0aW1lbGluZSwgdWludDMyX3QgcHQpOwordHlwZWRlZiB2b2lkICgqZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCkodWludDY0X3QgdGltZWxpbmUsIHVpbnQzMl90IGhvd211Y2gpOwordHlwZWRlZiB2b2lkICgqZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lX3QpKHVpbnQ2NF90IHRpbWVsaW5lKTsKKwordHlwZWRlZiB2b2lkICgqZW11Z2xfc3luY190cmlnZ2VyX3dhaXRfdCkodWludDY0X3QgZ2xzeW5jLCB1aW50NjRfdCB0aHJlYWQsIHVpbnQ2NF90IHRpbWVsaW5lKTsKK3R5cGVkZWYgdm9pZCAoKmVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0X3QpKGVtdWdsX3N5bmNfdHJpZ2dlcl93YWl0X3QgdHJpZ2dlcl9mbik7CisKK3R5cGVkZWYgYm9vbCAoKmVtdWdsX3N5bmNfZGV2aWNlX2V4aXN0c190KSgpOworCisvLyBPcGVuR0wgdGltZXN0YW1wZWQgbG9nZ2VyCit0eXBlZGVmIHZvaWQgKCplbXVnbF9sb2dnZXJfdCkoY29uc3QgY2hhciogZm10LCAuLi4pOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGVtdWdsX2xvZ2dlcl90IGNvYXJzZTsKKyAgICBlbXVnbF9sb2dnZXJfdCBmaW5lOworfSBlbXVnbF9sb2dnZXJfc3RydWN0OworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmEyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyBob3N0IGxpYnJhcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyQoY2FsbCBlbXVnbC1iZWdpbi1zdGF0aWMtbGlicmFyeSxsaWJHTEVTdjFfZGVjKQorCiskKGNhbGwgZW11Z2wtaW1wb3J0LCBsaWJPcGVuZ2xDb2RlY0NvbW1vbikKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ19JTkNMVURFUywkKExPQ0FMX1BBVEgpKQorCiskKGNhbGwgZW11Z2wtZ2VuLWRlY29kZXIsJChMT0NBTF9QQVRIKSxnbGVzMSkKKworTE9DQUxfU1JDX0ZJTEVTIDo9IEdMRVN2MURlY29kZXIuY3BwCisKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ0ZMQUdTLCQoRU1VR0xfVVNFUl9DRkxBR1MpKQorJChjYWxsIGVtdWdsLWV4cG9ydCxMRExJQlMsJChDWFhfU1REX0xJQikpCisKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL0dMRVN2MURlY29kZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL0dMRVN2MURlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjI3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvR0xFU3YxRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiR0xFU3YxRGVjb2Rlci5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQqIFNhZmVQb2ludGVyRnJvbVVJbnQoR0x1aW50IHZhbHVlKSB7CisgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCl2YWx1ZTsKK30KKworR0xFU3YxRGVjb2Rlcjo6R0xFU3YxRGVjb2RlcigpCit7CisgICAgbV9jb250ZXh0RGF0YSA9IE5VTEw7CisgICAgbV9nbGVzRHNvID0gTlVMTDsKK30KKworR0xFU3YxRGVjb2Rlcjo6fkdMRVN2MURlY29kZXIoKQoreworICAgIGlmIChtX2dsZXNEc28gIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbV9nbGVzRHNvOworICAgIH0KK30KKworCitpbnQgR0xFU3YxRGVjb2Rlcjo6aW5pdEdMKGdldF9wcm9jX2Z1bmNfdCBnZXRQcm9jRnVuYywgdm9pZCAqZ2V0UHJvY0Z1bmNEYXRhKQoreworICAgIHRoaXMtPmluaXREaXNwYXRjaEJ5TmFtZShnZXRQcm9jRnVuYywgZ2V0UHJvY0Z1bmNEYXRhKTsKKworICAgIGdsR2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gc19nbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czsKKyAgICBnbFZlcnRleFBvaW50ZXJPZmZzZXQgPSBzX2dsVmVydGV4UG9pbnRlck9mZnNldDsKKyAgICBnbENvbG9yUG9pbnRlck9mZnNldCA9IHNfZ2xDb2xvclBvaW50ZXJPZmZzZXQ7CisgICAgZ2xOb3JtYWxQb2ludGVyT2Zmc2V0ID0gc19nbE5vcm1hbFBvaW50ZXJPZmZzZXQ7CisgICAgZ2xUZXhDb29yZFBvaW50ZXJPZmZzZXQgPSBzX2dsVGV4Q29vcmRQb2ludGVyT2Zmc2V0OworICAgIGdsUG9pbnRTaXplUG9pbnRlck9mZnNldCA9IHNfZ2xQb2ludFNpemVQb2ludGVyT2Zmc2V0OworICAgIGdsV2VpZ2h0UG9pbnRlck9mZnNldCA9IHNfZ2xXZWlnaHRQb2ludGVyT2Zmc2V0OworICAgIGdsTWF0cml4SW5kZXhQb2ludGVyT2Zmc2V0ID0gc19nbE1hdHJpeEluZGV4UG9pbnRlck9mZnNldDsKKworICAgIGdsVmVydGV4UG9pbnRlckRhdGEgPSBzX2dsVmVydGV4UG9pbnRlckRhdGE7CisgICAgZ2xDb2xvclBvaW50ZXJEYXRhID0gc19nbENvbG9yUG9pbnRlckRhdGE7CisgICAgZ2xOb3JtYWxQb2ludGVyRGF0YSA9IHNfZ2xOb3JtYWxQb2ludGVyRGF0YTsKKyAgICBnbFRleENvb3JkUG9pbnRlckRhdGEgPSBzX2dsVGV4Q29vcmRQb2ludGVyRGF0YTsKKyAgICBnbFBvaW50U2l6ZVBvaW50ZXJEYXRhID0gc19nbFBvaW50U2l6ZVBvaW50ZXJEYXRhOworICAgIGdsV2VpZ2h0UG9pbnRlckRhdGEgPSBzX2dsV2VpZ2h0UG9pbnRlckRhdGE7CisgICAgZ2xNYXRyaXhJbmRleFBvaW50ZXJEYXRhID0gc19nbE1hdHJpeEluZGV4UG9pbnRlckRhdGE7CisKKyAgICBnbERyYXdFbGVtZW50c09mZnNldCA9IHNfZ2xEcmF3RWxlbWVudHNPZmZzZXQ7CisgICAgZ2xEcmF3RWxlbWVudHNEYXRhID0gc19nbERyYXdFbGVtZW50c0RhdGE7CisgICAgZ2xGaW5pc2hSb3VuZFRyaXAgPSBzX2dsRmluaXNoUm91bmRUcmlwOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBHTEVTdjFEZWNvZGVyOjpzX2dsRmluaXNoUm91bmRUcmlwKHZvaWQgKnNlbGYpCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xGaW5pc2goKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBHTEVTdjFEZWNvZGVyOjpzX2dsVmVydGV4UG9pbnRlck9mZnNldCh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgU2FmZVBvaW50ZXJGcm9tVUludChvZmZzZXQpKTsKK30KKwordm9pZCBHTEVTdjFEZWNvZGVyOjpzX2dsQ29sb3JQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IG9mZnNldCkKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKXNlbGY7CisgICAgY3R4LT5nbENvbG9yUG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIFNhZmVQb2ludGVyRnJvbVVJbnQob2Zmc2V0KSk7Cit9CisKK3ZvaWQgR0xFU3YxRGVjb2Rlcjo6c19nbFRleENvb3JkUG9pbnRlck9mZnNldCh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xUZXhDb29yZFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBTYWZlUG9pbnRlckZyb21VSW50KG9mZnNldCkpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xOb3JtYWxQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IG9mZnNldCkKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKXNlbGY7CisgICAgY3R4LT5nbE5vcm1hbFBvaW50ZXIodHlwZSwgc3RyaWRlLCBTYWZlUG9pbnRlckZyb21VSW50KG9mZnNldCkpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xQb2ludFNpemVQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IG9mZnNldCkKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKXNlbGY7CisgICAgY3R4LT5nbFBvaW50U2l6ZVBvaW50ZXJPRVModHlwZSwgc3RyaWRlLCBTYWZlUG9pbnRlckZyb21VSW50KG9mZnNldCkpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xXZWlnaHRQb2ludGVyT2Zmc2V0KHZvaWQgKiBzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xXZWlnaHRQb2ludGVyT0VTKHNpemUsIHR5cGUsIHN0cmlkZSwgU2FmZVBvaW50ZXJGcm9tVUludChvZmZzZXQpKTsKK30KKwordm9pZCBHTEVTdjFEZWNvZGVyOjpzX2dsTWF0cml4SW5kZXhQb2ludGVyT2Zmc2V0KHZvaWQgKiBzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoc2l6ZSwgdHlwZSwgc3RyaWRlLCBTYWZlUG9pbnRlckZyb21VSW50KG9mZnNldCkpOworfQorCisKKworI2RlZmluZSBTVE9SRV9QT0lOVEVSX0RBVEFfT1JfQUJPUlQobG9jYXRpb24pICAgIFwKKyAgICBpZiAoY3R4LT5tX2NvbnRleHREYXRhICE9IE5VTEwpIHsgICBcCisgICAgICAgIGN0eC0+bV9jb250ZXh0RGF0YS0+c3RvcmVQb2ludGVyRGF0YSgobG9jYXRpb24pLCBkYXRhLCBkYXRhbGVuKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgcmV0dXJuOyBcCisgICAgfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xWZXJ0ZXhQb2ludGVyRGF0YSh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKworICAgIFNUT1JFX1BPSU5URVJfREFUQV9PUl9BQk9SVChHTERlY29kZXJDb250ZXh0RGF0YTo6VkVSVEVYX0xPQ0FUSU9OKTsKKworICAgIGN0eC0+Z2xWZXJ0ZXhQb2ludGVyKHNpemUsIHR5cGUsIDAsIGN0eC0+bV9jb250ZXh0RGF0YS0+cG9pbnRlckRhdGEoR0xEZWNvZGVyQ29udGV4dERhdGE6OlZFUlRFWF9MT0NBVElPTikpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xDb2xvclBvaW50ZXJEYXRhKHZvaWQgKnNlbGYsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqZGF0YSwgR0x1aW50IGRhdGFsZW4pCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworCisgICAgU1RPUkVfUE9JTlRFUl9EQVRBX09SX0FCT1JUKEdMRGVjb2RlckNvbnRleHREYXRhOjpDT0xPUl9MT0NBVElPTik7CisKKyAgICBjdHgtPmdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIDAsIGN0eC0+bV9jb250ZXh0RGF0YS0+cG9pbnRlckRhdGEoR0xEZWNvZGVyQ29udGV4dERhdGE6OkNPTE9SX0xPQ0FUSU9OKSk7Cit9CisKK3ZvaWQgR0xFU3YxRGVjb2Rlcjo6c19nbFRleENvb3JkUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0xpbnQgdW5pdCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbikKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKXNlbGY7CisgICAgU1RPUkVfUE9JTlRFUl9EQVRBX09SX0FCT1JUKChHTERlY29kZXJDb250ZXh0RGF0YTo6UG9pbnRlckRhdGFMb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdMRGVjb2RlckNvbnRleHREYXRhOjpURVhDT09SRDBfTE9DQVRJT04gKyB1bml0KSk7CisKKyAgICBjdHgtPmdsVGV4Q29vcmRQb2ludGVyKHNpemUsIHR5cGUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1fY29udGV4dERhdGEtPnBvaW50ZXJEYXRhKChHTERlY29kZXJDb250ZXh0RGF0YTo6UG9pbnRlckRhdGFMb2NhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdMRGVjb2RlckNvbnRleHREYXRhOjpURVhDT09SRDBfTE9DQVRJT04gKyB1bml0KSkpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xOb3JtYWxQb2ludGVyRGF0YSh2b2lkICpzZWxmLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKworICAgIFNUT1JFX1BPSU5URVJfREFUQV9PUl9BQk9SVChHTERlY29kZXJDb250ZXh0RGF0YTo6Tk9STUFMX0xPQ0FUSU9OKTsKKworICAgIGN0eC0+Z2xOb3JtYWxQb2ludGVyKHR5cGUsIDAsIGN0eC0+bV9jb250ZXh0RGF0YS0+cG9pbnRlckRhdGEoR0xEZWNvZGVyQ29udGV4dERhdGE6Ok5PUk1BTF9MT0NBVElPTikpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xQb2ludFNpemVQb2ludGVyRGF0YSh2b2lkICpzZWxmLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKworICAgIFNUT1JFX1BPSU5URVJfREFUQV9PUl9BQk9SVChHTERlY29kZXJDb250ZXh0RGF0YTo6UE9JTlRTSVpFX0xPQ0FUSU9OKTsKKworICAgIGN0eC0+Z2xQb2ludFNpemVQb2ludGVyT0VTKHR5cGUsIDAsIGN0eC0+bV9jb250ZXh0RGF0YS0+cG9pbnRlckRhdGEoR0xEZWNvZGVyQ29udGV4dERhdGE6OlBPSU5UU0laRV9MT0NBVElPTikpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xXZWlnaHRQb2ludGVyRGF0YSh2b2lkICogc2VsZiwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCit7CisgICAgR0xFU3YxRGVjb2RlciAqY3R4ID0gKEdMRVN2MURlY29kZXIgKilzZWxmOworCisgICAgU1RPUkVfUE9JTlRFUl9EQVRBX09SX0FCT1JUKEdMRGVjb2RlckNvbnRleHREYXRhOjpXRUlHSFRfTE9DQVRJT04pOworCisgICAgY3R4LT5nbFdlaWdodFBvaW50ZXJPRVMoc2l6ZSwgdHlwZSwgMCwgY3R4LT5tX2NvbnRleHREYXRhLT5wb2ludGVyRGF0YShHTERlY29kZXJDb250ZXh0RGF0YTo6V0VJR0hUX0xPQ0FUSU9OKSk7Cit9CisKK3ZvaWQgR0xFU3YxRGVjb2Rlcjo6c19nbE1hdHJpeEluZGV4UG9pbnRlckRhdGEodm9pZCAqIHNlbGYsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKworICAgIFNUT1JFX1BPSU5URVJfREFUQV9PUl9BQk9SVChHTERlY29kZXJDb250ZXh0RGF0YTo6TUFUUklYSU5ERVhfTE9DQVRJT04pOworCisgICAgY3R4LT5nbE1hdHJpeEluZGV4UG9pbnRlck9FUyhzaXplLCB0eXBlLCAwLCBjdHgtPm1fY29udGV4dERhdGEtPnBvaW50ZXJEYXRhKEdMRGVjb2RlckNvbnRleHREYXRhOjpNQVRSSVhJTkRFWF9MT0NBVElPTikpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xEcmF3RWxlbWVudHNPZmZzZXQodm9pZCAqc2VsZiwgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTHVpbnQgb2Zmc2V0KQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKyAgICBjdHgtPmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCBTYWZlUG9pbnRlckZyb21VSW50KG9mZnNldCkpOworfQorCit2b2lkIEdMRVN2MURlY29kZXI6OnNfZ2xEcmF3RWxlbWVudHNEYXRhKHZvaWQgKnNlbGYsIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MURlY29kZXIgKmN0eCA9IChHTEVTdjFEZWNvZGVyICopc2VsZjsKKyAgICBjdHgtPmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCBkYXRhKTsKK30KKwordm9pZCBHTEVTdjFEZWNvZGVyOjpzX2dsR2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKHZvaWQgKnNlbGYsIEdMaW50IGNvdW50LCBHTGludCAqZGF0YSkKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKSBzZWxmOworICAgIGN0eC0+Z2xHZXRJbnRlZ2VydihHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgZGF0YSk7Cit9CisKK3ZvaWQgKkdMRVN2MURlY29kZXI6OnNfZ2V0UHJvYyhjb25zdCBjaGFyICpuYW1lLCB2b2lkICp1c2VyRGF0YSkKK3sKKyAgICBHTEVTdjFEZWNvZGVyICpjdHggPSAoR0xFU3YxRGVjb2RlciAqKXVzZXJEYXRhOworCisgICAgaWYgKGN0eCA9PSBOVUxMIHx8IGN0eC0+bV9nbGVzRHNvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdm9pZCAqZnVuYyA9IE5VTEw7CisjaWZkZWYgVVNFX0VHTF9HRVRQUk9DQUREUkVTUworICAgIGZ1bmMgPSAodm9pZCAqKSBlZ2xHZXRQcm9jQWRkcmVzcyhuYW1lKTsKKyNlbmRpZgorICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgZnVuYyA9ICh2b2lkICopKGN0eC0+bV9nbGVzRHNvLT5maW5kU3ltYm9sKG5hbWUpKTsKKyAgICB9CisgICAgcmV0dXJuIGZ1bmM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvR0xFU3YxRGVjb2Rlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL0dMRVN2MURlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzdhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL0dMRVN2MURlY29kZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfR0xfREVDT0RFUl9IXworI2RlZmluZSBfR0xfREVDT0RFUl9IXworCisjaW5jbHVkZSAiZ2xlczFfZGVjLmgiCisKKyNpbmNsdWRlICJHTERlY29kZXJDb250ZXh0RGF0YS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorCitjbGFzcyBHTEVTdjFEZWNvZGVyIDogcHVibGljIGdsZXMxX2RlY29kZXJfY29udGV4dF90Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkICooKmdldF9wcm9jX2Z1bmNfdCkoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpOworCisgICAgR0xFU3YxRGVjb2RlcigpOworICAgIH5HTEVTdjFEZWNvZGVyKCk7CisgICAgaW50IGluaXRHTChnZXRfcHJvY19mdW5jX3QgZ2V0UHJvY0Z1bmMsIHZvaWQgKmdldFByb2NGdW5jRGF0YSk7CisgICAgdm9pZCBzZXRDb250ZXh0RGF0YShHTERlY29kZXJDb250ZXh0RGF0YSAqY29udGV4dERhdGEpIHsgbV9jb250ZXh0RGF0YSA9IGNvbnRleHREYXRhOyB9CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyh2b2lkICogc2VsZiwgR0xpbnQgY29udCwgR0xpbnQgKmRhdGEpOworICAgIHN0YXRpYyB2b2lkIGdsZXMxX0FQSUVOVFJZIHNfZ2xWZXJ0ZXhQb2ludGVyRGF0YSh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKTsKKyAgICBzdGF0aWMgdm9pZCBnbGVzMV9BUElFTlRSWSBzX2dsVmVydGV4UG9pbnRlck9mZnNldCh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpOworCisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbENvbG9yUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbENvbG9yUG9pbnRlck9mZnNldCh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpOworCisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbFRleENvb3JkUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0xpbnQgdW5pdCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbFRleENvb3JkUG9pbnRlck9mZnNldCh2b2lkICpzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdWludCBvZmZzZXQpOworCisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbE5vcm1hbFBvaW50ZXJEYXRhKHZvaWQgKnNlbGYsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqZGF0YSwgR0x1aW50IGRhdGFsZW4pOworICAgIHN0YXRpYyB2b2lkIGdsZXMxX0FQSUVOVFJZIHNfZ2xOb3JtYWxQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x1aW50IG9mZnNldCk7CisKKyAgICBzdGF0aWMgdm9pZCBnbGVzMV9BUElFTlRSWSBzX2dsUG9pbnRTaXplUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbFBvaW50U2l6ZVBvaW50ZXJPZmZzZXQodm9pZCAqc2VsZiwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgb2Zmc2V0KTsKKworICAgIHN0YXRpYyB2b2lkIGdsZXMxX0FQSUVOVFJZIHNfZ2xEcmF3RWxlbWVudHNPZmZzZXQodm9pZCAqc2VsZiwgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTHVpbnQgb2Zmc2V0KTsKKyAgICBzdGF0aWMgdm9pZCBnbGVzMV9BUElFTlRSWSBzX2dsRHJhd0VsZW1lbnRzRGF0YSh2b2lkICpzZWxmLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisKKyAgICBzdGF0aWMgdm9pZCBnbGVzMV9BUElFTlRSWSBzX2dsV2VpZ2h0UG9pbnRlckRhdGEodm9pZCAqIHNlbGYsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKTsKKyAgICBzdGF0aWMgdm9pZCBnbGVzMV9BUElFTlRSWSBzX2dsV2VpZ2h0UG9pbnRlck9mZnNldCh2b2lkICogc2VsZiwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgb2Zmc2V0KTsKKworICAgIHN0YXRpYyB2b2lkIGdsZXMxX0FQSUVOVFJZIHNfZ2xNYXRyaXhJbmRleFBvaW50ZXJEYXRhKHZvaWQgKiBzZWxmLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisgICAgc3RhdGljIHZvaWQgZ2xlczFfQVBJRU5UUlkgc19nbE1hdHJpeEluZGV4UG9pbnRlck9mZnNldCh2b2lkICogc2VsZiwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHVpbnQgb2Zmc2V0KTsKKworICAgIHN0YXRpYyBpbnQgZ2xlczFfQVBJRU5UUlkgc19nbEZpbmlzaFJvdW5kVHJpcCh2b2lkICpzZWxmKTsKKworICAgIHN0YXRpYyB2b2lkICogc19nZXRQcm9jKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnVzZXJEYXRhKTsKKworICAgIEdMRGVjb2RlckNvbnRleHREYXRhICptX2NvbnRleHREYXRhOworICAgIGVtdWdsOjpTaGFyZWRMaWJyYXJ5KiBtX2dsZXNEc287Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS5hZGRvbiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS5hZGRvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzMxZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL2dsZXMxLmFkZG9uCkBAIC0wLDAgKzEsMTUgQEAKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlck9mZnNldCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3JQb2ludGVyT2Zmc2V0LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KQorR0xfRU5UUlkodm9pZCwgZ2xOb3JtYWxQb2ludGVyT2Zmc2V0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemVQb2ludGVyT2Zmc2V0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KQorR0xfRU5UUlkodm9pZCwgZ2xUZXhDb29yZFBvaW50ZXJPZmZzZXQsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIEdMdWludCBvZmZzZXQpCisKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlckRhdGEsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbikKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3JQb2ludGVyRGF0YSwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorR0xfRU5UUlkodm9pZCwgZ2xOb3JtYWxQb2ludGVyRGF0YSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhDb29yZFBvaW50ZXJEYXRhLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZVBvaW50ZXJEYXRhLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCisKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd0VsZW1lbnRzT2Zmc2V0LCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMdWludCBvZmZzZXQpOworR0xfRU5UUlkodm9pZCwgZ2xEcmF3RWxlbWVudHNEYXRhLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKTsKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL2dsZXMxLmF0dHJpYiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS5hdHRyaWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4OWJkNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS5hdHRyaWIKQEAgLTAsMCArMSw2OTQgQEAKK0dMT0JBTAorCWJhc2Vfb3Bjb2RlIDEwMjQKKwllbmNvZGVyX2hlYWRlcnMgImdsVXRpbHMuaCIgIkdMRW5jb2RlclV0aWxzLmgiCisJCisjdm9pZCBnbENsaXBQbGFuZWYoR0xlbnVtIHBsYW5lLCBHTGZsb2F0ICplcXVhdGlvbikKK2dsQ2xpcFBsYW5lZgorICBkaXIgZXF1YXRpb24gaW4KKwlsZW4gZXF1YXRpb24gKDQgKiBzaXplb2YoZmxvYXQpKQorCisjdm9pZCBnbEZvZ2Z2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xGb2dmdgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsR2V0RmxvYXR2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xHZXRMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCitnbEdldExpZ2h0ZnYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbEdldE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xHZXRNYXRlcmlhbGZ2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xHZXRUZXhFbnZmdihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsR2V0VGV4RW52ZnYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xHZXRUZXhQYXJhbWV0ZXJmdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmbG9hdCkpCisKKyN2b2lkIGdsTGlnaHRNb2RlbGZ2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xMaWdodE1vZGVsZnYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCitnbExpZ2h0ZnYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xMb2FkTWF0cml4ZihHTGZsb2F0ICptKQorZ2xMb2FkTWF0cml4ZgorCWxlbiBtICgxNiAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xNYXRlcmlhbGZ2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsTWF0ZXJpYWxmdgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbE11bHRNYXRyaXhmKEdMZmxvYXQgKm0pCitnbE11bHRNYXRyaXhmCisJbGVuIG0gKDE2ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCitnbFBvaW50UGFyYW1ldGVyZnYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xUZXhFbnZmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsVGV4RW52ZnYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsVGV4UGFyYW1ldGVyZnYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpCitnbEJ1ZmZlckRhdGEKKwlsZW4gZGF0YSBzaXplCisJdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZAorCisjdm9pZCBnbEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIEdMdm9pZCAqZGF0YSkKK2dsQnVmZmVyU3ViRGF0YQorCWRpciBkYXRhIGluCisJbGVuIGRhdGEgc2l6ZQorCXZhcl9mbGFnIGRhdGEgbnVsbEFsbG93ZWQKKworI3ZvaWQgZ2xDbGlwUGxhbmV4KEdMZW51bSBwbGFuZSwgR0xmaXhlZCAqZXFuKQorZ2xDbGlwUGxhbmV4CisJZGlyIGVxbiBpbgorCWxlbiBlcW4gKDQgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsQ29sb3JQb2ludGVyKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x2b2lkICpwb2ludGVyKQorI3dlIHRyZWF0IHRoZSBwb2ludGVyIGFzIG9mZnNldCB0byBhIFZCTworZ2xDb2xvclBvaW50ZXIKKwlsZW4gcG9pbnRlciAoc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBHTHZvaWQgKmRhdGEpCitnbENvbXByZXNzZWRUZXhJbWFnZTJECisJbGVuIGRhdGEgaW1hZ2VTaXplCisgICAgdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZAorCisjdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIEdMdm9pZCAqZGF0YSkKK2dsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQKKwlsZW4gZGF0YSBpbWFnZVNpemUKKyAgICAgICAgdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZAorCisjdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpCitnbERlbGV0ZUJ1ZmZlcnMKKwlsZW4gYnVmZmVycyAobiAqIHNpemVvZihHTHVpbnQpKQorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbERlbGV0ZVRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK2dsRGVsZXRlVGV4dHVyZXMKKwlsZW4gdGV4dHVyZXMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3RoaXMgZnVuY3Rpb24gaXMgbWFya2VkIGFzIHVuc3VwcG9ydGVkIC0gaXQgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseQorI2luc3RlYWQgaXQgdHJhbnNsYXRlZCBpbnRvIC0gZ2xEcmF3RGlyZWN0RWxlbWVudHMgYW5kIGdsRHJhd0luZGlyZWN0RWxlbWVudHMKKyN2b2lkIGdsRHJhd0VsZW1lbnRzKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbmRpY2VzKQorZ2xEcmF3RWxlbWVudHMKKwlmbGFnIHVuc3VwcG9ydGVkCisKKworI3ZvaWQgZ2xGb2d4dihHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsRm9neHYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xHZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKQorZ2xHZXRCb29sZWFudgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xib29sZWFuKSkKKworI3ZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldEJ1ZmZlclBhcmFtZXRlcml2CisJbGVuIHBhcmFtcyAoc2l6ZW9mKEdMaW50KSkKKwlkaXIgcGFyYW1zIG91dAorCisjdm9pZCBnbEdlbkJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpCitnbEdlbkJ1ZmZlcnMKKwlsZW4gYnVmZmVycyAobiAqIHNpemVvZihHTHVpbnQpKQorCWRpciBidWZmZXJzIG91dAorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK2dsR2VuVGV4dHVyZXMKKwlsZW4gdGV4dHVyZXMgKG4gKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgdGV4dHVyZXMgb3V0CisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRGaXhlZHYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK2dsR2V0SW50ZWdlcnYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRMaWdodHh2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbEdldExpZ2h0eHYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbEdldE1hdGVyaWFseHYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRNYXRlcmlhbHh2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xHZXRQb2ludGVydihHTGVudW0gcG5hbWUsIHZvaWQgKipwYXJhbXMpCitnbEdldFBvaW50ZXJ2CisJZmxhZyB1bnN1cHBvcnRlZAorCisjR0x1Ynl0ZSogZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpCitnbEdldFN0cmluZworICBmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2V0VGV4RW52aXYoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRUZXhFbnZpdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbEdldFRleEVudnh2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRUZXhFbnZ4dgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRUZXhQYXJhbWV0ZXJpdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsR2V0VGV4UGFyYW1ldGVyeHYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xMaWdodE1vZGVseHYoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbExpZ2h0TW9kZWx4dgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbExpZ2h0eHYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsTGlnaHR4dgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbExvYWRNYXRyaXh4KEdMZml4ZWQgKm0pCitnbExvYWRNYXRyaXh4CisJbGVuIG0gKDE2ICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbE1hdGVyaWFseHYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xNYXRlcmlhbHh2CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsTXVsdE1hdHJpeHgoR0xmaXhlZCAqbSkKK2dsTXVsdE1hdHJpeHgKKwlsZW4gbSAoMTYgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsTm9ybWFsUG9pbnRlcihHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdm9pZCAqcG9pbnRlcikKKyN3ZSB0cmVhdCB0aGUgcG9pbnRlciBhcyBhbiBvZmZzZXQgdG8gYSBWQk8KK2dsTm9ybWFsUG9pbnRlcgorCWxlbiBwb2ludGVyIChzaXplb2YodW5zaWduZWQgaW50KSkKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4dihHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsUG9pbnRQYXJhbWV0ZXJ4dgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbFJlYWRQaXhlbHMoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykKK2dsUmVhZFBpeGVscworCWRpciBwaXhlbHMgb3V0CisJbGVuIHBpeGVscyBnbGVzdjFfZW5jOjpwaXhlbERhdGFTaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgMSkKKworI3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQgKnBvaW50ZXIpCitnbFRleENvb3JkUG9pbnRlcgorCWxlbiBwb2ludGVyIChzaXplb2YodW5zaWduZWQgaW50KSkKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsVGV4RW52aXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xUZXhFbnZpdgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xUZXhFbnZ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsVGV4RW52eHYKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKQorZ2xUZXhJbWFnZTJECisJZGlyIHBpeGVscyBpbgorCWxlbiBwaXhlbHMgZ2xlc3YxX2VuYzo6cGl4ZWxEYXRhU2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIDApCisJdmFyX2ZsYWcgcGl4ZWxzIG51bGxBbGxvd2VkIGlzTGFyZ2UKKworI3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbFRleFBhcmFtZXRlcml2CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbFRleFBhcmFtZXRlcnh2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xUZXhQYXJhbWV0ZXJ4dgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbFRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCitnbFRleFN1YkltYWdlMkQKKwlsZW4gcGl4ZWxzIGdsZXN2MV9lbmM6OnBpeGVsRGF0YVNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCAwKQorICAgICAgICB2YXJfZmxhZyBwaXhlbHMgbnVsbEFsbG93ZWQgaXNMYXJnZQorCisjdm9pZCBnbFZlcnRleFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQgKnBvaW50ZXIpCisjIHdlIHRyZWF0IHRoZSBwb2ludGVyIGFzIGFuIG9mZnNldCB0byBhIFZCTworZ2xWZXJ0ZXhQb2ludGVyCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQgKnBvaW50ZXIpCitnbFBvaW50U2l6ZVBvaW50ZXJPRVMKKwlsZW4gcG9pbnRlciAoc2l6ZW9mKHVuc2lnbmVkIGludCkpCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldENsaXBQbGFuZWYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICogZXFuKQorZ2xHZXRDbGlwUGxhbmVmCisJZGlyIGVxbiBvdXQKKwlsZW4gZXFuICg0ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFZlcnRleFBvaW50ZXJEYXRhKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqZGF0YSwgR0x1aW50IGRhdGFsZW4pCitnbFZlcnRleFBvaW50ZXJEYXRhCisJbGVuIGRhdGEgZGF0YWxlbgorCWN1c3RvbV9wYWNrIGRhdGEgZ2xVdGlsc1BhY2tQb2ludGVyRGF0YSgodW5zaWduZWQgY2hhciAqKXB0ciwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBzaXplLCB0eXBlLCBzdHJpZGUsIGRhdGFsZW4pCisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCisjdm9pZCBnbENvbG9yUG9pbnRlckRhdGEoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbikKK2dsQ29sb3JQb2ludGVyRGF0YQorCWxlbiBkYXRhIGRhdGFsZW4KKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJY3VzdG9tX3BhY2sgZGF0YSBnbFV0aWxzUGFja1BvaW50ZXJEYXRhKCh1bnNpZ25lZCBjaGFyICopcHRyLCAodW5zaWduZWQgY2hhciAqKWRhdGEsIHNpemUsIHR5cGUsIHN0cmlkZSwgZGF0YWxlbikKKwlmbGFnIG5vdF9hcGkKKworI3ZvaWQgZ2xOb3JtYWxQb2ludGVyRGF0YShHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKQorZ2xOb3JtYWxQb2ludGVyRGF0YQorCWxlbiBkYXRhIGRhdGFsZW4KKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJY3VzdG9tX3BhY2sgZGF0YSBnbFV0aWxzUGFja1BvaW50ZXJEYXRhKCh1bnNpZ25lZCBjaGFyICopcHRyLCAodW5zaWduZWQgY2hhciAqKWRhdGEsIDMsIHR5cGUsIHN0cmlkZSwgZGF0YWxlbikKKwlmbGFnIG5vdF9hcGkKKworI3ZvaWQgZ2xQb2ludFNpemVQb2ludGVyRGF0YShHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIHZvaWQgKmRhdGEsIEdMdWludCBkYXRhbGVuKQorZ2xQb2ludFNpemVQb2ludGVyRGF0YQorCWxlbiBkYXRhIGRhdGFsZW4KKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJY3VzdG9tX3BhY2sgZGF0YSBnbFV0aWxzUGFja1BvaW50ZXJEYXRhKCh1bnNpZ25lZCBjaGFyICopcHRyLCAodW5zaWduZWQgY2hhciAqKWRhdGEsIDEsIHR5cGUsIHN0cmlkZSwgZGF0YWxlbikKKwlmbGFnIG5vdF9hcGkKKworI3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXJEYXRhKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgdm9pZCAqZGF0YSwgR0x1aW50IGRhdGFsZW4pCitnbFRleENvb3JkUG9pbnRlckRhdGEKKwlsZW4gZGF0YSBkYXRhbGVuCisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWN1c3RvbV9wYWNrIGRhdGEgZ2xVdGlsc1BhY2tQb2ludGVyRGF0YSgodW5zaWduZWQgY2hhciAqKXB0ciwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBzaXplLCB0eXBlLCBzdHJpZGUsIGRhdGFsZW4pCisJZmxhZyBub3RfYXBpCisKKyN2b2lkIGdsV2VpZ2h0UG9pbnRlckRhdGEoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorZ2xXZWlnaHRQb2ludGVyRGF0YQorICAJbGVuIGRhdGEgZGF0YWxlbgorICAJY3VzdG9tX3BhY2sgZGF0YSBnbFV0aWxzUGFja1BvaW50ZXJEYXRhKCh1bnNpZ25lZCBjaGFyICopcHRyLCAodW5zaWduZWQgY2hhciopZGF0YSwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBkYXRhbGVuKQorICAJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCisjdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlckRhdGEoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorZ2xNYXRyaXhJbmRleFBvaW50ZXJEYXRhCisJbGVuIGRhdGEgZGF0YWxlbgorICAJY3VzdG9tX3BhY2sgZGF0YSBnbFV0aWxzUGFja1BvaW50ZXJEYXRhKCh1bnNpZ25lZCBjaGFyICopcHRyLCAodW5zaWduZWQgY2hhciopZGF0YSwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBkYXRhbGVuKQorICAJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCitnbFZlcnRleFBvaW50ZXJPZmZzZXQKKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJZmxhZyBub3RfYXBpCitnbE5vcm1hbFBvaW50ZXJPZmZzZXQKKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJZmxhZyBub3RfYXBpCitnbFRleENvb3JkUG9pbnRlck9mZnNldAorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKK2dsUG9pbnRTaXplUG9pbnRlck9mZnNldAorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKK2dsQ29sb3JQb2ludGVyT2Zmc2V0CisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorZ2xXZWlnaHRQb2ludGVyT2Zmc2V0CisgICAgZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorZ2xNYXRyaXhJbmRleFBvaW50ZXJPZmZzZXQKKyAgICBmbGFnIGN1c3RvbV9kZWNvZGVyCisJZmxhZyBub3RfYXBpCisKK2dsRHJhd0VsZW1lbnRzRGF0YQorCWxlbiBkYXRhIGRhdGFsZW4KKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJZmxhZyBub3RfYXBpCisKK2dsRHJhd0VsZW1lbnRzT2Zmc2V0CisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCitnbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cworCWRpciBmb3JtYXRzIG91dAorCWxlbiBmb3JtYXRzIChjb3VudCAqIHNpemVvZihHTGludCkpCisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCitnbEZpbmlzaFJvdW5kVHJpcAorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKKworI2dsZXMxIGV4dGVuc2lvbnMKKworI3ZvaWQgZ2xEcmF3VGV4c3ZPRVMoR0xzaG9ydCAqY29vcmRzKQorZ2xEcmF3VGV4c3ZPRVMKKwlsZW4gY29vcmRzICg1ICogc2l6ZW9mKEdMc2hvcnQpKQorCisjdm9pZCBnbERyYXdUZXhpdk9FUyhHTGludCAqY29vcmRzKQorZ2xEcmF3VGV4aXZPRVMKKwlsZW4gY29vcmRzICg1ICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xEcmF3VGV4eHZPRVMoR0xmaXhlZCAqY29vcmRzKQorZ2xEcmF3VGV4eHZPRVMKKwlsZW4gY29vcmRzICg1ICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbERyYXdUZXhmdk9FUyhHTGZsb2F0ICpjb29yZHMpCitnbERyYXdUZXhmdk9FUworCWxlbiBjb29yZHMgKDUgKiBzaXplb2YoR0xmbG9hdCkpCisKKyNnbENsaXBQbGFuZXhPRVMoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICogZXF1YXRpb24pCitnbENsaXBQbGFuZXhPRVMKKwlkaXIgZXF1YXRpb24gaW4KKwlsZW4gZXF1YXRpb24gKDQgKiBzaXplb2YoR0xmaXhlZCkpCisKKyNnbENsaXBQbGFuZXhJTUcoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICogZXF1YXRpb24pCitnbENsaXBQbGFuZXhJTUcKKwlkaXIgZXF1YXRpb24gaW4KKwlsZW4gZXF1YXRpb24gKDQgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsRm9neHZPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbEZvZ3h2T0VTCisJZGlyIHBhcmFtcyBpbgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbEdldENsaXBQbGFuZXhPRVMoR0xlbnVtIHBuYW1lLCAgR0xmaXhlZCAqIGVxbikKK2dsR2V0Q2xpcFBsYW5leE9FUworCWRpciBlcW4gb3V0CisJbGVuIGVxbiAoNCAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xHZXRDbGlwUGxhbmV4KEdMZW51bSBwbmFtZSwgIEdMZml4ZWQgKiBlcW4pCitnbEdldENsaXBQbGFuZXgKKwlkaXIgZXFuIG91dAorCWxlbiBlcW4gKDQgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsR2V0Rml4ZWR2T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRGaXhlZHZPRVMKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbEdldExpZ2h0eHZPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsR2V0TGlnaHR4dk9FUworCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsR2V0TWF0ZXJpYWx4dk9FUyhHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbEdldE1hdGVyaWFseHZPRVMKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbEdldFRleEVudnh2T0VTKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRUZXhFbnZ4dk9FUworCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbEdldFRleFBhcmFtZXRlcnh2T0VTCisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xMaWdodE1vZGVseHZPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbExpZ2h0TW9kZWx4dk9FUworCWRpciBwYXJhbXMgaW4KKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xMaWdodHh2T0VTKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbExpZ2h0eHZPRVMKKwlkaXIgcGFyYW1zIGluCisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsTG9hZE1hdHJpeHhPRVMoR0xmaXhlZCAqbSkKK2dsTG9hZE1hdHJpeHhPRVMKKwlkaXIgbSBpbgorCWxlbiBtICgxNiAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xNYXRlcmlhbHh2T0VTKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsTWF0ZXJpYWx4dk9FUworCWRpciBwYXJhbXMgaW4KKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xNdWx0TWF0cml4eE9FUyhHTGZpeGVkICptKQorZ2xNdWx0TWF0cml4eE9FUworCWRpciBtIGluCisJbGVuIG0gKDE2ICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbFBvaW50UGFyYW1ldGVyeHZPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbFBvaW50UGFyYW1ldGVyeHZPRVMKKwlkaXIgcGFyYW1zIGluCisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmaXhlZCkpCisKKyN2b2lkIGdsVGV4RW52eHZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitnbFRleEVudnh2T0VTCisJZGlyIHBhcmFtcyBpbgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbFRleFBhcmFtZXRlcnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xUZXhQYXJhbWV0ZXJ4dk9FUworCWRpciBwYXJhbXMgaW4KKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKQorZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTCisJZGlyIHJlbmRlcmJ1ZmZlcnMgaW4KKwlsZW4gcmVuZGVyYnVmZmVycyAobiAqIHNpemVvZihHTHVpbnQpKQorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpCitnbEdlblJlbmRlcmJ1ZmZlcnNPRVMKKwlkaXIgcmVuZGVyYnVmZmVycyBvdXQgCisJbGVuIHJlbmRlcmJ1ZmZlcnMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTCisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpCitnbERlbGV0ZUZyYW1lYnVmZmVyc09FUworCWRpciBmcmFtZWJ1ZmZlcnMgaW4KKwlsZW4gZnJhbWVidWZmZXJzIChuICogc2l6ZW9mKEdMdWludCkpCisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpCitnbEdlbkZyYW1lYnVmZmVyc09FUworCWRpciBmcmFtZWJ1ZmZlcnMgb3V0CisJbGVuIGZyYW1lYnVmZmVycyAobiAqIHNpemVvZihHTHVpbnQpKQorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTCisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkKiBnbE1hcEJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKQorZ2xNYXBCdWZmZXJPRVMKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKQorZ2xHZXRCdWZmZXJQb2ludGVydk9FUworCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQgKnBvaW50ZXIpCitnbE1hdHJpeEluZGV4UG9pbnRlck9FUworCWxlbiBwb2ludGVyIChzaXplb2YodW5zaWduZWQgaW50KSkKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMdm9pZCAqcG9pbnRlcikKK2dsV2VpZ2h0UG9pbnRlck9FUworCWxlbiBwb2ludGVyIChzaXplb2YodW5zaWduZWQgaW50KSkKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyNnbFF1ZXJ5TWF0cml4eE9FUyhHTGZpeGVkICogbWFudGlzc2EsIEdMaW50ICogZXhwb25lbnQpCitnbFF1ZXJ5TWF0cml4eE9FUworCWRpciBtYW50aXNzYSBvdXQKKwlsZW4gbWFudGlzc2EgKDE2ICogc2l6ZW9mKEdMZml4ZWQpKQorCWRpciBleHBvbmVudCBvdXQKKwlsZW4gZXhwb25lbnQgKDE2ICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbENsaXBQbGFuZWZPRVMoR0xlbnVtIHBsYW5lLCBHTGZsb2F0ICplcXVhdGlvbikKK2dsQ2xpcFBsYW5lZk9FUworCWRpciBlcXVhdGlvbiBpbgorCWxlbiBlcXVhdGlvbiAoNCAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xDbGlwUGxhbmVmSU1HKEdMZW51bSBwbGFuZSwgR0xmbG9hdCAqZXF1YXRpb24pCitnbENsaXBQbGFuZWZJTUcKKwlkaXIgZXF1YXRpb24gaW4KKwlsZW4gZXF1YXRpb24gKDQgKiBzaXplb2YoR0xmbG9hdCkpCisKKyN2b2lkIGdsR2V0Q2xpcFBsYW5lZk9FUyhHTGVudW0gcG5hbWUsIEdMZmxvYXQgKiBlcW4pCitnbEdldENsaXBQbGFuZWZPRVMKKwlkaXIgZXFuIG91dAorCWxlbiBlcW4gKDQgKiBzaXplb2YoR0xmbG9hdCkpCisKKyN2b2lkIGdsVGV4R2VuZnZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsVGV4R2VuZnZPRVMKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xUZXhHZW5pdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK2dsVGV4R2VuaXZPRVMKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsVGV4R2VueHZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK2dsVGV4R2VueHZPRVMKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZpeGVkKSkKKworI3ZvaWQgZ2xHZXRUZXhHZW5mdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xHZXRUZXhHZW5mdk9FUworCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbEdldFRleEdlbml2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRUZXhHZW5pdk9FUworCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRUZXhHZW54dk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorZ2xHZXRUZXhHZW54dk9FUworCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZml4ZWQpKQorCisjdm9pZCBnbERlbGV0ZVZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKQorZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMKKwlkaXIgYXJyYXlzIGluCisJbGVuIGFycmF5cyAobiAqIHNpemVvZihHTHVpbnQpKQorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKQorZ2xHZW5WZXJ0ZXhBcnJheXNPRVMKKwlkaXIgYXJyYXlzIG91dAorCWxlbiBhcnJheXMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3ZvaWQgZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cykKK2dsRGlzY2FyZEZyYW1lYnVmZmVyRVhUCisJZGlyIGF0dGFjaG1lbnRzIGluCisJbGVuIGF0dGFjaG1lbnRzIChudW1BdHRhY2htZW50cyAqIHNpemVvZihjb25zdCBHTGVudW0pKQorCisjdm9pZCBnbE11bHRpRHJhd0FycmF5c0VYVChHTGVudW0gbW9kZSwgY29uc3QgR0xpbnQgKmZpcnN0LCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpCitnbE11bHRpRHJhd0FycmF5c0VYVAorCWZsYWcgdW5zdXBwb3J0ZWQKKwkKKyN2b2lkIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBjb25zdCAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpCitnbE11bHRpRHJhd0VsZW1lbnRzRVhUCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbE11bHRpRHJhd0FycmF5c1NVTihHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpCitnbE11bHRpRHJhd0FycmF5c1NVTgorCWZsYWcgdW5zdXBwb3J0ZWQKKwkKKyN2b2lkIGdsTXVsdGlEcmF3RWxlbWVudHNTVU4oR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpCitnbE11bHRpRHJhd0VsZW1lbnRzU1VOCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbERlbGV0ZUZlbmNlc05WKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpCitnbERlbGV0ZUZlbmNlc05WCisJZGlyIGZlbmNlcyBpbgorCWxlbiBmZW5jZXMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3ZvaWQgZ2xHZW5GZW5jZXNOVihHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKQorZ2xHZW5GZW5jZXNOVgorCWRpciBmZW5jZXMgaW4KKwlsZW4gZmVuY2VzIChuICogc2l6ZW9mKEdMdWludCkpCisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsR2V0RmVuY2Vpdk5WKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRGZW5jZWl2TlYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXREcml2ZXJDb250cm9sc1FDT00oR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKQorZ2xHZXREcml2ZXJDb250cm9sc1FDT00KKwlkaXIgbnVtIG91dAorCWxlbiBudW0gKDEgKiBzaXplb2YoR0xpbnQpKQorCWRpciBkcml2ZXJDb250cm9scyBvdXQKKwlsZW4gZHJpdmVyQ29udHJvbHMgKHNpemUgKiBzaXplb2YoR0x1aW50KSkKKworI3ZvaWQgZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZykKK2dsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00KKwlkaXIgbGVuZ3RoIG91dAorCWxlbiBsZW5ndGggKDEgKiBzaXplb2YoR0xzaXplaSkpCisJZGlyIGRyaXZlckNvbnRyb2xTdHJpbmcgb3V0CisJbGVuIGRyaXZlckNvbnRyb2xTdHJpbmcgKDEgKiBzaXplb2YoR0xjaGFyKSkKKworI3ZvaWQgZ2xFeHRHZXRUZXh0dXJlc1FDT00oR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcykKK2dsRXh0R2V0VGV4dHVyZXNRQ09NCisJZGlyIHRleHR1cmVzIG91dAorCWxlbiB0ZXh0dXJlcyAobWF4VGV4dHVyZXMgKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgbnVtVGV4dHVyZXMgb3V0CisJbGVuIG51bVRleHR1cmVzICgxICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xFeHRHZXRCdWZmZXJzUUNPTShHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKQorZ2xFeHRHZXRCdWZmZXJzUUNPTQorCWRpciBidWZmZXJzIG91dAorCWxlbiBidWZmZXJzIChtYXhCdWZmZXJzICogc2l6ZW9mKEdMdWludCkpCisJZGlyIG51bUJ1ZmZlcnMgb3V0CisJbGVuIG51bUJ1ZmZlcnMgKDEgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpCitnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NCisJZGlyIHJlbmRlcmJ1ZmZlcnMgb3V0CisJbGVuIHJlbmRlcmJ1ZmZlcnMgKG1heFJlbmRlcmJ1ZmZlcnMgKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgbnVtUmVuZGVyYnVmZmVycyBvdXQKKwlsZW4gbnVtUmVuZGVyYnVmZmVycyAoMSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTShHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKQorZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NCisJZGlyIGZyYW1lYnVmZmVycyBvdXQKKwlsZW4gZnJhbWVidWZmZXJzIChtYXhGcmFtZWJ1ZmZlcnMgKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgbnVtRnJhbWVidWZmZXJzIG91dAorCWxlbiBudW1GcmFtZWJ1ZmZlcnMgKDEgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK2dsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00KKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00oR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpCitnbEV4dEdldFRleFN1YkltYWdlUUNPTQorCWRpciB0ZXhlbHMgb3V0CisJbGVuIHRleGVscyAoZGVwdGggKiBnbGVzdjFfZW5jOjpwaXhlbERhdGFTaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgMCkpCisKKyN2b2lkIGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcykKK2dsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldFNoYWRlcnNRQ09NKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpCitnbEV4dEdldFNoYWRlcnNRQ09NCisJZGlyIHNoYWRlcnMgb3V0CisJbGVuIHNoYWRlcnMgKG1heFNoYWRlcnMgKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgbnVtU2hhZGVycyBvdXQKKwlsZW4gbnVtU2hhZGVycyAoMSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsRXh0R2V0UHJvZ3JhbXNRQ09NKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpCitnbEV4dEdldFByb2dyYW1zUUNPTQorCWRpciBwcm9ncmFtcyBvdXQKKwlsZW4gcHJvZ3JhbXMgKG1heFByb2dyYW1zICogc2l6ZW9mKEdMdWludCkpCisJZGlyIG51bVByb2dyYW1zIG91dAorCWxlbiBudW1Qcm9ncmFtcyAoMSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00oR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGNoYXIgKnNvdXJjZSwgR0xpbnQgKmxlbmd0aCkKK2dsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00KKwlmbGFnIHVuc3VwcG9ydGVkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvZ2xlczEuaW4gYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvZ2xlczEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkNTQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS5pbgpAQCAtMCwwICsxLDI5OCBAQAorR0xfRU5UUlkodm9pZCwgZ2xBbHBoYUZ1bmMsIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpCitHTF9FTlRSWSh2b2lkLCBnbENsZWFyQ29sb3IsIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoZiwgR0xjbGFtcGYgZGVwdGgpCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWYsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCitHTF9FTlRSWSh2b2lkLCBnbENvbG9yNGYsIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpCitHTF9FTlRSWSh2b2lkLCBnbERlcHRoUmFuZ2VmLCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikKK0dMX0VOVFJZKHZvaWQsIGdsRm9nZiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xGb2dmdiwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEZydXN0dW1mLCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRDbGlwUGxhbmVmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIGVxbikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RmxvYXR2LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TGlnaHRmdiwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TWF0ZXJpYWxmdiwgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZmdiwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbGYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbGZ2LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRmLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRmdiwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoLCBHTGZsb2F0IHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xMb2FkTWF0cml4ZiwgY29uc3QgR0xmbG9hdCAqbSkKK0dMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWxmLCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbGZ2LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbE11bHRNYXRyaXhmLCBjb25zdCBHTGZsb2F0ICptKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNGYsIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkKK0dMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM2YsIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopCitHTF9FTlRSWSh2b2lkLCBnbE9ydGhvZiwgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyZnYsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemUsIEdMZmxvYXQgc2l6ZSkKK0dMX0VOVFJZKHZvaWQsIGdsUG9seWdvbk9mZnNldCwgR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpCitHTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZWYsIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCitHTF9FTlRSWSh2b2lkLCBnbFNjYWxlZiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52ZiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZmdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcmYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyZnYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xUcmFuc2xhdGVmLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQorR0xfRU5UUlkodm9pZCwgZ2xBY3RpdmVUZXh0dXJlLCBHTGVudW0gdGV4dHVyZSkKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeCwgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKK0dMX0VOVFJZKHZvaWQsIGdsQmluZEJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIGdsQmluZFRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKQorR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEZ1bmMsIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikKK0dMX0VOVFJZKHZvaWQsIGdsQnVmZmVyRGF0YSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSkKK0dMX0VOVFJZKHZvaWQsIGdsQnVmZmVyU3ViRGF0YSwgR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXIsIEdMYml0ZmllbGQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcngsIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoeCwgR0xjbGFtcHggZGVwdGgpCitHTF9FTlRSWSh2b2lkLCBnbENsZWFyU3RlbmNpbCwgR0xpbnQgcykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgR0xlbnVtIHRleHR1cmUpCitHTF9FTlRSWSh2b2lkLCBnbENvbG9yNHViLCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xDb2xvcjR4LCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xDb2xvck1hc2ssIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSkKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3JQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKK0dMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpCitHTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpCitHTF9FTlRSWSh2b2lkLCBnbENvcHlUZXhJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xDdWxsRmFjZSwgR0xlbnVtIG1vZGUpCitHTF9FTlRSWSh2b2lkLCBnbERlbGV0ZUJ1ZmZlcnMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVUZXh0dXJlcywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aEZ1bmMsIEdMZW51bSBmdW5jKQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aE1hc2ssIEdMYm9vbGVhbiBmbGFnKQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdleCwgR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGUsIEdMZW51bSBjYXApCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGVDbGllbnRTdGF0ZSwgR0xlbnVtIGFycmF5KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3QXJyYXlzLCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdFbGVtZW50cywgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpCitHTF9FTlRSWSh2b2lkLCBnbEVuYWJsZSwgR0xlbnVtIGNhcCkKK0dMX0VOVFJZKHZvaWQsIGdsRW5hYmxlQ2xpZW50U3RhdGUsIEdMZW51bSBhcnJheSkKK0dMX0VOVFJZKHZvaWQsIGdsRmluaXNoLCB2b2lkKQorR0xfRU5UUlkodm9pZCwgZ2xGbHVzaCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsRm9neCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xGb2d4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEZyb250RmFjZSwgR0xlbnVtIG1vZGUpCitHTF9FTlRSWSh2b2lkLCBnbEZydXN0dW14LCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRCb29sZWFudiwgR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xpcFBsYW5leCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICogZXFuKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5CdWZmZXJzLCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykKK0dMX0VOVFJZKHZvaWQsIGdsR2VuVGV4dHVyZXMsIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK0dMX0VOVFJZKEdMZW51bSwgZ2xHZXRFcnJvciwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Rml4ZWR2LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0SW50ZWdlcnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TGlnaHR4diwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TWF0ZXJpYWx4diwgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRQb2ludGVydiwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMpCitHTF9FTlRSWShjb25zdCBHTHVieXRlICosIGdsR2V0U3RyaW5nLCBHTGVudW0gbmFtZSkKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VGV4RW52aXYsIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VGV4RW52eHYsIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEhpbnQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzQnVmZmVyLCBHTHVpbnQgYnVmZmVyKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRW5hYmxlZCwgR0xlbnVtIGNhcCkKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1RleHR1cmUsIEdMdWludCB0ZXh0dXJlKQorR0xfRU5UUlkodm9pZCwgZ2xMaWdodE1vZGVseCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xMaWdodE1vZGVseHYsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xMaWdodHgsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xMaWdodHh2LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGh4LCBHTGZpeGVkIHdpZHRoKQorR0xfRU5UUlkodm9pZCwgZ2xMb2FkSWRlbnRpdHksIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbExvYWRNYXRyaXh4LCBjb25zdCBHTGZpeGVkICptKQorR0xfRU5UUlkodm9pZCwgZ2xMb2dpY09wLCBHTGVudW0gb3Bjb2RlKQorR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbHgsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseHYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTWF0cml4TW9kZSwgR0xlbnVtIG1vZGUpCitHTF9FTlRSWSh2b2lkLCBnbE11bHRNYXRyaXh4LCBjb25zdCBHTGZpeGVkICptKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNHgsIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKK0dMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM3gsIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbFBvaW50ZXIsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQorR0xfRU5UUlkodm9pZCwgZ2xPcnRob3gsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbFBpeGVsU3RvcmVpLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcngsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJ4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZXgsIEdMZml4ZWQgc2l6ZSkKK0dMX0VOVFJZKHZvaWQsIGdsUG9seWdvbk9mZnNldHgsIEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKQorR0xfRU5UUlkodm9pZCwgZ2xQb3BNYXRyaXgsIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbFB1c2hNYXRyaXgsIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbFJlYWRQaXhlbHMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCitHTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZXgsIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCitHTF9FTlRSWSh2b2lkLCBnbFNhbXBsZUNvdmVyYWdlLCBHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKK0dMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2V4LCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKK0dMX0VOVFJZKHZvaWQsIGdsU2NhbGV4LCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQorR0xfRU5UUlkodm9pZCwgZ2xTY2lzc29yLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKK0dMX0VOVFJZKHZvaWQsIGdsU2hhZGVNb2RlbCwgR0xlbnVtIG1vZGUpCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxGdW5jLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE1hc2ssIEdMdWludCBtYXNrKQorR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsT3AsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKK0dMX0VOVFJZKHZvaWQsIGdsVGV4Q29vcmRQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52aSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJpLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJ4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnh2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsVGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpCitHTF9FTlRSWSh2b2lkLCBnbFRyYW5zbGF0ZXgsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleFBvaW50ZXIsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQorR0xfRU5UUlkodm9pZCwgZ2xWaWV3cG9ydCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZVBvaW50ZXJPRVMsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQorCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleFBvaW50ZXJPZmZzZXQsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIEdMdWludCBvZmZzZXQpCitHTF9FTlRSWSh2b2lkLCBnbENvbG9yUG9pbnRlck9mZnNldCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsTm9ybWFsUG9pbnRlck9mZnNldCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXplUG9pbnRlck9mZnNldCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4Q29vcmRQb2ludGVyT2Zmc2V0LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KQorR0xfRU5UUlkodm9pZCwgZ2xXZWlnaHRQb2ludGVyT2Zmc2V0LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KQorR0xfRU5UUlkodm9pZCwgZ2xNYXRyaXhJbmRleFBvaW50ZXJPZmZzZXQsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIEdMdWludCBvZmZzZXQpCisKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlckRhdGEsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbikKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3JQb2ludGVyRGF0YSwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorR0xfRU5UUlkodm9pZCwgZ2xOb3JtYWxQb2ludGVyRGF0YSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhDb29yZFBvaW50ZXJEYXRhLCBHTGludCB1bml0LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZVBvaW50ZXJEYXRhLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbFdlaWdodFBvaW50ZXJEYXRhLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbE1hdHJpeEluZGV4UG9pbnRlckRhdGEsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbikKKworR0xfRU5UUlkodm9pZCwgZ2xEcmF3RWxlbWVudHNPZmZzZXQsIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd0VsZW1lbnRzRGF0YSwgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCB2b2lkICpkYXRhLCBHTHVpbnQgZGF0YWxlbikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLCBpbnQgY291bnQsIEdMaW50ICpmb3JtYXRzKTsKKworR0xfRU5UUlkoaW50LCBnbEZpbmlzaFJvdW5kVHJpcCwgdm9pZCkKKworI29wZW5nbCBleHRlbnNpb25zCisKK0dMX0VOVFJZKHZvaWQsIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkKK0dMX0VOVFJZKHZvaWQsIGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEVxdWF0aW9uT0VTLCBHTGVudW0gbW9kZSkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHNPRVMsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4aU9FUywgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHhPRVMsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4c3ZPRVMsIGNvbnN0IEdMc2hvcnQgKmNvb3JkcykKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGl2T0VTLCBjb25zdCBHTGludCAqY29vcmRzKQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4eHZPRVMsIGNvbnN0IEdMZml4ZWQgKmNvb3JkcykKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGZPRVMsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4ZnZPRVMsIGNvbnN0IEdMZmxvYXQgKmNvb3JkcykKK0dMX0VOVFJZKHZvaWQsIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMsIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCitHTF9FTlRSWSh2b2lkLCBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkKK0dMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeE9FUywgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcnhPRVMsIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKQorR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoeE9FUywgR0xjbGFtcHggZGVwdGgpCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXhPRVMsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqIGVxdWF0aW9uKQorR0xfRU5UUlkodm9pZCwgZ2xDbGlwUGxhbmV4SU1HLCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKiBlcXVhdGlvbikKK0dMX0VOVFJZKHZvaWQsIGdsQ29sb3I0eE9FUywgR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhSYW5nZXhPRVMsIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKQorR0xfRU5UUlkodm9pZCwgZ2xGb2d4T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbEZvZ3h2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsRnJ1c3R1bXhPRVMsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZXhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogZXFuKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRDbGlwUGxhbmV4LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIGVxbikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0Rml4ZWR2T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TGlnaHR4dk9FUywgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0TWF0ZXJpYWx4dk9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZ4dk9FUywgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleFBhcmFtZXRlcnh2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHRNb2RlbHh2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHR4T0VTLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsTGlnaHR4dk9FUywgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoeE9FUywgR0xmaXhlZCB3aWR0aCkKK0dMX0VOVFJZKHZvaWQsIGdsTG9hZE1hdHJpeHhPRVMsIGNvbnN0IEdMZml4ZWQgKm0pCitHTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseE9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWx4dk9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0TWF0cml4eE9FUywgY29uc3QgR0xmaXhlZCAqbSkKK0dMX0VOVFJZKHZvaWQsIGdsTXVsdGlUZXhDb29yZDR4T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpCitHTF9FTlRSWSh2b2lkLCBnbE5vcm1hbDN4T0VTLCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KQorR0xfRU5UUlkodm9pZCwgZ2xPcnRob3hPRVMsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeE9FUywgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnh2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXpleE9FUywgR0xmaXhlZCBzaXplKQorR0xfRU5UUlkodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0eE9FUywgR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpCitHTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZXhPRVMsIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCitHTF9FTlRSWSh2b2lkLCBnbFNhbXBsZUNvdmVyYWdleE9FUywgR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpCitHTF9FTlRSWSh2b2lkLCBnbFNjYWxleE9FUywgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKK0dMX0VOVFJZKHZvaWQsIGdsVGV4RW52eE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4dk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnhPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyeHZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xUcmFuc2xhdGV4T0VTLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzUmVuZGVyYnVmZmVyT0VTLCBHTHVpbnQgcmVuZGVyYnVmZmVyKQorR0xfRU5UUlkodm9pZCwgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKQorR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykKK0dMX0VOVFJZKHZvaWQsIGdsR2VuUmVuZGVyYnVmZmVyc09FUywgR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNGcmFtZWJ1ZmZlck9FUywgR0x1aW50IGZyYW1lYnVmZmVyKQorR0xfRU5UUlkodm9pZCwgZ2xCaW5kRnJhbWVidWZmZXJPRVMsIEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpCitHTF9FTlRSWShHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUywgR0xlbnVtIHRhcmdldCkKK0dMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKQorR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCkKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdlbmVyYXRlTWlwbWFwT0VTLCBHTGVudW0gdGFyZ2V0KQorR0xfRU5UUlkodm9pZCosIGdsTWFwQnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbFVubWFwQnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0KQorR0xfRU5UUlkodm9pZCwgZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTLCBHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KQorR0xfRU5UUlkodm9pZCwgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMsIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUywgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKiBwb2ludGVyKQorR0xfRU5UUlkodm9pZCwgZ2xXZWlnaHRQb2ludGVyT0VTLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqIHBvaW50ZXIpCitHTF9FTlRSWShHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgR0xmaXhlZCAqIG1hbnRpc3NhLCBHTGludCAqIGV4cG9uZW50KQorR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdlZk9FUywgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbEZydXN0dW1mT0VTLCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQorR0xfRU5UUlkodm9pZCwgZ2xPcnRob2ZPRVMsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWZPRVMsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCitHTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWZJTUcsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCitHTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZWZPRVMsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqIGVxbikKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJEZXB0aGZPRVMsIEdMY2xhbXBmIGRlcHRoKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW5mT0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4R2VuZnZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleEdlbmlPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4R2VuaXZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW54T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4R2VueHZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEdlbmZ2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhHZW5pdk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleEdlbnh2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xCaW5kVmVydGV4QXJyYXlPRVMsIEdMdWludCBhcnJheSkKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNWZXJ0ZXhBcnJheU9FUywgR0x1aW50IGFycmF5KQorR0xfRU5UUlkodm9pZCwgZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpCitHTF9FTlRSWSh2b2lkLCBnbE11bHRpRHJhd0FycmF5c0VYVCwgR0xlbnVtIG1vZGUsIGNvbnN0IEdMaW50ICpmaXJzdCwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCwgR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKmNvbnN0ICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkKK0dMX0VOVFJZKHZvaWQsIGdsTXVsdGlEcmF3QXJyYXlzU1VOLCBHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpCitHTF9FTlRSWSh2b2lkLCBnbE11bHRpRHJhd0VsZW1lbnRzU1VOLCBHTGVudW0gbW9kZSwgY29uc3QgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKippbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkKK0dMX0VOVFJZKHZvaWQsIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlRmVuY2VzTlYsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpCitHTF9FTlRSWSh2b2lkLCBnbEdlbkZlbmNlc05WLCBHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRmVuY2VOViwgR0x1aW50IGZlbmNlKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbFRlc3RGZW5jZU5WLCBHTHVpbnQgZmVuY2UpCitHTF9FTlRSWSh2b2lkLCBnbEdldEZlbmNlaXZOViwgR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEZpbmlzaEZlbmNlTlYsIEdMdWludCBmZW5jZSkKK0dMX0VOVFJZKHZvaWQsIGdsU2V0RmVuY2VOViwgR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKQorR0xfRU5UUlkodm9pZCwgZ2xHZXREcml2ZXJDb250cm9sc1FDT00sIEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKQorR0xfRU5UUlkodm9pZCwgZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSwgR0x1aW50IGRyaXZlckNvbnRyb2wpCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSwgR0x1aW50IGRyaXZlckNvbnRyb2wpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFRleHR1cmVzUUNPTSwgR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcykKK0dMX0VOVFJZKHZvaWQsIGdsRXh0R2V0QnVmZmVyc1FDT00sIEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NLCBHTHVpbnQgKiByZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqIG51bVJlbmRlcmJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NLCBHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscykKK0dMX0VOVFJZKHZvaWQsIGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NLCBHTGVudW0gdGFyZ2V0LCBHTHZvaWQqICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFNoYWRlcnNRQ09NLCBHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRQcm9ncmFtc1FDT00sIEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgR0x1aW50IHByb2dyYW0pCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NLCBHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKQorR0xfRU5UUlkodm9pZCwgZ2xTdGFydFRpbGluZ1FDT00sIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsRW5kVGlsaW5nUUNPTSwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvZ2xlczEudHlwZXMgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2MV9kZWMvZ2xlczEudHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViZTI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMS50eXBlcwpAQCAtMCwwICsxLDM0IEBACitHTGJpdGZpZWxkIDMyIDB4JTA4eAorR0xib29sZWFuIDggJWQKK0dMY2xhbXBmIDMyICVmCitHTGNsYW1weCAzMiAweCUwOHgKK0dMZWdsSW1hZ2VPRVMgMzIgJXAKK0dMZW51bSAzMiAweCUwOHgKK0dMZml4ZWQgMzIgMHglMDh4CitHTGZsb2F0IDMyICVmCitHTGludCAzMiAlZAorR0xpbnRwdHIgMzIgMHglMDhseAorR0xzaG9ydCAxNiAlZAorR0xzaXplaSAzMiAlZAorR0xzaXplaXB0ciAzMiAweCUwOGx4CitHTHVieXRlIDggMHglMDJ4CitHTHVpbnQgMzIgJXUKK0dMdm9pZCAwICV4CitHTGNoYXIgOCAlZAorR0xlbnVtKiAzMiAweCUwOHgKK0dMYm9vbGVhbiogMzIgMHglMDh4CitHTGNsYW1wZiogMzIgMHglMDh4CitHTGNsYW1weCogMzIgMHglMDh4CitHTGVnbEltYWdlT0VTKiAzMiAweCUwOHgKK0dMZml4ZWQqIDMyIDB4JTA4eAorR0xmbG9hdCogMzIgMHglMDh4CitHTGludCogMzIgMHglMDh4CitHTHNob3J0KiAzMiAweCUwOHgKK0dMc2l6ZWkqIDMyIDB4JTA4eAorR0x1Ynl0ZSogMzIgMHglMDh4CitHTHVpbnQqIDMyIDB4JTA4eAorR0x2b2lkKiAzMiAweCUwOHgKK0dMY2hhciogMzIgMHglMDh4CitHTHZvaWQqKiAzMiAweCUwOHgKK3ZvaWQqIDMyIDB4JTA4eAorR0x2b2lkKmNvbnN0KiAzMiAweCUwOHgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMV90eXBlcy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjFfZGVjL2dsZXMxX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzNTVhZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YxX2RlYy9nbGVzMV90eXBlcy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9fR0xFUzFfVFlQRVNfX0gKKyNkZWZpbmUgX19HTEVTMV9UWVBFU19fSAorCisjaW5jbHVkZSAiZ2xfYmFzZV90eXBlcy5oIgorCisjZW5kaWYgIC8vIF9fR0xFUzFfVFlQRVNfX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9BbmRyb2lkLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNjNhOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyMjIGhvc3QgbGlicmFyeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyQoY2FsbCBlbXVnbC1iZWdpbi1zdGF0aWMtbGlicmFyeSxsaWJHTEVTdjJfZGVjKQorJChjYWxsIGVtdWdsLWltcG9ydCwgbGliT3BlbmdsQ29kZWNDb21tb24pCiskKGNhbGwgZW11Z2wtZ2VuLWRlY29kZXIsJChMT0NBTF9QQVRIKSxnbGVzMikKKworIyBGb3IgZ2wyX3R5cGVzLmggIQorJChjYWxsIGVtdWdsLWV4cG9ydCxDX0lOQ0xVREVTLCQoTE9DQUxfUEFUSCkpCisKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ0ZMQUdTLCQoRU1VR0xfVVNFUl9DRkxBR1MpKQorCitMT0NBTF9TUkNfRklMRVMgOj0gR0xFU3YyRGVjb2Rlci5jcHAKKworJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvR0xFU3YyRGVjb2Rlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvR0xFU3YyRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmYzkwNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9HTEVTdjJEZWNvZGVyLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyogQ29weXJpZ2h0IDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiR0xFU3YyRGVjb2Rlci5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQqIFNhZmVQb2ludGVyRnJvbVVJbnQoR0x1aW50IHZhbHVlKSB7CisgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCl2YWx1ZTsKK30KKworR0xFU3YyRGVjb2Rlcjo6R0xFU3YyRGVjb2RlcigpCit7CisgICAgbV9jb250ZXh0RGF0YSA9IE5VTEw7CisgICAgbV9HTDJsaWJyYXJ5ID0gTlVMTDsKK30KKworR0xFU3YyRGVjb2Rlcjo6fkdMRVN2MkRlY29kZXIoKQoreworICAgIGRlbGV0ZSBtX0dMMmxpYnJhcnk7Cit9CisKK3ZvaWQgKkdMRVN2MkRlY29kZXI6OnNfZ2V0UHJvYyhjb25zdCBjaGFyICpuYW1lLCB2b2lkICp1c2VyRGF0YSkKK3sKKyAgICBHTEVTdjJEZWNvZGVyICpjdHggPSAoR0xFU3YyRGVjb2RlciAqKSB1c2VyRGF0YTsKKworICAgIGlmIChjdHggPT0gTlVMTCB8fCBjdHgtPm1fR0wybGlicmFyeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHZvaWQgKmZ1bmMgPSBOVUxMOworI2lmZGVmIFVTRV9FR0xfR0VUUFJPQ0FERFJFU1MKKyAgICBmdW5jID0gKHZvaWQgKikgZWdsR2V0UHJvY0FkZHJlc3MobmFtZSk7CisjZW5kaWYKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGZ1bmMgPSAodm9pZCAqKSBjdHgtPm1fR0wybGlicmFyeS0+ZmluZFN5bWJvbChuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIGZ1bmM7Cit9CisKK2ludCBHTEVTdjJEZWNvZGVyOjppbml0R0woZ2V0X3Byb2NfZnVuY190IGdldFByb2NGdW5jLCB2b2lkICpnZXRQcm9jRnVuY0RhdGEpCit7CisgICAgdGhpcy0+aW5pdERpc3BhdGNoQnlOYW1lKGdldFByb2NGdW5jLCBnZXRQcm9jRnVuY0RhdGEpOworCisgICAgZ2xHZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBzX2dsR2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOworICAgIGdsVmVydGV4QXR0cmliUG9pbnRlckRhdGEgPSBzX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGE7CisgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyT2Zmc2V0ID0gc19nbFZlcnRleEF0dHJpYlBvaW50ZXJPZmZzZXQ7CisKKyAgICBnbERyYXdFbGVtZW50c09mZnNldCA9IHNfZ2xEcmF3RWxlbWVudHNPZmZzZXQ7CisgICAgZ2xEcmF3RWxlbWVudHNEYXRhID0gc19nbERyYXdFbGVtZW50c0RhdGE7CisgICAgZ2xTaGFkZXJTdHJpbmcgPSBzX2dsU2hhZGVyU3RyaW5nOworICAgIGdsRmluaXNoUm91bmRUcmlwID0gc19nbEZpbmlzaFJvdW5kVHJpcDsKKyAgICByZXR1cm4gMDsKKworfQorCitpbnQgR0xFU3YyRGVjb2Rlcjo6c19nbEZpbmlzaFJvdW5kVHJpcCh2b2lkICpzZWxmKQoreworICAgIEdMRVN2MkRlY29kZXIgKmN0eCA9IChHTEVTdjJEZWNvZGVyICopc2VsZjsKKyAgICBjdHgtPmdsRmluaXNoKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgR0xFU3YyRGVjb2Rlcjo6c19nbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyh2b2lkICpzZWxmLCBpbnQgY291bnQsIEdMaW50ICpmb3JtYXRzKQoreworICAgIEdMRVN2MkRlY29kZXIgKmN0eCA9IChHTEVTdjJEZWNvZGVyICopIHNlbGY7CisKKyAgICBpbnQgbkZvcm1hdHM7CisgICAgY3R4LT5nbEdldEludGVnZXJ2KEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUywgJm5Gb3JtYXRzKTsKKyAgICBpZiAobkZvcm1hdHMgPiBjb3VudCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBHZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IFRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGZvcm1hdHMgZG9lcyBub3QgbWF0Y2ggdGhlIG51bWJlciB0aGF0IGlzIHJlcG9ydGVkIGJ5IE9wZW5HTFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmdsR2V0SW50ZWdlcnYoR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsIGZvcm1hdHMpOworICAgIH0KK30KKwordm9pZCBHTEVTdjJEZWNvZGVyOjpzX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCAgdm9pZCAqIGRhdGEsIEdMdWludCBkYXRhbGVuKQoreworICAgIEdMRVN2MkRlY29kZXIgKmN0eCA9IChHTEVTdjJEZWNvZGVyICopIHNlbGY7CisgICAgaWYgKGN0eC0+bV9jb250ZXh0RGF0YSAhPSBOVUxMKSB7CisgICAgICAgIGN0eC0+bV9jb250ZXh0RGF0YS0+c3RvcmVQb2ludGVyRGF0YShpbmR4LCBkYXRhLCBkYXRhbGVuKTsKKyAgICAgICAgLy8gbm90ZSAtIHRoZSBzdHJpZGUgb2YgdGhlIGRhdGEgaXMgYWx3YXlzIHplcm8gd2hlbiBpdCBjb21lcyBvdXQgb2YgdGhlIGNvZGVjLgorICAgICAgICAvLyBTZWUgZ2wyLmF0dHJpYiBmb3IgdGhlIHBhY2tpbmcgZnVuY3Rpb24gY2FsbC4KKyAgICAgICAgY3R4LT5nbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgY3R4LT5tX2NvbnRleHREYXRhLT5wb2ludGVyRGF0YShpbmR4KSk7CisgICAgfQorfQorCit2b2lkIEdMRVN2MkRlY29kZXI6OnNfZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IGRhdGEpCit7CisgICAgR0xFU3YyRGVjb2RlciAqY3R4ID0gKEdMRVN2MkRlY29kZXIgKikgc2VsZjsKKyAgICBjdHgtPmdsVmVydGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIFNhZmVQb2ludGVyRnJvbVVJbnQoZGF0YSkpOworfQorCisKK3ZvaWQgR0xFU3YyRGVjb2Rlcjo6c19nbERyYXdFbGVtZW50c0RhdGEodm9pZCAqc2VsZiwgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCit7CisgICAgR0xFU3YyRGVjb2RlciAqY3R4ID0gKEdMRVN2MkRlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIGRhdGEpOworfQorCisKK3ZvaWQgR0xFU3YyRGVjb2Rlcjo6c19nbERyYXdFbGVtZW50c09mZnNldCh2b2lkICpzZWxmLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMdWludCBvZmZzZXQpCit7CisgICAgR0xFU3YyRGVjb2RlciAqY3R4ID0gKEdMRVN2MkRlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIFNhZmVQb2ludGVyRnJvbVVJbnQob2Zmc2V0KSk7Cit9CisKK3ZvaWQgR0xFU3YyRGVjb2Rlcjo6c19nbFNoYWRlclN0cmluZyh2b2lkICpzZWxmLCBHTHVpbnQgc2hhZGVyLCBjb25zdCBHTGNoYXIqIHN0cmluZywgR0xzaXplaSBsZW4pCit7CisgICAgR0xFU3YyRGVjb2RlciAqY3R4ID0gKEdMRVN2MkRlY29kZXIgKilzZWxmOworICAgIGN0eC0+Z2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmc3RyaW5nLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9HTEVTdjJEZWNvZGVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvR0xFU3YyRGVjb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNmY0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvR0xFU3YyRGVjb2Rlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBfR0wyX0RFQ09ERVJfSF8KKyNkZWZpbmUgX0dMMl9ERUNPREVSX0hfCisKKyNpbmNsdWRlICJnbGVzMl9kZWMuaCIKKyNpbmNsdWRlICJHTERlY29kZXJDb250ZXh0RGF0YS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorCitjbGFzcyBHTEVTdjJEZWNvZGVyIDogcHVibGljIGdsZXMyX2RlY29kZXJfY29udGV4dF90Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkICooKmdldF9wcm9jX2Z1bmNfdCkoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpOworICAgIEdMRVN2MkRlY29kZXIoKTsKKyAgICB+R0xFU3YyRGVjb2RlcigpOworICAgIGludCBpbml0R0woZ2V0X3Byb2NfZnVuY190IGdldFByb2NGdW5jLCB2b2lkICpnZXRQcm9jRnVuY0RhdGEpOworICAgIHZvaWQgc2V0Q29udGV4dERhdGEoR0xEZWNvZGVyQ29udGV4dERhdGEgKmNvbnRleHREYXRhKSB7IG1fY29udGV4dERhdGEgPSBjb250ZXh0RGF0YTsgfQorcHJpdmF0ZToKKyAgICBHTERlY29kZXJDb250ZXh0RGF0YSAqbV9jb250ZXh0RGF0YTsKKyAgICBlbXVnbDo6U2hhcmVkTGlicmFyeSogbV9HTDJsaWJyYXJ5OworCisgICAgc3RhdGljIHZvaWQgKnNfZ2V0UHJvYyhjb25zdCBjaGFyICpuYW1lLCB2b2lkICp1c2VyRGF0YSk7CisgICAgc3RhdGljIHZvaWQgZ2xlczJfQVBJRU5UUlkgc19nbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyh2b2lkICpzZWxmLCBpbnQgY291bnQsIEdMaW50ICpmb3JtYXRzKTsKKyAgICBzdGF0aWMgdm9pZCBnbGVzMl9BUElFTlRSWSBzX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGEodm9pZCAqc2VsZiwgR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pOworICAgIHN0YXRpYyB2b2lkIGdsZXMyX0FQSUVOVFJZIHNfZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyT2Zmc2V0KHZvaWQgKnNlbGYsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsICBHTHVpbnQgb2Zmc2V0KTsKKworICAgIHN0YXRpYyB2b2lkIGdsZXMyX0FQSUVOVFJZIHNfZ2xEcmF3RWxlbWVudHNPZmZzZXQodm9pZCAqc2VsZiwgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTHVpbnQgb2Zmc2V0KTsKKyAgICBzdGF0aWMgdm9pZCBnbGVzMl9BUElFTlRSWSBzX2dsRHJhd0VsZW1lbnRzRGF0YSh2b2lkICpzZWxmLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIHZvaWQgKiBkYXRhLCBHTHVpbnQgZGF0YWxlbik7CisgICAgc3RhdGljIHZvaWQgZ2xlczJfQVBJRU5UUlkgc19nbFNoYWRlclN0cmluZyh2b2lkICpzZWxmLCBHTHVpbnQgc2hhZGVyLCBjb25zdCBHTGNoYXIqIHN0cmluZywgR0xzaXplaSBsZW4pOworICAgIHN0YXRpYyBpbnQgIGdsZXMyX0FQSUVOVFJZIHNfZ2xGaW5pc2hSb3VuZFRyaXAodm9pZCAqc2VsZik7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvZ2xlczIuYXR0cmliIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyLmF0dHJpYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRhOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyLmF0dHJpYgpAQCAtMCwwICsxLDU5NSBAQAorR0xPQkFMCisJYmFzZV9vcGNvZGUgMjA0OAorCWVuY29kZXJfaGVhZGVycyA8c3RyaW5nLmg+ICJnbFV0aWxzLmgiICJHTDJFbmNvZGVyVXRpbHMuaCIKKworI3ZvaWQgZ2xCaW5kQXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xjaGFyICpuYW1lKQorZ2xCaW5kQXR0cmliTG9jYXRpb24KKwlsZW4gbmFtZSAoc3RybGVuKG5hbWUpICsgMSkKKworI3ZvaWQgZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpCitnbEJ1ZmZlckRhdGEKKwlsZW4gZGF0YSBzaXplCisJdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZCBpc0xhcmdlCisKKyN2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgR0x2b2lkICpkYXRhKQorZ2xCdWZmZXJTdWJEYXRhCisJbGVuIGRhdGEgc2l6ZQorICAgICAgICB2YXJfZmxhZyBkYXRhIG51bGxBbGxvd2VkIGlzTGFyZ2UKKworI3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgR0x2b2lkICpkYXRhKQorZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRAorCWxlbiBkYXRhIGltYWdlU2l6ZQorICAgIHZhcl9mbGFnIGRhdGEgbnVsbEFsbG93ZWQgaXNMYXJnZQorCisjdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIEdMdm9pZCAqZGF0YSkKK2dsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQKKwlsZW4gZGF0YSBpbWFnZVNpemUKKyAgICAgICAgdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZCBpc0xhcmdlCisKKyN2b2lkIGdsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykKK2dsRGVsZXRlQnVmZmVycworCWxlbiBidWZmZXJzIChuICogc2l6ZW9mKEdMdWludCkpCisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpCitnbERlbGV0ZUZyYW1lYnVmZmVycworCWxlbiBmcmFtZWJ1ZmZlcnMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3ZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzKQorZ2xEZWxldGVSZW5kZXJidWZmZXJzCisJbGVuIHJlbmRlcmJ1ZmZlcnMgKG4gKiBzaXplb2YoR0x1aW50KSkKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworI3ZvaWQgZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpCitnbERlbGV0ZVRleHR1cmVzCisJbGVuIHRleHR1cmVzIChuICogc2l6ZW9mKEdMdWludCkpCisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsRHJhd0VsZW1lbnRzKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgR0x2b2lkICppbmRpY2VzKQorZ2xEcmF3RWxlbWVudHMKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2VuQnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykKK2dsR2VuQnVmZmVycworCWxlbiBidWZmZXJzIChuICogc2l6ZW9mKEdMdWludCkpCisJZGlyIGJ1ZmZlcnMgb3V0CisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsR2VuRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMpCitnbEdlbkZyYW1lYnVmZmVycworCWxlbiBmcmFtZWJ1ZmZlcnMgKG4gKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgZnJhbWVidWZmZXJzIG91dAorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpCitnbEdlblJlbmRlcmJ1ZmZlcnMKKwlsZW4gcmVuZGVyYnVmZmVycyAobiAqIHNpemVvZihHTHVpbnQpKQorCWRpciByZW5kZXJidWZmZXJzIG91dAorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKK2dsR2VuVGV4dHVyZXMKKwlsZW4gdGV4dHVyZXMgKG4gKiBzaXplb2YoR0x1aW50KSkKKwlkaXIgdGV4dHVyZXMgb3V0CisgICAgcGFyYW1fY2hlY2sgbiBpZihuPDApeyBjdHgtPnNldEVycm9yKEdMX0lOVkFMSURfVkFMVUUpOyByZXR1cm47IH0gCisKKyN2b2lkIGdsR2V0QWN0aXZlQXR0cmliKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGludCAqc2l6ZSwgR0xlbnVtICp0eXBlLCBHTGNoYXIgKm5hbWUpCitnbEdldEFjdGl2ZUF0dHJpYgorCWxlbiBuYW1lIGJ1ZnNpemUKKwlkaXIgbmFtZSBvdXQKKwl2YXJfZmxhZyBuYW1lIG51bGxBbGxvd2VkCisJZGlyIGxlbmd0aCBvdXQKKwlsZW4gbGVuZ3RoIChzaXplb2YoR0xzaXplaSkpCisJdmFyX2ZsYWcgbGVuZ3RoIG51bGxBbGxvd2VkCisJZGlyIHNpemUgb3V0CisJbGVuIHNpemUgKHNpemVvZihHTGludCkpCisJdmFyX2ZsYWcgc2l6ZSBudWxsQWxsb3dlZAorCWRpciB0eXBlIG91dAorCWxlbiB0eXBlIChzaXplb2YoR0xlbnVtKSkKKwl2YXJfZmxhZyB0eXBlIG51bGxBbGxvd2VkCisJCisjdm9pZCBnbEdldEFjdGl2ZVVuaWZvcm0oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMaW50ICpzaXplLCBHTGVudW0gKnR5cGUsIEdMY2hhciAqbmFtZSkKK2dsR2V0QWN0aXZlVW5pZm9ybQorCWxlbiBuYW1lIGJ1ZnNpemUKKwlkaXIgbmFtZSBvdXQKKwkgIHZhcl9mbGFnIG5hbWUgbnVsbEFsbG93ZWQKKwlkaXIgbGVuZ3RoIG91dAorCWxlbiBsZW5ndGggKHNpemVvZihHTHNpemVpKSkKKwl2YXJfZmxhZyBsZW5ndGggbnVsbEFsbG93ZWQKKwlkaXIgc2l6ZSBvdXQKKwlsZW4gc2l6ZSAoc2l6ZW9mKEdMaW50KSkKKwl2YXJfZmxhZyBzaXplIG51bGxBbGxvd2VkCisJZGlyIHR5cGUgb3V0CisJbGVuIHR5cGUgKHNpemVvZihHTGVudW0pKQorCXZhcl9mbGFnIHR5cGUgbnVsbEFsbG93ZWQKKworCisjdm9pZCBnbEdldEF0dGFjaGVkU2hhZGVycyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSAqY291bnQsIEdMdWludCAqc2hhZGVycykKK2dsR2V0QXR0YWNoZWRTaGFkZXJzCisJbGVuIHNoYWRlcnMgKG1heGNvdW50KnNpemVvZihHTHVpbnQpKQorCWRpciBzaGFkZXJzIG91dAorCWRpciBjb3VudCBvdXQKKwl2YXJfZmxhZyBjb3VudCBudWxsQWxsb3dlZAorCWxlbiBjb3VudCAoc2l6ZW9mKEdMc2l6ZWkpKQorCisjaW50IGdsR2V0QXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIEdMY2hhciAqbmFtZSkKK2dsR2V0QXR0cmliTG9jYXRpb24KKwlsZW4gbmFtZSAoc3RybGVuKG5hbWUpICsgMSkKKworI3ZvaWQgZ2xHZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKQorZ2xHZXRCb29sZWFudgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xib29sZWFuKSkKKworI3ZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldEJ1ZmZlclBhcmFtZXRlcml2CisJbGVuIHBhcmFtcyAoc2l6ZW9mKEdMaW50KSkKKwlkaXIgcGFyYW1zIG91dAorCisjdm9pZCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsR2V0RmxvYXR2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldEludGVnZXJ2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsR2V0UHJvZ3JhbWl2KEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldFByb2dyYW1pdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyBzaXplb2YoR0xpbnQpCisjWFhYIC0gbWlnaHQgY2hhbmdlIGlmIGV4dGVuc2lvbiBjb25zdGFudHMgdGhhdCByZXR1cm4gbW9yZSB0aGVuIG9uZSB2YWx1ZQorCisKKyN2b2lkIGdsR2V0UHJvZ3JhbUluZm9Mb2coR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9sb2cpCitnbEdldFByb2dyYW1JbmZvTG9nCisJZGlyIGluZm9sb2cgb3V0CisJbGVuIGluZm9sb2cgYnVmc2l6ZQorCWRpciBsZW5ndGggb3V0CisJbGVuIGxlbmd0aCBzaXplb2YoR0xzaXplaSkKKwl2YXJfZmxhZyBsZW5ndGggbnVsbEFsbG93ZWQKKworI3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIHNpemVvZihHTGludCkKKyMgWFhYIC0gbWlnaHQgY2hhbmdlIGlmIHBuYW1lIHdpdGggdmFsdWUgbGFyZ2VyIHRoZW4gb25lIGlzIGFkZGVkCisKKyN2b2lkIGdsR2V0U2hhZGVyaXYoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xHZXRTaGFkZXJpdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyBzaXplb2YoR0xpbnQpCisjIFhYWCAtIG1pZ2h0IGNoYW5nZSBpZiBwbmFtZSB3aXRoIHZhbHVlIGxhcmdlciB0aGVuIG9uZSBpcyBhZGRlZAorCisjdm9pZCBnbEdldFNoYWRlckluZm9Mb2coR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb2xvZykKK2dsR2V0U2hhZGVySW5mb0xvZworCWRpciBsZW5ndGggb3V0CisJbGVuIGxlbmd0aCAoc2l6ZW9mKEdMc2l6ZWkpKQorCXZhcl9mbGFnIGxlbmd0aCBudWxsQWxsb3dlZAorCWRpciBpbmZvbG9nIG91dAorCWxlbiBpbmZvbG9nIGJ1ZnNpemUKKwkKKworI3ZvaWQgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCAqcmFuZ2UsIEdMaW50ICpwcmVjaXNpb24pCitnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdAorCWRpciByYW5nZSBvdXQKKwlsZW4gcmFuZ2UgKDIgKiBzaXplb2YoR0xpbnQpKQorCWRpciBwcmVjaXNpb24gb3V0CisJbGVuIHByZWNpc2lvbiAoc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRTaGFkZXJTb3VyY2UoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqc291cmNlKQorZ2xHZXRTaGFkZXJTb3VyY2UKKwlkaXIgbGVuZ3RoIG91dAorCWxlbiBsZW5ndGggKHNpemVvZihHTHNpemVpKSkKKwl2YXJfZmxhZyBsZW5ndGggbnVsbEFsbG93ZWQKKwlkaXIgc291cmNlIG91dAorCWxlbiBzb3VyY2UgYnVmc2l6ZQorCisjR0x1Ynl0ZSogZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpCitnbEdldFN0cmluZworCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKK2dsR2V0VGV4UGFyYW1ldGVyZnYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbEdldFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK2dsR2V0VGV4UGFyYW1ldGVyaXYKKwlkaXIgcGFyYW1zIG91dAorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xHZXRVbmlmb3JtZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0ICpwYXJhbXMpCitnbEdldFVuaWZvcm1mdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyBnbFNpemVvZihnbGVzdjJfZW5jOjp1bmlmb3JtVHlwZShzZWxmLCBwcm9ncmFtLCBsb2NhdGlvbikpCisKKyN2b2lkIGdsR2V0VW5pZm9ybWl2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgKnBhcmFtcykKK2dsR2V0VW5pZm9ybWl2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIGdsU2l6ZW9mKGdsZXN2Ml9lbmM6OnVuaWZvcm1UeXBlKHNlbGYsIHByb2dyYW0sIGxvY2F0aW9uKSkKKworI2ludCBnbEdldFVuaWZvcm1Mb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0xjaGFyICpuYW1lKQorZ2xHZXRVbmlmb3JtTG9jYXRpb24KKwlsZW4gbmFtZSAoc3RybGVuKG5hbWUpICsgMSkKKworIyBjbGllbnQtc3RhdGUgc2hhbGwgYmUgaGFuZGxlZCBsb2NhbGx5IGJ5IHRoZSBlbmNvZGVyIGluIG1vc3QgY2FzZXMuCisjIGhvd2V2ZXIsIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiBhbmQgcG90ZW50aWFsIG90aGVycyBhcmUgaGFuZGxlZCBieSB0aGUgc2VydmVyIHNpZGUsCisjIHRodXMgd2Ugc3RpbGwgbmVlZCB0byBpbXBsZW1lbnQgaXQuIAorI3ZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJmdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xHZXRWZXJ0ZXhBdHRyaWJmdgorCWRpciBwYXJhbXMgb3V0CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xmbG9hdCkpCisKKyNzZWUgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiBmb3IgY29tbWVudHMKKyN2b2lkIGdsR2V0VmVydGV4QXR0cmliaXYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbEdldFZlcnRleEF0dHJpYml2CisJZGlyIHBhcmFtcyBvdXQKKwlsZW4gcGFyYW1zIChnbFV0aWxzUGFyYW1TaXplKHBuYW1lKSAqIHNpemVvZihHTGludCkpCisKKworCisjdm9pZCBnbFJlYWRQaXhlbHMoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykKK2dsUmVhZFBpeGVscworCWRpciBwaXhlbHMgb3V0CisJbGVuIHBpeGVscyBnbGVzdjJfZW5jOjpwaXhlbERhdGFTaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgMSkKKworI3ZvaWQgZ2xTaGFkZXJCaW5hcnkoR0xzaXplaSBuLCBHTHVpbnQgKnNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIEdMdm9pZCAqYmluYXJ5LCBHTHNpemVpIGxlbmd0aCkKK2dsU2hhZGVyQmluYXJ5CisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCitnbFRleEltYWdlMkQKKwlkaXIgcGl4ZWxzIGluCisJbGVuIHBpeGVscyBnbGVzdjJfZW5jOjpwaXhlbERhdGFTaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgMCkKKwl2YXJfZmxhZyBwaXhlbHMgbnVsbEFsbG93ZWQgaXNMYXJnZQorCisjdm9pZCBnbFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQorZ2xUZXhQYXJhbWV0ZXJmdgorCWxlbiBwYXJhbXMgKGdsVXRpbHNQYXJhbVNpemUocG5hbWUpICogc2l6ZW9mKEdMZmxvYXQpKQorI3ZvaWQgZ2xUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCitnbFRleFBhcmFtZXRlcml2CisJbGVuIHBhcmFtcyAoZ2xVdGlsc1BhcmFtU2l6ZShwbmFtZSkgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbFRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCitnbFRleFN1YkltYWdlMkQKKwlsZW4gcGl4ZWxzIGdsZXN2Ml9lbmM6OnBpeGVsRGF0YVNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCAwKQorICAgICAgICB2YXJfZmxhZyBwaXhlbHMgbnVsbEFsbG93ZWQgaXNMYXJnZQorCQorI3ZvaWQgZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGZsb2F0ICp2KQorZ2xVbmlmb3JtMWZ2CisJbGVuIHYgKGNvdW50ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFVuaWZvcm0xaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMaW50ICp2KQorZ2xVbmlmb3JtMWl2CisJbGVuIHYgKGNvdW50ICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xVbmlmb3JtMmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGZsb2F0ICp2KQorZ2xVbmlmb3JtMmZ2CisJbGVuIHYgKGNvdW50ICogMiAqIHNpemVvZihHTGZsb2F0KSkKKworI3ZvaWQgZ2xVbmlmb3JtMml2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGludCAqdikKK2dsVW5pZm9ybTJpdgorCWxlbiB2IChjb3VudCAqIDIgKiBzaXplb2YoR0xpbnQpKQorCisjdm9pZCBnbFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMZmxvYXQgKnYpCitnbFVuaWZvcm0zZnYKKwlsZW4gdiAoY291bnQgKiAzICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFVuaWZvcm0zaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMaW50ICp2KQorZ2xVbmlmb3JtM2l2CisJbGVuIHYgKDMgKiBjb3VudCAqIHNpemVvZihHTGludCkpCisKKyN2b2lkIGdsVW5pZm9ybTRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xmbG9hdCAqdikKK2dsVW5pZm9ybTRmdgorCWxlbiB2ICg0ICogY291bnQgKiBzaXplb2YoR0xmbG9hdCkpCisKKyN2b2lkIGdsVW5pZm9ybTRpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xpbnQgKnYpCitnbFVuaWZvcm00aXYKKwlsZW4gdiAoNCAqIGNvdW50ICogc2l6ZW9mKEdMaW50KSkKKworI3ZvaWQgZ2xVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBHTGZsb2F0ICp2YWx1ZSkKK2dsVW5pZm9ybU1hdHJpeDJmdgorCWxlbiB2YWx1ZSAoY291bnQgKiA0ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFVuaWZvcm1NYXRyaXgzZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIEdMZmxvYXQgKnZhbHVlKQorZ2xVbmlmb3JtTWF0cml4M2Z2CisJbGVuIHZhbHVlIChjb3VudCAqIDkgKiBzaXplb2YoR0xmbG9hdCkpCisJCisjdm9pZCBnbFVuaWZvcm1NYXRyaXg0ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIEdMZmxvYXQgKnZhbHVlKQorZ2xVbmlmb3JtTWF0cml4NGZ2CisJbGVuIHZhbHVlIChjb3VudCAqIDE2ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFZlcnRleEF0dHJpYjFmdihHTHVpbnQgaW5keCwgR0xmbG9hdCAqdmFsdWVzKQorZ2xWZXJ0ZXhBdHRyaWIxZnYKKwlsZW4gdmFsdWVzIChzaXplb2YoR0xmbG9hdCkpCisjdm9pZCBnbFZlcnRleEF0dHJpYjJmdihHTHVpbnQgaW5keCwgR0xmbG9hdCAqdmFsdWVzKQorZ2xWZXJ0ZXhBdHRyaWIyZnYKKwlsZW4gdmFsdWVzICgyICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFZlcnRleEF0dHJpYjNmdihHTHVpbnQgaW5keCwgR0xmbG9hdCAqdmFsdWVzKQorZ2xWZXJ0ZXhBdHRyaWIzZnYKKwlsZW4gdmFsdWVzICgzICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFZlcnRleEF0dHJpYjRmdihHTHVpbnQgaW5keCwgR0xmbG9hdCAqdmFsdWVzKQorZ2xWZXJ0ZXhBdHRyaWI0ZnYKKwlsZW4gdmFsdWVzICg0ICogc2l6ZW9mKEdMZmxvYXQpKQorCisjdm9pZCBnbFZlcnRleEF0dHJpYlBvaW50ZXIoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIEdMdm9pZCAqcHRyKQorZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldFByb2dyYW1CaW5hcnlPRVMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpCitnbEdldFByb2dyYW1CaW5hcnlPRVMKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsUHJvZ3JhbUJpbmFyeU9FUyhHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCkKK2dsUHJvZ3JhbUJpbmFyeU9FUworCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQqIGdsTWFwQnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpCitnbE1hcEJ1ZmZlck9FUworCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xUZXhJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscykKK2dsVGV4SW1hZ2UzRE9FUworCWxlbiBwaXhlbHMgZ2xlc3YyX2VuYzo6cGl4ZWxEYXRhU2l6ZTNEKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIDApCisJdmFyX2ZsYWcgcGl4ZWxzIG51bGxBbGxvd2VkIGlzTGFyZ2UKKworI3ZvaWQgZ2xUZXhTdWJJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKQorZ2xUZXhTdWJJbWFnZTNET0VTCisJbGVuIHBpeGVscyBnbGVzdjJfZW5jOjpwaXhlbERhdGFTaXplM0Qoc2VsZiwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgMCkJCisgICAgICAgIHZhcl9mbGFnIHBpeGVscyBudWxsQWxsb3dlZCBpc0xhcmdlCisKKyN2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIEdMdm9pZCAqZGF0YSkKK2dsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMKKwlsZW4gZGF0YSBpbWFnZVNpemUKKyAgICAgICAgdmFyX2ZsYWcgZGF0YSBudWxsQWxsb3dlZCBpc0xhcmdlCisKKyN2b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgR0x2b2lkICpkYXRhKQorZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUworCWxlbiBkYXRhIGltYWdlU2l6ZQorICAgICAgICB2YXJfZmxhZyBkYXRhIG51bGxBbGxvd2VkIGlzTGFyZ2UKKworI3ZvaWQgZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cykKK2dsRGVsZXRlVmVydGV4QXJyYXlzT0VTCisJbGVuIGFycmF5cyAobiAqIHNpemVvZihHTHVpbnQpKQorICAgIHBhcmFtX2NoZWNrIG4gaWYobjwwKXsgY3R4LT5zZXRFcnJvcihHTF9JTlZBTElEX1ZBTFVFKTsgcmV0dXJuOyB9IAorCisjdm9pZCBnbEdlblZlcnRleEFycmF5c09FUyhHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKQorZ2xHZW5WZXJ0ZXhBcnJheXNPRVMKKwlsZW4gYXJyYXlzIChuICogc2l6ZW9mKEdMdWludCkpCisJZGlyIGFycmF5cyBvdXQKKyAgICBwYXJhbV9jaGVjayBuIGlmKG48MCl7IGN0eC0+c2V0RXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7IHJldHVybjsgfSAKKworCisjdm9pZCBnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBHTGVudW0gKmF0dGFjaG1lbnRzKQorZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQKKwlsZW4gYXR0YWNobWVudHMgKG51bUF0dGFjaG1lbnRzICogc2l6ZW9mKEdMZW51bSkpCisKKyN2b2lkIGdsTXVsdGlEcmF3QXJyYXlzRVhUKEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCkKK2dsTXVsdGlEcmF3QXJyYXlzRVhUCisJZmxhZyB1bnN1cHBvcnRlZAorI3ZvaWQgZ2xNdWx0aURyYXdFbGVtZW50c0VYVChHTGVudW0gbW9kZSwgR0xzaXplaSAqY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGNvbnN0ICppbmRpY2VzLCBHTHNpemVpIHByaW1jb3VudCkKK2dsTXVsdGlEcmF3RWxlbWVudHNFWFQKKwlmbGFnIHVuc3VwcG9ydGVkCisKKworIyBoYW5kbGVkIGJ5IGVuY29kZXIKKyN2b2lkIGdsU2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIEdMc3RyICpzdHJpbmcsIGNvbnN0IEdMaW50ICpsZW5ndGgpCitnbFNoYWRlclNvdXJjZQorCWZsYWcgdW5zdXBwb3J0ZWQKKworCisKKyN2b2lkIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3VwcykKK2dsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRChHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKQorZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1ECisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZykKK2dsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRAorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZykKK2dsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1ECisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpCitnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2VuUGVyZk1vbml0b3JzQU1EKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykKK2dsR2VuUGVyZk1vbml0b3JzQU1ECisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpCitnbERlbGV0ZVBlcmZNb25pdG9yc0FNRAorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EKEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJzTGlzdCkKK2dsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRAorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xCZWdpblBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKQorZ2xCZWdpblBlcmZNb25pdG9yQU1ECisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEVuZFBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKQorZ2xFbmRQZXJmTW9uaXRvckFNRAorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbikKK2dsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRAorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQorZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpCitnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsRGVsZXRlRmVuY2VzTlYoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcykKK2dsRGVsZXRlRmVuY2VzTlYKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2VuRmVuY2VzTlYoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcykKK2dsR2VuRmVuY2VzTlYKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyNHTGJvb2xlYW4gZ2xJc0ZlbmNlTlYoR0x1aW50IGZlbmNlKQorZ2xJc0ZlbmNlTlYKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyNHTGJvb2xlYW4gZ2xUZXN0RmVuY2VOVihHTHVpbnQgZmVuY2UpCitnbFRlc3RGZW5jZU5WCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldEZlbmNlaXZOVihHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKK2dsR2V0RmVuY2Vpdk5WCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEZpbmlzaEZlbmNlTlYoR0x1aW50IGZlbmNlKQorZ2xGaW5pc2hGZW5jZU5WCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbFNldEZlbmNlTlYoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKQorZ2xTZXRGZW5jZU5WCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbENvdmVyYWdlTWFza05WKEdMYm9vbGVhbiBtYXNrKQorZ2xDb3ZlcmFnZU1hc2tOVgorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WKEdMZW51bSBvcGVyYXRpb24pCitnbENvdmVyYWdlT3BlcmF0aW9uTlYKKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykKK2dsR2V0RHJpdmVyQ29udHJvbHNRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NKEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKQorZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCkKK2dsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00KKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NKEdMdWludCBkcml2ZXJDb250cm9sKQorZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00KKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsRXh0R2V0VGV4dHVyZXNRQ09NKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpCitnbEV4dEdldFRleHR1cmVzUUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFeHRHZXRCdWZmZXJzUUNPTShHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKQorZ2xFeHRHZXRCdWZmZXJzUUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTShHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKQorZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpCitnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00KKwlmbGFnIHVuc3VwcG9ydGVkCisKKyN2b2lkIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00oR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00oR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK2dsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldFRleFN1YkltYWdlUUNPTShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscykKK2dsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTShHTGVudW0gdGFyZ2V0LCBHTHZvaWRwdHIgKnBhcmFtcykKK2dsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldFNoYWRlcnNRQ09NKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpCitnbEV4dEdldFNoYWRlcnNRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldFByb2dyYW1zUUNPTShHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKQorZ2xFeHRHZXRQcm9ncmFtc1FDT00KKwlmbGFnIHVuc3VwcG9ydGVkCisKKyNHTGJvb2xlYW4gZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NKEdMdWludCBwcm9ncmFtKQorZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpCitnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisjdm9pZCBnbFN0YXJ0VGlsaW5nUUNPTShHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spCitnbFN0YXJ0VGlsaW5nUUNPTQorCWZsYWcgdW5zdXBwb3J0ZWQKKworI3ZvaWQgZ2xFbmRUaWxpbmdRQ09NKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKQorZ2xFbmRUaWxpbmdRQ09NCisJZmxhZyB1bnN1cHBvcnRlZAorCisKKyN2b2lkIGdsVmVydGV4QXR0cmliUG9pbnRlckRhdGEoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitnbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhCisJbGVuIGRhdGEgZGF0YWxlbgorCWN1c3RvbV9wYWNrIGRhdGEgZ2xVdGlsc1BhY2tQb2ludGVyRGF0YSgodW5zaWduZWQgY2hhciAqKXB0ciwgKHVuc2lnbmVkIGNoYXIgKilkYXRhLCBzaXplLCB0eXBlLCBzdHJpZGUsIGRhdGFsZW4pIAorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKKworZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyT2Zmc2V0CisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCisjY2xpZW50LXN0YXRlLCBoYW5kbGVkIGJ5IHRoZSBlbmNvZGVyCisjR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpCitnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2CisJZmxhZyB1bnN1cHBvcnRlZAorCitnbERyYXdFbGVtZW50c0RhdGEKKwlsZW4gZGF0YSBkYXRhbGVuCisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCitnbERyYXdFbGVtZW50c09mZnNldAorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKKworI0dMX0VOVFJZKHZvaWQsIGdsR2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLCBpbnQgY291bnQsIEdMaW50ICpmb3JtYXRzKQorZ2xHZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMKKwlkaXIgZm9ybWF0cyBvdXQKKwlsZW4gZm9ybWF0cyAoY291bnQgKiBzaXplb2YoR0xpbnQpKQorCWZsYWcgY3VzdG9tX2RlY29kZXIKKwlmbGFnIG5vdF9hcGkKKworI0dMX0VOVFJZKHZvaWQsIGdsU2hhZGVyU3RyaW5nLCBHTHVpbnQgc2hhZGVyLCBHTGNoYXIgKnN0cmluZywgR0xzaXplaSBsZW4pCitnbFNoYWRlclN0cmluZworCWxlbiBzdHJpbmcgbGVuCisJZmxhZyBjdXN0b21fZGVjb2RlcgorCWZsYWcgbm90X2FwaQorCQorZ2xGaW5pc2hSb3VuZFRyaXAKKwlmbGFnIGN1c3RvbV9kZWNvZGVyCisJZmxhZyBub3RfYXBpCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9nbGVzMi5pbiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvR0xFU3YyX2RlYy9nbGVzMi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBkYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyLmluCkBAIC0wLDAgKzEsMjE0IEBACitHTF9FTlRSWSh2b2lkLCBnbEFjdGl2ZVRleHR1cmUsIEdMZW51bSB0ZXh0dXJlKQorR0xfRU5UUlkodm9pZCwgZ2xBdHRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKQorR0xfRU5UUlkodm9pZCwgZ2xCaW5kQXR0cmliTG9jYXRpb24sIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSkKK0dMX0VOVFJZKHZvaWQsIGdsQmluZEJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIGdsQmluZEZyYW1lYnVmZmVyLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpCitHTF9FTlRSWSh2b2lkLCBnbEJpbmRSZW5kZXJidWZmZXIsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpCitHTF9FTlRSWSh2b2lkLCBnbEJpbmRUZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkKK0dMX0VOVFJZKHZvaWQsIGdsQmxlbmRDb2xvciwgR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpCitHTF9FTlRSWSh2b2lkLCBnbEJsZW5kRXF1YXRpb24sICBHTGVudW0gbW9kZSApCitHTF9FTlRSWSh2b2lkLCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpCitHTF9FTlRSWSh2b2lkLCBnbEJsZW5kRnVuYywgR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKQorR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpCitHTF9FTlRSWSh2b2lkLCBnbEJ1ZmZlckRhdGEsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpCitHTF9FTlRSWSh2b2lkLCBnbEJ1ZmZlclN1YkRhdGEsIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCitHTF9FTlRSWShHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cywgR0xlbnVtIHRhcmdldCkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXIsIEdMYml0ZmllbGQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvciwgR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpCitHTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGhmLCBHTGNsYW1wZiBkZXB0aCkKK0dMX0VOVFJZKHZvaWQsIGdsQ2xlYXJTdGVuY2lsLCBHTGludCBzKQorR0xfRU5UUlkodm9pZCwgZ2xDb2xvck1hc2ssIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSkKK0dMX0VOVFJZKHZvaWQsIGdsQ29tcGlsZVNoYWRlciwgR0x1aW50IHNoYWRlcikKK0dMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCitHTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCitHTF9FTlRSWSh2b2lkLCBnbENvcHlUZXhJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKQorR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQorR0xfRU5UUlkoR0x1aW50LCBnbENyZWF0ZVByb2dyYW0sIHZvaWQpCitHTF9FTlRSWShHTHVpbnQsIGdsQ3JlYXRlU2hhZGVyLCBHTGVudW0gdHlwZSkKK0dMX0VOVFJZKHZvaWQsIGdsQ3VsbEZhY2UsIEdMZW51bSBtb2RlKQorR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVCdWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlRnJhbWVidWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUmVuZGVyYnVmZmVycywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVNoYWRlciwgR0x1aW50IHNoYWRlcikKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlVGV4dHVyZXMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiB0ZXh0dXJlcykKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhGdW5jLCBHTGVudW0gZnVuYykKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhNYXNrLCBHTGJvb2xlYW4gZmxhZykKK0dMX0VOVFJZKHZvaWQsIGdsRGVwdGhSYW5nZWYsIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKQorR0xfRU5UUlkodm9pZCwgZ2xEZXRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKQorR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlLCBHTGVudW0gY2FwKQorR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIEdMdWludCBpbmRleCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd0FycmF5cywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQorR0xfRU5UUlkodm9pZCwgZ2xEcmF3RWxlbWVudHMsIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKQorR0xfRU5UUlkodm9pZCwgZ2xFbmFibGUsIEdMZW51bSBjYXApCitHTF9FTlRSWSh2b2lkLCBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBHTHVpbnQgaW5kZXgpCitHTF9FTlRSWSh2b2lkLCBnbEZpbmlzaCwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsRmx1c2gsIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpCitHTF9FTlRSWSh2b2lkLCBnbEZyb250RmFjZSwgR0xlbnVtIG1vZGUpCitHTF9FTlRSWSh2b2lkLCBnbEdlbkJ1ZmZlcnMsIEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5lcmF0ZU1pcG1hcCwgR0xlbnVtIHRhcmdldCkKK0dMX0VOVFJZKHZvaWQsIGdsR2VuRnJhbWVidWZmZXJzLCBHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5SZW5kZXJidWZmZXJzLCBHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycykKK0dMX0VOVFJZKHZvaWQsIGdsR2VuVGV4dHVyZXMsIEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0QWN0aXZlQXR0cmliLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRBY3RpdmVVbmlmb3JtLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRBdHRhY2hlZFNoYWRlcnMsIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpKiBjb3VudCwgR0x1aW50KiBzaGFkZXJzKQorR0xfRU5UUlkoaW50LCBnbEdldEF0dHJpYkxvY2F0aW9uLCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRCb29sZWFudiwgR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK0dMX0VOVFJZKEdMZW51bSwgZ2xHZXRFcnJvciwgdm9pZCkKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RmxvYXR2LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldEludGVnZXJ2LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEdldFByb2dyYW1pdiwgR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0UHJvZ3JhbUluZm9Mb2csIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJpdiwgR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJJbmZvTG9nLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRTaGFkZXJTb3VyY2UsIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSkKK0dMX0VOVFJZKGNvbnN0IEdMdWJ5dGUqLCBnbEdldFN0cmluZywgR0xlbnVtIG5hbWUpCitHTF9FTlRSWSh2b2lkLCBnbEdldFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VW5pZm9ybWZ2LCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VW5pZm9ybWl2LCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpCitHTF9FTlRSWShpbnQsIGdsR2V0VW5pZm9ybUxvY2F0aW9uLCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliaXYsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpCitHTF9FTlRSWSh2b2lkLCBnbEhpbnQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzQnVmZmVyLCBHTHVpbnQgYnVmZmVyKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRW5hYmxlZCwgR0xlbnVtIGNhcCkKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0ZyYW1lYnVmZmVyLCBHTHVpbnQgZnJhbWVidWZmZXIpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1JlbmRlcmJ1ZmZlciwgR0x1aW50IHJlbmRlcmJ1ZmZlcikKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1NoYWRlciwgR0x1aW50IHNoYWRlcikKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1RleHR1cmUsIEdMdWludCB0ZXh0dXJlKQorR0xfRU5UUlkodm9pZCwgZ2xMaW5lV2lkdGgsIEdMZmxvYXQgd2lkdGgpCitHTF9FTlRSWSh2b2lkLCBnbExpbmtQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKK0dMX0VOVFJZKHZvaWQsIGdsUGl4ZWxTdG9yZWksIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFBvbHlnb25PZmZzZXQsIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKQorR0xfRU5UUlkodm9pZCwgZ2xSZWFkUGl4ZWxzLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCogcGl4ZWxzKQorR0xfRU5UUlkodm9pZCwgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIsIHZvaWQpCitHTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbFNhbXBsZUNvdmVyYWdlLCBHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKK0dMX0VOVFJZKHZvaWQsIGdsU2Npc3NvciwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbFNoYWRlckJpbmFyeSwgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCkKK0dMX0VOVFJZKHZvaWQsIGdsU2hhZGVyU291cmNlLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqY29uc3QqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkKK0dMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbEZ1bmMsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKQorR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spCitHTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxNYXNrLCBHTHVpbnQgbWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKQorR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsT3AsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykKK0dMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE9wU2VwYXJhdGUsIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpCitHTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKQorR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaSwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKK0dMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykKK0dMX0VOVFJZKHZvaWQsIGdsVGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0xZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkKK0dMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTFmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0xaSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0xaXYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikKK0dMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTJmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0yZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQorR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMmksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KQorR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMml2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0zZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0zZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KQorR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtM2ksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KQorR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtM2l2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm00ZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykKK0dMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTRmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm00aSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm00aXYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikKK0dMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybU1hdHJpeDJmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKQorR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtTWF0cml4M2Z2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpCitHTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm1NYXRyaXg0ZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkKK0dMX0VOVFJZKHZvaWQsIGdsVXNlUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFZhbGlkYXRlUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjFmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4KQorR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIxZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjJmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjJmdiwgR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliM2YsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQorR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIzZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjRmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KQorR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWI0ZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYlBvaW50ZXIsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cikKK0dMX0VOVFJZKHZvaWQsIGdsVmlld3BvcnQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkKK0dMX0VOVFJZKHZvaWQsIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRQcm9ncmFtQmluYXJ5T0VTLCBHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSkKK0dMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbUJpbmFyeU9FUywgR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpCitHTF9FTlRSWSh2b2lkKiwgZ2xNYXBCdWZmZXJPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsVW5tYXBCdWZmZXJPRVMsIEdMZW51bSB0YXJnZXQpCisjR0xfRU5UUlkodm9pZCwgZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlM0RPRVMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykKK0dMX0VOVFJZKHZvaWQsIGdsVGV4U3ViSW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpCitHTF9FTlRSWSh2b2lkLCBnbENvcHlUZXhTdWJJbWFnZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQorR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQorR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsQmluZFZlcnRleEFycmF5T0VTLCBHTHVpbnQgYXJyYXkpCitHTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVZlcnRleEFycmF5c09FUywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cykKK0dMX0VOVFJZKHZvaWQsIGdsR2VuVmVydGV4QXJyYXlzT0VTLCBHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKQorR0xfRU5UUlkoR0xib29sZWFuLCBnbElzVmVydGV4QXJyYXlPRVMsIEdMdWludCBhcnJheSkKK0dMX0VOVFJZKHZvaWQsIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhULCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKQorR0xfRU5UUlkodm9pZCwgZ2xNdWx0aURyYXdBcnJheXNFWFQsIEdMZW51bSBtb2RlLCBjb25zdCBHTGludCAqZmlyc3QsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCkKK0dMX0VOVFJZKHZvaWQsIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQsIEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCpjb25zdCogaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpCisKKyNub3Qgc3VwcG9ydGVkCitHTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1ELCBHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCBHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1ELCBHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQsIEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpCitHTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQsIEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5QZXJmTW9uaXRvcnNBTUQsIEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykKK0dMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1ELCBHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpCitHTF9FTlRSWSh2b2lkLCBnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJzTGlzdCkKK0dMX0VOVFJZKHZvaWQsIGdsQmVnaW5QZXJmTW9uaXRvckFNRCwgR0x1aW50IG1vbml0b3IpCitHTF9FTlRSWSh2b2lkLCBnbEVuZFBlcmZNb25pdG9yQU1ELCBHTHVpbnQgbW9uaXRvcikKK0dMX0VOVFJZKHZvaWQsIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCwgR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKQorCitHTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRywgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQorR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpCitHTF9FTlRSWSh2b2lkLCBnbERlbGV0ZUZlbmNlc05WLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKQorR0xfRU5UUlkodm9pZCwgZ2xHZW5GZW5jZXNOViwgR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcykKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0ZlbmNlTlYsIEdMdWludCBmZW5jZSkKK0dMX0VOVFJZKEdMYm9vbGVhbiwgZ2xUZXN0RmVuY2VOViwgR0x1aW50IGZlbmNlKQorR0xfRU5UUlkodm9pZCwgZ2xHZXRGZW5jZWl2TlYsIEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xGaW5pc2hGZW5jZU5WLCBHTHVpbnQgZmVuY2UpCitHTF9FTlRSWSh2b2lkLCBnbFNldEZlbmNlTlYsIEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbikKK0dMX0VOVFJZKHZvaWQsIGdsQ292ZXJhZ2VNYXNrTlYsIEdMYm9vbGVhbiBtYXNrKQorR0xfRU5UUlkodm9pZCwgZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WLCBHTGVudW0gb3BlcmF0aW9uKQorR0xfRU5UUlkodm9pZCwgZ2xHZXREcml2ZXJDb250cm9sc1FDT00sIEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykKK0dMX0VOVFJZKHZvaWQsIGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIEdMdWludCBkcml2ZXJDb250cm9sLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpkcml2ZXJDb250cm9sU3RyaW5nKQorR0xfRU5UUlkodm9pZCwgZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSwgR0x1aW50IGRyaXZlckNvbnRyb2wpCitHTF9FTlRSWSh2b2lkLCBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSwgR0x1aW50IGRyaXZlckNvbnRyb2wpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFRleHR1cmVzUUNPTSwgR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcykKK0dMX0VOVFJZKHZvaWQsIGdsRXh0R2V0QnVmZmVyc1FDT00sIEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NLCBHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQorR0xfRU5UUlkodm9pZCwgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFRleFN1YkltYWdlUUNPTSwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSwgR0xlbnVtIHRhcmdldCwgR0x2b2lkcHRyICpwYXJhbXMpCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFNoYWRlcnNRQ09NLCBHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKQorR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRQcm9ncmFtc1FDT00sIEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpCitHTF9FTlRSWShHTGJvb2xlYW4sIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgR0x1aW50IHByb2dyYW0pCitHTF9FTlRSWSh2b2lkLCBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NLCBHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKQorR0xfRU5UUlkodm9pZCwgZ2xTdGFydFRpbGluZ1FDT00sIEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykKK0dMX0VOVFJZKHZvaWQsIGdsRW5kVGlsaW5nUUNPTSwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spCisKKyMgYWRkLW9ucworR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSwgR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsICB2b2lkICogZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYlBvaW50ZXJPZmZzZXQsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCAgR0x1aW50IG9mZnNldCkKK0dMX0VOVFJZKHZvaWQsIGdsRHJhd0VsZW1lbnRzT2Zmc2V0LCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMdWludCBvZmZzZXQpCitHTF9FTlRSWSh2b2lkLCBnbERyYXdFbGVtZW50c0RhdGEsIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgdm9pZCAqZGF0YSwgR0x1aW50IGRhdGFsZW4pCitHTF9FTlRSWSh2b2lkLCBnbEdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cywgaW50IGNvdW50LCBHTGludCAqZm9ybWF0cykKK0dMX0VOVFJZKHZvaWQsIGdsU2hhZGVyU3RyaW5nLCBHTHVpbnQgc2hhZGVyLCBjb25zdCBHTGNoYXIqIHN0cmluZywgR0xzaXplaSBsZW4pCitHTF9FTlRSWShpbnQsIGdsRmluaXNoUm91bmRUcmlwLCB2b2lkKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyLnR5cGVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyLnR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNDcxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvZ2xlczIudHlwZXMKQEAgLTAsMCArMSwzOCBAQAorR0xiaXRmaWVsZCAzMiAweCUwOHgKK0dMYm9vbGVhbiA4ICVkCitHTGNsYW1wZiAzMiAlZgorR0xjbGFtcHggMzIgMHglMDh4CitHTGVnbEltYWdlT0VTIDMyICVwCitHTGVudW0gMzIgMHglMDh4CitHTGZpeGVkIDMyIDB4JTA4eAorR0xmbG9hdCAzMiAlZgorR0xpbnQgMzIgJWQKK0dMaW50cHRyIDMyIDB4JTA4bHgKK0dMc2hvcnQgMTYgJWQKK0dMc2l6ZWkgMzIgJWQKK0dMc2l6ZWlwdHIgMzIgMHglMDhseAorR0x1Ynl0ZSA4IDB4JTAyeAorR0x1aW50IDMyICV1CitHTHZvaWQgMCAleAorR0xjaGFyIDggJWQKK0dMZW51bSogMzIgMHglMDh4CitHTGJvb2xlYW4qIDMyIDB4JTA4eAorR0xjbGFtcGYqIDMyIDB4JTA4eAorR0xjbGFtcHgqIDMyIDB4JTA4eAorR0xlZ2xJbWFnZU9FUyogMzIgMHglMDh4CitHTGZpeGVkKiAzMiAweCUwOHgKK0dMZmxvYXQqIDMyIDB4JTA4eAorR0xpbnQqIDMyIDB4JTA4eAorR0xzaG9ydCogMzIgMHglMDh4CitHTHNpemVpKiAzMiAweCUwOHgKK0dMdWJ5dGUqIDMyIDB4JTA4eAorR0x1aW50KiAzMiAweCUwOHgKK0dMdm9pZCogMzIgMHglMDh4CitHTGNoYXIqIDMyIDB4JTA4eAorR0xjaGFyKiogMzIgMHglMDh4CitHTHZvaWQqKiAzMiAweCUwOHgKK3ZvaWQqIDMyIDB4JTA4eAorR0xzdHIqIDMyIDB4JTA4eAorR0x2b2lkcHRyKiAzMiAweCUwOHgKK0dMY2hhcipjb25zdCogMzIgMHglMDh4CitHTHZvaWQqY29uc3QqIDMyIDB4JTA4eApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyX3R5cGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL0dMRVN2Ml9kZWMvZ2xlczJfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZmNjFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9HTEVTdjJfZGVjL2dsZXMyX3R5cGVzLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgX0dMXzJfVFlQRVNfSF8KKyNkZWZpbmUgX0dMXzJfVFlQRVNfSF8KKyNpbmNsdWRlICJnbF9iYXNlX3R5cGVzLmgiCisKK3R5cGVkZWYgdm9pZCAqR0x2b2lkcHRyOworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0FuZHJvaWQubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NmZlNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ2IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2hvc3RfT1NfU1JDUyA6PQoraG9zdF9jb21tb25fTERMSUJTIDo9CisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxsaW51eCkKKyAgICBob3N0X09TX1NSQ1MgPSBFZ2xPc0FwaV9nbHguY3BwCisgICAgaG9zdF9jb21tb25fTERMSUJTICs9IC1sR0wgLWxYMTEgLWxkbCAtbHB0aHJlYWQKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCisgICAgaG9zdF9PU19TUkNTID0gRWdsT3NBcGlfZGFyd2luLmNwcCBcCisgICAgICAgICAgICAgICAgICAgTWFjTmF0aXZlLm0gICBcCisgICAgICAgICAgICAgICAgICAgTWFjUGl4ZWxGb3JtYXRzQXR0cmlicy5tCisKKyAgICBob3N0X2NvbW1vbl9MRExJQlMgKz0gLVdsLC1mcmFtZXdvcmssQXBwS2l0CitlbmRpZgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICBob3N0X09TX1NSQ1MgPSBFZ2xPc0FwaV93Z2wuY3BwCisgICAgaG9zdF9jb21tb25fTERMSUJTICs9IC1sZ2RpMzIKK2VuZGlmCisKK2hvc3RfY29tbW9uX1NSQ19GSUxFUyA6PSAgICAgIFwKKyAgICAgJChob3N0X09TX1NSQ1MpICAgICAgICAgIFwKKyAgICAgVGhyZWFkSW5mby5jcHAgICAgICAgICAgIFwKKyAgICAgRWdsSW1wLmNwcCAgICAgICAgICAgICAgIFwKKyAgICAgRWdsQ29uZmlnLmNwcCAgICAgICAgICAgIFwKKyAgICAgRWdsQ29udGV4dC5jcHAgICAgICAgICAgIFwKKyAgICAgRWdsR2xvYmFsSW5mby5jcHAgICAgICAgIFwKKyAgICAgRWdsVmFsaWRhdGUuY3BwICAgICAgICAgIFwKKyAgICAgRWdsU3VyZmFjZS5jcHAgICAgICAgICAgIFwKKyAgICAgRWdsV2luZG93U3VyZmFjZS5jcHAgICAgIFwKKyAgICAgRWdsUGJ1ZmZlclN1cmZhY2UuY3BwICAgIFwKKyAgICAgRWdsVGhyZWFkSW5mby5jcHAgICAgICAgIFwKKyAgICAgRWdsRGlzcGxheS5jcHAgICAgICAgICAgIFwKKyAgICAgQ2xpZW50QVBJRXh0cy5jcHAKKworIyMjIEVHTCBob3N0IGltcGxlbWVudGF0aW9uICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJChjYWxsIGVtdWdsLWJlZ2luLXNoYXJlZC1saWJyYXJ5LGxpYiQoQlVJTERfVEFSR0VUX1NVRkZJWClFR0xfdHJhbnNsYXRvcikKKyQoY2FsbCBlbXVnbC1pbXBvcnQsbGliR0xjb21tb24pCisKK0xPQ0FMX0xETElCUyArPSAkKGhvc3RfY29tbW9uX0xETElCUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhvc3RfY29tbW9uX1NSQ19GSUxFUykKKworJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0NsaWVudEFQSUV4dHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9DbGllbnRBUElFeHRzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDRhNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9DbGllbnRBUElFeHRzLmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJDbGllbnRBUElFeHRzLmgiCisjaW5jbHVkZSAiRWdsR2xvYmFsSW5mby5oIgorI2luY2x1ZGUgIkdMY29tbW9uL0dMdXRpbHMuaCIKKyNpbmNsdWRlICJHTGNvbW1vbi9UcmFuc2xhdG9ySWZhY2VzLmgiCisjaW5jbHVkZSAiVGhyZWFkSW5mby5oIgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKK25hbWVzcGFjZSBDbGllbnRBUElFeHRzCit7CisKKy8vCisvLyBkZWZpbmUgZnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciBlYWNoIGV4dGVuc2lvbgorLy8gdHlwZW5hbWUgaGFzIHRoZSBmb3JtIF9fZWdsX3tmdW5jbmFtZX1fdAorLy8KKyNkZWZpbmUgRlVOQ19UWVBFKGZuYW1lKSBfX2VnbF8gIyMgZm5hbWUgIyMgX3QKKyNkZWZpbmUgQVBJX0VOVFJZKGZuYW1lLHBhcmFtcyxhcmdzKSBcCisgICAgdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWSAqRlVOQ19UWVBFKGZuYW1lKSkgcGFyYW1zOworCisjZGVmaW5lIEFQSV9FTlRSWV9SRVQocnR5cGUsZm5hbWUscGFyYW1zLGFyZ3MpIFwKKyAgICB0eXBlZGVmIHJ0eXBlIChHTF9BUElFTlRSWSAqRlVOQ19UWVBFKGZuYW1lKSkgcGFyYW1zOworCisjaW5jbHVkZSAiQ2xpZW50QVBJRXh0cy5pbiIKKyN1bmRlZiBBUElfRU5UUlkKKyN1bmRlZiBBUElfRU5UUllfUkVUCisKKy8vLy8vCisvLyBEZWZpbmUgc3RhdGljIHRhYmxlIHRvIHN0b3JlIHRoZSBmdW5jdGlvbiB2YWx1ZSBmb3IgZWFjaAorLy8gY2xpZW50IEFQSS4gZnVuY3Rpb25zIHBvaW50ZXJzIHdpbGwgZ2V0IGluaXRpYWxpemVkIHRocm91Z2gKKy8vIENsaWVudEFQSUV4dHM6OmluaXRDbGllbnRGdW5jcyBmdW5jdGlvbiBhZnRlciBlYWNoIGNsaWVudCBBUEkgaGFzIGJlZW4KKy8vIGxvYWRlZC4KKy8vLy8vCisjZGVmaW5lIEFQSV9FTlRSWShmbmFtZSxwYXJhbXMsYXJncykgXAorICAgIEZVTkNfVFlQRShmbmFtZSkgZm5hbWU7CisKKyNkZWZpbmUgQVBJX0VOVFJZX1JFVChydHlwZSxmbmFtZSxwYXJhbXMsYXJncykgXAorICAgIEFQSV9FTlRSWShmbmFtZSxwYXJhbXMsYXJncykKKworc3RhdGljIHN0cnVjdCBfZXh0X3RhYmxlCit7CisjaW5jbHVkZSAiQ2xpZW50QVBJRXh0cy5pbiIKK30gc19jbGllbnRfZXh0ZW5zaW9uc1tNQVhfR0xFU19WRVJTSU9OLTFdOworCisjdW5kZWYgQVBJX0VOVFJZCisjdW5kZWYgQVBJX0VOVFJZX1JFVAorCisvLworLy8gVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplZCBlYWNoIGVudHJ5IGluIHRoZSBzX2NsaWVudF9leHRlbnNpb25zCisvLyBzdHJ1Y3QgYXQgdGhlIGdpdnZlbiBpbmRleCB1c2luZyB0aGUgZ2l2dmVuIGNsaWVudCBpbnRlcmZhY2UKKy8vCit2b2lkIGluaXRDbGllbnRGdW5jcyhjb25zdCBHTEVTaWZhY2UgKmlmYWNlLCBpbnQgaWR4KQoreworI2RlZmluZSBBUElfRU5UUlkoZm5hbWUscGFyYW1zLGFyZ3MpIFwKKyAgICBzX2NsaWVudF9leHRlbnNpb25zW2lkeF0uZm5hbWUgPSBcCisgICAgICAgICAgKEZVTkNfVFlQRShmbmFtZSkpaWZhY2UtPmdldFByb2NBZGRyZXNzKCNmbmFtZSk7CisKKyNkZWZpbmUgQVBJX0VOVFJZX1JFVChydHlwZSxmbmFtZSxwYXJhbXMsYXJncykgXAorICAgIEFQSV9FTlRSWShmbmFtZSxwYXJhbXMsYXJncykKKworICAgIC8vCisgICAgLy8gcmVzZXQgYWxsIGZ1bmMgcG9pbnRlcnMgdG8gTlVMTAorICAgIC8vCisgICAgbWVtc2V0KCZzX2NsaWVudF9leHRlbnNpb25zW2lkeF0sIDAsIHNpemVvZihzdHJ1Y3QgX2V4dF90YWJsZSkpOworCisgICAgLy8KKyAgICAvLyBBbmQgbm93IHF1ZXJ5IHRoZSBHTEVTIGxpYnJhcnkgZm9yIGVhY2ggcHJvYyBhZGRyZXNzCisgICAgLy8KKyNpbmNsdWRlICJDbGllbnRBUElFeHRzLmluIgorI3VuZGVmIEFQSV9FTlRSWQorI3VuZGVmIEFQSV9FTlRSWV9SRVQKK30KKworLy8KKy8vIERlZmluZSBpbXBsZW1lbnRhdGlvbiBmb3IgZWFjaCBleHRlbnNpb24gZnVuY3Rpb24gd2hpY2ggY2hlY2tzCisvLyB0aGUgY3VycmVudCBjb250ZXh0IHZlcnNpb24gYW5kIGNhbGxzIHRvIHRoZSBjb3JyZWN0IGNsaWVudCBBUEkKKy8vIGZ1bmN0aW9uLgorLy8KKyNkZWZpbmUgQVBJX0VOVFJZKGZuYW1lLHBhcmFtcyxhcmdzKSBcCisgICAgc3RhdGljIHZvaWQgX2VnbF8gIyMgZm5hbWUgcGFyYW1zIFwKKyAgICB7IFwKKyAgICAgICAgVGhyZWFkSW5mbyogdGhyZWFkICA9IGdldFRocmVhZEluZm8oKTsgXAorICAgICAgICBpZiAoIXRocmVhZC0+ZWdsQ29udGV4dC5nZXQoKSkgeyBcCisgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAgfSBcCisgICAgICAgIGludCBpZHggPSAoaW50KXRocmVhZC0+ZWdsQ29udGV4dC0+dmVyc2lvbigpIC0gMTsgXAorICAgICAgICBpZiAoIXNfY2xpZW50X2V4dGVuc2lvbnNbaWR4XS5mbmFtZSkgeyBcCisgICAgICAgICAgICByZXR1cm47IFwKKyAgICAgICAgfSBcCisgICAgICAgICgqc19jbGllbnRfZXh0ZW5zaW9uc1tpZHhdLmZuYW1lKSBhcmdzOyBcCisgICAgfQorCisjZGVmaW5lIEFQSV9FTlRSWV9SRVQocnR5cGUsZm5hbWUscGFyYW1zLGFyZ3MpIFwKKyAgICBzdGF0aWMgcnR5cGUgX2VnbF8gIyMgZm5hbWUgcGFyYW1zIFwKKyAgICB7IFwKKyAgICAgICAgVGhyZWFkSW5mbyogdGhyZWFkICA9IGdldFRocmVhZEluZm8oKTsgXAorICAgICAgICBpZiAoIXRocmVhZC0+ZWdsQ29udGV4dC5nZXQoKSkgeyBcCisgICAgICAgICAgICByZXR1cm4gKHJ0eXBlKTA7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGludCBpZHggPSAoaW50KXRocmVhZC0+ZWdsQ29udGV4dC0+dmVyc2lvbigpIC0gMTsgXAorICAgICAgICBpZiAoIXNfY2xpZW50X2V4dGVuc2lvbnNbaWR4XS5mbmFtZSkgeyBcCisgICAgICAgICAgICByZXR1cm4gKHJ0eXBlKTA7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHJldHVybiAoKnNfY2xpZW50X2V4dGVuc2lvbnNbaWR4XS5mbmFtZSkgYXJnczsgXAorICAgIH0KKworI2luY2x1ZGUgIkNsaWVudEFQSUV4dHMuaW4iCisjdW5kZWYgQVBJX0VOVFJZCisjdW5kZWYgQVBJX0VOVFJZX1JFVAorCisvLworLy8gRGVmaW5lIGEgdGFibGUgdG8gbWFwIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZSBsb2NhbCBfZWdsXyB2ZXJzaW9uIG9mCisvLyB0aGUgZXh0ZW5zaW9uIGZ1bmN0aW9uLCB0byBiZSB1c2VkIGluIGVnbEdldFByb2NBZGRyZXNzLgorLy8KKyNkZWZpbmUgQVBJX0VOVFJZKGZuYW1lLHBhcmFtcyxhcmdzKSBcCisgICAgeyAjZm5hbWUsIChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlfZWdsXyAjIyBmbmFtZX0sCisjZGVmaW5lIEFQSV9FTlRSWV9SRVQocnR5cGUsZm5hbWUscGFyYW1zLGFyZ3MpIFwKKyAgICBBUElfRU5UUlkoZm5hbWUscGFyYW1zLGFyZ3MpCisKK3N0YXRpYyBzdHJ1Y3QgX2NsaWVudF9leHRfZnVuY3MgeworICAgIGNvbnN0IGNoYXIgKmZuYW1lOworICAgIF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIHByb2M7Cit9IHNfY2xpZW50X2V4dF9mdW5jc1tdID0geworI2luY2x1ZGUgIkNsaWVudEFQSUV4dHMuaW4iCit9Oworc3RhdGljIGNvbnN0IGludCBudW1FeHRGdW5jcyA9IHNpemVvZihzX2NsaWVudF9leHRfZnVuY3MpIC8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNfY2xpZW50X2V4dF9mdW5jc1swXSk7CisKKyN1bmRlZiBBUElfRU5UUlkKKyN1bmRlZiBBUElfRU5UUllfUkVUCisKKy8vCisvLyByZXR1cm5zIHRoZSBfX2VnbF8gdmVyc2lvbiBvZiB0aGUgZ2l2dmVuIGV4dGVuc2lvbiBmdW5jdGlvbiBuYW1lLgorLy8KK19fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKmZuYW1lKQoreworICAgIGZvciAoaW50IGk9MDsgaTxudW1FeHRGdW5jczsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKGZuYW1lLCBzX2NsaWVudF9leHRfZnVuY3NbaV0uZm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gc19jbGllbnRfZXh0X2Z1bmNzW2ldLnByb2M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK30gLy8gb2YgbmFtZXNwYWNlIENsaWVudEFQSUV4dHMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvQ2xpZW50QVBJRXh0cy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9DbGllbnRBUElFeHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvQ2xpZW50QVBJRXh0cy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9DTElFTlRfQVBJU19FWFRTX0gKKyNkZWZpbmUgX0NMSUVOVF9BUElTX0VYVFNfSAorCisjaW5jbHVkZSAiR0xjb21tb24vVHJhbnNsYXRvcklmYWNlcy5oIgorCituYW1lc3BhY2UgQ2xpZW50QVBJRXh0cworeworCit2b2lkIGluaXRDbGllbnRGdW5jcyhjb25zdCBHTEVTaWZhY2UgKmlmYWNlLCBpbnQgaWR4KTsKK19fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKmZuYW1lKTsKKworfSAvLyBvZiBuYW1lc3BhY2UgQ2xpZW50QVBJRXh0cworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvQ2xpZW50QVBJRXh0cy5pbiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvQ2xpZW50QVBJRXh0cy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE2MmViCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9DbGllbnRBUElFeHRzLmluCkBAIC0wLDAgKzEsMjAxIEBACisvLworLy8gRWFjaCBleHRlbnNpb24gZnVuY3Rpb24gc2hvdWxkIGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKKy8vIG1hY3JvIGRlZmluaXRpb25zOgorLy8gICAgQVBJX0VOVFJZKGZ1bmNuYW1lLCBwYXJhbWxpc3QsIGFyZ2xpc3QpCisvLyAgLW9yLSAoaW4gY2FzZSBmdW5jaXRvbiBoYXMgcmV0dXJuIHZhbHVlKQorLy8gICAgQVBJX0VOVFJZX1JFVChyZXR1cm5fdHlwZSxmdW5jbmFtZSwgcGFyYW1saXN0LCBhcmdsaXN0KQorLy8KK0FQSV9FTlRSWShnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLAorICAgICAgICAgIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSwKKyAgICAgICAgICAodGFyZ2V0LCBpbWFnZSkpCisKK0FQSV9FTlRSWShnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUywKKyAgICAgICAgICAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSksCisgICAgICAgICAgKHRhcmdldCwgaW1hZ2UpKQorCitBUElfRU5UUlkoZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMsCisgICAgICAgICAgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSwKKyAgICAgICAgICAobW9kZVJHQiwgbW9kZUFscGhhKSkKKworQVBJX0VOVFJZKGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMsCisgICAgICAgICAgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSwKKyAgICAgICAgICAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSkpCisKK0FQSV9FTlRSWShnbEJsZW5kRXF1YXRpb25PRVMsCisgICAgICAgICAgKEdMZW51bSBtb2RlKSwKKyAgICAgICAgICAobW9kZSkpCisKK0FQSV9FTlRSWShnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTLAorICAgICAgICAgIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KSwKKyAgICAgICAgICAobWF0cml4cGFsZXR0ZWluZGV4KSkKKworQVBJX0VOVFJZKGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTLAorICAgICAgICAgICh2b2lkKSwKKyAgICAgICAgICAoKSkKKworQVBJX0VOVFJZKGdsTWF0cml4SW5kZXhQb2ludGVyT0VTLAorICAgICAgICAgIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqIHBvaW50ZXIpLAorICAgICAgICAgIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKQorCitBUElfRU5UUlkoZ2xXZWlnaHRQb2ludGVyT0VTLAorICAgICAgICAgIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqIHBvaW50ZXIpLAorICAgICAgICAgIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKQorCitBUElfRU5UUlkoZ2xEZXB0aFJhbmdlZk9FUywKKyAgICAgICAgICAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpLAorICAgICAgICAgICh6TmVhciwgekZhcikpCisKK0FQSV9FTlRSWShnbEZydXN0dW1mT0VTLAorICAgICAgICAgIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwKKyAgICAgICAgICAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcikpCisKK0FQSV9FTlRSWShnbE9ydGhvZk9FUywKKyAgICAgICAgICAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksCisgICAgICAgICAgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKQorCitBUElfRU5UUlkoZ2xDbGlwUGxhbmVmT0VTLAorICAgICAgICAgIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSwKKyAgICAgICAgICAocGxhbmUsIGVxdWF0aW9uKSkKKworQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZk9FUywKKyAgICAgICAgICAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICogZXFuKSwKKyAgICAgICAgICAocG5hbWUsIGVxbikpCisKK0FQSV9FTlRSWShnbENsZWFyRGVwdGhmT0VTLAorICAgICAgICAgIChHTGNsYW1wZiBkZXB0aCksCisgICAgICAgICAgKGRlcHRoKSkKKworQVBJX0VOVFJZKGdsUG9pbnRTaXplUG9pbnRlck9FUywKKyAgICAgICAgICAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLAorICAgICAgICAgICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKQorCitBUElfRU5UUlkoZ2xUZXhHZW5mT0VTLAorICAgICAgICAgIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksCisgICAgICAgICAgKGNvb3JkLCBwbmFtZSwgcGFyYW0pKQorCitBUElfRU5UUlkoZ2xUZXhHZW5mdk9FUywKKyAgICAgICAgICAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksCisgICAgICAgICAgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSkKKworQVBJX0VOVFJZKGdsVGV4R2VuaU9FUywKKyAgICAgICAgICAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwKKyAgICAgICAgICAoY29vcmQsIHBuYW1lLCBwYXJhbSkpCisKK0FQSV9FTlRSWShnbFRleEdlbml2T0VTLAorICAgICAgICAgIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyksCisgICAgICAgICAgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSkKKworQVBJX0VOVFJZKGdsVGV4R2VueE9FUywKKyAgICAgICAgICAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLAorICAgICAgICAgIChjb29yZCwgcG5hbWUsIHBhcmFtKSkKKworQVBJX0VOVFJZKGdsVGV4R2VueHZPRVMsCisgICAgICAgICAgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLAorICAgICAgICAgIChjb29yZCwgcG5hbWUsIHBhcmFtcykpCisKK0FQSV9FTlRSWShnbEdldFRleEdlbmZ2T0VTLAorICAgICAgICAgIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwKKyAgICAgICAgICAoY29vcmQsIHBuYW1lLCBwYXJhbXMpKQorCitBUElfRU5UUlkoZ2xHZXRUZXhHZW5pdk9FUywKKyAgICAgICAgICAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLAorICAgICAgICAgIChjb29yZCwgcG5hbWUsIHBhcmFtcykpCisKK0FQSV9FTlRSWShnbEdldFRleEdlbnh2T0VTLAorICAgICAgICAgIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwKKyAgICAgICAgICAoY29vcmQsIHBuYW1lLCBwYXJhbXMpKQorCitBUElfRU5UUllfUkVUKEdMYm9vbGVhbiwKKyAgICAgICAgICAgICAgZ2xJc1JlbmRlcmJ1ZmZlck9FUywKKyAgICAgICAgICAgICAgKEdMdWludCByZW5kZXJidWZmZXIpLAorICAgICAgICAgICAgICAocmVuZGVyYnVmZmVyKSkKKworQVBJX0VOVFJZKGdsQmluZFJlbmRlcmJ1ZmZlck9FUywKKyAgICAgICAgICAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciksCisgICAgICAgICAgKHRhcmdldCwgcmVuZGVyYnVmZmVyKSkKKworQVBJX0VOVFJZKGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywKKyAgICAgICAgICAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLAorICAgICAgICAgIChuLCByZW5kZXJidWZmZXJzKSkKKworQVBJX0VOVFJZKGdsR2VuUmVuZGVyYnVmZmVyc09FUywKKyAgICAgICAgICAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLAorICAgICAgICAgIChuLCByZW5kZXJidWZmZXJzKSkKKworQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywKKyAgICAgICAgICAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksCisgICAgICAgICAgKHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpKQorCitBUElfRU5UUlkoZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUywKKyAgICAgICAgICAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwKKyAgICAgICAgICAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSkKKworQVBJX0VOVFJZX1JFVChHTGJvb2xlYW4sCisgICAgICAgICAgICAgIGdsSXNGcmFtZWJ1ZmZlck9FUywKKyAgICAgICAgICAgICAgKEdMdWludCBmcmFtZWJ1ZmZlciksCisgICAgICAgICAgICAgIChmcmFtZWJ1ZmZlcikpCisKK0FQSV9FTlRSWShnbEJpbmRGcmFtZWJ1ZmZlck9FUywKKyAgICAgICAgICAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwKKyAgICAgICAgICAodGFyZ2V0LCBmcmFtZWJ1ZmZlcikpCisKK0FQSV9FTlRSWShnbERlbGV0ZUZyYW1lYnVmZmVyc09FUywKKyAgICAgICAgICAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyksCisgICAgICAgICAgKG4sIGZyYW1lYnVmZmVycykpCisKK0FQSV9FTlRSWShnbEdlbkZyYW1lYnVmZmVyc09FUywKKyAgICAgICAgICAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyksCisgICAgICAgICAgKG4sIGZyYW1lYnVmZmVycykpCisKK0FQSV9FTlRSWV9SRVQoR0xlbnVtLAorICAgICAgICAgICAgICBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMsCisgICAgICAgICAgICAgIChHTGVudW0gdGFyZ2V0KSwKKyAgICAgICAgICAgICAgKHRhcmdldCkpCisKK0FQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTLAorICAgICAgICAgIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKSwKKyAgICAgICAgICAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSkKKworQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMsCisgICAgICAgICAgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwKKyAgICAgICAgICAodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcikpCisKK0FQSV9FTlRSWShnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTLAorICAgICAgICAgIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwKKyAgICAgICAgICAodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKSkKKworQVBJX0VOVFJZKGdsR2VuZXJhdGVNaXBtYXBPRVMsCisgICAgICAgICAgKEdMZW51bSB0YXJnZXQpLAorICAgICAgICAgICh0YXJnZXQpKQorCitBUElfRU5UUlkoZ2xEcmF3VGV4c09FUywKKyAgICAgICAgICAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpLAorICAgICAgICAgICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSkKKworQVBJX0VOVFJZKGdsRHJhd1RleGlPRVMsCisgICAgICAgICAgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpLAorICAgICAgICAgICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSkKKworQVBJX0VOVFJZKGdsRHJhd1RleGZPRVMsCisgICAgICAgICAgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KSwKKyAgICAgICAgICAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCkpCisKK0FQSV9FTlRSWShnbERyYXdUZXh4T0VTLAorICAgICAgICAgIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCksCisgICAgICAgICAgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpKQorCitBUElfRU5UUlkoZ2xEcmF3VGV4c3ZPRVMsCisgICAgICAgICAgKGNvbnN0IEdMc2hvcnQgKmNvb3JkcyksCisgICAgICAgICAgKGNvb3JkcykpCisKK0FQSV9FTlRSWShnbERyYXdUZXhpdk9FUywKKyAgICAgICAgICAoY29uc3QgR0xpbnQgKmNvb3JkcyksCisgICAgICAgICAgKGNvb3JkcykpCisKK0FQSV9FTlRSWShnbERyYXdUZXhmdk9FUywKKyAgICAgICAgICAoY29uc3QgR0xmbG9hdCAqY29vcmRzKSwKKyAgICAgICAgICAoY29vcmRzKSkKKworQVBJX0VOVFJZKGdsRHJhd1RleHh2T0VTLAorICAgICAgICAgIChjb25zdCBHTGZpeGVkICpjb29yZHMpLAorICAgICAgICAgIChjb29yZHMpKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb25maWcuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGQwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbENvbmZpZy5jcHAKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiRWdsQ29uZmlnLmgiCisKK0VnbENvbmZpZzo6RWdsQ29uZmlnKEVHTGludCAgICAgcmVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGdyZWVuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGJsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgYWxwaGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGVudW0gICAgY2F2ZWF0LAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBjb25mb3JtYW50LAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBjb25maWdfaWQsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGRlcHRoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGZyYW1lX2J1ZmZlcl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgbWF4X3BidWZmZXJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIG1heF9wYnVmZmVyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgbWF4X3BidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTEJvb2xlYW4gbmF0aXZlX3JlbmRlcmFibGUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIHJlbmRlcmFibGVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgbmF0aXZlX3Zpc3VhbF9pZCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgbmF0aXZlX3Zpc3VhbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBzYW1wbGVfYnVmZmVyc19udW0sCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIHNhbXBsZXNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBzdGVuY2lsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGx1bWluYW5jZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICB3YW50ZWRfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIHN1cmZhY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGVudW0gICAgdHJhbnNwYXJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgdHJhbnNfcmVkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgdHJhbnNfZ3JlZW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICB0cmFuc19ibHVlX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTEJvb2xlYW4gcmVjb3JkYWJsZV9hbmRyb2lkLAorICAgICAgICAgICAgICAgICAgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBmcm10KToKKyAgICAgICAgbV9idWZmZXJfc2l6ZShyZWRfc2l6ZSArIGdyZWVuX3NpemUgKyBibHVlX3NpemUgKyBhbHBoYV9zaXplKSwKKyAgICAgICAgbV9yZWRfc2l6ZShyZWRfc2l6ZSksCisgICAgICAgIG1fZ3JlZW5fc2l6ZShncmVlbl9zaXplKSwKKyAgICAgICAgbV9ibHVlX3NpemUoYmx1ZV9zaXplKSwKKyAgICAgICAgbV9hbHBoYV9zaXplKGFscGhhX3NpemUpLAorICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYihFR0xfRkFMU0UpLCAvL25vdCBzdXBwb3J0ZWQgZm9yIG5vdworICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYmEoRUdMX0ZBTFNFKSwgLy9ub3Qgc3VwcG9ydGVkIGZvciBub3cKKyAgICAgICAgbV9jYXZlYXQoY2F2ZWF0KSwKKyAgICAgICAgbV9jb25maWdfaWQoY29uZmlnX2lkKSwKKyAgICAgICAgbV9uYXRpdmVfY29uZmlnX2lkKGNvbmZpZ19pZCksCisgICAgICAgIG1fZnJhbWVfYnVmZmVyX2xldmVsKGZyYW1lX2J1ZmZlcl9sZXZlbCksCisgICAgICAgIG1fZGVwdGhfc2l6ZShkZXB0aF9zaXplKSwKKyAgICAgICAgbV9tYXhfcGJ1ZmZlcl93aWR0aChtYXhfcGJ1ZmZlcl93aWR0aCksCisgICAgICAgIG1fbWF4X3BidWZmZXJfaGVpZ2h0KG1heF9wYnVmZmVyX2hlaWdodCksCisgICAgICAgIG1fbWF4X3BidWZmZXJfc2l6ZShtYXhfcGJ1ZmZlcl9zaXplKSwKKyAgICAgICAgbV9tYXhfc3dhcF9pbnRlcnZhbChNQVhfU1dBUF9JTlRFUlZBTCksCisgICAgICAgIG1fbWluX3N3YXBfaW50ZXJ2YWwoTUlOX1NXQVBfSU5URVJWQUwpLAorICAgICAgICBtX25hdGl2ZV9yZW5kZXJhYmxlKG5hdGl2ZV9yZW5kZXJhYmxlKSwKKyAgICAgICAgbV9yZW5kZXJhYmxlX3R5cGUocmVuZGVyYWJsZV90eXBlKSwKKyAgICAgICAgbV9uYXRpdmVfdmlzdWFsX2lkKG5hdGl2ZV92aXN1YWxfaWQpLAorICAgICAgICBtX25hdGl2ZV92aXN1YWxfdHlwZShuYXRpdmVfdmlzdWFsX3R5cGUpLAorICAgICAgICBtX3NhbXBsZV9idWZmZXJzX251bShzYW1wbGVfYnVmZmVyc19udW0pLAorICAgICAgICBtX3NhbXBsZXNfcGVyX3BpeGVsKHNhbXBsZXNfcGVyX3BpeGVsKSwKKyAgICAgICAgbV9zdGVuY2lsX3NpemUoc3RlbmNpbF9zaXplKSwKKyAgICAgICAgbV9sdW1pbmFuY2Vfc2l6ZShsdW1pbmFuY2Vfc2l6ZSksCisgICAgICAgIG1fd2FudGVkX2J1ZmZlcl9zaXplKHdhbnRlZF9idWZmZXJfc2l6ZSksCisgICAgICAgIG1fc3VyZmFjZV90eXBlKHN1cmZhY2VfdHlwZSksCisgICAgICAgIG1fdHJhbnNwYXJlbnRfdHlwZSh0cmFuc3BhcmVudF90eXBlKSwKKyAgICAgICAgbV90cmFuc19yZWRfdmFsKHRyYW5zX3JlZF92YWwpLAorICAgICAgICBtX3RyYW5zX2dyZWVuX3ZhbCh0cmFuc19ncmVlbl92YWwpLAorICAgICAgICBtX3RyYW5zX2JsdWVfdmFsKHRyYW5zX2JsdWVfdmFsKSwKKyAgICAgICAgbV9yZWNvcmRhYmxlX2FuZHJvaWQocmVjb3JkYWJsZV9hbmRyb2lkKSwKKyAgICAgICAgbV9jb25mb3JtYW50KGNvbmZvcm1hbnQpLAorICAgICAgICBtX25hdGl2ZUZvcm1hdChmcm10KSwKKyAgICAgICAgbV9jb2xvcl9idWZmZXJfdHlwZShFR0xfUkdCX0JVRkZFUikge30KKworRWdsQ29uZmlnOjpFZ2xDb25maWcoRUdMaW50ICAgICByZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgZ3JlZW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgYmx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBhbHBoYV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMZW51bSAgICBjYXZlYXQsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIGNvbmZpZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgZnJhbWVfYnVmZmVyX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBtYXhfcGJ1ZmZlcl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgbWF4X3BidWZmZXJfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBtYXhfcGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMQm9vbGVhbiBuYXRpdmVfcmVuZGVyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgcmVuZGVyYWJsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBuYXRpdmVfdmlzdWFsX2lkLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBuYXRpdmVfdmlzdWFsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIHNhbXBsZXNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICBzdGVuY2lsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgICAgIHN1cmZhY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGVudW0gICAgdHJhbnNwYXJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgdHJhbnNfcmVkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTGludCAgICAgdHJhbnNfZ3JlZW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICAgICB0cmFuc19ibHVlX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgIEVHTEJvb2xlYW4gcmVjb3JkYWJsZV9hbmRyb2lkLAorICAgICAgICAgICAgICAgICAgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBmcm10KToKKyAgICAgICAgbV9idWZmZXJfc2l6ZShyZWRfc2l6ZSArIGdyZWVuX3NpemUgKyBibHVlX3NpemUgKyBhbHBoYV9zaXplKSwKKyAgICAgICAgbV9yZWRfc2l6ZShyZWRfc2l6ZSksCisgICAgICAgIG1fZ3JlZW5fc2l6ZShncmVlbl9zaXplKSwKKyAgICAgICAgbV9ibHVlX3NpemUoYmx1ZV9zaXplKSwKKyAgICAgICAgbV9hbHBoYV9zaXplKGFscGhhX3NpemUpLAorICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYihFR0xfRkFMU0UpLCAvL25vdCBzdXBwb3J0ZWQgZm9yIG5vdworICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYmEoRUdMX0ZBTFNFKSwgLy9ub3Qgc3VwcG9ydGVkIGZvciBub3cKKyAgICAgICAgbV9jYXZlYXQoY2F2ZWF0KSwKKyAgICAgICAgbV9jb25maWdfaWQoY29uZmlnX2lkKSwKKyAgICAgICAgbV9uYXRpdmVfY29uZmlnX2lkKGNvbmZpZ19pZCksCisgICAgICAgIG1fZnJhbWVfYnVmZmVyX2xldmVsKGZyYW1lX2J1ZmZlcl9sZXZlbCksCisgICAgICAgIG1fZGVwdGhfc2l6ZShkZXB0aF9zaXplKSwKKyAgICAgICAgbV9tYXhfcGJ1ZmZlcl93aWR0aChtYXhfcGJ1ZmZlcl93aWR0aCksCisgICAgICAgIG1fbWF4X3BidWZmZXJfaGVpZ2h0KG1heF9wYnVmZmVyX2hlaWdodCksCisgICAgICAgIG1fbWF4X3BidWZmZXJfc2l6ZShtYXhfcGJ1ZmZlcl9zaXplKSwKKyAgICAgICAgbV9tYXhfc3dhcF9pbnRlcnZhbChNQVhfU1dBUF9JTlRFUlZBTCksCisgICAgICAgIG1fbWluX3N3YXBfaW50ZXJ2YWwoTUlOX1NXQVBfSU5URVJWQUwpLAorICAgICAgICBtX25hdGl2ZV9yZW5kZXJhYmxlKG5hdGl2ZV9yZW5kZXJhYmxlKSwKKyAgICAgICAgbV9yZW5kZXJhYmxlX3R5cGUocmVuZGVyYWJsZV90eXBlKSwKKyAgICAgICAgbV9uYXRpdmVfdmlzdWFsX2lkKG5hdGl2ZV92aXN1YWxfaWQpLAorICAgICAgICBtX25hdGl2ZV92aXN1YWxfdHlwZShuYXRpdmVfdmlzdWFsX3R5cGUpLAorICAgICAgICBtX3NhbXBsZV9idWZmZXJzX251bShzYW1wbGVzX3Blcl9waXhlbCA+IDAgPyAxIDogMCksCisgICAgICAgIG1fc2FtcGxlc19wZXJfcGl4ZWwoc2FtcGxlc19wZXJfcGl4ZWwpLAorICAgICAgICBtX3N0ZW5jaWxfc2l6ZShzdGVuY2lsX3NpemUpLAorICAgICAgICBtX2x1bWluYW5jZV9zaXplKDApLAorICAgICAgICBtX3dhbnRlZF9idWZmZXJfc2l6ZShFR0xfRE9OVF9DQVJFKSwKKyAgICAgICAgbV9zdXJmYWNlX3R5cGUoc3VyZmFjZV90eXBlKSwKKyAgICAgICAgbV90cmFuc3BhcmVudF90eXBlKHRyYW5zcGFyZW50X3R5cGUpLAorICAgICAgICBtX3RyYW5zX3JlZF92YWwodHJhbnNfcmVkX3ZhbCksCisgICAgICAgIG1fdHJhbnNfZ3JlZW5fdmFsKHRyYW5zX2dyZWVuX3ZhbCksCisgICAgICAgIG1fdHJhbnNfYmx1ZV92YWwodHJhbnNfYmx1ZV92YWwpLAorICAgICAgICBtX3JlY29yZGFibGVfYW5kcm9pZChyZWNvcmRhYmxlX2FuZHJvaWQpLAorICAgICAgICBtX2NvbmZvcm1hbnQoKChyZWRfc2l6ZSArIGdyZWVuX3NpemUgKyBibHVlX3NpemUgKyBhbHBoYV9zaXplID4gMCkgICYmCisgICAgICAgICAgICAgICAgICAgICAoY2F2ZWF0ICE9IEVHTF9OT05fQ09ORk9STUFOVF9DT05GSUcpKSA/CisgICAgICAgICAgICAgICAgICAgICBtX3JlbmRlcmFibGVfdHlwZSA6IDApLAorICAgICAgICBtX25hdGl2ZUZvcm1hdChmcm10KSwKKyAgICAgICAgbV9jb2xvcl9idWZmZXJfdHlwZShFR0xfUkdCX0JVRkZFUikge30KKworCitFZ2xDb25maWc6OkVnbENvbmZpZyhjb25zdCBFZ2xDb25maWcmIGNvbmYpIDoKKyAgICAgICAgbV9idWZmZXJfc2l6ZShjb25mLm1fYnVmZmVyX3NpemUpLAorICAgICAgICBtX3JlZF9zaXplKGNvbmYubV9yZWRfc2l6ZSksCisgICAgICAgIG1fZ3JlZW5fc2l6ZShjb25mLm1fZ3JlZW5fc2l6ZSksCisgICAgICAgIG1fYmx1ZV9zaXplKGNvbmYubV9ibHVlX3NpemUpLAorICAgICAgICBtX2FscGhhX3NpemUoY29uZi5tX2FscGhhX3NpemUpLAorICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYihjb25mLm1fYmluZF90b190ZXhfcmdiKSwKKyAgICAgICAgbV9iaW5kX3RvX3RleF9yZ2JhKGNvbmYubV9iaW5kX3RvX3RleF9yZ2JhKSwKKyAgICAgICAgbV9jYXZlYXQoY29uZi5tX2NhdmVhdCksCisgICAgICAgIG1fY29uZmlnX2lkKGNvbmYubV9jb25maWdfaWQpLAorICAgICAgICBtX25hdGl2ZV9jb25maWdfaWQoY29uZi5tX25hdGl2ZV9jb25maWdfaWQpLAorICAgICAgICBtX2ZyYW1lX2J1ZmZlcl9sZXZlbChjb25mLm1fZnJhbWVfYnVmZmVyX2xldmVsKSwKKyAgICAgICAgbV9kZXB0aF9zaXplKGNvbmYubV9kZXB0aF9zaXplKSwKKyAgICAgICAgbV9tYXhfcGJ1ZmZlcl93aWR0aChjb25mLm1fbWF4X3BidWZmZXJfd2lkdGgpLAorICAgICAgICBtX21heF9wYnVmZmVyX2hlaWdodChjb25mLm1fbWF4X3BidWZmZXJfaGVpZ2h0KSwKKyAgICAgICAgbV9tYXhfcGJ1ZmZlcl9zaXplKGNvbmYubV9tYXhfcGJ1ZmZlcl9zaXplKSwKKyAgICAgICAgbV9tYXhfc3dhcF9pbnRlcnZhbChjb25mLm1fbWF4X3N3YXBfaW50ZXJ2YWwpLAorICAgICAgICBtX21pbl9zd2FwX2ludGVydmFsKGNvbmYubV9taW5fc3dhcF9pbnRlcnZhbCksCisgICAgICAgIG1fbmF0aXZlX3JlbmRlcmFibGUoY29uZi5tX25hdGl2ZV9yZW5kZXJhYmxlKSwKKyAgICAgICAgbV9yZW5kZXJhYmxlX3R5cGUoY29uZi5tX3JlbmRlcmFibGVfdHlwZSksCisgICAgICAgIG1fbmF0aXZlX3Zpc3VhbF9pZChjb25mLm1fbmF0aXZlX3Zpc3VhbF9pZCksCisgICAgICAgIG1fbmF0aXZlX3Zpc3VhbF90eXBlKGNvbmYubV9uYXRpdmVfdmlzdWFsX3R5cGUpLAorICAgICAgICBtX3NhbXBsZV9idWZmZXJzX251bShjb25mLm1fc2FtcGxlX2J1ZmZlcnNfbnVtKSwKKyAgICAgICAgbV9zYW1wbGVzX3Blcl9waXhlbChjb25mLm1fc2FtcGxlc19wZXJfcGl4ZWwpLAorICAgICAgICBtX3N0ZW5jaWxfc2l6ZShjb25mLm1fc3RlbmNpbF9zaXplKSwKKyAgICAgICAgbV9sdW1pbmFuY2Vfc2l6ZShjb25mLm1fbHVtaW5hbmNlX3NpemUpLAorICAgICAgICBtX3dhbnRlZF9idWZmZXJfc2l6ZShjb25mLm1fd2FudGVkX2J1ZmZlcl9zaXplKSwKKyAgICAgICAgbV9zdXJmYWNlX3R5cGUoY29uZi5tX3N1cmZhY2VfdHlwZSksCisgICAgICAgIG1fdHJhbnNwYXJlbnRfdHlwZShjb25mLm1fdHJhbnNwYXJlbnRfdHlwZSksCisgICAgICAgIG1fdHJhbnNfcmVkX3ZhbChjb25mLm1fdHJhbnNfcmVkX3ZhbCksCisgICAgICAgIG1fdHJhbnNfZ3JlZW5fdmFsKGNvbmYubV90cmFuc19ncmVlbl92YWwpLAorICAgICAgICBtX3RyYW5zX2JsdWVfdmFsKGNvbmYubV90cmFuc19ibHVlX3ZhbCksCisgICAgICAgIG1fcmVjb3JkYWJsZV9hbmRyb2lkKGNvbmYubV9yZWNvcmRhYmxlX2FuZHJvaWQpLAorICAgICAgICBtX2NvbmZvcm1hbnQoY29uZi5tX2NvbmZvcm1hbnQpLAorICAgICAgICBtX25hdGl2ZUZvcm1hdChjb25mLm1fbmF0aXZlRm9ybWF0LT5jbG9uZSgpKSwKKyAgICAgICAgbV9jb2xvcl9idWZmZXJfdHlwZShFR0xfUkdCX0JVRkZFUikge30KKworCitFZ2xDb25maWc6OkVnbENvbmZpZyhjb25zdCBFZ2xDb25maWcmIGNvbmYsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgY29uZmlnX2lkLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50IHJlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGdyZWVuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgYmx1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGFscGhhX3NpemUpIDoKKyAgICAgICAgbV9idWZmZXJfc2l6ZShyZWRfc2l6ZSArIGdyZWVuX3NpemUgKyBibHVlX3NpemUgKyBhbHBoYV9zaXplKSwKKyAgICAgICAgbV9yZWRfc2l6ZShyZWRfc2l6ZSksCisgICAgICAgIG1fZ3JlZW5fc2l6ZShncmVlbl9zaXplKSwKKyAgICAgICAgbV9ibHVlX3NpemUoYmx1ZV9zaXplKSwKKyAgICAgICAgbV9hbHBoYV9zaXplKGFscGhhX3NpemUpLAorICAgICAgICBtX2JpbmRfdG9fdGV4X3JnYihjb25mLm1fYmluZF90b190ZXhfcmdiKSwKKyAgICAgICAgbV9iaW5kX3RvX3RleF9yZ2JhKGNvbmYubV9iaW5kX3RvX3RleF9yZ2JhKSwKKyAgICAgICAgbV9jYXZlYXQoY29uZi5tX2NhdmVhdCksCisgICAgICAgIG1fY29uZmlnX2lkKGNvbmZpZ19pZCksCisgICAgICAgIG1fbmF0aXZlX2NvbmZpZ19pZChjb25mLm1fbmF0aXZlX2NvbmZpZ19pZCksCisgICAgICAgIG1fZnJhbWVfYnVmZmVyX2xldmVsKGNvbmYubV9mcmFtZV9idWZmZXJfbGV2ZWwpLAorICAgICAgICBtX2RlcHRoX3NpemUoY29uZi5tX2RlcHRoX3NpemUpLAorICAgICAgICBtX21heF9wYnVmZmVyX3dpZHRoKGNvbmYubV9tYXhfcGJ1ZmZlcl93aWR0aCksCisgICAgICAgIG1fbWF4X3BidWZmZXJfaGVpZ2h0KGNvbmYubV9tYXhfcGJ1ZmZlcl9oZWlnaHQpLAorICAgICAgICBtX21heF9wYnVmZmVyX3NpemUoY29uZi5tX21heF9wYnVmZmVyX3NpemUpLAorICAgICAgICBtX21heF9zd2FwX2ludGVydmFsKGNvbmYubV9tYXhfc3dhcF9pbnRlcnZhbCksCisgICAgICAgIG1fbWluX3N3YXBfaW50ZXJ2YWwoY29uZi5tX21pbl9zd2FwX2ludGVydmFsKSwKKyAgICAgICAgbV9uYXRpdmVfcmVuZGVyYWJsZShjb25mLm1fbmF0aXZlX3JlbmRlcmFibGUpLAorICAgICAgICBtX3JlbmRlcmFibGVfdHlwZShjb25mLm1fcmVuZGVyYWJsZV90eXBlKSwKKyAgICAgICAgbV9uYXRpdmVfdmlzdWFsX2lkKGNvbmYubV9uYXRpdmVfdmlzdWFsX2lkKSwKKyAgICAgICAgbV9uYXRpdmVfdmlzdWFsX3R5cGUoY29uZi5tX25hdGl2ZV92aXN1YWxfdHlwZSksCisgICAgICAgIG1fc2FtcGxlX2J1ZmZlcnNfbnVtKGNvbmYubV9zYW1wbGVfYnVmZmVyc19udW0pLAorICAgICAgICBtX3NhbXBsZXNfcGVyX3BpeGVsKGNvbmYubV9zYW1wbGVzX3Blcl9waXhlbCksCisgICAgICAgIG1fc3RlbmNpbF9zaXplKGNvbmYubV9zdGVuY2lsX3NpemUpLAorICAgICAgICBtX2x1bWluYW5jZV9zaXplKGNvbmYubV9sdW1pbmFuY2Vfc2l6ZSksCisgICAgICAgIG1fd2FudGVkX2J1ZmZlcl9zaXplKGNvbmYubV93YW50ZWRfYnVmZmVyX3NpemUpLAorICAgICAgICBtX3N1cmZhY2VfdHlwZShjb25mLm1fc3VyZmFjZV90eXBlKSwKKyAgICAgICAgbV90cmFuc3BhcmVudF90eXBlKGNvbmYubV90cmFuc3BhcmVudF90eXBlKSwKKyAgICAgICAgbV90cmFuc19yZWRfdmFsKGNvbmYubV90cmFuc19yZWRfdmFsKSwKKyAgICAgICAgbV90cmFuc19ncmVlbl92YWwoY29uZi5tX3RyYW5zX2dyZWVuX3ZhbCksCisgICAgICAgIG1fdHJhbnNfYmx1ZV92YWwoY29uZi5tX3RyYW5zX2JsdWVfdmFsKSwKKyAgICAgICAgbV9yZWNvcmRhYmxlX2FuZHJvaWQoY29uZi5tX3JlY29yZGFibGVfYW5kcm9pZCksCisgICAgICAgIG1fY29uZm9ybWFudChjb25mLm1fY29uZm9ybWFudCksCisgICAgICAgIG1fbmF0aXZlRm9ybWF0KGNvbmYubV9uYXRpdmVGb3JtYXQtPmNsb25lKCkpLAorICAgICAgICBtX2NvbG9yX2J1ZmZlcl90eXBlKEVHTF9SR0JfQlVGRkVSKSB7fTsKKworYm9vbCBFZ2xDb25maWc6OmdldENvbmZBdHRyaWIoRUdMaW50IGF0dHJpYixFR0xpbnQqIHZhbCkgY29uc3QgeworICAgIHN3aXRjaChhdHRyaWIpIHsKKyAgICBjYXNlIEVHTF9CVUZGRVJfU0laRToKKyAgICAgICAgKnZhbCA9IG1fYnVmZmVyX3NpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX1JFRF9TSVpFOgorICAgICAgICAqdmFsID0gbV9yZWRfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfR1JFRU5fU0laRToKKyAgICAgICAgKnZhbCA9IG1fZ3JlZW5fc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfQkxVRV9TSVpFOgorICAgICAgICAqdmFsID0gbV9ibHVlX3NpemU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX0xVTUlOQU5DRV9TSVpFOgorICAgICAgICAqdmFsID0gbV9sdW1pbmFuY2Vfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfQUxQSEFfU0laRToKKyAgICAgICAgKnZhbCA9IG1fYWxwaGFfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfQklORF9UT19URVhUVVJFX1JHQjoKKyAgICAgICAgKnZhbCA9IG1fYmluZF90b190ZXhfcmdiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQToKKyAgICAgICAgKnZhbCA9IG1fYmluZF90b190ZXhfcmdiYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfQ09ORklHX0NBVkVBVDoKKyAgICAgICAgKnZhbCA9IG1fY2F2ZWF0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9DT05GT1JNQU5UOgorICAgICAgICAqdmFsID0gbV9jb25mb3JtYW50OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9DT05GSUdfSUQ6CisgICAgICAgICp2YWwgPSBtX2NvbmZpZ19pZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfREVQVEhfU0laRToKKyAgICAgICAgKnZhbCA9IG1fZGVwdGhfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTEVWRUw6CisgICAgICAgICp2YWwgPSBtX2ZyYW1lX2J1ZmZlcl9sZXZlbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEg6CisgICAgICAgICp2YWwgPSBtX21heF9wYnVmZmVyX3dpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQ6CisgICAgICAgICp2YWwgPSBtX21heF9wYnVmZmVyX2hlaWdodDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTUFYX1BCVUZGRVJfUElYRUxTOgorICAgICAgICAqdmFsID0gbV9tYXhfcGJ1ZmZlcl9zaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9NQVhfU1dBUF9JTlRFUlZBTDoKKyAgICAgICAgKnZhbCA9IG1fbWF4X3N3YXBfaW50ZXJ2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX01JTl9TV0FQX0lOVEVSVkFMOgorICAgICAgICAqdmFsID0gbV9taW5fc3dhcF9pbnRlcnZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEU6CisgICAgICAgICp2YWwgPSBtX25hdGl2ZV9yZW5kZXJhYmxlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9OQVRJVkVfVklTVUFMX0lEOgorICAgICAgICAqdmFsID0gbV9uYXRpdmVfdmlzdWFsX2lkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9OQVRJVkVfVklTVUFMX1RZUEU6CisgICAgICAgICp2YWwgPSBtX25hdGl2ZV92aXN1YWxfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfUkVOREVSQUJMRV9UWVBFOgorICAgICAgICAqdmFsID0gbV9yZW5kZXJhYmxlX3R5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX1NBTVBMRV9CVUZGRVJTOgorICAgICAgICAqdmFsID0gbV9zYW1wbGVfYnVmZmVyc19udW07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX1NBTVBMRVM6CisgICAgICAgICp2YWwgPSBtX3NhbXBsZXNfcGVyX3BpeGVsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9TVEVOQ0lMX1NJWkU6CisgICAgICAgICp2YWwgPSBtX3N0ZW5jaWxfc2l6ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfU1VSRkFDRV9UWVBFOgorICAgICAgICAqdmFsID0gbV9zdXJmYWNlX3R5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX0NPTE9SX0JVRkZFUl9UWVBFOgorICAgICAgICAqdmFsID0gRUdMX1JHQl9CVUZGRVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX1RZUEU6CisgICAgICAgICp2YWwgPW1fdHJhbnNwYXJlbnRfdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFOgorICAgICAgICAqdmFsID0gbV90cmFuc19yZWRfdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRToKKyAgICAgICAgKnZhbCA9IG1fdHJhbnNfZ3JlZW5fdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFOgorICAgICAgICAqdmFsID0gbV90cmFuc19ibHVlX3ZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfUkVDT1JEQUJMRV9BTkRST0lEOgorICAgICAgICAqdmFsID0gbV9yZWNvcmRhYmxlX2FuZHJvaWQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0VHTGludCBFZ2xDb25maWc6OmdldENvbmZBdHRyaWIoRUdMaW50IGF0dHJpYikgY29uc3QgeworICAgIEVHTGludCByZXM7CisgICAgZ2V0Q29uZkF0dHJpYihhdHRyaWIsICZyZXMpOworICAgIHJldHVybiByZXM7Cit9CisKKy8vIGNoZWNraW5nIGNvbXBpdGFiaWx0eSBiZXR3ZWVuICp0aGlzIGNvbmZpZ3VyYXRpb24gYW5kIGFub3RoZXIgY29uZmlndXJhdGlvbgorLy8gdGhlIGNvbXBpdGFiaWxpdHkgaXMgY2hlY2tlZCBhZ2FpbnNlZCByZWQsZ3JlZW4sYmx1ZSxidWZmZXIgc3RlbmNpbCBhbmQgZGVwdGggc2l6ZXMKK2Jvb2wgRWdsQ29uZmlnOjpjb21wYXRpYmxlV2l0aChjb25zdCBFZ2xDb25maWcmIGNvbmYpIGNvbnN0IHsKKworICAgIHJldHVybiBtX2J1ZmZlcl9zaXplID09IGNvbmYubV9idWZmZXJfc2l6ZSAmJgorICAgICAgICAgICBtX3JlZF9zaXplID09IGNvbmYubV9yZWRfc2l6ZSAmJgorICAgICAgICAgICBtX2dyZWVuX3NpemUgPT0gY29uZi5tX2dyZWVuX3NpemUgJiYKKyAgICAgICAgICAgbV9ibHVlX3NpemUgPT0gY29uZi5tX2JsdWVfc2l6ZSAmJgorICAgICAgICAgICBtX2RlcHRoX3NpemUgPT0gY29uZi5tX2RlcHRoX3NpemUgJiYKKyAgICAgICAgICAgbV9zdGVuY2lsX3NpemUgPT0gY29uZi5tX3N0ZW5jaWxfc2l6ZTsKK30KKworLy8gRm9yIGZpeGluZyBkRVFQIEVHTCB0ZXN0cy4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgRUdMIHNwZWMKKy8vIGFuZCBpcyBpbnNwaXJlZCBieSB0aGUgZEVRUCBFR0wgdGVzdCBjb2RlIGl0c2VsZi4KK3N0YXRpYyBpbnQgQ29sb3JCdWZmZXJUeXBlVmFsKEVHTGVudW0gdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRUdMX1JHQl9CVUZGRVI6IHJldHVybiAwOworICAgIGNhc2UgRUdMX0xVTUlOQU5DRV9CVUZGRVI6IHJldHVybiAxOworICAgIGNhc2UgRUdMX1lVVl9CVUZGRVJfRVhUOiByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDM7Cit9CisKKy8vZm9sbG93aW5nIHRoZSBzb3J0aW5nIEVHTGNvbmZpZyBhcyBpbiBzcGVjCisvLyBOb3RlIHRoYXQgd2UgYWxzbyBuZWVkIHRvIHNvcnQgZHVyaW5nIGVnbENob29zZUNvbmZpZworLy8gd2hlbiByZXR1cm5pbmcgY29uZmlncyB0byB1c2VyLCBhcyBzb3J0aW5nIG9yZGVyCisvLyBjYW4gZGVwZW5kIG9uIHdoaWNoIGF0dHJpYnV0ZXMgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZC4KK2Jvb2wgRWdsQ29uZmlnOjpvcGVyYXRvcjwoY29uc3QgRWdsQ29uZmlnJiBjb25mKSBjb25zdCB7CisgICAgLy8wCisgICAgaWYobV9jb25mb3JtYW50ICE9IGNvbmYubV9jb25mb3JtYW50KSB7CisgICAgICAgcmV0dXJuIG1fY29uZm9ybWFudCAhPSAwOyAvL1dlIHdhbnQgdGhlIGNvbmZvcm1hbnQgb25lcyBmaXJzdAorICAgIH0KKyAgICAvLzEKKyAgICBpZihtX2NhdmVhdCAhPSBjb25mLm1fY2F2ZWF0KSB7CisgICAgICAgcmV0dXJuIG1fY2F2ZWF0IDwgY29uZi5tX2NhdmVhdDsgLy8gRUdMX05PTkUgPCBFR0xfU0xPV19DT05GSUcgPCBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHCisgICAgfQorCisgICAgLy8yCisgICAgaWYgKG1fY29sb3JfYnVmZmVyX3R5cGUgIT0gY29uZi5tX2NvbG9yX2J1ZmZlcl90eXBlKSB7CisgICAgICAgIHJldHVybiBDb2xvckJ1ZmZlclR5cGVWYWwobV9jb2xvcl9idWZmZXJfdHlwZSkgPAorICAgICAgICAgICAgICAgQ29sb3JCdWZmZXJUeXBlVmFsKGNvbmYubV9jb2xvcl9idWZmZXJfdHlwZSk7CisgICAgfQorCisgICAgLy8zCisgICAgaWYgKG1fYnVmZmVyX3NpemUgIT0gY29uZi5tX2J1ZmZlcl9zaXplKSB7CisgICAgICAgIHJldHVybiBtX2J1ZmZlcl9zaXplIDwgY29uZi5tX2J1ZmZlcl9zaXplOworICAgIH0KKworICAgIC8vNAorICAgIGlmKG1fc2FtcGxlX2J1ZmZlcnNfbnVtICE9IGNvbmYubV9zYW1wbGVfYnVmZmVyc19udW0pIHsKKyAgICAgICByZXR1cm4gbV9zYW1wbGVfYnVmZmVyc19udW0gPCBjb25mLm1fc2FtcGxlX2J1ZmZlcnNfbnVtOworICAgIH0KKyAgICAvLzUKKyAgICBpZihtX3NhbXBsZXNfcGVyX3BpeGVsICE9IGNvbmYubV9zYW1wbGVzX3Blcl9waXhlbCkgeworICAgICAgIHJldHVybiBtX3NhbXBsZXNfcGVyX3BpeGVsIDwgY29uZi5tX3NhbXBsZXNfcGVyX3BpeGVsOworICAgIH0KKyAgICAvLzYKKyAgICBpZihtX2RlcHRoX3NpemUgIT0gY29uZi5tX2RlcHRoX3NpemUpIHsKKyAgICAgICByZXR1cm4gbV9kZXB0aF9zaXplIDwgY29uZi5tX2RlcHRoX3NpemU7CisgICAgfQorICAgIC8vNworICAgIGlmKG1fc3RlbmNpbF9zaXplICE9IGNvbmYubV9zdGVuY2lsX3NpemUpIHsKKyAgICAgICByZXR1cm4gbV9zdGVuY2lsX3NpemUgPCBjb25mLm1fc3RlbmNpbF9zaXplOworICAgIH0KKworICAgIHJldHVybiBtX2NvbmZpZ19pZCA8IGNvbmYubV9jb25maWdfaWQ7Cit9CisKK2Jvb2wgRWdsQ29uZmlnOjpvcGVyYXRvcj49KGNvbnN0IEVnbENvbmZpZyYgY29uZikgY29uc3QgeworICAgIHJldHVybiAgISgoKnRoaXMpIDwgY29uZik7Cit9CisKKy8vY2hlY2tpbmcgaWYgY29uZmlnIHN0YW5kcyBmb3IgYWxsIHRoZSBzZWxlY3Rpb24gY3JhdGVyaWEgb2YgZHVtbXkgYXMgZGVmaW5lZCBieSBFR0wgc3BlYworI2RlZmluZSBDSEVDS19QUk9QKGR1bW15LHByb3BfbmFtZSxvcCkgXAorICAgIGlmKChkdW1teS5wcm9wX25hbWUgIT0gRUdMX0RPTlRfQ0FSRSkgJiYgKGR1bW15LnByb3BfbmFtZSBvcCBwcm9wX25hbWUpKSB7IFwKKyAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCNwcm9wX25hbWUgIiBkb2VzIG5vdCBtYXRjaDogJWQgdnMgJWQiLCBkdW1teS5wcm9wX25hbWUsIHByb3BfbmFtZSk7IFwKKyAgICAgICAgcmV0dXJuIGZhbHNlOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0coI3Byb3BfbmFtZSAiIGNvbXBhdGlibGUuIik7IFwKKyAgICB9IFwKKworI2RlZmluZSBDSEVDS19QUk9QX0NBU1QoZHVtbXkscHJvcF9uYW1lLG9wKSBcCisgICAgaWYoKCgoRUdMaW50KWR1bW15LnByb3BfbmFtZSkgIT0gRUdMX0RPTlRfQ0FSRSkgJiYgKGR1bW15LnByb3BfbmFtZSBvcCBwcm9wX25hbWUpKSB7IFwKKyAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCNwcm9wX25hbWUgIiBkb2VzIG5vdCBtYXRjaC4iKTsgXAorICAgICAgICByZXR1cm4gZmFsc2U7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIENIT09TRV9DT05GSUdfRExPRygjcHJvcF9uYW1lICIgY29tcGF0aWJsZS4iKTsgXAorICAgIH0gXAorCitib29sIEVnbENvbmZpZzo6Y2hvc2VuKGNvbnN0IEVnbENvbmZpZyYgZHVtbXkpIGNvbnN0IHsKKworICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJjaGVja2luZyBjb25maWcgaWQgMHgleCBmb3IgY29tcGF0aWJpbGl0eVxuIiwgbV9jb25maWdfaWQpOworICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJjb25maWcgaW5mbyBmb3IgMHgleDogIgorICAgICAgICAgICAgICAgICAgICAgICJyZ2JhZHMgJWQgJWQgJWQgJWQgJWQgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICJzYW1wIHNwcCAlZCAlZCBmYmx2bCAlZCBuLnZpc3R5cGUgJWQgbWF4c3dhcCAlZCBtaW5zd2FwICVkIgorICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3JnYiAlZCAlZCAlZCBjYXZlYXQgJWQgbi5yZW5kZXJhYmxlICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwdHlwZSAlZCBzdXJmdHlwZSAlZCBjb25mb3JtICVkIHJlbmRlcnR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1fY29uZmlnX2lkLAorCisgICAgICAgICAgICAgICAgICAgICAgbV9yZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtX2dyZWVuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgbV9ibHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgbV9hbHBoYV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIG1fZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtX3N0ZW5jaWxfc2l6ZSwKKworICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxlX2J1ZmZlcnNfbnVtLAorICAgICAgICAgICAgICAgICAgICAgIG1fc2FtcGxlc19wZXJfcGl4ZWwsCisKKyAgICAgICAgICAgICAgICAgICAgICBtX2ZyYW1lX2J1ZmZlcl9sZXZlbCwKKworICAgICAgICAgICAgICAgICAgICAgIG1fbmF0aXZlX3Zpc3VhbF90eXBlLAorCisgICAgICAgICAgICAgICAgICAgICAgbV9tYXhfc3dhcF9pbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICBtX21pbl9zd2FwX2ludGVydmFsLAorCisgICAgICAgICAgICAgICAgICAgICAgbV90cmFuc19yZWRfdmFsLAorICAgICAgICAgICAgICAgICAgICAgIG1fdHJhbnNfZ3JlZW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgIG1fdHJhbnNfYmx1ZV92YWwsCisKKyAgICAgICAgICAgICAgICAgICAgICBtX2NhdmVhdCwKKyAgICAgICAgICAgICAgICAgICAgICBtX25hdGl2ZV9yZW5kZXJhYmxlLAorCisgICAgICAgICAgICAgICAgICAgICAgbV90cmFuc3BhcmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIG1fc3VyZmFjZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIG1fY29uZm9ybWFudCwKKyAgICAgICAgICAgICAgICAgICAgICBtX3JlbmRlcmFibGVfdHlwZSk7CisKKyAgIC8vYXRsZWFzdAorICAgQ0hFQ0tfUFJPUChkdW1teSxtX2J1ZmZlcl9zaXplLD4pOworICAgQ0hFQ0tfUFJPUChkdW1teSxtX3JlZF9zaXplLD4pOworICAgQ0hFQ0tfUFJPUChkdW1teSxtX2dyZWVuX3NpemUsPik7CisgICBDSEVDS19QUk9QKGR1bW15LG1fYmx1ZV9zaXplLD4pOworICAgQ0hFQ0tfUFJPUChkdW1teSxtX2FscGhhX3NpemUsPik7CisgICBDSEVDS19QUk9QKGR1bW15LG1fZGVwdGhfc2l6ZSw+KTsKKyAgIENIRUNLX1BST1AoZHVtbXksbV9zdGVuY2lsX3NpemUsPik7CisKKyAgIENIRUNLX1BST1AoZHVtbXksbV9sdW1pbmFuY2Vfc2l6ZSw+KTsKKworICAgLy8gV2UgZGlzdGluZ3Vpc2ggaGVyZSBiZXR3ZWVuIHRoZSBidWZmZXIgc2l6ZQorICAgLy8gZGVzaXJlZCBieSB0aGUgdXNlciAoZHVtbXkubV93YW50ZWRfYnVmZmVyX3NpemUpCisgICAvLyB2ZXJzdXMgdGhlIGFjdHVhbCBjb25maWcncyBidWZmZXIgc2l6ZQorICAgLy8gKG1fd2FudGVkX2J1ZmZlcl9zaXplKS4KKyAgIGlmIChkdW1teS5pc1dhbnRlZEF0dHJpYihFR0xfQlVGRkVSX1NJWkUpKSB7CisgICAgICAgaWYgKGR1bW15Lm1fd2FudGVkX2J1ZmZlcl9zaXplICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgZHVtbXkubV93YW50ZWRfYnVmZmVyX3NpemUgPiBtX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICB9CisgICB9CisKKyAgIENIRUNLX1BST1AoZHVtbXksbV9zYW1wbGVfYnVmZmVyc19udW0sPik7CisgICBDSEVDS19QUk9QKGR1bW15LG1fc2FtcGxlc19wZXJfcGl4ZWwsPik7CisKKyAgIC8vZXhhY3QKKyAgIENIRUNLX1BST1AoZHVtbXksbV9mcmFtZV9idWZmZXJfbGV2ZWwsIT0pOworICAgQ0hFQ0tfUFJPUChkdW1teSxtX2NvbmZpZ19pZCwhPSk7CisKKyAgIENIRUNLX1BST1AoZHVtbXksbV9uYXRpdmVfdmlzdWFsX3R5cGUsIT0pOworICAgQ0hFQ0tfUFJPUChkdW1teSxtX21heF9zd2FwX2ludGVydmFsICwhPSk7CisgICBDSEVDS19QUk9QKGR1bW15LG1fbWluX3N3YXBfaW50ZXJ2YWwgLCE9KTsKKyAgIENIRUNLX1BST1AoZHVtbXksbV90cmFuc19yZWRfdmFsICAgICwhPSk7CisgICBDSEVDS19QUk9QKGR1bW15LG1fdHJhbnNfZ3JlZW5fdmFsICwhPSk7CisgICBDSEVDS19QUk9QKGR1bW15LG1fdHJhbnNfYmx1ZV92YWwgICwhPSk7CisgICAvL2V4YWN0IC0gd2hlbiBjYXN0IHRvIEVHTGludCBpcyBuZWVkZWQgd2hlbiBjb21wYXJpbmcgdG8gRUdMX0RPTlRfQ0FSRQorICAgQ0hFQ0tfUFJPUF9DQVNUKGR1bW15LG1fYmluZF90b190ZXhfcmdiICwhPSk7CisgICBDSEVDS19QUk9QX0NBU1QoZHVtbXksbV9iaW5kX3RvX3RleF9yZ2JhLCE9KTsKKyAgIENIRUNLX1BST1BfQ0FTVChkdW1teSxtX2NhdmVhdCwhPSk7CisgICBDSEVDS19QUk9QX0NBU1QoZHVtbXksbV9uYXRpdmVfcmVuZGVyYWJsZSAsIT0pOworICAgQ0hFQ0tfUFJPUF9DQVNUKGR1bW15LG1fdHJhbnNwYXJlbnRfdHlwZSAgICwhPSk7CisKKyAgIC8vbWFzaworICAgaWYoZHVtbXkubV9zdXJmYWNlX3R5cGUgIT0gRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgKChkdW1teS5tX3N1cmZhY2VfdHlwZSAmCisgICAgICAgKG1fc3VyZmFjZV90eXBlIHwgRUdMX1dJTkRPV19CSVQpKSAhPSAvLyBOb3RlIHRoYXQgd2UgYWx3YXlzIGFkdmVydGlzZSBvdXIgY29uZmlncycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVHTF9TVVJGQUNFX1RZUEUgaGFzIGhhdmluZyBFR0xfV0lORE9XX0JJVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwYWJpbGl0eSwgc28gd2UgbXVzdCBhbHNvIHJlc3BlY3QgdGhhdCBoZXJlLgorICAgICAgIGR1bW15Lm1fc3VyZmFjZV90eXBlKSkgeworCisgICAgICAgcmV0dXJuIGZhbHNlOworICAgfQorCisgICBpZihkdW1teS5tX2NvbmZvcm1hbnQgIT0gKEVHTGVudW0pRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgKChkdW1teS5tX2NvbmZvcm1hbnQgJiBtX2NvbmZvcm1hbnQpICE9IGR1bW15Lm1fY29uZm9ybWFudCkpIHsKKyAgICAgICBDSE9PU0VfQ09ORklHX0RMT0coIm1fY29uZm9ybWFudCBkb2VzIG5vdCBtYXRjaC4iKTsKKyAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIGlmKGR1bW15Lm1fcmVuZGVyYWJsZV90eXBlICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICgoZHVtbXkubV9yZW5kZXJhYmxlX3R5cGUgJiBtX3JlbmRlcmFibGVfdHlwZSkgIT0gZHVtbXkubV9yZW5kZXJhYmxlX3R5cGUpKSB7CisgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJtX3JlbmRlcmFibGVfdHlwZSBkb2VzIG5vdCBtYXRjaC4iKTsKKyAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIENIT09TRV9DT05GSUdfRExPRygiY29uZmlnIGlkIDB4JXggcGFzc2VzLiIsIG1fY29uZmlnX2lkKTsKKworICAgLy9wYXNzZWQgYWxsIGNoZWNrcworICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbENvbmZpZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ0NTJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb25maWcuaApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgRUdMX0NPTkZJR19ICisjZGVmaW5lIEVHTF9DT05GSUdfSAorCisjaW5jbHVkZSAiRWdsT3NBcGkuaCIKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2RlZmluZSBNSU5fU1dBUF9JTlRFUlZBTCAxCisjZGVmaW5lIE1BWF9TV0FQX0lOVEVSVkFMIDEwCisKKyNkZWZpbmUgREVCVUdfQ0hPT1NFX0NPTkZJRyAwCisKKyNpZiBERUJVR19DSE9PU0VfQ09ORklHCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgQ0hPT1NFX0NPTkZJR19ETE9HKGZtdCwuLi4pIGRvIHsgXAorICAgIGZwcmludGYoc3RkZXJyLCAiY2hvb3NlY29uZmlnOiAiIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsgXAorfSB3aGlsZSgwKSBcCisKKyNlbHNlCisjZGVmaW5lIENIT09TRV9DT05GSUdfRExPRyhmbXQsLi4uKQorI2VuZGlmCisKKy8vIEEgY2xhc3MgdXNlZCB0byBtb2RlbCB0aGUgY29udGVudCBvZiBhbiBFR0xDb25maWcgb2JqZWN0LgorLy8gVGhpcyBpcyByZWFsbHkgYSBzdHJ1Y3R1cmUgd2l0aCBzZXZlcmFsIGZpZWxkcyB0aGF0IGNhbiBiZSBxdWVyaWVkCisvLyBpbmRpdmlkdWFsbHkgd2l0aCBnZXRDb25maWdBdHRyaWIoKSwgYW5kIGNvbXBhcmVkIGZvciBzb3J0aW5nIGFjY29yZGluZworLy8gdG8gdGhlIEVHTENvbmZpZyBzcGVjaWZpY2F0aW9uLgorY2xhc3MgRWdsQ29uZmlnIHsKK3B1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gYXR0cmlidXRlLCBpZGVudGlmaWVkIGJ5IGl0cyBuYW1lIHxhdHRyaWJ8CisgICAgLy8gKGUuZy4gRUdMX0NPTkZJR19JRCkuIE9uIHN1Y2Nlc3MsIHJldHVybiB0cnVlIGFuZCBzZXRzIHwqdmFsfCB0byB0aGUKKyAgICAvLyBhdHRyaWJ1dGUgdmFsdWUuIE9uIGZhaWx1cmUgKHVua25vd24gfGF0dHJpYnwgdmFsdWUpLCByZXR1cm4gZmFsc2UuCisgICAgYm9vbCBnZXRDb25mQXR0cmliKEVHTGludCBhdHRyaWIsIEVHTGludCogdmFsKSBjb25zdDsKKyAgICBFR0xpbnQgZ2V0Q29uZkF0dHJpYihFR0xpbnQgYXR0cmliKSBjb25zdDsKKworICAgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgdG8gc29ydCBFZ2xDb25maWcgaW5zdGFuY2VzLgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEVnbENvbmZpZyYgY29uZikgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEVnbENvbmZpZyYgY29uZikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgdGhpcyBpbnN0YW5jZSBpcyBjb21wYXRpYmxlIHdpdGggfGNvbmZ8LCBpLmUuIHRoYXQKKyAgICAvLyB0aGV5IGhhdmUgdGhlIHNhbWUgcmVkL2dyZWVuL2JsdWUvZGVwdGgvc3RlbmNpbCBzaXplcy4KKyAgICBib29sIGNvbXBhdGlibGVXaXRoKGNvbnN0IEVnbENvbmZpZyYgY29uZikgIGNvbnN0OyAvL2NvbXBhdGliaWxpdHkKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGlzIGluc3RhbmNlIG1hdGNoZXMgdGhlIG1pbmltYWwgcmVxdWlyZW1lbnRzIG9mCisgICAgLy8gYW5vdGhlciBFZ2xDb25maWcgfGR1bW15fC4gQW55IGF0dHJpYnV0ZSB2YWx1ZSBpbiB8ZHVtbXl8IHRoYXQgaXNuJ3QKKyAgICAvLyBFR0xfRE9OVF9DQVJFIHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlCisgICAgLy8gaW5zdGFuY2UuCisgICAgYm9vbCBjaG9zZW4oY29uc3QgRWdsQ29uZmlnJiBkdW1teSkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIEVHTF9TVVJGQUNFX1RZUEUgdmFsdWUuCisgICAgRUdMaW50IHN1cmZhY2VUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zdXJmYWNlX3R5cGU7fTsKKworICAgIC8vIFJldHVybiB0aGUgRUdMX0NPTkZJR19JRCB2YWx1ZS4KKyAgICBFR0xpbnQgaWQoKSBjb25zdCB7IHJldHVybiBtX2NvbmZpZ19pZDsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBuYXRpdmUgY29uZmlndXJhdGlvbiBpZC4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0aGUgc2FtZSBhcyBpZCgpCisgICAgLy8gRXhjZXB0IGlmIHRoZSBFZ2xDb25maWcgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgb3ZlcnJpZGluZyBjb3B5LWNvbnN0cnVjdG9yCisgICAgLy8gYmVsb3cuIEluIHdoaWNoIGNhc2UgbmF0aXZlSWQoKSBpcyB0aGUgaWQoKSB2YWx1ZSBvZiB0aGUgc291cmNlCisgICAgLy8gRWdsQ29uZmlnLCB3aGlsZSBpZCgpIHdpbGwgcmV0dXJuIHRoZSBvdmVycmlkZW4gdmFsdWUuCisgICAgRUdMaW50IG5hdGl2ZUlkKCkgY29uc3QgeyByZXR1cm4gbV9uYXRpdmVfY29uZmlnX2lkOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG5hdGl2ZSBwaXhlbCBmb3JtYXQgZm9yIHRoaXMgY29uZmlnLgorICAgIEVnbE9TOjpQaXhlbEZvcm1hdCogbmF0aXZlRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbV9uYXRpdmVGb3JtYXQ7IH0KKworICAgIEVnbENvbmZpZyhFR0xpbnQgcmVkX3NpemUsCisgICAgICAgICAgICAgIEVHTGludCBncmVlbl9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgYmx1ZV9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgYWxwaGFfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMZW51bSAgY2F2ZWF0LAorICAgICAgICAgICAgICBFR0xpbnQgIGNvbmZvcm1hbnQsCisgICAgICAgICAgICAgIEVHTGludCBjb25maWdfaWQsCisgICAgICAgICAgICAgIEVHTGludCBkZXB0aF9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgZnJhbWVfYnVmZmVyX2xldmVsLAorICAgICAgICAgICAgICBFR0xpbnQgbWF4X3BidWZmZXJfd2lkdGgsCisgICAgICAgICAgICAgIEVHTGludCBtYXhfcGJ1ZmZlcl9oZWlnaHQsCisgICAgICAgICAgICAgIEVHTGludCBtYXhfcGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICBFR0xCb29sZWFuIG5hdGl2ZV9yZW5kZXJhYmxlLAorICAgICAgICAgICAgICBFR0xpbnQgcmVuZGVyYWJsZV90eXBlLAorICAgICAgICAgICAgICBFR0xpbnQgbmF0aXZlX3Zpc3VhbF9pZCwKKyAgICAgICAgICAgICAgRUdMaW50IG5hdGl2ZV92aXN1YWxfdHlwZSwKKyAgICAgICAgICAgICAgRUdMaW50IHNhbXBsZV9idWZmZXJzX251bSwKKyAgICAgICAgICAgICAgRUdMaW50IHNhbXBsZXNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICBFR0xpbnQgc3RlbmNpbF9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgbHVtaW5hbmNlX3NpemUsIC8vIFdlIGRvbid0IHJlYWxseSBzdXBwb3J0IGN1c3RvbSBsdW1pbmFuY2Ugc2l6ZXMKKyAgICAgICAgICAgICAgRUdMaW50IHdhbnRlZF9idWZmZXJfc2l6ZSwgLy8gbm9yIGJ1ZmZlciBzaXplcyAoSSBndWVzcyBub3JtYWwgQ0Igc2l6ZSArIHBhZGRpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2Ugc3RpbGwgbmVlZCB0byBwcm9wZXJseSByZWplY3QgY29uZmlncyB0aGF0IHJlcXVlc3QgaWxsZWdhbCBzaXplcy4KKyAgICAgICAgICAgICAgRUdMaW50IHN1cmZhY2VfdHlwZSwKKyAgICAgICAgICAgICAgRUdMZW51bSB0cmFuc3BhcmVudF90eXBlLAorICAgICAgICAgICAgICBFR0xpbnQgdHJhbnNfcmVkX3ZhbCwKKyAgICAgICAgICAgICAgRUdMaW50IHRyYW5zX2dyZWVuX3ZhbCwKKyAgICAgICAgICAgICAgRUdMaW50IHRyYW5zX2JsdWVfdmFsLAorICAgICAgICAgICAgICBFR0xCb29sZWFuIHJlY29yZGFibGVfYW5kcm9pZCwKKyAgICAgICAgICAgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBmcm10KTsKKworICAgIEVnbENvbmZpZyhFR0xpbnQgcmVkX3NpemUsCisgICAgICAgICAgICAgIEVHTGludCBncmVlbl9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgYmx1ZV9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgYWxwaGFfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMZW51bSAgY2F2ZWF0LAorICAgICAgICAgICAgICBFR0xpbnQgY29uZmlnX2lkLAorICAgICAgICAgICAgICBFR0xpbnQgZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMaW50IGZyYW1lX2J1ZmZlcl9sZXZlbCwKKyAgICAgICAgICAgICAgRUdMaW50IG1heF9wYnVmZmVyX3dpZHRoLAorICAgICAgICAgICAgICBFR0xpbnQgbWF4X3BidWZmZXJfaGVpZ2h0LAorICAgICAgICAgICAgICBFR0xpbnQgbWF4X3BidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMQm9vbGVhbiBuYXRpdmVfcmVuZGVyYWJsZSwKKyAgICAgICAgICAgICAgRUdMaW50IHJlbmRlcmFibGVfdHlwZSwKKyAgICAgICAgICAgICAgRUdMaW50IG5hdGl2ZV92aXN1YWxfaWQsCisgICAgICAgICAgICAgIEVHTGludCBuYXRpdmVfdmlzdWFsX3R5cGUsCisgICAgICAgICAgICAgIEVHTGludCBzYW1wbGVzX3Blcl9waXhlbCwKKyAgICAgICAgICAgICAgRUdMaW50IHN0ZW5jaWxfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMaW50IHN1cmZhY2VfdHlwZSwKKyAgICAgICAgICAgICAgRUdMZW51bSB0cmFuc3BhcmVudF90eXBlLAorICAgICAgICAgICAgICBFR0xpbnQgdHJhbnNfcmVkX3ZhbCwKKyAgICAgICAgICAgICAgRUdMaW50IHRyYW5zX2dyZWVuX3ZhbCwKKyAgICAgICAgICAgICAgRUdMaW50IHRyYW5zX2JsdWVfdmFsLAorICAgICAgICAgICAgICBFR0xCb29sZWFuIHJlY29yZGFibGVfYW5kcm9pZCwKKyAgICAgICAgICAgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBmcm10KTsKKworICAgIC8vIENvcHktY29uc3RydWN0b3IuCisgICAgRWdsQ29uZmlnKGNvbnN0IEVnbENvbmZpZyYgY29uZik7CisKKyAgICAvLyBBIGNvcHktY29uc3RydWN0b3IgdGhhdCBhbGxvd3Mgb25lIHRvIG92ZXJyaWRlIHRoZSBjb25maWd1cmF0aW9uIElECisgICAgLy8gYW5kIHJlZC9ncmVlbi9ibHVlL2FscGhhIHNpemVzLiBOb3RlIHRoYXQgdGhpcyBpcyBob3cgb25lIGNyZWF0ZXMKKyAgICAvLyBhbiBFZ2xDb25maWcgaW5zdGFuY2Ugd2hlcmUgbmF0aXZlSWQoKSBhbmQgaWQoKSByZXR1cm4gZGlmZmVyZW50CisgICAgLy8gdmFsdWVzIChzZWUgY29tbWVudCBmb3IgbmF0aXZlSWQoKSkuCisgICAgRWdsQ29uZmlnKGNvbnN0IEVnbENvbmZpZyYgY29uZiwKKyAgICAgICAgICAgICAgRUdMaW50IGNvbmZpZ19pZCwKKyAgICAgICAgICAgICAgRUdMaW50IHJlZF9zaXplLAorICAgICAgICAgICAgICBFR0xpbnQgZ3JlZW5fc2l6ZSwKKyAgICAgICAgICAgICAgRUdMaW50IGJsdWVfc2l6ZSwKKyAgICAgICAgICAgICAgRUdMaW50IGFscGhhX3NpemUpOworCisgICAgLy8gRGVzdHJ1Y3RvciBpcyByZXF1aXJlZCB0byBnZXQgaWQgb2YgcGl4ZWwgZm9ybWF0IGluc3RhbmNlLgorICAgIH5FZ2xDb25maWcoKSB7CisgICAgICAgIGRlbGV0ZSBtX25hdGl2ZUZvcm1hdDsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkIHRvIHRyYWNrIHdoaWNoIEVHTCBjb25maWcgYXR0cmlidXRlcyB3ZXJlIHJlcXVlc3RlZCBieSB0aGUgdXNlcgorICAgIC8vIHZlcnN1cyBvdGhlcnMgd2hpY2ggYXJlIGp1c3QgcGFydCBvZiB0aGUgYWN0dWFsIGNvbmZpZyBpdHNlbGYuCisgICAgLy8gYWRkV2FudGVkQXR0cmliKCkvaXNXYW50ZWRBdHRyaWIoKSBhcmUgdXNlZCBpbiBzb3J0aW5nIGNvbmZpZ3MKKyAgICAvLyBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciByZXF1ZXN0cy4KKyAgICB2b2lkIGFkZFdhbnRlZEF0dHJpYihFR0xpbnQgd2FudGVkKSB7CisgICAgICAgIG1fd2FudGVkQXR0cmlicy5pbnNlcnQod2FudGVkKTsKKyAgICB9CisKKyAgICBib29sIGlzV2FudGVkQXR0cmliKEVHTGludCB3YW50ZWQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fd2FudGVkQXR0cmlicy5jb3VudCh3YW50ZWQpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX2J1ZmZlcl9zaXplOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fcmVkX3NpemU7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9ncmVlbl9zaXplOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fYmx1ZV9zaXplOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fYWxwaGFfc2l6ZTsKKyAgICBjb25zdCBFR0xCb29sZWFuICBtX2JpbmRfdG9fdGV4X3JnYjsKKyAgICBjb25zdCBFR0xCb29sZWFuICBtX2JpbmRfdG9fdGV4X3JnYmE7CisgICAgY29uc3QgRUdMZW51bSAgICAgbV9jYXZlYXQ7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9jb25maWdfaWQ7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9uYXRpdmVfY29uZmlnX2lkOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fZnJhbWVfYnVmZmVyX2xldmVsOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fZGVwdGhfc2l6ZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX21heF9wYnVmZmVyX3dpZHRoOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fbWF4X3BidWZmZXJfaGVpZ2h0OworICAgIGNvbnN0IEVHTGludCAgICAgIG1fbWF4X3BidWZmZXJfc2l6ZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX21heF9zd2FwX2ludGVydmFsOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fbWluX3N3YXBfaW50ZXJ2YWw7CisgICAgY29uc3QgRUdMQm9vbGVhbiAgbV9uYXRpdmVfcmVuZGVyYWJsZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX3JlbmRlcmFibGVfdHlwZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX25hdGl2ZV92aXN1YWxfaWQ7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9uYXRpdmVfdmlzdWFsX3R5cGU7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9zYW1wbGVfYnVmZmVyc19udW07CisgICAgY29uc3QgRUdMaW50ICAgICAgbV9zYW1wbGVzX3Blcl9waXhlbDsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX3N0ZW5jaWxfc2l6ZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX2x1bWluYW5jZV9zaXplOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fd2FudGVkX2J1ZmZlcl9zaXplOworICAgIGNvbnN0IEVHTGludCAgICAgIG1fc3VyZmFjZV90eXBlOworICAgIGNvbnN0IEVHTGVudW0gICAgIG1fdHJhbnNwYXJlbnRfdHlwZTsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX3RyYW5zX3JlZF92YWw7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV90cmFuc19ncmVlbl92YWw7CisgICAgY29uc3QgRUdMaW50ICAgICAgbV90cmFuc19ibHVlX3ZhbDsKKyAgICBjb25zdCBFR0xCb29sZWFuICBtX3JlY29yZGFibGVfYW5kcm9pZDsKKyAgICBjb25zdCBFR0xlbnVtICAgICBtX2NvbmZvcm1hbnQ7CisKKyAgICBFZ2xPUzo6UGl4ZWxGb3JtYXQqICBtX25hdGl2ZUZvcm1hdDsKKyAgICBjb25zdCBFR0xpbnQgICAgICBtX2NvbG9yX2J1ZmZlcl90eXBlOworCisgICAgLy8gVHJhY2sgd2hpY2ggYXR0cmlidXRlIGtleXMgYXJlIGRlc2lyZWQgYnkgYSB1c2VyLgorICAgIC8vIFRoaXMgZHluYW1pY2FsbHkgYWZmZWN0cyBjb25maWcgc29ydGluZyBvcmRlci4KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8RUdMaW50PiBtX3dhbnRlZEF0dHJpYnM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsQ29udGV4dC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbENvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGVmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbENvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTI2IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkVnbENvbnRleHQuaCIKKyNpbmNsdWRlICJFZ2xEaXNwbGF5LmgiCisjaW5jbHVkZSAiRWdsR2xvYmFsSW5mby5oIgorI2luY2x1ZGUgIkVnbE9zQXBpLmgiCisjaW5jbHVkZSAiRWdsUGJ1ZmZlclN1cmZhY2UuaCIKKyNpbmNsdWRlICJUaHJlYWRJbmZvLmgiCisKK3Vuc2lnbmVkIGludCBFZ2xDb250ZXh0OjpzX25leHRDb250ZXh0SG5kbCA9IDA7CisKK2V4dGVybiBFZ2xHbG9iYWxJbmZvKiBnX2VnbEluZm87IC8vIGRlZmluZWQgaW4gRWdsSW1wLmNwcAorCitib29sIEVnbENvbnRleHQ6OnVzaW5nU3VyZmFjZShTdXJmYWNlUHRyIHN1cmZhY2UpIHsKKyAgcmV0dXJuIHN1cmZhY2UuZ2V0KCkgPT0gbV9yZWFkLmdldCgpIHx8IHN1cmZhY2UuZ2V0KCkgPT0gbV9kcmF3LmdldCgpOworfQorCitFZ2xDb250ZXh0OjpFZ2xDb250ZXh0KEVnbERpc3BsYXkgKmRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgRWdsT1M6OkNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRQdHIgc2hhcmVkX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIEVnbENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICBHTEVTY29udGV4dCogZ2xlc0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xFU1ZlcnNpb24gdmVyLAorICAgICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lTWFuYWdlciogbW5ncikgOgorICAgICAgICBtX2RweShkcHkpLAorICAgICAgICBtX25hdGl2ZShjb250ZXh0KSwKKyAgICAgICAgbV9jb25maWcoY29uZmlnKSwKKyAgICAgICAgbV9nbGVzQ29udGV4dChnbGVzQ3R4KSwKKyAgICAgICAgbV92ZXJzaW9uKHZlciksCisgICAgICAgIG1fbW5ncihtbmdyKSB7CisgICAgbV9zaGFyZUdyb3VwID0gc2hhcmVkX2NvbnRleHQuZ2V0KCk/CisgICAgICAgICAgICAgICAgICAgbW5nci0+YXR0YWNoU2hhcmVHcm91cChjb250ZXh0LHNoYXJlZF9jb250ZXh0LT5uYXRpdmVUeXBlKCkpOgorICAgICAgICAgICAgICAgICAgIG1uZ3ItPmNyZWF0ZVNoYXJlR3JvdXAoY29udGV4dCk7CisgICAgbV9obmRsID0gKytzX25leHRDb250ZXh0SG5kbDsKK30KKworRWdsQ29udGV4dDo6fkVnbENvbnRleHQoKQoreworICAgIFRocmVhZEluZm8qIHRocmVhZCA9IGdldFRocmVhZEluZm8oKTsKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY29udGV4dAorICAgIENvbnRleHRQdHIgY3VycmVudEN0eCA9IHRocmVhZC0+ZWdsQ29udGV4dDsKKyAgICBpZiAoY3VycmVudEN0eCAmJiAhbV9kcHktPmdldENvbnRleHQoKEVHTENvbnRleHQpU2FmZVBvaW50ZXJGcm9tVUludCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDdHgtPmdldEhuZGwoKSkpKSB7CisgICAgICAgIGN1cnJlbnRDdHgucmVzZXQoKTsKKyAgICB9CisgICAgU3VyZmFjZVB0ciBjdXJyZW50UmVhZCA9IGN1cnJlbnRDdHggPyBjdXJyZW50Q3R4LT5yZWFkKCkgOiBudWxscHRyOworICAgIFN1cmZhY2VQdHIgY3VycmVudERyYXcgPSBjdXJyZW50Q3R4ID8gY3VycmVudEN0eC0+ZHJhdygpIDogbnVsbHB0cjsKKyAgICAvLyB3ZSBuZWVkIHRvIG1ha2UgdGhlIGNvbnRleHQgY3VycmVudCBiZWZvcmUgcmVsZWFzaW5nIEdMIHJlc291cmNlcy4KKyAgICAvLyBjcmVhdGUgYSBkdW1teSBzdXJmYWNlIGZpcnN0CisgICAgc3RkOjpzaGFyZWRfcHRyPEVnbFBidWZmZXJTdXJmYWNlPiBwYlN1cmZhY2UobmV3IEVnbFBidWZmZXJTdXJmYWNlKG1fZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbmZpZykpOworICAgIHBiU3VyZmFjZS0+c2V0QXR0cmliKEVHTF9XSURUSCwgMSk7CisgICAgcGJTdXJmYWNlLT5zZXRBdHRyaWIoRUdMX0hFSUdIVCwgMSk7CisgICAgRWdsT1M6OlBidWZmZXJJbmZvIHBiSW5mbzsKKyAgICBwYlN1cmZhY2UtPmdldERpbSgmcGJJbmZvLndpZHRoLCAmcGJJbmZvLmhlaWdodCwgJnBiSW5mby5sYXJnZXN0KTsKKyAgICBwYlN1cmZhY2UtPmdldFRleEluZm8oJnBiSW5mby50YXJnZXQsICZwYkluZm8uZm9ybWF0KTsKKyAgICBwYkluZm8uaGFzTWlwbWFwID0gZmFsc2U7CisgICAgRWdsT1M6OlN1cmZhY2UqIHBiID0gbV9kcHktPm5hdGl2ZVR5cGUoKS0+Y3JlYXRlUGJ1ZmZlclN1cmZhY2UoCisgICAgICAgICAgICBtX2NvbmZpZy0+bmF0aXZlRm9ybWF0KCksICZwYkluZm8pOworICAgIGFzc2VydChwYik7CisgICAgaWYgKHBiKSB7CisgICAgICAgIGNvbnN0IGJvb2wgcmVzID0gbV9kcHktPm5hdGl2ZVR5cGUoKS0+bWFrZUN1cnJlbnQocGIsIHBiLCBtX25hdGl2ZSk7CisgICAgICAgIGFzc2VydChyZXMpOworICAgICAgICAodm9pZClyZXM7CisgICAgICAgIHBiU3VyZmFjZS0+c2V0TmF0aXZlUGJ1ZmZlcihwYik7CisgICAgfQorICAgIC8vCisgICAgLy8gcmVsZWFzZSBHTCByZXNvdXJjZXMuIG1fc2hhcmVHcm91cCwgbV9tbmdyIGFuZCBtX2dsZXNDb250ZXh0IGhvbGQKKyAgICAvLyBzbWFydCBwb2ludGVycyB0byBzaGFyZSBncm91cHMuIFdlIG11c3QgY2xlYW4gdGhlbSB1cCB3aGVuIHRoZSBjb250ZXh0CisgICAgLy8gaXMgY3VycmVudC4KKyAgICAvLworICAgIG1fc2hhcmVHcm91cC5yZXNldCgpOworICAgIGlmIChtX21uZ3IpIHsKKyAgICAgICAgbV9tbmdyLT5kZWxldGVTaGFyZUdyb3VwKG1fbmF0aXZlKTsKKyAgICB9CisgICAgLy8KKyAgICAvLyBjYWxsIHRoZSBjbGllbnQtYXBpIHRvIHJlbW92ZSB0aGUgR0xFUyBjb250ZXh0CisgICAgLy8KKyAgICBnX2VnbEluZm8tPmdldElmYWNlKHZlcnNpb24oKSktPmRlbGV0ZUdMRVNDb250ZXh0KG1fZ2xlc0NvbnRleHQpOworICAgIC8vCisgICAgLy8gcmVzdG9yZSB0aGUgY3VycmVudCBjb250ZXh0CisgICAgLy8KKyAgICBpZiAoY3VycmVudEN0eCkgeworICAgICAgICBtX2RweS0+bmF0aXZlVHlwZSgpLT5tYWtlQ3VycmVudChjdXJyZW50UmVhZC0+bmF0aXZlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREcmF3LT5uYXRpdmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN0eC0+bmF0aXZlVHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2RweS0+bmF0aXZlVHlwZSgpLT5tYWtlQ3VycmVudChudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHJlbW92ZSB0aGUgY29udGV4dCBpbiB0aGUgdW5kZXJseWluZyBPUyBsYXllcgorICAgIC8vCisgICAgbV9kcHktPm5hdGl2ZVR5cGUoKS0+ZGVzdHJveUNvbnRleHQobV9uYXRpdmUpOworfQorCit2b2lkIEVnbENvbnRleHQ6OnNldFN1cmZhY2VzKFN1cmZhY2VQdHIgcmVhZCxTdXJmYWNlUHRyIGRyYXcpCit7CisgICAgbV9yZWFkID0gcmVhZDsKKyAgICBtX2RyYXcgPSBkcmF3OworfQorCitib29sIEVnbENvbnRleHQ6OmdldEF0dHJpYihFR0xpbnQgYXR0cmliLEVHTGludCogdmFsdWUpIHsKKyAgICBzd2l0Y2goYXR0cmliKSB7CisgICAgY2FzZSBFR0xfQ09ORklHX0lEOgorICAgICAgICAqdmFsdWUgPSBtX2NvbmZpZy0+aWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb250ZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbENvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVlYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xDb250ZXh0LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgRUdMX0NPTlRFWFRfSAorI2RlZmluZSBFR0xfQ09OVEVYVF9ICisKKyNpbmNsdWRlICJFZ2xDb25maWcuaCIKKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorI2luY2x1ZGUgIkVnbFN1cmZhY2UuaCIKKworI2luY2x1ZGUgPEdMY29tbW9uL0dMdXRpbHMuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9UcmFuc2xhdG9ySWZhY2VzLmg+CisjaW5jbHVkZSA8R0xjb21tb24vb2JqZWN0TmFtZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zbWFydF9wdHIuaCIKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworY2xhc3MgRWdsQ29udGV4dDsKK3R5cGVkZWYgZW11Z2w6OlNtYXJ0UHRyPEVnbENvbnRleHQ+IENvbnRleHRQdHI7CisKK2NsYXNzIEVnbERpc3BsYXk7CisKK2NsYXNzIEVnbENvbnRleHQgeworcHVibGljOgorICAgIEVnbENvbnRleHQoRWdsRGlzcGxheSogZHB5LAorICAgICAgICAgICAgICAgRWdsT1M6OkNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICBDb250ZXh0UHRyIHNoYXJlZF9jb250ZXh0LAorICAgICAgICAgICAgICAgRWdsQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICBHTEVTY29udGV4dCogZ2xlc0N0eCwKKyAgICAgICAgICAgICAgIEdMRVNWZXJzaW9uIHZlciwKKyAgICAgICAgICAgICAgIE9iamVjdE5hbWVNYW5hZ2VyKiBtbmdyKTsKKyAgICBib29sIHVzaW5nU3VyZmFjZShTdXJmYWNlUHRyIHN1cmZhY2UpOworICAgIEVnbE9TOjpDb250ZXh0KiBuYXRpdmVUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9uYXRpdmU7IH0KKyAgICBib29sIGdldEF0dHJpYihFR0xpbnQgYXR0cmliLCBFR0xpbnQqIHZhbHVlKTsKKyAgICBjb25zdCBTdXJmYWNlUHRyJiByZWFkKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkOyB9OworICAgIGNvbnN0IFN1cmZhY2VQdHImIGRyYXcoKSBjb25zdCB7IHJldHVybiBtX2RyYXc7IH07CisgICAgY29uc3QgU2hhcmVHcm91cFB0ciYgZ2V0U2hhcmVHcm91cCgpIGNvbnN0IHsgcmV0dXJuIG1fc2hhcmVHcm91cDsgfQorICAgIEVnbENvbmZpZyogZ2V0Q29uZmlnKCkgeyByZXR1cm4gbV9jb25maWc7IH07CisgICAgR0xFU1ZlcnNpb24gdmVyc2lvbigpIHsgcmV0dXJuIG1fdmVyc2lvbjsgfTsKKyAgICBHTEVTY29udGV4dCogZ2V0R2xlc0NvbnRleHQoKSB7IHJldHVybiBtX2dsZXNDb250ZXh0OyB9CisgICAgdm9pZCBzZXRTdXJmYWNlcyhTdXJmYWNlUHRyIHJlYWQsIFN1cmZhY2VQdHIgZHJhdyk7CisgICAgdW5zaWduZWQgaW50IGdldEhuZGwoKSB7IHJldHVybiBtX2huZGw7IH0KKworICAgIH5FZ2xDb250ZXh0KCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHVuc2lnbmVkIGludCBzX25leHRDb250ZXh0SG5kbDsKKyAgICBFZ2xEaXNwbGF5KiBtX2RweSA9IG51bGxwdHI7CisgICAgRWdsT1M6OkNvbnRleHQqIG1fbmF0aXZlID0gbnVsbHB0cjsKKyAgICBFZ2xDb25maWcqIG1fY29uZmlnID0gbnVsbHB0cjsKKyAgICBHTEVTY29udGV4dCogbV9nbGVzQ29udGV4dCA9IG51bGxwdHI7CisgICAgU2hhcmVHcm91cFB0ciBtX3NoYXJlR3JvdXA7CisgICAgU3VyZmFjZVB0ciBtX3JlYWQ7CisgICAgU3VyZmFjZVB0ciBtX2RyYXc7CisgICAgR0xFU1ZlcnNpb24gbV92ZXJzaW9uOworICAgIE9iamVjdE5hbWVNYW5hZ2VyKiBtX21uZ3IgPSBudWxscHRyOworICAgIHVuc2lnbmVkIGludCBtX2huZGwgPSAwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbERpc3BsYXkuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xEaXNwbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQxOWExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xEaXNwbGF5LmNwcApAQCAtMCwwICsxLDU2NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xEaXNwbGF5LmgiCisKKyNpbmNsdWRlICJFZ2xDb25maWcuaCIKKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorI2luY2x1ZGUgPEdMY29tbW9uL0dMdXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworRWdsRGlzcGxheTo6RWdsRGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHksCisgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpEaXNwbGF5KiBpZHB5KSA6CisgICAgbV9kcHkoZHB5KSwKKyAgICBtX2lkcHkoaWRweSkKK3sKKyAgICBtX21hbmFnZXJbR0xFU18xXzFdID0gbmV3IE9iamVjdE5hbWVNYW5hZ2VyKCZtX2dsb2JhbE5hbWVTcGFjZSk7CisgICAgbV9tYW5hZ2VyW0dMRVNfMl8wXSA9IG5ldyBPYmplY3ROYW1lTWFuYWdlcigmbV9nbG9iYWxOYW1lU3BhY2UpOworfTsKKworRWdsRGlzcGxheTo6fkVnbERpc3BsYXkoKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgLy8KKyAgICAvLyBEZXN0cm95IHRoZSBnbG9iYWwgY29udGV4dCBpZiBvbmUgd2FzIGNyZWF0ZWQuCisgICAgLy8gKHNob3VsZCBiZSB0cnVlIGZvciB3aW5kb3dzIHBsYXRmb3JtIG9ubHkpCisgICAgLy8KKyAgICBpZiAobV9nbG9iYWxTaGFyZWRDb250ZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbV9pZHB5LT5kZXN0cm95Q29udGV4dChtX2dsb2JhbFNoYXJlZENvbnRleHQpOworICAgIH0KKworICAgIG1fY29uZmlncy5jbGVhcigpOworCisgICAgZGVsZXRlIG1fbWFuYWdlcltHTEVTXzFfMV07CisgICAgZGVsZXRlIG1fbWFuYWdlcltHTEVTXzJfMF07CisKKyAgICBkZWxldGUgbV9pZHB5OworfQorCit2b2lkIEVnbERpc3BsYXk6OmluaXRpYWxpemUoaW50IHJlbmRlcmFibGVUeXBlKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIGluaXRDb25maWd1cmF0aW9ucyhyZW5kZXJhYmxlVHlwZSk7CisgICAgbV9jb25maWdJbml0aWFsaXplZCA9IHRydWU7Cit9CisKK2Jvb2wgRWdsRGlzcGxheTo6aXNJbml0aWFsaXplKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZDt9CisKK3ZvaWQgRWdsRGlzcGxheTo6dGVybWluYXRlKCl7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgICBtX2NvbnRleHRzLmNsZWFyKCk7CisgICAgIG1fc3VyZmFjZXMuY2xlYXIoKTsKKyAgICAgbV9pbml0aWFsaXplZCA9IGZhbHNlOworfQorCituYW1lc3BhY2UgQ29tcGFyZUVnbENvbmZpZ3MgeworCisvLyBPbGQgY29tcGFyZSBmdW5jdGlvbiB1c2VkIHRvIGluaXRpYWxpemUgdG8gc29tZXRoaW5nIGRlY2VudGx5IHNvcnRlZC4KK3N0cnVjdCBTdGF0aWNDb21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEVnbENvbmZpZz4mIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RWdsQ29uZmlnPiYgc2Vjb25kKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqZmlyc3QgPCAqc2Vjb25kOworICAgIH0KK307CisKKy8vIEluIGFjdHVhbCB1c2FnZSwgd2UgbmVlZCB0byBkeW5hbWljYWxseSByZS1zb3J0IGNvbmZpZ3MKKy8vIHRoYXQgYXJlIHJldHVybmVkIHRvIHRoZSB1c2VyLgorc3RydWN0IER5bmFtaWNDb21wYXJlOworLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBzb3J0aW5nIG9yZGVyIG9mIGNvbmZpZ3MgaXMgYWZmZWN0ZWQKKy8vIGJhc2VkIG9uIGR5bmFtaWMgcHJvcGVydGllcy4KKy8vCisvLyBTZWUgaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZWdsL3Nkay9kb2NzL21hbi9odG1sL2VnbENob29zZUNvbmZpZy54aHRtbAorLy8gYW5kIHRoZSBzZWN0aW9uIG9uIGNvbmZpZyBzb3J0aW5nLgorLy8KKy8vIElmIHRoZSB1c2VyIHJlcXVlc3RzIGFuIEVHTCBjb25maWcgd2l0aCBhIHBhcnRpY3VsYXIgRUdMX1JFRF9TSVpFLAorLy8gZm9yIGV4YW1wbGUsIHdlIG11c3Qgc29ydCBjb25maWdzIGJhc2VkIG9uIHRoYXQgY3JpdGVyaWEsIHdoaWxlIGlmIHRoYXQKKy8vIHdhcyBub3Qgc3BlY2lmaWVkLCB3ZSB3b3VsZCBqdXN0IHNraXAgcmlnaHQgb24gdG8gc29ydGluZyBieSBidWZmZXIgc2l6ZS4KKy8vIEJlbG93IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIEVHTCBjb25maWcgc29ydGluZyBhY2NvcmRpbmcKKy8vIHRvIHNwZWMsIHRoYXQgdGFrZXMgdGhlIGR5bmFtaWMgcHJvcGVydGllcyBpbnRvIGFjY291bnQuCitzdGF0aWMgaW50IENvbG9yQnVmZmVyVHlwZVZhbChFR0xlbnVtIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVHTF9SR0JfQlVGRkVSOiByZXR1cm4gMDsKKyAgICBjYXNlIEVHTF9MVU1JTkFOQ0VfQlVGRkVSOiByZXR1cm4gMTsKKyAgICBjYXNlIEVHTF9ZVVZfQlVGRkVSX0VYVDogcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAzOworfQorCitzdGF0aWMgYm9vbCBub25Ucml2aWFsQXR0cmliVmFsKEVHTGludCB2YWwpIHsKKyAgICByZXR1cm4gdmFsICE9IDAgJiYgdmFsICE9IEVHTF9ET05UX0NBUkU7Cit9CisKK3N0cnVjdCBEeW5hbWljQ29tcGFyZSB7CitwdWJsaWM6CisgICAgRHluYW1pY0NvbXBhcmUoY29uc3QgRWdsQ29uZmlnJiB3YW50ZWRBdHRyaWJzKSB7CisKKyAgICAgICAgRUdMaW50IHdhbnRlZFJWYWwgPSB3YW50ZWRBdHRyaWJzLmdldENvbmZBdHRyaWIoRUdMX1JFRF9TSVpFKTsKKyAgICAgICAgRUdMaW50IHdhbnRlZEdWYWwgPSB3YW50ZWRBdHRyaWJzLmdldENvbmZBdHRyaWIoRUdMX0dSRUVOX1NJWkUpOworICAgICAgICBFR0xpbnQgd2FudGVkQlZhbCA9IHdhbnRlZEF0dHJpYnMuZ2V0Q29uZkF0dHJpYihFR0xfQkxVRV9TSVpFKTsKKyAgICAgICAgRUdMaW50IHdhbnRlZExWYWwgPSB3YW50ZWRBdHRyaWJzLmdldENvbmZBdHRyaWIoRUdMX0xVTUlOQU5DRV9TSVpFKTsKKyAgICAgICAgRUdMaW50IHdhbnRlZEFWYWwgPSB3YW50ZWRBdHRyaWJzLmdldENvbmZBdHRyaWIoRUdMX0FMUEhBX1NJWkUpOworCisgICAgICAgIHdhbnRlZFIgPSB3YW50ZWRBdHRyaWJzLmlzV2FudGVkQXR0cmliKEVHTF9SRURfU0laRSkgJiYgbm9uVHJpdmlhbEF0dHJpYlZhbCh3YW50ZWRSVmFsKTsKKyAgICAgICAgd2FudGVkRyA9IHdhbnRlZEF0dHJpYnMuaXNXYW50ZWRBdHRyaWIoRUdMX0dSRUVOX1NJWkUpICYmIG5vblRyaXZpYWxBdHRyaWJWYWwod2FudGVkR1ZhbCk7CisgICAgICAgIHdhbnRlZEIgPSB3YW50ZWRBdHRyaWJzLmlzV2FudGVkQXR0cmliKEVHTF9CTFVFX1NJWkUpICYmIG5vblRyaXZpYWxBdHRyaWJWYWwod2FudGVkQlZhbCk7CisgICAgICAgIHdhbnRlZEwgPSB3YW50ZWRBdHRyaWJzLmlzV2FudGVkQXR0cmliKEVHTF9MVU1JTkFOQ0VfU0laRSkgJiYgbm9uVHJpdmlhbEF0dHJpYlZhbCh3YW50ZWRMVmFsKTsKKyAgICAgICAgd2FudGVkQSA9IHdhbnRlZEF0dHJpYnMuaXNXYW50ZWRBdHRyaWIoRUdMX0FMUEhBX1NJWkUpICYmIG5vblRyaXZpYWxBdHRyaWJWYWwod2FudGVkQVZhbCk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcigpKEVnbENvbmZpZyogYSwgRWdsQ29uZmlnKiBiKSBjb25zdCB7CisgICAgICAgIEVHTGludCBhQ29uZm9ybWFudCA9IGEtPmdldENvbmZBdHRyaWIoRUdMX0NPTkZPUk1BTlQpOworICAgICAgICBFR0xpbnQgYkNvbmZvcm1hbnQgPSBiLT5nZXRDb25mQXR0cmliKEVHTF9DT05GT1JNQU5UKTsKKworICAgICAgICBpZiAoYUNvbmZvcm1hbnQgIT0gYkNvbmZvcm1hbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBhQ29uZm9ybWFudCAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgRUdMaW50IGFDYXZlYXQgPSBhLT5nZXRDb25mQXR0cmliKEVHTF9DT05GSUdfQ0FWRUFUKTsKKyAgICAgICAgRUdMaW50IGJDYXZlYXQgPSBiLT5nZXRDb25mQXR0cmliKEVHTF9DT05GSUdfQ0FWRUFUKTsKKyAgICAgICAgaWYgKGFDYXZlYXQgIT0gYkNhdmVhdCkgeworICAgICAgICAgICAgcmV0dXJuIGFDYXZlYXQgPCBiQ2F2ZWF0OworICAgICAgICB9CisKKyAgICAgICAgRUdMaW50IGFDYlR5cGUgPSBhLT5nZXRDb25mQXR0cmliKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSk7CisgICAgICAgIEVHTGludCBiQ2JUeXBlID0gYi0+Z2V0Q29uZkF0dHJpYihFR0xfQ09MT1JfQlVGRkVSX1RZUEUpOworICAgICAgICBpZiAoYUNiVHlwZSAhPSBiQ2JUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sb3JCdWZmZXJUeXBlVmFsKGFDYlR5cGUpIDwKKyAgICAgICAgICAgICAgICAgICBDb2xvckJ1ZmZlclR5cGVWYWwoYkNiVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBFR0xpbnQgYUNiU2l6ZSA9IDA7CisgICAgICAgIEVHTGludCBiQ2JTaXplID0gMDsKKworICAgICAgICBpZiAod2FudGVkUikgeworICAgICAgICAgICAgYUNiU2l6ZSArPSBhLT5nZXRDb25mQXR0cmliKEVHTF9SRURfU0laRSk7CisgICAgICAgICAgICBiQ2JTaXplICs9IGItPmdldENvbmZBdHRyaWIoRUdMX1JFRF9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FudGVkRykgeworICAgICAgICAgICAgYUNiU2l6ZSArPSBhLT5nZXRDb25mQXR0cmliKEVHTF9HUkVFTl9TSVpFKTsKKyAgICAgICAgICAgIGJDYlNpemUgKz0gYi0+Z2V0Q29uZkF0dHJpYihFR0xfR1JFRU5fU0laRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhbnRlZEIpIHsKKyAgICAgICAgICAgIGFDYlNpemUgKz0gYS0+Z2V0Q29uZkF0dHJpYihFR0xfQkxVRV9TSVpFKTsKKyAgICAgICAgICAgIGJDYlNpemUgKz0gYi0+Z2V0Q29uZkF0dHJpYihFR0xfQkxVRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FudGVkTCkgeworICAgICAgICAgICAgYUNiU2l6ZSArPSBhLT5nZXRDb25mQXR0cmliKEVHTF9MVU1JTkFOQ0VfU0laRSk7CisgICAgICAgICAgICBiQ2JTaXplICs9IGItPmdldENvbmZBdHRyaWIoRUdMX0xVTUlOQU5DRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2FudGVkQSkgeworICAgICAgICAgICAgYUNiU2l6ZSArPSBhLT5nZXRDb25mQXR0cmliKEVHTF9BTFBIQV9TSVpFKTsKKyAgICAgICAgICAgIGJDYlNpemUgKz0gYi0+Z2V0Q29uZkF0dHJpYihFR0xfQUxQSEFfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYUNiU2l6ZSAhPSBiQ2JTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gYUNiU2l6ZSA+IGJDYlNpemU7CisgICAgICAgIH0KKworICAgICAgICBFR0xpbnQgYUJ1ZmZlclNpemUgPSBhLT5nZXRDb25mQXR0cmliKEVHTF9CVUZGRVJfU0laRSk7CisgICAgICAgIEVHTGludCBiQnVmZmVyU2l6ZSA9IGItPmdldENvbmZBdHRyaWIoRUdMX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgaWYgKGFCdWZmZXJTaXplICE9IGJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gYUJ1ZmZlclNpemUgPCBiQnVmZmVyU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEVHTGludCBhU2FtcGxlQnVmZmVyc051bSA9IGEtPmdldENvbmZBdHRyaWIoRUdMX1NBTVBMRV9CVUZGRVJTKTsKKyAgICAgICAgRUdMaW50IGJTYW1wbGVCdWZmZXJzTnVtID0gYi0+Z2V0Q29uZkF0dHJpYihFR0xfU0FNUExFX0JVRkZFUlMpOworICAgICAgICBpZiAoYVNhbXBsZUJ1ZmZlcnNOdW0gIT0gYlNhbXBsZUJ1ZmZlcnNOdW0pIHsKKyAgICAgICAgICAgIHJldHVybiBhU2FtcGxlQnVmZmVyc051bSA8IGJTYW1wbGVCdWZmZXJzTnVtOworICAgICAgICB9CisKKyAgICAgICAgRUdMaW50IGFTUFAgPSBhLT5nZXRDb25mQXR0cmliKEVHTF9TQU1QTEVTKTsKKyAgICAgICAgRUdMaW50IGJTUFAgPSBiLT5nZXRDb25mQXR0cmliKEVHTF9TQU1QTEVTKTsKKyAgICAgICAgaWYgKGFTUFAgIT0gYlNQUCkgeworICAgICAgICAgICAgcmV0dXJuIGFTUFAgPCBiU1BQOworICAgICAgICB9CisKKyAgICAgICAgRUdMaW50IGFEZXB0aFNpemUgPSBhLT5nZXRDb25mQXR0cmliKEVHTF9ERVBUSF9TSVpFKTsKKyAgICAgICAgRUdMaW50IGJEZXB0aFNpemUgPSBiLT5nZXRDb25mQXR0cmliKEVHTF9ERVBUSF9TSVpFKTsKKyAgICAgICAgaWYgKGFEZXB0aFNpemUgIT0gYkRlcHRoU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFEZXB0aFNpemUgPCBiRGVwdGhTaXplOworICAgICAgICB9CisKKyAgICAgICAgRUdMaW50IGFTdGVuY2lsU2l6ZSA9IGEtPmdldENvbmZBdHRyaWIoRUdMX1NURU5DSUxfU0laRSk7CisgICAgICAgIEVHTGludCBiU3RlbmNpbFNpemUgPSBiLT5nZXRDb25mQXR0cmliKEVHTF9TVEVOQ0lMX1NJWkUpOworICAgICAgICBpZiAoYVN0ZW5jaWxTaXplICE9IGJTdGVuY2lsU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFTdGVuY2lsU2l6ZSA8IGJTdGVuY2lsU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhLT5nZXRDb25mQXR0cmliKEVHTF9DT05GSUdfSUQpIDwgYi0+Z2V0Q29uZkF0dHJpYihFR0xfQ09ORklHX0lEKTsKKyAgICB9CisKKyAgICBib29sIHdhbnRlZFI7CisgICAgYm9vbCB3YW50ZWRHOworICAgIGJvb2wgd2FudGVkQjsKKyAgICBib29sIHdhbnRlZEw7CisgICAgYm9vbCB3YW50ZWRBOworfTsKKworfQorCit2b2lkIEVnbERpc3BsYXk6OmFkZFNpbXBsZVBpeGVsRm9ybWF0KGludCByZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9zaXplKSB7CisgICAgc3RkOjpzb3J0KG1fY29uZmlncy5iZWdpbigpLCBtX2NvbmZpZ3MuZW5kKCksIENvbXBhcmVFZ2xDb25maWdzOjpTdGF0aWNDb21wYXJlKCkpOworCisgICAgRUdMQ29uZmlnIG1hdGNoOworCisgICAgRWdsQ29uZmlnIGR1bW15KHJlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICBncmVlbl9zaXplLAorICAgICAgICAgICAgICAgICAgICBibHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGFscGhhX3NpemUsICAvLyBSR0JfNTY1CisgICAgICAgICAgICAgICAgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICAgICAgICAgICAgIDE2LCAvLyBEZXB0aAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIGlmKCFkb0Nob29zZUNvbmZpZ3MoZHVtbXksICZtYXRjaCwgMSkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgRWdsQ29uZmlnKiBjb25maWcgPSAoRWdsQ29uZmlnKiltYXRjaDsKKworICAgIGludCBiU2l6ZTsKKyAgICBjb25maWctPmdldENvbmZBdHRyaWIoRUdMX0JVRkZFUl9TSVpFLCZiU2l6ZSk7CisKKyAgICBpZihiU2l6ZSA9PSAxNikKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbWF4X2NvbmZpZ19pZCA9IDA7CisKKyAgICBmb3IoQ29uZmlnc0xpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9jb25maWdzLmJlZ2luKCk7IGl0ICE9IG1fY29uZmlncy5lbmQoKSA7KytpdCkgeworICAgICAgICBFR0xpbnQgaWQ7CisgICAgICAgICgqaXQpLT5nZXRDb25mQXR0cmliKEVHTF9DT05GSUdfSUQsICZpZCk7CisgICAgICAgIGlmKGlkID4gbWF4X2NvbmZpZ19pZCkKKyAgICAgICAgICAgIG1heF9jb25maWdfaWQgPSBpZDsKKyAgICB9CisKKyAgICBFZ2xDb25maWcqIG5ld0NvbmZpZyA9IG5ldyBFZ2xDb25maWcoKmNvbmZpZyxtYXhfY29uZmlnX2lkKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZF9zaXplLCBncmVlbl9zaXplLCBibHVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX3NpemUpOworCisgICAgbV9jb25maWdzLmVtcGxhY2VfYmFjayhuZXdDb25maWcpOworfQorCit2b2lkIEVnbERpc3BsYXk6OmFkZE1pc3NpbmdDb25maWdzKCkgeworICAgIGFkZFNpbXBsZVBpeGVsRm9ybWF0KDUsIDYsIDUsIDApOyAvLyBSR0JfNTY1CisgICAgYWRkU2ltcGxlUGl4ZWxGb3JtYXQoOCwgOCwgOCwgMCk7IC8vIFJHQl84ODgKKyAgICAvLyAoSG9zdCBHUFVzIHRoYXQgYXJlIG5ld2VyIG1heSBub3QgbGlzdCBSR0JfODg4CisgICAgLy8gb3V0IG9mIHRoZSBib3guKQorfQorCit2b2lkIEVnbERpc3BsYXk6OmluaXRDb25maWd1cmF0aW9ucyhpbnQgcmVuZGVyYWJsZVR5cGUpIHsKKyAgICBpZiAobV9jb25maWdJbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1faWRweS0+cXVlcnlDb25maWdzKHJlbmRlcmFibGVUeXBlLCBhZGRDb25maWcsIHRoaXMpOworCisgICAgYWRkTWlzc2luZ0NvbmZpZ3MoKTsKKyAgICBzdGQ6OnNvcnQobV9jb25maWdzLmJlZ2luKCksIG1fY29uZmlncy5lbmQoKSwgQ29tcGFyZUVnbENvbmZpZ3M6OlN0YXRpY0NvbXBhcmUoKSk7CisKKyNpZiBFTVVHTF9ERUJVRworICAgIGZvciAoQ29uZmlnc0xpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb25maWdzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtX2NvbmZpZ3MuZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICAgIEVnbENvbmZpZyogY29uZmlnID0gaXQtPmdldCgpOworICAgICAgICBFR0xpbnQgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEsIGRlcHRoLCBzdGVuY2lsLCByZW5kZXJhYmxlLCBzdXJmYWNlOworICAgICAgICBjb25maWctPmdldENvbmZBdHRyaWIoRUdMX1JFRF9TSVpFLCAmcmVkKTsKKyAgICAgICAgY29uZmlnLT5nZXRDb25mQXR0cmliKEVHTF9HUkVFTl9TSVpFLCAmZ3JlZW4pOworICAgICAgICBjb25maWctPmdldENvbmZBdHRyaWIoRUdMX0JMVUVfU0laRSwgJmJsdWUpOworICAgICAgICBjb25maWctPmdldENvbmZBdHRyaWIoRUdMX0FMUEhBX1NJWkUsICZhbHBoYSk7CisgICAgICAgIGNvbmZpZy0+Z2V0Q29uZkF0dHJpYihFR0xfREVQVEhfU0laRSwgJmRlcHRoKTsKKyAgICAgICAgY29uZmlnLT5nZXRDb25mQXR0cmliKEVHTF9TVEVOQ0lMX1NJWkUsICZzdGVuY2lsKTsKKyAgICAgICAgY29uZmlnLT5nZXRDb25mQXR0cmliKEVHTF9SRU5ERVJBQkxFX1RZUEUsICZyZW5kZXJhYmxlKTsKKyAgICAgICAgY29uZmlnLT5nZXRDb25mQXR0cmliKEVHTF9TVVJGQUNFX1RZUEUsICZzdXJmYWNlKTsKKyAgICB9CisjZW5kaWYgIC8vIEVNVUdMX0RFQlVHCit9CisKK0VnbENvbmZpZyogRWdsRGlzcGxheTo6Z2V0Q29uZmlnKEVHTENvbmZpZyBjb25mKSBjb25zdCB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgZm9yKENvbmZpZ3NMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29uZmlncy5iZWdpbigpOworICAgICAgICBpdCAhPSBtX2NvbmZpZ3MuZW5kKCk7CisgICAgICAgICsraXQpIHsKKyAgICAgICAgaWYoc3RhdGljX2Nhc3Q8RUdMQ29uZmlnPihpdC0+Z2V0KCkpID09IGNvbmYpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+Z2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1N1cmZhY2VQdHIgRWdsRGlzcGxheTo6Z2V0U3VyZmFjZShFR0xTdXJmYWNlIHN1cmZhY2UpIGNvbnN0IHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgLyogc3VyZmFjZSBpcyAia2V5IiBpbiBtYXA8dW5zaWduZWQgaW50LCBTdXJmYWNlUHRyPi4gKi8KKyAgICB1bnNpZ25lZCBpbnQgaG5kbCA9IFNhZmVVSW50RnJvbVBvaW50ZXIoc3VyZmFjZSk7CisgICAgU3VyZmFjZXNIbmRsTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fc3VyZmFjZXMuZmluZChobmRsKTsKKyAgICByZXR1cm4gaXQgIT0gbV9zdXJmYWNlcy5lbmQoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCppdCkuc2Vjb25kIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZVB0cigpOworfQorCitDb250ZXh0UHRyIEVnbERpc3BsYXk6OmdldENvbnRleHQoRUdMQ29udGV4dCBjdHgpIGNvbnN0IHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgLyogY3R4IGlzICJrZXkiIGluIG1hcDx1bnNpZ25lZCBpbnQsIENvbnRleHRQdHI+LiAqLworICAgIHVuc2lnbmVkIGludCBobmRsID0gU2FmZVVJbnRGcm9tUG9pbnRlcihjdHgpOworICAgIENvbnRleHRzSG5kbE1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbnRleHRzLmZpbmQoaG5kbCk7CisgICAgcmV0dXJuIGl0ICE9IG1fY29udGV4dHMuZW5kKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLnNlY29uZCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRQdHIoKTsKK30KKworYm9vbCBFZ2xEaXNwbGF5OjpyZW1vdmVTdXJmYWNlKEVHTFN1cmZhY2UgcykgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICAvKiBzIGlzICJrZXkiIGluIG1hcDx1bnNpZ25lZCBpbnQsIFN1cmZhY2VQdHI+LiAqLworICAgIHVuc2lnbmVkIGludCBobmRsID0gU2FmZVVJbnRGcm9tUG9pbnRlcihzKTsKKyAgICBTdXJmYWNlc0huZGxNYXA6Oml0ZXJhdG9yIGl0ID0gbV9zdXJmYWNlcy5maW5kKGhuZGwpOworICAgIGlmKGl0ICE9IG1fc3VyZmFjZXMuZW5kKCkpIHsKKyAgICAgICAgbV9zdXJmYWNlcy5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRWdsRGlzcGxheTo6cmVtb3ZlQ29udGV4dChFR0xDb250ZXh0IGN0eCkgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICAvKiBjdHggaXMgImtleSIgaW4gbWFwPHVuc2lnbmVkIGludCwgQ29udGV4dFB0cj4uICovCisgICAgdW5zaWduZWQgaW50IGhuZGwgPSBTYWZlVUludEZyb21Qb2ludGVyKGN0eCk7CisgICAgQ29udGV4dHNIbmRsTWFwOjppdGVyYXRvciBpdCA9IG1fY29udGV4dHMuZmluZChobmRsKTsKKyAgICBpZihpdCAhPSBtX2NvbnRleHRzLmVuZCgpKSB7CisgICAgICAgIG1fY29udGV4dHMuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEVnbERpc3BsYXk6OnJlbW92ZUNvbnRleHQoQ29udGV4dFB0ciBjdHgpIHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisKKyAgICBDb250ZXh0c0huZGxNYXA6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IG1fY29udGV4dHMuYmVnaW4oKTsgaXQgIT0gbV9jb250ZXh0cy5lbmQoKTsrK2l0KSB7CisgICAgICAgIGlmKCgqaXQpLnNlY29uZC5nZXQoKSA9PSBjdHguZ2V0KCkpeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoaXQgIT0gbV9jb250ZXh0cy5lbmQoKSkgeworICAgICAgICBtX2NvbnRleHRzLmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRWdsQ29uZmlnKiBFZ2xEaXNwbGF5OjpnZXRDb25maWcoRUdMaW50IGlkKSBjb25zdCB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgZm9yKENvbmZpZ3NMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29uZmlncy5iZWdpbigpOworICAgICAgICBpdCAhPSBtX2NvbmZpZ3MuZW5kKCk7CisgICAgICAgICsraXQpIHsKKyAgICAgICAgaWYoKCppdCktPmlkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+Z2V0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBFZ2xEaXNwbGF5OjpnZXRDb25maWdzKEVHTENvbmZpZyogY29uZmlncyxpbnQgY29uZmlnX3NpemUpIGNvbnN0IHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgaW50IGkgPSAwOworICAgIGZvcihDb25maWdzTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbmZpZ3MuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbV9jb25maWdzLmVuZCgpICYmIGkgPCBjb25maWdfc2l6ZTsKKyAgICAgICAgaSsrLCArK2l0KSB7CisgICAgICAgIGNvbmZpZ3NbaV0gPSBzdGF0aWNfY2FzdDxFR0xDb25maWc+KGl0LT5nZXQoKSk7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitpbnQgRWdsRGlzcGxheTo6Y2hvb3NlQ29uZmlncyhjb25zdCBFZ2xDb25maWcmIGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnKiBjb25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbmZpZ19zaXplKSBjb25zdCB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIHJldHVybiBkb0Nob29zZUNvbmZpZ3MoZHVtbXksIGNvbmZpZ3MsIGNvbmZpZ19zaXplKTsKK30KKworaW50IEVnbERpc3BsYXk6OmRvQ2hvb3NlQ29uZmlncyhjb25zdCBFZ2xDb25maWcmIGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcqIGNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb25maWdfc2l6ZSkgY29uc3QgeworICAgIGludCBhZGRlZCA9IDA7CisKKyAgICBzdGQ6OnZlY3RvcjxFZ2xDb25maWcqPiB2YWxpZENvbmZpZ3M7CisKKyAgICBDSE9PU0VfQ09ORklHX0RMT0coInJldHVybmluZyBjb25maWdzLiBpZHM6IHsiKTsKKyAgICBmb3IoQ29uZmlnc0xpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb25maWdzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1fY29uZmlncy5lbmQoKSAmJiAoYWRkZWQgPCBjb25maWdfc2l6ZSB8fCAhY29uZmlncyk7CisgICAgICAgICsraXQpIHsKKyAgICAgICAgaWYoICgqaXQpLT5jaG9zZW4oZHVtbXkpKXsKKyAgICAgICAgICAgIGlmKGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0coInZhbGlkIGNvbmZpZzogaWQ9MHgleCIsIGl0LT5nZXQoKS0+aWQoKSk7CisgICAgICAgICAgICAgICAgdmFsaWRDb25maWdzLnB1c2hfYmFjayhpdC0+Z2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkZWQrKzsKKyAgICAgICB9CisgICAgfQorCisgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJzb3J0aW5nIHZhbGlkIGNvbmZpZ3MuLi4iKTsKKworICAgIHN0ZDo6c29ydCh2YWxpZENvbmZpZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgdmFsaWRDb25maWdzLmVuZCgpLAorICAgICAgICAgICAgICBDb21wYXJlRWdsQ29uZmlnczo6RHluYW1pY0NvbXBhcmUoZHVtbXkpKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWQ7IGkrKykgeworICAgICAgICBjb25maWdzW2ldID0gc3RhdGljX2Nhc3Q8RUdMQ29uZmlnPih2YWxpZENvbmZpZ3NbaV0pOworICAgIH0KKworICAgIENIT09TRV9DT05GSUdfRExPRygicmV0dXJuaW5nIGNvbmZpZ3MuIGlkcyBlbmQgfSIpOworICAgIHJldHVybiBhZGRlZDsKK30KKworRUdMU3VyZmFjZSBFZ2xEaXNwbGF5OjphZGRTdXJmYWNlKFN1cmZhY2VQdHIgcyApIHsKKyAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgIHVuc2lnbmVkIGludCBobmRsID0gcy5nZXQoKS0+Z2V0SG5kbCgpOworICAgRUdMU3VyZmFjZSByZXQgPXJlaW50ZXJwcmV0X2Nhc3Q8RUdMU3VyZmFjZT4gKGhuZGwpOworCisgICBpZihtX3N1cmZhY2VzLmZpbmQoaG5kbCkgIT0gbV9zdXJmYWNlcy5lbmQoKSkgeworICAgICAgIHJldHVybiByZXQ7CisgICB9CisKKyAgIG1fc3VyZmFjZXNbaG5kbF0gPSBzOworICAgcmV0dXJuIHJldDsKK30KKworRUdMQ29udGV4dCBFZ2xEaXNwbGF5OjphZGRDb250ZXh0KENvbnRleHRQdHIgY3R4ICkgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKworICAgdW5zaWduZWQgaW50IGhuZGwgPSBjdHguZ2V0KCktPmdldEhuZGwoKTsKKyAgIEVHTENvbnRleHQgcmV0ICAgID0gcmVpbnRlcnByZXRfY2FzdDxFR0xDb250ZXh0PiAoaG5kbCk7CisKKyAgIGlmKG1fY29udGV4dHMuZmluZChobmRsKSAhPSBtX2NvbnRleHRzLmVuZCgpKSB7CisgICAgICAgcmV0dXJuIHJldDsKKyAgIH0KKyAgIG1fY29udGV4dHNbaG5kbF0gPSBjdHg7CisgICByZXR1cm4gcmV0OworfQorCisKK0VHTEltYWdlS0hSIEVnbERpc3BsYXk6OmFkZEltYWdlS0hSKEltYWdlUHRyIGltZykgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBkbyB7ICsrbV9uZXh0RWdsSW1hZ2VJZDsgfSB3aGlsZShtX25leHRFZ2xJbWFnZUlkID09IDApOworICAgIGltZy0+aW1hZ2VJZCA9IG1fbmV4dEVnbEltYWdlSWQ7CisgICAgbV9lZ2xJbWFnZXNbbV9uZXh0RWdsSW1hZ2VJZF0gPSBpbWc7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RUdMSW1hZ2VLSFI+KG1fbmV4dEVnbEltYWdlSWQpOworfQorCitJbWFnZVB0ciBFZ2xEaXNwbGF5OjpnZXRJbWFnZShFR0xJbWFnZUtIUiBpbWcpIGNvbnN0IHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgLyogaW1nIGlzICJrZXkiIGluIG1hcDx1bnNpZ25lZCBpbnQsIEltYWdlUHRyPi4gKi8KKyAgICB1bnNpZ25lZCBpbnQgaG5kbCA9IFNhZmVVSW50RnJvbVBvaW50ZXIoaW1nKTsKKyAgICBJbWFnZXNIbmRsTWFwOjpjb25zdF9pdGVyYXRvciBpKCBtX2VnbEltYWdlcy5maW5kKGhuZGwpICk7CisgICAgcmV0dXJuIChpICE9IG1fZWdsSW1hZ2VzLmVuZCgpKSA/ICgqaSkuc2Vjb25kIDpJbWFnZVB0cigpOworfQorCitib29sIEVnbERpc3BsYXk6OiBkZXN0cm95SW1hZ2VLSFIoRUdMSW1hZ2VLSFIgaW1nKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIC8qIGltZyBpcyAia2V5IiBpbiBtYXA8dW5zaWduZWQgaW50LCBJbWFnZVB0cj4uICovCisgICAgdW5zaWduZWQgaW50IGhuZGwgPSBTYWZlVUludEZyb21Qb2ludGVyKGltZyk7CisgICAgSW1hZ2VzSG5kbE1hcDo6aXRlcmF0b3IgaSggbV9lZ2xJbWFnZXMuZmluZChobmRsKSApOworICAgIGlmIChpICE9IG1fZWdsSW1hZ2VzLmVuZCgpKQorICAgIHsKKyAgICAgICAgbV9lZ2xJbWFnZXMuZXJhc2UoaSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0VnbE9TOjpDb250ZXh0KiBFZ2xEaXNwbGF5OjpnZXRHbG9iYWxTaGFyZWRDb250ZXh0KCkgY29uc3QgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyNpZm5kZWYgX1dJTjMyCisgICAgLy8gZmluZCBhbiBleGlzdGluZyBPcGVuR0wgY29udGV4dCB0byBzaGFyZSB3aXRoLCBpZiBleGlzdAorICAgIEVnbE9TOjpDb250ZXh0KiByZXQgPQorICAgICAgICAoRWdsT1M6OkNvbnRleHQqKW1fbWFuYWdlcltHTEVTXzFfMV0tPmdldEdsb2JhbENvbnRleHQoKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0ID0gKEVnbE9TOjpDb250ZXh0KiltX21hbmFnZXJbR0xFU18yXzBdLT5nZXRHbG9iYWxDb250ZXh0KCk7CisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgaWYgKCFtX2dsb2JhbFNoYXJlZENvbnRleHQpIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gd2luZG93cyB3ZSBjcmVhdGUgYSBkdW1teSBjb250ZXh0IHRvIHNlcnZlIGFzIHRoZQorICAgICAgICAvLyAiZ2xvYmFsIGNvbnRleHQiIHdoaWNoIGFsbCBjb250ZXh0cyBzaGFyZSB3aXRoLgorICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2Ugb24gd2luZG93cyBpdCBpcyBub3QgcG9zc2libGUgdG8gc2hhcmUKKyAgICAgICAgLy8gd2l0aCBhIGNvbnRleHQgd2hpY2ggaXMgYWxyZWFkeSBjdXJyZW50LiBUaGlzIGR1bW15IGNvbnRleHQKKyAgICAgICAgLy8gd2lsbCBuZXZlciBiZSBjdXJyZW50IHRvIGFueSB0aHJlYWQgc28gaXQgaXMgc2FmZSB0byBzaGFyZSB3aXRoLgorICAgICAgICAvLyBDcmVhdGUgdGhhdCBjb250ZXh0IHVzaW5nIHRoZSBmaXJzdCBjb25maWcKKyAgICAgICAgaWYgKG1fY29uZmlncy5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiEgY29uZmlnIGxpc3Qgc2hvdWxkIGJlIGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEVnbENvbmZpZyAqY2ZnID0gbV9jb25maWdzLmZyb250KCkuZ2V0KCk7CisgICAgICAgIG1fZ2xvYmFsU2hhcmVkQ29udGV4dCA9IG1faWRweS0+Y3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgICAgICBjZmctPm5hdGl2ZUZvcm1hdCgpLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gbV9nbG9iYWxTaGFyZWRDb250ZXh0OworI2VuZGlmCit9CisKKy8vIHN0YXRpYwordm9pZCBFZ2xEaXNwbGF5OjphZGRDb25maWcodm9pZCogb3BhcXVlLCBjb25zdCBFZ2xPUzo6Q29uZmlnSW5mbyogaW5mbykgeworICAgIEVnbERpc3BsYXkqIGRpc3BsYXkgPSBzdGF0aWNfY2FzdDxFZ2xEaXNwbGF5Kj4ob3BhcXVlKTsKKyAgICBFZ2xDb25maWcqIGNvbmZpZyA9IG5ldyBFZ2xDb25maWcoCisgICAgICAgICAgICBpbmZvLT5yZWRfc2l6ZSwKKyAgICAgICAgICAgIGluZm8tPmdyZWVuX3NpemUsCisgICAgICAgICAgICBpbmZvLT5ibHVlX3NpemUsCisgICAgICAgICAgICBpbmZvLT5hbHBoYV9zaXplLAorICAgICAgICAgICAgaW5mby0+Y2F2ZWF0LAorICAgICAgICAgICAgaW5mby0+Y29uZmlnX2lkLAorICAgICAgICAgICAgaW5mby0+ZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgIGluZm8tPmZyYW1lX2J1ZmZlcl9sZXZlbCwKKyAgICAgICAgICAgIGluZm8tPm1heF9wYnVmZmVyX3dpZHRoLAorICAgICAgICAgICAgaW5mby0+bWF4X3BidWZmZXJfaGVpZ2h0LAorICAgICAgICAgICAgaW5mby0+bWF4X3BidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgIGluZm8tPm5hdGl2ZV9yZW5kZXJhYmxlLAorICAgICAgICAgICAgaW5mby0+cmVuZGVyYWJsZV90eXBlLAorICAgICAgICAgICAgaW5mby0+bmF0aXZlX3Zpc3VhbF9pZCwKKyAgICAgICAgICAgIGluZm8tPm5hdGl2ZV92aXN1YWxfdHlwZSwKKyAgICAgICAgICAgIGluZm8tPnNhbXBsZXNfcGVyX3BpeGVsLAorICAgICAgICAgICAgaW5mby0+c3RlbmNpbF9zaXplLAorICAgICAgICAgICAgaW5mby0+c3VyZmFjZV90eXBlLAorICAgICAgICAgICAgaW5mby0+dHJhbnNwYXJlbnRfdHlwZSwKKyAgICAgICAgICAgIGluZm8tPnRyYW5zX3JlZF92YWwsCisgICAgICAgICAgICBpbmZvLT50cmFuc19ncmVlbl92YWwsCisgICAgICAgICAgICBpbmZvLT50cmFuc19ibHVlX3ZhbCwKKyAgICAgICAgICAgIGluZm8tPnJlY29yZGFibGVfYW5kcm9pZCwKKyAgICAgICAgICAgIGluZm8tPmZybXQpOworCisgICAgZGlzcGxheS0+bV9jb25maWdzLmVtcGxhY2VfYmFjayhjb25maWcpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xEaXNwbGF5LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbERpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGZmYTRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xEaXNwbGF5LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEVHTF9ESVNQTEFZX0gKKyNkZWZpbmUgRUdMX0RJU1BMQVlfSAorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbXV0ZXguaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc21hcnRfcHRyLmgiCisKKyNpbmNsdWRlICJFZ2xDb25maWcuaCIKKyNpbmNsdWRlICJFZ2xDb250ZXh0LmgiCisjaW5jbHVkZSAiRWdsT3NBcGkuaCIKKyNpbmNsdWRlICJFZ2xTdXJmYWNlLmgiCisjaW5jbHVkZSAiRWdsV2luZG93U3VyZmFjZS5oIgorI2luY2x1ZGUgIkdMY29tbW9uL09iamVjdE5hbWVTcGFjZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RWdsQ29uZmlnPj4gQ29uZmlnc0xpc3Q7Cit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx1bnNpZ25lZCBpbnQsIENvbnRleHRQdHI+ICBDb250ZXh0c0huZGxNYXA7Cit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx1bnNpZ25lZCBpbnQsIFN1cmZhY2VQdHI+ICBTdXJmYWNlc0huZGxNYXA7CisKK2NsYXNzIEVnbERpc3BsYXkgeworcHVibGljOgorICAgIC8vIENyZWF0ZSBuZXcgRWdsRGlzcGxheSBpbnN0YW5jZSBmcm9tIGEgZ2l2ZW4gbmF0aXZlIGRpc3BsYXkgfGRweXwsCisgICAgLy8gd2l0aCBtYXRjaGluZyBpbnRlcm5hbCBkaXNwbGF5IHxpZHB5fC4gSWYgfGlzRGVmYXVsdHwgaXMgdHJ1ZSwKKyAgICAvLyB0aGlzIHdpbGwgYmUgY29uc2lkZXJlZCB0aGUgZGVmYXVsdCBkaXBsYXkuCisgICAgRWdsRGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHksIEVnbE9TOjpEaXNwbGF5KiBpZHB5KTsKKworICAgIC8vIFJldHVybiB0aGUgbmF0aXZlIGRpc3BsYXkgaGFuZGxlIGZvciB0aGlzIEVnbERpc3BsYXkuCisgICAgRUdMTmF0aXZlRGlzcGxheVR5cGUgZ2V0TmF0aXZlRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZHB5OyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG5hdGl2ZSBpbnRlcm5hbCBkaXNwbGF5IGhhbmRsZSBmb3IgdGhpcyBFZ2xEaXNwbGF5LgorICAgIEVnbE9TOjpEaXNwbGF5KiBuYXRpdmVUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9pZHB5OyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBrbm93biBjb25maWd1cmF0aW9ucyBmb3IgdGhpcyBFZ2xEaXNwbGF5LgorICAgIGludCBuQ29uZmlncygpIGNvbnN0IHsgcmV0dXJuIG1fY29uZmlncy5zaXplKCk7IH0KKworICAgIC8vIFdyaXRlIHVwIHRvIHxjb25maWdfc2l6ZXwgRUdMQ29uZmlnIHZhbHVlcyBpbnRvIHRoZSB8Y29uZmlnc3wgYXJyYXkuCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgaWYgdmFsdWVzIHdyaXR0ZW4uCisgICAgaW50IGdldENvbmZpZ3MoRUdMQ29uZmlnKiBjb25maWdzLGludCBjb25maWdfc2l6ZSkgY29uc3Q7CisKKyAgICAvLyBTZWxlY3QgYWxsIGRpc3BsYXkgY29uZmlndXJhdGlvbnMgdGhhdCBtYXRjaCBhdCBsZWFzdCB0aGUgdmFsdWVzCisgICAgLy8gaW4gfGR1bW15fC4gSWYgfGNvbmZpZ3N8IGlzIE5VTEwsIHRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFsbAorICAgIC8vIG1hdGNoaW5nIGNvbmZpZ3MuIE90aGVyd2lzZSwgdGhpcyB3cml0ZXMgaW50byB8Y29uZmlnc3wgdXAgdG8KKyAgICAvLyB8Y29uZmlnX3NpemV8IG1hdGNoaW5nIEVHTENvbmZpZyB2YWx1ZXMsIGFuZCByZXR1cm5zIHRoZWlyIG51bWJlci4KKyAgICBpbnQgY2hvb3NlQ29uZmlncyhjb25zdCBFZ2xDb25maWcmIGR1bW15LAorICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyogY29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY29uZmlnX3NpemUpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIHRoZSBFZ2xDb25maWcgdmFsdWUgdGhhdCBtYXRjaGVzIGEgZ2l2ZW4gRUdMQ29uZmlnIHxjb25mfC4KKyAgICBFZ2xDb25maWcqIGdldENvbmZpZyhFR0xDb25maWcgY29uZikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIEVnbENvbmZpZyB2YWx1ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBFR0xDb25maWcgd2l0aAorICAgIC8vIEVHTF9DT05GSUdfSUQgdmFsdWUgfGlkfC4KKyAgICBFZ2xDb25maWcqIGdldENvbmZpZyhFR0xpbnQgaWQpIGNvbnN0OworCisgICAgRUdMU3VyZmFjZSBhZGRTdXJmYWNlKFN1cmZhY2VQdHIgcyApOworICAgIFN1cmZhY2VQdHIgZ2V0U3VyZmFjZShFR0xTdXJmYWNlIHN1cmZhY2UpIGNvbnN0OworICAgIGJvb2wgcmVtb3ZlU3VyZmFjZShFR0xTdXJmYWNlIHMpOworICAgIEVHTENvbnRleHQgYWRkQ29udGV4dChDb250ZXh0UHRyIGN0eCApOworICAgIENvbnRleHRQdHIgZ2V0Q29udGV4dChFR0xDb250ZXh0IGN0eCkgY29uc3Q7CisgICAgYm9vbCByZW1vdmVDb250ZXh0KEVHTENvbnRleHQgY3R4KTsKKyAgICBib29sIHJlbW92ZUNvbnRleHQoQ29udGV4dFB0ciBjdHgpOworICAgIE9iamVjdE5hbWVNYW5hZ2VyKiBnZXRNYW5hZ2VyKEdMRVNWZXJzaW9uIHZlcikgY29uc3QgeyByZXR1cm4gbV9tYW5hZ2VyW3Zlcl07fQorCisgICAgfkVnbERpc3BsYXkoKTsKKyAgICB2b2lkIGluaXRpYWxpemUoaW50IHJlbmRlcmFibGVUeXBlKTsKKyAgICB2b2lkIHRlcm1pbmF0ZSgpOworICAgIGJvb2wgaXNJbml0aWFsaXplKCk7CisKKyAgICBJbWFnZVB0ciBnZXRJbWFnZShFR0xJbWFnZUtIUiBpbWcpIGNvbnN0OworICAgIEVHTEltYWdlS0hSIGFkZEltYWdlS0hSKEltYWdlUHRyKTsKKyAgICBib29sIGRlc3Ryb3lJbWFnZUtIUihFR0xJbWFnZUtIUiBpbWcpOworICAgIEVnbE9TOjpDb250ZXh0KiBnZXRHbG9iYWxTaGFyZWRDb250ZXh0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICBzdGF0aWMgdm9pZCBhZGRDb25maWcodm9pZCogb3BhcXVlLCBjb25zdCBFZ2xPUzo6Q29uZmlnSW5mbyogY29uZmlnSW5mbyk7CisKKyAgIGludCBkb0Nob29zZUNvbmZpZ3MoY29uc3QgRWdsQ29uZmlnJiBkdW1teSxFR0xDb25maWcqIGNvbmZpZ3MsaW50IGNvbmZpZ19zaXplKSBjb25zdDsKKyAgIHZvaWQgYWRkU2ltcGxlUGl4ZWxGb3JtYXQoaW50IHJlZF9zaXplLCBpbnQgZ3JlZW5fc2l6ZSwgaW50IGJsdWVfc2l6ZSwgaW50IGFscGhhX3NpemUpOworICAgdm9pZCBhZGRNaXNzaW5nQ29uZmlncyh2b2lkKTsKKyAgIHZvaWQgaW5pdENvbmZpZ3VyYXRpb25zKGludCByZW5kZXJhYmxlVHlwZSk7CisKKyAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlICAgIG1fZHB5ID0ge307CisgICBFZ2xPUzo6RGlzcGxheSogICAgICAgICBtX2lkcHkgPSBudWxscHRyOworICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbV9pbml0aWFsaXplZCA9IGZhbHNlOworICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbV9jb25maWdJbml0aWFsaXplZCA9IGZhbHNlOworICAgQ29uZmlnc0xpc3QgICAgICAgICAgICAgbV9jb25maWdzOworICAgQ29udGV4dHNIbmRsTWFwICAgICAgICAgbV9jb250ZXh0czsKKyAgIFN1cmZhY2VzSG5kbE1hcCAgICAgICAgIG1fc3VyZmFjZXM7CisgICBHbG9iYWxOYW1lU3BhY2UgICAgICAgICBtX2dsb2JhbE5hbWVTcGFjZTsKKyAgIE9iamVjdE5hbWVNYW5hZ2VyKiAgICAgIG1fbWFuYWdlcltNQVhfR0xFU19WRVJTSU9OXTsKKyAgIG11dGFibGUgZW11Z2w6Ok11dGV4ICAgIG1fbG9jazsKKyAgIEltYWdlc0huZGxNYXAgICAgICAgICAgIG1fZWdsSW1hZ2VzOworICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgbV9uZXh0RWdsSW1hZ2VJZCA9IDA7CisgICBtdXRhYmxlIEVnbE9TOjpDb250ZXh0KiBtX2dsb2JhbFNoYXJlZENvbnRleHQgPSBudWxscHRyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbEdsb2JhbEluZm8uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xHbG9iYWxJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhhYTdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xHbG9iYWxJbmZvLmNwcApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xHbG9iYWxJbmZvLmgiCisKKyNpbmNsdWRlICJDbGllbnRBUElFeHRzLmgiCisjaW5jbHVkZSAiRWdsRGlzcGxheS5oIgorI2luY2x1ZGUgIkVnbE9zQXBpLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSB7CisKKy8vIFVzZSBhIExhenlJbnN0YW5jZSB0byBlbnN1cmUgdGhyZWFkLXNhZmUgaW5pdGlhbGl6YXRpb24uCitlbXVnbDo6TGF6eUluc3RhbmNlPEVnbEdsb2JhbEluZm8+IHNTaW5nbGV0b24gPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0VnbEdsb2JhbEluZm8qIEVnbEdsb2JhbEluZm86OmdldEluc3RhbmNlKCkgeworICAgIHJldHVybiBzU2luZ2xldG9uLnB0cigpOworfQorCitFZ2xHbG9iYWxJbmZvOjpFZ2xHbG9iYWxJbmZvKCkgeworICAgIC8vIFRPRE8oZGlnaXQpOiBDaG9vc2UgYWx0ZXJuYXRlIGVuZ2luZSBiYXNlZCBvbiBlbnYuIHZhcmlhYmxlPworICAgIG1fZW5naW5lID0gRWdsT1M6OkVuZ2luZTo6Z2V0SG9zdEluc3RhbmNlKCk7CisgICAgbV9kaXNwbGF5ID0gbV9lbmdpbmUtPmdldERlZmF1bHREaXNwbGF5KCk7Cit9CisKK0VnbEdsb2JhbEluZm86On5FZ2xHbG9iYWxJbmZvKCkgeworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgbV9kaXNwbGF5cy5zaXplKCk7ICsrbikgeworICAgICAgICBkZWxldGUgbV9kaXNwbGF5c1tuXTsKKyAgICB9Cit9CisKK0VnbERpc3BsYXkqIEVnbEdsb2JhbEluZm86OmFkZERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6RGlzcGxheSogaWRweSkgeworICAgIC8vc2VhcmNoIGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IG1fZGlzcGxheXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgaWYgKG1fZGlzcGxheXNbbl0tPmdldE5hdGl2ZURpc3BsYXkoKSA9PSBkcHkpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2Rpc3BsYXlzW25dOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpZHB5KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBFZ2xEaXNwbGF5KiByZXN1bHQgPSBuZXcgRWdsRGlzcGxheShkcHksIGlkcHkpOworICAgIG1fZGlzcGxheXMucHVzaF9iYWNrKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCAgRWdsR2xvYmFsSW5mbzo6cmVtb3ZlRGlzcGxheShFR0xEaXNwbGF5IGRweSkgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IG1fZGlzcGxheXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgaWYgKG1fZGlzcGxheXNbbl0gPT0gc3RhdGljX2Nhc3Q8RWdsRGlzcGxheSo+KGRweSkpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtX2Rpc3BsYXlzW25dOworICAgICAgICAgICAgbV9kaXNwbGF5cy5lcmFzZShtX2Rpc3BsYXlzLmJlZ2luKCkgKyBuKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworRWdsRGlzcGxheSogRWdsR2xvYmFsSW5mbzo6Z2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHkpIGNvbnN0IHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBtX2Rpc3BsYXlzLnNpemUoKTsgKytuKSB7CisgICAgICAgIGlmIChtX2Rpc3BsYXlzW25dLT5nZXROYXRpdmVEaXNwbGF5KCkgPT0gZHB5KSB7CisgICAgICAgICAgICByZXR1cm4gbV9kaXNwbGF5c1tuXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworRWdsRGlzcGxheSogRWdsR2xvYmFsSW5mbzo6Z2V0RGlzcGxheShFR0xEaXNwbGF5IGRweSkgY29uc3QgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IG1fZGlzcGxheXMuc2l6ZSgpOyArK24pIHsKKyAgICAgICAgaWYgKG1fZGlzcGxheXNbbl0gPT0gc3RhdGljX2Nhc3Q8RWdsRGlzcGxheSo+KGRweSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2Rpc3BsYXlzW25dOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEVnbEdsb2JhbEluZm86OmluaXRDbGllbnRFeHRGdW5jVGFibGUoR0xFU1ZlcnNpb24gdmVyKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIGlmICghbV9nbGVzX2V4dEZ1bmNzX2luaXRlZFt2ZXJdKSB7CisgICAgICAgIENsaWVudEFQSUV4dHM6OmluaXRDbGllbnRGdW5jcyhtX2dsZXNfaWZhY2VzW3Zlcl0sIChpbnQpdmVyIC0gMSk7CisgICAgICAgIG1fZ2xlc19leHRGdW5jc19pbml0ZWRbdmVyXSA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xHbG9iYWxJbmZvLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbEdsb2JhbEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGRjOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xHbG9iYWxJbmZvLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEVHTF9HTE9CQUxfSU5GTworI2RlZmluZSBFR0xfR0xPQkFMX0lORk8KKworI2luY2x1ZGUgIkVnbERpc3BsYXkuaCIKKyNpbmNsdWRlICJFZ2xDb25maWcuaCIKKyNpbmNsdWRlICJFZ2xDb250ZXh0LmgiCisjaW5jbHVkZSAiRWdsT3NBcGkuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL211dGV4LmgiCisKKyNpbmNsdWRlIDxHTGNvbW1vbi9UcmFuc2xhdG9ySWZhY2VzLmg+CisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIEVnbERpc3BsYXk7CisKKy8vIEhvbGRzIGFsbCBnbG9iYWwgaW5mb3JtYXRpb24gc2hhcmVkIGJ5IHRoZSBFR0wgaW1wbGVtZW50YXRpb24gaW4gYSBnaXZlbgorLy8gcHJvY2Vzcy4gVGhpcyByZWFsbHkgYW1vdW50cyB0bzoKKy8vCisvLyAgIC0gQSBsaXN0IG9mIEVnbERpc3BsYXkgaW5zdGFuY2VzLCBlYWNoIGlkZW50aWZpZWQgYnkgYW4KKy8vICAgICBFR0xOYXRpdmVEaXNwbGF5VHlwZSBhbmQgRWdsT1M6OkRpc3BsYXkqLgorLy8KKy8vICAgLSBHTEVTIGludGVyZmFjZSBmdW5jdGlvbiBwb2ludGVycyBmb3IgYWxsIHN1cHBvcnRlZCBHTEVTIHZlcnNpb25zLgorCitjbGFzcyBFZ2xHbG9iYWxJbmZvIHsKKworcHVibGljOgorICAgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwcm9jZXNzJyBzaW5nbGUgaW5zdGFuY2UsIHdoaWNoIHdpbGwgYmUKKyAgICAvLyBjcmVhdGVkIG9uIGRlbWFuZC4gVGhpcyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBlYWNoIGNhbGwgd2lsbAorICAgIC8vIGluY3JlbWVudCBhbiBpbnRlcm5hbCByZWZlcmVuY2UtY291bnQuCisgICAgc3RhdGljIEVnbEdsb2JhbEluZm8qIGdldEluc3RhbmNlKCk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgRWdsRGlzcGxheSBpbnN0YW5jZSBmcm9tIGFuIGV4aXN0aW5nIG5hdGl2ZSB8ZHB5fCB2YWx1ZS4KKyAgICAvLyB8aWRweXwgaXMgdGhlIGNvcnJlc3BvbmRpbmcgbmF0aXZlIGludGVybmFsIGRpc3BsYXkgdHlwZS4gU2VlCisgICAgLy8gZ2VuZXJhdGVJbnRlcm5hbERpc3BsYXkoKSBiZWxvdyB0byB1bmRlcnN0YW5kIGhvdyB0aGV5IGRpZmZlci4KKyAgICBFZ2xEaXNwbGF5KiBhZGREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpEaXNwbGF5KiBpZHB5KTsKKworICAgIC8vIFJldHVybiB0aGUgRWdsRGlzcGxheSBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gbmF0aXZlIHxkcHl8CisgICAgLy8gdmFsdWUuCisgICAgRWdsRGlzcGxheSogZ2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHkpIGNvbnN0OworCisgICAgLy8gUmV0dXJuIHRoZSBFZ2xEaXNwbGF5IGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBFR0xEaXNwbGF5IHxkcHl8CisgICAgLy8gdmFsdWUuIE5VTEwgaWYgbm9uZSBtYXRjaGVzLgorICAgIEVnbERpc3BsYXkqIGdldERpc3BsYXkoRUdMRGlzcGxheSBkcHkpIGNvbnN0OworCisgICAgLy8gUmVtb3ZlIGEgZ2l2ZW4gRUdMRGlzcGxheSBpZGVudGlmaWVkIGJ5IHxkcHl8LgorICAgIGJvb2wgcmVtb3ZlRGlzcGxheShFR0xEaXNwbGF5IGRweSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgbmF0aXZlIGludGVybmFsIGRpc3BsYXkgaGFuZGxlLgorICAgIEVnbE9TOjpEaXNwbGF5KiBnZXREZWZhdWx0TmF0aXZlRGlzcGxheSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZGlzcGxheTsKKyAgICB9OworCisgICAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IGVuZ2luZSBoYW5kbGUuCisgICAgRWdsT1M6OkVuZ2luZSogZ2V0T3NFbmdpbmUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2VuZ2luZTsKKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIEdMRVMgaW50ZXJmYWNlIHBvaW50ZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIEdMRVMgdmVyc2lvbi4KKyAgICAvLyB8aWZhY2V8IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAgLy8gcmVsYXRlZCB0byBhIHNwZWNpZmljIEdMRVMgdmVyc2lvbi4KKyAgICAvLyB8dmVyfCBpcyBhIHZlcnNpb24gaWRlbnRpZmllciwgZS5nLiBHTEVTXzFfMSBvciBHTEVTXzJfMC4KKyAgICB2b2lkIHNldElmYWNlKGNvbnN0IEdMRVNpZmFjZSogaWZhY2UsIEdMRVNWZXJzaW9uIHZlcikgeworICAgICAgICBtX2dsZXNfaWZhY2VzW3Zlcl0gPSBpZmFjZTsKKyAgICB9OworCisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IEdMRVMgaW50ZXJmYWNlIHBvaW50ZXIgZm9yIGEgZ2l2ZW4gR0xFUyB2ZXJzaW9uLgorICAgIC8vIHx2ZXJ8IGlzIGEgdmVyc2lvbiBpZGVudGlmaWVyLCBlLmcuIEdMRVNfMV8xIG9yIEdMRVNfMl8wLgorICAgIGNvbnN0IEdMRVNpZmFjZSogZ2V0SWZhY2UoR0xFU1ZlcnNpb24gdmVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2dsZXNfaWZhY2VzW3Zlcl07CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgdGFibGUgb2YgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgYSBnaXZlbiBHTEVTIHZlcnNpb24KKyAgICAvLyB8dmVyfC4gVGhpcyBtdXN0IGJlIGNhbGxlZCBhZnRlciBzZXRJZmFjZSgpIGZvciB0aGUgY29ycmVzcG9uZGluZworICAgIC8vIHZlcnNpb24uCisgICAgdm9pZCBpbml0Q2xpZW50RXh0RnVuY1RhYmxlKEdMRVNWZXJzaW9uIHZlcik7CisKK3ByaXZhdGU6CisgICAgRWdsR2xvYmFsSW5mbygpOworICAgIH5FZ2xHbG9iYWxJbmZvKCk7CisKKyAgICBmcmllbmQgZW11Z2w6OkxhenlJbnN0YW5jZTxFZ2xHbG9iYWxJbmZvPjsKKworICAgIHN0ZDo6dmVjdG9yPEVnbERpc3BsYXkqPiAgICAgICBtX2Rpc3BsYXlzOworICAgIEVnbE9TOjpFbmdpbmUqICAgICAgICAgICAgICAgICBtX2VuZ2luZSA9IG51bGxwdHI7CisgICAgRWdsT1M6OkRpc3BsYXkqICAgICAgICAgICAgICAgIG1fZGlzcGxheSA9IG51bGxwdHI7CisgICAgY29uc3QgR0xFU2lmYWNlKiAgICAgICAgICAgICAgIG1fZ2xlc19pZmFjZXNbTUFYX0dMRVNfVkVSU0lPTl0gPSB7fTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nbGVzX2V4dEZ1bmNzX2luaXRlZFtNQVhfR0xFU19WRVJTSU9OXSA9IHt9OworICAgIG11dGFibGUgZW11Z2w6Ok11dGV4ICAgICAgICAgICBtX2xvY2s7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsSW1wLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsSW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTkxNTE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xJbXAuY3BwCkBAIC0wLDAgKzEsMTEzMiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZmRlZiBfV0lOMzIKKyN1bmRlZiBFR0xBUEkKKyNkZWZpbmUgRUdMQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2VuZGlmCisKKyNpbmNsdWRlICJUaHJlYWRJbmZvLmgiCisjaW5jbHVkZSA8R0xjb21tb24vR0xFU2NvbnRleHQuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9UcmFuc2xhdG9ySWZhY2VzLmg+CisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgiCisjaW5jbHVkZSA8T3BlbmdsQ29kZWNDb21tb24vRXJyb3JMb2cuaD4KKworI2luY2x1ZGUgIkVnbFdpbmRvd1N1cmZhY2UuaCIKKyNpbmNsdWRlICJFZ2xQYnVmZmVyU3VyZmFjZS5oIgorI2luY2x1ZGUgIkVnbEdsb2JhbEluZm8uaCIKKyNpbmNsdWRlICJFZ2xUaHJlYWRJbmZvLmgiCisjaW5jbHVkZSAiRWdsVmFsaWRhdGUuaCIKKyNpbmNsdWRlICJFZ2xEaXNwbGF5LmgiCisjaW5jbHVkZSAiRWdsQ29udGV4dC5oIgorI2luY2x1ZGUgIkVnbENvbmZpZy5oIgorI2luY2x1ZGUgIkVnbE9zQXBpLmgiCisjaW5jbHVkZSAiQ2xpZW50QVBJRXh0cy5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBNQUpPUiAgICAgICAgICAxCisjZGVmaW5lIE1JTk9SICAgICAgICAgIDQKKworLy9kZWNsYXJhdGlvbnMKKworSW1hZ2VQdHIgZ2V0RUdMSW1hZ2UodW5zaWduZWQgaW50IGltYWdlSWQpOworR0xFU2NvbnRleHQqIGdldEdMRVNDb250ZXh0KCk7CitHbExpYnJhcnkqIGdldEdsTGlicmFyeSgpOworCisjZGVmaW5lIHRsc190aHJlYWQgIEVnbFRocmVhZEluZm86OmdldCgpCisKK0VnbEdsb2JhbEluZm8qIGdfZWdsSW5mbyA9IE5VTEw7CitlbXVnbDo6TXV0ZXggIHNfZWdsTG9jazsKKwordm9pZCBpbml0R2xvYmFsSW5mbygpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChzX2VnbExvY2spOworICAgIGlmICghZ19lZ2xJbmZvKSB7CisgICAgICAgIGdfZWdsSW5mbyA9IEVnbEdsb2JhbEluZm86OmdldEluc3RhbmNlKCk7CisgICAgfSAKK30KKworc3RhdGljIGNvbnN0IEVHTGlmYWNlIHNfZWdsSWZhY2UgPSB7CisgICAgLmdldEdMRVNDb250ZXh0ID0gZ2V0R0xFU0NvbnRleHQsCisgICAgLmdldEVHTEltYWdlID0gZ2V0RUdMSW1hZ2UsCisgICAgLmVnbEdldEdsTGlicmFyeSA9IGdldEdsTGlicmFyeSwKK307CisKK3N0YXRpYyB2b2lkIGluaXRHTEVTeChHTEVTVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgY29uc3QgR0xFU2lmYWNlKiBpZmFjZSA9IGdfZWdsSW5mby0+Z2V0SWZhY2UodmVyc2lvbik7CisgICAgaWYgKCFpZmFjZSkgeworICAgICAgICBEQkcoIkVHTCBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBHTEVTdiVkOyBpbmNvbXBhdGlibGUgaW50ZXJmYWNlXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZmFjZS0+aW5pdEdMRVN4KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgc3VwcG9ydGVkIGV4dGVuc2lvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gIkMiIHsKK0VHTEFQSSBFR0xJbWFnZUtIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVJbWFnZUtIUihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUltYWdlS0hSKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMSW1hZ2VLSFIgaW1hZ2UpOworRUdMQVBJIEVHTFN5bmNLSFIgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlU3luY0tIUihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGVudW0gdHlwZSwgY29uc3QgRUdMaW50KiBhdHRyaWJzKTsKK0VHTEFQSSBFR0xpbnQgRUdMQVBJRU5UUlkgZWdsQ2xpZW50V2FpdFN5bmNLSFIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTeW5jS0hSKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3luY0tIUiBzeW5jKTsKK30gIC8vIGV4dGVybiAiQyIKKworc3RhdGljIGNvbnN0IEV4dGVuc2lvbkRlc2NyaXB0b3Igc19lZ2xFeHRlbnNpb25zW10gPSB7CisgICAgICAgIHsiZWdsQ3JlYXRlSW1hZ2VLSFIiICwKKyAgICAgICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSllZ2xDcmVhdGVJbWFnZUtIUiB9LAorICAgICAgICB7ImVnbERlc3Ryb3lJbWFnZUtIUiIsCisgICAgICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZWdsRGVzdHJveUltYWdlS0hSIH0sCisgICAgICAgIHsiZWdsQ3JlYXRlU3luY0tIUiIgLAorICAgICAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWVnbENyZWF0ZVN5bmNLSFIgfSwKKyAgICAgICAgeyJlZ2xDbGllbnRXYWl0U3luY0tIUiIsCisgICAgICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZWdsQ2xpZW50V2FpdFN5bmNLSFIgfSwKKyAgICAgICAgeyJlZ2xEZXN0cm95U3luY0tIUiIsCisgICAgICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZWdsRGVzdHJveVN5bmNLSFIgfSwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgc19lZ2xFeHRlbnNpb25zU2l6ZSA9CisgICAgICAgIHNpemVvZihzX2VnbEV4dGVuc2lvbnMpIC8gc2l6ZW9mKEV4dGVuc2lvbkRlc2NyaXB0b3IpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vbWFjcm9zIGZvciBhY2Nlc3NpbmcgZ2xvYmFsIGVnbCBpbmZvICYgdGxzIG9iamVjdHMKKworI2RlZmluZSBDVVJSRU5UX1RIUkVBRCgpIGRvIHt9IHdoaWxlICgwKTsKKworI2RlZmluZSBSRVRVUk5fRVJST1IocmV0LGVycikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1VSUkVOVF9USFJFQUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKHRsc190aHJlYWQtPmdldEVycm9yKCkgPT0gRUdMX1NVQ0NFU1MpIHsgICAgICAgICAgXAorICAgICAgICAgIHRsc190aHJlYWQtPnNldEVycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7CisKKyNkZWZpbmUgVkFMSURBVEVfRElTUExBWV9SRVRVUk4oRUdMRGlzcGxheSxyZXQpICAgICAgICAgICAgICBcCisgICAgICAgIEVnbERpc3BsYXkqIGRweSA9IGdfZWdsSW5mby0+Z2V0RGlzcGxheShFR0xEaXNwbGF5KTsgXAorICAgICAgICBpZighZHB5KXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJFVFVSTl9FUlJPUihyZXQsRUdMX0JBRF9ESVNQTEFZKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZighZHB5LT5pc0luaXRpYWxpemUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJFVFVSTl9FUlJPUihyZXQsRUdMX05PVF9JTklUSUFMSVpFRCk7ICAgICAgICAgICBcCisgICAgICAgIH0KKworI2RlZmluZSBWQUxJREFURV9DT05GSUdfUkVUVVJOKEVHTENvbmZpZyxyZXQpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRWdsQ29uZmlnKiBjZmcgPSBkcHktPmdldENvbmZpZyhFR0xDb25maWcpOyAgICAgICAgICBcCisgICAgICAgIGlmKCFjZmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkVUVVJOX0VSUk9SKHJldCxFR0xfQkFEX0NPTkZJRyk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZGVmaW5lIFZBTElEQVRFX1NVUkZBQ0VfUkVUVVJOKEVHTFN1cmZhY2UscmV0LHZhck5hbWUpICAgICAgXAorICAgICAgICBTdXJmYWNlUHRyIHZhck5hbWUgPSBkcHktPmdldFN1cmZhY2UoRUdMU3VyZmFjZSk7ICAgIFwKKyAgICAgICAgaWYoIXZhck5hbWUuZ2V0KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSRVRVUk5fRVJST1IocmV0LEVHTF9CQURfU1VSRkFDRSk7ICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyNkZWZpbmUgVkFMSURBVEVfQ09OVEVYVF9SRVRVUk4oRUdMQ29udGV4dCxyZXQpICAgICAgICAgICAgICBcCisgICAgICAgIENvbnRleHRQdHIgY3R4ID0gZHB5LT5nZXRDb250ZXh0KEVHTENvbnRleHQpOyAgICAgICAgXAorICAgICAgICBpZighY3R4LmdldCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJFVFVSTl9FUlJPUihyZXQsRUdMX0JBRF9DT05URVhUKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworCisjZGVmaW5lIFZBTElEQVRFX0RJU1BMQVkoRUdMRGlzcGxheSkgXAorICAgICAgICBWQUxJREFURV9ESVNQTEFZX1JFVFVSTihFR0xEaXNwbGF5LEVHTF9GQUxTRSkKKworI2RlZmluZSBWQUxJREFURV9DT05GSUcoRUdMQ29uZmlnKSAgIFwKKyAgICAgICAgVkFMSURBVEVfQ09ORklHX1JFVFVSTihFR0xDb25maWcsRUdMX0ZBTFNFKQorCisjZGVmaW5lIFZBTElEQVRFX1NVUkZBQ0UoRUdMU3VyZmFjZSx2YXJOYW1lKSBcCisgICAgICAgIFZBTElEQVRFX1NVUkZBQ0VfUkVUVVJOKEVHTFN1cmZhY2UsRUdMX0ZBTFNFLHZhck5hbWUpCisKKyNkZWZpbmUgVkFMSURBVEVfQ09OVEVYVChFR0xDb250ZXh0KSBcCisgICAgICAgIFZBTElEQVRFX0NPTlRFWFRfUkVUVVJOKEVHTENvbnRleHQsRUdMX0ZBTFNFKQorCisKK0dMRVNjb250ZXh0KiBnZXRHTEVTQ29udGV4dCgpCit7CisgICAgVGhyZWFkSW5mbyogdGhyZWFkICA9IGdldFRocmVhZEluZm8oKTsKKyAgICByZXR1cm4gdGhyZWFkLT5nbGVzQ29udGV4dDsKK30KKworR2xMaWJyYXJ5KiBnZXRHbExpYnJhcnkoKSB7CisgICAgcmV0dXJuIEVnbEdsb2JhbEluZm86OmdldEluc3RhbmNlKCktPmdldE9zRW5naW5lKCktPmdldEdsTGlicmFyeSgpOworfQorCitFR0xBUEkgRUdMaW50IEVHTEFQSUVOVFJZIGVnbEdldEVycm9yKHZvaWQpIHsKKyAgICBDVVJSRU5UX1RIUkVBRCgpOworICAgIEVHTGludCBlcnIgPSB0bHNfdGhyZWFkLT5nZXRFcnJvcigpOworICAgIHRsc190aHJlYWQtPnNldEVycm9yKEVHTF9TVUNDRVNTKTsKKyAgICByZXR1cm4gZXJyOworfQorCitFR0xBUEkgRUdMRGlzcGxheSBFR0xBUElFTlRSWSBlZ2xHZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXlfaWQpIHsKKyAgICBFZ2xEaXNwbGF5KiBkcHkgPSBOVUxMOworICAgIEVnbE9TOjpEaXNwbGF5KiBpbnRlcm5hbERpc3BsYXkgPSBOVUxMOworCisgICAgaW5pdEdsb2JhbEluZm8oKTsKKworICAgIGlmICgoZHB5ID0gZ19lZ2xJbmZvLT5nZXREaXNwbGF5KGRpc3BsYXlfaWQpKSkgeworICAgICAgICByZXR1cm4gZHB5OworICAgIH0KKyAgICBpZiAoZGlzcGxheV9pZCAhPSBFR0xfREVGQVVMVF9ESVNQTEFZKSB7CisgICAgICAgIHJldHVybiBFR0xfTk9fRElTUExBWTsKKyAgICB9CisgICAgaW50ZXJuYWxEaXNwbGF5ID0gZ19lZ2xJbmZvLT5nZXREZWZhdWx0TmF0aXZlRGlzcGxheSgpOworICAgIGRweSA9IGdfZWdsSW5mby0+YWRkRGlzcGxheShkaXNwbGF5X2lkLGludGVybmFsRGlzcGxheSk7CisgICAgaWYoIWRweSkgeworICAgICAgICByZXR1cm4gRUdMX05PX0RJU1BMQVk7CisgICAgfQorICAgIHJldHVybiBkcHk7Cit9CisKKworI2RlZmluZSBUUkFOU0xBVE9SX0dFVElGQUNFX05BTUUgIl9fdHJhbnNsYXRvcl9nZXRJZmFjZXMiCisKK3N0YXRpYyBfX3RyYW5zbGF0b3JfZ2V0R0xFU0lmYWNlRnVuYyBsb2FkSWZhY2VzKGNvbnN0IGNoYXIqIGxpYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlcnJvclNpemUpIHsKKyAgICBlbXVnbDo6U2hhcmVkTGlicmFyeSogbGliR0xFUyA9IGVtdWdsOjpTaGFyZWRMaWJyYXJ5OjpvcGVuKAorICAgICAgICAgICAgbGliTmFtZSwgZXJyb3IsIGVycm9yU2l6ZSk7CisgICAgaWYgKCFsaWJHTEVTKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfX3RyYW5zbGF0b3JfZ2V0R0xFU0lmYWNlRnVuYyBmdW5jID0gIChfX3RyYW5zbGF0b3JfZ2V0R0xFU0lmYWNlRnVuYykKKyAgICAgICAgICAgIGxpYkdMRVMtPmZpbmRTeW1ib2woVFJBTlNMQVRPUl9HRVRJRkFDRV9OQU1FKTsKKyAgICBpZiAoIWZ1bmMpIHsKKyAgICAgICAgc25wcmludGYoZXJyb3IsIGVycm9yU2l6ZSwgIk1pc3Npbmcgc3ltYm9sICVzIiwKKyAgICAgICAgICAgICAgICAgVFJBTlNMQVRPUl9HRVRJRkFDRV9OQU1FKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmdW5jOworfQorCisjZGVmaW5lIExJQl9HTEVTX0NNX05BTUUgRU1VR0xfTElCTkFNRSgiR0xFU19DTV90cmFuc2xhdG9yIikKKyNkZWZpbmUgTElCX0dMRVNfVjJfTkFNRSBFTVVHTF9MSUJOQU1FKCJHTEVTX1YyX3RyYW5zbGF0b3IiKQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcikgeworCisgICAgaW5pdEdsb2JhbEluZm8oKTsKKworICAgIEVnbERpc3BsYXkqIGRweSA9IGdfZWdsSW5mby0+Z2V0RGlzcGxheShkaXNwbGF5KTsKKyAgICBpZighZHB5KSB7CisgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfRElTUExBWSk7CisgICAgfQorCisgICAgaWYobWFqb3IpICptYWpvciA9IE1BSk9SOworICAgIGlmKG1pbm9yKSAqbWlub3IgPSBNSU5PUjsKKworICAgIF9fdHJhbnNsYXRvcl9nZXRHTEVTSWZhY2VGdW5jIGZ1bmMgID0gTlVMTDsKKyAgICBpbnQgcmVuZGVyYWJsZVR5cGUgPSBFR0xfT1BFTkdMX0VTX0JJVDsKKworICAgIGNoYXIgZXJyb3JbMjU2XTsKKyAgICBpZighZ19lZ2xJbmZvLT5nZXRJZmFjZShHTEVTXzFfMSkpIHsKKyAgICAgICAgZnVuYyAgPSBsb2FkSWZhY2VzKExJQl9HTEVTX0NNX05BTUUsIGVycm9yLCBzaXplb2YoZXJyb3IpKTsKKyAgICAgICAgaWYgKGZ1bmMpIHsKKyAgICAgICAgICAgIGdfZWdsSW5mby0+c2V0SWZhY2UoZnVuYygmc19lZ2xJZmFjZSksR0xFU18xXzEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgZmluZCBpZmFjZXMgZm9yIEdMRVMgQ00gMS4xIFslc11cbiIsCisgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnJvcik7CisgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaW5pdEdMRVN4KEdMRVNfMV8xKTsKKyAgICB9CisgICAgaWYoIWdfZWdsSW5mby0+Z2V0SWZhY2UoR0xFU18yXzApKSB7CisgICAgICAgIGZ1bmMgID0gbG9hZElmYWNlcyhMSUJfR0xFU19WMl9OQU1FLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgICAgIGlmIChmdW5jKSB7CisgICAgICAgICAgICByZW5kZXJhYmxlVHlwZSB8PSBFR0xfT1BFTkdMX0VTMl9CSVQ7CisgICAgICAgICAgICBnX2VnbEluZm8tPnNldElmYWNlKGZ1bmMoJnNfZWdsSWZhY2UpLEdMRVNfMl8wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogQ291bGQgbm90IGZpbmQgaWZhY2VzIGZvciBHTEVTIDIuMCBbJXNdXG4iLAorICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGluaXRHTEVTeChHTEVTXzJfMCk7CisgICAgfQorICAgIGRweS0+aW5pdGlhbGl6ZShyZW5kZXJhYmxlVHlwZSk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xUZXJtaW5hdGUoRUdMRGlzcGxheSBkaXNwbGF5KSB7CisgICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgICBkcHktPnRlcm1pbmF0ZSgpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQVBJIGNvbnN0IGNoYXIgKiBFR0xBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTGludCBuYW1lKSB7CisgICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogdmVuZG9yICAgICA9ICJHb29nbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uICAgID0gIjEuNCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSAiRUdMX0tIUl9pbWFnZV9iYXNlIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUdMX0FORFJPSURfcmVjb3JkYWJsZSAiOworICAgIGlmKCFFZ2xWYWxpZGF0ZTo6c3RyaW5nTmFtZShuYW1lKSkgeworICAgICAgICBSRVRVUk5fRVJST1IoTlVMTCxFR0xfQkFEX1BBUkFNRVRFUik7CisgICAgfQorICAgIHN3aXRjaChuYW1lKSB7CisgICAgY2FzZSBFR0xfVkVORE9SOgorICAgICAgICByZXR1cm4gdmVuZG9yOworICAgIGNhc2UgRUdMX1ZFUlNJT046CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIGNhc2UgRUdMX0VYVEVOU0lPTlM6CisgICAgICAgIHJldHVybiBleHRlbnNpb25zOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlncyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyAqY29uZmlncywKKyAgICAgICAgICAgICBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZykgeworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICAgaWYoIW51bV9jb25maWcpIHsKKyAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX1BBUkFNRVRFUik7CisgICAgfQorCisgICAgaWYoY29uZmlncyA9PSBOVUxMKSB7CisgICAgICAgICpudW1fY29uZmlnID0gZHB5LT5uQ29uZmlncygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpudW1fY29uZmlnID0gZHB5LT5nZXRDb25maWdzKGNvbmZpZ3MsY29uZmlnX3NpemUpOworICAgIH0KKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnKEVHTERpc3BsYXkgZGlzcGxheSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwKKyAgICAgICAgICAgICAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAorICAgICAgICAgICAgICAgRUdMaW50ICpudW1fY29uZmlnKSB7CisgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJlZ2xDaG9vc2VDb25maWc6IGJlZ2luLiB2YWxpZGF0aW5nIGFyZ3VtZW50cy4uLiIpOworCisgICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgICBpZighbnVtX2NvbmZpZykgeworICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJudW1fY29uZmlnIGlzIE5VTEwuIGlzc3VlIEVHTF9CQURfUEFSQU1FVEVSIik7CisgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfUEFSQU1FVEVSKTsKKyAgICB9CisKKyAgICAgICAgLy9zZWxlY3Rpb24gZGVmYXVsdHMKKyAgICAgICAgLy8gTk9URTogU29tZSB2YXJpYWJsZXMgYmVsb3cgYXJlIGNvbW1lbnRlZCBvdXQgdG8gcmVkdWNlIGNvbXBpbGVyIHdhcm5pbmdzLgorICAgICAgICAvLyBUT0RPKGRpZ2l0KTogTG9vayBpZiB0aGVzZSB2YXJpYWJsZXMgYXJlIHJlYWxseSBuZWVkZWQgb3Igbm90LCBhbmQgaWYgc28KKyAgICAgICAgLy8gZml4IHRoZSBjb2RlIHRvIGRvIGl0IHByb3Blcmx5LgorICAgICAgICBFR0xpbnQgICAgICBzdXJmYWNlX3R5cGUgICAgICAgPSBFR0xfV0lORE9XX0JJVDsKKyAgICAgICAgRUdMaW50ICAgICAgcmVuZGVyYWJsZV90eXBlICAgID0gRUdMX09QRU5HTF9FU19CSVQ7CisgICAgICAgIC8vRUdMQm9vbGVhbiAgYmluZF90b190ZXhfcmdiICAgID0gRUdMX0RPTlRfQ0FSRTsKKyAgICAgICAgLy9FR0xCb29sZWFuICBiaW5kX3RvX3RleF9yZ2JhICAgPSBFR0xfRE9OVF9DQVJFOworICAgICAgICBFR0xlbnVtICAgICBjYXZlYXQgICAgICAgICAgICAgPSBFR0xfRE9OVF9DQVJFOworICAgICAgICBFR0xpbnQgICAgICBjb25maWdfaWQgICAgICAgICAgPSBFR0xfRE9OVF9DQVJFOworICAgICAgICBFR0xCb29sZWFuICBuYXRpdmVfcmVuZGVyYWJsZSAgPSBFR0xfRE9OVF9DQVJFOworICAgICAgICBFR0xpbnQgICAgICBuYXRpdmVfdmlzdWFsX3R5cGUgPSBFR0xfRE9OVF9DQVJFOworICAgICAgICAvL0VHTGludCAgICAgIG1heF9zd2FwX2ludGVydmFsICA9IEVHTF9ET05UX0NBUkU7CisgICAgICAgIC8vRUdMaW50ICAgICAgbWluX3N3YXBfaW50ZXJ2YWwgID0gRUdMX0RPTlRfQ0FSRTsKKyAgICAgICAgRUdMaW50ICAgICAgdHJhbnNfcmVkX3ZhbCAgICAgID0gRUdMX0RPTlRfQ0FSRTsKKyAgICAgICAgRUdMaW50ICAgICAgdHJhbnNfZ3JlZW5fdmFsICAgID0gRUdMX0RPTlRfQ0FSRTsKKyAgICAgICAgRUdMaW50ICAgICAgdHJhbnNfYmx1ZV92YWwgICAgID0gRUdMX0RPTlRfQ0FSRTsKKyAgICAgICAgRUdMZW51bSAgICAgdHJhbnNwYXJlbnRfdHlwZSAgID0gRUdMX05PTkU7CisgICAgICAgIC8vIEVHTGludCAgICAgIGJ1ZmZlcl9zaXplICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIHJlZF9zaXplICAgICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGdyZWVuX3NpemUgICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGJsdWVfc2l6ZSAgICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGFscGhhX3NpemUgICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGRlcHRoX3NpemUgICAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGZyYW1lX2J1ZmZlcl9sZXZlbCA9IDA7CisgICAgICAgIEVHTGludCAgICAgIHNhbXBsZV9idWZmZXJzX251bSA9IDA7CisgICAgICAgIEVHTGludCAgICAgIHNhbXBsZXNfcGVyX3BpeGVsICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIHN0ZW5jaWxfc2l6ZSAgICAgICA9IDA7CisgICAgICAgIEVHTGludCAgICAgIGNvbmZvcm1hbnQgICAgICAgICA9IDA7CisKKyAgICAgICAgRUdMQm9vbGVhbiAgcmVjb3JkYWJsZV9hbmRyb2lkID0gRUdMX0ZBTFNFOworCisgICAgICAgIEVHTGludCBsdW1pbmFuY2Vfc2l6ZSA9IDA7CisgICAgICAgIEVHTGludCB3YW50ZWRfYnVmZmVyX3NpemUgPSBFR0xfRE9OVF9DQVJFOworCisgICAgICAgIHN0ZDo6dmVjdG9yPEVHTGludD4gd2FudGVkX2F0dHJpYnM7CisKKyAgICBpZighRWdsVmFsaWRhdGU6Om5vQXR0cmlicyhhdHRyaWJfbGlzdCkpIHsgLy90aGVyZSBhcmUgYXR0cmlicworICAgICAgICBpbnQgaSA9IDAgOworICAgICAgICBib29sIGhhc0NvbmZpZ0lkID0gZmFsc2U7CisgICAgICAgIHdoaWxlKGF0dHJpYl9saXN0W2ldICE9IEVHTF9OT05FICYmICFoYXNDb25maWdJZCkgeworI2RlZmluZSBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShhdHRybmFtZSkgXAorICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJFR0xfQkFEX0FUVFJJQlVURTogIiAjYXR0cm5hbWUgImRlZmluZWQgYXMgMHgleCIsIGF0dHJpYl9saXN0W2krMV0pOworICAgICAgICAgICAgc3dpdGNoKGF0dHJpYl9saXN0W2ldKSB7CisgICAgICAgICAgICBjYXNlIEVHTF9NQVhfUEJVRkZFUl9XSURUSDoKKyAgICAgICAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX0hFSUdIVDoKKyAgICAgICAgICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX1BJWEVMUzoKKyAgICAgICAgICAgIGNhc2UgRUdMX05BVElWRV9WSVNVQUxfSUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vd2UgZG9udCBjYXJlIGZyb20gdGhvc2Ugc2VsZWN0aW9uIGNyYXRlcmlhCisgICAgICAgICAgICBjYXNlIEVHTF9MRVZFTDoKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpKzFdID09IEVHTF9ET05UX0NBUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HX0JBRF9BVFRSSUJVVEUoRUdMX0xFVkVMKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYW1lX2J1ZmZlcl9sZXZlbCA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9MRVZFTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9CVUZGRVJfU0laRToKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpICsgMV0gIT0gRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9CVUZGRVJfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYnVmZmVyX3NpemUgPSBhdHRyaWJfbGlzdFtpICsgMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9SRURfU0laRToKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpKzFdIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfUkVEX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZF9zaXplID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1JFRF9TSVpFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0dSRUVOX1NJWkU6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HX0JBRF9BVFRSSUJVVEUoRUdMX0dSRUVOX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ3JlZW5fc2l6ZSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9HUkVFTl9TSVpFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0JMVUVfU0laRToKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpKzFdIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfQkxVRV9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJsdWVfc2l6ZSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9CTFVFX1NJWkUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFR0xfTFVNSU5BTkNFX1NJWkU6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSArIDFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfTFVNSU5BTkNFX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9MVU1JTkFOQ0VfU0laRSk7CisgICAgICAgICAgICAgICAgbHVtaW5hbmNlX3NpemUgPSBhdHRyaWJfbGlzdFtpICsgMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9BTFBIQV9TSVpFOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9BTFBIQV9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFscGhhX3NpemUgPSBhdHRyaWJfbGlzdFtpKzFdOworICAgICAgICAgICAgICAgIHdhbnRlZF9hdHRyaWJzLnB1c2hfYmFjayhFR0xfQUxQSEFfU0laRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9BTFBIQV9NQVNLX1NJWkU6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HX0JBRF9BVFRSSUJVVEUoRUdMX0FMUEhBX01BU0tfU0laRSk7CisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX0FMUEhBX01BU0tfU0laRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCOgorICAgICAgICAgICAgICAgIGlmIChhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfVFJVRSAmJgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfQklORF9UT19URVhUVVJFX1JHQik7CisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IpOworICAgICAgICAgICAgICAgIC8vYmluZF90b190ZXhfcmdiID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBOgorICAgICAgICAgICAgICAgIGlmIChhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfVFJVRSAmJgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfQklORF9UT19URVhUVVJFX1JHQkEpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSk7CisgICAgICAgICAgICAgICAgLy9iaW5kX3RvX3RleF9yZ2JhID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0NPTkZJR19DQVZFQVQ6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfTk9ORSAmJgorICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2krMV0gIT0gRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2krMV0gIT0gRUdMX1NMT1dfQ09ORklHICYmCisgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9DT05GSUdfQ0FWRUFUKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdmVhdCA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9DT05GSUdfQ0FWRUFUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0NPTkZPUk1BTlQ6CisgICAgICAgICAgICAgICAgY29uZm9ybWFudCA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9DT05GT1JNQU5UKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0NPTkZJR19JRDoKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpKzFdIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfQ09ORklHX0lEKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbmZpZ19pZCA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgaGFzQ29uZmlnSWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHdhbnRlZF9hdHRyaWJzLnB1c2hfYmFjayhFR0xfQ09ORklHX0lEKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX0RFUFRIX1NJWkU6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HX0JBRF9BVFRSSUJVVEUoRUdMX0RFUFRIX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVwdGhfc2l6ZSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9ERVBUSF9TSVpFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX01BWF9TV0FQX0lOVEVSVkFMOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gIT0gRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9NQVhfU1dBUF9JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL21heF9zd2FwX2ludGVydmFsID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX01BWF9TV0FQX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX01JTl9TV0FQX0lOVEVSVkFMOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gIT0gRUdMX0RPTlRfQ0FSRSAmJgorICAgICAgICAgICAgICAgICAgIGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9NSU5fU1dBUF9JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL21pbl9zd2FwX2ludGVydmFsID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX01JTl9TV0FQX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX05BVElWRV9SRU5ERVJBQkxFOgorICAgICAgICAgICAgICAgIGlmIChhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfVFJVRSAmJgorICAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfTkFUSVZFX1JFTkRFUkFCTEUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmF0aXZlX3JlbmRlcmFibGUgPSBhdHRyaWJfbGlzdFtpKzFdOworICAgICAgICAgICAgICAgIHdhbnRlZF9hdHRyaWJzLnB1c2hfYmFjayhFR0xfTkFUSVZFX1JFTkRFUkFCTEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFR0xfUkVOREVSQUJMRV9UWVBFOgorICAgICAgICAgICAgICAgIHJlbmRlcmFibGVfdHlwZSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9SRU5ERVJBQkxFX1RZUEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFOgorICAgICAgICAgICAgICAgIG5hdGl2ZV92aXN1YWxfdHlwZSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSA8IDAgfHwgYXR0cmliX2xpc3RbaSsxXSA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9OQVRJVkVfVklTVUFMX1RZUEUpOworICAgICAgICAgICAgY2FzZSBFR0xfU0FNUExFX0JVRkZFUlM6CisgICAgICAgICAgICAgICAgaWYoYXR0cmliX2xpc3RbaSsxXSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HX0JBRF9BVFRSSUJVVEUoRUdMX1NBTVBMRV9CVUZGRVJTKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNhbXBsZV9idWZmZXJzX251bSA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9TQU1QTEVfQlVGRkVSUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9TQU1QTEVTOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9TQU1QTEVTKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNhbXBsZXNfcGVyX3BpeGVsID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1NBTVBMRVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFR0xfU1RFTkNJTF9TSVpFOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9TVEVOQ0lMX1NJWkUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RlbmNpbF9zaXplID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1NURU5DSUxfU0laRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9TVVJGQUNFX1RZUEU6CisgICAgICAgICAgICAgICAgc3VyZmFjZV90eXBlID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1NVUkZBQ0VfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9UUkFOU1BBUkVOVF9UWVBFOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gIT0gRUdMX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9UUkFOU1BBUkVOVF9SR0IgKSB7CisgICAgICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPR19CQURfQVRUUklCVVRFKEVHTF9UUkFOU1BBUkVOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50X3R5cGUgPSBhdHRyaWJfbGlzdFtpKzFdOworICAgICAgICAgICAgICAgIHdhbnRlZF9hdHRyaWJzLnB1c2hfYmFjayhFR0xfVFJBTlNQQVJFTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUU6CisgICAgICAgICAgICAgICAgdHJhbnNfcmVkX3ZhbCA9IGF0dHJpYl9saXN0W2krMV07CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUU6CisgICAgICAgICAgICAgICAgdHJhbnNfZ3JlZW5fdmFsID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUU6CisgICAgICAgICAgICAgICAgdHJhbnNfYmx1ZV92YWwgPSBhdHRyaWJfbGlzdFtpKzFdOworICAgICAgICAgICAgICAgIHdhbnRlZF9hdHRyaWJzLnB1c2hfYmFjayhFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9DT0xPUl9CVUZGRVJfVFlQRToKKyAgICAgICAgICAgICAgICBpZihhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9ET05UX0NBUkUgJiYKKyAgICAgICAgICAgICAgICAgICBhdHRyaWJfbGlzdFtpKzFdICE9IEVHTF9SR0JfQlVGRkVSICYmCisgICAgICAgICAgICAgICAgICAgYXR0cmliX2xpc3RbaSsxXSAhPSBFR0xfTFVNSU5BTkNFX0JVRkZFUikgeworICAgICAgICAgICAgICAgICAgICBDSE9PU0VfQ09ORklHX0RMT0dfQkFEX0FUVFJJQlVURShFR0xfQ09MT1JfQlVGRkVSX1RZUEUpOworICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2FudGVkX2F0dHJpYnMucHVzaF9iYWNrKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9SRUNPUkRBQkxFX0FORFJPSUQ6CisgICAgICAgICAgICAgICAgcmVjb3JkYWJsZV9hbmRyb2lkID0gYXR0cmliX2xpc3RbaSsxXTsKKyAgICAgICAgICAgICAgICB3YW50ZWRfYXR0cmlicy5wdXNoX2JhY2soRUdMX1JFQ09SREFCTEVfQU5EUk9JRCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVHTF9GUkFNRUJVRkZFUl9UQVJHRVRfQU5EUk9JRDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJFR0xfQkFEX0FUVFJJQlVURTogVW5rbm93biBhdHRyaWJ1dGUga2V5IDB4JXgiLCBhdHRyaWJfbGlzdFtpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKz0yOworICAgICAgICB9CisgICAgICAgIGlmKGhhc0NvbmZpZ0lkKSB7CisgICAgICAgICAgICBFZ2xDb25maWcqIHBDb25maWcgPSBkcHktPmdldENvbmZpZyhjb25maWdfaWQpOworICAgICAgICAgICAgaWYocENvbmZpZykgeworICAgICAgICAgICAgICAgIGlmKGNvbmZpZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnc1swXSAgPSBzdGF0aWNfY2FzdDxFR0xDb25maWc+KHBDb25maWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqbnVtX2NvbmZpZyA9IDE7CisgICAgICAgICAgICAgICAgQ0hPT1NFX0NPTkZJR19ETE9HKCJVc2luZyBjb25maWcgaWQgMHgleC4gUmV0dXJuIEVHTF9UUlVFIiwgY29uZmlnX2lkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIENIT09TRV9DT05GSUdfRExPRygiRUdMX0JBRF9BVFRSSUJVVEU6IFVzaW5nIG1pc3NpbmcgY29uZmlnIGlkIDB4JXgiLCBjb25maWdfaWQpOworICAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEVnbENvbmZpZyBkdW1teShyZWRfc2l6ZSxncmVlbl9zaXplLGJsdWVfc2l6ZSxhbHBoYV9zaXplLGNhdmVhdCxjb25mb3JtYW50LGNvbmZpZ19pZCxkZXB0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICBmcmFtZV9idWZmZXJfbGV2ZWwsMCwwLDAsbmF0aXZlX3JlbmRlcmFibGUscmVuZGVyYWJsZV90eXBlLDAsbmF0aXZlX3Zpc3VhbF90eXBlLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVfYnVmZmVyc19udW0sIHNhbXBsZXNfcGVyX3BpeGVsLHN0ZW5jaWxfc2l6ZSxsdW1pbmFuY2Vfc2l6ZSx3YW50ZWRfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfdHlwZSx0cmFuc3BhcmVudF90eXBlLHRyYW5zX3JlZF92YWwsdHJhbnNfZ3JlZW5fdmFsLHRyYW5zX2JsdWVfdmFsLHJlY29yZGFibGVfYW5kcm9pZCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3YW50ZWRfYXR0cmlicy5zaXplKCk7IGkrKykgeworICAgICAgICBkdW1teS5hZGRXYW50ZWRBdHRyaWIod2FudGVkX2F0dHJpYnNbaV0pOworICAgIH0KKyAgICAqbnVtX2NvbmZpZyA9IGRweS0+Y2hvb3NlQ29uZmlncyhkdW1teSxjb25maWdzLGNvbmZpZ19zaXplKTsKKyAgICBDSE9PU0VfQ09ORklHX0RMT0coImVnbENob29zZUNvbmZpZzogU3VjY2VzcyhFR0xfVFJVRSkuIE51bSBjb25maWdzIHJldHVybmVkOiVkIiwgKm51bV9jb25maWcpOworCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRDb25maWdBdHRyaWIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkgeworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICAgVkFMSURBVEVfQ09ORklHKGNvbmZpZyk7CisgICAgaWYoIUVnbFZhbGlkYXRlOjpjb25mQXR0cmliKGF0dHJpYnV0ZSkpeworICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgfQorICAgIHJldHVybiBjZmctPmdldENvbmZBdHRyaWIoYXR0cmlidXRlLHZhbHVlKT8gRUdMX1RSVUU6RUdMX0ZBTFNFOworfQorCitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luLAorICAgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkgeworICAgIFZBTElEQVRFX0RJU1BMQVlfUkVUVVJOKGRpc3BsYXksRUdMX05PX1NVUkZBQ0UpOworICAgIFZBTElEQVRFX0NPTkZJR19SRVRVUk4oY29uZmlnLEVHTF9OT19TVVJGQUNFKTsKKworICAgIGlmKCEoY2ZnLT5zdXJmYWNlVHlwZSgpICYgRUdMX1dJTkRPV19CSVQpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfTk9fU1VSRkFDRSxFR0xfQkFEX01BVENIKTsKKyAgICB9CisgICAgaWYoIWRweS0+bmF0aXZlVHlwZSgpLT5pc1ZhbGlkTmF0aXZlV2luKHdpbikpIHsKKyAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9OT19TVVJGQUNFLEVHTF9CQURfTkFUSVZFX1dJTkRPVyk7CisgICAgfQorICAgIGlmKCFFZ2xWYWxpZGF0ZTo6bm9BdHRyaWJzKGF0dHJpYl9saXN0KSkgeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgIH0KKyAgICBpZihFZ2xXaW5kb3dTdXJmYWNlOjphbHJlYWR5QXNzb2NpYXRlZFdpdGhDb25maWcod2luKSkgeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9BTExPQyk7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IHdpZHRoLGhlaWdodDsKKyAgICBpZighZHB5LT5uYXRpdmVUeXBlKCktPmNoZWNrV2luZG93UGl4ZWxGb3JtYXRNYXRjaCgKKyAgICAgICAgICAgIHdpbiwgY2ZnLT5uYXRpdmVGb3JtYXQoKSwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9BTExPQyk7CisgICAgfQorICAgIFN1cmZhY2VQdHIgd1N1cmZhY2UobmV3IEVnbFdpbmRvd1N1cmZhY2UoZHB5LCB3aW4sY2ZnLHdpZHRoLGhlaWdodCkpOworICAgIGlmKCF3U3VyZmFjZS5nZXQoKSkgeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9BTExPQyk7CisgICAgfQorICAgIHJldHVybiBkcHktPmFkZFN1cmZhY2Uod1N1cmZhY2UpOworfQorCitFR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSgKKyAgICAgICAgRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICBFR0xDb25maWcgY29uZmlnLAorICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KSB7CisgICAgVkFMSURBVEVfRElTUExBWV9SRVRVUk4oZGlzcGxheSxFR0xfTk9fU1VSRkFDRSk7CisgICAgVkFMSURBVEVfQ09ORklHX1JFVFVSTihjb25maWcsRUdMX05PX1NVUkZBQ0UpOworICAgIGlmKCEoY2ZnLT5zdXJmYWNlVHlwZSgpICYgRUdMX1BCVUZGRVJfQklUKSkgeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9NQVRDSCk7CisgICAgfQorCisgICAgU3VyZmFjZVB0ciBwYlN1cmZhY2UobmV3IEVnbFBidWZmZXJTdXJmYWNlKGRweSxjZmcpKTsKKyAgICBpZighcGJTdXJmYWNlLmdldCgpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfTk9fU1VSRkFDRSxFR0xfQkFEX0FMTE9DKTsKKyAgICB9CisKKyAgICBpZighRWdsVmFsaWRhdGU6Om5vQXR0cmlicyhhdHRyaWJfbGlzdCkpIHsgLy8gVGhlcmUgYXJlIGF0dHJpYnMuCisgICAgICAgIGludCBpID0gMCA7CisgICAgICAgIHdoaWxlKGF0dHJpYl9saXN0W2ldICE9IEVHTF9OT05FKSB7CisgICAgICAgICAgICBpZighcGJTdXJmYWNlLT5zZXRBdHRyaWIoYXR0cmliX2xpc3RbaV0sYXR0cmliX2xpc3RbaSsxXSkpIHsKKyAgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX05PX1NVUkZBQ0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSs9MjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEVHTGludCB3aWR0aCwgaGVpZ2h0LCBsYXJnZXN0LCB0ZXhUYXJnZXQsIHRleEZvcm1hdDsKKyAgICBFZ2xQYnVmZmVyU3VyZmFjZSogdG1wUGJTdXJmYWNlUHRyID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVnbFBidWZmZXJTdXJmYWNlKj4ocGJTdXJmYWNlLmdldCgpKTsKKworICAgIHRtcFBiU3VyZmFjZVB0ci0+Z2V0RGltKCZ3aWR0aCwgJmhlaWdodCwgJmxhcmdlc3QpOworICAgIHRtcFBiU3VyZmFjZVB0ci0+Z2V0VGV4SW5mbygmdGV4VGFyZ2V0LCAmdGV4Rm9ybWF0KTsKKworICAgIGlmKCFFZ2xWYWxpZGF0ZTo6cGJ1ZmZlckF0dHJpYnMod2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhGb3JtYXQgPT0gRUdMX05PX1RFWFRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhUYXJnZXQgPT0gRUdMX05PX1RFWFRVUkUpKSB7CisgICAgICAgIC8vVE9ETzogUkVUVVJOX0VSUk9SKEVHTF9OT19TVVJGQUNFLEVHTF9CQURfVkFMVUUpOyBkb250IGhhdmUgYmFkX3ZhbHVlCisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfTk9fU1VSRkFDRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgfQorCisgICAgRWdsT1M6OlBidWZmZXJJbmZvIHBiaW5mbzsKKworICAgIHBiaW5mby53aWR0aCA9IHdpZHRoOworICAgIHBiaW5mby5oZWlnaHQgPSBoZWlnaHQ7CisgICAgcGJpbmZvLmxhcmdlc3QgPSBsYXJnZXN0OworICAgIHBiaW5mby50YXJnZXQgPSB0ZXhUYXJnZXQ7CisgICAgcGJpbmZvLmZvcm1hdCA9IHRleEZvcm1hdDsKKworICAgIHRtcFBiU3VyZmFjZVB0ci0+Z2V0QXR0cmliKEVHTF9NSVBNQVBfVEVYVFVSRSwgJnBiaW5mby5oYXNNaXBtYXApOworCisgICAgRWdsT1M6OlN1cmZhY2UqIHBiID0gZHB5LT5uYXRpdmVUeXBlKCktPmNyZWF0ZVBidWZmZXJTdXJmYWNlKAorICAgICAgICAgICAgY2ZnLT5uYXRpdmVGb3JtYXQoKSwgJnBiaW5mbyk7CisgICAgaWYoIXBiKSB7CisgICAgICAgIC8vVE9ETzogUkVUVVJOX0VSUk9SKEVHTF9OT19TVVJGQUNFLEVHTF9CQURfVkFMVUUpOyBkb250IGhhdmUgYmFkIHZhbHVlCisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfTk9fU1VSRkFDRSxFR0xfQkFEX0FUVFJJQlVURSk7CisgICAgfQorCisgICAgdG1wUGJTdXJmYWNlUHRyLT5zZXROYXRpdmVQYnVmZmVyKHBiKTsKKyAgICByZXR1cm4gZHB5LT5hZGRTdXJmYWNlKHBiU3VyZmFjZSk7Cit9CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKSB7CisgICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgICBTdXJmYWNlUHRyIHNyZmMgPSBkcHktPmdldFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgaWYoIXNyZmMuZ2V0KCkpIHsKKyAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9GQUxTRSxFR0xfQkFEX1NVUkZBQ0UpOworICAgIH0KKworICAgIGRweS0+cmVtb3ZlU3VyZmFjZShzdXJmYWNlKTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKKyAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpIHsKKyAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICBWQUxJREFURV9TVVJGQUNFKHN1cmZhY2Usc3JmYyk7CisKKyAgIGlmKCFzcmZjLT5nZXRBdHRyaWIoYXR0cmlidXRlLHZhbHVlKSkgeworICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgfQorICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTdXJmYWNlQXR0cmliKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlLAorICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCB2YWx1ZSkgeworICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgIFZBTElEQVRFX1NVUkZBQ0Uoc3VyZmFjZSxzcmZjKTsKKyAgIGlmKCFzcmZjLT5zZXRBdHRyaWIoYXR0cmlidXRlLHZhbHVlKSkgeworICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BVFRSSUJVVEUpOworICAgfQorICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICBFR0xDb250ZXh0IHNoYXJlX2NvbnRleHQsCisgICAgICAgICAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkgeworICAgIFZBTElEQVRFX0RJU1BMQVlfUkVUVVJOKGRpc3BsYXksRUdMX05PX0NPTlRFWFQpOworICAgIFZBTElEQVRFX0NPTkZJR19SRVRVUk4oY29uZmlnLEVHTF9OT19DT05URVhUKTsKKworICAgIEdMRVNWZXJzaW9uIHZlcnNpb24gPSBHTEVTXzFfMTsKKyAgICBpZighRWdsVmFsaWRhdGU6Om5vQXR0cmlicyhhdHRyaWJfbGlzdCkpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZShhdHRyaWJfbGlzdFtpXSAhPSBFR0xfTk9ORSkgeworICAgICAgICAgICAgc3dpdGNoKGF0dHJpYl9saXN0W2ldKSB7CisgICAgICAgICAgICBjYXNlIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OOgorICAgICAgICAgICAgICAgIGlmKGF0dHJpYl9saXN0W2krMV0gPT0gMikgeworICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gR0xFU18yXzA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IEdMRVNfMV8xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9OT19DT05URVhULEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrPTI7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgR0xFU2lmYWNlKiBpZmFjZSA9IGdfZWdsSW5mby0+Z2V0SWZhY2UodmVyc2lvbik7CisgICAgR0xFU2NvbnRleHQqIGdsZXNDdHggPSBOVUxMOworICAgIGlmKGlmYWNlKSB7CisgICAgICAgIGdsZXNDdHggPSBpZmFjZS0+Y3JlYXRlR0xFU0NvbnRleHQoKTsKKyAgICB9IGVsc2UgeyAvLyB0aGVyZSBpcyBubyBpbnRlcmZhY2UgZm9yIHRoaXMgZ2xlcyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9OT19DT05URVhULEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICB9CisKKyAgICBDb250ZXh0UHRyIHNoYXJlZEN0eFB0cjsKKyAgICBpZihzaGFyZV9jb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHNoYXJlZEN0eFB0ciA9IGRweS0+Z2V0Q29udGV4dChzaGFyZV9jb250ZXh0KTsKKyAgICAgICAgaWYoIXNoYXJlZEN0eFB0ci5nZXQoKSkgeworICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9OT19DT05URVhULEVHTF9CQURfQ09OVEVYVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFZ2xPUzo6Q29udGV4dCogZ2xvYmFsU2hhcmVkQ29udGV4dCA9IGRweS0+Z2V0R2xvYmFsU2hhcmVkQ29udGV4dCgpOworICAgIEVnbE9TOjpDb250ZXh0KiBuYXRpdmVDb250ZXh0ID0gZHB5LT5uYXRpdmVUeXBlKCktPmNyZWF0ZUNvbnRleHQoCisgICAgICAgICAgICBjZmctPm5hdGl2ZUZvcm1hdCgpLCBnbG9iYWxTaGFyZWRDb250ZXh0KTsKKworICAgIGlmKG5hdGl2ZUNvbnRleHQpIHsKKyAgICAgICAgQ29udGV4dFB0ciBjdHgobmV3IEVnbENvbnRleHQoZHB5LCBuYXRpdmVDb250ZXh0LHNoYXJlZEN0eFB0cixjZmcsZ2xlc0N0eCx2ZXJzaW9uLGRweS0+Z2V0TWFuYWdlcih2ZXJzaW9uKSkpOworICAgICAgICByZXR1cm4gZHB5LT5hZGRDb250ZXh0KGN0eCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWZhY2UtPmRlbGV0ZUdMRVNDb250ZXh0KGdsZXNDdHgpOworICAgIH0KKworcmV0dXJuIEVHTF9OT19DT05URVhUOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95Q29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgeworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICAgVkFMSURBVEVfQ09OVEVYVChjb250ZXh0KTsKKworICAgIGRweS0+cmVtb3ZlQ29udGV4dChjb250ZXh0KTsKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50KEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgZHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCkgeworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisKKyAgICBib29sIHJlbGVhc2VDb250ZXh0ID0gRWdsVmFsaWRhdGU6OnJlbGVhc2VDb250ZXh0KGNvbnRleHQsIHJlYWQsIGRyYXcpOworICAgIGlmKCFyZWxlYXNlQ29udGV4dCAmJiBFZ2xWYWxpZGF0ZTo6YmFkQ29udGV4dE1hdGNoKGNvbnRleHQsIHJlYWQsIGRyYXcpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsIEVHTF9CQURfTUFUQ0gpOworICAgIH0KKworICAgIFRocmVhZEluZm8qIHRocmVhZCA9IGdldFRocmVhZEluZm8oKTsKKyAgICBDb250ZXh0UHRyIHByZXZDdHggPSB0aHJlYWQtPmVnbENvbnRleHQ7CisKKyAgICBpZihyZWxlYXNlQ29udGV4dCkgeyAvL3JlbGVhc2luZyBjdXJyZW50IGNvbnRleHQKKyAgICAgICBpZihwcmV2Q3R4LmdldCgpKSB7CisgICAgICAgICAgIGdfZWdsSW5mby0+Z2V0SWZhY2UocHJldkN0eC0+dmVyc2lvbigpKS0+Zmx1c2goKTsKKyAgICAgICAgICAgaWYoIWRweS0+bmF0aXZlVHlwZSgpLT5tYWtlQ3VycmVudChOVUxMLE5VTEwsTlVMTCkpIHsKKyAgICAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9BQ0NFU1MpOworICAgICAgICAgICB9CisgICAgICAgICAgIHRocmVhZC0+dXBkYXRlSW5mbyhDb250ZXh0UHRyKCksZHB5LE5VTEwsU2hhcmVHcm91cFB0cigpLGRweS0+Z2V0TWFuYWdlcihwcmV2Q3R4LT52ZXJzaW9uKCkpKTsKKyAgICAgICB9CisgICAgfSBlbHNlIHsgLy9hc3NpbmluZyBuZXcgY29udGV4dAorICAgICAgICBWQUxJREFURV9DT05URVhUKGNvbnRleHQpOworICAgICAgICBWQUxJREFURV9TVVJGQUNFKGRyYXcsbmV3RHJhd1NyZmMpOworICAgICAgICBWQUxJREFURV9TVVJGQUNFKHJlYWQsbmV3UmVhZFNyZmMpOworCisgICAgICAgIEVnbFN1cmZhY2UqIG5ld0RyYXdQdHIgPSBuZXdEcmF3U3JmYy5nZXQoKTsKKyAgICAgICAgRWdsU3VyZmFjZSogbmV3UmVhZFB0ciA9IG5ld1JlYWRTcmZjLmdldCgpOworICAgICAgICBDb250ZXh0UHRyICBuZXdDdHggICAgID0gY3R4OworCisgICAgICAgIGlmIChuZXdDdHguZ2V0KCkgJiYgcHJldkN0eC5nZXQoKSkgeworICAgICAgICAgICAgaWYgKG5ld0N0eC5nZXQoKSA9PSBwcmV2Q3R4LmdldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG5ld0RyYXdQdHIgPT0gcHJldkN0eC0+ZHJhdygpLmdldCgpICYmCisgICAgICAgICAgICAgICAgICAgIG5ld1JlYWRQdHIgPT0gcHJldkN0eC0+cmVhZCgpLmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcmV2aW91cyBjb250ZXh0IGlzIGRldGFjaGVkIGZyb20gc3VyZmFjZXMKKyAgICAgICAgICAgICAgICByZWxlYXNlQ29udGV4dCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3N1cmZhY2VzIGNvbXBhdGliaWxpdHkgY2hlY2sKKyAgICAgICAgaWYoISgoKmN0eC0+Z2V0Q29uZmlnKCkpLmNvbXBhdGlibGVXaXRoKCgqbmV3RHJhd1B0ci0+Z2V0Q29uZmlnKCkpKSkgfHwKKyAgICAgICAgICAgISgoKmN0eC0+Z2V0Q29uZmlnKCkpLmNvbXBhdGlibGVXaXRoKCgqbmV3UmVhZFB0ci0+Z2V0Q29uZmlnKCkpKSkpIHsKKyAgICAgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9NQVRDSCk7CisgICAgICAgIH0KKworICAgICAgICAgRWdsT1M6OkRpc3BsYXkqIG5hdGl2ZURpc3BsYXkgPSBkcHktPm5hdGl2ZVR5cGUoKTsKKyAgICAgICAgIEVnbE9TOjpTdXJmYWNlKiBuYXRpdmVSZWFkID0gbmV3UmVhZFB0ci0+bmF0aXZlKCk7CisgICAgICAgICBFZ2xPUzo6U3VyZmFjZSogbmF0aXZlRHJhdyA9IG5ld0RyYXdQdHItPm5hdGl2ZSgpOworICAgICAgICAvL2NoZWNraW5nIG5hdGl2ZSB3aW5kb3cgdmFsaWRpdHkKKyAgICAgICAgaWYobmV3UmVhZFB0ci0+dHlwZSgpID09IEVnbFN1cmZhY2U6OldJTkRPVyAmJgorICAgICAgICAgICAgICAgICFuYXRpdmVEaXNwbGF5LT5pc1ZhbGlkTmF0aXZlV2luKG5hdGl2ZVJlYWQpKSB7CisgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfTkFUSVZFX1dJTkRPVyk7CisgICAgICAgIH0KKyAgICAgICAgaWYobmV3RHJhd1B0ci0+dHlwZSgpID09IEVnbFN1cmZhY2U6OldJTkRPVyAmJgorICAgICAgICAgICAgICAgICFuYXRpdmVEaXNwbGF5LT5pc1ZhbGlkTmF0aXZlV2luKG5hdGl2ZURyYXcpKSB7CisgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfTkFUSVZFX1dJTkRPVyk7CisgICAgICAgIH0KKworICAgICAgICBpZihwcmV2Q3R4LmdldCgpKSB7CisgICAgICAgICAgICBnX2VnbEluZm8tPmdldElmYWNlKHByZXZDdHgtPnZlcnNpb24oKSktPmZsdXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkcHktPm5hdGl2ZVR5cGUoKS0+bWFrZUN1cnJlbnQoCisgICAgICAgICAgICAgICAgbmV3UmVhZFB0ci0+bmF0aXZlKCksCisgICAgICAgICAgICAgICAgbmV3RHJhd1B0ci0+bmF0aXZlKCksCisgICAgICAgICAgICAgICAgbmV3Q3R4LT5uYXRpdmVUeXBlKCkpKSB7CisgICAgICAgICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQUNDRVNTKTsKKyAgICAgICAgfQorICAgICAgICAvL1RPRE86IGhhbmRsZSB0aGUgZm9sbG93aW5nIGVycm9ycworICAgICAgICAvLyBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSAsIEVHTF9DT05URVhUX0xPU1QgICwgRUdMX0JBRF9BQ0NFU1MKKworICAgICAgICB0aHJlYWQtPnVwZGF0ZUluZm8obmV3Q3R4LGRweSxuZXdDdHgtPmdldEdsZXNDb250ZXh0KCksbmV3Q3R4LT5nZXRTaGFyZUdyb3VwKCksZHB5LT5nZXRNYW5hZ2VyKG5ld0N0eC0+dmVyc2lvbigpKSk7CisgICAgICAgIG5ld0N0eC0+c2V0U3VyZmFjZXMobmV3UmVhZFNyZmMsbmV3RHJhd1NyZmMpOworICAgICAgICBnX2VnbEluZm8tPmdldElmYWNlKG5ld0N0eC0+dmVyc2lvbigpKS0+aW5pdENvbnRleHQobmV3Q3R4LT5nZXRHbGVzQ29udGV4dCgpLG5ld0N0eC0+Z2V0U2hhcmVHcm91cCgpKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBHTEVTIGV4dGVuc2lvbiBmdW5jdGlvbiB0YWJsZSB1c2VkIGluCisgICAgICAgIC8vIGVnbEdldFByb2NBZGRyZXNzIGZvciB0aGUgY29udGV4dCdzIEdMRVMgdmVyc2lvbiBpZiBub3QKKyAgICAgICAgLy8geWV0IGluaXRpYWxpemVkLiBXZSBpbml0aWFsaXplIGl0IGhlcmUgdG8gbWFrZSBzdXJlIHdlIGNhbGwgdGhlCisgICAgICAgIC8vIEdMRVMgZ2V0UHJvY0FkZHJlc3MgYWZ0ZXIgd2hlbiBhIGNvbnRleHQgaXMgYm91bmQuCisgICAgICAgIGdfZWdsSW5mby0+aW5pdENsaWVudEV4dEZ1bmNUYWJsZShuZXdDdHgtPnZlcnNpb24oKSk7CisgICAgfQorCisgICAgLy8gcmVsZWFzZSBwcmV2aW91cyBjb250ZXh0IHN1cmZhY2UgYmluZGluZworICAgIGlmKHByZXZDdHguZ2V0KCkgJiYgcmVsZWFzZUNvbnRleHQpIHsKKyAgICAgICAgcHJldkN0eC0+c2V0U3VyZmFjZXMoU3VyZmFjZVB0cigpLFN1cmZhY2VQdHIoKSk7CisgICAgfQorCisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKSB7CisgICAgVkFMSURBVEVfRElTUExBWShkaXNwbGF5KTsKKyAgICBWQUxJREFURV9DT05URVhUKGNvbnRleHQpOworCisgICAgaWYoIWN0eC0+Z2V0QXR0cmliKGF0dHJpYnV0ZSx2YWx1ZSkpeworICAgICAgICBSRVRVUk5fRVJST1IoRUdMX0ZBTFNFLEVHTF9CQURfQVRUUklCVVRFKTsKKyAgICB9CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSkgeworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICAgVkFMSURBVEVfU1VSRkFDRShzdXJmYWNlLFNyZmMpOworICAgIFRocmVhZEluZm8qIHRocmVhZCAgICAgICAgPSBnZXRUaHJlYWRJbmZvKCk7CisgICAgQ29udGV4dFB0ciBjdXJyZW50Q3R4ICAgID0gdGhyZWFkLT5lZ2xDb250ZXh0OworCisKKyAgICAvL2lmIHN1cmZhY2Ugbm90IHdpbmRvdyByZXR1cm4KKyAgICBpZihTcmZjLT50eXBlKCkgIT0gRWdsU3VyZmFjZTo6V0lORE9XKXsKKyAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9UUlVFLEVHTF9TVUNDRVNTKTsKKyAgICB9CisKKyAgICBpZighY3VycmVudEN0eC5nZXQoKSB8fCAhY3VycmVudEN0eC0+dXNpbmdTdXJmYWNlKFNyZmMpIHx8CisgICAgICAgICAgICAhZHB5LT5uYXRpdmVUeXBlKCktPmlzVmFsaWROYXRpdmVXaW4oU3JmYy5nZXQoKS0+bmF0aXZlKCkpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9TVVJGQUNFKTsKKyAgICB9CisKKyAgICBkcHktPm5hdGl2ZVR5cGUoKS0+c3dhcEJ1ZmZlcnMoU3JmYy0+bmF0aXZlKCkpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQVBJIEVHTENvbnRleHQgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCkgeworICAgIFRocmVhZEluZm8qIHRocmVhZCA9IGdldFRocmVhZEluZm8oKTsKKyAgICBFZ2xEaXNwbGF5KiBkcHkgICAgPSBzdGF0aWNfY2FzdDxFZ2xEaXNwbGF5Kj4odGhyZWFkLT5lZ2xEaXNwbGF5KTsKKyAgICBDb250ZXh0UHRyICBjdHggICAgPSB0aHJlYWQtPmVnbENvbnRleHQ7CisgICAgaWYoZHB5ICYmIGN0eC5nZXQoKSl7CisgICAgICAgIC8vIFRoaXMgZG91YmxlIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgYSBjb250ZXh0IG1pZ2h0IHN0aWxsIGJlIGN1cnJlbnQgYWZ0ZXIgaXQgaXMgZGVzdHJveWVkIC0gaW4gd2hpY2ggY2FzZQorICAgICAgICAvLyBpdHMgaGFuZGxlIHNob3VsZCBiZSBpbnZhbGlkLCB0aGF0IGlzIEVHTF9OT19DT05URVhUIHNob3VsZCBiZSByZXR1cm5lZCBldmVuIHRob3VnaCB0aGUgY29udGV4dCBpcyBjdXJyZW50CisgICAgICAgIEVHTENvbnRleHQgYyA9IChFR0xDb250ZXh0KVNhZmVQb2ludGVyRnJvbVVJbnQoY3R4LT5nZXRIbmRsKCkpOworICAgICAgICBpZihkcHktPmdldENvbnRleHQoYykuZ2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBFR0xfTk9fQ09OVEVYVDsKK30KKworRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMaW50IHJlYWRkcmF3KSB7CisgICAgaWYgKCFFZ2xWYWxpZGF0ZTo6c3VyZmFjZVRhcmdldChyZWFkZHJhdykpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOworICAgIH0KKworICAgIFRocmVhZEluZm8qIHRocmVhZCA9IGdldFRocmVhZEluZm8oKTsKKyAgICBFZ2xEaXNwbGF5KiBkcHkgICAgPSBzdGF0aWNfY2FzdDxFZ2xEaXNwbGF5Kj4odGhyZWFkLT5lZ2xEaXNwbGF5KTsKKyAgICBDb250ZXh0UHRyICBjdHggICAgPSB0aHJlYWQtPmVnbENvbnRleHQ7CisKKyAgICBpZihkcHkgJiYgY3R4LmdldCgpKSB7CisgICAgICAgIFN1cmZhY2VQdHIgc3VyZmFjZSA9IHJlYWRkcmF3ID09IEVHTF9SRUFEID8gY3R4LT5yZWFkKCkgOiBjdHgtPmRyYXcoKTsKKyAgICAgICAgaWYoc3VyZmFjZS5nZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBkb3VibGUgY2hlY2sgaXMgcmVxdWlyZWQgYmVjYXVzZSBhIHN1cmZhY2UgbWlnaHQgc3RpbGwgYmUKKyAgICAgICAgICAgIC8vIGN1cnJlbnQgYWZ0ZXIgaXQgaXMgZGVzdHJveWVkIC0gaW4gd2hpY2ggY2FzZSBpdHMgaGFuZGxlIHNob3VsZAorICAgICAgICAgICAgLy8gYmUgaW52YWxpZCwgdGhhdCBpcyBFR0xfTk9fU1VSRkFDRSBzaG91bGQgYmUgcmV0dXJuZWQgZXZlbgorICAgICAgICAgICAgLy8gdGhvdWdoIHRoZSBzdXJmYWNlIGlzIGN1cnJlbnQuCisgICAgICAgICAgICBFR0xTdXJmYWNlIHMgPSAoRUdMU3VyZmFjZSlTYWZlUG9pbnRlckZyb21VSW50KHN1cmZhY2UtPmdldEhuZGwoKSk7CisgICAgICAgICAgICBzdXJmYWNlID0gZHB5LT5nZXRTdXJmYWNlKHMpOworICAgICAgICAgICAgaWYoc3VyZmFjZS5nZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Cit9CisKK0VHTEFQSSBFR0xEaXNwbGF5IEVHTEFQSUVOVFJZIGVnbEdldEN1cnJlbnREaXNwbGF5KHZvaWQpIHsKKyAgICBUaHJlYWRJbmZvKiB0aHJlYWQgPSBnZXRUaHJlYWRJbmZvKCk7CisgICAgcmV0dXJuICh0aHJlYWQtPmVnbENvbnRleHQuZ2V0KCkpID8gdGhyZWFkLT5lZ2xEaXNwbGF5IDogRUdMX05PX0RJU1BMQVk7Cit9CisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEJpbmRBUEkoRUdMZW51bSBhcGkpIHsKKyAgICBpZighRWdsVmFsaWRhdGU6OnN1cHBvcnRlZEFwaShhcGkpKSB7CisgICAgICAgIFJFVFVSTl9FUlJPUihFR0xfRkFMU0UsRUdMX0JBRF9QQVJBTUVURVIpOworICAgIH0KKyAgICBDVVJSRU5UX1RIUkVBRCgpOworICAgIHRsc190aHJlYWQtPnNldEFwaShhcGkpOworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworRUdMQVBJIEVHTGVudW0gRUdMQVBJRU5UUlkgZWdsUXVlcnlBUEkodm9pZCkgeworICAgIENVUlJFTlRfVEhSRUFEKCk7CisgICAgcmV0dXJuIHRsc190aHJlYWQtPmdldEFwaSgpOworfQorCitFR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xSZWxlYXNlVGhyZWFkKHZvaWQpIHsKKyAgICBUaHJlYWRJbmZvKiB0aHJlYWQgID0gZ2V0VGhyZWFkSW5mbygpOworICAgIEVnbERpc3BsYXkqIGRweSAgICAgPSBzdGF0aWNfY2FzdDxFZ2xEaXNwbGF5Kj4odGhyZWFkLT5lZ2xEaXNwbGF5KTsKKyAgICByZXR1cm4gZWdsTWFrZUN1cnJlbnQoZHB5LEVHTF9OT19TVVJGQUNFLEVHTF9OT19TVVJGQUNFLEVHTF9OT19DT05URVhUKTsKK30KKworRUdMQVBJIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgRUdMQVBJRU5UUlkKKyAgICAgICBlZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSl7CisgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSByZXRWYWwgPSBOVUxMOworCisgICAgaW5pdEdsb2JhbEluZm8oKTsKKworICAgIGlmKCFzdHJuY21wKHByb2NuYW1lLCJlZ2wiLDMpKSB7IC8vRUdMIHByb2MKKyAgICAgICAgZm9yKGludCBpPTA7aSA8IHNfZWdsRXh0ZW5zaW9uc1NpemU7aSsrKXsKKyAgICAgICAgICAgIGlmKHN0cmNtcChwcm9jbmFtZSxzX2VnbEV4dGVuc2lvbnNbaV0ubmFtZSkgPT0gMCl7CisgICAgICAgICAgICAgICAgcmV0VmFsID0gc19lZ2xFeHRlbnNpb25zW2ldLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIExvb2sgYXQgdGhlIGNsaWVudEFQSSAoR0xFUykgc3VwcG9ydGVkIGV4dGVuc2lvbgorICAgICAgICAvLyBmdW5jdGlvbiB0YWJsZS4KKyAgICAgICAgcmV0VmFsID0gQ2xpZW50QVBJRXh0czo6Z2V0UHJvY0FkZHJlc3MocHJvY25hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0VmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogS0hSIElNQUdFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitJbWFnZVB0ciBnZXRFR0xJbWFnZSh1bnNpZ25lZCBpbnQgaW1hZ2VJZCkKK3sKKyAgICBUaHJlYWRJbmZvKiB0aHJlYWQgID0gZ2V0VGhyZWFkSW5mbygpOworICAgIEVnbERpc3BsYXkqIGRweSAgICAgPSBzdGF0aWNfY2FzdDxFZ2xEaXNwbGF5Kj4odGhyZWFkLT5lZ2xEaXNwbGF5KTsKKyAgICBDb250ZXh0UHRyICBjdHggICAgID0gdGhyZWFkLT5lZ2xDb250ZXh0OworICAgIGlmIChjdHguZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGRweS0+Z2V0SW1hZ2UocmVpbnRlcnByZXRfY2FzdDxFR0xJbWFnZUtIUj4oaW1hZ2VJZCkpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworRUdMQVBJIEVHTEltYWdlS0hSIEVHTEFQSUVOVFJZIGVnbENyZWF0ZUltYWdlS0hSKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0LCBFR0xlbnVtIHRhcmdldCwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKK3sKKyAgICBWQUxJREFURV9ESVNQTEFZKGRpc3BsYXkpOworICAgIFZBTElEQVRFX0NPTlRFWFQoY29udGV4dCk7CisKKyAgICAvLyBXZSBvbmx5IHN1cHBvcnQgRUdMX0dMX1RFWFRVUkVfMkQgaW1hZ2VzCisgICAgaWYgKHRhcmdldCAhPSBFR0xfR0xfVEVYVFVSRV8yRF9LSFIpIHsKKyAgICAgICAgUkVUVVJOX0VSUk9SKEVHTF9OT19JTUFHRV9LSFIsRUdMX0JBRF9QQVJBTUVURVIpOworICAgIH0KKworICAgIFRocmVhZEluZm8qIHRocmVhZCAgPSBnZXRUaHJlYWRJbmZvKCk7CisgICAgU2hhcmVHcm91cFB0ciBzZyA9IHRocmVhZC0+c2hhcmVHcm91cDsKKyAgICBpZiAoc2cuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBOYW1lZE9iamVjdFB0ciBnbG9iYWxUZXhPYmplY3QgPSBzZy0+Z2V0TmFtZWRPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FmZVVJbnRGcm9tUG9pbnRlcihidWZmZXIpKTsKKyAgICAgICAgaWYgKCFnbG9iYWxUZXhPYmplY3QpIHJldHVybiBFR0xfTk9fSU1BR0VfS0hSOworCisgICAgICAgIEltYWdlUHRyIGltZyggbmV3IEVnbEltYWdlKCkgKTsKKyAgICAgICAgaWYgKGltZy5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdXRvIG9iakRhdGEgPSBzZy0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCBTYWZlVUludEZyb21Qb2ludGVyKGJ1ZmZlcikpOworICAgICAgICAgICAgaWYgKCFvYmpEYXRhKSByZXR1cm4gRUdMX05PX0lNQUdFX0tIUjsKKworICAgICAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSAoVGV4dHVyZURhdGEgKilvYmpEYXRhOworICAgICAgICAgICAgaWYoIXRleERhdGEtPndpZHRoIHx8ICF0ZXhEYXRhLT5oZWlnaHQpIHJldHVybiBFR0xfTk9fSU1BR0VfS0hSOworICAgICAgICAgICAgaW1nLT53aWR0aCA9IHRleERhdGEtPndpZHRoOworICAgICAgICAgICAgaW1nLT5oZWlnaHQgPSB0ZXhEYXRhLT5oZWlnaHQ7CisgICAgICAgICAgICBpbWctPmJvcmRlciA9IHRleERhdGEtPmJvcmRlcjsKKyAgICAgICAgICAgIGltZy0+aW50ZXJuYWxGb3JtYXQgPSB0ZXhEYXRhLT5pbnRlcm5hbEZvcm1hdDsKKyAgICAgICAgICAgIGltZy0+Z2xvYmFsVGV4T2JqID0gZ2xvYmFsVGV4T2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIGRweS0+YWRkSW1hZ2VLSFIoaW1nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFR0xfTk9fSU1BR0VfS0hSOworfQorCisKK0VHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lJbWFnZUtIUihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTEltYWdlS0hSIGltYWdlKQoreworICAgIFZBTElEQVRFX0RJU1BMQVkoZGlzcGxheSk7CisgICAgcmV0dXJuIGRweS0+ZGVzdHJveUltYWdlS0hSKGltYWdlKSA/IEVHTF9UUlVFOkVHTF9GQUxTRTsKK30KKworCitFR0xBUEkgRUdMU3luY0tIUiBFR0xBUElFTlRSWSBlZ2xDcmVhdGVTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCogYXR0cmliX2xpc3QpIHsKKworICAgIGNvbnN0IEdMRVNpZmFjZSogaWZhY2UgPSBnX2VnbEluZm8tPmdldElmYWNlKEdMRVNfMl8wKTsKKyAgICBHTHN5bmMgcmVzID0gaWZhY2UtPmZlbmNlU3luYyhHTF9TWU5DX0dQVV9DT01NQU5EU19DT01QTEVURSwgMCk7CisgICAgcmV0dXJuIChFR0xTeW5jS0hSKXJlczsKK30KKworRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xDbGllbnRXYWl0U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVLSFIgdGltZW91dCkgeworCisgICAgY29uc3QgR0xFU2lmYWNlKiBpZmFjZSA9IGdfZWdsSW5mby0+Z2V0SWZhY2UoR0xFU18yXzApOworICAgIEdMZW51bSBnbF93YWl0X3Jlc3VsdCA9CisgICAgICAgIGlmYWNlLT5jbGllbnRXYWl0U3luYygoR0xzeW5jKXN5bmMsIEdMX1NZTkNfRkxVU0hfQ09NTUFORFNfQklULCB0aW1lb3V0KTsKKyAgICBFR0xpbnQgZWdsX3dhaXRfcmVzdWx0OworCisgICAgc3dpdGNoIChnbF93YWl0X3Jlc3VsdCkgeworICAgIGNhc2UgR0xfQUxSRUFEWV9TSUdOQUxFRDoKKyAgICBjYXNlIEdMX0NPTkRJVElPTl9TQVRJU0ZJRUQ6CisgICAgICAgIGVnbF93YWl0X3Jlc3VsdCA9IEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX0tIUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9USU1FT1VUX0VYUElSRUQ6CisgICAgICAgIGVnbF93YWl0X3Jlc3VsdCA9IEVHTF9USU1FT1VUX0VYUElSRURfS0hSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1dBSVRfRkFJTEVEOgorICAgICAgICBlZ2xfd2FpdF9yZXN1bHQgPSBFR0xfRkFMU0U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGVnbF93YWl0X3Jlc3VsdCA9IEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX0tIUjsKKyAgICB9CisgICAgcmV0dXJuIGVnbF93YWl0X3Jlc3VsdDsKK30KKworRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYykgeworCisgICAgY29uc3QgR0xFU2lmYWNlKiBpZmFjZSA9IGdfZWdsSW5mby0+Z2V0SWZhY2UoR0xFU18yXzApOworICAgIGlmYWNlLT5kZWxldGVTeW5jKChHTHN5bmMpc3luYyk7CisgICAgcmV0dXJuIEVHTF9UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xPc0FwaS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xPc0FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmQyZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbE9zQXBpLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEVHTF9PU19BUElfSAorI2RlZmluZSBFR0xfT1NfQVBJX0gKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworI2RlZmluZSBQQlVGRkVSX01BWF9XSURUSCAgMzI3NjcKKyNkZWZpbmUgUEJVRkZFUl9NQVhfSEVJR0hUIDMyNzY3CisjZGVmaW5lIFBCVUZGRVJfTUFYX1BJWEVMUyAoUEJVRkZFUl9NQVhfV0lEVEggKiBQQlVGRkVSX01BWF9IRUlHSFQpCisKK2NsYXNzIEdsTGlicmFyeTsKKworbmFtZXNwYWNlIEVnbE9TIHsKKworLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgZGVjbGFyYXRpb24gdXNlZCB0byBhYnN0cmFjdCB0aGUgdW5kZXJseWluZworLy8gZGVza3RvcCBHTCBsaWJyYXJ5IChvciBlcXVpdmFsZW50KSB0aGF0IGlzIGJlaW5nIHVzZWQgYnkgb3VyIEVHTAorLy8gYW5kIEdMRVMgdHJhbnNsYXRpb24gbGlicmFyaWVzLgorCisvLyBVc2UgRWdsT1M6OkVuZ2luZTo6Z2V0SG9zdEluc3RhbmNlKCkgdG8gcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlCisvLyBFZ2xPUzo6RW5naW5lIGludGVyZmFjZSB0aGF0IG1hdGNoZXMgdGhlIGhvc3QgZGlzcGxheSBzeXN0ZW0uCisvLworLy8gQWx0ZXJuYXRlIHJlbmRlcmVycyAoZS5nLiBzb2Z0d2FyZS1iYXNlZCBNZXNhKSBjYW4gYWxzbyBpbXBsZW1lbnQKKy8vIHRoZWlyIG93biBlbmdpbmUuCisKKy8vIEJhc2UgY2xhc3MgdXNlZCB0byB3cmFwIHZhcmlvdXMgR0wgU3VyZmFjZSB0eXBlcy4KK2NsYXNzIFN1cmZhY2UgeworcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIFdJTkRPVyA9IDAsCisgICAgICAgIFBCVUZGRVIgPSAxLAorICAgIH0gU3VyZmFjZVR5cGU7CisKKyAgICBleHBsaWNpdCBTdXJmYWNlKFN1cmZhY2VUeXBlIHR5cGUpIDogbVR5cGUodHlwZSkge30KKworICAgIHZpcnR1YWwgflN1cmZhY2UoKSB7fQorCisgICAgU3VyZmFjZVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBTdXJmYWNlVHlwZSBtVHlwZTsKK307CisKKy8vIEFuIGludGVyZmFjZSBjbGFzcyBmb3IgZW5naW5lLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIGEgR0wgY29udGV4dC4KK2NsYXNzIENvbnRleHQgeworcHVibGljOgorICAgIENvbnRleHQoKSB7fQorICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7fQorfTsKKworLy8gQmFzZSBjbGFzcyB1c2VkIHRvIHdyYXAgZW5naW5lLXNwZWNpZmljIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycy4KK2NsYXNzIFBpeGVsRm9ybWF0IHsKK3B1YmxpYzoKKyAgICBQaXhlbEZvcm1hdCgpIHt9CisKKyAgICB2aXJ0dWFsIH5QaXhlbEZvcm1hdCgpIHt9CisKKyAgICB2aXJ0dWFsIFBpeGVsRm9ybWF0KiBjbG9uZSgpID0gMDsKK307CisKKy8vIFNtYWxsIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGVuZ2luZS1zcGVjaWZpYworLy8gY29uZmlnLgorc3RydWN0IENvbmZpZ0luZm8geworICAgIEVHTGludCByZWRfc2l6ZTsKKyAgICBFR0xpbnQgZ3JlZW5fc2l6ZTsKKyAgICBFR0xpbnQgYmx1ZV9zaXplOworICAgIEVHTGludCBhbHBoYV9zaXplOworICAgIEVHTGVudW0gY2F2ZWF0OworICAgIEVHTGludCBjb25maWdfaWQ7CisgICAgRUdMaW50IGRlcHRoX3NpemU7CisgICAgRUdMaW50IGZyYW1lX2J1ZmZlcl9sZXZlbDsKKyAgICBFR0xpbnQgbWF4X3BidWZmZXJfd2lkdGg7CisgICAgRUdMaW50IG1heF9wYnVmZmVyX2hlaWdodDsKKyAgICBFR0xpbnQgbWF4X3BidWZmZXJfc2l6ZTsKKyAgICBFR0xCb29sZWFuIG5hdGl2ZV9yZW5kZXJhYmxlOworICAgIEVHTGludCByZW5kZXJhYmxlX3R5cGU7CisgICAgRUdMaW50IG5hdGl2ZV92aXN1YWxfaWQ7CisgICAgRUdMaW50IG5hdGl2ZV92aXN1YWxfdHlwZTsKKyAgICBFR0xpbnQgc2FtcGxlc19wZXJfcGl4ZWw7CisgICAgRUdMaW50IHN0ZW5jaWxfc2l6ZTsKKyAgICBFR0xpbnQgc3VyZmFjZV90eXBlOworICAgIEVHTGVudW0gdHJhbnNwYXJlbnRfdHlwZTsKKyAgICBFR0xpbnQgdHJhbnNfcmVkX3ZhbDsKKyAgICBFR0xpbnQgdHJhbnNfZ3JlZW5fdmFsOworICAgIEVHTGludCB0cmFuc19ibHVlX3ZhbDsKKyAgICBFR0xCb29sZWFuIHJlY29yZGFibGVfYW5kcm9pZDsKKyAgICBQaXhlbEZvcm1hdCogZnJtdDsKK307CisKKy8vIEEgY2FsbGJhY2sgZnVuY3Rpb24gdHlwZSB1c2VkIHdpdGggRGlzcGxheTo6cXVlcnlDb25maWcoKSB0byByZXBvcnQgdG8gdGhlCisvLyBjYWxsZXIgYSBuZXcgaG9zdCBFR0xDb25maWcuCisvLyB8b3BhcXVlfCBpcyBhbiBvcGFxdWUgdmFsdWUgcGFzc2VkIHRvIHF1ZXJ5Q29uZmlnKCkuCisvLyBBbGwgb3RoZXIgcGFyYW1ldGVycyBhcmUgY29uZmlnIGF0dHJpYnV0ZXMuCisvLyBOb3RlIHRoYXQgb3duZXJzaGlwIG9mIHxmcm10fCBpcyB0cmFuc2ZlcmVkIHRvIHRoZSBjYWxsYmFjay4KK3R5cGVkZWYgdm9pZCAoQWRkQ29uZmlnQ2FsbGJhY2spKHZvaWQqIG9wYXF1ZSwgY29uc3QgQ29uZmlnSW5mbyogY29uZmlnSW5mbyk7CisKKy8vIFBidWZmZXIgZGVzY3JpcHRpb24uCisvLyB8d2lkdGh8IGFuZCB8aGVpZ2h0fCBhcmUgaXRzIGRpbWVuc2lvbnMuCisvLyB8bGFyZ2VzdHwgaXMgc2V0IHRvIGFzayB0aGUgbGFyZ2VzdCBwaXhlayBidWZmZXIgKHNlZSBHTFhfTEFSR0VTVF9QQlVGRkVSKS4KKy8vIHxmb3JtYXR8IGlzIG9uZSBvZiBFR0xfVEVYVFVSRV9SR0Igb3IgRUdMX1RFWFRVUkVfUkdCQQorLy8gfHRhcmdldHwgaXMgb25lIG9mIEVHTF9URVhUVVJFXzJEIG9yIEVHTF9OT19URVhUVVJFLgorLy8gfGhhc01pcG1hcHwgaXMgdHJ1ZSBpZiB0aGUgUGJ1ZmZlciBoYXMgbWlwbWFwcy4KK3N0cnVjdCBQYnVmZmVySW5mbyB7CisgICAgRUdMaW50IHdpZHRoOworICAgIEVHTGludCBoZWlnaHQ7CisgICAgRUdMaW50IGxhcmdlc3Q7CisgICAgRUdMaW50IGZvcm1hdDsKKyAgICBFR0xpbnQgdGFyZ2V0OworICAgIEVHTGludCBoYXNNaXBtYXA7Cit9OworCisvLyBBIGNsYXNzIHRvIG1vZGVsIHRoZSBlbmdpbmUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYSBHTCBkaXNwbGF5CisvLyBjb25uZWN0aW9uLgorY2xhc3MgRGlzcGxheSB7CitwdWJsaWM6CisgICAgRGlzcGxheSgpIHt9CisgICAgdmlydHVhbCB+RGlzcGxheSgpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcXVlcnlDb25maWdzKGludCByZW5kZXJhYmxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZENvbmZpZ0NhbGxiYWNrKiBhZGRDb25maWdGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYWRkQ29uZmlnT3BhcXVlKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZE5hdGl2ZVdpbihTdXJmYWNlKiB3aW4pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZE5hdGl2ZVdpbihFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbikgPSAwOworCisgICAgdmlydHVhbCBib29sIGNoZWNrV2luZG93UGl4ZWxGb3JtYXRNYXRjaChFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeGVsRm9ybWF0KiBwaXhlbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGhlaWdodCkgPSAwOworCisgICAgdmlydHVhbCBDb250ZXh0KiBjcmVhdGVDb250ZXh0KAorICAgICAgICAgICAgY29uc3QgUGl4ZWxGb3JtYXQqIHBpeGVsRm9ybWF0LCBDb250ZXh0KiBzaGFyZWRDb250ZXh0KSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgZGVzdHJveUNvbnRleHQoQ29udGV4dCogY29udGV4dCkgPSAwOworCisgICAgdmlydHVhbCBTdXJmYWNlKiBjcmVhdGVQYnVmZmVyU3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IFBpeGVsRm9ybWF0KiBwaXhlbEZvcm1hdCwgY29uc3QgUGJ1ZmZlckluZm8qIGluZm8pID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlUGJ1ZmZlcihTdXJmYWNlKiBwYikgPSAwOworCisgICAgdmlydHVhbCBib29sIG1ha2VDdXJyZW50KFN1cmZhY2UqIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2UqIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBzd2FwQnVmZmVycyhTdXJmYWNlKiBzcmZjKSA9IDA7Cit9OworCisvLyBBbiBpbnRlcmZhY2UgY2xhc3MgdG8gbW9kZWwgYSBzcGVjaWZpYyB1bmRlcmx5aW5nIEdMIGdyYXBoaWNzIHN1YnN5c3RlbQorLy8gb3IgZW5naW5lLiBVc2UgZ2V0SG9zdCgpIHRvIHJldHJpZXZlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQKKy8vIGhvc3QuCitjbGFzcyBFbmdpbmUgeworcHVibGljOgorICAgIEVuZ2luZSgpIHt9CisgICAgdmlydHVhbCB+RW5naW5lKCkge30KKworICAgIC8vIFJldHVybiBhIERpc3BsYXkgaW5zdGFuY2UgdG8gdGhlIGRlZmF1bHQgZGlzcGxheSAvIHdpbmRvdy4KKyAgICB2aXJ0dWFsIERpc3BsYXkqIGdldERlZmF1bHREaXNwbGF5KCkgPSAwOworCisgICAgLy8gUmV0dXJuIHRvIGVuZ2luZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBHbExpYnJhcnkuCisgICAgdmlydHVhbCBHbExpYnJhcnkqIGdldEdsTGlicmFyeSgpID0gMDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyB3aW5kb3cgc3VyZmFjZS4gfHduZHwgaXMgYSBob3N0LXNwZWNpZmljIHdpbmRvdyBoYW5kbGUKKyAgICAvLyAoZS5nLiBhIFdpbmRvd3MgSFdORCkuIEEgc29mdHdhcmUgcmVuZGVyZXIgd291bGQgYWx3YXlzIHJldHVybiBOVUxMCisgICAgLy8gaGVyZS4KKyAgICB2aXJ0dWFsIFN1cmZhY2UqIGNyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMTmF0aXZlV2luZG93VHlwZSB3bmQpID0gMDsKKworICAgIC8vIFJldHJpZXZlIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgaG9zdC4gVGhpcyBjYW4gYmUgY2FsbGVkCisgICAgLy8gbXVsdGlwbGUgdGltZXMsIGFuZCB3aWxsIGluaXRpYWxpemUgdGhlIGVuZ2luZSBvbiBmaXJzdCBjYWxsLgorICAgIHN0YXRpYyBFbmdpbmUqIGdldEhvc3RJbnN0YW5jZSgpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIEVnbE9TCisKKyNlbmRpZiAgLy8gRUdMX09TX0FQSV9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbE9zQXBpX2Rhcndpbi5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbE9zQXBpX2Rhcndpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ4YjdjZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsT3NBcGlfZGFyd2luLmNwcApAQCAtMCwwICsxLDM4NyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorCisjaW5jbHVkZSAiTWFjTmF0aXZlLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorI2luY2x1ZGUgIkdMY29tbW9uL0dMTGlicmFyeS5oIgorI2luY2x1ZGUgIk9wZW5nbENvZGVjQ29tbW9uL0Vycm9yTG9nLmgiCisKKyNpbmNsdWRlIDxsaXN0PgorCisjZGVmaW5lIE1BWF9QQlVGRkVSX01JUE1BUF9MRVZFTCAxCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1hY1N1cmZhY2UgOiBwdWJsaWMgRWdsT1M6OlN1cmZhY2UgeworcHVibGljOgorICAgIE1hY1N1cmZhY2Uodm9pZCogaGFuZGxlLCBTdXJmYWNlVHlwZSB0eXBlKSA6CisgICAgICAgICAgICBTdXJmYWNlKHR5cGUpLCBtX2hhbmRsZShoYW5kbGUpIHt9CisKKyAgICB2b2lkKiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtX2hhbmRsZTsgfQorCisgICAgYm9vbCBoYXNNaXBtYXAoKSBjb25zdCB7IHJldHVybiBtX2hhc01pcG1hcDsgfQorICAgIHZvaWQgc2V0SGFzTWlwbWFwKGJvb2wgdmFsdWUpIHsgbV9oYXNNaXBtYXAgPSB2YWx1ZTsgfQorCisgICAgc3RhdGljIE1hY1N1cmZhY2UqIGZyb20oRWdsT1M6OlN1cmZhY2UqIHMpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1hY1N1cmZhY2UqPihzKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCogbV9oYW5kbGUgPSBudWxscHRyOworICAgIGJvb2wgbV9oYXNNaXBtYXAgPSBmYWxzZTsKK307CisKK2NsYXNzIE1hY0NvbnRleHQgOiBwdWJsaWMgRWdsT1M6OkNvbnRleHQgeworcHVibGljOgorICAgIGV4cGxpY2l0IE1hY0NvbnRleHQodm9pZCogY29udGV4dCkgOiBtQ29udGV4dChjb250ZXh0KSB7fQorCisgICAgdmlydHVhbCB+TWFjQ29udGV4dCgpIHsKKyAgICAgICAgbnNEZXN0cm95Q29udGV4dChtQ29udGV4dCk7CisgICAgfQorCisgICAgdm9pZCogY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1Db250ZXh0OyB9CisKKyAgICBzdGF0aWMgdm9pZCogZnJvbShFZ2xPUzo6Q29udGV4dCogYykgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWFjQ29udGV4dCo+KGMpLT5jb250ZXh0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQqIG1Db250ZXh0ID0gbnVsbHB0cjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PHZvaWQqPiBOYXRpdmVGb3JtYXRMaXN0OworCitOYXRpdmVGb3JtYXRMaXN0IHNfbmF0aXZlRm9ybWF0czsKKwordm9pZCBpbml0TmF0aXZlQ29uZmlncygpeworICAgIGludCBuQ29uZmlncyA9IGdldE51bVBpeGVsRm9ybWF0cygpOworICAgIGlmIChzX25hdGl2ZUZvcm1hdHMuZW1wdHkoKSkgeworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbkNvbmZpZ3M7IGkrKykgeworICAgICAgICAgICAgIHZvaWQqIGZybXQgPSBnZXRQaXhlbEZvcm1hdChpKTsKKyAgICAgICAgICAgICBpZiAoZnJtdCkgeworICAgICAgICAgICAgICAgICBzX25hdGl2ZUZvcm1hdHMucHVzaF9iYWNrKGZybXQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworY2xhc3MgTWFjUGl4ZWxGb3JtYXQgOiBwdWJsaWMgRWdsT1M6OlBpeGVsRm9ybWF0IHsKK3B1YmxpYzoKKyAgICBNYWNQaXhlbEZvcm1hdCh2b2lkKiBoYW5kbGUsIGludCByZWRTaXplLCBpbnQgZ3JlZW5TaXplLCBpbnQgYmx1ZVNpemUpIDoKKyAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgICAgICAgIG1SZWRTaXplKHJlZFNpemUpLAorICAgICAgICAgICAgbUdyZWVuU2l6ZShncmVlblNpemUpLAorICAgICAgICAgICAgbUJsdWVTaXplKGJsdWVTaXplKSB7fQorCisgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYWNQaXhlbEZvcm1hdChtSGFuZGxlLCBtUmVkU2l6ZSwgbUdyZWVuU2l6ZSwgbUJsdWVTaXplKTsKKyAgICB9CisKKyAgICB2b2lkKiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgaW50IHJlZFNpemUoKSBjb25zdCB7IHJldHVybiBtUmVkU2l6ZTsgfQorICAgIGludCBncmVlblNpemUoKSBjb25zdCB7IHJldHVybiBtR3JlZW5TaXplOyB9CisgICAgaW50IGJsdWVTaXplKCkgY29uc3QgeyByZXR1cm4gbUJsdWVTaXplOyB9CisKKyAgICBzdGF0aWMgY29uc3QgTWFjUGl4ZWxGb3JtYXQqIGZyb20oY29uc3QgRWdsT1M6OlBpeGVsRm9ybWF0KiBmKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNYWNQaXhlbEZvcm1hdCo+KGYpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBNYWNQaXhlbEZvcm1hdCgpOworICAgIE1hY1BpeGVsRm9ybWF0KGNvbnN0IE1hY1BpeGVsRm9ybWF0JiBvdGhlcik7CisKKyAgICB2b2lkKiBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICBpbnQgbVJlZFNpemUgPSAwOworICAgIGludCBtR3JlZW5TaXplID0gMDsKKyAgICBpbnQgbUJsdWVTaXplID0gMDsKK307CisKKwordm9pZCBwaXhlbEZvcm1hdFRvQ29uZmlnKGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZnJtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6QWRkQ29uZmlnQ2FsbGJhY2sgYWRkQ29uZmlnRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhZGRDb25maWdPcGFxdWUpIHsKKyAgICBFZ2xPUzo6Q29uZmlnSW5mbyBpbmZvID0ge307CisgICAgRUdMaW50IGRvdWJsZUJ1ZmZlcjsKKyAgICBnZXRQaXhlbEZvcm1hdEF0dHJpYihmcm10LCBNQUNfSEFTX0RPVUJMRV9CVUZGRVIsICZkb3VibGVCdWZmZXIpOworICAgIGlmICghZG91YmxlQnVmZmVyKSB7CisgICAgICAgIHJldHVybjsgLy9waXhlbCBkb3VibGUgYnVmZmVyCisgICAgfQorCisgICAgRUdMaW50IHdpbmRvdyA9IDAsIHBidWZmZXIgPSAwOworICAgIGdldFBpeGVsRm9ybWF0QXR0cmliKGZybXQsIE1BQ19EUkFXX1RPX1dJTkRPVywgJndpbmRvdyk7CisgICAgZ2V0UGl4ZWxGb3JtYXRBdHRyaWIoZnJtdCwgTUFDX0RSQVdfVE9fUEJVRkZFUiwgJnBidWZmZXIpOworCisgICAgaW5mby5zdXJmYWNlX3R5cGUgPSAwOworICAgIGlmICh3aW5kb3cpIHsKKyAgICAgICAgaW5mby5zdXJmYWNlX3R5cGUgfD0gRUdMX1dJTkRPV19CSVQ7CisgICAgfQorICAgIGlmIChwYnVmZmVyKSB7CisgICAgICAgIGluZm8uc3VyZmFjZV90eXBlIHw9IEVHTF9QQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaWYgKCFpbmZvLnN1cmZhY2VfdHlwZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9kZWZhdWx0IHZhbHVlcworICAgIGluZm8ubmF0aXZlX3Zpc3VhbF9pZCA9IDA7CisgICAgaW5mby5uYXRpdmVfdmlzdWFsX3R5cGUgPSBFR0xfTk9ORTsKKyAgICBpbmZvLmNhdmVhdCA9IEVHTF9OT05FOworICAgIGluZm8ubmF0aXZlX3JlbmRlcmFibGUgPSBFR0xfRkFMU0U7CisgICAgaW5mby5yZW5kZXJhYmxlX3R5cGUgPSByZW5kZXJhYmxlVHlwZTsKKyAgICBpbmZvLm1heF9wYnVmZmVyX3dpZHRoID0gUEJVRkZFUl9NQVhfV0lEVEg7CisgICAgaW5mby5tYXhfcGJ1ZmZlcl9oZWlnaHQgPSBQQlVGRkVSX01BWF9IRUlHSFQ7CisgICAgaW5mby5tYXhfcGJ1ZmZlcl9zaXplID0gUEJVRkZFUl9NQVhfUElYRUxTOworICAgIGluZm8uc2FtcGxlc19wZXJfcGl4ZWwgPSAwOworICAgIGluZm8uZnJhbWVfYnVmZmVyX2xldmVsID0gMDsKKyAgICBpbmZvLnRyYW5zX3JlZF92YWwgPSAwOworICAgIGluZm8udHJhbnNfZ3JlZW5fdmFsID0gMDsKKyAgICBpbmZvLnRyYW5zX2JsdWVfdmFsID0gMDsKKworICAgIGluZm8udHJhbnNwYXJlbnRfdHlwZSA9IEVHTF9OT05FOworCisgICAgLyogQWxsIGNvbmZpZ3MgY2FuIGVuZCB1cCBoYXZpbmcgYW4gYWxwaGEgY2hhbm5lbCBldmVuIGlmIG5vbmUgd2FzIHJlcXVlc3RlZC4KKyAgICAgKiBUaGUgZGVmYXVsdCBjb25maWcgY2hvb3NlciBpbiBHTFN1cmZhY2VWaWV3IHdpbGwgdGhlcmVmb3JlIG5vdCBmaW5kIGFueQorICAgICAqIG1hdGNoaW5nIGNvbmZpZy4gVGh1cywgbWFrZSBzdXJlIGFscGhhIGlzIHplcm8gKG9yIGF0IGxlYXN0IHNpZ25hbGxlZCBhcworICAgICAqIHplcm8gdG8gdGhlIGNhbGxpbmcgRUdMIGxheWVyKSBmb3IgdGhlIGNvbmZpZ3Mgd2hlcmUgaXQgd2FzIGludGVuZGVkIHRvCisgICAgICogYmUgemVyby4gKi8KKyAgICBpZiAoZ2V0UGl4ZWxGb3JtYXREZWZpbml0aW9uQWxwaGEoaW5kZXgpID09IDApIHsKKyAgICAgICAgaW5mby5hbHBoYV9zaXplID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBnZXRQaXhlbEZvcm1hdEF0dHJpYihmcm10LCBNQUNfQUxQSEFfU0laRSwgJmluZm8uYWxwaGFfc2l6ZSk7CisgICAgfQorICAgIGdldFBpeGVsRm9ybWF0QXR0cmliKGZybXQsIE1BQ19ERVBUSF9TSVpFLCAmaW5mby5kZXB0aF9zaXplKTsKKyAgICBnZXRQaXhlbEZvcm1hdEF0dHJpYihmcm10LCBNQUNfU1RFTkNJTF9TSVpFLCAmaW5mby5zdGVuY2lsX3NpemUpOworICAgIGdldFBpeGVsRm9ybWF0QXR0cmliKGZybXQsIE1BQ19TQU1QTEVTX1BFUl9QSVhFTCwgJmluZm8uc2FtcGxlc19wZXJfcGl4ZWwpOworCisgICAgLy9UT0RPOiBhc2sgZ3V5IGlmIGl0IGlzIE9LCisgICAgR0xpbnQgY29sb3JTaXplID0gMDsKKyAgICBnZXRQaXhlbEZvcm1hdEF0dHJpYihmcm10LCBNQUNfQ09MT1JfU0laRSwgJmNvbG9yU2l6ZSk7CisgICAgaW5mby5yZWRfc2l6ZSA9IGluZm8uZ3JlZW5fc2l6ZSA9IGluZm8uYmx1ZV9zaXplID0gKGNvbG9yU2l6ZSAvIDQpOworCisgICAgaW5mby5jb25maWdfaWQgPSAoRUdMaW50KSBpbmRleDsKKyAgICBpbmZvLmZybXQgPSBuZXcgTWFjUGl4ZWxGb3JtYXQoCisgICAgICAgICAgICBmcm10LCBpbmZvLnJlZF9zaXplLCBpbmZvLmdyZWVuX3NpemUsIGluZm8uYmx1ZV9zaXplKTsKKworICAgICgqYWRkQ29uZmlnRnVuYykoYWRkQ29uZmlnT3BhcXVlLCAmaW5mbyk7Cit9CisKKworY2xhc3MgTWFjRGlzcGxheSA6IHB1YmxpYyBFZ2xPUzo6RGlzcGxheSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTWFjRGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHkpIDogbURweShkcHkpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgcXVlcnlDb25maWdzKGludCByZW5kZXJhYmxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpBZGRDb25maWdDYWxsYmFjayogYWRkQ29uZmlnRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFkZENvbmZpZ09wYXF1ZSkgeworICAgICAgICBpbml0TmF0aXZlQ29uZmlncygpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoTmF0aXZlRm9ybWF0TGlzdDo6aXRlcmF0b3IgaXQgPSBzX25hdGl2ZUZvcm1hdHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBzX25hdGl2ZUZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytpdCkgeworICAgICAgICAgICAgcGl4ZWxGb3JtYXRUb0NvbmZpZyhpKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmFibGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZ09wYXF1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZE5hdGl2ZVdpbihFZ2xPUzo6U3VyZmFjZSogd2luKSB7CisgICAgICAgIGlmICh3aW4tPnR5cGUoKSAhPSBNYWNTdXJmYWNlOjpXSU5ET1cpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkTmF0aXZlV2luKE1hY1N1cmZhY2U6OmZyb20od2luKS0+aGFuZGxlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWROYXRpdmVXaW4oRUdMTmF0aXZlV2luZG93VHlwZSB3aW4pIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIHJldHVybiBuc0dldFdpbkRpbXMod2luLCAmd2lkdGgsICZoZWlnaHQpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjaGVja1dpbmRvd1BpeGVsRm9ybWF0TWF0Y2goCisgICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKKyAgICAgICAgICAgIGNvbnN0IEVnbE9TOjpQaXhlbEZvcm1hdCogcGl4ZWxGb3JtYXQsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIHdpZHRoLAorICAgICAgICAgICAgdW5zaWduZWQgaW50KiBoZWlnaHQpIHsKKyAgICAgICAgYm9vbCByZXQgPSBuc0dldFdpbkRpbXMod2luLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICBjb25zdCBNYWNQaXhlbEZvcm1hdCogZm9ybWF0ID0gTWFjUGl4ZWxGb3JtYXQ6OmZyb20ocGl4ZWxGb3JtYXQpOworICAgICAgICBpbnQgciA9IGZvcm1hdC0+cmVkU2l6ZSgpOworICAgICAgICBpbnQgZyA9IGZvcm1hdC0+Z3JlZW5TaXplKCk7CisgICAgICAgIGludCBiID0gZm9ybWF0LT5ibHVlU2l6ZSgpOworCisgICAgICAgIGJvb2wgbWF0Y2ggPSBuc0NoZWNrQ29sb3Iod2luLCByICsgZyArIGIpOworCisgICAgICAgIHJldHVybiByZXQgJiYgbWF0Y2g7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6Q29udGV4dCogY3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgIGNvbnN0IEVnbE9TOjpQaXhlbEZvcm1hdCogcGl4ZWxGb3JtYXQsCisgICAgICAgICAgICBFZ2xPUzo6Q29udGV4dCogc2hhcmVkQ29udGV4dCkgeworICAgICAgICB2b2lkKiBtYWNTaGFyZWRDb250ZXh0ID0KKyAgICAgICAgICAgICAgICBzaGFyZWRDb250ZXh0ID8gTWFjQ29udGV4dDo6ZnJvbShzaGFyZWRDb250ZXh0KSA6IE5VTEw7CisgICAgICAgIHJldHVybiBuZXcgTWFjQ29udGV4dCgKKyAgICAgICAgICAgICAgICBuc0NyZWF0ZUNvbnRleHQoTWFjUGl4ZWxGb3JtYXQ6OmZyb20ocGl4ZWxGb3JtYXQpLT5oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjU2hhcmVkQ29udGV4dCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBkZXN0cm95Q29udGV4dChFZ2xPUzo6Q29udGV4dCogY29udGV4dCkgeworICAgICAgICBkZWxldGUgY29udGV4dDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6U3VyZmFjZSogY3JlYXRlUGJ1ZmZlclN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBFZ2xPUzo6UGl4ZWxGb3JtYXQqIHBpeGVsRm9ybWF0LAorICAgICAgICAgICAgY29uc3QgRWdsT1M6OlBidWZmZXJJbmZvKiBpbmZvKSB7CisgICAgICAgIEdMZW51bSBnbFRleEZvcm1hdCA9IEdMX1JHQkEsIGdsVGV4VGFyZ2V0ID0gR0xfVEVYVFVSRV8yRDsKKyAgICAgICAgc3dpdGNoIChpbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9SR0I6CisgICAgICAgICAgICBnbFRleEZvcm1hdCA9IEdMX1JHQjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVHTF9URVhUVVJFX1JHQkE6CisgICAgICAgICAgICBnbFRleEZvcm1hdCA9IEdMX1JHQkE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBFR0xpbnQgbWF4TWlwbWFwID0gaW5mby0+aGFzTWlwbWFwID8gTUFYX1BCVUZGRVJfTUlQTUFQX0xFVkVMIDogMDsKKworICAgICAgICBNYWNTdXJmYWNlKiByZXN1bHQgPSBuZXcgTWFjU3VyZmFjZSgKKyAgICAgICAgICAgICAgICBuc0NyZWF0ZVBCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBnbFRleFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsVGV4Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4TWlwbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5oZWlnaHQpLAorICAgICAgICAgICAgICAgIE1hY1N1cmZhY2U6OlBCVUZGRVIpOworCisgICAgICAgIHJlc3VsdC0+c2V0SGFzTWlwbWFwKGluZm8tPmhhc01pcG1hcCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VQYnVmZmVyKEVnbE9TOjpTdXJmYWNlKiBwYikgeworICAgICAgICBpZiAocGIpIHsKKyAgICAgICAgICAgIG5zRGVzdHJveVBCdWZmZXIoTWFjU3VyZmFjZTo6ZnJvbShwYiktPmhhbmRsZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFrZUN1cnJlbnQoRWdsT1M6OlN1cmZhY2UqIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpTdXJmYWNlKiBkcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6Q29udGV4dCogY3R4KSB7CisgICAgICAgIC8vIGNoZWNrIGZvciB1bmJpbmQKKyAgICAgICAgaWYgKGN0eCA9PSBOVUxMICYmIHJlYWQgPT0gTlVMTCAmJiBkcmF3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5zV2luZG93TWFrZUN1cnJlbnQoTlVMTCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjdHggPT0gTlVMTCB8fCByZWFkID09IE5VTEwgfHwgZHJhdyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBlcnJvciAhCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvL2RvbnQgc3VwcG9ydGluZyBkaWZmcmVudCByZWFkICYgZHJhdyBzdXJmYWNlcyBvbiBNYWMKKyAgICAgICAgaWYgKHJlYWQgIT0gZHJhdykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoZHJhdy0+dHlwZSgpKSB7CisgICAgICAgIGNhc2UgTWFjU3VyZmFjZTo6V0lORE9XOgorICAgICAgICAgICAgbnNXaW5kb3dNYWtlQ3VycmVudChNYWNDb250ZXh0Ojpmcm9tKGN0eCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY1N1cmZhY2U6OmZyb20oZHJhdyktPmhhbmRsZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1hY1N1cmZhY2U6OlBCVUZGRVI6CisgICAgICAgIHsKKyAgICAgICAgICAgIE1hY1N1cmZhY2UqIG1hY2RyYXcgPSBNYWNTdXJmYWNlOjpmcm9tKGRyYXcpOworICAgICAgICAgICAgaW50IG1pcG1hcExldmVsID0gbWFjZHJhdy0+aGFzTWlwbWFwKCkgPyBNQVhfUEJVRkZFUl9NSVBNQVBfTEVWRUwgOiAwOworICAgICAgICAgICAgbnNQQnVmZmVyTWFrZUN1cnJlbnQoTWFjQ29udGV4dDo6ZnJvbShjdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjZHJhdy0+aGFuZGxlKCksIG1pcG1hcExldmVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHN3YXBCdWZmZXJzKEVnbE9TOjpTdXJmYWNlKiBzcmZjKSB7CisgICAgICAgIG5zU3dhcEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICBFR0xOYXRpdmVEaXNwbGF5VHlwZSBkcHkoKSBjb25zdCB7IHJldHVybiBtRHB5OyB9CisKK3ByaXZhdGU6CisgICAgRUdMTmF0aXZlRGlzcGxheVR5cGUgbURweSA9IHt9OworfTsKKworY2xhc3MgTWFjR2xMaWJyYXJ5IDogcHVibGljIEdsTGlicmFyeSB7CitwdWJsaWM6CisgICAgTWFjR2xMaWJyYXJ5KCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrTGliTmFtZVtdID0KKyAgICAgICAgICAgICAgICAiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvT3BlbkdMLmZyYW1ld29yay9PcGVuR0wiOworICAgICAgICBjaGFyIGVycm9yWzI1Nl07CisgICAgICAgIG1MaWIgPSBlbXVnbDo6U2hhcmVkTGlicmFyeTo6b3BlbihrTGliTmFtZSwgZXJyb3IsIHNpemVvZihlcnJvcikpOworICAgICAgICBpZiAoIW1MaWIpIHsKKyAgICAgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBvcGVuIEdMIGxpYnJhcnkgJXMgWyVzXVxuIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGtMaWJOYW1lLCBlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+TWFjR2xMaWJyYXJ5KCkgeworICAgICAgICBkZWxldGUgbUxpYjsKKyAgICB9CisKKyAgICAvLyBvdmVycmlkZQorICAgIHZpcnR1YWwgR2xGdW5jdGlvblBvaW50ZXIgZmluZFN5bWJvbChjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgIGlmICghbUxpYikgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8R2xGdW5jdGlvblBvaW50ZXI+KG1MaWItPmZpbmRTeW1ib2wobmFtZSkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBlbXVnbDo6U2hhcmVkTGlicmFyeSogbUxpYiA9IG51bGxwdHI7Cit9OworCitjbGFzcyBNYWNFbmdpbmUgOiBwdWJsaWMgRWdsT1M6OkVuZ2luZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBFZ2xPUzo6RGlzcGxheSogZ2V0RGVmYXVsdERpc3BsYXkoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFjRGlzcGxheSgwKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEdsTGlicmFyeSogZ2V0R2xMaWJyYXJ5KCkgeworICAgICAgICByZXR1cm4gJm1HbExpYjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEVnbE9TOjpTdXJmYWNlKiBjcmVhdGVXaW5kb3dTdXJmYWNlKEVHTE5hdGl2ZVdpbmRvd1R5cGUgd25kKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFjU3VyZmFjZSh3bmQsIE1hY1N1cmZhY2U6OldJTkRPVyk7CisgICAgfQorCitwcml2YXRlOgorICAgIE1hY0dsTGlicmFyeSBtR2xMaWI7Cit9OworCitlbXVnbDo6TGF6eUluc3RhbmNlPE1hY0VuZ2luZT4gc0hvc3RFbmdpbmUgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK30gIC8vIG5hbWVzcGFjZQorCisKKy8vIHN0YXRpYworRWdsT1M6OkVuZ2luZSogRWdsT1M6OkVuZ2luZTo6Z2V0SG9zdEluc3RhbmNlKCkgeworICAgIHJldHVybiBzSG9zdEVuZ2luZS5wdHIoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsT3NBcGlfZ2x4LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsT3NBcGlfZ2x4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgyOGRjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xPc0FwaV9nbHguY3BwCkBAIC0wLDAgKzEsNDY4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkVnbE9zQXBpLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorI2luY2x1ZGUgIkdMY29tbW9uL0dMTGlicmFyeS5oIgorCisjaW5jbHVkZSAiT3BlbmdsQ29kZWNDb21tb24vRXJyb3JMb2cuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8R0wvZ2x4Lmg+CisKK25hbWVzcGFjZSB7CisKK3R5cGVkZWYgRGlzcGxheSBYMTFEaXNwbGF5OworCitjbGFzcyBFcnJvckhhbmRsZXJ7CitwdWJsaWM6CisgICAgRXJyb3JIYW5kbGVyKEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSk7CisgICAgfkVycm9ySGFuZGxlcigpOworICAgIGludCBnZXRMYXN0RXJyb3IoKSBjb25zdCB7IHJldHVybiBzX2xhc3RFcnJvckNvZGU7IH0KKworcHJpdmF0ZToKKyAgICBzdGF0aWMgaW50IHNfbGFzdEVycm9yQ29kZTsKKyAgICBpbnQgKCptX29sZEVycm9ySGFuZGxlcikoRGlzcGxheSAqLCBYRXJyb3JFdmVudCAqKSA9IG51bGxwdHI7CisgICAgc3RhdGljIGVtdWdsOjpNdXRleCBzX2xvY2s7CisgICAgc3RhdGljIGludCBlcnJvckhhbmRsZXJQcm9jKEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSxYRXJyb3JFdmVudCogZXZlbnQpOworfTsKKworLy8gc3RhdGljCitpbnQgRXJyb3JIYW5kbGVyOjpzX2xhc3RFcnJvckNvZGUgPSAwOworCisvLyBzdGF0aWMKK2VtdWdsOjpNdXRleCBFcnJvckhhbmRsZXI6OnNfbG9jazsKKworRXJyb3JIYW5kbGVyOjpFcnJvckhhbmRsZXIoRUdMTmF0aXZlRGlzcGxheVR5cGUgZHB5KSB7CisgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KHNfbG9jayk7CisgICBYU3luYyhkcHksRmFsc2UpOworICAgc19sYXN0RXJyb3JDb2RlID0gMDsKKyAgIG1fb2xkRXJyb3JIYW5kbGVyID0gWFNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXJQcm9jKTsKK30KKworRXJyb3JIYW5kbGVyOjp+RXJyb3JIYW5kbGVyKCkgeworICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChzX2xvY2spOworICAgWFNldEVycm9ySGFuZGxlcihtX29sZEVycm9ySGFuZGxlcik7CisgICBzX2xhc3RFcnJvckNvZGUgPSAwOworfQorCitpbnQgRXJyb3JIYW5kbGVyOjplcnJvckhhbmRsZXJQcm9jKEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVycm9yRXZlbnQqIGV2ZW50KSB7CisgICAgc19sYXN0RXJyb3JDb2RlID0gZXZlbnQtPmVycm9yX2NvZGU7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgSVNfU1VDQ0VTUyhhKSBcCisgICAgICAgIGRvIHsgaWYgKGEgIT0gU3VjY2VzcykgcmV0dXJuIDA7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRVhJVF9JRl9GQUxTRShhKSBcCisgICAgICAgIGRvIHsgaWYgKGEgIT0gU3VjY2VzcykgcmV0dXJuOyB9IHdoaWxlICgwKQorCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBFZ2xPUzo6UGl4ZWxGb3JtYXQgYmFzZWQgb24gR0xYLgorY2xhc3MgR2x4UGl4ZWxGb3JtYXQgOiBwdWJsaWMgRWdsT1M6OlBpeGVsRm9ybWF0IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBHbHhQaXhlbEZvcm1hdChHTFhGQkNvbmZpZyBmYmNvbmZpZykgOiBtRmJDb25maWcoZmJjb25maWcpIHt9CisKKyAgICB2aXJ0dWFsIEVnbE9TOjpQaXhlbEZvcm1hdCogY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgR2x4UGl4ZWxGb3JtYXQobUZiQ29uZmlnKTsKKyAgICB9CisKKyAgICBHTFhGQkNvbmZpZyBmYkNvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1GYkNvbmZpZzsgfQorCisgICAgc3RhdGljIEdMWEZCQ29uZmlnIGZyb20oY29uc3QgRWdsT1M6OlBpeGVsRm9ybWF0KiBmKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBHbHhQaXhlbEZvcm1hdCo+KGYpLT5mYkNvbmZpZygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBHTFhGQkNvbmZpZyBtRmJDb25maWcgPSBudWxscHRyOworfTsKKwordm9pZCBwaXhlbEZvcm1hdFRvQ29uZmlnKEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xYRkJDb25maWcgZnJtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6QWRkQ29uZmlnQ2FsbGJhY2sqIGFkZENvbmZpZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYWRkQ29uZmlnT3BhcXVlKSB7CisgICAgRWdsT1M6OkNvbmZpZ0luZm8gaW5mbzsKKyAgICBpbnQgIHRtcDsKKworICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKworICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoZHB5LCBmcm10LCBHTFhfVFJBTlNQQVJFTlRfVFlQRSwgJnRtcCkpOworICAgIGlmICh0bXAgPT0gR0xYX1RSQU5TUEFSRU5UX0lOREVYKSB7CisgICAgICAgIHJldHVybjsgLy8gbm90IHN1cHBvcnRpbmcgdHJhbnNwYXJlbnQgaW5kZXgKKyAgICB9IGVsc2UgaWYgKHRtcCA9PSBHTFhfTk9ORSkgeworICAgICAgICBpbmZvLnRyYW5zcGFyZW50X3R5cGUgPSBFR0xfTk9ORTsKKyAgICAgICAgaW5mby50cmFuc19yZWRfdmFsID0gMDsKKyAgICAgICAgaW5mby50cmFuc19ncmVlbl92YWwgPSAwOworICAgICAgICBpbmZvLnRyYW5zX2JsdWVfdmFsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvLnRyYW5zcGFyZW50X3R5cGUgPSBFR0xfVFJBTlNQQVJFTlRfUkdCOworCisgICAgICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICAgICAgZHB5LCBmcm10LCBHTFhfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLCAmaW5mby50cmFuc19yZWRfdmFsKSk7CisgICAgICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICAgICAgZHB5LCBmcm10LCBHTFhfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsICZpbmZvLnRyYW5zX2dyZWVuX3ZhbCkpOworICAgICAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsICZpbmZvLnRyYW5zX2JsdWVfdmFsKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBmaWx0ZXIgb3V0IHNpbmdsZSBidWZmZXIgY29uZmlndXJhdGlvbnMKKyAgICAvLworICAgIGludCBkb3VibGVCdWZmZXIgPSAwOworICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkcHksIGZybXQsIEdMWF9ET1VCTEVCVUZGRVIsICZkb3VibGVCdWZmZXIpKTsKKyAgICBpZiAoIWRvdWJsZUJ1ZmZlcikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSAsZnJtdCwgR0xYX1JFRF9TSVpFLCAmaW5mby5yZWRfc2l6ZSkpOworICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkcHkgLGZybXQsIEdMWF9HUkVFTl9TSVpFLCAmaW5mby5ncmVlbl9zaXplKSk7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSAsZnJtdCwgR0xYX0JMVUVfU0laRSwgJmluZm8uYmx1ZV9zaXplKSk7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSAsZnJtdCwgR0xYX0FMUEhBX1NJWkUsICZpbmZvLmFscGhhX3NpemUpKTsKKyAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgZHB5ICxmcm10LCBHTFhfREVQVEhfU0laRSwgJmluZm8uZGVwdGhfc2l6ZSkpOworICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkcHkgLGZybXQsIEdMWF9TVEVOQ0lMX1NJWkUsICZpbmZvLnN0ZW5jaWxfc2l6ZSkpOworCisgICAgaW5mby5yZW5kZXJhYmxlX3R5cGUgPSByZW5kZXJhYmxlVHlwZTsKKyAgICBpbnQgbmF0aXZlUmVuZGVyYWJsZSA9IDA7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX1hfUkVOREVSQUJMRSwgJm5hdGl2ZVJlbmRlcmFibGUpKTsKKyAgICBpbmZvLm5hdGl2ZV9yZW5kZXJhYmxlID0gISFuYXRpdmVSZW5kZXJhYmxlOworCisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX1hfVklTVUFMX1RZUEUsICZpbmZvLm5hdGl2ZV92aXN1YWxfdHlwZSkpOworCisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX1ZJU1VBTF9JRCwgJmluZm8ubmF0aXZlX3Zpc3VhbF9pZCkpOworCisgICAgLy9zdXBwb3J0ZWQgc3VyZmFjZXMgdHlwZXMKKyAgICBpbmZvLnN1cmZhY2VfdHlwZSA9IDA7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYihkcHksIGZybXQsIEdMWF9EUkFXQUJMRV9UWVBFLCAmdG1wKSk7CisgICAgaWYgKHRtcCAmIEdMWF9XSU5ET1dfQklUICYmIGluZm8ubmF0aXZlX3Zpc3VhbF9pZCAhPSAwKSB7CisgICAgICAgIGluZm8uc3VyZmFjZV90eXBlIHw9IEVHTF9XSU5ET1dfQklUOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZm8ubmF0aXZlX3Zpc3VhbF9pZCA9IDA7CisgICAgICAgIGluZm8ubmF0aXZlX3Zpc3VhbF90eXBlID0gRUdMX05PTkU7CisgICAgfQorICAgIGlmICh0bXAgJiBHTFhfUEJVRkZFUl9CSVQpIHsKKyAgICAgICAgaW5mby5zdXJmYWNlX3R5cGUgfD0gRUdMX1BCVUZGRVJfQklUOworICAgIH0KKworICAgIGluZm8uY2F2ZWF0ID0gMDsKKyAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZnJtdCwgR0xYX0NPTkZJR19DQVZFQVQsICZ0bXApKTsKKyAgICBpZiAodG1wID09IEdMWF9OT05FKSB7CisgICAgICAgIGluZm8uY2F2ZWF0ID0gRUdMX05PTkU7CisgICAgfSBlbHNlIGlmICh0bXAgPT0gR0xYX1NMT1dfQ09ORklHKSB7CisgICAgICAgIGluZm8uY2F2ZWF0ID0gRUdMX1NMT1dfQ09ORklHOworICAgIH0gZWxzZSBpZiAodG1wID09IEdMWF9OT05fQ09ORk9STUFOVF9DT05GSUcpIHsKKyAgICAgICAgaW5mby5jYXZlYXQgPSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHOworICAgIH0KKyAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgZHB5LCBmcm10LCBHTFhfTUFYX1BCVUZGRVJfV0lEVEgsICZpbmZvLm1heF9wYnVmZmVyX3dpZHRoKSk7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX01BWF9QQlVGRkVSX0hFSUdIVCwgJmluZm8ubWF4X3BidWZmZXJfaGVpZ2h0KSk7CisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX01BWF9QQlVGRkVSX0hFSUdIVCwgJmluZm8ubWF4X3BidWZmZXJfc2l6ZSkpOworCisgICAgRVhJVF9JRl9GQUxTRShnbFhHZXRGQkNvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRweSwgZnJtdCwgR0xYX0xFVkVMLCAmaW5mby5mcmFtZV9idWZmZXJfbGV2ZWwpKTsKKworICAgIEVYSVRfSUZfRkFMU0UoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkcHksIGZybXQsIEdMWF9GQkNPTkZJR19JRCwgJmluZm8uY29uZmlnX2lkKSk7CisKKyAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgZHB5LCBmcm10LCBHTFhfU0FNUExFUywgJmluZm8uc2FtcGxlc19wZXJfcGl4ZWwpKTsKKworICAgIC8vIEZpbHRlciBvdXQgY29uZmlncyB0aGF0IGRvIG5vdCBzdXBwb3J0IFJHQkEKKyAgICBFWElUX0lGX0ZBTFNFKGdsWEdldEZCQ29uZmlnQXR0cmliKGRweSwgZnJtdCwgR0xYX1JFTkRFUl9UWVBFLCAmdG1wKSk7CisgICAgaWYgKCEodG1wICYgR0xYX1JHQkFfQklUKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEZpbHRlciBvdXQgY29uZmlncyB0aGF0IGRvIG5vdCBzdXBwb3J0IGRlcHRoc3RlbmNpbCBidWZmZXJzCisgICAgLy8gRm9yIGRFUVAtR0xFUzIuZnVuY3Rpb25hbC5kZXB0aF9zdGVuY2lsX2NsZWFyCisgICAgLy8gYW5kIGRFUVAtR0xFUzIudXNlY2FzZXMuKgorICAgIGlmIChpbmZvLmRlcHRoX3NpemUgPT0gMCB8fCBpbmZvLnN0ZW5jaWxfc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbmZvLmZybXQgPSBuZXcgR2x4UGl4ZWxGb3JtYXQoZnJtdCk7CisKKyAgICAoKmFkZENvbmZpZ0Z1bmMpKGFkZENvbmZpZ09wYXF1ZSwgJmluZm8pOworfQorCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBFZ2xPUzo6U3VyZmFjZSBiYXNlZCBvbiBHTFguCitjbGFzcyBHbHhTdXJmYWNlIDogcHVibGljIEVnbE9TOjpTdXJmYWNlIHsKK3B1YmxpYzoKKyAgICBHbHhTdXJmYWNlKEdMWERyYXdhYmxlIGRyYXdhYmxlLCBTdXJmYWNlVHlwZSB0eXBlKSA6CisgICAgICAgICAgICBTdXJmYWNlKHR5cGUpLCBtRHJhd2FibGUoZHJhd2FibGUpIHt9CisKKyAgICBHTFhEcmF3YWJsZSBkcmF3YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmF3YWJsZTsgfQorCisgICAgLy8gSGVscGVyIHJvdXRpbmUgdG8gZG93bi1jYXN0IGFuIEVnbE9TOjpTdXJmYWNlIGFuZCBleHRyYWN0CisgICAgLy8gaXRzIGRyYXdhYmxlLgorICAgIHN0YXRpYyBHTFhEcmF3YWJsZSBkcmF3YWJsZUZvcihFZ2xPUzo6U3VyZmFjZSogc3VyZmFjZSkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8R2x4U3VyZmFjZSo+KHN1cmZhY2UpLT5kcmF3YWJsZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBHTFhEcmF3YWJsZSBtRHJhd2FibGUgPSAwOworfTsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgRWdsT1M6OkNvbnRleHQgYmFzZWQgb24gR0xYLgorY2xhc3MgR2x4Q29udGV4dCA6IHB1YmxpYyBFZ2xPUzo6Q29udGV4dCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgR2x4Q29udGV4dChHTFhDb250ZXh0IGNvbnRleHQpIDogbUNvbnRleHQoY29udGV4dCkge30KKworICAgIEdMWENvbnRleHQgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1Db250ZXh0OyB9CisKKyAgICBzdGF0aWMgR0xYQ29udGV4dCBjb250ZXh0Rm9yKEVnbE9TOjpDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxHbHhDb250ZXh0Kj4oY29udGV4dCktPmNvbnRleHQoKTsKKyAgICB9Citwcml2YXRlOgorICAgIEdMWENvbnRleHQgbUNvbnRleHQgPSBudWxscHRyOworfTsKKworLy8gSW1wbGVtZW50YXRpb24gb2YgRWdsT1M6OkRpc3BsYXkgYmFzZWQgb24gR0xYLgorY2xhc3MgR2x4RGlzcGxheSA6IHB1YmxpYyBFZ2xPUzo6RGlzcGxheSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgR2x4RGlzcGxheShYMTFEaXNwbGF5KiBkaXNwKSA6IG1EaXNwbGF5KGRpc3ApIHt9CisKKyAgICB2aXJ0dWFsIH5HbHhEaXNwbGF5KCkgeyBYQ2xvc2VEaXNwbGF5KG1EaXNwbGF5KTsgfQorCisgICAgdmlydHVhbCB2b2lkIHF1ZXJ5Q29uZmlncyhpbnQgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6QWRkQ29uZmlnQ2FsbGJhY2sqIGFkZENvbmZpZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhZGRDb25maWdPcGFxdWUpIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIEdMWEZCQ29uZmlnKiBmcm10TGlzdCA9IGdsWEdldEZCQ29uZmlncyhtRGlzcGxheSwgMCwgJm4pOworICAgICAgICBpZiAoZnJtdExpc3QpIHsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdFRvQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJhYmxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZybXRMaXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ29uZmlnRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZ09wYXF1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRnJlZShmcm10TGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZE5hdGl2ZVdpbihFZ2xPUzo6U3VyZmFjZSogd2luKSB7CisgICAgICAgIGlmICghd2luKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaXNWYWxpZE5hdGl2ZVdpbihHbHhTdXJmYWNlOjpkcmF3YWJsZUZvcih3aW4pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkTmF0aXZlV2luKEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luKSB7CisgICAgICAgIFdpbmRvdyByb290OworICAgICAgICBpbnQgdDsKKyAgICAgICAgdW5zaWduZWQgaW50IHU7CisgICAgICAgIEVycm9ySGFuZGxlciBoYW5kbGVyKG1EaXNwbGF5KTsKKyAgICAgICAgaWYgKCFYR2V0R2VvbWV0cnkobURpc3BsYXksIHdpbiwgJnJvb3QsICZ0LCAmdCwgJnUsICZ1LCAmdSwgJnUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0TGFzdEVycm9yKCkgPT0gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgY2hlY2tXaW5kb3dQaXhlbEZvcm1hdE1hdGNoKAorICAgICAgICAgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4sCisgICAgICAgICAgICBjb25zdCBFZ2xPUzo6UGl4ZWxGb3JtYXQqIHBpeGVsRm9ybWF0LAorICAgICAgICAgICAgdW5zaWduZWQgaW50KiB3aWR0aCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCogaGVpZ2h0KSB7CisgICAgICAgIC8vVE9ETzogdG8gY2hlY2sgd2hhdCBkb2VzIEFUSSAmIE5WSURJQSBlbmZvcmNlIG9uIHdpbiBwaXhlbGZvcm1hdAorICAgICAgICB1bnNpZ25lZCBpbnQgZGVwdGgsIGNvbmZpZ0RlcHRoLCBib3JkZXI7CisgICAgICAgIGludCByLCBnLCBiLCB4LCB5OworICAgICAgICBHTFhGQkNvbmZpZyBmYmNvbmZpZyA9IEdseFBpeGVsRm9ybWF0Ojpmcm9tKHBpeGVsRm9ybWF0KTsKKworICAgICAgICBJU19TVUNDRVNTKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgIG1EaXNwbGF5LCBmYmNvbmZpZywgR0xYX1JFRF9TSVpFLCAmcikpOworICAgICAgICBJU19TVUNDRVNTKGdsWEdldEZCQ29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgIG1EaXNwbGF5LCBmYmNvbmZpZywgR0xYX0dSRUVOX1NJWkUsICZnKSk7CisgICAgICAgIElTX1NVQ0NFU1MoZ2xYR2V0RkJDb25maWdBdHRyaWIoCisgICAgICAgICAgICAgICAgbURpc3BsYXksIGZiY29uZmlnLCBHTFhfQkxVRV9TSVpFLCAmYikpOworICAgICAgICBjb25maWdEZXB0aCA9IHIgKyBnICsgYjsKKyAgICAgICAgV2luZG93IHJvb3Q7CisgICAgICAgIGlmICghWEdldEdlb21ldHJ5KAorICAgICAgICAgICAgICAgIG1EaXNwbGF5LCB3aW4sICZyb290LCAmeCwgJnksIHdpZHRoLCBoZWlnaHQsICZib3JkZXIsICZkZXB0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVwdGggPj0gY29uZmlnRGVwdGg7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6Q29udGV4dCogY3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgIGNvbnN0IEVnbE9TOjpQaXhlbEZvcm1hdCogcGl4ZWxGb3JtYXQsCisgICAgICAgICAgICBFZ2xPUzo6Q29udGV4dCogc2hhcmVkQ29udGV4dCkgeworICAgICAgICBFcnJvckhhbmRsZXIgaGFuZGxlcihtRGlzcGxheSk7CisgICAgICAgIEdMWENvbnRleHQgY3R4ID0gZ2xYQ3JlYXRlTmV3Q29udGV4dCgKKyAgICAgICAgICAgICAgICBtRGlzcGxheSwKKyAgICAgICAgICAgICAgICBHbHhQaXhlbEZvcm1hdDo6ZnJvbShwaXhlbEZvcm1hdCksCisgICAgICAgICAgICAgICAgR0xYX1JHQkFfVFlQRSwKKyAgICAgICAgICAgICAgICBzaGFyZWRDb250ZXh0ID8gR2x4Q29udGV4dDo6Y29udGV4dEZvcihzaGFyZWRDb250ZXh0KSA6IE5VTEwsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisKKyAgICAgICAgaWYgKGhhbmRsZXIuZ2V0TGFzdEVycm9yKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBHbHhDb250ZXh0KGN0eCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGRlc3Ryb3lDb250ZXh0KEVnbE9TOjpDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICAgIGdsWERlc3Ryb3lDb250ZXh0KG1EaXNwbGF5LCBHbHhDb250ZXh0Ojpjb250ZXh0Rm9yKGNvbnRleHQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6U3VyZmFjZSogY3JlYXRlUGJ1ZmZlclN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBFZ2xPUzo6UGl4ZWxGb3JtYXQqIHBpeGVsRm9ybWF0LAorICAgICAgICAgICAgY29uc3QgRWdsT1M6OlBidWZmZXJJbmZvKiBpbmZvKSB7CisgICAgICAgIGNvbnN0IGludCBhdHRyaWJzW10gPSB7CisgICAgICAgICAgICBHTFhfUEJVRkZFUl9XSURUSCwgaW5mby0+d2lkdGgsCisgICAgICAgICAgICBHTFhfUEJVRkZFUl9IRUlHSFQsIGluZm8tPmhlaWdodCwKKyAgICAgICAgICAgIEdMWF9MQVJHRVNUX1BCVUZGRVIsIGluZm8tPmxhcmdlc3QsCisgICAgICAgICAgICBOb25lCisgICAgICAgIH07CisgICAgICAgIEdMWFBidWZmZXIgcGIgPSBnbFhDcmVhdGVQYnVmZmVyKAorICAgICAgICAgICAgICAgIG1EaXNwbGF5LAorICAgICAgICAgICAgICAgIEdseFBpeGVsRm9ybWF0Ojpmcm9tKHBpeGVsRm9ybWF0KSwKKyAgICAgICAgICAgICAgICBhdHRyaWJzKTsKKyAgICAgICAgcmV0dXJuIHBiID8gbmV3IEdseFN1cmZhY2UocGIsIEdseFN1cmZhY2U6OlBCVUZGRVIpIDogTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZVBidWZmZXIoRWdsT1M6OlN1cmZhY2UqIHBiKSB7CisgICAgICAgIGlmICghcGIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdsWERlc3Ryb3lQYnVmZmVyKG1EaXNwbGF5LCBHbHhTdXJmYWNlOjpkcmF3YWJsZUZvcihwYikpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgbWFrZUN1cnJlbnQoRWdsT1M6OlN1cmZhY2UqIHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpTdXJmYWNlKiBkcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6Q29udGV4dCogY29udGV4dCkgeworICAgICAgICBFcnJvckhhbmRsZXIgaGFuZGxlcihtRGlzcGxheSk7CisgICAgICAgIGJvb2wgcmV0dmFsID0gZmFsc2U7CisgICAgICAgIGlmICghY29udGV4dCAmJiAhcmVhZCAmJiAhZHJhdykgeworICAgICAgICAgICAgLy8gdW5iaW5kCisgICAgICAgICAgICByZXR2YWwgPSBnbFhNYWtlQ29udGV4dEN1cnJlbnQobURpc3BsYXksIDAsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbnRleHQgJiYgcmVhZCAmJiBkcmF3KSB7CisgICAgICAgICAgICByZXR2YWwgPSBnbFhNYWtlQ29udGV4dEN1cnJlbnQoCisgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICBHbHhTdXJmYWNlOjpkcmF3YWJsZUZvcihkcmF3KSwKKyAgICAgICAgICAgICAgICAgICAgR2x4U3VyZmFjZTo6ZHJhd2FibGVGb3IocmVhZCksCisgICAgICAgICAgICAgICAgICAgIEdseENvbnRleHQ6OmNvbnRleHRGb3IoY29udGV4dCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoaGFuZGxlci5nZXRMYXN0RXJyb3IoKSA9PSAwKSAmJiByZXR2YWw7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHN3YXBCdWZmZXJzKEVnbE9TOjpTdXJmYWNlKiBzcmZjKSB7CisgICAgICAgIGlmIChzcmZjKSB7CisgICAgICAgICAgICBnbFhTd2FwQnVmZmVycyhtRGlzcGxheSwgR2x4U3VyZmFjZTo6ZHJhd2FibGVGb3Ioc3JmYykpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIFgxMURpc3BsYXkqIG1EaXNwbGF5ID0gbnVsbHB0cjsKK307CisKK2NsYXNzIEdseExpYnJhcnkgOiBwdWJsaWMgR2xMaWJyYXJ5IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEdsRnVuY3Rpb25Qb2ludGVyIChSZXNvbHZlckZ1bmMpKGNvbnN0IGNoYXIqIG5hbWUpOworCisgICAgLy8gSW1wb3J0YW50OiBVc2UgbGliR0wuc28uMSBleHBsaWNpdGx5LCBiZWNhdXNlIGl0IHdpbGwgYWx3YXlzIGxpbmsgdG8KKyAgICAvLyB0aGUgdmVuZG9yLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIGxpYkdMLnNvIG1pZ2h0IGluIHNvbWUKKyAgICAvLyBjYXNlcywgZGVwZW5kaW5nIG9uIGJhZCBsZGNvbmZpZyBjb25maWd1cmF0aW9ucywgbGluayB0byB0aGUgd3JhcHBlcgorICAgIC8vIGxpYiB0aGF0IGRvZXNuJ3QgYmVoYXZlIHRoZSBzYW1lLgorICAgIEdseExpYnJhcnkoKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGtMaWJOYW1lW10gPSAibGliR0wuc28uMSI7CisgICAgICAgIGNoYXIgZXJyb3JbMjU2XTsKKyAgICAgICAgbUxpYiA9IGVtdWdsOjpTaGFyZWRMaWJyYXJ5OjpvcGVuKGtMaWJOYW1lLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgICAgIGlmICghbUxpYikgeworICAgICAgICAgICAgRVJSKCIlczogQ291bGQgbm90IG9wZW4gR0wgbGlicmFyeSAlcyBbJXNdXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywga0xpYk5hbWUsIGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBOT1RFOiBEb24ndCB1c2UgZ2xYR2V0UHJvY0FkZHJlc3MgaGVyZSwgb25seSBnbFhHZXRQcm9jQWRkcmVzc0FSQgorICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBieSB2ZW5kb3Itc3BlY2lmaWMgbGlicmFyaWVzLgorICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrUmVzb2x2ZXJOYW1lW10gPSAiZ2xYR2V0UHJvY0FkZHJlc3NBUkIiOworICAgICAgICBtUmVzb2x2ZXIgPSByZWludGVycHJldF9jYXN0PFJlc29sdmVyRnVuYyo+KAorICAgICAgICAgICAgICAgIG1MaWItPmZpbmRTeW1ib2woa1Jlc29sdmVyTmFtZSkpOworICAgICAgICBpZiAoIW1SZXNvbHZlcikgeworICAgICAgICAgICAgRVJSKCIlczogQ291bGQgbm90IGZpbmQgcmVzb2x2ZXIgJXMgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBrUmVzb2x2ZXJOYW1lLCBrTGliTmFtZSk7CisgICAgICAgICAgICBkZWxldGUgbUxpYjsKKyAgICAgICAgICAgIG1MaWIgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgfkdseExpYnJhcnkoKSB7CisgICAgICAgIGRlbGV0ZSBtTGliOworICAgIH0KKworICAgIC8vIG92ZXJyaWRlCisgICAgdmlydHVhbCBHbEZ1bmN0aW9uUG9pbnRlciBmaW5kU3ltYm9sKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICAgICAgaWYgKCFtTGliKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBHbEZ1bmN0aW9uUG9pbnRlciByZXQgPSAoKm1SZXNvbHZlcikobmFtZSk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICByZXQgPSByZWludGVycHJldF9jYXN0PEdsRnVuY3Rpb25Qb2ludGVyPihtTGliLT5maW5kU3ltYm9sKG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBlbXVnbDo6U2hhcmVkTGlicmFyeSogbUxpYiA9IG51bGxwdHI7CisgICAgUmVzb2x2ZXJGdW5jKiBtUmVzb2x2ZXIgPSBudWxscHRyOworfTsKKworY2xhc3MgR2x4RW5naW5lIDogcHVibGljIEVnbE9TOjpFbmdpbmUgeworcHVibGljOgorICAgIHZpcnR1YWwgRWdsT1M6OkRpc3BsYXkqIGdldERlZmF1bHREaXNwbGF5KCkgeworICAgICAgICByZXR1cm4gbmV3IEdseERpc3BsYXkoWE9wZW5EaXNwbGF5KDApKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEdsTGlicmFyeSogZ2V0R2xMaWJyYXJ5KCkgeworICAgICAgICByZXR1cm4gJm1HbExpYjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEVnbE9TOjpTdXJmYWNlKiBjcmVhdGVXaW5kb3dTdXJmYWNlKEVHTE5hdGl2ZVdpbmRvd1R5cGUgd25kKSB7CisgICAgICAgIHJldHVybiBuZXcgR2x4U3VyZmFjZSh3bmQsIEdseFN1cmZhY2U6OldJTkRPVyk7CisgICAgfQorcHJpdmF0ZToKKyAgICBHbHhMaWJyYXJ5IG1HbExpYjsKK307CisKK2VtdWdsOjpMYXp5SW5zdGFuY2U8R2x4RW5naW5lPiBzSG9zdEVuZ2luZSA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworRWdsT1M6OkVuZ2luZSogRWdsT1M6OkVuZ2luZTo6Z2V0SG9zdEluc3RhbmNlKCkgeworICAgIHJldHVybiBzSG9zdEVuZ2luZS5wdHIoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsT3NBcGlfd2dsLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsT3NBcGlfd2dsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NmU5NDI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xPc0FwaV93Z2wuY3BwCkBAIC0wLDAgKzEsMTA2NyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc2hhcmVkX2xpYnJhcnkuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vdGhyZWFkX3N0b3JlLmgiCisjaW5jbHVkZSAiR0xjb21tb24vR0xMaWJyYXJ5LmgiCisKKyNpbmNsdWRlICJPcGVuZ2xDb2RlY0NvbW1vbi9FcnJvckxvZy5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmdkaS5oPgorCisjaW5jbHVkZSA8R0xFUy9nbHBsYXRmb3JtLmg+CisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNpbmNsdWRlIDxHTC93Z2xleHQuaD4KKworI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIElTX1RSVUUoYSkgXAorICAgICAgICBkbyB7IGlmICghKGEpKSByZXR1cm4gTlVMTDsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFWElUX0lGX0ZBTFNFKGEpIFwKKyAgICAgICAgZG8geyBpZiAoIShhKSkgcmV0dXJuOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFQlVHIDAKKyNpZiBERUJVRworI2RlZmluZSBEKC4uLikgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworbmFtZXNwYWNlIHsKKwordXNpbmcgZW11Z2w6OlNoYXJlZExpYnJhcnk7Cit0eXBlZGVmIEdsTGlicmFyeTo6R2xGdW5jdGlvblBvaW50ZXIgR2xGdW5jdGlvblBvaW50ZXI7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBhbiBleHRlbnNpb24gaXMgaW5jbHVkZSBpbiBhIGdpdmVuIGV4dGVuc2lvbiBsaXN0LgorLy8gfGV4dGVuc2lvbnwgaXMgYW4gR0wgZXh0ZW5zaW9uIG5hbWUuCisvLyB8ZXh0ZW5zaW9uTGlzdHwgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBzdXBwb3J0ZWQgZXh0ZW5zaW9uLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBmYWxzZSBvdGhlcndpc2UuCitib29sIHN1cHBvcnRzRXh0ZW5zaW9uKGNvbnN0IGNoYXIqIGV4dGVuc2lvbiwgY29uc3QgY2hhciogZXh0ZW5zaW9uTGlzdCkgeworICAgIHNpemVfdCBleHRlbnNpb25MZW4gPSA6OnN0cmxlbihleHRlbnNpb24pOworICAgIGNvbnN0IGNoYXIqIGxpc3QgPSBleHRlbnNpb25MaXN0OworICAgIGZvciAoOzspIHsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGNvbnN0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6c3Ryc3RyKGxpc3QsIGV4dGVuc2lvbikpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBleHRlbnNpb24gYXBwZWFycyBhcyBhIHNpbmdsZSB3b3JkIGluIHRoZSBsaXN0CisgICAgICAgIC8vIGkuZS4gdGhhdCBpdCBpcyB3cmFwcGVkIGJ5IGVpdGhlciBzcGFjZXMgb3IgdGhlIHN0YXJ0L2VuZCBvZgorICAgICAgICAvLyB0aGUgbGlzdC4KKyAgICAgICAgaWYgKChwID09IGV4dGVuc2lvbkxpc3QgfHwgcFstMV0gPT0gJyAnKSAmJgorICAgICAgICAgICAgKHBbZXh0ZW5zaW9uTGVuXSA9PSAnXDAnIHx8IHBbZXh0ZW5zaW9uTGVuXSA9PSAnICcpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBvdGhlcndpc2UsIHNraXAgb3ZlciB0aGUgY3VycmVudCBwb3NpdGlvbiB0byBmaW5kIHNvbWV0aGluZyBlbHNlLgorICAgICAgICBwICs9IGV4dGVuc2lvbkxlbjsKKyAgICB9Cit9CisKKy8vLy8vCisvLy8vLyAgVyBHIEwgICBEIEkgUyBQIEEgVCBDIEggICBUIEEgQiBMIEUgUworLy8vLy8KKworLy8gQSB0ZWNobmljYWwgbm90ZSB0byBleHBsYWluIHdoYXQgaXMgZ29pbmcgaGVyZSwgdHJ1c3QgbWUsIGl0J3MgaW1wb3J0YW50LgorLy8KKy8vIEkuIExpYnJhcnktZGVwZW5kZW50IHN5bWJvbCByZXNvbHV0aW9uOgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVGhlIGNvZGUgaGVyZSBjYW4gZGVhbCB3aXRoIHR3byBraW5kcyBvZiBPcGVuR0wgV2luZG93cyBsaWJyYXJpZXM6IHRoZQorLy8gc3lzdGVtLXByb3ZpZGVkIG9wZW5nbDMyLmRsbCwgb3IgYWx0ZXJuYXRlIHNvZnR3YXJlIHJlbmRlcmVycyBsaWtlIE1lc2EKKy8vIChlLmcuIG1lc2Ffb3BlbmdsMzIuZGxsKS4KKy8vCisvLyBXaGVuIHVzaW5nIHRoZSBzeXN0ZW0gbGlicmFyeSwgcGl4ZWwtZm9ybWF0IHJlbGF0ZWQgZnVuY3Rpb25zLCBsaWtlCisvLyBTZXRQaXhlbEZvcm1hdCgpLCBhcmUgcHJvdmlkZWQgYnkgZ2RpMzIuZGxsLCBhbmQgX25vdF8gb3BlbmdsMzIuZGxsCisvLyAoZXZlbiB0aG91Z2ggdGhleSBhcmUgZG9jdW1lbnRlZCBhcyBwYXJ0IG9mIHRoZSBXaW5kb3dzIEdMIEFQSSkuCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIG11c3QgX25vdF8gYmUgdXNlZCB3aGVuIHVzaW5nIGFsdGVybmF0aXZlIHJlbmRlcmVycy4KKy8vIEluc3RlYWQsIHRoZXNlIHByb3ZpZGUgX3VuZG9jdW1lbnRlZF8gYWx0ZXJuYXRpdmVzIHdpdGggdGhlICd3Z2wnIHByZWZpeCwKKy8vIGFzIGluIHdnbFNldFBpeGVsRm9ybWF0KCksIHdnbERlc2NyaWJlUGl4ZWxGb3JtYXQoKSwgZXRjLi4uIHdoaWNoCisvLyBpbXBsZW1lbnQgdGhlIHNhbWUgY2FsbGluZyBjb252ZW50aW9ucy4KKy8vCisvLyBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoaXMsIHNlZSA1LjE5MCBvZiB0aGUgV2luZG93cyBPcGVuR0wgRkFRIGF0OgorLy8gaHR0cHM6Ly93d3cub3BlbmdsLm9yZy9hcmNoaXZlcy9yZXNvdXJjZXMvZmFxL3RlY2huaWNhbC9tc3dpbmRvd3MuaHRtCisvLworLy8gQW5vdGhlciBnb29kIHNvdXJjZSBvZiBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljOgorLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yMDY0NTcwNi93aHktYXJlLWZ1bmN0aW9ucy1kdXBsaWNhdGVkLWJldHdlZW4tb3BlbmdsMzItZGxsLWFuZC1nZGkzMi1kbGwKKy8vCisvLyBJbiBwcmFjdGljZSwgaXQgbWVhbnMgdGhhdCB0aGUgY29kZSBoZXJlIHNob3VsZCByZXNvbHZlICduYWtlZCcgc3ltYm9scworLy8gKGUuZy4gJ0dldFBpeGVsRm9ybWF0KCkpIHdoZW4gdXNpbmcgdGhlIHN5c3RlbSBsaWJyYXJ5LCBhbmQgJ3ByZWZpeGVkJyBvbmVzCisvLyAoZS5nLiAnd2dsR2V0UGl4ZWxGb3JtYXQoKSkgb3RoZXJ3aXNlLgorLy8KKworLy8gTGlzdCBvZiBXR0wgZnVuY3Rpb25zIG9mIGludGVyZXN0IHRvIHByb2JlIHdpdGggR2V0UHJvY0FkZHJlc3MoKQorI2RlZmluZSBMSVNUX1dHTF9GVU5DVElPTlMoWCkgXAorICAgIFgoSEdMUkMsIHdnbENyZWF0ZUNvbnRleHQsIChIREMgaGRjKSkgXAorICAgIFgoQk9PTCwgd2dsRGVsZXRlQ29udGV4dCwgKEhHTFJDIGhnbHJjKSkgXAorICAgIFgoQk9PTCwgd2dsTWFrZUN1cnJlbnQsIChIREMgaGRjLCBIR0xSQyBoZ2xyYykpIFwKKyAgICBYKEJPT0wsIHdnbFNoYXJlTGlzdHMsIChIR0xSQyBoZ2xyYzEsIEhHTFJDIGhnbHJjMikpIFwKKyAgICBYKEhHTFJDLCB3Z2xHZXRDdXJyZW50Q29udGV4dCwgKHZvaWQpKSBcCisgICAgWChIREMsIHdnbEdldEN1cnJlbnREQywgKHZvaWQpKSBcCisgICAgWChHbEZ1bmN0aW9uUG9pbnRlciwgd2dsR2V0UHJvY0FkZHJlc3MsIChjb25zdCBjaGFyKiBmdW5jdGlvbk5hbWUpKSBcCisKKy8vIExpc3Qgb2YgV0dMIGZ1bmN0aW9ucyBleHBvcnRlZCBieSBHREkzMiB0aGF0IG11c3QgYmUgdXNlZCB3aGVuIHVzaW5nCisvLyB0aGUgc3lzdGVtJ3Mgb3BlbmdsMzIuZGxsIG9ubHksIGkuZS4gbm90IHdpdGggYSBzb2Z0d2FyZSByZW5kZXJlciBsaWtlCisvLyBNZXNhLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDUuMTkwIGF0OgorLy8gQW5kIGFsc286CisjZGVmaW5lIExJU1RfR0RJMzJfRlVOQ1RJT05TKFgpIFwKKyAgICBYKGludCwgQ2hvb3NlUGl4ZWxGb3JtYXQsIChIREMgaGRjLCBjb25zdCBQSVhFTEZPUk1BVERFU0NSSVBUT1IqIHBwZmQpKSBcCisgICAgWChCT09MLCBTZXRQaXhlbEZvcm1hdCwgKEhEQyBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGNvbnN0IFBJWEVMRk9STUFUREVTQ1JJUFRPUiogcGZkKSkgXAorICAgIFgoaW50LCBHZXRQaXhlbEZvcm1hdCwgKEhEQyBoZGMpKSBcCisgICAgWChpbnQsIERlc2NyaWJlUGl4ZWxGb3JtYXQsIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBVSU5UIG5ieXRlcywgTFBQSVhFTEZPUk1BVERFU0NSSVBUT1IgcHBmZCkpIFwKKyAgICBYKEJPT0wsIFN3YXBCdWZmZXJzLCAoSERDIGhkYykpIFwKKworLy8gRGVjbGFyZSBhIHN0cnVjdHVyZSBjb250YWluaW5nIHBvaW50ZXJzIHRvIGFsbCBmdW5jdGlvbnMgbGlzdGVkIGFib3ZlLAorLy8gYW5kIGEgd2F5IHRvIGluaXRpYWxpemUgdGhlbS4KK3N0cnVjdCBXZ2xCYXNlRGlzcGF0Y2ggeworICAgIC8vIGRlY2xhcmUgYWxsIGZ1bmN0aW9uIHBvaW50ZXJzLCBmb2xsb3dlZCBieSBhIGR1bW15IG1lbWJlciB1c2VkCisgICAgLy8gdG8gdGVybWluYXRlIHRoZSBjb25zdHJ1Y3RvcidzIGluaXRpYWxpemF0aW9uIGxpc3QgcHJvcGVybHkuCisjZGVmaW5lIERFQ0xBUkVfV0dMX1BPSU5URVIocmV0dXJuX3R5cGUsIGZ1bmN0aW9uX25hbWUsIHNpZ25hdHVyZSkgXAorICAgIHJldHVybl90eXBlIChHTF9BUElFTlRSWSogZnVuY3Rpb25fbmFtZSkgc2lnbmF0dXJlOworICAgIExJU1RfV0dMX0ZVTkNUSU9OUyhERUNMQVJFX1dHTF9QT0lOVEVSKQorICAgIExJU1RfR0RJMzJfRlVOQ1RJT05TKERFQ0xBUkVfV0dMX1BPSU5URVIpCisgICAgU2hhcmVkTGlicmFyeSogbUxpYiA9IG51bGxwdHI7CisgICAgYm9vbCBtSXNTeXN0ZW1MaWIgPSBmYWxzZTsKKworICAgIC8vIERlZmF1bHQgQ29uc3RydWN0b3IKKyAgICBXZ2xCYXNlRGlzcGF0Y2goKSA6CisjZGVmaW5lIElOSVRfV0dMX1BPSU5URVIocmV0dXJuX3R5cGUsIGZ1bmN0aW9uX25hbWUsIHNpZ25hdHVyZSkgXAorICAgIGZ1bmN0aW9uX25hbWUoKSwKKyAgICAgICAgICAgIExJU1RfV0dMX0ZVTkNUSU9OUyhJTklUX1dHTF9QT0lOVEVSKQorICAgICAgICAgICAgTElTVF9HREkzMl9GVU5DVElPTlMoSU5JVF9XR0xfUE9JTlRFUikKKyAgICAgICAgICAgIG1Jc1N5c3RlbUxpYihmYWxzZSkge30KKworICAgIC8vIENvcHkgY29uc3RydWN0b3IKKyAgICBXZ2xCYXNlRGlzcGF0Y2goY29uc3QgV2dsQmFzZURpc3BhdGNoJiBvdGhlcikgOgorI2RlZmluZSBDT1BZX1dHTF9QT0lOVEVSKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUpIFwKKyAgICBmdW5jdGlvbl9uYW1lKG90aGVyLmZ1bmN0aW9uX25hbWUpLAorICAgICAgICAgICAgTElTVF9XR0xfRlVOQ1RJT05TKENPUFlfV0dMX1BPSU5URVIpCisgICAgICAgICAgICBMSVNUX0dESTMyX0ZVTkNUSU9OUyhDT1BZX1dHTF9QT0lOVEVSKQorICAgICAgICAgICAgbUxpYihvdGhlci5tTGliKSwKKyAgICAgICAgICAgIG1Jc1N5c3RlbUxpYihvdGhlci5tSXNTeXN0ZW1MaWIpIHt9CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBkaXNwYXRjaCB0YWJsZSBmcm9tIHNoYXJlZCBsaWJyYXJ5IHxnbExpYnwsIHdoaWNoCisgICAgLy8gbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIHN5c3RlbSBvciBub24tc3lzdGVtIG9wZW5nbDMyLmRsbAorICAgIC8vIGltcGxlbWVudGF0aW9uLiBJZiB8c3lzdGVtTGlifCBpcyB0cnVlLCB0aGlzIGNvbnNpZGVycyB0aGUgbGlicmFyeQorICAgIC8vIHRvIGJlIHRoZSBzeXN0ZW0gb25lLCBhbmQgd2lsbCB0cnkgdG8gZmluZCB0aGUgR0RJMzIgZnVuY3Rpb25zCisgICAgLy8gbGlrZSBHZXRQaXhlbEZvcm1hdCgpIGRpcmVjdGx5LiBJZiB8c3lzdGVtTGlifCBpcyBmYWxzZSwgdGhpcyB3aWxsCisgICAgLy8gdHJ5IHRvIGxvYWQgdGhlIHdnbFhYWCB2YXJpYW50cyAoZS5nLiBmb3IgTWVzYSkuIFNlZSB0ZWNobmljYWwgbm90ZQorICAgIC8vIGFib3ZlIGZvciBkZXRhaWxzLgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UgKGkuZS4gaWYgb25lIG9mIHRoZQorICAgIC8vIHJlcXVpcmVkIHN5bWJvbHMgY291bGQgbm90IGJlIGxvYWRlZCkuCisgICAgYm9vbCBpbml0KFNoYXJlZExpYnJhcnkqIGdsTGliLCBib29sIHN5c3RlbUxpYikgeworICAgICAgICBib29sIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgbUxpYiA9IGdsTGliOworICAgICAgICBtSXNTeXN0ZW1MaWIgPSBzeXN0ZW1MaWI7CisKKyNkZWZpbmUgTE9BRF9XR0xfUE9JTlRFUihyZXR1cm5fdHlwZSwgZnVuY3Rpb25fbmFtZSwgc2lnbmF0dXJlKSBcCisgICAgdGhpcy0+ZnVuY3Rpb25fbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IFwKKyAgICAgICAgICAgIHJldHVybl90eXBlIChHTF9BUElFTlRSWSopIHNpZ25hdHVyZT4oIFwKKyAgICAgICAgICAgICAgICAgICAgZ2xMaWItPmZpbmRTeW1ib2woI2Z1bmN0aW9uX25hbWUpKTsgXAorICAgIGlmICghdGhpcy0+ZnVuY3Rpb25fbmFtZSkgeyBcCisgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBmaW5kICVzIGluIEdMIGxpYnJhcnlcbiIsIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgICAgICNmdW5jdGlvbl9uYW1lKTsgXAorICAgICAgICByZXN1bHQgPSBmYWxzZTsgXAorICAgIH0KKworI2RlZmluZSBMT0FEX1dHTF9HREkzMl9QT0lOVEVSKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUpIFwKKyAgICB0aGlzLT5mdW5jdGlvbl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDwgXAorICAgICAgICAgICAgcmV0dXJuX3R5cGUgKEdMX0FQSUVOVFJZKikgc2lnbmF0dXJlPiggXAorICAgICAgICAgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyhnZGkzMiwgI2Z1bmN0aW9uX25hbWUpKTsgXAorICAgIGlmICghdGhpcy0+ZnVuY3Rpb25fbmFtZSkgeyBcCisgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBmaW5kICVzIGluIEdESTMyIGxpYnJhcnlcbiIsIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgICAgICNmdW5jdGlvbl9uYW1lKTsgXAorICAgICAgICByZXN1bHQgPSBmYWxzZTsgXAorICAgIH0KKworI2RlZmluZSBMT0FEX1dHTF9JTk5FUl9QT0lOVEVSKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUpIFwKKyAgICB0aGlzLT5mdW5jdGlvbl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDwgXAorICAgICAgICAgICAgcmV0dXJuX3R5cGUgKEdMX0FQSUVOVFJZKikgc2lnbmF0dXJlPiggXAorICAgICAgICAgICAgICAgICAgICBnbExpYi0+ZmluZFN5bWJvbCgid2dsIiAjZnVuY3Rpb25fbmFtZSkpOyBcCisgICAgaWYgKCF0aGlzLT5mdW5jdGlvbl9uYW1lKSB7IFwKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IGZpbmQgJXMgaW4gR0wgbGlicmFyeVxuIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAgICAgIndnbCIgI2Z1bmN0aW9uX25hbWUpOyBcCisgICAgICAgIHJlc3VsdCA9IGZhbHNlOyBcCisgICAgfQorCisgICAgICAgIExJU1RfV0dMX0ZVTkNUSU9OUyhMT0FEX1dHTF9QT0lOVEVSKQorICAgICAgICBpZiAoc3lzdGVtTGliKSB7CisgICAgICAgICAgICBITU9EVUxFIGdkaTMyID0gR2V0TW9kdWxlSGFuZGxlKCJnZGkzMi5kbGwiKTsKKyAgICAgICAgICAgIExJU1RfR0RJMzJfRlVOQ1RJT05TKExPQURfV0dMX0dESTMyX1BPSU5URVIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMSVNUX0dESTMyX0ZVTkNUSU9OUyhMT0FEX1dHTF9JTk5FUl9QT0lOVEVSKQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gRmluZCBhIGZ1bmN0aW9uLCB1c2luZyB3Z2xHZXRQcm9jQWRkcmVzcygpIGZpcnN0LCBhbmQgaWYgdGhhdCBkb2Vzbid0CisgICAgLy8gd29yaywgU2hhcmVkTGlicmFyeTo6ZmluZFN5bWJvbCgpLgorICAgIC8vIHxmdW5jdGlvbk5hbWV8IGlzIHRoZSBmdW5jdGlvbiBuYW1lLgorICAgIC8vIHxnbExpYnwgaXMgdGhlIEdMIGxpYnJhcnkgdG8gcHJvYmUgd2l0aCBmaW5kU3ltYm9sKCkgaXMgbmVlZGVkLgorICAgIEdsRnVuY3Rpb25Qb2ludGVyIGZpbmRGdW5jdGlvbihjb25zdCBjaGFyKiBmdW5jdGlvbk5hbWUpIGNvbnN0IHsKKyAgICAgICAgR2xGdW5jdGlvblBvaW50ZXIgcmVzdWx0ID0gdGhpcy0+d2dsR2V0UHJvY0FkZHJlc3MoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgbUxpYikgeworICAgICAgICAgICAgcmVzdWx0ID0gbUxpYi0+ZmluZFN5bWJvbChmdW5jdGlvbk5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfTsKKworLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IGNyZWF0ZUR1bW15V2luZG93KCkuCitMUkVTVUxUIENBTExCQUNLIGR1bW15V25kUHJvYyhIV05EIGh3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHVNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEFSQU0gd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkgeworICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKK30KKworLy8gQ3JlYXRlIGEgbmV3IGR1bW15IHdpbmRvdywgYW5kIHJldHVybiBpdHMgaGFuZGxlLgorLy8gTm90ZSB0aGF0IHRoZSB3aW5kb3cgaXMgMXgxIHBpeGVscyBhbmQgbm90IHZpc2libGUsIGJ1dAorLy8gaXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgZGV2aWNlIGNvbnRleHQgYW5kIGFzc29jaWF0ZWQKKy8vIE9wZW5HTCByZW5kZXJpbmcgY29udGV4dC4gUmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KK0hXTkQgY3JlYXRlRHVtbXlXaW5kb3coKSB7CisgICAgV05EQ0xBU1NFWCB3Y3g7CisgICAgd2N4LmNiU2l6ZSA9IHNpemVvZih3Y3gpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBvZiBzdHJ1Y3R1cmUKKyAgICB3Y3guc3R5bGUgPSBDU19PV05EQyB8IENTX0hSRURSQVcgfCBDU19WUkVEUkFXOyAvLyByZWRyYXcgaWYgc2l6ZSBjaGFuZ2VzCisgICAgd2N4LmxwZm5XbmRQcm9jID0gZHVtbXlXbmRQcm9jOyAgICAgICAgICAgICAgICAgLy8gcG9pbnRzIHRvIHdpbmRvdyBwcm9jZWR1cmUKKyAgICB3Y3guY2JDbHNFeHRyYSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBleHRyYSBjbGFzcyBtZW1vcnkKKyAgICB3Y3guY2JXbmRFeHRyYSA9IHNpemVvZih2b2lkKik7ICAgICAgICAgICAgICAgICAvLyBzYXZlIGV4dHJhIHdpbmRvdyBtZW1vcnksIHRvIHN0b3JlIFZhc1dpbmRvdyBpbnN0YW5jZQorICAgIHdjeC5oSW5zdGFuY2UgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0byBpbnN0YW5jZQorICAgIHdjeC5oSWNvbiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRlZmluZWQgYXBwLiBpY29uCisgICAgd2N4LmhDdXJzb3IgPSBOVUxMOworICAgIHdjeC5oYnJCYWNrZ3JvdW5kID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJhY2tncm91bmQgYnJ1c2gKKyAgICB3Y3gubHBzek1lbnVOYW1lID0gIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBuYW1lIG9mIG1lbnUgcmVzb3VyY2UKKyAgICB3Y3gubHBzekNsYXNzTmFtZSA9ICJEdW1teVdpbiI7ICAgICAgICAgICAgICAgICAvLyBuYW1lIG9mIHdpbmRvdyBjbGFzcworICAgIHdjeC5oSWNvblNtID0gKEhJQ09OKSBOVUxMOyAgICAgICAgICAgICAgICAgICAgIC8vIHNtYWxsIGNsYXNzIGljb24KKworICAgIFJlZ2lzdGVyQ2xhc3NFeCgmd2N4KTsKKworICAgIEhXTkQgaHduZCA9IENyZWF0ZVdpbmRvd0V4KFdTX0VYX0NMSUVOVEVER0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1bW15V2luIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRHVtbXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTX1BPUFVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCk7CisgICAgcmV0dXJuIGh3bmQ7Cit9CisKKy8vIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIFdHTF9BUkJfZXh0ZW5zaW9uc19zdHJpbmcgZXh0ZW5zaW9uLgorI2RlZmluZSBMSVNUX1dHTF9BUkJfZXh0ZW5zaW9uc19zdHJpbmdfRlVOQ1RJT05TKFgpIFwKKyAgICBYKGNvbnN0IGNoYXIqLCB3Z2xHZXRFeHRlbnNpb25zU3RyaW5nQVJCLCAoSERDIGhkYykpCisKKy8vIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIFdHTF9BUkJfcGl4ZWxfZm9ybWF0IGV4dGVuc2lvbi4KKyNkZWZpbmUgTElTVF9XR0xfQVJCX3BpeGVsX2Zvcm1hdF9GVU5DVElPTlMoWCkgXAorICAgIFgoQk9PTCwgd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQiwgKEhEQyBoZGMsIGludCBpUGl4ZWxGb3JtYXQsIGludCBpTGF5ZXJQbGFuZSwgVUlOVCBuQXR0cmlidXRlcywgY29uc3QgaW50KiBwaUF0dHJpYnV0ZXMsIGludCogcGlWYWx1ZXMpKSBcCisgICAgWChCT09MLCB3Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYmZ2QVJCLCAoSERDIGhkYywgaW50IGlQaXhlbEZvcm1hdCwgaW50IGlMYXllclBsYW5lLCBVSU5UIG5BdHRyaWJ1dGVzLCBjb25zdCBpbnQqIHBpQXR0cmlidXRlcywgRkxPQVQqIHBmVmFsdWVzKSkgXAorICAgIFgoQk9PTCwgd2dsQ2hvb3NlUGl4ZWxGb3JtYXRBUkIsIChIREMsIGNvbnN0IGludCogcGlBdHRyaWJMaXN0LCBjb25zdCBGTE9BVCogcGZBdHRyaWJMaXN0LCBVSU5UIG5NYXhGb3JtYXRzLCBpbnQqIHBpRm9ybWF0cywgVUlOVCogbk51bUZvcm1hdHMpKSBcCisKKy8vIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgYnkgdGhlIFdHTF9BUkJfbWFrZV9jdXJyZW50X3JlYWQgZXh0ZW5zaW9uLgorI2RlZmluZSBMSVNUX1dHTF9BUkJfbWFrZV9jdXJyZW50X3JlYWRfRlVOQ1RJT05TKFgpIFwKKyAgICBYKEJPT0wsIHdnbE1ha2VDb250ZXh0Q3VycmVudEFSQiwgKEhEQyBoRHJhd0RDLCBIREMgaFJlYWREQywgSEdMUkMgaGdscmMpKSBcCisgICAgWChIREMsIHdnbEdldEN1cnJlbnRSZWFkRENBUkIsICh2b2lkKSkgXAorCisvLyBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBXR0xfQVJCX3BidWZmZXIgZXh0ZW5zaW9uLgorI2RlZmluZSBMSVNUX1dHTF9BUkJfcGJ1ZmZlcl9GVU5DVElPTlMoWCkgXAorICAgIFgoSFBCVUZGRVJBUkIsIHdnbENyZWF0ZVBidWZmZXJBUkIsIChIREMgaGRjLCBpbnQgaVBpeGVsRm9ybWF0LCBpbnQgaVdpZHRoLCBpbnQgaUhlaWdodCwgY29uc3QgaW50KiBwaUF0dHJpYkxpc3QpKSBcCisgICAgWChIREMsIHdnbEdldFBidWZmZXJEQ0FSQiwgKEhQQlVGRkVSQVJCIGhQYnVmZmVyKSkgXAorICAgIFgoaW50LCB3Z2xSZWxlYXNlUGJ1ZmZlckRDQVJCLCAoSFBCVUZGRVJBUkIgaFBidWZmZXIsIEhEQyBoZGMpKSBcCisgICAgWChCT09MLCB3Z2xEZXN0cm95UGJ1ZmZlckFSQiwgKEhQQlVGRkVSQVJCIGhQYnVmZmVyKSkgXAorCisjZGVmaW5lIExJU1RfV0dMX0VYVEVOU0lPTlNfRlVOQ1RJT05TKFgpIFwKKyAgICBMSVNUX1dHTF9BUkJfcGl4ZWxfZm9ybWF0X0ZVTkNUSU9OUyhYKSBcCisgICAgTElTVF9XR0xfQVJCX21ha2VfY3VycmVudF9yZWFkX0ZVTkNUSU9OUyhYKSBcCisgICAgTElTVF9XR0xfQVJCX3BidWZmZXJfRlVOQ1RJT05TKFgpIFwKKworLy8gQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHBvaW50ZXJzIHRvIFdHTCBleHRlbnNpb24gZnVuY3Rpb25zLgorc3RydWN0IFdnbEV4dGVuc2lvbnNEaXNwYXRjaCA6IHB1YmxpYyBXZ2xCYXNlRGlzcGF0Y2ggeworcHVibGljOgorICAgIExJU1RfV0dMX0VYVEVOU0lPTlNfRlVOQ1RJT05TKERFQ0xBUkVfV0dMX1BPSU5URVIpCisgICAgaW50IGR1bW15OworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IFdnbEV4dGVuc2lvbnNEaXNwYXRjaChjb25zdCBXZ2xCYXNlRGlzcGF0Y2gmIGJhc2VEaXNwYXRjaCkgOgorICAgICAgICAgICAgV2dsQmFzZURpc3BhdGNoKGJhc2VEaXNwYXRjaCksCisgICAgICAgICAgICBMSVNUX1dHTF9FWFRFTlNJT05TX0ZVTkNUSU9OUyhJTklUX1dHTF9QT0lOVEVSKQorICAgICAgICAgICAgZHVtbXkoMCkge30KKworICAgIC8vIEluaXRpYWxpemF0aW9uCisgICAgYm9vbCBpbml0KEhEQyBoZGMpIHsKKyAgICAgICAgLy8gQmFzZSBpbml0aWFsaXphdGlvbiBoYXBwZW5zIGZpcnN0LgorICAgICAgICBib29sIHJlc3VsdCA9IFdnbEJhc2VEaXNwYXRjaDo6aW5pdChtTGliLCBtSXNTeXN0ZW1MaWIpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgbGlzdCBvZiBleHRlbnNpb25zLgorICAgICAgICB0eXBlZGVmIGNvbnN0IGNoYXIqIChHTF9BUElFTlRSWSogR2V0RXh0ZW5zaW9uc1N0cmluZ0Z1bmMpKEhEQyBoZGMpOworCisgICAgICAgIEdldEV4dGVuc2lvbnNTdHJpbmdGdW5jIHdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R2V0RXh0ZW5zaW9uc1N0cmluZ0Z1bmM+KAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+ZmluZEZ1bmN0aW9uKCJ3Z2xHZXRFeHRlbnNpb25zU3RyaW5nQVJCIikpOworICAgICAgICBpZiAoIXdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIpIHsKKyAgICAgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBmaW5kIHdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIhXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uTGlzdCA9IHdnbEdldEV4dGVuc2lvbnNTdHJpbmdBUkIoaGRjKTsKKyAgICAgICAgaWYgKCFleHRlbnNpb25MaXN0KSB7CisgICAgICAgICAgICBleHRlbnNpb25MaXN0ID0gIiI7CisgICAgICAgIH0KKworICAgICAgICAvLyBMb2FkIGVhY2ggZXh0ZW5zaW9uIGluZGl2aWR1YWxseS4KKyNkZWZpbmUgTE9BRF9XR0xfRVhURU5TSU9OX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUpIFwKKyAgICB0aGlzLT5mdW5jdGlvbl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDwgXAorICAgICAgICAgICAgcmV0dXJuX3R5cGUgKEdMX0FQSUVOVFJZKikgc2lnbmF0dXJlPiggXAorICAgICAgICAgICAgICAgICAgICB0aGlzLT5maW5kRnVuY3Rpb24oI2Z1bmN0aW9uX25hbWUpKTsgXAorICAgIGlmICghdGhpcy0+ZnVuY3Rpb25fbmFtZSkgeyBcCisgICAgICAgIEVSUigiRVJST1I6ICVzOiBNaXNzaW5nIGV4dGVuc2lvbiBmdW5jdGlvbiAlc1xuIiwgX19GVU5DVElPTl9fLCBcCisgICAgICAgICAgICAjZnVuY3Rpb25fbmFtZSk7IFwKKyAgICAgICAgcmVzdWx0ID0gZmFsc2U7IFwKKyAgICB9CisKKyNkZWZpbmUgTE9BRF9XR0xfRVhURU5TSU9OKGV4dGVuc2lvbikgXAorICAgIGlmICghc3VwcG9ydHNFeHRlbnNpb24oI2V4dGVuc2lvbiwgZXh0ZW5zaW9uTGlzdCkpIHsgXAorICAgICAgICBFUlIoIldBUk5JTkc6ICVzOiBNaXNzaW5nIFdHTCBleHRlbnNpb24gJXNcbiIsIF9fRlVOQ1RJT05fXywgI2V4dGVuc2lvbik7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIExJU1RfIyNleHRlbnNpb24jI19GVU5DVElPTlMoTE9BRF9XR0xfRVhURU5TSU9OX0ZVTkNUSU9OKSBcCisgICAgfQorCisgICAgICAgIExPQURfV0dMX0VYVEVOU0lPTihXR0xfQVJCX3BpeGVsX2Zvcm1hdCkKKyAgICAgICAgTE9BRF9XR0xfRVhURU5TSU9OKFdHTF9BUkJfbWFrZV9jdXJyZW50X3JlYWQpCisgICAgICAgIExPQURfV0dMX0VYVEVOU0lPTihXR0xfQVJCX3BidWZmZXIpCisKKyAgICAgICAgLy8gRG9uZS4KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKCk7ICAvLyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgorfTsKKworY29uc3QgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKiBpbml0RXh0ZW5zaW9uc0Rpc3BhdGNoKAorICAgICAgICBjb25zdCBXZ2xCYXNlRGlzcGF0Y2gqIGRpc3BhdGNoKSB7CisgICAgSFdORCBod25kID0gY3JlYXRlRHVtbXlXaW5kb3coKTsKKyAgICBIREMgaGRjID0gIEdldERDKGh3bmQpOworICAgIGlmICghaHduZCB8fCAhaGRjKXsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImVycm9yIHdoaWxlIGdldHRpbmcgRENcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUElYRUxGT1JNQVRERVNDUklQVE9SIHBmZCA9IHsKKyAgICAgICAgc2l6ZW9mKFBJWEVMRk9STUFUREVTQ1JJUFRPUiksICAvLyAgc2l6ZSBvZiB0aGlzIHBmZAorICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gbnVtYmVyCisgICAgICAgIFBGRF9EUkFXX1RPX1dJTkRPVyB8ICAgLy8gc3VwcG9ydCB3aW5kb3cKKyAgICAgICAgUEZEX1NVUFBPUlRfT1BFTkdMIHwgICAvLyBzdXBwb3J0IE9wZW5HTAorICAgICAgICBQRkRfRE9VQkxFQlVGRkVSLCAgICAgIC8vIGRvdWJsZSBidWZmZXJlZAorICAgICAgICBQRkRfVFlQRV9SR0JBLCAgICAgICAgIC8vIFJHQkEgdHlwZQorICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8vIDMyLWJpdCBjb2xvciBkZXB0aAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8vIGNvbG9yIGJpdHMgaWdub3JlZAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGFscGhhIGJ1ZmZlcgorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IGJpdCBpZ25vcmVkCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgIC8vIGFjY3VtIGJpdHMgaWdub3JlZAorICAgICAgICAyNCwgICAgICAgICAgICAgICAgICAgIC8vIDI0LWJpdCB6LWJ1ZmZlcgorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0ZW5jaWwgYnVmZmVyCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYXV4aWxpYXJ5IGJ1ZmZlcgorICAgICAgICBQRkRfTUFJTl9QTEFORSwgICAgICAgIC8vIG1haW4gbGF5ZXIKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvLyByZXNlcnZlZAorICAgICAgICAwLCAwLCAwICAgICAgICAgICAgICAgIC8vIGxheWVyIG1hc2tzIGlnbm9yZWQKKyAgICB9OworCisgICAgaW50IGlQaXhlbEZvcm1hdCA9IGRpc3BhdGNoLT5DaG9vc2VQaXhlbEZvcm1hdChoZGMsICZwZmQpOworICAgIGlmIChpUGl4ZWxGb3JtYXQgPD0gMCkgeworICAgICAgICBpbnQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJlcnJvciB3aGlsZSBjaG9vc2luZyBwaXhlbCBmb3JtYXQgMHgleFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gtPlNldFBpeGVsRm9ybWF0KGhkYywgaVBpeGVsRm9ybWF0LCAmcGZkKSkgeworICAgICAgICBpbnQgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJlcnJvciB3aGlsZSBzZXR0aW5nIHBpeGVsIGZvcm1hdCAweCV4XG4iLCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpbnQgZXJyOworICAgIEhHTFJDIGN0eCA9IGRpc3BhdGNoLT53Z2xDcmVhdGVDb250ZXh0KGhkYyk7CisgICAgaWYgKCFjdHgpIHsKKyAgICAgICAgZXJyID0gIEdldExhc3RFcnJvcigpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZXJyb3Igd2hpbGUgY3JlYXRpbmcgZHVtbXkgY29udGV4dCAlZFxuIiwgZXJyKTsKKyAgICB9CisgICAgaWYgKCFkaXNwYXRjaC0+d2dsTWFrZUN1cnJlbnQoaGRjLCBjdHgpKSB7CisgICAgICAgIGVyciA9ICBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImVycm9yIHdoaWxlIG1ha2luZyBkdW1teSBjb250ZXh0IGN1cnJlbnQgJWRcbiIsIGVycik7CisgICAgfQorCisgICAgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKiByZXN1bHQgPSBuZXcgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKCpkaXNwYXRjaCk7CisgICAgcmVzdWx0LT5pbml0KGhkYyk7CisKKyAgICBkaXNwYXRjaC0+d2dsTWFrZUN1cnJlbnQoaGRjLCBOVUxMKTsKKyAgICBkaXNwYXRjaC0+d2dsRGVsZXRlQ29udGV4dChjdHgpOworICAgIFJlbGVhc2VEQyhod25kLCBoZGMpOworICAgIERlc3Ryb3lXaW5kb3coaHduZCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjbGFzcyBXaW5QaXhlbEZvcm1hdCA6IHB1YmxpYyBFZ2xPUzo6UGl4ZWxGb3JtYXQgeworcHVibGljOgorICAgIFdpblBpeGVsRm9ybWF0KGNvbnN0IFBJWEVMRk9STUFUREVTQ1JJUFRPUiogZGVzYywgaW50IGNvbmZpZ0lkKQorICAgICAgICA6IG1EZXNjKCpkZXNjKSwgbUNvbmZpZ0lkKGNvbmZpZ0lkKSB7fQorCisgICAgRWdsT1M6OlBpeGVsRm9ybWF0KiBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXaW5QaXhlbEZvcm1hdCgmbURlc2MsIG1Db25maWdJZCk7CisgICAgfQorCisgICAgY29uc3QgUElYRUxGT1JNQVRERVNDUklQVE9SKiBkZXNjKCkgY29uc3QgeyByZXR1cm4gJm1EZXNjOyB9CisgICAgY29uc3QgaW50IGNvbmZpZ0lkKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZ0lkOyB9CisKKyAgICBzdGF0aWMgY29uc3QgV2luUGl4ZWxGb3JtYXQqIGZyb20oY29uc3QgRWdsT1M6OlBpeGVsRm9ybWF0KiBmKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBXaW5QaXhlbEZvcm1hdCo+KGYpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBXaW5QaXhlbEZvcm1hdChjb25zdCBXaW5QaXhlbEZvcm1hdCYgb3RoZXIpID0gZGVsZXRlOworCisgICAgUElYRUxGT1JNQVRERVNDUklQVE9SIG1EZXNjID0ge307CisgICAgaW50IG1Db25maWdJZCA9IDA7Cit9OworCitjbGFzcyBXaW5TdXJmYWNlIDogcHVibGljIEVnbE9TOjpTdXJmYWNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBXaW5TdXJmYWNlKEhXTkQgd25kKSA6CisgICAgICAgICAgICBTdXJmYWNlKFdJTkRPVyksCisgICAgICAgICAgICBtX2h3bmQod25kKSwKKyAgICAgICAgICAgIG1faGRjKEdldERDKHduZCkpIHt9CisKKyAgICBleHBsaWNpdCBXaW5TdXJmYWNlKEhQQlVGRkVSQVJCIHBiLCBjb25zdCBXZ2xFeHRlbnNpb25zRGlzcGF0Y2gqIGRpc3BhdGNoKSA6CisgICAgICAgICAgICBTdXJmYWNlKFBCVUZGRVIpLAorICAgICAgICAgICAgbV9wYihwYikgeworICAgICAgICBpZiAoZGlzcGF0Y2gtPndnbEdldFBidWZmZXJEQ0FSQikgeworICAgICAgICAgICAgbV9oZGMgPSBkaXNwYXRjaC0+d2dsR2V0UGJ1ZmZlckRDQVJCKHBiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIH5XaW5TdXJmYWNlKCkgeworICAgICAgICBpZiAodHlwZSgpID09IFdJTkRPVykgeworICAgICAgICAgICAgUmVsZWFzZURDKG1faHduZCwgbV9oZGMpOworICAgICAgICB9CisgICAgfQorCisgICAgSFdORCBnZXRId25kKCkgY29uc3QgeyByZXR1cm4gbV9od25kOyB9CisgICAgSERDICBnZXREQygpIGNvbnN0IHsgcmV0dXJuIG1faGRjOyB9CisgICAgSFBCVUZGRVJBUkIgZ2V0UGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fcGI7IH0KKworICAgIHN0YXRpYyBXaW5TdXJmYWNlKiBmcm9tKEVnbE9TOjpTdXJmYWNlKiBzKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxXaW5TdXJmYWNlKj4ocyk7CisgICAgfQorCitwcml2YXRlOgorICAgIEhXTkQgICAgICAgIG1faHduZCA9IG51bGxwdHI7CisgICAgSFBCVUZGRVJBUkIgbV9wYiA9IG51bGxwdHI7CisgICAgSERDICAgICAgICAgbV9oZGMgPSBudWxscHRyOworfTsKKworY2xhc3MgV2luQ29udGV4dCA6IHB1YmxpYyBFZ2xPUzo6Q29udGV4dCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgV2luQ29udGV4dChIR0xSQyBjdHgpIDogbUN0eChjdHgpIHt9CisKKyAgICBIR0xSQyBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbUN0eDsgfQorCisgICAgc3RhdGljIEhHTFJDIGZyb20oY29uc3QgRWdsT1M6OkNvbnRleHQqIGMpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFdpbkNvbnRleHQqPihjKS0+Y29udGV4dCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBIR0xSQyBtQ3R4ID0gbnVsbHB0cjsKK307CisKKy8vIEEgaGVscGVyIGNsYXNzIHVzZWQgdG8gZGVhbCB3aXRoIGEgdmV4aW5nIGxpbWl0YXRpb24gb2YgdGhlIFdHTCBBUEkuCisvLyBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgU2V0UGl4ZWxGb3JtYXQoKSBzdGF0ZXMgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAtLSBJZiBoZGMgcmVmZXJlbmNlcyBhIHdpbmRvdywgY2FsbGluZyB0aGUgU2V0UGl4ZWxGb3JtYXQgZnVuY3Rpb24gYWxzbworLy8gLS0gY2hhbmdlcyB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSB3aW5kb3cuIFNldHRpbmcgdGhlIHBpeGVsIGZvcm1hdCBvZiBhCisvLyAtLSB3aW5kb3cgbW9yZSB0aGFuIG9uY2UgWy4uLl0gaXMgbm90IGFsbG93ZWQuIEFuIGFwcGxpY2F0aW9uIGNhbiBvbmx5IHNldAorLy8gLS0gdGhlIHBpeGVsIGZvcm1hdCBvZiBhIHdpbmRvdyBvbmUgdGltZS4gT25jZSBhIHdpbmRvdydzIHBpeGVsIGZvcm1hdCBpcworLy8gLS0gc2V0LCBpdCBjYW5ub3QgYmUgY2hhbmdlZC4KKy8vIC0tCisvLyAtLSBZb3Ugc2hvdWxkIHNlbGVjdCBhIHBpeGVsIGZvcm1hdCBpbiB0aGUgZGV2aWNlIGNvbnRleHQgYmVmb3JlIGNhbGxpbmcKKy8vIC0tIHRoZSB3Z2xDcmVhdGVDb250ZXh0IGZ1bmN0aW9uLiBUaGUgd2dsQ3JlYXRlQ29udGV4dCBmdW5jdGlvbiBjcmVhdGVzIGEKKy8vIC0tIHJlbmRlcmluZyBjb250ZXh0IGZvciBkcmF3aW5nIG9uIHRoZSBkZXZpY2UgaW4gdGhlIHNlbGVjdGVkIHBpeGVsIGZvcm1hdAorLy8gLS0gb2YgdGhlIGRldmljZSBjb250ZXh0LgorLy8KKy8vIEluIG90aGVyIHdvcmRzLCBjcmVhdGluZyBhIEdMIGNvbnRleHQgcmVxdWlyZXMgaGF2aW5nIGEgdW5pcXVlIHdpbmRvdyBhbmQKKy8vIGRldmljZSBjb250ZXh0IGZvciB0aGUgY29ycmVzcG9uZGluZyBFR0xDb25maWcuCisvLworLy8gVGhpcyBjb2RlIGRlYWxzIHdpdGggdGhpcyBieSBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luIHNjaGVtZToKKy8vCisvLyAtIEZvciBlYWNoIHVuaXF1ZSBQaXhlbEZvcm1hdCBJRCAoYS5rLmEuIEVHTENvbmZpZyBudW1iZXIpLCBwcm92aWRlIGEgd2F5CisvLyAgIHRvIGNyZWF0ZSBhIG5ldyBoaWRkZW4gMXgxIHdpbmRvdywgYW5kIGNvcnJlc3BvbmRpbmcgSERDLgorLy8KKy8vIC0gSW1wbGVtZW50IGEgc2ltcGxlIHRocmVhZC1sb2NhbCBtYXBwaW5nIGZyb20gUGl4ZWxGb3JtYXQgSURzIHRvCisvLyAgIChIV05ELCBIREMpIHBhaXJzIHRoYXQgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgorLy8KKy8vIFdpbkdsb2JhbHMgaXMgdGhlIGNsYXNzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgc2NoZW1lLiBVc2FnZSBpcyB0aGUKKy8vIGZvbGxvd2luZzoKKy8vCisvLyAtIENyZWF0ZSBhIHNpbmdsZSBnbG9iYWwgaW5zdGFuY2UsIHBhc3NpbmcgYSBXZ2xCYXNlRGlzcGF0Y2ggcG9pbnRlcgorLy8gICB3aGljaCBpcyByZXF1aXJlZCB0byBjYWxsIGl0cyBTZXRQaXhlbEZvcm1hdCgpIG1ldGhvZC4KKy8vCisvLyAtIENhbGwgZ2V0RGVmYXVsdER1bW15REMoKSB0byByZXRyaWV2ZSBhIHRocmVhZC1sb2NhbCBkZXZpY2UgY29udGV4dCB0aGF0CisvLyAgIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IC8gcHJvYmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBpeGVsIGZvcm1hdHMgZm9yIHRoZQorLy8gICBob3N0IHdpbmRvdywgYnV0IG5vdCBwZXJmb3JtIHJlbmRlcmluZy4KKy8vCisvLyAtIENhbGwgZ2V0RHVtbXlEQygpIHRvIHJldHJpZXZlIGEgdGhyZWFkLWxvY2FsIGRldmljZSBjb250ZXh0IHRoYXQgY2FuIGJlCisvLyAgIHVzZWQgdG8gY3JlYXRlIFdHTCBjb250ZXh0IG9iamVjdHMgdG8gcmVuZGVyIGludG8gYSBzcGVjaWZpYyBwaXhlbAorLy8gICBmb3JtYXQuCisvLworLy8gLSBUaGVzZSBkZXZpYyBjb250ZXh0cyBhcmUgdGhyZWFkLWxvY2FsLCBpLmUuIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKKy8vICAgcmVjbGFpbWVkIG9uIHRocmVhZCBleGl0LiBUaGlzIGFsc28gbWVhbnMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBub3QKKy8vICAgY2FsbCBlaXRoZXIgUmVsZWFzZURDKCkgb3IgRGVsZXRlREMoKSBvbiB0aGVtLgorLy8KK2NsYXNzIFdpbkdsb2JhbHMgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yLiB8ZGlzcGF0Y2h8IHdpbGwgYmUgdXNlZCB0byBjYWxsIHRoZSByaWdodCB2ZXJzaW9uIG9mCisgICAgLy8gOjpTZXRQaXhlbEZvcm1hdCgpIGRlcGVuZGluZyBvbiBHUFUgZW11bGF0aW9uIGNvbmZpZ3VyYXRpb24uIFNlZQorICAgIC8vIHRlY2huaWNhbCBub3RlcyBhYm92ZSBmb3IgZGV0YWlscy4KKyAgICBleHBsaWNpdCBXaW5HbG9iYWxzKGNvbnN0IFdnbEJhc2VEaXNwYXRjaCogZGlzcGF0Y2gpCisgICAgICAgICAgICA6IG1EaXNwYXRjaChkaXNwYXRjaCksIG1UbHMob25UaHJlYWRUZXJtaW5hdGlvbikge30KKworICAgIC8vIFJldHVybiBhIHRocmVhZC1sb2NhbCBkZXZpY2UgY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGxpc3QKKyAgICAvLyBhdmFpbGFibGUgcGl4ZWwgZm9ybWF0cyBmb3IgdGhlIGhvc3Qgd2luZG93LiBUaGUgY2FsbGVyIGNhbm5vdCB1c2UKKyAgICAvLyB0aGlzIGNvbnRleHQgZm9yIGRyYXdpbmcgdGhvdWdoLiBUaGUgY29udGV4dCBpcyBvd25lZAorICAgIC8vIGJ5IHRoaXMgaW5zdGFuY2UgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWNsYWltZWQgb24gdGhyZWFkIGV4aXQuCisgICAgSERDIGdldERlZmF1bHREdW1teURDKCkgeworICAgICAgICByZXR1cm4gZ2V0SW50ZXJuYWxEQyhudWxscHRyKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYSB0aHJlYWQtbG9jYWwgZGV2aWNlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMKKyAgICAvLyBwaXhlbCBmb3JtYXQuIFRoZSByZXN1bHQgaXMgb3duZWQgYnkgdGhpcyBpbnN0YW5jZSwgYW5kIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAvLyByZWNsYWltZWQgb24gdGhyZWFkIGV4aXQuIERvbid0IHRyeSB0byBjYWxsIFJlbGVhc2VEQygpIG9uIGl0LgorICAgIEhEQyBnZXREdW1teURDKGNvbnN0IFdpblBpeGVsRm9ybWF0KiBmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIGdldEludGVybmFsREMoZm9ybWF0KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gQ29uZmlnREMgaG9sZHMgYSAoSFdORCxIREMpIHBhaXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKyAgICAvLyBwaXhlbCBmb3JtYXQgSUQuIFRoaXMgc2VydmVzIGFzIHRoZSB2YWx1ZSB0eXBlIGZvciBDb25maWdNYXAKKyAgICAvLyBkZWNsYXJlZCBiZWxvdy4gSW1wbGVtZW50ZWQgYXMgYSBtb3ZhYmxlIHR5cGUgd2l0aG91dCBjb3B5LW9wZXJhdGlvbnMuCisgICAgY2xhc3MgQ29uZmlnREMgeworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gQ29uc3RydWN0b3IuIFRoaXMgY3JlYXRlcyBhIG5ldyBkdW1teSAxeDEgaW52aXNpYmxlIHdpbmRvdyBhbmQKKyAgICAgICAgLy8gYW4gYXNzb2NpYXRlZCBkZXZpY2UgY29udGV4dC4gSWYgfGZvcm1hdHwgaXMgbm90IG51bGxwdHIsIHRoZW4KKyAgICAgICAgLy8gY2FsbHMgfGRpc3BhdGNoLT5TZXRQaXhlbEZvcm1hdCgpfCBvbiB0aGUgcmVzdWx0aW5nIGNvbnRleHQgdG8KKyAgICAgICAgLy8gc2V0IHRoZSB3aW5kb3cncyBwaXhlbCBmb3JtYXQuCisgICAgICAgIENvbmZpZ0RDKGNvbnN0IFdpblBpeGVsRm9ybWF0KiBmb3JtYXQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdnbEJhc2VEaXNwYXRjaCogZGlzcGF0Y2gpIHsKKyAgICAgICAgICAgIG1XaW5kb3cgPSBjcmVhdGVEdW1teVdpbmRvdygpOworICAgICAgICAgICAgaWYgKG1XaW5kb3cpIHsKKyAgICAgICAgICAgICAgICBtRGV2aWNlQ29udGV4dCA9IEdldERDKG1XaW5kb3cpOworICAgICAgICAgICAgICAgIGlmIChmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2gtPlNldFBpeGVsRm9ybWF0KG1EZXZpY2VDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5jb25maWdJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LT5kZXNjKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIERlc3RydWN0b3IuCisgICAgICAgIH5Db25maWdEQygpIHsKKyAgICAgICAgICAgIGlmIChtV2luZG93KSB7CisgICAgICAgICAgICAgICAgUmVsZWFzZURDKG1XaW5kb3csIG1EZXZpY2VDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBEZXN0cm95V2luZG93KG1XaW5kb3cpOworICAgICAgICAgICAgICAgIG1XaW5kb3cgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3VwcG9ydHMgbW92ZXMgLSB0aGlzIGRpc2FibGVzIGF1dG8tZ2VuZXJhdGVkIGNvcHktY29uc3RydWN0b3JzLgorICAgICAgICBDb25maWdEQyhDb25maWdEQyYmIG90aGVyKQorICAgICAgICAgICAgICAgIDogbVdpbmRvdyhvdGhlci5tV2luZG93KSwKKyAgICAgICAgICAgICAgICAgIG1EZXZpY2VDb250ZXh0KG90aGVyLm1EZXZpY2VDb250ZXh0KSB7CisgICAgICAgICAgICBvdGhlci5tV2luZG93ID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ0RDJiBvcGVyYXRvcj0oQ29uZmlnREMmJiBvdGhlcikgeworICAgICAgICAgICAgbVdpbmRvdyA9IG90aGVyLm1XaW5kb3c7CisgICAgICAgICAgICBtRGV2aWNlQ29udGV4dCA9IG90aGVyLm1EZXZpY2VDb250ZXh0OworICAgICAgICAgICAgb3RoZXIubVdpbmRvdyA9IG51bGxwdHI7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gZGV2aWNlIGNvbnRleHQgZm9yIHRoaXMgaW5zdGFuY2UuCisgICAgICAgIEhEQyBkYygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDb250ZXh0OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBIV05EIG1XaW5kb3cgPSBudWxscHRyOworICAgICAgICBIREMgbURldmljZUNvbnRleHQgPSBudWxscHRyOworICAgIH07CisKKyAgICAvLyBDb252ZW5pZW5jZSB0eXBlIGFsaWFzIGZvciBtYXBwaW5nIHBpeGVsIGZvcm1hdCBJRHMsIGEuay5hLiBFR0xDb25maWcKKyAgICAvLyBJRHMsIHRvIENvbmZpZ0RDIGluc3RhbmNlcy4KKyAgICB1c2luZyBDb25maWdNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBDb25maWdEQz47CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIHRocmVhZCB0ZXJtaW5hdGVzIHRvIGRlbGV0ZSB0aGUgdGhyZWFkLWxvY2FsIG1hcAorICAgIC8vIHRoYXQgYXNzb2NpYXRlcyBwaXhlbCBmb3JtYXQgSURzIHdpdGggQ29uZmlnREMgaW5zdGFuY2VzLgorICAgIHN0YXRpYyB2b2lkIG9uVGhyZWFkVGVybWluYXRpb24odm9pZCogb3BhcXVlKSB7CisgICAgICAgIGF1dG8gbWFwID0gcmVpbnRlcnByZXRfY2FzdDxDb25maWdNYXAqPihvcGFxdWUpOworICAgICAgICBkZWxldGUgbWFwOworICAgIH0KKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB1c2VkIGJ5IGdldERlZmF1bHREdW1teURDKCkgYW5kIGdldER1bW15REMoKS4KKyAgICAvLworICAgIC8vIElmIHxmb3JtYXR8IGlzIG51bGxwdHIsIHJldHVybiBhIHRocmVhZC1sb2NhbCBkZXZpY2UgY29udGV4dCB0aGF0IGNhbgorICAgIC8vIGJlIHVzZWQgdG8gbGlzdCBhbGwgYXZhaWxhYmxlIHBpeGVsIGZvcm1hdHMgZm9yIHRoZSBob3N0IHdpbmRvdy4KKyAgICAvLworICAgIC8vIElmIHxmb3JtYXR8IGlzIG5vdCBudWxscHRyLCB0aGVuIHJldHVybiBhIHRocmVhZC1sb2NhbCBkZXZpY2UgY29udGV4dAorICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBmb3JtYXQuCisgICAgLy8KKyAgICAvLyBCb3RoIGNhc2VzIHdpbGwgbGF6aWx5IGNyZWF0ZSBhIDF4MSBpbnZpc2libGUgZHVtbXkgd2luZG93IHdoaWNoCisgICAgLy8gdGhlIGRldmljZSBpcyBjb25uZWN0ZWQgdG8uIEFsbCBvYmplY3RzIGFyZSBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZAorICAgIC8vIG9uIHRocmVhZCBleGl0LiBSZXR1cm4gbnVsbHB0ciBvbiBmYWlsdXJlLgorICAgIEhEQyBnZXRJbnRlcm5hbERDKGNvbnN0IFdpblBpeGVsRm9ybWF0KiBmb3JtYXQpIHsKKyAgICAgICAgaW50IGZvcm1hdElkID0gZm9ybWF0ID8gZm9ybWF0LT5jb25maWdJZCgpIDogMDsKKyAgICAgICAgYXV0byBtYXAgPSByZWludGVycHJldF9jYXN0PENvbmZpZ01hcCo+KG1UbHMuZ2V0KCkpOworICAgICAgICBpZiAoIW1hcCkgeworICAgICAgICAgICAgbWFwID0gbmV3IENvbmZpZ01hcCgpOworICAgICAgICAgICAgbVRscy5zZXQobWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gaXQgPSBtYXAtPmZpbmQoZm9ybWF0SWQpOworICAgICAgICBpZiAoaXQgIT0gbWFwLT5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZGMoKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ0RDIG5ld1ZhbHVlKGZvcm1hdCwgbURpc3BhdGNoKTsKKyAgICAgICAgSERDIHJlc3VsdCA9IG5ld1ZhbHVlLmRjKCk7CisgICAgICAgIG1hcC0+ZW1wbGFjZShmb3JtYXRJZCwgc3RkOjptb3ZlKG5ld1ZhbHVlKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgY29uc3QgV2dsQmFzZURpc3BhdGNoKiBtRGlzcGF0Y2ggPSBudWxscHRyOworICAgIGVtdWdsOjpUaHJlYWRTdG9yZSBtVGxzOworfTsKKworYm9vbCBpbml0UGl4ZWxGb3JtYXQoSERDIGRjLCBjb25zdCBXZ2xFeHRlbnNpb25zRGlzcGF0Y2gqIGRpc3BhdGNoKSB7CisgICAgaWYgKGRpc3BhdGNoLT53Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQikgeworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtcGY7CisgICAgICAgIGludCBpUGl4ZWxGb3JtYXQ7CisgICAgICAgIGludCBpMCA9IDA7CisgICAgICAgIGZsb2F0IGYwID0gMC4wZjsKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoLT53Z2xDaG9vc2VQaXhlbEZvcm1hdEFSQigKKyAgICAgICAgICAgICAgICBkYywgJmkwLCAmZjAsIDEsICZpUGl4ZWxGb3JtYXQsICZudW1wZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUElYRUxGT1JNQVRERVNDUklQVE9SICBwZmQ7CisgICAgICAgIHJldHVybiBkaXNwYXRjaC0+Q2hvb3NlUGl4ZWxGb3JtYXQoZGMsICZwZmQpOworICAgIH0KK30KKwordm9pZCBwaXhlbEZvcm1hdFRvQ29uZmlnKFdpbkdsb2JhbHMqIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKiBkaXNwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUElYRUxGT1JNQVRERVNDUklQVE9SKiBmcm10LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFZ2xPUzo6QWRkQ29uZmlnQ2FsbGJhY2sqIGFkZENvbmZpZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYWRkQ29uZmlnT3BhcXVlKSB7CisgICAgRWdsT1M6OkNvbmZpZ0luZm8gaW5mbzsKKyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisKKyAgICBpZiAoZnJtdC0+aVBpeGVsVHlwZSAhPSBQRkRfVFlQRV9SR0JBKSB7CisgICAgICAgIEQoIiVzOiBOb3QgYW4gUkdCQSB0eXBlIVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOyAvLyBvdGhlciBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkIHlldAorICAgIH0KKyAgICBpZiAoIShmcm10LT5kd0ZsYWdzICYgUEZEX1NVUFBPUlRfT1BFTkdMKSkgeworICAgICAgICBEKCIlczogTm8gT3BlbkdMIHN1cHBvcnRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTk9URTogU29mdHdhcmUgcmVuZGVyZXJzIGRvbid0IGFsd2F5cyBzdXBwb3J0IGRvdWJsZS1idWZmZXJpbmcuCisgICAgaWYgKGRpc3BhdGNoLT5tSXNTeXN0ZW1MaWIgJiYgIShmcm10LT5kd0ZsYWdzICYgUEZEX0RPVUJMRUJVRkZFUikpIHsKKyAgICAgICAgRCgiJXM6IE5vIGRvdWJsZS1idWZmZXIgc3VwcG9ydFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKGZybXQtPmR3RmxhZ3MgJiAoUEZEX0dFTkVSSUNfRk9STUFUIHwgUEZEX05FRURfUEFMRVRURSkpICE9IDApIHsKKyAgICAgICAgLy9kaXNjYXJkIGdlbmVyaWMgcGl4ZWwgZm9ybWF0cyBhcyB3ZWxsIGFzIHBhbGxldGUgcGl4ZWwgZm9ybWF0cworICAgICAgICBEKCIlczogR2VuZXJpYyBmb3JtYXQgb3IgbmVlZHMgcGFsZXR0ZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZGlzcGF0Y2gtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIpIHsKKyAgICAgICAgRCgiJXM6IE1pc3Npbmcgd2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQlxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMaW50IHdpbmRvdyA9IDAsIHBidWZmZXIgPSAwOworICAgIEhEQyBkcHkgPSBnbG9iYWxzLT5nZXREZWZhdWx0RHVtbXlEQygpOworCisgICAgaWYgKGRpc3BhdGNoLT5tSXNTeXN0ZW1MaWIpIHsKKyAgICAgICAgaW50IHdpbmRvd0F0dHJpYiA9IFdHTF9EUkFXX1RPX1dJTkRPV19BUkI7CisgICAgICAgIEVYSVRfSUZfRkFMU0UoZGlzcGF0Y2gtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoCisgICAgICAgICAgICAgICAgZHB5LCBpbmRleCwgMCwgMSwgJndpbmRvd0F0dHJpYiwgJndpbmRvdykpOworICAgIH0KKyAgICBpbnQgcGJ1ZmZlckF0dHJpYiA9IFdHTF9EUkFXX1RPX1BCVUZGRVJfQVJCOworICAgIEVYSVRfSUZfRkFMU0UoZGlzcGF0Y2gtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoCisgICAgICAgICAgICBkcHksIGluZGV4LCAwLCAxLCAmcGJ1ZmZlckF0dHJpYiwgJnBidWZmZXIpKTsKKworICAgIGluZm8uc3VyZmFjZV90eXBlID0gMDsKKyAgICBpZiAod2luZG93KSB7CisgICAgICAgIGluZm8uc3VyZmFjZV90eXBlIHw9IEVHTF9XSU5ET1dfQklUOworICAgIH0KKyAgICBpZiAocGJ1ZmZlcikgeworICAgICAgICBpbmZvLnN1cmZhY2VfdHlwZSB8PSBFR0xfUEJVRkZFUl9CSVQ7CisgICAgfQorICAgIGlmICghaW5mby5zdXJmYWNlX3R5cGUpIHsKKyAgICAgICAgRCgiJXM6IE1pc3Npbmcgc3VyZmFjZSB0eXBlXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9kZWZhdWx0IHZhbHVlcworICAgIGluZm8ubmF0aXZlX3Zpc3VhbF9pZCA9IDA7CisgICAgaW5mby5uYXRpdmVfdmlzdWFsX3R5cGUgPSBFR0xfTk9ORTsKKyAgICBpbmZvLmNhdmVhdCA9IEVHTF9OT05FOworICAgIGluZm8ubmF0aXZlX3JlbmRlcmFibGUgPSBFR0xfRkFMU0U7CisgICAgaW5mby5yZW5kZXJhYmxlX3R5cGUgPSByZW5kZXJhYmxlVHlwZTsKKyAgICBpbmZvLm1heF9wYnVmZmVyX3dpZHRoID0gUEJVRkZFUl9NQVhfV0lEVEg7CisgICAgaW5mby5tYXhfcGJ1ZmZlcl9oZWlnaHQgPSBQQlVGRkVSX01BWF9IRUlHSFQ7CisgICAgaW5mby5tYXhfcGJ1ZmZlcl9zaXplID0gUEJVRkZFUl9NQVhfUElYRUxTOworICAgIGluZm8uc2FtcGxlc19wZXJfcGl4ZWwgPSAwOworICAgIGluZm8uZnJhbWVfYnVmZmVyX2xldmVsID0gMDsKKworICAgIEdMaW50IHRyYW5zcGFyZW50OworICAgIGludCB0cmFuc3BhcmVudEF0dHJpYiA9IFdHTF9UUkFOU1BBUkVOVF9BUkI7CisgICAgRVhJVF9JRl9GQUxTRShkaXNwYXRjaC0+d2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQigKKyAgICAgICAgICAgIGRweSwgaW5kZXgsIDAsIDEsICZ0cmFuc3BhcmVudEF0dHJpYiwgJnRyYW5zcGFyZW50KSk7CisgICAgaWYgKHRyYW5zcGFyZW50KSB7CisgICAgICAgIGluZm8udHJhbnNwYXJlbnRfdHlwZSA9IEVHTF9UUkFOU1BBUkVOVF9SR0I7CisgICAgICAgIGludCB0cmFuc3BhcmVudFJlZEF0dHJpYiA9IFdHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUVfQVJCOworICAgICAgICBFWElUX0lGX0ZBTFNFKGRpc3BhdGNoLT53Z2xHZXRQaXhlbEZvcm1hdEF0dHJpYml2QVJCKAorICAgICAgICAgICAgICAgIGRweSwgaW5kZXgsIDAsIDEsICZ0cmFuc3BhcmVudFJlZEF0dHJpYiwgJmluZm8udHJhbnNfcmVkX3ZhbCkpOworICAgICAgICBpbnQgdHJhbnNwYXJlbnRHcmVlbkF0dHJpYiA9IFdHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRV9BUkI7CisgICAgICAgIEVYSVRfSUZfRkFMU0UoZGlzcGF0Y2gtPndnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoCisgICAgICAgICAgICAgICAgZHB5LCBpbmRleCwgMCwgMSwgJnRyYW5zcGFyZW50R3JlZW5BdHRyaWIsCisgICAgICAgICAgICAgICAgJmluZm8udHJhbnNfZ3JlZW5fdmFsKSk7CisgICAgICAgIGludCB0cmFuc3BhcmVudEJsdWVBdHRyaWIgPSBXR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFX0FSQjsKKyAgICAgICAgRVhJVF9JRl9GQUxTRShkaXNwYXRjaC0+d2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQigKKyAgICAgICAgICAgICAgICBkcHksaW5kZXgsIDAsIDEsICZ0cmFuc3BhcmVudEJsdWVBdHRyaWIsICZpbmZvLnRyYW5zX2JsdWVfdmFsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mby50cmFuc3BhcmVudF90eXBlID0gRUdMX05PTkU7CisgICAgfQorCisgICAgaW5mby5yZWRfc2l6ZSA9IGZybXQtPmNSZWRCaXRzOworICAgIGluZm8uZ3JlZW5fc2l6ZSA9IGZybXQtPmNHcmVlbkJpdHM7CisgICAgaW5mby5ibHVlX3NpemUgPSBmcm10LT5jQmx1ZUJpdHM7CisgICAgaW5mby5hbHBoYV9zaXplID0gZnJtdC0+Y0FscGhhQml0czsKKyAgICBpbmZvLmRlcHRoX3NpemUgPSBmcm10LT5jRGVwdGhCaXRzOworICAgIGluZm8uc3RlbmNpbF9zaXplID0gZnJtdC0+Y1N0ZW5jaWxCaXRzOworCisgICAgaW5mby5jb25maWdfaWQgPSAoRUdMaW50KSBpbmRleDsKKyAgICBpbmZvLmZybXQgPSBuZXcgV2luUGl4ZWxGb3JtYXQoZnJtdCwgaW5kZXgpOworCisgICAgKCphZGRDb25maWdGdW5jKShhZGRDb25maWdPcGFxdWUsICZpbmZvKTsKK30KKworY2xhc3MgV2dsRGlzcGxheSA6IHB1YmxpYyBFZ2xPUzo6RGlzcGxheSB7CitwdWJsaWM6CisgICAgV2dsRGlzcGxheShjb25zdCBXZ2xFeHRlbnNpb25zRGlzcGF0Y2gqIGRpc3BhdGNoLAorICAgICAgICAgICAgICAgV2luR2xvYmFscyogZ2xvYmFscykKKyAgICAgICAgICAgIDogbURpc3BhdGNoKGRpc3BhdGNoKSwgbUdsb2JhbHMoZ2xvYmFscykge30KKworICAgIHZpcnR1YWwgdm9pZCBxdWVyeUNvbmZpZ3MoaW50IHJlbmRlcmFibGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWdsT1M6OkFkZENvbmZpZ0NhbGxiYWNrIGFkZENvbmZpZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhZGRDb25maWdPcGFxdWUpIHsKKyAgICAgICAgSERDIGRweSA9IG1HbG9iYWxzLT5nZXREZWZhdWx0RHVtbXlEQygpOworCisgICAgICAgIC8vIHdnbENob29zZVBpeGVsRm9ybWF0KCkgbmVlZHMgdG8gYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UsCisgICAgICAgIC8vIGkuZS4gaXQgc2VlbXMgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIHRvIGluaXRpYWxpemUgaXRzZWxmLgorICAgICAgICAvLyBEbyBpdCBoZXJlIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgaW5pdFBpeGVsRm9ybWF0KGRweSwgbURpc3BhdGNoKTsKKworICAgICAgICAvLyBRdWVyaW5nIG51bWJlciBvZiBmb3JtYXRzCisgICAgICAgIFBJWEVMRk9STUFUREVTQ1JJUFRPUiAgcGZkOworICAgICAgICBpbnQgbWF4Rm9ybWF0ID0gbURpc3BhdGNoLT5EZXNjcmliZVBpeGVsRm9ybWF0KAorICAgICAgICAgICAgICAgIGRweSwgMSwgc2l6ZW9mKFBJWEVMRk9STUFUREVTQ1JJUFRPUiksICZwZmQpOworCisgICAgICAgIC8vIEluc2VydGluZyByZXN0IG9mIGZvcm1hdHMuIFRyeSB0byBtYXAgZWFjaCBvbmUgdG8gYW4gRUdMIENvbmZpZy4KKyAgICAgICAgZm9yIChpbnQgY29uZmlnSWQgPSAxOyBjb25maWdJZCA8PSBtYXhGb3JtYXQ7IGNvbmZpZ0lkKyspIHsKKyAgICAgICAgICAgIG1EaXNwYXRjaC0+RGVzY3JpYmVQaXhlbEZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgZHB5LCBjb25maWdJZCwgc2l6ZW9mKFBJWEVMRk9STUFUREVTQ1JJUFRPUiksICZwZmQpOworICAgICAgICAgICAgcGl4ZWxGb3JtYXRUb0NvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgbUdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgIG1EaXNwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyYWJsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICZwZmQsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0lkLAorICAgICAgICAgICAgICAgICAgICBhZGRDb25maWdGdW5jLAorICAgICAgICAgICAgICAgICAgICBhZGRDb25maWdPcGFxdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWROYXRpdmVXaW4oRWdsT1M6OlN1cmZhY2UqIHdpbikgeworICAgICAgICBpZiAoIXdpbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWROYXRpdmVXaW4oV2luU3VyZmFjZTo6ZnJvbSh3aW4pLT5nZXRId25kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWROYXRpdmVXaW4oRUdMTmF0aXZlV2luZG93VHlwZSB3aW4pIHsKKyAgICAgICAgcmV0dXJuIElzV2luZG93KHdpbik7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGNoZWNrV2luZG93UGl4ZWxGb3JtYXRNYXRjaCgKKyAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luLAorICAgICAgICAgICAgY29uc3QgRWdsT1M6OlBpeGVsRm9ybWF0KiBwaXhlbEZvcm1hdCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCogd2lkdGgsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIGhlaWdodCkgeworICAgICAgICBSRUNUIHI7CisgICAgICAgIGlmICghR2V0Q2xpZW50UmVjdCh3aW4sICZyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgICp3aWR0aCAgPSByLnJpZ2h0ICAtIHIubGVmdDsKKyAgICAgICAgKmhlaWdodCA9IHIuYm90dG9tIC0gci50b3A7CisgICAgICAgIEhEQyBkYyA9IEdldERDKHdpbik7CisgICAgICAgIGNvbnN0IFdpblBpeGVsRm9ybWF0KiBmb3JtYXQgPSBXaW5QaXhlbEZvcm1hdDo6ZnJvbShwaXhlbEZvcm1hdCk7CisgICAgICAgIGJvb2wgcmV0ID0gbURpc3BhdGNoLT5TZXRQaXhlbEZvcm1hdChkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+Y29uZmlnSWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZGVzYygpKTsKKyAgICAgICAgUmVsZWFzZURDKHdpbiwgZGMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHZpcnR1YWwgRWdsT1M6OkNvbnRleHQqIGNyZWF0ZUNvbnRleHQoCisgICAgICAgICAgICBjb25zdCBFZ2xPUzo6UGl4ZWxGb3JtYXQqIHBpeGVsRm9ybWF0LAorICAgICAgICAgICAgRWdsT1M6OkNvbnRleHQqIHNoYXJlZENvbnRleHQpIHsKKyAgICAgICAgY29uc3QgV2luUGl4ZWxGb3JtYXQqIGZvcm1hdCA9IFdpblBpeGVsRm9ybWF0Ojpmcm9tKHBpeGVsRm9ybWF0KTsKKyAgICAgICAgSERDIGRweSA9IG1HbG9iYWxzLT5nZXREdW1teURDKGZvcm1hdCk7CisgICAgICAgIGlmICghZHB5KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIEhHTFJDIGN0eCA9IG1EaXNwYXRjaC0+d2dsQ3JlYXRlQ29udGV4dChkcHkpOworICAgICAgICBpZiAoY3R4ICYmIHNoYXJlZENvbnRleHQpIHsKKyAgICAgICAgICAgIGlmICghbURpc3BhdGNoLT53Z2xTaGFyZUxpc3RzKFdpbkNvbnRleHQ6OmZyb20oc2hhcmVkQ29udGV4dCksIGN0eCkpIHsKKyAgICAgICAgICAgICAgICBtRGlzcGF0Y2gtPndnbERlbGV0ZUNvbnRleHQoY3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFdpbkNvbnRleHQoY3R4KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZGVzdHJveUNvbnRleHQoRWdsT1M6OkNvbnRleHQqIGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCFjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtRGlzcGF0Y2gtPndnbERlbGV0ZUNvbnRleHQoV2luQ29udGV4dDo6ZnJvbShjb250ZXh0KSkpIHsKKyAgICAgICAgICAgIEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBjb250ZXh0OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEVnbE9TOjpTdXJmYWNlKiBjcmVhdGVQYnVmZmVyU3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IEVnbE9TOjpQaXhlbEZvcm1hdCogcGl4ZWxGb3JtYXQsCisgICAgICAgICAgICBjb25zdCBFZ2xPUzo6UGJ1ZmZlckluZm8qIGluZm8pIHsKKyAgICAgICAgY29uc3QgV2luUGl4ZWxGb3JtYXQqIGZvcm1hdCA9IFdpblBpeGVsRm9ybWF0Ojpmcm9tKHBpeGVsRm9ybWF0KTsKKyAgICAgICAgSERDIGRweSA9IG1HbG9iYWxzLT5nZXREdW1teURDKGZvcm1hdCk7CisKKyAgICAgICAgaW50IHdnbFRleEZvcm1hdCA9IFdHTF9OT19URVhUVVJFX0FSQjsKKyAgICAgICAgaW50IHdnbFRleFRhcmdldCA9CisgICAgICAgICAgICAgICAgKGluZm8tPnRhcmdldCA9PSBFR0xfVEVYVFVSRV8yRCkgPyBXR0xfVEVYVFVSRV8yRF9BUkIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFdHTF9OT19URVhUVVJFX0FSQjsKKyAgICAgICAgc3dpdGNoIChpbmZvLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9SR0I6CisgICAgICAgICAgICB3Z2xUZXhGb3JtYXQgPSBXR0xfVEVYVFVSRV9SR0JfQVJCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRUdMX1RFWFRVUkVfUkdCQToKKyAgICAgICAgICAgIHdnbFRleEZvcm1hdCA9IFdHTF9URVhUVVJFX1JHQkFfQVJCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBpbnQgcGJBdHRyaWJzW10gPSB7CisgICAgICAgICAgICBXR0xfVEVYVFVSRV9UQVJHRVRfQVJCLCB3Z2xUZXhUYXJnZXQsCisgICAgICAgICAgICBXR0xfVEVYVFVSRV9GT1JNQVRfQVJCLCB3Z2xUZXhGb3JtYXQsCisgICAgICAgICAgICAwCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKiBkaXNwYXRjaCA9IG1EaXNwYXRjaDsKKyAgICAgICAgaWYgKCFkaXNwYXRjaC0+d2dsQ3JlYXRlUGJ1ZmZlckFSQikgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgSFBCVUZGRVJBUkIgcGIgPSBkaXNwYXRjaC0+d2dsQ3JlYXRlUGJ1ZmZlckFSQigKKyAgICAgICAgICAgICAgICBkcHksIGZvcm1hdC0+Y29uZmlnSWQoKSwgaW5mby0+d2lkdGgsIGluZm8tPmhlaWdodCwgcGJBdHRyaWJzKTsKKyAgICAgICAgaWYgKCFwYikgeworICAgICAgICAgICAgR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFdpblN1cmZhY2UocGIsIGRpc3BhdGNoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZVBidWZmZXIoRWdsT1M6OlN1cmZhY2UqIHBiKSB7CisgICAgICAgIGlmICghcGIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBXZ2xFeHRlbnNpb25zRGlzcGF0Y2gqIGRpc3BhdGNoID0gbURpc3BhdGNoOworICAgICAgICBpZiAoIWRpc3BhdGNoLT53Z2xSZWxlYXNlUGJ1ZmZlckRDQVJCIHx8CisgICAgICAgICAgICAhZGlzcGF0Y2gtPndnbERlc3Ryb3lQYnVmZmVyQVJCKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgV2luU3VyZmFjZSogd2lucGIgPSBXaW5TdXJmYWNlOjpmcm9tKHBiKTsKKyAgICAgICAgaWYgKCFkaXNwYXRjaC0+d2dsUmVsZWFzZVBidWZmZXJEQ0FSQigKKyAgICAgICAgICAgICAgICB3aW5wYi0+Z2V0UGJ1ZmZlcigpLCB3aW5wYi0+Z2V0REMoKSkgfHwKKyAgICAgICAgICAgICFkaXNwYXRjaC0+d2dsRGVzdHJveVBidWZmZXJBUkIod2lucGItPmdldFBidWZmZXIoKSkpIHsKKyAgICAgICAgICAgIEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYWtlQ3VycmVudChFZ2xPUzo6U3VyZmFjZSogcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWdsT1M6OlN1cmZhY2UqIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbE9TOjpDb250ZXh0KiBjb250ZXh0KSB7CisgICAgICAgIEhEQyBoZGNSZWFkID0gcmVhZCA/IFdpblN1cmZhY2U6OmZyb20ocmVhZCktPmdldERDKCkgOiBOVUxMOworICAgICAgICBIREMgaGRjRHJhdyA9IGRyYXcgPyBXaW5TdXJmYWNlOjpmcm9tKGRyYXcpLT5nZXREQygpIDogTlVMTDsKKyAgICAgICAgSEdMUkMgaGRjQ29udGV4dCA9IGNvbnRleHQgPyBXaW5Db250ZXh0Ojpmcm9tKGNvbnRleHQpIDogMDsKKworICAgICAgICBjb25zdCBXZ2xFeHRlbnNpb25zRGlzcGF0Y2gqIGRpc3BhdGNoID0gbURpc3BhdGNoOworCisgICAgICAgIGlmIChoZGNSZWFkID09IGhkY0RyYXcpeworICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBsb29wIGlzIGEgd29yay1hcm91bmQgZm9yIGEgcHJvYmxlbSB3aGVuCisgICAgICAgICAgICAvLyBvY2Nhc2lvbmFsbHkgdGhlIHJlbmRlcmluZyBpcyBpbmNvcnJlY3QgYWZ0ZXIgaGliZXJuYXRpbmcgYW5kCisgICAgICAgICAgICAvLyB3YWtpbmcgdXAgd2luZG93cy4KKyAgICAgICAgICAgIC8vIHdnbE1ha2VDdXJyZW50IHdpbGwgc29tZXRpbWVzIGZhaWwgZm9yIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUKKyAgICAgICAgICAgIC8vIGluIHN1Y2ggc2l0dWF0aW9uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBhIHN0cmljdGVyIHRlc3QsIGluIGFkZGl0aW9uIHRvIGNoZWNraW5nIHRoZSByZXR1cm4gdmFsdWUsIHdlCisgICAgICAgICAgICAvLyBtaWdodCBhbHNvIHdhbnQgdG8gY2hlY2sgaXRzIGVycm9yIGNvZGUuIE9uIG15IGNvbXB1dGVyIGluIHN1Y2gKKyAgICAgICAgICAgIC8vIHNpdHVhdGlvbiBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIDAgKHdoaWNoIGlzIGRvY3VtZW50ZWQgYXMKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MgY29kZSkuIFRoaXMgaXMgbm90IGEgZG9jdW1lbnRlZCBiZWhhdmlvdXIgYW5kIGlzCisgICAgICAgICAgICAvLyB1bnJlbGlhYmxlLiBCdXQgaW4gY2FzZSBvbmUgbmVlZHMgdG8gdXNlIGl0LCBoZXJlIGlzIHRoZSBjb2RlOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICAgd2hpbGUgKCEoaXNTdWNjZXNzID0gZGlzcGF0Y2gtPndnbE1ha2VDdXJyZW50KGhkY0RyYXcsIGhkY0NvbnRleHQpKQorICAgICAgICAgICAgLy8gICAgICAgICAgICYmIEdldExhc3RFcnJvcigpPT0wKSBTbGVlcCgxNik7CisgICAgICAgICAgICAvLworCisgICAgICAgICAgICBpbnQgY291bnQgPSAxMDA7CisgICAgICAgICAgICB3aGlsZSAoIWRpc3BhdGNoLT53Z2xNYWtlQ3VycmVudChoZGNEcmF3LCBoZGNDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICYmIC0tY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgU2xlZXAoMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgICAgICAgICBEKCJFcnJvcjogd2dsTWFrZUN1cnJlbnQoKSBmYWlsZWQsIGVycm9yICVkXG4iLCAoaW50KUdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghZGlzcGF0Y2gtPndnbE1ha2VDb250ZXh0Q3VycmVudEFSQikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgcmV0VmFsID0gZGlzcGF0Y2gtPndnbE1ha2VDb250ZXh0Q3VycmVudEFSQigKKyAgICAgICAgICAgICAgICBoZGNEcmF3LCBoZGNSZWFkLCBoZGNDb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc3dhcEJ1ZmZlcnMoRWdsT1M6OlN1cmZhY2UqIHNyZmMpIHsKKyAgICAgICAgaWYgKHNyZmMgJiYgIW1EaXNwYXRjaC0+U3dhcEJ1ZmZlcnMoV2luU3VyZmFjZTo6ZnJvbShzcmZjKS0+Z2V0REMoKSkpIHsKKyAgICAgICAgICAgIEdldExhc3RFcnJvcigpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFdnbEV4dGVuc2lvbnNEaXNwYXRjaCogbURpc3BhdGNoID0gbnVsbHB0cjsKKyAgICBXaW5HbG9iYWxzKiBtR2xvYmFscyA9IG51bGxwdHI7Cit9OworCitjbGFzcyBXZ2xMaWJyYXJ5IDogcHVibGljIEdsTGlicmFyeSB7CitwdWJsaWM6CisgICAgV2dsTGlicmFyeShjb25zdCBXZ2xCYXNlRGlzcGF0Y2gqIGRpc3BhdGNoKSA6IG1EaXNwYXRjaChkaXNwYXRjaCkge30KKworICAgIHZpcnR1YWwgR2xGdW5jdGlvblBvaW50ZXIgZmluZFN5bWJvbChjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgIHJldHVybiBtRGlzcGF0Y2gtPmZpbmRGdW5jdGlvbihuYW1lKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgV2dsQmFzZURpc3BhdGNoKiBtRGlzcGF0Y2ggPSBudWxscHRyOworfTsKKworY2xhc3MgV2luRW5naW5lIDogcHVibGljIEVnbE9TOjpFbmdpbmUgeworcHVibGljOgorICAgIFdpbkVuZ2luZSgpOworCisgICAgfldpbkVuZ2luZSgpIHsKKyAgICAgICAgZGVsZXRlIG1EaXNwYXRjaDsKKyAgICAgICAgZGVsZXRlIG1MaWI7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6RGlzcGxheSogZ2V0RGVmYXVsdERpc3BsYXkoKSB7CisgICAgICAgIHJldHVybiBuZXcgV2dsRGlzcGxheShtRGlzcGF0Y2gsICZtR2xvYmFscyk7CisgICAgfQorCisgICAgdmlydHVhbCBHbExpYnJhcnkqIGdldEdsTGlicmFyeSgpIHsKKyAgICAgICAgcmV0dXJuICZtR2xMaWI7CisgICAgfQorCisgICAgdmlydHVhbCBFZ2xPUzo6U3VyZmFjZSogY3JlYXRlV2luZG93U3VyZmFjZShFR0xOYXRpdmVXaW5kb3dUeXBlIHduZCkgeworICAgICAgICByZXR1cm4gbmV3IFdpblN1cmZhY2Uod25kKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgU2hhcmVkTGlicmFyeSogbUxpYiA9IG51bGxwdHI7CisgICAgY29uc3QgV2dsRXh0ZW5zaW9uc0Rpc3BhdGNoKiBtRGlzcGF0Y2ggPSBudWxscHRyOworICAgIFdnbEJhc2VEaXNwYXRjaCBtQmFzZURpc3BhdGNoID0ge307CisgICAgV2dsTGlicmFyeSBtR2xMaWI7CisgICAgV2luR2xvYmFscyBtR2xvYmFsczsKK307CisKK1dpbkVuZ2luZTo6V2luRW5naW5lKCkgOgorICAgICAgICBtR2xMaWIoJm1CYXNlRGlzcGF0Y2gpLAorICAgICAgICBtR2xvYmFscygmbUJhc2VEaXNwYXRjaCkgeworICAgIGNvbnN0IGNoYXIqIGtMaWJOYW1lID0gIm9wZW5nbDMyLmRsbCI7CisgICAgYm9vbCBpc1N5c3RlbUxpYiA9IHRydWU7CisgICAgY29uc3QgY2hhciogZW52ID0gOjpnZXRlbnYoIkFORFJPSURfR0xfTElCIik7CisgICAgaWYgKGVudiAmJiAhc3RyY21wKGVudiwgIm1lc2EiKSkgeworICAgICAgICBrTGliTmFtZSA9ICJtZXNhX29wZW5nbDMyLmRsbCI7CisgICAgICAgIGlzU3lzdGVtTGliID0gZmFsc2U7CisgICAgfQorICAgIGNoYXIgZXJyb3JbMjU2XTsKKyAgICBEKCIlczogVHJ5aW5nIHRvIGxvYWQgJXNcbiIsIF9fRlVOQ1RJT05fXywga0xpYk5hbWUpOworICAgIG1MaWIgPSBTaGFyZWRMaWJyYXJ5OjpvcGVuKGtMaWJOYW1lLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgaWYgKCFtTGliKSB7CisgICAgICAgIEVSUigiRVJST1I6ICVzOiBDb3VsZCBub3Qgb3BlbiAlczogJXNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGtMaWJOYW1lLCBlcnJvcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgRCgiJXM6IExpYnJhcnkgbG9hZGVkIGF0ICVwXG4iLCBfX0ZVTkNUSU9OX18sIG1MaWIpOworICAgIG1CYXNlRGlzcGF0Y2guaW5pdChtTGliLCBpc1N5c3RlbUxpYik7CisgICAgbURpc3BhdGNoID0gaW5pdEV4dGVuc2lvbnNEaXNwYXRjaCgmbUJhc2VEaXNwYXRjaCk7CisgICAgRCgiJXM6IERpc3BhdGNoIGluaXRpYWxpemVkXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCitlbXVnbDo6TGF6eUluc3RhbmNlPFdpbkVuZ2luZT4gc0hvc3RFbmdpbmUgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0VnbE9TOjpFbmdpbmUqIEVnbE9TOjpFbmdpbmU6OmdldEhvc3RJbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gc0hvc3RFbmdpbmUucHRyKCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFBidWZmZXJTdXJmYWNlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsUGJ1ZmZlclN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiY2IzMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFBidWZmZXJTdXJmYWNlLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkVnbFBidWZmZXJTdXJmYWNlLmgiCisKK2Jvb2wgRWdsUGJ1ZmZlclN1cmZhY2U6OnNldEF0dHJpYihFR0xpbnQgYXR0cmliLEVHTGludCB2YWwpIHsKKyAgICBzd2l0Y2goYXR0cmliKSB7CisgICAgY2FzZSBFR0xfV0lEVEg6CisgICAgICAgIGlmKHZhbCA8IDApIHJldHVybiBmYWxzZTsKKyAgICAgICAgbV93aWR0aCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfSEVJR0hUOgorICAgICAgICBpZih2YWwgPCAwKSByZXR1cm4gZmFsc2U7CisgICAgICAgIG1faGVpZ2h0ID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9MQVJHRVNUX1BCVUZGRVI6CisgICAgICAgIG1fbGFyZ2VzdCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfVEVYVFVSRV9GT1JNQVQ6CisgICAgICAgIGlmKHZhbCAhPSBFR0xfTk9fVEVYVFVSRSAmJiB2YWwgIT0gRUdMX1RFWFRVUkVfUkdCICYmIHZhbCAhPSBFR0xfVEVYVFVSRV9SR0JBKSByZXR1cm4gZmFsc2U7CisgICAgICAgIG1fdGV4Rm9ybWF0ID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9URVhUVVJFX1RBUkdFVDoKKyAgICAgICAgaWYodmFsICE9IEVHTF9OT19URVhUVVJFICYmIHZhbCAhPSBFR0xfVEVYVFVSRV8yRCkgcmV0dXJuIGZhbHNlOworICAgICAgICBtX3RleFRhcmdldCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTUlQTUFQX1RFWFRVUkU6CisgICAgICAgIG1fdGV4TWlwbWFwID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEVnbFBidWZmZXJTdXJmYWNlOjpnZXRBdHRyaWIoRUdMaW50IGF0dHJpYixFR0xpbnQqIHZhbCkgeworICAgIHN3aXRjaChhdHRyaWIpIHsKKyAgICBjYXNlIEVHTF9DT05GSUdfSUQ6CisgICAgICAgICp2YWwgPSBtX2NvbmZpZy0+aWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfV0lEVEg6CisgICAgICAgICp2YWwgPSBtX3dpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9IRUlHSFQ6CisgICAgICAgICp2YWwgPSBtX2hlaWdodDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFR0xfTEFSR0VTVF9QQlVGRkVSOgorICAgICAgICAqdmFsID0gbV9sYXJnZXN0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9URVhUVVJFX0ZPUk1BVDoKKyAgICAgICAgKnZhbCA9IG1fdGV4Rm9ybWF0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9URVhUVVJFX1RBUkdFVDoKKyAgICAgICAgKnZhbCA9IG1fdGV4VGFyZ2V0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9NSVBNQVBfVEVYVFVSRToKKyAgICAgICAgKnZhbCA9IG1fdGV4TWlwbWFwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xQYnVmZmVyU3VyZmFjZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xQYnVmZmVyU3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWFlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFBidWZmZXJTdXJmYWNlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgRUdMX1BCVUZGRVJfU1VSRkFDRV9ICisjZGVmaW5lIEVHTF9QQlVGRkVSX1NVUkZBQ0VfSAorCisjaW5jbHVkZSAiRWdsU3VyZmFjZS5oIgorCitjbGFzcyBFZ2xEaXNwbGF5OworCitjbGFzcyBFZ2xQYnVmZmVyU3VyZmFjZTpwdWJsaWMgRWdsU3VyZmFjZSB7CitwdWJsaWM6CisgICAgRWdsUGJ1ZmZlclN1cmZhY2UoRWdsRGlzcGxheSAqZHB5LCBFZ2xDb25maWcqIGNvbmZpZyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbFN1cmZhY2UoZHB5LFBCVUZGRVIsY29uZmlnLDAsMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdGV4Rm9ybWF0KEVHTF9OT19URVhUVVJFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90ZXhUYXJnZXQoRUdMX05PX1RFWFRVUkUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3RleE1pcG1hcChFR0xfRkFMU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhcmdlc3QoRUdMX0ZBTFNFKXt9OworCisgICAgdm9pZCAgc2V0TmF0aXZlUGJ1ZmZlcihFZ2xPUzo6U3VyZmFjZSogc3JmYykgeyBtX25hdGl2ZSA9IHNyZmM7IH0KKyAgICBib29sICBzZXRBdHRyaWIoRUdMaW50IGF0dHJpYixFR0xpbnQgdmFsKTsKKyAgICBib29sICBnZXRBdHRyaWIoRUdMaW50IGF0dHJpYixFR0xpbnQqIHZhbCk7CisgICAgdm9pZCAgZ2V0RGltKEVHTGludCogd2lkdGgsRUdMaW50KiBoZWlnaHQsRUdMaW50KiBsYXJnZXN0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKndpZHRoID0gbV93aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhlaWdodCA9IG1faGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGFyZ2VzdCA9IG1fbGFyZ2VzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgdm9pZCBnZXRUZXhJbmZvKEVHTGludCogZm9ybWF0LEVHTGludCogdGFyZ2V0KXsgKmZvcm1hdCA9IG1fdGV4Rm9ybWF0OyAqdGFyZ2V0ID0gbV90ZXhUYXJnZXQ7fQorCitwcml2YXRlOgorICAgIEVHTGludCAgICAgICAgICAgICAgIG1fdGV4Rm9ybWF0OworICAgIEVHTGludCAgICAgICAgICAgICAgIG1fdGV4VGFyZ2V0OworICAgIEVHTGludCAgICAgICAgICAgICAgIG1fdGV4TWlwbWFwOworICAgIEVHTGludCAgICAgICAgICAgICAgIG1fbGFyZ2VzdDsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsU3VyZmFjZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTYwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFN1cmZhY2UuY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiRWdsU3VyZmFjZS5oIgorCisjaW5jbHVkZSAiRWdsRGlzcGxheS5oIgorI2luY2x1ZGUgIkVnbE9zQXBpLmgiCisKK3Vuc2lnbmVkIGludCBFZ2xTdXJmYWNlOjpzX25leHRTdXJmYWNlSG5kbCA9IDA7CisKK0VnbFN1cmZhY2U6On5FZ2xTdXJmYWNlKCl7IAorCisgICAgaWYobV90eXBlID09IEVnbFN1cmZhY2U6OlBCVUZGRVIpIHsKKyAgICAgICAgbV9kcHktPm5hdGl2ZVR5cGUoKS0+cmVsZWFzZVBidWZmZXIobV9uYXRpdmUpOworICAgIH0KKworICAgIGRlbGV0ZSBtX25hdGl2ZTsKK30KKworYm9vbCAgRWdsU3VyZmFjZTo6c2V0QXR0cmliKEVHTGludCBhdHRyaWIsRUdMaW50IHZhbCkgeworICAgIHN3aXRjaChhdHRyaWIpIHsKKyAgICBjYXNlIEVHTF9XSURUSDoKKyAgICBjYXNlIEVHTF9IRUlHSFQ6CisgICAgY2FzZSBFR0xfTEFSR0VTVF9QQlVGRkVSOgorICAgIGNhc2UgRUdMX1RFWFRVUkVfRk9STUFUOgorICAgIGNhc2UgRUdMX1RFWFRVUkVfVEFSR0VUOgorICAgIGNhc2UgRUdMX01JUE1BUF9URVhUVVJFOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xTdXJmYWNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWE2YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xTdXJmYWNlLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgRUdMX1NVUkZBQ0VfSAorI2RlZmluZSBFR0xfU1VSRkFDRV9ICisKKyNpbmNsdWRlICJFZ2xDb25maWcuaCIKKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NtYXJ0X3B0ci5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorCitjbGFzcyBFZ2xTdXJmYWNlOwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8RWdsU3VyZmFjZT4gU3VyZmFjZVB0cjsKKworY2xhc3MgRWdsRGlzcGxheTsKKworY2xhc3MgRWdsU3VyZmFjZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgV0lORE9XICA9IDAsCisgICAgICAgIFBCVUZGRVIgPSAxLAorICAgICAgICBQSVhNQVAgID0gMworICAgIH0gRVN1cmZhY2VUeXBlOworCisgICAgRVN1cmZhY2VUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgIEVnbE9TOjpTdXJmYWNlKiBuYXRpdmUoKSBjb25zdCB7IHJldHVybiBtX25hdGl2ZTsgfQorCisgICAgdmlydHVhbCBib29sIHNldEF0dHJpYihFR0xpbnQgYXR0cmliLCBFR0xpbnQgdmFsKTsKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0QXR0cmliKEVHTGludCBhdHRyaWIsIEVHTGludCogdmFsKSA9IDA7CisKKyAgICB2b2lkIHNldERpbShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICAgICAgbV93aWR0aCA9IHdpZHRoOworICAgICAgICBtX2hlaWdodCA9IGhlaWdodDsKKyAgICB9CisKKyAgICBFZ2xDb25maWcqIGdldENvbmZpZygpIGNvbnN0IHsgcmV0dXJuIG1fY29uZmlnOyB9CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0SG5kbCgpIGNvbnN0IHsgcmV0dXJuIG1faG5kbDsgfQorCisgICAgdmlydHVhbCB+RWdsU3VyZmFjZSgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc19uZXh0U3VyZmFjZUhuZGw7CisKKyAgICBFU3VyZmFjZVR5cGUgbV90eXBlID0gV0lORE9XOworICAgIHVuc2lnbmVkIGludCBtX2huZGwgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgRWdsU3VyZmFjZShFZ2xEaXNwbGF5ICpkcHksCisgICAgICAgICAgICAgICBFU3VyZmFjZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgIEVnbENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgRUdMaW50IHdpZHRoLAorICAgICAgICAgICAgICAgRUdMaW50IGhlaWdodCkgOgorICAgICAgIG1fdHlwZSh0eXBlKSwKKyAgICAgICBtX2NvbmZpZyhjb25maWcpLAorICAgICAgIG1fd2lkdGgod2lkdGgpLAorICAgICAgIG1faGVpZ2h0KGhlaWdodCksCisgICAgICAgbV9kcHkoZHB5KQorICAgIHsKKyAgICAgICAgbV9obmRsID0gKytzX25leHRTdXJmYWNlSG5kbDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBFZ2xDb25maWcqICAgICAgICAgICAgbV9jb25maWcgPSBudWxscHRyOworICAgIEVHTGludCAgICAgICAgICAgICAgICBtX3dpZHRoID0gMDsKKyAgICBFR0xpbnQgICAgICAgICAgICAgICAgbV9oZWlnaHQgPSAwOworICAgIEVnbE9TOjpTdXJmYWNlKiAgICAgICBtX25hdGl2ZSA9IG51bGxwdHI7CisgICAgRWdsRGlzcGxheSogICAgICAgICAgIG1fZHB5ID0gbnVsbHB0cjsKK307CisKKyNlbmRpZiAgLy8gRUdMX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xUaHJlYWRJbmZvLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsVGhyZWFkSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4MTc3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsVGhyZWFkSW5mby5jcHAKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xUaHJlYWRJbmZvLmgiCisjaW5jbHVkZSAiRWdsT3NBcGkuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3RocmVhZF9zdG9yZS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBFZ2xUaHJlYWRJbmZvU3RvcmUgOiBwdWJsaWMgZW11Z2w6OlRocmVhZFN0b3JlIHsKK3B1YmxpYzoKKyAgICBFZ2xUaHJlYWRJbmZvU3RvcmUoKSA6IGVtdWdsOjpUaHJlYWRTdG9yZSgmZGVzdHJ1Y3Rvcikge30KK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgZGVzdHJ1Y3Rvcih2b2lkKiB2YWx1ZSkgeworICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8RWdsVGhyZWFkSW5mbyo+KHZhbHVlKTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworRWdsVGhyZWFkSW5mbzo6RWdsVGhyZWFkSW5mbygpIDoKKyAgICAgICAgbV9lcnIoRUdMX1NVQ0NFU1MpLCBtX2FwaShFR0xfT1BFTkdMX0VTX0FQSSkge30KKworc3RhdGljIGVtdWdsOjpMYXp5SW5zdGFuY2U8RWdsVGhyZWFkSW5mb1N0b3JlPiBzX3RscyA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworRWdsVGhyZWFkSW5mbyogRWdsVGhyZWFkSW5mbzo6Z2V0KHZvaWQpCit7CisgICAgRWdsVGhyZWFkSW5mbyAqdGkgPSBzdGF0aWNfY2FzdDxFZ2xUaHJlYWRJbmZvKj4oc190bHMtPmdldCgpKTsKKyAgICBpZiAoIXRpKSB7CisgICAgICAgIHRpID0gbmV3IEVnbFRocmVhZEluZm8oKTsKKyAgICAgICAgc190bHMtPnNldCh0aSk7CisgICAgfQorICAgIHJldHVybiB0aTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xUaHJlYWRJbmZvLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFRocmVhZEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWVlYjZhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9FZ2xUaHJlYWRJbmZvLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgRUdMX1RIUkVBRF9JTkZPX0gKKyNkZWZpbmUgRUdMX1RIUkVBRF9JTkZPX0gKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworLy8gTW9kZWwgdGhyZWFkLXNwZWNpZmljIEVHTCBzdGF0ZS4KK2NsYXNzIEVnbFRocmVhZEluZm8geworcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgdGhyZWFkLXNwZWNpZmljIGluc3RhbmNlIG9mIEVnbFRocmVhZEluZm8gdG8gdGhlIGNhbGxlci4KKyAgICAvLyBUaGUgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkIG9uIGZpcnN0IGNhbGwsIGFuZCBkZXN0cm95ZWQgYXV0b21hdGljYWxseQorICAgIC8vIHdoZW4gdGhlIHRocmVhZCBleGl0cy4KKyAgICBzdGF0aWMgRWdsVGhyZWFkSW5mbyogZ2V0KHZvaWQpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7CisKKyAgICAvLyBTZXQgdGhlIGVycm9yIGNvZGUgfGVycnwuIERlZmF1bHQgdmFsdWUgaXMgRUdMX05PX0VSUk9SLgorICAgIHZvaWQgc2V0RXJyb3IoRUdMaW50IGVycikgeyBtX2VyciA9IGVycjsgfQorCisgICAgLy8gR2V0IHRoZSBlcnJvciBjb2RlLiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUsCisgICAgLy8gdW5saWtlIGVnbEdldEVycm9yKCkgd2hpY2ggcmVzZXRzIGl0IHRvIEVHTF9OT19FUlJPUi4KKyAgICBFR0xpbnQgZ2V0RXJyb3IoKSBjb25zdCB7IHJldHVybiBtX2VycjsgfQorCisgICAgLy8gQ2hhbmdlIHRoZSB8YXBpfCB2YWx1ZS4gRGVmYXVsdCBpcyBFR0xfT1BFTkdMX0VTCisgICAgdm9pZCBzZXRBcGkoRUdMZW51bSBhcGkpIHsgbV9hcGkgPSBhcGk7IH0KKworICAgIC8vIEdldCB0aGUgY3VycmVudCBBUEkgdmFsdWUuCisgICAgRUdMZW51bSBnZXRBcGkoKSBjb25zdCB7IHJldHVybiBtX2FwaTsgfQorCitwcml2YXRlOgorICAgIEVnbFRocmVhZEluZm8oKTsKKworICAgIEVHTGludCBtX2VycjsKKyAgICBFR0xlbnVtIG1fYXBpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFZhbGlkYXRlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsVmFsaWRhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGM1NWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFZhbGlkYXRlLmNwcApAQCAtMCwwICsxLDExNCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJFZ2xWYWxpZGF0ZS5oIgorI2luY2x1ZGUgPEdMY29tbW9uL0dMdXRpbHMuaD4KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjpjb25mQXR0cmliKEVHTGludCBhdHRyaWIpIHsKKyAgICBzd2l0Y2goYXR0cmliKSB7CisgICAgY2FzZSBFR0xfQlVGRkVSX1NJWkU6CisgICAgY2FzZSBFR0xfUkVEX1NJWkU6CisgICAgY2FzZSBFR0xfR1JFRU5fU0laRToKKyAgICBjYXNlIEVHTF9CTFVFX1NJWkU6CisgICAgY2FzZSBFR0xfQUxQSEFfU0laRToKKyAgICBjYXNlIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCOgorICAgIGNhc2UgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBOgorICAgIGNhc2UgRUdMX0NPTkZJR19DQVZFQVQ6CisgICAgY2FzZSBFR0xfQ09ORklHX0lEOgorICAgIGNhc2UgRUdMX0RFUFRIX1NJWkU6CisgICAgY2FzZSBFR0xfTEVWRUw6CisgICAgY2FzZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEg6CisgICAgY2FzZSBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUOgorICAgIGNhc2UgRUdMX01BWF9QQlVGRkVSX1BJWEVMUzoKKyAgICBjYXNlIEVHTF9NQVhfU1dBUF9JTlRFUlZBTDoKKyAgICBjYXNlIEVHTF9NSU5fU1dBUF9JTlRFUlZBTDoKKyAgICBjYXNlIEVHTF9SRU5ERVJBQkxFX1RZUEU6CisgICAgY2FzZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEU6CisgICAgY2FzZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRDoKKyAgICBjYXNlIEVHTF9OQVRJVkVfVklTVUFMX1RZUEU6CisgICAgY2FzZSBFR0xfU0FNUExFX0JVRkZFUlM6CisgICAgY2FzZSBFR0xfU0FNUExFUzoKKyAgICBjYXNlIEVHTF9TVEVOQ0lMX1NJWkU6CisgICAgY2FzZSBFR0xfU1VSRkFDRV9UWVBFOgorICAgIGNhc2UgRUdMX0NPTE9SX0JVRkZFUl9UWVBFOgorICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX1RZUEU6CisgICAgY2FzZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFOgorICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFOgorICAgIGNhc2UgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUU6CisgICAgY2FzZSBFR0xfUkVDT1JEQUJMRV9BTkRST0lEOgorICAgIGNhc2UgRUdMX0NPTkZPUk1BTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHN0YXRpYworYm9vbCBFZ2xWYWxpZGF0ZTo6bm9BdHRyaWJzKGNvbnN0IEVHTGludCogYXR0cmliKSB7CisgICAgcmV0dXJuICFhdHRyaWIgfHwgYXR0cmliWzBdID09IEVHTF9OT05FIDsKK30KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjpwYnVmZmVyQXR0cmlicyhFR0xpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RleEZvcm1hdE5vVGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RleFRhcmdldE5vVGV4KSB7CisgICAgaWYoIWlzVGV4Rm9ybWF0Tm9UZXgpIHsKKyAgICAgICAgaWYgKCEoaXNQb3dlck9mMih3aWR0aCkgJiYgaXNQb3dlck9mMihoZWlnaHQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpc1RleEZvcm1hdE5vVGV4ID09IGlzVGV4VGFyZ2V0Tm9UZXggOworfQorCisvLyBzdGF0aWMKK2Jvb2wgRWdsVmFsaWRhdGU6OnJlbGVhc2VDb250ZXh0KEVHTENvbnRleHQgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgczIpIHsKKyAgICByZXR1cm4gKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgJiYKKyAgICAgICAgICAgKHMxID09IEVHTF9OT19TVVJGQUNFKSAgJiYKKyAgICAgICAgICAgKHMyID09IEVHTF9OT19TVVJGQUNFKTsKK30KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjpiYWRDb250ZXh0TWF0Y2goRUdMQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSBzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xTdXJmYWNlIHMyKSB7CisgICAgcmV0dXJuIChjdHggIT0gRUdMX05PX0NPTlRFWFQpCisgICAgICAgICAgICA/IChzMSA9PSBFR0xfTk9fU1VSRkFDRSB8fCBzMiA9PSBFR0xfTk9fU1VSRkFDRSkKKyAgICAgICAgICAgIDogKHMxICE9IEVHTF9OT19TVVJGQUNFIHx8IHMyICE9IEVHTF9OT19TVVJGQUNFKTsKK30KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjpzdXJmYWNlVGFyZ2V0KEVHTGludCB0YXJnZXQpIHsKKyAgICByZXR1cm4gdGFyZ2V0ID09IEVHTF9SRUFEIHx8IHRhcmdldCA9PSBFR0xfRFJBVzsKK30KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjplbmdpbmUoRUdMaW50IGVuZ2luZSkgeworICAgIHJldHVybiBlbmdpbmUgPT0gRUdMX0NPUkVfTkFUSVZFX0VOR0lORTsKK30KKworLy8gc3RhdGljCitib29sIEVnbFZhbGlkYXRlOjpzdHJpbmdOYW1lKEVHTGludCBuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUgPT0gRUdMX1ZFTkRPUiAgfHwKKyAgICAgICAgICAgbmFtZSA9PSBFR0xfVkVSU0lPTiB8fAorICAgICAgICAgICBuYW1lID09IEVHTF9FWFRFTlNJT05TOworfQorCisvLyBzdGF0aWMKK2Jvb2wgRWdsVmFsaWRhdGU6OnN1cHBvcnRlZEFwaShFR0xlbnVtIGFwaSkgeworICAgIHJldHVybiBhcGkgPT0gRUdMX09QRU5HTF9FU19BUEk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFZhbGlkYXRlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViYTczNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsVmFsaWRhdGUuaApAQCAtMCwwICsxLDc2IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBFR0xfVkFMSURBVEVfSAorI2RlZmluZSBFR0xfVkFMSURBVEVfSAorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KKworY2xhc3MgRWdsVmFsaWRhdGUgeworcHVibGljOgorICAgIC8vIFJldHVybiB0cnVlIGlmZiB8YXR0cmlifCBpcyBhIHZhbGlkIEVHTENvbmZpZyBhdHRyaWJ1dGUgbmFtZS4KKyAgICBzdGF0aWMgYm9vbCBjb25mQXR0cmliKEVHTGludCBhdHRyaWIpOworCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIHxhdHRyaWJ8IGlzIE5VTEwsIG9yIHxhdHRyaWJbMF18IGlzIEVHTF9OT05FLCB3aGljaAorICAgIC8vIGNvcnJlc3BvbmQgdG8gZW1wdHkgY29uZmlnIGF0dHJpYnV0ZSBsaXN0cy4KKyAgICBzdGF0aWMgYm9vbCBub0F0dHJpYnMoY29uc3QgRUdMaW50KiBhdHRyaWIpOworCisgICAgLy8gVXNlZCB0byBjaGVjayB0aGF0IHRoZSBjb25maWcgYXR0cmlidXRlcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBwYnVmZmVyCisgICAgLy8gYXJlIGNvcnJlY3QuIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgUEJ1ZmZlcidzIGRpbWVuc2lvbnMgaW4KKyAgICAvLyBwaXhlbHMuIHx0ZXhGb3JtYXRJc05vVGV4dHwgaXMgdHJ1ZSBpZmYgdGhlIFBCdWZmZXIncyB0ZXh0dXJlIGZvcm1hdAorICAgIC8vIGlmIEVHTF9OT19URVhUVVJFLiB8dGV4VGFyZ2V0SXNOb1RleHwgaXMgdHJ1ZSBpZmYgdGhlIFBCdWZmZXIncyB0YXJnZXQKKyAgICAvLyBpcyBFR0xfTk9fVEVYVFVSRS4KKyAgICBzdGF0aWMgYm9vbCBwYnVmZmVyQXR0cmlicyhFR0xpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRleEZvcm1hdElzTm9UZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXhUYXJnZXRJc05vVGV4KTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHxjdHh8IGlzIEVHTF9OT19DT05URVhULCBhbmQgYm90aCB8ZHJhd3wgYW5kIHxyZWFkfAorICAgIC8vIGFyZSBFR0xfTk9fU1VSRkFDRS4gVGhpcyBjb3JyZXNwb25kcyB0byBhbiBlZ2xNYWtlQ3VycmVudCBvcGVyYXRpb24KKyAgICAvLyB1c2VkIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZHJhdy9yZWFkIHN1cmZhY2VzIGF0IHRoZQorICAgIC8vIHNhbWUgdGltZS4KKyAgICBzdGF0aWMgYm9vbCByZWxlYXNlQ29udGV4dChFR0xDb250ZXh0IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xTdXJmYWNlIGRyYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkKTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgfGN0eHwsIHxkcmF3fCBhbmQgfHJlYWR8IGRvIF9ub3RfIG1hdGNoCisgICAgLy8gdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAvLworICAgIC8vIC0gSWYgfGN0eHwgaXMgRUdMX05PX0NPTlRFWFQsIHRoZW4gfGRyYXd8IGFuZCB8cmVhZHwgbXVzdCBiZQorICAgIC8vICAgRUdMX05PX1NVUkZBQ0UuCisgICAgLy8KKyAgICAvLyAtIElmIHxjdHh8IGlzIG5vdCBFR0xfTk9fQ09OVEVYVCwgdGhlbiB8ZHJhd3wgYW5kIHxyZWFkfCBtdXN0IG5vdAorICAgIC8vICAgYmUgRUdMX05PX1NVUkZBQ0UuCisgICAgLy8KKyAgICBzdGF0aWMgYm9vbCBiYWRDb250ZXh0TWF0Y2goRUdMQ29udGV4dCBjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgZHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMU3VyZmFjZSByZWFkKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgfHRhcmdldHwgaXMgZWl0aGVyIEVHTF9EUkFXIG9yIEVHTF9SRUFELgorICAgIHN0YXRpYyBib29sIHN1cmZhY2VUYXJnZXQoRUdMaW50IHRhcmdldCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWZmIHxlbmdpbmV8IGlzIEVHTF9DT1JFX05BVElWRV9SRU5ERVJFUgorICAgIHN0YXRpYyBib29sIGVuZ2luZShFR0xpbnQgZW5naW5lKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZmYgfG5hbWV8IGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSBvZiBhIHN0cmluZywgZS5nLgorICAgIC8vIEVHTF9WRU5ET1IsIEVHTF9WRVJTSU9OIG9yIEVHTF9FWFRFTlNJT05TLgorICAgIHN0YXRpYyBib29sIHN0cmluZ05hbWUoRUdMaW50IG5hbWUpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB8YXBpfCBpcyB0aGUgdmFsdWUgb2YgYSBzdXBwb3J0ZWQgQVBJLCBlLmcuCisgICAgLy8gRUdMX09QRU5HTF9FU19BUEkuCisgICAgc3RhdGljIGJvb2wgc3VwcG9ydGVkQXBpKEVHTGVudW0gYXBpKTsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsV2luZG93U3VyZmFjZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFdpbmRvd1N1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFdpbmRvd1N1cmZhY2UuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiRWdsV2luZG93U3VyZmFjZS5oIgorI2luY2x1ZGUgIkVnbEdsb2JhbEluZm8uaCIKKyNpbmNsdWRlICJFZ2xPc0FwaS5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xhenlfaW5zdGFuY2UuaCIKKworLy8gdGhpcyBzdGF0aWMgbWVtYmVyIGlzIGFjY2Vzc2VkIGZyb20gYSBmdW5jdGlvbiByZWdpc3RlcmVkIGluIG9uZXhpdCgpCisvLyBmb3IgdGhlIGVtdWxhdG9yIGNsZWFudXAuIEFzIGFsbCBzdGF0aWMgQysrIG9iamVjdHMgYXJlIGFsc28gYmVpbmcgZnJlZWQKKy8vIGZyb20gYSBzeXN0ZW0gaGFuZGxlciByZWdpc3RlcmVkIGluIG9uZXhpdCgpLCB3ZSBjYW4ndCBoYXZlIGEgY2xhc3Mgb2JqZWN0CisvLyBieSB2YWx1ZSBoZXJlIC0gaXQgd291bGQgYmUgcHJvbmUgdG8gdW5zdGFibGUgZGVpbml0aWFsaXphdGlvbiBvcmRlciBpc3N1ZTsKK3N0YXRpYyBlbXVnbDo6TGF6eUluc3RhbmNlPHN0ZDo6c2V0PEVHTE5hdGl2ZVdpbmRvd1R5cGU+PgorICAgIHNfYXNzb2NpYXRlZFdpbnMgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK2Jvb2wgRWdsV2luZG93U3VyZmFjZTo6YWxyZWFkeUFzc29jaWF0ZWRXaXRoQ29uZmlnKEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luKSB7CisgICAgcmV0dXJuIHNfYXNzb2NpYXRlZFdpbnMuZ2V0KCkuZmluZCh3aW4pICE9IHNfYXNzb2NpYXRlZFdpbnMuZ2V0KCkuZW5kKCk7Cit9CisKK0VnbFdpbmRvd1N1cmZhY2U6OkVnbFdpbmRvd1N1cmZhY2UoRWdsRGlzcGxheSogZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWdsQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGhlaWdodCkgOgorICAgICAgICBFZ2xTdXJmYWNlKGRweSwgV0lORE9XLCBjb25maWcsIHdpZHRoLCBoZWlnaHQpLAorICAgICAgICBtX3dpbih3aW4pIHsKKyAgICBzX2Fzc29jaWF0ZWRXaW5zLmdldCgpLmluc2VydCh3aW4pOworICAgIEVnbE9TOjpFbmdpbmUqIGVuZ2luZSA9IEVnbEdsb2JhbEluZm86OmdldEluc3RhbmNlKCktPmdldE9zRW5naW5lKCk7CisgICAgbV9uYXRpdmUgPSBlbmdpbmUtPmNyZWF0ZVdpbmRvd1N1cmZhY2Uod2luKTsKK30KKworRWdsV2luZG93U3VyZmFjZTo6fkVnbFdpbmRvd1N1cmZhY2UoKSB7CisgICAgc19hc3NvY2lhdGVkV2lucy5nZXQoKS5lcmFzZShtX3dpbik7Cit9CisKK2Jvb2wgIEVnbFdpbmRvd1N1cmZhY2U6OmdldEF0dHJpYihFR0xpbnQgYXR0cmliLEVHTGludCogdmFsKSB7CisgICAgc3dpdGNoKGF0dHJpYikgeworICAgIGNhc2UgRUdMX0NPTkZJR19JRDoKKyAgICAgICAgKnZhbCA9IG1fY29uZmlnLT5pZCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9XSURUSDoKKyAgICAgICAgKnZhbCA9IG1fd2lkdGg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUdMX0hFSUdIVDoKKyAgICAgICAgKnZhbCA9IG1faGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVHTF9MQVJHRVNUX1BCVUZGRVI6CisgICAgY2FzZSBFR0xfVEVYVFVSRV9GT1JNQVQ6CisgICAgY2FzZSBFR0xfVEVYVFVSRV9UQVJHRVQ6CisgICAgY2FzZSBFR0xfTUlQTUFQX1RFWFRVUkU6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFdpbmRvd1N1cmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvRWdsV2luZG93U3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MmE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML0VnbFdpbmRvd1N1cmZhY2UuaApAQCAtMCwwICsxLDQ0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBFR0xfV0lORE9XX1NVUkZBQ0VfSAorI2RlZmluZSBFR0xfV0lORE9XX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlICJFZ2xTdXJmYWNlLmgiCisjaW5jbHVkZSAiRWdsQ29uZmlnLmgiCisKK2NsYXNzIEVnbERpc3BsYXk7CisKK2NsYXNzIEVnbFdpbmRvd1N1cmZhY2U6IHB1YmxpYyBFZ2xTdXJmYWNlIHsKK3B1YmxpYzoKKyAgICBFZ2xXaW5kb3dTdXJmYWNlKEVnbERpc3BsYXkqIGRweSwKKyAgICAgICAgICAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luLAorICAgICAgICAgICAgICAgICAgICAgRWdsQ29uZmlnKiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisgICAgfkVnbFdpbmRvd1N1cmZhY2UoKTsKKworICAgIGJvb2wgIGdldEF0dHJpYihFR0xpbnQgYXR0cmliLEVHTGludCogdmFsKTsKKworICAgIHN0YXRpYyBib29sIGFscmVhZHlBc3NvY2lhdGVkV2l0aENvbmZpZyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbik7CisKK3ByaXZhdGU6CisgICAgRUdMTmF0aXZlV2luZG93VHlwZSBtX3dpbjsKK307CisKKyNlbmRpZiAgLy8gRUdMX1dJTkRPV19TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvTWFjTmF0aXZlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML01hY05hdGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmUxODIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML01hY05hdGl2ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiAgTUFDX05BVElWRV9ICisjZGVmaW5lICBNQUNfTkFUSVZFX0gKKworI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorCit0eXBlZGVmIGVudW0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWMgZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICAgTUFDX0hBU19ET1VCTEVfQlVGRkVSID0gNSwgIC8vIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyCisgICAgICAgICAgICAgICAgIE1BQ19EUkFXX1RPX1dJTkRPVyAgICA9IDgwLCAvLyBOU09wZW5HTFBGQVdpbmRvdworICAgICAgICAgICAgICAgICBNQUNfRFJBV19UT19QQlVGRkVSICAgPSA5MCwgLy8gTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlcgorICAgICAgICAgICAgICAgICBNQUNfU0FNUExFU19QRVJfUElYRUwgPSA1NiwgLy8gTlNPcGVuR0xQRkFTYW1wbGVzCisgICAgICAgICAgICAgICAgIE1BQ19DT0xPUl9TSVpFICAgICAgICA9IDgsICAvLyBOU09wZW5HTFBGQUNvbG9yU2l6ZQorICAgICAgICAgICAgICAgICBNQUNfQUxQSEFfU0laRSAgICAgICAgPSAxMSwgLy8gTlNPcGVuR0xQRkFBbHBoYVNpemUKKyAgICAgICAgICAgICAgICAgTUFDX0RFUFRIX1NJWkUgICAgICAgID0gMTIsIC8vIE5TT3BlbkdMUEZBRGVwdGhTaXplCisgICAgICAgICAgICAgICAgIE1BQ19TVEVOQ0lMX1NJWkUgICAgICA9IDEzICAvLyBOU09wZW5HTFBGQVN0ZW5jaWxTaXplCisgICAgICAgICAgICAgfSBNYWNQaXhlbEZvcm1hdEF0dHJpYnM7CisKKworZXh0ZXJuICJDInsKKworaW50ICAgZ2V0TnVtUGl4ZWxGb3JtYXRzKCk7Cit2b2lkKiBnZXRQaXhlbEZvcm1hdChpbnQgaSk7CitpbnQgICBnZXRQaXhlbEZvcm1hdERlZmluaXRpb25BbHBoYShpbnQgaSk7Cit2b2lkICBnZXRQaXhlbEZvcm1hdEF0dHJpYih2b2lkKiBwaXhlbEZvcm1hdCxpbnQgYXR0cmliLGludCogdmFsKTsKK3ZvaWQqIG5zQ3JlYXRlQ29udGV4dCh2b2lkKiBmb3JtYXQsdm9pZCogc2hhcmUpOwordm9pZCAgbnNXaW5kb3dNYWtlQ3VycmVudCh2b2lkKiBjb250ZXh0LHZvaWQqIG5hdGl2ZVdpbik7Cit2b2lkICBuc1BCdWZmZXJNYWtlQ3VycmVudCh2b2lkKiBjb250ZXh0LHZvaWQqIG5hdGl2ZVBCdWZmZXIsaW50IGxldmVsKTsKK3ZvaWQgIG5zU3dhcEJ1ZmZlcnMoKTsKK3ZvaWQgIG5zU3dhcEludGVydmFsKGludCAqaW50ZXJ2YWwpOwordm9pZCAgbnNEZXN0cm95Q29udGV4dCh2b2lkKiBjb250ZXh0KTsKK3ZvaWQqIG5zQ3JlYXRlUEJ1ZmZlcihHTGVudW0gdGFyZ2V0LEdMZW51bSBmb3JtYXQsaW50IG1heE1pcCxpbnQgd2lkdGgsaW50IGhlaWdodCk7Cit2b2lkICBuc0Rlc3Ryb3lQQnVmZmVyKHZvaWQqIHBidWZmZXIpOworYm9vbCAgbnNHZXRXaW5EaW1zKHZvaWQqIHdpbix1bnNpZ25lZCBpbnQqIHdpZHRoLHVuc2lnbmVkIGludCogaGVpZ2h0KTsKK2Jvb2wgIG5zQ2hlY2tDb2xvcih2b2lkKiB3aW4saW50IGNvbG9yU2l6ZSk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML01hY05hdGl2ZS5tIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNOYXRpdmUubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNlYTkzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNOYXRpdmUubQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPENvY29hL0NvY29hLmg+CisjaW5jbHVkZSA8T3BlbkdML09wZW5HTC5oPgorI2luY2x1ZGUgIk1hY1BpeGVsRm9ybWF0c0F0dHJpYnMuaCIKKworLy8KKy8vIEVtdUdMQ29udGV4dCBpbmhlcml0IGZyb20gTlNPcGVuR0xDb250ZXh0CisvLyBhbmQgYWRkcyBiaW5kaW5nIHN0YXRlIGZvciB0aGUgY29udGV4dCB0byBrbm93CisvLyBpZiBpdCB3YXMgbGFzdCBib3VuZGVkIHRvIGEgcGJ1ZmZlciBvciBhIHdpbmRvdy4KKy8vIFRoaXMgaXMgYmVjYXVzZSBhZnRlciB0aGUgY29udGV4dCB3YXMgYm91bmRlZCB0bworLy8gYSBQYnVmZmVyLCBiZWZvcmUgd2UgYmluZCBpdCB0byBhIHdpbmRvdyB3ZSBtdXN0CisvLyByZWxlYXNlIGl0IGZvcm0gdGhlIHBidWZmZXIgYnkgY2FsbGluZyB0aGUKKy8vIGNsZWFyRHJhd2FibGUgbWV0aG9kLiBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGNsZWFyRHJhd2FibGUKKy8vIG1vcmUgdGhhbiByZWFsbHkgbmVlZGVkIHNpbmNlIHdoZW4gaXQgaXMgY2FsbGVkIGF0IGEgdGltZQorLy8gdGhhdCBhIHdpbmRvdyBpcyBib3VuZGVkIHRvIHRoZSBjb250ZXh0IGl0IHdpbGwgY2xlYXIgdGhlCisvLyB3aW5kb3cgY29udGVudCBjYXVzaW5nIGZsaWNrZXJpbmcgZWZmZWN0LgorLy8gVGhlcmVyZm9yZSB3ZSBjYWxsIGNsZWFyRHJhd2FibGUgb25seSB3aGVuIHdlIGJpbmQgdGhlIGNvbnRleHQKKy8vIHRvIGEgd2luZG93IGFuZCBpdCB3YXMgcHJldmlvdXNseSBib3VuZCB0byBhIFBidWZmZXIuCisvLworQGludGVyZmFjZSBFbXVHTENvbnRleHQgOiBOU09wZW5HTENvbnRleHQgeworICAgIEBwcml2YXRlCisgICAgICAgIGludCBib3VuZFRvUGJ1ZmZlcjsKKyAgICAgICAgaW50IGJvdW5kVG9XaW47Cit9CisKKy0gKGlkKSBpbml0V2l0aEZvcm1hdDooTlNPcGVuR0xQaXhlbEZvcm1hdCAqKXBpeGVsRm9ybWF0IHNoYXJlQ29udGV4dDooTlNPcGVuR0xDb250ZXh0ICopc2hhcmU7CistICh2b2lkKSBwcmVCaW5kOihpbnQpZm9yUGJ1ZmZlcjsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIEVtdUdMQ29udGV4dAorLSAoaWQpIGluaXRXaXRoRm9ybWF0OihOU09wZW5HTFBpeGVsRm9ybWF0ICopcGl4ZWxGb3JtYXQgc2hhcmVDb250ZXh0OihOU09wZW5HTENvbnRleHQgKilzaGFyZQoreworICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhGb3JtYXQ6cGl4ZWxGb3JtYXQgc2hhcmVDb250ZXh0OnNoYXJlXTsKKyAgICBpZiAoc2VsZiAhPSBuaWwpIHsKKyAgICAgICAgYm91bmRUb1BidWZmZXIgPSAwOworICAgICAgICBib3VuZFRvV2luID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpIHByZUJpbmQ6KGludClmb3JQYnVmZmVyCit7CisgICAgaWYgKCghZm9yUGJ1ZmZlciAmJiBib3VuZFRvUGJ1ZmZlcikpIHsKKyAgICAgICAgW3NlbGYgY2xlYXJEcmF3YWJsZV07IAorICAgIH0KKyAgICBib3VuZFRvUGJ1ZmZlciA9IGZvclBidWZmZXI7CisgICAgYm91bmRUb1dpbiA9ICFib3VuZFRvUGJ1ZmZlcjsKK30KK0BlbmQKKworaW50IGdldE51bVBpeGVsRm9ybWF0cygpeworICAgIGludCBzaXplOworICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUqKiBhdHRyaWJfbGlzdHMgPSBnZXRQaXhlbEZvcm1hdHNBdHRyaWJ1dGVzKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKwordm9pZCogZ2V0UGl4ZWxGb3JtYXQoaW50IGkpeworICAgIGludCBzaXplOworICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUqKiBhdHRyaWJfbGlzdHMgPSBnZXRQaXhlbEZvcm1hdHNBdHRyaWJ1dGVzKCZzaXplKTsKKyAgICByZXR1cm4gW1tOU09wZW5HTFBpeGVsRm9ybWF0IGFsbG9jXSBpbml0V2l0aEF0dHJpYnV0ZXM6YXR0cmliX2xpc3RzW2ldXTsKK30KKworaW50IGdldFBpeGVsRm9ybWF0RGVmaW5pdGlvbkFscGhhKGludCBpKSB7CisgICAgaW50IHNpemU7CisgICAgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSoqIGF0dHJpYl9saXN0cyA9IGdldFBpeGVsRm9ybWF0c0F0dHJpYnV0ZXMoJnNpemUpOworICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUqIGF0dHJpYnMgPSBhdHRyaWJfbGlzdHNbaV07CisgICAgd2hpbGUgKCphdHRyaWJzKSB7CisgICAgICAgIHN3aXRjaCAoKmF0dHJpYnMpIHsKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBvbmVzIHRoYXQgdGFrZSBhIHZhbHVlLCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgLy8gTlNPcGVuR0xQaXhlbEZvcm1hdCBkb2NzCisgICAgICAgIGNhc2UgTlNPcGVuR0xQRkFBdXhCdWZmZXJzOgorICAgICAgICBjYXNlIE5TT3BlbkdMUEZBQ29sb3JTaXplOgorICAgICAgICBjYXNlIE5TT3BlbkdMUEZBRGVwdGhTaXplOgorICAgICAgICBjYXNlIE5TT3BlbkdMUEZBU3RlbmNpbFNpemU6CisgICAgICAgIGNhc2UgTlNPcGVuR0xQRkFBY2N1bVNpemU6CisgICAgICAgIGNhc2UgTlNPcGVuR0xQRkFSZW5kZXJlcklEOgorICAgICAgICBjYXNlIE5TT3BlbkdMUEZBU2NyZWVuTWFzazoKKyAgICAgICAgICAgIGF0dHJpYnMgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT3BlbkdMUEZBQWxwaGFTaXplOgorICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnNbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gQWxsIG90aGVyIGF0dHJpYnV0ZXMgYXJlIGJvb2xlYW4gYXR0cmlidXRlcyB0aGF0IGRvbid0IHRha2UgYSB2YWx1ZQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXR0cmlicysrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIGdldFBpeGVsRm9ybWF0QXR0cmliKHZvaWQqIHBpeGVsRm9ybWF0LGludCBhdHRyaWIsaW50KiB2YWwpeworICAgIE5TT3BlbkdMUGl4ZWxGb3JtYXQgKmZybXQgPSAoTlNPcGVuR0xQaXhlbEZvcm1hdCAqKXBpeGVsRm9ybWF0OworICAgIFtmcm10IGdldFZhbHVlczp2YWwgZm9yQXR0cmlidXRlOmF0dHJpYiBmb3JWaXJ0dWFsU2NyZWVuOjBdOworfQorCit2b2lkKiBuc0NyZWF0ZUNvbnRleHQodm9pZCogZm9ybWF0LHZvaWQqIHNoYXJlKXsKKyAgICBOU09wZW5HTFBpeGVsRm9ybWF0KiBmcm10ID0gKE5TT3BlbkdMUGl4ZWxGb3JtYXQqKWZvcm1hdDsKKyAgICByZXR1cm4gW1tFbXVHTENvbnRleHQgYWxsb2NdIGluaXRXaXRoRm9ybWF0OmZybXQgc2hhcmVDb250ZXh0OnNoYXJlXTsKK30KKwordm9pZCAgbnNQQnVmZmVyTWFrZUN1cnJlbnQodm9pZCogY29udGV4dCx2b2lkKiBuYXRpdmVQQnVmZmVyLGludCBsZXZlbCl7CisgICAgRW11R0xDb250ZXh0KiBjdHggPSAoRW11R0xDb250ZXh0ICopY29udGV4dDsKKyAgICBOU09wZW5HTFBpeGVsQnVmZmVyKiBwYnVmZiA9IChOU09wZW5HTFBpeGVsQnVmZmVyICopbmF0aXZlUEJ1ZmZlcjsKKyAgICBpZihjdHggPT0gbmlsKXsKKyAgICAgICAgW05TT3BlbkdMQ29udGV4dCBjbGVhckN1cnJlbnRDb250ZXh0XTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihwYnVmZiAhPSBuaWwpeworICAgICAgICAgICAgW2N0eCBwcmVCaW5kOjFdOworICAgICAgICAgICAgW2N0eCBzZXRQaXhlbEJ1ZmZlcjpwYnVmZiBjdWJlTWFwRmFjZTowIG1pcE1hcExldmVsOmxldmVsIGN1cnJlbnRWaXJ0dWFsU2NyZWVuOjBdOworICAgICAgICAgICAgW2N0eCBtYWtlQ3VycmVudENvbnRleHRdOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIG5zV2luZG93TWFrZUN1cnJlbnQodm9pZCogY29udGV4dCx2b2lkKiBuYXRpdmVXaW4peworICAgIEVtdUdMQ29udGV4dCogY3R4ID0gKEVtdUdMQ29udGV4dCAqKWNvbnRleHQ7CisgICAgTlNWaWV3KiB3aW4gPSAoTlNWaWV3ICopbmF0aXZlV2luOworICAgIGlmKGN0eCA9PSBuaWwpeworICAgICAgICBbTlNPcGVuR0xDb250ZXh0IGNsZWFyQ3VycmVudENvbnRleHRdOworICAgIH0gZWxzZSBpZiAod2luICE9IG5pbCkgeworICAgICAgICBbY3R4IHByZUJpbmQ6MF07CisgICAgICAgIFtjdHggc2V0Vmlldzogd2luXTsKKyAgICAgICAgW2N0eCBtYWtlQ3VycmVudENvbnRleHRdOworICAgIH0KK30KKwordm9pZCBuc1N3YXBCdWZmZXJzKCl7CisgICAgTlNPcGVuR0xDb250ZXh0KiBjdHggPSBbTlNPcGVuR0xDb250ZXh0IGN1cnJlbnRDb250ZXh0XTsKKyAgICBpZihjdHggIT0gbmlsKXsKKyAgICAgICAgW2N0eCBmbHVzaEJ1ZmZlcl07CisgICAgfQorfQorCit2b2lkIG5zU3dhcEludGVydmFsKGludCAqaW50ZXJ2YWwpeworICAgIE5TT3BlbkdMQ29udGV4dCogY3R4ID0gW05TT3BlbkdMQ29udGV4dCBjdXJyZW50Q29udGV4dF07CisgICAgaWYoIGN0eCAhPSBuaWwpeworICAgICAgICBbY3R4IHNldFZhbHVlczppbnRlcnZhbCBmb3JQYXJhbWV0ZXI6TlNPcGVuR0xDUFN3YXBJbnRlcnZhbF07CisgICAgfQorfQorCisKK3ZvaWQgbnNEZXN0cm95Q29udGV4dCh2b2lkKiBjb250ZXh0KXsKKyAgICBFbXVHTENvbnRleHQgKmN0eCA9IChFbXVHTENvbnRleHQqKWNvbnRleHQ7CisgICAgaWYoY3R4ICE9IG5pbCl7CisgICAgICAgIFtjdHggcmVsZWFzZV07CisgICAgfQorfQorCisKK3ZvaWQqIG5zQ3JlYXRlUEJ1ZmZlcihHTGVudW0gdGFyZ2V0LEdMZW51bSBmb3JtYXQsaW50IG1heE1pcCxpbnQgd2lkdGgsaW50IGhlaWdodCl7CisgICAgcmV0dXJuIFtbTlNPcGVuR0xQaXhlbEJ1ZmZlciBhbGxvY10gaW5pdFdpdGhUZXh0dXJlVGFyZ2V0OnRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR1cmVJbnRlcm5hbEZvcm1hdDpmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlTWF4TWlwTWFwTGV2ZWw6bWF4TWlwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzV2lkZTp3aWR0aCBwaXhlbHNIaWdoOmhlaWdodF07CisKK30KKwordm9pZCBuc0Rlc3Ryb3lQQnVmZmVyKHZvaWQqIHBidWZmZXIpeworICAgIE5TT3BlbkdMUGl4ZWxCdWZmZXIgKnBidWYgPSAoTlNPcGVuR0xQaXhlbEJ1ZmZlciopcGJ1ZmZlcjsKKyAgICBpZihwYnVmICE9IG5pbCl7CisgICAgICAgIFtwYnVmIHJlbGVhc2VdOworICAgIH0KK30KKworYm9vbCBuc0dldFdpbkRpbXModm9pZCogd2luLHVuc2lnbmVkIGludCogd2lkdGgsdW5zaWduZWQgaW50KiBoZWlnaHQpeworICAgIE5TVmlldyogdmlldyA9IChOU1ZpZXcqKXdpbjsKKyAgICBpZih2aWV3ICE9IG5pbCl7CisgICAgICAgIE5TUmVjdCByZWN0ID0gW3ZpZXcgYm91bmRzXTsKKyAgICAgICAgKndpZHRoICA9IHJlY3Quc2l6ZS53aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IHJlY3Quc2l6ZS5oZWlnaHQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgIG5zQ2hlY2tDb2xvcih2b2lkKiB3aW4saW50IGNvbG9yU2l6ZSl7CisgICAgTlNWaWV3KiB2aWV3ID0gKE5TVmlldyopd2luOworICAgaWYodmlldyAhPSBuaWwpeworICAgICAgIE5TV2luZG93KiB3bmQgPSBbdmlldyB3aW5kb3ddOworICAgICAgIGlmKHduZCAhPSBuaWwpeworICAgICAgICAgICBOU1dpbmRvd0RlcHRoIGxpbWl0ID0gW3duZCBkZXB0aExpbWl0XTsKKyAgICAgICAgICAgTlNXaW5kb3dEZXB0aCBkZWZhdWx0TGltaXQgPSBbTlNXaW5kb3cgZGVmYXVsdERlcHRoTGltaXRdOworCisgICAgICAgICAgIGludCBkZXB0aCA9IChsaW1pdCAhPSAwKSA/IE5TQml0c1BlclBpeGVsRnJvbURlcHRoKGxpbWl0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNCaXRzUGVyUGl4ZWxGcm9tRGVwdGgoZGVmYXVsdExpbWl0KTsKKyAgICAgICAgICAgcmV0dXJuIGRlcHRoID49IGNvbG9yU2l6ZTsKKworICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBmYWxzZTsKKworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNQaXhlbEZvcm1hdHNBdHRyaWJzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML01hY1BpeGVsRm9ybWF0c0F0dHJpYnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTJhYzIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNQaXhlbEZvcm1hdHNBdHRyaWJzLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIE1BQ19QSVhFTFNfRk9STUFUU19BVFRSSUJTX0gKKyNkZWZpbmUgTUFDX1BJWEVMU19GT1JNQVRTX0FUVFJJQlNfSAorCisjaW5jbHVkZSA8Q29jb2EvQ29jb2EuaD4KK05TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUqKiBnZXRQaXhlbEZvcm1hdHNBdHRyaWJ1dGVzKGludCogc2l6ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNQaXhlbEZvcm1hdHNBdHRyaWJzLm0gYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML01hY1BpeGVsRm9ybWF0c0F0dHJpYnMubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWJjNDljCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9NYWNQaXhlbEZvcm1hdHNBdHRyaWJzLm0KQEAgLTAsMCArMSwyMTQgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgIk1hY1BpeGVsRm9ybWF0c0F0dHJpYnMuaCIKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMzMl8xW10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMzIsCisgICAgTlNPcGVuR0xQRkFEZXB0aFNpemUgICAsMjQsCisgICAgTlNPcGVuR0xQRkFTdGVuY2lsU2l6ZSAsOCwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczMyXzJbXSA9Cit7CisgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisgICAgTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSAgICwzMiwKKyAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSAgICw4LAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIE5TT3BlbkdMUEZBU3RlbmNpbFNpemUgLDgsCisgICAgMAorfTsKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMzMl8zW10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMzIsCisgICAgTlNPcGVuR0xQRkFBbHBoYVNpemUgICAsOCwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczMyXzRbXSA9Cit7CisgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisgICAgTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSAgICwzMiwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczMyXzVbXSA9Cit7CisgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisgICAgTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSAgICwzMiwKKyAgICBOU09wZW5HTFBGQURlcHRoU2l6ZSAgICwyNCwKKyAgICBOU09wZW5HTFBGQVNhbXBsZXMgICAgICwyLAorICAgIDAKK307CisKK3N0YXRpYyBOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlIGF0dHJzMzJfNltdID0KK3sKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyAgICBOU09wZW5HTFBGQVBpeGVsQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplICAgLDMyLAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIE5TT3BlbkdMUEZBU2FtcGxlcyAgICAgLDQsCisgICAgMAorfTsKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMzMl83W10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMzIsCisgICAgTlNPcGVuR0xQRkFBbHBoYVNpemUgICAsOCwKKyAgICBOU09wZW5HTFBGQURlcHRoU2l6ZSAgICwyNCwKKyAgICBOU09wZW5HTFBGQVN0ZW5jaWxTaXplICw4LAorICAgIE5TT3BlbkdMUEZBU2FtcGxlcyAgICAgLDQsCisgICAgMAorfTsKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMxNl8xW10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMTYsCisgICAgTlNPcGVuR0xQRkFEZXB0aFNpemUgICAsMjQsCisgICAgMAorfTsKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMxNl8yW10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMTYsCisgICAgTlNPcGVuR0xQRkFEZXB0aFNpemUgICAsMjQsCisgICAgTlNPcGVuR0xQRkFTdGVuY2lsU2l6ZSAsOCwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczY0XzFbXSA9Cit7CisgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisgICAgTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSAgICw2NCwKKyAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSAgICwxNiwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczY0XzJbXSA9Cit7CisgICAgTlNPcGVuR0xQRkFEb3VibGVCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFXaW5kb3csCisgICAgTlNPcGVuR0xQRkFQaXhlbEJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQUNvbG9yU2l6ZSAgICw2NCwKKyAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSAgICwxNiwKKyAgICBOU09wZW5HTFBGQURlcHRoU2l6ZSAgICwyNCwKKyAgICBOU09wZW5HTFBGQVN0ZW5jaWxTaXplICw4LAorICAgIDAKK307CisKK3N0YXRpYyBOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlIGF0dHJzNjRfM1tdID0KK3sKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyAgICBOU09wZW5HTFBGQVBpeGVsQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplICAgLDY0LAorICAgIE5TT3BlbkdMUEZBQWxwaGFTaXplICAgLDE2LAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIDAKK307CisKK3N0YXRpYyBOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlIGF0dHJzNjRfNFtdID0KK3sKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyAgICBOU09wZW5HTFBGQVBpeGVsQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplICAgLDY0LAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIDAKK307CisKK3N0YXRpYyBOU09wZW5HTFBpeGVsRm9ybWF0QXR0cmlidXRlIGF0dHJzNjRfNVtdID0KK3sKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyAgICBOU09wZW5HTFBGQVBpeGVsQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplICAgLDY0LAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIE5TT3BlbkdMUEZBU3RlbmNpbFNpemUgLDgsCisgICAgMAorfTsKKworc3RhdGljIE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cnMxMjhfMVtdID0KK3sKKyAgICBOU09wZW5HTFBGQURvdWJsZUJ1ZmZlciwKKyAgICBOU09wZW5HTFBGQVdpbmRvdywKKyAgICBOU09wZW5HTFBGQVBpeGVsQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplICAgLDEyOCwKKyAgICBOU09wZW5HTFBGQUFscGhhU2l6ZSAgICwzMiwKKyAgICAwCit9OworCitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSBhdHRyczEyOF8yW10gPQoreworICAgIE5TT3BlbkdMUEZBRG91YmxlQnVmZmVyLAorICAgIE5TT3BlbkdMUEZBV2luZG93LAorICAgIE5TT3BlbkdMUEZBUGl4ZWxCdWZmZXIsCisgICAgTlNPcGVuR0xQRkFDb2xvclNpemUgICAsMTI4LAorICAgIE5TT3BlbkdMUEZBQWxwaGFTaXplICAgLDMyLAorICAgIE5TT3BlbkdMUEZBRGVwdGhTaXplICAgLDI0LAorICAgIDAKK307CisKK05TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUqKiBnZXRQaXhlbEZvcm1hdHNBdHRyaWJ1dGVzKGludCogc2l6ZSl7CitzdGF0aWMgTlNPcGVuR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZSogYXJyW10gPQoreworICAgIGF0dHJzMTZfMSwKKyAgICBhdHRyczE2XzIsCisgICAgYXR0cnMzMl8xLAorICAgIGF0dHJzMzJfMiwKKyAgICBhdHRyczMyXzMsCisgICAgYXR0cnMzMl80LAorICAgIGF0dHJzMzJfNSwKKyAgICBhdHRyczMyXzYsCisgICAgYXR0cnMzMl83LAorICAgIGF0dHJzNjRfMSwKKyAgICBhdHRyczY0XzIsCisgICAgYXR0cnM2NF8zLAorICAgIGF0dHJzNjRfNCwKKyAgICBhdHRyczY0XzUsCisgICAgYXR0cnMxMjhfMSwKKyAgICBhdHRyczEyOF8yCit9OworICAgICpzaXplID0gc2l6ZW9mKGFycikvc2l6ZW9mKGFyclswXSk7CisgICAgcmV0dXJuIGFycjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9FR0wvVGhyZWFkSW5mby5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML1RocmVhZEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMDFhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML1RocmVhZEluZm8uY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJUaHJlYWRJbmZvLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi90aHJlYWRfc3RvcmUuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIFNldCBUUkFDRV9USFJFQURJTkZPIHRvIDEgdG8gZGVidWcgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgVGhyZWFkSW5mbworLy8gaW5zdGFuY2VzLgorI2RlZmluZSBUUkFDRV9USFJFQURJTkZPIDAKKworI2lmIFRSQUNFX1RIUkVBRElORk8KKyNpbmNsdWRlIDxhdG9taWM+CisjZGVmaW5lIExPR19USFJFQURJTkZPKHguLi4pIGZwcmludGYoc3RkZXJyLCB4KQordXNpbmcgSW5zdGFuY2VDb3VudGVyID0gc3RkOjphdG9taWM8c2l6ZV90PjsKKyNlbHNlCisjZGVmaW5lIExPR19USFJFQURJTkZPKHguLi4pCit1c2luZyBJbnN0YW5jZUNvdW50ZXIgPSBzaXplX3Q7CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworY2xhc3MgVGhyZWFkSW5mb1N0b3JlIDogcHVibGljIDo6ZW11Z2w6OlRocmVhZFN0b3JlIHsKK3B1YmxpYzoKKyAgICBUaHJlYWRJbmZvU3RvcmUoKSA6IDo6ZW11Z2w6OlRocmVhZFN0b3JlKCZkZXN0cnVjdG9yKSB7fQorCisgICAgdm9pZCBzZXQodm9pZCogdmFsdWUpIHsKKyAgICAgICAgZW11Z2w6OlRocmVhZFN0b3JlOjpzZXQodmFsdWUpOworICAgICAgICArK21OdW1JbnN0YW5jZXM7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCBnZXRJbnN0YW5jZUNvdW50KCkgeyByZXR1cm4gbU51bUluc3RhbmNlczsgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkIGRlc3RydWN0b3Iodm9pZCogdmFsdWUpIHsKKyAgICAgICAgTE9HX1RIUkVBRElORk8oIiVzOiBFRkwgJXAgKCVkIGluc3RhbmNlcylcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIChpbnQpbU51bUluc3RhbmNlcyk7CisgICAgICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxUaHJlYWRJbmZvKj4odmFsdWUpOworICAgICAgICBtTnVtSW5zdGFuY2VzLS07CisgICAgfQorCisgICAgc3RhdGljIEluc3RhbmNlQ291bnRlciBtTnVtSW5zdGFuY2VzOworfTsKKworSW5zdGFuY2VDb3VudGVyIFRocmVhZEluZm9TdG9yZTo6bU51bUluc3RhbmNlcyB7IDAgfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKwordm9pZCBUaHJlYWRJbmZvOjp1cGRhdGVJbmZvKENvbnRleHRQdHIgZWdsQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVnbERpc3BsYXkqIGRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTEVTY29udGV4dCogZ2xlc0N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFyZUdyb3VwUHRyIHNoYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWVNYW5hZ2VyKiBtYW5hZ2VyKSB7CisKKyAgICBlZ2xDb250ZXh0ICA9IGVnbEN0eDsKKyAgICBlZ2xEaXNwbGF5ICA9IGRweTsKKyAgICBnbGVzQ29udGV4dCA9IGdsZXNDdHg7CisgICAgc2hhcmVHcm91cCAgPSBzaGFyZTsKKyAgICBvYmpNYW5hZ2VyICA9IG1hbmFnZXI7Cit9CisKK3N0YXRpYyA6OmVtdWdsOjpMYXp5SW5zdGFuY2U8VGhyZWFkSW5mb1N0b3JlPiBzX3RscyA9IExBWllfSU5TVEFOQ0VfSU5JVDsKKworVGhyZWFkSW5mbyAqZ2V0VGhyZWFkSW5mbygpCit7CisgICAgVGhyZWFkSW5mbyAqdGkgPSBzdGF0aWNfY2FzdDxUaHJlYWRJbmZvKj4oc190bHMtPmdldCgpKTsKKyAgICBpZiAoIXRpKSB7CisgICAgICAgIHRpID0gbmV3IFRocmVhZEluZm8oKTsKKyAgICAgICAgc190bHMtPnNldCh0aSk7CisgICAgICAgIExPR19USFJFQURJTkZPKCIlczogRUdMICVwICglZCBpbnN0YW5jZXMpXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgIHRpLCAoaW50KVRocmVhZEluZm9TdG9yZTo6Z2V0SW5zdGFuY2VDb3VudCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHRpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9UaHJlYWRJbmZvLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvRUdML1RocmVhZEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTdjMDBlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0VHTC9UaHJlYWRJbmZvLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgVEhSRUFEX0lORk9fSAorI2RlZmluZSBUSFJFQURfSU5GT19ICisKKyNpbmNsdWRlICJFZ2xDb250ZXh0LmgiCisKK2NsYXNzIEVnbERpc3BsYXk7CitjbGFzcyBHTEVTY29udGV4dDsKKworc3RydWN0IFRocmVhZEluZm8geworICAgIHZvaWQgdXBkYXRlSW5mbyhDb250ZXh0UHRyIGVnbGN0eCwKKyAgICAgICAgICAgICAgICAgICAgRWdsRGlzcGxheSogZHB5LAorICAgICAgICAgICAgICAgICAgICBHTEVTY29udGV4dCogZ2xlc0N0eCwKKyAgICAgICAgICAgICAgICAgICAgU2hhcmVHcm91cFB0ciBzaGFyZSwKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZU1hbmFnZXIqIG1hbmFnZXIpOworCisgICAgQ29udGV4dFB0ciAgICAgICAgICAgZWdsQ29udGV4dDsKKyAgICBFZ2xEaXNwbGF5KiAgICAgICAgICBlZ2xEaXNwbGF5ID0gbnVsbHB0cjsKKyAgICBHTEVTY29udGV4dCogICAgICAgICBnbGVzQ29udGV4dCA9IG51bGxwdHI7CisgICAgU2hhcmVHcm91cFB0ciAgICAgICAgc2hhcmVHcm91cDsKKyAgICBPYmplY3ROYW1lTWFuYWdlciogICBvYmpNYW5hZ2VyID0gbnVsbHB0cjsKK307CisKK1RocmVhZEluZm8qIGdldFRocmVhZEluZm8oKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9BbmRyb2lkLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZhMGUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00vQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2hvc3RfY29tbW9uX1NSQ19GSUxFUyA6PSBcCisgICAgIEdMRVNjbUltcC5jcHAgICAgICAgXAorICAgICBHTEVTY21VdGlscy5jcHAgICAgIFwKKyAgICAgR0xFU2NtQ29udGV4dC5jcHAgICBcCisgICAgIEdMRVNjbVZhbGlkYXRlLmNwcAorCisKKyMjIyBHTEVTX0NNIGhvc3QgaW1wbGVtZW50YXRpb24gKE9uIHRvcCBvZiBPcGVuR0wpICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJChjYWxsIGVtdWdsLWJlZ2luLXNoYXJlZC1saWJyYXJ5LGxpYiQoQlVJTERfVEFSR0VUX1NVRkZJWClHTEVTX0NNX3RyYW5zbGF0b3IpCiskKGNhbGwgZW11Z2wtaW1wb3J0LGxpYkdMY29tbW9uKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoaG9zdF9jb21tb25fU1JDX0ZJTEVTKQorJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21Db250ZXh0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbUNvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmOWVhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21Db250ZXh0LmNwcApAQCAtMCwwICsxLDQyOSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgIkdMRVNjbUNvbnRleHQuaCIKKyNpbmNsdWRlICJHTEVTY21VdGlscy5oIgorI2luY2x1ZGUgPEdMY29tbW9uL0dMdXRpbHMuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9HTGNvbnZlcnNpb25fbWFjcm9zLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKwordm9pZCBHTEVTY21Db250ZXh0Ojppbml0KEdsTGlicmFyeSogZ2xMaWIpIHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KHNfbG9jayk7CisgICAgaWYoIW1faW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgc19nbERpc3BhdGNoLmRpc3BhdGNoRnVuY3MoR0xFU18xXzEsIGdsTGliKTsKKyAgICAgICAgR0xFU2NvbnRleHQ6OmluaXQoZ2xMaWIpOworCisgICAgICAgIG1fdGV4Q29vcmRzID0gbmV3IEdMRVNwb2ludGVyW3NfZ2xTdXBwb3J0Lm1heFRleFVuaXRzXTsKKyAgICAgICAgbV9tYXBbR0xfVEVYVFVSRV9DT09SRF9BUlJBWV0gID0gJm1fdGV4Q29vcmRzW21fY2xpZW50QWN0aXZlVGV4dHVyZV07CisKKyAgICAgICAgYnVpbGRTdHJpbmdzKChjb25zdCBjaGFyKilkaXNwYXRjaGVyKCkuZ2xHZXRTdHJpbmcoR0xfVkVORE9SKSwKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkaXNwYXRjaGVyKCkuZ2xHZXRTdHJpbmcoR0xfUkVOREVSRVIpLAorICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKWRpc3BhdGNoZXIoKS5nbEdldFN0cmluZyhHTF9WRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICJPcGVuR0wgRVMtQ00gMS4xIik7CisgICAgfQorICAgIG1faW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCitHTEVTY21Db250ZXh0OjpHTEVTY21Db250ZXh0KCkgeworICAgIG1fbWFwW0dMX0NPTE9SX0FSUkFZXSAgICAgICAgICA9IG5ldyBHTEVTcG9pbnRlcigpOworICAgIG1fbWFwW0dMX05PUk1BTF9BUlJBWV0gICAgICAgICA9IG5ldyBHTEVTcG9pbnRlcigpOworICAgIG1fbWFwW0dMX1ZFUlRFWF9BUlJBWV0gICAgICAgICA9IG5ldyBHTEVTcG9pbnRlcigpOworICAgIG1fbWFwW0dMX1BPSU5UX1NJWkVfQVJSQVlfT0VTXSA9IG5ldyBHTEVTcG9pbnRlcigpOworfQorCisKK3ZvaWQgR0xFU2NtQ29udGV4dDo6c2V0QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4KSB7CisgICBtX2FjdGl2ZVRleHR1cmUgPSB0ZXggLSBHTF9URVhUVVJFMDsKK30KKwordm9pZCBHTEVTY21Db250ZXh0OjpzZXRDbGllbnRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXgpIHsKKyAgIG1fY2xpZW50QWN0aXZlVGV4dHVyZSA9IHRleCAtIEdMX1RFWFRVUkUwOworICAgbV9tYXBbR0xfVEVYVFVSRV9DT09SRF9BUlJBWV0gPSAmbV90ZXhDb29yZHNbbV9jbGllbnRBY3RpdmVUZXh0dXJlXTsKK30KKworR0xFU2NtQ29udGV4dDo6fkdMRVNjbUNvbnRleHQoKXsKKyAgICBpZihtX3RleENvb3Jkcyl7CisgICAgICAgIGRlbGV0ZVtdIG1fdGV4Q29vcmRzOworICAgICAgICBtX3RleENvb3JkcyA9IE5VTEw7CisgICAgfQorICAgIG1fbWFwW0dMX1RFWFRVUkVfQ09PUkRfQVJSQVldID0gTlVMTDsKK30KKworCisvL3NldHRpbmcgY2xpZW50IHNpZGUgYXJyCit2b2lkIEdMRVNjbUNvbnRleHQ6OnNldHVwQXJyKGNvbnN0IEdMdm9pZCogYXJyLEdMZW51bSBhcnJheVR5cGUsR0xlbnVtIGRhdGFUeXBlLEdMaW50IHNpemUsR0xzaXplaSBzdHJpZGUsR0xib29sZWFuIG5vcm1hbGl6ZWQsIGludCBpbmRleCl7CisgICAgaWYoIGFyciA9PSBOVUxMKSByZXR1cm47CisgICAgc3dpdGNoKGFycmF5VHlwZSkgeworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWToKKyAgICAgICAgICAgIHNfZ2xEaXNwYXRjaC5nbFZlcnRleFBvaW50ZXIoc2l6ZSxkYXRhVHlwZSxzdHJpZGUsYXJyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX05PUk1BTF9BUlJBWToKKyAgICAgICAgICAgIHNfZ2xEaXNwYXRjaC5nbE5vcm1hbFBvaW50ZXIoZGF0YVR5cGUsc3RyaWRlLGFycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgICAgICAgICAgc19nbERpc3BhdGNoLmdsVGV4Q29vcmRQb2ludGVyKHNpemUsZGF0YVR5cGUsc3RyaWRlLGFycik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWToKKyAgICAgICAgICAgIHNfZ2xEaXNwYXRjaC5nbENvbG9yUG9pbnRlcihzaXplLGRhdGFUeXBlLHN0cmlkZSxhcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVM6CisgICAgICAgICAgICBtX3BvaW50c0luZGV4ID0gaW5kZXg7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBHTEVTY21Db250ZXh0OjpzZXR1cEFycmF5UG9pbnRlckhlbHBlcihHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXMsYm9vbCBkaXJlY3QsR0xlbnVtIGFycmF5X2lkLEdMRVNwb2ludGVyKiBwKXsKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBwLT5nZXRTaXplKCk7CisgICAgICAgIEdMZW51bSBkYXRhVHlwZSA9IHAtPmdldFR5cGUoKTsKKworICAgICAgICBpZihuZWVkQ29udmVydChjQXJycyxmaXJzdCxjb3VudCx0eXBlLGluZGljZXMsZGlyZWN0LHAsYXJyYXlfaWQpKXsKKyAgICAgICAgICAgIC8vY29udmVyc2lvbiBoYXMgb2NjdXJlZAorICAgICAgICAgICAgQXJyYXlEYXRhIGN1cnJlbnRBcnIgPSBjQXJycy5nZXRDdXJyZW50QXJyYXkoKTsKKyAgICAgICAgICAgIHNldHVwQXJyKGN1cnJlbnRBcnIuZGF0YSxhcnJheV9pZCxjdXJyZW50QXJyLnR5cGUsc2l6ZSxjdXJyZW50QXJyLnN0cmlkZSxHTF9GQUxTRSwgY0FycnMuZ2V0Q3VycmVudEluZGV4KCkpOworICAgICAgICAgICAgKytjQXJyczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldHVwQXJyKHAtPmdldERhdGEoKSxhcnJheV9pZCxkYXRhVHlwZSxzaXplLHAtPmdldFN0cmlkZSgpLCBHTF9GQUxTRSk7CisgICAgICAgIH0KK30KKwordm9pZCBHTEVTY21Db250ZXh0OjpzZXR1cEFycmF5c1BvaW50ZXJzKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBjQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCkgeworICAgIEFycmF5c01hcDo6aXRlcmF0b3IgaXQ7CisgICAgbV9wb2ludHNJbmRleCA9IC0xOworCisgICAgLy9nb2luZyBvdmVyIGFsbCBjbGllbnRzIGFycmF5cyBQb2ludGVycworICAgIGZvciAoIGl0PW1fbWFwLmJlZ2luKCkgOyBpdCAhPSBtX21hcC5lbmQoKTsgKytpdCkgeworCisgICAgICAgIEdMZW51bSBhcnJheV9pZCAgID0gKCppdCkuZmlyc3Q7CisgICAgICAgIEdMRVNwb2ludGVyKiBwID0gKCppdCkuc2Vjb25kOworICAgICAgICBpZighcC0+aXNFbmFibGUoKSkgY29udGludWU7CisgICAgICAgIGlmKGFycmF5X2lkID09IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpIGNvbnRpbnVlOyAvL2hhbmRsaW5nIHRleHR1cmVzIGxhdGVyCisgICAgICAgIHNldHVwQXJyYXlQb2ludGVySGVscGVyKGNBcnJzLGZpcnN0LGNvdW50LHR5cGUsaW5kaWNlcyxkaXJlY3QsYXJyYXlfaWQscCk7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IGFjdGl2ZVRleHR1cmUgPSBtX2NsaWVudEFjdGl2ZVRleHR1cmUgKyBHTF9URVhUVVJFMDsKKworICAgIHNfbG9jay5sb2NrKCk7CisgICAgaW50IG1heFRleFVuaXRzID0gc19nbFN1cHBvcnQubWF4VGV4VW5pdHM7CisgICAgc19sb2NrLnVubG9jaygpOworCisgICAgLy9jb252ZXJ0aW5nIGFsbCB0ZXh0dXJlIGNvb3JkcyBhcnJheXMKKyAgICBmb3IoaW50IGk9MDsgaTwgbWF4VGV4VW5pdHM7aSsrKSB7CisKKyAgICAgICAgdW5zaWduZWQgaW50IHRleCA9IEdMX1RFWFRVUkUwK2k7CisgICAgICAgIHNldENsaWVudEFjdGl2ZVRleHR1cmUodGV4KTsKKyAgICAgICAgc19nbERpc3BhdGNoLmdsQ2xpZW50QWN0aXZlVGV4dHVyZSh0ZXgpOworCisgICAgICAgIEdMZW51bSBhcnJheV9pZCAgID0gR0xfVEVYVFVSRV9DT09SRF9BUlJBWTsKKyAgICAgICAgR0xFU3BvaW50ZXIqIHAgPSBtX21hcFthcnJheV9pZF07CisgICAgICAgIGlmKCFwLT5pc0VuYWJsZSgpKSBjb250aW51ZTsKKyAgICAgICAgc2V0dXBBcnJheVBvaW50ZXJIZWxwZXIoY0FycnMsZmlyc3QsY291bnQsdHlwZSxpbmRpY2VzLGRpcmVjdCxhcnJheV9pZCxwKTsKKyAgICB9CisKKyAgICBzZXRDbGllbnRBY3RpdmVUZXh0dXJlKGFjdGl2ZVRleHR1cmUpOworICAgIHNfZ2xEaXNwYXRjaC5nbENsaWVudEFjdGl2ZVRleHR1cmUoYWN0aXZlVGV4dHVyZSk7Cit9CisKK3ZvaWQgIEdMRVNjbUNvbnRleHQ6OmRyYXdQb2ludHNEYXRhKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBjQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlc19pbixib29sIGlzRWxlbXNEcmF3KSB7CisgICAgY29uc3QgY2hhciAgKnBvaW50c0FyciA9ICBOVUxMOworICAgIGludCBzdHJpZGUgPSAwOworICAgIEdMRVNwb2ludGVyKiBwID0gbV9tYXBbR0xfUE9JTlRfU0laRV9BUlJBWV9PRVNdOworCisgICAgLy9jaG9vc2luZyB0aGUgcmlnaHQgcG9pbnRzIHNpemVzIGFycmF5IHNvdXJjZQorICAgIGlmKG1fcG9pbnRzSW5kZXggPj0gMCkgeyAvL3BvaW50IHNpemUgYXJyYXkgd2FzIGNvbnZlcnRlZAorICAgICAgICBwb2ludHNBcnIgPSAoY29uc3QgY2hhciopKGNBcnJzW21fcG9pbnRzSW5kZXhdLmRhdGEpOworICAgICAgICBzdHJpZGUgPSBjQXJyc1ttX3BvaW50c0luZGV4XS5zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcG9pbnRzQXJyID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KHAtPmdldERhdGEoKSk7CisgICAgICAgIHN0cmlkZSA9IHAtPmdldFN0cmlkZSgpOworICAgIH0KKworICAgIGlmKHN0cmlkZSA9PSAwKXsKKyAgICAgICAgc3RyaWRlID0gc2l6ZW9mKEdMZmxvYXQpOworICAgIH0KKworCisgICAgaWYoaXNFbGVtc0RyYXcpIHsKKyAgICAgICAgaW50IHRTaXplID0gMDsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgICAgICAgICAgdFNpemUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgICAgICAgICB0U2l6ZSA9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgICAgICB0U2l6ZSA9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZShpPGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc1N0YXJ0ID0gaTsKKyAgICAgICAgICAgIGludCBzQ291bnQgPSAxOworCisjZGVmaW5lIElOREVYIFwKKyAgICAgICAgICAgICAgICAodHlwZSA9PSBHTF9VTlNJR05FRF9JTlQgPyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR0x1aW50Kj4oaW5kaWNlc19pbilbaV06IFwKKyAgICAgICAgICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUID8gXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdMdXNob3J0Kj4oaW5kaWNlc19pbilbaV06IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHTHVieXRlKj4oaW5kaWNlc19pbilbaV0pCisKKyAgICAgICAgICAgIEdMZmxvYXQgcFNpemUgPSAqKChHTGZsb2F0KikocG9pbnRzQXJyKyhJTkRFWCpzdHJpZGUpKSk7CisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIHdoaWxlKGkgPCBjb3VudCAmJiBwU2l6ZSA9PSAqKChHTGZsb2F0KikocG9pbnRzQXJyKyhJTkRFWCpzdHJpZGUpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc0NvdW50Kys7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzX2dsRGlzcGF0Y2guZ2xQb2ludFNpemUocFNpemUpOworICAgICAgICAgICAgc19nbERpc3BhdGNoLmdsRHJhd0VsZW1lbnRzKEdMX1BPSU5UUywgc0NvdW50LCB0eXBlLCAoY2hhciopaW5kaWNlc19pbitzU3RhcnQqdFNpemUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZShpPGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc1N0YXJ0ID0gaTsKKyAgICAgICAgICAgIGludCBzQ291bnQgPSAxOworICAgICAgICAgICAgR0xmbG9hdCBwU2l6ZSA9ICooKEdMZmxvYXQqKShwb2ludHNBcnIrKChmaXJzdCtpKSpzdHJpZGUpKSk7CisgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIHdoaWxlKGkgPCBjb3VudCAmJiBwU2l6ZSA9PSAqKChHTGZsb2F0KikocG9pbnRzQXJyKygoZmlyc3QraSkqc3RyaWRlKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNDb3VudCsrOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc19nbERpc3BhdGNoLmdsUG9pbnRTaXplKHBTaXplKTsKKyAgICAgICAgICAgIHNfZ2xEaXNwYXRjaC5nbERyYXdBcnJheXMoR0xfUE9JTlRTLCBmaXJzdCtzU3RhcnQsIHNDb3VudCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgIEdMRVNjbUNvbnRleHQ6OmRyYXdQb2ludHNBcnJzKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBhcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQpIHsKKyAgICBkcmF3UG9pbnRzRGF0YShhcnJzLGZpcnN0LGNvdW50LDAsTlVMTCxmYWxzZSk7Cit9CisKK3ZvaWQgR0xFU2NtQ29udGV4dDo6ZHJhd1BvaW50c0VsZW1zKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBhcnJzLEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzX2luKSB7CisgICAgZHJhd1BvaW50c0RhdGEoYXJycywwLGNvdW50LHR5cGUsaW5kaWNlc19pbix0cnVlKTsKK30KKworYm9vbCBHTEVTY21Db250ZXh0OjpuZWVkQ29udmVydChHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXMsYm9vbCBkaXJlY3QsR0xFU3BvaW50ZXIqIHAsR0xlbnVtIGFycmF5X2lkKSB7CisKKyAgICBib29sIHVzaW5nVkJPID0gcC0+aXNWQk8oKTsKKyAgICBHTGVudW0gYXJyVHlwZSA9IHAtPmdldFR5cGUoKTsKKyAgICAvKgorICAgICBjb252ZXJzaW9uIGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhlIGZvbGxvd2luZyBjYXNlczoKKyAgICAgICgqKSBhcnJheSB0eXBlIGlzIGJ5dGUgYnV0IGl0IGlzIG5vdCB2ZXJ0ZXggb3IgdGV4dHVyZSBhcnJheQorICAgICAgKCopIGFycmF5IHR5cGUgaXMgbm90IGZpeGVkCisgICAgKi8KKyAgICBpZigoYXJyVHlwZSAhPSBHTF9GSVhFRCkgJiYgKGFyclR5cGUgIT0gR0xfQllURSkpIHJldHVybiBmYWxzZTsKKyAgICBpZigoYXJyVHlwZSA9PSBHTF9CWVRFICAgJiYgKGFycmF5X2lkICE9IEdMX1ZFUlRFWF9BUlJBWSkpICYmCisgICAgICAgKGFyclR5cGUgPT0gR0xfQllURSAgICYmIChhcnJheV9pZCAhPSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZKSkgKSByZXR1cm4gZmFsc2U7CisKKworICAgIGJvb2wgYnl0ZVZCTyA9IChhcnJUeXBlID09IEdMX0JZVEUpICYmIHVzaW5nVkJPOworICAgIGlmKGJ5dGVWQk8peworICAgICAgICBwLT5yZWRpcmVjdFBvaW50ZXJEYXRhKCk7CisgICAgfQorCisgICAgaWYoIXVzaW5nVkJPIHx8IGJ5dGVWQk8pIHsKKyAgICAgICAgaWYgKGRpcmVjdCkgeworICAgICAgICAgICAgY29udmVydERpcmVjdChjQXJycyxmaXJzdCxjb3VudCxhcnJheV9pZCxwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRJbmRpcmVjdChjQXJycyxjb3VudCx0eXBlLGluZGljZXMsYXJyYXlfaWQscCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGlyZWN0KSB7CisgICAgICAgICAgICBjb252ZXJ0RGlyZWN0VkJPKGNBcnJzLGZpcnN0LGNvdW50LGFycmF5X2lkLHApIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRJbmRpcmVjdFZCTyhjQXJycyxjb3VudCx0eXBlLGluZGljZXMsYXJyYXlfaWQscCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEdMRVNwb2ludGVyKiBHTEVTY21Db250ZXh0OjpnZXRQb2ludGVyKEdMZW51bSBhcnJUeXBlKSB7CisgICAgR0xlbnVtIHR5cGUgPQorICAgICAgICBhcnJUeXBlID09IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSICAgICAgICAgID8gR0xfVkVSVEVYX0FSUkFZIDoKKyAgICAgICAgYXJyVHlwZSA9PSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiAgICAgICAgICA/IEdMX05PUk1BTF9BUlJBWSA6CisgICAgICAgIGFyclR5cGUgPT0gR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSICAgPyBHTF9URVhUVVJFX0NPT1JEX0FSUkFZIDoKKyAgICAgICAgYXJyVHlwZSA9PSBHTF9DT0xPUl9BUlJBWV9QT0lOVEVSICAgICAgICAgICA/IEdMX0NPTE9SX0FSUkFZIDoKKyAgICAgICAgYXJyVHlwZSA9PSBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICA/IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTIDoKKyAgICAgICAgMDsKKyAgICBpZih0eXBlICE9IDApCisgICAgeworICAgICAgICByZXR1cm4gR0xFU2NvbnRleHQ6OmdldFBvaW50ZXIodHlwZSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEdMRVNjbUNvbnRleHQ6OmluaXRFeHRlbnNpb25TdHJpbmcoKSB7CisgICAgKnNfZ2xFeHRlbnNpb25zID0gIkdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSBHTF9PRVNfYmxlbmRfc3VidHJhY3QgIgorICAgICAgICAgICAgICAgICAgICAgICJHTF9PRVNfYnl0ZV9jb29yZGluYXRlcyBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIEdMX09FU19wb2ludF9zaXplX2FycmF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAiR0xfT0VTX3BvaW50X3Nwcml0ZSBHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbiBHTF9PRVNfc3RlbmNpbF93cmFwIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhciAiCisgICAgICAgICAgICAgICAgICAgICAgIkdMX09FU190ZXh0dXJlX21pcm9yZWRfcmVwZWF0IEdMX09FU19FR0xfaW1hZ2UgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCBHTF9PRVNfZHJhd190ZXh0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAiR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAgR0xfT0VTX2RyYXdfdGV4dHVyZSAiOworICAgIGlmIChzX2dsU3VwcG9ydC5HTF9PRVNfUkVBRF9GT1JNQVQpCisgICAgICAgICpzX2dsRXh0ZW5zaW9ucys9IkdMX09FU19yZWFkX2Zvcm1hdCAiOworICAgIGlmIChzX2dsU3VwcG9ydC5HTF9FWFRfRlJBTUVCVUZGRVJfT0JKRUNUKSB7CisgICAgICAgICpzX2dsRXh0ZW5zaW9ucys9IkdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgR0xfT0VTX2RlcHRoMjQgR0xfT0VTX2RlcHRoMzIgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfT0VTX3JnYjhfcmdiYTggR0xfT0VTX3N0ZW5jaWwxIEdMX09FU19zdGVuY2lsNCBHTF9PRVNfc3RlbmNpbDggIjsKKyAgICB9CisgICAgaWYgKHNfZ2xTdXBwb3J0LkdMX0VYVF9QQUNLRURfREVQVEhfU1RFTkNJTCkKKyAgICAgICAgKnNfZ2xFeHRlbnNpb25zKz0iR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsICI7CisgICAgaWYgKHNfZ2xTdXBwb3J0LkdMX0VYVF9URVhUVVJFX0ZPUk1BVF9CR1JBODg4OCkKKyAgICAgICAgKnNfZ2xFeHRlbnNpb25zKz0iR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICI7CisgICAgaWYgKHNfZ2xTdXBwb3J0LkdMX0FSQl9NQVRSSVhfUEFMRVRURSAmJiBzX2dsU3VwcG9ydC5HTF9BUkJfVkVSVEVYX0JMRU5EKSB7CisgICAgICAgICpzX2dsRXh0ZW5zaW9ucys9IkdMX09FU19tYXRyaXhfcGFsZXR0ZSAiOworICAgICAgICBHTGludCBtYXhfcGFsZXR0ZV9tYXRyaWNlcz0wOworICAgICAgICBHTGludCBtYXhfdmVydGV4X3VuaXRzPTA7CisgICAgICAgIGRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUywmbWF4X3BhbGV0dGVfbWF0cmljZXMpOworICAgICAgICBkaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VOSVRTX09FUywmbWF4X3ZlcnRleF91bml0cyk7CisgICAgICAgIGlmIChtYXhfcGFsZXR0ZV9tYXRyaWNlcz49MzIgJiYgbWF4X3ZlcnRleF91bml0cz49NCkKKyAgICAgICAgICAgICpzX2dsRXh0ZW5zaW9ucys9IkdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZSAiOworICAgIH0KKyAgICAqc19nbEV4dGVuc2lvbnMrPSJHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAiOworfQorCitpbnQgR0xFU2NtQ29udGV4dDo6Z2V0TWF4VGV4VW5pdHMoKSB7CisgICAgcmV0dXJuIGdldENhcHMoKS0+bWF4VGV4VW5pdHM7Cit9CisKK2Jvb2wgR0xFU2NtQ29udGV4dDo6Z2xHZXRCb29sZWFudihHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKQoreworICAgIEdMaW50IGlQYXJhbTsKKworICAgIGlmKGdsR2V0SW50ZWdlcnYocG5hbWUsICZpUGFyYW0pKQorICAgIHsKKyAgICAgICAgKnBhcmFtcyA9IChpUGFyYW0gIT0gMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTY21Db250ZXh0OjpnbEdldEZpeGVkdihHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKK3sKKyAgICBHTGludCBpUGFyYW07CisKKyAgICBpZihnbEdldEludGVnZXJ2KHBuYW1lLCAmaVBhcmFtKSkKKyAgICB7CisgICAgICAgICpwYXJhbXMgPSBJMlgoaVBhcmFtKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVNjbUNvbnRleHQ6OmdsR2V0RmxvYXR2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQoreworICAgIEdMaW50IGlQYXJhbTsKKworICAgIGlmKGdsR2V0SW50ZWdlcnYocG5hbWUsICZpUGFyYW0pKQorICAgIHsKKyAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KWlQYXJhbTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVNjbUNvbnRleHQ6OmdsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQoreworICAgIGlmKEdMRVNjb250ZXh0OjpnbEdldEludGVnZXJ2KHBuYW1lLCBwYXJhbXMpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNvbnN0IEdMRVNwb2ludGVyKiBwdHIgPSBOVUxMOworCisgICAgc3dpdGNoKHBuYW1lKXsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1NJWkU6CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVJSQVlfVFlQRToKKyAgICAgICAgICAgIHB0ciA9IGdldFBvaW50ZXIoR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfVFlQRToKKyAgICAgICAgICAgIHB0ciA9IGdldFBvaW50ZXIoR0xfTk9STUFMX0FSUkFZX1BPSU5URVIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9TSVpFOgorICAgICAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9UWVBFOgorICAgICAgICAgICAgcHRyID0gZ2V0UG9pbnRlcihHTF9DT0xPUl9BUlJBWV9QT0lOVEVSKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkU6CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREU6CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFOgorICAgICAgICAgICAgcHRyID0gZ2V0UG9pbnRlcihHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUzoKKyAgICAgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVM6CisgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUzoKKyAgICAgICAgICAgIHB0ciA9IGdldFBvaW50ZXIoR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN3aXRjaChwbmFtZSkKKyAgICB7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgICBjYXNlIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgICBjYXNlIEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgICAgICAgICAgKnBhcmFtcyA9IHB0ciA/IHB0ci0+Z2V0QnVmZmVyTmFtZSgpIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFOgorICAgICAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NUUklERToKKyAgICAgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVM6CisgICAgICAgICAgICAqcGFyYW1zID0gcHRyID8gcHRyLT5nZXRTdHJpZGUoKSA6IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9TSVpFOgorICAgICAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1NJWkU6CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFOgorICAgICAgICAgICAgKnBhcmFtcyA9IHB0ciA/IHB0ci0+Z2V0U2l6ZSgpIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1RZUEU6CisgICAgICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZX1RZUEU6CisgICAgICAgIGNhc2UgR0xfQ09MT1JfQVJSQVlfVFlQRToKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEU6CisgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUzoKKyAgICAgICAgICAgICpwYXJhbXMgPSBwdHIgPyBwdHItPmdldFR5cGUoKSA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbUNvbnRleHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbUNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2YxZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00vR0xFU2NtQ29udGV4dC5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEdMRVNfQ01fQ09OVEVYX0gKKyNkZWZpbmUgR0xFU19DTV9DT05URVhfSAorCisjaW5jbHVkZSA8R0xjb21tb24vR0xEaXNwYXRjaC5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNwb2ludGVyLmg+CisjaW5jbHVkZSA8R0xjb21tb24vR0xFU2J1ZmZlci5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNjb250ZXh0Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPEdMZmxvYXQsc3RkOjp2ZWN0b3I8aW50PiA+IFBvaW50U2l6ZUluZGljZXM7CisKK2NsYXNzIEdsTGlicmFyeTsKKworY2xhc3MgR0xFU2NtQ29udGV4dDogcHVibGljIEdMRVNjb250ZXh0Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIGluaXQoR2xMaWJyYXJ5KiBnbExpYik7CisgICAgR0xFU2NtQ29udGV4dCgpOworICAgIHZvaWQgc2V0QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4KTsKKyAgICB2b2lkICBzZXRDbGllbnRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXgpOworICAgIEdMZW51bSAgZ2V0QWN0aXZlVGV4dHVyZSgpIHsgcmV0dXJuIEdMX1RFWFRVUkUwICsgbV9hY3RpdmVUZXh0dXJlO307CisgICAgR0xlbnVtICBnZXRDbGllbnRBY3RpdmVUZXh0dXJlKCkgeyByZXR1cm4gR0xfVEVYVFVSRTAgKyBtX2NsaWVudEFjdGl2ZVRleHR1cmU7fTsKKyAgICB2b2lkIHNldHVwQXJyYXlzUG9pbnRlcnMoR0xFU0NvbnZlcnNpb25BcnJheXMmIGZBcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLGJvb2wgZGlyZWN0KTsKKyAgICB2b2lkIGRyYXdQb2ludHNBcnJzKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBhcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQpOworICAgIHZvaWQgZHJhd1BvaW50c0VsZW1zKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBhcnJzLEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzKTsKKyAgICB2aXJ0dWFsIGNvbnN0IEdMRVNwb2ludGVyKiBnZXRQb2ludGVyKEdMZW51bSBhcnJUeXBlKTsKKyAgICBpbnQgIGdldE1heFRleFVuaXRzKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworICAgIHZpcnR1YWwgYm9vbCBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpOworICAgIHZpcnR1YWwgYm9vbCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisgICAgdmlydHVhbCBib29sIGdsR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKKworICAgIH5HTEVTY21Db250ZXh0KCk7Citwcm90ZWN0ZWQ6CisKKyAgICBib29sIG5lZWRDb252ZXJ0KEdMRVNDb252ZXJzaW9uQXJyYXlzJiBmQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCxHTEVTcG9pbnRlciogcCxHTGVudW0gYXJyYXlfaWQpOworcHJpdmF0ZToKKyAgICB2b2lkIHNldHVwQXJyYXlQb2ludGVySGVscGVyKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBmQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApOworICAgIHZvaWQgc2V0dXBBcnIoY29uc3QgR0x2b2lkKiBhcnIsR0xlbnVtIGFycmF5VHlwZSxHTGVudW0gZGF0YVR5cGUsR0xpbnQgc2l6ZSxHTHNpemVpIHN0cmlkZSxHTGJvb2xlYW4gbm9ybWFsaXplZCwgaW50IHBvaW50c0luZGV4ID0gLTEpOworICAgIHZvaWQgZHJhd1BvaW50cyhQb2ludFNpemVJbmRpY2VzKiBwb2ludHMpOworICAgIHZvaWQgZHJhd1BvaW50c0RhdGEoR0xFU0NvbnZlcnNpb25BcnJheXMmIGFycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXNfaW4sYm9vbCBpc0VsZW1zRHJhdyk7CisgICAgdm9pZCBpbml0RXh0ZW5zaW9uU3RyaW5nKCk7CisKKyAgICBHTEVTcG9pbnRlciogICAgICAgICAgbV90ZXhDb29yZHMgPSBudWxscHRyOworICAgIGludCAgICAgICAgICAgICAgICAgICBtX3BvaW50c0luZGV4ID0gLTE7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIG1fY2xpZW50QWN0aXZlVGV4dHVyZSA9IDA7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbUltcC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21JbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjM2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21JbXAuY3BwCkBAIC0wLDAgKzEsMjQxNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmZGVmIF9XSU4zMgorI3VuZGVmIEdMX0FQSQorI2RlZmluZSBHTF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIEdMX0FQSUNBTEwgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZW5kaWYKKyNkZWZpbmUgR0xfR0xFWFRfUFJPVE9UWVBFUworI2luY2x1ZGUgIkdMRVNjbUNvbnRleHQuaCIKKyNpbmNsdWRlICJHTEVTY21WYWxpZGF0ZS5oIgorI2luY2x1ZGUgIkdMRVNjbVV0aWxzLmgiCisjaW5jbHVkZSA8R0xjb21tb24vVGV4dHVyZVV0aWxzLmg+CisjaW5jbHVkZSA8T3BlbmdsQ29kZWNDb21tb24vRXJyb3JMb2cuaD4KKworI2luY2x1ZGUgPEdMY29tbW9uL0dMRGlzcGF0Y2guaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9HTGNvbnZlcnNpb25fbWFjcm9zLmg+CisjaW5jbHVkZSA8R0xjb21tb24vVHJhbnNsYXRvcklmYWNlcy5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0ZyYW1lYnVmZmVyRGF0YS5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2V4dGVybiAiQyIgeworCisvL2RlY2xlcmF0aW9uCitzdGF0aWMgdm9pZCBpbml0R0xFU3goKTsKK3N0YXRpYyB2b2lkIGluaXRDb250ZXh0KEdMRVNjb250ZXh0KiBjdHgsU2hhcmVHcm91cFB0ciBncnApOworc3RhdGljIHZvaWQgZGVsZXRlR0xFU0NvbnRleHQoR0xFU2NvbnRleHQqIGN0eCk7CitzdGF0aWMgdm9pZCBzZXRTaGFyZUdyb3VwKEdMRVNjb250ZXh0KiBjdHgsU2hhcmVHcm91cFB0ciBncnApOworc3RhdGljIEdMRVNjb250ZXh0KiBjcmVhdGVHTEVTQ29udGV4dCgpOworc3RhdGljIF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIqIHByb2NOYW1lKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR0xFUyBFWFRFTlNJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZT4gUHJvY1RhYmxlTWFwOworUHJvY1RhYmxlTWFwICpzX2dsZXNFeHRlbnNpb25zID0gTlVMTDsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgRUdMaWZhY2UqICBzX2VnbElmYWNlID0gTlVMTDsKK3N0YXRpYyBHTEVTaWZhY2UgIHNfZ2xlc0lmYWNlID0geworICAgIC5pbml0R0xFU3ggICAgICAgICA9IGluaXRHTEVTeCwKKyAgICAuY3JlYXRlR0xFU0NvbnRleHQgPSBjcmVhdGVHTEVTQ29udGV4dCwKKyAgICAuaW5pdENvbnRleHQgICAgICAgPSBpbml0Q29udGV4dCwKKyAgICAuZGVsZXRlR0xFU0NvbnRleHQgPSBkZWxldGVHTEVTQ29udGV4dCwKKyAgICAuZmx1c2ggICAgICAgICAgICAgPSAoRlVOQ1BUUl9OT19BUkdTX1JFVF9WT0lEKWdsRmx1c2gsCisgICAgLmZpbmlzaCAgICAgICAgICAgID0gKEZVTkNQVFJfTk9fQVJHU19SRVRfVk9JRClnbEZpbmlzaCwKKyAgICAuc2V0U2hhcmVHcm91cCAgICAgPSBzZXRTaGFyZUdyb3VwLAorICAgIC5nZXRQcm9jQWRkcmVzcyAgICA9IGdldFByb2NBZGRyZXNzLAorICAgIC5mZW5jZVN5bmMgICAgICAgICA9IE5VTEwsCisgICAgLmNsaWVudFdhaXRTeW5jICAgID0gTlVMTCwKKyAgICAuZGVsZXRlU3luYyAgICAgICAgPSBOVUxMLAorfTsKKworI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNtYWNyb3MuaD4KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyB2b2lkIGluaXRHTEVTeCgpIHsKKyAgICBEQkcoIk5vIHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gbmVjZXNzYXJ5IGZvciBHTEVTX0NNXG4iKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGluaXRDb250ZXh0KEdMRVNjb250ZXh0KiBjdHgsU2hhcmVHcm91cFB0ciBncnApIHsKKyAgICBpZiAoIWN0eC0+aXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIGN0eC0+c2V0U2hhcmVHcm91cChncnApOworICAgICAgICBjdHgtPmluaXQoc19lZ2xJZmFjZS0+ZWdsR2V0R2xMaWJyYXJ5KCkpOworICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsMCk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUF9PRVMsMCk7CisgICAgIH0KK30KKworc3RhdGljIEdMRVNjb250ZXh0KiBjcmVhdGVHTEVTQ29udGV4dCgpIHsKKyAgICByZXR1cm4gbmV3IEdMRVNjbUNvbnRleHQoKTsKK30KKworc3RhdGljIHZvaWQgZGVsZXRlR0xFU0NvbnRleHQoR0xFU2NvbnRleHQqIGN0eCkgeworICAgIGlmKGN0eCkgZGVsZXRlIGN0eDsKK30KKworc3RhdGljIHZvaWQgc2V0U2hhcmVHcm91cChHTEVTY29udGV4dCogY3R4LFNoYXJlR3JvdXBQdHIgZ3JwKSB7CisgICAgaWYoY3R4KSB7CisgICAgICAgIGN0eC0+c2V0U2hhcmVHcm91cChncnApOworICAgIH0KK30KK3N0YXRpYyBfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBnZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyKiBwcm9jTmFtZSkgeworICAgIEdFVF9DVFhfUkVUKE5VTEwpCisgICAgY3R4LT5nZXRHbG9iYWxMb2NrKCk7CisgICAgc3RhdGljIGJvb2wgcHJvY190YWJsZV9pbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmICghcHJvY190YWJsZV9pbml0aWFsaXplZCkgeworICAgICAgICBwcm9jX3RhYmxlX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFzX2dsZXNFeHRlbnNpb25zKQorICAgICAgICAgICAgc19nbGVzRXh0ZW5zaW9ucyA9IG5ldyBQcm9jVGFibGVNYXAoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc19nbGVzRXh0ZW5zaW9ucy0+Y2xlYXIoKTsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIl09KF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEJsZW5kRnVuY1NlcGFyYXRlT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xCbGVuZEVxdWF0aW9uT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xCbGVuZEVxdWF0aW9uT0VTOworCisgICAgICAgIGlmIChjdHgtPmdldENhcHMoKS0+R0xfQVJCX01BVFJJWF9QQUxFVFRFICYmIGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfVkVSVEVYX0JMRU5EKSB7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUzsKKyAgICAgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTIl09KF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbE1hdHJpeEluZGV4UG9pbnRlck9FUzsKKyAgICAgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsV2VpZ2h0UG9pbnRlck9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsV2VpZ2h0UG9pbnRlck9FUzsKKyAgICAgICAgfQorICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbERlcHRoUmFuZ2VmT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xEZXB0aFJhbmdlZjsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xGcnVzdHVtZk9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsRnJ1c3R1bWY7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsT3J0aG9mT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xPcnRob2Y7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsQ2xpcFBsYW5lZk9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsQ2xpcFBsYW5lZjsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xHZXRDbGlwUGxhbmVmT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xHZXRDbGlwUGxhbmVmOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbENsZWFyRGVwdGhmT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xDbGVhckRlcHRoZjsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xQb2ludFNpemVQb2ludGVyT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xQb2ludFNpemVQb2ludGVyT0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbFRleEdlbmZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbmZPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsVGV4R2VuZnZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbmZ2T0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbFRleEdlbmlPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbmlPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsVGV4R2VuaXZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbml2T0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbFRleEdlbnhPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbnhPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsVGV4R2VueHZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbFRleEdlbnh2T0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEdldFRleEdlbmZ2T0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xHZXRUZXhHZW5mdk9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xHZXRUZXhHZW5pdk9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsR2V0VGV4R2VuaXZPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsR2V0VGV4R2VueHZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbEdldFRleEdlbnh2T0VTOworICAgICAgICBpZiAoY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QpIHsKKyAgICAgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsSXNSZW5kZXJidWZmZXJPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbElzUmVuZGVyYnVmZmVyT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xCaW5kUmVuZGVyYnVmZmVyT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xCaW5kUmVuZGVyYnVmZmVyT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xHZW5SZW5kZXJidWZmZXJzT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xHZW5SZW5kZXJidWZmZXJzT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVM7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbElzRnJhbWVidWZmZXJPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbElzRnJhbWVidWZmZXJPRVM7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEJpbmRGcmFtZWJ1ZmZlck9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsQmluZEZyYW1lYnVmZmVyT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERlbGV0ZUZyYW1lYnVmZmVyc09FUzsKKyAgICAgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsR2VuRnJhbWVidWZmZXJzT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xHZW5GcmFtZWJ1ZmZlcnNPRVM7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVM7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUzsKKyAgICAgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTOworICAgICAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVM7CisgICAgICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEdlbmVyYXRlTWlwbWFwT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xHZW5lcmF0ZU1pcG1hcE9FUzsKKyAgICAgICAgfQorICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbERyYXdUZXhzT0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xEcmF3VGV4c09FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEcmF3VGV4aU9FUyJdID0gKF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsRHJhd1RleGlPRVM7CisgICAgICAgICgqc19nbGVzRXh0ZW5zaW9ucylbImdsRHJhd1RleGZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERyYXdUZXhmT0VTOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbERyYXdUZXh4T0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xEcmF3VGV4eE9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEcmF3VGV4c3ZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERyYXdUZXhzdk9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEcmF3VGV4aXZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERyYXdUZXhpdk9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEcmF3VGV4ZnZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERyYXdUZXhmdk9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xEcmF3VGV4eHZPRVMiXSA9IChfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbERyYXdUZXh4dk9FUzsKKyAgICB9CisgICAgX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgcmV0PU5VTEw7CisgICAgUHJvY1RhYmxlTWFwOjppdGVyYXRvciB2YWwgPSBzX2dsZXNFeHRlbnNpb25zLT5maW5kKHByb2NOYW1lKTsKKyAgICBpZiAodmFsIT1zX2dsZXNFeHRlbnNpb25zLT5lbmQoKSkKKyAgICAgICAgcmV0ID0gdmFsLT5zZWNvbmQ7CisgICAgY3R4LT5yZWxlYXNlR2xvYmFsTG9jaygpOworCisgICAgcmV0dXJuIHJldDsKK30KKworR0xfQVBJQ0FMTCBHTEVTaWZhY2UqIEdMX0FQSUVOVFJZIF9fdHJhbnNsYXRvcl9nZXRJZmFjZXMoRUdMaWZhY2UqIGVnbElmYWNlKTsKKworR0xFU2lmYWNlKiBfX3RyYW5zbGF0b3JfZ2V0SWZhY2VzKEVHTGlmYWNlKiBlZ2xJZmFjZSkgeworICAgIHNfZWdsSWZhY2UgPSBlZ2xJZmFjZTsKKyAgICByZXR1cm4gJnNfZ2xlc0lmYWNlOworfQorCit9CisKK3N0YXRpYyBPYmplY3RMb2NhbE5hbWUgVGV4dHVyZUxvY2FsTmFtZShHTGVudW0gdGFyZ2V0LCB1bnNpZ25lZCBpbnQgdGV4KSB7CisgICAgR0VUX0NUWF9SRVQoMCk7CisgICAgcmV0dXJuICh0ZXghPTA/IHRleCA6IGN0eC0+Z2V0RGVmYXVsdFRleHR1cmVOYW1lKHRhcmdldCkpOworfQorCitzdGF0aWMgVGV4dHVyZURhdGEqIGdldFRleHR1cmVEYXRhKE9iamVjdExvY2FsTmFtZSB0ZXgpeworICAgIEdFVF9DVFhfUkVUKE5VTEwpOworCisgICAgaWYgKCFjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gTlVMTDsKKyAgICBhdXRvIG9iakRhdGEgPQorICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXgpOworICAgIGlmKCFvYmpEYXRhKXsKKyAgICAgICAgdGV4RGF0YSA9IG5ldyBUZXh0dXJlRGF0YSgpOworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIHRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cih0ZXhEYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4RGF0YSA9IChUZXh0dXJlRGF0YSopb2JqRGF0YTsKKyAgICB9CisgICAgcmV0dXJuIHRleERhdGE7Cit9CisKK3N0YXRpYyBUZXh0dXJlRGF0YSogZ2V0VGV4dHVyZVRhcmdldERhdGEoR0xlbnVtIHRhcmdldCl7CisgICAgR0VUX0NUWF9SRVQoTlVMTCk7CisgICAgdW5zaWduZWQgaW50IHRleCA9IGN0eC0+Z2V0QmluZGVkVGV4dHVyZSh0YXJnZXQpOworICAgIHJldHVybiBnZXRUZXh0dXJlRGF0YShUZXh0dXJlTG9jYWxOYW1lKHRhcmdldCx0ZXgpKTsKK30KKworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzQnVmZmVyKEdMdWludCBidWZmZXIpIHsKKyAgICBHRVRfQ1RYX1JFVChHTF9GQUxTRSkKKworICAgIGlmKGJ1ZmZlciAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG9iakRhdGEgPyAoKEdMRVNidWZmZXIqKW9iakRhdGEpLT53YXNCaW5kZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdMX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKK0dMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgIGdsSXNFbmFibGVkKCBHTGVudW0gY2FwKSB7CisgICAgR0VUX0NUWF9DTV9SRVQoR0xfRkFMU0UpCisgICAgUkVUX0FORF9TRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpjYXBhYmlsaXR5KGNhcCxjdHgtPmdldE1heExpZ2h0cygpLGN0eC0+Z2V0TWF4Q2xpcFBsYW5lcygpKSxHTF9JTlZBTElEX0VOVU0sR0xfRkFMU0UpOworCisgICAgaWYgKGNhcCA9PSBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUykKKyAgICAgICAgcmV0dXJuIGN0eC0+aXNBcnJFbmFibGVkKGNhcCk7CisgICAgZWxzZSBpZiAoY2FwPT1HTF9URVhUVVJFX0dFTl9TVFJfT0VTKQorICAgICAgICByZXR1cm4gKGN0eC0+ZGlzcGF0Y2hlcigpLmdsSXNFbmFibGVkKEdMX1RFWFRVUkVfR0VOX1MpICYmCisgICAgICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xJc0VuYWJsZWQoR0xfVEVYVFVSRV9HRU5fVCkgJiYKKyAgICAgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbElzRW5hYmxlZChHTF9URVhUVVJFX0dFTl9SKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY3R4LT5kaXNwYXRjaGVyKCkuZ2xJc0VuYWJsZWQoY2FwKTsKK30KKworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSAgZ2xJc1RleHR1cmUoIEdMdWludCB0ZXh0dXJlKSB7CisgICAgR0VUX0NUWF9SRVQoR0xfRkFMU0UpCisKKyAgICBpZih0ZXh0dXJlID09IDApIC8vIFNwZWNpYWwgY2FzZQorICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisKKyAgICBUZXh0dXJlRGF0YSogdGV4ID0gZ2V0VGV4dHVyZURhdGEodGV4dHVyZSk7CisgICAgcmV0dXJuIHRleCA/IHRleC0+d2FzQm91bmQgOiBHTF9GQUxTRTsKK30KKworR0xfQVBJIEdMZW51bSBHTF9BUElFTlRSWSAgZ2xHZXRFcnJvcih2b2lkKSB7CisgICAgR0VUX0NUWF9SRVQoR0xfTk9fRVJST1IpCisgICAgR0xlbnVtIGVyciA9IGN0eC0+Z2V0R0xlcnJvcigpOworICAgIGlmKGVyciAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBjdHgtPnNldEdMZXJyb3IoR0xfTk9fRVJST1IpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEVycm9yKCk7Cit9CisKK0dMX0FQSSBjb25zdCBHTHVieXRlICogR0xfQVBJRU5UUlkgIGdsR2V0U3RyaW5nKCBHTGVudW0gbmFtZSkgeworCisgICAgR0VUX0NUWF9SRVQoTlVMTCkKKyAgICBzd2l0Y2gobmFtZSkgeworICAgICAgICBjYXNlIEdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopY3R4LT5nZXRWZW5kb3JTdHJpbmcoKTsKKyAgICAgICAgY2FzZSBHTF9SRU5ERVJFUjoKKyAgICAgICAgICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopY3R4LT5nZXRSZW5kZXJlclN0cmluZygpOworICAgICAgICBjYXNlIEdMX1ZFUlNJT046CisgICAgICAgICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWN0eC0+Z2V0VmVyc2lvblN0cmluZygpOworICAgICAgICBjYXNlIEdMX0VYVEVOU0lPTlM6CisgICAgICAgICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWN0eC0+Z2V0RXh0ZW5zaW9uU3RyaW5nKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRih0cnVlLEdMX0lOVkFMSURfRU5VTSxOVUxMKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEFjdGl2ZVRleHR1cmUoIEdMZW51bSB0ZXh0dXJlKSB7CisgICAgR0VUX0NUWF9DTSgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4dHVyZUVudW0odGV4dHVyZSxjdHgtPmdldE1heFRleFVuaXRzKCkpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5zZXRBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQWxwaGFGdW5jKCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6YWxwaGFGdW5jKGZ1bmMpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xBbHBoYUZ1bmMoZnVuYyxyZWYpOworfQorCisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEFscGhhRnVuY3goIEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjphbHBoYUZ1bmMoZnVuYyksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEFscGhhRnVuYyhmdW5jLFgyRihyZWYpKTsKK30KKworCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xCaW5kQnVmZmVyKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6YnVmZmVyVGFyZ2V0KHRhcmdldCksR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIC8vaWYgYnVmZmVyIHdhc24ndCBnZW5lcmF0ZWQgYmVmb3JlLGdlbmVyYXRlIG9uZQorICAgIGlmIChidWZmZXIgJiYgY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkgJiYKKyAgICAgICAgIWN0eC0+c2hhcmVHcm91cCgpLT5pc09iamVjdChOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyKSkgeworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyKTsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgR0xFU2J1ZmZlcigpKSk7CisgICAgfQorICAgIGN0eC0+YmluZEJ1ZmZlcih0YXJnZXQsYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIEdMRVNidWZmZXIqIHZibyA9CisgICAgICAgICAgICAgICAgKEdMRVNidWZmZXIqKWN0eC0+c2hhcmVHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAtPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlcik7CisgICAgICAgIHZiby0+c2V0QmluZGVkKCk7CisgICAgfQorfQorCisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEJpbmRUZXh0dXJlKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleHR1cmVUYXJnZXQodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pCisKKyAgICAvL2ZvciBoYW5kbGluZyBkZWZhdWx0IHRleHR1cmUgKDApCisgICAgT2JqZWN0TG9jYWxOYW1lIGxvY2FsVGV4TmFtZSA9IFRleHR1cmVMb2NhbE5hbWUodGFyZ2V0LHRleHR1cmUpOworCisgICAgR0x1aW50IGdsb2JhbFRleHR1cmVOYW1lID0gbG9jYWxUZXhOYW1lOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKXsKKyAgICAgICAgZ2xvYmFsVGV4dHVyZU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIGxvY2FsVGV4TmFtZSk7CisgICAgICAgIC8vaWYgdGV4dHVyZSB3YXNuJ3QgZ2VuZXJhdGVkIGJlZm9yZSxnZW5lcmF0ZSBvbmUKKyAgICAgICAgaWYoIWdsb2JhbFRleHR1cmVOYW1lKXsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgbG9jYWxUZXhOYW1lKTsKKyAgICAgICAgICAgIGdsb2JhbFRleHR1cmVOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgbG9jYWxUZXhOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHR1cmVEYXRhKiB0ZXhEYXRhID0gZ2V0VGV4dHVyZURhdGEobG9jYWxUZXhOYW1lKTsKKyAgICAgICAgaWYgKHRleERhdGEtPnRhcmdldD09MCkKKyAgICAgICAgICAgIHRleERhdGEtPnRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgLy9pZiB0ZXh0dXJlIHdhcyBhbHJlYWR5IGJvdW5kIHRvIGFub3RoZXIgdGFyZ2V0CisgICAgICAgIFNFVF9FUlJPUl9JRihjdHgtPkdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGV4RGF0YS0+dGFyZ2V0KSAhPSBjdHgtPkdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGFyZ2V0KSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB0ZXhEYXRhLT53YXNCb3VuZCA9IHRydWU7CisgICAgfQorCisgICAgY3R4LT5zZXRCaW5kZWRUZXh0dXJlKHRhcmdldCx0ZXh0dXJlKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRUZXh0dXJlKHRhcmdldCxnbG9iYWxUZXh0dXJlTmFtZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEJsZW5kRnVuYyggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6YmxlbmRTcmMoc2ZhY3RvcikgfHwgIUdMRVNjbVZhbGlkYXRlOjpibGVuZERzdChkZmFjdG9yKSxHTF9JTlZBTElEX0VOVU0pCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCbGVuZEZ1bmMoc2ZhY3RvcixkZmFjdG9yKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQnVmZmVyRGF0YSggR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OmJ1ZmZlclRhcmdldCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmlzQmluZGVkQnVmZmVyKHRhcmdldCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGN0eC0+c2V0QnVmZmVyRGF0YSh0YXJnZXQsc2l6ZSxkYXRhLHVzYWdlKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQnVmZmVyU3ViRGF0YSggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5pc0JpbmRlZEJ1ZmZlcih0YXJnZXQpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpidWZmZXJUYXJnZXQodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighY3R4LT5zZXRCdWZmZXJTdWJEYXRhKHRhcmdldCxvZmZzZXQsc2l6ZSxkYXRhKSxHTF9JTlZBTElEX1ZBTFVFKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ2xlYXIoIEdMYml0ZmllbGQgbWFzaykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZHJhd1ZhbGlkYXRlKCk7CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsZWFyKG1hc2spOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xDbGVhckNvbG9yKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ2xlYXJDb2xvcihyZWQsZ3JlZW4sYmx1ZSxhbHBoYSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbENsZWFyQ29sb3J4KCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ2xlYXJDb2xvcihYMkYocmVkKSxYMkYoZ3JlZW4pLFgyRihibHVlKSxYMkYoYWxwaGEpKTsKK30KKworCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xDbGVhckRlcHRoZiggR0xjbGFtcGYgZGVwdGgpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsZWFyRGVwdGgoZGVwdGgpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xDbGVhckRlcHRoeCggR0xjbGFtcHggZGVwdGgpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsZWFyRGVwdGgoWDJGKGRlcHRoKSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbENsZWFyU3RlbmNpbCggR0xpbnQgcykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ2xlYXJTdGVuY2lsKHMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlKCBHTGVudW0gdGV4dHVyZSkgeworICAgIEdFVF9DVFhfQ00oKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleHR1cmVFbnVtKHRleHR1cmUsY3R4LT5nZXRNYXhUZXhVbml0cygpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+c2V0Q2xpZW50QWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsaWVudEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CisKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ2xpcFBsYW5lZiggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbikgeworICAgIEdFVF9DVFgoKQorICAgIEdMZG91YmxlIHRtcEVxdWF0aW9uWzRdOworCisgICAgZm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgdG1wRXF1YXRpb25baV0gPSBzdGF0aWNfY2FzdDxHTGRvdWJsZT4oZXF1YXRpb25baV0pOworICAgIH0KKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsaXBQbGFuZShwbGFuZSx0bXBFcXVhdGlvbik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbENsaXBQbGFuZXgoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBHTGRvdWJsZSB0bXBFcXVhdGlvbls0XTsKKyAgICBmb3IoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHRtcEVxdWF0aW9uW2ldID0gWDJEKGVxdWF0aW9uW2ldKTsKKyAgICB9CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDbGlwUGxhbmUocGxhbmUsdG1wRXF1YXRpb24pOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xDb2xvcjRmKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDb2xvcjRmKHJlZCxncmVlbixibHVlLGFscGhhKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29sb3I0dWIoIEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENvbG9yNHViKHJlZCxncmVlbixibHVlLGFscGhhKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29sb3I0eCggR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ29sb3I0ZihYMkYocmVkKSxYMkYoZ3JlZW4pLFgyRihibHVlKSxYMkYoYWxwaGEpKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29sb3JNYXNrKCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENvbG9yTWFzayhyZWQsZ3JlZW4sYmx1ZSxhbHBoYSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbENvbG9yUG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpjb2xvclBvaW50ZXJQYXJhbXMoc2l6ZSxzdHJpZGUpLEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OmNvbG9yUG9pbnRlclR5cGUodHlwZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPnNldFBvaW50ZXIoR0xfQ09MT1JfQVJSQVksc2l6ZSx0eXBlLHN0cmlkZSxwb2ludGVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpIHsKKyAgICBHRVRfQ1RYX0NNKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighZGF0YSxHTF9JTlZBTElEX09QRVJBVElPTik7CisKKyAgICBkb0NvbXByZXNzZWRUZXhJbWFnZTJEKGN0eCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTaXplLCBkYXRhLCAodm9pZCopZ2xUZXhJbWFnZTJEKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkgeworICAgIEdFVF9DVFhfQ00oKQorICAgIFNFVF9FUlJPUl9JRighKEdMRVNjbVZhbGlkYXRlOjp0ZXhDb21wSW1nRnJtdChmb3JtYXQpICYmIEdMRVNjbVZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYobGV2ZWwgPCAwIHx8IGxldmVsID4gbG9nMihjdHgtPmdldE1heFRleFNpemUoKSksR0xfSU5WQUxJRF9WQUxVRSkKKyAgICBTRVRfRVJST1JfSUYoIWRhdGEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgR0xlbnVtIHVuY29tcHJlc3NlZEZybXQ7CisgICAgdW5zaWduZWQgY2hhciogdW5jb21wcmVzc2VkID0gdW5jb21wcmVzc1RleHR1cmUoZm9ybWF0LHVuY29tcHJlc3NlZEZybXQsd2lkdGgsaGVpZ2h0LGltYWdlU2l6ZSxkYXRhLGxldmVsKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFN1YkltYWdlMkQodGFyZ2V0LGxldmVsLHhvZmZzZXQseW9mZnNldCx3aWR0aCxoZWlnaHQsdW5jb21wcmVzc2VkRnJtdCxHTF9VTlNJR05FRF9CWVRFLHVuY29tcHJlc3NlZCk7CisgICAgZGVsZXRlIHVuY29tcHJlc3NlZDsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ29weVRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6cGl4ZWxGcm10KGN0eCxpbnRlcm5hbGZvcm1hdCkgJiYgR0xFU2NtVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRFeCh0YXJnZXQpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRihib3JkZXIgIT0gMCxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENvcHlUZXhJbWFnZTJEKHRhcmdldCxsZXZlbCxpbnRlcm5hbGZvcm1hdCx4LHksd2lkdGgsaGVpZ2h0LGJvcmRlcik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbENvcHlUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LGxldmVsLHhvZmZzZXQseW9mZnNldCx4LHksd2lkdGgsaGVpZ2h0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsQ3VsbEZhY2UoIEdMZW51bSBtb2RlKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDdWxsRmFjZShtb2RlKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRGVsZXRlQnVmZmVycyggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYobjwwLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgbjsgaSsrKXsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc1tpXSk7CisgICAgICAgICAgICBjdHgtPnVuYmluZEJ1ZmZlcihidWZmZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRGVsZXRlVGV4dHVyZXMoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBuOyBpKyspeworICAgICAgICAgICAgaWYodGV4dHVyZXNbaV0gIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihjdHgtPmdldEJpbmRlZFRleHR1cmUoR0xfVEVYVFVSRV8yRCkgPT0gdGV4dHVyZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0QmluZGVkVGV4dHVyZShHTF9URVhUVVJFXzJELDApOworICAgICAgICAgICAgICAgIGlmIChjdHgtPmdldEJpbmRlZFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCkgPT0gdGV4dHVyZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0QmluZGVkVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQLDApOworICAgICAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbERlcHRoRnVuYyggR0xlbnVtIGZ1bmMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERlcHRoRnVuYyhmdW5jKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRGVwdGhNYXNrKCBHTGJvb2xlYW4gZmxhZykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGVwdGhNYXNrKGZsYWcpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xEZXB0aFJhbmdlZiggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERlcHRoUmFuZ2Uoek5lYXIsekZhcik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbERlcHRoUmFuZ2V4KCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGVwdGhSYW5nZShYMkYoek5lYXIpLFgyRih6RmFyKSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbERpc2FibGUoIEdMZW51bSBjYXApIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBpZiAoY2FwPT1HTF9URVhUVVJFX0dFTl9TVFJfT0VTKSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGlzYWJsZShHTF9URVhUVVJFX0dFTl9TKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEaXNhYmxlKEdMX1RFWFRVUkVfR0VOX1QpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERpc2FibGUoR0xfVEVYVFVSRV9HRU5fUik7CisgICAgfQorICAgIGVsc2UgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEaXNhYmxlKGNhcCk7CisgICAgaWYgKGNhcD09R0xfVEVYVFVSRV8yRCB8fCBjYXA9PUdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTKQorICAgICAgICBjdHgtPnNldFRleHR1cmVFbmFibGVkKGNhcCxmYWxzZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbERpc2FibGVDbGllbnRTdGF0ZSggR0xlbnVtIGFycmF5KSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6c3VwcG9ydGVkQXJyYXlzKGFycmF5KSxHTF9JTlZBTElEX0VOVU0pCisKKyAgICBjdHgtPmVuYWJsZUFycihhcnJheSxmYWxzZSk7CisgICAgaWYoYXJyYXkgIT0gR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMpIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGlzYWJsZUNsaWVudFN0YXRlKGFycmF5KTsKK30KKworCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xEcmF3QXJyYXlzKCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKKyAgICBHRVRfQ1RYX0NNKCkKKyAgICBTRVRfRVJST1JfSUYoY291bnQgPCAwLEdMX0lOVkFMSURfVkFMVUUpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6ZHJhd01vZGUobW9kZSksR0xfSU5WQUxJRF9FTlVNKQorCisgICAgY3R4LT5kcmF3VmFsaWRhdGUoKTsKKworICAgIGlmKCFjdHgtPmlzQXJyRW5hYmxlZChHTF9WRVJURVhfQVJSQVkpKSByZXR1cm47CisKKyAgICBHTEVTQ29udmVyc2lvbkFycmF5cyB0bXBBcnJzOworICAgIGN0eC0+c2V0dXBBcnJheXNQb2ludGVycyh0bXBBcnJzLGZpcnN0LGNvdW50LDAsTlVMTCx0cnVlKTsKKyAgICBpZihtb2RlID09IEdMX1BPSU5UUyAmJiBjdHgtPmlzQXJyRW5hYmxlZChHTF9QT0lOVF9TSVpFX0FSUkFZX09FUykpeworICAgICAgICBjdHgtPmRyYXdQb2ludHNBcnJzKHRtcEFycnMsZmlyc3QsY291bnQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERyYXdBcnJheXMobW9kZSxmaXJzdCxjb3VudCk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xEcmF3RWxlbWVudHMoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICplbGVtZW50c0luZGljZXMpIHsKKyAgICBHRVRfQ1RYX0NNKCkKKyAgICBTRVRfRVJST1JfSUYoY291bnQgPCAwLEdMX0lOVkFMSURfVkFMVUUpCisgICAgU0VUX0VSUk9SX0lGKCghR0xFU2NtVmFsaWRhdGU6OmRyYXdNb2RlKG1vZGUpIHx8ICFHTEVTY21WYWxpZGF0ZTo6ZHJhd1R5cGUodHlwZSkpLEdMX0lOVkFMSURfRU5VTSkKKyAgICBpZighY3R4LT5pc0FyckVuYWJsZWQoR0xfVkVSVEVYX0FSUkFZKSkgcmV0dXJuOworCisgICAgY3R4LT5kcmF3VmFsaWRhdGUoKTsKKworICAgIGNvbnN0IEdMdm9pZCogaW5kaWNlcyA9IGVsZW1lbnRzSW5kaWNlczsKKyAgICBHTEVTQ29udmVyc2lvbkFycmF5cyB0bXBBcnJzOworICAgIGlmKGN0eC0+aXNCaW5kZWRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7IC8vIGlmIHZibyBpcyBiaW5kZWQgdGFrZSB0aGUgaW5kaWNlcyBmcm9tIHRoZSB2Ym8KKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogYnVmID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhciAqPihjdHgtPmdldEJpbmRlZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikpOworICAgICAgICBpbmRpY2VzID0gYnVmICsgU2FmZVVJbnRGcm9tUG9pbnRlcihlbGVtZW50c0luZGljZXMpOworICAgIH0KKworICAgIGN0eC0+c2V0dXBBcnJheXNQb2ludGVycyh0bXBBcnJzLDAsY291bnQsdHlwZSxpbmRpY2VzLGZhbHNlKTsKKyAgICBpZihtb2RlID09IEdMX1BPSU5UUyAmJiBjdHgtPmlzQXJyRW5hYmxlZChHTF9QT0lOVF9TSVpFX0FSUkFZX09FUykpeworICAgICAgICBjdHgtPmRyYXdQb2ludHNFbGVtcyh0bXBBcnJzLGNvdW50LHR5cGUsaW5kaWNlcyk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRHJhd0VsZW1lbnRzKG1vZGUsY291bnQsdHlwZSxpbmRpY2VzKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEVuYWJsZSggR0xlbnVtIGNhcCkgeworICAgIEdFVF9DVFgoKQorICAgIGlmIChjYXA9PUdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpIHsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGUoR0xfVEVYVFVSRV9HRU5fUyk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRW5hYmxlKEdMX1RFWFRVUkVfR0VOX1QpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEVuYWJsZShHTF9URVhUVVJFX0dFTl9SKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEVuYWJsZShjYXApOworICAgIGlmIChjYXA9PUdMX1RFWFRVUkVfMkQgfHwgY2FwPT1HTF9URVhUVVJFX0NVQkVfTUFQX09FUykKKyAgICAgICAgY3R4LT5zZXRUZXh0dXJlRW5hYmxlZChjYXAsdHJ1ZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEVuYWJsZUNsaWVudFN0YXRlKCBHTGVudW0gYXJyYXkpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpzdXBwb3J0ZWRBcnJheXMoYXJyYXkpLEdMX0lOVkFMSURfRU5VTSkKKworICAgIGN0eC0+ZW5hYmxlQXJyKGFycmF5LHRydWUpOworICAgIGlmKGFycmF5ICE9IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKSBjdHgtPmRpc3BhdGNoZXIoKS5nbEVuYWJsZUNsaWVudFN0YXRlKGFycmF5KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRmluaXNoKCB2b2lkKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGaW5pc2goKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRmx1c2goIHZvaWQpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZsdXNoKCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEZvZ2YoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRm9nZihwbmFtZSxwYXJhbSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEZvZ2Z2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRm9nZnYocG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRm9neCggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGb2dmKHBuYW1lLChwbmFtZSA9PSBHTF9GT0dfTU9ERSk/IHN0YXRpY19jYXN0PEdMZmxvYXQ+KHBhcmFtKTpYMkYocGFyYW0pKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRm9neHYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgaWYocG5hbWUgPT0gR0xfRk9HX01PREUpIHsKKyAgICAgICAgR0xmbG9hdCB0bXBQYXJhbSA9IHN0YXRpY19jYXN0PEdMZmxvYXQ+KHBhcmFtc1swXSk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRm9nZnYocG5hbWUsJnRtcFBhcmFtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBHTGZsb2F0IHRtcFBhcmFtc1s0XTsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8IDQ7IGkrKykgeworICAgICAgICAgICAgdG1wUGFyYW1zW2ldID0gWDJGKHBhcmFtc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGb2dmdihwbmFtZSx0bXBQYXJhbXMpOworICAgIH0KKworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xGcm9udEZhY2UoIEdMZW51bSBtb2RlKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcm9udEZhY2UobW9kZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEZydXN0dW1mKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcnVzdHVtKGxlZnQscmlnaHQsYm90dG9tLHRvcCx6TmVhcix6RmFyKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsRnJ1c3R1bXgoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZydXN0dW0oWDJGKGxlZnQpLFgyRihyaWdodCksWDJGKGJvdHRvbSksWDJGKHRvcCksWDJGKHpOZWFyKSxYMkYoekZhcikpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZW5CdWZmZXJzKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICBidWZmZXJzW2ldID0gY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLCAwLCB0cnVlKTsKKyAgICAgICAgICAgIC8vZ2VuZXJhdGluZyB2Ym8gb2JqZWN0IHJlbGF0ZWQgdG8gdGhpcyBidWZmZXIgbmFtZQorICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgR0xFU2J1ZmZlcigpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdlblRleHR1cmVzKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpIHsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICB0ZXh0dXJlc1tpXSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldEJvb2xlYW52KCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisKKyAgICBpZihjdHgtPmdsR2V0Qm9vbGVhbnYocG5hbWUsIHBhcmFtcykpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoKHBuYW1lKQorICAgIHsKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgICAgICB7CisgICAgICAgICAgICBHTGludCBuYW1lOworICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihwbmFtZSwmbmFtZSk7CisgICAgICAgICAgICAqcGFyYW1zID0gbmFtZSE9MCA/IEdMX1RSVUU6IEdMX0ZBTFNFOworICAgICAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTOgorICAgICAgICB7CisgICAgICAgICAgICBHTGJvb2xlYW4gc3RhdGVfcyA9IEdMX0ZBTFNFOworICAgICAgICAgICAgR0xib29sZWFuIHN0YXRlX3QgPSBHTF9GQUxTRTsKKyAgICAgICAgICAgIEdMYm9vbGVhbiBzdGF0ZV9yID0gR0xfRkFMU0U7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEJvb2xlYW52KEdMX1RFWFRVUkVfR0VOX1MsJnN0YXRlX3MpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRCb29sZWFudihHTF9URVhUVVJFX0dFTl9ULCZzdGF0ZV90KTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0Qm9vbGVhbnYoR0xfVEVYVFVSRV9HRU5fUiwmc3RhdGVfcik7CisgICAgICAgICAgICAqcGFyYW1zID0gc3RhdGVfcyAmJiBzdGF0ZV90ICYmIHN0YXRlX3IgPyBHTF9UUlVFOiBHTF9GQUxTRTsKKyAgICAgICAgfQorICAgIGJyZWFrOyAKKyAgICBjYXNlIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgKnBhcmFtcyA9IChHTGJvb2xlYW4pZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCk7IAorICAgIGJyZWFrOyAgICAKKyAgICBjYXNlIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbnBhcmFtcyA9IGdldENvbXByZXNzZWRGb3JtYXRzKE5VTEwpOworICAgICAgICAgICAgaWYgKG5wYXJhbXM+MCkgeworICAgICAgICAgICAgICAgIGludCAqIGlwYXJhbXMgPSBuZXcgaW50W25wYXJhbXNdOworICAgICAgICAgICAgICAgIGdldENvbXByZXNzZWRGb3JtYXRzKGlwYXJhbXMpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxucGFyYW1zOyBpKyspIHBhcmFtc1tpXSA9IChHTGJvb2xlYW4paXBhcmFtc1tpXTsKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gaXBhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0Qm9vbGVhbnYocG5hbWUscGFyYW1zKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6YnVmZmVyVGFyZ2V0KHRhcmdldCkgJiYgR0xFU2NtVmFsaWRhdGU6OmJ1ZmZlclBhcmFtKHBuYW1lKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+aXNCaW5kZWRCdWZmZXIodGFyZ2V0KSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgc3dpdGNoKHBuYW1lKSB7CisgICAgY2FzZSBHTF9CVUZGRVJfU0laRToKKyAgICAgICAgY3R4LT5nZXRCdWZmZXJTaXplKHRhcmdldCxwYXJhbXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JVRkZFUl9VU0FHRToKKyAgICAgICAgY3R4LT5nZXRCdWZmZXJVc2FnZSh0YXJnZXQscGFyYW1zKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldENsaXBQbGFuZWYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBHTGRvdWJsZSB0bXBFcW5bNF07CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldENsaXBQbGFuZShwbmFtZSx0bXBFcW4pOworICAgIGZvcihpbnQgaSA9MCA7aSA8IDQ7IGkrKyl7CisgICAgICAgIGVxbltpXSA9IHN0YXRpY19jYXN0PEdMZmxvYXQ+KHRtcEVxbltpXSk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRDbGlwUGxhbmV4KCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKSB7CisgICAgR0VUX0NUWCgpCisgICAgR0xkb3VibGUgdG1wRXFuWzRdOworCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRDbGlwUGxhbmUocG5hbWUsdG1wRXFuKTsKKyAgICBmb3IoaW50IGkgPTAgO2kgPCA0OyBpKyspeworICAgICAgICBlcW5baV0gPSBGMlgodG1wRXFuW2ldKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldEZpeGVkdiggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKworICAgIGlmKGN0eC0+Z2xHZXRGaXhlZHYocG5hbWUsIHBhcmFtcykpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IG5QYXJhbXMgPSBnbFBhcmFtU2l6ZShwbmFtZSk7CisgICAgR0xmbG9hdCBmUGFyYW1zWzE2XTsKKworICAgIHN3aXRjaChwbmFtZSkKKyAgICB7CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUzoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVM6CisgICAgICAgIGdsR2V0RmxvYXR2KHBuYW1lLCZmUGFyYW1zWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgICpwYXJhbXMgPSBJMlgoZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCkpOworICAgICAgICByZXR1cm47CisgICAgYnJlYWs7ICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBucGFyYW1zID0gZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCk7CisgICAgICAgICAgICBpZiAobnBhcmFtcz4wKSB7CisgICAgICAgICAgICAgICAgaW50ICogaXBhcmFtcyA9IG5ldyBpbnRbbnBhcmFtc107CisgICAgICAgICAgICAgICAgZ2V0Q29tcHJlc3NlZEZvcm1hdHMoaXBhcmFtcyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5wYXJhbXM7IGkrKykgcGFyYW1zW2ldID0gSTJYKGlwYXJhbXNbaV0pOworICAgICAgICAgICAgICAgIGRlbGV0ZSBbXSBpcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGbG9hdHYocG5hbWUsZlBhcmFtcyk7CisgICAgfQorCisgICAgaWYgKG5QYXJhbXMpCisgICAgeworICAgICAgICBmb3Ioc2l6ZV90IGkgPTAgOyBpIDwgblBhcmFtcztpKyspIHsKKyAgICAgICAgICAgIHBhcmFtc1tpXSA9IEYyWChmUGFyYW1zW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsR2V0RmxvYXR2KCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorCisgICAgaWYoY3R4LT5nbEdldEZsb2F0dihwbmFtZSwgcGFyYW1zKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHTGludCBpOworCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVM6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTOgorICAgICAgICBnbEdldEludGVnZXJ2KHBuYW1lLCZpKTsKKyAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KWk7CisgICAgYnJlYWs7ICAgCisgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgICpwYXJhbXMgPSAoR0xmbG9hdClnZXRDb21wcmVzc2VkRm9ybWF0cyhOVUxMKTsgCisgICAgYnJlYWs7ICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBucGFyYW1zID0gZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCk7CisgICAgICAgICAgICBpZiAobnBhcmFtcz4wKSB7CisgICAgICAgICAgICAgICAgaW50ICogaXBhcmFtcyA9IG5ldyBpbnRbbnBhcmFtc107CisgICAgICAgICAgICAgICAgZ2V0Q29tcHJlc3NlZEZvcm1hdHMoaXBhcmFtcyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5wYXJhbXM7IGkrKykgcGFyYW1zW2ldID0gKEdMZmxvYXQpaXBhcmFtc1tpXTsKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gaXBhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0RmxvYXR2KHBuYW1lLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRJbnRlZ2VydiggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisKKyAgICBpZihjdHgtPmdsR2V0SW50ZWdlcnYocG5hbWUsIHBhcmFtcykpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIEdMaW50IGk7CisgICAgR0xmbG9hdCBmOworCisgICAgc3dpdGNoKHBuYW1lKQorICAgIHsKKyAgICBjYXNlIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVM6CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYoR0xfVEVYVFVSRV9HRU5fUywmcGFyYW1zWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUzoKKyAgICAgICAgaWYgKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLCZpKTsKKyAgICAgICAgICAgICpwYXJhbXMgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0TG9jYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUzoKKyAgICAgICAgaWYgKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLCZpKTsKKyAgICAgICAgICAgICpwYXJhbXMgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0TG9jYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgICpwYXJhbXMgPSBnZXRDb21wcmVzc2VkRm9ybWF0cyhOVUxMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgZ2V0Q29tcHJlc3NlZEZvcm1hdHMocGFyYW1zKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfQ0xJUF9QTEFORVM6CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYocG5hbWUscGFyYW1zKTsKKyAgICAgICAgaWYoKnBhcmFtcyA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdMRVMgc3BlYyByZXF1aXJlcyBvbmx5IDYsIGFuZCB0aGUgQVRJIGRyaXZlciBlcnJvbm91c2x5CisgICAgICAgICAgICAvLyByZXR1cm5zIDggKGFsdGhvdWdoIGl0IHN1cHBvcnRzIG9ubHkgNikuIFRoaXMgV0FSIGlzIHNpbXBsZSwKKyAgICAgICAgICAgIC8vIGNvbXBsaWFudCBhbmQgZ29vZCBlbm91Z2ggZm9yIGRldmVsb3BlcnMuCisgICAgICAgICAgICAqcGFyYW1zID0gNjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FMUEhBX1RFU1RfUkVGOgorICAgICAgICAvLyBCb3RoIHRoZSBBVEkgYW5kIG5WaWRpYSBPcGVuR0wgZHJpdmVycyByZXR1cm4gdGhlIHdyb25nIGFuc3dlcgorICAgICAgICAvLyBoZXJlLiBTbyByZXR1cm4gdGhlIHJpZ2h0IG9uZS4KKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGbG9hdHYocG5hbWUsJmYpOworICAgICAgICAqcGFyYW1zID0gKGludCkoZiAqIChmbG9hdCkweDdmZmZmZmZmKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzoKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBpZigqcGFyYW1zID4gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdMRVMgc3BlYyByZXF1aXJlcyBvbmx5IDIsIGFuZCB0aGUgQVRJIGRyaXZlciBlcnJvbm91c2x5CisgICAgICAgICAgICAvLyByZXR1cm5zIDMyIChhbHRob3VnaCBpdCBzdXBwb3J0cyBvbmx5IDE2KS4gVGhpcyBXQVIgaXMgc2ltcGxlLAorICAgICAgICAgICAgLy8gY29tcGxpYW50IGFuZCBnb29kIGVub3VnaCBmb3IgZGV2ZWxvcGVycy4KKyAgICAgICAgICAgICpwYXJhbXMgPSAxNjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYocG5hbWUscGFyYW1zKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldExpZ2h0ZnYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldExpZ2h0ZnYobGlnaHQscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsR2V0TGlnaHR4diggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIEdMZmxvYXQgdG1wUGFyYW1zWzRdOworCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRMaWdodGZ2KGxpZ2h0LHBuYW1lLHRtcFBhcmFtcyk7CisgICAgc3dpdGNoIChwbmFtZSl7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgY2FzZSBHTF9ESUZGVVNFOgorICAgICAgICBjYXNlIEdMX1NQRUNVTEFSOgorICAgICAgICBjYXNlIEdMX1BPU0lUSU9OOgorICAgICAgICAgICAgcGFyYW1zWzNdID0gRjJYKHRtcFBhcmFtc1szXSk7CisgICAgICAgIGNhc2UgR0xfU1BPVF9ESVJFQ1RJT046CisgICAgICAgICAgICBwYXJhbXNbMl0gPSBGMlgodG1wUGFyYW1zWzJdKTsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgorICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgICAgICBjYXNlIEdMX0xJTkVBUl9BVFRFTlVBVElPTjoKKyAgICAgICAgY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBGMlgodG1wUGFyYW1zWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OnsKKyAgICAgICAgICAgIGN0eC0+c2V0R0xlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9CisgICAgcGFyYW1zWzBdID0gRjJYKHRtcFBhcmFtc1swXSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldE1hdGVyaWFsZnYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0TWF0ZXJpYWxmdihmYWNlLHBuYW1lLHBhcmFtcyk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldE1hdGVyaWFseHYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIEdMZmxvYXQgdG1wUGFyYW1zWzRdOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0TWF0ZXJpYWxmdihmYWNlLHBuYW1lLHRtcFBhcmFtcyk7CisgICAgc3dpdGNoKHBuYW1lKXsKKyAgICBjYXNlIEdMX0FNQklFTlQ6CisgICAgY2FzZSBHTF9ESUZGVVNFOgorICAgIGNhc2UgR0xfU1BFQ1VMQVI6CisgICAgY2FzZSBHTF9FTUlTU0lPTjoKKyAgICBjYXNlIEdMX0FNQklFTlRfQU5EX0RJRkZVU0U6CisgICAgICAgIHBhcmFtc1szXSA9IHRtcFBhcmFtc1szXTsKKyAgICAgICAgcGFyYW1zWzJdID0gdG1wUGFyYW1zWzJdOworICAgICAgICBwYXJhbXNbMV0gPSB0bXBQYXJhbXNbMV07CisgICAgY2FzZSBHTF9TSElOSU5FU1M6CisgICAgICAgIHBhcmFtc1swXSA9IHRtcFBhcmFtc1swXTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDp7CisgICAgICAgICAgICBjdHgtPnNldEdMZXJyb3IoR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsR2V0UG9pbnRlcnYoIEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGNvbnN0IEdMRVNwb2ludGVyKiBwID0gY3R4LT5nZXRQb2ludGVyKHBuYW1lKTsKKyAgICBpZihwKSB7CisgICAgICAgIGlmKHAtPmlzVkJPKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwYXJhbXMgPSBTYWZlUG9pbnRlckZyb21VSW50KHAtPmdldEJ1ZmZlck9mZnNldCgpKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAqcGFyYW1zID0gY29uc3RfY2FzdDx2b2lkICo+KHAtPmdldEFycmF5RGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+c2V0R0xlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgIH0KKworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRUZXhFbnZmdiggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleEVudmZ2KGVudixwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRUZXhFbnZpdiggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRUZXhFbnZpdihlbnYscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsR2V0VGV4RW52eHYoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgR0xmbG9hdCB0bXBQYXJhbXNbNF07CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleEVudmZ2KGVudixwbmFtZSx0bXBQYXJhbXMpOworICAgIGlmKHBuYW1lID09IEdMX1RFWFRVUkVfRU5WX01PREUpIHsKKyAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8R0xmaXhlZD4odG1wUGFyYW1zWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaW50IGk9MCA7IGkgPCA0IDsgaSsrKQorICAgICAgICAgICAgcGFyYW1zW2ldID0gRjJYKHRtcFBhcmFtc1tpXSk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRUZXhQYXJhbWV0ZXJmdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgIGlmIChwbmFtZT09R0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICBUZXh0dXJlRGF0YSAqdGV4RGF0YSA9IGdldFRleHR1cmVUYXJnZXREYXRhKHRhcmdldCk7CisgICAgICBTRVRfRVJST1JfSUYodGV4RGF0YT09TlVMTCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICBmb3IgKGludCBpPTA7aTw0OysraSkKKyAgICAgICAgcGFyYW1zW2ldID0gdGV4RGF0YS0+Y3JvcF9yZWN0W2ldOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LHBuYW1lLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xHZXRUZXhQYXJhbWV0ZXJpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgaWYgKHBuYW1lPT1HTF9URVhUVVJFX0NST1BfUkVDVF9PRVMpIHsKKyAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgIFNFVF9FUlJPUl9JRih0ZXhEYXRhPT1OVUxMLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgIGZvciAoaW50IGk9MDtpPDQ7KytpKQorICAgICAgICBwYXJhbXNbaV0gPSB0ZXhEYXRhLT5jcm9wX3JlY3RbaV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQscG5hbWUscGFyYW1zKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbEdldFRleFBhcmFtZXRlcnh2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGlmIChwbmFtZT09R0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICBUZXh0dXJlRGF0YSAqdGV4RGF0YSA9IGdldFRleHR1cmVUYXJnZXREYXRhKHRhcmdldCk7CisgICAgICBTRVRfRVJST1JfSUYodGV4RGF0YT09TlVMTCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICBmb3IgKGludCBpPTA7aTw0OysraSkKKyAgICAgICAgcGFyYW1zW2ldID0gRjJYKHRleERhdGEtPmNyb3BfcmVjdFtpXSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgR0xmbG9hdCB0bXBQYXJhbTsKKyAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LHBuYW1lLCZ0bXBQYXJhbSk7CisgICAgICBwYXJhbXNbMF0gPSBzdGF0aWNfY2FzdDxHTGZpeGVkPih0bXBQYXJhbSk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xIaW50KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OmhpbnRUYXJnZXRNb2RlKHRhcmdldCxtb2RlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsSGludCh0YXJnZXQsbW9kZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbExpZ2h0TW9kZWxmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbExpZ2h0TW9kZWxmKHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTGlnaHRNb2RlbGZ2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGlnaHRNb2RlbGZ2KHBuYW1lLHBhcmFtcyk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbExpZ2h0TW9kZWx4KCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBHTGZsb2F0IHRtcFBhcmFtID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGlnaHRNb2RlbGYocG5hbWUsdG1wUGFyYW0pOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xMaWdodE1vZGVseHYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgR0xmbG9hdCB0bXBQYXJhbXNbNF07CisgICAgaWYocG5hbWUgPT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpIHsKKyAgICAgICAgdG1wUGFyYW1zWzBdID0gWDJGKHBhcmFtc1swXSk7CisgICAgfSBlbHNlIGlmIChwbmFtZSA9PSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UKSB7CisgICAgICAgIGZvcihpbnQgaT0wO2k8NDtpKyspIHsKKyAgICAgICAgICAgIHRtcFBhcmFtc1tpXSA9IFgyRihwYXJhbXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xMaWdodE1vZGVsZnYocG5hbWUsdG1wUGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTGlnaHRmKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGlnaHRmKGxpZ2h0LHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTGlnaHRmdiggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGlnaHRmdihsaWdodCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xMaWdodHgoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xMaWdodGYobGlnaHQscG5hbWUsWDJGKHBhcmFtKSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbExpZ2h0eHYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBHTGZsb2F0IHRtcFBhcmFtc1s0XTsKKworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9BTUJJRU5UOgorICAgICAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgICAgIGNhc2UgR0xfU1BFQ1VMQVI6CisgICAgICAgIGNhc2UgR0xfRU1JU1NJT046CisgICAgICAgIGNhc2UgR0xfUE9TSVRJT046CisgICAgICAgICAgICB0bXBQYXJhbXNbM10gPSBYMkYocGFyYW1zWzNdKTsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0RJUkVDVElPTjoKKyAgICAgICAgICAgIHRtcFBhcmFtc1syXSA9IFgyRihwYXJhbXNbMl0pOworICAgICAgICAgICAgdG1wUGFyYW1zWzFdID0gWDJGKHBhcmFtc1sxXSk7CisgICAgICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKKyAgICAgICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKKyAgICAgICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKKyAgICAgICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046CisgICAgICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgdG1wUGFyYW1zWzBdID0gWDJGKHBhcmFtc1swXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIGN0eC0+c2V0R0xlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xMaWdodGZ2KGxpZ2h0LHBuYW1lLHRtcFBhcmFtcyk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbExpbmVXaWR0aCggR0xmbG9hdCB3aWR0aCkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGluZVdpZHRoKHdpZHRoKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTGluZVdpZHRoeCggR0xmaXhlZCB3aWR0aCkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGluZVdpZHRoKFgyRih3aWR0aCkpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xMb2FkSWRlbnRpdHkoIHZvaWQpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbExvYWRJZGVudGl0eSgpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xMb2FkTWF0cml4ZiggY29uc3QgR0xmbG9hdCAqbSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTG9hZE1hdHJpeGYobSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbExvYWRNYXRyaXh4KCBjb25zdCBHTGZpeGVkICptKSB7CisgICAgR0VUX0NUWCgpCisgICAgR0xmbG9hdCBtYXRbMTZdOworICAgIGZvcihpbnQgaT0wOyBpPCAxNiA7IGkrKykgeworICAgICAgICBtYXRbaV0gPSBYMkYobVtpXSk7CisgICAgfQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTG9hZE1hdHJpeGYobWF0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTG9naWNPcCggR0xlbnVtIG9wY29kZSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTG9naWNPcChvcGNvZGUpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xNYXRlcmlhbGYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE1hdGVyaWFsZihmYWNlLHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTWF0ZXJpYWxmdiggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xNYXRlcmlhbGZ2KGZhY2UscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTWF0ZXJpYWx4KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xNYXRlcmlhbGYoZmFjZSxwbmFtZSxYMkYocGFyYW0pKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTWF0ZXJpYWx4diggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgR0xmbG9hdCB0bXBQYXJhbXNbNF07CisKKyAgICBmb3IoaW50IGk9MDsgaTwgNDsgaSsrKSB7CisgICAgICAgIHRtcFBhcmFtc1tpXSA9IFgyRihwYXJhbXNbaV0pOworICAgIH0KKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE1hdGVyaWFsZnYoZmFjZSxwbmFtZSx0bXBQYXJhbXMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xNYXRyaXhNb2RlKCBHTGVudW0gbW9kZSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTWF0cml4TW9kZShtb2RlKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTXVsdE1hdHJpeGYoIGNvbnN0IEdMZmxvYXQgKm0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE11bHRNYXRyaXhmKG0pOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xNdWx0TWF0cml4eCggY29uc3QgR0xmaXhlZCAqbSkgeworICAgIEdFVF9DVFgoKQorICAgIEdMZmxvYXQgbWF0WzE2XTsKKyAgICBmb3IoaW50IGk9MDsgaTwgMTYgOyBpKyspIHsKKyAgICAgICAgbWF0W2ldID0gWDJGKG1baV0pOworICAgIH0KKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE11bHRNYXRyaXhmKG1hdCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbE11bHRpVGV4Q29vcmQ0ZiggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSB7CisgICAgR0VUX0NUWF9DTSgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4dHVyZUVudW0odGFyZ2V0LGN0eC0+Z2V0TWF4VGV4VW5pdHMoKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE11bHRpVGV4Q29vcmQ0Zih0YXJnZXQscyx0LHIscSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbE11bHRpVGV4Q29vcmQ0eCggR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKSB7CisgICAgR0VUX0NUWF9DTSgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4dHVyZUVudW0odGFyZ2V0LGN0eC0+Z2V0TWF4VGV4VW5pdHMoKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE11bHRpVGV4Q29vcmQ0Zih0YXJnZXQsWDJGKHMpLFgyRih0KSxYMkYociksWDJGKHEpKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTm9ybWFsM2YoIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE5vcm1hbDNmKG54LG55LG56KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTm9ybWFsM3goIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE5vcm1hbDNmKFgyRihueCksWDJGKG55KSxYMkYobnopKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsTm9ybWFsUG9pbnRlciggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoc3RyaWRlIDwgMCxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpub3JtYWxQb2ludGVyVHlwZSh0eXBlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+c2V0UG9pbnRlcihHTF9OT1JNQUxfQVJSQVksMyx0eXBlLHN0cmlkZSxwb2ludGVyKTsvLzMgbm9ybWFsIHZlcmN0b3IKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsT3J0aG9mKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xPcnRobyhsZWZ0LHJpZ2h0LGJvdHRvbSx0b3Asek5lYXIsekZhcik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbE9ydGhveCggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsT3J0aG8oWDJGKGxlZnQpLFgyRihyaWdodCksWDJGKGJvdHRvbSksWDJGKHRvcCksWDJGKHpOZWFyKSxYMkYoekZhcikpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xQaXhlbFN0b3JlaSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighKHBuYW1lID09IEdMX1BBQ0tfQUxJR05NRU5UIHx8IHBuYW1lID09IEdMX1VOUEFDS19BTElHTk1FTlQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCEoKHBhcmFtPT0xKXx8KHBhcmFtPT0yKXx8KHBhcmFtPT00KXx8KHBhcmFtPT04KSksIEdMX0lOVkFMSURfVkFMVUUpOworICAgIGN0eC0+c2V0VW5wYWNrQWxpZ25tZW50KHBhcmFtKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFBpeGVsU3RvcmVpKHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsUG9pbnRQYXJhbWV0ZXJmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFBvaW50UGFyYW1ldGVyZihwbmFtZSxwYXJhbSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFBvaW50UGFyYW1ldGVyZnYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb2ludFBhcmFtZXRlcmZ2KHBuYW1lLHBhcmFtcyk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFBvaW50UGFyYW1ldGVyeCggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQoreworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUG9pbnRQYXJhbWV0ZXJmKHBuYW1lLFgyRihwYXJhbSkpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xQb2ludFBhcmFtZXRlcnh2KCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorCisgICAgR0xmbG9hdCB0bXBQYXJhbSA9IFgyRigqcGFyYW1zKSA7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb2ludFBhcmFtZXRlcmZ2KHBuYW1lLCZ0bXBQYXJhbSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFBvaW50U2l6ZSggR0xmbG9hdCBzaXplKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb2ludFNpemUoc2l6ZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFBvaW50U2l6ZVBvaW50ZXJPRVMoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKHN0cmlkZSA8IDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6cG9pbnRQb2ludGVyVHlwZSh0eXBlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+c2V0UG9pbnRlcihHTF9QT0lOVF9TSVpFX0FSUkFZX09FUywxLHR5cGUsc3RyaWRlLHBvaW50ZXIpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xQb2ludFNpemV4KCBHTGZpeGVkIHNpemUpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFBvaW50U2l6ZShYMkYoc2l6ZSkpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xQb2x5Z29uT2Zmc2V0KCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUG9seWdvbk9mZnNldChmYWN0b3IsdW5pdHMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xQb2x5Z29uT2Zmc2V0eCggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFBvbHlnb25PZmZzZXQoWDJGKGZhY3RvciksWDJGKHVuaXRzKSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFBvcE1hdHJpeCh2b2lkKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb3BNYXRyaXgoKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsUHVzaE1hdHJpeCh2b2lkKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQdXNoTWF0cml4KCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFJlYWRQaXhlbHMoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6cGl4ZWxGcm10KGN0eCxmb3JtYXQpICYmIEdMRVNjbVZhbGlkYXRlOjpwaXhlbFR5cGUoY3R4LHR5cGUpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighKEdMRVNjbVZhbGlkYXRlOjpwaXhlbE9wKGZvcm1hdCx0eXBlKSksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xSZWFkUGl4ZWxzKHgseSx3aWR0aCxoZWlnaHQsZm9ybWF0LHR5cGUscGl4ZWxzKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsUm90YXRlZiggR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUm90YXRlZihhbmdsZSx4LHkseik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFJvdGF0ZXgoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFJvdGF0ZWYoYW5nbGUsWDJGKHgpLFgyRih5KSxYMkYoeikpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xTYW1wbGVDb3ZlcmFnZSggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFNhbXBsZUNvdmVyYWdlKHZhbHVlLGludmVydCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFNhbXBsZUNvdmVyYWdleCggR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFNhbXBsZUNvdmVyYWdlKFgyRih2YWx1ZSksaW52ZXJ0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsU2NhbGVmKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xTY2FsZWYoeCx5LHopOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xTY2FsZXgoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFNjYWxlZihYMkYoeCksWDJGKHkpLFgyRih6KSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFNjaXNzb3IoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xTY2lzc29yKHgseSx3aWR0aCxoZWlnaHQpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xTaGFkZU1vZGVsKCBHTGVudW0gbW9kZSkgeworICAgIEdFVF9DVFgoKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU2hhZGVNb2RlbChtb2RlKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsU3RlbmNpbEZ1bmMoIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xTdGVuY2lsRnVuYyhmdW5jLHJlZixtYXNrKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsU3RlbmNpbE1hc2soIEdMdWludCBtYXNrKSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xTdGVuY2lsTWFzayhtYXNrKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsU3RlbmNpbE9wKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6c3RlbmNpbE9wKGZhaWwpICYmIEdMRVNjbVZhbGlkYXRlOjpzdGVuY2lsT3AoemZhaWwpICYmIEdMRVNjbVZhbGlkYXRlOjpzdGVuY2lsT3AoenBhc3MpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU3RlbmNpbE9wKGZhaWwsemZhaWwsenBhc3MpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUZXhDb29yZFBvaW50ZXIoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4Q29vcmRQb2ludGVyUGFyYW1zKHNpemUsc3RyaWRlKSxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXhDb29yZFBvaW50ZXJUeXBlKHR5cGUpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5zZXRQb2ludGVyKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVksc2l6ZSx0eXBlLHN0cmlkZSxwb2ludGVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4RW52ZiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4RW52KHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEVudmYodGFyZ2V0LHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4RW52ZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4RW52KHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEVudmZ2KHRhcmdldCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUZXhFbnZpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4RW52KHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEVudmkodGFyZ2V0LHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4RW52aXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleEVudih0YXJnZXQscG5hbWUpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhFbnZpdih0YXJnZXQscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4RW52eCggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4RW52KHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBHTGZsb2F0IHRtcFBhcmFtID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4RW52Zih0YXJnZXQscG5hbWUsdG1wUGFyYW0pOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUZXhFbnZ4diggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXhFbnYodGFyZ2V0LHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgR0xmbG9hdCB0bXBQYXJhbXNbNF07CisgICAgaWYocG5hbWUgPT0gR0xfVEVYVFVSRV9FTlZfQ09MT1IpIHsKKyAgICAgICAgZm9yKGludCBpID0wO2k8NDtpKyspIHsKKyAgICAgICAgICAgIHRtcFBhcmFtc1tpXSA9IFgyRihwYXJhbXNbaV0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wUGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW1zWzBdKTsKKyAgICB9CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhFbnZmdih0YXJnZXQscG5hbWUsdG1wUGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4SW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKKyAgICBHRVRfQ1RYKCkKKworICAgIFNFVF9FUlJPUl9JRighKEdMRVNjbVZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSAmJgorICAgICAgICAgICAgICAgICAgICAgR0xFU2NtVmFsaWRhdGU6OnBpeGVsRnJtdChjdHgsaW50ZXJuYWxmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICBHTEVTY21WYWxpZGF0ZTo6cGl4ZWxGcm10KGN0eCxmb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICBHTEVTY21WYWxpZGF0ZTo6cGl4ZWxUeXBlKGN0eCx0eXBlKSksR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIFNFVF9FUlJPUl9JRighKEdMRVNjbVZhbGlkYXRlOjpwaXhlbE9wKGZvcm1hdCx0eXBlKSAmJiBpbnRlcm5hbGZvcm1hdCA9PSAoKEdMaW50KWZvcm1hdCkpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgIGJvb2wgbmVlZEF1dG9NaXBtYXAgPSBmYWxzZTsKKworICAgIGlmIChjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSAmJiBsZXZlbCA9PSAwKXsKKyAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBnZXRUZXh0dXJlVGFyZ2V0RGF0YSh0YXJnZXQpOworICAgICAgICBTRVRfRVJST1JfSUYodGV4RGF0YT09TlVMTCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIGlmKHRleERhdGEpIHsKKyAgICAgICAgICAgIHRleERhdGEtPndpZHRoID0gd2lkdGg7CisgICAgICAgICAgICB0ZXhEYXRhLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICB0ZXhEYXRhLT5ib3JkZXIgPSBib3JkZXI7CisgICAgICAgICAgICB0ZXhEYXRhLT5pbnRlcm5hbEZvcm1hdCA9IGludGVybmFsZm9ybWF0OworICAgICAgICAgICAgdGV4RGF0YS0+dGFyZ2V0ID0gdGFyZ2V0OworCisgICAgICAgICAgICBpZiAodGV4RGF0YS0+c291cmNlRUdMSW1hZ2UgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhpcyB0ZXh0dXJlIHdhcyBhIHRhcmdldCBvZiBFR0xJbWFnZSwKKyAgICAgICAgICAgICAgICAvLyBidXQgbm93IGl0IGlzIHJlLWRlZmluZWQgc28gd2UgbmVlZCB0bworICAgICAgICAgICAgICAgIC8vIHJlLWdlbmVyYXRlIGdsb2JhbCB0ZXh0dXJlIG5hbWUgZm9yIGl0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRleCA9IGN0eC0+Z2V0QmluZGVkVGV4dHVyZSh0YXJnZXQpOworICAgICAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZ2xvYmFsVGV4dHVyZU5hbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4KTsKKyAgICAgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUZXh0dXJlTmFtZSk7CisgICAgICAgICAgICAgICAgdGV4RGF0YS0+c291cmNlRUdMSW1hZ2UgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZWVkQXV0b01pcG1hcCA9IHRleERhdGEtPnJlcXVpcmVzQXV0b01pcG1hcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4SW1hZ2UyRCh0YXJnZXQsbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsZm9ybWF0LHdpZHRoLGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyLGZvcm1hdCx0eXBlLHBpeGVscyk7CisKKyAgICBpZihuZWVkQXV0b01pcG1hcCkKKyAgICB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2VuZXJhdGVNaXBtYXBFWFQodGFyZ2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBib29sIGhhbmRsZU1pcG1hcEdlbmVyYXRpb24oR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBib29sIHBhcmFtKQoreworICAgIEdFVF9DVFhfUkVUKGZhbHNlKQorCisgICAgaWYocG5hbWUgPT0gR0xfR0VORVJBVEVfTUlQTUFQICYmICFjdHgtPmlzQXV0b01pcG1hcFN1cHBvcnRlZCgpKQorICAgIHsKKyAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBnZXRUZXh0dXJlVGFyZ2V0RGF0YSh0YXJnZXQpOworICAgICAgICBpZih0ZXhEYXRhKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXhEYXRhLT5yZXF1aXJlc0F1dG9NaXBtYXAgPSBwYXJhbTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFRleFBhcmFtZXRlcmYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleFBhcmFtcyh0YXJnZXQscG5hbWUpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBpZihoYW5kbGVNaXBtYXBHZW5lcmF0aW9uKHRhcmdldCwgcG5hbWUsIChib29sKXBhcmFtKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJmKHRhcmdldCxwbmFtZSxwYXJhbSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFRleFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleFBhcmFtcyh0YXJnZXQscG5hbWUpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBpZihoYW5kbGVNaXBtYXBHZW5lcmF0aW9uKHRhcmdldCwgcG5hbWUsIChib29sKSgqcGFyYW1zKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwbmFtZT09R0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKHRleERhdGE9PU5VTEwsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBmb3IgKGludCBpPTA7aTw0OysraSkKKyAgICAgICAgICAgIHRleERhdGEtPmNyb3BfcmVjdFtpXSA9IHBhcmFtc1tpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4UGFyYW1ldGVyZnYodGFyZ2V0LHBuYW1lLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUZXhQYXJhbWV0ZXJpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4UGFyYW1zKHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIGlmKGhhbmRsZU1pcG1hcEdlbmVyYXRpb24odGFyZ2V0LCBwbmFtZSwgKGJvb2wpcGFyYW0pKQorICAgICAgICByZXR1cm47CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleFBhcmFtcyh0YXJnZXQscG5hbWUpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBpZihoYW5kbGVNaXBtYXBHZW5lcmF0aW9uKHRhcmdldCwgcG5hbWUsIChib29sKSgqcGFyYW1zKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwbmFtZT09R0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKHRleERhdGE9PU5VTEwsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBmb3IgKGludCBpPTA7aTw0OysraSkKKyAgICAgICAgICAgIHRleERhdGEtPmNyb3BfcmVjdFtpXSA9IHBhcmFtc1tpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4UGFyYW1ldGVyaXYodGFyZ2V0LHBuYW1lLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUZXhQYXJhbWV0ZXJ4KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXhQYXJhbXModGFyZ2V0LHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgaWYoaGFuZGxlTWlwbWFwR2VuZXJhdGlvbih0YXJnZXQsIHBuYW1lLCAoYm9vbClwYXJhbSkpCisgICAgICAgIHJldHVybjsKKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4UGFyYW1ldGVyZih0YXJnZXQscG5hbWUsc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW0pKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVGV4UGFyYW1ldGVyeHYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4UGFyYW1zKHRhcmdldCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIGlmKGhhbmRsZU1pcG1hcEdlbmVyYXRpb24odGFyZ2V0LCBwbmFtZSwgKGJvb2wpKCpwYXJhbXMpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHBuYW1lPT1HTF9URVhUVVJFX0NST1BfUkVDVF9PRVMpIHsKKyAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBnZXRUZXh0dXJlVGFyZ2V0RGF0YSh0YXJnZXQpOworICAgICAgICBTRVRfRVJST1JfSUYodGV4RGF0YT09TlVMTCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIGZvciAoaW50IGk9MDtpPDQ7KytpKQorICAgICAgICAgICAgdGV4RGF0YS0+Y3JvcF9yZWN0W2ldID0gWDJGKHBhcmFtc1tpXSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBHTGZsb2F0IHBhcmFtID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW1zWzBdKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJmdih0YXJnZXQscG5hbWUsJnBhcmFtKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFRleFN1YkltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU2NtVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRFeCh0YXJnZXQpICYmCisgICAgICAgICAgICAgICAgICAgR0xFU2NtVmFsaWRhdGU6OnBpeGVsRnJtdChjdHgsZm9ybWF0KSYmCisgICAgICAgICAgICAgICAgICAgR0xFU2NtVmFsaWRhdGU6OnBpeGVsVHlwZShjdHgsdHlwZSkpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6cGl4ZWxPcChmb3JtYXQsdHlwZSksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIC8vIHNldCBhbiBlcnJvciBpZiBsZXZlbCA8IDAgb3IgbGV2ZWwgPiBsb2cgMiBtYXgKKyAgICBTRVRfRVJST1JfSUYobGV2ZWwgPCAwIHx8IDE8PGxldmVsID4gY3R4LT5nZXRNYXhUZXhTaXplKCksIEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRih4b2Zmc2V0IDwgMCB8fCB5b2Zmc2V0IDwgMCB8fCB3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYgKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleERhdGEpIHsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRih4b2Zmc2V0ICsgd2lkdGggPiAoR0xpbnQpdGV4RGF0YS0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgIHlvZmZzZXQgKyBoZWlnaHQgPiAoR0xpbnQpdGV4RGF0YS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgU0VUX0VSUk9SX0lGKCFwaXhlbHMsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhTdWJJbWFnZTJEKHRhcmdldCxsZXZlbCx4b2Zmc2V0LHlvZmZzZXQsd2lkdGgsaGVpZ2h0LGZvcm1hdCx0eXBlLHBpeGVscyk7CisKKyAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpeworICAgICAgICBUZXh0dXJlRGF0YSAqdGV4RGF0YSA9IGdldFRleHR1cmVUYXJnZXREYXRhKHRhcmdldCk7CisgICAgICAgIFNFVF9FUlJPUl9JRih0ZXhEYXRhPT1OVUxMLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgaWYodGV4RGF0YSAmJiB0ZXhEYXRhLT5yZXF1aXJlc0F1dG9NaXBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZICBnbFRyYW5zbGF0ZWYoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRyYW5zbGF0ZWYoeCx5LHopOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSAgZ2xUcmFuc2xhdGV4KCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUcmFuc2xhdGVmKFgyRih4KSxYMkYoeSksWDJGKHopKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVmVydGV4UG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp2ZXJ0ZXhQb2ludGVyUGFyYW1zKHNpemUsc3RyaWRlKSxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp2ZXJ0ZXhQb2ludGVyVHlwZSh0eXBlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+c2V0UG9pbnRlcihHTF9WRVJURVhfQVJSQVksc2l6ZSx0eXBlLHN0cmlkZSxwb2ludGVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgIGdsVmlld3BvcnQoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgR0VUX0NUWCgpCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xWaWV3cG9ydCh4LHksd2lkdGgsaGVpZ2h0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKQoreworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0TGltaXRlZCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgdW5zaWduZWQgaW50IGltYWdlaG5kbCA9IFNhZmVVSW50RnJvbVBvaW50ZXIoaW1hZ2UpOworICAgIEltYWdlUHRyIGltZyA9IHNfZWdsSWZhY2UtPmdldEVHTEltYWdlKGltYWdlaG5kbCk7CisgICAgaWYgKGltZykgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHRleHR1cmUgb2JqZWN0IGluIHRoZSB1bmRlcmx5aW5nIEVHTCBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgLy8gZmxhZyB0byB0aGUgT3BlbkdMIGxheWVyIHRvIHNraXAgdGhlIGltYWdlIGNyZWF0aW9uIGFuZCBtYXAgdGhlCisgICAgICAgIC8vIGN1cnJlbnQgYmluZGVkIHRleHR1cmUgb2JqZWN0IHRvIHRoZSBleGlzdGluZyBnbG9iYWwgb2JqZWN0LgorICAgICAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSB0ZXggPSBUZXh0dXJlTG9jYWxOYW1lKHRhcmdldCxjdHgtPmdldEJpbmRlZFRleHR1cmUodGFyZ2V0KSk7CisgICAgICAgICAgICAvLyByZXBsYWNlIG1hcHBpbmcgYW5kIGJpbmQgdGhlIG5ldyBnbG9iYWwgb2JqZWN0CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+cmVwbGFjZUdsb2JhbE9iamVjdChOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIHRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+Z2xvYmFsVGV4T2JqKTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5nbG9iYWxUZXhPYmotPmdldEdsb2JhbE5hbWUoKSk7CisgICAgICAgICAgICBUZXh0dXJlRGF0YSAqdGV4RGF0YSA9IGdldFRleHR1cmVUYXJnZXREYXRhKHRhcmdldCk7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYodGV4RGF0YT09TlVMTCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICB0ZXhEYXRhLT53aWR0aCA9IGltZy0+d2lkdGg7CisgICAgICAgICAgICB0ZXhEYXRhLT5oZWlnaHQgPSBpbWctPmhlaWdodDsKKyAgICAgICAgICAgIHRleERhdGEtPmJvcmRlciA9IGltZy0+Ym9yZGVyOworICAgICAgICAgICAgdGV4RGF0YS0+aW50ZXJuYWxGb3JtYXQgPSBpbWctPmludGVybmFsRm9ybWF0OworICAgICAgICAgICAgdGV4RGF0YS0+c291cmNlRUdMSW1hZ2UgPSBpbWFnZWhuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCit7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRih0YXJnZXQgIT0gR0xfUkVOREVSQlVGRkVSX09FUyxHTF9JTlZBTElEX0VOVU0pOworICAgIHVuc2lnbmVkIGludCBpbWFnZWhuZGwgPSBTYWZlVUludEZyb21Qb2ludGVyKGltYWdlKTsKKyAgICBJbWFnZVB0ciBpbWcgPSBzX2VnbElmYWNlLT5nZXRFR0xJbWFnZShpbWFnZWhuZGwpOworICAgIFNFVF9FUlJPUl9JRighaW1nLEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRighY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgLy8gR2V0IGN1cnJlbnQgYm91bmRlZCByZW5kZXJidWZmZXIKKyAgICAvLyByYWlzZSBJTlZBTElEX09QRVJBVElPbiBpZiBubyByZW5kZXJidWZmZXIgaXMgYm91bmRlZAorICAgIEdMdWludCByYiA9IGN0eC0+Z2V0UmVuZGVyYnVmZmVyQmluZGluZygpOworICAgIFNFVF9FUlJPUl9JRihyYiA9PSAwLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBhdXRvIG9iakRhdGEgPQorICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJiKTsKKyAgICBSZW5kZXJidWZmZXJEYXRhICpyYkRhdGEgPSAoUmVuZGVyYnVmZmVyRGF0YSAqKW9iakRhdGE7CisgICAgU0VUX0VSUk9SX0lGKCFyYkRhdGEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgLy8KKyAgICAvLyBhY3F1aXJlIHRoZSB0ZXh0dXJlIGluIHRoZSByZW5kZXJidWZmZXJEYXRhIHRoYXQgaXQgaXMgYW4gZWdsSW1hZ2UgdGFyZ2V0CisgICAgLy8KKyAgICByYkRhdGEtPmVnbEltYWdlR2xvYmFsVGV4T2JqZWN0ID0gaW1nLT5nbG9iYWxUZXhPYmo7CisKKyAgICAvLworICAgIC8vIGlmIHRoZSByZW5kZXJidWZmZXIgaXMgYXR0YWNoZWQgdG8gYSBmcmFtZWJ1ZmZlcgorICAgIC8vIGNoYW5nZSB0aGUgZnJhbWVidWZmZXIgYXR0YWNobWVudCBpbiB0aGUgdW5kZWx5aW5nIE9wZW5HTAorICAgIC8vIHRvIHBvaW50IHRvIHRoZSBlZ2xJbWFnZSB0ZXh0dXJlIG9iamVjdC4KKyAgICAvLworICAgIGlmIChyYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBmcmFtZWJ1ZmZlciBhdHRhY2htZW50IHBvaW50IHRvIHRoZQorICAgICAgICAvLyB1bmRlcmx5aW5nIHRleHR1cmUgb2YgdGhlIGltZworICAgICAgICBHTHVpbnQgcHJldkZCID0gY3R4LT5nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKTsKKyAgICAgICAgaWYgKHByZXZGQiAhPSByYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiRGF0YS0+YXR0YWNoZWRGQik7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVChHTF9GUkFNRUJVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJEYXRhLT5hdHRhY2hlZFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5nbG9iYWxUZXhPYmotPmdldEdsb2JhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKHByZXZGQiAhPSByYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZGQik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEdMX09FU19ibGVuZF9zdWJ0cmFjdCovCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25PRVMoR0xlbnVtIG1vZGUpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6YmxlbmRFcXVhdGlvbk1vZGUobW9kZSkpLCBHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmxlbmRFcXVhdGlvbihtb2RlKTsKK30KKworLyogR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTY21WYWxpZGF0ZTo6YmxlbmRFcXVhdGlvbk1vZGUobW9kZVJHQikgJiYgR0xFU2NtVmFsaWRhdGU6OmJsZW5kRXF1YXRpb25Nb2RlKG1vZGVBbHBoYSkpLCBHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0IsbW9kZUFscGhhKTsKK30KKworLyogR0xfT0VTX2JsZW5kX2Z1bmNfc2VwYXJhdGUgKi8KK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jU2VwYXJhdGVPRVMoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpibGVuZFNyYyhzcmNSR0IpIHx8ICFHTEVTY21WYWxpZGF0ZTo6YmxlbmREc3QoZHN0UkdCKSB8fAorICAgICAgICAgICAgICAgICAhR0xFU2NtVmFsaWRhdGU6OmJsZW5kU3JjKHNyY0FscGhhKSB8fCAhIEdMRVNjbVZhbGlkYXRlOjpibGVuZERzdChkc3RBbHBoYSkgLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsZHN0UkdCLHNyY0FscGhhLGRzdEFscGhhKTsKK30KKworLyogR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAqLworR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyT0VTKEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgICBHRVRfQ1RYX1JFVChHTF9GQUxTRSkKKyAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04sR0xfRkFMU0UpOworICAgIGlmKHJlbmRlcmJ1ZmZlciAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSl7CisgICAgICAgIHJldHVybiBjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICA/IEdMX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgOiBHTF9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIGN0eC0+ZGlzcGF0Y2hlcigpLmdsSXNSZW5kZXJidWZmZXJFWFQocmVuZGVyYnVmZmVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xBUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICAvL2lmIGJ1ZmZlciB3YXNuJ3QgZ2VuZXJhdGVkIGJlZm9yZSxnZW5lcmF0ZSBvbmUKKyAgICBpZiAocmVuZGVyYnVmZmVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpICYmCisgICAgICAgICFjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyKSkgeworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgUmVuZGVyYnVmZmVyRGF0YSgpKSk7CisgICAgfQorCisgICAgaW50IGdsb2JhbEJ1ZmZlck5hbWUgPQorICAgICAgICAgICAgKHJlbmRlcmJ1ZmZlciAhPSAwKQorICAgICAgICAgICAgICAgICAgICA/IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgOiAwOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsZ2xvYmFsQnVmZmVyTmFtZSk7CisKKyAgICAvLyB1cGRhdGUgcmVuZGVyYnVmZmVyIGJpbmRpbmcgc3RhdGUKKyAgICBjdHgtPnNldFJlbmRlcmJ1ZmZlckJpbmRpbmcocmVuZGVyYnVmZmVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+Z2V0Q2FwcygpLT5HTF9FWFRfRlJBTUVCVUZGRVJfT0JKRUNULEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBmb3IgKGludCBpPTA7aTxuOysraSkgeworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+ZGVsZXRlTmFtZShOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyc1tpXSk7CisgICAgfQorfQorCitHTF9BUEkgdm9pZCBHTEFQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVyc09FUyhHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICByZW5kZXJidWZmZXJzW2ldID0gY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCAwLCB0cnVlKTsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5zZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgUmVuZGVyYnVmZmVyRGF0YSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpIHx8ICFHTEVTY21WYWxpZGF0ZTo6cmVuZGVyYnVmZmVySW50ZXJuYWxGcm10KGN0eCxpbnRlcm5hbGZvcm1hdCkgLEdMX0lOVkFMSURfRU5VTSk7CisgICAgaWYgKGludGVybmFsZm9ybWF0PT1HTF9SR0I1NjVfT0VTKSAvL1JHQjU2NSBub3Qgc3VwcG9ydGVkIGJ5IEdMCisgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfUkdCOF9PRVM7CisKKyAgICAvLyBHZXQgY3VycmVudCBib3VuZGVkIHJlbmRlcmJ1ZmZlcgorICAgIC8vIHJhaXNlIElOVkFMSURfT1BFUkFUSU9uIGlmIG5vIHJlbmRlcmJ1ZmZlciBpcyBib3VuZGVkCisgICAgR0x1aW50IHJiID0gY3R4LT5nZXRSZW5kZXJidWZmZXJCaW5kaW5nKCk7CisgICAgU0VUX0VSUk9SX0lGKHJiID09IDAsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCByYik7CisgICAgUmVuZGVyYnVmZmVyRGF0YSAqcmJEYXRhID0gKFJlbmRlcmJ1ZmZlckRhdGEgKilvYmpEYXRhOworICAgIFNFVF9FUlJPUl9JRighcmJEYXRhLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgIC8vCisgICAgLy8gaWYgdGhlIHJlbmRlcmJ1ZmZlciB3YXMgYW4gZWdsSW1hZ2UgdGFyZ2V0LCByZWxlYXNlCisgICAgLy8gaXRzIHVuZGVybHlpbmcgdGV4dHVyZS4KKyAgICAvLworICAgIHJiRGF0YS0+ZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QucmVzZXQoKTsKKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVCh0YXJnZXQsaW50ZXJuYWxmb3JtYXQsd2lkdGgsaGVpZ2h0KTsKK30KKworR0xfQVBJIHZvaWQgR0xBUElFTlRSWSBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpIHx8ICFHTEVTY21WYWxpZGF0ZTo6cmVuZGVyYnVmZmVyUGFyYW1zKHBuYW1lKSAsR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyBhIHJlbmRlcmJ1ZmZlciB3aGljaCBpcyBlZ2xpbWFnZSdzIHRhcmdldCwgd2UKKyAgICAvLyBzaG91bGQgcXVlcnkgdGhlIHVuZGVybHlpbmcgZWdsaW1hZ2UncyB0ZXh0dXJlIG9iamVjdCBpbnN0ZWFkLgorICAgIC8vCisgICAgR0x1aW50IHJiID0gY3R4LT5nZXRSZW5kZXJidWZmZXJCaW5kaW5nKCk7CisgICAgaWYgKHJiKSB7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCByYik7CisgICAgICAgIFJlbmRlcmJ1ZmZlckRhdGEgKnJiRGF0YSA9IChSZW5kZXJidWZmZXJEYXRhICopb2JqRGF0YTsKKyAgICAgICAgaWYgKHJiRGF0YSAmJiByYkRhdGEtPmVnbEltYWdlR2xvYmFsVGV4T2JqZWN0KSB7CisgICAgICAgICAgICBHTGVudW0gdGV4UG5hbWU7CisgICAgICAgICAgICBzd2l0Y2gocG5hbWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVM6CisgICAgICAgICAgICAgICAgICAgIHRleFBuYW1lID0gR0xfVEVYVFVSRV9XSURUSDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUzoKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0hFSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUzoKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfUkVEX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfR1JFRU5fU0laRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUzoKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0JMVUVfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVM6CisgICAgICAgICAgICAgICAgICAgIHRleFBuYW1lID0gR0xfVEVYVFVSRV9BTFBIQV9TSVpFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUzoKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0RFUFRIX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9PRVM6CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgKnBhcmFtcyA9IDA7IC8vWFhYCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEdMaW50IHByZXZUZXg7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX1RFWFRVUkVfQklORElOR18yRCwgJnByZXZUZXgpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYkRhdGEtPmVnbEltYWdlR2xvYmFsVGV4T2JqZWN0LT5nZXRHbG9iYWxOYW1lKCkpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zKTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgcHJldlRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKHRhcmdldCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUEkgR0xib29sZWFuIEdMQVBJRU5UUlkgZ2xJc0ZyYW1lYnVmZmVyT0VTKEdMdWludCBmcmFtZWJ1ZmZlcikgeworICAgIEdFVF9DVFhfUkVUKEdMX0ZBTFNFKQorICAgIFJFVF9BTkRfU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTixHTF9GQUxTRSk7CisgICAgaWYgKGZyYW1lYnVmZmVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIHJldHVybiBjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBHTF9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgIDogR0xfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBjdHgtPmRpc3BhdGNoZXIoKS5nbElzRnJhbWVidWZmZXJFWFQoZnJhbWVidWZmZXIpOworfQorCitHTF9BUEkgdm9pZCBHTEFQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCkgLEdMX0lOVkFMSURfRU5VTSk7CisgICAgaWYgKGZyYW1lYnVmZmVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpICYmCisgICAgICAgICFjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcikpIHsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpOworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciwKKyAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyKG5ldyBGcmFtZWJ1ZmZlckRhdGEoZnJhbWVidWZmZXIpKSk7CisgICAgfQorICAgIGludCBnbG9iYWxCdWZmZXJOYW1lID0KKyAgICAgICAgICAgIChmcmFtZWJ1ZmZlciAhPSAwKQorICAgICAgICAgICAgICAgICAgICA/IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpCisgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRGcmFtZWJ1ZmZlckVYVCh0YXJnZXQsZ2xvYmFsQnVmZmVyTmFtZSk7CisKKyAgICAvLyB1cGRhdGUgZnJhbWVidWZmZXIgYmluZGluZyBzdGF0ZQorICAgIGN0eC0+c2V0RnJhbWVidWZmZXJCaW5kaW5nKGZyYW1lYnVmZmVyKTsKK30KKworR0xfQVBJIHZvaWQgR0xBUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgZm9yIChpbnQgaT0wO2k8bjsrK2kpIHsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmRlbGV0ZU5hbWUoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXJzW2ldKTsKKyAgICB9Cit9CisKK0dMX0FQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1QsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYgKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGZvciAoaW50IGk9MDtpPG47aSsrKSB7CisgICAgICAgICAgICBmcmFtZWJ1ZmZlcnNbaV0gPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgMCwgdHJ1ZSk7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyKG5ldyBGcmFtZWJ1ZmZlckRhdGEoZnJhbWVidWZmZXJzW2ldKSkpOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUEkgR0xlbnVtIEdMQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKEdMZW51bSB0YXJnZXQpIHsKKyAgICBHRVRfQ1RYX1JFVCgwKQorICAgIFJFVF9BTkRfU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTiwwKTsKKyAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCkgLEdMX0lOVkFMSURfRU5VTSwwKTsKKyAgICByZXR1cm4gY3R4LT5kaXNwYXRjaGVyKCkuZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSB8fCAhR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSB8fAorICAgICAgICAgICAgICAgICAhR0xFU2NtVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRFeCh0ZXh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgR0x1aW50IGdsb2JhbFRleE5hbWUgPSAwOworICAgIGlmKHRleHR1cmUpIHsKKyAgICAgICAgaWYgKCFjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXh0dXJlKSkgeworICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXh0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBPYmplY3RMb2NhbE5hbWUgdGV4bmFtZSA9IFRleHR1cmVMb2NhbE5hbWUodGV4dGFyZ2V0LHRleHR1cmUpOworICAgICAgICBnbG9iYWxUZXhOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXhuYW1lKTsKKyAgICB9CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCxhdHRhY2htZW50LHRleHRhcmdldCxnbG9iYWxUZXhOYW1lLGxldmVsKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdGhlIGN1cnJlbnQgZnJhbWVidWZmZXIgb2JqZWN0IGF0dGFjaG1lbnQgc3RhdGUKKyAgICBHTHVpbnQgZmJOYW1lID0gY3R4LT5nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKTsKKyAgICBhdXRvIGZiT2JqID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBmYk5hbWUpOworICAgIGlmIChmYk9iaikgeworICAgICAgICBGcmFtZWJ1ZmZlckRhdGEgKmZiRGF0YSA9IChGcmFtZWJ1ZmZlckRhdGEgKilmYk9iajsKKyAgICAgICAgZmJEYXRhLT5zZXRBdHRhY2htZW50KGF0dGFjaG1lbnQsIHRleHRhcmdldCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLCBPYmplY3REYXRhUHRyKCkpOworICAgIH0KK30KKworR0xfQVBJIHZvaWQgR0xBUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+Z2V0Q2FwcygpLT5HTF9FWFRfRlJBTUVCVUZGRVJfT0JKRUNULEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjpmcmFtZWJ1ZmZlclRhcmdldCh0YXJnZXQpIHx8IAorICAgICAgICAgICAgICAgICAhR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSB8fAorICAgICAgICAgICAgICAgICAhR0xFU2NtVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldChyZW5kZXJidWZmZXJ0YXJnZXQpLCBHTF9JTlZBTElEX0VOVU0pOworCisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgR0x1aW50IGdsb2JhbEJ1ZmZlck5hbWUgPSAwOworICAgIE9iamVjdERhdGFQdHIgb2JqOworCisgICAgLy8gZ2VuZXJhdGUgdGhlIHJlbmRlcmJ1ZmZlciBvYmplY3QgaWYgbm90IHlldCBleGlzdAorICAgIGlmIChyZW5kZXJidWZmZXIpIHsKKyAgICAgICAgaWYgKCFjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmJ1ZmZlcikpIHsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgIG9iaiA9IE9iamVjdERhdGFQdHIobmV3IFJlbmRlcmJ1ZmZlckRhdGEoKSk7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciwgb2JqKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9iaiA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhUHRyKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICBnbG9iYWxCdWZmZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB0aGUgY3VycmVudCBmcmFtZWJ1ZmZlciBvYmplY3QgYXR0YWNobWVudCBzdGF0ZQorICAgIEdMdWludCBmYk5hbWUgPSBjdHgtPmdldEZyYW1lYnVmZmVyQmluZGluZygpOworICAgIGF1dG8gZmJPYmogPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6RlJBTUVCVUZGRVIsIGZiTmFtZSk7CisgICAgaWYgKGZiT2JqKSB7CisgICAgICAgIEZyYW1lYnVmZmVyRGF0YSAqZmJEYXRhID0gKEZyYW1lYnVmZmVyRGF0YSAqKWZiT2JqOworICAgICAgICBmYkRhdGEtPnNldEF0dGFjaG1lbnQoYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIsIG9iaik7CisgICAgfQorCisgICAgaWYgKHJlbmRlcmJ1ZmZlciAmJiBvYmouZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBSZW5kZXJidWZmZXJEYXRhICpyYkRhdGEgPSAoUmVuZGVyYnVmZmVyRGF0YSAqKW9iai5nZXQoKTsKKyAgICAgICAgaWYgKHJiRGF0YS0+ZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGlzIHJlbmRlcmJ1ZmZlciBvYmplY3QgaXMgYW4gZWdsSW1hZ2UgdGFyZ2V0CisgICAgICAgICAgICAvLyBhdHRhY2ggdGhlIGVnbGltYWdlJ3MgdGV4dHVyZSBpbnN0ZWFkIHRoZSByZW5kZXJidWZmZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCh0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiRGF0YS0+ZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QtPmdldEdsb2JhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsYXR0YWNobWVudCxyZW5kZXJidWZmZXJ0YXJnZXQsZ2xvYmFsQnVmZmVyTmFtZSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSB8fCAhR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSB8fAorICAgICAgICAgICAgICAgICAhR0xFU2NtVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtcyhwbmFtZSksIEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICAvLworICAgIC8vIFRha2UgdGhlIGF0dGFjaG1lbnQgYXR0cmlidXRlIGZyb20gb3VyIHN0YXRlIC0gaWYgYXZhaWxhYmxlCisgICAgLy8KKyAgICBHTHVpbnQgZmJOYW1lID0gY3R4LT5nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKTsKKyAgICBpZiAoZmJOYW1lKSB7CisgICAgICAgIGF1dG8gZmJPYmogPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBmYk5hbWUpOworICAgICAgICBpZiAoZmJPYmopIHsKKyAgICAgICAgICAgIEZyYW1lYnVmZmVyRGF0YSAqZmJEYXRhID0gKEZyYW1lYnVmZmVyRGF0YSAqKWZiT2JqOworICAgICAgICAgICAgR0xlbnVtIHRhcmdldDsKKyAgICAgICAgICAgIEdMdWludCBuYW1lID0gZmJEYXRhLT5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnQsICZ0YXJnZXQsIE5VTEwpOworICAgICAgICAgICAgaWYgKHBuYW1lID09IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTKSB7CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHRhcmdldDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwbmFtZSA9PSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUykgeworICAgICAgICAgICAgICAgICpwYXJhbXMgPSBuYW1lOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQodGFyZ2V0LGF0dGFjaG1lbnQscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcE9FUyhHTGVudW0gdGFyZ2V0KSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmdldENhcHMoKS0+R0xfRVhUX0ZSQU1FQlVGRkVSX09CSkVDVCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4dHVyZVRhcmdldExpbWl0ZWQodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworICAgIGlmIChjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBUZXh0dXJlRGF0YSAqdGV4RGF0YSA9IGdldFRleHR1cmVUYXJnZXREYXRhKHRhcmdldCk7CisgICAgICAgIGlmICh0ZXhEYXRhKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgd2lkdGggPSB0ZXhEYXRhLT53aWR0aDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWlnaHQgPSB0ZXhEYXRhLT5oZWlnaHQ7CisgICAgICAgICAgICAvLyBzZXQgZXJyb3IgY29kZSBpZiBlaXRoZXIgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBub3QgYSBwb3dlciBvZiB0d28uCisgICAgICAgICAgICBTRVRfRVJST1JfSUYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICh3aWR0aCAmICh3aWR0aCAtIDEpKSAhPSAwIHx8IChoZWlnaHQgJiAoaGVpZ2h0IC0gMSkpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB9CisgICAgfQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2VuZXJhdGVNaXBtYXBFWFQodGFyZ2V0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyhHTHVpbnQgaW5kZXgpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIShjdHgtPmdldENhcHMoKS0+R0xfQVJCX01BVFJJWF9QQUxFVFRFICYmIGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfVkVSVEVYX0JMRU5EKSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeEFSQihpbmRleCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTKCkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighKGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfTUFUUklYX1BBTEVUVEUgJiYgY3R4LT5nZXRDYXBzKCktPkdMX0FSQl9WRVJURVhfQkxFTkQpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBHTGludCBtYXRyaXhbMTZdOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYoR0xfTU9ERUxWSUVXX01BVFJJWCxtYXRyaXgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTWF0cml4SW5kZXh1aXZBUkIoMSwoR0x1aW50KiltYXRyaXgpOworCit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCEoY3R4LT5nZXRDYXBzKCktPkdMX0FSQl9NQVRSSVhfUEFMRVRURSAmJiBjdHgtPmdldENhcHMoKS0+R0xfQVJCX1ZFUlRFWF9CTEVORCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTWF0cml4SW5kZXhQb2ludGVyQVJCKHNpemUsdHlwZSxzdHJpZGUscG9pbnRlcik7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlck9FUyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighKGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfTUFUUklYX1BBTEVUVEUgJiYgY3R4LT5nZXRDYXBzKCktPkdMX0FSQl9WRVJURVhfQkxFTkQpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFdlaWdodFBvaW50ZXJBUkIoc2l6ZSx0eXBlLHN0cmlkZSxwb2ludGVyKTsKKworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4R2VuKGNvb3JkLHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGlmIChjb29yZCA9PSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTKSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZihHTF9TLHBuYW1lLHBhcmFtKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5mKEdMX1QscG5hbWUscGFyYW0pOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmYoR0xfUixwbmFtZSxwYXJhbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5mKGNvb3JkLHBuYW1lLHBhcmFtKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5mdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleEdlbihjb29yZCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBpZiAoY29vcmQgPT0gR0xfVEVYVFVSRV9HRU5fU1RSX09FUykgeworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmZ2KEdMX1MscG5hbWUscGFyYW1zKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5mdihHTF9ULHBuYW1lLHBhcmFtcyk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZnYoR0xfUixwbmFtZSxwYXJhbXMpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZnYoY29vcmQscG5hbWUscGFyYW1zKTsKK30KK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaU9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4R2VuKGNvb3JkLHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGlmIChjb29yZCA9PSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTKSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuaShHTF9TLHBuYW1lLHBhcmFtKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5pKEdMX1QscG5hbWUscGFyYW0pOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmkoR0xfUixwbmFtZSxwYXJhbSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5pKGNvb3JkLHBuYW1lLHBhcmFtKTsKK30KK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuaXZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7CisgICAgR0VUX0NUWCgpCisgICAgU0VUX0VSUk9SX0lGKCFHTEVTY21WYWxpZGF0ZTo6dGV4R2VuKGNvb3JkLHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGlmIChjb29yZCA9PSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTKSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuaXYoR0xfUyxwbmFtZSxwYXJhbXMpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbml2KEdMX1QscG5hbWUscGFyYW1zKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5pdihHTF9SLHBuYW1lLHBhcmFtcyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5pdihjb29yZCxwbmFtZSxwYXJhbXMpOworfQorR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW54T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEdFVF9DVFgoKQorICAgIFNFVF9FUlJPUl9JRighR0xFU2NtVmFsaWRhdGU6OnRleEdlbihjb29yZCxwbmFtZSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBpZiAoY29vcmQgPT0gR0xfVEVYVFVSRV9HRU5fU1RSX09FUykgeworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmYoR0xfUyxwbmFtZSxYMkYocGFyYW0pKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5mKEdMX1QscG5hbWUsWDJGKHBhcmFtKSk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZihHTF9SLHBuYW1lLFgyRihwYXJhbSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZihjb29yZCxwbmFtZSxYMkYocGFyYW0pKTsKK30KK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VueHZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKKyAgICBHTGZsb2F0IHRtcFBhcmFtc1sxXTsKKyAgICBHRVRfQ1RYKCkKKyAgICBTRVRfRVJST1JfSUYoIUdMRVNjbVZhbGlkYXRlOjp0ZXhHZW4oY29vcmQscG5hbWUpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgdG1wUGFyYW1zWzBdID0gWDJGKHBhcmFtc1swXSk7CisgICAgaWYgKGNvb3JkID09IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpIHsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhHZW5mdihHTF9TLHBuYW1lLHRtcFBhcmFtcyk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4R2VuZnYoR0xfVCxwbmFtZSx0bXBQYXJhbXMpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmZ2KEdMX1IscG5hbWUsdG1wUGFyYW1zKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleEdlbmZ2KGNvb3JkLHBuYW1lLHRtcFBhcmFtcyk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4R2VuZnZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBpZiAoY29vcmQgPT0gR0xfVEVYVFVSRV9HRU5fU1RSX09FUykKKyAgICB7CisgICAgICAgIEdMZmxvYXQgc3RhdGVfcyA9IEdMX0ZBTFNFOworICAgICAgICBHTGZsb2F0IHN0YXRlX3QgPSBHTF9GQUxTRTsKKyAgICAgICAgR0xmbG9hdCBzdGF0ZV9yID0gR0xfRkFMU0U7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuZnYoR0xfUyxwbmFtZSwmc3RhdGVfcyk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuZnYoR0xfVCxwbmFtZSwmc3RhdGVfdCk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuZnYoR0xfUixwbmFtZSwmc3RhdGVfcik7CisgICAgICAgICpwYXJhbXMgPSBzdGF0ZV9zICYmIHN0YXRlX3QgJiYgc3RhdGVfciA/IEdMX1RSVUU6IEdMX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuZnYoY29vcmQscG5hbWUscGFyYW1zKTsKKworfQorR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhHZW5pdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKKyAgICBHRVRfQ1RYKCkKKyAgICBpZiAoY29vcmQgPT0gR0xfVEVYVFVSRV9HRU5fU1RSX09FUykKKyAgICB7CisgICAgICAgIEdMaW50IHN0YXRlX3MgPSBHTF9GQUxTRTsKKyAgICAgICAgR0xpbnQgc3RhdGVfdCA9IEdMX0ZBTFNFOworICAgICAgICBHTGludCBzdGF0ZV9yID0gR0xfRkFMU0U7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuaXYoR0xfUyxwbmFtZSwmc3RhdGVfcyk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuaXYoR0xfVCxwbmFtZSwmc3RhdGVfdCk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuaXYoR0xfUixwbmFtZSwmc3RhdGVfcik7CisgICAgICAgICpwYXJhbXMgPSBzdGF0ZV9zICYmIHN0YXRlX3QgJiYgc3RhdGVfciA/IEdMX1RSVUU6IEdMX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuaXYoY29vcmQscG5hbWUscGFyYW1zKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhHZW54dk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgeworICAgIEdFVF9DVFgoKQorICAgIEdMZmxvYXQgdG1wUGFyYW1zWzFdOworCisgICAgaWYgKGNvb3JkID09IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpCisgICAgeworICAgICAgICBHTGZsb2F0IHN0YXRlX3MgPSBHTF9GQUxTRTsKKyAgICAgICAgR0xmbG9hdCBzdGF0ZV90ID0gR0xfRkFMU0U7CisgICAgICAgIEdMZmxvYXQgc3RhdGVfciA9IEdMX0ZBTFNFOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleEdlbmZ2KEdMX1RFWFRVUkVfR0VOX1MscG5hbWUsJnN0YXRlX3MpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleEdlbmZ2KEdMX1RFWFRVUkVfR0VOX1QscG5hbWUsJnN0YXRlX3QpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleEdlbmZ2KEdMX1RFWFRVUkVfR0VOX1IscG5hbWUsJnN0YXRlX3IpOworICAgICAgICB0bXBQYXJhbXNbMF0gPSBzdGF0ZV9zICYmIHN0YXRlX3QgJiYgc3RhdGVfciA/IEdMX1RSVUU6IEdMX0ZBTFNFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4R2VuZnYoY29vcmQscG5hbWUsdG1wUGFyYW1zKTsKKworICAgIHBhcmFtc1swXSA9IEYyWCh0bXBQYXJhbXNbMV0pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgR0xlbnVtIFR5cGVOYW1lPgordm9pZCBnbERyYXdUZXhPRVMgKFQgeCwgVCB5LCBUIHosIFQgd2lkdGgsIFQgaGVpZ2h0KSB7CisgICAgR0VUX0NUWCgpCisKKyAgICBTRVRfRVJST1JfSUYoKHdpZHRoPD0wIHx8IGhlaWdodDw9MCksR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICBjdHgtPmRyYXdWYWxpZGF0ZSgpOworCisgICAgaW50IG51bUNsaXBQbGFuZXM7CisKKyAgICBHTGludCB2aWV3cG9ydFs0XSA9IHt9OworICAgIHogPSAoej4xID8gMSA6ICh6PDAgPyAgMCA6IHopKTsKKworICAgIFQgdmVydGljZXNbNCozXSA9IHsKKyAgICAgICAgeCAsIHksIHosCisgICAgICAgIHggLCBzdGF0aWNfY2FzdDxUPih5K2hlaWdodCksIHosCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHgrd2lkdGgpLCBzdGF0aWNfY2FzdDxUPih5K2hlaWdodCksIHosCisgICAgICAgIHN0YXRpY19jYXN0PFQ+KHgrd2lkdGgpLCB5LCB6CisgICAgfTsKKyAgICBHTGZsb2F0IHRleGVsc1tjdHgtPmdldE1heFRleFVuaXRzKCldWzQqMl07CisgICAgbWVtc2V0KCh2b2lkKil0ZXhlbHMsIDAsIGN0eC0+Z2V0TWF4VGV4VW5pdHMoKSo0KjIqc2l6ZW9mKEdMZmxvYXQpKTsKKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUHVzaENsaWVudEF0dHJpYihHTF9DTElFTlRfVkVSVEVYX0FSUkFZX0JJVCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQdXNoQXR0cmliKEdMX1RSQU5TRk9STV9CSVQpOworCisgICAgLy9zZXR1cCBwcm9qZWN0aW9uIG1hdHJpeCB0byBkcmF3IGluIHZpZXdwb3J0IGFsaWduZWQgY29vcmRpbmF0ZXMKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQdXNoTWF0cml4KCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xMb2FkSWRlbnRpdHkoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULHZpZXdwb3J0KTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE9ydGhvKHZpZXdwb3J0WzBdLHZpZXdwb3J0WzBdICsgdmlld3BvcnRbMl0sdmlld3BvcnRbMV0sdmlld3BvcnRbMV0rdmlld3BvcnRbM10sMCwtMSk7CisgICAgLy9zZXR1cCB0ZXh0dXJlIG1hdHJpeAorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFB1c2hNYXRyaXgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbExvYWRJZGVudGl0eSgpOworICAgIC8vc2V0dXAgbW9kZWx2aWV3IG1hdHJpeAorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUHVzaE1hdHJpeCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTG9hZElkZW50aXR5KCk7CisgICAgLy9iYWNrdXAgdmJvJ3MKKyAgICBpbnQgYXJyYXlfYnVmZmVyLGVsZW1lbnRfYXJyYXlfYnVmZmVyOworICAgIGdsR2V0SW50ZWdlcnYoR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcsJmFycmF5X2J1ZmZlcik7CisgICAgZ2xHZXRJbnRlZ2VydihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HLCZlbGVtZW50X2FycmF5X2J1ZmZlcik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwwKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsMCk7CisKKyAgICAvL2Rpc2FibGUgY2xpcCBwbGFuZXMKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX01BWF9DTElQX1BMQU5FUywmbnVtQ2xpcFBsYW5lcyk7CisgICAgZm9yIChpbnQgaT0wO2k8bnVtQ2xpcFBsYW5lczsrK2kpCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCtpKTsKKworICAgIGludCBuVGV4UHRycyA9IDA7CisgICAgZm9yIChpbnQgaT0wO2k8Y3R4LT5nZXRNYXhUZXhVbml0cygpOysraSkgeworICAgICAgICBpZiAoY3R4LT5pc1RleHR1cmVVbml0RW5hYmxlZChHTF9URVhUVVJFMCtpKSkgeworICAgICAgICAgICAgVGV4dHVyZURhdGEgKiB0ZXhEYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB0ZXhuYW1lID0gY3R4LT5nZXRCaW5kZWRUZXh0dXJlKEdMX1RFWFRVUkUwK2ksR0xfVEVYVFVSRV8yRCk7CisgICAgICAgICAgICBPYmplY3RMb2NhbE5hbWUgdGV4ID0gVGV4dHVyZUxvY2FsTmFtZShHTF9URVhUVVJFXzJELHRleG5hbWUpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwK2kpOworICAgICAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4KTsKKyAgICAgICAgICAgIGlmIChvYmpEYXRhKSB7CisgICAgICAgICAgICAgICAgdGV4RGF0YSA9IChUZXh0dXJlRGF0YSopb2JqRGF0YTsKKyAgICAgICAgICAgICAgICAvL2NhbGN1bGF0ZSB0ZXhlbHMKKyAgICAgICAgICAgICAgICB0ZXhlbHNbaV1bMF0gPSAoZmxvYXQpKHRleERhdGEtPmNyb3BfcmVjdFswXSkvKGZsb2F0KSh0ZXhEYXRhLT53aWR0aCk7CisgICAgICAgICAgICAgICAgdGV4ZWxzW2ldWzFdID0gKGZsb2F0KSh0ZXhEYXRhLT5jcm9wX3JlY3RbMV0pLyhmbG9hdCkodGV4RGF0YS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHRleGVsc1tpXVsyXSA9IChmbG9hdCkodGV4RGF0YS0+Y3JvcF9yZWN0WzBdKS8oZmxvYXQpKHRleERhdGEtPndpZHRoKTsKKyAgICAgICAgICAgICAgICB0ZXhlbHNbaV1bM10gPSAoZmxvYXQpKHRleERhdGEtPmNyb3BfcmVjdFszXSt0ZXhEYXRhLT5jcm9wX3JlY3RbMV0pLyhmbG9hdCkodGV4RGF0YS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgICAgIHRleGVsc1tpXVs0XSA9IChmbG9hdCkodGV4RGF0YS0+Y3JvcF9yZWN0WzJdK3RleERhdGEtPmNyb3BfcmVjdFswXSkvKGZsb2F0KSh0ZXhEYXRhLT53aWR0aCk7CisgICAgICAgICAgICAgICAgdGV4ZWxzW2ldWzVdID0gKGZsb2F0KSh0ZXhEYXRhLT5jcm9wX3JlY3RbM10rdGV4RGF0YS0+Y3JvcF9yZWN0WzFdKS8oZmxvYXQpKHRleERhdGEtPmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICB0ZXhlbHNbaV1bNl0gPSAoZmxvYXQpKHRleERhdGEtPmNyb3BfcmVjdFsyXSt0ZXhEYXRhLT5jcm9wX3JlY3RbMF0pLyhmbG9hdCkodGV4RGF0YS0+d2lkdGgpOworICAgICAgICAgICAgICAgIHRleGVsc1tpXVs3XSA9IChmbG9hdCkodGV4RGF0YS0+Y3JvcF9yZWN0WzFdKS8oZmxvYXQpKHRleERhdGEtPmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleENvb3JkUG9pbnRlcigyLEdMX0ZMT0FULDAsdGV4ZWxzW2ldKTsKKyAgICAgICAgICAgICAgICBuVGV4UHRycysrOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuVGV4UHRycz4wKSB7CisgICAgICAgIC8vZHJhdyByZWN0YW5nbGUgLSBvbmx5IGlmIHdlIGhhdmUgc29tZSB0ZXh0dXJlcyBlbmFibGVkICYgcmVhZHkKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZlcnRleFBvaW50ZXIoMyxUeXBlTmFtZSwwLHZlcnRpY2VzKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwwLDQpOworICAgIH0KKworICAgIC8vcmVzdG9yZSB2Ym8ncworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsYXJyYXlfYnVmZmVyKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsZWxlbWVudF9hcnJheV9idWZmZXIpOworCisgICAgLy9yZXN0b3JlIG1hdHJpeCBzdGF0ZQorCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb3BNYXRyaXgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb3BNYXRyaXgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb3BNYXRyaXgoKTsKKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUG9wQXR0cmliKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb3BDbGllbnRBdHRyaWIoKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4c09FUyAoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpIHsKKyAgICBnbERyYXdUZXhPRVM8R0xzaG9ydCxHTF9TSE9SVD4oeCx5LHosd2lkdGgsaGVpZ2h0KTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aU9FUyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkgeworICAgIGdsRHJhd1RleE9FUzxHTGludCxHTF9JTlQ+KHgseSx6LHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGZPRVMgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KSB7CisgICAgZ2xEcmF3VGV4T0VTPEdMZmxvYXQsR0xfRkxPQVQ+KHgseSx6LHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KSB7CisgICAgZ2xEcmF3VGV4T0VTPEdMZmxvYXQsR0xfRkxPQVQ+KFgyRih4KSxYMkYoeSksWDJGKHopLFgyRih3aWR0aCksWDJGKGhlaWdodCkpOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhzdk9FUyAoY29uc3QgR0xzaG9ydCAqIGNvb3JkcykgeworICAgIGdsRHJhd1RleE9FUzxHTHNob3J0LEdMX1NIT1JUPihjb29yZHNbMF0sY29vcmRzWzFdLGNvb3Jkc1syXSxjb29yZHNbM10sY29vcmRzWzRdKTsKK30KKworR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4aXZPRVMgKGNvbnN0IEdMaW50ICogY29vcmRzKSB7CisgICAgZ2xEcmF3VGV4T0VTPEdMaW50LEdMX0lOVD4oY29vcmRzWzBdLGNvb3Jkc1sxXSxjb29yZHNbMl0sY29vcmRzWzNdLGNvb3Jkc1s0XSk7Cit9CisKK0dMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGZ2T0VTIChjb25zdCBHTGZsb2F0ICogY29vcmRzKSB7CisgICAgZ2xEcmF3VGV4T0VTPEdMZmxvYXQsR0xfRkxPQVQ+KGNvb3Jkc1swXSxjb29yZHNbMV0sY29vcmRzWzJdLGNvb3Jkc1szXSxjb29yZHNbNF0pOworfQorCitHTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXh4dk9FUyAoY29uc3QgR0xmaXhlZCAqIGNvb3JkcykgeworICAgIGdsRHJhd1RleE9FUzxHTGZsb2F0LEdMX0ZMT0FUPihYMkYoY29vcmRzWzBdKSxYMkYoY29vcmRzWzFdKSxYMkYoY29vcmRzWzJdKSxYMkYoY29vcmRzWzNdKSxYMkYoY29vcmRzWzRdKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21VdGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxYjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbVV0aWxzLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJHTEVTY21VdGlscy5oIgorCisKK3NpemVfdCBnbFBhcmFtU2l6ZShHTGVudW0gcGFyYW0pCit7CisgICAgc2l6ZV90IHMgPSAwOworCisgICAgc3dpdGNoKHBhcmFtKQorICAgIHsKKyAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NJWkU6CisgICAgLy9jYXNlIEdMX1RFWFRVUkVfR0VOX01PREVfT0VTOgorICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICBjYXNlIEdMX0ZPR19NT0RFOgorICAgIGNhc2UgR0xfRk9HX0RFTlNJVFk6CisgICAgY2FzZSBHTF9GT0dfU1RBUlQ6CisgICAgY2FzZSBHTF9GT0dfRU5EOgorICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKKyAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgIGNhc2UgR0xfU0hJTklORVNTOgorICAgIGNhc2UgR0xfTElHSFRfTU9ERUxfVFdPX1NJREU6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFOgorICAgIGNhc2UgR0xfUE9JTlRfU0laRV9NSU46CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX01BWDoKKyAgICBjYXNlIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkU6CisgICAgY2FzZSBHTF9DVUxMX0ZBQ0VfTU9ERToKKyAgICBjYXNlIEdMX0ZST05UX0ZBQ0U6CisgICAgY2FzZSBHTF9TSEFERV9NT0RFTDoKKyAgICBjYXNlIEdMX0RFUFRIX1dSSVRFTUFTSzoKKyAgICBjYXNlIEdMX0RFUFRIX0NMRUFSX1ZBTFVFOgorICAgIGNhc2UgR0xfU1RFTkNJTF9GQUlMOgorICAgIGNhc2UgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUw6CisgICAgY2FzZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUzoKKyAgICBjYXNlIEdMX1NURU5DSUxfUkVGOgorICAgIGNhc2UgR0xfU1RFTkNJTF9XUklURU1BU0s6CisgICAgY2FzZSBHTF9NQVRSSVhfTU9ERToKKyAgICBjYXNlIEdMX01PREVMVklFV19TVEFDS19ERVBUSDoKKyAgICBjYXNlIEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEg6CisgICAgY2FzZSBHTF9URVhUVVJFX1NUQUNLX0RFUFRIOgorICAgIGNhc2UgR0xfQUxQSEFfVEVTVF9GVU5DOgorICAgIGNhc2UgR0xfQUxQSEFfVEVTVF9SRUY6CisgICAgY2FzZSBHTF9CTEVORF9EU1Q6CisgICAgY2FzZSBHTF9CTEVORF9TUkM6CisgICAgY2FzZSBHTF9MT0dJQ19PUF9NT0RFOgorICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfVU5JVFM6CisgICAgICAgIHMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICBjYXNlIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRToKKyAgICBjYXNlIEdMX0RFUFRIX1JBTkdFOgorICAgIGNhc2UgR0xfTUFYX1ZJRVdQT1JUX0RJTVM6CisgICAgY2FzZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRToKKyAgICBjYXNlIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICBzPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOgorICAgIGNhc2UgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT046CisgICAgY2FzZSBHTF9DVVJSRU5UX05PUk1BTDoKKyAgICAgICAgcyA9ICAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFM6CisgICAgY2FzZSBHTF9DVVJSRU5UX0NPTE9SOgorICAgIGNhc2UgR0xfRk9HX0NPTE9SOgorICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICBjYXNlIEdMX0VNSVNTSU9OOgorICAgIGNhc2UgR0xfUE9TSVRJT046CisgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UOgorICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfQ09MT1I6CisgICAgY2FzZSBHTF9TQ0lTU09SX0JPWDoKKyAgICBjYXNlIEdMX1ZJRVdQT1JUOgorICAgIC8vY2FzZSBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVM6CisgICAgICAgIHMgPSAgNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NT0RFTFZJRVdfTUFUUklYOgorICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVg6CisgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWDoKKyAgICAgICAgcyA9IDE2OworICAgIGRlZmF1bHQ6CisgICAgICAgIHMgPSAxOyAvLyBhc3N1bWUgMQorICAgIH0KKyAgICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbVV0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWQ2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21VdGlscy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEdMRVNfVVRJTFNfSAorI2RlZmluZSBHTEVTX1VUSUxTX0gKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3NpemVfdCBnbFBhcmFtU2l6ZShHTGVudW0gcGFyYW0pOworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21WYWxpZGF0ZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21WYWxpZGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX0NNL0dMRVNjbVZhbGlkYXRlLmNwcApAQCAtMCwwICsxLDMwNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJHTEVTY21WYWxpZGF0ZS5oIgorI2luY2x1ZGUgPEdMY29tbW9uL0dMdXRpbHMuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNjb250ZXh0Lmg+CisjaW5jbHVkZSAiR0xFU2NtVmFsaWRhdGUuaCIKKworCitib29sIEdMRVNjbVZhbGlkYXRlOjpsaWdodEVudW0oR0xlbnVtIGUsdW5zaWduZWQgaW50IG1heExpZ2h0cykgeworICAgIHJldHVybiAgZSA+PUdMX0xJR0hUMCAmJiBlIDw9IChHTF9MSUdIVDArbWF4TGlnaHRzKTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6Y2xpcFBsYW5lRW51bShHTGVudW0gZSx1bnNpZ25lZCBpbnQgbWF4Q2xpcFBsYW5lcykgeworICAgIHJldHVybiAgZSA+PUdMX0NMSVBfUExBTkUwICYmIGUgPD0gKEdMX0NMSVBfUExBTkUwK21heENsaXBQbGFuZXMpOworfQorCitib29sIEdMRVNjbVZhbGlkYXRlOjphbHBoYUZ1bmMoR0xlbnVtIGYpIHsKKyAgICBzd2l0Y2goZikgeworICAgIGNhc2UgR0xfTkVWRVI6CisgICAgY2FzZSBHTF9MRVNTOgorICAgIGNhc2UgR0xfRVFVQUw6CisgICAgY2FzZSBHTF9MRVFVQUw6CisgICAgY2FzZSBHTF9HUkVBVEVSOgorICAgIGNhc2UgR0xfTk9URVFVQUw6CisgICAgY2FzZSBHTF9HRVFVQUw6CisgICAgY2FzZSBHTF9BTFdBWVM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OmJsZW5kU3JjKEdMZW51bSBzKSB7CisgICBzd2l0Y2gocykgeworICAgIGNhc2UgR0xfWkVSTzoKKyAgICBjYXNlIEdMX09ORToKKyAgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQ09MT1I6CisgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgIGNhc2UgR0xfRFNUX0FMUEhBOgorICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgICBjYXNlIEdMX1NSQ19BTFBIQV9TQVRVUkFURToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVNjbVZhbGlkYXRlOjp2ZXJ0ZXhQb2ludGVyUGFyYW1zKEdMaW50IHNpemUsR0xzaXplaSBzdHJpZGUpIHsKKyAgICByZXR1cm4gKChzaXplID49MikgJiYgKHNpemUgPD0gNCkpICYmIChzdHJpZGUgPj0wKSA7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OmNvbG9yUG9pbnRlclBhcmFtcyhHTGludCBzaXplLEdMc2l6ZWkgc3RyaWRlKSB7CisgICAgcmV0dXJuIChzaXplID09IDQpICYmIChzdHJpZGUgPj0wKSA7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnRleENvb3JkUG9pbnRlclBhcmFtcyhHTGludCBzaXplLEdMc2l6ZWkgc3RyaWRlKSB7CisgICAgcmV0dXJuICgoc2l6ZSA+PTIpICYmIChzaXplIDw9IDQpKSAmJiAoc3RyaWRlID49MCkgOworfQorCitib29sIEdMRVNjbVZhbGlkYXRlOjpzdXBwb3J0ZWRBcnJheXMoR0xlbnVtIGFycikgeworICAgIHN3aXRjaChhcnIpIHsKKyAgICBjYXNlIEdMX0NPTE9SX0FSUkFZOgorICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZOgorICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVNjbVZhbGlkYXRlOjpoaW50VGFyZ2V0TW9kZShHTGVudW0gdGFyZ2V0LEdMZW51bSBtb2RlKSB7CisgICBzd2l0Y2godGFyZ2V0KSB7CisgICBjYXNlIEdMX0ZPR19ISU5UOgorICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVDoKKyAgIGNhc2UgR0xfTElORV9TTU9PVEhfSElOVDoKKyAgIGNhc2UgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UOgorICAgY2FzZSBHTF9QT0lOVF9TTU9PVEhfSElOVDoKKyAgICAgICBicmVhazsKKyAgIGRlZmF1bHQ6IHJldHVybiBmYWxzZTsKKyAgIH0KKyAgIHN3aXRjaChtb2RlKSB7CisgICBjYXNlIEdMX0ZBU1RFU1Q6CisgICBjYXNlIEdMX05JQ0VTVDoKKyAgIGNhc2UgR0xfRE9OVF9DQVJFOgorICAgICAgIGJyZWFrOworICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgfQorICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnRleFBhcmFtcyhHTGVudW0gdGFyZ2V0LEdMZW51bSBwbmFtZSkgeworICAgIHN3aXRjaChwbmFtZSkgeworICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgorICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1M6CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfVDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUzoKKyAgICBjYXNlIEdMX0dFTkVSQVRFX01JUE1BUDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAodGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpfHwodGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTKTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6dGV4RW52KEdMZW51bSB0YXJnZXQsR0xlbnVtIHBuYW1lKSB7CisgICAgc3dpdGNoKHBuYW1lKSB7CisgICAgY2FzZSBHTF9URVhUVVJFX0VOVl9NT0RFOgorICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfQ09MT1I6CisgICAgY2FzZSBHTF9DT01CSU5FX1JHQjoKKyAgICBjYXNlIEdMX0NPTUJJTkVfQUxQSEE6CisgICAgY2FzZSBHTF9TUkMwX1JHQjoKKyAgICBjYXNlIEdMX1NSQzFfUkdCOgorICAgIGNhc2UgR0xfU1JDMl9SR0I6CisgICAgY2FzZSBHTF9TUkMwX0FMUEhBOgorICAgIGNhc2UgR0xfU1JDMV9BTFBIQToKKyAgICBjYXNlIEdMX1NSQzJfQUxQSEE6CisgICAgY2FzZSBHTF9PUEVSQU5EMF9SR0I6CisgICAgY2FzZSBHTF9PUEVSQU5EMV9SR0I6CisgICAgY2FzZSBHTF9PUEVSQU5EMl9SR0I6CisgICAgY2FzZSBHTF9PUEVSQU5EMF9BTFBIQToKKyAgICBjYXNlIEdMX09QRVJBTkQxX0FMUEhBOgorICAgIGNhc2UgR0xfT1BFUkFORDJfQUxQSEE6CisgICAgY2FzZSBHTF9SR0JfU0NBTEU6CisgICAgY2FzZSBHTF9BTFBIQV9TQ0FMRToKKyAgICBjYXNlIEdMX0NPT1JEX1JFUExBQ0VfT0VTOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAodGFyZ2V0ID09IEdMX1RFWFRVUkVfRU5WIHx8IHRhcmdldCA9PSBHTF9QT0lOVF9TUFJJVEVfT0VTKTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6Y2FwYWJpbGl0eShHTGVudW0gY2FwLGludCBtYXhMaWdodHMsaW50IG1heENsaXBQbGFuZXMpIHsKKyAgICBzd2l0Y2goY2FwKSB7CisgICAgY2FzZSBHTF9BTFBIQV9URVNUOgorICAgIGNhc2UgR0xfQkxFTkQ6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWToKKyAgICBjYXNlIEdMX0NPTE9SX0xPR0lDX09QOgorICAgIGNhc2UgR0xfQ09MT1JfTUFURVJJQUw6CisgICAgY2FzZSBHTF9DVUxMX0ZBQ0U6CisgICAgY2FzZSBHTF9ERVBUSF9URVNUOgorICAgIGNhc2UgR0xfRElUSEVSOgorICAgIGNhc2UgR0xfRk9HOgorICAgIGNhc2UgR0xfTElHSFRJTkc6CisgICAgY2FzZSBHTF9MSU5FX1NNT09USDoKKyAgICBjYXNlIEdMX01VTFRJU0FNUExFOgorICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZOgorICAgIGNhc2UgR0xfTk9STUFMSVpFOgorICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVM6CisgICAgY2FzZSBHTF9QT0lOVF9TTU9PVEg6CisgICAgY2FzZSBHTF9QT0lOVF9TUFJJVEVfT0VTOgorICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKKyAgICBjYXNlIEdMX1JFU0NBTEVfTk9STUFMOgorICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOgorICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX09ORToKKyAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRToKKyAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDoKKyAgICBjYXNlIEdMX1NURU5DSUxfVEVTVDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIEdMRVNjbVZhbGlkYXRlOjpsaWdodEVudW0oY2FwLG1heExpZ2h0cykgfHwgR0xFU2NtVmFsaWRhdGU6OmNsaXBQbGFuZUVudW0oY2FwLG1heENsaXBQbGFuZXMpOworfQorCisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnRleENvbXBJbWdGcm10KEdMZW51bSBmb3JtYXQpIHsKKyAgICBzd2l0Y2goZm9ybWF0KSB7CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6YmxlbmREc3QoR0xlbnVtIGQpIHsKKyAgIHN3aXRjaChkKSB7CisgICAgY2FzZSBHTF9aRVJPOgorICAgIGNhc2UgR0xfT05FOgorICAgIGNhc2UgR0xfU1JDX0NPTE9SOgorICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICBjYXNlIEdMX1NSQ19BTFBIQToKKyAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgY2FzZSBHTF9EU1RfQUxQSEE6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKyAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6cmVuZGVyYnVmZmVySW50ZXJuYWxGcm10KEdMRVNjb250ZXh0KiBjdHgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVM6CisgICAgY2FzZSBHTF9SR0JBNF9PRVM6CisgICAgY2FzZSBHTF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1JHQjU2NV9PRVM6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYMV9PRVM6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYNF9PRVM6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0lOREVYOF9PRVM6CisgICAgY2FzZSBHTF9SR0I4X09FUzoKKyAgICBjYXNlIEdMX1JHQkE4X09FUzoKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUzoKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChjdHgtPmdldENhcHMoKS0+R0xfRVhUX1BBQ0tFRF9ERVBUSF9TVEVOQ0lMICYmIGludGVybmFsZm9ybWF0PT1HTF9ERVBUSDI0X1NURU5DSUw4X09FUykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnN0ZW5jaWxPcChHTGVudW0gcGFyYW0pIHsKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9LRUVQOgorICAgIGNhc2UgR0xfWkVSTzoKKyAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgY2FzZSBHTF9JTkNSOgorICAgIGNhc2UgR0xfREVDUjoKKyAgICBjYXNlIEdMX0lOVkVSVDoKKyAgICBjYXNlIEdMX0lOQ1JfV1JBUF9PRVM6CisgICAgY2FzZSBHTF9ERUNSX1dSQVBfT0VTOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6dGV4R2VuKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lKSB7CisgICAgcmV0dXJuIChjb29yZCA9PSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTICYmIHBuYW1lID09IEdMX1RFWFRVUkVfR0VOX01PREVfT0VTKTsKK30KKworYm9vbCBHTEVTY21WYWxpZGF0ZTo6Y29sb3JQb2ludGVyVHlwZShHTGVudW0gdHlwZSl7CisgICAgc3dpdGNoKHR5cGUpeworICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6Om5vcm1hbFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKXsKKworICAgIHN3aXRjaCh0eXBlKXsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnBvaW50UG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpeworICAgIHJldHVybiB0eXBlID09IEdMX0ZJWEVEIHx8IHR5cGUgPT0gR0xfRkxPQVQ7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnRleENvb3JkUG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpeworICAgIHN3aXRjaCh0eXBlKXsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NtVmFsaWRhdGU6OnZlcnRleFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKXsKKyAgICBzd2l0Y2godHlwZSl7CisgICAgY2FzZSBHTF9CWVRFOgorICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19DTS9HTEVTY21WYWxpZGF0ZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00vR0xFU2NtVmFsaWRhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMzMzkzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfQ00vR0xFU2NtVmFsaWRhdGUuaApAQCAtMCwwICsxLDUwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBHTEVTX0NNX1ZBTElEQVRFX0gKKyNkZWZpbmUgR0xFU19DTV9WQUxJREFURV9ICisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xjb21tb24vR0xFU3ZhbGlkYXRlLmg+CitzdHJ1Y3QgR0xFU2NtVmFsaWRhdGUgOiBwdWJsaWMgR0xFU3ZhbGlkYXRlCit7CitzdGF0aWMgYm9vbCBibGVuZFNyYyhHTGVudW0gcyk7CitzdGF0aWMgYm9vbCBibGVuZERzdChHTGVudW0gZCk7CitzdGF0aWMgYm9vbCBsaWdodEVudW0oR0xlbnVtIGUsdW5zaWduZWQgaW50IG1heExJZ2h0cyk7CitzdGF0aWMgYm9vbCBjbGlwUGxhbmVFbnVtKEdMZW51bSBlLHVuc2lnbmVkIGludCBtYXhDbGlwUGxhbmVzKTsKK3N0YXRpYyBib29sIGFscGhhRnVuYyhHTGVudW0gZik7CitzdGF0aWMgYm9vbCB2ZXJ0ZXhQb2ludGVyUGFyYW1zKEdMaW50IHNpemUsR0xzaXplaSBzdHJpZGUpOworc3RhdGljIGJvb2wgY29sb3JQb2ludGVyUGFyYW1zKEdMaW50IHNpemUsR0xzaXplaSBzdHJpZGUpOworc3RhdGljIGJvb2wgc3VwcG9ydGVkQXJyYXlzKEdMZW51bSBhcnIpOworc3RhdGljIGJvb2wgaGludFRhcmdldE1vZGUoR0xlbnVtIHRhcmdldCxHTGVudW0gbW9kZSk7CitzdGF0aWMgYm9vbCBjYXBhYmlsaXR5KEdMZW51bSBjYXAsaW50IG1heExpZ2h0cyxpbnQgbWF4Q2xpcFBsYW5lcyk7CitzdGF0aWMgYm9vbCB0ZXhQYXJhbXMoR0xlbnVtIHRhcmdldCxHTGVudW0gcG5hbWUpOworc3RhdGljIGJvb2wgdGV4Q29vcmRQb2ludGVyUGFyYW1zKEdMaW50IHNpemUsR0xzaXplaSBzdHJpZGUpOworCitzdGF0aWMgYm9vbCB0ZXhFbnYoR0xlbnVtIHRhcmdldCxHTGVudW0gcG5hbWUpOworc3RhdGljIGJvb2wgdGV4Q29tcEltZ0ZybXQoR0xlbnVtIGZvcm1hdCk7CisKK3N0YXRpYyBib29sIHJlbmRlcmJ1ZmZlckludGVybmFsRnJtdChHTEVTY29udGV4dCAqIGN0eCwgR0xlbnVtIGludGVybmFsZm9ybWF0KTsKK3N0YXRpYyBib29sIHN0ZW5jaWxPcChHTGVudW0gcGFyYW0pOworc3RhdGljIGJvb2wgdGV4R2VuKEdMZW51bSBjb29yZCxHTGVudW0gcG5hbWUpOworCitzdGF0aWMgYm9vbCBjb2xvclBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKK3N0YXRpYyBib29sIG5vcm1hbFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKK3N0YXRpYyBib29sIHBvaW50UG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpOworc3RhdGljIGJvb2wgdGV4Q29vcmRQb2ludGVyVHlwZShHTGVudW0gdHlwZSk7CitzdGF0aWMgYm9vbCB2ZXJ0ZXhQb2ludGVyVHlwZShHTGVudW0gdHlwZSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FOR0xFU2hhZGVyUGFyc2VyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FOR0xFU2hhZGVyUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgyNzdkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvQU5HTEVTaGFkZXJQYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgIkFOR0xFU2hhZGVyUGFyc2VyLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPEdMU0xBTkcvU2hhZGVyTGFuZy5oPgorCituYW1lc3BhY2UgQU5HTEVTaGFkZXJQYXJzZXIgeworCitTaEJ1aWx0SW5SZXNvdXJjZXMga1Jlc291cmNlczsKK2Jvb2wga0luaXRpYWxpemVkID0gZmFsc2U7CisKK1NoSGFuZGxlIGtWZXJ0Q29tcGlsZXIgPSBudWxscHRyOworU2hIYW5kbGUga0ZyYWdDb21waWxlciA9IG51bGxwdHI7CisKK2FuZHJvaWQ6OmJhc2U6OkxvY2sga0NvbXBpbGVyTG9jazsKKwordm9pZCBpbml0aWFsaXplUmVzb3VyY2VzKCkgeworICAgIFNoSW5pdEJ1aWx0SW5SZXNvdXJjZXMoJmtSZXNvdXJjZXMpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgc2V0IHRvIHBhc3M6CisgICAgLy8gZEVRUC1HTEVTMi5mdW5jdGlvbmFsLnNoYWRlcnMuYnVpbHRpbl92YXJpYWJsZS4qCisgICAgLy8gT24gYSBMaW51eCBtYWNoaW5lIHdpdGggYW4gTnZpZGlhIFF1YWRybyBLMjIwMAorICAgIGtSZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyA9IDE2OyAvLyBEZWZhdWx0ZWQgdG8gOAorICAgIGtSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAxMDI0OyAvLyBEZWZhdWx0ZWQgdG8gMTI4CisgICAga1Jlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDMxOyAvLyBEZWZhdWx0ZWQgdG8gOAorICAgIGtSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAzMjsgLy8gRGVmYXVsdGVkIHRvIDAKKyAgICBrUmVzb3VyY2VzLk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSAzMjsgLy8gRGVmYXVsdGVkIHRvIDgKKyAgICBrUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzID0gMzI7IC8vIERlZmF1bHRlZCB0byA4CisgICAga1Jlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMTAyNDsgLy8gRGVmYXVsdGVkIHRvIDE2CisKKyAgICBrUmVzb3VyY2VzLk1heERyYXdCdWZmZXJzID0gMTsKKyAgICBrUmVzb3VyY2VzLk1heER1YWxTb3VyY2VEcmF3QnVmZmVycyA9IDE7CisKKyAgICBrUmVzb3VyY2VzLk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA9IDA7CisgICAga1Jlc291cmNlcy5PRVNfRUdMX2ltYWdlX2V4dGVybmFsID0gMDsKKworICAgIGtSZXNvdXJjZXMuRnJhZ21lbnRQcmVjaXNpb25IaWdoID0gMTsKK30KKworU2hIYW5kbGUgY3JlYXRlU2hhZGVyQ29tcGlsZXIoR0xlbnVtIHNoYWRlclR5cGUpIHsKKyAgICBTaEhhbmRsZSBoYW5kbGUgPSBTaENvbnN0cnVjdENvbXBpbGVyKHNoYWRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSF9HTEVTMl9TUEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hfR0xTTF9DT01QQVRJQklMSVRZX09VVFBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrUmVzb3VyY2VzKTsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitib29sIGdsb2JhbEluaXRpYWxpemUoKSB7CisgICAgaWYgKCFTaEluaXRpYWxpemUoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdsb2JhbCBBTkdMRSBzaGFkZXIgY29tcGlsZXIgaW5pdGlhbHphdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbml0aWFsaXplUmVzb3VyY2VzKCk7CisKKyAgICBrVmVydENvbXBpbGVyID0gY3JlYXRlU2hhZGVyQ29tcGlsZXIoR0xfVkVSVEVYX1NIQURFUik7CisgICAgaWYgKCFrVmVydENvbXBpbGVyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgQU5HTEUgdmVydGV4IHNoYWRlciBjb21waWxlci5cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGtGcmFnQ29tcGlsZXIgPSBjcmVhdGVTaGFkZXJDb21waWxlcihHTF9GUkFHTUVOVF9TSEFERVIpOworICAgIGlmICgha0ZyYWdDb21waWxlcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0aWFsaXplIEFOR0xFIGZyYWdtZW50IHNoYWRlciBjb21waWxlci5cbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAga0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCB0cmFuc2xhdGUoY29uc3QgY2hhciogc3JjLCBHTGVudW0gc2hhZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dEluZm9sb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRPYmpDb2RlKSB7CisgICAgaWYgKCFrSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEFOR0xFIG1heSBjcmFzaCBpZiBtdWx0aXBsZSBSZW5kZXJUaHJlYWRzIGF0dGVtcHQgdG8gY29tcGlsZSBzaGFkZXJzCisgICAgLy8gYXQgdGhlIHNhbWUgdGltZS4KKyAgICBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jayBhdXRvbG9jayhrQ29tcGlsZXJMb2NrKTsKKworICAgIFNoSGFuZGxlIGNvbXBpbGVySGFuZGxlID0gKHNoYWRlclR5cGUgPT0gR0xfVkVSVEVYX1NIQURFUiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWZXJ0Q29tcGlsZXIgOiBrRnJhZ0NvbXBpbGVyKTsKKyAgICBpZiAoIWNvbXBpbGVySGFuZGxlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXNzIGluIHRoZSBlbnRpcmUgc3JjIGFzIDEgc3RyaW5nLCBhc2sgZm9yIGNvbXBpbGVkIEdMU0wgb2JqZWN0IGNvZGUKKyAgICAvLyB0byBiZSBzYXZlZC4KKyAgICBpbnQgcmVzID0gU2hDb21waWxlKGNvbXBpbGVySGFuZGxlLCAmc3JjLCAxLCBTSF9PQkpFQ1RfQ09ERSk7CisKKyAgICAvLyBUaGUgY29tcGlsZXJzIHJldHVybiByZWZlcmVuY2VzIHRoYXQgbWF5IG5vdCBiZSB2YWxpZCBpbiB0aGUgZnV0dXJlLAorICAgIC8vIGFuZCB3ZSBtYW51YWxseSBjbGVhciB0aGVtIGltbWVkaWF0ZWx5IGFueXdheS4KKyAgICAqb3V0SW5mb2xvZyA9IHN0ZDo6c3RyaW5nKFNoR2V0SW5mb0xvZyhjb21waWxlckhhbmRsZSkpOworICAgICpvdXRPYmpDb2RlID0gc3RkOjpzdHJpbmcoU2hHZXRPYmplY3RDb2RlKGNvbXBpbGVySGFuZGxlKSk7CisgICAgU2hDbGVhclJlc3VsdHMoY29tcGlsZXJIYW5kbGUpOworCisgICAgcmV0dXJuIHJlczsKK30KKworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvQU5HTEVTaGFkZXJQYXJzZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FOR0xFU2hhZGVyUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkOWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FOR0xFU2hhZGVyUGFyc2VyLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK25hbWVzcGFjZSBBTkdMRVNoYWRlclBhcnNlciB7CisgICAgYm9vbCBnbG9iYWxJbml0aWFsaXplKCk7CisgICAgYm9vbCB0cmFuc2xhdGUoY29uc3QgY2hhciogc3JjLCBHTGVudW0gc2hhZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0SW5mb2xvZywgc3RkOjpzdHJpbmcqIG91dE9iakNvZGUpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjMGU4MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitob3N0X2NvbW1vbl9TUkNfRklMRVMgOj0gXAorICAgICBHTEVTdjJJbXAuY3BwICAgICAgIFwKKyAgICAgR0xFU3YyQ29udGV4dC5jcHAgICBcCisgICAgIEdMRVN2MlZhbGlkYXRlLmNwcCAgXAorICAgICBTaGFkZXJQYXJzZXIuY3BwICAgIFwKKyAgICAgU2hhZGVyVmFsaWRhdG9yLmNwcCBcCisgICAgIFByb2dyYW1EYXRhLmNwcAorCisjIEFOR0xFIHNoYWRlciB0cmFuc2xhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgeWV0LgoraG9zdF9jb21tb25fU1JDX0ZJTEVTICs9IEFOR0xFU2hhZGVyUGFyc2VyLmNwcAorCisjIyMgR0xFU19WMiBob3N0IGltcGxlbWVudGF0aW9uIChPbiB0b3Agb2YgT3BlbkdMKSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyQoY2FsbCBlbXVnbC1iZWdpbi1zaGFyZWQtbGlicmFyeSxsaWIkKEJVSUxEX1RBUkdFVF9TVUZGSVgpR0xFU19WMl90cmFuc2xhdG9yKQorJChjYWxsIGVtdWdsLWltcG9ydCwgbGliR0xjb21tb24pCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhvc3RfY29tbW9uX1NSQ19GSUxFUykKKworIyBBTkdMRSBzaGFkZXIgdHJhbnNsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzIHlldC4KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChBTkdMRV9UUkFOU0xBVElPTl9JTkNMVURFUykKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gJChBTkdMRV9UUkFOU0xBVElPTl9TVEFUSUNfTElCUkFSSUVTKQorCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkNvbnRleHQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvR0xFU3YyQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZjZiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkNvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTc4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiR0xFU3YyQ29udGV4dC5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3ZvaWQgR0xFU3YyQ29udGV4dDo6aW5pdChHbExpYnJhcnkqIGdsTGliKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChzX2xvY2spOworICAgIGlmKCFtX2luaXRpYWxpemVkKSB7CisgICAgICAgIHNfZ2xEaXNwYXRjaC5kaXNwYXRjaEZ1bmNzKEdMRVNfMl8wLCBnbExpYik7CisgICAgICAgIEdMRVNjb250ZXh0Ojppbml0KGdsTGliKTsKKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBzX2dsU3VwcG9ydC5tYXhWZXJ0ZXhBdHRyaWJzO2krKyl7CisgICAgICAgICAgICBtX21hcFtpXSA9IG5ldyBHTEVTcG9pbnRlcigpOworICAgICAgICB9CisgICAgICAgIHNldEF0dHJpYnV0ZTB2YWx1ZSgwLjAsIDAuMCwgMC4wLCAxLjApOworCisgICAgICAgIGJ1aWxkU3RyaW5ncygoY29uc3QgY2hhciopZGlzcGF0Y2hlcigpLmdsR2V0U3RyaW5nKEdMX1ZFTkRPUiksCisgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZGlzcGF0Y2hlcigpLmdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSwKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkaXNwYXRjaGVyKCkuZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAiT3BlbkdMIEVTIDIuMCIpOworICAgIH0KKyAgICBtX2luaXRpYWxpemVkID0gdHJ1ZTsKK30KKworR0xFU3YyQ29udGV4dDo6fkdMRVN2MkNvbnRleHQoKQoreworICAgIGRlbGV0ZVtdIG1fYXR0MEFycmF5OworfQorCit2b2lkIEdMRVN2MkNvbnRleHQ6OnNldEF0dHJpYnV0ZTB2YWx1ZShmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6LCBmbG9hdCB3KQoreworICAgIG1fYXR0cmlidXRlMHZhbHVlQ2hhbmdlZCB8PQorICAgICAgICAgICAgeCAhPSBtX2F0dHJpYnV0ZTB2YWx1ZVswXSB8fCB5ICE9IG1fYXR0cmlidXRlMHZhbHVlWzFdIHx8CisgICAgICAgICAgICB6ICE9IG1fYXR0cmlidXRlMHZhbHVlWzJdIHx8IHcgIT0gbV9hdHRyaWJ1dGUwdmFsdWVbM107CisgICAgbV9hdHRyaWJ1dGUwdmFsdWVbMF0gPSB4OworICAgIG1fYXR0cmlidXRlMHZhbHVlWzFdID0geTsKKyAgICBtX2F0dHJpYnV0ZTB2YWx1ZVsyXSA9IHo7CisgICAgbV9hdHRyaWJ1dGUwdmFsdWVbM10gPSB3OworfQorCitib29sIEdMRVN2MkNvbnRleHQ6Om5lZWRBdHQwUHJlRHJhd1ZhbGlkYXRpb24oKQoreworICAgIG1fYXR0ME5lZWRzRGlzYWJsZSA9IGZhbHNlOworCisgICAgaW50IGVuYWJsZWQgPSAwOworICAgIHNfZ2xEaXNwYXRjaC5nbEdldFZlcnRleEF0dHJpYml2KDAsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCwgJmVuYWJsZWQpOworICAgIHJldHVybiBlbmFibGVkID09IDA7Cit9CisKK3ZvaWQgR0xFU3YyQ29udGV4dDo6dmFsaWRhdGVBdHQwUHJlRHJhdyh1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjb3VudCA+IG1fYXR0MEFycmF5TGVuZ3RoKSB7CisgICAgICAgIGRlbGV0ZSBbXSBtX2F0dDBBcnJheTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbmV3TGVuID0gc3RkOjptYXgoY291bnQsIDIgKiBtX2F0dDBBcnJheUxlbmd0aCk7CisgICAgICAgIG1fYXR0MEFycmF5ID0gbmV3IEdMZmxvYXRbNCAqIG5ld0xlbl07CisgICAgICAgIG1fYXR0MEFycmF5TGVuZ3RoID0gbmV3TGVuOworICAgICAgICBtX2F0dHJpYnV0ZTB2YWx1ZUNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobV9hdHRyaWJ1dGUwdmFsdWVDaGFuZ2VkKSB7CisgICAgICAgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGk8bV9hdHQwQXJyYXlMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgbWVtY3B5KG1fYXR0MEFycmF5K2kqNCwgbV9hdHRyaWJ1dGUwdmFsdWUsIHNpemVvZihtX2F0dHJpYnV0ZTB2YWx1ZSkpOworICAgICAgICB9CisgICAgICAgIG1fYXR0cmlidXRlMHZhbHVlQ2hhbmdlZCA9IGZhbHNlOworICAgIH0KKworICAgIHNfZ2xEaXNwYXRjaC5nbFZlcnRleEF0dHJpYlBvaW50ZXIoMCwgNCwgR0xfRkxPQVQsIEdMX0ZBTFNFLCAwLCBtX2F0dDBBcnJheSk7CisgICAgc19nbERpc3BhdGNoLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7CisKKyAgICBtX2F0dDBOZWVkc0Rpc2FibGUgPSB0cnVlOworfQorCit2b2lkIEdMRVN2MkNvbnRleHQ6OnZhbGlkYXRlQXR0MFBvc3REcmF3KHZvaWQpCit7CisgICAgaWYgKG1fYXR0ME5lZWRzRGlzYWJsZSkgeworICAgICAgICBzX2dsRGlzcGF0Y2guZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoMCk7CisgICAgICAgIG1fYXR0ME5lZWRzRGlzYWJsZSA9IGZhbHNlOworICAgIH0KK30KKwordm9pZCBHTEVTdjJDb250ZXh0OjpzZXR1cEFycmF5c1BvaW50ZXJzKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBjQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCkgeworICAgIEFycmF5c01hcDo6aXRlcmF0b3IgaXQ7CisKKyAgICAvL2dvaW5nIG92ZXIgYWxsIGNsaWVudHMgYXJyYXlzIFBvaW50ZXJzCisgICAgZm9yICggaXQ9bV9tYXAuYmVnaW4oKSA7IGl0ICE9IG1fbWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEdMZW51bSBhcnJheV9pZCAgID0gKCppdCkuZmlyc3Q7CisgICAgICAgIEdMRVNwb2ludGVyKiBwID0gKCppdCkuc2Vjb25kOworICAgICAgICBpZighcC0+aXNFbmFibGUoKSkgY29udGludWU7CisKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBwLT5nZXRTaXplKCk7CisKKyAgICAgICAgaWYobmVlZENvbnZlcnQoY0FycnMsZmlyc3QsY291bnQsdHlwZSxpbmRpY2VzLGRpcmVjdCxwLGFycmF5X2lkKSl7CisgICAgICAgICAgICAvL2NvbnZlcnNpb24gaGFzIG9jY3VyZWQKKyAgICAgICAgICAgIEFycmF5RGF0YSBjdXJyZW50QXJyID0gY0FycnMuZ2V0Q3VycmVudEFycmF5KCk7CisgICAgICAgICAgICBzZXR1cEFycihjdXJyZW50QXJyLmRhdGEsYXJyYXlfaWQsY3VycmVudEFyci50eXBlLHNpemUsY3VycmVudEFyci5zdHJpZGUsIHAtPmdldE5vcm1hbGl6ZWQoKSk7CisgICAgICAgICAgICArK2NBcnJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0dXBBcnIocC0+Z2V0RGF0YSgpLGFycmF5X2lkLHAtPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemUscC0+Z2V0U3RyaWRlKCksIHAtPmdldE5vcm1hbGl6ZWQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vc2V0dGluZyBjbGllbnQgc2lkZSBhcnIKK3ZvaWQgR0xFU3YyQ29udGV4dDo6c2V0dXBBcnIoY29uc3QgR0x2b2lkKiBhcnIsR0xlbnVtIGFycmF5VHlwZSxHTGVudW0gZGF0YVR5cGUsR0xpbnQgc2l6ZSxHTHNpemVpIHN0cmlkZSxHTGJvb2xlYW4gbm9ybWFsaXplZCwgaW50IGluZGV4KXsKKyAgICAgaWYoYXJyID09IE5VTEwpIHJldHVybjsKKyAgICAgc19nbERpc3BhdGNoLmdsVmVydGV4QXR0cmliUG9pbnRlcihhcnJheVR5cGUsc2l6ZSxkYXRhVHlwZSxub3JtYWxpemVkLHN0cmlkZSxhcnIpOworfQorCitib29sIEdMRVN2MkNvbnRleHQ6Om5lZWRDb252ZXJ0KEdMRVNDb252ZXJzaW9uQXJyYXlzJiBjQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCxHTEVTcG9pbnRlciogcCxHTGVudW0gYXJyYXlfaWQpIHsKKworICAgIGJvb2wgdXNpbmdWQk8gPSBwLT5pc1ZCTygpOworICAgIEdMZW51bSBhcnJUeXBlID0gcC0+Z2V0VHlwZSgpOworICAgIC8qCisgICAgIGNvbnZlcnNpb24gaXMgbm90IG5lY2Vzc2FyeSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgorICAgICAgKCopIGFycmF5IHR5cGUgaXMgbm90IGZpeGVkCisgICAgKi8KKyAgICBpZihhcnJUeXBlICE9IEdMX0ZJWEVEKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZighdXNpbmdWQk8pIHsKKyAgICAgICAgaWYgKGRpcmVjdCkgeworICAgICAgICAgICAgY29udmVydERpcmVjdChjQXJycyxmaXJzdCxjb3VudCxhcnJheV9pZCxwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRJbmRpcmVjdChjQXJycyxjb3VudCx0eXBlLGluZGljZXMsYXJyYXlfaWQscCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGlyZWN0KSB7CisgICAgICAgICAgICBjb252ZXJ0RGlyZWN0VkJPKGNBcnJzLGZpcnN0LGNvdW50LGFycmF5X2lkLHApIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRJbmRpcmVjdFZCTyhjQXJycyxjb3VudCx0eXBlLGluZGljZXMsYXJyYXlfaWQscCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR0xFU3YyQ29udGV4dDo6aW5pdEV4dGVuc2lvblN0cmluZygpIHsKKyAgICAqc19nbEV4dGVuc2lvbnMgPSAiR0xfT0VTX0VHTF9pbWFnZSBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIEdMX09FU19kZXB0aDI0IEdMX09FU19kZXB0aDMyIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQgIgorICAgICAgICAgICAgICAgICAgICAgICJHTF9PRVNfdGV4dHVyZV9mbG9hdCBHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIgIgorICAgICAgICAgICAgICAgICAgICAgICJHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlIEdMX09FU19kZXB0aF90ZXh0dXJlICI7CisgICAgaWYgKHNfZ2xTdXBwb3J0LkdMX0FSQl9IQUxGX0ZMT0FUX1BJWEVMIHx8IHNfZ2xTdXBwb3J0LkdMX05WX0hBTEZfRkxPQVQpCisgICAgICAgICpzX2dsRXh0ZW5zaW9ucys9IkdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIgIjsKKyAgICBpZiAoc19nbFN1cHBvcnQuR0xfRVhUX1BBQ0tFRF9ERVBUSF9TVEVOQ0lMKQorICAgICAgICAqc19nbEV4dGVuc2lvbnMrPSJHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgIjsKKyAgICBpZiAoc19nbFN1cHBvcnQuR0xfQVJCX0hBTEZfRkxPQVRfVkVSVEVYKQorICAgICAgICAqc19nbEV4dGVuc2lvbnMrPSJHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgIjsKKyAgICBpZiAoc19nbFN1cHBvcnQuR0xfT0VTX1NUQU5EQVJEX0RFUklWQVRJVkVTKQorICAgICAgICAqc19nbEV4dGVuc2lvbnMrPSJHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgIjsKKyAgICBpZiAoc19nbFN1cHBvcnQuR0xfT0VTX1RFWFRVUkVfTlBPVCkKKyAgICAgICAgKnNfZ2xFeHRlbnNpb25zKz0iR0xfT0VTX3RleHR1cmVfbnBvdCAiOworICAgIGlmIChzX2dsU3VwcG9ydC5HTF9PRVNfUkdCOF9SR0JBOCkgeworICAgICAgICAqc19nbEV4dGVuc2lvbnMrPSJHTF9PRVNfcmdiOF9yZ2JhOCAiOworICAgIH0KK30KKworaW50IEdMRVN2MkNvbnRleHQ6OmdldE1heFRleFVuaXRzKCkgeworICAgIHJldHVybiBnZXRDYXBzKCktPm1heFRleEltYWdlVW5pdHM7Cit9CisKK2ludCBHTEVTdjJDb250ZXh0OjpnZXRNYXhDb21iaW5lZFRleFVuaXRzKCkgeworICAgIHJldHVybiBnZXRDYXBzKCktPm1heENvbWJpbmVkVGV4SW1hZ2VVbml0czsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkNvbnRleHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY5NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvR0xFU3YyQ29udGV4dC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBHTEVTX1YyX0NPTlRFWFRfSAorI2RlZmluZSBHTEVTX1YyX0NPTlRFWFRfSAorCisjaW5jbHVkZSA8R0xjb21tb24vR0xEaXNwYXRjaC5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNjb250ZXh0Lmg+CisjaW5jbHVkZSA8R0xjb21tb24vb2JqZWN0TmFtZU1hbmFnZXIuaD4KKworY2xhc3MgR0xFU3YyQ29udGV4dCA6IHB1YmxpYyBHTEVTY29udGV4dHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdChHbExpYnJhcnkqIGdsTGliKTsKKyAgICB2aXJ0dWFsIH5HTEVTdjJDb250ZXh0KCk7CisgICAgdm9pZCBzZXR1cEFycmF5c1BvaW50ZXJzKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBmQXJycyxHTGludCBmaXJzdCxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxib29sIGRpcmVjdCk7CisgICAgaW50ICBnZXRNYXhDb21iaW5lZFRleFVuaXRzKCkgb3ZlcnJpZGU7CisgICAgaW50ICBnZXRNYXhUZXhVbml0cygpIG92ZXJyaWRlOworCisgICAgLy8gVGhpcyB3aG9sZSBhdHQwIHRoaW5nIGlzIGFib3V0IGEgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gR0xFUyBhbmQgT3BlbkdMLgorICAgIC8vIEdMRVMgYWxsb3dzIGEgdmVydGV4IHNoYWRlciBhdHRyaWJ1dGUgdG8gYmUgaW4gbG9jYXRpb24gMCBhbmQgaGF2ZSBhCisgICAgLy8gY3VycmVudCB2YWx1ZSwgd2hpbGUgT3BlbkdMIGlzIG5vdCB2ZXJ5IGNsZWFyIGFib3V0IHRoaXMsIHdoaWNoIHJlc3VsdHMKKyAgICAvLyBpbiBlYWNoIGltcGxlbWVudGF0aW9uIGRvaW5nIHNvbWV0aGluZyBkaWZmZXJlbnQuCisgICAgdm9pZCBzZXRBdHRyaWJ1dGUwdmFsdWUoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdyk7CisgICAgYm9vbCBuZWVkQXR0MFByZURyYXdWYWxpZGF0aW9uKCk7CisgICAgdm9pZCB2YWxpZGF0ZUF0dDBQcmVEcmF3KHVuc2lnbmVkIGludCBjb3VudCk7CisgICAgdm9pZCB2YWxpZGF0ZUF0dDBQb3N0RHJhdyh2b2lkKTsKKyAgICBjb25zdCBmbG9hdCogZ2V0QXR0MCh2b2lkKSBjb25zdCB7cmV0dXJuIG1fYXR0cmlidXRlMHZhbHVlO30KKworcHJvdGVjdGVkOgorICAgIGJvb2wgbmVlZENvbnZlcnQoR0xFU0NvbnZlcnNpb25BcnJheXMmIGZBcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLGJvb2wgZGlyZWN0LEdMRVNwb2ludGVyKiBwLEdMZW51bSBhcnJheV9pZCk7Citwcml2YXRlOgorICAgIHZvaWQgc2V0dXBBcnIoY29uc3QgR0x2b2lkKiBhcnIsR0xlbnVtIGFycmF5VHlwZSxHTGVudW0gZGF0YVR5cGUsR0xpbnQgc2l6ZSxHTHNpemVpIHN0cmlkZSxHTGJvb2xlYW4gbm9ybWFsaXplZCwgaW50IHBvaW50c0luZGV4ID0gLTEpOworICAgIHZvaWQgaW5pdEV4dGVuc2lvblN0cmluZygpOworCisgICAgZmxvYXQgbV9hdHRyaWJ1dGUwdmFsdWVbNF0gPSB7fTsKKyAgICBib29sIG1fYXR0cmlidXRlMHZhbHVlQ2hhbmdlZCA9IHRydWU7CisgICAgR0xmbG9hdCogbV9hdHQwQXJyYXkgPSBudWxscHRyOworICAgIHVuc2lnbmVkIGludCBtX2F0dDBBcnJheUxlbmd0aCA9IDA7CisgICAgYm9vbCBtX2F0dDBOZWVkc0Rpc2FibGUgPSBmYWxzZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvR0xFU3YySW1wLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkltcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYzhmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MkltcC5jcHAKQEAgLTAsMCArMSwyNDQ0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKQorKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZmRlZiBfV0lOMzIKKyN1bmRlZiAgR0xfQVBJQ0FMTAorI2RlZmluZSBHTF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIEdMX0FQSUNBTEwgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZW5kaWYKKworI2RlZmluZSBHTF9HTEVYVF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjaW5jbHVkZSA8R0xFUzMvZ2wzLmg+CisKKyNpbmNsdWRlIDxPcGVuZ2xDb2RlY0NvbW1vbi9FcnJvckxvZy5oPgorI2luY2x1ZGUgPEdMY29tbW9uL1RyYW5zbGF0b3JJZmFjZXMuaD4KKyNpbmNsdWRlICJHTEVTdjJDb250ZXh0LmgiCisjaW5jbHVkZSAiR0xFU3YyVmFsaWRhdGUuaCIKKyNpbmNsdWRlICJTaGFkZXJQYXJzZXIuaCIKKyNpbmNsdWRlICJQcm9ncmFtRGF0YS5oIgorI2luY2x1ZGUgPEdMY29tbW9uL1RleHR1cmVVdGlscy5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0ZyYW1lYnVmZmVyRGF0YS5oPgorCisjaW5jbHVkZSAiQU5HTEVTaGFkZXJQYXJzZXIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitleHRlcm4gIkMiIHsKKworLy9kZWNsZXJhdGlvbgorc3RhdGljIHZvaWQgaW5pdEdMRVN4KCk7CitzdGF0aWMgdm9pZCBpbml0Q29udGV4dChHTEVTY29udGV4dCogY3R4LFNoYXJlR3JvdXBQdHIgZ3JwKTsKK3N0YXRpYyB2b2lkIGRlbGV0ZUdMRVNDb250ZXh0KEdMRVNjb250ZXh0KiBjdHgpOworc3RhdGljIHZvaWQgc2V0U2hhcmVHcm91cChHTEVTY29udGV4dCogY3R4LFNoYXJlR3JvdXBQdHIgZ3JwKTsKK3N0YXRpYyBHTEVTY29udGV4dCogY3JlYXRlR0xFU0NvbnRleHQoKTsKK3N0YXRpYyBfX3RyYW5zbGF0b3JNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBnZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyKiBwcm9jTmFtZSk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdMRVMgRVhURU5TSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGU+IFByb2NUYWJsZU1hcDsKK1Byb2NUYWJsZU1hcCAqc19nbGVzRXh0ZW5zaW9ucyA9IE5VTEw7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEVHTGlmYWNlKiAgc19lZ2xJZmFjZSA9IE5VTEw7CitzdGF0aWMgR0xFU2lmYWNlICBzX2dsZXNJZmFjZSA9IHsKKyAgICAuaW5pdEdMRVN4ICAgICAgICAgPSBpbml0R0xFU3gsCisgICAgLmNyZWF0ZUdMRVNDb250ZXh0ID0gY3JlYXRlR0xFU0NvbnRleHQsCisgICAgLmluaXRDb250ZXh0ICAgICAgID0gaW5pdENvbnRleHQsCisgICAgLmRlbGV0ZUdMRVNDb250ZXh0ID0gZGVsZXRlR0xFU0NvbnRleHQsCisgICAgLmZsdXNoICAgICAgICAgICAgID0gKEZVTkNQVFJfTk9fQVJHU19SRVRfVk9JRClnbEZsdXNoLAorICAgIC5maW5pc2ggICAgICAgICAgICA9IChGVU5DUFRSX05PX0FSR1NfUkVUX1ZPSUQpZ2xGaW5pc2gsCisgICAgLnNldFNoYXJlR3JvdXAgICAgID0gc2V0U2hhcmVHcm91cCwKKyAgICAuZ2V0UHJvY0FkZHJlc3MgICAgPSBnZXRQcm9jQWRkcmVzcywKKyAgICAuZmVuY2VTeW5jICAgICAgICAgPSAoRlVOQ1BUUl9GRU5DRV9TWU5DKWdsRmVuY2VTeW5jLAorICAgIC5jbGllbnRXYWl0U3luYyAgICA9IChGVU5DUFRSX0NMSUVOVF9XQUlUX1NZTkMpZ2xDbGllbnRXYWl0U3luYywKKyAgICAuZGVsZXRlU3luYyAgICAgICAgPSAoRlVOQ1BUUl9ERUxFVEVfU1lOQylnbERlbGV0ZVN5bmMsCit9OworCisjaW5jbHVkZSA8R0xjb21tb24vR0xFU21hY3Jvcy5oPgorCitleHRlcm4gIkMiIHsKKworc3RhdGljIHZvaWQgaW5pdEdMRVN4KCkgeworICAgIEFOR0xFU2hhZGVyUGFyc2VyOjpnbG9iYWxJbml0aWFsaXplKCk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRDb250ZXh0KEdMRVNjb250ZXh0KiBjdHgsU2hhcmVHcm91cFB0ciBncnApIHsKKyAgICBpZiAoIWN0eC0+aXNJbml0aWFsaXplZCgpKSB7CisgICAgICAgIGN0eC0+c2V0U2hhcmVHcm91cChncnApOworICAgICAgICBjdHgtPmluaXQoc19lZ2xJZmFjZS0+ZWdsR2V0R2xMaWJyYXJ5KCkpOworICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsMCk7CisgICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCwwKTsKKyAgICB9Cit9CitzdGF0aWMgR0xFU2NvbnRleHQqIGNyZWF0ZUdMRVNDb250ZXh0KCkgeworICAgIHJldHVybiBuZXcgR0xFU3YyQ29udGV4dCgpOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVHTEVTQ29udGV4dChHTEVTY29udGV4dCogY3R4KSB7CisgICAgZGVsZXRlIGN0eDsKK30KKworc3RhdGljIHZvaWQgc2V0U2hhcmVHcm91cChHTEVTY29udGV4dCogY3R4LFNoYXJlR3JvdXBQdHIgZ3JwKSB7CisgICAgaWYoY3R4KSB7CisgICAgICAgIGN0eC0+c2V0U2hhcmVHcm91cChncnApOworICAgIH0KK30KKworc3RhdGljIF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIqIHByb2NOYW1lKSB7CisgICAgR0VUX0NUWF9SRVQoTlVMTCkKKyAgICBjdHgtPmdldEdsb2JhbExvY2soKTsKKyAgICBzdGF0aWMgYm9vbCBwcm9jX3RhYmxlX2luaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKCFwcm9jX3RhYmxlX2luaXRpYWxpemVkKSB7CisgICAgICAgIHByb2NfdGFibGVfaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBpZiAoIXNfZ2xlc0V4dGVuc2lvbnMpCisgICAgICAgICAgICBzX2dsZXNFeHRlbnNpb25zID0gbmV3IFByb2NUYWJsZU1hcCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzX2dsZXNFeHRlbnNpb25zLT5jbGVhcigpOworICAgICAgICAoKnNfZ2xlc0V4dGVuc2lvbnMpWyJnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIl0gPSAoX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUzsKKyAgICAgICAgKCpzX2dsZXNFeHRlbnNpb25zKVsiZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMiXT0oX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVM7CisgICAgfQorICAgIF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIHJldD1OVUxMOworICAgIFByb2NUYWJsZU1hcDo6aXRlcmF0b3IgdmFsID0gc19nbGVzRXh0ZW5zaW9ucy0+ZmluZChwcm9jTmFtZSk7CisgICAgaWYgKHZhbCE9c19nbGVzRXh0ZW5zaW9ucy0+ZW5kKCkpCisgICAgICAgIHJldCA9IHZhbC0+c2Vjb25kOworICAgIGN0eC0+cmVsZWFzZUdsb2JhbExvY2soKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK0dMX0FQSUNBTEwgR0xFU2lmYWNlKiBHTF9BUElFTlRSWSBfX3RyYW5zbGF0b3JfZ2V0SWZhY2VzKEVHTGlmYWNlKiBlZ2xJZmFjZSk7CisKK0dMRVNpZmFjZSogX190cmFuc2xhdG9yX2dldElmYWNlcyhFR0xpZmFjZSogZWdsSWZhY2UpIHsKKyAgICBzX2VnbElmYWNlID0gZWdsSWZhY2U7CisgICAgcmV0dXJuICYgc19nbGVzSWZhY2U7Cit9CisKK30gIC8vIGV4dGVybiAiQyIKKworc3RhdGljIHZvaWQgc19hdHRhY2hTaGFkZXIoR0xFU2NvbnRleHQqIGN0eCwgR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJQYXJzZXIqIHNoYWRlclBhcnNlcikgeworICAgIGlmIChjdHggJiYgcHJvZ3JhbSAmJiBzaGFkZXIgJiYgc2hhZGVyUGFyc2VyKSB7CisgICAgICAgIHNoYWRlclBhcnNlci0+YXR0YWNoUHJvZ3JhbShwcm9ncmFtKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNfZGV0YWNoU2hhZGVyKEdMRVNjb250ZXh0KiBjdHgsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7CisgICAgaWYgKGN0eCAmJiBzaGFkZXIgJiYgY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgYXV0byBzaGFkZXJEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgaWYgKCFzaGFkZXJEYXRhKSByZXR1cm47CisgICAgICAgIFNoYWRlclBhcnNlciogc2hhZGVyUGFyc2VyID0gKFNoYWRlclBhcnNlciopc2hhZGVyRGF0YTsKKyAgICAgICAgc2hhZGVyUGFyc2VyLT5kZXRhY2hQcm9ncmFtKHByb2dyYW0pOworICAgICAgICBpZiAoc2hhZGVyUGFyc2VyLT5nZXREZWxldGVTdGF0dXMoKQorICAgICAgICAgICAgICAgICYmICFzaGFkZXJQYXJzZXItPmhhc0F0dGFjaGVkUHJvZ3JhbXMoKSkgeworICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmRlbGV0ZU5hbWUoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIE9iamVjdExvY2FsTmFtZSBUZXh0dXJlTG9jYWxOYW1lKEdMZW51bSB0YXJnZXQsdW5zaWduZWQgaW50IHRleCkgeworICAgIEdFVF9DVFhfUkVUKDApOworICAgIHJldHVybiAodGV4IT0wPyB0ZXggOiBjdHgtPmdldERlZmF1bHRUZXh0dXJlTmFtZSh0YXJnZXQpKTsKK30KKworc3RhdGljIFRleHR1cmVEYXRhKiBnZXRUZXh0dXJlRGF0YShPYmplY3RMb2NhbE5hbWUgdGV4KSB7CisgICAgR0VUX0NUWF9SRVQoTlVMTCk7CisgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBOVUxMOworICAgIGF1dG8gb2JqRGF0YSA9CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIHRleCk7CisgICAgaWYoIW9iakRhdGEpeworICAgICAgICB0ZXhEYXRhID0gbmV3IFRleHR1cmVEYXRhKCk7CisgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5zZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyKHRleERhdGEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXhEYXRhID0gKFRleHR1cmVEYXRhKilvYmpEYXRhOworICAgIH0KKyAgICByZXR1cm4gdGV4RGF0YTsKK30KKworc3RhdGljIFRleHR1cmVEYXRhKiBnZXRUZXh0dXJlVGFyZ2V0RGF0YShHTGVudW0gdGFyZ2V0KXsKKyAgICBHRVRfQ1RYX1JFVChOVUxMKTsKKyAgICB1bnNpZ25lZCBpbnQgdGV4ID0gY3R4LT5nZXRCaW5kZWRUZXh0dXJlKHRhcmdldCk7CisgICAgcmV0dXJuIGdldFRleHR1cmVEYXRhKFRleHR1cmVMb2NhbE5hbWUodGFyZ2V0LHRleCkpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSl7CisgICAgR0VUX0NUWF9WMigpOworICAgIFNFVF9FUlJPUl9JRiAoIUdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlRW51bSh0ZXh0dXJlLGN0eC0+Z2V0TWF4Q29tYmluZWRUZXhVbml0cygpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+c2V0QWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xBdHRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpeworICAgIEdFVF9DVFgoKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFByb2dyYW1OYW1lPT0wLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFNoYWRlck5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsU2hhZGVyTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICAgICAgYXV0byBwcm9ncmFtRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBhdXRvIHNoYWRlckRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoIXNoYWRlckRhdGEgfHwgIXByb2dyYW1EYXRhICxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNFVF9FUlJPUl9JRighKHNoYWRlckRhdGEtPmdldERhdGFUeXBlKCkgPT1TSEFERVJfREFUQSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICEocHJvZ3JhbURhdGEtPmdldERhdGFUeXBlKCk9PVBST0dSQU1fREFUQSkgLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgICAgICBHTGVudW0gc2hhZGVyVHlwZSA9ICgoU2hhZGVyUGFyc2VyKilzaGFkZXJEYXRhKS0+Z2V0VHlwZSgpOworICAgICAgICBQcm9ncmFtRGF0YSogcERhdGEgPSAoUHJvZ3JhbURhdGEqKXByb2dyYW1EYXRhOworICAgICAgICBTRVRfRVJST1JfSUYoKHBEYXRhLT5nZXRBdHRhY2hlZFNoYWRlcihzaGFkZXJUeXBlKSE9MCksIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgcERhdGEtPmF0dGFjaFNoYWRlcihzaGFkZXIsc2hhZGVyVHlwZSk7CisgICAgICAgIHNfYXR0YWNoU2hhZGVyKGN0eCwgcHJvZ3JhbSwgc2hhZGVyLCAoU2hhZGVyUGFyc2VyKilzaGFkZXJEYXRhKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xBdHRhY2hTaGFkZXIoZ2xvYmFsUHJvZ3JhbU5hbWUsZ2xvYmFsU2hhZGVyTmFtZSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmF0dHJpYk5hbWUobmFtZSksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmF0dHJpYkluZGV4KGluZGV4KSxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFByb2dyYW1OYW1lPT0wLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEF0dHJpYkxvY2F0aW9uKGdsb2JhbFByb2dyYW1OYW1lLGluZGV4LG5hbWUpOworICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcil7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmJ1ZmZlclRhcmdldCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgLy9pZiBidWZmZXIgd2Fzbid0IGdlbmVyYXRlZCBiZWZvcmUsZ2VuZXJhdGUgb25lCisgICAgaWYgKGJ1ZmZlciAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSAmJgorICAgICAgICAhY3R4LT5zaGFyZUdyb3VwKCktPmlzT2JqZWN0KE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLCBidWZmZXIpKSB7CisgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLCBidWZmZXIpOworICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyKG5ldyBHTEVTYnVmZmVyKCkpKTsKKyAgICB9CisgICAgY3R4LT5iaW5kQnVmZmVyKHRhcmdldCxidWZmZXIpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgR0xFU2J1ZmZlciogdmJvID0KKyAgICAgICAgICAgICAgICAoR0xFU2J1ZmZlciopY3R4LT5zaGFyZUdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyKTsKKyAgICAgICAgdmJvLT5zZXRCaW5kZWQoKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgR0x1aW50IGdsb2JhbEZyYW1lQnVmZmVyTmFtZSA9IGZyYW1lYnVmZmVyOworICAgIGlmKGZyYW1lYnVmZmVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKXsKKyAgICAgICAgZ2xvYmFsRnJhbWVCdWZmZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIpOworICAgICAgICAvL2lmIGZyYW1lYnVmZmVyIHdhc24ndCBnZW5lcmF0ZWQgYmVmb3JlLGdlbmVyYXRlIG9uZQorICAgICAgICBpZighZ2xvYmFsRnJhbWVCdWZmZXJOYW1lKXsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6RlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcik7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIsCisgICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGFQdHIobmV3IEZyYW1lYnVmZmVyRGF0YShmcmFtZWJ1ZmZlcikpKTsKKyAgICAgICAgICAgIGdsb2JhbEZyYW1lQnVmZmVyTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kRnJhbWVidWZmZXJFWFQodGFyZ2V0LGdsb2JhbEZyYW1lQnVmZmVyTmFtZSk7CisKKyAgICAvLyB1cGRhdGUgZnJhbWVidWZmZXIgYmluZGluZyBzdGF0ZQorICAgIGN0eC0+c2V0RnJhbWVidWZmZXJCaW5kaW5nKGZyYW1lYnVmZmVyKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcil7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBHTHVpbnQgZ2xvYmFsUmVuZGVyQnVmZmVyTmFtZSA9IHJlbmRlcmJ1ZmZlcjsKKyAgICBpZihyZW5kZXJidWZmZXIgJiYgY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpeworICAgICAgICBnbG9iYWxSZW5kZXJCdWZmZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CisgICAgICAgIC8vaWYgcmVuZGVyYnVmZmVyIHdhc24ndCBnZW5lcmF0ZWQgYmVmb3JlLGdlbmVyYXRlIG9uZQorICAgICAgICBpZighZ2xvYmFsUmVuZGVyQnVmZmVyTmFtZSl7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmJ1ZmZlcik7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgUmVuZGVyYnVmZmVyRGF0YSgpKSk7CisgICAgICAgICAgICBnbG9iYWxSZW5kZXJCdWZmZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsZ2xvYmFsUmVuZGVyQnVmZmVyTmFtZSk7CisKKyAgICAvLyB1cGRhdGUgcmVuZGVyYnVmZmVyIGJpbmRpbmcgc3RhdGUKKyAgICBjdHgtPnNldFJlbmRlcmJ1ZmZlckJpbmRpbmcocmVuZGVyYnVmZmVyKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEJpbmRUZXh0dXJlKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSkKKworICAgIC8vZm9yIGhhbmRsaW5nIGRlZmF1bHQgdGV4dHVyZSAoMCkKKyAgICBPYmplY3RMb2NhbE5hbWUgbG9jYWxUZXhOYW1lID0gVGV4dHVyZUxvY2FsTmFtZSh0YXJnZXQsdGV4dHVyZSk7CisgICAgR0x1aW50IGdsb2JhbFRleHR1cmVOYW1lID0gbG9jYWxUZXhOYW1lOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKXsKKyAgICAgICAgZ2xvYmFsVGV4dHVyZU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIGxvY2FsVGV4TmFtZSk7CisgICAgICAgIC8vaWYgdGV4dHVyZSB3YXNuJ3QgZ2VuZXJhdGVkIGJlZm9yZSxnZW5lcmF0ZSBvbmUKKyAgICAgICAgaWYoIWdsb2JhbFRleHR1cmVOYW1lKXsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgbG9jYWxUZXhOYW1lKTsKKyAgICAgICAgICAgIGdsb2JhbFRleHR1cmVOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgbG9jYWxUZXhOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIFRleHR1cmVEYXRhKiB0ZXhEYXRhID0gZ2V0VGV4dHVyZURhdGEobG9jYWxUZXhOYW1lKTsKKyAgICAgICAgaWYgKHRleERhdGEtPnRhcmdldD09MCkKKyAgICAgICAgICAgIHRleERhdGEtPnRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgLy9pZiB0ZXh0dXJlIHdhcyBhbHJlYWR5IGJvdW5kIHRvIGFub3RoZXIgdGFyZ2V0CisgICAgICAgIFNFVF9FUlJPUl9JRihjdHgtPkdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGV4RGF0YS0+dGFyZ2V0KSAhPSBjdHgtPkdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGFyZ2V0KSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICB0ZXhEYXRhLT53YXNCb3VuZCA9IHRydWU7CisgICAgfQorCisgICAgY3R4LT5zZXRCaW5kZWRUZXh0dXJlKHRhcmdldCx0ZXh0dXJlKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRUZXh0dXJlKHRhcmdldCxnbG9iYWxUZXh0dXJlTmFtZSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCbGVuZENvbG9yKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCbGVuZENvbG9yKHJlZCxncmVlbixibHVlLGFscGhhKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb24oIEdMZW51bSBtb2RlICl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmJsZW5kRXF1YXRpb25Nb2RlKG1vZGUpLEdMX0lOVkFMSURfRU5VTSkKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJsZW5kRXF1YXRpb24obW9kZSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6YmxlbmRFcXVhdGlvbk1vZGUobW9kZVJHQikgJiYgR0xFU3YyVmFsaWRhdGU6OmJsZW5kRXF1YXRpb25Nb2RlKG1vZGVBbHBoYSkpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUobW9kZVJHQixtb2RlQWxwaGEpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3Rvcil7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmJsZW5kU3JjKHNmYWN0b3IpIHx8ICFHTEVTdjJWYWxpZGF0ZTo6YmxlbmREc3QoZGZhY3RvciksR0xfSU5WQUxJRF9FTlVNKQorICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmxlbmRGdW5jKHNmYWN0b3IsZGZhY3Rvcik7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZShHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRigKKyEoR0xFU3YyVmFsaWRhdGU6OmJsZW5kU3JjKHNyY1JHQikgJiYgR0xFU3YyVmFsaWRhdGU6OmJsZW5kRHN0KGRzdFJHQikgJiYgR0xFU3YyVmFsaWRhdGU6OmJsZW5kU3JjKHNyY0FscGhhKSAmJiBHTEVTdjJWYWxpZGF0ZTo6YmxlbmREc3QoZHN0QWxwaGEpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdCLGRzdFJHQixzcmNBbHBoYSxkc3RBbHBoYSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVN2MlZhbGlkYXRlOjpidWZmZXJUYXJnZXQodGFyZ2V0KSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmJ1ZmZlclVzYWdlKHVzYWdlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighY3R4LT5pc0JpbmRlZEJ1ZmZlcih0YXJnZXQpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBjdHgtPnNldEJ1ZmZlckRhdGEodGFyZ2V0LHNpemUsZGF0YSx1c2FnZSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+aXNCaW5kZWRCdWZmZXIodGFyZ2V0KSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6YnVmZmVyVGFyZ2V0KHRhcmdldCksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+c2V0QnVmZmVyU3ViRGF0YSh0YXJnZXQsb2Zmc2V0LHNpemUsZGF0YSksR0xfSU5WQUxJRF9WQUxVRSk7Cit9CisKKworR0xfQVBJQ0FMTCBHTGVudW0gR0xfQVBJRU5UUlkgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMZW51bSB0YXJnZXQpeworICAgIEdFVF9DVFhfUkVUKEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKTsKKyAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCksR0xfSU5WQUxJRF9FTlVNLEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKTsKKyAgICBjdHgtPmRyYXdWYWxpZGF0ZSgpOworICAgIHJldHVybiBjdHgtPmRpc3BhdGNoZXIoKS5nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQodGFyZ2V0KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbENsZWFyKEdMYml0ZmllbGQgbWFzayl7CisgICAgR0VUX0NUWCgpOworICAgIEdMYml0ZmllbGQgYWxsb3dlZF9iaXRzID0gR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ7CisgICAgR0xiaXRmaWVsZCBoYXNfZGlzYWxsb3dlZF9iaXRzID0gKG1hc2sgJiB+YWxsb3dlZF9iaXRzKTsKKyAgICBTRVRfRVJST1JfSUYoaGFzX2Rpc2FsbG93ZWRfYml0cywgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgY3R4LT5kcmF3VmFsaWRhdGUoKTsKKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ2xlYXIobWFzayk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvcihHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ2xlYXJDb2xvcihyZWQsZ3JlZW4sYmx1ZSxhbHBoYSk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aGYoR0xjbGFtcGYgZGVwdGgpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENsZWFyRGVwdGgoZGVwdGgpOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbENsZWFyU3RlbmNpbChHTGludCBzKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDbGVhclN0ZW5jaWwocyk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQ29sb3JNYXNrKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ29sb3JNYXNrKHJlZCxncmVlbixibHVlLGFscGhhKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlcil7CisgICAgR0VUX0NUWCgpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxTaGFkZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFNoYWRlck5hbWU9PTAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9IFNIQURFUl9EQVRBLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgU2hhZGVyUGFyc2VyKiBzcCA9IChTaGFkZXJQYXJzZXIqKW9iakRhdGE7CisgICAgICAgIFNFVF9FUlJPUl9JRihzcC0+Z2V0RGVsZXRlU3RhdHVzKCksIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBpZiAoc3AtPnZhbGlkU2hhZGVyKCkpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ29tcGlsZVNoYWRlcihnbG9iYWxTaGFkZXJOYW1lKTsKKworICAgICAgICAgICAgR0xzaXplaSBpbmZvTG9nTGVuZ3RoPTA7CisgICAgICAgICAgICBHTGNoYXIqIGluZm9Mb2c7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFNoYWRlcml2KGdsb2JhbFNoYWRlck5hbWUsR0xfSU5GT19MT0dfTEVOR1RILCZpbmZvTG9nTGVuZ3RoKTsKKyAgICAgICAgICAgIGluZm9Mb2cgPSBuZXcgR0xjaGFyW2luZm9Mb2dMZW5ndGgrMV07CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFNoYWRlckluZm9Mb2coZ2xvYmFsU2hhZGVyTmFtZSxpbmZvTG9nTGVuZ3RoLE5VTEwsaW5mb0xvZyk7CisgICAgICAgICAgICBpZiAoaW5mb0xvZ0xlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW5mb0xvZ1swXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcC0+c2V0SW5mb0xvZyhpbmZvTG9nKTsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCit7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRFeCh0YXJnZXQpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKGxldmVsIDwgMCB8fCBpbWFnZVNpemUgPCAwLCBHTF9JTlZBTElEX1ZBTFVFKTsKKworICAgIGRvQ29tcHJlc3NlZFRleEltYWdlMkQoY3R4LCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgYm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVNpemUsIGRhdGEsICh2b2lkKilnbFRleEltYWdlMkQpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldEV4KHRhcmdldCksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoIWRhdGEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQodGFyZ2V0LGxldmVsLHhvZmZzZXQseW9mZnNldCx3aWR0aCxoZWlnaHQsZm9ybWF0LGltYWdlU2l6ZSxkYXRhKTsKK30KKwordm9pZCBzX2dsSW5pdFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKXsKKyAgICBHRVRfQ1RYKCk7CisKKyAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkgJiYgbGV2ZWwgPT0gMCl7CisgICAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYodGV4RGF0YSkgeworICAgICAgICAgICAgdGV4RGF0YS0+d2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIHRleERhdGEtPmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgIHRleERhdGEtPmJvcmRlciA9IGJvcmRlcjsKKyAgICAgICAgICAgIHRleERhdGEtPmludGVybmFsRm9ybWF0ID0gaW50ZXJuYWxmb3JtYXQ7CisgICAgICAgICAgICB0ZXhEYXRhLT50YXJnZXQgPSB0YXJnZXQ7CisKKyAgICAgICAgICAgIGlmICh0ZXhEYXRhLT5zb3VyY2VFR0xJbWFnZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHRleHR1cmUgd2FzIGEgdGFyZ2V0IG9mIEVHTEltYWdlLAorICAgICAgICAgICAgICAgIC8vIGJ1dCBub3cgaXQgaXMgcmUtZGVmaW5lZCBzbyB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gcmUtZ2VuZXJhdGUgZ2xvYmFsIHRleHR1cmUgbmFtZSBmb3IgaXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGV4ID0gY3R4LT5nZXRCaW5kZWRUZXh0dXJlKHRhcmdldCk7CisgICAgICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBnbG9iYWxUZXh0dXJlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXgpOworICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFRleHR1cmVOYW1lKTsKKyAgICAgICAgICAgICAgICB0ZXhEYXRhLT5zb3VyY2VFR0xJbWFnZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU3YyVmFsaWRhdGU6OnBpeGVsRnJtdChjdHgsaW50ZXJuYWxmb3JtYXQpICYmIEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoKEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlSXNDdWJlTWFwKHRhcmdldCkgJiYgd2lkdGggIT0gaGVpZ2h0KSwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgU0VUX0VSUk9SX0lGKGJvcmRlciAhPSAwLEdMX0lOVkFMSURfVkFMVUUpOworICAgIHNfZ2xJbml0VGV4SW1hZ2UyRCh0YXJnZXQsbGV2ZWwsaW50ZXJuYWxmb3JtYXQsd2lkdGgsaGVpZ2h0LGJvcmRlcik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDb3B5VGV4SW1hZ2UyRCh0YXJnZXQsbGV2ZWwsaW50ZXJuYWxmb3JtYXQseCx5LHdpZHRoLGhlaWdodCxib3JkZXIpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldEV4KHRhcmdldCksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCxsZXZlbCx4b2Zmc2V0LHlvZmZzZXQseCx5LHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlUHJvZ3JhbSh2b2lkKXsKKyAgICBHRVRfQ1RYX1JFVCgwKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbUluZm8gPSBuZXcgUHJvZ3JhbURhdGEoKTsKKyAgICAgICAgY29uc3QgR0x1aW50IGxvY2FsUHJvZ3JhbU5hbWUgPQorICAgICAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5nZW5OYW1lKFNoYWRlclByb2dyYW1UeXBlOjpQUk9HUkFNLCAwLCB0cnVlKTsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQcm9ncmFtTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihwcm9ncmFtSW5mbykpOworICAgICAgICByZXR1cm4gbG9jYWxQcm9ncmFtTmFtZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK0dMX0FQSUNBTEwgR0x1aW50IEdMX0FQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyKEdMZW51bSB0eXBlKXsKKyAgICBHRVRfQ1RYX1YyX1JFVCgwKTsKKyAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnNoYWRlclR5cGUodHlwZSksR0xfSU5WQUxJRF9FTlVNLDApOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIFNoYWRlclByb2dyYW1UeXBlIHNoYWRlclByb2dyYW1UeXBlOworICAgICAgICBpZiAodHlwZSA9PSBHTF9WRVJURVhfU0hBREVSKSB7CisgICAgICAgICAgICBzaGFkZXJQcm9ncmFtVHlwZSA9IFNoYWRlclByb2dyYW1UeXBlOjpWRVJURVhfU0hBREVSOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2hhZGVyUHJvZ3JhbVR5cGUgPSBTaGFkZXJQcm9ncmFtVHlwZTo6RlJBR01FTlRfU0hBREVSOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEdMdWludCBsb2NhbFNoYWRlck5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclByb2dyYW1UeXBlLCAwLCB0cnVlKTsKKyAgICAgICAgU2hhZGVyUGFyc2VyKiBzcCA9IG5ldyBTaGFkZXJQYXJzZXIodHlwZSk7CisgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5zZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU2hhZGVyTmFtZSwgT2JqZWN0RGF0YVB0cihzcCkpOworICAgICAgICByZXR1cm4gbG9jYWxTaGFkZXJOYW1lOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEN1bGxGYWNlKEdMZW51bSBtb2RlKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xDdWxsRmFjZShtb2RlKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYobjwwLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgbjsgaSsrKXsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc1tpXSk7CisgICAgICAgICAgICBjdHgtPnVuYmluZEJ1ZmZlcihidWZmZXJzW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbERlbGV0ZUZyYW1lYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKG4gPCAwLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6RlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlcnNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzX2RldGFjaEZyb21GcmFtZWJ1ZmZlcihOYW1lZE9iamVjdFR5cGUgYnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCB0ZXh0dXJlKSB7CisgICAgR0VUX0NUWCgpOworICAgIEdMdWludCBmYk5hbWUgPSBjdHgtPmdldEZyYW1lYnVmZmVyQmluZGluZygpOworICAgIGlmICghZmJOYW1lKSByZXR1cm47CisgICAgYXV0byBmYk9iaiA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZmJOYW1lKTsKKyAgICBpZiAoZmJPYmogPT0gTlVMTCkgcmV0dXJuOworICAgIEZyYW1lYnVmZmVyRGF0YSAqZmJEYXRhID0gKEZyYW1lYnVmZmVyRGF0YSAqKWZiT2JqOworICAgIEdMZW51bSB0YXJnZXQ7CisgICAgY29uc3QgR0xlbnVtIGtBdHRhY2htZW50c1tdID0ge0dMX0NPTE9SX0FUVEFDSE1FTlQwLCBHTF9ERVBUSF9BVFRBQ0hNRU5ULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlR9OworICAgIGNvbnN0IHNpemVfdCBzaXplbiA9IHNpemVvZihrQXR0YWNobWVudHMpL3NpemVvZihHTGVudW0pOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW47ICsraSApIHsKKyAgICAgICAgR0x1aW50IG5hbWUgPSBmYkRhdGEtPmdldEF0dGFjaG1lbnQoa0F0dGFjaG1lbnRzW2ldLCAmdGFyZ2V0LCBOVUxMKTsKKyAgICAgICAgaWYgKG5hbWUgIT0gdGV4dHVyZSkgY29udGludWU7CisgICAgICAgIGlmIChOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUgPT0gYnVmZmVyVHlwZSAmJgorICAgICAgICAgICAgR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRFeCh0YXJnZXQpKSB7CisgICAgICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBrQXR0YWNobWVudHNbaV0sIHRhcmdldCwgMCwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIgPT0gYnVmZmVyVHlwZSAmJgorICAgICAgICAgICAgICAgICAgIEdMRVN2MlZhbGlkYXRlOjpyZW5kZXJidWZmZXJUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICAgICAgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwga0F0dGFjaG1lbnRzW2ldLCB0YXJnZXQsIDApOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBuOyBpKyspeworICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmRlbGV0ZU5hbWUoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJidWZmZXJzW2ldKTsKKyAgICAgICAgICAgIHNfZGV0YWNoRnJvbUZyYW1lYnVmZmVyKE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYobjwwLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGZvcihpbnQgaT0wOyBpIDwgbjsgaSsrKXsKKyAgICAgICAgICAgIGlmICh0ZXh0dXJlc1tpXSE9MCkgeworICAgICAgICAgICAgICAgIGlmIChjdHgtPmdldEJpbmRlZFRleHR1cmUoR0xfVEVYVFVSRV8yRCkgPT0gdGV4dHVyZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0QmluZGVkVGV4dHVyZShHTF9URVhUVVJFXzJELDApOworICAgICAgICAgICAgICAgIGlmIChjdHgtPmdldEJpbmRlZFRleHR1cmUoR0xfVEVYVFVSRV9DVUJFX01BUCkgPT0gdGV4dHVyZXNbaV0pCisgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0QmluZGVkVGV4dHVyZShHTF9URVhUVVJFX0NVQkVfTUFQLDApOworICAgICAgICAgICAgICAgIHNfZGV0YWNoRnJvbUZyYW1lYnVmZmVyKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4dHVyZXNbaV0pOworICAgICAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xEZWxldGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYocHJvZ3JhbSAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKCFnbG9iYWxQcm9ncmFtTmFtZSwgR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICAgICAgYXV0byBwcm9ncmFtRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYoIShwcm9ncmFtRGF0YS0+Z2V0RGF0YVR5cGUoKT09UFJPR1JBTV9EQVRBKSwKKyAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFByb2dyYW1EYXRhKiBwRGF0YSA9IChQcm9ncmFtRGF0YSopcHJvZ3JhbURhdGE7CisgICAgICAgIGlmIChwRGF0YSAmJiBwRGF0YS0+aXNJblVzZSgpKSB7CisgICAgICAgICAgICBwRGF0YS0+c2V0RGVsZXRlU3RhdHVzKHRydWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNfZGV0YWNoU2hhZGVyKGN0eCwgcHJvZ3JhbSwgcERhdGEtPmdldEF0dGFjaGVkVmVydGV4U2hhZGVyKCkpOworICAgICAgICBzX2RldGFjaFNoYWRlcihjdHgsIHByb2dyYW0sIHBEYXRhLT5nZXRBdHRhY2hlZEZyYWdtZW50U2hhZGVyKCkpOworCisgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5kZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbERlbGV0ZVNoYWRlcihHTHVpbnQgc2hhZGVyKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoc2hhZGVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxTaGFkZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKCFnbG9iYWxTaGFkZXJOYW1lLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKCFvYmpEYXRhICxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1TSEFERVJfREFUQSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNoYWRlclBhcnNlciogc3AgPSAoU2hhZGVyUGFyc2VyKilvYmpEYXRhOworICAgICAgICBTRVRfRVJST1JfSUYoc3AtPmdldERlbGV0ZVN0YXR1cygpLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgaWYgKHNwLT5oYXNBdHRhY2hlZFByb2dyYW1zKCkpIHsKKyAgICAgICAgICAgIHNwLT5zZXREZWxldGVTdGF0dXModHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+ZGVsZXRlTmFtZShOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRGVwdGhGdW5jKEdMZW51bSBmdW5jKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEZXB0aEZ1bmMoZnVuYyk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEZXB0aE1hc2soZmxhZyk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERlcHRoUmFuZ2Uoek5lYXIsekZhcik7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xEZXRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpeworICAgIEdFVF9DVFgoKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFByb2dyYW1OYW1lPT0wLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFNoYWRlck5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsU2hhZGVyTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRighb2JqRGF0YSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNFVF9FUlJPUl9JRighKG9iakRhdGEtPmdldERhdGFUeXBlKCk9PVBST0dSQU1fREFUQSkgLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbURhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisgICAgICAgIFNFVF9FUlJPUl9JRighcHJvZ3JhbURhdGEtPmlzQXR0YWNoZWQoc2hhZGVyKSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIHByb2dyYW1EYXRhLT5kZXRhY2hTaGFkZXIoc2hhZGVyKTsKKworICAgICAgICBzX2RldGFjaFNoYWRlcihjdHgsIHByb2dyYW0sIHNoYWRlcik7CisKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEZXRhY2hTaGFkZXIoZ2xvYmFsUHJvZ3JhbU5hbWUsZ2xvYmFsU2hhZGVyTmFtZSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRGlzYWJsZShHTGVudW0gY2FwKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEaXNhYmxlKGNhcCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoR0x1aW50IGluZGV4KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCghR0xFU3YyVmFsaWRhdGU6OmFycmF5SW5kZXgoY3R4LGluZGV4KSksR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgY3R4LT5lbmFibGVBcnIoaW5kZXgsZmFsc2UpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KXsKKyAgICBHRVRfQ1RYX1YyKCk7CisgICAgU0VUX0VSUk9SX0lGKGNvdW50IDwgMCxHTF9JTlZBTElEX1ZBTFVFKQorICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmRyYXdNb2RlKG1vZGUpLEdMX0lOVkFMSURfRU5VTSk7CisKKyAgICBjdHgtPmRyYXdWYWxpZGF0ZSgpOworCisgICAgR0xFU0NvbnZlcnNpb25BcnJheXMgdG1wQXJyczsKKyAgICBjdHgtPnNldHVwQXJyYXlzUG9pbnRlcnModG1wQXJycyxmaXJzdCxjb3VudCwwLE5VTEwsdHJ1ZSk7CisKKyAgICBpZiAoY3R4LT5uZWVkQXR0MFByZURyYXdWYWxpZGF0aW9uKCkpIHsKKyAgICAgICAgY3R4LT52YWxpZGF0ZUF0dDBQcmVEcmF3KGNvdW50KTsKKyAgICB9CisKKyAgICAvL0VuYWJsZSB0ZXh0dXJlIGdlbmVyYXRpb24gZm9yIEdMX1BPSU5UUyBhbmQgZ2xfUG9pbnRTaXplIHNoYWRlciB2YXJpYWJsZQorICAgIC8vR0xFUzIgYXNzdW1lcyB0aGlzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgd2UgbmVlZCB0byBzZXQgdGhpcyBzdGF0ZSBmb3IgR0wKKyAgICBpZiAobW9kZT09R0xfUE9JTlRTKSB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRW5hYmxlKEdMX1BPSU5UX1NQUklURSk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUpOworICAgIH0KKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRHJhd0FycmF5cyhtb2RlLGZpcnN0LGNvdW50KTsKKworICAgIGlmIChtb2RlPT1HTF9QT0lOVFMpIHsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEaXNhYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERpc2FibGUoR0xfUE9JTlRfU1BSSVRFKTsKKyAgICB9CisKKyAgICBjdHgtPnZhbGlkYXRlQXR0MFBvc3REcmF3KCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGVsZW1lbnRzSW5kaWNlcyl7CisgICAgR0VUX0NUWF9WMigpOworICAgIFNFVF9FUlJPUl9JRihjb3VudCA8IDAsR0xfSU5WQUxJRF9WQUxVRSkKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6ZHJhd01vZGUobW9kZSkgJiYgR0xFU3YyVmFsaWRhdGU6OmRyYXdUeXBlKHR5cGUpKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgY3R4LT5kcmF3VmFsaWRhdGUoKTsKKworICAgIGNvbnN0IEdMdm9pZCogaW5kaWNlcyA9IGVsZW1lbnRzSW5kaWNlczsKKyAgICBpZihjdHgtPmlzQmluZGVkQnVmZmVyKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKSkgeyAvLyBpZiB2Ym8gaXMgYmluZGVkIHRha2UgdGhlIGluZGljZXMgZnJvbSB0aGUgdmJvCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ1ZiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgKj4oY3R4LT5nZXRCaW5kZWRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKTsKKyAgICAgICAgaW5kaWNlcyA9IGJ1ZiArIFNhZmVVSW50RnJvbVBvaW50ZXIoZWxlbWVudHNJbmRpY2VzKTsKKyAgICB9CisKKyAgICBHTEVTQ29udmVyc2lvbkFycmF5cyB0bXBBcnJzOworICAgIGN0eC0+c2V0dXBBcnJheXNQb2ludGVycyh0bXBBcnJzLDAsY291bnQsdHlwZSxpbmRpY2VzLGZhbHNlKTsKKworICAgIGlmIChjdHgtPm5lZWRBdHQwUHJlRHJhd1ZhbGlkYXRpb24oKSkgeworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbWF4SW5kZXggPSBjdHgtPmZpbmRNYXhJbmRleChjb3VudCwgdHlwZSwgaW5kaWNlcyk7CisgICAgICAgIGN0eC0+dmFsaWRhdGVBdHQwUHJlRHJhdyhtYXhJbmRleCk7CisgICAgfQorICAgIAorICAgIC8vU2VlIGdsRHJhd0FycmF5cworICAgIGlmIChtb2RlPT1HTF9QT0lOVFMpIHsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGUoR0xfUE9JTlRfU1BSSVRFKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGUoR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSk7CisgICAgfQorCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xEcmF3RWxlbWVudHMobW9kZSxjb3VudCx0eXBlLGluZGljZXMpOworCisgICAgaWYgKG1vZGU9PUdMX1BPSU5UUykgeworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERpc2FibGUoR0xfVkVSVEVYX1BST0dSQU1fUE9JTlRfU0laRSk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEUpOworICAgIH0KKworICAgIGN0eC0+dmFsaWRhdGVBdHQwUG9zdERyYXcoKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEVuYWJsZShHTGVudW0gY2FwKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xFbmFibGUoY2FwKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEdMdWludCBpbmRleCl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjphcnJheUluZGV4KGN0eCxpbmRleCkpLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGN0eC0+ZW5hYmxlQXJyKGluZGV4LHRydWUpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsRmluaXNoKHZvaWQpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZpbmlzaCgpOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEZsdXNoKHZvaWQpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZsdXNoKCk7Cit9CisKKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU3YyVmFsaWRhdGU6OmZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCkgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgR0xFU3YyVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldChyZW5kZXJidWZmZXJ0YXJnZXQpICYmCisgICAgICAgICAgICAgICAgICAgR0xFU3YyVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+c2hhcmVHcm91cCgpLmdldCgpLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisKKyAgICBHTHVpbnQgZ2xvYmFsUmVuZGVyYnVmZmVyTmFtZSA9IDA7CisgICAgT2JqZWN0RGF0YVB0ciBvYmo7CisKKyAgICAvLyBnZW5lcmF0ZSB0aGUgcmVuZGVyYnVmZmVyIG9iamVjdCBpZiBub3QgeWV0IGV4aXN0CisgICAgaWYocmVuZGVyYnVmZmVyKSB7CisgICAgICAgIGlmICghY3R4LT5zaGFyZUdyb3VwKCktPmlzT2JqZWN0KE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJidWZmZXIpKSB7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmJ1ZmZlcik7CisgICAgICAgICAgICBvYmogPSBPYmplY3REYXRhUHRyKG5ldyBSZW5kZXJidWZmZXJEYXRhKCkpOworICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJidWZmZXIsIG9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYmogPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YVB0cigKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBnbG9iYWxSZW5kZXJidWZmZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJlbmRlcmJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSB0aGUgY3VycmVudCBmcmFtZWJ1ZmZlciBvYmplY3QgYXR0YWNobWVudCBzdGF0ZQorICAgIEdMdWludCBmYk5hbWUgPSBjdHgtPmdldEZyYW1lYnVmZmVyQmluZGluZygpOworICAgIGF1dG8gZmJPYmogPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6RlJBTUVCVUZGRVIsIGZiTmFtZSk7CisgICAgaWYgKGZiT2JqICE9IE5VTEwpIHsKKyAgICAgICAgRnJhbWVidWZmZXJEYXRhICpmYkRhdGEgPSAoRnJhbWVidWZmZXJEYXRhICopZmJPYmo7CisgICAgICAgIGZiRGF0YS0+c2V0QXR0YWNobWVudChhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlciwgb2JqKTsKKyAgICB9CisKKyAgICBpZiAocmVuZGVyYnVmZmVyICYmIG9iai5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIFJlbmRlcmJ1ZmZlckRhdGEgKnJiRGF0YSA9IChSZW5kZXJidWZmZXJEYXRhICopb2JqLmdldCgpOworICAgICAgICBpZiAocmJEYXRhLT5lZ2xJbWFnZUdsb2JhbFRleE9iamVjdCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgcmVuZGVyYnVmZmVyIG9iamVjdCBpcyBhbiBlZ2xJbWFnZSB0YXJnZXQKKyAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgZWdsaW1hZ2UncyB0ZXh0dXJlIGluc3RlYWQgdGhlIHJlbmRlcmJ1ZmZlci4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJEYXRhLT5lZ2xJbWFnZUdsb2JhbFRleE9iamVjdC0+Z2V0R2xvYmFsTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCxhdHRhY2htZW50LHJlbmRlcmJ1ZmZlcnRhcmdldCxnbG9iYWxSZW5kZXJidWZmZXJOYW1lKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSAmJgorICAgICAgICAgICAgICAgICAgIEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGV4dGFyZ2V0KSAgJiYKKyAgICAgICAgICAgICAgICAgICBHTEVTdjJWYWxpZGF0ZTo6ZnJhbWVidWZmZXJBdHRhY2htZW50KGF0dGFjaG1lbnQpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRihsZXZlbCAhPSAwLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBTRVRfRVJST1JfSUYoIWN0eC0+c2hhcmVHcm91cCgpLmdldCgpLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisKKyAgICBHTHVpbnQgZ2xvYmFsVGV4dHVyZU5hbWUgPSAwOworCisgICAgaWYodGV4dHVyZSkgeworICAgICAgICBpZiAoIWN0eC0+c2hhcmVHcm91cCgpLT5pc09iamVjdChOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIHRleHR1cmUpKSB7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsIHRleHR1cmUpOworICAgICAgICB9CisgICAgICAgIE9iamVjdExvY2FsTmFtZSB0ZXhuYW1lID0gVGV4dHVyZUxvY2FsTmFtZSh0ZXh0YXJnZXQsdGV4dHVyZSk7CisgICAgICAgIGdsb2JhbFRleHR1cmVOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFLCB0ZXhuYW1lKTsKKyAgICB9CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCxhdHRhY2htZW50LHRleHRhcmdldCxnbG9iYWxUZXh0dXJlTmFtZSxsZXZlbCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIHRoZSBjdXJyZW50IGZyYW1lYnVmZmVyIG9iamVjdCBhdHRhY2htZW50IHN0YXRlCisgICAgR0x1aW50IGZiTmFtZSA9IGN0eC0+Z2V0RnJhbWVidWZmZXJCaW5kaW5nKCk7CisgICAgYXV0byBmYk9iaiA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZmJOYW1lKTsKKyAgICBpZiAoZmJPYmopIHsKKyAgICAgICAgRnJhbWVidWZmZXJEYXRhICpmYkRhdGEgPSAoRnJhbWVidWZmZXJEYXRhICopZmJPYmo7CisgICAgICAgIGZiRGF0YS0+c2V0QXR0YWNobWVudChhdHRhY2htZW50LCB0ZXh0YXJnZXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZSwgT2JqZWN0RGF0YVB0cigpKTsKKyAgICB9Cit9CisKKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEZyb250RmFjZShHTGVudW0gbW9kZSl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRnJvbnRGYWNlKG1vZGUpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogYnVmZmVycyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICBidWZmZXJzW2ldID0gY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLCAwLCB0cnVlKTsKKyAgICAgICAgICAgIC8vZ2VuZXJhdGluZyB2Ym8gb2JqZWN0IHJlbGF0ZWQgdG8gdGhpcyBidWZmZXIgbmFtZQorICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPnNldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgR0xFU2J1ZmZlcigpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcChHTGVudW0gdGFyZ2V0KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdmFsaWRhdGU6OnRleHR1cmVUYXJnZXQodGFyZ2V0KSwgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBnZXRUZXh0dXJlVGFyZ2V0RGF0YSh0YXJnZXQpOworICAgICAgICBpZiAodGV4RGF0YSkgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHdpZHRoID0gdGV4RGF0YS0+d2lkdGg7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0ID0gdGV4RGF0YS0+aGVpZ2h0OworICAgICAgICAgICAgLy8gc2V0IGVycm9yIGNvZGUgaWYgZWl0aGVyIHRoZSB3aWR0aCBvciBoZWlnaHQgaXMgbm90IGEgcG93ZXIgb2YgdHdvLgorICAgICAgICAgICAgU0VUX0VSUk9SX0lGKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggJiAod2lkdGggLSAxKSkgIT0gMCB8fCAoaGVpZ2h0ICYgKGhlaWdodCAtIDEpKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICBmcmFtZWJ1ZmZlcnNbaV0gPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgMCwgdHJ1ZSk7CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+c2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZnJhbWVidWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyKG5ldyBGcmFtZWJ1ZmZlckRhdGEoZnJhbWVidWZmZXJzW2ldKSkpOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRihuPDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgZm9yKGludCBpPTA7IGk8biA7aSsrKSB7CisgICAgICAgICAgICByZW5kZXJidWZmZXJzW2ldID0gY3R4LT5zaGFyZUdyb3VwKCktPmdlbk5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCAwLCB0cnVlKTsKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5zZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0cihuZXcgUmVuZGVyYnVmZmVyRGF0YSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCogdGV4dHVyZXMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYobjwwLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGZvcihpbnQgaT0wOyBpPG4gO2krKykgeworICAgICAgICAgICAgdGV4dHVyZXNbaV0gPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2VuTmFtZShOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHRydWUpOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlQXR0cmliKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpeworICAgIEdFVF9DVFgoKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFByb2dyYW1OYW1lPT0wLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEFjdGl2ZUF0dHJpYihnbG9iYWxQcm9ncmFtTmFtZSxpbmRleCxidWZzaXplLGxlbmd0aCxzaXplLHR5cGUsbmFtZSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFByb2dyYW1OYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9UFJPR1JBTV9EQVRBLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRBY3RpdmVVbmlmb3JtKGdsb2JhbFByb2dyYW1OYW1lLGluZGV4LGJ1ZnNpemUsbGVuZ3RoLHNpemUsdHlwZSxuYW1lKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZXRBdHRhY2hlZFNoYWRlcnMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpeworICAgIEdFVF9DVFgoKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFByb2dyYW1OYW1lPT0wLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRBdHRhY2hlZFNoYWRlcnMoZ2xvYmFsUHJvZ3JhbU5hbWUsbWF4Y291bnQsY291bnQsc2hhZGVycyk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9UFJPR1JBTV9EQVRBLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgR0xpbnQgbnVtU2hhZGVycz0wOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFByb2dyYW1pdihnbG9iYWxQcm9ncmFtTmFtZSxHTF9BVFRBQ0hFRF9TSEFERVJTLCZudW1TaGFkZXJzKTsKKyAgICAgICAgZm9yKGludCBpPTAgOyBpIDwgbWF4Y291bnQgJiYgaTxudW1TaGFkZXJzIDtpKyspeworICAgICAgICAgICAgc2hhZGVyc1tpXSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRMb2NhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHNoYWRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIGludCBHTF9BUElFTlRSWSBnbEdldEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpeworICAgICBHRVRfQ1RYX1JFVCgtMSk7CisgICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsUHJvZ3JhbU5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZSA9PSAwLCBHTF9JTlZBTElEX1ZBTFVFLCAtMSk7CisgICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpICE9IFBST0dSQU1fREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0lOVkFMSURfT1BFUkFUSU9OLCAtMSk7CisgICAgICAgICBQcm9ncmFtRGF0YSogcERhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisgICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihwRGF0YS0+Z2V0TGlua1N0YXR1cygpICE9IEdMX1RSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTiwgLTEpOworICAgICAgICAgcmV0dXJuIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0QXR0cmliTG9jYXRpb24oZ2xvYmFsUHJvZ3JhbU5hbWUsIG5hbWUpOworICAgICB9CisgICAgIHJldHVybiAtMTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBwYXJhbXMpeworICAgIEdFVF9DVFgoKTsKKworICAgIGlmIChjdHgtPmdsR2V0Qm9vbGVhbnYocG5hbWUscGFyYW1zKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2gocG5hbWUpCisgICAgeworICAgICAgICBjYXNlIEdMX1NIQURFUl9DT01QSUxFUjoKKyAgICAgICAgY2FzZSBHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFM6CisgICAgICAgIGNhc2UgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUzoKKyAgICAgICAgY2FzZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAgICAgY2FzZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTOgorICAgICAgICBjYXNlIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlM6CisgICAgICAgICAgICBpZihjdHgtPmdldENhcHMoKS0+R0xfQVJCX0VTMl9DT01QQVRJQklMSVRZKQorICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0Qm9vbGVhbnYocG5hbWUscGFyYW1zKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHTGludCBpcGFyYW07CisgICAgICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihwbmFtZSwmaXBhcmFtKTsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gKGlwYXJhbSAhPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEJvb2xlYW52KHBuYW1lLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU3YyVmFsaWRhdGU6OmJ1ZmZlclRhcmdldCh0YXJnZXQpICYmIEdMRVN2MlZhbGlkYXRlOjpidWZmZXJQYXJhbShwbmFtZSkpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCFjdHgtPmlzQmluZGVkQnVmZmVyKHRhcmdldCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIHN3aXRjaChwbmFtZSkgeworICAgIGNhc2UgR0xfQlVGRkVSX1NJWkU6CisgICAgICAgIGN0eC0+Z2V0QnVmZmVyU2l6ZSh0YXJnZXQscGFyYW1zKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9CVUZGRVJfVVNBR0U6CisgICAgICAgIGN0eC0+Z2V0QnVmZmVyVXNhZ2UodGFyZ2V0LHBhcmFtcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCitHTF9BUElDQUxMIEdMZW51bSBHTF9BUElFTlRSWSBnbEdldEVycm9yKHZvaWQpeworICAgIEdFVF9DVFhfUkVUKEdMX05PX0VSUk9SKQorICAgIEdMZW51bSBlcnIgPSBjdHgtPmdldEdMZXJyb3IoKTsKKyAgICBpZihlcnIgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgY3R4LT5zZXRHTGVycm9yKEdMX05PX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0RXJyb3IoKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyl7CisgICAgR0VUX0NUWCgpOworCisgICAgaWYgKGN0eC0+Z2xHZXRGbG9hdHYocG5hbWUscGFyYW1zKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgR0xpbnQgaTsKKworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX0NVUlJFTlRfUFJPR1JBTToKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkc6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQklORElORzoKKyAgICAgICAgZ2xHZXRJbnRlZ2VydihwbmFtZSwmaSk7CisgICAgICAgICpwYXJhbXMgPSAoR0xmbG9hdClpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KWdldENvbXByZXNzZWRGb3JtYXRzKE5VTEwpOyAKKyAgICAgICAgYnJlYWs7ICAgIAorICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBucGFyYW1zID0gZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCk7CisgICAgICAgICAgICBpZiAobnBhcmFtcz4wKSB7CisgICAgICAgICAgICAgICAgaW50ICogaXBhcmFtcyA9IG5ldyBpbnRbbnBhcmFtc107CisgICAgICAgICAgICAgICAgZ2V0Q29tcHJlc3NlZEZvcm1hdHMoaXBhcmFtcyk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5wYXJhbXM7IGkrKykgcGFyYW1zW2ldID0gKEdMZmxvYXQpaXBhcmFtc1tpXTsKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gaXBhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfU0hBREVSX0NPTVBJTEVSOgorICAgIGNhc2UgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTOgorICAgIGNhc2UgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUzoKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgorICAgIGNhc2UgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUzoKKyAgICBjYXNlIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlM6CisgICAgICAgIGlmKGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfRVMyX0NPTVBBVElCSUxJVFkpCisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEZsb2F0dihwbmFtZSxwYXJhbXMpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYocG5hbWUsJmkpOworICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KWk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLOgorICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSzoKKyAgICBjYXNlIEdMX1NURU5DSUxfVkFMVUVfTUFTSzoKKyAgICBjYXNlIEdMX1NURU5DSUxfV1JJVEVNQVNLOgorICAgICAgICB7CisgICAgICAgICAgICBHTGludCBteWludCA9IDA7CisgICAgICAgICAgICBnbEdldEludGVnZXJ2KHBuYW1lLCAmbXlpbnQpOworICAgICAgICAgICAgLy8gVHdvIGNhc3RzIGFyZSB1c2VkOiBzaW5jZSBtYXNrIGlzIHVuc2lnbmVkIGludGVnZXIsCisgICAgICAgICAgICAvLyB0aGUgZmlyc3QgY2FzdCBjb252ZXJ0cyB0byB1bnNpZ25lZCBpbnRlZ2VyOworICAgICAgICAgICAgLy8gdGhlIHNlY29uZCBjYXN0IGNvbnZlcnRzIHRvIGZsb2F0LgorICAgICAgICAgICAgKnBhcmFtcyA9IChHTGZsb2F0KSgoR0x1aW50KShteWludCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGbG9hdHYocG5hbWUscGFyYW1zKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpeworICAgIGludCBkZXN0cm95Q3R4ID0gMDsKKyAgICBHRVRfQ1RYKCk7CisKKyAgICBpZiAoIWN0eCkgeworICAgICAgICBjdHggPSBjcmVhdGVHTEVTQ29udGV4dCgpOworICAgICAgICBpZiAoY3R4KQorICAgICAgICAgICAgZGVzdHJveUN0eCA9IDE7CisgICAgfQorICAgIGlmIChjdHgtPmdsR2V0SW50ZWdlcnYocG5hbWUscGFyYW1zKSkKKyAgICB7CisgICAgICAgIGlmIChkZXN0cm95Q3R4KQorICAgICAgICAgICAgZGVsZXRlR0xFU0NvbnRleHQoY3R4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgIAorICAgIGJvb2wgZXMyID0gY3R4LT5nZXRDYXBzKCktPkdMX0FSQl9FUzJfQ09NUEFUSUJJTElUWTsKKyAgICBHTGludCBpOworCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfQ1VSUkVOVF9QUk9HUkFNOgorICAgICAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYocG5hbWUsJmkpOworICAgICAgICAgICAgKnBhcmFtcyA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRMb2NhbE5hbWUoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQklORElORzoKKyAgICAgICAgaWYgKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLCZpKTsKKyAgICAgICAgICAgICpwYXJhbXMgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0TG9jYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSLCBpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HOgorICAgICAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYocG5hbWUsJmkpOworICAgICAgICAgICAgKnBhcmFtcyA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRMb2NhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSLCBpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgorICAgICAgICAqcGFyYW1zID0gZ2V0Q29tcHJlc3NlZEZvcm1hdHMoTlVMTCk7IAorICAgICAgICBicmVhazsgICAgCisgICAgY2FzZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKKyAgICAgICAgZ2V0Q29tcHJlc3NlZEZvcm1hdHMocGFyYW1zKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1NIQURFUl9DT01QSUxFUjoKKyAgICAgICAgaWYoZXMyKQorICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcGFyYW1zID0gMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1NIQURFUl9CSU5BUllfRk9STUFUUzoKKyAgICAgICAgaWYoZXMyKQorICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUzoKKyAgICAgICAgaWYoZXMyKQorICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgorICAgICAgICBpZihlczIpCisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLHBhcmFtcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwYXJhbXMgPSAxMjg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9NQVhfVkFSWUlOR19WRUNUT1JTOgorICAgICAgICBpZihlczIpCisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLHBhcmFtcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwYXJhbXMgPSA4OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAgICAgaWYoZXMyKQorICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcGFyYW1zID0gMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUzoKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihwbmFtZSxwYXJhbXMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KHBuYW1lLHBhcmFtcyk7CisgICAgfQorICAgIGlmIChkZXN0cm95Q3R4KQorICAgICAgICAgICAgZGVsZXRlR0xFU0NvbnRleHQoY3R4KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgR0xFU3YyVmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSAmJgorICAgICAgICAgICAgICAgICAgIEdMRVN2MlZhbGlkYXRlOjpmcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbXMocG5hbWUpKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgLy8KKyAgICAvLyBUYWtlIHRoZSBhdHRhY2htZW50IGF0dHJpYnV0ZSBmcm9tIG91ciBzdGF0ZSAtIGlmIGF2YWlsYWJsZQorICAgIC8vCisgICAgR0x1aW50IGZiTmFtZSA9IGN0eC0+Z2V0RnJhbWVidWZmZXJCaW5kaW5nKCk7CisgICAgU0VUX0VSUk9SX0lGICghZmJOYW1lLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgaWYgKGZiTmFtZSkgeworICAgICAgICBhdXRvIGZiT2JqID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgZmJOYW1lKTsKKyAgICAgICAgaWYgKGZiT2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEZyYW1lYnVmZmVyRGF0YSAqZmJEYXRhID0gKEZyYW1lYnVmZmVyRGF0YSAqKWZiT2JqOworICAgICAgICAgICAgR0xlbnVtIHRhcmdldDsKKyAgICAgICAgICAgIEdMdWludCBuYW1lID0gZmJEYXRhLT5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnQsICZ0YXJnZXQsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUk9SX0lGKHBuYW1lICE9IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuYW1lICE9IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUsIEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG5hbWUgPT0gR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSkgeworICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gR0xfVEVYVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXQgPT0gR0xfUkVOREVSQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgICAgICpwYXJhbXMgPSBHTF9SRU5ERVJCVUZGRVI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gR0xfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwbmFtZSA9PSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSB7CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IG5hbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsYXR0YWNobWVudCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU3YyVmFsaWRhdGU6OnJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpICYmIEdMRVN2MlZhbGlkYXRlOjpyZW5kZXJidWZmZXJQYXJhbXMocG5hbWUpKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIGlzIGEgcmVuZGVyYnVmZmVyIHdoaWNoIGlzIGVnbGltYWdlJ3MgdGFyZ2V0LCB3ZQorICAgIC8vIHNob3VsZCBxdWVyeSB0aGUgdW5kZXJseWluZyBlZ2xpbWFnZSdzIHRleHR1cmUgb2JqZWN0IGluc3RlYWQuCisgICAgLy8KKyAgICBHTHVpbnQgcmIgPSBjdHgtPmdldFJlbmRlcmJ1ZmZlckJpbmRpbmcoKTsKKyAgICBpZiAocmIpIHsKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJiKTsKKyAgICAgICAgUmVuZGVyYnVmZmVyRGF0YSAqcmJEYXRhID0gKFJlbmRlcmJ1ZmZlckRhdGEgKilvYmpEYXRhOworICAgICAgICBpZiAocmJEYXRhICYmIHJiRGF0YS0+ZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QpIHsKKyAgICAgICAgICAgIEdMZW51bSB0ZXhQbmFtZTsKKyAgICAgICAgICAgIHN3aXRjaChwbmFtZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1dJRFRIOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfV0lEVEg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0hFSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0hFSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRToKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX1JFRF9TSVpFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfR1JFRU5fU0laRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfQkxVRV9TSVpFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFOgorICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSA9IEdMX1RFWFRVUkVfQUxQSEFfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRToKKyAgICAgICAgICAgICAgICAgICAgdGV4UG5hbWUgPSBHTF9URVhUVVJFX0RFUFRIX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRToKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAqcGFyYW1zID0gMDsgLy9YWFgKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0xpbnQgcHJldlRleDsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0SW50ZWdlcnYoR0xfVEVYVFVSRV9CSU5ESU5HXzJELCAmcHJldlRleCk7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiRGF0YS0+ZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QtPmdldEdsb2JhbE5hbWUoKSk7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleExldmVsUGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhQbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBwcmV2VGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LHBuYW1lLHBhcmFtcyk7Cit9CisKKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1pdihHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6cHJvZ3JhbVBhcmFtKHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxQcm9ncmFtTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsUHJvZ3JhbU5hbWU9PTAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBzd2l0Y2gocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9ERUxFVEVfU1RBVFVTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKCFvYmpEYXRhLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSAhPSBQUk9HUkFNX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgUHJvZ3JhbURhdGEqIHByb2dyYW1EYXRhID0gKFByb2dyYW1EYXRhKilvYmpEYXRhOworICAgICAgICAgICAgcGFyYW1zWzBdID0gcHJvZ3JhbURhdGEtPmdldERlbGV0ZVN0YXR1cygpID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTElOS19TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYoIW9iakRhdGEsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpICE9IFBST0dSQU1fREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbURhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisgICAgICAgICAgICBwYXJhbXNbMF0gPSBwcm9ncmFtRGF0YS0+Z2V0TGlua1N0YXR1cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vdmFsaWRhdGUgc3RhdHVzIHNob3VsZCBub3QgcmV0dXJuIEdMX1RSVUUgaWYgbGluayBmYWlsZWQKKyAgICAgICAgY2FzZSBHTF9WQUxJREFURV9TVEFUVVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYoIW9iakRhdGEsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpICE9IFBST0dSQU1fREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbURhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisgICAgICAgICAgICBpZiAocHJvZ3JhbURhdGEtPmdldExpbmtTdGF0dXMoKSA9PSBHTF9UUlVFKQorICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UHJvZ3JhbWl2KGdsb2JhbFByb2dyYW1OYW1lLCBwbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgeworICAgICAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKCFvYmpEYXRhLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSAhPSBQUk9HUkFNX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgUHJvZ3JhbURhdGEqIHByb2dyYW1EYXRhID0gKFByb2dyYW1EYXRhKilvYmpEYXRhOworICAgICAgICAgICAgR0xpbnQgbG9nTGVuZ3RoID0gc3RybGVuKHByb2dyYW1EYXRhLT5nZXRJbmZvTG9nKCkpOworICAgICAgICAgICAgcGFyYW1zWzBdID0gKGxvZ0xlbmd0aCA+IDApID8gbG9nTGVuZ3RoICsgMSA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgICAKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UHJvZ3JhbWl2KGdsb2JhbFByb2dyYW1OYW1lLHBuYW1lLHBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtSW5mb0xvZyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyl7CisgICAgR0VUX0NUWCgpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxQcm9ncmFtTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsUHJvZ3JhbU5hbWU9PTAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKCFvYmpEYXRhICxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbURhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisKKyAgICAgICAgaWYgKGJ1ZnNpemU9PTApIHsKKyAgICAgICAgICAgIGlmIChsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAqbGVuZ3RoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEdMc2l6ZWkgbG9nTGVuZ3RoOworICAgICAgICBsb2dMZW5ndGggPSBzdHJsZW4ocHJvZ3JhbURhdGEtPmdldEluZm9Mb2coKSk7CisgICAgICAgIAorICAgICAgICBHTHNpemVpIHJldHVybkxlbmd0aD0wOworICAgICAgICBpZiAoaW5mb2xvZykgeworICAgICAgICAgICAgcmV0dXJuTGVuZ3RoID0gYnVmc2l6ZS0xIDwgbG9nTGVuZ3RoID8gYnVmc2l6ZS0xIDogbG9nTGVuZ3RoOworICAgICAgICAgICAgc3RybmNweShpbmZvbG9nLHByb2dyYW1EYXRhLT5nZXRJbmZvTG9nKCkscmV0dXJuTGVuZ3RoKzEpOworICAgICAgICAgICAgaW5mb2xvZ1tyZXR1cm5MZW5ndGhdID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgICAgICAqbGVuZ3RoID0gcmV0dXJuTGVuZ3RoOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyaXYoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFNoYWRlck5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBpZiAocG5hbWUgPT0gR0xfREVMRVRFX1NUQVRVUykgeworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFNoYWRlck5hbWUgPT0gMCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRighb2JqRGF0YSAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9U0hBREVSX0RBVEEsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICBTaGFkZXJQYXJzZXIqIHNwID0gKFNoYWRlclBhcnNlciopb2JqRGF0YTsKKyAgICAgICAgICAgIHBhcmFtc1swXSAgPSAoc3AtPmdldERlbGV0ZVN0YXR1cygpKSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsU2hhZGVyTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHN3aXRjaChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX0lORk9fTE9HX0xFTkdUSDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKCFvYmpEYXRhLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSAhPSBTSEFERVJfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICBTaGFkZXJQYXJzZXIqIHNwID0gKFNoYWRlclBhcnNlciopb2JqRGF0YTsKKyAgICAgICAgICAgIEdMaW50IGxvZ0xlbmd0aCA9IHN0cmxlbihzcC0+Z2V0SW5mb0xvZygpKTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IChsb2dMZW5ndGggPiAwKSA/IGxvZ0xlbmd0aCArIDEgOiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRighb2JqRGF0YSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKG9iakRhdGEtPmdldERhdGFUeXBlKCkgIT0gU0hBREVSX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgU2hhZGVyUGFyc2VyKiBzcCA9IChTaGFkZXJQYXJzZXIqKW9iakRhdGE7CisgICAgICAgICAgICBHTGludCBzcmNMZW5ndGggPSBzcC0+Z2V0T3JpZ2luYWxTcmMoKS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IChzcmNMZW5ndGggPiAwKSA/IHNyY0xlbmd0aCArIDEgOiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFNoYWRlcml2KGdsb2JhbFNoYWRlck5hbWUscG5hbWUscGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVySW5mb0xvZyhHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFNoYWRlck5hbWUgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0R2xvYmFsTmFtZSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsU2hhZGVyTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHNoYWRlcik7CisgICAgICAgIFNFVF9FUlJPUl9JRighb2JqRGF0YSAsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9U0hBREVSX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBTaGFkZXJQYXJzZXIqIHNwID0gKFNoYWRlclBhcnNlciopb2JqRGF0YTsKKworICAgICAgICBpZiAoYnVmc2l6ZT09MCkgeworICAgICAgICAgICAgaWYgKGxlbmd0aCkgeworICAgICAgICAgICAgICAgICpsZW5ndGggPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgR0xzaXplaSBsb2dMZW5ndGg7CisgICAgICAgIGxvZ0xlbmd0aCA9IHN0cmxlbihzcC0+Z2V0SW5mb0xvZygpKTsKKyAgICAgICAgCisgICAgICAgIEdMc2l6ZWkgcmV0dXJuTGVuZ3RoPTA7CisgICAgICAgIGlmIChpbmZvbG9nKSB7CisgICAgICAgICAgICByZXR1cm5MZW5ndGggPSBidWZzaXplLTEgPGxvZ0xlbmd0aCA/IGJ1ZnNpemUtMSA6IGxvZ0xlbmd0aDsKKyAgICAgICAgICAgIHN0cm5jcHkoaW5mb2xvZyxzcC0+Z2V0SW5mb0xvZygpLHJldHVybkxlbmd0aCsxKTsKKyAgICAgICAgICAgIGluZm9sb2dbcmV0dXJuTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbmd0aCkgeworICAgICAgICAgICAgKmxlbmd0aCA9IHJldHVybkxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbil7CisgICAgR0VUX0NUWF9WMigpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjpzaGFkZXJUeXBlKHNoYWRlcnR5cGUpICYmIEdMRVN2MlZhbGlkYXRlOjpwcmVjaXNpb25UeXBlKHByZWNpc2lvbnR5cGUpKSxHTF9JTlZBTElEX0VOVU0pOworCisgICAgc3dpdGNoIChwcmVjaXNpb250eXBlKSB7CisgICAgY2FzZSBHTF9MT1dfSU5UOgorICAgIGNhc2UgR0xfTUVESVVNX0lOVDoKKyAgICBjYXNlIEdMX0hJR0hfSU5UOgorICAgICAgICByYW5nZVswXSA9IHJhbmdlWzFdID0gMTY7CisgICAgICAgICpwcmVjaXNpb24gPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgR0xfTE9XX0ZMT0FUOgorICAgIGNhc2UgR0xfTUVESVVNX0ZMT0FUOgorICAgIGNhc2UgR0xfSElHSF9GTE9BVDoKKyAgICAgICAgaWYoY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoc2hhZGVydHlwZSxwcmVjaXNpb250eXBlLHJhbmdlLHByZWNpc2lvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYW5nZVswXSA9IHJhbmdlWzFdID0gMTI3OworICAgICAgICAgICAgKnByZWNpc2lvbiA9IDI0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpeworICAgIEdFVF9DVFgoKTsKKyAgICBpZihjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsU2hhZGVyTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHNoYWRlcik7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxTaGFkZXJOYW1lID09IDAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoIW9iakRhdGEsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKG9iakRhdGEtPmdldERhdGFUeXBlKCkgIT0gU0hBREVSX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMgPQorICAgICAgICAgICAgICAgICgoU2hhZGVyUGFyc2VyKilvYmpEYXRhKS0+Z2V0T3JpZ2luYWxTcmMoKTsKKyAgICAgICAgaW50IHNyY0xlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oc3JjLnNpemUoKSk7CisKKyAgICAgICAgaW50IHJldHVybkxlbmd0aCA9IGJ1ZnNpemUgPCBzcmNMZW5ndGggPyBidWZzaXplIC0gMSA6IHNyY0xlbmd0aDsKKyAgICAgICAgaWYgKHJldHVybkxlbmd0aCkgeworICAgICAgICAgICAgc3RybmNweShzb3VyY2UsIHNyYy5jX3N0cigpLCByZXR1cm5MZW5ndGgpOworICAgICAgICAgICAgc291cmNlW3JldHVybkxlbmd0aF0gPSAnXDAnOworICAgICAgIH0KKworICAgICAgIGlmIChsZW5ndGgpCisgICAgICAgICAgKmxlbmd0aCA9IHJldHVybkxlbmd0aDsKKyAgICB9Cit9CisKKworR0xfQVBJQ0FMTCBjb25zdCBHTHVieXRlKiBHTF9BUElFTlRSWSBnbEdldFN0cmluZyhHTGVudW0gbmFtZSl7CisgICAgR0VUX0NUWF9SRVQoTlVMTCkKKyAgICBzdGF0aWMgY29uc3QgR0x1Ynl0ZSBTSEFESU5HW10gPSAiT3BlbkdMIEVTIEdMU0wgRVMgMS4wLjE3IjsKKyAgICBzd2l0Y2gobmFtZSkgeworICAgICAgICBjYXNlIEdMX1ZFTkRPUjoKKyAgICAgICAgICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopY3R4LT5nZXRWZW5kb3JTdHJpbmcoKTsKKyAgICAgICAgY2FzZSBHTF9SRU5ERVJFUjoKKyAgICAgICAgICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopY3R4LT5nZXRSZW5kZXJlclN0cmluZygpOworICAgICAgICBjYXNlIEdMX1ZFUlNJT046CisgICAgICAgICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWN0eC0+Z2V0VmVyc2lvblN0cmluZygpOworICAgICAgICBjYXNlIEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTjoKKyAgICAgICAgICAgIHJldHVybiBTSEFESU5HOworICAgICAgICBjYXNlIEdMX0VYVEVOU0lPTlM6CisgICAgICAgICAgICByZXR1cm4gKGNvbnN0IEdMdWJ5dGUqKWN0eC0+Z2V0RXh0ZW5zaW9uU3RyaW5nKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRih0cnVlLEdMX0lOVkFMSURfRU5VTSxOVUxMKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0KHRhcmdldCkgJiYgR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVQYXJhbXMocG5hbWUpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LHBuYW1lLHBhcmFtcyk7CisKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldCh0YXJnZXQpICYmIEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlUGFyYW1zKHBuYW1lKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKGxvY2F0aW9uIDwgMCxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFByb2dyYW1OYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9UFJPR1JBTV9EQVRBLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgUHJvZ3JhbURhdGEqIHBEYXRhID0gKFByb2dyYW1EYXRhICopb2JqRGF0YTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKHBEYXRhLT5nZXRMaW5rU3RhdHVzKCkgIT0gR0xfVFJVRSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VW5pZm9ybWZ2KGdsb2JhbFByb2dyYW1OYW1lLGxvY2F0aW9uLHBhcmFtcyk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWl2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRihsb2NhdGlvbiA8IDAsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxQcm9ncmFtTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYoZ2xvYmFsUHJvZ3JhbU5hbWU9PTAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBwcm9ncmFtKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKG9iakRhdGEtPmdldERhdGFUeXBlKCkhPVBST0dSQU1fREFUQSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFByb2dyYW1EYXRhKiBwRGF0YSA9IChQcm9ncmFtRGF0YSAqKW9iakRhdGE7CisgICAgICAgIFNFVF9FUlJPUl9JRihwRGF0YS0+Z2V0TGlua1N0YXR1cygpICE9IEdMX1RSVUUsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFVuaWZvcm1pdihnbG9iYWxQcm9ncmFtTmFtZSxsb2NhdGlvbixwYXJhbXMpOworICAgIH0KK30KKworR0xfQVBJQ0FMTCBpbnQgR0xfQVBJRU5UUlkgZ2xHZXRVbmlmb3JtTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSl7CisgICAgR0VUX0NUWF9SRVQoLTEpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxQcm9ncmFtTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSwtMSk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04sLTEpOworICAgICAgICBQcm9ncmFtRGF0YSogcERhdGEgPSAoUHJvZ3JhbURhdGEgKilvYmpEYXRhOworICAgICAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRihwRGF0YS0+Z2V0TGlua1N0YXR1cygpICE9IEdMX1RSVUUsR0xfSU5WQUxJRF9PUEVSQVRJT04sLTEpOworICAgICAgICByZXR1cm4gY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRVbmlmb3JtTG9jYXRpb24oZ2xvYmFsUHJvZ3JhbU5hbWUsbmFtZSk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGJvb2wgc19pbnZhbGlkVmVydGV4QXR0cmliSW5kZXgoR0x1aW50IGluZGV4KSB7CisgICAgR0xpbnQgcGFyYW09MDsKKyAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfQVRUUklCUywgJnBhcmFtKTsKKyAgICByZXR1cm4gKHBhcmFtIDwgMCB8fCBpbmRleCA+PSAoR0x1aW50KXBhcmFtKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYmZ2KEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpeworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBTRVRfRVJST1JfSUYoc19pbnZhbGlkVmVydGV4QXR0cmliSW5kZXgoaW5kZXgpLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBjb25zdCBHTEVTcG9pbnRlciogcCA9IGN0eC0+Z2V0UG9pbnRlcihpbmRleCk7CisgICAgaWYocCkgeworICAgICAgICBzd2l0Y2gocG5hbWUpeworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBwLT5pc0VuYWJsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOgorICAgICAgICAgICAgKnBhcmFtcyA9IHAtPmdldFNpemUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFOgorICAgICAgICAgICAgKnBhcmFtcyA9IHAtPmdldFN0cmlkZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFOgorICAgICAgICAgICAgKnBhcmFtcyA9IHAtPmdldFR5cGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBwLT5pc05vcm1hbGl6ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCOgorICAgICAgICAgICAgaWYoaW5kZXggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYXR0MCA9IGN0eC0+Z2V0QXR0MCgpOworICAgICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gYXR0MFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFZlcnRleEF0dHJpYmZ2KGluZGV4LHBuYW1lLHBhcmFtcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGN0eC0+c2V0R0xlcnJvcihHTF9JTlZBTElEX0VOVU0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5zZXRHTGVycm9yKEdMX0lOVkFMSURfVkFMVUUpOworICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbEdldFZlcnRleEF0dHJpYml2KEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYX1YyKCk7CisgICAgU0VUX0VSUk9SX0lGKHNfaW52YWxpZFZlcnRleEF0dHJpYkluZGV4KGluZGV4KSwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgY29uc3QgR0xFU3BvaW50ZXIqIHAgPSBjdHgtPmdldFBvaW50ZXIoaW5kZXgpOworICAgIGlmKHApIHsKKyAgICAgICAgc3dpdGNoKHBuYW1lKXsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgICAgICAgKnBhcmFtcyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQ6CisgICAgICAgICAgICAqcGFyYW1zID0gcC0+aXNFbmFibGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRToKKyAgICAgICAgICAgICpwYXJhbXMgPSBwLT5nZXRTaXplKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERToKKyAgICAgICAgICAgICpwYXJhbXMgPSBwLT5nZXRTdHJpZGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRToKKyAgICAgICAgICAgICpwYXJhbXMgPSBwLT5nZXRUeXBlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQ6CisgICAgICAgICAgICAqcGFyYW1zID0gcC0+aXNOb3JtYWxpemUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQjoKKyAgICAgICAgICAgIGlmKGluZGV4ID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGF0dDAgPSBjdHgtPmdldEF0dDAoKTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTw0OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IChHTGludClhdHQwW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgscG5hbWUscGFyYW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3R4LT5zZXRHTGVycm9yKEdMX0lOVkFMSURfRU5VTSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnNldEdMZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYocG5hbWUgIT0gR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSLEdMX0lOVkFMSURfRU5VTSk7CisgICAgU0VUX0VSUk9SX0lGKCghR0xFU3YyVmFsaWRhdGU6OmFycmF5SW5kZXgoY3R4LGluZGV4KSksR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICBjb25zdCBHTEVTcG9pbnRlciogcCA9IGN0eC0+Z2V0UG9pbnRlcihpbmRleCk7CisgICAgaWYocCkgeworICAgICAgICAqcG9pbnRlciA9IGNvbnN0X2Nhc3Q8dm9pZCAqPiggcC0+Z2V0QnVmZmVyRGF0YSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnNldEdMZXJyb3IoR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsSGludChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmhpbnRUYXJnZXRNb2RlKHRhcmdldCxtb2RlKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsSGludCh0YXJnZXQsbW9kZSk7Cit9CisKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkKEdMZW51bSBjYXApeworICAgIEdFVF9DVFhfUkVUKEdMX0ZBTFNFKTsKKyAgICBSRVRfQU5EX1NFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OmNhcGFiaWxpdHkoY2FwKSxHTF9JTlZBTElEX0VOVU0sR0xfRkFMU0UpOworICAgIHJldHVybiBjdHgtPmRpc3BhdGNoZXIoKS5nbElzRW5hYmxlZChjYXApOworfQorCitHTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzQnVmZmVyKEdMdWludCBidWZmZXIpeworICAgIEdFVF9DVFhfUkVUKEdMX0ZBTFNFKQorICAgIGlmKGJ1ZmZlciAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUiwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG9iakRhdGEgPyAoKEdMRVNidWZmZXIqKW9iakRhdGEpLT53YXNCaW5kZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdMX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gR0xfRkFMU0U7Cit9CisKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpeworICAgIEdFVF9DVFhfUkVUKEdMX0ZBTFNFKQorICAgIGlmKGZyYW1lYnVmZmVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKXsKKyAgICAgICAgcmV0dXJuIChjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIpICYmCisgICAgICAgICAgICAgICAgY3R4LT5nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKSA9PSBmcmFtZWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBHTF9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgIDogR0xfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1JlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKXsKKyAgICBHRVRfQ1RYX1JFVChHTF9GQUxTRSkKKyAgICBpZihyZW5kZXJidWZmZXIgJiYgY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpeworICAgICAgICByZXR1cm4gKGN0eC0+c2hhcmVHcm91cCgpLT5pc09iamVjdChOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVyKSAmJgorICAgICAgICAgICAgICAgIGN0eC0+Z2V0UmVuZGVyYnVmZmVyQmluZGluZygpID09IHJlbmRlcmJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgPyBHTF9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgIDogR0xfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUoR0x1aW50IHRleHR1cmUpeworICAgIEdFVF9DVFhfUkVUKEdMX0ZBTFNFKQorICAgIGlmICh0ZXh0dXJlPT0wKQorICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgVGV4dHVyZURhdGEqIHRleCA9IGdldFRleHR1cmVEYXRhKHRleHR1cmUpOworICAgIHJldHVybiB0ZXggPyB0ZXgtPndhc0JvdW5kIDogR0xfRkFMU0U7Cit9CisKK0dMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtKEdMdWludCBwcm9ncmFtKXsKKyAgICBHRVRfQ1RYX1JFVChHTF9GQUxTRSkKKyAgICBpZiAocHJvZ3JhbSAmJiBjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSAmJgorICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFByb2dyYW1OYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIHJldHVybiBjdHgtPmRpc3BhdGNoZXIoKS5nbElzUHJvZ3JhbShnbG9iYWxQcm9ncmFtTmFtZSk7CisgICAgfQorICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1NoYWRlcihHTHVpbnQgc2hhZGVyKXsKKyAgICBHRVRfQ1RYX1JFVChHTF9GQUxTRSkKKyAgICBpZiAoc2hhZGVyICYmIGN0eC0+c2hhcmVHcm91cCgpLmdldCgpICYmCisgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5pc09iamVjdChOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxTaGFkZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuIGN0eC0+ZGlzcGF0Y2hlcigpLmdsSXNTaGFkZXIoZ2xvYmFsU2hhZGVyTmFtZSk7CisgICAgfQorICAgIHJldHVybiBHTF9GQUxTRTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbExpbmVXaWR0aChHTGZsb2F0IHdpZHRoKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xMaW5lV2lkdGgod2lkdGgpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsTGlua1Byb2dyYW0oR0x1aW50IHByb2dyYW0peworICAgIEdFVF9DVFgoKTsKKyAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFByb2dyYW1OYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRighb2JqRGF0YSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9UFJPR1JBTV9EQVRBLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFByb2dyYW1EYXRhKiBwcm9ncmFtRGF0YSA9IChQcm9ncmFtRGF0YSopb2JqRGF0YTsKKyAgICAgICAgR0xpbnQgZnJhZ21lbnRTaGFkZXIgICA9IHByb2dyYW1EYXRhLT5nZXRBdHRhY2hlZEZyYWdtZW50U2hhZGVyKCk7CisgICAgICAgIEdMaW50IHZlcnRleFNoYWRlciA9ICBwcm9ncmFtRGF0YS0+Z2V0QXR0YWNoZWRWZXJ0ZXhTaGFkZXIoKTsKKyAgICAgICAgaWYgKHZlcnRleFNoYWRlciAhPSAwICYmIGZyYWdtZW50U2hhZGVyIT0wKSB7CisgICAgICAgICAgICAvKiB2YWxpZGF0aW5nIHRoYXQgdGhlIGZyYWdtZW50ICYgdmVydGV4IHNoYWRlcnMgd2VyZSBjb21waWxlZCBzdWNjZXNzZnVseSovCisgICAgICAgICAgICBHTGludCBmQ29tcGlsZVN0YXR1cyA9IEdMX0ZBTFNFOworICAgICAgICAgICAgR0xpbnQgdkNvbXBpbGVTdGF0dXMgPSBHTF9GQUxTRTsKKyAgICAgICAgICAgIEdMdWludCBmcmFnbWVudFNoYWRlckdsb2JhbCA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBmcmFnbWVudFNoYWRlcik7CisgICAgICAgICAgICBHTHVpbnQgdmVydGV4U2hhZGVyR2xvYmFsID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHZlcnRleFNoYWRlcik7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFNoYWRlcml2KGZyYWdtZW50U2hhZGVyR2xvYmFsLEdMX0NPTVBJTEVfU1RBVFVTLCZmQ29tcGlsZVN0YXR1cyk7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFNoYWRlcml2KHZlcnRleFNoYWRlckdsb2JhbCxHTF9DT01QSUxFX1NUQVRVUywmdkNvbXBpbGVTdGF0dXMpOworCisgICAgICAgICAgICBpZihmQ29tcGlsZVN0YXR1cyAhPSAwICYmIHZDb21waWxlU3RhdHVzICE9IDApeworICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsTGlua1Byb2dyYW0oZ2xvYmFsUHJvZ3JhbU5hbWUpOworICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UHJvZ3JhbWl2KGdsb2JhbFByb2dyYW1OYW1lLEdMX0xJTktfU1RBVFVTLCZsaW5rU3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcm9ncmFtRGF0YS0+c2V0TGlua1N0YXR1cyhsaW5rU3RhdHVzKTsKKyAgICAgICAgCisgICAgICAgIEdMc2l6ZWkgaW5mb0xvZ0xlbmd0aD0wOworICAgICAgICBHTGNoYXIqIGluZm9Mb2c7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UHJvZ3JhbWl2KGdsb2JhbFByb2dyYW1OYW1lLEdMX0lORk9fTE9HX0xFTkdUSCwmaW5mb0xvZ0xlbmd0aCk7CisgICAgICAgIGluZm9Mb2cgPSBuZXcgR0xjaGFyW2luZm9Mb2dMZW5ndGgrMV07CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0UHJvZ3JhbUluZm9Mb2coZ2xvYmFsUHJvZ3JhbU5hbWUsaW5mb0xvZ0xlbmd0aCxOVUxMLGluZm9Mb2cpOworICAgICAgICBwcm9ncmFtRGF0YS0+c2V0SW5mb0xvZyhpbmZvTG9nKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaShHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCFHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxTdG9yZVBhcmFtKHBuYW1lKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRighKChwYXJhbT09MSl8fChwYXJhbT09Mil8fChwYXJhbT09NCl8fChwYXJhbT09OCkpLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBjdHgtPnNldFVucGFja0FsaWdubWVudChwYXJhbSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQaXhlbFN0b3JlaShwbmFtZSxwYXJhbSk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0KEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xQb2x5Z29uT2Zmc2V0KGZhY3Rvcix1bml0cyk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6cmVhZFBpeGVsRnJtdChmb3JtYXQpICYmIEdMRVN2MlZhbGlkYXRlOjpwaXhlbFR5cGUoY3R4LHR5cGUpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIFNFVF9FUlJPUl9JRigod2lkdGggPCAwIHx8IGhlaWdodCA8IDApLEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjpwaXhlbE9wKGZvcm1hdCx0eXBlKSksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRihnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFLCBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTik7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xSZWFkUGl4ZWxzKHgseSx3aWR0aCxoZWlnaHQsZm9ybWF0LHR5cGUscGl4ZWxzKTsKK30KKworCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKHZvaWQpeworLy8gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmsgb24gTWFjIE9TIHdpdGggTWFjT1NYMTAuOXNkaworI2lmbmRlZiBfX0FQUExFX18KKworICAgIC8qIFVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggbWVzYSB3aWxsIGNhdXNlIHBvdGVudGlhbCBidWcuIFNwZWNpZmljYWxseSwKKyAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBnbENvbXBpbGVTaGFkZXIoKSBhbmQgZ2xMaW5rUHJvZ3JhbSgpIHdpbGwKKyAgICAgKiByZWxlYXNlIHJlc291cmNlcyB0aGF0IHdvdWxkIGJlIHBvdGVudGlhbGx5IHVzZWQgYnkgZ2xMaW5rUHJvZ3JhbSwKKyAgICAgKiByZXN1bHRpbmcgaW4gYSBzZWdtZW50YXRpb24gZmF1bHQuCisgICAgICovCisgICAgY29uc3QgY2hhciogZW52ID0gOjpnZXRlbnYoIkFORFJPSURfR0xfTElCIik7CisgICAgaWYgKGVudiAmJiAhc3RyY21wKGVudiwgIm1lc2EiKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgR0VUX0NUWCgpOworCisgICAgaWYoY3R4LT5kaXNwYXRjaGVyKCkuZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7CisgICAgfQorI2VuZGlmIC8vICFfX0FQUExFX18KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCl7CisgICAgR0VUX0NUWCgpOworICAgIEdMZW51bSBpbnRlcm5hbCA9IGludGVybmFsZm9ybWF0OworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICBjYXNlIEdMX1JHQjU2NToKKyAgICAgICAgaW50ZXJuYWwgPSBHTF9SR0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfUkdCNV9BMToKKyAgICAgICAgaW50ZXJuYWwgPSBHTF9SR0JBOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpbnRlcm5hbCA9IGludGVybmFsZm9ybWF0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBHZXQgY3VycmVudCBib3VuZGVkIHJlbmRlcmJ1ZmZlcgorICAgIC8vIHJhaXNlIElOVkFMSURfT1BFUkFUSU9uIGlmIG5vIHJlbmRlcmJ1ZmZlciBpcyBib3VuZGVkCisgICAgR0x1aW50IHJiID0gY3R4LT5nZXRSZW5kZXJidWZmZXJCaW5kaW5nKCk7CisgICAgU0VUX0VSUk9SX0lGKHJiID09IDAsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGF1dG8gb2JqRGF0YSA9CisgICAgICAgICAgICBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUiwgcmIpOworICAgIFJlbmRlcmJ1ZmZlckRhdGEgKnJiRGF0YSA9IChSZW5kZXJidWZmZXJEYXRhICopb2JqRGF0YTsKKyAgICBTRVRfRVJST1JfSUYoIXJiRGF0YSxHTF9JTlZBTElEX09QRVJBVElPTik7CisKKyAgICAvLworICAgIC8vIGlmIHRoZSByZW5kZXJidWZmZXIgd2FzIGFuIGVnbEltYWdlIHRhcmdldCwgcmVsZWFzZQorICAgIC8vIGl0cyB1bmRlcmx5aW5nIHRleHR1cmUuCisgICAgLy8KKyAgICByYkRhdGEtPmVnbEltYWdlR2xvYmFsVGV4T2JqZWN0LnJlc2V0KCk7CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQodGFyZ2V0LGludGVybmFsLHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZShHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU2FtcGxlQ292ZXJhZ2UodmFsdWUsaW52ZXJ0KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFNjaXNzb3IoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFNjaXNzb3IoeCx5LHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xTaGFkZXJCaW5hcnkoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCl7CisgICAgR0VUX0NUWCgpOworCisgICAgU0VUX0VSUk9SX0lGKCAoY3R4LT5kaXNwYXRjaGVyKCkuZ2xTaGFkZXJCaW5hcnkgPT0gTlVMTCksIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKXsKKyAgICAgICAgZm9yKGludCBpPTA7IGkgPCBuIDsgaSsrKXsKKyAgICAgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxTaGFkZXJOYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHNoYWRlcnNbaV0pOworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKGdsb2JhbFNoYWRlck5hbWUgPT0gMCxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU2hhZGVyQmluYXJ5KDEsJmdsb2JhbFNoYWRlck5hbWUsYmluYXJ5Zm9ybWF0LGJpbmFyeSxsZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsU2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogY29uc3QqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCl7CisgICAgR0VUX0NUWF9WMigpOworICAgIFNFVF9FUlJPUl9JRihjb3VudCA8IDAsR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpeworICAgICAgICBjb25zdCBHTHVpbnQgZ2xvYmFsU2hhZGVyTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHNoYWRlcik7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxTaGFkZXJOYW1lID09IDAsIEdMX0lOVkFMSURfVkFMVUUpOworICAgICAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgICAgICBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNLCBzaGFkZXIpOworICAgICAgICBTRVRfRVJST1JfSUYoIW9iakRhdGEsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgU0VUX0VSUk9SX0lGKG9iakRhdGEtPmdldERhdGFUeXBlKCkgIT0gU0hBREVSX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgICAgIFNoYWRlclBhcnNlciogc3AgPSAoU2hhZGVyUGFyc2VyKilvYmpEYXRhOworICAgICAgICBzcC0+c2V0U3JjKGN0eC0+Z2xzbFZlcnNpb24oKSwgY291bnQsIHN0cmluZywgbGVuZ3RoKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xTaGFkZXJTb3VyY2UoZ2xvYmFsU2hhZGVyTmFtZSwgMSwgc3AtPnBhcnNlZExpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBzcC0+Y2xlYXIoKTsKKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsRnVuYyhHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU3RlbmNpbEZ1bmMoZnVuYyxyZWYsbWFzayk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2speworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSxmdW5jLHJlZixtYXNrKTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayhHTHVpbnQgbWFzayl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU3RlbmNpbE1hc2sobWFzayk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xTdGVuY2lsTWFza1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNlLG1hc2spOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsU3RlbmNpbE9wKGZhaWwsemZhaWwsenBhc3MpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyl7CisgICAgR0VUX0NUWCgpOworICAgIHN3aXRjaCAoZmFjZSkgeworICAgICAgICBjYXNlIEdMX0ZST05UOgorICAgICAgICBjYXNlIEdMX0JBQ0s6CisgICAgICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRigxLCBHTF9JTlZBTElEX0VOVU0pOworICAgIH0KKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFN0ZW5jaWxPcFNlcGFyYXRlKGZhY2UsIGZhaWwsemZhaWwsenBhc3MpOworfQorCisjZGVmaW5lIEdMX1JHQkEzMkYgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTQKKyNkZWZpbmUgR0xfUkdCMzJGICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldEV4KHRhcmdldCkgJiYKKyAgICAgICAgICAgICAgICAgICBHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxGcm10KGN0eCxmb3JtYXQpJiYKKyAgICAgICAgICAgICAgICAgICBHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxUeXBlKGN0eCx0eXBlKSksR0xfSU5WQUxJRF9FTlVNKTsKKworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnBpeGVsSXRubEZybXQoY3R4LGludGVybmFsZm9ybWF0KSwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgU0VUX0VSUk9SX0lGKChHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZUlzQ3ViZU1hcCh0YXJnZXQpICYmIHdpZHRoICE9IGhlaWdodCksIEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRigoZm9ybWF0ID09IEdMX0RFUFRIX0NPTVBPTkVOVCB8fCBpbnRlcm5hbGZvcm1hdCA9PSBHTF9ERVBUSF9DT01QT05FTlQpICYmCisgICAgICAgICAgICAgICAgICAgICh0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUICYmIHR5cGUgIT0gR0xfVU5TSUdORURfSU5UKSwgR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgU0VUX0VSUk9SX0lGKCh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUIHx8IHR5cGUgPT0gR0xfVU5TSUdORURfSU5UKSAmJgorICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ICE9IEdMX0RFUFRIX0NPTVBPTkVOVCB8fCBpbnRlcm5hbGZvcm1hdCAhPSBHTF9ERVBUSF9DT01QT05FTlQpLCBHTF9JTlZBTElEX09QRVJBVElPTik7CisKKyAgICBTRVRfRVJST1JfSUYoIUdMRVN2MlZhbGlkYXRlOjpwaXhlbE9wKGZvcm1hdCx0eXBlKSAmJiBpbnRlcm5hbGZvcm1hdCA9PSAoKEdMaW50KWZvcm1hdCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnBpeGVsU2l6ZWRGcm10KGN0eCwgaW50ZXJuYWxmb3JtYXQsIGZvcm1hdCwgdHlwZSksIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBTRVRfRVJST1JfSUYoYm9yZGVyICE9IDAsR0xfSU5WQUxJRF9WQUxVRSk7CisKKyAgICBzX2dsSW5pdFRleEltYWdlMkQodGFyZ2V0LGxldmVsLGludGVybmFsZm9ybWF0LHdpZHRoLGhlaWdodCxib3JkZXIpOworICAgIGlmICh0eXBlPT1HTF9IQUxGX0ZMT0FUX09FUykKKyAgICAgICAgdHlwZSA9IEdMX0hBTEZfRkxPQVRfTlY7CisgICAgaWYgKHBpeGVscz09TlVMTCAmJiB0eXBlPT1HTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xKQorICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfU0hPUlQ7CisgICAgaWYgKHR5cGUgPT0gR0xfRkxPQVQpCisgICAgICAgIGludGVybmFsZm9ybWF0ID0gKGZvcm1hdCA9PSBHTF9SR0JBKSA/IEdMX1JHQkEzMkYgOiBHTF9SR0IzMkY7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhJbWFnZTJEKHRhcmdldCxsZXZlbCxpbnRlcm5hbGZvcm1hdCx3aWR0aCxoZWlnaHQsYm9yZGVyLGZvcm1hdCx0eXBlLHBpeGVscyk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0KHRhcmdldCkgJiYgR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVQYXJhbXMocG5hbWUpKSxHTF9JTlZBTElEX0VOVU0pOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4UGFyYW1ldGVyZih0YXJnZXQscG5hbWUscGFyYW0pOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCEoR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVUYXJnZXQodGFyZ2V0KSAmJiBHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVBhcmFtcyhwbmFtZSkpLEdMX0lOVkFMSURfRU5VTSk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJmdih0YXJnZXQscG5hbWUscGFyYW1zKTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0peworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldCh0YXJnZXQpICYmIEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlUGFyYW1zKHBuYW1lKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LHBuYW1lLHBhcmFtKTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6dGV4dHVyZVRhcmdldCh0YXJnZXQpICYmIEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlUGFyYW1zKHBuYW1lKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFBhcmFtZXRlcml2KHRhcmdldCxwbmFtZSxwYXJhbXMpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyl7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighKEdMRVN2MlZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgodGFyZ2V0KSksIEdMX0lOVkFMSURfRU5VTSk7CisgICAgLy8gc2V0IGFuIGVycm9yIGlmIGxldmVsIDwgMCBvciBsZXZlbCA+IGxvZyAyIG1heAorICAgIFNFVF9FUlJPUl9JRihsZXZlbCA8IDAgfHwgMTw8bGV2ZWwgPiBjdHgtPmdldE1heFRleFNpemUoKSwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgU0VUX0VSUk9SX0lGKHhvZmZzZXQgPCAwIHx8IHlvZmZzZXQgPCAwIHx8IHdpZHRoIDwgMCB8fCBoZWlnaHQgPCAwLCBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBpZiAoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgVGV4dHVyZURhdGEgKnRleERhdGEgPSBnZXRUZXh0dXJlVGFyZ2V0RGF0YSh0YXJnZXQpOworICAgICAgICBpZiAodGV4RGF0YSkgeworICAgICAgICAgICAgU0VUX0VSUk9SX0lGKHhvZmZzZXQgKyB3aWR0aCA+IChHTGludCl0ZXhEYXRhLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgeW9mZnNldCArIGhlaWdodCA+IChHTGludCl0ZXhEYXRhLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTRVRfRVJST1JfSUYoIShHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxGcm10KGN0eCxmb3JtYXQpJiYKKyAgICAgICAgICAgICAgICAgICBHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxUeXBlKGN0eCx0eXBlKSksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICBTRVRfRVJST1JfSUYoIUdMRVN2MlZhbGlkYXRlOjpwaXhlbE9wKGZvcm1hdCx0eXBlKSxHTF9JTlZBTElEX09QRVJBVElPTik7CisgICAgU0VUX0VSUk9SX0lGKCFwaXhlbHMsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIGlmICh0eXBlPT1HTF9IQUxGX0ZMT0FUX09FUykKKyAgICAgICAgdHlwZSA9IEdMX0hBTEZfRkxPQVRfTlY7CisKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFN1YkltYWdlMkQodGFyZ2V0LGxldmVsLHhvZmZzZXQseW9mZnNldCx3aWR0aCxoZWlnaHQsZm9ybWF0LHR5cGUscGl4ZWxzKTsKKworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm0xZihsb2NhdGlvbix4KTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtMWZ2KGxvY2F0aW9uLGNvdW50LHYpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtMWkobG9jYXRpb24seCk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTFpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm0xaXYobG9jYXRpb24sY291bnQsdik7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybTJmKGxvY2F0aW9uLHgseSk7Cit9CitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdil7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybTJmdihsb2NhdGlvbixjb3VudCx2KTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm0yaShsb2NhdGlvbix4LHkpOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtMml2KGxvY2F0aW9uLGNvdW50LHYpOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeil7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybTNmKGxvY2F0aW9uLHgseSx6KTsKK30KK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtM2Z2KGxvY2F0aW9uLGNvdW50LHYpOworfQorR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeil7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybTNpKGxvY2F0aW9uLHgseSx6KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtM2l2KGxvY2F0aW9uLGNvdW50LHYpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTRmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm00Zihsb2NhdGlvbix4LHkseix3KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm00ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm00ZnYobG9jYXRpb24sY291bnQsdik7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpeworICAgIEdFVF9DVFgoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFVuaWZvcm00aShsb2NhdGlvbix4LHkseix3KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFVuaWZvcm00aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KXsKKyAgICBHRVRfQ1RYKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xVbmlmb3JtNGl2KGxvY2F0aW9uLGNvdW50LHYpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYodHJhbnNwb3NlICE9IEdMX0ZBTFNFLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbixjb3VudCx0cmFuc3Bvc2UsdmFsdWUpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYodHJhbnNwb3NlICE9IEdMX0ZBTFNFLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbixjb3VudCx0cmFuc3Bvc2UsdmFsdWUpOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybU1hdHJpeDRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpeworICAgIEdFVF9DVFgoKTsKKyAgICBTRVRfRVJST1JfSUYodHJhbnNwb3NlICE9IEdMX0ZBTFNFLEdMX0lOVkFMSURfVkFMVUUpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbixjb3VudCx0cmFuc3Bvc2UsdmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBzX3VuVXNlQ3VycmVudFByb2dyYW0oKSB7CisgICAgR0VUX0NUWCgpOworICAgIEdMaW50IGxvY2FsQ3VycmVudFByb2dyYW0gPSAwOworICAgIGdsR2V0SW50ZWdlcnYoR0xfQ1VSUkVOVF9QUk9HUkFNLCAmbG9jYWxDdXJyZW50UHJvZ3JhbSk7CisgICAgaWYgKCFsb2NhbEN1cnJlbnRQcm9ncmFtKSByZXR1cm47CisKKyAgICBhdXRvIG9iakRhdGEgPSBjdHgtPnNoYXJlR3JvdXAoKS0+Z2V0T2JqZWN0RGF0YSgKKyAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIGxvY2FsQ3VycmVudFByb2dyYW0pOworICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworICAgIFByb2dyYW1EYXRhKiBwcm9ncmFtRGF0YSA9IChQcm9ncmFtRGF0YSopb2JqRGF0YTsKKyAgICBwcm9ncmFtRGF0YS0+c2V0SW5Vc2UoZmFsc2UpOworICAgIGlmIChwcm9ncmFtRGF0YS0+Z2V0RGVsZXRlU3RhdHVzKCkpIHsKKyAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmRlbGV0ZU5hbWUoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxDdXJyZW50UHJvZ3JhbSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVXNlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSl7CisgICAgR0VUX0NUWCgpOworICAgIGlmKGN0eC0+c2hhcmVHcm91cCgpLmdldCgpKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBnbG9iYWxQcm9ncmFtTmFtZSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRHbG9iYWxOYW1lKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYocHJvZ3JhbSE9MCAmJiBnbG9iYWxQcm9ncmFtTmFtZT09MCxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgYXV0byBvYmpEYXRhID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihvYmpEYXRhICYmIChvYmpEYXRhLT5nZXREYXRhVHlwZSgpIT1QUk9HUkFNX0RBVEEpLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgICAgICBzX3VuVXNlQ3VycmVudFByb2dyYW0oKTsKKworICAgICAgICBQcm9ncmFtRGF0YSogcHJvZ3JhbURhdGEgPSAoUHJvZ3JhbURhdGEqKW9iakRhdGE7CisgICAgICAgIGlmIChwcm9ncmFtRGF0YSkgcHJvZ3JhbURhdGEtPnNldEluVXNlKHRydWUpOworCisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVXNlUHJvZ3JhbShnbG9iYWxQcm9ncmFtTmFtZSk7CisgICAgfQorfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVmFsaWRhdGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgaWYoY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCkpIHsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbFByb2dyYW1OYW1lID0gY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoCisgICAgICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSwgcHJvZ3JhbSk7CisgICAgICAgIFNFVF9FUlJPUl9JRihnbG9iYWxQcm9ncmFtTmFtZT09MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIGF1dG8gb2JqRGF0YSA9IGN0eC0+c2hhcmVHcm91cCgpLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0VHlwZTo6U0hBREVSX09SX1BST0dSQU0sIHByb2dyYW0pOworICAgICAgICBTRVRfRVJST1JfSUYob2JqRGF0YS0+Z2V0RGF0YVR5cGUoKSE9UFJPR1JBTV9EQVRBLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgUHJvZ3JhbURhdGEqIHByb2dyYW1EYXRhID0gKFByb2dyYW1EYXRhKilvYmpEYXRhOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZhbGlkYXRlUHJvZ3JhbShnbG9iYWxQcm9ncmFtTmFtZSk7CisKKyAgICAgICAgR0xzaXplaSBpbmZvTG9nTGVuZ3RoPTA7CisgICAgICAgIEdMY2hhciogaW5mb0xvZzsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRQcm9ncmFtaXYoZ2xvYmFsUHJvZ3JhbU5hbWUsR0xfSU5GT19MT0dfTEVOR1RILCZpbmZvTG9nTGVuZ3RoKTsKKyAgICAgICAgaW5mb0xvZyA9IG5ldyBHTGNoYXJbaW5mb0xvZ0xlbmd0aCsxXTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRQcm9ncmFtSW5mb0xvZyhnbG9iYWxQcm9ncmFtTmFtZSxpbmZvTG9nTGVuZ3RoLE5VTEwsaW5mb0xvZyk7CisgICAgICAgIHByb2dyYW1EYXRhLT5zZXRJbmZvTG9nKGluZm9Mb2cpOworICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpeworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZlcnRleEF0dHJpYjFmKGluZHgseCk7CisgICAgaWYoaW5keCA9PSAwKQorICAgICAgICBjdHgtPnNldEF0dHJpYnV0ZTB2YWx1ZSh4LCAwLjAsIDAuMCwgMS4wKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKXsKKyAgICBHRVRfQ1RYX1YyKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xWZXJ0ZXhBdHRyaWIxZnYoaW5keCx2YWx1ZXMpOworICAgIGlmKGluZHggPT0gMCkKKyAgICAgICAgY3R4LT5zZXRBdHRyaWJ1dGUwdmFsdWUodmFsdWVzWzBdLCAwLjAsIDAuMCwgMS4wKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSl7CisgICAgR0VUX0NUWF9WMigpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVmVydGV4QXR0cmliMmYoaW5keCx4LHkpOworICAgIGlmKGluZHggPT0gMCkKKyAgICAgICAgY3R4LT5zZXRBdHRyaWJ1dGUwdmFsdWUoeCwgeSwgMC4wLCAxLjApOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliMmZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpeworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZlcnRleEF0dHJpYjJmdihpbmR4LHZhbHVlcyk7CisgICAgaWYoaW5keCA9PSAwKQorICAgICAgICBjdHgtPnNldEF0dHJpYnV0ZTB2YWx1ZSh2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgMC4wLCAxLjApOworfQorCitHTF9BUElDQUxMIHZvaWQgIEdMX0FQSUVOVFJZIGdsVmVydGV4QXR0cmliM2YoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopeworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZlcnRleEF0dHJpYjNmKGluZHgseCx5LHopOworICAgIGlmKGluZHggPT0gMCkKKyAgICAgICAgY3R4LT5zZXRBdHRyaWJ1dGUwdmFsdWUoeCwgeSwgeiwgMS4wKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjNmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKXsKKyAgICBHRVRfQ1RYX1YyKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCx2YWx1ZXMpOworICAgIGlmKGluZHggPT0gMCkKKyAgICAgICAgY3R4LT5zZXRBdHRyaWJ1dGUwdmFsdWUodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSwgMS4wKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpeworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFZlcnRleEF0dHJpYjRmKGluZHgseCx5LHosdyk7CisgICAgaWYoaW5keCA9PSAwKQorICAgICAgICBjdHgtPnNldEF0dHJpYnV0ZTB2YWx1ZSh4LCB5LCB6LCB3KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKXsKKyAgICBHRVRfQ1RYX1YyKCk7CisgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCx2YWx1ZXMpOworICAgIGlmKGluZHggPT0gMCkKKyAgICAgICAgY3R4LT5zZXRBdHRyaWJ1dGUwdmFsdWUodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSwgdmFsdWVzWzNdKTsKK30KKworR0xfQVBJQ0FMTCB2b2lkICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcHRyKXsKKyAgICBHRVRfQ1RYKCk7CisgICAgU0VUX0VSUk9SX0lGKCghR0xFU3YyVmFsaWRhdGU6OmFycmF5SW5kZXgoY3R4LGluZHgpKSxHTF9JTlZBTElEX1ZBTFVFKTsKKyAgICBpZiAodHlwZSA9PSBHTF9IQUxGX0ZMT0FUX09FUykgdHlwZSA9IEdMX0hBTEZfRkxPQVQ7CisgICAgY3R4LT5zZXRQb2ludGVyKGluZHgsc2l6ZSx0eXBlLHN0cmlkZSxwdHIsbm9ybWFsaXplZCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCAgR0xfQVBJRU5UUlkgZ2xWaWV3cG9ydChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCl7CisgICAgR0VUX0NUWCgpOworICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVmlld3BvcnQoeCx5LHdpZHRoLGhlaWdodCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCit7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRighR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVUYXJnZXRMaW1pdGVkKHRhcmdldCksR0xfSU5WQUxJRF9FTlVNKTsKKyAgICB1bnNpZ25lZCBpbnQgaW1hZ2VobmRsID0gU2FmZVVJbnRGcm9tUG9pbnRlcihpbWFnZSk7CisgICAgSW1hZ2VQdHIgaW1nID0gc19lZ2xJZmFjZS0+Z2V0RUdMSW1hZ2UoaW1hZ2VobmRsKTsKKyAgICBpZiAoaW1nKSB7CisgICAgICAgIC8vIENyZWF0ZSB0aGUgdGV4dHVyZSBvYmplY3QgaW4gdGhlIHVuZGVybHlpbmcgRUdMIGltcGxlbWVudGF0aW9uLAorICAgICAgICAvLyBmbGFnIHRvIHRoZSBPcGVuR0wgbGF5ZXIgdG8gc2tpcCB0aGUgaW1hZ2UgY3JlYXRpb24gYW5kIG1hcCB0aGUKKyAgICAgICAgLy8gY3VycmVudCBiaW5kZWQgdGV4dHVyZSBvYmplY3QgdG8gdGhlIGV4aXN0aW5nIGdsb2JhbCBvYmplY3QuCisgICAgICAgIGlmIChjdHgtPnNoYXJlR3JvdXAoKS5nZXQoKSkgeworICAgICAgICAgICAgT2JqZWN0TG9jYWxOYW1lIHRleCA9IFRleHR1cmVMb2NhbE5hbWUodGFyZ2V0LGN0eC0+Z2V0QmluZGVkVGV4dHVyZSh0YXJnZXQpKTsKKyAgICAgICAgICAgIC8vIHJlcGxhY2UgbWFwcGluZyBhbmQgYmluZCB0aGUgbmV3IGdsb2JhbCBvYmplY3QKKyAgICAgICAgICAgIGN0eC0+c2hhcmVHcm91cCgpLT5yZXBsYWNlR2xvYmFsT2JqZWN0KE5hbWVkT2JqZWN0VHlwZTo6VEVYVFVSRSwgdGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5nbG9iYWxUZXhPYmopOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBpbWctPmdsb2JhbFRleE9iai0+Z2V0R2xvYmFsTmFtZSgpKTsKKyAgICAgICAgICAgIFRleHR1cmVEYXRhICp0ZXhEYXRhID0gZ2V0VGV4dHVyZVRhcmdldERhdGEodGFyZ2V0KTsKKyAgICAgICAgICAgIFNFVF9FUlJPUl9JRih0ZXhEYXRhPT1OVUxMLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIHRleERhdGEtPndpZHRoID0gaW1nLT53aWR0aDsKKyAgICAgICAgICAgIHRleERhdGEtPmhlaWdodCA9IGltZy0+aGVpZ2h0OworICAgICAgICAgICAgdGV4RGF0YS0+Ym9yZGVyID0gaW1nLT5ib3JkZXI7CisgICAgICAgICAgICB0ZXhEYXRhLT5pbnRlcm5hbEZvcm1hdCA9IGltZy0+aW50ZXJuYWxGb3JtYXQ7CisgICAgICAgICAgICB0ZXhEYXRhLT5zb3VyY2VFR0xJbWFnZSA9IGltYWdlaG5kbDsKKyAgICAgICAgfQorICAgIH0KK30KKworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCit7CisgICAgR0VUX0NUWCgpOworICAgIFNFVF9FUlJPUl9JRih0YXJnZXQgIT0gR0xfUkVOREVSQlVGRkVSX09FUyxHTF9JTlZBTElEX0VOVU0pOworICAgIHVuc2lnbmVkIGludCBpbWFnZWhuZGwgPSBTYWZlVUludEZyb21Qb2ludGVyKGltYWdlKTsKKyAgICBJbWFnZVB0ciBpbWcgPSBzX2VnbElmYWNlLT5nZXRFR0xJbWFnZShpbWFnZWhuZGwpOworICAgIFNFVF9FUlJPUl9JRighaW1nLEdMX0lOVkFMSURfVkFMVUUpOworICAgIFNFVF9FUlJPUl9JRighY3R4LT5zaGFyZUdyb3VwKCkuZ2V0KCksR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgLy8gR2V0IGN1cnJlbnQgYm91bmRlZCByZW5kZXJidWZmZXIKKyAgICAvLyByYWlzZSBJTlZBTElEX09QRVJBVElPbiBpZiBubyByZW5kZXJidWZmZXIgaXMgYm91bmRlZAorICAgIEdMdWludCByYiA9IGN0eC0+Z2V0UmVuZGVyYnVmZmVyQmluZGluZygpOworICAgIFNFVF9FUlJPUl9JRihyYiA9PSAwLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKyAgICBhdXRvIG9iakRhdGEgPQorICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpSRU5ERVJCVUZGRVIsIHJiKTsKKyAgICBSZW5kZXJidWZmZXJEYXRhICpyYkRhdGEgPSAoUmVuZGVyYnVmZmVyRGF0YSAqKW9iakRhdGE7CisgICAgU0VUX0VSUk9SX0lGKCFyYkRhdGEsR0xfSU5WQUxJRF9PUEVSQVRJT04pOworCisgICAgLy8KKyAgICAvLyBhY3F1aXJlIHRoZSB0ZXh0dXJlIGluIHRoZSByZW5kZXJidWZmZXJEYXRhIHRoYXQgaXQgaXMgYW4gZWdsSW1hZ2UgdGFyZ2V0CisgICAgLy8KKyAgICByYkRhdGEtPmVnbEltYWdlR2xvYmFsVGV4T2JqZWN0ID0gaW1nLT5nbG9iYWxUZXhPYmo7CisKKyAgICAvLworICAgIC8vIGlmIHRoZSByZW5kZXJidWZmZXIgaXMgYXR0YWNoZWQgdG8gYSBmcmFtZWJ1ZmZlcgorICAgIC8vIGNoYW5nZSB0aGUgZnJhbWVidWZmZXIgYXR0YWNobWVudCBpbiB0aGUgdW5kZWx5aW5nIE9wZW5HTAorICAgIC8vIHRvIHBvaW50IHRvIHRoZSBlZ2xJbWFnZSB0ZXh0dXJlIG9iamVjdC4KKyAgICAvLworICAgIGlmIChyYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBmcmFtZWJ1ZmZlciBhdHRhY2htZW50IHBvaW50IHRvIHRoZQorICAgICAgICAvLyB1bmRlcmx5aW5nIHRleHR1cmUgb2YgdGhlIGltZworICAgICAgICBHTHVpbnQgcHJldkZCID0gY3R4LT5nZXRGcmFtZWJ1ZmZlckJpbmRpbmcoKTsKKyAgICAgICAgaWYgKHByZXZGQiAhPSByYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiRGF0YS0+YXR0YWNoZWRGQik7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVChHTF9GUkFNRUJVRkZFUl9FWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJEYXRhLT5hdHRhY2hlZFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5nbG9iYWxUZXhPYmotPmdldEdsb2JhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKHByZXZGQiAhPSByYkRhdGEtPmF0dGFjaGVkRkIpIHsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZGQik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0dMX0FQSUNBTEwgR0xzeW5jIEdMX0FQSUVOVFJZIGdsRmVuY2VTeW5jKEdMZW51bSBjb25kaXRpb24sIEdMYml0ZmllbGQgZmxhZ3MpCit7CisgICAgR0VUX0NUWF9WMl9SRVQoTlVMTCk7CisgICAgcmV0dXJuIGN0eC0+ZGlzcGF0Y2hlcigpLmdsRmVuY2VTeW5jKGNvbmRpdGlvbiwgZmxhZ3MpOworfQorCitHTF9BUElDQUxMIEdMZW51bSBHTF9BUElFTlRSWSBnbENsaWVudFdhaXRTeW5jKEdMc3luYyB3YWl0X29uLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KQoreworICAgIEdFVF9DVFhfVjJfUkVUKEdMX1dBSVRfRkFJTEVEKTsKKyAgICByZXR1cm4gY3R4LT5kaXNwYXRjaGVyKCkuZ2xDbGllbnRXYWl0U3luYyh3YWl0X29uLCBmbGFncywgdGltZW91dCk7Cit9CisKK0dMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFdhaXRTeW5jKEdMc3luYyB3YWl0X29uLCBHTGJpdGZpZWxkIGZsYWdzLCBHTHVpbnQ2NCB0aW1lb3V0KQoreworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFdhaXRTeW5jKHdhaXRfb24sIGZsYWdzLCB0aW1lb3V0KTsKK30KKworR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlU3luYyhHTHN5bmMgdG9fZGVsZXRlKQoreworICAgIEdFVF9DVFhfVjIoKTsKKyAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbERlbGV0ZVN5bmModG9fZGVsZXRlKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MlZhbGlkYXRlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MlZhbGlkYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBjMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvR0xFU3YyVmFsaWRhdGUuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkdMRVN2MlZhbGlkYXRlLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OmJsZW5kRXF1YXRpb25Nb2RlKEdMZW51bSBtb2RlKXsKKyAgICByZXR1cm4gbW9kZSA9PSBHTF9GVU5DX0FERCAgICAgICAgICAgICB8fAorICAgICAgICAgICBtb2RlID09IEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgIHx8CisgICAgICAgICAgIG1vZGUgPT0gR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjpibGVuZFNyYyhHTGVudW0gcykgeworICAgc3dpdGNoKHMpIHsKKyAgIGNhc2UgR0xfWkVSTzoKKyAgIGNhc2UgR0xfT05FOgorICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQ09MT1I6CisgICBjYXNlIEdMX0RTVF9DT0xPUjoKKyAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9DT0xPUjoKKyAgIGNhc2UgR0xfU1JDX0FMUEhBOgorICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgY2FzZSBHTF9EU1RfQUxQSEE6CisgICBjYXNlIEdMX09ORV9NSU5VU19EU1RfQUxQSEE6CisgICBjYXNlIEdMX0NPTlNUQU5UX0NPTE9SOgorICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I6CisgICBjYXNlIEdMX0NPTlNUQU5UX0FMUEhBOgorICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQUxQSEE6CisgICBjYXNlIEdMX1NSQ19BTFBIQV9TQVRVUkFURToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OmJsZW5kRHN0KEdMZW51bSBkKSB7CisgICBzd2l0Y2goZCkgeworICAgY2FzZSBHTF9aRVJPOgorICAgY2FzZSBHTF9PTkU6CisgICBjYXNlIEdMX1NSQ19DT0xPUjoKKyAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgIGNhc2UgR0xfRFNUX0NPTE9SOgorICAgY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SOgorICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICBjYXNlIEdMX0RTVF9BTFBIQToKKyAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9BTFBIQToKKyAgIGNhc2UgR0xfQ09OU1RBTlRfQ09MT1I6CisgICBjYXNlIEdMX09ORV9NSU5VU19DT05TVEFOVF9DT0xPUjoKKyAgIGNhc2UgR0xfQ09OU1RBTlRfQUxQSEE6CisgICBjYXNlIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICB9CisgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVQYXJhbXMoR0xlbnVtIHBhcmFtKXsKKyAgICBzd2l0Y2gocGFyYW0pIHsKKyAgICBjYXNlIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUjoKKyAgICBjYXNlIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUjoKKyAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9TOgorICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1Q6CisgICAgY2FzZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6aGludFRhcmdldE1vZGUoR0xlbnVtIHRhcmdldCxHTGVudW0gbW9kZSl7CisKKyAgIHN3aXRjaChtb2RlKSB7CisgICBjYXNlIEdMX0ZBU1RFU1Q6CisgICBjYXNlIEdMX05JQ0VTVDoKKyAgIGNhc2UgR0xfRE9OVF9DQVJFOgorICAgICAgIGJyZWFrOworICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgfQorICAgcmV0dXJuIHRhcmdldCA9PSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCB8fCB0YXJnZXQgPT0gR0xfRlJBR01FTlRfU0hBREVSX0RFUklWQVRJVkVfSElOVF9PRVM7Cit9CisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OmNhcGFiaWxpdHkoR0xlbnVtIGNhcCl7CisgICAgc3dpdGNoKGNhcCl7CisgICAgY2FzZSBHTF9CTEVORDoKKyAgICBjYXNlIEdMX0NVTExfRkFDRToKKyAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6CisgICAgY2FzZSBHTF9ESVRIRVI6CisgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMOgorICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOgorICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFOgorICAgIGNhc2UgR0xfU0NJU1NPUl9URVNUOgorICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjpwaXhlbFN0b3JlUGFyYW0oR0xlbnVtIHBhcmFtKXsKKyAgICByZXR1cm4gcGFyYW0gPT0gR0xfUEFDS19BTElHTk1FTlQgfHwgcGFyYW0gPT0gR0xfVU5QQUNLX0FMSUdOTUVOVDsKK30KKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6cmVhZFBpeGVsRnJtdChHTGVudW0gZm9ybWF0KXsKKyAgICBzd2l0Y2goZm9ybWF0KSB7CisgICAgY2FzZSBHTF9BTFBIQToKKyAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKKyAgICBjYXNlIEdMX1JHQjoKKyAgICBjYXNlIEdMX1JHQkE6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6c2hhZGVyVHlwZShHTGVudW0gdHlwZSl7CisgICAgcmV0dXJuIHR5cGUgPT0gR0xfVkVSVEVYX1NIQURFUiB8fCB0eXBlID09IEdMX0ZSQUdNRU5UX1NIQURFUjsKK30KKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6cHJlY2lzaW9uVHlwZShHTGVudW0gdHlwZSl7CisgICAgc3dpdGNoKHR5cGUpeworICAgIGNhc2UgR0xfTE9XX0ZMT0FUOgorICAgIGNhc2UgR0xfTUVESVVNX0ZMT0FUOgorICAgIGNhc2UgR0xfSElHSF9GTE9BVDoKKyAgICBjYXNlIEdMX0xPV19JTlQ6CisgICAgY2FzZSBHTF9NRURJVU1fSU5UOgorICAgIGNhc2UgR0xfSElHSF9JTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OmFycmF5SW5kZXgoR0xFU2NvbnRleHQgKiBjdHgsR0x1aW50IGluZGV4KSB7CisgICAgcmV0dXJuIGluZGV4IDwgKEdMdWludCljdHgtPmdldENhcHMoKS0+bWF4VmVydGV4QXR0cmliczsKK30KKworI2RlZmluZSBHTF9SRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDMKKyNkZWZpbmUgR0xfUkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjI3CisjZGVmaW5lIEdMX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyOQorI2RlZmluZSBHTF9SRzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyMkIKKyNkZWZpbmUgR0xfUjE2RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MjJECisjZGVmaW5lIEdMX1JHMTZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRgorI2RlZmluZSBHTF9SR0JBMTZGICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MUEKKyNkZWZpbmUgR0xfUkdCMTZGICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCisjZGVmaW5lIEdMX1IxMUZfRzExRl9CMTBGICAgICAgICAgICAgICAgICAgIDB4OEMzQQorI2RlZmluZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWICAgICAweDhDM0IKKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxUeXBlKEdMRVNjb250ZXh0ICogY3R4LEdMZW51bSB0eXBlKSB7CisgICAgaWYodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVCB8fCB0eXBlID09IEdMX1VOU0lHTkVEX0lOVAorICAgICAgICAgICAgfHwgdHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBHTEVTdmFsaWRhdGU6OnBpeGVsVHlwZShjdHgsIHR5cGUpOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjpwaXhlbEZybXQoR0xFU2NvbnRleHQqIGN0eCxHTGVudW0gZm9ybWF0KSB7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDoKKyAgICAvLyBHTEVTMyBjb21wYXRpYmxlCisgICAgLy8gUmVxdWlyZWQgaW4gZEVRUAorICAgIGNhc2UgR0xfUkVEOgorICAgIGNhc2UgR0xfUkc6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gR0xFU3ZhbGlkYXRlOjpwaXhlbEZybXQoY3R4LCBmb3JtYXQpOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjpwaXhlbEl0bmxGcm10KEdMRVNjb250ZXh0KiBjdHggLEdMZW51bSBpbnRlcm5hbGZvcm1hdCkgeworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICBjYXNlIEdMX1I4OgorICAgIGNhc2UgR0xfUkc4OgorICAgIGNhc2UgR0xfUjE2RjoKKyAgICBjYXNlIEdMX1JHMTZGOgorICAgIGNhc2UgR0xfUkdCQTE2RjoKKyAgICBjYXNlIEdMX1JHQjE2RjoKKyAgICBjYXNlIEdMX1IxMUZfRzExRl9CMTBGOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHBpeGVsRnJtdChjdHgsIGludGVybmFsZm9ybWF0KTsKK30KKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6cGl4ZWxTaXplZEZybXQoR0xFU2NvbnRleHQqIGN0eCwgR0xlbnVtIGludGVybmFsZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpIHsKKyAgICBpZiAoaW50ZXJuYWxmb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEdMX1JFRDoKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsZm9ybWF0ID09IEdMX1I4OworICAgICAgICAgICAgICAgIGNhc2UgR0xfSEFMRl9GTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxmb3JtYXQgPT0gR0xfUjE2RjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9SRzoKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsZm9ybWF0ID09IEdMX1JHODsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0hBTEZfRkxPQVQ6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVybmFsZm9ybWF0ID09IEdMX1JHMTZGOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1JHQjoKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfSEFMRl9GTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxmb3JtYXQgPT0gR0xfUkdCMTZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW50ZXJuYWxmb3JtYXQgPT0gR0xfUjExRl9HMTFGX0IxMEY7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlRfMTBGXzExRl8xMUZfUkVWOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxmb3JtYXQgPT0gR0xfUjExRl9HMTFGX0IxMEY7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfSEFMRl9GTE9BVDoKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxmb3JtYXQgPT0gR0xfUkdCQTE2RjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjphdHRyaWJOYW1lKGNvbnN0IEdMY2hhciogbmFtZSl7CisgICAgY29uc3QgR0xjaGFyKiBmb3VuZCA9IHN0cnN0cihuYW1lLCJnbF8iKTsKKyAgICByZXR1cm4gKCFmb3VuZCkgfHwKKyAgICAgICAgICAgKGZvdW5kICE9IG5hbWUpIDsgLy8gYXR0cmliIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCBnbF8KK30KKworYm9vbCBHTEVTdjJWYWxpZGF0ZTo6YXR0cmliSW5kZXgoaW50IGluZGV4KXsKKyAgICByZXR1cm4gaW5kZXggPj0wICYmIGluZGV4IDwgR0xfTUFYX1ZFUlRFWF9BVFRSSUJTOworfQorCitib29sIEdMRVN2MlZhbGlkYXRlOjpwcm9ncmFtUGFyYW0oR0xlbnVtIHBuYW1lKXsKKyAgICBzd2l0Y2gocG5hbWUpeworICAgICAgICBjYXNlIEdMX0RFTEVURV9TVEFUVVM6CisgICAgICAgIGNhc2UgR0xfTElOS19TVEFUVVM6CisgICAgICAgIGNhc2UgR0xfVkFMSURBVEVfU1RBVFVTOgorICAgICAgICBjYXNlIEdMX0lORk9fTE9HX0xFTkdUSDoKKyAgICAgICAgY2FzZSBHTF9BVFRBQ0hFRF9TSEFERVJTOgorICAgICAgICBjYXNlIEdMX0FDVElWRV9BVFRSSUJVVEVTOgorICAgICAgICBjYXNlIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSDoKKyAgICAgICAgY2FzZSBHTF9BQ1RJVkVfVU5JRk9STVM6CisgICAgICAgIGNhc2UgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU3YyVmFsaWRhdGU6OnRleHR1cmVJc0N1YmVNYXAoR0xlbnVtIHRhcmdldCl7CisgICAgc3dpdGNoKHRhcmdldCl7CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YOgorICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1o6CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YOgorICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1o6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvR0xFU3YyVmFsaWRhdGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MlZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwMDVjNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL0dMRVN2MlZhbGlkYXRlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEdMRVNfVjJfVkFMSURBVEVfSAorI2RlZmluZSBHTEVTX1YyX1ZBTElEQVRFX0gKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVN2YWxpZGF0ZS5oPgorCitzdHJ1Y3QgR0xFU3YyVmFsaWRhdGU6cHVibGljIEdMRVN2YWxpZGF0ZXsKK3N0YXRpYyBib29sIGJsZW5kRXF1YXRpb25Nb2RlKEdMZW51bSBtb2RlKTsKK3N0YXRpYyBib29sIGJsZW5kU3JjKEdMZW51bSBzKTsKK3N0YXRpYyBib29sIGJsZW5kRHN0KEdMZW51bSBkKTsKK3N0YXRpYyBib29sIHRleHR1cmVQYXJhbXMoR0xlbnVtIHBhcmFtKTsKK3N0YXRpYyBib29sIGhpbnRUYXJnZXRNb2RlKEdMZW51bSB0YXJnZXQsR0xlbnVtIG1vZGUpOworc3RhdGljIGJvb2wgY2FwYWJpbGl0eShHTGVudW0gY2FwKTsKK3N0YXRpYyBib29sIHBpeGVsU3RvcmVQYXJhbShHTGVudW0gcGFyYW0pOworc3RhdGljIGJvb2wgcmVhZFBpeGVsRnJtdChHTGVudW0gZm9ybWF0KTsKK3N0YXRpYyBib29sIHNoYWRlclR5cGUoR0xlbnVtIHR5cGUpOworc3RhdGljIGJvb2wgcHJlY2lzaW9uVHlwZShHTGVudW0gdHlwZSk7CitzdGF0aWMgYm9vbCBhcnJheUluZGV4KEdMRVNjb250ZXh0ICogY3R4LEdMdWludCBpbmRleCk7CitzdGF0aWMgYm9vbCBwaXhlbFR5cGUoR0xFU2NvbnRleHQgKiBjdHgsR0xlbnVtIHR5cGUpOworc3RhdGljIGJvb2wgcGl4ZWxGcm10KEdMRVNjb250ZXh0KiBjdHgsR0xlbnVtIGZvcm1hdCk7CitzdGF0aWMgYm9vbCBwaXhlbEl0bmxGcm10KEdMRVNjb250ZXh0KiBjdHgsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCk7CitzdGF0aWMgYm9vbCBwaXhlbFNpemVkRnJtdChHTEVTY29udGV4dCogY3R4LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSk7CitzdGF0aWMgYm9vbCBhdHRyaWJOYW1lKGNvbnN0IEdMY2hhciogbmFtZSk7CitzdGF0aWMgYm9vbCBhdHRyaWJJbmRleChpbnQgaW5kZXgpOworc3RhdGljIGJvb2wgcHJvZ3JhbVBhcmFtKEdMZW51bSBwbmFtZSk7CitzdGF0aWMgYm9vbCB0ZXh0dXJlSXNDdWJlTWFwKEdMZW51bSB0YXJnZXQpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9Qcm9ncmFtRGF0YS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9Qcm9ncmFtRGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4NzU4NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL1Byb2dyYW1EYXRhLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMY29tbW9uL29iamVjdE5hbWVNYW5hZ2VyLmg+CisjaW5jbHVkZSAiUHJvZ3JhbURhdGEuaCIKKworUHJvZ3JhbURhdGE6OlByb2dyYW1EYXRhKCkgOiAgT2JqZWN0RGF0YShQUk9HUkFNX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0YWNoZWRWZXJ0ZXhTaGFkZXIoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2hlZEZyYWdtZW50U2hhZGVyKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua1N0YXR1cyhHTF9GQUxTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0luVXNlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVN0YXR1cyhmYWxzZSkge30KKwordm9pZCBQcm9ncmFtRGF0YTo6c2V0SW5mb0xvZyhjb25zdCBHTGNoYXIqIGxvZykgeworICAgIGluZm9Mb2cucmVzZXQobG9nKTsKK30KKworY29uc3QgR0xjaGFyKiBQcm9ncmFtRGF0YTo6Z2V0SW5mb0xvZygpIGNvbnN0IHsKKyAgICByZXR1cm4gaW5mb0xvZy5nZXQoKSA/IGluZm9Mb2cuZ2V0KCkgOiAoY29uc3QgR0xjaGFyKikiIjsKK30KKworR0x1aW50IFByb2dyYW1EYXRhOjpnZXRBdHRhY2hlZFZlcnRleFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0YWNoZWRWZXJ0ZXhTaGFkZXI7Cit9CisKK0dMdWludCBQcm9ncmFtRGF0YTo6Z2V0QXR0YWNoZWRGcmFnbWVudFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0YWNoZWRGcmFnbWVudFNoYWRlcjsKK30KKworR0x1aW50IFByb2dyYW1EYXRhOjpnZXRBdHRhY2hlZFNoYWRlcihHTGVudW0gdHlwZSkgY29uc3QgeworICAgIEdMdWludCBzaGFkZXIgPSAwOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfVkVSVEVYX1NIQURFUjoKKyAgICAgICAgc2hhZGVyID0gQXR0YWNoZWRWZXJ0ZXhTaGFkZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRlJBR01FTlRfU0hBREVSOgorICAgICAgICBzaGFkZXIgPSBBdHRhY2hlZEZyYWdtZW50U2hhZGVyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHNoYWRlcjsKK30KKworYm9vbCBQcm9ncmFtRGF0YTo6YXR0YWNoU2hhZGVyKEdMdWludCBzaGFkZXIsR0xlbnVtIHR5cGUpIHsKKyAgICBpZiAodHlwZT09R0xfVkVSVEVYX1NIQURFUiAmJiBBdHRhY2hlZFZlcnRleFNoYWRlcj09MCkgeworICAgICAgICBBdHRhY2hlZFZlcnRleFNoYWRlcj1zaGFkZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlPT1HTF9GUkFHTUVOVF9TSEFERVIgJiYgQXR0YWNoZWRGcmFnbWVudFNoYWRlcj09MCkgeworICAgICAgICBBdHRhY2hlZEZyYWdtZW50U2hhZGVyPXNoYWRlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQcm9ncmFtRGF0YTo6aXNBdHRhY2hlZChHTHVpbnQgc2hhZGVyKSBjb25zdCB7CisgICAgcmV0dXJuIChBdHRhY2hlZEZyYWdtZW50U2hhZGVyPT1zaGFkZXIgfHwgQXR0YWNoZWRWZXJ0ZXhTaGFkZXI9PXNoYWRlcik7Cit9CisKK2Jvb2wgUHJvZ3JhbURhdGE6OmRldGFjaFNoYWRlcihHTHVpbnQgc2hhZGVyKSB7CisgICAgaWYgKEF0dGFjaGVkVmVydGV4U2hhZGVyPT1zaGFkZXIpIHsKKyAgICAgICAgQXR0YWNoZWRWZXJ0ZXhTaGFkZXIgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZWxzZSBpZiAoQXR0YWNoZWRGcmFnbWVudFNoYWRlcj09c2hhZGVyKSB7CisgICAgICAgIEF0dGFjaGVkRnJhZ21lbnRTaGFkZXIgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpzZXRMaW5rU3RhdHVzKEdMaW50IHN0YXR1cykgeworICAgIExpbmtTdGF0dXMgPSBzdGF0dXM7Cit9CisKK0dMaW50IFByb2dyYW1EYXRhOjpnZXRMaW5rU3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBMaW5rU3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvUHJvZ3JhbURhdGEuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL1Byb2dyYW1EYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjOWMwMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL1Byb2dyYW1EYXRhLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgUFJPR1JBTV9EQVRBX0gKKyNkZWZpbmUgUFJPR1JBTV9EQVRBX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgUHJvZ3JhbURhdGE6cHVibGljIE9iamVjdERhdGF7CitwdWJsaWM6CisgICAgUHJvZ3JhbURhdGEoKTsKKworICAgIEdMdWludCBnZXRBdHRhY2hlZFZlcnRleFNoYWRlcigpIGNvbnN0OworICAgIEdMdWludCBnZXRBdHRhY2hlZEZyYWdtZW50U2hhZGVyKCkgY29uc3Q7CisgICAgR0x1aW50IGdldEF0dGFjaGVkU2hhZGVyKEdMZW51bSB0eXBlKSBjb25zdDsKKworICAgIGJvb2wgYXR0YWNoU2hhZGVyKEdMdWludCBzaGFkZXIsR0xlbnVtIHR5cGUpOworICAgIGJvb2wgaXNBdHRhY2hlZChHTHVpbnQgc2hhZGVyKSBjb25zdDsKKyAgICBib29sIGRldGFjaFNoYWRlcihHTHVpbnQgc2hhZGVyKTsKKworICAgIHZvaWQgc2V0TGlua1N0YXR1cyhHTGludCBzdGF0dXMpOworICAgIEdMaW50IGdldExpbmtTdGF0dXMoKSBjb25zdDsKKworICAgIHZvaWQgc2V0SW5mb0xvZyhjb25zdCBHTGNoYXIgKmxvZyk7CisgICAgY29uc3QgR0xjaGFyKiBnZXRJbmZvTG9nKCkgY29uc3Q7CisKKyAgICBib29sIGlzSW5Vc2UoKSBjb25zdCB7IHJldHVybiBJc0luVXNlOyB9CisgICAgdm9pZCBzZXRJblVzZShib29sIGluVXNlKSB7IElzSW5Vc2UgPSBpblVzZTsgfQorCisgICAgYm9vbCBnZXREZWxldGVTdGF0dXMoKSBjb25zdCB7IHJldHVybiBEZWxldGVTdGF0dXM7IH0KKyAgICB2b2lkIHNldERlbGV0ZVN0YXR1cyhib29sIHN0YXR1cykgeyBEZWxldGVTdGF0dXMgPSBzdGF0dXM7IH0KK3ByaXZhdGU6CisgICAgR0x1aW50IEF0dGFjaGVkVmVydGV4U2hhZGVyOworICAgIEdMdWludCBBdHRhY2hlZEZyYWdtZW50U2hhZGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBHTGNoYXJbXT4gaW5mb0xvZzsKKyAgICBHTGludCAgTGlua1N0YXR1czsKKyAgICBib29sICAgIElzSW5Vc2U7CisgICAgYm9vbCAgICBEZWxldGVTdGF0dXM7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9TaGFkZXJQYXJzZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNkZjhmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyUGFyc2VyLmNwcApAQCAtMCwwICsxLDk1IEBACisvKgorKiBDb3B5cmlnaHQgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJTaGFkZXJQYXJzZXIuaCIKKyNpbmNsdWRlICJTaGFkZXJWYWxpZGF0b3IuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIkFOR0xFU2hhZGVyUGFyc2VyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworU2hhZGVyUGFyc2VyOjpTaGFkZXJQYXJzZXIoR0xlbnVtIHR5cGUpIDogT2JqZWN0RGF0YShTSEFERVJfREFUQSksIG1fdHlwZSh0eXBlKSB7fQorCit2b2lkIFNoYWRlclBhcnNlcjo6Y29udmVydEVTU0xUb0dMU0woKSB7CisgICAgc3RkOjpzdHJpbmcgaW5mb2xvZzsKKyAgICBzdGQ6OnN0cmluZyBwYXJzZWRTb3VyY2U7CisgICAgbV92YWxpZCA9IEFOR0xFU2hhZGVyUGFyc2VyOjp0cmFuc2xhdGUobV9vcmlnaW5hbFNyYy5jX3N0cigpLCBtX3R5cGUsICZpbmZvbG9nLCAmcGFyc2VkU291cmNlKTsKKworICAgIGlmICghbV92YWxpZCkgeworICAgICAgICBtX2luZm9Mb2cgPSBzdGF0aWNfY2FzdDxjb25zdCBHTGNoYXIqPihpbmZvbG9nLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcGFyc2VkU3JjID0gcGFyc2VkU291cmNlOworICAgIH0KK30KKwordm9pZCBTaGFkZXJQYXJzZXI6OnNldFNyYyhjb25zdCBWZXJzaW9uJiB2ZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogY29uc3QqIHN0cmluZ3MsIGNvbnN0IEdMaW50KiBsZW5ndGgpeworICAgIG1fc3JjLmNsZWFyKCk7CisgICAgZm9yKGludCBpID0gMDtpPGNvdW50O2krKyl7CisgICAgICAgIGNvbnN0IHNpemVfdCBzdHJMZW4gPQorICAgICAgICAgICAgICAgIChsZW5ndGggJiYgbGVuZ3RoW2ldID49IDApID8gbGVuZ3RoW2ldIDogc3RybGVuKHN0cmluZ3NbaV0pOworICAgICAgICBtX3NyYy5hcHBlbmQoc3RyaW5nc1tpXSwgc3RyaW5nc1tpXSArIHN0ckxlbik7CisgICAgfQorICAgIC8vIFN0b3JlIG9yaWdpbmFsIHNvdXJjZSBhcyBzb21lICdwYXJzaW5nJyBmdW5jdGlvbnMgYWN0dWFsbHkgbW9kaWZ5IG1fc3JjLgorICAgIC8vIE5vdGU6IGFzc2lnbigpIGNhbGwgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgcmVmZXJlbmNlLWNvdW50aW5nCisgICAgLy8gIHN0ZDo6c3RyaW5nIGluIEdDQydzIFNUTCAtIHdlIG5lZWQgYSBkZWVwIGNvcHkgaGVyZS4KKyAgICBtX29yaWdpbmFsU3JjLmFzc2lnbihtX3NyYy5jX3N0cigpLCBtX3NyYy5zaXplKCkpOworCisgICAgY29udmVydEVTU0xUb0dMU0woKTsKK30KKworY29uc3QgR0xjaGFyKiogU2hhZGVyUGFyc2VyOjpwYXJzZWRMaW5lcygpIHsKKyAgICAgIG1fcGFyc2VkTGluZXMgPSAoR0xjaGFyKiltX3BhcnNlZFNyYy5jX3N0cigpOworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgR0xjaGFyKio+ICgmbV9wYXJzZWRMaW5lcyk7Cit9CisKK3ZvaWQgU2hhZGVyUGFyc2VyOjpjbGVhcigpIHsKKyAgICBtX3BhcnNlZExpbmVzID0gbnVsbHB0cjsKKyAgICBzdGQ6OnN0cmluZygpLnN3YXAobV9wYXJzZWRTcmMpOworICAgIHN0ZDo6c3RyaW5nKCkuc3dhcChtX3NyYyk7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nJiBTaGFkZXJQYXJzZXI6OmdldE9yaWdpbmFsU3JjKCkgY29uc3QgeworICAgIHJldHVybiBtX29yaWdpbmFsU3JjOworfQorCitHTGVudW0gU2hhZGVyUGFyc2VyOjpnZXRUeXBlKCkgeworICAgIHJldHVybiBtX3R5cGU7Cit9CisKK3ZvaWQgU2hhZGVyUGFyc2VyOjpzZXRJbmZvTG9nKEdMY2hhciogaW5mb0xvZykgeworICAgIGFzc2VydChpbmZvTG9nKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R0xjaGFyW10+IGluZm9Mb2dEZWxldGVyKGluZm9Mb2cpOworICAgIG1faW5mb0xvZy5hc3NpZ24oaW5mb0xvZyk7Cit9CisKK2Jvb2wgU2hhZGVyUGFyc2VyOjp2YWxpZFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV92YWxpZDsKK30KKworc3RhdGljIGNvbnN0IEdMY2hhciBnbHNsZXNfaW52YWxpZFtdID0KKyAgICB7ICJFUlJPUjogVmFsaWQgR0xTTCBidXQgbm90IEdMU0wgRVMiIH07CisKK3ZvaWQgU2hhZGVyUGFyc2VyOjpzZXRJbnZhbGlkSW5mb0xvZygpIHsKKyAgICBtX2luZm9Mb2cgPSBnbHNsZXNfaW52YWxpZDsKK30KKworY29uc3QgR0xjaGFyKiBTaGFkZXJQYXJzZXI6OmdldEluZm9Mb2coKSBjb25zdCB7CisgICAgcmV0dXJuIG1faW5mb0xvZy5jX3N0cigpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyUGFyc2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9TaGFkZXJQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI2MjlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyUGFyc2VyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyogQ29weXJpZ2h0IDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIFNIQURFUl9QQVJTRVJfSAorI2RlZmluZSBTSEFERVJfUEFSU0VSX0gKKworI2luY2x1ZGUgIkdMRVN2MkNvbnRleHQuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xjb21tb24vb2JqZWN0TmFtZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCitjbGFzcyBTaGFkZXJQYXJzZXIgOiBwdWJsaWMgT2JqZWN0RGF0YSB7CitwdWJsaWM6CisgICAgU2hhZGVyUGFyc2VyKEdMZW51bSB0eXBlID0gMCk7CisgICAgdm9pZCAgICAgICAgICAgc2V0U3JjKGNvbnN0IFZlcnNpb24mIHZlcixHTHNpemVpIGNvdW50LGNvbnN0IEdMY2hhciogY29uc3QqIHN0cmluZ3MsY29uc3QgR0xpbnQqIGxlbmd0aCk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldE9yaWdpbmFsU3JjKCkgY29uc3Q7CisgICAgY29uc3QgR0xjaGFyKiogcGFyc2VkTGluZXMoKTsKKyAgICB2b2lkICAgICAgICAgICBjbGVhcigpOworICAgIEdMZW51bSAgICAgICAgIGdldFR5cGUoKTsKKworICAgIC8vIFF1ZXJ5IHdoZXRoZXIgdGhlIHNoYWRlciBwYXJzZWQgaXMgdmFsaWQuCisgICAgLy8gRG9uJ3QgdHJ1c3QgdGhlIHZhbHVlIGlmIHdlIGRpZCBub3QgY2FsbCBzZXRTcmMKKyAgICBib29sIHZhbGlkU2hhZGVyKCkgY29uc3Q7CisKKyAgICBjb25zdCBHTGNoYXIqIGdldEluZm9Mb2coKSBjb25zdDsKKyAgICB2b2lkIHNldEluZm9Mb2coR0xjaGFyICogaW5mb0xvZyk7CisKKyAgICAvLyBJZiB2YWxpZGF0aW9uIGZhaWxzLCBhZGQgcHJvcGVyIGVycm9yIG1lc3NhZ2VzCisgICAgLy8gdG8gdGhlIHBhcnNlcidzIGluZm8gbG9nLCB3aGljaCBpcyB0cmVhdGVkCisgICAgLy8gYXMgdGhlIGFjdHVhbCBpbmZvIGxvZyBmcm9tIGd1ZXN0IFBPVi4KKyAgICB2b2lkIHNldEludmFsaWRJbmZvTG9nKCk7CisKKyAgICB2b2lkIHNldERlbGV0ZVN0YXR1cyhib29sIHZhbCkgeyBtX2RlbGV0ZVN0YXR1cyA9IHZhbDsgfQorICAgIGJvb2wgZ2V0RGVsZXRlU3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9kZWxldGVTdGF0dXM7IH0KKworICAgIHZvaWQgYXR0YWNoUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkge21fcHJvZ3JhbXMuaW5zZXJ0KHByb2dyYW0pO30KKyAgICB2b2lkIGRldGFjaFByb2dyYW0oR0x1aW50IHByb2dyYW0pIHttX3Byb2dyYW1zLmVyYXNlKHByb2dyYW0pO30KKyAgICBib29sIGhhc0F0dGFjaGVkUHJvZ3JhbXMoKSBjb25zdCB7cmV0dXJuIG1fcHJvZ3JhbXMuc2l6ZSgpPjA7fQorCitwcml2YXRlOgorICAgIHZvaWQgY29udmVydEVTU0xUb0dMU0woKTsKKworICAgIHN0ZDo6c3RyaW5nIG1fb3JpZ2luYWxTcmM7CisgICAgc3RkOjpzdHJpbmcgbV9zcmM7CisgICAgc3RkOjpzdHJpbmcgbV9wYXJzZWRTcmM7CisgICAgR0xjaGFyKiAgICAgbV9wYXJzZWRMaW5lcyA9IG51bGxwdHI7CisgICAgc3RkOjpiYXNpY19zdHJpbmc8R0xjaGFyPiBtX2luZm9Mb2c7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PEdMdWludD4gbV9wcm9ncmFtczsKKyAgICBHTGVudW0gICAgICBtX3R5cGUgPSAwOworICAgIGJvb2wgICAgICAgIG1fZGVsZXRlU3RhdHVzID0gZmFsc2U7CisgICAgYm9vbCAgICAgICAgbV92YWxpZCA9IHRydWU7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xFU19WMi9TaGFkZXJWYWxpZGF0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyVmFsaWRhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTczMTllCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyVmFsaWRhdG9yLmNwcApAQCAtMCwwICsxLDE3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc3RyaW5ncGFyc2luZy5oIgorCisjaW5jbHVkZSAiU2hhZGVyVmFsaWRhdG9yLmgiCisKKy8vIFRPRE86IEltcHJvdmUgcGFyc2luZy9hbmFseXNpcworLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9hbmRyb2lkL2lzc3Vlcy9kZXRhaWw/aWQ9MjA2OTUxCisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFyc2VfcmF3X2RlY2xhcmF0aW9ucyhzdGQ6OnN0cmluZyB0ZXh0KSB7CisgICAgc3RkOjpzdHJpbmcgZW1wKCIiKTsKKyAgICBzdGQ6OnN0cmluZyBzcCgiICIpOworCisgICAgc3RkOjpzdHJpbmcgbmV3bGluZSgiXG4iKTsKKyAgICBzdGQ6OnN0cmluZyBzY29sKCI7Iik7CisKKyAgICBzdGQ6OnN0cmluZyBvcGVucGFyKCIoIik7CisgICAgc3RkOjpzdHJpbmcgb3BlbnBhcnNwKCIoICIpOworICAgIHN0ZDo6c3RyaW5nIGNsb3NlcGFyKCIpIik7CisgICAgc3RkOjpzdHJpbmcgb3BlbmJyKCJ7Iik7CisgICAgc3RkOjpzdHJpbmcgY2xvc2VicigifSIpOworICAgIHN0ZDo6c3RyaW5nIGJyc2NvbCgifTsiKTsKKworICAgIHN0ZDo6c3RyaW5nIGxpbmVjb21tZW50KCIvLyIpOworICAgIHN0ZDo6c3RyaW5nIG11bHRpbGluZWNvbW1lbnRfYmVnaW4oIi8qIik7CisgICAgc3RkOjpzdHJpbmcgbXVsdGlsaW5lY29tbWVudF9lbmQoIiovIik7CisKKyAgICB0ZXh0Lmluc2VydCgwLCBzcCk7CisKKyAgICBib29sIGVyciA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHByZXByb2Nlc3NlZCA9IHJlcGxhY2Vfd2l0aChuZXdsaW5lLCBzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlX3dpdGgob3BlbnBhciwgb3BlbnBhcnNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2Vfd2l0aChjbG9zZWJyLCBicnNjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlX2luX291dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfaW5fb3V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVjb21tZW50X2JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVjb21tZW50X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyKSkpKTsKKworICAgIC8vIENvbW1lbnQgcGFyc2luZyBpcyBhbGxvd2VkIHRvIGZhaWwKKyAgICBlcnIgPSBmYWxzZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZWNsczsKKyAgICBzdGQ6OnN0cmluZyBub19mdW5jX2ltcGxzID0gcmVtb3ZlX2luX291dChwcmVwcm9jZXNzZWQsCisgICAgICAgICAgICBvcGVuYnIsCisgICAgICAgICAgICBjbG9zZWJyLAorICAgICAgICAgICAgJmVycik7CisKKyAgICBpZiAoIWVycikgeworICAgICAgICBkZWNscyA9IHNwbGl0KHNjb2wsIG5vX2Z1bmNfaW1wbHMpOworICAgIH0KKyAgICByZXR1cm4gZGVjbHM7Cit9CisKKy8vIFZhbGlkYXRlcyBhcnJhbmdlbWVudCBvZiBrZXl3b3JkcyBpbgorLy8gYSBHTFNMIEVTIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9yIGZ1bmN0aW9uIHBhcmFtZXRlci4KKy8vIFdpdGggdGhlIGdpdmVuIHBhcnNpbmcgZnVuY3Rpb25zLCB0aGlzIGlzIG9ubHkgZGVzaWduZWQgdG8gcGFzcworLy8gZEVRUC1HTEVTMi5zaGFkZXJzLnF1YWxpZmljYXRpb25fb3JkZXIuKgorc3RhdGljIHZvaWQgdmFsaWRhdGVfa2V5d29yZHNfaW5fZGVjbHMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZWNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGVycikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YXJpYW5jZV9rZXl3b3JkczsKKworICAgIHZhcmlhbmNlX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiaW52YXJpYW50IikpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0b3JhZ2Vfa2V5d29yZHM7CisKKyAgICBzdG9yYWdlX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIGNvbnN0ICIpKTsKKyAgICBzdG9yYWdlX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIHVuaWZvcm0gIikpOworICAgIHN0b3JhZ2Vfa2V5d29yZHMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIgYXR0cmlidXRlICIpKTsKKyAgICBzdG9yYWdlX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIHZhcnlpbmcgIikpOworICAgIHN0b3JhZ2Vfa2V5d29yZHMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIgc2FtcGxlciAiKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcHJlY2lzaW9uX2tleXdvcmRzOworCisgICAgcHJlY2lzaW9uX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIGxvd3AgIikpOworICAgIHByZWNpc2lvbl9rZXl3b3Jkcy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIiBtZWRpdW1wICIpKTsKKyAgICBwcmVjaXNpb25fa2V5d29yZHMucHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIgaGlnaHAgIikpOworICAgIHByZWNpc2lvbl9rZXl3b3Jkcy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIiBzdXBlcnAgIikpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBhcmFtZXRlcl9rZXl3b3JkczsKKworICAgIHBhcmFtZXRlcl9rZXl3b3Jkcy5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIiBpbiAiKSk7IC8vIGMuZi4sICJpbnQiCisgICAgcGFyYW1ldGVyX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIG91dCAiKSk7CisgICAgcGFyYW1ldGVyX2tleXdvcmRzLnB1c2hfYmFjayhzdGQ6OnN0cmluZygiIGlub3V0ICIpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVjbHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFuY2UsIHN0b3JhZ2UsIHByZWNpc2lvbiwgcGFyYW1ldGVyOworICAgICAgICBzaXplX3Qgc3RvcmFnZV9wb3MsIHByZWNpc2lvbl9wb3MsIHBhcmFtZXRlcl9wb3M7CisKKyAgICAgICAgc3RvcmFnZV9wb3MgPSBtdWx0aV9maW5kKGRlY2xzW2ldLCBzdG9yYWdlX2tleXdvcmRzKTsKKyAgICAgICAgcHJlY2lzaW9uX3BvcyA9IG11bHRpX2ZpbmQoZGVjbHNbaV0sIHByZWNpc2lvbl9rZXl3b3Jkcyk7CisgICAgICAgIHBhcmFtZXRlcl9wb3MgPSBtdWx0aV9maW5kKGRlY2xzW2ldLCBwYXJhbWV0ZXJfa2V5d29yZHMpOworCisgICAgICAgIGlmIChzdG9yYWdlX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgICAgIHByZWNpc2lvbl9wb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGlmIChzdG9yYWdlX3BvcyA8IHByZWNpc2lvbl9wb3MpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyX3BvcyA+IHByZWNpc2lvbl9wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICplcnIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcmVjaXNpb25fcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmCisgICAgICAgICAgICAgICAgcGFyYW1ldGVyX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcl9wb3MgPiBwcmVjaXNpb25fcG9zKSB7CisgICAgICAgICAgICAgICAgKmVyciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX2dsc2xlc192YXJpYWJsZV9kZWNscygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByYXdfZGVjbHMsCisgICAgICAgIGJvb2wqIGVycikgeworICAgIHN0ZDo6c3RyaW5nIG9wZW5wYXIoIigiKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbm9uX2Z1bmN0aW9uX2RlY2xzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmF3X2RlY2xzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChyYXdfZGVjbHNbaV0uZmluZChvcGVucGFyKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgbm9uX2Z1bmN0aW9uX2RlY2xzLnB1c2hfYmFjayhyYXdfZGVjbHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIHZhbGlkYXRlX2tleXdvcmRzX2luX2RlY2xzKG5vbl9mdW5jdGlvbl9kZWNscywgZXJyKTsKK30KKworc3RhdGljIHZvaWQgdmFsaWRhdGVfZ2xzbGVzX2Z1bmN0aW9uX3BhcmFtZXRlcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmF3X2RlY2xzLAorICAgICAgICBib29sKiBlcnIpIHsKKworICAgIGJvb2wgcGFyc2VfZXJyID0gZmFsc2U7CisgICAgc3RkOjpzdHJpbmcgb3BlbnBhcigiKCIpOworICAgIHN0ZDo6c3RyaW5nIGNsb3NlcGFyKCIpIik7CisgICAgc3RkOjpzdHJpbmcgY29tbWEoIiwiKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZnVuY19wYXJhbV9kZWNsczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJhd19kZWNscy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAocmF3X2RlY2xzW2ldLmZpbmQob3BlbnBhcikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmdW5jX3BhcmFtcyA9CisgICAgICAgICAgICAgICAgaXNvbGF0ZV9pbl9vdXQocmF3X2RlY2xzW2ldLCBvcGVucGFyLCBjbG9zZXBhciwgJnBhcnNlX2Vycik7CisgICAgICAgICAgICBpZiAoZnVuY19wYXJhbXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgdXNlIHRoZSBmaXJzdCBzZXQgb2YgcGFyZW5zCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRoZXNlX3BhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIHNwbGl0KGNvbW1hLCBmdW5jX3BhcmFtc1swXSk7CisgICAgICAgICAgICAgICAgZnVuY19wYXJhbV9kZWNscy5pbnNlcnQoZnVuY19wYXJhbV9kZWNscy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVzZV9wYXJhbXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVzZV9wYXJhbXMuZW5kKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmFsaWRhdGVfa2V5d29yZHNfaW5fZGVjbHMoZnVuY19wYXJhbV9kZWNscywgZXJyKTsKK30KKworYm9vbCB2YWxpZGF0ZV9nbHNsZXNfa2V5d29yZHMoY29uc3QgY2hhciogc3JjKSB7CisgICAgYm9vbCBlcnIgPSBmYWxzZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByYXdfZGVjbHMgPSBwYXJzZV9yYXdfZGVjbGFyYXRpb25zKHNyYyk7CisKKyAgICAvLyBMaWJlcmFsIHZhbGlkYXRpb24gaWYgcGFyc2luZyBmYWlscworICAgIGlmIChyYXdfZGVjbHMuZW1wdHkoKSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmFsaWRhdGVfZ2xzbGVzX3ZhcmlhYmxlX2RlY2xzKHJhd19kZWNscywgJmVycik7CisgICAgdmFsaWRhdGVfZ2xzbGVzX2Z1bmN0aW9uX3BhcmFtZXRlcnMocmF3X2RlY2xzLCAmZXJyKTsKKyAgICByZXR1cm4gIWVycjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL1NoYWRlclZhbGlkYXRvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMRVNfVjIvU2hhZGVyVmFsaWRhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4NzdhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTEVTX1YyL1NoYWRlclZhbGlkYXRvci5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworYm9vbCB2YWxpZGF0ZV9nbHNsZXNfa2V5d29yZHMoY29uc3QgY2hhciogc3JjKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9BbmRyb2lkLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyNDk5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaG9zdF9jb21tb25fU1JDX0ZJTEVTIDo9ICAgICBcCisgICAgIEdMRGlzcGF0Y2guY3BwICAgICAgICAgIFwKKyAgICAgR0x1dGlscy5jcHAgICAgICAgICAgICAgXAorICAgICBHTEVTY29udGV4dC5jcHAgICAgICAgICBcCisgICAgIEdMRVN2YWxpZGF0ZS5jcHAgICAgICAgIFwKKyAgICAgR0xFU3BvaW50ZXIuY3BwICAgICAgICAgXAorICAgICBHTEVTYnVmZmVyLmNwcCAgICAgICAgICBcCisgICAgIE5hbWVkT2JqZWN0LmNwcCAgICAgICAgIFwKKyAgICAgUmFuZ2VNYW5pcC5jcHAgICAgICAgICAgXAorICAgICBUZXh0dXJlVXRpbHMuY3BwICAgICAgICBcCisgICAgIFBhbGV0dGVUZXh0dXJlLmNwcCAgICAgIFwKKyAgICAgZXRjLmNwcCAgICAgICAgICAgICAgICAgXAorICAgICBvYmplY3ROYW1lTWFuYWdlci5jcHAgICBcCisgICAgIE9iamVjdE5hbWVTcGFjZS5jcHAgICAgIFwKKyAgICAgRnJhbWVidWZmZXJEYXRhLmNwcAorCitob3N0X0dMX0NPTU1PTl9MSU5LRVJfRkxBR1MgOj0KK2hvc3RfY29tbW9uX0xETElCUyA6PQoraG9zdF9jb21tb25fTERGTEFHUyA6PQorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksbGludXgpCisjICAgIGhvc3RfY29tbW9uX0xERkxBR1MgKz0gLVdsLC0td2hvbGUtYXJjaGl2ZQorICAgIGhvc3RfY29tbW9uX0xETElCUyArPSAtbGRsCisgICAgaG9zdF9jb21tb25fTERGTEFHUyArPSAtV2wsLUJzeW1ib2xpYworZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgaG9zdF9jb21tb25fTERMSUJTICs9IC1sZ2RpMzIKKyAgICBob3N0X2NvbW1vbl9MREZMQUdTICs9IC1XbCwtLWFkZC1zdGRjYWxsLWFsaWFzCitlbmRpZgorCisjIyMgRUdMIGhvc3QgaW1wbGVtZW50YXRpb24gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1zdGF0aWMtbGlicmFyeSxsaWJHTGNvbW1vbikKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoaG9zdF9jb21tb25fU1JDX0ZJTEVTKQorJChjYWxsIGVtdWdsLWV4cG9ydCxMRExJQlMsJChob3N0X2NvbW1vbl9MRExJQlMpKQorJChjYWxsIGVtdWdsLWV4cG9ydCxMREZMQUdTLCQoaG9zdF9jb21tb25fTERGTEFHUykpCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChMT0NBTF9QQVRIKS8uLi9pbmNsdWRlICQoRU1VR0xfUEFUSCkvc2hhcmVkKQorJChjYWxsIGVtdWdsLWV4cG9ydCxTVEFUSUNfTElCUkFSSUVTLCBsaWJlbXVnbF9jb21tb24pCisKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQorCisjIyMgRUdMIHVuaXQgdGVzdHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1leGVjdXRhYmxlLGxpYiQoQlVJTERfVEFSR0VUX1NVRkZJWClHTGNvbW1vbl91bml0dGVzdHMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBFdGMyX3VuaXR0ZXN0LmNwcAorJChjYWxsIGVtdWdsLWltcG9ydCxsaWJHTGNvbW1vbiBsaWJlbXVnbF9ndGVzdCkKKyQoY2FsbCBsb2NhbC1saW5rLXN0YXRpYy1jKytsaWIpCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0V0YzJfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0V0YzJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTM2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vRXRjMl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDxHTGNvbW1vbi9ldGMuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHsKK2NsYXNzIEV0YzJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGNvbnN0IGludCBjUGF0Y2hTaXplID0gNDg7CisgICAgc3RhdGljIGNvbnN0IGludCBjRW5jb2RlZFNpemUgPSA4OworICAgIHZvaWQgZGVjb2RlVGVzdChjb25zdCBldGMxX2J5dGUqIGJ5dGVzRW5jb2RlZCwgY29uc3QgZXRjMV9ieXRlKiBleHBlY3RlZERlY29kZWQpIHsKKyAgICAgICAgZXRjMV9ieXRlIGRlY29kZWRbY1BhdGNoU2l6ZV07CisgICAgICAgIGV0YzJfZGVjb2RlX2Jsb2NrKGJ5dGVzRW5jb2RlZCwgZGVjb2RlZCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxjUGF0Y2hTaXplOyBpKyspIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZERlY29kZWRbaV0sIGRlY29kZWRbaV0pOworICAgICAgICB9CisgICAgfQorfTsKK30KKworLy8gVGhlIHRocmVlIHRlc3QgY2FzZXMgaGVyZSBjb3ZlciBULCBIIGFuZCBwbGFuYXIgY29kZWMsIHdoaWNoIGFyZQorLy8gaW50cm9kdWNlZCBpbiBFVEMyLgorCitURVNUX0YoRXRjMlRlc3QsIEVUQzJUKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBlbmNvZGVkW2NFbmNvZGVkU2l6ZV0gPSB7MjEsIDEwMSwgMTg2LCAxMzUsIDE2NiwgMjM4LCA3NCwgMTA2fTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV4cGVjdGVkRGVjb2RlZFtjUGF0Y2hTaXplXSA9IHsKKyAgICAgICAgMTUzLCAxMDIsIDg1LCAgIDE1MywgMTAyLCA4NSwgICAxNTMsIDEwMiwgODUsICAgMTUzLCAxMDIsIDg1LAorICAgICAgICAxNzEsIDE1NCwgMTIwLCAgMTcxLCAxNTQsIDEyMCwgIDE3MSwgMTU0LCAxMjAsICAxODcsIDE3MCwgMTM2LAorICAgICAgICAxODcsIDE3MCwgMTM2LCAgMTcxLCAxNTQsIDEyMCwgIDE4NywgMTcwLCAxMzYsICAyMDMsIDE4NiwgMTUyLAorICAgICAgICAxNzEsIDE1NCwgMTIwLCAgMTg3LCAxNzAsIDEzNiwgIDIwMywgMTg2LCAxNTIsICAxODcsIDE3MCwgMTM2fTsKKyAgICBkZWNvZGVUZXN0KChjb25zdCBldGMxX2J5dGUqKWVuY29kZWQsIChjb25zdCBldGMxX2J5dGUqKWV4cGVjdGVkRGVjb2RlZCk7Cit9CisKK1RFU1RfRihFdGMyVGVzdCwgRVRDMkgpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVuY29kZWRbY0VuY29kZWRTaXplXSA9IHsxMTAsIDEzLCAyMjgsIDE4NiwgMTE5LCAxMTksIDI1NSwgMTE3fTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV4cGVjdGVkRGVjb2RlZFtjUGF0Y2hTaXplXSA9IHsKKyAgICAgICAgMTk4LCAxNDcsIDExMywgIDE5OCwgMTQ3LCAxMTMsICAxOTgsIDE0NywgMTEzLCAgICAxOTgsIDE0NywgMTEzLAorICAgICAgICAyMTAsIDE1OSwgMTI1LCAgMTk4LCAxNDcsIDExMywgIDE5OCwgMTQ3LCAxMTMsICAgIDE5OCwgMTQ3LCAxMTMsCisgICAgICAgIDE5OCwgMTQ3LCAxMTMsICAxOTgsIDE0NywgMTEzLCAgMTk4LCAxNDcsIDExMywgICAgMTk4LCAxNDcsIDExMywKKyAgICAgICAgMjI3LCAyMTAsIDE5MywgIDIyNywgMjEwLCAxOTMsICAyMTUsIDE5OCwgMTgxLCAgICAyMTUsIDE5OCwgMTgxfTsKKyAgICBkZWNvZGVUZXN0KChjb25zdCBldGMxX2J5dGUqKWVuY29kZWQsIChjb25zdCBldGMxX2J5dGUqKWV4cGVjdGVkRGVjb2RlZCk7Cit9CisKK1RFU1RfRihFdGMyVGVzdCwgRVRDMlApIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGVuY29kZWRbY0VuY29kZWRTaXplXSA9IHs4OSwgMTM4LCAyNTAsIDc5LCAxMjAsIDE4MSwgMTQ2LCAyOX07CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBleHBlY3RlZERlY29kZWRbY1BhdGNoU2l6ZV0gPSB7CisgICAgICAgIDE3OCwgMTM5LCAxMTMsICAxNzMsIDEzNCwgMTA3LCAgMTY4LCAxMzAsIDEwMSwgIDE2MywgMTI1LCA5NSwKKyAgICAgICAgMTc4LCAxNDEsIDExNCwgIDE3MywgMTM2LCAxMDgsICAxNjgsIDEzMSwgMTAyLCAgMTYzLCAxMjYsIDk2LAorICAgICAgICAxNzgsIDE0MiwgMTE1LCAgMTczLCAxMzcsIDEwOSwgIDE2OCwgMTMzLCAxMDMsICAxNjMsIDEyOCwgOTcsCisgICAgICAgIDE3OCwgMTQ0LCAxMTYsICAxNzMsIDEzOSwgMTEwLCAgMTY4LCAxMzQsIDEwNCwgIDE2MywgMTI5LCA5OH07CisgICAgZGVjb2RlVGVzdCgoY29uc3QgZXRjMV9ieXRlKillbmNvZGVkLCAoY29uc3QgZXRjMV9ieXRlKilleHBlY3RlZERlY29kZWQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0ZyYW1lYnVmZmVyRGF0YS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vRnJhbWVidWZmZXJEYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODhkMmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0ZyYW1lYnVmZmVyRGF0YS5jcHAKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9GcmFtZWJ1ZmZlckRhdGEuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9HTEVTY29udGV4dC5oPgorCitGcmFtZWJ1ZmZlckRhdGE6OkZyYW1lYnVmZmVyRGF0YShHTHVpbnQgbmFtZSkgOiBtX2ZiTmFtZShuYW1lKSB7fQorCitGcmFtZWJ1ZmZlckRhdGE6On5GcmFtZWJ1ZmZlckRhdGEoKSB7CisgICAgZm9yIChpbnQgaT0wOyBpPE1BWF9BVFRBQ0hfUE9JTlRTOyBpKyspIHsKKyAgICAgICAgZGV0YWNoT2JqZWN0KGkpOworICAgIH0KK30KKwordm9pZCBGcmFtZWJ1ZmZlckRhdGE6OnNldEF0dGFjaG1lbnQoR0xlbnVtIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICBHTGVudW0gdGFyZ2V0LAorICAgICAgICAgICAgICAgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyIG9iaiwKKyAgICAgICAgICAgICAgIGJvb2wgdGFrZU93bmVyc2hpcCkgeworaW50IGlkeCA9IGF0dGFjaG1lbnRQb2ludEluZGV4KGF0dGFjaG1lbnQpOworICAgIGlmICghbmFtZSkgeworICAgICAgICBkZXRhY2hPYmplY3QoaWR4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobV9hdHRhY2hQb2ludHNbaWR4XS50YXJnZXQgIT0gdGFyZ2V0IHx8CisgICAgICAgIG1fYXR0YWNoUG9pbnRzW2lkeF0ubmFtZSAhPSBuYW1lIHx8CisgICAgICAgIG1fYXR0YWNoUG9pbnRzW2lkeF0ub2JqLmdldCgpICE9IG9iai5nZXQoKSB8fAorICAgICAgICBtX2F0dGFjaFBvaW50c1tpZHhdLm93bmVkICE9IHRha2VPd25lcnNoaXApIHsKKworICAgICAgICBkZXRhY2hPYmplY3QoaWR4KTsgCisKKyAgICAgICAgbV9hdHRhY2hQb2ludHNbaWR4XS50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIG1fYXR0YWNoUG9pbnRzW2lkeF0ubmFtZSA9IG5hbWU7CisgICAgICAgIG1fYXR0YWNoUG9pbnRzW2lkeF0ub2JqID0gb2JqOworICAgICAgICBtX2F0dGFjaFBvaW50c1tpZHhdLm93bmVkID0gdGFrZU93bmVyc2hpcDsKKworICAgICAgICBpZiAodGFyZ2V0ID09IEdMX1JFTkRFUkJVRkZFUl9PRVMgJiYgb2JqLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFJlbmRlcmJ1ZmZlckRhdGEgKnJiRGF0YSA9IChSZW5kZXJidWZmZXJEYXRhICopb2JqLmdldCgpOworICAgICAgICAgICAgcmJEYXRhLT5hdHRhY2hlZEZCID0gbV9mYk5hbWU7CisgICAgICAgICAgICByYkRhdGEtPmF0dGFjaGVkUG9pbnQgPSBhdHRhY2htZW50OworICAgICAgICB9CisKKyAgICAgICAgbV9kaXJ0eSA9IHRydWU7CisgICAgfQorfQorCitHTHVpbnQgRnJhbWVidWZmZXJEYXRhOjpnZXRBdHRhY2htZW50KEdMZW51bSBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICBHTGVudW0gKm91dFRhcmdldCwKKyAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0ciAqb3V0T2JqKSB7CisgICAgaW50IGlkeCA9IGF0dGFjaG1lbnRQb2ludEluZGV4KGF0dGFjaG1lbnQpOworICAgIGlmIChvdXRUYXJnZXQpICpvdXRUYXJnZXQgPSBtX2F0dGFjaFBvaW50c1tpZHhdLnRhcmdldDsKKyAgICBpZiAob3V0T2JqKSAqb3V0T2JqID0gbV9hdHRhY2hQb2ludHNbaWR4XS5vYmo7CisgICAgcmV0dXJuIG1fYXR0YWNoUG9pbnRzW2lkeF0ubmFtZTsKK30KKworaW50IEZyYW1lYnVmZmVyRGF0YTo6YXR0YWNobWVudFBvaW50SW5kZXgoR0xlbnVtIGF0dGFjaG1lbnQpCit7CisgICAgc3dpdGNoKGF0dGFjaG1lbnQpIHsKKyAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUzoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTOgorICAgICAgICByZXR1cm4gMjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTUFYX0FUVEFDSF9QT0lOVFM7CisgICAgfQorfQorCit2b2lkIEZyYW1lYnVmZmVyRGF0YTo6ZGV0YWNoT2JqZWN0KGludCBpZHgpIHsKKyAgICBpZiAobV9hdHRhY2hQb2ludHNbaWR4XS50YXJnZXQgPT0gR0xfUkVOREVSQlVGRkVSX09FUyAmJiBtX2F0dGFjaFBvaW50c1tpZHhdLm9iai5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIFJlbmRlcmJ1ZmZlckRhdGEgKnJiRGF0YSA9IChSZW5kZXJidWZmZXJEYXRhICopbV9hdHRhY2hQb2ludHNbaWR4XS5vYmouZ2V0KCk7CisgICAgICAgIHJiRGF0YS0+YXR0YWNoZWRGQiA9IDA7CisgICAgICAgIHJiRGF0YS0+YXR0YWNoZWRQb2ludCA9IDA7CisgICAgfQorCisgICAgaWYobV9hdHRhY2hQb2ludHNbaWR4XS5vd25lZCkKKyAgICB7CisgICAgICAgIHN3aXRjaChtX2F0dGFjaFBvaW50c1tpZHhdLnRhcmdldCkKKyAgICAgICAgeworICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9PRVM6CisgICAgICAgICAgICBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmKG1fYXR0YWNoUG9pbnRzW2lkeF0ubmFtZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgICAgICAgIEdMRVNjb250ZXh0OjpkaXNwYXRjaGVyKCkuZ2xEZWxldGVUZXh0dXJlcygxLCAmKG1fYXR0YWNoUG9pbnRzW2lkeF0ubmFtZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2F0dGFjaFBvaW50c1tpZHhdID0ge307Cit9CisKK3ZvaWQgRnJhbWVidWZmZXJEYXRhOjp2YWxpZGF0ZShHTEVTY29udGV4dCogY3R4KQoreworICAgIGlmKCFnZXRBdHRhY2htZW50KEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUywgTlVMTCwgTlVMTCkpCisgICAgeworICAgICAgICAvLyBHTEVTIGRvZXMgbm90IHJlcXVpcmUgdGhlIGZyYW1lYnVmZmVyIHRvIGhhdmUgYSBjb2xvciBhdHRhY2htZW50LgorICAgICAgICAvLyBPcGVuR0wgZG9lcy4gVGhlcmVmb3JlLCBpZiBubyBjb2xvciBpcyBhdHRhY2hlZCwgY3JlYXRlIGEgZHVtbXkKKyAgICAgICAgLy8gY29sb3IgdGV4dHVyZSBhbmQgYXR0YWNoIGl0LgorICAgICAgICAvLyBUaGlzIGR1bW15IGNvbG9yIHRleHR1cmUgd2lsbCBpcyBvd25lZCBieSB0aGUgRnJhbWVidWZmZXJPYmplY3QsCisgICAgICAgIC8vIGFuZCB3aWxsIGJlIHJlbGVhc2VkIGJ5IGl0IHdoZW4gaXRzIG9iamVjdCBpcyBkZXRhY2hlZC4KKworICAgICAgICBHTGludCB0eXBlID0gR0xfTk9ORTsKKyAgICAgICAgR0xpbnQgbmFtZSA9IDA7CisKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVChHTF9GUkFNRUJVRkZFUiwgR0xfREVQVEhfQVRUQUNITUVOVF9PRVMsIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUsICZ0eXBlKTsKKyAgICAgICAgaWYodHlwZSAhPSBHTF9OT05FKQorICAgICAgICB7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKEdMX0ZSQU1FQlVGRkVSLCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUywgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSwgJm5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVChHTF9GUkFNRUJVRkZFUiwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUywgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSwgJnR5cGUpOworICAgICAgICAgICAgaWYodHlwZSAhPSBHTF9OT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQoR0xfRlJBTUVCVUZGRVIsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMsIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUsICZuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBObyBjb2xvciwgZGVwdGggb3Igc3RlbmNpbCBhdHRhY2htZW50cyAtIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIHRoZSBleGlzdGluZyBhdHRhY2htZW50KHMpIGRpbWVuc2lvbnMKKyAgICAgICAgR0xpbnQgd2lkdGggPSAwOworICAgICAgICBHTGludCBoZWlnaHQgPSAwOworCisgICAgICAgIGlmKHR5cGUgPT0gR0xfUkVOREVSQlVGRkVSKQorICAgICAgICB7CisgICAgICAgICAgICBHTGludCBwcmV2OworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRJbnRlZ2VydihHTF9SRU5ERVJCVUZGRVJfQklORElORywgJnByZXYpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUiwgbmFtZSk7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKEdMX1JFTkRFUkJVRkZFUiwgR0xfUkVOREVSQlVGRkVSX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVChHTF9SRU5ERVJCVUZGRVIsIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQsICZoZWlnaHQpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUiwgcHJldik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZih0eXBlID09IEdMX1RFWFRVUkUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdMaW50IHByZXY7CisgICAgICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX1RFWFRVUkVfQklORElOR18yRCwgJnByZXYpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBuYW1lKTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCAwLCBHTF9URVhUVVJFX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xHZXRUZXhMZXZlbFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIDAsIEdMX1RFWFRVUkVfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgcHJldik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbG9yIGF0dGFjaG1lbnQgYW5kIGF0dGNoIGl0CisgICAgICAgIHVuc2lnbmVkIGludCB0ZXggPSAwOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdlblRleHR1cmVzKDEsICZ0ZXgpOworICAgICAgICBHTGludCBwcmV2OworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEdldEludGVnZXJ2KEdMX1RFWFRVUkVfQklORElOR18yRCwgJnByZXYpOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleCk7CisKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJpKCBHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QgKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJpKCBHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QgKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xUZXhQYXJhbWV0ZXJpKCBHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSApOworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbFRleFBhcmFtZXRlcmkoIEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFICk7CisgICAgICAgIGN0eC0+ZGlzcGF0Y2hlcigpLmdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCB3aWR0aCwgaGVpZ2h0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKworICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMsIEdMX1RFWFRVUkVfMkQsIHRleCwgMCk7CisgICAgICAgIHNldEF0dGFjaG1lbnQoR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTLCBHTF9URVhUVVJFXzJELCB0ZXgsIE9iamVjdERhdGFQdHIoKSwgdHJ1ZSk7CisKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBwcmV2KTsKKyAgICB9CisKKyAgICBpZihtX2RpcnR5KQorICAgIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGZvdW5kIGluIHNldmVyYWwgT3BlbkdMCisgICAgICAgIC8vIGRyaXZlcnMgKGUuZy4gQVRJJ3MpIC0gYWZ0ZXIgdGhlIGZyYW1lYnVmZmVyIGF0dGFjaG1lbnRzCisgICAgICAgIC8vIGhhdmUgY2hhbmdlZCwgYW5kIGJlZm9yZSB0aGUgbmV4dCBkcmF3LCB1bmJpbmQgYW5kIHJlYmluZAorICAgICAgICAvLyB0aGUgZnJhbWVidWZmZXIgdG8gc29ydCB0aGluZ3Mgb3V0LgorICAgICAgICBjdHgtPmRpc3BhdGNoZXIoKS5nbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUiwwKTsKKyAgICAgICAgY3R4LT5kaXNwYXRjaGVyKCkuZ2xCaW5kRnJhbWVidWZmZXJFWFQoCisgICAgICAgICAgICAgICAgR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgY3R4LT5zaGFyZUdyb3VwKCktPmdldEdsb2JhbE5hbWUoTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZiTmFtZSkpOworCisgICAgICAgIG1fZGlydHkgPSBmYWxzZTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTERpc3BhdGNoLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTERpc3BhdGNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzUxMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMRGlzcGF0Y2guY3BwCkBAIC0wLDAgKzEsMTIxIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiR0xjb21tb24vR0xEaXNwYXRjaC5oIgorI2luY2x1ZGUgIkdMY29tbW9uL0dMTGlicmFyeS5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc2hhcmVkX2xpYnJhcnkuaCIKKworI2luY2x1ZGUgIk9wZW5nbENvZGVjQ29tbW9uL0Vycm9yTG9nLmgiCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxHTC9nbHguaD4KKyNlbGlmIGRlZmluZWQoV0lOMzIpCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIEdsTGlicmFyeTo6R2xGdW5jdGlvblBvaW50ZXIgR0xfRlVOQ19QVFI7CisKK3N0YXRpYyBHTF9GVU5DX1BUUiBnZXRHTEZ1bmNBZGRyZXNzKGNvbnN0IGNoYXIgKmZ1bmNOYW1lLCBHbExpYnJhcnkqIGdsTGliKSB7CisgICAgcmV0dXJuIGdsTGliLT5maW5kU3ltYm9sKGZ1bmNOYW1lKTsKK30KKworI2RlZmluZSBMT0FEX0dMX0ZVTkMocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBhcmdzKSAgZG8geyBcCisgICAgICAgIGlmICghZnVuY19uYW1lKSB7IFwKKyAgICAgICAgICAgIHZvaWQqIGFkZHJlc3MgPSAodm9pZCAqKWdldEdMRnVuY0FkZHJlc3MoI2Z1bmNfbmFtZSwgZ2xMaWIpOyBcCisgICAgICAgICAgICBpZiAoYWRkcmVzcykgeyBcCisgICAgICAgICAgICAgICAgZnVuY19uYW1lID0gKF9fdHlwZW9mX18oZnVuY19uYW1lKSkoYWRkcmVzcyk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsb2FkIGZ1bmMgJXNcbiIsICNmdW5jX25hbWUpOyBcCisgICAgICAgICAgICAgICAgZnVuY19uYW1lID0gKF9fdHlwZW9mX18oZnVuY19uYW1lKSkoZHVtbXlfIyNmdW5jX25hbWUpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgTE9BRF9HTEVYVF9GVU5DKHJldHVybl90eXBlLCBmdW5jX25hbWUsIHNpZ25hdHVyZSwgYXJncykgZG8geyBcCisgICAgICAgIGlmICghZnVuY19uYW1lKSB7IFwKKyAgICAgICAgICAgIHZvaWQqIGFkZHJlc3MgPSAodm9pZCAqKWdldEdMRnVuY0FkZHJlc3MoI2Z1bmNfbmFtZSwgZ2xMaWIpOyBcCisgICAgICAgICAgICBpZiAoYWRkcmVzcykgeyBcCisgICAgICAgICAgICAgICAgZnVuY19uYW1lID0gKF9fdHlwZW9mX18oZnVuY19uYW1lKSkoYWRkcmVzcyk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKTsKKworCisvLyBEZWZpbmUgZHVtbXkgZnVuY3Rpb25zLCBvbmx5IGZvciBub24tZXh0ZW5zaW9ucy4KKworI2RlZmluZSBSRVRVUk5fdm9pZCByZXR1cm4KKyNkZWZpbmUgUkVUVVJOX0dMYm9vbGVhbiByZXR1cm4gR0xfRkFMU0UKKyNkZWZpbmUgUkVUVVJOX0dMaW50IHJldHVybiAwCisjZGVmaW5lIFJFVFVSTl9HTHVpbnQgcmV0dXJuIDBVCisjZGVmaW5lIFJFVFVSTl9HTGVudW0gcmV0dXJuIDAKKyNkZWZpbmUgUkVUVVJOX2ludCByZXR1cm4gMAorI2RlZmluZSBSRVRVUk5fR0xjb25zdHVieXRlcHRyIHJldHVybiBOVUxMCisKKyNkZWZpbmUgUkVUVVJOXyh4KSAgUkVUVVJOXyAjIyB4CisKKyNkZWZpbmUgREVGSU5FX0RVTU1ZX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmdW5jX25hbWUsIHNpZ25hdHVyZSwgYXJncykgXAorc3RhdGljIHJldHVybl90eXBlIGR1bW15XyMjZnVuY19uYW1lIHNpZ25hdHVyZSB7IFwKKyAgICBSRVRVUk5fKHJldHVybl90eXBlKTsgXAorfQorCisjZGVmaW5lIERFRklORV9EVU1NWV9FWFRFTlNJT05fRlVOQ1RJT04ocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBhcmdzKSBcCisgIC8vIG5vdGhpbmcgaGVyZQorCitMSVNUX0dMRVNfRlVOQ1RJT05TKERFRklORV9EVU1NWV9GVU5DVElPTiwgREVGSU5FX0RVTU1ZX0VYVEVOU0lPTl9GVU5DVElPTikKKworLy8gSW5pdGlhbGl6aW5nIHN0YXRpYyBHTERpc3BhdGNoIG1lbWJlcnMqLworCitlbXVnbDo6TXV0ZXggR0xEaXNwYXRjaDo6c19sb2NrOworCisjZGVmaW5lIEdMX0RJU1BBVENIX0RFRklORV9QT0lOVEVSKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUsIGFyZ3MpIFwKKyAgICBHTF9BUElDQUxMIHJldHVybl90eXBlIChHTF9BUElFTlRSWSAqR0xEaXNwYXRjaDo6ZnVuY3Rpb25fbmFtZSkgc2lnbmF0dXJlID0gTlVMTDsKKworTElTVF9HTEVTX0ZVTkNUSU9OUyhHTF9ESVNQQVRDSF9ERUZJTkVfUE9JTlRFUiwgR0xfRElTUEFUQ0hfREVGSU5FX1BPSU5URVIpCisKKy8vIENvbnN0cnVjdG9yLgorR0xEaXNwYXRjaDo6R0xEaXNwYXRjaCgpIDogbV9pc0xvYWRlZChmYWxzZSkge30KKworYm9vbCBHTERpc3BhdGNoOjppc0luaXRpYWxpemVkKCkgY29uc3QgeworICAgIHJldHVybiBtX2lzTG9hZGVkOworfQorCit2b2lkIEdMRGlzcGF0Y2g6OmRpc3BhdGNoRnVuY3MoR0xFU1ZlcnNpb24gdmVyc2lvbiwgR2xMaWJyYXJ5KiBnbExpYikgeworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgoc19sb2NrKTsKKyAgICBpZihtX2lzTG9hZGVkKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBMb2FkaW5nIE9wZW5HTCBmdW5jdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIEJPVEggR0xFUyAxLjEgJiBHTEVTIDIuMCovCisgICAgTElTVF9HTEVTX0NPTU1PTl9GVU5DVElPTlMoTE9BRF9HTF9GVU5DKQorICAgIExJU1RfR0xFU19FWFRFTlNJT05TX0ZVTkNUSU9OUyhMT0FEX0dMRVhUX0ZVTkMpCisKKyAgICAvKiBMb2FkaW5nIE9wZW5HTCBmdW5jdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBPTkxZIGZvciBpbXBsZW1lbnRpbmcgR0xFUyAxLjEqLworICAgIGlmKHZlcnNpb24gPT0gR0xFU18xXzEpeworICAgICAgICBMSVNUX0dMRVMxX09OTFlfRlVOQ1RJT05TKExPQURfR0xfRlVOQykKKyAgICAgICAgTElTVF9HTEVTMV9FWFRFTlNJT05TX0ZVTkNUSU9OUyhMT0FEX0dMRVhUX0ZVTkMpCisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IEdMRVNfMl8wKXsKKyAgICAgICAgTElTVF9HTEVTMl9PTkxZX0ZVTkNUSU9OUyhMT0FEX0dMX0ZVTkMpCisgICAgICAgIExJU1RfR0xFUzJfRVhURU5TSU9OU19GVU5DVElPTlMoTE9BRF9HTEVYVF9GVU5DKQorICAgIH0KKworICAgIC8qIExvYWQgZ2xHZXRTdHJpbmdpKCkgaWYgaXQgaXMgYXZhaWxhYmxlLCBzbyB1c2UgTE9BRF9HTEVYVF9GVU5DICovCisgICAgTElTVF9HTEVTM19PTkxZX0ZVTkNUSU9OUyhMT0FEX0dMRVhUX0ZVTkMpCisKKyAgICBtX2lzTG9hZGVkID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTYnVmZmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTYnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNkZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMRVNidWZmZXIuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8R0xjb21tb24vR0xFU2J1ZmZlci5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitib29sICBHTEVTYnVmZmVyOjpzZXRCdWZmZXIoR0x1aW50IHNpemUsR0x1aW50IHVzYWdlLGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIG1fc2l6ZSA9IHNpemU7CisgICAgbV91c2FnZSA9IHVzYWdlOworICAgIGlmKG1fZGF0YSkgeworICAgICAgICBkZWxldGUgW10gbV9kYXRhOworICAgICAgICBtX2RhdGEgPSBOVUxMOworICAgIH0KKyAgICBtX2RhdGEgPSBuZXcgdW5zaWduZWQgY2hhcltzaXplXTsKKyAgICBpZihtX2RhdGEpIHsKKyAgICAgICAgaWYoZGF0YSkgeworICAgICAgICAgICAgbWVtY3B5KG1fZGF0YSxkYXRhLHNpemUpOworICAgICAgICB9CisgICAgICAgIG1fY29udmVyc2lvbk1hbmFnZXIuY2xlYXIoKTsKKyAgICAgICAgbV9jb252ZXJzaW9uTWFuYWdlci5hZGRSYW5nZShSYW5nZSgwLG1fc2l6ZSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sICBHTEVTYnVmZmVyOjpzZXRTdWJCdWZmZXIoR0xpbnQgb2Zmc2V0LEdMdWludCBzaXplLGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIGlmKG9mZnNldCArIHNpemUgPiBtX3NpemUpIHJldHVybiBmYWxzZTsKKyAgICBtZW1jcHkobV9kYXRhK29mZnNldCxkYXRhLHNpemUpOworICAgIG1fY29udmVyc2lvbk1hbmFnZXIuYWRkUmFuZ2UoUmFuZ2Uob2Zmc2V0LHNpemUpKTsKKyAgICBtX2NvbnZlcnNpb25NYW5hZ2VyLm1lcmdlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgIEdMRVNidWZmZXI6OmdldENvbnZlcnNpb25zKGNvbnN0IFJhbmdlTGlzdCYgckluLFJhbmdlTGlzdCYgck91dCkgeworICAgICAgICBtX2NvbnZlcnNpb25NYW5hZ2VyLmRlbFJhbmdlcyhySW4sck91dCk7CisgICAgICAgIHJPdXQubWVyZ2UoKTsKK30KKworR0xFU2J1ZmZlcjo6fkdMRVNidWZmZXIoKSB7CisgICAgaWYobV9kYXRhKSB7CisgICAgICAgIGRlbGV0ZSBbXSBtX2RhdGE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMRVNjb250ZXh0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwN2FkMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTY29udGV4dC5jcHAKQEAgLTAsMCArMSw4NjIgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNjb250ZXh0Lmg+CisjaW5jbHVkZSA8R0xjb21tb24vR0xjb252ZXJzaW9uX21hY3Jvcy5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNtYWNyb3MuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPE9wZW5nbENvZGVjQ29tbW9uL0Vycm9yTG9nLmg+CisjaW5jbHVkZSA8R0xjb21tb24vR0xFU3ZhbGlkYXRlLmg+CisjaW5jbHVkZSA8R0xjb21tb24vVGV4dHVyZVV0aWxzLmg+CisjaW5jbHVkZSA8R0xjb21tb24vRnJhbWVidWZmZXJEYXRhLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvL2RlY2xlcmF0aW9uCitzdGF0aWMgdm9pZCBjb252ZXJ0Rml4ZWREaXJlY3RMb29wKGNvbnN0IGNoYXIqIGRhdGFJbix1bnNpZ25lZCBpbnQgc3RyaWRlSW4sdm9pZCogZGF0YU91dCx1bnNpZ25lZCBpbnQgbkJ5dGVzLHVuc2lnbmVkIGludCBzdHJpZGVPdXQsaW50IGF0dHJpYlNpemUpOworc3RhdGljIHZvaWQgY29udmVydEZpeGVkSW5kaXJlY3RMb29wKGNvbnN0IGNoYXIqIGRhdGFJbix1bnNpZ25lZCBpbnQgc3RyaWRlSW4sdm9pZCogZGF0YU91dCxHTHNpemVpIGNvdW50LEdMZW51bSBpbmRpY2VzX3R5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLHVuc2lnbmVkIGludCBzdHJpZGVPdXQsaW50IGF0dHJpYlNpemUpOworc3RhdGljIHZvaWQgY29udmVydEJ5dGVEaXJlY3RMb29wKGNvbnN0IGNoYXIqIGRhdGFJbix1bnNpZ25lZCBpbnQgc3RyaWRlSW4sdm9pZCogZGF0YU91dCx1bnNpZ25lZCBpbnQgbkJ5dGVzLHVuc2lnbmVkIGludCBzdHJpZGVPdXQsaW50IGF0dHJpYlNpemUpOworc3RhdGljIHZvaWQgY29udmVydEJ5dGVJbmRpcmVjdExvb3AoY29uc3QgY2hhciogZGF0YUluLHVuc2lnbmVkIGludCBzdHJpZGVJbix2b2lkKiBkYXRhT3V0LEdMc2l6ZWkgY291bnQsR0xlbnVtIGluZGljZXNfdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXMsdW5zaWduZWQgaW50IHN0cmlkZU91dCxpbnQgYXR0cmliU2l6ZSk7CisKK0dMRVNDb252ZXJzaW9uQXJyYXlzOjp+R0xFU0NvbnZlcnNpb25BcnJheXMoKSB7CisgICAgZm9yKGF1dG8gaXQgPSBtX2FycmF5cy5iZWdpbigpOyBpdCAhPSBtX2FycmF5cy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZigoKml0KS5zZWNvbmQuYWxsb2NhdGVkKXsKKyAgICAgICAgICAgIGlmKCgqaXQpLnNlY29uZC50eXBlID09IEdMX0ZMT0FUKXsKKyAgICAgICAgICAgICAgICBHTGZsb2F0KiBwID0gKEdMZmxvYXQgKikoKCppdCkuc2Vjb25kLmRhdGEpOworICAgICAgICAgICAgICAgIGlmKHApIGRlbGV0ZVtdIHA7CisgICAgICAgICAgICB9IGVsc2UgaWYoKCppdCkuc2Vjb25kLnR5cGUgPT0gR0xfU0hPUlQpeworICAgICAgICAgICAgICAgIEdMc2hvcnQqIHAgPSAoR0xzaG9ydCAqKSgoKml0KS5zZWNvbmQuZGF0YSk7CisgICAgICAgICAgICAgICAgaWYocCkgZGVsZXRlW10gcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBHTEVTQ29udmVyc2lvbkFycmF5czo6YWxsb2NBcnIodW5zaWduZWQgaW50IHNpemUsR0xlbnVtIHR5cGUpeworICAgIGlmKHR5cGUgPT0gR0xfRklYRUQpeworICAgICAgICBtX2FycmF5c1ttX2N1cnJlbnRdLmRhdGEgPSBuZXcgR0xmbG9hdFtzaXplXTsKKyAgICAgICAgbV9hcnJheXNbbV9jdXJyZW50XS50eXBlID0gR0xfRkxPQVQ7CisgICAgfSBlbHNlIGlmKHR5cGUgPT0gR0xfQllURSl7CisgICAgICAgIG1fYXJyYXlzW21fY3VycmVudF0uZGF0YSA9IG5ldyBHTHNob3J0W3NpemVdOworICAgICAgICBtX2FycmF5c1ttX2N1cnJlbnRdLnR5cGUgPSBHTF9TSE9SVDsKKyAgICB9CisgICAgbV9hcnJheXNbbV9jdXJyZW50XS5zdHJpZGUgPSAwOworICAgIG1fYXJyYXlzW21fY3VycmVudF0uYWxsb2NhdGVkID0gdHJ1ZTsKK30KKwordm9pZCBHTEVTQ29udmVyc2lvbkFycmF5czo6c2V0QXJyKHZvaWQqIGRhdGEsdW5zaWduZWQgaW50IHN0cmlkZSxHTGVudW0gdHlwZSl7CisgICBtX2FycmF5c1ttX2N1cnJlbnRdLnR5cGUgPSB0eXBlOworICAgbV9hcnJheXNbbV9jdXJyZW50XS5kYXRhID0gZGF0YTsKKyAgIG1fYXJyYXlzW21fY3VycmVudF0uc3RyaWRlID0gc3RyaWRlOworICAgbV9hcnJheXNbbV9jdXJyZW50XS5hbGxvY2F0ZWQgPSBmYWxzZTsKK30KKwordm9pZCogR0xFU0NvbnZlcnNpb25BcnJheXM6OmdldEN1cnJlbnREYXRhKCl7CisgICAgcmV0dXJuIG1fYXJyYXlzW21fY3VycmVudF0uZGF0YTsKK30KKworQXJyYXlEYXRhJiBHTEVTQ29udmVyc2lvbkFycmF5czo6Z2V0Q3VycmVudEFycmF5KCl7CisgICAgcmV0dXJuIG1fYXJyYXlzW21fY3VycmVudF07Cit9CisKK3Vuc2lnbmVkIGludCBHTEVTQ29udmVyc2lvbkFycmF5czo6Z2V0Q3VycmVudEluZGV4KCl7CisgICAgcmV0dXJuIG1fY3VycmVudDsKK30KKworQXJyYXlEYXRhJiBHTEVTQ29udmVyc2lvbkFycmF5czo6b3BlcmF0b3JbXShpbnQgaSl7CisgICAgcmV0dXJuIG1fYXJyYXlzW2ldOworfQorCit2b2lkIEdMRVNDb252ZXJzaW9uQXJyYXlzOjpvcGVyYXRvcisrKCl7CisgICAgbV9jdXJyZW50Kys7Cit9CisKK0dMRGlzcGF0Y2ggICAgIEdMRVNjb250ZXh0OjpzX2dsRGlzcGF0Y2g7CitlbXVnbDo6TXV0ZXggICBHTEVTY29udGV4dDo6c19sb2NrOworc3RkOjpzdHJpbmcqICAgR0xFU2NvbnRleHQ6OnNfZ2xFeHRlbnNpb25zPSBOVUxMOworc3RkOjpzdHJpbmcgICAgR0xFU2NvbnRleHQ6OnNfZ2xWZW5kb3I7CitzdGQ6OnN0cmluZyAgICBHTEVTY29udGV4dDo6c19nbFJlbmRlcmVyOworc3RkOjpzdHJpbmcgICAgR0xFU2NvbnRleHQ6OnNfZ2xWZXJzaW9uOworR0xTdXBwb3J0ICAgICAgR0xFU2NvbnRleHQ6OnNfZ2xTdXBwb3J0OworCitWZXJzaW9uOjpWZXJzaW9uKGludCBtYWpvcixpbnQgbWlub3IsaW50IHJlbGVhc2UpOm1fbWFqb3IobWFqb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21pbm9yKG1pbm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9yZWxlYXNlKHJlbGVhc2Upe307CisKK1ZlcnNpb246OlZlcnNpb24oY29uc3QgVmVyc2lvbiYgdmVyKTptX21ham9yKHZlci5tX21ham9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX21pbm9yKHZlci5tX21pbm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JlbGVhc2UodmVyLm1fcmVsZWFzZSl7fQorCitWZXJzaW9uOjpWZXJzaW9uKGNvbnN0IGNoYXIqIHZlcnNpb25TdHJpbmcpeworICAgIG1fcmVsZWFzZSA9IDA7CisgICAgaWYoKCF2ZXJzaW9uU3RyaW5nKSB8fAorICAgICAgKCghKHNzY2FuZih2ZXJzaW9uU3RyaW5nLCIlZC4lZCIgICAsJm1fbWFqb3IsJm1fbWlub3IpID09IDIpKSAmJgorICAgICAgICghKHNzY2FuZih2ZXJzaW9uU3RyaW5nLCIlZC4lZC4lZCIsJm1fbWFqb3IsJm1fbWlub3IsJm1fcmVsZWFzZSkgPT0gMykpKSl7CisgICAgICAgIG1fbWFqb3IgPSBtX21pbm9yID0gMDsgLy8gdGhlIHZlcnNpb24gaXMgbm90IGluIHRoZSByaWdodCBmb3JtYXQKKyAgICB9Cit9CisKK1ZlcnNpb24mIFZlcnNpb246Om9wZXJhdG9yPShjb25zdCBWZXJzaW9uJiB2ZXIpeworICAgIG1fbWFqb3IgICA9IHZlci5tX21ham9yOworICAgIG1fbWlub3IgICA9IHZlci5tX21pbm9yOworICAgIG1fcmVsZWFzZSA9IHZlci5tX3JlbGVhc2U7CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFZlcnNpb246Om9wZXJhdG9yPChjb25zdCBWZXJzaW9uJiB2ZXIpIGNvbnN0eworICAgIGlmKG1fbWFqb3IgPCB2ZXIubV9tYWpvcikgcmV0dXJuIHRydWU7CisgICAgaWYobV9tYWpvciA9PSB2ZXIubV9tYWpvcil7CisgICAgICAgIGlmKG1fbWlub3IgPCB2ZXIubV9taW5vcikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmKG1fbWlub3IgPT0gdmVyLm1fbWlub3IpeworICAgICAgICAgICByZXR1cm4gbV9yZWxlYXNlIDwgdmVyLm1fcmVsZWFzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRIb3N0RXh0ZW5zaW9uc1N0cmluZyhHTERpc3BhdGNoKiBkaXNwYXRjaCkgeworICAgIC8vIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpIGlzIGRlcHJlY2F0ZWQgaW4gR0wgMy4wLCBvbmUgaGFzIHRvIHVzZQorICAgIC8vIGdsR2V0U3RyaW5naShHTF9FWFRFTlNJT05TLCBpbmRleCkgaW5zdGVhZCB0byBnZXQgaW5kaXZpZHVhbCBleHRlbnNpb24KKyAgICAvLyBuYW1lcy4gUmVjZW50IGRlc2t0b3AgZHJpdmVycyBpbXBsZW1lbnQgZ2xHZXRTdHJpbmdpKCkgYnV0IGhhdmUgYQorICAgIC8vIHZlcnNpb24gb2YgZ2xHZXRTdHJpbmcoKSB0aGF0IHJldHVybnMgTlVMTCwgc28gZGVhbCB3aXRoIHRoaXMgYnkKKyAgICAvLyBkb2luZyB0aGUgZm9sbG93aW5nOgorICAgIC8vCisgICAgLy8gIC0gSWYgZ2xHZXRTdHJpbmdpKCkgaXMgYXZhaWxhYmxlLCBhbmQgZ2xHZXRJbnRlZ2VydihHTF9OVU1fRVhURU5TSU9OUyAmbnVtX2V4dHMpCisgICAgLy8gICAgZ2l2ZXMgYSBub256ZXJvIHZhbHVlLCB1c2UgaXQgdG8gYnVpbGQgdGhlIGV4dGVuc2lvbnMKKyAgICAvLyAgICBzdHJpbmcsIHVzaW5nIHNpbXBsZSBzcGFjZXMgdG8gc2VwYXJhdGUgdGhlIG5hbWVzLgorICAgIC8vCisgICAgLy8gIC0gT3RoZXJ3aXNlLCBmYWxsYmFjayB0byBnZXRHZXRTdHJpbmcoKS4gSWYgaXQgcmV0dXJucyBOVUxMLCByZXR1cm4KKyAgICAvLyAgICBhbiBlbXB0eSBzdHJpbmcuCisgICAgLy8KKworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBpbnQgbnVtX2V4dHMgPSAwOworCisgICAgaWYgKGRpc3BhdGNoLT5nbEdldFN0cmluZ2kpIHsKKyAgICAgICAgZGlzcGF0Y2gtPmdsR2V0SW50ZWdlcnYoR0xfTlVNX0VYVEVOU0lPTlMsICZudW1fZXh0cyk7CisgICAgICAgIEdMZW51bSBlcnIgPSBkaXNwYXRjaC0+Z2xHZXRFcnJvcigpOworICAgICAgICBpZiAoZXJyID09IEdMX05PX0VSUk9SKSB7CisgICAgICAgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bV9leHRzOyBuKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoLT5nbEdldFN0cmluZ2koR0xfRVhURU5TSU9OUywgbikpOworICAgICAgICAgICAgICAgIGlmIChleHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBleHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgZ2xHZXRJbnRlZ2VydiBkb2VzIG5vdCBhZmZlY3QgdGhlIHZhbHVlLAorICAgIC8vIG91ciBzeXN0ZW0gZG9lcyBub3QgYWN0dWFsbHkgc3VwcG9ydAorICAgIC8vIEdMIDMuMCBzdHlsZSBleHRlbnNpb24gZ2V0dGluZy4KKyAgICBpZiAoIWRpc3BhdGNoLT5nbEdldFN0cmluZ2kgfHwgbnVtX2V4dHMgPT0gMCkgeworICAgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oCisgICAgICAgICAgICAgICAgZGlzcGF0Y2gtPmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKyAgICAgICAgaWYgKGV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGb3IgdGhlIHNha2Ugb2YgaW5pdENhcHNMb2NrZWQoKSBhZGQgYSBzdGFydGluZyBhbmQgdHJhaWxpbmcgc3BhY2UuCisgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgeworICAgICAgICBpZiAocmVzdWx0WzBdICE9ICcgJykgeworICAgICAgICAgICAgcmVzdWx0Lmluc2VydCgwLCAxLCAnICcpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHRbcmVzdWx0LnNpemUoKSAtIDFVXSAhPSAnICcpIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAnICc7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEdMdWludCBnZXRJbmRleChHTGVudW0gaW5kaWNlc190eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMsIHVuc2lnbmVkIGludCBpKSB7CisgICAgc3dpdGNoIChpbmRpY2VzX3R5cGUpIHsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEdMdWJ5dGUqPihpbmRpY2VzKVtpXTsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBHTHVzaG9ydCo+KGluZGljZXMpW2ldOworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBHTHVpbnQqPihpbmRpY2VzKVtpXTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVSUigiKioqKiBFUlJPUiB1bmtub3duIHR5cGUgMHgleCAoJXMsJWQpXG4iLCBpbmRpY2VzX3R5cGUsIF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OmluaXQoR2xMaWJyYXJ5KiBnbExpYikgeworCisgICAgaWYgKCFzX2dsRXh0ZW5zaW9ucykgeworICAgICAgICBpbml0Q2Fwc0xvY2tlZChyZWludGVycHJldF9jYXN0PGNvbnN0IEdMdWJ5dGUqPigKKyAgICAgICAgICAgICAgICBnZXRIb3N0RXh0ZW5zaW9uc1N0cmluZygmc19nbERpc3BhdGNoKS5jX3N0cigpKSk7CisgICAgICAgIC8vIE5PVEU6IHRoZSBzdHJpbmcgYmVsb3cgY29ycmVzcG9uZHMgdG8gdGhlIGV4dGVuc2lvbnMgcmVwb3J0ZWQKKyAgICAgICAgLy8gYnkgdGhpcyBjb250ZXh0LCB3aGljaCBpcyBpbml0aWFsaXplZCBpbiBlYWNoIEdMRVN2MSBvciBHTEVTdjIKKyAgICAgICAgLy8gY29udGV4dCBpbXBsZW1lbnRhdGlvbiwgYmFzZWQgb24gdGhlIHBhcnNpbmcgb2YgdGhlIGhvc3QKKyAgICAgICAgLy8gZXh0ZW5zaW9ucyBzdHJpbmcgcGVyZm9ybWVkIGJ5IGluaXRDYXBzTG9ja2VkKCkuIEkuZS4gaXQgd2lsbAorICAgICAgICAvLyBiZSBwb3B1bGF0ZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIDo6aW5pdCgpIG1ldGhvZC4KKyAgICAgICAgc19nbEV4dGVuc2lvbnMgPSBuZXcgc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICBpZiAoIW1faW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaW5pdEV4dGVuc2lvblN0cmluZygpOworCisgICAgICAgIGludCBtYXhUZXhVbml0cyA9IGdldE1heENvbWJpbmVkVGV4VW5pdHMoKTsKKyAgICAgICAgbV90ZXhTdGF0ZSA9IG5ldyB0ZXh0dXJlVW5pdFN0YXRlW21heFRleFVuaXRzXTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8bWF4VGV4VW5pdHM7KytpKSB7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7ajxOVU1fVEVYVFVSRV9UQVJHRVRTOysraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3RleFN0YXRlW2ldW2pdLnRleHR1cmUgPSAwOworICAgICAgICAgICAgICAgIG1fdGV4U3RhdGVbaV1bal0uZW5hYmxlZCA9IEdMX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitHTGVudW0gR0xFU2NvbnRleHQ6OmdldEdMZXJyb3IoKSB7CisgICAgcmV0dXJuIG1fZ2xFcnJvcjsKK30KKwordm9pZCBHTEVTY29udGV4dDo6c2V0R0xlcnJvcihHTGVudW0gZXJyKSB7CisgICAgbV9nbEVycm9yID0gZXJyOworfQorCit2b2lkIEdMRVNjb250ZXh0OjpzZXRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXgpIHsKKyAgIG1fYWN0aXZlVGV4dHVyZSA9IHRleCAtIEdMX1RFWFRVUkUwOworfQorCitHTEVTY29udGV4dDo6fkdMRVNjb250ZXh0KCkgeworICAgIGZvcihBcnJheXNNYXA6Oml0ZXJhdG9yIGl0ID0gbV9tYXAuYmVnaW4oKTsgaXQgIT0gbV9tYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgR0xFU3BvaW50ZXIqIHAgPSAoKml0KS5zZWNvbmQ7CisgICAgICAgIGlmKHApIHsKKyAgICAgICAgICAgIGRlbGV0ZSBwOworICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZVtdIG1fdGV4U3RhdGU7CisgICAgbV90ZXhTdGF0ZSA9IE5VTEw7Cit9CisKK2NvbnN0IEdMdm9pZCogR0xFU2NvbnRleHQ6OnNldFBvaW50ZXIoR0xlbnVtIGFyclR5cGUsR0xpbnQgc2l6ZSxHTGVudW0gdHlwZSxHTHNpemVpIHN0cmlkZSxjb25zdCBHTHZvaWQqIGRhdGEsYm9vbCBub3JtYWxpemUpIHsKKyAgICBHTHVpbnQgYnVmZmVyTmFtZSA9IG1fYXJyYXlCdWZmZXI7CisgICAgaWYoYnVmZmVyTmFtZSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gU2FmZVVJbnRGcm9tUG9pbnRlcihkYXRhKTsKKyAgICAgICAgR0xFU2J1ZmZlciogdmJvID0gc3RhdGljX2Nhc3Q8R0xFU2J1ZmZlcio+KAorICAgICAgICAgICAgICAgIG1fc2hhcmVHcm91cAorICAgICAgICAgICAgICAgICAgICAgICAgLT5nZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck5hbWUpKTsKKyAgICAgICAgbV9tYXBbYXJyVHlwZV0tPnNldEJ1ZmZlcihzaXplLHR5cGUsc3RyaWRlLHZibyxidWZmZXJOYW1lLG9mZnNldCxub3JtYWxpemUpOworICAgICAgICByZXR1cm4gIHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPih2Ym8tPmdldERhdGEoKSkgKyAgb2Zmc2V0OworICAgIH0KKyAgICBtX21hcFthcnJUeXBlXS0+c2V0QXJyYXkoc2l6ZSx0eXBlLHN0cmlkZSxkYXRhLG5vcm1hbGl6ZSk7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OmVuYWJsZUFycihHTGVudW0gYXJyLGJvb2wgZW5hYmxlKSB7CisgICAgbV9tYXBbYXJyXS0+ZW5hYmxlKGVuYWJsZSk7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OmlzQXJyRW5hYmxlZChHTGVudW0gYXJyKSB7CisgICAgcmV0dXJuIG1fbWFwW2Fycl0tPmlzRW5hYmxlKCk7Cit9CisKK2NvbnN0IEdMRVNwb2ludGVyKiBHTEVTY29udGV4dDo6Z2V0UG9pbnRlcihHTGVudW0gYXJyVHlwZSkgeworICAgIGNvbnN0IGF1dG8gaXQgPSBtX21hcC5maW5kKGFyclR5cGUpOworICAgIHJldHVybiBpdCAhPSBtX21hcC5lbmQoKSA/IGl0LT5zZWNvbmQgOiBudWxscHRyOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0Rml4ZWREaXJlY3RMb29wKGNvbnN0IGNoYXIqIGRhdGFJbix1bnNpZ25lZCBpbnQgc3RyaWRlSW4sdm9pZCogZGF0YU91dCx1bnNpZ25lZCBpbnQgbkJ5dGVzLHVuc2lnbmVkIGludCBzdHJpZGVPdXQsaW50IGF0dHJpYlNpemUpIHsKKworICAgIGZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuQnl0ZXM7aSs9c3RyaWRlT3V0KSB7CisgICAgICAgIGNvbnN0IEdMZml4ZWQqIGZpeGVkX2RhdGEgPSAoY29uc3QgR0xmaXhlZCAqKWRhdGFJbjsKKyAgICAgICAgLy9maWxsaW5nIGF0dHJpYgorICAgICAgICBmb3IoaW50IGo9MDtqPGF0dHJpYlNpemU7aisrKSB7CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEdMZmxvYXQqPigmc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGRhdGFPdXQpW2ldKVtqXSA9IFgyRihmaXhlZF9kYXRhW2pdKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhSW4gKz0gc3RyaWRlSW47CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0Rml4ZWRJbmRpcmVjdExvb3AoY29uc3QgY2hhciogZGF0YUluLHVuc2lnbmVkIGludCBzdHJpZGVJbix2b2lkKiBkYXRhT3V0LEdMc2l6ZWkgY291bnQsR0xlbnVtIGluZGljZXNfdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXMsdW5zaWduZWQgaW50IHN0cmlkZU91dCxpbnQgYXR0cmliU2l6ZSkgeworICAgIGZvcihpbnQgaSA9IDAgO2kgPCBjb3VudCA7aSsrKSB7CisgICAgICAgIEdMdWludCBpbmRleCA9IGdldEluZGV4KGluZGljZXNfdHlwZSwgaW5kaWNlcywgaSk7CisKKyAgICAgICAgY29uc3QgR0xmaXhlZCogZml4ZWRfZGF0YSA9IChHTGZpeGVkICopKGRhdGFJbiAgKyBpbmRleCpzdHJpZGVJbik7CisgICAgICAgIEdMZmxvYXQqIGZsb2F0X2RhdGEgPSByZWludGVycHJldF9jYXN0PEdMZmxvYXQqPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YU91dCkgKyBpbmRleCpzdHJpZGVPdXQpOworCisgICAgICAgIGZvcihpbnQgaj0wO2o8YXR0cmliU2l6ZTtqKyspIHsKKyAgICAgICAgICAgIGZsb2F0X2RhdGFbal0gPSBYMkYoZml4ZWRfZGF0YVtqXSk7CisgICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0Qnl0ZURpcmVjdExvb3AoY29uc3QgY2hhciogZGF0YUluLHVuc2lnbmVkIGludCBzdHJpZGVJbix2b2lkKiBkYXRhT3V0LHVuc2lnbmVkIGludCBuQnl0ZXMsdW5zaWduZWQgaW50IHN0cmlkZU91dCxpbnQgYXR0cmliU2l6ZSkgeworCisgICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG5CeXRlcztpKz1zdHJpZGVPdXQpIHsKKyAgICAgICAgY29uc3QgR0xieXRlKiBieXRlX2RhdGEgPSAoY29uc3QgR0xieXRlICopZGF0YUluOworICAgICAgICAvL2ZpbGxpbmcgYXR0cmliCisgICAgICAgIGZvcihpbnQgaj0wO2o8YXR0cmliU2l6ZTtqKyspIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0xzaG9ydCo+KCZzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YU91dClbaV0pW2pdID0gQjJTKGJ5dGVfZGF0YVtqXSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YUluICs9IHN0cmlkZUluOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydEJ5dGVJbmRpcmVjdExvb3AoY29uc3QgY2hhciogZGF0YUluLHVuc2lnbmVkIGludCBzdHJpZGVJbix2b2lkKiBkYXRhT3V0LEdMc2l6ZWkgY291bnQsR0xlbnVtIGluZGljZXNfdHlwZSxjb25zdCBHTHZvaWQqIGluZGljZXMsdW5zaWduZWQgaW50IHN0cmlkZU91dCxpbnQgYXR0cmliU2l6ZSkgeworICAgIGZvcihpbnQgaSA9IDAgO2kgPCBjb3VudCA7aSsrKSB7CisgICAgICAgIEdMdWludCBpbmRleCA9IGdldEluZGV4KGluZGljZXNfdHlwZSwgaW5kaWNlcywgaSk7CisgICAgICAgIGNvbnN0IEdMYnl0ZSogYnl0ZXNfZGF0YSA9IChHTGJ5dGUgKikoZGF0YUluICArIGluZGV4KnN0cmlkZUluKTsKKyAgICAgICAgR0xzaG9ydCogc2hvcnRfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8R0xzaG9ydCo+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhT3V0KSArIGluZGV4KnN0cmlkZU91dCk7CisKKyAgICAgICAgZm9yKGludCBqPTA7ajxhdHRyaWJTaXplO2orKykgeworICAgICAgICAgICAgc2hvcnRfZGF0YVtqXSA9IEIyUyhieXRlc19kYXRhW2pdKTsKKyAgICAgICAgIH0KKyAgICB9Cit9CitzdGF0aWMgdm9pZCBkaXJlY3RUb0J5dGVzUmFuZ2VzKEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQsR0xFU3BvaW50ZXIqIHAsUmFuZ2VMaXN0JiBsaXN0KSB7CisKKyAgICBpbnQgYXR0cmliU2l6ZSA9IHAtPmdldFNpemUoKSo0OyAvLzQgaXMgdGhlIHNpemVvZiBHTGZpeGVkIG9yIEdMZmxvYXQgaW4gYnl0ZXMKKyAgICBpbnQgc3RyaWRlID0gcC0+Z2V0U3RyaWRlKCk/cC0+Z2V0U3RyaWRlKCk6YXR0cmliU2l6ZTsKKyAgICBpbnQgc3RhcnQgID0gcC0+Z2V0QnVmZmVyT2Zmc2V0KCkrZmlyc3QqYXR0cmliU2l6ZTsKKyAgICBpZighcC0+Z2V0U3RyaWRlKCkpIHsKKyAgICAgICAgbGlzdC5hZGRSYW5nZShSYW5nZShzdGFydCxjb3VudCphdHRyaWJTaXplKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGludCBpID0gMCA7aSA8IGNvdW50OyBpKyssc3RhcnQrPXN0cmlkZSkgeworICAgICAgICAgICAgbGlzdC5hZGRSYW5nZShSYW5nZShzdGFydCxhdHRyaWJTaXplKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGluZGlyZWN0VG9CeXRlc1Jhbmdlcyhjb25zdCBHTHZvaWQqIGluZGljZXMsR0xlbnVtIGluZGljZXNfdHlwZSxHTHNpemVpIGNvdW50LEdMRVNwb2ludGVyKiBwLFJhbmdlTGlzdCYgbGlzdCkgeworCisgICAgaW50IGF0dHJpYlNpemUgPSBwLT5nZXRTaXplKCkgKiA0OyAvLzQgaXMgdGhlIHNpemVvZiBHTGZpeGVkIG9yIEdMZmxvYXQgaW4gYnl0ZXMKKyAgICBpbnQgc3RyaWRlID0gcC0+Z2V0U3RyaWRlKCk/cC0+Z2V0U3RyaWRlKCk6YXR0cmliU2l6ZTsKKyAgICBpbnQgc3RhcnQgID0gcC0+Z2V0QnVmZmVyT2Zmc2V0KCk7CisgICAgZm9yKGludCBpPTAgOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBHTHVpbnQgaW5kZXggPSBnZXRJbmRleChpbmRpY2VzX3R5cGUsIGluZGljZXMsIGkpOworICAgICAgICBsaXN0LmFkZFJhbmdlKFJhbmdlKHN0YXJ0K2luZGV4KnN0cmlkZSxhdHRyaWJTaXplKSk7CisKKyAgICB9Cit9CisKK2ludCBieXRlc1Jhbmdlc1RvSW5kaWNlcyhSYW5nZUxpc3QmIHJhbmdlcyxHTEVTcG9pbnRlciogcCxHTHVpbnQqIGluZGljZXMpIHsKKworICAgIGludCBhdHRyaWJTaXplID0gcC0+Z2V0U2l6ZSgpICogNDsgLy80IGlzIHRoZSBzaXplb2YgR0xmaXhlZCBvciBHTGZsb2F0IGluIGJ5dGVzCisgICAgaW50IHN0cmlkZSA9IHAtPmdldFN0cmlkZSgpP3AtPmdldFN0cmlkZSgpOmF0dHJpYlNpemU7CisgICAgaW50IG9mZnNldCA9IHAtPmdldEJ1ZmZlck9mZnNldCgpOworCisgICAgaW50IG4gPSAwOworICAgIGZvcihpbnQgaT0wO2k8cmFuZ2VzLnNpemUoKTtpKyspIHsKKyAgICAgICAgaW50IHN0YXJ0SW5kZXggPSAocmFuZ2VzW2ldLmdldFN0YXJ0KCkgLSBvZmZzZXQpIC8gc3RyaWRlOworICAgICAgICBpbnQgbkVsZW1lbnRzID0gcmFuZ2VzW2ldLmdldFNpemUoKS9hdHRyaWJTaXplOworICAgICAgICBmb3IoaW50IGo9MDtqPG5FbGVtZW50cztqKyspIHsKKyAgICAgICAgICAgIGluZGljZXNbbisrXSA9IHN0YXJ0SW5kZXgrajsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKK30KKwordm9pZCBHTEVTY29udGV4dDo6Y29udmVydERpcmVjdChHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApIHsKKworICAgIEdMZW51bSB0eXBlICAgID0gcC0+Z2V0VHlwZSgpOworICAgIGludCBhdHRyaWJTaXplID0gcC0+Z2V0U2l6ZSgpOworICAgIHVuc2lnbmVkIGludCBzaXplID0gYXR0cmliU2l6ZSpjb3VudCArIGZpcnN0OworICAgIHVuc2lnbmVkIGludCBieXRlcyA9IHR5cGUgPT0gR0xfRklYRUQgPyBzaXplb2YoR0xmaXhlZCk6c2l6ZW9mKEdMYnl0ZSk7CisgICAgY0FycnMuYWxsb2NBcnIoc2l6ZSx0eXBlKTsKKyAgICBpbnQgc3RyaWRlID0gcC0+Z2V0U3RyaWRlKCk/cC0+Z2V0U3RyaWRlKCk6Ynl0ZXMqYXR0cmliU2l6ZTsKKyAgICBjb25zdCBjaGFyKiBkYXRhID0gKGNvbnN0IGNoYXIqKXAtPmdldEFycmF5RGF0YSgpICsgKGZpcnN0KnN0cmlkZSk7CisKKyAgICBpZih0eXBlID09IEdMX0ZJWEVEKSB7CisgICAgICAgIGNvbnZlcnRGaXhlZERpcmVjdExvb3AoZGF0YSxzdHJpZGUsY0FycnMuZ2V0Q3VycmVudERhdGEoKSxzaXplKnNpemVvZihHTGZsb2F0KSxhdHRyaWJTaXplKnNpemVvZihHTGZsb2F0KSxhdHRyaWJTaXplKTsKKyAgICB9IGVsc2UgaWYodHlwZSA9PSBHTF9CWVRFKSB7CisgICAgICAgIGNvbnZlcnRCeXRlRGlyZWN0TG9vcChkYXRhLHN0cmlkZSxjQXJycy5nZXRDdXJyZW50RGF0YSgpLHNpemUqc2l6ZW9mKEdMc2hvcnQpLGF0dHJpYlNpemUqc2l6ZW9mKEdMc2hvcnQpLGF0dHJpYlNpemUpOworICAgIH0KK30KKwordm9pZCBHTEVTY29udGV4dDo6Y29udmVydERpcmVjdFZCTyhHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApIHsKKworICAgIFJhbmdlTGlzdCByYW5nZXM7CisgICAgUmFuZ2VMaXN0IGNvbnZlcnNpb25zOworICAgIEdMdWludCogaW5kaWNlcyA9IE5VTEw7CisgICAgaW50IGF0dHJpYlNpemUgPSBwLT5nZXRTaXplKCk7CisgICAgaW50IHN0cmlkZSA9IHAtPmdldFN0cmlkZSgpP3AtPmdldFN0cmlkZSgpOnNpemVvZihHTGZpeGVkKSphdHRyaWJTaXplOworICAgIGNoYXIqIGRhdGEgPSAoY2hhciopcC0+Z2V0QnVmZmVyRGF0YSgpICsgKGZpcnN0KnN0cmlkZSk7CisKKyAgICBpZihwLT5idWZmZXJOZWVkQ29udmVyc2lvbigpKSB7CisgICAgICAgIGRpcmVjdFRvQnl0ZXNSYW5nZXMoZmlyc3QsY291bnQscCxyYW5nZXMpOyAvL2NvbnZlcnRpbmcgaW5kaWNlcyByYW5nZSB0byBidWZmZXIgYnl0ZXMgcmFuZ2VzIGJ5IG9mZnNldAorICAgICAgICBwLT5nZXRCdWZmZXJDb252ZXJzaW9ucyhyYW5nZXMsY29udmVyc2lvbnMpOyAvLyBnZXR0aW5nIGZyb20gdGhlIGJ1ZmZlciB0aGUgcmVsZXZhbnQgcmFuZ2VzIHRoYXQgc3RpbGwgbmVlZHMgdG8gYmUgY29udmVydGVkCisKKyAgICAgICAgaWYoY29udmVyc2lvbnMuc2l6ZSgpKSB7IC8vIHRoZXJlIGFyZSBzb21lIGVsZW1lbnRzIHRvIGNvbnZlcnQKKyAgICAgICAgICAgaW5kaWNlcyA9IG5ldyBHTHVpbnRbY291bnRdOworICAgICAgICAgICBpbnQgbkluZGljZXMgPSBieXRlc1Jhbmdlc1RvSW5kaWNlcyhjb252ZXJzaW9ucyxwLGluZGljZXMpOyAvL2NvbnZlcnRpbmcgYnl0ZXMgcmFuZ2VzIGJ5IG9mZnNldCB0byBpbmRpY2VzIGluIHRoaXMgYXJyYXkKKyAgICAgICAgICAgY29udmVydEZpeGVkSW5kaXJlY3RMb29wKGRhdGEsc3RyaWRlLGRhdGEsbkluZGljZXMsR0xfVU5TSUdORURfSU5ULGluZGljZXMsc3RyaWRlLGF0dHJpYlNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGlmKGluZGljZXMpIGRlbGV0ZVtdIGluZGljZXM7CisgICAgY0FycnMuc2V0QXJyKGRhdGEscC0+Z2V0U3RyaWRlKCksR0xfRkxPQVQpOworfQorCit1bnNpZ25lZCBpbnQgR0xFU2NvbnRleHQ6OmZpbmRNYXhJbmRleChHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcykgeworICAgIC8vZmluZGluZyBtYXggaW5kZXgKKyAgICB1bnNpZ25lZCBpbnQgbWF4ID0gMDsKKyAgICBpZih0eXBlID09IEdMX1VOU0lHTkVEX0JZVEUpIHsKKyAgICAgICAgR0x1Ynl0ZSogIGJfaW5kaWNlcyAgPShHTHVieXRlICopaW5kaWNlczsKKyAgICAgICAgZm9yKGludCBpPTA7aTxjb3VudDtpKyspIHsKKyAgICAgICAgICAgIGlmKGJfaW5kaWNlc1tpXSA+IG1heCkgbWF4ID0gYl9pbmRpY2VzW2ldOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKSB7CisgICAgICAgIEdMdXNob3J0KiB1c19pbmRpY2VzID0oR0x1c2hvcnQgKilpbmRpY2VzOworICAgICAgICBmb3IoaW50IGk9MDtpPGNvdW50O2krKykgeworICAgICAgICAgICAgaWYodXNfaW5kaWNlc1tpXSA+IG1heCkgbWF4ID0gdXNfaW5kaWNlc1tpXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHR5cGUgPT0gR0xfVU5TSUdORURfSU5UCisgICAgICAgIEdMdWludCogdWlfaW5kaWNlcyA9KEdMdWludCAqKWluZGljZXM7CisgICAgICAgIGZvcihpbnQgaT0wO2k8Y291bnQ7aSsrKSB7CisgICAgICAgICAgICBpZih1aV9pbmRpY2VzW2ldID4gbWF4KSBtYXggPSB1aV9pbmRpY2VzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXg7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OmNvbnZlcnRJbmRpcmVjdChHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xzaXplaSBjb3VudCxHTGVudW0gaW5kaWNlc190eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApIHsKKyAgICBHTGVudW0gdHlwZSAgICA9IHAtPmdldFR5cGUoKTsKKyAgICBpbnQgbWF4RWxlbWVudHMgPSBmaW5kTWF4SW5kZXgoY291bnQsaW5kaWNlc190eXBlLGluZGljZXMpICsgMTsKKworICAgIGludCBhdHRyaWJTaXplID0gcC0+Z2V0U2l6ZSgpOworICAgIGludCBzaXplID0gYXR0cmliU2l6ZSAqIG1heEVsZW1lbnRzOworICAgIHVuc2lnbmVkIGludCBieXRlcyA9IHR5cGUgPT0gR0xfRklYRUQgPyBzaXplb2YoR0xmaXhlZCk6c2l6ZW9mKEdMYnl0ZSk7CisgICAgY0FycnMuYWxsb2NBcnIoc2l6ZSx0eXBlKTsKKyAgICBpbnQgc3RyaWRlID0gcC0+Z2V0U3RyaWRlKCk/cC0+Z2V0U3RyaWRlKCk6Ynl0ZXMqYXR0cmliU2l6ZTsKKworICAgIGNvbnN0IGNoYXIqIGRhdGEgPSAoY29uc3QgY2hhciopcC0+Z2V0QXJyYXlEYXRhKCk7CisgICAgaWYodHlwZSA9PSBHTF9GSVhFRCkgeworICAgICAgICBjb252ZXJ0Rml4ZWRJbmRpcmVjdExvb3AoZGF0YSxzdHJpZGUsY0FycnMuZ2V0Q3VycmVudERhdGEoKSxjb3VudCxpbmRpY2VzX3R5cGUsaW5kaWNlcyxhdHRyaWJTaXplKnNpemVvZihHTGZsb2F0KSxhdHRyaWJTaXplKTsKKyAgICB9IGVsc2UgaWYodHlwZSA9PSBHTF9CWVRFKXsKKyAgICAgICAgY29udmVydEJ5dGVJbmRpcmVjdExvb3AoZGF0YSxzdHJpZGUsY0FycnMuZ2V0Q3VycmVudERhdGEoKSxjb3VudCxpbmRpY2VzX3R5cGUsaW5kaWNlcyxhdHRyaWJTaXplKnNpemVvZihHTHNob3J0KSxhdHRyaWJTaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OmNvbnZlcnRJbmRpcmVjdFZCTyhHTEVTQ29udmVyc2lvbkFycmF5cyYgY0FycnMsR0xzaXplaSBjb3VudCxHTGVudW0gaW5kaWNlc190eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApIHsKKyAgICBSYW5nZUxpc3QgcmFuZ2VzOworICAgIFJhbmdlTGlzdCBjb252ZXJzaW9uczsKKyAgICBHTHVpbnQqIGNvbnZlcnNpb25JbmRpY2VzID0gTlVMTDsKKyAgICBpbnQgYXR0cmliU2l6ZSA9IHAtPmdldFNpemUoKTsKKyAgICBpbnQgc3RyaWRlID0gcC0+Z2V0U3RyaWRlKCk/cC0+Z2V0U3RyaWRlKCk6c2l6ZW9mKEdMZml4ZWQpKmF0dHJpYlNpemU7CisgICAgY2hhciogZGF0YSA9IHN0YXRpY19jYXN0PGNoYXIqPihwLT5nZXRCdWZmZXJEYXRhKCkpOworICAgIGlmKHAtPmJ1ZmZlck5lZWRDb252ZXJzaW9uKCkpIHsKKyAgICAgICAgaW5kaXJlY3RUb0J5dGVzUmFuZ2VzKGluZGljZXMsaW5kaWNlc190eXBlLGNvdW50LHAscmFuZ2VzKTsgLy9jb252ZXJ0aW5nIGluZGljZXMgcmFuZ2UgdG8gYnVmZmVyIGJ5dGVzIHJhbmdlcyBieSBvZmZzZXQKKyAgICAgICAgcC0+Z2V0QnVmZmVyQ29udmVyc2lvbnMocmFuZ2VzLGNvbnZlcnNpb25zKTsgLy8gZ2V0dGluZyBmcm9tIHRoZSBidWZmZXIgdGhlIHJlbGV2YW50IHJhbmdlcyB0aGF0IHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZAorICAgICAgICBpZihjb252ZXJzaW9ucy5zaXplKCkpIHsgLy8gdGhlcmUgYXJlIHNvbWUgZWxlbWVudHMgdG8gY29udmVydAorICAgICAgICAgICAgY29udmVyc2lvbkluZGljZXMgPSBuZXcgR0x1aW50W2NvdW50XTsKKyAgICAgICAgICAgIGludCBuSW5kaWNlcyA9IGJ5dGVzUmFuZ2VzVG9JbmRpY2VzKGNvbnZlcnNpb25zLHAsY29udmVyc2lvbkluZGljZXMpOyAvL2NvbnZlcnRpbmcgYnl0ZXMgcmFuZ2VzIGJ5IG9mZnNldCB0byBpbmRpY2VzIGluIHRoaXMgYXJyYXkKKyAgICAgICAgICAgIGNvbnZlcnRGaXhlZEluZGlyZWN0TG9vcChkYXRhLHN0cmlkZSxkYXRhLG5JbmRpY2VzLEdMX1VOU0lHTkVEX0lOVCxjb252ZXJzaW9uSW5kaWNlcyxzdHJpZGUsYXR0cmliU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoY29udmVyc2lvbkluZGljZXMpIGRlbGV0ZVtdIGNvbnZlcnNpb25JbmRpY2VzOworICAgIGNBcnJzLnNldEFycihkYXRhLHAtPmdldFN0cmlkZSgpLEdMX0ZMT0FUKTsKK30KKworCisKK3ZvaWQgR0xFU2NvbnRleHQ6OmJpbmRCdWZmZXIoR0xlbnVtIHRhcmdldCxHTHVpbnQgYnVmZmVyKSB7CisgICAgaWYodGFyZ2V0ID09IEdMX0FSUkFZX0JVRkZFUikgeworICAgICAgICBtX2FycmF5QnVmZmVyID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgbV9lbGVtZW50QnVmZmVyID0gYnVmZmVyOworICAgIH0KK30KKwordm9pZCBHTEVTY29udGV4dDo6dW5iaW5kQnVmZmVyKEdMdWludCBidWZmZXIpIHsKKyAgICBpZihtX2FycmF5QnVmZmVyID09IGJ1ZmZlcikKKyAgICB7CisgICAgICAgIG1fYXJyYXlCdWZmZXIgPSAwOworICAgIH0KKyAgICBpZihtX2VsZW1lbnRCdWZmZXIgPT0gYnVmZmVyKQorICAgIHsKKyAgICAgICAgbV9lbGVtZW50QnVmZmVyID0gMDsKKyAgICB9Cit9CisKKy8vY2hlY2tzIGlmIGFueSBidWZmZXIgaXMgYmluZGVkIHRvIHRhcmdldAorYm9vbCBHTEVTY29udGV4dDo6aXNCaW5kZWRCdWZmZXIoR0xlbnVtIHRhcmdldCkgeworICAgIGlmKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpIHsKKyAgICAgICAgcmV0dXJuIG1fYXJyYXlCdWZmZXIgIT0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbV9lbGVtZW50QnVmZmVyICE9IDA7CisgICAgfQorfQorCitHTHVpbnQgR0xFU2NvbnRleHQ6OmdldEJ1ZmZlcihHTGVudW0gdGFyZ2V0KSB7CisgICAgcmV0dXJuIHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIgPyBtX2FycmF5QnVmZmVyOm1fZWxlbWVudEJ1ZmZlcjsKK30KKworR0x2b2lkKiBHTEVTY29udGV4dDo6Z2V0QmluZGVkQnVmZmVyKEdMZW51bSB0YXJnZXQpIHsKKyAgICBHTHVpbnQgYnVmZmVyTmFtZSA9IGdldEJ1ZmZlcih0YXJnZXQpOworICAgIGlmKCFidWZmZXJOYW1lKSByZXR1cm4gTlVMTDsKKworICAgIEdMRVNidWZmZXIqIHZibyA9IHN0YXRpY19jYXN0PEdMRVNidWZmZXIqPigKKyAgICAgICAgICAgIG1fc2hhcmVHcm91cAorICAgICAgICAgICAgICAgICAgICAtPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlck5hbWUpKTsKKyAgICByZXR1cm4gdmJvLT5nZXREYXRhKCk7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OmdldEJ1ZmZlclNpemUoR0xlbnVtIHRhcmdldCxHTGludCogcGFyYW0pIHsKKyAgICBHTHVpbnQgYnVmZmVyTmFtZSA9IGdldEJ1ZmZlcih0YXJnZXQpOworICAgIEdMRVNidWZmZXIqIHZibyA9IHN0YXRpY19jYXN0PEdMRVNidWZmZXIqPigKKyAgICAgICAgICAgIG1fc2hhcmVHcm91cAorICAgICAgICAgICAgICAgICAgICAtPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlck5hbWUpKTsKKyAgICAqcGFyYW0gPSB2Ym8tPmdldFNpemUoKTsKK30KKwordm9pZCBHTEVTY29udGV4dDo6Z2V0QnVmZmVyVXNhZ2UoR0xlbnVtIHRhcmdldCxHTGludCogcGFyYW0pIHsKKyAgICBHTHVpbnQgYnVmZmVyTmFtZSA9IGdldEJ1ZmZlcih0YXJnZXQpOworICAgIEdMRVNidWZmZXIqIHZibyA9IHN0YXRpY19jYXN0PEdMRVNidWZmZXIqPigKKyAgICAgICAgICAgIG1fc2hhcmVHcm91cAorICAgICAgICAgICAgICAgICAgICAtPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlck5hbWUpKTsKKyAgICAqcGFyYW0gPSB2Ym8tPmdldFVzYWdlKCk7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OnNldEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCxHTHNpemVpcHRyIHNpemUsY29uc3QgR0x2b2lkKiBkYXRhLEdMZW51bSB1c2FnZSkgeworICAgIEdMdWludCBidWZmZXJOYW1lID0gZ2V0QnVmZmVyKHRhcmdldCk7CisgICAgaWYoIWJ1ZmZlck5hbWUpIHJldHVybiBmYWxzZTsKKyAgICBHTEVTYnVmZmVyKiB2Ym8gPSBzdGF0aWNfY2FzdDxHTEVTYnVmZmVyKj4oCisgICAgICAgICAgICBtX3NoYXJlR3JvdXAKKyAgICAgICAgICAgICAgICAgICAgLT5nZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSLCBidWZmZXJOYW1lKSk7CisgICAgcmV0dXJuIHZiby0+c2V0QnVmZmVyKHNpemUsdXNhZ2UsZGF0YSk7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OnNldEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCxHTGludHB0ciBvZmZzZXQsR0xzaXplaXB0ciBzaXplLGNvbnN0IEdMdm9pZCogZGF0YSkgeworCisgICAgR0x1aW50IGJ1ZmZlck5hbWUgPSBnZXRCdWZmZXIodGFyZ2V0KTsKKyAgICBpZighYnVmZmVyTmFtZSkgcmV0dXJuIGZhbHNlOworICAgIEdMRVNidWZmZXIqIHZibyA9IHN0YXRpY19jYXN0PEdMRVNidWZmZXIqPigKKyAgICAgICAgICAgIG1fc2hhcmVHcm91cAorICAgICAgICAgICAgICAgICAgICAtPmdldE9iamVjdERhdGEoTmFtZWRPYmplY3RUeXBlOjpWRVJURVhCVUZGRVIsIGJ1ZmZlck5hbWUpKTsKKyAgICByZXR1cm4gdmJvLT5zZXRTdWJCdWZmZXIob2Zmc2V0LHNpemUsZGF0YSk7Cit9CisKK2NvbnN0IGNoYXIgKiBHTEVTY29udGV4dDo6Z2V0RXh0ZW5zaW9uU3RyaW5nKCkgeworICAgIGNvbnN0IGNoYXIgKiByZXQ7CisgICAgc19sb2NrLmxvY2soKTsKKyAgICBpZiAoc19nbEV4dGVuc2lvbnMpCisgICAgICAgIHJldCA9IHNfZ2xFeHRlbnNpb25zLT5jX3N0cigpOworICAgIGVsc2UKKyAgICAgICAgcmV0PSIiOworICAgIHNfbG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICogR0xFU2NvbnRleHQ6OmdldFZlbmRvclN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc19nbFZlbmRvci5jX3N0cigpOworfQorCitjb25zdCBjaGFyICogR0xFU2NvbnRleHQ6OmdldFJlbmRlcmVyU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBzX2dsUmVuZGVyZXIuY19zdHIoKTsKK30KKworY29uc3QgY2hhciAqIEdMRVNjb250ZXh0OjpnZXRWZXJzaW9uU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBzX2dsVmVyc2lvbi5jX3N0cigpOworfQorCit2b2lkIEdMRVNjb250ZXh0OjpnZXRHbG9iYWxMb2NrKCkgeworICAgIHNfbG9jay5sb2NrKCk7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OnJlbGVhc2VHbG9iYWxMb2NrKCkgeworICAgIHNfbG9jay51bmxvY2soKTsKK30KKworCit2b2lkIEdMRVNjb250ZXh0Ojppbml0Q2Fwc0xvY2tlZChjb25zdCBHTHVieXRlICogZXh0ZW5zaW9uU3RyaW5nKQoreworICAgIGNvbnN0IGNoYXIqIGNzdHJpbmcgPSAoY29uc3QgY2hhciopZXh0ZW5zaW9uU3RyaW5nOworCisgICAgc19nbERpc3BhdGNoLmdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZFUlRFWF9BVFRSSUJTLCZzX2dsU3VwcG9ydC5tYXhWZXJ0ZXhBdHRyaWJzKTsKKyAgICBzX2dsRGlzcGF0Y2guZ2xHZXRJbnRlZ2VydihHTF9NQVhfQ0xJUF9QTEFORVMsJnNfZ2xTdXBwb3J0Lm1heENsaXBQbGFuZSk7CisgICAgc19nbERpc3BhdGNoLmdsR2V0SW50ZWdlcnYoR0xfTUFYX0xJR0hUUywmc19nbFN1cHBvcnQubWF4TGlnaHRzKTsKKyAgICBzX2dsRGlzcGF0Y2guZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9TSVpFLCZzX2dsU3VwcG9ydC5tYXhUZXhTaXplKTsKKyAgICBzX2dsRGlzcGF0Y2guZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9VTklUUywmc19nbFN1cHBvcnQubWF4VGV4VW5pdHMpOworICAgIHNfZ2xEaXNwYXRjaC5nbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTLCZzX2dsU3VwcG9ydC5tYXhUZXhJbWFnZVVuaXRzKTsKKyAgICBzX2dsRGlzcGF0Y2guZ2xHZXRJbnRlZ2VydihHTF9NQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJnNfZ2xTdXBwb3J0Lm1heENvbWJpbmVkVGV4SW1hZ2VVbml0cyk7CisgICAgY29uc3QgR0x1Ynl0ZSogZ2xzbFZlcnNpb24gPSBzX2dsRGlzcGF0Y2guZ2xHZXRTdHJpbmcoR0xfU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OKTsKKyAgICBzX2dsU3VwcG9ydC5nbHNsVmVyc2lvbiA9IFZlcnNpb24oKGNvbnN0ICBjaGFyKikoZ2xzbFZlcnNpb24pKTsKKyAgICBjb25zdCBHTHVieXRlKiBnbFZlcnNpb24gPSBzX2dsRGlzcGF0Y2guZ2xHZXRTdHJpbmcoR0xfVkVSU0lPTik7CisKKyAgICBpZiAoc3Ryc3RyKGNzdHJpbmcsIkdMX0VYVF9iZ3JhICIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9FWFRfVEVYVFVSRV9GT1JNQVRfQkdSQTg4ODggPSB0cnVlOworCisgICAgaWYgKHN0cnN0cihjc3RyaW5nLCJHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0ICIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9FWFRfRlJBTUVCVUZGRVJfT0JKRUNUID0gdHJ1ZTsKKworICAgIGlmIChzdHJzdHIoY3N0cmluZywiR0xfQVJCX3ZlcnRleF9ibGVuZCAiKSE9TlVMTCkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfQVJCX1ZFUlRFWF9CTEVORCA9IHRydWU7CisKKyAgICBpZiAoc3Ryc3RyKGNzdHJpbmcsIkdMX0FSQl9tYXRyaXhfcGFsZXR0ZSAiKSE9TlVMTCkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfQVJCX01BVFJJWF9QQUxFVFRFID0gdHJ1ZTsKKworICAgIGlmIChzdHJzdHIoY3N0cmluZywiR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsICIpIT1OVUxMICkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfRVhUX1BBQ0tFRF9ERVBUSF9TVEVOQ0lMID0gdHJ1ZTsKKworICAgIGlmIChzdHJzdHIoY3N0cmluZywiR0xfT0VTX3JlYWRfZm9ybWF0ICIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9PRVNfUkVBRF9GT1JNQVQgPSB0cnVlOworCisgICAgaWYgKHN0cnN0cihjc3RyaW5nLCJHTF9BUkJfaGFsZl9mbG9hdF9waXhlbCAiKSE9TlVMTCkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfQVJCX0hBTEZfRkxPQVRfUElYRUwgPSB0cnVlOworCisgICAgaWYgKHN0cnN0cihjc3RyaW5nLCJHTF9OVl9oYWxmX2Zsb2F0ICIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9OVl9IQUxGX0ZMT0FUID0gdHJ1ZTsKKworICAgIGlmIChzdHJzdHIoY3N0cmluZywiR0xfQVJCX2hhbGZfZmxvYXRfdmVydGV4ICIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9BUkJfSEFMRl9GTE9BVF9WRVJURVggPSB0cnVlOworCisgICAgaWYgKHN0cnN0cihjc3RyaW5nLCJHTF9TR0lTX2dlbmVyYXRlX21pcG1hcCAiKSE9TlVMTCkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfU0dJU19HRU5FUkFURV9NSVBNQVAgPSB0cnVlOworCisgICAgaWYgKHN0cnN0cihjc3RyaW5nLCJHTF9BUkJfRVMyX2NvbXBhdGliaWxpdHkgIikhPU5VTEwpCisgICAgICAgIHNfZ2xTdXBwb3J0LkdMX0FSQl9FUzJfQ09NUEFUSUJJTElUWSA9IHRydWU7CisKKyAgICBpZiAoc3Ryc3RyKGNzdHJpbmcsIkdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyAiKSE9TlVMTCkKKyAgICAgICAgc19nbFN1cHBvcnQuR0xfT0VTX1NUQU5EQVJEX0RFUklWQVRJVkVTID0gdHJ1ZTsKKworICAgIGlmIChzdHJzdHIoY3N0cmluZywiR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byIpIT1OVUxMKQorICAgICAgICBzX2dsU3VwcG9ydC5HTF9PRVNfVEVYVFVSRV9OUE9UID0gdHJ1ZTsKKworICAgIGlmICghKFZlcnNpb24oKGNvbnN0IGNoYXIqKWdsVmVyc2lvbikgPCBWZXJzaW9uKCIzLjAiKSkgfHwgc3Ryc3RyKGNzdHJpbmcsIkdMX09FU19yZ2I4X3JnYmE4IikhPU5VTEwpCisgICAgICAgIHNfZ2xTdXBwb3J0LkdMX09FU19SR0I4X1JHQkE4ID0gdHJ1ZTsKKworfQorCit2b2lkIEdMRVNjb250ZXh0OjpidWlsZFN0cmluZ3MoY29uc3QgY2hhciogYmFzZVZlbmRvciwKKyAgICAgICAgY29uc3QgY2hhciogYmFzZVJlbmRlcmVyLCBjb25zdCBjaGFyKiBiYXNlVmVyc2lvbiwgY29uc3QgY2hhciogdmVyc2lvbikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWRU5ET1JbXSAgID0geyJHb29nbGUgKCJ9OworICAgIHN0YXRpYyBjb25zdCBjaGFyIFJFTkRFUkVSW10gPSB7IkFuZHJvaWQgRW11bGF0b3IgT3BlbkdMIEVTIFRyYW5zbGF0b3IgKCJ9OworICAgIGNvbnN0IHNpemVfdCBWRU5ET1JfTEVOICAgPSBzaXplb2YoVkVORE9SKSAtIDE7CisgICAgY29uc3Qgc2l6ZV90IFJFTkRFUkVSX0xFTiA9IHNpemVvZihSRU5ERVJFUikgLSAxOworCisgICAgLy8gU2FuaXRpemUgdGhlIHN0cmluZ3MgYXMgc29tZSBPcGVuR0wgaW1wbGVtZW50YXRpb25zIHJldHVybiBOVUxMCisgICAgLy8gd2hlbiBhc2tlZCB0aGUgYmFzaWMgcXVlc3Rpb25zICh0aGlzIGhhcHBlbmVkIGF0IGxlYXN0IG9uY2Ugb24gYSBjbGllbnQKKyAgICAvLyBtYWNoaW5lKQorICAgIGlmICghYmFzZVZlbmRvcikgeworICAgICAgICBiYXNlVmVuZG9yID0gIk4vQSI7CisgICAgfQorICAgIGlmICghYmFzZVJlbmRlcmVyKSB7CisgICAgICAgIGJhc2VSZW5kZXJlciA9ICJOL0EiOworICAgIH0KKyAgICBpZiAoIWJhc2VWZXJzaW9uKSB7CisgICAgICAgIGJhc2VWZXJzaW9uID0gIk4vQSI7CisgICAgfQorICAgIGlmICghdmVyc2lvbikgeworICAgICAgICB2ZXJzaW9uID0gIk4vQSI7CisgICAgfQorCisgICAgc2l6ZV90IGJhc2VWZW5kb3JMZW4gPSBzdHJsZW4oYmFzZVZlbmRvcik7CisgICAgc19nbFZlbmRvci5jbGVhcigpOworICAgIHNfZ2xWZW5kb3IucmVzZXJ2ZShiYXNlVmVuZG9yTGVuICsgVkVORE9SX0xFTiArIDEpOworICAgIHNfZ2xWZW5kb3IuYXBwZW5kKFZFTkRPUiwgVkVORE9SX0xFTik7CisgICAgc19nbFZlbmRvci5hcHBlbmQoYmFzZVZlbmRvciwgYmFzZVZlbmRvckxlbik7CisgICAgc19nbFZlbmRvci5hcHBlbmQoIikiLCAxKTsKKworICAgIHNpemVfdCBiYXNlUmVuZGVyZXJMZW4gPSBzdHJsZW4oYmFzZVJlbmRlcmVyKTsKKyAgICBzX2dsUmVuZGVyZXIuY2xlYXIoKTsKKyAgICBzX2dsUmVuZGVyZXIucmVzZXJ2ZShiYXNlUmVuZGVyZXJMZW4gKyBSRU5ERVJFUl9MRU4gKyAxKTsKKyAgICBzX2dsUmVuZGVyZXIuYXBwZW5kKFJFTkRFUkVSLCBSRU5ERVJFUl9MRU4pOworICAgIHNfZ2xSZW5kZXJlci5hcHBlbmQoYmFzZVJlbmRlcmVyLCBiYXNlUmVuZGVyZXJMZW4pOworICAgIHNfZ2xSZW5kZXJlci5hcHBlbmQoIikiLCAxKTsKKworICAgIHNpemVfdCBiYXNlVmVyc2lvbkxlbiA9IHN0cmxlbihiYXNlVmVyc2lvbik7CisgICAgc2l6ZV90IHZlcnNpb25MZW4gPSBzdHJsZW4odmVyc2lvbik7CisgICAgc19nbFZlcnNpb24uY2xlYXIoKTsKKyAgICBzX2dsVmVyc2lvbi5yZXNlcnZlKGJhc2VWZXJzaW9uTGVuICsgdmVyc2lvbkxlbiArIDMpOworICAgIHNfZ2xWZXJzaW9uLmFwcGVuZCh2ZXJzaW9uLCB2ZXJzaW9uTGVuKTsKKyAgICBzX2dsVmVyc2lvbi5hcHBlbmQoIiAoIiwgMik7CisgICAgc19nbFZlcnNpb24uYXBwZW5kKGJhc2VWZXJzaW9uLCBiYXNlVmVyc2lvbkxlbik7CisgICAgc19nbFZlcnNpb24uYXBwZW5kKCIpIiwgMSk7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OmlzVGV4dHVyZVVuaXRFbmFibGVkKEdMZW51bSB1bml0KSB7CisgICAgZm9yIChpbnQgaT0wO2k8TlVNX1RFWFRVUkVfVEFSR0VUUzsrK2kpIHsKKyAgICAgICAgaWYgKG1fdGV4U3RhdGVbdW5pdC1HTF9URVhUVVJFMF1baV0uZW5hYmxlZCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OmdsR2V0Qm9vbGVhbnYoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcykKK3sKKyAgICBHTGludCBpUGFyYW07CisKKyAgICBpZihnbEdldEludGVnZXJ2KHBuYW1lLCAmaVBhcmFtKSkKKyAgICB7CisgICAgICAgICpwYXJhbXMgPSAoaVBhcmFtICE9IDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OmdsR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgR0xpbnQgbnVtUGFyYW1zID0gMTsKKworICAgIEdMaW50KiBpUGFyYW1zID0gbmV3IEdMaW50W251bVBhcmFtc107CisgICAgaWYgKG51bVBhcmFtcz4wICYmIGdsR2V0SW50ZWdlcnYocG5hbWUsaVBhcmFtcykpIHsKKyAgICAgICAgd2hpbGUobnVtUGFyYW1zID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtc1tudW1QYXJhbXNdID0gSTJYKGlQYXJhbXNbbnVtUGFyYW1zXSk7CisgICAgICAgICAgICBudW1QYXJhbXMtLTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICBkZWxldGUgW10gaVBhcmFtczsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgR0xFU2NvbnRleHQ6OmdsR2V0RmxvYXR2KEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgR0xpbnQgbnVtUGFyYW1zID0gMTsKKworICAgIEdMaW50KiBpUGFyYW1zID0gbmV3IEdMaW50W251bVBhcmFtc107CisgICAgaWYgKG51bVBhcmFtcz4wICYmIGdsR2V0SW50ZWdlcnYocG5hbWUsaVBhcmFtcykpIHsKKyAgICAgICAgd2hpbGUobnVtUGFyYW1zID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtc1tudW1QYXJhbXNdID0gKEdMZmxvYXQpaVBhcmFtc1tudW1QYXJhbXNdOworICAgICAgICAgICAgbnVtUGFyYW1zLS07CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgZGVsZXRlIFtdIGlQYXJhbXM7CisKKyAgICByZXR1cm4gcmVzdWx0OworfSAgICAgICAgCisKK2Jvb2wgR0xFU2NvbnRleHQ6OmdsR2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQoreworICAgIHN3aXRjaChwbmFtZSkKKyAgICB7CisgICAgICAgIGNhc2UgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICAgICAgICAqcGFyYW1zID0gbV9hcnJheUJ1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgICAgICpwYXJhbXMgPSBtX2VsZW1lbnRCdWZmZXI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBtX3RleFN0YXRlW21fYWN0aXZlVGV4dHVyZV1bVEVYVFVSRV9DVUJFX01BUF0udGV4dHVyZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9CSU5ESU5HXzJEOgorICAgICAgICAgICAgKnBhcmFtcyA9IG1fdGV4U3RhdGVbbV9hY3RpdmVUZXh0dXJlXVtURVhUVVJFXzJEXS50ZXh0dXJlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9BQ1RJVkVfVEVYVFVSRToKKyAgICAgICAgICAgICpwYXJhbXMgPSBtX2FjdGl2ZVRleHR1cmUrR0xfVEVYVFVSRTA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVM6CisgICAgICAgICAgICAqcGFyYW1zID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTOgorICAgICAgICAgICAgKnBhcmFtcyA9IEdMX1JHQkE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEdMX01BWF9URVhUVVJFX1NJWkU6CisgICAgICAgICAgICAqcGFyYW1zID0gZ2V0TWF4VGV4U2l6ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RleHR1cmVUYXJnZXQgR0xFU2NvbnRleHQ6OkdMVGV4dHVyZVRhcmdldFRvTG9jYWwoR0xlbnVtIHRhcmdldCkgeworICAgIFRleHR1cmVUYXJnZXQgdmFsdWU9VEVYVFVSRV8yRDsKKyAgICBzd2l0Y2ggKHRhcmdldCkgeworICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKKyAgICAgICAgdmFsdWUgPSBURVhUVVJFX0NVQkVfTUFQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICAgIHZhbHVlID0gVEVYVFVSRV8yRDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKwordW5zaWduZWQgaW50IEdMRVNjb250ZXh0OjpnZXRCaW5kZWRUZXh0dXJlKEdMZW51bSB0YXJnZXQpIHsKKyAgICBUZXh0dXJlVGFyZ2V0IHBvcyA9IEdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGFyZ2V0KTsKKyAgICByZXR1cm4gbV90ZXhTdGF0ZVttX2FjdGl2ZVRleHR1cmVdW3Bvc10udGV4dHVyZTsKK30KKyAgCit1bnNpZ25lZCBpbnQgR0xFU2NvbnRleHQ6OmdldEJpbmRlZFRleHR1cmUoR0xlbnVtIHVuaXQsIEdMZW51bSB0YXJnZXQpIHsKKyAgICBUZXh0dXJlVGFyZ2V0IHBvcyA9IEdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGFyZ2V0KTsKKyAgICByZXR1cm4gbV90ZXhTdGF0ZVt1bml0LUdMX1RFWFRVUkUwXVtwb3NdLnRleHR1cmU7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OnNldEJpbmRlZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgdW5zaWduZWQgaW50IHRleCkgeworICAgIFRleHR1cmVUYXJnZXQgcG9zID0gR0xUZXh0dXJlVGFyZ2V0VG9Mb2NhbCh0YXJnZXQpOworICAgIG1fdGV4U3RhdGVbbV9hY3RpdmVUZXh0dXJlXVtwb3NdLnRleHR1cmUgPSB0ZXg7Cit9CisKK3ZvaWQgR0xFU2NvbnRleHQ6OnNldFRleHR1cmVFbmFibGVkKEdMZW51bSB0YXJnZXQsIEdMZW51bSBlbmFibGUpIHsKKyAgICBUZXh0dXJlVGFyZ2V0IHBvcyA9IEdMVGV4dHVyZVRhcmdldFRvTG9jYWwodGFyZ2V0KTsKKyAgICBtX3RleFN0YXRlW21fYWN0aXZlVGV4dHVyZV1bcG9zXS5lbmFibGVkID0gZW5hYmxlOworfQorCisjZGVmaW5lIElOVEVSTkFMX05BTUUoeCkgKHggKzB4MTAwMDAwMDAwbGwpOworCitPYmplY3RMb2NhbE5hbWUgR0xFU2NvbnRleHQ6OmdldERlZmF1bHRUZXh0dXJlTmFtZShHTGVudW0gdGFyZ2V0KSB7CisgICAgT2JqZWN0TG9jYWxOYW1lIG5hbWUgPSAwOworICAgIHN3aXRjaCAoR0xUZXh0dXJlVGFyZ2V0VG9Mb2NhbCh0YXJnZXQpKSB7CisgICAgY2FzZSBURVhUVVJFXzJEOgorICAgICAgICBuYW1lID0gSU5URVJOQUxfTkFNRSgwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBURVhUVVJFX0NVQkVfTUFQOgorICAgICAgICBuYW1lID0gSU5URVJOQUxfTkFNRSgxKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgbmFtZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCBHTEVTY29udGV4dDo6ZHJhd1ZhbGlkYXRlKHZvaWQpCit7CisgICAgaWYobV9mcmFtZWJ1ZmZlciA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBhdXRvIGZiT2JqID0gbV9zaGFyZUdyb3VwLT5nZXRPYmplY3REYXRhKAorICAgICAgICAgICAgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUiwgbV9mcmFtZWJ1ZmZlcik7CisgICAgaWYgKCFmYk9iaikKKyAgICAgICAgcmV0dXJuOworCisgICAgRnJhbWVidWZmZXJEYXRhICpmYkRhdGEgPSAoRnJhbWVidWZmZXJEYXRhICopZmJPYmo7CisKKyAgICBmYkRhdGEtPnZhbGlkYXRlKHRoaXMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMRVNwb2ludGVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTcG9pbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjNmMxYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTcG9pbnRlci5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8R0xjb21tb24vR0xFU3BvaW50ZXIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworR0xlbnVtIEdMRVNwb2ludGVyOjpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBtX3R5cGU7Cit9CisKK0dMaW50IEdMRVNwb2ludGVyOjpnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtX3NpemU7Cit9CisKK0dMc2l6ZWkgR0xFU3BvaW50ZXI6OmdldFN0cmlkZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9zdHJpZGU7Cit9CisKK2NvbnN0IEdMdm9pZCogR0xFU3BvaW50ZXI6OmdldEFycmF5RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9kYXRhOworfQorCitHTHZvaWQqIEdMRVNwb2ludGVyOjpnZXRCdWZmZXJEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtX2J1ZmZlcgorICAgICAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fYnVmZmVyLT5nZXREYXRhKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCitjb25zdCBHTHZvaWQqIEdMRVNwb2ludGVyOjpnZXREYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtX2lzVkJPID8gZ2V0QnVmZmVyRGF0YSgpIDogZ2V0QXJyYXlEYXRhKCk7Cit9CisKK3ZvaWQgR0xFU3BvaW50ZXI6OnJlZGlyZWN0UG9pbnRlckRhdGEoKSB7CisgICAgbV9kYXRhID0gZ2V0QnVmZmVyRGF0YSgpOworfQorCitHTHVpbnQgR0xFU3BvaW50ZXI6OmdldEJ1ZmZlck5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fYnVmZmVyTmFtZTsKK30KKwordW5zaWduZWQgaW50IEdMRVNwb2ludGVyOjpnZXRCdWZmZXJPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fYnVmZk9mZnNldDsKK30KKworYm9vbCBHTEVTcG9pbnRlcjo6aXNFbmFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZW5hYmxlZDsKK30KKworYm9vbCBHTEVTcG9pbnRlcjo6aXNOb3JtYWxpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fbm9ybWFsaXplOworfQorCitib29sIEdMRVNwb2ludGVyOjppc1ZCTygpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9pc1ZCTzsKK30KKwordm9pZCBHTEVTcG9pbnRlcjo6ZW5hYmxlKGJvb2wgYikgeworICAgIG1fZW5hYmxlZCA9IGI7Cit9CisKK3ZvaWQgR0xFU3BvaW50ZXI6OnNldEFycmF5KEdMaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub3JtYWxpemUpIHsKKyAgICBtX3NpemUgPSBzaXplOworICAgIG1fdHlwZSA9IHR5cGU7CisgICAgbV9zdHJpZGUgPSBzdHJpZGU7CisgICAgbV9kYXRhID0gZGF0YTsKKyAgICBtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgbV9idWZmZXJOYW1lID0gMDsKKyAgICBtX25vcm1hbGl6ZSA9IG5vcm1hbGl6ZTsKKyAgICBtX2lzVkJPID0gZmFsc2U7Cit9CisKK3ZvaWQgR0xFU3BvaW50ZXI6OnNldEJ1ZmZlcihHTGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNidWZmZXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgYnVmZmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbm9ybWFsaXplKSB7CisgICAgbV9zaXplID0gc2l6ZTsKKyAgICBtX3R5cGUgPSB0eXBlOworICAgIG1fc3RyaWRlID0gc3RyaWRlOworICAgIG1fZGF0YSA9IG51bGxwdHI7CisgICAgbV9idWZmZXIgPSBidWY7CisgICAgbV9idWZmZXJOYW1lID0gYnVmZmVyTmFtZTsKKyAgICBtX2J1ZmZPZmZzZXQgPSBvZmZzZXQ7CisgICAgbV9ub3JtYWxpemUgPSBub3JtYWxpemU7CisgICAgbV9pc1ZCTyA9IHRydWU7Cit9CisKK3ZvaWQgR0xFU3BvaW50ZXI6OmdldEJ1ZmZlckNvbnZlcnNpb25zKGNvbnN0IFJhbmdlTGlzdCYgcmwsIFJhbmdlTGlzdCYgcmxPdXQpIHsKKyAgICBtX2J1ZmZlci0+Z2V0Q29udmVyc2lvbnMocmwsIHJsT3V0KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTdmFsaWRhdGUuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMRVN2YWxpZGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5MGJiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTEVTdmFsaWRhdGUuY3BwCkBAIC0wLDAgKzEsMTk0IEBACisvKgorKiBDb3B5cmlnaHQgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxHTGNvbW1vbi9HTEVTdmFsaWRhdGUuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorI2luY2x1ZGUgPE9wZW5nbENvZGVjQ29tbW9uL0Vycm9yTG9nLmg+CisKKworYm9vbCAgR0xFU3ZhbGlkYXRlOjp0ZXh0dXJlRW51bShHTGVudW0gZSx1bnNpZ25lZCBpbnQgbWF4VGV4KSB7CisgICAgcmV0dXJuIGUgPj0gR0xfVEVYVFVSRTAgJiYgZSA8IChHTF9URVhUVVJFMCArIG1heFRleCk7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpwaXhlbFR5cGUoR0xFU2NvbnRleHQgKiBjdHgsIEdMZW51bSB0eXBlKSB7CisgICAgaWYgKChjdHggJiYgY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9QQUNLRURfREVQVEhfU1RFTkNJTCkgJiYKKyAgICAgICAodHlwZSA9PSBHTF9VTlNJR05FRF9JTlRfMjRfOF9PRVMpICkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoY3R4ICYmCisgICAgICAgKGN0eC0+Z2V0Q2FwcygpLT5HTF9BUkJfSEFMRl9GTE9BVF9QSVhFTCB8fCBjdHgtPmdldENhcHMoKS0+R0xfTlZfSEFMRl9GTE9BVCkgJiYKKyAgICAgICAodHlwZSA9PSBHTF9IQUxGX0ZMT0FUX09FUyB8fCB0eXBlID09IEdMX0hBTEZfRkxPQVQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgorICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMToKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6cGl4ZWxPcChHTGVudW0gZm9ybWF0LEdMZW51bSB0eXBlKSB7CisgICAgIHN3aXRjaCh0eXBlKSB7CisgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNDoKKyAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0JBOworICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OgorICAgICAgICAgcmV0dXJuIGZvcm1hdCA9PSBHTF9SR0I7CisgICAgIH0KKyAgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpwaXhlbEZybXQoR0xFU2NvbnRleHQqIGN0eCAsR0xlbnVtIGZvcm1hdCkgeworICAgIGlmIChjdHggJiYgY3R4LT5nZXRDYXBzKCktPkdMX0VYVF9URVhUVVJFX0ZPUk1BVF9CR1JBODg4OCAmJiBmb3JtYXQgPT0gR0xfQkdSQV9FWFQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoY3R4ICYmIGN0eC0+Z2V0Q2FwcygpLT5HTF9FWFRfUEFDS0VEX0RFUFRIX1NURU5DSUwgJiYgZm9ybWF0ID09IEdMX0RFUFRIX1NURU5DSUxfT0VTKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgc3dpdGNoKGZvcm1hdCkgeworICAgIGNhc2UgR0xfQUxQSEE6CisgICAgY2FzZSBHTF9SR0I6CisgICAgY2FzZSBHTF9SR0JBOgorICAgIGNhc2UgR0xfTFVNSU5BTkNFOgorICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6YnVmZmVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKKyAgICByZXR1cm4gdGFyZ2V0ID09IEdMX0FSUkFZX0JVRkZFUiB8fCB0YXJnZXQgPT0gR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVI7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpidWZmZXJVc2FnZShHTGVudW0gdXNhZ2UpIHsKKyAgICBzd2l0Y2godXNhZ2UpIHsKKyAgICAgICAgY2FzZSBHTF9TVFJFQU1fRFJBVzoKKyAgICAgICAgY2FzZSBHTF9TVEFUSUNfRFJBVzoKKyAgICAgICAgY2FzZSBHTF9EWU5BTUlDX0RSQVc6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6YnVmZmVyUGFyYW0oR0xlbnVtIHBhcmFtKSB7CisgcmV0dXJuICAocGFyYW0gPT0gR0xfQlVGRkVSX1NJWkUpIHx8IChwYXJhbSA9PSBHTF9CVUZGRVJfVVNBR0UpOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6ZHJhd01vZGUoR0xlbnVtIG1vZGUpIHsKKyAgICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgR0xfUE9JTlRTOgorICAgIGNhc2UgR0xfTElORV9TVFJJUDoKKyAgICBjYXNlIEdMX0xJTkVfTE9PUDoKKyAgICBjYXNlIEdMX0xJTkVTOgorICAgIGNhc2UgR0xfVFJJQU5HTEVfU1RSSVA6CisgICAgY2FzZSBHTF9UUklBTkdMRV9GQU46CisgICAgY2FzZSBHTF9UUklBTkdMRVM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpkcmF3VHlwZShHTGVudW0gbW9kZSkgeworICAgIHJldHVybiAgbW9kZSA9PSBHTF9VTlNJR05FRF9CWVRFIHx8CisgICAgICAgICAgICBtb2RlID09IEdMX1VOU0lHTkVEX1NIT1JUIHx8CisgICAgICAgICAgICBtb2RlID09IEdMX1VOU0lHTkVEX0lOVDsKK30KKworYm9vbCBHTEVTdmFsaWRhdGU6OnRleHR1cmVUYXJnZXQoR0xlbnVtIHRhcmdldCkgeworICAgIHJldHVybiB0YXJnZXQ9PUdMX1RFWFRVUkVfMkQgfHwgdGFyZ2V0PT1HTF9URVhUVVJFX0NVQkVfTUFQOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6dGV4dHVyZVRhcmdldExpbWl0ZWQoR0xlbnVtIHRhcmdldCkgeworICAgIHJldHVybiB0YXJnZXQ9PUdMX1RFWFRVUkVfMkQ7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjp0ZXh0dXJlVGFyZ2V0RXgoR0xlbnVtIHRhcmdldCkgeworICAgIHN3aXRjaCh0YXJnZXQpIHsKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfT0VTOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfT0VTOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IAorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTdmFsaWRhdGU6OmJsZW5kRXF1YXRpb25Nb2RlKEdMZW51bSBtb2RlKXsKKyAgICByZXR1cm4gbW9kZSA9PSBHTF9GVU5DX0FERCAgICAgICAgICAgICB8fAorICAgICAgICAgICBtb2RlID09IEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgIHx8CisgICAgICAgICAgIG1vZGUgPT0gR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6ZnJhbWVidWZmZXJUYXJnZXQoR0xlbnVtIHRhcmdldCl7CisgICAgcmV0dXJuIHRhcmdldCA9PSBHTF9GUkFNRUJVRkZFUjsKK30KKworYm9vbCBHTEVTdmFsaWRhdGU6OmZyYW1lYnVmZmVyQXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCl7CisgICAgc3dpdGNoKGF0dGFjaG1lbnQpeworICAgIGNhc2UgR0xfQ09MT1JfQVRUQUNITUVOVDA6CisgICAgY2FzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UOgorICAgIGNhc2UgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdMRVN2YWxpZGF0ZTo6ZnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1zKEdMZW51bSBwbmFtZSl7CisgICAgc3dpdGNoKHBuYW1lKXsKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FOgorICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMOgorICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpyZW5kZXJidWZmZXJUYXJnZXQoR0xlbnVtIHRhcmdldCl7CisgICAgcmV0dXJuIHRhcmdldCA9PSBHTF9SRU5ERVJCVUZGRVI7Cit9CisKK2Jvb2wgR0xFU3ZhbGlkYXRlOjpyZW5kZXJidWZmZXJQYXJhbXMoR0xlbnVtIHBuYW1lKXsKKyAgICBzd2l0Y2gocG5hbWUpeworICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1dJRFRIOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0hFSUdIVDoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQ6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkU6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRToKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkU6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRToKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHTEVTdmFsaWRhdGU6OnRleEltZ0RpbShHTHNpemVpIHdpZHRoLEdMc2l6ZWkgaGVpZ2h0LGludCBtYXhUZXhTaXplKSB7CisKKyBpZiggd2lkdGggPCAwIHx8IGhlaWdodCA8IDAgfHwgd2lkdGggPiBtYXhUZXhTaXplIHx8IGhlaWdodCA+IG1heFRleFNpemUpCisgICAgcmV0dXJuIGZhbHNlOworIHJldHVybiBpc1Bvd2VyT2YyKHdpZHRoKSAmJiBpc1Bvd2VyT2YyKGhlaWdodCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTHV0aWxzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9HTHV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUyOTJjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL0dMdXRpbHMuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8R0xjb21tb24vR0x1dGlscy5oPgorCitib29sIGlzUG93ZXJPZjIoaW50IG51bSkgeworICAgIHJldHVybiAobnVtICYgKG51bSAtMSkpID09IDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vTmFtZWRPYmplY3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL05hbWVkT2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBmZDZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL05hbWVkT2JqZWN0LmNwcApAQCAtMCwwICsxLDkyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiR0xjb21tb24vTmFtZWRPYmplY3QuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgIkdMY29tbW9uL0dMRVNjb250ZXh0LmgiCisjaW5jbHVkZSAiR0xjb21tb24vT2JqZWN0TmFtZVNwYWNlLmgiCisKK05hbWVkT2JqZWN0OjpOYW1lZE9iamVjdChHZW5OYW1lSW5mbyBnZW5OYW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxOYW1lU3BhY2UgKmdsb2JhbE5hbWVTcGFjZSkgeworICAgIC8vIFdlIG5lZWQgYSBnbG9iYWwgbXV0ZXggZnJvbSBnbG9iYWxOYW1lU3BhY2UKKyAgICAvLyBBbmQgd2UgY2FuJ3QgY2hhbmdlIHRoZSBtdXRleCB0byBhIHN0YXRpYyB2YXJpYWJsZSBiZWNhdXNlIGl0IHdvdWxkIGJlCisgICAgLy8gcGFzc2VkIGFyb3VuZCBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcy4KKyAgICBtX2dsb2JhbE5hbWVTcGFjZSA9IGdsb2JhbE5hbWVTcGFjZTsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIF9sb2NrKG1fZ2xvYmFsTmFtZVNwYWNlLT5tX2xvY2spOworICAgIG1fdHlwZSA9IGdlbk5hbWVJbmZvLm1fdHlwZTsKKworICAgIHN3aXRjaCAoZ2VuTmFtZUluZm8ubV90eXBlKSB7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OlZFUlRFWEJVRkZFUjoKKyAgICAgICAgR0xFU2NvbnRleHQ6OmRpc3BhdGNoZXIoKS5nbEdlbkJ1ZmZlcnMoMSwmbV9nbG9iYWxOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkU6CisgICAgICAgIEdMRVNjb250ZXh0OjpkaXNwYXRjaGVyKCkuZ2xHZW5UZXh0dXJlcygxLCZtX2dsb2JhbE5hbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5hbWVkT2JqZWN0VHlwZTo6UkVOREVSQlVGRkVSOgorICAgICAgICBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9nbG9iYWxOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OkZSQU1FQlVGRkVSOgorICAgICAgICBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsR2VuRnJhbWVidWZmZXJzRVhUKDEsJm1fZ2xvYmFsTmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTToKKyAgICAgICAgc3dpdGNoIChnZW5OYW1lSW5mby5tX3NoYWRlclByb2dyYW1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIFNoYWRlclByb2dyYW1UeXBlOjpQUk9HUkFNOgorICAgICAgICAgICAgICAgIG1fZ2xvYmFsTmFtZSA9IEdMRVNjb250ZXh0OjpkaXNwYXRjaGVyKCkuZ2xDcmVhdGVQcm9ncmFtKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNoYWRlclByb2dyYW1UeXBlOjpWRVJURVhfU0hBREVSOgorICAgICAgICAgICAgICAgIG1fZ2xvYmFsTmFtZSA9IEdMRVNjb250ZXh0OjpkaXNwYXRjaGVyKCkuZ2xDcmVhdGVTaGFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9WRVJURVhfU0hBREVSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU2hhZGVyUHJvZ3JhbVR5cGU6OkZSQUdNRU5UX1NIQURFUjoKKyAgICAgICAgICAgICAgICBtX2dsb2JhbE5hbWUgPSBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsQ3JlYXRlU2hhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBtX2dsb2JhbE5hbWUgPSAwOworICAgIH0KK30KKworTmFtZWRPYmplY3Q6On5OYW1lZE9iamVjdCgpIHsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIF9sb2NrKG1fZ2xvYmFsTmFtZVNwYWNlLT5tX2xvY2spOworICAgIGFzc2VydChHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIE5hbWVkT2JqZWN0VHlwZTo6VkVSVEVYQlVGRkVSOgorICAgICAgICBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsRGVsZXRlQnVmZmVycygxLCAmbV9nbG9iYWxOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OlRFWFRVUkU6CisgICAgICAgIEdMRVNjb250ZXh0OjpkaXNwYXRjaGVyKCkuZ2xEZWxldGVUZXh0dXJlcygxLCAmbV9nbG9iYWxOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OlJFTkRFUkJVRkZFUjoKKyAgICAgICAgR0xFU2NvbnRleHQ6OmRpc3BhdGNoZXIoKS5nbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fZ2xvYmFsTmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTmFtZWRPYmplY3RUeXBlOjpGUkFNRUJVRkZFUjoKKyAgICAgICAgR0xFU2NvbnRleHQ6OmRpc3BhdGNoZXIoKS5nbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmbV9nbG9iYWxOYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lZE9iamVjdFR5cGU6OlNIQURFUl9PUl9QUk9HUkFNOgorICAgICAgICBpZiAoR0xFU2NvbnRleHQ6OmRpc3BhdGNoZXIoKS5nbElzUHJvZ3JhbShtX2dsb2JhbE5hbWUpKSB7CisgICAgICAgICAgICBHTEVTY29udGV4dDo6ZGlzcGF0Y2hlcigpLmdsRGVsZXRlUHJvZ3JhbShtX2dsb2JhbE5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR0xFU2NvbnRleHQ6OmRpc3BhdGNoZXIoKS5nbERlbGV0ZVNoYWRlcihtX2dsb2JhbE5hbWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL09iamVjdE5hbWVTcGFjZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vT2JqZWN0TmFtZVNwYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ViMGEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL09iamVjdE5hbWVTcGFjZS5jcHAKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJHTGNvbW1vbi9PYmplY3ROYW1lU3BhY2UuaCIKKworI2luY2x1ZGUgIkdMY29tbW9uL0dMRVNjb250ZXh0LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworTmFtZVNwYWNlOjpOYW1lU3BhY2UoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEdsb2JhbE5hbWVTcGFjZSAqZ2xvYmFsTmFtZVNwYWNlKSA6CisgICAgbV90eXBlKHBfdHlwZSksCisgICAgbV9nbG9iYWxOYW1lU3BhY2UoZ2xvYmFsTmFtZVNwYWNlKSB7fQorCitOYW1lU3BhY2U6On5OYW1lU3BhY2UoKQoreworfQorCitPYmplY3RMb2NhbE5hbWUKK05hbWVTcGFjZTo6Z2VuTmFtZShHZW5OYW1lSW5mbyBnZW5OYW1lSW5mbywgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lLCBib29sIGdlbkxvY2FsKQoreworICAgIGFzc2VydChtX3R5cGUgPT0gZ2VuTmFtZUluZm8ubV90eXBlKTsKKyAgICBPYmplY3RMb2NhbE5hbWUgbG9jYWxOYW1lID0gcF9sb2NhbE5hbWU7CisgICAgaWYgKGdlbkxvY2FsKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9ICsrbV9uZXh0TmFtZTsKKyAgICAgICAgfSB3aGlsZShsb2NhbE5hbWUgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1fbG9jYWxUb0dsb2JhbE1hcC5maW5kKGxvY2FsTmFtZSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbG9jYWxUb0dsb2JhbE1hcC5lbmQoKSApOworICAgIH0KKworICAgIGF1dG8gaXQgPSBtX2xvY2FsVG9HbG9iYWxNYXAuZW1wbGFjZShsb2NhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0UHRyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZWRPYmplY3QoZ2VuTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nbG9iYWxOYW1lU3BhY2UpKSkuZmlyc3Q7CisgICAgdW5zaWduZWQgaW50IGdsb2JhbE5hbWUgPSBpdC0+c2Vjb25kLT5nZXRHbG9iYWxOYW1lKCk7CisgICAgbV9nbG9iYWxUb0xvY2FsTWFwW2dsb2JhbE5hbWVdID0gbG9jYWxOYW1lOworCisgICAgcmV0dXJuIGxvY2FsTmFtZTsKK30KKworCit1bnNpZ25lZCBpbnQKK05hbWVTcGFjZTo6Z2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpCit7CisgICAgTmFtZXNNYXA6Oml0ZXJhdG9yIG4oIG1fbG9jYWxUb0dsb2JhbE1hcC5maW5kKHBfbG9jYWxOYW1lKSApOworICAgIGlmIChuICE9IG1fbG9jYWxUb0dsb2JhbE1hcC5lbmQoKSkgeworICAgICAgICAvLyBvYmplY3QgZm91bmQgLSByZXR1cm4gaXRzIGdsb2JhbCBuYW1lIG1hcAorICAgICAgICByZXR1cm4gKCpuKS5zZWNvbmQtPmdldEdsb2JhbE5hbWUoKTsKKyAgICB9CisKKyAgICAvLyBvYmplY3QgZG9lcyBub3QgZXhpc3Q7CisgICAgcmV0dXJuIDA7Cit9CisKK09iamVjdExvY2FsTmFtZQorTmFtZVNwYWNlOjpnZXRMb2NhbE5hbWUodW5zaWduZWQgaW50IHBfZ2xvYmFsTmFtZSkKK3sKKyAgICBjb25zdCBhdXRvIGl0ID0gbV9nbG9iYWxUb0xvY2FsTWFwLmZpbmQocF9nbG9iYWxOYW1lKTsKKyAgICBpZiAoaXQgIT0gbV9nbG9iYWxUb0xvY2FsTWFwLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitOYW1lZE9iamVjdFB0ciBOYW1lU3BhY2U6OmdldE5hbWVkT2JqZWN0KE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSkgeworICAgIGF1dG8gaXQgPSBtX2xvY2FsVG9HbG9iYWxNYXAuZmluZChwX2xvY2FsTmFtZSk7CisgICAgaWYgKGl0ICE9IG1fbG9jYWxUb0dsb2JhbE1hcC5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZAorTmFtZVNwYWNlOjpkZWxldGVOYW1lKE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSkKK3sKKyAgICBOYW1lc01hcDo6aXRlcmF0b3IgbiggbV9sb2NhbFRvR2xvYmFsTWFwLmZpbmQocF9sb2NhbE5hbWUpICk7CisgICAgaWYgKG4gIT0gbV9sb2NhbFRvR2xvYmFsTWFwLmVuZCgpKSB7CisgICAgICAgIG1fZ2xvYmFsVG9Mb2NhbE1hcC5lcmFzZShuLT5zZWNvbmQtPmdldEdsb2JhbE5hbWUoKSk7CisgICAgICAgIG1fbG9jYWxUb0dsb2JhbE1hcC5lcmFzZShuKTsKKyAgICB9Cit9CisKK2Jvb2wKK05hbWVTcGFjZTo6aXNPYmplY3QoT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lKQoreworICAgIHJldHVybiAobV9sb2NhbFRvR2xvYmFsTWFwLmZpbmQocF9sb2NhbE5hbWUpICE9IG1fbG9jYWxUb0dsb2JhbE1hcC5lbmQoKSApOworfQorCit2b2lkCitOYW1lU3BhY2U6OnJlcGxhY2VHbG9iYWxPYmplY3QoT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0UHRyIHBfbmFtZWRPYmplY3QpCit7CisgICAgTmFtZXNNYXA6Oml0ZXJhdG9yIG4oIG1fbG9jYWxUb0dsb2JhbE1hcC5maW5kKHBfbG9jYWxOYW1lKSApOworICAgIGlmIChuICE9IG1fbG9jYWxUb0dsb2JhbE1hcC5lbmQoKSkgeworICAgICAgICBtX2dsb2JhbFRvTG9jYWxNYXAuZXJhc2Uobi0+c2Vjb25kLT5nZXRHbG9iYWxOYW1lKCkpOworICAgICAgICAoKm4pLnNlY29uZCA9IHBfbmFtZWRPYmplY3Q7CisgICAgICAgIG1fZ2xvYmFsVG9Mb2NhbE1hcC5lbXBsYWNlKHBfbmFtZWRPYmplY3QtPmdldEdsb2JhbE5hbWUoKSwgcF9sb2NhbE5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9QYWxldHRlVGV4dHVyZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vUGFsZXR0ZVRleHR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vUGFsZXR0ZVRleHR1cmUuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkdMY29tbW9uL1BhbGV0dGVUZXh0dXJlLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworCisKK3N0cnVjdCBDb2xvcgoreworICBDb2xvcih1bnNpZ25lZCBjaGFyIHIsIHVuc2lnbmVkIGNoYXIgZyx1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgYSk6cmVkKHIpLGdyZWVuKGcpLGJsdWUoYiksYWxwaGEoYSl7fTsKKyAgdW5zaWduZWQgY2hhciByZWQ7CisgIHVuc2lnbmVkIGNoYXIgZ3JlZW47CisgIHVuc2lnbmVkIGNoYXIgYmx1ZTsKKyAgdW5zaWduZWQgY2hhciBhbHBoYTsKK307CisKK3ZvaWQgZ2V0UGFsZXR0ZUluZm8oR0xlbnVtIGludGVybmFsRm9ybWF0LHVuc2lnbmVkIGludCYgaW5kZXhTaXplQml0cyx1bnNpZ25lZCBpbnQmIGNvbG9yU2l6ZUJ5dGVzLEdMZW51bSYgY29sb3JGcm10KSB7CisKKyAgICAgICAgY29sb3JGcm10ID0gR0xfUkdCOworICAgICAgICBzd2l0Y2goaW50ZXJuYWxGb3JtYXQpCisgICAgeworICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6CisgICAgICAgIGluZGV4U2l6ZUJpdHMgPSA0OworICAgICAgICBjb2xvclNpemVCeXRlcyA9IDM7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6CisgICAgICAgIGluZGV4U2l6ZUJpdHMgPSA0OworICAgICAgICBjb2xvclNpemVCeXRlcyA9IDQ7CisgICAgICAgIGNvbG9yRnJtdCA9IEdMX1JHQkE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKKyAgICAgICAgY29sb3JGcm10ID0gR0xfUkdCQTsKKyAgICAgICAgLyogZmFsbC10aHJvdWdoICovCisgICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6CisgICAgICAgIGluZGV4U2l6ZUJpdHMgPSA0OworICAgICAgICBjb2xvclNpemVCeXRlcyA9IDI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKKyAgICAgICAgaW5kZXhTaXplQml0cyA9IDg7CisgICAgICAgIGNvbG9yU2l6ZUJ5dGVzID0gMzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKKyAgICAgICAgaW5kZXhTaXplQml0cyA9IDg7CisgICAgICAgIGNvbG9yU2l6ZUJ5dGVzID0gNDsKKyAgICAgICAgY29sb3JGcm10ID0gR0xfUkdCQTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgorICAgICAgICBjb2xvckZybXQgPSBHTF9SR0JBOworICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICAgICAgaW5kZXhTaXplQml0cyA9IDg7CisgICAgICAgIGNvbG9yU2l6ZUJ5dGVzID0gMjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK0NvbG9yIHBhbGV0dGVDb2xvcihjb25zdCB1bnNpZ25lZCBjaGFyKiBwYWxsZXRlLHVuc2lnbmVkIGludCBpbmRleCxHTGVudW0gZm9ybWF0KQoreworICAgICAgICBzaG9ydCBzOworICAgICAgICBzd2l0Y2goZm9ybWF0KSB7CisgICAgICAgIC8vUkdCCisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjhfT0VTOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yKHBhbGxldGVbaW5kZXhdLHBhbGxldGVbaW5kZXgrMV0scGFsbGV0ZVtpbmRleCsyXSwwKTsKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICAgICAgICAgIHMgPSAqKChzaG9ydCAqKShwYWxsZXRlK2luZGV4KSk7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IoKHMgPj4gMTEpKjI1NS8zMSwoKHMgPj4gNSkgJiAweDNmKSoyNTUvNjMgLChzICYgMHgxZikqMjU1LzMxLDApOworCisgICAgICAgIC8vUkdCQQorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQThfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQThfT0VTOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yKHBhbGxldGVbaW5kZXhdLHBhbGxldGVbaW5kZXgrMV0scGFsbGV0ZVtpbmRleCsyXSxwYWxsZXRlW2luZGV4KzNdKTsKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKKyAgICAgICAgICAgIHMgPSAqKChzaG9ydCAqKShwYWxsZXRlK2luZGV4KSk7CisgICAgICAgICAgICByZXR1cm4gQ29sb3IoKChzID4+IDEyKSAmIDB4ZikqMjU1LzE1LCgocyA+PiA4KSAmIDB4ZikqMjU1LzE1LCgocyA+PiA0KSAmIDB4ZikqMjU1LzE1ICwocyAmIDB4ZikqMjU1LzE1KTsKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgICAgICAgICBzID0gKigoc2hvcnQgKikocGFsbGV0ZStpbmRleCkpOworICAgICAgICAgICAgcmV0dXJuIENvbG9yKCgocyA+PiAxMSkgJiAweDFmKSoyNTUvMzEsKChzID4+IDYpICYgMHgxZikqMjU1LzMxLCgocyA+PiAxKSAmIDB4MWYpKjI1NS8zMSAsKHMgJiAweDEpICogMjU1KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDb2xvcigyNTUsMjU1LDI1NSwyNTUpOworICAgIH0KK30KKwordW5zaWduZWQgY2hhciogdW5jb21wcmVzc1RleHR1cmUoR0xlbnVtIGludGVybmFsZm9ybWF0LEdMZW51bSYgZm9ybWF0T3V0LEdMc2l6ZWkgd2lkdGgsR0xzaXplaSBoZWlnaHQsR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSxHTGludCBsZXZlbCkgeworCisgICAgdW5zaWduZWQgaW50IGluZGV4U2l6ZUJpdHMgPSAwOyAgLy90aGUgc2l6ZSBvZiB0aGUgY29sb3IgaW5kZXggaW4gdGhlIHBhbGxldGUKKyAgICB1bnNpZ25lZCBpbnQgY29sb3JTaXplQnl0ZXMgPSAwOyAvL3RoZSBzaXplIG9mIGVhY2ggY29sb3IgY2VsbCBpbiB0aGUgcGFsbGV0ZQorCisgICAgZ2V0UGFsZXR0ZUluZm8oaW50ZXJuYWxmb3JtYXQsaW5kZXhTaXplQml0cyxjb2xvclNpemVCeXRlcyxmb3JtYXRPdXQpOworICAgIGlmKCFkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcGFsZXR0ZSA9IHN0YXRpY19jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIgKj4oZGF0YSk7CisKKyAgICAvL3RoZSBwYWxsZXRlIHBvc2l0aW9uZWQgaW4gdGhlIGJlZ2luaW5uZyBvZiB0aGUgZGF0YQorICAgIC8vIHNvIHdlIGp1bXAgb3ZlciBpdCB0byBnZXQgdG8gdGhlIGNvbG9zIGluZGljZXMgaW4gdGhlIHBhbGV0dGUKKworICAgIGludCBuQ29sb3JzID0gMiA8PCAoaW5kZXhTaXplQml0cyAtMSk7IC8vMl5pbmRleFNpemVCaXRzCisgICAgaW50IHBhbGV0dGVTaXplQnl0ZXMgPSBuQ29sb3JzKmNvbG9yU2l6ZUJ5dGVzOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlSW5kaWNlcyA9ICBwYWxldHRlICsgcGFsZXR0ZVNpemVCeXRlczsKKworICAgIC8vanVtcGluZyB0byB0aGUgdGhlIGNvcnJlY3QgbWlwbWFwIGxldmVsCisgICAgZm9yKGludCBpPTA7aTxsZXZlbDtpKyspIHsKKyAgICAgICAgaW1hZ2VJbmRpY2VzKz0gKHdpZHRoKmhlaWdodCppbmRleFNpemVCaXRzKS84OworICAgICAgICB3aWR0aCAgPSB3aWR0aCAgPj4gMTsKKyAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ID4+IDE7CisgICAgfQorCisgICAgaW50IGNvbG9yU2l6ZU91dCA9IChmb3JtYXRPdXQgPT0gR0xfUkdCPyAzOjQpOworICAgIGludCBuUGl4ZWxzID0gd2lkdGgqaGVpZ2h0OworICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsc091dCA9IG5ldyB1bnNpZ25lZCBjaGFyW25QaXhlbHMqY29sb3JTaXplT3V0XTsKKyAgICBpZighcGl4ZWxzT3V0KSByZXR1cm4gTlVMTDsKKworICAgIGludCBsZWZ0Qnl0ZXMgPSAoKHBhbGV0dGUgKyBpbWFnZVNpemUpIC8qIHRoZSBlbmQgb2YgZGF0YSBwb2ludGVyKi8KKyAgICAgICAgICAgICAgICAgICAgICAtIGltYWdlSW5kaWNlcyk7CisgICAgaW50IGxlZnRQaXhlbHMgPSAobGVmdEJ5dGVzICogOCApL2luZGV4U2l6ZUJpdHM7CisKKyAgICBpbnQgbWF4SW5kaWNlcyA9IChsZWZ0UGl4ZWxzIDwgblBpeGVscykgPyBsZWZ0UGl4ZWxzOm5QaXhlbHM7CisKKyAgICAvL2ZpbGxpbmcgdGhlIHBpeGVscyBhcnJheQorICAgIGZvcihpbnQgaSA9MCA7IGkgPCBtYXhJbmRpY2VzIDsgaSsrKSB7CisgICAgICAgIGludCBwYWxldHRlSW5kZXggPSAwOworICAgICAgICBpbnQgaW5kZXhPdXQgPSBpKmNvbG9yU2l6ZU91dDsKKyAgICAgICAgaWYoaW5kZXhTaXplQml0cyA9PSA0KSB7CisgICAgICAgICAgICBwYWxldHRlSW5kZXggPSAoaSUyKSA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kaWNlc1tpLzJdID4+IDQ6ICAvL3VwcGVyIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kaWNlc1tpLzJdICYgMHhmOyAvL2xvd2VyIGJpdHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhbGV0dGVJbmRleCA9IGltYWdlSW5kaWNlc1tpXTsKKyAgICAgICAgfQorCisgICAgICAgIHBhbGV0dGVJbmRleCo9Y29sb3JTaXplQnl0ZXM7CisgICAgICAgIENvbG9yIGMgPSBwYWxldHRlQ29sb3IocGFsZXR0ZSxwYWxldHRlSW5kZXgsaW50ZXJuYWxmb3JtYXQpOworCisgICAgICAgIHBpeGVsc091dFtpbmRleE91dF0gPSBjLnJlZDsKKyAgICAgICAgcGl4ZWxzT3V0W2luZGV4T3V0KzFdID0gYy5ncmVlbjsKKyAgICAgICAgcGl4ZWxzT3V0W2luZGV4T3V0KzJdID0gYy5ibHVlOworICAgICAgICBpZihmb3JtYXRPdXQgPT0gR0xfUkdCQSkgeworICAgICAgICAgICAgcGl4ZWxzT3V0W2luZGV4T3V0KzNdID0gYy5hbHBoYTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGl4ZWxzT3V0OworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vUmFuZ2VNYW5pcC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vUmFuZ2VNYW5pcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ2ZjExOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9SYW5nZU1hbmlwLmNwcApAQCAtMCwwICsxLDEyNyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlIDxHTGNvbW1vbi9SYW5nZU1hbmlwLmg+CisKKworYm9vbCBSYW5nZTo6cmFuZ2VJbnRlcnNlY3Rpb24oY29uc3QgUmFuZ2UmIHIsUmFuZ2UmIHJPdXQpIGNvbnN0IHsKKyAgICBpZihtX3N0YXJ0ID4gci5nZXRFbmQoKSB8fCByLmdldFN0YXJ0KCkgPiBtX2VuZCkgcmV0dXJuIGZhbHNlOworICAgIGludCBtYXhfc3RhcnQgPSAobV9zdGFydCA+IHIuZ2V0U3RhcnQoKSk/IG1fc3RhcnQ6ci5nZXRTdGFydCgpOworICAgIGludCBtaW5fZW5kID0gKG1fZW5kIDwgci5nZXRFbmQoKSk/bV9lbmQ6ci5nZXRFbmQoKTsKKyAgICBpbnQgc2l6ZSA9IG1pbl9lbmQgLSBtYXhfc3RhcnQ7CisgICAgaWYoc2l6ZSkgeworICAgICAgICByT3V0LnNldFJhbmdlKG1heF9zdGFydCxtaW5fZW5kLW1heF9zdGFydCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmFuZ2U6OnJhbmdlVW5pb24oY29uc3QgUmFuZ2UmIHIsUmFuZ2UmIHJPdXQpIGNvbnN0IHsKKyAgICBpZihtX3N0YXJ0ID4gci5nZXRFbmQoKSB8fCByLmdldFN0YXJ0KCkgPiBtX2VuZCkgcmV0dXJuIGZhbHNlOworICAgIGludCBtaW5fc3RhcnQgPSAobV9zdGFydCA8IHIuZ2V0U3RhcnQoKSk/bV9zdGFydDpyLmdldFN0YXJ0KCk7CisgICAgaW50IG1heF9lbmQgPSAobV9lbmQgPiByLmdldEVuZCgpKT9tX2VuZDpyLmdldEVuZCgpOworICAgIGludCBzaXplID0gIG1heF9lbmQgLSBtaW5fc3RhcnQ7CisgICAgaWYoc2l6ZSkgeworICAgICAgICByT3V0LnNldFJhbmdlKG1pbl9zdGFydCxtYXhfZW5kLW1pbl9zdGFydCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmFuZ2VMaXN0OjphZGRSYW5nZShjb25zdCBSYW5nZSYgcikgeworICAgIGlmKHIuZ2V0U2l6ZSgpKQorICAgICAgICBsaXN0LnB1c2hfYmFjayhyKTsKK30KKwordm9pZCBSYW5nZUxpc3Q6OmFkZFJhbmdlcyhjb25zdCBSYW5nZUxpc3QmIHJsKSB7CisgICAgZm9yKGludCBpID0wOyBpPCBybC5zaXplKCk7aSsrKSB7CisgICAgICAgYWRkUmFuZ2UocmwubGlzdFtpXSk7CisgICAgfQorfQorCit2b2lkIFJhbmdlTGlzdDo6ZGVsUmFuZ2VzKGNvbnN0IFJhbmdlTGlzdCYgcmwsUmFuZ2VMaXN0JiBkZWxldGVkKSB7CisgICAgZm9yKGludCBpID0wOyBpPCBybC5zaXplKCk7aSsrKSB7CisgICAgICAgZGVsUmFuZ2UocmwubGlzdFtpXSxkZWxldGVkKTsKKyAgICB9Cit9CisKK2Jvb2wgUmFuZ2VMaXN0OjplbXB0eSgpIGNvbnN0eworICAgIHJldHVybiBsaXN0LmVtcHR5KCk7Cit9CisKK2ludCAgUmFuZ2VMaXN0OjpzaXplKCkgY29uc3R7CisgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOworfQordm9pZCBSYW5nZUxpc3Q6OmNsZWFyKCkgeworICAgIHJldHVybiBsaXN0LmNsZWFyKCk7Cit9CisKK3ZvaWQgUmFuZ2VMaXN0OjplcmFzZSh1bnNpZ25lZCBpbnQgaSkgeworICAgIGlmKGkgPiBsaXN0LnNpemUoKSkgcmV0dXJuOworICAgIGxpc3QuZXJhc2UobGlzdC5iZWdpbigpICtpKTsKK30KKwordm9pZCBSYW5nZUxpc3Q6OmRlbFJhbmdlKGNvbnN0IFJhbmdlJiByLFJhbmdlTGlzdCYgZGVsZXRlZCkgeworICAgIGlmKHIuZ2V0U2l6ZSgpID09IDApIHJldHVybjsKKworICAgIFJhbmdlIGludGVyc2VjdGlvbjsKKyAgICBSYW5nZSB0ZW1wOworICAgIC8vIGNvbXBhcmUgbmV3IHJlY3QgdG8gZWFjaCBhbmQgYW55IG9mIHRoZSByZWN0cyBvbiB0aGUgbGlzdAorICAgIGZvciAoaW50IGk9MDtpPChpbnQpbGlzdC5zaXplKCk7aSsrKSB7IC8vIGkgbXVzdCBiZSBzaWduZWQgZm9yIGktLSBiZWxvdworICAgICAvLyBpZiB0aGVyZSBpcyBpbnRlcnNlY3Rpb24KKyAgICAgaWYgKHIucmFuZ2VJbnRlcnNlY3Rpb24obGlzdFtpXSxpbnRlcnNlY3Rpb24pKSB7CisgICAgICAgICAgICAgUmFuZ2Ugb2xkPWxpc3RbaV07CisgICAgICAgICAvLyByZW1vdmUgb2xkIGFzIGl0IGlzIGFib3V0IHRvIGJlIHNwbGl0CisgICAgICAgICBlcmFzZShpKTsKKyAgICAgICAgIGktLTsKKyAgICAgICAgIGlmIChpbnRlcnNlY3Rpb24hPW9sZCkgeyAvLyBvdGhlcndpc2Ugc3BsaXQ6CisgICAgICAgICAgICAgLy9pbnRlcnNlY3Rpb24gb24gcmlnaHQgc2lkZQorICAgICAgICAgICAgIGlmKG9sZC5nZXRTdGFydCgpICE9IGludGVyc2VjdGlvbi5nZXRTdGFydCgpKSB7CisgICAgICAgICAgICAgICAgIGxpc3QuaW5zZXJ0KGxpc3QuYmVnaW4oKSxSYW5nZShvbGQuZ2V0U3RhcnQoKSxpbnRlcnNlY3Rpb24uZ2V0U3RhcnQoKSAtIG9sZC5nZXRTdGFydCgpKSk7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgLy9pbnRlcnNlY3Rpb24gb24gbGVmdCBzaWRlCisgICAgICAgICAgICAgaWYob2xkLmdldEVuZCgpICE9IGludGVyc2VjdGlvbi5nZXRFbmQoKSkgeworICAgICAgICAgICAgICAgICBsaXN0Lmluc2VydChsaXN0LmJlZ2luKCksUmFuZ2UoaW50ZXJzZWN0aW9uLmdldEVuZCgpLG9sZC5nZXRFbmQoKSAtIGludGVyc2VjdGlvbi5nZXRFbmQoKSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGRlbGV0ZWQuYWRkUmFuZ2UoaW50ZXJzZWN0aW9uKTsKKyAgICAgfQorIH0KK30KKwordm9pZCBSYW5nZUxpc3Q6Om1lcmdlKCkgeworICAgIGlmKGxpc3QuZW1wdHkoKSkgcmV0dXJuOworCisgICAgUmFuZ2UgdGVtcDsKKyAgICBib29sIGNoYW5nZWQ7CisKKyAgICBkbyB7IC8vIHJlLXJ1biBpZiBjaGFuZ2VkIGluIGxhc3QgcnVuCisgICAgICAgIGNoYW5nZWQ9MDsKKyAgICAgICAgLy8gcnVuIGZvciBlYWNoIGNvbWJpbmF0aW9ucyBvZiB0d28gcmVjdHMgaW4gdGhlIGxpc3QKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8KCgoaW50KWxpc3Quc2l6ZSgpKS0xKSAmJiAhY2hhbmdlZCA7aSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBqPWkrMTtqPChpbnQpbGlzdC5zaXplKCkgJiYgIWNoYW5nZWQgO2orKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIGlmIChsaXN0W2ldLnJhbmdlVW5pb24obGlzdFtqXSx0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdGhlbSBleGFjdGx5IG9uZSBvbiBsZWZ0IG9mIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICBsaXN0W2ldID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgZXJhc2Uoaik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ9MTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGNoYW5nZWQpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL1RleHR1cmVVdGlscy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vVGV4dHVyZVV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhYWJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL1RleHR1cmVVdGlscy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8R0xjb21tb24vVGV4dHVyZVV0aWxzLmg+CisjaW5jbHVkZSA8R0xjb21tb24vR0xFU21hY3Jvcy5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRGlzcGF0Y2guaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9HTEVTdmFsaWRhdGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1lbW9yeT4KKworaW50IGdldENvbXByZXNzZWRGb3JtYXRzKGludCogZm9ybWF0cyl7CisgICAgaWYoZm9ybWF0cyl7CisgICAgICAgIC8vUGFsZXR0ZQorICAgICAgICBmb3JtYXRzWzBdID0gR0xfUEFMRVRURTRfUkdCQThfT0VTOworICAgICAgICBmb3JtYXRzWzFdID0gR0xfUEFMRVRURTRfUkdCQTRfT0VTOworICAgICAgICBmb3JtYXRzWzJdID0gR0xfUEFMRVRURThfUkdCQThfT0VTOworICAgICAgICBmb3JtYXRzWzNdID0gR0xfUEFMRVRURThfUkdCQTRfT0VTOworICAgICAgICBmb3JtYXRzWzRdID0gR0xfUEFMRVRURTRfUkdCOF9PRVM7CisgICAgICAgIGZvcm1hdHNbNV0gPSBHTF9QQUxFVFRFOF9SR0I4X09FUzsKKyAgICAgICAgZm9ybWF0c1s2XSA9IEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOworICAgICAgICBmb3JtYXRzWzddID0gR0xfUEFMRVRURThfUkdCNV9BMV9PRVM7CisgICAgICAgIGZvcm1hdHNbOF0gPSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM7CisgICAgICAgIGZvcm1hdHNbOV0gPSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVM7CisgICAgICAgIC8vRVRDCisgICAgICAgIGZvcm1hdHNbTUFYX1NVUFBPUlRFRF9QQUxFVFRFXSA9IEdMX0VUQzFfUkdCOF9PRVM7CisgICAgfQorICAgIHJldHVybiBNQVhfU1VQUE9SVEVEX1BBTEVUVEUgKyBNQVhfRVRDX1NVUFBPUlRFRDsKK30KKwordm9pZCAgZG9Db21wcmVzc2VkVGV4SW1hZ2UyRChHTEVTY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgdm9pZCAqIGZ1bmNQdHIpCit7CisgICAgLyogWFhYOiBUaGlzIGlzIGp1c3QgYSBoYWNrIHRvIGZpeCB0aGUgcmVzb2x2ZSBvZiBnbFRleEltYWdlMkQgcHJvYmxlbQorICAgICAgIEl0IHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHdlJ2xsIG5vIGxvbmdlciBsaW5rIGFnYWluc3QgbGlnR0wgKi8KKyAgICB0eXBlZGVmIHZvaWQgKEdMQVBJRU5UUlkgKmdsVGV4SW1hZ2UyRFB0cl90ICkgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKKyAgICBnbFRleEltYWdlMkRQdHJfdCBnbFRleEltYWdlMkRQdHI7CisgICAgZ2xUZXhJbWFnZTJEUHRyID0gIChnbFRleEltYWdlMkRQdHJfdClmdW5jUHRyOyAKKworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQjhfRVRDMjoKKyAgICAgICAgY2FzZSBHTF9FVEMxX1JHQjhfT0VTOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdMaW50IGZvcm1hdCA9IEdMX1JHQjsKKyAgICAgICAgICAgICAgICBHTGludCB0eXBlID0gR0xfVU5TSUdORURfQllURTsKKworICAgICAgICAgICAgICAgIEdMc2l6ZWkgY29tcHJlc3NlZFNpemUgPSBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBTRVRfRVJST1JfSUYoKGNvbXByZXNzZWRTaXplID4gaW1hZ2VTaXplKSwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgU0VUX0VSUk9SX0lGKCFkYXRhLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYWxpZ24gPSBjdHgtPmdldFVucGFja0FsaWdubWVudCgpLTE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBicHIgPSAoKHdpZHRoICogMykgKyBhbGlnbikgJiB+YWxpZ247CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBicHIgKiBoZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZXRjMV9ieXRlW10+IHBPdXQobmV3IGV0YzFfYnl0ZVtzaXplXSk7CisgICAgICAgICAgICAgICAgaW50IHJlcyA9IGV0YzJfZGVjb2RlX2ltYWdlKChjb25zdCBldGMxX2J5dGUqKWRhdGEsIHBPdXQuZ2V0KCksIHdpZHRoLCBoZWlnaHQsIDMsIGJwcik7CisgICAgICAgICAgICAgICAgU0VUX0VSUk9SX0lGKHJlcyE9MCwgR0xfSU5WQUxJRF9WQUxVRSk7CisgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEUHRyKHRhcmdldCxsZXZlbCxmb3JtYXQsd2lkdGgsaGVpZ2h0LGJvcmRlcixmb3JtYXQsdHlwZSxwT3V0LmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6CisgICAgICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQThfT0VTOgorICAgICAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICAgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6CisgICAgICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVM6CisgICAgICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQThfT0VTOgorICAgICAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICAgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVM6CisgICAgICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0VUX0VSUk9SX0lGKGxldmVsID4gbG9nMihjdHgtPmdldE1heFRleFNpemUoKSkgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAhPTAgfHwgbGV2ZWwgPiAwIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhR0xFU3ZhbGlkYXRlOjp0ZXhJbWdEaW0od2lkdGgsaGVpZ2h0LGN0eC0+Z2V0TWF4VGV4U2l6ZSgpKzIpLEdMX0lOVkFMSURfVkFMVUUpCisgICAgICAgICAgICAgICAgU0VUX0VSUk9SX0lGKCFkYXRhLEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKKworICAgICAgICAgICAgICAgIGludCBuTWlwbWFwcyA9IC1sZXZlbCArIDE7CisgICAgICAgICAgICAgICAgR0xzaXplaSB0bXBXaWR0aCAgPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBHTHNpemVpIHRtcEhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuTWlwbWFwcyA7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgR0xlbnVtIHVuY29tcHJlc3NlZEZybXQ7CisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogdW5jb21wcmVzc2VkID0gdW5jb21wcmVzc1RleHR1cmUoaW50ZXJuYWxmb3JtYXQsdW5jb21wcmVzc2VkRnJtdCx3aWR0aCxoZWlnaHQsaW1hZ2VTaXplLGRhdGEsaSk7CisgICAgICAgICAgICAgICAgICAgZ2xUZXhJbWFnZTJEUHRyKHRhcmdldCxpLHVuY29tcHJlc3NlZEZybXQsdG1wV2lkdGgsdG1wSGVpZ2h0LGJvcmRlcix1bmNvbXByZXNzZWRGcm10LEdMX1VOU0lHTkVEX0JZVEUsdW5jb21wcmVzc2VkKTsKKyAgICAgICAgICAgICAgICAgICB0bXBXaWR0aC89MjsKKyAgICAgICAgICAgICAgICAgICB0bXBIZWlnaHQvPTI7CisgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gdW5jb21wcmVzc2VkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTRVRfRVJST1JfSUYoMSwgR0xfSU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9ldGMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL2V0Yy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2YTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9HTGNvbW1vbi9ldGMuY3BwCkBAIC0wLDAgKzEsODA0IEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8R0xjb21tb24vZXRjLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBGcm9tIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvZ2xlcy9leHRlbnNpb25zL09FUy9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZS50eHQKKworIFRoZSBudW1iZXIgb2YgYml0cyB0aGF0IHJlcHJlc2VudCBhIDR4NCB0ZXhlbCBibG9jayBpcyA2NCBiaXRzIGlmCisgPGludGVybmFsZm9ybWF0PiBpcyBnaXZlbiBieSBFVEMxX1JHQjhfT0VTLgorCisgVGhlIGRhdGEgZm9yIGEgYmxvY2sgaXMgYSBudW1iZXIgb2YgYnl0ZXMsCisKKyB7cTAsIHExLCBxMiwgcTMsIHE0LCBxNSwgcTYsIHE3fQorCisgd2hlcmUgYnl0ZSBxMCBpcyBsb2NhdGVkIGF0IHRoZSBsb3dlc3QgbWVtb3J5IGFkZHJlc3MgYW5kIHE3IGF0CisgdGhlIGhpZ2hlc3QuIFRoZSA2NCBiaXRzIHNwZWNpZnlpbmcgdGhlIGJsb2NrIGlzIHRoZW4gcmVwcmVzZW50ZWQKKyBieSB0aGUgZm9sbG93aW5nIDY0IGJpdCBpbnRlZ2VyOgorCisgaW50NjRiaXQgPSAyNTYqKDI1NiooMjU2KigyNTYqKDI1NiooMjU2KigyNTYqcTArcTEpK3EyKStxMykrcTQpK3E1KStxNikrcTc7CisKKyBFVEMxX1JHQjhfT0VTOgorCisgYSkgYml0IGxheW91dCBpbiBiaXRzIDYzIHRocm91Z2ggMzIgaWYgZGlmZmJpdCA9IDAKKworIDYzIDYyIDYxIDYwIDU5IDU4IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwIDQ5IDQ4CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IGJhc2UgY29sMSB8IGJhc2UgY29sMiB8IGJhc2UgY29sMSB8IGJhc2UgY29sMiB8CisgfCBSMSAoNGJpdHMpfCBSMiAoNGJpdHMpfCBHMSAoNGJpdHMpfCBHMiAoNGJpdHMpfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MCAzOSAzOCAzNyAzNiAzNSAzNCAgMzMgIDMyCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBiYXNlIGNvbDEgfCBiYXNlIGNvbDIgfCB0YWJsZSAgfCB0YWJsZSAgfGRpZmZ8ZmxpcHwKKyB8IEIxICg0Yml0cyl8IEIyICg0Yml0cyl8IGN3IDEgICB8IGN3IDIgICB8Yml0IHxiaXQgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyBiKSBiaXQgbGF5b3V0IGluIGJpdHMgNjMgdGhyb3VnaCAzMiBpZiBkaWZmYml0ID0gMQorCisgNjMgNjIgNjEgNjAgNTkgNTggNTcgNTYgNTUgNTQgNTMgNTIgNTEgNTAgNDkgNDgKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgYmFzZSBjb2wxICAgIHwgZGNvbCAyIHwgYmFzZSBjb2wxICAgIHwgZGNvbCAyIHwKKyB8IFIxJyAoNSBiaXRzKSB8IGRSMiAgICB8IEcxJyAoNSBiaXRzKSB8IGRHMiAgICB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIDQ3IDQ2IDQ1IDQ0IDQzIDQyIDQxIDQwIDM5IDM4IDM3IDM2IDM1IDM0ICAzMyAgMzIKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IGJhc2UgY29sIDEgICB8IGRjb2wgMiB8IHRhYmxlICB8IHRhYmxlICB8ZGlmZnxmbGlwfAorIHwgQjEnICg1IGJpdHMpIHwgZEIyICAgIHwgY3cgMSAgIHwgY3cgMiAgIHxiaXQgfGJpdCB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIGMpIGJpdCBsYXlvdXQgaW4gYml0cyAzMSB0aHJvdWdoIDAgKGluIGJvdGggY2FzZXMpCisKKyAzMSAzMCAyOSAyOCAyNyAyNiAyNSAyNCAyMyAyMiAyMSAyMCAxOSAxOCAxNyAxNgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCAgICAgICBtb3N0IHNpZ25pZmljYW50IHBpeGVsIGluZGV4IGJpdHMgICAgICAgfAorIHwgcHwgb3wgbnwgbXwgbHwga3wganwgaXwgaHwgZ3wgZnwgZXwgZHwgY3wgYnwgYXwKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgMTUgMTQgMTMgMTIgMTEgMTAgIDkgIDggIDcgIDYgIDUgIDQgIDMgICAyICAgMSAgMAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IHBpeGVsIGluZGV4IGJpdHMgICAgICAgfAorIHwgcHwgb3wgbnwgbXwgbHwga3wganwgaXwgaHwgZ3wgZnwgZXwgZHwgYyB8IGIgfCBhIHwKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyBBZGQgdGFibGUgMy4xNy4yOiBJbnRlbnNpdHkgbW9kaWZpZXIgc2V0cyBmb3IgRVRDMSBjb21wcmVzc2VkIHRleHR1cmVzOgorCisgdGFibGUgY29kZXdvcmQgICAgICAgICAgICAgICAgbW9kaWZpZXIgdGFibGUKKyAtLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwICAgICAgICAgICAgICAgICAgICAgLTggIC0yICAyICAgOAorIDEgICAgICAgICAgICAgICAgICAgIC0xNyAgLTUgIDUgIDE3CisgMiAgICAgICAgICAgICAgICAgICAgLTI5ICAtOSAgOSAgMjkKKyAzICAgICAgICAgICAgICAgICAgICAtNDIgLTEzIDEzICA0MgorIDQgICAgICAgICAgICAgICAgICAgIC02MCAtMTggMTggIDYwCisgNSAgICAgICAgICAgICAgICAgICAgLTgwIC0yNCAyNCAgODAKKyA2ICAgICAgICAgICAgICAgICAgIC0xMDYgLTMzIDMzIDEwNgorIDcgICAgICAgICAgICAgICAgICAgLTE4MyAtNDcgNDcgMTgzCisKKworIEFkZCB0YWJsZSAzLjE3LjMgTWFwcGluZyBmcm9tIHBpeGVsIGluZGV4IHZhbHVlcyB0byBtb2RpZmllciB2YWx1ZXMgZm9yCisgRVRDMSBjb21wcmVzc2VkIHRleHR1cmVzOgorCisgcGl4ZWwgaW5kZXggdmFsdWUKKyAtLS0tLS0tLS0tLS0tLS0KKyBtc2IgICAgIGxzYiAgICAgICAgICAgcmVzdWx0aW5nIG1vZGlmaWVyIHZhbHVlCisgLS0tLS0gICAtLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMSAgICAgICAxICAgICAgICAgICAgLWIgKGxhcmdlIG5lZ2F0aXZlIHZhbHVlKQorIDEgICAgICAgMCAgICAgICAgICAgIC1hIChzbWFsbCBuZWdhdGl2ZSB2YWx1ZSkKKyAwICAgICAgIDAgICAgICAgICAgICAgYSAoc21hbGwgcG9zaXRpdmUgdmFsdWUpCisgMCAgICAgICAxICAgICAgICAgICAgIGIgKGxhcmdlIHBvc2l0aXZlIHZhbHVlKQorCisgRVRDMiBjb2RlYzoKKyAgICAgZnJvbSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL3NwZWNzLzMuMC9lc19zcGVjXzMuMC40LnBkZgorICAgICBwYWdlIDI4OQorICovCisKK3N0YXRpYyBjb25zdCBpbnQga01vZGlmaWVyVGFibGVbXSA9IHsKKy8qIDAgKi8yLCA4LCAtMiwgLTgsCisvKiAxICovNSwgMTcsIC01LCAtMTcsCisvKiAyICovOSwgMjksIC05LCAtMjksCisvKiAzICovMTMsIDQyLCAtMTMsIC00MiwKKy8qIDQgKi8xOCwgNjAsIC0xOCwgLTYwLAorLyogNSAqLzI0LCA4MCwgLTI0LCAtODAsCisvKiA2ICovMzMsIDEwNiwgLTMzLCAtMTA2LAorLyogNyAqLzQ3LCAxODMsIC00NywgLTE4MyB9OworCitzdGF0aWMgY29uc3QgaW50IGtMb29rdXBbOF0gPSB7IDAsIDEsIDIsIDMsIC00LCAtMywgLTIsIC0xIH07CisKK3N0YXRpYyBpbmxpbmUgZXRjMV9ieXRlIGNsYW1wKGludCB4KSB7CisgICAgcmV0dXJuIChldGMxX2J5dGUpICh4ID49IDAgPyAoeCA8IDI1NSA/IHggOiAyNTUpIDogMCk7Cit9CisKK3N0YXRpYworaW5saW5lIGludCBjb252ZXJ0NFRvOChpbnQgYikgeworICAgIGludCBjID0gYiAmIDB4ZjsKKyAgICByZXR1cm4gKGMgPDwgNCkgfCBjOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgY29udmVydDVUbzgoaW50IGIpIHsKKyAgICBpbnQgYyA9IGIgJiAweDFmOworICAgIHJldHVybiAoYyA8PCAzKSB8IChjID4+IDIpOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgY29udmVydDZUbzgoaW50IGIpIHsKKyAgICBpbnQgYyA9IGIgJiAweDNmOworICAgIHJldHVybiAoYyA8PCAyKSB8IChjID4+IDQpOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgY29udmVydDdUbzgoaW50IGIpIHsKKyAgICBpbnQgYyA9IGIgJiAweDdmOworICAgIHJldHVybiAoYyA8PCAxKSB8IChjID4+IDYpOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgZGl2aWRlQnkyNTUoaW50IGQpIHsKKyAgICByZXR1cm4gKGQgKyAxMjggKyAoZCA+PiA4KSkgPj4gODsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnQ4VG80KGludCBiKSB7CisgICAgaW50IGMgPSBiICYgMHhmZjsKKyAgICByZXR1cm4gZGl2aWRlQnkyNTUoYyAqIDE1KTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnQ4VG81KGludCBiKSB7CisgICAgaW50IGMgPSBiICYgMHhmZjsKKyAgICByZXR1cm4gZGl2aWRlQnkyNTUoYyAqIDMxKTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnREaWZmKGludCBiYXNlLCBpbnQgZGlmZikgeworICAgIHJldHVybiBjb252ZXJ0NVRvOCgoMHgxZiAmIGJhc2UpICsga0xvb2t1cFsweDcgJiBkaWZmXSk7Cit9CitzdGF0aWMKK2ludCBpc092ZXJmbG93ZWQoaW50IGJhc2UsIGludCBkaWZmKSB7CisgICAgaW50IHZhbCA9ICgweDFmICYgYmFzZSkgKyBrTG9va3VwWzB4NyAmIGRpZmZdOworICAgIHJldHVybiB2YWwgPCAwIHx8IHZhbCA+PSAzMjsKK30KKworc3RhdGljCit2b2lkIGRlY29kZV9zdWJibG9jayhldGMxX2J5dGUqIHBPdXQsIGludCByLCBpbnQgZywgaW50IGIsIGNvbnN0IGludCogdGFibGUsCisgICAgICAgIGV0YzFfdWludDMyIGxvdywgYm9vbCBzZWNvbmQsIGJvb2wgZmxpcHBlZCkgeworICAgIGludCBiYXNlWCA9IDA7CisgICAgaW50IGJhc2VZID0gMDsKKyAgICBpZiAoc2Vjb25kKSB7CisgICAgICAgIGlmIChmbGlwcGVkKSB7CisgICAgICAgICAgICBiYXNlWSA9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiYXNlWCA9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIGlmIChmbGlwcGVkKSB7CisgICAgICAgICAgICB4ID0gYmFzZVggKyAoaSA+PiAxKTsKKyAgICAgICAgICAgIHkgPSBiYXNlWSArIChpICYgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ID0gYmFzZVggKyAoaSA+PiAyKTsKKyAgICAgICAgICAgIHkgPSBiYXNlWSArIChpICYgMyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGsgPSB5ICsgKHggKiA0KTsKKyAgICAgICAgaW50IG9mZnNldCA9ICgobG93ID4+IGspICYgMSkgfCAoKGxvdyA+PiAoayArIDE1KSkgJiAyKTsKKyAgICAgICAgaW50IGRlbHRhID0gdGFibGVbb2Zmc2V0XTsKKyAgICAgICAgZXRjMV9ieXRlKiBxID0gcE91dCArIDMgKiAoeCArIDQgKiB5KTsKKyAgICAgICAgKnErKyA9IGNsYW1wKHIgKyBkZWx0YSk7CisgICAgICAgICpxKysgPSBjbGFtcChnICsgZGVsdGEpOworICAgICAgICAqcSsrID0gY2xhbXAoYiArIGRlbHRhKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGV0YzJfVF9IX2luZGV4KGNvbnN0IGludCogY2xyVGFibGUsIGV0YzFfdWludDMyIGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGV0YzFfYnl0ZSogcSA9IHBPdXQ7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyspIHsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgICAgIGludCBrID0geSArIHggKiA0OworICAgICAgICAgICAgaW50IG9mZnNldCA9ICgobG93ID4+IGspICYgMSkgfCAoKGxvdyA+PiAoayArIDE1KSkgJiAyKTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgMzsgYysrKSB7CisgICAgICAgICAgICAgICAgKnErKyA9IGNsclRhYmxlW29mZnNldCozICsgY107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEVUQzIgY29kZWM6CisvLyAgICAgZnJvbSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL3NwZWNzLzMuMC9lc19zcGVjXzMuMC40LnBkZgorLy8gICAgIHBhZ2UgMjg5CisKK3N0YXRpYyB2b2lkIGV0YzJfZGVjb2RlX2Jsb2NrX1QoZXRjMV91aW50MzIgaGlnaCwgZXRjMV91aW50MzIgbG93LAorICAgICAgICBldGMxX2J5dGUqIHBPdXQpIHsKKyAgICBjb25zdCBpbnQgTFVUW10gPSB7MywgNiwgMTEsIDE2LCAyMywgMzIsIDQxLCA2NH07CisgICAgaW50IHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7CisgICAgcjEgPSBjb252ZXJ0NFRvOCgoKChoaWdoID4+IDI3KSAmIDMpIDw8IDIpIHwgKChoaWdoID4+IDI0KSAmIDMpKTsKKyAgICBnMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjApOworICAgIGIxID0gY29udmVydDRUbzgoaGlnaCA+PiAxNik7CisgICAgcjIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDEyKTsKKyAgICBnMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gOCk7CisgICAgYjIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDQpOworICAgIC8vIDMgYml0cyBpbnRlbnNlIG1vZGlmaWVyCisgICAgaW50IGludGVuc2VJZHggPSAoKChoaWdoID4+IDIpICYgMykgPDwgMSkgfCAoaGlnaCAmIDEpOworICAgIGludCBpbnRlbnNlTW9kID0gTFVUW2ludGVuc2VJZHhdOworICAgIGludCBjbHJUYWJsZVsxMl07CisgICAgY2xyVGFibGVbMF0gPSByMTsKKyAgICBjbHJUYWJsZVsxXSA9IGcxOworICAgIGNsclRhYmxlWzJdID0gYjE7CisgICAgY2xyVGFibGVbM10gPSBjbGFtcChyMiArIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzRdID0gY2xhbXAoZzIgKyBpbnRlbnNlTW9kKTsKKyAgICBjbHJUYWJsZVs1XSA9IGNsYW1wKGIyICsgaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbNl0gPSByMjsKKyAgICBjbHJUYWJsZVs3XSA9IGcyOworICAgIGNsclRhYmxlWzhdID0gYjI7CisgICAgY2xyVGFibGVbOV0gPSBjbGFtcChyMiAtIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzEwXSA9IGNsYW1wKGcyIC0gaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbMTFdID0gY2xhbXAoYjIgLSBpbnRlbnNlTW9kKTsKKyAgICBldGMyX1RfSF9pbmRleChjbHJUYWJsZSwgbG93LCBwT3V0KTsKK30KKworc3RhdGljIHZvaWQgZXRjMl9kZWNvZGVfYmxvY2tfSChldGMxX3VpbnQzMiBoaWdoLCBldGMxX3VpbnQzMiBsb3csCisgICAgICAgIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGNvbnN0IGludCBMVVRbXSA9IHszLCA2LCAxMSwgMTYsIDIzLCAzMiwgNDEsIDY0fTsKKyAgICBpbnQgcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKKyAgICByMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjcpOworICAgIGcxID0gY29udmVydDRUbzgoKGhpZ2ggPj4gMjQpIDw8IDEgfCAoKGhpZ2ggPj4gMjApICYgMSkpOworICAgIGIxID0gY29udmVydDRUbzgoKGhpZ2ggPj4gMTkpIDw8IDMgfCAoKGhpZ2ggPj4gMTUpICYgNykpOworICAgIHIyID0gY29udmVydDRUbzgoaGlnaCA+PiAxMSk7CisgICAgZzIgPSBjb252ZXJ0NFRvOChoaWdoID4+IDcpOworICAgIGIyID0gY29udmVydDRUbzgoaGlnaCA+PiAzKTsKKyAgICAvLyAzIGJpdHMgaW50ZW5zZSBtb2RpZmllcgorICAgIGludCBpbnRlbnNlSWR4ID0gaGlnaCAmIDQ7CisgICAgaW50ZW5zZUlkeCB8PSAoaGlnaCAmIDEpIDw8IDE7CisgICAgaW50ZW5zZUlkeCB8PSAoKChyMSA8PCAxNikgfCAoZzEgPDwgOCkgfCBiMSkgPj0gKChyMiA8PCAxNikgfCAoZzIgPDwgOCkgfCBiMikpOworICAgIGludCBpbnRlbnNlTW9kID0gTFVUW2ludGVuc2VJZHhdOworICAgIGludCBjbHJUYWJsZVsxMl07CisgICAgY2xyVGFibGVbMF0gPSBjbGFtcChyMSArIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzFdID0gY2xhbXAoZzEgKyBpbnRlbnNlTW9kKTsKKyAgICBjbHJUYWJsZVsyXSA9IGNsYW1wKGIxICsgaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbM10gPSBjbGFtcChyMSAtIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzRdID0gY2xhbXAoZzEgLSBpbnRlbnNlTW9kKTsKKyAgICBjbHJUYWJsZVs1XSA9IGNsYW1wKGIxIC0gaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbNl0gPSBjbGFtcChyMiArIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzddID0gY2xhbXAoZzIgKyBpbnRlbnNlTW9kKTsKKyAgICBjbHJUYWJsZVs4XSA9IGNsYW1wKGIyICsgaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbOV0gPSBjbGFtcChyMiAtIGludGVuc2VNb2QpOworICAgIGNsclRhYmxlWzEwXSA9IGNsYW1wKGcyIC0gaW50ZW5zZU1vZCk7CisgICAgY2xyVGFibGVbMTFdID0gY2xhbXAoYjIgLSBpbnRlbnNlTW9kKTsKKyAgICBldGMyX1RfSF9pbmRleChjbHJUYWJsZSwgbG93LCBwT3V0KTsKK30KKworc3RhdGljIHZvaWQgZXRjMl9kZWNvZGVfYmxvY2tfUChldGMxX3VpbnQzMiBoaWdoLCBldGMxX3VpbnQzMiBsb3csCisgICAgICAgIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGludCBybywgZ28sIGJvLCByaCwgZ2gsIGJoLCBydiwgZ3YsIGJ2OworICAgIHVpbnQ2NF90IGRhdGEgPSBoaWdoOworICAgIGRhdGEgPSBkYXRhIDw8IDMyIHwgbG93OworICAgIHJvID0gY29udmVydDZUbzgoZGF0YSA+PiA1Nyk7CisgICAgZ28gPSBjb252ZXJ0N1RvOCgoZGF0YSA+PiA1NiA8PCA2KSB8ICgoZGF0YSA+PiA0OSkgJiA2MykpOworICAgIGJvID0gY29udmVydDZUbzgoKGRhdGEgPj4gNDggPDwgNSkKKyAgICAgICAgICAgIHwgKCgoZGF0YSA+PiA0MykgJiAzICkgPDwgMykKKyAgICAgICAgICAgIHwgKChkYXRhID4+IDM5KSAmIDcpKTsKKyAgICByaCA9IGNvbnZlcnQ2VG84KChkYXRhID4+IDM0IDw8IDEpIHwgKChkYXRhID4+IDMyKSAmIDEpKTsKKyAgICBnaCA9IGNvbnZlcnQ3VG84KGRhdGEgPj4gMjUpOworICAgIGJoID0gY29udmVydDZUbzgoZGF0YSA+PiAxOSk7CisgICAgcnYgPSBjb252ZXJ0NlRvOChkYXRhID4+IDEzKTsKKyAgICBndiA9IGNvbnZlcnQ3VG84KGRhdGEgPj4gNik7CisgICAgYnYgPSBjb252ZXJ0NlRvOChkYXRhKTsKKyAgICBldGMxX2J5dGUqIHEgPSBwT3V0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpbnQgeSA9IGkgPj4gMjsKKyAgICAgICAgaW50IHggPSBpICYgMzsKKyAgICAgICAgKnErKyA9IGNsYW1wKCh4ICogKHJoIC0gcm8pICsgeSAqIChydiAtIHJvKSArIDQgKiBybyArIDIpID4+IDIpOworICAgICAgICAqcSsrID0gY2xhbXAoKHggKiAoZ2ggLSBnbykgKyB5ICogKGd2IC0gZ28pICsgNCAqIGdvICsgMikgPj4gMik7CisgICAgICAgICpxKysgPSBjbGFtcCgoeCAqIChiaCAtIGJvKSArIHkgKiAoYnYgLSBibykgKyA0ICogYm8gKyAyKSA+PiAyKTsKKyAgICB9Cit9CisKKy8vIElucHV0IGlzIGFuIEVUQzEgLyBFVEMyIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YS4KKy8vIE91dHB1dCBpcyBhIDQgeCA0IHNxdWFyZSBvZiAzLWJ5dGUgcGl4ZWxzIGluIGZvcm0gUiwgRywgQgorLy8gRVRDMiBjb2RlYzoKKy8vICAgICBmcm9tIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsZXMvc3BlY3MvMy4wL2VzX3NwZWNfMy4wLjQucGRmCisvLyAgICAgcGFnZSAyODkKKwordm9pZCBldGMyX2RlY29kZV9ibG9jayhjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV9ieXRlKiBwT3V0KSB7CisgICAgZXRjMV91aW50MzIgaGlnaCA9IChwSW5bMF0gPDwgMjQpIHwgKHBJblsxXSA8PCAxNikgfCAocEluWzJdIDw8IDgpIHwgcEluWzNdOworICAgIGV0YzFfdWludDMyIGxvdyA9IChwSW5bNF0gPDwgMjQpIHwgKHBJbls1XSA8PCAxNikgfCAocEluWzZdIDw8IDgpIHwgcEluWzddOworICAgIGludCByMSwgcjIsIGcxLCBnMiwgYjEsIGIyOworICAgIGlmIChoaWdoICYgMikgeworICAgICAgICAvLyBkaWZmZXJlbnRpYWwKKyAgICAgICAgaW50IHJCYXNlID0gaGlnaCA+PiAyNzsKKyAgICAgICAgaW50IGdCYXNlID0gaGlnaCA+PiAxOTsKKyAgICAgICAgaW50IGJCYXNlID0gaGlnaCA+PiAxMTsKKyAgICAgICAgaWYgKGlzT3ZlcmZsb3dlZChyQmFzZSwgaGlnaCA+PiAyNCkpIHsKKyAgICAgICAgICAgIGV0YzJfZGVjb2RlX2Jsb2NrX1QoaGlnaCwgbG93LCBwT3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNPdmVyZmxvd2VkKGdCYXNlLCBoaWdoID4+IDE2KSkgeworICAgICAgICAgICAgZXRjMl9kZWNvZGVfYmxvY2tfSChoaWdoLCBsb3csIHBPdXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChpc092ZXJmbG93ZWQoYkJhc2UsIGhpZ2ggPj4gOCkpIHsKKyAgICAgICAgICAgIGV0YzJfZGVjb2RlX2Jsb2NrX1AoaGlnaCwgbG93LCBwT3V0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByMSA9IGNvbnZlcnQ1VG84KHJCYXNlKTsKKyAgICAgICAgcjIgPSBjb252ZXJ0RGlmZihyQmFzZSwgaGlnaCA+PiAyNCk7CisgICAgICAgIGcxID0gY29udmVydDVUbzgoZ0Jhc2UpOworICAgICAgICBnMiA9IGNvbnZlcnREaWZmKGdCYXNlLCBoaWdoID4+IDE2KTsKKyAgICAgICAgYjEgPSBjb252ZXJ0NVRvOChiQmFzZSk7CisgICAgICAgIGIyID0gY29udmVydERpZmYoYkJhc2UsIGhpZ2ggPj4gOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm90IGRpZmZlcmVudGlhbAorICAgICAgICByMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjgpOworICAgICAgICByMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjQpOworICAgICAgICBnMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjApOworICAgICAgICBnMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMTYpOworICAgICAgICBiMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMTIpOworICAgICAgICBiMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gOCk7CisgICAgfQorICAgIGludCB0YWJsZUluZGV4QSA9IDcgJiAoaGlnaCA+PiA1KTsKKyAgICBpbnQgdGFibGVJbmRleEIgPSA3ICYgKGhpZ2ggPj4gMik7CisgICAgY29uc3QgaW50KiB0YWJsZUEgPSBrTW9kaWZpZXJUYWJsZSArIHRhYmxlSW5kZXhBICogNDsKKyAgICBjb25zdCBpbnQqIHRhYmxlQiA9IGtNb2RpZmllclRhYmxlICsgdGFibGVJbmRleEIgKiA0OworICAgIGJvb2wgZmxpcHBlZCA9IChoaWdoICYgMSkgIT0gMDsKKyAgICBkZWNvZGVfc3ViYmxvY2socE91dCwgcjEsIGcxLCBiMSwgdGFibGVBLCBsb3csIGZhbHNlLCBmbGlwcGVkKTsKKyAgICBkZWNvZGVfc3ViYmxvY2socE91dCwgcjIsIGcyLCBiMiwgdGFibGVCLCBsb3csIHRydWUsIGZsaXBwZWQpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZXRjMV91aW50MzIgaGlnaDsKKyAgICBldGMxX3VpbnQzMiBsb3c7CisgICAgZXRjMV91aW50MzIgc2NvcmU7IC8vIExvd2VyIGlzIG1vcmUgYWNjdXJhdGUKK30gZXRjX2NvbXByZXNzZWQ7CisKK3N0YXRpYworaW5saW5lIHZvaWQgdGFrZV9iZXN0KGV0Y19jb21wcmVzc2VkKiBhLCBjb25zdCBldGNfY29tcHJlc3NlZCogYikgeworICAgIGlmIChhLT5zY29yZSA+IGItPnNjb3JlKSB7CisgICAgICAgICphID0gKmI7CisgICAgfQorfQorCitzdGF0aWMKK3ZvaWQgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGV0YzFfYnl0ZSogcENvbG9ycywgYm9vbCBmbGlwcGVkLCBib29sIHNlY29uZCkgeworICAgIGludCByID0gMDsKKyAgICBpbnQgZyA9IDA7CisgICAgaW50IGIgPSAwOworCisgICAgaWYgKGZsaXBwZWQpIHsKKyAgICAgICAgaW50IGJ5ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnkgPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgICAgICBpbnQgeXkgPSBieSArIHk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBpID0geCArIDQgKiB5eTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwID0gcEluICsgaSAqIDM7CisgICAgICAgICAgICAgICAgICAgIHIgKz0gKihwKyspOworICAgICAgICAgICAgICAgICAgICBnICs9ICoocCsrKTsKKyAgICAgICAgICAgICAgICAgICAgYiArPSAqKHArKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ4ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnggPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgIGludCB4eCA9IGJ4ICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHh4ICsgNCAqIHk7CisgICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcCA9IHBJbiArIGkgKiAzOworICAgICAgICAgICAgICAgICAgICByICs9ICoocCsrKTsKKyAgICAgICAgICAgICAgICAgICAgZyArPSAqKHArKyk7CisgICAgICAgICAgICAgICAgICAgIGIgKz0gKihwKyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwQ29sb3JzWzBdID0gKGV0YzFfYnl0ZSkoKHIgKyA0KSA+PiAzKTsKKyAgICBwQ29sb3JzWzFdID0gKGV0YzFfYnl0ZSkoKGcgKyA0KSA+PiAzKTsKKyAgICBwQ29sb3JzWzJdID0gKGV0YzFfYnl0ZSkoKGIgKyA0KSA+PiAzKTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IHNxdWFyZShpbnQgeCkgeworICAgIHJldHVybiB4ICogeDsKK30KKworc3RhdGljIGV0YzFfdWludDMyIGNob29zZU1vZGlmaWVyKGNvbnN0IGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiAqcExvdywgaW50IGJpdEluZGV4LAorICAgICAgICBjb25zdCBpbnQqIHBNb2RpZmllclRhYmxlKSB7CisgICAgZXRjMV91aW50MzIgYmVzdFNjb3JlID0gfjA7CisgICAgaW50IGJlc3RJbmRleCA9IDA7CisgICAgaW50IHBpeGVsUiA9IHBJblswXTsKKyAgICBpbnQgcGl4ZWxHID0gcEluWzFdOworICAgIGludCBwaXhlbEIgPSBwSW5bMl07CisgICAgaW50IHIgPSBwQmFzZUNvbG9yc1swXTsKKyAgICBpbnQgZyA9IHBCYXNlQ29sb3JzWzFdOworICAgIGludCBiID0gcEJhc2VDb2xvcnNbMl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IG1vZGlmaWVyID0gcE1vZGlmaWVyVGFibGVbaV07CisgICAgICAgIGludCBkZWNvZGVkRyA9IGNsYW1wKGcgKyBtb2RpZmllcik7CisgICAgICAgIGV0YzFfdWludDMyIHNjb3JlID0gKGV0YzFfdWludDMyKSAoNiAqIHNxdWFyZShkZWNvZGVkRyAtIHBpeGVsRykpOworICAgICAgICBpZiAoc2NvcmUgPj0gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGVjb2RlZFIgPSBjbGFtcChyICsgbW9kaWZpZXIpOworICAgICAgICBzY29yZSArPSAoZXRjMV91aW50MzIpICgzICogc3F1YXJlKGRlY29kZWRSIC0gcGl4ZWxSKSk7CisgICAgICAgIGlmIChzY29yZSA+PSBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBkZWNvZGVkQiA9IGNsYW1wKGIgKyBtb2RpZmllcik7CisgICAgICAgIHNjb3JlICs9IChldGMxX3VpbnQzMikgc3F1YXJlKGRlY29kZWRCIC0gcGl4ZWxCKTsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIGJlc3RJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXRjMV91aW50MzIgbG93TWFzayA9ICgoKGJlc3RJbmRleCA+PiAxKSA8PCAxNikgfCAoYmVzdEluZGV4ICYgMSkpCisgICAgICAgICAgICA8PCBiaXRJbmRleDsKKyAgICAqcExvdyB8PSBsb3dNYXNrOworICAgIHJldHVybiBiZXN0U2NvcmU7Cit9CisKK3N0YXRpYwordm9pZCBldGNfZW5jb2RlX3N1YmJsb2NrX2hlbHBlcihjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgaW5NYXNrLAorICAgICAgICBldGNfY29tcHJlc3NlZCogcENvbXByZXNzZWQsIGJvb2wgZmxpcHBlZCwgYm9vbCBzZWNvbmQsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsIGNvbnN0IGludCogcE1vZGlmaWVyVGFibGUpIHsKKyAgICBpbnQgc2NvcmUgPSBwQ29tcHJlc3NlZC0+c2NvcmU7CisgICAgaWYgKGZsaXBwZWQpIHsKKyAgICAgICAgaW50IGJ5ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnkgPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgICAgICBpbnQgeXkgPSBieSArIHk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBpID0geCArIDQgKiB5eTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gY2hvb3NlTW9kaWZpZXIocEJhc2VDb2xvcnMsIHBJbiArIGkgKiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tcHJlc3NlZC0+bG93LCB5eSArIHggKiA0LCBwTW9kaWZpZXJUYWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ4ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnggPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgIGludCB4eCA9IGJ4ICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHh4ICsgNCAqIHk7CisgICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IGNob29zZU1vZGlmaWVyKHBCYXNlQ29sb3JzLCBwSW4gKyBpICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbXByZXNzZWQtPmxvdywgeSArIHh4ICogNCwgcE1vZGlmaWVyVGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwQ29tcHJlc3NlZC0+c2NvcmUgPSBzY29yZTsKK30KKworc3RhdGljIGJvb2wgaW5SYW5nZTRiaXRTaWduZWQoaW50IGNvbG9yKSB7CisgICAgcmV0dXJuIGNvbG9yID49IC00ICYmIGNvbG9yIDw9IDM7Cit9CisKK3N0YXRpYyB2b2lkIGV0Y19lbmNvZGVCYXNlQ29sb3JzKGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcENvbG9ycywgZXRjX2NvbXByZXNzZWQqIHBDb21wcmVzc2VkKSB7CisgICAgaW50IHIxLCBnMSwgYjEsIHIyLCBnMiwgYjI7IC8vIDggYml0IGJhc2UgY29sb3JzIGZvciBzdWItYmxvY2tzCisgICAgYm9vbCBkaWZmZXJlbnRpYWw7CisgICAgeworICAgICAgICBpbnQgcjUxID0gY29udmVydDhUbzUocENvbG9yc1swXSk7CisgICAgICAgIGludCBnNTEgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzFdKTsKKyAgICAgICAgaW50IGI1MSA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbMl0pOworICAgICAgICBpbnQgcjUyID0gY29udmVydDhUbzUocENvbG9yc1szXSk7CisgICAgICAgIGludCBnNTIgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzRdKTsKKyAgICAgICAgaW50IGI1MiA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbNV0pOworCisgICAgICAgIHIxID0gY29udmVydDVUbzgocjUxKTsKKyAgICAgICAgZzEgPSBjb252ZXJ0NVRvOChnNTEpOworICAgICAgICBiMSA9IGNvbnZlcnQ1VG84KGI1MSk7CisKKyAgICAgICAgaW50IGRyID0gcjUyIC0gcjUxOworICAgICAgICBpbnQgZGcgPSBnNTIgLSBnNTE7CisgICAgICAgIGludCBkYiA9IGI1MiAtIGI1MTsKKworICAgICAgICBkaWZmZXJlbnRpYWwgPSBpblJhbmdlNGJpdFNpZ25lZChkcikgJiYgaW5SYW5nZTRiaXRTaWduZWQoZGcpCisgICAgICAgICAgICAgICAgJiYgaW5SYW5nZTRiaXRTaWduZWQoZGIpOworICAgICAgICBpZiAoZGlmZmVyZW50aWFsKSB7CisgICAgICAgICAgICByMiA9IGNvbnZlcnQ1VG84KHI1MSArIGRyKTsKKyAgICAgICAgICAgIGcyID0gY29udmVydDVUbzgoZzUxICsgZGcpOworICAgICAgICAgICAgYjIgPSBjb252ZXJ0NVRvOChiNTEgKyBkYik7CisgICAgICAgICAgICBwQ29tcHJlc3NlZC0+aGlnaCB8PSAocjUxIDw8IDI3KSB8ICgoNyAmIGRyKSA8PCAyNCkgfCAoZzUxIDw8IDE5KQorICAgICAgICAgICAgICAgICAgICB8ICgoNyAmIGRnKSA8PCAxNikgfCAoYjUxIDw8IDExKSB8ICgoNyAmIGRiKSA8PCA4KSB8IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRpZmZlcmVudGlhbCkgeworICAgICAgICBpbnQgcjQxID0gY29udmVydDhUbzQocENvbG9yc1swXSk7CisgICAgICAgIGludCBnNDEgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzFdKTsKKyAgICAgICAgaW50IGI0MSA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbMl0pOworICAgICAgICBpbnQgcjQyID0gY29udmVydDhUbzQocENvbG9yc1szXSk7CisgICAgICAgIGludCBnNDIgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzRdKTsKKyAgICAgICAgaW50IGI0MiA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbNV0pOworICAgICAgICByMSA9IGNvbnZlcnQ0VG84KHI0MSk7CisgICAgICAgIGcxID0gY29udmVydDRUbzgoZzQxKTsKKyAgICAgICAgYjEgPSBjb252ZXJ0NFRvOChiNDEpOworICAgICAgICByMiA9IGNvbnZlcnQ0VG84KHI0Mik7CisgICAgICAgIGcyID0gY29udmVydDRUbzgoZzQyKTsKKyAgICAgICAgYjIgPSBjb252ZXJ0NFRvOChiNDIpOworICAgICAgICBwQ29tcHJlc3NlZC0+aGlnaCB8PSAocjQxIDw8IDI4KSB8IChyNDIgPDwgMjQpIHwgKGc0MSA8PCAyMCkgfCAoZzQyCisgICAgICAgICAgICAgICAgPDwgMTYpIHwgKGI0MSA8PCAxMikgfCAoYjQyIDw8IDgpOworICAgIH0KKyAgICBwQmFzZUNvbG9yc1swXSA9IHIxOworICAgIHBCYXNlQ29sb3JzWzFdID0gZzE7CisgICAgcEJhc2VDb2xvcnNbMl0gPSBiMTsKKyAgICBwQmFzZUNvbG9yc1szXSA9IHIyOworICAgIHBCYXNlQ29sb3JzWzRdID0gZzI7CisgICAgcEJhc2VDb2xvcnNbNV0gPSBiMjsKK30KKworc3RhdGljCit2b2lkIGV0Y19lbmNvZGVfYmxvY2tfaGVscGVyKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcENvbG9ycywgZXRjX2NvbXByZXNzZWQqIHBDb21wcmVzc2VkLCBib29sIGZsaXBwZWQpIHsKKyAgICBwQ29tcHJlc3NlZC0+c2NvcmUgPSB+MDsKKyAgICBwQ29tcHJlc3NlZC0+aGlnaCA9IChmbGlwcGVkID8gMSA6IDApOworICAgIHBDb21wcmVzc2VkLT5sb3cgPSAwOworCisgICAgZXRjMV9ieXRlIHBCYXNlQ29sb3JzWzZdOworCisgICAgZXRjX2VuY29kZUJhc2VDb2xvcnMocEJhc2VDb2xvcnMsIHBDb2xvcnMsIHBDb21wcmVzc2VkKTsKKworICAgIGludCBvcmlnaW5hbEhpZ2ggPSBwQ29tcHJlc3NlZC0+aGlnaDsKKworICAgIGNvbnN0IGludCogcE1vZGlmaWVyVGFibGUgPSBrTW9kaWZpZXJUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKywgcE1vZGlmaWVyVGFibGUgKz0gNCkgeworICAgICAgICBldGNfY29tcHJlc3NlZCB0ZW1wOworICAgICAgICB0ZW1wLnNjb3JlID0gMDsKKyAgICAgICAgdGVtcC5oaWdoID0gb3JpZ2luYWxIaWdoIHwgKGkgPDwgNSk7CisgICAgICAgIHRlbXAubG93ID0gMDsKKyAgICAgICAgZXRjX2VuY29kZV9zdWJibG9ja19oZWxwZXIocEluLCBpbk1hc2ssICZ0ZW1wLCBmbGlwcGVkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBwQmFzZUNvbG9ycywgcE1vZGlmaWVyVGFibGUpOworICAgICAgICB0YWtlX2Jlc3QocENvbXByZXNzZWQsICZ0ZW1wKTsKKyAgICB9CisgICAgcE1vZGlmaWVyVGFibGUgPSBrTW9kaWZpZXJUYWJsZTsKKyAgICBldGNfY29tcHJlc3NlZCBmaXJzdEhhbGYgPSAqcENvbXByZXNzZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyssIHBNb2RpZmllclRhYmxlICs9IDQpIHsKKyAgICAgICAgZXRjX2NvbXByZXNzZWQgdGVtcDsKKyAgICAgICAgdGVtcC5zY29yZSA9IGZpcnN0SGFsZi5zY29yZTsKKyAgICAgICAgdGVtcC5oaWdoID0gZmlyc3RIYWxmLmhpZ2ggfCAoaSA8PCAyKTsKKyAgICAgICAgdGVtcC5sb3cgPSBmaXJzdEhhbGYubG93OworICAgICAgICBldGNfZW5jb2RlX3N1YmJsb2NrX2hlbHBlcihwSW4sIGluTWFzaywgJnRlbXAsIGZsaXBwZWQsIHRydWUsCisgICAgICAgICAgICAgICAgcEJhc2VDb2xvcnMgKyAzLCBwTW9kaWZpZXJUYWJsZSk7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICpwQ29tcHJlc3NlZCA9IHRlbXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWtlX2Jlc3QocENvbXByZXNzZWQsICZ0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVCaWdFbmRpYW4oZXRjMV9ieXRlKiBwT3V0LCBldGMxX3VpbnQzMiBkKSB7CisgICAgcE91dFswXSA9IChldGMxX2J5dGUpKGQgPj4gMjQpOworICAgIHBPdXRbMV0gPSAoZXRjMV9ieXRlKShkID4+IDE2KTsKKyAgICBwT3V0WzJdID0gKGV0YzFfYnl0ZSkoZCA+PiA4KTsKKyAgICBwT3V0WzNdID0gKGV0YzFfYnl0ZSkgZDsKK30KKworLy8gSW5wdXQgaXMgYSA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIKKy8vIGlubWFzayBpcyBhIDE2LWJpdCBtYXNrIHdoZXJlIGJpdCAoMSA8PCAoeCArIHkgKiA0KSkgdGVsbHMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyAoeCx5KQorLy8gcGl4ZWwgaXMgdmFsaWQgb3Igbm90LiBJbnZhbGlkIHBpeGVsIGNvbG9yIHZhbHVlcyBhcmUgaWdub3JlZCB3aGVuIGNvbXByZXNzaW5nLgorLy8gT3V0cHV0IGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgorCit2b2lkIGV0YzFfZW5jb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGV0YzFfYnl0ZSBjb2xvcnNbNl07CisgICAgZXRjMV9ieXRlIGZsaXBwZWRDb2xvcnNbNl07CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBjb2xvcnMsIGZhbHNlLCBmYWxzZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBjb2xvcnMgKyAzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBmbGlwcGVkQ29sb3JzLCB0cnVlLCBmYWxzZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBmbGlwcGVkQ29sb3JzICsgMywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBldGNfY29tcHJlc3NlZCBhLCBiOworICAgIGV0Y19lbmNvZGVfYmxvY2tfaGVscGVyKHBJbiwgaW5NYXNrLCBjb2xvcnMsICZhLCBmYWxzZSk7CisgICAgZXRjX2VuY29kZV9ibG9ja19oZWxwZXIocEluLCBpbk1hc2ssIGZsaXBwZWRDb2xvcnMsICZiLCB0cnVlKTsKKyAgICB0YWtlX2Jlc3QoJmEsICZiKTsKKyAgICB3cml0ZUJpZ0VuZGlhbihwT3V0LCBhLmhpZ2gpOworICAgIHdyaXRlQmlnRW5kaWFuKHBPdXQgKyA0LCBhLmxvdyk7Cit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCBpbWFnZSBkYXRhIChkb2VzIG5vdCBpbmNsdWRlIHNpemUgb2YgUEtNIGhlYWRlcikuCisKK2V0YzFfdWludDMyIGV0YzFfZ2V0X2VuY29kZWRfZGF0YV9zaXplKGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpIHsKKyAgICByZXR1cm4gKCgod2lkdGggKyAzKSAmIH4zKSAqICgoaGVpZ2h0ICsgMykgJiB+MykpID4+IDE7Cit9CisKKy8vIEVuY29kZSBhbiBlbnRpcmUgaW1hZ2UuCisvLyBwSW4gLSBwb2ludGVyIHRvIHRoZSBpbWFnZSBkYXRhLiBGb3JtYXR0ZWQgc3VjaCB0aGF0IHRoZSBSZWQgY29tcG9uZW50IG9mCisvLyAgICAgICBwaXhlbCAoeCx5KSBpcyBhdCBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogeSArIHJlZE9mZnNldDsKKy8vIHBPdXQgLSBwb2ludGVyIHRvIGVuY29kZWQgZGF0YS4gTXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgZW50aXJlIGVuY29kZWQgaW1hZ2UuCisKK2ludCBldGMxX2VuY29kZV9pbWFnZShjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKKyAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUsIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGlmIChwaXhlbFNpemUgPCAyIHx8IHBpeGVsU2l6ZSA+IDMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQga1lNYXNrW10gPSB7IDB4MCwgMHhmLCAweGZmLCAweGZmZiwgMHhmZmZmIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGtYTWFza1tdID0geyAweDAsIDB4MTExMSwgMHgzMzMzLCAweDc3NzcsCisgICAgICAgICAgICAweGZmZmYgfTsKKyAgICBldGMxX2J5dGUgYmxvY2tbRVRDMV9ERUNPREVEX0JMT0NLX1NJWkVdOworICAgIGV0YzFfYnl0ZSBlbmNvZGVkW0VUQzFfRU5DT0RFRF9CTE9DS19TSVpFXTsKKworICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9ICh3aWR0aCArIDMpICYgfjM7CisgICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4zOworCisgICAgZm9yIChldGMxX3VpbnQzMiB5ID0gMDsgeSA8IGVuY29kZWRIZWlnaHQ7IHkgKz0gNCkgeworICAgICAgICBldGMxX3VpbnQzMiB5RW5kID0gaGVpZ2h0IC0geTsKKyAgICAgICAgaWYgKHlFbmQgPiA0KSB7CisgICAgICAgICAgICB5RW5kID0gNDsKKyAgICAgICAgfQorICAgICAgICBpbnQgeW1hc2sgPSBrWU1hc2tbeUVuZF07CisgICAgICAgIGZvciAoZXRjMV91aW50MzIgeCA9IDA7IHggPCBlbmNvZGVkV2lkdGg7IHggKz0gNCkgeworICAgICAgICAgICAgZXRjMV91aW50MzIgeEVuZCA9IHdpZHRoIC0geDsKKyAgICAgICAgICAgIGlmICh4RW5kID4gNCkgeworICAgICAgICAgICAgICAgIHhFbmQgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1hc2sgPSB5bWFzayAmIGtYTWFza1t4RW5kXTsKKyAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3kgPSAwOyBjeSA8IHlFbmQ7IGN5KyspIHsKKyAgICAgICAgICAgICAgICBldGMxX2J5dGUqIHEgPSBibG9jayArIChjeSAqIDQpICogMzsKKyAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHAgPSBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogKHkgKyBjeSk7CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsU2l6ZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBwLCB4RW5kICogMyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChldGMxX3VpbnQzMiBjeCA9IDA7IGN4IDwgeEVuZDsgY3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsID0gKHBbMV0gPDwgOCkgfCBwWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbnZlcnQ1VG84KHBpeGVsID4+IDExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb252ZXJ0NlRvOChwaXhlbCA+PiA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb252ZXJ0NVRvOChwaXhlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHBpeGVsU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV0YzFfZW5jb2RlX2Jsb2NrKGJsb2NrLCBtYXNrLCBlbmNvZGVkKTsKKyAgICAgICAgICAgIG1lbWNweShwT3V0LCBlbmNvZGVkLCBzaXplb2YoZW5jb2RlZCkpOworICAgICAgICAgICAgcE91dCArPSBzaXplb2YoZW5jb2RlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIERlY29kZSBhbiBlbnRpcmUgaW1hZ2UuCisvLyBwSW4gLSBwb2ludGVyIHRvIGVuY29kZWQgZGF0YS4KKy8vIHBPdXQgLSBwb2ludGVyIHRvIHRoZSBpbWFnZSBkYXRhLiBXaWxsIGJlIHdyaXR0ZW4gc3VjaCB0aGF0IHRoZSBSZWQgY29tcG9uZW50IG9mCisvLyAgICAgICBwaXhlbCAoeCx5KSBpcyBhdCBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogeSArIHJlZE9mZnNldC4gTXVzdCBiZQorLy8gICAgICAgIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgaW1hZ2UuCisKKworaW50IGV0YzJfZGVjb2RlX2ltYWdlKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQsCisgICAgICAgIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCisgICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlKSB7CisgICAgaWYgKHBpeGVsU2l6ZSA8IDIgfHwgcGl4ZWxTaXplID4gMykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0YzFfYnl0ZSBibG9ja1tFVEMxX0RFQ09ERURfQkxPQ0tfU0laRV07CisKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSAod2lkdGggKyAzKSAmIH4zOworICAgIGV0YzFfdWludDMyIGVuY29kZWRIZWlnaHQgPSAoaGVpZ2h0ICsgMykgJiB+MzsKKworICAgIGZvciAoZXRjMV91aW50MzIgeSA9IDA7IHkgPCBlbmNvZGVkSGVpZ2h0OyB5ICs9IDQpIHsKKyAgICAgICAgZXRjMV91aW50MzIgeUVuZCA9IGhlaWdodCAtIHk7CisgICAgICAgIGlmICh5RW5kID4gNCkgeworICAgICAgICAgICAgeUVuZCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChldGMxX3VpbnQzMiB4ID0gMDsgeCA8IGVuY29kZWRXaWR0aDsgeCArPSA0KSB7CisgICAgICAgICAgICBldGMxX3VpbnQzMiB4RW5kID0gd2lkdGggLSB4OworICAgICAgICAgICAgaWYgKHhFbmQgPiA0KSB7CisgICAgICAgICAgICAgICAgeEVuZCA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldGMyX2RlY29kZV9ibG9jayhwSW4sIGJsb2NrKTsKKyAgICAgICAgICAgIHBJbiArPSBFVEMxX0VOQ09ERURfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3kgPSAwOyBjeSA8IHlFbmQ7IGN5KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHEgPSBibG9jayArIChjeSAqIDQpICogMzsKKyAgICAgICAgICAgICAgICBldGMxX2J5dGUqIHAgPSBwT3V0ICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqICh5ICsgY3kpOworICAgICAgICAgICAgICAgIGlmIChwaXhlbFNpemUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocCwgcSwgeEVuZCAqIDMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3ggPSAwOyBjeCA8IHhFbmQ7IGN4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSByID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSBnID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSBiID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfdWludDMyIHBpeGVsID0gKChyID4+IDMpIDw8IDExKSB8ICgoZyA+PiAyKSA8PCA1KSB8IChiID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IChldGMxX2J5dGUpIHBpeGVsOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IChldGMxX2J5dGUpIChwaXhlbCA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIga01hZ2ljW10gPSB7ICdQJywgJ0snLCAnTScsICcgJywgJzEnLCAnMCcgfTsKKworc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0ZPUk1BVF9PRkZTRVQgPSA2Oworc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VUID0gODsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9FTkNPREVEX0hFSUdIVF9PRkZTRVQgPSAxMDsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9XSURUSF9PRkZTRVQgPSAxMjsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9IRUlHSFRfT0ZGU0VUID0gMTQ7CisKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1JHQl9OT19NSVBNQVBTID0gMDsKKworc3RhdGljIHZvaWQgd3JpdGVCRVVpbnQxNihldGMxX2J5dGUqIHBPdXQsIGV0YzFfdWludDMyIGRhdGEpIHsKKyAgICBwT3V0WzBdID0gKGV0YzFfYnl0ZSkgKGRhdGEgPj4gOCk7CisgICAgcE91dFsxXSA9IChldGMxX2J5dGUpIGRhdGE7Cit9CisKK3N0YXRpYyBldGMxX3VpbnQzMiByZWFkQkVVaW50MTYoY29uc3QgZXRjMV9ieXRlKiBwSW4pIHsKKyAgICByZXR1cm4gKHBJblswXSA8PCA4KSB8IHBJblsxXTsKK30KKworLy8gRm9ybWF0IGEgUEtNIGhlYWRlcgorCit2b2lkIGV0YzFfcGttX2Zvcm1hdF9oZWFkZXIoZXRjMV9ieXRlKiBwSGVhZGVyLCBldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KSB7CisgICAgbWVtY3B5KHBIZWFkZXIsIGtNYWdpYywgc2l6ZW9mKGtNYWdpYykpOworICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9ICh3aWR0aCArIDMpICYgfjM7CisgICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4zOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0ZPUk1BVF9PRkZTRVQsIEVUQzFfUkdCX05PX01JUE1BUFMpOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VULCBlbmNvZGVkV2lkdGgpOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfSEVJR0hUX09GRlNFVCwgZW5jb2RlZEhlaWdodCk7CisgICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fV0lEVEhfT0ZGU0VULCB3aWR0aCk7CisgICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCwgaGVpZ2h0KTsKK30KKworLy8gQ2hlY2sgaWYgYSBQS00gaGVhZGVyIGlzIGNvcnJlY3RseSBmb3JtYXR0ZWQuCisKK2V0YzFfYm9vbCBldGMxX3BrbV9pc192YWxpZChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpIHsKKyAgICBpZiAobWVtY21wKHBIZWFkZXIsIGtNYWdpYywgc2l6ZW9mKGtNYWdpYykpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXRjMV91aW50MzIgZm9ybWF0ID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9GT1JNQVRfT0ZGU0VUKTsKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VUKTsKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkSGVpZ2h0ID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9FTkNPREVEX0hFSUdIVF9PRkZTRVQpOworICAgIGV0YzFfdWludDMyIHdpZHRoID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9XSURUSF9PRkZTRVQpOworICAgIGV0YzFfdWludDMyIGhlaWdodCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCk7CisgICAgcmV0dXJuIGZvcm1hdCA9PSBFVEMxX1JHQl9OT19NSVBNQVBTICYmCisgICAgICAgICAgICBlbmNvZGVkV2lkdGggPj0gd2lkdGggJiYgZW5jb2RlZFdpZHRoIC0gd2lkdGggPCA0ICYmCisgICAgICAgICAgICBlbmNvZGVkSGVpZ2h0ID49IGhlaWdodCAmJiBlbmNvZGVkSGVpZ2h0IC0gaGVpZ2h0IDwgNDsKK30KKworLy8gUmVhZCB0aGUgaW1hZ2Ugd2lkdGggZnJvbSBhIFBLTSBoZWFkZXIKKworZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X3dpZHRoKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcikgeworICAgIHJldHVybiByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX1dJRFRIX09GRlNFVCk7Cit9CisKKy8vIFJlYWQgdGhlIGltYWdlIGhlaWdodCBmcm9tIGEgUEtNIGhlYWRlcgorCitldGMxX3VpbnQzMiBldGMxX3BrbV9nZXRfaGVpZ2h0KGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcil7CisgICAgcmV0dXJuIHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvR0xjb21tb24vb2JqZWN0TmFtZU1hbmFnZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL29iamVjdE5hbWVNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2VmOTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL0dMY29tbW9uL29iamVjdE5hbWVNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDMwMyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlIDxHTGNvbW1vbi9vYmplY3ROYW1lTWFuYWdlci5oPgorI2luY2x1ZGUgPEdMY29tbW9uL09iamVjdE5hbWVTcGFjZS5oPgorI2luY2x1ZGUgPEdMY29tbW9uL0dMRVNjb250ZXh0Lmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvbWVtb3J5L0xhenlJbnN0YW5jZS5oIgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworc3RhdGljIGNvbnN0ZXhwciBpbnQgdG9JbmRleChOYW1lZE9iamVjdFR5cGUgdHlwZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHR5cGUpOworfQorCit1c2luZyBPYmplY3REYXRhTWFwID0KKyAgICBzdGQ6OmFycmF5PHN0ZDo6dW5vcmRlcmVkX21hcDxPYmplY3RMb2NhbE5hbWUsIE9iamVjdERhdGFQdHI+LAorICAgICAgICAgICAgICAgdG9JbmRleChOYW1lZE9iamVjdFR5cGU6Ok5VTV9PQkpFQ1RfVFlQRVMpPjsKKworU2hhcmVHcm91cDo6U2hhcmVHcm91cChHbG9iYWxOYW1lU3BhY2UgKmdsb2JhbE5hbWVTcGFjZSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9JbmRleChOYW1lZE9iamVjdFR5cGU6Ok5VTV9PQkpFQ1RfVFlQRVMpOworICAgICAgICAgaSsrKSB7CisgICAgICAgIG1fbmFtZVNwYWNlW2ldID0KKyAgICAgICAgICAgICAgICBuZXcgTmFtZVNwYWNlKHN0YXRpY19jYXN0PE5hbWVkT2JqZWN0VHlwZT4oaSksIGdsb2JhbE5hbWVTcGFjZSk7CisgICAgfQorfQorCit2b2lkIFNoYXJlR3JvdXA6OmxvY2tPYmplY3REYXRhKCkgeworICAgIHdoaWxlIChtX29iamVjdHNEYXRhTG9jay50ZXN0X2FuZF9zZXQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSkpIHsKKyAgICAgICAgOworICAgIH0KK30KKwordm9pZCBTaGFyZUdyb3VwOjp1bmxvY2tPYmplY3REYXRhKCkgeworICAgIG1fb2JqZWN0c0RhdGFMb2NrLmNsZWFyKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworfQorCitzdHJ1Y3QgU2hhcmVHcm91cDo6T2JqZWN0RGF0YUF1dG9Mb2NrIHsKKyAgICBPYmplY3REYXRhQXV0b0xvY2soU2hhcmVHcm91cCogc2VsZikgOiBzZWxmKHNlbGYpIHsKKyAgICAgICAgc2VsZi0+bG9ja09iamVjdERhdGEoKTsKKyAgICB9CisgICAgfk9iamVjdERhdGFBdXRvTG9jaygpIHsKKyAgICAgICAgc2VsZi0+dW5sb2NrT2JqZWN0RGF0YSgpOworICAgIH0KKworICAgIFNoYXJlR3JvdXAqIHNlbGY7Cit9OworCisKK1NoYXJlR3JvdXA6On5TaGFyZUdyb3VwKCkKK3sKKyAgICB7CisgICAgICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX25hbWVzcGFjZUxvY2spOworICAgICAgICBmb3IgKGF1dG8gbiA6IG1fbmFtZVNwYWNlKSB7CisgICAgICAgICAgICBkZWxldGUgbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgT2JqZWN0RGF0YUF1dG9Mb2NrIGxvY2sodGhpcyk7CisgICAgICAgIGRlbGV0ZSAoT2JqZWN0RGF0YU1hcCAqKW1fb2JqZWN0c0RhdGE7CisgICAgfQorfQorCitPYmplY3RMb2NhbE5hbWUKK1NoYXJlR3JvdXA6Omdlbk5hbWUoR2VuTmFtZUluZm8gZ2VuTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5Mb2NhbCkKK3sKKyAgICBpZiAodG9JbmRleChnZW5OYW1lSW5mby5tX3R5cGUpID49CisgICAgICAgIHRvSW5kZXgoTmFtZWRPYmplY3RUeXBlOjpOVU1fT0JKRUNUX1RZUEVTKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICBPYmplY3RMb2NhbE5hbWUgbG9jYWxOYW1lID0KKyAgICAgICAgICAgIG1fbmFtZVNwYWNlW3RvSW5kZXgoZ2VuTmFtZUluZm8ubV90eXBlKV0tPmdlbk5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuTmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9sb2NhbE5hbWUsIGdlbkxvY2FsKTsKKyAgICByZXR1cm4gbG9jYWxOYW1lOworfQorCitPYmplY3RMb2NhbE5hbWUgU2hhcmVHcm91cDo6Z2VuTmFtZShOYW1lZE9iamVjdFR5cGUgbmFtZWRPYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5Mb2NhbCkgeworICAgIHJldHVybiBnZW5OYW1lKEdlbk5hbWVJbmZvKG5hbWVkT2JqZWN0VHlwZSksIHBfbG9jYWxOYW1lLCBnZW5Mb2NhbCk7Cit9CisKK09iamVjdExvY2FsTmFtZSBTaGFyZUdyb3VwOjpnZW5OYW1lKFNoYWRlclByb2dyYW1UeXBlIHNoYWRlclByb2dyYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5Mb2NhbCkgeworICAgIHJldHVybiBnZW5OYW1lKEdlbk5hbWVJbmZvKHNoYWRlclByb2dyYW1UeXBlKSwgcF9sb2NhbE5hbWUsIGdlbkxvY2FsKTsKK30KKwordW5zaWduZWQgaW50CitTaGFyZUdyb3VwOjpnZXRHbG9iYWxOYW1lKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSkKK3sKKyAgICBpZiAodG9JbmRleChwX3R5cGUpID49IHRvSW5kZXgoTmFtZWRPYmplY3RUeXBlOjpOVU1fT0JKRUNUX1RZUEVTKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICByZXR1cm4gbV9uYW1lU3BhY2VbdG9JbmRleChwX3R5cGUpXS0+Z2V0R2xvYmFsTmFtZShwX2xvY2FsTmFtZSk7Cit9CisKK09iamVjdExvY2FsTmFtZQorU2hhcmVHcm91cDo6Z2V0TG9jYWxOYW1lKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBfZ2xvYmFsTmFtZSkKK3sKKyAgICBpZiAodG9JbmRleChwX3R5cGUpID49IHRvSW5kZXgoTmFtZWRPYmplY3RUeXBlOjpOVU1fT0JKRUNUX1RZUEVTKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICByZXR1cm4gbV9uYW1lU3BhY2VbdG9JbmRleChwX3R5cGUpXS0+Z2V0TG9jYWxOYW1lKHBfZ2xvYmFsTmFtZSk7Cit9CisKK05hbWVkT2JqZWN0UHRyIFNoYXJlR3JvdXA6OmdldE5hbWVkT2JqZWN0KE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpIHsKKyAgICBpZiAodG9JbmRleChwX3R5cGUpID49IHRvSW5kZXgoTmFtZWRPYmplY3RUeXBlOjpOVU1fT0JKRUNUX1RZUEVTKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICByZXR1cm4gbV9uYW1lU3BhY2VbdG9JbmRleChwX3R5cGUpXS0+Z2V0TmFtZWRPYmplY3QocF9sb2NhbE5hbWUpOworfQorCit2b2lkCitTaGFyZUdyb3VwOjpkZWxldGVOYW1lKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSkKK3sKKyAgICBpZiAodG9JbmRleChwX3R5cGUpID49IHRvSW5kZXgoTmFtZWRPYmplY3RUeXBlOjpOVU1fT0JKRUNUX1RZUEVTKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgeworICAgICAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICAgICAgbV9uYW1lU3BhY2VbdG9JbmRleChwX3R5cGUpXS0+ZGVsZXRlTmFtZShwX2xvY2FsTmFtZSk7CisgICAgfQorCisgICAgT2JqZWN0RGF0YUF1dG9Mb2NrIGxvY2sodGhpcyk7CisgICAgT2JqZWN0RGF0YU1hcCAqbWFwID0gKE9iamVjdERhdGFNYXAgKiltX29iamVjdHNEYXRhOworICAgIGlmIChtYXApIHsKKyAgICAgICAgKCptYXApW3RvSW5kZXgocF90eXBlKV0uZXJhc2UocF9sb2NhbE5hbWUpOworICAgIH0KK30KKworYm9vbAorU2hhcmVHcm91cDo6aXNPYmplY3QoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lKQoreworICAgIGlmICh0b0luZGV4KHBfdHlwZSkgPj0gdG9JbmRleChOYW1lZE9iamVjdFR5cGU6Ok5VTV9PQkpFQ1RfVFlQRVMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX25hbWVzcGFjZUxvY2spOworICAgIHJldHVybiBtX25hbWVTcGFjZVt0b0luZGV4KHBfdHlwZSldLT5pc09iamVjdChwX2xvY2FsTmFtZSk7Cit9CisKK3ZvaWQKK1NoYXJlR3JvdXA6OnJlcGxhY2VHbG9iYWxPYmplY3QoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWVkT2JqZWN0UHRyIHBfZ2xvYmFsT2JqZWN0KQoreworICAgIGlmICh0b0luZGV4KHBfdHlwZSkgPj0gdG9JbmRleChOYW1lZE9iamVjdFR5cGU6Ok5VTV9PQkpFQ1RfVFlQRVMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9uYW1lc3BhY2VMb2NrKTsKKyAgICBtX25hbWVTcGFjZVt0b0luZGV4KHBfdHlwZSldLT5yZXBsYWNlR2xvYmFsT2JqZWN0KHBfbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9nbG9iYWxPYmplY3QpOworfQorCit2b2lkCitTaGFyZUdyb3VwOjpzZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGF0YVB0ciBkYXRhKQoreworICAgIGlmICh0b0luZGV4KHBfdHlwZSkgPj0gdG9JbmRleChOYW1lZE9iamVjdFR5cGU6Ok5VTV9PQkpFQ1RfVFlQRVMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBPYmplY3REYXRhQXV0b0xvY2sgbG9jayh0aGlzKTsKKworICAgIE9iamVjdERhdGFNYXAgKm1hcCA9IChPYmplY3REYXRhTWFwICopbV9vYmplY3RzRGF0YTsKKyAgICBpZiAoIW1hcCkgeworICAgICAgICBtYXAgPSBuZXcgT2JqZWN0RGF0YU1hcCgpOworICAgICAgICBtX29iamVjdHNEYXRhID0gbWFwOworICAgIH0KKyAgICAoKm1hcClbdG9JbmRleChwX3R5cGUpXS5lbXBsYWNlKHBfbG9jYWxOYW1lLCBzdGQ6Om1vdmUoZGF0YSkpOworfQorCitzdGF0aWMgYW5kcm9pZDo6YmFzZTo6TGF6eUluc3RhbmNlPE9iamVjdERhdGFQdHI+IG51bGxPYmplY3REYXRhID0ge307CisKK2NvbnN0IE9iamVjdERhdGFQdHImIFNoYXJlR3JvdXA6OmdldE9iamVjdERhdGFQdHJOb0xvY2soCisgICAgICAgIE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSkKK3sKKyAgICBpZiAoY29uc3QgYXV0byBtYXAgPSAoT2JqZWN0RGF0YU1hcCopbV9vYmplY3RzRGF0YSkgeworICAgICAgICBjb25zdCBhdXRvJiB0eXBlTWFwID0gKCptYXApW3RvSW5kZXgocF90eXBlKV07CisgICAgICAgIGNvbnN0IGF1dG8gaXQgPSB0eXBlTWFwLmZpbmQocF9sb2NhbE5hbWUpOworICAgICAgICBpZiAoaXQgIT0gdHlwZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICpudWxsT2JqZWN0RGF0YTsKK30KKworT2JqZWN0RGF0YSogU2hhcmVHcm91cDo6Z2V0T2JqZWN0RGF0YShOYW1lZE9iamVjdFR5cGUgcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpCit7CisgICAgaWYgKHRvSW5kZXgocF90eXBlKSA+PQorICAgICAgICB0b0luZGV4KE5hbWVkT2JqZWN0VHlwZTo6TlVNX09CSkVDVF9UWVBFUykpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgT2JqZWN0RGF0YUF1dG9Mb2NrIGxvY2sodGhpcyk7CisgICAgcmV0dXJuIGdldE9iamVjdERhdGFQdHJOb0xvY2socF90eXBlLCBwX2xvY2FsTmFtZSkuZ2V0KCk7Cit9CisKK09iamVjdERhdGFQdHIgU2hhcmVHcm91cDo6Z2V0T2JqZWN0RGF0YVB0cihOYW1lZE9iamVjdFR5cGUgcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpCit7CisgICAgaWYgKHRvSW5kZXgocF90eXBlKSA+PQorICAgICAgICB0b0luZGV4KE5hbWVkT2JqZWN0VHlwZTo6TlVNX09CSkVDVF9UWVBFUykpCisgICAgICAgIHJldHVybiB7fTsKKworICAgIE9iamVjdERhdGFBdXRvTG9jayBsb2NrKHRoaXMpOworICAgIHJldHVybiBnZXRPYmplY3REYXRhUHRyTm9Mb2NrKHBfdHlwZSwgcF9sb2NhbE5hbWUpOworfQorCitPYmplY3ROYW1lTWFuYWdlcjo6T2JqZWN0TmFtZU1hbmFnZXIoR2xvYmFsTmFtZVNwYWNlICpnbG9iYWxOYW1lU3BhY2UpIDoKKyAgICBtX2dsb2JhbE5hbWVTcGFjZShnbG9iYWxOYW1lU3BhY2UpIHt9CisKK1NoYXJlR3JvdXBQdHIKK09iamVjdE5hbWVNYW5hZ2VyOjpjcmVhdGVTaGFyZUdyb3VwKHZvaWQgKnBfZ3JvdXBOYW1lKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX2xvY2spOworCisgICAgU2hhcmVHcm91cFB0ciYgc2hhcmVHcm91cFJldHVybiA9IG1fZ3JvdXBzW3BfZ3JvdXBOYW1lXTsKKyAgICBpZiAoIXNoYXJlR3JvdXBSZXR1cm4pIHsKKyAgICAgICAgc2hhcmVHcm91cFJldHVybi5yZXNldChuZXcgU2hhcmVHcm91cChtX2dsb2JhbE5hbWVTcGFjZSkpOworICAgIH0KKworICAgIHJldHVybiBzaGFyZUdyb3VwUmV0dXJuOworfQorCitTaGFyZUdyb3VwUHRyCitPYmplY3ROYW1lTWFuYWdlcjo6Z2V0U2hhcmVHcm91cCh2b2lkICpwX2dyb3VwTmFtZSkKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIGxvY2sobV9sb2NrKTsKKworICAgIFNoYXJlR3JvdXBQdHIgc2hhcmVHcm91cFJldHVybjsKKworICAgIFNoYXJlR3JvdXBzTWFwOjppdGVyYXRvciBzKCBtX2dyb3Vwcy5maW5kKHBfZ3JvdXBOYW1lKSApOworICAgIGlmIChzICE9IG1fZ3JvdXBzLmVuZCgpKSB7CisgICAgICAgIHNoYXJlR3JvdXBSZXR1cm4gPSAoKnMpLnNlY29uZDsKKyAgICB9CisKKyAgICByZXR1cm4gc2hhcmVHcm91cFJldHVybjsKK30KKworU2hhcmVHcm91cFB0cgorT2JqZWN0TmFtZU1hbmFnZXI6OmF0dGFjaFNoYXJlR3JvdXAodm9pZCAqcF9ncm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwX2V4aXN0aW5nR3JvdXBOYW1lKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX2xvY2spOworCisgICAgU2hhcmVHcm91cHNNYXA6Oml0ZXJhdG9yIHMoIG1fZ3JvdXBzLmZpbmQocF9leGlzdGluZ0dyb3VwTmFtZSkgKTsKKyAgICBpZiAocyA9PSBtX2dyb3Vwcy5lbmQoKSkgeworICAgICAgICAvLyBTaGFyZUdyb3VwIGlzIG5vdCBmb3VuZCAhISEKKyAgICAgICAgcmV0dXJuIFNoYXJlR3JvdXBQdHIoKTsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNoYXJlR3JvdXBSZXR1cm4oKCpzKS5zZWNvbmQpOworICAgIGlmIChtX2dyb3Vwcy5maW5kKHBfZ3JvdXBOYW1lKSA9PSBtX2dyb3Vwcy5lbmQoKSkgeworICAgICAgICBtX2dyb3Vwcy5lbXBsYWNlKHBfZ3JvdXBOYW1lLCBzaGFyZUdyb3VwUmV0dXJuKTsKKyAgICB9CisgICAgcmV0dXJuIHNoYXJlR3JvdXBSZXR1cm47Cit9CisKK3ZvaWQKK09iamVjdE5hbWVNYW5hZ2VyOjpkZWxldGVTaGFyZUdyb3VwKHZvaWQgKnBfZ3JvdXBOYW1lKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX2xvY2spOworICAgIG1fZ3JvdXBzLmVyYXNlKHBfZ3JvdXBOYW1lKTsKK30KKwordm9pZCAqT2JqZWN0TmFtZU1hbmFnZXI6OmdldEdsb2JhbENvbnRleHQoKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbG9jayhtX2xvY2spOworICAgIHJldHVybiBtX2dyb3Vwcy5lbXB0eSgpID8gbnVsbHB0ciA6IG1fZ3JvdXBzLmJlZ2luKCktPmZpcnN0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vRnJhbWVidWZmZXJEYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9GcmFtZWJ1ZmZlckRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc1YjhhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vRnJhbWVidWZmZXJEYXRhLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgX0ZSQU1FQlVGRkVSX0RBVEFfSAorI2RlZmluZSBfRlJBTUVCVUZGRVJfREFUQV9ICisKKyNpbmNsdWRlICJvYmplY3ROYW1lTWFuYWdlci5oIgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKK2NsYXNzIFJlbmRlcmJ1ZmZlckRhdGEgOiBwdWJsaWMgT2JqZWN0RGF0YQoreworcHVibGljOgorICAgIEdMdWludCBhdHRhY2hlZEZCID0gMDsKKyAgICBHTGVudW0gYXR0YWNoZWRQb2ludCA9IDA7CisgICAgTmFtZWRPYmplY3RQdHIgZWdsSW1hZ2VHbG9iYWxUZXhPYmplY3QgPSAwOworfTsKKworY29uc3QgaW50IE1BWF9BVFRBQ0hfUE9JTlRTID0gMzsKKworY2xhc3MgRnJhbWVidWZmZXJEYXRhIDogcHVibGljIE9iamVjdERhdGEKK3sKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBGcmFtZWJ1ZmZlckRhdGEoR0x1aW50IG5hbWUpOworICAgIH5GcmFtZWJ1ZmZlckRhdGEoKTsKKworICAgIHZvaWQgc2V0QXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdERhdGFQdHIgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIHRha2VPd25lcnNoaXAgPSBmYWxzZSk7CisKKyAgICBHTHVpbnQgZ2V0QXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gKm91dFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3REYXRhUHRyICpvdXRPYmopOworCisgICAgdm9pZCB2YWxpZGF0ZShjbGFzcyBHTEVTY29udGV4dCogY3R4KTsKKworcHJpdmF0ZToKKyAgICBpbmxpbmUgaW50IGF0dGFjaG1lbnRQb2ludEluZGV4KEdMZW51bSBhdHRhY2htZW50KTsKKyAgICB2b2lkIGRldGFjaE9iamVjdChpbnQgaWR4KTsKKworcHJpdmF0ZToKKyAgICBHTHVpbnQgbV9mYk5hbWUgPSAwOworICAgIHN0cnVjdCBhdHRhY2hQb2ludCB7CisgICAgICAgIEdMZW51bSB0YXJnZXQ7IC8vIE9HTCBpZiBvd25lZCwgR0xFUyBvdGhlcndpc2UKKyAgICAgICAgR0x1aW50IG5hbWU7IC8vIE9HTCBpZiBvd25lZCwgR0xFUyBvdGhlcndpc2UKKyAgICAgICAgT2JqZWN0RGF0YVB0ciBvYmo7CisgICAgICAgIGJvb2wgb3duZWQ7CisgICAgfSBtX2F0dGFjaFBvaW50c1tNQVhfQVRUQUNIX1BPSU5UUysxXSA9IHt9OworICAgIGJvb2wgbV9kaXJ0eSA9IGZhbHNlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTERpc3BhdGNoLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTERpc3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4MTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRGlzcGF0Y2guaApAQCAtMCwwICsxLDU1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBHTF9ESVNQQVRDSEgKKyNkZWZpbmUgR0xfRElTUEFUQ0hICisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzMvZ2wzLmg+CisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZGVmcy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJHTHV0aWxzLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbXV0ZXguaCIKKworI2RlZmluZSBHTEFQSUVOVFJZIEdMX0FQSUVOVFJZCit0eXBlZGVmIHZvaWQgKCpGVU5DUFRSX05PX0FSR1NfUkVUX1ZPSUQpKCk7Cit0eXBlZGVmIEdMc3luYyAoKkZVTkNQVFJfRkVOQ0VfU1lOQykoR0xlbnVtLCBHTGJpdGZpZWxkKTsKK3R5cGVkZWYgR0xlbnVtICgqRlVOQ1BUUl9DTElFTlRfV0FJVF9TWU5DKShHTHN5bmMsIEdMYml0ZmllbGQsIEdMdWludDY0KTsKK3R5cGVkZWYgdm9pZCAoKkZVTkNQVFJfREVMRVRFX1NZTkMpKEdMc3luYyk7CisKK2NsYXNzIEdsTGlicmFyeTsKKworI2RlZmluZSBHTEVTX0RFQ0xBUkVfTUVUSE9EKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUsIGFyZ3MpIFwKKyAgICBzdGF0aWMgR0xfQVBJQ0FMTCByZXR1cm5fdHlwZSAoR0xfQVBJRU5UUlkgKmZ1bmN0aW9uX25hbWUpIHNpZ25hdHVyZTsKKworY2xhc3MgR0xEaXNwYXRjaCB7CitwdWJsaWM6CisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgR0xEaXNwYXRjaCgpOworCisgICAgYm9vbCBpc0luaXRpYWxpemVkKCkgY29uc3Q7CisgICAgdm9pZCBkaXNwYXRjaEZ1bmNzKEdMRVNWZXJzaW9uIHZlcnNpb24sIEdsTGlicmFyeSogZ2xMaWIpOworCisgICAgTElTVF9HTEVTX0ZVTkNUSU9OUyhHTEVTX0RFQ0xBUkVfTUVUSE9ELCBHTEVTX0RFQ0xBUkVfTUVUSE9EKQorCitwcml2YXRlOgorICAgIGJvb2wgICAgICAgICAgICAgICAgICBtX2lzTG9hZGVkOworICAgIHN0YXRpYyBlbXVnbDo6TXV0ZXggICBzX2xvY2s7Cit9OworCisjZW5kaWYgIC8vIEdMX0RJU1BBVENIX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNidWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQwNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vR0xFU2J1ZmZlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEdMRVNfQlVGRkVSX0gKKyNkZWZpbmUgR0xFU19CVUZGRVJfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xjb21tb24vb2JqZWN0TmFtZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxHTGNvbW1vbi9SYW5nZU1hbmlwLmg+CisKK2NsYXNzIEdMRVNidWZmZXI6IHB1YmxpYyBPYmplY3REYXRhIHsKK3B1YmxpYzoKKyAgIEdMRVNidWZmZXIoKTpPYmplY3REYXRhKEJVRkZFUl9EQVRBKSB7fQorICAgR0x1aW50IGdldFNpemUoKXtyZXR1cm4gbV9zaXplO307CisgICBHTHVpbnQgZ2V0VXNhZ2UoKXtyZXR1cm4gbV91c2FnZTt9OworICAgR0x2b2lkKiBnZXREYXRhKCl7IHJldHVybiBtX2RhdGE7fQorICAgYm9vbCAgc2V0QnVmZmVyKEdMdWludCBzaXplLEdMdWludCB1c2FnZSxjb25zdCBHTHZvaWQqIGRhdGEpOworICAgYm9vbCAgc2V0U3ViQnVmZmVyKEdMaW50IG9mZnNldCxHTHVpbnQgc2l6ZSxjb25zdCBHTHZvaWQqIGRhdGEpOworICAgdm9pZCAgZ2V0Q29udmVyc2lvbnMoY29uc3QgUmFuZ2VMaXN0JiBySW4sUmFuZ2VMaXN0JiByT3V0KTsKKyAgIGJvb2wgIGZ1bGx5Q29udmVydGVkKCl7cmV0dXJuIG1fY29udmVyc2lvbk1hbmFnZXIuc2l6ZSgpID09IDA7fTsKKyAgIHZvaWQgIHNldEJpbmRlZCgpe21fd2FzQm91bmQgPSB0cnVlO307CisgICBib29sICB3YXNCaW5kZWQoKXtyZXR1cm4gbV93YXNCb3VuZDt9OworICAgfkdMRVNidWZmZXIoKTsKKworcHJpdmF0ZToKKyAgICBHTHVpbnQgICAgICAgICBtX3NpemUgPSAwOworICAgIEdMdWludCAgICAgICAgIG1fdXNhZ2UgPSBHTF9TVEFUSUNfRFJBVzsKKyAgICB1bnNpZ25lZCBjaGFyKiBtX2RhdGEgPSBudWxscHRyOworICAgIFJhbmdlTGlzdCAgICAgIG1fY29udmVyc2lvbk1hbmFnZXI7CisgICAgYm9vbCAgICAgICAgICAgbV93YXNCb3VuZCA9IGZhbHNlOworfTsKKwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8R0xFU2J1ZmZlcj4gR0xFU2J1ZmZlclB0cjsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vR0xFU2NvbnRleHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlNjZlMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNjb250ZXh0LmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisqIENvcHlyaWdodCAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBHTEVTX0NPTlRFWFRfSAorI2RlZmluZSBHTEVTX0NPTlRFWFRfSAorCisjaW5jbHVkZSAiR0xEaXNwYXRjaC5oIgorI2luY2x1ZGUgIkdMRVNwb2ludGVyLmgiCisjaW5jbHVkZSAib2JqZWN0TmFtZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbXV0ZXguaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8R0xlbnVtLEdMRVNwb2ludGVyKj4gIEFycmF5c01hcDsKKworZW51bSBUZXh0dXJlVGFyZ2V0IHsKK1RFWFRVUkVfMkQsCitURVhUVVJFX0NVQkVfTUFQLAorTlVNX1RFWFRVUkVfVEFSR0VUUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX3RleHR1cmVUYXJnZXRTdGF0ZSB7CisgICAgR0x1aW50IHRleHR1cmU7CisgICAgR0xib29sZWFuIGVuYWJsZWQ7Cit9IHRleHR1cmVUYXJnZXRTdGF0ZTsKKwordHlwZWRlZiB0ZXh0dXJlVGFyZ2V0U3RhdGUgdGV4dHVyZVVuaXRTdGF0ZVtOVU1fVEVYVFVSRV9UQVJHRVRTXTsKKworY2xhc3MgVmVyc2lvbnsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBWZXJzaW9uKGludCBtYWpvciA9IDAsaW50IG1pbm9yID0gMCxpbnQgcmVsZWFzZSA9IDApOworICAgIFZlcnNpb24oY29uc3QgY2hhciogdmVyc2lvblN0cmluZyk7CisgICAgVmVyc2lvbihjb25zdCBWZXJzaW9uJiB2ZXIpOworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZlcnNpb24mIHZlcikgY29uc3Q7CisgICAgVmVyc2lvbiYgb3BlcmF0b3I9KGNvbnN0IFZlcnNpb24mIHZlcik7Citwcml2YXRlOgorICAgIGludCBtX21ham9yOworICAgIGludCBtX21pbm9yOworICAgIGludCBtX3JlbGVhc2U7Cit9OworCitzdHJ1Y3QgR0xTdXBwb3J0IHsKKyAgICBpbnQgIG1heExpZ2h0cyA9IDA7CisgICAgaW50ICBtYXhWZXJ0ZXhBdHRyaWJzID0gMDsKKyAgICBpbnQgIG1heENsaXBQbGFuZSA9IDA7CisgICAgaW50ICBtYXhUZXhVbml0cyA9IDA7CisgICAgaW50ICBtYXhUZXhJbWFnZVVuaXRzID0gMDsKKyAgICBpbnQgIG1heFRleFNpemUgPSAwOworICAgIGludCAgbWF4Q29tYmluZWRUZXhJbWFnZVVuaXRzID0gMDsKKyAgICBWZXJzaW9uIGdsc2xWZXJzaW9uOworICAgIGJvb2wgR0xfRVhUX1RFWFRVUkVfRk9STUFUX0JHUkE4ODg4ID0gZmFsc2U7CisgICAgYm9vbCBHTF9FWFRfRlJBTUVCVUZGRVJfT0JKRUNUID0gZmFsc2U7CisgICAgYm9vbCBHTF9BUkJfVkVSVEVYX0JMRU5EID0gZmFsc2U7CisgICAgYm9vbCBHTF9BUkJfTUFUUklYX1BBTEVUVEUgPSBmYWxzZTsKKyAgICBib29sIEdMX0VYVF9QQUNLRURfREVQVEhfU1RFTkNJTCA9IGZhbHNlOworICAgIGJvb2wgR0xfT0VTX1JFQURfRk9STUFUID0gZmFsc2U7CisgICAgYm9vbCBHTF9BUkJfSEFMRl9GTE9BVF9QSVhFTCA9IGZhbHNlOworICAgIGJvb2wgR0xfTlZfSEFMRl9GTE9BVCA9IGZhbHNlOworICAgIGJvb2wgR0xfQVJCX0hBTEZfRkxPQVRfVkVSVEVYID0gZmFsc2U7CisgICAgYm9vbCBHTF9TR0lTX0dFTkVSQVRFX01JUE1BUCA9IGZhbHNlOworICAgIGJvb2wgR0xfQVJCX0VTMl9DT01QQVRJQklMSVRZID0gZmFsc2U7CisgICAgYm9vbCBHTF9PRVNfU1RBTkRBUkRfREVSSVZBVElWRVMgPSBmYWxzZTsKKyAgICBib29sIEdMX09FU19URVhUVVJFX05QT1QgPSBmYWxzZTsKKyAgICBib29sIEdMX09FU19SR0I4X1JHQkE4ID0gZmFsc2U7Cit9OworCitzdHJ1Y3QgQXJyYXlEYXRheworICAgIHZvaWQqICAgICAgICBkYXRhID0gbnVsbHB0cjsKKyAgICBHTGVudW0gICAgICAgdHlwZSA9IDA7CisgICAgdW5zaWduZWQgaW50IHN0cmlkZSA9IDA7CisgICAgYm9vbCAgICAgICAgIGFsbG9jYXRlZCA9IGZhbHNlOworfTsKKworY2xhc3MgR0xFU0NvbnZlcnNpb25BcnJheXMKK3sKK3B1YmxpYzoKKyAgICB2b2lkIHNldEFycih2b2lkKiBkYXRhLHVuc2lnbmVkIGludCBzdHJpZGUsR0xlbnVtIHR5cGUpOworICAgIHZvaWQgYWxsb2NBcnIodW5zaWduZWQgaW50IHNpemUsR0xlbnVtIHR5cGUpOworICAgIEFycmF5RGF0YSYgb3BlcmF0b3JbXShpbnQgaSk7CisgICAgdm9pZCogZ2V0Q3VycmVudERhdGEoKTsKKyAgICBBcnJheURhdGEmIGdldEN1cnJlbnRBcnJheSgpOworICAgIHVuc2lnbmVkIGludCBnZXRDdXJyZW50SW5kZXgoKTsKKyAgICB2b2lkIG9wZXJhdG9yKysoKTsKKworICAgIH5HTEVTQ29udmVyc2lvbkFycmF5cygpOworcHJpdmF0ZToKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8R0xlbnVtLEFycmF5RGF0YT4gbV9hcnJheXM7CisgICAgdW5zaWduZWQgaW50IG1fY3VycmVudCA9IDA7Cit9OworCitjbGFzcyBHTEVTY29udGV4dHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdChHbExpYnJhcnkqIGdsTGliKTsKKyAgICBHTGVudW0gZ2V0R0xlcnJvcigpOworICAgIHZvaWQgc2V0R0xlcnJvcihHTGVudW0gZXJyKTsKKyAgICB2b2lkIHNldFNoYXJlR3JvdXAoU2hhcmVHcm91cFB0ciBncnApe21fc2hhcmVHcm91cCA9IGdycDt9OworICAgIGNvbnN0IFNoYXJlR3JvdXBQdHImIHNoYXJlR3JvdXAoKSBjb25zdCB7IHJldHVybiBtX3NoYXJlR3JvdXA7IH0KKyAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4KTsKKyAgICB1bnNpZ25lZCBpbnQgZ2V0QmluZGVkVGV4dHVyZShHTGVudW0gdGFyZ2V0KTsKKyAgICB1bnNpZ25lZCBpbnQgZ2V0QmluZGVkVGV4dHVyZShHTGVudW0gdW5pdCxHTGVudW0gdGFyZ2V0KTsKKyAgICB2b2lkIHNldEJpbmRlZFRleHR1cmUoR0xlbnVtIHRhcmdldCx1bnNpZ25lZCBpbnQgdGV4KTsKKyAgICBib29sIGlzVGV4dHVyZVVuaXRFbmFibGVkKEdMZW51bSB1bml0KTsKKyAgICB2b2lkIHNldFRleHR1cmVFbmFibGVkKEdMZW51bSB0YXJnZXQsIEdMZW51bSBlbmFibGUpOworICAgIE9iamVjdExvY2FsTmFtZSBnZXREZWZhdWx0VGV4dHVyZU5hbWUoR0xlbnVtIHRhcmdldCk7CisgICAgYm9vbCBpc0luaXRpYWxpemVkKCkgeyByZXR1cm4gbV9pbml0aWFsaXplZDsgfTsKKyAgICB2b2lkIHNldFVucGFja0FsaWdubWVudChHTGludCBwYXJhbSl7IG1fdW5wYWNrQWxpZ25tZW50ID0gcGFyYW07IH07CisgICAgR0xpbnQgZ2V0VW5wYWNrQWxpZ25tZW50KCl7IHJldHVybiBtX3VucGFja0FsaWdubWVudDsgfTsKKworICAgIGJvb2wgIGlzQXJyRW5hYmxlZChHTGVudW0pOworICAgIHZvaWQgIGVuYWJsZUFycihHTGVudW0gYXJyLGJvb2wgZW5hYmxlKTsKKyAgICBjb25zdCBHTHZvaWQqIHNldFBvaW50ZXIoR0xlbnVtIGFyclR5cGUsR0xpbnQgc2l6ZSxHTGVudW0gdHlwZSxHTHNpemVpIHN0cmlkZSxjb25zdCBHTHZvaWQqIGRhdGEsYm9vbCBub3JtYWxpemUgPSBmYWxzZSk7CisgICAgdmlydHVhbCBjb25zdCBHTEVTcG9pbnRlciogZ2V0UG9pbnRlcihHTGVudW0gYXJyVHlwZSk7CisgICAgdmlydHVhbCB2b2lkIHNldHVwQXJyYXlzUG9pbnRlcnMoR0xFU0NvbnZlcnNpb25BcnJheXMmIGZBcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLGJvb2wgZGlyZWN0KSA9IDA7CisgICAgdm9pZCBiaW5kQnVmZmVyKEdMZW51bSB0YXJnZXQsR0x1aW50IGJ1ZmZlcik7CisgICAgdm9pZCB1bmJpbmRCdWZmZXIoR0x1aW50IGJ1ZmZlcik7CisgICAgYm9vbCBpc0J1ZmZlcihHTHVpbnQgYnVmZmVyKTsKKyAgICBib29sIGlzQmluZGVkQnVmZmVyKEdMZW51bSB0YXJnZXQpOworICAgIEdMdm9pZCogZ2V0QmluZGVkQnVmZmVyKEdMZW51bSB0YXJnZXQpOworICAgIHZvaWQgZ2V0QnVmZmVyU2l6ZShHTGVudW0gdGFyZ2V0LEdMaW50KiBwYXJhbSk7CisgICAgdm9pZCBnZXRCdWZmZXJVc2FnZShHTGVudW0gdGFyZ2V0LEdMaW50KiBwYXJhbSk7CisgICAgYm9vbCBzZXRCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsR0xzaXplaXB0ciBzaXplLGNvbnN0IEdMdm9pZCogZGF0YSxHTGVudW0gdXNhZ2UpOworICAgIGJvb2wgc2V0QnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LEdMaW50cHRyIG9mZnNldCxHTHNpemVpcHRyIHNpemUsY29uc3QgR0x2b2lkKiBkYXRhKTsKKyAgICBjb25zdCBjaGFyICogZ2V0RXh0ZW5zaW9uU3RyaW5nKCk7CisgICAgY29uc3QgY2hhciAqIGdldFZlbmRvclN0cmluZygpIGNvbnN0OworICAgIGNvbnN0IGNoYXIgKiBnZXRSZW5kZXJlclN0cmluZygpIGNvbnN0OworICAgIGNvbnN0IGNoYXIgKiBnZXRWZXJzaW9uU3RyaW5nKCkgY29uc3Q7CisgICAgdm9pZCBnZXRHbG9iYWxMb2NrKCk7CisgICAgdm9pZCByZWxlYXNlR2xvYmFsTG9jaygpOworICAgIHZpcnR1YWwgR0xTdXBwb3J0KiAgZ2V0Q2Fwcygpe3JldHVybiAmc19nbFN1cHBvcnQ7fTsKKyAgICB2aXJ0dWFsIH5HTEVTY29udGV4dCgpOworICAgIHZpcnR1YWwgaW50IGdldE1heFRleFVuaXRzKCkgPSAwOworICAgIHZpcnR1YWwgaW50IGdldE1heENvbWJpbmVkVGV4VW5pdHMoKSB7IHJldHVybiBnZXRNYXhUZXhVbml0cygpOyB9CisgICAgdmlydHVhbCB2b2lkIGRyYXdWYWxpZGF0ZSh2b2lkKTsKKworICAgIHZvaWQgc2V0UmVuZGVyYnVmZmVyQmluZGluZyhHTHVpbnQgcmIpIHsgbV9yZW5kZXJidWZmZXIgPSByYjsgfQorICAgIEdMdWludCBnZXRSZW5kZXJidWZmZXJCaW5kaW5nKCkgY29uc3QgeyByZXR1cm4gbV9yZW5kZXJidWZmZXI7IH0KKyAgICB2b2lkIHNldEZyYW1lYnVmZmVyQmluZGluZyhHTHVpbnQgZmIpIHsgbV9mcmFtZWJ1ZmZlciA9IGZiOyB9CisgICAgR0x1aW50IGdldEZyYW1lYnVmZmVyQmluZGluZygpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVidWZmZXI7IH0KKworICAgIHN0YXRpYyBHTERpc3BhdGNoJiBkaXNwYXRjaGVyKCl7cmV0dXJuIHNfZ2xEaXNwYXRjaDt9OworCisgICAgc3RhdGljIGludCBnZXRNYXhMaWdodHMoKXtyZXR1cm4gc19nbFN1cHBvcnQubWF4TGlnaHRzO30KKyAgICBzdGF0aWMgaW50IGdldE1heENsaXBQbGFuZXMoKXtyZXR1cm4gc19nbFN1cHBvcnQubWF4Q2xpcFBsYW5lO30KKyAgICBzdGF0aWMgaW50IGdldE1heFRleFNpemUoKXtyZXR1cm4gc19nbFN1cHBvcnQubWF4VGV4U2l6ZTt9CisgICAgc3RhdGljIFZlcnNpb24gZ2xzbFZlcnNpb24oKXtyZXR1cm4gc19nbFN1cHBvcnQuZ2xzbFZlcnNpb247fQorICAgIHN0YXRpYyBib29sIGlzQXV0b01pcG1hcFN1cHBvcnRlZCgpe3JldHVybiBzX2dsU3VwcG9ydC5HTF9TR0lTX0dFTkVSQVRFX01JUE1BUDt9CisgICAgc3RhdGljIFRleHR1cmVUYXJnZXQgR0xUZXh0dXJlVGFyZ2V0VG9Mb2NhbChHTGVudW0gdGFyZ2V0KTsKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IGZpbmRNYXhJbmRleChHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2xHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworICAgIHZpcnR1YWwgYm9vbCBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpOworICAgIHZpcnR1YWwgYm9vbCBnbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7CisgICAgdmlydHVhbCBib29sIGdsR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGJ1aWxkU3RyaW5ncyhjb25zdCBjaGFyKiBiYXNlVmVuZG9yLCBjb25zdCBjaGFyKiBiYXNlUmVuZGVyZXIsIGNvbnN0IGNoYXIqIGJhc2VWZXJzaW9uLCBjb25zdCBjaGFyKiB2ZXJzaW9uKTsKKyAgICB2aXJ0dWFsIGJvb2wgbmVlZENvbnZlcnQoR0xFU0NvbnZlcnNpb25BcnJheXMmIGZBcnJzLEdMaW50IGZpcnN0LEdMc2l6ZWkgY291bnQsR0xlbnVtIHR5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLGJvb2wgZGlyZWN0LEdMRVNwb2ludGVyKiBwLEdMZW51bSBhcnJheV9pZCkgPSAwOworICAgIHZvaWQgY29udmVydERpcmVjdChHTEVTQ29udmVyc2lvbkFycmF5cyYgZkFycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApOworICAgIHZvaWQgY29udmVydERpcmVjdFZCTyhHTEVTQ29udmVyc2lvbkFycmF5cyYgZkFycnMsR0xpbnQgZmlyc3QsR0xzaXplaSBjb3VudCxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApOworICAgIHZvaWQgY29udmVydEluZGlyZWN0KEdMRVNDb252ZXJzaW9uQXJyYXlzJiBmQXJycyxHTHNpemVpIGNvdW50LEdMZW51bSB0eXBlLGNvbnN0IEdMdm9pZCogaW5kaWNlcyxHTGVudW0gYXJyYXlfaWQsR0xFU3BvaW50ZXIqIHApOworICAgIHZvaWQgY29udmVydEluZGlyZWN0VkJPKEdMRVNDb252ZXJzaW9uQXJyYXlzJiBmQXJycyxHTHNpemVpIGNvdW50LEdMZW51bSBpbmRpY2VzX3R5cGUsY29uc3QgR0x2b2lkKiBpbmRpY2VzLEdMZW51bSBhcnJheV9pZCxHTEVTcG9pbnRlciogcCk7CisgICAgdm9pZCBpbml0Q2Fwc0xvY2tlZChjb25zdCBHTHVieXRlICogZXh0ZW5zaW9uU3RyaW5nKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdEV4dGVuc2lvblN0cmluZygpID0wOworCisgICAgc3RhdGljIGVtdWdsOjpNdXRleCAgIHNfbG9jazsKKyAgICBzdGF0aWMgR0xEaXNwYXRjaCAgICAgc19nbERpc3BhdGNoOworICAgIGJvb2wgICAgICAgICAgICAgICAgICBtX2luaXRpYWxpemVkID0gZmFsc2U7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIG1fYWN0aXZlVGV4dHVyZSA9IDA7CisgICAgR0xpbnQgICAgICAgICAgICAgICAgIG1fdW5wYWNrQWxpZ25tZW50ID0gNDsKKyAgICBBcnJheXNNYXAgICAgICAgICAgICAgbV9tYXA7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nKiAgIHNfZ2xFeHRlbnNpb25zOworICAgIHN0YXRpYyBHTFN1cHBvcnQgICAgICBzX2dsU3VwcG9ydDsKKworcHJpdmF0ZToKKworICAgIHZpcnR1YWwgdm9pZCBzZXR1cEFycihjb25zdCBHTHZvaWQqIGFycixHTGVudW0gYXJyYXlUeXBlLEdMZW51bSBkYXRhVHlwZSxHTGludCBzaXplLEdMc2l6ZWkgc3RyaWRlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgaW50IHBvaW50c0luZGV4ID0gLTEpID0gMCA7CisgICAgR0x1aW50IGdldEJ1ZmZlcihHTGVudW0gdGFyZ2V0KTsKKworICAgIFNoYXJlR3JvdXBQdHIgICAgICAgICBtX3NoYXJlR3JvdXA7CisgICAgR0xlbnVtICAgICAgICAgICAgICAgIG1fZ2xFcnJvciA9IEdMX05PX0VSUk9SOworICAgIHRleHR1cmVVbml0U3RhdGUqICAgICBtX3RleFN0YXRlID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgbV9hcnJheUJ1ZmZlciA9IDA7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgIG1fZWxlbWVudEJ1ZmZlciA9IDA7CisgICAgR0x1aW50ICAgICAgICAgICAgICAgIG1fcmVuZGVyYnVmZmVyID0gMDsKKyAgICBHTHVpbnQgICAgICAgICAgICAgICAgbV9mcmFtZWJ1ZmZlciA9IDA7CisKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgICAgc19nbFZlbmRvcjsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgICAgc19nbFJlbmRlcmVyOworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyAgICBzX2dsVmVyc2lvbjsKK307CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTEVTbWFjcm9zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTEVTbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlNWQwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNtYWNyb3MuaApAQCAtMCwwICsxLDQ4IEBACisjaWZuZGVmIEdMRVNfTUFDUk9TX0gKKyNkZWZpbmUgR0xFU19NQUNST1NfSAorCisjZGVmaW5lIEdFVF9DVFgoKSBcCisgICAgICAgICAgICBpZighc19lZ2xJZmFjZSkgcmV0dXJuOyBcCisgICAgICAgICAgICBHTEVTY29udGV4dCAqY3R4ID0gc19lZ2xJZmFjZS0+Z2V0R0xFU0NvbnRleHQoKTsgXAorICAgICAgICAgICAgaWYoIWN0eCkgcmV0dXJuOworCisjZGVmaW5lIEdFVF9DVFhfQ00oKSBcCisgICAgICAgICAgICBpZighc19lZ2xJZmFjZSkgcmV0dXJuOyBcCisgICAgICAgICAgICBHTEVTY21Db250ZXh0ICpjdHggPSBzdGF0aWNfY2FzdDxHTEVTY21Db250ZXh0ICo+KHNfZWdsSWZhY2UtPmdldEdMRVNDb250ZXh0KCkpOyBcCisgICAgICAgICAgICBpZighY3R4KSByZXR1cm47CisKKyNkZWZpbmUgR0VUX0NUWF9WMigpIFwKKyAgICAgICAgICAgIGlmKCFzX2VnbElmYWNlKSByZXR1cm47IFwKKyAgICAgICAgICAgIEdMRVN2MkNvbnRleHQgKmN0eCA9IHN0YXRpY19jYXN0PEdMRVN2MkNvbnRleHQgKj4oc19lZ2xJZmFjZS0+Z2V0R0xFU0NvbnRleHQoKSk7IFwKKyAgICAgICAgICAgIGlmKCFjdHgpIHJldHVybjsKKworI2RlZmluZSBHRVRfQ1RYX1JFVChmYWlsdXJlX3JldCkgXAorICAgICAgICAgICAgaWYoIXNfZWdsSWZhY2UpIHJldHVybiBmYWlsdXJlX3JldDsgXAorICAgICAgICAgICAgR0xFU2NvbnRleHQgKmN0eCA9IHNfZWdsSWZhY2UtPmdldEdMRVNDb250ZXh0KCk7IFwKKyAgICAgICAgICAgIGlmKCFjdHgpIHJldHVybiBmYWlsdXJlX3JldDsKKworI2RlZmluZSBHRVRfQ1RYX0NNX1JFVChmYWlsdXJlX3JldCkgXAorICAgICAgICAgICAgaWYoIXNfZWdsSWZhY2UpIHJldHVybiBmYWlsdXJlX3JldDsgXAorICAgICAgICAgICAgR0xFU2NtQ29udGV4dCAqY3R4ID0gc3RhdGljX2Nhc3Q8R0xFU2NtQ29udGV4dCAqPihzX2VnbElmYWNlLT5nZXRHTEVTQ29udGV4dCgpKTsgXAorICAgICAgICAgICAgaWYoIWN0eCkgcmV0dXJuIGZhaWx1cmVfcmV0OworCisjZGVmaW5lIEdFVF9DVFhfVjJfUkVUKGZhaWx1cmVfcmV0KSBcCisgICAgICAgICAgICBpZighc19lZ2xJZmFjZSkgcmV0dXJuIGZhaWx1cmVfcmV0OyBcCisgICAgICAgICAgICBHTEVTdjJDb250ZXh0ICpjdHggPSBzdGF0aWNfY2FzdDxHTEVTdjJDb250ZXh0ICo+KHNfZWdsSWZhY2UtPmdldEdMRVNDb250ZXh0KCkpOyBcCisgICAgICAgICAgICBpZighY3R4KSByZXR1cm4gZmFpbHVyZV9yZXQ7CisKKworI2RlZmluZSBTRVRfRVJST1JfSUYoY29uZGl0aW9uLGVycikgaWYoKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolczolZCBlcnJvciAweCV4XG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXJyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zZXRHTGVycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9CisKKworI2RlZmluZSBSRVRfQU5EX1NFVF9FUlJPUl9JRihjb25kaXRpb24sZXJyLHJldCkgaWYoKGNvbmRpdGlvbikpIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolczolZCBlcnJvciAweCV4XG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZXJyKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zZXRHTGVycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vR0xFU3BvaW50ZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNwb2ludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczZjQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVNwb2ludGVyLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgR0xFU19QT0lOVEVSX0gKKyNkZWZpbmUgR0xFU19QT0lOVEVSX0gKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlICJHTEVTYnVmZmVyLmgiCisKK2NsYXNzIEdMRVNwb2ludGVyIHsKK3B1YmxpYzoKKyAgICBHTGVudW0gZ2V0VHlwZSgpIGNvbnN0OworICAgIEdMaW50IGdldFNpemUoKSBjb25zdDsKKyAgICBHTHNpemVpIGdldFN0cmlkZSgpIGNvbnN0OworICAgIGNvbnN0IEdMdm9pZCogZ2V0QXJyYXlEYXRhKCkgY29uc3Q7CisgICAgR0x2b2lkKiBnZXRCdWZmZXJEYXRhKCkgY29uc3Q7CisgICAgR0x1aW50IGdldEJ1ZmZlck5hbWUoKSBjb25zdDsKKyAgICBHTGJvb2xlYW4gZ2V0Tm9ybWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIG1fbm9ybWFsaXplID8gR0xfVFJVRSA6IEdMX0ZBTFNFOyB9CisgICAgY29uc3QgR0x2b2lkKiBnZXREYXRhKCkgY29uc3Q7CisgICAgdW5zaWduZWQgaW50IGdldEJ1ZmZlck9mZnNldCgpIGNvbnN0OworICAgIHZvaWQgcmVkaXJlY3RQb2ludGVyRGF0YSgpOworICAgIHZvaWQgZ2V0QnVmZmVyQ29udmVyc2lvbnMoY29uc3QgUmFuZ2VMaXN0JiBybCwgUmFuZ2VMaXN0JiBybE91dCk7CisgICAgYm9vbCBidWZmZXJOZWVkQ29udmVyc2lvbigpIHsgcmV0dXJuICFtX2J1ZmZlci0+ZnVsbHlDb252ZXJ0ZWQoKTsgfQorICAgIHZvaWQgc2V0QXJyYXkoR0xpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgR0xzaXplaSBzdHJpZGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBHTHZvaWQqIGRhdGEsCisgICAgICAgICAgICAgICAgICBib29sIG5vcm1hbGl6ZSA9IGZhbHNlKTsKKyAgICB2b2lkIHNldEJ1ZmZlcihHTGludCBzaXplLAorICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIEdMRVNidWZmZXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICBHTHVpbnQgYnVmZmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGJvb2wgbm9ybWFsaXplID0gZmFsc2UpOworICAgIGJvb2wgaXNFbmFibGUoKSBjb25zdDsKKyAgICBib29sIGlzTm9ybWFsaXplKCkgY29uc3Q7CisgICAgYm9vbCBpc1ZCTygpIGNvbnN0OworICAgIHZvaWQgZW5hYmxlKGJvb2wgYik7CisKK3ByaXZhdGU6CisgICAgR0xpbnQgbV9zaXplID0gNDsKKyAgICBHTGVudW0gbV90eXBlID0gR0xfRkxPQVQ7CisgICAgR0xzaXplaSBtX3N0cmlkZSA9IDA7CisgICAgYm9vbCBtX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBib29sIG1fbm9ybWFsaXplID0gZmFsc2U7CisgICAgYm9vbCBtX2lzVkJPID0gZmFsc2U7CisgICAgY29uc3QgR0x2b2lkKiBtX2RhdGEgPSBudWxscHRyOworICAgIEdMRVNidWZmZXIqIG1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICBHTHVpbnQgbV9idWZmZXJOYW1lID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgbV9idWZmT2Zmc2V0ID0gMDsKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVN2YWxpZGF0ZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vR0xFU3ZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMWYzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMRVN2YWxpZGF0ZS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIEdMRVNfVkFMSURBVEVfSAorI2RlZmluZSBHTEVTX1ZBTElEQVRFX0gKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlICJHTEVTY29udGV4dC5oIgorc3RydWN0IEdMRVN2YWxpZGF0ZQoreworc3RhdGljIGJvb2wgdGV4dHVyZUVudW0oR0xlbnVtIGUsdW5zaWduZWQgaW50IG1heFRleCk7CitzdGF0aWMgYm9vbCBwaXhlbFR5cGUoR0xFU2NvbnRleHQgKiBjdHgsR0xlbnVtIHR5cGUpOworc3RhdGljIGJvb2wgcGl4ZWxPcChHTGVudW0gZm9ybWF0LEdMZW51bSB0eXBlKTsKK3N0YXRpYyBib29sIHBpeGVsRnJtdChHTEVTY29udGV4dCogY3R4ICwgR0xlbnVtIGZvcm1hdCk7CitzdGF0aWMgYm9vbCBidWZmZXJUYXJnZXQoR0xlbnVtIHRhcmdldCk7CitzdGF0aWMgYm9vbCBidWZmZXJVc2FnZShHTGVudW0gdXNhZ2UpOworc3RhdGljIGJvb2wgYnVmZmVyUGFyYW0oR0xlbnVtIHBhcmFtKTsKK3N0YXRpYyBib29sIGRyYXdNb2RlKEdMZW51bSBtb2RlKTsKK3N0YXRpYyBib29sIGRyYXdUeXBlKEdMZW51bSBtb2RlKTsKK3N0YXRpYyBib29sIHRleHR1cmVUYXJnZXQoR0xlbnVtIHRhcmdldCk7CitzdGF0aWMgYm9vbCB0ZXh0dXJlVGFyZ2V0TGltaXRlZChHTGVudW0gdGFyZ2V0KTsKK3N0YXRpYyBib29sIHRleHR1cmVUYXJnZXRFeChHTGVudW0gdGFyZ2V0KTsKK3N0YXRpYyBib29sIHRleEltZ0RpbShHTHNpemVpIHdpZHRoLEdMc2l6ZWkgaGVpZ2h0LGludCBtYXhUZXhTaXplKTsKK3N0YXRpYyBib29sIGJsZW5kRXF1YXRpb25Nb2RlKEdMZW51bSBtb2RlKTsKK3N0YXRpYyBib29sIGZyYW1lYnVmZmVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpOworc3RhdGljIGJvb2wgZnJhbWVidWZmZXJBdHRhY2htZW50KEdMZW51bSBhdHRhY2htZW50KTsKK3N0YXRpYyBib29sIGZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtcyhHTGVudW0gcG5hbWUpOworc3RhdGljIGJvb2wgcmVuZGVyYnVmZmVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpOworc3RhdGljIGJvb2wgcmVuZGVyYnVmZmVyUGFyYW1zKEdMZW51bSBwbmFtZSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMTGlicmFyeS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vR0xMaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzMzA5NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMTGlicmFyeS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBHTENPTU1PTl9HTF9MSUJSQVJZX0gKKyNkZWZpbmUgR0xDT01NT05fR0xfTElCUkFSWV9ICisKKy8vIEFuIGludGVyZmFjZSBjbGFzcyB1c2VkIHRvIG1vZGVsIHRoZSBkZXNrdG9wIEdMIGxpYnJhcnkgdG8gdXNlIGF0IHJ1bnRpbWUuCisvLyBVc2UgR2xMaWJyYXJ5OjpnZXRIb3N0SW5zdGFuY2UoKSB0byByZXRyaWV2ZSB0aGUgaW5zdGFuY2UgY29ycmVzcG9uZGluZworLy8gdG8gdGhlIGhvc3QncyBkZWZhdWx0IHN5c3RlbSBHTCBsaWJyYXJ5LgorY2xhc3MgR2xMaWJyYXJ5IHsKK3B1YmxpYzoKKyAgICAvLyBHZW5lcmljIHBvaW50ZXItdG8tZnVuY3Rpb24gdHlwZS4KKyAgICB0eXBlZGVmIHZvaWQgKCpHbEZ1bmN0aW9uUG9pbnRlcikodm9pZCk7CisKKyAgICAvLyBFbXB0eSBjb25zdHJ1Y3Rvci4KKyAgICBHbExpYnJhcnkoKSB7fQorCisgICAgLy8gRW1wdHkgZGVzdHJ1Y3Rvci4KKyAgICB2aXJ0dWFsIH5HbExpYnJhcnkoKSB7fQorCisgICAgLy8gRmluZCB0aGUgZnVuY3Rpb24gbmFtZWQgfG5hbWV8IGluIHRoZSBsaWJyYXJ5IGFuZCByZXR1cm4gaXRzIGFkZHJlc3MuCisgICAgdmlydHVhbCBHbEZ1bmN0aW9uUG9pbnRlciBmaW5kU3ltYm9sKGNvbnN0IGNoYXIqIG5hbWUpID0gMDsKK307CisKKyNlbmRpZiAgLy8gR0xDT01NT05fR0xfTElCUkFSWV9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTGNvbnZlcnNpb25fbWFjcm9zLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTGNvbnZlcnNpb25fbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlOTliNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMY29udmVyc2lvbl9tYWNyb3MuaApAQCAtMCwwICsxLDMxIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfR0xfRklYRURfT1BTX0gKKyNkZWZpbmUgX0dMX0ZJWEVEX09QU19ICisKKyNkZWZpbmUgWDJGKHgpICAgICAgICAoKChmbG9hdCkoeCkpLzY1NTM2LjBmKQorI2RlZmluZSBYMkQoeCkgICAgICAgICgoKGRvdWJsZSkoeCkpLzY1NTM2LjApCisjZGVmaW5lIFgySSh4KSAgICAgICAgKCh4KSAvNjU1MzYpCisjZGVmaW5lIEIyUyh4KSAgICAgICAgKChzaG9ydCl4KQorCisKKyNkZWZpbmUgRjJYKGQpICgoZCkgPiAzMjc2Ny42NTUzNSA/IDMyNzY3ICogNjU1MzYgKyA2NTUzNSA6ICBcCisgICAgICAgICAgICAgICAoZCkgPCAtMzI3NjguNjU1MzUgPyAtMzI3NjggKiA2NTUzNiArIDY1NTM1IDogXAorICAgICAgICAgICAgICAgKChHTGZpeGVkKSAoKGQpICogNjU1MzYpKSkKKworI2RlZmluZSBJMlgoZCkgKChkKSo2NTUzNikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTHV0aWxzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9HTHV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhN2FmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL0dMdXRpbHMuaApAQCAtMCwwICsxLDU5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBHTF9VVElMU19ICisjZGVmaW5lIEdMX1VUSUxTX0gKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiBlbnVtIHsKKyAgICBHTEVTXzFfMSA9IDEsCisgICAgR0xFU18yXzAgPSAyLAorICAgIE1BWF9HTEVTX1ZFUlNJT04gLy9NdXN0IGJlIGxhc3QKK30gR0xFU1ZlcnNpb247CisKK2Jvb2wgaXNQb3dlck9mMihpbnQgbnVtKTsKKworLy8gPEVHTC9lZ2wuaD4gZGVmaW5lcyBtYW55IHR5cGVzIGFzICd2b2lkKicgd2hpbGUgdGhleSdyZSByZWFsbHkKKy8vIGltcGxlbWVudGVkIGFzIHVuc2lnbmVkIGludGVnZXJzLiBUaGVzZSBjb252ZW5pZW5jZSB0ZW1wbGF0ZSBmdW5jdGlvbnMKKy8vIGhlbHAgY2FzdGluZyBiZXR3ZWVuIHRoZW0gc2FmZWx5IHdpdGhvdXQgZ2VuZXJhdGluZyBjb21waWxlciB3YXJuaW5ncy4KK2lubGluZSB2b2lkKiBTYWZlUG9pbnRlckZyb21VSW50KHVuc2lnbmVkIGludCBoYW5kbGUpIHsKKyAgICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpKGhhbmRsZSk7Cit9CisKK2lubGluZSB1bnNpZ25lZCBpbnQgU2FmZVVJbnRGcm9tUG9pbnRlckZpbGVMaW5lKGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lKSB7CisjaWYgMQorICAgIC8vIElnbm9yZSB0aGUgYXNzZXJ0IGJlbG93IHRvIGF2b2lkIGNyYXNoaW5nIHdoZW4gcnVubmluZyBvbGRlcgorICAgIC8vIHN5c3RlbSBpbWFnZXMsIHdoaWNoIG1pZ2h0IGhhdmUgYnVnZ3kgZW5jb2RlciBsaWJyYXJpZXMuIFByaW50CisgICAgLy8gYW4gZXJyb3IgbWVzc2FnZSB0aG91Z2guCisgICAgaWYgKCh1aW50cHRyX3QpKHB0cikgIT0gKHVuc2lnbmVkIGludCkodWludHB0cl90KShwdHIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKCVzOiVkKSBFbXVHTDpXQVJOSU5HOiBiYWQgZ2VuZXJpYyBwb2ludGVyICVwXG4iLAorICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIHB0cik7CisgICAgfQorI2Vsc2UKKyAgICAvLyBBc3NlcnRpb24gZXJyb3IgaWYgdGhlIHBvaW50ZXIgY29udGFpbnMgYSB2YWx1ZSB0aGF0IGRvZXMgbm90IGZpdAorICAgIC8vIGluIGFuIHVuc2lnbmVkIGludGVnZXIhCisgICAgYXNzZXJ0KCh1aW50cHRyX3QpKHB0cikgPT0gKHVuc2lnbmVkIGludCkodWludHB0cl90KShwdHIpKTsKKyNlbmRpZgorICAgIHJldHVybiAodW5zaWduZWQgaW50KSh1aW50cHRyX3QpKHB0cik7Cit9CisKKyNkZWZpbmUgU2FmZVVJbnRGcm9tUG9pbnRlcihwdHIpIFwKKyAgICBTYWZlVUludEZyb21Qb2ludGVyRmlsZUxpbmUoKHB0ciksIF9fRklMRV9fLCBfX0xJTkVfXykKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9OYW1lZE9iamVjdC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vTmFtZWRPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWU1NjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vTmFtZWRPYmplY3QuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworZW51bSBjbGFzcyBOYW1lZE9iamVjdFR5cGUgeworICAgIFZFUlRFWEJVRkZFUiwKKyAgICBURVhUVVJFLAorICAgIFJFTkRFUkJVRkZFUiwKKyAgICBGUkFNRUJVRkZFUiwKKyAgICBTSEFERVJfT1JfUFJPR1JBTSwKKyAgICBOVU1fT0JKRUNUX1RZUEVTICAvLyBNdXN0IGJlIGxhc3QKK307CisKK2VudW0gY2xhc3MgU2hhZGVyUHJvZ3JhbVR5cGUgeworICAgIFBST0dSQU0sCisgICAgVkVSVEVYX1NIQURFUiwKKyAgICBGUkFHTUVOVF9TSEFERVIKK307CisKKy8vCisvLyBDbGFzcyBHZW5OYW1lSW5mbyAtIHRoaXMgY2xhc3MgY29udGFpbnMgdGhlIHR5cGUgb2YgYW4gR0wgb2JqZWN0IHRvIGJlCisvLyAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZC4gSXQgYWxzbyBjb250YWlucyBzaGFkZXIgdHlwZSB3aGVuIGdlbmVyYXRpbmcKKy8vICAgICAgICAgICAgICAgICAgICAgc2hhZGVyIG9iamVjdC4KKy8vICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCBieSBHbG9iYWxOYW1lU3BhY2U6Omdlbk5hbWUuCisvLyAgICAgICAgICAgICAgICAgICAgIFdoZW4gZ2VuZXJhdGluZyBhbiBvYmplY3QgdGhhdCBpcyBub3Qgc2hhZGVyIG9yIHByb2dyYW0sCisvLyAgICAgICAgICAgICAgICAgICAgIGEgTmFtZWRPYmplY3RUeXBlIHBhcmFtZXRlciBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZQorLy8gICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci4gV2hlbiBnZW5lcmF0aW5nIHNoYWRlciAvIHByb2dyYW0gb2JqZWN0LCB0aGUKKy8vICAgICAgICAgICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbVR5cGUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisvLyBFeGFtcGxlOgorLy8gICAgICAgICAgR2xvYmFsTmFtZVNwYWNlIGdsb2JhbE5hbWVTcGFjZTsKKy8vICAgICAgICAgIEdlbk5hbWVJbmZvIGdlblRleHR1cmUoTmFtZWRPYmplY3RUeXBlOjpURVhUVVJFKTsKKy8vICAgICAgICAgIHVuc2lnbmVkIGludCB0ZXhJRCA9IGdsb2JhbE5hbWVTcGFjZS5nZW5OYW1lKGdlblRleHR1cmUpOworLy8gICAgICAgICAgR2VuTmFtZUluZm8gZ2VuU2hhZGVyKFNoYWRlclByb2dyYW1UeXBlOjpGUkFHTUVOVF9TSEFERVIpOworLy8gICAgICAgICAgdW5zaWduZWQgaW50IHNoYWRlcklEID0gZ2xvYmFsTmFtZVNwYWNlLmdlbk5hbWUoZ2VuU2hhZGVyKTsKKworc3RydWN0IEdlbk5hbWVJbmZvIHsKKyAgICBOYW1lZE9iamVjdFR5cGUgbV90eXBlID0gKE5hbWVkT2JqZWN0VHlwZSkwOworICAgIC8vIG9ubHkgdXNlZCBmb3IgTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTQorICAgIFNoYWRlclByb2dyYW1UeXBlIG1fc2hhZGVyUHJvZ3JhbVR5cGUgPSAoU2hhZGVyUHJvZ3JhbVR5cGUpMDsKKyAgICBHZW5OYW1lSW5mbygpID0gZGVsZXRlOworICAgIC8vIGNvbnN0cnVjdG9yIGZvciBnZW5lcmF0aW5nIG5vbi1zaGFkZXIgb2JqZWN0CisgICAgZXhwbGljaXQgR2VuTmFtZUluZm8oTmFtZWRPYmplY3RUeXBlIHR5cGUpIDogbV90eXBlKHR5cGUpIHsKKyAgICAgICAgYXNzZXJ0KHR5cGUgIT0gTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSk7CisgICAgfQorICAgIC8vIGNvbnN0cnVjdG9yIGZvciBnZW5lcmF0aW5nIHNoYWRlciBvYmplY3QKKyAgICBleHBsaWNpdCBHZW5OYW1lSW5mbyhTaGFkZXJQcm9ncmFtVHlwZSBzaGFkZXJQcm9ncmFtVHlwZSkgOgorICAgICAgICBtX3R5cGUoTmFtZWRPYmplY3RUeXBlOjpTSEFERVJfT1JfUFJPR1JBTSksCisgICAgICAgIG1fc2hhZGVyUHJvZ3JhbVR5cGUoc2hhZGVyUHJvZ3JhbVR5cGUpIHt9Cit9OworCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9iamVjdExvY2FsTmFtZTsKKworY2xhc3MgR2xvYmFsTmFtZVNwYWNlOworCisvLyBOYW1lZE9iamVjdCBpcyB1c2VkIHRvIG1hbmFnZSBHUFUgbmFtZXMuCisvLyBJdCBnZW5lcmF0ZXMgLyByZWxlYXNlcyBHUFUgbmFtZXMuCisvLyBOYW1lZE9iamVjdCBpcyBleHBlY3RlZCB0byBiZSBlbmNhcHN1bGF0ZWQgaW4gYSBzaGFyZWQgcG9pbnRlciB3aGVuIHVzZWQgKHNlZQorLy8gTmFtZWRPYmplY3RQdHIpLiBUaGUgbWFpbiBwdXJwb3NlIHRvIHVzZSBzbWFydCBwb2ludGVycyBpcyB0byBoYXZlIHJlZmVyZW5jZQorLy8gY291bnRlcnMgZm9yIHRleHR1cmUgb2JqZWN0cywgd2hpY2ggYXJlIGZyZXF1ZW50bHkgc2hhcmVkIGFjcm9zcyBjb250ZXh0cyBhbmQKKy8vIHNoYXJlIGdyb3VwcyB3aGVuIHVzZWQgaW4gRUdMSW1hZ2VzLiBUaGUgc3BlY2lmaWNhdGlvbiBvZiBFR0xJbWFnZSBzYXlzOgorLy8KKy8vICAgIE9uY2UgYW4gRUdMSW1hZ2UgaXMgY3JlYXRlZCBmcm9tIGFuIEVHTEltYWdlIHNvdXJjZSwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkCisvLyAgICB3aXRoIHRoZSBFR0xJbWFnZSBzb3VyY2Ugd2lsbCByZW1haW4gYWxsb2NhdGVkIChhbmQgYWxsIEVHTEltYWdlIHNpYmxpbmdzCisvLyAgICBpbiBhbGwgY2xpZW50IEFQSSBjb250ZXh0cyB3aWxsIGJlIHVzZWFibGUpIGFzIGxvbmcgYXMgZWl0aGVyIG9mIHRoZQorLy8gICAgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZToKKy8vICAgICAgQSkgIEFueSBFR0xJbWFnZSBzaWJsaW5ncyBleGlzdCBpbiBhbnkgY2xpZW50IEFQSSBjb250ZXh0CisvLyAgICAgIEIpICBUaGUgRUdMSW1hZ2Ugb2JqZWN0IGV4aXN0cyBpbnNpZGUgRUdMCisvLyBSZWZlcmVuY2U6IDIuNS4yICBMaWZldGltZSBhbmQgVXNhZ2Ugb2YgRUdMSW1hZ2VzIGluCisvLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9lZ2wvZXh0ZW5zaW9ucy9LSFIvRUdMX0tIUl9pbWFnZV9iYXNlLnR4dAorLy8KKy8vIEluIG91ciBzaXR1YXRpb24sICJ0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgRUdMSW1hZ2Ugc291cmNlIiBtZWFucyB0aGUKKy8vIHRleHR1cmVzLiBUaHVzIGEgc2hhcmVkIHBvaW50ZXIgaXMgbmVlZGVkLgorCitjbGFzcyBOYW1lZE9iamVjdCB7CitwdWJsaWM6CisgICAgTmFtZWRPYmplY3QoR2VuTmFtZUluZm8gZ2VuTmFtZUluZm8sCisgICAgICAgICAgICAgICAgR2xvYmFsTmFtZVNwYWNlICpnbG9iYWxOYW1lU3BhY2UpOworICAgIH5OYW1lZE9iamVjdCgpOworICAgIHVuc2lnbmVkIGludCBnZXRHbG9iYWxOYW1lKCkgY29uc3Qge3JldHVybiBtX2dsb2JhbE5hbWU7fQorcHJpdmF0ZToKKyAgICAvLyBtX2dsb2JhbE5hbWUgaXMgdGhlIG5hbWUgZ2VuZXJhdGVkIGJ5IEdQVQorICAgIHVuc2lnbmVkIGludCBtX2dsb2JhbE5hbWUgPSAwOworICAgIE5hbWVkT2JqZWN0VHlwZSBtX3R5cGU7CisgICAgR2xvYmFsTmFtZVNwYWNlICptX2dsb2JhbE5hbWVTcGFjZTsKK307CisKK3R5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPE5hbWVkT2JqZWN0PiBOYW1lZE9iamVjdFB0cjsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL09iamVjdE5hbWVTcGFjZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vT2JqZWN0TmFtZVNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkxMzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL09iamVjdE5hbWVTcGFjZS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgIkdMY29tbW9uL05hbWVkT2JqZWN0LmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxPYmplY3RMb2NhbE5hbWUsIE5hbWVkT2JqZWN0UHRyPiBOYW1lc01hcDsKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVuc2lnbmVkIGludCwgT2JqZWN0TG9jYWxOYW1lPiBHbG9iYWxUb0xvY2FsTmFtZXNNYXA7CisKK2NsYXNzIEdsb2JhbE5hbWVTcGFjZTsKKworLy8KKy8vIENsYXNzIE5hbWVTcGFjZSAtIHRoaXMgY2xhc3MgbWFuYWdlcyBhbGxvY2F0aW9ucyBhbmQgZGVsZXRpb25zIG9mIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgIGZyb20gYSBzaW5nbGUgImxvY2FsIiBuYW1lc3BhY2UgKHByaXZhdGUgdG8gYSBjb250ZXh0IHNoYXJlCisvLyAgICAgICAgICAgICAgICAgICBncm91cCkuIEZvciBlYWNoIGFsbG9jYXRlZCBvYmplY3QgbmFtZSwgYSAiZ2xvYmFsIiBuYW1lIGlzCisvLyAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgYXMgd2VsbCB0byBiZSB1c2VkIGluIHRoZSBzcGFjZSB3aGVyZSBhbGwKKy8vICAgICAgICAgICAgICAgICAgIGNvbnRleHRzIGFyZSBzaGFyZWQuCisvLworLy8gICBOT1RFOiB0aGlzIGNsYXNzIGRvZXMgbm90IHVzZWQgYnkgdGhlIEVHTC9HTEVTIGxheWVyIGRpcmVjdGx5LAorLy8gICAgICAgICB0aGUgRUdML0dMRVMgbGF5ZXIgY3JlYXRlcyBvYmplY3RzIHVzaW5nIHRoZSBTaGFyZUdyb3VwIGNsYXNzCisvLyAgICAgICAgIGludGVyZmFjZSAoc2VlIGJlbG93KS4KK2NsYXNzIE5hbWVTcGFjZQoreworICAgIGZyaWVuZCBjbGFzcyBTaGFyZUdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBHbG9iYWxOYW1lU3BhY2U7CisKK3ByaXZhdGU6CisgICAgTmFtZVNwYWNlKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIEdsb2JhbE5hbWVTcGFjZSAqZ2xvYmFsTmFtZVNwYWNlKTsKKyAgICB+TmFtZVNwYWNlKCk7CisKKyAgICAvLworICAgIC8vIGdlbk5hbWUgLSBjcmVhdGVzIG5ldyBvYmplY3QgaW4gdGhlIG5hbWVzcGFjZSBhbmQgIHJldHVybnMgaXRzIG5hbWUuCisgICAgLy8gICAgICAgICAgIGlmIGdlbkxvY2FsIGlzIGZhbHNlIHRoZW4gdGhlIHNwZWNpZmllZCBwX2xvY2FsTmFtZSB3aWxsIGJlIHVzZWQuCisgICAgLy8gICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxzbyBnZW5lcmF0ZSBhIGdsb2JhbCBuYW1lIGZvciB0aGUgb2JqZWN0LAorICAgIC8vICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbCBuYW1lIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgdGhlCisgICAgLy8gICAgICAgICAgIGdldEdsb2JhbE5hbWUgZnVuY3Rpb24uCisgICAgLy8KKyAgICBPYmplY3RMb2NhbE5hbWUgZ2VuTmFtZShHZW5OYW1lSW5mbyBnZW5OYW1lSW5mbywgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lLCBib29sIGdlbkxvY2FsKTsKKworICAgIC8vCisgICAgLy8gZ2V0R2xvYmFsTmFtZSAtIHJldHVybnMgdGhlIGdsb2JhbCBuYW1lIG9mIGFuIG9iamVjdCBvciAwIGlmIHRoZSBvYmplY3QKKyAgICAvLyAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpbnQgZ2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyBnZXRMb2NhYWxOYW1lIC0gcmV0dXJucyB0aGUgbG9jYWwgbmFtZSBvZiBhbiBvYmplY3Qgb3IgMCBpZiB0aGUgb2JqZWN0CisgICAgLy8gICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorICAgIC8vCisgICAgT2JqZWN0TG9jYWxOYW1lIGdldExvY2FsTmFtZSh1bnNpZ25lZCBpbnQgcF9nbG9iYWxOYW1lKTsKKworICAgIC8vCisgICAgLy8gZ2V0TmFtZWRPYmplY3QgLSByZXR1cm5zIHRoZSBzaGFyZWQgcG9pbnRlciBvZiBhbiBvYmplY3Qgb3IgbnVsbCBpZiB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9iamVjdCBkb2VzIG5vdCBleGlzdC4KKyAgICBOYW1lZE9iamVjdFB0ciBnZXROYW1lZE9iamVjdChPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyBkZWxldGVOYW1lIC0gZGVsZXRlcyBhbmQgb2JqZWN0IGZyb20gdGhlIG5hbWVzcGFjZSBhcyB3ZWxsIGFzIGl0cworICAgIC8vICAgICAgICAgICAgICBnbG9iYWwgbmFtZSBmcm9tIHRoZSBnbG9iYWwgbmFtZSBzcGFjZS4KKyAgICAvLworICAgIHZvaWQgZGVsZXRlTmFtZShPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyBpc09iamVjdCAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZWQgb2JqZWN0IGV4aXN0LgorICAgIC8vCisgICAgYm9vbCBpc09iamVjdChPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyByZXBsYWNlcyBhbiBvYmplY3QgdG8gbWFwIHRvIGFuIGV4aXN0aW5nIGdsb2JhbCBvYmplY3QKKyAgICAvLworICAgIHZvaWQgcmVwbGFjZUdsb2JhbE9iamVjdChPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUsIE5hbWVkT2JqZWN0UHRyIHBfbmFtZWRPYmplY3QpOworCitwcml2YXRlOgorICAgIE9iamVjdExvY2FsTmFtZSBtX25leHROYW1lID0gMDsKKyAgICBOYW1lc01hcCBtX2xvY2FsVG9HbG9iYWxNYXA7CisgICAgR2xvYmFsVG9Mb2NhbE5hbWVzTWFwIG1fZ2xvYmFsVG9Mb2NhbE1hcDsKKyAgICBjb25zdCBOYW1lZE9iamVjdFR5cGUgbV90eXBlOworICAgIEdsb2JhbE5hbWVTcGFjZSAqbV9nbG9iYWxOYW1lU3BhY2UgPSBudWxscHRyOworfTsKKworLy8gQ2xhc3MgR2xvYmFsTmFtZVNwYWNlIC0gdGhpcyBjbGFzcyBtYWludGFpbiBhbGwgZ2xvYmFsIEdMIG9iamVjdCBuYW1lcy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGNvbnRhaW5lZCBpbiB0aGUgRWdsRGlzcGxheS4gT25lIGVtdWxhdG9yIGhhcworLy8gICAgICAgICAgICAgICAgICAgICAgICAgb25seSBvbmUgR2xvYmFsTmFtZVNwYWNlLgorY2xhc3MgR2xvYmFsTmFtZVNwYWNlCit7CitwdWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIE5hbWVkT2JqZWN0OworcHJpdmF0ZToKKyAgICBlbXVnbDo6TXV0ZXggbV9sb2NrOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL1BhbGV0dGVUZXh0dXJlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9QYWxldHRlVGV4dHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjIwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9QYWxldHRlVGV4dHVyZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9fUEFMRVRURV9URVhUVVJFX0hfXworI2RlZmluZSBfX1BBTEVUVEVfVEVYVFVSRV9IX18KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2RlZmluZSBNQVhfU1VQUE9SVEVEX1BBTEVUVEUgMTAKKwordW5zaWduZWQgY2hhciogdW5jb21wcmVzc1RleHR1cmUoR0xlbnVtIGludGVybmFsZm9ybWF0LEdMZW51bSYgZm9ybWF0T3V0LEdMc2l6ZWkgd2lkdGgsR0xzaXplaSBoZWlnaHQsR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSxHTGludCBsZXZlbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vUmFuZ2VNYW5pcC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vUmFuZ2VNYW5pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTYyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9SYW5nZU1hbmlwLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgUkFOR0VfSAorI2RlZmluZSBSQU5HRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIFJhbmdlIHsKKworcHVibGljOgorICAgIFJhbmdlKCk6bV9zdGFydCgwKSxtX2VuZCgwKSxtX3NpemUoMCl7fTsKKyAgICBSYW5nZShpbnQgc3RhcnQsaW50IHNpemUpOm1fc3RhcnQoc3RhcnQpLG1fZW5kKHN0YXJ0K3NpemUpLG1fc2l6ZShzaXplKXt9OworICAgIFJhbmdlKGNvbnN0IFJhbmdlJiByKTptX3N0YXJ0KHIubV9zdGFydCksbV9lbmQoci5tX2VuZCksbV9zaXplKHIubV9zaXplKXt9OworICAgIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LGludCBzaXplKXttX3N0YXJ0ID0gc3RhcnQ7IG1fZW5kID0gc3RhcnQrc2l6ZTsgbV9zaXplID0gc2l6ZTt9OworICAgIGlubGluZSBpbnQgZ2V0U3RhcnQoKSBjb25zdHtyZXR1cm4gbV9zdGFydDt9OworICAgIGlubGluZSBpbnQgZ2V0RW5kKCkgY29uc3R7cmV0dXJuIG1fZW5kO307CisgICAgaW5saW5lIGludCBnZXRTaXplKCkgY29uc3R7cmV0dXJuIG1fc2l6ZTt9OworICAgIFJhbmdlJiBvcGVyYXRvcj0oY29uc3QgUmFuZ2UmIHIpIHsKKyAgICAgICAgbV9zdGFydCA9IHIubV9zdGFydDsKKyAgICAgICAgbV9lbmQgPSByLm1fZW5kOworICAgICAgICBtX3NpemUgPSByLm1fc2l6ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IFJhbmdlJiByKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3N0YXJ0ID09IHIubV9zdGFydCAmJiBtX3NpemUgPT0gci5tX3NpemUgJiYgbV9lbmQgPT0gci5tX2VuZDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAhPShjb25zdCBSYW5nZSYgcikgY29uc3Qge3JldHVybiAhKCgqdGhpcykgPT0gcik7fTsKKyAgICBib29sIHJhbmdlSW50ZXJzZWN0aW9uKGNvbnN0IFJhbmdlJiByLFJhbmdlJiByT3V0KSBjb25zdCA7CisgICAgYm9vbCByYW5nZVVuaW9uKGNvbnN0IFJhbmdlJiByLFJhbmdlJiByT3V0KSBjb25zdCA7CisKK3ByaXZhdGU6CisgICAgaW50IG1fc3RhcnQ7CisgICAgaW50IG1fZW5kOworICAgIGludCBtX3NpemU7Cit9OworCitjbGFzcyBSYW5nZUxpc3QgeworcHVibGljOgorICAgICAgdm9pZCBhZGRSYW5nZShjb25zdCBSYW5nZSYgcik7CisgICAgICB2b2lkIGFkZFJhbmdlcyhjb25zdCBSYW5nZUxpc3QmIHJsKTsKKyAgICAgIHZvaWQgZGVsUmFuZ2UoY29uc3QgUmFuZ2UmIHIsUmFuZ2VMaXN0JiBkZWxldGVkKTsKKyAgICAgIHZvaWQgZGVsUmFuZ2VzKGNvbnN0IFJhbmdlTGlzdCYgcmwsUmFuZ2VMaXN0JiBkZWxldGVkKTsKKyAgICAgIGJvb2wgZW1wdHkoKSBjb25zdDsKKyAgICAgIHZvaWQgbWVyZ2UoKTsKKyAgICAgIGludCAgc2l6ZSgpIGNvbnN0OworICAgICAgdm9pZCBjbGVhcigpOworICAgICAgUmFuZ2UmIG9wZXJhdG9yW10odW5zaWduZWQgaW50IGkpe3JldHVybiBsaXN0W2ldO307Citwcml2YXRlOgorICB2b2lkIGVyYXNlKHVuc2lnbmVkIGludCBpKTsKKyAgc3RkOjp2ZWN0b3I8UmFuZ2U+IGxpc3Q7Cit9OworCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL1RleHR1cmVVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vVGV4dHVyZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1NmM0NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL1RleHR1cmVVdGlscy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9URVhUVVJFX1VUSUxTX0gKKyNkZWZpbmUgX1RFWFRVUkVfVVRJTFNfSAorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlICJHTEVTY29udGV4dC5oIgorI2luY2x1ZGUgIlBhbGV0dGVUZXh0dXJlLmgiCisjaW5jbHVkZSAiZXRjLmgiCisKK2ludCBnZXRDb21wcmVzc2VkRm9ybWF0cyhpbnQqIGZvcm1hdHMpOwordm9pZCAgZG9Db21wcmVzc2VkVGV4SW1hZ2UyRChHTEVTY29udGV4dCAqIGN0eCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgdm9pZCAqIGZ1bmNQdHIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL1RyYW5zbGF0b3JJZmFjZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL1RyYW5zbGF0b3JJZmFjZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZiMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vVHJhbnNsYXRvcklmYWNlcy5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBUUkFOU0xBVE9SX0lGQUNFU19ICisjZGVmaW5lIFRSQU5TTEFUT1JfSUZBQ0VTX0gKKworI2luY2x1ZGUgIkdMY29tbW9uL29iamVjdE5hbWVNYW5hZ2VyLmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzMvZ2wzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitleHRlcm4gIkMiIHsKKworLyogVGhpcyBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gcG9pbnRlciB0eXBlLCB3aG9zZSBuYW1lIGluZGljYXRlcyBpdCBtdXN0CisgKiBiZSBjYXN0IHRvIHRoZSBwcm9wZXIgdHlwZSAqYW5kIGNhbGxpbmcgY29udmVudGlvbiogYmVmb3JlIHVzZS4KKyAqLwordHlwZWRlZiB2b2lkICgqX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CisgIF9fdHJhbnNsYXRvck11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGFkZHJlc3M7Cit9IEV4dGVuc2lvbkRlc2NyaXB0b3I7CisKK2NsYXNzIFRleHR1cmVEYXRhIDogcHVibGljIE9iamVjdERhdGEKK3sKK3B1YmxpYzoKKyAgICBUZXh0dXJlRGF0YSgpOiAgT2JqZWN0RGF0YShURVhUVVJFX0RBVEEpLAorICAgICAgICAgICAgICAgICAgICB3aWR0aCgwKSwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KDApLAorICAgICAgICAgICAgICAgICAgICBib3JkZXIoMCksCisgICAgICAgICAgICAgICAgICAgIGludGVybmFsRm9ybWF0KEdMX1JHQkEpLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2VFR0xJbWFnZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgd2FzQm91bmQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICByZXF1aXJlc0F1dG9NaXBtYXAoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQoMCkgeworICAgICAgICBtZW1zZXQoY3JvcF9yZWN0LDAsNCpzaXplb2YoaW50KSk7CisgICAgfTsKKworICAgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0OworICAgIHVuc2lnbmVkIGludCBib3JkZXI7CisgICAgdW5zaWduZWQgaW50IGludGVybmFsRm9ybWF0OworICAgIHVuc2lnbmVkIGludCBzb3VyY2VFR0xJbWFnZTsKKyAgICBib29sIHdhc0JvdW5kOworICAgIGJvb2wgcmVxdWlyZXNBdXRvTWlwbWFwOworICAgIGludCAgICAgICAgICBjcm9wX3JlY3RbNF07CisgICAgR0xlbnVtIHRhcmdldDsKK307CisKK3N0cnVjdCBFZ2xJbWFnZQoreworICAgIH5FZ2xJbWFnZSgpe307CisgICAgdW5zaWduZWQgaW50IGltYWdlSWQ7CisgICAgTmFtZWRPYmplY3RQdHIgZ2xvYmFsVGV4T2JqOworICAgIHVuc2lnbmVkIGludCB3aWR0aDsKKyAgICB1bnNpZ25lZCBpbnQgaGVpZ2h0OworICAgIHVuc2lnbmVkIGludCBpbnRlcm5hbEZvcm1hdDsKKyAgICB1bnNpZ25lZCBpbnQgYm9yZGVyOworfTsKKwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8RWdsSW1hZ2U+IEltYWdlUHRyOwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8dW5zaWduZWQgaW50LCBJbWFnZVB0cj4gSW1hZ2VzSG5kbE1hcDsKKworY2xhc3MgR0xFU2NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmluaXRHTEVTeCkoKTsKKyAgICBHTEVTY29udGV4dCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNyZWF0ZUdMRVNDb250ZXh0KSgpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaW5pdENvbnRleHQpKEdMRVNjb250ZXh0KixTaGFyZUdyb3VwUHRyKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRlbGV0ZUdMRVNDb250ZXh0KShHTEVTY29udGV4dCopOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZmx1c2gpKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmaW5pc2gpKCk7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpzZXRTaGFyZUdyb3VwKShHTEVTY29udGV4dCosU2hhcmVHcm91cFB0cik7CisgICAgX190cmFuc2xhdG9yTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgKCpnZXRQcm9jQWRkcmVzcykoY29uc3QgY2hhciopOworICAgIEdMc3luYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZmVuY2VTeW5jKShHTGVudW0sIEdMYml0ZmllbGQpOworICAgIEdMZW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY2xpZW50V2FpdFN5bmMpKEdMc3luYywgR0xiaXRmaWVsZCwgR0x1aW50NjQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVsZXRlU3luYykoR0xzeW5jKTsKK31HTEVTaWZhY2U7CisKK2NsYXNzIEdsTGlicmFyeTsKKworLy8gQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBmdW5jdGlvbiBwb2ludGVycyBpbXBsZW1lbnRlZCBieSB0aGUgRUdMCisvLyB0cmFuc2xhdG9yIGxpYnJhcnksIGFuZCBjYWxsZWQgZnJvbSB0aGUgR0xFUyAxLnggYW5kIDIuMCB0cmFuc2xhdG9yCisvLyBsaWJyYXJpZXMuCitzdHJ1Y3QgRUdMaWZhY2UgeworICAgIC8vIEdldCB0aGUgY3VycmVudCBHTEVTQ29udGV4dCBpbnN0YW5jZSBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIEdMRVNjb250ZXh0KiAoKmdldEdMRVNDb250ZXh0KSgpOworCisgICAgLy8gUmV0cmlldmUgYSBzaGFyZWQgcG9pbnRlciB0byBhIGdsb2JhbCBFZ2xJbWFnZSBvYmplY3QgbmFtZWQgfGltYWdlSWR8CisgICAgSW1hZ2VQdHIgICAgKCpnZXRFR0xJbWFnZSkodW5zaWduZWQgaW50IGltYWdlSWQpOworCisgICAgLy8gUmV0dXJuIGluc3RhbmNlIG9mIEdsTGlicmFyeSBjbGFzcyB0byB1c2UgZm9yIGRpc3BhdGNoLgorICAgIC8vIGF0IHJ1bnRpbWUuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIEVHTCBsaWJyYXJ5IGJlY2F1c2Ugb24gV2luZG93cworICAgIC8vIGFsbCBmdW5jdGlvbnMgcmV0dXJuZWQgYnkgd2dsR2V0UHJvY0FkZHJlc3MoKSBhcmUgY29udGV4dC1kZXBlbmRlbnQhCisgICAgR2xMaWJyYXJ5KiAoKmVnbEdldEdsTGlicmFyeSkoKTsKK307CisKK3R5cGVkZWYgR0xFU2lmYWNlKiAoKl9fdHJhbnNsYXRvcl9nZXRHTEVTSWZhY2VGdW5jKShjb25zdCBFR0xpZmFjZSopOworCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL2V0Yy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUvR0xjb21tb24vZXRjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMDUzNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL2V0Yy5oCkBAIC0wLDAgKzEsMTA4IEBACisvLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIF9fZXRjMV9oX18KKyNkZWZpbmUgX19ldGMxX2hfXworCisjZGVmaW5lIE1BWF9FVENfU1VQUE9SVEVEIDEKKworI2RlZmluZSBFVEMxX0VOQ09ERURfQkxPQ0tfU0laRSA4CisjZGVmaW5lIEVUQzFfREVDT0RFRF9CTE9DS19TSVpFIDQ4CisKKyNpZm5kZWYgRVRDMV9SR0I4X09FUworI2RlZmluZSBFVEMxX1JHQjhfT0VTIDB4OEQ2NAorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBldGMxX2J5dGU7Cit0eXBlZGVmIGludCBldGMxX2Jvb2w7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBldGMxX3VpbnQzMjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBFbmNvZGUgYSBibG9jayBvZiBwaXhlbHMuCisvLworLy8gcEluIGlzIGEgcG9pbnRlciB0byBhIEVUQ19ERUNPREVEX0JMT0NLX1NJWkUgYXJyYXkgb2YgYnl0ZXMgdGhhdCByZXByZXNlbnQgYQorLy8gNCB4IDQgc3F1YXJlIG9mIDMtYnl0ZSBwaXhlbHMgaW4gZm9ybSBSLCBHLCBCLiBCeXRlICgzICogKHggKyA0ICogeSkgaXMgdGhlIFIKKy8vIHZhbHVlIG9mIHBpeGVsICh4LCB5KS4KKy8vCisvLyB2YWxpZFBpeGVsTWFzayBpcyBhIDE2LWJpdCBtYXNrIHdoZXJlIGJpdCAoMSA8PCAoeCArIHkgKiA0KSkgaW5kaWNhdGVzIHdoZXRoZXIKKy8vIHRoZSBjb3JyZXNwb25kaW5nICh4LHkpIHBpeGVsIGlzIHZhbGlkLiBJbnZhbGlkIHBpeGVsIGNvbG9yIHZhbHVlcyBhcmUgaWdub3JlZCB3aGVuIGNvbXByZXNzaW5nLgorLy8KKy8vIHBPdXQgaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCisKK3ZvaWQgZXRjMV9lbmNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHZhbGlkUGl4ZWxNYXNrLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBEZWNvZGUgYSBibG9jayBvZiBwaXhlbHMuCisvLworLy8gcEluIGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgorLy8KKy8vIHBPdXQgaXMgYSBwb2ludGVyIHRvIGEgRVRDX0RFQ09ERURfQkxPQ0tfU0laRSBhcnJheSBvZiBieXRlcyB0aGF0IHJlcHJlc2VudCBhCisvLyA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIuIEJ5dGUgKDMgKiAoeCArIDQgKiB5KSBpcyB0aGUgUgorLy8gdmFsdWUgb2YgcGl4ZWwgKHgsIHkpLgorCit2b2lkIGV0YzJfZGVjb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGVuY29kZWQgaW1hZ2UgZGF0YSAoZG9lcyBub3QgaW5jbHVkZSBzaXplIG9mIFBLTSBoZWFkZXIpLgorCitldGMxX3VpbnQzMiBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZShldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KTsKKworLy8gRW5jb2RlIGFuIGVudGlyZSBpbWFnZS4KKy8vIHBJbiAtIHBvaW50ZXIgdG8gdGhlIGltYWdlIGRhdGEuIEZvcm1hdHRlZCBzdWNoIHRoYXQKKy8vICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5OworLy8gcE91dCAtIHBvaW50ZXIgdG8gZW5jb2RlZCBkYXRhLiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgZW5jb2RlZCBpbWFnZS4KKy8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCisvLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorCitpbnQgZXRjMV9lbmNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCisgICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlLCBldGMxX2J5dGUqIHBPdXQpOworCisvLyBEZWNvZGUgYW4gZW50aXJlIGltYWdlLgorLy8gcEluIC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuCisvLyBwT3V0IC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gV2lsbCBiZSB3cml0dGVuIHN1Y2ggdGhhdAorLy8gICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5LiBNdXN0IGJlCisvLyAgICAgICAgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBpbWFnZS4KKy8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCisvLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorCitpbnQgZXRjMl9kZWNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCwKKyAgICAgICAgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKKyAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUpOworCisvLyBTaXplIG9mIGEgUEtNIGhlYWRlciwgaW4gYnl0ZXMuCisKKyNkZWZpbmUgRVRDX1BLTV9IRUFERVJfU0laRSAxNgorCisvLyBGb3JtYXQgYSBQS00gaGVhZGVyCisKK3ZvaWQgZXRjMV9wa21fZm9ybWF0X2hlYWRlcihldGMxX2J5dGUqIHBIZWFkZXIsIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpOworCisvLyBDaGVjayBpZiBhIFBLTSBoZWFkZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4KKworZXRjMV9ib29sIGV0YzFfcGttX2lzX3ZhbGlkKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcik7CisKKy8vIFJlYWQgdGhlIGltYWdlIHdpZHRoIGZyb20gYSBQS00gaGVhZGVyCisKK2V0YzFfdWludDMyIGV0YzFfcGttX2dldF93aWR0aChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOworCisvLyBSZWFkIHRoZSBpbWFnZSBoZWlnaHQgZnJvbSBhIFBLTSBoZWFkZXIKKworZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X2hlaWdodChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlL0dMY29tbW9uL29iamVjdE5hbWVNYW5hZ2VyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9vYmplY3ROYW1lTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTgxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL1RyYW5zbGF0b3IvaW5jbHVkZS9HTGNvbW1vbi9vYmplY3ROYW1lTWFuYWdlci5oCkBAIC0wLDAgKzEsMTk5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfT0JKRUNUX05BTUVfTUFOQUdFUl9ICisjZGVmaW5lIF9PQkpFQ1RfTkFNRV9NQU5BR0VSX0gKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9tdXRleC5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zbWFydF9wdHIuaCIKKyNpbmNsdWRlICJHTGNvbW1vbi9OYW1lZE9iamVjdC5oIgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitlbnVtIE9iamVjdERhdGFUeXBlIHsKKyAgICBTSEFERVJfREFUQSwKKyAgICBQUk9HUkFNX0RBVEEsCisgICAgVEVYVFVSRV9EQVRBLAorICAgIEJVRkZFUl9EQVRBLAorICAgIFVOREVGSU5FRF9EQVRBCit9OworCitjbGFzcyBPYmplY3REYXRhCit7CitwdWJsaWM6CisgICAgT2JqZWN0RGF0YShPYmplY3REYXRhVHlwZSB0eXBlID0gVU5ERUZJTkVEX0RBVEEpOiBtX2RhdGFUeXBlKHR5cGUpIHt9CisgICAgT2JqZWN0RGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7IHJldHVybiBtX2RhdGFUeXBlOyB9OworICAgIHZpcnR1YWwgfk9iamVjdERhdGEoKSA9IGRlZmF1bHQ7Citwcml2YXRlOgorICAgIE9iamVjdERhdGFUeXBlIG1fZGF0YVR5cGU7Cit9OwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8T2JqZWN0RGF0YT4gT2JqZWN0RGF0YVB0cjsKKworY2xhc3MgR2xvYmFsTmFtZVNwYWNlOworY2xhc3MgTmFtZVNwYWNlOworCisvLworLy8gY2xhc3MgU2hhcmVHcm91cCAtCisvLyAgIFRoYXQgY2xhc3MgbWFuYWdlcyBvYmplY3RzIG9mIG9uZSAibG9jYWwiIGNvbnRleHQgc2hhcmUgZ3JvdXAsIHR5cGljYWxseQorLy8gICB0aGVyZSB3aWxsIGJlIG9uZSBpbmN0YW5jZSBvZiBTaGFyZUdyb3VwIGZvciBlYWNoIHVzZXIgT3BlbkdMIGNvbnRleHQKKy8vICAgdW5sZXNzIHRoZSB1c2VyIGNvbnRleHQgc2hhcmUgd2l0aCBhbm90aGVyIHVzZXIgY29udGV4dC4gSW4gdGhhdCBjYXNlIHRoZXkKKy8vICAgYm90aCB3aWxsIHNoYXJlIHRoZSBzYW1lIFNoYXJlR3JvdXAgaW5zdGFuY2UuCisvLyAgIGNhbGxzIGludG8gdGhhdCBjbGFzcyBnZXRzIHNlcmlhbGl6ZWQgdGhyb3VnaCBhIGxvY2sgc28gaXQgaXMgdGhyZWFkIHNhZmUuCisvLworY2xhc3MgU2hhcmVHcm91cAoreworICAgIGZyaWVuZCBjbGFzcyBPYmplY3ROYW1lTWFuYWdlcjsKK3B1YmxpYzoKKyAgICB+U2hhcmVHcm91cCgpOworCisgICAgLy8KKyAgICAvLyBnZW5OYW1lIC0gZ2VuZXJhdGVzIG5ldyBvYmplY3QgbmFtZSBhbmQgcmV0dXJucyBpdHMgbmFtZSB2YWx1ZS4KKyAgICAvLyAgICAgICAgICAgaWYgZ2VuTG9jYWwgaXMgZmFsc2UsIHBfbG9jYWxOYW1lIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZS4KKyAgICAvLyAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBhbHNvIGdlbmVyYXRlcyBhICJnbG9iYWwiIG5hbWUgZm9yIHRoZSBvYmplY3QKKyAgICAvLyAgICAgICAgICAgd2hpY2ggY2FuIGJlIHF1ZXJpZWQgdXNpbmcgdGhlIGdldEdsb2JhbE5hbWUgZnVuY3Rpb24uCisgICAgT2JqZWN0TG9jYWxOYW1lIGdlbk5hbWUoR2VuTmFtZUluZm8gZ2VuTmFtZUluZm8sIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSA9IDAsIGJvb2wgZ2VuTG9jYWw9IGZhbHNlKTsKKyAgICAvLyAgICAgICAgICAgb3ZlcmxvYWQgZm9yIGdlbmVyYXRpbmcgbm9uLXNoYWRlciBvYmplY3QKKyAgICBPYmplY3RMb2NhbE5hbWUgZ2VuTmFtZShOYW1lZE9iamVjdFR5cGUgbmFtZWRPYmplY3RUeXBlLCBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUgPSAwLCBib29sIGdlbkxvY2FsPSBmYWxzZSk7CisgICAgLy8gICAgICAgICAgIG92ZXJsb2FkIGZvciBnZW5lcmF0aW5nIHNoYWRlciAvIHByb2dyYW0gb2JqZWN0CisgICAgT2JqZWN0TG9jYWxOYW1lIGdlbk5hbWUoU2hhZGVyUHJvZ3JhbVR5cGUgc2hhZGVyUHJvZ3JhbVR5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSA9IDAsIGJvb2wgZ2VuTG9jYWw9IGZhbHNlKTsKKworICAgIC8vCisgICAgLy8gZ2V0R2xvYmFsTmFtZSAtIHJldHJpZXZlcyB0aGUgImdsb2JhbCIgbmFtZSBvZiBhbiBvYmplY3Qgb3IgMCBpZiB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICAgb2JqZWN0IGRvZXMgbm90IGV4aXN0LgorICAgIC8vCisgICAgdW5zaWduZWQgaW50IGdldEdsb2JhbE5hbWUoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lKTsKKworICAgIC8vCisgICAgLy8gZ2V0TG9jYWxOYW1lIC0gcmV0cmlldmVzIHRoZSAibG9jYWwiIG5hbWUgb2YgYW4gb2JqZWN0IG9yIDAgaWYgdGhlCisgICAgLy8gICAgICAgICAgICAgICAgIG9iamVjdCBkb2VzIG5vdCBleGlzdC4KKyAgICAvLworICAgIE9iamVjdExvY2FsTmFtZSBnZXRMb2NhbE5hbWUoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwgdW5zaWduZWQgaW50IHBfZ2xvYmFsTmFtZSk7CisKKyAgICAvLworICAgIC8vIGdldE5hbWVkT2JqZWN0IC0gcmV0dXJucyB0aGUgc21hcnQgcG9pbnRlciBvZiBhbiBvYmplY3Qgb3IgbnVsbCBpZiB0aGUKKyAgICAvLyAgICAgICAgICAgICAgICAgIG9iamVjdCBkb2VzIG5vdCBleGlzdC4KKyAgICBOYW1lZE9iamVjdFB0ciBnZXROYW1lZE9iamVjdChOYW1lZE9iamVjdFR5cGUgcF90eXBlLCBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyBkZWxldGVOYW1lIC0gZGVsZXRlcyBhbmQgb2JqZWN0IGZyb20gdGhlIG5hbWVzcGFjZSBhcyB3ZWxsIGFzIGl0cworICAgIC8vICAgICAgICAgICAgICBnbG9iYWwgbmFtZSBmcm9tIHRoZSBnbG9iYWwgbmFtZSBzcGFjZS4KKyAgICAvLworICAgIHZvaWQgZGVsZXRlTmFtZShOYW1lZE9iamVjdFR5cGUgcF90eXBlLCBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUpOworCisgICAgLy8KKyAgICAvLyByZXBsYWNlR2xvYmFsTmFtZSAtIHJlcGxhY2VzIGFuIG9iamVjdCB0byBtYXAgdG8gYW4gZXhpc3RpbmcgZ2xvYmFsCisgICAgLy8gICAgICAgIG5hbWVkIG9iamVjdC4gKHVzZWQgd2hlbiBjcmVhdGluZyBFR0xJbWFnZSBzaWJsaW5ncykKKyAgICAvLworICAgIHZvaWQgcmVwbGFjZUdsb2JhbE9iamVjdChOYW1lZE9iamVjdFR5cGUgcF90eXBlLCBPYmplY3RMb2NhbE5hbWUgcF9sb2NhbE5hbWUsIE5hbWVkT2JqZWN0UHRyIHBfZ2xvYmFsT2JqZWN0KTsKKworICAgIC8vCisgICAgLy8gaXNPYmplY3QgLSByZXR1cm5zIHRydWUgaWYgdGhlIG5hbWVkIG9iamVjdCBleGlzdC4KKyAgICAvLworICAgIGJvb2wgaXNPYmplY3QoTmFtZWRPYmplY3RUeXBlIHBfdHlwZSwgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lKTsKKworICAgIC8vCisgICAgLy8gQXNzaWduIG9iamVjdCBnbG9iYWwgZGF0YSB0byBhIG5hbWVzIG9iamVjdAorICAgIC8vCisgICAgdm9pZCBzZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSwgT2JqZWN0RGF0YVB0ciBkYXRhKTsKKworICAgIC8vCisgICAgLy8gUmV0cmlldmUgb2JqZWN0IGdsb2JhbCBkYXRhCisgICAgLy8KKyAgICBPYmplY3REYXRhKiBnZXRPYmplY3REYXRhKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSk7CisgICAgT2JqZWN0RGF0YVB0ciBnZXRPYmplY3REYXRhUHRyKE5hbWVkT2JqZWN0VHlwZSBwX3R5cGUsIE9iamVjdExvY2FsTmFtZSBwX2xvY2FsTmFtZSk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgU2hhcmVHcm91cChHbG9iYWxOYW1lU3BhY2UgKmdsb2JhbE5hbWVTcGFjZSk7CisKKyAgICB2b2lkIGxvY2tPYmplY3REYXRhKCk7CisgICAgdm9pZCB1bmxvY2tPYmplY3REYXRhKCk7CisKKyAgICAvLyBBIFJBSUkgYXV0b2xvY2sgY2xhc3MgZm9yIHRoZSBvYmplY3REYXRhIHNwaW5sb2NrLgorICAgIHN0cnVjdCBPYmplY3REYXRhQXV0b0xvY2s7CisKK3ByaXZhdGU6CisgICAgY29uc3QgT2JqZWN0RGF0YVB0ciYgZ2V0T2JqZWN0RGF0YVB0ck5vTG9jayhOYW1lZE9iamVjdFR5cGUgcF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TG9jYWxOYW1lIHBfbG9jYWxOYW1lKTsKKworICAgIGVtdWdsOjpNdXRleCBtX25hbWVzcGFjZUxvY2s7CisgICAgTmFtZVNwYWNlKiBtX25hbWVTcGFjZVtzdGF0aWNfY2FzdDxpbnQ+KE5hbWVkT2JqZWN0VHlwZTo6TlVNX09CSkVDVF9UWVBFUyldOworCisgICAgLy8gfG1fb2JqZWN0c0RhdGF8IGhhcyBubyBtZWFzdXJlZCBkYXRhIHJhY2VzLCBzbyByZXBsYWNlIGhlYXZ5d2VpZ2h0IG11dGV4CisgICAgLy8gd2l0aCBhIHNpbXBsZSBzcGlubG9jayAtIGp1c3QgaW4gY2FzZSBpZiB0aGVyZSdzIHNvbWUgbWlzc2VkCisgICAgLy8gbXVsdGktdGhyZWFkZWQgYWNjZXNzIHBhdGguCisgICAgLy8gVE9ETyh6eXlAKTogQ3JlYXRlIGEgY29tbW9uIHNwaW5sb2NrIGNsYXNzLgorICAgIHN0ZDo6YXRvbWljX2ZsYWcgbV9vYmplY3RzRGF0YUxvY2sgPSBBVE9NSUNfRkxBR19JTklUOworICAgIHZvaWQgKm1fb2JqZWN0c0RhdGEgPSBudWxscHRyOworfTsKKwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8U2hhcmVHcm91cD4gU2hhcmVHcm91cFB0cjsKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHZvaWQqLCBTaGFyZUdyb3VwUHRyPiBTaGFyZUdyb3Vwc01hcDsKKworLy8KKy8vIE9iamVjdE5hbWVNYW5hZ2VyIC0KKy8vICAgVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBzZXQgb2YgYWxsIFNoYXJlR3JvdXBzIGluc3RhbmNlcywKKy8vICAgZWFjaCBTaGFyZUdyb3VwIGluc3RhbmNlIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIG9uZSBvciBtb3JlICdncm91cE5hbWUnCisvLyAgIHZhbHVlcy4gdGhlIHR5cGUgb2YgJ2dyb3VwTmFtZScgaXMgdm9pZCAqLCB0aGUgaW50ZW50IGlzIHRoYXQgdGhlIEVHTAorLy8gICBsYXllciB3aWxsIHVzZSB0aGUgdXNlciBjb250ZXh0IGhhbmRsZSBhcyB0aGUgbmFtZSBmb3IgaXRzIFNoYXJlR3JvdXAKKy8vICAgb2JqZWN0LiBNdWx0aXBsZSBuYW1lcyBjYW4gYmUgYXR0YWNoZWQgdG8gYSBTaGFyZUdyb3VwIG9iamVjdCB0byBzdXBwb3J0CisvLyAgIHVzZXIgY29udGV4dCBzaGFyaW5nLgorLy8KK2NsYXNzIE9iamVjdE5hbWVNYW5hZ2VyCit7CitwdWJsaWM6CisgICAgZXhwbGljaXQgT2JqZWN0TmFtZU1hbmFnZXIoR2xvYmFsTmFtZVNwYWNlICpnbG9iYWxOYW1lU3BhY2UpOworCisgICAgLy8KKyAgICAvLyBjcmVhdGVTaGFyZUdyb3VwIC0gY3JlYXRlIGEgbmV3IFNoYXJlR3JvdXAgb2JqZWN0IGFuZCBhdHRhY2ggaXQgd2l0aAorICAgIC8vICAgICAgICAgICAgICAgICAgICB0aGUgIm5hbWUiIHNwZWNpZmllZCBieSBwX2dyb3VwTmFtZS4KKyAgICAvLworICAgIFNoYXJlR3JvdXBQdHIgY3JlYXRlU2hhcmVHcm91cCh2b2lkICpwX2dyb3VwTmFtZSk7CisKKyAgICAvLworICAgIC8vIGF0dGFjaFNoYXJlR3JvdXAgLSBmaW5kIHRoZSBTaGFyZUdyb3VwIG9iamVjdCBhdHRhY2hlZCB0byB0aGUgbmFtZQorICAgIC8vICAgIHNwZWNpZmllZCBpbiBwX2V4aXN0aW5nR3JvdXBOYW1lIGFuZCBhdHRhY2ggcF9ncm91cE5hbWUgdG8gdGhlIHNhbWUKKyAgICAvLyAgICBTaGFyZUdyb3VwIGluc3RhbmNlLgorICAgIC8vCisgICAgU2hhcmVHcm91cFB0ciBhdHRhY2hTaGFyZUdyb3VwKHZvaWQgKnBfZ3JvdXBOYW1lLCB2b2lkICpwX2V4aXN0aW5nR3JvdXBOYW1lKTsKKworICAgIC8vCisgICAgLy8gZ2V0U2hhcmVHcm91cCAtIHJldHJlaXZlIGEgU2hhcmVHcm91cCBvYmplY3QgYmFzZWQgb24gaXRzICJuYW1lIgorICAgIC8vCisgICAgU2hhcmVHcm91cFB0ciBnZXRTaGFyZUdyb3VwKHZvaWQgKnBfZ3JvdXBOYW1lKTsKKworICAgIC8vCisgICAgLy8gZGVsZXRlU2hhcmVHcm91cCAtIGRlbGV0ZXMgdGhlIGF0dGFjaG1lbnQgb2YgdGhlIHBfZ3JvdXBOYW1lIHRvIGl0cworICAgIC8vICAgICAgICAgICBhdHRhY2hlZCBTaGFyZUdyb3VwLiBXaGVuIHRoZSBsYXN0IG5hbWUgb2YgU2hhcmVHcm91cCBpcworICAgIC8vICAgICAgICAgICBkZWxldGVkIHRoZSBTaGFyZUdyb3VwIG9iamVjdCBpcyBkZXN0cm95ZWQuCisgICAgLy8KKyAgICB2b2lkIGRlbGV0ZVNoYXJlR3JvdXAodm9pZCAqcF9ncm91cE5hbWUpOworCisgICAgLy8KKyAgICAvLyAgZ2V0R2xvYmFsQ29udGV4dCgpIC0gdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmFtZSBvZiBhbiBleGlzdGluZworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBTaGFyZUdyb3VwLiBUaGUgaW50ZW50IGlzIHRoYXQgdGhlIEVHTCBsYXllciB3aWxsCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGF0IGZ1bmN0aW9uIHRvIGdldCB0aGUgR0wgY29udGV4dCB3aGljaCBlYWNoCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgIG5ldyBjb250ZXh0IG5lZWRzIHRvIHNoYXJlIHdpdGguCisgICAgLy8KKyAgICB2b2lkICpnZXRHbG9iYWxDb250ZXh0KCk7CisKK3ByaXZhdGU6CisgICAgU2hhcmVHcm91cHNNYXAgbV9ncm91cHM7CisgICAgZW11Z2w6Ok11dGV4IG1fbG9jazsKKyAgICBHbG9iYWxOYW1lU3BhY2UgKm1fZ2xvYmFsTmFtZVNwYWNlID0gbnVsbHB0cjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL0FuZHJvaWQubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjE3NDFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitHTEVTX1RSX0RJUj1nbGVzCitDT01NT05fRElSPWNvbW1vbgorCitHTEVTX1RSX0NQUFM9JHtHTEVTX1RSX0RJUn0vYXBpX2VudHJpZXMuY3BwIFwKKyAgICAgICAgICAgICAke0dMRVNfVFJfRElSfS9idWZmZXJfZGF0YS5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L2RlYnVnLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vZWdsX2ltYWdlLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vZnJhbWVidWZmZXJfZGF0YS5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L2dsZXMxX3NoYWRlcl9nZW5lcmF0b3IuY3BwIFwKKyAgICAgICAgICAgICAke0dMRVNfVFJfRElSfS9nbGVzX2NvbnRleHQuY3BwIFwKKyAgICAgICAgICAgICAke0dMRVNfVFJfRElSfS9nbGVzX3ZhbGlkYXRlLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vbWF0cml4LmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vcGFsZXR0ZWRfdGV4dHVyZV91dGlsLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vcGFzc190aHJvdWdoLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vcHJvZ3JhbV9kYXRhLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vcHJvZ3JhbV92YXJpYW50LmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vcmVuZGVyYnVmZmVyX2RhdGEuY3BwIFwKKyAgICAgICAgICAgICAke0dMRVNfVFJfRElSfS9zaGFkZXJfZGF0YS5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L3NoYWRlcl92YXJpYW50LmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vc2hhcmVfZ3JvdXAuY3BwIFwKKyAgICAgICAgICAgICAke0dMRVNfVFJfRElSfS9zdGF0ZS5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L3RleHR1cmVfY29kZWNzLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vdGV4dHVyZV9kYXRhLmNwcCBcCisgICAgICAgICAgICAgJHtHTEVTX1RSX0RJUn0vdW5pZm9ybV92YWx1ZS5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L3ZlY3Rvci5jcHAgXAorICAgICAgICAgICAgICR7R0xFU19UUl9ESVJ9L3RyYW5zbGF0b3JfaW50ZXJmYWNlLmNwcCBcCisgICAgICAgICAgICAgJHtDT01NT05fRElSfS9sb2cuY3BwIFwKKyAgICAgICAgICAgICAke0NPTU1PTl9ESVJ9L2V0YzEuY3BwIFwKKyAgICAgICAgICAgICAke0NPTU1PTl9ESVJ9L1JlZkJhc2UuY3BwCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1zaGFyZWQtbGlicmFyeSxsaWIkKEJVSUxEX1RBUkdFVF9TVUZGSVgpR0xFUzEyVHJhbnNsYXRvcikKKworJChjYWxsIGVtdWdsLWltcG9ydCxsaWJHTEVTdjFfZGVjIGxpYk9wZW5nbENvZGVjQ29tbW9uKQorCitMT0NBTF9TUkNfRklMRVMgOj0gJChHTEVTX1RSX0NQUFMpCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChFTVVHTF9QQVRIKS9ob3N0L2luY2x1ZGUpCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChMT0NBTF9QQVRIKSkKKworTE9DQUxfQ19JTkNMVURFUyArPSAuLyAuL2luY2x1ZGUKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZW11Z2xfY29tbW9uCisKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ0ZMQUdTLCQoRU1VR0xfVVNFUl9DRkxBR1MpKQorCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9SRUFETUUuVFhUIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL1JFQURNRS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxMjg4MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9SRUFETUUuVFhUCkBAIC0wLDAgKzEsODkgQEAKKz09PT09Z2xlczE9PT09PWdsZXMxPj4+Pj5FbXVsYXRvciBHTEVTdjEtPjIgVHJhbnNsYXRvcj4+Pj4+Z2xlczI9PT09PWdsZXMyPT09PT0KKworTm90IGV2ZXJ5IHJlbmRlcmluZyBiYWNrZW5kIHRoYXQgdGhlIGVtdWxhdG9yIHN1cHBvcnRzIHdpbGwgc3VwcG9ydCBHTEVTdjEuCitGb3IgZXhhbXBsZSwgQU5HTEUgb25seSBzdXBwb3J0cyBHTEVTdjIuCisKK1dlIG5lZWQgYSBHTEVTdjEtPkdMRVN2MiB0cmFuc2xhdGlvbiBsYXllciBpbiBvcmRlciB0byB0YWtlIGNhcmUgb2YgR0xFU3YxIHVzZQorY2FzZXMuCisKK1RoaXMgbGlicmFyeSwgbGliR0xFUzEyVHJhbnNsYXRvciwgaXMgYSBnZW5lcmFsIHNvbHV0aW9uIHdoZXJlIGlmIG91cgorY3VycmVudGx5LXV0aWxpemVkIEdMRVMgYmFja2VuZCAoc3VjaCBhcyBBTkdMRSkgZG9lcyBub3QgcHJvdmlkZSBsaWJHTEVTX0NNLmRsbAorKHRoZSBHTEVTdjEgZGxsKSwgbGliR0xFUzEyVHJhbnNsYXRvciB3aWxsIGJlIHVzZWQgaW5zdGVhZCwgYW5kIGhvb2sgaW50byB0aGUKK3VuZGVybHlpbmcgbGliRUdMLmRsbCBhbmQgbGliR0xFU3YyLmRsbC4KKworPT09PT1nbGVzMT09PT09Z2xlczE+Pj4+PldoZXJlIHRoaXMgY2FtZSBmcm9tIG9yaWdpbmFsbHk+Pj5nbGVzMj09PT09Z2xlczI9PT09PQorCitUaGUgR0xFU3YxLT4yIHRyYW5zbGF0b3IgaW4gdGhpcyBsaWJyYXJ5IGlzIGRlcml2ZWQgZnJvbSB0aGUKK21vZHMvZ3JhcGhpY3NfdHJhbnNsYXRpb24gaW4gQVJDLCBBbmRyb2lkIFJ1bnRpbWUgZm9yIENocm9tZS4KKworQVJDIGlzIGZvciBydW5uaW5nIEFuZHJvaWQgYXBwcyBpbiBDaHJvbWUgYW5kIGhhcyBhIEdMRVN2MS0+MiB0cmFuc2xhdG9yIHRoYXQKK2lzIHVzZWQgdG8gdHJhbnNsYXRlIEFuZHJvaWQgR0xFU3YxIGFwcHMgdG8gcnVuIG9uIHRoZSB1bmRlcmx5aW5nIFdlYkdMIChvcgorQU5HTEUpIHdoaWNoIGlzIG9ubHkgR0xFU3YyLgorCitNb3JlIGluZm9ybWF0aW9uICsgdGhlIG9yaWdpbmFsIHNvdXJjZSBjYW4gYmUgZm91bmQgZnJvbSB0aGUgQ2hyb21pdW0gZ2l0IHJlcG8KK2F0CisKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9hcmMvYXJjLworCit1bmRlciB0aGUgZGlyZWN0b3J5IG1vZHMvZ3JhcGhpY3NfdHJhbnNsYXRpb24uCisKK0EgYml0IG9mIGhpc3RvcnkgZm9yIGNvZGUgYXJjaGFlb2xvZ3kgcHVycG9zZXM6CisKK1RoaXMgaXMgYWxsIGJhc2VkIG9uIGEgcHJldmlvdXMgZWZmb3J0IHRvIHBvcnQgR0xFU3YxLT4yIHRyYW5zbGF0b3IgdG8gdGhlCitlbXVsYXRvci4gIFRoYXQgZWZmb3J0IGl0c2VsZiB3YXMgYmFzZWQgb2ZmIG9mIHRoZSBtYXN0ZXIgYnJhbmNoIG9mIHRoZSBBUkMKK3JlcG8gYXJvdW5kIHRoYXQgdGltZS4KKworVGhlIGNsb3Nlc3QgdmVyc2lvbiBvZiB0aGUgYXJjIHJlcG9zaXRvcnkgaGFzIGJlZW4gdGhlIG1hc3RlciBicmFuY2ggYXMgb2YKK2Fyb3VuZCB0aGUgZW5kIG9mIFNlcHRlbWJlciAyMDE1LiBOb3QgbWFueSBjaGFuZ2VzIHdlcmUgaGFwcGVuaW5nIGluIEFSQyBhcm91bmQKK3RoYXQgdGltZTsgd2UgY2FuIGNvbnNpZGVyIHRoaXMgT2N0b2JlciA2LCAyMDE1IHZlcnNpb24gb2YgYXJjOgorCitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vYXJjL2FyYy8rLzAxNjgwNmUxNzJlNzE0OWJhNDJlOWI2OWUwZWM4NzZiMWU4OThhNGUKKworYXMgdGhlIGNhbm9uaWNhbCBBUkMgdmVyc2lvbiBvZmYgb2Ygd2hpY2ggd2UgYmFzZSB0aGlzIEdMRVN2MS0+MiB0cmFuc2xhdG9yLgorSW4gZmFjdCwgZ3JhcGhpY3NfdHJhbnNsYXRpb24gaXRzZWxmIGhhZCBubyBjaGFuZ2VzIHdoYXRzb3ZlciBzaW5jZSBTZXB0IDEwLAorMjAxNSB1bnRpbCBhdCBsZWFzdCBKdW5lIDIzLCAyMDE2LgorCis9PT09PWdsZXMxPT09PT1nbGVzMT4+Pj4+QW4gRUdMLWxlc3Mgc29sdXRpb24+Pj4+Pj4+Pj4+Pj4+PmdsZXMyPT09PT1nbGVzMj09PT09CisKK1RoZXJlIGlzIG9uZSBoZWF2eSBtb2RpZmljYXRpb24gdG8gdGhlIHRyYW5zbGF0b3IgdGhhdCB0aGVzZSBDTHMgZG8sIGFuZCBpdCBpcwordG8gcmVtb3ZlIHRoZSBFR0wgbWFjaGluZXJ5IGZyb20gZ3JhcGhpY3NfdHJhbnNsYXRpb24uICBUaGUgZWdsLyBzdWJkaXJlY3RvcnkKK29mIHRoZSBvcmlnaW5hbCBncmFwaGljc190cmFuc2xhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCisKK1RoZSBpZGVhIGlzIHRoYXQgaW4gbGliT3BlbmdsUmVuZGVyIG9uIHRoZSBob3N0LCB3ZSBhbHJlYWR5IGhhdmUgc3VmZmljaWVudAoraW5mb3JtYXRpb24gdG8gdGVsbCBncmFwaGljc190cmFuc2xhdGlvbiBldmVyeXRoaW5nIHdpdGhvdXQgbmVlZGluZworZ3JhcGhpY3NfdHJhbnNsYXR0aW9uIHRvIGhhdmUgYW4gRUdMIGNvbXBvbmVudC4KKworZ2xlczEydHIuZW50cmllcyBpbiBsaWJPcGVuR0xFU0Rpc3BhdGNoIGNvbnRhaW5zIHRoZSBleHRyYSBlbnRyeSBwb2ludHMgdGhhdAord2UgbmVlZCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGtlZXAgdGhlIEdMRVN2MSBlbXVsYXRvciBvbiB0cmFjay4KKworPT09PT1nbGVzMT09PT09Z2xlczE+Pj4+PkxpbmtpbmcgdW5kZXJseWluZyBHTEVTdjI+Pj4+Pj4+Pj5nbGVzMj09PT09Z2xlczI9PT09PQorCitJbiBvcmRlciB0byBlbXVsYXRlIEdMRVN2MSBvbiB0b3Agb2YgR0xFU3YyLCB0aGlzIEdMRVN2MS0+MiB0cmFuc2xhdGlvbiBsaWJyYXJ5CitleHBlY3RzIHRoZSBwcmVzZW5jZSBvZiBhY3R1YWwgaW1wbGVtZW50YXRpb24gR0xFU3YyIEFQSS4gV2hlbiB3ZSBhcmUgdXNpbmcKK0dMRVN2MSBlbXVsYXRpb24sIHdlIG5lZWQgdG8gbGluayBhZ2FpbnN0IEdMRVN2MiBmdW5jdGlvbnMuIFRoZSBlbnRyeSBwb2ludAorY3JlYXRlX3VuZGVybHlpbmdfYXBpIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RydWN0IHRoYXQgd2lsbCBob2xkIHRoZQorbmVjZXNzYXJ5IEdMRVN2MiBmdW5jdGlvbnMsIHdoaWNoIHdlIHRoZW4gbGluayBhdCBydW50aW1lLiBUaGUgR0xFU3YxIGVtdWxhdGlvbgorbGlicmFyeSB0aGVuIG5vdGljZXMgd2hhdCB3ZSBsaW5rZWQgd2hlbiB3ZSBwYXNzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCB0bworR0xFU3YxIGNvbnRleHQgY3JlYXRpb24gY2FsbHMuCisKKz09PT09Z2xlczE9PT09PWdsZXMxPj4+Pj5DdXJyZW50IHN0YXRlIG9mIHRoZSBsaWJyYXJ5Pj4+Pj4+Z2xlczI9PT09PWdsZXMyPT09PT0KKworVGhlIGxpYnJhcnkgY2FuIG5vdyBiZSB1c2VkLiBXaGVuIGEgY3VzdG9tIE9wZW5HTCBiYWNrZW5kIChlLmcuLCAtZ3B1IGFuZ2xlIG9yCistZ3B1IHN3aWZ0c2hhZGVyKSBpcyB1c2VkLCBpZiB0aGF0IGJhY2tlbmQgZG9lcyBub3QgcHJvdmlkZSB0aGUgbGliR0xFU19DTS5kbGwKK2luIGFkZGl0aW9uIHRvIHRoZSB1c3VhbCBsaWJFR0wuZGxsIGFuZCBsaWJHTEVTdjIuZGxsLCB3ZSB3aWxsIGF1dG9tYXRpY2FsbHkKK2ZhbGwgYmFjayB0byBHTEVTdjEgZW11bGF0aW9uIHVzaW5nIHRoaXMgR0xFU3YxLT4yIHRyYW5zbGF0aW9uIGxpYnJhcnkuCisKKz09PT09Z2xlczE9PT09PWdsZXMxPj4+Pj5Lbm93biBJc3N1ZXMgLyBXSVAgT3Bwb3J0dW5pdGllcz4+Z2xlczI9PT09PWdsZXMyPT09PT0KKworUmlnaHQgbm93LCB0aGlzIHRyYW5zbGF0aW9uIGxpYnJhcnkgc2VlbXMgdG8gbmVlZCB0byB1c2UgQVJDJ3MgUmVmQmFzZSBhbmQKK1N0cm9uZ1BvaW50ZXIgaW4gb3JkZXIgdG8gbm90IGNyYXNoIGR1cmluZyB1c2UgKGZyb20gc21va2UgdGVzdHMgZG9uZSBieQorZXhwZXJpbWVudGFsbHkgaG9va2luZyB1cCB0aGUgbGlicmFyeSB0byB0aGUgZW11bGF0b3IpLgorCitUaGVyZSBhcmUgdmFyaW91cyByZW5kZXJpbmcgZXJyb3JzOgorCisgICAgLSBUZXh0dXJlLWJpbGxib2FyZHMgZG9uJ3Qgc2VlbSB0byB3b3JrIGNvcnJlY3RseSwgYXMgaW4gdGhlIGJvb3QgYW5pbWF0aW9uCisgICAgICBhbmQgdGhlIEdMRVN2MSBBUEkgZGVtb3Mgc3VjaCBhcyBTcHJpdGUgVGV4dC4gVGhlIHRleHR1cmVzIHNpbXBseSBkb24ndAorICAgICAgc2hvdyB1cC4KKworICAgIC0gT25seSBHTF9TTU9PVEggaXMgYXZhaWxhYmxlIGFzIGEgc2hhZGluZyBwYXJhbWV0ZXIsIHdoaWNoIG1ha2VzIHRoZSBLdWJlCisgICAgICBBUEkgZGVtbyBsb29rIGZ1bm55LgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9SZWZCYXNlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9jb21tb24vUmVmQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyOGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9jb21tb24vUmVmQmFzZS5jcHAKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlJlZkJhc2UiCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dHlwZWluZm8+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2lmbmRlZiBfX3VudXNlZAorI2RlZmluZSBfX3VudXNlZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbmRpZgorCisvLyBjb21waWxlIHdpdGggcmVmY291bnRpbmcgZGVidWdnaW5nIGVuYWJsZWQKKyNkZWZpbmUgREVCVUdfUkVGUyAgICAgICAgICAgICAgICAgICAgICAwCisKKy8vIHdoZXRoZXIgcmVmLXRyYWNraW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgaWYgbm90LCB0cmFja01lKHRydWUsIGZhbHNlKQorLy8gbmVlZHMgdG8gYmUgY2FsbGVkIGV4cGxpY2l0bHkKKyNkZWZpbmUgREVCVUdfUkVGU19FTkFCTEVEX0JZX0RFRkFVTFQgICAwCisKKy8vIHdoZXRoZXIgY2FsbHN0YWNrIGFyZSBjb2xsZWN0ZWQgKHNpZ25pZmljYW50bHkgc2xvd3MgdGhpbmdzIGRvd24pCisjZGVmaW5lIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgICAgMAorCisvLyBmb2xkZXIgd2hlcmUgc3RhY2sgdHJhY2VzIGFyZSBzYXZlZCB3aGVuIERFQlVHX1JFRlMgaXMgZW5hYmxlZAorLy8gdGhpcyBmb2xkZXIgbmVlZHMgdG8gZXhpc3QgYW5kIGJlIHdyaXRhYmxlCisjZGVmaW5lIERFQlVHX1JFRlNfQ0FMTFNUQUNLX1BBVEggICAgICAgIi90bXAiCisKKy8vIGxvZyBhbGwgcmVmZXJlbmNlIGNvdW50aW5nIG9wZXJhdGlvbnMKKyNkZWZpbmUgUFJJTlRfUkVGUyAgICAgICAgICAgICAgICAgICAgICAwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgSU5JVElBTF9TVFJPTkdfVkFMVUUgKDE8PDI4KQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVmQmFzZTo6d2Vha3JlZl9pbXBsIDogcHVibGljIFJlZkJhc2U6OndlYWtyZWZfdHlwZQoreworcHVibGljOgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+ICAgIG1TdHJvbmc7CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gICAgbVdlYWs7CisgICAgUmVmQmFzZSogY29uc3QgICAgICBtQmFzZTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiAgICBtRmxhZ3M7CisKKyNpZiAhREVCVUdfUkVGUworCisgICAgd2Vha3JlZl9pbXBsKFJlZkJhc2UqIGJhc2UpCisgICAgICAgIDogbVN0cm9uZyhJTklUSUFMX1NUUk9OR19WQUxVRSkKKyAgICAgICAgLCBtV2VhaygwKQorICAgICAgICAsIG1CYXNlKGJhc2UpCisgICAgICAgICwgbUZsYWdzKDApCisgICAgeworICAgIH0KKworICAgIHZvaWQgYWRkU3Ryb25nUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykgeyB9CisgICAgdm9pZCByZW1vdmVTdHJvbmdSZWYoY29uc3Qgdm9pZCogLyppZCovKSB7IH0KKyAgICB2b2lkIHJlbmFtZVN0cm9uZ1JlZklkKGNvbnN0IHZvaWQqIC8qb2xkX2lkKi8sIGNvbnN0IHZvaWQqIC8qbmV3X2lkKi8pIHsgfQorICAgIHZvaWQgYWRkV2Vha1JlZihjb25zdCB2b2lkKiAvKmlkKi8pIHsgfQorICAgIHZvaWQgcmVtb3ZlV2Vha1JlZihjb25zdCB2b2lkKiAvKmlkKi8pIHsgfQorICAgIHZvaWQgcmVuYW1lV2Vha1JlZklkKGNvbnN0IHZvaWQqIC8qb2xkX2lkKi8sIGNvbnN0IHZvaWQqIC8qbmV3X2lkKi8pIHsgfQorICAgIHZvaWQgcHJpbnRSZWZzKCkgY29uc3QgeyB9CisgICAgdm9pZCB0cmFja01lKGJvb2wsIGJvb2wpIHsgfQorCisjZWxzZQorCisgICAgd2Vha3JlZl9pbXBsKFJlZkJhc2UqIGJhc2UpCisgICAgICAgIDogbVN0cm9uZyhJTklUSUFMX1NUUk9OR19WQUxVRSkKKyAgICAgICAgLCBtV2VhaygwKQorICAgICAgICAsIG1CYXNlKGJhc2UpCisgICAgICAgICwgbUZsYWdzKDApCisgICAgICAgICwgbVN0cm9uZ1JlZnMoTlVMTCkKKyAgICAgICAgLCBtV2Vha1JlZnMoTlVMTCkKKyAgICAgICAgLCBtVHJhY2tFbmFibGVkKCEhREVCVUdfUkVGU19FTkFCTEVEX0JZX0RFRkFVTFQpCisgICAgICAgICwgbVJldGFpbihmYWxzZSkKKyAgICB7CisgICAgfQorCisgICAgfndlYWtyZWZfaW1wbCgpCisgICAgeworI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKKyAgICAgICAgYm9vbCBkdW1wU3RhY2sgPSBmYWxzZTsKKyNlbmRpZgorICAgICAgICBpZiAoIW1SZXRhaW4gJiYgbVN0cm9uZ1JlZnMgIT0gTlVMTCkgeworI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKKyAgICAgICAgZHVtcFN0YWNrID0gdHJ1ZTsKKyNlbmRpZgorICAgICAgICAgICAgQUxPR0UoIlN0cm9uZyByZWZlcmVuY2VzIHJlbWFpbjoiKTsKKyAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmcyA9IG1TdHJvbmdSZWZzOworICAgICAgICAgICAgd2hpbGUgKHJlZnMpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGluYyA9IHJlZnMtPnJlZiA+PSAwID8gJysnIDogJy0nOworICAgICAgICAgICAgICAgIEFMT0dEKCJcdCVjIElEICVwIChyZWYgJWQpOiIsIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7CisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAorICAgICAgICAgICAgICAgIHJlZnMtPnN0YWNrLmxvZyhMT0dfVEFHKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtUmV0YWluICYmIG1XZWFrUmVmcyAhPSBOVUxMKSB7CisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAorICAgICAgICAgICAgZHVtcFN0YWNrID0gdHJ1ZTsKKyNlbmRpZgorICAgICAgICAgICAgQUxPR0UoIldlYWsgcmVmZXJlbmNlcyByZW1haW4hIik7CisgICAgICAgICAgICByZWZfZW50cnkqIHJlZnMgPSBtV2Vha1JlZnM7CisgICAgICAgICAgICB3aGlsZSAocmVmcykgeworICAgICAgICAgICAgICAgIGNoYXIgaW5jID0gcmVmcy0+cmVmID49IDAgPyAnKycgOiAnLSc7CisgICAgICAgICAgICAgICAgQUxPR0QoIlx0JWMgSUQgJXAgKHJlZiAlZCk6IiwgaW5jLCByZWZzLT5pZCwgcmVmcy0+cmVmKTsKKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVECisgICAgICAgICAgICAgICAgcmVmcy0+c3RhY2subG9nKExPR19UQUcpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmVmcyA9IHJlZnMtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBERUJVR19SRUZTX0NBTExTVEFDS19FTkFCTEVECisgICAgICAgIGlmIChkdW1wU3RhY2spIHsKKyAgICAgICAgICAgIEFMT0dFKCJhYm92ZSBlcnJvcnMgYXQ6Iik7CisgICAgICAgICAgICBDYWxsU3RhY2sgc3RhY2soTE9HX1RBRyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgYWRkU3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKSB7CisgICAgICAgIC8vQUxPR0RfSUYobVRyYWNrRW5hYmxlZCwKKyAgICAgICAgLy8gICAgICAgICJhZGRTdHJvbmdSZWY6IFJlZkJhc2U9JXAsIGlkPSVwIiwgbUJhc2UsIGlkKTsKKyAgICAgICAgYWRkUmVmKCZtU3Ryb25nUmVmcywgaWQsIG1TdHJvbmcpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlU3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKSB7CisgICAgICAgIC8vQUxPR0RfSUYobVRyYWNrRW5hYmxlZCwKKyAgICAgICAgLy8gICAgICAgICJyZW1vdmVTdHJvbmdSZWY6IFJlZkJhc2U9JXAsIGlkPSVwIiwgbUJhc2UsIGlkKTsKKyAgICAgICAgaWYgKCFtUmV0YWluKSB7CisgICAgICAgICAgICByZW1vdmVSZWYoJm1TdHJvbmdSZWZzLCBpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRSZWYoJm1TdHJvbmdSZWZzLCBpZCwgLW1TdHJvbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW5hbWVTdHJvbmdSZWZJZChjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkgeworICAgICAgICAvL0FMT0dEX0lGKG1UcmFja0VuYWJsZWQsCisgICAgICAgIC8vICAgICAgICAicmVuYW1lU3Ryb25nUmVmSWQ6IFJlZkJhc2U9JXAsIG9pZD0lcCwgbmlkPSVwIiwKKyAgICAgICAgLy8gICAgICAgIG1CYXNlLCBvbGRfaWQsIG5ld19pZCk7CisgICAgICAgIHJlbmFtZVJlZnNJZChtU3Ryb25nUmVmcywgb2xkX2lkLCBuZXdfaWQpOworICAgIH0KKworICAgIHZvaWQgYWRkV2Vha1JlZihjb25zdCB2b2lkKiBpZCkgeworICAgICAgICBhZGRSZWYoJm1XZWFrUmVmcywgaWQsIG1XZWFrKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZVdlYWtSZWYoY29uc3Qgdm9pZCogaWQpIHsKKyAgICAgICAgaWYgKCFtUmV0YWluKSB7CisgICAgICAgICAgICByZW1vdmVSZWYoJm1XZWFrUmVmcywgaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkUmVmKCZtV2Vha1JlZnMsIGlkLCAtbVdlYWspOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW5hbWVXZWFrUmVmSWQoY29uc3Qgdm9pZCogb2xkX2lkLCBjb25zdCB2b2lkKiBuZXdfaWQpIHsKKyAgICAgICAgcmVuYW1lUmVmc0lkKG1XZWFrUmVmcywgb2xkX2lkLCBuZXdfaWQpOworICAgIH0KKworICAgIHZvaWQgdHJhY2tNZShib29sIHRyYWNrLCBib29sIHJldGFpbikKKyAgICB7CisgICAgICAgIG1UcmFja0VuYWJsZWQgPSB0cmFjazsKKyAgICAgICAgbVJldGFpbiA9IHJldGFpbjsKKyAgICB9CisKKyAgICB2b2lkIHByaW50UmVmcygpIGNvbnN0CisgICAgeworICAgICAgICBzdGQ6OnN0cmluZyB0ZXh0OworCisgICAgICAgIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIF9sKG1NdXRleCk7CisgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICAgICAgc3ByaW50ZihidWYsICJTdHJvbmcgcmVmZXJlbmNlcyBvbiBSZWZCYXNlICVwICh3ZWFrcmVmX3R5cGUgJXApOlxuIiwgbUJhc2UsIHRoaXMpOworICAgICAgICAgICAgdGV4dC5hcHBlbmQoYnVmKTsKKyAgICAgICAgICAgIHByaW50UmVmc0xvY2tlZCgmdGV4dCwgbVN0cm9uZ1JlZnMpOworICAgICAgICAgICAgc3ByaW50ZihidWYsICJXZWFrIHJlZmVyZW5jZXMgb24gUmVmQmFzZSAlcCAod2Vha3JlZl90eXBlICVwKTpcbiIsIG1CYXNlLCB0aGlzKTsKKyAgICAgICAgICAgIHRleHQuYXBwZW5kKGJ1Zik7CisgICAgICAgICAgICBwcmludFJlZnNMb2NrZWQoJnRleHQsIG1XZWFrUmVmcyk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBjaGFyIG5hbWVbMTAwXTsKKyAgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIDEwMCwgREVCVUdfUkVGU19DQUxMU1RBQ0tfUEFUSCAiLyVwLnN0YWNrIiwgdGhpcyk7CisgICAgICAgICAgICBpbnQgcmMgPSBvcGVuKG5hbWUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0FQUEVORCwgNjQ0KTsKKyAgICAgICAgICAgIGlmIChyYyA+PSAwKSB7CisgICAgICAgICAgICAgICAgd3JpdGUocmMsIHRleHQuY19zdHIoKSwgdGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgY2xvc2UocmMpOworICAgICAgICAgICAgICAgIEFMT0dEKCJTVEFDSyBUUkFDRSBmb3IgJXAgc2F2ZWQgaW4gJXMiLCB0aGlzLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgQUxPR0UoIkZBSUxFRCBUTyBQUklOVCBTVEFDSyBUUkFDRSBmb3IgJXAgaW4gJXM6ICVzIiwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHN0cnVjdCByZWZfZW50cnkKKyAgICB7CisgICAgICAgIHJlZl9lbnRyeSogbmV4dDsKKyAgICAgICAgY29uc3Qgdm9pZCogaWQ7CisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAorICAgICAgICBDYWxsU3RhY2sgc3RhY2s7CisjZW5kaWYKKyAgICAgICAgaW50MzJfdCByZWY7CisgICAgfTsKKworICAgIHZvaWQgYWRkUmVmKHJlZl9lbnRyeSoqIHJlZnMsIGNvbnN0IHZvaWQqIGlkLCBpbnQzMl90IG1SZWYpCisgICAgeworICAgICAgICBpZiAobVRyYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrIF9sKG1NdXRleCk7CisKKyAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gbmV3IHJlZl9lbnRyeTsKKyAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBjb3VudCBhdCB0aGUgdGltZSBvZiB0aGUgc25hcHNob3QsIGJ1dCBiZWZvcmUgdGhlCisgICAgICAgICAgICAvLyB1cGRhdGUuICBQb3NpdGl2ZSB2YWx1ZSBtZWFucyB3ZSBpbmNyZW1lbnQsIG5lZ2F0aXZlLS13ZQorICAgICAgICAgICAgLy8gZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQuCisgICAgICAgICAgICByZWYtPnJlZiA9IG1SZWY7CisgICAgICAgICAgICByZWYtPmlkID0gaWQ7CisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAorICAgICAgICAgICAgcmVmLT5zdGFjay51cGRhdGUoMik7CisjZW5kaWYKKyAgICAgICAgICAgIHJlZi0+bmV4dCA9ICpyZWZzOworICAgICAgICAgICAgKnJlZnMgPSByZWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZVJlZihyZWZfZW50cnkqKiByZWZzLCBjb25zdCB2b2lkKiBpZCkKKyAgICB7CisgICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgX2wobU11dGV4KTsKKworICAgICAgICAgICAgcmVmX2VudHJ5KiBjb25zdCBoZWFkID0gKnJlZnM7CisgICAgICAgICAgICByZWZfZW50cnkqIHJlZiA9IGhlYWQ7CisgICAgICAgICAgICB3aGlsZSAocmVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVmLT5pZCA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgICAqcmVmcyA9IHJlZi0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlZjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWZzID0gJnJlZi0+bmV4dDsKKyAgICAgICAgICAgICAgICByZWYgPSAqcmVmczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIlJlZkJhc2U6IHJlbW92aW5nIGlkICVwIG9uIFJlZkJhc2UgJXAiCisgICAgICAgICAgICAgICAgICAgICIod2Vha3JlZl90eXBlICVwKSB0aGF0IGRvZXNuJ3QgZXhpc3QhIiwKKyAgICAgICAgICAgICAgICAgICAgaWQsIG1CYXNlLCB0aGlzKTsKKworICAgICAgICAgICAgcmVmID0gaGVhZDsKKyAgICAgICAgICAgIHdoaWxlIChyZWYpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGluYyA9IHJlZi0+cmVmID49IDAgPyAnKycgOiAnLSc7CisgICAgICAgICAgICAgICAgQUxPR0QoIlx0JWMgSUQgJXAgKHJlZiAlZCk6IiwgaW5jLCByZWYtPmlkLCByZWYtPnJlZik7CisgICAgICAgICAgICAgICAgcmVmID0gcmVmLT5uZXh0OworICAgICAgICAgICAgfQorCisjaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAorICAgIENhbGxTdGFjayBzdGFjayhMT0dfVEFHKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCByZW5hbWVSZWZzSWQocmVmX2VudHJ5KiByLCBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkKKyAgICB7CisgICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7CisgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgX2wobU11dGV4KTsKKyAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gcjsKKyAgICAgICAgICAgIHdoaWxlIChyZWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChyZWYtPmlkID09IG9sZF9pZCkgeworICAgICAgICAgICAgICAgICAgICByZWYtPmlkID0gbmV3X2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgPSByZWYtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHByaW50UmVmc0xvY2tlZChzdGQ6OnN0cmluZyogb3V0LCBjb25zdCByZWZfZW50cnkqIHJlZnMpIGNvbnN0CisgICAgeworICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICB3aGlsZSAocmVmcykgeworICAgICAgICAgICAgY2hhciBpbmMgPSByZWZzLT5yZWYgPj0gMCA/ICcrJyA6ICctJzsKKyAgICAgICAgICAgIHNwcmludGYoYnVmLCAiXHQlYyBJRCAlcCAocmVmICVkKTpcbiIsCisgICAgICAgICAgICAgICAgICAgIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7CisgICAgICAgICAgICBvdXQtPmFwcGVuZChidWYpOworI2lmIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKHJlZnMtPnN0YWNrLnRvU3RyaW5nKCJcdFx0IikpOworI2Vsc2UKKyAgICAgICAgICAgIG91dC0+YXBwZW5kKCJcdFx0KGNhbGwgc3RhY2tzIGRpc2FibGVkKSIpOworI2VuZGlmCisgICAgICAgICAgICByZWZzID0gcmVmcy0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG11dGFibGUgYW5kcm9pZDo6YmFzZTo6TG9jayBtTXV0ZXg7CisgICAgcmVmX2VudHJ5KiBtU3Ryb25nUmVmczsKKyAgICByZWZfZW50cnkqIG1XZWFrUmVmczsKKworICAgIGJvb2wgbVRyYWNrRW5hYmxlZDsKKyAgICAvLyBDb2xsZWN0IHN0YWNrIHRyYWNlcyBvbiBhZGRyZWYgYW5kIHJlbW92ZXJlZiwgaW5zdGVhZCBvZiBkZWxldGluZyB0aGUgc3RhY2sgcmVmZXJlbmNlcworICAgIC8vIG9uIHJlbW92ZXJlZiB0aGF0IG1hdGNoIHRoZSBhZGRyZXNzIG9uZXMuCisgICAgYm9vbCBtUmV0YWluOworCisjZW5kaWYKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFJlZkJhc2U6OmluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QKK3sKKyAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IHJlZnMgPSBtUmVmczsKKyAgICByZWZzLT5pbmNXZWFrKGlkKTsKKworICAgIHJlZnMtPmFkZFN0cm9uZ1JlZihpZCk7CisgICAgY29uc3QgaW50MzJfdCBjID0gcmVmcy0+bVN0cm9uZysrOworICAgIEFMT0dfQVNTRVJUKGMgPiAwLCAiaW5jU3Ryb25nKCkgY2FsbGVkIG9uICVwIGFmdGVyIGxhc3Qgc3Ryb25nIHJlZiIsIHJlZnMpOworI2lmIFBSSU5UX1JFRlMKKyAgICBBTE9HRCgiaW5jU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGMpOworI2VuZGlmCisgICAgaWYgKGMgIT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZWZzLT5tU3Ryb25nLmZldGNoX2FkZCgtSU5JVElBTF9TVFJPTkdfVkFMVUUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIHJlZnMtPm1CYXNlLT5vbkZpcnN0UmVmKCk7Cit9CisKK3ZvaWQgUmVmQmFzZTo6ZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdAoreworICAgIHdlYWtyZWZfaW1wbCogY29uc3QgcmVmcyA9IG1SZWZzOworICAgIHJlZnMtPnJlbW92ZVN0cm9uZ1JlZihpZCk7CisgICAgY29uc3QgaW50MzJfdCBjID0gcmVmcy0+bVN0cm9uZy0tOworI2lmIFBSSU5UX1JFRlMKKyAgICBBTE9HRCgiZGVjU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGMpOworI2VuZGlmCisgICAgQUxPR19BU1NFUlQoYyA+PSAxLCAiZGVjU3Ryb25nKCkgY2FsbGVkIG9uICVwIHRvbyBtYW55IHRpbWVzIiwgcmVmcyk7CisgICAgaWYgKGMgPT0gMSkgeworICAgICAgICByZWZzLT5tQmFzZS0+b25MYXN0U3Ryb25nUmVmKGlkKTsKKyAgICAgICAgaWYgKChyZWZzLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX01BU0spID09IE9CSkVDVF9MSUZFVElNRV9TVFJPTkcpIHsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICB9CisgICAgfQorICAgIHJlZnMtPmRlY1dlYWsoaWQpOworfQorCit2b2lkIFJlZkJhc2U6OmZvcmNlSW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdAoreworICAgIHdlYWtyZWZfaW1wbCogY29uc3QgcmVmcyA9IG1SZWZzOworICAgIHJlZnMtPmluY1dlYWsoaWQpOworCisgICAgcmVmcy0+YWRkU3Ryb25nUmVmKGlkKTsKKyAgICBjb25zdCBpbnQzMl90IGMgPSByZWZzLT5tU3Ryb25nKys7CisgICAgQUxPR19BU1NFUlQoYyA+PSAwLCAiZm9yY2VJbmNTdHJvbmcgY2FsbGVkIG9uICVwIGFmdGVyIHJlZiBjb3VudCB1bmRlcmZsb3ciLAorICAgICAgICAgICAgICAgcmVmcyk7CisjaWYgUFJJTlRfUkVGUworICAgIEFMT0dEKCJmb3JjZUluY1N0cm9uZyBvZiAlcCBmcm9tICVwOiBjbnQ9JWRcbiIsIHRoaXMsIGlkLCBjKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSBJTklUSUFMX1NUUk9OR19WQUxVRToKKyAgICAgICAgcmVmcy0+bVN0cm9uZy5mZXRjaF9hZGQoLUlOSVRJQUxfU1RST05HX1ZBTFVFLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCisgICAgY2FzZSAwOgorICAgICAgICByZWZzLT5tQmFzZS0+b25GaXJzdFJlZigpOworICAgIH0KK30KKworaW50MzJfdCBSZWZCYXNlOjpnZXRTdHJvbmdDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1SZWZzLT5tU3Ryb25nOworfQorCitSZWZCYXNlKiBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OnJlZkJhc2UoKSBjb25zdAoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB3ZWFrcmVmX2ltcGwqPih0aGlzKS0+bUJhc2U7Cit9CisKK3ZvaWQgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjppbmNXZWFrKGNvbnN0IHZvaWQqIGlkKQoreworICAgIHdlYWtyZWZfaW1wbCogY29uc3QgaW1wbCA9IHN0YXRpY19jYXN0PHdlYWtyZWZfaW1wbCo+KHRoaXMpOworICAgIGltcGwtPmFkZFdlYWtSZWYoaWQpOworICAgIGNvbnN0IGludDMyX3QgYyBfX3VudXNlZCA9IGltcGwtPm1XZWFrKys7CisgICAgQUxPR19BU1NFUlQoYyA+PSAwLCAiaW5jV2VhayBjYWxsZWQgb24gJXAgYWZ0ZXIgbGFzdCB3ZWFrIHJlZiIsIHRoaXMpOworfQorCisKK3ZvaWQgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjpkZWNXZWFrKGNvbnN0IHZvaWQqIGlkKQoreworICAgIHdlYWtyZWZfaW1wbCogY29uc3QgaW1wbCA9IHN0YXRpY19jYXN0PHdlYWtyZWZfaW1wbCo+KHRoaXMpOworICAgIGltcGwtPnJlbW92ZVdlYWtSZWYoaWQpOworICAgIGNvbnN0IGludDMyX3QgYyA9IGltcGwtPm1XZWFrLS07CisgICAgQUxPR19BU1NFUlQoYyA+PSAxLCAiZGVjV2VhayBjYWxsZWQgb24gJXAgdG9vIG1hbnkgdGltZXMiLCB0aGlzKTsKKyAgICBpZiAoYyAhPSAxKSByZXR1cm47CisKKyAgICBpZiAoKGltcGwtPm1GbGFncyZPQkpFQ1RfTElGRVRJTUVfV0VBSykgPT0gT0JKRUNUX0xJRkVUSU1FX1NUUk9ORykgeworICAgICAgICAvLyBUaGlzIGlzIHRoZSByZWd1bGFyIGxpZmV0aW1lIGNhc2UuIFRoZSBvYmplY3QgaXMgZGVzdHJveWVkCisgICAgICAgIC8vIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBnb2VzIGF3YXkuIFNpbmNlIHdlYWtyZWZfaW1wbAorICAgICAgICAvLyBvdXRsaXZlIHRoZSBvYmplY3QsIGl0IGlzIG5vdCBkZXN0cm95ZWQgaW4gdGhlIGR0b3IsIGFuZAorICAgICAgICAvLyB3ZSdsbCBoYXZlIHRvIGRvIGl0IGhlcmUuCisgICAgICAgIGlmIChpbXBsLT5tU3Ryb25nID09IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IHdlIG5ldmVyIGhhZCBhIHN0cm9uZyByZWZlcmVuY2UsIHNvIHdlIG5lZWQgdG8KKyAgICAgICAgICAgIC8vIGRlc3Ryb3kgdGhlIG9iamVjdCBub3cuCisgICAgICAgICAgICBkZWxldGUgaW1wbC0+bUJhc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBTE9HVigiRnJlZWluZyByZWZzICVwIG9mIG9sZCBSZWZCYXNlICVwXG4iLCB0aGlzLCBpbXBsLT5tQmFzZSk7CisgICAgICAgICAgICBkZWxldGUgaW1wbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxlc3MgY29tbW9uIGNhc2U6IGxpZmV0aW1lIGlzIE9CSkVDVF9MSUZFVElNRV97V0VBS3xGT1JFVkVSfQorICAgICAgICBpbXBsLT5tQmFzZS0+b25MYXN0V2Vha1JlZihpZCk7CisgICAgICAgIGlmICgoaW1wbC0+bUZsYWdzJk9CSkVDVF9MSUZFVElNRV9NQVNLKSA9PSBPQkpFQ1RfTElGRVRJTUVfV0VBSykgeworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgT0JKRUNUX0xJRkVUSU1FX1dFQUsgY2FzZS4gVGhlIGxhc3Qgd2Vhay1yZWZlcmVuY2UKKyAgICAgICAgICAgIC8vIGlzIGdvbmUsIHdlIGNhbiBkZXN0cm95IHRoZSBvYmplY3QuCisgICAgICAgICAgICBkZWxldGUgaW1wbC0+bUJhc2U7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKQoreworICAgIGluY1dlYWsoaWQpOworCisgICAgd2Vha3JlZl9pbXBsKiBjb25zdCBpbXBsID0gc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyk7CisgICAgaW50MzJfdCBjdXJDb3VudCA9IGltcGwtPm1TdHJvbmc7CisKKyAgICBBTE9HX0FTU0VSVChjdXJDb3VudCA+PSAwLAorICAgICAgICAgICAgImF0dGVtcHRJbmNTdHJvbmcgY2FsbGVkIG9uICVwIGFmdGVyIHVuZGVyZmxvdyIsIHRoaXMpOworCisgICAgd2hpbGUgKGN1ckNvdW50ID4gMCAmJiBjdXJDb3VudCAhPSBJTklUSUFMX1NUUk9OR19WQUxVRSkgeworICAgICAgICAvLyB3ZSdyZSBpbiB0aGUgZWFzeS9jb21tb24gY2FzZSBvZiBwcm9tb3RpbmcgYSB3ZWFrLXJlZmVyZW5jZQorICAgICAgICAvLyBmcm9tIGFuIGV4aXN0aW5nIHN0cm9uZyByZWZlcmVuY2UuCisgICAgICAgIGlmIChpbXBsLT5tU3Ryb25nLmNvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKGN1ckNvdW50LCBjdXJDb3VudCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHRoZSBzdHJvbmcgY291bnQgaGFzIGNoYW5nZWQgb24gdXMsIHdlIG5lZWQgdG8gcmUtYXNzZXJ0IG91cgorICAgICAgICAvLyBzaXR1YXRpb24uCisgICAgICAgIGN1ckNvdW50ID0gaW1wbC0+bVN0cm9uZzsKKyAgICB9CisKKyAgICBpZiAoY3VyQ291bnQgPD0gMCB8fCBjdXJDb3VudCA9PSBJTklUSUFMX1NUUk9OR19WQUxVRSkgeworICAgICAgICAvLyB3ZSdyZSBub3cgaW4gdGhlIGhhcmRlciBjYXNlIG9mIGVpdGhlcjoKKyAgICAgICAgLy8gLSB0aGVyZSBuZXZlciB3YXMgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHVzCisgICAgICAgIC8vIC0gb3IsIGFsbCBzdHJvbmcgcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAgICAgaWYgKChpbXBsLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX1dFQUspID09IE9CSkVDVF9MSUZFVElNRV9TVFJPTkcpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgb2JqZWN0IGhhcyBhICJub3JtYWwiIGxpZmUtdGltZSwgaS5lLjogaXQgZ2V0cyBkZXN0cm95ZWQKKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBnb2VzIGF3YXkKKyAgICAgICAgICAgIGlmIChjdXJDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGxhc3Qgc3Ryb25nLXJlZmVyZW5jZSBnb3QgcmVsZWFzZWQsIHRoZSBvYmplY3QgY2Fubm90CisgICAgICAgICAgICAgICAgLy8gYmUgcmV2aXZlZC4KKyAgICAgICAgICAgICAgICBkZWNXZWFrKGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhlcmUsIGN1ckNvdW50ID09IElOSVRJQUxfU1RST05HX1ZBTFVFLCB3aGljaCBtZWFucworICAgICAgICAgICAgLy8gdGhlcmUgbmV2ZXIgd2FzIGEgc3Ryb25nLXJlZmVyZW5jZSwgc28gd2UgY2FuIHRyeSB0bworICAgICAgICAgICAgLy8gcHJvbW90ZSB0aGlzIG9iamVjdDsgd2UgbmVlZCB0byBkbyB0aGF0IGF0b21pY2FsbHkuCisgICAgICAgICAgICB3aGlsZSAoY3VyQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGltcGwtPm1TdHJvbmcuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoY3VyQ291bnQsIGN1ckNvdW50ICsgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdGhlIHN0cm9uZyBjb3VudCBoYXMgY2hhbmdlZCBvbiB1cywgd2UgbmVlZCB0byByZS1hc3NlcnQgb3VyCisgICAgICAgICAgICAgICAgLy8gc2l0dWF0aW9uIChlLmcuOiBhbm90aGVyIHRocmVhZCBoYXMgaW5jL2RlY1N0cm9uZydlZCB1cykKKyAgICAgICAgICAgICAgICBjdXJDb3VudCA9IGltcGwtPm1TdHJvbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdXJDb3VudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gcHJvbW90ZSgpIGZhaWxlZCwgc29tZSBvdGhlciB0aHJlYWQgZGVzdHJveWVkIHVzIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIG1lYW50aW1lIChpLmUuOiBzdHJvbmcgY291bnQgcmVhY2hlZCB6ZXJvKS4KKyAgICAgICAgICAgICAgICBkZWNXZWFrKGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGlzIG9iamVjdCBoYXMgYW4gImV4dGVuZGVkIiBsaWZlLXRpbWUsIGkuZS46IGl0IGNhbiBiZQorICAgICAgICAgICAgLy8gcmV2aXZlZCBmcm9tIGEgd2Vhay1yZWZlcmVuY2Ugb25seS4KKyAgICAgICAgICAgIC8vIEFzayB0aGUgb2JqZWN0J3MgaW1wbGVtZW50YXRpb24gaWYgaXQgYWdyZWVzIHRvIGJlIHJldml2ZWQKKyAgICAgICAgICAgIGlmICghaW1wbC0+bUJhc2UtPm9uSW5jU3Ryb25nQXR0ZW1wdGVkKEZJUlNUX0lOQ19TVFJPTkcsIGlkKSkgeworICAgICAgICAgICAgICAgIC8vIGl0IGRpZG4ndCBzbyBnaXZlLXVwLgorICAgICAgICAgICAgICAgIGRlY1dlYWsoaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGdyYWIgYSBzdHJvbmctcmVmZXJlbmNlLCB3aGljaCBpcyBhbHdheXMgc2FmZSBkdWUgdG8gdGhlCisgICAgICAgICAgICAvLyBleHRlbmRlZCBsaWZlLXRpbWUuCisgICAgICAgICAgICBjdXJDb3VudCA9IGltcGwtPm1TdHJvbmcrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBzdHJvbmcgcmVmZXJlbmNlIGNvdW50IGhhcyBhbHJlYWR5IGJlZW4gaW5jcmVtZW50ZWQgYnkKKyAgICAgICAgLy8gc29tZW9uZSBlbHNlLCB0aGUgaW1wbGVtZW50b3Igb2Ygb25JbmNTdHJvbmdBdHRlbXB0ZWQoKSBpcyBob2xkaW5nCisgICAgICAgIC8vIGFuIHVubmVlZGVkIHJlZmVyZW5jZS4gIFNvIGNhbGwgb25MYXN0U3Ryb25nUmVmKCkgaGVyZSB0byByZW1vdmUgaXQuCisgICAgICAgIC8vIChObywgdGhpcyBpcyBub3QgcHJldHR5LikgIE5vdGUgdGhhdCB3ZSBNVVNUIE5PVCBkbyB0aGlzIGlmIHdlCisgICAgICAgIC8vIGFyZSBpbiBmYWN0IGFjcXVpcmluZyB0aGUgZmlyc3QgcmVmZXJlbmNlLgorICAgICAgICBpZiAoY3VyQ291bnQgPiAwICYmIGN1ckNvdW50IDwgSU5JVElBTF9TVFJPTkdfVkFMVUUpIHsKKyAgICAgICAgICAgIGltcGwtPm1CYXNlLT5vbkxhc3RTdHJvbmdSZWYoaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaW1wbC0+YWRkU3Ryb25nUmVmKGlkKTsKKworI2lmIFBSSU5UX1JFRlMKKyAgICBBTE9HRCgiYXR0ZW1wdEluY1N0cm9uZyBvZiAlcCBmcm9tICVwOiBjbnQ9JWRcbiIsIHRoaXMsIGlkLCBjdXJDb3VudCk7CisjZW5kaWYKKworICAgIC8vIG5vdyB3ZSBuZWVkIHRvIGZpeC11cCB0aGUgY291bnQgaWYgaXQgd2FzIElOSVRJQUxfU1RST05HX1ZBTFVFCisgICAgLy8gdGhpcyBtdXN0IGJlIGRvbmUgc2FmZWx5LCBpLmUuOiBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc2V2ZXJhbCB0aHJlYWRzCisgICAgLy8gd2VyZSBoZXJlIGluIGF0dGVtcHRJbmNTdHJvbmcoKS4KKyAgICBjdXJDb3VudCA9IGltcGwtPm1TdHJvbmc7CisgICAgd2hpbGUgKGN1ckNvdW50ID49IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKGN1ckNvdW50ID4gSU5JVElBTF9TVFJPTkdfVkFMVUUsCisgICAgICAgICAgICAgICAgImF0dGVtcHRJbmNTdHJvbmcgaW4gJXAgdW5kZXJmbG93ZWQgdG8gSU5JVElBTF9TVFJPTkdfVkFMVUUiLAorICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBpZiAoaW1wbC0+bVN0cm9uZy5jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhjdXJDb3VudCwgY3VyQ291bnQtSU5JVElBTF9TVFJPTkdfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHRoZSBzdHJvbmctY291bnQgY2hhbmdlZCBvbiB1cywgd2UgbmVlZCB0byByZS1hc3NlcnQgdGhlIHNpdHVhdGlvbiwKKyAgICAgICAgLy8gZm9yIGUuZy46IGl0J3MgcG9zc2libGUgdGhlIGZpeC11cCBoYXBwZW5lZCBpbiBhbm90aGVyIHRocmVhZC4KKyAgICAgICAgY3VyQ291bnQgPSBpbXBsLT5tU3Ryb25nOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6YXR0ZW1wdEluY1dlYWsoY29uc3Qgdm9pZCogaWQpCit7CisgICAgd2Vha3JlZl9pbXBsKiBjb25zdCBpbXBsID0gc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyk7CisKKyAgICBpbnQzMl90IGN1ckNvdW50ID0gaW1wbC0+bVdlYWs7CisgICAgQUxPR19BU1NFUlQoY3VyQ291bnQgPj0gMCwgImF0dGVtcHRJbmNXZWFrIGNhbGxlZCBvbiAlcCBhZnRlciB1bmRlcmZsb3ciLAorICAgICAgICAgICAgICAgdGhpcyk7CisgICAgd2hpbGUgKGN1ckNvdW50ID4gMCkgeworICAgICAgICBpZiAoaW1wbC0+bVdlYWsuY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoY3VyQ291bnQsIGN1ckNvdW50KzEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGN1ckNvdW50ID0gaW1wbC0+bVdlYWs7CisgICAgfQorCisgICAgaWYgKGN1ckNvdW50ID4gMCkgeworICAgICAgICBpbXBsLT5hZGRXZWFrUmVmKGlkKTsKKyAgICB9CisKKyAgICByZXR1cm4gY3VyQ291bnQgPiAwOworfQorCitpbnQzMl90IFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6Z2V0V2Vha0NvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3Qgd2Vha3JlZl9pbXBsKj4odGhpcyktPm1XZWFrOworfQorCit2b2lkIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cHJpbnRSZWZzKCkgY29uc3QKK3sKKyAgICBzdGF0aWNfY2FzdDxjb25zdCB3ZWFrcmVmX2ltcGwqPih0aGlzKS0+cHJpbnRSZWZzKCk7Cit9CisKK3ZvaWQgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjp0cmFja01lKGJvb2wgZW5hYmxlLCBib29sIHJldGFpbikKK3sKKyAgICBzdGF0aWNfY2FzdDx3ZWFrcmVmX2ltcGwqPih0aGlzKS0+dHJhY2tNZShlbmFibGUsIHJldGFpbik7Cit9CisKK1JlZkJhc2U6OndlYWtyZWZfdHlwZSogUmVmQmFzZTo6Y3JlYXRlV2Vhayhjb25zdCB2b2lkKiBpZCkgY29uc3QKK3sKKyAgICBtUmVmcy0+aW5jV2VhayhpZCk7CisgICAgcmV0dXJuIG1SZWZzOworfQorCitSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIFJlZkJhc2U6OmdldFdlYWtSZWZzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVJlZnM7Cit9CisKK1JlZkJhc2U6OlJlZkJhc2UoKQorICAgIDogbVJlZnMobmV3IHdlYWtyZWZfaW1wbCh0aGlzKSkKK3sKK30KKworUmVmQmFzZTo6flJlZkJhc2UoKQoreworICAgIGlmIChtUmVmcy0+bVN0cm9uZyA9PSBJTklUSUFMX1NUUk9OR19WQUxVRSkgeworICAgICAgICAvLyB3ZSBuZXZlciBhY3F1aXJlZCBhIHN0cm9uZyAoYW5kL29yIHdlYWspIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdC4KKyAgICAgICAgZGVsZXRlIG1SZWZzOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGxpZmUtdGltZSBvZiB0aGlzIG9iamVjdCBpcyBleHRlbmRlZCB0byBXRUFLIG9yIEZPUkVWRVIsIGluCisgICAgICAgIC8vIHdoaWNoIGNhc2Ugd2Vha3JlZl9pbXBsIGRvZXNuJ3Qgb3V0LWxpdmUgdGhlIG9iamVjdCBhbmQgd2UKKyAgICAgICAgLy8gY2FuIGZyZWUgaXQgbm93LgorICAgICAgICBpZiAoKG1SZWZzLT5tRmxhZ3MgJiBPQkpFQ1RfTElGRVRJTUVfTUFTSykgIT0gT0JKRUNUX0xJRkVUSU1FX1NUUk9ORykgeworICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSB3ZWFrIGNvdW50IGlzIG5vdCAwIGlmIHRoZSBvYmplY3QKKyAgICAgICAgICAgIC8vIHJlLWFjcXVpcmVkIGEgd2VhayByZWZlcmVuY2UgaW4gaXRzIGRlc3RydWN0b3IKKyAgICAgICAgICAgIGlmIChtUmVmcy0+bVdlYWsgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBtUmVmczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBjbGVhciB0aGlzLgorICAgIGNvbnN0X2Nhc3Q8d2Vha3JlZl9pbXBsKiY+KG1SZWZzKSA9IE5VTEw7Cit9CisKK3ZvaWQgUmVmQmFzZTo6ZXh0ZW5kT2JqZWN0TGlmZXRpbWUoaW50MzJfdCBtb2RlKQoreworICAgIG1SZWZzLT5tRmxhZ3MuZmV0Y2hfb3IobW9kZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Cit9CisKK3ZvaWQgUmVmQmFzZTo6b25GaXJzdFJlZigpCit7Cit9CisKK3ZvaWQgUmVmQmFzZTo6b25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykKK3sKK30KKworYm9vbCBSZWZCYXNlOjpvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogLyppZCovKQoreworICAgIHJldHVybiAoZmxhZ3MmRklSU1RfSU5DX1NUUk9ORykgPyB0cnVlIDogZmFsc2U7Cit9CisKK3ZvaWQgUmVmQmFzZTo6b25MYXN0V2Vha1JlZihjb25zdCB2b2lkKiAvKmlkKi8pCit7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgREVCVUdfUkVGUwordm9pZCBSZWZCYXNlOjpyZW5hbWVSZWZzKHNpemVfdCBuLCBjb25zdCBSZWZlcmVuY2VSZW5hbWVyJiByZW5hbWVyKSB7CisgICAgZm9yIChzaXplX3QgaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgICAgIHJlbmFtZXIoaSk7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgUmVmQmFzZTo6cmVuYW1lUmVmcyhzaXplX3QgLypuKi8sIGNvbnN0IFJlZmVyZW5jZVJlbmFtZXImIC8qcmVuYW1lciovKSB7IH0KKyNlbmRpZgorCit2b2lkIFJlZkJhc2U6OnJlbmFtZVJlZklkKHdlYWtyZWZfdHlwZSogcmVmLAorICAgICAgICBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkgeworICAgIHdlYWtyZWZfaW1wbCogY29uc3QgaW1wbCA9IHN0YXRpY19jYXN0PHdlYWtyZWZfaW1wbCo+KHJlZik7CisgICAgaW1wbC0+cmVuYW1lU3Ryb25nUmVmSWQob2xkX2lkLCBuZXdfaWQpOworICAgIGltcGwtPnJlbmFtZVdlYWtSZWZJZChvbGRfaWQsIG5ld19pZCk7Cit9CisKK3ZvaWQgUmVmQmFzZTo6cmVuYW1lUmVmSWQoUmVmQmFzZSogcmVmLAorICAgICAgICBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkgeworICAgIHJlZi0+bVJlZnMtPnJlbmFtZVN0cm9uZ1JlZklkKG9sZF9pZCwgbmV3X2lkKTsKKyAgICByZWYtPm1SZWZzLT5yZW5hbWVXZWFrUmVmSWQob2xkX2lkLCBuZXdfaWQpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9hbG9nLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2Fsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM1NTBjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9hbG9nLmgKQEAgLTAsMCArMSw1NDIgQEAKKy8qIEFSQyBNT0QgVFJBQ0sgInRoaXJkX3BhcnR5L2FuZHJvaWQvc3lzdGVtL2NvcmUvaW5jbHVkZS9sb2cvbG9nLmgiICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLworLy8gQy9DKysgbG9nZ2luZyBmdW5jdGlvbnMuICBTZWUgdGhlIGxvZ2dpbmcgZG9jdW1lbnRhdGlvbiBmb3IgQVBJIGRldGFpbHMuCisvLworLy8gV2UnZCBsaWtlIHRoZXNlIHRvIGJlIGF2YWlsYWJsZSBmcm9tIEMgY29kZSAoaW4gY2FzZSB3ZSBpbXBvcnQgc29tZSBmcm9tCisvLyBzb21ld2hlcmUpLCBzbyB0aGlzIGhhcyBhIEMgaW50ZXJmYWNlLgorLy8KKy8vIFRoZSBvdXRwdXQgd2lsbCBiZSBjb3JyZWN0IHdoZW4gdGhlIGxvZyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlCisvLyB0aHJlYWRzIGFuZC9vciBtdWx0aXBsZSBwcm9jZXNzZXMgc28gbG9uZyBhcyB0aGUgb3BlcmF0aW5nIHN5c3RlbQorLy8gc3VwcG9ydHMgT19BUFBFTkQuICBUaGVzZSBjYWxscyBoYXZlIG11dGV4LXByb3RlY3RlZCBkYXRhIHN0cnVjdHVyZXMKKy8vIGFuZCBzbyBhcmUgTk9UIHJlZW50cmFudC4gIERvIG5vdCB1c2UgTE9HIGluIGEgc2lnbmFsIGhhbmRsZXIuCisvLworLyogQVJDIE1PRCBCRUdJTiAqLworLyogVXNlIHRoZSBzYW1lIGRlZmluZXMgYXMgdGhlIEFuZHJvaWQgaGVhZGVycyB0byBnaXZlIHRoZWlycworICogcHJlY2VkZW5jZSBpZiBib3RoIGZpbGVzIGFyZSB1c2VkLgorICogRm9yIG1vcmUgaW5mbyBvbiBBbmRyb2lkIGxvZ2dpbmcsIHNlZToKKyAqIGh0dHA6Ly9lbGludXgub3JnL0FuZHJvaWRfTG9nZ2luZ19TeXN0ZW0KKyAqLworI2lmbmRlZiBfQ09NTU9OX0FMT0dfSAorI2RlZmluZSBfQ09NTU9OX0FMT0dfSAorCisjaW5jbHVkZSA8Y29tbW9uL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitleHRlcm4gIkMiIHsKKworLy8gVE9ETyhraG1lbCk6IElkZWFsbHkgaW5jbHVkZSBhbmRyb2lkL2xvZy5oIGhlcmUgYW5kIHVzZSB0aGUgQU5EUk9JRAorLy8gdmFsdWVzIGluc3RlYWQuIEJ1dCByZWNlbnQgcHJpdmF0ZS9saWJjX2xvZ2dpbmcuaCBhbHNvIGRlZmluZXMgQU5EUk9JRAorLy8gdmFsdWVzLiBUaGlzIGNhdXNlcyBjb21waWxhdGlvbiBwcm9ibGVtcyBmb3Igc29tZSBmaWxlcyB3aGljaCBpbmNsdWRlIGJvdGgKKy8vIGFsb2cuaCBhbmQgbGliY19sb2dnaW5nLmguCisvLyBUaGVzZSBtdXN0IG1hdGNoIGFuZHJvaWQvbG9nLmggdmFsdWVzLgordHlwZWRlZiBlbnVtIGFyY19Mb2dQcmlvcml0eSB7CisgIEFSQ19MT0dfVU5LTk9XTiA9IDAsCisgIEFSQ19MT0dfREVGQVVMVCwgICAgLyogb25seSBmb3IgU2V0TWluUHJpb3JpdHkoKSAqLworICBBUkNfTE9HX1ZFUkJPU0UsCisgIEFSQ19MT0dfREVCVUcsCisgIEFSQ19MT0dfSU5GTywKKyAgQVJDX0xPR19XQVJOLAorICBBUkNfTE9HX0VSUk9SLAorICBBUkNfTE9HX0ZBVEFMLAorICBBUkNfTE9HX1NJTEVOVCAgICAgLyogb25seSBmb3IgU2V0TWluUHJpb3JpdHkoKTsgbXVzdCBiZSBsYXN0ICovCit9IGFyY19Mb2dQcmlvcml0eTsKKworLyoKKyAqIExvZyBhbiBhc3NlcnRpb24gZmFpbHVyZSBhbmQgU0lHVFJBUCB0aGUgcHJvY2VzcyB0byBoYXZlIGEgY2hhbmNlCisgKiB0byBpbnNwZWN0IGl0LCBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLiBUaGlzIHVzZXMgdGhlIEZBVEFMIHByaW9yaXR5LgorICogSXQgd2lsbCBub3cgYWxzbyBzdWJtaXQgdGhlIGxvZ2dpbmcgc3RhdGVtZW50IHRvZ2V0aGVyIHdpdGggdGhlIGNyYXNoIGxvZworICogKHByb3ZpZGVkIHRoYXQgdGhlIHVzZXIgaGFzIGVuYWJsZWQgY3Jhc2ggcmVwb3J0aW5nKSBhcyBsb25nIGFzIHRoZXkgc2lnbmVkCisgKiBpbiB1c2luZyBhIHRlc3RlciBlbWFpbCBhZGRyZXNzLgorICovCit2b2lkIF9fYW5kcm9pZF9sb2dfYXNzZXJ0X3dpdGhfc291cmNlKGNvbnN0IGNoYXIqIGNvbmQsIGNvbnN0IGNoYXIgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZSwgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZtdCwgLi4uKQorI2lmIGRlZmluZWQoX19HTlVDX18pCisgIF9fYXR0cmlidXRlX18gKChub3JldHVybikpCisgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCA1LCA2KSkpCisjZW5kaWYKKyAgICA7CisKKy8qCisgKiBCZWhhdmVzIHRoZSBzYW1lIGFzIF9fYW5kcm9pZF9sb2dfYXNzZXJ0X3dpdGhfc291cmNlLiBJdCBhbHNvIHJlcXVpcmVzIHRoYXQKKyAqIHRoZSB1c2VyIGhhcyBlbmFibGVkIGNyYXNoIHJlcG9ydGluZywgYnV0IGRvZXMgbm90IHBlcmZvcm0gdGhlIGV4dHJhIGNoZWNrIHRvCisgKiBzZWUgaWYgdGhleSBhcmUgdXNpbmcgYSB0ZXN0ZXIgZW1haWwuIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gdW5sZXNzIHlvdQorICogY2FuIGd1YXJhbnRlZSBubyBwcml2YWN5LXNlbnNpdGl2ZSBkYXRhIHdpbGwgYmUgcGFzc2VkIHRvIGl0LgorICovCit2b2lkIF9fYW5kcm9pZF9sb2dfYXNzZXJ0X3dpdGhfc291cmNlX2FuZF9hZGRfdG9fY3Jhc2hfcmVwb3J0KAorICAgIGNvbnN0IGNoYXIqIGNvbmQsIGNvbnN0IGNoYXIgKnRhZywKKyAgICBjb25zdCBjaGFyKiBmaWxlLCBpbnQgbGluZSwKKyAgICBjb25zdCBjaGFyKiBmbXQsIC4uLikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorICBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKQorICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgNSwgNikpKQorI2VuZGlmCisgICAgOworCisvKgorICogU2VuZCBhIGZvcm1hdHRlZCBzdHJpbmcgdG8gdGhlIGxvZywgdXNlZCBsaWtlIHByaW50ZihmbXQsLi4uKS4KKyAqIEEgdmVyc2lvbiB0aGF0IHVzZXMgdmFfbGlzdCB0byBsaXN0IGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworaW50IF9fYW5kcm9pZF9sb2dfdnByaW50KGludCBwcmlvLCBjb25zdCBjaGFyKiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFyZ3MpOworCisvKgorICogQSB2YXJpYW50IG9mIF9fYW5kcm9pZF9sb2dfYXNzZXJ0IHRoYXQgdGFrZXMgYSB2YV9saXN0IHRvIGxpc3QKKyAqIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAqLwordm9pZCBfX2FuZHJvaWRfbG9nX3Zhc3NlcnQoY29uc3QgY2hhciogY29uZCwgY29uc3QgY2hhciogdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFyZ3MpOworCisvLyBUaGVzZSBtdXN0IG1hdGNoIGN1dGlsL2xvZy5oIHZhbHVlcy4KK3R5cGVkZWYgZW51bSB7CisgIEFSQ19MT0dfSURfTUFJTiA9IDAsCisgIEFSQ19MT0dfSURfUkFESU8gPSAxLAorICBBUkNfTE9HX0lEX0VWRU5UUyA9IDIsCisgIEFSQ19MT0dfSURfU1lTVEVNID0gMywKKyAgQVJDX0xPR19JRF9DUkFTSCA9IDQsCisKKyAgQVJDX0xPR19JRF9NQVgKK30gYXJjX2xvZ19pZF90OworCit9CisKK25hbWVzcGFjZSBhcmMgeworCitlbnVtIENyYXNoTG9nTWVzc2FnZUtpbmQgeworICBSZXBvcnRhYmxlT25seUZvclRlc3RlcnMgPSAwLAorICBSZXBvcnRhYmxlRm9yQWxsVXNlcnMKK307CisKK3R5cGVkZWYgdm9pZCAoKkFkZENyYXNoRXh0cmFJbmZvcm1hdGlvbkZ1bmN0aW9uKQorICAgIChDcmFzaExvZ01lc3NhZ2VLaW5kIGNyYXNoX2xvZ19tZXNzYWdlX2tpbmQsCisgICAgIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOwordm9pZCBSZWdpc3RlckNyYXNoQ2FsbGJhY2soQWRkQ3Jhc2hFeHRyYUluZm9ybWF0aW9uRnVuY3Rpb24gZnVuY3Rpb24pOworCitpbnQgUHJpbnRMb2dCdWYoaW50IGJ1ZklELCBpbnQgcHJpbywgY29uc3QgY2hhciogdGFnLCBjb25zdCBjaGFyKiBmbXQsIC4uLikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgNCwgNSkpKQorI2VuZGlmCisgICAgOworCisvLyBVc2VkIHRvIGV4cGxpY2l0bHkgbWFyayB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gYXMgdW51c2VkLiBJZiB5b3UgYXJlCisvLyByZWFsbHkgc3VyZSB5b3UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbgorLy8gdGhhdCBoYXMgYmVlbiBtYXJrZWQgV0FSTl9VTlVTRURfUkVTVUxULCB3cmFwIGl0IHdpdGggdGhpcy4gRXhhbXBsZToKKy8vCisvLyAgIHNjb3BlZF9wdHI8TXlUeXBlPiBteV92YXIgPSAuLi47CisvLyAgIGlmIChUYWtlT3duZXJzaGlwKG15X3Zhci5nZXQoKSkgPT0gU1VDQ0VTUykKKy8vICAgICBpZ25vcmVfcmVzdWx0KG15X3Zhci5yZWxlYXNlKCkpOworLy8KKy8vIEZvciBBTE9HJ3MgaW50ZXJuYWwgdXNlIG9ubHkuIFVzZSB0aGUgb25lIGluIGJhc2UvbWFjcm9zLmggaW5zdGVhZC4KK25hbWVzcGFjZSBhbG9nX2ludGVybmFsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgaWdub3JlX3Jlc3VsdChjb25zdCBUJikge30KK30KK30gIC8vIG5hbWVzcGFjZSBhcmMKKy8qIEFSQyBNT0QgRU5EICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICogTm9ybWFsbHkgd2Ugc3RyaXAgQUxPR1YgKFZFUkJPU0UgbWVzc2FnZXMpIGZyb20gcmVsZWFzZSBidWlsZHMuCisgKiBZb3UgY2FuIG1vZGlmeSB0aGlzIChmb3IgZXhhbXBsZSB3aXRoICIjZGVmaW5lIExPR19OREVCVUcgMCIKKyAqIGF0IHRoZSB0b3Agb2YgeW91ciBzb3VyY2UgZmlsZSkgdG8gY2hhbmdlIHRoYXQgYmVoYXZpb3IuCisgKi8KKyNpZm5kZWYgTE9HX05ERUJVRworI2lmZGVmIE5ERUJVRworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNlbHNlCisjZGVmaW5lIExPR19OREVCVUcgMAorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgdGhlIGxvY2FsIHRhZyB1c2VkIGZvciB0aGUgZm9sbG93aW5nIHNpbXBsaWZpZWQKKyAqIGxvZ2dpbmcgbWFjcm9zLiAgWW91IGNhbiBjaGFuZ2UgdGhpcyBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbgorICogYmVmb3JlIHVzaW5nIHRoZSBvdGhlciBtYWNyb3MgdG8gY2hhbmdlIHRoZSB0YWcuCisgKi8KKyNpZm5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIE5VTEwKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhIHZlcmJvc2UgbG9nIG1lc3NhZ2UgdXNpbmcgdGhlIGN1cnJlbnQgTE9HX1RBRy4KKyAqLworI2lmbmRlZiBBTE9HVgorI2RlZmluZSBfX0FMT0dWKC4uLikgKCh2b2lkKUFMT0coTE9HX1ZFUkJPU0UsIExPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIEFMT0dWKC4uLikgZG8geyBpZiAoMCkgeyBfX0FMT0dWKF9fVkFfQVJHU19fKTsgfSB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQUxPR1YoLi4uKSBfX0FMT0dWKF9fVkFfQVJHU19fKQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBDT05ESVRJT04oY29uZCkgICAgIChfX2J1aWx0aW5fZXhwZWN0KChjb25kKSE9MCwgMCkpCisKKyNpZm5kZWYgQUxPR1ZfSUYKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIEFMT0dWX0lGKGNvbmQsIC4uLikgICAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIEFMT0dWX0lGKGNvbmQsIC4uLikgXAorICAgICggKENPTkRJVElPTihjb25kKSkgXAorICAgID8gKCh2b2lkKUFMT0coTE9HX1ZFUkJPU0UsIExPR19UQUcsIF9fVkFfQVJHU19fKSkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKyNlbmRpZgorCisvKgorICogU2ltcGxpZmllZCBtYWNybyB0byBzZW5kIGEgZGVidWcgbG9nIG1lc3NhZ2UgdXNpbmcgdGhlIGN1cnJlbnQgTE9HX1RBRy4KKyAqLworI2lmbmRlZiBBTE9HRAorI2RlZmluZSBBTE9HRCguLi4pICgodm9pZClBTE9HKExPR19ERUJVRywgTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgQUxPR0RfSUYKKyNkZWZpbmUgQUxPR0RfSUYoY29uZCwgLi4uKSBcCisgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCisgICAgPyAoKHZvaWQpQUxPRyhMT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKSkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhbiBpbmZvIGxvZyBtZXNzYWdlIHVzaW5nIHRoZSBjdXJyZW50IExPR19UQUcuCisgKi8KKyNpZm5kZWYgQUxPR0kKKyNkZWZpbmUgQUxPR0koLi4uKSAoKHZvaWQpQUxPRyhMT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgQUxPR0lfSUYKKyNkZWZpbmUgQUxPR0lfSUYoY29uZCwgLi4uKSBcCisgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCisgICAgPyAoKHZvaWQpQUxPRyhMT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgOiAodm9pZCkwICkKKyNlbmRpZgorCisvKgorICogU2ltcGxpZmllZCBtYWNybyB0byBzZW5kIGEgd2FybmluZyBsb2cgbWVzc2FnZSB1c2luZyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIEFMT0dXCisjZGVmaW5lIEFMT0dXKC4uLikgKCh2b2lkKUFMT0coTE9HX1dBUk4sIExPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIEFMT0dXX0lGCisjZGVmaW5lIEFMT0dXX0lGKGNvbmQsIC4uLikgXAorICAgICggKENPTkRJVElPTihjb25kKSkgXAorICAgID8gKCh2b2lkKUFMT0coTE9HX1dBUk4sIExPR19UQUcsIF9fVkFfQVJHU19fKSkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhbiBlcnJvciBsb2cgbWVzc2FnZSB1c2luZyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIEFMT0dFCisjZGVmaW5lIEFMT0dFKC4uLikgKCh2b2lkKUFMT0coTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBBTE9HRV9JRgorI2RlZmluZSBBTE9HRV9JRihjb25kLCAuLi4pIFwKKyAgICAoIChDT05ESVRJT04oY29uZCkpIFwKKyAgICA/ICgodm9pZClBTE9HKExPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgOiAodm9pZCkwICkKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIENvbmRpdGlvbmFsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgTE9HX1RBRyBpcyBlbmFibGVkIGF0CisgKiB2ZXJib3NlIHByaW9yaXR5LgorICovCisjaWZuZGVmIElGX0FMT0dWCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBJRl9BTE9HVigpIGlmIChmYWxzZSkKKyNlbHNlCisjZGVmaW5lIElGX0FMT0dWKCkgSUZfQUxPRyhMT0dfVkVSQk9TRSwgTE9HX1RBRykKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBDb25kaXRpb25hbCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IExPR19UQUcgaXMgZW5hYmxlZCBhdAorICogZGVidWcgcHJpb3JpdHkuCisgKi8KKyNpZm5kZWYgSUZfQUxPR0QKKyNkZWZpbmUgSUZfQUxPR0QoKSBJRl9BTE9HKExPR19ERUJVRywgTE9HX1RBRykKKyNlbmRpZgorCisvKgorICogQ29uZGl0aW9uYWwgYmFzZWQgb24gd2hldGhlciB0aGUgY3VycmVudCBMT0dfVEFHIGlzIGVuYWJsZWQgYXQKKyAqIGluZm8gcHJpb3JpdHkuCisgKi8KKyNpZm5kZWYgSUZfQUxPR0kKKyNkZWZpbmUgSUZfQUxPR0koKSBJRl9BTE9HKExPR19JTkZPLCBMT0dfVEFHKQorI2VuZGlmCisKKy8qCisgKiBDb25kaXRpb25hbCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjdXJyZW50IExPR19UQUcgaXMgZW5hYmxlZCBhdAorICogd2FybiBwcmlvcml0eS4KKyAqLworI2lmbmRlZiBJRl9BTE9HVworI2RlZmluZSBJRl9BTE9HVygpIElGX0FMT0coTE9HX1dBUk4sIExPR19UQUcpCisjZW5kaWYKKworLyoKKyAqIENvbmRpdGlvbmFsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGN1cnJlbnQgTE9HX1RBRyBpcyBlbmFibGVkIGF0CisgKiBlcnJvciBwcmlvcml0eS4KKyAqLworI2lmbmRlZiBJRl9BTE9HRQorI2RlZmluZSBJRl9BTE9HRSgpIElGX0FMT0coTE9HX0VSUk9SLCBMT0dfVEFHKQorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qIEFSQyBNT0QgQkVHSU4gRk9SSyAqLworLyogQWRkaW5nIFNMT0coKSBtYWNyb3MgaW4gb3JkZXIgdG8gbWFrZSBTTE9HKigpIGZ1bmN0aW9ucyBvbmx5CisgKiBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgd2hlbiBsb2dnaW5nIGlzIGdvaW5nIHRvIGhhcHBlbi4KKyAqLworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhIHZlcmJvc2Ugc3lzdGVtIGxvZyBtZXNzYWdlIHVzaW5nIHRoZSBjdXJyZW50IExPR19UQUcuCisgKi8KKyNpZm5kZWYgU0xPR1YKKyNpZiBMT0dfTkRFQlVHCisjZGVmaW5lIFNMT0dWKC4uLikgICAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIFNMT0dWKC4uLikgKCh2b2lkKVNMT0coQVJDX0xPR19JRF9TWVNURU0sIEFORFJPSURfTE9HX1ZFUkJPU0UsIExPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQ09ORElUSU9OKGNvbmQpICAgICAoX19idWlsdGluX2V4cGVjdCgoY29uZCkhPTAsIDApKQorCisjaWZuZGVmIFNMT0dWX0lGCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBTTE9HVl9JRihjb25kLCAuLi4pICAgKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBTTE9HVl9JRihjb25kLCAuLi4pIFwKKyAgICAoIChDT05ESVRJT04oY29uZCkpIFwKKyAgICA/ICgodm9pZClTTE9HKEFSQ19MT0dfSURfU1lTVEVNLCBBTkRST0lEX0xPR19WRVJCT1NFLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykpIFwKKyAgICA6ICh2b2lkKTAgKQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhIGRlYnVnIHN5c3RlbSBsb2cgbWVzc2FnZSB1c2luZyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIFNMT0dECisjZGVmaW5lIFNMT0dEKC4uLikgKCh2b2lkKVNMT0coQU5EUk9JRF9MT0dfSURfU1lTVEVNLCBBTkRST0lEX0xPR19ERUJVRywgTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgU0xPR0RfSUYKKyNkZWZpbmUgU0xPR0RfSUYoY29uZCwgLi4uKSBcCisgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCisgICAgPyAoKHZvaWQpU0xPRyhBUkNfTE9HX0lEX1NZU1RFTSwgQU5EUk9JRF9MT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKSkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhbiBpbmZvIHN5c3RlbSBsb2cgbWVzc2FnZSB1c2luZyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIFNMT0dJCisjZGVmaW5lIFNMT0dJKC4uLikgKCh2b2lkKVNMT0coQVJDX0xPR19JRF9TWVNURU0sIEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIFNMT0dJX0lGCisjZGVmaW5lIFNMT0dJX0lGKGNvbmQsIC4uLikgXAorICAgICggKENPTkRJVElPTihjb25kKSkgXAorICAgID8gKCh2b2lkKVNMT0coQVJDX0xPR19JRF9TWVNURU0sIEFORFJPSURfTE9HX0lORk8sIExPR19UQUcsIF9fVkFfQVJHU19fKSkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKworLyoKKyAqIFNpbXBsaWZpZWQgbWFjcm8gdG8gc2VuZCBhIHdhcm5pbmcgc3lzdGVtIGxvZyBtZXNzYWdlIHVzaW5nIHRoZSBjdXJyZW50IExPR19UQUcuCisgKi8KKyNpZm5kZWYgU0xPR1cKKyNkZWZpbmUgU0xPR1coLi4uKSAoKHZvaWQpU0xPRyhBUkNfTE9HX0lEX1NZU1RFTSwgQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgU0xPR1dfSUYKKyNkZWZpbmUgU0xPR1dfSUYoY29uZCwgLi4uKSBcCisgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCisgICAgPyAoKHZvaWQpU0xPRyhBUkNfTE9HX0lEX1NZU1RFTSwgQU5EUk9JRF9MT0dfV0FSTiwgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgOiAodm9pZCkwICkKKyNlbmRpZgorCisvKgorICogU2ltcGxpZmllZCBtYWNybyB0byBzZW5kIGFuIGVycm9yIHN5c3RlbSBsb2cgbWVzc2FnZSB1c2luZyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIFNMT0dFCisjZGVmaW5lIFNMT0dFKC4uLikgKCh2b2lkKVNMT0coQVJDX0xPR19JRF9TWVNURU0sIEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBTTE9HRV9JRgorI2RlZmluZSBTTE9HRV9JRihjb25kLCAuLi4pIFwKKyAgICAoIChDT05ESVRJT04oY29uZCkpIFwKKyAgICA/ICgodm9pZClTTE9HKEFSQ19MT0dfSURfU1lTVEVNLCBBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pKSBcCisgICAgOiAodm9pZCkwICkKKyNlbmRpZgorLyogQVJDIE1PRCBFTkQgRk9SSyAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIExvZyBhIGZhdGFsIGVycm9yLiAgSWYgdGhlIGdpdmVuIGNvbmRpdGlvbiBmYWlscywgdGhpcyBzdG9wcyBwcm9ncmFtCisgKiBleGVjdXRpb24gbGlrZSBhIG5vcm1hbCBhc3NlcnRpb24sIGJ1dCBhbHNvIGdlbmVyYXRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UuCisgKiBJdCBpcyBOT1Qgc3RyaXBwZWQgZnJvbSByZWxlYXNlIGJ1aWxkcy4gIE5vdGUgdGhhdCB0aGUgY29uZGl0aW9uIHRlc3QKKyAqIGlzIC1pbnZlcnRlZC0gZnJvbSB0aGUgbm9ybWFsIGFzc2VydCgpIHNlbWFudGljcy4KKyAqLworI2lmbmRlZiBMT0dfQUxXQVlTX0ZBVEFMX0lGCisjZGVmaW5lIExPR19BTFdBWVNfRkFUQUxfSUYoY29uZCwgLi4uKSBcCisgICAgKCAoQ09ORElUSU9OKGNvbmQpKSBcCisvKiBBUkMgTU9EIEJFR0lOIEZPUksgKi8gXAorICAgID8gKCh2b2lkKWFuZHJvaWRfcHJpbnRBc3NlcnRBcmMoI2NvbmQsIExPR19UQUcsICMjIF9fVkFfQVJHU19fKSkgXAorLyogQVJDIE1PRCBFTkQgRk9SSyAqLyBcCisgICAgOiAodm9pZCkwICkKKyNlbmRpZgorCisjaWZuZGVmIExPR19BTFdBWVNfRkFUQUwKKyNkZWZpbmUgTE9HX0FMV0FZU19GQVRBTCguLi4pIFwKKy8qIEFSQyBNT0QgQkVHSU4gRk9SSyAqLyBcCisgICAgKCAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydEFyYyhOVUxMLCBMT0dfVEFHLCAjIyBfX1ZBX0FSR1NfXykpICkKKyNlbmRpZgorCisvLyBXQVJOSU5HOiBUaGUgbG9nIG1lc3NhZ2UgcHJpbnRlZCBieSB0aGVzZSBtYWNyb3MgaXMgYWxzbyBzZW50IHRvIHRoZSBjcmFzaAorLy8gc2VydmVyLCBwcm92aWRlZCB0aGUgdXNlciBoYXMgYWdyZWVkIHRvIGRvIHNvLiBEbyBub3QgdXNlIHRoZXNlIG1hY3JvcyB1bmxlc3MKKy8vIHlvdSBhcmUgYWJzb2x1dGVseSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgaGF2ZSBhbnkgcHJpdmFjeS1zZW5zaXRpdmUKKy8vIGRhdGEuIE90aGVyd2lzZSwgdXNlIExPR19BTFdBWVNfRkFUQUwsIHdoaWNoIGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgc2lnbmVkIGluCisvLyB1c2luZyBhIHRlc3RlciBhY2NvdW50LgorI2lmbmRlZiBMT0dfQUxXQVlTX0ZBVEFMX0FORF9BRERfVE9fQ1JBU0hfUkVQT1JUCisjZGVmaW5lIExPR19BTFdBWVNfRkFUQUxfQU5EX0FERF9UT19DUkFTSF9SRVBPUlQoLi4uKSBcCisgICAgKCAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydEFyY0FkZFRvQ3Jhc2hSZXBvcnQoTlVMTCwgTE9HX1RBRywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIF9fVkFfQVJHU19fKSkgKQorI2VuZGlmCisKKyNpZm5kZWYgTE9HX0FMV0FZU19GQVRBTF9BTkRfQUREX1RPX0NSQVNIX1JFUE9SVF9JRgorI2RlZmluZSBMT0dfQUxXQVlTX0ZBVEFMX0FORF9BRERfVE9fQ1JBU0hfUkVQT1JUX0lGKGNvbmQsIC4uLikgXAorICAgICggKENPTkRJVElPTihjb25kKSkgXAorICAgID8gKCAoKHZvaWQpYW5kcm9pZF9wcmludEFzc2VydEFyY0FkZFRvQ3Jhc2hSZXBvcnQoTlVMTCwgTE9HX1RBRywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyBfX1ZBX0FSR1NfXykpICkgXAorICAgIDogKHZvaWQpMCApCisjZW5kaWYKKy8qIEFSQyBNT0QgRU5EIEZPUksgKi8KKy8qCisgKiBWZXJzaW9ucyBvZiBMT0dfQUxXQVlTX0ZBVEFMX0lGIGFuZCBMT0dfQUxXQVlTX0ZBVEFMIHRoYXQKKyAqIGFyZSBzdHJpcHBlZCBvdXQgb2YgcmVsZWFzZSBidWlsZHMuCisgKi8KKyNpZiBMT0dfTkRFQlVHCisKKyNpZm5kZWYgTE9HX0ZBVEFMX0lGCisvKiBBUkMgTU9EIEJFR0lOICovCisvLyBDYWxsIGlnbm9yZV9yZXN1bHQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgQUxMT1dfVU5VU0VEIG1hY3Jvcy4gU2VlCisvLyB0aGUgY29tbWVudCBmb3IgaWdub3JlX3Jlc3VsdCBhYm92ZSBmb3IgZGV0YWlsLgorI2RlZmluZSBMT0dfRkFUQUxfSUYoY29uZCwgLi4uKSBcCisgICAgKDo6YXJjOjphbG9nX2ludGVybmFsOjppZ25vcmVfcmVzdWx0KGZhbHNlICYmIChjb25kKSkpCisvKiBBUkMgTU9EIEVORCAqLworI2VuZGlmCisjaWZuZGVmIExPR19GQVRBTAorI2RlZmluZSBMT0dfRkFUQUwoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjZWxzZQorCisjaWZuZGVmIExPR19GQVRBTF9JRgorI2RlZmluZSBMT0dfRkFUQUxfSUYoY29uZCwgLi4uKSBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvbmQsICMjIF9fVkFfQVJHU19fKQorI2VuZGlmCisjaWZuZGVmIExPR19GQVRBTAorI2RlZmluZSBMT0dfRkFUQUwoLi4uKSBMT0dfQUxXQVlTX0ZBVEFMKF9fVkFfQVJHU19fKQorI2VuZGlmCisKKyNlbmRpZgorCisvKgorICogQXNzZXJ0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgbG9nIG1lc3NhZ2Ugd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLgorICogU3RyaXBwZWQgb3V0IG9mIHJlbGVhc2UgYnVpbGRzLiAgVXNlcyB0aGUgY3VycmVudCBMT0dfVEFHLgorICovCisjaWZuZGVmIEFMT0dfQVNTRVJUCisjZGVmaW5lIEFMT0dfQVNTRVJUKGNvbmQsIC4uLikgTE9HX0ZBVEFMX0lGKCEoY29uZCksICMjIF9fVkFfQVJHU19fKQorLy8jZGVmaW5lIEFMT0dfQVNTRVJUKGNvbmQpIExPR19GQVRBTF9JRighKGNvbmQpLCAiQXNzZXJ0aW9uIGZhaWxlZDogIiAjY29uZCkKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIEJhc2ljIGxvZyBtZXNzYWdlIG1hY3JvLgorICoKKyAqIEV4YW1wbGU6CisgKiAgQUxPRyhMT0dfV0FSTiwgTlVMTCwgIkZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJybm8pOworICoKKyAqIFRoZSBzZWNvbmQgYXJndW1lbnQgbWF5IGJlIE5VTEwgb3IgIiIgdG8gaW5kaWNhdGUgdGhlICJnbG9iYWwiIHRhZy4KKyAqLworLyogQVJDIE1PRCBCRUdJTiAqLworI2lmbmRlZiBBTE9HCisjZGVmaW5lIEFMT0cocHJpb3JpdHksIHRhZywgLi4uKSBcCisgICBhcmM6OlByaW50TG9nQnVmKEFSQ19MT0dfSURfTUFJTiwgQVJDXyMjcHJpb3JpdHksIFwKKyAgICAgICAgICAgICAgICAgICAgICB0YWcsIF9fVkFfQVJHU19fKQorI2VuZGlmCisKKyNpZm5kZWYgU0xPRworI2RlZmluZSBTTE9HKGJ1Zl9pZCwgcHJpb3JpdHksIHRhZywgLi4uKSBcCisgICBhcmM6OlByaW50TG9nQnVmKGJ1Zl9pZCwgcHJpb3JpdHksIHRhZywgX19WQV9BUkdTX18pCisjZW5kaWYKKy8qIEFSQyBNT0QgRU5EICovCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGUgc3R1ZmYgaW4gdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4KKyAqLworCisjZGVmaW5lIGFuZHJvaWRfcHJpbnRMb2cocHJpbywgdGFnLCBmbXQuLi4pIFwKKyAgICBfX2FuZHJvaWRfbG9nX3ByaW50KHByaW8sIHRhZywgZm10KQorCisjZGVmaW5lIGFuZHJvaWRfdnByaW50TG9nKHByaW8sIGNvbmQsIHRhZywgZm10Li4uKSBcCisgICAgX19hbmRyb2lkX2xvZ192cHJpbnQocHJpbywgdGFnLCBmbXQpCisKKy8qIFhYWCBNYWNyb3MgdG8gd29yayBhcm91bmQgc3ludGF4IGVycm9ycyBpbiBwbGFjZXMgd2hlcmUgZm9ybWF0IHN0cmluZworICogYXJnIGlzIG5vdCBwYXNzZWQgdG8gQUxPR19BU1NFUlQsIExPR19BTFdBWVNfRkFUQUwgb3IgTE9HX0FMV0FZU19GQVRBTF9JRgorICogKGhhcHBlbnMgb25seSBpbiBkZWJ1ZyBidWlsZHMpLgorICovCisKKy8qIFJldHVybnMgMm5kIGFyZy4gIFVzZWQgdG8gc3Vic3RpdHV0ZSBkZWZhdWx0IHZhbHVlIGlmIGNhbGxlcidzIHZhcmFyZyBsaXN0CisgKiBpcyBlbXB0eS4KKyAqLworI2RlZmluZSBfX2FuZHJvaWRfc2Vjb25kKGR1bW15LCBzZWNvbmQsIC4uLikgICAgIHNlY29uZAorCisvKiBJZiBwYXNzZWQgbXVsdGlwbGUgYXJncywgcmV0dXJucyAnLCcgZm9sbG93ZWQgYnkgYWxsIGJ1dCAxc3QgYXJnLCBvdGhlcndpc2UKKyAqIHJldHVybnMgbm90aGluZy4KKyAqLworI2RlZmluZSBfX2FuZHJvaWRfcmVzdChmaXJzdCwgLi4uKSAgICAgICAgICAgICAgICwgIyMgX19WQV9BUkdTX18KKworLyogQVJDIE1PRCBCRUdJTiAqLworI2RlZmluZSBhbmRyb2lkX3ByaW50QXNzZXJ0QXJjKGNvbmQsIHRhZywgZm10Li4uKSBcCisgICAgX19hbmRyb2lkX2xvZ19hc3NlcnRfd2l0aF9zb3VyY2UoY29uZCwgdGFnLCBfX0ZJTEVfXywgX19MSU5FX18sIFwKKyAgICAgICAgX19hbmRyb2lkX3NlY29uZCgwLCAjIyBmbXQsIE5VTEwpIF9fYW5kcm9pZF9yZXN0KGZtdCkpCisKKy8vIFNlbmRzIHRoZSBsYXN0IGxvZyBtZXNzYWdlIHRvIHRoZSBwbHVnaW4ganVzdCBiZWZvcmUgYWJvcnRpbmcuIEl0IHdhcyBkZWNpZGVkCisvLyB0byBub3Qgc2VuZCB0aGlzIGR1cmluZyB0aGUgY3Jhc2ggcmVwb3J0aW5nIGNhbGxiYWNrIHNpbmNlIHRoZSBwcm9jZXNzIGlzIG5vdAorLy8gZ3VhcmFudGVlZCB0byBiZSBpbiBhIGdvb2Qgc3RhdGUgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBuZWVkZWQgdG8gc2VuZCB0aGUKKy8vIG1lc3NhZ2UuIEFsc28sIHRoZXJlIGlzIG5vIHVwc3RyZWFtIHN1cHBvcnQgdG8gYWRkIGFyYml0cmFyeSBkYXRhIHRvIHRoZQorLy8gbWluaWR1bXAuCisvLyBCeSBzZW5kaW5nIHRoaXMgc2VwYXJhdGVseSBvbmx5IGluIHRoZSBjYXNlcyB3aGVuIHdlIGtub3cgaXMgc2FmZSwgd2UKKy8vIG1heGltaXplIHRoZSBwcm9iYWJpbGl0eSBvZiByZXBvcnRpbmcgdGhlIGNyYXNoIHN1Y2Nlc3NmdWxseS4KKyNkZWZpbmUgYW5kcm9pZF9wcmludEFzc2VydEFyY0FkZFRvQ3Jhc2hSZXBvcnQoY29uZCwgdGFnLCBmbXQuLi4pIFwKKyAgICBfX2FuZHJvaWRfbG9nX2Fzc2VydF93aXRoX3NvdXJjZV9hbmRfYWRkX3RvX2NyYXNoX3JlcG9ydChjb25kLCB0YWcsIFwKKyAgICAgICAgX19GSUxFX18sIF9fTElORV9fLCBcCisgICAgICAgIF9fYW5kcm9pZF9zZWNvbmQoMCwgIyMgZm10LCBOVUxMKSBfX2FuZHJvaWRfcmVzdChmbXQpKQorCisjZW5kaWYgIC8vIF9DT01NT05fQUxPR19ICisvKiBBUkMgTU9EIEVORCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9kbG9nLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2Rsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY0Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9kbG9nLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKyNkZWZpbmUgR0xFUzEyVFJfRExPRyAwCisKKyNpZiBHTEVTMTJUUl9ETE9HCisjZGVmaW5lIEFQSVRSQUNFKCkgZG8geyBcCisgICAgVkVSQk9TRV9USURfRlVOQ1RJT05fRFBSSU5UKGdsZXMxZW11LCAiKGdsZXMxLT4yIHRyYW5zbGF0b3IpICIpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBETE9HKC4uLikgZG8geyBcCisgICAgVkVSQk9TRV9USURfRlVOQ1RJT05fRFBSSU5UKGdsZXMxZW11LCAiKGdsZXMxLT4yIHRyYW5zbGF0b3IpOiAiLCAjI19fVkFfQVJHU19fKTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFQSVRSQUNFKCkKKyNkZWZpbmUgRExPRyguLi4pCisjZW5kaWYKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2V0YzEuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9ldGMxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2QxMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9ldGMxLmNwcApAQCAtMCwwICsxLDY3MCBAQAorLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPEVUQzEvZXRjMS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8qIEZyb20gaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL2V4dGVuc2lvbnMvT0VTL09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlLnR4dAorCisgVGhlIG51bWJlciBvZiBiaXRzIHRoYXQgcmVwcmVzZW50IGEgNHg0IHRleGVsIGJsb2NrIGlzIDY0IGJpdHMgaWYKKyA8aW50ZXJuYWxmb3JtYXQ+IGlzIGdpdmVuIGJ5IEVUQzFfUkdCOF9PRVMuCisKKyBUaGUgZGF0YSBmb3IgYSBibG9jayBpcyBhIG51bWJlciBvZiBieXRlcywKKworIHtxMCwgcTEsIHEyLCBxMywgcTQsIHE1LCBxNiwgcTd9CisKKyB3aGVyZSBieXRlIHEwIGlzIGxvY2F0ZWQgYXQgdGhlIGxvd2VzdCBtZW1vcnkgYWRkcmVzcyBhbmQgcTcgYXQKKyB0aGUgaGlnaGVzdC4gVGhlIDY0IGJpdHMgc3BlY2lmeWluZyB0aGUgYmxvY2sgaXMgdGhlbiByZXByZXNlbnRlZAorIGJ5IHRoZSBmb2xsb3dpbmcgNjQgYml0IGludGVnZXI6CisKKyBpbnQ2NGJpdCA9IDI1NiooMjU2KigyNTYqKDI1NiooMjU2KigyNTYqKDI1NipxMCtxMSkrcTIpK3EzKStxNCkrcTUpK3E2KStxNzsKKworIEVUQzFfUkdCOF9PRVM6CisKKyBhKSBiaXQgbGF5b3V0IGluIGJpdHMgNjMgdGhyb3VnaCAzMiBpZiBkaWZmYml0ID0gMAorCisgNjMgNjIgNjEgNjAgNTkgNTggNTcgNTYgNTUgNTQgNTMgNTIgNTEgNTAgNDkgNDgKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgYmFzZSBjb2wxIHwgYmFzZSBjb2wyIHwgYmFzZSBjb2wxIHwgYmFzZSBjb2wyIHwKKyB8IFIxICg0Yml0cyl8IFIyICg0Yml0cyl8IEcxICg0Yml0cyl8IEcyICg0Yml0cyl8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIDQ3IDQ2IDQ1IDQ0IDQzIDQyIDQxIDQwIDM5IDM4IDM3IDM2IDM1IDM0ICAzMyAgMzIKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IGJhc2UgY29sMSB8IGJhc2UgY29sMiB8IHRhYmxlICB8IHRhYmxlICB8ZGlmZnxmbGlwfAorIHwgQjEgKDRiaXRzKXwgQjIgKDRiaXRzKXwgY3cgMSAgIHwgY3cgMiAgIHxiaXQgfGJpdCB8CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIGIpIGJpdCBsYXlvdXQgaW4gYml0cyA2MyB0aHJvdWdoIDMyIGlmIGRpZmZiaXQgPSAxCisKKyA2MyA2MiA2MSA2MCA1OSA1OCA1NyA1NiA1NSA1NCA1MyA1MiA1MSA1MCA0OSA0OAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBiYXNlIGNvbDEgICAgfCBkY29sIDIgfCBiYXNlIGNvbDEgICAgfCBkY29sIDIgfAorIHwgUjEnICg1IGJpdHMpIHwgZFIyICAgIHwgRzEnICg1IGJpdHMpIHwgZEcyICAgIHwKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAgMzkgMzggMzcgMzYgMzUgMzQgIDMzICAzMgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgYmFzZSBjb2wgMSAgIHwgZGNvbCAyIHwgdGFibGUgIHwgdGFibGUgIHxkaWZmfGZsaXB8CisgfCBCMScgKDUgYml0cykgfCBkQjIgICAgfCBjdyAxICAgfCBjdyAyICAgfGJpdCB8Yml0IHwKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgYykgYml0IGxheW91dCBpbiBiaXRzIDMxIHRocm91Z2ggMCAoaW4gYm90aCBjYXNlcykKKworIDMxIDMwIDI5IDI4IDI3IDI2IDI1IDI0IDIzIDIyIDIxIDIwIDE5IDE4IDE3IDE2CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgIG1vc3Qgc2lnbmlmaWNhbnQgcGl4ZWwgaW5kZXggYml0cyAgICAgICB8CisgfCBwfCBvfCBufCBtfCBsfCBrfCBqfCBpfCBofCBnfCBmfCBlfCBkfCBjfCBifCBhfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAxNSAxNCAxMyAxMiAxMSAxMCAgOSAgOCAgNyAgNiAgNSAgNCAgMyAgIDIgICAxICAwCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8ICAgICAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgcGl4ZWwgaW5kZXggYml0cyAgICAgICB8CisgfCBwfCBvfCBufCBtfCBsfCBrfCBqfCBpfCBofCBnfCBmfCBlfCBkfCBjIHwgYiB8IGEgfAorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIEFkZCB0YWJsZSAzLjE3LjI6IEludGVuc2l0eSBtb2RpZmllciBzZXRzIGZvciBFVEMxIGNvbXByZXNzZWQgdGV4dHVyZXM6CisKKyB0YWJsZSBjb2Rld29yZCAgICAgICAgICAgICAgICBtb2RpZmllciB0YWJsZQorIC0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAgICAgICAgICAgICAgICAgICAgICAtOCAgLTIgIDIgICA4CisgMSAgICAgICAgICAgICAgICAgICAgLTE3ICAtNSAgNSAgMTcKKyAyICAgICAgICAgICAgICAgICAgICAtMjkgIC05ICA5ICAyOQorIDMgICAgICAgICAgICAgICAgICAgIC00MiAtMTMgMTMgIDQyCisgNCAgICAgICAgICAgICAgICAgICAgLTYwIC0xOCAxOCAgNjAKKyA1ICAgICAgICAgICAgICAgICAgICAtODAgLTI0IDI0ICA4MAorIDYgICAgICAgICAgICAgICAgICAgLTEwNiAtMzMgMzMgMTA2CisgNyAgICAgICAgICAgICAgICAgICAtMTgzIC00NyA0NyAxODMKKworCisgQWRkIHRhYmxlIDMuMTcuMyBNYXBwaW5nIGZyb20gcGl4ZWwgaW5kZXggdmFsdWVzIHRvIG1vZGlmaWVyIHZhbHVlcyBmb3IKKyBFVEMxIGNvbXByZXNzZWQgdGV4dHVyZXM6CisKKyBwaXhlbCBpbmRleCB2YWx1ZQorIC0tLS0tLS0tLS0tLS0tLQorIG1zYiAgICAgbHNiICAgICAgICAgICByZXN1bHRpbmcgbW9kaWZpZXIgdmFsdWUKKyAtLS0tLSAgIC0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxICAgICAgIDEgICAgICAgICAgICAtYiAobGFyZ2UgbmVnYXRpdmUgdmFsdWUpCisgMSAgICAgICAwICAgICAgICAgICAgLWEgKHNtYWxsIG5lZ2F0aXZlIHZhbHVlKQorIDAgICAgICAgMCAgICAgICAgICAgICBhIChzbWFsbCBwb3NpdGl2ZSB2YWx1ZSkKKyAwICAgICAgIDEgICAgICAgICAgICAgYiAobGFyZ2UgcG9zaXRpdmUgdmFsdWUpCisKKworICovCisKK3N0YXRpYyBjb25zdCBpbnQga01vZGlmaWVyVGFibGVbXSA9IHsKKy8qIDAgKi8yLCA4LCAtMiwgLTgsCisvKiAxICovNSwgMTcsIC01LCAtMTcsCisvKiAyICovOSwgMjksIC05LCAtMjksCisvKiAzICovMTMsIDQyLCAtMTMsIC00MiwKKy8qIDQgKi8xOCwgNjAsIC0xOCwgLTYwLAorLyogNSAqLzI0LCA4MCwgLTI0LCAtODAsCisvKiA2ICovMzMsIDEwNiwgLTMzLCAtMTA2LAorLyogNyAqLzQ3LCAxODMsIC00NywgLTE4MyB9OworCitzdGF0aWMgY29uc3QgaW50IGtMb29rdXBbOF0gPSB7IDAsIDEsIDIsIDMsIC00LCAtMywgLTIsIC0xIH07CisKK3N0YXRpYyBpbmxpbmUgZXRjMV9ieXRlIGNsYW1wKGludCB4KSB7CisgICAgcmV0dXJuIChldGMxX2J5dGUpICh4ID49IDAgPyAoeCA8IDI1NSA/IHggOiAyNTUpIDogMCk7Cit9CisKK3N0YXRpYworaW5saW5lIGludCBjb252ZXJ0NFRvOChpbnQgYikgeworICAgIGludCBjID0gYiAmIDB4ZjsKKyAgICByZXR1cm4gKGMgPDwgNCkgfCBjOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgY29udmVydDVUbzgoaW50IGIpIHsKKyAgICBpbnQgYyA9IGIgJiAweDFmOworICAgIHJldHVybiAoYyA8PCAzKSB8IChjID4+IDIpOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgY29udmVydDZUbzgoaW50IGIpIHsKKyAgICBpbnQgYyA9IGIgJiAweDNmOworICAgIHJldHVybiAoYyA8PCAyKSB8IChjID4+IDQpOworfQorCitzdGF0aWMKK2lubGluZSBpbnQgZGl2aWRlQnkyNTUoaW50IGQpIHsKKyAgICByZXR1cm4gKGQgKyAxMjggKyAoZCA+PiA4KSkgPj4gODsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnQ4VG80KGludCBiKSB7CisgICAgaW50IGMgPSBiICYgMHhmZjsKKyAgICByZXR1cm4gZGl2aWRlQnkyNTUoYyAqIDE1KTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnQ4VG81KGludCBiKSB7CisgICAgaW50IGMgPSBiICYgMHhmZjsKKyAgICByZXR1cm4gZGl2aWRlQnkyNTUoYyAqIDMxKTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IGNvbnZlcnREaWZmKGludCBiYXNlLCBpbnQgZGlmZikgeworICAgIHJldHVybiBjb252ZXJ0NVRvOCgoMHgxZiAmIGJhc2UpICsga0xvb2t1cFsweDcgJiBkaWZmXSk7Cit9CisKK3N0YXRpYwordm9pZCBkZWNvZGVfc3ViYmxvY2soZXRjMV9ieXRlKiBwT3V0LCBpbnQgciwgaW50IGcsIGludCBiLCBjb25zdCBpbnQqIHRhYmxlLAorICAgICAgICBldGMxX3VpbnQzMiBsb3csIGJvb2wgc2Vjb25kLCBib29sIGZsaXBwZWQpIHsKKyAgICBpbnQgYmFzZVggPSAwOworICAgIGludCBiYXNlWSA9IDA7CisgICAgaWYgKHNlY29uZCkgeworICAgICAgICBpZiAoZmxpcHBlZCkgeworICAgICAgICAgICAgYmFzZVkgPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZVggPSAyOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGludCB4LCB5OworICAgICAgICBpZiAoZmxpcHBlZCkgeworICAgICAgICAgICAgeCA9IGJhc2VYICsgKGkgPj4gMSk7CisgICAgICAgICAgICB5ID0gYmFzZVkgKyAoaSAmIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeCA9IGJhc2VYICsgKGkgPj4gMik7CisgICAgICAgICAgICB5ID0gYmFzZVkgKyAoaSAmIDMpOworICAgICAgICB9CisgICAgICAgIGludCBrID0geSArICh4ICogNCk7CisgICAgICAgIGludCBvZmZzZXQgPSAoKGxvdyA+PiBrKSAmIDEpIHwgKChsb3cgPj4gKGsgKyAxNSkpICYgMik7CisgICAgICAgIGludCBkZWx0YSA9IHRhYmxlW29mZnNldF07CisgICAgICAgIGV0YzFfYnl0ZSogcSA9IHBPdXQgKyAzICogKHggKyA0ICogeSk7CisgICAgICAgICpxKysgPSBjbGFtcChyICsgZGVsdGEpOworICAgICAgICAqcSsrID0gY2xhbXAoZyArIGRlbHRhKTsKKyAgICAgICAgKnErKyA9IGNsYW1wKGIgKyBkZWx0YSk7CisgICAgfQorfQorCisvLyBJbnB1dCBpcyBhbiBFVEMxIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgZGF0YS4KKy8vIE91dHB1dCBpcyBhIDQgeCA0IHNxdWFyZSBvZiAzLWJ5dGUgcGl4ZWxzIGluIGZvcm0gUiwgRywgQgorCit2b2lkIGV0YzFfZGVjb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQpIHsKKyAgICBldGMxX3VpbnQzMiBoaWdoID0gKHBJblswXSA8PCAyNCkgfCAocEluWzFdIDw8IDE2KSB8IChwSW5bMl0gPDwgOCkgfCBwSW5bM107CisgICAgZXRjMV91aW50MzIgbG93ID0gKHBJbls0XSA8PCAyNCkgfCAocEluWzVdIDw8IDE2KSB8IChwSW5bNl0gPDwgOCkgfCBwSW5bN107CisgICAgaW50IHIxLCByMiwgZzEsIGcyLCBiMSwgYjI7CisgICAgaWYgKGhpZ2ggJiAyKSB7CisgICAgICAgIC8vIGRpZmZlcmVudGlhbAorICAgICAgICBpbnQgckJhc2UgPSBoaWdoID4+IDI3OworICAgICAgICBpbnQgZ0Jhc2UgPSBoaWdoID4+IDE5OworICAgICAgICBpbnQgYkJhc2UgPSBoaWdoID4+IDExOworICAgICAgICByMSA9IGNvbnZlcnQ1VG84KHJCYXNlKTsKKyAgICAgICAgcjIgPSBjb252ZXJ0RGlmZihyQmFzZSwgaGlnaCA+PiAyNCk7CisgICAgICAgIGcxID0gY29udmVydDVUbzgoZ0Jhc2UpOworICAgICAgICBnMiA9IGNvbnZlcnREaWZmKGdCYXNlLCBoaWdoID4+IDE2KTsKKyAgICAgICAgYjEgPSBjb252ZXJ0NVRvOChiQmFzZSk7CisgICAgICAgIGIyID0gY29udmVydERpZmYoYkJhc2UsIGhpZ2ggPj4gOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbm90IGRpZmZlcmVudGlhbAorICAgICAgICByMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjgpOworICAgICAgICByMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjQpOworICAgICAgICBnMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMjApOworICAgICAgICBnMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMTYpOworICAgICAgICBiMSA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gMTIpOworICAgICAgICBiMiA9IGNvbnZlcnQ0VG84KGhpZ2ggPj4gOCk7CisgICAgfQorICAgIGludCB0YWJsZUluZGV4QSA9IDcgJiAoaGlnaCA+PiA1KTsKKyAgICBpbnQgdGFibGVJbmRleEIgPSA3ICYgKGhpZ2ggPj4gMik7CisgICAgY29uc3QgaW50KiB0YWJsZUEgPSBrTW9kaWZpZXJUYWJsZSArIHRhYmxlSW5kZXhBICogNDsKKyAgICBjb25zdCBpbnQqIHRhYmxlQiA9IGtNb2RpZmllclRhYmxlICsgdGFibGVJbmRleEIgKiA0OworICAgIGJvb2wgZmxpcHBlZCA9IChoaWdoICYgMSkgIT0gMDsKKyAgICBkZWNvZGVfc3ViYmxvY2socE91dCwgcjEsIGcxLCBiMSwgdGFibGVBLCBsb3csIGZhbHNlLCBmbGlwcGVkKTsKKyAgICBkZWNvZGVfc3ViYmxvY2socE91dCwgcjIsIGcyLCBiMiwgdGFibGVCLCBsb3csIHRydWUsIGZsaXBwZWQpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZXRjMV91aW50MzIgaGlnaDsKKyAgICBldGMxX3VpbnQzMiBsb3c7CisgICAgZXRjMV91aW50MzIgc2NvcmU7IC8vIExvd2VyIGlzIG1vcmUgYWNjdXJhdGUKK30gZXRjX2NvbXByZXNzZWQ7CisKK3N0YXRpYworaW5saW5lIHZvaWQgdGFrZV9iZXN0KGV0Y19jb21wcmVzc2VkKiBhLCBjb25zdCBldGNfY29tcHJlc3NlZCogYikgeworICAgIGlmIChhLT5zY29yZSA+IGItPnNjb3JlKSB7CisgICAgICAgICphID0gKmI7CisgICAgfQorfQorCitzdGF0aWMKK3ZvaWQgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGV0YzFfYnl0ZSogcENvbG9ycywgYm9vbCBmbGlwcGVkLCBib29sIHNlY29uZCkgeworICAgIGludCByID0gMDsKKyAgICBpbnQgZyA9IDA7CisgICAgaW50IGIgPSAwOworCisgICAgaWYgKGZsaXBwZWQpIHsKKyAgICAgICAgaW50IGJ5ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnkgPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgICAgICBpbnQgeXkgPSBieSArIHk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBpID0geCArIDQgKiB5eTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwID0gcEluICsgaSAqIDM7CisgICAgICAgICAgICAgICAgICAgIHIgKz0gKihwKyspOworICAgICAgICAgICAgICAgICAgICBnICs9ICoocCsrKTsKKyAgICAgICAgICAgICAgICAgICAgYiArPSAqKHArKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ4ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnggPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgIGludCB4eCA9IGJ4ICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHh4ICsgNCAqIHk7CisgICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcCA9IHBJbiArIGkgKiAzOworICAgICAgICAgICAgICAgICAgICByICs9ICoocCsrKTsKKyAgICAgICAgICAgICAgICAgICAgZyArPSAqKHArKyk7CisgICAgICAgICAgICAgICAgICAgIGIgKz0gKihwKyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwQ29sb3JzWzBdID0gKGV0YzFfYnl0ZSkoKHIgKyA0KSA+PiAzKTsKKyAgICBwQ29sb3JzWzFdID0gKGV0YzFfYnl0ZSkoKGcgKyA0KSA+PiAzKTsKKyAgICBwQ29sb3JzWzJdID0gKGV0YzFfYnl0ZSkoKGIgKyA0KSA+PiAzKTsKK30KKworc3RhdGljCitpbmxpbmUgaW50IHNxdWFyZShpbnQgeCkgeworICAgIHJldHVybiB4ICogeDsKK30KKworc3RhdGljIGV0YzFfdWludDMyIGNob29zZU1vZGlmaWVyKGNvbnN0IGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiAqcExvdywgaW50IGJpdEluZGV4LAorICAgICAgICBjb25zdCBpbnQqIHBNb2RpZmllclRhYmxlKSB7CisgICAgZXRjMV91aW50MzIgYmVzdFNjb3JlID0gfjA7CisgICAgaW50IGJlc3RJbmRleCA9IDA7CisgICAgaW50IHBpeGVsUiA9IHBJblswXTsKKyAgICBpbnQgcGl4ZWxHID0gcEluWzFdOworICAgIGludCBwaXhlbEIgPSBwSW5bMl07CisgICAgaW50IHIgPSBwQmFzZUNvbG9yc1swXTsKKyAgICBpbnQgZyA9IHBCYXNlQ29sb3JzWzFdOworICAgIGludCBiID0gcEJhc2VDb2xvcnNbMl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IG1vZGlmaWVyID0gcE1vZGlmaWVyVGFibGVbaV07CisgICAgICAgIGludCBkZWNvZGVkRyA9IGNsYW1wKGcgKyBtb2RpZmllcik7CisgICAgICAgIGV0YzFfdWludDMyIHNjb3JlID0gKGV0YzFfdWludDMyKSAoNiAqIHNxdWFyZShkZWNvZGVkRyAtIHBpeGVsRykpOworICAgICAgICBpZiAoc2NvcmUgPj0gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZGVjb2RlZFIgPSBjbGFtcChyICsgbW9kaWZpZXIpOworICAgICAgICBzY29yZSArPSAoZXRjMV91aW50MzIpICgzICogc3F1YXJlKGRlY29kZWRSIC0gcGl4ZWxSKSk7CisgICAgICAgIGlmIChzY29yZSA+PSBiZXN0U2NvcmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBkZWNvZGVkQiA9IGNsYW1wKGIgKyBtb2RpZmllcik7CisgICAgICAgIHNjb3JlICs9IChldGMxX3VpbnQzMikgc3F1YXJlKGRlY29kZWRCIC0gcGl4ZWxCKTsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIGJlc3RJbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXRjMV91aW50MzIgbG93TWFzayA9ICgoKGJlc3RJbmRleCA+PiAxKSA8PCAxNikgfCAoYmVzdEluZGV4ICYgMSkpCisgICAgICAgICAgICA8PCBiaXRJbmRleDsKKyAgICAqcExvdyB8PSBsb3dNYXNrOworICAgIHJldHVybiBiZXN0U2NvcmU7Cit9CisKK3N0YXRpYwordm9pZCBldGNfZW5jb2RlX3N1YmJsb2NrX2hlbHBlcihjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgaW5NYXNrLAorICAgICAgICBldGNfY29tcHJlc3NlZCogcENvbXByZXNzZWQsIGJvb2wgZmxpcHBlZCwgYm9vbCBzZWNvbmQsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsIGNvbnN0IGludCogcE1vZGlmaWVyVGFibGUpIHsKKyAgICBpbnQgc2NvcmUgPSBwQ29tcHJlc3NlZC0+c2NvcmU7CisgICAgaWYgKGZsaXBwZWQpIHsKKyAgICAgICAgaW50IGJ5ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnkgPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgMjsgeSsrKSB7CisgICAgICAgICAgICBpbnQgeXkgPSBieSArIHk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBpID0geCArIDQgKiB5eTsKKyAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gY2hvb3NlTW9kaWZpZXIocEJhc2VDb2xvcnMsIHBJbiArIGkgKiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tcHJlc3NlZC0+bG93LCB5eSArIHggKiA0LCBwTW9kaWZpZXJUYWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ4ID0gMDsKKyAgICAgICAgaWYgKHNlY29uZCkgeworICAgICAgICAgICAgYnggPSAyOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgICAgIGludCB4eCA9IGJ4ICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IHh4ICsgNCAqIHk7CisgICAgICAgICAgICAgICAgaWYgKGluTWFzayAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IGNob29zZU1vZGlmaWVyKHBCYXNlQ29sb3JzLCBwSW4gKyBpICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvbXByZXNzZWQtPmxvdywgeSArIHh4ICogNCwgcE1vZGlmaWVyVGFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwQ29tcHJlc3NlZC0+c2NvcmUgPSBzY29yZTsKK30KKworc3RhdGljIGJvb2wgaW5SYW5nZTRiaXRTaWduZWQoaW50IGNvbG9yKSB7CisgICAgcmV0dXJuIGNvbG9yID49IC00ICYmIGNvbG9yIDw9IDM7Cit9CisKK3N0YXRpYyB2b2lkIGV0Y19lbmNvZGVCYXNlQ29sb3JzKGV0YzFfYnl0ZSogcEJhc2VDb2xvcnMsCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcENvbG9ycywgZXRjX2NvbXByZXNzZWQqIHBDb21wcmVzc2VkKSB7CisgICAgaW50IHIxLCBnMSwgYjEsIHIyLCBnMiwgYjI7IC8vIDggYml0IGJhc2UgY29sb3JzIGZvciBzdWItYmxvY2tzCisgICAgYm9vbCBkaWZmZXJlbnRpYWw7CisgICAgeworICAgICAgICBpbnQgcjUxID0gY29udmVydDhUbzUocENvbG9yc1swXSk7CisgICAgICAgIGludCBnNTEgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzFdKTsKKyAgICAgICAgaW50IGI1MSA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbMl0pOworICAgICAgICBpbnQgcjUyID0gY29udmVydDhUbzUocENvbG9yc1szXSk7CisgICAgICAgIGludCBnNTIgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzRdKTsKKyAgICAgICAgaW50IGI1MiA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbNV0pOworCisgICAgICAgIHIxID0gY29udmVydDVUbzgocjUxKTsKKyAgICAgICAgZzEgPSBjb252ZXJ0NVRvOChnNTEpOworICAgICAgICBiMSA9IGNvbnZlcnQ1VG84KGI1MSk7CisKKyAgICAgICAgaW50IGRyID0gcjUyIC0gcjUxOworICAgICAgICBpbnQgZGcgPSBnNTIgLSBnNTE7CisgICAgICAgIGludCBkYiA9IGI1MiAtIGI1MTsKKworICAgICAgICBkaWZmZXJlbnRpYWwgPSBpblJhbmdlNGJpdFNpZ25lZChkcikgJiYgaW5SYW5nZTRiaXRTaWduZWQoZGcpCisgICAgICAgICAgICAgICAgJiYgaW5SYW5nZTRiaXRTaWduZWQoZGIpOworICAgICAgICBpZiAoZGlmZmVyZW50aWFsKSB7CisgICAgICAgICAgICByMiA9IGNvbnZlcnQ1VG84KHI1MSArIGRyKTsKKyAgICAgICAgICAgIGcyID0gY29udmVydDVUbzgoZzUxICsgZGcpOworICAgICAgICAgICAgYjIgPSBjb252ZXJ0NVRvOChiNTEgKyBkYik7CisgICAgICAgICAgICBwQ29tcHJlc3NlZC0+aGlnaCB8PSAocjUxIDw8IDI3KSB8ICgoNyAmIGRyKSA8PCAyNCkgfCAoZzUxIDw8IDE5KQorICAgICAgICAgICAgICAgICAgICB8ICgoNyAmIGRnKSA8PCAxNikgfCAoYjUxIDw8IDExKSB8ICgoNyAmIGRiKSA8PCA4KSB8IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRpZmZlcmVudGlhbCkgeworICAgICAgICBpbnQgcjQxID0gY29udmVydDhUbzQocENvbG9yc1swXSk7CisgICAgICAgIGludCBnNDEgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzFdKTsKKyAgICAgICAgaW50IGI0MSA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbMl0pOworICAgICAgICBpbnQgcjQyID0gY29udmVydDhUbzQocENvbG9yc1szXSk7CisgICAgICAgIGludCBnNDIgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzRdKTsKKyAgICAgICAgaW50IGI0MiA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbNV0pOworICAgICAgICByMSA9IGNvbnZlcnQ0VG84KHI0MSk7CisgICAgICAgIGcxID0gY29udmVydDRUbzgoZzQxKTsKKyAgICAgICAgYjEgPSBjb252ZXJ0NFRvOChiNDEpOworICAgICAgICByMiA9IGNvbnZlcnQ0VG84KHI0Mik7CisgICAgICAgIGcyID0gY29udmVydDRUbzgoZzQyKTsKKyAgICAgICAgYjIgPSBjb252ZXJ0NFRvOChiNDIpOworICAgICAgICBwQ29tcHJlc3NlZC0+aGlnaCB8PSAocjQxIDw8IDI4KSB8IChyNDIgPDwgMjQpIHwgKGc0MSA8PCAyMCkgfCAoZzQyCisgICAgICAgICAgICAgICAgPDwgMTYpIHwgKGI0MSA8PCAxMikgfCAoYjQyIDw8IDgpOworICAgIH0KKyAgICBwQmFzZUNvbG9yc1swXSA9IHIxOworICAgIHBCYXNlQ29sb3JzWzFdID0gZzE7CisgICAgcEJhc2VDb2xvcnNbMl0gPSBiMTsKKyAgICBwQmFzZUNvbG9yc1szXSA9IHIyOworICAgIHBCYXNlQ29sb3JzWzRdID0gZzI7CisgICAgcEJhc2VDb2xvcnNbNV0gPSBiMjsKK30KKworc3RhdGljCit2b2lkIGV0Y19lbmNvZGVfYmxvY2tfaGVscGVyKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcENvbG9ycywgZXRjX2NvbXByZXNzZWQqIHBDb21wcmVzc2VkLCBib29sIGZsaXBwZWQpIHsKKyAgICBwQ29tcHJlc3NlZC0+c2NvcmUgPSB+MDsKKyAgICBwQ29tcHJlc3NlZC0+aGlnaCA9IChmbGlwcGVkID8gMSA6IDApOworICAgIHBDb21wcmVzc2VkLT5sb3cgPSAwOworCisgICAgZXRjMV9ieXRlIHBCYXNlQ29sb3JzWzZdOworCisgICAgZXRjX2VuY29kZUJhc2VDb2xvcnMocEJhc2VDb2xvcnMsIHBDb2xvcnMsIHBDb21wcmVzc2VkKTsKKworICAgIGludCBvcmlnaW5hbEhpZ2ggPSBwQ29tcHJlc3NlZC0+aGlnaDsKKworICAgIGNvbnN0IGludCogcE1vZGlmaWVyVGFibGUgPSBrTW9kaWZpZXJUYWJsZTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKywgcE1vZGlmaWVyVGFibGUgKz0gNCkgeworICAgICAgICBldGNfY29tcHJlc3NlZCB0ZW1wOworICAgICAgICB0ZW1wLnNjb3JlID0gMDsKKyAgICAgICAgdGVtcC5oaWdoID0gb3JpZ2luYWxIaWdoIHwgKGkgPDwgNSk7CisgICAgICAgIHRlbXAubG93ID0gMDsKKyAgICAgICAgZXRjX2VuY29kZV9zdWJibG9ja19oZWxwZXIocEluLCBpbk1hc2ssICZ0ZW1wLCBmbGlwcGVkLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBwQmFzZUNvbG9ycywgcE1vZGlmaWVyVGFibGUpOworICAgICAgICB0YWtlX2Jlc3QocENvbXByZXNzZWQsICZ0ZW1wKTsKKyAgICB9CisgICAgcE1vZGlmaWVyVGFibGUgPSBrTW9kaWZpZXJUYWJsZTsKKyAgICBldGNfY29tcHJlc3NlZCBmaXJzdEhhbGYgPSAqcENvbXByZXNzZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyssIHBNb2RpZmllclRhYmxlICs9IDQpIHsKKyAgICAgICAgZXRjX2NvbXByZXNzZWQgdGVtcDsKKyAgICAgICAgdGVtcC5zY29yZSA9IGZpcnN0SGFsZi5zY29yZTsKKyAgICAgICAgdGVtcC5oaWdoID0gZmlyc3RIYWxmLmhpZ2ggfCAoaSA8PCAyKTsKKyAgICAgICAgdGVtcC5sb3cgPSBmaXJzdEhhbGYubG93OworICAgICAgICBldGNfZW5jb2RlX3N1YmJsb2NrX2hlbHBlcihwSW4sIGluTWFzaywgJnRlbXAsIGZsaXBwZWQsIHRydWUsCisgICAgICAgICAgICAgICAgcEJhc2VDb2xvcnMgKyAzLCBwTW9kaWZpZXJUYWJsZSk7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICpwQ29tcHJlc3NlZCA9IHRlbXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YWtlX2Jlc3QocENvbXByZXNzZWQsICZ0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVCaWdFbmRpYW4oZXRjMV9ieXRlKiBwT3V0LCBldGMxX3VpbnQzMiBkKSB7CisgICAgcE91dFswXSA9IChldGMxX2J5dGUpKGQgPj4gMjQpOworICAgIHBPdXRbMV0gPSAoZXRjMV9ieXRlKShkID4+IDE2KTsKKyAgICBwT3V0WzJdID0gKGV0YzFfYnl0ZSkoZCA+PiA4KTsKKyAgICBwT3V0WzNdID0gKGV0YzFfYnl0ZSkgZDsKK30KKworLy8gSW5wdXQgaXMgYSA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIKKy8vIGlubWFzayBpcyBhIDE2LWJpdCBtYXNrIHdoZXJlIGJpdCAoMSA8PCAoeCArIHkgKiA0KSkgdGVsbHMgd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyAoeCx5KQorLy8gcGl4ZWwgaXMgdmFsaWQgb3Igbm90LiBJbnZhbGlkIHBpeGVsIGNvbG9yIHZhbHVlcyBhcmUgaWdub3JlZCB3aGVuIGNvbXByZXNzaW5nLgorLy8gT3V0cHV0IGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgorCit2b2lkIGV0YzFfZW5jb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCisgICAgICAgIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGV0YzFfYnl0ZSBjb2xvcnNbNl07CisgICAgZXRjMV9ieXRlIGZsaXBwZWRDb2xvcnNbNl07CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBjb2xvcnMsIGZhbHNlLCBmYWxzZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBjb2xvcnMgKyAzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBmbGlwcGVkQ29sb3JzLCB0cnVlLCBmYWxzZSk7CisgICAgZXRjX2F2ZXJhZ2VfY29sb3JzX3N1YmJsb2NrKHBJbiwgaW5NYXNrLCBmbGlwcGVkQ29sb3JzICsgMywgdHJ1ZSwgdHJ1ZSk7CisKKyAgICBldGNfY29tcHJlc3NlZCBhLCBiOworICAgIGV0Y19lbmNvZGVfYmxvY2tfaGVscGVyKHBJbiwgaW5NYXNrLCBjb2xvcnMsICZhLCBmYWxzZSk7CisgICAgZXRjX2VuY29kZV9ibG9ja19oZWxwZXIocEluLCBpbk1hc2ssIGZsaXBwZWRDb2xvcnMsICZiLCB0cnVlKTsKKyAgICB0YWtlX2Jlc3QoJmEsICZiKTsKKyAgICB3cml0ZUJpZ0VuZGlhbihwT3V0LCBhLmhpZ2gpOworICAgIHdyaXRlQmlnRW5kaWFuKHBPdXQgKyA0LCBhLmxvdyk7Cit9CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCBpbWFnZSBkYXRhIChkb2VzIG5vdCBpbmNsdWRlIHNpemUgb2YgUEtNIGhlYWRlcikuCisKK2V0YzFfdWludDMyIGV0YzFfZ2V0X2VuY29kZWRfZGF0YV9zaXplKGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpIHsKKyAgICByZXR1cm4gKCgod2lkdGggKyAzKSAmIH4zKSAqICgoaGVpZ2h0ICsgMykgJiB+MykpID4+IDE7Cit9CisKKy8vIEVuY29kZSBhbiBlbnRpcmUgaW1hZ2UuCisvLyBwSW4gLSBwb2ludGVyIHRvIHRoZSBpbWFnZSBkYXRhLiBGb3JtYXR0ZWQgc3VjaCB0aGF0IHRoZSBSZWQgY29tcG9uZW50IG9mCisvLyAgICAgICBwaXhlbCAoeCx5KSBpcyBhdCBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogeSArIHJlZE9mZnNldDsKKy8vIHBPdXQgLSBwb2ludGVyIHRvIGVuY29kZWQgZGF0YS4gTXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gc3RvcmUgZW50aXJlIGVuY29kZWQgaW1hZ2UuCisKK2ludCBldGMxX2VuY29kZV9pbWFnZShjb25zdCBldGMxX2J5dGUqIHBJbiwgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKKyAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUsIGV0YzFfYnl0ZSogcE91dCkgeworICAgIGlmIChwaXhlbFNpemUgPCAyIHx8IHBpeGVsU2l6ZSA+IDMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQga1lNYXNrW10gPSB7IDB4MCwgMHhmLCAweGZmLCAweGZmZiwgMHhmZmZmIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGtYTWFza1tdID0geyAweDAsIDB4MTExMSwgMHgzMzMzLCAweDc3NzcsCisgICAgICAgICAgICAweGZmZmYgfTsKKyAgICBldGMxX2J5dGUgYmxvY2tbRVRDMV9ERUNPREVEX0JMT0NLX1NJWkVdOworICAgIGV0YzFfYnl0ZSBlbmNvZGVkW0VUQzFfRU5DT0RFRF9CTE9DS19TSVpFXTsKKworICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9ICh3aWR0aCArIDMpICYgfjM7CisgICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4zOworCisgICAgZm9yIChldGMxX3VpbnQzMiB5ID0gMDsgeSA8IGVuY29kZWRIZWlnaHQ7IHkgKz0gNCkgeworICAgICAgICBldGMxX3VpbnQzMiB5RW5kID0gaGVpZ2h0IC0geTsKKyAgICAgICAgaWYgKHlFbmQgPiA0KSB7CisgICAgICAgICAgICB5RW5kID0gNDsKKyAgICAgICAgfQorICAgICAgICBpbnQgeW1hc2sgPSBrWU1hc2tbeUVuZF07CisgICAgICAgIGZvciAoZXRjMV91aW50MzIgeCA9IDA7IHggPCBlbmNvZGVkV2lkdGg7IHggKz0gNCkgeworICAgICAgICAgICAgZXRjMV91aW50MzIgeEVuZCA9IHdpZHRoIC0geDsKKyAgICAgICAgICAgIGlmICh4RW5kID4gNCkgeworICAgICAgICAgICAgICAgIHhFbmQgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG1hc2sgPSB5bWFzayAmIGtYTWFza1t4RW5kXTsKKyAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3kgPSAwOyBjeSA8IHlFbmQ7IGN5KyspIHsKKyAgICAgICAgICAgICAgICBldGMxX2J5dGUqIHEgPSBibG9jayArIChjeSAqIDQpICogMzsKKyAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHAgPSBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogKHkgKyBjeSk7CisgICAgICAgICAgICAgICAgaWYgKHBpeGVsU2l6ZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBwLCB4RW5kICogMyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChldGMxX3VpbnQzMiBjeCA9IDA7IGN4IDwgeEVuZDsgY3grKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsID0gKHBbMV0gPDwgOCkgfCBwWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbnZlcnQ1VG84KHBpeGVsID4+IDExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb252ZXJ0NlRvOChwaXhlbCA+PiA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBjb252ZXJ0NVRvOChwaXhlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwICs9IHBpeGVsU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV0YzFfZW5jb2RlX2Jsb2NrKGJsb2NrLCBtYXNrLCBlbmNvZGVkKTsKKyAgICAgICAgICAgIG1lbWNweShwT3V0LCBlbmNvZGVkLCBzaXplb2YoZW5jb2RlZCkpOworICAgICAgICAgICAgcE91dCArPSBzaXplb2YoZW5jb2RlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIERlY29kZSBhbiBlbnRpcmUgaW1hZ2UuCisvLyBwSW4gLSBwb2ludGVyIHRvIGVuY29kZWQgZGF0YS4KKy8vIHBPdXQgLSBwb2ludGVyIHRvIHRoZSBpbWFnZSBkYXRhLiBXaWxsIGJlIHdyaXR0ZW4gc3VjaCB0aGF0IHRoZSBSZWQgY29tcG9uZW50IG9mCisvLyAgICAgICBwaXhlbCAoeCx5KSBpcyBhdCBwSW4gKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogeSArIHJlZE9mZnNldC4gTXVzdCBiZQorLy8gICAgICAgIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgaW1hZ2UuCisKKworaW50IGV0YzFfZGVjb2RlX2ltYWdlKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQsCisgICAgICAgIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCisgICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlKSB7CisgICAgaWYgKHBpeGVsU2l6ZSA8IDIgfHwgcGl4ZWxTaXplID4gMykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0YzFfYnl0ZSBibG9ja1tFVEMxX0RFQ09ERURfQkxPQ0tfU0laRV07CisKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSAod2lkdGggKyAzKSAmIH4zOworICAgIGV0YzFfdWludDMyIGVuY29kZWRIZWlnaHQgPSAoaGVpZ2h0ICsgMykgJiB+MzsKKworICAgIGZvciAoZXRjMV91aW50MzIgeSA9IDA7IHkgPCBlbmNvZGVkSGVpZ2h0OyB5ICs9IDQpIHsKKyAgICAgICAgZXRjMV91aW50MzIgeUVuZCA9IGhlaWdodCAtIHk7CisgICAgICAgIGlmICh5RW5kID4gNCkgeworICAgICAgICAgICAgeUVuZCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChldGMxX3VpbnQzMiB4ID0gMDsgeCA8IGVuY29kZWRXaWR0aDsgeCArPSA0KSB7CisgICAgICAgICAgICBldGMxX3VpbnQzMiB4RW5kID0gd2lkdGggLSB4OworICAgICAgICAgICAgaWYgKHhFbmQgPiA0KSB7CisgICAgICAgICAgICAgICAgeEVuZCA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldGMxX2RlY29kZV9ibG9jayhwSW4sIGJsb2NrKTsKKyAgICAgICAgICAgIHBJbiArPSBFVEMxX0VOQ09ERURfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3kgPSAwOyBjeSA8IHlFbmQ7IGN5KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHEgPSBibG9jayArIChjeSAqIDQpICogMzsKKyAgICAgICAgICAgICAgICBldGMxX2J5dGUqIHAgPSBwT3V0ICsgcGl4ZWxTaXplICogeCArIHN0cmlkZSAqICh5ICsgY3kpOworICAgICAgICAgICAgICAgIGlmIChwaXhlbFNpemUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkocCwgcSwgeEVuZCAqIDMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZXRjMV91aW50MzIgY3ggPSAwOyBjeCA8IHhFbmQ7IGN4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSByID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSBnID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSBiID0gKnErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0YzFfdWludDMyIHBpeGVsID0gKChyID4+IDMpIDw8IDExKSB8ICgoZyA+PiAyKSA8PCA1KSB8IChiID4+IDMpOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IChldGMxX2J5dGUpIHBpeGVsOworICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IChldGMxX2J5dGUpIChwaXhlbCA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIga01hZ2ljW10gPSB7ICdQJywgJ0snLCAnTScsICcgJywgJzEnLCAnMCcgfTsKKworc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0ZPUk1BVF9PRkZTRVQgPSA2Oworc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VUID0gODsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9FTkNPREVEX0hFSUdIVF9PRkZTRVQgPSAxMDsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9XSURUSF9PRkZTRVQgPSAxMjsKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1BLTV9IRUlHSFRfT0ZGU0VUID0gMTQ7CisKK3N0YXRpYyBjb25zdCBldGMxX3VpbnQzMiBFVEMxX1JHQl9OT19NSVBNQVBTID0gMDsKKworc3RhdGljIHZvaWQgd3JpdGVCRVVpbnQxNihldGMxX2J5dGUqIHBPdXQsIGV0YzFfdWludDMyIGRhdGEpIHsKKyAgICBwT3V0WzBdID0gKGV0YzFfYnl0ZSkgKGRhdGEgPj4gOCk7CisgICAgcE91dFsxXSA9IChldGMxX2J5dGUpIGRhdGE7Cit9CisKK3N0YXRpYyBldGMxX3VpbnQzMiByZWFkQkVVaW50MTYoY29uc3QgZXRjMV9ieXRlKiBwSW4pIHsKKyAgICByZXR1cm4gKHBJblswXSA8PCA4KSB8IHBJblsxXTsKK30KKworLy8gRm9ybWF0IGEgUEtNIGhlYWRlcgorCit2b2lkIGV0YzFfcGttX2Zvcm1hdF9oZWFkZXIoZXRjMV9ieXRlKiBwSGVhZGVyLCBldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KSB7CisgICAgbWVtY3B5KHBIZWFkZXIsIGtNYWdpYywgc2l6ZW9mKGtNYWdpYykpOworICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9ICh3aWR0aCArIDMpICYgfjM7CisgICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4zOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0ZPUk1BVF9PRkZTRVQsIEVUQzFfUkdCX05PX01JUE1BUFMpOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VULCBlbmNvZGVkV2lkdGgpOworICAgIHdyaXRlQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfSEVJR0hUX09GRlNFVCwgZW5jb2RlZEhlaWdodCk7CisgICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fV0lEVEhfT0ZGU0VULCB3aWR0aCk7CisgICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCwgaGVpZ2h0KTsKK30KKworLy8gQ2hlY2sgaWYgYSBQS00gaGVhZGVyIGlzIGNvcnJlY3RseSBmb3JtYXR0ZWQuCisKK2V0YzFfYm9vbCBldGMxX3BrbV9pc192YWxpZChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpIHsKKyAgICBpZiAobWVtY21wKHBIZWFkZXIsIGtNYWdpYywgc2l6ZW9mKGtNYWdpYykpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXRjMV91aW50MzIgZm9ybWF0ID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9GT1JNQVRfT0ZGU0VUKTsKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkV2lkdGggPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfV0lEVEhfT0ZGU0VUKTsKKyAgICBldGMxX3VpbnQzMiBlbmNvZGVkSGVpZ2h0ID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9FTkNPREVEX0hFSUdIVF9PRkZTRVQpOworICAgIGV0YzFfdWludDMyIHdpZHRoID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9XSURUSF9PRkZTRVQpOworICAgIGV0YzFfdWludDMyIGhlaWdodCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCk7CisgICAgcmV0dXJuIGZvcm1hdCA9PSBFVEMxX1JHQl9OT19NSVBNQVBTICYmCisgICAgICAgICAgICBlbmNvZGVkV2lkdGggPj0gd2lkdGggJiYgZW5jb2RlZFdpZHRoIC0gd2lkdGggPCA0ICYmCisgICAgICAgICAgICBlbmNvZGVkSGVpZ2h0ID49IGhlaWdodCAmJiBlbmNvZGVkSGVpZ2h0IC0gaGVpZ2h0IDwgNDsKK30KKworLy8gUmVhZCB0aGUgaW1hZ2Ugd2lkdGggZnJvbSBhIFBLTSBoZWFkZXIKKworZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X3dpZHRoKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcikgeworICAgIHJldHVybiByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX1dJRFRIX09GRlNFVCk7Cit9CisKKy8vIFJlYWQgdGhlIGltYWdlIGhlaWdodCBmcm9tIGEgUEtNIGhlYWRlcgorCitldGMxX3VpbnQzMiBldGMxX3BrbV9nZXRfaGVpZ2h0KGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcil7CisgICAgcmV0dXJuIHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fSEVJR0hUX09GRlNFVCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2xvZy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2xvZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyZjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9jb21tb24vbG9nLmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKworI2RlZmluZSBMT0dfQlVGX1NJWkUgMTAyNAorCitleHRlcm4gIkMiIHZvaWQKK19fYW5kcm9pZF9sb2dfYXNzZXJ0X3dpdGhfc291cmNlKGNvbnN0IGNoYXIqIGNvbmQsIGNvbnN0IGNoYXIqIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGUsIGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmd1bWVudHM7CisgIHZhX3N0YXJ0KGFyZ3VtZW50cywgZm10KTsKKyAgZnByaW50ZihzdGRlcnIsICJDT05ESVRJT04gJXMgV0FTIFRSVUUgQVQgJXM6JWRcbiIsIGNvbmQsIGZpbGUsIGxpbmUpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJndW1lbnRzKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICB2YV9lbmQoYXJndW1lbnRzKTsKKyAgYWJvcnQoKTsKK30KKworbmFtZXNwYWNlIGFyYyB7CisKK2ludCBQcmludExvZ0J1ZihpbnQgYnVmSUQsIGludCBwcmlvLCBjb25zdCBjaGFyKiB0YWcsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJndW1lbnRzOworICB2YV9zdGFydChhcmd1bWVudHMsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmd1bWVudHMpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIHZhX2VuZChhcmd1bWVudHMpOworICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFyYworCitpbnQgX19hbmRyb2lkX2xvZ19wcmludChpbnQgcHJpbywgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGNoYXIgYnVmW0xPR19CVUZfU0laRV07CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c25wcmludGYoYnVmLCBMT0dfQlVGX1NJWkUsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICByZXR1cm4gYXJjOjpQcmludExvZ0J1ZigwLCBwcmlvLCB0YWcsIGJ1Zik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL2xvZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzE3MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2NvbW1vbi9sb2cuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FORFJPSURfTE9HX0gKKyNkZWZpbmUgX0FORFJPSURfTE9HX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIElNUE9SVEFOVCBOT1RJQ0U6CisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiBBbmRyb2lkJ3Mgc2V0IG9mIHN0YWJsZSBzeXN0ZW0gaGVhZGVycworICogICBleHBvc2VkIGJ5IHRoZSBBbmRyb2lkIE5ESyAoTmF0aXZlIERldmVsb3BtZW50IEtpdCkgc2luY2UKKyAqICAgcGxhdGZvcm0gcmVsZWFzZSAxLjUKKyAqCisgKiAgIFRoaXJkLXBhcnR5IHNvdXJjZSBBTkQgYmluYXJ5IGNvZGUgcmVsaWVzIG9uIHRoZSBkZWZpbml0aW9ucworICogICBoZXJlIHRvIGJlIEZST1pFTiBPTiBBTEwgVVBDT01JTkcgUExBVEZPUk0gUkVMRUFTRVMuCisgKgorICogICAtIERPIE5PVCBNT0RJRlkgRU5VTVMgKEVYQ0VQVCBJRiBZT1UgQUREIE5FVyAzMi1CSVQgVkFMVUVTKQorICogICAtIERPIE5PVCBNT0RJRlkgQ09OU1RBTlRTIE9SIEZVTkNUSU9OQUwgTUFDUk9TCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgU0lHTkFUVVJFIE9GIEZVTkNUSU9OUyBJTiBBTlkgV0FZCisgKiAgIC0gRE8gTk9UIENIQU5HRSBUSEUgTEFZT1VUIE9SIFNJWkUgT0YgU1RSVUNUVVJFUworICovCisKKy8qCisgKiBTdXBwb3J0IHJvdXRpbmVzIHRvIHNlbmQgbWVzc2FnZXMgdG8gdGhlIEFuZHJvaWQgaW4ta2VybmVsIGxvZyBidWZmZXIsCisgKiB3aGljaCBjYW4gbGF0ZXIgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgJ2xvZ2NhdCcgdXRpbGl0eS4KKyAqCisgKiBFYWNoIGxvZyBtZXNzYWdlIG11c3QgaGF2ZQorICogICAtIGEgcHJpb3JpdHkKKyAqICAgLSBhIGxvZyB0YWcKKyAqICAgLSBzb21lIHRleHQKKyAqCisgKiBUaGUgdGFnIG5vcm1hbGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBjb21wb25lbnQgdGhhdCBlbWl0cyB0aGUgbG9nIG1lc3NhZ2UsCisgKiBhbmQgc2hvdWxkIGJlIHJlYXNvbmFibHkgc21hbGwuCisgKgorICogTG9nIG1lc3NhZ2UgdGV4dCBtYXkgYmUgdHJ1bmNhdGVkIHRvIGxlc3MgdGhhbiBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYworICogbGltaXQgKGUuZy4gMTAyMyBjaGFyYWN0ZXJzIG1heCkuCisgKgorICogTm90ZSB0aGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKCJcbiIpIHdpbGwgYmUgYXBwZW5kZWQgYXV0b21hdGljYWxseSB0byB5b3VyCisgKiBsb2cgbWVzc2FnZSwgaWYgbm90IGFscmVhZHkgdGhlcmUuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBzZW5kIHNldmVyYWwgbWVzc2FnZXMKKyAqIGFuZCBoYXZlIHRoZW0gYXBwZWFyIG9uIGEgc2luZ2xlIGxpbmUgaW4gbG9nY2F0LgorICoKKyAqIFBMRUFTRSBVU0UgTE9HUyBXSVRIIE1PREVSQVRJT046CisgKgorICogIC0gU2VuZGluZyBsb2cgbWVzc2FnZXMgZWF0cyBDUFUgYW5kIHNsb3cgZG93biB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUKKyAqICAgIHN5c3RlbS4KKyAqCisgKiAgLSBUaGUgY2lyY3VsYXIgbG9nIGJ1ZmZlciBpcyBwcmV0dHkgc21hbGwgKDw2NEtCKSwgc2VuZGluZyBtYW55IG1lc3NhZ2VzCisgKiAgICBtaWdodCBwdXNoIG9mZiBvdGhlciBpbXBvcnRhbnQgbG9nIG1lc3NhZ2VzIGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKyAqCisgKiAgLSBJbiByZWxlYXNlIGJ1aWxkcywgb25seSBzZW5kIGxvZyBtZXNzYWdlcyB0byBhY2NvdW50IGZvciBleGNlcHRpb25hbAorICogICAgY29uZGl0aW9ucy4KKyAqCisgKiBOT1RFOiBUaGVzZSBmdW5jdGlvbnMgTVVTVCBiZSBpbXBsZW1lbnRlZCBieSAvc3lzdGVtL2xpYi9saWJsb2cuc28KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIEFuZHJvaWQgbG9nIHByaW9yaXR5IHZhbHVlcywgaW4gYXNjZW5kaW5nIHByaW9yaXR5IG9yZGVyLgorICovCit0eXBlZGVmIGVudW0gYW5kcm9pZF9Mb2dQcmlvcml0eSB7CisgICAgQU5EUk9JRF9MT0dfVU5LTk9XTiA9IDAsCisgICAgQU5EUk9JRF9MT0dfREVGQVVMVCwgICAgLyogb25seSBmb3IgU2V0TWluUHJpb3JpdHkoKSAqLworICAgIEFORFJPSURfTE9HX1ZFUkJPU0UsCisgICAgQU5EUk9JRF9MT0dfREVCVUcsCisgICAgQU5EUk9JRF9MT0dfSU5GTywKKyAgICBBTkRST0lEX0xPR19XQVJOLAorICAgIEFORFJPSURfTE9HX0VSUk9SLAorICAgIEFORFJPSURfTE9HX0ZBVEFMLAorICAgIEFORFJPSURfTE9HX1NJTEVOVCwgICAgIC8qIG9ubHkgZm9yIFNldE1pblByaW9yaXR5KCk7IG11c3QgYmUgbGFzdCAqLworfSBhbmRyb2lkX0xvZ1ByaW9yaXR5OworCisvKgorICogU2VuZCBhIHNpbXBsZSBzdHJpbmcgdG8gdGhlIGxvZy4KKyAqLworaW50IF9fYW5kcm9pZF9sb2dfd3JpdGUoaW50IHByaW8sIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqdGV4dCk7CisKKy8qCisgKiBTZW5kIGEgZm9ybWF0dGVkIHN0cmluZyB0byB0aGUgbG9nLCB1c2VkIGxpa2UgcHJpbnRmKGZtdCwuLi4pCisgKi8KK2ludCBfX2FuZHJvaWRfbG9nX3ByaW50KGludCBwcmlvLCBjb25zdCBjaGFyICp0YWcsICBjb25zdCBjaGFyICpmbXQsIC4uLikKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2lmZGVmIF9fVVNFX01JTkdXX0FOU0lfU1RESU8KKyNpZiBfX1VTRV9NSU5HV19BTlNJX1NURElPCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChnbnVfcHJpbnRmLCAzLCA0KSkpCisjZWxzZQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpCisjZW5kaWYKKyNlbHNlCisgICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDMsIDQpKSkKKyNlbmRpZgorI2VuZGlmCisgICAgOworCisvKgorICogQSB2YXJpYW50IG9mIF9fYW5kcm9pZF9sb2dfcHJpbnQoKSB0aGF0IHRha2VzIGEgdmFfbGlzdCB0byBsaXN0CisgKiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCisgKi8KK2ludCBfX2FuZHJvaWRfbG9nX3ZwcmludChpbnQgcHJpbywgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisKKy8qCisgKiBMb2cgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgYW5kIGFib3J0IHRoZSBwcm9jZXNzIHRvIGhhdmUgYSBjaGFuY2UKKyAqIHRvIGluc3BlY3QgaXQgaWYgYSBkZWJ1Z2dlciBpcyBhdHRhY2hlZC4gVGhpcyB1c2VzIHRoZSBGQVRBTCBwcmlvcml0eS4KKyAqLwordm9pZCBfX2FuZHJvaWRfbG9nX2Fzc2VydChjb25zdCBjaGFyICpjb25kLCBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorI2lmIGRlZmluZWQoX19HTlVDX18pCisgICAgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSkKKyNpZmRlZiBfX1VTRV9NSU5HV19BTlNJX1NURElPCisjaWYgX19VU0VfTUlOR1dfQU5TSV9TVERJTworICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQoZ251X3ByaW50ZiwgMywgNCkpKQorI2Vsc2UKKyAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMywgNCkpKQorI2VuZGlmCisjZWxzZQorICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpCisjZW5kaWYKKyNlbmRpZgorICAgIDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9BTkRST0lEX0xPR19IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL3JlbmRlcmluZ19pbnRlcmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9jb21tb24vcmVuZGVyaW5nX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YzdiMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvY29tbW9uL3JlbmRlcmluZ19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorLy8KKy8vIEFic3RyYWN0IGludGVyZmFjZSB0byBhIHBlcHBlciBwbHVnaW4uICBXZSBhcmUgaW50ZW50aW9uYWxseSBhdm9pZGluZworLy8gdXNpbmcgYW55dGhpbmcgZnJvbSB0aGUgcHAgbmFtZXNwYWNlIGluIGhvcGVzIG9mIGtlZXBpbmcgYSBjbGVhbgorLy8gYWJzdHJhY3Rpb24gbGF5ZXIgYmV0d2VlbiBBbmRyb2lkIGNvZGUgYW5kIENocm9tZSBQZXBwZXIgY29kZS4KKworI2lmbmRlZiBDT01NT05fUkVOREVSSU5HX0lOVEVSRkFDRV9IXworI2RlZmluZSBDT01NT05fUkVOREVSSU5HX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgZW11Z2wgeworCisvLyBPcGFxdWUgdHlwZSBvZiBHUFUgY29udGV4dCBwb2ludGVycy4KK3N0cnVjdCBDb250ZXh0R1BVIHsKKyAgdmlydHVhbCB+Q29udGV4dEdQVSgpIHt9CisKKyAgLy8gbmV2ZXIgdXNlZAorICAvLyB2aXJ0dWFsIHZvaWQqIFRvTmF0aXZlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9jaygpID0gMDsKKyAgdmlydHVhbCB2b2lkIFVubG9jaygpID0gMDsKK307CisKK2NsYXNzIEdyYXBoaWNzT2JzZXJ2ZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIE9uR3JhcGhpY3NSZXNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7fQorCisgIHZpcnR1YWwgdm9pZCBPbkdyYXBoaWNzQ29udGV4dHNMb3N0KCkge30KKyAgdmlydHVhbCB2b2lkIE9uR3JhcGhpY3NDb250ZXh0c1Jlc3RvcmVkKCkge30KK307CisKK2NsYXNzIFJlbmRlcmVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisjaWZuZGVmIF9XSU4zMgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludDMyX3Q+IEF0dHJpYnV0ZXM7CisjZWxzZQorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD4gQXR0cmlidXRlczsKKyNlbmRpZgorCisgIHN0cnVjdCBSZW5kZXJQYXJhbXMgeworICAgIFJlbmRlclBhcmFtcygpCisgICAgICAgIDogd2lkdGgoMCksCisgICAgICAgICAgaGVpZ2h0KDApLAorICAgICAgICAgIGRpc3BsYXlfZGVuc2l0eSgwKSwKKyAgICAgICAgICB2c3luY19wZXJpb2QoMCksCisgICAgICAgICAgZGV2aWNlX3JlbmRlcl90b192aWV3X3BpeGVscygwLmYpLAorICAgICAgICAgIGNyeF9yZW5kZXJfdG9fdmlld19waXhlbHMoMC5mKSB7CisgICAgfQorCisgICAgLy8gV2lkdGggb2YgZGlzcGxheSBpbiBhY3R1YWwgcGl4ZWxzLgorICAgIGludCB3aWR0aDsKKyAgICAvLyBXaWR0aCBvZiBkaXNwbGF5IGluIGFjdHVhbCBwaXhlbHMuCisgICAgaW50IGhlaWdodDsKKyAgICAvLyBEZXZpY2UgZGlzcGxheSBkZW5zaXR5LgorICAgIGludCBkaXNwbGF5X2RlbnNpdHk7CisgICAgLy8gVnN5bmMgcGVyaW9kLgorICAgIGludCB2c3luY19wZXJpb2Q7CisgICAgLy8gRGV2aWNlIHNjYWxlIGZyb20gZGV2aWNlIGluZGVwZW5kZW50IHBpeGVscyB0byBhY3R1YWwgcGl4ZWxzLgorICAgIGZsb2F0IGRldmljZV9yZW5kZXJfdG9fdmlld19waXhlbHM7CisgICAgLy8gTGlrZSBjcnhfcmVuZGVyX3RvX3ZpZXdfcGl4ZWxzLCBjb250cm9scyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLyBHcmFwaGljczNEL0ltYWdlMkQgcmVzb3VyY2UuIFNlZSBhbHNvIGNvbW1vbi9vcHRpb25zLmguCisgICAgLy8gVE9ETzogY29tbW9uL29wdGlvbnMuaCBkb2VzIG5vdCBhcHBseSBiZXlvbmQgYXJjLCBmaWdvdXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcworICAgIGZsb2F0IGNyeF9yZW5kZXJfdG9fdmlld19waXhlbHM7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVuZGVyUGFyYW1zJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiB3aWR0aCA9PSByaHMud2lkdGggJiYKKyAgICAgICAgICAgICBoZWlnaHQgPT0gcmhzLmhlaWdodCAmJgorICAgICAgICAgICAgIGRldmljZV9yZW5kZXJfdG9fdmlld19waXhlbHMgPT0gcmhzLmRldmljZV9yZW5kZXJfdG9fdmlld19waXhlbHMgJiYKKyAgICAgICAgICAgICBjcnhfcmVuZGVyX3RvX3ZpZXdfcGl4ZWxzID09IHJocy5jcnhfcmVuZGVyX3RvX3ZpZXdfcGl4ZWxzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVuZGVyUGFyYW1zJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PShyaHMpOworICAgIH0KKworICAgIGludCBDb252ZXJ0RnJvbURJUChmbG9hdCB4eV9pbl9kaXApIGNvbnN0IHsKKyAgICAgIGZsb2F0IHNjYWxlID0gZGV2aWNlX3JlbmRlcl90b192aWV3X3BpeGVscyAqIGNyeF9yZW5kZXJfdG9fdmlld19waXhlbHM7CisgICAgICByZXR1cm4geHlfaW5fZGlwICogc2NhbGU7CisgICAgfQorICAgIGZsb2F0IENvbnZlcnRUb0RJUChpbnQgeHkpIGNvbnN0IHsKKyAgICAgIGZsb2F0IHNjYWxlID0gZGV2aWNlX3JlbmRlcl90b192aWV3X3BpeGVscyAqIGNyeF9yZW5kZXJfdG9fdmlld19waXhlbHM7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHh5KSAvIHNjYWxlOworICAgIH0KKyAgfTsKKworICB2aXJ0dWFsIH5SZW5kZXJlckludGVyZmFjZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkIEdldFJlbmRlclBhcmFtcyhSZW5kZXJQYXJhbXMqIHBhcmFtcykgY29uc3QgPSAwOworCisgIHZpcnR1YWwgQ29udGV4dEdQVSogQ3JlYXRlQ29udGV4dChjb25zdCBBdHRyaWJ1dGVzJiBhdHRyaWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dEdQVSogc2hhcmVkX2NvbnRleHQpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgQmluZENvbnRleHQoQ29udGV4dEdQVSogY29udGV4dCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBTd2FwQnVmZmVycyhDb250ZXh0R1BVKiBjb250ZXh0KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIERlc3Ryb3lDb250ZXh0KENvbnRleHRHUFUqIGNvbnRleHQpID0gMDsKKworICAvLyBOZWVkZWQgZm9yIG5vbi1wZXBwZXIzZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmlydHVhbCB2b2lkIE1ha2VDdXJyZW50KENvbnRleHRHUFUqIGNvbnRleHQpID0gMDsKKworICAvLyBVc2VkIGZvciB0ZXN0IHB1cnBvc2UgZnJvbSBvcmcuY2hyb21pdW0uYXJjLkRlYnVnCisgIHZpcnR1YWwgdm9pZCBGb3JjZUNvbnRleHRzTG9zdCgpID0gMDsKKworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCisKKyNlbmRpZiAgLy8gQ09NTU9OX1JFTkRFUklOR19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2FwaV9lbnRyaWVzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2FwaV9lbnRyaWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM1ZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvYXBpX2VudHJpZXMuY3BwCkBAIC0wLDAgKzEsNTI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxFVEMxL2V0YzEuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJjb21tb24vZGxvZy5oIgorI2luY2x1ZGUgImdsZXMvYnVmZmVyX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9lZ2xfaW1hZ2UuaCIKKyNpbmNsdWRlICJnbGVzL2ZyYW1lYnVmZmVyX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL2dsZXNfY29udGV4dC5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc191dGlscy5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc192YWxpZGF0ZS5oIgorI2luY2x1ZGUgImdsZXMvbWFjcm9zLmgiCisjaW5jbHVkZSAiZ2xlcy9wYWxldHRlZF90ZXh0dXJlX3V0aWwuaCIKKyNpbmNsdWRlICJnbGVzL3Byb2dyYW1fZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvcmVuZGVyYnVmZmVyX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL3NoYWRlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy90ZXh0dXJlX2NvZGVjcy5oIgorI2luY2x1ZGUgImdsZXMvdGV4dHVyZV9kYXRhLmgiCisKKyNpbmNsdWRlICJnbGVzL2dsZXMxMl9pbnRlcm5hbF9kaXNwYXRjaC5oIgorCit0eXBlZGVmIEdsZXNDb250ZXh0KiBDb250ZXh0UHRyOworCituYW1lc3BhY2UgeworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFyYW1FbGVtZW50U2l6ZSA9IDE2OworCisgICAgZW51bSBQYXJhbVR5cGUgeworICAgICAgICBrUGFyYW1UeXBlQXJyYXksCisgICAgICAgIGtQYXJhbVR5cGVTY2FsYXIsCisgICAgfTsKKworICAgIGVudW0gSGFuZGxpbmdLaW5kIHsKKyAgICAgICAga0hhbmRsaW5nS2luZEludmFsaWQgPSAwLAorICAgICAgICBrSGFuZGxpbmdLaW5kTG9jYWxDb3B5ID0gMSA8PCAwLCAgICAvLyBUcmFjayBjYXBhYmlsaXR5IGluIGNvbnRleHQuCisgICAgICAgIGtIYW5kbGluZ0tpbmRUZXh0dXJlID0gMSA8PCAxLCAgICAgIC8vIFRyYWNrIGNhcGFiaWxpdHkgaW4gdGV4dHVyZSBjb250ZXh0LgorICAgICAgICBrSGFuZGxpbmdLaW5kVW5pZm9ybSA9IDEgPDwgMiwgICAgICAvLyBUcmFjayBjYXBhYmlsaXR5IGluIHVuaWZvcm0gY29udGV4dC4KKyAgICAgICAga0hhbmRsaW5nS2luZElnbm9yZWQgPSAxIDw8IDMsICAgICAgLy8gVW5zdXBwb3J0ZWQgY2FwYWJpbGl0eSwgYnV0IGNhbiBiZQorICAgICAgICAvLyBpZ25vcmVkLgorICAgICAgICBrSGFuZGxpbmdLaW5kVW5zdXBwb3J0ZWQgPSAxIDw8IDQsICAvLyBVbnN1cHBvcnRlZCBjYXBhYmlsaXR5LgorICAgICAgICBrSGFuZGxpbmdLaW5kUHJvcGFnYXRlID0gMSA8PCA1LCAgICAvLyBQYXNzIHRocm91Z2ggdG8gaW1wbGVtZW50YXRpb24uCisgICAgfTsKKworICAgIC8vIFRoZSBjYWxscyB0byBFbmFibGUgYW5kIERpc2FibGUgYXJlIGJvdGggaGFuZGxlZCB2ZXJ5IHNpbWlsYXJseSwgYW5kIHdlIGNhbgorICAgIC8vIGVsaW1pbmF0ZSBzb21lIGNvZGUgZHVwbGljYXRpb24gYnkgaGF2aW5nIGEgY29tbW9uIHNldCBvZiBsb2dpYyB0aGF0IGtub3dzCisgICAgLy8gaG93IGVhY2ggY2FwYWJpbGl0eSBzaG91bGQgYmUgaGFuZGxlZC4KKyAgICBpbnQgR2V0Q2FwYWJpbGl0eUhhbmRsaW5nS2luZChHTGVudW0gY2FwKSB7CisgICAgICAgIHN3aXRjaCAoY2FwKSB7CisgICAgICAgICAgICAvLyBUaGVzZSBjYXBhYmlsaXRpZXMgcmVwcmVzZW50IHN0YXRlIHdlIGRvIG5vdCBuZWVkIHRvIGVtdWxhdGUuCisgICAgICAgICAgICBjYXNlIEdMX0JMRU5EOgorICAgICAgICAgICAgY2FzZSBHTF9DVUxMX0ZBQ0U6CisgICAgICAgICAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6CisgICAgICAgICAgICBjYXNlIEdMX0RJVEhFUjoKKyAgICAgICAgICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKKyAgICAgICAgICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOgorICAgICAgICAgICAgY2FzZSBHTF9TQU1QTEVfQ09WRVJBR0U6CisgICAgICAgICAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDoKKyAgICAgICAgICAgIGNhc2UgR0xfU1RFTkNJTF9URVNUOgorICAgICAgICAgICAgICAgIHJldHVybiBrSGFuZGxpbmdLaW5kUHJvcGFnYXRlIHwga0hhbmRsaW5nS2luZExvY2FsQ29weTsKKworICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNhcGFiaWxpdGllcyByZXByZXNlbnQgR0xFUzEgc3RhdGUgd2UgbXVzdCBlbXVsYXRlIHVuZGVyIEdMRVMyLgorICAgICAgICAgICAgY2FzZSBHTF9BTFBIQV9URVNUOgorICAgICAgICAgICAgY2FzZSBHTF9DTElQX1BMQU5FMDoKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xJUF9QTEFORTE6CisgICAgICAgICAgICBjYXNlIEdMX0NMSVBfUExBTkUyOgorICAgICAgICAgICAgY2FzZSBHTF9DTElQX1BMQU5FMzoKKyAgICAgICAgICAgIGNhc2UgR0xfQ0xJUF9QTEFORTQ6CisgICAgICAgICAgICBjYXNlIEdMX0NMSVBfUExBTkU1OgorICAgICAgICAgICAgY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HOgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVElORzoKKyAgICAgICAgICAgIGNhc2UgR0xfTElHSFQwOgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVDE6CisgICAgICAgICAgICBjYXNlIEdMX0xJR0hUMjoKKyAgICAgICAgICAgIGNhc2UgR0xfTElHSFQzOgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVDQ6CisgICAgICAgICAgICBjYXNlIEdMX0xJR0hUNToKKyAgICAgICAgICAgIGNhc2UgR0xfTElHSFQ2OgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVDc6CisgICAgICAgICAgICBjYXNlIEdMX01BVFJJWF9QQUxFVFRFX09FUzoKKyAgICAgICAgICAgIGNhc2UgR0xfTk9STUFMSVpFOgorICAgICAgICAgICAgY2FzZSBHTF9QT0lOVF9TTU9PVEg6CisgICAgICAgICAgICBjYXNlIEdMX1BPSU5UX1NQUklURV9PRVM6CisgICAgICAgICAgICBjYXNlIEdMX1JFU0NBTEVfTk9STUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBrSGFuZGxpbmdLaW5kTG9jYWxDb3B5OworCisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtIYW5kbGluZ0tpbmRVbmlmb3JtOworCisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTOgorICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBrSGFuZGxpbmdLaW5kVGV4dHVyZTsKKworICAgICAgICAgICAgICAgIC8vIEdMX0xJTkVfU01PT1RIIGlzIG5vdCBzdXBwb3J0ZWQsIGJ1dCBpZ25vcmUgaXQgZm9yIG5vdy4KKyAgICAgICAgICAgIGNhc2UgR0xfTElORV9TTU9PVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtIYW5kbGluZ0tpbmRJZ25vcmVkIHwga0hhbmRsaW5nS2luZFVuc3VwcG9ydGVkOworCisgICAgICAgICAgICAgICAgLy8gVGhlc2UgY2FwYWJpbGl0aWVzIHJlcHJlc2VudCBHTEVTMSBzdGF0ZSB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBub3cuICBJdCBpcyBhbiBlcnJvciB0byB0cnkgdG8gZW5hYmxlIHRoZXNlLCBidXQgZGlzYWJsaW5nIHRoZW0gb3IKKyAgICAgICAgICAgICAgICAvLyB0ZXN0aW5nIGZvciB0aGVtIGlzIG9rYXkuCisgICAgICAgICAgICBjYXNlIEdMX0NPTE9SX0xPR0lDX09QOgorICAgICAgICAgICAgY2FzZSBHTF9NVUxUSVNBTVBMRToKKyAgICAgICAgICAgICAgICByZXR1cm4ga0hhbmRsaW5nS2luZFVuc3VwcG9ydGVkOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBrSGFuZGxpbmdLaW5kSW52YWxpZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERldGVybWluZXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgYSBnaXZlbiBwYXJhbWV0ZXIuCisgICAgc2l6ZV90IFBhcmFtU2l6ZShHTGVudW0gcGFyYW0pIHsKKyAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICAgICAgY2FzZSBHTF9BTFBIQV9URVNUX0ZVTkM6CisgICAgICAgICAgICBjYXNlIEdMX0FMUEhBX1RFU1RfUkVGOgorICAgICAgICAgICAgY2FzZSBHTF9CTEVORF9EU1Q6CisgICAgICAgICAgICBjYXNlIEdMX0JMRU5EX1NSQzoKKyAgICAgICAgICAgIGNhc2UgR0xfQ09OU1RBTlRfQVRURU5VQVRJT046CisgICAgICAgICAgICBjYXNlIEdMX0NVTExfRkFDRV9NT0RFOgorICAgICAgICAgICAgY2FzZSBHTF9ERVBUSF9DTEVBUl9WQUxVRToKKyAgICAgICAgICAgIGNhc2UgR0xfREVQVEhfV1JJVEVNQVNLOgorICAgICAgICAgICAgY2FzZSBHTF9GT0dfREVOU0lUWToKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX0VORDoKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX01PREU6CisgICAgICAgICAgICBjYXNlIEdMX0ZPR19TVEFSVDoKKyAgICAgICAgICAgIGNhc2UgR0xfRlJPTlRfRkFDRToKKyAgICAgICAgICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQOgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERToKKyAgICAgICAgICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgY2FzZSBHTF9MT0dJQ19PUF9NT0RFOgorICAgICAgICAgICAgY2FzZSBHTF9NQVRSSVhfTU9ERToKKyAgICAgICAgICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfU0laRToKKyAgICAgICAgICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfVU5JVFM6CisgICAgICAgICAgICBjYXNlIEdMX01PREVMVklFV19TVEFDS19ERVBUSDoKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRToKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRToKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9NQVg6CisgICAgICAgICAgICBjYXNlIEdMX1BPSU5UX1NJWkVfTUlOOgorICAgICAgICAgICAgY2FzZSBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIOgorICAgICAgICAgICAgY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046CisgICAgICAgICAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDoKKyAgICAgICAgICAgIGNhc2UgR0xfU0hBREVfTU9ERUw6CisgICAgICAgICAgICBjYXNlIEdMX1NISU5JTkVTUzoKKyAgICAgICAgICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKKyAgICAgICAgICAgIGNhc2UgR0xfU1RFTkNJTF9GQUlMOgorICAgICAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDoKKyAgICAgICAgICAgIGNhc2UgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1M6CisgICAgICAgICAgICBjYXNlIEdMX1NURU5DSUxfUkVGOgorICAgICAgICAgICAgY2FzZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSzoKKyAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEg6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9TOgorICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGNhc2UgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICAgICAgY2FzZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICAgICAgICBjYXNlIEdMX0RFUFRIX1JBTkdFOgorICAgICAgICAgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgICAgICAgIGNhc2UgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0U6CisgICAgICAgICAgICBjYXNlIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFOgorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgY2FzZSBHTF9DVVJSRU5UX05PUk1BTDoKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT046CisgICAgICAgICAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICAgICAgY2FzZSBHTF9BTUJJRU5UOgorICAgICAgICAgICAgY2FzZSBHTF9DVVJSRU5UX0NPTE9SOgorICAgICAgICAgICAgY2FzZSBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTOgorICAgICAgICAgICAgY2FzZSBHTF9ESUZGVVNFOgorICAgICAgICAgICAgY2FzZSBHTF9FTUlTU0lPTjoKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX0NPTE9SOgorICAgICAgICAgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UOgorICAgICAgICAgICAgY2FzZSBHTF9QT1NJVElPTjoKKyAgICAgICAgICAgIGNhc2UgR0xfU0NJU1NPUl9CT1g6CisgICAgICAgICAgICBjYXNlIEdMX1NQRUNVTEFSOgorICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVM6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOgorICAgICAgICAgICAgY2FzZSBHTF9WSUVXUE9SVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgICAgIGNhc2UgR0xfTU9ERUxWSUVXX01BVFJJWDoKKyAgICAgICAgICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVg6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfTUFUUklYOgorICAgICAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBwYXJhbWV0ZXIgbmFtZTogJXMgKCV4KSIsIEdldEVudW1TdHJpbmcocGFyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0pOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBDb252ZXJ0KEdMZmxvYXQqIGRhdGEsIHNpemVfdCBudW0sIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgICAgICBkYXRhW2ldID0gWDJGKHBhcmFtc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIENvbnZlcnQoR0xmaXhlZCogZGF0YSwgc2l6ZV90IG51bSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSBGMlgocGFyYW1zW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEdMdWludCBBcnJheUVudW1Ub0luZGV4KGNvbnN0IENvbnRleHRQdHImIGMsIEdMZW51bSBhcnJheSkgeworICAgICAgICBzd2l0Y2ggKGFycmF5KSB7CisgICAgICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWToKKyAgICAgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtQb3NpdGlvblZlcnRleEF0dHJpYnV0ZTsKKyAgICAgICAgICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZOgorICAgICAgICAgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4ga05vcm1hbFZlcnRleEF0dHJpYnV0ZTsKKyAgICAgICAgICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6CisgICAgICAgICAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1BPSU5URVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtDb2xvclZlcnRleEF0dHJpYnV0ZTsKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVM6CisgICAgICAgICAgICBjYXNlIEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtQb2ludFNpemVWZXJ0ZXhBdHRyaWJ1dGU7CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVk6CisgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYy0+dGV4dHVyZV9jb250ZXh0Xy5HZXRDbGllbnRBY3RpdmVUZXh0dXJlQ29vcmRBdHRyaWIoKTsKKyAgICAgICAgICAgIGNhc2UgR0xfV0VJR0hUX0FSUkFZX09FUzoKKyAgICAgICAgICAgIGNhc2UgR0xfV0VJR0hUX0FSUkFZX1BPSU5URVJfT0VTOgorICAgICAgICAgICAgICAgIHJldHVybiBrV2VpZ2h0VmVydGV4QXR0cmlidXRlOworICAgICAgICAgICAgY2FzZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTOgorICAgICAgICAgICAgY2FzZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtNYXRyaXhJbmRleFZlcnRleEF0dHJpYnV0ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBhcnJheSAlcygweCV4KSIsIEdldEVudW1TdHJpbmcoYXJyYXkpLCBhcnJheSk7CisgICAgICAgIH0KKyAgICB9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBVbmxlc3Mgd2Ugc2VwYXJhdGUgImVudHJ5IHBvaW50cyIgYnkgdXNlcnMgb2YgdGhlIGxpYnJhcnkKKy8vIGZyb20gaW50ZXJuYWwgdXNlcyBvZiBnbCBmdW5jdGlvbnMsIHdlIGNvdWxkIGVuZCB1cCBpbgorLy8gYSBzaXR1YXRpb24gd2hlcmUgdGhlIGhvc3Qgc3lzdGVtJ3MgR0wgZHJpdmVyIHNoYWRvd3MKKy8vIE9wZW5HTCBmdW5jdGlvbiBuYW1lcywgY2F1c2luZyBzZWdmYXVsdHMgYW5kIG90aGVyIGJhZG5lc3MuCisKKy8vIFRoZXNlIG1hY3JvcyBkbyB0aGUgZm9sbG93aW5nOgorLy8gMS4gRm9yd2FyZC1kZWNsYXJlIEdMRVN2MSBlbnRyeSBwb2ludHMuCisvLyAyLiBGb3J3YXJkLWRlY2xhcmUgIkltcGxlbWVudGF0aW9uIiBmdW5jdGlvbnMgdGhhdCBhcmUgdGhlbgorLy8gICAgY2FsbGVkIGJ5IHRoZSBlbnRyeSBwb2ludHMuCisvLyAzLiBEZWZpbmUgdGhlIGVudHJ5IHBvaW50cyBpbiB0ZXJtcyBvZiBqdXN0IGRpcmVjdGx5IGNhbGxpbmcKKy8vICAgIHRoZSBpbXBsZW1lbnRhdGlvbi4KKy8vIDQuIERlZmluZSBhIHN0cnVjdCBob2xkaW5nIHRoZSAqKipJbXBsIGZ1bmN0aW9ucy4KKy8vIDUuIE1ha2UgYWxsIGNhbGxzIHRvIEdMRVN2MSBpbnRlcm5hbCB0byB0cmFuc2xhdG9yIHVzZQorLy8gICAgKioqSW1wbCBmdW5jdGlvbnMgaW5zaWRlIHRoZSBzdHJ1Y3QsIGluc3RlYWQgb2YgYQorLy8gICAgZ2xvYmFsIEdMRVN2MSBlbnRyeSBwb2ludC4gVGhpcyBhdm9pZHMgdGhlIHNoYWRvd2luZy4KKworI2RlZmluZSBGV0RfREVDTEFSRShyZXR1cm5fdHlwZSwgZnVuY19uYW1lLCBzaWduYXR1cmUsIGFyZ3MpIFwKKyAgICBFWFBPUlRfREVDTCByZXR1cm5fdHlwZSBmdW5jX25hbWUgc2lnbmF0dXJlOworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIEZXRF9ERUNMQVJFX0lNUEwocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBhcmdzKSBcCisgICAgcmV0dXJuX3R5cGUgX19zdGRjYWxsIGZ1bmNfbmFtZSMjSW1wbCBzaWduYXR1cmU7CisjZWxzZQorI2RlZmluZSBGV0RfREVDTEFSRV9JTVBMKHJldHVybl90eXBlLCBmdW5jX25hbWUsIHNpZ25hdHVyZSwgYXJncykgXAorICAgIHJldHVybl90eXBlIGZ1bmNfbmFtZSMjSW1wbCBzaWduYXR1cmU7CisjZW5kaWYKKworI2RlZmluZSBET19SRVRVUk4ocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgYXJncykgRE9fUkVUVVJOIyNyZXR1cm5fdHlwZShmdW5jX25hbWUsIGFyZ3MpCisKKyNkZWZpbmUgRE9fUkVUVVJOdm9pZChmdW5jX25hbWUsIGFyZ3MpIGZ1bmNfbmFtZSBhcmdzOworI2RlZmluZSBET19SRVRVUk5HTGVudW0oZnVuY19uYW1lLCBhcmdzKSByZXR1cm4gZnVuY19uYW1lIGFyZ3M7CisjZGVmaW5lIERPX1JFVFVSTkdMdWludChmdW5jX25hbWUsIGFyZ3MpIHJldHVybiBmdW5jX25hbWUgYXJnczsKKyNkZWZpbmUgRE9fUkVUVVJOR0xpbnQoZnVuY19uYW1lLCBhcmdzKSByZXR1cm4gZnVuY19uYW1lIGFyZ3M7CisjZGVmaW5lIERPX1JFVFVSTkdMYm9vbGVhbihmdW5jX25hbWUsIGFyZ3MpIHJldHVybiBmdW5jX25hbWUgYXJnczsKKyNkZWZpbmUgRE9fUkVUVVJOR0x2b2lkcHRyKGZ1bmNfbmFtZSwgYXJncykgcmV0dXJuIGZ1bmNfbmFtZSBhcmdzOworI2RlZmluZSBET19SRVRVUk5jb25zdEdMdWJ5dGUoZnVuY19uYW1lLCBhcmdzKSByZXR1cm4gZnVuY19uYW1lIGFyZ3M7CisKKyNkZWZpbmUgREVGSU5FX0VOVFJZUFQocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBhcmdzKSBcCisgICAgRVhQT1JUX0RFQ0wgcmV0dXJuX3R5cGUgZnVuY19uYW1lIHNpZ25hdHVyZSB7IFwKKyAgICAgICAgRE9fUkVUVVJOKHJldHVybl90eXBlLCBmdW5jX25hbWUjI0ltcGwsIGFyZ3MpIFwKKyAgICB9CisKK0xJU1RfR0xFUzEyVFJfSU5URVJOQUxfRlVOQ1RJT05TKEZXRF9ERUNMQVJFKQorTElTVF9HTEVTMTJUUl9JTlRFUk5BTF9GVU5DVElPTlMoRldEX0RFQ0xBUkVfSU1QTCkKK0xJU1RfR0xFUzEyVFJfSU5URVJOQUxfRlVOQ1RJT05TKERFRklORV9FTlRSWVBUKQorCitzdGF0aWMgR0xFUzEyVHJhbnNsYXRvckZ1bmNzIHNUcmFuc2xhdG9yRnVuY3MgPSB7CisjZGVmaW5lIEFTU0lHTl9UUkFOU0xBVE9SX0ZVTkMocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBjYWxsYXJncykgXAorICAgIC5pbnRlcm5hbCMjZnVuY19uYW1lID0gZnVuY19uYW1lIyNJbXBsLAorICAgIExJU1RfR0xFUzEyVFJfSU5URVJOQUxfRlVOQ1RJT05TKEFTU0lHTl9UUkFOU0xBVE9SX0ZVTkMpCit9OworCisjZGVmaW5lIFRSQ0FMTChYKSBzVHJhbnNsYXRvckZ1bmNzLmludGVybmFsIyNYCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgQVBJRU5UUllfSU1QTChfcmV0dXJuLCBfbmFtZSwgLi4uKSBcCisgICAgX3JldHVybiBfX3N0ZGNhbGwgZ2wjI19uYW1lIyNJbXBsKF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgQVBJRU5UUllfSU1QTChfcmV0dXJuLCBfbmFtZSwgLi4uKSBcCisgICAgX3JldHVybiBnbCMjX25hbWUjI0ltcGwoX19WQV9BUkdTX18pCisjZW5kaWYKKworLy8gQWN0dWFsIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgR0xFU3YxLT4yIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBiZWxvdy4KKworLy8gU2VsZWN0cyB0aGUgc2VydmVyIHRleHR1cmUgdW5pdCBzdGF0ZSB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYnkgc2VydmVyCisvLyB0ZXh0dXJlIHN0YXRlIGNhbGxzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBBY3RpdmVUZXh0dXJlLCBHTGVudW0gdGV4dHVyZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFjLT51bmlmb3JtX2NvbnRleHRfLlNldEFjdGl2ZVRleHR1cmUodGV4dHVyZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGV4dHVyZSk7CisgICAgfQorICAgIGlmICghYy0+dGV4dHVyZV9jb250ZXh0Xy5TZXRBY3RpdmVUZXh0dXJlKHRleHR1cmUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRleHR1cmUpOworICAgIH0KKyAgICBQQVNTX1RIUk9VR0goYywgQWN0aXZlVGV4dHVyZSwgdGV4dHVyZSk7Cit9CisKKy8vIERpc2NhcmQgcGl4ZWwgd3JpdGVzIGJhc2VkIG9uIGFuIGFscGhhIHZhbHVlIHRlc3QuCitBUElFTlRSWV9JTVBMKHZvaWQsIEFscGhhRnVuYywgR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRBbHBoYUZ1bmMoZnVuYykpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oZnVuYyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBbHBoYVRlc3QmIGFscGhhID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVBbHBoYVRlc3QoKTsKKyAgICBhbHBoYS5mdW5jID0gZnVuYzsKKyAgICBhbHBoYS52YWx1ZSA9IENsYW1wVmFsdWUocmVmLCAwLmYsIDEuZik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQWxwaGFGdW5jeCwgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQWxwaGFGdW5jKGZ1bmMsIFgyRihyZWYpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQWxwaGFGdW5jeE9FUywgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQWxwaGFGdW5jKGZ1bmMsIFgyRihyZWYpKSk7Cit9CisKKy8vIEF0dGFjaGVzIGEgc2hhZGVyIG9iamVjdCB0byBhIHByb2dyYW0gb2JqZWN0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBBdHRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgU2hhZGVyRGF0YVB0ciBzaGFkZXJfZGF0YSA9IHNnLT5HZXRTaGFkZXJEYXRhKHNoYWRlcik7CisgICAgaWYgKHNoYWRlcl9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkludmFsaWQgc2hhZGVyICVkIiwgc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+QXR0YWNoU2hhZGVyKHNoYWRlcl9kYXRhKTsKK30KKworLy8gUmVxdWVzdHMgYSBuYW1lZCBzaGFkZXIgYXR0cmlidXRlIGJlIGFzc2lnbmVkIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgaW5kZXguCitBUElFTlRSWV9JTVBMKHZvaWQsIEJpbmRBdHRyaWJMb2NhdGlvbiwgR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gc2ctPkdldFByb2dyYW1EYXRhKHByb2dyYW0pOworICAgIGlmIChwcm9ncmFtX2RhdGEgPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiSW52YWxpZCBwcm9ncmFtICVkIiwgcHJvZ3JhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9ncmFtX2RhdGEtPkJpbmRBdHRyaWJMb2NhdGlvbihpbmRleCwgbmFtZSk7Cit9CisKKy8vIEJpbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgYXMgdmVydGV4IGJ1ZmZlciBvciBpbmRleCBidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJpbmRCdWZmZXIsIEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkQnVmZmVyVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisKKyAgICBCdWZmZXJEYXRhUHRyIG9iaiA9IHNnLT5HZXRCdWZmZXJEYXRhKGJ1ZmZlcik7CisgICAgaWYgKG9iaiA9PSBOVUxMICYmIGJ1ZmZlciAhPSAwKSB7CisgICAgICAgIHNnLT5DcmVhdGVCdWZmZXJEYXRhKGJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIpIHsKKyAgICAgICAgYy0+YXJyYXlfYnVmZmVyX2JpbmRpbmdfID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmVsZW1lbnRfYnVmZmVyX2JpbmRpbmdfID0gYnVmZmVyOworICAgIH0KKyAgICBQQVNTX1RIUk9VR0goYywgQmluZEJ1ZmZlciwgdGFyZ2V0LCBzZy0+R2V0QnVmZmVyR2xvYmFsTmFtZShidWZmZXIpKTsKK30KKworLy8gU3BlY2lmeSBmcmFtZWJ1ZmZlciBmb3Igb2ZmLXNjcmVlbiByZW5kZXJpbmcuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJpbmRGcmFtZWJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZEZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisKKyAgICBGcmFtZWJ1ZmZlckRhdGFQdHIgb2JqID0gc2ctPkdldEZyYW1lYnVmZmVyRGF0YShmcmFtZWJ1ZmZlcik7CisgICAgaWYgKG9iaiA9PSBOVUxMICYmIGZyYW1lYnVmZmVyICE9IDApIHsKKyAgICAgICAgc2ctPkNyZWF0ZUZyYW1lYnVmZmVyRGF0YShmcmFtZWJ1ZmZlcik7CisgICAgfQorICAgIGMtPkJpbmRGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQmluZEZyYW1lYnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEJpbmRGcmFtZWJ1ZmZlcih0YXJnZXQsIGZyYW1lYnVmZmVyKSk7Cit9CisKKy8vIFNwZWNpZnkgdGhlIHJlbmRlcmJ1ZmZlciB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYnkgcmVuZGVyYnVmZmVyIGNhbGxzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBCaW5kUmVuZGVyYnVmZmVyLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworCisgICAgUmVuZGVyYnVmZmVyRGF0YVB0ciBvYmogPSBzZy0+R2V0UmVuZGVyYnVmZmVyRGF0YShyZW5kZXJidWZmZXIpOworICAgIGlmIChvYmogPT0gTlVMTCAmJiByZW5kZXJidWZmZXIgIT0gMCkgeworICAgICAgICBzZy0+Q3JlYXRlUmVuZGVyYnVmZmVyRGF0YShyZW5kZXJidWZmZXIpOworICAgIH0KKworICAgIGMtPnJlbmRlcmJ1ZmZlcl9iaW5kaW5nXyA9IHJlbmRlcmJ1ZmZlcjsKKyAgICBjb25zdCBHTHVpbnQgZ2xvYmFsX25hbWUgPSBzZy0+R2V0UmVuZGVyYnVmZmVyR2xvYmFsTmFtZShyZW5kZXJidWZmZXIpOworICAgIFBBU1NfVEhST1VHSChjLCBCaW5kUmVuZGVyYnVmZmVyLCBHTF9SRU5ERVJCVUZGRVIsIGdsb2JhbF9uYW1lKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBCaW5kUmVuZGVyYnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xCaW5kUmVuZGVyYnVmZmVyKHRhcmdldCwgcmVuZGVyYnVmZmVyKSk7Cit9CisKKy8vIFRoaXMgY2FsbCBtYWtlcyB0aGUgZ2l2ZW4gdGV4dHVyZSBuYW1lIHRoZSBjdXJyZW50IHRleHR1cmUgb2YKKy8vIGtpbmQgInRhcmdldCIgKHdoaWNoIGlzIHVzdWFsbHkgR0xfVEVYVFVSRV8yRCkgd2hpY2ggbGF0ZXIKKy8vIGVudmlyb25tZW50L3BhcmFtZXRlciBjYWxscyB3aWxsIHJlZmVyZW5jZSwgYW5kIFMvVCB0ZXh0dXJlCisvLyBtYXBwaW5nIGNvb3JkaW5hdGVzIGFwcGx5IHRvLgorQVBJRU5UUllfSU1QTCh2b2lkLCBCaW5kVGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkVGV4dHVyZVRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIERMT0coIk5vdCBhIHZhbGlkIHRleHR1cmUgdGFyZ2V0ISIpOworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRExPRygiR2V0IHNoYXJlIGdyb3VwIik7CisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKworICAgIGJvb2wgZmlyc3RfdXNlID0gZmFsc2U7CisgICAgVGV4dHVyZURhdGFQdHIgdGV4OworCisgICAgLy8gSGFuZGxlIHNwZWNpYWwtY2FzZSAwIHRleHR1cmUuCisgICAgaWYgKHRleHR1cmUgPT0gMCkgeworICAgICAgICBETE9HKCJzcGVjaWFsLWNhc2UgMCB0ZXh0dXJlIik7CisgICAgICAgIHRleCA9IGMtPnRleHR1cmVfY29udGV4dF8uR2V0RGVmYXVsdFRleHR1cmVEYXRhKHRhcmdldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRExPRygiTm90IHRoZSAwIHRleHR1cmUiKTsKKyAgICAgICAgdGV4ID0gc2ctPkdldFRleHR1cmVEYXRhKHRleHR1cmUpOworICAgICAgICBETE9HKCJHb3QgdGV4dHVyZSBkYXRhIik7CisgICAgICAgIGlmICh0ZXggPT0gTlVMTCkgeworICAgICAgICAgICAgdGV4ID0gc2ctPkNyZWF0ZVRleHR1cmVEYXRhKHRleHR1cmUpOworICAgICAgICAgICAgZmlyc3RfdXNlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGV4ID09IE5VTEwpIHsKKyAgICAgICAgRExPRygidGV4IGlzIG51bGwsIHF1aXQhIik7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGV4ID09IE5VTEwpOworICAgIGlmICghYy0+dGV4dHVyZV9jb250ZXh0Xy5CaW5kVGV4dHVyZVRvVGFyZ2V0KHRleCwgdGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiVGV4dHVyZSBjYW5ub3QgYmUgYm91bmQgdG8gdGFyZ2V0OiAlcyIsCisgICAgICAgICAgICAgICAgR2V0RW51bVN0cmluZyh0YXJnZXQpKTsKKyAgICB9CisKKyAgICAvLyBNb3N0IHRleHR1cmVzIHVzZSB0aGUgc2FtZSBnbG9iYWwgdGV4dHVyZSB0YXJnZXQgYXMgdXNlZCBieSB0aGUgY2FsbGVyLgorICAgIC8vIFRoZXJlIGlzIHNwZWNpYWwgY2xhc3Mgb2YgZXhjZXB0aW9ucyAtLSBleHRlcm5hbCBpbWFnZXMgdGFyZ2V0cywgd2hpY2gKKyAgICAvLyBjb3VsZCBiZSBhbnkgdGFyZ2V0IChwb3RlbnRpYWxseSBub3QgZXZlbiBhIG5vcm1hbGx5IHZhbGlkIEdMRVMyIHRhcmdldCEpCisgICAgYm9vbCBpbml0X2V4dGVybmFsX29lc19hc18yZCA9IGZhbHNlOworICAgIEdMZW51bSBnbG9iYWxfdGV4dHVyZV90YXJnZXQgPSB0YXJnZXQ7CisgICAgaWYgKHRleC0+SXNFZ2xJbWFnZUF0dGFjaGVkKCkpIHsKKyAgICAgICAgRExPRygiaGFzIGVnbCBpbWFnZSBhdHRhY2hlZCEiKTsKKyAgICAgICAgZ2xvYmFsX3RleHR1cmVfdGFyZ2V0ID0gdGV4LT5HZXRBdHRhY2hlZEVnbEltYWdlKCktPmdsb2JhbF90ZXh0dXJlX3RhcmdldDsKKyAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUykgeworICAgICAgICBETE9HKCJpcyBleHRlcm5hbCB0ZXh0dXJlIik7CisgICAgICAgIC8vIEl0IGlzIHBlcmZlY3RseSBhY2NlcHRhYmxlIGJ1dCBwcm9ibGVtYXRpYyBoZXJlIHRvIGNhbGwKKyAgICAgICAgLy8gQmluZFRleHR1cmUoVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHNvbWVfdGV4dHVyZSkgYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgLy8gRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoKS4gU2luY2Ugd2UgYXJlIGVtdWxhdGluZworICAgICAgICAvLyBURVhUVVJFX0VYVEVSTkFMX09FUywgd2UgZG8gbm90IHdhbnQgdG8gcGFzcyBpdCBvbiB0byB0aGUgdW5kZXJseWluZworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbi4gU28gd2UgYXNzdW1lIHRoYXQgdGhlIGdsb2JhbCB0YXJnZXQgc2hvdWxkIGJlIFRFWFRVUkVfMkQKKyAgICAgICAgLy8gZm9yIHRoaXMgY2FzZS4gSWYgZm9yIHNvbWUgcmVhc29uIHRoYXQgaXMgbm90IHRoZSBhY3R1YWwgZ2xvYmFsIHRhcmdldCwKKyAgICAgICAgLy8gd2Ugd2lsbCBmaXggaXQgdXAgaW4gaGFuZGxpbmcgdGhlIEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIGNhbGwuCisgICAgICAgIGdsb2JhbF90ZXh0dXJlX3RhcmdldCA9IEdMX1RFWFRVUkVfMkQ7CisgICAgICAgIGluaXRfZXh0ZXJuYWxfb2VzX2FzXzJkID0gZmlyc3RfdXNlOworICAgIH0KKyAgICBjLT50ZXh0dXJlX2NvbnRleHRfLlNldFRhcmdldFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlLCBnbG9iYWxfdGV4dHVyZV90YXJnZXQpOworCisgICAgaWYgKGluaXRfZXh0ZXJuYWxfb2VzX2FzXzJkKSB7CisgICAgICAgIERMT0coImluaXRfZXh0ZXJuYWxfb2VzX2FzXzJkIHRydWUiKTsKKyAgICAgICAgLy8gV2hlbiBhIG5ldyBURVhUVVJFXzJEIGlzIHVzZWQgdG8gYmFjayB0aGUgVEVYVFVSRV9FWFRFUk5BTF9PRVMsCisgICAgICAgIC8vIHdlIG5lZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHRleHR1cmUgc3RhdGUgdG8gbWF0Y2ggdGhhdCBkZWZhdWx0IHN0YXRlCisgICAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBleHRlbnNpb24sIHdoZXJlIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0cyBmb3IgYQorICAgICAgICAvLyBURVhUVVJFXzJELgorICAgICAgICBjb25zdCBHTGVudW0gZ2xvYmFsX3RhcmdldCA9CisgICAgICAgICAgICBjLT50ZXh0dXJlX2NvbnRleHRfLkVuc3VyZUNvcnJlY3RCaW5kaW5nKHRhcmdldCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2xvYmFsX3RhcmdldCAhPSBHTF9URVhUVVJFXzJEKTsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIFRleFBhcmFtZXRlcmksIGdsb2JhbF90YXJnZXQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwKKyAgICAgICAgICAgICAgICBHTF9MSU5FQVIpOworICAgICAgICBQQVNTX1RIUk9VR0goYywgVGV4UGFyYW1ldGVyaSwgZ2xvYmFsX3RhcmdldCwgR0xfVEVYVFVSRV9XUkFQX1MsCisgICAgICAgICAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgICAgIFBBU1NfVEhST1VHSChjLCBUZXhQYXJhbWV0ZXJpLCBnbG9iYWxfdGFyZ2V0LCBHTF9URVhUVVJFX1dSQVBfVCwKKyAgICAgICAgICAgICAgICBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAgICAgYy0+dGV4dHVyZV9jb250ZXh0Xy5SZXN0b3JlQmluZGluZyh0YXJnZXQpOworICAgIH0KKworICAgIC8vIE9ubHkgaW1tZWRpYXRlbHkgYmluZCB0aGUgdGV4dHVyZSB0byB0aGUgdGFyZ2V0IGlmIHRoZSBnbG9iYWwgdGV4dHVyZQorICAgIC8vIHRhcmdldCBtYXRjaGVzIHRoZSBsb2NhbCB0YXJnZXQuIElmIHdlIGFyZSByZW1hcHBpbmcgdGhlIHRleHR1cmUgdGFyZ2V0LAorICAgIC8vIHdlIHdpbGwgbm90IGtub3cgdW50aWwgbGF0ZXIgd2hpY2ggdGV4dHVyZSBzaG91bGQgYmUgYm91bmQuCisgICAgaWYgKHRhcmdldCA9PSBnbG9iYWxfdGV4dHVyZV90YXJnZXQpIHsKKyAgICAgICAgRExPRygidGFyZ2V0IGlzIGdsb2JhbCB0ZXh0dXJlIHRhcmdldCwgaW1tZWRpYXRlbHkgY2FsbCB1bmRlcmx5aW5nIGJpbmQiKTsKKyAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbF90ZXh0dXJlX25hbWUgPQorICAgICAgICAgICAgYy0+R2V0U2hhcmVHcm91cCgpLT5HZXRUZXh0dXJlR2xvYmFsTmFtZSh0ZXh0dXJlKTsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIEJpbmRUZXh0dXJlLCB0YXJnZXQsIGdsb2JhbF90ZXh0dXJlX25hbWUpOworICAgIH0gCisgICAgRExPRygiZXhpdCBmdW5jdGlvbiIpOworfQorCisvLyBVc2VkIGluIGNvbXBvc2l0aW5nIHRoZSBmcmFnbWVudCBzaGFkZXIgb3V0cHV0IHdpdGggdGhlIGZyYW1lYnVmZmVyLgorQVBJRU5UUllfSU1QTCh2b2lkLCBCbGVuZENvbG9yLCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBCbGVuZENvbG9yLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKKy8vIFVzZWQgaW4gY29tcG9zaXRpbmcgdGhlIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgd2l0aCB0aGUgZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJsZW5kRXF1YXRpb24sIEdMZW51bSBtb2RlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBCbGVuZEVxdWF0aW9uLCBtb2RlKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBCbGVuZEVxdWF0aW9uT0VTLCBHTGVudW0gbW9kZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQmxlbmRFcXVhdGlvbihtb2RlKSk7Cit9CisKKy8vIFVzZWQgaW4gY29tcG9zaXRpbmcgdGhlIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgd2l0aCB0aGUgZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgbW9kZVJHQiwgbW9kZUFscGhhKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMsIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUobW9kZVJHQiwgbW9kZUFscGhhKSk7Cit9CisKKy8vIFVzZWQgaW4gY29tcG9zaXRpbmcgdGhlIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgd2l0aCB0aGUgZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJsZW5kRnVuYywgR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZEJsZW5kRnVuYyhzZmFjdG9yKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShzZmFjdG9yKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRCbGVuZEZ1bmMoZGZhY3RvcikpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oZGZhY3Rvcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5ibGVuZF9mdW5jX3NyY19hbHBoYV8uTXV0YXRlKCkgPSBzZmFjdG9yOworICAgIGMtPmJsZW5kX2Z1bmNfc3JjX3JnYl8uTXV0YXRlKCkgPSBzZmFjdG9yOworICAgIGMtPmJsZW5kX2Z1bmNfZHN0X2FscGhhXy5NdXRhdGUoKSA9IGRmYWN0b3I7CisgICAgYy0+YmxlbmRfZnVuY19kc3RfcmdiXy5NdXRhdGUoKSA9IGRmYWN0b3I7CisgICAgUEFTU19USFJPVUdIKGMsIEJsZW5kRnVuYywgc2ZhY3RvciwgZGZhY3Rvcik7Cit9CisKKy8vIFVzZWQgaW4gY29tcG9zaXRpbmcgdGhlIGZyYWdtZW50IHNoYWRlciBvdXRwdXQgd2l0aCB0aGUgZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJsZW5kRnVuY1NlcGFyYXRlLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRCbGVuZEZ1bmMoc3JjUkdCKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShzcmNSR0IpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZEJsZW5kRnVuYyhkc3RSR0IpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGRzdFJHQik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkQmxlbmRGdW5jKHNyY0FscGhhKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShzcmNBbHBoYSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkQmxlbmRGdW5jKGRzdEFscGhhKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShkc3RBbHBoYSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5ibGVuZF9mdW5jX3NyY19hbHBoYV8uTXV0YXRlKCkgPSBzcmNBbHBoYTsKKyAgICBjLT5ibGVuZF9mdW5jX3NyY19yZ2JfLk11dGF0ZSgpID0gc3JjUkdCOworICAgIGMtPmJsZW5kX2Z1bmNfZHN0X2FscGhhXy5NdXRhdGUoKSA9IGRzdEFscGhhOworICAgIGMtPmJsZW5kX2Z1bmNfZHN0X3JnYl8uTXV0YXRlKCkgPSBkc3RSR0I7CisgICAgUEFTU19USFJPVUdIKGMsIEJsZW5kRnVuY1NlcGFyYXRlLCBzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBCbGVuZEZ1bmNTZXBhcmF0ZU9FUywgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEJsZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpKTsKK30KKworLy8gTG9hZHMgYXJiaXRyYXJ5IGJpbmFyeSBkYXRhIGludG8gYSBidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEJ1ZmZlckRhdGEsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkQnVmZmVyVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRCdWZmZXJVc2FnZSh1c2FnZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odXNhZ2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfVUlOVCgoR0x1aW50KXNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEJ1ZmZlckRhdGFQdHIgdmJvID0gYy0+R2V0Qm91bmRUYXJnZXRCdWZmZXJEYXRhKHRhcmdldCk7CisgICAgaWYgKHZibyA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJCdWZmZXIgbm90IGJvdW5kLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZiby0+U2V0QnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKKyAgICBQQVNTX1RIUk9VR0goYywgQnVmZmVyRGF0YSwgdGFyZ2V0LCBzaXplLCBkYXRhLCB1c2FnZSk7Cit9CisKKy8vIExvYWRzIGFyYml0cmFyeSBiaW5hcnkgZGF0YSBpbnRvIGEgcG9ydGlvbiBvZiBhIGJ1ZmZlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQnVmZmVyU3ViRGF0YSwgR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRCdWZmZXJUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfVUlOVCgoR0x1aW50KXNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9VSU5UKChHTHVpbnQpb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCdWZmZXJEYXRhUHRyIHZibyA9IGMtPkdldEJvdW5kVGFyZ2V0QnVmZmVyRGF0YSh0YXJnZXQpOworICAgIGlmICh2Ym8gPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiQnVmZmVyIG5vdCBib3VuZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0aWNfY2FzdDxHTHVpbnQ+KG9mZnNldCArIHNpemUpID4gdmJvLT5HZXRTaXplKCkpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX1ZBTFVFLCAiVW5hYmxlIHRvIHNldCBidWZmZXIgc3ViZGF0YS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2Ym8tPlNldEJ1ZmZlclN1YkRhdGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOworICAgIFBBU1NfVEhST1VHSChjLCBCdWZmZXJTdWJEYXRhLCB0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKKy8vIFZlcmlmaWVzIGlmIGEgZnJhbWVidWZmZXIgb2JqZWN0IGlzIHNldCB1cCBjb3JyZWN0bHkuCitBUElFTlRSWV9JTVBMKEdMZW51bSwgQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cywgR0xlbnVtIHRhcmdldCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybiBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgcmV0dXJuIFBBU1NfVEhST1VHSChjLCBDaGVja0ZyYW1lYnVmZmVyU3RhdHVzLCB0YXJnZXQpOworfQorCitBUElFTlRSWV9JTVBMKEdMZW51bSwgQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUywgR0xlbnVtIHRhcmdldCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgcmV0dXJuIFRSQ0FMTChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXModGFyZ2V0KSk7Cit9CisKKy8vIENsZWFycyB0aGUgZnJhbWVidWZmZXIgdG8gdGhlIGN1cnJlbnQgY2xlYXIgY29sb3IuCitBUElFTlRSWV9JTVBMKHZvaWQsIENsZWFyLCBHTGJpdGZpZWxkIG1hc2spIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPkVuc3VyZVN1cmZhY2VSZWFkeVRvRHJhdygpOworICAgIFBBU1NfVEhST1VHSChjLCBDbGVhciwgbWFzayk7Cit9CisKKy8vIFNldHMgdGhlIGNvbG9yIHRvIHVzZSB3aGVuIGNsZWFyaW5nIHRoZSBmcmFtZWJ1ZmZlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xlYXJDb2xvciwgR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmVkID0gQ2xhbXBWYWx1ZShyZWQsIDAuZiwgMS5mKTsKKyAgICBncmVlbiA9IENsYW1wVmFsdWUoZ3JlZW4sIDAuZiwgMS5mKTsKKyAgICBibHVlID0gQ2xhbXBWYWx1ZShibHVlLCAwLmYsIDEuZik7CisgICAgYWxwaGEgPSBDbGFtcFZhbHVlKGFscGhhLCAwLmYsIDEuZik7CisKKyAgICBHTGZsb2F0ICgmY29sb3JfY2xlYXJfdmFsdWUpWzRdID0gYy0+Y29sb3JfY2xlYXJfdmFsdWVfLk11dGF0ZSgpOworICAgIGNvbG9yX2NsZWFyX3ZhbHVlWzBdID0gcmVkOworICAgIGNvbG9yX2NsZWFyX3ZhbHVlWzFdID0gZ3JlZW47CisgICAgY29sb3JfY2xlYXJfdmFsdWVbMl0gPSBibHVlOworICAgIGNvbG9yX2NsZWFyX3ZhbHVlWzNdID0gYWxwaGE7CisgICAgUEFTU19USFJPVUdIKGMsIENsZWFyQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBDbGVhckNvbG9yeCwgR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbENsZWFyQ29sb3IoWDJGKHJlZCksIFgyRihncmVlbiksIFgyRihibHVlKSwgWDJGKGFscGhhKSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIENsZWFyQ29sb3J4T0VTLCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQ2xlYXJDb2xvcihYMkYocmVkKSwgWDJGKGdyZWVuKSwgWDJGKGJsdWUpLCBYMkYoYWxwaGEpKSk7Cit9CisKKy8vIFNldHMgdGhlIGRlcHRoIHZhbHVlIHRvIHVzZSB3aGVuIGNsZWFyaW5nIHRoZSBmcmFtZWJ1ZmZlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xlYXJEZXB0aGYsIEdMZmxvYXQgZGVwdGgpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGVwdGggPSBDbGFtcFZhbHVlKGRlcHRoLCAwLmYsIDEuZik7CisKKyAgICBjLT5kZXB0aF9jbGVhcl92YWx1ZV8uTXV0YXRlKCkgPSBkZXB0aDsKKyAgICBQQVNTX1RIUk9VR0goYywgQ2xlYXJEZXB0aGYsIGRlcHRoKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBDbGVhckRlcHRoZk9FUywgR0xjbGFtcGYgZGVwdGgpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbENsZWFyRGVwdGhmKGRlcHRoKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xlYXJEZXB0aHgsIEdMY2xhbXB4IGRlcHRoKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xDbGVhckRlcHRoZihYMkYoZGVwdGgpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xlYXJEZXB0aHhPRVMsIEdMY2xhbXB4IGRlcHRoKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xDbGVhckRlcHRoZihYMkYoZGVwdGgpKSk7Cit9CisKKy8vIFNldHMgdGhlIHN0ZW5jaWwgYml0IHBhdHRlcm4gdG8gdXNlIHdoZW4gY2xlYXJpbmcgdGhlIGZyYW1lYnVmZmVyLgorQVBJRU5UUllfSU1QTCh2b2lkLCBDbGVhclN0ZW5jaWwsIEdMaW50IHMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIENsZWFyU3RlbmNpbCwgcyk7Cit9CisKKy8vIFNlbGVjdHMgdGhlIGNsaWVudCB0ZXh0dXJlIHVuaXQgc3RhdGUgdGhhdCB3aWxsIGJlIG1vZGlmaWVkIGJ5IGNsaWVudAorLy8gdGV4dHVyZSBzdGF0ZSBjYWxscy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xpZW50QWN0aXZlVGV4dHVyZSwgR0xlbnVtIHRleHR1cmUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFjLT50ZXh0dXJlX2NvbnRleHRfLlNldENsaWVudEFjdGl2ZVRleHR1cmUodGV4dHVyZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGV4dHVyZSk7CisgICAgfQorfQorCisvLyBTcGVjaWZ5IGEgcGxhbmUgYWdhaW5zdCB3aGljaCBhbGwgZ2VvbWV0cnkgaXMgY2xpcHBlZC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ2xpcFBsYW5lZiwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0KiBlcXVhdGlvbikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yKiBwbGFuZSA9IGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlQ2xpcFBsYW5lKHBuYW1lKTsKKyAgICBpZiAoIXBsYW5lKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENvbnZlcnQgdGhlIHBsYW5lIGVxdWF0aW9ucyBjb2VmZmljaWVudHMgaW50byBleWUgY29vcmRpbmF0ZXMuICBTZWUKKyAgICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDIuMTEuICBXZSBhbHNvIHJlcXVpcmUgdGhlIHRyYW5zcG9zZQorICAgIC8vIGR1ZSB0byBob3cgd2Ugc3RvcmUgdGhlIG1hdHJpY2VzLgorICAgIGVtdWdsOjpNYXRyaXggbXYgPSBjLT51bmlmb3JtX2NvbnRleHRfLkdldE1vZGVsVmlld01hdHJpeCgpOworICAgIG12LkludmVyc2UoKTsKKyAgICBtdi5UcmFuc3Bvc2UoKTsKKyAgICBlbXVnbDo6VmVjdG9yIHZhbHVlKGVxdWF0aW9uWzBdLCBlcXVhdGlvblsxXSwgZXF1YXRpb25bMl0sIGVxdWF0aW9uWzNdKTsKKyAgICBwbGFuZS0+QXNzaWduTWF0cml4TXVsdGlwbHkobXYsIHZhbHVlKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBDbGlwUGxhbmVmT0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIGVxdWF0aW9uKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xDbGlwUGxhbmVmKHBuYW1lLCBlcXVhdGlvbikpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIENsaXBQbGFuZXgsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogZXF1YXRpb24pIHsKKyAgICBBUElUUkFDRSgpOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUVsZW1lbnRzID0gNDsKKyAgICBHTGZsb2F0IHRtcFtrTnVtRWxlbWVudHNdOworICAgIENvbnZlcnQodG1wLCBrTnVtRWxlbWVudHMsIGVxdWF0aW9uKTsKKyAgICBUUkNBTEwoZ2xDbGlwUGxhbmVmKHBuYW1lLCB0bXApKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBDbGlwUGxhbmV4T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIGVxdWF0aW9uKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xDbGlwUGxhbmV4KHBuYW1lLCBlcXVhdGlvbikpOworfQorCisvLyBTZXRzIHRoZSB2ZXJ0ZXggY29sb3IgdGhhdCBpcyB1c2VkIHdoZW4gbm8gdmVydGV4IGNvbG9yIGFycmF5IGlzIGVuYWJsZWQuCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbG9yNGYsIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW11Z2w6OlZlY3RvciYgY29sb3IgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUNvbG9yKCk7CisgICAgY29sb3IgPSBlbXVnbDo6VmVjdG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBDb2xvcjRmdiwgY29uc3QgR0xmbG9hdCogY29tcG9uZW50cykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yJiBjb2xvciA9IGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlQ29sb3IoKTsKKyAgICBjb2xvci5Bc3NpZ25MaW5lYXJNYXBwaW5nKGNvbXBvbmVudHMsIDQpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbG9yNHViLCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVtdWdsOjpWZWN0b3ImIGNvbG9yID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVDb2xvcigpOworICAgIEdMdWJ5dGUgcGFyYW1zWzRdID0ge3JlZCwgZ3JlZW4sIGJsdWUsIGFscGhhfTsKKyAgICBjb2xvci5Bc3NpZ25MaW5lYXJNYXBwaW5nKHBhcmFtcywgNCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29sb3I0dWJ2LCBjb25zdCBHTHVieXRlKiBjb21wb25lbnRzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVtdWdsOjpWZWN0b3ImIGNvbG9yID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVDb2xvcigpOworICAgIGNvbG9yLkFzc2lnbkxpbmVhck1hcHBpbmcoY29tcG9uZW50cywgNCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29sb3I0eCwgR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQ29sb3I0ZihYMkYocmVkKSwgWDJGKGdyZWVuKSwgWDJGKGJsdWUpLCBYMkYoYWxwaGEpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29sb3I0eE9FUywgR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQ29sb3I0ZihYMkYocmVkKSwgWDJGKGdyZWVuKSwgWDJGKGJsdWUpLCBYMkYoYWxwaGEpKSk7Cit9CisKKy8vIENvbnRyb2xzIHdoYXQgY29tcG9uZW50cyBvdXRwdXQgZnJvbSB0aGUgZnJhZ21lbnQgc2hhZGVyIGFyZSB3cml0dGVuIHRvIHRoZQorLy8gZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbG9yTWFzaywgR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMYm9vbGVhbiAoJmNvbG9yX3dyaXRlbWFzaylbNF0gPSBjLT5jb2xvcl93cml0ZW1hc2tfLk11dGF0ZSgpOworICAgIGNvbG9yX3dyaXRlbWFza1swXSA9IHJlZCAhPSBHTF9GQUxTRSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKKyAgICBjb2xvcl93cml0ZW1hc2tbMV0gPSBncmVlbiAhPSBHTF9GQUxTRSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKKyAgICBjb2xvcl93cml0ZW1hc2tbMl0gPSBibHVlICE9IEdMX0ZBTFNFID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworICAgIGNvbG9yX3dyaXRlbWFza1szXSA9IGFscGhhICE9IEdMX0ZBTFNFID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworICAgIFBBU1NfVEhST1VHSChjLCBDb2xvck1hc2ssIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKworLy8gU3BlY2lmaWVzIHNvdXJjZSBhcnJheSBmb3IgcGVyLXZlcnRleCBjb2xvcnMuCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbG9yUG9pbnRlciwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkQ29sb3JQb2ludGVyU2l6ZShzaXplKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKHNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZENvbG9yUG9pbnRlclR5cGUodHlwZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cmlkZSA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzdHJpZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IEdMYm9vbGVhbiBub3JtYWxpemVkID0gKHR5cGUgIT0gR0xfRkxPQVQgJiYgdHlwZSAhPSBHTF9GSVhFRCk7CisgICAgYy0+cG9pbnRlcl9jb250ZXh0Xy5TZXRQb2ludGVyKGtDb2xvclZlcnRleEF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgc3RyaWRlLAorICAgICAgICAgICAgcG9pbnRlciwgbm9ybWFsaXplZCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29sb3JQb2ludGVyQm91bmRzLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCisvLyBDb21waWxlcyBhIHNoYWRlciBmcm9tIHRoZSBzb3VyY2UgY29kZSBsb2FkZWQgaW50byB0aGUgc2hhZGVyIG9iamVjdC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29tcGlsZVNoYWRlciwgR0x1aW50IHNoYWRlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFNoYWRlckRhdGFQdHIgc2hhZGVyX2RhdGEgPSBzZy0+R2V0U2hhZGVyRGF0YShzaGFkZXIpOworICAgIGlmIChzaGFkZXJfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJOb3QgYSB2YWxpZCBzaGFkZXIgJWQiLCBzaGFkZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hhZGVyX2RhdGEtPkNvbXBpbGUoKTsKK30KKworbmFtZXNwYWNlIHsKKworICAgIHZvaWQgSGFuZGxlRVRDMUNvbXByZXNzZWRUZXhJbWFnZTJEKAorICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2Vfc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7CisgICAgICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgICAgICBBTE9HX0FTU0VSVChjICE9IE5VTEwpOworCisgICAgICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBjLT50ZXh0dXJlX2NvbnRleHRfLkdldE1heExldmVscygpKSB7CisgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGxldmVsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiTm8gdGV4dHVyZSBib3VuZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBleHBlY3RlZF9zaXplID0gZXRjMV9nZXRfZW5jb2RlZF9kYXRhX3NpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGltYWdlX3NpemUpIDwgZXhwZWN0ZWRfc2l6ZSkgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHRvIGJlIGdpdmVuICVkIGJ5dGVzIG9mIGNvbXByZXNzZWQgZGF0YSwgYnV0IGFjdHVhbGx5ICIKKyAgICAgICAgICAgICAgICAgICAgImdpdmVuICVkIGJ5dGVzLiIsIHN0YXRpY19jYXN0PGludD4oZXhwZWN0ZWRfc2l6ZSksIGltYWdlX3NpemUpOworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChpbWFnZV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IEdMaW50IHVucGFja19hbGlnbm1lbnQgPSBjLT5waXhlbF9zdG9yZV91bnBhY2tfYWxpZ25tZW50Xy5HZXQoKTsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIFBpeGVsU3RvcmVpLCBHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKworICAgICAgICB0ZXgtPlNldChsZXZlbCwgd2lkdGgsIGhlaWdodCwgR0xfUkdCLCBHTF9VTlNJR05FRF9CWVRFKTsKKworICAgICAgICBjb25zdCBzaXplX3QgYnl0ZXNfcGVyX3BpeGVsID0gMzsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHN0cmlkZSA9IGJ5dGVzX3Blcl9waXhlbCAqIHdpZHRoOworICAgICAgICBQQVNTX1RIUk9VR0goYywgVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgR0xfUkdCLCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIGJvcmRlciwgR0xfUkdCLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKKyAgICAgICAgR0x2b2lkKiBidWZmZXIgPSBQQVNTX1RIUk9VR0goYywgTWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCB0YXJnZXQsIGxldmVsLCAwLAorICAgICAgICAgICAgICAgIDAsIHdpZHRoLCBoZWlnaHQsIEdMX1JHQiwgR0xfVU5TSUdORURfQllURSwKKyAgICAgICAgICAgICAgICBHTF9XUklURV9PTkxZX09FUyk7CisgICAgICAgIGNvbnN0IGludCByYyA9IGV0YzFfZGVjb2RlX2ltYWdlKHN0YXRpY19jYXN0PGNvbnN0IGV0YzFfYnl0ZSo+KGRhdGEpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGV0YzFfYnl0ZSo+KGJ1ZmZlciksIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwgYnl0ZXNfcGVyX3BpeGVsLCBzdHJpZGUpOworICAgICAgICBBTE9HX0FTU0VSVChyYyA9PSAwKTsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIFVubWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCBidWZmZXIpOworICAgICAgICBQQVNTX1RIUk9VR0goYywgUGl4ZWxTdG9yZWksIEdMX1VOUEFDS19BTElHTk1FTlQsIHVucGFja19hbGlnbm1lbnQpOworICAgIH0KKworICAgIHZvaWQgSGFuZGxlUGFsZXR0ZWRDb21wcmVzc2VkVGV4SW1hZ2UyRCgKKyAgICAgICAgICAgIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsCisgICAgICAgICAgICBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlX3NpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworCisgICAgICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgICAgICBBTE9HX0FTU0VSVChjICE9IE5VTEwpOworCisgICAgICAgIEdMc2l6ZWkgc3VwcGxpZWRfbGV2ZWxzID0gLWxldmVsICsgMTsKKyAgICAgICAgaWYgKGxldmVsID4gMCB8fCBzdXBwbGllZF9sZXZlbHMgPiBjLT50ZXh0dXJlX2NvbnRleHRfLkdldE1heExldmVscygpKSB7CisgICAgICAgICAgICAvLyBGb3IgcGFsZXR0ZWQgZm9ybWF0cywgdGhlIGxldmVsIHBhcmFtZXRlciBtdXN0IG5vdCBiZSBwb3NpdGl2ZSwgYW5kIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSB8bGV2ZWx8KzEgaXMgY29tcHV0ZWQsIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIGxldmVscy4KKyAgICAgICAgICAgIC8vIFplcm8gbWVhbnMgdGhhdCBvbmx5IHRoZSBiYXNlIG1pcCBtYXAgbGV2ZWwgaXMgYmVpbmcgc2V0LCBhbmQgZXZlcnkKKyAgICAgICAgICAgIC8vIG51bWJlciBsb3dlciBtZWFucyB0aGF0IG9uZSBtb3JlIG1pcG1hcCBsZXZlbCBpcyBhbHNvIGJlaW5nIHNldC4KKyAgICAgICAgICAgIC8vIEZvciBleGFtcGxlIC0zIHdvdWxkIG1lYW4gNCBtaXBtYXAgbGV2ZWxzIGFyZSBiZWluZyBzZXQgKGxldmVscyAwLTMpCisgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGxldmVsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleCA9PSBOVUxMKSB7CisgICAgICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiTm8gdGV4dHVyZSBib3VuZC4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZV9icHAgPQorICAgICAgICAgICAgUGFsZXR0ZWRUZXh0dXJlVXRpbDo6R2V0SW1hZ2VCcHAoaW50ZXJuYWxmb3JtYXQpOworICAgICAgICBjb25zdCBzaXplX3QgcGFsZXR0ZV9lbnRyeV9zaXplID0KKyAgICAgICAgICAgIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkdldEVudHJ5U2l6ZUJ5dGVzKGludGVybmFsZm9ybWF0KTsKKyAgICAgICAgY29uc3QgR0xlbnVtIHBhbGV0dGVfZm9ybWF0ID0KKyAgICAgICAgICAgIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkdldEVudHJ5Rm9ybWF0KGludGVybmFsZm9ybWF0KTsKKyAgICAgICAgY29uc3QgR0xlbnVtIHBhbGV0dGVfdHlwZSA9CisgICAgICAgICAgICBQYWxldHRlZFRleHR1cmVVdGlsOjpHZXRFbnRyeVR5cGUoaW50ZXJuYWxmb3JtYXQpOworICAgICAgICBjb25zdCBzaXplX3QgcGFsZXR0ZV9zaXplID0KKyAgICAgICAgICAgIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkNvbXB1dGVQYWxldHRlU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VfYnBwLCBwYWxldHRlX2VudHJ5X3NpemUpOworICAgICAgICBjb25zdCBzaXplX3QgbGV2ZWwwX3NpemUgPQorICAgICAgICAgICAgUGFsZXR0ZWRUZXh0dXJlVXRpbDo6Q29tcHV0ZUxldmVsMFNpemUoCisgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGltYWdlX2JwcCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBleHBlY3RlZF9zaXplID0KKyAgICAgICAgICAgIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkNvbXB1dGVUb3RhbFNpemUoCisgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfc2l6ZSwgbGV2ZWwwX3NpemUsIHN1cHBsaWVkX2xldmVscyk7CisKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oaW1hZ2Vfc2l6ZSkgPCBleHBlY3RlZF9zaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgdG8gYmUgZ2l2ZW4gJWQgYnl0ZXMgb2YgY29tcHJlc3NlZCBkYXRhLCBidXQgYWN0dWFsbHkgIgorICAgICAgICAgICAgICAgICAgICAiZ2l2ZW4gJWQgYnl0ZXMuIiwgc3RhdGljX2Nhc3Q8aW50PihleHBlY3RlZF9zaXplKSwgaW1hZ2Vfc2l6ZSk7CisgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGltYWdlX3NpemUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcGFsZXR0ZV9kYXRhID0gc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGRhdGEpOworICAgICAgICBjb25zdCB1aW50OF90KiBpbWFnZV9kYXRhID0gcGFsZXR0ZV9kYXRhICsgcGFsZXR0ZV9zaXplOworCisgICAgICAgIC8vIFdlIHJlcXVpcmUgYSBtaW5pbXVtIHVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBvZiAyIHBpeGVscyBoZXJlIHRvIGhhbmRsZQorICAgICAgICAvLyB0aGUgY29ybmVyIGNhc2Ugb2YgYSAxIHggMSA0YnBwIGltYWdlLCB3aGljaCByZXF1aXJlcyBvbmx5IDQgYml0cyBvZgorICAgICAgICAvLyBzdG9yYWdlLCBidXQgYWN0dWFsbHkgZW5kcyB1cCB0YWtpbmcgYSBmdWxsIGJ5dGUuIFRoZSBjb2RlIGVuZHMgdXAKKyAgICAgICAgLy8gdW5wYWNraW5nIGJvdGggdGhlIHJlYWwgNCBiaXQgdmFsdWUgYXMgd2VsbCBhcyB0aGUgInBhZGRpbmciIDQgYml0cy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdW5jb21wcmVzc2VkX2xldmVsKHN0ZDo6bWluKDIsIHdpZHRoICogaGVpZ2h0KSAqCisgICAgICAgICAgICAgICAgcGFsZXR0ZV9lbnRyeV9zaXplKTsKKworICAgICAgICBjb25zdCBHTGludCB1bnBhY2tfYWxpZ25tZW50ID0gYy0+cGl4ZWxfc3RvcmVfdW5wYWNrX2FsaWdubWVudF8uR2V0KCk7CisgICAgICAgIFBBU1NfVEhST1VHSChjLCBQaXhlbFN0b3JlaSwgR0xfVU5QQUNLX0FMSUdOTUVOVCwgMSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzdXBwbGllZF9sZXZlbHMpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBsZXZlbF93aWR0aCA9IHdpZHRoID4+IGk7CisgICAgICAgICAgICBjb25zdCBpbnQgbGV2ZWxfaGVpZ2h0ID0gaGVpZ2h0ID4+IGk7CisgICAgICAgICAgICBjb25zdCBpbnQgbGV2ZWxfc2l6ZSA9CisgICAgICAgICAgICAgICAgUGFsZXR0ZWRUZXh0dXJlVXRpbDo6Q29tcHV0ZUxldmVsU2l6ZShsZXZlbDBfc2l6ZSwgaSk7CisKKyAgICAgICAgICAgIHRleC0+U2V0KGksIGxldmVsX3dpZHRoLCBsZXZlbF9oZWlnaHQsIHBhbGV0dGVfZm9ybWF0LCBwYWxldHRlX3R5cGUpOworCisgICAgICAgICAgICBQQVNTX1RIUk9VR0goYywgVGV4SW1hZ2UyRCwgdGFyZ2V0LCBpLCBwYWxldHRlX2Zvcm1hdCwgbGV2ZWxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGxldmVsX2hlaWdodCwgYm9yZGVyLCBwYWxldHRlX2Zvcm1hdCwgcGFsZXR0ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIEdMdm9pZCogYnVmZmVyID0gUEFTU19USFJPVUdIKGMsIE1hcFRleFN1YkltYWdlMkRDSFJPTUlVTSwgdGFyZ2V0LCBpLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCBsZXZlbF93aWR0aCwgbGV2ZWxfaGVpZ2h0LCBwYWxldHRlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZV90eXBlLCBHTF9XUklURV9PTkxZX09FUyk7CisgICAgICAgICAgICB1aW50OF90KiBkc3QgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdCA9IFBhbGV0dGVkVGV4dHVyZVV0aWw6OkRlY29tcHJlc3MoCisgICAgICAgICAgICAgICAgICAgIGltYWdlX2JwcCwgbGV2ZWxfc2l6ZSwgcGFsZXR0ZV9lbnRyeV9zaXplLCBpbWFnZV9kYXRhLCBwYWxldHRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGRzdCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChkc3QgPCBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSArIGxldmVsX3NpemUpOworICAgICAgICAgICAgUEFTU19USFJPVUdIKGMsIFVubWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCBidWZmZXIpOworICAgICAgICAgICAgaW1hZ2VfZGF0YSArPSBsZXZlbF9zaXplOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKGltYWdlX2RhdGEgLSBpbWFnZV9zaXplIDw9IGRhdGEpOworICAgICAgICBQQVNTX1RIUk9VR0goYywgUGl4ZWxTdG9yZWksIEdMX1VOUEFDS19BTElHTk1FTlQsIHVucGFja19hbGlnbm1lbnQpOworICAgIH0KKworICAgIHZvaWQgSGFuZGxlRW11bGF0ZUNvbXByZXNzZWRUZXhJbWFnZTJEKAorICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwKKyAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2Vfc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7CisKKyAgICAgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGMgIT0gTlVMTCk7CisKKyAgICAgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IGMtPm1heF90ZXh0dXJlX3NpemVfLkdldCgpIHx8ICFJc1Bvd2VyT2YyKHdpZHRoKSkgeworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVCh3aWR0aCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA8IDAgfHwgaGVpZ2h0ID4gYy0+bWF4X3RleHR1cmVfc2l6ZV8uR2V0KCkgfHwgIUlzUG93ZXJPZjIoaGVpZ2h0KSkgeworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChib3JkZXIgIT0gMCkgeworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChib3JkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghSXNWYWxpZEVtdWxhdGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKGludGVybmFsZm9ybWF0KSkgeworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oaW50ZXJuYWxmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludGVybmFsZm9ybWF0ID09IEdMX0VUQzFfUkdCOF9PRVMpIHsKKyAgICAgICAgICAgIEhhbmRsZUVUQzFDb21wcmVzc2VkVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgYm9yZGVyLCBpbWFnZV9zaXplLCBkYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEhhbmRsZVBhbGV0dGVkQ29tcHJlc3NlZFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGJvcmRlciwgaW1hZ2Vfc2l6ZSwgZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKK30gIC8vIG5hbWVzcGFjZQorCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbXByZXNzZWRUZXhJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlX3NpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MTMpOiBSZWNvcmQgdGhhdCB0aGlzIHRleHR1cmUgbGV2ZWwgdXNlcyBhIGNvbXByZXNzZWQKKyAgICAvLyBmb3JtYXQsIGFzIHdlbGwgYXMgb3RoZXIgZGF0YSB3ZSB0cmFjayBmb3IgdGhpcyBsZXZlbCBhbmQgdGhpcyB0ZXh0dXJlLgorICAgIGlmIChjLT5Jc0NvbXByZXNzZWRGb3JtYXRFbXVsYXRpb25OZWVkZWQoaW50ZXJuYWxmb3JtYXQpKSB7CisgICAgICAgIEhhbmRsZUVtdWxhdGVDb21wcmVzc2VkVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0LCBib3JkZXIsIGltYWdlX3NpemUsIGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFBBU1NfVEhST1VHSChjLCBDb21wcmVzc2VkVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LCBib3JkZXIsIGltYWdlX3NpemUsIGRhdGEpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIENvbXByZXNzZWRUZXhTdWJJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2Vfc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjLT5Jc0NvbXByZXNzZWRGb3JtYXRFbXVsYXRpb25OZWVkZWQoZm9ybWF0KSkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiTm90IHN1cHBvcnRlZCBmb3IgcGFsZXR0ZWQgZm9ybWF0cy4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQQVNTX1RIUk9VR0goYywgQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGltYWdlX3NpemUsIGRhdGEpOworfQorCisvLyBFeHRyYWN0cyBhIHBvcnRpb24gb2YgdGhlIGZyYW1lYnVmZmVyLCBsb2FkaW5nIGl0IGludG8gdGhlIGN1cnJlbnRseSBib3VuZAorLy8gdGV4dHVyZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ29weVRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0YXJnZXQgPT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworCisgICAgLy8gVE9ETyhjcmJ1Zy5jb20vNDQxOTE0KTogR0xfSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGZyYW1lYnVmZmVyIGZvcm1hdCBpcworICAgIC8vIG5vdCBhIHN1cGVyc2V0IG9mIGludGVybmFsZm9ybWF0LgorCisgICAgLy8gVE9ETyhjcmJ1Zy5jb20vNDQxOTE0KTogR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04gaWYgdGhlCisgICAgLy8gZnJhbWVidWZmZXIgaXMgbm90IGNvbXBsZXRlIChpZS4gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzIGlzIG5vdAorICAgIC8vIEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFKS4KKworICAgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkxNCk6IFRoZSBmcmFtZWJ1ZmZlciBtYXkgYmUgYSBzaXh0ZWVuIGJpdCB0eXBlIGFuZCB0aGUKKyAgICAvLyBsb2dpYyBoZXJlIGFzc3VtZXMgdGhhdCBpdCB3aWxsIGFsd2F5cyBiZSBHTF9VTlNJR05FRF9CWVRFLgorICAgIEdMZW51bSB0eXBlID0gR0xfVU5TSUdORURfQllURTsKKyAgICBpZiAoIUlzVmFsaWRQaXhlbEZvcm1hdEFuZFR5cGUoaW50ZXJuYWxmb3JtYXQsIHR5cGUpKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiSW52YWxpZCBmb3JtYXQvdHlwZTogJXMgJXMiLAorICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoaW50ZXJuYWxmb3JtYXQpLCBHZXRFbnVtU3RyaW5nKHR5cGUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBjLT50ZXh0dXJlX2NvbnRleHRfLkdldE1heExldmVscygpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobGV2ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aCA8IDAgfHwgd2lkdGggPiBjLT5tYXhfdGV4dHVyZV9zaXplXy5HZXQoKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaGVpZ2h0IDwgMCB8fCBoZWlnaHQgPiBjLT5tYXhfdGV4dHVyZV9zaXplXy5HZXQoKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGJvcmRlciAhPSAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoYm9yZGVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICBpZiAodGV4ID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIk5vIHRleHR1cmUgYm91bmQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0ZXgtPlNldChsZXZlbCwgd2lkdGgsIGhlaWdodCwgaW50ZXJuYWxmb3JtYXQsIHR5cGUpOworCisgICAgUEFTU19USFJPVUdIKGMsIENvcHlUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQsIGJvcmRlcik7Cit9CisKKy8vIEV4dHJhY3RzIGEgcG9ydGlvbiBvZiBhbm90aGVyIHRleHR1cmUsIHJlcGxhY2luZyB0aGUgY3VycmVudCBib3VuZCB0ZXh0dXJlLgorQVBJRU5UUllfSU1QTCh2b2lkLCBDb3B5VGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFyZ2V0ID09IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKKworICAgIFBBU1NfVEhST1VHSChjLCBDb3B5VGV4U3ViSW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworfQorCisvLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IHByb2dyYW0gb2JqZWN0LgorQVBJRU5UUllfSU1QTChHTHVpbnQsIENyZWF0ZVByb2dyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIE9iamVjdExvY2FsTmFtZSBuYW1lID0gMDsKKyAgICBzZy0+R2VuUHJvZ3JhbXMoMSwgJm5hbWUpOworICAgIHNnLT5DcmVhdGVQcm9ncmFtRGF0YShuYW1lKTsKKyAgICByZXR1cm4gbmFtZTsKK30KKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBzaGFkZXIgb2JqZWN0LgorQVBJRU5UUllfSU1QTChHTHVpbnQsIENyZWF0ZVNoYWRlciwgR0xlbnVtIHR5cGUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRTaGFkZXJUeXBlKHR5cGUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHR5cGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBPYmplY3RMb2NhbE5hbWUgbmFtZSA9IDA7CisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBpZiAodHlwZSA9PSBHTF9WRVJURVhfU0hBREVSKSB7CisgICAgICAgIHNnLT5HZW5WZXJ0ZXhTaGFkZXJzKDEsICZuYW1lKTsKKyAgICAgICAgc2ctPkNyZWF0ZVZlcnRleFNoYWRlckRhdGEobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2ctPkdlbkZyYWdtZW50U2hhZGVycygxLCAmbmFtZSk7CisgICAgICAgIHNnLT5DcmVhdGVGcmFnbWVudFNoYWRlckRhdGEobmFtZSk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworfQorCisvLyBTZWxlY3RzIHdoaWNoIGZhY2VzIGFyZSBjdWxsZWQgKGJhY2ssIGZyb250LCBib3RoKSB3aGVuIGN1bGxpbmcgaXMgZW5hYmxlZC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgQ3VsbEZhY2UsIEdMZW51bSBtb2RlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZEN1bGxGYWNlTW9kZShtb2RlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShtb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPmN1bGxfZmFjZV9tb2RlXy5NdXRhdGUoKSA9IG1vZGU7CisgICAgUEFTU19USFJPVUdIKGMsIEN1bGxGYWNlLCBtb2RlKTsKK30KKworLy8gU2V0IHRoZSBjdXJyZW50IHBhdGV0dGUgbWF0cml4LgorQVBJRU5UUllfSU1QTCh2b2lkLCBDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUywgR0x1aW50IGluZGV4KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghYy0+dW5pZm9ybV9jb250ZXh0Xy5TZXRDdXJyZW50UGFsZXR0ZU1hdHJpeChpbmRleCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX1VJTlQoaW5kZXgpOworICAgIH0KK30KKworLy8gRGVsZXRlIGEgbnVtYmVyIG9mIGJ1ZmZlciBvYmplY3RzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZWxldGVCdWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGlmIChjLT5hcnJheV9idWZmZXJfYmluZGluZ18gPT0gYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgYy0+YXJyYXlfYnVmZmVyX2JpbmRpbmdfID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYy0+ZWxlbWVudF9idWZmZXJfYmluZGluZ18gPT0gYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgYy0+ZWxlbWVudF9idWZmZXJfYmluZGluZ18gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBzZy0+RGVsZXRlQnVmZmVycyhuLCBidWZmZXJzKTsKK30KKworLy8gRGVsZXRlIGEgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlciBvYmplY3RzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZWxldGVGcmFtZWJ1ZmZlcnMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpZiAoYy0+ZnJhbWVidWZmZXJfYmluZGluZ18gPT0gZnJhbWVidWZmZXJzW2ldKSB7CisgICAgICAgICAgICBjLT5mcmFtZWJ1ZmZlcl9iaW5kaW5nXyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIHNnLT5EZWxldGVGcmFtZWJ1ZmZlcnMobiwgZnJhbWVidWZmZXJzKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEZWxldGVGcmFtZWJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERlbGV0ZUZyYW1lYnVmZmVycyhuLCBmcmFtZWJ1ZmZlcnMpKTsKK30KKworLy8gRGVsZXRlIGEgc2luZ2xlIHByb2dyYW0gb2JqZWN0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZWxldGVQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IHNnLT5HZXRQcm9ncmFtRGF0YShwcm9ncmFtKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjLT5HZXRDdXJyZW50VXNlclByb2dyYW0oKSA9PSBwcm9ncmFtX2RhdGEpIHsKKyAgICAgICAgLy8gVE9ETyhjcmJ1Zy5jb20vNDI0MzUzKTogRG8gbm90IGF1dG9tYXRpY2FsbHkgdW51c2UgYSBkZWxldGVkIHByb2dyYW0uCisgICAgICAgIGMtPlNldEN1cnJlbnRVc2VyUHJvZ3JhbShQcm9ncmFtRGF0YVB0cigpKTsKKyAgICB9CisKKyAgICBzZy0+RGVsZXRlUHJvZ3JhbXMoMSwgJnByb2dyYW0pOworfQorCisvLyBEZWxldGUgYSBudW1iZXIgb2YgcmVuZGVyIGJ1ZmZlciBvYmplY3RzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZWxldGVSZW5kZXJidWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEZyYW1lYnVmZmVyRGF0YVB0ciBmYiA9IGMtPkdldEJvdW5kRnJhbWVidWZmZXJEYXRhKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgaWYgKGZiICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZiLT5DbGVhckF0dGFjaG1lbnQocmVuZGVyYnVmZmVyc1tpXSwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChjLT5yZW5kZXJidWZmZXJfYmluZGluZ18gPT0gcmVuZGVyYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgYy0+cmVuZGVyYnVmZmVyX2JpbmRpbmdfID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgc2ctPkRlbGV0ZVJlbmRlcmJ1ZmZlcnMobiwgcmVuZGVyYnVmZmVycyk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMobiwgcmVuZGVyYnVmZmVycykpOworfQorCisvLyBEZWxldGUgYSBzaW5nbGUgc2hhZGVyIG9iamVjdC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRGVsZXRlU2hhZGVyLCBHTHVpbnQgc2hhZGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgc2ctPkRlbGV0ZVNoYWRlcnMoMSwgJnNoYWRlcik7Cit9CisKKy8vIERlbGV0ZSBhIG51bWJlciBvZiB0ZXh0dXJlIG9iamVjdHMuCitBUElFTlRSWV9JTVBMKHZvaWQsIERlbGV0ZVRleHR1cmVzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIEZyYW1lYnVmZmVyRGF0YVB0ciBmYiA9IGMtPkdldEJvdW5kRnJhbWVidWZmZXJEYXRhKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgaWYgKGZiICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZiLT5DbGVhckF0dGFjaG1lbnQodGV4dHVyZXNbaV0sIHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vIERvIG5vdCBkZWxldGUgdGV4dHVyZSBpZiBpdCBpcyBhIHRhcmdldCBvZiBFR0xJbWFnZS4KKyAgICAgICAgVGV4dHVyZURhdGFQdHIgdGV4ID0gc2ctPkdldFRleHR1cmVEYXRhKHRleHR1cmVzW2ldKTsKKyAgICAgICAgaWYgKHRleCAhPSBOVUxMICYmIHRleC0+SXNFZ2xJbWFnZUF0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgIHNnLT5TZXRUZXh0dXJlR2xvYmFsTmFtZSh0ZXgtPkdldExvY2FsTmFtZSgpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBjLT50ZXh0dXJlX2NvbnRleHRfLkRlbGV0ZVRleHR1cmUodGV4dHVyZXNbaV0pOworICAgIH0KKyAgICBzZy0+RGVsZXRlVGV4dHVyZXMobiwgdGV4dHVyZXMpOworfQorCisvLyBEaXNjYXJkIHBpeGVsIHdyaXRlcyBiYXNlZCBvbiBhbiBkZXB0aCB2YWx1ZSB0ZXN0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZXB0aEZ1bmMsIEdMZW51bSBmdW5jKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZERlcHRoRnVuYyhmdW5jKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShmdW5jKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPmRlcHRoX2Z1bmNfLk11dGF0ZSgpID0gZnVuYzsKKyAgICBQQVNTX1RIUk9VR0goYywgRGVwdGhGdW5jLCBmdW5jKTsKK30KKworLy8gU2V0cyB3aGV0aGVyIG9yIG5vdCB0aGUgcGl4ZWwgZGVwdGggdmFsdWUgaXMgd3JpdHRlbiB0byB0aGUgZnJhbWVidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIERlcHRoTWFzaywgR0xib29sZWFuIGZsYWcpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+ZGVwdGhfd3JpdGVtYXNrXy5NdXRhdGUoKSA9IGZsYWcgIT0gR0xfRkFMU0UgPyBHTF9UUlVFIDogR0xfRkFMU0U7CisgICAgUEFTU19USFJPVUdIKGMsIERlcHRoTWFzaywgZmxhZyk7Cit9CisKKy8vIFBpeGVscyBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlIGNsaXBwZWQgYW5kIHRoZSBmcmFnbWVudCBkZXB0aCBpcyBub3JtYWxpemVkCisvLyBvbiB3cml0ZSBiYXNlZCBvbiB0aGVtLgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZXB0aFJhbmdlZiwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHpOZWFyID0gQ2xhbXBWYWx1ZSh6TmVhciwgMC5mLCAxLmYpOworICAgIHpGYXIgPSBDbGFtcFZhbHVlKHpGYXIsIDAuZiwgMS5mKTsKKworICAgIEdMZmxvYXQgKCZkZXB0aF9yYW5nZSlbMl0gPSBjLT5kZXB0aF9yYW5nZV8uTXV0YXRlKCk7CisgICAgZGVwdGhfcmFuZ2VbMF0gPSBzdGF0aWNfY2FzdDxHTGZsb2F0Pih6TmVhcik7CisgICAgZGVwdGhfcmFuZ2VbMV0gPSBzdGF0aWNfY2FzdDxHTGZsb2F0Pih6RmFyKTsKKyAgICBQQVNTX1RIUk9VR0goYywgRGVwdGhSYW5nZWYsIHpOZWFyLCB6RmFyKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEZXB0aFJhbmdlZk9FUywgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERlcHRoUmFuZ2VmKHpOZWFyLCB6RmFyKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgRGVwdGhSYW5nZXgsIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xEZXB0aFJhbmdlZihYMkYoek5lYXIpLCBYMkYoekZhcikpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEZXB0aFJhbmdleE9FUywgR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERlcHRoUmFuZ2VmKFgyRih6TmVhciksIFgyRih6RmFyKSkpOworfQorCisvLyBSZW1vdmVzIGEgc2hhZGVyIGZyb20gYSBwcm9ncmFtLgorQVBJRU5UUllfSU1QTCh2b2lkLCBEZXRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgU2hhZGVyRGF0YVB0ciBzaGFkZXJfZGF0YSA9IHNnLT5HZXRTaGFkZXJEYXRhKHNoYWRlcik7CisgICAgaWYgKHNoYWRlcl9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkludmFsaWQgc2hhZGVyICVkIiwgc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+RGV0YWNoU2hhZGVyKHNoYWRlcl9kYXRhKTsKK30KKworLy8gQ2xlYXIgc2VydmVyIHN0YXRlIGNhcGFiaWxpdHkuCitBUElFTlRSWV9JTVBMKHZvaWQsIERpc2FibGUsIEdMZW51bSBjYXApIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgaW50IGtpbmQgPSBHZXRDYXBhYmlsaXR5SGFuZGxpbmdLaW5kKGNhcCk7CisgICAgaWYgKGtpbmQgPT0ga0hhbmRsaW5nS2luZEludmFsaWQpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oY2FwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZExvY2FsQ29weSkgeworICAgICAgICBjLT5lbmFibGVkX3NldF8uZXJhc2UoY2FwKTsKKyAgICB9CisgICAgaWYgKGtpbmQgJiBrSGFuZGxpbmdLaW5kVW5pZm9ybSkgeworICAgICAgICBjLT51bmlmb3JtX2NvbnRleHRfLkRpc2FibGUoY2FwKTsKKyAgICB9CisgICAgaWYgKGtpbmQgJiBrSGFuZGxpbmdLaW5kVGV4dHVyZSkgeworICAgICAgICBjLT50ZXh0dXJlX2NvbnRleHRfLkRpc2FibGUoY2FwKTsKKyAgICB9CisgICAgaWYgKGtpbmQgJiBrSGFuZGxpbmdLaW5kUHJvcGFnYXRlKSB7CisgICAgICAgIFBBU1NfVEhST1VHSChjLCBEaXNhYmxlLCBjYXApOworICAgIH0KK30KKworLy8gQ2xlYXIgY2xpZW50IHN0YXRlIGNhcGFiaWxpdHkuCitBUElFTlRSWV9JTVBMKHZvaWQsIERpc2FibGVDbGllbnRTdGF0ZSwgR0xlbnVtIGNhcCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRDbGllbnRTdGF0ZShjYXApKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGNhcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHTHVpbnQgaW5kZXggPSBBcnJheUVudW1Ub0luZGV4KGMsIGNhcCk7CisgICAgaWYgKCFjLT5wb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGluZGV4KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50ZXJfY29udGV4dF8uRGlzYWJsZUFycmF5KGluZGV4KTsKK30KKworLy8gRGlzYWJsZXMgaW5wdXQgZnJvbSBhbiBhcnJheSB0byB0aGUgZ2l2ZW4gdmVydGV4IHNoYWRlciBhdHRyaWJ1dGUuCitBUElFTlRSWV9JTVBMKHZvaWQsIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgR0x1aW50IGluZGV4KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmRleCA+PSBzdGF0aWNfY2FzdDxHTHVpbnQ+KGMtPm1heF92ZXJ0ZXhfYXR0cmlic18uR2V0KCkpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9VSU5UKGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5wb2ludGVyX2NvbnRleHRfLkRpc2FibGVBcnJheShpbmRleCk7CisgICAgUEFTU19USFJPVUdIKGMsIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgaW5kZXgpOworfQorCisvLyBSZW5kZXJzIHByaW1pdGl2ZXMgdXNpbmcgdGhlIGN1cnJlbnQgc3RhdGUuCitBUElFTlRSWV9JTVBMKHZvaWQsIERyYXdBcnJheXMsIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWREcmF3TW9kZShtb2RlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShtb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZmlyc3QgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoZmlyc3QpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChjb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYy0+RHJhdyhHbGVzQ29udGV4dDo6a0RyYXdBcnJheXMsIG1vZGUsIGZpcnN0LCBjb3VudCwgMCwgTlVMTCk7Cit9CisKKy8vIFJlbmRlcnMgcHJpbWl0aXZlcyB1c2luZyB0aGUgY3VycmVudCBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRHJhd0VsZW1lbnRzLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWREcmF3TW9kZShtb2RlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShtb2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWREcmF3VHlwZSh0eXBlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoY291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPkRyYXcoR2xlc0NvbnRleHQ6OmtEcmF3RWxlbWVudHMsIG1vZGUsIDAsIGNvdW50LCB0eXBlLCBpbmRpY2VzKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4Zk9FUywgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+RHJhd1RleCh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4ZnZPRVMsIGNvbnN0IEdMZmxvYXQqIGNvb3JkcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRHJhd1RleGZPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4aU9FUywgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRHJhd1RleGZPRVMoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIERyYXdUZXhpdk9FUywgY29uc3QgR0xpbnQqIGNvb3JkcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRHJhd1RleGZPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4c09FUywgR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERyYXdUZXhmT0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4c3ZPRVMsIGNvbnN0IEdMc2hvcnQqIGNvb3JkcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRHJhd1RleGZPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBEcmF3VGV4eE9FUywgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERyYXdUZXhmT0VTKFgyRih4KSwgWDJGKHkpLCBYMkYoeiksIFgyRih3aWR0aCksIFgyRihoZWlnaHQpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgRHJhd1RleHh2T0VTLCBjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbERyYXdUZXhmT0VTKFgyRihjb29yZHNbMF0pLCBYMkYoY29vcmRzWzFdKSwgWDJGKGNvb3Jkc1syXSksIFgyRihjb29yZHNbM10pLAorICAgICAgICAgICAgWDJGKGNvb3Jkc1s0XSkpKTsKK30KKworRWdsSW1hZ2VQdHIgR2V0RWdsSW1hZ2VGcm9tTmF0aXZlQnVmZmVyKEdMZWdsSW1hZ2VPRVMgYnVmZmVyKTsKKworLy8gU2V0IHRoZSBzcGVjaWZpZWQgRUdMIGltYWdlIGFzIHRoZSByZW5kZXJidWZmZXIgc3RvcmFnZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGJ1ZmZlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFZ2xJbWFnZVB0ciBpbWFnZSA9IEdldEVnbEltYWdlRnJvbU5hdGl2ZUJ1ZmZlcihidWZmZXIpOworICAgIGlmIChpbWFnZSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9QVFIoc3RhdGljX2Nhc3Q8dm9pZCAqPihidWZmZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRSZW5kZXJidWZmZXJUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFjLT5CaW5kSW1hZ2VUb1JlbmRlcmJ1ZmZlcihpbWFnZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byBiaW5kIGltYWdlIHRvIHJlbmRlcmJ1ZmZlci4iKTsKKyAgICB9Cit9CisKKy8vIFNldCB0aGUgc3BlY2lmaWVkIEVHTGltYWdlIGFzIHRoZSB0ZXh0dXJlLgorQVBJRU5UUllfSU1QTCh2b2lkLCBFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRExPRygiY2FsbCB1bmRlcmx5aW5nIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMiKTsKKyAgICBQQVNTX1RIUk9VR0goYywgRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMsIHRhcmdldCwgYnVmZmVyKTsKKworICAgIERMT0coInNob3VsZCBiaW5kIGltYWdlIHRvIHRleHR1cmUgQCB0aGlzIHBvaW50Iik7Cit9CisKKy8vIFNldCBzZXJ2ZXIgc3RhdGUgY2FwYWJpdHkuCitBUElFTlRSWV9JTVBMKHZvaWQsIEVuYWJsZSwgR0xlbnVtIGNhcCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbnQga2luZCA9IEdldENhcGFiaWxpdHlIYW5kbGluZ0tpbmQoY2FwKTsKKyAgICBpZiAoa2luZCA9PSBrSGFuZGxpbmdLaW5kSW52YWxpZCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShjYXApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGtpbmQgJiBrSGFuZGxpbmdLaW5kTG9jYWxDb3B5KSB7CisgICAgICAgIGMtPmVuYWJsZWRfc2V0Xy5pbnNlcnQoY2FwKTsKKyAgICB9CisgICAgaWYgKGtpbmQgJiBrSGFuZGxpbmdLaW5kVW5pZm9ybSkgeworICAgICAgICBjLT51bmlmb3JtX2NvbnRleHRfLkVuYWJsZShjYXApOworICAgIH0KKyAgICBpZiAoa2luZCAmIGtIYW5kbGluZ0tpbmRUZXh0dXJlKSB7CisgICAgICAgIGMtPnRleHR1cmVfY29udGV4dF8uRW5hYmxlKGNhcCk7CisgICAgfQorICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZFVuc3VwcG9ydGVkKSB7CisgICAgICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZElnbm9yZWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBjYXBhYmlsaXR5ICVzICgleCksIGJ1dCBpZ25vcmVkLiIsCisgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoY2FwKSwgY2FwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuc3VwcG9ydGVkIGNhcGFiaWxpdHkgJXMgKCV4KSIsCisgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoY2FwKSwgY2FwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoa2luZCAmIGtIYW5kbGluZ0tpbmRQcm9wYWdhdGUpIHsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIEVuYWJsZSwgY2FwKTsKKyAgICB9Cit9CisKKy8vIFNldCBjbGllbnQgc3RhdGUgY2FwYWJpbGl0eS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRW5hYmxlQ2xpZW50U3RhdGUsIEdMZW51bSBjYXApIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkQ2xpZW50U3RhdGUoY2FwKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShjYXApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgR0x1aW50IGluZGV4ID0gQXJyYXlFbnVtVG9JbmRleChjLCBjYXApOworICAgIGlmIChjLT5wb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGluZGV4KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50ZXJfY29udGV4dF8uRW5hYmxlQXJyYXkoaW5kZXgpOworfQorCisvLyBFbmFibGVzIGlucHV0IGZyb20gYW4gYXJyYXkgdG8gdGhlIGdpdmVuIHZlcnRleCBzaGFkZXIgYXR0cmlidXRlLgorQVBJRU5UUllfSU1QTCh2b2lkLCBFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwgR0x1aW50IGluZGV4KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmRleCA+PSBzdGF0aWNfY2FzdDxHTHVpbnQ+KGMtPm1heF92ZXJ0ZXhfYXR0cmlic18uR2V0KCkpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9VSU5UKGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT5wb2ludGVyX2NvbnRleHRfLkVuYWJsZUFycmF5KGluZGV4KTsKKyAgICBQQVNTX1RIUk9VR0goYywgRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIGluZGV4KTsKK30KKworLy8gRmluaXNoZXMgYW55IGNvbW1hbmRzIGluIHRoZSBHTCBjb21tYW5kIHF1ZXVlLCBhbmQgcmV0dXJucyBvbmx5IHdoZW4gYWxsCisvLyBjb21tYW5kcyBhcmUgY29tcGxldGUgKGluY2x1ZGluZyBhbnkgcmVuZGVyaW5nKS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRmluaXNoKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBGaW5pc2gpOworfQorCisvLyBGbHVzaGVzIGFueSBjb21tYW5kcyBpbiB0aGUgR0wgY29tbWFuZCBxdWV1ZSwgZW5zdXJpbmcgdGhleSBhcmUgYWN0dWFsbHkKKy8vIGJlaW5nIHByb2Nlc3NlZCBhbmQgbm90IGp1c3Qgd2FpdGluZyBmb3Igc29tZSBvdGhlciBldmVudCB0byB0cmlnZ2VyIHRoZW0uCitBUElFTlRSWV9JTVBMKHZvaWQsIEZsdXNoKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBGbHVzaCk7Cit9CisKK25hbWVzcGFjZSB7CisKKyAgICAvLyBDb25maWd1cmVzIHRoZSBmb2cgY29tcHV0YXRpb24gb2YgdGhlIGZpeGVkLWZ1bmN0aW9uIHNoYWRlci4KKyAgICB2b2lkIEhhbmRsZUZvZyhHTGVudW0gbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zLCBQYXJhbVR5cGUgcGFyYW1fdHlwZSkgeworICAgICAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBGb2cmIGZvZyA9IGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlRm9nKCk7CisKKyAgICAgICAgY29uc3QgR0xlbnVtIG1vZGUgPSBzdGF0aWNfY2FzdDxHTGVudW0+KHBhcmFtc1swXSk7CisgICAgICAgIGNvbnN0IEdMZmxvYXQgdmFsdWUgPSBwYXJhbXNbMF07CisgICAgICAgIHN3aXRjaCAobmFtZSkgeworICAgICAgICAgICAgY2FzZSBHTF9GT0dfTU9ERToKKyAgICAgICAgICAgICAgICBpZiAobW9kZSAhPSBHTF9MSU5FQVIgJiYgbW9kZSAhPSBHTF9FWFAgJiYgbW9kZSAhPSBHTF9FWFAyKSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKG1vZGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvZy5tb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX0RFTlNJVFk6CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMC5mKSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9GTE9BVCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9nLmRlbnNpdHkgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX1NUQVJUOgorICAgICAgICAgICAgICAgIGZvZy5zdGFydCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9GT0dfRU5EOgorICAgICAgICAgICAgICAgIGZvZy5lbmQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfRk9HX0NPTE9SOgorICAgICAgICAgICAgICAgIGlmIChwYXJhbV90eXBlICE9IGtQYXJhbVR5cGVBcnJheSkgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfRU5VTSwgIkV4cGVjdGVkIGFycmF5IGZvciBHTF9GT0dfQ09MT1IuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbXVnbDo6VmVjdG9yOjprRW50cmllczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvZy5jb2xvci5TZXQoaSwgQ2xhbXBWYWx1ZShwYXJhbXNbaV0sIDAuZiwgMS5mKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKK30gIC8vIG5hbWVzcGFjZQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEZvZ2YsIEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBIYW5kbGVGb2cobmFtZSwgJnBhcmFtLCBrUGFyYW1UeXBlU2NhbGFyKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGb2dmdiwgR0xlbnVtIG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgSGFuZGxlRm9nKG5hbWUsIHBhcmFtcywga1BhcmFtVHlwZUFycmF5KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGb2d4LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIGlmIChwbmFtZSA9PSBHTF9GT0dfTU9ERSkgeworICAgICAgICBUUkNBTEwoZ2xGb2dmKHBuYW1lLCBzdGF0aWNfY2FzdDxHTGZsb2F0PihwYXJhbSkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUUkNBTEwoZ2xGb2dmKHBuYW1lLCBYMkYocGFyYW0pKSk7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEZvZ3hPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRm9neChwbmFtZSwgcGFyYW0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGb2d4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIGlmIChwbmFtZSA9PSBHTF9GT0dfTU9ERSkgeworICAgICAgICBUUkNBTEwoZ2xGb2dmKHBuYW1lLCBzdGF0aWNfY2FzdDxHTGZsb2F0PihwYXJhbXNbMF0pKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgR0xmbG9hdCB0bXBba01heFBhcmFtRWxlbWVudFNpemVdOworICAgICAgICBDb252ZXJ0KHRtcCwgUGFyYW1TaXplKHBuYW1lKSwgcGFyYW1zKTsKKyAgICAgICAgVFJDQUxMKGdsRm9nZnYocG5hbWUsIHRtcCkpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGb2d4dk9FUywgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEZvZ3h2KHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gQXR0YWNoZXMgYSByZW5kZXIgYnVmZmVyIHRvIGEgZnJhbWUgYnVmZmVyLgorQVBJRU5UUllfSU1QTCh2b2lkLCBGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkRnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZEZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShhdHRhY2htZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRSZW5kZXJidWZmZXJUYXJnZXQocmVuZGVyYnVmZmVydGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShyZW5kZXJidWZmZXJ0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRnJhbWVidWZmZXJEYXRhUHRyIGZiID0gYy0+R2V0Qm91bmRGcmFtZWJ1ZmZlckRhdGEoKTsKKyAgICBpZiAocmVuZGVyYnVmZmVyID09IDApIHsKKyAgICAgICAgaWYgKGZiICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZiLT5DbGVhckF0dGFjaG1lbnQoYXR0YWNobWVudCk7CisgICAgICAgIH0KKyAgICAgICAgUEFTU19USFJPVUdIKGMsIEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyLCB0YXJnZXQsIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgcmVuZGVyYnVmZmVydGFyZ2V0LCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgICAgICBSZW5kZXJidWZmZXJEYXRhUHRyIHJiID0gc2ctPkdldFJlbmRlcmJ1ZmZlckRhdGEocmVuZGVyYnVmZmVyKTsKKyAgICAgICAgaWYgKHJiID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHJlbmRlcmJ1ZmZlci4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBmYi0+U2V0QXR0YWNobWVudChhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlciwgcmIpOworICAgICAgICB9CisKKyAgICAgICAgR0xpbnQgdGV4dHVyZSA9IHJiLT5HZXRFZ2xJbWFnZVRleHR1cmUoKTsKKyAgICAgICAgaWYgKHRleHR1cmUgIT0gMCkgeworICAgICAgICAgICAgLy8gVGhpcyByZW5kZXJidWZmZXIgb2JqZWN0IGlzIGFuIEVHTEltYWdlIHRhcmdldCBzbyBhdHRhY2ggdGhlCisgICAgICAgICAgICAvLyBFR0xJbWFnZSdzIHRleHR1cmUgaW5zdGVhZCB0aGUgcmVuZGVyYnVmZmVyLgorICAgICAgICAgICAgUEFTU19USFJPVUdIKGMsIEZyYW1lYnVmZmVyVGV4dHVyZTJELCB0YXJnZXQsIGF0dGFjaG1lbnQsIEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgIHRleHR1cmUsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgR0x1aW50IGdsb2JhbF9uYW1lID0gc2ctPkdldFJlbmRlcmJ1ZmZlckdsb2JhbE5hbWUocmVuZGVyYnVmZmVyKTsKKyAgICAgICAgICAgIFBBU1NfVEhST1VHSChjLCBGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgdGFyZ2V0LCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICByZW5kZXJidWZmZXJ0YXJnZXQsIGdsb2JhbF9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LAorICAgICAgICAgICAgcmVuZGVyYnVmZmVyKSk7Cit9CisKKy8vIFNldHMgdXAgYSB0ZXh0dXJlIHRvIGJlIHVzZWQgYXMgdGhlIGZyYW1lYnVmZmVyIGZvciBzdWJzZXF1ZW50IHJlbmRlcmluZy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRnJhbWVidWZmZXJUZXh0dXJlMkQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkRnJhbWVidWZmZXJUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZEZyYW1lYnVmZmVyQXR0YWNobWVudChhdHRhY2htZW50KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShhdHRhY2htZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRUZXh0dXJlVGFyZ2V0RXgodGV4dGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0ZXh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsZXZlbCAhPSAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobGV2ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgZnJhbWVidWZmZXIgYXR0YWNobWVudC4KKyAgICBGcmFtZWJ1ZmZlckRhdGFQdHIgZmIgPSBjLT5HZXRCb3VuZEZyYW1lYnVmZmVyRGF0YSgpOworICAgIGlmIChmYiAhPSBOVUxMKSB7CisgICAgICAgIGZiLT5TZXRBdHRhY2htZW50KGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgUmVuZGVyYnVmZmVyRGF0YVB0cigpKTsKKyAgICB9CisKKyAgICBjb25zdCBHTHVpbnQgZ2xvYmFsX25hbWUgPSBzZy0+R2V0VGV4dHVyZUdsb2JhbE5hbWUodGV4dHVyZSk7CisgICAgUEFTU19USFJPVUdIKGMsIEZyYW1lYnVmZmVyVGV4dHVyZTJELCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwKKyAgICAgICAgICAgIGdsb2JhbF9uYW1lLCBsZXZlbCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCkpOworfQorCisvLyBTZXRzIHdoaWNoIG9yZGVyIChjbG9ja3dpc2UsIGNvdW50ZXItY2xvY2t3aXNlKSBpcyBjb25zaWRlcmVkIGZyb250IGZhY2luZy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgRnJvbnRGYWNlLCBHTGVudW0gbW9kZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRGcm9udEZhY2VNb2RlKG1vZGUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKG1vZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+ZnJvbnRfZmFjZV8uTXV0YXRlKCkgPSBtb2RlOworICAgIFBBU1NfVEhST1VHSChjLCBGcm9udEZhY2UsIG1vZGUpOworfQorCisvLyBNdWx0aXBsaWVzIHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIHRoZSBzcGVjaWZpZWQgcGVyc3BlY3RpdmUgbWF0cml4LgorQVBJRU5UUllfSU1QTCh2b2lkLCBGcnVzdHVtZiwgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUFjdGl2ZU1hdHJpeCgpICo9CisgICAgICAgIGVtdWdsOjpNYXRyaXg6OkdlbmVyYXRlUGVyc3BlY3RpdmUobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgRnJ1c3R1bWZPRVMsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEZydXN0dW1mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGcnVzdHVteCwgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRnJ1c3R1bWYoWDJGKGxlZnQpLCBYMkYocmlnaHQpLCBYMkYoYm90dG9tKSwgWDJGKHRvcCksIFgyRih6TmVhciksCisgICAgICAgICAgICBYMkYoekZhcikpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBGcnVzdHVteE9FUywgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsRnJ1c3R1bWYoWDJGKGxlZnQpLCBYMkYocmlnaHQpLCBYMkYoYm90dG9tKSwgWDJGKHRvcCksIFgyRih6TmVhciksCisgICAgICAgICAgICBYMkYoekZhcikpKTsKK30KKworLy8gR2VuZXJhdGUgTiBidWZmZXIgb2JqZWN0cy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2VuQnVmZmVycywgR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT5HZXRTaGFyZUdyb3VwKCktPkdlbkJ1ZmZlcnMobiwgYnVmZmVycyk7Cit9CisKKy8vIEdlbmVyYXRlIE4gZnJhbWVidWZmZXIgb2JqZWN0cy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2VuRnJhbWVidWZmZXJzLCBHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChuIDwgMCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKG4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+R2V0U2hhcmVHcm91cCgpLT5HZW5GcmFtZWJ1ZmZlcnMobiwgZnJhbWVidWZmZXJzKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZW5GcmFtZWJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEdlbkZyYW1lYnVmZmVycyhuLCBmcmFtZWJ1ZmZlcnMpKTsKK30KKworLy8gR2VuZXJhdGVzIE4gcmVuZGVyYnVmZmVyIG9iamVjdHMuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdlblJlbmRlcmJ1ZmZlcnMsIEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChuIDwgMCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKG4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+R2V0U2hhcmVHcm91cCgpLT5HZW5SZW5kZXJidWZmZXJzKG4sIHJlbmRlcmJ1ZmZlcnMpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdlblJlbmRlcmJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xHZW5SZW5kZXJidWZmZXJzKG4sIHJlbmRlcmJ1ZmZlcnMpKTsKK30KKworLy8gQ3JlYXRlcyBOIHRleHR1cmUgb2JqZWN0cy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2VuVGV4dHVyZXMsIEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPkdldFNoYXJlR3JvdXAoKS0+R2VuVGV4dHVyZXMobiwgdGV4dHVyZXMpOworfQorCisvLyBHZW5lcmF0ZXMgYWxsIHRoZSBtaXBtYXBzIG9mIGEgdGV4dHVyZSBmcm9tIHRoZSBoaWdoZXN0IHJlc29sdXRpb24gaW1hZ2UuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdlbmVyYXRlTWlwbWFwLCBHTGVudW0gdGFyZ2V0KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkxMyk6IFJlY29yZCB0ZXh0dXJlIGZvcm1hdCBmb3IgdGV4dHVyZSBjb252ZXJzaW9uCisgICAgLy8gd29ya2Fyb3VuZCBmb3IgUGVwcGVyIEdMRVMyLgorICAgIFBBU1NfVEhST1VHSChjLCBHZW5lcmF0ZU1pcG1hcCwgdGFyZ2V0KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZW5lcmF0ZU1pcG1hcE9FUywgR0xlbnVtIHRhcmdldCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsR2VuZXJhdGVNaXBtYXAodGFyZ2V0KSk7Cit9CisKKy8vIEdldHMgdGhlIGxpc3Qgb2YgYXR0cmlidXRlIGluZGljZXMgdXNlZCBieSB0aGUgZ2l2ZW4gcHJvZ3JhbS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0QWN0aXZlQXR0cmliLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gc2ctPkdldFByb2dyYW1EYXRhKHByb2dyYW0pOworICAgIGlmIChwcm9ncmFtX2RhdGEgPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiSW52YWxpZCBwcm9ncmFtICVkIiwgcHJvZ3JhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9ncmFtX2RhdGEtPkdldEFjdGl2ZUF0dHJpYihpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKK30KKworLy8gR2V0cyB0aGUgbGlzdCBvZiB1bmlmb3JtIGluZGljZXMgdXNlZCBieSB0aGUgZ2l2ZW4gcHJvZ3JhbS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0QWN0aXZlVW5pZm9ybSwgR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IHNnLT5HZXRQcm9ncmFtRGF0YShwcm9ncmFtKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkludmFsaWQgcHJvZ3JhbSAlZCIsIHByb2dyYW0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvZ3JhbV9kYXRhLT5HZXRBY3RpdmVVbmlmb3JtKGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworfQorCisvLyBHZXRzIHRoZSBsaXN0IG9mIHNoYWRlciBvYmplY3RzIHVzZWQgYnkgdGhlIGdpdmVuIHByb2dyYW0uCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldEF0dGFjaGVkU2hhZGVycywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+R2V0QXR0YWNoZWRTaGFkZXJzKG1heGNvdW50LCBjb3VudCwgc2hhZGVycyk7Cit9CisKKy8vIEdldHMgdGhlIGluZGV4IG9mIGFuIGF0dHJpYnV0ZSBmb3IgYSBwcm9ncmFtIGJ5IG5hbWUuCitBUElFTlRSWV9JTVBMKEdMaW50LCBHZXRBdHRyaWJMb2NhdGlvbiwgR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IHNnLT5HZXRQcm9ncmFtRGF0YShwcm9ncmFtKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkludmFsaWQgcHJvZ3JhbSAlZCIsIHByb2dyYW0pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHByb2dyYW1fZGF0YS0+R2V0QXR0cmliTG9jYXRpb24obmFtZSk7Cit9CisKKy8vIEdldHMgc3RhdGUgYXMgYSBib29sZWFuLgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRCb29sZWFudiwgR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYy0+R2V0Qm9vbGVhbnYocG5hbWUsIHBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcGFyYW1zID0gR0xfRkFMU0U7CisgICAgUEFTU19USFJPVUdIKGMsIEdldEJvb2xlYW52LCBwbmFtZSwgcGFyYW1zKTsKK30KKworLy8gR2V0IGJ1ZmZlciBwYXJhbWV0ZXIgdmFsdWUuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldEJ1ZmZlclBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkQnVmZmVyVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ1ZmZlckRhdGFQdHIgdmJvID0gYy0+R2V0Qm91bmRUYXJnZXRCdWZmZXJEYXRhKHRhcmdldCk7CisgICAgaWYgKHZibyA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJUYXJnZXQgYnVmZmVyIG5vdCBib3VuZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9CVUZGRVJfU0laRToKKyAgICAgICAgICAgICpwYXJhbXMgPSB2Ym8tPkdldFNpemUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0JVRkZFUl9VU0FHRToKKyAgICAgICAgICAgICpwYXJhbXMgPSB2Ym8tPkdldFVzYWdlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8vIEdldHMgdGhlIGN1cnJlbnQgY2xpcCBwbGFuZSBwYXJhbWV0ZXJzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRDbGlwUGxhbmVmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIGVxbikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBlbXVnbDo6VmVjdG9yKiBwbGFuZSA9IGMtPnVuaWZvcm1fY29udGV4dF8uR2V0Q2xpcFBsYW5lKHBuYW1lKTsKKyAgICBpZiAoIXBsYW5lKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgZXFuW2ldID0gcGxhbmUtPkdldChpKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0Q2xpcFBsYW5lZk9FUywgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBlcW4pIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEdldENsaXBQbGFuZWYocG5hbWUsIGVxbikpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldENsaXBQbGFuZXgsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogZXFuKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1FbGVtZW50cyA9IDQ7CisgICAgR0xmbG9hdCB0bXBba051bUVsZW1lbnRzXTsKKyAgICBUUkNBTEwoZ2xHZXRDbGlwUGxhbmVmKHBuYW1lLCB0bXApKTsKKyAgICBDb252ZXJ0KHRtcCwga051bUVsZW1lbnRzLCBlcW4pOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldENsaXBQbGFuZXhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogZXFuKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xHZXRDbGlwUGxhbmV4KHBuYW1lLCBlcW4pKTsKK30KKworLy8gUmV0dXJucyB0aGUgb2xkZXN0IGVycm9yIGNvZGUgdGhhdCB3YXMgcmVwb3J0ZWQuCitBUElFTlRSWV9JTVBMKEdMZW51bSwgR2V0RXJyb3IpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYyB8fCAhYy0+QXJlQ2hlY2tzRW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBHTF9OT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBOLkIuIFdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hpY2ggaXMgb2xkZXIgLS0gdGhlIG9sZGVzdCBlcnJvciB3ZQorICAgIC8vIHJlY29yZGVkIG9yIGFueSBlcnJvciB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZSBkb3duc3RyZWFtLiBXZSBqdXN0IHJldHVybgorICAgIC8vIGFueSBlcnJvciB3ZSBtaWdodCBoYXZlLCBhbmQgaWYgbm9uZSwgd2UgcGFzcyB0aGUgcmVxdWVzdCB0aHJvdWdoLgorICAgIEdMZW51bSBlcnJvciA9IGMtPkdldEdMZXJyb3IoKTsKKyAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlJldHVybmluZyBlcnJvciAlcyBkaXJlY3RseS4iLCBHZXRFbnVtU3RyaW5nKGVycm9yKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyb3IgPSBQQVNTX1RIUk9VR0goYywgR2V0RXJyb3IpOworICAgICAgICBBTE9HVigiUmV0dXJuaW5nIGVycm9yICVzIGZyb20gcGFzc3Rocm91Z2guIiwgR2V0RW51bVN0cmluZyhlcnJvcikpOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8vIEdldHMgc3RhdGUgYXMgYSBmaXhlZC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0Rml4ZWR2LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgR0xmbG9hdCB0bXBba01heFBhcmFtRWxlbWVudFNpemVdOworICAgIFRSQ0FMTChnbEdldEZsb2F0dihwbmFtZSwgdG1wKSk7CisgICAgQ29udmVydChwYXJhbXMsIFBhcmFtU2l6ZShwbmFtZSksIHRtcCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0Rml4ZWR2T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsR2V0Rml4ZWR2KHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gR2V0cyBzdGF0ZSBhcyBhIGZsb2F0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRGbG9hdHYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjLT5HZXRGbG9hdHYocG5hbWUsIHBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcGFyYW1zID0gMC5mOworICAgIFBBU1NfVEhST1VHSChjLCBHZXRGbG9hdHYsIHBuYW1lLCBwYXJhbXMpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZEZyYW1lYnVmZmVyVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRGcmFtZWJ1ZmZlckF0dGFjaG1lbnQoYXR0YWNobWVudCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oYXR0YWNobWVudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkRnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1zKHBuYW1lKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUYWtlIHRoZSBhdHRhY2htZW50IGF0dHJpYnV0ZSBmcm9tIG91ciBzdGF0ZSAtIGlmIGF2YWlsYWJsZQorICAgIEZyYW1lYnVmZmVyRGF0YVB0ciBmYiA9IGMtPkdldEJvdW5kRnJhbWVidWZmZXJEYXRhKCk7CisgICAgaWYgKGZiID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEdMZW51bSBhdHRhY2htZW50X3RhcmdldCA9IDA7CisgICAgY29uc3QgR0x1aW50IG5hbWUgPSBmYi0+R2V0QXR0YWNobWVudChhdHRhY2htZW50LCAmYXR0YWNobWVudF90YXJnZXQpOworICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOgorICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRfdGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gR0xfVEVYVFVSRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudF90YXJnZXQgPT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpIHsKKyAgICAgICAgICAgICAgICAqcGFyYW1zID0gR0xfVEVYVFVSRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0YWNobWVudF90YXJnZXQgPT0gR0xfUkVOREVSQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IEdMX1JFTkRFUkJVRkZFUjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBhdHRhY2htZW50IHRhcmdldDogJWQiLCBhdHRhY2htZW50X3RhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FOgorICAgICAgICAgICAgKnBhcmFtcyA9IG5hbWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6CisgICAgICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOgorICAgICAgICAgICAgRExPRygiVU5JTVBMRU1FTlRFRDogR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UiKTsKKyAgICAgICAgICAgIC8vIFBBU1NfVEhST1VHSChjLCBHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBhdHRhY2htZW50LAorICAgICAgICAgICAgLy8gICAgICAgICBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKSk7Cit9CisKKy8vIEdldHMgc3RhdGUgYXMgYW4gaW50ZWdlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0SW50ZWdlcnYsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYy0+R2V0SW50ZWdlcnYocG5hbWUsIHBhcmFtcykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcGFyYW1zID0gMDsKKyAgICBQQVNTX1RIUk9VR0goYywgR2V0SW50ZWdlcnYsIHBuYW1lLCBwYXJhbXMpOworfQorCisvLyBHZXRzIGZpeGVkIGZ1bmN0aW9uIGxpZ2h0aW5nIHN0YXRlLgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRMaWdodGZ2LCBHTGVudW0gbGlnaHRpZCwgR0xlbnVtIG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBMaWdodCogbGlnaHQgPSBjLT51bmlmb3JtX2NvbnRleHRfLkdldExpZ2h0KGxpZ2h0aWQpOworICAgIGlmICghbGlnaHQpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0obGlnaHRpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW11Z2w6OlZlY3Rvcjo6a0VudHJpZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IGxpZ2h0LT5hbWJpZW50LkdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBsaWdodC0+ZGlmZnVzZS5HZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW11Z2w6OlZlY3Rvcjo6a0VudHJpZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IGxpZ2h0LT5zcGVjdWxhci5HZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9QT1NJVElPTjoKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW11Z2w6OlZlY3Rvcjo6a0VudHJpZXM7ICsraSkgeworICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9IGxpZ2h0LT5wb3NpdGlvbi5HZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0RJUkVDVElPTjoKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gbGlnaHQtPmRpcmVjdGlvbi5HZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgICAgICAgICAgcGFyYW1zWzBdID0gbGlnaHQtPnNwb3RfZXhwb25lbnQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IGxpZ2h0LT5zcG90X2N1dG9mZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgcGFyYW1zWzBdID0gbGlnaHQtPmNvbnN0X2F0dGVudWF0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgcGFyYW1zWzBdID0gbGlnaHQtPmxpbmVhcl9hdHRlbnVhdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTjoKKyAgICAgICAgICAgIHBhcmFtc1swXSA9IGxpZ2h0LT5xdWFkcmF0aWNfYXR0ZW51YXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRMaWdodHh2LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBHTGZsb2F0IHRtcFtrTWF4UGFyYW1FbGVtZW50U2l6ZV07CisgICAgVFJDQUxMKGdsR2V0TGlnaHRmdihsaWdodCwgcG5hbWUsIHRtcCkpOworICAgIENvbnZlcnQocGFyYW1zLCBQYXJhbVNpemUocG5hbWUpLCB0bXApOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldExpZ2h0eHZPRVMsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEdldExpZ2h0eHYobGlnaHQsIHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gR2V0cyBmaXhlZCBmdW5jdGlvbiBtYXRlcmlhbCBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0TWF0ZXJpYWxmdiwgR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZhY2UgIT0gR0xfRlJPTlQgJiYgZmFjZSAhPSBHTF9CQUNLKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGZhY2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgTWF0ZXJpYWwmIG1hdGVyaWFsID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5HZXRNYXRlcmlhbCgpOworICAgIHN3aXRjaCAobmFtZSkgeworICAgICAgICBjYXNlIEdMX0FNQklFTlQ6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBtYXRlcmlhbC5hbWJpZW50LkdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBtYXRlcmlhbC5kaWZmdXNlLkdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1NQRUNVTEFSOgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbXVnbDo6VmVjdG9yOjprRW50cmllczsgKytpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zW2ldID0gbWF0ZXJpYWwuc3BlY3VsYXIuR2V0KGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfRU1JU1NJT046CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbaV0gPSBtYXRlcmlhbC5lbWlzc2lvbi5HZXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9TSElOSU5FU1M6CisgICAgICAgICAgICBwYXJhbXNbMF0gPSBtYXRlcmlhbC5zaGluaW5lc3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRNYXRlcmlhbHh2LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBUUkNBTEwoZ2xHZXRNYXRlcmlhbGZ2KGZhY2UsIHBuYW1lLCB0bXApKTsKKyAgICBDb252ZXJ0KHBhcmFtcywgUGFyYW1TaXplKHBuYW1lKSwgdG1wKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRNYXRlcmlhbHh2T0VTLCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEdldE1hdGVyaWFseHYoZmFjZSwgcG5hbWUsIHBhcmFtcykpOworfQorCisvLyBHZXRzIHBvaW50ZXIgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0UG9pbnRlcnYsIEdMZW51bSBwbmFtZSwgdm9pZCoqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHTHVpbnQgaW5kZXggPSBBcnJheUVudW1Ub0luZGV4KGMsIHBuYW1lKTsKKyAgICBjb25zdCBQb2ludGVyRGF0YSogcHRyID0gYy0+cG9pbnRlcl9jb250ZXh0Xy5HZXRQb2ludGVyRGF0YShpbmRleCk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocG5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBhcmFtcyA9IGNvbnN0X2Nhc3Q8dm9pZCo+KHB0ci0+cG9pbnRlcik7CisgICAgfQorfQorCisvLyBHZXRzIHRoZSBvdXRwdXQgdGV4dCBtZXNzYWdlcyBmcm9tIHRoZSBsYXN0IHByb2dyYW0gbGluay92YWxpZGF0aW9uIHJlcXVlc3QuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFByb2dyYW1JbmZvTG9nLCBHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IHNnLT5HZXRQcm9ncmFtRGF0YShwcm9ncmFtKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkludmFsaWQgcHJvZ3JhbSAlZCIsIHByb2dyYW0pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvZ3JhbV9kYXRhLT5HZXRJbmZvTG9nKGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7Cit9CisKKy8vIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9ncmFtLgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRQcm9ncmFtaXYsIEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+R2V0UHJvZ3JhbWl2KHBuYW1lLCBwYXJhbXMpOworfQorCisvLyBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZW5kZXIgYnVmZmVyIGJvdW5kIHRvIHRoZSBpbmRpY2F0ZWQgdGFyZ2V0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkUmVuZGVyYnVmZmVyUGFyYW1zKHBuYW1lKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZW5kZXJidWZmZXJEYXRhUHRyIHJiID0gYy0+R2V0Qm91bmRSZW5kZXJidWZmZXJEYXRhKCk7CisgICAgaWYgKHJiICE9IE5VTEwpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEg6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHJiLT5HZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUOgorICAgICAgICAgICAgICAgICpwYXJhbXMgPSByYi0+R2V0SGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQ6CisgICAgICAgICAgICAgICAgKnBhcmFtcyA9IHJiLT5HZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgYnVmZmVyIHBhcmFtZXRlciAlcyAoJXgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gR2V0cyB0aGUgb3V0cHV0IHRleHQgbWVzc2FnZXMgZnJvbSB0aGUgbGFzdCBzaGFkZXIgY29tcGlsZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0U2hhZGVySW5mb0xvZywgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFNoYWRlckRhdGFQdHIgc2hhZGVyX2RhdGEgPSBzZy0+R2V0U2hhZGVyRGF0YShzaGFkZXIpOworICAgIGlmIChzaGFkZXJfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJOb3QgYSB2YWxpZCBzaGFkZXIgJWQiLCBzaGFkZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hhZGVyX2RhdGEtPkdldEluZm9Mb2coYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKTsKK30KKworLy8gR2V0cyB0aGUgc2hhZGVycyBwcmVjaXNpb24uCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCwgc2hhZGVydHlwZSwgcHJlY2lzaW9udHlwZSwgcmFuZ2UsCisgICAgICAgICAgICBwcmVjaXNpb24pOworfQorCisvLyBHZXRzIHRoZSBzb3VyY2UgY29kZSBsb2FkZWQgaW50byB0aGUgaW5kaWNhdGVkIHNoYWRlciBvYmplY3QuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFNoYWRlclNvdXJjZSwgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgU2hhZGVyRGF0YVB0ciBzaGFkZXJfZGF0YSA9IHNnLT5HZXRTaGFkZXJEYXRhKHNoYWRlcik7CisgICAgaWYgKHNoYWRlcl9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIk5vdCBhIHZhbGlkIHNoYWRlciAlZCIsIHNoYWRlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaGFkZXJfZGF0YS0+R2V0U291cmNlKGJ1ZnNpemUsIGxlbmd0aCwgc291cmNlKTsKK30KKworLy8gR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNoYWRlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0U2hhZGVyaXYsIEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFNoYWRlckRhdGFQdHIgc2hhZGVyX2RhdGEgPSBzZy0+R2V0U2hhZGVyRGF0YShzaGFkZXIpOworICAgIGlmIChzaGFkZXJfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJOb3QgYSB2YWxpZCBzaGFkZXIgJWQiLCBzaGFkZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hhZGVyX2RhdGEtPkdldFNoYWRlcml2KHBuYW1lLCBwYXJhbXMpOworfQorCisvLyBHZXRzIHN0cmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgR0wgaW1wbGVtZW50YXRpb24uCitBUElFTlRSWV9JTVBMKGNvbnN0IEdMdWJ5dGUqLCBHZXRTdHJpbmcsIEdMZW51bSBuYW1lKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2Fubm90IGdldCBjdXJyZW50IGdsZXMgY29udGV4dCwgcXVpdHRpbmdcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNvbnN0IEdMdWJ5dGUqIHN0ciA9IGMtPkdldFN0cmluZyhuYW1lKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0obmFtZSk7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKKy8vIEdldHMgdGV4dHVyZSBlbnZpcm9ubWVudCBwYXJhbWV0ZXJzLgorbmFtZXNwYWNlIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIEhhbmRsZUdldFRleEVudihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIFQqIHBhcmFtcykgeworICAgICAgICAgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgICAgICAgICBpZiAoIWMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IFRleEVudiYgdGV4ZW52ID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5HZXRBY3RpdmVUZXhFbnYoKTsKKyAgICAgICAgICAgIGlmIChlbnYgIT0gR0xfVEVYVFVSRV9FTlYpIHsKKyAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShlbnYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8VD4odGV4ZW52Lm1vZGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1NSQzBfUkdCOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDMV9SR0I6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkMyX1JHQjoKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8VD4odGV4ZW52LnNyY19yZ2JbcG5hbWUgLSBHTF9TUkMwX1JHQl0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1NSQzBfQUxQSEE6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkMxX0FMUEhBOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDMl9BTFBIQToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8VD4odGV4ZW52LnNyY19hbHBoYVtwbmFtZSAtIEdMX1NSQzBfQUxQSEFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9PUEVSQU5EMF9SR0I6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9PUEVSQU5EMV9SR0I6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9PUEVSQU5EMl9SR0I6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtc1swXSA9IHN0YXRpY19jYXN0PFQ+KHRleGVudi5vcGVyYW5kX3JnYltwbmFtZSAtIEdMX09QRVJBTkQwX1JHQl0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX09QRVJBTkQwX0FMUEhBOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfT1BFUkFORDFfQUxQSEE6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9PUEVSQU5EMl9BTFBIQToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQ+KHRleGVudi5vcGVyYW5kX2FscGhhW3BuYW1lIC0gR0xfT1BFUkFORDBfQUxQSEFdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9DT01CSU5FX1JHQjoKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8VD4odGV4ZW52LmNvbWJpbmVfcmdiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9DT01CSU5FX0FMUEhBOgorICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMF0gPSBzdGF0aWNfY2FzdDxUPih0ZXhlbnYuY29tYmluZV9hbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfUkdCX1NDQUxFOgorICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMF0gPSBzdGF0aWNfY2FzdDxUPih0ZXhlbnYucmdiX3NjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9BTFBIQV9TQ0FMRToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzBdID0gc3RhdGljX2Nhc3Q8VD4odGV4ZW52LmFscGhhX3NjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9URVhUVVJFX0VOVl9DT0xPUjoKKyAgICAgICAgICAgICAgICAgICAgdGV4ZW52LmNvbG9yLkdldExpbmVhck1hcHBpbmcocGFyYW1zLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9DT09SRF9SRVBMQUNFX09FUzoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiR0xfQ09PUkRfUkVQTEFDRV9PRVMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocG5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworfSAgLy8gbmFtZXNwYWNlCisKK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0VGV4RW52ZnYsIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBIYW5kbGVHZXRUZXhFbnYoZW52LCBwbmFtZSwgcGFyYW1zKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRUZXhFbnZpdiwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBIYW5kbGVHZXRUZXhFbnYoZW52LCBwbmFtZSwgcGFyYW1zKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRUZXhFbnZ4diwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBUUkNBTEwoZ2xHZXRUZXhFbnZmdihlbnYsIHBuYW1lLCB0bXApKTsKKyAgICBDb252ZXJ0KHBhcmFtcywgUGFyYW1TaXplKHBuYW1lKSwgdG1wKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBHZXRUZXhFbnZ4dk9FUywgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbEdldFRleEVudnh2KGVudiwgcG5hbWUsIHBhcmFtcykpOworfQorCisvLyBHZXQgdGV4dHVyZSBwYXJhbWV0ZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRUZXh0dXJlVGFyZ2V0KHRhcmdldCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IEdMZW51bSBnbG9iYWxfdGFyZ2V0ID0gYy0+dGV4dHVyZV9jb250ZXh0Xy5FbnN1cmVDb3JyZWN0QmluZGluZyh0YXJnZXQpOworICAgIFBBU1NfVEhST1VHSChjLCBHZXRUZXhQYXJhbWV0ZXJmdiwgZ2xvYmFsX3RhcmdldCwgcG5hbWUsIHBhcmFtcyk7CisgICAgYy0+dGV4dHVyZV9jb250ZXh0Xy5SZXN0b3JlQmluZGluZyh0YXJnZXQpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFRleFBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkVGV4dHVyZVRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZW1jcHkocGFyYW1zLCB0ZXgtPkdldENyb3BSZWN0KCksIDQgKiBzaXplb2YoR0xpbnQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgR0xlbnVtIGdsb2JhbF90YXJnZXQgPSBjLT50ZXh0dXJlX2NvbnRleHRfLkVuc3VyZUNvcnJlY3RCaW5kaW5nKHRhcmdldCk7CisgICAgUEFTU19USFJPVUdIKGMsIEdldFRleFBhcmFtZXRlcml2LCBnbG9iYWxfdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICBjLT50ZXh0dXJlX2NvbnRleHRfLlJlc3RvcmVCaW5kaW5nKHRhcmdldCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0VGV4UGFyYW1ldGVyeHYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBHTGZsb2F0IHRtcFtrTWF4UGFyYW1FbGVtZW50U2l6ZV07CisgICAgVFJDQUxMKGdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdG1wKSk7CisgICAgQ29udmVydChwYXJhbXMsIFBhcmFtU2l6ZShwbmFtZSksIHRtcCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0VGV4UGFyYW1ldGVyeHZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xHZXRUZXhQYXJhbWV0ZXJ4dih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gR2V0cyB0aGUgZGVmYXVsdCB1bmlmb3JtIHZhbHVlIGZvciBhIHByb2dyYW0uCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFVuaWZvcm1mdiwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+R2V0VW5pZm9ybWZ2KGxvY2F0aW9uLCBwYXJhbXMpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFVuaWZvcm1pdiwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gc2ctPkdldFByb2dyYW1EYXRhKHByb2dyYW0pOworICAgIGlmIChwcm9ncmFtX2RhdGEgPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiSW52YWxpZCBwcm9ncmFtICVkIiwgcHJvZ3JhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9ncmFtX2RhdGEtPkdldFVuaWZvcm1pdihsb2NhdGlvbiwgcGFyYW1zKTsKK30KKworLy8gR2V0cyB0aGUgaW5kZXggb2YgYW4gdW5pZm9ybSBmb3IgYSBwcm9ncmFtIGJ5IG5hbWUuCitBUElFTlRSWV9JTVBMKEdMaW50LCBHZXRVbmlmb3JtTG9jYXRpb24sIEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBwcm9ncmFtX2RhdGEtPkdldFVuaWZvcm1Mb2NhdGlvbihuYW1lKTsKK30KKworLy8gR2V0cyBhIHBvaW50ZXIgdmFsdWUgZnJvbSB0aGUgdmVydGV4IGF0dHJpYnV0ZSBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgR2V0VmVydGV4QXR0cmliUG9pbnRlcnYsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwb2ludGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwbmFtZSAhPSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocG5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgUG9pbnRlckRhdGEqIHB0ciA9IGMtPnBvaW50ZXJfY29udGV4dF8uR2V0UG9pbnRlckRhdGEoaW5kZXgpOworICAgIGlmICghcHRyKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9VSU5UKGluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcG9pbnRlciA9IGNvbnN0X2Nhc3Q8dm9pZCo+KHB0ci0+cG9pbnRlcik7Cit9CisKKy8vIEdldHMgdGhlIHZlcnRleCBhdHRyaWJ1dGUgc3RhdGUuCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFZlcnRleEF0dHJpYmZ2LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IFBvaW50ZXJEYXRhKiBwdHIgPSBjLT5wb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKGluZGV4KTsKKyAgICBpZiAoIXB0cikgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfVUlOVChpbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgICAgICAgICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxHTGZsb2F0PihwdHItPmJ1ZmZlcl9uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxHTGZsb2F0PihwdHItPmVuYWJsZWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFOgorICAgICAgICAgICAgKnBhcmFtcyA9IHN0YXRpY19jYXN0PEdMZmxvYXQ+KHB0ci0+c2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERToKKyAgICAgICAgICAgICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxHTGZsb2F0PihwdHItPnN0cmlkZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEU6CisgICAgICAgICAgICAqcGFyYW1zID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocHRyLT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBzdGF0aWNfY2FzdDxHTGZsb2F0PihwdHItPm5vcm1hbGl6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFBBU1NfVEhST1VHSChjLCBHZXRWZXJ0ZXhBdHRyaWJmdiwgaW5kZXgsIHBuYW1lLCBwYXJhbXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIEdldFZlcnRleEF0dHJpYml2LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBQb2ludGVyRGF0YSogcHRyID0gYy0+cG9pbnRlcl9jb250ZXh0Xy5HZXRQb2ludGVyRGF0YShpbmRleCk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX1VJTlQoaW5kZXgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgICAgICAgICAqcGFyYW1zID0gcHRyLT5idWZmZXJfbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRDoKKyAgICAgICAgICAgICpwYXJhbXMgPSBwdHItPmVuYWJsZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkU6CisgICAgICAgICAgICAqcGFyYW1zID0gcHRyLT5zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREU6CisgICAgICAgICAgICAqcGFyYW1zID0gcHRyLT5zdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEU6CisgICAgICAgICAgICAqcGFyYW1zID0gcHRyLT50eXBlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEOgorICAgICAgICAgICAgKnBhcmFtcyA9IHB0ci0+bm9ybWFsaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQQVNTX1RIUk9VR0goYywgR2V0VmVydGV4QXR0cmliaXYsIGluZGV4LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLy8gUHJvdmlkZXMgYSBoaW50IHRvIHRoZSBHTCBpbXBsZW1lbnRhdGlvbi4gR2VuZXJhbGx5IHRoZSBhcHBsaWNhdGlvbiB1c2VzCisvLyBoaW50cyB0byBzdWdnZXN0IHdoZXJlIHBlcmZvcm1hbmNlIG1hdHRlcnMgbW9yZSB0aGFuIHJlbmRlcmluZyBxdWFsaXR5LgorQVBJRU5UUllfSU1QTCh2b2lkLCBIaW50LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHRhcmdldCkgeworICAgICAgICAvLyBHTEVTMSBzcGVjaWZpYyBoaW50cy4gIFdlIHdpbGwgaWdub3JlIHRoZW0gc2luY2UgdGhleSBhcmUgb25seSBoaW50cy4KKyAgICAgICAgY2FzZSBHTF9GT0dfSElOVDoKKyAgICAgICAgY2FzZSBHTF9MSU5FX1NNT09USF9ISU5UOgorICAgICAgICBjYXNlIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVDoKKyAgICAgICAgY2FzZSBHTF9QT0lOVF9TTU9PVEhfSElOVDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gR0xFUzIgc3VwcG9ydGVkIGhpbnRzLiBXZSBwYXNzIHRocm91Z2ggZXhjZXB0IGZvciBhbnkgY2FjaGluZy4KKyAgICAgICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVDoKKyAgICAgICAgICAgIGlmICghSXNWYWxpZE1pcG1hcEhpbnRNb2RlKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0obW9kZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+Z2VuZXJhdGVfbWlwbWFwX2hpbnRfLk11dGF0ZSgpID0gbW9kZTsKKyAgICAgICAgICAgIFBBU1NfVEhST1VHSChjLCBIaW50LCB0YXJnZXQsIG1vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGEgYnVmZmVyLgorQVBJRU5UUllfSU1QTChHTGJvb2xlYW4sIElzQnVmZmVyLCBHTHVpbnQgYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgQnVmZmVyRGF0YVB0ciBwdHIgPSBzZy0+R2V0QnVmZmVyRGF0YShidWZmZXIpOworICAgIHJldHVybiBwdHIgIT0gTlVMTCA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjYXBhYmlsaXR5IGlzIGVuYWJsZWQuCitBUElFTlRSWV9JTVBMKEdMYm9vbGVhbiwgSXNFbmFibGVkLCBHTGVudW0gY2FwKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuIEdMX0ZBTFNFOworICAgIH0KKworCisgICAgLy8gSXNFbmFibGVkIGlzIHVzZWQgZm9yIGNoZWNraW5nIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgY2FwYWJpbGl0aWVzLgorICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBjbGllbnQgc3RhdGUuCisgICAgaWYgKElzVmFsaWRDbGllbnRTdGF0ZShjYXApKSB7CisgICAgICAgIGNvbnN0IEdMdWludCBpbmRleCA9IEFycmF5RW51bVRvSW5kZXgoYywgY2FwKTsKKyAgICAgICAgcmV0dXJuIGMtPnBvaW50ZXJfY29udGV4dF8uSXNBcnJheUVuYWJsZWQoaW5kZXgpOworICAgIH0KKworICAgIGNvbnN0IGludCBraW5kID0gR2V0Q2FwYWJpbGl0eUhhbmRsaW5nS2luZChjYXApOworICAgIGlmIChraW5kID09IGtIYW5kbGluZ0tpbmRJbnZhbGlkKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGNhcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZExvY2FsQ29weSkgeworICAgICAgICByZXR1cm4gYy0+SXNFbmFibGVkKGNhcCk7CisgICAgfQorICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZFVuaWZvcm0pIHsKKyAgICAgICAgcmV0dXJuIGMtPnVuaWZvcm1fY29udGV4dF8uSXNFbmFibGVkKGNhcCk7CisgICAgfQorICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZFRleHR1cmUpIHsKKyAgICAgICAgcmV0dXJuIGMtPnRleHR1cmVfY29udGV4dF8uSXNFbmFibGVkKGNhcCk7CisgICAgfQorICAgIGlmIChraW5kICYga0hhbmRsaW5nS2luZFByb3BhZ2F0ZSkgeworICAgICAgICByZXR1cm4gUEFTU19USFJPVUdIKGMsIElzRW5hYmxlZCwgY2FwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIGZyYW1lYnVmZmVyLgorQVBJRU5UUllfSU1QTChHTGJvb2xlYW4sIElzRnJhbWVidWZmZXIsIEdMdWludCBmcmFtZWJ1ZmZlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIEZyYW1lYnVmZmVyRGF0YVB0ciBmYiA9IHNnLT5HZXRGcmFtZWJ1ZmZlckRhdGEoZnJhbWVidWZmZXIpOworICAgIHJldHVybiBmYiAhPSBOVUxMID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCitBUElFTlRSWV9JTVBMKEdMYm9vbGVhbiwgSXNGcmFtZWJ1ZmZlck9FUywgR0x1aW50IGZyYW1lYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICByZXR1cm4gVFJDQUxMKGdsSXNGcmFtZWJ1ZmZlcihmcmFtZWJ1ZmZlcikpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBwcm9ncmFtLgorQVBJRU5UUllfSU1QTChHTGJvb2xlYW4sIElzUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwdHIgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgcmV0dXJuIHB0ciAhPSBOVUxMID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSByZW5kZXJidWZmZXIuCitBUElFTlRSWV9JTVBMKEdMYm9vbGVhbiwgSXNSZW5kZXJidWZmZXIsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm4gR0xfRkFMU0U7CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBSZW5kZXJidWZmZXJEYXRhUHRyIHJiID0gc2ctPkdldFJlbmRlcmJ1ZmZlckRhdGEocmVuZGVyYnVmZmVyKTsKKyAgICByZXR1cm4gcmIgIT0gTlVMTCA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworQVBJRU5UUllfSU1QTChHTGJvb2xlYW4sIElzUmVuZGVyYnVmZmVyT0VTLCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICByZXR1cm4gVFJDQUxMKGdsSXNSZW5kZXJidWZmZXIocmVuZGVyYnVmZmVyKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIHNoYWRlci4KK0FQSUVOVFJZX0lNUEwoR0xib29sZWFuLCBJc1NoYWRlciwgR0x1aW50IHNoYWRlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICB9CisKKyAgICBTaGFyZUdyb3VwUHRyIHNnID0gYy0+R2V0U2hhcmVHcm91cCgpOworICAgIFNoYWRlckRhdGFQdHIgcHRyID0gc2ctPkdldFNoYWRlckRhdGEoc2hhZGVyKTsKKyAgICByZXR1cm4gcHRyICE9IE5VTEwgPyBHTF9UUlVFIDogR0xfRkFMU0U7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIHRleHR1cmUuCitBUElFTlRSWV9JTVBMKEdMYm9vbGVhbiwgSXNUZXh0dXJlLCBHTHVpbnQgdGV4dHVyZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAodGV4dHVyZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBHTF9GQUxTRTsKKyAgICB9CisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBUZXh0dXJlRGF0YVB0ciB0ZXggPSBzZy0+R2V0VGV4dHVyZURhdGEodGV4dHVyZSk7CisgICAgcmV0dXJuIHRleCAhPSBOVUxMID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCisvLyBDb25maWd1cmUgZml4ZWQgZnVuY3Rpb24gbGlnaHRpbmcgc3RhdGUuCituYW1lc3BhY2UgeworICAgIHZvaWQgSGFuZGxlTGlnaHRNb2RlbChHTGVudW0gbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zLAorICAgICAgICAgICAgUGFyYW1UeXBlIHBhcmFtX3R5cGUpIHsKKyAgICAgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgICAgIGlmICghYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuYW1lKSB7CisgICAgICAgICAgICBjYXNlIEdMX0xJR0hUX01PREVMX1RXT19TSURFOgorICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbMF0gPT0gMC4wZikgeworICAgICAgICAgICAgICAgICAgICBjLT5lbmFibGVkX3NldF8uZXJhc2UobmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYy0+ZW5hYmxlZF9zZXRfLmluc2VydChuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX0xJR0hUX01PREVMX0FNQklFTlQ6CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtX3R5cGUgIT0ga1BhcmFtVHlwZUFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfTElHSFRfTU9ERUxfQU1CSUVOVC4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVtdWdsOjpWZWN0b3I6OmtFbnRyaWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVBbWJpZW50KCkuU2V0KGksIHBhcmFtc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9ICAvLyBuYW1lc3BhY2UKKworQVBJRU5UUllfSU1QTCh2b2lkLCBMaWdodE1vZGVsZiwgR0xlbnVtIG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZUxpZ2h0TW9kZWwobmFtZSwgJnBhcmFtLCBrUGFyYW1UeXBlU2NhbGFyKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBMaWdodE1vZGVsZnYsIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZUxpZ2h0TW9kZWwobmFtZSwgcGFyYW1zLCBrUGFyYW1UeXBlQXJyYXkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIExpZ2h0TW9kZWx4LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbExpZ2h0TW9kZWxmKHBuYW1lLCBYMkYocGFyYW0pKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlnaHRNb2RlbHhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTGlnaHRNb2RlbGYocG5hbWUsIFgyRihwYXJhbSkpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBMaWdodE1vZGVseHYsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBHTGZsb2F0IHRtcFtrTWF4UGFyYW1FbGVtZW50U2l6ZV07CisgICAgQ29udmVydCh0bXAsIFBhcmFtU2l6ZShwbmFtZSksIHBhcmFtcyk7CisgICAgVFJDQUxMKGdsTGlnaHRNb2RlbGZ2KHBuYW1lLCB0bXApKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBMaWdodE1vZGVseHZPRVMsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xMaWdodE1vZGVseHYocG5hbWUsIHBhcmFtcykpOworfQorCisvLyBDb25maWd1cmUgZml4ZWQgZnVuY3Rpb24gbGlnaHRpbmcgc3RhdGUuCituYW1lc3BhY2UgeworICAgIHZvaWQgSGFuZGxlTGlnaHQoR0xlbnVtIGxpZ2h0aWQsIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICBQYXJhbVR5cGUgcGFyYW1fdHlwZSkgeworICAgICAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMaWdodCogbGlnaHQgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUxpZ2h0KGxpZ2h0aWQpOworICAgICAgICBpZiAoIWxpZ2h0KSB7CisgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShsaWdodGlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IGVtdWdsOjpNYXRyaXgmIG12ID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5HZXRNb2RlbFZpZXdNYXRyaXgoKTsKKyAgICAgICAgY29uc3QgR0xmbG9hdCB2YWx1ZSA9IHBhcmFtc1swXTsKKyAgICAgICAgZW11Z2w6OlZlY3RvciB2ZWN0b3IocGFyYW1zWzBdLCBwYXJhbXNbMV0sIHBhcmFtc1syXSwgcGFyYW1zWzNdKTsKKworICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwLmYgfHwgdmFsdWUgPiAxMjguZikgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpZ2h0LT5zcG90X2V4cG9uZW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgorICAgICAgICAgICAgICAgIGlmICgodmFsdWUgPCAwLmYgfHwgdmFsdWUgPiA5MC5mKSAmJiB2YWx1ZSAhPSAxODAuZikgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpZ2h0LT5zcG90X2N1dG9mZiA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTjoKKyAgICAgICAgICAgICAgICBsaWdodC0+Y29uc3RfYXR0ZW51YXRpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgICAgIGxpZ2h0LT5saW5lYXJfYXR0ZW51YXRpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OOgorICAgICAgICAgICAgICAgIGxpZ2h0LT5xdWFkcmF0aWNfYXR0ZW51YXRpb24gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfQU1CSUVOVC4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaWdodC0+YW1iaWVudCA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfRElGRlVTRToKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfRElGRlVTRS4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaWdodC0+ZGlmZnVzZSA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfU1BFQ1VMQVI6CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtX3R5cGUgIT0ga1BhcmFtVHlwZUFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiRXhwZWN0ZWQgYXJyYXkgZm9yIEdMX1NQRUNVTEFSLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpZ2h0LT5zcGVjdWxhciA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfUE9TSVRJT046CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtX3R5cGUgIT0ga1BhcmFtVHlwZUFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiRXhwZWN0ZWQgYXJyYXkgZm9yIEdMX1BPU0lUSU9OLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpZ2h0LT5wb3NpdGlvbi5Bc3NpZ25NYXRyaXhNdWx0aXBseShtdiwgdmVjdG9yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfU1BPVF9ESVJFQ1RJT046CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtX3R5cGUgIT0ga1BhcmFtVHlwZUFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiRXhwZWN0ZWQgYXJyYXkgZm9yIEdMX1NQT1RfRElSRUNUSU9OLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZlY3Rvci5TZXQoMywgMC4wZik7ICAvLyBObyB3LWNvbXBvbmVudCBmb3Igc3BvdCBsaWdodCBkaXJlY3Rpb24uCisgICAgICAgICAgICAgICAgbGlnaHQtPmRpcmVjdGlvbi5Bc3NpZ25NYXRyaXhNdWx0aXBseShtdiwgdmVjdG9yKTsKKyAgICAgICAgICAgICAgICBsaWdodC0+ZGlyZWN0aW9uLlNldCgzLCAwLjBmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0obmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfSAgLy8gbmFtZXNwYWNlCisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlnaHRmLCBHTGVudW0gbGlnaHRpZCwgR0xlbnVtIG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZUxpZ2h0KGxpZ2h0aWQsIG5hbWUsICZwYXJhbSwga1BhcmFtVHlwZVNjYWxhcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlnaHRmdiwgR0xlbnVtIGxpZ2h0aWQsIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZUxpZ2h0KGxpZ2h0aWQsIG5hbWUsIHBhcmFtcywga1BhcmFtVHlwZUFycmF5KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBMaWdodHgsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xMaWdodGYobGlnaHQsIHBuYW1lLCBYMkYocGFyYW0pKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlnaHR4T0VTLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTGlnaHRmKGxpZ2h0LCBwbmFtZSwgWDJGKHBhcmFtKSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIExpZ2h0eHYsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBDb252ZXJ0KHRtcCwgUGFyYW1TaXplKHBuYW1lKSwgcGFyYW1zKTsKKyAgICBUUkNBTEwoZ2xMaWdodGZ2KGxpZ2h0LCBwbmFtZSwgdG1wKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlnaHR4dk9FUywgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTGlnaHR4dihsaWdodCwgcG5hbWUsIHBhcmFtcykpOworfQorCisvLyBTZXRzIHRoZSB3aWR0aCBvZiBhIGxpbmUKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGluZVdpZHRoLCBHTGZsb2F0IHdpZHRoKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh3aWR0aCA8IDAuZikgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQod2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHdpZHRoID0gQ2xhbXBWYWx1ZSh3aWR0aCwgYy0+YWxpYXNlZF9saW5lX3dpZHRoX3JhbmdlXy5HZXQoKVswXSwKKyAgICAgICAgICAgIGMtPmFsaWFzZWRfbGluZV93aWR0aF9yYW5nZV8uR2V0KClbMV0pOworICAgIGMtPmxpbmVfd2lkdGhfLk11dGF0ZSgpID0gd2lkdGg7CisgICAgUEFTU19USFJPVUdIKGMsIExpbmVXaWR0aCwgd2lkdGgpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIExpbmVXaWR0aHgsIEdMZml4ZWQgd2lkdGgpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbExpbmVXaWR0aChYMkYod2lkdGgpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTGluZVdpZHRoeE9FUywgR0xmaXhlZCB3aWR0aCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTGluZVdpZHRoKFgyRih3aWR0aCkpKTsKK30KKworLy8gTGlua3MgdGhlIGN1cnJlbnQgcHJvZ3JhbSBnaXZlbiB0aGUgc2hhZGVycyB0aGF0IGhhdmUgYmVlbiBhdHRhY2hlZCB0byBpdC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgTGlua1Byb2dyYW0sIEdMdWludCBwcm9ncmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNoYXJlR3JvdXBQdHIgc2cgPSBjLT5HZXRTaGFyZUdyb3VwKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gc2ctPkdldFByb2dyYW1EYXRhKHByb2dyYW0pOworICAgIGlmIChwcm9ncmFtX2RhdGEgPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiSW52YWxpZCBwcm9ncmFtICVkIiwgcHJvZ3JhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcm9ncmFtX2RhdGEtPkxpbmsoKTsKK30KKworLy8gTG9hZHMgdGhlIGlkZW50aXR5IG1hdHJpeCBpbnRvIHRoZSB0b3Agb2YgdGhlYWN0aXZlIG1hdHJpeCBzdGFjay4KK0FQSUVOVFJZX0lNUEwodm9pZCwgTG9hZElkZW50aXR5KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlQWN0aXZlTWF0cml4KCkuQXNzaWduSWRlbnRpdHkoKTsKK30KKworLy8gTG9hZHMgYSBtYXRyaXggaW50byB0aGUgdG9wIG9mIHRoZSBhY3RpdmUgbWF0cml4IHN0YWNrLgorQVBJRU5UUllfSU1QTCh2b2lkLCBMb2FkTWF0cml4ZiwgY29uc3QgR0xmbG9hdCogbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUFjdGl2ZU1hdHJpeCgpLlNldENvbHVtbk1ham9yQXJyYXkobSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTG9hZE1hdHJpeHgsIGNvbnN0IEdMZml4ZWQqIG0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBDb252ZXJ0KHRtcCwgMTYsIG0pOworICAgIFRSQ0FMTChnbExvYWRNYXRyaXhmKHRtcCkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIExvYWRNYXRyaXh4T0VTLCBjb25zdCBHTGZpeGVkKiBtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xMb2FkTWF0cml4eChtKSk7Cit9CisKKy8vIENvcHkgdGhlIGN1cnJlbnQgbW9kZWwgdmlldyBtYXRyaXggdG8gYSBtYXRyaXggaW4gdGhlIG1hdHJpeCBwYWxldHRlLAorLy8gc3BlY2lmaWVkIGJ5IGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMuCitBUElFTlRSWV9JTVBMKHZvaWQsIExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBlbXVnbDo6TWF0cml4JiBtdl9tYXRyaXggPSBjLT51bmlmb3JtX2NvbnRleHRfLkdldE1vZGVsVmlld01hdHJpeCgpOworICAgIGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlUGFsZXR0ZU1hdHJpeCgpID0gbXZfbWF0cml4OworfQorCisvLyBDb25maWd1cmUgZml4ZWQgZnVuY3Rpb24gbWF0ZXJpYWwgc3RhdGUuCituYW1lc3BhY2UgeworICAgIHZvaWQgSGFuZGxlTWF0ZXJpYWwoR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMsCisgICAgICAgICAgICBQYXJhbVR5cGUgcGFyYW1fdHlwZSkgeworICAgICAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFjZSAhPSBHTF9GUk9OVF9BTkRfQkFDSykgeworICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0oZmFjZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBNYXRlcmlhbCYgbWF0ZXJpYWwgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZU1hdGVyaWFsKCk7CisKKyAgICAgICAgY29uc3QgR0xmbG9hdCB2YWx1ZSA9IHBhcmFtc1swXTsKKyAgICAgICAgY29uc3QgZW11Z2w6OlZlY3RvciB2ZWN0b3IocGFyYW1zWzBdLCBwYXJhbXNbMV0sIHBhcmFtc1syXSwgcGFyYW1zWzNdKTsKKworICAgICAgICBzd2l0Y2ggKG5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgR0xfU0hJTklORVNTOgorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAuZiB8fCB2YWx1ZSA+IDEyOC5mKSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9GTE9BVCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc2hpbmluZXNzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX0FNQklFTlQ6CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtX3R5cGUgIT0ga1BhcmFtVHlwZUFycmF5KSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiRXhwZWN0ZWQgYXJyYXkgZm9yIEdMX0FNQklFTlQuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuYW1iaWVudCA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfRElGRlVTRToKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfRElGRlVTRS4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXRlcmlhbC5kaWZmdXNlID0gdmVjdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfU1BFQ1VMQVIuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuc3BlY3VsYXIgPSB2ZWN0b3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEdMX0VNSVNTSU9OOgorICAgICAgICAgICAgICAgIGlmIChwYXJhbV90eXBlICE9IGtQYXJhbVR5cGVBcnJheSkgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfRU5VTSwgIkV4cGVjdGVkIGFycmF5IGZvciBHTF9FTUlTU0lPTi4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYXRlcmlhbC5lbWlzc2lvbiA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgR0xfQU1CSUVOVF9BTkRfRElGRlVTRToKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGFycmF5IGZvciBHTF9BTUJJRU5UX0FORF9ESUZGVVNFLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hdGVyaWFsLmFtYmllbnQgPSB2ZWN0b3I7CisgICAgICAgICAgICAgICAgbWF0ZXJpYWwuZGlmZnVzZSA9IHZlY3RvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0obmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfSAgLy8gbmFtZXNwYWNlCisKK0FQSUVOVFJZX0lNUEwoR0x2b2lkKiwgTWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTGVudW0gYWNjZXNzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIFBBU1NfVEhST1VHSChjLCBNYXBUZXhTdWJJbWFnZTJEQ0hST01JVU0sIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsCisgICAgICAgICAgICB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGFjY2Vzcyk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTWF0ZXJpYWxmLCBHTGVudW0gZmFjZSwgR0xlbnVtIG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZU1hdGVyaWFsKGZhY2UsIG5hbWUsICZwYXJhbSwga1BhcmFtVHlwZVNjYWxhcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTWF0ZXJpYWxmdiwgR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZU1hdGVyaWFsKGZhY2UsIG5hbWUsIHBhcmFtcywga1BhcmFtVHlwZUFycmF5KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBNYXRlcmlhbHgsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbE1hdGVyaWFsZihmYWNlLCBwbmFtZSwgWDJGKHBhcmFtKSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIE1hdGVyaWFseE9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTWF0ZXJpYWx4KGZhY2UsIHBuYW1lLCBwYXJhbSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIE1hdGVyaWFseHYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgR0xmbG9hdCB0bXBba01heFBhcmFtRWxlbWVudFNpemVdOworICAgIENvbnZlcnQodG1wLCBQYXJhbVNpemUocG5hbWUpLCBwYXJhbXMpOworICAgIFRSQ0FMTChnbE1hdGVyaWFsZnYoZmFjZSwgcG5hbWUsIHRtcCkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIE1hdGVyaWFseHZPRVMsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTWF0ZXJpYWx4dihmYWNlLCBwbmFtZSwgcGFyYW1zKSk7Cit9CisKKy8vIFNlbGVjdHMgdGhlIGFjdGl2ZSBtYXRyaXggc3RhdGNrLgorQVBJRU5UUllfSU1QTCh2b2lkLCBNYXRyaXhNb2RlLCBHTGVudW0gbW9kZSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIHN1Y2Nlc3MgPSBjLT51bmlmb3JtX2NvbnRleHRfLlNldE1hdHJpeE1vZGUobW9kZSk7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKG1vZGUpOworICAgIH0KK30KKworLy8gU2V0IG1hdHJpeCBpbmRpY2VzIHVzZWQgdG8gYmxlbmQgY29ycmVzcG9uZGluZyBtYXRyaWNlcyBmb3IgYSBnaXZlbiB2ZXJ0ZXguCitBUElFTlRSWV9JTVBMKHZvaWQsIE1hdHJpeEluZGV4UG9pbnRlck9FUywgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZE1hdHJpeEluZGV4UG9pbnRlclNpemUoc2l6ZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRNYXRyaXhJbmRleFBvaW50ZXJUeXBlKHR5cGUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHR5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IEdMYm9vbGVhbiBub3JtYWxpemVkID0gR0xfRkFMU0U7CisgICAgYy0+cG9pbnRlcl9jb250ZXh0Xy5TZXRQb2ludGVyKGtNYXRyaXhJbmRleFZlcnRleEF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwKKyAgICAgICAgICAgIHN0cmlkZSwgcG9pbnRlciwgbm9ybWFsaXplZCk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCisvLyBNdWx0aXBsaWVzIHRoZSBtYXRyaXggb24gdG9wIG9mIHRoZSBhY3RpdmUgbWF0cml4IHN0YWNrIGJ5IHRoZSBnaXZlbiBtYXRyaXguCitBUElFTlRSWV9JTVBMKHZvaWQsIE11bHRNYXRyaXhmLCBjb25zdCBHTGZsb2F0KiBtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlQWN0aXZlTWF0cml4KCkgKj0gZW11Z2w6Ok1hdHJpeChtKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBNdWx0TWF0cml4eCwgY29uc3QgR0xmaXhlZCogbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgR0xmbG9hdCB0bXBba01heFBhcmFtRWxlbWVudFNpemVdOworICAgIENvbnZlcnQodG1wLCAxNiwgbSk7CisgICAgVFJDQUxMKGdsTXVsdE1hdHJpeGYodG1wKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTXVsdE1hdHJpeHhPRVMsIGNvbnN0IEdMZml4ZWQqIG0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbE11bHRNYXRyaXh4KG0pKTsKK30KKworLy8gU2V0cyB1cCB1bnZhcnlpbmcgbm9ybWFsIHZlY3RvciBmb3IgdGhlIGZpeGVkIGZ1bmN0aW9uIHBpcGVsaW5lLgorQVBJRU5UUllfSU1QTCh2b2lkLCBOb3JtYWwzZiwgR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yJiBub3JtYWwgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZU5vcm1hbCgpOworICAgIG5vcm1hbCA9IGVtdWdsOjpWZWN0b3IobngsIG55LCBueiwgMC5mKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBOb3JtYWwzZnYsIGNvbnN0IEdMZmxvYXQqIGNvb3JkcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yJiBub3JtYWwgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZU5vcm1hbCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIG5vcm1hbC5TZXQoaSwgY29vcmRzW2ldKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgTm9ybWFsM3N2LCBjb25zdCBHTHNob3J0KiBjb29yZHMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW11Z2w6OlZlY3RvciYgbm9ybWFsID0gYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVOb3JtYWwoKTsKKyAgICBub3JtYWwuQXNzaWduTGluZWFyTWFwcGluZyhjb29yZHMsIDMpOworICAgIG5vcm1hbC5TZXQoMywgMC5mKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBOb3JtYWwzeCwgR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsTm9ybWFsM2YoWDJGKG54KSwgWDJGKG55KSwgWDJGKG56KSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIE5vcm1hbDN4T0VTLCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xOb3JtYWwzZihYMkYobngpLCBYMkYobnkpLCBYMkYobnopKSk7Cit9CisKKy8vIFNwZWNpZmllcyBzb3VyY2UgYXJyYXkgZm9yIHBlci12ZXJ0ZXggbm9ybWFscy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgTm9ybWFsUG9pbnRlciwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkTm9ybWFsUG9pbnRlclR5cGUodHlwZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cmlkZSA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzdHJpZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IEdMYm9vbGVhbiBub3JtYWxpemVkID0gKHR5cGUgIT0gR0xfRkxPQVQgJiYgdHlwZSAhPSBHTF9GSVhFRCk7CisgICAgYy0+cG9pbnRlcl9jb250ZXh0Xy5TZXRQb2ludGVyKGtOb3JtYWxWZXJ0ZXhBdHRyaWJ1dGUsIDMsIHR5cGUsIHN0cmlkZSwKKyAgICAgICAgICAgIHBvaW50ZXIsIG5vcm1hbGl6ZWQpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIE5vcm1hbFBvaW50ZXJCb3VuZHMsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xOb3JtYWxQb2ludGVyKHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCisvLyBNdWx0aXBsaWVzIHRoZSBjdXJyZW50IG1hdHJpeCB3aXRoIHRoZSBzcGVjaWZpZWQgb3J0aG9nYXBoaWMgbWF0cml4LgorQVBJRU5UUllfSU1QTCh2b2lkLCBPcnRob2YsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpfbmVhciwgR0xmbG9hdCB6X2ZhcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUFjdGl2ZU1hdHJpeCgpICo9CisgICAgICAgIGVtdWdsOjpNYXRyaXg6OkdlbmVyYXRlT3J0aG9ncmFwaGljKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgel9uZWFyLAorICAgICAgICAgICAgICAgIHpfZmFyKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBPcnRob2ZPRVMsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbE9ydGhvZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgT3J0aG94LCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xPcnRob2YoWDJGKGxlZnQpLCBYMkYocmlnaHQpLCBYMkYoYm90dG9tKSwgWDJGKHRvcCksIFgyRih6TmVhciksCisgICAgICAgICAgICBYMkYoekZhcikpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBPcnRob3hPRVMsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbE9ydGhvZihYMkYobGVmdCksIFgyRihyaWdodCksIFgyRihib3R0b20pLCBYMkYodG9wKSwgWDJGKHpOZWFyKSwKKyAgICAgICAgICAgIFgyRih6RmFyKSkpOworfQorCisvLyBDb25maWd1cmVzIHBpeGVsIHN0b3JhZ2UgKHdyaXRlKSBvcGVyYXRpb24sIHdoZW4gdHJhbnNmZXJpbmcgdG8gR0wuCitBUElFTlRSWV9JTVBMKHZvaWQsIFBpeGVsU3RvcmVpLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFBpeGVsU3RvcmVOYW1lKHBuYW1lKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkUGl4ZWxTdG9yZUFsaWdubWVudChwYXJhbSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChwYXJhbSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR0xfUEFDS19BTElHTk1FTlQ6CisgICAgICAgICAgICBjLT5waXhlbF9zdG9yZV9wYWNrX2FsaWdubWVudF8uTXV0YXRlKCkgPSBwYXJhbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX1VOUEFDS19BTElHTk1FTlQ6CisgICAgICAgICAgICBjLT5waXhlbF9zdG9yZV91bnBhY2tfYWxpZ25tZW50Xy5NdXRhdGUoKSA9IHBhcmFtOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFBBU1NfVEhST1VHSChjLCBQaXhlbFN0b3JlaSwgcG5hbWUsIHBhcmFtKTsKK30KKworLy8gQ29uZmlndXJlIHBvaW50IHJlbmRlcmluZy4KK25hbWVzcGFjZSB7CisgICAgdm9pZCBIYW5kbGVQb2ludFBhcmFtZXRlcihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcywKKyAgICAgICAgICAgIFBhcmFtVHlwZSBwYXJhbV90eXBlKSB7CisgICAgICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgICAgICBpZiAoIWMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBvaW50UGFyYW1ldGVycyYgcG9pbnRfcGFyYW1ldGVycyA9CisgICAgICAgICAgICBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZVBvaW50UGFyYW1ldGVycygpOworCisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgR0xfUE9JTlRfU0laRV9NSU46CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXSA8IDAuZikgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQocGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb2ludF9wYXJhbWV0ZXJzLnNpemVfbWluID0gcGFyYW1zWzBdOworICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgY2FzZSBHTF9QT0lOVF9TSVpFX01BWDoKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zWzBdIDwgMC5mKSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9GTE9BVChwYXJhbXNbMF0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvaW50X3BhcmFtZXRlcnMuc2l6ZV9tYXggPSBwYXJhbXNbMF07CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBjYXNlIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkU6CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1swXSA8IDAuZikgeworICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQocGFyYW1zWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MTgpOiBTdXBwb3J0IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUuCisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBQb2ludFBhcmFtZXRlciBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFLiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgY2FzZSBHTF9QT0lOVF9ESVNUQU5DRV9BVFRFTlVBVElPTjoKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSA9PSBrUGFyYW1UeXBlU2NhbGFyKSB7CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBhcnJheSBmb3IgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04uIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9pbnRfcGFyYW1ldGVycy5hdHRlbnVhdGlvblswXSA9IHBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBwb2ludF9wYXJhbWV0ZXJzLmF0dGVudWF0aW9uWzFdID0gcGFyYW1zWzFdOworICAgICAgICAgICAgICAgIHBvaW50X3BhcmFtZXRlcnMuYXR0ZW51YXRpb25bMl0gPSBwYXJhbXNbMl07CisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiVW5rbm93biBwb2ludCBwYXJhbWV0ZXIgJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworfSAgLy8gbmFtZXNwYWNlCisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9pbnRQYXJhbWV0ZXJmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZVBvaW50UGFyYW1ldGVyKHBuYW1lLCAmcGFyYW0sIGtQYXJhbVR5cGVTY2FsYXIpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvaW50UGFyYW1ldGVyZnYsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBIYW5kbGVQb2ludFBhcmFtZXRlcihwbmFtZSwgcGFyYW1zLCBrUGFyYW1UeXBlQXJyYXkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvaW50UGFyYW1ldGVyeCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xQb2ludFBhcmFtZXRlcmYocG5hbWUsIFgyRihwYXJhbSkpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBQb2ludFBhcmFtZXRlcnhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUG9pbnRQYXJhbWV0ZXJmKHBuYW1lLCBYMkYocGFyYW0pKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9pbnRQYXJhbWV0ZXJ4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBDb252ZXJ0KHRtcCwgUGFyYW1TaXplKHBuYW1lKSwgcGFyYW1zKTsKKyAgICBUUkNBTEwoZ2xQb2ludFBhcmFtZXRlcmZ2KHBuYW1lLCB0bXApKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBQb2ludFBhcmFtZXRlcnh2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUG9pbnRQYXJhbWV0ZXJ4dihwbmFtZSwgcGFyYW1zKSk7Cit9CisKKy8vIFNldHMgdGhlIHBvaW50IHNpemUgdGhhdCBpcyB1c2VkIHdoZW4gbm8gdmVydGV4IHBvaW50IHNpemUgYXJyYXkgaXMgZW5hYmxlZC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9pbnRTaXplLCBHTGZsb2F0IHNpemUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNpemUgPD0gMC5mKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9GTE9BVChzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZVBvaW50UGFyYW1ldGVycygpLmN1cnJlbnRfc2l6ZSA9IHNpemU7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9pbnRTaXpleCwgR0xmaXhlZCBzaXplKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xQb2ludFNpemUoWDJGKHNpemUpKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9pbnRTaXpleE9FUywgR0xmaXhlZCBzaXplKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xQb2ludFNpemUoWDJGKHNpemUpKSk7Cit9CisKKy8vIFNwZWNpZmllcyBzb3VyY2UgYXJyYXkgZm9yIHBlci12ZXJ0ZXggcG9pbnQgc2l6ZXMuCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvaW50U2l6ZVBvaW50ZXJPRVMsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFBvaW50UG9pbnRlclR5cGUodHlwZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cmlkZSA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzdHJpZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYodHlwZSAhPSBHTF9GTE9BVCwgIlVudGVzdGVkIik7CisgICAgYy0+cG9pbnRlcl9jb250ZXh0Xy5TZXRQb2ludGVyKGtQb2ludFNpemVWZXJ0ZXhBdHRyaWJ1dGUsIDEsIHR5cGUsIHN0cmlkZSwKKyAgICAgICAgICAgIHBvaW50ZXIpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvaW50U2l6ZVBvaW50ZXIsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xQb2ludFNpemVQb2ludGVyT0VTKHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvaW50U2l6ZVBvaW50ZXJPRVNCb3VuZHMsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xQb2ludFNpemVQb2ludGVyT0VTKHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCisvLyBDb25maWd1cmVzIGEgZGVwdGggb2Zmc2V0IGFwcGxpZWQgdG8gYWxsIGZyYWdtZW50cyAoZWcuIGZvciAiZml4aW5nIgorLy8gcHJvYmxlbXMgd2l0aCByZW5kZXJpbmcgZGVjYWxzL292ZXJsYXlzIG9uIHRvcCBvZiBmYWNlcykuCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvbHlnb25PZmZzZXQsIEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPnBvbHlnb25fb2Zmc2V0X2ZhY3Rvcl8uTXV0YXRlKCkgPSBmYWN0b3I7CisgICAgYy0+cG9seWdvbl9vZmZzZXRfdW5pdHNfLk11dGF0ZSgpID0gdW5pdHM7CisgICAgUEFTU19USFJPVUdIKGMsIFBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvbHlnb25PZmZzZXR4LCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUG9seWdvbk9mZnNldChYMkYoZmFjdG9yKSwgWDJGKHVuaXRzKSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFBvbHlnb25PZmZzZXR4T0VTLCBHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUG9seWdvbk9mZnNldChYMkYoZmFjdG9yKSwgWDJGKHVuaXRzKSkpOworfQorCisvLyBQb3BzIG1hdHJpeCBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgUG9wTWF0cml4KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgc3VjY2VzcyA9IGMtPnVuaWZvcm1fY29udGV4dF8uQWN0aXZlTWF0cml4UG9wKCk7CisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfU1RBQ0tfVU5ERVJGTE9XLCAiUG9wTWF0cml4IGNhbGxlZCB3aGVuIHN0YWNrIGlzIGVtcHR5LiIpOworICAgIH0KK30KKworLy8gUHVzaGVzIG1hdHJpeCBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgUHVzaE1hdHJpeCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIHN1Y2Nlc3MgPSBjLT51bmlmb3JtX2NvbnRleHRfLkFjdGl2ZU1hdHJpeFB1c2goKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9TVEFDS19PVkVSRkxPVywgIlB1c2hNYXRyaXggY2FsbGVkIHdoZW4gc3RhY2sgaXMgZnVsbC4iKTsKKyAgICB9Cit9CisKKy8vIFJlYWRzIHBpeGVscyBmcm9tIHRoZSBmcmFtZSBidWZmZXIuCitBUElFTlRSWV9JTVBMKHZvaWQsIFJlYWRQaXhlbHMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFJlYWRQaXhlbHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBSZWxlYXNlU2hhZGVyQ29tcGlsZXIpIHsKKyAgICBBUElUUkFDRSgpOworICAgIC8vIFNpbmNlIHRoaXMgaXMgb25seSBhIGhpbnQgdGhhdCBzaGFkZXIgY29tcGlsYXRpb25zIGFyZSB1bmxpa2VseSB0byBvY2N1ciwKKyAgICAvLyB3ZSBjYW4gaWdub3JlIGl0LgorfQorCisvLyBDb25maWd1cmVzIGEgcmVuZGVyYnVmZmVyLgorQVBJRU5UUllfSU1QTCh2b2lkLCBSZW5kZXJidWZmZXJTdG9yYWdlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFJlbmRlcmJ1ZmZlclRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkUmVuZGVyYnVmZmVyRm9ybWF0KGludGVybmFsZm9ybWF0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShpbnRlcm5hbGZvcm1hdCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHdpZHRoIDwgMCB8fCB3aWR0aCA+IGMtPm1heF9yZW5kZXJidWZmZXJfc2l6ZV8uR2V0KCkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVCh3aWR0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGhlaWdodCA8IDAgfHwgaGVpZ2h0ID4gYy0+bWF4X3JlbmRlcmJ1ZmZlcl9zaXplXy5HZXQoKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZW5kZXJidWZmZXJEYXRhUHRyIG9iaiA9IGMtPkdldEJvdW5kUmVuZGVyYnVmZmVyRGF0YSgpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiTm8gcmVuZGVyYnVmZmVyIGJvdW5kLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb2JqLT5TZXREYXRhU3RvcmUodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgUEFTU19USFJPVUdIKGMsIFJlbmRlcmJ1ZmZlclN0b3JhZ2UsIHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCkpOworfQorCisvLyBBcHBsaWVzIGEgcm90YXRpb24gdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtYXRyaXggc3RhY2suCitBUElFTlRSWV9JTVBMKHZvaWQsIFJvdGF0ZWYsIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW11Z2w6OlZlY3RvciB2KHgsIHksIHosIDApOworICAgIGMtPnVuaWZvcm1fY29udGV4dF8uTXV0YXRlQWN0aXZlTWF0cml4KCkgKj0KKyAgICAgICAgZW11Z2w6Ok1hdHJpeDo6R2VuZXJhdGVSb3RhdGlvbkJ5RGVncmVlcyhhbmdsZSwgdik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUm90YXRleCwgR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUm90YXRlZihYMkYoYW5nbGUpLCBYMkYoeCksIFgyRih5KSwgWDJGKHopKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgUm90YXRleE9FUywgR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsUm90YXRlZihYMkYoYW5nbGUpLCBYMkYoeCksIFgyRih5KSwgWDJGKHopKSk7Cit9CisKKy8vIENoYW5nZXMgdGhlIHdheSBmcmFnbWVudCBjb3ZlcmFnZSBpcyBjb21wdXRlZC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU2FtcGxlQ292ZXJhZ2UsIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZhbHVlID0gQ2xhbXBWYWx1ZSh2YWx1ZSwgMC5mLCAxLmYpOworICAgIGMtPnNhbXBsZV9jb3ZlcmFnZV92YWx1ZV8uTXV0YXRlKCkgPSB2YWx1ZTsKKyAgICBjLT5zYW1wbGVfY292ZXJhZ2VfaW52ZXJ0Xy5NdXRhdGUoKSA9IGludmVydCAhPSBHTF9GQUxTRSA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKKyAgICBQQVNTX1RIUk9VR0goYywgU2FtcGxlQ292ZXJhZ2UsIHZhbHVlLCBpbnZlcnQpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFNhbXBsZUNvdmVyYWdleCwgR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFNhbXBsZUNvdmVyYWdlKFgyRih2YWx1ZSksIGludmVydCkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFNhbXBsZUNvdmVyYWdleE9FUywgR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFNhbXBsZUNvdmVyYWdlKFgyRih2YWx1ZSksIGludmVydCkpOworfQorCisvLyBBcHBsaWVzIGEgc2NhbGUgdG8gdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtYXRyaXggc3RhY2suCitBUElFTlRSWV9JTVBMKHZvaWQsIFNjYWxlZiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yIHYoeCwgeSwgeiwgMSk7CisgICAgYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVBY3RpdmVNYXRyaXgoKSAqPSBlbXVnbDo6TWF0cml4OjpHZW5lcmF0ZVNjYWxlKHYpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFNjYWxleCwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsU2NhbGVmKFgyRih4KSwgWDJGKHkpLCBYMkYoeikpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBTY2FsZXhPRVMsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFNjYWxlZihYMkYoeCksIFgyRih5KSwgWDJGKHopKSk7Cit9CisKKy8vIENvbmZpZ3VyZXMgZnJhZ21lbnQgcmVqZWN0aW9uIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IGl0IGlzIGluc2lkZSBhCisvLyBzY3JlZW4tc3BhY2UgcmVjdGFuZ2xlLgorQVBJRU5UUllfSU1QTCh2b2lkLCBTY2lzc29yLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQQVNTX1RIUk9VR0goYywgU2Npc3NvciwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Cit9CisKKy8vIENvbmZpZ3VyZXMgdGhlIHNoYWRpbmcgbW9kZWwgdG8gdXNlIChob3cgdG8gaW50ZXJwb2xhdGUgY29sb3JzIGFjcm9zcworLy8gdHJpYW5nbGVzKS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU2hhZGVNb2RlbCwgR0xlbnVtIG1vZGUpIHsKKyAgICBBUElUUkFDRSgpOworICAgIC8vIFRoZXJlIGlzIG5vIGVmZmljaWVudCB3YXkgdG8gZW11bGF0ZSBHTF9GTEFUIG1vZGUgd2l0aCBmcmFnbWVudAorICAgIC8vIHNoYWRlcnMgc2luY2UgdGhleSBhdXRvbWF0aWNhbGx5IGludGVycG9sYXRlIGNvbG9yIHZhbHVlcy4KKyAgICAvLyBBTE9HV19JRihtb2RlICE9IEdMX1NNT09USCwgIk9ubHkgR0xfU01PT1RIIHNoYWRpbmcgbW9kZWwgc3VwcG9ydGVkIik7CisgICAgLy8gV2UndmUgdHVybmVkIHRoaXMgb2ZmIGZvciBub3cgYXMgaXQgcmVzdWx0cyBpbiBzcGFtIHdoZW5ldmVyCisgICAgLy8gd2UgdHJ5IEFQSSBkZW1vcyBvciBhcHBzIHdpdGggZmxhZyBzaGFkaW5nLgorfQorCisvLyBMb2FkcyB0aGUgc291cmNlIGNvZGUgZm9yIGEgc2hhZGVyIGludG8gYSBzaGFkZXIgb2JqZWN0LgorQVBJRU5UUllfSU1QTCh2b2lkLCBTaGFkZXJTb3VyY2UsIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciogY29uc3QqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoY291bnQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBTaGFkZXJEYXRhUHRyIHNoYWRlcl9kYXRhID0gc2ctPkdldFNoYWRlckRhdGEoc2hhZGVyKTsKKyAgICBpZiAoc2hhZGVyX2RhdGEgPT0gTlVMTCkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiTm90IGEgdmFsaWQgc2hhZGVyICVkIiwgc2hhZGVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNoYWRlcl9kYXRhLT5TZXRTb3VyY2UoY291bnQsIHN0cmluZywgbGVuZ3RoKTsKK30KKworLy8gU2V0IGZyb250IGFuZCBiYWNrIGZ1bmN0aW9uIGFuZCByZWZlcmVuY2UgdmFsdWUgZm9yIHN0ZW5jaWwgdGVzdGluZy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU3RlbmNpbEZ1bmMsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFN0ZW5jaWxGdW5jKGZ1bmMpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGZ1bmMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYy0+c3RlbmNpbF9mdW5jXy5NdXRhdGUoKSA9IGZ1bmM7CisgICAgYy0+c3RlbmNpbF9yZWZfLk11dGF0ZSgpID0gcmVmOworICAgIGMtPnN0ZW5jaWxfdmFsdWVfbWFza18uTXV0YXRlKCkgPSBtYXNrOworICAgIFBBU1NfVEhST1VHSChjLCBTdGVuY2lsRnVuYywgZnVuYywgcmVmLCBtYXNrKTsKK30KKworLy8gU2V0IGZyb250IGFuZC9vciBiYWNrIGZ1bmN0aW9uIGFuZCByZWZlcmVuY2UgdmFsdWUgZm9yIHN0ZW5jaWwgdGVzdGluZy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU3RlbmNpbEZ1bmNTZXBhcmF0ZSwgR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBTdGVuY2lsRnVuY1NlcGFyYXRlLCBmYWNlLCBmdW5jLCByZWYsIG1hc2spOworfQorCisvLyBDb250cm9sIHRoZSBmcm9udCBhbmQgYmFjayB3cml0aW5nIG9mIGluZGl2aWR1YWwgYml0cyBpbiB0aGUgc3RlbmNpbAorLy8gcGxhbmVzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBTdGVuY2lsTWFzaywgR0x1aW50IG1hc2spIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFN0ZW5jaWxNYXNrLCBtYXNrKTsKK30KKworLy8gQ29udHJvbCB0aGUgZnJvbnQgYW5kL29yIGJhY2sgd3JpdGluZyBvZiBpbmRpdmlkdWFsIGJpdHMgaW4gdGhlIHN0ZW5jaWwKKy8vIHBsYW5lcy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU3RlbmNpbE1hc2tTZXBhcmF0ZSwgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBTdGVuY2lsTWFza1NlcGFyYXRlLCBmYWNlLCBtYXNrKTsKK30KKworLy8gU2V0IGZyb250IGFuZCBiYWNrIHN0ZW5jaWwgdGVzdCBhY3Rpb25zLgorQVBJRU5UUllfSU1QTCh2b2lkLCBTdGVuY2lsT3AsIEdMZW51bSBzZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFN0ZW5jaWxPcCwgc2ZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKKy8vIFNldCBmcm9udCBhbmQvb3IgYmFjayBzdGVuY2lsIHRlc3QgYWN0aW9ucy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgU3RlbmNpbE9wU2VwYXJhdGUsIEdMZW51bSBmYWNlLCBHTGVudW0gc2ZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBTdGVuY2lsT3BTZXBhcmF0ZSwgZmFjZSwgc2ZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKKy8vIFNwZWNpZmllcyBzb3VyY2UgYXJyYXkgZm9yIHBlci12ZXJ0ZXggdGV4dHVyZSBjb29yZGluYXRlcy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4Q29vcmRQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzVmFsaWRUZXhDb29yZFBvaW50ZXJUeXBlKHR5cGUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHR5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZFRleENvb3JkUG9pbnRlclNpemUoc2l6ZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3RyaWRlIDwgMCkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKHN0cmlkZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgR0x1aW50IGluZGV4ID0gYy0+dGV4dHVyZV9jb250ZXh0Xy5HZXRDbGllbnRBY3RpdmVUZXh0dXJlQ29vcmRBdHRyaWIoKTsKKyAgICBjLT5wb2ludGVyX2NvbnRleHRfLlNldFBvaW50ZXIoaW5kZXgsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4Q29vcmRQb2ludGVyQm91bmRzLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsVGV4Q29vcmRQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcikpOworfQorCisvLyBTZXRzIHVwIGEgdGV4dHVyZSBlbnZpcm9ubWVudCBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZSB1bml0IGZvciB0aGUgZml4ZWQKKy8vIGZ1bmN0aW9uIHBpcGVsaW5lLgorbmFtZXNwYWNlIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBIYW5kbGVUZXhFbnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBUKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgUGFyYW1UeXBlIHBhcmFtX3R5cGUpIHsKKyAgICAgICAgICAgIEFQSVRSQUNFKCk7CisgICAgICAgICAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICAgICAgICAgIGlmICghYykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGV4RW52JiB0ZXhlbnYgPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUFjdGl2ZVRleEVudigpOworICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFX0VOVikgeworICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBHTGVudW0gcGFyYW0gPSBzdGF0aWNfY2FzdDxHTGVudW0+KHBhcmFtc1swXSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB2YWx1ZSA9IHN0YXRpY19jYXN0PGZsb2F0PihwYXJhbXNbMF0pOworICAgICAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICAgICAgICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkVGV4RW52TW9kZShwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXhlbnYubW9kZSA9IHBhcmFtOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1NSQzBfUkdCOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDMV9SR0I6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkMyX1JHQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkVGV4RW52U291cmNlKHBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5zcmNfcmdiW3BuYW1lIC0gR0xfU1JDMF9SR0JdID0gcGFyYW07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfU1JDMF9BTFBIQToKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1NSQzFfQUxQSEE6CisgICAgICAgICAgICAgICAgY2FzZSBHTF9TUkMyX0FMUEhBOgorICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVmFsaWRUZXhFbnZTb3VyY2UocGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGV4ZW52LnNyY19hbHBoYVtwbmFtZSAtIEdMX1NSQzBfQUxQSEFdID0gcGFyYW07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfT1BFUkFORDBfUkdCOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfT1BFUkFORDFfUkdCOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfT1BFUkFORDJfUkdCOgorICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVmFsaWRUZXhFbnZPcGVyYW5kUmdiKHBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5vcGVyYW5kX3JnYltwbmFtZSAtIEdMX09QRVJBTkQwX1JHQl0gPSBwYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9PUEVSQU5EMF9BTFBIQToKKyAgICAgICAgICAgICAgICBjYXNlIEdMX09QRVJBTkQxX0FMUEhBOgorICAgICAgICAgICAgICAgIGNhc2UgR0xfT1BFUkFORDJfQUxQSEE6CisgICAgICAgICAgICAgICAgICAgIGlmICghSXNWYWxpZFRleEVudk9wZXJhbmRBbHBoYShwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXhlbnYub3BlcmFuZF9hbHBoYVtwbmFtZSAtIEdMX09QRVJBTkQwX0FMUEhBXSA9IHBhcmFtOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0NPTUJJTkVfUkdCOgorICAgICAgICAgICAgICAgICAgICBpZiAoIUlzVmFsaWRUZXhFbnZDb21iaW5lUmdiKHBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5jb21iaW5lX3JnYiA9IHBhcmFtOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX0NPTUJJTkVfQUxQSEE6CisgICAgICAgICAgICAgICAgICAgIGlmICghSXNWYWxpZFRleEVudkNvbWJpbmVBbHBoYShwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXhlbnYuY29tYmluZV9hbHBoYSA9IHBhcmFtOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1JHQl9TQ0FMRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkVGV4RW52U2NhbGUodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5yZ2Jfc2NhbGUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHTF9BTFBIQV9TQ0FMRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkVGV4RW52U2NhbGUodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfRkxPQVQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5hbHBoYV9zY2FsZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOgorICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1fdHlwZSAhPSBrUGFyYW1UeXBlQXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYXJyYXkgZm9yIEdMX1RFWFRVUkVfRU5WX0NPTE9SLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5jb2xvci5Bc3NpZ25MaW5lYXJNYXBwaW5nKHBhcmFtcywgNCk7CisgICAgICAgICAgICAgICAgICAgIHRleGVudi5jb2xvci5DbGFtcCgwLmYsIDEuZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0xfQ09PUkRfUkVQTEFDRV9PRVM6CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkdMX0NPT1JEX1JFUExBQ0VfT0VTIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30gIC8vIG5hbWVzcGFjZQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEVudmYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgSGFuZGxlVGV4RW52KHRhcmdldCwgcG5hbWUsICZwYXJhbSwga1BhcmFtVHlwZVNjYWxhcik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4RW52ZnYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBIYW5kbGVUZXhFbnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zLCBrUGFyYW1UeXBlQXJyYXkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEVudmksIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZVRleEVudih0YXJnZXQsIHBuYW1lLCAmcGFyYW0sIGtQYXJhbVR5cGVTY2FsYXIpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEVudml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEhhbmRsZVRleEVudih0YXJnZXQsIHBuYW1lLCBwYXJhbXMsIGtQYXJhbVR5cGVBcnJheSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4RW52eCwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhFbnZmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PEdMZmxvYXQ+KHBhcmFtKSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEVudnhPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsVGV4RW52Zih0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxHTGZsb2F0PihwYXJhbSkpKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhFbnZ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9FTlZfQ09MT1IpIHsKKyAgICAgICAgQ29udmVydCh0bXAsIFBhcmFtU2l6ZShwbmFtZSksIHBhcmFtcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wWzBdID0gc3RhdGljX2Nhc3Q8R0xmbG9hdD4ocGFyYW1zWzBdKTsKKyAgICB9CisgICAgVFJDQUxMKGdsVGV4RW52ZnYodGFyZ2V0LCBwbmFtZSwgdG1wKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4RW52eHZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhFbnZ4dih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gQ29udHJvbCB0aGUgZ2VuZXJhdGlvbiBvZiB0ZXh0dXJlIGNvb3JkaW5hdGVzLgorQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhHZW5pT0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkVGV4R2VuQ29vcmQoY29vcmQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKGNvb3JkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIG9wZW5nbGVzX3NwZWNfMV8xX2V4dGVuc2lvbl9wYWNrLnBkZiA0LjEKKyAgICAvLyBPbmx5IEdMX1RFWFRVUkVfR0VOX01PREVfT0VTIGlzIHN1cHBvcnRlZAorICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHTF9URVhUVVJFX0dFTl9NT0RFX09FUzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJc1ZhbGlkVGV4R2VuTW9kZShwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4R2VuJiB0ZXhnZW4gPSBjLT51bmlmb3JtX2NvbnRleHRfLk11dGF0ZUFjdGl2ZVRleEdlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Z2VuLm1vZGUgPSBwYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEdlbml2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsVGV4R2VuaU9FUyhjb29yZCwgcG5hbWUsIHBhcmFtc1swXSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEdlbnhPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhHZW5pT0VTKGNvb3JkLCBwbmFtZSwgcGFyYW0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhHZW54dk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcykgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsVGV4R2VuaXZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbXMpKTsKK30KKworLy8gTG9hZHMgcGl4ZWwgZGF0YSBpbnRvIGEgdGV4dHVyZSBvYmplY3QuCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0YXJnZXQgPT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFRleHR1cmVUYXJnZXRFeCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkUGl4ZWxGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShmb3JtYXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZFBpeGVsVHlwZSh0eXBlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRQaXhlbEZvcm1hdEFuZFR5cGUoZm9ybWF0LCB0eXBlKSkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfRU5VTSwgIkludmFsaWQgZm9ybWF0L3R5cGU6ICVzICVzIiwKKyAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKGZvcm1hdCksIEdldEVudW1TdHJpbmcodHlwZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpbnRlcm5hbGZvcm1hdCAhPSAoKEdMaW50KWZvcm1hdCkpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIkZvcm1hdCBtdXN0IG1hdGNoIGludGVybmFsIGZvcm1hdC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYm9yZGVyICE9IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChib3JkZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBjLT50ZXh0dXJlX2NvbnRleHRfLkdldE1heExldmVscygpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobGV2ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh3aWR0aCA8IDAgfHwgd2lkdGggPiBjLT5tYXhfdGV4dHVyZV9zaXplXy5HZXQoKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaGVpZ2h0IDwgMCB8fCBoZWlnaHQgPiBjLT5tYXhfdGV4dHVyZV9zaXplXy5HZXQoKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBUZXh0dXJlRGF0YVB0ciB0ZXggPSBjLT5HZXRCb3VuZFRleHR1cmVEYXRhKHRhcmdldCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0ZXggPT0gTlVMTCwgIlRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSB0ZXh0dXJlIGJvdW5kLiIpOworCisgICAgdGV4LT5TZXQobGV2ZWwsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSk7CisKKyAgICBpZiAodGV4LT5Jc0VnbEltYWdlQXR0YWNoZWQoKSkgeworICAgICAgICBETE9HKCJlZ2wgaW1hZ2UgYXR0YWNoZWQgdG8gdGhpcyB0ZXh0dXJlIik7CisgICAgICAgIC8vIFRoaXMgdGV4dHVyZSB3YXMgYSB0YXJnZXQgb2YgRUdMSW1hZ2UsIGJ1dCBub3cgaXQgaXMgcmUtZGVmaW5lZAorICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIGRldGFjaCBmcm9tIHRoZSBFR0xJbWFnZSBhbmQgcmUtZ2VuZXJhdGUgYQorICAgICAgICAvLyBnbG9iYWwgdGV4dHVyZSBuYW1lIGZvciBpdCwgYW5kIHJlc2V0IHRoZSB0ZXh0dXJlIHRvIGJlIGJvdW5kIHRvIGEKKyAgICAgICAgLy8gVEVYVFVSRV8yRCB0YXJnZXQuCisgICAgICAgIHRleC0+RGV0YWNoRWdsSW1hZ2UoKTsKKyAgICAgICAgR0x1aW50IGdsb2JhbCA9IDA7CisgICAgICAgIFBBU1NfVEhST1VHSChjLCBHZW5UZXh0dXJlcywgMSwgJmdsb2JhbCk7CisgICAgICAgIGNvbnN0IEdMdWludCBuYW1lID0gdGV4LT5HZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgYy0+R2V0U2hhcmVHcm91cCgpLT5TZXRUZXh0dXJlR2xvYmFsTmFtZShuYW1lLCBnbG9iYWwpOworICAgICAgICBjLT50ZXh0dXJlX2NvbnRleHRfLlNldFRhcmdldFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbmFtZSwgR0xfVEVYVFVSRV8yRCk7CisgICAgICAgIFBBU1NfVEhST1VHSChjLCBCaW5kVGV4dHVyZSwgR0xfVEVYVFVSRV8yRCwgZ2xvYmFsKTsKKyAgICB9CisKKyAgICBjLT50ZXh0dXJlX2NvbnRleHRfLkVuc3VyZUNvcnJlY3RCaW5kaW5nKHRhcmdldCk7CisgICAgRExPRygiY2FsbCB1bmRlcmx5aW5nIik7CisgICAgUEFTU19USFJPVUdIKGMsIFRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgRExPRygiY2FsbCBSZXN0b3JlQmluZGluZyAoY2FsbGVkIHBhc3MgdGhyb3VnaCkiKTsKKyAgICBjLT50ZXh0dXJlX2NvbnRleHRfLlJlc3RvcmVCaW5kaW5nKHRhcmdldCk7CisgICAgRExPRygiRG9uZSByZXN0b3JpbmcgYmluZGluZyIpOworCisgICAgaWYgKHRleC0+SXNBdXRvTWlwbWFwKCkgJiYgbGV2ZWwgPT0gMCkgeworICAgICAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MTMpOiBVcGRhdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBsZXZlbHMuCisgICAgICAgIFBBU1NfVEhST1VHSChjLCBHZW5lcmF0ZU1pcG1hcCwgdGFyZ2V0KTsKKyAgICB9CisgICAgRExPRygiRXhpdCIpOworfQorCisvLyBDb25maWd1cmUgYSB0ZXh0dXJlIG9iamVjdC4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4UGFyYW1ldGVyZiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCAmcGFyYW0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFJc1ZhbGlkVGV4dHVyZVRhcmdldCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkVGV4dHVyZVBhcmFtKHBuYW1lKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKSB7CisgICAgICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0ZXgtPlNldENyb3BSZWN0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR0xpbnQqPihwYXJhbXMpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocG5hbWUgPT0gR0xfR0VORVJBVEVfTUlQTUFQKSB7CisgICAgICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgaWYgKHRleCAhPSBOVUxMKSB7CisgICAgICAgICAgICB0ZXgtPlNldEF1dG9NaXBtYXAoKnBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBHTGVudW0gZ2xvYmFsX3RhcmdldCA9IGMtPnRleHR1cmVfY29udGV4dF8uRW5zdXJlQ29ycmVjdEJpbmRpbmcodGFyZ2V0KTsKKyAgICAgICAgUEFTU19USFJPVUdIKGMsIFRleFBhcmFtZXRlcmZ2LCBnbG9iYWxfdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKKyAgICAgICAgYy0+dGV4dHVyZV9jb250ZXh0Xy5SZXN0b3JlQmluZGluZyh0YXJnZXQpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhQYXJhbWV0ZXJpLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCAmcGFyYW0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhQYXJhbWV0ZXJpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFRleHR1cmVUYXJnZXQodGFyZ2V0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0YXJnZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZFRleHR1cmVQYXJhbShwbmFtZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocG5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBuYW1lID09IEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUykgeworICAgICAgICBUZXh0dXJlRGF0YVB0ciB0ZXggPSBjLT5HZXRCb3VuZFRleHR1cmVEYXRhKHRhcmdldCk7CisgICAgICAgIGlmICh0ZXggIT0gTlVMTCkgeworICAgICAgICAgICAgdGV4LT5TZXRDcm9wUmVjdChwYXJhbXMpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwbmFtZSA9PSBHTF9HRU5FUkFURV9NSVBNQVApIHsKKyAgICAgICAgVGV4dHVyZURhdGFQdHIgdGV4ID0gYy0+R2V0Qm91bmRUZXh0dXJlRGF0YSh0YXJnZXQpOworICAgICAgICBpZiAodGV4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRleC0+U2V0QXV0b01pcG1hcCgqcGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEdMZW51bSBnbG9iYWxfdGFyZ2V0ID0gYy0+dGV4dHVyZV9jb250ZXh0Xy5FbnN1cmVDb3JyZWN0QmluZGluZyh0YXJnZXQpOworICAgICAgICBQQVNTX1RIUk9VR0goYywgVGV4UGFyYW1ldGVyaXYsIGdsb2JhbF90YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworICAgICAgICBjLT50ZXh0dXJlX2NvbnRleHRfLlJlc3RvcmVCaW5kaW5nKHRhcmdldCk7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleFBhcmFtZXRlcngsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsVGV4UGFyYW1ldGVyeHYodGFyZ2V0LCBwbmFtZSwgJnBhcmFtKSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVGV4UGFyYW1ldGVyeE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBUUkNBTEwoZ2xUZXhQYXJhbWV0ZXJ4dih0YXJnZXQsIHBuYW1lLCAmcGFyYW0pKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIEdMZmxvYXQgdG1wW2tNYXhQYXJhbUVsZW1lbnRTaXplXTsKKyAgICBDb252ZXJ0KHRtcCwgUGFyYW1TaXplKHBuYW1lKSwgcGFyYW1zKTsKKyAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9XUkFQX1MgfHwgcG5hbWUgPT0gR0xfVEVYVFVSRV9XUkFQX1QgfHwKKyAgICAgICAgICAgIHBuYW1lID09IEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUykgeworICAgICAgICBUUkNBTEwoZ2xUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IEdMaW50Kj4ocGFyYW1zKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRSQ0FMTChnbFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5hbWUsIHRtcCkpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBUZXhQYXJhbWV0ZXJ4dk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFRleFBhcmFtZXRlcnh2KHRhcmdldCwgcG5hbWUsIHBhcmFtcykpOworfQorCituYW1lc3BhY2UgeworCisgICAgYm9vbCBIYW5kbGVUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LAorICAgICAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKKyAgICAgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGMgIT0gTlVMTCk7CisgICAgICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICAgICAgY29uc3QgR0xlbnVtIGN1cnJlbnRfZm9ybWF0ID0gdGV4LT5HZXRGb3JtYXQobGV2ZWwpOworICAgICAgICBjb25zdCBHTGVudW0gY3VycmVudF90eXBlID0gdGV4LT5HZXRUeXBlKGxldmVsKTsKKworICAgICAgICBjb25zdCBib29sIHJlcXVpcmVzX2NvbnZlcnNpb24gPQorICAgICAgICAgICAgKGZvcm1hdCAhPSBjdXJyZW50X2Zvcm1hdCB8fCB0eXBlICE9IGN1cnJlbnRfdHlwZSk7CisgICAgICAgIGlmICghcmVxdWlyZXNfY29udmVyc2lvbikgeworICAgICAgICAgICAgUEFTU19USFJPVUdIKGMsIFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRleHR1cmVDb252ZXJ0ZXIgY29udmVydGVyKGZvcm1hdCwgdHlwZSwgY3VycmVudF9mb3JtYXQsIGN1cnJlbnRfdHlwZSk7CisgICAgICAgICAgICBpZiAoIWNvbnZlcnRlci5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRleHR1cmUgY29udmVyc2lvbiBmcm9tICVzICVzIHRvICVzICVzIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoZm9ybWF0KSwgR2V0RW51bVN0cmluZyh0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoY3VycmVudF9mb3JtYXQpLCBHZXRFbnVtU3RyaW5nKGN1cnJlbnRfdHlwZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IHVucGFjayBhbGlnbm1lbnQgdG8gNCwgYmVjYXVzZSBUZXh0dXJlQ29udmVydGVyIGFsd2F5cyBnZW5lcmF0ZXMKKyAgICAgICAgICAgIC8vIHRleHR1cmUgd2l0aCBhbGlnbm1lbnQgNC4KKyAgICAgICAgICAgIGlmIChjLT5waXhlbF9zdG9yZV91bnBhY2tfYWxpZ25tZW50Xy5HZXQoKSAhPSA0KSB7CisgICAgICAgICAgICAgICAgUEFTU19USFJPVUdIKGMsIFBpeGVsU3RvcmVpLCBHTF9VTlBBQ0tfQUxJR05NRU5ULCA0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgR0x2b2lkKiBidWZmZXIgPSBQQVNTX1RIUk9VR0goYywgTWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNLCB0YXJnZXQsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2Zvcm1hdCwgY3VycmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICBHTF9XUklURV9PTkxZX09FUyk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfT1VUX09GX01FTU9SWSwgIk91dCBvZiBtZW1vcnkuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udmVydGVyLkNvbnZlcnQod2lkdGgsIGhlaWdodCwgYy0+cGl4ZWxfc3RvcmVfdW5wYWNrX2FsaWdubWVudF8uR2V0KCksCisgICAgICAgICAgICAgICAgICAgIHBpeGVscywgYnVmZmVyKTsKKyAgICAgICAgICAgIFBBU1NfVEhST1VHSChjLCBVbm1hcFRleFN1YkltYWdlMkRDSFJPTUlVTSwgYnVmZmVyKTsKKworICAgICAgICAgICAgLy8gUmVzdG9yZSB1bnBhY2sgYWxpZ25tZW50LgorICAgICAgICAgICAgaWYgKGMtPnBpeGVsX3N0b3JlX3VucGFja19hbGlnbm1lbnRfLkdldCgpICE9IDQpIHsKKyAgICAgICAgICAgICAgICBQQVNTX1RIUk9VR0goYywgUGl4ZWxTdG9yZWksIEdMX1VOUEFDS19BTElHTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5waXhlbF9zdG9yZV91bnBhY2tfYWxpZ25tZW50Xy5HZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gUmVkZWZpbmVzIGEgY29udGlndW91cyBzdWJyZWdpb24gb2YgYSB0ZXh0dXJlLiAgSW4gR0xFUyAyIHByb2ZpbGUKKy8vIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgYW5kIGRhdGEgbXVzdCBtYXRjaCB0aGUgdmFsdWVzIG9yaWdpbmFsbHkKKy8vIHNwZWNpZmllZCB0byBUZXhJbWFnZTJELiAgU2VlIGVzX2Z1bGxfc3BlY18yLjAuMjUucGRmIHNlY3Rpb24gMy43LjIuCitBUElFTlRSWV9JTVBMKHZvaWQsIFRleFN1YkltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFyZ2V0ID09IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKKworICAgIGlmICghSXNWYWxpZFRleHR1cmVUYXJnZXRFeCh0YXJnZXQpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKHRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkUGl4ZWxGb3JtYXQoZm9ybWF0KSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShmb3JtYXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghSXNWYWxpZFBpeGVsVHlwZSh0eXBlKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTSh0eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRQaXhlbEZvcm1hdEFuZFR5cGUoZm9ybWF0LCB0eXBlKSkgeworICAgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfRU5VTSwgIkludmFsaWQgZm9ybWF0L3R5cGU6ICVzICVzIiwKKyAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKGZvcm1hdCksIEdldEVudW1TdHJpbmcodHlwZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiBjLT50ZXh0dXJlX2NvbnRleHRfLkdldE1heExldmVscygpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQobGV2ZWwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFRleHR1cmVEYXRhUHRyIHRleCA9IGMtPkdldEJvdW5kVGV4dHVyZURhdGEodGFyZ2V0KTsKKyAgICBpZiAod2lkdGggPCAwIHx8ICh4b2Zmc2V0ICsgd2lkdGgpID4gc3RhdGljX2Nhc3Q8R0xzaXplaT4odGV4LT5HZXRXaWR0aCgpKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKHdpZHRoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaGVpZ2h0IDwgMCB8fCAoeW9mZnNldCArIGhlaWdodCkgPiBzdGF0aWNfY2FzdDxHTHNpemVpPih0ZXgtPkdldEhlaWdodCgpKSkgeworICAgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGhlaWdodCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHhvZmZzZXQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoeG9mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHlvZmZzZXQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoeW9mZnNldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoSGFuZGxlVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSkgeworICAgICAgICBpZiAodGV4ICE9IE5VTEwgJiYgdGV4LT5Jc0F1dG9NaXBtYXAoKSAmJiBsZXZlbCA9PSAwKSB7CisgICAgICAgICAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MTMpOiBVcGRhdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBsZXZlbHMuCisgICAgICAgICAgICBQQVNTX1RIUk9VR0goYywgR2VuZXJhdGVNaXBtYXAsIHRhcmdldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEFwcGxpZXMgYSB0cmFuc2xhdGlvbiB0byB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IG1hdHJpeCBzdGFjay4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVHJhbnNsYXRlZiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbXVnbDo6VmVjdG9yIHYoeCwgeSwgeiwgMSk7CisgICAgYy0+dW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVBY3RpdmVNYXRyaXgoKSAqPQorICAgICAgICBlbXVnbDo6TWF0cml4OjpHZW5lcmF0ZVRyYW5zbGF0aW9uKHYpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRyYW5zbGF0ZXgsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFRyYW5zbGF0ZWYoWDJGKHgpLCBYMkYoeSksIFgyRih6KSkpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFRyYW5zbGF0ZXhPRVMsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKKyAgICBBUElUUkFDRSgpOworICAgIFRSQ0FMTChnbFRyYW5zbGF0ZWYoWDJGKHgpLCBYMkYoeSksIFgyRih6KSkpOworfQorCituYW1lc3BhY2UgeworCisgICAgUHJvZ3JhbURhdGFQdHIgR2V0Q3VycmVudFByb2dyYW1EYXRhKCkgeworICAgICAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICAgICAgaWYgKCFjKSB7CisgICAgICAgICAgICByZXR1cm4gUHJvZ3JhbURhdGFQdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IGMtPkdldEN1cnJlbnRVc2VyUHJvZ3JhbSgpOworICAgICAgICBpZiAocHJvZ3JhbV9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJObyBhY3RpdmUgcHJvZ3JhbSBvbiB0aGlzIGNvbnRleHQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvZ3JhbV9kYXRhOworICAgIH0KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIExvYWRzIHZhbHVlcyBpbnRvIHRoZSBhY3RpdmUgdW5pZm9ybSBzdGF0ZS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTFmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtZnYobG9jYXRpb24sIEdMX0ZMT0FULCAxLCAmeCk7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm0xZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtZnYobG9jYXRpb24sIEdMX0ZMT0FULCBjb3VudCwgdik7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm0xaSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1pdihsb2NhdGlvbiwgR0xfSU5ULCAxLCAmeCk7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm0xaXYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikgeworICAgIEFQSVRSQUNFKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gR2V0Q3VycmVudFByb2dyYW1EYXRhKCk7CisgICAgaWYgKHByb2dyYW1fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyYW1fZGF0YS0+VW5pZm9ybWl2KGxvY2F0aW9uLCBHTF9JTlQsIGNvdW50LCB2KTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTJmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBHTGZsb2F0IHBhcmFtc1tdID0ge3gsIHl9OworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1mdihsb2NhdGlvbiwgR0xfRkxPQVRfVkVDMiwgMSwgcGFyYW1zKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTJmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1mdihsb2NhdGlvbiwgR0xfRkxPQVRfVkVDMiwgY291bnQsIHYpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBVbmlmb3JtMmksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgR0xpbnQgcGFyYW1zW10gPSB7eCwgeX07CisgICAgICAgIHByb2dyYW1fZGF0YS0+VW5pZm9ybWl2KGxvY2F0aW9uLCBHTF9JTlRfVkVDMiwgMSwgcGFyYW1zKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTJpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtaXYobG9jYXRpb24sIEdMX0lOVF9WRUMyLCBjb3VudCwgdik7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm0zZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBHTGZsb2F0IHBhcmFtc1tdID0ge3gsIHksIHp9OworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1mdihsb2NhdGlvbiwgR0xfRkxPQVRfVkVDMywgMSwgcGFyYW1zKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTNmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1mdihsb2NhdGlvbiwgR0xfRkxPQVRfVkVDMywgY291bnQsIHYpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBVbmlmb3JtM2ksIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgR0xpbnQgcGFyYW1zW10gPSB7eCwgeSwgen07CisgICAgICAgIHByb2dyYW1fZGF0YS0+VW5pZm9ybWl2KGxvY2F0aW9uLCBHTF9JTlRfVkVDMywgMSwgcGFyYW1zKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybTNpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtaXYobG9jYXRpb24sIEdMX0lOVF9WRUMzLCBjb3VudCwgdik7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm00ZiwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykgeworICAgIEFQSVRSQUNFKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gR2V0Q3VycmVudFByb2dyYW1EYXRhKCk7CisgICAgaWYgKHByb2dyYW1fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIEdMZmxvYXQgcGFyYW1zW10gPSB7eCwgeSwgeiwgd307CisgICAgICAgIHByb2dyYW1fZGF0YS0+VW5pZm9ybWZ2KGxvY2F0aW9uLCBHTF9GTE9BVF9WRUM0LCAxLCBwYXJhbXMpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBVbmlmb3JtNGZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikgeworICAgIEFQSVRSQUNFKCk7CisgICAgUHJvZ3JhbURhdGFQdHIgcHJvZ3JhbV9kYXRhID0gR2V0Q3VycmVudFByb2dyYW1EYXRhKCk7CisgICAgaWYgKHByb2dyYW1fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyYW1fZGF0YS0+VW5pZm9ybWZ2KGxvY2F0aW9uLCBHTF9GTE9BVF9WRUM0LCBjb3VudCwgdik7CisgICAgfQorfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFVuaWZvcm00aSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBHTGludCBwYXJhbXNbXSA9IHt4LCB5LCB6LCB3fTsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtaXYobG9jYXRpb24sIEdMX0lOVF9WRUM0LCAxLCBwYXJhbXMpOworICAgIH0KK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBVbmlmb3JtNGl2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKKyAgICBBUElUUkFDRSgpOworICAgIFByb2dyYW1EYXRhUHRyIHByb2dyYW1fZGF0YSA9IEdldEN1cnJlbnRQcm9ncmFtRGF0YSgpOworICAgIGlmIChwcm9ncmFtX2RhdGEgIT0gTlVMTCkgeworICAgICAgICBwcm9ncmFtX2RhdGEtPlVuaWZvcm1pdihsb2NhdGlvbiwgR0xfSU5UX1ZFQzQsIGNvdW50LCB2KTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybU1hdHJpeDJmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtTWF0cml4ZnYoCisgICAgICAgICAgICAgICAgbG9jYXRpb24sIEdMX0ZMT0FUX01BVDIsIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybU1hdHJpeDNmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtTWF0cml4ZnYoCisgICAgICAgICAgICAgICAgbG9jYXRpb24sIEdMX0ZMT0FUX01BVDMsIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5pZm9ybU1hdHJpeDRmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBHZXRDdXJyZW50UHJvZ3JhbURhdGEoKTsKKyAgICBpZiAocHJvZ3JhbV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3JhbV9kYXRhLT5Vbmlmb3JtTWF0cml4ZnYoCisgICAgICAgICAgICAgICAgbG9jYXRpb24sIEdMX0ZMT0FUX01BVDQsIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKKyAgICB9Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVW5tYXBUZXhTdWJJbWFnZTJEQ0hST01JVU0sIGNvbnN0IEdMdm9pZCogbWVtKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBVbm1hcFRleFN1YkltYWdlMkRDSFJPTUlVTSwgbWVtKTsKK30KKworLy8gU2VsZWN0cyBhIHByb2dyYW0gdG8gdXNlIGZvciBzdWJzZXF1ZW50IHJlbmRlcmluZy4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVXNlUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX3B0ciA9IHNnLT5HZXRQcm9ncmFtRGF0YShwcm9ncmFtKTsKKyAgICBpZiAocHJvZ3JhbV9wdHIgPT0gTlVMTCkgeworICAgICAgICBpZiAocHJvZ3JhbSkgeworICAgICAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIlVua25vd24gcHJvZ3JhbSBuYW1lICVkIiwgcHJvZ3JhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGMtPlNldEN1cnJlbnRVc2VyUHJvZ3JhbShwcm9ncmFtX3B0cik7Cit9CisKKy8vIFZhbGlkYXRlcyB0aGUgaW5kaWNhdGVkIHByb2dyYW0uCitBUElFTlRSWV9JTVBMKHZvaWQsIFZhbGlkYXRlUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgICBQcm9ncmFtRGF0YVB0ciBwcm9ncmFtX2RhdGEgPSBzZy0+R2V0UHJvZ3JhbURhdGEocHJvZ3JhbSk7CisgICAgaWYgKHByb2dyYW1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJJbnZhbGlkIHByb2dyYW0gJWQiLCBwcm9ncmFtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb2dyYW1fZGF0YS0+VmFsaWRhdGUoKTsKK30KKworLy8gU2V0cyB1cCBhIHZlcnRleCBhdHRyaWJ1dGUgdmFsdWUgb3IgYXJyYXkgdG8gdXNlIGZvciB0aGUgdmVydGV4IHNoYWRlci4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliMWYsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFZlcnRleEF0dHJpYjFmLCBpbmR4LCB4KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBWZXJ0ZXhBdHRyaWIxZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFZlcnRleEF0dHJpYjFmdiwgaW5keCwgdmFsdWVzKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBWZXJ0ZXhBdHRyaWIyZiwgR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBWZXJ0ZXhBdHRyaWIyZiwgaW5keCwgeCwgeSk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliMmZ2LCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBWZXJ0ZXhBdHRyaWIyZnYsIGluZHgsIHZhbHVlcyk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliM2YsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBWZXJ0ZXhBdHRyaWIzZiwgaW5keCwgeCwgeSwgeik7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliM2Z2LCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBBU1NfVEhST1VHSChjLCBWZXJ0ZXhBdHRyaWIzZnYsIGluZHgsIHZhbHVlcyk7Cit9CisKK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliNGYsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFZlcnRleEF0dHJpYjRmLCBpbmR4LCB4LCB5LCB6LCB3KTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBWZXJ0ZXhBdHRyaWI0ZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgICBBUElUUkFDRSgpOworICAgIENvbnRleHRQdHIgYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICAgIGlmICghYykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUEFTU19USFJPVUdIKGMsIFZlcnRleEF0dHJpYjRmdiwgaW5keCwgdmFsdWVzKTsKK30KKworLy8gU3BlY2lmeSBhbiBhcnJheSBvZiBnZW5lcmljIHZlcnRleCBhdHRyaWJ1dGUgZGF0YS4KK0FQSUVOVFJZX0lNUEwodm9pZCwgVmVydGV4QXR0cmliUG9pbnRlciwgR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcikgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoaW5keCA+PSAoR0x1aW50KWMtPm1heF92ZXJ0ZXhfYXR0cmlic18uR2V0KCkpIHsKKyAgICAgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX1ZBTFVFLCAiSW52YWxpZCBpbmRleDogJWQiLCBpbmR4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRWZXJ0ZXhBdHRyaWJTaXplKHNpemUpKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9WQUxVRSwgIkludmFsaWQgc2l6ZTogJWQiLCBzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIUlzVmFsaWRWZXJ0ZXhBdHRyaWJUeXBlKHR5cGUpKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9FTlVNLCAiSW52YWxpZCB0eXBlOiAlZCIsIHR5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzdHJpZGUgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9WQUxVRSwgIkludmFsaWQgc3RyaWRlOiAlZC4iLCBzdHJpZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50ZXJfY29udGV4dF8uU2V0UG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIsIG5vcm1hbGl6ZWQpOworfQorCisvLyBTcGVjaWZpZXMgc291cmNlIGFycmF5IGZvciB2ZXJ0ZXggY29vcmRpbmF0ZXMuCitBUElFTlRSWV9JTVBMKHZvaWQsIFZlcnRleFBvaW50ZXIsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFZlcnRleFBvaW50ZXJTaXplKHNpemUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkVmVydGV4UG9pbnRlclR5cGUodHlwZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHN0cmlkZSA8IDApIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChzdHJpZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnBvaW50ZXJfY29udGV4dF8uU2V0UG9pbnRlcihrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUsIHNpemUsIHR5cGUsIHN0cmlkZSwKKyAgICAgICAgICAgIHBvaW50ZXIpOworfQorCitBUElFTlRSWV9JTVBMKHZvaWQsIFZlcnRleFBvaW50ZXJCb3VuZHMsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRSQ0FMTChnbFZlcnRleFBvaW50ZXIoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSk7Cit9CisKKy8vIFNldHMgdXAgdGhlIGN1cnJlbnQgdmlld3BvcnQuCitBUElFTlRSWV9JTVBMKHZvaWQsIFZpZXdwb3J0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgQ29udGV4dFB0ciBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgaWYgKCFjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAod2lkdGggPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQod2lkdGgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChoZWlnaHQgPCAwKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdpZHRoID0gQ2xhbXBWYWx1ZSh3aWR0aCwgMCwgYy0+bWF4X3ZpZXdwb3J0X2RpbXNfLkdldCgpWzBdKTsKKyAgICBoZWlnaHQgPSBDbGFtcFZhbHVlKGhlaWdodCwgMCwgYy0+bWF4X3ZpZXdwb3J0X2RpbXNfLkdldCgpWzFdKTsKKyAgICBHTGludCAoJnZpZXdwb3J0KVs0XSA9IGMtPnZpZXdwb3J0Xy5NdXRhdGUoKTsKKyAgICB2aWV3cG9ydFswXSA9IHg7CisgICAgdmlld3BvcnRbMV0gPSB5OworICAgIHZpZXdwb3J0WzJdID0gd2lkdGg7CisgICAgdmlld3BvcnRbM10gPSBoZWlnaHQ7CisgICAgUEFTU19USFJPVUdIKGMsIFZpZXdwb3J0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKworLy8gU2V0IHRoZSB3ZWlnaHRzIHVzZWQgdG8gYmxlbmQgY29ycmVzcG9uZGluZyBtYXRyaWNlcyBmb3IgYSBnaXZlbiB2ZXJ0ZXguCitBUElFTlRSWV9JTVBMKHZvaWQsIFdlaWdodFBvaW50ZXJPRVMsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKSB7CisgICAgQVBJVFJBQ0UoKTsKKyAgICBDb250ZXh0UHRyIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghSXNWYWxpZFdlaWdodFBvaW50ZXJTaXplKHNpemUpKSB7CisgICAgICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoc2l6ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkV2VpZ2h0UG9pbnRlclR5cGUodHlwZSkpIHsKKyAgICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0odHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBHTGJvb2xlYW4gbm9ybWFsaXplZCA9IEdMX0ZBTFNFOworICAgIGMtPnBvaW50ZXJfY29udGV4dF8uU2V0UG9pbnRlcihrV2VpZ2h0VmVydGV4QXR0cmlidXRlLCBzaXplLCB0eXBlLCBzdHJpZGUsCisgICAgICAgICAgICBwb2ludGVyLCBub3JtYWxpemVkKTsKK30KKworQVBJRU5UUllfSU1QTCh2b2lkLCBXZWlnaHRQb2ludGVyT0VTQm91bmRzLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCkgeworICAgIEFQSVRSQUNFKCk7CisgICAgVFJDQUxMKGdsV2VpZ2h0UG9pbnRlck9FUyhzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvYnVmZmVyX2RhdGEuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvYnVmZmVyX2RhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDZmNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9idWZmZXJfZGF0YS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiZ2xlcy9idWZmZXJfZGF0YS5oIgorCitCdWZmZXJEYXRhOjpCdWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKQorICA6IE9iamVjdERhdGEoQlVGRkVSLCBuYW1lKSwKKyAgICBzaXplXygwKSwKKyAgICB1c2FnZV8oR0xfU1RBVElDX0RSQVcpLAorICAgIGRhdGFfKE5VTEwpIHsKK30KKworQnVmZmVyRGF0YTo6fkJ1ZmZlckRhdGEoKSB7CisgIGRlbGV0ZVtdIGRhdGFfOworfQorCit2b2lkIEJ1ZmZlckRhdGE6OlNldEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0x1aW50IHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgdXNhZ2UpIHsKKyAgLy8gVE9ETyhjcmJ1Zy5jb20vNDgyMDcwKTogT25seSBrZWVwIGEgY29weSBvZiB0aGUgZGF0YSBmb3IgZWxlbWVudCBhcnJheQorICAvLyBidWZmZXJzIChpZS4gdGFyZ2V0ID09IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKS4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBtYXkKKyAgLy8gbmVlZCB0byB1c2UgdGhpcyBkYXRhIGR1cmluZyBnbERyYXdFbGVtZW50cyBjYWxscy4gIFNlZQorICAvLyBQb2ludGVyQ29udGV4dDo6UHJlcGFyZUVsZW1lbnRzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICBpZiAoc2l6ZSA+IHNpemVfKSB7CisgICAgZGVsZXRlW10gZGF0YV87CisgICAgZGF0YV8gPSBuZXcgdW5zaWduZWQgY2hhcltzaXplXTsKKyAgfQorICBzaXplXyA9IHNpemU7CisgIHVzYWdlXyA9IHVzYWdlOworICBpZiAoZGF0YV8gJiYgZGF0YSkgeworICAgIG1lbWNweShkYXRhXywgZGF0YSwgc2l6ZSk7CisgIH0KK30KKwordm9pZCBCdWZmZXJEYXRhOjpTZXRCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICBpZiAoc3RhdGljX2Nhc3Q8R0x1aW50PihvZmZzZXQpICsgc3RhdGljX2Nhc3Q8R0x1aW50PihzaXplKSA+IHNpemVfKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChkYXRhXyAmJiBkYXRhKSB7CisgICAgbWVtY3B5KGRhdGFfICsgb2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvYnVmZmVyX2RhdGEuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2J1ZmZlcl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2J1ZmZlcl9kYXRhLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfQlVGRkVSX0RBVEFfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19CVUZGRVJfREFUQV9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2NsYXNzIEJ1ZmZlckRhdGEgOiBwdWJsaWMgT2JqZWN0RGF0YSB7CisgcHVibGljOgorICBleHBsaWNpdCBCdWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKTsKKworICB2b2lkIFNldEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0x1aW50IHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEdMdWludCB1c2FnZSk7CisgIHZvaWQgU2V0QnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCogZGF0YSk7CisKKyAgR0x1aW50IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorICBHTGVudW0gR2V0VXNhZ2UoKSBjb25zdCB7IHJldHVybiB1c2FnZV87IH0KKyAgY29uc3QgdW5zaWduZWQgY2hhciogR2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9CisKKyBwcm90ZWN0ZWQ6CisgIH5CdWZmZXJEYXRhKCk7CisKKyBwcml2YXRlOgorICBHTHVpbnQgc2l6ZV87CisgIEdMZW51bSB1c2FnZV87CisgIHVuc2lnbmVkIGNoYXIqIGRhdGFfOworCisgIEJ1ZmZlckRhdGEoY29uc3QgQnVmZmVyRGF0YSYpOworICBCdWZmZXJEYXRhJiBvcGVyYXRvcj0oY29uc3QgQnVmZmVyRGF0YSYpOworfTsKKwordHlwZWRlZiBhbmRyb2lkOjpzcDxCdWZmZXJEYXRhPiBCdWZmZXJEYXRhUHRyOworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfQlVGRkVSX0RBVEFfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2NvbmQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2NvbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjM5ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvY29uZC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0NPTkRfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19DT05EX0hfCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0NvbmRpdGlvblZhcmlhYmxlLmgiCisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19DT05EX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9kZWJ1Zy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9kZWJ1Zy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4MDAyNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2RlYnVnLmNwcApAQCAtMCwwICsxLDUwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisKK2NvbnN0IGNoYXIqIEdldEVudW1TdHJpbmcoR0xlbnVtIHYpIHsKKyAgc3dpdGNoICh2KSB7CisgICAgY2FzZSAweDAwMDA6IHJldHVybiAiR0xfWkVSTy9HTF9OT19FUlJPUi9HTF9QT0lOVFMiOworICAgIGNhc2UgMHgwMDAxOiByZXR1cm4gIkdMX09ORS9HTF9MSU5FUyI7CisgICAgY2FzZSAweDAwMDI6IHJldHVybiAiR0xfTElORV9MT09QIjsKKyAgICBjYXNlIDB4MDAwMzogcmV0dXJuICJHTF9MSU5FX1NUUklQIjsKKyAgICBjYXNlIDB4MDAwNDogcmV0dXJuICJHTF9UUklBTkdMRVMiOworICAgIGNhc2UgMHgwMDA1OiByZXR1cm4gIkdMX1RSSUFOR0xFX1NUUklQIjsKKyAgICBjYXNlIDB4MDAwNjogcmV0dXJuICJHTF9UUklBTkdMRV9GQU4iOworICAgIGNhc2UgMHgwMTAwOiByZXR1cm4gIkdMX0RFUFRIX0JVRkZFUl9CSVQiOworICAgIGNhc2UgMHgwMTA0OiByZXR1cm4gIkdMX0FERCI7CisgICAgY2FzZSAweDAyMDA6IHJldHVybiAiR0xfTkVWRVIiOworICAgIGNhc2UgMHgwMjAxOiByZXR1cm4gIkdMX0xFU1MiOworICAgIGNhc2UgMHgwMjAyOiByZXR1cm4gIkdMX0VRVUFMIjsKKyAgICBjYXNlIDB4MDIwMzogcmV0dXJuICJHTF9MRVFVQUwiOworICAgIGNhc2UgMHgwMjA0OiByZXR1cm4gIkdMX0dSRUFURVIiOworICAgIGNhc2UgMHgwMjA1OiByZXR1cm4gIkdMX05PVEVRVUFMIjsKKyAgICBjYXNlIDB4MDIwNjogcmV0dXJuICJHTF9HRVFVQUwiOworICAgIGNhc2UgMHgwMjA3OiByZXR1cm4gIkdMX0FMV0FZUyI7CisgICAgY2FzZSAweDAzMDA6IHJldHVybiAiR0xfU1JDX0NPTE9SIjsKKyAgICBjYXNlIDB4MDMwMTogcmV0dXJuICJHTF9PTkVfTUlOVVNfU1JDX0NPTE9SIjsKKyAgICBjYXNlIDB4MDMwMjogcmV0dXJuICJHTF9TUkNfQUxQSEEiOworICAgIGNhc2UgMHgwMzAzOiByZXR1cm4gIkdMX09ORV9NSU5VU19TUkNfQUxQSEEiOworICAgIGNhc2UgMHgwMzA0OiByZXR1cm4gIkdMX0RTVF9BTFBIQSI7CisgICAgY2FzZSAweDAzMDU6IHJldHVybiAiR0xfT05FX01JTlVTX0RTVF9BTFBIQSI7CisgICAgY2FzZSAweDAzMDY6IHJldHVybiAiR0xfRFNUX0NPTE9SIjsKKyAgICBjYXNlIDB4MDMwNzogcmV0dXJuICJHTF9PTkVfTUlOVVNfRFNUX0NPTE9SIjsKKyAgICBjYXNlIDB4MDMwODogcmV0dXJuICJHTF9TUkNfQUxQSEFfU0FUVVJBVEUiOworICAgIGNhc2UgMHgwNDAwOiByZXR1cm4gIkdMX1NURU5DSUxfQlVGRkVSX0JJVCI7CisgICAgY2FzZSAweDA0MDQ6IHJldHVybiAiR0xfRlJPTlQiOworICAgIGNhc2UgMHgwNDA1OiByZXR1cm4gIkdMX0JBQ0siOworICAgIGNhc2UgMHgwNDA4OiByZXR1cm4gIkdMX0ZST05UX0FORF9CQUNLIjsKKyAgICBjYXNlIDB4MDUwMDogcmV0dXJuICJHTF9JTlZBTElEX0VOVU0iOworICAgIGNhc2UgMHgwNTAxOiByZXR1cm4gIkdMX0lOVkFMSURfVkFMVUUiOworICAgIGNhc2UgMHgwNTAyOiByZXR1cm4gIkdMX0lOVkFMSURfT1BFUkFUSU9OIjsKKyAgICBjYXNlIDB4MDUwMzogcmV0dXJuICJHTF9TVEFDS19PVkVSRkxPVyI7CisgICAgY2FzZSAweDA1MDQ6IHJldHVybiAiR0xfU1RBQ0tfVU5ERVJGTE9XIjsKKyAgICBjYXNlIDB4MDUwNTogcmV0dXJuICJHTF9PVVRfT0ZfTUVNT1JZIjsKKyAgICBjYXNlIDB4MDUwNjogcmV0dXJuICJHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiI7CisgICAgY2FzZSAweDA4MDA6IHJldHVybiAiR0xfRVhQIjsKKyAgICBjYXNlIDB4MDgwMTogcmV0dXJuICJHTF9FWFAyIjsKKyAgICBjYXNlIDB4MDkwMDogcmV0dXJuICJHTF9DVyI7CisgICAgY2FzZSAweDA5MDE6IHJldHVybiAiR0xfQ0NXIjsKKyAgICBjYXNlIDB4MEIwMDogcmV0dXJuICJHTF9DVVJSRU5UX0NPTE9SIjsKKyAgICBjYXNlIDB4MEIwMjogcmV0dXJuICJHTF9DVVJSRU5UX05PUk1BTCI7CisgICAgY2FzZSAweDBCMDM6IHJldHVybiAiR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUyI7CisgICAgY2FzZSAweDBCMTA6IHJldHVybiAiR0xfUE9JTlRfU01PT1RIIjsKKyAgICBjYXNlIDB4MEIxMTogcmV0dXJuICJHTF9QT0lOVF9TSVpFIjsKKyAgICBjYXNlIDB4MEIxMjogcmV0dXJuICJHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSI7CisgICAgY2FzZSAweDBCMjA6IHJldHVybiAiR0xfTElORV9TTU9PVEgiOworICAgIGNhc2UgMHgwQjIxOiByZXR1cm4gIkdMX0xJTkVfV0lEVEgiOworICAgIGNhc2UgMHgwQjIyOiByZXR1cm4gIkdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFIjsKKyAgICBjYXNlIDB4MEI0NDogcmV0dXJuICJHTF9DVUxMX0ZBQ0UiOworICAgIGNhc2UgMHgwQjQ1OiByZXR1cm4gIkdMX0NVTExfRkFDRV9NT0RFIjsKKyAgICBjYXNlIDB4MEI0NjogcmV0dXJuICJHTF9GUk9OVF9GQUNFIjsKKyAgICBjYXNlIDB4MEI1MDogcmV0dXJuICJHTF9MSUdIVElORyI7CisgICAgY2FzZSAweDBCNTI6IHJldHVybiAiR0xfTElHSFRfTU9ERUxfVFdPX1NJREUiOworICAgIGNhc2UgMHgwQjUzOiByZXR1cm4gIkdMX0xJR0hUX01PREVMX0FNQklFTlQiOworICAgIGNhc2UgMHgwQjU0OiByZXR1cm4gIkdMX1NIQURFX01PREVMIjsKKyAgICBjYXNlIDB4MEI1NzogcmV0dXJuICJHTF9DT0xPUl9NQVRFUklBTCI7CisgICAgY2FzZSAweDBCNjA6IHJldHVybiAiR0xfRk9HIjsKKyAgICBjYXNlIDB4MEI2MjogcmV0dXJuICJHTF9GT0dfREVOU0lUWSI7CisgICAgY2FzZSAweDBCNjM6IHJldHVybiAiR0xfRk9HX1NUQVJUIjsKKyAgICBjYXNlIDB4MEI2NDogcmV0dXJuICJHTF9GT0dfRU5EIjsKKyAgICBjYXNlIDB4MEI2NTogcmV0dXJuICJHTF9GT0dfTU9ERSI7CisgICAgY2FzZSAweDBCNjY6IHJldHVybiAiR0xfRk9HX0NPTE9SIjsKKyAgICBjYXNlIDB4MEI3MDogcmV0dXJuICJHTF9ERVBUSF9SQU5HRSI7CisgICAgY2FzZSAweDBCNzE6IHJldHVybiAiR0xfREVQVEhfVEVTVCI7CisgICAgY2FzZSAweDBCNzI6IHJldHVybiAiR0xfREVQVEhfV1JJVEVNQVNLIjsKKyAgICBjYXNlIDB4MEI3MzogcmV0dXJuICJHTF9ERVBUSF9DTEVBUl9WQUxVRSI7CisgICAgY2FzZSAweDBCNzQ6IHJldHVybiAiR0xfREVQVEhfRlVOQyI7CisgICAgY2FzZSAweDBCOTA6IHJldHVybiAiR0xfU1RFTkNJTF9URVNUIjsKKyAgICBjYXNlIDB4MEI5MTogcmV0dXJuICJHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFIjsKKyAgICBjYXNlIDB4MEI5MjogcmV0dXJuICJHTF9TVEVOQ0lMX0ZVTkMiOworICAgIGNhc2UgMHgwQjkzOiByZXR1cm4gIkdMX1NURU5DSUxfVkFMVUVfTUFTSyI7CisgICAgY2FzZSAweDBCOTQ6IHJldHVybiAiR0xfU1RFTkNJTF9GQUlMIjsKKyAgICBjYXNlIDB4MEI5NTogcmV0dXJuICJHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCI7CisgICAgY2FzZSAweDBCOTY6IHJldHVybiAiR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MiOworICAgIGNhc2UgMHgwQjk3OiByZXR1cm4gIkdMX1NURU5DSUxfUkVGIjsKKyAgICBjYXNlIDB4MEI5ODogcmV0dXJuICJHTF9TVEVOQ0lMX1dSSVRFTUFTSyI7CisgICAgY2FzZSAweDBCQTA6IHJldHVybiAiR0xfTUFUUklYX01PREUiOworICAgIGNhc2UgMHgwQkExOiByZXR1cm4gIkdMX05PUk1BTElaRSI7CisgICAgY2FzZSAweDBCQTI6IHJldHVybiAiR0xfVklFV1BPUlQiOworICAgIGNhc2UgMHgwQkEzOiByZXR1cm4gIkdMX01PREVMVklFV19TVEFDS19ERVBUSCI7CisgICAgY2FzZSAweDBCQTQ6IHJldHVybiAiR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCI7CisgICAgY2FzZSAweDBCQTU6IHJldHVybiAiR0xfVEVYVFVSRV9TVEFDS19ERVBUSCI7CisgICAgY2FzZSAweDBCQTY6IHJldHVybiAiR0xfTU9ERUxWSUVXX01BVFJJWCI7CisgICAgY2FzZSAweDBCQTc6IHJldHVybiAiR0xfUFJPSkVDVElPTl9NQVRSSVgiOworICAgIGNhc2UgMHgwQkE4OiByZXR1cm4gIkdMX1RFWFRVUkVfTUFUUklYIjsKKyAgICBjYXNlIDB4MEJDMDogcmV0dXJuICJHTF9BTFBIQV9URVNUIjsKKyAgICBjYXNlIDB4MEJDMTogcmV0dXJuICJHTF9BTFBIQV9URVNUX0ZVTkMiOworICAgIGNhc2UgMHgwQkMyOiByZXR1cm4gIkdMX0FMUEhBX1RFU1RfUkVGIjsKKyAgICBjYXNlIDB4MEJEMDogcmV0dXJuICJHTF9ESVRIRVIiOworICAgIGNhc2UgMHgwQkUwOiByZXR1cm4gIkdMX0JMRU5EX0RTVCI7CisgICAgY2FzZSAweDBCRTE6IHJldHVybiAiR0xfQkxFTkRfU1JDIjsKKyAgICBjYXNlIDB4MEJFMjogcmV0dXJuICJHTF9CTEVORCI7CisgICAgY2FzZSAweDBCRjA6IHJldHVybiAiR0xfTE9HSUNfT1BfTU9ERSI7CisgICAgY2FzZSAweDBCRjI6IHJldHVybiAiR0xfQ09MT1JfTE9HSUNfT1AiOworICAgIGNhc2UgMHgwQzEwOiByZXR1cm4gIkdMX1NDSVNTT1JfQk9YIjsKKyAgICBjYXNlIDB4MEMxMTogcmV0dXJuICJHTF9TQ0lTU09SX1RFU1QiOworICAgIGNhc2UgMHgwQzIyOiByZXR1cm4gIkdMX0NPTE9SX0NMRUFSX1ZBTFVFIjsKKyAgICBjYXNlIDB4MEMyMzogcmV0dXJuICJHTF9DT0xPUl9XUklURU1BU0siOworICAgIGNhc2UgMHgwQzUwOiByZXR1cm4gIkdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCI7CisgICAgY2FzZSAweDBDNTE6IHJldHVybiAiR0xfUE9JTlRfU01PT1RIX0hJTlQiOworICAgIGNhc2UgMHgwQzUyOiByZXR1cm4gIkdMX0xJTkVfU01PT1RIX0hJTlQiOworICAgIGNhc2UgMHgwQzU0OiByZXR1cm4gIkdMX0ZPR19ISU5UIjsKKyAgICBjYXNlIDB4MENGNTogcmV0dXJuICJHTF9VTlBBQ0tfQUxJR05NRU5UIjsKKyAgICBjYXNlIDB4MEQwNTogcmV0dXJuICJHTF9QQUNLX0FMSUdOTUVOVCI7CisgICAgY2FzZSAweDBEMUM6IHJldHVybiAiR0xfQUxQSEFfU0NBTEUiOworICAgIGNhc2UgMHgwRDMxOiByZXR1cm4gIkdMX01BWF9MSUdIVFMiOworICAgIGNhc2UgMHgwRDMyOiByZXR1cm4gIkdMX01BWF9DTElQX1BMQU5FUyI7CisgICAgY2FzZSAweDBEMzM6IHJldHVybiAiR0xfTUFYX1RFWFRVUkVfU0laRSI7CisgICAgY2FzZSAweDBEMzY6IHJldHVybiAiR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCI7CisgICAgY2FzZSAweDBEMzg6IHJldHVybiAiR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgiOworICAgIGNhc2UgMHgwRDM5OiByZXR1cm4gIkdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIIjsKKyAgICBjYXNlIDB4MEQzQTogcmV0dXJuICJHTF9NQVhfVklFV1BPUlRfRElNUyI7CisgICAgY2FzZSAweDBENTA6IHJldHVybiAiR0xfU1VCUElYRUxfQklUUyI7CisgICAgY2FzZSAweDBENTI6IHJldHVybiAiR0xfUkVEX0JJVFMiOworICAgIGNhc2UgMHgwRDUzOiByZXR1cm4gIkdMX0dSRUVOX0JJVFMiOworICAgIGNhc2UgMHgwRDU0OiByZXR1cm4gIkdMX0JMVUVfQklUUyI7CisgICAgY2FzZSAweDBENTU6IHJldHVybiAiR0xfQUxQSEFfQklUUyI7CisgICAgY2FzZSAweDBENTY6IHJldHVybiAiR0xfREVQVEhfQklUUyI7CisgICAgY2FzZSAweDBENTc6IHJldHVybiAiR0xfU1RFTkNJTF9CSVRTIjsKKyAgICBjYXNlIDB4MERFMTogcmV0dXJuICJHTF9URVhUVVJFXzJEIjsKKyAgICBjYXNlIDB4MTEwMDogcmV0dXJuICJHTF9ET05UX0NBUkUiOworICAgIGNhc2UgMHgxMTAxOiByZXR1cm4gIkdMX0ZBU1RFU1QiOworICAgIGNhc2UgMHgxMTAyOiByZXR1cm4gIkdMX05JQ0VTVCI7CisgICAgY2FzZSAweDEyMDA6IHJldHVybiAiR0xfQU1CSUVOVCI7CisgICAgY2FzZSAweDEyMDE6IHJldHVybiAiR0xfRElGRlVTRSI7CisgICAgY2FzZSAweDEyMDI6IHJldHVybiAiR0xfU1BFQ1VMQVIiOworICAgIGNhc2UgMHgxMjAzOiByZXR1cm4gIkdMX1BPU0lUSU9OIjsKKyAgICBjYXNlIDB4MTIwNDogcmV0dXJuICJHTF9TUE9UX0RJUkVDVElPTiI7CisgICAgY2FzZSAweDEyMDU6IHJldHVybiAiR0xfU1BPVF9FWFBPTkVOVCI7CisgICAgY2FzZSAweDEyMDY6IHJldHVybiAiR0xfU1BPVF9DVVRPRkYiOworICAgIGNhc2UgMHgxMjA3OiByZXR1cm4gIkdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OIjsKKyAgICBjYXNlIDB4MTIwODogcmV0dXJuICJHTF9MSU5FQVJfQVRURU5VQVRJT04iOworICAgIGNhc2UgMHgxMjA5OiByZXR1cm4gIkdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiI7CisgICAgY2FzZSAweDE0MDA6IHJldHVybiAiR0xfQllURSI7CisgICAgY2FzZSAweDE0MDE6IHJldHVybiAiR0xfVU5TSUdORURfQllURSI7CisgICAgY2FzZSAweDE0MDI6IHJldHVybiAiR0xfU0hPUlQiOworICAgIGNhc2UgMHgxNDAzOiByZXR1cm4gIkdMX1VOU0lHTkVEX1NIT1JUIjsKKyAgICBjYXNlIDB4MTQwNDogcmV0dXJuICJHTF9JTlQiOworICAgIGNhc2UgMHgxNDA1OiByZXR1cm4gIkdMX1VOU0lHTkVEX0lOVCI7CisgICAgY2FzZSAweDE0MDY6IHJldHVybiAiR0xfRkxPQVQiOworICAgIGNhc2UgMHgxNDBDOiByZXR1cm4gIkdMX0ZJWEVEIjsKKyAgICBjYXNlIDB4MTUwMDogcmV0dXJuICJHTF9DTEVBUiI7CisgICAgY2FzZSAweDE1MDE6IHJldHVybiAiR0xfQU5EIjsKKyAgICBjYXNlIDB4MTUwMjogcmV0dXJuICJHTF9BTkRfUkVWRVJTRSI7CisgICAgY2FzZSAweDE1MDM6IHJldHVybiAiR0xfQ09QWSI7CisgICAgY2FzZSAweDE1MDQ6IHJldHVybiAiR0xfQU5EX0lOVkVSVEVEIjsKKyAgICBjYXNlIDB4MTUwNTogcmV0dXJuICJHTF9OT09QIjsKKyAgICBjYXNlIDB4MTUwNjogcmV0dXJuICJHTF9YT1IiOworICAgIGNhc2UgMHgxNTA3OiByZXR1cm4gIkdMX09SIjsKKyAgICBjYXNlIDB4MTUwODogcmV0dXJuICJHTF9OT1IiOworICAgIGNhc2UgMHgxNTA5OiByZXR1cm4gIkdMX0VRVUlWIjsKKyAgICBjYXNlIDB4MTUwQTogcmV0dXJuICJHTF9JTlZFUlQiOworICAgIGNhc2UgMHgxNTBCOiByZXR1cm4gIkdMX09SX1JFVkVSU0UiOworICAgIGNhc2UgMHgxNTBDOiByZXR1cm4gIkdMX0NPUFlfSU5WRVJURUQiOworICAgIGNhc2UgMHgxNTBEOiByZXR1cm4gIkdMX09SX0lOVkVSVEVEIjsKKyAgICBjYXNlIDB4MTUwRTogcmV0dXJuICJHTF9OQU5EIjsKKyAgICBjYXNlIDB4MTUwRjogcmV0dXJuICJHTF9TRVQiOworICAgIGNhc2UgMHgxNjAwOiByZXR1cm4gIkdMX0VNSVNTSU9OIjsKKyAgICBjYXNlIDB4MTYwMTogcmV0dXJuICJHTF9TSElOSU5FU1MiOworICAgIGNhc2UgMHgxNjAyOiByZXR1cm4gIkdMX0FNQklFTlRfQU5EX0RJRkZVU0UiOworICAgIGNhc2UgMHgxNzAwOiByZXR1cm4gIkdMX01PREVMVklFVyI7CisgICAgY2FzZSAweDE3MDE6IHJldHVybiAiR0xfUFJPSkVDVElPTiI7CisgICAgY2FzZSAweDE3MDI6IHJldHVybiAiR0xfVEVYVFVSRSI7CisgICAgY2FzZSAweDE5MDE6IHJldHVybiAiR0xfU1RFTkNJTF9JTkRFWCI7CisgICAgY2FzZSAweDE5MDI6IHJldHVybiAiR0xfREVQVEhfQ09NUE9ORU5UIjsKKyAgICBjYXNlIDB4MTkwNjogcmV0dXJuICJHTF9BTFBIQSI7CisgICAgY2FzZSAweDE5MDc6IHJldHVybiAiR0xfUkdCIjsKKyAgICBjYXNlIDB4MTkwODogcmV0dXJuICJHTF9SR0JBIjsKKyAgICBjYXNlIDB4MTkwOTogcmV0dXJuICJHTF9MVU1JTkFOQ0UiOworICAgIGNhc2UgMHgxOTBBOiByZXR1cm4gIkdMX0xVTUlOQU5DRV9BTFBIQSI7CisgICAgY2FzZSAweDFEMDA6IHJldHVybiAiR0xfRkxBVCI7CisgICAgY2FzZSAweDFEMDE6IHJldHVybiAiR0xfU01PT1RIIjsKKyAgICBjYXNlIDB4MUUwMDogcmV0dXJuICJHTF9LRUVQIjsKKyAgICBjYXNlIDB4MUUwMTogcmV0dXJuICJHTF9SRVBMQUNFIjsKKyAgICBjYXNlIDB4MUUwMjogcmV0dXJuICJHTF9JTkNSIjsKKyAgICBjYXNlIDB4MUUwMzogcmV0dXJuICJHTF9ERUNSIjsKKyAgICBjYXNlIDB4MUYwMDogcmV0dXJuICJHTF9WRU5ET1IiOworICAgIGNhc2UgMHgxRjAxOiByZXR1cm4gIkdMX1JFTkRFUkVSIjsKKyAgICBjYXNlIDB4MUYwMjogcmV0dXJuICJHTF9WRVJTSU9OIjsKKyAgICBjYXNlIDB4MUYwMzogcmV0dXJuICJHTF9FWFRFTlNJT05TIjsKKyAgICBjYXNlIDB4MjEwMDogcmV0dXJuICJHTF9NT0RVTEFURSI7CisgICAgY2FzZSAweDIxMDE6IHJldHVybiAiR0xfREVDQUwiOworICAgIGNhc2UgMHgyMjAwOiByZXR1cm4gIkdMX1RFWFRVUkVfRU5WX01PREUiOworICAgIGNhc2UgMHgyMjAxOiByZXR1cm4gIkdMX1RFWFRVUkVfRU5WX0NPTE9SIjsKKyAgICBjYXNlIDB4MjMwMDogcmV0dXJuICJHTF9URVhUVVJFX0VOViI7CisgICAgY2FzZSAweDI1MDA6IHJldHVybiAiR0xfVEVYVFVSRV9HRU5fTU9ERV9PRVMiOworICAgIGNhc2UgMHgyNjAwOiByZXR1cm4gIkdMX05FQVJFU1QiOworICAgIGNhc2UgMHgyNjAxOiByZXR1cm4gIkdMX0xJTkVBUiI7CisgICAgY2FzZSAweDI3MDA6IHJldHVybiAiR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCI7CisgICAgY2FzZSAweDI3MDE6IHJldHVybiAiR0xfTElORUFSX01JUE1BUF9ORUFSRVNUIjsKKyAgICBjYXNlIDB4MjcwMjogcmV0dXJuICJHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIiOworICAgIGNhc2UgMHgyNzAzOiByZXR1cm4gIkdMX0xJTkVBUl9NSVBNQVBfTElORUFSIjsKKyAgICBjYXNlIDB4MjgwMDogcmV0dXJuICJHTF9URVhUVVJFX01BR19GSUxURVIiOworICAgIGNhc2UgMHgyODAxOiByZXR1cm4gIkdMX1RFWFRVUkVfTUlOX0ZJTFRFUiI7CisgICAgY2FzZSAweDI4MDI6IHJldHVybiAiR0xfVEVYVFVSRV9XUkFQX1MiOworICAgIGNhc2UgMHgyODAzOiByZXR1cm4gIkdMX1RFWFRVUkVfV1JBUF9UIjsKKyAgICBjYXNlIDB4MjkwMTogcmV0dXJuICJHTF9SRVBFQVQiOworICAgIGNhc2UgMHgyQTAwOiByZXR1cm4gIkdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTIjsKKyAgICBjYXNlIDB4MzAwMDogcmV0dXJuICJHTF9DTElQX1BMQU5FMCI7CisgICAgY2FzZSAweDMwMDE6IHJldHVybiAiR0xfQ0xJUF9QTEFORTEiOworICAgIGNhc2UgMHgzMDAyOiByZXR1cm4gIkdMX0NMSVBfUExBTkUyIjsKKyAgICBjYXNlIDB4MzAwMzogcmV0dXJuICJHTF9DTElQX1BMQU5FMyI7CisgICAgY2FzZSAweDMwMDQ6IHJldHVybiAiR0xfQ0xJUF9QTEFORTQiOworICAgIGNhc2UgMHgzMDA1OiByZXR1cm4gIkdMX0NMSVBfUExBTkU1IjsKKyAgICBjYXNlIDB4MzAwRTogcmV0dXJuICJHTF9DT05URVhUX0xPU1QiOworICAgIGNhc2UgMHg0MDAwOiByZXR1cm4gIkdMX0xJR0hUMCI7CisgICAgY2FzZSAweDQwMDE6IHJldHVybiAiR0xfTElHSFQxIjsKKyAgICBjYXNlIDB4NDAwMjogcmV0dXJuICJHTF9MSUdIVDIiOworICAgIGNhc2UgMHg0MDAzOiByZXR1cm4gIkdMX0xJR0hUMyI7CisgICAgY2FzZSAweDQwMDQ6IHJldHVybiAiR0xfTElHSFQ0IjsKKyAgICBjYXNlIDB4NDAwNTogcmV0dXJuICJHTF9MSUdIVDUiOworICAgIGNhc2UgMHg0MDA2OiByZXR1cm4gIkdMX0xJR0hUNiI7CisgICAgY2FzZSAweDQwMDc6IHJldHVybiAiR0xfTElHSFQ3IjsKKyAgICBjYXNlIDB4ODAwMTogcmV0dXJuICJHTF9DT05TVEFOVF9DT0xPUiI7CisgICAgY2FzZSAweDgwMDI6IHJldHVybiAiR0xfT05FX01JTlVTX0NPTlNUQU5UX0NPTE9SIjsKKyAgICBjYXNlIDB4ODAwMzogcmV0dXJuICJHTF9DT05TVEFOVF9BTFBIQSI7CisgICAgY2FzZSAweDgwMDQ6IHJldHVybiAiR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBIjsKKyAgICBjYXNlIDB4ODAwNTogcmV0dXJuICJHTF9CTEVORF9DT0xPUiI7CisgICAgY2FzZSAweDgwMDY6IHJldHVybiAiR0xfRlVOQ19BREQiOworICAgIGNhc2UgMHg4MDA5OiByZXR1cm4gIkdMX0JMRU5EX0VRVUFUSU9OIjsKKyAgICBjYXNlIDB4ODAwQTogcmV0dXJuICJHTF9GVU5DX1NVQlRSQUNUIjsKKyAgICBjYXNlIDB4ODAwQjogcmV0dXJuICJHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QiOworICAgIGNhc2UgMHg4MDMzOiByZXR1cm4gIkdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQiOworICAgIGNhc2UgMHg4MDM0OiByZXR1cm4gIkdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEiOworICAgIGNhc2UgMHg4MDM3OiByZXR1cm4gIkdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwiOworICAgIGNhc2UgMHg4MDM4OiByZXR1cm4gIkdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiI7CisgICAgY2FzZSAweDgwM0E6IHJldHVybiAiR0xfUkVTQ0FMRV9OT1JNQUwiOworICAgIGNhc2UgMHg4MDU2OiByZXR1cm4gIkdMX1JHQkE0IjsKKyAgICBjYXNlIDB4ODA1NzogcmV0dXJuICJHTF9SR0I1X0ExIjsKKyAgICBjYXNlIDB4ODA2OTogcmV0dXJuICJHTF9URVhUVVJFX0JJTkRJTkdfMkQiOworICAgIGNhc2UgMHg4MDc0OiByZXR1cm4gIkdMX1ZFUlRFWF9BUlJBWSI7CisgICAgY2FzZSAweDgwNzU6IHJldHVybiAiR0xfTk9STUFMX0FSUkFZIjsKKyAgICBjYXNlIDB4ODA3NjogcmV0dXJuICJHTF9DT0xPUl9BUlJBWSI7CisgICAgY2FzZSAweDgwNzg6IHJldHVybiAiR0xfVEVYVFVSRV9DT09SRF9BUlJBWSI7CisgICAgY2FzZSAweDgwN0E6IHJldHVybiAiR0xfVkVSVEVYX0FSUkFZX1NJWkUiOworICAgIGNhc2UgMHg4MDdCOiByZXR1cm4gIkdMX1ZFUlRFWF9BUlJBWV9UWVBFIjsKKyAgICBjYXNlIDB4ODA3QzogcmV0dXJuICJHTF9WRVJURVhfQVJSQVlfU1RSSURFIjsKKyAgICBjYXNlIDB4ODA3RTogcmV0dXJuICJHTF9OT1JNQUxfQVJSQVlfVFlQRSI7CisgICAgY2FzZSAweDgwN0Y6IHJldHVybiAiR0xfTk9STUFMX0FSUkFZX1NUUklERSI7CisgICAgY2FzZSAweDgwODE6IHJldHVybiAiR0xfQ09MT1JfQVJSQVlfU0laRSI7CisgICAgY2FzZSAweDgwODI6IHJldHVybiAiR0xfQ09MT1JfQVJSQVlfVFlQRSI7CisgICAgY2FzZSAweDgwODM6IHJldHVybiAiR0xfQ09MT1JfQVJSQVlfU1RSSURFIjsKKyAgICBjYXNlIDB4ODA4ODogcmV0dXJuICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUiOworICAgIGNhc2UgMHg4MDg5OiByZXR1cm4gIkdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSI7CisgICAgY2FzZSAweDgwOEE6IHJldHVybiAiR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUiOworICAgIGNhc2UgMHg4MDhFOiByZXR1cm4gIkdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSIjsKKyAgICBjYXNlIDB4ODA4RjogcmV0dXJuICJHTF9OT1JNQUxfQVJSQVlfUE9JTlRFUiI7CisgICAgY2FzZSAweDgwOTA6IHJldHVybiAiR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiI7CisgICAgY2FzZSAweDgwOTI6IHJldHVybiAiR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSIjsKKyAgICBjYXNlIDB4ODA5RDogcmV0dXJuICJHTF9NVUxUSVNBTVBMRSI7CisgICAgY2FzZSAweDgwOUU6IHJldHVybiAiR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFIjsKKyAgICBjYXNlIDB4ODA5RjogcmV0dXJuICJHTF9TQU1QTEVfQUxQSEFfVE9fT05FIjsKKyAgICBjYXNlIDB4ODBBMDogcmV0dXJuICJHTF9TQU1QTEVfQ09WRVJBR0UiOworICAgIGNhc2UgMHg4MEE4OiByZXR1cm4gIkdMX1NBTVBMRV9CVUZGRVJTIjsKKyAgICBjYXNlIDB4ODBBOTogcmV0dXJuICJHTF9TQU1QTEVTIjsKKyAgICBjYXNlIDB4ODBBQTogcmV0dXJuICJHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUiOworICAgIGNhc2UgMHg4MEFCOiByZXR1cm4gIkdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQiOworICAgIGNhc2UgMHg4MEM4OiByZXR1cm4gIkdMX0JMRU5EX0RTVF9SR0IiOworICAgIGNhc2UgMHg4MEM5OiByZXR1cm4gIkdMX0JMRU5EX1NSQ19SR0IiOworICAgIGNhc2UgMHg4MENBOiByZXR1cm4gIkdMX0JMRU5EX0RTVF9BTFBIQSI7CisgICAgY2FzZSAweDgwQ0I6IHJldHVybiAiR0xfQkxFTkRfU1JDX0FMUEhBIjsKKyAgICBjYXNlIDB4ODEyNjogcmV0dXJuICJHTF9QT0lOVF9TSVpFX01JTiI7CisgICAgY2FzZSAweDgxMjc6IHJldHVybiAiR0xfUE9JTlRfU0laRV9NQVgiOworICAgIGNhc2UgMHg4MTI4OiByZXR1cm4gIkdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUiOworICAgIGNhc2UgMHg4MTI5OiByZXR1cm4gIkdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OIjsKKyAgICBjYXNlIDB4ODEyRjogcmV0dXJuICJHTF9DTEFNUF9UT19FREdFIjsKKyAgICBjYXNlIDB4ODE5MTogcmV0dXJuICJHTF9HRU5FUkFURV9NSVBNQVAiOworICAgIGNhc2UgMHg4MTkyOiByZXR1cm4gIkdMX0dFTkVSQVRFX01JUE1BUF9ISU5UIjsKKyAgICBjYXNlIDB4ODFBNTogcmV0dXJuICJHTF9ERVBUSF9DT01QT05FTlQxNiI7CisgICAgY2FzZSAweDgxQTY6IHJldHVybiAiR0xfREVQVEhfQ09NUE9ORU5UMjRfT0VTIjsKKyAgICBjYXNlIDB4ODFBNzogcmV0dXJuICJHTF9ERVBUSF9DT01QT05FTlQzMl9PRVMiOworICAgIGNhc2UgMHg4MzYzOiByZXR1cm4gIkdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IjsKKyAgICBjYXNlIDB4ODM3MDogcmV0dXJuICJHTF9NSVJST1JFRF9SRVBFQVQiOworICAgIGNhc2UgMHg4NDZEOiByZXR1cm4gIkdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSI7CisgICAgY2FzZSAweDg0NkU6IHJldHVybiAiR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFIjsKKyAgICBjYXNlIDB4ODRDMDogcmV0dXJuICJHTF9URVhUVVJFMCI7CisgICAgY2FzZSAweDg0QzE6IHJldHVybiAiR0xfVEVYVFVSRTEiOworICAgIGNhc2UgMHg4NEMyOiByZXR1cm4gIkdMX1RFWFRVUkUyIjsKKyAgICBjYXNlIDB4ODRDMzogcmV0dXJuICJHTF9URVhUVVJFMyI7CisgICAgY2FzZSAweDg0QzQ6IHJldHVybiAiR0xfVEVYVFVSRTQiOworICAgIGNhc2UgMHg4NEM1OiByZXR1cm4gIkdMX1RFWFRVUkU1IjsKKyAgICBjYXNlIDB4ODRDNjogcmV0dXJuICJHTF9URVhUVVJFNiI7CisgICAgY2FzZSAweDg0Qzc6IHJldHVybiAiR0xfVEVYVFVSRTciOworICAgIGNhc2UgMHg4NEM4OiByZXR1cm4gIkdMX1RFWFRVUkU4IjsKKyAgICBjYXNlIDB4ODRDOTogcmV0dXJuICJHTF9URVhUVVJFOSI7CisgICAgY2FzZSAweDg0Q0E6IHJldHVybiAiR0xfVEVYVFVSRTEwIjsKKyAgICBjYXNlIDB4ODRDQjogcmV0dXJuICJHTF9URVhUVVJFMTEiOworICAgIGNhc2UgMHg4NENDOiByZXR1cm4gIkdMX1RFWFRVUkUxMiI7CisgICAgY2FzZSAweDg0Q0Q6IHJldHVybiAiR0xfVEVYVFVSRTEzIjsKKyAgICBjYXNlIDB4ODRDRTogcmV0dXJuICJHTF9URVhUVVJFMTQiOworICAgIGNhc2UgMHg4NENGOiByZXR1cm4gIkdMX1RFWFRVUkUxNSI7CisgICAgY2FzZSAweDg0RDA6IHJldHVybiAiR0xfVEVYVFVSRTE2IjsKKyAgICBjYXNlIDB4ODREMTogcmV0dXJuICJHTF9URVhUVVJFMTciOworICAgIGNhc2UgMHg4NEQyOiByZXR1cm4gIkdMX1RFWFRVUkUxOCI7CisgICAgY2FzZSAweDg0RDM6IHJldHVybiAiR0xfVEVYVFVSRTE5IjsKKyAgICBjYXNlIDB4ODRENDogcmV0dXJuICJHTF9URVhUVVJFMjAiOworICAgIGNhc2UgMHg4NEQ1OiByZXR1cm4gIkdMX1RFWFRVUkUyMSI7CisgICAgY2FzZSAweDg0RDY6IHJldHVybiAiR0xfVEVYVFVSRTIyIjsKKyAgICBjYXNlIDB4ODRENzogcmV0dXJuICJHTF9URVhUVVJFMjMiOworICAgIGNhc2UgMHg4NEQ4OiByZXR1cm4gIkdMX1RFWFRVUkUyNCI7CisgICAgY2FzZSAweDg0RDk6IHJldHVybiAiR0xfVEVYVFVSRTI1IjsKKyAgICBjYXNlIDB4ODREQTogcmV0dXJuICJHTF9URVhUVVJFMjYiOworICAgIGNhc2UgMHg4NERCOiByZXR1cm4gIkdMX1RFWFRVUkUyNyI7CisgICAgY2FzZSAweDg0REM6IHJldHVybiAiR0xfVEVYVFVSRTI4IjsKKyAgICBjYXNlIDB4ODRERDogcmV0dXJuICJHTF9URVhUVVJFMjkiOworICAgIGNhc2UgMHg4NERFOiByZXR1cm4gIkdMX1RFWFRVUkUzMCI7CisgICAgY2FzZSAweDg0REY6IHJldHVybiAiR0xfVEVYVFVSRTMxIjsKKyAgICBjYXNlIDB4ODRFMDogcmV0dXJuICJHTF9BQ1RJVkVfVEVYVFVSRSI7CisgICAgY2FzZSAweDg0RTE6IHJldHVybiAiR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFIjsKKyAgICBjYXNlIDB4ODRFMjogcmV0dXJuICJHTF9NQVhfVEVYVFVSRV9VTklUUyI7CisgICAgY2FzZSAweDg0RTc6IHJldHVybiAiR0xfU1VCVFJBQ1QiOworICAgIGNhc2UgMHg4NEU4OiByZXR1cm4gIkdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSI7CisgICAgY2FzZSAweDg1MDc6IHJldHVybiAiR0xfSU5DUl9XUkFQIjsKKyAgICBjYXNlIDB4ODUwODogcmV0dXJuICJHTF9ERUNSX1dSQVAiOworICAgIGNhc2UgMHg4NTExOiByZXR1cm4gIkdMX05PUk1BTF9NQVBfT0VTIjsKKyAgICBjYXNlIDB4ODUxMjogcmV0dXJuICJHTF9SRUZMRUNUSU9OX01BUF9PRVMiOworICAgIGNhc2UgMHg4NTEzOiByZXR1cm4gIkdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTIjsKKyAgICBjYXNlIDB4ODUxNDogcmV0dXJuICJHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfT0VTIjsKKyAgICBjYXNlIDB4ODUxNTogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfT0VTIjsKKyAgICBjYXNlIDB4ODUxNjogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1hfT0VTIjsKKyAgICBjYXNlIDB4ODUxNzogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfT0VTIjsKKyAgICBjYXNlIDB4ODUxODogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfT0VTIjsKKyAgICBjYXNlIDB4ODUxOTogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1pfT0VTIjsKKyAgICBjYXNlIDB4ODUxQTogcmV0dXJuICJHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfT0VTIjsKKyAgICBjYXNlIDB4ODUxQzogcmV0dXJuICJHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX09FUyI7CisgICAgY2FzZSAweDg1NzA6IHJldHVybiAiR0xfQ09NQklORSI7CisgICAgY2FzZSAweDg1NzE6IHJldHVybiAiR0xfQ09NQklORV9SR0IiOworICAgIGNhc2UgMHg4NTcyOiByZXR1cm4gIkdMX0NPTUJJTkVfQUxQSEEiOworICAgIGNhc2UgMHg4NTczOiByZXR1cm4gIkdMX1JHQl9TQ0FMRSI7CisgICAgY2FzZSAweDg1NzQ6IHJldHVybiAiR0xfQUREX1NJR05FRCI7CisgICAgY2FzZSAweDg1NzU6IHJldHVybiAiR0xfSU5URVJQT0xBVEUiOworICAgIGNhc2UgMHg4NTc2OiByZXR1cm4gIkdMX0NPTlNUQU5UIjsKKyAgICBjYXNlIDB4ODU3NzogcmV0dXJuICJHTF9QUklNQVJZX0NPTE9SIjsKKyAgICBjYXNlIDB4ODU3ODogcmV0dXJuICJHTF9QUkVWSU9VUyI7CisgICAgY2FzZSAweDg1ODA6IHJldHVybiAiR0xfU1JDMF9SR0IiOworICAgIGNhc2UgMHg4NTgxOiByZXR1cm4gIkdMX1NSQzFfUkdCIjsKKyAgICBjYXNlIDB4ODU4MjogcmV0dXJuICJHTF9TUkMyX1JHQiI7CisgICAgY2FzZSAweDg1ODg6IHJldHVybiAiR0xfU1JDMF9BTFBIQSI7CisgICAgY2FzZSAweDg1ODk6IHJldHVybiAiR0xfU1JDMV9BTFBIQSI7CisgICAgY2FzZSAweDg1OEE6IHJldHVybiAiR0xfU1JDMl9BTFBIQSI7CisgICAgY2FzZSAweDg1OTA6IHJldHVybiAiR0xfT1BFUkFORDBfUkdCIjsKKyAgICBjYXNlIDB4ODU5MTogcmV0dXJuICJHTF9PUEVSQU5EMV9SR0IiOworICAgIGNhc2UgMHg4NTkyOiByZXR1cm4gIkdMX09QRVJBTkQyX1JHQiI7CisgICAgY2FzZSAweDg1OTg6IHJldHVybiAiR0xfT1BFUkFORDBfQUxQSEEiOworICAgIGNhc2UgMHg4NTk5OiByZXR1cm4gIkdMX09QRVJBTkQxX0FMUEhBIjsKKyAgICBjYXNlIDB4ODU5QTogcmV0dXJuICJHTF9PUEVSQU5EMl9BTFBIQSI7CisgICAgY2FzZSAweDg2MjI6IHJldHVybiAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEIjsKKyAgICBjYXNlIDB4ODYyMzogcmV0dXJuICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUiOworICAgIGNhc2UgMHg4NjI0OiByZXR1cm4gIkdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFIjsKKyAgICBjYXNlIDB4ODYyNTogcmV0dXJuICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUiOworICAgIGNhc2UgMHg4NjI2OiByZXR1cm4gIkdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiI7CisgICAgY2FzZSAweDg2NDU6IHJldHVybiAiR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSIjsKKyAgICBjYXNlIDB4ODZBMjogcmV0dXJuICJHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiOworICAgIGNhc2UgMHg4NkEzOiByZXR1cm4gIkdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIjsKKyAgICBjYXNlIDB4ODZBRTogcmV0dXJuICJHTF9ET1QzX1JHQiI7CisgICAgY2FzZSAweDg2QUY6IHJldHVybiAiR0xfRE9UM19SR0JBIjsKKyAgICBjYXNlIDB4ODc2NDogcmV0dXJuICJHTF9CVUZGRVJfU0laRSI7CisgICAgY2FzZSAweDg3NjU6IHJldHVybiAiR0xfQlVGRkVSX1VTQUdFIjsKKyAgICBjYXNlIDB4ODgwMDogcmV0dXJuICJHTF9TVEVOQ0lMX0JBQ0tfRlVOQyI7CisgICAgY2FzZSAweDg4MDE6IHJldHVybiAiR0xfU1RFTkNJTF9CQUNLX0ZBSUwiOworICAgIGNhc2UgMHg4ODAyOiByZXR1cm4gIkdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwiOworICAgIGNhc2UgMHg4ODAzOiByZXR1cm4gIkdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MiOworICAgIGNhc2UgMHg4ODNEOiByZXR1cm4gIkdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBIjsKKyAgICBjYXNlIDB4ODg2MTogcmV0dXJuICJHTF9QT0lOVF9TUFJJVEVfT0VTIjsKKyAgICBjYXNlIDB4ODg2MjogcmV0dXJuICJHTF9DT09SRF9SRVBMQUNFX09FUyI7CisgICAgY2FzZSAweDg4Njk6IHJldHVybiAiR0xfTUFYX1ZFUlRFWF9BVFRSSUJTIjsKKyAgICBjYXNlIDB4ODg2QTogcmV0dXJuICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQiOworICAgIGNhc2UgMHg4ODcyOiByZXR1cm4gIkdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTIjsKKyAgICBjYXNlIDB4ODg5MjogcmV0dXJuICJHTF9BUlJBWV9CVUZGRVIiOworICAgIGNhc2UgMHg4ODkzOiByZXR1cm4gIkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSIjsKKyAgICBjYXNlIDB4ODg5NDogcmV0dXJuICJHTF9BUlJBWV9CVUZGRVJfQklORElORyI7CisgICAgY2FzZSAweDg4OTU6IHJldHVybiAiR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyI7CisgICAgY2FzZSAweDg4OTY6IHJldHVybiAiR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HIjsKKyAgICBjYXNlIDB4ODg5NzogcmV0dXJuICJHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkciOworICAgIGNhc2UgMHg4ODk4OiByZXR1cm4gIkdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HIjsKKyAgICBjYXNlIDB4ODg5QTogcmV0dXJuICJHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HIjsKKyAgICBjYXNlIDB4ODg5RjogcmV0dXJuICJHTF9WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5HIjsKKyAgICBjYXNlIDB4ODhFMDogcmV0dXJuICJHTF9TVFJFQU1fRFJBVyI7CisgICAgY2FzZSAweDg4RTQ6IHJldHVybiAiR0xfU1RBVElDX0RSQVciOworICAgIGNhc2UgMHg4OEU4OiByZXR1cm4gIkdMX0RZTkFNSUNfRFJBVyI7CisgICAgY2FzZSAweDg5OEE6IHJldHVybiAiR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyI7CisgICAgY2FzZSAweDg5OEI6IHJldHVybiAiR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTIjsKKyAgICBjYXNlIDB4ODk4QzogcmV0dXJuICJHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTIjsKKyAgICBjYXNlIDB4OEIzMDogcmV0dXJuICJHTF9GUkFHTUVOVF9TSEFERVIiOworICAgIGNhc2UgMHg4QjMxOiByZXR1cm4gIkdMX1ZFUlRFWF9TSEFERVIiOworICAgIGNhc2UgMHg4QjRDOiByZXR1cm4gIkdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyI7CisgICAgY2FzZSAweDhCNEQ6IHJldHVybiAiR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMiOworICAgIGNhc2UgMHg4QjRGOiByZXR1cm4gIkdMX1NIQURFUl9UWVBFIjsKKyAgICBjYXNlIDB4OEI1MDogcmV0dXJuICJHTF9GTE9BVF9WRUMyIjsKKyAgICBjYXNlIDB4OEI1MTogcmV0dXJuICJHTF9GTE9BVF9WRUMzIjsKKyAgICBjYXNlIDB4OEI1MjogcmV0dXJuICJHTF9GTE9BVF9WRUM0IjsKKyAgICBjYXNlIDB4OEI1MzogcmV0dXJuICJHTF9JTlRfVkVDMiI7CisgICAgY2FzZSAweDhCNTQ6IHJldHVybiAiR0xfSU5UX1ZFQzMiOworICAgIGNhc2UgMHg4QjU1OiByZXR1cm4gIkdMX0lOVF9WRUM0IjsKKyAgICBjYXNlIDB4OEI1NjogcmV0dXJuICJHTF9CT09MIjsKKyAgICBjYXNlIDB4OEI1NzogcmV0dXJuICJHTF9CT09MX1ZFQzIiOworICAgIGNhc2UgMHg4QjU4OiByZXR1cm4gIkdMX0JPT0xfVkVDMyI7CisgICAgY2FzZSAweDhCNTk6IHJldHVybiAiR0xfQk9PTF9WRUM0IjsKKyAgICBjYXNlIDB4OEI1QTogcmV0dXJuICJHTF9GTE9BVF9NQVQyIjsKKyAgICBjYXNlIDB4OEI1QjogcmV0dXJuICJHTF9GTE9BVF9NQVQzIjsKKyAgICBjYXNlIDB4OEI1QzogcmV0dXJuICJHTF9GTE9BVF9NQVQ0IjsKKyAgICBjYXNlIDB4OEI1RTogcmV0dXJuICJHTF9TQU1QTEVSXzJEIjsKKyAgICBjYXNlIDB4OEI2MDogcmV0dXJuICJHTF9TQU1QTEVSX0NVQkUiOworICAgIGNhc2UgMHg4QjgwOiByZXR1cm4gIkdMX0RFTEVURV9TVEFUVVMiOworICAgIGNhc2UgMHg4QjgxOiByZXR1cm4gIkdMX0NPTVBJTEVfU1RBVFVTIjsKKyAgICBjYXNlIDB4OEI4MjogcmV0dXJuICJHTF9MSU5LX1NUQVRVUyI7CisgICAgY2FzZSAweDhCODM6IHJldHVybiAiR0xfVkFMSURBVEVfU1RBVFVTIjsKKyAgICBjYXNlIDB4OEI4NDogcmV0dXJuICJHTF9JTkZPX0xPR19MRU5HVEgiOworICAgIGNhc2UgMHg4Qjg1OiByZXR1cm4gIkdMX0FUVEFDSEVEX1NIQURFUlMiOworICAgIGNhc2UgMHg4Qjg2OiByZXR1cm4gIkdMX0FDVElWRV9VTklGT1JNUyI7CisgICAgY2FzZSAweDhCODc6IHJldHVybiAiR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCI7CisgICAgY2FzZSAweDhCODg6IHJldHVybiAiR0xfU0hBREVSX1NPVVJDRV9MRU5HVEgiOworICAgIGNhc2UgMHg4Qjg5OiByZXR1cm4gIkdMX0FDVElWRV9BVFRSSUJVVEVTIjsKKyAgICBjYXNlIDB4OEI4QTogcmV0dXJuICJHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgiOworICAgIGNhc2UgMHg4QjhDOiByZXR1cm4gIkdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiI7CisgICAgY2FzZSAweDhCOEQ6IHJldHVybiAiR0xfQ1VSUkVOVF9QUk9HUkFNIjsKKyAgICBjYXNlIDB4OEI5MDogcmV0dXJuICJHTF9QQUxFVFRFNF9SR0I4X09FUyI7CisgICAgY2FzZSAweDhCOTE6IHJldHVybiAiR0xfUEFMRVRURTRfUkdCQThfT0VTIjsKKyAgICBjYXNlIDB4OEI5MjogcmV0dXJuICJHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMiOworICAgIGNhc2UgMHg4QjkzOiByZXR1cm4gIkdMX1BBTEVUVEU0X1JHQkE0X09FUyI7CisgICAgY2FzZSAweDhCOTQ6IHJldHVybiAiR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMiOworICAgIGNhc2UgMHg4Qjk1OiByZXR1cm4gIkdMX1BBTEVUVEU4X1JHQjhfT0VTIjsKKyAgICBjYXNlIDB4OEI5NjogcmV0dXJuICJHTF9QQUxFVFRFOF9SR0JBOF9PRVMiOworICAgIGNhc2UgMHg4Qjk3OiByZXR1cm4gIkdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyI7CisgICAgY2FzZSAweDhCOTg6IHJldHVybiAiR0xfUEFMRVRURThfUkdCQTRfT0VTIjsKKyAgICBjYXNlIDB4OEI5OTogcmV0dXJuICJHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyI7CisgICAgY2FzZSAweDhCOUE6IHJldHVybiAiR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIjsKKyAgICBjYXNlIDB4OEI5QjogcmV0dXJuICJHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCI7CisgICAgY2FzZSAweDhCOUM6IHJldHVybiAiR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMiOworICAgIGNhc2UgMHg4QjlEOiByZXR1cm4gIkdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTIjsKKyAgICBjYXNlIDB4OEI5RjogcmV0dXJuICJHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyI7CisgICAgY2FzZSAweDhDQTM6IHJldHVybiAiR0xfU1RFTkNJTF9CQUNLX1JFRiI7CisgICAgY2FzZSAweDhDQTQ6IHJldHVybiAiR0xfU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0siOworICAgIGNhc2UgMHg4Q0E1OiByZXR1cm4gIkdMX1NURU5DSUxfQkFDS19XUklURU1BU0siOworICAgIGNhc2UgMHg4Q0E2OiByZXR1cm4gIkdMX0ZSQU1FQlVGRkVSX0JJTkRJTkciOworICAgIGNhc2UgMHg4Q0E3OiByZXR1cm4gIkdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HIjsKKyAgICBjYXNlIDB4OENEMDogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFIjsKKyAgICBjYXNlIDB4OENEMTogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIjsKKyAgICBjYXNlIDB4OENEMjogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwiOworICAgIGNhc2UgMHg4Q0QzOiByZXR1cm4gIkdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIjsKKyAgICBjYXNlIDB4OENENTogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9DT01QTEVURSI7CisgICAgY2FzZSAweDhDRDY6IHJldHVybiAiR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIjsKKyAgICBjYXNlIDB4OENENzogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCI7CisgICAgY2FzZSAweDhDRDk6IHJldHVybiAiR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TIjsKKyAgICBjYXNlIDB4OENERDogcmV0dXJuICJHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCI7CisgICAgY2FzZSAweDhDRTA6IHJldHVybiAiR0xfQ09MT1JfQVRUQUNITUVOVDAiOworICAgIGNhc2UgMHg4RDAwOiByZXR1cm4gIkdMX0RFUFRIX0FUVEFDSE1FTlQiOworICAgIGNhc2UgMHg4RDIwOiByZXR1cm4gIkdMX1NURU5DSUxfQVRUQUNITUVOVCI7CisgICAgY2FzZSAweDhENDA6IHJldHVybiAiR0xfRlJBTUVCVUZGRVIiOworICAgIGNhc2UgMHg4RDQxOiByZXR1cm4gIkdMX1JFTkRFUkJVRkZFUiI7CisgICAgY2FzZSAweDhENDI6IHJldHVybiAiR0xfUkVOREVSQlVGRkVSX1dJRFRIIjsKKyAgICBjYXNlIDB4OEQ0MzogcmV0dXJuICJHTF9SRU5ERVJCVUZGRVJfSEVJR0hUIjsKKyAgICBjYXNlIDB4OEQ0NDogcmV0dXJuICJHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUIjsKKyAgICBjYXNlIDB4OEQ0ODogcmV0dXJuICJHTF9TVEVOQ0lMX0lOREVYOCI7CisgICAgY2FzZSAweDhENTA6IHJldHVybiAiR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFIjsKKyAgICBjYXNlIDB4OEQ1MTogcmV0dXJuICJHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRSI7CisgICAgY2FzZSAweDhENTI6IHJldHVybiAiR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSI7CisgICAgY2FzZSAweDhENTM6IHJldHVybiAiR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkUiOworICAgIGNhc2UgMHg4RDU0OiByZXR1cm4gIkdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFIjsKKyAgICBjYXNlIDB4OEQ1NTogcmV0dXJuICJHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFIjsKKyAgICBjYXNlIDB4OEQ2MDogcmV0dXJuICJHTF9URVhUVVJFX0dFTl9TVFJfT0VTIjsKKyAgICBjYXNlIDB4OEQ2MjogcmV0dXJuICJHTF9SR0I1NjUiOworICAgIGNhc2UgMHg4RDY0OiByZXR1cm4gIkdMX0VUQzFfUkdCOF9PRVMiOworICAgIGNhc2UgMHg4RDY1OiByZXR1cm4gIkdMX1RFWFRVUkVfRVhURVJOQUxfT0VTIjsKKyAgICBjYXNlIDB4OEQ2NzogcmV0dXJuICJHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTIjsKKyAgICBjYXNlIDB4OEQ2ODogcmV0dXJuICJHTF9SRVFVSVJFRF9URVhUVVJFX0lNQUdFX1VOSVRTX09FUyI7CisgICAgY2FzZSAweDhERjA6IHJldHVybiAiR0xfTE9XX0ZMT0FUIjsKKyAgICBjYXNlIDB4OERGMTogcmV0dXJuICJHTF9NRURJVU1fRkxPQVQiOworICAgIGNhc2UgMHg4REYyOiByZXR1cm4gIkdMX0hJR0hfRkxPQVQiOworICAgIGNhc2UgMHg4REYzOiByZXR1cm4gIkdMX0xPV19JTlQiOworICAgIGNhc2UgMHg4REY0OiByZXR1cm4gIkdMX01FRElVTV9JTlQiOworICAgIGNhc2UgMHg4REY1OiByZXR1cm4gIkdMX0hJR0hfSU5UIjsKKyAgICBjYXNlIDB4OERGODogcmV0dXJuICJHTF9TSEFERVJfQklOQVJZX0ZPUk1BVFMiOworICAgIGNhc2UgMHg4REY5OiByZXR1cm4gIkdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMiOworICAgIGNhc2UgMHg4REZBOiByZXR1cm4gIkdMX1NIQURFUl9DT01QSUxFUiI7CisgICAgY2FzZSAweDhERkI6IHJldHVybiAiR0xfTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMiOworICAgIGNhc2UgMHg4REZDOiByZXR1cm4gIkdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMiOworICAgIGNhc2UgMHg4REZEOiByZXR1cm4gIkdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMiOworICAgIGRlZmF1bHQ6IHJldHVybiAiPHVua25vd24+IjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZGVidWcuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkYzllYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2RlYnVnLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19ERUJVR19IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0RFQlVHX0hfCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKK2NvbnN0IGNoYXIqIEdldEVudW1TdHJpbmcoR0xlbnVtIHYpOworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfREVCVUdfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2RpcnRpYWJsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZGlydGlhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1MjUzYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2RpcnRpYWJsZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfRElSVElBQkxFX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfRElSVElBQkxFX0hfCisKKy8vIEEgc2ltcGxlIGNvbnRhaW5lciBjbGFzcyB0aGF0IGFsc28gdHJhY2tzIHdoZW4gdGhlIGNvbnRhaW5lZCBvYmplY3QgaXMKKy8vIChwb3RlbnRpYWxseSkgbXV0YXRlZC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBEaXJ0aWFibGUgeworIHB1YmxpYzoKKyAgRGlydGlhYmxlKCkgOiB2YWx1ZV8oKSwgZGlydHlfKHRydWUpIHt9CisgIGV4cGxpY2l0IERpcnRpYWJsZShjb25zdCBUJiBpbml0X3ZhbHVlKSA6IHZhbHVlXyhpbml0X3ZhbHVlKSwgZGlydHlfKHRydWUpIHt9CisKKyAgYm9vbCBJc0RpcnR5KCkgY29uc3QgeyByZXR1cm4gZGlydHlfOyB9CisgIHZvaWQgQ2xlYW4oKSB7IGRpcnR5XyA9IGZhbHNlOyB9CisKKyAgY29uc3QgVCYgR2V0KCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIFQmIE11dGF0ZSgpIHsgZGlydHlfID0gdHJ1ZTsgcmV0dXJuIHZhbHVlXzsgfQorCisgcHJpdmF0ZToKKyAgVCB2YWx1ZV87CisgIGJvb2wgZGlydHlfOworCisgIERpcnRpYWJsZShjb25zdCBEaXJ0aWFibGUmKTsKKyAgRGlydGlhYmxlJiBvcGVyYXRvcj0oY29uc3QgRGlydGlhYmxlJik7Cit9OworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfRElSVElBQkxFX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9lZ2xfaW1hZ2UuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZWdsX2ltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTA4ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZWdsX2ltYWdlLmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJnbGVzL2VnbF9pbWFnZS5oIgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJjb21tb24vZGxvZy5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc19jb250ZXh0LmgiCisjaW5jbHVkZSAiZ2xlcy90ZXh0dXJlX2RhdGEuaCIKKworR2xlc0NvbnRleHQqIEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworCitFZ2xJbWFnZTo6RWdsSW1hZ2UoR0xlbnVtIGdsb2JhbF90ZXh0dXJlX3RhcmdldCwgR0x1aW50IGdsb2JhbF90ZXh0dXJlX25hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGV4dHVyZURhdGFQdHImIHRleHR1cmUpCisgIDogd2lkdGgodGV4dHVyZS0+R2V0V2lkdGgoKSksCisgICAgaGVpZ2h0KHRleHR1cmUtPkdldEhlaWdodCgpKSwKKyAgICBmb3JtYXQodGV4dHVyZS0+R2V0Rm9ybWF0KCkpLAorICAgIGdsb2JhbF90ZXh0dXJlX3RhcmdldChnbG9iYWxfdGV4dHVyZV90YXJnZXQpLAorICAgIGdsb2JhbF90ZXh0dXJlX25hbWUoZ2xvYmFsX3RleHR1cmVfbmFtZSkgeworfQorCitFZ2xJbWFnZVB0ciBFZ2xJbWFnZTo6Q3JlYXRlKEdMZW51bSBnbG9iYWxfdGFyZ2V0LCBHTHVpbnQgbmFtZSkgeworICAgIERMT0coImNyZWF0ZSBlZ2wgaW1hZ2Ugd2l0aCBuYW1lPSV1IiwgbmFtZSk7CisgIEdsZXNDb250ZXh0KiBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgIGlmICghYykgeworICAgIHJldHVybiBFZ2xJbWFnZVB0cigpOworICB9CisKKyAgU2hhcmVHcm91cFB0ciBzZyA9IGMtPkdldFNoYXJlR3JvdXAoKTsKKyAgVGV4dHVyZURhdGFQdHIgdGV4ID0gc2ctPkdldFRleHR1cmVEYXRhKG5hbWUpOworICBpZiAodGV4ID09IE5VTEwpIHsKKyAgICAgIERMT0coInRleHR1cmUgZGF0YSBvZiAldSBub3QgcHJlc2VudCEiLCBuYW1lKTsKKyAgfQorICBpZiAodGV4LT5HZXRXaWR0aCgpID09IDAgfHwgdGV4LT5HZXRIZWlnaHQoKSA9PSAwKSB7CisgICAgICBETE9HKCJ0ZXh0dXJlIGlzIDAgd2lkdGgvaGVpZ2h0OiAldXgldSIsIHRleC0+R2V0V2lkdGgoKSwgdGV4LT5HZXRIZWlnaHQoKSk7CisgIH0KKyAgaWYgKHRleCA9PSBOVUxMIHx8IHRleC0+R2V0V2lkdGgoKSA9PSAwIHx8IHRleC0+R2V0SGVpZ2h0KCkgPT0gMCkgeworICAgIExPR19BTFdBWVNfRkFUQUwoIk5vIHN1Y2ggdGV4dHVyZTogJWQiLCBuYW1lKTsKKyAgICByZXR1cm4gRWdsSW1hZ2VQdHIoKTsKKyAgfQorCisgIGNvbnN0IEdMdWludCBnbG9iYWxfbmFtZSA9IHNnLT5HZXRUZXh0dXJlR2xvYmFsTmFtZShuYW1lKTsKKyAgcmV0dXJuIEVnbEltYWdlUHRyKG5ldyBFZ2xJbWFnZShnbG9iYWxfdGFyZ2V0LCBnbG9iYWxfbmFtZSwgdGV4KSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9lZ2xfaW1hZ2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2VnbF9pbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODBhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9lZ2xfaW1hZ2UuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19FR0xfSU1BR0VfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19FR0xfSU1BR0VfSF8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2NsYXNzIEVnbEltYWdlOwordHlwZWRlZiBhbmRyb2lkOjpzcDxFZ2xJbWFnZT4gRWdsSW1hZ2VQdHI7CisKK2NsYXNzIFRleHR1cmVEYXRhOwordHlwZWRlZiBhbmRyb2lkOjpzcDxUZXh0dXJlRGF0YT4gVGV4dHVyZURhdGFQdHI7CisKK2NsYXNzIEVnbEltYWdlIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEVnbEltYWdlUHRyIENyZWF0ZShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7CisKKyAgY29uc3QgR0x1aW50IHdpZHRoOworICBjb25zdCBHTHVpbnQgaGVpZ2h0OworICBjb25zdCBHTHVpbnQgZm9ybWF0OworICBHTGVudW0gZ2xvYmFsX3RleHR1cmVfdGFyZ2V0OworICBHTHVpbnQgZ2xvYmFsX3RleHR1cmVfbmFtZTsKKworIHByaXZhdGU6CisgIEVnbEltYWdlKEdMZW51bSBnbG9iYWxfdGV4dHVyZV90YXJnZXQsIEdMdWludCBnbG9iYWxfdGV4dHVyZV9uYW1lLAorICAgICAgICAgICBjb25zdCBUZXh0dXJlRGF0YVB0ciYgdGV4dHVyZSk7CisKKyAgRWdsSW1hZ2UoY29uc3QgRWdsSW1hZ2UmKTsKKyAgRWdsSW1hZ2UmIG9wZXJhdG9yPShjb25zdCBFZ2xJbWFnZSYpOworfTsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0VHTF9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZnJhbWVidWZmZXJfZGF0YS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9mcmFtZWJ1ZmZlcl9kYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTRkZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZnJhbWVidWZmZXJfZGF0YS5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImdsZXMvZnJhbWVidWZmZXJfZGF0YS5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKK0ZyYW1lYnVmZmVyRGF0YTo6QXR0YWNobWVudDo6QXR0YWNobWVudCgpIHsKKyAgU2V0KDAsIDAsIFJlbmRlcmJ1ZmZlckRhdGFQdHIoKSk7Cit9CisKK3ZvaWQgRnJhbWVidWZmZXJEYXRhOjpBdHRhY2htZW50OjpTZXQoR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlcmJ1ZmZlckRhdGFQdHImIG9iaikgeworICB0YXJnZXRfID0gdGFyZ2V0OworICBuYW1lXyA9IG5hbWU7CisgIG9ial8gPSBvYmo7Cit9CisKK3ZvaWQgRnJhbWVidWZmZXJEYXRhOjpBdHRhY2htZW50OjpEZXRhY2goKSB7CisgIGlmIChvYmpfICE9IE5VTEwgJiYgdGFyZ2V0XyA9PSBHTF9SRU5ERVJCVUZGRVIpIHsKKyAgICBvYmpfLT5EZXRhY2hGcmFtZWJ1ZmZlcigpOworICB9CisgIFNldCgwLCAwLCBSZW5kZXJidWZmZXJEYXRhUHRyKCkpOworfQorCitGcmFtZWJ1ZmZlckRhdGE6OkZyYW1lYnVmZmVyRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkKKyAgOiBPYmplY3REYXRhKEZSQU1FQlVGRkVSLCBuYW1lKSB7Cit9CisKK0ZyYW1lYnVmZmVyRGF0YTo6fkZyYW1lYnVmZmVyRGF0YSgpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQVRUQUNIX1BPSU5UUzsgKytpKSB7CisgICAgYXR0YWNobWVudF9baV0uRGV0YWNoKCk7CisgIH0KK30KKwordm9pZCBGcmFtZWJ1ZmZlckRhdGE6OlNldEF0dGFjaG1lbnQoR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlcmJ1ZmZlckRhdGFQdHImIG9iaikgeworICBjb25zdCBpbnQgaWR4ID0gR2V0QXR0YWNobWVudFBvaW50SW5kZXgoYXR0YWNobWVudCk7CisgIGlmIChhdHRhY2htZW50X1tpZHhdLnRhcmdldF8gIT0gdGFyZ2V0IHx8CisgICAgICBhdHRhY2htZW50X1tpZHhdLm5hbWVfICE9IG5hbWUgfHwKKyAgICAgIGF0dGFjaG1lbnRfW2lkeF0ub2JqXyAhPSBvYmopIHsKKyAgICBhdHRhY2htZW50X1tpZHhdLkRldGFjaCgpOworICAgIGF0dGFjaG1lbnRfW2lkeF0uU2V0KHRhcmdldCwgbmFtZSwgb2JqKTsKKworICAgIGlmICh0YXJnZXQgPT0gR0xfUkVOREVSQlVGRkVSICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICBvYmotPkF0dGFjaEZyYW1lYnVmZmVyKEdldExvY2FsTmFtZSgpLCBhdHRhY2htZW50KTsKKyAgICB9CisgIH0KK30KKworR0x1aW50IEZyYW1lYnVmZmVyRGF0YTo6R2V0QXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtKiBvdXRfdGFyZ2V0KSBjb25zdCB7CisgIGNvbnN0IGludCBpZHggPSBHZXRBdHRhY2htZW50UG9pbnRJbmRleChhdHRhY2htZW50KTsKKyAgaWYgKG91dF90YXJnZXQpIHsKKyAgICAqb3V0X3RhcmdldCA9IGF0dGFjaG1lbnRfW2lkeF0udGFyZ2V0XzsKKyAgfQorICByZXR1cm4gYXR0YWNobWVudF9baWR4XS5uYW1lXzsKK30KKworaW50IEZyYW1lYnVmZmVyRGF0YTo6R2V0QXR0YWNobWVudFBvaW50SW5kZXgoR0xlbnVtIGF0dGFjaG1lbnQpIGNvbnN0IHsKKyAgc3dpdGNoIChhdHRhY2htZW50KSB7CisgICAgY2FzZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMDoKKyAgICAgIHJldHVybiBBVFRBQ0hfUE9JTlRfQ09MT1I7CisgICAgY2FzZSBHTF9ERVBUSF9BVFRBQ0hNRU5UOgorICAgICAgcmV0dXJuIEFUVEFDSF9QT0lOVF9ERVBUSDsKKyAgICBjYXNlIEdMX1NURU5DSUxfQVRUQUNITUVOVDoKKyAgICAgIHJldHVybiBBVFRBQ0hfUE9JTlRfU1RFTkNJTDsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1BWF9BVFRBQ0hfUE9JTlRTOworICB9Cit9CisKK3ZvaWQgRnJhbWVidWZmZXJEYXRhOjpDbGVhckF0dGFjaG1lbnQoR0xlbnVtIGF0dGFjaG1lbnQpIHsKKyAgY29uc3QgaW50IGlkeCA9IEdldEF0dGFjaG1lbnRQb2ludEluZGV4KGF0dGFjaG1lbnQpOworICBhdHRhY2htZW50X1tpZHhdLkRldGFjaCgpOworfQorCit2b2lkIEZyYW1lYnVmZmVyRGF0YTo6Q2xlYXJBdHRhY2htZW50KEdMdWludCBuYW1lLCBib29sIGNsZWFyX3RleHR1cmUpIHsKKyAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgTUFYX0FUVEFDSF9QT0lOVFM7ICsraWR4KSB7CisgICAgaWYgKGF0dGFjaG1lbnRfW2lkeF0ubmFtZV8gPT0gbmFtZSkgeworICAgICAgY29uc3QgYm9vbCBpc19yZW5kZXJidWZmZXIgPSAoYXR0YWNobWVudF9baWR4XS5vYmpfICE9IE5VTEwpOworICAgICAgaWYgKGNsZWFyX3RleHR1cmUgIT0gaXNfcmVuZGVyYnVmZmVyKSB7CisgICAgICAgIGF0dGFjaG1lbnRfW2lkeF0uRGV0YWNoKCk7CisgICAgICB9CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9mcmFtZWJ1ZmZlcl9kYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9mcmFtZWJ1ZmZlcl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0MGJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2ZyYW1lYnVmZmVyX2RhdGEuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19GUkFNRUJVRkZFUl9EQVRBX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfRlJBTUVCVUZGRVJfREFUQV9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvcmVuZGVyYnVmZmVyX2RhdGEuaCIKKworY2xhc3MgRnJhbWVidWZmZXJEYXRhIDogcHVibGljIE9iamVjdERhdGEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRnJhbWVidWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKTsKKworICBHTHVpbnQgR2V0QXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtKiBvdXRfdGFyZ2V0KSBjb25zdDsKKworICB2b2lkIFNldEF0dGFjaG1lbnQoR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0YXJnZXQsIEdMdWludCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyYnVmZmVyRGF0YVB0ciYgb2JqKTsKKworICB2b2lkIENsZWFyQXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCk7CisgIHZvaWQgQ2xlYXJBdHRhY2htZW50KEdMdWludCBuYW1lLCBib29sIGNsZWFyX3RleHR1cmUpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5GcmFtZWJ1ZmZlckRhdGEoKTsKKworIHByaXZhdGU6CisgIGVudW0gQXR0YWNoUG9pbnQgeworICAgIEFUVEFDSF9QT0lOVF9DT0xPUiwKKyAgICBBVFRBQ0hfUE9JTlRfREVQVEgsCisgICAgQVRUQUNIX1BPSU5UX1NURU5DSUwsCisgICAgTUFYX0FUVEFDSF9QT0lOVFMsCisgIH07CisKKyAgc3RydWN0IEF0dGFjaG1lbnQgeworICAgIEF0dGFjaG1lbnQoKTsKKyAgICB2b2lkIFNldChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgbmFtZSwgY29uc3QgUmVuZGVyYnVmZmVyRGF0YVB0ciYgb2JqKTsKKyAgICB2b2lkIERldGFjaCgpOworICAgIEdMZW51bSB0YXJnZXRfOworICAgIEdMdWludCBuYW1lXzsKKyAgICBSZW5kZXJidWZmZXJEYXRhUHRyIG9ial87CisgIH07CisKKyAgaW50IEdldEF0dGFjaG1lbnRQb2ludEluZGV4KEdMZW51bSBhdHRhY2htZW50KSBjb25zdDsKKworICBBdHRhY2htZW50IGF0dGFjaG1lbnRfW01BWF9BVFRBQ0hfUE9JTlRTXTsKKworICBGcmFtZWJ1ZmZlckRhdGEoY29uc3QgRnJhbWVidWZmZXJEYXRhJik7CisgIEZyYW1lYnVmZmVyRGF0YSYgb3BlcmF0b3I9KGNvbnN0IEZyYW1lYnVmZmVyRGF0YSYpOworfTsKKwordHlwZWRlZiBhbmRyb2lkOjpzcDxGcmFtZWJ1ZmZlckRhdGE+IEZyYW1lYnVmZmVyRGF0YVB0cjsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0ZSQU1FQlVGRkVSX0RBVEFfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXMxMl9pbnRlcm5hbF9kaXNwYXRjaC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlczEyX2ludGVybmFsX2Rpc3BhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlZTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXMxMl9pbnRlcm5hbF9kaXNwYXRjaC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL2dsZXNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjFEaXNwYXRjaC5oIgorCisvLyBnbGVzMTJ0cl9pbnRlcm5hbC5oIGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRvIGJyb2FkIHN0cm9rZXMKKy8vIHdpdGggdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBHTEVTdjEtPjIgdHJhbnNsYXRvciwKKy8vIHdoaWNoIGlzIGEgZGlmZmVyZW50IHNldCBvZiBmdW5jdGlvbnMgZnJvbSB0aGUgc3RhbmRhcmQgc2V0IG9mCisvLyBHTEVTdjEgZnVuY3Rpb25zIGluIGxpYk9wZW5HTEVTRGlzcGF0Y2guCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0cl9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiS0hSL2tocnBsYXRmb3JtLmgiCisKKy8vIERlZmluZSBmdW5jdGlvbiBwb2ludGVyIHR5cGVzLgorI2RlZmluZSBHTEVTMV9ESVNQQVRDSF9ERUZJTkVfVFlQRShyZXR1cm5fdHlwZSxmdW5jX25hbWUsc2lnbmF0dXJlLGNhbGxhcmdzKSBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoS0hST05PU19BUElFTlRSWSAqIGZ1bmNfbmFtZSAjIyBfdCkgc2lnbmF0dXJlOworCitMSVNUX0dMRVMxMlRSX0lOVEVSTkFMX0ZVTkNUSU9OUyhHTEVTMV9ESVNQQVRDSF9ERUZJTkVfVFlQRSkKKworc3RydWN0IEdMRVMxMlRyYW5zbGF0b3JGdW5jcyB7CisjZGVmaW5lIEdMRVMxX0RJU1BBVENIX0RFQ0xBUkVfUE9JTlRFUihyZXR1cm5fdHlwZSxmdW5jX25hbWUsc2lnbmF0dXJlLGNhbGxhcmdzKSBcCisgICAgICAgIGZ1bmNfbmFtZSAjIyBfdCBpbnRlcm5hbCMjZnVuY19uYW1lOworICAgIExJU1RfR0xFUzEyVFJfSU5URVJOQUxfRlVOQ1RJT05TKEdMRVMxX0RJU1BBVENIX0RFQ0xBUkVfUE9JTlRFUikKK307CisKKyN1bmRlZiBHTEVTMV9ESVNQQVRDSF9ERUNMQVJFX1BPSU5URVIKKyN1bmRlZiBHTEVTMV9ESVNQQVRDSF9ERUZJTkVfVFlQRQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlczFfc2hhZGVyX2dlbmVyYXRvci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzMV9zaGFkZXJfZ2VuZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE2NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlczFfc2hhZGVyX2dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSw4ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2xlcy9nbGVzMV9zaGFkZXJfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKworI2luY2x1ZGUgImNvbW1vbi9hbG9nLmgiCisjaW5jbHVkZSAiZ2xlcy9kZWJ1Zy5oIgorCisjaWYgZGVmaW5lZChDT01QSUxFUl9HQ0MpCisjZGVmaW5lIFBSSU5URl9GT1JNQVQoZm9ybWF0X3BhcmFtLCBkb3RzX3BhcmFtKSBcCisgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgZm9ybWF0X3BhcmFtLCBkb3RzX3BhcmFtKSkpCisjZWxzZQorI2RlZmluZSBQUklOVEZfRk9STUFUKGZvcm1hdF9wYXJhbSwgZG90c19wYXJhbSkKKyNlbmRpZgorCisvLyBHZW5lcmF0ZXMgYSBHTEVTMSBlcXVpdmFsZW50IHNoYWRlciBmb3IgdXNlIGluIEdMRVMyCisvLyBVbmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIEdMRVMxIHNwZWNpZmljYXRpb24gaGVyZQorLy8gYXJlIG1lYW50IHRvIGJlIGFnYWluc3QgdGhlIEtocm9ub3MgT3BlbkdMIDEuMS4xMiAoQXByaWwgMjAwOCkgUERGIGZpbGUuCisvLyAoaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL3NwZWNzLzEuMS9lc19mdWxsX3NwZWMuMS4xLjEyLnBkZikKKworLy8gVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcmUgdXNlZCBpbiB0aGUgc2hhZGVyIGNvZGUuCisvLyB1bmlmb3JtIHZhcmlhYmxlczogUHJlcGVuZGVkIHdpdGggdV8uICBUaGVzZSBhcmUgY29uc3RhbnRzIGF2YWlsYWJsZSB0byBib3RoCisvLyAgICAgdGhlIHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVycy4KKy8vIGF0dHJpYnV0ZSB2YXJpYWJsZXM6IFByZXBlbmRlZCB3aXRoIGFfLiAgVGhlc2UgYXJlIHZlcnRleCBzaGFkZXIgb25seSBkYXRhLgorLy8gdmFyeWluZyB2YXJpYWJsZXM6IFByZXBlbmRlZCB3aXRoIHZfLiAgRGF0YSBwYXNzZWQgZnJvbSB0aGUgdmVydGV4IHNoYWRlciB0bworLy8gICAgdG8gdGhlIGZyYWdtZW50IHNoYWRlciBkYXRhLCBzdWJqZWN0IHRvIGludGVycG9sYXRpb24uCisvLyBnbCB2ZXJ0ZXgvZnJhZ21lbnQgb3V0cHV0IGRhdGE6ICAgUHJlcGVuZGVkIHdpdGggZ2xfLiAgVGhlc2UgYXJlIGRlZmluZWQgYnkKKy8vICAgIHRoZSBHTFNMIGl0c2VsZi4KKworbmFtZXNwYWNlIHsKKworY2xhc3MgU3RyaW5nQnVpbGRlciB7CisgcHVibGljOgorICBTdHJpbmdCdWlsZGVyKGNoYXIqIGJ1Ziwgc2l6ZV90IHNpemUpIDogYnVmXyhidWYpLCBzaXplXyhzaXplKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihidWYgPT0gTlVMTCB8fCBzaXplXyA9PSAwKTsKKyAgICAvLyBBbHdheXMgZW5zdXJlIHRoZSBidWZmZXIgaXMgbnVsIHRlcm1pbmF0ZWQuCisgICAgKmJ1Zl8gPSAwOworICAgIC8vIFJlZHVjZSBhdmFpbGFibGUgc2l6ZSBieSAxIGJlY2F1c2Ugd2UnbGwgYWx3YXlzIGFkZCBhIG51bCB0ZXJtaW5hdG9yCisgICAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICAgIC0tc2l6ZV87CisgIH0KKworICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHRleHQpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc2l6ZV8gPCBsZW4pOworICAgIGlmIChsZW4gPiBzaXplXykgeworICAgICAgbGVuID0gc2l6ZV87CisgICAgfQorCisgICAgbWVtY3B5KGJ1Zl8sIHRleHQsIGxlbik7CisKKyAgICBidWZfICs9IGxlbjsKKyAgICBzaXplXyAtPSBsZW47CisgICAgRW5kTGluZSgnXG4nKTsKKyAgfQorCisgIHZvaWQgRm9ybWF0KGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSBQUklOVEZfRk9STUFUKDIsIDMpIHsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBzaXplX3QgbGVuID0gdnNucHJpbnRmKGJ1Zl8sIHNpemVfLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc2l6ZV8gPCBsZW4pOworICAgIGlmIChsZW4gPiBzaXplXykgeworICAgICAgbGVuID0gc2l6ZV87CisgICAgfQorCisgICAgYnVmXyArPSBsZW47CisgICAgc2l6ZV8gLT0gbGVuOworICAgIEVuZExpbmUoJ1xuJyk7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgRW5kTGluZShjb25zdCBjaGFyIGNoKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzaXplXyA8IDIpOworICAgIGlmIChzaXplXyA+IDEpIHsKKyAgICAgICpidWZfID0gJ1xuJzsKKyAgICAgICsrYnVmXzsKKyAgICAgIC0tc2l6ZV87CisKKyAgICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhlIGJ1ZmZlciBpcyBudWwgdGVybWluYXRlZC4KKyAgICAgICpidWZfID0gMDsKKyAgICB9CisgIH0KKworICBjaGFyKiBidWZfOworICBzaXplX3Qgc2l6ZV87Cit9OworCitib29sIE5lZWRzQmFja0NvbG9yKGNvbnN0IFNoYWRlckNvbmZpZyYgY2ZnKSB7CisgIHJldHVybiBjZmcuZW5hYmxlX2xpZ2h0aW5nICYmIGNmZy5lbmFibGVfbGlnaHRfbW9kZWxfdHdvX3NpZGU7Cit9CisKK2Jvb2wgTmVlZHNOb3JtYWwoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcpIHsKKyAgcmV0dXJuIChjZmcuZW5hYmxlX2xpZ2h0aW5nIHx8IGNmZy5hbnlfdGV4dHVyZV9nZW5fbm9ybWFsX21hcCB8fAorICAgICAgICAgIGNmZy5hbnlfdGV4dHVyZV9nZW5fcmVmbGVjdGlvbl9tYXApOworfQorCit2b2lkIFdyaXRlVlNIZWFkZXIoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgYi0+V3JpdGUoIiN2ZXJzaW9uIDEwMCIpOworCisgIGlmIChjZmcuZW5hYmxlX2xpZ2h0aW5nKSB7CisgICAgYi0+Rm9ybWF0KCIjZGVmaW5lIE5VTV9MSUdIVFMgJWQiLCBVbmlmb3JtQ29udGV4dDo6a01heExpZ2h0cyk7CisKKyAgICBiLT5Xcml0ZSgic3RydWN0IGxpZ2h0IHsiKTsKKyAgICBiLT5Xcml0ZSgiICB2ZWM0IGFtYmllbnQ7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBkaWZmdXNlOyIpOworICAgIGItPldyaXRlKCIgIHZlYzQgc3BlY3VsYXI7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBwb3NpdGlvbjsiKTsKKyAgICBiLT5Xcml0ZSgiICB2ZWM0IGRpcmVjdGlvbjsiKTsKKyAgICBiLT5Xcml0ZSgiICBmbG9hdCBzcG90X2V4cG9uZW50OyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IHNwb3RfY3V0b2ZmOyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IGNvbnN0X2F0dGVudWF0aW9uOyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IGxpbmVhcl9hdHRlbnVhdGlvbjsiKTsKKyAgICBiLT5Xcml0ZSgiICBmbG9hdCBxdWFkcmF0aWNfYXR0ZW51YXRpb247Iik7CisgICAgYi0+V3JpdGUoIn07Iik7CisKKyAgICBiLT5Xcml0ZSgic3RydWN0IG1hdGVyaWFsIHsiKTsKKyAgICBiLT5Xcml0ZSgiICB2ZWM0IGFtYmllbnQ7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBkaWZmdXNlOyIpOworICAgIGItPldyaXRlKCIgIHZlYzQgc3BlY3VsYXI7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBlbWlzc2lvbjsiKTsKKyAgICBiLT5Xcml0ZSgiICBmbG9hdCBzaGluaW5lc3M7Iik7CisgICAgYi0+V3JpdGUoIn07Iik7CisKKyAgICAvLyBTZWUgZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEyLjEgZXF1YXRpb24gMi40LgorICAgIC8vIHZwOiBWZWN0b3IgZnJvbSB2ZXJ0ZXggcG9zaXRpb24gKFYpIHRvIGxpZ2h0IHBvc2l0aW9uIChQKS4KKyAgICBiLT5Xcml0ZSgiZmxvYXQgbGlnaHRBdHRlbnVhdGlvbihsaWdodCBpbl9saWdodCwgdmVjMyB2cCkgeyIpOworICAgIGItPldyaXRlKCIgIHZlYzMgYXR0ID0gdmVjMyhpbl9saWdodC5jb25zdF9hdHRlbnVhdGlvbiwiKTsKKyAgICBiLT5Xcml0ZSgiICAgICAgICAgICAgICAgICAgaW5fbGlnaHQubGluZWFyX2F0dGVudWF0aW9uLCIpOworICAgIGItPldyaXRlKCIgICAgICAgICAgICAgICAgICBpbl9saWdodC5xdWFkcmF0aWNfYXR0ZW51YXRpb24pOyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IGxlbiA9IGxlbmd0aCh2cCk7Iik7CisgICAgYi0+V3JpdGUoIiAgcmV0dXJuIDEuMCAvIGRvdCggYXR0LCB2ZWMzKDEuMCwgbGVuLCBsZW4gKiBsZW4pKTsiKTsKKyAgICBiLT5Xcml0ZSgifSIpOworCisgICAgLy8gU2VlIGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHNlY3Rpb24gMi4xMi4xIGVxdWF0aW9uIDIuNS4KKyAgICAvLyB2cDogVW5pdCB2ZWN0b3IgZnJvbSB2ZXJ0ZXggcG9zaXRpb24gKFYpIHRvIGxpZ2h0IHBvc2l0aW9uIChQKS4KKyAgICAvLyBleHAoQSAqIGxvZyhCKSkgaXMgZXF1aXZhbGVudCB0byBwb3coQiwgQSkuCisgICAgYi0+V3JpdGUoImZsb2F0IGxpZ2h0U3BvdFNoaW5pbmVzcyhsaWdodCBpbl9saWdodCwgdmVjMyB2cCkgeyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IHNkID0gZG90KHZwLCBpbl9saWdodC5kaXJlY3Rpb24ueHl6KTsiKTsKKyAgICBiLT5Xcml0ZSgiICByZXR1cm4gKHNkID49IGluX2xpZ2h0LnNwb3RfY3V0b2ZmKSA/Iik7CisgICAgYi0+V3JpdGUoIiAgICAgICAgIGV4cChpbl9saWdodC5zcG90X2V4cG9uZW50ICogbG9nKHNkKSkgOiIpOworICAgIGItPldyaXRlKCIgICAgICAgICAwLjA7Iik7CisgICAgYi0+V3JpdGUoIn0iKTsKKworICAgIC8vIFNlZSBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDIuMTIuMSwgZXF1YXRpb24gMi4xLgorICAgIC8vIHZwOiBWZWN0b3IgZnJvbSB2ZXJ0ZXggcG9zaXRpb24gKFYpIHRvIGxpZ2h0IHBvc2l0aW9uIChQKS4KKyAgICAvLyBub3JtOiBWZXJ0ZXggbm9ybWFsLgorICAgIC8vIGF0dDogQXR0ZW51YXRpb24gZmFjdG9yIChjYWxjdWxhdGVkIGV4dGVybmFsbHkpLgorICAgIC8vIHNwb3Q6IFNwb3QgbGlnaHQgZmFjdG9yIChjYWxjdWxhdGVkIGV4dGVybmFsbHkpLgorICAgIC8vIGh2OiBTZWUgZXF1YXRpb24gMi4zLgorICAgIC8vIGRmOiBEaWZmdXNlIGZhY3Rvci4KKyAgICAvLyBzZjogU3BlY3VsYXIgZmFjdG9yLiAgU2VlIGVxdWF0aW9uIDIuMi4KKyAgICBiLT5Xcml0ZSgidmVjNCBhcHBseUxpZ2h0KGxpZ2h0IGluX2xpZ2h0LCBtYXRlcmlhbCBpbl9tYXRlcmlhbCwgdmVjMyB2cCwiKTsKKyAgICBiLT5Xcml0ZSgiICAgICAgICAgICAgICAgIHZlYzMgbm9ybSwgZmxvYXQgYXR0LCBmbG9hdCBzcG90KSB7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjMyBodiA9IG5vcm1hbGl6ZSh2cCArIHZlYzMoMC4wLCAwLjAsIDEuMCkpOyIpOworICAgIGItPldyaXRlKCIgIGZsb2F0IGRmID0gbWF4KGRvdChub3JtLCB2cCksIDAuMCk7Iik7CisgICAgYi0+V3JpdGUoIiAgZmxvYXQgc2YgPSBtYXgoZG90KG5vcm0sIGh2KSwgMC4wKTsiKTsKKyAgICBiLT5Xcml0ZSgiICBzZiA9IChkZiA+IDAuMCAmJiBzZiA+IDAuMCkiKTsKKyAgICBiLT5Xcml0ZSgiICAgICA/IGV4cChpbl9tYXRlcmlhbC5zaGluaW5lc3MgKiBsb2coc2YpKSIpOworICAgIGItPldyaXRlKCIgICAgIDogMC4wOyIpOworICAgIGItPldyaXRlKCIgIHZlYzQgYW1iaWVudCA9IGluX2xpZ2h0LmFtYmllbnQgKiBpbl9tYXRlcmlhbC5hbWJpZW50OyIpOworICAgIGItPldyaXRlKCIgIHZlYzQgZGlmZnVzZSA9IGRmICogaW5fbGlnaHQuZGlmZnVzZSAqIGluX21hdGVyaWFsLmRpZmZ1c2U7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBzcGVjdWxhciA9ICIpOworICAgIGItPldyaXRlKCIgICAgICBzZiAqIGluX2xpZ2h0LnNwZWN1bGFyICogaW5fbWF0ZXJpYWwuc3BlY3VsYXI7Iik7CisgICAgYi0+V3JpdGUoIiAgdmVjNCBjb2xvciA9IGF0dCAqIHNwb3QgKiAoYW1iaWVudCArIGRpZmZ1c2UgKyBzcGVjdWxhcik7Iik7CisgICAgYi0+V3JpdGUoIiAgcmV0dXJuIGNvbG9yOyIpOworICAgIGItPldyaXRlKCJ9Iik7CisKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIHZlYzQgdV9hbWJpZW50OyIpOworICAgIGItPldyaXRlKCJ1bmlmb3JtIG1hdGVyaWFsIHVfbWF0ZXJpYWw7Iik7CisgICAgYi0+V3JpdGUoInVuaWZvcm0gbGlnaHQgdV9saWdodFtOVU1fTElHSFRTXTsiKTsKKyAgfQorCisgIGlmIChjZmcuZW5hYmxlX2ZvZykgeworICAgIGItPldyaXRlKCJ2YXJ5aW5nIG1lZGl1bXAgZmxvYXQgdl9mb2dfZGlzdGFuY2U7Iik7CisgIH0KKworICBpZiAoY2ZnLm1vZGUgPT0gR0xfUE9JTlRTKSB7CisgICAgLy8gRXZlcnkgcG9pbnQgY2FuIGdldCBhIHVuaXF1ZSBzaXplIGFsb25nIHdpdGggYSBwb3NpdGlvbi4KKyAgICBiLT5Xcml0ZSgiYXR0cmlidXRlIG1lZGl1bXAgZmxvYXQgYV9wb2ludF9zaXplOyIpOworICAgIC8vIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgd2hlbiByZW5kZXJpbmcgYSBzZXQgb2YgcG9pbnRzLgorICAgIGItPldyaXRlKCJ1bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9wb2ludF9zaXplX21pbjsiKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcG9pbnRfc2l6ZV9tYXg7Iik7CisgICAgYi0+V3JpdGUoInVuaWZvcm0gbWVkaXVtcCB2ZWMzIHVfcG9pbnRfc2l6ZV9hdHRlbnVhdGlvbjsiKTsKKyAgfQorCisgIGlmIChjZmcuYW55X2NsaXBfcGxhbmVzX2VuYWJsZWQpIHsKKyAgICBiLT5Gb3JtYXQoIiNkZWZpbmUgTlVNX0NMSVBfUExBTkVTICVkIiwgVW5pZm9ybUNvbnRleHQ6OmtNYXhDbGlwUGxhbmVzKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBoaWdocCB2ZWM0IHVfY2xpcF9wbGFuZVtOVU1fQ0xJUF9QTEFORVNdOyIpOworICAgIGItPldyaXRlKCJ2YXJ5aW5nIGhpZ2hwIGZsb2F0IHZfY2xpcF9wbGFuZV9kaXN0YW5jZVtOVU1fQ0xJUF9QTEFORVNdOyIpOworICB9CisKKyAgaWYgKGNmZy5hbnlfdGV4dHVyZV91bml0c19lbmFibGVkKSB7CisgICAgYi0+Rm9ybWF0KCIjZGVmaW5lIE5VTV9URVhUVVJFX1NUQUdFUyAlZCIsCisgICAgICAgICAgICAgIFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIG1hdDQgdV90ZXh0dXJlX21hdHJpeFtOVU1fVEVYVFVSRV9TVEFHRVNdOyIpOworICAgIGItPldyaXRlKCJ2YXJ5aW5nIG1lZGl1bXAgdmVjNCB2X3RleGNvb3JkW05VTV9URVhUVVJFX1NUQUdFU107Iik7CisgICAgLy8gQXR0cmlidXRlcyBjYW5ub3QgYmUgYXJyYXlzLCBzbyBjcmVhdGUgdGhlbSBleHBsaWNpdGx5CisgICAgZm9yIChpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzOyArK3N0YWdlKSB7CisgICAgICBpZiAoY2ZnLnRleHR1cmVbc3RhZ2VdLmVuYWJsZWQpIHsKKyAgICAgICAgYi0+Rm9ybWF0KCJhdHRyaWJ1dGUgbWVkaXVtcCB2ZWM0IGFfdGV4Y29vcmRfJWQ7Iiwgc3RhZ2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChOZWVkc05vcm1hbChjZmcpKSB7CisgICAgYi0+V3JpdGUoImF0dHJpYnV0ZSBoaWdocCB2ZWMzIGFfbm9ybWFsOyIpOworICAgIGItPldyaXRlKCJ1bmlmb3JtIG1lZGl1bXAgbWF0NCB1X212X2ludmVyc2VfdHJhbnNwb3NlX21hdHJpeDsiKTsKKyAgfQorCisgIGlmIChOZWVkc0JhY2tDb2xvcihjZmcpKSB7CisgICAgYi0+V3JpdGUoInZhcnlpbmcgbWVkaXVtcCB2ZWM0IHZfYmFja19jb2xvcjsiKTsKKyAgfQorCisgIGlmIChjZmcuZW5hYmxlX21hdHJpeF9wYWxldHRlKSB7CisgICAgYi0+Rm9ybWF0KCIjZGVmaW5lIE5VTV9QQUxFVFRFX01BVFJJQ0VTICVkIiwKKyAgICAgICAgICAgICAgVW5pZm9ybUNvbnRleHQ6OmtNYXhQYWxldHRlTWF0cmljZXNPRVMpOworICAgIGItPldyaXRlKCJhdHRyaWJ1dGUgbWVkaXVtcCB2ZWM0IGFfd2VpZ2h0OyIpOworICAgIGItPldyaXRlKCJhdHRyaWJ1dGUgbWVkaXVtcCB2ZWM0IGFfbWF0cml4X2luZGV4OyIpOworICAgIGItPldyaXRlKCJ1bmlmb3JtIG1lZGl1bXAgbWF0NCB1X3BhbGV0dGVfbWF0cml4W05VTV9QQUxFVFRFX01BVFJJQ0VTXTsiKTsKKyAgICBpZiAoTmVlZHNOb3JtYWwoY2ZnKSkgeworICAgICAgYi0+V3JpdGUoInVuaWZvcm0gbWVkaXVtcCBtYXQ0IHVfcGFsZXR0ZV9pbnZfbWF0cml4W05VTV9QQUxFVFRFX01BVFJJQ0VTXTsiKTsKKyAgICB9CisgIH0KKworICBiLT5Xcml0ZSgidmFyeWluZyBtZWRpdW1wIHZlYzQgdl9mcm9udF9jb2xvcjsiKTsKKworICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIG1hdDQgdV9wX21hdHJpeDsiKTsKKyAgYi0+V3JpdGUoInVuaWZvcm0gbWVkaXVtcCBtYXQ0IHVfbXZfbWF0cml4OyIpOworCisgIGItPldyaXRlKCJhdHRyaWJ1dGUgbWVkaXVtcCB2ZWM0IGFfY29sb3I7Iik7CisgIGItPldyaXRlKCJhdHRyaWJ1dGUgaGlnaHAgdmVjNCBhX3Bvc2l0aW9uOyIpOworfQorCit2b2lkIFdyaXRlRlNIZWFkZXIoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgYi0+V3JpdGUoIiN2ZXJzaW9uIDEwMCIpOworCisgIGlmIChjZmcuZW5hYmxlX2FscGhhX3Rlc3QpIHsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfYWxwaGFfdGVzdF9jb25zdGFudDsiKTsKKyAgfQorCisgIGlmIChjZmcuZW5hYmxlX2ZvZykgeworICAgIGItPldyaXRlKCJ1bmlmb3JtIG1lZGl1bXAgdmVjNCB1X2ZvZ19jb2xvcjsiKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfZm9nX2RlbnNpdHk7Iik7CisgICAgYi0+V3JpdGUoInVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2ZvZ19zdGFydDsiKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfZm9nX2VuZDsiKTsKKyAgICBiLT5Xcml0ZSgidmFyeWluZyBtZWRpdW1wIGZsb2F0IHZfZm9nX2Rpc3RhbmNlOyIpOworICB9CisKKyAgaWYgKGNmZy5hbnlfY2xpcF9wbGFuZXNfZW5hYmxlZCkgeworICAgIGItPkZvcm1hdCgiI2RlZmluZSBOVU1fQ0xJUF9QTEFORVMgJWQiLCBVbmlmb3JtQ29udGV4dDo6a01heENsaXBQbGFuZXMpOworICAgIGItPldyaXRlKCJ2YXJ5aW5nIGhpZ2hwIGZsb2F0IHZfY2xpcF9wbGFuZV9kaXN0YW5jZVtOVU1fQ0xJUF9QTEFORVNdOyIpOworICB9CisKKyAgaWYgKGNmZy5hbnlfdGV4dHVyZV91bml0c19lbmFibGVkKSB7CisgICAgYi0+Rm9ybWF0KCIjZGVmaW5lIE5VTV9URVhUVVJFX1NUQUdFUyAlZCIsCisgICAgICAgICAgICAgIFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIHZlYzQgdV90ZXhlbnZfY29uc3RbTlVNX1RFWFRVUkVfU1RBR0VTXTsiKTsKKyAgICBiLT5Xcml0ZSgidW5pZm9ybSBtZWRpdW1wIHZlYzQgdV90ZXhlbnZfc2NhbGVbTlVNX1RFWFRVUkVfU1RBR0VTXTsiKTsKKyAgICBiLT5Xcml0ZSgidmFyeWluZyBtZWRpdW1wIHZlYzQgdl90ZXhjb29yZFtOVU1fVEVYVFVSRV9TVEFHRVNdOyIpOworCisgICAgZm9yIChHTGludCBzdGFnZSA9IDA7IHN0YWdlIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhUZXh0dXJlVW5pdHM7ICsrc3RhZ2UpIHsKKyAgICAgIGNvbnN0IFNoYWRlckNvbmZpZzo6VGV4dHVyZUNvbmZpZyYgdGV4ID0gY2ZnLnRleHR1cmVbc3RhZ2VdOworICAgICAgaWYgKCF0ZXguZW5hYmxlZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh0ZXgudGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTKSB7CisgICAgICAgIGItPkZvcm1hdCgidW5pZm9ybSBzYW1wbGVyQ3ViZSB1X3NhbXBsZXJfJWQ7Iiwgc3RhZ2UpOworICAgICAgfSBlbHNlIGlmICh0ZXgudGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgICAgYi0+Rm9ybWF0KCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3NhbXBsZXJfJWQ7Iiwgc3RhZ2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biB0ZXh0dXJlIHRhcmdldCAlZCAoJXMpIiwgdGV4LnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKHRleC50YXJnZXQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoTmVlZHNCYWNrQ29sb3IoY2ZnKSkgeworICAgIGItPldyaXRlKCJ2YXJ5aW5nIG1lZGl1bXAgdmVjNCB2X2JhY2tfY29sb3I7Iik7CisgIH0KKworICBiLT5Xcml0ZSgidmFyeWluZyBtZWRpdW1wIHZlYzQgdl9mcm9udF9jb2xvcjsiKTsKK30KKwordm9pZCBXcml0ZVZTQ29tcHV0ZVBvaW50U2l6ZShjb25zdCBTaGFkZXJDb25maWcmIGNmZywgU3RyaW5nQnVpbGRlciogYikgeworICBpZiAoY2ZnLm1vZGUgIT0gR0xfUE9JTlRTKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAzLjMKKyAgYi0+V3JpdGUoImZsb2F0IGV5ZV9kaXN0YW5jZSA9IC1leWVfcG9zaXRpb24uejsiKTsKKyAgYi0+V3JpdGUoCisgICAgICAiZmxvYXQgYXR0ZW51YXRpb24gPSBkb3QodV9wb2ludF9zaXplX2F0dGVudWF0aW9uLCAiCisgICAgICAidmVjMygxLCBleWVfZGlzdGFuY2UsIGV5ZV9kaXN0YW5jZSAqIGV5ZV9kaXN0YW5jZSkpOyIpOworICBiLT5Xcml0ZSgiZmxvYXQgcG9pbnRfc2l6ZSA9IGFfcG9pbnRfc2l6ZSAvIHNxcnQoYXR0ZW51YXRpb24pOyIpOworICBiLT5Xcml0ZSgKKyAgICAgICJnbF9Qb2ludFNpemUgPSBjbGFtcChwb2ludF9zaXplLCB1X3BvaW50X3NpemVfbWluLCB1X3BvaW50X3NpemVfbWF4KTsiKTsKK30KKwordm9pZCBXcml0ZVZTQ29tcHV0ZUNsaXBQbGFuZURpc3RhbmNlcyhjb25zdCBTaGFkZXJDb25maWcmIGNmZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciogYikgeworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDIuMTEKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBVbmlmb3JtQ29udGV4dDo6a01heENsaXBQbGFuZXM7ICsraSkgeworICAgIGlmIChjZmcuZW5hYmxlX2NsaXBfcGxhbmVbaV0pIHsKKyAgICAgIGItPkZvcm1hdCgKKyAgICAgICAgICAidl9jbGlwX3BsYW5lX2Rpc3RhbmNlWyVkXSA9IGRvdChleWVfcG9zaXRpb24sICIKKyAgICAgICAgICAidV9jbGlwX3BsYW5lWyVkXSk7IiwgaSwgaSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgV3JpdGVGU1Rlc3RQb2ludFNoYXBlKGNvbnN0IFNoYWRlckNvbmZpZyYgY2ZnLCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIGlmIChjZmcuZW5hYmxlX3BvaW50X3Ntb290aCAmJiAhY2ZnLmVuYWJsZV9wb2ludF9zcHJpdGUpIHsKKyAgICBiLT5Gb3JtYXQoCisgICAgICAgICJpZiAoZGlzdGFuY2UoZ2xfUG9pbnRDb29yZCwgdmVjMigwLjUsIDAuNSkpID4gMC41KSB7ICIKKyAgICAgICAgIiBkaXNjYXJkOyB9Iik7CisgIH0KK30KKwordm9pZCBXcml0ZUZTVGVzdENsaXBQbGFuZXMoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjExCisgIGZvciAoaW50IGkgPSAwOyBpIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhDbGlwUGxhbmVzOyArK2kpIHsKKyAgICBpZiAoY2ZnLmVuYWJsZV9jbGlwX3BsYW5lW2ldKSB7CisgICAgICBiLT5Gb3JtYXQoImlmICh2X2NsaXBfcGxhbmVfZGlzdGFuY2VbJWRdIDw9IDAuMCkgeyBkaXNjYXJkOyB9IiwgaSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgV3JpdGVWU0NvbXB1dGVUZXh0dXJlQ29vcmRpbmF0ZXMoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEwCisgIC8vIFRoZSBvbmx5IHRoaW5nIHRvIGRvIHdpdGggdGV4dHVyZSBjb29yZGluYXRlcyBpbiBHTEVTMSBpcyB0byB0cmFuc2Zvcm0gdGhlbQorICAvLyBieSB0aGUgY3VycmVudCB0ZXh0dXJlIG1hdHJpeC4gVGhlIG9yaWdpbmFsIE9wZW5HTCBzcGVjaWZpY2F0aW9uIGluY2x1ZGVzCisgIC8vIHRoZSBhYmlsaXR5IHRvIGdlbmVyYXRlIHRleHR1cmUgY29vcmRpbmF0ZXMgZnJvbSB0aGUgcG9zaXRpb24vbm9ybWFsLgorCisgIGlmIChjZmcuYW55X3RleHR1cmVfZ2VuX3JlZmxlY3Rpb25fbWFwKSB7CisgICAgYi0+V3JpdGUoInZlYzQgcmVmbGVjdGlvbiA9IHZlYzQocmVmbGVjdChleWVfcG9zaXRpb24ueHl6LCBub3JtYWwpLCAwKTsiKTsKKyAgfQorCisgIGZvciAoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCBVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0czsgKytzdGFnZSkgeworICAgIGlmIChjZmcudGV4dHVyZVtzdGFnZV0uZW5hYmxlZCkgeworICAgICAgaWYgKGNmZy50ZXh0dXJlW3N0YWdlXS50ZXhnZW5fZW5hYmxlZCkgeworICAgICAgICBpZiAoY2ZnLnRleHR1cmVbc3RhZ2VdLnRleGdlbl9tb2RlID09IEdMX05PUk1BTF9NQVBfT0VTKSB7CisgICAgICAgICAgYi0+Rm9ybWF0KCJ2X3RleGNvb3JkWyVkXSA9IHVfdGV4dHVyZV9tYXRyaXhbJWRdICogdmVjNChub3JtYWwsIDApOyIsCisgICAgICAgICAgICAgICAgICAgIHN0YWdlLCBzdGFnZSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ZnLnRleHR1cmVbc3RhZ2VdLnRleGdlbl9tb2RlID09IEdMX1JFRkxFQ1RJT05fTUFQX09FUykgeworICAgICAgICAgIGItPkZvcm1hdCgidl90ZXhjb29yZFslZF0gPSB1X3RleHR1cmVfbWF0cml4WyVkXSAqIHJlZmxlY3Rpb247IiwKKyAgICAgICAgICAgICAgICAgICAgc3RhZ2UsIHN0YWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJOb3Qgc3VwcG9ydGVkIEdMX1RFWFRVUkVfR0VOX01PREUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RW51bVN0cmluZyhjZmcudGV4dHVyZVtzdGFnZV0udGV4Z2VuX21vZGUpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYi0+Rm9ybWF0KCJ2X3RleGNvb3JkWyVkXSA9IHVfdGV4dHVyZV9tYXRyaXhbJWRdICogYV90ZXhjb29yZF8lZDsiLAorICAgICAgICAgICAgICAgICAgc3RhZ2UsIHN0YWdlLCBzdGFnZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgV3JpdGVWU0NvbXB1dGVGb2dEaXN0YW5jZShjb25zdCBTaGFkZXJDb25maWcmIGNmZywgU3RyaW5nQnVpbGRlciogYikgeworICBpZiAoY2ZnLmVuYWJsZV9mb2cpIHsKKyAgICBiLT5Xcml0ZSgidl9mb2dfZGlzdGFuY2UgPSAtZXllX3Bvc2l0aW9uLno7Iik7CisgIH0KK30KKwordm9pZCBXcml0ZVZTQ29tcHV0ZUxpZ2h0aW5nKGNvbnN0IFNoYWRlckNvbmZpZyYgY2ZnLCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIGlmIChjZmcuZW5hYmxlX2xpZ2h0aW5nKSB7CisgICAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEyLjEuCisgICAgYi0+V3JpdGUoIm1hdGVyaWFsIG0gPSB1X21hdGVyaWFsOyIpOworICAgIGlmIChjZmcuZW5hYmxlX2NvbG9yX21hdGVyaWFsKSB7CisgICAgICBiLT5Xcml0ZSgibS5hbWJpZW50ID0gYV9jb2xvcjsiKTsKKyAgICAgIGItPldyaXRlKCJtLmRpZmZ1c2UgPSBhX2NvbG9yOyIpOworICAgIH0KKworICAgIGItPldyaXRlKCJ2X2Zyb250X2NvbG9yID0gbS5lbWlzc2lvbjsiKTsKKyAgICBiLT5Xcml0ZSgidl9mcm9udF9jb2xvciArPSBtLmFtYmllbnQgKiB1X2FtYmllbnQ7Iik7CisKKyAgICBpZiAoY2ZnLmVuYWJsZV9saWdodF9tb2RlbF90d29fc2lkZSkgeworICAgICAgYi0+V3JpdGUoInZfYmFja19jb2xvciA9IG0uZW1pc3Npb247Iik7CisgICAgICBiLT5Xcml0ZSgidl9iYWNrX2NvbG9yICs9IG0uYW1iaWVudCAqIHVfYW1iaWVudDsiKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFVuaWZvcm1Db250ZXh0OjprTWF4TGlnaHRzOyArK2kpIHsKKyAgICAgIGNvbnN0IFNoYWRlckNvbmZpZzo6TGlnaHRDb25maWcmIGxpZ2h0ID0gY2ZnLmxpZ2h0W2ldOworICAgICAgaWYgKGxpZ2h0LmVuYWJsZWQpIHsKKyAgICAgICAgICBiLT5Xcml0ZSgieyIpOworICAgICAgICAgIGlmIChsaWdodC5kaXJlY3Rpb25hbCkgeworICAgICAgICAgICAgYi0+Rm9ybWF0KCJ2ZWMzIGx2ID0gdV9saWdodFslZF0ucG9zaXRpb24ueHl6OyIsIGkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiLT5Gb3JtYXQoInZlYzMgbHAgPSB1X2xpZ2h0WyVkXS5wb3NpdGlvbi54eXogLSBleWVfcG9zaXRpb24ueHl6OyIsCisgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICBiLT5Xcml0ZSgidmVjMyBsdiA9IG5vcm1hbGl6ZShscCk7Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsaWdodC5zcG90KSB7CisgICAgICAgICAgICBiLT5Gb3JtYXQoImZsb2F0IHNwb3QgPSBsaWdodFNwb3RTaGluaW5lc3ModV9saWdodFslZF0sIGx2KTsiLCBpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYi0+V3JpdGUoImZsb2F0IHNwb3QgPSAxLjA7Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChsaWdodC5hdHRlbnVhdGUpIHsKKyAgICAgICAgICAgIGItPkZvcm1hdCgiZmxvYXQgYXR0ID0gbGlnaHRBdHRlbnVhdGlvbih1X2xpZ2h0WyVkXSwgbHApOyIsIGkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiLT5Xcml0ZSgiZmxvYXQgYXR0ID0gMS4wOyIpOworICAgICAgICAgIH0KKyAgICAgICAgICBiLT5Gb3JtYXQoCisgICAgICAgICAgICAgICJ2X2Zyb250X2NvbG9yICs9IGFwcGx5TGlnaHQodV9saWdodFslZF0sIG0sIGx2LCBub3JtYWwsICIKKyAgICAgICAgICAgICAgImF0dCwgc3BvdCk7IiwgaSk7CisKKyAgICAgICAgICBpZiAoY2ZnLmVuYWJsZV9saWdodF9tb2RlbF90d29fc2lkZSkgeworICAgICAgICAgICAgYi0+Rm9ybWF0KAorICAgICAgICAgICAgICAgICJ2X2JhY2tfY29sb3IgKz0gYXBwbHlMaWdodCh1X2xpZ2h0WyVkXSwgbSwgbHYsIC1ub3JtYWwsICIKKyAgICAgICAgICAgICAgICAiYXR0LCBzcG90KTsiLAorICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgIH0KKyAgICAgICAgICBiLT5Xcml0ZSgifSIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjZmcuZW5hYmxlX2xpZ2h0X21vZGVsX3R3b19zaWRlKSB7CisgICAgICBiLT5Xcml0ZSgidl9iYWNrX2NvbG9yLmEgPSBtLmRpZmZ1c2UuYTsiKTsKKyAgICAgIGItPldyaXRlKCJ2X2JhY2tfY29sb3IgPSBjbGFtcCh2X2JhY2tfY29sb3IsIDAuMCwgMS4wKTsiKTsKKyAgICB9CisKKyAgICBiLT5Xcml0ZSgidl9mcm9udF9jb2xvci5hID0gbS5kaWZmdXNlLmE7Iik7CisgICAgYi0+V3JpdGUoInZfZnJvbnRfY29sb3IgPSBjbGFtcCh2X2Zyb250X2NvbG9yLCAwLjAsIDEuMCk7Iik7CisKKyAgfSBlbHNlIHsKKyAgICBiLT5Xcml0ZSgidl9mcm9udF9jb2xvciA9IGNsYW1wKGFfY29sb3IsIDAuMCwgMS4wKTsiKTsKKyAgfQorfQorCit2b2lkIFdyaXRlRlNTZWxlY3RGYWNlQ29sb3IoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEyCisgIC8vIExpZ2h0aW5nIGNvbXB1dGVzIG9uZSAoZnJvbnQpIG9yIHR3byAoZnJvbnQgYW5kIGJhY2spIGNvbG9ycy4KKyAgLy8gVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHdoaWNoIG9uZSBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIG9uIHRoZSBmcmFnbWVudC4KKyAgaWYgKE5lZWRzQmFja0NvbG9yKGNmZykpIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yID0gZ2xfRnJvbnRGYWNpbmcgPyB2X2Zyb250X2NvbG9yIDogdl9iYWNrX2NvbG9yOyIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IgPSB2X2Zyb250X2NvbG9yOyIpOworICB9Cit9CisKK2Jvb2wgRG9lc0Zvcm1hdEhhdmVDb2xvckNvbXBvbmVudHMoR0xlbnVtIGZvcm1hdCkgeworICByZXR1cm4gZm9ybWF0ICE9IEdMX0FMUEhBOworfQorCitib29sIERvZXNGb3JtYXRIYXZlQWxwaGFDb21wb25lbnRzKEdMZW51bSBmb3JtYXQpIHsKKyAgcmV0dXJuIGZvcm1hdCAhPSBHTF9MVU1JTkFOQ0UgJiYgZm9ybWF0ICE9IEdMX1JHQjsKK30KKwordm9pZCBXcml0ZUZTQ29tcG9zaXRlUmVwbGFjZShHTGVudW0gZm9ybWF0LCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIC8vIGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHRhYmxlIDMuMTUKKyAgaWYgKERvZXNGb3JtYXRIYXZlQ29sb3JDb21wb25lbnRzKGZvcm1hdCkpIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLnJnYiA9IHNhbXBsZXIucmdiOyIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IucmdiID0gcHJldmlvdXMucmdiOyIpOworICB9CisgIGlmIChEb2VzRm9ybWF0SGF2ZUFscGhhQ29tcG9uZW50cyhmb3JtYXQpKSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5hID0gc2FtcGxlci5hOyIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IHByZXZpb3VzLmE7Iik7CisgIH0KK30KKwordm9pZCBXcml0ZUZTQ29tcG9zaXRlTW9kdWxhdGUoR0xlbnVtIGZvcm1hdCwgU3RyaW5nQnVpbGRlciogYikgeworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiB0YWJsZSAzLjE1CisgIGlmIChEb2VzRm9ybWF0SGF2ZUNvbG9yQ29tcG9uZW50cyhmb3JtYXQpKSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5yZ2IgPSBwcmV2aW91cy5yZ2IgKiBzYW1wbGVyLnJnYjsiKTsKKyAgfSBlbHNlIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLnJnYiA9IHByZXZpb3VzLnJnYjsiKTsKKyAgfQorICBpZiAoRG9lc0Zvcm1hdEhhdmVBbHBoYUNvbXBvbmVudHMoZm9ybWF0KSkgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IHByZXZpb3VzLmEgKiBzYW1wbGVyLmE7Iik7CisgIH0gZWxzZSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5hID0gcHJldmlvdXMuYTsiKTsKKyAgfQorfQorCit2b2lkIFdyaXRlRlNDb21wb3NpdGVEZWNhbChHTGVudW0gZm9ybWF0LCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIC8vIGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHRhYmxlIDMuMTUKKyAgaWYgKGZvcm1hdCA9PSBHTF9SR0JBKSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgocHJldmlvdXMucmdiLCBzYW1wbGVyLnJnYiwgc2FtcGxlci5hKTsiKTsKKyAgfSBlbHNlIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLnJnYiA9IHNhbXBsZXIucmdiOyIpOworICB9CisgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IHByZXZpb3VzLmE7Iik7Cit9CisKK3ZvaWQgV3JpdGVGU0NvbXBvc2l0ZUJsZW5kKEdMZW51bSBmb3JtYXQsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgdGFibGUgMy4xNgorICBpZiAoRG9lc0Zvcm1hdEhhdmVDb2xvckNvbXBvbmVudHMoZm9ybWF0KSkgeworICAgIGItPldyaXRlKAorICAgICAgICAiZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peChwcmV2aW91cy5yZ2IsIGNvbnN0YW50LnJnYiwgc2FtcGxlci5yZ2IpOyIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IucmdiID0gcHJldmlvdXMucmdiOyIpOworICB9CisgIGlmIChEb2VzRm9ybWF0SGF2ZUFscGhhQ29tcG9uZW50cyhmb3JtYXQpKSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5hID0gcHJldmlvdXMuYSAqIHNhbXBsZXIuYTsiKTsKKyAgfSBlbHNlIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLmEgPSBwcmV2aW91cy5hOyIpOworICB9Cit9CisKK3ZvaWQgV3JpdGVGU0NvbXBvc2l0ZUFkZChHTGVudW0gZm9ybWF0LCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIC8vIGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHRhYmxlIDMuMTYKKyAgaWYgKERvZXNGb3JtYXRIYXZlQ29sb3JDb21wb25lbnRzKGZvcm1hdCkpIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLnJnYiA9IHByZXZpb3VzLnJnYiArIHNhbXBsZXIucmdiOyIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IucmdiID0gcHJldmlvdXMucmdiOyIpOworICB9CisgIGlmIChEb2VzRm9ybWF0SGF2ZUFscGhhQ29tcG9uZW50cyhmb3JtYXQpKSB7CisgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5hID0gcHJldmlvdXMuYSAqIHNhbXBsZXIuYTsiKTsKKyAgfSBlbHNlIHsKKyAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLmEgPSBwcmV2aW91cy5hOyIpOworICB9CisKKyAgLy8gTm90ZTogVGhpcyBjbGFtcCBpcyBub3QgbWVudGlvbmVkIGZvciB0aGlzIG9wZXJhdGlvbiBpbiAzLjcuMTIsIGJ1dAorICAvLyB3aXRob3V0IGl0IHRoZSBvdXRwdXQgb2YgdGhpcyBzdGFnZSB3b3VsZCBub3QgYmUgYSBwcm9wZXIgY29sb3IKKyAgLy8gdmFsdWUuCisgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IgPSBjbGFtcChnbF9GcmFnQ29sb3IsIGtaZXJvLCBrT25lKTsiKTsKK30KKworY29uc3QgY2hhciogR2V0RlNDb21iaW5lU291cmNlTmFtZShpbnQgc291cmNlKSB7CisgIHN3aXRjaCAoc291cmNlKSB7CisgICAgY2FzZSBHTF9QUkVWSU9VUzoKKyAgICAgIHJldHVybiAicHJldmlvdXMiOworICAgIGNhc2UgR0xfUFJJTUFSWV9DT0xPUjoKKyAgICAgIHJldHVybiAiZnJhZ21lbnQiOworICAgIGNhc2UgR0xfVEVYVFVSRToKKyAgICAgIHJldHVybiAic2FtcGxlciI7CisgICAgY2FzZSBHTF9DT05TVEFOVDoKKyAgICAgIHJldHVybiAiY29uc3RhbnQiOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIHNvdXJjZSAlZCAoJXMpIiwgc291cmNlLCBHZXRFbnVtU3RyaW5nKHNvdXJjZSkpOworICAgICAgcmV0dXJuICJwcmV2aW91cyI7CisgIH0KK30KKworLy8gQ2hvb3NlcyBhIHNvdXJjZSBjb2xvciBhbmQgYWxwaGEgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIGNvbWJpbmUgb3BlcmF0aW9uLgordm9pZCBXcml0ZUZTQ29tYmluZVNvdXJjZVNldHVwKGNvbnN0IFNoYWRlckNvbmZpZzo6VGV4dHVyZUNvbmZpZyYgdGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgdGFibGUgMy4xOC4KKyAgY29uc3QgY2hhciogY29sb3Jfc291cmNlID0gR2V0RlNDb21iaW5lU291cmNlTmFtZSh0ZXguc3JjX3JnYlthcmddKTsKKyAgY29uc3QgaW50IGNvbG9yX29wZXJhbmQgPSB0ZXgub3BlcmFuZF9yZ2JbYXJnXTsKKworICBzd2l0Y2ggKGNvbG9yX29wZXJhbmQpIHsKKyAgICBjYXNlIEdMX1NSQ19DT0xPUjoKKyAgICAgIGItPkZvcm1hdCgiYXJnJWQucmdiID0gJXMucmdiOyIsIGFyZywgY29sb3Jfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19DT0xPUjoKKyAgICAgIGItPkZvcm1hdCgiYXJnJWQucmdiID0ga09uZS5yZ2IgLSAlcy5yZ2I7IiwgYXJnLCBjb2xvcl9zb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgICBiLT5Gb3JtYXQoImFyZyVkLnJnYiA9IGtPbmUucmdiICogJXMuYTsiLCBhcmcsIGNvbG9yX3NvdXJjZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgICBiLT5Gb3JtYXQoImFyZyVkLnJnYiA9IGtPbmUucmdiICogKGtPbmUuYSAtICVzLmEpOyIsIGFyZywgY29sb3Jfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIG9wZXJhbmQgJWQgKCVzKSIsIGNvbG9yX29wZXJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoY29sb3Jfb3BlcmFuZCkpOworICB9CisKKyAgY29uc3QgY2hhciogYWxwaGFfc291cmNlID0gR2V0RlNDb21iaW5lU291cmNlTmFtZSh0ZXguc3JjX2FscGhhW2FyZ10pOworICBjb25zdCBpbnQgYWxwaGFfb3BlcmFuZCA9IHRleC5vcGVyYW5kX2FscGhhW2FyZ107CisKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgdGFibGUgMy4xOS4KKyAgc3dpdGNoIChhbHBoYV9vcGVyYW5kKSB7CisgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgICBiLT5Gb3JtYXQoImFyZyVkLmEgPSAlcy5hOyIsIGFyZywgYWxwaGFfc291cmNlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQToKKyAgICAgIGItPkZvcm1hdCgiYXJnJWQuYSA9IGtPbmUuYSAtICVzLmE7IiwgYXJnLCBhbHBoYV9zb3VyY2UpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gb3BlcmFuZCAlZCAoJXMpIiwgYWxwaGFfb3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0RW51bVN0cmluZyhhbHBoYV9vcGVyYW5kKSk7CisgIH0KK30KKwordm9pZCBXcml0ZUZTQ29tcG9zaXRlQ29tYmluZShjb25zdCBTaGFkZXJDb25maWc6OlRleHR1cmVDb25maWcmIHRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWdlLCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIC8vIEVhY2ggY29tYmluZSBjb21wdXRhdGlvbiBjYW4gdGhyZWUgY29uZmlndXJhYmxlIHNvdXJjZXMuCisgIGZvciAoaW50IGFyZyA9IDA7IGFyZyA8IDM7IGFyZysrKSB7CisgICAgV3JpdGVGU0NvbWJpbmVTb3VyY2VTZXR1cCh0ZXgsIGFyZywgYik7CisgIH0KKworICBjb25zdCBpbnQgY29sb3JfY29tYmluZV9vcCA9IHRleC5jb21iaW5lX3JnYjsKKyAgY29uc3QgaW50IGFscGhhX2NvbWJpbmVfb3AgPSB0ZXguY29tYmluZV9hbHBoYTsKKworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiB0YWJsZSAzLjE3LgorICBzd2l0Y2ggKGNvbG9yX2NvbWJpbmVfb3ApIHsKKyAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLnJnYiA9IGFyZzAucmdiOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NT0RVTEFURToKKyAgICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IucmdiID0gYXJnMC5yZ2IgKiBhcmcxLnJnYjsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfQUREOgorICAgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5yZ2IgPSBhcmcwLnJnYiArIGFyZzEucmdiOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9BRERfU0lHTkVEOgorICAgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5yZ2IgPSBhcmcwLnJnYiArIGFyZzEucmdiIC0ga0hhbGYucmdiOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTlRFUlBPTEFURToKKyAgICAgIGItPldyaXRlKAorICAgICAgICAgICJnbF9GcmFnQ29sb3IucmdiID0gYXJnMC5yZ2IgKiBhcmcyLnJnYiArIGFyZzEucmdiICogIgorICAgICAgICAgICIoa09uZS5yZ2IgLSBhcmcyLnJnYik7Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NVQlRSQUNUOgorICAgICAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvci5yZ2IgPSBhcmcwLnJnYiAtIGFyZzEucmdiOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9ET1QzX1JHQjoKKyAgICAgIGItPldyaXRlKAorICAgICAgICAgICJnbF9GcmFnQ29sb3IucmdiID0gNC4wICogZG90KGFyZzAucmdiIC0ga0hhbGYucmdiLCAiCisgICAgICAgICAgImFyZzEucmdiIC0ga0hhbGYucmdiKSAqIGtPbmUucmdiOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9ET1QzX1JHQkE6CisgICAgICBiLT5Xcml0ZSgKKyAgICAgICAgICAiZ2xfRnJhZ0NvbG9yID0gNC4wICogZG90KGFyZzAucmdiIC0ga0hhbGYucmdiLCAiCisgICAgICAgICAgImFyZzEucmdiIC0ga0hhbGYucmdiKSAqIGtPbmU7Iik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBvcGVyYXRpb24gJWQgKCVzKSIsIGNvbG9yX2NvbWJpbmVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoY29sb3JfY29tYmluZV9vcCkpOworICB9CisKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgdGFibGUgMy4xNy4KKyAgaWYgKGNvbG9yX2NvbWJpbmVfb3AgIT0gR0xfRE9UM19SR0JBKSB7CisgICAgc3dpdGNoIChhbHBoYV9jb21iaW5lX29wKSB7CisgICAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IGFyZzAuYTsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX01PRFVMQVRFOgorICAgICAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLmEgPSBhcmcwLmEgKiBhcmcxLmE7Iik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9BREQ6CisgICAgICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IGFyZzAuYSArIGFyZzEuYTsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0FERF9TSUdORUQ6CisgICAgICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IuYSA9IGFyZzAuYSArIGFyZzEuYSAtIDAuNTsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0lOVEVSUE9MQVRFOgorICAgICAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLmEgPSBhcmcwLmEgKiBhcmcyLmEgKyBhcmcxLmEgKiAoMS4wIC0gYXJnMi5hKTsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX1NVQlRSQUNUOgorICAgICAgICBiLT5Xcml0ZSgiZ2xfRnJhZ0NvbG9yLmEgPSBhcmcwLmEgLSBhcmcxLmE7Iik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBvcGVyYXRpb24gJWQgKCVzKSIsIGFscGhhX2NvbWJpbmVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RW51bVN0cmluZyhhbHBoYV9jb21iaW5lX29wKSk7CisgICAgfQorICB9CisKKyAgLy8gQXBwbHkgdGhlIHNjYWxlIGFuZCBjbGFtcGluZyBmb3IgdGhpcyBjb21iaW5lIG9wZXJhdGlvbi4KKyAgYi0+Rm9ybWF0KCJnbF9GcmFnQ29sb3IgKj0gdV90ZXhlbnZfc2NhbGVbJWRdOyIsIHN0YWdlKTsKKyAgYi0+V3JpdGUoImdsX0ZyYWdDb2xvciA9IGNsYW1wKGdsX0ZyYWdDb2xvciwga1plcm8sIGtPbmUpOyIpOworfQorCit2b2lkIFdyaXRlRlNDb21wb3NpdGVBbGxDb2xvcnMoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIFN0cmluZ0J1aWxkZXIqIGIpIHsKKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAzLjcuMTIKKyAgLy8KKyAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgd29yayBpbnZvbHZlZCBpbiBjb21wb3NpdGluZyBhbGwgdGhlIGNvbG9yCisgIC8vIHNvdXJjZXMgdG9nZXRoZXIgKHRoZSBjb2xvciBmcm9tIHRoZSB2ZXJ0ZXggc2hhZGVyLCBjb2xvcnMgZnJvbSBhbnkKKyAgLy8gdGV4dHVyZSBiaXRtYXBzLCBmcm9tIHRoZSB0ZXh0dXJlIGVudmlyb25tZW50LCAuLi4pCisgIC8vCisgIC8vIFRoaXMgaXMgdGhlIG1vc3QgY29tcGxpY2F0ZWQgcGFydCBvZiB0aGUgR0xFUzEgY29tcGF0YWJpbGl0eSBzaGFkZXIgZHVlIHRvCisgIC8vIHRoZSBzaGVlciBudW1iZXIgb2YgY29tYmluYXRpb25zIG9mIG9wdGlvbnMuIEVhY2ggY29tcG9zaXRlIGNhbGN1bGF0aW9uIGlzCisgIC8vIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLCB0aGVyZSBhcmUganVzdCBzbyBtYW55IG9mIHRoZW0uCisKKyAgLy8gZnJhZ21lbnQgYWx3YXlzIGhvbGRzIHRoZSBmcmFnbWVudCBjb2xvciBwcmlvciB0byBhbnkgY29tcG9zaXRlIG9wZXJhdGlvbnMuCisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQgZnJhZ21lbnQgPSBnbF9GcmFnQ29sb3I7Iik7CisgIC8vIHByZXZpb3VzIGFsd2F5cyBob2xkcyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGNvbXBvc2l0ZSBvcGVyYXRpb24gKG9yIHRoZQorICAvLyB2ZXJ0ZXggY29sb3IgZm9yIHRoZSBmaXJzdCBzdGFnZS4KKyAgYi0+V3JpdGUoIm1lZGl1bXAgdmVjNCBwcmV2aW91czsiKTsKKyAgLy8gc2FtcGxlciBjb250YWlucyB0aGUgY29sb3Igb2YgdGhlIHRleHR1cmUgZm9yIGVhY2ggc3RhZ2UuCisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQgc2FtcGxlcjsiKTsKKyAgLy8gY29uc3RhbnQgY29udGFpbnMgdGhlIGNvbnN0YW50IGNvbG9yIGZvciBlYWNoIHN0YWdlLgorICBiLT5Xcml0ZSgibWVkaXVtcCB2ZWM0IGNvbnN0YW50OyIpOworICAvLyBUaGVzZSBhcmUgdXNlZCBieSB0aGUgR0xfQ09NQklORSBvcGVyYXRpb24uCisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQgYXJnMDsiKTsKKyAgYi0+V3JpdGUoIm1lZGl1bXAgdmVjNCBhcmcxOyIpOworICBiLT5Xcml0ZSgibWVkaXVtcCB2ZWM0IGFyZzI7Iik7CisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQga1plcm8gPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7Iik7CisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQga0hhbGYgPSB2ZWM0KDAuNSwgMC41LCAwLjUsIDAuNSk7Iik7CisgIGItPldyaXRlKCJtZWRpdW1wIHZlYzQga09uZSAgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7Iik7CisKKyAgZm9yIChpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzOyArK3N0YWdlKSB7CisgICAgY29uc3QgU2hhZGVyQ29uZmlnOjpUZXh0dXJlQ29uZmlnJiB0ZXggPSBjZmcudGV4dHVyZVtzdGFnZV07CisgICAgaWYgKCF0ZXguZW5hYmxlZCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgYi0+Rm9ybWF0KCIvKiBDb21wb3NpdGVTdGFnZSglZCkgKi8iLCBzdGFnZSk7CisgICAgYi0+V3JpdGUoInByZXZpb3VzID0gZ2xfRnJhZ0NvbG9yOyIpOworICAgIGItPkZvcm1hdCgiY29uc3RhbnQgPSB1X3RleGVudl9jb25zdFslZF07Iiwgc3RhZ2UpOworICAgIGlmICh0ZXgudGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgIGItPkZvcm1hdCgic2FtcGxlciA9IHRleHR1cmUyRCh1X3NhbXBsZXJfJWQsIHZfdGV4Y29vcmRbJWRdLnh5KTsiLCBzdGFnZSwKKyAgICAgICAgICAgICAgICBzdGFnZSk7CisgICAgfSBlbHNlIGlmICh0ZXgudGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTKSB7CisgICAgICBiLT5Gb3JtYXQoInNhbXBsZXIgPSB0ZXh0dXJlQ3ViZSh1X3NhbXBsZXJfJWQsIHZfdGV4Y29vcmRbJWRdLnh5eik7IiwKKyAgICAgICAgICAgICAgICBzdGFnZSwgc3RhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIHRleHR1cmUgdGFyZ2V0ICVkICglcykiLCB0ZXgudGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKHRleC50YXJnZXQpKTsKKyAgICB9CisKKyAgICAvLyBXaGVuIHJlYWRpbmcgdGV4dHVyZSBkYXRhIGZyb20gbWVtb3J5IGFuZCB1bnBhY2tpbmcgaXQgaW50byB0aGUgUkdCQSBmb3JtCisgICAgLy8gdXNlZCBoZXJlLCBub3RlIHRoZXNlIHJ1bGVzOgorICAgIC8vICAgKiBJZiB0aGUgZm9ybWF0IGRvZXMgbm90IGhhdmUgYW55IGNvbG9yIGNvbXBvbmVudHMgKEFscGhhIG9ubHkpLCB0aGUKKyAgICAvLyAgICAgUkdCIGNvbXBvbmVudHMgd2lsbCBhbGwgZW5kIHVwIGJlaW5nIHplcm8uCisgICAgLy8gICAqIElmIHRoZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBhbHBoYSBjb21wb25lbnQsIHRoZSAuYSBjb21wb25lbnQgd2lsbAorICAgIC8vICAgICBlbmQgdXAgYmVpbmcgc2V0IHRvIG9uZS4KKyAgICBzd2l0Y2ggKHRleC5tb2RlKSB7CisgICAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgICAgIFdyaXRlRlNDb21wb3NpdGVSZXBsYWNlKHRleC5mb3JtYXQsIGIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfTU9EVUxBVEU6CisgICAgICAgIFdyaXRlRlNDb21wb3NpdGVNb2R1bGF0ZSh0ZXguZm9ybWF0LCBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0RFQ0FMOgorICAgICAgICBXcml0ZUZTQ29tcG9zaXRlRGVjYWwodGV4LmZvcm1hdCwgYik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHTF9CTEVORDoKKyAgICAgICAgV3JpdGVGU0NvbXBvc2l0ZUJsZW5kKHRleC5mb3JtYXQsIGIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQUREOgorICAgICAgICBXcml0ZUZTQ29tcG9zaXRlQWRkKHRleC5mb3JtYXQsIGIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfQ09NQklORToKKyAgICAgICAgV3JpdGVGU0NvbXBvc2l0ZUNvbWJpbmUodGV4LCBzdGFnZSwgYik7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biB0ZXh0dXJlIGVudmlyb25tZW50IG1vZGUgJWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Lm1vZGUsIEdldEVudW1TdHJpbmcodGV4Lm1vZGUpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBXcml0ZUZTQ29tcHV0ZUZvZyhjb25zdCBTaGFkZXJDb25maWcmIGNmZywgU3RyaW5nQnVpbGRlciogYikgeworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDMuOAorICBpZiAoY2ZnLmVuYWJsZV9mb2cpIHsKKyAgICBzd2l0Y2ggKGNmZy5mb2dfbW9kZSkgeworICAgICAgY2FzZSBHTF9MSU5FQVI6CisgICAgICAgIGItPldyaXRlKAorICAgICAgICAgICAgIm1lZGl1bXAgZmxvYXQgZm9nID0gKHVfZm9nX2VuZCAtIHZfZm9nX2Rpc3RhbmNlKSAvIgorICAgICAgICAgICAgIiAodV9mb2dfZW5kIC0gdV9mb2dfc3RhcnQpOyIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgR0xfRVhQOgorICAgICAgICBiLT5Xcml0ZSgibWVkaXVtcCBmbG9hdCBmb2cgPSBleHAoLSh1X2ZvZ19kZW5zaXR5ICogdl9mb2dfZGlzdGFuY2UpKTsiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEdMX0VYUDI6CisgICAgICAgIGItPldyaXRlKAorICAgICAgICAgICAgIm1lZGl1bXAgZmxvYXQgZm9nID0gZXhwKC0odV9mb2dfZGVuc2l0eSAqIHVfZm9nX2RlbnNpdHkgKiIKKyAgICAgICAgICAgICIgdl9mb2dfZGlzdGFuY2UgKiB2X2ZvZ19kaXN0YW5jZSkpOyIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gRm9nIE1vZGU6ICVzIiwgR2V0RW51bVN0cmluZyhjZmcuZm9nX21vZGUpKTsKKyAgICB9CisgICAgYi0+V3JpdGUoImZvZyA9IGNsYW1wKGZvZywgMC4wLCAxLjApOyIpOworICAgIGItPldyaXRlKCJnbF9GcmFnQ29sb3IucmdiID0gbWl4KHVfZm9nX2NvbG9yLnJnYiwgZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nKTsiKTsKKyAgfQorfQorCit2b2lkIFdyaXRlRlNUZXN0RnJhZ21lbnRBbHBoYShjb25zdCBTaGFkZXJDb25maWcmIGNmZywgU3RyaW5nQnVpbGRlciogYikgeworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDQuMS40CisgIC8vIEluIEdMRVMxLCBhIHRlc3QgaXMgcGVyZm9ybWVkIGluIGhhcmR3YXJlIG9uIHRoZSBmaW5hbCBmcmFnbWVudCBhbHBoYSB3aXRoCisgIC8vIHRoZSBpbnRlbnQgb2Ygb25seSByZW5kZXJpbmcgZnJhZ21lbnRzIHRoYXQgcGFzcyB0aGUgdGVzdC4KKyAgaWYgKCFjZmcuZW5hYmxlX2FscGhhX3Rlc3QpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKGNmZy5hbHBoYV9mdW5jKSB7CisgICAgY2FzZSBHTF9BTFdBWVM6CisgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9ORVZFUjoKKyAgICAgIGItPldyaXRlKCJkaXNjYXJkOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9FUVVBTDoKKyAgICAgIGItPldyaXRlKCJpZiAoZ2xfRnJhZ0NvbG9yLmEgIT0gdV9hbHBoYV90ZXN0X2NvbnN0YW50KSB7IGRpc2NhcmQ7IH0iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfTk9URVFVQUw6CisgICAgICBiLT5Xcml0ZSgiaWYgKGdsX0ZyYWdDb2xvci5hID09IHVfYWxwaGFfdGVzdF9jb25zdGFudCkgeyBkaXNjYXJkOyB9Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xFU1M6CisgICAgICBiLT5Xcml0ZSgiaWYgKGdsX0ZyYWdDb2xvci5hID49IHVfYWxwaGFfdGVzdF9jb25zdGFudCkgeyBkaXNjYXJkOyB9Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xFUVVBTDoKKyAgICAgIGItPldyaXRlKCJpZiAoZ2xfRnJhZ0NvbG9yLmEgPiB1X2FscGhhX3Rlc3RfY29uc3RhbnQpIHsgZGlzY2FyZDsgfSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9HUkVBVEVSOgorICAgICAgYi0+V3JpdGUoImlmIChnbF9GcmFnQ29sb3IuYSA8PSB1X2FscGhhX3Rlc3RfY29uc3RhbnQpIHsgZGlzY2FyZDsgfSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9HRVFVQUw6CisgICAgICBiLT5Xcml0ZSgiaWYgKGdsX0ZyYWdDb2xvci5hIDwgdV9hbHBoYV90ZXN0X2NvbnN0YW50KSB7IGRpc2NhcmQ7IH0iKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIEFscGhhIEZ1bmM6ICVzIiwgR2V0RW51bVN0cmluZyhjZmcuYWxwaGFfZnVuYykpOworICB9Cit9CisKK3ZvaWQgV3JpdGVWU1Bvc2l0aW9uQW5kTm9ybWFsKGNvbnN0IFNoYWRlckNvbmZpZyYgY2ZnLCBTdHJpbmdCdWlsZGVyKiBiKSB7CisgIGItPldyaXRlKCJ2ZWM0IGV5ZV9wb3NpdGlvbjsiKTsKKyAgaWYgKE5lZWRzTm9ybWFsKGNmZykpIHsKKyAgICBiLT5Xcml0ZSgidmVjMyBub3JtYWw7Iik7CisgIH0KKworICBpZiAoY2ZnLmVuYWJsZV9tYXRyaXhfcGFsZXR0ZSkgeworICAgIGItPkZvcm1hdCgiZm9yIChpbnQgaSA9IDA7IGkgPCAlZDsgaSsrKSB7IiwgY2ZnLnZlcnRleF91bml0cyk7CisgICAgYi0+V3JpdGUoIiAgaW50IG1hdHJpeF9pbmRleCA9IGludChhX21hdHJpeF9pbmRleFtpXSk7Iik7CisgICAgYi0+V3JpdGUoIiAgbWF0NCBtYXRyaXggPSB1X3BhbGV0dGVfbWF0cml4W21hdHJpeF9pbmRleF07Iik7CisgICAgYi0+V3JpdGUoIiAgZXllX3Bvc2l0aW9uICs9IGFfd2VpZ2h0W2ldICogbWF0cml4ICogYV9wb3NpdGlvbjsiKTsKKyAgICBpZiAoTmVlZHNOb3JtYWwoY2ZnKSkgeworICAgICAgYi0+V3JpdGUoIiAgbWF0cml4ID0gdV9wYWxldHRlX2ludl9tYXRyaXhbbWF0cml4X2luZGV4XTsiKTsKKyAgICAgIGItPldyaXRlKCIgIG5vcm1hbCArPSBhX3dlaWdodFtpXSAqIG1hdDMobWF0cml4KSAqIGFfbm9ybWFsOyIpOworICAgIH0KKyAgICBiLT5Xcml0ZSgifSIpOworICB9IGVsc2UgeworICAgIGItPldyaXRlKCJleWVfcG9zaXRpb24gPSB1X212X21hdHJpeCAqIGFfcG9zaXRpb247Iik7CisgICAgaWYgKE5lZWRzTm9ybWFsKGNmZykpIHsKKyAgICAgIGItPldyaXRlKCJub3JtYWwgPSBtYXQzKHVfbXZfaW52ZXJzZV90cmFuc3Bvc2VfbWF0cml4KSAqIGFfbm9ybWFsOyIpOworICAgIH0KKyAgfQorCisgIGItPldyaXRlKCJnbF9Qb3NpdGlvbiA9IHVfcF9tYXRyaXggKiBleWVfcG9zaXRpb247Iik7CisgIGlmIChjZmcuZW5hYmxlX25vcm1hbGl6ZSAmJiBOZWVkc05vcm1hbChjZmcpKSB7CisgICAgYi0+V3JpdGUoIm5vcm1hbCA9IG5vcm1hbGl6ZShub3JtYWwpOyIpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIEdlbmVyYXRlVmVydGV4U2hhZGVyKGNvbnN0IFNoYWRlckNvbmZpZyYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplKSB7CisgIFN0cmluZ0J1aWxkZXIgYnVmZmVyKG91dHB1dF9idWZmZXIsIG91dHB1dF9idWZmZXJfc2l6ZSk7CisKKyAgV3JpdGVWU0hlYWRlcihjb25maWcsICZidWZmZXIpOworCisgIGJ1ZmZlci5Xcml0ZSgidm9pZCBtYWluKCkgeyIpOworICBXcml0ZVZTUG9zaXRpb25BbmROb3JtYWwoY29uZmlnLCAmYnVmZmVyKTsKKyAgV3JpdGVWU0NvbXB1dGVDbGlwUGxhbmVEaXN0YW5jZXMoY29uZmlnLCAmYnVmZmVyKTsKKyAgV3JpdGVWU0NvbXB1dGVUZXh0dXJlQ29vcmRpbmF0ZXMoY29uZmlnLCAmYnVmZmVyKTsKKyAgV3JpdGVWU0NvbXB1dGVMaWdodGluZyhjb25maWcsICZidWZmZXIpOworICBXcml0ZVZTQ29tcHV0ZUZvZ0Rpc3RhbmNlKGNvbmZpZywgJmJ1ZmZlcik7CisgIFdyaXRlVlNDb21wdXRlUG9pbnRTaXplKGNvbmZpZywgJmJ1ZmZlcik7CisgIGJ1ZmZlci5Xcml0ZSgifSIpOworfQorCit2b2lkIEdlbmVyYXRlRnJhZ21lbnRTaGFkZXIoY29uc3QgU2hhZGVyQ29uZmlnJiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSkgeworICBTdHJpbmdCdWlsZGVyIGJ1ZmZlcihvdXRwdXRfYnVmZmVyLCBvdXRwdXRfYnVmZmVyX3NpemUpOworCisgIFdyaXRlRlNIZWFkZXIoY29uZmlnLCAmYnVmZmVyKTsKKworICBidWZmZXIuV3JpdGUoInZvaWQgbWFpbigpIHsiKTsKKyAgaWYgKGNvbmZpZy5tb2RlID09IEdMX1BPSU5UUykgeworICAgIFdyaXRlRlNUZXN0UG9pbnRTaGFwZShjb25maWcsICZidWZmZXIpOworICB9CisgIFdyaXRlRlNUZXN0Q2xpcFBsYW5lcyhjb25maWcsICZidWZmZXIpOworICBXcml0ZUZTU2VsZWN0RmFjZUNvbG9yKGNvbmZpZywgJmJ1ZmZlcik7CisgIFdyaXRlRlNDb21wb3NpdGVBbGxDb2xvcnMoY29uZmlnLCAmYnVmZmVyKTsKKyAgV3JpdGVGU0NvbXB1dGVGb2coY29uZmlnLCAmYnVmZmVyKTsKKyAgV3JpdGVGU1Rlc3RGcmFnbWVudEFscGhhKGNvbmZpZywgJmJ1ZmZlcik7CisgIGJ1ZmZlci5Xcml0ZSgifSIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlczFfc2hhZGVyX2dlbmVyYXRvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlczFfc2hhZGVyX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDNjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzMV9zaGFkZXJfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfR0xFUzFfU0hBREVSX0dFTkVSQVRPUl9IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0dMRVMxX1NIQURFUl9HRU5FUkFUT1JfSF8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlICJnbGVzL3N0YXRlLmgiCisKK3N0cnVjdCBTaGFkZXJDb25maWcgeworICBTaGFkZXJDb25maWcoKSB7IG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsgfQorCisgIC8vIFNpbmNlIHdlIHVzZSBtZW1jbXAgaW4gb3BlcmF0b3I9PSwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgY29weSBhbGwgdGhlCisgIC8vIGJpdHMgaW5jbHVkaW5nIGFueSBwYWRkaW5nLiAgKFRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3Igd2lsbCBpZ25vcmUKKyAgLy8gYW55IHBhZGRpbmcgYml0cy4pCisgIFNoYWRlckNvbmZpZyhjb25zdCBTaGFkZXJDb25maWcmIHJocykgeyBtZW1jcHkodGhpcywgJnJocywgc2l6ZW9mKHJocykpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNoYWRlckNvbmZpZyYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIG1lbWNtcCh0aGlzLCAmcmhzLCBzaXplb2YocmhzKSkgPT0gMDsKKyAgfQorCisgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkyMCk6IFRoaXMgc3RydWN0dXJlIGR1cGxpY2F0ZXMgdGhlIFRleEVudiAmIFRleEdlbgorICAvLyBzdHJ1Y3R1cmVzIHNvbWV3aGF0LiAgSXQgd291bGQgYmUgbmljZSB0byBlbGltaW5hdGUgdGhhdCBkdXBsaWNhdGlvbi4KKyAgc3RydWN0IFRleHR1cmVDb25maWcgeworICAgIGJvb2wgZW5hYmxlZDsKKyAgICBHTGVudW0gbW9kZTsKKyAgICBHTGVudW0gdGFyZ2V0OworICAgIEdMZW51bSBmb3JtYXQ7CisgICAgR0xlbnVtIGNvbWJpbmVfcmdiOworICAgIEdMZW51bSBjb21iaW5lX2FscGhhOworICAgIEdMZW51bSBzcmNfcmdiWzNdOworICAgIEdMZW51bSBzcmNfYWxwaGFbM107CisgICAgR0xlbnVtIG9wZXJhbmRfcmdiWzNdOworICAgIEdMZW51bSBvcGVyYW5kX2FscGhhWzNdOworICAgIEdMZW51bSB0ZXhnZW5fbW9kZTsKKyAgICBib29sIHRleGdlbl9lbmFibGVkOworICB9OworCisgIHN0cnVjdCBMaWdodENvbmZpZyB7CisgICAgYm9vbCBlbmFibGVkOworICAgIGJvb2wgZGlyZWN0aW9uYWw7CisgICAgYm9vbCBzcG90OworICAgIGJvb2wgYXR0ZW51YXRlOworICB9OworCisgIFRleHR1cmVDb25maWcgdGV4dHVyZVtVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0c107CisgIExpZ2h0Q29uZmlnIGxpZ2h0W1VuaWZvcm1Db250ZXh0OjprTWF4TGlnaHRzXTsKKyAgR0xlbnVtIG1vZGU7CisgIEdMZW51bSBmb2dfbW9kZTsKKyAgR0xlbnVtIGFscGhhX2Z1bmM7CisgIEdMdWludCB2ZXJ0ZXhfdW5pdHM7CisgIGJvb2wgZW5hYmxlX2NsaXBfcGxhbmVbVW5pZm9ybUNvbnRleHQ6OmtNYXhDbGlwUGxhbmVzXTsKKyAgYm9vbCBlbmFibGVfYWxwaGFfdGVzdCA6IDE7CisgIGJvb2wgZW5hYmxlX2NvbG9yX21hdGVyaWFsIDogMTsKKyAgYm9vbCBlbmFibGVfZm9nIDogMTsKKyAgYm9vbCBlbmFibGVfbGlnaHRfbW9kZWxfdHdvX3NpZGUgOiAxOworICBib29sIGVuYWJsZV9saWdodGluZyA6IDE7CisgIGJvb2wgZW5hYmxlX25vcm1hbGl6ZSA6IDE7CisgIGJvb2wgZW5hYmxlX3BvaW50X3Ntb290aCA6IDE7CisgIGJvb2wgZW5hYmxlX3BvaW50X3Nwcml0ZSA6IDE7CisgIGJvb2wgZW5hYmxlX21hdHJpeF9wYWxldHRlIDogMTsKKyAgYm9vbCBhbnlfY2xpcF9wbGFuZXNfZW5hYmxlZCA6IDE7CisgIGJvb2wgYW55X3RleHR1cmVfdW5pdHNfZW5hYmxlZCA6IDE7CisgIGJvb2wgYW55X3RleHR1cmVfZ2VuX25vcm1hbF9tYXAgOiAxOworICBib29sIGFueV90ZXh0dXJlX2dlbl9yZWZsZWN0aW9uX21hcCA6IDE7CisKKyBwcml2YXRlOgorICBTaGFkZXJDb25maWcmIG9wZXJhdG9yPShjb25zdCBTaGFkZXJDb25maWcmKTsKK307CisKK3ZvaWQgR2VuZXJhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgU2hhZGVyQ29uZmlnJiBjZmcsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbik7CisKK3ZvaWQgR2VuZXJhdGVGcmFnbWVudFNoYWRlcihjb25zdCBTaGFkZXJDb25maWcmIGNmZywgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuKTsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0dMRVMxX1NIQURFUl9HRU5FUkFUT1JfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfY29udGV4dC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTU2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJnbGVzL2dsZXNfY29udGV4dC5oIgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb21tb24vYWxvZy5oIgorI2luY2x1ZGUgImNvbW1vbi9kbG9nLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX29wdGlvbnMuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9mcmFtZWJ1ZmZlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX3V0aWxzLmgiCisjaW5jbHVkZSAiZ2xlcy9tYWNyb3MuaCIKKyNpbmNsdWRlICJnbGVzL3Byb2dyYW1fZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvcmVuZGVyYnVmZmVyX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL3NoYWRlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9zdGF0ZS5oIgorI2luY2x1ZGUgImdsZXMvdGV4dHVyZV9kYXRhLmgiCisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgVkVSVEVYX0FUVFJJQlVURV9LRVkoZW51bSwgbmFtZSkgbmFtZSwKK2NvbnN0IGNoYXIqIGtWZXJ0ZXhBdHRyaWJ1dGVOYW1lc1tdID0ge1ZFUlRFWF9BVFRSSUJVVEVfS0VZX1RVUExFfTsKKyN1bmRlZiBWRVJURVhfQVRUUklCVVRFX0tFWQorCit1aW50MzJfdCBIYXNoKGNvbnN0IGNoYXIqIHN0cikgeworICB1aW50MzJfdCByZXMgPSAwOworICB3aGlsZSAoKnN0cikgeworICAgIHJlcyA9IChyZXMgKiAxMDEpICArICAqc3RyKys7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKwordm9pZCBEZWxldGVTaGFkZXIoR0x1aW50KiBzaGFkZXIpIHsKKyAgaWYgKEdldEN1cnJlbnRHbGVzQ29udGV4dCgpKSB7CisgICAgUEFTU19USFJPVUdIKEdldEN1cnJlbnRHbGVzQ29udGV4dCgpLCBEZWxldGVTaGFkZXIsICpzaGFkZXIpOworICB9Cit9CisKK3ZvaWQgRGVsZXRlUHJvZ3JhbShQcm9ncmFtQ29udGV4dCogcHJvZ3JhbSkgeworICBpZiAoR2V0Q3VycmVudEdsZXNDb250ZXh0KCkpIHsKKyAgICBwcm9ncmFtLT5EZWxldGUoKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworR2xlc0NvbnRleHQ6OkdsZXNDb250ZXh0KGludDMyX3QgaWQsIEdsZXNWZXJzaW9uIHZlcnNpb24sIEdsZXNDb250ZXh0KiBzaGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1bmRlcmx5aW5nX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5kZXJseWluZ0FwaXMqIHVuZGVybHlpbmdfYXBpcykKKyAgICA6IHVuaWZvcm1fY29udGV4dF8odGhpcyksCisgICAgICB0ZXh0dXJlX2NvbnRleHRfKHRoaXMpLAorICAgICAgcG9pbnRlcl9jb250ZXh0Xyh0aGlzKSwKKyAgICAgIGFycmF5X2J1ZmZlcl9iaW5kaW5nXygwKSwKKyAgICAgIGVsZW1lbnRfYnVmZmVyX2JpbmRpbmdfKDApLAorICAgICAgZnJhbWVidWZmZXJfYmluZGluZ18oMCksCisgICAgICByZW5kZXJidWZmZXJfYmluZGluZ18oMCksCisgICAgICB2ZXJzaW9uXyh2ZXJzaW9uKSwKKyAgICAgIGlkXyhpZCArIHZlcnNpb24gKiAxMDAwMDApLAorICAgICAgaW5pdGlhbGl6ZWRfKGZhbHNlKSwKKyAgICAgIGluaXRpYWxpemVkX3ZpZXdwb3J0XyhmYWxzZSksCisgICAgICBlcnJvcl8oR0xfTk9fRVJST1IpLAorICAgICAgZ2xlc19pbXBsXyh1bmRlcmx5aW5nX2NvbnRleHQpLAorICAgICAgYXBpc18odW5kZXJseWluZ19hcGlzKSwKKyAgICAgIHNoYXJlX2dyb3VwXyhOVUxMKSwKKyAgICAgIGdsb2JhbF9vdmVycmlkZV9mcmFtZWJ1ZmZlcl8oMCksCisgICAgICBnbG9iYWxfZnJhbWVidWZmZXJfKDApLAorICAgICAgZ2xvYmFsX2RlcHRoX3JlbmRlcmJ1ZmZlcl8oMCksCisgICAgICBnbG9iYWxfc3RlbmNpbF9yZW5kZXJidWZmZXJfKDApLAorICAgICAgY2FjaGVkX2RyYXdfd2lkdGhfKDApLAorICAgICAgY2FjaGVkX2RyYXdfaGVpZ2h0XygwKSwKKyAgICAgIGNhY2hlZF9kcmF3X3N0ZW5jaWxfc2l6ZV8oMCksCisgICAgICBjYWNoZWRfZHJhd19kZXB0aF9zaXplXygwKSwKKyAgICAgIGNhY2hlZF9nbG9iYWxfdGV4dHVyZV8oMCksCisgICAgICB2ZXJ0ZXhfc2hhZGVyX2NhY2hlXyhrQ2FjaGVMaW1pdCwgJkRlbGV0ZVNoYWRlciksCisgICAgICBmcmFnbWVudF9zaGFkZXJfY2FjaGVfKGtDYWNoZUxpbWl0LCAmRGVsZXRlU2hhZGVyKSwKKyAgICAgIHByb2dyYW1fY2FjaGVfKGtDYWNoZUxpbWl0LCAmRGVsZXRlUHJvZ3JhbSksCisgICAgICBmdWxsc2NyZWVuX3F1YWRfKE5VTEwpLAorICAgICAgY2hlY2tzX2VuYWJsZWRfKGVtdWdsOjpHbGVzT3B0aW9uczo6R0xFcnJvckNoZWNrc0VuYWJsZWQoKSksCisgICAgICBnbG9iYWxfZXh0ZW5zaW9uc18oTlVMTCksCisgICAgICBzdXBwb3J0c19wYWNrZWRfZGVwdGhfc3RlbmNpbF8oZmFsc2UpIHsKKyAgaWYgKHNoYXJlKSB7CisgICAgc2hhcmVfZ3JvdXBfID0gc2hhcmUtPkdldFNoYXJlR3JvdXAoKTsKKyAgfSBlbHNlIHsKKyAgICBzaGFyZV9ncm91cF8gPSBTaGFyZUdyb3VwUHRyKG5ldyBTaGFyZUdyb3VwKHRoaXMpKTsKKyAgfQorfQorCitHbGVzQ29udGV4dDo6fkdsZXNDb250ZXh0KCkgeworICBEZWxldGVGcmFtZWJ1ZmZlck92ZXJyaWRlKCk7CisgIGRlbGV0ZSBmdWxsc2NyZWVuX3F1YWRfOworfQorCit2b2lkIEdsZXNDb250ZXh0OjpPbk1ha2VDdXJyZW50KCkgeworICAgIFJlc3RvcmUoKTsKK30KKwordm9pZCBHbGVzQ29udGV4dDo6SW52YWxpZGF0ZSgpIHsKKyAgaWYgKGluaXRpYWxpemVkXykgeworICAgIHBvaW50ZXJfY29udGV4dF8uUmVsZWFzZSgpOworICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICB9Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OlJlc3RvcmUoKSB7CisgIGlmIChpbml0aWFsaXplZF8pIHsKKyAgICAgIERMT0coIkNvbnRleHQgYWxyZWFkeSBpbml0aWFsaXplZCwgZ28gYXdheS4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCBpbnQgbWF4X3RleHR1cmVfdW5pdHMgPSBVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0czsKKyAgRExPRygiSW5pdGlhbGl6ZSBwb2ludGVyLCB0ZXh0dXJlLCBhbmQgdW5pZm9ybSBjb250ZXh0cy4iKTsKKyAgaWYgKHZlcnNpb25fID09IGtHbGVzMTEpIHsKKyAgICBwb2ludGVyX2NvbnRleHRfLkluaXQoa051bVZlcnRleEF0dHJpYnV0ZUtleXMpOworICB9IGVsc2UgaWYgKHZlcnNpb25fID09IGtHbGVzMjApIHsKKyAgICBwb2ludGVyX2NvbnRleHRfLkluaXQobWF4X3ZlcnRleF9hdHRyaWJzXy5HZXQoKSk7CisgIH0gZWxzZSB7CisgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBHTEVTIHZlcnNpb24gJWQiLCB2ZXJzaW9uXyk7CisgIH0KKyAgdGV4dHVyZV9jb250ZXh0Xy5Jbml0KG1heF90ZXh0dXJlX3VuaXRzLCBtYXhfdGV4dHVyZV9zaXplXy5HZXQoKSk7CisgIHVuaWZvcm1fY29udGV4dF8uSW5pdChtYXhfdGV4dHVyZV91bml0cyk7CisKKyAgaWYgKHZlcnNpb25fID09IGtHbGVzMTEpIHsKKyAgICAgIEdMZmxvYXQgdmFsdWVzWzRdOworICAgICAgRExPRygiUGFzcyB0aHJvdWdoIGdsVmVydGV4QXR0cmliNGZ2Iik7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgVmVydGV4QXR0cmliNGZ2LCBrQ29sb3JWZXJ0ZXhBdHRyaWJ1dGUsCisgICAgICAgICAgICAgIHVuaWZvcm1fY29udGV4dF8uR2V0Q29sb3IoKS5HZXRGbG9hdEFycmF5KHZhbHVlcykpOworICAgICAgUEFTU19USFJPVUdIKHRoaXMsIFZlcnRleEF0dHJpYjRmdiwga05vcm1hbFZlcnRleEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgdW5pZm9ybV9jb250ZXh0Xy5HZXROb3JtYWwoKS5HZXRGbG9hdEFycmF5KHZhbHVlcykpOworICAgICAgUEFTU19USFJPVUdIKHRoaXMsIFZlcnRleEF0dHJpYjFmLCBrUG9pbnRTaXplVmVydGV4QXR0cmlidXRlLAorICAgICAgICAgICAgICB1bmlmb3JtX2NvbnRleHRfLkdldFBvaW50UGFyYW1ldGVycygpLmN1cnJlbnRfc2l6ZSk7CisgIH0KKworICBpbml0aWFsaXplZF8gPSB0cnVlOworfQorCit2b2lkIEdsZXNDb250ZXh0OjpPbkF0dGFjaFN1cmZhY2UoU3VyZmFjZUNvbnRyb2xDYWxsYmFja1B0ciBzZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCkgeworICBzdXJmYWNlX2NhbGxiYWNrXyA9IHNmYzsKKyAgaWYgKCFpbml0aWFsaXplZF92aWV3cG9ydF8pIHsKKyAgICBpbml0aWFsaXplZF92aWV3cG9ydF8gPSB0cnVlOworCisgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhhdCBhIGNvbnRleHQgaXMgYXR0YWNoZWQgdG8gYSBzdXJmYWNlLCB0aGUgY29udGV4dCBuZWVkcworICAgIC8vIHRvIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGRyYXcgc3VyZmFjZS4gVGhlc2UKKyAgICAvLyBkaW1lbnNpb25zIGFyZSB1c2VkIHRvIGluaXRpYWxpemVkIHRoZSB2aWV3cG9ydCBhbmQgc2Npc3NvciByZWN0YW5nbGVzCisgICAgLy8gY29ycmVjdGx5IGZvciB0aGUgc3VyZmFjZS4KKyAgICAvLyBJdCBpcyB0aGUgY2xpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gbWFpbnRhaW4gdGhvc2UgdmFsdWVzIGFmdGVyd2FyZHMuCisgICAgdmlld3BvcnRfLk11dGF0ZSgpWzBdID0gMDsKKyAgICB2aWV3cG9ydF8uTXV0YXRlKClbMV0gPSAwOworICAgIHZpZXdwb3J0Xy5NdXRhdGUoKVsyXSA9IHdpZHRoOworICAgIHZpZXdwb3J0Xy5NdXRhdGUoKVszXSA9IGhlaWdodDsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgVmlld3BvcnQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBTY2lzc29yLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgfQorfQorCit2b2lkIEdsZXNDb250ZXh0OjpVcGRhdGVGcmFtZWJ1ZmZlck92ZXJyaWRlKEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGRlcHRoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHN0ZW5jaWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGdsb2JhbF90ZXh0dXJlX25hbWUpIHsKKyAgRW5zdXJlVW5kZXJseWluZ0V4dGVuc2lvbnNLbm93bigpOworCisgIGNvbnN0IGJvb2wgd2lkdGhfY2hhbmdlZCA9IGNhY2hlZF9kcmF3X3dpZHRoXyAhPSB3aWR0aDsKKyAgY29uc3QgYm9vbCBoZWlnaHRfY2hhbmdlZCA9IGNhY2hlZF9kcmF3X2hlaWdodF8gIT0gaGVpZ2h0OworICBjb25zdCBib29sIGRlcHRoX2NoYW5nZWQgPSBjYWNoZWRfZHJhd19kZXB0aF9zaXplXyAhPSBkZXB0aF9zaXplOworICBjb25zdCBib29sIHN0ZW5jaWxfY2hhbmdlZCA9IGNhY2hlZF9kcmF3X3N0ZW5jaWxfc2l6ZV8gIT0gc3RlbmNpbF9zaXplOworICBjb25zdCBib29sIHRleHR1cmVfY2hhbmdlZCA9IGNhY2hlZF9nbG9iYWxfdGV4dHVyZV8gIT0gZ2xvYmFsX3RleHR1cmVfbmFtZTsKKworICBpZiAoZ2xvYmFsX3RleHR1cmVfbmFtZSkgeworICAgIGlmICh3aWR0aF9jaGFuZ2VkIHx8IGhlaWdodF9jaGFuZ2VkIHx8IGRlcHRoX2NoYW5nZWQgfHwgc3RlbmNpbF9jaGFuZ2VkKSB7CisgICAgICBEZWxldGVGcmFtZWJ1ZmZlck92ZXJyaWRlKCk7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgR2VuRnJhbWVidWZmZXJzLCAxLCAmZ2xvYmFsX2ZyYW1lYnVmZmVyXyk7CisgICAgfQorCisgICAgaWYgKHdpZHRoX2NoYW5nZWQgfHwgaGVpZ2h0X2NoYW5nZWQgfHwgdGV4dHVyZV9jaGFuZ2VkKSB7CisgICAgICBTZXR1cENvbG9yVGV4dHVyZUF0dGFjaG1lbnQoZ2xvYmFsX3RleHR1cmVfbmFtZSk7CisgICAgfQorCisgICAgaWYgKHdpZHRoX2NoYW5nZWQgfHwgaGVpZ2h0X2NoYW5nZWQgfHwgZGVwdGhfY2hhbmdlZCB8fCBzdGVuY2lsX2NoYW5nZWQpIHsKKyAgICAgIFNldHVwRGVwdGhTdGVuY2lsQXR0YWNobWVudCh3aWR0aCwgaGVpZ2h0LCBkZXB0aF9zaXplLCBzdGVuY2lsX3NpemUpOworICAgIH0KKworICAgIGlmIChBcmVDaGVja3NFbmFibGVkKCkpIHsKKyAgICAgIGNvbnN0IEdMaW50IHN0YXR1cyA9IFBBU1NfVEhST1VHSCh0aGlzLCBDaGVja0ZyYW1lYnVmZmVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0ZSQU1FQlVGRkVSKTsKKyAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igb3ZlcnJpZGluZyBmcmFtZWJ1ZmZlcjogMHgleCIsIHN0YXR1cyk7CisgICAgfQorICAgIGdsb2JhbF9vdmVycmlkZV9mcmFtZWJ1ZmZlcl8gPSBnbG9iYWxfZnJhbWVidWZmZXJfOworICB9IGVsc2UgeworICAgIGdsb2JhbF9vdmVycmlkZV9mcmFtZWJ1ZmZlcl8gPSAwOworICB9CisKKyAgY2FjaGVkX2RyYXdfd2lkdGhfID0gd2lkdGg7CisgIGNhY2hlZF9kcmF3X2hlaWdodF8gPSBoZWlnaHQ7CisgIGNhY2hlZF9kcmF3X2RlcHRoX3NpemVfID0gZGVwdGhfc2l6ZTsKKyAgY2FjaGVkX2RyYXdfc3RlbmNpbF9zaXplXyA9IHN0ZW5jaWxfc2l6ZTsKKyAgY2FjaGVkX2dsb2JhbF90ZXh0dXJlXyA9IGdsb2JhbF90ZXh0dXJlX25hbWU7CisKKyAgLy8gUmVzdG9yZSBvcmlnaW5hbCBiaW5kaW5ncyBhcyB0aGV5IG1heSBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aGVuIHVwZGF0aW5nCisgIC8vIHRoZSBmcmFtZWJ1ZmZlciBhdHRhY2htZW50cy4KKyAgUEFTU19USFJPVUdIKHRoaXMsIEJpbmRSZW5kZXJidWZmZXIsIEdMX1JFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgIHNoYXJlX2dyb3VwXy0+R2V0UmVuZGVyYnVmZmVyR2xvYmFsTmFtZShyZW5kZXJidWZmZXJfYmluZGluZ18pKTsKKyAgaWYgKGZyYW1lYnVmZmVyX2JpbmRpbmdfICE9IDApIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZEZyYW1lYnVmZmVyLCBHTF9GUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgc2hhcmVfZ3JvdXBfLT5HZXRGcmFtZWJ1ZmZlckdsb2JhbE5hbWUoZnJhbWVidWZmZXJfYmluZGluZ18pKTsKKyAgfSBlbHNlIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZEZyYW1lYnVmZmVyLCBHTF9GUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgZ2xvYmFsX292ZXJyaWRlX2ZyYW1lYnVmZmVyXyk7CisgIH0KK30KKwordm9pZCBHbGVzQ29udGV4dDo6U2V0dXBDb2xvclRleHR1cmVBdHRhY2htZW50KEdMdWludCB0ZXh0dXJlKSB7CisgIFBBU1NfVEhST1VHSCh0aGlzLCBCaW5kRnJhbWVidWZmZXIsIEdMX0ZSQU1FQlVGRkVSLCBnbG9iYWxfZnJhbWVidWZmZXJfKTsKKyAgUEFTU19USFJPVUdIKHRoaXMsIEZyYW1lYnVmZmVyVGV4dHVyZTJELCBHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsCisgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCB0ZXh0dXJlLCAwKTsKK30KKwordm9pZCBHbGVzQ29udGV4dDo6U2V0dXBEZXB0aFN0ZW5jaWxBdHRhY2htZW50KEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgZGVwdGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzdGVuY2lsX3NpemUpIHsKKyAgaWYgKHN1cHBvcnRzX3BhY2tlZF9kZXB0aF9zdGVuY2lsXyAmJiBkZXB0aF9zaXplICYmIHN0ZW5jaWxfc2l6ZSkgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGVwdGhfc2l6ZSA+IDI0IHx8IGRlcHRoX3NpemUgPCAwKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0ZW5jaWxfc2l6ZSA+IDggfHwgc3RlbmNpbF9zaXplIDwgMCk7CisKKyAgICAvLyBCb3RoIHRoZSBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXIgYWN0dWFsbHkgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0LgorICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZW5SZW5kZXJidWZmZXJzLCAxLCAmZ2xvYmFsX2RlcHRoX3JlbmRlcmJ1ZmZlcl8pOworICAgIGdsb2JhbF9zdGVuY2lsX3JlbmRlcmJ1ZmZlcl8gPSBnbG9iYWxfZGVwdGhfcmVuZGVyYnVmZmVyXzsKKworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBCaW5kUmVuZGVyYnVmZmVyLCBHTF9SRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgIGdsb2JhbF9kZXB0aF9yZW5kZXJidWZmZXJfKTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgUmVuZGVyYnVmZmVyU3RvcmFnZSwgR0xfUkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICBHTF9ERVBUSDI0X1NURU5DSUw4X09FUywgd2lkdGgsIGhlaWdodCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGRlcHRoX3NpemUpIHsKKyAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGVwdGhfc2l6ZSA+IDE2IHx8IGRlcHRoX3NpemUgPCAwKTsKKworICAgICAgUEFTU19USFJPVUdIKHRoaXMsIEdlblJlbmRlcmJ1ZmZlcnMsIDEsICZnbG9iYWxfZGVwdGhfcmVuZGVyYnVmZmVyXyk7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZFJlbmRlcmJ1ZmZlciwgR0xfUkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF9kZXB0aF9yZW5kZXJidWZmZXJfKTsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBSZW5kZXJidWZmZXJTdG9yYWdlLCBHTF9SRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgR0xfREVQVEhfQ09NUE9ORU5UMTYsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKyAgICBpZiAoc3RlbmNpbF9zaXplKSB7CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0ZW5jaWxfc2l6ZSA+IDggfHwgc3RlbmNpbF9zaXplIDwgMCk7CisKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZW5SZW5kZXJidWZmZXJzLCAxLAorICAgICAgICAgICAgICAgICAgICZnbG9iYWxfc3RlbmNpbF9yZW5kZXJidWZmZXJfKTsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBCaW5kUmVuZGVyYnVmZmVyLCBHTF9SRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3N0ZW5jaWxfcmVuZGVyYnVmZmVyXyk7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgUmVuZGVyYnVmZmVyU3RvcmFnZSwgR0xfUkVOREVSQlVGRkVSLAorICAgICAgICAgICAgICAgICAgIEdMX1NURU5DSUxfSU5ERVg4LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0KKworICBQQVNTX1RIUk9VR0godGhpcywgQmluZEZyYW1lYnVmZmVyLCBHTF9GUkFNRUJVRkZFUiwgZ2xvYmFsX2ZyYW1lYnVmZmVyXyk7CisgIFBBU1NfVEhST1VHSCh0aGlzLCBGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICBHTF9ERVBUSF9BVFRBQ0hNRU5ULCBHTF9SRU5ERVJCVUZGRVIsCisgICAgICAgICAgICAgICBnbG9iYWxfZGVwdGhfcmVuZGVyYnVmZmVyXyk7CisgIFBBU1NfVEhST1VHSCh0aGlzLCBGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQsIEdMX1JFTkRFUkJVRkZFUiwKKyAgICAgICAgICAgICAgIGdsb2JhbF9zdGVuY2lsX3JlbmRlcmJ1ZmZlcl8pOworfQorCit2b2lkIEdsZXNDb250ZXh0OjpEZWxldGVGcmFtZWJ1ZmZlck92ZXJyaWRlKCkgeworICAvLyBOb3RlIHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIHNhbWUgcmVuZGVyYnVmZmVyIG9iamVjdCBtdWx0aXBsZQorICAvLyB0aW1lcy4gVGhlIEdMRVMgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgZHVwbGljYXRlIGRlbGV0ZSB0byBiZQorICAvLyBzaWxlbnRseSBpZ25vcmVkLgorICBjb25zdCBHTHVpbnQgcmVuZGVyYnVmZmVyc1syXSA9IHsgZ2xvYmFsX2RlcHRoX3JlbmRlcmJ1ZmZlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfc3RlbmNpbF9yZW5kZXJidWZmZXJfIH07CisgIFBBU1NfVEhST1VHSCh0aGlzLCBEZWxldGVGcmFtZWJ1ZmZlcnMsIDEsICZnbG9iYWxfZnJhbWVidWZmZXJfKTsKKyAgUEFTU19USFJPVUdIKHRoaXMsIERlbGV0ZVJlbmRlcmJ1ZmZlcnMsIDIsIHJlbmRlcmJ1ZmZlcnMpOworICBnbG9iYWxfZnJhbWVidWZmZXJfID0gMDsKKyAgZ2xvYmFsX2RlcHRoX3JlbmRlcmJ1ZmZlcl8gPSAwOworICBnbG9iYWxfc3RlbmNpbF9yZW5kZXJidWZmZXJfID0gMDsKK30KKworU2hhcmVHcm91cFB0ciBHbGVzQ29udGV4dDo6R2V0U2hhcmVHcm91cCgpIGNvbnN0IHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihzaGFyZV9ncm91cF8gPT0gTlVMTCk7CisgIHJldHVybiBzaGFyZV9ncm91cF87Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OlNldEdMZXJyb3IoR0xlbnVtIGVycm9yLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfbnVtYmVyLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBjb25zdCBib29sIHNldF9lcnJvciA9IChlcnJvcl8gPT0gR0xfTk9fRVJST1IpOworICBpZiAoc2V0X2Vycm9yKSB7CisgICAgZXJyb3JfID0gZXJyb3I7CisgIH0KKworICBjaGFyIG1zZ1syNTZdOworICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisKKyAgY2hhciBlcnJvcl9zdHJbNTEyXTsKKyAgc25wcmludGYoZXJyb3Jfc3RyLCBzaXplb2YoZXJyb3Jfc3RyKSwgIiVzOiVkIFtjdHg9JWRdOiAlcyIsIGZ1bmN0aW9uLAorICAgICAgICAgICBsaW5lX251bWJlciwgaWRfLCBtc2cpOworCisgIGJvb2wgZGlzcGxheV9lcnJvciA9IGZhbHNlOworICBib29sIHN1cHByZXNzX291dHB1dCA9IGZhbHNlOworICBpZiAoQXJlQ2hlY2tzRW5hYmxlZCgpKSB7CisgICAgZGlzcGxheV9lcnJvciA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgY29uc3Qgc2l6ZV90IG51bSA9IGVycm9yX2NvdW50ZXJfLnNpemUoKTsKKyAgICBpZiAobnVtID09IGtNYXhpbXVtRXJyb3JDb3VudGVyU2l6ZSkgeworICAgICAgQUxPR0UoIklNUE9SVEFOVDogW2N0eD0lZF0gVG9vIG1hbnkgZXJyb3JzISAgU3VwcHJlc3NpbmcgR0xFcnJvciBvdXRwdXQhIiwKKyAgICAgICAgICAgIGlkXyk7CisgICAgICAvLyBBZGQgc29tZSBkdW1teSBkYXRhIHVudGlsIHRoZSBlcnJvcl9jb3VudGVyXyBleGNlZWRzIHRoZSBsaW1pdCB0bworICAgICAgLy8gcHJldmVudCB0aGlzIG1lc3NhZ2UgZnJvbSBiZWluZyBwcmludGVkIGFnYWluLgorICAgICAgdWludDMyX3QgaSA9IDA7CisgICAgICB3aGlsZSAoZXJyb3JfY291bnRlcl8uc2l6ZSgpID09IGtNYXhpbXVtRXJyb3JDb3VudGVyU2l6ZSkgeworICAgICAgICBlcnJvcl9jb3VudGVyX1tpKytdID0gMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG51bSA8IGtNYXhpbXVtRXJyb3JDb3VudGVyU2l6ZSkgeworICAgICAgY29uc3QgdWludDMyX3QgaGFzaCA9IEhhc2goZXJyb3Jfc3RyKTsKKyAgICAgIHVpbnQzMl90JiBjb3VudCA9IGVycm9yX2NvdW50ZXJfW2hhc2hdOworICAgICAgZGlzcGxheV9lcnJvciA9IChjb3VudCA8PSBrRXJyb3JMaW1pdCk7CisgICAgICBzdXBwcmVzc19vdXRwdXQgPSAoY291bnQgPT0ga0Vycm9yTGltaXQpOworICAgICAgKytjb3VudDsKKyAgICB9CisgIH0KKworICBpZiAoZGlzcGxheV9lcnJvcikgeworICAgIGlmIChzZXRfZXJyb3IpIHsKKyAgICAgIEFMT0dXKCJbY3R4PSVkXSBHTEVTIEVycm9yIFNldDogJXMgKDB4JXgpIiwgaWRfLCBHZXRFbnVtU3RyaW5nKGVycm9yKSwKKyAgICAgICAgICAgIGVycm9yKTsKKyAgICB9CisgICAgQUxPR0UoIiVzIiwgZXJyb3Jfc3RyKTsKKyAgICBpZiAoc3VwcHJlc3Nfb3V0cHV0KSB7CisgICAgICBBTE9HRSgiSU1QT1JUQU5UOiBFcnJvciBcIiVzXCIgd2lsbCBubyBsb25nZXIgYmUgbG9nZ2VkIHRvIHN0ZGVyciEiLAorICAgICAgICAgICAgZXJyb3Jfc3RyKTsKKyAgICB9CisgIH0KK30KKworR0xlbnVtIEdsZXNDb250ZXh0OjpHZXRHTGVycm9yKCkgeworICBjb25zdCBHTGVudW0gZXJyID0gZXJyb3JfOworICBlcnJvcl8gPSBHTF9OT19FUlJPUjsKKyAgcmV0dXJuIGVycjsKK30KKworYm9vbCBHbGVzQ29udGV4dDo6QXJlQ2hlY2tzRW5hYmxlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNoZWNrc19lbmFibGVkXzsKK30KKwordm9pZCBHbGVzQ29udGV4dDo6Rmx1c2goKSB7CisgIFBBU1NfVEhST1VHSCh0aGlzLCBGbHVzaCk7Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OkVuc3VyZVN1cmZhY2VSZWFkeVRvRHJhdygpIGNvbnN0IHsKKyAgaWYgKHN1cmZhY2VfY2FsbGJhY2tfICE9IE5VTEwpIHsKKyAgICBzdXJmYWNlX2NhbGxiYWNrXy0+RW5zdXJlQnVmZmVyUmVhZHkoKTsKKyAgfQorfQorCit2b2lkIEdsZXNDb250ZXh0OjpTZXRDdXJyZW50VXNlclByb2dyYW0oY29uc3QgUHJvZ3JhbURhdGFQdHImIHByb2dyYW0pIHsKKyAgaWYgKHByb2dyYW0gPT0gY3VycmVudF91c2VyX3Byb2dyYW1fKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCkgeworICAgIGlmICghcHJvZ3JhbS0+VXNlKHRydWUpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYgKGN1cnJlbnRfdXNlcl9wcm9ncmFtXyAhPSBOVUxMKSB7CisgICAgY3VycmVudF91c2VyX3Byb2dyYW1fLT5Vc2UoZmFsc2UpOworICB9CisKKyAgY3VycmVudF91c2VyX3Byb2dyYW1fID0gcHJvZ3JhbTsKK30KKworYm9vbCBHbGVzQ29udGV4dDo6Q2FuRHJhdygpIGNvbnN0IHsKKyAgaWYgKHZlcnNpb25fID09IGtHbGVzMTEpIHsKKyAgICBpZiAoIXBvaW50ZXJfY29udGV4dF8uSXNBcnJheUVuYWJsZWQoa1Bvc2l0aW9uVmVydGV4QXR0cmlidXRlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoSXNFbmFibGVkKEdMX01BVFJJWF9QQUxFVFRFX09FUykpIHsKKyAgICAgIGlmICghcG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrV2VpZ2h0VmVydGV4QXR0cmlidXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoIXBvaW50ZXJfY29udGV4dF8uSXNBcnJheUVuYWJsZWQoa01hdHJpeEluZGV4VmVydGV4QXR0cmlidXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBjb25zdCBQb2ludGVyRGF0YSogaW5kZXhfcHRyID0gcG9pbnRlcl9jb250ZXh0Xy5HZXRQb2ludGVyRGF0YSgKKyAgICAgICAgICBrTWF0cml4SW5kZXhWZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgaWYgKGluZGV4X3B0ci0+c2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGN1cnJlbnRfdXNlcl9wcm9ncmFtXyAhPSBOVUxMOworICB9Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OkRyYXdGdWxsc2NyZWVuUXVhZChHTHVpbnQgdGV4dHVyZSwgYm9vbCBmbGlwX3YpIHsKKyAgaWYgKGZ1bGxzY3JlZW5fcXVhZF8gPT0gTlVMTCkgeworICAgIGZ1bGxzY3JlZW5fcXVhZF8gPSBuZXcgRnVsbHNjcmVlblF1YWQodGhpcyk7CisgIH0KKworICBFbnN1cmVTdXJmYWNlUmVhZHlUb0RyYXcoKTsKKworICBmdWxsc2NyZWVuX3F1YWRfLT5EcmF3KHRleHR1cmUsIGZsaXBfdik7Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OkRyYXcoRHJhd1R5cGUgZHJhdywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRyYXcgIT0ga0RyYXdBcnJheXMgJiYgZHJhdyAhPSBrRHJhd0VsZW1lbnRzKTsKKyAgaWYgKCFDYW5EcmF3KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBFbnN1cmVTdXJmYWNlUmVhZHlUb0RyYXcoKTsKKworICBib29sIHByb2dyYW1fdXNlc19leHRlcm5hbF9hc18yZCA9IGZhbHNlOworICBQcmVwYXJlUHJvZ3JhbU9iamVjdChtb2RlLCAmcHJvZ3JhbV91c2VzX2V4dGVybmFsX2FzXzJkKTsKKyAgdGV4dHVyZV9jb250ZXh0Xy5QcmVwYXJlVGV4dHVyZXModmVyc2lvbl8gPT0ga0dsZXMxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV91c2VzX2V4dGVybmFsX2FzXzJkKTsKKworICBpZiAoZHJhdyA9PSBrRHJhd0FycmF5cykgeworICAgIHBvaW50ZXJfY29udGV4dF8uUHJlcGFyZUJ1ZmZlcnNGb3JEcmF3QXJyYXlzKGZpcnN0LCBjb3VudCk7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIERyYXdBcnJheXMsIG1vZGUsIGZpcnN0LCBjb3VudCk7CisgIH0gZWxzZSB7CisgICAgaW5kaWNlcyA9IHBvaW50ZXJfY29udGV4dF8uUHJlcGFyZUJ1ZmZlcnNGb3JEcmF3RWxlbWVudHMoY291bnQsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyk7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIERyYXdFbGVtZW50cywgbW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOworICB9CisKKyAgLy8gUmVzdG9yZSB0aGUgYnVmZmVyIGJpbmRpbmdzIGFzIHRoZSBwb2ludGVyIGNvbnRleHQgbWF5IGhhdmUgY2hhbmdlZCB0aGVtLgorICBQQVNTX1RIUk9VR0godGhpcywgQmluZEJ1ZmZlciwgR0xfQVJSQVlfQlVGRkVSLAorICAgICAgICAgICAgICAgc2hhcmVfZ3JvdXBfLT5HZXRCdWZmZXJHbG9iYWxOYW1lKGFycmF5X2J1ZmZlcl9iaW5kaW5nXykpOworICBQQVNTX1RIUk9VR0godGhpcywgQmluZEJ1ZmZlciwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsCisgICAgICAgICAgICAgICBzaGFyZV9ncm91cF8tPkdldEJ1ZmZlckdsb2JhbE5hbWUoZWxlbWVudF9idWZmZXJfYmluZGluZ18pKTsKKyAgdGV4dHVyZV9jb250ZXh0Xy5SZXN0b3JlVGV4dHVyZXMoKTsKKyAgQ2xlYXJQcm9ncmFtT2JqZWN0KCk7Cit9CisKK2Jvb2wgR2xlc0NvbnRleHQ6OkJpbmRJbWFnZVRvVGV4dHVyZShHTGVudW0gdGFyZ2V0LCBFZ2xJbWFnZVB0ciBpbWFnZSkgeworICBUZXh0dXJlRGF0YVB0ciB0ZXh0dXJlID0gR2V0Qm91bmRUZXh0dXJlRGF0YSh0YXJnZXQpOworICBpZiAodGV4dHVyZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gRGVsZXRlIG9sZCB0ZXh0dXJlIG9iamVjdCBidXQgb25seSBpZiBpdCBpcyBub3QgYSB0YXJnZXQgb2YgYSBFR0xJbWFnZQorICBjb25zdCBHTHVpbnQgbmFtZSA9CisgICAgICBzaGFyZV9ncm91cF8tPkdldFRleHR1cmVHbG9iYWxOYW1lKHRleHR1cmUtPkdldExvY2FsTmFtZSgpKTsKKyAgaWYgKG5hbWUpIHsKKyAgICBpZiAoIXRleHR1cmUtPklzRWdsSW1hZ2VBdHRhY2hlZCgpKSB7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgRGVsZXRlVGV4dHVyZXMsIDEsICZuYW1lKTsKKyAgICB9CisgIH0KKworICAvLyBNYXAgdGhlIHRleHR1cmUgdG8gdGhlIEVHTCBpbWFnZSB0ZXh0dXJlLgorICB0ZXh0dXJlLT5BdHRhY2hFZ2xJbWFnZShpbWFnZSk7CisgIHNoYXJlX2dyb3VwXy0+U2V0VGV4dHVyZUdsb2JhbE5hbWUodGV4dHVyZS0+R2V0TG9jYWxOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmdsb2JhbF90ZXh0dXJlX25hbWUpOworCisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB0byBjcmVhdGUgYSBURVhUVVJFX0VYVEVSTkFMX09FUywKKyAgLy8gU2luY2Ugd2UgYXJlIGJpbmRpbmcgdGhlIHRleHR1cmUsIGVuc3VyZSB0aGF0IHdlIGtub3cgd2hhdCBhY3R1YWwKKyAgLy8gZ2xvYmFsIHRhcmdldCB0aGlzIHRleHR1cmUgdXNlcyBpbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbi4KKyAgdGV4dHVyZV9jb250ZXh0Xy5TZXRUYXJnZXRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS0+R2V0TG9jYWxOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Z2xvYmFsX3RleHR1cmVfdGFyZ2V0KTsKKworICAvLyBCaW5kIHRoZSBFR0wgaW1hZ2UgdGV4dHVyZSAod2hpY2ggaXMgbm93IHRoZSBzYW1lIGFzIHRoZSB0ZXh0dXJlKS4KKyAgUEFTU19USFJPVUdIKHRoaXMsIEJpbmRUZXh0dXJlLCBpbWFnZS0+Z2xvYmFsX3RleHR1cmVfdGFyZ2V0LAorICAgICAgICAgICAgICAgaW1hZ2UtPmdsb2JhbF90ZXh0dXJlX25hbWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHbGVzQ29udGV4dDo6QmluZEltYWdlVG9SZW5kZXJidWZmZXIoRWdsSW1hZ2VQdHIgaW1hZ2UpIHsKKyAgUmVuZGVyYnVmZmVyRGF0YVB0ciByYiA9IEdldEJvdW5kUmVuZGVyYnVmZmVyRGF0YSgpOworICBpZiAocmIgPT0gTlVMTCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJiLT5TZXRFZ2xJbWFnZShpbWFnZSk7CisKKyAgLy8gSWYgdGhlIHJlbmRlcmJ1ZmZlciBpcyBhdHRhY2hlZCB0byBhIGZyYW1lYnVmZmVyLCBjaGFuZ2UgdGhlCisgIC8vIGZyYW1lYnVmZmVyIGF0dGFjaG1lbnQgdG8gcG9pbnQgdG8gdGhlIEVHTEltYWdlIHRleHR1cmUgb2JqZWN0LgorICBpZiAocmItPklzQXR0YWNoZWQoKSkgeworICAgIGNvbnN0IGJvb2wgc2F2ZV9hbmRfcmVzdG9yZSA9CisgICAgICAgIChmcmFtZWJ1ZmZlcl9iaW5kaW5nXyAhPSByYi0+R2V0QXR0YWNoZWRGcmFtZWJ1ZmZlcigpKTsKKyAgICBpZiAoc2F2ZV9hbmRfcmVzdG9yZSkgeworICAgICAgY29uc3QgR0x1aW50IGdsb2JhbF9uYW1lID0KKyAgICAgICAgICBzaGFyZV9ncm91cF8tPkdldEZyYW1lYnVmZmVyR2xvYmFsTmFtZShyYi0+R2V0QXR0YWNoZWRGcmFtZWJ1ZmZlcigpKTsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBCaW5kRnJhbWVidWZmZXIsIEdMX0ZSQU1FQlVGRkVSLCBnbG9iYWxfbmFtZSk7CisgICAgfQorICAgIFBBU1NfVEhST1VHSCh0aGlzLCBGcmFtZWJ1ZmZlclRleHR1cmUyRCwgR0xfRlJBTUVCVUZGRVIsCisgICAgICAgICAgICAgICAgIHJiLT5HZXRBdHRhY2htZW50KCksIGltYWdlLT5nbG9iYWxfdGV4dHVyZV90YXJnZXQsCisgICAgICAgICAgICAgICAgIGltYWdlLT5nbG9iYWxfdGV4dHVyZV9uYW1lLCAwKTsKKyAgICBpZiAoc2F2ZV9hbmRfcmVzdG9yZSkgeworICAgICAgY29uc3QgR0x1aW50IGdsb2JhbF9uYW1lID0KKyAgICAgICAgICBzaGFyZV9ncm91cF8tPkdldEZyYW1lYnVmZmVyR2xvYmFsTmFtZShmcmFtZWJ1ZmZlcl9iaW5kaW5nXyk7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZEZyYW1lYnVmZmVyLCBHTF9GUkFNRUJVRkZFUiwgZ2xvYmFsX25hbWUpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCit2b2lkIEdsZXNDb250ZXh0OjpCaW5kRnJhbWVidWZmZXIoR0x1aW50IGZyYW1lYnVmZmVyKSB7CisgIGZyYW1lYnVmZmVyX2JpbmRpbmdfID0gZnJhbWVidWZmZXI7CisgIEdMdWludCBnbG9iYWxfbmFtZSA9IDA7CisKKyAgaWYgKGZyYW1lYnVmZmVyID09IDApIHsKKyAgICAvLyBVc2Ugd2hhdGV2ZXIgZnJhbWVidWZmZXIgaXMgc2V0IGFzIHRoZSBvdmVycmlkZSBmcmFtZWJ1ZmZlciBpbiBwbGFjZSBvZgorICAgIC8vIHRoZSBkZWZhdWx0IGZyYW1lYnVmZmVyLgorICAgIGdsb2JhbF9uYW1lID0gZ2xvYmFsX292ZXJyaWRlX2ZyYW1lYnVmZmVyXzsKKyAgfSBlbHNlIHsKKyAgICBnbG9iYWxfbmFtZSA9IHNoYXJlX2dyb3VwXy0+R2V0RnJhbWVidWZmZXJHbG9iYWxOYW1lKGZyYW1lYnVmZmVyKTsKKyAgfQorICBQQVNTX1RIUk9VR0godGhpcywgQmluZEZyYW1lYnVmZmVyLCBHTF9GUkFNRUJVRkZFUiwgZ2xvYmFsX25hbWUpOworfQorCit2b2lkIEdsZXNDb250ZXh0OjpEcmF3VGV4KEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgaGVpZ2h0KSB7CisgIC8vIEJhY2t1cCB2Ym8ncworICBjb25zdCBHTGludCBhcnJheV9idWZmZXIgPSBhcnJheV9idWZmZXJfYmluZGluZ187CisgIGNvbnN0IEdMaW50IGVsZW1lbnRfYnVmZmVyID0gZWxlbWVudF9idWZmZXJfYmluZGluZ187CisgIFBBU1NfVEhST1VHSCh0aGlzLCBCaW5kQnVmZmVyLCBHTF9BUlJBWV9CVUZGRVIsIDApOworICBQQVNTX1RIUk9VR0godGhpcywgQmluZEJ1ZmZlciwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDApOworCisgIC8vIEJhY2t1cCBwb2ludGVycworICBjb25zdCBQb2ludGVyQ29udGV4dDo6UG9pbnRlckRhdGFWZWN0b3IgcG9pbnRlcnMgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJzKCk7CisgIGZvciAoR0xpbnQgaW5kZXggPSAwOyBpbmRleCA8IGtOdW1WZXJ0ZXhBdHRyaWJ1dGVLZXlzOyArK2luZGV4KSB7CisgICAgcG9pbnRlcl9jb250ZXh0Xy5EaXNhYmxlQXJyYXkoaW5kZXgpOworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIGluZGV4KTsKKyAgfQorCisgIC8vIFNldHVwIHByb2plY3Rpb24gbWF0cml4IHRvIGRyYXcgaW4gdmlld3BvcnQgYWxpZ25lZCBjb29yZGluYXRlcworICBjb25zdCBlbXVnbDo6TWF0cml4IHByb2plY3Rpb25fbWF0cml4ID0gdW5pZm9ybV9jb250ZXh0Xy5HZXRQcm9qZWN0aW9uTWF0cml4KCk7CisgIGNvbnN0IEdMaW50KiB2aWV3cG9ydCA9IHZpZXdwb3J0Xy5HZXQoKTsKKyAgdW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVQcm9qZWN0aW9uTWF0cml4KCkgPSBlbXVnbDo6TWF0cml4OjpHZW5lcmF0ZU9ydGhvZ3JhcGhpYygKKyAgICAgIHZpZXdwb3J0WzBdLCB2aWV3cG9ydFswXSArIHZpZXdwb3J0WzJdLCB2aWV3cG9ydFsxXSwKKyAgICAgIHZpZXdwb3J0WzFdICsgdmlld3BvcnRbM10sIDAuZiwgLTEuZik7CisKKyAgLy8gU2V0dXAgbW9kZWx2aWV3IG1hdHJpeAorICBjb25zdCBlbXVnbDo6TWF0cml4IG1vZGVsX3ZpZXdfbWF0cml4ID0gdW5pZm9ybV9jb250ZXh0Xy5HZXRNb2RlbFZpZXdNYXRyaXgoKTsKKyAgdW5pZm9ybV9jb250ZXh0Xy5NdXRhdGVNb2RlbFZpZXdNYXRyaXgoKS5Bc3NpZ25JZGVudGl0eSgpOworCisgIC8vIFNldHVwIHRleHR1cmUgbWF0cml4CisgIGVtdWdsOjpNYXRyaXggdGV4dHVyZV9tYXRyaWNlc1tVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0c107CisgIGZvciAoR0xpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzOyArK3N0YWdlKSB7CisgICAgdGV4dHVyZV9tYXRyaWNlc1tzdGFnZV0gPSB1bmlmb3JtX2NvbnRleHRfLkdldFRleHR1cmVNYXRyaXhCeVN0YWdlKHN0YWdlKTsKKyAgICB1bmlmb3JtX2NvbnRleHRfLk11dGF0ZVRleHR1cmVNYXRyaXhCeVN0YWdlKHN0YWdlKS5Bc3NpZ25JZGVudGl0eSgpOworICB9CisKKyAgLy8gQmFja3VwIHxlbmFibGVkX3NldF98IGFuZCBkaXNhYmxlIGNsaXAgcGxhbmVzIGFuZCBsaWdodGluZy4KKyAgY29uc3Qgc3RkOjpzZXQ8R0xlbnVtPiBlbmFibGVkX3NldCA9IGVuYWJsZWRfc2V0XzsKKyAgZm9yIChHTGludCBpID0gMDsgaSA8IFVuaWZvcm1Db250ZXh0OjprTWF4Q2xpcFBsYW5lczsgKytpKSB7CisgICAgZW5hYmxlZF9zZXRfLmVyYXNlKEdMX0NMSVBfUExBTkUwICsgaSk7CisgIH0KKyAgZW5hYmxlZF9zZXRfLmVyYXNlKEdMX0xJR0hUSU5HKTsKKworICBHTGZsb2F0IHRleGVsc1tVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0c11bOF0gPSB7fTsKKyAgR0xpbnQgbnVtX3RleHR1cmVzID0gMDsKKyAgZm9yIChHTGludCBpID0gMDsgaSA8IFVuaWZvcm1Db250ZXh0OjprTWF4VGV4dHVyZVVuaXRzOyArK2kpIHsKKyAgICBpZiAoIXRleHR1cmVfY29udGV4dF8uSXNFbmFibGVkKEdMX1RFWFRVUkUwICsgaSwgR0xfVEVYVFVSRV8yRCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb25zdCBHTGludCB0ZXh0dXJlID0gdGV4dHVyZV9jb250ZXh0Xy5HZXRUZXh0dXJlKEdMX1RFWFRVUkUwICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfMkQpOworICAgIGNvbnN0IFRleHR1cmVEYXRhUHRyIHRleHR1cmVfZGF0YSA9IHNoYXJlX2dyb3VwXy0+R2V0VGV4dHVyZURhdGEodGV4dHVyZSk7CisgICAgaWYgKHRleHR1cmVfZGF0YSA9PSBOVUxMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBjb25zdCBHTGludCogY3JvcF9yZWN0ID0gdGV4dHVyZV9kYXRhLT5HZXRDcm9wUmVjdCgpOworICAgIGNvbnN0IEdMZmxvYXQgdGV4X3dpZHRoID0gdGV4dHVyZV9kYXRhLT5HZXRXaWR0aCgpOworICAgIGNvbnN0IEdMZmxvYXQgdGV4X2hlaWdodCA9IHRleHR1cmVfZGF0YS0+R2V0SGVpZ2h0KCk7CisKKyAgICB0ZXhlbHNbaV1bMF0gPSBjcm9wX3JlY3RbMF0gLyB0ZXhfd2lkdGg7CisgICAgdGV4ZWxzW2ldWzFdID0gY3JvcF9yZWN0WzFdIC8gdGV4X2hlaWdodDsKKworICAgIHRleGVsc1tpXVsyXSA9IGNyb3BfcmVjdFswXSAvIHRleF93aWR0aDsKKyAgICB0ZXhlbHNbaV1bM10gPSAoY3JvcF9yZWN0WzFdICsgY3JvcF9yZWN0WzNdKSAvIHRleF9oZWlnaHQ7CisKKyAgICB0ZXhlbHNbaV1bNF0gPSAoY3JvcF9yZWN0WzBdICsgY3JvcF9yZWN0WzJdKSAvIHRleF93aWR0aDsKKyAgICB0ZXhlbHNbaV1bNV0gPSAoY3JvcF9yZWN0WzFdICsgY3JvcF9yZWN0WzNdKSAvIHRleF9oZWlnaHQ7CisKKyAgICB0ZXhlbHNbaV1bNl0gPSAoY3JvcF9yZWN0WzBdICsgY3JvcF9yZWN0WzJdKSAvIHRleF93aWR0aDsKKyAgICB0ZXhlbHNbaV1bN10gPSBjcm9wX3JlY3RbMV0gLyB0ZXhfaGVpZ2h0OworCisKKyAgICBwb2ludGVyX2NvbnRleHRfLkVuYWJsZUFycmF5KGtUZXhDb29yZDBWZXJ0ZXhBdHRyaWJ1dGUgKyBpKTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIGtUZXhDb29yZDBWZXJ0ZXhBdHRyaWJ1dGUgKyBpKTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgVmVydGV4QXR0cmliUG9pbnRlciwga1RleENvb3JkMFZlcnRleEF0dHJpYnV0ZSArIGksIDIsCisgICAgICAgICAgICAgICAgIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdGV4ZWxzW2ldKTsKKyAgICBudW1fdGV4dHVyZXMrKzsKKyAgfQorCisgIGlmIChudW1fdGV4dHVyZXMgPiAwKSB7CisgICAgeiA9IENsYW1wVmFsdWUoeiwgMC4wZiwgMS4wZik7CisgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0geworICAgICAgeCwgeSwgeiwKKyAgICAgIHgsIHkgKyBoZWlnaHQsIHosCisgICAgICB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHosCisgICAgICB4ICsgd2lkdGgsIHksIHosCisgICAgfTsKKyAgICBwb2ludGVyX2NvbnRleHRfLkVuYWJsZUFycmF5KGtQb3NpdGlvblZlcnRleEF0dHJpYnV0ZSk7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUpOworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBWZXJ0ZXhBdHRyaWJQb2ludGVyLCBrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUsIDMsCisgICAgICAgICAgICAgICAgIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgdmVydGljZXMpOworCisgICAgLy8gRHJhd1RleCgpIG5lZWRzIHRleHR1cmUgZW52aXJvbm1lbnRzIGV0Yywgc28gd2UgdXNlIEdMRVMxIGVtdWxhdGlvbiB0bworICAgIC8vIGF2b2lkIHVubmVjZXNzYXJ5IGNvbXBsZXhpdHkuCisgICAgRHJhdyhrRHJhd0FycmF5cywgR0xfVFJJQU5HTEVfRkFOLCAwLCA0LCAwLCAwKTsKKyAgfQorCisgIC8vIFJlc3RvcmUgZW5hYmxlZF9zZXRfCisgIGVuYWJsZWRfc2V0XyA9IGVuYWJsZWRfc2V0OworCisgIC8vIFJlc3RvcmUgbWF0cml4IHN0YXRlCisgIHVuaWZvcm1fY29udGV4dF8uTXV0YXRlUHJvamVjdGlvbk1hdHJpeCgpID0gcHJvamVjdGlvbl9tYXRyaXg7CisgIHVuaWZvcm1fY29udGV4dF8uTXV0YXRlTW9kZWxWaWV3TWF0cml4KCkgPSBtb2RlbF92aWV3X21hdHJpeDsKKyAgZm9yIChHTGludCBzdGFnZSA9IDA7IHN0YWdlIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhUZXh0dXJlVW5pdHM7ICsrc3RhZ2UpIHsKKyAgICB1bmlmb3JtX2NvbnRleHRfLk11dGF0ZVRleHR1cmVNYXRyaXhCeVN0YWdlKHN0YWdlKSA9CisgICAgICAgIHRleHR1cmVfbWF0cmljZXNbc3RhZ2VdOworICB9CisKKyAgLy8gUmVzdG9yZSBwb2ludGVycworICBmb3IgKEdMdWludCBpbmRleCA9IDA7IGluZGV4IDwgcG9pbnRlcnMuc2l6ZSgpOyArK2luZGV4KSB7CisgICAgY29uc3QgUG9pbnRlckRhdGEmIHB0ciA9IHBvaW50ZXJzW2luZGV4XTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZEJ1ZmZlciwgR0xfQVJSQVlfQlVGRkVSLAorICAgICAgICAgICAgICAgICBzaGFyZV9ncm91cF8tPkdldEJ1ZmZlckdsb2JhbE5hbWUocHRyLmJ1ZmZlcl9uYW1lKSk7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIFZlcnRleEF0dHJpYlBvaW50ZXIsIGluZGV4LCBwdHIuc2l6ZSwgcHRyLnR5cGUsCisgICAgICAgICAgICAgICAgIHB0ci5ub3JtYWxpemUsIHB0ci5zdHJpZGUsIHB0ci5wb2ludGVyKTsKKyAgICBpZiAocHRyLmVuYWJsZWQpIHsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwgaW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCBpbmRleCk7CisgICAgfQorICB9CisgIHBvaW50ZXJfY29udGV4dF8uU2V0UG9pbnRlcnMocG9pbnRlcnMpOworCisgIC8vIFJlc3RvcmUgdmJvJ3MKKyAgUEFTU19USFJPVUdIKHRoaXMsIEJpbmRCdWZmZXIsIEdMX0FSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgIHNoYXJlX2dyb3VwXy0+R2V0QnVmZmVyR2xvYmFsTmFtZShhcnJheV9idWZmZXIpKTsKKyAgUEFTU19USFJPVUdIKHRoaXMsIEJpbmRCdWZmZXIsIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLAorICAgICAgICAgICAgICAgc2hhcmVfZ3JvdXBfLT5HZXRCdWZmZXJHbG9iYWxOYW1lKGVsZW1lbnRfYnVmZmVyKSk7Cit9CisKK0J1ZmZlckRhdGFQdHIgR2xlc0NvbnRleHQ6OkdldEJvdW5kVGFyZ2V0QnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0KSB7CisgIGlmICh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSB7CisgICAgcmV0dXJuIHNoYXJlX2dyb3VwXy0+R2V0QnVmZmVyRGF0YShhcnJheV9idWZmZXJfYmluZGluZ18pOworICB9IGVsc2UgaWYgKHRhcmdldCA9PSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikgeworICAgIHJldHVybiBzaGFyZV9ncm91cF8tPkdldEJ1ZmZlckRhdGEoZWxlbWVudF9idWZmZXJfYmluZGluZ18pOworICB9IGVsc2UgeworICAgIHJldHVybiBCdWZmZXJEYXRhUHRyKCk7CisgIH0KK30KKworRnJhbWVidWZmZXJEYXRhUHRyIEdsZXNDb250ZXh0OjpHZXRCb3VuZEZyYW1lYnVmZmVyRGF0YSgpIHsKKyAgcmV0dXJuIHNoYXJlX2dyb3VwXy0+R2V0RnJhbWVidWZmZXJEYXRhKGZyYW1lYnVmZmVyX2JpbmRpbmdfKTsKK30KKworUmVuZGVyYnVmZmVyRGF0YVB0ciBHbGVzQ29udGV4dDo6R2V0Qm91bmRSZW5kZXJidWZmZXJEYXRhKCkgeworICByZXR1cm4gc2hhcmVfZ3JvdXBfLT5HZXRSZW5kZXJidWZmZXJEYXRhKHJlbmRlcmJ1ZmZlcl9iaW5kaW5nXyk7Cit9CisKK1RleHR1cmVEYXRhUHRyIEdsZXNDb250ZXh0OjpHZXRCb3VuZFRleHR1cmVEYXRhKEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgR0x1aW50IG5hbWUgPSB0ZXh0dXJlX2NvbnRleHRfLkdldEJvdW5kVGV4dHVyZSh0YXJnZXQpOworICBpZiAobmFtZSA9PSAwKSB7CisgICAgcmV0dXJuIHRleHR1cmVfY29udGV4dF8uR2V0RGVmYXVsdFRleHR1cmVEYXRhKHRhcmdldCk7CisgIH0KKyAgcmV0dXJuIHNoYXJlX2dyb3VwXy0+R2V0VGV4dHVyZURhdGEobmFtZSk7Cit9CisKK0dMZW51bSBHbGVzQ29udGV4dDo6R2V0RW5hYmxlZFRleHR1cmVUYXJnZXQoR0xlbnVtIGlkKSBjb25zdCB7CisgIGlmICh0ZXh0dXJlX2NvbnRleHRfLklzRW5hYmxlZChpZCwgR0xfVEVYVFVSRV9DVUJFX01BUCkpIHsKKyAgICByZXR1cm4gR0xfVEVYVFVSRV9DVUJFX01BUDsKKyAgfSBlbHNlIGlmICh0ZXh0dXJlX2NvbnRleHRfLklzRW5hYmxlZChpZCwgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpKSB7CisgICAgcmV0dXJuIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTOworICB9IGVsc2UgaWYgKHRleHR1cmVfY29udGV4dF8uSXNFbmFibGVkKGlkLCBHTF9URVhUVVJFXzJEKSkgeworICAgIHJldHVybiBHTF9URVhUVVJFXzJEOworICB9IGVsc2UgeworICAgIHJldHVybiBHTF9OT05FOworICB9Cit9CisKK1NoYWRlckNvbmZpZyBHbGVzQ29udGV4dDo6Q29uZmlndXJlU2hhZGVyKEdMZW51bSBtb2RlKSB7CisgIFNoYWRlckNvbmZpZyBjZmc7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBVbmlmb3JtQ29udGV4dDo6a01heFRleHR1cmVVbml0czsgKytpKSB7CisgICAgY29uc3QgR0xlbnVtIGlkID0gR0xfVEVYVFVSRTAgKyBpOworICAgIGNvbnN0IEdMZW51bSB0YXJnZXQgPSBHZXRFbmFibGVkVGV4dHVyZVRhcmdldChpZCk7CisgICAgaWYgKHRhcmdldCA9PSBHTF9OT05FKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBPbmx5IGdlbmVyYXRlIHRleHR1cmUgc2hhZGVyIGlmIHRleHR1cmUgY29vcmQgYXJyYXkgaXMgZW5hYmxlZCwgb3IKKyAgICAvLyBHTF9URVhUVVJFX0NVQkVfTUFQIHRleHR1cmUgVGV4R2VuIGlzIGVuYWJsZWQuCisgICAgLy8gZXNfZnVsbF9zcGVjXzEuMS4xMi5wZGYgc2VjdGlvbiAyLjcKKyAgICAvLyBJZiB0aGUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSBpcyBkaXNhYmxlZCwgdGhlIGN1cnJlbnQgdmFsdWVzIHNwZWNpZmllZAorICAgIC8vIGJ5IGdsTXVsdGlUZXhDb29yZDR7eGZ9KCkgc2hvdWxkIGJlIHVzZWQuIEJ1dCBtb3N0IEdMRVMxIGltcGxlbWVudGF0aW9ucworICAgIC8vIHdpbGwgY29uc2lkZXIgdGhlIHRleHR1cmUgdW5pdCBpcyBkaXNhYmxlZC4gVG8gYmUgY29tcGF0aWJsZSB0byBvdGhlcgorICAgIC8vIGltcGxlbWVudGF0aW9ucywgd2Ugd2lsbCB0ZXN0IHRoZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZLgorICAgIGNvbnN0IEdMdWludCBpbmRleCA9IFRleHR1cmVDb250ZXh0OjpHZXRUZXh0dXJlQ29vcmRBdHRyaWIoaWQpOworICAgIGNvbnN0IGJvb2wgdGV4dHVyZV9lbmFibGVkID0gKHRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3JtX2NvbnRleHRfLkdldFRleEdlbihpZCktPmVuYWJsZWQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChpbmRleCk7CisgICAgaWYgKCF0ZXh0dXJlX2VuYWJsZWQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNmZy5hbnlfdGV4dHVyZV91bml0c19lbmFibGVkID0gdHJ1ZTsKKworICAgIGNvbnN0IFRleEVudiogZW52ID0gdW5pZm9ybV9jb250ZXh0Xy5HZXRUZXhFbnYoaWQpOworICAgIGNvbnN0IFRleEdlbiogdGV4Z2VuID0gdW5pZm9ybV9jb250ZXh0Xy5HZXRUZXhHZW4oaWQpOworCisgICAgY29uc3QgR0x1aW50IHRleHR1cmUgPSB0ZXh0dXJlX2NvbnRleHRfLkdldFRleHR1cmUoaWQsIHRhcmdldCk7CisgICAgVGV4dHVyZURhdGFQdHIgb2JqID0gc2hhcmVfZ3JvdXBfLT5HZXRUZXh0dXJlRGF0YSh0ZXh0dXJlKTsKKyAgICBpZiAob2JqID09IE5VTEwgJiYgdGV4dHVyZSA9PSAwKSB7CisgICAgICBvYmogPSB0ZXh0dXJlX2NvbnRleHRfLkdldERlZmF1bHRUZXh0dXJlRGF0YSh0YXJnZXQpOworICAgIH0KKworICAgIFNoYWRlckNvbmZpZzo6VGV4dHVyZUNvbmZpZyYgdCA9IGNmZy50ZXh0dXJlW2ldOworICAgIHQuZW5hYmxlZCA9IHRydWU7CisgICAgdC5tb2RlID0gZW52LT5tb2RlOworICAgIHQudGFyZ2V0ID0gdGFyZ2V0OworICAgIGlmICh0Lm1vZGUgIT0gR0xfQ09NQklORSkgeworICAgICAgdC5mb3JtYXQgPSBvYmotPkdldEZvcm1hdCgpOworICAgIH0KKyAgICB0LmNvbWJpbmVfcmdiID0gZW52LT5jb21iaW5lX3JnYjsKKyAgICB0LmNvbWJpbmVfYWxwaGEgPSBlbnYtPmNvbWJpbmVfYWxwaGE7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyArK2opIHsKKyAgICAgIHQuc3JjX3JnYltqXSA9IGVudi0+c3JjX3JnYltqXTsKKyAgICAgIHQuc3JjX2FscGhhW2pdID0gZW52LT5zcmNfYWxwaGFbal07CisgICAgICB0Lm9wZXJhbmRfcmdiW2pdID0gZW52LT5vcGVyYW5kX3JnYltqXTsKKyAgICAgIHQub3BlcmFuZF9hbHBoYVtqXSA9IGVudi0+b3BlcmFuZF9hbHBoYVtqXTsKKyAgICB9CisKKyAgICBpZiAodGFyZ2V0ID09IEdMX1RFWFRVUkVfQ1VCRV9NQVApIHsKKyAgICAgIHQudGV4Z2VuX21vZGUgPSB0ZXhnZW4tPm1vZGU7CisgICAgICB0LnRleGdlbl9lbmFibGVkID0gdGV4Z2VuLT5lbmFibGVkOworICAgICAgY2ZnLmFueV90ZXh0dXJlX2dlbl9ub3JtYWxfbWFwIHw9IHRleGdlbi0+bW9kZSA9PSBHTF9OT1JNQUxfTUFQX09FUzsKKyAgICAgIGNmZy5hbnlfdGV4dHVyZV9nZW5fcmVmbGVjdGlvbl9tYXAgfD0KKyAgICAgICAgICB0ZXhnZW4tPm1vZGUgPT0gR0xfUkVGTEVDVElPTl9NQVBfT0VTOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhMaWdodHM7ICsraSkgeworICAgIGNvbnN0IEdMZW51bSBpZCA9IEdMX0xJR0hUMCArIGk7CisgICAgaWYgKElzRW5hYmxlZChpZCkpIHsKKyAgICAgIGNvbnN0IExpZ2h0KiBsaWdodCA9IHVuaWZvcm1fY29udGV4dF8uR2V0TGlnaHQoaWQpOworICAgICAgU2hhZGVyQ29uZmlnOjpMaWdodENvbmZpZyYgbCA9IGNmZy5saWdodFtpXTsKKyAgICAgIGwuZW5hYmxlZCA9IHRydWU7CisgICAgICBsLmRpcmVjdGlvbmFsID0gbGlnaHQtPklzRGlyZWN0aW9uYWwoKTsKKyAgICAgIGwuc3BvdCA9IGxpZ2h0LT5Jc1Nwb3QoKTsKKyAgICAgIGwuYXR0ZW51YXRlID0gbGlnaHQtPlNob3VsZEF0dGVudWF0ZSgpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhDbGlwUGxhbmVzOyArK2kpIHsKKyAgICBjb25zdCBHTGVudW0gaWQgPSBHTF9DTElQX1BMQU5FMCArIGk7CisgICAgY2ZnLmVuYWJsZV9jbGlwX3BsYW5lW2ldID0gSXNFbmFibGVkKGlkKTsKKyAgICBjZmcuYW55X2NsaXBfcGxhbmVzX2VuYWJsZWQgfD0gSXNFbmFibGVkKGlkKTsKKyAgfQorCisgIGNmZy5tb2RlID0gbW9kZTsKKyAgY2ZnLmVuYWJsZV9hbHBoYV90ZXN0ID0gSXNFbmFibGVkKEdMX0FMUEhBX1RFU1QpOworICBpZiAoY2ZnLmVuYWJsZV9hbHBoYV90ZXN0KSB7CisgICAgY2ZnLmFscGhhX2Z1bmMgPSB1bmlmb3JtX2NvbnRleHRfLkdldEFscGhhVGVzdCgpLmZ1bmM7CisgIH0KKyAgY2ZnLmVuYWJsZV9jb2xvcl9tYXRlcmlhbCA9IElzRW5hYmxlZChHTF9DT0xPUl9NQVRFUklBTCk7CisgIGNmZy5lbmFibGVfZm9nID0gSXNFbmFibGVkKEdMX0ZPRyk7CisgIGlmIChjZmcuZW5hYmxlX2ZvZykgeworICAgIGNmZy5mb2dfbW9kZSA9IHVuaWZvcm1fY29udGV4dF8uR2V0Rm9nKCkubW9kZTsKKyAgfQorICBjZmcuZW5hYmxlX2xpZ2h0X21vZGVsX3R3b19zaWRlID0gSXNFbmFibGVkKEdMX0xJR0hUX01PREVMX1RXT19TSURFKTsKKyAgY2ZnLmVuYWJsZV9saWdodGluZyA9IElzRW5hYmxlZChHTF9MSUdIVElORyk7CisgIGNmZy5lbmFibGVfbm9ybWFsaXplID0gSXNFbmFibGVkKEdMX05PUk1BTElaRSk7CisgIGNmZy5lbmFibGVfcG9pbnRfc21vb3RoID0gSXNFbmFibGVkKEdMX1BPSU5UX1NNT09USCk7CisgIGNmZy5lbmFibGVfcG9pbnRfc3ByaXRlID0gSXNFbmFibGVkKEdMX1BPSU5UX1NQUklURV9PRVMpOworICBjZmcuZW5hYmxlX21hdHJpeF9wYWxldHRlID0gSXNFbmFibGVkKEdMX01BVFJJWF9QQUxFVFRFX09FUyk7CisgIGlmIChjZmcuZW5hYmxlX21hdHJpeF9wYWxldHRlKSB7CisgICAgY29uc3QgUG9pbnRlckRhdGEqIHB0ciA9IHBvaW50ZXJfY29udGV4dF8uR2V0UG9pbnRlckRhdGEoCisgICAgICAgIGtNYXRyaXhJbmRleFZlcnRleEF0dHJpYnV0ZSk7CisgICAgY2ZnLnZlcnRleF91bml0cyA9IHB0ci0+c2l6ZTsKKyAgfQorICByZXR1cm4gY2ZnOworfQorCitHTHVpbnQgR2xlc0NvbnRleHQ6OkNvbXBpbGVTaGFkZXIoR0xlbnVtIHNoYWRlcl9raW5kLCBjb25zdCBjaGFyKiBzb3VyY2UpIHsKKyAgR0x1aW50IG9iamVjdCA9IFBBU1NfVEhST1VHSCh0aGlzLCBDcmVhdGVTaGFkZXIsIHNoYWRlcl9raW5kKTsKKyAgUEFTU19USFJPVUdIKHRoaXMsIFNoYWRlclNvdXJjZSwgb2JqZWN0LCAxLCAmc291cmNlLCBOVUxMKTsKKyAgUEFTU19USFJPVUdIKHRoaXMsIENvbXBpbGVTaGFkZXIsIG9iamVjdCk7CisKKyAgaWYgKEFyZUNoZWNrc0VuYWJsZWQoKSkgeworICAgIEdMaW50IGNvbXBpbGVkID0gMDsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgR2V0U2hhZGVyaXYsIG9iamVjdCwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7CisgICAgaWYgKGNvbXBpbGVkID09IEdMX0ZBTFNFKSB7CisgICAgICBHTGludCBsZW4gPSAwLCB3cml0dGVuID0gMDsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZXRTaGFkZXJpdiwgb2JqZWN0LCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW4pOworICAgICAgY2hhciogbG9nID0gbmV3IGNoYXJbbGVuXTsKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZXRTaGFkZXJJbmZvTG9nLCBvYmplY3QsIGxlbiwgJndyaXR0ZW4sIGxvZyk7CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmFibGUgdG8gY29tcGlsZSAlczpcbiVzXG4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoc2hhZGVyX2tpbmQpLCBzb3VyY2UsIGxvZyk7CisgICAgICBkZWxldGVbXSBsb2c7CisgICAgfQorICB9CisgIHJldHVybiBvYmplY3Q7Cit9CisKK0dMdWludCBHbGVzQ29udGV4dDo6Q29tcGlsZVByb2dyYW0oR0x1aW50IHZlcnRleF9zaGFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBmcmFnbWVudF9zaGFkZXIpIHsKKyAgR0x1aW50IHByb2dyYW0gPSBQQVNTX1RIUk9VR0godGhpcywgQ3JlYXRlUHJvZ3JhbSk7CisgIFBBU1NfVEhST1VHSCh0aGlzLCBBdHRhY2hTaGFkZXIsIHByb2dyYW0sIHZlcnRleF9zaGFkZXIpOworICBQQVNTX1RIUk9VR0godGhpcywgQXR0YWNoU2hhZGVyLCBwcm9ncmFtLCBmcmFnbWVudF9zaGFkZXIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1WZXJ0ZXhBdHRyaWJ1dGVLZXlzOyArK2kpIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgQmluZEF0dHJpYkxvY2F0aW9uLCBwcm9ncmFtLCBpLAorICAgICAgICAgICAgICAgICBrVmVydGV4QXR0cmlidXRlTmFtZXNbaV0pOworICB9CisgIFBBU1NfVEhST1VHSCh0aGlzLCBMaW5rUHJvZ3JhbSwgcHJvZ3JhbSk7CisKKyAgaWYgKEFyZUNoZWNrc0VuYWJsZWQoKSkgeworICAgIEdMaW50IGxpbmtfc3RhdHVzID0gMDsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgR2V0UHJvZ3JhbWl2LCBwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtfc3RhdHVzKTsKKyAgICBpZiAobGlua19zdGF0dXMgPT0gR0xfRkFMU0UpIHsKKyAgICAgIEdMaW50IGxlbiA9IDAsIHdyaXR0ZW4gPSAwOworICAgICAgUEFTU19USFJPVUdIKHRoaXMsIEdldFByb2dyYW1pdiwgcHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuKTsKKyAgICAgIGNoYXIqIGxvZyA9IG5ldyBjaGFyW2xlbl07CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgR2V0UHJvZ3JhbUluZm9Mb2csIHByb2dyYW0sIGxlbiwgJndyaXR0ZW4sIGxvZyk7CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmFibGUgdG8gbGluazpcbmZyYWdtZW50OiVkIHZlcnRleDolZFxuJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudF9zaGFkZXIsIHZlcnRleF9zaGFkZXIsIGxvZyk7CisgICAgICBkZWxldGVbXSBsb2c7CisgICAgfQorICB9CisgIHJldHVybiBwcm9ncmFtOworfQorCitQcm9ncmFtQ29udGV4dCYgR2xlc0NvbnRleHQ6OkJpbmRQcm9ncmFtQ29udGV4dChHTGVudW0gbW9kZSkgeworICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MjIpOiBGaWd1cmUgb3V0IGFjdHVhbCBtYXhpbXVtIHNpemVzIGZvciB0aGVzZSB0d28KKyAgLy8gYnVmZmVycyB0byBtaW5pbWl6ZSB0aGUgZml4ZWQgbWVtb3J5IGZvb3RwcmludCB3ZSBuZWVkLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTaGFkZXJCdWZmZXJTaXplID0gNjU1MzY7CisgIGNoYXIgYnVmZmVyW2tNYXhTaGFkZXJCdWZmZXJTaXplXTsKKworICBjb25zdCBTaGFkZXJDb25maWcgY2ZnID0gQ29uZmlndXJlU2hhZGVyKG1vZGUpOworCisgIEdMdWludCogdnMgPSB2ZXJ0ZXhfc2hhZGVyX2NhY2hlXy5HZXQoY2ZnKTsKKyAgaWYgKCF2cykgeworICAgIEdlbmVyYXRlVmVydGV4U2hhZGVyKGNmZywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgY29uc3QgR0x1aW50IHNoYWRlciA9IENvbXBpbGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgYnVmZmVyKTsKKyAgICB2cyA9IHZlcnRleF9zaGFkZXJfY2FjaGVfLlB1c2goY2ZnLCBzaGFkZXIpOworICB9CisKKyAgR0x1aW50KiBmcyA9IGZyYWdtZW50X3NoYWRlcl9jYWNoZV8uR2V0KGNmZyk7CisgIGlmICghZnMpIHsKKyAgICBHZW5lcmF0ZUZyYWdtZW50U2hhZGVyKGNmZywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgY29uc3QgR0x1aW50IHNoYWRlciA9IENvbXBpbGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBidWZmZXIpOworICAgIGZzID0gZnJhZ21lbnRfc2hhZGVyX2NhY2hlXy5QdXNoKGNmZywgc2hhZGVyKTsKKyAgfQorCisgIFByb2dyYW1Db250ZXh0KiBwcm9ncmFtID0gcHJvZ3JhbV9jYWNoZV8uR2V0KGNmZyk7CisgIGlmICghcHJvZ3JhbSkgeworICAgIEdMdWludCBpZCA9IENvbXBpbGVQcm9ncmFtKCp2cywgKmZzKTsKKyAgICBwcm9ncmFtID0gcHJvZ3JhbV9jYWNoZV8uUHVzaChjZmcsIFByb2dyYW1Db250ZXh0KHRoaXMsIGlkKSk7CisgIH0KKworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHByb2dyYW0gPT0gTlVMTCwgIlByb2dyYW0gbm90IGNyZWF0ZWQ/Iik7CisgIHByb2dyYW0tPkJpbmQoKTsKKyAgcmV0dXJuICpwcm9ncmFtOworfQorCit2b2lkIEdsZXNDb250ZXh0OjpQcmVwYXJlUHJvZ3JhbU9iamVjdChHTGVudW0gbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHByb2dyYW1fdXNlc19leHRlcm5hbF9hc18yZCkgeworICBpZiAoY3VycmVudF91c2VyX3Byb2dyYW1fICE9IE5VTEwpIHsKKyAgICBjdXJyZW50X3VzZXJfcHJvZ3JhbV8tPlByZXBhcmVGb3JSZW5kZXJpbmcocHJvZ3JhbV91c2VzX2V4dGVybmFsX2FzXzJkKTsKKyAgICByZXR1cm47CisgIH0KKworICBQcm9ncmFtQ29udGV4dCYgcHJvZ3JhbSA9IEJpbmRQcm9ncmFtQ29udGV4dChtb2RlKTsKKyAgdW5pZm9ybV9jb250ZXh0Xy5CaW5kKCZwcm9ncmFtKTsKKworICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUpKSB7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUpOworICB9CisgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGtOb3JtYWxWZXJ0ZXhBdHRyaWJ1dGUpKSB7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrTm9ybWFsVmVydGV4QXR0cmlidXRlKTsKKyAgfSBlbHNlIHsKKyAgICBHTGZsb2F0IHZhbHVlc1s0XTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgVmVydGV4QXR0cmliM2Z2LCBrTm9ybWFsVmVydGV4QXR0cmlidXRlLAorICAgICAgICAgICAgICAgICB1bmlmb3JtX2NvbnRleHRfLkdldE5vcm1hbCgpLkdldEZsb2F0QXJyYXkodmFsdWVzKSk7CisgIH0KKyAgaWYgKHBvaW50ZXJfY29udGV4dF8uSXNBcnJheUVuYWJsZWQoa0NvbG9yVmVydGV4QXR0cmlidXRlKSkgeworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwga0NvbG9yVmVydGV4QXR0cmlidXRlKTsKKyAgfSBlbHNlIHsKKyAgICBHTGZsb2F0IHZhbHVlc1s0XTsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgVmVydGV4QXR0cmliNGZ2LCBrQ29sb3JWZXJ0ZXhBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgIHVuaWZvcm1fY29udGV4dF8uR2V0Q29sb3IoKS5HZXRGbG9hdEFycmF5KHZhbHVlcykpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhUZXh0dXJlVW5pdHM7ICsraSkgeworICAgIGlmIChHZXRFbmFibGVkVGV4dHVyZVRhcmdldChHTF9URVhUVVJFMCArIGkpICE9IEdMX05PTkUpIHsKKyAgICAgIGNvbnN0IGludCBhdHRyaWJ1dGUgPSBrVGV4Q29vcmQwVmVydGV4QXR0cmlidXRlICsgaTsKKyAgICAgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGF0dHJpYnV0ZSkpIHsKKyAgICAgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBhdHRyaWJ1dGUpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobW9kZSA9PSBHTF9QT0lOVFMpIHsKKyAgICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrUG9pbnRTaXplVmVydGV4QXR0cmlidXRlKSkgeworICAgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrUG9pbnRTaXplVmVydGV4QXR0cmlidXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgUG9pbnRQYXJhbWV0ZXJzJiBwYXJhbXMgPQorICAgICAgICAgIHVuaWZvcm1fY29udGV4dF8uR2V0UG9pbnRQYXJhbWV0ZXJzKCk7CisgICAgICBQQVNTX1RIUk9VR0godGhpcywgVmVydGV4QXR0cmliMWYsIGtQb2ludFNpemVWZXJ0ZXhBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgcGFyYW1zLmN1cnJlbnRfc2l6ZSk7CisgICAgfQorICB9CisgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGtXZWlnaHRWZXJ0ZXhBdHRyaWJ1dGUpKSB7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrV2VpZ2h0VmVydGV4QXR0cmlidXRlKTsKKyAgfQorICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrTWF0cml4SW5kZXhWZXJ0ZXhBdHRyaWJ1dGUpKSB7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrTWF0cml4SW5kZXhWZXJ0ZXhBdHRyaWJ1dGUpOworICB9Cit9CisKK3ZvaWQgR2xlc0NvbnRleHQ6OkNsZWFyUHJvZ3JhbU9iamVjdCgpIHsKKyAgaWYgKGN1cnJlbnRfdXNlcl9wcm9ncmFtXyAhPSBOVUxMKSB7CisgICAgY3VycmVudF91c2VyX3Byb2dyYW1fLT5DbGVhbnVwQWZ0ZXJSZW5kZXJpbmcoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUpKSB7CisgICAgUEFTU19USFJPVUdIKHRoaXMsIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwga1Bvc2l0aW9uVmVydGV4QXR0cmlidXRlKTsKKyAgfQorICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrTm9ybWFsVmVydGV4QXR0cmlidXRlKSkgeworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIGtOb3JtYWxWZXJ0ZXhBdHRyaWJ1dGUpOworICB9CisgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGtDb2xvclZlcnRleEF0dHJpYnV0ZSkpIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrQ29sb3JWZXJ0ZXhBdHRyaWJ1dGUpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgVW5pZm9ybUNvbnRleHQ6OmtNYXhUZXh0dXJlVW5pdHM7ICsraSkgeworICAgIGlmIChHZXRFbmFibGVkVGV4dHVyZVRhcmdldChHTF9URVhUVVJFMCArIGkpICE9IEdMX05PTkUpIHsKKyAgICAgIGNvbnN0IGludCBhdHRyaWJ1dGUgPSBrVGV4Q29vcmQwVmVydGV4QXR0cmlidXRlICsgaTsKKyAgICAgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGF0dHJpYnV0ZSkpIHsKKyAgICAgICAgUEFTU19USFJPVUdIKHRoaXMsIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgYXR0cmlidXRlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHBvaW50ZXJfY29udGV4dF8uSXNBcnJheUVuYWJsZWQoa1BvaW50U2l6ZVZlcnRleEF0dHJpYnV0ZSkpIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrUG9pbnRTaXplVmVydGV4QXR0cmlidXRlKTsKKyAgfQorICBpZiAocG9pbnRlcl9jb250ZXh0Xy5Jc0FycmF5RW5hYmxlZChrV2VpZ2h0VmVydGV4QXR0cmlidXRlKSkgeworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIGtXZWlnaHRWZXJ0ZXhBdHRyaWJ1dGUpOworICB9CisgIGlmIChwb2ludGVyX2NvbnRleHRfLklzQXJyYXlFbmFibGVkKGtNYXRyaXhJbmRleFZlcnRleEF0dHJpYnV0ZSkpIHsKKyAgICBQQVNTX1RIUk9VR0godGhpcywgRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCBrTWF0cml4SW5kZXhWZXJ0ZXhBdHRyaWJ1dGUpOworICB9CisKKyAgUEFTU19USFJPVUdIKHRoaXMsIFVzZVByb2dyYW0sIDApOworfQorCisvLyBOb3RlOiBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBFbXVsYXRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cworLy8gaW4gZ2xlc192YWxpZGF0ZS5jcHAuCitzdGF0aWMgY29uc3QgR0xlbnVtIGtFbXVsYXRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0c1tdID0geworICAgIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUywKKyAgICBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUywKKyAgICBHTF9QQUxFVFRFNF9SR0I4X09FUywKKyAgICBHTF9QQUxFVFRFNF9SR0JBNF9PRVMsCisgICAgR0xfUEFMRVRURTRfUkdCQThfT0VTLAorICAgIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUywKKyAgICBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUywKKyAgICBHTF9QQUxFVFRFOF9SR0I4X09FUywKKyAgICBHTF9QQUxFVFRFOF9SR0JBNF9PRVMsCisgICAgR0xfUEFMRVRURThfUkdCQThfT0VTLAorICAgIEdMX0VUQzFfUkdCOF9PRVMsCit9OworCit2b2lkIEdsZXNDb250ZXh0OjpFbnN1cmVDb21wcmVzc2VkVGV4dHVyZUZvcm1hdFN0YXRlS25vd24oKSBjb25zdCB7CisgIC8vIFRPRE8oY3JidWcuY29tLzQyNjA4Myk6IExvYWQgdGhlIGxpc3Qgb2YgY29tcHJlc3NlZCBmb3JtYXRzIHdoZW4gbmVlZGVkCisgIC8vIG9uY2UgZm9yIGFsbCBjb250ZXh0cywgc2luY2UgaXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgZm9yIGFsbCBvZiB0aGVtLgorICAvLyBPbmNlIHdlIGtub3cgd2hhdCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCB3ZSBkbyBub3QgaGF2ZQorICAvLyB0byBjb21wdXRlIGl0IGFnYWluLgorICBpZiAoIWVtdWxhdGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gR2V0IHRoZSBsaXN0IG9mIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgorICBHTGludCB1bmRlcmx5aW5nX251bV9jb21wcmVzc2VkX3RleHR1cmVzID0gMDsKKyAgUEFTU19USFJPVUdIKHRoaXMsIEdldEludGVnZXJ2LCBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsCisgICAgICAgICAgICAgICAmdW5kZXJseWluZ19udW1fY29tcHJlc3NlZF90ZXh0dXJlcyk7CisKKyAgc3RkOjp2ZWN0b3I8R0xpbnQ+IHVuZGVybHlpbmdfY29tcHJlc3NlZF90ZXh0dXJlc19zdXBwb3J0ZWQoCisgICAgICB1bmRlcmx5aW5nX251bV9jb21wcmVzc2VkX3RleHR1cmVzKTsKKworICBpZiAodW5kZXJseWluZ19udW1fY29tcHJlc3NlZF90ZXh0dXJlcykgeworICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZXRJbnRlZ2VydiwgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsCisgICAgICAgICAgICAgICAgICZ1bmRlcmx5aW5nX2NvbXByZXNzZWRfdGV4dHVyZXNfc3VwcG9ydGVkWzBdKTsKKyAgfQorCisgIC8vIEFuZHJvaWQvR0xFUzEgcmVxdWlyZXMgc3VwcG9ydCBmb3IgYSBzcGVjaWZpYyBsaXN0IG9mIGZvcm1hdHMuIElmIHRoZXkgYXJlCisgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gd2Ugd2lsbCBoYXZlIHRvIGVtdWxhdGUKKyAgLy8gc3VwcG9ydCBieSBjb252ZXJ0aW5nIHRleHR1cmUgZGF0YS4KKyAgY29uc3Qgc2l6ZV90IGNvdW50X2VtdWxhdGVkX2Zvcm1hdHMgPQorICAgICAgc2l6ZW9mKGtFbXVsYXRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cykgLworICAgICAgc2l6ZW9mKGtFbXVsYXRlZENvbXByZXNzZWRUZXh0dXJlRm9ybWF0c1swXSk7CisgIGVtdWxhdGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5yZXNlcnZlKGNvdW50X2VtdWxhdGVkX2Zvcm1hdHMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50X2VtdWxhdGVkX2Zvcm1hdHM7ICsraSkgeworICAgIEdMZW51bSBmb3JtYXQgPSBrRW11bGF0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHNbaV07CisgICAgc3RkOjp2ZWN0b3I8R0xpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgICAgc3RkOjpmaW5kKHVuZGVybHlpbmdfY29tcHJlc3NlZF90ZXh0dXJlc19zdXBwb3J0ZWQuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmdfY29tcHJlc3NlZF90ZXh0dXJlc19zdXBwb3J0ZWQuZW5kKCksIGZvcm1hdCk7CisgICAgaWYgKGl0ZXIgPT0gdW5kZXJseWluZ19jb21wcmVzc2VkX3RleHR1cmVzX3N1cHBvcnRlZC5lbmQoKSkgeworICAgICAgZW11bGF0ZWRfY29tcHJlc3NlZF90ZXh0dXJlX2Zvcm1hdHNfLnB1c2hfYmFjayhmb3JtYXQpOworICAgIH0KKyAgfQorCisgIC8vIEJ1aWxkIHRoZSBsaXN0IG9mIHRleHR1cmUgZm9ybWF0cyB3ZSBzdXBwb3J0IGJ5IGNvbWJpbmluZyB0aGUgbGlzdCBmcm9tIHRoZQorICAvLyB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGxpc3Qgb2YgZm9ybWF0cyB3ZSB3aWxsIGVtdWxhdGUuCisgIHN1cHBvcnRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18ucmVzZXJ2ZSgKKyAgICAgIGVtdWxhdGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5zaXplKCkgKworICAgICAgdW5kZXJseWluZ19jb21wcmVzc2VkX3RleHR1cmVzX3N1cHBvcnRlZC5zaXplKCkpOworICBjb3B5KGVtdWxhdGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5iZWdpbigpLAorICAgICAgIGVtdWxhdGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5lbmQoKSwKKyAgICAgICBiYWNrX2luc2VydGVyKHN1cHBvcnRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18pKTsKKyAgY29weSh1bmRlcmx5aW5nX2NvbXByZXNzZWRfdGV4dHVyZXNfc3VwcG9ydGVkLmJlZ2luKCksCisgICAgICAgdW5kZXJseWluZ19jb21wcmVzc2VkX3RleHR1cmVzX3N1cHBvcnRlZC5lbmQoKSwKKyAgICAgICBiYWNrX2luc2VydGVyKHN1cHBvcnRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18pKTsKK30KKwordm9pZCBHbGVzQ29udGV4dDo6RW5zdXJlVW5kZXJseWluZ0V4dGVuc2lvbnNLbm93bigpIGNvbnN0IHsKKyAgLy8gVE9ETyhjcmJ1Zy5jb20vNDI2MDgzKTogTG9hZCB0aGUgbGlzdCBvZiBleHRlbnNpb25zIHdoZW4gbmVlZGVkIG9uY2UgZm9yCisgIC8vIGFsbCBjb250ZXh0cywgc2luY2UgaXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgZm9yIGFsbCBvZiB0aGVtLgorICBpZiAoZ2xvYmFsX2V4dGVuc2lvbnNfKSB7CisgICAgcmV0dXJuOworICB9CisgIGdsb2JhbF9leHRlbnNpb25zXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigKKyAgICAgIFBBU1NfVEhST1VHSCh0aGlzLCBHZXRTdHJpbmcsIEdMX0VYVEVOU0lPTlMpKTsKKyAgc3VwcG9ydHNfcGFja2VkX2RlcHRoX3N0ZW5jaWxfID0KKyAgICAgIHN0cnN0cihnbG9iYWxfZXh0ZW5zaW9uc18sICJPRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwiKSAhPSBOVUxMOworfQorCisKK2Jvb2wgR2xlc0NvbnRleHQ6OklzQ29tcHJlc3NlZEZvcm1hdEVtdWxhdGlvbk5lZWRlZChHTGVudW0gZm9ybWF0KSBjb25zdCB7CisgIEVuc3VyZUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0U3RhdGVLbm93bigpOworCisgIFRleHR1cmVGb3JtYXRzOjpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgIHN0ZDo6ZmluZChlbXVsYXRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICBlbXVsYXRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18uZW5kKCksIGZvcm1hdCk7CisKKyAgcmV0dXJuIGl0ZXIgIT0gZW11bGF0ZWRfY29tcHJlc3NlZF90ZXh0dXJlX2Zvcm1hdHNfLmVuZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgR2xlc0NvbnRleHQ6OkdldFZhbHVlKEdMZW51bSB2YWx1ZSwgVCogZGF0YSkgY29uc3QgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgLy8gQ3VycmVudCBmcmFtZWJ1ZmZlciBvYmplY3Qgc3RhdGUuCisgICAgLy8gTm90ZSB3ZSBjYWNoZSB0aGUgZGVmYXVsdCBmcmFtZWJ1ZmZlciBzdGF0ZSwgYnV0IGRvIG5vdCBjdXJyZW50bHkgY2FjaGUKKyAgICAvLyB0aGUgc3RhdGUgb2YgYW55IGJvdW5kIGZyYW1lYnVmZmVyLgorICAgIGNhc2UgR0xfQUxQSEFfQklUUzoKKyAgICAgIGlmIChmcmFtZWJ1ZmZlcl9iaW5kaW5nXyA9PSAwKSB7CisgICAgICAgIENvbnZlcnQoZGF0YSwgZGVmYXVsdF9mcmFtZWJ1ZmZlcl9hbHBoYV9iaXRzXy5HZXQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR0xfQkxVRV9CSVRTOgorICAgICAgaWYgKGZyYW1lYnVmZmVyX2JpbmRpbmdfID09IDApIHsKKyAgICAgICAgQ29udmVydChkYXRhLCBkZWZhdWx0X2ZyYW1lYnVmZmVyX2JsdWVfYml0c18uR2V0KCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdMX0RFUFRIX0JJVFM6CisgICAgICBpZiAoZnJhbWVidWZmZXJfYmluZGluZ18gPT0gMCkgeworICAgICAgICBDb252ZXJ0KGRhdGEsIGRlZmF1bHRfZnJhbWVidWZmZXJfZGVwdGhfYml0c18uR2V0KCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdMX0dSRUVOX0JJVFM6CisgICAgICBpZiAoZnJhbWVidWZmZXJfYmluZGluZ18gPT0gMCkgeworICAgICAgICBDb252ZXJ0KGRhdGEsIGRlZmF1bHRfZnJhbWVidWZmZXJfZ3JlZW5fYml0c18uR2V0KCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdMX1JFRF9CSVRTOgorICAgICAgaWYgKGZyYW1lYnVmZmVyX2JpbmRpbmdfID09IDApIHsKKyAgICAgICAgQ29udmVydChkYXRhLCBkZWZhdWx0X2ZyYW1lYnVmZmVyX3JlZF9iaXRzXy5HZXQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR0xfU1RFTkNJTF9CSVRTOgorICAgICAgaWYgKGZyYW1lYnVmZmVyX2JpbmRpbmdfID09IDApIHsKKyAgICAgICAgQ29udmVydChkYXRhLCBkZWZhdWx0X2ZyYW1lYnVmZmVyX3N0ZW5jaWxfYml0c18uR2V0KCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEdMX1NBTVBMRV9CVUZGRVJTOgorICAgICAgaWYgKGZyYW1lYnVmZmVyX2JpbmRpbmdfID09IDApIHsKKyAgICAgICAgQ29udmVydChkYXRhLCBkZWZhdWx0X2ZyYW1lYnVmZmVyX3NhbXBsZV9idWZmZXJzXy5HZXQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhpcyBzdGF0ZSBtYXRjaGVzIHdoYXQgY2FuIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcgSXNFbmFibGVkLgorICAgIGNhc2UgR0xfQkxFTkQ6CisgICAgY2FzZSBHTF9DVUxMX0ZBQ0U6CisgICAgY2FzZSBHTF9ERVBUSF9URVNUOgorICAgIGNhc2UgR0xfRElUSEVSOgorICAgIGNhc2UgR0xfUE9MWUdPTl9PRkZTRVRfRklMTDoKKyAgICBjYXNlIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRToKKyAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRToKKyAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDoKK2Nhc2UgR0xfU1RFTkNJTF9URVNUOgorICAgICAgQ29udmVydChkYXRhLCBJc0VuYWJsZWQodmFsdWUpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVGhpcyBzdGF0ZSBpcyBHTEVTMSBzdGF0ZSB3ZSBtdXN0IGVtdWxhdGUuLgorICAgIGNhc2UgR0xfTUFYX0NMSVBfUExBTkVTOgorICAgICAgQ29udmVydChkYXRhLCBzdGF0aWNfY2FzdDxHTGludD4oVW5pZm9ybUNvbnRleHQ6OmtNYXhDbGlwUGxhbmVzKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfTUFYX0xJR0hUUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KFVuaWZvcm1Db250ZXh0OjprTWF4TGlnaHRzKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkyMyk6IFdlIHNob3VsZCB1c2UgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24KKyAgICAvLyB2YWx1ZXMgZm9yIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIGFuZAorICAgIC8vIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTLgorICAgIGNhc2UgR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFM6CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUzoKKyAgICBjYXNlIEdMX01BWF9URVhUVVJFX1VOSVRTOgorICAgICAgQ29udmVydChkYXRhLCBzdGF0aWNfY2FzdDxHTGludD4oVW5pZm9ybUNvbnRleHQ6OmtNYXhUZXh0dXJlVW5pdHMpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gcGFsZXR0ZSBtYXRyaXggcmVsYXJlZCB2YWx1ZXM6CisgICAgY2FzZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX09FUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgdW5pZm9ybV9jb250ZXh0Xy5HZXRDdXJyZW50UGFsZXR0ZU1hdHJpeCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTOgorICAgICAgQ29udmVydChkYXRhLCBVbmlmb3JtQ29udGV4dDo6a01heFBhbGV0dGVNYXRyaWNlc09FUyk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfVU5JVFNfT0VTOgorICAgICAgQ29udmVydChkYXRhLCBVbmlmb3JtQ29udGV4dDo6a01heFZlcnRleFVuaXRzT0VTKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9NQVRSSVhfTU9ERToKKyAgICAgIENvbnZlcnQoZGF0YSwgc3RhdGljX2Nhc3Q8R0x1aW50Pih1bmlmb3JtX2NvbnRleHRfLkdldE1hdHJpeE1vZGUoKSkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX01PREVMVklFV19NQVRSSVg6IHsKKyAgICAgICAgR0xmbG9hdCB0bXBbZW11Z2w6Ok1hdHJpeDo6a0VudHJpZXNdOworICAgICAgICB1bmlmb3JtX2NvbnRleHRfLkdldE1vZGVsVmlld01hdHJpeCgpLkdldENvbHVtbk1ham9yQXJyYXkoCisgICAgICAgICAgICB0bXAsIGVtdWdsOjpNYXRyaXg6OmtFbnRyaWVzKTsKKyAgICAgICAgQ29udmVydChkYXRhLCB0bXApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVg6IHsKKyAgICAgICAgR0xmbG9hdCB0bXBbZW11Z2w6Ok1hdHJpeDo6a0VudHJpZXNdOworICAgICAgICB1bmlmb3JtX2NvbnRleHRfLkdldFByb2plY3Rpb25NYXRyaXgoKS5HZXRDb2x1bW5NYWpvckFycmF5KAorICAgICAgICAgICAgdG1wLCBlbXVnbDo6TWF0cml4OjprRW50cmllcyk7CisgICAgICAgIENvbnZlcnQoZGF0YSwgdG1wKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICBjYXNlIEdMX1RFWFRVUkVfTUFUUklYOiB7CisgICAgICAgIEdMZmxvYXQgdG1wW2VtdWdsOjpNYXRyaXg6OmtFbnRyaWVzXTsKKyAgICAgICAgdW5pZm9ybV9jb250ZXh0Xy5HZXRUZXh0dXJlTWF0cml4KCkuR2V0Q29sdW1uTWFqb3JBcnJheSgKKyAgICAgICAgICAgIHRtcCwgZW11Z2w6Ok1hdHJpeDo6a0VudHJpZXMpOworICAgICAgICBDb252ZXJ0KGRhdGEsIHRtcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgY2FzZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRToKKyAgICAgIENvbnZlcnQoZGF0YSwgYWxpYXNlZF9wb2ludF9zaXplX3JhbmdlXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFOgorICAgICAgQ29udmVydChkYXRhLCB0ZXh0dXJlX2NvbnRleHRfLkdldENsaWVudEFjdGl2ZVRleHR1cmUoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFRoaXMgc3RhdGUgaXMgR0xFUzIgc3RhdGUgdGhhdCBpcyBjYWNoZWQgcHVyZWx5IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICAgIC8vIE5vdGU6IEMrKzExIHdpbGwgYWxsb3cgdXMgdG8gZWxpbWluYXRlIGR1cGxpY2F0ZSBrbm93bGVkZ2Ugb2YgdGhlCisgICAgLy8gbWFwcGluZyBieSBiZWluZyBhYmxlIHRvIHRoZSBwYXR0ZXJuOgorICAgIC8vICAgY2FzZSBkZWNsdHlwZShmb286OmtWYWx1ZSk6CisgICAgLy8gICAgIENvbnZlcnQoZGF0YSwgZm9vLkdldCgpKTsKKyAgICBjYXNlIEdMX0FDVElWRV9URVhUVVJFOgorICAgICAgQ29udmVydChkYXRhLCB0ZXh0dXJlX2NvbnRleHRfLkdldEFjdGl2ZVRleHR1cmUoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgQ29udmVydChkYXRhLCBhbGlhc2VkX2xpbmVfd2lkdGhfcmFuZ2VfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0U6CisgICAgICBDb252ZXJ0KGRhdGEsIGFsaWFzZWRfcG9pbnRfc2l6ZV9yYW5nZV8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgICAgQ29udmVydChkYXRhLCBhcnJheV9idWZmZXJfYmluZGluZ18pOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX0JMRU5EX0RTVF9BTFBIQToKKyAgICAgIENvbnZlcnQoZGF0YSwgYmxlbmRfZnVuY19kc3RfYWxwaGFfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9CTEVORF9EU1RfUkdCOgorICAgICAgQ29udmVydChkYXRhLCBibGVuZF9mdW5jX2RzdF9yZ2JfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9CTEVORF9TUkNfQUxQSEE6CisgICAgICBDb252ZXJ0KGRhdGEsIGJsZW5kX2Z1bmNfc3JjX2FscGhhXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQkxFTkRfU1JDX1JHQjoKKyAgICAgIENvbnZlcnQoZGF0YSwgYmxlbmRfZnVuY19zcmNfcmdiXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQ09MT1JfQ0xFQVJfVkFMVUU6CisgICAgICBDb252ZXJ0KGRhdGEsIGNvbG9yX2NsZWFyX3ZhbHVlXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQ09MT1JfV1JJVEVNQVNLOgorICAgICAgQ29udmVydChkYXRhLCBjb2xvcl93cml0ZW1hc2tfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9DVUxMX0ZBQ0VfTU9ERToKKyAgICAgIENvbnZlcnQoZGF0YSwgY3VsbF9mYWNlX21vZGVfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9DVVJSRU5UX1BST0dSQU06CisgICAgICBpZiAoY3VycmVudF91c2VyX3Byb2dyYW1fICE9IE5VTEwpIHsKKyAgICAgICAgQ29udmVydChkYXRhLCBzdGF0aWNfY2FzdDxHTGludD4oCisgICAgICAgICAgICBjdXJyZW50X3VzZXJfcHJvZ3JhbV8tPkdldExvY2FsTmFtZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAqZGF0YSA9IDA7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfREVQVEhfQ0xFQVJfVkFMVUU6CisgICAgICBDb252ZXJ0KGRhdGEsIGRlcHRoX2NsZWFyX3ZhbHVlXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfREVQVEhfRlVOQzoKKyAgICAgIENvbnZlcnQoZGF0YSwgZGVwdGhfZnVuY18uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX0RFUFRIX1JBTkdFOgorICAgICAgQ29udmVydChkYXRhLCBkZXB0aF9yYW5nZV8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX0RFUFRIX1dSSVRFTUFTSzoKKyAgICAgIENvbnZlcnQoZGF0YSwgZGVwdGhfd3JpdGVtYXNrXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICAgIENvbnZlcnQoZGF0YSwgZWxlbWVudF9idWZmZXJfYmluZGluZ18pOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkc6CisgICAgICBDb252ZXJ0KGRhdGEsIGZyYW1lYnVmZmVyX2JpbmRpbmdfKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9GUk9OVF9GQUNFOgorICAgICAgQ29udmVydChkYXRhLCBmcm9udF9mYWNlXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgR0xfVU5TSUdORURfQllURSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTOgorICAgICAgQ29udmVydChkYXRhLCBHTF9SR0JBKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9MSU5FX1dJRFRIOgorICAgICAgQ29udmVydChkYXRhLCBsaW5lX3dpZHRoXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgICBDb252ZXJ0KGRhdGEsIGdlbmVyYXRlX21pcG1hcF9oaW50Xy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRToKKyAgICAgIENvbnZlcnQoZGF0YSwgbWF4X2N1YmVfbWFwX3RleHR1cmVfc2l6ZV8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRToKKyAgICAgIENvbnZlcnQoZGF0YSwgbWF4X3JlbmRlcmJ1ZmZlcl9zaXplXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfTUFYX1RFWFRVUkVfU0laRToKKyAgICAgIENvbnZlcnQoZGF0YSwgbWF4X3RleHR1cmVfc2l6ZV8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfQVRUUklCUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgbWF4X3ZlcnRleF9hdHRyaWJzXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTOgorICAgICAgQ29udmVydChkYXRhLCBtYXhfdmVydGV4X3RleHR1cmVfaW1hZ2VfdW5pdHNfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgbWF4X3ZpZXdwb3J0X2RpbXNfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9QQUNLX0FMSUdOTUVOVDoKKyAgICAgIENvbnZlcnQoZGF0YSwgcGl4ZWxfc3RvcmVfcGFja19hbGlnbm1lbnRfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1I6CisgICAgICBDb252ZXJ0KGRhdGEsIHBvbHlnb25fb2Zmc2V0X2ZhY3Rvcl8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTOgorICAgICAgQ29udmVydChkYXRhLCBwb2x5Z29uX29mZnNldF91bml0c18uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HOgorICAgICAgQ29udmVydChkYXRhLCByZW5kZXJidWZmZXJfYmluZGluZ18pOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRToKKyAgICAgIENvbnZlcnQoZGF0YSwgc2FtcGxlX2NvdmVyYWdlX3ZhbHVlXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVDoKKyAgICAgIENvbnZlcnQoZGF0YSwgc2FtcGxlX2NvdmVyYWdlX2ludmVydF8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1NDSVNTT1JfQk9YOgorICAgICAgQ29udmVydChkYXRhLCBzY2lzc29yX2JveF8uR2V0KCkpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1NURU5DSUxfRlVOQzoKKyAgICAgIENvbnZlcnQoZGF0YSwgc3RlbmNpbF9mdW5jXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfU1RFTkNJTF9SRUY6CisgICAgICBDb252ZXJ0KGRhdGEsIHN0ZW5jaWxfcmVmXy5HZXQoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfU1RFTkNJTF9WQUxVRV9NQVNLOgorICAgICAgQ29udmVydChkYXRhLCBzdGVuY2lsX3ZhbHVlX21hc2tfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVA6CisgICAgICBDb252ZXJ0KGRhdGEsIHRleHR1cmVfY29udGV4dF8uR2V0Qm91bmRUZXh0dXJlKEdMX1RFWFRVUkVfQ1VCRV9NQVApKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQ6CisgICAgICBDb252ZXJ0KGRhdGEsIHRleHR1cmVfY29udGV4dF8uR2V0Qm91bmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTOgorICAgICAgQ29udmVydChkYXRhLCB0ZXh0dXJlX2NvbnRleHRfLkdldEJvdW5kVGV4dHVyZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUykpOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1VOUEFDS19BTElHTk1FTlQ6CisgICAgICBDb252ZXJ0KGRhdGEsIHBpeGVsX3N0b3JlX3VucGFja19hbGlnbm1lbnRfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBHTF9WSUVXUE9SVDoKKyAgICAgIENvbnZlcnQoZGF0YSwgdmlld3BvcnRfLkdldCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVGhlIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgc3RhdGUgaXMgc3BlY2lhbC4KKyAgICAvLyBHTEVTMSBtYW5kYXRlcyB0aGF0IHRlbiBzcGVjaWZpYyBmb3JtYXRzIG11c3QgYmUgc3VwcG9ydGVkLgorICAgIC8vIEdMRVMyIG1ha2VzIHN1cHBvcnQgZW50aXJlbHkgb3B0aW9uYWwuCisgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICBFbnN1cmVDb21wcmVzc2VkVGV4dHVyZUZvcm1hdFN0YXRlS25vd24oKTsKKyAgICAgIENvbnZlcnQoZGF0YSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KHN1cHBvcnRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c18uc2l6ZSgpKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgICBFbnN1cmVDb21wcmVzc2VkVGV4dHVyZUZvcm1hdFN0YXRlS25vd24oKTsKKyAgICAgIENvbnZlcnQoZGF0YSwgc3VwcG9ydGVkX2NvbXByZXNzZWRfdGV4dHVyZV9mb3JtYXRzXy5iZWdpbigpLAorICAgICAgICAgICAgICBzdXBwb3J0ZWRfY29tcHJlc3NlZF90ZXh0dXJlX2Zvcm1hdHNfLmVuZCgpKTsKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgUG9pbnRlckRhdGEqIHB0ciA9IE5VTEw7CisgIHN3aXRjaCAodmFsdWUpIHsKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9TSVpFOgorICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1NUUklERToKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9UWVBFOgorICAgICAgcHRyID0gcG9pbnRlcl9jb250ZXh0Xy5HZXRQb2ludGVyRGF0YShrUG9zaXRpb25WZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFOgorICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZX1RZUEU6CisgICAgICBwdHIgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKGtOb3JtYWxWZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1NJWkU6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9TVFJJREU6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9UWVBFOgorICAgICAgcHRyID0gcG9pbnRlcl9jb250ZXh0Xy5HZXRQb2ludGVyRGF0YShrQ29sb3JWZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREU6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEU6CisgICAgICBwdHIgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKAorICAgICAgICAgIHRleHR1cmVfY29udGV4dF8uR2V0Q2xpZW50QWN0aXZlVGV4dHVyZUNvb3JkQXR0cmliKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUzoKKyAgICBjYXNlIEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUzoKKyAgICBjYXNlIEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVM6CisgICAgICBwdHIgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKGtQb2ludFNpemVWZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgIGNhc2UgR0xfV0VJR0hUX0FSUkFZX1NJWkVfT0VTOgorICAgIGNhc2UgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVM6CisgICAgY2FzZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVM6CisgICAgICBwdHIgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKGtXZWlnaHRWZXJ0ZXhBdHRyaWJ1dGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgIGNhc2UgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTOgorICAgIGNhc2UgR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVM6CisgICAgY2FzZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVM6CisgICAgICBwdHIgPSBwb2ludGVyX2NvbnRleHRfLkdldFBvaW50ZXJEYXRhKGtNYXRyaXhJbmRleFZlcnRleEF0dHJpYnV0ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3dpdGNoICh2YWx1ZSkgeworICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkc6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVM6CisgICAgY2FzZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTOgorICAgIGNhc2UgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgcHRyID8gcHRyLT5idWZmZXJfbmFtZSA6IDApOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9TVFJJREU6CisgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfU1RSSURFOgorICAgIGNhc2UgR0xfQ09MT1JfQVJSQVlfU1RSSURFOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREU6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVM6CisgICAgY2FzZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUzoKKyAgICBjYXNlIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTOgorICAgICAgQ29udmVydChkYXRhLCBwdHIgPyBwdHItPnN0cmlkZSA6IDApOworICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9TSVpFOgorICAgIGNhc2UgR0xfQ09MT1JfQVJSQVlfU0laRToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRToKKyAgICBjYXNlIEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUzoKKyAgICBjYXNlIEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUzoKKyAgICAgIENvbnZlcnQoZGF0YSwgcHRyID8gcHRyLT5zaXplIDogMCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1RZUEU6CisgICAgY2FzZSBHTF9OT1JNQUxfQVJSQVlfVFlQRToKKyAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1RZUEU6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEU6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTOgorICAgIGNhc2UgR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTOgorICAgIGNhc2UgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTOgorICAgICAgQ29udmVydChkYXRhLCBwdHIgPyBwdHItPnR5cGUgOiAwKTsKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IEF0dGVtcHQgdG8gZ2V0ICVzICgweCV4KSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKHZhbHVlKSwgdmFsdWUpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgR2xlc0NvbnRleHQ6OkdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBkYXRhKSBjb25zdCB7CisgIHJldHVybiBHZXRWYWx1ZShwbmFtZSwgZGF0YSk7Cit9CisKK2Jvb2wgR2xlc0NvbnRleHQ6OkdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIGRhdGEpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFZhbHVlKHBuYW1lLCBkYXRhKTsKK30KKworYm9vbCBHbGVzQ29udGV4dDo6R2V0SW50ZWdlcnYoR0xlbnVtIHBuYW1lLCBHTGludCogZGF0YSkgY29uc3QgeworICByZXR1cm4gR2V0VmFsdWUocG5hbWUsIGRhdGEpOworfQorCitib29sIEdsZXNDb250ZXh0OjpHZXRGaXhlZHYoR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBkYXRhKSBjb25zdCB7CisgIHJldHVybiBHZXRWYWx1ZShwbmFtZSwgZGF0YSk7Cit9CisKK2NvbnN0IEdMdWJ5dGUqIEdsZXNDb250ZXh0OjpHZXRTdHJpbmcoR0xlbnVtIHBuYW1lKSBjb25zdCB7CisgIGNvbnN0IGNoYXIqIHN0ciA9IE5VTEw7CisgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1ZFTkRPUjoKKyAgICAgIHN0ciA9ICJDaHJvbWl1bSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JFTkRFUkVSOgorICAgICAgc3RyID0gIkNocm9taXVtIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfVkVSU0lPTjoKKyAgICAgIGlmICh2ZXJzaW9uXyA9PSBrR2xlczExKSB7CisgICAgICAgIHN0ciA9ICJPcGVuR0wgRVMgMS4xIENocm9taXVtIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciA9ICJPcGVuR0wgRVMgMi4wIENocm9taXVtIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRVhURU5TSU9OUzoKKyAgICAgIGlmICh2ZXJzaW9uXyA9PSBrR2xlczExKSB7CisgICAgICAgIHN0ciA9ICJHTF9PRVNfRUdMX2ltYWdlICIKKyAgICAgICAgICAgICAgIkdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAiCisgICAgICAgICAgICAgICJHTF9PRVNfYmxlbmRfZnVuY19zZXBhcmF0ZSAiCisgICAgICAgICAgICAgICJHTF9PRVNfYmxlbmRfc3VidHJhY3QgIgorICAgICAgICAgICAgICAiR0xfT0VTX2J5dGVfY29vcmRpbmF0ZXMgIgorICAgICAgICAgICAgICAiR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RlcHRoMjQgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RlcHRoMzIgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RyYXdfdGV4dHVyZSAiCisgICAgICAgICAgICAgICJHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICIKKyAgICAgICAgICAgICAgIkdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QgIgorICAgICAgICAgICAgICAiR0xfT0VTX21hdHJpeF9wYWxldHRlICIKKyAgICAgICAgICAgICAgIkdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbCAiCisgICAgICAgICAgICAgICJHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAiCisgICAgICAgICAgICAgICJHTF9PRVNfcG9pbnRfc3ByaXRlICIKKyAgICAgICAgICAgICAgIkdMX09FU19yZ2I4X3JnYmE4ICIKKyAgICAgICAgICAgICAgIkdMX09FU19zaW5nbGVfcHJlY2lzaW9uICIKKyAgICAgICAgICAgICAgIkdMX09FU19zdGVuY2lsMSAiCisgICAgICAgICAgICAgICJHTF9PRVNfc3RlbmNpbDQgIgorICAgICAgICAgICAgICAiR0xfT0VTX3N0ZW5jaWw4ICIKKyAgICAgICAgICAgICAgIkdMX09FU19zdGVuY2lsX3dyYXAgIgorICAgICAgICAgICAgICAiR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAgIgorICAgICAgICAgICAgICAiR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyICIKKyAgICAgICAgICAgICAgIkdMX09FU190ZXh0dXJlX25wb3QgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciA9ICJHTF9PRVNfRUdMX2ltYWdlICIKKyAgICAgICAgICAgICAgIkdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgIgorICAgICAgICAgICAgICAiR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RlcHRoMjQgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RlcHRoMzIgIgorICAgICAgICAgICAgICAiR0xfT0VTX2RlcHRoX3RleHR1cmUgIgorICAgICAgICAgICAgICAiR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAiCisgICAgICAgICAgICAgICJHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgIgorICAgICAgICAgICAgICAiR0xfT0VTX3RleHR1cmVfbnBvdCAiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT046CisgICAgICBzdHIgPSAiT3BlbkdMIEVTIEdMU0wgRVMgMS4wIENocm9taXVtIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbnN1cHBvcnRlZCBzdHJpbmcgcGFyYW1ldGVyOiAlcyAoMHgleCkiLAorICAgICAgICAgICAgICAgICAgICAgICBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUpOworICB9CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEdMdWJ5dGUqPihzdHIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlc19jb250ZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFhYjAyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlc19jb250ZXh0LmgKQEAgLTAsMCArMSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0dMRVNfQ09OVEVYVF9IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0dMRVNfQ09OVEVYVF9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnbGVzL2VnbF9pbWFnZS5oIgorI2luY2x1ZGUgImdsZXMvZ2xlczFfc2hhZGVyX2dlbmVyYXRvci5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc191dGlscy5oIgorI2luY2x1ZGUgImdsZXMvbXJ1X2NhY2hlLmgiCisjaW5jbHVkZSAiZ2xlcy9zaGFyZV9ncm91cC5oIgorI2luY2x1ZGUgImdsZXMvc3RhdGUuaCIKKyNpbmNsdWRlICJnbGVzL3RleHR1cmVfZGF0YS5oIgorCisjaW5jbHVkZSAiR0xFUzEyVHJhbnNsYXRvci91bmRlcmx5aW5nX2FwaXMuaCIKKworY2xhc3MgR2xlc0NvbnRleHQgeworIHB1YmxpYzoKKyAgZW51bSBEcmF3VHlwZSB7CisgICAga0RyYXdBcnJheXMsCisgICAga0RyYXdFbGVtZW50cywKKyAgfTsKKworICAvLyBFbnN1cmVzIHRoYXQgdGhlIGJvdW5kIHN1cmZhY2UgaGFzIGEgYnVmZmVyIHJlYWR5IGZvciBkcmF3aW5nLgorICBjbGFzcyBTdXJmYWNlQ29udHJvbENhbGxiYWNrIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBFbnN1cmVCdWZmZXJSZWFkeSgpID0gMDsKKyAgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TdXJmYWNlQ29udHJvbENhbGxiYWNrKCkge30KKyAgfTsKKyAgdHlwZWRlZiBhbmRyb2lkOjpzcDxTdXJmYWNlQ29udHJvbENhbGxiYWNrPiBTdXJmYWNlQ29udHJvbENhbGxiYWNrUHRyOworCisgIEdsZXNDb250ZXh0KGludDMyX3QgaWQsIEdsZXNWZXJzaW9uIHZlciwgR2xlc0NvbnRleHQqIHNoYXJlLAorICAgICAgICAgICAgICB2b2lkKiB1bmRlcmx5aW5nX2NvbnRleHQsIGNvbnN0IFVuZGVybHlpbmdBcGlzKiB1bmRlcmx5aW5nX2FwaXMpOworICB+R2xlc0NvbnRleHQoKTsKKworICB2b2lkKiBJbXBsKCkgY29uc3QgeyByZXR1cm4gZ2xlc19pbXBsXzsgfQorICBjb25zdCBVbmRlcmx5aW5nQXBpcyogQXBpcygpIGNvbnN0IHsgcmV0dXJuIGFwaXNfOyB9CisgIEdsZXNWZXJzaW9uIEdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiB2ZXJzaW9uXzsgfQorICBpbnQzMl90IEdldElkKCkgY29uc3QgeyByZXR1cm4gaWRfOyB9CisKKyAgU2hhcmVHcm91cFB0ciBHZXRTaGFyZUdyb3VwKCkgY29uc3Q7CisKKyAgdm9pZCBTZXRHTGVycm9yKEdMZW51bSBlcnJvciwgY29uc3QgY2hhciogZnVuY3Rpb24sIGludCBsaW5lX251bWJlciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKyAgR0xlbnVtIEdldEdMZXJyb3IoKTsKKworICBib29sIEFyZUNoZWNrc0VuYWJsZWQoKSBjb25zdDsKKworICB2b2lkIE9uTWFrZUN1cnJlbnQoKTsKKyAgdm9pZCBPbkF0dGFjaFN1cmZhY2UoU3VyZmFjZUNvbnRyb2xDYWxsYmFja1B0ciBzZmMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgIHZvaWQgRW5zdXJlU3VyZmFjZVJlYWR5VG9EcmF3KCkgY29uc3Q7CisgIHZvaWQgRmx1c2goKTsKKworICB2b2lkIFVwZGF0ZUZyYW1lYnVmZmVyT3ZlcnJpZGUoR0xpbnQgd2lkdGgsIEdMaW50IGRyYXdfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgZGVwdGhfc2l6ZSwgR0xpbnQgc3RlbmNpbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGdsb2JhbF90ZXh0dXJlX25hbWUpOworCisgIHZvaWQgRHJhd0Z1bGxzY3JlZW5RdWFkKEdMdWludCB0ZXh0dXJlLCBib29sIGZsaXBfdik7CisgIEdMdWludCBDb21waWxlU2hhZGVyKEdMZW51bSBzaGFkZXJfa2luZCwgY29uc3QgY2hhciogc291cmNlKTsKKyAgR0x1aW50IENvbXBpbGVQcm9ncmFtKEdMdWludCB2ZXJ0ZXhfc2hhZGVyLCBHTHVpbnQgZnJhZ21lbnRfc2hhZGVyKTsKKworICAvLyBHZXQgZGF0YSBzdG9yZWQgaW4gdGhpcyBjb250ZXh0LgorICBib29sIElzRW5hYmxlZChHTGVudW0gY2FwKSBjb25zdCB7IHJldHVybiBlbmFibGVkX3NldF8uY291bnQoY2FwKSA+IDA7IH0KKworICBib29sIEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgY29uc3Q7CisgIGJvb2wgR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKSBjb25zdDsKKyAgYm9vbCBHZXRJbnRlZ2VydihHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIGNvbnN0OworICBib29sIEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBwYXJhbXMpIGNvbnN0OworICBjb25zdCBHTHVieXRlKiBHZXRTdHJpbmcoR0xlbnVtIHBuYW1lKSBjb25zdDsKKworICAvLyBEYXRhIGFjY2Vzc29ycyBmb3IgYm91bmQgb2JqZWN0cy4KKyAgQnVmZmVyRGF0YVB0ciBHZXRCb3VuZFRhcmdldEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCk7CisgIFRleHR1cmVEYXRhUHRyIEdldEJvdW5kVGV4dHVyZURhdGEoR0xlbnVtIHRhcmdldCk7CisgIEZyYW1lYnVmZmVyRGF0YVB0ciBHZXRCb3VuZEZyYW1lYnVmZmVyRGF0YSgpOworICBSZW5kZXJidWZmZXJEYXRhUHRyIEdldEJvdW5kUmVuZGVyYnVmZmVyRGF0YSgpOworCisgIC8vIERyYXcgZnVuY3Rpb25zLgorICB2b2lkIERyYXcoRHJhd1R5cGUgZHJhdywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcyk7CisKKyAgLy8gRUdMIGltYWdlIGZ1bmN0aW9ucworICBib29sIEJpbmRJbWFnZVRvVGV4dHVyZShHTGVudW0gdGFyZ2V0LCBFZ2xJbWFnZVB0ciBpbWFnZSk7CisgIGJvb2wgQmluZEltYWdlVG9SZW5kZXJidWZmZXIoRWdsSW1hZ2VQdHIgaW1hZ2UpOworCisgIGJvb2wgSXNDb21wcmVzc2VkRm9ybWF0RW11bGF0aW9uTmVlZGVkKEdMZW51bSBmb3JtYXQpIGNvbnN0OworCisgIC8vIEZyYW1lYnVmZmVyIGZ1bmN0aW9ucworICB2b2lkIEJpbmRGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpOworCisgIC8vIERyYXdUZXggZnVuY3Rpb24KKyAgdm9pZCBEcmF3VGV4KEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KTsKKworICB2b2lkIEludmFsaWRhdGUoKTsKKyAgdm9pZCBSZXN0b3JlKCk7CisKKyAgLy8gQ2xhc3NlcyB0byBoYW5kbGUgc3BlY2lmaWMgY29udGV4dHMuCisgIFVuaWZvcm1Db250ZXh0IHVuaWZvcm1fY29udGV4dF87CisgIFRleHR1cmVDb250ZXh0IHRleHR1cmVfY29udGV4dF87CisgIFBvaW50ZXJDb250ZXh0IHBvaW50ZXJfY29udGV4dF87CisKKyAgLy8gU2V0IG9mIEdMIGZsYWdzIHRoYXQgYXJlIGN1cnJlbnRseSBlbmFibGVkLgorICBzdGQ6OnNldDxHTGVudW0+IGVuYWJsZWRfc2V0XzsKKworICBHTHVpbnQgYXJyYXlfYnVmZmVyX2JpbmRpbmdfOworICBHTHVpbnQgZWxlbWVudF9idWZmZXJfYmluZGluZ187CisgIEdMdWludCBmcmFtZWJ1ZmZlcl9iaW5kaW5nXzsKKyAgR0x1aW50IHJlbmRlcmJ1ZmZlcl9iaW5kaW5nXzsKKworICAvLyBSZXR1cm5zIGFwcGxpY2F0aW9uJ3MgcHJvZ3JhbSBzZXQgYnkgZ2xVc2VQcm9ncmFtKCkuCisgIFByb2dyYW1EYXRhUHRyIEdldEN1cnJlbnRVc2VyUHJvZ3JhbSgpIHsKKyAgICByZXR1cm4gY3VycmVudF91c2VyX3Byb2dyYW1fOworICB9CisgIHZvaWQgU2V0Q3VycmVudFVzZXJQcm9ncmFtKGNvbnN0IFByb2dyYW1EYXRhUHRyJiBwcm9ncmFtKTsKKworICAvLyBUT0RPKGNyYnVnLmNvbS80MjYwODMpOiBTb21lIG9mIHRoaXMgc3RhdGUgaXMgcmVhZC1vbmx5LCBhbmQgY2FuIGJlIGxhemlseQorICAvLyBsb2FkZWQgb25jZSBmb3IgYWxsIGNvbnRleHRzLCBzaW5jZSB0aGUgdmFsdWVzIGRlcGVuZCBvbmx5IG9uCisgIC8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlIHVuZGVybHlpbmcgR0xFUzIgaW1wbGVtZW50YXRpb24uCisgIC8vIEluY2x1ZGVkIHdvdWxkIGJlIHRoZXNlIGZpcnN0IHR3byBfUkFOR0UgdmFsdWVzLCBhcyB3ZWxsIGFzIHRoZSBNQVhfIHZhbHVlcworICAvLyBmdXJ0aGVyIGRvd24uCisgIFN0YXRlQ2FjaGU8R0xmbG9hdFsyXSwgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFPiBhbGlhc2VkX2xpbmVfd2lkdGhfcmFuZ2VfOworICBTdGF0ZUNhY2hlPEdMZmxvYXRbMl0sIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRT4gYWxpYXNlZF9wb2ludF9zaXplX3JhbmdlXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfQkxFTkRfRFNUX0FMUEhBPiBibGVuZF9mdW5jX2RzdF9hbHBoYV87CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0JMRU5EX0RTVF9SR0I+IGJsZW5kX2Z1bmNfZHN0X3JnYl87CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0JMRU5EX1NSQ19BTFBIQT4gYmxlbmRfZnVuY19zcmNfYWxwaGFfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9CTEVORF9TUkNfUkdCPiBibGVuZF9mdW5jX3NyY19yZ2JfOworICBTdGF0ZUNhY2hlPEdMZmxvYXRbNF0sIEdMX0NPTE9SX0NMRUFSX1ZBTFVFPiBjb2xvcl9jbGVhcl92YWx1ZV87CisgIFN0YXRlQ2FjaGU8R0xib29sZWFuWzRdLCBHTF9DT0xPUl9XUklURU1BU0s+IGNvbG9yX3dyaXRlbWFza187CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0NVTExfRkFDRV9NT0RFPiBjdWxsX2ZhY2VfbW9kZV87CisgIFN0YXRlQ2FjaGU8R0xmbG9hdCwgR0xfREVQVEhfQ0xFQVJfVkFMVUU+IGRlcHRoX2NsZWFyX3ZhbHVlXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfREVQVEhfRlVOQz4gZGVwdGhfZnVuY187CisgIFN0YXRlQ2FjaGU8R0xmbG9hdFsyXSwgR0xfREVQVEhfUkFOR0U+IGRlcHRoX3JhbmdlXzsKKyAgU3RhdGVDYWNoZTxHTGJvb2xlYW4sIEdMX0RFUFRIX1dSSVRFTUFTSz4gZGVwdGhfd3JpdGVtYXNrXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfRlJPTlRfRkFDRT4gZnJvbnRfZmFjZV87CisgIFN0YXRlQ2FjaGU8R0xmbG9hdCwgR0xfTElORV9XSURUSD4gbGluZV93aWR0aF87CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UPiBnZW5lcmF0ZV9taXBtYXBfaGludF87CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTPgorICAgICAgbWF4X2NvbWJpbmVkX3RleHR1cmVfaW1hZ2VfdW5pdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFPiBtYXhfY3ViZV9tYXBfdGV4dHVyZV9zaXplXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFPiBtYXhfcmVuZGVyYnVmZmVyX3NpemVfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUUz4gbWF4X3RleHR1cmVfaW1hZ2VfdW5pdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9NQVhfVEVYVFVSRV9TSVpFPiBtYXhfdGV4dHVyZV9zaXplXzsKKyAgU3RhdGVDYWNoZTxHTHVpbnQsIEdMX01BWF9WRVJURVhfQVRUUklCUz4gbWF4X3ZlcnRleF9hdHRyaWJzXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTPgorICAgICAgbWF4X3ZlcnRleF90ZXh0dXJlX2ltYWdlX3VuaXRzXzsKKyAgU3RhdGVDYWNoZTxHTGludFsyXSwgR0xfTUFYX1ZJRVdQT1JUX0RJTVM+IG1heF92aWV3cG9ydF9kaW1zXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfUEFDS19BTElHTk1FTlQ+IHBpeGVsX3N0b3JlX3BhY2tfYWxpZ25tZW50XzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfVU5QQUNLX0FMSUdOTUVOVD4gcGl4ZWxfc3RvcmVfdW5wYWNrX2FsaWdubWVudF87CisgIFN0YXRlQ2FjaGU8R0xmbG9hdCwgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SPiBwb2x5Z29uX29mZnNldF9mYWN0b3JfOworICBTdGF0ZUNhY2hlPEdMZmxvYXQsIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTPiBwb2x5Z29uX29mZnNldF91bml0c187CisgIFN0YXRlQ2FjaGU8R0xib29sZWFuLCBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUPiBzYW1wbGVfY292ZXJhZ2VfaW52ZXJ0XzsKKyAgU3RhdGVDYWNoZTxHTGludFs0XSwgR0xfU0NJU1NPUl9CT1g+IHNjaXNzb3JfYm94XzsKKyAgU3RhdGVDYWNoZTxHTGZsb2F0LCBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUU+IHNhbXBsZV9jb3ZlcmFnZV92YWx1ZV87CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX1NURU5DSUxfRlVOQz4gc3RlbmNpbF9mdW5jXzsKKyAgU3RhdGVDYWNoZTxHTGludCwgR0xfU1RFTkNJTF9WQUxVRV9NQVNLPiBzdGVuY2lsX3ZhbHVlX21hc2tfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9TVEVOQ0lMX1JFRj4gc3RlbmNpbF9yZWZfOworICBTdGF0ZUNhY2hlPEdMaW50WzRdLCBHTF9WSUVXUE9SVD4gdmlld3BvcnRfOworCisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0FMUEhBX0JJVFM+IGRlZmF1bHRfZnJhbWVidWZmZXJfYWxwaGFfYml0c187CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX0JMVUVfQklUUz4gZGVmYXVsdF9mcmFtZWJ1ZmZlcl9ibHVlX2JpdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9ERVBUSF9CSVRTPiBkZWZhdWx0X2ZyYW1lYnVmZmVyX2RlcHRoX2JpdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9HUkVFTl9CSVRTPiBkZWZhdWx0X2ZyYW1lYnVmZmVyX2dyZWVuX2JpdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9SRURfQklUUz4gZGVmYXVsdF9mcmFtZWJ1ZmZlcl9yZWRfYml0c187CisgIFN0YXRlQ2FjaGU8R0xpbnQsIEdMX1NURU5DSUxfQklUUz4gZGVmYXVsdF9mcmFtZWJ1ZmZlcl9zdGVuY2lsX2JpdHNfOworICBTdGF0ZUNhY2hlPEdMaW50LCBHTF9TQU1QTEVfQlVGRkVSUz4gZGVmYXVsdF9mcmFtZWJ1ZmZlcl9zYW1wbGVfYnVmZmVyc187CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgaW50IGtDYWNoZUxpbWl0ID0gMTY7CisgIHN0YXRpYyBjb25zdCBpbnQga0Vycm9yTGltaXQgPSAxNjsKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4aW11bUVycm9yQ291bnRlclNpemUgPSAyMDY0OworCisgIHR5cGVkZWYgTXJ1Q2FjaGU8U2hhZGVyQ29uZmlnLCBHTHVpbnQ+IFNoYWRlckNhY2hlOworICB0eXBlZGVmIE1ydUNhY2hlPFNoYWRlckNvbmZpZywgUHJvZ3JhbUNvbnRleHQ+IFByb2dyYW1DYWNoZTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxHTGVudW0+IFRleHR1cmVGb3JtYXRzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIEdldFZhbHVlKEdMZW51bSB2YWx1ZSwgVCogZGF0YSkgY29uc3Q7CisKKyAgYm9vbCBDYW5EcmF3KCkgY29uc3Q7CisKKyAgR0xlbnVtIEdldEVuYWJsZWRUZXh0dXJlVGFyZ2V0KEdMZW51bSBpZCkgY29uc3Q7CisKKyAgdm9pZCBQcmVwYXJlUHJvZ3JhbU9iamVjdChHTGVudW0gbW9kZSwgYm9vbCogcHJvZ3JhbV91c2VzX2V4dGVybmFsX2FzXzJkKTsKKyAgdm9pZCBDbGVhclByb2dyYW1PYmplY3QoKTsKKworICBQcm9ncmFtQ29udGV4dCYgQmluZFByb2dyYW1Db250ZXh0KEdMZW51bSBtb2RlKTsKKyAgU2hhZGVyQ29uZmlnIENvbmZpZ3VyZVNoYWRlcihHTGVudW0gbW9kZSk7CisKKyAgdm9pZCBFbnN1cmVDb21wcmVzc2VkVGV4dHVyZUZvcm1hdFN0YXRlS25vd24oKSBjb25zdDsKKyAgdm9pZCBFbnN1cmVVbmRlcmx5aW5nRXh0ZW5zaW9uc0tub3duKCkgY29uc3Q7CisKKyAgdm9pZCBTZXR1cENvbG9yVGV4dHVyZUF0dGFjaG1lbnQoR0x1aW50IHRleHR1cmUpOworICB2b2lkIFNldHVwRGVwdGhTdGVuY2lsQXR0YWNobWVudChHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBkZXB0aF9zaXplLCBHTGludCBzdGVuY2lsX3NpemUpOworICB2b2lkIERlbGV0ZUZyYW1lYnVmZmVyT3ZlcnJpZGUoKTsKKworICBHbGVzVmVyc2lvbiB2ZXJzaW9uXzsKKyAgY29uc3QgaW50MzJfdCBpZF87CisgIGJvb2wgaW5pdGlhbGl6ZWRfOworICBib29sIGluaXRpYWxpemVkX3ZpZXdwb3J0XzsKKyAgR0xlbnVtIGVycm9yXzsKKyAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBlcnJvcl9jb3VudGVyXzsKKworICB2b2lkKiBnbGVzX2ltcGxfOworICBjb25zdCBVbmRlcmx5aW5nQXBpcyogYXBpc187CisgIFNoYXJlR3JvdXBQdHIgc2hhcmVfZ3JvdXBfOworCisgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgZnJhbWVidWZmZXIgb2JqZWN0IHRvIHVzZSBpbiBwbGFjZSBvZiBmcmFtZWJ1ZmZlciB6ZXJvLgorICBHTHVpbnQgZ2xvYmFsX292ZXJyaWRlX2ZyYW1lYnVmZmVyXzsKKworICAvLyBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBmcmFtZWJ1ZmZlciBmb3IgcmVuZGVyaW5nIGJhc2VkIG9uIHRoZQorICAvLyBsYXN0IGF0dGFjaGVkIEVHTCBzdXJmYWNlIHByb3BvcGVydGllcy4KKyAgR0x1aW50IGdsb2JhbF9mcmFtZWJ1ZmZlcl87CisgIEdMdWludCBnbG9iYWxfZGVwdGhfcmVuZGVyYnVmZmVyXzsKKyAgR0x1aW50IGdsb2JhbF9zdGVuY2lsX3JlbmRlcmJ1ZmZlcl87CisgIEdMaW50IGNhY2hlZF9kcmF3X3dpZHRoXzsKKyAgR0xpbnQgY2FjaGVkX2RyYXdfaGVpZ2h0XzsKKyAgR0xpbnQgY2FjaGVkX2RyYXdfc3RlbmNpbF9zaXplXzsKKyAgR0xpbnQgY2FjaGVkX2RyYXdfZGVwdGhfc2l6ZV87CisgIEdMdWludCBjYWNoZWRfZ2xvYmFsX3RleHR1cmVfOworCisgIFNoYWRlckNhY2hlIHZlcnRleF9zaGFkZXJfY2FjaGVfOworICBTaGFkZXJDYWNoZSBmcmFnbWVudF9zaGFkZXJfY2FjaGVfOworICBQcm9ncmFtQ2FjaGUgcHJvZ3JhbV9jYWNoZV87CisgIEZ1bGxzY3JlZW5RdWFkKiBmdWxsc2NyZWVuX3F1YWRfOworICBQcm9ncmFtRGF0YVB0ciBjdXJyZW50X3VzZXJfcHJvZ3JhbV87CisgIFN1cmZhY2VDb250cm9sQ2FsbGJhY2tQdHIgc3VyZmFjZV9jYWxsYmFja187CisKKyAgLy8gVGhpcyBpcyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cyBnaXZlbiB0byB0aGUKKyAgLy8gY2xpZW50LgorICBtdXRhYmxlIFRleHR1cmVGb3JtYXRzIHN1cHBvcnRlZF9jb21wcmVzc2VkX3RleHR1cmVfZm9ybWF0c187CisgIC8vIFRoaXMgaXMgdGhlIHNldCBvZiBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0cyB3aGljaCBuZWVkIHRvIGJlIGVtdWxhdGVkIGFzCisgIC8vIHRoZXJlIGlzIG5vIHN1cHBvcnQgaW4gdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24uCisgIG11dGFibGUgVGV4dHVyZUZvcm1hdHMgZW11bGF0ZWRfY29tcHJlc3NlZF90ZXh0dXJlX2Zvcm1hdHNfOworCisgIGJvb2wgY2hlY2tzX2VuYWJsZWRfOworICBtdXRhYmxlIGNvbnN0IGNoYXIqIGdsb2JhbF9leHRlbnNpb25zXzsKKyAgbXV0YWJsZSBib29sIHN1cHBvcnRzX3BhY2tlZF9kZXB0aF9zdGVuY2lsXzsKKworICBHbGVzQ29udGV4dChjb25zdCBHbGVzQ29udGV4dCYpOworICBHbGVzQ29udGV4dCYgb3BlcmF0b3I9KGNvbnN0IEdsZXNDb250ZXh0Jik7Cit9OworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfR0xFU19DT05URVhUX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX29wdGlvbnMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDcxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX29wdGlvbnMuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBBbmRyb2lkCisKKyNpZm5kZWYgR0xFU19HTEVTX09QVElPTlNfSF8KKyNkZWZpbmUgR0xFU19HTEVTX09QVElPTlNfSF8KKworLy8gQSBtYWNybyB0byBkaXNhbGxvdyB0aGUgY29weSBjb25zdHJ1Y3RvciBhbmQgb3BlcmF0b3I9IGZ1bmN0aW9ucworLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzCisjZGVmaW5lIENPTU1PTl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKTsgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIG9wZXJhdG9yPShjb25zdCBUeXBlTmFtZSYpCisKK25hbWVzcGFjZSBlbXVnbCB7CisKKyAgICBzdHJ1Y3QgR2xlc09wdGlvbnMgeworICAgICAgICBzdGF0aWMgYm9vbCBHTEZpeGVkQXR0cmlic0VuYWJsZWQoKSB7IHJldHVybiBnbF9maXhlZF9hdHRyaWJzOyB9CisgICAgICAgIHN0YXRpYyBib29sIEdMRXJyb3JDaGVja3NFbmFibGVkKCkgeyByZXR1cm4gZ2xfZXJyb3JfY2hlY2tzOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBHbGVzT3B0aW9ucygpOworICAgICAgICB+R2xlc09wdGlvbnMoKTsKKyAgICAgICAgQ09NTU9OX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihHbGVzT3B0aW9ucyk7CisKKyNpZmRlZiBHTF9GSVhFRF9BVFRSSUJTCisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGdsX2ZpeGVkX2F0dHJpYnMgPSB0cnVlOworI2Vsc2UgLy8gIUdMX0ZJWEVEX0FUVFJJQlMKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgZ2xfZml4ZWRfYXR0cmlicyA9IGZhbHNlOworI2VuZGlmIC8vIEdMX0ZJWEVEX0FUVFJJQlMKKworI2lmZGVmIEdMX0VSUk9SX0NIRUNLUworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBnbF9lcnJvcl9jaGVja3MgPSB0cnVlOworI2Vsc2UgLy8gISBHTF9FUlJPUl9DSEVDS1MKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgZ2xfZXJyb3JfY2hlY2tzID0gZmFsc2U7CisjZW5kaWYgLy8gR0xfRVJST1JfQ0hFQ0tTCisgICAgfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCisKKyNlbmRpZiAgLy8gR0xFU19HTEVTX09QVElPTlNfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfdXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY3ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvZ2xlc191dGlscy5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19HTEVTX1VUSUxTX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfR0xFU19VVElMU19IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworZW51bSBHbGVzVmVyc2lvbiB7CisgIC8vIFRoZXNlIG1hdGNoIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGJ5IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLgorICBrR2xlczExID0gMSwKKyAga0dsZXMyMCA9IDIsCisgIGtHbGVzVmVyc2lvbkNvdW50Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBUIENsYW1wVmFsdWUoVCB2YWx1ZSwgVCBtaW4sIFQgbWF4KSB7CisgIHJldHVybiBzdGQ6Om1pbihzdGQ6Om1heCh2YWx1ZSwgbWluKSwgbWF4KTsKK30KKworaW5saW5lIEdMZmxvYXQgWDJGKGNvbnN0IEdMZml4ZWQgdmFsdWUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEdMZmxvYXQ+KHZhbHVlKSAvIDY1NTM2LjBmOworfQorCitpbmxpbmUgR0xmaXhlZCBGMlgoY29uc3QgR0xmbG9hdCB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUgPiArMzI3NjcuNjU1MzVmID8gKzMyNzY3ICogNjU1MzYgKyA2NTUzNSA6CisgICAgICAgICB2YWx1ZSA8IC0zMjc2OC42NTUzNWYgPyAtMzI3NjggKiA2NTUzNiArIDY1NTM1IDoKKyAgICAgICAgIHN0YXRpY19jYXN0PEdMZml4ZWQ+KHZhbHVlICogNjU1MzYpOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMYm9vbGVhbiogZGF0YSwgR0xib29sZWFuIHYpIHsKKyAgKmRhdGEgPSB2ID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMYm9vbGVhbiogZGF0YSwgR0xmbG9hdCB2KSB7CisgICpkYXRhID0gdiA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworaW5saW5lIHZvaWQgQ29udmVydChHTGJvb2xlYW4qIGRhdGEsIEdMaW50IHYpIHsKKyAgKmRhdGEgPSB2ID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMYm9vbGVhbiogZGF0YSwgR0x1aW50IHYpIHsKKyAgKmRhdGEgPSB2ID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMZmxvYXQqIGRhdGEsIEdMYm9vbGVhbiB2KSB7CisgICpkYXRhID0gdiA/IEdMX1RSVUUgOiBHTF9GQUxTRTsKK30KKworaW5saW5lIHZvaWQgQ29udmVydChHTGludCogZGF0YSwgR0xib29sZWFuIHYpIHsKKyAgKmRhdGEgPSB2ID8gR0xfVFJVRSA6IEdMX0ZBTFNFOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMZmxvYXQqIGRhdGEsIEdMaW50IHYpIHsKKyAgKmRhdGEgPSBzdGF0aWNfY2FzdDxHTGZsb2F0Pih2KTsKK30KKworaW5saW5lIHZvaWQgQ29udmVydChHTGZsb2F0KiBkYXRhLCBHTHVpbnQgdikgeworICAqZGF0YSA9IHN0YXRpY19jYXN0PEdMZmxvYXQ+KHYpOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMaW50KiBkYXRhLCBHTHVpbnQgdikgeworICAqZGF0YSA9IHN0YXRpY19jYXN0PEdMaW50Pih2KTsKK30KKworaW5saW5lIHZvaWQgQ29udmVydChHTGludCogZGF0YSwgR0xmbG9hdCB2KSB7CisgICpkYXRhID0gc3RhdGljX2Nhc3Q8R0xpbnQ+KHYpOworfQorCitpbmxpbmUgdm9pZCBDb252ZXJ0KEdMZmxvYXQqIGRhdGEsIEdMZmxvYXQgdikgeworICAqZGF0YSA9IHY7Cit9CisKK2lubGluZSB2b2lkIENvbnZlcnQoR0xpbnQqIGRhdGEsIEdMaW50IHYpIHsKKyAgKmRhdGEgPSB2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgc2l6ZV90IE4+CitpbmxpbmUgdm9pZCBDb252ZXJ0KFQqIGRhdGEsIGNvbnN0IFMgKCZ2KVtOXSkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE47ICsraSkgeworICAgIENvbnZlcnQoZGF0YSArIGksIHZbaV0pOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBJPgoraW5saW5lIHZvaWQgQ29udmVydChUKiBkYXRhLCBJIGJlZ2luLCBJIGVuZCkgeworICB3aGlsZSAoYmVnaW4gIT0gZW5kKSB7CisgICAgQ29udmVydChkYXRhLCAqYmVnaW4pOworICAgICsrYmVnaW47CisgICAgKytkYXRhOworICB9Cit9CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19HTEVTX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX3ZhbGlkYXRlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfdmFsaWRhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1M2IzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX3ZhbGlkYXRlLmNwcApAQCAtMCwwICsxLDY0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiZ2xlcy9nbGVzX3ZhbGlkYXRlLmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiZ2xlcy9zdGF0ZS5oIgorCitib29sIElzVmFsaWRBbHBoYUZ1bmMoR0xlbnVtIGZ1bmMpIHsKKyAgc3dpdGNoIChmdW5jKSB7CisgICAgY2FzZSBHTF9ORVZFUjoKKyAgICBjYXNlIEdMX0xFU1M6CisgICAgY2FzZSBHTF9FUVVBTDoKKyAgICBjYXNlIEdMX0xFUVVBTDoKKyAgICBjYXNlIEdMX0dSRUFURVI6CisgICAgY2FzZSBHTF9OT1RFUVVBTDoKKyAgICBjYXNlIEdMX0dFUVVBTDoKKyAgICBjYXNlIEdMX0FMV0FZUzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkQmxlbmRGdW5jKEdMZW51bSBmYWN0b3IpIHsKKyAgc3dpdGNoIChmYWN0b3IpIHsKKyAgICBjYXNlIEdMX1pFUk86CisgICAgY2FzZSBHTF9PTkU6CisgICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOgorICAgIGNhc2UgR0xfRFNUX0NPTE9SOgorICAgIGNhc2UgR0xfT05FX01JTlVTX0RTVF9DT0xPUjoKKyAgICBjYXNlIEdMX1NSQ19BTFBIQToKKyAgICBjYXNlIEdMX09ORV9NSU5VU19TUkNfQUxQSEE6CisgICAgY2FzZSBHTF9EU1RfQUxQSEE6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBOgorICAgIGNhc2UgR0xfQ09OU1RBTlRfQ09MT1I6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1I6CisgICAgY2FzZSBHTF9DT05TVEFOVF9BTFBIQToKKyAgICBjYXNlIEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQToKKyAgICBjYXNlIEdMX1NSQ19BTFBIQV9TQVRVUkFURToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkQnVmZmVyVGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKKyAgcmV0dXJuIHRhcmdldCA9PSBHTF9BUlJBWV9CVUZGRVIgfHwgdGFyZ2V0ID09IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSOworfQorCitib29sIElzVmFsaWRCdWZmZXJVc2FnZShHTGVudW0gdXNhZ2UpIHsKKyAgcmV0dXJuIHVzYWdlID09IEdMX1NUQVRJQ19EUkFXIHx8IHVzYWdlID09IEdMX0RZTkFNSUNfRFJBVyB8fAorICAgICAgICAgdXNhZ2UgPT0gR0xfU1RSRUFNX0RSQVc7Cit9CisKK2Jvb2wgSXNWYWxpZENsaWVudFN0YXRlKEdMZW51bSBzdGF0ZSkgeworICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWToKKyAgICBjYXNlIEdMX05PUk1BTF9BUlJBWToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVk6CisgICAgY2FzZSBHTF9WRVJURVhfQVJSQVk6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUzoKKyAgICBjYXNlIEdMX1dFSUdIVF9BUlJBWV9PRVM6CisgICAgY2FzZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRDb2xvclBvaW50ZXJTaXplKEdMaW50IHNpemUpIHsKKyAgcmV0dXJuICgoc2l6ZSA+PSAzKSAmJiAoc2l6ZSA8PSA0KSk7Cit9CisKK2Jvb2wgSXNWYWxpZENvbG9yUG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkQ3VsbEZhY2VNb2RlKEdMZW51bSBtb2RlKSB7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfRlJPTlQ6CisgICAgY2FzZSBHTF9CQUNLOgorICAgIGNhc2UgR0xfRlJPTlRfQU5EX0JBQ0s6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSXNWYWxpZERlcHRoRnVuYyhHTGVudW0gZnVuYykgeworICBzd2l0Y2ggKGZ1bmMpIHsKKyAgICBjYXNlIEdMX05FVkVSOgorICAgIGNhc2UgR0xfTEVTUzoKKyAgICBjYXNlIEdMX0VRVUFMOgorICAgIGNhc2UgR0xfTEVRVUFMOgorICAgIGNhc2UgR0xfR1JFQVRFUjoKKyAgICBjYXNlIEdMX05PVEVRVUFMOgorICAgIGNhc2UgR0xfR0VRVUFMOgorICAgIGNhc2UgR0xfQUxXQVlTOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWREcmF3TW9kZShHTGVudW0gbW9kZSkgeworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdMX1BPSU5UUzoKKyAgICBjYXNlIEdMX0xJTkVfU1RSSVA6CisgICAgY2FzZSBHTF9MSU5FX0xPT1A6CisgICAgY2FzZSBHTF9MSU5FUzoKKyAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOgorICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOgorICAgIGNhc2UgR0xfVFJJQU5HTEVTOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzVmFsaWREcmF3VHlwZShHTGVudW0gbW9kZSkgeworICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkRW11bGF0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoR0xlbnVtIHR5cGUpIHsKKyAgLy8gTm90ZTogVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGgga0VtdWxhdGVkQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzCisgIC8vIGluIGdsZXNfY29udGV4dC5jcHAuCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6CisgICAgY2FzZSBHTF9FVEMxX1JHQjhfT0VTOgorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSXNWYWxpZEZyYW1lYnVmZmVyQXR0YWNobWVudChHTGVudW0gYXR0YWNobWVudCkgeworICBzd2l0Y2ggKGF0dGFjaG1lbnQpIHsKKyAgICBjYXNlIEdMX0NPTE9SX0FUVEFDSE1FTlQwOgorICAgIGNhc2UgR0xfREVQVEhfQVRUQUNITUVOVDoKKyAgICBjYXNlIEdMX1NURU5DSUxfQVRUQUNITUVOVDoKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkRnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1zKEdMZW51bSBwbmFtZSkgeworICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOgorICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRToKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTDoKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzVmFsaWRGcmFtZWJ1ZmZlclRhcmdldChHTGVudW0gdGFyZ2V0KSB7CisgIHJldHVybiB0YXJnZXQgPT0gR0xfRlJBTUVCVUZGRVI7Cit9CisKK2Jvb2wgSXNWYWxpZEZyb250RmFjZU1vZGUoR0xlbnVtIG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9DVzoKKyAgICBjYXNlIEdMX0NDVzoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkTWF0cml4SW5kZXhQb2ludGVyU2l6ZShHTGludCBzaXplKSB7CisgIHJldHVybiAoKHNpemUgPj0gMSkgJiYgKHNpemUgPD0gVW5pZm9ybUNvbnRleHQ6OmtNYXhWZXJ0ZXhVbml0c09FUykpOworfQorCitib29sIElzVmFsaWRNYXRyaXhJbmRleFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKSB7CisgIHJldHVybiB0eXBlID09IEdMX1VOU0lHTkVEX0JZVEU7Cit9CisKK2Jvb2wgSXNWYWxpZE1pcG1hcEhpbnRNb2RlKEdMZW51bSBtb2RlKSB7CisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfRkFTVEVTVDoKKyAgICBjYXNlIEdMX05JQ0VTVDoKKyAgICBjYXNlIEdMX0RPTlRfQ0FSRToKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWROb3JtYWxQb2ludGVyVHlwZShHTGVudW0gdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNWYWxpZFBpeGVsRm9ybWF0KEdMZW51bSBmb3JtYXQpIHsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdMX0FMUEhBOgorICAgIGNhc2UgR0xfREVQVEhfQ09NUE9ORU5UOgorICAgIGNhc2UgR0xfUkdCOgorICAgIGNhc2UgR0xfUkdCQToKKyAgICBjYXNlIEdMX0xVTUlOQU5DRToKKyAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkUGl4ZWxGb3JtYXRBbmRUeXBlKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKSB7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHTF9SR0JBOgorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgorICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzE6CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1JHQjoKKyAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0xVTUlOQU5DRToKKyAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKKyAgICBjYXNlIEdMX0FMUEhBOgorICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkUGl4ZWxTdG9yZUFsaWdubWVudChHTGludCB2YWx1ZSkgeworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA4OgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRQaXhlbFN0b3JlTmFtZShHTGVudW0gbmFtZSkgeworICBzd2l0Y2ggKG5hbWUpIHsKKyAgICBjYXNlIEdMX1BBQ0tfQUxJR05NRU5UOgorICAgIGNhc2UgR0xfVU5QQUNLX0FMSUdOTUVOVDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkUGl4ZWxUeXBlKEdMZW51bSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgorICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMToKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzVmFsaWRQb2ludFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKSB7CisgIHJldHVybiB0eXBlID09IEdMX0ZJWEVEIHx8IHR5cGUgPT0gR0xfRkxPQVQ7Cit9CisKK2Jvb2wgSXNWYWxpZFByZWNpc2lvblR5cGUoR0xlbnVtIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHTF9MT1dfRkxPQVQ6CisgICAgY2FzZSBHTF9NRURJVU1fRkxPQVQ6CisgICAgY2FzZSBHTF9ISUdIX0ZMT0FUOgorICAgIGNhc2UgR0xfTE9XX0lOVDoKKyAgICBjYXNlIEdMX01FRElVTV9JTlQ6CisgICAgY2FzZSBHTF9ISUdIX0lOVDoKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkUmVuZGVyYnVmZmVyRm9ybWF0KEdMZW51bSBpbnRlcm5hbGZvcm1hdCkgeworICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgY2FzZSBHTF9ERVBUSDI0X1NURU5DSUw4X09FUzoKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDE2X09FUzoKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUzoKKyAgICBjYXNlIEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUzoKKyAgICBjYXNlIEdMX1JHQjU2NV9PRVM6CisgICAgY2FzZSBHTF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1JHQjhfT0VTOgorICAgIGNhc2UgR0xfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUkdCQThfT0VTOgorICAgIGNhc2UgR0xfU1RFTkNJTF9JTkRFWDFfT0VTOgorICAgIGNhc2UgR0xfU1RFTkNJTF9JTkRFWDRfT0VTOgorICAgIGNhc2UgR0xfU1RFTkNJTF9JTkRFWDhfT0VTOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzVmFsaWRSZW5kZXJidWZmZXJQYXJhbXMoR0xlbnVtIHBuYW1lKSB7CisgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9XSURUSDoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQ6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkU6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkU6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRToKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkU6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNWYWxpZFJlbmRlcmJ1ZmZlclRhcmdldChHTGVudW0gdGFyZ2V0KSB7CisgIHJldHVybiB0YXJnZXQgPT0gR0xfUkVOREVSQlVGRkVSOworfQorCitib29sIElzVmFsaWRTaGFkZXJUeXBlKEdMZW51bSB0eXBlKSB7CisgIHJldHVybiB0eXBlID09IEdMX1ZFUlRFWF9TSEFERVIgfHwgdHlwZSA9PSBHTF9GUkFHTUVOVF9TSEFERVI7Cit9CisKK2Jvb2wgSXNWYWxpZFN0ZW5jaWxGdW5jKEdMZW51bSBmdW5jKSB7CisgIHN3aXRjaCAoZnVuYykgeworICAgIGNhc2UgR0xfTkVWRVI6CisgICAgY2FzZSBHTF9MRVNTOgorICAgIGNhc2UgR0xfTEVRVUFMOgorICAgIGNhc2UgR0xfR1JFQVRFUjoKKyAgICBjYXNlIEdMX0dFUVVBTDoKKyAgICBjYXNlIEdMX0VRVUFMOgorICAgIGNhc2UgR0xfTk9URVFVQUw6CisgICAgY2FzZSBHTF9BTFdBWVM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSXNWYWxpZFRleENvb3JkUG9pbnRlclNpemUoR0xpbnQgc2l6ZSkgeworICByZXR1cm4gKChzaXplID49IDIpICYmIChzaXplIDw9IDQpKTsKK30KKworYm9vbCBJc1ZhbGlkVGV4Q29vcmRQb2ludGVyVHlwZShHTGVudW0gdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNWYWxpZFRleEVudihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUpIHsKKyAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfTU9ERToKKyAgICBjYXNlIEdMX1RFWFRVUkVfRU5WX0NPTE9SOgorICAgIGNhc2UgR0xfQ09NQklORV9SR0I6CisgICAgY2FzZSBHTF9DT01CSU5FX0FMUEhBOgorICAgIGNhc2UgR0xfU1JDMF9SR0I6CisgICAgY2FzZSBHTF9TUkMxX1JHQjoKKyAgICBjYXNlIEdMX1NSQzJfUkdCOgorICAgIGNhc2UgR0xfU1JDMF9BTFBIQToKKyAgICBjYXNlIEdMX1NSQzFfQUxQSEE6CisgICAgY2FzZSBHTF9TUkMyX0FMUEhBOgorICAgIGNhc2UgR0xfT1BFUkFORDBfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDFfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDJfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDBfQUxQSEE6CisgICAgY2FzZSBHTF9PUEVSQU5EMV9BTFBIQToKKyAgICBjYXNlIEdMX09QRVJBTkQyX0FMUEhBOgorICAgIGNhc2UgR0xfUkdCX1NDQUxFOgorICAgIGNhc2UgR0xfQUxQSEFfU0NBTEU6CisgICAgY2FzZSBHTF9DT09SRF9SRVBMQUNFX09FUzoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuICh0YXJnZXQgPT0gR0xfVEVYVFVSRV9FTlYgfHwgdGFyZ2V0ID09IEdMX1BPSU5UX1NQUklURV9PRVMpOworfQorCitib29sIElzVmFsaWRUZXhFbnZDb21iaW5lQWxwaGEoR0xlbnVtIHBhcmFtKSB7CisgIHN3aXRjaCAocGFyYW0pIHsKKyAgICBjYXNlIEdMX1JFUExBQ0U6CisgICAgY2FzZSBHTF9NT0RVTEFURToKKyAgICBjYXNlIEdMX0FERDoKKyAgICBjYXNlIEdMX0FERF9TSUdORUQ6CisgICAgY2FzZSBHTF9JTlRFUlBPTEFURToKKyAgICBjYXNlIEdMX1NVQlRSQUNUOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRUZXhFbnZDb21iaW5lUmdiKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9SRVBMQUNFOgorICAgIGNhc2UgR0xfTU9EVUxBVEU6CisgICAgY2FzZSBHTF9BREQ6CisgICAgY2FzZSBHTF9BRERfU0lHTkVEOgorICAgIGNhc2UgR0xfSU5URVJQT0xBVEU6CisgICAgY2FzZSBHTF9TVUJUUkFDVDoKKyAgICBjYXNlIEdMX0RPVDNfUkdCOgorICAgIGNhc2UgR0xfRE9UM19SR0JBOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRUZXhFbnZNb2RlKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9SRVBMQUNFOgorICAgIGNhc2UgR0xfTU9EVUxBVEU6CisgICAgY2FzZSBHTF9ERUNBTDoKKyAgICBjYXNlIEdMX0JMRU5EOgorICAgIGNhc2UgR0xfQUREOgorICAgIGNhc2UgR0xfQ09NQklORToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkVGV4RW52T3BlcmFuZEFscGhhKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9TUkNfQUxQSEE6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRUZXhFbnZPcGVyYW5kUmdiKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9TUkNfQ09MT1I6CisgICAgY2FzZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SOgorICAgIGNhc2UgR0xfU1JDX0FMUEhBOgorICAgIGNhc2UgR0xfT05FX01JTlVTX1NSQ19BTFBIQToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1ZhbGlkVGV4RW52U2NhbGUoR0xmbG9hdCBzY2FsZSkgeworICByZXR1cm4gKHNjYWxlID09IDEuZiB8fCBzY2FsZSA9PSAyLmYgfHwgc2NhbGUgPT0gNC5mKTsKK30KKworYm9vbCBJc1ZhbGlkVGV4RW52U291cmNlKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9QUkVWSU9VUzoKKyAgICBjYXNlIEdMX1BSSU1BUllfQ09MT1I6CisgICAgY2FzZSBHTF9URVhUVVJFOgorICAgIGNhc2UgR0xfQ09OU1RBTlQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSXNWYWxpZFRleEdlbkNvb3JkKEdMZW51bSBjb29yZCkgeworICAvLyBHTF9TLCBHTF9UIGFuZCBHTF9SIGFyZSBub3QgZGVmaW5lZCBpbiBHTEVTMSBhbmQgR0xFUzEgaGVhZGVycy4KKyAgLy8gT25seSBHTF9URVhUVVJFX0dFTl9TVFJfT0VTIGlzIHN1cHBvcnRlZC4KKyAgcmV0dXJuIGNvb3JkID09IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVM7Cit9CisKK2Jvb2wgSXNWYWxpZFRleEdlbk1vZGUoR0xlbnVtIG1vZGUpIHsKKyAgLy8gb3BlbmdsZXNfc3BlY18xXzFfZXh0ZW5zaW9uX3BhY2sucGRmIDQuMQorICAvLyBPbmx5IEdMX05PUk1BTF9NQVBfT0VTICYgR0xfUkVGTEVDVElPTl9NQVBfT0VTIGFyZSBzdXBwb3J0ZWQuCisgIHN3aXRjaCAobW9kZSkgeworICAgIGNhc2UgR0xfTk9STUFMX01BUF9PRVM6CisgICAgY2FzZSBHTF9SRUZMRUNUSU9OX01BUF9PRVM6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgSXNWYWxpZFRleHR1cmVEaW1lbnNpb25zKEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbWF4X3RleHR1cmVfc2l6ZSkgeworICBpZiAod2lkdGggPCAwIHx8IHdpZHRoID4gbWF4X3RleHR1cmVfc2l6ZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChoZWlnaHQgPCAwIHx8IGhlaWdodCA+IG1heF90ZXh0dXJlX3NpemUpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gSXNQb3dlck9mMih3aWR0aCkgJiYgSXNQb3dlck9mMihoZWlnaHQpOworfQorCitib29sIElzVmFsaWRUZXh0dXJlRW51bShHTGVudW0gdW5pdCwgR0x1aW50IG1heF9udW1fdGV4dHVyZXMpIHsKKyAgcmV0dXJuIHVuaXQgPj0gR0xfVEVYVFVSRTAgJiYgdW5pdCA8PSAoR0xfVEVYVFVSRTAgKyBtYXhfbnVtX3RleHR1cmVzKTsKK30KKworYm9vbCBJc1ZhbGlkVGV4dHVyZVBhcmFtKEdMZW51bSBwYXJhbSkgeworICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVA6CisgICAgY2FzZSBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6CisgICAgY2FzZSBHTF9URVhUVVJFX01BR19GSUxURVI6CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzVmFsaWRUZXh0dXJlVGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKKyAgcmV0dXJuIHRhcmdldCA9PSBHTF9URVhUVVJFXzJEIHx8IHRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQIHx8CisgICAgICAgICB0YXJnZXQgPT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVM7Cit9CisKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXRBbmRQYXJhbShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUpIHsKKyAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgorICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgorICAgIGNhc2UgR0xfVEVYVFVSRV9XUkFQX1M6CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfVDoKKyAgICBjYXNlIEdMX0dFTkVSQVRFX01JUE1BUDoKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuICh0YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkgfHwgKHRhcmdldCA9PSBHTF9URVhUVVJFX0NVQkVfTUFQX09FUyk7Cit9CisKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXRFeChHTGVudW0gdGFyZ2V0KSB7CisgIHN3aXRjaCAodGFyZ2V0KSB7CisgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfT0VTOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfT0VTOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXRMaW1pdGVkKEdMZW51bSB0YXJnZXQpIHsKKyAgcmV0dXJuIHRhcmdldCA9PSBHTF9URVhUVVJFXzJEIHx8IHRhcmdldCA9PSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUzsKK30KKworYm9vbCBJc1ZhbGlkVmVydGV4QXR0cmliU2l6ZShHTGludCBzaXplKSB7CisgIHJldHVybiAoKHNpemUgPj0gMSkgJiYgKHNpemUgPD0gNCkpOworfQorCitib29sIElzVmFsaWRWZXJ0ZXhBdHRyaWJUeXBlKEdMZW51bSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfQllURToKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgY2FzZSBHTF9TSE9SVDoKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBJc1ZhbGlkVmVydGV4UG9pbnRlclNpemUoR0xpbnQgc2l6ZSkgeworICByZXR1cm4gKChzaXplID49IDIpICYmIChzaXplIDw9IDQpKTsKK30KKworYm9vbCBJc1ZhbGlkVmVydGV4UG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHTF9CWVRFOgorICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElzVmFsaWRXZWlnaHRQb2ludGVyU2l6ZShHTGludCBzaXplKSB7CisgIHJldHVybiAoKHNpemUgPj0gMSkgJiYgKHNpemUgPD0gVW5pZm9ybUNvbnRleHQ6OmtNYXhWZXJ0ZXhVbml0c09FUykpOworfQorCitib29sIElzVmFsaWRXZWlnaHRQb2ludGVyVHlwZShHTGVudW0gdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX3ZhbGlkYXRlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9nbGVzX3ZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3NWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2dsZXNfdmFsaWRhdGUuaApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19HTEVTX1ZBTElEQVRFX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfR0xFU19WQUxJREFURV9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCitpbmxpbmUgYm9vbCBJc1Bvd2VyT2YyKGludCBudW0pIHsKKyAgcmV0dXJuIChudW0gJiAobnVtIC0gMSkpID09IDA7Cit9CisKK2Jvb2wgSXNWYWxpZEFscGhhRnVuYyhHTGVudW0gZnVuYyk7Citib29sIElzVmFsaWRCbGVuZEZ1bmMoR0xlbnVtIGZhY3Rvcik7Citib29sIElzVmFsaWRCdWZmZXJUYXJnZXQoR0xlbnVtIHRhcmdldCk7Citib29sIElzVmFsaWRCdWZmZXJVc2FnZShHTGVudW0gdXNhZ2UpOworYm9vbCBJc1ZhbGlkQ2xpZW50U3RhdGUoR0xlbnVtIHN0YXRlKTsKK2Jvb2wgSXNWYWxpZENvbG9yUG9pbnRlclNpemUoR0xpbnQgc2l6ZSk7Citib29sIElzVmFsaWRDb2xvclBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKK2Jvb2wgSXNWYWxpZEN1bGxGYWNlTW9kZShHTGVudW0gbW9kZSk7Citib29sIElzVmFsaWREZXB0aEZ1bmMoR0xlbnVtIGZ1bmMpOworYm9vbCBJc1ZhbGlkRHJhd01vZGUoR0xlbnVtIG1vZGUpOworYm9vbCBJc1ZhbGlkRHJhd1R5cGUoR0xlbnVtIG1vZGUpOworYm9vbCBJc1ZhbGlkRW11bGF0ZWRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoR0xlbnVtIHR5cGUpOworYm9vbCBJc1ZhbGlkRnJhbWVidWZmZXJBdHRhY2htZW50KEdMZW51bSBhdHRhY2htZW50KTsKK2Jvb2wgSXNWYWxpZEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtcyhHTGVudW0gcG5hbWUpOworYm9vbCBJc1ZhbGlkRnJhbWVidWZmZXJUYXJnZXQoR0xlbnVtIHRhcmdldCk7Citib29sIElzVmFsaWRGcm9udEZhY2VNb2RlKEdMZW51bSBtb2RlKTsKK2Jvb2wgSXNWYWxpZE1hdHJpeEluZGV4UG9pbnRlclNpemUoR0xpbnQgc2l6ZSk7Citib29sIElzVmFsaWRNYXRyaXhJbmRleFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKK2Jvb2wgSXNWYWxpZE1pcG1hcEhpbnRNb2RlKEdMZW51bSBtb2RlKTsKK2Jvb2wgSXNWYWxpZE5vcm1hbFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKK2Jvb2wgSXNWYWxpZFBpeGVsRm9ybWF0KEdMZW51bSBmb3JtYXQpOworYm9vbCBJc1ZhbGlkUGl4ZWxGb3JtYXRBbmRUeXBlKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKTsKK2Jvb2wgSXNWYWxpZFBpeGVsU3RvcmVBbGlnbm1lbnQoR0xpbnQgdmFsdWUpOworYm9vbCBJc1ZhbGlkUGl4ZWxTdG9yZU5hbWUoR0xlbnVtIG5hbWUpOworYm9vbCBJc1ZhbGlkUGl4ZWxUeXBlKEdMZW51bSB0eXBlKTsKK2Jvb2wgSXNWYWxpZFBvaW50UG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpOworYm9vbCBJc1ZhbGlkUHJlY2lzaW9uVHlwZShHTGVudW0gdHlwZSk7Citib29sIElzVmFsaWRSZW5kZXJidWZmZXJGb3JtYXQoR0xlbnVtIGZvcm1hdCk7Citib29sIElzVmFsaWRSZW5kZXJidWZmZXJQYXJhbXMoR0xlbnVtIHBuYW1lKTsKK2Jvb2wgSXNWYWxpZFJlbmRlcmJ1ZmZlclRhcmdldChHTGVudW0gdGFyZ2V0KTsKK2Jvb2wgSXNWYWxpZFNoYWRlclR5cGUoR0xlbnVtIHR5cGUpOworYm9vbCBJc1ZhbGlkU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMpOworYm9vbCBJc1ZhbGlkVGV4Q29vcmRQb2ludGVyU2l6ZShHTGludCBzaXplKTsKK2Jvb2wgSXNWYWxpZFRleENvb3JkUG9pbnRlclR5cGUoR0xlbnVtIHR5cGUpOworYm9vbCBJc1ZhbGlkVGV4RW52KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSk7Citib29sIElzVmFsaWRUZXhFbnZDb21iaW5lQWxwaGEoR0xlbnVtIHBhcmFtKTsKK2Jvb2wgSXNWYWxpZFRleEVudkNvbWJpbmVSZ2IoR0xlbnVtIHBhcmFtKTsKK2Jvb2wgSXNWYWxpZFRleEVudk1vZGUoR0xlbnVtIHBhcmFtKTsKK2Jvb2wgSXNWYWxpZFRleEVudk9wZXJhbmRBbHBoYShHTGVudW0gcGFyYW0pOworYm9vbCBJc1ZhbGlkVGV4RW52T3BlcmFuZFJnYihHTGVudW0gcGFyYW0pOworYm9vbCBJc1ZhbGlkVGV4RW52U2NhbGUoR0xmbG9hdCBzY2FsZSk7Citib29sIElzVmFsaWRUZXhFbnZTb3VyY2UoR0xlbnVtIHBhcmFtKTsKK2Jvb2wgSXNWYWxpZFRleEdlbkNvb3JkKEdMZW51bSBjb29yZCk7Citib29sIElzVmFsaWRUZXhHZW5Nb2RlKEdMZW51bSBtb2RlKTsKK2Jvb2wgSXNWYWxpZFRleHR1cmVEaW1lbnNpb25zKEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbWF4X3RleHR1cmVfc2l6ZSk7Citib29sIElzVmFsaWRUZXh0dXJlRW51bShHTGVudW0gdW5pdCwgR0x1aW50IG1heF9udW1fdGV4dHVyZSk7Citib29sIElzVmFsaWRUZXh0dXJlUGFyYW0oR0xlbnVtIHBuYW1lKTsKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXQoR0xlbnVtIHRhcmdldCk7Citib29sIElzVmFsaWRUZXh0dXJlVGFyZ2V0QW5kUGFyYW0oR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lKTsKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXRFeChHTGVudW0gdGFyZ2V0KTsKK2Jvb2wgSXNWYWxpZFRleHR1cmVUYXJnZXRMaW1pdGVkKEdMZW51bSB0YXJnZXQpOworYm9vbCBJc1ZhbGlkVmVydGV4QXR0cmliU2l6ZShHTGludCBzaXplKTsKK2Jvb2wgSXNWYWxpZFZlcnRleEF0dHJpYlR5cGUoR0xlbnVtIHR5cGUpOworYm9vbCBJc1ZhbGlkVmVydGV4UG9pbnRlclNpemUoR0xpbnQgc2l6ZSk7Citib29sIElzVmFsaWRWZXJ0ZXhQb2ludGVyVHlwZShHTGVudW0gdHlwZSk7Citib29sIElzVmFsaWRXZWlnaHRQb2ludGVyU2l6ZShHTGludCBzaXplKTsKK2Jvb2wgSXNWYWxpZFdlaWdodFBvaW50ZXJUeXBlKEdMZW51bSB0eXBlKTsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0dMRVNfVkFMSURBVEVfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2xhenlfY2FjaGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL2xhenlfY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzgzZjRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbGF6eV9jYWNoZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX0xBWllfQ0FDSEVfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19MQVpZX0NBQ0hFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gQSBzaW1wbGUgbGF6eSBjYWNoZSBjbGFzcyB0aGF0IHRyYWNrcyB3aGV0aGVyIHRoZSBjYWNoZSBoYXMgYmVlbiBpbml0aWFsaXplZAorLy8geWV0IG9yIG5vdC4gSWYgdGhlIGNhY2hlZCB2YWx1ZSBpcyByZXF1ZXN0ZWQgYW5kIGl0IGhhcyBub3QgeWV0IGJlZW4KKy8vIGluaXRpYWxpemVkLCB0aGVuIEYoVCYpIGlzIHVzZWQgdG8gZG8gc28uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdm9pZCAoKkYpKFQmKT4KK2NsYXNzIExhenlDYWNoZSB7CisgcHVibGljOgorICBMYXp5Q2FjaGUoKSA6IHZhbGlkXyhmYWxzZSkge30KKworICBUJiBNdXRhdGUoKSB7CisgICAgdmFsaWRfID0gdHJ1ZTsKKyAgICByZXR1cm4gZGF0YV87CisgIH0KKworICBjb25zdCBUJiBHZXQoKSBjb25zdCB7CisgICAgaWYgKCF2YWxpZF8pIHsKKyAgICAgIC8vIFplcm8gb3V0IHRoZSBkYXRhIGJlY2F1c2UgQ2hyb21lIHZhbGlkYXRlcyB0aGlzIGluIHNvbWUgY29uZmlndXJhdGlvbnMuCisgICAgICBtZW1zZXQoJmRhdGFfLCAwLCBzaXplb2YoVCkpOworICAgICAgRihkYXRhXyk7CisgICAgICB2YWxpZF8gPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZGF0YV87CisgIH0KKworIHByaXZhdGU6CisgIG11dGFibGUgYm9vbCB2YWxpZF87CisgIG11dGFibGUgVCBkYXRhXzsKK307CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19MQVpZX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tYWNyb3MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL21hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDI4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tYWNyb3MuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19NQUNST1NfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19NQUNST1NfSF8KKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJjb21tb24vYWxvZy5oIgorI2luY2x1ZGUgImdsZXMvcGFzc190aHJvdWdoLmgiCisKK2NsYXNzIEdsZXNDb250ZXh0OworR2xlc0NvbnRleHQqIEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIEVYUE9SVF9ERUNMIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZWxzZQorI2RlZmluZSBFWFBPUlRfREVDTCBleHRlcm4gIkMiIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZW5kaWYKKworI2RlZmluZSBHTEVTX0FQSUVOVFJZKF9yZXR1cm4sIF9uYW1lLCAuLi4pIFwKKyAgICBFWFBPUlRfREVDTCBfcmV0dXJuIGdsIyNfbmFtZShfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVFVCX0FQSUVOVFJZKF9yZXR1cm4sIF9uYW1lLCAuLi4pIFwKK0VYUE9SVF9ERUNMIF9yZXR1cm4gZ2wjI19uYW1lKF9fVkFfQVJHU19fKSB7IFwKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmltcGxlbWVudGVkOiAlcyIsIF9fRlVOQ1RJT05fXyk7IFwKKyAgfQorCisjZGVmaW5lIFRSQU5TTEFUT1JfQVBJRU5UUlkoX3JldHVybiwgX25hbWUsIC4uLikgXAorICAgIEVYUE9SVF9ERUNMIF9yZXR1cm4gX25hbWUoX19WQV9BUkdTX18pCisKKyNkZWZpbmUgR0xFU19FUlJPUihfZXJyLCBfbXNnLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVycm9yKCJnbGVzMTIgRVJST1I6IGZ1bmM9JXMgZXJyPTB4JXggbXNnPSIsIF9fRlVOQ1RJT05fXywgX2Vycik7IGRlcnJvcihfbXNnLCAjI19fVkFfQVJHU19fKTsgXAorICAgIEdsZXNDb250ZXh0KiBfY29udGV4dCA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUxPR19BU1NFUlQoX2NvbnRleHQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfY29udGV4dC0+U2V0R0xlcnJvcihfZXJyLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfbXNnLCAjI19fVkFfQVJHU19fKTsgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdMRVNfRVJST1JfSU5WQUxJRF9FTlVNKF9hcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0xFU19FUlJPUihHTF9JTlZBTElEX0VOVU0sICJJbnZhbGlkIGVudW0gZm9yICVzOiAlcyAoMHgleCkiLCAjX2FyZywgXAorICAgICAgICAgICAgIEdldEVudW1TdHJpbmcoX2FyZyksIF9hcmcpCisKKyNkZWZpbmUgX0dMRVNfRVJST1JfSU5WQUxJRF9WQUxVRShfYXJnLCBfZm10KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0xFU19FUlJPUihHTF9JTlZBTElEX1ZBTFVFLCAiSW52YWxpZCB2YWx1ZSBmb3IgJXM6ICIgX2ZtdCwgI19hcmcsIF9hcmcpCisKKyNkZWZpbmUgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0ZMT0FUKF9hcmcpIFwKKyAgX0dMRVNfRVJST1JfSU5WQUxJRF9WQUxVRShfYXJnLCAiJWYiKQorCisjZGVmaW5lIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoX2FyZykgXAorICBfR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFKF9hcmcsICIlZCIpCisKKyNkZWZpbmUgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX1VJTlQoX2FyZykgXAorICBfR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFKF9hcmcsICIldSIpCisKKyNkZWZpbmUgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX1BUUihfYXJnKSBcCisgIF9HTEVTX0VSUk9SX0lOVkFMSURfVkFMVUUoX2FyZywgIjB4JXAiKQorCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tYXRyaXguY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDI5MjcxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbWF0cml4LmNwcApAQCAtMCwwICsxLDI3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAibWF0cml4LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNvbW1vbi9hbG9nLmgiCisjaW5jbHVkZSAidmVjdG9yLmgiCisKK25hbWVzcGFjZSBlbXVnbCB7CisKK01hdHJpeDo6TWF0cml4KGZsb2F0IHJvdzBjb2wwLCBmbG9hdCByb3cwY29sMSwgZmxvYXQgcm93MGNvbDIsIGZsb2F0IHJvdzBjb2wzLAorICAgICAgICAgICAgICAgZmxvYXQgcm93MWNvbDAsIGZsb2F0IHJvdzFjb2wxLCBmbG9hdCByb3cxY29sMiwgZmxvYXQgcm93MWNvbDMsCisgICAgICAgICAgICAgICBmbG9hdCByb3cyY29sMCwgZmxvYXQgcm93MmNvbDEsIGZsb2F0IHJvdzJjb2wyLCBmbG9hdCByb3cyY29sMywKKyAgICAgICAgICAgICAgIGZsb2F0IHJvdzNjb2wwLCBmbG9hdCByb3czY29sMSwgZmxvYXQgcm93M2NvbDIsIGZsb2F0IHJvdzNjb2wzKSB7CisgIGVudHJpZXNfWzBdWzBdID0gcm93MGNvbDA7CisgIGVudHJpZXNfWzFdWzBdID0gcm93MGNvbDE7CisgIGVudHJpZXNfWzJdWzBdID0gcm93MGNvbDI7CisgIGVudHJpZXNfWzNdWzBdID0gcm93MGNvbDM7CisgIGVudHJpZXNfWzBdWzFdID0gcm93MWNvbDA7CisgIGVudHJpZXNfWzFdWzFdID0gcm93MWNvbDE7CisgIGVudHJpZXNfWzJdWzFdID0gcm93MWNvbDI7CisgIGVudHJpZXNfWzNdWzFdID0gcm93MWNvbDM7CisgIGVudHJpZXNfWzBdWzJdID0gcm93MmNvbDA7CisgIGVudHJpZXNfWzFdWzJdID0gcm93MmNvbDE7CisgIGVudHJpZXNfWzJdWzJdID0gcm93MmNvbDI7CisgIGVudHJpZXNfWzNdWzJdID0gcm93MmNvbDM7CisgIGVudHJpZXNfWzBdWzNdID0gcm93M2NvbDA7CisgIGVudHJpZXNfWzFdWzNdID0gcm93M2NvbDE7CisgIGVudHJpZXNfWzJdWzNdID0gcm93M2NvbDI7CisgIGVudHJpZXNfWzNdWzNdID0gcm93M2NvbDM7Cit9CisKK3ZvaWQgTWF0cml4OjpBc3NpZ25JZGVudGl0eSgpIHsKKyAgZW50cmllc19bMF1bMF0gPSAxOworICBlbnRyaWVzX1swXVsxXSA9IDA7CisgIGVudHJpZXNfWzBdWzJdID0gMDsKKyAgZW50cmllc19bMF1bM10gPSAwOworICBlbnRyaWVzX1sxXVswXSA9IDA7CisgIGVudHJpZXNfWzFdWzFdID0gMTsKKyAgZW50cmllc19bMV1bMl0gPSAwOworICBlbnRyaWVzX1sxXVszXSA9IDA7CisgIGVudHJpZXNfWzJdWzBdID0gMDsKKyAgZW50cmllc19bMl1bMV0gPSAwOworICBlbnRyaWVzX1syXVsyXSA9IDE7CisgIGVudHJpZXNfWzJdWzNdID0gMDsKKyAgZW50cmllc19bM11bMF0gPSAwOworICBlbnRyaWVzX1szXVsxXSA9IDA7CisgIGVudHJpZXNfWzNdWzJdID0gMDsKKyAgZW50cmllc19bM11bM10gPSAxOworfQorCit2b2lkIE1hdHJpeDo6VHJhbnNwb3NlKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGtOOyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBrTjsgKytqKSB7CisgICAgICBjb25zdCBmbG9hdCB0ZW1wID0gR2V0KGksIGopOworICAgICAgU2V0KGksIGosIEdldChqLCBpKSk7CisgICAgICBTZXQoaiwgaSwgdGVtcCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgTWF0cml4OjpSZXNjYWxlTm9ybWFsKCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIFZlY3RvciB2KEdldChpLCAwKSwgR2V0KGksIDEpLCBHZXQoaSwgMiksIDAuZik7CisgICAgdi5Ob3JtYWxpemUoKTsKKyAgICBTZXQoaSwgMCwgdi5HZXQoMCkpOworICAgIFNldChpLCAxLCB2LkdldCgxKSk7CisgICAgU2V0KGksIDIsIHYuR2V0KDIpKTsKKyAgfQorfQorCit2b2lkIE1hdHJpeDo6SW52ZXJzZSgpIHsKKyAgY29uc3QgZmxvYXQgYTAwID0gZW50cmllc19bMF1bMF07CisgIGNvbnN0IGZsb2F0IGEwMSA9IGVudHJpZXNfWzBdWzFdOworICBjb25zdCBmbG9hdCBhMDIgPSBlbnRyaWVzX1swXVsyXTsKKyAgY29uc3QgZmxvYXQgYTAzID0gZW50cmllc19bMF1bM107CisgIGNvbnN0IGZsb2F0IGExMCA9IGVudHJpZXNfWzFdWzBdOworICBjb25zdCBmbG9hdCBhMTEgPSBlbnRyaWVzX1sxXVsxXTsKKyAgY29uc3QgZmxvYXQgYTEyID0gZW50cmllc19bMV1bMl07CisgIGNvbnN0IGZsb2F0IGExMyA9IGVudHJpZXNfWzFdWzNdOworICBjb25zdCBmbG9hdCBhMjAgPSBlbnRyaWVzX1syXVswXTsKKyAgY29uc3QgZmxvYXQgYTIxID0gZW50cmllc19bMl1bMV07CisgIGNvbnN0IGZsb2F0IGEyMiA9IGVudHJpZXNfWzJdWzJdOworICBjb25zdCBmbG9hdCBhMjMgPSBlbnRyaWVzX1syXVszXTsKKyAgY29uc3QgZmxvYXQgYTMwID0gZW50cmllc19bM11bMF07CisgIGNvbnN0IGZsb2F0IGEzMSA9IGVudHJpZXNfWzNdWzFdOworICBjb25zdCBmbG9hdCBhMzIgPSBlbnRyaWVzX1szXVsyXTsKKyAgY29uc3QgZmxvYXQgYTMzID0gZW50cmllc19bM11bM107CisKKyAgZmxvYXQgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwOworICBmbG9hdCBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTA7CisgIGZsb2F0IGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMDsKKyAgZmxvYXQgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExOworICBmbG9hdCBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTE7CisgIGZsb2F0IGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMjsKKyAgZmxvYXQgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwOworICBmbG9hdCBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzA7CisgIGZsb2F0IGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMDsKKyAgZmxvYXQgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxOworICBmbG9hdCBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzE7CisgIGZsb2F0IGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMjsKKworICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50CisgIGNvbnN0IGZsb2F0IGRldCA9CisgICAgYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2OworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRldCA9PSAwKTsKKworICBjb25zdCBmbG9hdCBpbnZkZXQgPSAxLjAgLyBkZXQ7CisgIGIwMCAqPSBpbnZkZXQ7CisgIGIwMSAqPSBpbnZkZXQ7CisgIGIwMiAqPSBpbnZkZXQ7CisgIGIwMyAqPSBpbnZkZXQ7CisgIGIwNCAqPSBpbnZkZXQ7CisgIGIwNSAqPSBpbnZkZXQ7CisgIGIwNiAqPSBpbnZkZXQ7CisgIGIwNyAqPSBpbnZkZXQ7CisgIGIwOCAqPSBpbnZkZXQ7CisgIGIwOSAqPSBpbnZkZXQ7CisgIGIxMCAqPSBpbnZkZXQ7CisgIGIxMSAqPSBpbnZkZXQ7CisKKyAgZW50cmllc19bMF1bMF0gPSBhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDk7CisgIGVudHJpZXNfWzBdWzFdID0gYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5OworICBlbnRyaWVzX1swXVsyXSA9IGEzMSAqIGIwNSAtIGEzMiAqIGIwNCArIGEzMyAqIGIwMzsKKyAgZW50cmllc19bMF1bM10gPSBhMjIgKiBiMDQgLSBhMjEgKiBiMDUgLSBhMjMgKiBiMDM7CisgIGVudHJpZXNfWzFdWzBdID0gYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3OworICBlbnRyaWVzX1sxXVsxXSA9IGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNzsKKyAgZW50cmllc19bMV1bMl0gPSBhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDE7CisgIGVudHJpZXNfWzFdWzNdID0gYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxOworICBlbnRyaWVzX1syXVswXSA9IGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNjsKKyAgZW50cmllc19bMl1bMV0gPSBhMDEgKiBiMDggLSBhMDAgKiBiMTAgLSBhMDMgKiBiMDY7CisgIGVudHJpZXNfWzJdWzJdID0gYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwOworICBlbnRyaWVzX1syXVszXSA9IGEyMSAqIGIwMiAtIGEyMCAqIGIwNCAtIGEyMyAqIGIwMDsKKyAgZW50cmllc19bM11bMF0gPSBhMTEgKiBiMDcgLSBhMTAgKiBiMDkgLSBhMTIgKiBiMDY7CisgIGVudHJpZXNfWzNdWzFdID0gYTAwICogYjA5IC0gYTAxICogYjA3ICsgYTAyICogYjA2OworICBlbnRyaWVzX1szXVsyXSA9IGEzMSAqIGIwMSAtIGEzMCAqIGIwMyAtIGEzMiAqIGIwMDsKKyAgZW50cmllc19bM11bM10gPSBhMjAgKiBiMDMgLSBhMjEgKiBiMDEgKyBhMjIgKiBiMDA7Cit9CisKK3ZvaWQgTWF0cml4OjpBc3NpZ25NYXRyaXhNdWx0aXBseShjb25zdCBNYXRyaXgmIGEsIGNvbnN0IE1hdHJpeCYgYikgeworICAvLyBJZiBhIG9yIGIgaXMgdGhpcyBtYXRyaXgsIHdlIGNhbm5vdCBzdG9yZSByZXN1bHQgaW4gcGxhY2UsIHNvIGhhdmUgdG8gdXNlCisgIC8vIGFuIGV4dHJhIG1hdHJpeCBvYmplY3QuCisgIGNvbnN0IGJvb2wgdXNlX3N0b3JhZ2UgPSAodGhpcyA9PSAmYSB8fCB0aGlzID09ICZiKTsKKyAgTWF0cml4IHN0b3JhZ2UoVU5JTklUSUFMSVpFRF9DT05TVFJVQ1RPUik7CisgIE1hdHJpeCogcmVzdWx0ID0gdXNlX3N0b3JhZ2UgPyAmc3RvcmFnZSA6IHRoaXM7CisKKyAgZm9yIChpbnQgYV9yb3cgPSAwOyBhX3JvdyA8IGtOOyArK2Ffcm93KSB7CisgICAgZm9yIChpbnQgYl9jb2wgPSAwOyBiX2NvbCA8IGtOOyArK2JfY29sKSB7CisgICAgICBmbG9hdCBkcCA9IDAuMGY7CisgICAgICBmb3IgKGludCBrID0gMDsgayA8IGtOOyArK2spIHsKKyAgICAgICAgZHAgKz0gYS5HZXQoYV9yb3csIGspICogYi5HZXQoaywgYl9jb2wpOworICAgICAgfQorICAgICAgcmVzdWx0LT5TZXQoYV9yb3csIGJfY29sLCBkcCk7CisgICAgfQorICB9CisKKyAgaWYgKHVzZV9zdG9yYWdlKSB7CisgICAgKnRoaXMgPSBzdG9yYWdlOworICB9Cit9CisKK2Zsb2F0KiBNYXRyaXg6OkdldENvbHVtbk1ham9yQXJyYXkoZmxvYXQqIGVudHJpZXMsIHNpemVfdCBjb3VudCkgY29uc3QgeworICAvLyBJdCdzIHNhZmUgdG8gbWVtY3B5IGJlY2F1c2UgZW50cmllcyBhcmUgc3RvcmVkIGluIGNvbHVtbi1tYWpvciBvcmRlci4KKyAgbWVtY3B5KGVudHJpZXMsIGVudHJpZXNfLCBjb3VudCAqIHNpemVvZihlbnRyaWVzWzBdKSk7CisgIHJldHVybiBlbnRyaWVzOworfQorCit2b2lkIE1hdHJpeDo6U2V0Q29sdW1uTWFqb3JBcnJheShjb25zdCBmbG9hdCAqZW50cmllcykgeworICBtZW1jcHkoZW50cmllc18sIGVudHJpZXMsIHNpemVvZihlbnRyaWVzWzBdKSAqIGtFbnRyaWVzKTsKK30KKworTWF0cml4IE1hdHJpeDo6R2VuZXJhdGVQZXJzcGVjdGl2ZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpfbmVhciwgZmxvYXQgel9mYXIpIHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihsZWZ0ID09IHJpZ2h0KTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRih0b3AgPT0gYm90dG9tKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRih6X25lYXIgPT0gel9mYXIpOworCisgIC8vIFNlZSBodHRwOi8vd3d3LnNvbmdoby5jYS9vcGVuZ2wvZ2xfcHJvamVjdGlvbm1hdHJpeC5odG1sLgorICByZXR1cm4gTWF0cml4KCgyLjBmICogel9uZWFyKSAvIChyaWdodCAtIGxlZnQpLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgKHJpZ2h0ICsgbGVmdCkgLyAocmlnaHQgLSBsZWZ0KSwKKyAgICAgICAgICAgICAgICAwLjBmLAorCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAoMi4wZiAqIHpfbmVhcikgLyAodG9wIC0gYm90dG9tKSwKKyAgICAgICAgICAgICAgICAodG9wICsgYm90dG9tKSAvICh0b3AgLSBib3R0b20pLAorICAgICAgICAgICAgICAgIDAuMGYsCisKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgLSh6X2ZhciArIHpfbmVhcikgLyAoel9mYXIgLSB6X25lYXIpLAorICAgICAgICAgICAgICAgICgtMi4wZiAqIHpfZmFyICogel9uZWFyKSAvICh6X2ZhciAtIHpfbmVhciksCisKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgLTEuMGYsCisgICAgICAgICAgICAgICAgMC4wZik7Cit9CisKK01hdHJpeCBNYXRyaXg6OkdlbmVyYXRlT3J0aG9ncmFwaGljKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB6X25lYXIsIGZsb2F0IHpfZmFyKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYobGVmdCA9PSByaWdodCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYodG9wID09IGJvdHRvbSk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoel9uZWFyID09IHpfZmFyKTsKKworICAvLyBTZWUgaHR0cDovL3d3dy5zb25naG8uY2Evb3BlbmdsL2dsX3Byb2plY3Rpb25tYXRyaXguaHRtbC4KKyAgcmV0dXJuIE1hdHJpeCgyLjBmIC8gKHJpZ2h0IC0gbGVmdCksCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIC0ocmlnaHQgKyBsZWZ0KSAvIChyaWdodCAtIGxlZnQpLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgMi4wZiAvICh0b3AgLSBib3R0b20pLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgLSh0b3AgKyBib3R0b20pIC8gKHRvcCAtIGJvdHRvbSksCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIC0yLjBmIC8gKHpfZmFyIC0gel9uZWFyKSwKKyAgICAgICAgICAgICAgICAtKHpfZmFyICsgel9uZWFyKSAvICh6X2ZhciAtIHpfbmVhciksCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZik7Cit9CisKK01hdHJpeCBNYXRyaXg6OkdlbmVyYXRlU2NhbGUoY29uc3QgVmVjdG9yJiB2KSB7CisgIE1hdHJpeCByZXN1bHQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga047ICsraSkgeworICAgIHJlc3VsdC5TZXQoaSwgaSwgdi5HZXQoaSkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK01hdHJpeCBNYXRyaXg6OkdlbmVyYXRlVHJhbnNsYXRpb24oY29uc3QgVmVjdG9yJiB2KSB7CisgIE1hdHJpeCByZXN1bHQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga047ICsraSkgeworICAgIHJlc3VsdC5TZXQoaSwgMywgdi5HZXQoaSkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK01hdHJpeCBNYXRyaXg6OkdlbmVyYXRlUm90YXRpb25CeURlZ3JlZXMoZmxvYXQgZGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yJiB2KSB7CisgIFZlY3RvciB3ID0gdjsKKyAgdy5Ob3JtYWxpemUoKTsKKyAgLy8gU2VlIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vUm9kcmlndWVzUm90YXRpb25Gb3JtdWxhLmh0bWwgb3IKKyAgLy8gaHR0cDovL3d3dy5tYW5wYWdlei5jb20vbWFuLzMvZ2xSb3RhdGVmLyBmb3IgZm9ybXVsYXMuCisgIGNvbnN0IGZsb2F0IHRoZXRhID0gZGVncmVlcyAqIGtSYWRpYW5zUGVyRGVncmVlOworICBjb25zdCBmbG9hdCBzaW5fdCA9IHNpbih0aGV0YSk7CisgIGNvbnN0IGZsb2F0IGNvc190ID0gY29zKHRoZXRhKTsKKyAgY29uc3QgZmxvYXQgeF9jb3NfdCA9IDEuMGYgLSBjb3NfdDsKKyAgY29uc3QgZmxvYXQgd3ggPSB3LkdldCgwKTsKKyAgY29uc3QgZmxvYXQgd3kgPSB3LkdldCgxKTsKKyAgY29uc3QgZmxvYXQgd3ogPSB3LkdldCgyKTsKKworICByZXR1cm4gTWF0cml4KGNvc190ICsgd3ggKiB3eCAqIHhfY29zX3QsCisgICAgICAgICAgICAgICAgd3ggKiB3eSAqIHhfY29zX3QgLSB3eiAqIHNpbl90LAorICAgICAgICAgICAgICAgIHd5ICogc2luX3QgKyB3eCAqIHd6ICogeF9jb3NfdCwKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIHd6ICogc2luX3QgKyB3eCAqIHd5ICogeF9jb3NfdCwKKyAgICAgICAgICAgICAgICBjb3NfdCArIHd5ICogd3kgKiB4X2Nvc190LAorICAgICAgICAgICAgICAgIC13eCAqIHNpbl90ICsgd3kgKiB3eiAqIHhfY29zX3QsCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAtd3kgKiBzaW5fdCArIHd4ICogd3ogKiB4X2Nvc190LAorICAgICAgICAgICAgICAgIHd4ICogc2luX3QgKyB3eSAqIHd6ICogeF9jb3NfdCwKKyAgICAgICAgICAgICAgICBjb3NfdCArIHd6ICogd3ogKiB4X2Nvc190LAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAwLjBmLAorICAgICAgICAgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbWF0cml4LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ0NzAyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbWF0cml4LmgKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBHTEVTX01BVFJJWF9IXworI2RlZmluZSBHTEVTX01BVFJJWF9IXworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX1dJTjMyIC8vIE1fUEkgbm90IGRlZmluZWQgaW4gTVMgV2luZG93cworI2RlZmluZSBNX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCituYW1lc3BhY2UgZW11Z2wgeworCitjbGFzcyBWZWN0b3I7CisKK3N0YXRpYyBjb25zdCBmbG9hdCBrUGkgPSBNX1BJOworc3RhdGljIGNvbnN0IGZsb2F0IGtSYWRpYW5zUGVyRGVncmVlID0ga1BpIC8gMTgwLjBmOworCisvLyA0eDQgZmxvYXRpbmcgcG9pbnQgbWF0cml4LgorY2xhc3MgTWF0cml4IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQga04gPSA0OyAgLy8gTiBhcyBpbiBOeE4gbWF0cml4LgorICBzdGF0aWMgY29uc3QgaW50IGtFbnRyaWVzID0ga04gKiBrTjsKKworICBNYXRyaXgoKSB7CisgICAgQXNzaWduSWRlbnRpdHkoKTsKKyAgfQorCisgIGV4cGxpY2l0IE1hdHJpeChjb25zdCBmbG9hdCogZW50cmllcykgeworICAgIFNldENvbHVtbk1ham9yQXJyYXkoZW50cmllcyk7CisgIH0KKworICBNYXRyaXgoZmxvYXQgcm93MGNvbDAsIGZsb2F0IHJvdzBjb2wxLCBmbG9hdCByb3cwY29sMiwgZmxvYXQgcm93MGNvbDMsCisgICAgICAgICBmbG9hdCByb3cxY29sMCwgZmxvYXQgcm93MWNvbDEsIGZsb2F0IHJvdzFjb2wyLCBmbG9hdCByb3cxY29sMywKKyAgICAgICAgIGZsb2F0IHJvdzJjb2wwLCBmbG9hdCByb3cyY29sMSwgZmxvYXQgcm93MmNvbDIsIGZsb2F0IHJvdzJjb2wzLAorICAgICAgICAgZmxvYXQgcm93M2NvbDAsIGZsb2F0IHJvdzNjb2wxLCBmbG9hdCByb3czY29sMiwgZmxvYXQgdG93M2NvbDMpOworCisgIHZvaWQgU2V0KGludCByb3csIGludCBjb2wsIGZsb2F0IHZhbHVlKSB7CisgICAgLy8gVGhlIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBjb2x1bW4tbWFqb3Igb3JkZXIuCisgICAgZW50cmllc19bY29sXVtyb3ddID0gdmFsdWU7CisgIH0KKworICBmbG9hdCBHZXQoaW50IHJvdywgaW50IGNvbCkgY29uc3QgeworICAgIC8vIFRoZSBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gY29sdW1uLW1ham9yIG9yZGVyLgorICAgIHJldHVybiBlbnRyaWVzX1tjb2xdW3Jvd107CisgIH0KKworICB2b2lkIEludmVyc2UoKTsKKworICB2b2lkIFRyYW5zcG9zZSgpOworCisgIC8vIE5vcm1hbGl6ZXMgdGhlIHgtLCB5LSwgYW5kIHotc2NhbGUgdmVjdG9yIGNvbXBvbmVudHMgb2YgdGhlIG1hdHJpeC4KKyAgdm9pZCBSZXNjYWxlTm9ybWFsKCk7CisKKyAgdm9pZCBBc3NpZ25JZGVudGl0eSgpOworCisgIHZvaWQgQXNzaWduTWF0cml4TXVsdGlwbHkoY29uc3QgTWF0cml4JiBhLCBjb25zdCBNYXRyaXgmIGIpOworCisgIGNvbnN0IE1hdHJpeCYgb3BlcmF0b3IgKj0oY29uc3QgTWF0cml4JiBiKSB7CisgICAgQXNzaWduTWF0cml4TXVsdGlwbHkoKnRoaXMsIGIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGZsb2F0KiBHZXRDb2x1bW5NYWpvckFycmF5KGZsb2F0ICgmZW50cmllcylba0VudHJpZXNdKSBjb25zdCB7CisgICAgcmV0dXJuIEdldENvbHVtbk1ham9yQXJyYXkoZW50cmllcywga0VudHJpZXMpOworICB9CisKKyAgZmxvYXQqIEdldENvbHVtbk1ham9yQXJyYXkoZmxvYXQqIGVudHJpZXMsIHNpemVfdCBjb3VudCkgY29uc3Q7CisKKyAgdm9pZCBTZXRDb2x1bW5NYWpvckFycmF5KGNvbnN0IGZsb2F0ICplbnRyaWVzKTsKKworICBzdGF0aWMgTWF0cml4IEdlbmVyYXRlU2NhbGUoY29uc3QgVmVjdG9yJiB2KTsKKworICBzdGF0aWMgTWF0cml4IEdlbmVyYXRlVHJhbnNsYXRpb24oY29uc3QgVmVjdG9yJiB2KTsKKworICBzdGF0aWMgTWF0cml4IEdlbmVyYXRlUm90YXRpb25CeURlZ3JlZXMoZmxvYXQgZGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvciYgdik7CisKKyAgc3RhdGljIE1hdHJpeCBHZW5lcmF0ZVBlcnNwZWN0aXZlKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLCBmbG9hdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB6X25lYXIsIGZsb2F0IHpfZmFyKTsKKworICBzdGF0aWMgTWF0cml4IEdlbmVyYXRlT3J0aG9ncmFwaGljKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwgZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpfbmVhciwgZmxvYXQgel9mYXIpOworCisgcHJpdmF0ZToKKyAgZW51bSBVbmluaXRpYWxpemVkQ29uc3RydWN0b3IgeworICAgIFVOSU5JVElBTElaRURfQ09OU1RSVUNUT1IKKyAgfTsKKworICBleHBsaWNpdCBNYXRyaXgoVW5pbml0aWFsaXplZENvbnN0cnVjdG9yKSB7CisgIH0KKworICBmbG9hdCBlbnRyaWVzX1trTl1ba05dOworfTsKKworaW5saW5lIE1hdHJpeCBvcGVyYXRvciogKE1hdHJpeCBhLCBjb25zdCBNYXRyaXgmIGIpIHsKKyAgYSAqPSBiOworICByZXR1cm4gYTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCisKKyNlbmRpZiAgLy8gR0xFU19NQVRSSVhfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL21hdHJpeF9zdGFjay5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvbWF0cml4X3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4MzdmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL21hdHJpeF9zdGFjay5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX01BVFJJWF9TVEFDS19IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX01BVFJJWF9TVEFDS19IXworCisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSAibWF0cml4LmgiCisKKy8vIE5ldmVyLWVtcHR5IHN0YWNrIG9mIG1hdHJpY2VzLiAgSW5pdGlhbGx5IGhhcyBhbiBpZGVudGl0eSBtYXRyaXggaW4gaXQKKy8vIGFuZCBvbmUgZW50cnkgd2lsbCBhbHdheXMgcmVtYWluLiAgSXRzIG1heCBkZXB0aCBpcyBrTWF4RGVwdGguCitjbGFzcyBNYXRyaXhTdGFjayB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhEZXB0aCA9IDMyOworICBNYXRyaXhTdGFjaygpIHsKKyAgICBzdGFja18ucHVzaChlbXVnbDo6TWF0cml4KCkpOworICB9CisKKyAgYm9vbCBQdXNoKCkgeworICAgIGlmIChzdGFja18uc2l6ZSgpID49IGtNYXhEZXB0aCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGFja18ucHVzaChzdGFja18udG9wKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBQb3AoKSB7CisgICAgaWYgKHN0YWNrXy5zaXplKCkgPD0gMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGFja18ucG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBlbXVnbDo6TWF0cml4JiBHZXRUb3AoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YWNrXy50b3AoKTsKKyAgfQorCisgIGVtdWdsOjpNYXRyaXgmIEdldFRvcCgpIHsKKyAgICByZXR1cm4gc3RhY2tfLnRvcCgpOworICB9CisKKyAgaW50IEdldERlcHRoKCkgY29uc3QgeworICAgIHJldHVybiBzdGFja18uc2l6ZSgpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnN0YWNrPGVtdWdsOjpNYXRyaXg+IHN0YWNrXzsKKworICBNYXRyaXhTdGFjayhjb25zdCBNYXRyaXhTdGFjayYpOworICBNYXRyaXhTdGFjayYgb3BlcmF0b3I9KGNvbnN0IE1hdHJpeFN0YWNrJik7Cit9OworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfTUFUUklYX1NUQUNLX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tcnVfY2FjaGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL21ydV9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTc4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9tcnVfY2FjaGUuaApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19NUlVfQ0FDSEVfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19NUlVfQ0FDSEVfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworLy8gQSBjb250YWluZXIgb2YgYSBsaW1pdGVkIG51bWJlciBvZiBvYmplY3RzIHRoYXQgYXJlIG1hbmFnZWQgaW4gYSBtb3N0CisvLyByZWNlbnRseSB1c2VkIG1hbm5lciBhbmQgY2FuIGJlIGxvb2tlZCB1cCBieSBhIEtleS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFZhbHVlPgorY2xhc3MgTXJ1Q2FjaGUgeworIHB1YmxpYzoKKyAgLy8gVHlwZWRlZiBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xlYW4gdXAgb2JqZWN0cyBpZi93aGVuCisgIC8vIHRoZXkgZ2V0IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuCisgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lGbikoVmFsdWUqIHYpOworCisgIHR5cGVkZWYgc3RkOjpsaXN0PHN0ZDo6cGFpcjxLZXksIFZhbHVlPiA+IENhY2hlOworCisgIGV4cGxpY2l0IE1ydUNhY2hlKHNpemVfdCBsaW1pdCkgOiBjYWNoZV8oKSwgZGVzdHJveV8oTlVMTCksIGxpbWl0XyhsaW1pdCkge30KKworICBNcnVDYWNoZShzaXplX3QgbGltaXQsIERlc3Ryb3lGbiBkZXN0cm95KQorICAgICAgOiBjYWNoZV8oKSwgZGVzdHJveV8oZGVzdHJveSksIGxpbWl0XyhsaW1pdCkge30KKworICB+TXJ1Q2FjaGUoKSB7CisgICAgaWYgKGRlc3Ryb3lfKSB7CisgICAgICB3aGlsZSAoY2FjaGVfLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGRlc3Ryb3lfKCZjYWNoZV8uYmFjaygpLnNlY29uZCk7CisgICAgICAgIGNhY2hlXy5wb3BfYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFZhbHVlKiBHZXRNb3N0UmVjZW50bHlVc2VkKCkgeworICAgIGlmIChjYWNoZV8uc2l6ZSgpID4gMCkgeworICAgICAgcmV0dXJuICZjYWNoZV8uZnJvbnQoKS5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gR2V0cyBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCByZWZlcmVuY2VkIGJ5IHRoZSBLZXkgKG9yIE5VTEwgaWYgbm8gc3VjaAorICAvLyBvYmplY3QpLiAgV2lsbCBpbnRlcm5hbGx5IG1vdmUgdGhlIG9iamVjdCB0byB0aGUgImZyb250IiBvZiB0aGUgY2FjaGUuCisgIFZhbHVlKiBHZXQoY29uc3QgS2V5JiBrZXkpIHsKKyAgICBmb3IgKHR5cGVuYW1lIENhY2hlOjppdGVyYXRvciBpID0gY2FjaGVfLmJlZ2luKCk7IGkgIT0gY2FjaGVfLmVuZCgpOyArK2kpIHsKKyAgICAgIGlmIChpLT5maXJzdCA9PSBrZXkpIHsKKyAgICAgICAgY2FjaGVfLnNwbGljZShjYWNoZV8uYmVnaW4oKSwgY2FjaGVfLCBpKTsKKyAgICAgICAgcmV0dXJuICZpLT5zZWNvbmQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gUHVzaCBhbiBvYmplY3QgaW50byB0aGUgY2FjaGUgcmVmZXJlbmNlZCBieSB0aGUgS2V5LgorICBWYWx1ZSogUHVzaChjb25zdCBLZXkmIGtleSwgY29uc3QgVmFsdWUmIHZhbHVlKSB7CisgICAgaWYgKGNhY2hlXy5zaXplKCkgPT0gbGltaXRfKSB7CisgICAgICBpZiAoZGVzdHJveV8pIHsKKyAgICAgICAgZGVzdHJveV8oJmNhY2hlXy5iYWNrKCkuc2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGNhY2hlXy5wb3BfYmFjaygpOworICAgIH0KKyAgICBjYWNoZV8ucHVzaF9mcm9udChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlKSk7CisgICAgcmV0dXJuICZjYWNoZV8uZnJvbnQoKS5zZWNvbmQ7CisgIH0KKworIHByaXZhdGU6CisgIENhY2hlIGNhY2hlXzsKKyAgRGVzdHJveUZuIGRlc3Ryb3lfOworICBzaXplX3QgbGltaXRfOworCisgIE1ydUNhY2hlKGNvbnN0IE1ydUNhY2hlJik7CisgIE1ydUNhY2hlJiBvcGVyYXRvcj0oY29uc3QgTXJ1Q2FjaGUmKTsKK307CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19NUlVfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL29iamVjdF9kYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9vYmplY3RfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmZhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9vYmplY3RfZGF0YS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX09CSkVDVF9EQVRBX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfT0JKRUNUX0RBVEFfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworLy8gVGhlIGdsb2JhbCBuYW1lIGlzIHRoZSBuYW1lIGdlbmVyYXRlZCBieSB0aGUgdW5kZXJseWluZyBHTCBpbXBsZW1lbnRhdGlvbgorLy8gKGVnLiBQZXBwZXIgR3JhcGhpY3MsIEdMWCwgZXRjLikKK3R5cGVkZWYgdWludDMyX3QgT2JqZWN0R2xvYmFsTmFtZTsKKworLy8gVGhlIGxvY2FsIG5hbWUgaXMgdGhlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBieSB0aGUgY2xpZW50IHRvIHJlZmVyZW5jZSBHTAorLy8gb2JqZWN0cy4KK3R5cGVkZWYgdWludDMyX3QgT2JqZWN0TG9jYWxOYW1lOworCisvLyBUaGUgZGlmZmVyZW50IEdMIG9iamVjdCB0eXBlcy4KK2VudW0gT2JqZWN0VHlwZSB7CisgIEJVRkZFUiwKKyAgRlJBTUVCVUZGRVIsCisgIFJFTkRFUkJVRkZFUiwKKyAgVEVYVFVSRSwKKyAgVkVSVEVYX1NIQURFUiwKKyAgRlJBR01FTlRfU0hBREVSLAorICBQUk9HUkFNLAorICBOVU1fT0JKRUNUX1RZUEVTLAorCisgIC8vIFNoYWRlcnMgYXJlIGEgYml0IHNwZWNpYWwgaW4gdGhhdCBib3RoIHZlcnRleCBzaGFkZXJzIGFuZCBmcmFnbWVudCBzaGFkZXJzCisgIC8vIGFyZSBib3RoIGNvbnNpZGVyZWQgU2hhZGVyIG9iamVjdHMuCisgIFNIQURFUiA9IFZFUlRFWF9TSEFERVIKK307CisKKy8vIFRoZSBiYXNlIGNsYXNzIGZvciBHTCBvYmplY3Qgd3JhcHBlcnMuCitjbGFzcyBPYmplY3REYXRhIDogcHVibGljIGFuZHJvaWQ6OlJlZkJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgT2JqZWN0RGF0YShPYmplY3RUeXBlIHR5cGUpCisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIGxvY2FsX25hbWVfKDApIHsKKyAgfQorCisgIE9iamVjdERhdGEoT2JqZWN0VHlwZSB0eXBlLCBPYmplY3RMb2NhbE5hbWUgbmFtZSkKKyAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgbG9jYWxfbmFtZV8obmFtZSkgeworICB9CisKKyAgT2JqZWN0VHlwZSBHZXREYXRhVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZV87CisgIH0KKworICBPYmplY3RMb2NhbE5hbWUgR2V0TG9jYWxOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBsb2NhbF9uYW1lXzsKKyAgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5PYmplY3REYXRhKCkgeworICB9CisKKyBwcml2YXRlOgorICBPYmplY3RUeXBlIHR5cGVfOworICBPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZV87CisKKyAgT2JqZWN0RGF0YShjb25zdCBPYmplY3REYXRhJik7CisgIE9iamVjdERhdGEmIG9wZXJhdG9yPShjb25zdCBPYmplY3REYXRhJik7Cit9OworCit0eXBlZGVmIGFuZHJvaWQ6OnNwPE9iamVjdERhdGE+IE9iamVjdERhdGFQdHI7CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19PQkpFQ1RfREFUQV9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcGFsZXR0ZWRfdGV4dHVyZV91dGlsLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3BhbGV0dGVkX3RleHR1cmVfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0ZDM3YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3BhbGV0dGVkX3RleHR1cmVfdXRpbC5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworI2luY2x1ZGUgImNvbW1vbi9hbG9nLmgiCisjaW5jbHVkZSAiZ2xlcy9wYWxldHRlZF90ZXh0dXJlX3V0aWwuaCIKKworc2l6ZV90IFBhbGV0dGVkVGV4dHVyZVV0aWw6OkdldEltYWdlQnBwKEdMZW51bSBmb3JtYXQpIHsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6CisgICAgICByZXR1cm4gNDsKKworICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKKyAgICAgIHJldHVybiA4OworCisgICAgZGVmYXVsdDoKKyAgICAgIExPR19BTFdBWVNfRkFUQUwoIk5vdCBhIGtub3duIHBhbGV0dGVkIGZvcm1hdC4iKTsKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKK3NpemVfdCBQYWxldHRlZFRleHR1cmVVdGlsOjpHZXRFbnRyeVNpemVCeXRlcyhHTGVudW0gZm9ybWF0KSB7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgICAgcmV0dXJuIDI7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgICByZXR1cm4gMzsKKworICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQThfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQThfT0VTOgorICAgICAgcmV0dXJuIDQ7CisKKyAgICBkZWZhdWx0OgorICAgICAgTE9HX0FMV0FZU19GQVRBTCgiTm90IGEga25vd24gcGFsZXR0ZWQgZm9ybWF0LiIpOworICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworR0xlbnVtIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkdldEVudHJ5Rm9ybWF0KEdMZW51bSBmb3JtYXQpIHsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgICByZXR1cm4gR0xfUkdCOworCisgICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE0X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKKyAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQThfT0VTOgorICAgICAgcmV0dXJuIEdMX1JHQkE7CisKKyAgICBkZWZhdWx0OgorICAgICAgTE9HX0FMV0FZU19GQVRBTCgiTm90IGEga25vd24gcGFsZXR0ZWQgZm9ybWF0LiIpOworICAgICAgcmV0dXJuIEdMX1JHQkE7CisgIH0KK30KKworR0xlbnVtIFBhbGV0dGVkVGV4dHVyZVV0aWw6OkdldEVudHJ5VHlwZShHTGVudW0gZm9ybWF0KSB7CisgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVM6CisgICAgICByZXR1cm4gR0xfVU5TSUdORURfU0hPUlRfNV82XzU7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCNV9BMV9PRVM6CisgICAgICByZXR1cm4gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKKworICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQTRfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCQTRfT0VTOgorICAgICAgcmV0dXJuIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7CisKKyAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCQThfT0VTOgorICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6CisgICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6CisgICAgICByZXR1cm4gR0xfVU5TSUdORURfQllURTsKKworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJOb3QgYSBrbm93biBwYWxldHRlZCBmb3JtYXQuIik7CisgICAgICByZXR1cm4gR0xfVU5TSUdORURfQllURTsKKyAgfQorfQorCitzaXplX3QgUGFsZXR0ZWRUZXh0dXJlVXRpbDo6Q29tcHV0ZVBhbGV0dGVTaXplKAorICAgIHNpemVfdCBpbWFnZV9icHAsIHNpemVfdCBwYWxldHRlX2VudHJ5X3NpemUpIHsKKyAgLy8gV2Ugc3VwcG9ydCBhbiBhcmJpdHJhcnkgYml0cyBwZXIgcGl4ZWwsIGJ1dCB3ZSBvbmx5IHJlYWxseQorICAvLyBjYXJlIGFib3V0IHR3byBjYXNlcy4KKyAgLy8gRm9yIDRicHAgaW1hZ2VzLCB3ZSBoYXZlIGEgcGFsZXR0ZSB3aXRoIDE2IGVudHJpZXMKKyAgLy8gRm9yIDhicHAgaW1hZ2VzLCB3ZSBoYXZlIGEgcGFsZXR0ZSB3aXRoIDI1NiBlbnRyaWVzCisgIHJldHVybiAoMSA8PCBpbWFnZV9icHApICogcGFsZXR0ZV9lbnRyeV9zaXplOworfQorCitzaXplX3QgUGFsZXR0ZWRUZXh0dXJlVXRpbDo6Q29tcHV0ZUxldmVsMFNpemUoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBzaXplX3QgaW1hZ2VfYnBwKSB7CisgIC8vIENvbXB1dGUgdGhlIGJhc2Ugc2l6ZSBmb3IgdGhlIGZpcnN0IG1pcG1hcCBsZXZlbCBvZiBhIHRleHR1cmUuCisgIC8vIFdlIHJvdW5kIHVwIGZvciBzcGVjaWFsIGNhc2VzIGxpa2UgYSAxIHggMSA0YnBwIGltYWdlLCB3aGljaCBzdGlsbCBvY2N1cGllcworICAvLyBvbmUgYnl0ZS4KKyAgcmV0dXJuIChpbWFnZV9icHAgKiB3aWR0aCAqIGhlaWdodCArIDcpID4+IDM7Cit9CisKK3NpemVfdCBQYWxldHRlZFRleHR1cmVVdGlsOjpDb21wdXRlTGV2ZWxTaXplKAorICAgIHNpemVfdCBsZXZlbDBfc2l6ZSwgc2l6ZV90IG1pcF9sZXZlbCkgeworICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIGEgcGFydGljdWxhciBtaXBtYXAgbGV2ZWwuCisgIC8vIEZvciBleGFtcGxlLCBmb3IgYSAxNiB4IDE2IHggOGJwcCB0ZXh0dXJlLCB0aGUgYmFzZSBsZXZlbCB3aWxsIGhhdmUgYSBzaXplCisgIC8vIG9mIDI1NiBieXRlcyAoMTYqMTYqMSkuIExldmVsIDEgd2lsbCBoYXZlIGEgc2l6ZSBvZiA2NCBieXRlcyAoOCo4KjEpLiBMZXZlbAorICAvLyAyIHdpbGwgaGF2ZSBhIHNpemUgb2YgMTYgYnl0ZXMgKDQqNCoxKSwgYW5kIHNvIG9uLgorCisgIC8vIEVhY2ggbWlwIGxldmVsIGluZGV4IG1lYW5zIHF1YXJ0ZXJpbmcgdGhlIGJhc2Ugc2l6ZQorICBzaXplX3Qgc2hpZnQgPSBtaXBfbGV2ZWwgKyBtaXBfbGV2ZWw7CisKKyAgLy8gV2UgYWRkICgxIDw8IHNoaWZ0KSAtIDEgdG8gcm91bmQgdXAuIFRoaXMgaXMgbmVlZGVkIGVzcGVjaWFsbHkgZm9yIHRoZSBjYXNlCisgIC8vIG9mIGEgNGJwcCB0ZXh0dXJlIGdvaW5nIGZyb20gYSAyIHggMiBsZXZlbCAodHdvIGJ5dGVzKSB0byBhIDEgeCAxIGxldmVsCisgIC8vIChvbmUgaGFsZiBieXRlLCBidXQgcmVhbGx5IGhhcyB0byBiZSBvbmUpLgorICByZXR1cm4gKGxldmVsMF9zaXplICsgKDEgPDwgc2hpZnQpIC0gMSkgPj4gc2hpZnQ7Cit9CisKK3NpemVfdCBQYWxldHRlZFRleHR1cmVVdGlsOjpDb21wdXRlVG90YWxTaXplKAorICAgIHNpemVfdCBwYWxldHRlX3NpemUsIHNpemVfdCBsZXZlbDBfc2l6ZSwgc2l6ZV90IG1pcF9sZXZlbHMpIHsKKyAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgc2l6ZSBuZWVkZWQgZm9yIGEgY29tcHJlc3NlZCB0ZXh0dXJlLCBnaXZlbiBpdHMgcGFsZXR0ZQorICAvLyBzaXplLCB0aGUgc2l6ZSBvZiB0aGUgYmFzZSBtaXBtYXAgbGV2ZWwsIGFuZCB0aGUgbnVtYmVyIG9mIG1pcG1hcCBsZXZlbHMKKyAgLy8gc3RvcmVkLiBUaGUgZGF0YSBpcyBzaW1wbHkgY29uY2F0ZW5hdGVkIGFzIGJ5dGVzLCB3aXRoIG5vIHBhZGRpbmcgb3IKKyAgLy8gYWxpZ25tZW50IGFwcGxpZWQuCisgIHNpemVfdCBleHBlY3RlZF9zaXplID0gcGFsZXR0ZV9zaXplICsgbGV2ZWwwX3NpemU7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbWlwX2xldmVsczsgaSsrKSB7CisgICAgZXhwZWN0ZWRfc2l6ZSArPSBDb21wdXRlTGV2ZWxTaXplKGxldmVsMF9zaXplLCBpKTsKKyAgfQorICByZXR1cm4gZXhwZWN0ZWRfc2l6ZTsKK30KKwordWludDhfdCogUGFsZXR0ZWRUZXh0dXJlVXRpbDo6RGVjb21wcmVzcygKKyAgICBzaXplX3QgaW1hZ2VfYnBwLCBzaXplX3QgbGV2ZWxfc2l6ZSwgc2l6ZV90IHBhbGV0dGVfZW50cnlfc2l6ZSwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfaW1hZ2VfZGF0YSwgY29uc3QgdWludDhfdCogc3JjX3BhbGV0dGVfZGF0YSwKKyAgICB1aW50OF90KiBkc3QpIHsKKworICBpZiAoaW1hZ2VfYnBwID09IDQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxldmVsX3NpemU7ICsraSkgeworICAgICAgY29uc3QgdWludF9mYXN0OF90IGluZGV4X3BhaXIgPSAqc3JjX2ltYWdlX2RhdGErKzsKKyAgICAgIGNvbnN0IHVpbnRfZmFzdDhfdCBpbmRleDAgPSAoaW5kZXhfcGFpciA+PiA0KSAmIDE1OworICAgICAgY29uc3QgdWludF9mYXN0OF90IGluZGV4MSA9IChpbmRleF9wYWlyID4+IDApICYgMTU7CisgICAgICBtZW1jcHkoZHN0LCBzcmNfcGFsZXR0ZV9kYXRhICsgaW5kZXgwICogcGFsZXR0ZV9lbnRyeV9zaXplLAorICAgICAgICAgICAgIHBhbGV0dGVfZW50cnlfc2l6ZSk7CisgICAgICBkc3QgKz0gcGFsZXR0ZV9lbnRyeV9zaXplOworICAgICAgbWVtY3B5KGRzdCwgc3JjX3BhbGV0dGVfZGF0YSArIGluZGV4MSAqIHBhbGV0dGVfZW50cnlfc2l6ZSwKKyAgICAgICAgICAgICBwYWxldHRlX2VudHJ5X3NpemUpOworICAgICAgZHN0ICs9IHBhbGV0dGVfZW50cnlfc2l6ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZXZlbF9zaXplOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnRfZmFzdDhfdCBpbmRleCA9ICpzcmNfaW1hZ2VfZGF0YSsrOworICAgICAgbWVtY3B5KGRzdCwgc3JjX3BhbGV0dGVfZGF0YSArIGluZGV4ICogcGFsZXR0ZV9lbnRyeV9zaXplLAorICAgICAgICAgICAgIHBhbGV0dGVfZW50cnlfc2l6ZSk7CisgICAgICBkc3QgKz0gcGFsZXR0ZV9lbnRyeV9zaXplOworICAgIH0KKyAgfQorCisgIHJldHVybiBkc3Q7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9wYWxldHRlZF90ZXh0dXJlX3V0aWwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3BhbGV0dGVkX3RleHR1cmVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9wYWxldHRlZF90ZXh0dXJlX3V0aWwuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QQUxFVFRFRF9URVhUVVJFX1VUSUxfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QQUxFVFRFRF9URVhUVVJFX1VUSUxfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCitzdHJ1Y3QgUGFsZXR0ZWRUZXh0dXJlVXRpbCB7CisgIHN0YXRpYyBzaXplX3QgR2V0SW1hZ2VCcHAoR0xlbnVtIGZvcm1hdCk7CisgIHN0YXRpYyBzaXplX3QgR2V0RW50cnlTaXplQnl0ZXMoR0xlbnVtIGZvcm1hdCk7CisgIHN0YXRpYyBHTGVudW0gR2V0RW50cnlGb3JtYXQoR0xlbnVtIGZvcm1hdCk7CisgIHN0YXRpYyBHTGVudW0gR2V0RW50cnlUeXBlKEdMZW51bSBmb3JtYXQpOworICBzdGF0aWMgc2l6ZV90IENvbXB1dGVQYWxldHRlU2l6ZShzaXplX3QgaW1hZ2VfYnBwLCBzaXplX3QgcGFsZXR0ZV9lbnRyeV9zaXplKTsKKyAgc3RhdGljIHNpemVfdCBDb21wdXRlTGV2ZWwwU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIHNpemVfdCBpbWFnZV9icHApOworICBzdGF0aWMgc2l6ZV90IENvbXB1dGVMZXZlbFNpemUoc2l6ZV90IGxldmVsMF9zaXplLCBzaXplX3QgbWlwX2xldmVsKTsKKyAgc3RhdGljIHNpemVfdCBDb21wdXRlVG90YWxTaXplKHNpemVfdCBwYWxldHRlX3NpemUsIHNpemVfdCBsZXZlbDBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtaXBfbGV2ZWxzKTsKKyAgc3RhdGljIHVpbnQ4X3QqIERlY29tcHJlc3Moc2l6ZV90IGltYWdlX2JwcCwgc2l6ZV90IGxldmVsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYWxldHRlX2VudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19pbWFnZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGFsZXR0ZV9kYXRhLCB1aW50OF90KiBkc3QpOworfTsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1BBTEVUVEVEX1RFWFRVUkVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcGFzc190aHJvdWdoLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Bhc3NfdGhyb3VnaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmM2UxMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Bhc3NfdGhyb3VnaC5jcHAKQEAgLTAsMCArMSwxNzMxIEBACisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gQVVUT0dFTkVSQVRFRCBDT0RFLiAgRE8gTk9UIEVESVQuCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjaW5jbHVkZSAiZ2xlcy9wYXNzX3Rocm91Z2guaCIKKyNpbmNsdWRlICJjb21tb24vYWxvZy5oIgorI2luY2x1ZGUgImNvbW1vbi9kbG9nLmgiCisjaW5jbHVkZSAiY29tbW9uL3JlbmRlcmluZ19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX2NvbnRleHQuaCIKKworI2luY2x1ZGUgIkdMRVMxMlRyYW5zbGF0b3IvdW5kZXJseWluZ19hcGlzLmgiCisjaW5jbHVkZSAiR0xFUzEyVHJhbnNsYXRvci9hbmdsZV9nbGVzMi5oIgorCisjZGVmaW5lIERFQlVHIDAKKworI2lmIERFQlVHCisjZGVmaW5lIERQUklOVChmbXQsLi4uKSBkbyB7IFwKKyAgICBETE9HKCJnbGVzMTIgdW5kZXJseWluZzogIiBmbXQsICMjX19WQV9BUkdTX18pOyBcCit9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBEUFJJTlQoLi4uKQorI2VuZGlmCisKKworY2xhc3MgQ29udGV4dEF1dG9Mb2NrIHsKKyBwdWJsaWM6CisgIENvbnRleHRBdXRvTG9jayhlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCkgOiBjb250ZXh0Xyhjb250ZXh0KSB7CisgIH0KKworICB+Q29udGV4dEF1dG9Mb2NrKCkgeworICB9CisKKyBwcml2YXRlOgorICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dF87Cit9OworCisKK3ZvaWQgQWN0aXZlVGV4dHVyZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0ZXh0dXJlKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkFjdGl2ZVRleHR1cmVDYWxsKCVwLCAlcyAoMHgleCkpIiwgYywgR2V0RW51bVN0cmluZyh0ZXh0dXJlKSwgdGV4dHVyZSk7CisgIHJldHVybiBfYXBpLT5nbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Cit9CisKKwordm9pZCBBdHRhY2hTaGFkZXJDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJBdHRhY2hTaGFkZXJDYWxsKCVwLCAldSwgJXUpIiwgYywgcHJvZ3JhbSwgc2hhZGVyKTsKKyAgcmV0dXJuIF9hcGktPmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcik7Cit9CisKKwordm9pZCBCaW5kQXR0cmliTG9jYXRpb25DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBjaGFyKiBuYW1lKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJpbmRBdHRyaWJMb2NhdGlvbkNhbGwoJXAsICV1LCAldSwgJXApIiwgYywgcHJvZ3JhbSwgaW5kZXgsIG5hbWUpOworICByZXR1cm4gX2FwaS0+Z2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgaW5kZXgsIG5hbWUpOworfQorCisKK3ZvaWQgQmluZEJ1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQmluZEJ1ZmZlckNhbGwoJXAsICVzICgweCV4KSwgJXUpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIGJ1ZmZlcik7CisgIHJldHVybiBfYXBpLT5nbEJpbmRCdWZmZXIodGFyZ2V0LCBidWZmZXIpOworfQorCisKK3ZvaWQgQmluZEZyYW1lYnVmZmVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJpbmRGcmFtZWJ1ZmZlckNhbGwoJXAsICVzICgweCV4KSwgJXUpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIGZyYW1lYnVmZmVyKTsKKyAgcmV0dXJuIF9hcGktPmdsQmluZEZyYW1lYnVmZmVyKHRhcmdldCwgZnJhbWVidWZmZXIpOworfQorCisKK3ZvaWQgQmluZFJlbmRlcmJ1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQmluZFJlbmRlcmJ1ZmZlckNhbGwoJXAsICVzICgweCV4KSwgJXUpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7CisgIHJldHVybiBfYXBpLT5nbEJpbmRSZW5kZXJidWZmZXIodGFyZ2V0LCByZW5kZXJidWZmZXIpOworfQorCisKK3ZvaWQgQmluZFRleHR1cmVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJCaW5kVGV4dHVyZUNhbGwoJXAsICVzICgweCV4KSwgJXUpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIHRleHR1cmUpOworICByZXR1cm4gX2FwaS0+Z2xCaW5kVGV4dHVyZSh0YXJnZXQsIHRleHR1cmUpOworfQorCisKK3ZvaWQgQmxlbmRDb2xvckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJsZW5kQ29sb3JDYWxsKCVwLCAlZiwgJWYsICVmLCAlZikiLCBjLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgIHJldHVybiBfYXBpLT5nbEJsZW5kQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCisKK3ZvaWQgQmxlbmRFcXVhdGlvbkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBtb2RlKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJsZW5kRXF1YXRpb25DYWxsKCVwLCAlcyAoMHgleCkpIiwgYywgR2V0RW51bVN0cmluZyhtb2RlKSwgbW9kZSk7CisgIHJldHVybiBfYXBpLT5nbEJsZW5kRXF1YXRpb24obW9kZSk7Cit9CisKKwordm9pZCBCbGVuZEVxdWF0aW9uU2VwYXJhdGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJCbGVuZEVxdWF0aW9uU2VwYXJhdGVDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKG1vZGVSR0IpLCBtb2RlUkdCLCBHZXRFbnVtU3RyaW5nKG1vZGVBbHBoYSksIG1vZGVBbHBoYSk7CisgIHJldHVybiBfYXBpLT5nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOworfQorCisKK3ZvaWQgQmxlbmRGdW5jQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJsZW5kRnVuY0NhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpKSIsIGMsIEdldEVudW1TdHJpbmcoc2ZhY3RvciksIHNmYWN0b3IsIEdldEVudW1TdHJpbmcoZGZhY3RvciksIGRmYWN0b3IpOworICByZXR1cm4gX2FwaS0+Z2xCbGVuZEZ1bmMoc2ZhY3RvciwgZGZhY3Rvcik7Cit9CisKKwordm9pZCBCbGVuZEZ1bmNTZXBhcmF0ZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkJsZW5kRnVuY1NlcGFyYXRlQ2FsbCglcCwgJXMgKDB4JXgpLCAlcyAoMHgleCksICVzICgweCV4KSwgJXMgKDB4JXgpKSIsIGMsIEdldEVudW1TdHJpbmcoc3JjUkdCKSwgc3JjUkdCLCBHZXRFbnVtU3RyaW5nKGRzdFJHQiksIGRzdFJHQiwgR2V0RW51bVN0cmluZyhzcmNBbHBoYSksIHNyY0FscGhhLCBHZXRFbnVtU3RyaW5nKGRzdEFscGhhKSwgZHN0QWxwaGEpOworICByZXR1cm4gX2FwaS0+Z2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKK30KKworCit2b2lkIEJ1ZmZlckRhdGFDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IHZvaWQqIGRhdGEsIEdMZW51bSB1c2FnZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJCdWZmZXJEYXRhQ2FsbCglcCwgJXMgKDB4JXgpLCAlbGQsICVwLCAlcyAoMHgleCkpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIHNpemUsIGRhdGEsIEdldEVudW1TdHJpbmcodXNhZ2UpLCB1c2FnZSk7CisgIHJldHVybiBfYXBpLT5nbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCBkYXRhLCB1c2FnZSk7Cit9CisKKwordm9pZCBCdWZmZXJTdWJEYXRhQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQnVmZmVyU3ViRGF0YUNhbGwoJXAsICVzICgweCV4KSwgJWxkLCAlbGQsICVwKSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOworICByZXR1cm4gX2FwaS0+Z2xCdWZmZXJTdWJEYXRhKHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKK30KKworCitHTGVudW0gQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0NhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCk7CisgIHJldHVybiBfYXBpLT5nbENoZWNrRnJhbWVidWZmZXJTdGF0dXModGFyZ2V0KTsKK30KKworCit2b2lkIENsZWFyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xiaXRmaWVsZCBtYXNrKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNsZWFyQ2FsbCglcCwgMHgleCkiLCBjLCBtYXNrKTsKKyAgcmV0dXJuIF9hcGktPmdsQ2xlYXIobWFzayk7Cit9CisKKwordm9pZCBDbGVhckNvbG9yQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ2xlYXJDb2xvckNhbGwoJXAsICVmLCAlZiwgJWYsICVmKSIsIGMsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgcmV0dXJuIF9hcGktPmdsQ2xlYXJDb2xvcihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKKwordm9pZCBDbGVhckRlcHRoZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMY2xhbXBmIGRlcHRoKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNsZWFyRGVwdGhmQ2FsbCglcCwgJWYpIiwgYywgZGVwdGgpOworICByZXR1cm4gX2FwaS0+Z2xDbGVhckRlcHRoKChHTGNsYW1wZClkZXB0aCk7Cit9CisKKwordm9pZCBDbGVhclN0ZW5jaWxDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNsZWFyU3RlbmNpbENhbGwoJXAsICVkKSIsIGMsIHMpOworICByZXR1cm4gX2FwaS0+Z2xDbGVhclN0ZW5jaWwocyk7Cit9CisKKwordm9pZCBDb2xvck1hc2tDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ29sb3JNYXNrQ2FsbCglcCwgJWQsICVkLCAlZCwgJWQpIiwgYywgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICByZXR1cm4gX2FwaS0+Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCisKK3ZvaWQgQ29tcGlsZVNoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBzaGFkZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ29tcGlsZVNoYWRlckNhbGwoJXAsICV1KSIsIGMsIHNoYWRlcik7CisgIHJldHVybiBfYXBpLT5nbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKK30KKworCit2b2lkIENvbXByZXNzZWRUZXhJbWFnZTJEQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ29tcHJlc3NlZFRleEltYWdlMkRDYWxsKCVwLCAlcyAoMHgleCksICVkLCAlcyAoMHgleCksICV6ZCwgJXpkLCAlZCwgJXpkLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgbGV2ZWwsIEdldEVudW1TdHJpbmcoaW50ZXJuYWxmb3JtYXQpLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOworICByZXR1cm4gX2FwaS0+Z2xDb21wcmVzc2VkVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOworfQorCisKK3ZvaWQgQ29tcHJlc3NlZFRleFN1YkltYWdlMkRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCB2b2lkKiBkYXRhKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNvbXByZXNzZWRUZXhTdWJJbWFnZTJEQ2FsbCglcCwgJXMgKDB4JXgpLCAlZCwgJWQsICVkLCAlemQsICV6ZCwgJXMgKDB4JXgpLCAlemQsICVwKSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgR2V0RW51bVN0cmluZyhmb3JtYXQpLCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7CisgIHJldHVybiBfYXBpLT5nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKK30KKworCit2b2lkIENvcHlUZXhJbWFnZTJEQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJDb3B5VGV4SW1hZ2UyRENhbGwoJXAsICVzICgweCV4KSwgJWQsICVzICgweCV4KSwgJWQsICVkLCAlemQsICV6ZCwgJWQpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIGxldmVsLCBHZXRFbnVtU3RyaW5nKGludGVybmFsZm9ybWF0KSwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJvcmRlcik7CisgIHJldHVybiBfYXBpLT5nbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOworfQorCisKK3ZvaWQgQ29weVRleFN1YkltYWdlMkRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiQ29weVRleFN1YkltYWdlMkRDYWxsKCVwLCAlcyAoMHgleCksICVkLCAlZCwgJWQsICVkLCAlZCwgJXpkLCAlemQpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgcmV0dXJuIF9hcGktPmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Cit9CisKKworR0x1aW50IENyZWF0ZVByb2dyYW1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNyZWF0ZVByb2dyYW1DYWxsKCVwKSIsIGMpOworICByZXR1cm4gX2FwaS0+Z2xDcmVhdGVQcm9ncmFtKCk7Cit9CisKKworR0x1aW50IENyZWF0ZVNoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0eXBlKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkNyZWF0ZVNoYWRlckNhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKHR5cGUpLCB0eXBlKTsKKyAgcmV0dXJuIF9hcGktPmdsQ3JlYXRlU2hhZGVyKHR5cGUpOworfQorCisKK3ZvaWQgQ3VsbEZhY2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbW9kZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJDdWxsRmFjZUNhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKG1vZGUpLCBtb2RlKTsKKyAgcmV0dXJuIF9hcGktPmdsQ3VsbEZhY2UobW9kZSk7Cit9CisKKwordm9pZCBEZWxldGVCdWZmZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGVsZXRlQnVmZmVyc0NhbGwoJXAsICV6ZCwgJXApIiwgYywgbiwgYnVmZmVycyk7CisgIHJldHVybiBfYXBpLT5nbERlbGV0ZUJ1ZmZlcnMobiwgYnVmZmVycyk7Cit9CisKKwordm9pZCBEZWxldGVGcmFtZWJ1ZmZlcnNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRlbGV0ZUZyYW1lYnVmZmVyc0NhbGwoJXAsICV6ZCwgJXApIiwgYywgbiwgZnJhbWVidWZmZXJzKTsKKyAgcmV0dXJuIF9hcGktPmdsRGVsZXRlRnJhbWVidWZmZXJzKG4sIGZyYW1lYnVmZmVycyk7Cit9CisKKwordm9pZCBEZWxldGVQcm9ncmFtQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0pIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGVsZXRlUHJvZ3JhbUNhbGwoJXAsICV1KSIsIGMsIHByb2dyYW0pOworICByZXR1cm4gX2FwaS0+Z2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOworfQorCisKK3ZvaWQgRGVsZXRlUmVuZGVyYnVmZmVyc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRlbGV0ZVJlbmRlcmJ1ZmZlcnNDYWxsKCVwLCAlemQsICVwKSIsIGMsIG4sIHJlbmRlcmJ1ZmZlcnMpOworICByZXR1cm4gX2FwaS0+Z2xEZWxldGVSZW5kZXJidWZmZXJzKG4sIHJlbmRlcmJ1ZmZlcnMpOworfQorCisKK3ZvaWQgRGVsZXRlU2hhZGVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlcikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJEZWxldGVTaGFkZXJDYWxsKCVwLCAldSkiLCBjLCBzaGFkZXIpOworICByZXR1cm4gX2FwaS0+Z2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKK30KKworCit2b2lkIERlbGV0ZVRleHR1cmVzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHRleHR1cmVzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRlbGV0ZVRleHR1cmVzQ2FsbCglcCwgJXpkLCAlcCkiLCBjLCBuLCB0ZXh0dXJlcyk7CisgIHJldHVybiBfYXBpLT5nbERlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzKTsKK30KKworCit2b2lkIERlcHRoRnVuY0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBmdW5jKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRlcHRoRnVuY0NhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKGZ1bmMpLCBmdW5jKTsKKyAgcmV0dXJuIF9hcGktPmdsRGVwdGhGdW5jKGZ1bmMpOworfQorCisKK3ZvaWQgRGVwdGhNYXNrQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xib29sZWFuIGZsYWcpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGVwdGhNYXNrQ2FsbCglcCwgJWQpIiwgYywgZmxhZyk7CisgIHJldHVybiBfYXBpLT5nbERlcHRoTWFzayhmbGFnKTsKK30KKworCit2b2lkIERlcHRoUmFuZ2VmQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGVwdGhSYW5nZWZDYWxsKCVwLCAlZiwgJWYpIiwgYywgek5lYXIsIHpGYXIpOworICByZXR1cm4gX2FwaS0+Z2xEZXB0aFJhbmdlKChHTGNsYW1wZCl6TmVhciwgKEdMY2xhbXBkKXpGYXIpOworfQorCisKK3ZvaWQgRGV0YWNoU2hhZGVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGV0YWNoU2hhZGVyQ2FsbCglcCwgJXUsICV1KSIsIGMsIHByb2dyYW0sIHNoYWRlcik7CisgIHJldHVybiBfYXBpLT5nbERldGFjaFNoYWRlcihwcm9ncmFtLCBzaGFkZXIpOworfQorCisKK3ZvaWQgRGlzYWJsZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBjYXApIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRGlzYWJsZUNhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKGNhcCksIGNhcCk7CisgIHJldHVybiBfYXBpLT5nbERpc2FibGUoY2FwKTsKK30KKworCit2b2lkIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmRleCkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlDYWxsKCVwLCAldSkiLCBjLCBpbmRleCk7CisgIHJldHVybiBfYXBpLT5nbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7Cit9CisKKwordm9pZCBEcmF3QXJyYXlzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRyYXdBcnJheXNDYWxsKCVwLCAlcyAoMHgleCksICVkLCAlemQpIiwgYywgR2V0RW51bVN0cmluZyhtb2RlKSwgbW9kZSwgZmlyc3QsIGNvdW50KTsKKyAgcmV0dXJuIF9hcGktPmdsRHJhd0FycmF5cyhtb2RlLCBmaXJzdCwgY291bnQpOworfQorCisKK3ZvaWQgRHJhd0VsZW1lbnRzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkKiBpbmRpY2VzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkRyYXdFbGVtZW50c0NhbGwoJXAsICVzICgweCV4KSwgJXpkLCAlcyAoMHgleCksICVwKSIsIGMsIEdldEVudW1TdHJpbmcobW9kZSksIG1vZGUsIGNvdW50LCBHZXRFbnVtU3RyaW5nKHR5cGUpLCB0eXBlLCBpbmRpY2VzKTsKKyAgcmV0dXJuIF9hcGktPmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzKTsKK30KKwordm9pZCBFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FU0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgYnVmZmVyKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworI2lmZGVmIERFQlVHCisgIERQUklOVCgiRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVNDYWxsKCVwLCAlcyAoMHgleCksICVwKSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBidWZmZXIpOworI2VuZGlmCisgIHJldHVybiBfYXBpLT5nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKHRhcmdldCwgYnVmZmVyKTsKK30KKwordm9pZCBFbmFibGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gY2FwKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkVuYWJsZUNhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKGNhcCksIGNhcCk7CisgIHJldHVybiBfYXBpLT5nbEVuYWJsZShjYXApOworfQorCisKK3ZvaWQgRW5hYmxlVmVydGV4QXR0cmliQXJyYXlDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRW5hYmxlVmVydGV4QXR0cmliQXJyYXlDYWxsKCVwLCAldSkiLCBjLCBpbmRleCk7CisgIHJldHVybiBfYXBpLT5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKK30KKworCit2b2lkIEZpbmlzaENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRmluaXNoQ2FsbCglcCkiLCBjKTsKKyAgcmV0dXJuIF9hcGktPmdsRmluaXNoKCk7Cit9CisKKwordm9pZCBGbHVzaENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRmx1c2hDYWxsKCVwKSIsIGMpOworICByZXR1cm4gX2FwaS0+Z2xGbHVzaCgpOworfQorCisKK3ZvaWQgRnJhbWVidWZmZXJSZW5kZXJidWZmZXJDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckNhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlcyAoMHgleCksICV1KSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBHZXRFbnVtU3RyaW5nKGF0dGFjaG1lbnQpLCBhdHRhY2htZW50LCBHZXRFbnVtU3RyaW5nKHJlbmRlcmJ1ZmZlcnRhcmdldCksIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKyAgcmV0dXJuIF9hcGktPmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Cit9CisKKwordm9pZCBGcmFtZWJ1ZmZlclRleHR1cmUyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiRnJhbWVidWZmZXJUZXh0dXJlMkRDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXMgKDB4JXgpLCAldSwgJWQpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcoYXR0YWNobWVudCksIGF0dGFjaG1lbnQsIEdldEVudW1TdHJpbmcodGV4dGFyZ2V0KSwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCk7CisgIHJldHVybiBfYXBpLT5nbEZyYW1lYnVmZmVyVGV4dHVyZTJEKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCk7Cit9CisKKwordm9pZCBGcm9udEZhY2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbW9kZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJGcm9udEZhY2VDYWxsKCVwLCAlcyAoMHgleCkpIiwgYywgR2V0RW51bVN0cmluZyhtb2RlKSwgbW9kZSk7CisgIHJldHVybiBfYXBpLT5nbEZyb250RmFjZShtb2RlKTsKK30KKworCit2b2lkIEdlbkJ1ZmZlcnNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIEdMdWludCogYnVmZmVycykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZW5CdWZmZXJzQ2FsbCglcCwgJXpkLCAlcCkiLCBjLCBuLCBidWZmZXJzKTsKKyAgcmV0dXJuIF9hcGktPmdsR2VuQnVmZmVycyhuLCBidWZmZXJzKTsKK30KKworCit2b2lkIEdlbmVyYXRlTWlwbWFwQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZW5lcmF0ZU1pcG1hcENhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCk7CisgIHJldHVybiBfYXBpLT5nbEdlbmVyYXRlTWlwbWFwKHRhcmdldCk7Cit9CisKKwordm9pZCBHZW5GcmFtZWJ1ZmZlcnNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdlbkZyYW1lYnVmZmVyc0NhbGwoJXAsICV6ZCwgJXApIiwgYywgbiwgZnJhbWVidWZmZXJzKTsKKyAgcmV0dXJuIF9hcGktPmdsR2VuRnJhbWVidWZmZXJzKG4sIGZyYW1lYnVmZmVycyk7Cit9CisKKwordm9pZCBHZW5SZW5kZXJidWZmZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2VuUmVuZGVyYnVmZmVyc0NhbGwoJXAsICV6ZCwgJXApIiwgYywgbiwgcmVuZGVyYnVmZmVycyk7CisgIHJldHVybiBfYXBpLT5nbEdlblJlbmRlcmJ1ZmZlcnMobiwgcmVuZGVyYnVmZmVycyk7Cit9CisKKwordm9pZCBHZW5UZXh0dXJlc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZW5UZXh0dXJlc0NhbGwoJXAsICV6ZCwgJXApIiwgYywgbiwgdGV4dHVyZXMpOworICByZXR1cm4gX2FwaS0+Z2xHZW5UZXh0dXJlcyhuLCB0ZXh0dXJlcyk7Cit9CisKKwordm9pZCBHZXRBY3RpdmVBdHRyaWJDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgY2hhciogbmFtZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRBY3RpdmVBdHRyaWJDYWxsKCVwLCAldSwgJXUsICV6ZCwgJXAsICVwLCAlcCwgJXApIiwgYywgcHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7CisgIHJldHVybiBfYXBpLT5nbEdldEFjdGl2ZUF0dHJpYihwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKK30KKworCit2b2lkIEdldEFjdGl2ZVVuaWZvcm1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgY2hhciogbmFtZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRBY3RpdmVVbmlmb3JtQ2FsbCglcCwgJXUsICV1LCAlemQsICVwLCAlcCwgJXAsICVwKSIsIGMsIHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworICByZXR1cm4gX2FwaS0+Z2xHZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOworfQorCisKK3ZvaWQgR2V0QXR0YWNoZWRTaGFkZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0QXR0YWNoZWRTaGFkZXJzQ2FsbCglcCwgJXUsICV6ZCwgJXAsICVwKSIsIGMsIHByb2dyYW0sIG1heGNvdW50LCBjb3VudCwgc2hhZGVycyk7CisgIHJldHVybiBfYXBpLT5nbEdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtLCBtYXhjb3VudCwgY291bnQsIHNoYWRlcnMpOworfQorCisKK0dMaW50IEdldEF0dHJpYkxvY2F0aW9uQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0QXR0cmliTG9jYXRpb25DYWxsKCVwLCAldSwgJXApIiwgYywgcHJvZ3JhbSwgbmFtZSk7CisgIHJldHVybiBfYXBpLT5nbEdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIG5hbWUpOworfQorCisKK3ZvaWQgR2V0Qm9vbGVhbnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiogcGFyYW1zKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldEJvb2xlYW52Q2FsbCglcCwgJXMgKDB4JXgpLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUsIHBhcmFtcyk7CisgIHJldHVybiBfYXBpLT5nbEdldEJvb2xlYW52KHBuYW1lLCBwYXJhbXMpOworfQorCisKK3ZvaWQgR2V0QnVmZmVyUGFyYW1ldGVyaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0QnVmZmVyUGFyYW1ldGVyaXZDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKworCitHTGVudW0gR2V0RXJyb3JDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldEVycm9yQ2FsbCglcCkiLCBjKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0RXJyb3IoKTsKK30KKworCit2b2lkIEdldEZsb2F0dkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldEZsb2F0dkNhbGwoJXAsICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbXMpOworICByZXR1cm4gX2FwaS0+Z2xHZXRGbG9hdHYocG5hbWUsIHBhcmFtcyk7Cit9CisKKwordm9pZCBHZXRJbnRlZ2VydkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRJbnRlZ2VydkNhbGwoJXAsICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbXMpOworICByZXR1cm4gX2FwaS0+Z2xHZXRJbnRlZ2VydihwbmFtZSwgcGFyYW1zKTsKK30KKworCit2b2lkIEdldFByb2dyYW1pdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0UHJvZ3JhbWl2Q2FsbCglcCwgJXUsICVzICgweCV4KSwgJXApIiwgYywgcHJvZ3JhbSwgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbXMpOworICByZXR1cm4gX2FwaS0+Z2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgcG5hbWUsIHBhcmFtcyk7Cit9CisKKwordm9pZCBHZXRQcm9ncmFtSW5mb0xvZ0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgY2hhciogaW5mb2xvZykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRQcm9ncmFtSW5mb0xvZ0NhbGwoJXAsICV1LCAlemQsICVwLCAlcCkiLCBjLCBwcm9ncmFtLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOworICByZXR1cm4gX2FwaS0+Z2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOworfQorCisKK3ZvaWQgR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKworCit2b2lkIEdldFNoYWRlcml2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldFNoYWRlcml2Q2FsbCglcCwgJXUsICVzICgweCV4KSwgJXApIiwgYywgc2hhZGVyLCBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUsIHBhcmFtcyk7CisgIHJldHVybiBfYXBpLT5nbEdldFNoYWRlcml2KHNoYWRlciwgcG5hbWUsIHBhcmFtcyk7Cit9CisKKwordm9pZCBHZXRTaGFkZXJJbmZvTG9nQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIGNoYXIqIGluZm9sb2cpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0U2hhZGVySW5mb0xvZ0NhbGwoJXAsICV1LCAlemQsICVwLCAlcCkiLCBjLCBzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7CisgIHJldHVybiBfYXBpLT5nbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOworfQorCisKK3ZvaWQgR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0Q2FsbCglcCwgJXMgKDB4JXgpLCAlcyAoMHgleCksICVwLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHNoYWRlcnR5cGUpLCBzaGFkZXJ0eXBlLCBHZXRFbnVtU3RyaW5nKHByZWNpc2lvbnR5cGUpLCBwcmVjaXNpb250eXBlLCByYW5nZSwgcHJlY2lzaW9uKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHNoYWRlcnR5cGUsIHByZWNpc2lvbnR5cGUsIHJhbmdlLCBwcmVjaXNpb24pOworfQorCisKK3ZvaWQgR2V0U2hhZGVyU291cmNlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIGNoYXIqIHNvdXJjZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRTaGFkZXJTb3VyY2VDYWxsKCVwLCAldSwgJXpkLCAlcCwgJXApIiwgYywgc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIHNvdXJjZSk7CisgIHJldHVybiBfYXBpLT5nbEdldFNoYWRlclNvdXJjZShzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgc291cmNlKTsKK30KKworCitjb25zdCBHTHVieXRlKiBHZXRTdHJpbmdDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbmFtZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRTdHJpbmdDYWxsKCVwLCAlcyAoMHgleCkpIiwgYywgR2V0RW51bVN0cmluZyhuYW1lKSwgbmFtZSk7CisgIHJldHVybiBfYXBpLT5nbEdldFN0cmluZyhuYW1lKTsKK30KKworCit2b2lkIEdldFRleFBhcmFtZXRlcmZ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0VGV4UGFyYW1ldGVyZnZDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKworCit2b2lkIEdldFRleFBhcmFtZXRlcml2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldFRleFBhcmFtZXRlcml2Q2FsbCglcCwgJXMgKDB4JXgpLCAlcyAoMHgleCksICVwKSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUsIHBhcmFtcyk7CisgIHJldHVybiBfYXBpLT5nbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Cit9CisKKwordm9pZCBHZXRVbmlmb3JtZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRVbmlmb3JtZnZDYWxsKCVwLCAldSwgJWQsICVwKSIsIGMsIHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOworICByZXR1cm4gX2FwaS0+Z2xHZXRVbmlmb3JtZnYocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyk7Cit9CisKKwordm9pZCBHZXRVbmlmb3JtaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiR2V0VW5pZm9ybWl2Q2FsbCglcCwgJXUsICVkLCAlcCkiLCBjLCBwcm9ncmFtLCBsb2NhdGlvbiwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0VW5pZm9ybWl2KHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOworfQorCisKK0dMaW50IEdldFVuaWZvcm1Mb2NhdGlvbkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldFVuaWZvcm1Mb2NhdGlvbkNhbGwoJXAsICV1LCAlcCkiLCBjLCBwcm9ncmFtLCBuYW1lKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpOworfQorCisKK3ZvaWQgR2V0VmVydGV4QXR0cmliZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldFZlcnRleEF0dHJpYmZ2Q2FsbCglcCwgJXUsICVzICgweCV4KSwgJXApIiwgYywgaW5kZXgsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCBwYXJhbXMpOworfQorCisKK3ZvaWQgR2V0VmVydGV4QXR0cmliaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJHZXRWZXJ0ZXhBdHRyaWJpdkNhbGwoJXAsICV1LCAlcyAoMHgleCksICVwKSIsIGMsIGluZGV4LCBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUsIHBhcmFtcyk7CisgIHJldHVybiBfYXBpLT5nbEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgcGFyYW1zKTsKK30KKworCit2b2lkIEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIHZvaWQqKiBwb2ludGVyKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkdldFZlcnRleEF0dHJpYlBvaW50ZXJ2Q2FsbCglcCwgJXUsICVzICgweCV4KSwgJXApIiwgYywgaW5kZXgsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcG9pbnRlcik7CisgIHJldHVybiBfYXBpLT5nbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgcG9pbnRlcik7Cit9CisKKwordm9pZCBIaW50Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiSGludENhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpKSIsIGMsIEdldEVudW1TdHJpbmcodGFyZ2V0KSwgdGFyZ2V0LCBHZXRFbnVtU3RyaW5nKG1vZGUpLCBtb2RlKTsKKyAgcmV0dXJuIF9hcGktPmdsSGludCh0YXJnZXQsIG1vZGUpOworfQorCisKK0dMYm9vbGVhbiBJc0J1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBidWZmZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiSXNCdWZmZXJDYWxsKCVwLCAldSkiLCBjLCBidWZmZXIpOworICByZXR1cm4gX2FwaS0+Z2xJc0J1ZmZlcihidWZmZXIpOworfQorCisKK0dMYm9vbGVhbiBJc0VuYWJsZWRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gY2FwKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIklzRW5hYmxlZENhbGwoJXAsICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKGNhcCksIGNhcCk7CisgIHJldHVybiBfYXBpLT5nbElzRW5hYmxlZChjYXApOworfQorCisKK0dMYm9vbGVhbiBJc1Byb2dyYW1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJJc1Byb2dyYW1DYWxsKCVwLCAldSkiLCBjLCBwcm9ncmFtKTsKKyAgcmV0dXJuIF9hcGktPmdsSXNQcm9ncmFtKHByb2dyYW0pOworfQorCisKK0dMYm9vbGVhbiBJc1JlbmRlcmJ1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCByZW5kZXJidWZmZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiSXNSZW5kZXJidWZmZXJDYWxsKCVwLCAldSkiLCBjLCByZW5kZXJidWZmZXIpOworICByZXR1cm4gX2FwaS0+Z2xJc1JlbmRlcmJ1ZmZlcihyZW5kZXJidWZmZXIpOworfQorCisKK0dMYm9vbGVhbiBJc1NoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBzaGFkZXIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiSXNTaGFkZXJDYWxsKCVwLCAldSkiLCBjLCBzaGFkZXIpOworICByZXR1cm4gX2FwaS0+Z2xJc1NoYWRlcihzaGFkZXIpOworfQorCisKK0dMYm9vbGVhbiBJc1RleHR1cmVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgdGV4dHVyZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJJc1RleHR1cmVDYWxsKCVwLCAldSkiLCBjLCB0ZXh0dXJlKTsKKyAgcmV0dXJuIF9hcGktPmdsSXNUZXh0dXJlKHRleHR1cmUpOworfQorCisKK3ZvaWQgTGluZVdpZHRoQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xmbG9hdCB3aWR0aCkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJMaW5lV2lkdGhDYWxsKCVwLCAlZikiLCBjLCB3aWR0aCk7CisgIHJldHVybiBfYXBpLT5nbExpbmVXaWR0aCh3aWR0aCk7Cit9CisKKwordm9pZCBMaW5rUHJvZ3JhbUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIkxpbmtQcm9ncmFtQ2FsbCglcCwgJXUpIiwgYywgcHJvZ3JhbSk7CisgIHJldHVybiBfYXBpLT5nbExpbmtQcm9ncmFtKHByb2dyYW0pOworfQorCisKK3ZvaWQgUGl4ZWxTdG9yZWlDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlBpeGVsU3RvcmVpQ2FsbCglcCwgJXMgKDB4JXgpLCAlZCkiLCBjLCBHZXRFbnVtU3RyaW5nKHBuYW1lKSwgcG5hbWUsIHBhcmFtKTsKKyAgcmV0dXJuIF9hcGktPmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKK30KKworCit2b2lkIFBvbHlnb25PZmZzZXRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJQb2x5Z29uT2Zmc2V0Q2FsbCglcCwgJWYsICVmKSIsIGMsIGZhY3RvciwgdW5pdHMpOworICByZXR1cm4gX2FwaS0+Z2xQb2x5Z29uT2Zmc2V0KGZhY3RvciwgdW5pdHMpOworfQorCisKK3ZvaWQgUmVhZFBpeGVsc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCogcGl4ZWxzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlJlYWRQaXhlbHNDYWxsKCVwLCAlZCwgJWQsICV6ZCwgJXpkLCAlcyAoMHgleCksICVzICgweCV4KSwgJXApIiwgYywgeCwgeSwgd2lkdGgsIGhlaWdodCwgR2V0RW51bVN0cmluZyhmb3JtYXQpLCBmb3JtYXQsIEdldEVudW1TdHJpbmcodHlwZSksIHR5cGUsIHBpeGVscyk7CisgIHJldHVybiBfYXBpLT5nbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCisKK3ZvaWQgUmVsZWFzZVNoYWRlckNvbXBpbGVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJSZWxlYXNlU2hhZGVyQ29tcGlsZXJDYWxsKCVwKSIsIGMpOworICByZXR1cm4gX2FwaS0+Z2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIoKTsKK30KKworCit2b2lkIFJlbmRlcmJ1ZmZlclN0b3JhZ2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlJlbmRlcmJ1ZmZlclN0b3JhZ2VDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXpkLCAlemQpIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcoaW50ZXJuYWxmb3JtYXQpLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgIHJldHVybiBfYXBpLT5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Cit9CisKKwordm9pZCBTYW1wbGVDb3ZlcmFnZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlNhbXBsZUNvdmVyYWdlQ2FsbCglcCwgJWYsICVkKSIsIGMsIHZhbHVlLCBpbnZlcnQpOworICByZXR1cm4gX2FwaS0+Z2xTYW1wbGVDb3ZlcmFnZSh2YWx1ZSwgaW52ZXJ0KTsKK30KKworCit2b2lkIFNjaXNzb3JDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJTY2lzc29yQ2FsbCglcCwgJWQsICVkLCAlemQsICV6ZCkiLCBjLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgcmV0dXJuIF9hcGktPmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKworCit2b2lkIFNoYWRlckJpbmFyeUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCB2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlNoYWRlckJpbmFyeUNhbGwoJXAsICV6ZCwgJXAsICVzICgweCV4KSwgJXAsICV6ZCkiLCBjLCBuLCBzaGFkZXJzLCBHZXRFbnVtU3RyaW5nKGJpbmFyeWZvcm1hdCksIGJpbmFyeWZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpOworICByZXR1cm4gX2FwaS0+Z2xTaGFkZXJCaW5hcnkobiwgc2hhZGVycywgYmluYXJ5Zm9ybWF0LCBiaW5hcnksIGxlbmd0aCk7Cit9CisKKwordm9pZCBTaGFkZXJTb3VyY2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBjaGFyKiogc3RyLCBjb25zdCBHTGludCogbGVuZ3RoKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlNoYWRlclNvdXJjZUNhbGwoJXAsICV1LCAlemQsICVwLCAlcCkiLCBjLCBzaGFkZXIsIGNvdW50LCBzdHIsIGxlbmd0aCk7CisgIHJldHVybiBfYXBpLT5nbFNoYWRlclNvdXJjZShzaGFkZXIsIGNvdW50LCBzdHIsIGxlbmd0aCk7Cit9CisKKwordm9pZCBTdGVuY2lsRnVuY0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlN0ZW5jaWxGdW5jQ2FsbCglcCwgJXMgKDB4JXgpLCAlZCwgJXUpIiwgYywgR2V0RW51bVN0cmluZyhmdW5jKSwgZnVuYywgcmVmLCBtYXNrKTsKKyAgcmV0dXJuIF9hcGktPmdsU3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKworCit2b2lkIFN0ZW5jaWxGdW5jU2VwYXJhdGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiU3RlbmNpbEZ1bmNTZXBhcmF0ZUNhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlZCwgJXUpIiwgYywgR2V0RW51bVN0cmluZyhmYWNlKSwgZmFjZSwgR2V0RW51bVN0cmluZyhmdW5jKSwgZnVuYywgcmVmLCBtYXNrKTsKKyAgcmV0dXJuIF9hcGktPmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOworfQorCisKK3ZvaWQgU3RlbmNpbE1hc2tDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgbWFzaykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJTdGVuY2lsTWFza0NhbGwoJXAsICV1KSIsIGMsIG1hc2spOworICByZXR1cm4gX2FwaS0+Z2xTdGVuY2lsTWFzayhtYXNrKTsKK30KKworCit2b2lkIFN0ZW5jaWxNYXNrU2VwYXJhdGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiU3RlbmNpbE1hc2tTZXBhcmF0ZUNhbGwoJXAsICVzICgweCV4KSwgJXUpIiwgYywgR2V0RW51bVN0cmluZyhmYWNlKSwgZmFjZSwgbWFzayk7CisgIHJldHVybiBfYXBpLT5nbFN0ZW5jaWxNYXNrU2VwYXJhdGUoZmFjZSwgbWFzayk7Cit9CisKKwordm9pZCBTdGVuY2lsT3BDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiU3RlbmNpbE9wQ2FsbCglcCwgJXMgKDB4JXgpLCAlcyAoMHgleCksICVzICgweCV4KSkiLCBjLCBHZXRFbnVtU3RyaW5nKGZhaWwpLCBmYWlsLCBHZXRFbnVtU3RyaW5nKHpmYWlsKSwgemZhaWwsIEdldEVudW1TdHJpbmcoenBhc3MpLCB6cGFzcyk7CisgIHJldHVybiBfYXBpLT5nbFN0ZW5jaWxPcChmYWlsLCB6ZmFpbCwgenBhc3MpOworfQorCisKK3ZvaWQgU3RlbmNpbE9wU2VwYXJhdGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlN0ZW5jaWxPcFNlcGFyYXRlQ2FsbCglcCwgJXMgKDB4JXgpLCAlcyAoMHgleCksICVzICgweCV4KSwgJXMgKDB4JXgpKSIsIGMsIEdldEVudW1TdHJpbmcoZmFjZSksIGZhY2UsIEdldEVudW1TdHJpbmcoZmFpbCksIGZhaWwsIEdldEVudW1TdHJpbmcoemZhaWwpLCB6ZmFpbCwgR2V0RW51bVN0cmluZyh6cGFzcyksIHpwYXNzKTsKKyAgcmV0dXJuIF9hcGktPmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKK30KKworCit2b2lkIFRleEltYWdlMkRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkKiBwaXhlbHMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVGV4SW1hZ2UyRENhbGwoJXAsICVzICgweCV4KSwgJWQsICVkLCAlemQsICV6ZCwgJWQsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIEdldEVudW1TdHJpbmcoZm9ybWF0KSwgZm9ybWF0LCBHZXRFbnVtU3RyaW5nKHR5cGUpLCB0eXBlLCBwaXhlbHMpOworICByZXR1cm4gX2FwaS0+Z2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKK30KKworCit2b2lkIFRleFBhcmFtZXRlcmZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVGV4UGFyYW1ldGVyZkNhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlZikiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbSk7CisgIHJldHVybiBfYXBpLT5nbFRleFBhcmFtZXRlcmYodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCisKK3ZvaWQgVGV4UGFyYW1ldGVyZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcykgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJUZXhQYXJhbWV0ZXJmdkNhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbXMpOworICByZXR1cm4gX2FwaS0+Z2xUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOworfQorCisKK3ZvaWQgVGV4UGFyYW1ldGVyaUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVGV4UGFyYW1ldGVyaUNhbGwoJXAsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlZCkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgR2V0RW51bVN0cmluZyhwbmFtZSksIHBuYW1lLCBwYXJhbSk7CisgIHJldHVybiBfYXBpLT5nbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOworfQorCisKK3ZvaWQgVGV4UGFyYW1ldGVyaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVGV4UGFyYW1ldGVyaXZDYWxsKCVwLCAlcyAoMHgleCksICVzICgweCV4KSwgJXApIiwgYywgR2V0RW51bVN0cmluZyh0YXJnZXQpLCB0YXJnZXQsIEdldEVudW1TdHJpbmcocG5hbWUpLCBwbmFtZSwgcGFyYW1zKTsKKyAgcmV0dXJuIF9hcGktPmdsVGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKK30KKworCit2b2lkIFRleFN1YkltYWdlMkRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkKiBwaXhlbHMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVGV4U3ViSW1hZ2UyRENhbGwoJXAsICVzICgweCV4KSwgJWQsICVkLCAlZCwgJXpkLCAlemQsICVzICgweCV4KSwgJXMgKDB4JXgpLCAlcCkiLCBjLCBHZXRFbnVtU3RyaW5nKHRhcmdldCksIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIEdldEVudW1TdHJpbmcoZm9ybWF0KSwgZm9ybWF0LCBHZXRFbnVtU3RyaW5nKHR5cGUpLCB0eXBlLCBwaXhlbHMpOworICByZXR1cm4gX2FwaS0+Z2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKK30KKworCit2b2lkIFVuaWZvcm0xZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTFmQ2FsbCglcCwgJWQsICVmKSIsIGMsIGxvY2F0aW9uLCB4KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB4KTsKK30KKworCit2b2lkIFVuaWZvcm0xZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtMWZ2Q2FsbCglcCwgJWQsICV6ZCwgJXApIiwgYywgbG9jYXRpb24sIGNvdW50LCB2KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTFmdihsb2NhdGlvbiwgY291bnQsIHYpOworfQorCisKK3ZvaWQgVW5pZm9ybTFpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTFpQ2FsbCglcCwgJWQsICVkKSIsIGMsIGxvY2F0aW9uLCB4KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTFpKGxvY2F0aW9uLCB4KTsKK30KKworCit2b2lkIFVuaWZvcm0xaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTFpdkNhbGwoJXAsICVkLCAlemQsICVwKSIsIGMsIGxvY2F0aW9uLCBjb3VudCwgdik7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm0xaXYobG9jYXRpb24sIGNvdW50LCB2KTsKK30KKworCit2b2lkIFVuaWZvcm0yZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtMmZDYWxsKCVwLCAlZCwgJWYsICVmKSIsIGMsIGxvY2F0aW9uLCB4LCB5KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB4LCB5KTsKK30KKworCit2b2lkIFVuaWZvcm0yZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtMmZ2Q2FsbCglcCwgJWQsICV6ZCwgJXApIiwgYywgbG9jYXRpb24sIGNvdW50LCB2KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTJmdihsb2NhdGlvbiwgY291bnQsIHYpOworfQorCisKK3ZvaWQgVW5pZm9ybTJpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTJpQ2FsbCglcCwgJWQsICVkLCAlZCkiLCBjLCBsb2NhdGlvbiwgeCwgeSk7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm0yaShsb2NhdGlvbiwgeCwgeSk7Cit9CisKKwordm9pZCBVbmlmb3JtMml2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlVuaWZvcm0yaXZDYWxsKCVwLCAlZCwgJXpkLCAlcCkiLCBjLCBsb2NhdGlvbiwgY291bnQsIHYpOworICByZXR1cm4gX2FwaS0+Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBjb3VudCwgdik7Cit9CisKKwordm9pZCBVbmlmb3JtM2ZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtM2ZDYWxsKCVwLCAlZCwgJWYsICVmLCAlZikiLCBjLCBsb2NhdGlvbiwgeCwgeSwgeik7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm0zZihsb2NhdGlvbiwgeCwgeSwgeik7Cit9CisKKwordm9pZCBVbmlmb3JtM2Z2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTNmdkNhbGwoJXAsICVkLCAlemQsICVwKSIsIGMsIGxvY2F0aW9uLCBjb3VudCwgdik7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm0zZnYobG9jYXRpb24sIGNvdW50LCB2KTsKK30KKworCit2b2lkIFVuaWZvcm0zaUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlVuaWZvcm0zaUNhbGwoJXAsICVkLCAlZCwgJWQsICVkKSIsIGMsIGxvY2F0aW9uLCB4LCB5LCB6KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTNpKGxvY2F0aW9uLCB4LCB5LCB6KTsKK30KKworCit2b2lkIFVuaWZvcm0zaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTNpdkNhbGwoJXAsICVkLCAlemQsICVwKSIsIGMsIGxvY2F0aW9uLCBjb3VudCwgdik7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm0zaXYobG9jYXRpb24sIGNvdW50LCB2KTsKK30KKworCit2b2lkIFVuaWZvcm00ZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTRmQ2FsbCglcCwgJWQsICVmLCAlZiwgJWYsICVmKSIsIGMsIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKK30KKworCit2b2lkIFVuaWZvcm00ZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtNGZ2Q2FsbCglcCwgJWQsICV6ZCwgJXApIiwgYywgbG9jYXRpb24sIGNvdW50LCB2KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgY291bnQsIHYpOworfQorCisKK3ZvaWQgVW5pZm9ybTRpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTRpQ2FsbCglcCwgJWQsICVkLCAlZCwgJWQsICVkKSIsIGMsIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybTRpKGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKK30KKworCit2b2lkIFVuaWZvcm00aXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybTRpdkNhbGwoJXAsICVkLCAlemQsICVwKSIsIGMsIGxvY2F0aW9uLCBjb3VudCwgdik7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm00aXYobG9jYXRpb24sIGNvdW50LCB2KTsKK30KKworCit2b2lkIFVuaWZvcm1NYXRyaXgyZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVW5pZm9ybU1hdHJpeDJmdkNhbGwoJXAsICVkLCAlemQsICVkLCAlcCkiLCBjLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOworICByZXR1cm4gX2FwaS0+Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Cit9CisKKwordm9pZCBVbmlmb3JtTWF0cml4M2Z2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlVuaWZvcm1NYXRyaXgzZnZDYWxsKCVwLCAlZCwgJXpkLCAlZCwgJXApIiwgYywgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKKyAgcmV0dXJuIF9hcGktPmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOworfQorCisKK3ZvaWQgVW5pZm9ybU1hdHJpeDRmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVbmlmb3JtTWF0cml4NGZ2Q2FsbCglcCwgJWQsICV6ZCwgJWQsICVwKSIsIGMsIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7CisgIHJldHVybiBfYXBpLT5nbFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKK30KKworCit2b2lkIFVzZVByb2dyYW1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJVc2VQcm9ncmFtQ2FsbCglcCwgJXUpIiwgYywgcHJvZ3JhbSk7CisgIHJldHVybiBfYXBpLT5nbFVzZVByb2dyYW0ocHJvZ3JhbSk7Cit9CisKKwordm9pZCBWYWxpZGF0ZVByb2dyYW1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJWYWxpZGF0ZVByb2dyYW1DYWxsKCVwLCAldSkiLCBjLCBwcm9ncmFtKTsKKyAgcmV0dXJuIF9hcGktPmdsVmFsaWRhdGVQcm9ncmFtKHByb2dyYW0pOworfQorCisKK3ZvaWQgVmVydGV4QXR0cmliMWZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlZlcnRleEF0dHJpYjFmQ2FsbCglcCwgJXUsICVmKSIsIGMsIGluZHgsIHgpOworICByZXR1cm4gX2FwaS0+Z2xWZXJ0ZXhBdHRyaWIxZihpbmR4LCB4KTsKK30KKworCit2b2lkIFZlcnRleEF0dHJpYjFmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliMWZ2Q2FsbCglcCwgJXUsICVwKSIsIGMsIGluZHgsIHZhbHVlcyk7CisgIHJldHVybiBfYXBpLT5nbFZlcnRleEF0dHJpYjFmdihpbmR4LCB2YWx1ZXMpOworfQorCisKK3ZvaWQgVmVydGV4QXR0cmliMmZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliMmZDYWxsKCVwLCAldSwgJWYsICVmKSIsIGMsIGluZHgsIHgsIHkpOworICByZXR1cm4gX2FwaS0+Z2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB4LCB5KTsKK30KKworCit2b2lkIFZlcnRleEF0dHJpYjJmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliMmZ2Q2FsbCglcCwgJXUsICVwKSIsIGMsIGluZHgsIHZhbHVlcyk7CisgIHJldHVybiBfYXBpLT5nbFZlcnRleEF0dHJpYjJmdihpbmR4LCB2YWx1ZXMpOworfQorCisKK3ZvaWQgVmVydGV4QXR0cmliM2ZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJWZXJ0ZXhBdHRyaWIzZkNhbGwoJXAsICV1LCAlZiwgJWYsICVmKSIsIGMsIGluZHgsIHgsIHksIHopOworICByZXR1cm4gX2FwaS0+Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB4LCB5LCB6KTsKK30KKworCit2b2lkIFZlcnRleEF0dHJpYjNmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliM2Z2Q2FsbCglcCwgJXUsICVwKSIsIGMsIGluZHgsIHZhbHVlcyk7CisgIHJldHVybiBfYXBpLT5nbFZlcnRleEF0dHJpYjNmdihpbmR4LCB2YWx1ZXMpOworfQorCisKK3ZvaWQgVmVydGV4QXR0cmliNGZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSB7CisgIGVtdWdsOjpDb250ZXh0R1BVKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8ZW11Z2w6OkNvbnRleHRHUFUqPihjLT5JbXBsKCkpOworICBDb250ZXh0QXV0b0xvY2sgbG9jayhjb250ZXh0KTsKKyAgY29uc3QgR3JhcGhpY3NBcGlzKiBhbmdsZV9hcGlzID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdyYXBoaWNzQXBpcyo+KGMtPkFwaXMoKSk7CisgIGNvbnN0IEFOR0xFX0dMRVMyKiBfYXBpID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEFOR0xFX0dMRVMyKj4oYW5nbGVfYXBpcy0+YW5nbGUpOworICBEUFJJTlQoIlZlcnRleEF0dHJpYjRmQ2FsbCglcCwgJXUsICVmLCAlZiwgJWYsICVmKSIsIGMsIGluZHgsIHgsIHksIHosIHcpOworICByZXR1cm4gX2FwaS0+Z2xWZXJ0ZXhBdHRyaWI0ZihpbmR4LCB4LCB5LCB6LCB3KTsKK30KKworCit2b2lkIFZlcnRleEF0dHJpYjRmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliNGZ2Q2FsbCglcCwgJXUsICVwKSIsIGMsIGluZHgsIHZhbHVlcyk7CisgIHJldHVybiBfYXBpLT5nbFZlcnRleEF0dHJpYjRmdihpbmR4LCB2YWx1ZXMpOworfQorCisKK3ZvaWQgVmVydGV4QXR0cmliUG9pbnRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCB2b2lkKiBwdHIpIHsKKyAgZW11Z2w6OkNvbnRleHRHUFUqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxlbXVnbDo6Q29udGV4dEdQVSo+KGMtPkltcGwoKSk7CisgIENvbnRleHRBdXRvTG9jayBsb2NrKGNvbnRleHQpOworICBjb25zdCBHcmFwaGljc0FwaXMqIGFuZ2xlX2FwaXMgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR3JhcGhpY3NBcGlzKj4oYy0+QXBpcygpKTsKKyAgY29uc3QgQU5HTEVfR0xFUzIqIF9hcGkgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgQU5HTEVfR0xFUzIqPihhbmdsZV9hcGlzLT5hbmdsZSk7CisgIERQUklOVCgiVmVydGV4QXR0cmliUG9pbnRlckNhbGwoJXAsICV1LCAlZCwgJXMgKDB4JXgpLCAlZCwgJXpkLCAlcCkiLCBjLCBpbmR4LCBzaXplLCBHZXRFbnVtU3RyaW5nKHR5cGUpLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHB0cik7CisgIHJldHVybiBfYXBpLT5nbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCBwdHIpOworfQorCisKK3ZvaWQgVmlld3BvcnRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgeworICBlbXVnbDo6Q29udGV4dEdQVSogY29udGV4dCA9IHN0YXRpY19jYXN0PGVtdWdsOjpDb250ZXh0R1BVKj4oYy0+SW1wbCgpKTsKKyAgQ29udGV4dEF1dG9Mb2NrIGxvY2soY29udGV4dCk7CisgIGNvbnN0IEdyYXBoaWNzQXBpcyogYW5nbGVfYXBpcyA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHcmFwaGljc0FwaXMqPihjLT5BcGlzKCkpOworICBjb25zdCBBTkdMRV9HTEVTMiogX2FwaSA9CisgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBTkdMRV9HTEVTMio+KGFuZ2xlX2FwaXMtPmFuZ2xlKTsKKyAgRFBSSU5UKCJWaWV3cG9ydENhbGwoJXAsICVkLCAlZCwgJXpkLCAlemQpIiwgYywgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgIHJldHVybiBfYXBpLT5nbFZpZXdwb3J0KHgsIHksIHdpZHRoLCBoZWlnaHQpOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9wYXNzX3Rocm91Z2guaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Bhc3NfdGhyb3VnaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNGUwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9wYXNzX3Rocm91Z2guaApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIEFVVE9HRU5FUkFURUQgQ09ERS4gIERPIE5PVCBFRElULgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1BBU1NfVEhST1VHSF9IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1BBU1NfVEhST1VHSF9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9nbGRlZnMuaCIKKworCitjbGFzcyBHbGVzQ29udGV4dDsKK3N0cnVjdCBBTkdMRV9HTEVTMjsKKworI2RlZmluZSBQQVNTX1RIUk9VR0goX2NvbnRleHQsIF9uYW1lLCAuLi4pIFwKKyAgICBfbmFtZSMjQ2FsbChfY29udGV4dCwgIyNfX1ZBX0FSR1NfXykKKworCit2b2lkIEFjdGl2ZVRleHR1cmVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGV4dHVyZSk7Cit2b2lkIEF0dGFjaFNoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3ZvaWQgQmluZEF0dHJpYkxvY2F0aW9uQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgY2hhciogbmFtZSk7Cit2b2lkIEJpbmRCdWZmZXJDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKK3ZvaWQgQmluZEZyYW1lYnVmZmVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK3ZvaWQgQmluZFJlbmRlcmJ1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordm9pZCBCaW5kVGV4dHVyZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3ZvaWQgQmxlbmRDb2xvckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3ZvaWQgQmxlbmRFcXVhdGlvbkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBtb2RlKTsKK3ZvaWQgQmxlbmRFcXVhdGlvblNlcGFyYXRlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordm9pZCBCbGVuZEZ1bmNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOwordm9pZCBCbGVuZEZ1bmNTZXBhcmF0ZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKK3ZvaWQgQnVmZmVyRGF0YUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKTsKK3ZvaWQgQnVmZmVyU3ViRGF0YUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCB2b2lkKiBkYXRhKTsKK0dMZW51bSBDaGVja0ZyYW1lYnVmZmVyU3RhdHVzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCk7Cit2b2lkIENsZWFyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xiaXRmaWVsZCBtYXNrKTsKK3ZvaWQgQ2xlYXJDb2xvckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3ZvaWQgQ2xlYXJEZXB0aGZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGNsYW1wZiBkZXB0aCk7Cit2b2lkIENsZWFyU3RlbmNpbENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IHMpOwordm9pZCBDb2xvck1hc2tDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOwordm9pZCBDb21waWxlU2hhZGVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlcik7Cit2b2lkIENvbXByZXNzZWRUZXhJbWFnZTJEQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQqIGRhdGEpOwordm9pZCBDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IHZvaWQqIGRhdGEpOwordm9pZCBDb3B5VGV4SW1hZ2UyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordm9pZCBDb3B5VGV4U3ViSW1hZ2UyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7CitHTHVpbnQgQ3JlYXRlUHJvZ3JhbUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMpOworR0x1aW50IENyZWF0ZVNoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0eXBlKTsKK3ZvaWQgQ3VsbEZhY2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbW9kZSk7Cit2b2lkIERlbGV0ZUJ1ZmZlcnNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycyk7Cit2b2lkIERlbGV0ZUZyYW1lYnVmZmVyc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordm9pZCBEZWxldGVQcm9ncmFtQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0pOwordm9pZCBEZWxldGVSZW5kZXJidWZmZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwordm9pZCBEZWxldGVTaGFkZXJDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgc2hhZGVyKTsKK3ZvaWQgRGVsZXRlVGV4dHVyZXNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpOwordm9pZCBEZXB0aEZ1bmNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZnVuYyk7Cit2b2lkIERlcHRoTWFza0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMYm9vbGVhbiBmbGFnKTsKK3ZvaWQgRGVwdGhSYW5nZWZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Cit2b2lkIERldGFjaFNoYWRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3ZvaWQgRGlzYWJsZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBjYXApOwordm9pZCBEaXNhYmxlVmVydGV4QXR0cmliQXJyYXlDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgpOwordm9pZCBEcmF3QXJyYXlzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3ZvaWQgRHJhd0VsZW1lbnRzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkKiBpbmRpY2VzKTsKK3ZvaWQgRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3ZvaWQgRW5hYmxlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIGNhcCk7Cit2b2lkIEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IGluZGV4KTsKK3ZvaWQgRmluaXNoQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYyk7Cit2b2lkIEZsdXNoQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYyk7Cit2b2lkIEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwordm9pZCBGcmFtZWJ1ZmZlclRleHR1cmUyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordm9pZCBGcm9udEZhY2VDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbW9kZSk7Cit2b2lkIEdlbkJ1ZmZlcnNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIEdMdWludCogYnVmZmVycyk7Cit2b2lkIEdlbmVyYXRlTWlwbWFwQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCk7Cit2b2lkIEdlbkZyYW1lYnVmZmVyc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordm9pZCBHZW5SZW5kZXJidWZmZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwordm9pZCBHZW5UZXh0dXJlc0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcyk7Cit2b2lkIEdldEFjdGl2ZUF0dHJpYkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBjaGFyKiBuYW1lKTsKK3ZvaWQgR2V0QWN0aXZlVW5pZm9ybUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBjaGFyKiBuYW1lKTsKK3ZvaWQgR2V0QXR0YWNoZWRTaGFkZXJzQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpOworR0xpbnQgR2V0QXR0cmliTG9jYXRpb25DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgY2hhciogbmFtZSk7Cit2b2lkIEdldEJvb2xlYW52Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcyk7Cit2b2lkIEdldEJ1ZmZlclBhcmFtZXRlcml2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK0dMZW51bSBHZXRFcnJvckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMpOwordm9pZCBHZXRGbG9hdHZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIEdldEludGVnZXJ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK3ZvaWQgR2V0UHJvZ3JhbWl2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIEdldFByb2dyYW1JbmZvTG9nQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBjaGFyKiBpbmZvbG9nKTsKK3ZvaWQgR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBHZXRTaGFkZXJpdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIEdldFNoYWRlckluZm9Mb2dDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgY2hhciogaW5mb2xvZyk7Cit2b2lkIEdldFNoYWRlclByZWNpc2lvbkZvcm1hdENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKTsKK3ZvaWQgR2V0U2hhZGVyU291cmNlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIGNoYXIqIHNvdXJjZSk7Citjb25zdCBHTHVieXRlKiBHZXRTdHJpbmdDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gbmFtZSk7Cit2b2lkIEdldFRleFBhcmFtZXRlcmZ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwordm9pZCBHZXRUZXhQYXJhbWV0ZXJpdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIEdldFVuaWZvcm1mdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgR2V0VW5pZm9ybWl2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKTsKK0dMaW50IEdldFVuaWZvcm1Mb2NhdGlvbkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtLCBjb25zdCBjaGFyKiBuYW1lKTsKK3ZvaWQgR2V0VmVydGV4QXR0cmliZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgR2V0VmVydGV4QXR0cmliaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIHZvaWQqKiBwb2ludGVyKTsKK3ZvaWQgSGludENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMYm9vbGVhbiBJc0J1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBidWZmZXIpOworR0xib29sZWFuIElzRW5hYmxlZENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBjYXApOworR0xib29sZWFuIElzUHJvZ3JhbUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtKTsKK0dMYm9vbGVhbiBJc1JlbmRlcmJ1ZmZlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCByZW5kZXJidWZmZXIpOworR0xib29sZWFuIElzU2hhZGVyQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHNoYWRlcik7CitHTGJvb2xlYW4gSXNUZXh0dXJlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHRleHR1cmUpOwordm9pZCBMaW5lV2lkdGhDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGZsb2F0IHdpZHRoKTsKK3ZvaWQgTGlua1Byb2dyYW1DYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgcHJvZ3JhbSk7Cit2b2lkIFBpeGVsU3RvcmVpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIFBvbHlnb25PZmZzZXRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Cit2b2lkIFJlYWRQaXhlbHNDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIHZvaWQqIHBpeGVscyk7Cit2b2lkIFJlbGVhc2VTaGFkZXJDb21waWxlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMpOwordm9pZCBSZW5kZXJidWZmZXJTdG9yYWdlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit2b2lkIFNhbXBsZUNvdmVyYWdlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordm9pZCBTY2lzc29yQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordm9pZCBTaGFkZXJCaW5hcnlDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3Qgdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7Cit2b2lkIFNoYWRlclNvdXJjZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IGNoYXIqKiBzdHIsIGNvbnN0IEdMaW50KiBsZW5ndGgpOwordm9pZCBTdGVuY2lsRnVuY0NhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK3ZvaWQgU3RlbmNpbEZ1bmNTZXBhcmF0ZUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit2b2lkIFN0ZW5jaWxNYXNrQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IG1hc2spOwordm9pZCBTdGVuY2lsTWFza1NlcGFyYXRlQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKK3ZvaWQgU3RlbmNpbE9wQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK3ZvaWQgU3RlbmNpbE9wU2VwYXJhdGVDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK3ZvaWQgVGV4SW1hZ2UyRENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IHZvaWQqIHBpeGVscyk7Cit2b2lkIFRleFBhcmFtZXRlcmZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordm9pZCBUZXhQYXJhbWV0ZXJmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgVGV4UGFyYW1ldGVyaUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwordm9pZCBUZXhQYXJhbWV0ZXJpdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIFRleFN1YkltYWdlMkRDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCB2b2lkKiBwaXhlbHMpOwordm9pZCBVbmlmb3JtMWZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKK3ZvaWQgVW5pZm9ybTFmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgVW5pZm9ybTFpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwordm9pZCBVbmlmb3JtMWl2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgVW5pZm9ybTJmQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3ZvaWQgVW5pZm9ybTJmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgVW5pZm9ybTJpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwordm9pZCBVbmlmb3JtMml2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgVW5pZm9ybTNmQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordm9pZCBVbmlmb3JtM2Z2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwordm9pZCBVbmlmb3JtM2lDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit2b2lkIFVuaWZvcm0zaXZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwordm9pZCBVbmlmb3JtNGZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3ZvaWQgVW5pZm9ybTRmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgVW5pZm9ybTRpQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordm9pZCBVbmlmb3JtNGl2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgVW5pZm9ybU1hdHJpeDJmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Cit2b2lkIFVuaWZvcm1NYXRyaXgzZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwordm9pZCBVbmlmb3JtTWF0cml4NGZ2Q2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKK3ZvaWQgVXNlUHJvZ3JhbUNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBwcm9ncmFtKTsKK3ZvaWQgVmFsaWRhdGVQcm9ncmFtQ2FsbChjb25zdCBHbGVzQ29udGV4dCogYywgR0x1aW50IHByb2dyYW0pOwordm9pZCBWZXJ0ZXhBdHRyaWIxZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgpOwordm9pZCBWZXJ0ZXhBdHRyaWIxZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgVmVydGV4QXR0cmliMmZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordm9pZCBWZXJ0ZXhBdHRyaWIyZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgVmVydGV4QXR0cmliM2ZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIFZlcnRleEF0dHJpYjNmdkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwordm9pZCBWZXJ0ZXhBdHRyaWI0ZkNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordm9pZCBWZXJ0ZXhBdHRyaWI0ZnZDYWxsKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgVmVydGV4QXR0cmliUG9pbnRlckNhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCB2b2lkKiBwdHIpOwordm9pZCBWaWV3cG9ydENhbGwoY29uc3QgR2xlc0NvbnRleHQqIGMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKKy8vIFRPRE86IFJFUExBQ0UgRk9MTE9XSU5HIEFQSSBDQUxMUyBXSVRIIEdMRVMtU1BFQ0lGSUMKK3ZvaWQqIE1hcFRleFN1YkltYWdlMkRDSFJPTUlVTUNhbGwgKGNvbnN0IEdsZXNDb250ZXh0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xlbnVtIGFjY2Vzcyk7Cit2b2lkICBVbm1hcFRleFN1YkltYWdlMkRDSFJPTUlVTUNhbGwgKGNvbnN0IEdsZXNDb250ZXh0KiBjLCBjb25zdCB2b2lkKiBtZW0pOwordm9pZCogTWFwQnVmZmVyU3ViRGF0YUNIUk9NSVVNQ2FsbCAoR0x1aW50IHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaXB0ciBzaXplLCBHTGVudW0gYWNjZXNzKTsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1BBU1NfVEhST1VHSF9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcHJvZ3JhbV9kYXRhLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3YWFiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fZGF0YS5jcHAKQEAgLTAsMCArMSw3MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2xlcy9wcm9ncmFtX2RhdGEuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorCisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJnbGVzL21hY3Jvcy5oIgorI2luY2x1ZGUgImdsZXMvc2hhZGVyX2RhdGEuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2s7CisKK3N0YXRpYyBHbGVzQ29udGV4dCogR2V0UmVxdWlyZWRDb250ZXh0KCkgeworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoIWN0eCk7CisgIHJldHVybiBjdHg7Cit9CisKK1Byb2dyYW1EYXRhOjpQcm9ncmFtRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkKKyAgOiBPYmplY3REYXRhKFBST0dSQU0sIG5hbWUpLCBjdXJyZW50X3Byb2dyYW1fKG5ldyBQcm9ncmFtVmFyaWFudCgpKSwKKyAgICB1bmlmb3JtX2xvY2F0aW9uX2dlbl8oMCksIGhhc19saW5rX2ZhaWx1cmVfKGZhbHNlKSwKKyAgICBoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXyhmYWxzZSksIHVzZV9jb3VudF8oMCksCisgICAgdW5pZm9ybV9yZXZpc2lvbl9nZW5fKDApLCB2YWxpZGF0aW9uX3N0YXR1c18oR0xfRkFMU0UpIHsKK30KKworUHJvZ3JhbURhdGE6On5Qcm9ncmFtRGF0YSgpIHsKKyAgaWYgKHVzZV9jb3VudF8pIHsKKyAgICBBTE9HRSgiUHJvZ3JhbURhdGEgZGVzdHJveWVkIHdoaWxlIHVzZSBjb3VudCBpcyAlZCIsIHVzZV9jb3VudF8pOworICB9CisgIENsZWFyVW5pZm9ybUNhY2hlTG9ja2VkKCk7Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6Ok1vZGlmeVByb2dyYW1Mb2NrZWQoKSB7CisgIGlmIChsaW5rZWRfcHJvZ3JhbXNfLmVtcHR5KCkgfHwKKyAgICAgIGN1cnJlbnRfcHJvZ3JhbV8gIT0gbGlua2VkX3Byb2dyYW1zX1swXS5HZXRQcm9ncmFtKCkpIHsKKyAgICByZXR1cm47ICAvLyBBbHJlYWR5IG1vZGlmeWluZyBhIG5ldyBwcm9ncmFtIHZhcmlhbnQuCisgIH0KKyAgLy8gVGhlIHByb2dyYW0gaGFzIGJlZW4gbGlua2VkIGFuZCBtYXkgYmUgaW4gdXNlLiBDcmVhdGUgYSBuZXcgb25lLgorICBjdXJyZW50X3Byb2dyYW1fID0gUHJvZ3JhbVZhcmlhbnRQdHIoCisgICAgICBsaW5rZWRfcHJvZ3JhbXNfWzBdLkdldFByb2dyYW0oKS0+Q2xvbmUoKSk7CisgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkyOCk6IFN1cHBvcnQgYSBjYXNlIHdoZXJlIGEgbGlua2VkIHByb2dyYW0gZ2V0cworICAvLyBtb2RpZmllZCwgaXRzIGNvbXBpbGVkIHNoYWRlciBpcyByZS1hdHRhY2hlZCwgYW5kIHRoZW4gc2hhZGVyIHNvdXJjZQorICAvLyBpcyB1cGRhdGVkLgorfQorCit2b2lkIFByb2dyYW1EYXRhOjpBdHRhY2hTaGFkZXIoY29uc3QgU2hhZGVyRGF0YVB0ciYgc2hhZGVyKSB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICAvLyBDaGVjayB0eXBlIGNvcnJlY3RuZXNzIGFuZCB0aGF0IHRoZXJlIGlzIG5vIGV4aXN0aW5nIHNoYWRlciB3aXRoIHRoYXQgdHlwZS4KKyAgT2JqZWN0VHlwZSB0eXBlID0gc2hhZGVyLT5HZXREYXRhVHlwZSgpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHR5cGUgIT0gVkVSVEVYX1NIQURFUiAmJiB0eXBlICE9IEZSQUdNRU5UX1NIQURFUik7CisgIGZvciAoU2hhZGVyTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaGFkZXJzXy5iZWdpbigpOworICAgICAgICBpdCAhPSBzaGFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIGlmICgoKml0KS0+R2V0RGF0YVR5cGUoKSA9PSB0eXBlKSB7CisgICAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLAorICAgICAgICAgICAgICAgICAiU2hhZGVyIG9mIHR5cGUgJyVzJyBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIiwKKyAgICAgICAgICAgICAgICAgR2V0RW51bVN0cmluZyh0eXBlKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gQWRkIHNoYWRlciB0byB0aGUgbGlzdCBhbmQgdG8gdGhlIGN1cnJlbnRseS1idWlsdCBwcm9ncmFtIHZhcmlhbnQuCisgIE1vZGlmeVByb2dyYW1Mb2NrZWQoKTsKKyAgc2hhZGVyc18ucHVzaF9iYWNrKHNoYWRlcik7CisgIGN1cnJlbnRfcHJvZ3JhbV8tPkF0dGFjaFNoYWRlcihzaGFkZXItPkdldFNoYWRlclZhcmlhbnQoKSk7Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6OkRldGFjaFNoYWRlcihjb25zdCBTaGFkZXJEYXRhUHRyJiBzaGFkZXIpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgZm9yIChTaGFkZXJMaXN0OjppdGVyYXRvciBpdCA9IHNoYWRlcnNfLmJlZ2luKCk7CisgICAgICBpdCAhPSBzaGFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChzaGFkZXIgPT0gKml0KSB7CisgICAgICBzaGFkZXJzXy5lcmFzZShpdCk7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJUaGUgc2hhZGVyIGhhcyBub3QgYmVlbiBhdHRhY2hlZCIpOworICAgIHJldHVybjsKKyAgfQorICBNb2RpZnlQcm9ncmFtTG9ja2VkKCk7CisgIGN1cnJlbnRfcHJvZ3JhbV8tPkRldGFjaFNoYWRlcihzaGFkZXItPkdldFNoYWRlclZhcmlhbnQoKSk7Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6OkdldEF0dGFjaGVkU2hhZGVycyhHTHNpemVpIG1heF9jb3VudCwgR0xzaXplaSogY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50KiBzaGFkZXJzKSBjb25zdCB7CisgIGludCBpID0gMDsKKyAgZm9yIChTaGFkZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNoYWRlcnNfLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IHNoYWRlcnNfLmVuZCgpICYmIGkgPCBtYXhfY291bnQ7ICsraXQpIHsKKyAgICBzaGFkZXJzW2ldID0gKCppdCktPkdldExvY2FsTmFtZSgpOworICAgICsraTsKKyAgfQorICBpZiAoY291bnQpIHsKKyAgICAqY291bnQgPSBpOworICB9Cit9CisKK1Byb2dyYW1WYXJpYW50UHRyIFByb2dyYW1EYXRhOjpHZXRQcm9ncmFtV2l0aExpbmtBdHRlbXB0TG9ja2VkKCkgY29uc3QgeworICBpZiAoY3VycmVudF9wcm9ncmFtXy0+SXNMaW5rQXR0ZW1wdGVkKCkpIHsKKyAgICByZXR1cm4gY3VycmVudF9wcm9ncmFtXzsKKyAgfQorICBpZiAoIWxpbmtlZF9wcm9ncmFtc18uZW1wdHkoKSkgeworICAgIHJldHVybiBsaW5rZWRfcHJvZ3JhbXNfWzBdLkdldFByb2dyYW0oKTsKKyAgfQorICByZXR1cm4gUHJvZ3JhbVZhcmlhbnRQdHIoKTsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6R2V0UHJvZ3JhbWl2KEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgY29uc3QgeworICBBdXRvTG9jayBsb2NrKGxvY2tfKTsKKyAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgR0xfREVMRVRFX1NUQVRVUzoKKyAgICAgICpwYXJhbXMgPSBHTF9GQUxTRTsgIC8vIE5vdCBzdXBwb3J0ZWQgKGNyYnVnLmNvbS80MjQzNTMpLgorICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTkZPX0xPR19MRU5HVEg6CisgICAgICAqcGFyYW1zID0gY3VycmVudF9wcm9ncmFtXy0+R2V0SW5mb0xvZygpLnNpemUoKSArIDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FUVEFDSEVEX1NIQURFUlM6CisgICAgICAqcGFyYW1zID0gc2hhZGVyc18uc2l6ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9MSU5LX1NUQVRVUzoKKyAgICAgICpwYXJhbXMgPSAoIWxpbmtlZF9wcm9ncmFtc18uZW1wdHkoKSAmJiAhaGFzX2xpbmtfZmFpbHVyZV8gPworICAgICAgICAgIEdMX1RSVUUgOiBHTF9GQUxTRSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1ZBTElEQVRFX1NUQVRVUzoKKyAgICAgICpwYXJhbXMgPSB2YWxpZGF0aW9uX3N0YXR1c187CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FDVElWRV9BVFRSSUJVVEVTOiB7CisgICAgICBQcm9ncmFtVmFyaWFudFB0ciBwcm9ncmFtID0gR2V0UHJvZ3JhbVdpdGhMaW5rQXR0ZW1wdExvY2tlZCgpOworICAgICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgeworICAgICAgICAqcGFyYW1zID0gcHJvZ3JhbS0+R2V0QWN0aXZlQXR0cmliQ291bnQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwYXJhbXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIOiB7CisgICAgICBQcm9ncmFtVmFyaWFudFB0ciBwcm9ncmFtID0gR2V0UHJvZ3JhbVdpdGhMaW5rQXR0ZW1wdExvY2tlZCgpOworICAgICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgeworICAgICAgICAqcGFyYW1zID0gcHJvZ3JhbS0+R2V0QWN0aXZlQXR0cmliTWF4TmFtZUxlbmdoKCkgKyAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBhcmFtcyA9IDA7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHTF9BQ1RJVkVfVU5JRk9STVM6IHsKKyAgICAgIFByb2dyYW1WYXJpYW50UHRyIHByb2dyYW0gPSBHZXRQcm9ncmFtV2l0aExpbmtBdHRlbXB0TG9ja2VkKCk7CisgICAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7CisgICAgICAgICpwYXJhbXMgPSBwcm9ncmFtLT5HZXRBY3RpdmVVbmlmb3JtQ291bnQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwYXJhbXMgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSDogeworICAgICAgUHJvZ3JhbVZhcmlhbnRQdHIgcHJvZ3JhbSA9IEdldFByb2dyYW1XaXRoTGlua0F0dGVtcHRMb2NrZWQoKTsKKyAgICAgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKKyAgICAgICAgKnBhcmFtcyA9IHByb2dyYW0tPkdldEFjdGl2ZVVuaWZvcm1NYXhOYW1lTGVuZ2goKSArIDE7CisgICAgICB9IGVsc2UgeworICAgICAgICAqcGFyYW1zID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgR0xFU19FUlJPUl9JTlZBTElEX0VOVU0ocG5hbWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBQcm9ncmFtRGF0YTo6R2V0SW5mb0xvZyhHTHNpemVpIG1heF9sZW5ndGgsIEdMc2l6ZWkqIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xjaGFyKiBpbmZvX2xvZykgY29uc3QgeworICAvLyBVc2UgY3VycmVudCBwcm9ncmFtIGFzIGl0IGVpdGhlciBlcXVhbHMgdG8gdGhlIGxpbmtlZCBwcm9ncmFtLCBvciBtYXkgaGF2ZQorICAvLyBtb3JlIHJlY2VudCBkYXRhIGlmIHRoZXJlIHdlcmUgR0wgY2FsbHMgYWZ0ZXIgbGlua2luZy4KKyAgaW50IGluZm9fbGVuID0gc25wcmludGYoaW5mb19sb2csIG1heF9sZW5ndGgsICIlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcHJvZ3JhbV8tPkdldEluZm9Mb2coKS5jX3N0cigpKTsKKyAgaWYgKGluZm9fbGVuID49IG1heF9sZW5ndGgpIHsKKyAgICBpbmZvX2xlbiA9IG1heF9sZW5ndGggLSAxOyAgLy8gVGV4dCB3YXMgdHJ1bmNhdGVkLgorICB9CisgIGlmIChsZW5ndGgpIHsKKyAgICAqbGVuZ3RoID0gaW5mb19sZW47CisgIH0KK30KKwordm9pZCBQcm9ncmFtRGF0YTo6TGluaygpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmIChjdXJyZW50X3Byb2dyYW1fLT5Jc0xpbmtlZCgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgY3VycmVudF9wcm9ncmFtXy0+TGluaygpOworICBoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXyA9IGZhbHNlOworICBoYXNfbGlua19mYWlsdXJlXyA9ICFjdXJyZW50X3Byb2dyYW1fLT5Jc0xpbmtlZCgpOworICBpZiAoIWhhc19saW5rX2ZhaWx1cmVfKSB7CisgICAgU2V0TGlua2VkUHJvZ3JhbUxvY2tlZChjdXJyZW50X3Byb2dyYW1fKTsKKyAgICByZXR1cm47CisgIH0KKworICBBTE9HRSgiVW5hYmxlIHRvIGxpbmsgcHJvZ3JhbSAlZCglZClcbiVzIiwgR2V0TG9jYWxOYW1lKCksCisgICAgICAgIGN1cnJlbnRfcHJvZ3JhbV8tPkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpLAorICAgICAgICBjdXJyZW50X3Byb2dyYW1fLT5HZXRJbmZvTG9nKCkuY19zdHIoKSk7CisKKyAgaWYgKHVzZV9jb3VudF8gPT0gMCkgeworICAgIFNldExpbmtlZFByb2dyYW1Mb2NrZWQoUHJvZ3JhbVZhcmlhbnRQdHIoTlVMTCkpOworICB9Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6OlNldExpbmtlZFByb2dyYW1Mb2NrZWQoUHJvZ3JhbVZhcmlhbnRQdHIgcHJvZ3JhbSkgeworICAvLyBSZXNldCBhbGwgbWFwcGluZ3MuCisgIGxpbmtlZF9wcm9ncmFtc18uY2xlYXIoKTsKKyAgQ2xlYXJVbmlmb3JtQ2FjaGVMb2NrZWQoKTsKKworICBpZiAocHJvZ3JhbSA9PSBOVUxMKSB7CisgICAgcmV0dXJuOyAgLy8gTm8gbGlua2VkIHByb2dyYW0gZXhpc3RzLgorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ncmFtLT5HZXRBY3RpdmVVbmlmb3JtQ291bnQoKTsgKytpKSB7CisgICAgY29uc3QgUHJvZ3JhbVZhcmlhbnQ6OkFjdGl2ZVVuaWZvcm0mIHVuaWZvcm0gPQorICAgICAgICBwcm9ncmFtLT5HZXRBY3RpdmVVbmlmb3JtKGkpOworICAgIHVuaWZvcm1fY2FjaGVfW3VuaWZvcm0uR2V0QmFzZU5hbWUoKV0gPSBuZXcgQ2FjaGVkVW5pZm9ybSgKKyAgICAgICAgdW5pZm9ybS5HZXRUeXBlKCksIHVuaWZvcm0uSXNBcnJheSgpLCB1bmlmb3JtLkdldEFycmF5U2l6ZSgpKTsKKyAgfQorCisgIGxpbmtlZF9wcm9ncmFtc18ucHVzaF9iYWNrKExpbmtlZFByb2dyYW0ocHJvZ3JhbSkpOworfQorCitib29sIFByb2dyYW1EYXRhOjpVc2UoYm9vbCBlbmFibGUpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmICghZW5hYmxlKSB7CisgICAgLy8gTWF5IGJlIGludm9rZWQgd2l0aG91dCBjdXJyZW50IGNvbnRleHQgZnJvbSBjb250ZXh0IGRlc3RydWN0b3IuCisgICAgLS11c2VfY291bnRfOworICAgIGlmIChoYXNfbGlua19mYWlsdXJlXyAmJiAhbGlua2VkX3Byb2dyYW1zXy5lbXB0eSgpICYmIHVzZV9jb3VudF8gPT0gMCkgeworICAgICAgLy8gZ2xVc2VQcm9ncmFtKCkgc3BlYyBzYXlzIGFuIGFjdGl2ZSBpbi11c2UgcHJvZ3JhbSB0aGF0IGZhaWxlZAorICAgICAgLy8gdG8gcmUtbGluayBzaG91bGQga2VlcCB3b3JraW5nIHVudGlsIGl0IGdvZXMgb3V0IG9mIHVzZS4KKyAgICAgIFNldExpbmtlZFByb2dyYW1Mb2NrZWQoUHJvZ3JhbVZhcmlhbnRQdHIoTlVMTCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAobGlua2VkX3Byb2dyYW1zXy5lbXB0eSgpKSB7CisgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIlNoYWRlciBwcm9ncmFtIGhhcyBub3QgYmVlbiBsaW5rZWQiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgICsrdXNlX2NvdW50XzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6OlByZXBhcmVGb3JSZW5kZXJpbmcoYm9vbCogdXNlc19leHRlcm5hbF9hc18yZCkgeworICBBdXRvTG9jayBsb2NrKGxvY2tfKTsKKyAgTGlua2VkUHJvZ3JhbSogcHJvZ3JhbSA9IEdldExpbmtlZFByb2dyYW1Gb3JSZW5kZXJpbmdMb2NrZWQoKTsKKyAgKnVzZXNfZXh0ZXJuYWxfYXNfMmQgPSBwcm9ncmFtLT5HZXRQcm9ncmFtKCktPlVzZXNFeHRlcm5hbFRleHR1cmVBczJEKCk7CisKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICBHTGludCBnbG9iYWxfcHJvZ3JhbV9uYW1lID0gcHJvZ3JhbS0+R2V0UHJvZ3JhbSgpLT5HZXRPckNyZWF0ZUdsb2JhbE5hbWUoKTsKKyAgUEFTU19USFJPVUdIKGN0eCwgVXNlUHJvZ3JhbSwgZ2xvYmFsX3Byb2dyYW1fbmFtZSk7CisKKyAgUHJvcGFnYXRlVW5pZm9ybVZhbHVlc0xvY2tlZChwcm9ncmFtKTsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6Q2xlYW51cEFmdGVyUmVuZGVyaW5nKCkgeworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIFBBU1NfVEhST1VHSChjdHgsIFVzZVByb2dyYW0sIDApOworfQorCitQcm9ncmFtRGF0YTo6TGlua2VkUHJvZ3JhbSogUHJvZ3JhbURhdGE6OkdldExpbmtlZFByb2dyYW1Gb3JSZW5kZXJpbmdMb2NrZWQoKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYobGlua2VkX3Byb2dyYW1zXy5lbXB0eSgpKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRigKKyAgICAgIGxpbmtlZF9wcm9ncmFtc19bMF0uR2V0R2xvYmFsVGV4dHVyZVRhcmdldCgpICE9IEdMX1RFWFRVUkVfMkQpOworCisgIGlmICghbGlua2VkX3Byb2dyYW1zX1swXS5HZXRQcm9ncmFtKCktPlVzZXNFeHRlcm5hbFRleHR1cmVBczJEKCkpIHsKKyAgICAvLyBUaGUgb3JpZ2luYWwgcHJvZ3JhbSBkaWQgbm90IHVzZSBleHRlcm5hbCBzYW1wbGVyLCBjYW5ub3QgcmV3cml0ZSBpdC4KKyAgICByZXR1cm4gJmxpbmtlZF9wcm9ncmFtc19bMF07CisgIH0KKworICAvLyBMb29rIGZvciB0aGUgdW5pZm9ybXMgdGhhdCByZWZlciBhcHByb3ByaWF0ZSB0ZXh0dXJlIHVuaXRzLgorICBHTGludCB0ZXh0dXJlX3VuaXRfaW5kZXggPSAtMTsKKyAgZm9yIChVbmlmb3JtQ2FjaGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5pZm9ybV9jYWNoZV8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gdW5pZm9ybV9jYWNoZV8uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCBDYWNoZWRVbmlmb3JtKiB1bmlmb3JtID0gaXQtPnNlY29uZDsKKyAgICBpZiAodW5pZm9ybS0+R2V0VHlwZSgpICE9IEdMX1NBTVBMRVJfMkQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAodW5pZm9ybS0+R2V0QXJyYXlTaXplKCkgIT0gMSkgeworICAgICAgaWYgKCFoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXykgeworICAgICAgICBBTE9HVygiU2hhZGVyIHByb2dyYW0gdXNlcyBhIHNhbXBsZXIgYXJyYXksIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAiZm9yIGJhY2tlbmQgdGV4dHVyZSBhZGp1c3RtZW50cyAodXNlZCB3aXRoIEhXIHZpZGVvKSIpOworICAgICAgICBoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXyA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gJmxpbmtlZF9wcm9ncmFtc19bMF07CisgICAgfQorICAgIGlmICh0ZXh0dXJlX3VuaXRfaW5kZXggIT0gLTEpIHsKKyAgICAgIGlmICghaGFzX3dhcm5lZF9hYm91dF9zYW1wbGVyX3VzZV8pIHsKKyAgICAgICAgQUxPR1coIlNoYWRlciBwcm9ncmFtIHVzZXMgbW9yZSB0aGFuIG11bHRpcGxlIGFjdGl2ZSAyRCBzYW1wbGVycywgIgorICAgICAgICAgICAgICAid2hpY2ggaXMgbm90IHN1cHBvcnRlZCBmb3IgYmFja2VuZCB0ZXh0dXJlIGFkanVzdG1lbnRzICIKKyAgICAgICAgICAgICAgIih1c2VkIHdpdGggSFcgdmlkZW8pIik7CisgICAgICAgIGhhc193YXJuZWRfYWJvdXRfc2FtcGxlcl91c2VfID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAmbGlua2VkX3Byb2dyYW1zX1swXTsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighdW5pZm9ybS0+U3RvcmVBc0ludFRvKCZ0ZXh0dXJlX3VuaXRfaW5kZXgpKTsKKyAgfQorCisgIC8vIEZpbmQgdGhlIGdsb2JhbCB0YXJnZXQgZm9yIHRoZSBzYW1wbGVyJ3MgdGV4dHVyZS4KKyAgR0xlbnVtIGdsb2JhbF90YXJnZXQgPSBHTF9URVhUVVJFXzJEOworICBpZiAodGV4dHVyZV91bml0X2luZGV4ICE9IC0xKSB7CisgICAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICAgIGdsb2JhbF90YXJnZXQgPSBjdHgtPnRleHR1cmVfY29udGV4dF8uR2V0R2xvYmFsVGFyZ2V0KAorICAgICAgICBHTF9URVhUVVJFMCArIHRleHR1cmVfdW5pdF9pbmRleCwgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOworICB9CisKKyAgLy8gVGhlIGRlZmF1bHQgcHJvZ3JhbSBpcyBhbHdheXMgdGFyZ2V0aW5nIEdMX1RFWFRVUkVfMkQuCisgIGlmIChnbG9iYWxfdGFyZ2V0ID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICByZXR1cm4gJmxpbmtlZF9wcm9ncmFtc19bMF07CisgIH0KKworICAvLyBGaW5kIG9yIGNyZWF0ZSBhIHByb2dyYW0gZm9yIGFub3RoZXIgdGV4dHVyZSB0YXJnZXQuCisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbGlua2VkX3Byb2dyYW1zXy5zaXplKCk7ICsraSkgeworICAgIExpbmtlZFByb2dyYW0qIHByb2dyYW0gPSAmbGlua2VkX3Byb2dyYW1zX1tpXTsKKyAgICBpZiAocHJvZ3JhbS0+R2V0R2xvYmFsVGV4dHVyZVRhcmdldCgpID09IGdsb2JhbF90YXJnZXQpIHsKKyAgICAgIHJldHVybiBwcm9ncmFtOworICAgIH0KKyAgfQorCisgIGlmIChnbG9iYWxfdGFyZ2V0ID09IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7CisgICAgTGlua2VkUHJvZ3JhbSogcHJvZ3JhbSA9IGxpbmtlZF9wcm9ncmFtc19bMF0uQ2xvbmUoZ2xvYmFsX3RhcmdldCk7CisgICAgaWYgKCFwcm9ncmFtKSB7CisgICAgICBpZiAoIWhhc193YXJuZWRfYWJvdXRfc2FtcGxlcl91c2VfKSB7CisgICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcmV3cml0ZSBzaGFkZXIgcHJvZ3JhbSwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yICIKKyAgICAgICAgICAgICAgImJhY2tlbmQgdGV4dHVyZSBhZGp1c3RtZW50cyAodXNlZCB3aXRoIEhXIHZpZGVvKSIpOworICAgICAgICBoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXyA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gJmxpbmtlZF9wcm9ncmFtc19bMF07CisgICAgfQorICAgIGxpbmtlZF9wcm9ncmFtc18ucHVzaF9iYWNrKCpwcm9ncmFtKTsKKyAgICByZXR1cm4gJmxpbmtlZF9wcm9ncmFtc19bbGlua2VkX3Byb2dyYW1zXy5zaXplKCkgLSAxXTsKKyAgfQorCisgIEFMT0dFKCJTaGFkZXIgcHJvZ3JhbSBpcyB1c2VkIHdpdGggdW5zdXBwb3J0ZWQgdGV4dHVyZSB0YXJnZXQgJXMoMHgleCkiLAorICAgICAgICBHZXRFbnVtU3RyaW5nKGdsb2JhbF90YXJnZXQpLCBnbG9iYWxfdGFyZ2V0KTsKKyAgcmV0dXJuICZsaW5rZWRfcHJvZ3JhbXNfWzBdOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpWYWxpZGF0ZSgpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmIChsaW5rZWRfcHJvZ3JhbXNfLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGhhc19zdGFsZV91bmlmb3JtX2RhdGEgPSBmYWxzZTsKKyAgTGlua2VkUHJvZ3JhbSogcHJvZ3JhbSA9ICZsaW5rZWRfcHJvZ3JhbXNfWzBdOworICBmb3IgKFVuaWZvcm1DYWNoZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB1bmlmb3JtX2NhY2hlXy5iZWdpbigpOworICAgICAgICBpdCAhPSB1bmlmb3JtX2NhY2hlXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+c2Vjb25kLT5HZXRSZXZpc2lvbigpID4gcHJvZ3JhbS0+R2V0VW5pZm9ybVJldmlzaW9uKCkpIHsKKyAgICAgIGhhc19zdGFsZV91bmlmb3JtX2RhdGEgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICBHTGludCBwcm9ncmFtX25hbWUgPSBwcm9ncmFtLT5HZXRQcm9ncmFtKCktPkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpOworICBpZiAoaGFzX3N0YWxlX3VuaWZvcm1fZGF0YSkgeworICAgIFBBU1NfVEhST1VHSChjdHgsIFVzZVByb2dyYW0sIHByb2dyYW1fbmFtZSk7CisgICAgUHJvcGFnYXRlVW5pZm9ybVZhbHVlc0xvY2tlZChwcm9ncmFtKTsKKyAgICBQQVNTX1RIUk9VR0goY3R4LCBVc2VQcm9ncmFtLCAwKTsKKyAgfQorCisgIFBBU1NfVEhST1VHSChjdHgsIFZhbGlkYXRlUHJvZ3JhbSwgcHJvZ3JhbV9uYW1lKTsKKyAgUEFTU19USFJPVUdIKGN0eCwgR2V0UHJvZ3JhbWl2LCBwcm9ncmFtX25hbWUsIEdMX1ZBTElEQVRFX1NUQVRVUywKKyAgICAgICAgICAgICAgICZ2YWxpZGF0aW9uX3N0YXR1c18pOworICBwcm9ncmFtLT5HZXRQcm9ncmFtKCktPlJlc2V0SW5mb0xvZ0NhY2hlKCk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFVuaWZvcm0gc3VwcG9ydC4KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBQcm9ncmFtRGF0YTo6R2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xjaGFyKiBuYW1lKSBjb25zdCB7CisgIFByb2dyYW1WYXJpYW50UHRyIHByb2dyYW0gPSBHZXRQcm9ncmFtV2l0aExpbmtBdHRlbXB0TG9ja2VkKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwpIHsKKyAgICBwcm9ncmFtLT5HZXRBY3RpdmVVbmlmb3JtKGluZGV4LCBidWZfc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiVGhlIHByb2dyYW0gaGFzIG5vdCBiZWVuIGxpbmtlZCIpOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpDbGVhclVuaWZvcm1DYWNoZUxvY2tlZCgpIHsKKyAgZm9yIChVbmlmb3JtQ2FjaGVNYXA6Oml0ZXJhdG9yIGl0ID0gdW5pZm9ybV9jYWNoZV8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gdW5pZm9ybV9jYWNoZV8uZW5kKCk7ICsraXQpIHsKKyAgICBkZWxldGUgaXQtPnNlY29uZDsKKyAgfQorICB1bmlmb3JtX2NhY2hlXy5jbGVhcigpOworICB1bmlmb3JtX2xvY2F0aW9uc18uY2xlYXIoKTsKKyAgdW5pZm9ybV9yZXZpc2lvbl9nZW5fID0gMDsKK30KKworR0xpbnQgUHJvZ3JhbURhdGE6OkdldFVuaWZvcm1Mb2NhdGlvbihjb25zdCBHTGNoYXIqIG5hbWUpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmIChsaW5rZWRfcHJvZ3JhbXNfLmVtcHR5KCkpIHsKKyAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiVGhlIHByb2dyYW0gaGFzIG5vdCBiZWVuIGxpbmtlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIExvb2sgZm9yIGtub3duIGxvY2FsIGxvY2F0aW9ucy4KKyAgZm9yIChVbmlmb3JtTG9jYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5pZm9ybV9sb2NhdGlvbnNfLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IHVuaWZvcm1fbG9jYXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+c2Vjb25kLkdldE9yaWdpbmFsTmFtZSgpID09IG5hbWUpIHsKKyAgICAgIHJldHVybiBpdC0+Zmlyc3Q7CisgICAgfQorICB9CisKKyAgLy8gTG9vayB1cCBtYXRjaGluZyBhY3RpdmUgdW5pZm9ybS4KKyAgaW50IGFycmF5X2luZGV4ID0gLTE7CisgIFByb2dyYW1WYXJpYW50UHRyIHByb2dyYW0gPSBsaW5rZWRfcHJvZ3JhbXNfWzBdLkdldFByb2dyYW0oKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV9uYW1lID0gcHJvZ3JhbS0+UGFyc2VVbmlmb3JtTmFtZShuYW1lLCAmYXJyYXlfaW5kZXgpOworICBpZiAoYmFzZV9uYW1lLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBBIHNhbml0eSBjaGVjayBmb3IgdGhlIGxvY2F0aW9uIGluIHRoZSB1bmRlcmx5aW5nIHNoYWRlciBwcm9ncmFtLgorICBHTGludCBnbG9iYWxfbG9jYXRpb24gPSBwcm9ncmFtLT5HZXRVbmlmb3JtTG9jYXRpb24obmFtZSk7CisgIGlmIChnbG9iYWxfbG9jYXRpb24gPT0gLTEpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBBZGQgbG9jYXRpb24gdG8gdGhlIHVuaWZvcm0gbWFwLgorICBHTGludCBsb2NhbF9sb2NhdGlvbiA9ICsrdW5pZm9ybV9sb2NhdGlvbl9nZW5fOworICB1bmlmb3JtX2xvY2F0aW9uc19bbG9jYWxfbG9jYXRpb25dID0gVW5pZm9ybUxvY2F0aW9uKAorICAgICAgbmFtZSwgYmFzZV9uYW1lLCBhcnJheV9pbmRleCk7CisgIHJldHVybiBsb2NhbF9sb2NhdGlvbjsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6UHJvcGFnYXRlVW5pZm9ybVZhbHVlc0xvY2tlZChMaW5rZWRQcm9ncmFtKiBwcm9ncmFtKSB7CisgIEdsZXNDb250ZXh0KiBjdHggPSBHZXRSZXF1aXJlZENvbnRleHQoKTsKKyAgdWludDY0X3QgbWF4X3JldmlzaW9uID0gMDsKKyAgZm9yIChVbmlmb3JtQ2FjaGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5pZm9ybV9jYWNoZV8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gdW5pZm9ybV9jYWNoZV8uZW5kKCk7ICsraXQpIHsKKyAgICBjb25zdCBDYWNoZWRVbmlmb3JtKiB1bmlmb3JtID0gaXQtPnNlY29uZDsKKyAgICB1aW50NjRfdCByZXZpc2lvbiA9IHVuaWZvcm0tPkdldFJldmlzaW9uKCk7CisgICAgaWYgKHJldmlzaW9uID4gbWF4X3JldmlzaW9uKSB7CisgICAgICBtYXhfcmV2aXNpb24gPSByZXZpc2lvbjsKKyAgICB9CisgICAgaWYgKHJldmlzaW9uIDw9IHByb2dyYW0tPkdldFVuaWZvcm1SZXZpc2lvbigpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLy8gTG9va3VwIGxvY2F0aW9uIG9mIHRoZSBiYXNlIHVuaWZvcm0gbmFtZSwgdGhlbiBzZXQgdGhlIGVudGlyZSB2YWx1ZS4KKyAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MzApOiBQcm9wYWdhdGUgb25seSB0aG9zZSBhcnJheSBlbGVtZW50cyB0aGF0IHdlcmUKKyAgICAvLyBtb2RpZmllZC4KKyAgICBHTGludCBnbG9iYWxfbG9jYXRpb24gPQorICAgICAgICBwcm9ncmFtLT5HZXRQcm9ncmFtKCktPkdldFVuaWZvcm1Mb2NhdGlvbihpdC0+Zmlyc3QpOworICAgIGlmIChnbG9iYWxfbG9jYXRpb24gPT0gLTEpIHsKKyAgICAgIEFMT0dXKCJVbmFibGUgdG8gZmluZCBnbG9iYWwgbG9jYXRpb24gZm9yIHVuaWZvcm0gJyVzJyIsCisgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdW5pZm9ybS0+U2V0T25Qcm9ncmFtKGN0eCwgZ2xvYmFsX2xvY2F0aW9uKTsKKyAgfQorICBwcm9ncmFtLT5TZXRVbmlmb3JtUmV2aXNpb24obWF4X3JldmlzaW9uKTsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6U2V0VW5pZm9ybUludGVybmFsKEdMaW50IGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVuaWZvcm1WYWx1ZSYgdmFsdWUpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmIChsb2NhdGlvbiA9PSAtMSkgeworICAgIHJldHVybjsgIC8vIEdMRVMyIHJlcXVpcmVzIC0xIHRvIGJlIGlnbm9yZWQuCisgIH0KKyAgaWYgKCF1bmlmb3JtX2xvY2F0aW9uc18uY291bnQobG9jYXRpb24pKSB7CisgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICJVbmlmb3JtIGxvY2F0aW9uIHVua25vd24gb3IgcHJvZ3JhbSBoYXMgbm90IGJlZW4gbGlua2VkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgVW5pZm9ybUxvY2F0aW9uJiBsb2NhdGlvbl9pbmZvID0KKyAgICAgIHVuaWZvcm1fbG9jYXRpb25zXy5maW5kKGxvY2F0aW9uKS0+c2Vjb25kOworICBVbmlmb3JtQ2FjaGVNYXA6Oml0ZXJhdG9yIGl0ID0KKyAgICAgIHVuaWZvcm1fY2FjaGVfLmZpbmQobG9jYXRpb25faW5mby5HZXRCYXNlTmFtZSgpKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihpdCA9PSB1bmlmb3JtX2NhY2hlXy5lbmQoKSk7CisgIENhY2hlZFVuaWZvcm0qIHVuaWZvcm0gPSBpdC0+c2Vjb25kOworCisgIGlmICh2YWx1ZS5Jc0FycmF5KCkgJiYgIXVuaWZvcm0tPklzQXJyYXkoKSkgeworICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCB1bmlmb3JtIHdpdGggY291bnQgPiAxIG9uIGEgbm9uLWFycmF5Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZS5HZXRBcnJheVNpemUoKTsgKytpKSB7CisgICAgaW50IHRhcmdldF9hcnJheV9pZHggPSBsb2NhdGlvbl9pbmZvLkdldEFycmF5SW5kZXgoKSArIGk7CisgICAgaWYgKHRhcmdldF9hcnJheV9pZHggPj0gdW5pZm9ybS0+R2V0QXJyYXlTaXplKCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXVuaWZvcm0tPkNvcHlFbGVtZW50RnJvbSh0YXJnZXRfYXJyYXlfaWR4LCB2YWx1ZSwgaSkpIHsKKyAgICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gY29udmVydCB1bmlmb3JtIGRhdGEiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgdW5pZm9ybS0+U2V0UmV2aXNpb24oKyt1bmlmb3JtX3JldmlzaW9uX2dlbl8pOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpVbmlmb3JtZnYoR0xpbnQgbG9jYXRpb24sIEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgeworICBpZiAoY291bnQgPCAwKSB7CisgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChjb3VudCk7CisgICAgcmV0dXJuOworICB9CisgIGJvb2wgaXNfYXJyYXkgPSBjb3VudCA+IDE7CisgIFNldFVuaWZvcm1JbnRlcm5hbChsb2NhdGlvbiwgVW5pZm9ybVZhbHVlKHR5cGUsIGlzX2FycmF5LCBjb3VudCwgdmFsdWUpKTsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6VW5pZm9ybWl2KEdMaW50IGxvY2F0aW9uLCBHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQqIHZhbHVlKSB7CisgIGlmIChjb3VudCA8IDApIHsKKyAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGNvdW50KTsKKyAgICByZXR1cm47CisgIH0KKyAgYm9vbCBpc19hcnJheSA9IGNvdW50ID4gMTsKKyAgU2V0VW5pZm9ybUludGVybmFsKGxvY2F0aW9uLCBVbmlmb3JtVmFsdWUodHlwZSwgaXNfYXJyYXksIGNvdW50LCB2YWx1ZSkpOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpVbmlmb3JtTWF0cml4ZnYoR0xpbnQgbG9jYXRpb24sIEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7CisgIGlmIChjb3VudCA8IDApIHsKKyAgICBHTEVTX0VSUk9SX0lOVkFMSURfVkFMVUVfSU5UKGNvdW50KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHRyYW5zcG9zZSkgeworICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoc3RhdGljX2Nhc3Q8aW50Pih0cmFuc3Bvc2UpKTsKKyAgICByZXR1cm47CisgIH0KKyAgYm9vbCBpc19hcnJheSA9IGNvdW50ID4gMTsKKyAgU2V0VW5pZm9ybUludGVybmFsKGxvY2F0aW9uLCBVbmlmb3JtVmFsdWUodHlwZSwgaXNfYXJyYXksIGNvdW50LCB2YWx1ZSkpOworfQorCit2b2lkIFByb2dyYW1EYXRhOjpHZXRVbmlmb3JtZnYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcykgY29uc3QgeworICBBdXRvTG9jayBsb2NrKGxvY2tfKTsKKyAgaWYgKCF1bmlmb3JtX2xvY2F0aW9uc18uY291bnQobG9jYXRpb24pKSB7CisgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwKKyAgICAgICAgICAgICAgICJVbmlmb3JtIGxvY2F0aW9uIHVua25vd24gb3IgcHJvZ3JhbSBoYXMgbm90IGJlZW4gbGlua2VkIik7CisgICAgcmV0dXJuOworICB9CisKKyAgY29uc3QgVW5pZm9ybUxvY2F0aW9uJiBsb2NhdGlvbl9pbmZvID0KKyAgICAgIHVuaWZvcm1fbG9jYXRpb25zXy5maW5kKGxvY2F0aW9uKS0+c2Vjb25kOworICBVbmlmb3JtQ2FjaGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIHVuaWZvcm1fY2FjaGVfLmZpbmQobG9jYXRpb25faW5mby5HZXRCYXNlTmFtZSgpKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihpdCA9PSB1bmlmb3JtX2NhY2hlXy5lbmQoKSk7CisgIGlmICghaXQtPnNlY29uZC0+U3RvcmVBc0Zsb2F0VG8ocGFyYW1zKSkgeworICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJVbmFibGUgdG8gY29udmVydCB1bmlmb3JtIGRhdGEiKTsKKyAgfQorfQorCit2b2lkIFByb2dyYW1EYXRhOjpHZXRVbmlmb3JtaXYoR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpIGNvbnN0IHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmICghdW5pZm9ybV9sb2NhdGlvbnNfLmNvdW50KGxvY2F0aW9uKSkgeworICAgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sCisgICAgICAgICAgICAgICAiVW5pZm9ybSBsb2NhdGlvbiB1bmtub3duIG9yIHByb2dyYW0gaGFzIG5vdCBiZWVuIGxpbmtlZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IFVuaWZvcm1Mb2NhdGlvbiYgbG9jYXRpb25faW5mbyA9CisgICAgICB1bmlmb3JtX2xvY2F0aW9uc18uZmluZChsb2NhdGlvbiktPnNlY29uZDsKKyAgVW5pZm9ybUNhY2hlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9CisgICAgICB1bmlmb3JtX2NhY2hlXy5maW5kKGxvY2F0aW9uX2luZm8uR2V0QmFzZU5hbWUoKSk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoaXQgPT0gdW5pZm9ybV9jYWNoZV8uZW5kKCkpOworICBpZiAoIWl0LT5zZWNvbmQtPlN0b3JlQXNJbnRUbyhwYXJhbXMpKSB7CisgICAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIlVuYWJsZSB0byBjb252ZXJ0IHVuaWZvcm0gZGF0YSIpOworICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEF0dHJpYnV0ZSBzdXBwb3J0LgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIFByb2dyYW1EYXRhOjpHZXRBY3RpdmVBdHRyaWIoR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpIGNvbnN0IHsKKyAgUHJvZ3JhbVZhcmlhbnRQdHIgcHJvZ3JhbSA9IEdldFByb2dyYW1XaXRoTGlua0F0dGVtcHRMb2NrZWQoKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCkgeworICAgIHByb2dyYW0tPkdldEFjdGl2ZUF0dHJpYihpbmRleCwgYnVmX3NpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgR0xFU19FUlJPUihHTF9JTlZBTElEX09QRVJBVElPTiwgIlRoZSBwcm9ncmFtIGhhcyBub3QgYmVlbiBsaW5rZWQiKTsKK30KKwordm9pZCBQcm9ncmFtRGF0YTo6QmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKSB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICAvLyBCaW5kaW5nIG9mIGF0dHJpYnV0ZXMgY2FuIG9ubHkgaGFwcGVuIGJlZm9yZSBsaW5raW5nLgorICBNb2RpZnlQcm9ncmFtTG9ja2VkKCk7CisgIGN1cnJlbnRfcHJvZ3JhbV8tPkJpbmRBdHRyaWJMb2NhdGlvbihuYW1lLCBpbmRleCk7Cit9CisKK0dMaW50IFByb2dyYW1EYXRhOjpHZXRBdHRyaWJMb2NhdGlvbihjb25zdCBHTGNoYXIqIG5hbWUpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIGlmIChsaW5rZWRfcHJvZ3JhbXNfLmVtcHR5KCkpIHsKKyAgICBHTEVTX0VSUk9SKEdMX0lOVkFMSURfT1BFUkFUSU9OLCAiVGhlIHByb2dyYW0gaGFzIG5vdCBiZWVuIGxpbmtlZCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gbGlua2VkX3Byb2dyYW1zX1swXS5HZXRQcm9ncmFtKCktPkdldEF0dHJpYkxvY2F0aW9uKG5hbWUpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYWNoZWRVbmlmb3JtCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgUHJvZ3JhbURhdGE6OkNhY2hlZFVuaWZvcm06OkNvcHlFbGVtZW50RnJvbShpbnQgZHN0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmlmb3JtVmFsdWUmIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2lkeCkgeworICByZXR1cm4gdmFsdWVfLkNvcHlFbGVtZW50RnJvbShkc3RfaWR4LCBzcmMsIHNyY19pZHgpOworfQorCitib29sIFByb2dyYW1EYXRhOjpDYWNoZWRVbmlmb3JtOjpTdG9yZUFzRmxvYXRUbyhHTGZsb2F0KiB2YWx1ZSkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLlN0b3JlQXNGbG9hdFRvKHZhbHVlKTsKK30KKworYm9vbCBQcm9ncmFtRGF0YTo6Q2FjaGVkVW5pZm9ybTo6U3RvcmVBc0ludFRvKEdMaW50KiB2YWx1ZSkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLlN0b3JlQXNJbnRUbyh2YWx1ZSk7Cit9CisKK3ZvaWQgUHJvZ3JhbURhdGE6OkNhY2hlZFVuaWZvcm06OlNldE9uUHJvZ3JhbShHbGVzQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBnbG9iYWxfbG9jYXRpb24pIGNvbnN0IHsKKyAgdmFsdWVfLlNldE9uUHJvZ3JhbShjdHgsIGdsb2JhbF9sb2NhdGlvbik7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIExpbmtlZFByb2dyYW0KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUHJvZ3JhbURhdGE6OkxpbmtlZFByb2dyYW06OkxpbmtlZFByb2dyYW0oUHJvZ3JhbVZhcmlhbnRQdHIgcHJvZ3JhbSkKKyAgICA6IHByb2dyYW1fKHByb2dyYW0pLCB1bmlmb3JtX3JldmlzaW9uXygwKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYocHJvZ3JhbV8gPT0gTlVMTCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoIXByb2dyYW1fLT5Jc0xpbmtlZCgpKTsKK30KKworUHJvZ3JhbURhdGE6OkxpbmtlZFByb2dyYW0qIFByb2dyYW1EYXRhOjpMaW5rZWRQcm9ncmFtOjpDbG9uZSgKKyAgICBHTGVudW0gZ2xvYmFsX3RleHR1cmVfdGFyZ2V0KSBjb25zdCB7CisgIGlmICghcHJvZ3JhbV8tPlVzZXNFeHRlcm5hbFRleHR1cmVBczJEKCkpIHsKKyAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIG90aGVyIGdsb2JhbCB0YXJnZXRzIGlmIHRoZSB1c2VyJ3MgcHJvZ3JhbQorICAgIC8vIGRvZXMgbm90IHVzZSBleHRlcm5hbCB0ZXh0dXJlcy4KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgbmV3IHByb2dyYW0gd2l0aCBwcm9wZXIgc2hhZGVycy4KKyAgUHJvZ3JhbVZhcmlhbnRQdHIgbmV3X3Byb2dyYW0gPSBQcm9ncmFtVmFyaWFudFB0cihuZXcgUHJvZ3JhbVZhcmlhbnQoKSk7CisgIG5ld19wcm9ncmFtLT5BdHRhY2hTaGFkZXIocHJvZ3JhbV8tPkdldFZlcnRleFNoYWRlcigpKTsKKyAgU2hhZGVyVmFyaWFudFB0ciBmcmFnbWVudF9zaGFkZXIgPSBTaGFkZXJWYXJpYW50UHRyKAorICAgICAgbmV3IFNoYWRlclZhcmlhbnQoRlJBR01FTlRfU0hBREVSKSk7CisgIGZyYWdtZW50X3NoYWRlci0+U2V0R2xvYmFsVGV4dHVyZVRhcmdldChnbG9iYWxfdGV4dHVyZV90YXJnZXQpOworICBmcmFnbWVudF9zaGFkZXItPlNldFNvdXJjZSgKKyAgICAgIHByb2dyYW1fLT5HZXRGcmFnbWVudFNoYWRlcigpLT5HZXRPcmlnaW5hbFNvdXJjZSgpKTsKKyAgZnJhZ21lbnRfc2hhZGVyLT5Db21waWxlKCk7CisgIG5ld19wcm9ncmFtLT5BdHRhY2hTaGFkZXIoZnJhZ21lbnRfc2hhZGVyKTsKKworI2lmZGVmIEVOQUJMRV9BUElfTE9HR0lORworICBBTE9HSSgiUmV3cm90ZSBmcmFnbWVudCBzaGFkZXIgb2xkX25hbWU9JWQgbmV3X25hbWU9JWQ6XG4iCisgICAgICAgICAiLS0tIE9yaWdpbmFsIFNvdXJjZSAtLS1cbiVzXG4iCisgICAgICAgICAiLS0tIE1vZGlmaWVkIFNvdXJjZSAtLS1cbiVzXG4iCisgICAgICAgICAiLS0tICBFbmQgb2YgU291cmNlICAtLS1cbiIsCisgICAgICAgICBwcm9ncmFtXy0+R2V0RnJhZ21lbnRTaGFkZXIoKS0+R2V0T3JDcmVhdGVHbG9iYWxOYW1lKCksCisgICAgICAgICBmcmFnbWVudF9zaGFkZXItPkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpLAorICAgICAgICAgZnJhZ21lbnRfc2hhZGVyLT5HZXRPcmlnaW5hbFNvdXJjZSgpLmNfc3RyKCksCisgICAgICAgICBmcmFnbWVudF9zaGFkZXItPkdldFVwZGF0ZWRTb3VyY2UoKS5jX3N0cigpKTsKKyNlbmRpZgorCisgIC8vIFRyYW5zZmVyIHZlcnRleCBhdHRyaWJ1dGUgYmluZGluZ3MgYXMgdGhleSByZWZlciB0byBhcHAncyBHTCBjb250ZXh0LgorICBmb3IgKGludCBpID0gMDsgaSA8IHByb2dyYW1fLT5HZXRBY3RpdmVBdHRyaWJDb3VudCgpOyArK2kpIHsKKyAgICBHTGludCBsb2NhdGlvbiA9IC0xOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBwcm9ncmFtXy0+R2V0QWN0aXZlQXR0cmliTmFtZUFuZExvY2F0aW9uKGksICZsb2NhdGlvbik7CisgICAgaWYgKGxvY2F0aW9uICE9IC0xKSB7CisgICAgICBuZXdfcHJvZ3JhbS0+QmluZEF0dHJpYkxvY2F0aW9uKG5hbWUsIGxvY2F0aW9uKTsKKyAgICB9CisgIH0KKworICAvLyBMaW5rIHRoZSBuZXcgcHJvZ3JhbS4KKyAgbmV3X3Byb2dyYW0tPkxpbmsoKTsKKyAgaWYgKCFuZXdfcHJvZ3JhbS0+SXNMaW5rZWQoKSkgeworICAgIEFMT0dXKCJVbmFibGUgdG8gbGluayBwcm9ncmFtIGZvciB0ZXh0dXJlIHRhcmdldCAweCV4IiwKKyAgICAgICAgICBnbG9iYWxfdGV4dHVyZV90YXJnZXQpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIG5ldyBMaW5rZWRQcm9ncmFtKG5ld19wcm9ncmFtKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fZGF0YS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcHJvZ3JhbV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNDIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fZGF0YS5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QUk9HUkFNX0RBVEFfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QUk9HUkFNX0RBVEFfSF8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvc2hhZGVyX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL3Byb2dyYW1fdmFyaWFudC5oIgorI2luY2x1ZGUgImdsZXMvdW5pZm9ybV92YWx1ZS5oIgorCitjbGFzcyBQcm9ncmFtRGF0YSA6IHB1YmxpYyBPYmplY3REYXRhIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFByb2dyYW1EYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKTsKKworICB2b2lkIEF0dGFjaFNoYWRlcihjb25zdCBTaGFkZXJEYXRhUHRyJiBzaGFkZXIpOworICB2b2lkIERldGFjaFNoYWRlcihjb25zdCBTaGFkZXJEYXRhUHRyJiBzaGFkZXIpOworCisgIHZvaWQgR2V0QXR0YWNoZWRTaGFkZXJzKEdMc2l6ZWkgbWF4X2NvdW50LCBHTHNpemVpKiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50KiBzaGFkZXJzKSBjb25zdDsKKyAgdm9pZCBHZXRQcm9ncmFtaXYoR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSBjb25zdDsKKyAgdm9pZCBHZXRJbmZvTG9nKEdMc2l6ZWkgbWF4X2xlbmd0aCwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9fbG9nKSBjb25zdDsKKworICB2b2lkIExpbmsoKTsKKworICAvLyBTZXRzIHRoaXMgcHJvZ3JhbSBhcyBhY3RpdmUgb3IgaW5hY3RpdmUgb24gdGhlIGN1cnJlbnQgR0wgY29udGV4dC4KKyAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFNldHMgR0wgZXJyb3Igb24gZmFpbHVyZS4KKyAgYm9vbCBVc2UoYm9vbCBlbmFibGUpOworCisgIC8vIFNlbGVjdHMgcHJvcGVyIHByb2dyYW0gYW5kIHByb3BhZ2F0ZXMgdW5pZm9ybXMgZm9yIHJlbmRlcmluZy4KKyAgLy8gVGhlIHByb2dyYW0gbXVzdCBiZSBsaW5rZWQgYW5kIGN1cnJlbnRseSBpbiB1c2UuCisgIHZvaWQgUHJlcGFyZUZvclJlbmRlcmluZyhib29sKiB1c2VzX2V4dGVybmFsX2FzXzJkKTsKKyAgdm9pZCBDbGVhbnVwQWZ0ZXJSZW5kZXJpbmcoKTsKKworICB2b2lkIFZhbGlkYXRlKCk7CisKKyAgLy8gVW5pZm9ybSBzdXBwb3J0LgorICBHTGludCBHZXRVbmlmb3JtTG9jYXRpb24oY29uc3QgR0xjaGFyKiBuYW1lKTsKKyAgdm9pZCBHZXRBY3RpdmVVbmlmb3JtKEdMdWludCBpbmRleCwgR0xzaXplaSBidWZfc2l6ZSwgR0xzaXplaSogbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSBjb25zdDsKKyAgdm9pZCBHZXRVbmlmb3JtZnYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcykgY29uc3Q7CisgIHZvaWQgR2V0VW5pZm9ybWl2KEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKSBjb25zdDsKKyAgdm9pZCBVbmlmb3JtZnYoR0xpbnQgbG9jYXRpb24sIEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7CisgIHZvaWQgVW5pZm9ybWl2KEdMaW50IGxvY2F0aW9uLCBHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwKKyAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQqIHZhbHVlKTsKKyAgdm9pZCBVbmlmb3JtTWF0cml4ZnYoR0xpbnQgbG9jYXRpb24sIEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7CisKKyAgLy8gQXR0cmlidXRlIHN1cHBvcnQuCisgIC8vIFdlIG9ubHkgcGVyZm9ybSBob3VzZWtlZXBpbmcgZm9yIGF0dHJpYi1pbmRleCBiaW5kaW5ncyBhbmQgbm90IHZhbHVlcywKKyAgLy8gYXMgdGhlIGFjdHVhbCB2ZXJ0ZXggYXJyYXlzIGFyZSBhIHBhcnQgb2YgY29udGV4dCBzdGF0ZS4KKyAgdm9pZCBHZXRBY3RpdmVBdHRyaWIoR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1Zl9zaXplLCBHTHNpemVpKiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgY29uc3Q7CisgIHZvaWQgQmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKTsKKyAgR0xpbnQgR2V0QXR0cmliTG9jYXRpb24oY29uc3QgR0xjaGFyKiBuYW1lKTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+UHJvZ3JhbURhdGEoKTsKKworIHByaXZhdGU6CisgIC8vIFN0b3JlcyBhIGNhY2hlZCB1bmlmb3JtIHZhbHVlLgorICBzdHJ1Y3QgQ2FjaGVkVW5pZm9ybSB7CisgICAgQ2FjaGVkVW5pZm9ybShHTGVudW0gdHlwZSwgYm9vbCBpc19hcnJheSwgR0xpbnQgYXJyYXlfc2l6ZSkKKyAgICAgICAgOiB2YWx1ZV8odHlwZSwgaXNfYXJyYXksIGFycmF5X3NpemUpLCByZXZpc2lvbl8oMCkge30KKworICAgIEdMZW51bSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLkdldFR5cGUoKTsgfQorICAgIGJvb2wgSXNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXy5Jc0FycmF5KCk7IH0KKyAgICBHTGludCBHZXRBcnJheVNpemUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uR2V0QXJyYXlTaXplKCk7IH0KKworICAgIGJvb2wgQ29weUVsZW1lbnRGcm9tKGludCBkc3RfaWR4LCBjb25zdCBVbmlmb3JtVmFsdWUmIHNyYywgaW50IHNyY19pZHgpOworICAgIGJvb2wgU3RvcmVBc0Zsb2F0VG8oR0xmbG9hdCogdmFsdWUpIGNvbnN0OworICAgIGJvb2wgU3RvcmVBc0ludFRvKEdMaW50KiB2YWx1ZSkgY29uc3Q7CisKKyAgICAvLyBTZXRzIHVuaWZvcm0ncyB2YWx1ZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvZ3JhbS4KKyAgICB2b2lkIFNldE9uUHJvZ3JhbShHbGVzQ29udGV4dCogY3R4LCBHTHVpbnQgZ2xvYmFsX2xvY2F0aW9uKSBjb25zdDsKKworICAgIHVpbnQ2NF90IEdldFJldmlzaW9uKCkgY29uc3QgeyByZXR1cm4gcmV2aXNpb25fOyB9CisgICAgdm9pZCBTZXRSZXZpc2lvbih1aW50NjRfdCB2YWx1ZSkgeyByZXZpc2lvbl8gPSB2YWx1ZTsgfQorCisgICBwcml2YXRlOgorICAgIFVuaWZvcm1WYWx1ZSB2YWx1ZV87CisgICAgdWludDY0X3QgcmV2aXNpb25fOworCisgICAgQ2FjaGVkVW5pZm9ybShjb25zdCBDYWNoZWRVbmlmb3JtJiBzcmMpOworICAgIENhY2hlZFVuaWZvcm0mIG9wZXJhdG9yPShjb25zdCBDYWNoZWRVbmlmb3JtJiBzcmMpOworICB9OworCisgIC8vIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGFuIGFjdGl2ZSB1bmlmb3JtLgorICBzdHJ1Y3QgVW5pZm9ybUxvY2F0aW9uIHsKKyAgICBVbmlmb3JtTG9jYXRpb24oKSA6IGFycmF5X2luZGV4XygtMSkge30KKyAgICBVbmlmb3JtTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG9yaWdpbmFsX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBiYXNlX25hbWUsIGludCBhcnJheV9pbmRleCkKKyAgICAgICAgOiBvcmlnaW5hbF9uYW1lXyhvcmlnaW5hbF9uYW1lKSwgYmFzZV9uYW1lXyhiYXNlX25hbWUpLAorICAgICAgICAgIGFycmF5X2luZGV4XyhhcnJheV9pbmRleCkge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRPcmlnaW5hbE5hbWUoKSBjb25zdCB7IHJldHVybiBvcmlnaW5hbF9uYW1lXzsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRCYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfbmFtZV87IH0KKyAgICBpbnQgR2V0QXJyYXlJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5X2luZGV4XzsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG9yaWdpbmFsX25hbWVfOworICAgIHN0ZDo6c3RyaW5nIGJhc2VfbmFtZV87CisgICAgaW50IGFycmF5X2luZGV4XzsKKyAgfTsKKworICAvLyBSZXByZXNlbnRzIGEgdmFyaWFudCBvZiBhIGxpbmtlZCBwcm9ncmFtLgorICBzdHJ1Y3QgTGlua2VkUHJvZ3JhbSB7CisgICAgTGlua2VkUHJvZ3JhbSgpIDogcHJvZ3JhbV8oTlVMTCksIHVuaWZvcm1fcmV2aXNpb25fKDApIHt9CisgICAgZXhwbGljaXQgTGlua2VkUHJvZ3JhbShQcm9ncmFtVmFyaWFudFB0ciBwcm9ncmFtKTsKKworICAgIFByb2dyYW1WYXJpYW50UHRyIEdldFByb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgICAgR0xlbnVtIEdldEdsb2JhbFRleHR1cmVUYXJnZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcHJvZ3JhbV8tPkdldEZyYWdtZW50U2hhZGVyKCktPkdldEdsb2JhbFRleHR1cmVUYXJnZXQoKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBHZXRVbmlmb3JtUmV2aXNpb24oKSBjb25zdCB7IHJldHVybiB1bmlmb3JtX3JldmlzaW9uXzsgfQorICAgIHZvaWQgU2V0VW5pZm9ybVJldmlzaW9uKHVpbnQ2NF90IHZhbHVlKSB7IHVuaWZvcm1fcmV2aXNpb25fID0gdmFsdWU7IH0KKworICAgIExpbmtlZFByb2dyYW0qIENsb25lKEdMZW51bSBnbG9iYWxfdGV4dHVyZV90YXJnZXQpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIFByb2dyYW1WYXJpYW50UHRyIHByb2dyYW1fOworICAgIHVpbnQ2NF90IHVuaWZvcm1fcmV2aXNpb25fOworICB9OworCisgIHR5cGVkZWYgc3RkOjptYXA8R0xpbnQsIFVuaWZvcm1Mb2NhdGlvbj4gVW5pZm9ybUxvY2F0aW9uTWFwOworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDYWNoZWRVbmlmb3JtKj4gVW5pZm9ybUNhY2hlTWFwOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFNoYWRlckRhdGFQdHI+IFNoYWRlckxpc3Q7CisKKyAgdm9pZCBNb2RpZnlQcm9ncmFtTG9ja2VkKCk7CisgIHZvaWQgU2V0TGlua2VkUHJvZ3JhbUxvY2tlZChQcm9ncmFtVmFyaWFudFB0ciBwcm9ncmFtKTsKKyAgTGlua2VkUHJvZ3JhbSogR2V0TGlua2VkUHJvZ3JhbUZvclJlbmRlcmluZ0xvY2tlZCgpOworCisgIC8vIFJldHVybnMgY3VycmVudCBwcm9ncmFtIG9uY2UgYSBMaW5rKCkgaGFzIGJlZW4gYXR0ZW1wdGVkLiBPdGhlcndpc2UKKyAgLy8gcmV0dXJucyBmaXJzdCBsaW5rZWQgUHJvZ3JhbVZhcmlhbnQuIElmIG5vbmUsIHJldHVybnMgTlVMTC4KKyAgUHJvZ3JhbVZhcmlhbnRQdHIgR2V0UHJvZ3JhbVdpdGhMaW5rQXR0ZW1wdExvY2tlZCgpIGNvbnN0OworCisgIHZvaWQgQ2xlYXJVbmlmb3JtQ2FjaGVMb2NrZWQoKTsKKyAgdm9pZCBTZXRVbmlmb3JtSW50ZXJuYWwoR0xpbnQgbG9jYXRpb24sIGNvbnN0IFVuaWZvcm1WYWx1ZSYgdmFsdWUpOworICB2b2lkIFByb3BhZ2F0ZVVuaWZvcm1WYWx1ZXNMb2NrZWQoTGlua2VkUHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgUHJvZ3JhbVZhcmlhbnRQdHIgY3VycmVudF9wcm9ncmFtXzsKKyAgc3RkOjp2ZWN0b3I8TGlua2VkUHJvZ3JhbT4gbGlua2VkX3Byb2dyYW1zXzsKKyAgU2hhZGVyTGlzdCBzaGFkZXJzXzsKKyAgaW50IHVuaWZvcm1fbG9jYXRpb25fZ2VuXzsKKyAgYm9vbCBoYXNfbGlua19mYWlsdXJlXzsKKyAgYm9vbCBoYXNfd2FybmVkX2Fib3V0X3NhbXBsZXJfdXNlXzsKKyAgaW50IHVzZV9jb3VudF87CisgIC8vIFZhbHVlcyBmb3IgZXZlcnkgYWN0aXZlIHVuaWZvcm0sIGJ5IGJhc2UgbmFtZS4KKyAgVW5pZm9ybUNhY2hlTWFwIHVuaWZvcm1fY2FjaGVfOworICAvLyBMb2NhbCBsb2NhdGlvbnMgYXMgcmVwb3J0ZWQgdG8gdGhlIGFwcC4KKyAgVW5pZm9ybUxvY2F0aW9uTWFwIHVuaWZvcm1fbG9jYXRpb25zXzsKKyAgdWludDY0X3QgdW5pZm9ybV9yZXZpc2lvbl9nZW5fOworICBHTGludCB2YWxpZGF0aW9uX3N0YXR1c187CisgIG11dGFibGUgYW5kcm9pZDo6YmFzZTo6TG9jayBsb2NrXzsKKworICBQcm9ncmFtRGF0YShjb25zdCBQcm9ncmFtRGF0YSYpOworICBQcm9ncmFtRGF0YSYgb3BlcmF0b3I9KGNvbnN0IFByb2dyYW1EYXRhJik7Cit9OworCit0eXBlZGVmIGFuZHJvaWQ6OnNwPFByb2dyYW1EYXRhPiBQcm9ncmFtRGF0YVB0cjsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1BST0dSQU1fREFUQV9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcHJvZ3JhbV92YXJpYW50LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fdmFyaWFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMDM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fdmFyaWFudC5jcHAKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2xlcy9wcm9ncmFtX3ZhcmlhbnQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJnbGVzL2dsZXNfY29udGV4dC5oIgorI2luY2x1ZGUgImdsZXMvbWFjcm9zLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOworCitzdGF0aWMgR2xlc0NvbnRleHQqIEdldFJlcXVpcmVkQ29udGV4dCgpIHsKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFjdHgpOworICByZXR1cm4gY3R4OworfQorCisvLyBNYXhpbXVtIGJ1ZmZlciBsZW5ndGggZm9yIGFjdGl2ZSBhdHRyaWJ1dGUgYW5kIHVuaWZvcm0gbmFtZXMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhBdHRyaWJVbmlmb3JtTmFtZUxlbmd0aCA9IDEwMjQ7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFByb2dyYW1WYXJpYW50IE1haW4gQ29kZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitQcm9ncmFtVmFyaWFudDo6UHJvZ3JhbVZhcmlhbnQoKQorICAgIDogZ2xvYmFsX25hbWVfKDApLCBpc19saW5rZWRfKGZhbHNlKSwgaXNfbGlua19hdHRlbXB0ZWRfKGZhbHNlKSB7Cit9CisKK1Byb2dyYW1WYXJpYW50Ojp+UHJvZ3JhbVZhcmlhbnQoKSB7CisgIGlmIChnbG9iYWxfbmFtZV8pIHsKKyAgICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgICAgUEFTU19USFJPVUdIKGN0eCwgRGVsZXRlUHJvZ3JhbSwgZ2xvYmFsX25hbWVfKTsKKyAgfQorfQorCit2b2lkIFByb2dyYW1WYXJpYW50OjpFbnN1cmVMaXZlUHJvZ3JhbU9iamVjdChHbGVzQ29udGV4dCogY3R4KSB7CisgIGlmICghZ2xvYmFsX25hbWVfKSB7CisgICAgZ2xvYmFsX25hbWVfID0gUEFTU19USFJPVUdIKGN0eCwgQ3JlYXRlUHJvZ3JhbSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZ2xvYmFsX25hbWVfKTsKKyAgfQorfQorCitHTHVpbnQgUHJvZ3JhbVZhcmlhbnQ6OkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpIHsKKyAgRW5zdXJlTGl2ZVByb2dyYW1PYmplY3QoR2V0UmVxdWlyZWRDb250ZXh0KCkpOworICByZXR1cm4gZ2xvYmFsX25hbWVfOworfQorCit2b2lkIFByb2dyYW1WYXJpYW50OjpBdHRhY2hTaGFkZXIoU2hhZGVyVmFyaWFudFB0ciBzaGFkZXIpIHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihpc19saW5rZWRfKTsKKyAgaWYgKHNoYWRlci0+R2V0T2JqZWN0VHlwZSgpID09IFZFUlRFWF9TSEFERVIpIHsKKyAgICB2ZXJ0ZXhfc2hhZGVyXyA9IHNoYWRlcjsKKyAgfSBlbHNlIHsKKyAgICBmcmFnbWVudF9zaGFkZXJfID0gc2hhZGVyOworICB9Cit9CisKK3ZvaWQgUHJvZ3JhbVZhcmlhbnQ6OkRldGFjaFNoYWRlcihTaGFkZXJWYXJpYW50UHRyIHNoYWRlcikgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlzX2xpbmtlZF8pOworICBpZiAoc2hhZGVyLT5HZXRPYmplY3RUeXBlKCkgPT0gVkVSVEVYX1NIQURFUikgeworICAgIHZlcnRleF9zaGFkZXJfID0gU2hhZGVyVmFyaWFudFB0cihOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcmFnbWVudF9zaGFkZXJfID0gU2hhZGVyVmFyaWFudFB0cihOVUxMKTsKKyAgfQorfQorCitib29sIFByb2dyYW1WYXJpYW50OjpVc2VzRXh0ZXJuYWxUZXh0dXJlQXMyRCgpIGNvbnN0IHsKKyAgcmV0dXJuIChmcmFnbWVudF9zaGFkZXJfICE9IE5VTEwgPworICAgICAgZnJhZ21lbnRfc2hhZGVyXy0+SGFzUmVwbGFjZWRFeHRlcm5hbFRleHR1cmVXaXRoMkQoKSA6IGZhbHNlKTsKK30KKworc3RkOjpzdHJpbmcgUHJvZ3JhbVZhcmlhbnQ6OkdldEluZm9Mb2coKSBjb25zdCB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICBpZiAoIWdsb2JhbF9uYW1lXyB8fCAhaW5mb19sb2dfY2FjaGVfLklzRGlydHkoKSkgeworICAgIHJldHVybiBpbmZvX2xvZ19jYWNoZV8uR2V0KCk7CisgIH0KKworICBHTGludCBpbmZvX2xvZ19sZW5ndGggPSAwOworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIFBBU1NfVEhST1VHSChjdHgsIEdldFByb2dyYW1pdiwgZ2xvYmFsX25hbWVfLAorICAgICAgICAgICAgICAgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb19sb2dfbGVuZ3RoKTsKKyAgaWYgKGluZm9fbG9nX2xlbmd0aCA8PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgY2hhciogYnVmID0gbmV3IGNoYXJbaW5mb19sb2dfbGVuZ3RoXTsKKyAgUEFTU19USFJPVUdIKGN0eCwgR2V0UHJvZ3JhbUluZm9Mb2csIGdsb2JhbF9uYW1lXywKKyAgICAgICAgICAgICAgIGluZm9fbG9nX2xlbmd0aCwgTlVMTCwgYnVmKTsKKyAgaW5mb19sb2dfY2FjaGVfLk11dGF0ZSgpID0gYnVmOworICBpbmZvX2xvZ19jYWNoZV8uQ2xlYW4oKTsKKyAgZGVsZXRlW10gYnVmOworICByZXR1cm4gaW5mb19sb2dfY2FjaGVfLkdldCgpOworfQorCit2b2lkIFByb2dyYW1WYXJpYW50OjpSZXNldEluZm9Mb2dDYWNoZSgpIHsKKyAgaW5mb19sb2dfY2FjaGVfLk11dGF0ZSgpID0gIiI7Cit9CisKK1Byb2dyYW1WYXJpYW50KiBQcm9ncmFtVmFyaWFudDo6Q2xvbmUoKSBjb25zdCB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzX2xpbmtlZF8pOworICBQcm9ncmFtVmFyaWFudCogcmVzdWx0ID0gbmV3IFByb2dyYW1WYXJpYW50KCk7CisgIHJlc3VsdC0+QXR0YWNoU2hhZGVyKHZlcnRleF9zaGFkZXJfKTsKKyAgcmVzdWx0LT5BdHRhY2hTaGFkZXIoZnJhZ21lbnRfc2hhZGVyXyk7CisgIHJlc3VsdC0+YWN0aXZlX2F0dHJpYnV0ZXNfID0gYWN0aXZlX2F0dHJpYnV0ZXNfOworICByZXN1bHQtPmFjdGl2ZV91bmlmb3Jtc18gPSBhY3RpdmVfdW5pZm9ybXNfOworICBpZiAoIWluZm9fbG9nX2NhY2hlXy5Jc0RpcnR5KCkpIHsKKyAgICByZXN1bHQtPmluZm9fbG9nX2NhY2hlXy5NdXRhdGUoKSA9IGluZm9fbG9nX2NhY2hlXy5HZXQoKTsKKyAgICByZXN1bHQtPmluZm9fbG9nX2NhY2hlXy5DbGVhbigpOworICB9CisgIC8vIERvIG5vdCBjb3B5IHVuaWZvcm0gbG9jYXRpb25zIGFzIHRoZXkgYXJlIG9ubHkga25vd24KKyAgLy8gYWZ0ZXIgc3VjY2Vzc2Z1bCBsaW5raW5nLgorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFByb2dyYW1WYXJpYW50OjpMaW5rKCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlzX2xpbmtlZF8pOworCisgIGlzX2xpbmtfYXR0ZW1wdGVkXyA9IHRydWU7CisKKyAgaWYgKHZlcnRleF9zaGFkZXJfID09IE5VTEwgfHwgZnJhZ21lbnRfc2hhZGVyXyA9PSBOVUxMKSB7CisgICAgaW5mb19sb2dfY2FjaGVfLk11dGF0ZSgpID0gIkJvdGggc2hhZGVycyBtdXN0IGJlIGF0dGFjaGVkIjsKKyAgICBpbmZvX2xvZ19jYWNoZV8uQ2xlYW4oKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIXZlcnRleF9zaGFkZXJfLT5Jc0NvbXBpbGVSZXF1ZXN0ZWQoKSB8fAorICAgICAgIWZyYWdtZW50X3NoYWRlcl8tPklzQ29tcGlsZVJlcXVlc3RlZCgpKSB7CisgICAgaW5mb19sb2dfY2FjaGVfLk11dGF0ZSgpID0gIkJvdGggc2hhZGVycyBtdXN0IGJlIGNvbXBpbGVkIjsKKyAgICBpbmZvX2xvZ19jYWNoZV8uQ2xlYW4oKTsKKyAgICByZXR1cm47CisgIH0KKworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIEVuc3VyZUxpdmVQcm9ncmFtT2JqZWN0KGN0eCk7CisgIFBBU1NfVEhST1VHSChjdHgsIEF0dGFjaFNoYWRlciwgZ2xvYmFsX25hbWVfLAorICAgICAgICAgICAgICAgdmVydGV4X3NoYWRlcl8tPkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpKTsKKyAgUEFTU19USFJPVUdIKGN0eCwgQXR0YWNoU2hhZGVyLCBnbG9iYWxfbmFtZV8sCisgICAgICAgICAgICAgICBmcmFnbWVudF9zaGFkZXJfLT5HZXRPckNyZWF0ZUdsb2JhbE5hbWUoKSk7CisKKyAgUEFTU19USFJPVUdIKGN0eCwgTGlua1Byb2dyYW0sIGdsb2JhbF9uYW1lXyk7CisKKyAgR0xpbnQgbGlua1N0YXR1cyA9IDA7CisgIFBBU1NfVEhST1VHSChjdHgsIEdldFByb2dyYW1pdiwgZ2xvYmFsX25hbWVfLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOworICBpc19saW5rZWRfID0gKGxpbmtTdGF0dXMgIT0gR0xfRkFMU0UpOworICBSZXNldEluZm9Mb2dDYWNoZSgpOworCisgIC8vIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZlIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zLiBBIHByb2dyYW0KKyAgLy8gdGhhdCBmYWlsZWQgdG8gbGluayBzaG91bGQgc3RpbGwgdHJ5IHRvIHJlcG9ydCBhY3RpdmUgYXR0cmlidXRlcy4KKyAgVXBkYXRlQWN0aXZlQXR0cmlidXRlcygpOworICBVcGRhdGVBY3RpdmVVbmlmb3JtcygpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBTaGFkZXJWYXJpYW50IEFjdGl2ZSBBdHRyaWJ1dGVzCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUHJvZ3JhbVZhcmlhbnQ6OlVwZGF0ZUFjdGl2ZUF0dHJpYnV0ZXMoKSB7CisgIGFjdGl2ZV9hdHRyaWJ1dGVzXy5jbGVhcigpOworICBhdHRyaWJ1dGVfbG9jYXRpb25zXyA9IHJlcXVlc3RlZF9hdHRyaWJ1dGVfbG9jYXRpb25zXzsKKworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIGlmIChjdHgtPkFyZUNoZWNrc0VuYWJsZWQoKSkgeworICAgIGludCBtYXhfbmVlZGVkID0gMDsKKyAgICBQQVNTX1RIUk9VR0goY3R4LCBHZXRQcm9ncmFtaXYsIGdsb2JhbF9uYW1lXywKKyAgICAgICAgICAgICAgICAgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAmbWF4X25lZWRlZCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtYXhfbmVlZGVkID4ga01heEF0dHJpYlVuaWZvcm1OYW1lTGVuZ3RoKTsKKyAgfQorCisgIEdMaW50IGF0dHJpYnV0ZV9jb3VudCA9IDA7CisgIE5hbWVMb2NhdGlvbk1hcCB1bmtub3duX2F0dHJpYnV0ZXMoYXR0cmlidXRlX2xvY2F0aW9uc18pOworICBQQVNTX1RIUk9VR0goY3R4LCBHZXRQcm9ncmFtaXYsIGdsb2JhbF9uYW1lXywKKyAgICAgICAgICAgICAgIEdMX0FDVElWRV9BVFRSSUJVVEVTLCAmYXR0cmlidXRlX2NvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVfY291bnQ7ICsraSkgeworICAgIGNoYXIgbmFtZVtrTWF4QXR0cmliVW5pZm9ybU5hbWVMZW5ndGhdOworICAgIG5hbWVbMF0gPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICBHTGludCBzaXplID0gMDsKKyAgICBQQVNTX1RIUk9VR0goY3R4LCBHZXRBY3RpdmVBdHRyaWIsIGdsb2JhbF9uYW1lXywgaSwKKyAgICAgICAgICAgICAgICAgc2l6ZW9mKG5hbWUpLCBOVUxMLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOworCisgICAgaWYgKG5hbWVbMF0gPT0gMCB8fCAoc3RybGVuKG5hbWUpID4gMyAmJiAhc3RybmNtcChuYW1lLCAiZ2xfIiwgMykpKSB7CisgICAgICAvLyBFaXRoZXIgZXJyb3Igb3IgYSBidWlsdC1pbiBhdHRyaWJ1dGUuIE5laXRoZXIgb2YgdGhvc2UgY2FzZXMgbmVlZHMKKyAgICAgIC8vIHJlcG9ydGluZyB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICB1bmtub3duX2F0dHJpYnV0ZXMuZXJhc2UobmFtZSk7CisgICAgYWN0aXZlX2F0dHJpYnV0ZXNfLnB1c2hfYmFjayhBY3RpdmVBdHRyaWJ1dGUobmFtZSwgdHlwZSwgc2l6ZSkpOworICB9CisKKyAgaWYgKGlzX2xpbmtlZF8pIHsKKyAgICAvLyBSZW1vdmUgYW55IHVubWF0Y2hlZCBhdHRyaWJ1dGUgbmFtZXMgZnJvbSB0aGUgbG9jYXRpb24gY2FjaGUKKyAgICAvLyBvbmNlIHRoZSBwcm9ncmFtIGhhcyBmaW5hbGx5IGxpbmtlZC4KKyAgICBmb3IgKE5hbWVMb2NhdGlvbk1hcDo6aXRlcmF0b3IgaXQgPSB1bmtub3duX2F0dHJpYnV0ZXMuYmVnaW4oKTsKKyAgICAgICAgICBpdCAhPSB1bmtub3duX2F0dHJpYnV0ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgIEFMT0dXKCJVbmtub3duIGF0dHJpYnV0ZSBuYW1lIGJvdW5kIHRvIGEgc2hhZGVyIHByb2dyYW06ICclcyciLAorICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCkpOworICAgICAgYXR0cmlidXRlX2xvY2F0aW9uc18uZXJhc2UoaXQtPmZpcnN0KTsKKyAgICB9CisgIH0KK30KKworaW50IFByb2dyYW1WYXJpYW50OjpHZXRBY3RpdmVBdHRyaWJNYXhOYW1lTGVuZ2goKSBjb25zdCB7CisgIHNpemVfdCBtYXhfbGVuID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVfYXR0cmlidXRlc18uc2l6ZSgpOyArK2kpIHsKKyAgICBtYXhfbGVuID0gc3RkOjptYXgobWF4X2xlbiwgYWN0aXZlX2F0dHJpYnV0ZXNfW2ldLkdldE5hbWUoKS5zaXplKCkpOworICB9CisgIHJldHVybiBtYXhfbGVuOworfQorCit2b2lkIFByb2dyYW1WYXJpYW50OjpHZXRBY3RpdmVBdHRyaWIoR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpIGNvbnN0IHsKKyAgaWYgKGJ1Zl9zaXplIDwgMCkgeworICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoYnVmX3NpemUpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoaW5kZXggPj0gYWN0aXZlX2F0dHJpYnV0ZXNfLnNpemUoKSkgeworICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoaW5kZXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IEFjdGl2ZUF0dHJpYnV0ZSYgYXR0cmlidXRlID0gYWN0aXZlX2F0dHJpYnV0ZXNfW2luZGV4XTsKKyAgaWYgKGxlbmd0aCkgeworICAgICpsZW5ndGggPSBhdHRyaWJ1dGUuR2V0TmFtZSgpLnNpemUoKTsKKyAgfQorICAqc2l6ZSA9IGF0dHJpYnV0ZS5HZXRTaXplKCk7CisgICp0eXBlID0gYXR0cmlidXRlLkdldFR5cGUoKTsKKyAgc25wcmludGYobmFtZSwgYnVmX3NpemUsICIlcyIsIGF0dHJpYnV0ZS5HZXROYW1lKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgUHJvZ3JhbVZhcmlhbnQ6OkJpbmRBdHRyaWJMb2NhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBsb2NhdGlvbikgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlzX2xpbmtlZF8pOworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIEdMaW50IGdsb2JhbF9uYW1lID0gR2V0T3JDcmVhdGVHbG9iYWxOYW1lKCk7CisgIFBBU1NfVEhST1VHSChjdHgsIEJpbmRBdHRyaWJMb2NhdGlvbiwgZ2xvYmFsX25hbWUsIGxvY2F0aW9uLCBuYW1lLmNfc3RyKCkpOworICByZXF1ZXN0ZWRfYXR0cmlidXRlX2xvY2F0aW9uc19bbmFtZV0gPSBsb2NhdGlvbjsKK30KKworc3RkOjpzdHJpbmcgUHJvZ3JhbVZhcmlhbnQ6OkdldEFjdGl2ZUF0dHJpYk5hbWVBbmRMb2NhdGlvbigKKyAgICBHTHVpbnQgaW5kZXgsIEdMaW50KiBsb2NhdGlvbikgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc19saW5rZWRfKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA+PSBhY3RpdmVfYXR0cmlidXRlc18uc2l6ZSgpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUgPSBhY3RpdmVfYXR0cmlidXRlc19baW5kZXhdLkdldE5hbWUoKTsKKyAgKmxvY2F0aW9uID0gR2V0QXR0cmliTG9jYXRpb24obmFtZSk7CisgIHJldHVybiBuYW1lOworfQorCitHTGludCBQcm9ncmFtVmFyaWFudDo6R2V0QXR0cmliTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzX2xpbmtlZF8pOworCisgIGlmIChhdHRyaWJ1dGVfbG9jYXRpb25zXy5jb3VudChuYW1lKSkgeworICAgIHJldHVybiBhdHRyaWJ1dGVfbG9jYXRpb25zX1tuYW1lXTsKKyAgfQorCisgIEdsZXNDb250ZXh0KiBjdHggPSBHZXRSZXF1aXJlZENvbnRleHQoKTsKKyAgR0xpbnQgbG9jYXRpb24gPSBQQVNTX1RIUk9VR0goY3R4LCBHZXRBdHRyaWJMb2NhdGlvbiwgZ2xvYmFsX25hbWVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICBhdHRyaWJ1dGVfbG9jYXRpb25zX1tuYW1lXSA9IGxvY2F0aW9uOworICByZXR1cm4gbG9jYXRpb247Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFNoYWRlclZhcmlhbnQgQWN0aXZlIFVuaWZvcm1zCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgUHJvZ3JhbVZhcmlhbnQ6OlVwZGF0ZUFjdGl2ZVVuaWZvcm1zKCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCF1bmlmb3JtX2xvY2F0aW9uc18uZW1wdHkoKSk7CisKKyAgYWN0aXZlX3VuaWZvcm1zXy5jbGVhcigpOworICB1bmlmb3JtX2Jhc2VfbmFtZXNfLmNsZWFyKCk7CisKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICBpZiAoY3R4LT5BcmVDaGVja3NFbmFibGVkKCkpIHsKKyAgICBpbnQgbWF4X25lZWRlZCA9IDA7CisgICAgUEFTU19USFJPVUdIKGN0eCwgR2V0UHJvZ3JhbWl2LCBnbG9iYWxfbmFtZV8sCisgICAgICAgICAgICAgICAgIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhfbmVlZGVkKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1heF9uZWVkZWQgPiBrTWF4QXR0cmliVW5pZm9ybU5hbWVMZW5ndGgpOworICB9CisKKyAgR0xpbnQgdW5pZm9ybV9jb3VudCA9IDA7CisgIFBBU1NfVEhST1VHSChjdHgsIEdldFByb2dyYW1pdiwgZ2xvYmFsX25hbWVfLAorICAgICAgICAgICAgICAgR0xfQUNUSVZFX1VOSUZPUk1TLCAmdW5pZm9ybV9jb3VudCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pZm9ybV9jb3VudDsgKytpKSB7CisgICAgLy8gRWFjaCBhY3RpdmUgdW5pZm9ybSByZXByZXNlbnRzIGEgc2VwYXJhdGUgdW5pZm9ybSwgYW4gYXJyYXksIG9yCisgICAgLy8gYW4gaW5kaXZpZHVhbCBlbGVtZW50IG9mIGEgc3RydWN0LiBTaXplIGlzIG9ubHkgdXNlZCB3aXRoIGFycmF5cy4KKyAgICBjaGFyIG5hbWVba01heEF0dHJpYlVuaWZvcm1OYW1lTGVuZ3RoXTsKKyAgICBuYW1lWzBdID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IDA7CisgICAgR0xpbnQgc2l6ZSA9IDA7CisgICAgUEFTU19USFJPVUdIKGN0eCwgR2V0QWN0aXZlVW5pZm9ybSwgZ2xvYmFsX25hbWVfLCBpLAorICAgICAgICAgICAgICAgICBzaXplb2YobmFtZSksIE5VTEwsICZzaXplLCAmdHlwZSwgbmFtZSk7CisKKyAgICBpbnQgbGVuID0gc3RybGVuKG5hbWUpOworICAgIGlmICghbGVuIHx8IChsZW4gPiAzICYmICFzdHJuY21wKG5hbWUsICJnbF8iLCAzKSkpIHsKKyAgICAgIC8vIEVpdGhlciBlcnJvciBvciBhIGJ1aWx0LWluIHVuaWZvcm0uIE5laXRoZXIgb2YgdGhvc2UgY2FzZXMgY2FuIGhhdmUKKyAgICAgIC8vIGEgbG9jYXRpb24gb3IgbmVlZCByZXBvcnRpbmcgdG8gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgQUxPR1YoIkZvdW5kIGFjdGl2ZSB1bmlmb3JtIG5hbWUgJyVzJywgdHlwZT0weCV4LCBzaXplPSVkIiwKKyAgICAgICAgICBuYW1lLCB0eXBlLCBzaXplKTsKKworICAgIGJvb2wgaXNfYXJyYXkgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBiYXNlX25hbWUgPSBuYW1lOworICAgIGlmIChsZW4gPj0gNCAmJiBuYW1lW2xlbiAtIDNdID09ICdbJyAmJgorICAgICAgICBuYW1lW2xlbiAtIDJdID09ICcwJyAmJiBuYW1lW2xlbiAtIDFdID09ICddJyApIHsKKyAgICAgIC8vIEN1dCB0aGUgdHJhaWxpbmcgIlswXSIgdGhhdCBpbmRpY2F0ZXMgYW4gYXJyYXkuCisgICAgICAvLyBQZXIgR0xFUzI6IElmIHRoZSBhY3RpdmUgdW5pZm9ybSBpcyBhbiBhcnJheSwgdGhlIHVuaWZvcm0gbmFtZQorICAgICAgLy8gcmV0dXJuZWQgaW4gbmFtZSB3aWxsIGFsd2F5cyBiZSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybSBhcnJheQorICAgICAgLy8gYXBwZW5kZWQgd2l0aCAiWzBdIi4KKyAgICAgIGJhc2VfbmFtZSA9IGJhc2VfbmFtZS5zdWJzdHIoMCwgbGVuIC0gMyk7CisgICAgICBpc19hcnJheSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKHVuaWZvcm1fYmFzZV9uYW1lc18uY291bnQoYmFzZV9uYW1lKSkgeworICAgICAgQUxPR1coIkRldGVjdGVkIG11bHRpcGxlIGFjdGl2ZSB1bmlmb3JtcyB3aXRoIHRoZSBzYW1lIGJhc2UgbmFtZTogJXMiLAorICAgICAgICAgICAgbmFtZSk7CisgICAgfQorCisgICAgdW5pZm9ybV9iYXNlX25hbWVzX1tiYXNlX25hbWVdID0gYWN0aXZlX3VuaWZvcm1zXy5zaXplKCk7CisgICAgYWN0aXZlX3VuaWZvcm1zXy5wdXNoX2JhY2soCisgICAgICAgIEFjdGl2ZVVuaWZvcm0obmFtZSwgYmFzZV9uYW1lLCB0eXBlLCBpc19hcnJheSwgc2l6ZSkpOworICB9Cit9CisKK2ludCBQcm9ncmFtVmFyaWFudDo6R2V0QWN0aXZlVW5pZm9ybU1heE5hbWVMZW5naCgpIGNvbnN0IHsKKyAgc2l6ZV90IG1heF9sZW4gPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZV91bmlmb3Jtc18uc2l6ZSgpOyArK2kpIHsKKyAgICBtYXhfbGVuID0gc3RkOjptYXgobWF4X2xlbiwgYWN0aXZlX3VuaWZvcm1zX1tpXS5HZXRPcmlnaW5hbE5hbWUoKS5zaXplKCkpOworICB9CisgIHJldHVybiBtYXhfbGVuOworfQorCitjb25zdCBQcm9ncmFtVmFyaWFudDo6QWN0aXZlVW5pZm9ybSYgUHJvZ3JhbVZhcmlhbnQ6OkdldEFjdGl2ZVVuaWZvcm0oCisgICAgR0x1aW50IGluZGV4KSBjb25zdCB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPj0gYWN0aXZlX3VuaWZvcm1zXy5zaXplKCkpOworICByZXR1cm4gYWN0aXZlX3VuaWZvcm1zX1tpbmRleF07Cit9CisKK3ZvaWQgUHJvZ3JhbVZhcmlhbnQ6OkdldEFjdGl2ZVVuaWZvcm0oR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgY29uc3QgeworICBpZiAoYnVmX3NpemUgPCAwKSB7CisgICAgR0xFU19FUlJPUl9JTlZBTElEX1ZBTFVFX0lOVChidWZfc2l6ZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChpbmRleCA+PSBhY3RpdmVfdW5pZm9ybXNfLnNpemUoKSkgeworICAgIEdMRVNfRVJST1JfSU5WQUxJRF9WQUxVRV9JTlQoaW5kZXgpOworICAgIHJldHVybjsKKyAgfQorCisgIGNvbnN0IEFjdGl2ZVVuaWZvcm0mIHVuaWZvcm0gPSBhY3RpdmVfdW5pZm9ybXNfW2luZGV4XTsKKyAgaWYgKGxlbmd0aCkgeworICAgICpsZW5ndGggPSB1bmlmb3JtLkdldE9yaWdpbmFsTmFtZSgpLnNpemUoKTsKKyAgfQorICAqc2l6ZSA9IHVuaWZvcm0uR2V0QXJyYXlTaXplKCk7CisgICp0eXBlID0gdW5pZm9ybS5HZXRUeXBlKCk7CisgIHNucHJpbnRmKG5hbWUsIGJ1Zl9zaXplLCAiJXMiLCB1bmlmb3JtLkdldE9yaWdpbmFsTmFtZSgpLmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBQcm9ncmFtVmFyaWFudDo6UGFyc2VVbmlmb3JtTmFtZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50KiBhcnJheV9pbmRleCkgY29uc3QgeworICBzdGQ6OnN0cmluZyBiYXNlX25hbWUgPSBuYW1lOworICBzaXplX3QgbGVuID0gbmFtZS5zaXplKCk7CisgIGlmIChsZW4gPiAwICYmIG5hbWVbbGVuIC0gMV0gPT0gJ10nKSB7CisgICAgaWYgKGxlbiA8IDQpIHsKKyAgICAgIEFMT0dXKCJJbnZhbGlkIHVuaWZvcm0gbmFtZTogJyVzJyIsIG5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gIiI7ICAvLyBObyBzcGFjZSBmb3IgdGhlIG5hbWUgYW5kIGluZGV4LgorICAgIH0KKyAgICBzaXplX3QgcG9zID0gbmFtZS5yZmluZCgnWycsIGxlbiAtIDEpOworICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgcG9zID09IDAgfHwgcG9zID09IChsZW4gLSAyKSkgeworICAgICAgQUxPR1coIkludmFsaWQgdW5pZm9ybSBuYW1lOiAnJXMnIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiAiIjsgIC8vIE5vIHNxdWFyZSBicmFja2V0LCBhcnJheSBuYW1lLCBvciBpbmRleC4KKyAgICB9CisgICAgYmFzZV9uYW1lID0gbmFtZS5zdWJzdHIoMCwgcG9zKTsKKyAgICBzdGQ6OnN0cmluZyBpZHhfc3RyID0gbmFtZS5zdWJzdHIocG9zICsgMSwgbGVuIC0gcG9zIC0gMik7CisgICAgY2hhciogZW5kcHRyID0gTlVMTDsKKyAgICBpbnQgaWR4ID0gc3RhdGljX2Nhc3Q8aW50PihzdHJ0b2woaWR4X3N0ci5jX3N0cigpLCAmZW5kcHRyLCAxMCkpOworICAgIGlmIChpZHggPCAwIHx8ICplbmRwdHIgIT0gJ1wwJykgeworICAgICAgQUxPR1coIkludmFsaWQgYXJyYXkgaW5kZXggaW4gdW5pZm9ybSBuYW1lOiAnJXMnIiwgbmFtZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiAiIjsgIC8vIE91dC1vZi1yYW5nZSBvciB1bnBhcnNlYWJsZSBpbmRleC4KKyAgICB9CisgICAgKmFycmF5X2luZGV4ID0gaWR4OworICB9IGVsc2UgeworICAgICphcnJheV9pbmRleCA9IDA7CisgIH0KKworICBOYW1lTG9jYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdW5pZm9ybV9iYXNlX25hbWVzXy5maW5kKGJhc2VfbmFtZSk7CisgIGlmIChpdCA9PSB1bmlmb3JtX2Jhc2VfbmFtZXNfLmVuZCgpKSB7CisgICAgQUxPR0koIlVuYWJsZSB0byBmaW5kIGFjdGl2ZSB1bmlmb3JtIGZvciAnJXMnIGluIGdsb2JhbCBwcm9ncmFtICVkLCAiCisgICAgICAgICAgImJhc2UgbmFtZSAnJXMnLCBhcnJheSBpbmRleCAlZCIsCisgICAgICAgICAgbmFtZS5jX3N0cigpLCBnbG9iYWxfbmFtZV8sIGJhc2VfbmFtZS5jX3N0cigpLCAqYXJyYXlfaW5kZXgpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIEdMaW50IGFycmF5X3NpemUgPSBhY3RpdmVfdW5pZm9ybXNfW2l0LT5zZWNvbmRdLkdldEFycmF5U2l6ZSgpOworICBpZiAoKmFycmF5X2luZGV4ID49IGFycmF5X3NpemUpIHsKKyAgICBBTE9HVygiVW5pZm9ybSBhcnJheSBpbmRleCAlZCBvdXQgb2YgcmFuZ2UgKCVkKTogJyVzJyIsCisgICAgICAgICAgKmFycmF5X2luZGV4LCBhcnJheV9zaXplLCBuYW1lLmNfc3RyKCkpOworICAgIHJldHVybiAiIjsKKyAgfQorICByZXR1cm4gYmFzZV9uYW1lOworfQorCitHTGludCBQcm9ncmFtVmFyaWFudDo6R2V0VW5pZm9ybUxvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFpc19saW5rZWRfKTsKKworICBpZiAodW5pZm9ybV9sb2NhdGlvbnNfLmNvdW50KG5hbWUpKSB7CisgICAgcmV0dXJuIHVuaWZvcm1fbG9jYXRpb25zXy5maW5kKG5hbWUpLT5zZWNvbmQ7CisgIH0KKworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIEdMaW50IGxvY2F0aW9uID0gUEFTU19USFJPVUdIKGN0eCwgR2V0VW5pZm9ybUxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbmFtZV8sIG5hbWUuY19zdHIoKSk7CisgIGlmIChsb2NhdGlvbiA9PSAtMSkgeworICAgIEFMT0dXKCJVbmlmb3JtICclcycgbm90IGZvdW5kIGluIGEgbGlua2VkIHByb2dyYW0iLCBuYW1lLmNfc3RyKCkpOworICAgIC8vIEZhbGwgdGhyb3VnaCB0byBjYWNoZSB0aGUgZXJyb3IgcmVzdWx0LgorICB9CisKKyAgdW5pZm9ybV9sb2NhdGlvbnNfW25hbWVdID0gbG9jYXRpb247CisgIHJldHVybiBsb2NhdGlvbjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fdmFyaWFudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcHJvZ3JhbV92YXJpYW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkODlkNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3Byb2dyYW1fdmFyaWFudC5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QUk9HUkFNX1ZBUklBTlRfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QUk9HUkFNX1ZBUklBTlRfSF8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgImdsZXMvZGlydGlhYmxlLmgiCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvc2hhZGVyX3ZhcmlhbnQuaCIKKworY2xhc3MgR2xlc0NvbnRleHQ7CisKKy8vIFJlcHJlc2VudHMgYSBwcm9ncmFtIGFkanVzdGVkIGZvciBhIHBhcnRpY3VsYXIgdXNlLiBOb3JtYWxseSwgdGhlcmUgaXMgb25seQorLy8gb25lIHZhcmlhbnQgcGVyIGxpbmtlZCBwcm9ncmFtLiBBIG5ldyB2YXJpYW50IG1heSBhcHBlYXIgd2hlbiB0aGUgYmFja2luZworLy8gdGV4dHVyZSB0YXJnZXQgcmVxdWlyZXMgYSBkaWZmZXJlbnQgdmFyaWFudCBvZiB0aGUgZnJhZ21lbnQgc2hhZGVyLgorLy8gRnVuY3Rpb25zIChpbmNsdWRpbmcgZGVzdHJ1Y3RvcikgbWF5IHBhc3MgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgR0wKKy8vIGltcGxlbWVudGF0aW9uLCBhbmQgc28gbXVzdCBiZSBjYWxsZWQgd2l0aCBhbiBhY3RpdmUgY29udGV4dC4KKy8vIEEgbGlua2VkIFByb2dyYW1WYXJpYW50IGluc3RhbmNlIGNhbm5vdCBiZSByZS1saW5rZWQuCitjbGFzcyBQcm9ncmFtVmFyaWFudCA6IHB1YmxpYyBhbmRyb2lkOjpSZWZCYXNlIHsKKyBwdWJsaWM6CisgIFByb2dyYW1WYXJpYW50KCk7CisKKyAgYm9vbCBJc0xpbmtlZCgpIGNvbnN0IHsgcmV0dXJuIGlzX2xpbmtlZF87IH0KKyAgYm9vbCBJc0xpbmtBdHRlbXB0ZWQoKSBjb25zdCB7IHJldHVybiBpc19saW5rX2F0dGVtcHRlZF87IH0KKworICBzdGQ6OnN0cmluZyBHZXRJbmZvTG9nKCkgY29uc3Q7CisgIHZvaWQgUmVzZXRJbmZvTG9nQ2FjaGUoKTsKKworICBHTHVpbnQgR2V0T3JDcmVhdGVHbG9iYWxOYW1lKCk7CisKKyAgdm9pZCBBdHRhY2hTaGFkZXIoU2hhZGVyVmFyaWFudFB0ciBzaGFkZXIpOworICB2b2lkIERldGFjaFNoYWRlcihTaGFkZXJWYXJpYW50UHRyIHNoYWRlcik7CisgIFNoYWRlclZhcmlhbnRQdHIgR2V0VmVydGV4U2hhZGVyKCkgY29uc3QgeyByZXR1cm4gdmVydGV4X3NoYWRlcl87IH0KKyAgU2hhZGVyVmFyaWFudFB0ciBHZXRGcmFnbWVudFNoYWRlcigpIGNvbnN0IHsgcmV0dXJuIGZyYWdtZW50X3NoYWRlcl87IH0KKworICB2b2lkIExpbmsoKTsKKworICAvLyBDbG9uZXMgdGhpcyBwcm9ncmFtIGludG8gYSBuZXcgdmFyaWFudC4gQ3VycmVudCBwcm9ncmFtIG11c3QgYmUgbGlua2VkLgorICAvLyBUaGUgcmVzdWx0aW5nIHByb2dyYW0gd2lsbCBoYXZlIHRoZSBzYW1lIHNoYWRlcnMsIGJ1dCB3aWxsIG5vdCBiZSBsaW5rZWQuCisgIFByb2dyYW1WYXJpYW50KiBDbG9uZSgpIGNvbnN0OworCisgIGJvb2wgVXNlc0V4dGVybmFsVGV4dHVyZUFzMkQoKSBjb25zdDsKKworICAvLyBEZXNjcmliZXMgb25lIGFjdGl2ZSBhdHRyaWJ1dGUgb2YgdGhpcyBwcm9ncmFtLgorICBzdHJ1Y3QgQWN0aXZlQXR0cmlidXRlIHsKKyAgICBBY3RpdmVBdHRyaWJ1dGUoKSA6IHR5cGVfKC0xKSwgc2l6ZV8oLTEpIHt9CisgICAgQWN0aXZlQXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBHTGVudW0gdHlwZSwgR0xpbnQgc2l6ZSkKKyAgICAgICAgOiBuYW1lXyhuYW1lKSwgdHlwZV8odHlwZSksIHNpemVfKHNpemUpIHt9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisgICAgR0xlbnVtIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorICAgIEdMaW50IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplXzsgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG5hbWVfOworICAgIEdMZW51bSB0eXBlXzsKKyAgICBHTGludCBzaXplXzsKKyAgfTsKKworICBpbnQgR2V0QWN0aXZlQXR0cmliQ291bnQoKSBjb25zdCB7IHJldHVybiBhY3RpdmVfYXR0cmlidXRlc18uc2l6ZSgpOyB9CisgIGludCBHZXRBY3RpdmVBdHRyaWJNYXhOYW1lTGVuZ2goKSBjb25zdDsKKyAgdm9pZCBHZXRBY3RpdmVBdHRyaWIoR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1Zl9zaXplLCBHTHNpemVpKiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIEdldEFjdGl2ZUF0dHJpYk5hbWVBbmRMb2NhdGlvbihHTHVpbnQgaW5kZXgsIEdMaW50KiBsb2NhdGlvbik7CisgIHZvaWQgQmluZEF0dHJpYkxvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBHTGludCBsb2NhdGlvbik7CisgIEdMaW50IEdldEF0dHJpYkxvY2F0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICAvLyBEZXNjcmliZXMgb25lIGFjdGl2ZSB1bmlmb3JtIG9mIHRoaXMgcHJvZ3JhbS4KKyAgc3RydWN0IEFjdGl2ZVVuaWZvcm0geworICAgIEFjdGl2ZVVuaWZvcm0oKSA6IHR5cGVfKDApLCBpc19hcnJheV8oZmFsc2UpLCBhcnJheV9zaXplXygwKSB7fQorICAgIEFjdGl2ZVVuaWZvcm0oY29uc3Qgc3RkOjpzdHJpbmcmIG9yaWdpbmFsX25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgR0xlbnVtIHR5cGUsIGJvb2wgaXNfYXJyYXksIEdMaW50IGFycmF5X3NpemUpCisgICAgICAgIDogb3JpZ2luYWxfbmFtZV8ob3JpZ2luYWxfbmFtZSksIGJhc2VfbmFtZV8oYmFzZV9uYW1lKSwKKyAgICAgICAgICB0eXBlXyh0eXBlKSwgaXNfYXJyYXlfKGlzX2FycmF5KSwgYXJyYXlfc2l6ZV8oYXJyYXlfc2l6ZSkge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRPcmlnaW5hbE5hbWUoKSBjb25zdCB7IHJldHVybiBvcmlnaW5hbF9uYW1lXzsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRCYXNlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfbmFtZV87IH0KKyAgICBHTGVudW0gR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisgICAgYm9vbCBJc0FycmF5KCkgY29uc3QgeyByZXR1cm4gaXNfYXJyYXlfOyB9CisgICAgR0xpbnQgR2V0QXJyYXlTaXplKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfc2l6ZV87IH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBvcmlnaW5hbF9uYW1lXzsKKyAgICBzdGQ6OnN0cmluZyBiYXNlX25hbWVfOworICAgIEdMZW51bSB0eXBlXzsKKyAgICBib29sIGlzX2FycmF5XzsKKyAgICBHTGludCBhcnJheV9zaXplXzsKKyAgfTsKKworICBpbnQgR2V0QWN0aXZlVW5pZm9ybUNvdW50KCkgY29uc3QgeyByZXR1cm4gYWN0aXZlX3VuaWZvcm1zXy5zaXplKCk7IH0KKyAgaW50IEdldEFjdGl2ZVVuaWZvcm1NYXhOYW1lTGVuZ2goKSBjb25zdDsKKyAgdm9pZCBHZXRBY3RpdmVVbmlmb3JtKEdMdWludCBpbmRleCwgR0xzaXplaSBidWZfc2l6ZSwgR0xzaXplaSogbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKSBjb25zdDsKKyAgY29uc3QgQWN0aXZlVW5pZm9ybSYgR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgaW5kZXgpIGNvbnN0OworICAvLyBQYXJzZXMgdGhlIGdpdmVuIG5hbWUsIG1hdGNoZXMgYWdhaW5zdCB0aGUgbGlzdCBvZiBrbm93biBhY3RpdmUgdW5pZm9ybXMsCisgIC8vIHZlcmlmaWVzIGFycmF5IGluZGV4IGFuZCByZXR1cm5zIHVuaWZvcm0gYmFzZSBuYW1lLgorICAvLyBJbiBjYXNlIG9mIGVycm9yIHJldHVybnMgZW1wdHkgc3RyaW5nLgorICBzdGQ6OnN0cmluZyBQYXJzZVVuaWZvcm1OYW1lKAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludCogYXJyYXlfaW5kZXgpIGNvbnN0OworICBHTGludCBHZXRVbmlmb3JtTG9jYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5Qcm9ncmFtVmFyaWFudCgpOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgR0xpbnQ+IE5hbWVMb2NhdGlvbk1hcDsKKworICB2b2lkIEVuc3VyZUxpdmVQcm9ncmFtT2JqZWN0KEdsZXNDb250ZXh0KiBjdHgpOworICB2b2lkIFVwZGF0ZUFjdGl2ZUF0dHJpYnV0ZXMoKTsKKyAgdm9pZCBVcGRhdGVBY3RpdmVVbmlmb3JtcygpOworCisgIEdMdWludCBnbG9iYWxfbmFtZV87CisgIFNoYWRlclZhcmlhbnRQdHIgdmVydGV4X3NoYWRlcl87CisgIFNoYWRlclZhcmlhbnRQdHIgZnJhZ21lbnRfc2hhZGVyXzsKKyAgc3RkOjp2ZWN0b3I8QWN0aXZlQXR0cmlidXRlPiBhY3RpdmVfYXR0cmlidXRlc187CisgIHN0ZDo6dmVjdG9yPEFjdGl2ZVVuaWZvcm0+IGFjdGl2ZV91bmlmb3Jtc187CisgIC8vIE1hcHMgYmFzZSBuYW1lIHRvIGluZGV4IGluc2lkZSBhY3RpdmVfdW5pZm9ybXNfLgorICBOYW1lTG9jYXRpb25NYXAgdW5pZm9ybV9iYXNlX25hbWVzXzsKKyAgTmFtZUxvY2F0aW9uTWFwIGF0dHJpYnV0ZV9sb2NhdGlvbnNfOworICBOYW1lTG9jYXRpb25NYXAgcmVxdWVzdGVkX2F0dHJpYnV0ZV9sb2NhdGlvbnNfOworICBOYW1lTG9jYXRpb25NYXAgdW5pZm9ybV9sb2NhdGlvbnNfOworICBib29sIGlzX2xpbmtlZF87CisgIGJvb2wgaXNfbGlua19hdHRlbXB0ZWRfOworICBtdXRhYmxlIERpcnRpYWJsZTxzdGQ6OnN0cmluZz4gaW5mb19sb2dfY2FjaGVfOworICBtdXRhYmxlIGFuZHJvaWQ6OmJhc2U6OkxvY2sgbG9ja187CisKKyAgUHJvZ3JhbVZhcmlhbnQoY29uc3QgUHJvZ3JhbVZhcmlhbnQmKTsKKyAgUHJvZ3JhbVZhcmlhbnQmIG9wZXJhdG9yPShjb25zdCBQcm9ncmFtVmFyaWFudCYpOworfTsKKwordHlwZWRlZiBhbmRyb2lkOjpzcDxQcm9ncmFtVmFyaWFudD4gUHJvZ3JhbVZhcmlhbnRQdHI7CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19QUk9HUkFNX1ZBUklBTlRfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3JlbmRlcmJ1ZmZlcl9kYXRhLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3JlbmRlcmJ1ZmZlcl9kYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzY2YjNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcmVuZGVyYnVmZmVyX2RhdGEuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImdsZXMvcmVuZGVyYnVmZmVyX2RhdGEuaCIKKworUmVuZGVyYnVmZmVyRGF0YTo6UmVuZGVyYnVmZmVyRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkKKyAgOiBPYmplY3REYXRhKFJFTkRFUkJVRkZFUiwgbmFtZSksCisgICAgYXR0YWNoX2Zib18oMCksCisgICAgYXR0YWNoX3BvaW50XygwKSwKKyAgICB0YXJnZXRfKDApLAorICAgIGZvcm1hdF8oMCksCisgICAgd2lkdGhfKDApLAorICAgIGhlaWdodF8oMCkgeworfQorCitSZW5kZXJidWZmZXJEYXRhOjp+UmVuZGVyYnVmZmVyRGF0YSgpIHsKK30KKwordm9pZCBSZW5kZXJidWZmZXJEYXRhOjpBdHRhY2hGcmFtZWJ1ZmZlcihHTHVpbnQgbmFtZSwgR0xlbnVtIHRhcmdldCkgeworICBhdHRhY2hfZmJvXyA9IG5hbWU7CisgIGF0dGFjaF9wb2ludF8gPSB0YXJnZXQ7Cit9CisKK3ZvaWQgUmVuZGVyYnVmZmVyRGF0YTo6RGV0YWNoRnJhbWVidWZmZXIoKSB7CisgIGF0dGFjaF9mYm9fID0gMDsKKyAgYXR0YWNoX3BvaW50XyA9IDA7Cit9CisKK0dMdWludCBSZW5kZXJidWZmZXJEYXRhOjpHZXRXaWR0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltYWdlXyAhPSBOVUxMID8gaW1hZ2VfLT53aWR0aCA6IHdpZHRoXzsKK30KKworR0x1aW50IFJlbmRlcmJ1ZmZlckRhdGE6OkdldEhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltYWdlXyAhPSBOVUxMID8gaW1hZ2VfLT5oZWlnaHQgOiBoZWlnaHRfOworfQorCitHTGVudW0gUmVuZGVyYnVmZmVyRGF0YTo6R2V0Rm9ybWF0KCkgY29uc3QgeworICByZXR1cm4gaW1hZ2VfICE9IE5VTEwgPyBpbWFnZV8tPmZvcm1hdCA6IGZvcm1hdF87Cit9CisKK0dMaW50IFJlbmRlcmJ1ZmZlckRhdGE6OkdldEVnbEltYWdlVGV4dHVyZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGltYWdlXyAhPSBOVUxMID8gaW1hZ2VfLT5nbG9iYWxfdGV4dHVyZV9uYW1lIDogMDsKK30KKwordm9pZCBSZW5kZXJidWZmZXJEYXRhOjpTZXRFZ2xJbWFnZShjb25zdCBFZ2xJbWFnZVB0ciYgaW1hZ2UpIHsKKyAgaW1hZ2VfID0gaW1hZ2U7CisgIHRhcmdldF8gPSAwOworICBmb3JtYXRfID0gMDsKKyAgd2lkdGhfID0gMDsKKyAgaGVpZ2h0XyA9IDA7Cit9CisKK3ZvaWQgUmVuZGVyYnVmZmVyRGF0YTo6U2V0RGF0YVN0b3JlKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgaGVpZ2h0KSB7CisgIGltYWdlXyA9IE5VTEw7CisgIHRhcmdldF8gPSB0YXJnZXQ7CisgIGZvcm1hdF8gPSBmb3JtYXQ7CisgIHdpZHRoXyA9IHdpZHRoOworICBoZWlnaHRfID0gaGVpZ2h0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvcmVuZGVyYnVmZmVyX2RhdGEuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3JlbmRlcmJ1ZmZlcl9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3MGYyZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3JlbmRlcmJ1ZmZlcl9kYXRhLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfUkVOREVSQlVGRkVSX0RBVEFfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19SRU5ERVJCVUZGRVJfREFUQV9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvZWdsX2ltYWdlLmgiCisKK2NsYXNzIFJlbmRlcmJ1ZmZlckRhdGEgOiBwdWJsaWMgT2JqZWN0RGF0YSB7CisgcHVibGljOgorICBleHBsaWNpdCBSZW5kZXJidWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKTsKKworICB2b2lkIFNldEVnbEltYWdlKGNvbnN0IEVnbEltYWdlUHRyJiBpbWFnZSk7CisgIHZvaWQgU2V0RGF0YVN0b3JlKEdMZW51bSB0YXJnZXQsIEdMZW51bSBmb3JtYXQsIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOworCisgIEdMdWludCBHZXRXaWR0aCgpIGNvbnN0OworICBHTHVpbnQgR2V0SGVpZ2h0KCkgY29uc3Q7CisgIEdMZW51bSBHZXRGb3JtYXQoKSBjb25zdDsKKyAgR0xpbnQgR2V0RWdsSW1hZ2VUZXh0dXJlKCkgY29uc3Q7CisKKyAgdm9pZCBBdHRhY2hGcmFtZWJ1ZmZlcihHTHVpbnQgbmFtZSwgR0xlbnVtIHRhcmdldCk7CisgIHZvaWQgRGV0YWNoRnJhbWVidWZmZXIoKTsKKworICBib29sIElzQXR0YWNoZWQoKSBjb25zdCB7IHJldHVybiBhdHRhY2hfZmJvXyAhPSAwOyB9CisgIEdMZW51bSBHZXRBdHRhY2htZW50KCkgY29uc3QgeyByZXR1cm4gYXR0YWNoX3BvaW50XzsgfQorICBHTHVpbnQgR2V0QXR0YWNoZWRGcmFtZWJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIGF0dGFjaF9mYm9fOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgflJlbmRlcmJ1ZmZlckRhdGEoKTsKKworIHByaXZhdGU6CisgIEdMdWludCBhdHRhY2hfZmJvXzsKKyAgR0xlbnVtIGF0dGFjaF9wb2ludF87CisKKyAgR0xlbnVtIHRhcmdldF87CisgIEdMZW51bSBmb3JtYXRfOworICBHTHVpbnQgd2lkdGhfOworICBHTHVpbnQgaGVpZ2h0XzsKKyAgRWdsSW1hZ2VQdHIgaW1hZ2VfOworCisgIFJlbmRlcmJ1ZmZlckRhdGEoY29uc3QgUmVuZGVyYnVmZmVyRGF0YSYpOworICBSZW5kZXJidWZmZXJEYXRhJiBvcGVyYXRvcj0oY29uc3QgUmVuZGVyYnVmZmVyRGF0YSYpOworfTsKKwordHlwZWRlZiBhbmRyb2lkOjpzcDxSZW5kZXJidWZmZXJEYXRhPiBSZW5kZXJidWZmZXJEYXRhUHRyOworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfUkVOREVSQlVGRkVSX0RBVEFfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3NoYWRlcl9kYXRhLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3NoYWRlcl9kYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQzZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc2hhZGVyX2RhdGEuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJnbGVzL3NoYWRlcl9kYXRhLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJnbGVzL21hY3Jvcy5oIgorCitTaGFkZXJEYXRhOjpTaGFkZXJEYXRhKE9iamVjdFR5cGUgdHlwZSwgT2JqZWN0TG9jYWxOYW1lIG5hbWUpCisgIDogT2JqZWN0RGF0YSh0eXBlLCBuYW1lKSwgc2hhZGVyX3ZhcmlhbnRfKG5ldyBTaGFkZXJWYXJpYW50KHR5cGUpKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYodHlwZSAhPSBWRVJURVhfU0hBREVSICYmIHR5cGUgIT0gRlJBR01FTlRfU0hBREVSKTsKK30KKworU2hhZGVyRGF0YTo6flNoYWRlckRhdGEoKSB7Cit9CisKK3ZvaWQgU2hhZGVyRGF0YTo6U2V0U291cmNlKEdMc2l6ZWkgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGNoYXIqIGNvbnN0KiBzdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQqIGxlbmd0aCkgeworICBpZiAoc2hhZGVyX3ZhcmlhbnRfLT5Jc0NvbXBpbGVSZXF1ZXN0ZWQoKSkgeworICAgIC8vIEN1cnJlbnQgc2hhZGVyIHZhcmlhbnQgaGFzIGJlZW4gY29tcGlsZWQgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLCBpdCBjb3VsZAorICAgIC8vIGJlIGFscmVhZHkgaW4gdXNlIHdpdGggYSBwcm9ncmFtLiBBdm9pZCB0b3VjaGluZyB0aGUgY3VycmVudCBzaGFkZXIKKyAgICAvLyB2YXJpYW50IGFuZCBjcmVhdGUgYSBuZXcgb25lLgorICAgIHNoYWRlcl92YXJpYW50XyA9IFNoYWRlclZhcmlhbnRQdHIobmV3IFNoYWRlclZhcmlhbnQoR2V0RGF0YVR5cGUoKSkpOworICB9CisKKyAgc2l6ZV90IHNpemUgPSAxOyAgLy8gKzEgZm9yIHRoZSBOVUxMIHRlcm1pbmF0b3IuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIGlmIChsZW5ndGggJiYgbGVuZ3RoW2ldID49IDApIHsKKyAgICAgIHNpemUgKz0gbGVuZ3RoW2ldOworICAgIH0gZWxzZSB7CisgICAgICBzaXplICs9IHN0cmxlbihzdHJpbmdzW2ldKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBzcmM7CisgIHNyYy5yZXNlcnZlKHNpemUpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAobGVuZ3RoICYmIGxlbmd0aFtpXSA+PSAwKSB7CisgICAgICBzcmMuYXBwZW5kKHN0cmluZ3NbaV0sIGxlbmd0aFtpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyYy5hcHBlbmQoc3RyaW5nc1tpXSk7CisgICAgfQorICB9CisKKyAgc2hhZGVyX3ZhcmlhbnRfLT5TZXRTb3VyY2Uoc3JjKTsKKworI2lmZGVmIEVOQUJMRV9BUElfTE9HR0lORworICBBTE9HSSgiU2V0dGluZyBzaGFkZXIgc291cmNlIGZvciAlZCglZCk6XG4iCisgICAgICAgICAiLS0tIE9yaWdpbmFsIFNvdXJjZSAtLS1cbiVzXG4iCisgICAgICAgICAiLS0tIE1vZGlmaWVkIFNvdXJjZSAtLS1cbiVzXG4iCisgICAgICAgICAiLS0tICBFbmQgb2YgU291cmNlICAtLS1cbiIsCisgICAgICAgICBHZXRMb2NhbE5hbWUoKSwgc2hhZGVyX3ZhcmlhbnRfLT5HZXRPckNyZWF0ZUdsb2JhbE5hbWUoKSwKKyAgICAgICAgIHNyYy5jX3N0cigpLCBzaGFkZXJfdmFyaWFudF8tPkdldFVwZGF0ZWRTb3VyY2UoKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit2b2lkIFNoYWRlckRhdGE6OkdldFNvdXJjZShHTHNpemVpIGJ1Zl9zaXplLCBHTHNpemVpKiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGNoYXIqIHNvdXJjZSkgY29uc3QgeworICBpbnQgYWN0dWFsX2xlbiA9IDA7CisgIGlmIChzb3VyY2UgJiYgYnVmX3NpemUgPiAwKSB7CisgICAgYWN0dWFsX2xlbiA9IHNucHJpbnRmKHNvdXJjZSwgYnVmX3NpemUsICIlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl92YXJpYW50Xy0+R2V0T3JpZ2luYWxTb3VyY2UoKS5jX3N0cigpKTsKKyAgICBpZiAoYWN0dWFsX2xlbiA+PSBidWZfc2l6ZSkgeworICAgICAgYWN0dWFsX2xlbiA9IGJ1Zl9zaXplIC0gMTsgIC8vIFRleHQgd2FzIHRydW5jYXRlZC4KKyAgICB9CisgIH0KKyAgaWYgKGxlbmd0aCkgeworICAgICpsZW5ndGggPSBhY3R1YWxfbGVuOworICB9Cit9CisKK3ZvaWQgU2hhZGVyRGF0YTo6U2V0QmluYXJ5KEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IHZvaWQqIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgbGVuZ3RoKSB7CisgIEdMRVNfRVJST1IoR0xfSU5WQUxJRF9PUEVSQVRJT04sICJnbFNoYWRlckJpbmFyeSBpcyBub3Qgc3VwcG9ydGVkIik7Cit9CisKK3ZvaWQgU2hhZGVyRGF0YTo6R2V0U2hhZGVyaXYoR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSBjb25zdCB7CisgIHN3aXRjaCAocG5hbWUpIHsKKyAgICBjYXNlIEdMX1NIQURFUl9UWVBFOgorICAgICAgKnBhcmFtcyA9IChHZXREYXRhVHlwZSgpID09IFZFUlRFWF9TSEFERVIgPworICAgICAgICAgIEdMX1ZFUlRFWF9TSEFERVIgOiBHTF9GUkFHTUVOVF9TSEFERVIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9ERUxFVEVfU1RBVFVTOgorICAgICAgKnBhcmFtcyA9IEdMX0ZBTFNFOyAgLy8gTm90IHN1cHBvcnRlZCAoY3JidWcuY29tLzQyNDM1MykuCisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIOgorICAgICAgKnBhcmFtcyA9IHNoYWRlcl92YXJpYW50Xy0+R2V0T3JpZ2luYWxTb3VyY2UoKS5zaXplKCkgKyAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTkZPX0xPR19MRU5HVEg6CisgICAgICAqcGFyYW1zID0gc2hhZGVyX3ZhcmlhbnRfLT5HZXRJbmZvTG9nKCkuc2l6ZSgpICsgMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfQ09NUElMRV9TVEFUVVM6CisgICAgICAqcGFyYW1zID0gKHNoYWRlcl92YXJpYW50Xy0+VmVyaWZ5U3VjY2Vzc2Z1bENvbXBpbGUoKSA/CisgICAgICAgICAgR0xfVFJVRSA6IEdMX0ZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHTEVTX0VSUk9SX0lOVkFMSURfRU5VTShwbmFtZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIFNoYWRlckRhdGE6OkdldEluZm9Mb2coR0xzaXplaSBtYXhfbGVuZ3RoLCBHTHNpemVpKiBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xjaGFyKiBpbmZvX2xvZykgY29uc3QgeworICBpbnQgaW5mb19sZW4gPSBzbnByaW50ZihpbmZvX2xvZywgbWF4X2xlbmd0aCwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3ZhcmlhbnRfLT5HZXRJbmZvTG9nKCkuY19zdHIoKSk7CisgIGlmIChpbmZvX2xlbiA+PSBtYXhfbGVuZ3RoKSB7CisgICAgaW5mb19sZW4gPSBtYXhfbGVuZ3RoIC0gMTsgIC8vIFRleHQgd2FzIHRydW5jYXRlZC4KKyAgfQorICBpZiAobGVuZ3RoKSB7CisgICAgKmxlbmd0aCA9IGluZm9fbGVuOworICB9Cit9CisKK3ZvaWQgU2hhZGVyRGF0YTo6Q29tcGlsZSgpIHsKKyAgc2hhZGVyX3ZhcmlhbnRfLT5Db21waWxlKCk7CisKKyNpZmRlZiBFTkFCTEVfQVBJX0xPR0dJTkcKKyAgaWYgKCFzaGFkZXJfdmFyaWFudF8tPlZlcmlmeVN1Y2Nlc3NmdWxDb21waWxlKCkpIHsKKyAgICBBTE9HRSgiVW5hYmxlIHRvIGNvbXBpbGUgc2hhZGVyICVkKCVkKVxuJXMiLCBHZXRMb2NhbE5hbWUoKSwKKyAgICAgICAgICBzaGFkZXJfdmFyaWFudF8tPkdldE9yQ3JlYXRlR2xvYmFsTmFtZSgpLAorICAgICAgICAgIHNoYWRlcl92YXJpYW50Xy0+R2V0SW5mb0xvZygpLmNfc3RyKCkpOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3NoYWRlcl9kYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFkZXJfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMGZmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFkZXJfZGF0YS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1NIQURFUl9EQVRBX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfU0hBREVSX0RBVEFfSF8KKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJnbGVzL29iamVjdF9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9zaGFkZXJfdmFyaWFudC5oIgorCitjbGFzcyBTaGFkZXJEYXRhIDogcHVibGljIE9iamVjdERhdGEgeworIHB1YmxpYzoKKyAgU2hhZGVyRGF0YShPYmplY3RUeXBlIHR5cGUsIE9iamVjdExvY2FsTmFtZSBuYW1lKTsKKworICBTaGFkZXJWYXJpYW50UHRyIEdldFNoYWRlclZhcmlhbnQoKSBjb25zdCB7IHJldHVybiBzaGFkZXJfdmFyaWFudF87IH0KKworICB2b2lkIFNldFNvdXJjZShHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqIGNvbnN0KiBzdHJzLCBjb25zdCBHTGludCogbGVuKTsKKworICB2b2lkIEdldFNoYWRlcml2KEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgY29uc3Q7CisgIHZvaWQgR2V0SW5mb0xvZyhHTHNpemVpIG1heF9sZW5ndGgsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvX2xvZykgY29uc3Q7CisgIHZvaWQgR2V0U291cmNlKEdMc2l6ZWkgYnVmX3NpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY3MpIGNvbnN0OworICB2b2lkIFNldEJpbmFyeShHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCB2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKTsKKworICB2b2lkIENvbXBpbGUoKTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+U2hhZGVyRGF0YSgpOworCisgcHJpdmF0ZToKKyAgU2hhZGVyVmFyaWFudFB0ciBzaGFkZXJfdmFyaWFudF87CisKKyAgU2hhZGVyRGF0YShjb25zdCBTaGFkZXJEYXRhJik7CisgIFNoYWRlckRhdGEmIG9wZXJhdG9yPShjb25zdCBTaGFkZXJEYXRhJik7Cit9OworCit0eXBlZGVmIGFuZHJvaWQ6OnNwPFNoYWRlckRhdGE+IFNoYWRlckRhdGFQdHI7CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19TSEFERVJfREFUQV9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc2hhZGVyX3ZhcmlhbnQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc2hhZGVyX3ZhcmlhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWFlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFkZXJfdmFyaWFudC5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2xlcy9zaGFkZXJfdmFyaWFudC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJnbGVzL2dsZXNfY29udGV4dC5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc192YWxpZGF0ZS5oIgorI2luY2x1ZGUgImdsZXMvbWFjcm9zLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOworCitzdGF0aWMgR2xlc0NvbnRleHQqIEdldFJlcXVpcmVkQ29udGV4dCgpIHsKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFjdHgpOworICByZXR1cm4gY3R4OworfQorCitTaGFkZXJWYXJpYW50OjpTaGFkZXJWYXJpYW50KE9iamVjdFR5cGUgb2JqZWN0X3R5cGUpCisgICAgOiBvYmplY3RfdHlwZV8ob2JqZWN0X3R5cGUpLCBnbG9iYWxfbmFtZV8oMCksCisgICAgICBjb21waWxlX3N0YXR1c18oQ09NUElMRV9OT1RfQVRURU1QVEVEKSwKKyAgICAgIGdsb2JhbF90ZXh0dXJlX3RhcmdldF8oR0xfVEVYVFVSRV8yRCksCisgICAgICBoYXNfcmVwbGFjZWRfZXh0ZXJuYWxfdGV4dHVyZV93aXRoXzJkXyhmYWxzZSkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG9iamVjdF90eXBlICE9IFZFUlRFWF9TSEFERVIgJiYKKyAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfdHlwZSAhPSBGUkFHTUVOVF9TSEFERVIpOworfQorCitTaGFkZXJWYXJpYW50Ojp+U2hhZGVyVmFyaWFudCgpIHsKKyAgaWYgKGdsb2JhbF9uYW1lXykgeworICAgIEdsZXNDb250ZXh0KiBjdHggPSBHZXRSZXF1aXJlZENvbnRleHQoKTsKKyAgICBQQVNTX1RIUk9VR0goY3R4LCBEZWxldGVTaGFkZXIsIGdsb2JhbF9uYW1lXyk7CisgIH0KK30KKwordm9pZCBTaGFkZXJWYXJpYW50OjpFbnN1cmVMaXZlU2hhZGVyT2JqZWN0KEdsZXNDb250ZXh0KiBjdHgpIHsKKyAgaWYgKCFnbG9iYWxfbmFtZV8pIHsKKyAgICBpZiAob2JqZWN0X3R5cGVfID09IFZFUlRFWF9TSEFERVIpIHsKKyAgICAgIGdsb2JhbF9uYW1lXyA9IFBBU1NfVEhST1VHSChjdHgsIENyZWF0ZVNoYWRlciwgR0xfVkVSVEVYX1NIQURFUik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdsb2JhbF9uYW1lXyA9IFBBU1NfVEhST1VHSChjdHgsIENyZWF0ZVNoYWRlciwgR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZ2xvYmFsX25hbWVfKTsKKyAgfQorfQorCitHTHVpbnQgU2hhZGVyVmFyaWFudDo6R2V0T3JDcmVhdGVHbG9iYWxOYW1lKCkgeworICBFbnN1cmVMaXZlU2hhZGVyT2JqZWN0KEdldFJlcXVpcmVkQ29udGV4dCgpKTsKKyAgcmV0dXJuIGdsb2JhbF9uYW1lXzsKK30KKwordm9pZCBTaGFkZXJWYXJpYW50OjpTZXRHbG9iYWxUZXh0dXJlVGFyZ2V0KEdMZW51bSB0YXJnZXQpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoSXNDb21waWxlUmVxdWVzdGVkKCkpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFJc1ZhbGlkVGV4dHVyZVRhcmdldExpbWl0ZWQodGFyZ2V0KSk7CisgIGdsb2JhbF90ZXh0dXJlX3RhcmdldF8gPSB0YXJnZXQ7Cit9CisKK3ZvaWQgU2hhZGVyVmFyaWFudDo6U2V0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgQXV0b0xvY2sgbG9jayhsb2NrXyk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoSXNDb21waWxlUmVxdWVzdGVkKCkpOworICBvcmlnaW5hbF9zb3VyY2VfID0gc3RyOworICBSZXdyaXRlU291cmNlKCk7Cit9CisKK3N0ZDo6c3RyaW5nIFNoYWRlclZhcmlhbnQ6OkdldEluZm9Mb2coKSBjb25zdCB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICBpZiAoIWdsb2JhbF9uYW1lXyB8fCAhaW5mb19sb2dfY2FjaGVfLklzRGlydHkoKSkgeworICAgIHJldHVybiBpbmZvX2xvZ19jYWNoZV8uR2V0KCk7CisgIH0KKworICBHTGludCBpbmZvX2xvZ19sZW5ndGggPSAwOworICBHbGVzQ29udGV4dCogY3R4ID0gR2V0UmVxdWlyZWRDb250ZXh0KCk7CisgIFBBU1NfVEhST1VHSChjdHgsIEdldFNoYWRlcml2LCBnbG9iYWxfbmFtZV8sCisgICAgICAgICAgICAgICBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvX2xvZ19sZW5ndGgpOworCisgIGlmIChpbmZvX2xvZ19sZW5ndGggPiAwKSB7CisgICAgY2hhciogYnVmID0gbmV3IGNoYXJbaW5mb19sb2dfbGVuZ3RoXTsKKyAgICBQQVNTX1RIUk9VR0goY3R4LCBHZXRTaGFkZXJJbmZvTG9nLCBnbG9iYWxfbmFtZV8sCisgICAgICAgICAgICAgICAgIGluZm9fbG9nX2xlbmd0aCwgTlVMTCwgYnVmKTsKKyAgICBpbmZvX2xvZ19jYWNoZV8uTXV0YXRlKCkgPSBidWY7CisgICAgZGVsZXRlW10gYnVmOworICB9IGVsc2UgeworICAgIGluZm9fbG9nX2NhY2hlXy5NdXRhdGUoKSA9ICIiOworICB9CisKKyAgaW5mb19sb2dfY2FjaGVfLkNsZWFuKCk7CisgIHJldHVybiBpbmZvX2xvZ19jYWNoZV8uR2V0KCk7Cit9CisKK2Jvb2wgU2hhZGVyVmFyaWFudDo6VmVyaWZ5U3VjY2Vzc2Z1bENvbXBpbGUoKSBjb25zdCB7CisgIEF1dG9Mb2NrIGxvY2sobG9ja18pOworICBpZiAoY29tcGlsZV9zdGF0dXNfID09IENPTVBJTEVfQVRURU1QVEVEKSB7CisgICAgR0xpbnQgY29tcGlsZVN0YXR1cyA9IDA7CisgICAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICAgIFBBU1NfVEhST1VHSChjdHgsIEdldFNoYWRlcml2LCBnbG9iYWxfbmFtZV8sCisgICAgICAgICAgICAgICAgIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZVN0YXR1cyk7CisgICAgY29tcGlsZV9zdGF0dXNfID0gKGNvbXBpbGVTdGF0dXMgIT0gR0xfRkFMU0UgPworICAgICAgICBDT01QSUxFX1NVQ0NFU1NGVUwgOiBDT01QSUxFX0ZBSUxFRCk7CisgIH0KKyAgcmV0dXJuIChjb21waWxlX3N0YXR1c18gPT0gQ09NUElMRV9TVUNDRVNTRlVMKTsKK30KKwordm9pZCBTaGFkZXJWYXJpYW50OjpDb21waWxlKCkgeworICBBdXRvTG9jayBsb2NrKGxvY2tfKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihJc0NvbXBpbGVSZXF1ZXN0ZWQoKSk7CisKKyAgR2xlc0NvbnRleHQqIGN0eCA9IEdldFJlcXVpcmVkQ29udGV4dCgpOworICBFbnN1cmVMaXZlU2hhZGVyT2JqZWN0KGN0eCk7CisKKyAgY29uc3QgY2hhciogc291cmNlX3B0ciA9IHVwZGF0ZWRfc291cmNlXy5jX3N0cigpOworICBQQVNTX1RIUk9VR0goY3R4LCBTaGFkZXJTb3VyY2UsIGdsb2JhbF9uYW1lXywgMSwgJnNvdXJjZV9wdHIsIE5VTEwpOworCisgIFBBU1NfVEhST1VHSChjdHgsIENvbXBpbGVTaGFkZXIsIGdsb2JhbF9uYW1lXyk7CisgIGNvbXBpbGVfc3RhdHVzXyA9IENPTVBJTEVfQVRURU1QVEVEOworICBpbmZvX2xvZ19jYWNoZV8uTXV0YXRlKCkgPSAiIjsKK30KKwordm9pZCBTaGFkZXJWYXJpYW50OjpSZXdyaXRlU291cmNlKCkgeworICAvLyBXZSB3aWxsIGJlIGluamVjdGluZyBzb21lIGV4dHJhIGNvZGUgaW50byB0aGUgc291cmNlIHNvIHdlIG5lZWQgdG8KKyAgLy8gcmVzZXJ2ZSBqdXN0IGEgbGl0dGxlIGV4dHJhIHNwYWNlIGZvciBpdC4KKyAgY29uc3Qgc2l6ZV90IGV4dHJhX3NvdXJjZV9zaXplID0gMjU2OworICB1cGRhdGVkX3NvdXJjZV8ucmVzZXJ2ZShvcmlnaW5hbF9zb3VyY2VfLnNpemUoKSArIGV4dHJhX3NvdXJjZV9zaXplKTsKKyAgdXBkYXRlZF9zb3VyY2VfLmNsZWFyKCk7CisKKyAgc3RkOjpzdHJpbmcgbW9kaWZpZWRfc291cmNlID0gb3JpZ2luYWxfc291cmNlXzsKKworICAvLyBOb3RlOiBFeHRyYWN0VmVyc2lvbiBhY3R1YWxseSBtb2RpZmllcyB0aGUgb3JpZ2luYWwgc291cmNlLCByZW1vdmluZyB0aGUKKyAgLy8gI3ZlcnNpb24gbGluZS4gIE9uZSB3YXkgdG8gcHJldmVudCB0aGlzIHdvdWxkIGJlIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeQorICAvLyBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGJ1dCBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZSBkaXJlY3RseQorICAvLyBpcyBmYXN0ZXIgYW5kIHNob3VsZCBub3QgcmVhbGx5IGNhdXNlIGFueSBpc3N1ZXMuCisgIGNvbnN0IGludCB2ZXJzaW9uID0gRXh0cmFjdFZlcnNpb24oJm1vZGlmaWVkX3NvdXJjZSk7CisgIGlmICh2ZXJzaW9uID4gMCkgeworICAgIGNoYXIgdmVyc2lvbl9kZWNsWzI2XTsKKyAgICBzbnByaW50Zih2ZXJzaW9uX2RlY2wsIHNpemVvZih2ZXJzaW9uX2RlY2wpLCAiI3ZlcnNpb24gJWRcbiIsIHZlcnNpb24pOworICAgIHVwZGF0ZWRfc291cmNlXyArPSB2ZXJzaW9uX2RlY2w7CisgIH0KKworICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MzcpOiBQYXJzZSB0aGUgZXh0ZW5zaW9uIGNvcnJlY3RseSBieSBoYW5kbGluZyB0aGluZ3MKKyAgLy8gbGlrZSB3aGl0ZXNwYWNlIGFzIHdlbGwgYXMgZW5hYmxlL3dhcm4vZGlzYWJsZSBvcHRpb25zLgorICBpZiAoZ2xvYmFsX3RleHR1cmVfdGFyZ2V0XyA9PSBHTF9URVhUVVJFXzJEKSB7CisgICAgU3Vic3RpdHV0ZSgmbW9kaWZpZWRfc291cmNlLAorICAgICAgICAgICAgICAgIiNleHRlbnNpb24gR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCA6IHJlcXVpcmUiLAorICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MzcpOiBQYXJzZSB0aGUgZGVjbGFyYXRpb25zIGNvcnJlY3RseSBzbyB0aGVzZQorICAgIC8vIHN1YnN0aXR1dGlvbnMgYXJlIG9ubHkgYXBwbGllZCB0byB0aGUgaW50ZW5kZWQgdW5pZm9ybSBkZWNsYXJhdGlvbnMuCisgICAgaGFzX3JlcGxhY2VkX2V4dGVybmFsX3RleHR1cmVfd2l0aF8yZF8gPQorICAgICAgICBTdWJzdGl0dXRlKCZtb2RpZmllZF9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIiBzYW1wbGVyRXh0ZXJuYWxPRVMgIiwKKyAgICAgICAgICAgICAgICAgICAiIHNhbXBsZXIyRCAgICAgICAgICAiKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgdW5kZXJseWluZyB0ZXh0dXJlIGlzIGV4dGVybmFsIC0gZG8gbm90IGNoYW5nZSB0aGUgcHJvZ3JhbS4KKyAgICBoYXNfcmVwbGFjZWRfZXh0ZXJuYWxfdGV4dHVyZV93aXRoXzJkXyA9IGZhbHNlOworICB9CisKKyAgLy8gVE9ETyhjcmJ1Zy5jb20vNDIyMDE0KTogUmVtb3ZlIHRoZXNlIHN1YnRpdHV0aW9ucyB3aGVuIHdlIGVpdGhlciBjYW4gdHVybgorICAvLyBvZmYgdGhlIGNvbXBpbGVyIGVycm9yIGluIENocm9tZSwgb3IgaWYgd2UgZGVjaWRlZCB0byByZXF1aXJlIGRldmVsb3BlcnMKKyAgLy8gcnVubmluZyB1bmRlciBBUkMgdG8gY29uZm9ybSB0byB0aGUgR0xFUyBzdGFuZGFyZC4KKyAgLy8KKyAgLy8gV2Ugc3RyaXAgb3V0IHRoZXNlIHNwZWNpZmljIGRlZmF1bHQgcHJlY2lzaW9uIHN0YXRlbWVudHMgYXMgYSB3b3JrYXJvdW5kCisgIC8vIGZvciBhIGhhbmRmdWwgb2YgYXBwcy4gUGVwcGVyR0wgZm9sbG93cyB0aGUgR0xFUyBzdGFuZGFyZCwgYW5kIHJlcXVpcmVzCisgIC8vIHRoYXQgdGhlIHF1YWxpZmllcnMgdXNlZCBvbiB1bmlmb3JtcyBzaGFyZWQgYmV0d2VlbiB0aGUgdmVydGV4IGFuZAorICAvLyBmcmFnbWVudCBzaGFkZXJzIG1hdGNoLiBBbmRyb2lkIGRvZXMgbm90IHBlcmZvcm0gdGhhdCBjaGVjaywgYW5kIHRoZXJlCisgIC8vIGFyZSBzb21lIGFwcHMgdGhhdCB0aGVyZWZvcmUgZmFpbCB0byBydW4uCisgIC8vCisgIC8vIE5vdGUgdGhhdCB0aGVyZSBpcyBzdGlsbCBwb3NzaWJsZSB0byBoYXZlIGEgbWlzbWF0Y2ggaWYgdGhlIHNoYWRlciB1c2VzCisgIC8vIHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBwcmVjaXNpb24gc3RhdGVtZW50LAorICAvLyBvciBpZiB0aGUgc2hhZGVyIHVzZXMgcHJlY2lzaW9uIHF1YWxpZmllcnMgd2hlbiBkZWNsYXJpbmcgdGhlIHVuaWZvcm1zCisgIC8vIChub3QgdXNpbmcgdGhlIGRlZmF1bHRzKS4gV2Ugc2hvdWxkIGhhdmUgYSBiZXR0ZXIgYW5zd2VyIGJlZm9yZSBpdCBiZWNvbWVzCisgIC8vIG5lY2Vzc2FyeSB0byBkbyBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoaXMuCisgIFN1YnN0aXR1dGUoJm1vZGlmaWVkX3NvdXJjZSwKKyAgICAgICAgICAgICAicHJlY2lzaW9uIGhpZ2hwIGZsb2F0OyIsCisgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgU3Vic3RpdHV0ZSgmbW9kaWZpZWRfc291cmNlLAorICAgICAgICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsiLAorICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgU3Vic3RpdHV0ZSgmbW9kaWZpZWRfc291cmNlLAorICAgICAgICAgICAgICJwcmVjaXNpb24gbG93cCBmbG9hdDsiLAorICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgLy8gVGhlIGNvbnNlcXVlbmNlIG9mIHN0cmlwcGluZyBvdXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIHN0YXRlbWVudHMgaXMgdGhhdAorICAvLyB3ZSBuZWVkIHRvIGFkZCBvbmUgYmFjayBpbi4gRnJhZ21lbnQgc2hhZGVycyBpbiBwYXJ0aWN1bGFyIGhhdmUgbm8gZGVmYXVsdAorICAvLyBwcmVjaXNpb24gZGVmaW5lZCBmb3IgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCB3aGljaCBpcyBhbHNvIGFuIGVycm9yLgorICB1cGRhdGVkX3NvdXJjZV8gKz0gInByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiI7CisgIHVwZGF0ZWRfc291cmNlXyArPSAiI2xpbmUgMVxuIjsKKyAgdXBkYXRlZF9zb3VyY2VfICs9IG1vZGlmaWVkX3NvdXJjZTsKK30KKworLy8gc3RhdGljCitib29sIFNoYWRlclZhcmlhbnQ6OlN1YnN0aXR1dGUoc3RkOjpzdHJpbmcqIHNyYywgY29uc3QgY2hhciogbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcmVwbCkgeworICBjb25zdCBzaXplX3QgbWF0Y2hfbGVuID0gc3RybGVuKG1hdGNoKTsKKyAgY29uc3Qgc2l6ZV90IHJlcGxfbGVuID0gc3RybGVuKHJlcGwpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1hdGNoX2xlbiAhPSByZXBsX2xlbik7CisKKyAgYm9vbCBhbnlfbWF0Y2hlcyA9IGZhbHNlOworICBzaXplX3QgaWR4ID0gc3JjLT5maW5kKG1hdGNoKTsKKyAgd2hpbGUgKGlkeCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIGFueV9tYXRjaGVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoX2xlbjsgKytpKSB7CisgICAgICAoKnNyYylbaWR4ICsgaV0gPSByZXBsW2ldOworICAgIH0KKyAgICBpZHggPSBzcmMtPmZpbmQobWF0Y2gpOworICB9CisgIHJldHVybiBhbnlfbWF0Y2hlczsKK30KKworLy8gc3RhdGljCitpbnQgU2hhZGVyVmFyaWFudDo6RXh0cmFjdFZlcnNpb24oc3RkOjpzdHJpbmcqIHNyYykgeworICAvLyBGaW5kIGFuZCByZW1vdmUgdGhlICN2ZXJzaW9uIHRva2VuIGlmIGl0IGV4aXN0cy4KKyAgY29uc3QgaW50IG1pbl92ZXJzaW9uID0gMTAwOworICBlbnVtIFN0YXRlIHsKKyAgICBQQVJTRV9OT05FLAorICAgIFBBUlNFX0lOX0NfQ09NTUVOVCwKKyAgICBQQVJTRV9JTl9MSU5FX0NPTU1FTlQKKyAgfTsKKworICBpbnQgdmVyc2lvbiA9IG1pbl92ZXJzaW9uOworICBTdGF0ZSBzdGF0ZSA9IFBBUlNFX05PTkU7CisKKyAgc2l6ZV90IGlkeCA9IDA7CisgIHdoaWxlIChpZHggPCBzcmMtPnNpemUoKSkgeworICAgIGNoYXIgY3VyciA9IHNyYy0+YXQoaWR4KTsKKyAgICBjaGFyIG5leHQgPSBzcmMtPmF0KGlkeCArIDEpOworCisgICAgaWYgKHN0YXRlID09IFBBUlNFX0lOX0NfQ09NTUVOVCkgeworICAgICAgaWYgKGN1cnIgPT0gJyonICYmIG5leHQgPT0gJy8nKSB7CisgICAgICAgIHN0YXRlID0gUEFSU0VfTk9ORTsKKyAgICAgICAgaWR4ICs9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICArK2lkeDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0YXRlID09IFBBUlNFX0lOX0xJTkVfQ09NTUVOVCkgeworICAgICAgaWYgKGN1cnIgPT0gJ1xuJykgeworICAgICAgICBzdGF0ZSA9IFBBUlNFX05PTkU7CisgICAgICB9CisgICAgICArK2lkeDsKKyAgICB9IGVsc2UgaWYgKGN1cnIgPT0gJy8nICYmIG5leHQgPT0gJy8nKSB7CisgICAgICBzdGF0ZSA9IFBBUlNFX0lOX0xJTkVfQ09NTUVOVDsKKyAgICAgIGlkeCArPSAyOworICAgIH0gZWxzZSBpZiAoY3VyciA9PSAnLycgJiYgbmV4dCA9PSAnKicpIHsKKyAgICAgIHN0YXRlID0gUEFSU0VfSU5fQ19DT01NRU5UOworICAgICAgaWR4ICs9IDI7CisgICAgfSBlbHNlIGlmIChjdXJyID09ICcgJyB8fCBjdXJyID09ICdcdCcgfHwgY3VyciA9PSAnXHInIHx8IGN1cnIgPT0gJ1xuJykgeworICAgICAgKytpZHg7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgZmlyc3Qgbm9uLWJsYW5rIGNoYXJhY3RlciBvdXRzaWRlIGEgY29tbWVudC4gIElmCisgICAgICAvLyB0aGVyZSBpcyBhICN2ZXJzaW9uIHRva2VuIGluIHRoZSBzb3VyY2UsIHRoZW4gaXQgbXVzdCBiZSBoZXJlLgorICAgICAgY2hhciogYyA9ICZzcmMtPmF0KGlkeCk7CisgICAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MzcpOiBNYWtlIHRoaXMgbW9yZSByb2J1c3QuICBJdCBzaG91bGQgYmUgYWJsZSB0bworICAgICAgLy8gY29ycmVjdGx5IGhhbmRsZSBzb21ldGhpbmcgbGlrZSAiI3ZlcnNpb24xMjMiLgorICAgICAgaWYgKCFzdHJuY21wKGMsICIjdmVyc2lvbiIsIDgpKSB7CisgICAgICAgIGludCB2ZXI7CisgICAgICAgIGlmIChzc2NhbmYoYyArIDgsICIlZCIsICZ2ZXIpID09IDEpIHsgIC8vIE5PTElOVChydW50aW1lL3ByaW50ZikKKyAgICAgICAgICAvLyBCbGFuayBvdXQgdGhlIHZlcnNpb24gdG9rZW4gZnJvbSB0aGUgc291cmNlLgorICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrLCBjKyspCisgICAgICAgICAgICAqYyA9ICcgJzsKKyAgICAgICAgICB3aGlsZSAoKmMgPCAnMCcgfHwgKmMgPiAnOScpIHsKKyAgICAgICAgICAgICpjID0gJyAnOworICAgICAgICAgICAgKytjOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykgeworICAgICAgICAgICAgKmMgPSAnICc7CisgICAgICAgICAgICArK2M7CisgICAgICAgICAgfQorICAgICAgICAgIHZlcnNpb24gPSBzdGQ6Om1heCh2ZXJzaW9uLCB2ZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZlcnNpb247Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFkZXJfdmFyaWFudC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc2hhZGVyX3ZhcmlhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDU5NDE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc2hhZGVyX3ZhcmlhbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfU0hBREVSX1ZBUklBTlRfSF8KKyNkZWZpbmUgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19TSEFERVJfVkFSSUFOVF9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgImdsZXMvZGlydGlhYmxlLmgiCisjaW5jbHVkZSAiZ2xlcy9vYmplY3RfZGF0YS5oIgorCitjbGFzcyBHbGVzQ29udGV4dDsKKworLy8gUmVwcmVzZW50cyBhIHNoYWRlciBhZGp1c3RlZCBmb3IgYSBwYXJ0aWN1bGFyIHVzZS4gTm9ybWFsbHksIHRoZXJlIGlzIG9ubHkKKy8vIG9uZSB2YXJpYW50IHBlciBjb21waWxlZCB1c2VyLXZpc2libGUgc2hhZGVyLiBBIG5ldyB2YXJpYW50IG1heSBhcHBlYXIKKy8vIHdoZW4gdXNlciBtb2RpZmllcyBzb3VyY2Ugb2YgYSBwcmV2aW91c2x5IGNvbXBpbGVkIHNoYWRlciwgb3IgaW1wbGljaXRseQorLy8gd2hlbiB0aGUgYmFja2luZyB0ZXh0dXJlIHRhcmdldCByZXF1aXJlcyBhIGRpZmZlcmVudCBzaGFkZXIgcHJvZ3JhbS4KKy8vIEZ1bmN0aW9ucyAoaW5jbHVkaW5nIGRlc3RydWN0b3IpIG1heSBwYXNzIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIEdMCisvLyBpbXBsZW1lbnRhdGlvbiwgYW5kIHNvIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gYWN0aXZlIGNvbnRleHQuCisvLyBBIGNvbXBpbGVkIFNoYWRlclZhcmlhbnQgaW5zdGFuY2UgY2Fubm90IGJlIHJlLWNvbXBpbGVkLgorY2xhc3MgU2hhZGVyVmFyaWFudCA6IHB1YmxpYyBhbmRyb2lkOjpSZWZCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNoYWRlclZhcmlhbnQoT2JqZWN0VHlwZSBvYmplY3RfdHlwZSk7CisKKyAgT2JqZWN0VHlwZSBHZXRPYmplY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gb2JqZWN0X3R5cGVfOyB9CisgIGJvb2wgSXNDb21waWxlUmVxdWVzdGVkKCkgY29uc3QgeworICAgIHJldHVybiBjb21waWxlX3N0YXR1c18gIT0gQ09NUElMRV9OT1RfQVRURU1QVEVEOworICB9CisKKyAgYm9vbCBWZXJpZnlTdWNjZXNzZnVsQ29tcGlsZSgpIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIEdldEluZm9Mb2coKSBjb25zdDsKKworICBHTHVpbnQgR2V0T3JDcmVhdGVHbG9iYWxOYW1lKCk7CisKKyAgdm9pZCBTZXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRPcmlnaW5hbFNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG9yaWdpbmFsX3NvdXJjZV87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFVwZGF0ZWRTb3VyY2UoKSBjb25zdCB7IHJldHVybiB1cGRhdGVkX3NvdXJjZV87IH0KKworICAvLyBNb2RpZmllcyB0aGUgZXhwZWN0ZWQgYmFja2luZyB0ZXh0dXJlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgU2V0U291cmNlKCkuCisgIHZvaWQgU2V0R2xvYmFsVGV4dHVyZVRhcmdldChHTGVudW0gdGFyZ2V0KTsKKyAgR0xlbnVtIEdldEdsb2JhbFRleHR1cmVUYXJnZXQoKSBjb25zdCB7IHJldHVybiBnbG9iYWxfdGV4dHVyZV90YXJnZXRfOyB9CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGxvY2FsIHRleHR1cmUgdGFyZ2V0IHVzZWQgYnkgdGhlIG9yaWdpbmFsIHNvdXJjZSB3YXMKKyAgLy8gZXh0ZXJuYWwsIGFuZCB0aGUgcHJvZ3JhbSB3YXMgbW9kaWZpZWQgdG8gdXNlIFRFWFRVUkVfMkQuCisgIGJvb2wgSGFzUmVwbGFjZWRFeHRlcm5hbFRleHR1cmVXaXRoMkQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19yZXBsYWNlZF9leHRlcm5hbF90ZXh0dXJlX3dpdGhfMmRfOworICB9CisKKyAgdm9pZCBDb21waWxlKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgflNoYWRlclZhcmlhbnQoKTsKKworIHByaXZhdGU6CisgIGVudW0gQ29tcGlsZVN0YXR1cyB7CisgICAgQ09NUElMRV9OT1RfQVRURU1QVEVELAorICAgIENPTVBJTEVfQVRURU1QVEVELAorICAgIENPTVBJTEVfU1VDQ0VTU0ZVTCwKKyAgICBDT01QSUxFX0ZBSUxFRCwKKyAgfTsKKworICBPYmplY3RUeXBlIG9iamVjdF90eXBlXzsKKyAgR0x1aW50IGdsb2JhbF9uYW1lXzsKKyAgbXV0YWJsZSBDb21waWxlU3RhdHVzIGNvbXBpbGVfc3RhdHVzXzsKKyAgbXV0YWJsZSBEaXJ0aWFibGU8c3RkOjpzdHJpbmc+IGluZm9fbG9nX2NhY2hlXzsKKyAgc3RkOjpzdHJpbmcgb3JpZ2luYWxfc291cmNlXzsKKyAgc3RkOjpzdHJpbmcgdXBkYXRlZF9zb3VyY2VfOworICBHTGVudW0gZ2xvYmFsX3RleHR1cmVfdGFyZ2V0XzsKKyAgYm9vbCBoYXNfcmVwbGFjZWRfZXh0ZXJuYWxfdGV4dHVyZV93aXRoXzJkXzsKKyAgbXV0YWJsZSBhbmRyb2lkOjpiYXNlOjpMb2NrIGxvY2tfOworCisgIHZvaWQgRW5zdXJlTGl2ZVNoYWRlck9iamVjdChHbGVzQ29udGV4dCogY3R4KTsKKyAgdm9pZCBSZXdyaXRlU291cmNlKCk7CisKKyAgc3RhdGljIGludCBFeHRyYWN0VmVyc2lvbihzdGQ6OnN0cmluZyogc3JjKTsKKyAgc3RhdGljIGJvb2wgU3Vic3RpdHV0ZShzdGQ6OnN0cmluZyogc3JjLCBjb25zdCBjaGFyKiBtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXBsKTsKKworICBTaGFkZXJWYXJpYW50KGNvbnN0IFNoYWRlclZhcmlhbnQmKTsKKyAgU2hhZGVyVmFyaWFudCYgb3BlcmF0b3I9KGNvbnN0IFNoYWRlclZhcmlhbnQmKTsKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6c3A8U2hhZGVyVmFyaWFudD4gU2hhZGVyVmFyaWFudFB0cjsKKworI2VuZGlmICAvLyBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1NIQURFUl9WQVJJQU5UX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFyZV9ncm91cC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFyZV9ncm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3NoYXJlX2dyb3VwLmNwcApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiZ2xlcy9zaGFyZV9ncm91cC5oIgorI2luY2x1ZGUgImdsZXMvbWFjcm9zLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOworCituYW1lc3BhY2UgeworCitPYmplY3RHbG9iYWxOYW1lIEdlbmVyYXRlR2xvYmFsTmFtZShHbGVzQ29udGV4dCogYywgT2JqZWN0VHlwZSB0eXBlKSB7CisgIE9iamVjdEdsb2JhbE5hbWUgbmFtZSA9IDA7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQlVGRkVSOgorICAgICAgUEFTU19USFJPVUdIKGMsIEdlbkJ1ZmZlcnMsIDEsICZuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVEVYVFVSRToKKyAgICAgIFBBU1NfVEhST1VHSChjLCBHZW5UZXh0dXJlcywgMSwgJm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBSRU5ERVJCVUZGRVI6CisgICAgICBQQVNTX1RIUk9VR0goYywgR2VuUmVuZGVyYnVmZmVycywgMSwgJm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgIFBBU1NfVEhST1VHSChjLCBHZW5GcmFtZWJ1ZmZlcnMsIDEsICZuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBuYW1lID0gMDsKKyAgICAgIGJyZWFrOworICB9CisjaWZkZWYgRU5BQkxFX0FQSV9MT0dHSU5HCisgIEFMT0dJKCJHZW5lcmF0ZWQgbmFtZSAlZCBvZiB0eXBlICVkIiwgbmFtZSwgdHlwZSk7CisjZW5kaWYKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgRGVsZXRlR2xvYmFsTmFtZShHbGVzQ29udGV4dCogYywgT2JqZWN0VHlwZSB0eXBlLCBPYmplY3RHbG9iYWxOYW1lIG5hbWUpIHsKKyAgaWYgKG5hbWUgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEJVRkZFUjoKKyAgICAgIFBBU1NfVEhST1VHSChjLCBEZWxldGVCdWZmZXJzLCAxLCAmbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRVUkU6CisgICAgICBQQVNTX1RIUk9VR0goYywgRGVsZXRlVGV4dHVyZXMsIDEsICZuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUkVOREVSQlVGRkVSOgorICAgICAgUEFTU19USFJPVUdIKGMsIERlbGV0ZVJlbmRlcmJ1ZmZlcnMsIDEsICZuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlJBTUVCVUZGRVI6CisgICAgICBQQVNTX1RIUk9VR0goYywgRGVsZXRlRnJhbWVidWZmZXJzLCAxLCAmbmFtZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgIGJyZWFrOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gImxvY2FsIiBuYW1lcyAoaWUuIG5hbWVzIGZvcgorLy8gb2JqZWN0cyB1c2VkIGJ5IGNsaWVudCBjb2RlKSBhbmQgImdsb2JhbCIgbmFtZXMgKGllLiBuYW1lcyBmb3Igb2JqZWN0cworLy8gbWFuYWdlZCBieSB0aGUgdW5kZXJseWluZyBjb250ZXh0LikKK2NsYXNzIE5hbWVzcGFjZUltcGwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTmFtZXNwYWNlSW1wbChPYmplY3RUeXBlIHR5cGUpOworICB+TmFtZXNwYWNlSW1wbCgpOworCisgIC8vIEdlbmVyYXRlcyBhIHVuaXF1ZSBsb2NhbCBuYW1lIHRoYXQgaXMgY3VycmVudGx5IG5vdCBpbiB1c2UuCisgIE9iamVjdExvY2FsTmFtZSBHZW5Mb2NhbE5hbWUoKTsKKworICAvLyBSZXR1cm5zIHRoZSBnbG9iYWwgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhbCBuYW1lLCBvciAwIGlmCisgIC8vIHRoZSBuYW1lIGlzIHVua25vd24uCisgIE9iamVjdEdsb2JhbE5hbWUgR2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSk7CisKKyAgLy8gQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIGxvY2FsIG5hbWUgd2l0aCB0aGUgZ2xvYmFsIG5hbWUuCisgIHZvaWQgU2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSwgT2JqZWN0R2xvYmFsTmFtZSBnbG9iYWxfbmFtZSk7CisKKyAgLy8gUmVtb3ZlcyB0aGUgbmFtZSBmcm9tIHRoZSBuYW1lc3BhY2UgYXMgd2VsbCBhcyBkZWxldGluZyB0aGUgZ2xvYmFsIG5hbWUKKyAgLy8gZnJvbSB0aGUgdW5kZXJseWluZyBjb250ZXh0LgorICB2b2lkIERlbGV0ZU5hbWUoR2xlc0NvbnRleHQqIGMsIE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKTsKKworICAvLyBEZWxldGVzIGFsbCBuYW1lcyBmcm9tIHRoZSBuYW1lc3BhY2UuCisgIHZvaWQgRGVsZXRlQWxsTmFtZXMoR2xlc0NvbnRleHQqIGMpOworCisgIHR5cGVkZWYgc3RkOjptYXA8T2JqZWN0TG9jYWxOYW1lLCBPYmplY3RHbG9iYWxOYW1lPiBOYW1lTWFwOworCisgIGNvbnN0IE9iamVjdFR5cGUgdHlwZV87CisgIE9iamVjdExvY2FsTmFtZSBuZXh0X25hbWVfOworICBOYW1lTWFwIG5hbWVzXzsKK307CisKK05hbWVzcGFjZUltcGw6Ok5hbWVzcGFjZUltcGwoT2JqZWN0VHlwZSB0eXBlKQorICA6IHR5cGVfKHR5cGUpLAorICAgIG5leHRfbmFtZV8oMCkgeworfQorCitOYW1lc3BhY2VJbXBsOjp+TmFtZXNwYWNlSW1wbCgpIHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lc18uc2l6ZSgpID4gMCwgIkRlbGV0ZUFsbE5hbWVzIGJlZm9yZSBkZXN0cm95aW5nLiIpOworfQorCitPYmplY3RMb2NhbE5hbWUgTmFtZXNwYWNlSW1wbDo6R2VuTG9jYWxOYW1lKCkgeworICBPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSA9IDA7CisgIGRvIHsKKyAgICBsb2NhbF9uYW1lID0gKytuZXh0X25hbWVfOworICB9IHdoaWxlIChsb2NhbF9uYW1lID09IDAgfHwgbmFtZXNfLmZpbmQobG9jYWxfbmFtZSkgIT0gbmFtZXNfLmVuZCgpKTsKKyAgcmV0dXJuIGxvY2FsX25hbWU7Cit9CisKK09iamVjdEdsb2JhbE5hbWUgTmFtZXNwYWNlSW1wbDo6R2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSkgeworICBOYW1lTWFwOjppdGVyYXRvciBpdCA9IG5hbWVzXy5maW5kKGxvY2FsX25hbWUpOworICByZXR1cm4gaXQgIT0gbmFtZXNfLmVuZCgpID8gaXQtPnNlY29uZCA6IDA7Cit9CisKK3ZvaWQgTmFtZXNwYWNlSW1wbDo6U2V0R2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RHbG9iYWxOYW1lIGdsb2JhbF9uYW1lKSB7CisgIG5hbWVzX1tsb2NhbF9uYW1lXSA9IGdsb2JhbF9uYW1lOworfQorCit2b2lkIE5hbWVzcGFjZUltcGw6OkRlbGV0ZU5hbWUoR2xlc0NvbnRleHQqIGMsIE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKSB7CisgIE5hbWVNYXA6Oml0ZXJhdG9yIGl0ID0gbmFtZXNfLmZpbmQobG9jYWxfbmFtZSk7CisgIGlmIChpdCAhPSBuYW1lc18uZW5kKCkpIHsKKyAgICBEZWxldGVHbG9iYWxOYW1lKGMsIHR5cGVfLCBpdC0+c2Vjb25kKTsKKyAgICBuYW1lc18uZXJhc2UoaXQpOworICB9Cit9CisKK3ZvaWQgTmFtZXNwYWNlSW1wbDo6RGVsZXRlQWxsTmFtZXMoR2xlc0NvbnRleHQqIGMpIHsKKyAgZm9yIChOYW1lTWFwOjppdGVyYXRvciBpdCA9IG5hbWVzXy5iZWdpbigpOyBpdCAhPSBuYW1lc18uZW5kKCk7ICsraXQpIHsKKyAgICBEZWxldGVHbG9iYWxOYW1lKGMsIHR5cGVfLCBpdC0+c2Vjb25kKTsKKyAgfQorICBuYW1lc18uY2xlYXIoKTsKK30KKworU2hhcmVHcm91cDo6U2hhcmVHcm91cChHbGVzQ29udGV4dCogY29udGV4dCkKKyAgOiBjb250ZXh0Xyhjb250ZXh0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX09CSkVDVF9UWVBFUzsgKytpKSB7CisgICAgbmFtZXNwYWNlX1tpXSA9IG5ldyBOYW1lc3BhY2VJbXBsKChPYmplY3RUeXBlKWkpOworICB9Cit9CisKK1NoYXJlR3JvdXA6On5TaGFyZUdyb3VwKCkgeworICAgIEF1dG9Mb2NrIG11dGV4KGxvY2tfKTsKKyAgb2JqZWN0c18uY2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0JKRUNUX1RZUEVTOyArK2kpIHsKKyAgICBuYW1lc3BhY2VfW2ldLT5EZWxldGVBbGxOYW1lcyhjb250ZXh0Xyk7CisgICAgZGVsZXRlIG5hbWVzcGFjZV9baV07CisgIH0KK30KKwordm9pZCBTaGFyZUdyb3VwOjpHZW5OYW1lcyhPYmplY3RUeXBlIHR5cGUsIGludCBuLCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgQXV0b0xvY2sgbXV0ZXgobG9ja18pOworICBOYW1lc3BhY2VJbXBsKiBucyA9IEdldE5hbWVzcGFjZSh0eXBlKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBuYW1lc1tpXSA9IG5zLT5HZW5Mb2NhbE5hbWUoKTsKKyAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5MzkpOiBHZW5lcmF0ZSBhbGwgZ2xvYmFsIG5hbWVzIGluIGEgYmF0Y2guCisgICAgY29uc3QgT2JqZWN0R2xvYmFsTmFtZSBnbG9iYWxfbmFtZSA9IEdlbmVyYXRlR2xvYmFsTmFtZShjb250ZXh0XywgdHlwZSk7CisgICAgbnMtPlNldEdsb2JhbE5hbWUobmFtZXNbaV0sIGdsb2JhbF9uYW1lKTsKKyAgfQorfQorCitPYmplY3RHbG9iYWxOYW1lIFNoYXJlR3JvdXA6OkdldEdsb2JhbE5hbWUoT2JqZWN0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKSB7CisgICAgQXV0b0xvY2sgbXV0ZXgobG9ja18pOworICByZXR1cm4gR2V0TmFtZXNwYWNlKHR5cGUpLT5HZXRHbG9iYWxOYW1lKGxvY2FsX25hbWUpOworfQorCit2b2lkIFNoYXJlR3JvdXA6OlNldEdsb2JhbE5hbWUoT2JqZWN0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEdsb2JhbE5hbWUgZ2xvYmFsX25hbWUpIHsKKyAgICBBdXRvTG9jayBtdXRleChsb2NrXyk7CisgIEdldE5hbWVzcGFjZSh0eXBlKS0+U2V0R2xvYmFsTmFtZShsb2NhbF9uYW1lLCBnbG9iYWxfbmFtZSk7Cit9CisKK09iamVjdERhdGFQdHIgU2hhcmVHcm91cDo6R2V0T2JqZWN0KE9iamVjdFR5cGUgdHlwZSwgT2JqZWN0TG9jYWxOYW1lIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNyZWF0ZV9pZl9uZWVkZWQpIHsKKyAgaWYgKG5hbWUgPT0gMCkgeworICAgIHJldHVybiBPYmplY3REYXRhUHRyKCk7CisgIH0KKworICBBdXRvTG9jayBtdXRleChsb2NrXyk7CisKKyAgY29uc3QgT2JqZWN0SUQgaWQgPSBHZXRPYmplY3RJRCh0eXBlLCBuYW1lKTsKKyAgT2JqZWN0RGF0YU1hcDo6aXRlcmF0b3IgaXRlciA9IG9iamVjdHNfLmZpbmQoaWQpOworICBpZiAoaXRlciAhPSBvYmplY3RzXy5lbmQoKSkgeworICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgIH0KKworICBpZiAoIWNyZWF0ZV9pZl9uZWVkZWQpIHsKKyAgICByZXR1cm4gT2JqZWN0RGF0YVB0cigpOworICB9CisKKyAgLy8gV2UgZG8gbm90IGhhdmUgYW4gb2JqZWN0IHdpdGggdGhpcyBuYW1lLiAgSW4gdGhpcyBjYXNlLCB3ZSBhcmUgZGVhbGluZworICAvLyB3aXRoIGNsaWVudC1tYW5hZ2VkIG9iamVjdCBuYW1lcy4gIFdlIHdpbGwgZ2VuZXJhdGUgYSBuZXcgZ2xvYmFsIG5hbWUgYW5kCisgIC8vIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBjbGllbnQtbWFuYWdlZCBsb2NhbCBuYW1lLiBOb3RlIHRoYXQgc29tZSBvYmplY3RzCisgIC8vIChlLmcuIHByb2dyYW1zIGFuZCBzaGFkZXJzKSBtYW5hZ2UgdGhlaXIgb3duIGdsb2JhbCBuYW1lcywgYW5kIHNvIHdpbGwKKyAgLy8gbm90IGJlIGFsbG9jYXRlZCBoZXJlLgorICBpZiAodHlwZSAhPSBGUkFHTUVOVF9TSEFERVIgJiYgdHlwZSAhPSBWRVJURVhfU0hBREVSICYmIHR5cGUgIT0gUFJPR1JBTSkgeworICAgIE5hbWVzcGFjZUltcGwqIG5zID0gR2V0TmFtZXNwYWNlKHR5cGUpOworICAgIE9iamVjdEdsb2JhbE5hbWUgZ2xvYmFsX25hbWUgPSBucy0+R2V0R2xvYmFsTmFtZShuYW1lKTsKKyAgICBpZiAoZ2xvYmFsX25hbWUgPT0gMCkgeworICAgICAgZ2xvYmFsX25hbWUgPSBHZW5lcmF0ZUdsb2JhbE5hbWUoY29udGV4dF8sIHR5cGUpOworICAgICAgbnMtPlNldEdsb2JhbE5hbWUobmFtZSwgZ2xvYmFsX25hbWUpOworICAgIH0KKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgb2JqZWN0IGRhdGEgZm9yIHRoZSBuZXdseSBnZW5lcmF0ZWQgbmFtZS4KKyAgT2JqZWN0RGF0YVB0ciBvYmo7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQlVGRkVSOgorICAgICAgb2JqID0gT2JqZWN0RGF0YVB0cihuZXcgQnVmZmVyRGF0YShuYW1lKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRVUkU6CisgICAgICBvYmogPSBPYmplY3REYXRhUHRyKG5ldyBUZXh0dXJlRGF0YShuYW1lKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFJFTkRFUkJVRkZFUjoKKyAgICAgIG9iaiA9IE9iamVjdERhdGFQdHIobmV3IFJlbmRlcmJ1ZmZlckRhdGEobmFtZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUkFNRUJVRkZFUjoKKyAgICAgIG9iaiA9IE9iamVjdERhdGFQdHIobmV3IEZyYW1lYnVmZmVyRGF0YShuYW1lKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFZFUlRFWF9TSEFERVI6CisgICAgICBvYmogPSBPYmplY3REYXRhUHRyKG5ldyBTaGFkZXJEYXRhKHR5cGUsIG5hbWUpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlJBR01FTlRfU0hBREVSOgorICAgICAgb2JqID0gT2JqZWN0RGF0YVB0cihuZXcgU2hhZGVyRGF0YSh0eXBlLCBuYW1lKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST0dSQU06CisgICAgICBvYmogPSBPYmplY3REYXRhUHRyKG5ldyBQcm9ncmFtRGF0YShuYW1lKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5zdXBwb3J0ZWQgb2JqZWN0IHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgIGJyZWFrOworICB9CisKKyAgb2JqZWN0c18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCBvYmopKTsKKyAgcmV0dXJuIG9iajsKK30KKwordm9pZCBTaGFyZUdyb3VwOjpEZWxldGVPYmplY3RzKE9iamVjdFR5cGUgdHlwZSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT2JqZWN0TG9jYWxOYW1lKiBuYW1lcykgeworICAgIEF1dG9Mb2NrIG11dGV4KGxvY2tfKTsKKyAgTmFtZXNwYWNlSW1wbCogbnMgPSBHZXROYW1lc3BhY2UodHlwZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgaWYgKG5hbWVzW2ldICE9IDApIHsKKyAgICAgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTkzOSk6IERlbGV0ZSB0aGUgdW5kZXJseWluZyBnbG9iYWwgbmFtZXMgaW4gYSBiYXRjaC4KKyAgICAgIG5zLT5EZWxldGVOYW1lKGNvbnRleHRfLCBuYW1lc1tpXSk7CisgICAgICBvYmplY3RzXy5lcmFzZShHZXRPYmplY3RJRCh0eXBlLCBuYW1lc1tpXSkpOworICAgIH0KKyAgfQorfQorCitOYW1lc3BhY2VJbXBsKiBTaGFyZUdyb3VwOjpHZXROYW1lc3BhY2UoT2JqZWN0VHlwZSB0eXBlKSB7CisgIHJldHVybiBuYW1lc3BhY2VfW1ZhbGlkYXRlVHlwZSh0eXBlKV07Cit9CisKK1NoYXJlR3JvdXA6Ok9iamVjdElEIFNoYXJlR3JvdXA6OkdldE9iamVjdElEKE9iamVjdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdExvY2FsTmFtZSBuYW1lKSBjb25zdCB7CisgIHJldHVybiBPYmplY3RJRChWYWxpZGF0ZVR5cGUodHlwZSksIG5hbWUpOworfQorCitPYmplY3RUeXBlIFNoYXJlR3JvdXA6OlZhbGlkYXRlVHlwZShPYmplY3RUeXBlIHR5cGUpIGNvbnN0IHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRih0eXBlIDwgMCB8fCB0eXBlID49IE5VTV9PQkpFQ1RfVFlQRVMpOworICAvLyBUbyBzaW1wbGlmeSBsb29rdXAsIGJvdGggdmVydGV4IHNoYWRlciBhbmQgZnJhZ21lbnQgc2hhZGVycyBhcmUgZ2l2ZW4gdGhlCisgIC8vIGNvbW1vbiBTSEFERVIgdHlwZS4KKyAgaWYgKHR5cGUgPT0gRlJBR01FTlRfU0hBREVSIHx8IHR5cGUgPT0gVkVSVEVYX1NIQURFUikgeworICAgIHJldHVybiBTSEFERVI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHR5cGU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3NoYXJlX2dyb3VwLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFyZV9ncm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTdkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zaGFyZV9ncm91cC5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19TSEFSRV9HUk9VUF9IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1NIQVJFX0dST1VQX0hfCisKKyNpbmNsdWRlICJnbGVzL2J1ZmZlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9mcmFtZWJ1ZmZlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9wcm9ncmFtX2RhdGEuaCIKKyNpbmNsdWRlICJnbGVzL3JlbmRlcmJ1ZmZlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9zaGFkZXJfZGF0YS5oIgorI2luY2x1ZGUgImdsZXMvdGV4dHVyZV9kYXRhLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworY2xhc3MgR2xlc0NvbnRleHQ7CitjbGFzcyBOYW1lc3BhY2VJbXBsOworCisvLyBUaGUgU2hhcmVHcm91cCBtYW5hZ2VzIHRoZSBuYW1lcyBhbmQgb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggYSBHTEVTIGNvbnRleHQuCisvLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjYW4gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgY29udGV4dHMuCisvLyAoU3BlY2lmaWNhbGx5LCB3aGVuIGEgY29udGV4dCBpcyBjcmVhdGVkLCBhIHNoYXJlZCBjb250ZXh0IGNhbiBhbHNvIGJlCisvLyBzZXQsIGluIHdoaWNoIGNhc2UgYm90aCBjb250ZXh0cyB3aWxsICJzaGFyZSIgdGhpcyBzaGFyZSBncm91cC4pICBBbGwKKy8vIG9wZXJhdGlvbnMgb24gdGhpcyBjbGFzcyBhcmUgc2VyaWFsaXplZCB0aHJvdWdoIGEgbG9jayBzbyBpdCBpcyB0aHJlYWQgc2FmZS4KKy8vIFRob3VnaCBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgKGV4LiBHZW5OYW1lKSBjYW4gb3BlcmF0ZSBvbiBhbnkgb2JqZWN0IHR5cGUsCisvLyBvbmx5IGEgc3BlY2lmaWMgc3Vic2V0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzIG1hZGUgcHVibGljIGJ5IGV4cGxpY2l0bHkKKy8vIHByb3ZpZGluZyBmdW5jdGlvbnMgZm9yIGEgZ2l2ZW4gdHlwZSAoZXguIEdlbkJ1ZmZlck5hbWUpLiAgVGhpcyBpcyB0bworLy8gYWxsb3cgdXMgdG8gY2F0Y2ggcHJvYmxlbWF0aWMgdXNhZ2UgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGFzc2VydGluZworLy8gYXQgcnVudGltZS4KK2NsYXNzIFNoYXJlR3JvdXAgOiBwdWJsaWMgYW5kcm9pZDo6UmVmQmFzZSB7CisgcHVibGljOgorICBleHBsaWNpdCBTaGFyZUdyb3VwKEdsZXNDb250ZXh0KiBjb250ZXh0KTsKKworICAvLyBHZW5lcmF0ZXMgYSBuZXcgb2JqZWN0IGdsb2JhbCBhbmQgbG9jYWwgbmFtZSBhbmQgcmV0dXJucyBpdHMgbG9jYWwgbmFtZQorICAvLyB2YWx1ZS4KKyAgdm9pZCBHZW5CdWZmZXJzKGludCBuLCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgcmV0dXJuIEdlbk5hbWVzKEJVRkZFUiwgbiwgbmFtZXMpOworICB9CisgIHZvaWQgR2VuRnJhbWVidWZmZXJzKGludCBuLCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgcmV0dXJuIEdlbk5hbWVzKEZSQU1FQlVGRkVSLCBuLCBuYW1lcyk7CisgIH0KKyAgdm9pZCBHZW5SZW5kZXJidWZmZXJzKGludCBuLCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgcmV0dXJuIEdlbk5hbWVzKFJFTkRFUkJVRkZFUiwgbiwgbmFtZXMpOworICB9CisgIHZvaWQgR2VuVGV4dHVyZXMoaW50IG4sIE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICByZXR1cm4gR2VuTmFtZXMoVEVYVFVSRSwgbiwgbmFtZXMpOworICB9CisgIHZvaWQgR2VuUHJvZ3JhbXMoaW50IG4sIE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICByZXR1cm4gR2VuTmFtZXMoUFJPR1JBTSwgbiwgbmFtZXMpOworICB9CisgIHZvaWQgR2VuVmVydGV4U2hhZGVycyhpbnQgbiwgT2JqZWN0TG9jYWxOYW1lKiBuYW1lcykgeworICAgIHJldHVybiBHZW5OYW1lcyhWRVJURVhfU0hBREVSLCBuLCBuYW1lcyk7CisgIH0KKyAgdm9pZCBHZW5GcmFnbWVudFNoYWRlcnMoaW50IG4sIE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICByZXR1cm4gR2VuTmFtZXMoRlJBR01FTlRfU0hBREVSLCBuLCBuYW1lcyk7CisgIH0KKworICAvLyBDcmVhdGUgYW4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLgorICBCdWZmZXJEYXRhUHRyIENyZWF0ZUJ1ZmZlckRhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpIHsKKyAgICByZXR1cm4gR2V0T2JqZWN0QXM8QnVmZmVyRGF0YT4oQlVGRkVSLCBuYW1lLCB0cnVlKTsKKyAgfQorICBGcmFtZWJ1ZmZlckRhdGFQdHIgQ3JlYXRlRnJhbWVidWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPEZyYW1lYnVmZmVyRGF0YT4oRlJBTUVCVUZGRVIsIG5hbWUsIHRydWUpOworICB9CisgIFJlbmRlcmJ1ZmZlckRhdGFQdHIgQ3JlYXRlUmVuZGVyYnVmZmVyRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkgeworICAgIHJldHVybiBHZXRPYmplY3RBczxSZW5kZXJidWZmZXJEYXRhPihSRU5ERVJCVUZGRVIsIG5hbWUsIHRydWUpOworICB9CisgIFRleHR1cmVEYXRhUHRyIENyZWF0ZVRleHR1cmVEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPFRleHR1cmVEYXRhPihURVhUVVJFLCBuYW1lLCB0cnVlKTsKKyAgfQorICBQcm9ncmFtRGF0YVB0ciBDcmVhdGVQcm9ncmFtRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkgeworICAgIHJldHVybiBHZXRPYmplY3RBczxQcm9ncmFtRGF0YT4oUFJPR1JBTSwgbmFtZSwgdHJ1ZSk7CisgIH0KKyAgU2hhZGVyRGF0YVB0ciBDcmVhdGVWZXJ0ZXhTaGFkZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPFNoYWRlckRhdGE+KFZFUlRFWF9TSEFERVIsIG5hbWUsIHRydWUpOworICB9CisgIFNoYWRlckRhdGFQdHIgQ3JlYXRlRnJhZ21lbnRTaGFkZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPFNoYWRlckRhdGE+KEZSQUdNRU5UX1NIQURFUiwgbmFtZSwgdHJ1ZSk7CisgIH0KKworICAvLyBSZXRyaWV2ZSB0aGUgb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB3aXRoIHRoZSBnaXZlbiBsb2NhbCBuYW1lLgorICBCdWZmZXJEYXRhUHRyIEdldEJ1ZmZlckRhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpIHsKKyAgICByZXR1cm4gR2V0T2JqZWN0QXM8QnVmZmVyRGF0YT4oQlVGRkVSLCBuYW1lLCBmYWxzZSk7CisgIH0KKyAgRnJhbWVidWZmZXJEYXRhUHRyIEdldEZyYW1lYnVmZmVyRGF0YShPYmplY3RMb2NhbE5hbWUgbmFtZSkgeworICAgIHJldHVybiBHZXRPYmplY3RBczxGcmFtZWJ1ZmZlckRhdGE+KEZSQU1FQlVGRkVSLCBuYW1lLCBmYWxzZSk7CisgIH0KKyAgUmVuZGVyYnVmZmVyRGF0YVB0ciBHZXRSZW5kZXJidWZmZXJEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPFJlbmRlcmJ1ZmZlckRhdGE+KFJFTkRFUkJVRkZFUiwgbmFtZSwgZmFsc2UpOworICB9CisgIFRleHR1cmVEYXRhUHRyIEdldFRleHR1cmVEYXRhKE9iamVjdExvY2FsTmFtZSBuYW1lKSB7CisgICAgcmV0dXJuIEdldE9iamVjdEFzPFRleHR1cmVEYXRhPihURVhUVVJFLCBuYW1lLCBmYWxzZSk7CisgIH0KKyAgUHJvZ3JhbURhdGFQdHIgR2V0UHJvZ3JhbURhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpIHsKKyAgICByZXR1cm4gR2V0T2JqZWN0QXM8UHJvZ3JhbURhdGE+KFBST0dSQU0sIG5hbWUsIGZhbHNlKTsKKyAgfQorICBTaGFkZXJEYXRhUHRyIEdldFNoYWRlckRhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpIHsKKyAgICByZXR1cm4gR2V0T2JqZWN0QXM8U2hhZGVyRGF0YT4oU0hBREVSLCBuYW1lLCBmYWxzZSk7CisgIH0KKworICAvLyBEZWxldGVzIHRoZSBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFzIHdlbGwgYXMgdW5yZWdpc3RlcmluZyBpdHMKKyAgLy8gbmFtZXMgZnJvbSB0aGUgU2hhcmVHcm91cC4KKyAgdm9pZCBEZWxldGVCdWZmZXJzKGludCBuLCBjb25zdCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgRGVsZXRlT2JqZWN0cyhCVUZGRVIsIG4sIG5hbWVzKTsKKyAgfQorICB2b2lkIERlbGV0ZUZyYW1lYnVmZmVycyhpbnQgbiwgY29uc3QgT2JqZWN0TG9jYWxOYW1lKiBuYW1lcykgeworICAgIERlbGV0ZU9iamVjdHMoRlJBTUVCVUZGRVIsIG4sIG5hbWVzKTsKKyAgfQorICB2b2lkIERlbGV0ZVJlbmRlcmJ1ZmZlcnMoaW50IG4sIGNvbnN0IE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICBEZWxldGVPYmplY3RzKFJFTkRFUkJVRkZFUiwgbiwgbmFtZXMpOworICB9CisgIHZvaWQgRGVsZXRlVGV4dHVyZXMoaW50IG4sIGNvbnN0IE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICBEZWxldGVPYmplY3RzKFRFWFRVUkUsIG4sIG5hbWVzKTsKKyAgfQorICB2b2lkIERlbGV0ZVByb2dyYW1zKGludCBuLCBjb25zdCBPYmplY3RMb2NhbE5hbWUqIG5hbWVzKSB7CisgICAgLy8gVE9ETyhjcmJ1Zy5jb20vNDI0MzUzKTogS2VlcCBwcm9ncmFtIG5hbWUgYWN0aXZlIHVudGlsIHRoZSBwcm9ncmFtCisgICAgLy8gaXMgYWN0dWFsbHkgdW51c2VkLCBldmVuIGlmIGl0IHdhcyBtYXJrZWQgYXMgZGVsZXRlZC4KKyAgICBEZWxldGVPYmplY3RzKFBST0dSQU0sIG4sIG5hbWVzKTsKKyAgfQorICB2b2lkIERlbGV0ZVNoYWRlcnMoaW50IG4sIGNvbnN0IE9iamVjdExvY2FsTmFtZSogbmFtZXMpIHsKKyAgICBEZWxldGVPYmplY3RzKFNIQURFUiwgbiwgbmFtZXMpOworICB9CisKKyAgLy8gUmV0cmlldmVzIHRoZSAiZ2xvYmFsIiBuYW1lIG9mIGFuIG9iamVjdCBvciAwIGlmIHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuCisgIE9iamVjdEdsb2JhbE5hbWUgR2V0QnVmZmVyR2xvYmFsTmFtZShPYmplY3RMb2NhbE5hbWUgbG9jYWxfbmFtZSkgeworICAgIHJldHVybiBHZXRHbG9iYWxOYW1lKEJVRkZFUiwgbG9jYWxfbmFtZSk7CisgIH0KKyAgT2JqZWN0R2xvYmFsTmFtZSBHZXRGcmFtZWJ1ZmZlckdsb2JhbE5hbWUoT2JqZWN0TG9jYWxOYW1lIGxvY2FsX25hbWUpIHsKKyAgICByZXR1cm4gR2V0R2xvYmFsTmFtZShGUkFNRUJVRkZFUiwgbG9jYWxfbmFtZSk7CisgIH0KKyAgT2JqZWN0R2xvYmFsTmFtZSBHZXRSZW5kZXJidWZmZXJHbG9iYWxOYW1lKE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKSB7CisgICAgcmV0dXJuIEdldEdsb2JhbE5hbWUoUkVOREVSQlVGRkVSLCBsb2NhbF9uYW1lKTsKKyAgfQorICBPYmplY3RHbG9iYWxOYW1lIEdldFRleHR1cmVHbG9iYWxOYW1lKE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKSB7CisgICAgcmV0dXJuIEdldEdsb2JhbE5hbWUoVEVYVFVSRSwgbG9jYWxfbmFtZSk7CisgIH0KKworICAvLyBNYXBzIGFuIG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGdsb2JhbCBuYW1lZCBvYmplY3QuICAoTm90ZTogdXNlZnVsIHdoZW4KKyAgLy8gY3JlYXRpbmcgRUdMSW1hZ2Ugc2libGluZ3MpLgorICB2b2lkIFNldFRleHR1cmVHbG9iYWxOYW1lKE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdEdsb2JhbE5hbWUgZ2xvYmFsX25hbWUpIHsKKyAgICBTZXRHbG9iYWxOYW1lKFRFWFRVUkUsIGxvY2FsX25hbWUsIGdsb2JhbF9uYW1lKTsKKyAgfQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIH5TaGFyZUdyb3VwKCk7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIHN0ZDo6cGFpcjxPYmplY3RUeXBlLCBPYmplY3RMb2NhbE5hbWU+IE9iamVjdElEOworICB0eXBlZGVmIHN0ZDo6bWFwPE9iamVjdElELCBPYmplY3REYXRhUHRyPiBPYmplY3REYXRhTWFwOworCisgIE9iamVjdERhdGFQdHIgR2V0T2JqZWN0KE9iamVjdFR5cGUgdHlwZSwgT2JqZWN0TG9jYWxOYW1lIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY3JlYXRlX2lmX25lZWRlZCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBhbmRyb2lkOjpzcDxUPiBHZXRPYmplY3RBcyhPYmplY3RUeXBlIHR5cGUsIE9iamVjdExvY2FsTmFtZSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNyZWF0ZV9pZl9uZWVkZWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEdldE9iamVjdCh0eXBlLCBuYW1lLCBjcmVhdGVfaWZfbmVlZGVkKS5nZXQoKSk7CisgIH0KKyAgdm9pZCBEZWxldGVPYmplY3RzKE9iamVjdFR5cGUgdHlwZSwgaW50IG4sIGNvbnN0IE9iamVjdExvY2FsTmFtZSogbmFtZXMpOworCisgIHZvaWQgR2VuTmFtZXMoT2JqZWN0VHlwZSB0eXBlLCBpbnQgbiwgT2JqZWN0TG9jYWxOYW1lKiBuYW1lcyk7CisgIE9iamVjdEdsb2JhbE5hbWUgR2V0R2xvYmFsTmFtZShPYmplY3RUeXBlIHR5cGUsIE9iamVjdExvY2FsTmFtZSBsb2NhbF9uYW1lKTsKKyAgdm9pZCBTZXRHbG9iYWxOYW1lKE9iamVjdFR5cGUgdHlwZSwgT2JqZWN0TG9jYWxOYW1lIGxvY2FsX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBPYmplY3RHbG9iYWxOYW1lIGdsb2JhbF9uYW1lKTsKKworICBPYmplY3RUeXBlIFZhbGlkYXRlVHlwZShPYmplY3RUeXBlIHR5cGUpIGNvbnN0OworICBPYmplY3RJRCBHZXRPYmplY3RJRChPYmplY3RUeXBlIHR5cGUsIE9iamVjdExvY2FsTmFtZSBuYW1lKSBjb25zdDsKKyAgTmFtZXNwYWNlSW1wbCogR2V0TmFtZXNwYWNlKE9iamVjdFR5cGUgdHlwZSk7CisKKyAgYW5kcm9pZDo6YmFzZTo6TG9jayBsb2NrXzsKKyAgTmFtZXNwYWNlSW1wbCogbmFtZXNwYWNlX1tOVU1fT0JKRUNUX1RZUEVTXTsKKyAgT2JqZWN0RGF0YU1hcCBvYmplY3RzXzsKKyAgR2xlc0NvbnRleHQqIGNvbnRleHRfOworCisgIFNoYXJlR3JvdXAoY29uc3QgU2hhcmVHcm91cCYpOworICBTaGFyZUdyb3VwJiBvcGVyYXRvcj0oY29uc3QgU2hhcmVHcm91cCYpOworfTsKKwordHlwZWRlZiBhbmRyb2lkOjpzcDxTaGFyZUdyb3VwPiBTaGFyZUdyb3VwUHRyOworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfU0hBUkVfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3N0YXRlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3N0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU2MDU4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvc3RhdGUuY3BwCkBAIC0wLDAgKzEsMTM3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJnbGVzL3N0YXRlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlICJjb21tb24vYWxvZy5oIgorI2luY2x1ZGUgImNvbW1vbi9kbG9nLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX29wdGlvbnMuaCIKKyNpbmNsdWRlICJnbGVzL2J1ZmZlcl9kYXRhLmgiCisjaW5jbHVkZSAiZ2xlcy9kZWJ1Zy5oIgorI2luY2x1ZGUgImdsZXMvZ2xlc19jb250ZXh0LmgiCisjaW5jbHVkZSAiZ2xlcy9tYWNyb3MuaCIKKworI2RlZmluZSBVTklGT1JNX0tFWShlbnVtLCBuYW1lKSBuYW1lLAorY29uc3QgY2hhcioga1VuaWZvcm1OYW1lc1tdID0ge1VOSUZPUk1fS0VZX1RVUExFfTsKKyN1bmRlZiBVTklGT1JNX0tFWQorCitpbmxpbmUgaW50IExvZzJGbG9vcihpbnQgbWF4X3RleHR1cmVfc2l6ZSkgeworICBjb25zdCBkb3VibGUgc2l6ZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obWF4X3RleHR1cmVfc2l6ZSk7CisgIHJldHVybiBmbG9vcihsb2coc2l6ZSkgLyBsb2coMi4wKSk7Cit9CisKK3N0cnVjdCBFbGVtZW50UmFuZ2UgeworICBFbGVtZW50UmFuZ2UoKSA6IGZpcnN0KDApLCBsYXN0KDApIHt9CisgIHNpemVfdCBmaXJzdDsKKyAgc2l6ZV90IGxhc3Q7Cit9OworCitzdGF0aWMgRWxlbWVudFJhbmdlIEdldEVsZW1lbnRSYW5nZShHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCogZGF0YSkgeworICBFbGVtZW50UmFuZ2UgcmFuZ2U7CisgIGlmIChjb3VudCA9PSAwKSB7CisgICAgcmV0dXJuIHJhbmdlOworICB9IGVsc2UgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkgeworICAgIGNvbnN0IEdMdWJ5dGUqIGFyciA9IChjb25zdCBHTHVieXRlKilkYXRhOworICAgIHJhbmdlLmZpcnN0ID0gYXJyWzBdOworICAgIHJhbmdlLmxhc3QgPSBhcnJbMF07CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICByYW5nZS5maXJzdCA9IHN0ZDo6bWluPHNpemVfdD4oYXJyW2ldLCByYW5nZS5maXJzdCk7CisgICAgICByYW5nZS5sYXN0ID0gc3RkOjptYXg8c2l6ZV90PihhcnJbaV0sIHJhbmdlLmxhc3QpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUKSB7CisgICAgY29uc3QgR0x1c2hvcnQqIGFyciA9IChjb25zdCBHTHVzaG9ydCopZGF0YTsKKyAgICByYW5nZS5maXJzdCA9IGFyclswXTsKKyAgICByYW5nZS5sYXN0ID0gYXJyWzBdOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgcmFuZ2UuZmlyc3QgPSBzdGQ6Om1pbjxzaXplX3Q+KGFycltpXSwgcmFuZ2UuZmlyc3QpOworICAgICAgcmFuZ2UubGFzdCA9IHN0ZDo6bWF4PHNpemVfdD4oYXJyW2ldLCByYW5nZS5sYXN0KTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9JTlQpIHsKKyAgICBjb25zdCBHTHVpbnQqIGFyciA9IChjb25zdCBHTHVpbnQqKWRhdGE7CisgICAgcmFuZ2UuZmlyc3QgPSBhcnJbMF07CisgICAgcmFuZ2UubGFzdCA9IGFyclswXTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgIHJhbmdlLmZpcnN0ID0gc3RkOjptaW48c2l6ZV90PihhcnJbaV0sIHJhbmdlLmZpcnN0KTsKKyAgICAgIHJhbmdlLmxhc3QgPSBzdGQ6Om1heDxzaXplX3Q+KGFycltpXSwgcmFuZ2UubGFzdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gdHlwZSIpOworICB9CisgIHJldHVybiByYW5nZTsKK30KKworc3RhdGljIEdMaW50IEdldFR5cGVTaXplKEdMZW51bSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0xfQllURToKKyAgICAgIHJldHVybiBzaXplb2YoR0xieXRlKTsKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICByZXR1cm4gc2l6ZW9mKEdMdWJ5dGUpOworICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgICByZXR1cm4gc2l6ZW9mKEdMc2hvcnQpOworICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6CisgICAgICByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKKyAgICBjYXNlIEdMX0lOVDoKKyAgICAgIHJldHVybiBzaXplb2YoR0xpbnQpOworICAgIGNhc2UgR0xfVU5TSUdORURfSU5UOgorICAgICAgcmV0dXJuIHNpemVvZihHTHVpbnQpOworICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICByZXR1cm4gc2l6ZW9mKEdMZmxvYXQpOworICAgIGNhc2UgR0xfRklYRUQ6CisgICAgICByZXR1cm4gc2l6ZW9mKEdMZml4ZWQpOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIEdMIHR5cGU6ICVkIiwgdHlwZSk7CisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIGxpZ2h0cyBjYW4gYmUgZm91bmQgaGVyZToKKy8vIGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHNlY3Rpb24gMi4xMi4xIHRhYmxlIDIuOC4KK0xpZ2h0OjpMaWdodCgpCisgICAgOiBhbWJpZW50KDAuZiwgMC5mLCAwLmYsIDEuZiksCisgICAgICBkaWZmdXNlKDAuZiwgMC5mLCAwLmYsIDEuZiksCisgICAgICBzcGVjdWxhcigwLmYsIDAuZiwgMC5mLCAxLmYpLAorICAgICAgcG9zaXRpb24oMC5mLCAwLmYsIDEuZiwgMC5mKSwKKyAgICAgIGRpcmVjdGlvbigwLmYsIDAuZiwgLTEuZiwgMC5mKSwKKyAgICAgIHNwb3RfZXhwb25lbnQoMC5mKSwKKyAgICAgIHNwb3RfY3V0b2ZmKDE4MC5mKSwKKyAgICAgIGNvbnN0X2F0dGVudWF0aW9uKDEuZiksCisgICAgICBsaW5lYXJfYXR0ZW51YXRpb24oMC5mKSwKKyAgICAgIHF1YWRyYXRpY19hdHRlbnVhdGlvbigwLmYpIHt9CisKK2Jvb2wgTGlnaHQ6OklzU3BvdCgpIGNvbnN0IHsgcmV0dXJuIHNwb3RfY3V0b2ZmICE9IDE4MC5mOyB9CisKK2Jvb2wgTGlnaHQ6OklzUG9zaXRpb25hbCgpIGNvbnN0IHsgcmV0dXJuIHBvc2l0aW9uLkdldCgzKSAhPSAwLmY7IH0KKworYm9vbCBMaWdodDo6SXNEaXJlY3Rpb25hbCgpIGNvbnN0IHsgcmV0dXJuIHBvc2l0aW9uLkdldCgzKSA9PSAwLmY7IH0KKworYm9vbCBMaWdodDo6U2hvdWxkQXR0ZW51YXRlKCkgY29uc3QgeworICByZXR1cm4gSXNQb3NpdGlvbmFsKCkgJiYKKyAgICAgICAgIChjb25zdF9hdHRlbnVhdGlvbiAhPSAxLmYgfHwgbGluZWFyX2F0dGVudWF0aW9uICE9IDAuZiB8fAorICAgICAgICAgIHF1YWRyYXRpY19hdHRlbnVhdGlvbiAhPSAwLmYpOworfQorCisvLyBEZWZhdWx0IHZhbHVlcyBmb3IgbGlnaHRzIGNhbiBiZSBmb3VuZCBoZXJlOgorLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEyLjEgdGFibGUgMi44LgorTWF0ZXJpYWw6Ok1hdGVyaWFsKCkKKyAgICA6IGFtYmllbnQoMC4yZiwgMC4yZiwgMC4yZiwgMS4wZiksCisgICAgICBkaWZmdXNlKDAuOGYsIDAuOGYsIDAuOGYsIDEuMGYpLAorICAgICAgc3BlY3VsYXIoMC5mLCAwLmYsIDAuZiwgMS5mKSwKKyAgICAgIGVtaXNzaW9uKDAuZiwgMC5mLCAwLmYsIDEuZiksCisgICAgICBzaGluaW5lc3MoMC5mKSB7fQorCisvLyBEZWZhdWx0IHZhbHVlcyBmb3IgbGlnaHRzIGNhbiBiZSBmb3VuZCBoZXJlOgorLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAzLjguCitGb2c6OkZvZygpCisgICAgOiBtb2RlKEdMX0VYUCksCisgICAgICBjb2xvcigwLmYsIDAuZiwgMC5mLCAwLmYpLAorICAgICAgZGVuc2l0eSgxLmYpLAorICAgICAgc3RhcnQoMC5mKSwKKyAgICAgIGVuZCgxLmYpIHt9CisKKy8vIFNlZSBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDMuNy4xMi4KKy8vIFRoZSBpbml0aWFsIHZhbHVlcyBhcmUgZGVmaW5lZCBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uLgorVGV4RW52OjpUZXhFbnYoKQorICAgIDogbW9kZShHTF9NT0RVTEFURSksCisgICAgICBjb21iaW5lX3JnYihHTF9NT0RVTEFURSksCisgICAgICBjb21iaW5lX2FscGhhKEdMX01PRFVMQVRFKSwKKyAgICAgIGNvbG9yKDAuZiwgMC5mLCAwLmYsIDAuZiksCisgICAgICByZ2Jfc2NhbGUoMS4wZiksCisgICAgICBhbHBoYV9zY2FsZSgxLjBmKSB7CisgIHNyY19yZ2JbMF0gPSBHTF9URVhUVVJFOworICBzcmNfcmdiWzFdID0gR0xfUFJFVklPVVM7CisgIHNyY19yZ2JbMl0gPSBHTF9DT05TVEFOVDsKKyAgc3JjX2FscGhhWzBdID0gR0xfVEVYVFVSRTsKKyAgc3JjX2FscGhhWzFdID0gR0xfUFJFVklPVVM7CisgIHNyY19hbHBoYVsyXSA9IEdMX0NPTlNUQU5UOworICBvcGVyYW5kX3JnYlswXSA9IEdMX1NSQ19DT0xPUjsKKyAgb3BlcmFuZF9yZ2JbMV0gPSBHTF9TUkNfQ09MT1I7CisgIG9wZXJhbmRfcmdiWzJdID0gR0xfU1JDX0FMUEhBOyAgLy8gTm90ZTogYWxwaGEgaGVyZSBjb25mb3JtcyB0byBzcGVjCisgIG9wZXJhbmRfYWxwaGFbMF0gPSBHTF9TUkNfQUxQSEE7CisgIG9wZXJhbmRfYWxwaGFbMV0gPSBHTF9TUkNfQUxQSEE7CisgIG9wZXJhbmRfYWxwaGFbMl0gPSBHTF9TUkNfQUxQSEE7Cit9CisKKy8vIFNlZSBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9nbGVzL2V4dGVuc2lvbnMvT0VTL09FU190ZXh0dXJlX2N1YmVfbWFwLnR4dAorLy8gVGhlIGluaXRpYWwgdmFsdWVzIGFyZSBkZWZpbmVkIGluIFNlY3Rpb24gMi4xMS40CitUZXhHZW46OlRleEdlbigpCisgICAgOiBtb2RlKEdMX1JFRkxFQ1RJT05fTUFQX09FUyksCisgICAgICBlbmFibGVkKEdMX0ZBTFNFKSB7Cit9CisKKy8vIFNlZSBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDYuMgorLy8gVGhlIGluaXRpYWwgdmFsdWVzIGFyZSBkZWZpbmVkIGluIHRhYmxlIDYuMTEKK1BvaW50UGFyYW1ldGVyczo6UG9pbnRQYXJhbWV0ZXJzKCkKKyAgICA6IHNpemVfbWluKDAuZiksCisgICAgICBzaXplX21heCgxLmYpLAorICAgICAgY3VycmVudF9zaXplKDEuZikgeworICBhdHRlbnVhdGlvblswXSA9IDEuZjsKKyAgYXR0ZW51YXRpb25bMV0gPSAwLmY7CisgIGF0dGVudWF0aW9uWzJdID0gMC5mOworfQorCitBbHBoYVRlc3Q6OkFscGhhVGVzdCgpCisgICAgOiBmdW5jKEdMX0FMV0FZUyksIHZhbHVlKDAuZikgeworfQorCitQb2ludGVyRGF0YTo6UG9pbnRlckRhdGEoKQorICA6IGVuYWJsZWQoZmFsc2UpLAorICAgIHNpemUoNCksCisgICAgdHlwZShHTF9GTE9BVCksCisgICAgc3RyaWRlKDApLAorICAgIG5vcm1hbGl6ZShHTF9GQUxTRSksCisgICAgYnVmZmVyX25hbWUoMCksCisgICAgcG9pbnRlcihOVUxMKSB7Cit9CisKK3ZvaWQgU3RhdGVDYWNoZUxvYWRlckhlbHBlcjo6TG9hZChHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiogZGF0YSkgeworICBHbGVzQ29udGV4dCogYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGMgPT0gTlVMTCk7CisgIFBBU1NfVEhST1VHSChjLCBHZXRCb29sZWFudiwgdmFsdWUsIGRhdGEpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoR0xlbnVtIHZhbHVlLCBHTGZsb2F0KiBkYXRhKSB7CisgIEdsZXNDb250ZXh0KiBjID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoYyA9PSBOVUxMKTsKKyAgUEFTU19USFJPVUdIKGMsIEdldEZsb2F0diwgdmFsdWUsIGRhdGEpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoR0xlbnVtIHZhbHVlLCBHTGludCogZGF0YSkgeworICBHbGVzQ29udGV4dCogYyA9IEdldEN1cnJlbnRHbGVzQ29udGV4dCgpOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGMgPT0gTlVMTCk7CisgIFBBU1NfVEhST1VHSChjLCBHZXRJbnRlZ2VydiwgdmFsdWUsIGRhdGEpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoR0xlbnVtIHZhbHVlLCBHTHVpbnQqIGRhdGEpIHsKKyAgR2xlc0NvbnRleHQqIGMgPSBHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihjID09IE5VTEwpOworICBQQVNTX1RIUk9VR0goYywgR2V0SW50ZWdlcnYsIHZhbHVlLCByZWludGVycHJldF9jYXN0PEdMaW50Kj4oZGF0YSkpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoCisgICAgR0xlbnVtIHZhbHVlLCBHTGJvb2xlYW4mIGRhdGEpIHsgIC8vIE5PTElOVChydW50aW1lL3JlZmVyZW5jZXMpCisgIExvYWQodmFsdWUsICZkYXRhKTsKK30KKwordm9pZCBTdGF0ZUNhY2hlTG9hZGVySGVscGVyOjpMb2FkKAorICAgIEdMZW51bSB2YWx1ZSwgR0xmbG9hdCYgZGF0YSkgeyAgLy8gTk9MSU5UKHJ1bnRpbWUvcmVmZXJlbmNlcykKKyAgTG9hZCh2YWx1ZSwgJmRhdGEpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoCisgICAgR0xlbnVtIHZhbHVlLCBHTGludCYgZGF0YSkgeyAgLy8gTk9MSU5UKHJ1bnRpbWUvcmVmZXJlbmNlcykKKyAgTG9hZCh2YWx1ZSwgJmRhdGEpOworfQorCit2b2lkIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoCisgICAgR0xlbnVtIHZhbHVlLCBHTHVpbnQmIGRhdGEpIHsgIC8vIE5PTElOVChydW50aW1lL3JlZmVyZW5jZXMpCisgIExvYWQodmFsdWUsICZkYXRhKTsKK30KKworbmFtZXNwYWNlIHsKKworY29uc3QgR0xmbG9hdCBrRnVsbHNjcmVlblF1YWRWZXJ0aWNlc1tdID0geworICAvLyBwb3NpdGlvbgorICAtMS4wZiwgLTEuMGYsCisgICsxLjBmLCAtMS4wZiwKKyAgLTEuMGYsICsxLjBmLAorICArMS4wZiwgKzEuMGYsCisKKyAgLy8gdGV4Y29vcmQKKyAgMC4wZiwgMC4wZiwKKyAgMS4wZiwgMC4wZiwKKyAgMC4wZiwgMS4wZiwKKyAgMS4wZiwgMS4wZiwKKworICAvLyBmbGlwcGVkIHRleGNvb3JkCisgIDAuMGYsIDEuMGYsCisgIDEuMGYsIDEuMGYsCisgIDAuMGYsIDAuMGYsCisgIDEuMGYsIDAuMGYsCit9OworCitjb25zdCBzaXplX3Qga05vcm1hbFVWT2Zmc2V0ID0gc2l6ZW9mKEdMZmxvYXQpICogODsKK2NvbnN0IHNpemVfdCBrRmxpcHBlZFVWT2Zmc2V0ID0gc2l6ZW9mKEdMZmxvYXQpICogMTY7CisKK2NvbnN0IGNoYXIga1ZlcnRleFNoYWRlcltdID0KKyAgImF0dHJpYnV0ZSBtZWRpdW1wIHZlYzIgYV9wb3NpdGlvbjsiCisgICJhdHRyaWJ1dGUgbWVkaXVtcCB2ZWMyIGFfdGV4Y29vcmQ7IgorICAidmFyeWluZyBtZWRpdW1wIHZlYzIgdl90ZXhjb29yZDsiCisgICJ2b2lkIG1haW4oKSB7IgorICAiICB2X3RleGNvb3JkID0gYV90ZXhjb29yZDsiCisgICIgIGdsX1Bvc2l0aW9uID0gdmVjNChhX3Bvc2l0aW9uLngsIGFfcG9zaXRpb24ueSwgMC4wLCAxLjApOyIKKyAgIn0iOworCitjb25zdCBjaGFyIGtGcmFnbWVudFNoYWRlcltdID0KKyAgInVuaWZvcm0gc2FtcGxlcjJEIHVfc2FtcGxlcjsiCisgICJ2YXJ5aW5nIG1lZGl1bXAgdmVjMiB2X3RleGNvb3JkOyIKKyAgInZvaWQgbWFpbigpIHsiCisgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X3NhbXBsZXIsIHZfdGV4Y29vcmQpOyIKKyAgIn0iOworCit9ICAvLyBuYW1lc3BhY2UKKworRnVsbHNjcmVlblF1YWQ6OkZ1bGxzY3JlZW5RdWFkKEdsZXNDb250ZXh0KiBjb250ZXh0KQorICA6IGNvbnRleHRfKGNvbnRleHQpLAorICAgIHByb2dyYW1fKDApLAorICAgIGJ1ZmZlcl8oMCksCisgICAgcG9zaXRpb25fYXR0cmliX2lkeF8oLTEpLAorICAgIHNhbXBsZXJfdW5pZm9ybV9pZHhfKC0xKSB7CisKKyAgY29uc3QgR0x1aW50IHZzaCA9IGNvbnRleHRfLT5Db21waWxlU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIGtWZXJ0ZXhTaGFkZXIpOworICBjb25zdCBHTHVpbnQgZnNoID0gY29udGV4dF8tPkNvbXBpbGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ZyYWdtZW50U2hhZGVyKTsKKworICBwcm9ncmFtXyA9IGNvbnRleHRfLT5Db21waWxlUHJvZ3JhbSh2c2gsIGZzaCk7CisgIHBvc2l0aW9uX2F0dHJpYl9pZHhfID0gUEFTU19USFJPVUdIKGNvbnRleHRfLCBHZXRBdHRyaWJMb2NhdGlvbiwgcHJvZ3JhbV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX3Bvc2l0aW9uIik7CisgIHRleGNvb3JkX2F0dHJpYl9pZHhfID0gUEFTU19USFJPVUdIKGNvbnRleHRfLCBHZXRBdHRyaWJMb2NhdGlvbiwgcHJvZ3JhbV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX3RleGNvb3JkIik7CisgIHNhbXBsZXJfdW5pZm9ybV9pZHhfID0gUEFTU19USFJPVUdIKGNvbnRleHRfLCBHZXRVbmlmb3JtTG9jYXRpb24sIHByb2dyYW1fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidV9zYW1wbGVyIik7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgRGVsZXRlU2hhZGVyLCB2c2gpOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIERlbGV0ZVNoYWRlciwgZnNoKTsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBHZW5CdWZmZXJzLCAxLCAmYnVmZmVyXyk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQmluZEJ1ZmZlciwgR0xfQVJSQVlfQlVGRkVSLCBidWZmZXJfKTsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBCdWZmZXJEYXRhLCBHTF9BUlJBWV9CVUZGRVIsCisgICAgICAgICAgICAgICBzaXplb2Yoa0Z1bGxzY3JlZW5RdWFkVmVydGljZXMpLCBrRnVsbHNjcmVlblF1YWRWZXJ0aWNlcywKKyAgICAgICAgICAgICAgIEdMX1NUQVRJQ19EUkFXKTsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBVc2VQcm9ncmFtLCBwcm9ncmFtXyk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVW5pZm9ybTFpLCBzYW1wbGVyX3VuaWZvcm1faWR4XywgMCk7Cit9CisKK0Z1bGxzY3JlZW5RdWFkOjp+RnVsbHNjcmVlblF1YWQoKSB7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgRGVsZXRlQnVmZmVycywgMSwgJmJ1ZmZlcl8pOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIERlbGV0ZVByb2dyYW0sIHByb2dyYW1fKTsKK30KKwordm9pZCBGdWxsc2NyZWVuUXVhZDo6RHJhdyhHTHVpbnQgdGV4dHVyZSwgYm9vbCBmbGlwX3YpIHsKKyAgY29uc3QgR0x1aW50IGdsb2JhbF9uYW1lID0KKyAgICBjb250ZXh0Xy0+R2V0U2hhcmVHcm91cCgpLT5HZXRUZXh0dXJlR2xvYmFsTmFtZSh0ZXh0dXJlKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihnbG9iYWxfbmFtZSA9PSAwKTsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBVc2VQcm9ncmFtLCBwcm9ncmFtXyk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQWN0aXZlVGV4dHVyZSwgR0xfVEVYVFVSRTApOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEJpbmRUZXh0dXJlLCBHTF9URVhUVVJFXzJELCBnbG9iYWxfbmFtZSk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgRW5hYmxlVmVydGV4QXR0cmliQXJyYXksIHBvc2l0aW9uX2F0dHJpYl9pZHhfKTsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSwgdGV4Y29vcmRfYXR0cmliX2lkeF8pOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEJpbmRCdWZmZXIsIEdMX0FSUkFZX0JVRkZFUiwgYnVmZmVyXyk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVmVydGV4QXR0cmliUG9pbnRlciwgcG9zaXRpb25fYXR0cmliX2lkeF8sIDIsCisgICAgICAgICAgICAgICBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIDApOworICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gZmxpcF92ID8ga0ZsaXBwZWRVVk9mZnNldCA6IGtOb3JtYWxVVk9mZnNldDsKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBWZXJ0ZXhBdHRyaWJQb2ludGVyLCB0ZXhjb29yZF9hdHRyaWJfaWR4XywgMiwKKyAgICAgICAgICAgICAgIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ob2Zmc2V0KSk7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgRHJhd0FycmF5cywgR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgcG9zaXRpb25fYXR0cmliX2lkeF8pOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgdGV4Y29vcmRfYXR0cmliX2lkeF8pOworfQorCisvLyBEZWZhdWx0IHZhbHVlcyBjYW4gYmUgZm91bmQgaGVyZToKKy8vIGNvbG9yOmVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHNlY3Rpb24gMi43CisvLyBub3JtYWw6IGVzX2Z1bGxfc3BlYy4xLjEuMTIucGRmIHNlY3Rpb24gMi43CisvLyBhbWJpZW50OiBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDIuMTIuMSB0YWJsZSAyLjguCitVbmlmb3JtQ29udGV4dDo6VW5pZm9ybUNvbnRleHQoR2xlc0NvbnRleHQqIGNvbnRleHQpCisgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICAgIHByb2dyYW1fb2JqZWN0XygwKSwKKyAgICAgIGFjdGl2ZV90ZXh0dXJlX3VuaXRfKDApLAorICAgICAgY3VycmVudF9wYWxldHRlX21hdHJpeF8oMCksCisgICAgICBhbWJpZW50XyhlbXVnbDo6VmVjdG9yKDAuMmYsIDAuMmYsIDAuMmYsIDEuZikpLAorICAgICAgY29sb3JfKGVtdWdsOjpWZWN0b3IoMS5mLCAxLmYsIDEuZiwgMS5mKSksCisgICAgICBub3JtYWxfKGVtdWdsOjpWZWN0b3IoMC5mLCAwLmYsIDEuZiwgMC5mKSkgeworICBETE9HKCJDcmVhdGVkIHVuaWZvcm0gY29udGV4dCBmb3IgR0xFUzEgY29udGV4dCBAICVwIiwgY29udGV4dCk7CisKKyAgLy8gR0xfTU9ERUxWSUVXIGlzIHRoZSBkZWZhdWx0IG1hdHJpeCBtb2RlLgorICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDIuMTAuMi4KKyAgU2V0TWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCisgIC8vIFNvbWUgZGVmYXVsdCB2YWx1ZXMgZm9yIExJR0hUMCBhcmUgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVyIGxpZ2h0cy4KKyAgLy8gZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAyLjEyLjEgdGFibGUgMi44LgorICBsaWdodHNfWzBdLk11dGF0ZSgpLmRpZmZ1c2UgPSBlbXVnbDo6VmVjdG9yKDEuZiwgMS5mLCAxLmYsIDEuZik7CisgIGxpZ2h0c19bMF0uTXV0YXRlKCkuc3BlY3VsYXIgPSBlbXVnbDo6VmVjdG9yKDEuZiwgMS5mLCAxLmYsIDEuZik7Cit9CisKK3ZvaWQgVW5pZm9ybUNvbnRleHQ6OkluaXQoaW50IG51bV90ZXh0dXJlX3VuaXRzKSB7CisgIERMT0coIkluaXRpYWxpemVkIHVuaWZvcm0gY29udGV4dCBmb3IgR0xFUzEgY29udGV4dCBAICVwIiwgY29udGV4dF8pOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG51bV90ZXh0dXJlX3VuaXRzICE9IGtNYXhUZXh0dXJlVW5pdHMpOworfQorCit2b2lkIFVuaWZvcm1Db250ZXh0OjpCaW5kKFByb2dyYW1Db250ZXh0KiBwcm9ncmFtKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoIXByb2dyYW0pOworCisgIC8vIElmIHRoZSBwcm9ncmFtIGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgdGhlIHVuaWZvcm1zCisgIC8vIGFyZSB1cGRhdGVkIGFzIHRoZSBuZXcgcHJvZ3JhbSBtYXkgaGF2ZSByZXN0b3JlZCBvdXQtb2YtZGF0ZSB1bmlmb3JtCisgIC8vIGRhdGEuCisgIGNvbnN0IGJvb2wgZm9yY2VfdXBkYXRlID0gKHByb2dyYW1fb2JqZWN0XyAhPSBwcm9ncmFtLT5HZXRQcm9ncmFtT2JqZWN0KCkpOworICBjb25zdCBib29sIG12X2lzX2RpcnR5ID0gbW9kZWx2aWV3X21hdHJpeF9zdGFja18uSXNEaXJ0eSgpOworICBjb25zdCBib29sIHBfaXNfZGlydHkgPSBwcm9qZWN0aW9uX21hdHJpeF9zdGFja18uSXNEaXJ0eSgpOworICBpZiAoZm9yY2VfdXBkYXRlIHx8IG12X2lzX2RpcnR5KSB7CisgICAgY29uc3QgZW11Z2w6Ok1hdHJpeCYgbW9kZWxfdmlld19tYXRyaXggPQorICAgICAgICBtb2RlbHZpZXdfbWF0cml4X3N0YWNrXy5HZXQoKS5HZXRUb3AoKTsKKyAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5NDEpOiBVc2UgdGhlIGFkam9pbnQgb2YgdGhlIG1vZGVsIHZpZXcgbWF0cml4IGZvcgorICAgIC8vIGNvbXB1dGluZyBub3JtYWxzLgorICAgIGlmIChwcm9ncmFtLT5HZXRVbmlmb3JtTG9jYXRpb24oCisgICAgICAgIGtNb2RlbFZpZXdJbnZlcnNlVHJhbnNwb3NlTWF0cml4VW5pZm9ybSkgIT0gLTEpIHsKKyAgICAgIGVtdWdsOjpNYXRyaXggbXZfaW52ZXJzZV90cmFuc3Bvc2UgPSBtb2RlbF92aWV3X21hdHJpeDsKKyAgICAgIG12X2ludmVyc2VfdHJhbnNwb3NlLkludmVyc2UoKTsKKyAgICAgIG12X2ludmVyc2VfdHJhbnNwb3NlLlRyYW5zcG9zZSgpOworICAgICAgaWYgKGNvbnRleHRfLT5Jc0VuYWJsZWQoR0xfUkVTQ0FMRV9OT1JNQUwpKSB7CisgICAgICAgIG12X2ludmVyc2VfdHJhbnNwb3NlLlJlc2NhbGVOb3JtYWwoKTsKKyAgICAgIH0KKyAgICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKG12X2ludmVyc2VfdHJhbnNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga01vZGVsVmlld0ludmVyc2VUcmFuc3Bvc2VNYXRyaXhVbmlmb3JtKTsKKyAgICB9CisgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0obW9kZWxfdmlld19tYXRyaXgsIGtNb2RlbFZpZXdNYXRyaXhVbmlmb3JtKTsKKyAgICBtb2RlbHZpZXdfbWF0cml4X3N0YWNrXy5DbGVhbigpOworICB9CisKKyAgaWYgKGZvcmNlX3VwZGF0ZSB8fCBwX2lzX2RpcnR5KSB7CisgICAgY29uc3QgZW11Z2w6Ok1hdHJpeCYgcHJvamVjdGlvbl9tYXRyaXggPQorICAgICAgICBwcm9qZWN0aW9uX21hdHJpeF9zdGFja18uR2V0KCkuR2V0VG9wKCk7CisgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0ocHJvamVjdGlvbl9tYXRyaXgsIGtQcm9qZWN0aW9uTWF0cml4VW5pZm9ybSk7CisgICAgcHJvamVjdGlvbl9tYXRyaXhfc3RhY2tfLkNsZWFuKCk7CisgIH0KKworICBpZiAoZm9yY2VfdXBkYXRlIHx8IGFscGhhX3Rlc3RfLklzRGlydHkoKSkgeworICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKGFscGhhX3Rlc3RfLkdldCgpLnZhbHVlLCBrQWxwaGFUZXN0Q29uc3RhbnRVbmlmb3JtKTsKKyAgICBhbHBoYV90ZXN0Xy5DbGVhbigpOworICB9CisgIGlmIChmb3JjZV91cGRhdGUgfHwgYW1iaWVudF8uSXNEaXJ0eSgpKSB7CisgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0oYW1iaWVudF8uR2V0KCksIGtBbWJpZW50TGlnaHRVbmlmb3JtKTsKKyAgICBhbWJpZW50Xy5DbGVhbigpOworICB9CisgIGlmIChmb3JjZV91cGRhdGUgfHwgbWF0ZXJpYWxfLklzRGlydHkoKSkgeworICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKG1hdGVyaWFsXy5HZXQoKSk7CisgICAgbWF0ZXJpYWxfLkNsZWFuKCk7CisgIH0KKyAgaWYgKGZvcmNlX3VwZGF0ZSB8fCBmb2dfLklzRGlydHkoKSkgeworICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKGZvZ18uR2V0KCkpOworICAgIGZvZ18uQ2xlYW4oKTsKKyAgfQorICBpZiAoZm9yY2VfdXBkYXRlIHx8IHBvaW50X3BhcmFtZXRlcnNfLklzRGlydHkoKSkgeworICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKHBvaW50X3BhcmFtZXRlcnNfLkdldCgpKTsKKyAgICBwb2ludF9wYXJhbWV0ZXJzXy5DbGVhbigpOworICB9CisgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTk0Mik6IEJpbmQgbGlnaHQgdW5pZm9ybXMgYXMgb25lIGFycmF5IG9mIGRhdGEgcmF0aGVyCisgIC8vIHRoYW4gaW5kaXZpZHVhbGx5IHdpdGggYSBsb29wLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhMaWdodHM7ICsraSkgeworICAgIGlmIChmb3JjZV91cGRhdGUgfHwgbGlnaHRzX1tpXS5Jc0RpcnR5KCkpIHsKKyAgICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKGxpZ2h0c19baV0uR2V0KCksIGkpOworICAgICAgbGlnaHRzX1tpXS5DbGVhbigpOworICAgIH0KKyAgfQorICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5NDIpOiBCaW5kIGNsaXAgcGxhbmUgdW5pZm9ybXMgYXMgb25lIGFycmF5IG9mIGRhdGEKKyAgLy8gcmF0aGVyIHRoYW4gaW5kaXZpZHVhbGx5IHdpdGggYSBsb29wLgorICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhDbGlwUGxhbmVzOyArK2kpIHsKKyAgICBpZiAoZm9yY2VfdXBkYXRlIHx8IGNsaXBfcGxhbmVzX1tpXS5Jc0RpcnR5KCkpIHsKKyAgICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKGNsaXBfcGxhbmVzX1tpXS5HZXQoKSwga0NsaXBQbGFuZVVuaWZvcm0sIGkpOworICAgICAgY2xpcF9wbGFuZXNfW2ldLkNsZWFuKCk7CisgICAgfQorICB9CisgIC8vIFRPRE8oY3JidWcuY29tLzQ0MTk0Mik6IEJpbmQgdGV4dHVyZSB1bmlmb3JtcyBhcyBvbmUgYXJyYXkgb2YgZGF0YSByYXRoZXIKKyAgLy8gdGhhbiBpbmRpdmlkdWFsbHkgd2l0aCBhIGxvb3AuCisgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFRleHR1cmVVbml0czsgKytpKSB7CisgICAgLy8gQmluZCBzYW1wbGVyIE4gdG8gdGV4dHVyZSB1bml0IE4uCisgICAgY29uc3QgR0xpbnQgc2FtcGxlcl9pZCA9IGk7CisgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0oc2FtcGxlcl9pZCwga1RleHR1cmVTYW1wbGVyVW5pZm9ybSwgaSk7CisKKyAgICBpZiAoZm9yY2VfdXBkYXRlIHx8IHRleGVudl9baV0uSXNEaXJ0eSgpKSB7CisgICAgICBwcm9ncmFtLT5CaW5kVW5pZm9ybSh0ZXhlbnZfW2ldLkdldCgpLCBpKTsKKyAgICAgIHRleGVudl9baV0uQ2xlYW4oKTsKKyAgICB9CisgICAgaWYgKGZvcmNlX3VwZGF0ZSB8fCB0ZXh0dXJlX21hdHJpeF9zdGFja19baV0uSXNEaXJ0eSgpKSB7CisgICAgICBjb25zdCBlbXVnbDo6TWF0cml4JiB0ZXh0dXJlX21hdHJpeCA9CisgICAgICAgICAgdGV4dHVyZV9tYXRyaXhfc3RhY2tfW2ldLkdldCgpLkdldFRvcCgpOworICAgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0odGV4dHVyZV9tYXRyaXgsIGtUZXh0dXJlTWF0cml4VW5pZm9ybSwgaSk7CisgICAgICB0ZXh0dXJlX21hdHJpeF9zdGFja19baV0uQ2xlYW4oKTsKKyAgICB9CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhQYWxldHRlTWF0cmljZXNPRVM7ICsraSkgeworICAgIGlmIChmb3JjZV91cGRhdGUgfHwgcGFsZXR0ZV9tYXRyaWNlc19baV0uSXNEaXJ0eSgpKSB7CisgICAgICBlbXVnbDo6TWF0cml4IG1hdHJpeCA9IHBhbGV0dGVfbWF0cmljZXNfW2ldLkdldCgpOworICAgICAgcHJvZ3JhbS0+QmluZFVuaWZvcm0obWF0cml4LCBrUGFsZXR0ZU1hdHJpeFVuaWZvcm0sIGkpOworICAgICAgbWF0cml4LkludmVyc2UoKTsKKyAgICAgIG1hdHJpeC5UcmFuc3Bvc2UoKTsKKyAgICAgIHByb2dyYW0tPkJpbmRVbmlmb3JtKG1hdHJpeCwga1BhbGV0dGVJbnZlcnNlTWF0cml4VW5pZm9ybSwgaSk7CisgICAgICBwYWxldHRlX21hdHJpY2VzX1tpXS5DbGVhbigpOworICAgIH0KKyAgfQorCisgIHByb2dyYW1fb2JqZWN0XyAgPSBwcm9ncmFtLT5HZXRQcm9ncmFtT2JqZWN0KCk7Cit9CisKK3ZvaWQgVW5pZm9ybUNvbnRleHQ6OkVuYWJsZShHTGVudW0gY2FwKSB7CisgIGlmIChjYXAgPT0gR0xfVEVYVFVSRV9HRU5fU1RSX09FUykgeworICAgIE11dGF0ZUFjdGl2ZVRleEdlbigpLmVuYWJsZWQgPSBHTF9UUlVFOworICB9Cit9CisKK3ZvaWQgVW5pZm9ybUNvbnRleHQ6OkRpc2FibGUoR0xlbnVtIGNhcCkgeworICBpZiAoY2FwID09IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpIHsKKyAgICBNdXRhdGVBY3RpdmVUZXhHZW4oKS5lbmFibGVkID0gR0xfRkFMU0U7CisgIH0KK30KKworR0xib29sZWFuIFVuaWZvcm1Db250ZXh0OjpJc0VuYWJsZWQoR0xlbnVtIGNhcCkgY29uc3QgeworICBpZiAoY2FwID09IEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMpIHsKKyAgICByZXR1cm4gR2V0QWN0aXZlVGV4R2VuKCkuZW5hYmxlZDsKKyAgfQorICByZXR1cm4gR0xfRkFMU0U7Cit9CisKK2Jvb2wgVW5pZm9ybUNvbnRleHQ6OlNldE1hdHJpeE1vZGUoR0xlbnVtIG1vZGUpIHsKKyAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBHTF9QUk9KRUNUSU9OOgorICAgIGNhc2UgR0xfTUFUUklYX1BBTEVUVEVfT0VTOgorICAgIGNhc2UgR0xfTU9ERUxWSUVXOgorICAgIGNhc2UgR0xfVEVYVFVSRToKKyAgICAgIG1hdHJpeF9tb2RlXyA9IG1vZGU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgVW5pZm9ybUNvbnRleHQ6OlNldEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmVfdW5pdCkgeworICBjb25zdCBpbnQgc3RhZ2UgPSB0ZXh0dXJlX3VuaXQgLSBHTF9URVhUVVJFMDsKKyAgaWYgKHN0YWdlID49IDAgJiYgc3RhZ2UgPCBrTWF4VGV4dHVyZVVuaXRzKSB7CisgICAgYWN0aXZlX3RleHR1cmVfdW5pdF8gPSBzdGFnZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2NvbnN0IGVtdWdsOjpNYXRyaXgmIFVuaWZvcm1Db250ZXh0OjpHZXRNb2RlbFZpZXdNYXRyaXgoKSBjb25zdCB7CisgIHJldHVybiBtb2RlbHZpZXdfbWF0cml4X3N0YWNrXy5HZXQoKS5HZXRUb3AoKTsKK30KKworZW11Z2w6Ok1hdHJpeCYgVW5pZm9ybUNvbnRleHQ6Ok11dGF0ZU1vZGVsVmlld01hdHJpeCgpIHsKKyAgcmV0dXJuIG1vZGVsdmlld19tYXRyaXhfc3RhY2tfLk11dGF0ZSgpLkdldFRvcCgpOworfQorCitjb25zdCBlbXVnbDo6TWF0cml4JiBVbmlmb3JtQ29udGV4dDo6R2V0UHJvamVjdGlvbk1hdHJpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIHByb2plY3Rpb25fbWF0cml4X3N0YWNrXy5HZXQoKS5HZXRUb3AoKTsKK30KKworZW11Z2w6Ok1hdHJpeCYgVW5pZm9ybUNvbnRleHQ6Ok11dGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7CisgIHJldHVybiBwcm9qZWN0aW9uX21hdHJpeF9zdGFja18uTXV0YXRlKCkuR2V0VG9wKCk7Cit9CisKK2NvbnN0IGVtdWdsOjpNYXRyaXgmIFVuaWZvcm1Db250ZXh0OjpHZXRUZXh0dXJlTWF0cml4KCkgY29uc3QgeworICByZXR1cm4gdGV4dHVyZV9tYXRyaXhfc3RhY2tfW2FjdGl2ZV90ZXh0dXJlX3VuaXRfXS5HZXQoKS5HZXRUb3AoKTsKK30KKworY29uc3QgZW11Z2w6Ok1hdHJpeCYgVW5pZm9ybUNvbnRleHQ6OkdldFRleHR1cmVNYXRyaXhCeVN0YWdlKEdMaW50IHN0YWdlKSBjb25zdCB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhZ2UgPCAwIHx8IHN0YWdlID49IGtNYXhUZXh0dXJlVW5pdHMpOworICByZXR1cm4gdGV4dHVyZV9tYXRyaXhfc3RhY2tfW3N0YWdlXS5HZXQoKS5HZXRUb3AoKTsKK30KKworZW11Z2w6Ok1hdHJpeCYgVW5pZm9ybUNvbnRleHQ6Ok11dGF0ZVRleHR1cmVNYXRyaXhCeVN0YWdlKEdMaW50IHN0YWdlKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhZ2UgPCAwIHx8IHN0YWdlID49IGtNYXhUZXh0dXJlVW5pdHMpOworICByZXR1cm4gdGV4dHVyZV9tYXRyaXhfc3RhY2tfW3N0YWdlXS5NdXRhdGUoKS5HZXRUb3AoKTsKK30KKworYm9vbCBVbmlmb3JtQ29udGV4dDo6QWN0aXZlTWF0cml4UHVzaCgpIHsKKyAgaWYgKG1hdHJpeF9tb2RlXyA9PSBHTF9NQVRSSVhfUEFMRVRURV9PRVMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgRGlydGlhYmxlPE1hdHJpeFN0YWNrPiogc3RhY2sgPSBHZXRBY3RpdmVNYXRyaXhTdGFja0ludGVybmFsKCk7CisgIHJldHVybiBjb25zdF9jYXN0PERpcnRpYWJsZTxNYXRyaXhTdGFjaz4qPihzdGFjayktPk11dGF0ZSgpLlB1c2goKTsKK30KKworYm9vbCBVbmlmb3JtQ29udGV4dDo6QWN0aXZlTWF0cml4UG9wKCkgeworICBpZiAobWF0cml4X21vZGVfID09IEdMX01BVFJJWF9QQUxFVFRFX09FUykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBEaXJ0aWFibGU8TWF0cml4U3RhY2s+KiBzdGFjayA9IEdldEFjdGl2ZU1hdHJpeFN0YWNrSW50ZXJuYWwoKTsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGlydGlhYmxlPE1hdHJpeFN0YWNrPio+KHN0YWNrKS0+TXV0YXRlKCkuUG9wKCk7Cit9CisKK2VtdWdsOjpNYXRyaXgmIFVuaWZvcm1Db250ZXh0OjpNdXRhdGVBY3RpdmVNYXRyaXgoKSB7CisgIGlmIChtYXRyaXhfbW9kZV8gPT0gR0xfTUFUUklYX1BBTEVUVEVfT0VTKSB7CisgICAgcmV0dXJuIE11dGF0ZVBhbGV0dGVNYXRyaXgoKTsKKyAgfQorICBjb25zdCBEaXJ0aWFibGU8TWF0cml4U3RhY2s+KiBzdGFjayA9IEdldEFjdGl2ZU1hdHJpeFN0YWNrSW50ZXJuYWwoKTsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGlydGlhYmxlPE1hdHJpeFN0YWNrPio+KHN0YWNrKS0+TXV0YXRlKCkuR2V0VG9wKCk7Cit9CisKK2NvbnN0IGVtdWdsOjpNYXRyaXgmIFVuaWZvcm1Db250ZXh0OjpHZXRBY3RpdmVNYXRyaXgoKSBjb25zdCB7CisgIGlmIChtYXRyaXhfbW9kZV8gPT0gR0xfTUFUUklYX1BBTEVUVEVfT0VTKSB7CisgICAgcmV0dXJuIEdldFBhbGV0dGVNYXRyaXgoKTsKKyAgfQorICBjb25zdCBEaXJ0aWFibGU8TWF0cml4U3RhY2s+KiBzdGFjayA9IEdldEFjdGl2ZU1hdHJpeFN0YWNrSW50ZXJuYWwoKTsKKyAgcmV0dXJuIHN0YWNrLT5HZXQoKS5HZXRUb3AoKTsKK30KKworYm9vbCBVbmlmb3JtQ29udGV4dDo6U2V0Q3VycmVudFBhbGV0dGVNYXRyaXgoR0x1aW50IGluZGV4KSB7CisgIGlmIChpbmRleCA+PSBrTWF4UGFsZXR0ZU1hdHJpY2VzT0VTKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGN1cnJlbnRfcGFsZXR0ZV9tYXRyaXhfID0gaW5kZXg7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBlbXVnbDo6TWF0cml4JiBVbmlmb3JtQ29udGV4dDo6R2V0UGFsZXR0ZU1hdHJpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIHBhbGV0dGVfbWF0cmljZXNfW2N1cnJlbnRfcGFsZXR0ZV9tYXRyaXhfXS5HZXQoKTsKK30KKworZW11Z2w6Ok1hdHJpeCYgVW5pZm9ybUNvbnRleHQ6Ok11dGF0ZVBhbGV0dGVNYXRyaXgoKSB7CisgIHJldHVybiBwYWxldHRlX21hdHJpY2VzX1tjdXJyZW50X3BhbGV0dGVfbWF0cml4X10uTXV0YXRlKCk7Cit9CisKK1RleEVudiYgVW5pZm9ybUNvbnRleHQ6Ok11dGF0ZUFjdGl2ZVRleEVudigpIHsKKyAgcmV0dXJuIHRleGVudl9bYWN0aXZlX3RleHR1cmVfdW5pdF9dLk11dGF0ZSgpOworfQorCitjb25zdCBUZXhFbnYmIFVuaWZvcm1Db250ZXh0OjpHZXRBY3RpdmVUZXhFbnYoKSBjb25zdCB7CisgIHJldHVybiB0ZXhlbnZfW2FjdGl2ZV90ZXh0dXJlX3VuaXRfXS5HZXQoKTsKK30KKworVGV4R2VuJiBVbmlmb3JtQ29udGV4dDo6TXV0YXRlQWN0aXZlVGV4R2VuKCkgeworICByZXR1cm4gdGV4Z2VuX1thY3RpdmVfdGV4dHVyZV91bml0X10uTXV0YXRlKCk7Cit9CisKK2NvbnN0IFRleEdlbiYgVW5pZm9ybUNvbnRleHQ6OkdldEFjdGl2ZVRleEdlbigpIGNvbnN0IHsKKyAgcmV0dXJuIHRleGdlbl9bYWN0aXZlX3RleHR1cmVfdW5pdF9dLkdldCgpOworfQorCitlbXVnbDo6VmVjdG9yKiBVbmlmb3JtQ29udGV4dDo6TXV0YXRlQ2xpcFBsYW5lKEdMZW51bSBpZCkgeworICBjb25zdCBpbnQgaW5kZXggPSBpZCAtIEdMX0NMSVBfUExBTkUwOworICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtNYXhDbGlwUGxhbmVzKSB7CisgICAgcmV0dXJuICZjbGlwX3BsYW5lc19baW5kZXhdLk11dGF0ZSgpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBlbXVnbDo6VmVjdG9yKiBVbmlmb3JtQ29udGV4dDo6R2V0Q2xpcFBsYW5lKEdMZW51bSBpZCkgY29uc3QgeworICBjb25zdCBpbnQgaW5kZXggPSBpZCAtIEdMX0NMSVBfUExBTkUwOworICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtNYXhDbGlwUGxhbmVzKSB7CisgICAgcmV0dXJuICZjbGlwX3BsYW5lc19baW5kZXhdLkdldCgpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitUZXhFbnYqIFVuaWZvcm1Db250ZXh0OjpNdXRhdGVUZXhFbnYoR0xlbnVtIGlkKSB7CisgIGNvbnN0IGludCBzdGFnZSA9IGlkIC0gR0xfVEVYVFVSRTA7CisgIGlmIChzdGFnZSA+PSAwICYmIHN0YWdlIDwga01heFRleHR1cmVVbml0cykgeworICAgIHJldHVybiAmdGV4ZW52X1tzdGFnZV0uTXV0YXRlKCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IFRleEVudiogVW5pZm9ybUNvbnRleHQ6OkdldFRleEVudihHTGVudW0gaWQpIGNvbnN0IHsKKyAgY29uc3QgaW50IHN0YWdlID0gaWQgLSBHTF9URVhUVVJFMDsKKyAgaWYgKHN0YWdlID49IDAgJiYgc3RhZ2UgPCBrTWF4VGV4dHVyZVVuaXRzKSB7CisgICAgcmV0dXJuICZ0ZXhlbnZfW3N0YWdlXS5HZXQoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworVGV4R2VuKiBVbmlmb3JtQ29udGV4dDo6TXV0YXRlVGV4R2VuKEdMZW51bSBpZCkgeworICBjb25zdCBpbnQgc3RhZ2UgPSBpZCAtIEdMX1RFWFRVUkUwOworICBpZiAoc3RhZ2UgPj0gMCAmJiBzdGFnZSA8IGtNYXhUZXh0dXJlVW5pdHMpIHsKKyAgICByZXR1cm4gJnRleGdlbl9bc3RhZ2VdLk11dGF0ZSgpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBUZXhHZW4qIFVuaWZvcm1Db250ZXh0OjpHZXRUZXhHZW4oR0xlbnVtIGlkKSBjb25zdCB7CisgIGNvbnN0IGludCBzdGFnZSA9IGlkIC0gR0xfVEVYVFVSRTA7CisgIGlmIChzdGFnZSA+PSAwICYmIHN0YWdlIDwga01heFRleHR1cmVVbml0cykgeworICAgIHJldHVybiAmdGV4Z2VuX1tzdGFnZV0uR2V0KCk7CisgIH0KKyAgcmV0dXJuIE5VTEw7Cit9CisKK0xpZ2h0KiBVbmlmb3JtQ29udGV4dDo6TXV0YXRlTGlnaHQoR0xlbnVtIGlkKSB7CisgIGNvbnN0IGludCBpbmRleCA9IGlkIC0gR0xfTElHSFQwOworICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGtNYXhMaWdodHMpIHsKKyAgICByZXR1cm4gJmxpZ2h0c19baW5kZXhdLk11dGF0ZSgpOworICB9CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBMaWdodCogVW5pZm9ybUNvbnRleHQ6OkdldExpZ2h0KEdMZW51bSBpZCkgY29uc3QgeworICBjb25zdCBpbnQgaW5kZXggPSBpZCAtIEdMX0xJR0hUMDsKKyAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBrTWF4TGlnaHRzKSB7CisgICAgcmV0dXJuICZsaWdodHNfW2luZGV4XS5HZXQoKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworY29uc3QgRGlydGlhYmxlPE1hdHJpeFN0YWNrPioKK1VuaWZvcm1Db250ZXh0OjpHZXRBY3RpdmVNYXRyaXhTdGFja0ludGVybmFsKCkgY29uc3QgeworICBzd2l0Y2ggKG1hdHJpeF9tb2RlXykgeworICAgIGNhc2UgR0xfUFJPSkVDVElPTjoKKyAgICAgIHJldHVybiAmcHJvamVjdGlvbl9tYXRyaXhfc3RhY2tfOworICAgIGNhc2UgR0xfTU9ERUxWSUVXOgorICAgICAgcmV0dXJuICZtb2RlbHZpZXdfbWF0cml4X3N0YWNrXzsKKyAgICBjYXNlIEdMX1RFWFRVUkU6CisgICAgICByZXR1cm4gJnRleHR1cmVfbWF0cml4X3N0YWNrX1thY3RpdmVfdGV4dHVyZV91bml0X107CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK1Byb2dyYW1Db250ZXh0OjpQcm9ncmFtQ29udGV4dChHbGVzQ29udGV4dCogY29udGV4dCwgR0x1aW50IHByb2dyYW0pCisgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgcHJvZ3JhbV9vYmplY3RfKHByb2dyYW0pIHsKKyAgICAgICAgRExPRygiQ3JlYXRlZCBwcm9ncmFtIGNvbnRleHQgZm9yIEdMRVMxIGNvbnRleHQgQCAlcCIsIGNvbnRleHRfKTsKKyAgICB9CisKK3ZvaWQgUHJvZ3JhbUNvbnRleHQ6OkJpbmQoKSB7CisgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVXNlUHJvZ3JhbSwgcHJvZ3JhbV9vYmplY3RfKTsKK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6RGVsZXRlKCkgeworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIERlbGV0ZVByb2dyYW0sIHByb2dyYW1fb2JqZWN0Xyk7Cit9CisKK0dMaW50IFByb2dyYW1Db250ZXh0OjpHZXRVbmlmb3JtTG9jYXRpb24oVW5pZm9ybUtleSBrZXkpIHsKKyAgcmV0dXJuIEdldFVuaWZvcm1Mb2NhdGlvbihrZXksIGtTY2FsYXJVbmlmb3JtKTsKK30KKworR0xpbnQgUHJvZ3JhbUNvbnRleHQ6OkdldFVuaWZvcm1Mb2NhdGlvbihVbmlmb3JtS2V5IGtleSwgaW50IGlkeCkgeworICBjb25zdCBzdGQ6OnBhaXI8VW5pZm9ybUtleSwgaW50PiBlbnRyeSA9IHN0ZDo6bWFrZV9wYWlyKGtleSwgaWR4KTsKKyAgVW5pZm9ybUxvY2F0aW9uTWFwOjppdGVyYXRvciBpdGVyID0gdW5pZm9ybV9sb2NhdGlvbl9tYXBfLmZpbmQoZW50cnkpOworICBpZiAoaXRlciAhPSB1bmlmb3JtX2xvY2F0aW9uX21hcF8uZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4QnVmZmVyTGVuZ3RoID0gMjU2OworICBjaGFyIGJ1ZmZlcltrTWF4QnVmZmVyTGVuZ3RoXTsKKworICBjb25zdCBjaGFyKiBuYW1lID0ga1VuaWZvcm1OYW1lc1trZXldOworICBpZiAoc3Ryc3RyKG5hbWUsICIlZCIpKSB7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpZHggPCAwLCAiJXMgaXMgYW4gYXJyYXkiLCBuYW1lKTsKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBuYW1lLCBpZHgpOworICB9IGVsc2UgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaWR4ID49IDAsICIlcyBpcyBub3QgYW4gYXJyYXkiLCBuYW1lKTsKKyAgICBzdHJuY3B5KGJ1ZmZlciwgbmFtZSwgc2l6ZW9mKGJ1ZmZlcikpOworICB9CisgIGJ1ZmZlcltrTWF4QnVmZmVyTGVuZ3RoIC0gMV0gPSAwOworCisgIGNvbnN0IEdMaW50IGxvY2F0aW9uID0KKyAgICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgR2V0VW5pZm9ybUxvY2F0aW9uLCBwcm9ncmFtX29iamVjdF8sIGJ1ZmZlcik7CisgIHVuaWZvcm1fbG9jYXRpb25fbWFwX1tlbnRyeV0gPSBsb2NhdGlvbjsKKyAgcmV0dXJuIGxvY2F0aW9uOworfQorCit2b2lkIFByb2dyYW1Db250ZXh0OjpCaW5kVW5pZm9ybShjb25zdCBpbnQmIHZhbHVlLCBVbmlmb3JtS2V5IGtleSkgeworICBCaW5kVW5pZm9ybSh2YWx1ZSwga2V5LCBrU2NhbGFyVW5pZm9ybSk7Cit9CisKK3ZvaWQgUHJvZ3JhbUNvbnRleHQ6OkJpbmRVbmlmb3JtKGNvbnN0IGludCYgdmFsdWUsIFVuaWZvcm1LZXkga2V5LCBpbnQgaW5kZXgpIHsKKyAgY29uc3QgR0xpbnQgbG9jYXRpb24gPSBHZXRVbmlmb3JtTG9jYXRpb24oa2V5LCBpbmRleCk7CisgIGlmIChsb2NhdGlvbiAhPSAtMSkgeworICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVW5pZm9ybTFpLCBsb2NhdGlvbiwgdmFsdWUpOworICB9Cit9CisKK3ZvaWQgUHJvZ3JhbUNvbnRleHQ6OkJpbmRVbmlmb3JtKGNvbnN0IGZsb2F0JiB2YWx1ZSwgVW5pZm9ybUtleSBrZXkpIHsKKyAgQmluZFVuaWZvcm0odmFsdWUsIGtleSwga1NjYWxhclVuaWZvcm0pOworfQorCit2b2lkIFByb2dyYW1Db250ZXh0OjpCaW5kVW5pZm9ybShjb25zdCBmbG9hdCYgdmFsdWUsIFVuaWZvcm1LZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIGNvbnN0IEdMaW50IGxvY2F0aW9uID0gR2V0VW5pZm9ybUxvY2F0aW9uKGtleSwgaW5kZXgpOworICBpZiAobG9jYXRpb24gIT0gLTEpIHsKKyAgICBQQVNTX1RIUk9VR0goY29udGV4dF8sIFVuaWZvcm0xZiwgbG9jYXRpb24sIHZhbHVlKTsKKyAgfQorfQorCit2b2lkIFByb2dyYW1Db250ZXh0OjpCaW5kVW5pZm9ybShjb25zdCBHTGZsb2F0ICgmdmFsdWVzKVszXSwgVW5pZm9ybUtleSBrZXkpIHsKKyAgY29uc3QgaW50IGxvY2F0aW9uID0gR2V0VW5pZm9ybUxvY2F0aW9uKGtleSk7CisgIGlmIChsb2NhdGlvbiAhPSAtMSkgeworICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVW5pZm9ybTNmdiwgbG9jYXRpb24sIDEsIHZhbHVlcyk7CisgIH0KK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgZW11Z2w6OlZlY3RvciYgdmVjdG9yLCBVbmlmb3JtS2V5IGtleSkgeworICBCaW5kVW5pZm9ybSh2ZWN0b3IsIGtleSwga1NjYWxhclVuaWZvcm0pOworfQorCit2b2lkIFByb2dyYW1Db250ZXh0OjpCaW5kVW5pZm9ybShjb25zdCBlbXVnbDo6VmVjdG9yJiB2ZWN0b3IsIFVuaWZvcm1LZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIGNvbnN0IEdMaW50IGxvY2F0aW9uID0gR2V0VW5pZm9ybUxvY2F0aW9uKGtleSwgaW5kZXgpOworICBpZiAobG9jYXRpb24gIT0gLTEpIHsKKyAgICBHTGZsb2F0IGZsb2F0X2FycmF5W2VtdWdsOjpWZWN0b3I6OmtFbnRyaWVzXTsKKyAgICB2ZWN0b3IuR2V0RmxvYXRBcnJheShmbG9hdF9hcnJheSk7CisgICAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBVbmlmb3JtNGZ2LCBsb2NhdGlvbiwgMSwgZmxvYXRfYXJyYXkpOworICB9Cit9CisKK3ZvaWQgUHJvZ3JhbUNvbnRleHQ6OkJpbmRVbmlmb3JtKGNvbnN0IGVtdWdsOjpNYXRyaXgmIG1hdHJpeCwgVW5pZm9ybUtleSBrZXkpIHsKKyAgQmluZFVuaWZvcm0obWF0cml4LCBrZXksIGtTY2FsYXJVbmlmb3JtKTsKK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgZW11Z2w6Ok1hdHJpeCYgbWF0cml4LCBVbmlmb3JtS2V5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBjb25zdCBHTGludCBsb2NhdGlvbiA9IEdldFVuaWZvcm1Mb2NhdGlvbihrZXksIGluZGV4KTsKKyAgaWYgKGxvY2F0aW9uICE9IC0xKSB7CisgICAgR0xmbG9hdCBmbG9hdF9hcnJheVtlbXVnbDo6TWF0cml4OjprRW50cmllc107CisgICAgbWF0cml4LkdldENvbHVtbk1ham9yQXJyYXkoZmxvYXRfYXJyYXkpOworICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVW5pZm9ybU1hdHJpeDRmdiwgbG9jYXRpb24sIDEsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICBmbG9hdF9hcnJheSk7CisgIH0KK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgRm9nJiBmb2cpIHsKKyAgQmluZFVuaWZvcm0oZm9nLmRlbnNpdHksIGtGb2dEZW5zaXR5VW5pZm9ybSk7CisgIEJpbmRVbmlmb3JtKGZvZy5zdGFydCwga0ZvZ1N0YXJ0VW5pZm9ybSk7CisgIEJpbmRVbmlmb3JtKGZvZy5lbmQsIGtGb2dFbmRVbmlmb3JtKTsKKyAgQmluZFVuaWZvcm0oZm9nLmNvbG9yLCBrRm9nQ29sb3JVbmlmb3JtKTsKK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgTGlnaHQmIGxpZ2h0LCBpbnQgaW5kZXgpIHsKKyAgY29uc3QgZmxvYXQgbGlnaHRfc3BvdF9jdXRvZmYgPQorICAgICAgY29zKGxpZ2h0LnNwb3RfY3V0b2ZmICogZW11Z2w6OmtSYWRpYW5zUGVyRGVncmVlKTsKKyAgZW11Z2w6OlZlY3RvciBsaWdodF9wb3NpdGlvbiA9IGxpZ2h0LnBvc2l0aW9uOworICBpZiAobGlnaHRfcG9zaXRpb24uR2V0KDMpID09IDAuZikgeworICAgIGxpZ2h0X3Bvc2l0aW9uLk5vcm1hbGl6ZSgpOworICB9CisgIGVtdWdsOjpWZWN0b3IgbGlnaHRfZGlyZWN0aW9uID0gbGlnaHQuZGlyZWN0aW9uOworICBsaWdodF9kaXJlY3Rpb24uTm9ybWFsaXplKCk7CisgIGxpZ2h0X2RpcmVjdGlvbi5TY2FsZSgtMS5mKTsKKworICBCaW5kVW5pZm9ybShsaWdodC5hbWJpZW50LCBrTGlnaHRBbWJpZW50VW5pZm9ybSwgaW5kZXgpOworICBCaW5kVW5pZm9ybShsaWdodC5kaWZmdXNlLCBrTGlnaHREaWZmdXNlVW5pZm9ybSwgaW5kZXgpOworICBCaW5kVW5pZm9ybShsaWdodC5zcGVjdWxhciwga0xpZ2h0U3BlY3VsYXJVbmlmb3JtLCBpbmRleCk7CisgIEJpbmRVbmlmb3JtKGxpZ2h0X3Bvc2l0aW9uLCBrTGlnaHRQb3NpdGlvblVuaWZvcm0sIGluZGV4KTsKKyAgQmluZFVuaWZvcm0obGlnaHRfZGlyZWN0aW9uLCBrTGlnaHREaXJlY3Rpb25Vbmlmb3JtLCBpbmRleCk7CisgIEJpbmRVbmlmb3JtKGxpZ2h0LnNwb3RfZXhwb25lbnQsIGtMaWdodFNwb3RFeHBvbmVudFVuaWZvcm0sIGluZGV4KTsKKyAgQmluZFVuaWZvcm0obGlnaHRfc3BvdF9jdXRvZmYsIGtMaWdodFNwb3RDdXRvZmZVbmlmb3JtLCBpbmRleCk7CisgIEJpbmRVbmlmb3JtKGxpZ2h0LmNvbnN0X2F0dGVudWF0aW9uLCBrTGlnaHRDb25zdEF0dGVudWF0aW9uVW5pZm9ybSwgaW5kZXgpOworICBCaW5kVW5pZm9ybShsaWdodC5saW5lYXJfYXR0ZW51YXRpb24sIGtMaWdodExpbmVhckF0dGVudWF0aW9uVW5pZm9ybSwgaW5kZXgpOworICBCaW5kVW5pZm9ybShsaWdodC5xdWFkcmF0aWNfYXR0ZW51YXRpb24sIGtMaWdodFF1YWRyYXRpY0F0dGVudWF0aW9uVW5pZm9ybSwKKyAgICAgICAgICAgICAgaW5kZXgpOworfQorCit2b2lkIFByb2dyYW1Db250ZXh0OjpCaW5kVW5pZm9ybShjb25zdCBNYXRlcmlhbCYgbWF0ZXJpYWwpIHsKKyAgQmluZFVuaWZvcm0obWF0ZXJpYWwuYW1iaWVudCwga01hdGVyaWFsQW1iaWVudFVuaWZvcm0pOworICBCaW5kVW5pZm9ybShtYXRlcmlhbC5kaWZmdXNlLCBrTWF0ZXJpYWxEaWZmdXNlVW5pZm9ybSk7CisgIEJpbmRVbmlmb3JtKG1hdGVyaWFsLnNwZWN1bGFyLCBrTWF0ZXJpYWxTcGVjdWxhclVuaWZvcm0pOworICBCaW5kVW5pZm9ybShtYXRlcmlhbC5lbWlzc2lvbiwga01hdGVyaWFsRW1pc3Npb25Vbmlmb3JtKTsKKyAgQmluZFVuaWZvcm0obWF0ZXJpYWwuc2hpbmluZXNzLCBrTWF0ZXJpYWxTaGluaW5lc3NVbmlmb3JtKTsKK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgUG9pbnRQYXJhbWV0ZXJzJiBwb2ludF9wYXJhbWV0ZXJzKSB7CisgIEJpbmRVbmlmb3JtKHBvaW50X3BhcmFtZXRlcnMuc2l6ZV9taW4sIGtQb2ludFNpemVNaW5Vbmlmb3JtKTsKKyAgQmluZFVuaWZvcm0ocG9pbnRfcGFyYW1ldGVycy5zaXplX21heCwga1BvaW50U2l6ZU1heFVuaWZvcm0pOworICBCaW5kVW5pZm9ybShwb2ludF9wYXJhbWV0ZXJzLmF0dGVudWF0aW9uLCBrUG9pbnRTaXplQXR0ZW51YXRpb25Vbmlmb3JtKTsKK30KKwordm9pZCBQcm9ncmFtQ29udGV4dDo6QmluZFVuaWZvcm0oY29uc3QgVGV4RW52JiB0ZXhlbnYsIGludCBpbmRleCkgeworICAvLyBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uIDMuNy4xMworICAvLyBMb2FkIHVwIHRoZSB2YXJpb3VzIGNvbnN0YW50cyB1c2VkIGJ5IHRoZSB0ZXh0dXJlIGVudmlyb25tZW50IGZvciBlYWNoCisgIC8vIHN1cHBvcnRlZCBzdGFnZS4KKyAgLy8gRWFjaCBzdGFnZSBoYXM6CisgIC8vICAgKiBBbiBjb25zdGFudCBjb2xvciAoUkdCQSksIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgc291cmNlLgorICAvLyAgICogQSBjb2xvci9hbHBoYSBzY2FsZS4gRm9yIHNpbXBsaWNpdHkgd2UgZ2VuZXJhdGUgYSBmb3VyIGNvbXBvbmVudCBzY2FsZQorICAvLyAgICAgaGVyZSwgdGhvdWdoIHdlIG9ubHkgcmVhbGx5IG5lZWQgdHdvIGNvbXBvbmVudHMuCisgIEJpbmRVbmlmb3JtKHRleGVudi5jb2xvciwga1RleHR1cmVFbnZDb2xvclVuaWZvcm0sIGluZGV4KTsKKyAgY29uc3QgZW11Z2w6OlZlY3RvciBzY2FsZSA9IGVtdWdsOjpWZWN0b3IodGV4ZW52LnJnYl9zY2FsZSwgdGV4ZW52LnJnYl9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleGVudi5yZ2Jfc2NhbGUsIHRleGVudi5hbHBoYV9zY2FsZSk7CisgIEJpbmRVbmlmb3JtKHNjYWxlLCBrVGV4dHVyZUVudlNjYWxlVW5pZm9ybSwgaW5kZXgpOworfQorCitjb25zdCBHTGVudW0gVGV4dHVyZUNvbnRleHQ6OnN1cHBvcnRlZF90ZXh0dXJlX3RhcmdldHNfW2tOdW1UYXJnZXRzXSA9IHsKKyAgICBHTF9URVhUVVJFXzJELAorICAgIEdMX1RFWFRVUkVfQ1VCRV9NQVAsCisgICAgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsCit9OworCitUZXh0dXJlQ29udGV4dDo6VGV4dHVyZUNvbnRleHQoR2xlc0NvbnRleHQqIGNvbnRleHQpCisgIDogY29udGV4dF8oY29udGV4dCksCisgICAgbWF4X3RleHR1cmVfbGV2ZWxzXygwKSwKKyAgICBudW1fdGV4dHVyZV91bml0c18oMCksCisgICAgYWN0aXZlX3RleHR1cmVfdW5pdF8oMCksCisgICAgY2xpZW50X2FjdGl2ZV90ZXh0dXJlX3VuaXRfKDApIHsKKyAgICAgICAgRExPRygiQ3JlYXRlZCB0ZXh0dXJlIGNvbnRleHQgZm9yIEdMRVMxIGNvbnRleHQgQCAlcCIsIGNvbnRleHRfKTsKK30KKworVGV4dHVyZUNvbnRleHQ6On5UZXh0dXJlQ29udGV4dCgpIHsKK30KKwordm9pZCBUZXh0dXJlQ29udGV4dDo6SW5pdChpbnQgbWF4X3RleHR1cmVfdW5pdHMsIGludCBtYXhfdGV4dHVyZV9zaXplKSB7CisgICAgICAgIERMT0coIkluaXRpYWxpemVkIHRleHR1cmUgY29udGV4dCBmb3IgR0xFUzEgY29udGV4dCBAICVwIiwgY29udGV4dF8pOworICBBTE9HX0FTU0VSVChtYXhfdGV4dHVyZV9zaXplID4gMCk7CisgIEFMT0dfQVNTRVJUKChtYXhfdGV4dHVyZV9zaXplICYgKG1heF90ZXh0dXJlX3NpemUgLSAxKSkgPT0gMCk7CisgIG51bV90ZXh0dXJlX3VuaXRzXyA9IG1heF90ZXh0dXJlX3VuaXRzOworICBtYXhfdGV4dHVyZV9sZXZlbHNfID0gTG9nMkZsb29yKG1heF90ZXh0dXJlX3NpemUpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVRhcmdldHM7ICsraSkgeworICAgIGNvbnN0IEdMZW51bSB0YXJnZXQgPSBzdXBwb3J0ZWRfdGV4dHVyZV90YXJnZXRzX1tpXTsKKyAgICB0ZXh0dXJlX3VuaXRzX1tpXS5yZXNpemUobnVtX3RleHR1cmVfdW5pdHNfKTsKKyAgICBmb3IgKEdMdWludCBqID0gMDsgaiA8IG51bV90ZXh0dXJlX3VuaXRzXzsgKytqKSB7CisgICAgICB0ZXh0dXJlX3VuaXRzX1tpXVtqXS5nbG9iYWxfdGFyZ2V0ID0gdGFyZ2V0OworICAgIH0KKworICAgIFRleHR1cmVEYXRhUHRyIGRhdGEobmV3IFRleHR1cmVEYXRhKDApKTsKKyAgICBkYXRhLT5CaW5kKHRhcmdldCwgbWF4X3RleHR1cmVfbGV2ZWxzXyk7CisgICAgZGVmYXVsdF90ZXh0dXJlc18ucHVzaF9iYWNrKGRhdGEpOworICB9Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnRleHQ6OkRlbGV0ZVRleHR1cmUoR0x1aW50IHRleHR1cmUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGFyZ2V0czsgKytpKSB7CisgICAgZm9yIChHTHVpbnQgaiA9IDA7IGogPCBudW1fdGV4dHVyZV91bml0c187ICsraikgeworICAgICAgVGV4dHVyZVVuaXQmIHVuaXQgPSB0ZXh0dXJlX3VuaXRzX1tpXVtqXTsKKyAgICAgIGlmICh1bml0LnRleHR1cmUgPT0gdGV4dHVyZSkgeworICAgICAgICB1bml0LnRleHR1cmUgPSAwOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitib29sIFRleHR1cmVDb250ZXh0OjpTZXRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlX3VuaXQpIHsKKyAgY29uc3QgR0x1aW50IHN0YWdlID0gdGV4dHVyZV91bml0IC0gR0xfVEVYVFVSRTA7CisgIGlmIChzdGFnZSA8IG51bV90ZXh0dXJlX3VuaXRzXykgeworICAgIGFjdGl2ZV90ZXh0dXJlX3VuaXRfID0gc3RhZ2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitUZXh0dXJlRGF0YVB0ciBUZXh0dXJlQ29udGV4dDo6R2V0RGVmYXVsdFRleHR1cmVEYXRhKEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgVGFyZ2V0IHQgPSBNYXBUYXJnZXQodGFyZ2V0KTsKKyAgcmV0dXJuIGRlZmF1bHRfdGV4dHVyZXNfW3RdOworfQorCitib29sIFRleHR1cmVDb250ZXh0OjpCaW5kVGV4dHVyZVRvVGFyZ2V0KGNvbnN0IFRleHR1cmVEYXRhUHRyJiB0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgR0xlbnVtIHRleF90YXJnZXQgPSB0ZXgtPkdldFRhcmdldCgpOworICBpZiAodGV4X3RhcmdldCAhPSAwKSB7CisgICAgaWYgKE1hcFRhcmdldCh0ZXhfdGFyZ2V0KSAhPSBNYXBUYXJnZXQodGFyZ2V0KSkgeworICAgICAgQUxPR1coIkNhbm5vdCBjaGFuZ2UgdGV4dHVyZSB0YXJnZXQgb25jZSBib3VuZC4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGV4LT5CaW5kKHRhcmdldCwgbWF4X3RleHR1cmVfbGV2ZWxzXyk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnRleHQ6OlNldFRhcmdldFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBnbG9iYWxfdGFyZ2V0KSB7CisgIC8vIFRoZSBsb2dpYyBiZWxvdyBpbiBQcmVwYXJlVGV4dHVyZXMvUmVzdG9yZVRleHR1cmVzIGFzc3VtZXMgdGhhdCB3ZSBhcmUgb25seQorICAvLyBldmVyIHJlbWFwcGluZyBURVhUVVJFX0VYVEVSTkFMX09FUyB0byBURVhUVVJFXzJELgorICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhcmdldCAhPSBnbG9iYWxfdGFyZ2V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgKGdsb2JhbF90YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCB8fAorICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgIT0gR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpLAorICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBtYXBwaW5nIG9mIHRhcmdldCglZCkgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsX3RhcmdldCglZCkiLCB0YXJnZXQsIGdsb2JhbF90YXJnZXQpOworCisgIGNvbnN0IFRhcmdldCB0ID0gTWFwVGFyZ2V0KHRhcmdldCk7CisgIFRleHR1cmVVbml0JiB1bml0ID0gR2V0VGV4dHVyZVVuaXQodCwgYWN0aXZlX3RleHR1cmVfdW5pdF8pOworICB1bml0LnRleHR1cmUgPSB0ZXh0dXJlOworICB1bml0Lmdsb2JhbF90YXJnZXQgPSBnbG9iYWxfdGFyZ2V0OworfQorCitHTGVudW0gVGV4dHVyZUNvbnRleHQ6OkVuc3VyZUNvcnJlY3RCaW5kaW5nKEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgVGV4dHVyZVVuaXQmIHVuaXQgPSBHZXRUZXh0dXJlVW5pdChNYXBUYXJnZXQodGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfdGV4dHVyZV91bml0Xyk7CisgIC8vIFdlIG9ubHkgbmVlZCB0byByZWJpbmQgaWYgdGhlcmUgaXMgYSByZW1hcHBpbmcgaW4gZWZmZWN0LgorICBpZiAodGFyZ2V0ICE9IHVuaXQuZ2xvYmFsX3RhcmdldCkgeworICAgIEJpbmRVbmRlcmx5aW5nKHVuaXQpOworICB9CisgIHJldHVybiB1bml0Lmdsb2JhbF90YXJnZXQ7Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnRleHQ6OlJlc3RvcmVCaW5kaW5nKEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgVGV4dHVyZVVuaXQmIHVuaXQgPSBHZXRUZXh0dXJlVW5pdChNYXBUYXJnZXQodGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVfdGV4dHVyZV91bml0Xyk7CisgIC8vIFdlIG9ubHkgbmVlZCB0byByZXN0b3JlIGlmIHRoZXJlIGlzIGEgcmVtYXBwaW5nIGluIGVmZmVjdC4KKyAgaWYgKHVuaXQuZ2xvYmFsX3RhcmdldCAhPSB0YXJnZXQpIHsKKyAgICBjb25zdCBUZXh0dXJlVW5pdCYgb3JpZyA9IEdldFRleHR1cmVVbml0KE1hcFRhcmdldCh1bml0Lmdsb2JhbF90YXJnZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlX3RleHR1cmVfdW5pdF8pOworICAgIC8vIFdlIG9ubHkgcmViaW5kIGlmIHRoYXQgdGV4dHVyZSBpcyBleHBlY3RlZCBhdCB0aGF0IGxvY2FsIHRhcmdldAorICAgIGlmIChvcmlnLmdsb2JhbF90YXJnZXQgPT0gdGFyZ2V0KSB7CisgICAgICBCaW5kVW5kZXJseWluZyhvcmlnKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBUZXh0dXJlQ29udGV4dDo6UHJlcGFyZVRleHR1cmVzKGJvb2wgZ2xlczExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hhZGVyX3VzZXNfZXh0ZXJuYWxfYXNfMmQpIHsKKyAgR0x1aW50IGN1cnJlbnRfYWN0aXZlX3RleHR1cmVfdW5pdCA9IGFjdGl2ZV90ZXh0dXJlX3VuaXRfOworICBmb3IgKEdMdWludCBpID0gMDsgaSA8IG51bV90ZXh0dXJlX3VuaXRzXzsgKytpKSB7CisgICAgY29uc3QgVGV4dHVyZVVuaXQmIHVuaXRfZXh0ID0gR2V0VGV4dHVyZVVuaXQoa1RleHR1cmVFeHRlcm5hbCwgaSk7CisKKyAgICAvLyBXZSBvbmx5IG5lZWQgdG8gZG8gd29ycnkgYWJvdXQgcmViaW5kaW5nIHRleHR1cmVzIGlmIHdlIGhhdmUgYQorICAgIC8vIGV4dGVybmFsIHRleHR1cmUgdGhhdCBpcyBhY3R1YWxseSBzdXBwb3NlZCB0byBiZSBhIFRFWFRVUkVfMkQuCisgICAgaWYgKHVuaXRfZXh0Lmdsb2JhbF90YXJnZXQgPT0gR0xfVEVYVFVSRV8yRCkgeworICAgICAgLy8gRm9yIHRoZSBHTEVTMSBjb2RlIHBhdGgsIHdlIGtub3cgaWYgdGhlIHRleHR1cmUgdGFyZ2V0IHdhcyBlbmFibGVkIG9yCisgICAgICAvLyBub3QuIElmIGl0IGlzIGVuYWJsZWQsIHRoZSBleHRlcm5hbCB0ZXh0dXJlIG92ZXJyaWRlcyBhbnkgbm9ybWFsCisgICAgICAvLyB0ZXh0dXJlIDJkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIC8vIEZvciB0aGUgR0xFUzIrIGNvZGUgcGF0aCwgdGhpbmdzIGFyZSBtdWNoIG1vcmUgaW50ZXJlc3RpbmcsIGFuZAorICAgICAgLy8gd2UgbmVlZCB0byBrbm93IHdoYXQgdW5pZm9ybSB0eXBlIHRoZSBzaGFkZXIgdXNlcyBmb3IgZWFjaCB0ZXh0dXJlCisgICAgICAvLyB1bml0LCBhcyB2YWxpZCB0ZXh0dXJlcyBjYW4gYmUgYm91bmQgdG8gZWFjaCB0YXJnZXQgYW5kIHRoZSBzaGFkZXIKKyAgICAgIC8vIGRlZmluZXMgd2hpY2ggb25lIGlzIHJlYWQuCisgICAgICAvLyBUT0RPKGNyYnVnLmNvbS80NDE5NDApOiBUaGlzIHJlYWxseSBuZWVkcyB0byBiZSByZXZpc2l0ZWQgdG8gbm90CisgICAgICAvLyBhc3N1bWUgdGhhdCBvbmx5IHRoZSBmaXJzdCB0ZXh0dXJlIHVuaXQgaXMgdGhlIG9uZSB0aGF0IG5lZWRzIHRvIGJlCisgICAgICAvLyByZW1hcHBlZC4KKyAgICAgIGJvb2wgYmluZF9leHRfYXNfMmQgPSAoKGdsZXMxMSAmJiB1bml0X2V4dC5lbmFibGVkKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9PSAwICYmIHNoYWRlcl91c2VzX2V4dGVybmFsX2FzXzJkKSk7CisKKyAgICAgIEFjdGl2ZVRleHR1cmVVbmRlcmx5aW5nKGkpOworICAgICAgY3VycmVudF9hY3RpdmVfdGV4dHVyZV91bml0ID0gaTsKKyAgICAgIGNvbnN0IFRleHR1cmVVbml0JiB1bml0XzJkID0gR2V0VGV4dHVyZVVuaXQoa1RleHR1cmUyZCwgaSk7CisgICAgICAvLyBJZiB0aGUgYXBwIHdhcyB1c2luZyB0aGUgdW5pdCBhc3NvY2lhdGVkIHdpdGggZXh0ZXJuYWwgdGV4dHVyZXMKKyAgICAgIC8vIGJpbmQgdGhhdCB1bml0J3MgZGF0YSwgb3RoZXJ3aXNlIHRoZSBhcHAgd2FzIHVzaW5nIDJELXJlbGF0ZWQgdW5pdC4KKyAgICAgIEJpbmRVbmRlcmx5aW5nKGJpbmRfZXh0X2FzXzJkID8gdW5pdF9leHQgOiB1bml0XzJkKTsKKyAgICB9CisgIH0KKyAgaWYgKGN1cnJlbnRfYWN0aXZlX3RleHR1cmVfdW5pdCAhPSBhY3RpdmVfdGV4dHVyZV91bml0XykgeworICAgIEFjdGl2ZVRleHR1cmVVbmRlcmx5aW5nKGFjdGl2ZV90ZXh0dXJlX3VuaXRfKTsKKyAgfQorfQorCit2b2lkIFRleHR1cmVDb250ZXh0OjpSZXN0b3JlVGV4dHVyZXMoKSB7CisgIEdMdWludCBjdXJyZW50X2FjdGl2ZV90ZXh0dXJlX3VuaXQgPSBhY3RpdmVfdGV4dHVyZV91bml0XzsKKyAgZm9yIChHTHVpbnQgaSA9IDA7IGkgPCBudW1fdGV4dHVyZV91bml0c187ICsraSkgeworICAgIGNvbnN0IFRleHR1cmVVbml0JiB1bml0X2V4dCA9IEdldFRleHR1cmVVbml0KGtUZXh0dXJlRXh0ZXJuYWwsIGkpOworICAgIC8vIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWwgdGV4dHVyZSB0aGF0IG1hcHMgdG8gVEVYVFVSRV8yRCB3ZSBzaW1wbHkgcmViaW5kCisgICAgLy8gdGhlIDJEIHRleHR1cmUgdW5jb25kaXRpb25hbGx5IHJhdGhlciB0aGFuIGR1cGxpY2F0ZSB0aGUgbG9naWMgZnJvbQorICAgIC8vIFByZXBhcmVUZXh0dXJlcy4gV29yc3QgY2FzZSB0aGlzIHRleHR1cmUgaXMgYWxyZWFkeSBib3VuZC4KKyAgICBpZiAodW5pdF9leHQuZ2xvYmFsX3RhcmdldCA9PSBHTF9URVhUVVJFXzJEKSB7CisgICAgICBBY3RpdmVUZXh0dXJlVW5kZXJseWluZyhpKTsKKyAgICAgIGN1cnJlbnRfYWN0aXZlX3RleHR1cmVfdW5pdCA9IGk7CisgICAgICBCaW5kVW5kZXJseWluZyhHZXRUZXh0dXJlVW5pdChrVGV4dHVyZTJkLCBpKSk7CisgICAgfQorICB9CisgIGlmIChjdXJyZW50X2FjdGl2ZV90ZXh0dXJlX3VuaXQgIT0gYWN0aXZlX3RleHR1cmVfdW5pdF8pIHsKKyAgICBBY3RpdmVUZXh0dXJlVW5kZXJseWluZyhhY3RpdmVfdGV4dHVyZV91bml0Xyk7CisgIH0KK30KKwordm9pZCBUZXh0dXJlQ29udGV4dDo6RW5hYmxlKEdMZW51bSB0YXJnZXQpIHsKKyAgY29uc3QgVGFyZ2V0IHQgPSBNYXBUYXJnZXQodGFyZ2V0KTsKKyAgVGV4dHVyZVVuaXQmIHVuaXQgPSBHZXRUZXh0dXJlVW5pdCh0LCBhY3RpdmVfdGV4dHVyZV91bml0Xyk7CisgIHVuaXQuZW5hYmxlZCA9IHRydWU7Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnRleHQ6OkRpc2FibGUoR0xlbnVtIHRhcmdldCkgeworICBjb25zdCBUYXJnZXQgdCA9IE1hcFRhcmdldCh0YXJnZXQpOworICBUZXh0dXJlVW5pdCYgdW5pdCA9IEdldFRleHR1cmVVbml0KHQsIGFjdGl2ZV90ZXh0dXJlX3VuaXRfKTsKKyAgdW5pdC5lbmFibGVkID0gZmFsc2U7Cit9CisKK2Jvb2wgVGV4dHVyZUNvbnRleHQ6OklzRW5hYmxlZChHTGVudW0gdGFyZ2V0KSBjb25zdCB7CisgIHJldHVybiBJc0VuYWJsZWQoYWN0aXZlX3RleHR1cmVfdW5pdF8gKyBHTF9URVhUVVJFMCwgdGFyZ2V0KTsKK30KKworYm9vbCBUZXh0dXJlQ29udGV4dDo6SXNFbmFibGVkKEdMZW51bSBpZCwgR0xlbnVtIHRhcmdldCkgY29uc3QgeworICBjb25zdCBHTHVpbnQgaW5kZXggPSBpZCAtIEdMX1RFWFRVUkUwOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4ID49IG51bV90ZXh0dXJlX3VuaXRzXyk7CisgIGNvbnN0IFRhcmdldCB0ID0gTWFwVGFyZ2V0KHRhcmdldCk7CisgIGNvbnN0IFRleHR1cmVVbml0JiB1bml0ID0gR2V0VGV4dHVyZVVuaXQodCwgaW5kZXgpOworICByZXR1cm4gdW5pdC5lbmFibGVkOworfQorCitHTHVpbnQgVGV4dHVyZUNvbnRleHQ6OkdldEJvdW5kVGV4dHVyZShHTGVudW0gdGFyZ2V0KSBjb25zdCB7CisgIHJldHVybiBHZXRUZXh0dXJlKGFjdGl2ZV90ZXh0dXJlX3VuaXRfICsgR0xfVEVYVFVSRTAsIHRhcmdldCk7Cit9CisKK0dMdWludCBUZXh0dXJlQ29udGV4dDo6R2V0VGV4dHVyZShHTGVudW0gaWQsIEdMZW51bSB0YXJnZXQpIGNvbnN0IHsKKyAgY29uc3QgR0x1aW50IGluZGV4ID0gaWQgLSBHTF9URVhUVVJFMDsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA+PSBudW1fdGV4dHVyZV91bml0c18pOworICBjb25zdCBUYXJnZXQgdCA9IE1hcFRhcmdldCh0YXJnZXQpOworICBjb25zdCBUZXh0dXJlVW5pdCYgdW5pdCA9IEdldFRleHR1cmVVbml0KHQsIGluZGV4KTsKKyAgcmV0dXJuIHVuaXQudGV4dHVyZTsKK30KKworR0xlbnVtIFRleHR1cmVDb250ZXh0OjpHZXRHbG9iYWxUYXJnZXQoR0xlbnVtIGlkLCBHTGVudW0gdGFyZ2V0KSBjb25zdCB7CisgIGNvbnN0IEdMdWludCBpbmRleCA9IGlkIC0gR0xfVEVYVFVSRTA7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPj0gKEdMdWludCludW1fdGV4dHVyZV91bml0c18pOworICBjb25zdCBUYXJnZXQgdCA9IE1hcFRhcmdldCh0YXJnZXQpOworICBjb25zdCBUZXh0dXJlVW5pdCYgdW5pdCA9IEdldFRleHR1cmVVbml0KHQsIGluZGV4KTsKKyAgcmV0dXJuIHVuaXQuZ2xvYmFsX3RhcmdldDsKK30KKworVGV4dHVyZUNvbnRleHQ6OlRleHR1cmVVbml0JgorVGV4dHVyZUNvbnRleHQ6OkdldFRleHR1cmVVbml0KFRhcmdldCB0LCBHTHVpbnQgaW5kZXgpIHsKKyAgcmV0dXJuIHRleHR1cmVfdW5pdHNfW3RdW2luZGV4XTsKK30KKworY29uc3QgVGV4dHVyZUNvbnRleHQ6OlRleHR1cmVVbml0JgorVGV4dHVyZUNvbnRleHQ6OkdldFRleHR1cmVVbml0KFRhcmdldCB0LCBHTHVpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHRleHR1cmVfdW5pdHNfW3RdW2luZGV4XTsKK30KKwordm9pZCBUZXh0dXJlQ29udGV4dDo6QmluZFVuZGVybHlpbmcoY29uc3QgVGV4dHVyZVVuaXQmIHVuaXQpIHsKKyAgY29uc3QgR0x1aW50IGdsb2JhbF9uYW1lID0KKyAgICAgIGNvbnRleHRfLT5HZXRTaGFyZUdyb3VwKCktPkdldFRleHR1cmVHbG9iYWxOYW1lKHVuaXQudGV4dHVyZSk7CisgIGNvbnN0IEdMZW51bSBnbG9iYWxfdGFyZ2V0ID0gdW5pdC5nbG9iYWxfdGFyZ2V0OworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEJpbmRUZXh0dXJlLCBnbG9iYWxfdGFyZ2V0LCBnbG9iYWxfbmFtZSk7Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnRleHQ6OkFjdGl2ZVRleHR1cmVVbmRlcmx5aW5nKEdMdWludCBpbmRleCkgeworICBjb25zdCBHTGVudW0gaWQgPSBHTF9URVhUVVJFMCArIGluZGV4OworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEFjdGl2ZVRleHR1cmUsIGlkKTsKK30KKworYm9vbCBUZXh0dXJlQ29udGV4dDo6U2V0Q2xpZW50QWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkgeworICBjb25zdCBHTHVpbnQgdGV4dHVyZV91bml0ID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworICBpZiAodGV4dHVyZV91bml0ID49IG51bV90ZXh0dXJlX3VuaXRzXykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjbGllbnRfYWN0aXZlX3RleHR1cmVfdW5pdF8gPSB0ZXh0dXJlX3VuaXQ7CisgIHJldHVybiB0cnVlOworfQorCitUZXh0dXJlQ29udGV4dDo6VGFyZ2V0IFRleHR1cmVDb250ZXh0OjpNYXBUYXJnZXQoR0xlbnVtIHRhcmdldCkgY29uc3QgeworICBzd2l0Y2ggKHRhcmdldCkgeworICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICAgIHJldHVybiBrVGV4dHVyZTJkOworICAgIGNhc2UgR0xfVEVYVFVSRV9DVUJFX01BUDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWjoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWjoKKyAgICAgIHJldHVybiBrVGV4dHVyZUN1YmVNYXA7CisgICAgY2FzZSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUzoKKyAgICAgIHJldHVybiBrVGV4dHVyZUV4dGVybmFsOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbnN1cHBvcnRlZC4iKTsKKyAgfQorfQorCitQb2ludGVyQ29udGV4dDo6UG9pbnRlckNvbnRleHQoR2xlc0NvbnRleHQqIGNvbnRleHQpCisgIDogY29udGV4dF8oY29udGV4dCksCisgICAgYXJyYXlfYnVmZmVyXygwKSwKKyAgICBhcnJheV9idWZmZXJfc2l6ZV8oMCksCisgICAgZWxlbWVudF9hcnJheV9idWZmZXJfKDApLAorICAgIGVsZW1lbnRfYXJyYXlfYnVmZmVyX3NpemVfKDApLAorICAgIGRpc2FibGVfZ2xfZml4ZWRfYXR0cmlic18oZW11Z2w6OkdsZXNPcHRpb25zOjpHTEZpeGVkQXR0cmlic0VuYWJsZWQoKSkgeworICBETE9HKCJDcmVhdGVkIHBvaW50ZXIgY29udGV4dCBmb3IgR0xFUzEgY29udGV4dCBAICVwIiwgY29udGV4dCk7Cit9CisKK1BvaW50ZXJDb250ZXh0Ojp+UG9pbnRlckNvbnRleHQoKSB7CisgIFJlbGVhc2UoKTsKK30KKwordm9pZCBQb2ludGVyQ29udGV4dDo6SW5pdChpbnQgbnVtX3BvaW50ZXJzKSB7CisgIERMT0coIkluaXRpYWxpemVkIHBvaW50ZXIgY29udGV4dCBmb3IgR0xFUzEgY29udGV4dCBAICVwIiwgY29udGV4dF8pOworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGFycmF5X2J1ZmZlcl8gIT0gMCk7CisKKyAgcG9pbnRlcnNfLnJlc2l6ZShudW1fcG9pbnRlcnMpOworCisgIEdMdWludCBidWZmZXJzWzJdOworICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEdlbkJ1ZmZlcnMsIDIsIGJ1ZmZlcnMpOworICBhcnJheV9idWZmZXJfID0gYnVmZmVyc1swXTsKKyAgZWxlbWVudF9hcnJheV9idWZmZXJfID0gYnVmZmVyc1sxXTsKK30KKwordm9pZCBQb2ludGVyQ29udGV4dDo6UmVsZWFzZSgpIHsKKyAgaWYgKGFycmF5X2J1ZmZlcl8pIHsKKyAgICBHTHVpbnQgYnVmZmVyc1syXSA9IHsgYXJyYXlfYnVmZmVyXywgZWxlbWVudF9hcnJheV9idWZmZXJfIH07CisgICAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBEZWxldGVCdWZmZXJzLCAyLCBidWZmZXJzKTsKKyAgICBhcnJheV9idWZmZXJfID0gMDsKKyAgICBlbGVtZW50X2FycmF5X2J1ZmZlcl8gPSAwOworICAgIGFycmF5X2J1ZmZlcl9zaXplXyA9IDA7CisgICAgZWxlbWVudF9hcnJheV9idWZmZXJfc2l6ZV8gPSAwOworICB9Cit9CisKK3ZvaWQgUG9pbnRlckNvbnRleHQ6OkVuYWJsZUFycmF5KEdMdWludCBpbmRleCkgeworICBpZiAoaW5kZXggPCBwb2ludGVyc18uc2l6ZSgpKSB7CisgICAgcG9pbnRlcnNfW2luZGV4XS5lbmFibGVkID0gdHJ1ZTsKKyAgfQorfQorCit2b2lkIFBvaW50ZXJDb250ZXh0OjpEaXNhYmxlQXJyYXkoR0x1aW50IGluZGV4KSB7CisgIGlmIChpbmRleCA8IHBvaW50ZXJzXy5zaXplKCkpIHsKKyAgICBwb2ludGVyc19baW5kZXhdLmVuYWJsZWQgPSBmYWxzZTsKKyAgfQorfQorCitib29sIFBvaW50ZXJDb250ZXh0OjpJc0FycmF5RW5hYmxlZChHTHVpbnQgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgcG9pbnRlcnNfLnNpemUoKSkgeworICAgIHJldHVybiBwb2ludGVyc19baW5kZXhdLmVuYWJsZWQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBvaW50ZXJDb250ZXh0OjpTZXRQb2ludGVyKEdMdWludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBub3JtYWxpemVkKSB7CisgIGNvbnN0IEdMdWludCBidWZmZXIgPSBjb250ZXh0Xy0+YXJyYXlfYnVmZmVyX2JpbmRpbmdfOworCisgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPj0gcG9pbnRlcnNfLnNpemUoKSk7CisgIFBvaW50ZXJEYXRhJiBwdHIgPSBwb2ludGVyc19baW5kZXhdOworICBwdHIuc2l6ZSA9IHNpemU7CisgIHB0ci50eXBlID0gdHlwZTsKKyAgcHRyLnN0cmlkZSA9IHN0cmlkZTsKKyAgcHRyLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZWQ7CisgIHB0ci5idWZmZXJfbmFtZSA9IGJ1ZmZlcjsKKyAgcHRyLnBvaW50ZXIgPSBwb2ludGVyOworfQorCitjb25zdCBQb2ludGVyRGF0YSogUG9pbnRlckNvbnRleHQ6OkdldFBvaW50ZXJEYXRhKEdMdWludCBpbmRleCkgY29uc3QgeworICBpZiAoaW5kZXggPCBwb2ludGVyc18uc2l6ZSgpKSB7CisgICAgcmV0dXJuICZwb2ludGVyc19baW5kZXhdOworICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFBvaW50ZXJDb250ZXh0OjpTZXRQb2ludGVycyhjb25zdCBQb2ludGVyRGF0YVZlY3RvciYgcG9pbnRlcnMpIHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihwb2ludGVyc18uc2l6ZSgpICE9IHBvaW50ZXJzLnNpemUoKSk7CisgIHN0ZDo6Y29weShwb2ludGVycy5iZWdpbigpLCBwb2ludGVycy5lbmQoKSwgcG9pbnRlcnNfLmJlZ2luKCkpOworfQorCit2b2lkIFBvaW50ZXJDb250ZXh0OjpQcmVwYXJlQnVmZmVyc0ZvckRyYXdBcnJheXMoR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKKyAgQmluZFBvaW50ZXJzKGZpcnN0LCBmaXJzdCArIGNvdW50KTsKK30KKworY29uc3QgR0x2b2lkKiBQb2ludGVyQ29udGV4dDo6UHJlcGFyZUJ1ZmZlcnNGb3JEcmF3RWxlbWVudHMoCisgICAgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcykgeworICBCdWZmZXJEYXRhUHRyIHZibyA9CisgICAgICBjb250ZXh0Xy0+R2V0Qm91bmRUYXJnZXRCdWZmZXJEYXRhKEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSKTsKKyAgLy8gVGhlcmUgaXMgbm8gY3VycmVudGx5IGJvdW5kIGVsZW1lbnQgYXJyYXkgYnVmZmVyLCBzbyBjb3B5IHRoZSBpbmRpY2VzCisgIC8vIGludG8gdGhlIFBvaW50ZXJDb250ZXh0J3MgZWxlbWVudCBhcnJheSBidWZmZXIgb2JqZWN0IGFuZCB1c2UgdGhhdCBWQk8KKyAgLy8gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGRyYXcgY2FsbC4KKyAgaWYgKHZibyA9PSBOVUxMKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBHZXRUeXBlU2l6ZSh0eXBlKSAqIGNvdW50OworICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQmluZEJ1ZmZlciwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgIGVsZW1lbnRfYXJyYXlfYnVmZmVyXyk7CisgICAgaWYgKHNpemUgPiBlbGVtZW50X2FycmF5X2J1ZmZlcl9zaXplXykgeworICAgICAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBCdWZmZXJEYXRhLCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgc2l6ZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICBHTF9TVFJFQU1fRFJBVyk7CisgICAgICBlbGVtZW50X2FycmF5X2J1ZmZlcl9zaXplXyA9IHNpemU7CisgICAgfQorICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQnVmZmVyU3ViRGF0YSwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIHNpemUsCisgICAgICAgICAgICAgICAgIGluZGljZXMpOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSBhbnkgdmVydGV4IGF0dHJpYnV0ZXMgdGhhdCBhcmUgY2xpZW50LXNpZGUsIHRoZW4gd2UgbmVlZCB0bworICAvLyBjYWxjdWxhdGUgdGhlIHJhbmdlIG9mIHRoZSBlbGVtZW50cyB3ZSBhcmUgZHJhd2luZyBzbyB0aGF0IHdlIGNhbiBjb3B5IHRoZQorICAvLyBjbGllbnQtZGF0YSBpbnRvIFZCT3MuICBUaGUgY29weWluZyBvZiB0aGUgZGF0YSBpcyBkb25lIGluIEJpbmRQb2ludGVycy4KKyAgLy8gSWYgd2UgaGF2ZSBubyBjbGllbnQtc2lkZSB2ZXJ0ZXggYXR0cmlidXRlcywgdGhlbiB0aGUgcmFuZ2UgZG9lcyBub3QKKyAgLy8gbWF0dGVyLgorICBib29sIGhhc19jbGllbnRfdmVydGV4X2F0dHJpYnMgPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb2ludGVyc18uc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIXBvaW50ZXJzX1tpXS5lbmFibGVkKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJzX1tpXS5idWZmZXJfbmFtZSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGhhc19jbGllbnRfdmVydGV4X2F0dHJpYnMgPSB0cnVlOworICAgIGJyZWFrOworICB9CisKKyAgaWYgKGhhc19jbGllbnRfdmVydGV4X2F0dHJpYnMpIHsKKyAgICBjb25zdCBHTHZvaWQqIGRhdGEgPSBpbmRpY2VzOworICAgIGlmICh2Ym8gIT0gTlVMTCkgeworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyX2RhdGEgPSB2Ym8tPkdldERhdGEoKTsKKyAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYnVmZmVyX2RhdGEgPT0gTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVsZW1lbnQgYXJyYXkgYnVmZmVycyBtdXN0IGhhdmUgZGF0YSEiKTsKKyAgICAgIGRhdGEgPSBidWZmZXJfZGF0YSArIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihpbmRpY2VzKTsKKyAgICB9CisgICAgY29uc3QgRWxlbWVudFJhbmdlIHJhbmdlID0gR2V0RWxlbWVudFJhbmdlKGNvdW50LCB0eXBlLCBkYXRhKTsKKyAgICBCaW5kUG9pbnRlcnMocmFuZ2UuZmlyc3QsIHJhbmdlLmxhc3QgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBCaW5kUG9pbnRlcnMoMCwgMCk7CisgIH0KKworICAvLyBJZiB3ZSBoYXZlIGFuIGVsZW1lbnQgYXJyYXkgVkJPLCB0aGVuIHVzZSB0aGUgb2Zmc2V0IGFzIHNwZWNpZmllZC4KKyAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgY29waWVkIHRoZSBjbGllbnQtZGF0YSBkYXRhIGludG8gYSBWQk8sIHNvIHdlCisgIC8vIGNhbiB1c2UgYSB6ZXJvIChOVUxMKSBvZmZzZXQgaW50byB0aGUgVkJPIGluc3RlYWQuCisgIHJldHVybiB2Ym8gIT0gTlVMTCA/IGluZGljZXMgOiBOVUxMOworfQorCit2b2lkIFBvaW50ZXJDb250ZXh0OjpCaW5kUG9pbnRlcnMoR0xpbnQgZmlyc3QsIEdMaW50IGxhc3QpIHsKKyAgLy8gQ2FsY3VsYXRlIGRhdGEgc2l6ZSBmb3IgbmVlZGVkIGRhdGEgaW4gY2xpZW50IHNpZGUgYXJyYXlzLgorICBzaXplX3Qgc2l6ZSA9IDA7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwb2ludGVyc18uc2l6ZSgpOyArK2luZGV4KSB7CisgICAgUG9pbnRlckRhdGEmIHB0ciA9IHBvaW50ZXJzX1tpbmRleF07CisgICAgaWYgKCFwdHIuZW5hYmxlZCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChkaXNhYmxlX2dsX2ZpeGVkX2F0dHJpYnNfKSB7CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHB0ci50eXBlID09IEdMX0ZJWEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAiR0xfRklYRUQgdHlwZSBhdHRyaWJzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgfQorCisgICAgLy8gVGhlIHZlcnRleCBkYXRhIGlzIGFscmVhZHkgc3RvcmVkIGluIGEgVkJPLiAgQmluZCB0aGUgVkJPIG5vdyBzbworICAgIC8vIHRoYXQgd2UgY2FuIGNvcnJlY3RseSB1cGRhdGUgdGhlIHZlcnRleCBhdHRyaWJ1dGUgcG9pbnRlciB0byBwb2ludAorICAgIC8vIHRvIGl0LgorICAgIGlmIChwdHIuYnVmZmVyX25hbWUpIHsKKyAgICAgIGNvbnN0IE9iamVjdEdsb2JhbE5hbWUgZ2xvYmFsX25hbWUgPQorICAgICAgICAgIGNvbnRleHRfLT5HZXRTaGFyZUdyb3VwKCktPkdldEJ1ZmZlckdsb2JhbE5hbWUocHRyLmJ1ZmZlcl9uYW1lKTsKKyAgICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQmluZEJ1ZmZlciwgR0xfQVJSQVlfQlVGRkVSLCBnbG9iYWxfbmFtZSk7CisKKyAgICAgIC8vIFRPRE8oY3JidWcuY29tLzQ4MjA3MCk6IENvbnZlcnQgYW55IGVsZW1lbnRzIGluIHRoZSBidWZmZXIgZGF0YSB0aGF0CisgICAgICAvLyBhcmUgb2YgdHlwZSBHTF9GSVhFRCB0byBHTF9GTE9BVCBhbmQgcmUtdXBsb2FkIHRoYXQgZGF0YSB0byB0aGUgYm91bmQKKyAgICAgIC8vIGJ1ZmZlci4KKyAgICAgIGlmIChwdHIudHlwZSA9PSBHTF9GSVhFRCkgeworICAgICAgICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBzYWZlbHkgYXNzdW1lIHRoYXQgcHRyLnNpemUgaXMgWzEsNF0gYXMKKyAgICAgICAgLy8gcGVyIHRoZSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgc3BlY3MuICBUaGlzIGFsbG93cyB1cyB0byBqdXN0CisgICAgICAgIC8vIHVzZSBhIGxvY2FsIGFycmF5IGluc3RlYWQgb2YgaGF2aW5nIHRvIGFsbG9jYXRlIGEgZHluYW1pYworICAgICAgICAvLyBhcnJheSBmb3IgZG9pbmcgdGhlIGNvbnZlcnNpb24uCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYocHRyLnNpemUgPiA0KTsKKyAgICAgICAgQnVmZmVyRGF0YVB0ciBidWZmZXIgPQorICAgICAgICAgICAgY29udGV4dF8tPkdldFNoYXJlR3JvdXAoKS0+R2V0QnVmZmVyRGF0YShwdHIuYnVmZmVyX25hbWUpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhID0gYnVmZmVyLT5HZXREYXRhKCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gYnVmZmVyLT5HZXRTaXplKCk7CisgICAgICAgIGNvbnN0IEdMaW50cHRyIHN0cmlkZSA9CisgICAgICAgICAgICBwdHIuc3RyaWRlID8gcHRyLnN0cmlkZSA6IHB0ci5zaXplICogR2V0VHlwZVNpemUocHRyLnR5cGUpOworCisgICAgICAgIGZvciAoc2l6ZV90IG1hcmtlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihwdHIucG9pbnRlcik7CisgICAgICAgICAgICAgbWFya2VyIDwgc2l6ZTsgbWFya2VyICs9IHN0cmlkZSkgeworICAgICAgICAgIEdMZmxvYXQgZHN0WzRdOworICAgICAgICAgIGNvbnN0IEdMZml4ZWQqIHNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR0xmaXhlZCo+KCZkYXRhW21hcmtlcl0pOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHRyLnNpemU7ICsraSkgeworICAgICAgICAgICAgZHN0W2ldID0gWDJGKHNyY1tpXSk7CisgICAgICAgICAgfQorICAgICAgICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQnVmZmVyU3ViRGF0YSwgR0xfQVJSQVlfQlVGRkVSLCBtYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHB0ci5zaXplICogc2l6ZW9mKEdMZmxvYXQpLCBkc3QpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgVmVydGV4QXR0cmliUG9pbnRlciwgaW5kZXgsIHB0ci5zaXplLAorICAgICAgICAgICAgICAgICAgIHB0ci50eXBlID09IEdMX0ZJWEVEID8gR0xfRkxPQVQgOiBwdHIudHlwZSwKKyAgICAgICAgICAgICAgICAgICBwdHIubm9ybWFsaXplLCBwdHIuc3RyaWRlLCBwdHIucG9pbnRlcik7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzaXplICs9CisgICAgICBwdHIuc3RyaWRlID8gcHRyLnN0cmlkZSAqIGxhc3QgOiBHZXRUeXBlU2l6ZShwdHIudHlwZSkgKiBsYXN0ICogcHRyLnNpemU7CisgIH0KKworICAvLyBObyBjbGllbnQgc2lkZSBhcnJheSBpcyB1c2VkLgorICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBCaW5kQnVmZmVyLCBHTF9BUlJBWV9CVUZGRVIsIGFycmF5X2J1ZmZlcl8pOworICBpZiAoc2l6ZSA+IGFycmF5X2J1ZmZlcl9zaXplXykgeworICAgIFBBU1NfVEhST1VHSChjb250ZXh0XywgQnVmZmVyRGF0YSwgR0xfQVJSQVlfQlVGRkVSLCBzaXplLCBOVUxMLAorICAgICAgICAgICAgICAgICBHTF9TVFJFQU1fRFJBVyk7CisgICAgYXJyYXlfYnVmZmVyX3NpemVfID0gc2l6ZTsKKyAgfQorCisgIHNpemVfdCBvZmZzZXQgPSAwOworICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcG9pbnRlcnNfLnNpemUoKTsgKytpbmRleCkgeworICAgIFBvaW50ZXJEYXRhJiBwdHIgPSBwb2ludGVyc19baW5kZXhdOworICAgIGlmICghcHRyLmVuYWJsZWQpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwdHIuYnVmZmVyX25hbWUpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPQorICAgICAgcHRyLnN0cmlkZSA/IHB0ci5zdHJpZGUgOiBHZXRUeXBlU2l6ZShwdHIudHlwZSkgKiBwdHIuc2l6ZTsKKyAgICBjb25zdCBzaXplX3Qgb2Zmc2V0X2ZpcnN0ID0gc3RyaWRlICogZmlyc3Q7CisgICAgY29uc3Qgc2l6ZV90IG9mZnNldF9sYXN0ID0gc3RyaWRlICogbGFzdDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHB0ci5wb2ludGVyKTsKKworICAgIC8vIFRPRE8oY3JidWcuY29tLzQ4MjA3MCk6IENvbnZlcnQgYW55IGVsZW1lbnRzIGluIHRoZSBidWZmZXIgZGF0YSB0aGF0IGFyZQorICAgIC8vIG9mIHR5cGUgR0xfRklYRUQgdG8gR0xfRkxPQVQgYmVmb3JlIGNvcHlpbmcgaXQgdG8gb3VyIGJ1ZmZlciBvYmplY3QuCisgICAgaWYgKHB0ci50eXBlID09IEdMX0ZJWEVEKSB7CisgICAgICB1bnNpZ25lZCBjaGFyKiB0bXAgPSBuZXcgdW5zaWduZWQgY2hhcltvZmZzZXRfbGFzdF07CisgICAgICBmb3IgKHNpemVfdCBtYXJrZXIgPSBvZmZzZXRfZmlyc3Q7IG1hcmtlciA8IG9mZnNldF9sYXN0OyBtYXJrZXIgKz0gc3RyaWRlKSB7CisgICAgICAgIEdMZmxvYXQqIGRzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8R0xmbG9hdCo+KCZ0bXBbbWFya2VyXSk7CisgICAgICAgIGNvbnN0IEdMZml4ZWQqIHNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR0xmaXhlZCo+KCZkYXRhW21hcmtlcl0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHB0ci5zaXplOyArK2kpIHsKKyAgICAgICAgICBkc3RbaV0gPSBYMkYoc3JjW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZGF0YSA9IHRtcDsKKyAgICB9CisKKyAgICBQQVNTX1RIUk9VR0goY29udGV4dF8sIEJ1ZmZlclN1YkRhdGEsIEdMX0FSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0ICsgb2Zmc2V0X2ZpcnN0LCBvZmZzZXRfbGFzdCAtIG9mZnNldF9maXJzdCwKKyAgICAgICAgICAgICAgICAgZGF0YSArIG9mZnNldF9maXJzdCk7CisgICAgUEFTU19USFJPVUdIKGNvbnRleHRfLCBWZXJ0ZXhBdHRyaWJQb2ludGVyLCBpbmRleCwgcHRyLnNpemUsCisgICAgICAgICAgICAgICAgIHB0ci50eXBlID09IEdMX0ZJWEVEID8gR0xfRkxPQVQgOiBwdHIudHlwZSwKKyAgICAgICAgICAgICAgICAgcHRyLm5vcm1hbGl6ZSwgcHRyLnN0cmlkZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ob2Zmc2V0KSk7CisgICAgaWYgKHB0ci50eXBlID09IEdMX0ZJWEVEKSB7CisgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICBvZmZzZXQgKz0gb2Zmc2V0X2xhc3Q7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3N0YXRlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTNhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy9zdGF0ZS5oCkBAIC0wLDAgKzEsNTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19TVEFURV9IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ2ZWN0b3IuaCIKKyNpbmNsdWRlICJnbGVzL2RpcnRpYWJsZS5oIgorI2luY2x1ZGUgImdsZXMvbGF6eV9jYWNoZS5oIgorI2luY2x1ZGUgImdsZXMvbWF0cml4X3N0YWNrLmgiCisjaW5jbHVkZSAiZ2xlcy90ZXh0dXJlX2RhdGEuaCIKKworY2xhc3MgR2xlc0NvbnRleHQ7CitjbGFzcyBQcm9ncmFtQ29udGV4dDsKKworLy8gVGhpcyB0dXBsZSBpcyB1c2VkIHRvIG1hcCB0aGUgVmVydGV4QXR0cmlidXRlS2V5IGVudW1lcmF0aW9uIHRvIGEgc3BlY2lmaWMKKy8vIHZlcnRleCBhdHRyaWJ1dGUgaW4gdGhlIHZlcnRleCBzaGFkZXIgZm9yIGVtdWxhdGlvbi4KKy8vIE4uQi4gIFBvc2l0aW9uIGhhcyB0byBiZSBhdHRyaWJ1dGUgMCBvdGhlcndpc2UgUGVwcGVyIGNvbXBsYWlucy4KKyNkZWZpbmUgVkVSVEVYX0FUVFJJQlVURV9LRVlfVFVQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZFUlRFWF9BVFRSSUJVVEVfS0VZKGtQb3NpdGlvblZlcnRleEF0dHJpYnV0ZSwgImFfcG9zaXRpb24iKSAgICAgICAgXAorICBWRVJURVhfQVRUUklCVVRFX0tFWShrQ29sb3JWZXJ0ZXhBdHRyaWJ1dGUsICJhX2NvbG9yIikgICAgICAgICAgICAgIFwKKyAgVkVSVEVYX0FUVFJJQlVURV9LRVkoa05vcm1hbFZlcnRleEF0dHJpYnV0ZSwgImFfbm9ybWFsIikgICAgICAgICAgICBcCisgIFZFUlRFWF9BVFRSSUJVVEVfS0VZKGtQb2ludFNpemVWZXJ0ZXhBdHRyaWJ1dGUsICJhX3BvaW50X3NpemUiKSAgICAgXAorICBWRVJURVhfQVRUUklCVVRFX0tFWShrVGV4Q29vcmQwVmVydGV4QXR0cmlidXRlLCAiYV90ZXhjb29yZF8wIikgICAgIFwKKyAgVkVSVEVYX0FUVFJJQlVURV9LRVkoa1RleENvb3JkMVZlcnRleEF0dHJpYnV0ZSwgImFfdGV4Y29vcmRfMSIpICAgICBcCisgIFZFUlRFWF9BVFRSSUJVVEVfS0VZKGtUZXhDb29yZDJWZXJ0ZXhBdHRyaWJ1dGUsICJhX3RleGNvb3JkXzIiKSAgICAgXAorICBWRVJURVhfQVRUUklCVVRFX0tFWShrVGV4Q29vcmQzVmVydGV4QXR0cmlidXRlLCAiYV90ZXhjb29yZF8zIikgICAgIFwKKyAgVkVSVEVYX0FUVFJJQlVURV9LRVkoa1RleENvb3JkNFZlcnRleEF0dHJpYnV0ZSwgImFfdGV4Y29vcmRfNCIpICAgICBcCisgIFZFUlRFWF9BVFRSSUJVVEVfS0VZKGtUZXhDb29yZDVWZXJ0ZXhBdHRyaWJ1dGUsICJhX3RleGNvb3JkXzUiKSAgICAgXAorICBWRVJURVhfQVRUUklCVVRFX0tFWShrVGV4Q29vcmQ2VmVydGV4QXR0cmlidXRlLCAiYV90ZXhjb29yZF82IikgICAgIFwKKyAgVkVSVEVYX0FUVFJJQlVURV9LRVkoa1RleENvb3JkN1ZlcnRleEF0dHJpYnV0ZSwgImFfdGV4Y29vcmRfNyIpICAgICBcCisgIFZFUlRFWF9BVFRSSUJVVEVfS0VZKGtXZWlnaHRWZXJ0ZXhBdHRyaWJ1dGUsICJhX3dlaWdodCIpICAgICAgICAgICAgXAorICBWRVJURVhfQVRUUklCVVRFX0tFWShrTWF0cml4SW5kZXhWZXJ0ZXhBdHRyaWJ1dGUsICJhX21hdHJpeF9pbmRleCIpCisKKyNkZWZpbmUgVkVSVEVYX0FUVFJJQlVURV9LRVkoZW51bSwgbmFtZSkgZW51bSwKK2VudW0gVmVydGV4QXR0cmlidXRlS2V5IHsKKyAgVkVSVEVYX0FUVFJJQlVURV9LRVlfVFVQTEUKKyAga051bVZlcnRleEF0dHJpYnV0ZUtleXMKK307CisjdW5kZWYgVkVSVEVYX0FUVFJJQlVURV9LRVkKKworLy8gVGhpcyB0dXBsZSBpcyB1c2VkIHRvIG1hcCB0aGUgVW5pZm9ybUtleSBlbnVtZXJhdGlvbiB0byBhIHVuaWZvcm0gbG9jYXRpb24KKy8vIG5hbWUgaW4gdGhlIGdlbmVyYXRlZCBzaGFkZXJzIGZvciBlbXVsYXRpb24uCisjZGVmaW5lIFVOSUZPUk1fS0VZX1RVUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtBbHBoYVRlc3RDb25zdGFudFVuaWZvcm0sICJ1X2FscGhhX3Rlc3RfY29uc3RhbnQiKSAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtBbWJpZW50TGlnaHRVbmlmb3JtLCAidV9hbWJpZW50IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtDbGlwUGxhbmVVbmlmb3JtLCAidV9jbGlwX3BsYW5lWyVkXSIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtDb2xvclVuaWZvcm0sICJ1X2NvbG9yIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtGb2dDb2xvclVuaWZvcm0sICJ1X2ZvZ19jb2xvciIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtGb2dEZW5zaXR5VW5pZm9ybSwgInVfZm9nX2RlbnNpdHkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtGb2dFbmRVbmlmb3JtLCAidV9mb2dfZW5kIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtGb2dTdGFydFVuaWZvcm0sICJ1X2ZvZ19zdGFydCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodEFtYmllbnRVbmlmb3JtLCAidV9saWdodFslZF0uYW1iaWVudCIpICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodENvbnN0QXR0ZW51YXRpb25Vbmlmb3JtLCAidV9saWdodFslZF0uY29uc3RfYXR0ZW51YXRpb24iKSBcCisgIFVOSUZPUk1fS0VZKGtMaWdodERpZmZ1c2VVbmlmb3JtLCAidV9saWdodFslZF0uZGlmZnVzZSIpICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodERpcmVjdGlvblVuaWZvcm0sICJ1X2xpZ2h0WyVkXS5kaXJlY3Rpb24iKSAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodExpbmVhckF0dGVudWF0aW9uVW5pZm9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJ1X2xpZ2h0WyVkXS5saW5lYXJfYXR0ZW51YXRpb24iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodFBvc2l0aW9uVW5pZm9ybSwgInVfbGlnaHRbJWRdLnBvc2l0aW9uIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodFF1YWRyYXRpY0F0dGVudWF0aW9uVW5pZm9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJ1X2xpZ2h0WyVkXS5xdWFkcmF0aWNfYXR0ZW51YXRpb24iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodFNwZWN1bGFyVW5pZm9ybSwgInVfbGlnaHRbJWRdLnNwZWN1bGFyIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodFNwb3RDdXRvZmZVbmlmb3JtLCAidV9saWdodFslZF0uc3BvdF9jdXRvZmYiKSAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtMaWdodFNwb3RFeHBvbmVudFVuaWZvcm0sICJ1X2xpZ2h0WyVkXS5zcG90X2V4cG9uZW50IikgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNYXRlcmlhbEFtYmllbnRVbmlmb3JtLCAidV9tYXRlcmlhbC5hbWJpZW50IikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNYXRlcmlhbERpZmZ1c2VVbmlmb3JtLCAidV9tYXRlcmlhbC5kaWZmdXNlIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNYXRlcmlhbEVtaXNzaW9uVW5pZm9ybSwgInVfbWF0ZXJpYWwuZW1pc3Npb24iKSAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNYXRlcmlhbFNoaW5pbmVzc1VuaWZvcm0sICJ1X21hdGVyaWFsLnNoaW5pbmVzcyIpICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNYXRlcmlhbFNwZWN1bGFyVW5pZm9ybSwgInVfbWF0ZXJpYWwuc3BlY3VsYXIiKSAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNb2RlbFZpZXdJbnZlcnNlVHJhbnNwb3NlTWF0cml4VW5pZm9ybSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJ1X212X2ludmVyc2VfdHJhbnNwb3NlX21hdHJpeCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtNb2RlbFZpZXdNYXRyaXhVbmlmb3JtLCAidV9tdl9tYXRyaXgiKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtOb3JtYWxVbmlmb3JtLCAidV9ub3JtYWwiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQYWxldHRlTWF0cml4VW5pZm9ybSwgInVfcGFsZXR0ZV9tYXRyaXhbJWRdIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQYWxldHRlSW52ZXJzZU1hdHJpeFVuaWZvcm0sICJ1X3BhbGV0dGVfaW52X21hdHJpeFslZF0iKSAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQb2ludFNpemVBdHRlbnVhdGlvblVuaWZvcm0sICJ1X3BvaW50X3NpemVfYXR0ZW51YXRpb24iKSAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQb2ludFNpemVNYXhVbmlmb3JtLCAidV9wb2ludF9zaXplX21heCIpICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQb2ludFNpemVNaW5Vbmlmb3JtLCAidV9wb2ludF9zaXplX21pbiIpICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtQcm9qZWN0aW9uTWF0cml4VW5pZm9ybSwgInVfcF9tYXRyaXgiKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtUZXh0dXJlRW52Q29sb3JVbmlmb3JtLCAidV90ZXhlbnZfY29uc3RbJWRdIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtUZXh0dXJlRW52U2NhbGVVbmlmb3JtLCAidV90ZXhlbnZfc2NhbGVbJWRdIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtUZXh0dXJlTWF0cml4VW5pZm9ybSwgInVfdGV4dHVyZV9tYXRyaXhbJWRdIikgICAgICAgICAgICAgICAgICBcCisgIFVOSUZPUk1fS0VZKGtUZXh0dXJlU2FtcGxlclVuaWZvcm0sICJ1X3NhbXBsZXJfJWQiKQorCisjZGVmaW5lIFVOSUZPUk1fS0VZKGVudW0sIG5hbWUpIGVudW0sCitlbnVtIFVuaWZvcm1LZXkgeworICBVTklGT1JNX0tFWV9UVVBMRQorICBrTnVtVW5pZm9ybUtleXMKK307CisjdW5kZWYgVU5JRk9STV9LRVkKKworCisvLyBTdHJ1Y3R1cmUgdG8gc3RvcmUgbGlnaHQgc291cmNlIHBhcmFtZXRlcnMuICBTZWUgZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYKKy8vIHNlY3Rpb24gMi4xMi4xIHRhYmxlIDIuOCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlcnMuCitzdHJ1Y3QgTGlnaHQgeworICBMaWdodCgpOworICBib29sIElzU3BvdCgpIGNvbnN0OworICBib29sIElzUG9zaXRpb25hbCgpIGNvbnN0OworICBib29sIElzRGlyZWN0aW9uYWwoKSBjb25zdDsKKyAgYm9vbCBTaG91bGRBdHRlbnVhdGUoKSBjb25zdDsKKworICBlbXVnbDo6VmVjdG9yIGFtYmllbnQ7CisgIGVtdWdsOjpWZWN0b3IgZGlmZnVzZTsKKyAgZW11Z2w6OlZlY3RvciBzcGVjdWxhcjsKKyAgZW11Z2w6OlZlY3RvciBwb3NpdGlvbjsKKyAgZW11Z2w6OlZlY3RvciBkaXJlY3Rpb247CisgIGZsb2F0IHNwb3RfZXhwb25lbnQ7CisgIGZsb2F0IHNwb3RfY3V0b2ZmOworICBmbG9hdCBjb25zdF9hdHRlbnVhdGlvbjsKKyAgZmxvYXQgbGluZWFyX2F0dGVudWF0aW9uOworICBmbG9hdCBxdWFkcmF0aWNfYXR0ZW51YXRpb247Cit9OworCisvLyBTdHJ1Y3R1cmUgdG8gc3RvcmUgbWF0ZXJpYWwgcGFyYW1ldGVycy4gIFNlZSBlc19mdWxsX3NwZWMuMS4xLjEyLnBkZiBzZWN0aW9uCisvLyAyLjEyLjEgdGFibGUgMi44IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyYW1ldGVycy4KK3N0cnVjdCBNYXRlcmlhbCB7CisgIE1hdGVyaWFsKCk7CisgIGVtdWdsOjpWZWN0b3IgYW1iaWVudDsKKyAgZW11Z2w6OlZlY3RvciBkaWZmdXNlOworICBlbXVnbDo6VmVjdG9yIHNwZWN1bGFyOworICBlbXVnbDo6VmVjdG9yIGVtaXNzaW9uOworICBmbG9hdCBzaGluaW5lc3M7Cit9OworCisvLyBTdHJ1Y3R1cmUgdG8gc3RvcmUgZm9nIHBhcmFtZXRlcnMuICBTZWUgZXNfZnVsbF9zcGVjLjEuMS4xMi5wZGYgc2VjdGlvbiAzLjguCisvLyBUaGUgbmFtZXMgZm9yIHRoZXNlIHBhcmFtZXRlcnMgY29ycmVzcG9uZCB0byB0aGUgR0xlbnVtcyB0aGF0IGFyZSB1c2VkIHRvCisvLyBzZXQgdGhlbSB0aHJvdWdoIGdsRm9nZiBhbmQgZ2xGb2dmdi4KK3N0cnVjdCBGb2cgeworICBGb2coKTsKKyAgR0xlbnVtIG1vZGU7CisgIGVtdWdsOjpWZWN0b3IgY29sb3I7CisgIGZsb2F0IGRlbnNpdHk7CisgIGZsb2F0IHN0YXJ0OworICBmbG9hdCBlbmQ7Cit9OworCitzdHJ1Y3QgVGV4RW52IHsKKyAgVGV4RW52KCk7CisgIGludCBtb2RlOworICBpbnQgY29tYmluZV9yZ2I7CisgIGludCBjb21iaW5lX2FscGhhOworICBpbnQgc3JjX3JnYlszXTsKKyAgaW50IHNyY19hbHBoYVszXTsKKyAgaW50IG9wZXJhbmRfcmdiWzNdOworICBpbnQgb3BlcmFuZF9hbHBoYVszXTsKKyAgZW11Z2w6OlZlY3RvciBjb2xvcjsKKyAgZmxvYXQgcmdiX3NjYWxlOworICBmbG9hdCBhbHBoYV9zY2FsZTsKK307CisKK3N0cnVjdCBUZXhHZW4geworICBUZXhHZW4oKTsKKyAgR0xlbnVtIG1vZGU7CisgIEdMYm9vbGVhbiBlbmFibGVkOworfTsKKworc3RydWN0IEFscGhhVGVzdCB7CisgIEFscGhhVGVzdCgpOworICBHTGVudW0gZnVuYzsKKyAgZmxvYXQgdmFsdWU7Cit9OworCitzdHJ1Y3QgUG9pbnRQYXJhbWV0ZXJzIHsKKyAgUG9pbnRQYXJhbWV0ZXJzKCk7CisgIC8vIE1pbmltdW0gc2l6ZSBvZiB0aGUgcG9pbnQKKyAgZmxvYXQgc2l6ZV9taW47CisgIC8vIE1heGltdW0gc2l6ZSBvZiB0aGUgcG9pbnQKKyAgZmxvYXQgc2l6ZV9tYXg7CisgIC8vIFNldHMgdGhlIHNpemUgYXQgd2hpY2ggdGhlIHBvaW50IHdpbGwgZmFkZSB0byBhbiBhbHBoYSB2YWx1ZSBvZiB6ZXJvCisgIGZsb2F0IHRocmVzaG9sZF9zaXplOworICAvLyBDb250cm9scyBob3cgdGhlIHBvaW50IHNpemUgaXMgc2NhbGVkIHdpdGggZGlzdGFuY2UgZnJvbSB0aGUgZXllCisgIGZsb2F0IGF0dGVudWF0aW9uWzNdOworICAvLyBDdXJyZW50IHBvaW50IHNpemUuIENvbnN0YW50IHNpemUgdXNlZCB3aGVuIG5vIGFycmF5IGlzIHNldC4KKyAgZmxvYXQgY3VycmVudF9zaXplOworfTsKKworc3RydWN0IFBvaW50ZXJEYXRhIHsKKyBwdWJsaWM6CisgIFBvaW50ZXJEYXRhKCk7CisKKyAgYm9vbCBlbmFibGVkOworICBHTGludCBzaXplOworICBHTGVudW0gdHlwZTsKKyAgR0xzaXplaSBzdHJpZGU7CisgIEdMYm9vbGVhbiBub3JtYWxpemU7CisgIEdMdWludCBidWZmZXJfbmFtZTsKKyAgY29uc3QgR0x2b2lkKiBwb2ludGVyOworfTsKKworLy8gSGVscHMgd2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgU3RhdGVDYWNoZSBieSBpbXBsZW1lbnRpbmcgdGhlIExvYWQKKy8vIGZ1bmN0aW9uYWxpdHkgaXQgbmVlZHMuCisvLyBUaGUgaW1wbGVtZW50YXRpb24gY2Fubm90IGJlIGlubGluZWQgaGVyZSBhcyBpdCByZXF1aXJlcyBjbGFzc2VzIHdoaWNoIGhhdmUKKy8vIG5vdCB5ZXQgYmVlbiBkZWZpbmVkLCBhbmQgd2hpY2ggZGVwZW5kIG9uIFN0YXRlQ2FjaGUgYmVpbmcgZGVmaW5lZCBmaXJzdC4KK2NsYXNzIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgTG9hZChHTGVudW0gdmFsdWUsIEdMYm9vbGVhbiogZGF0YSk7CisgIHN0YXRpYyB2b2lkIExvYWQoR0xlbnVtIHZhbHVlLCBHTGZsb2F0KiBkYXRhKTsKKyAgc3RhdGljIHZvaWQgTG9hZChHTGVudW0gdmFsdWUsIEdMaW50KiBkYXRhKTsKKyAgc3RhdGljIHZvaWQgTG9hZChHTGVudW0gdmFsdWUsIEdMdWludCogZGF0YSk7CisgIHN0YXRpYyB2b2lkIExvYWQoR0xlbnVtIHZhbHVlLAorICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiYgZGF0YSk7ICAgICAgICAgICAgICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorICBzdGF0aWMgdm9pZCBMb2FkKEdMZW51bSB2YWx1ZSwgR0xmbG9hdCYgZGF0YSk7ICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorICBzdGF0aWMgdm9pZCBMb2FkKEdMZW51bSB2YWx1ZSwgR0xpbnQmIGRhdGEpOyAgICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorICBzdGF0aWMgdm9pZCBMb2FkKEdMZW51bSB2YWx1ZSwgR0x1aW50JiBkYXRhKTsgICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorCisgcHJvdGVjdGVkOgorICBTdGF0ZUNhY2hlTG9hZGVySGVscGVyKCk7Cit9OworCisvLyBEZWZpbmVzIGEgbGF6eS1sb2FkZWQgY2FjaGUgZm9yIEdMRVMgc3RhdGUuCisvLworLy8gVGhlIHN0YXRlIGlzIGxvYWRlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGlmIG5vdCB5ZXQga25vd24uCisvLyBTdGF0ZSBjYW4gYWxzbyBiZSBzZXQgaW50byB0aGUgY2FjaGUgZGlyZWN0bHksIGJ5cGFzc2luZyB0aGUgbmVlZCBmb3IgdGhlCisvLyBxdWVyeSBpbiBjYXNlcyB3aGVyZSB0aGUgYXBwbGljYXRpb24gc2V0cyB0aGUgc3RhdGUgYXdheSBmcm9tIHRoZSBkZWZhdWx0LgorLy8KKy8vIFRoaXMgY2FjaGUgc2F2ZXMgc3Vic3RhbnRpYWwgdGltZSBwZXIgcXVlcnkgZ2l2ZW4gdGhlIGxhdGVuY3kgbmVlZGVkIHRvCisvLyBzaW1wbHkgcGFzcyB0aGUgY2FsbCB0aHJvdWdoIHRvIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCB3YWl0IGZvciBpdAorLy8gdG8gcmV0dXJuLiBMb2FkaW5nIHRoZSBjYWNoZSBsYXppbHkgYWxzbyBzYXZlcyBvbiB0aW1lIGF0IHN0YXJ0dXAgZ2l2ZW4gdGhhdAorLy8gbW9zdCBzdGF0ZSBtYXkgbmV2ZXIgYmUgcXVlcmllZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBHTGVudW0gVj4KK2NsYXNzIFN0YXRlQ2FjaGUgeworIHB1YmxpYzoKKyAgZW51bSB7IGtWYWx1ZSA9IFYgfTsKKyAgVCYgTXV0YXRlKCkgeyByZXR1cm4gY2FjaGVfLk11dGF0ZSgpOyB9CisgIGNvbnN0IFQmIEdldCgpIGNvbnN0IHsgcmV0dXJuIGNhY2hlXy5HZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgTG9hZChUJiB0KSB7ICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorICAgIFN0YXRlQ2FjaGVMb2FkZXJIZWxwZXI6OkxvYWQoa1ZhbHVlLCB0KTsKKyAgfQorICBMYXp5Q2FjaGU8VCwgU3RhdGVDYWNoZTxULCBWPjo6TG9hZD4gY2FjaGVfOworfTsKKworLy8gQSBoZWxwZXIgY2xhc3MgdG8gZHJhdyBmdWxsc2NyZWVuIHF1YWRzLgorY2xhc3MgRnVsbHNjcmVlblF1YWQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRnVsbHNjcmVlblF1YWQoR2xlc0NvbnRleHQqIGNvbnRleHQpOworICB+RnVsbHNjcmVlblF1YWQoKTsKKworICB2b2lkIERyYXcoR0x1aW50IHRleHR1cmUsIGJvb2wgZmxpcF92KTsKKworIHByaXZhdGU6CisgIEdsZXNDb250ZXh0KiBjb250ZXh0XzsKKyAgR0x1aW50IHByb2dyYW1fOworICBHTHVpbnQgYnVmZmVyXzsKKyAgR0x1aW50IHBvc2l0aW9uX2F0dHJpYl9pZHhfOworICBHTHVpbnQgdGV4Y29vcmRfYXR0cmliX2lkeF87CisgIEdMdWludCBzYW1wbGVyX3VuaWZvcm1faWR4XzsKKworICBGdWxsc2NyZWVuUXVhZChjb25zdCBGdWxsc2NyZWVuUXVhZCYpOworICBGdWxsc2NyZWVuUXVhZCYgb3BlcmF0b3I9KGNvbnN0IEZ1bGxzY3JlZW5RdWFkJik7Cit9OworCisvLyBTdG9yZXMgYWxsIGNvbnRleHQgZGF0YSB0aGF0IHJlcXVpcmVzIGVtdWxhdGlvbi4gIFdlIHNlcGFyYXRlIHRoaXMKKy8vIHRvIGltcGxlbWVudCBhIGRlcGVuZGVuY3kgbWVjaGFuaXNtIHVzaW5nIEMrKyB0eXBlIGNoZWNraW5nIHRvIGtub3cKKy8vIHdoZW5ldmVyIHVuaWZvcm0tc3BlY2lmaWMgY29udGV4dCBoYXMgY2hhbmdlZCAoYW5kIHJlcXVpcmVzIHVzIHRvCisvLyB1cGRhdGUgb3VyIHNoYWRlciB1bmlmb3Jtcy4pCitjbGFzcyBVbmlmb3JtQ29udGV4dCB7CisgcHVibGljOgorICBlbnVtIHsKKyAgICBrTWF4TGlnaHRzID0gOCwKKyAgICBrTWF4Q2xpcFBsYW5lcyA9IDYsCisgICAga01heFRleHR1cmVVbml0cyA9IDgsCisgICAga01heFBhbGV0dGVNYXRyaWNlc09FUyA9IDksCisgICAga01heFZlcnRleFVuaXRzT0VTID0gNCwKKyAgfTsKKworICBleHBsaWNpdCBVbmlmb3JtQ29udGV4dChHbGVzQ29udGV4dCogY29udGV4dCk7CisgIHZvaWQgSW5pdChpbnQgbnVtX3RleHR1cmVfdW5pdHMpOworCisgIHZvaWQgQmluZChQcm9ncmFtQ29udGV4dCogcHJvZ3JhbSk7CisKKyAgdm9pZCBFbmFibGUoR0xlbnVtIGNhcCk7CisgIHZvaWQgRGlzYWJsZShHTGVudW0gY2FwKTsKKyAgR0xib29sZWFuIElzRW5hYmxlZChHTGVudW0gY2FwKSBjb25zdDsKKworICBib29sIFNldE1hdHJpeE1vZGUoR0xlbnVtIG1hdHJpeF9tb2RlKTsKKyAgR0xlbnVtIEdldE1hdHJpeE1vZGUoKSBjb25zdCB7IHJldHVybiBtYXRyaXhfbW9kZV87IH0KKyAgYm9vbCBTZXRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlX2lkKTsKKworICBjb25zdCBlbXVnbDo6TWF0cml4JiBHZXRNb2RlbFZpZXdNYXRyaXgoKSBjb25zdDsKKyAgZW11Z2w6Ok1hdHJpeCYgTXV0YXRlTW9kZWxWaWV3TWF0cml4KCk7CisKKyAgY29uc3QgZW11Z2w6Ok1hdHJpeCYgR2V0UHJvamVjdGlvbk1hdHJpeCgpIGNvbnN0OworICBlbXVnbDo6TWF0cml4JiBNdXRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CisKKyAgY29uc3QgZW11Z2w6Ok1hdHJpeCYgR2V0VGV4dHVyZU1hdHJpeCgpIGNvbnN0OworICBjb25zdCBlbXVnbDo6TWF0cml4JiBHZXRUZXh0dXJlTWF0cml4QnlTdGFnZShHTGludCBzdGFnZSkgY29uc3Q7CisgIGVtdWdsOjpNYXRyaXgmIE11dGF0ZVRleHR1cmVNYXRyaXhCeVN0YWdlKEdMaW50IHN0YWdlKTsKKworICBib29sIEFjdGl2ZU1hdHJpeFB1c2goKTsKKyAgYm9vbCBBY3RpdmVNYXRyaXhQb3AoKTsKKworICBlbXVnbDo6TWF0cml4JiBNdXRhdGVBY3RpdmVNYXRyaXgoKTsKKyAgY29uc3QgZW11Z2w6Ok1hdHJpeCYgR2V0QWN0aXZlTWF0cml4KCkgY29uc3Q7CisKKyAgYm9vbCBTZXRDdXJyZW50UGFsZXR0ZU1hdHJpeChHTHVpbnQgaW5kZXgpOworICBHTHVpbnQgR2V0Q3VycmVudFBhbGV0dGVNYXRyaXgoKSBjb25zdCB7IHJldHVybiBjdXJyZW50X3BhbGV0dGVfbWF0cml4XzsgfQorICBjb25zdCBlbXVnbDo6TWF0cml4JiBHZXRQYWxldHRlTWF0cml4KCkgY29uc3Q7CisgIGVtdWdsOjpNYXRyaXgmIE11dGF0ZVBhbGV0dGVNYXRyaXgoKTsKKworICBUZXhFbnYmIE11dGF0ZUFjdGl2ZVRleEVudigpOworICBjb25zdCBUZXhFbnYmIEdldEFjdGl2ZVRleEVudigpIGNvbnN0OworCisgIFRleEdlbiYgTXV0YXRlQWN0aXZlVGV4R2VuKCk7CisgIGNvbnN0IFRleEdlbiYgR2V0QWN0aXZlVGV4R2VuKCkgY29uc3Q7CisKKyAgZW11Z2w6OlZlY3RvciogTXV0YXRlQ2xpcFBsYW5lKEdMZW51bSBpZCk7CisgIGNvbnN0IGVtdWdsOjpWZWN0b3IqIEdldENsaXBQbGFuZShHTGVudW0gaWQpIGNvbnN0OworCisgIFRleEVudiogTXV0YXRlVGV4RW52KEdMZW51bSBpZCk7CisgIGNvbnN0IFRleEVudiogR2V0VGV4RW52KEdMZW51bSBpZCkgY29uc3Q7CisKKyAgVGV4R2VuKiBNdXRhdGVUZXhHZW4oR0xlbnVtIGlkKTsKKyAgY29uc3QgVGV4R2VuKiBHZXRUZXhHZW4oR0xlbnVtIGlkKSBjb25zdDsKKworICBMaWdodCogTXV0YXRlTGlnaHQoR0xlbnVtIGlkKTsKKyAgY29uc3QgTGlnaHQqIEdldExpZ2h0KEdMZW51bSBpZCkgY29uc3Q7CisKKyAgUG9pbnRQYXJhbWV0ZXJzJiBNdXRhdGVQb2ludFBhcmFtZXRlcnMoKSB7CisgICAgcmV0dXJuIHBvaW50X3BhcmFtZXRlcnNfLk11dGF0ZSgpOworICB9CisKKyAgY29uc3QgUG9pbnRQYXJhbWV0ZXJzJiBHZXRQb2ludFBhcmFtZXRlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHBvaW50X3BhcmFtZXRlcnNfLkdldCgpOworICB9CisKKyAgQWxwaGFUZXN0JiBNdXRhdGVBbHBoYVRlc3QoKSB7IHJldHVybiBhbHBoYV90ZXN0Xy5NdXRhdGUoKTsgfQorICBjb25zdCBBbHBoYVRlc3QmIEdldEFscGhhVGVzdCgpIGNvbnN0IHsgcmV0dXJuIGFscGhhX3Rlc3RfLkdldCgpOyB9CisKKyAgTWF0ZXJpYWwmIE11dGF0ZU1hdGVyaWFsKCkgeyByZXR1cm4gbWF0ZXJpYWxfLk11dGF0ZSgpOyB9CisgIGNvbnN0IE1hdGVyaWFsJiBHZXRNYXRlcmlhbCgpIGNvbnN0IHsgcmV0dXJuIG1hdGVyaWFsXy5HZXQoKTsgfQorCisgIEZvZyYgTXV0YXRlRm9nKCkgeyByZXR1cm4gZm9nXy5NdXRhdGUoKTsgfQorICBjb25zdCBGb2cmIEdldEZvZygpIGNvbnN0IHsgcmV0dXJuIGZvZ18uR2V0KCk7IH0KKworICBlbXVnbDo6VmVjdG9yJiBNdXRhdGVDb2xvcigpIHsgcmV0dXJuIGNvbG9yXy5NdXRhdGUoKTsgfQorICBjb25zdCBlbXVnbDo6VmVjdG9yJiBHZXRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIGNvbG9yXy5HZXQoKTsgfQorCisgIGVtdWdsOjpWZWN0b3ImIE11dGF0ZU5vcm1hbCgpIHsgcmV0dXJuIG5vcm1hbF8uTXV0YXRlKCk7IH0KKyAgY29uc3QgZW11Z2w6OlZlY3RvciYgR2V0Tm9ybWFsKCkgY29uc3QgeyByZXR1cm4gbm9ybWFsXy5HZXQoKTsgfQorCisgIGVtdWdsOjpWZWN0b3ImIE11dGF0ZUFtYmllbnQoKSB7IHJldHVybiBhbWJpZW50Xy5NdXRhdGUoKTsgfQorICBjb25zdCBlbXVnbDo6VmVjdG9yJiBHZXRBbWJpZW50KCkgY29uc3QgeyByZXR1cm4gYW1iaWVudF8uR2V0KCk7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IERpcnRpYWJsZTxNYXRyaXhTdGFjaz4qIEdldEFjdGl2ZU1hdHJpeFN0YWNrSW50ZXJuYWwoKSBjb25zdDsKKworICBHbGVzQ29udGV4dCogY29udGV4dF87CisgIEdMdWludCBwcm9ncmFtX29iamVjdF87CisgIEdMZW51bSBtYXRyaXhfbW9kZV87CisgIEdMaW50IGFjdGl2ZV90ZXh0dXJlX3VuaXRfOworICBHTGludCBjdXJyZW50X3BhbGV0dGVfbWF0cml4XzsKKworICBEaXJ0aWFibGU8QWxwaGFUZXN0PiBhbHBoYV90ZXN0XzsKKyAgRGlydGlhYmxlPGVtdWdsOjpWZWN0b3I+IGFtYmllbnRfOworICBEaXJ0aWFibGU8ZW11Z2w6OlZlY3Rvcj4gY2xpcF9wbGFuZXNfW2tNYXhDbGlwUGxhbmVzXTsKKyAgRGlydGlhYmxlPGVtdWdsOjpWZWN0b3I+IGNvbG9yXzsKKyAgRGlydGlhYmxlPEZvZz4gZm9nXzsKKyAgRGlydGlhYmxlPExpZ2h0PiBsaWdodHNfW2tNYXhMaWdodHNdOworICBEaXJ0aWFibGU8TWF0ZXJpYWw+IG1hdGVyaWFsXzsKKyAgRGlydGlhYmxlPE1hdHJpeFN0YWNrPiBtb2RlbHZpZXdfbWF0cml4X3N0YWNrXzsKKyAgRGlydGlhYmxlPGVtdWdsOjpWZWN0b3I+IG5vcm1hbF87CisgIERpcnRpYWJsZTxQb2ludFBhcmFtZXRlcnM+IHBvaW50X3BhcmFtZXRlcnNfOworICBEaXJ0aWFibGU8TWF0cml4U3RhY2s+IHByb2plY3Rpb25fbWF0cml4X3N0YWNrXzsKKyAgRGlydGlhYmxlPFRleEVudj4gdGV4ZW52X1trTWF4VGV4dHVyZVVuaXRzXTsKKyAgRGlydGlhYmxlPFRleEdlbj4gdGV4Z2VuX1trTWF4VGV4dHVyZVVuaXRzXTsKKyAgRGlydGlhYmxlPE1hdHJpeFN0YWNrPiB0ZXh0dXJlX21hdHJpeF9zdGFja19ba01heFRleHR1cmVVbml0c107CisgIERpcnRpYWJsZTxlbXVnbDo6TWF0cml4PiBwYWxldHRlX21hdHJpY2VzX1trTWF4UGFsZXR0ZU1hdHJpY2VzT0VTXTsKK307CisKKy8vIFN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBnbGVzX3RyYW5zbGF0aW9uIHByb2dyYW0gdGhhdCBpcworLy8gYmVpbmcgdXNlZCB0byBlbXVsYXRlIHRoZSBHTEVTIDEgZHJhdyBzdGF0ZS4KK2NsYXNzIFByb2dyYW1Db250ZXh0IHsKKyBwdWJsaWM6CisgIFByb2dyYW1Db250ZXh0KEdsZXNDb250ZXh0KiBjb250ZXh0LCBHTHVpbnQgcHJvZ3JhbSk7CisgIHZvaWQgQmluZCgpOworICB2b2lkIERlbGV0ZSgpOworCisgIEdMdWludCBHZXRQcm9ncmFtT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV9vYmplY3RfOyB9CisgIEdMaW50IEdldFVuaWZvcm1Mb2NhdGlvbihVbmlmb3JtS2V5IGtleSk7CisgIEdMaW50IEdldFVuaWZvcm1Mb2NhdGlvbihVbmlmb3JtS2V5IGtleSwgaW50IGluZGV4KTsKKworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IGludCYgdmFsdWUsIFVuaWZvcm1LZXkga2V5KTsKKyAgdm9pZCBCaW5kVW5pZm9ybShjb25zdCBpbnQmIHZhbHVlLCBVbmlmb3JtS2V5IGtleSwgaW50IGluZGV4KTsKKyAgdm9pZCBCaW5kVW5pZm9ybShjb25zdCBmbG9hdCYgdmFsdWUsIFVuaWZvcm1LZXkga2V5KTsKKyAgdm9pZCBCaW5kVW5pZm9ybShjb25zdCBmbG9hdCYgdmFsdWUsIFVuaWZvcm1LZXkga2V5LCBpbnQgaW5kZXgpOworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IGZsb2F0ICgmdmFsdWVzKVszXSwgVW5pZm9ybUtleSBrZXkpOworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IGVtdWdsOjpWZWN0b3ImIHZlY3RvciwgVW5pZm9ybUtleSBrZXkpOworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IGVtdWdsOjpWZWN0b3ImIHZlY3RvciwgVW5pZm9ybUtleSBrZXksIGludCBpbmRleCk7CisgIHZvaWQgQmluZFVuaWZvcm0oY29uc3QgZW11Z2w6Ok1hdHJpeCYgbWF0cml4LCBVbmlmb3JtS2V5IGtleSk7CisgIHZvaWQgQmluZFVuaWZvcm0oY29uc3QgZW11Z2w6Ok1hdHJpeCYgbWF0cml4LCBVbmlmb3JtS2V5IGtleSwgaW50IGluZGV4KTsKKworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IEZvZyYgZm9nKTsKKyAgdm9pZCBCaW5kVW5pZm9ybShjb25zdCBMaWdodCYgbGlnaHQsIGludCBpbmRleCk7CisgIHZvaWQgQmluZFVuaWZvcm0oY29uc3QgTWF0ZXJpYWwmIG1hdGVyaWFsKTsKKyAgdm9pZCBCaW5kVW5pZm9ybShjb25zdCBQb2ludFBhcmFtZXRlcnMmIHBvaW50X3BhcmFtZXRlcnMpOworICB2b2lkIEJpbmRVbmlmb3JtKGNvbnN0IFRleEVudiYgdGV4ZW52LCBpbnQgaW5kZXgpOworCisgcHJpdmF0ZToKKyAgZW51bSB7CisgICAga1NjYWxhclVuaWZvcm0gPSAtMQorICB9OworCisgIC8vIFVuaWZvcm0gbG9jYXRpb25zIGFyZSBrZXllZCBieSB0aGVpciBuYW1lIChlZy4gdV9tdl9tYXRyaXgpIGFuZCBhcnJheQorICAvLyBpbmRleCAoZWcuIHVfbGlnaHRbMF0pLiAgVW5pZm9ybXMgdGhhdCBhcmUgbm90IGFycmF5cyBoYXZlIGFuIGltcGxpZWQKKyAgLy8gaW5kZXggb2Yga1NjYWxhclVuaWZvcm0uCisgIHR5cGVkZWYgc3RkOjpwYWlyPFVuaWZvcm1LZXksIGludD4gVW5pZm9ybUtleUlkeDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxVbmlmb3JtS2V5SWR4LCBHTGludD4gVW5pZm9ybUxvY2F0aW9uTWFwOworCisgIEdsZXNDb250ZXh0KiBjb250ZXh0XzsKKyAgR0x1aW50IHByb2dyYW1fb2JqZWN0XzsKKyAgVW5pZm9ybUxvY2F0aW9uTWFwIHVuaWZvcm1fbG9jYXRpb25fbWFwXzsKK307CisKK2NsYXNzIFRleHR1cmVDb250ZXh0IHsKKyAgc3RydWN0IFRleHR1cmVVbml0OworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGV4dHVyZUNvbnRleHQoR2xlc0NvbnRleHQqIGNvbnRleHQpOworICB+VGV4dHVyZUNvbnRleHQoKTsKKworICB2b2lkIEluaXQoaW50IG51bV90ZXh0dXJlX3VuaXRzLCBpbnQgbWF4X3RleHR1cmVfc2l6ZSk7CisgIHZvaWQgRGVsZXRlVGV4dHVyZShHTHVpbnQgdGV4dHVyZSk7CisKKyAgR0xpbnQgR2V0TWF4TGV2ZWxzKCkgY29uc3QgeyByZXR1cm4gbWF4X3RleHR1cmVfbGV2ZWxzXzsgfQorICBUZXh0dXJlRGF0YVB0ciBHZXREZWZhdWx0VGV4dHVyZURhdGEoR0xlbnVtIHRhcmdldCk7CisKKyAgR0xlbnVtIEdldEFjdGl2ZVRleHR1cmUoKSBjb25zdCB7IHJldHVybiBHTF9URVhUVVJFMCArIGFjdGl2ZV90ZXh0dXJlX3VuaXRfOyB9CisgIGJvb2wgU2V0QWN0aXZlVGV4dHVyZShHTGVudW0gaWQpOworCisgIGJvb2wgQmluZFRleHR1cmVUb1RhcmdldChjb25zdCBUZXh0dXJlRGF0YVB0ciYgdGV4LCBHTGVudW0gdGFyZ2V0KTsKKyAgdm9pZCBTZXRUYXJnZXRUZXh0dXJlKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZ2xvYmFsX3RhcmdldCk7CisKKyAgR0xlbnVtIEVuc3VyZUNvcnJlY3RCaW5kaW5nKEdMZW51bSB0YXJnZXQpOworICB2b2lkIFJlc3RvcmVCaW5kaW5nKEdMZW51bSB0YXJnZXQpOworCisgIHZvaWQgUHJlcGFyZVRleHR1cmVzKGJvb2wgZ2xlczExLCBib29sIHVzZXNfZXh0ZXJuYWxfYXNfMmQpOworICB2b2lkIFJlc3RvcmVUZXh0dXJlcygpOworCisgIHZvaWQgRW5hYmxlKEdMZW51bSB0YXJnZXQpOworICB2b2lkIERpc2FibGUoR0xlbnVtIHRhcmdldCk7CisgIGJvb2wgSXNFbmFibGVkKEdMZW51bSB0YXJnZXQpIGNvbnN0OworICBib29sIElzRW5hYmxlZChHTGVudW0gaWQsIEdMZW51bSB0YXJnZXQpIGNvbnN0OworCisgIEdMdWludCBHZXRCb3VuZFRleHR1cmUoR0xlbnVtIHRhcmdldCkgY29uc3Q7CisgIEdMdWludCBHZXRUZXh0dXJlKEdMZW51bSBpZCwgR0xlbnVtIHRhcmdldCkgY29uc3Q7CisgIEdMZW51bSBHZXRHbG9iYWxUYXJnZXQoR0xlbnVtIGlkLCBHTGVudW0gdGFyZ2V0KSBjb25zdDsKKworICBib29sIFNldENsaWVudEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmUpOworICBHTGVudW0gR2V0Q2xpZW50QWN0aXZlVGV4dHVyZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR0xfVEVYVFVSRTAgKyBjbGllbnRfYWN0aXZlX3RleHR1cmVfdW5pdF87CisgIH0KKyAgR0x1aW50IEdldENsaWVudEFjdGl2ZVRleHR1cmVDb29yZEF0dHJpYigpIGNvbnN0IHsKKyAgICByZXR1cm4ga1RleENvb3JkMFZlcnRleEF0dHJpYnV0ZSArIGNsaWVudF9hY3RpdmVfdGV4dHVyZV91bml0XzsKKyAgfQorICBzdGF0aWMgR0x1aW50IEdldFRleHR1cmVDb29yZEF0dHJpYihHTGVudW0gdGV4dHVyZSkgeworICAgIHJldHVybiBrVGV4Q29vcmQwVmVydGV4QXR0cmlidXRlICsgdGV4dHVyZSAtIEdMX1RFWFRVUkUwOworICB9CisKKyBwcml2YXRlOgorICBlbnVtIFRhcmdldCB7CisgICAga1RleHR1cmUyZCwKKyAgICBrVGV4dHVyZUN1YmVNYXAsCisgICAga1RleHR1cmVFeHRlcm5hbCwKKyAgICBrTnVtVGFyZ2V0cworICB9OworCisgIHN0cnVjdCBUZXh0dXJlVW5pdCB7CisgICAgVGV4dHVyZVVuaXQoKSA6IHRleHR1cmUoMCksIGdsb2JhbF90YXJnZXQoMCksIGVuYWJsZWQoR0xfRkFMU0UpIHsKKyAgICB9CisgICAgR0x1aW50IHRleHR1cmU7CisgICAgR0xlbnVtIGdsb2JhbF90YXJnZXQ7CisgICAgR0xib29sZWFuIGVuYWJsZWQ7CisgIH07CisKKyAgVGFyZ2V0IE1hcFRhcmdldChHTGVudW0gdGFyZ2V0KSBjb25zdDsKKyAgVGV4dHVyZVVuaXQmIEdldFRleHR1cmVVbml0KFRhcmdldCB0LCBHTHVpbnQgaW5kZXgpOworICBjb25zdCBUZXh0dXJlVW5pdCYgR2V0VGV4dHVyZVVuaXQoVGFyZ2V0IHQsIEdMdWludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgQmluZFVuZGVybHlpbmcoY29uc3QgVGV4dHVyZVVuaXQmIHRleHR1cmVfdW5pdCk7CisgIHZvaWQgQWN0aXZlVGV4dHVyZVVuZGVybHlpbmcoR0x1aW50IGluZGV4KTsKKworICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGV4dHVyZSBtaXBtYXAgbGV2ZWxzIHN1cHBvcnRlZC4gQ29tcHV0ZWQgZnJvbSB0aGUKKyAgLy8gbWF4aW11bSBzdXBwb3J0ZWQgdGV4dHVyZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgorICBHbGVzQ29udGV4dCogY29udGV4dF87CisgIEdMaW50IG1heF90ZXh0dXJlX2xldmVsc187CisgIEdMdWludCBudW1fdGV4dHVyZV91bml0c187CisgIEdMdWludCBhY3RpdmVfdGV4dHVyZV91bml0XzsKKyAgR0xlbnVtIGNsaWVudF9hY3RpdmVfdGV4dHVyZV91bml0XzsKKyAgc3RkOjp2ZWN0b3I8VGV4dHVyZVVuaXQ+IHRleHR1cmVfdW5pdHNfW2tOdW1UYXJnZXRzXTsKKworICBzdGF0aWMgY29uc3QgR0xlbnVtIHN1cHBvcnRlZF90ZXh0dXJlX3RhcmdldHNfW2tOdW1UYXJnZXRzXTsKKworICAvLyBUZXh0dXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IHRleHR1cmUgKGllLiB0ZXh0dXJlIDApLiAgVGhpcworICAvLyBpbmZvcm1hdGlvbiBpcyBub3Qgc2hhcmVkIGJldHdlZW4gY29udGV4dHMuCisgIHN0ZDo6dmVjdG9yPFRleHR1cmVEYXRhUHRyPiBkZWZhdWx0X3RleHR1cmVzXzsKKworICBUZXh0dXJlQ29udGV4dChjb25zdCBUZXh0dXJlQ29udGV4dCYpOworICBUZXh0dXJlQ29udGV4dCYgb3BlcmF0b3I9KGNvbnN0IFRleHR1cmVDb250ZXh0Jik7Cit9OworCitjbGFzcyBQb2ludGVyQ29udGV4dCB7CisgcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFBvaW50ZXJEYXRhPiBQb2ludGVyRGF0YVZlY3RvcjsKKworICBleHBsaWNpdCBQb2ludGVyQ29udGV4dChHbGVzQ29udGV4dCogY29udGV4dCk7CisgIH5Qb2ludGVyQ29udGV4dCgpOworCisgIHZvaWQgSW5pdChpbnQgbnVtX3BvaW50ZXJzKTsKKyAgdm9pZCBSZWxlYXNlKCk7CisKKyAgdm9pZCBFbmFibGVBcnJheShHTHVpbnQgaW5kZXgpOworICB2b2lkIERpc2FibGVBcnJheShHTHVpbnQgaW5kZXgpOworICBib29sIElzQXJyYXlFbmFibGVkKEdMdWludCBpbmRleCkgY29uc3Q7CisKKyAgY29uc3QgUG9pbnRlckRhdGEqIEdldFBvaW50ZXJEYXRhKEdMdWludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgU2V0UG9pbnRlcihHTHVpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xib29sZWFuIG5vcm1hbGl6ZWQgPSBHTF9GQUxTRSk7CisKKyAgdm9pZCBQcmVwYXJlQnVmZmVyc0ZvckRyYXdBcnJheXMoR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOworICBjb25zdCBHTHZvaWQqIFByZXBhcmVCdWZmZXJzRm9yRHJhd0VsZW1lbnRzKEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCogaW5kaWNlcyk7CisKKyAgY29uc3QgUG9pbnRlckRhdGFWZWN0b3ImIEdldFBvaW50ZXJzKCkgY29uc3QgeyByZXR1cm4gcG9pbnRlcnNfOyB9CisgIHZvaWQgU2V0UG9pbnRlcnMoY29uc3QgUG9pbnRlckRhdGFWZWN0b3ImIHBvaW50ZXJzKTsKKworIHByaXZhdGU6CisgIHZvaWQgQmluZFBvaW50ZXJzKEdMaW50IGZpcnN0LCBHTGludCBsYXN0KTsKKworICBHbGVzQ29udGV4dCogY29udGV4dF87CisgIFBvaW50ZXJEYXRhVmVjdG9yIHBvaW50ZXJzXzsKKworICBHTHVpbnQgYXJyYXlfYnVmZmVyXzsKKyAgc2l6ZV90IGFycmF5X2J1ZmZlcl9zaXplXzsKKyAgR0x1aW50IGVsZW1lbnRfYXJyYXlfYnVmZmVyXzsKKyAgc2l6ZV90IGVsZW1lbnRfYXJyYXlfYnVmZmVyX3NpemVfOworCisgIGJvb2wgZGlzYWJsZV9nbF9maXhlZF9hdHRyaWJzXzsKKworICBQb2ludGVyQ29udGV4dChjb25zdCBQb2ludGVyQ29udGV4dCYpOworICBQb2ludGVyQ29udGV4dCYgb3BlcmF0b3I9KGNvbnN0IFBvaW50ZXJDb250ZXh0Jik7Cit9OworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfU1RBVEVfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RleHR1cmVfY29kZWNzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RleHR1cmVfY29kZWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODhiZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdGV4dHVyZV9jb2RlY3MuY3BwCkBAIC0wLDAgKzEsNjU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImdsZXMvdGV4dHVyZV9jb2RlY3MuaCIKKworI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgLy8gZm9yIF9fQllURV9PUkRFUgorI2Vsc2UKKy8vIFdpbmRvd3MgaXMgbGl0dGxlLWVuZGlhbiBvbmx5CisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxMjM0CisjZGVmaW5lIF9fQklHX0VORElBTiAgICA0MzIxCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2luY2x1ZGUgImNvbW1vbi9hbG9nLmgiCisjaW5jbHVkZSAiZ2xlcy9kZWJ1Zy5oIgorCisjaWYgX19BUFBMRV9fCisjZGVmaW5lIF9fTElUVExFX0VORElBTiAxCisjZGVmaW5lIF9fQllURV9PUkRFUiBfX0xJVFRMRV9FTkRJQU4KKyNlbmRpZgorCituYW1lc3BhY2UgeworCisvLyBTdGF0aWMgKGNvbXBpbGUgdGltZSkgY291bnQgb2Ygb25lIGJpdHMgaW4gYW4gaW50ZWdlciBjb25zdGFudC4KKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDwwPjo6a1ZhbHVlID09IDAKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDwxPjo6a1ZhbHVlID09IDEKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDwyPjo6a1ZhbHVlID09IDEKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDwzPjo6a1ZhbHVlID09IDIKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDw0Pjo6a1ZhbHVlID09IDEKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDw1Pjo6a1ZhbHVlID09IDIKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDw2Pjo6a1ZhbHVlID09IDIKKy8vIFN0YXRpY1BvcHVsYXRpb25Db3VudDw3Pjo6a1ZhbHVlID09IDMKKy8vIChldGMpCit0ZW1wbGF0ZSA8c2l6ZV90IE4+IHN0cnVjdCBTdGF0aWNQb3B1bGF0aW9uQ291bnQgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtWYWx1ZSA9IDEgKyBTdGF0aWNQb3B1bGF0aW9uQ291bnQ8KE4gJiAoTiAtIDEpKT46OmtWYWx1ZTsKK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU3RhdGljUG9wdWxhdGlvbkNvdW50PDA+IHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrVmFsdWUgPSAwOworfTsKKworLy8gU3RhdGljIChjb21waWxlIHRpbWUpIGxlYWRpbmcgemVybyBiaXQgY291bnQgb2YgYW4gaW50ZWdlciBjb25zdGFudC4KKy8vIFN0YXRpY0xlYWRpbmdaZXJvQ291bnQ8MD46OmtWYWx1ZSA9PSAzMgorLy8gU3RhdGljTGVhZGluZ1plcm9Db3VudDwxPjo6a1ZhbHVlID09IDAKKy8vIFN0YXRpY0xlYWRpbmdaZXJvQ291bnQ8Mj46OmtWYWx1ZSA9PSAxCisvLyBTdGF0aWNMZWFkaW5nWmVyb0NvdW50PDM+OjprVmFsdWUgPT0gMAorLy8gU3RhdGljTGVhZGluZ1plcm9Db3VudDw0Pjo6a1ZhbHVlID09IDIKKy8vIFN0YXRpY0xlYWRpbmdaZXJvQ291bnQ8NT46OmtWYWx1ZSA9PSAwCisvLyBTdGF0aWNMZWFkaW5nWmVyb0NvdW50PDY+OjprVmFsdWUgPT0gMQorLy8gU3RhdGljTGVhZGluZ1plcm9Db3VudDw3Pjo6a1ZhbHVlID09IDAKKy8vIChldGMpCit0ZW1wbGF0ZSA8dWludDMyX3QgTj4gc3RydWN0IFN0YXRpY0xlYWRpbmdaZXJvQ291bnQgeworICBzdGF0aWMgY29uc3QgdWludDMyX3QgXzAgPSBOOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgXzEgPSBfMCB8IChfMCA8PCAxKTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IF8yID0gXzEgfCAoXzEgPDwgMik7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBfMyA9IF8yIHwgKF8yIDw8IDQpOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgXzQgPSBfMyB8IChfMyA8PCA4KTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IF81ID0gXzQgfCAoXzQgPDwgMTYpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtWYWx1ZSA9IFN0YXRpY1BvcHVsYXRpb25Db3VudDx+XzU+OjprVmFsdWU7Cit9OworCisvLyBCcm9hZGNhc3QoY29tcG9uZW50LCBiaXRzKSBmaWxscyBpbiBtaXNzaW5nIGJpdHMgaW4gdGhlIGxvd2VyIGJpdHMgb2YgYW4KKy8vIGVpZ2h0IGJpdCB2YWx1ZSwgd2l0aCB0aGUgZ29hbCBvZiBleHBhbmRpbmcgYSB2YWx1ZSB0byB0aGUgZnVsbCByYW5nZSBvZiBhbgorLy8gZWlnaHQgYml0IGludGVnZXIuCisvLworLy8gVGhlIGlucHV0ICdjb21wb25lbnQnIHNob3VsZCBiZSB0aGUgdmFsdWUgdG8gZnVsbHkgZXhwYW5kIHRvIGVpZ2h0IGJpdHMsIGFuZAorLy8gc2hvdWxkIGhhdmUgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBzZXQgY29ycmVjdGx5LCBhbmQgdGhlIHJlbWFpbmluZyBiaXRzCisvLyBzaG91bGQgYmUgemVyby4gJ2JpdHMnIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGF0IHRoZSB0b3AgYXJlIHNldC4KKy8vCisvLyBGb3IgZXhhbXBsZSwgZm9yIGEgb25lIGJpdCB2YWx1ZSwgdGhlIHRvcG1vc3QgYml0IGlzIGp1c3QgdXNlZCB0byBmaWxsIHRoZQorLy8gZW50aXJlIGJ5dGU6CisvLworLy8gICAgIEJyb2FkY2FzdCgweDAwLCAxKSAtPiAweDAwCisvLyAgICAgQnJvYWRjYXN0KDB4ODAsIDEpIC0+IDB4ZmYKKy8vCisvLyBGb3IgYSBmb3VyIGJpdCB2YWx1ZSwgdGhlcmUgYXJlIHNpeHRlZW4gZXhwZWN0ZWQgaW5wdXRzLCB3aXRoIHRoZSBsb3dlciBmb3VyCisvLyBiaXRzIGp1c3Qgc2V0IGlkZW50aWNhbGx5IHRvIHRoZSB1cHBlciBmb3VyIGJpdHMgb24gb3V0cHV0OgorLy8KKy8vICAgICBCcm9hZGNhc3QoMHgwMCwgNCkgLT4gMHgwMAorLy8gICAgIEJyb2FkY2FzdCgweDEwLCA0KSAtPiAweDExCisvLyAgICAgQnJvYWRjYXN0KDB4MjAsIDQpIC0+IDB4MjIKKy8vICAgICAuIC4gLgorLy8gICAgIEJyb2FkY2FzdCgweGYwLCA0KSAtPiAweGZmCit1aW50OF90IEJyb2FkY2FzdCh1aW50OF90IGNvbXBvbmVudCwgaW50IGJpdHMpIHsKKyAgaWYgKGJpdHMgPCA4KQorICAgIGNvbXBvbmVudCB8PSBjb21wb25lbnQgPj4gKGJpdHMgKiAxKTsKKyAgaWYgKGJpdHMgPCA0KQorICAgIGNvbXBvbmVudCB8PSBjb21wb25lbnQgPj4gKGJpdHMgKiAyKTsKKyAgaWYgKGJpdHMgPCAyKQorICAgIGNvbXBvbmVudCB8PSBjb21wb25lbnQgPj4gKGJpdHMgKiA0KTsKKyAgcmV0dXJuIGNvbXBvbmVudDsKK30KKworLy8gQml0d2lzZSBzaGlmdCBoZWxwZXIgZnVuY3Rpb24KKy8vCisvLyBJbiBDL0MrKywgdGhlIHJpZ2h0IGhhbmQgYXJndW1lbnQgdG8gdGhlICI+PiIgb3BlcmF0b3IgaXMgZXhwZWN0ZWQgdG8gYmUKKy8vIHBvc2l0aXZlLCBvdGhlcndpc2UgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGNob29zZXMgYmV0d2VlbiBsZWZ0IGFuZCByaWdodCBzaGlmdHMKK3VpbnQzMl90IFNoaWZ0UmlnaHQodWludDMyX3QgbiwgaW50IGNudCkgeworICByZXR1cm4gKGNudCA+PSAwKSA/IChuID4+IGNudCkgOiAobiA8PCAtY250KTsKK30KKworLy8gUmVwcmVzZW50cyBhIHNpbmdsZSBiaXQtcGFja2VkIGNvbXBvbmVudC4KKy8vCisvLyBEZWZpbmVzIGZ1bmN0aW9uYWxpdHkgdG8gZXh0cmFjdC91bnBhY2tlZCB0aGUgY29tcG9uZW50IGZyb20gdGhlIHBhY2tlZCB2YWx1ZQorLy8gYXMgYSB1aW50OF90IHZhbHVlLCBvciB0byB0YWtlIGEgdWludDhfdCB2YWx1ZSBhbmQgZm9ybSB0aGUgcGFja2VkIHZhbHVlCisvLyB1c2luZyBpdC4KK3RlbXBsYXRlIDx1aW50MzJfdCBrTWFzaywgdWludDhfdCBrRGVmYXVsdD4gc3RydWN0IFBhY2tlZENvbXBvbmVudCB7CisgIHN0YXRpYyBjb25zdCBpbnQga01hc2tTaGlmdCA9IFN0YXRpY0xlYWRpbmdaZXJvQ291bnQ8a01hc2s+OjprVmFsdWU7CisgIHN0YXRpYyBjb25zdCBpbnQga01hc2tXaWR0aCA9IFN0YXRpY1BvcHVsYXRpb25Db3VudDxrTWFzaz46OmtWYWx1ZTsKKyAgLy8gQ29tcHV0ZSB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSByaWdodCBzaGlmdCBhbW91bnQgc3VjaCB0aGF0IHRoZSB1bnBhY2tlZAorICAvLyBjb21wb25lbnQgd2lsbCBiZSBpbiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGEgYnl0ZS4KKyAgLy8gVGhpcyBzaGlmdCBhbW91bnQgaXMgYWxzbyB1c2VkIHRvIHBhY2sgdXAgdGhlIGNvbXBvbmVudCBhZ2Fpbi4KKyAgc3RhdGljIGNvbnN0IGludCBrVW5wYWNrU2hpZnQgPSBrTWFza1dpZHRoICsga01hc2tTaGlmdCAtIDg7CisgIHN0YXRpYyBjb25zdCBpbnQga1BhY2tTaGlmdCA9IC1rVW5wYWNrU2hpZnQ7CisKKyAgc3RhdGljIHVpbnQ4X3QgVW5wYWNrKHVpbnQzMl90IHB2KSB7CisgICAgdWludDhfdCBtYXNrZWQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihTaGlmdFJpZ2h0KHB2ICYga01hc2ssIGtVbnBhY2tTaGlmdCkpOworICAgIHJldHVybiBCcm9hZGNhc3QobWFza2VkLCBrTWFza1dpZHRoKTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCBQYWNrKHVpbnQ4X3QgdikgeworICAgIHVpbnQzMl90IHNoaWZ0ZWQgPSBTaGlmdFJpZ2h0KHYsIGtQYWNrU2hpZnQpOworICAgIHVpbnQzMl90IHBhY2tlZCA9IHNoaWZ0ZWQgJiBrTWFzazsKKyAgICByZXR1cm4gcGFja2VkOworICB9Cit9OworLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBoYW5kbGVzIG1pc3NpbmcgY29sb3IgYW5kIGFscGhhIGNvbXBvbmVudHMsIGJ5IHVzaW5nIHRoZQorLy8gdmFsdWUga0RlZmF1bHQgd2hlbiB1bnBhY2tpbmcuIFdoZW4gcGFja2luZyBhIHZhbHVlLCBub3RoaW5nIGlzIHdyaXR0ZW4uCisvLyBTZWUgZXNfZnVsbF9zcGVjMS4xLjEyLnBkZiBzZWN0aW9uIDMuNiAiRmluYWwgRXhwYW5zaW9uIHRvIFJHQkEiCit0ZW1wbGF0ZSA8dWludDhfdCBrRGVmYXVsdD4gc3RydWN0IFBhY2tlZENvbXBvbmVudDwwLCBrRGVmYXVsdD4geworICBzdGF0aWMgdWludDhfdCBVbnBhY2sodWludDMyX3QgcHYpIHsKKyAgICByZXR1cm4ga0RlZmF1bHQ7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QgUGFjayh1aW50OF90IHYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKworLy8gRGVmaW5lcyB0aGUgb3JkZXIgb2YgYnl0ZXMgaW4gYW4gTiBieXRlIGludGVnZXIgZm9yIGEgTGl0dGxlIEVuZGlhbiAoTEUpLCBCaWcKKy8vIEVuZGlhbiAoQkUpLCB0aGUgY3VycmVudCAoTmF0aXZlKSBhcmNoaXRlY3R1cmUuCisvLworLy8gQWxzbyBkZWZpbmVzIFN3YXBCRSB0byBlbnN1cmUgYW4gaW50ZWdlciB2YWx1ZSBpcyBpbiBCaWcgRW5kaWFuIG9yZGVyLgorc3RydWN0IE1lbW9yeTJCeXRlRm9ybWF0TEUgeworICB0eXBlZGVmIFBhY2tlZENvbXBvbmVudDwweDAwMDBmZiwgMD4gQzA7CisgIHR5cGVkZWYgUGFja2VkQ29tcG9uZW50PDB4MDBmZjAwLCAwPiBDMTsKK307CisKK3N0cnVjdCBNZW1vcnkyQnl0ZUZvcm1hdEJFIHsKKyAgdHlwZWRlZiBQYWNrZWRDb21wb25lbnQ8MHgwMGZmMDAsIDA+IEMwOworICB0eXBlZGVmIFBhY2tlZENvbXBvbmVudDwweDAwMDBmZiwgMD4gQzE7Cit9OworCit1aW50MzJfdCBTd2FwRW5kaWFuKHVpbnQzMl90IHYpIHsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgcmVzdWx0IHw9ICh2ID4+IDI0KSAmIDB4MDAwMDAwZmY7CisgIHJlc3VsdCB8PSAodiA+PiAgOCkgJiAweDAwMDBmZjAwOworICByZXN1bHQgfD0gKHYgPDwgIDgpICYgMHgwMGZmMDAwMDsKKyAgcmVzdWx0IHw9ICh2IDw8IDI0KSAmIDB4ZmYwMDAwMDA7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBfX0JZVEVfT1JERVIKKyAgICAjIGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyAgICB0eXBlZGVmIE1lbW9yeTJCeXRlRm9ybWF0TEUgTWVtb3J5MkJ5dGVGb3JtYXROYXRpdmU7CisKKyAgICB1aW50MzJfdCBTd2FwQkUodWludDMyX3QgdikgeworICAgICAgICByZXR1cm4gU3dhcEVuZGlhbih2KTsKKyAgICB9CisKKyAgICAjIGVsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorICAgIHR5cGVkZWYgTWVtb3J5MkJ5dGVGb3JtYXRCRSBNZW1vcnkyQnl0ZUZvcm1hdE5hdGl2ZTsKKworICAgIHVpbnQzMl90IFN3YXBCRSh1aW50MzJfdCB2KSB7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICAjIGVsc2UKKyAgICAjICBlcnJvciBVbmtub3duIGVuZGlhbgorICAgICMgZW5kaWYKKyAgICAjZWxzZQorICAgICMgIGVycm9yIFVua25vd24gZW5kaWFuCisjZW5kaWYgLyogX19CWVRFX09SREVSICovCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdG9yYWdlSW50LCB1aW50MzJfdCBrUmVkTWFzaywgdWludDMyX3Qga0dyZWVuTWFzaywKKyAgICAgICAgIHVpbnQzMl90IGtCbHVlTWFzaywgdWludDMyX3Qga0FscGhhTWFzaz4KK3N0cnVjdCBQYWNrZWRGb3JtYXQgeworICB0eXBlZGVmIFN0b3JhZ2VJbnQgU3RvcmFnZVR5cGU7CisgIHR5cGVkZWYgUGFja2VkQ29tcG9uZW50PGtSZWRNYXNrLCAwPiBSZWQ7CisgIHR5cGVkZWYgUGFja2VkQ29tcG9uZW50PGtHcmVlbk1hc2ssIDA+IEdyZWVuOworICB0eXBlZGVmIFBhY2tlZENvbXBvbmVudDxrQmx1ZU1hc2ssIDA+IEJsdWU7CisgIHR5cGVkZWYgUGFja2VkQ29tcG9uZW50PGtBbHBoYU1hc2ssIDI1NT4gQWxwaGE7Cit9OworCitib29sIElzQWxpZ25lZChjb25zdCB2b2lkKiBwdHIsIGludCBhbGlnbikgeworICBpZiAoYWxpZ24gPT0gMSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKGFsaWduID09IDMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiAoKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHB0cikgJiAoYWxpZ24gLSAxKSkgPT0gMCk7Cit9OworCisvLyBEZWZpbmVzIHRoZSBpbnRlcm1lZGlhdGUgZm9ybWF0IHVzZWQgd2hlbiBlbmNvZGluZyBhbmQgZGVjb2RpbmcgYWxsIG90aGVyCisvLyBmb3JtYXRzLgorLy8KKy8vIFRoaXMgZm9ybWF0IGFsbG93IHRoZSBkYXRhIGNvbnZlcnNpb24gdG8gYW55IGZvcm1hdCBieSBvbmx5IHN1cHBvcnRpbmcgTgorLy8gY29udmVyc2lvbnMgdG8vZnJvbSB0aGlzIGludGVybWVkaWF0ZSBmb3JtYXQgcmF0aGVyIHRoYW4gdGhlIE4qTiBjb252ZXJzaW9ucworLy8gZGlyZWN0bHkgYmV0d2VlbiBldmVyeSBwb3NzaWJsZSBmb3JtYXQuCisvLworLy8gQWxsIG1lbW9yeSBhY2Nlc3MgdXNpbmcgdGhpcyBmb3JtYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGFsaWduZWQuCisKK3R5cGVkZWYgUGFja2VkRm9ybWF0PHVpbnQzMl90LCAweGZmMDAwMDAwLCAweDAwZmYwMDAwLCAweDAwMDBmZjAwLCAweDAwMDAwMGZmPgorICAgIEludGVybWVkaWF0ZUZvcm1hdDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY0YsIHR5cGVuYW1lIERzdEY+CitzdHJ1Y3QgQ29udmVydCB7CisgIHN0YXRpYyB0eXBlbmFtZSBEc3RGOjpTdG9yYWdlVHlwZSBBcHBseSh0eXBlbmFtZSBTcmNGOjpTdG9yYWdlVHlwZSB2KSB7CisgICAgdHlwZW5hbWUgRHN0Rjo6U3RvcmFnZVR5cGUgcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgfD0gRHN0Rjo6UmVkOjpQYWNrKFNyY0Y6OlJlZDo6VW5wYWNrKHYpKTsKKyAgICByZXN1bHQgfD0gRHN0Rjo6R3JlZW46OlBhY2soU3JjRjo6R3JlZW46OlVucGFjayh2KSk7CisgICAgcmVzdWx0IHw9IERzdEY6OkJsdWU6OlBhY2soU3JjRjo6Qmx1ZTo6VW5wYWNrKHYpKTsKKyAgICByZXN1bHQgfD0gRHN0Rjo6QWxwaGE6OlBhY2soU3JjRjo6QWxwaGE6OlVucGFjayh2KSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFAsIEdMZW51bSBGLCBHTGVudW0gVD4KK3N0cnVjdCBQYWNrZWRTaG9ydENvZGVjIHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZSA9IDI7CisgIHN0YXRpYyBjb25zdCBHTGVudW0ga0Zvcm1hdCA9IEY7CisgIHN0YXRpYyBjb25zdCBHTGVudW0ga1R5cGUgPSBUOworCisgIHN0YXRpYyB1aW50MzJfdCBSZWFkQWxpZ25lZChjb25zdCB1aW50OF90KiBwKSB7CisgICAgcmV0dXJuIENvbnZlcnQ8UCwgSW50ZXJtZWRpYXRlRm9ybWF0Pjo6QXBwbHkoCisgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4ocCkpOworICB9CisKKyAgc3RhdGljIHZvaWQgV3JpdGVBbGlnbmVkKHVpbnQ4X3QqIHAsIHVpbnQzMl90IHYpIHsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHApID0gQ29udmVydDxJbnRlcm1lZGlhdGVGb3JtYXQsIFA+OjpBcHBseSh2KTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCBSZWFkVW5hbGlnbmVkKGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgICB1aW50MTZfdCBwdiA9IE1lbW9yeTJCeXRlRm9ybWF0TmF0aXZlOjpDMDo6UGFjaygqcCsrKTsKKyAgICBwdiB8PSBNZW1vcnkyQnl0ZUZvcm1hdE5hdGl2ZTo6QzE6OlBhY2soKnArKyk7CisgICAgcmV0dXJuIENvbnZlcnQ8UCwgSW50ZXJtZWRpYXRlRm9ybWF0Pjo6QXBwbHkocHYpOworICB9CisKKyAgc3RhdGljIHZvaWQgV3JpdGVVbmFsaWduZWQodWludDhfdCogcCwgdWludDMyX3QgdikgeworICAgIHVpbnQxNl90IHB2ID0gQ29udmVydDxJbnRlcm1lZGlhdGVGb3JtYXQsIFA+OjpBcHBseSh2KTsKKyAgICAqcCsrID0gTWVtb3J5MkJ5dGVGb3JtYXROYXRpdmU6OkMwOjpVbnBhY2socHYpOworICAgICpwKysgPSBNZW1vcnkyQnl0ZUZvcm1hdE5hdGl2ZTo6QzE6OlVucGFjayhwdik7CisgIH0KK307CisKKy8vIEluIGFkZGl0aW9uIHRvIHRoZSBwYWNrZWQgcGl4ZWwgdHlwZXMsIE9wZW5HTCBoYXMgYSBub3Rpb24gb2Ygc3RvcmluZyB0aGUKKy8vIHBpeGVscyBhcyBhIHNpbXBsZSBzZXF1ZW5jZSBvZiBieXRlcyBpbiBtZW1vcnkuIFRvIHJlYWQgaXQsIHlvdSBqdXN0IHJlYWQgdGhlCisvLyBieXRlcyBpbiBzZXF1ZW5jZSBvdXQgb2YgbWVtb3J5LiBUaGUgZmlyc3QgYnl0ZSByZWFkIGlzIHRoZSBmaXJzdCBjb21wb25lbnQsCisvLyBhbmQgc28gb24uCisvLworLy8gVGhlIG51bWJlciBhbmQgbWVhbmluZyBvZiBlYWNoIGNvbXBvbmVudCBpcyBkZWZpbmVkIGJ5IGZvcm1hdCBwYXJhbWV0ZXIuIEZvcgorLy8gZXhhbXBsZSwgaWYgdGhlIGZvcm1hdCBpcyBSR0JBLCB0aGVuIHRoZXJlIGFyZSBmb3IgY29tcG9uZW50cywgYW5kIHRoZSBmaXJzdAorLy8gY29tcG9uZW50IGlzIFIgKFJlZCksIGFuZCB0aGUgbGFzdCBpcyBBLgorLy8KKy8vIE5vdGUgdGhlcmUgYXJlIG5vIHBhZGRpbmcvYWxpZ25tZW50IGJ5dGVzLiBGb3IgdGhlIFJHQiBmb3JtYXQgZm9yIGV4YW1wbGUsCisvLyB0aGUgZGF0YSBmb3IgdGhlIFIgY29tcG9uZW50IG9mIHRoZSBuZXh0IHBpeGVsIGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisvLyBCIGNvbXBvbmVudCBmb3IgdGhlIHByZXZpb3VzIHBpeGVsLgorCit0ZW1wbGF0ZSA8Ym9vbCBrSGFzUmVkLCBib29sIGtIYXNHcmVlbiwgYm9vbCBrSGFzQmx1ZSwgYm9vbCBrSGFzTHVtaW5hbmNlLAorICAgICAgICAgYm9vbCBrSGFzQWxwaGEsIEdMZW51bSBGPgorc3RydWN0IEJ5dGVzdHJlYW1Db2RlYyB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NpemUgPQorICAgIGtIYXNSZWQgKyBrSGFzR3JlZW4gKyBrSGFzQmx1ZSArIGtIYXNMdW1pbmFuY2UgKyBrSGFzQWxwaGE7CisgIHN0YXRpYyBjb25zdCBHTGVudW0ga0Zvcm1hdCA9IEY7CisgIHN0YXRpYyBjb25zdCBHTGVudW0ga1R5cGUgPSBHTF9VTlNJR05FRF9CWVRFOworCisgIHN0YXRpYyB1aW50MzJfdCBSZWFkVW5hbGlnbmVkKGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgICAvLyBCeXRlIHN0cmVhbSBpcyBhbHdheXMgYWxpZ25lZC4KKyAgICByZXR1cm4gUmVhZEFsaWduZWQocCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBXcml0ZVVuYWxpZ25lZCh1aW50OF90KiBwLCB1aW50MzJfdCB2KSB7CisgICAgLy8gQnl0ZSBzdHJlYW0gaXMgYWx3YXlzIGFsaWduZWQuCisgICAgV3JpdGVBbGlnbmVkKHAsIHYpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IFJlYWRBbGlnbmVkKGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgICB1aW50MzJfdCB2ID0gMDsKKyAgICBpZiAoa0hhc1JlZCkKKyAgICAgIHYgfD0gSW50ZXJtZWRpYXRlRm9ybWF0OjpSZWQ6OlBhY2soKnArKyk7CisgICAgaWYgKGtIYXNHcmVlbikKKyAgICAgIHYgfD0gSW50ZXJtZWRpYXRlRm9ybWF0OjpHcmVlbjo6UGFjaygqcCsrKTsKKyAgICBpZiAoa0hhc0JsdWUpCisgICAgICB2IHw9IEludGVybWVkaWF0ZUZvcm1hdDo6Qmx1ZTo6UGFjaygqcCsrKTsKKyAgICBpZiAoa0hhc0x1bWluYW5jZSkgeworICAgICAgLy8gTm90ZTogU2VlIGVzX2Z1bGxfc3BlY18xLjEuMTIucGRmIHNlY3Rpb24gMy42LCAiQ29udmVyc2lvbiB0bworICAgICAgLy8gUkdCIi4KKyAgICAgIHVpbnQ4X3QgbHVtaW5hbmNlID0gKnArKzsKKyAgICAgIHYgfD0gSW50ZXJtZWRpYXRlRm9ybWF0OjpSZWQ6OlBhY2sobHVtaW5hbmNlKTsKKyAgICAgIHYgfD0gSW50ZXJtZWRpYXRlRm9ybWF0OjpCbHVlOjpQYWNrKGx1bWluYW5jZSk7CisgICAgICB2IHw9IEludGVybWVkaWF0ZUZvcm1hdDo6R3JlZW46OlBhY2sobHVtaW5hbmNlKTsKKyAgICB9CisgICAgaWYgKGtIYXNBbHBoYSkKKyAgICAgIHYgfD0gSW50ZXJtZWRpYXRlRm9ybWF0OjpBbHBoYTo6UGFjaygqcCsrKTsKKyAgICBlbHNlCisgICAgICB2IHw9IEludGVybWVkaWF0ZUZvcm1hdDo6QWxwaGE6OlBhY2soMjU1KTsKKyAgICByZXR1cm4gdjsKKyAgfQorCisKKyAgc3RhdGljIHZvaWQgV3JpdGVBbGlnbmVkKHVpbnQ4X3QqIHAsIHVpbnQzMl90IHYpIHsKKyAgICBpZiAoa0hhc1JlZCkKKyAgICAgICpwKysgPSBJbnRlcm1lZGlhdGVGb3JtYXQ6OlJlZDo6VW5wYWNrKHYpOworICAgIGlmIChrSGFzR3JlZW4pCisgICAgICAqcCsrID0gSW50ZXJtZWRpYXRlRm9ybWF0OjpHcmVlbjo6VW5wYWNrKHYpOworICAgIGlmIChrSGFzQmx1ZSkKKyAgICAgICpwKysgPSBJbnRlcm1lZGlhdGVGb3JtYXQ6OkJsdWU6OlVucGFjayh2KTsKKyAgICBpZiAoa0hhc0x1bWluYW5jZSkKKyAgICAgIC8vIE5vdGU6IGVzX2Z1bGxfc3BlY18xLjEuMTIucGRmIHNlY3Rpb24gMy43LjEgdGFibGUgMy44LiBnbGVzIHVzZXMgcmVkCisgICAgICAvLyBhcyBsdW1pbmFuY2UuCisgICAgICAqcCsrID0gSW50ZXJtZWRpYXRlRm9ybWF0OjpSZWQ6OlVucGFjayh2KTsKKyAgICBpZiAoa0hhc0FscGhhKQorICAgICAgKnArKyA9IEludGVybWVkaWF0ZUZvcm1hdDo6QWxwaGE6OlVucGFjayh2KTsKKyAgfQorfTsKKworLy8gQXMgYSBzcGVjaWFsIG9wdGltaXphdGlvbiBmb3IgUkdCQSBieXRlIHN0cmVhbXMsIGFsbG93IHRoZW0gdG8gYmUKKy8vIHJlYWQgYW5kIHdyaXR0ZW4gZGlyZWN0bHkgb3V0IG9mIG1lbW9yeSBhcyBhIHN0cmVhbSBvZiB1aW50MzJfdCBpbnN0ZWFkLgorLy8gSG93ZXZlciB0aGlzIG1heSBtZWFuIHRoYXQgdGhlIGJ5dGVzIG5lZWQgdG8gYmUgc3dhcHBlZCB0byBtYXRjaCwgYW5kIGl0IGFsc28KKy8vIHJlcXVpcmVzIHRoZSBtZW1vcnkgdG8gYmUgYWxpZ25lZC4KKy8vCisvLyBOb3RlOiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBJbnRlcm1lZGlhdGVGb3JtYXQgaXMgZXF1aXZhbGVudCB0byB0aGlzCisvLyBmb3JtYXQgYWZ0ZXIgY29ycmVjdGluZyBmb3IgYW55IGVuZGlhbiBkaWZmZXJlbmNlcy4KKworc3RydWN0IENvZGVjUmdiYSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1NpemUgPSA0OworICBzdGF0aWMgY29uc3QgR0xlbnVtIGtGb3JtYXQgPSBHTF9SR0JBOworICBzdGF0aWMgY29uc3QgR0xlbnVtIGtUeXBlID0gR0xfVU5TSUdORURfQllURTsKKworICAvLyBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIEJ5dGVzdHJlYW1Db2RlYyBmdW5jdGlvbmFsaXR5IGZvciB0aGUgdW5hbGlnbmVkCisgIC8vIGNhc2UsIHdoaWxlIHNwZWNpYWxpemluZyBmb3IgdGhlIGFsaWduZWQgY2FzZS4KKyAgdHlwZWRlZiBCeXRlc3RyZWFtQ29kZWM8dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIEdMX1JHQkE+IFVuYWxpZ25lZDsKKworICBzdGF0aWMgdWludDMyX3QgUmVhZFVuYWxpZ25lZChjb25zdCB1aW50OF90KiBwKSB7CisgICAgcmV0dXJuIFVuYWxpZ25lZDo6UmVhZFVuYWxpZ25lZChwKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFdyaXRlVW5hbGlnbmVkKHVpbnQ4X3QqIHAsIHVpbnQzMl90IHYpIHsKKyAgICBVbmFsaWduZWQ6OldyaXRlVW5hbGlnbmVkKHAsIHYpOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90IFJlYWRBbGlnbmVkKGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgICB1aW50MzJfdCB2ID0gU3dhcEJFKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4ocCkpOworICAgIHJldHVybiB2OworICB9CisKKyAgc3RhdGljIHZvaWQgV3JpdGVBbGlnbmVkKHVpbnQ4X3QqIHAsIHVpbnQzMl90IHYpIHsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KHApID0gU3dhcEJFKHYpOworICB9Cit9OworCisvLyBDb3JlIEdMRVMxIG9ubHkgZGVmaW5lcyBmb3VyIHNpbXBsZSBwYWNrZWQgZm9ybWF0cy4KKy8vIFNlZSBlc19mdWxsX3NwZWMxLjEuMTIucGRmIHNlY3Rpb24gMy42IHRhYmxlIDMuNCB3aGVyZSAiVHlwZSIgaXMKKy8vIFVOU0lHTkVEX0JZVEUuCisKK3R5cGVkZWYgQnl0ZXN0cmVhbUNvZGVjPHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgR0xfUkdCPgorICAgIENvZGVjUmdiOwordHlwZWRlZiBCeXRlc3RyZWFtQ29kZWM8ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgR0xfTFVNSU5BTkNFX0FMUEhBPgorICAgIENvZGVjTHVtaW5hbmNlQWxwaGE7Cit0eXBlZGVmIEJ5dGVzdHJlYW1Db2RlYzxmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgR0xfTFVNSU5BTkNFPgorICAgIENvZGVjTHVtaW5hbmNlOwordHlwZWRlZiBCeXRlc3RyZWFtQ29kZWM8ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIEdMX0FMUEhBPgorICAgIENvZGVjQWxwaGE7CisKKy8vIEZvciB0aGUgcGFja2VkIHBpeGVsIHR5cGVzLCB0aGUgY29tcG9uZW50cyBhcmUgYWx3YXlzIG9yZGVyZWQgZnJvbSB0aGUgbW9zdAorLy8gc2lnbmlmaWNhbnQgYml0cyB0byB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cy4KKy8vCisvLyBGb3IgZXhhbXBsZSwgaWYgdGhlIHR5cGUgaXMgVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdGhlbiB0aGUgZmlyc3QgY29tcG9uZW50CisvLyB3aWxsIGJlIGluIHRoZSB0b3AgZm91ciBiaXRzLCBhbmQgdGhlIGxhc3Qgd2lsbCBiZSBpbiB0aGUgYm90dG9tIGZvdXIgYml0cy4KKy8vCisvLyBUaGUgbWVhbmluZyBvZiBlYWNoIGNvbXBvbmVudCBpcyBkZWZpbmVkIGJ5IGZvcm1hdCBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpZgorLy8gdGhlIGZvcm1hdCBpcyBSR0JBLCB0aGVuIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgUiAoUmVkKSwgYW5kIHRoZSBsYXN0IGlzIEEKKy8vIChBbHBoYSkuCisvLworLy8gQ29yZSBHTEVTMSBvbmx5IGRlZmluZXMgdGhyZWUgc2ltcGxlIHBhY2tlZCBmb3JtYXRzLgorLy8KKy8vIFNlZSBlc19mdWxsX3NwZWMxLjEuMTIucGRmIHNlY3Rpb24gMy42IHRhYmxlIDMuNgorCit0eXBlZGVmIFBhY2tlZEZvcm1hdDx1aW50MTZfdCwgMHhmMDAwLCAweDBmMDAsIDB4MDBmMCwgMHgwMDBmPgorICAgIFBhY2tlZFNob3J0NDQ0NFJnYmE7Cit0eXBlZGVmIFBhY2tlZEZvcm1hdDx1aW50MTZfdCwgMHhmODAwLCAweDA3YzAsIDB4MDAzZSwgMHgwMDAxPgorICAgIFBhY2tlZFNob3J0NTU1MVJnYmE7Cit0eXBlZGVmIFBhY2tlZEZvcm1hdDx1aW50MTZfdCwgMHhmODAwLCAweDA3ZTAsIDB4MDAxZiwgMD4KKyAgICBQYWNrZWRTaG9ydDU2NVJnYjsKKwordHlwZWRlZiBQYWNrZWRTaG9ydENvZGVjPFBhY2tlZFNob3J0NDQ0NFJnYmEsIEdMX1JHQkEsCisgICAgICAgIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ+IENvZGVjUmdiYTQ0NDQ7Cit0eXBlZGVmIFBhY2tlZFNob3J0Q29kZWM8UGFja2VkU2hvcnQ1NTUxUmdiYSwgR0xfUkdCQSwKKyAgICAgICAgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMT4gQ29kZWNSZ2JhNTU1MTsKK3R5cGVkZWYgUGFja2VkU2hvcnRDb2RlYzxQYWNrZWRTaG9ydDU2NVJnYiwgR0xfUkdCLAorICAgICAgICBHTF9VTlNJR05FRF9TSE9SVF81XzZfNT4gQ29kZWNSZ2I1NjU7CisKK30gIC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2NsYXNzIENvbnZlcnRlckJhc2UgeworIHB1YmxpYzoKKyAgQ29udmVydGVyQmFzZShzaXplX3Qgc3JjX2JwcCwgc2l6ZV90IGRzdF9icHApCisgICAgOiBzcmNfYnBwXyhzcmNfYnBwKSwKKyAgICAgIGRzdF9icHBfKGRzdF9icHApIHsKKyAgfQorCisgIHZpcnR1YWwgfkNvbnZlcnRlckJhc2UoKSB7CisgIH0KKworICB2aXJ0dWFsIHZvaWQqIENvbnZlcnQoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3QgYWxpZ25tZW50LAorICAgICAgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIHNyYywgdm9pZCogX19yZXN0cmljdF9fIGRzdCkgY29uc3QgeworICAgIEFMT0dfQVNTRVJUKGFsaWdubWVudCA9PSAxIHx8IGFsaWdubWVudCA9PSAyIHx8CisgICAgICAgICAgICAgICAgYWxpZ25tZW50ID09IDQgfHwgYWxpZ25tZW50ID09IDgpOworICAgIEFMT0dfQVNTRVJUKHNyYyk7CisgICAgQUxPR19BU1NFUlQoZHN0KTsKKyAgICBBTE9HX0FTU0VSVCh3aWR0aCAhPSAwKTsKKyAgICBBTE9HX0FTU0VSVChoZWlnaHQgIT0gMCk7CisKKyAgICBzaXplX3Qgc3JjX3N0cmlkZSA9CisgICAgICAod2lkdGggKiBzcmNfYnBwXyArIGFsaWdubWVudCAtIDEpICYgfihhbGlnbm1lbnQgLSAxKTsKKyAgICAvLyBNYWtlIG91dHB1dCBidWZmZXIgNCBieXRlcyBhbGlnbmVkLgorICAgIHNpemVfdCBkc3Rfc3RyaWRlID0gKHdpZHRoICogZHN0X2JwcF8gKyAzKSAmIH4zOworCisgICAgaWYgKGFsaWdubWVudCA+PSBzcmNfYnBwXyB8fCBJc0FsaWduZWQoc3JjLCBzcmNfYnBwXykpIHsKKyAgICAgIENvbnZlcnRBbGlnbmVkKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgc3JjX3N0cmlkZSwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyYyksCisgICAgICAgICAgZHN0X3N0cmlkZSwgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRzdCkpOworICAgIH0gZWxzZSB7CisgICAgICBDb252ZXJ0VW5hbGlnbmVkKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgc3JjX3N0cmlkZSwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNyYyksCisgICAgICAgICAgZHN0X3N0cmlkZSwgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRzdCkpOworICAgIH0KKyAgICByZXR1cm4gZHN0OworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBDb252ZXJ0QWxpZ25lZChzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICBzaXplX3Qgc3JjX3N0cmlkZSwgY29uc3QgdWludDhfdCogX19yZXN0cmljdF9fIHNyYywKKyAgICAgIHNpemVfdCBkc3Rfc3RyaWRlLCB1aW50OF90KiBfX3Jlc3RyaWN0X18gZHN0KSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIENvbnZlcnRVbmFsaWduZWQoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgc2l6ZV90IHNyY19zdHJpZGUsIGNvbnN0IHVpbnQ4X3QqIF9fcmVzdHJpY3RfXyBzcmMsCisgICAgICBzaXplX3QgZHN0X3N0cmlkZSwgdWludDhfdCogX19yZXN0cmljdF9fIGRzdCkgY29uc3QgPSAwOworCisgIHNpemVfdCBzcmNfYnBwXzsKKyAgc2l6ZV90IGRzdF9icHBfOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY0YsIHR5cGVuYW1lIERzdEY+CitjbGFzcyBPcHRpbWl6ZWRDb252ZXJ0ZXIgOiBwdWJsaWMgQ29udmVydGVyQmFzZSB7CisgcHVibGljOgorICBPcHRpbWl6ZWRDb252ZXJ0ZXIoKSA6IENvbnZlcnRlckJhc2UoU3JjRjo6a1NpemUsIERzdEY6OmtTaXplKSB7fQorCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgQ29udmVydEFsaWduZWQoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgc2l6ZV90IHNyY19zdHJpZGUsIGNvbnN0IHVpbnQ4X3QqIF9fcmVzdHJpY3RfXyBzcmMsCisgICAgICBzaXplX3QgZHN0X3N0cmlkZSwgdWludDhfdCogX19yZXN0cmljdF9fIGRzdCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19uZXh0ID0gc3JjICsgc3JjX3N0cmlkZTsKKyAgICAgIHVpbnQ4X3QqIGRzdF9uZXh0ID0gZHN0ICsgZHN0X3N0cmlkZTsKKyAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICB1aW50MzJfdCB2ID0gU3JjRjo6UmVhZEFsaWduZWQoc3JjKTsKKyAgICAgICAgRHN0Rjo6V3JpdGVBbGlnbmVkKGRzdCwgdik7CisgICAgICAgIHNyYyArPSBTcmNGOjprU2l6ZTsKKyAgICAgICAgZHN0ICs9IERzdEY6OmtTaXplOworICAgICAgfQorICAgICAgc3JjID0gc3JjX25leHQ7CisgICAgICBkc3QgPSBkc3RfbmV4dDsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHZvaWQgQ29udmVydFVuYWxpZ25lZChzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICBzaXplX3Qgc3JjX3N0cmlkZSwgY29uc3QgdWludDhfdCogX19yZXN0cmljdF9fIHNyYywKKyAgICAgIHNpemVfdCBkc3Rfc3RyaWRlLCB1aW50OF90KiBfX3Jlc3RyaWN0X18gZHN0KSBjb25zdCB7CisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgY29uc3QgdWludDhfdCogc3JjX25leHQgPSBzcmMgKyBzcmNfc3RyaWRlOworICAgICAgdWludDhfdCogZHN0X25leHQgPSBkc3QgKyBkc3Rfc3RyaWRlOworICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIHVpbnQzMl90IHYgPSBTcmNGOjpSZWFkVW5hbGlnbmVkKHNyYyk7CisgICAgICAgIERzdEY6OldyaXRlQWxpZ25lZChkc3QsIHYpOworICAgICAgICBzcmMgKz0gU3JjRjo6a1NpemU7CisgICAgICAgIGRzdCArPSBEc3RGOjprU2l6ZTsKKyAgICAgIH0KKyAgICAgIHNyYyA9IHNyY19uZXh0OworICAgICAgZHN0ID0gZHN0X25leHQ7CisgICAgfQorICB9Cit9OworCitjbGFzcyBHZW5lcmFsQ29udmVydGVyIDogcHVibGljIENvbnZlcnRlckJhc2UgeworIHB1YmxpYzoKKyAgdHlwZWRlZiB1aW50MzJfdCAoKlJlYWRGdW5jKShjb25zdCB1aW50OF90ICopOworICB0eXBlZGVmIHZvaWQgKCpXcml0ZUZ1bmMpKHVpbnQ4X3QqLCB1aW50MzJfdCk7CisKKyAgR2VuZXJhbENvbnZlcnRlcigKKyAgICAgIHNpemVfdCBzcmNfYnBwLCBSZWFkRnVuYyByZWFkX2FsaWduZWRfY2IsIFJlYWRGdW5jIHJlYWRfdW5hbGlnbmVkX2NiLAorICAgICAgc2l6ZV90IGRzdF9icHAsIFdyaXRlRnVuYyB3cml0ZV9hbGlnbmVkX2NiKQorICAgIDogQ29udmVydGVyQmFzZShzcmNfYnBwLCBkc3RfYnBwKSwKKyAgICAgIHJlYWRfYWxpZ25lZF9jYl8ocmVhZF9hbGlnbmVkX2NiKSwKKyAgICAgIHJlYWRfdW5hbGlnbmVkX2NiXyhyZWFkX3VuYWxpZ25lZF9jYiksCisgICAgICB3cml0ZV9hbGlnbmVkX2NiXyh3cml0ZV9hbGlnbmVkX2NiKSB7CisgICAgQUxPR19BU1NFUlQocmVhZF9hbGlnbmVkX2NiXyk7CisgICAgQUxPR19BU1NFUlQocmVhZF91bmFsaWduZWRfY2JfKTsKKyAgICBBTE9HX0FTU0VSVCh3cml0ZV9hbGlnbmVkX2NiXyk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIENvbnZlcnRBbGlnbmVkKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgIHNpemVfdCBzcmNfc3RyaWRlLCBjb25zdCB1aW50OF90KiBfX3Jlc3RyaWN0X18gc3JjLAorICAgICAgc2l6ZV90IGRzdF9zdHJpZGUsIHVpbnQ4X3QqIF9fcmVzdHJpY3RfXyBkc3QpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfbmV4dCA9IHNyYyArIHNyY19zdHJpZGU7CisgICAgICB1aW50OF90KiBkc3RfbmV4dCA9IGRzdCArIGRzdF9zdHJpZGU7CisgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgdWludDMyX3QgdiA9IHJlYWRfYWxpZ25lZF9jYl8oc3JjKTsKKyAgICAgICAgd3JpdGVfYWxpZ25lZF9jYl8oZHN0LCB2KTsKKyAgICAgICAgc3JjICs9IHNyY19icHBfOworICAgICAgICBkc3QgKz0gZHN0X2JwcF87CisgICAgICB9CisgICAgICBzcmMgPSBzcmNfbmV4dDsKKyAgICAgIGRzdCA9IGRzdF9uZXh0OworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgdm9pZCBDb252ZXJ0VW5hbGlnbmVkKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgIHNpemVfdCBzcmNfc3RyaWRlLCBjb25zdCB1aW50OF90KiBfX3Jlc3RyaWN0X18gc3JjLAorICAgICAgc2l6ZV90IGRzdF9zdHJpZGUsIHVpbnQ4X3QqIF9fcmVzdHJpY3RfXyBkc3QpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfbmV4dCA9IHNyYyArIHNyY19zdHJpZGU7CisgICAgICB1aW50OF90KiBkc3RfbmV4dCA9IGRzdCArIGRzdF9zdHJpZGU7CisgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgdWludDMyX3QgdiA9IHJlYWRfdW5hbGlnbmVkX2NiXyhzcmMpOworICAgICAgICB3cml0ZV9hbGlnbmVkX2NiXyhkc3QsIHYpOworICAgICAgICBzcmMgKz0gc3JjX2JwcF87CisgICAgICAgIGRzdCArPSBkc3RfYnBwXzsKKyAgICAgIH0KKyAgICAgIHNyYyA9IHNyY19uZXh0OworICAgICAgZHN0ID0gZHN0X25leHQ7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBSZWFkRnVuYyByZWFkX2FsaWduZWRfY2JfOworICBSZWFkRnVuYyByZWFkX3VuYWxpZ25lZF9jYl87CisgIFdyaXRlRnVuYyB3cml0ZV9hbGlnbmVkX2NiXzsKK307CisKK3N0cnVjdCBDb2RlYyB7CisgIEdMZW51bSBmb3JtYXQ7CisgIEdMZW51bSB0eXBlOworICBzaXplX3QgYnBwOworICBHZW5lcmFsQ29udmVydGVyOjpSZWFkRnVuYyByZWFkX2FsaWduZWRfY2I7CisgIEdlbmVyYWxDb252ZXJ0ZXI6OlJlYWRGdW5jIHJlYWRfdW5hbGlnbmVkX2NiOworICBHZW5lcmFsQ29udmVydGVyOjpXcml0ZUZ1bmMgd3JpdGVfYWxpZ25lZF9jYjsKK307CisKKyNkZWZpbmUgQ09ERUNfRU5UUlkoQykgXAorICB7IFwKKyAgICBDOjprRm9ybWF0LCBcCisgICAgQzo6a1R5cGUsIFwKKyAgICBDOjprU2l6ZSwgXAorICAgIEM6OlJlYWRBbGlnbmVkLCBcCisgICAgQzo6UmVhZFVuYWxpZ25lZCwgXAorICAgIEM6OldyaXRlQWxpZ25lZCwgXAorICB9CisKK2NvbnN0IENvZGVjIGNvZGVjc1tdID0geworICBDT0RFQ19FTlRSWShDb2RlY1JnYiksCisgIENPREVDX0VOVFJZKENvZGVjUmdiYSksCisgIENPREVDX0VOVFJZKENvZGVjUmdiYTQ0NDQpLAorICBDT0RFQ19FTlRSWShDb2RlY1JnYmE1NTUxKSwKKyAgQ09ERUNfRU5UUlkoQ29kZWNSZ2I1NjUpLAorICBDT0RFQ19FTlRSWShDb2RlY0x1bWluYW5jZSksCisgIENPREVDX0VOVFJZKENvZGVjTHVtaW5hbmNlQWxwaGEpLAorICBDT0RFQ19FTlRSWShDb2RlY0FscGhhKSwKK307CisKK1RleHR1cmVDb252ZXJ0ZXI6OlRleHR1cmVDb252ZXJ0ZXIoR0xlbnVtIHNyY19mb3JtYXQsIEdMZW51bSBzcmNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGRzdF9mb3JtYXQsIEdMZW51bSBkc3RfdHlwZSkKKyAgOiBjb252ZXJ0ZXJfKE5VTEwpLAorICAgIHNyY19mb3JtYXRfKHNyY19mb3JtYXQpLAorICAgIHNyY190eXBlXyhzcmNfdHlwZSksCisgICAgZHN0X2Zvcm1hdF8oZHN0X2Zvcm1hdCksCisgICAgZHN0X3R5cGVfKGRzdF90eXBlKSB7CisgIEluaXRpYWxpemVDb252ZXJ0ZXIoKTsKK30KKworVGV4dHVyZUNvbnZlcnRlcjo6flRleHR1cmVDb252ZXJ0ZXIoKSB7CisgIGRlbGV0ZSBjb252ZXJ0ZXJfOworfQorCitib29sIFRleHR1cmVDb252ZXJ0ZXI6OklzVmFsaWQoKSBjb25zdCB7CisgIHJldHVybiBjb252ZXJ0ZXJfICE9IE5VTEw7Cit9CisKK3ZvaWQgVGV4dHVyZUNvbnZlcnRlcjo6SW5pdGlhbGl6ZUNvbnZlcnRlcigpIHsKKyAgLy8gR2VuZXJhdGUgb3B0aW1pemVkIGNvbnZlcnRlcnMgZm9yIGZyZXF1ZW50bHkgdXNlZCBjb252ZXJzaW9ucy4KKyNkZWZpbmUgQ09OVkVSVEVSX0VOVFJZKFMsIEQpIFwKKyAgaWYgKHNyY19mb3JtYXRfID09IFM6OmtGb3JtYXQgJiYgc3JjX3R5cGVfID09IFM6OmtUeXBlICYmIFwKKyAgICAgIGRzdF9mb3JtYXRfID09IEQ6OmtGb3JtYXQgJiYgZHN0X3R5cGVfID09IEQ6OmtUeXBlKSB7IFwKKyAgICBjb252ZXJ0ZXJfID0gbmV3IE9wdGltaXplZENvbnZlcnRlcjxTLCBEPigpOyAgICAgICAgICBcCisgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIENPTlZFUlRFUl9FTlRSWShDb2RlY1JnYjU2NSwgQ29kZWNSZ2IpOworICBDT05WRVJURVJfRU5UUlkoQ29kZWNSZ2JhNDQ0NCwgQ29kZWNSZ2JhKTsKKyAgQ09OVkVSVEVSX0VOVFJZKENvZGVjUmdiYTU1NTEsIENvZGVjUmdiYSk7CisKKyAgQ09OVkVSVEVSX0VOVFJZKENvZGVjUmdiYSwgQ29kZWNSZ2IpOworICBDT05WRVJURVJfRU5UUlkoQ29kZWNSZ2JhNDQ0NCwgQ29kZWNSZ2IpOworICBDT05WRVJURVJfRU5UUlkoQ29kZWNSZ2JhNTU1MSwgQ29kZWNSZ2IpOworI3VuZGVmIENPTlZFUlRFUl9FTlRSWQorCisgIGNvbnN0IENvZGVjKiBzcmMgPSBOVUxMOworICBjb25zdCBDb2RlYyogZHN0ID0gTlVMTDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoY29kZWNzKSAvIHNpemVvZihjb2RlY3NbMF0pOyBpKyspIHsKKyAgICBpZiAoIXNyYyAmJiBjb2RlY3NbaV0uZm9ybWF0ID09IHNyY19mb3JtYXRfICYmIGNvZGVjc1tpXS50eXBlID09IHNyY190eXBlXykKKyAgICAgIHNyYyA9ICZjb2RlY3NbaV07CisgICAgaWYgKCFkc3QgJiYgY29kZWNzW2ldLmZvcm1hdCA9PSBkc3RfZm9ybWF0XyAmJiBjb2RlY3NbaV0udHlwZSA9PSBkc3RfdHlwZV8pCisgICAgICBkc3QgPSAmY29kZWNzW2ldOworICAgIGlmIChzcmMgJiYgZHN0KQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHNyYyAmJiBkc3QpIHsKKyAgICBBTE9HVigiKCVzLCAlcykgdG8gKCVzLCAlcykgY29udmVyc2lvbiBpcyBub3Qgb3B0aW1pemVkLiIsCisgICAgICAgIEdldEVudW1TdHJpbmcoc3JjX2Zvcm1hdF8pLCBHZXRFbnVtU3RyaW5nKHNyY190eXBlXyksCisgICAgICAgIEdldEVudW1TdHJpbmcoZHN0X2Zvcm1hdF8pLCBHZXRFbnVtU3RyaW5nKGRzdF90eXBlXykpOworICAgIGNvbnZlcnRlcl8gPSBuZXcgR2VuZXJhbENvbnZlcnRlcihzcmMtPmJwcCwgc3JjLT5yZWFkX2FsaWduZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+cmVhZF91bmFsaWduZWRfY2IsIGRzdC0+YnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPndyaXRlX2FsaWduZWRfY2IpOworICB9Cit9CisKK3ZvaWQqIFRleHR1cmVDb252ZXJ0ZXI6OkNvbnZlcnQoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18gc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBfX3Jlc3RyaWN0X18gZHN0KSBjb25zdCB7CisgIHJldHVybiBjb252ZXJ0ZXJfLT5Db252ZXJ0KHdpZHRoLCBoZWlnaHQsIGFsaWdubWVudCwgc3JjLCBkc3QpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdGV4dHVyZV9jb2RlY3MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RleHR1cmVfY29kZWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyM2QwMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RleHR1cmVfY29kZWNzLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19URVhUVVJFX0NPREVDU19IXworI2RlZmluZSBHUkFQSElDU19UUkFOU0xBVElPTl9HTEVTX1RFWFRVUkVfQ09ERUNTX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKK2NsYXNzIENvbnZlcnRlckJhc2U7CisKK2NsYXNzIFRleHR1cmVDb252ZXJ0ZXIgeworIHB1YmxpYzoKKyAgVGV4dHVyZUNvbnZlcnRlcihHTGVudW0gc3JjX2Zvcm1hdCwgR0xlbnVtIHNyY190eXBlLAorICAgICAgICAgICAgICAgICAgIEdMZW51bSBkc3RfZm9ybWF0LCBHTGVudW0gZHN0X3R5cGUpOworICB+VGV4dHVyZUNvbnZlcnRlcigpOworCisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0OworCisgIHZvaWQqIENvbnZlcnQoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3QgYWxpZ25tZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBzcmMsIHZvaWQqIF9fcmVzdHJpY3RfXyBkc3QpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0aWFsaXplQ29udmVydGVyKCk7CisKKyAgQ29udmVydGVyQmFzZSogY29udmVydGVyXzsKKyAgR0xlbnVtIHNyY19mb3JtYXRfOworICBHTGVudW0gc3JjX3R5cGVfOworICBHTGVudW0gZHN0X2Zvcm1hdF87CisgIEdMZW51bSBkc3RfdHlwZV87CisKKyAgVGV4dHVyZUNvbnZlcnRlcihjb25zdCBUZXh0dXJlQ29udmVydGVyJik7CisgIFRleHR1cmVDb252ZXJ0ZXImIG9wZXJhdG9yPShjb25zdCBUZXh0dXJlQ29udmVydGVyJik7Cit9OworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfVEVYVFVSRV9DT0RFQ1NfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RleHR1cmVfZGF0YS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy90ZXh0dXJlX2RhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTAwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy90ZXh0dXJlX2RhdGEuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgImdsZXMvdGV4dHVyZV9kYXRhLmgiCisKKyNpbmNsdWRlICJjb21tb24vYWxvZy5oIgorCitUZXh0dXJlRGF0YTo6VGV4dHVyZURhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpCisgIDogT2JqZWN0RGF0YShURVhUVVJFLCBuYW1lKSwKKyAgICB0YXJnZXRfKDApLAorICAgIGltYWdlXygwKSwKKyAgICBhdXRvX21pcF9tYXBfKGZhbHNlKSB7CisgIGNyb3BfcmVjdF9bMF0gPSAwOworICBjcm9wX3JlY3RfWzFdID0gMDsKKyAgY3JvcF9yZWN0X1syXSA9IDA7CisgIGNyb3BfcmVjdF9bM10gPSAwOworfQorCitUZXh0dXJlRGF0YTo6flRleHR1cmVEYXRhKCkgeworICBEZXRhY2hFZ2xJbWFnZSgpOworfQorCit2b2lkIFRleHR1cmVEYXRhOjpTZXQoR0xpbnQgbGV2ZWwsIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhcmdldF8gPT0gMCk7CisgIExldmVsSW5mbyYgaW5mbyA9IGxldmVsX21hcF9bbGV2ZWxdOworICBpbmZvLndpZHRoID0gd2lkdGg7CisgIGluZm8uaGVpZ2h0ID0gaGVpZ2h0OworICBpbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgaW5mby50eXBlID0gdHlwZTsKK30KKwordm9pZCBUZXh0dXJlRGF0YTo6QmluZChHTGVudW0gdGFyZ2V0LCBHTGludCBtYXhfbGV2ZWxzKSB7CisgIGlmICh0YXJnZXRfID09IDApIHsKKyAgICB0YXJnZXRfID0gdGFyZ2V0OworICAgIGxldmVsX21hcF8ucmVzaXplKG1heF9sZXZlbHMpOworICB9Cit9CisKK3ZvaWQgVGV4dHVyZURhdGE6OkF0dGFjaEVnbEltYWdlKEVnbEltYWdlUHRyIGltYWdlKSB7CisgIGltYWdlXyA9IGltYWdlOworICBsZXZlbF9tYXBfWzBdLndpZHRoID0gaW1hZ2UtPndpZHRoOworICBsZXZlbF9tYXBfWzBdLmhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CisgIGxldmVsX21hcF9bMF0uZm9ybWF0ID0gaW1hZ2UtPmZvcm1hdDsKK30KKwordm9pZCBUZXh0dXJlRGF0YTo6RGV0YWNoRWdsSW1hZ2UoKSB7CisgIGltYWdlXyA9IE5VTEw7CisgIHRhcmdldF8gPSBHTF9URVhUVVJFXzJEOworfQorCitib29sIFRleHR1cmVEYXRhOjpJc0VnbEltYWdlQXR0YWNoZWQoKSBjb25zdCB7CisgIHJldHVybiBpbWFnZV8gIT0gTlVMTDsKK30KKworY29uc3QgRWdsSW1hZ2VQdHImIFRleHR1cmVEYXRhOjpHZXRBdHRhY2hlZEVnbEltYWdlKCkgY29uc3QgeworICByZXR1cm4gaW1hZ2VfOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdGV4dHVyZV9kYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy90ZXh0dXJlX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmNlZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdGV4dHVyZV9kYXRhLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfVEVYVFVSRV9EQVRBX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfVEVYVFVSRV9EQVRBX0hfCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZ2xlcy9lZ2xfaW1hZ2UuaCIKKyNpbmNsdWRlICJnbGVzL29iamVjdF9kYXRhLmgiCisKK2NsYXNzIFRleHR1cmVEYXRhIDogcHVibGljIE9iamVjdERhdGEgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGV4dHVyZURhdGEoT2JqZWN0TG9jYWxOYW1lIG5hbWUpOworICB2aXJ0dWFsIH5UZXh0dXJlRGF0YSgpOworCisgIHZvaWQgQmluZChHTGVudW0gdGFyZ2V0LCBHTGludCBtYXhfbGV2ZWxzKTsKKyAgdm9pZCBTZXQoR0xpbnQgbGV2ZWwsIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xlbnVtIGZvcm1hdCwKKyAgICAgICAgICAgR0xlbnVtIHR5cGUpOworCisgIHZvaWQgQXR0YWNoRWdsSW1hZ2UoRWdsSW1hZ2VQdHIgaW1hZ2UpOworICB2b2lkIERldGFjaEVnbEltYWdlKCk7CisgIGJvb2wgSXNFZ2xJbWFnZUF0dGFjaGVkKCkgY29uc3Q7CisgIGNvbnN0IEVnbEltYWdlUHRyJiBHZXRBdHRhY2hlZEVnbEltYWdlKCkgY29uc3Q7CisKKyAgYm9vbCBJc0F1dG9NaXBtYXAoKSBjb25zdCB7IHJldHVybiBhdXRvX21pcF9tYXBfOyB9CisgIHZvaWQgU2V0QXV0b01pcG1hcChib29sIHJlcSkgeyBhdXRvX21pcF9tYXBfID0gcmVxOyB9CisKKyAgdm9pZCBTZXRDcm9wUmVjdChjb25zdCBHTGludCogY3JvcF9yZWN0KSB7CisgICAgY3JvcF9yZWN0X1swXSA9IGNyb3BfcmVjdFswXTsKKyAgICBjcm9wX3JlY3RfWzFdID0gY3JvcF9yZWN0WzFdOworICAgIGNyb3BfcmVjdF9bMl0gPSBjcm9wX3JlY3RbMl07CisgICAgY3JvcF9yZWN0X1szXSA9IGNyb3BfcmVjdFszXTsKKyAgfQorICBjb25zdCBHTGludCogR2V0Q3JvcFJlY3QoKSBjb25zdCB7IHJldHVybiBjcm9wX3JlY3RfOyB9CisKKyAgR0xlbnVtIEdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIHRhcmdldF87IH0KKyAgR0x1aW50IEdldFdpZHRoKGludCBsZXZlbCA9IDApIGNvbnN0IHsgcmV0dXJuIGxldmVsX21hcF9bbGV2ZWxdLndpZHRoOyB9CisgIEdMdWludCBHZXRIZWlnaHQoaW50IGxldmVsID0gMCkgY29uc3QgeyByZXR1cm4gbGV2ZWxfbWFwX1tsZXZlbF0uaGVpZ2h0OyB9CisgIEdMZW51bSBHZXRUeXBlKGludCBsZXZlbCA9IDApIGNvbnN0IHsgcmV0dXJuIGxldmVsX21hcF9bbGV2ZWxdLnR5cGU7IH0KKyAgR0xlbnVtIEdldEZvcm1hdChpbnQgbGV2ZWwgPSAwKSBjb25zdCB7IHJldHVybiBsZXZlbF9tYXBfW2xldmVsXS5mb3JtYXQ7IH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBMZXZlbEluZm8geworICAgIExldmVsSW5mbygpIDogZm9ybWF0KDApLCB0eXBlKDApLCB3aWR0aCgwKSwgaGVpZ2h0KDApIHt9CisKKyAgICBHTGVudW0gZm9ybWF0OworICAgIEdMZW51bSB0eXBlOworICAgIEdMdWludCB3aWR0aDsKKyAgICBHTHVpbnQgaGVpZ2h0OworICB9OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPExldmVsSW5mbz4gTGV2ZWxNYXA7CisKKyAgR0xlbnVtIHRhcmdldF87CisgIEVnbEltYWdlUHRyIGltYWdlXzsKKyAgTGV2ZWxNYXAgbGV2ZWxfbWFwXzsKKyAgYm9vbCBhdXRvX21pcF9tYXBfOworICBHTGludCBjcm9wX3JlY3RfWzRdOworCisgIFRleHR1cmVEYXRhKGNvbnN0IFRleHR1cmVEYXRhJik7CisgIFRleHR1cmVEYXRhJiBvcGVyYXRvcj0oVGV4dHVyZURhdGEmKTsKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6c3A8VGV4dHVyZURhdGE+IFRleHR1cmVEYXRhUHRyOworCisjZW5kaWYgIC8vIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfVEVYVFVSRV9EQVRBX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy90cmFuc2xhdG9yX2ludGVyZmFjZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy90cmFuc2xhdG9yX2ludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2NWI0OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3RyYW5zbGF0b3JfaW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgImdsZXNfY29udGV4dC5oIgorI2luY2x1ZGUgImVnbF9pbWFnZS5oIgorI2luY2x1ZGUgIkdMRVMvZ2xleHQuaCIKKworI2luY2x1ZGUgImNvbW1vbi9kbG9nLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJnbGVzL21hY3Jvcy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlICJHTEVTMTJUcmFuc2xhdG9yL3VuZGVybHlpbmdfYXBpcy5oIgorI2luY2x1ZGUgIkdMRVMxMlRyYW5zbGF0b3IvYW5nbGVfZ2xlczIuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIEludGVyZmFjZSB0byBlbXVsYXRvcidzIGxpYk9wZW5nbFJlbmRlci4KKy8vIHRyYW5zbGF0b3JfaW50ZXJmYWNlIHByb3ZpZGVzIGFsbCB0aGUgZXNzZW50aWFsIGZ1bmN0aW9ucyBmb3IgcHJvcGVybHkKKy8vIHVzaW5nIHRoZSB1bmRlcmx5aW5nIEVHTCArIEdMRVN2MiBsaWJyYXJpZXMuCisvLyBUaGUgaW5mb3JtYXRpb24gcmVxdWVzdGVkIGJ5IHRoZXNlIGludGVyZmFjZSBmdW5jdGlvbnMKKy8vIG11c3QgYmUgYXZhaWxhYmxlIHRvIGxpYk9wZW5nbFJlbmRlci4KKworLy8gVGhlIGZpcnN0IHBhcnQgaXMgaGFuZGxpbmcgYWxsIHRocmVhZC1sb2NhbCBpbmZvLgorLy8gRWFjaCBHTEVTdjEgY29udGV4dCByZXF1ZXN0ZWQgYnkgdGhlIGd1ZXN0IHdpbGwgc3Bhd24gYSB0aHJlYWQtbG9jYWwKKy8vIEdsZXNDb250ZXh0KiBvYmplY3QgdGhhdCB0cmFja3MgYWxsIEdMRVN2MS0+MiB0cmFuc2xhdGlvbiBzdGF0ZS4KKy8vIEdMRVMxMlRocmVhZEluZm8gYW5kIFRocmVhZFN0b3JlL0xhenlJbnN0YW5jZSBjYXB0dXJlIHRoaXMuCisKK2NsYXNzIEdMRVMxMlRocmVhZEluZm8geworcHVibGljOgorICAgIEdMRVMxMlRocmVhZEluZm8oKTsKKyAgICB+R0xFUzEyVGhyZWFkSW5mbygpOworICAgIHN0YXRpYyBHTEVTMTJUaHJlYWRJbmZvKiBnZXQoKTsKKyAgICBHbGVzQ29udGV4dCogY29udGV4dDsKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6YmFzZTo6VGhyZWFkU3RvcmU8R0xFUzEyVGhyZWFkSW5mbz4gRW11bGF0ZWRHTEVTMVRocmVhZEluZm87CisKK3N0YXRpYyA6OmVtdWdsOjpMYXp5SW5zdGFuY2U8RW11bGF0ZWRHTEVTMVRocmVhZEluZm8+IHNHTEVTMTJUaHJlYWRJbmZvID0gTEFaWV9JTlNUQU5DRV9JTklUOworCitHTEVTMTJUaHJlYWRJbmZvOjpHTEVTMTJUaHJlYWRJbmZvKCkgeworICAgIHNHTEVTMTJUaHJlYWRJbmZvLT5zZXQodGhpcyk7CisgICAgY29udGV4dCA9IE5VTEw7Cit9CisKK0dMRVMxMlRocmVhZEluZm86On5HTEVTMTJUaHJlYWRJbmZvKCkgeworICAgIHNHTEVTMTJUaHJlYWRJbmZvLT5zZXQoTlVMTCk7Cit9CisKK0dMRVMxMlRocmVhZEluZm8qIEdMRVMxMlRocmVhZEluZm86OmdldCgpIHsKKyAgICBHTEVTMTJUaHJlYWRJbmZvKiBjdXJyZW50ID0gc3RhdGljX2Nhc3Q8R0xFUzEyVGhyZWFkSW5mbyo+KHNHTEVTMTJUaHJlYWRJbmZvLT5nZXQoKSk7CisgICAgaWYgKCFjdXJyZW50KSB7IGN1cnJlbnQgPSBuZXcgR0xFUzEyVGhyZWFkSW5mbzsgfQorICAgIHJldHVybiBjdXJyZW50OworfQorCisvLyBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGZvciB0aGUgdHJhbnNsYXRvciBpbnRlcmZhY2UKKy8vIGFuZCB0aHJvdWdob3V0IHRoZSBHTEVTdjEtPjIgdHJhbnNsYXRvciBhcyB3ZWxsLgorCitHbGVzQ29udGV4dCogQ3JlYXRlR2xlczFDb250ZXh0KEdsZXNDb250ZXh0KiBzaGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVW5kZXJseWluZ0FwaXMqIHVuZGVybHlpbmdfYXBpcykgeworICAgIHJldHVybiBuZXcgR2xlc0NvbnRleHQoMCwga0dsZXMxMSwgc2hhcmUsIE5VTEwsIHVuZGVybHlpbmdfYXBpcyk7Cit9CisKK0dsZXNDb250ZXh0KiBHZXRDdXJyZW50R2xlc0NvbnRleHQoKSB7CisgICAgRExPRygiY2FsbCIpOworCisgICAgR0xFUzEyVGhyZWFkSW5mbyogcmVzID0gR0xFUzEyVGhyZWFkSW5mbzo6Z2V0KCk7CisgICAgRExPRygicmVzPSVwIHJlc2N4dD0lcFxuIiwgcmVzLCByZXMtPmNvbnRleHQpOworICAgIHJldHVybiByZXMtPmNvbnRleHQ7Cit9CisKK3ZvaWQgU2V0Q3VycmVudEdsZXNDb250ZXh0KEdsZXNDb250ZXh0KiBjeHRfaW4pIHsKKyAgICBHTEVTMTJUaHJlYWRJbmZvOjpnZXQoKS0+Y29udGV4dCA9IGN4dF9pbjsKK30KKworLy8gVGhlIGFjdHVhbCB0cmFuc2xhdG9yIGludGVyZmFjZSBlbnRyaWVzLgorCitUUkFOU0xBVE9SX0FQSUVOVFJZKHZvaWQqLCBjcmVhdGVfdW5kZXJseWluZ19hcGkpIHsKKyNpZiBHTEVTMTJUUl9ETE9HCisgICAgVkVSQk9TRV9FTkFCTEUoZ2xlczFlbXUpOworI2VuZGlmCisgICAgVW5kZXJseWluZ0FwaXMqIGNvbnRhaW5lciA9IG5ldyBVbmRlcmx5aW5nQXBpczsKKyAgICBjb250YWluZXItPmFuZ2xlID0gbmV3IEFOR0xFX0dMRVMyOworICAgIHJldHVybiAodm9pZCopY29udGFpbmVyOworfQorCitUUkFOU0xBVE9SX0FQSUVOVFJZKHZvaWQqLCBjcmVhdGVfZ2xlczFfY29udGV4dCwgdm9pZCogc2hhcmUsIGNvbnN0IHZvaWQqIHVuZGVybHlpbmdfYXBpcykgeworICAgIHJldHVybiAodm9pZCopQ3JlYXRlR2xlczFDb250ZXh0KChHbGVzQ29udGV4dCopc2hhcmUsIChjb25zdCBVbmRlcmx5aW5nQXBpcyopdW5kZXJseWluZ19hcGlzKTsKK30KKworVFJBTlNMQVRPUl9BUElFTlRSWSh2b2lkKiwgZ2V0X2N1cnJlbnRfZ2xlc19jb250ZXh0KSB7CisgICAgcmV0dXJuICh2b2lkKilHZXRDdXJyZW50R2xlc0NvbnRleHQoKTsKK30KKworVFJBTlNMQVRPUl9BUElFTlRSWSh2b2lkLCBzZXRfY3VycmVudF9nbGVzX2NvbnRleHQsIHZvaWQqIGN4dF9pbikgeworICAgIFNldEN1cnJlbnRHbGVzQ29udGV4dCgoR2xlc0NvbnRleHQqKWN4dF9pbik7Cit9CisKK1RSQU5TTEFUT1JfQVBJRU5UUlkodm9pZCwgbWFrZV9jdXJyZW50X3NldHVwLCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpIHsKKyAgICBHbGVzQ29udGV4dCogY3h0ID0gR2V0Q3VycmVudEdsZXNDb250ZXh0KCk7CisgICAgRExPRygid2lkdGg9JXUgaGVpZ2h0PSV1IGN4dEAlcCIsIHdpZHRoLCBoZWlnaHQsIGN4dCk7CisgICAgY3h0LT5PbkF0dGFjaFN1cmZhY2UoTlVMTCwgd2lkdGgsIGhlaWdodCk7CisgICAgY3h0LT5Pbk1ha2VDdXJyZW50KCk7Cit9CisKK1RSQU5TTEFUT1JfQVBJRU5UUlkodm9pZCwgZGVzdHJveV9nbGVzMV9jb250ZXh0LCB2b2lkKiBjeHQpIHsKKyAgICBHbGVzQ29udGV4dCogdG9EZWxldGUgPSAoR2xlc0NvbnRleHQqKWN4dDsKKyAgICBkZWxldGUgdG9EZWxldGU7Cit9CisKKy8vIFVuc3VwcG9ydGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgYWJzb2x1dGVseSBjcml0aWNhbCB0byBHTEVTdjEtPjIgdHJhbnNsYXRpb24KKy8vIGluIHRoZSBlbXVsYXRvciwgYnV0IHdpbGwgYmUgbmljZSB0byBoYXZlIGluIHRoZSBmdXR1cmUuCisvLyBXZSB3aWxsIG5lZWQgdG8gaW1wbGVtZW50IHRoZXNlIGZ1bmN0aW9ucyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlIHN1cHBvcnQuCisKK3ZvaWQqIE1hcFRleFN1YkltYWdlMkRDSFJPTUlVTUNhbGwgKGNvbnN0IEdsZXNDb250ZXh0KiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xlbnVtIGFjY2VzcykKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGNhbGxlZCAodW5zdXBwb3J0ZWQhKSIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgIFVubWFwVGV4U3ViSW1hZ2UyRENIUk9NSVVNQ2FsbCAoY29uc3QgR2xlc0NvbnRleHQqIGMsIGNvbnN0IHZvaWQqIG1lbSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGNhbGxlZCAodW5zdXBwb3J0ZWQhKSIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuOworfQorCit2b2lkKiBNYXBCdWZmZXJTdWJEYXRhQ0hST01JVU1DYWxsIChHTHVpbnQgdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpcHRyIHNpemUsIEdMZW51bSBhY2Nlc3MpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyBjYWxsZWQgKHVuc3VwcG9ydGVkISkiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBOVUxMOworfQorCitFZ2xJbWFnZVB0ciBHZXRFZ2xJbWFnZUZyb21OYXRpdmVCdWZmZXIoR0xlZ2xJbWFnZU9FUyBidWZmZXIpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyBjYWxsZWQgKHVuc3VwcG9ydGVkISkiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBOVUxMOworICAgIEdMZW51bSB0YXJnZXQgPSAwOworICAgIEdMdWludCB0ZXh0dXJlID0gMDsKKyAgICByZXR1cm4gRWdsSW1hZ2U6OkNyZWF0ZSh0YXJnZXQsIHRleHR1cmUpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdW5pZm9ybV92YWx1ZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy91bmlmb3JtX3ZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjRiMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdW5pZm9ybV92YWx1ZS5jcHAKQEAgLTAsMCArMSwzODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2xlcy91bmlmb3JtX3ZhbHVlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJnbGVzL2RlYnVnLmgiCisjaW5jbHVkZSAiZ2xlcy9nbGVzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJnbGVzL21hY3Jvcy5oIgorCitVbmlmb3JtVmFsdWU6OlVuaWZvcm1WYWx1ZShHTGVudW0gdHlwZSwgYm9vbCBpc19hcnJheSwgR0xpbnQgYXJyYXlfc2l6ZSkKKyAgICA6IHR5cGVfKHR5cGUpLCBpc19hcnJheV8oaXNfYXJyYXkpLCBhcnJheV9zaXplXyhhcnJheV9zaXplKSB7CisgIEluaXREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8R0xmbG9hdCo+KE5VTEwpKTsKK30KKworVW5pZm9ybVZhbHVlOjpVbmlmb3JtVmFsdWUoR0xlbnVtIHR5cGUsIGJvb2wgaXNfYXJyYXksIEdMaW50IGFycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSkKKyAgICA6IHR5cGVfKHR5cGUpLCBpc19hcnJheV8oaXNfYXJyYXkpLCBhcnJheV9zaXplXyhhcnJheV9zaXplKSB7CisgIEluaXREYXRhKHZhbHVlKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihkYXRhX3R5cGVfICE9IERBVEFfRkxPQVQgJiYgZGF0YV90eXBlXyAhPSBEQVRBX0JPT0wgJiYKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGVfICE9IERBVEFfTUFUUklYKTsKK30KKworVW5pZm9ybVZhbHVlOjpVbmlmb3JtVmFsdWUoR0xlbnVtIHR5cGUsIGJvb2wgaXNfYXJyYXksIEdMaW50IGFycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGludCogdmFsdWUpCisgICAgOiB0eXBlXyh0eXBlKSwgaXNfYXJyYXlfKGlzX2FycmF5KSwgYXJyYXlfc2l6ZV8oYXJyYXlfc2l6ZSkgeworICBJbml0RGF0YSh2YWx1ZSk7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoZGF0YV90eXBlXyAhPSBEQVRBX0lOVCAmJiBkYXRhX3R5cGVfICE9IERBVEFfQk9PTCAmJgorICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZV8gIT0gREFUQV9TQU1QTEVSKTsKK30KKworVW5pZm9ybVZhbHVlOjp+VW5pZm9ybVZhbHVlKCkgeworICBkZWxldGVbXSB2YWx1ZV87Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIFVuaWZvcm1WYWx1ZTo6SW5pdERhdGEoY29uc3QgVCogaW5pdGlhbF92YWx1ZSkgeworICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgIGRhdGFfdHlwZV8gPSBEQVRBX0ZMT0FUOworICAgICAgY29tcG9uZW50c18gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9WRUMyOgorICAgICAgZGF0YV90eXBlXyA9IERBVEFfRkxPQVQ7CisgICAgICBjb21wb25lbnRzXyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0ZMT0FUX1ZFQzM6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9GTE9BVDsKKyAgICAgIGNvbXBvbmVudHNfID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRkxPQVRfVkVDNDoKKyAgICAgIGRhdGFfdHlwZV8gPSBEQVRBX0ZMT0FUOworICAgICAgY29tcG9uZW50c18gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTlQ6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9JTlQ7CisgICAgICBjb21wb25lbnRzXyA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0lOVF9WRUMyOgorICAgICAgZGF0YV90eXBlXyA9IERBVEFfSU5UOworICAgICAgY29tcG9uZW50c18gPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTlRfVkVDMzoKKyAgICAgIGRhdGFfdHlwZV8gPSBEQVRBX0lOVDsKKyAgICAgIGNvbXBvbmVudHNfID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfSU5UX1ZFQzQ6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9JTlQ7CisgICAgICBjb21wb25lbnRzXyA9IDQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0JPT0w6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9CT09MOworICAgICAgY29tcG9uZW50c18gPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9CT09MX1ZFQzI6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9CT09MOworICAgICAgY29tcG9uZW50c18gPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9CT09MX1ZFQzM6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9CT09MOworICAgICAgY29tcG9uZW50c18gPSAzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9CT09MX1ZFQzQ6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9CT09MOworICAgICAgY29tcG9uZW50c18gPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9NQVQyOgorICAgICAgZGF0YV90eXBlXyA9IERBVEFfTUFUUklYOworICAgICAgY29tcG9uZW50c18gPSAyICogMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRkxPQVRfTUFUMzoKKyAgICAgIGRhdGFfdHlwZV8gPSBEQVRBX01BVFJJWDsKKyAgICAgIGNvbXBvbmVudHNfID0gMyAqIDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0ZMT0FUX01BVDQ6CisgICAgICBkYXRhX3R5cGVfID0gREFUQV9NQVRSSVg7CisgICAgICBjb21wb25lbnRzXyA9IDQgKiA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TQU1QTEVSXzJEOgorICAgIGNhc2UgR0xfU0FNUExFUl9DVUJFOgorICAgICAgZGF0YV90eXBlXyA9IERBVEFfU0FNUExFUjsKKyAgICAgIGNvbXBvbmVudHNfID0gMTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIHVuaWZvcm0gdHlwZSAlcyIsIEdldEVudW1TdHJpbmcodHlwZV8pKTsKKyAgfQorCisgIExPR19BTFdBWVNfRkFUQUxfSUYoYXJyYXlfc2l6ZV8gPCAwLCAiVW5pZm9ybSBhcnJheSBzaXplIGlzIG5lZ2F0aXZlOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2l6ZV8pOworCisgIGVsZW1lbnRfYnl0ZXNfc2l6ZV8gPSBjb21wb25lbnRzXyAqCisgICAgICAoSXNGbG9hdERhdGEoKSA/IHNpemVvZihHTGZsb2F0KSA6IHNpemVvZihHTGludCkpOworCisgIHZhbHVlXyA9IG5ldyBjaGFyW0dldFN0b3JhZ2VCeXRlc1NpemUoKV07CisKKyAgaWYgKGluaXRpYWxfdmFsdWUpIHsKKyAgICBpZiAoZGF0YV90eXBlXyA9PSBEQVRBX0JPT0wpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZV87ICsraSkgeworICAgICAgICBTZXRCb29sRWxlbWVudEZyb20oaSwgaW5pdGlhbF92YWx1ZSArIGkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkodmFsdWVfLCBpbml0aWFsX3ZhbHVlLCBHZXRTdG9yYWdlQnl0ZXNTaXplKCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBSZXNldERhdGEoKTsKKyAgfQorfQorCit2b2lkIFVuaWZvcm1WYWx1ZTo6UmVzZXREYXRhKCkgeworICBtZW1zZXQodmFsdWVfLCAwLCBHZXRTdG9yYWdlQnl0ZXNTaXplKCkpOworfQorCitpbnQgVW5pZm9ybVZhbHVlOjpHZXRBcnJheVBvcyhpbnQgaWR4KSBjb25zdCB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoaWR4IDwgMCB8fCBpZHggPj0gYXJyYXlfc2l6ZV8pOworICByZXR1cm4gaWR4ICogZWxlbWVudF9ieXRlc19zaXplXzsKK30KKworYm9vbCBVbmlmb3JtVmFsdWU6OkNvcHlGcm9tKGNvbnN0IFVuaWZvcm1WYWx1ZSYgc3JjKSB7CisgIFJlc2V0RGF0YSgpOworICBjb25zdCBpbnQgc2l6ZV90b19jb3B5ID0gc3RkOjptaW4oYXJyYXlfc2l6ZV8sIHNyYy5hcnJheV9zaXplXyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZV90b19jb3B5OyArK2kpIHsKKyAgICBpZiAoIUNvcHlFbGVtZW50RnJvbShpLCBzcmMsIGkpKSB7CisgICAgICAvLyBXaGVuIGRhdGEgaXMgbm90IGNvbnZlcnRpYmxlLCB0aGUgZmlyc3QgY2FsbCB0byBDb3B5RWxlbWVudEZyb20oKQorICAgICAgLy8gd2lsbCBmYWlsLCBsZWF2aW5nIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxsZWQgd2l0aCB6ZXJvZXMuCisgICAgICAvLyBUaGlzIHNob3VsZCBiZSBPSyBhcyBHTEVTMiBpcyBzaWxlbnQgb24gdGhpcyB0b3BpYy4KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVW5pZm9ybVZhbHVlOjpDb3B5RWxlbWVudEZyb20oaW50IGRzdF9pZHgsIGNvbnN0IFVuaWZvcm1WYWx1ZSYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2lkeCkgeworICBjb25zdCBpbnQgZHN0X3BvcyA9IEdldEFycmF5UG9zKGRzdF9pZHgpOworICBjb25zdCBpbnQgc3JjX3BvcyA9IHNyYy5HZXRBcnJheVBvcyhzcmNfaWR4KTsKKworICBpZiAoY29tcG9uZW50c18gIT0gc3JjLmNvbXBvbmVudHNfKSB7CisgICAgLy8gR0xFUzIgcHJlc2NyaWJlcyBhbiBlcnJvciAiaWYgdGhlIHNpemUgaW5kaWNhdGVkIGluIHRoZSBuYW1lIG9mCisgICAgLy8gdGhlIFVuaWZvcm0qIGNvbW1hbmQgdXNlZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgdW5pZm9ybQorICAgIC8vIGRlY2xhcmVkIGluIHRoZSBzaGFkZXIiLiBUaGUgY29tcG9uZW50cyBzaXplIG9mIHNhbXBsZXIgdW5pZm9ybQorICAgIC8vIGlzIGFzc3VtZWQgdG8gYmUgMSwgYXMgb25seSBnbFVuaWZvcm0xaXYoKSBjYW4gYmUgdXNlZCB0aGVyZS4KKyNpZmRlZiBFTkFCTEVfQVBJX0xPR0dJTkcKKyAgICBBTE9HVygiVW5hYmxlIHRvIGNvbnZlcnQgdW5pZm9ybSB2YWx1ZS4gU3JjPSVkLyVkLiBEc3Q9JWQvJWQiLAorICAgICAgICAgIHNyYy5kYXRhX3R5cGVfLCBzcmMuY29tcG9uZW50c18sIGRhdGFfdHlwZV8sIGNvbXBvbmVudHNfKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChkYXRhX3R5cGVfID09IHNyYy5kYXRhX3R5cGVfKSB7CisgICAgLy8gU2FtZSBnZW5lcmFsIHR5cGUgYW5kIGNvbXBvbmVudHMgc2l6ZSAtIGNvcHkgdGhlIGVsZW1lbnQgYXMgaXMuCisgICAgbWVtY3B5KHZhbHVlXyArIGRzdF9wb3MsIHNyYy52YWx1ZV8gKyBzcmNfcG9zLCBlbGVtZW50X2J5dGVzX3NpemVfKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFRoZSByZXN0IG9mIHRoZSBjb2RlIHBlcmZvcm1zIGRhdGEgdHlwZSBjb252ZXJzaW9ucy4KKworICBpZiAoZGF0YV90eXBlXyA9PSBEQVRBX01BVFJJWCB8fCBzcmMuZGF0YV90eXBlXyA9PSBEQVRBX01BVFJJWCkgeworICAgIC8vIEdMRVMyIGRvZXMgbm90IGFsbG93IGNvbnZlcnNpb24gYmV0d2VlbiBtYXRyaXggYW5kIG5vbi1tYXRyaXggdHlwZXMuCisjaWZkZWYgRU5BQkxFX0FQSV9MT0dHSU5HCisgICAgQUxPR1coIlVuYWJsZSB0byBjb252ZXJ0IHVuaWZvcm0gdmFsdWUuIFNyYz0lZC8lZC4gRHN0PSVkLyVkIiwKKyAgICAgICAgICBzcmMuZGF0YV90eXBlXywgc3JjLmNvbXBvbmVudHNfLCBkYXRhX3R5cGVfLCBjb21wb25lbnRzXyk7CisjZW5kaWYKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoc3JjLmRhdGFfdHlwZV8gPT0gREFUQV9CT09MKSB7CisgICAgLy8gQm9vbCBkYXRhIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW50IG9yIGZsb2F0LgorICAgIGlmIChkYXRhX3R5cGVfID09IERBVEFfU0FNUExFUikgeworI2lmZGVmIEVOQUJMRV9BUElfTE9HR0lORworICAgICAgQUxPR1coIlVuYWJsZSB0byBjb252ZXJ0IHVuaWZvcm0gdmFsdWUuIFNyYz0lZC8lZC4gRHN0PSVkLyVkIiwKKyAgICAgICAgICAgIHNyYy5kYXRhX3R5cGVfLCBzcmMuY29tcG9uZW50c18sIGRhdGFfdHlwZV8sIGNvbXBvbmVudHNfKTsKKyNlbmRpZgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGRhdGFfdHlwZV8gIT0gREFUQV9JTlQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZV8gIT0gREFUQV9GTE9BVCk7CisgICAgaWYgKElzRmxvYXREYXRhKCkpIHsKKyAgICAgIHNyYy5TdG9yZUJvb2xFbGVtZW50VG8oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxHTGZsb2F0Kj4odmFsdWVfICsgZHN0X3BvcyksIHNyY19pZHgpOworICAgIH0gZWxzZSB7CisgICAgICBzcmMuU3RvcmVCb29sRWxlbWVudFRvKAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8R0xpbnQqPih2YWx1ZV8gKyBkc3RfcG9zKSwgc3JjX2lkeCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKGRhdGFfdHlwZV8gPT0gREFUQV9CT09MKSB7CisgICAgLy8gSW50IG9yIGZsb2F0IGRhdGEgY2FuIGJlIGNvbnZlcnRlZCB0byBib29sLgorICAgIGlmIChzcmMuZGF0YV90eXBlXyA9PSBEQVRBX1NBTVBMRVIpIHsKKyNpZmRlZiBFTkFCTEVfQVBJX0xPR0dJTkcKKyAgICAgIEFMT0dXKCJVbmFibGUgdG8gY29udmVydCB1bmlmb3JtIHZhbHVlLiBTcmM9JWQvJWQuIERzdD0lZC8lZCIsCisgICAgICAgICAgICBzcmMuZGF0YV90eXBlXywgc3JjLmNvbXBvbmVudHNfLCBkYXRhX3R5cGVfLCBjb21wb25lbnRzXyk7CisjZW5kaWYKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzcmMuZGF0YV90eXBlXyAhPSBEQVRBX0lOVCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmRhdGFfdHlwZV8gIT0gREFUQV9GTE9BVCk7CisgICAgaWYgKHNyYy5Jc0Zsb2F0RGF0YSgpKSB7CisgICAgICBTZXRCb29sRWxlbWVudEZyb20oCisgICAgICAgICAgZHN0X2lkeCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHTGZsb2F0Kj4oc3JjLnZhbHVlXyArIHNyY19wb3MpKTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0Qm9vbEVsZW1lbnRGcm9tKAorICAgICAgICAgIGRzdF9pZHgsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgR0xpbnQqPihzcmMudmFsdWVfICsgc3JjX3BvcykpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChzcmMuZGF0YV90eXBlXyA9PSBEQVRBX1NBTVBMRVIpIHsKKyAgICAvLyBTYW1wbGVyIGRhdGEgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQuCisgICAgaWYgKElzRmxvYXREYXRhKCkpIHsKKyNpZmRlZiBFTkFCTEVfQVBJX0xPR0dJTkcKKyAgICAgIEFMT0dXKCJVbmFibGUgdG8gY29udmVydCB1bmlmb3JtIHZhbHVlLiBTcmM9JWQvJWQuIERzdD0lZC8lZCIsCisgICAgICAgICAgICBzcmMuZGF0YV90eXBlXywgc3JjLmNvbXBvbmVudHNfLCBkYXRhX3R5cGVfLCBjb21wb25lbnRzXyk7CisjZW5kaWYKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkYXRhX3R5cGVfICE9IERBVEFfSU5UKTsKKyAgICBtZW1jcHkodmFsdWVfICsgZHN0X3Bvcywgc3JjLnZhbHVlXyArIHNyY19wb3MsIGVsZW1lbnRfYnl0ZXNfc2l6ZV8pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKGRhdGFfdHlwZV8gPT0gREFUQV9TQU1QTEVSKSB7CisgICAgLy8gSW50IGRhdGEgY2FuIGJlIGNvbnZlcnRlZCB0byBzYW1wbGVyIGRhdGEuCisgICAgaWYgKHNyYy5Jc0Zsb2F0RGF0YSgpKSB7CisjaWZkZWYgRU5BQkxFX0FQSV9MT0dHSU5HCisgICAgICBBTE9HVygiVW5hYmxlIHRvIGNvbnZlcnQgdW5pZm9ybSB2YWx1ZS4gU3JjPSVkLyVkLiBEc3Q9JWQvJWQiLAorICAgICAgICAgICAgc3JjLmRhdGFfdHlwZV8sIHNyYy5jb21wb25lbnRzXywgZGF0YV90eXBlXywgY29tcG9uZW50c18pOworI2VuZGlmCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3JjLmRhdGFfdHlwZV8gIT0gREFUQV9JTlQpOworICAgIG1lbWNweSh2YWx1ZV8gKyBkc3RfcG9zLCBzcmMudmFsdWVfICsgc3JjX3BvcywgZWxlbWVudF9ieXRlc19zaXplXyk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBObyBvdGhlciBjb252ZXJzaW9ucyBhcmUgYWxsb3dlZCBieSBHTEVTMi4KKyNpZmRlZiBFTkFCTEVfQVBJX0xPR0dJTkcKKyAgQUxPR1coIlVuYWJsZSB0byBjb252ZXJ0IHVuaWZvcm0gdmFsdWUuIFNyYz0lZC8lZC4gRHN0PSVkLyVkIiwKKyAgICAgICAgc3JjLmRhdGFfdHlwZV8sIHNyYy5jb21wb25lbnRzXywgZGF0YV90eXBlXywgY29tcG9uZW50c18pOworI2VuZGlmCisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pZm9ybVZhbHVlOjpTdG9yZUJvb2xFbGVtZW50VG8oVCogZHN0LCBpbnQgaWR4KSBjb25zdCB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoZGF0YV90eXBlXyAhPSBEQVRBX0JPT0wpOworICBjb25zdCBHTGludCogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHTGludCo+KAorICAgICAgdmFsdWVfICsgR2V0QXJyYXlQb3MoaWR4KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50c187ICsraSkgeworICAgIGRzdFtpXSA9IChzcmNbaV0gIT0gMCk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgVW5pZm9ybVZhbHVlOjpTZXRCb29sRWxlbWVudEZyb20oaW50IGlkeCwgY29uc3QgVCogc3JjKSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoZGF0YV90eXBlXyAhPSBEQVRBX0JPT0wpOworICBHTGludCogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDxHTGludCo+KHZhbHVlXyArIEdldEFycmF5UG9zKGlkeCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHNfOyArK2kpIHsKKyAgICBkc3RbaV0gPSAoc3JjW2ldICE9IDApOworICB9Cit9CisKK2Jvb2wgVW5pZm9ybVZhbHVlOjpTdG9yZUFzRmxvYXRUbyhHTGZsb2F0KiB2YWx1ZSkgY29uc3QgeworICBpZiAoZGF0YV90eXBlXyA9PSBEQVRBX0JPT0wpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5X3NpemVfOyArK2kpIHsKKyAgICAgIFN0b3JlQm9vbEVsZW1lbnRUbyh2YWx1ZSArIGkgKiBjb21wb25lbnRzXywgaSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKCFJc0Zsb2F0RGF0YSgpKSB7CisgICAgLy8gSW50IG9yIHNhbXBsZXIuIE9ubHkgYm9vbCBvciBmbG9hdC1iYXNlZCBkYXRhIGNhbiBiZSByZXF1ZXN0ZWQgaGVyZS4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBtZW1jcHkodmFsdWUsIHZhbHVlXywgR2V0U3RvcmFnZUJ5dGVzU2l6ZSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVW5pZm9ybVZhbHVlOjpTdG9yZUFzSW50VG8oR0xpbnQqIHZhbHVlKSBjb25zdCB7CisgIGlmIChkYXRhX3R5cGVfID09IERBVEFfQk9PTCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlfc2l6ZV87ICsraSkgeworICAgICAgU3RvcmVCb29sRWxlbWVudFRvKHZhbHVlICsgaSAqIGNvbXBvbmVudHNfLCBpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoSXNGbG9hdERhdGEoKSkgeworICAgIC8vIEZsb2F0IG9yIG1hdHJpeC4gSG93ZXZlciwgb25seSBib29sIGFuZCBzYW1wbGVyIGNvbnZlcnNpb25zIGFyZSBhbGxvd2VkCisgICAgLy8gZm9yIGludCB0eXBlIGJ5IEdMRVMyLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1lbWNweSh2YWx1ZSwgdmFsdWVfLCBHZXRTdG9yYWdlQnl0ZXNTaXplKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBVbmlmb3JtVmFsdWU6OlNldE9uUHJvZ3JhbShHbGVzQ29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHVpbnQgbG9jYXRpb24pIGNvbnN0IHsKKyAgaWYgKCFhcnJheV9zaXplXykgeworICAgIHJldHVybjsKKyAgfQorICBjb25zdCBHTGludCogaW50X3ZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHTGludCo+KHZhbHVlXyk7CisgIGNvbnN0IEdMZmxvYXQqIGZsb2F0X3ZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBHTGZsb2F0Kj4odmFsdWVfKTsKKyAgc3dpdGNoICh0eXBlXykgeworICAgIGNhc2UgR0xfRkxPQVQ6CisgICAgICBQQVNTX1RIUk9VR0goY3R4LCBVbmlmb3JtMWZ2LCBsb2NhdGlvbiwgYXJyYXlfc2l6ZV8sIGZsb2F0X3ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRkxPQVRfVkVDMjoKKyAgICAgIFBBU1NfVEhST1VHSChjdHgsIFVuaWZvcm0yZnYsIGxvY2F0aW9uLCBhcnJheV9zaXplXywgZmxvYXRfdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9WRUMzOgorICAgICAgUEFTU19USFJPVUdIKGN0eCwgVW5pZm9ybTNmdiwgbG9jYXRpb24sIGFycmF5X3NpemVfLCBmbG9hdF92YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0ZMT0FUX1ZFQzQ6CisgICAgICBQQVNTX1RIUk9VR0goY3R4LCBVbmlmb3JtNGZ2LCBsb2NhdGlvbiwgYXJyYXlfc2l6ZV8sIGZsb2F0X3ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfSU5UOgorICAgIGNhc2UgR0xfQk9PTDoKKyAgICBjYXNlIEdMX1NBTVBMRVJfMkQ6CisgICAgY2FzZSBHTF9TQU1QTEVSX0NVQkU6CisgICAgICBQQVNTX1RIUk9VR0goY3R4LCBVbmlmb3JtMWl2LCBsb2NhdGlvbiwgYXJyYXlfc2l6ZV8sIGludF92YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0lOVF9WRUMyOgorICAgIGNhc2UgR0xfQk9PTF9WRUMyOgorICAgICAgUEFTU19USFJPVUdIKGN0eCwgVW5pZm9ybTJpdiwgbG9jYXRpb24sIGFycmF5X3NpemVfLCBpbnRfdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTlRfVkVDMzoKKyAgICBjYXNlIEdMX0JPT0xfVkVDMzoKKyAgICAgIFBBU1NfVEhST1VHSChjdHgsIFVuaWZvcm0zaXYsIGxvY2F0aW9uLCBhcnJheV9zaXplXywgaW50X3ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfSU5UX1ZFQzQ6CisgICAgY2FzZSBHTF9CT09MX1ZFQzQ6CisgICAgICBQQVNTX1RIUk9VR0goY3R4LCBVbmlmb3JtNGl2LCBsb2NhdGlvbiwgYXJyYXlfc2l6ZV8sIGludF92YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0ZMT0FUX01BVDI6CisgICAgICBQQVNTX1RIUk9VR0goY3R4LCBVbmlmb3JtTWF0cml4MmZ2LCBsb2NhdGlvbiwgYXJyYXlfc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgR0xfRkFMU0UsIGZsb2F0X3ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfRkxPQVRfTUFUMzoKKyAgICAgIFBBU1NfVEhST1VHSChjdHgsIFVuaWZvcm1NYXRyaXgzZnYsIGxvY2F0aW9uLCBhcnJheV9zaXplXywKKyAgICAgICAgICAgICAgICAgICBHTF9GQUxTRSwgZmxvYXRfdmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OgorICAgICAgUEFTU19USFJPVUdIKGN0eCwgVW5pZm9ybU1hdHJpeDRmdiwgbG9jYXRpb24sIGFycmF5X3NpemVfLAorICAgICAgICAgICAgICAgICAgIEdMX0ZBTFNFLCBmbG9hdF92YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biB1bmlmb3JtIHR5cGUgJXMiLCBHZXRFbnVtU3RyaW5nKHR5cGVfKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3VuaWZvcm1fdmFsdWUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3VuaWZvcm1fdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTBhYWUyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdW5pZm9ybV92YWx1ZS5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19VTklGT1JNX1ZBTFVFX0hfCisjZGVmaW5lIEdSQVBISUNTX1RSQU5TTEFUSU9OX0dMRVNfVU5JRk9STV9WQUxVRV9IXworCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCitjbGFzcyBHbGVzQ29udGV4dDsKKworLy8gRW5jYXBzdWxhdGVzIHZhbHVlIG9mIG9uZSBhY3RpdmUgdW5pZm9ybSwgdXNlZCBmb3IgY2FjaGluZyB1bmlmb3JtIGRhdGEuCisvLyBQZXIgR0xFUzIgc3BlYywgdGhlIGZvbGxvd2luZyBkYXRhIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6CisvLyAgIDEuIEdMX0ZMT0FULCBHTF9GTE9BVF9WRUMyLCBHTF9GTE9BVF9WRUMzLCBHTF9GTE9BVF9WRUM0CisvLyAgIDIuIEdMX0lOVCwgR0xfSU5UX1ZFQzIsIEdMX0lOVF9WRUMzLCBHTF9JTlRfVkVDNAorLy8gICAzLiBHTF9CT09MLCBHTF9CT09MX1ZFQzIsIEdMX0JPT0xfVkVDMywgR0xfQk9PTF9WRUM0CisvLyAgIDQuIEdMX0ZMT0FUX01BVDIsIEdMX0ZMT0FUX01BVDMsIEdMX0ZMT0FUX01BVDQKKy8vICAgNS4gR0xfU0FNUExFUl8yRCwgR0xfU0FNUExFUl9DVUJFCisvLyBBbGxvd2VkIGltcGxpY2l0IGRhdGEgY29udmVyc2lvbnM6CisvLyAgIDEuIEZpbGxpbmcgaW4gcGFydHMgb2YgYXJyYXlzCisvLyAgIDIuIENvbnZlcnNpb25zIGJldHdlZW4gR0xfSU5UKiBhbmQgR0xfQk9PTCoKKy8vICAgMy4gQ29udmVyc2lvbnMgYmV0d2VlbiBHTF9GTE9BVCogYW5kIEdMX0JPT0wqCisvLyAgIDQuIENvbnZlcnNpb25zIGJldHdlZW4gR0xfSU5UIGFuZCBHTF9TQU1QTEVSKgorLy8gRGlzYWxsb3dlZCBpbXBsaWNpdCBkYXRhIGNvbnZlcnNpb25zOgorLy8gICAxLiBBbnkgY2hhbmdlcyBvZiBjb21wb25lbnQgc2l6ZSAoZm9yIGV4YW1wbGUsIFZFQzIgdnMgVkVDMykKKy8vICAgMi4gQW55IHR5cGUgY29udmVyc2lvbnMgbm90IGV4cGxpY2l0bHkgYWxsb3dlZAorLy8gVE9ETyhjcmJ1Zy5jb20vNDQxOTMxKTogQWRkIGEgdW5pdCB0ZXN0IGZvciBVbmlmb3JtVmFsdWUuCitjbGFzcyBVbmlmb3JtVmFsdWUgeworIHB1YmxpYzoKKyAgVW5pZm9ybVZhbHVlKEdMZW51bSB0eXBlLCBib29sIGlzX2FycmF5LCBHTGludCBhcnJheV9zaXplKTsKKyAgVW5pZm9ybVZhbHVlKEdMZW51bSB0eXBlLCBib29sIGlzX2FycmF5LCBHTGludCBhcnJheV9zaXplLAorICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdmFsdWUpOworICBVbmlmb3JtVmFsdWUoR0xlbnVtIHR5cGUsIGJvb2wgaXNfYXJyYXksIEdMaW50IGFycmF5X3NpemUsCisgICAgICAgICAgICAgICBjb25zdCBHTGludCogdmFsdWUpOworICB+VW5pZm9ybVZhbHVlKCk7CisKKyAgR0xlbnVtIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorICBib29sIElzQXJyYXkoKSBjb25zdCB7IHJldHVybiBpc19hcnJheV87IH0KKyAgR0xpbnQgR2V0QXJyYXlTaXplKCkgY29uc3QgeyByZXR1cm4gYXJyYXlfc2l6ZV87IH0KKworICAvLyBDb3BpZXMgb25lIGVsZW1lbnQgb2YgYSB1bmlmb3JtLiBQZXJmb3JtcyBuZWNlc3NhcnkgZGF0YSBjb252ZXJzaW9ucy4KKyAgLy8gUmV0dXJucyBmYWxzZSBpZiBkYXRhIGNvbnZlcnNpb24gaXMgbm90IHBvc3NpYmxlLiBJbmRleCBwYXJhbWV0ZXJzCisgIC8vIHJlZmVyIHRvIHBvc2l0aW9ucyB3aXRoaW4gYXJyYXlzOyB1c2UgemVybyBpZiB0aGlzIGlzIG5vdCBhbiBhcnJheS4KKyAgYm9vbCBDb3B5RWxlbWVudEZyb20oaW50IGRzdF9pZHgsIGNvbnN0IFVuaWZvcm1WYWx1ZSYgc3JjLCBpbnQgc3JjX2lkeCk7CisKKyAgLy8gQ29waWVzIGFsbCBlbGVtZW50cyBvZiBhIHVuaWZvcm0uIFBlcmZvcm1zIG5lY2Vzc2FyeSBkYXRhIGNvbnZlcnNpb25zLgorICAvLyBSZXR1cm5zIGZhbHNlIGlmIGRhdGEgY29udmVyc2lvbiBpcyBub3QgcG9zc2libGUuCisgIGJvb2wgQ29weUZyb20oY29uc3QgVW5pZm9ybVZhbHVlJiBzcmMpOworCisgIC8vIFNldHMgdW5pZm9ybSdzIHZhbHVlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiBvbiB0aGUgY3VycmVudCBwcm9ncmFtLgorICB2b2lkIFNldE9uUHJvZ3JhbShHbGVzQ29udGV4dCogY3R4LCBHTHVpbnQgZ2xvYmFsX2xvY2F0aW9uKSBjb25zdDsKKworICBib29sIFN0b3JlQXNGbG9hdFRvKEdMZmxvYXQqIHZhbHVlKSBjb25zdDsKKyAgYm9vbCBTdG9yZUFzSW50VG8oR0xpbnQqIHZhbHVlKSBjb25zdDsKKworIHByaXZhdGU6CisgIGVudW0gRGF0YVR5cGUgeworICAgIERBVEFfSU5ULAorICAgIERBVEFfQk9PTCwKKyAgICBEQVRBX0ZMT0FULAorICAgIERBVEFfTUFUUklYLAorICAgIERBVEFfU0FNUExFUiwKKyAgfTsKKworICAvLyBDb3B5IGFuZCBhc3NpZ25tZW50IGFyZSBub3Qgc3VwcG9ydGVkLgorICBVbmlmb3JtVmFsdWUoY29uc3QgVW5pZm9ybVZhbHVlJiBzcmMpOworICBVbmlmb3JtVmFsdWUmIG9wZXJhdG9yPShjb25zdCBVbmlmb3JtVmFsdWUmIHNyYyk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBJbml0RGF0YShjb25zdCBUKiBpbml0aWFsX3ZhbHVlKTsKKyAgdm9pZCBSZXNldERhdGEoKTsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSB1c2VzIGZsb2F0IHZhbHVlcy4KKyAgYm9vbCBJc0Zsb2F0RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YV90eXBlXyA9PSBEQVRBX0ZMT0FUIHx8IGRhdGFfdHlwZV8gPT0gREFUQV9NQVRSSVg7CisgIH0KKworICAvLyBSZXR1cm5zIHBvc2l0aW9uIHdpdGhpbiB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGZvciB0aGUgZ2l2ZW4gYXJyYXkgaW5kZXguCisgIGludCBHZXRBcnJheVBvcyhpbnQgaWR4KSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgaW4gYnl0ZXMuCisgIGludCBHZXRTdG9yYWdlQnl0ZXNTaXplKCkgY29uc3QgeworICAgIHJldHVybiBhcnJheV9zaXplXyAqIGVsZW1lbnRfYnl0ZXNfc2l6ZV87CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIFN0b3JlQm9vbEVsZW1lbnRUbyhUKiBkc3QsIGludCBpZHgpIGNvbnN0OworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIFNldEJvb2xFbGVtZW50RnJvbShpbnQgaWR4LCBjb25zdCBUKiBzcmMpOworCisgIEdMZW51bSB0eXBlXzsKKyAgYm9vbCBpc19hcnJheV87CisgIEdMaW50IGFycmF5X3NpemVfOworICBEYXRhVHlwZSBkYXRhX3R5cGVfOworICBHTGludCBjb21wb25lbnRzXzsKKyAgaW50IGVsZW1lbnRfYnl0ZXNfc2l6ZV87CisgIGNoYXIqIHZhbHVlXzsKK307CisKKyNlbmRpZiAgLy8gR1JBUEhJQ1NfVFJBTlNMQVRJT05fR0xFU19VTklGT1JNX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy92ZWN0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdmVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA2ZjMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL2dsZXMvdmVjdG9yLmNwcApAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidmVjdG9yLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiY29tbW9uL2Fsb2cuaCIKKyNpbmNsdWRlICJtYXRyaXguaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKworZmxvYXQgVmVjdG9yOjpHZXREb3RQcm9kdWN0KGNvbnN0IFZlY3RvciYgdikgY29uc3QgeworICBmbG9hdCBkcCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0VudHJpZXM7ICsraSkKKyAgICBkcCArPSBlbnRyaWVzX1tpXSAqIHYuZW50cmllc19baV07CisgIHJldHVybiBkcDsKK30KKwordm9pZCBWZWN0b3I6OkFzc2lnbk1hdHJpeE11bHRpcGx5KGNvbnN0IE1hdHJpeCYgYSwgY29uc3QgVmVjdG9yJiBiKSB7CisgIGNvbnN0IFZlY3RvciByMChhLkdldCgwLCAwKSwgYS5HZXQoMCwgMSksIGEuR2V0KDAsIDIpLCBhLkdldCgwLCAzKSk7CisgIGNvbnN0IFZlY3RvciByMShhLkdldCgxLCAwKSwgYS5HZXQoMSwgMSksIGEuR2V0KDEsIDIpLCBhLkdldCgxLCAzKSk7CisgIGNvbnN0IFZlY3RvciByMihhLkdldCgyLCAwKSwgYS5HZXQoMiwgMSksIGEuR2V0KDIsIDIpLCBhLkdldCgyLCAzKSk7CisgIGNvbnN0IFZlY3RvciByMyhhLkdldCgzLCAwKSwgYS5HZXQoMywgMSksIGEuR2V0KDMsIDIpLCBhLkdldCgzLCAzKSk7CisKKyAgY29uc3QgZmxvYXQgeCA9IHIwLkdldERvdFByb2R1Y3QoYik7CisgIGNvbnN0IGZsb2F0IHkgPSByMS5HZXREb3RQcm9kdWN0KGIpOworICBjb25zdCBmbG9hdCB6ID0gcjIuR2V0RG90UHJvZHVjdChiKTsKKyAgY29uc3QgZmxvYXQgdyA9IHIzLkdldERvdFByb2R1Y3QoYik7CisKKyAgZW50cmllc19bMF0gPSB4OworICBlbnRyaWVzX1sxXSA9IHk7CisgIGVudHJpZXNfWzJdID0gejsKKyAgZW50cmllc19bM10gPSB3OworfQorCit2b2lkIFZlY3Rvcjo6QXNzaWduTGluZWFyTWFwcGluZyhjb25zdCBmbG9hdCogcGFyYW1zLCBzaXplX3QgY291bnQpIHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihjb3VudCA+IGtFbnRyaWVzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIGVudHJpZXNfW2ldID0gcGFyYW1zW2ldOworfQorCit2b2lkIFZlY3Rvcjo6QXNzaWduTGluZWFyTWFwcGluZyhjb25zdCBpbnQzMl90KiBwYXJhbXMsIHNpemVfdCBjb3VudCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvdW50ID4ga0VudHJpZXMpOworICBBc3NpZ25MaW5lYXJNYXBwaW5nSGVscGVyKHBhcmFtcywgY291bnQpOworfQorCit2b2lkIFZlY3Rvcjo6QXNzaWduTGluZWFyTWFwcGluZyhjb25zdCBpbnQxNl90KiBwYXJhbXMsIHNpemVfdCBjb3VudCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvdW50ID4ga0VudHJpZXMpOworICBBc3NpZ25MaW5lYXJNYXBwaW5nSGVscGVyKHBhcmFtcywgY291bnQpOworfQorCit2b2lkIFZlY3Rvcjo6QXNzaWduTGluZWFyTWFwcGluZyhjb25zdCBpbnQ4X3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KSB7CisgIExPR19BTFdBWVNfRkFUQUxfSUYoY291bnQgPiBrRW50cmllcyk7CisgIEFzc2lnbkxpbmVhck1hcHBpbmdIZWxwZXIocGFyYW1zLCBjb3VudCk7Cit9CisKK3ZvaWQgVmVjdG9yOjpBc3NpZ25MaW5lYXJNYXBwaW5nKGNvbnN0IHVpbnQxNl90KiBwYXJhbXMsIHNpemVfdCBjb3VudCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvdW50ID4ga0VudHJpZXMpOworICBBc3NpZ25MaW5lYXJNYXBwaW5nSGVscGVyKHBhcmFtcywgY291bnQpOworfQorCit2b2lkIFZlY3Rvcjo6QXNzaWduTGluZWFyTWFwcGluZyhjb25zdCB1aW50OF90KiBwYXJhbXMsIHNpemVfdCBjb3VudCkgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvdW50ID4ga0VudHJpZXMpOworICBBc3NpZ25MaW5lYXJNYXBwaW5nSGVscGVyKHBhcmFtcywgY291bnQpOworfQorCit2b2lkIFZlY3Rvcjo6R2V0TGluZWFyTWFwcGluZyhmbG9hdCogcGFyYW1zLCBzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihjb3VudCA+IGtFbnRyaWVzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHBhcmFtc1tpXSA9IGVudHJpZXNfW2ldOworfQorCit2b2lkIFZlY3Rvcjo6R2V0TGluZWFyTWFwcGluZyhpbnQzMl90KiBwYXJhbXMsIHNpemVfdCBjb3VudCkgY29uc3QgeworICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNvdW50ID4ga0VudHJpZXMpOworICBHZXRMaW5lYXJNYXBwaW5nSGVscGVyKHBhcmFtcywgY291bnQpOworfQorCit2b2lkIFZlY3Rvcjo6Q2xhbXAoZmxvYXQgbWludiwgZmxvYXQgbWF4dikgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtFbnRyaWVzOyBpKyspCisgICAgZW50cmllc19baV0gPSBzdGQ6Om1pbihzdGQ6Om1heChlbnRyaWVzX1tpXSwgbWludiksIG1heHYpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgVmVjdG9yOjpBc3NpZ25MaW5lYXJNYXBwaW5nSGVscGVyKGNvbnN0IFQqIHBhcmFtcywgc2l6ZV90IGNvdW50KSB7CisgIC8vIE1hcHMgaW50ZWdlciB2YWx1ZXMgdG8gZmxvYXRpbmcgcG9pbnQuCisgIC8vIElmIHRoZSBpbnRlZ2VyIHR5cGUgaXMgc2lnbmVkLCB0aGUgb3V0cHV0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyB3aWxsIGJlCisgIC8vIGluIHRoZSByYW5nZSBbLTEuMCwgKzEuMF0uIE90aGVyd2lzZSB0aGUgb3V0cHV0IGZsb2F0aW5nIHBvaW50IHZhbHVlcworICAvLyB3aWxsIGJlIGluIHRoZSByYW5nZSBbMC4wLCArMS4wXS4KKworICAvLyBBbiBhbGlhcyBpcyBjb252ZW5pZW50LgorICB0eXBlZGVmIHN0ZDo6bnVtZXJpY19saW1pdHM8VD4gTGltaXRzOworCisgIC8vIFdlIG9ubHkgZXhwZWN0IGludGVnZXJzIGhlcmUuCisgIExPR19BTFdBWVNfRkFUQUxfSUYoIUxpbWl0czo6aXNfaW50ZWdlcik7CisKKyAgLy8gTm90ZTogV2UgdXNlIGRvdWJsZSBwcmVjaXNpb24gaGVyZSB0aGUgbGltaXRzIG9mIGEgMzIgYml0IGludGVnZXIgY2Fubm90IGJlCisgIC8vIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgaW4gYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKworICAvLyBHZXQgdGhlIHJhbmdlIG9mIHRoZSBpbnRlZ2VyCisgIGNvbnN0IGRvdWJsZSBtaW5pID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihMaW1pdHM6Om1pbigpKTsKKyAgY29uc3QgZG91YmxlIG1heGkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KExpbWl0czo6bWF4KCkpOworICAvLyBHZXQgdGhlIHJhbmdlIG9mIHRoZSBmbG9hdGluZyBwb2ludCBvdXRwdXQuCisgIGNvbnN0IGRvdWJsZSBtaW5mID0gTGltaXRzOjppc19zaWduZWQgPyAtMS5mIDogMC5mOworICBjb25zdCBkb3VibGUgbWF4ZiA9ICsxLmY7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZG91YmxlIHYgPSBzdGF0aWNfY2FzdDxkb3VibGU+KHBhcmFtc1tpXSk7CisgICAgZW50cmllc19baV0gPSAodiAtIG1pbmkpICogKG1heGYgLSBtaW5mKSAvIChtYXhpIC0gbWluaSkgKyBtaW5mOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBWZWN0b3I6OkdldExpbmVhck1hcHBpbmdIZWxwZXIoVCogcGFyYW1zLCBzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgLy8gTWFwcyBmbG9hdGluZyBwb2ludCB2YWx1ZXMgdG8gaW50ZWdlcnMuCisgIC8vIElmIHRoZSBpbnRlZ2VyIHR5cGUgaXMgc2lnbmVkLCB0aGVuIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZXMgd2lsbCBiZQorICAvLyBhc3N1bWVkIHRvIGxpZSBpbiB0aGUgcmFuZ2UgWy0xLjAsICsxLjBdLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGFzc3VtZWQKKyAgLy8gdG8gbGllIGluIHRoZSByYW5nZSBbMC4wLCArMS4wXS4gTnVtYmVycyBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbCBiZQorICAvLyBjbGFtcGVkIHRvIHRoZSBib3VuZGFyeS4gVGhlIGludGVnZXJzIHdpbGwgYmUgbWFwcGVkIHN1Y2ggdGhhdCB0aGUgbWluaW11bQorICAvLyBmbG9hdGluZyBwb2ludCB2YWx1ZSBiZWNvbWVzIHRoZSBtaW5pbXVtIGludGVnZXIgdmFsdWUsIGFuZCBsaWtld2lzZSB3aXRoCisgIC8vIHRoZSBtYXhpbXVtIHZhbHVlLgorCisgIC8vIEFuIGFsaWFzIGlzIGNvbnZlbmllbnQuCisgIHR5cGVkZWYgc3RkOjpudW1lcmljX2xpbWl0czxUPiBMaW1pdHM7CisKKyAgLy8gV2Ugb25seSBleHBlY3QgaW50ZWdlcnMgaGVyZS4KKyAgTE9HX0FMV0FZU19GQVRBTF9JRighTGltaXRzOjppc19pbnRlZ2VyKTsKKworICAvLyBOb3RlOiBXZSB1c2UgZG91YmxlIHByZWNpc2lvbiBoZXJlIHRoZSBsaW1pdHMgb2YgYSAzMiBiaXQgaW50ZWdlciBjYW5ub3QgYmUKKyAgLy8gYWNjdXJhdGVseSByZXByZXNlbnRlZCBpbiBhIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorCisgIC8vIEdldCB0aGUgcmFuZ2Ugb2YgdGhlIGludGVnZXIKKyAgY29uc3QgZG91YmxlIG1pbmkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KExpbWl0czo6bWluKCkpOworICBjb25zdCBkb3VibGUgbWF4aSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oTGltaXRzOjptYXgoKSk7CisgIC8vIEdldCB0aGUgcmFuZ2Ugb2YgdGhlIGZsb2F0aW5nIHBvaW50IG91dHB1dC4KKyAgY29uc3QgZG91YmxlIG1pbmYgPSBMaW1pdHM6OmlzX3NpZ25lZCA/IC0xLiA6IDAuOworICBjb25zdCBkb3VibGUgbWF4ZiA9ICsxLjsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBkb3VibGUgdiA9IGVudHJpZXNfW2ldOworICAgIHYgPSAodiAtIG1pbmYpICogKG1heGkgLSBtaW5pKSAvIChtYXhmIC0gbWluZikgKyBtaW5pOworICAgIHYgPSBzdGQ6Om1pbihzdGQ6Om1heCh2LCBtaW5pKSwgbWF4aSk7CisgICAgcGFyYW1zW2ldID0gc3RhdGljX2Nhc3Q8VD4odik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy92ZWN0b3IuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci9nbGVzL3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ODU5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvZ2xlcy92ZWN0b3IuaApAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgR0xFU19WRUNUT1JfSF8KKyNkZWZpbmUgR0xFU19WRUNUT1JfSF8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK2NsYXNzIE1hdHJpeDsKKworY2xhc3MgVmVjdG9yIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0VudHJpZXMgPSA0OworCisgIGV4cGxpY2l0IFZlY3RvcihmbG9hdCB2MSA9IDAuMGYsIGZsb2F0IHYyID0gMC4wZiwgZmxvYXQgdjMgPSAwLjBmLAorICAgICAgICAgICAgICAgICAgZmxvYXQgdjQgPSAwLjBmKSB7CisgICAgZW50cmllc19bMF0gPSB2MTsKKyAgICBlbnRyaWVzX1sxXSA9IHYyOworICAgIGVudHJpZXNfWzJdID0gdjM7CisgICAgZW50cmllc19bM10gPSB2NDsKKyAgfQorCisgIHZvaWQgU2V0KGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsKKyAgICBlbnRyaWVzX1tpbmRleF0gPSB2YWx1ZTsKKyAgfQorCisgIGZsb2F0IEdldChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gZW50cmllc19baW5kZXhdOworICB9CisKKyAgZmxvYXQgR2V0RG90UHJvZHVjdChjb25zdCBWZWN0b3ImIHYpIGNvbnN0OworCisgIGZsb2F0IEdldExlbmd0aFNxdWFyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldERvdFByb2R1Y3QoKnRoaXMpOworICB9CisKKyAgZmxvYXQgR2V0TGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBzcXJ0KEdldExlbmd0aFNxdWFyZWQoKSk7CisgIH0KKworICB2b2lkIFNjYWxlKGZsb2F0IHYpIHsKKyAgICBlbnRyaWVzX1swXSAqPSB2OworICAgIGVudHJpZXNfWzFdICo9IHY7CisgICAgZW50cmllc19bMl0gKj0gdjsKKyAgICBlbnRyaWVzX1szXSAqPSB2OworICB9CisKKyAgdm9pZCBOb3JtYWxpemUoKSB7CisgICAgU2NhbGUoMS4wZiAvIEdldExlbmd0aCgpKTsKKyAgfQorCisgIGZsb2F0KiBHZXRGbG9hdEFycmF5KGZsb2F0ICgmZGF0YSlbNF0pIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtFbnRyaWVzOyBpKyspCisgICAgICBkYXRhW2ldID0gZW50cmllc19baV07CisgICAgcmV0dXJuIGRhdGE7CisgIH0KKworICB2b2lkIEFzc2lnbk1hdHJpeE11bHRpcGx5KGNvbnN0IE1hdHJpeCYgYSwgY29uc3QgVmVjdG9yJiBiKTsKKworICB2b2lkIEFzc2lnbkxpbmVhck1hcHBpbmcoY29uc3QgZmxvYXQqIHBhcmFtcywgc2l6ZV90IGNvdW50KTsKKyAgdm9pZCBBc3NpZ25MaW5lYXJNYXBwaW5nKGNvbnN0IGludDMyX3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KTsKKyAgdm9pZCBBc3NpZ25MaW5lYXJNYXBwaW5nKGNvbnN0IGludDE2X3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KTsKKyAgdm9pZCBBc3NpZ25MaW5lYXJNYXBwaW5nKGNvbnN0IGludDhfdCogcGFyYW1zLCBzaXplX3QgY291bnQpOworICB2b2lkIEFzc2lnbkxpbmVhck1hcHBpbmcoY29uc3QgdWludDE2X3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KTsKKyAgdm9pZCBBc3NpZ25MaW5lYXJNYXBwaW5nKGNvbnN0IHVpbnQ4X3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KTsKKworICB2b2lkIEdldExpbmVhck1hcHBpbmcoZmxvYXQqIHBhcmFtcywgc2l6ZV90IGNvdW50KSBjb25zdDsKKyAgdm9pZCBHZXRMaW5lYXJNYXBwaW5nKGludDMyX3QqIHBhcmFtcywgc2l6ZV90IGNvdW50KSBjb25zdDsKKworICB2b2lkIENsYW1wKGZsb2F0IG1pbiwgZmxvYXQgbWF4KTsKKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIEFzc2lnbkxpbmVhck1hcHBpbmdIZWxwZXIoY29uc3QgVCogcGFyYW1zLCBzaXplX3QgY291bnQpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBHZXRMaW5lYXJNYXBwaW5nSGVscGVyKFQqIHBhcmFtcywgc2l6ZV90IGNvdW50KSBjb25zdDsKKworICBmbG9hdCBlbnRyaWVzX1trRW50cmllc107Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKKworI2VuZGlmICAvLyBHTEVTX1ZFQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL0xvZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL0xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNmY0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvdXRpbHMvTG9nLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBDL0MrKyBsb2dnaW5nIGZ1bmN0aW9ucy4gIFNlZSB0aGUgbG9nZ2luZyBkb2N1bWVudGF0aW9uIGZvciBBUEkgZGV0YWlscy4KKy8vCisvLyBXZSdkIGxpa2UgdGhlc2UgdG8gYmUgYXZhaWxhYmxlIGZyb20gQyBjb2RlIChpbiBjYXNlIHdlIGltcG9ydCBzb21lIGZyb20KKy8vIHNvbWV3aGVyZSksIHNvIHRoaXMgaGFzIGEgQyBpbnRlcmZhY2UuCisvLworLy8gVGhlIG91dHB1dCB3aWxsIGJlIGNvcnJlY3Qgd2hlbiB0aGUgbG9nIGZpbGUgaXMgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUKKy8vIHRocmVhZHMgYW5kL29yIG11bHRpcGxlIHByb2Nlc3NlcyBzbyBsb25nIGFzIHRoZSBvcGVyYXRpbmcgc3lzdGVtCisvLyBzdXBwb3J0cyBPX0FQUEVORC4gIFRoZXNlIGNhbGxzIGhhdmUgbXV0ZXgtcHJvdGVjdGVkIGRhdGEgc3RydWN0dXJlcworLy8gYW5kIHNvIGFyZSBOT1QgcmVlbnRyYW50LiAgRG8gbm90IHVzZSBMT0cgaW4gYSBzaWduYWwgaGFuZGxlci4KKy8vCisjaWZuZGVmIF9MSUJTX1VUSUxTX0xPR19ICisjZGVmaW5lIF9MSUJTX1VUSUxTX0xPR19ICisKKyNpbmNsdWRlIDxjb21tb24vYWxvZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogQSB2ZXJ5IHNpbXBsZSB1dGlsaXR5IHRoYXQgeWVsbHMgaW4gdGhlIGxvZyB3aGVuIGFuIG9wZXJhdGlvbiB0YWtlcyB0b28gbG9uZy4KKyAqLworY2xhc3MgTG9nSWZTbG93IHsKK3B1YmxpYzoKKyAgICBMb2dJZlNsb3coY29uc3QgY2hhciogdGFnLCBhbmRyb2lkX0xvZ1ByaW9yaXR5IHByaW9yaXR5LAorICAgICAgICAgICAgaW50IHRpbWVvdXRNaWxsaXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworICAgIH5Mb2dJZlNsb3coKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBjb25zdCBtVGFnOworICAgIGNvbnN0IGFuZHJvaWRfTG9nUHJpb3JpdHkgbVByaW9yaXR5OworICAgIGNvbnN0IGludCBtVGltZW91dE1pbGxpczsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBtTWVzc2FnZTsKKyAgICBjb25zdCBpbnQ2NF90IG1TdGFydDsKK307CisKKy8qCisgKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBkZWJ1ZyBsb2cgbWVzc2FnZSBpZiB0aGlzIGJsb2NrIHRha2VzIGxvbmdlciB0aGFuIHRoZQorICogc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcnVuLiAgSW5jbHVkZXMgdGhlIHRpbWUgYWN0dWFsbHkgdGFrZW4uCisgKgorICogeworICogICAgIEFMT0dEX0lGX1NMT1coNTAsICJFeGNlc3NpdmUgZGVsYXkgZG9pbmcgc29tZXRoaW5nLiIpOworICogICAgIGRvU29tZXRoaW5nKCk7CisgKiB9CisgKi8KKyNkZWZpbmUgQUxPR0RfSUZfU0xPVyh0aW1lb3V0TWlsbGlzLCBtZXNzYWdlKSBcCisgICAgYW5kcm9pZDo6TG9nSWZTbG93IF9sb2dJZlNsb3coTE9HX1RBRywgQU5EUk9JRF9MT0dfREVCVUcsIHRpbWVvdXRNaWxsaXMsIG1lc3NhZ2UpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gX0xJQlNfVVRJTFNfTE9HX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliR0xFUzEyVHJhbnNsYXRvci91dGlscy9SZWZCYXNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvdXRpbHMvUmVmQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTc2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvdXRpbHMvUmVmQmFzZS5oCkBAIC0wLDAgKzEsNTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1JFRl9CQVNFX0gKKyNkZWZpbmUgQU5EUk9JRF9SRUZfQkFTRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVGV4dE91dHB1dDsKK1RleHRPdXRwdXQmIHByaW50V2Vha1BvaW50ZXIoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHZvaWQqIHZhbCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENPTVBBUkVfV0VBSyhfb3BfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3Qgc3A8VD4mIG8pIGNvbnN0IHsgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbV9wdHIgX29wXyBvLm1fcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3QgVCogbykgY29uc3QgeyAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbV9wdHIgX29wXyBvOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHNwPFU+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPHR5cGVuYW1lIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBVKiBvKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBtX3B0ciBfb3BfIG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFJlZmVyZW5jZVJlbmFtZXIgeworcHJvdGVjdGVkOgorICAgIC8vIGRlc3RydWN0b3IgaXMgcHVycG9zZWRseSBub3QgdmlydHVhbCBzbyB3ZSBhdm9pZCBjb2RlIG92ZXJoZWFkIGZyb20KKyAgICAvLyBzdWJjbGFzc2VzOyB3ZSBoYXZlIHRvIG1ha2UgaXQgcHJvdGVjdGVkIHRvIGd1YXJhbnRlZSB0aGF0IGl0CisgICAgLy8gY2Fubm90IGJlIGNhbGxlZCBmcm9tIHRoaXMgYmFzZSBjbGFzcyAoYW5kIHRvIG1ha2Ugc3RyaWN0IGNvbXBpbGVycworICAgIC8vIGhhcHB5KS4KKyAgICB+UmVmZXJlbmNlUmVuYW1lcigpIHsgfQorcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKHNpemVfdCBpKSBjb25zdCA9IDA7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVmQmFzZQoreworcHVibGljOgorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7CisgICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKKworICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGZvcmNlSW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKKworICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBHZXQgY3VycmVudCBzdHJvbmcgcmVmIGNvdW50LgorICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIGdldFN0cm9uZ0NvdW50KCkgY29uc3Q7CisKKyAgICBjbGFzcyB3ZWFrcmVmX3R5cGUKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBSZWZCYXNlKiAgICAgICAgICAgIHJlZkJhc2UoKSBjb25zdDsKKworICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGluY1dlYWsoY29uc3Qgdm9pZCogaWQpOworICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGRlY1dlYWsoY29uc3Qgdm9pZCogaWQpOworCisgICAgICAgIC8vIGFjcXVpcmVzIGEgc3Ryb25nIHJlZmVyZW5jZSBpZiB0aGVyZSBpcyBhbHJlYWR5IG9uZS4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBhdHRlbXB0SW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKTsKKworICAgICAgICAvLyBhY3F1aXJlcyBhIHdlYWsgcmVmZXJlbmNlIGlmIHRoZXJlIGlzIGFscmVhZHkgb25lLgorICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbHdheXMgc2FmZS4gc2VlIFByb2Nlc3NTdGF0ZS5jcHAgYW5kIEJwQmluZGVyLmNwcAorICAgICAgICAvLyBmb3IgcHJvcGVyIHVzZS4KKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBhdHRlbXB0SW5jV2Vhayhjb25zdCB2b2lkKiBpZCk7CisKKyAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBHZXQgY3VycmVudCB3ZWFrIHJlZiBjb3VudC4KKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRXZWFrQ291bnQoKSBjb25zdDsKKworICAgICAgICAvLyEgREVCVUdHSU5HIE9OTFk6IFByaW50IHJlZmVyZW5jZXMgaGVsZCBvbiBvYmplY3QuCisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnRSZWZzKCkgY29uc3Q7CisKKyAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBFbmFibGUgdHJhY2tpbmcgZm9yIHRoaXMgb2JqZWN0LgorICAgICAgICAvLyBlbmFibGUgLS0gZW5hYmxlL2Rpc2FibGUgdHJhY2tpbmcKKyAgICAgICAgLy8gcmV0YWluIC0tIHdoZW4gdHJhY2tpbmcgaXMgZW5hYmxlLCBpZiB0cnVlLCB0aGVuIHdlIHNhdmUgYSBzdGFjayB0cmFjZQorICAgICAgICAvLyAgICAgICAgICAgZm9yIGVhY2ggcmVmZXJlbmNlIGFuZCBkZXJlZmVyZW5jZTsgd2hlbiByZXRhaW4gPT0gZmFsc2UsIHdlCisgICAgICAgIC8vICAgICAgICAgICBtYXRjaCB1cCByZWZlcmVuY2VzIGFuZCBkZXJlZmVyZW5jZXMgYW5kIGtlZXAgb25seSB0aGUKKyAgICAgICAgLy8gICAgICAgICAgIG91dHN0YW5kaW5nIG9uZXMuCisKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB0cmFja01lKGJvb2wgZW5hYmxlLCBib29sIHJldGFpbik7CisgICAgfTsKKworICAgICAgICAgICAgd2Vha3JlZl90eXBlKiAgIGNyZWF0ZVdlYWsoY29uc3Qgdm9pZCogaWQpIGNvbnN0OworCisgICAgICAgICAgICB3ZWFrcmVmX3R5cGUqICAgZ2V0V2Vha1JlZnMoKSBjb25zdDsKKworICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBQcmludCByZWZlcmVuY2VzIGhlbGQgb24gb2JqZWN0LgorICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIHByaW50UmVmcygpIGNvbnN0IHsgZ2V0V2Vha1JlZnMoKS0+cHJpbnRSZWZzKCk7IH0KKworICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBFbmFibGUgdHJhY2tpbmcgb2Ygb2JqZWN0LgorICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIHRyYWNrTWUoYm9vbCBlbmFibGUsIGJvb2wgcmV0YWluKQorICAgIHsKKyAgICAgICAgZ2V0V2Vha1JlZnMoKS0+dHJhY2tNZShlbmFibGUsIHJldGFpbik7CisgICAgfQorCisgICAgdHlwZWRlZiBSZWZCYXNlIGJhc2V0eXBlOworCitwcm90ZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmQmFzZSgpOworICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5SZWZCYXNlKCk7CisKKyAgICAvLyEgRmxhZ3MgZm9yIGV4dGVuZE9iamVjdExpZmV0aW1lKCkKKyAgICBlbnVtIHsKKyAgICAgICAgT0JKRUNUX0xJRkVUSU1FX1NUUk9ORyAgPSAweDAwMDAsCisgICAgICAgIE9CSkVDVF9MSUZFVElNRV9XRUFLICAgID0gMHgwMDAxLAorICAgICAgICBPQkpFQ1RfTElGRVRJTUVfTUFTSyAgICA9IDB4MDAwMQorICAgIH07CisKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBleHRlbmRPYmplY3RMaWZldGltZShpbnQzMl90IG1vZGUpOworCisgICAgLy8hIEZsYWdzIGZvciBvbkluY1N0cm9uZ0F0dGVtcHRlZCgpCisgICAgZW51bSB7CisgICAgICAgIEZJUlNUX0lOQ19TVFJPTkcgPSAweDAwMDEKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25GaXJzdFJlZigpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uTGFzdFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCk7CisgICAgdmlydHVhbCBib29sICAgICAgICAgICAgb25JbmNTdHJvbmdBdHRlbXB0ZWQodWludDMyX3QgZmxhZ3MsIGNvbnN0IHZvaWQqIGlkKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkxhc3RXZWFrUmVmKGNvbnN0IHZvaWQqIGlkKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3Mgd2Vha3JlZl90eXBlOworICAgIGNsYXNzIHdlYWtyZWZfaW1wbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZkJhc2UoY29uc3QgUmVmQmFzZSYgbyk7CisgICAgICAgICAgICBSZWZCYXNlJiAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFJlZkJhc2UmIG8pOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBSZWZlcmVuY2VNb3ZlcjsKKworICAgIHN0YXRpYyB2b2lkIHJlbmFtZVJlZnMoc2l6ZV90IG4sIGNvbnN0IFJlZmVyZW5jZVJlbmFtZXImIHJlbmFtZXIpOworCisgICAgc3RhdGljIHZvaWQgcmVuYW1lUmVmSWQod2Vha3JlZl90eXBlKiByZWYsCisgICAgICAgICAgICBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCk7CisKKyAgICBzdGF0aWMgdm9pZCByZW5hbWVSZWZJZChSZWZCYXNlKiByZWYsCisgICAgICAgICAgICBjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCk7CisKKyAgICAgICAgd2Vha3JlZl9pbXBsKiBjb25zdCBtUmVmczsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKy8vIGNsYXNzIExpZ2h0UmVmQmFzZQorLy8geworLy8gcHVibGljOgorLy8gICAgIGlubGluZSBMaWdodFJlZkJhc2UoKSA6IG1Db3VudCgwKSB7IH0KKy8vICAgICBpbmxpbmUgdm9pZCBpbmNTdHJvbmcoX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKy8vICAgICAgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOworLy8gICAgIH0KKy8vICAgICBpbmxpbmUgdm9pZCBkZWNTdHJvbmcoX19hdHRyaWJ1dGVfXygodW51c2VkKSkgY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKKy8vICAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7CisvLyAgICAgICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KHRoaXMpOworLy8gICAgICAgICB9CisvLyAgICAgfQorLy8gICAgIC8vISBERUJVR0dJTkcgT05MWTogR2V0IGN1cnJlbnQgc3Ryb25nIHJlZiBjb3VudC4KKy8vICAgICBpbmxpbmUgaW50MzJfdCBnZXRTdHJvbmdDb3VudCgpIGNvbnN0IHsKKy8vICAgICAgICAgcmV0dXJuIG1Db3VudDsKKy8vICAgICB9CisvLyAKKy8vICAgICB0eXBlZGVmIExpZ2h0UmVmQmFzZTxUPiBiYXNldHlwZTsKKy8vIAorLy8gcHJvdGVjdGVkOgorLy8gICAgIGlubGluZSB+TGlnaHRSZWZCYXNlKCkgeyB9CisvLyAKKy8vIHByaXZhdGU6CisvLyAgICAgZnJpZW5kIGNsYXNzIFJlZmVyZW5jZU1vdmVyOworLy8gICAgIGlubGluZSBzdGF0aWMgdm9pZCByZW5hbWVSZWZzKHNpemVfdCBuLCBjb25zdCBSZWZlcmVuY2VSZW5hbWVyJiByZW5hbWVyKSB7IH0KKy8vICAgICBpbmxpbmUgc3RhdGljIHZvaWQgcmVuYW1lUmVmSWQoVCogcmVmLAorLy8gICAgICAgICAgICAgY29uc3Qgdm9pZCogb2xkX2lkLCBjb25zdCB2b2lkKiBuZXdfaWQpIHsgfQorLy8gCisvLyBwcml2YXRlOgorLy8gICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCBtQ291bnQ7CisvLyB9OworLy8gCisvLyAvLyBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgTGlnaHRSZWZCYXNlIHRoYXQgc2ltcGx5IGVuZm9yY2VzIGEgdmlydHVhbAorLy8gLy8gZGVzdHJ1Y3RvciB0byBlbGltaW5hdGUgdGhlIHRlbXBsYXRlIHJlcXVpcmVtZW50IG9mIExpZ2h0UmVmQmFzZQorLy8gY2xhc3MgVmlydHVhbExpZ2h0UmVmQmFzZSA6IHB1YmxpYyBMaWdodFJlZkJhc2U8VmlydHVhbExpZ2h0UmVmQmFzZT4geworLy8gcHVibGljOgorLy8gICAgIHZpcnR1YWwgflZpcnR1YWxMaWdodFJlZkJhc2UoKSB7fQorLy8gfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgd3AKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFJlZkJhc2U6OndlYWtyZWZfdHlwZSB3ZWFrcmVmX3R5cGU7CisKKyAgICBpbmxpbmUgd3AoKSA6IG1fcHRyKDApIHsgfQorCisgICAgd3AoVCogb3RoZXIpOworICAgIHdwKGNvbnN0IHdwPFQ+JiBvdGhlcik7CisgICAgd3AoY29uc3Qgc3A8VD4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cChVKiBvdGhlcik7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AoY29uc3Qgc3A8VT4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cChjb25zdCB3cDxVPiYgb3RoZXIpOworCisgICAgfndwKCk7CisKKyAgICAvLyBBc3NpZ25tZW50CisKKyAgICB3cCYgb3BlcmF0b3IgPSAoVCogb3RoZXIpOworICAgIHdwJiBvcGVyYXRvciA9IChjb25zdCB3cDxUPiYgb3RoZXIpOworICAgIHdwJiBvcGVyYXRvciA9IChjb25zdCBzcDxUPiYgb3RoZXIpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AmIG9wZXJhdG9yID0gKFUqIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cCYgb3BlcmF0b3IgPSAoY29uc3Qgd3A8VT4mIG90aGVyKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cCYgb3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKTsKKworICAgIHZvaWQgc2V0X29iamVjdF9hbmRfcmVmcyhUKiBvdGhlciwgd2Vha3JlZl90eXBlKiByZWZzKTsKKworICAgIC8vIHByb21vdGlvbiB0byBzcAorCisgICAgc3A8VD4gcHJvbW90ZSgpIGNvbnN0OworCisgICAgLy8gUmVzZXQKKworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8vIEFjY2Vzc29ycworCisgICAgaW5saW5lICB3ZWFrcmVmX3R5cGUqIGdldF9yZWZzKCkgY29uc3QgeyByZXR1cm4gbV9yZWZzOyB9CisKKyAgICBpbmxpbmUgIFQqIHVuc2FmZV9nZXQoKSBjb25zdCB7IHJldHVybiBtX3B0cjsgfQorCisgICAgLy8gT3BlcmF0b3JzCisKKyAgICBDT01QQVJFX1dFQUsoPT0pCisgICAgQ09NUEFSRV9XRUFLKCE9KQorICAgIENPTVBBUkVfV0VBSyg+KQorICAgIENPTVBBUkVfV0VBSyg8KQorICAgIENPTVBBUkVfV0VBSyg8PSkKKyAgICBDT01QQVJFX1dFQUsoPj0pCisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSAmJiAobV9yZWZzID09IG8ubV9yZWZzKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcHRyID09IG8ubV9wdHI7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSA/IChtX3JlZnMgPiBvLm1fcmVmcykgOiAobV9wdHIgPiBvLm1fcHRyKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA+IChjb25zdCB3cDxVPiYgbykgY29uc3QgeworICAgICAgICByZXR1cm4gKG1fcHRyID09IG8ubV9wdHIpID8gKG1fcmVmcyA+IG8ubV9yZWZzKSA6IChtX3B0ciA+IG8ubV9wdHIpOworICAgIH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobV9wdHIgPT0gby5tX3B0cikgPyAobV9yZWZzIDwgby5tX3JlZnMpIDogKG1fcHRyIDwgby5tX3B0cik7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSA/IChtX3JlZnMgPCBvLm1fcmVmcykgOiAobV9wdHIgPCBvLm1fcHRyKTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7IHJldHVybiBtX3JlZnMgIT0gby5tX3JlZnM7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA9PSAobyk7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA+IChvKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IGlubGluZSBib29sIG9wZXJhdG9yIDw9IChjb25zdCB3cDxVPiYgbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yID4gKG8pOyB9CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3IgPCAobyk7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBpbmxpbmUgYm9vbCBvcGVyYXRvciA+PSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA8IChvKTsgfQorCitwcml2YXRlOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyBzcDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBZPiBmcmllbmQgY2xhc3Mgd3A7CisKKyAgICBUKiAgICAgICAgICAgICAgbV9wdHI7CisgICAgd2Vha3JlZl90eXBlKiAgIG1fcmVmczsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgd3A8VD4mIHZhbCk7CisKKyN1bmRlZiBDT01QQVJFX1dFQUsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBObyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGJlbG93IGhlcmUuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit3cDxUPjo6d3AoVCogb3RoZXIpCisgICAgOiBtX3B0cihvdGhlcikKK3sKKyAgICBpZiAob3RoZXIpIG1fcmVmcyA9IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgord3A8VD46OndwKGNvbnN0IHdwPFQ+JiBvdGhlcikKKyAgICA6IG1fcHRyKG90aGVyLm1fcHRyKSwgbV9yZWZzKG90aGVyLm1fcmVmcykKK3sKKyAgICBpZiAobV9wdHIpIG1fcmVmcy0+aW5jV2Vhayh0aGlzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3dwPFQ+Ojp3cChjb25zdCBzcDxUPiYgb3RoZXIpCisgICAgOiBtX3B0cihvdGhlci5tX3B0cikKK3sKKyAgICBpZiAobV9wdHIpIHsKKyAgICAgICAgbV9yZWZzID0gbV9wdHItPmNyZWF0ZVdlYWsodGhpcyk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgord3A8VD46OndwKFUqIG90aGVyKQorICAgIDogbV9wdHIob3RoZXIpCit7CisgICAgaWYgKG90aGVyKSBtX3JlZnMgPSBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KK3dwPFQ+Ojp3cChjb25zdCB3cDxVPiYgb3RoZXIpCisgICAgOiBtX3B0cihvdGhlci5tX3B0cikKK3sKKyAgICBpZiAobV9wdHIpIHsKKyAgICAgICAgbV9yZWZzID0gb3RoZXIubV9yZWZzOworICAgICAgICBtX3JlZnMtPmluY1dlYWsodGhpcyk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgord3A8VD46OndwKGNvbnN0IHNwPFU+JiBvdGhlcikKKyAgICA6IG1fcHRyKG90aGVyLm1fcHRyKQoreworICAgIGlmIChtX3B0cikgeworICAgICAgICBtX3JlZnMgPSBtX3B0ci0+Y3JlYXRlV2Vhayh0aGlzKTsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit3cDxUPjo6fndwKCkKK3sKKyAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3dwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoVCogb3RoZXIpCit7CisgICAgd2Vha3JlZl90eXBlKiBuZXdSZWZzID0KKyAgICAgICAgb3RoZXIgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7CisgICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7CisgICAgbV9wdHIgPSBvdGhlcjsKKyAgICBtX3JlZnMgPSBuZXdSZWZzOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3dwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgd3A8VD4mIG90aGVyKQoreworICAgIHdlYWtyZWZfdHlwZSogb3RoZXJSZWZzKG90aGVyLm1fcmVmcyk7CisgICAgVCogb3RoZXJQdHIob3RoZXIubV9wdHIpOworICAgIGlmIChvdGhlclB0cikgb3RoZXJSZWZzLT5pbmNXZWFrKHRoaXMpOworICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOworICAgIG1fcHRyID0gb3RoZXJQdHI7CisgICAgbV9yZWZzID0gb3RoZXJSZWZzOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3dwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VD4mIG90aGVyKQoreworICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9CisgICAgICAgIG90aGVyICE9IE5VTEwgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7CisgICAgVCogb3RoZXJQdHIob3RoZXIubV9wdHIpOworICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOworICAgIG1fcHRyID0gb3RoZXJQdHI7CisgICAgbV9yZWZzID0gbmV3UmVmczsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Cit3cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKFUqIG90aGVyKQoreworICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9CisgICAgICAgIG90aGVyID8gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiAwOworICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOworICAgIG1fcHRyID0gb3RoZXI7CisgICAgbV9yZWZzID0gbmV3UmVmczsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Cit3cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKGNvbnN0IHdwPFU+JiBvdGhlcikKK3sKKyAgICB3ZWFrcmVmX3R5cGUqIG90aGVyUmVmcyhvdGhlci5tX3JlZnMpOworICAgIFUqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKKyAgICBpZiAob3RoZXJQdHIpIG90aGVyUmVmcy0+aW5jV2Vhayh0aGlzKTsKKyAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKKyAgICBtX3B0ciA9IG90aGVyUHRyOworICAgIG1fcmVmcyA9IG90aGVyUmVmczsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Cit3cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKGNvbnN0IHNwPFU+JiBvdGhlcikKK3sKKyAgICB3ZWFrcmVmX3R5cGUqIG5ld1JlZnMgPQorICAgICAgICBvdGhlciAhPSBOVUxMID8gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiAwOworICAgIFUqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKKyAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKKyAgICBtX3B0ciA9IG90aGVyUHRyOworICAgIG1fcmVmcyA9IG5ld1JlZnM7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB3cDxUPjo6c2V0X29iamVjdF9hbmRfcmVmcyhUKiBvdGhlciwgd2Vha3JlZl90eXBlKiByZWZzKQoreworICAgIGlmIChvdGhlcikgcmVmcy0+aW5jV2Vhayh0aGlzKTsKKyAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKKyAgICBtX3B0ciA9IG90aGVyOworICAgIG1fcmVmcyA9IHJlZnM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzcDxUPiB3cDxUPjo6cHJvbW90ZSgpIGNvbnN0Cit7CisgICAgc3A8VD4gcmVzdWx0OworICAgIGlmIChtX3B0ciAmJiBtX3JlZnMtPmF0dGVtcHRJbmNTdHJvbmcoJnJlc3VsdCkpIHsKKyAgICAgICAgcmVzdWx0LnNldF9wb2ludGVyKG1fcHRyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgd3A8VD46OmNsZWFyKCkKK3sKKyAgICBpZiAobV9wdHIpIHsKKyAgICAgICAgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOworICAgICAgICBtX3B0ciA9IDA7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBUZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCB3cDxUPiYgdmFsKQoreworICAgIHJldHVybiBwcmludFdlYWtQb2ludGVyKHRvLCB2YWwudW5zYWZlX2dldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHRoaXMgY2xhc3MganVzdCBzZXJ2ZXMgYXMgYSBuYW1lc3BhY2Ugc28gVFlQRTo6bW92ZVJlZmVyZW5jZXMgY2FuIHN0YXkKKy8vIHByaXZhdGUuCitjbGFzcyBSZWZlcmVuY2VNb3ZlciB7CitwdWJsaWM6CisgICAgLy8gaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBtYWtlIHN1cmUgbm8gZXh0cmEgY29kZSBpcyBnZW5lcmF0ZWQKKyAgICAvLyBmb3Igc3A8VFlQRT4gb3Igd3A8VFlQRT4gd2hlbiBUWVBFIGlzIGEgZGVzY2VuZGFudCBvZiBSZWZCYXNlOgorICAgIC8vIFVzaW5nIGEgc3A8UmVmQmFzZT4gb3ZlcnJpZGUgZG9lc24ndCB3b3JrOyBpdCdzIGEgYml0IGxpa2Ugd2Ugd2FudGVkCisgICAgLy8gYSB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFIGluaGVyaXRzIFJlZkJhc2U+IHRlbXBsYXRlLi4uCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBzdGF0aWMgaW5saW5lCisgICAgdm9pZCBtb3ZlX3JlZmVyZW5jZXMoc3A8VFlQRT4qIGQsIHNwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgeworCisgICAgICAgIGNsYXNzIFJlbmFtZXIgOiBwdWJsaWMgUmVmZXJlbmNlUmVuYW1lciB7CisgICAgICAgICAgICBzcDxUWVBFPiogZDsKKyAgICAgICAgICAgIHNwPFRZUEU+IGNvbnN0KiBzOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoc2l6ZV90IGkpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaWQgYXJlIGtub3duIHRvIGJlIHRoZSBzcDw+J3MgdGhpcyBwb2ludGVyCisgICAgICAgICAgICAgICAgVFlQRTo6cmVuYW1lUmVmSWQoZFtpXS5nZXQoKSwgJnNbaV0sICZkW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgUmVuYW1lcihzcDxUWVBFPiogZCwgc3A8VFlQRT4gY29uc3QqIHMpIDogZChkKSwgcyhzKSB7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgflJlbmFtZXIoKSB7IH0KKyAgICAgICAgfTsKKworICAgICAgICBtZW1tb3ZlKGQsIHMsIG4qc2l6ZW9mKHNwPFRZUEU+KSk7CisgICAgICAgIFRZUEU6OnJlbmFtZVJlZnMobiwgUmVuYW1lcihkLCBzKSk7CisgICAgfQorCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBzdGF0aWMgaW5saW5lCisgICAgdm9pZCBtb3ZlX3JlZmVyZW5jZXMod3A8VFlQRT4qIGQsIHdwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgeworCisgICAgICAgIGNsYXNzIFJlbmFtZXIgOiBwdWJsaWMgUmVmZXJlbmNlUmVuYW1lciB7CisgICAgICAgICAgICB3cDxUWVBFPiogZDsKKyAgICAgICAgICAgIHdwPFRZUEU+IGNvbnN0KiBzOworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoc2l6ZV90IGkpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaWQgYXJlIGtub3duIHRvIGJlIHRoZSB3cDw+J3MgdGhpcyBwb2ludGVyCisgICAgICAgICAgICAgICAgVFlQRTo6cmVuYW1lUmVmSWQoZFtpXS5nZXRfcmVmcygpLCAmc1tpXSwgJmRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBSZW5hbWVyKHdwPFRZUEU+KiBkLCB3cDxUWVBFPiBjb25zdCogcykgOiBkKGQpLCBzKHMpIHsgfQorICAgICAgICAgICAgdmlydHVhbCB+UmVuYW1lcigpIHsgfQorICAgICAgICB9OworCisgICAgICAgIG1lbW1vdmUoZCwgcywgbipzaXplb2Yod3A8VFlQRT4pKTsKKyAgICAgICAgVFlQRTo6cmVuYW1lUmVmcyhuLCBSZW5hbWVyKGQsIHMpKTsKKyAgICB9Cit9OworCisvLyBzcGVjaWFsaXphdGlvbiBmb3IgbW92aW5nIHNwPD4gYW5kIHdwPD4gdHlwZXMuCisvLyB0aGVzZSBhcmUgdXNlZCBieSB0aGUgW1NvcnRlZHxLZXllZF1WZWN0b3I8PiBpbXBsZW1lbnRhdGlvbnMKKy8vIHNwPD4gYW5kIHdwPD4gbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseSwgYmVjYXVzZSB0aGV5IGRvIG5vdAorLy8gaGF2ZSB0cml2aWFsIGNvcHkgb3BlcmF0aW9uIGluIHRoZSBnZW5lcmFsIGNhc2UgKHNlZSBSZWZCYXNlLmNwcAorLy8gd2hlbiBERUJVRyBvcHMgYXJlIGVuYWJsZWQpLCBidXQgY2FuIGJlIGltcGxlbWVudGVkIHZlcnkKKy8vIGVmZmljaWVudGx5IGluIG1vc3QgY2FzZXMuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQordm9pZCBtb3ZlX2ZvcndhcmRfdHlwZShzcDxUWVBFPiogZCwgc3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7CisgICAgUmVmZXJlbmNlTW92ZXI6Om1vdmVfcmVmZXJlbmNlcyhkLCBzLCBuKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCit2b2lkIG1vdmVfYmFja3dhcmRfdHlwZShzcDxUWVBFPiogZCwgc3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7CisgICAgUmVmZXJlbmNlTW92ZXI6Om1vdmVfcmVmZXJlbmNlcyhkLCBzLCBuKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCit2b2lkIG1vdmVfZm9yd2FyZF90eXBlKHdwPFRZUEU+KiBkLCB3cDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKKyAgICBSZWZlcmVuY2VNb3Zlcjo6bW92ZV9yZWZlcmVuY2VzKGQsIHMsIG4pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKK3ZvaWQgbW92ZV9iYWNrd2FyZF90eXBlKHdwPFRZUEU+KiBkLCB3cDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKKyAgICBSZWZlcmVuY2VNb3Zlcjo6bW92ZV9yZWZlcmVuY2VzKGQsIHMsIG4pOworfQorCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZW5kaWYgLy8gQU5EUk9JRF9SRUZfQkFTRV9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvdXRpbHMvU3Ryb25nUG9pbnRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc4ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL1N0cm9uZ1BvaW50ZXIuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TVFJPTkdfUE9JTlRFUl9ICisjZGVmaW5lIEFORFJPSURfU1RST05HX1BPSU5URVJfSAorCisvLyAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFtZXNwYWNlIGFuZHJvaWQgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB3cDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ09NUEFSRShfb3BfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBzcDxUPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAorCXJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBUKiBvKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgXAorCXJldHVybiBtX3B0ciBfb3BfIG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTx0eXBlbmFtZSBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3Qgc3A8VT4mIG8pIGNvbnN0IHsgICAgICAgICAgICAgIFwKKwlyZXR1cm4gbV9wdHIgX29wXyBvLm1fcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8dHlwZW5hbWUgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IFUqIG8pIGNvbnN0IHsgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIG1fcHRyIF9vcF8gbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2lubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCisJcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPHR5cGVuYW1lIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCB3cDxVPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAorCXJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBzcCB7CitwdWJsaWM6CisJaW5saW5lIHNwKCkgOiBtX3B0cigwKSB7IH0KKworCXNwKFQqIG90aGVyKTsKKwlzcChjb25zdCBzcDxUPiYgb3RoZXIpOworCXRlbXBsYXRlPHR5cGVuYW1lIFU+IHNwKFUqIG90aGVyKTsKKwl0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzcChjb25zdCBzcDxVPiYgb3RoZXIpOworCisJfnNwKCk7CisKKwkvLyBBc3NpZ25tZW50CisKKwlzcCYgb3BlcmF0b3IgPSAoVCogb3RoZXIpOworCXNwJiBvcGVyYXRvciA9IChjb25zdCBzcDxUPiYgb3RoZXIpOworCisJdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3AmIG9wZXJhdG9yID0gKGNvbnN0IHNwPFU+JiBvdGhlcik7CisJdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3AmIG9wZXJhdG9yID0gKFUqIG90aGVyKTsKKworCS8vISBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3IgdXNlIGJ5IFByb2Nlc3NTdGF0ZSAoYW5kIG5vYm9keSBlbHNlKS4KKwl2b2lkIGZvcmNlX3NldChUKiBvdGhlcik7CisKKwkvLyBSZXNldAorCisJdm9pZCBjbGVhcigpOworCisJLy8gQWNjZXNzb3JzCisKKwlpbmxpbmUgIFQmICAgICAgb3BlcmF0b3IqICgpIGNvbnN0ICB7IHJldHVybiAqbV9wdHI7IH0KKwlpbmxpbmUgIFQqICAgICAgb3BlcmF0b3ItPiAoKSBjb25zdCB7IHJldHVybiBtX3B0cjsgIH0KKwlpbmxpbmUgIFQqICAgICAgZ2V0KCkgY29uc3QgICAgICAgICB7IHJldHVybiBtX3B0cjsgfQorCisJLy8gT3BlcmF0b3JzCisKKwlDT01QQVJFKD09KQorCUNPTVBBUkUoIT0pCisJQ09NUEFSRSg+KQorCUNPTVBBUkUoPCkKKwlDT01QQVJFKDw9KQorCUNPTVBBUkUoPj0pCisKK3ByaXZhdGU6CisJdGVtcGxhdGU8dHlwZW5hbWUgWT4gZnJpZW5kIGNsYXNzIHNwOworCXRlbXBsYXRlPHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyB3cDsKKwl2b2lkIHNldF9wb2ludGVyKFQqIHB0cik7CisJVCogbV9wdHI7Cit9OworCisjdW5kZWYgQ09NUEFSRQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgYmVsb3cgaGVyZS4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NwPFQ+OjpzcChUKiBvdGhlcikKKwkJOiBtX3B0cihvdGhlcikgeworCWlmIChvdGhlcikKKwkJb3RoZXItPmluY1N0cm9uZyh0aGlzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NwPFQ+OjpzcChjb25zdCBzcDxUPiYgb3RoZXIpCisJCTogbV9wdHIob3RoZXIubV9wdHIpIHsKKwlpZiAobV9wdHIpCisJCW1fcHRyLT5pbmNTdHJvbmcodGhpcyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+CitzcDxUPjo6c3AoVSogb3RoZXIpCisJCTogbV9wdHIob3RoZXIpIHsKKwlpZiAob3RoZXIpCisJCSgoVCopIG90aGVyKS0+aW5jU3Ryb25nKHRoaXMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorc3A8VD46OnNwKGNvbnN0IHNwPFU+JiBvdGhlcikKKwkJOiBtX3B0cihvdGhlci5tX3B0cikgeworCWlmIChtX3B0cikKKwkJbV9wdHItPmluY1N0cm9uZyh0aGlzKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3NwPFQ+Ojp+c3AoKSB7CisJaWYgKG1fcHRyKQorCQltX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3A8VD4mIHNwPFQ+OjpvcGVyYXRvciA9KGNvbnN0IHNwPFQ+JiBvdGhlcikgeworCVQqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKKwlpZiAob3RoZXJQdHIpCisJCW90aGVyUHRyLT5pbmNTdHJvbmcodGhpcyk7CisJaWYgKG1fcHRyKQorCQltX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOworCW1fcHRyID0gb3RoZXJQdHI7CisJcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3A8VD4mIHNwPFQ+OjpvcGVyYXRvciA9KFQqIG90aGVyKSB7CisJaWYgKG90aGVyKQorCQlvdGhlci0+aW5jU3Ryb25nKHRoaXMpOworCWlmIChtX3B0cikKKwkJbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKKwltX3B0ciA9IG90aGVyOworCXJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KK3NwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPShjb25zdCBzcDxVPiYgb3RoZXIpIHsKKwlUKiBvdGhlclB0cihvdGhlci5tX3B0cik7CisJaWYgKG90aGVyUHRyKQorCQlvdGhlclB0ci0+aW5jU3Ryb25nKHRoaXMpOworCWlmIChtX3B0cikKKwkJbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKKwltX3B0ciA9IG90aGVyUHRyOworCXJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KK3NwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPShVKiBvdGhlcikgeworCWlmIChvdGhlcikKKwkJKChUKikgb3RoZXIpLT5pbmNTdHJvbmcodGhpcyk7CisJaWYgKG1fcHRyKQorCQltX3B0ci0+ZGVjU3Ryb25nKHRoaXMpOworCW1fcHRyID0gb3RoZXI7CisJcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBzcDxUPjo6Zm9yY2Vfc2V0KFQqIG90aGVyKSB7CisJb3RoZXItPmZvcmNlSW5jU3Ryb25nKHRoaXMpOworCW1fcHRyID0gb3RoZXI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHNwPFQ+OjpjbGVhcigpIHsKKwlpZiAobV9wdHIpIHsKKwkJbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKKwkJbV9wdHIgPSAwOworCX0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgc3A8VD46OnNldF9wb2ludGVyKFQqIHB0cikgeworCW1fcHRyID0gcHRyOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIEFORFJPSURfU1RST05HX1BPSU5URVJfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL1R5cGVIZWxwZXJzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYkdMRVMxMlRyYW5zbGF0b3IvdXRpbHMvVHlwZUhlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2M5MDgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJHTEVTMTJUcmFuc2xhdG9yL3V0aWxzL1R5cGVIZWxwZXJzLmgKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVFlQRV9IRUxQRVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9UWVBFX0hFTFBFUlNfSAorCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKgorICogVHlwZXMgdHJhaXRzCisgKi8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF90cml2aWFsX2N0b3IgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF90cml2aWFsX2R0b3IgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF90cml2aWFsX2NvcHkgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF90cml2aWFsX21vdmUgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF9wb2ludGVyICAgICAgeyBlbnVtIHsgdmFsdWUgPSBmYWxzZSB9OyB9OyAgICAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgdHJhaXRfcG9pbnRlcjxUKj4gIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KK3N0cnVjdCB0cmFpdHMgeworICAgIGVudW0geworICAgICAgICAvLyB3aGV0aGVyIHRoaXMgdHlwZSBpcyBhIHBvaW50ZXIKKyAgICAgICAgaXNfcG9pbnRlciAgICAgICAgICA9IHRyYWl0X3BvaW50ZXI8VFlQRT46OnZhbHVlLAorICAgICAgICAvLyB3aGV0aGVyIHRoaXMgdHlwZSdzIGNvbnN0cnVjdG9yIGlzIGEgbm8tb3AKKyAgICAgICAgaGFzX3RyaXZpYWxfY3RvciAgICA9IGlzX3BvaW50ZXIgfHwgdHJhaXRfdHJpdmlhbF9jdG9yPFRZUEU+Ojp2YWx1ZSwKKyAgICAgICAgLy8gd2hldGhlciB0aGlzIHR5cGUncyBkZXN0cnVjdG9yIGlzIGEgbm8tb3AKKyAgICAgICAgaGFzX3RyaXZpYWxfZHRvciAgICA9IGlzX3BvaW50ZXIgfHwgdHJhaXRfdHJpdmlhbF9kdG9yPFRZUEU+Ojp2YWx1ZSwKKyAgICAgICAgLy8gd2hldGhlciB0aGlzIHR5cGUgdHlwZSBjYW4gYmUgY29weS1jb25zdHJ1Y3RlZCB3aXRoIG1lbWNweQorICAgICAgICBoYXNfdHJpdmlhbF9jb3B5ICAgID0gaXNfcG9pbnRlciB8fCB0cmFpdF90cml2aWFsX2NvcHk8VFlQRT46OnZhbHVlLAorICAgICAgICAvLyB3aGV0aGVyIHRoaXMgdHlwZSBjYW4gYmUgbW92ZWQgd2l0aCBtZW1tb3ZlCisgICAgICAgIGhhc190cml2aWFsX21vdmUgICAgPSBpc19wb2ludGVyIHx8IHRyYWl0X3RyaXZpYWxfbW92ZTxUWVBFPjo6dmFsdWUKKyAgICB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgYWdncmVnYXRlX3RyYWl0cyB7CisgICAgZW51bSB7CisgICAgICAgIGlzX3BvaW50ZXIgICAgICAgICAgPSBmYWxzZSwKKyAgICAgICAgaGFzX3RyaXZpYWxfY3RvciAgICA9IAorICAgICAgICAgICAgdHJhaXRzPFQ+OjpoYXNfdHJpdmlhbF9jdG9yICYmIHRyYWl0czxVPjo6aGFzX3RyaXZpYWxfY3RvciwKKyAgICAgICAgaGFzX3RyaXZpYWxfZHRvciAgICA9IAorICAgICAgICAgICAgdHJhaXRzPFQ+OjpoYXNfdHJpdmlhbF9kdG9yICYmIHRyYWl0czxVPjo6aGFzX3RyaXZpYWxfZHRvciwKKyAgICAgICAgaGFzX3RyaXZpYWxfY29weSAgICA9IAorICAgICAgICAgICAgdHJhaXRzPFQ+OjpoYXNfdHJpdmlhbF9jb3B5ICYmIHRyYWl0czxVPjo6aGFzX3RyaXZpYWxfY29weSwKKyAgICAgICAgaGFzX3RyaXZpYWxfbW92ZSAgICA9IAorICAgICAgICAgICAgdHJhaXRzPFQ+OjpoYXNfdHJpdmlhbF9tb3ZlICYmIHRyYWl0czxVPjo6aGFzX3RyaXZpYWxfbW92ZQorICAgIH07Cit9OworCisjZGVmaW5lIEFORFJPSURfVFJJVklBTF9DVE9SX1RSQUlUKCBUICkgXAorICAgIHRlbXBsYXRlPD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfY3RvcjwgVCA+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisKKyNkZWZpbmUgQU5EUk9JRF9UUklWSUFMX0RUT1JfVFJBSVQoIFQgKSBcCisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9kdG9yPCBUID4gICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKKworI2RlZmluZSBBTkRST0lEX1RSSVZJQUxfQ09QWV9UUkFJVCggVCApIFwKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCB0cmFpdF90cml2aWFsX2NvcHk8IFQgPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OworCisjZGVmaW5lIEFORFJPSURfVFJJVklBTF9NT1ZFX1RSQUlUKCBUICkgXAorICAgIHRlbXBsYXRlPD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfbW92ZTwgVCA+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07CisKKyNkZWZpbmUgQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIFQgKSBcCisgICAgQU5EUk9JRF9UUklWSUFMX0NUT1JfVFJBSVQoIFQgKSBcCisgICAgQU5EUk9JRF9UUklWSUFMX0RUT1JfVFJBSVQoIFQgKSBcCisgICAgQU5EUk9JRF9UUklWSUFMX0NPUFlfVFJBSVQoIFQgKSBcCisgICAgQU5EUk9JRF9UUklWSUFMX01PVkVfVFJBSVQoIFQgKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIGJhc2ljIHR5cGVzIHRyYWl0cworICovCisKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB2b2lkICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBib29sICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBjaGFyICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB1bnNpZ25lZCBjaGFyICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBzaG9ydCApCitBTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgc2hvcnQgKQorQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGludCApCitBTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgaW50ICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBsb25nICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB1bnNpZ25lZCBsb25nICkKK0FORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBsb25nIGxvbmcgKQorQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIHVuc2lnbmVkIGxvbmcgbG9uZyApCitBTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggZmxvYXQgKQorQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGRvdWJsZSApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8qCisgKiBjb21wYXJlIGFuZCBvcmRlciB0eXBlcworICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQoraW50IHN0cmljdGx5X29yZGVyX3R5cGUoY29uc3QgVFlQRSYgbGhzLCBjb25zdCBUWVBFJiByaHMpIHsKKyAgICByZXR1cm4gKGxocyA8IHJocykgPyAxIDogMDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCitpbnQgY29tcGFyZV90eXBlKGNvbnN0IFRZUEUmIGxocywgY29uc3QgVFlQRSYgcmhzKSB7CisgICAgcmV0dXJuIHN0cmljdGx5X29yZGVyX3R5cGUocmhzLCBsaHMpIC0gc3RyaWN0bHlfb3JkZXJfdHlwZShsaHMsIHJocyk7Cit9CisKKy8qCisgKiBjcmVhdGUsIGRlc3Ryb3ksIGNvcHkgYW5kIG1vdmUgdHlwZXMuLi4KKyAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKK3ZvaWQgY29uc3RydWN0X3R5cGUoVFlQRSogcCwgc2l6ZV90IG4pIHsKKyAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY3RvcikgeworICAgICAgICB3aGlsZSAobi0tKSB7CisgICAgICAgICAgICBuZXcocCsrKSBUWVBFOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKK3ZvaWQgZGVzdHJveV90eXBlKFRZUEUqIHAsIHNpemVfdCBuKSB7CisgICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IpIHsKKyAgICAgICAgd2hpbGUgKG4tLSkgeworICAgICAgICAgICAgcC0+flRZUEUoKTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCit2b2lkIGNvcHlfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbikgeworICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jb3B5KSB7CisgICAgICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKKyAgICAgICAgICAgIGQrKywgcysrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KGQscyxuKnNpemVvZihUWVBFKSk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKK3ZvaWQgc3BsYXRfdHlwZShUWVBFKiB3aGVyZSwgY29uc3QgVFlQRSogd2hhdCwgc2l6ZV90IG4pIHsKKyAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgeworICAgICAgICB3aGlsZSAobi0tKSB7CisgICAgICAgICAgICBuZXcod2hlcmUpIFRZUEUoKndoYXQpOworICAgICAgICAgICAgd2hlcmUrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlIChuLS0pIHsKKyAgICAgICAgICAgICp3aGVyZSsrID0gKndoYXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQordm9pZCBtb3ZlX2ZvcndhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKKyAgICBpZiAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAmJiB0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIAorICAgICAgICAgICAgfHwgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9tb3ZlKSAKKyAgICB7CisgICAgICAgIG1lbW1vdmUoZCxzLG4qc2l6ZW9mKFRZUEUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkICs9IG47CisgICAgICAgIHMgKz0gbjsKKyAgICAgICAgd2hpbGUgKG4tLSkgeworICAgICAgICAgICAgLS1kLCAtLXM7CisgICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgeworICAgICAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmQgPSAqczsgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yKSB7CisgICAgICAgICAgICAgICAgcy0+flRZUEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCit2b2lkIG1vdmVfYmFja3dhcmRfdHlwZShUWVBFKiBkLCBjb25zdCBUWVBFKiBzLCBzaXplX3QgbiA9IDEpIHsKKyAgICBpZiAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAmJiB0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIAorICAgICAgICAgICAgfHwgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9tb3ZlKSAKKyAgICB7CisgICAgICAgIG1lbW1vdmUoZCxzLG4qc2l6ZW9mKFRZUEUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAobi0tKSB7CisgICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgeworICAgICAgICAgICAgICAgIG5ldyhkKSBUWVBFKCpzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmQgPSAqczsgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yKSB7CisgICAgICAgICAgICAgICAgcy0+flRZUEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQrKywgcysrOworICAgICAgICB9CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAqIGEga2V5L3ZhbHVlIHBhaXIKKyAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4KK3N0cnVjdCBrZXlfdmFsdWVfcGFpcl90IHsKKyAgICB0eXBlZGVmIEtFWSBrZXlfdDsKKyAgICB0eXBlZGVmIFZBTFVFIHZhbHVlX3Q7CisKKyAgICBLRVkgICAgIGtleTsKKyAgICBWQUxVRSAgIHZhbHVlOworICAgIGtleV92YWx1ZV9wYWlyX3QoKSB7IH0KKyAgICBrZXlfdmFsdWVfcGFpcl90KGNvbnN0IGtleV92YWx1ZV9wYWlyX3QmIG8pIDoga2V5KG8ua2V5KSwgdmFsdWUoby52YWx1ZSkgeyB9CisgICAga2V5X3ZhbHVlX3BhaXJfdChjb25zdCBLRVkmIGssIGNvbnN0IFZBTFVFJiB2KSA6IGtleShrKSwgdmFsdWUodikgIHsgfQorICAgIGtleV92YWx1ZV9wYWlyX3QoY29uc3QgS0VZJiBrKSA6IGtleShrKSB7IH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA8IChjb25zdCBrZXlfdmFsdWVfcGFpcl90JiBvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdHJpY3RseV9vcmRlcl90eXBlKGtleSwgby5rZXkpOworICAgIH0KKyAgICBpbmxpbmUgY29uc3QgS0VZJiBnZXRLZXkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorICAgIGlubGluZSBjb25zdCBWQUxVRSYgZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0cnVjdCB0cmFpdF90cml2aWFsX2N0b3I8IGtleV92YWx1ZV9wYWlyX3Q8SywgVj4gPgoreyBlbnVtIHsgdmFsdWUgPSBhZ2dyZWdhdGVfdHJhaXRzPEssVj46Omhhc190cml2aWFsX2N0b3IgfTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RydWN0IHRyYWl0X3RyaXZpYWxfZHRvcjwga2V5X3ZhbHVlX3BhaXJfdDxLLCBWPiA+Cit7IGVudW0geyB2YWx1ZSA9IGFnZ3JlZ2F0ZV90cmFpdHM8SyxWPjo6aGFzX3RyaXZpYWxfZHRvciB9OyB9OwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+CitzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jb3B5PCBrZXlfdmFsdWVfcGFpcl90PEssIFY+ID4KK3sgZW51bSB7IHZhbHVlID0gYWdncmVnYXRlX3RyYWl0czxLLFY+OjpoYXNfdHJpdmlhbF9jb3B5IH07IH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0cnVjdCB0cmFpdF90cml2aWFsX21vdmU8IGtleV92YWx1ZV9wYWlyX3Q8SywgVj4gPgoreyBlbnVtIHsgdmFsdWUgPSBhZ2dyZWdhdGVfdHJhaXRzPEssVj46Omhhc190cml2aWFsX21vdmUgfTsgfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgKiBIYXNoIGNvZGVzLgorICovCit0eXBlZGVmIHVpbnQzMl90IGhhc2hfdDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRLZXk+CitoYXNoX3QgaGFzaF90eXBlKGNvbnN0IFRLZXkmIGtleSk7CisKKy8qIEJ1aWx0LWluIGhhc2ggY29kZSBzcGVjaWFsaXphdGlvbnMuCisgKiBBc3N1bWVzIHBvaW50ZXJzIGFyZSAzMmJpdC4gKi8KKyNkZWZpbmUgQU5EUk9JRF9JTlQzMl9IQVNIKFQpIFwKKyAgICAgICAgdGVtcGxhdGUgPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVCYgdmFsdWUpIHsgcmV0dXJuIGhhc2hfdCh2YWx1ZSk7IH0KKyNkZWZpbmUgQU5EUk9JRF9JTlQ2NF9IQVNIKFQpIFwKKyAgICAgICAgdGVtcGxhdGUgPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVCYgdmFsdWUpIHsgXAorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX3QoKHZhbHVlID4+IDMyKSBeIHZhbHVlKTsgfQorI2RlZmluZSBBTkRST0lEX1JFSU5URVJQUkVUX0hBU0goVCwgUikgXAorICAgICAgICB0ZW1wbGF0ZSA8PiBpbmxpbmUgaGFzaF90IGhhc2hfdHlwZShjb25zdCBUJiB2YWx1ZSkgeyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hfdHlwZSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSKj4oJnZhbHVlKSk7IH0KKworQU5EUk9JRF9JTlQzMl9IQVNIKGJvb2wpCitBTkRST0lEX0lOVDMyX0hBU0goaW50OF90KQorQU5EUk9JRF9JTlQzMl9IQVNIKHVpbnQ4X3QpCitBTkRST0lEX0lOVDMyX0hBU0goaW50MTZfdCkKK0FORFJPSURfSU5UMzJfSEFTSCh1aW50MTZfdCkKK0FORFJPSURfSU5UMzJfSEFTSChpbnQzMl90KQorQU5EUk9JRF9JTlQzMl9IQVNIKHVpbnQzMl90KQorQU5EUk9JRF9JTlQ2NF9IQVNIKGludDY0X3QpCitBTkRST0lEX0lOVDY0X0hBU0godWludDY0X3QpCitBTkRST0lEX1JFSU5URVJQUkVUX0hBU0goZmxvYXQsIHVpbnQzMl90KQorQU5EUk9JRF9SRUlOVEVSUFJFVF9IQVNIKGRvdWJsZSwgdWludDY0X3QpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgaGFzaF90IGhhc2hfdHlwZShUKiBjb25zdCAmIHZhbHVlKSB7CisgICAgcmV0dXJuIGhhc2hfdHlwZSh1aW50cHRyX3QodmFsdWUpKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAvLyBBTkRST0lEX1RZUEVfSEVMUEVSU19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjODhhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyBob3N0IGxpYnJhcnkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiskKGNhbGwgZW11Z2wtYmVnaW4tc3RhdGljLWxpYnJhcnksbGliT3BlbkdMRVNEaXNwYXRjaCkKKyQoY2FsbCBlbXVnbC1pbXBvcnQsbGliR0xFU3YyX2RlYyBsaWJHTEVTdjFfZGVjKQorCisjIHVzZSBUcmFuc2xhdG9yJ3MgZWdsIGhlYWRlcnMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvVHJhbnNsYXRvci9pbmNsdWRlCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoRU1VR0xfUEFUSCkvc2hhcmVkCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBFR0xEaXNwYXRjaC5jcHAgXAorICAgICAgICAgICAgICAgICAgIEdMRVN2MkRpc3BhdGNoLmNwcCBcCisgICAgICAgICAgICAgICAgICAgR0xFU3YxRGlzcGF0Y2guY3BwCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitFR0xEaXNwYXRjaCBzX2VnbDsKKworI2RlZmluZSBERUZBVUxUX0VHTF9MSUIgRU1VR0xfTElCTkFNRSgiRUdMX3RyYW5zbGF0b3IiKQorCisjZGVmaW5lIFJFTkRFUl9FR0xfTE9BRF9GSUVMRChyZXR1cm5fdHlwZSwgZnVuY3Rpb25fbmFtZSwgc2lnbmF0dXJlKSBcCisgICAgc19lZ2wuIGZ1bmN0aW9uX25hbWUgPSAoZnVuY3Rpb25fbmFtZSAjIyBfdCkgbGliLT5maW5kU3ltYm9sKCNmdW5jdGlvbl9uYW1lKTsKKworI2RlZmluZSBSRU5ERVJfRUdMX0xPQURfT1BUSU9OQUxfRklFTEQocmV0dXJuX3R5cGUsIGZ1bmN0aW9uX25hbWUsIHNpZ25hdHVyZSkgXAorICAgIGlmIChzX2VnbC5lZ2xHZXRQcm9jQWRkcmVzcykgc19lZ2wuIGZ1bmN0aW9uX25hbWUgPSBcCisgICAgICAgICAgICAoZnVuY3Rpb25fbmFtZSAjIyBfdCkgc19lZ2wuZWdsR2V0UHJvY0FkZHJlc3MoI2Z1bmN0aW9uX25hbWUpOyBcCisgICAgaWYgKCFzX2VnbC5mdW5jdGlvbl9uYW1lIHx8ICFzX2VnbC5lZ2xHZXRQcm9jQWRkcmVzcykgXAorICAgICAgICAgICAgUkVOREVSX0VHTF9MT0FEX0ZJRUxEKHJldHVybl90eXBlLCBmdW5jdGlvbl9uYW1lLCBzaWduYXR1cmUpCisKK2Jvb2wgaW5pdF9lZ2xfZGlzcGF0Y2goKQoreworCisgICAgY29uc3QgY2hhciAqbGliTmFtZSA9IGdldGVudigiQU5EUk9JRF9FR0xfTElCIik7CisgICAgaWYgKCFsaWJOYW1lKSBsaWJOYW1lID0gREVGQVVMVF9FR0xfTElCOworCisgICAgY2hhciBlcnJvclsyNTZdOworICAgIGVtdWdsOjpTaGFyZWRMaWJyYXJ5ICpsaWIgPSBlbXVnbDo6U2hhcmVkTGlicmFyeTo6b3BlbihsaWJOYW1lLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgaWYgKCFsaWIpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gb3BlbiAlczogWyVzXVxuIiwgbGliTmFtZSwgZXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIExJU1RfUkVOREVSX0VHTF9GVU5DVElPTlMoUkVOREVSX0VHTF9MT0FEX0ZJRUxEKQorICAgIExJU1RfUkVOREVSX0VHTF9FWFRFTlNJT05TX0ZVTkNUSU9OUyhSRU5ERVJfRUdMX0xPQURfT1BUSU9OQUxfRklFTEQpCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjFEaXNwYXRjaC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YxRGlzcGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMGQ1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YxRGlzcGF0Y2guY3BwCkBAIC0wLDAgKzEsMjE5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YxRGlzcGF0Y2guaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MkRpc3BhdGNoLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgiCisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKyNkZWZpbmUgRFBSSU5UKC4uLikgZG8geyBcCisgICAgaWYgKCFWRVJCT1NFX0NIRUNLKGdsZXMxZW11KSkgVkVSQk9TRV9FTkFCTEUoZ2xlczFlbXUpOyBcCisgICAgVkVSQk9TRV9QUklOVChnbGVzMWVtdSwgX19WQV9BUkdTX18pOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5UKC4uLikKKyNlbmRpZgorCitzdGF0aWMgZW11Z2w6OlNoYXJlZExpYnJhcnkgKnNfZ2xlczFfbGliID0gTlVMTDsKK3N0YXRpYyBlbXVnbDo6U2hhcmVkTGlicmFyeSAqc191bmRlcmx5aW5nX2dsZXMyX2xpYiA9IE5VTEw7CisKKy8vIEFuIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlLgorLy8gVG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIGd1ZXN0LCBhbGwgR0xFUzEgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQgYnkKKy8vIHRoZSBndWVzdCBkcml2ZXIgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhpcyBmdW5jdGlvbi4KKworc3RhdGljIHZvaWQgZ2xlczFfdW5pbXBsZW1lbnRlZCgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbGxlZCB1bmltcGxlbWVudGVkIEdMRVN2MSBBUElcbiIpOworfQorCisjZGVmaW5lIERFRkFVTFRfR0xFU19DTV9MSUIgRU1VR0xfTElCTkFNRSgiR0xFU19DTV90cmFuc2xhdG9yIikKKyNkZWZpbmUgREVGQVVMVF9VTkRFUkxZSU5HX0dMRVNfVjJfTElCIEVNVUdMX0xJQk5BTUUoIkdMRVNfVjJfdHJhbnNsYXRvciIpCisKKy8vIFRoaXMgc2VjdGlvbiBvZiBjb2RlIChhbHNvIGluIEdMRGlzcGF0Y2guY3BwKQorLy8gaW5pdGlhbGl6ZXMgYWxsIEdMRVN2MSBmdW5jdGlvbnMgdG8gZHVtbXkgb25lczsKKy8vIHRoYXQgaXMsIGluIGNhc2Ugd2UgYXJlIHVzaW5nIGEgbGlicmFyeSB0aGF0IGRvZXNuJ3QKKy8vIGhhdmUgR0xFU3YxLCB3ZSB3aWxsIHN0aWxsIGhhdmUgc3R1YnMgYXZhaWxhYmxlIHRvCisvLyBzaWduYWwgdGhhdCB0aGV5IGFyZSB1bnN1cHBvcnRlZCBvbiB0aGUgaG9zdC4KKworI2RlZmluZSBSRVRVUk5fdm9pZCByZXR1cm4KKyNkZWZpbmUgUkVUVVJOX0dMYm9vbGVhbiByZXR1cm4gR0xfRkFMU0UKKyNkZWZpbmUgUkVUVVJOX0dMaW50IHJldHVybiAwCisjZGVmaW5lIFJFVFVSTl9HTHVpbnQgcmV0dXJuIDBVCisjZGVmaW5lIFJFVFVSTl9HTGVudW0gcmV0dXJuIDAKKyNkZWZpbmUgUkVUVVJOX2ludCByZXR1cm4gMAorI2RlZmluZSBSRVRVUk5fR0xjb25zdHVieXRlcHRyIHJldHVybiBOVUxMCisjZGVmaW5lIFJFVFVSTl92b2lkcHRyIHJldHVybiBOVUxMCisKKyNkZWZpbmUgUkVUVVJOXyh4KSAgUkVUVVJOXyAjIyB4CisKKyNkZWZpbmUgRFVNTVlfTVNHICJDYWxsIHRvICVzOiBob3N0IE9wZW5HTCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBPcGVuR0wgRVMgdjEuIFNraXBwaW5nLiIKKworI2lmZGVmIF9XSU4zMgorCisjZGVmaW5lIERFRklORV9EVU1NWV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZnVuY19uYW1lLCBzaWduYXR1cmUsIGFyZ3MpIFwKK3N0YXRpYyByZXR1cm5fdHlwZSAgX19zdGRjYWxsIGdsZXMxX2R1bW15XyMjZnVuY19uYW1lIHNpZ25hdHVyZSB7IFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRFVNTVlfTVNHLCAjZnVuY19uYW1lKTsgXAorICAgIFJFVFVSTl8ocmV0dXJuX3R5cGUpOyBcCit9CisKKyNkZWZpbmUgREVGSU5FX0RVTU1ZX0VYVEVOU0lPTl9GVU5DVElPTihyZXR1cm5fdHlwZSwgZnVuY19uYW1lLCBzaWduYXR1cmUsIGFyZ3MpIFwKK3N0YXRpYyByZXR1cm5fdHlwZSBfX3N0ZGNhbGwgZ2xlczFfZHVtbXlfIyNmdW5jX25hbWUgc2lnbmF0dXJlIHsgXAorICAgIGZwcmludGYoc3RkZXJyLCBEVU1NWV9NU0csICNmdW5jX25hbWUpOyBcCisgICAgUkVUVVJOXyhyZXR1cm5fdHlwZSk7IFwKK30KKworI2Vsc2UKKworI2RlZmluZSBERUZJTkVfRFVNTVlfRlVOQ1RJT04ocmV0dXJuX3R5cGUsIGZ1bmNfbmFtZSwgc2lnbmF0dXJlLCBhcmdzKSBcCitzdGF0aWMgcmV0dXJuX3R5cGUgZ2xlczFfZHVtbXlfIyNmdW5jX25hbWUgc2lnbmF0dXJlIHsgXAorICAgIGZwcmludGYoc3RkZXJyLCBEVU1NWV9NU0csICNmdW5jX25hbWUpOyBcCisgICAgUkVUVVJOXyhyZXR1cm5fdHlwZSk7IFwKK30KKworI2RlZmluZSBERUZJTkVfRFVNTVlfRVhURU5TSU9OX0ZVTkNUSU9OKHJldHVybl90eXBlLCBmdW5jX25hbWUsIHNpZ25hdHVyZSwgYXJncykgXAorc3RhdGljIHJldHVybl90eXBlIGdsZXMxX2R1bW15XyMjZnVuY19uYW1lIHNpZ25hdHVyZSB7IFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRFVNTVlfTVNHLCAjZnVuY19uYW1lKTsgXAorICAgIFJFVFVSTl8ocmV0dXJuX3R5cGUpOyBcCit9CisKKyNlbmRpZgorCitMSVNUX0dMRVMxX0ZVTkNUSU9OUyhERUZJTkVfRFVNTVlfRlVOQ1RJT04sIERFRklORV9EVU1NWV9FWFRFTlNJT05fRlVOQ1RJT04pOworTElTVF9HTEVTMTJfVFJfRlVOQ1RJT05TKERFRklORV9EVU1NWV9GVU5DVElPTik7CisKKy8vCisvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UgZHVyaW5nIGluaXRpYWxpYXRpb24gYmVmb3JlCisvLyBhbnkgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgLSBoZW5jZSBpdCBzaG91bGQgTk9UIGJlIHRocmVhZCBzYWZlLgorLy8KKworLy8KKy8vIGluaXQgZHVtbXkgR0xFU3YxIGRpc3BhdGNoIHRhYmxlCisvLworI2RlZmluZSBBU1NJR05fRFVNTVkocmV0dXJuX3R5cGUsZnVuY3Rpb25fbmFtZSxzaWduYXR1cmUsY2FsbGFyZ3MpIGRvIHsgXAorICAgICAgICBkaXNwYXRjaF90YWJsZS0+IGZ1bmN0aW9uX25hbWUgPSBnbGVzMV9kdW1teV8jI2Z1bmN0aW9uX25hbWU7IFwKKyAgICAgICAgfSB3aGlsZSgwKTsKKworYm9vbCBnbGVzMV9kaXNwYXRjaF9pbml0KEdMRVN2MURpc3BhdGNoKiBkaXNwYXRjaF90YWJsZSkgeworICAgIGRpc3BhdGNoX3RhYmxlLT51bmRlcmx5aW5nX2dsZXMyX2FwaSA9IE5VTEw7CisKKyAgICBjb25zdCBjaGFyKiBsaWJOYW1lID0gZ2V0ZW52KCJBTkRST0lEX0dMRVN2MV9MSUIiKTsKKyAgICBpZiAoIWxpYk5hbWUpIHsKKyAgICAgICAgbGliTmFtZSA9IERFRkFVTFRfR0xFU19DTV9MSUI7CisgICAgfQorCisgICAgLy8gSWYgZW11Z2xfY29uZmlnIGhhcyBkZXRlY3RlZCBzcGVjaWZpY2FsbHkgYSBiYWNrZW5kCisgICAgLy8gdGhhdCBzdXBwb3J0cyBvbmx5IEdMRVN2Miwgc2V0IEdMRVN2MSBlbnRyeSBwb2ludHMKKyAgICAvLyB0byB0aGUgZHVtbXkgZnVuY3Rpb25zLgorICAgIGlmICghc3RyY21wKGxpYk5hbWUsICI8Z2xlczJfb25seV9iYWNrZW5kPiIpKSB7CisKKyAgICAgICAgTElTVF9HTEVTMV9GVU5DVElPTlMoQVNTSUdOX0RVTU1ZLEFTU0lHTl9EVU1NWSkKKworICAgICAgICBEUFJJTlQoImFzc2lnbmluZyBkdW1taWVzIGJlY2F1c2UgPGdsZXMyX29ubHlfYmFja2VuZD4iKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKworICAgICAgICBjaGFyIGVycm9yWzI1Nl07CisgICAgICAgIHNfZ2xlczFfbGliID0gZW11Z2w6OlNoYXJlZExpYnJhcnk6Om9wZW4obGliTmFtZSwgZXJyb3IsIHNpemVvZihlcnJvcikpOworICAgICAgICBpZiAoIXNfZ2xlczFfbGliKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgbG9hZCAlcyBbJXNdXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGxpYk5hbWUsIGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIGluaXQgdGhlIEdMRVMgZGlzcGF0Y2ggdGFibGUKKyAgICAgICAgLy8KKyNkZWZpbmUgTE9PS1VQX1NZTUJPTChyZXR1cm5fdHlwZSxmdW5jdGlvbl9uYW1lLHNpZ25hdHVyZSxjYWxsYXJncykgZG8geyBcCisgICAgICAgIGRpc3BhdGNoX3RhYmxlLT4gZnVuY3Rpb25fbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGZ1bmN0aW9uX25hbWUgIyMgX3QgPiggXAorICAgICAgICAgICAgICAgIHNfZ2xlczFfbGliLT5maW5kU3ltYm9sKCNmdW5jdGlvbl9uYW1lKSk7IFwKKyAgICAgICAgfSB3aGlsZSgwKTsKKworICAgICAgICBMSVNUX0dMRVMxX0ZVTkNUSU9OUyhMT09LVVBfU1lNQk9MLExPT0tVUF9TWU1CT0wpCisKKyAgICAgICAgRFBSSU5UKCJzdWNjZXNzZnVsIik7CisKKyAgICAgICAgTElTVF9HTEVTMTJfVFJfRlVOQ1RJT05TKEFTU0lHTl9EVU1NWSk7CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIHRoZSB0cmFuc2xhdG9yLAorICAgICAgICAvLyBpbXBvcnQgdGhlIGdsZXMxLT4yIHRyYW5zbGF0b3IgZGxsCisgICAgICAgIGlmIChzdHJzdHIobGliTmFtZSwgIkdMRVMxMlRyYW5zbGF0b3IiKSkgeworCisgICAgICAgICAgICBEUFJJTlQoInRyeWluZyB0byBhc3NpZ24gZ2xlczEyLXNwZWNpZmljIGZ1bmN0aW9ucyIpOworICAgICAgICAgICAgTElTVF9HTEVTMTJfVFJfRlVOQ1RJT05TKExPT0tVUF9TWU1CT0wpOworICAgICAgICAgICAgRFBSSU5UKCJob3BlZnVsbHksIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCAiCisgICAgICAgICAgICAgICAgICAgIjEydHItc3BlY2lmaWMgZnVuY3Rpb25zLi4uIik7CisKKyAgICAgICAgICAgIERQUklOVCgiTm93IGNyZWF0aW5nIHRoZSB1bmRlcmx5aW5nIGFwaSIpOworICAgICAgICAgICAgVW5kZXJseWluZ0FwaXMqIGdsZXMyYXBpID0KKyAgICAgICAgICAgICAgICAoVW5kZXJseWluZ0FwaXMqKWRpc3BhdGNoX3RhYmxlLT5jcmVhdGVfdW5kZXJseWluZ19hcGkoKTsKKyAgICAgICAgICAgIGRpc3BhdGNoX3RhYmxlLT51bmRlcmx5aW5nX2dsZXMyX2FwaSA9IGdsZXMyYXBpOworCisgICAgICAgICAgICBEUFJJTlQoImFwaSBwdHI6JXAiLCBkaXNwYXRjaF90YWJsZS0+dW5kZXJseWluZ19nbGVzMl9hcGkpOworCisjZGVmaW5lIFNFVF9VTkRFUkxZSU5HX0dMRVMyX0ZVTkMocmV0dCwgZnVuY3Rpb25fbmFtZSwgc2lnLCBjYWxsYXJncykgZG8geyBcCisgICAgZGlzcGF0Y2hfdGFibGUtPnVuZGVybHlpbmdfZ2xlczJfYXBpLT5hbmdsZS0+IGZ1bmN0aW9uX25hbWUgPSBcCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGZ1bmN0aW9uX25hbWUgIyMgX3QgPiggXAorICAgICAgICAgICAgICAgIHNfdW5kZXJseWluZ19nbGVzMl9saWItPmZpbmRTeW1ib2woI2Z1bmN0aW9uX25hbWUpKTsgXAorfSB3aGlsZSgwKTsKKworICAgICAgICAgICAgRFBSSU5UKCJ0cnlpbmcgdG8gaW5pdGlhbGl6ZSBHTEVTdjEtPjIgdHJhbnNsYXRpb24iKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVuZGVybHlpbmdfZ2xlczJfbGliX25hbWUgPQorICAgICAgICAgICAgICAgIGdldGVudigiQU5EUk9JRF9HTEVTdjJfTElCIik7CisKKyAgICAgICAgICAgIGlmICghdW5kZXJseWluZ19nbGVzMl9saWJfbmFtZSkgeworICAgICAgICAgICAgICAgIHVuZGVybHlpbmdfZ2xlczJfbGliX25hbWUgPSBERUZBVUxUX1VOREVSTFlJTkdfR0xFU19WMl9MSUI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzX3VuZGVybHlpbmdfZ2xlczJfbGliID0KKyAgICAgICAgICAgICAgICBlbXVnbDo6U2hhcmVkTGlicmFyeTo6b3Blbih1bmRlcmx5aW5nX2dsZXMyX2xpYl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLCBzaXplb2YoZXJyb3IpKTsKKyAgICAgICAgICAgIGlmICghc191bmRlcmx5aW5nX2dsZXMyX2xpYikgeworICAgICAgICAgICAgICAgIERQUklOVCgiQ291bGQgbm90IGxvYWQgdW5kZXJseWluZyBnbGVzMiBsaWIgJXMgWyVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJOYW1lLCBlcnJvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFBSSU5UKCJkb25lIHRyeWluZyB0byBnZXQgZ2xlczIgbGliIik7CisKKyAgICAgICAgICAgIExJU1RfR0xFUzJfRlVOQ1RJT05TKFNFVF9VTkRFUkxZSU5HX0dMRVMyX0ZVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfVU5ERVJMWUlOR19HTEVTMl9GVU5DKTsKKyAgICAgICB9CisgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRlY29kZXIgYmVmb3JlCisvLyBhbnkgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgLSBoZW5jZSBpdCBzaG91bGQgTk9UIGJlIHRocmVhZCBzYWZlLgorLy8KK3ZvaWQgKmdsZXMxX2Rpc3BhdGNoX2dldF9wcm9jX2Z1bmMoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpCit7CisgICAgdm9pZCogZnVuYyA9IE5VTEw7CisgICAgaWYgKHNfZ2xlczFfbGliKSB7CisgICAgICAgIGZ1bmMgPSAodm9pZCAqKXNfZ2xlczFfbGliLT5maW5kU3ltYm9sKG5hbWUpOworICAgIH0KKyAgICAvLyBUbyBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgZ3Vlc3QsIHJlZGlyZWN0IGFueSB1bnN1cHBvcnRlZCBmdW5jdGlvbnMKKyAgICAvLyB0byBnbGVzMV91bmltcGxlbWVudGVkLgorICAgIGlmICghZnVuYykgeworICAgICAgICBmdW5jID0gKHZvaWQgKilnbGVzMV91bmltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gZnVuYzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjJEaXNwYXRjaC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YyRGlzcGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjk5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YyRGlzcGF0Y2guY3BwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjJEaXNwYXRjaC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorCitzdGF0aWMgZW11Z2w6OlNoYXJlZExpYnJhcnkgKnNfZ2xlczJfbGliID0gTlVMTDsKKworI2RlZmluZSBERUZBVUxUX0dMRVNfVjJfTElCIEVNVUdMX0xJQk5BTUUoIkdMRVNfVjJfdHJhbnNsYXRvciIpCisKKy8vIEFuIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gd2hpY2ggcHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlLgorLy8gVG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIGd1ZXN0LCBhbGwgR0xFUzIgZnVuY3Rpb25zIG5vdCBzdXBwb3J0ZWQgYnkKKy8vIHRoZSBkcml2ZXIgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhpcyBmdW5jdGlvbi4KKworc3RhdGljIHZvaWQgZ2xlczJfdW5pbXBsZW1lbnRlZCgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbGxlZCB1bmltcGxlbWVudGVkIEdMRVN2MiBBUElcbiIpOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlIGR1cmluZyBpbml0aWFsaWF0aW9uIGJlZm9yZQorLy8gYW55IHRocmVhZCBoYXMgYmVlbiBjcmVhdGVkIC0gaGVuY2UgaXQgc2hvdWxkIE5PVCBiZSB0aHJlYWQgc2FmZS4KKy8vCitib29sIGdsZXMyX2Rpc3BhdGNoX2luaXQoR0xFU3YyRGlzcGF0Y2gqIGRpc3BhdGNoX3RhYmxlKQoreworICAgIGNvbnN0IGNoYXIgKmxpYk5hbWUgPSBnZXRlbnYoIkFORFJPSURfR0xFU3YyX0xJQiIpOworICAgIGlmICghbGliTmFtZSkgeworICAgICAgICBsaWJOYW1lID0gREVGQVVMVF9HTEVTX1YyX0xJQjsKKyAgICB9CisKKyAgICBjaGFyIGVycm9yWzI1Nl07CisgICAgc19nbGVzMl9saWIgPSBlbXVnbDo6U2hhcmVkTGlicmFyeTo6b3BlbihsaWJOYW1lLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgaWYgKCFzX2dsZXMyX2xpYikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgbG9hZCAlcyBbJXNdXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbGliTmFtZSwgZXJyb3IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBpbml0IHRoZSBHTEVTIGRpc3BhdGNoIHRhYmxlCisgICAgLy8KKyNkZWZpbmUgTE9PS1VQX1NZTUJPTChyZXR1cm5fdHlwZSxmdW5jdGlvbl9uYW1lLHNpZ25hdHVyZSxjYWxsYXJncykgXAorICAgIGRpc3BhdGNoX3RhYmxlLT4gZnVuY3Rpb25fbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGZ1bmN0aW9uX25hbWUgIyMgX3QgPiggXAorICAgICAgICAgICAgc19nbGVzMl9saWItPmZpbmRTeW1ib2woI2Z1bmN0aW9uX25hbWUpKTsKKworICAgIExJU1RfR0xFUzJfRlVOQ1RJT05TKExPT0tVUF9TWU1CT0wsTE9PS1VQX1NZTUJPTCkKKworICAgIHJldHVybiB0cnVlOworfQorCisvLworLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYmVmb3JlCisvLyBhbnkgdGhyZWFkIGhhcyBiZWVuIGNyZWF0ZWQgLSBoZW5jZSBpdCBzaG91bGQgTk9UIGJlIHRocmVhZCBzYWZlLgorLy8KK3ZvaWQgKmdsZXMyX2Rpc3BhdGNoX2dldF9wcm9jX2Z1bmMoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpCit7CisgICAgdm9pZCogZnVuYyA9IE5VTEw7CisgICAgaWYgKHNfZ2xlczJfbGliKSB7CisgICAgICAgIGZ1bmMgPSAodm9pZCAqKXNfZ2xlczJfbGliLT5maW5kU3ltYm9sKG5hbWUpOworICAgIH0KKyAgICAvLyBUbyBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgZ3Vlc3QsIHJlZGlyZWN0IGFueSB1bnN1cHBvcnRlZCBmdW5jdGlvbnMKKyAgICAvLyB0byBnbGVzMl91bmltcGxlbWVudGVkLgorICAgIGlmICghZnVuYykgeworICAgICAgICBmdW5jID0gKHZvaWQgKilnbGVzMl91bmltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gZnVuYzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0ci5lbnRyaWVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyLmVudHJpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZTI3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMTJ0ci5lbnRyaWVzCkBAIC0wLDAgKzEsMTYgQEAKKyFnbGVzMTJfdHIKKworIyBGdW5jdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBPTkxZIGZvciBpbXBsZW1lbnRpbmcgR0xFUyAxLT4yIHRyYW5zbGF0aW9uCisKKyV0eXBlZGVmIHZvaWQqIHZvaWRwdHI7CisKK3ZvaWRwdHIgY3JlYXRlX2dsZXMxX2NvbnRleHQodm9pZCogc2hhcmUsIGNvbnN0IHZvaWQqIHVuZGVybHlpbmdfYXBpcyk7Cit2b2lkcHRyIGdldF9jdXJyZW50X2dsZXNfY29udGV4dCh2b2lkKTsKK3ZvaWQgc2V0X2N1cnJlbnRfZ2xlc19jb250ZXh0KHZvaWQqIGN0eCk7Cit2b2lkcHRyIGNyZWF0ZV91bmRlcmx5aW5nX2FwaSh2b2lkKTsKKworIyBFeHRyYSBzZXR1cCBvbiBtYWtpbmcgYSBlbXVsYXRlZCBHTEVTMSBjb250ZXh0IGN1cnJlbnQKK3ZvaWQgbWFrZV9jdXJyZW50X3NldHVwKHVpbnQzMl90IHN1cmZfd2lkdGgsIHVpbnQzMl90IHN1cmZfaGVpZ2h0KTsKKworIyBkZXN0cm95aW5nIEdMRVMxIGNvbnRleHRzCit2b2lkIGRlc3Ryb3lfZ2xlczFfY29udGV4dCh2b2lkKiBjdHgpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyX2ludGVybmFsLmVudHJpZXMgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczEydHJfaW50ZXJuYWwuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NiMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxMnRyX2ludGVybmFsLmVudHJpZXMKQEAgLTAsMCArMSwzMjcgQEAKKyFnbGVzMTJ0cl9pbnRlcm5hbAorCisjIE9wZW5HTCBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBvbmx5IGludGVybmFsbHkgYnkgdGhlIHRoZSBHTEVTMS0+MiB0cmFuc2xhdG9yCisKKyV0eXBlZGVmIEdMdm9pZCogR0x2b2lkcHRyOworJXR5cGVkZWYgY29uc3QgR0x1Ynl0ZSogY29uc3RHTHVieXRlOworCit2b2lkIGdsQWN0aXZlVGV4dHVyZSggR0xlbnVtIHRleHR1cmUpOwordm9pZCBnbEFscGhhRnVuYyggR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7Cit2b2lkIGdsQWxwaGFGdW5jeCggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Cit2b2lkIGdsQWxwaGFGdW5jeE9FUyggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Cit2b2lkIGdsQXR0YWNoU2hhZGVyKCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcik7Cit2b2lkIGdsQmluZEF0dHJpYkxvY2F0aW9uKCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbEJpbmRCdWZmZXIoIEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordm9pZCBnbEJpbmRGcmFtZWJ1ZmZlciggR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKTsKK3ZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMoIEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlciggR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyggR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit2b2lkIGdsQmluZFRleHR1cmUoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3ZvaWQgZ2xCbGVuZENvbG9yKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uKCBHTGVudW0gbW9kZSk7Cit2b2lkIGdsQmxlbmRFcXVhdGlvbk9FUyggR0xlbnVtIG1vZGUpOwordm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSggR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyggR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwordm9pZCBnbEJsZW5kRnVuYyggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK3ZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSggR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwordm9pZCBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTKCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Cit2b2lkIGdsQnVmZmVyRGF0YSggR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEsIEdMZW51bSB1c2FnZSk7Cit2b2lkIGdsQnVmZmVyU3ViRGF0YSggR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7CitHTGVudW0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKCBHTGVudW0gdGFyZ2V0KTsKK0dMZW51bSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoIEdMZW51bSB0YXJnZXQpOwordm9pZCBnbENsZWFyKCBHTGJpdGZpZWxkIG1hc2spOwordm9pZCBnbENsZWFyQ29sb3IoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3ZvaWQgZ2xDbGVhckNvbG9yeCggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwordm9pZCBnbENsZWFyQ29sb3J4T0VTKCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7Cit2b2lkIGdsQ2xlYXJEZXB0aGYoIEdMZmxvYXQgZGVwdGgpOwordm9pZCBnbENsZWFyRGVwdGhmT0VTKCBHTGNsYW1wZiBkZXB0aCk7Cit2b2lkIGdsQ2xlYXJEZXB0aHgoIEdMY2xhbXB4IGRlcHRoKTsKK3ZvaWQgZ2xDbGVhckRlcHRoeE9FUyggR0xjbGFtcHggZGVwdGgpOwordm9pZCBnbENsZWFyU3RlbmNpbCggR0xpbnQgcyk7Cit2b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSggR0xlbnVtIHRleHR1cmUpOwordm9pZCBnbENsaXBQbGFuZWYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogZXF1YXRpb24pOwordm9pZCBnbENsaXBQbGFuZWZPRVMoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogZXF1YXRpb24pOwordm9pZCBnbENsaXBQbGFuZXgoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogZXF1YXRpb24pOwordm9pZCBnbENsaXBQbGFuZXhPRVMoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogZXF1YXRpb24pOwordm9pZCBnbENvbG9yNGYoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOwordm9pZCBnbENvbG9yNGZ2KCBjb25zdCBHTGZsb2F0KiBjb21wb25lbnRzKTsKK3ZvaWQgZ2xDb2xvcjR1YiggR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSk7Cit2b2lkIGdsQ29sb3I0dWJ2KCBjb25zdCBHTHVieXRlKiBjb21wb25lbnRzKTsKK3ZvaWQgZ2xDb2xvcjR4KCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKK3ZvaWQgZ2xDb2xvcjR4T0VTKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKK3ZvaWQgZ2xDb2xvck1hc2soIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7Cit2b2lkIGdsQ29sb3JQb2ludGVyKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcik7Cit2b2lkIGdsQ29sb3JQb2ludGVyQm91bmRzKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsQ29tcGlsZVNoYWRlciggR0x1aW50IHNoYWRlcik7Cit2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2Vfc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKK3ZvaWQgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlX3NpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Cit2b2lkIGdsQ29weVRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpOwordm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworR0x1aW50IGdsQ3JlYXRlUHJvZ3JhbSh2b2lkKTsKK0dMdWludCBnbENyZWF0ZVNoYWRlciggR0xlbnVtIHR5cGUpOwordm9pZCBnbEN1bGxGYWNlKCBHTGVudW0gbW9kZSk7Cit2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoIEdMdWludCBpbmRleCk7Cit2b2lkIGdsRGVsZXRlQnVmZmVycyggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpOwordm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVycyggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Cit2b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKK3ZvaWQgZ2xEZWxldGVQcm9ncmFtKCBHTHVpbnQgcHJvZ3JhbSk7Cit2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVycyggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwordm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKK3ZvaWQgZ2xEZWxldGVTaGFkZXIoIEdMdWludCBzaGFkZXIpOwordm9pZCBnbERlbGV0ZVRleHR1cmVzKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpOwordm9pZCBnbERlcHRoRnVuYyggR0xlbnVtIGZ1bmMpOwordm9pZCBnbERlcHRoTWFzayggR0xib29sZWFuIGZsYWcpOwordm9pZCBnbERlcHRoUmFuZ2VmKCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwordm9pZCBnbERlcHRoUmFuZ2VmT0VTKCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Cit2b2lkIGdsRGVwdGhSYW5nZXgoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK3ZvaWQgZ2xEZXB0aFJhbmdleE9FUyggR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOwordm9pZCBnbERldGFjaFNoYWRlciggR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordm9pZCBnbERpc2FibGUoIEdMZW51bSBjYXApOwordm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZSggR0xlbnVtIGNhcCk7Cit2b2lkIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBHTHVpbnQgaW5kZXgpOwordm9pZCBnbERyYXdBcnJheXMoIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsRHJhd0VsZW1lbnRzKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcyk7Cit2b2lkIGdsRHJhd1RleGZPRVMoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KTsKK3ZvaWQgZ2xEcmF3VGV4ZnZPRVMoIGNvbnN0IEdMZmxvYXQqIGNvb3Jkcyk7Cit2b2lkIGdsRHJhd1RleGlPRVMoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOwordm9pZCBnbERyYXdUZXhpdk9FUyggY29uc3QgR0xpbnQqIGNvb3Jkcyk7Cit2b2lkIGdsRHJhd1RleHNPRVMoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KTsKK3ZvaWQgZ2xEcmF3VGV4c3ZPRVMoIGNvbnN0IEdMc2hvcnQqIGNvb3Jkcyk7Cit2b2lkIGdsRHJhd1RleHhPRVMoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKK3ZvaWQgZ2xEcmF3VGV4eHZPRVMoIGNvbnN0IEdMZml4ZWQqIGNvb3Jkcyk7Cit2b2lkIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGJ1ZmZlcik7Cit2b2lkIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoIEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgYnVmZmVyKTsKK3ZvaWQgZ2xFbmFibGUoIEdMZW51bSBjYXApOwordm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlKCBHTGVudW0gY2FwKTsKK3ZvaWQgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggR0x1aW50IGluZGV4KTsKK3ZvaWQgZ2xGaW5pc2godm9pZCk7Cit2b2lkIGdsRmx1c2godm9pZCk7Cit2b2lkIGdsRm9nZiggR0xlbnVtIG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordm9pZCBnbEZvZ2Z2KCBHTGVudW0gbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xGb2d4KCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbEZvZ3hPRVMoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsRm9neHYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xGb2d4dk9FUyggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit2b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Cit2b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordm9pZCBnbEZyb250RmFjZSggR0xlbnVtIG1vZGUpOwordm9pZCBnbEZydXN0dW1mKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK3ZvaWQgZ2xGcnVzdHVtZk9FUyggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Cit2b2lkIGdsRnJ1c3R1bXgoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwordm9pZCBnbEZydXN0dW14T0VTKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK3ZvaWQgZ2xHZW5CdWZmZXJzKCBHTHNpemVpIG4sIEdMdWludCogYnVmZmVycyk7Cit2b2lkIGdsR2VuRnJhbWVidWZmZXJzKCBHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKTsKK3ZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoIEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordm9pZCBnbEdlblJlbmRlcmJ1ZmZlcnMoIEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKK3ZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTKCBHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7Cit2b2lkIGdsR2VuVGV4dHVyZXMoIEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcyk7Cit2b2lkIGdsR2VuZXJhdGVNaXBtYXAoIEdMZW51bSB0YXJnZXQpOwordm9pZCBnbEdlbmVyYXRlTWlwbWFwT0VTKCBHTGVudW0gdGFyZ2V0KTsKK3ZvaWQgZ2xHZXRBY3RpdmVBdHRyaWIoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbEdldEFjdGl2ZVVuaWZvcm0oIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbEdldEF0dGFjaGVkU2hhZGVycyggR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpOworR0xpbnQgZ2xHZXRBdHRyaWJMb2NhdGlvbiggR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSk7Cit2b2lkIGdsR2V0Qm9vbGVhbnYoIEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBwYXJhbXMpOwordm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBnbEdldENsaXBQbGFuZWYoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogZXFuKTsKK3ZvaWQgZ2xHZXRDbGlwUGxhbmVmT0VTKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIGVxbik7Cit2b2lkIGdsR2V0Q2xpcFBsYW5leCggR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBlcW4pOwordm9pZCBnbEdldENsaXBQbGFuZXhPRVMoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogZXFuKTsKK0dMZW51bSBnbEdldEVycm9yKHZvaWQpOwordm9pZCBnbEdldEZpeGVkdiggR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldEZpeGVkdk9FUyggR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldEZsb2F0diggR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwordm9pZCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0SW50ZWdlcnYoIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0TGlnaHRmdiggR0xlbnVtIGxpZ2h0aWQsIEdMZW51bSBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwordm9pZCBnbEdldExpZ2h0eHYoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldExpZ2h0eHZPRVMoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldE1hdGVyaWFsZnYoIEdMZW51bSBmYWNlLCBHTGVudW0gbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRNYXRlcmlhbHh2KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldE1hdGVyaWFseHZPRVMoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0UG9pbnRlcnYoIEdMZW51bSBwbmFtZSwgdm9pZCoqIHBhcmFtcyk7Cit2b2lkIGdsR2V0UHJvZ3JhbUluZm9Mb2coIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKTsKK3ZvaWQgZ2xHZXRQcm9ncmFtaXYoIEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBnbEdldFNoYWRlckluZm9Mb2coIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOwordm9pZCBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pOwordm9pZCBnbEdldFNoYWRlclNvdXJjZSggR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKTsKK3ZvaWQgZ2xHZXRTaGFkZXJpdiggR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK2NvbnN0R0x1Ynl0ZSBnbEdldFN0cmluZyggR0xlbnVtIG5hbWUpOwordm9pZCBnbEdldFRleEVudmZ2KCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4RW52aXYoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4RW52eHYoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRUZXhFbnZ4dk9FUyggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyeHYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbEdldFVuaWZvcm1mdiggR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpOwordm9pZCBnbEdldFVuaWZvcm1pdiggR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKTsKK0dMaW50IGdsR2V0VW5pZm9ybUxvY2F0aW9uKCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKTsKK3ZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiggR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpOwordm9pZCBnbEdldFZlcnRleEF0dHJpYmZ2KCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiggR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwordm9pZCBnbEhpbnQoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMYm9vbGVhbiBnbElzQnVmZmVyKCBHTHVpbnQgYnVmZmVyKTsKK0dMYm9vbGVhbiBnbElzRW5hYmxlZCggR0xlbnVtIGNhcCk7CitHTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyKCBHTHVpbnQgZnJhbWVidWZmZXIpOworR0xib29sZWFuIGdsSXNGcmFtZWJ1ZmZlck9FUyggR0x1aW50IGZyYW1lYnVmZmVyKTsKK0dMYm9vbGVhbiBnbElzUHJvZ3JhbSggR0x1aW50IHByb2dyYW0pOworR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXIoIEdMdWludCByZW5kZXJidWZmZXIpOworR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMoIEdMdWludCByZW5kZXJidWZmZXIpOworR0xib29sZWFuIGdsSXNTaGFkZXIoIEdMdWludCBzaGFkZXIpOworR0xib29sZWFuIGdsSXNUZXh0dXJlKCBHTHVpbnQgdGV4dHVyZSk7Cit2b2lkIGdsTGlnaHRNb2RlbGYoIEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3ZvaWQgZ2xMaWdodE1vZGVsZnYoIEdMZW51bSBuYW1lLCBjb25zdCBHTGZsb2F0KiBwYXJhbXMpOwordm9pZCBnbExpZ2h0TW9kZWx4KCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbExpZ2h0TW9kZWx4T0VTKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbExpZ2h0TW9kZWx4diggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbExpZ2h0TW9kZWx4dk9FUyggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbExpZ2h0ZiggR0xlbnVtIGxpZ2h0aWQsIEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3ZvaWQgZ2xMaWdodGZ2KCBHTGVudW0gbGlnaHRpZCwgR0xlbnVtIG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsTGlnaHR4KCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsTGlnaHR4T0VTKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsTGlnaHR4diggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsTGlnaHR4dk9FUyggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsTGluZVdpZHRoKCBHTGZsb2F0IHdpZHRoKTsKK3ZvaWQgZ2xMaW5lV2lkdGh4KCBHTGZpeGVkIHdpZHRoKTsKK3ZvaWQgZ2xMaW5lV2lkdGh4T0VTKCBHTGZpeGVkIHdpZHRoKTsKK3ZvaWQgZ2xMaW5rUHJvZ3JhbSggR0x1aW50IHByb2dyYW0pOwordm9pZCBnbExvYWRJZGVudGl0eSh2b2lkKTsKK3ZvaWQgZ2xMb2FkTWF0cml4ZiggY29uc3QgR0xmbG9hdCogbSk7Cit2b2lkIGdsTG9hZE1hdHJpeHgoIGNvbnN0IEdMZml4ZWQqIG0pOwordm9pZCBnbExvYWRNYXRyaXh4T0VTKCBjb25zdCBHTGZpeGVkKiBtKTsKK3ZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVModm9pZCk7CitHTHZvaWRwdHIgZ2xNYXBUZXhTdWJJbWFnZTJEQ0hST01JVU0oIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMZW51bSBhY2Nlc3MpOwordm9pZCBnbE1hdGVyaWFsZiggR0xlbnVtIGZhY2UsIEdMZW51bSBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3ZvaWQgZ2xNYXRlcmlhbGZ2KCBHTGVudW0gZmFjZSwgR0xlbnVtIG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsTWF0ZXJpYWx4KCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3ZvaWQgZ2xNYXRlcmlhbHhPRVMoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbE1hdGVyaWFseHYoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsTWF0ZXJpYWx4dk9FUyggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xNYXRyaXhNb2RlKCBHTGVudW0gbW9kZSk7Cit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcik7Cit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Cit2b2lkIGdsTXVsdE1hdHJpeGYoIGNvbnN0IEdMZmxvYXQqIG0pOwordm9pZCBnbE11bHRNYXRyaXh4KCBjb25zdCBHTGZpeGVkKiBtKTsKK3ZvaWQgZ2xNdWx0TWF0cml4eE9FUyggY29uc3QgR0xmaXhlZCogbSk7Cit2b2lkIGdsTm9ybWFsM2YoIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOwordm9pZCBnbE5vcm1hbDNmdiggY29uc3QgR0xmbG9hdCogY29vcmRzKTsKK3ZvaWQgZ2xOb3JtYWwzc3YoIGNvbnN0IEdMc2hvcnQqIGNvb3Jkcyk7Cit2b2lkIGdsTm9ybWFsM3goIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwordm9pZCBnbE5vcm1hbDN4T0VTKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKK3ZvaWQgZ2xOb3JtYWxQb2ludGVyKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcik7Cit2b2lkIGdsTm9ybWFsUG9pbnRlckJvdW5kcyggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwordm9pZCBnbE9ydGhvZiggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgel9uZWFyLCBHTGZsb2F0IHpfZmFyKTsKK3ZvaWQgZ2xPcnRob2ZPRVMoIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwordm9pZCBnbE9ydGhveCggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Cit2b2lkIGdsT3J0aG94T0VTKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK3ZvaWQgZ2xQaXhlbFN0b3JlaSggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordm9pZCBnbFBvaW50UGFyYW1ldGVyZnYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcngoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4T0VTKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbFBvaW50UGFyYW1ldGVyeHYoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2T0VTKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsUG9pbnRTaXplKCBHTGZsb2F0IHNpemUpOwordm9pZCBnbFBvaW50U2l6ZXgoIEdMZml4ZWQgc2l6ZSk7Cit2b2lkIGdsUG9pbnRTaXpleE9FUyggR0xmaXhlZCBzaXplKTsKK3ZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcik7Cit2b2lkIGdsUG9pbnRTaXplUG9pbnRlciggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpOwordm9pZCBnbFBvaW50U2l6ZVBvaW50ZXJPRVNCb3VuZHMoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0KCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Cit2b2lkIGdsUG9seWdvbk9mZnNldHgoIEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0eE9FUyggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwordm9pZCBnbFBvcE1hdHJpeCh2b2lkKTsKK3ZvaWQgZ2xQdXNoTWF0cml4KHZvaWQpOwordm9pZCBnbFJlYWRQaXhlbHMoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpOwordm9pZCBnbFJlbGVhc2VTaGFkZXJDb21waWxlcih2b2lkKTsKK3ZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xSb3RhdGVmKCBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3ZvaWQgZ2xSb3RhdGV4KCBHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3ZvaWQgZ2xSb3RhdGV4T0VTKCBHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordm9pZCBnbFNhbXBsZUNvdmVyYWdleCggR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordm9pZCBnbFNhbXBsZUNvdmVyYWdleE9FUyggR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwordm9pZCBnbFNjYWxlZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsU2NhbGV4KCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKK3ZvaWQgZ2xTY2FsZXhPRVMoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwordm9pZCBnbFNjaXNzb3IoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xTaGFkZU1vZGVsKCBHTGVudW0gbW9kZSk7Cit2b2lkIGdsU2hhZGVyU291cmNlKCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqIGNvbnN0KiBzdHJpbmcsIGNvbnN0IEdMaW50KiBsZW5ndGgpOwordm9pZCBnbFN0ZW5jaWxGdW5jKCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit2b2lkIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSggR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK3ZvaWQgZ2xTdGVuY2lsTWFzayggR0x1aW50IG1hc2spOwordm9pZCBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUoIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayk7Cit2b2lkIGdsU3RlbmNpbE9wKCBHTGVudW0gc2ZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK3ZvaWQgZ2xTdGVuY2lsT3BTZXBhcmF0ZSggR0xlbnVtIGZhY2UsIEdMZW51bSBzZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwordm9pZCBnbFRleENvb3JkUG9pbnRlciggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpOwordm9pZCBnbFRleENvb3JkUG9pbnRlckJvdW5kcyggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwordm9pZCBnbFRleEVudmYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit2b2lkIGdsVGV4RW52ZnYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xUZXhFbnZpKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK3ZvaWQgZ2xUZXhFbnZpdiggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKTsKK3ZvaWQgZ2xUZXhFbnZ4KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbFRleEVudnhPRVMoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsVGV4RW52eHYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xUZXhFbnZ4dk9FUyggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbFRleEdlbmlPRVMoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsVGV4R2VuaXZPRVMoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKTsKK3ZvaWQgZ2xUZXhHZW54T0VTKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Cit2b2lkIGdsVGV4R2VueHZPRVMoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkKiBwYXJhbXMpOwordm9pZCBnbFRleEltYWdlMkQoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordm9pZCBnbFRleFBhcmFtZXRlcmZ2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsVGV4UGFyYW1ldGVyaSggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsVGV4UGFyYW1ldGVyaXYoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsVGV4UGFyYW1ldGVyeCggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJ4T0VTKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwordm9pZCBnbFRleFBhcmFtZXRlcnh2KCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQqIHBhcmFtcyk7Cit2b2lkIGdsVGV4UGFyYW1ldGVyeHZPRVMoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCogcGFyYW1zKTsKK3ZvaWQgZ2xUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Cit2b2lkIGdsVHJhbnNsYXRlZiggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsVHJhbnNsYXRleCggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Cit2b2lkIGdsVHJhbnNsYXRleE9FUyggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Cit2b2lkIGdsVW5pZm9ybTFmKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKK3ZvaWQgZ2xVbmlmb3JtMWZ2KCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Cit2b2lkIGdsVW5pZm9ybTFpKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Cit2b2lkIGdsVW5pZm9ybTFpdiggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtMmYoIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Cit2b2lkIGdsVW5pZm9ybTJmdiggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwordm9pZCBnbFVuaWZvcm0yaSggR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwordm9pZCBnbFVuaWZvcm0yaXYoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Cit2b2lkIGdsVW5pZm9ybTNmKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsVW5pZm9ybTNmdiggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwordm9pZCBnbFVuaWZvcm0zaSggR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwordm9pZCBnbFVuaWZvcm0zaXYoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Cit2b2lkIGdsVW5pZm9ybTRmKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3ZvaWQgZ2xVbmlmb3JtNGZ2KCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Cit2b2lkIGdsVW5pZm9ybTRpKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Cit2b2lkIGdsVW5pZm9ybTRpdiggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtTWF0cml4MmZ2KCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwordm9pZCBnbFVuaWZvcm1NYXRyaXgzZnYoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Cit2b2lkIGdsVW5pZm9ybU1hdHJpeDRmdiggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKK3ZvaWQgZ2xVbm1hcFRleFN1YkltYWdlMkRDSFJPTUlVTSggY29uc3QgR0x2b2lkKiBtZW0pOwordm9pZCBnbFVzZVByb2dyYW0oIEdMdWludCBwcm9ncmFtKTsKK3ZvaWQgZ2xWYWxpZGF0ZVByb2dyYW0oIEdMdWludCBwcm9ncmFtKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWIxZiggR0x1aW50IGluZHgsIEdMZmxvYXQgeCk7Cit2b2lkIGdsVmVydGV4QXR0cmliMWZ2KCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWIyZiggR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWIyZnYoIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwordm9pZCBnbFZlcnRleEF0dHJpYjNmKCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsVmVydGV4QXR0cmliM2Z2KCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWI0ZiggR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Cit2b2lkIGdsVmVydGV4QXR0cmliNGZ2KCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKCBHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKTsKK3ZvaWQgZ2xWZXJ0ZXhQb2ludGVyKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcG9pbnRlcik7Cit2b2lkIGdsVmVydGV4UG9pbnRlckJvdW5kcyggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTHZvaWQqIHBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwordm9pZCBnbFZpZXdwb3J0KCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHBvaW50ZXIpOwordm9pZCBnbFdlaWdodFBvaW50ZXJPRVNCb3VuZHMoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMxX2V4dGVuc2lvbnMuZW50cmllcyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9leHRlbnNpb25zLmVudHJpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZjJmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9leHRlbnNpb25zLmVudHJpZXMKQEAgLTAsMCArMSwxMyBAQAorIWdsZXMxX2V4dGVuc2lvbnMKKworIyBPcGVuR0wgZnVuY3Rpb25zIHdoaWNoIGFyZSBuZWVkZWQgT05MWSBmb3IgaW1wbGVtZW50aW5nIEdMRVMgMS4xIEVYVEVOU0lPTlMKK3ZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeEFSQihHTGludCBpbmRleCk7Cit2b2lkIGdsTWF0cml4SW5kZXh1aXZBUkIoR0xpbnQgc2l6ZSwgR0x1aW50ICogaW5kaWNlcyk7Cit2b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyQVJCKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKTsKK3ZvaWQgZ2xXZWlnaHRQb2ludGVyQVJCKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwb2ludGVyKTsKK3ZvaWQgZ2xUZXhHZW5mKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICk7Cit2b2lkIGdsVGV4R2VuaShHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKTsKK3ZvaWQgZ2xUZXhHZW5mdihHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICk7Cit2b2lkIGdsVGV4R2VuaXYoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKTsKK3ZvaWQgZ2xHZXRUZXhHZW5mdihHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICk7Cit2b2lkIGdsR2V0VGV4R2VuaXYoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMV9vbmx5LmVudHJpZXMgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfb25seS5lbnRyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGI2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczFfb25seS5lbnRyaWVzCkBAIC0wLDAgKzEsNjUgQEAKKyFnbGVzMV9vbmx5CisKKyMgT3BlbkdMIGZ1bmN0aW9ucyB3aGljaCBhcmUgbmVlZGVkIE9OTFkgZm9yIGltcGxlbWVudGluZyBHTEVTIDEuMQorCit2b2lkIGdsQWxwaGFGdW5jKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwordm9pZCBnbEJlZ2luKCBHTGVudW0gbW9kZSApOwordm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUoIEdMZW51bSB0ZXh0dXJlICk7Cit2b2lkIGdsQ2xpcFBsYW5lKEdMZW51bSBwbGFuZSwgY29uc3QgR0xkb3VibGUgKmVxdWF0aW9uKTsKK3ZvaWQgZ2xDb2xvcjRkKEdMZG91YmxlIHJlZCwgR0xkb3VibGUgZ3JlZW4sIEdMZG91YmxlIGJsdWUsIEdMZG91YmxlIGFscGhhKTsKK3ZvaWQgZ2xDb2xvcjRmKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpOwordm9pZCBnbENvbG9yNGZ2KCBjb25zdCBHTGZsb2F0ICp2ICk7Cit2b2lkIGdsQ29sb3I0dWIoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSk7Cit2b2lkIGdsQ29sb3I0dWJ2KCBjb25zdCBHTHVieXRlICp2ICk7Cit2b2lkIGdsQ29sb3JQb2ludGVyKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3ZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KTsKK3ZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZShHTGVudW0gYXJyYXkpOwordm9pZCBnbEVuZCh2b2lkKTsKK3ZvaWQgZ2xGb2dmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit2b2lkIGdsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbEZydXN0dW0oR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7Cit2b2lkIGdsR2V0Q2xpcFBsYW5lKEdMZW51bSBwbGFuZSwgR0xkb3VibGUgKmVxdWF0aW9uKTsKK3ZvaWQgZ2xHZXREb3VibGV2KCBHTGVudW0gcG5hbWUsIEdMZG91YmxlICpwYXJhbXMgKTsKK3ZvaWQgZ2xHZXRMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbEdldE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKK3ZvaWQgZ2xHZXRQb2ludGVydihHTGVudW0gcG5hbWUsIEdMdm9pZCogKnBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4RW52ZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbEdldFRleEVudml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit2b2lkIGdsTGlnaHRmKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3ZvaWQgZ2xMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbExpZ2h0TW9kZWxmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit2b2lkIGdsTGlnaHRNb2RlbGZ2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3ZvaWQgZ2xMb2FkSWRlbnRpdHkodm9pZCk7Cit2b2lkIGdsTG9hZE1hdHJpeGYoY29uc3QgR0xmbG9hdCAqbSk7Cit2b2lkIGdsTG9naWNPcChHTGVudW0gb3Bjb2RlKTsKK3ZvaWQgZ2xNYXRlcmlhbGYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Cit2b2lkIGdsTWF0ZXJpYWxmdihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbE11bHRpVGV4Q29vcmQyZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKK3ZvaWQgZ2xNdWx0aVRleENvb3JkMnN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7Cit2b2lkIGdsTXVsdGlUZXhDb29yZDNmdiggR0xlbnVtIHRhcmdldCwgY29uc3QgR0xmbG9hdCAqdiApOwordm9pZCBnbE11bHRpVGV4Q29vcmQzc3YoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMc2hvcnQgKnYgKTsKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNGYoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApOwordm9pZCBnbE11bHRpVGV4Q29vcmQ0ZnYoIEdMZW51bSB0YXJnZXQsIGNvbnN0IEdMZmxvYXQgKnYgKTsKK3ZvaWQgZ2xNdWx0aVRleENvb3JkNHN2KCBHTGVudW0gdGFyZ2V0LCBjb25zdCBHTHNob3J0ICp2ICk7Cit2b2lkIGdsTXVsdE1hdHJpeGYoY29uc3QgR0xmbG9hdCAqbSk7Cit2b2lkIGdsTm9ybWFsM2YoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7Cit2b2lkIGdsTm9ybWFsM2Z2KCBjb25zdCBHTGZsb2F0ICp2ICk7Cit2b2lkIGdsTm9ybWFsM3N2KCBjb25zdCBHTHNob3J0ICp2ICk7Cit2b2lkIGdsT3J0aG8oR0xkb3VibGUgbGVmdCwgR0xkb3VibGUgcmlnaHQsIEdMZG91YmxlIGJvdHRvbSwgR0xkb3VibGUgdG9wLCBHTGRvdWJsZSB6TmVhciwgR0xkb3VibGUgekZhcik7Cit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmKEdMZW51bSBwYXJhbSwgR0xmbG9hdCB2YWx1ZSk7Cit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdihHTGVudW0gcGFyYW0sIGNvbnN0IEdMZmxvYXQgKnZhbHVlcyk7Cit2b2lkIGdsUG9pbnRTaXplKEdMZmxvYXQgc2l6ZSk7Cit2b2lkIGdsUm90YXRlZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK3ZvaWQgZ2xTY2FsZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsVGV4RW52ZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwordm9pZCBnbFRleEVudmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK3ZvaWQgZ2xNYXRyaXhNb2RlKEdMZW51bSBtb2RlKTsKK3ZvaWQgZ2xOb3JtYWxQb2ludGVyKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK3ZvaWQgZ2xQb3BNYXRyaXgodm9pZCk7Cit2b2lkIGdsUHVzaE1hdHJpeCh2b2lkKTsKK3ZvaWQgZ2xTaGFkZU1vZGVsKEdMZW51bSBtb2RlKTsKK3ZvaWQgZ2xUZXhDb29yZFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwordm9pZCBnbFRleEVudmkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsVGV4RW52aXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3ZvaWQgZ2xUcmFuc2xhdGVmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordm9pZCBnbFZlcnRleFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX2V4dGVuc2lvbnMuZW50cmllcyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9leHRlbnNpb25zLmVudHJpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlZTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzMl9leHRlbnNpb25zLmVudHJpZXMKQEAgLTAsMCArMSw2IEBACishZ2xlczJfZXh0ZW5zaW9ucworCisjIEdMRVMgMi4wIGV4dGVuc2lvbnMKK3ZvaWQgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pOwordm9pZCBnbFJlbGVhc2VTaGFkZXJDb21waWxlcih2b2lkKTsKK3ZvaWQgZ2xTaGFkZXJCaW5hcnkoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlczJfb25seS5lbnRyaWVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX29ubHkuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIyODU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMyX29ubHkuZW50cmllcwpAQCAtMCwwICsxLDgyIEBACishZ2xlczJfb25seQorCisjIE9wZW5HTCBmdW5jdGlvbnMgd2hpY2ggYXJlIG5lZWRlZCBPTkxZIGZvciBpbXBsZW1lbnRpbmcgR0xFUyAyLjAKK3ZvaWQgZ2xCbGVuZENvbG9yKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK3ZvaWQgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit2b2lkIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0x1aW50IG1hc2spOworR0xib29sZWFuIGdsSXNQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKK0dMYm9vbGVhbiBnbElzU2hhZGVyKEdMdWludCBzaGFkZXIpOwordm9pZCBnbFZlcnRleEF0dHJpYjFmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgpOwordm9pZCBnbFZlcnRleEF0dHJpYjFmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWIyZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwordm9pZCBnbFZlcnRleEF0dHJpYjJmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWIzZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Cit2b2lkIGdsVmVydGV4QXR0cmliM2Z2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwordm9pZCBnbFZlcnRleEF0dHJpYjRmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwordm9pZCBnbFZlcnRleEF0dHJpYjRmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKK3ZvaWQgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cik7Cit2b2lkIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KEdMdWludCBpbmRleCk7Cit2b2lkIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoR0x1aW50IGluZGV4KTsKK3ZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJmdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJpdihHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpOwordm9pZCBnbFVuaWZvcm0xZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKK3ZvaWQgZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtMWkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwordm9pZCBnbFVuaWZvcm0xaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtMmYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKK3ZvaWQgZ2xVbmlmb3JtMmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtMmkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwordm9pZCBnbFVuaWZvcm0yaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtM2YoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwordm9pZCBnbFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwordm9pZCBnbFVuaWZvcm0zaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Cit2b2lkIGdsVW5pZm9ybTNpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwordm9pZCBnbFVuaWZvcm00ZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKK3ZvaWQgZ2xVbmlmb3JtNGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtNGkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwordm9pZCBnbFVuaWZvcm00aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKK3ZvaWQgZ2xVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Cit2b2lkIGdsVW5pZm9ybU1hdHJpeDNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwordm9pZCBnbFVuaWZvcm1NYXRyaXg0ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKTsKK3ZvaWQgZ2xBdHRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwordm9pZCBnbEJpbmRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlcik7CitHTHVpbnQgZ2xDcmVhdGVQcm9ncmFtKHZvaWQpOworR0x1aW50IGdsQ3JlYXRlU2hhZGVyKEdMZW51bSB0eXBlKTsKK3ZvaWQgZ2xEZWxldGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKK3ZvaWQgZ2xEZWxldGVTaGFkZXIoR0x1aW50IHNoYWRlcik7Cit2b2lkIGdsRGV0YWNoU2hhZGVyKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKK3ZvaWQgZ2xMaW5rUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7Cit2b2lkIGdsVXNlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7Cit2b2lkIGdsVmFsaWRhdGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKK3ZvaWQgZ2xHZXRBY3RpdmVBdHRyaWIoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7Cit2b2lkIGdsR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKTsKK3ZvaWQgZ2xHZXRBdHRhY2hlZFNoYWRlcnMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpOworaW50ICBnbEdldEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbEdldFByb2dyYW1pdihHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRQcm9ncmFtSW5mb0xvZyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyk7Cit2b2lkIGdsR2V0U2hhZGVyaXYoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKK3ZvaWQgZ2xHZXRTaGFkZXJJbmZvTG9nKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOwordm9pZCBnbEdldFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpOwordm9pZCBnbEdldFVuaWZvcm1mdihHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcyk7Cit2b2lkIGdsR2V0VW5pZm9ybWl2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcyk7CitpbnQgIGdsR2V0VW5pZm9ybUxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwordm9pZCBnbFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqIGNvbnN0KiBzdHJpbmcsIGNvbnN0IEdMaW50KiBsZW5ndGgpOworCisjIFRoZSBmb2xsb3dpbmcgYXJlIG5vdCB1c2VkIGJ5IEdMRGlzcGF0Y2ggYnV0IGJ5IEdMRVN2MkRpc3BhdGNoCit2b2lkIGdsQmluZEZyYW1lYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Cit2b2lkIGdsR2VuRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOworR0xlbnVtIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTGVudW0gdGFyZ2V0KTsKK3ZvaWQgZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7CisKK0dMYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyKEdMdWludCByZW5kZXJidWZmZXIpOwordm9pZCBnbEJpbmRSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit2b2lkIGdsR2VuUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZShHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwordm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKKwordm9pZCBnbEdlbmVyYXRlTWlwbWFwKEdMZW51bSB0YXJnZXQpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL2dsZXMzX29ubHkuZW50cmllcyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzM19vbmx5LmVudHJpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5NjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzM19vbmx5LmVudHJpZXMKQEAgLTAsMCArMSwyNCBAQAorIWdsZXMzX29ubHkKKworIyBHTEVTIDMueCBmdW5jdGlvbnMgcmVxdWlyZWQgYnkgdGhlIHRyYW5zbGF0b3IgbGlicmFyeS4KKyMgUmlnaHQgbm93LCB0aGlzIGlzIHVzZWQgZm9yOgorCisjIC0gZ2xHZXRTdHJpbmdpKCkgZnJvbSB0aGUgaG9zdCBHTCBsaWJyYXJ5IGluIG9yZGVyIHRvCisjICAgZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykgaXMgb2Jzb2xldGUuCisjICAgSW4gT3BlbkdMIDMuMCwgc29tZSBkcml2ZXJzIGRvbid0IGltcGxlbWVudCBpdCBhbnltb3JlLgorIyAgIChpLmUuIHRoZSAjIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyBOVUxMKS4KKyMgLSBnbEZlbmNlU3luYyAvIGdsQ2xpZW50V2FpdFN5bmMgLyBnbFdhaXRTeW5jIHRvIGVuZm9yY2UgZnJhbWUKKyMgICBvcmRlcmluZyB3aGlsZSBwcmVzZXJ2aW5nIHBlcmZvcm1hbmNlLCBhbmQgdG8gaW1wbGVtZW50CisjICAgS0hSX2ZlbmNlX3N5bmMgYW5kIEtIUl9BTkRST0lEX25hdGl2ZV9mZW5jZV9zeW5jIGV4dGVuc2lvbnMuCisKKyUjaW5jbHVkZSA8R0xFUy9nbC5oPgorJSNpbmNsdWRlIDxHTEVTMy9nbDMuaD4KKworIyBOZXcgdmVyc2lvbiBvZiBnbEdldFN0cmluZworR0xjb25zdHVieXRlcHRyIGdsR2V0U3RyaW5naShHTGVudW0gbmFtZSwgR0xpbnQgaW5kZXgpOworCisjIE9wZW5HTCBFUyAzKyBzeW5jIGNvbW1hbmRzCitHTHN5bmMgZ2xGZW5jZVN5bmMoR0xlbnVtIGNvbmRpdGlvbiwgR0xiaXRmaWVsZCBmbGFncyk7CitHTGVudW0gZ2xDbGllbnRXYWl0U3luYyhHTHN5bmMgd2FpdF9vbiwgR0xiaXRmaWVsZCBmbGFncywgR0x1aW50NjQgdGltZW91dCk7Cit2b2lkIGdsV2FpdFN5bmMoR0xzeW5jIHdhaXRfb24sIEdMYml0ZmllbGQgZmxhZ3MsIEdMdWludDY0IHRpbWVvdXQpOwordm9pZCBnbERlbGV0ZVN5bmMoR0xzeW5jIHRvX2RlbGV0ZSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19jb21tb24uZW50cmllcyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2NvbW1vbi5lbnRyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2I5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19jb21tb24uZW50cmllcwpAQCAtMCwwICsxLDc0IEBACishZ2xlc19jb21tb24KKworIyBGdW5jdGlvbnMgY29tbW9uIHRvIGJvdGggR0xFUyAxLnggYW5kIDIuMAorCislI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyUvLyBSZXR1cm4gdHlwZXMgbXVzdCBiZSBzaW5nbGUgd29yZHMsIHNlZSBHTERpc3BhdGNoLmNwcAorJXR5cGVkZWYgY29uc3QgR0x1Ynl0ZSogR0xjb25zdHVieXRlcHRyOworCit2b2lkIGdsQWN0aXZlVGV4dHVyZSggR0xlbnVtIHRleHR1cmUgKTsKK3ZvaWQgZ2xCaW5kQnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwordm9pZCBnbEJpbmRUZXh0dXJlKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKK3ZvaWQgZ2xCbGVuZEZ1bmMoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKK3ZvaWQgZ2xCbGVuZEVxdWF0aW9uKCBHTGVudW0gbW9kZSApOwordm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Cit2b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwordm9pZCBnbEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSk7Cit2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKK3ZvaWQgZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spOwordm9pZCBnbENsZWFyQ29sb3IoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwordm9pZCBnbENsZWFyRGVwdGgoR0xjbGFtcGQgZGVwdGgpOwordm9pZCBnbENsZWFyU3RlbmNpbChHTGludCBzKTsKK3ZvaWQgZ2xDb2xvck1hc2soR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKTsKK3ZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApOwordm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKTsKK3ZvaWQgZ2xDb3B5VGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsRm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK3ZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwordm9pZCBnbEN1bGxGYWNlKEdMZW51bSBtb2RlKTsKK3ZvaWQgZ2xEZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKTsKK3ZvaWQgZ2xEZWxldGVUZXh0dXJlcyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOwordm9pZCBnbERlcHRoRnVuYyhHTGVudW0gZnVuYyk7Cit2b2lkIGdsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKTsKK3ZvaWQgZ2xEZXB0aFJhbmdlKEdMY2xhbXBkIHpOZWFyLCBHTGNsYW1wZCB6RmFyKTsKK3ZvaWQgZ2xEaXNhYmxlKEdMZW51bSBjYXApOwordm9pZCBnbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK3ZvaWQgZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwordm9pZCBnbEVuYWJsZShHTGVudW0gY2FwKTsKK3ZvaWQgZ2xGaW5pc2godm9pZCk7Cit2b2lkIGdsRmx1c2godm9pZCk7Cit2b2lkIGdsRnJvbnRGYWNlKEdMZW51bSBtb2RlKTsKK3ZvaWQgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsKK3ZvaWQgZ2xHZW5UZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpOwordm9pZCBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpOwordm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSBidWZmZXIsIEdMZW51bSBwYXJhbWV0ZXIsIEdMaW50ICp2YWx1ZSk7CitHTGVudW0gZ2xHZXRFcnJvcih2b2lkKTsKK3ZvaWQgZ2xHZXRGbG9hdHYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7CitHTGNvbnN0dWJ5dGVwdHIgZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpOwordm9pZCBnbFRleFBhcmFtZXRlcmYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwordm9pZCBnbEdldFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Cit2b2lkIGdsR2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3ZvaWQgZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMYm9vbGVhbiBnbElzQnVmZmVyKEdMdWludCBidWZmZXIpOworR0xib29sZWFuIGdsSXNFbmFibGVkKEdMZW51bSBjYXApOworR0xib29sZWFuIGdsSXNUZXh0dXJlKEdMdWludCB0ZXh0dXJlKTsKK3ZvaWQgZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCk7Cit2b2lkIGdsUG9seWdvbk9mZnNldChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Cit2b2lkIGdsUGl4ZWxTdG9yZWkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsUmVhZFBpeGVscyhHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKK3ZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKTsKK3ZvaWQgZ2xTY2lzc29yKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xTdGVuY2lsRnVuYyhHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Cit2b2lkIGdsU3RlbmNpbE1hc2soR0x1aW50IG1hc2spOwordm9pZCBnbFN0ZW5jaWxPcChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwordm9pZCBnbFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwordm9pZCBnbFRleFBhcmFtZXRlcmkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Cit2b2lkIGdsVGV4UGFyYW1ldGVyaXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKK3ZvaWQgZ2xUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK3ZvaWQgZ2xWaWV3cG9ydChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Cit2b2lkIGdsUHVzaEF0dHJpYiggR0xiaXRmaWVsZCBtYXNrICk7Cit2b2lkIGdsUHVzaENsaWVudEF0dHJpYiggR0xiaXRmaWVsZCBtYXNrICk7Cit2b2lkIGdsUG9wQXR0cmliKCB2b2lkICk7Cit2b2lkIGdsUG9wQ2xpZW50QXR0cmliKCB2b2lkICk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19leHRlbnNpb25zLmVudHJpZXMgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvZ2xlc19leHRlbnNpb25zLmVudHJpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3ZThhZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaC9nbGVzX2V4dGVuc2lvbnMuZW50cmllcwpAQCAtMCwwICsxLDI0IEBACishZ2xlc19leHRlbnNpb25zCisKKyMgQ29tbW9uIEdMRVMgMS54IC8gMi4wIGV4dGVuc2lvbiBmdW5jdGlvbnMKK0dMYm9vbGVhbiBnbElzUmVuZGVyYnVmZmVyRVhUKEdMdWludCByZW5kZXJidWZmZXIpOwordm9pZCBnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Cit2b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc0VYVChHTHNpemVpIG4sIEdMdWludCAqcmVuZGVyYnVmZmVycyk7Cit2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK3ZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOworR0xib29sZWFuIGdsSXNGcmFtZWJ1ZmZlckVYVChHTHVpbnQgZnJhbWVidWZmZXIpOwordm9pZCBnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwordm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZnJhbWVidWZmZXJzKTsKK3ZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQoR0xzaXplaSBuLCBHTHVpbnQgKmZyYW1lYnVmZmVycyk7CitHTGVudW0gZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdMZW51bSB0YXJnZXQpOwordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTFERVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTNERVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwordm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKK3ZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK3ZvaWQgZ2xHZW5lcmF0ZU1pcG1hcEVYVChHTGVudW0gdGFyZ2V0KTsKKworIyBUaGUgZm9sbG93aW5nIGV4dGVuc2lvbnMgYXJlIHVzZWQgYnkgR0xFU3YxRGlzcGF0Y2ggYW5kIEdMRVN2MkRpc3BhdGNoLCBidXQgbm90IGJ5IEdMRGlzcGF0Y2gKK3ZvaWQgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKK3ZvaWQgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvcmVuZGVyX2VnbC5lbnRyaWVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL3JlbmRlcl9lZ2wuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhNTJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL3JlbmRlcl9lZ2wuZW50cmllcwpAQCAtMCwwICsxLDI3IEBACisjIFRoZSBsaXN0IG9mIEVHTCBmdW5jdGlvbnMgdXNlZCBieSBsaWJPcGVuZ2xSZW5kZXIsIHdpdGhvdXQgZXh0ZW5zaW9ucy4KKyMgVGhpcyBpcyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBmdWxsIEVHTCBBUEkuCisKKyFSZW5kZXJfRUdMCislI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKworRUdMaW50IGVnbEdldEVycm9yKHZvaWQpOworRUdMRGlzcGxheSBlZ2xHZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRweSk7CitFR0xCb29sZWFuIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSk7CitFR0xCb29sZWFuIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCogbWFqb3IsIEVHTGludCogbWlub3IpOworY2hhciogZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBpZCk7CitFR0xCb29sZWFuIGVnbEdldENvbmZpZ3MoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcqIGNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50KiBudW1fY29uZmlnKTsKK0VHTEJvb2xlYW4gZWdsQ2hvb3NlQ29uZmlnKEVHTERpc3BsYXkgZGlzcGxheSwgY29uc3QgRUdMaW50KiBhdHRyaWJzLCBFR0xDb25maWcqIGNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50KiBudW1fY29uZmlnKTsKK0VHTEJvb2xlYW4gZWdsR2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50KiB2YWx1ZSk7CitFR0xTdXJmYWNlIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnLCBFR0xOYXRpdmVXaW5kb3dUeXBlIG5hdGl2ZV93aW5kb3csIGNvbnN0IEVHTGludCogYXR0cmliX2xpc3QpOworRUdMU3VyZmFjZSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCogYXR0cmliX2xpc3QpOworRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CitFR0xCb29sZWFuIGVnbEJpbmRBUEkoRUdMZW51bSBhcGkpOworRUdMZW51bSBlZ2xRdWVyeUFQSSh2b2lkKTsKK0VHTEJvb2xlYW4gZWdsUmVsZWFzZVRocmVhZCh2b2lkKTsKK0VHTENvbnRleHQgZWdsQ3JlYXRlQ29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgc2hhcmVfY29udGV4dCwgY29uc3QgRUdMaW50KiBhdHRyaWJfbGlzdCk7CitFR0xCb29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29udGV4dCBjb250ZXh0KTsKK0VHTEJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTdXJmYWNlIGRyYXcsIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjb250ZXh0KTsKK0VHTENvbnRleHQgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCk7CitFR0xTdXJmYWNlIGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTGludCByZWFkZHJhdyk7CitFR0xCb29sZWFuIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKK3ZvaWQqIGVnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIqIGZ1bmN0aW9uX25hbWUpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL3JlbmRlcl9lZ2xfZXh0ZW5zaW9ucy5lbnRyaWVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuR0xFU0Rpc3BhdGNoL3JlbmRlcl9lZ2xfZXh0ZW5zaW9ucy5lbnRyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWZlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gvcmVuZGVyX2VnbF9leHRlbnNpb25zLmVudHJpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBUaGUgbGlzdCBvZiBFR0wgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB1c2VkIGJ5IGxpYk9wZW5nbFJlbmRlci4KKyMgVGhpcyBpcyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBmdWxsIEVHTCBBUEkuCisKKyFSZW5kZXJfRUdMX2V4dGVuc2lvbnMKKworJSNpbmNsdWRlIDxFR0wvZWdsLmg+CislI2RlZmluZSBFR0xfRUdMRVhUX1BST1RPVFlQRVMKKyUjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorCitFR0xJbWFnZUtIUiBlZ2xDcmVhdGVJbWFnZUtIUihFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCogYXR0cmliX2xpc3QpOworRUdMQm9vbGVhbiBlZ2xEZXN0cm95SW1hZ2VLSFIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xJbWFnZUtIUiBpbWFnZSk7CitFR0xTeW5jS0hSIGVnbENyZWF0ZVN5bmNLSFIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xlbnVtIHR5cGUsIGNvbnN0IEVHTGludCogYXR0cmlicyk7CitFR0xpbnQgZWdsQ2xpZW50V2FpdFN5bmNLSFIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KTsKK0VHTEJvb2xlYW4gZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTeW5jS0hSIHN5bmMpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTg1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3NSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitob3N0X09TX1NSQ1MgOj0KK2hvc3RfY29tbW9uX0xETElCUyA6PQorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksbGludXgpCisgICAgaG9zdF9PU19TUkNTID0gTmF0aXZlU3ViV2luZG93X3gxMS5jcHAKKyAgICBob3N0X2NvbW1vbl9MRExJQlMgKz0gLWxYMTEgLWxydAorZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGRhcndpbikKKyAgICBob3N0X09TX1NSQ1MgPSBOYXRpdmVTdWJXaW5kb3dfY29jb2EubQorICAgIGhvc3RfY29tbW9uX0xETElCUyArPSAtV2wsLWZyYW1ld29yayxBcHBLaXQKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgIGhvc3RfT1NfU1JDUyA9IE5hdGl2ZVN1YldpbmRvd193aW4zMi5jcHAKKyAgICBob3N0X2NvbW1vbl9MRExJQlMgKz0gLWxnZGkzMgorZW5kaWYKKworaG9zdF9jb21tb25fU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGhvc3RfT1NfU1JDUykgXAorICAgIENoYW5uZWxTdHJlYW0uY3BwIFwKKyAgICBDb2xvckJ1ZmZlci5jcHAgXAorICAgIEZiQ29uZmlnLmNwcCBcCisgICAgRmVuY2VTeW5jLmNwcCBcCisgICAgRnJhbWVCdWZmZXIuY3BwIFwKKyAgICBSZWFkQnVmZmVyLmNwcCBcCisgICAgUmVuZGVyQ2hhbm5lbEltcGwuY3BwIFwKKyAgICBSZW5kZXJDb250ZXh0LmNwcCBcCisgICAgUmVuZGVyQ29udHJvbC5jcHAgXAorICAgIFJlbmRlcmVySW1wbC5jcHAgXAorICAgIFJlbmRlckxpYkltcGwuY3BwIFwKKyAgICBSZW5kZXJUaHJlYWQuY3BwIFwKKyAgICBSZW5kZXJUaHJlYWRJbmZvLmNwcCBcCisgICAgcmVuZGVyX2FwaS5jcHAgXAorICAgIFJlbmRlcldpbmRvdy5jcHAgXAorICAgIFN5bmNUaHJlYWQuY3BwIFwKKyAgICBUZXh0dXJlRHJhdy5jcHAgXAorICAgIFRleHR1cmVSZXNpemUuY3BwIFwKKyAgICBXaW5kb3dTdXJmYWNlLmNwcCBcCisKKyMjIyBob3N0IGxpYk9wZW5nbFJlbmRlciAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiskKGNhbGwgZW11Z2wtYmVnaW4tc2hhcmVkLWxpYnJhcnksbGliJChCVUlMRF9UQVJHRVRfU1VGRklYKU9wZW5nbFJlbmRlcikKKworJChjYWxsIGVtdWdsLWltcG9ydCxsaWJHTEVTdjFfZGVjIGxpYkdMRVN2Ml9kZWMgbGliX3JlbmRlckNvbnRyb2xfZGVjIGxpYk9wZW5nbENvZGVjQ29tbW9uKQorCitMT0NBTF9MRExJQlMgKz0gJChob3N0X2NvbW1vbl9MRExJQlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhvc3RfY29tbW9uX1NSQ19GSUxFUykKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ19JTkNMVURFUywkKEVNVUdMX1BBVEgpL2hvc3QvaW5jbHVkZSkKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ19JTkNMVURFUywkKExPQ0FMX1BBVEgpKQorCisjIHVzZSBUcmFuc2xhdG9yJ3MgZWdsL2dsZXMgaGVhZGVycworTE9DQUxfQ19JTkNMVURFUyArPSAkKEVNVUdMX1BBVEgpL2hvc3QvbGlicy9UcmFuc2xhdG9yL2luY2x1ZGUKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChFTVVHTF9QQVRIKS9ob3N0L2xpYnMvbGliT3BlbkdMRVNEaXNwYXRjaAorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYmVtdWdsX2NvbW1vbgorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJPcGVuR0xFU0Rpc3BhdGNoCisKK0xPQ0FMX1NZTUJPTF9GSUxFIDo9IHJlbmRlcl9hcGkuZW50cmllcworCiskKGNhbGwgZW11Z2wtZXhwb3J0LENGTEFHUywkKEVNVUdMX1VTRVJfQ0ZMQUdTKSkKKworJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCisKKyMjIyBPcGVuZ2xSZW5kZXIgdW5pdHRlc3RzCiskKGNhbGwgZW11Z2wtYmVnaW4tZXhlY3V0YWJsZSxsaWIkKEJVSUxEX1RBUkdFVF9TVUZGSVgpT3BlbmdsUmVuZGVyX3VuaXR0ZXN0cykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBCdWZmZXJRdWV1ZV91bml0dGVzdC5jcHAgXAorCiskKGNhbGwgZW11Z2wtaW1wb3J0LGxpYiQoQlVJTERfVEFSR0VUX1NVRkZJWClPcGVuZ2xSZW5kZXIgbGliZW11Z2xfZ3Rlc3QpCiskKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKQorJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9CdWZmZXJRdWV1ZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvQnVmZmVyUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAwYTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvQnVmZmVyUXVldWUuaApAQCAtMCwwICsxLDE2NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Db21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCituYW1lc3BhY2UgZW11Z2wgeworCisvLyBCdWZmZXJRdWV1ZSBtb2RlbHMgYSBGSUZPIHF1ZXVlIG9mIFJlbmRlckNoYW5uZWw6OkJ1ZmZlciBpbnN0YW5jZXMKKy8vIHRoYXQgY2FuIGJlIHVzZWQgYmV0d2VlbiB0d28gZGlmZmVyZW50IHRocmVhZHMuIE5vdGUgdGhhdCBpdCBkZXBlbmRzLAorLy8gZm9yIHN5bmNocm9uaXphdGlvbiwgb24gYW4gZXh0ZXJuYWwgbG9jayAocGFzc2VkIGFzIGEgcmVmZXJlbmNlIGluCisvLyB0aGUgQnVmZmVyUXVldWUgY29uc3RydWN0b3IpLgorLy8KKy8vIFRoaXMgYWxsb3dzIG9uZSB0byB1c2UgbXVsdGlwbGUgQnVmZmVyUXVldWUgaW5zdGFuY2VzIHdob3NlIGNvbnRlbnQKKy8vIGFyZSBwcm90ZWN0ZWQgYnkgYSBzaW5nbGUgbG9jay4KK2NsYXNzIEJ1ZmZlclF1ZXVlIHsKKyAgICB1c2luZyBDb25kaXRpb25WYXJpYWJsZSA9IGFuZHJvaWQ6OmJhc2U6OkNvbmRpdGlvblZhcmlhYmxlOworICAgIHVzaW5nIExvY2sgPSBhbmRyb2lkOjpiYXNlOjpMb2NrOworICAgIHVzaW5nIEF1dG9Mb2NrID0gYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2s7CisKK3B1YmxpYzoKKyAgICB1c2luZyBJb1Jlc3VsdCA9IFJlbmRlckNoYW5uZWw6OklvUmVzdWx0OworICAgIHVzaW5nIEJ1ZmZlciA9IFJlbmRlckNoYW5uZWw6OkJ1ZmZlcjsKKworICAgIC8vIENvbnN0cnVjdG9yLiB8Y2FwYWNpdHl8IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBCdWZmZXIgaW5zdGFuY2VzIGluCisgICAgLy8gdGhlIHF1ZXVlLCBhbmQgfGxvY2t8IGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIGxvY2sgcHJvdmlkZWQgYnkKKyAgICAvLyB0aGUgY2FsbGVyLgorICAgIEJ1ZmZlclF1ZXVlKHNpemVfdCBjYXBhY2l0eSwgYW5kcm9pZDo6YmFzZTo6TG9jayYgbG9jaykKKyAgICAgICAgOiBtQ2FwYWNpdHkoY2FwYWNpdHkpLCBtQnVmZmVycyhuZXcgQnVmZmVyW2NhcGFjaXR5XSksIG1Mb2NrKGxvY2spIHt9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgdGhlIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4gUmVtYWluaW5nIGl0ZW1zIGNhbgorICAgIC8vIGJlIHJlYWQgZnJvbSBpdHMsIGJ1dCBpdCB3b24ndCBiZSBwb3NzaWJsZSB0byBhZGQgbmV3IGl0ZW1zIHRvIGl0LgorICAgIC8vIGJvb2wgY2xvc2VkKCkgY29uc3QgeyByZXR1cm4gbUNsb3NlZDsgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIG9uZSBjYW4gc2VuZCBhIGJ1ZmZlciB0byB0aGUgcXVldWUsIGkuZS4gaWYgaXQKKyAgICAvLyBpcyBub3QgZnVsbC4KKyAgICBib29sIGNhblB1c2hMb2NrZWQoKSBjb25zdCB7IHJldHVybiAhbUNsb3NlZCAmJiAobUNvdW50IDwgbUNhcGFjaXR5KTsgfQorCisgICAgLy8gUmV0dXJuIHRydWUgaWZmIG9uZSBjYW4gcmVjZWl2ZSBhIGJ1ZmZlciBmcm9tIHRoZSBxdWV1ZSwgaS5lLiBpZgorICAgIC8vIGl0IGlzIG5vdCBlbXB0eS4KKyAgICBib29sIGNhblBvcExvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1Db3VudCA+IDBVOyB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZmYgdGhlIHF1ZXVlIGlzIGNsb3NlZC4KKyAgICBib29sIGlzQ2xvc2VkTG9ja2VkKCkgY29uc3QgeyByZXR1cm4gbUNsb3NlZDsgfQorCisgICAgLy8gVHJ5IHRvIHNlbmQgYSBidWZmZXIgdG8gdGhlIHF1ZXVlLiBPbiBzdWNjZXNzLCByZXR1cm4gSW9SZXN1bHQ6Ok9rCisgICAgLy8gYW5kIG1vdmVzIHxidWZmZXJ8IHRvIHRoZSBxdWV1ZS4gT24gZmFpbHVyZSwgcmV0dXJuCisgICAgLy8gSW9SZXN1bHQ6OlRyeUFnYWluIGlmIHRoZSBxdWV1ZSB3YXMgZnVsbCwgb3IgSW9SZXN1bHQ6OkVycm9yCisgICAgLy8gaWYgaXQgd2FzIGNsb3NlZC4KKyAgICBJb1Jlc3VsdCB0cnlQdXNoTG9ja2VkKEJ1ZmZlciYmIGJ1ZmZlcikgeworICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgcmV0dXJuIElvUmVzdWx0OjpFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvdW50ID49IG1DYXBhY2l0eSkgeworICAgICAgICAgICAgcmV0dXJuIElvUmVzdWx0OjpUcnlBZ2FpbjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgcG9zID0gbVBvcyArIG1Db3VudDsKKyAgICAgICAgaWYgKHBvcyA+PSBtQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgIHBvcyAtPSBtQ2FwYWNpdHk7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlcnNbcG9zXSA9IHN0ZDo6bW92ZShidWZmZXIpOworICAgICAgICBpZiAobUNvdW50KysgPT0gMCkgeworICAgICAgICAgICAgbUNhblBvcC5zaWduYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW9SZXN1bHQ6Ok9rOworICAgIH0KKworICAgIC8vIFB1c2ggYSBidWZmZXIgdG8gdGhlIHF1ZXVlLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gT24gc3VjY2VzcywKKyAgICAvLyBtb3ZlIHxidWZmZXJ8IGludG8gdGhlIHF1ZXVlIGFuZCByZXR1cm4gSW9SZXN1bHQ6Ok9rLiBPbiBmYWlsdXJlLAorICAgIC8vIHJldHVybiBJb1Jlc3VsdDo6RXJyb3IgbWVhbmluZyB0aGUgcXVldWUgd2FzIGNsb3NlZC4KKyAgICBJb1Jlc3VsdCBwdXNoTG9ja2VkKEJ1ZmZlciYmIGJ1ZmZlcikgeworICAgICAgICB3aGlsZSAobUNvdW50ID09IG1DYXBhY2l0eSkgeworICAgICAgICAgICAgaWYgKG1DbG9zZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW9SZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhblB1c2gud2FpdCgmbUxvY2spOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnlQdXNoTG9ja2VkKHN0ZDo6bW92ZShidWZmZXIpKTsKKyAgICB9CisKKyAgICAvLyBUcnkgdG8gcmVhZCBhIGJ1ZmZlciBmcm9tIHRoZSBxdWV1ZS4gT24gc3VjY2VzcywgbW92ZXMgaXRlbSBpbnRvCisgICAgLy8gfCpidWZmZXJ8IGFuZCByZXR1cm4gSW9SZXN1bHQ6Ok9rLiBPbiBmYWlsdXJlLCByZXR1cm4gSW9SZXN1bHQ6OkVycm9yCisgICAgLy8gaWYgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBjbG9zZWQsIGFuZCBJb1Jlc3VsdDo6VHJ5QWdhaW4gaWYgaXQgaXMKKyAgICAvLyBlbXB0eSBidXQgbm90IGNsb3NlLgorICAgIElvUmVzdWx0IHRyeVBvcExvY2tlZChCdWZmZXIqIGJ1ZmZlcikgeworICAgICAgICBpZiAobUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2xvc2VkID8gSW9SZXN1bHQ6OkVycm9yIDogSW9SZXN1bHQ6OlRyeUFnYWluOworICAgICAgICB9CisgICAgICAgICpidWZmZXIgPSBzdGQ6Om1vdmUobUJ1ZmZlcnNbbVBvc10pOworICAgICAgICBzaXplX3QgcG9zID0gbVBvcyArIDE7CisgICAgICAgIGlmIChwb3MgPj0gbUNhcGFjaXR5KSB7CisgICAgICAgICAgICBwb3MgLT0gbUNhcGFjaXR5OworICAgICAgICB9CisgICAgICAgIG1Qb3MgPSBwb3M7CisgICAgICAgIGlmIChtQ291bnQtLSA9PSBtQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgIG1DYW5QdXNoLnNpZ25hbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJb1Jlc3VsdDo6T2s7CisgICAgfQorCisgICAgLy8gUG9wIGEgYnVmZmVyIGZyb20gdGhlIHF1ZXVlLiBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gT24gc3VjY2VzcywKKyAgICAvLyBtb3ZlIGl0ZW0gaW50byB8KmJ1ZmZlcnwgYW5kIHJldHVybiBJb1Jlc3VsdDo6T2suIE9uIGZhaWx1cmUsCisgICAgLy8gcmV0dXJuIElvUmVzdWx0OjpFcnJvciB0byBpbmRpY2F0ZSB0aGUgcXVldWUgd2FzIGNsb3NlZC4KKyAgICBJb1Jlc3VsdCBwb3BMb2NrZWQoQnVmZmVyKiBidWZmZXIpIHsKKyAgICAgICAgd2hpbGUgKG1Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAobUNsb3NlZCkgeworICAgICAgICAgICAgICAgIC8vIENsb3NlZCBxdWV1ZSBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICByZXR1cm4gSW9SZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhblBvcC53YWl0KCZtTG9jayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyeVBvcExvY2tlZChidWZmZXIpOworICAgIH0KKworICAgIC8vIENsb3NlIHRoZSBxdWV1ZSwgaXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIHB1c2ggbmV3IGl0ZW1zCisgICAgLy8gdG8gaXQgKGkuZS4gcHVzaCgpIHdpbGwgYWx3YXlzIHJldHVybiBJb1Jlc3VsdDo6RXJyb3IpLCBvciB0bworICAgIC8vIHJlYWQgZnJvbSBhbiBlbXB0eSBxdWV1ZSAoaS5lLiBwb3AoKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAvLyBJb1Jlc3VsdDo6RXJyb3Igb25jZSB0aGUgcXVldWUgYmVjb21lcyBlbXB0eSkuCisgICAgdm9pZCBjbG9zZUxvY2tlZCgpIHsKKyAgICAgICAgbUNsb3NlZCA9IHRydWU7CisKKyAgICAgICAgLy8gV2FrZSBhbnkgcG90ZW50aWFsIHdhaXRlcnMuCisgICAgICAgIGlmIChtQ291bnQgPT0gbUNhcGFjaXR5KSB7CisgICAgICAgICAgICBtQ2FuUHVzaC5icm9hZGNhc3QoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1DYW5Qb3AuYnJvYWRjYXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1DYXBhY2l0eSA9IDA7CisgICAgc2l6ZV90IG1Qb3MgPSAwOworICAgIHNpemVfdCBtQ291bnQgPSAwOworICAgIGJvb2wgbUNsb3NlZCA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJbXT4gbUJ1ZmZlcnM7CisKKyAgICBMb2NrJiBtTG9jazsKKyAgICBDb25kaXRpb25WYXJpYWJsZSBtQ2FuUHVzaDsKKyAgICBDb25kaXRpb25WYXJpYWJsZSBtQ2FuUG9wOworCisgICAgLy8gVGhpcyB3aWxsIGZvcmNlIHRoZSBzYW1lIGZvciBTeW5jQnVmZmVyUXVldWUgYW5kIFJlbmRlckNoYW5uZWxJbXBsCisgICAgRElTQUxMT1dfQ09QWV9BU1NJR05fQU5EX01PVkUoQnVmZmVyUXVldWUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9CdWZmZXJRdWV1ZV91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9CdWZmZXJRdWV1ZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc4YTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0J1ZmZlclF1ZXVlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDMyOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiQnVmZmVyUXVldWUuaCIKKworI2lmZGVmIF9XSU4zMgorI3VuZGVmIEVSUk9SICAgLy8gTWFrZSBMT0coRVJST1IpIGNvbXBpbGUgcHJvcGVybHkuCisjZW5kaWYKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlckNoYW5uZWwuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxvY2s7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jazsKK3VzaW5nIEJ1ZmZlciA9IEJ1ZmZlclF1ZXVlOjpCdWZmZXI7Cit1c2luZyBJb1Jlc3VsdCA9IEJ1ZmZlclF1ZXVlOjpJb1Jlc3VsdDsKKworVEVTVChCdWZmZXJRdWV1ZSwgQ29uc3RydWN0b3IpIHsKKyAgICBMb2NrIGxvY2s7CisgICAgQnVmZmVyUXVldWUgcXVldWUoMTYsIGxvY2spOworfQorCitURVNUKEJ1ZmZlclF1ZXVlLCB0cnlQdXNoTG9ja2VkKSB7CisgICAgTG9jayBsb2NrOworICAgIEJ1ZmZlclF1ZXVlIHF1ZXVlKDIsIGxvY2spOworICAgIEF1dG9Mb2NrIGFsKGxvY2spOworCisgICAgRVhQRUNUX0VRKElvUmVzdWx0OjpPaywgcXVldWUudHJ5UHVzaExvY2tlZChCdWZmZXIoIkhlbGxvIikpKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQdXNoTG9ja2VkKEJ1ZmZlcigiV29ybGQiKSkpOworCisgICAgQnVmZmVyIGJ1ZmYwKCJZb3UgU2hhbGwgTm90IE1vdmUiKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6OlRyeUFnYWluLCBxdWV1ZS50cnlQdXNoTG9ja2VkKHN0ZDo6bW92ZShidWZmMCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZjAuZW1wdHkoKSkgPDwgIkJ1ZmZlciBzaG91bGQgbm90IGJlIG1vdmVkIG9uIGZhaWx1cmUhIjsKK30KKworVEVTVChCdWZmZXJRdWV1ZSwgdHJ5UHVzaExvY2tlZE9uQ2xvc2VkUXVldWUpIHsKKyAgICBMb2NrIGxvY2s7CisgICAgQnVmZmVyUXVldWUgcXVldWUoMiwgbG9jayk7CisgICAgQXV0b0xvY2sgYWwobG9jayk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQdXNoTG9ja2VkKEJ1ZmZlcigiSGVsbG8iKSkpOworCisgICAgLy8gQ2xvc2luZyB0aGUgcXVldWUgcHJldmVudHMgcHVzaGluZyBuZXcgaXRlbXMgdG8gdGhlIHF1ZXVlLgorICAgIHF1ZXVlLmNsb3NlTG9ja2VkKCk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6OkVycm9yLCBxdWV1ZS50cnlQdXNoTG9ja2VkKEJ1ZmZlcigiV29ybGQiKSkpOworfQorCitURVNUKEJ1ZmZlclF1ZXVlLCB0cnlQb3BMb2NrZWQpIHsKKyAgICBMb2NrIGxvY2s7CisgICAgQnVmZmVyUXVldWUgcXVldWUoMiwgbG9jayk7CisgICAgQXV0b0xvY2sgYWwobG9jayk7CisKKyAgICBCdWZmZXIgYnVmZmVyOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6VHJ5QWdhaW4sIHF1ZXVlLnRyeVBvcExvY2tlZCgmYnVmZmVyKSk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQdXNoTG9ja2VkKEJ1ZmZlcigiSGVsbG8iKSkpOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6T2ssIHF1ZXVlLnRyeVB1c2hMb2NrZWQoQnVmZmVyKCJXb3JsZCIpKSk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQb3BMb2NrZWQoJmJ1ZmZlcikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBidWZmZXIuZGF0YSgpKTsKKworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6T2ssIHF1ZXVlLnRyeVBvcExvY2tlZCgmYnVmZmVyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJXb3JsZCIsIGJ1ZmZlci5kYXRhKCkpOworCisgICAgRVhQRUNUX0VRKElvUmVzdWx0OjpUcnlBZ2FpbiwgcXVldWUudHJ5UG9wTG9ja2VkKCZidWZmZXIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIldvcmxkIiwgYnVmZmVyLmRhdGEoKSk7Cit9CisKK1RFU1QoQnVmZmVyUXVldWUsIHRyeVBvcExvY2tlZE9uQ2xvc2VkUXVldWUpIHsKKyAgICBMb2NrIGxvY2s7CisgICAgQnVmZmVyUXVldWUgcXVldWUoMiwgbG9jayk7CisgICAgQXV0b0xvY2sgYWwobG9jayk7CisKKyAgICBCdWZmZXIgYnVmZmVyOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6VHJ5QWdhaW4sIHF1ZXVlLnRyeVBvcExvY2tlZCgmYnVmZmVyKSk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQdXNoTG9ja2VkKEJ1ZmZlcigiSGVsbG8iKSkpOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6T2ssIHF1ZXVlLnRyeVB1c2hMb2NrZWQoQnVmZmVyKCJXb3JsZCIpKSk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQb3BMb2NrZWQoJmJ1ZmZlcikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBidWZmZXIuZGF0YSgpKTsKKworICAgIC8vIENsb3NpbmcgdGhlIHF1ZXVlIGRvZXNuJ3QgcHJldmVudCBwb3BwaW5nIGV4aXN0aW5nIGl0ZW1zLCBidXQKKyAgICAvLyB3aWxsIGdlbmVyYXRlIElvUmVzdWx0OjpFcnJvciBvbmNlIGl0IGlzIGVtcHR5LgorICAgIHF1ZXVlLmNsb3NlTG9ja2VkKCk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS50cnlQb3BMb2NrZWQoJmJ1ZmZlcikpOworICAgIEVYUEVDVF9TVFJFUSgiV29ybGQiLCBidWZmZXIuZGF0YSgpKTsKKworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6RXJyb3IsIHF1ZXVlLnRyeVBvcExvY2tlZCgmYnVmZmVyKSk7CisgICAgRVhQRUNUX1NUUkVRKCJXb3JsZCIsIGJ1ZmZlci5kYXRhKCkpOworfQorCituYW1lc3BhY2UgeworCisvLyBBIFRlc3RUaHJlYWQgaW5zdGFuY2UgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byBhIHF1ZXVlIGFuZCBjYW4gZWl0aGVyCisvLyBwdXNoIG9yIHB1bGwgdG8gaXQsIG9uIGNvbW1hbmQgZnJvbSBhbm90aGVyIHRocmVhZC4gVGhpcyB1c2VzIGEKKy8vIE1lc3NhZ2VDaGFubmVsIHRvIGltcGxlbWVudCB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gdGhlCisvLyBjb21tYW5kIHRocmVhZCBhbmQgdGhpcyBvbmUuCitjbGFzcyBUZXN0VGhyZWFkIGZpbmFsIDogcHVibGljIGFuZHJvaWQ6OmJhc2U6OlRocmVhZCB7CitwdWJsaWM6CisgICAgVGVzdFRocmVhZChMb2NrJiBsb2NrLCBCdWZmZXJRdWV1ZSYgcXVldWUpCisgICAgICAgIC8vIE5PVEU6IFRoZSBkZWZhdWx0IHN0YWNrIHNpemUgb2YgYW5kcm9pZDo6YmFzZTo6VGhyZWFkIGlzIHRvbworICAgICAgICAvLyAgICAgICBzbWFsbCBhbmQgd2lsbCByZXN1bHQgaW4gcnVudGltZSBlcnJvcnMuCisgICAgICAgIDogbUxvY2sobG9jayksIG1RdWV1ZShxdWV1ZSkge30KKworICAgIC8vIFRlbGwgdGhlIHRlc3QgdGhyZWFkIHRvIHB1c2ggfGJ1ZmZlcnwgdG8gdGhlIHF1ZXVlLgorICAgIC8vIENhbGwgZW5kUHVzaCgpIGxhdGVyIHRvIGdldCB0aGUgY29tbWFuZCdzIHJlc3VsdC4KKyAgICBib29sIHN0YXJ0UHVzaChCdWZmZXImJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dC5zZW5kKAorICAgICAgICAgICAgICAgIFJlcXVlc3QgeyAuY21kID0gQ21kOjpQdXNoLCAuYnVmZmVyID0gc3RkOjptb3ZlKGJ1ZmZlcikgfSk7CisgICAgfQorCisgICAgLy8gR2V0IHRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyBzdGFydFB1c2goKSBjb21tYW5kLgorICAgIElvUmVzdWx0IGVuZFB1c2goKSB7CisgICAgICAgIFJlcGx5IHJlcGx5ID0ge307CisgICAgICAgIGlmICghbU91dHB1dC5yZWNlaXZlKCZyZXBseSkpIHsKKyAgICAgICAgICAgIHJldHVybiBJb1Jlc3VsdDo6RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBUZWxsIHRoZSB0ZXN0IHRocmVhZCB0byBwb3AgYSBidWZmZXIgZnJvbSB0aGUgcXVldWUuCisgICAgLy8gQ2FsbCBlbmRQb3AoKSB0byBnZXQgdGhlIGNvbW1hbmQncyByZXN1bHQsIGFzIHdlbGwgYXMgdGhlIHBvcHBlZAorICAgIC8vIGJ1ZmZlciBpZiBpdCBpcyBJb1Jlc3VsdDo6T2suCisgICAgYm9vbCBzdGFydFBvcCgpIHsKKyAgICAgICAgcmV0dXJuIG1JbnB1dC5zZW5kKFJlcXVlc3QgeyAuY21kID0gQ21kOjpQb3AgfSk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgYSBwcmV2aW91cyBzdGFydFBvcCgpIGNvbW1hbmQuIElmIHJlc3VsdCBpcworICAgIC8vIElvUmVzdWx0OjpPaywgc2V0cyB8KmJ1ZmZlcnwgdG8gdGhlIHJlc3VsdCBidWZmZXIuCisgICAgSW9SZXN1bHQgZW5kUG9wKEJ1ZmZlciogYnVmZmVyKSB7CisgICAgICAgIFJlcGx5IHJlcGx5ID0ge307CisgICAgICAgIGlmICghbU91dHB1dC5yZWNlaXZlKCZyZXBseSkpIHsKKyAgICAgICAgICAgIHJldHVybiBJb1Jlc3VsdDo6RXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcGx5LnJlc3VsdCA9PSBJb1Jlc3VsdDo6T2spIHsKKyAgICAgICAgICAgICpidWZmZXIgPSBzdGQ6Om1vdmUocmVwbHkuYnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVzdWx0OworICAgIH0KKworICAgIC8vIFRlbGwgdGhlIHRlc3QgdGhyZWFkIHRvIGNsb3NlIHRoZSBxdWV1ZSBmcm9tIGl0cyBzaWRlLgorICAgIHZvaWQgZG9DbG9zZSgpIHsKKyAgICAgICAgbUlucHV0LnNlbmQoUmVxdWVzdCB7IC5jbWQgPSBDbWQ6OkNsb3NlIH0pOworICAgIH0KKworICAgIC8vIFRlbGwgdGhlIHRlc3QgdGhyZWFkIHRvIHN0b3AgYWZ0ZXIgY29tcGxldGluZyBpdHMgY3VycmVudCBjb21tYW5kLgorICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgbUlucHV0LnNlbmQoUmVxdWVzdCB7IC5jbWQgPSBDbWQ6OlN0b3AgfSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHRoaXMtPndhaXQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIGVudW0gY2xhc3MgQ21kIHsKKyAgICAgICAgUHVzaCwKKyAgICAgICAgUG9wLAorICAgICAgICBDbG9zZSwKKyAgICAgICAgU3RvcCwKKyAgICB9OworCisgICAgc3RydWN0IFJlcXVlc3QgeworICAgICAgICBDbWQgY21kOworICAgICAgICBCdWZmZXIgYnVmZmVyOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVwbHkgeworICAgICAgICBJb1Jlc3VsdCByZXN1bHQ7CisgICAgICAgIEJ1ZmZlciBidWZmZXI7CisgICAgfTsKKworICAgIC8vIE1haW4gdGhyZWFkIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgaW50cHRyX3QgbWFpbigpIG92ZXJyaWRlIGZpbmFsIHsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgUmVxdWVzdCByOworICAgICAgICAgICAgaWYgKCFtSW5wdXQucmVjZWl2ZSgmcikpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb3VsZCBub3QgcmVjZWl2ZSBjb21tYW5kIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyLmNtZCA9PSBDbWQ6OlN0b3ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgIFJlcGx5IHJlcGx5ID0ge307CisgICAgICAgICAgICBib29sIHNlbmRSZXBseSA9IGZhbHNlOworICAgICAgICAgICAgc3dpdGNoIChyLmNtZCkgeworICAgICAgICAgICAgICAgIGNhc2UgQ21kOjpQdXNoOgorICAgICAgICAgICAgICAgICAgICByZXBseS5yZXN1bHQgPSBtUXVldWUucHVzaExvY2tlZChzdGQ6Om1vdmUoci5idWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIENtZDo6UG9wOgorICAgICAgICAgICAgICAgICAgICByZXBseS5yZXN1bHQgPSBtUXVldWUucG9wTG9ja2VkKCZyZXBseS5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQ21kOjpDbG9zZToKKyAgICAgICAgICAgICAgICAgICAgbVF1ZXVlLmNsb3NlTG9ja2VkKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBpZiAoc2VuZFJlcGx5KSB7CisgICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0LnNlbmQoc3RkOjptb3ZlKHJlcGx5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHNlbmQgcmVwbHkiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDBVOworICAgIH0KKworICAgIExvY2smIG1Mb2NrOworICAgIEJ1ZmZlclF1ZXVlJiBtUXVldWU7CisgICAgYW5kcm9pZDo6YmFzZTo6TWVzc2FnZUNoYW5uZWw8UmVxdWVzdCwgND4gbUlucHV0OworICAgIGFuZHJvaWQ6OmJhc2U6Ok1lc3NhZ2VDaGFubmVsPFJlcGx5LCA0PiBtT3V0cHV0OworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoQnVmZmVyUXVldWUsIHB1c2hMb2NrZWQpIHsKKyAgICBMb2NrIGxvY2s7CisgICAgQnVmZmVyUXVldWUgcXVldWUoMiwgbG9jayk7CisgICAgVGVzdFRocmVhZCB0aHJlYWQobG9jaywgcXVldWUpOworCisgICAgQVNTRVJUX1RSVUUodGhyZWFkLnN0YXJ0KCkpOworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5zdGFydFBvcCgpKTsKKworICAgIGxvY2subG9jaygpOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6T2ssIHF1ZXVlLnB1c2hMb2NrZWQoQnVmZmVyKCJIZWxsbyIpKSk7CisgICAgRVhQRUNUX0VRKElvUmVzdWx0OjpPaywgcXVldWUucHVzaExvY2tlZChCdWZmZXIoIldvcmxkIikpKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS5wdXNoTG9ja2VkKEJ1ZmZlcigiRm9vIikpKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgdGhyZWFkLnN0b3AoKTsKK30KKworVEVTVChCdWZmZXJRdWV1ZSwgcHVzaExvY2tlZFdpdGhDbG9zZWRRdWV1ZSkgeworICAgIExvY2sgbG9jazsKKyAgICBCdWZmZXJRdWV1ZSBxdWV1ZSgyLCBsb2NrKTsKKyAgICBUZXN0VGhyZWFkIHRocmVhZChsb2NrLCBxdWV1ZSk7CisKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuc3RhcnQoKSk7CisKKyAgICBsb2NrLmxvY2soKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCBxdWV1ZS5wdXNoTG9ja2VkKEJ1ZmZlcigiSGVsbG8iKSkpOworICAgIC8vIENsb3NpbmcgdGhlIHF1ZXVlIHByZXZlbnRzIHB1c2hpbmcgbmV3IGl0ZW1zLCBidXQgbm90CisgICAgLy8gcHVsbGluZyBmcm9tIHRoZSBxdWV1ZS4KKyAgICBxdWV1ZS5jbG9zZUxvY2tlZCgpOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6RXJyb3IsIHF1ZXVlLnB1c2hMb2NrZWQoQnVmZmVyKCJXb3JsZCIpKSk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIEJ1ZmZlciBidWZmZXI7CisgICAgQVNTRVJUX1RSVUUodGhyZWFkLnN0YXJ0UG9wKCkpOworICAgIEVYUEVDVF9FUShJb1Jlc3VsdDo6T2ssIHRocmVhZC5lbmRQb3AoJmJ1ZmZlcikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8iLCBidWZmZXIuZGF0YSgpKTsKKworICAgIHRocmVhZC5zdG9wKCk7Cit9CisKK1RFU1QoQnVmZmVyUXVldWUsIHBvcExvY2tlZCkgeworICAgIExvY2sgbG9jazsKKyAgICBCdWZmZXJRdWV1ZSBxdWV1ZSgyLCBsb2NrKTsKKyAgICBUZXN0VGhyZWFkIHRocmVhZChsb2NrLCBxdWV1ZSk7CisKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuc3RhcnQoKSk7CisgICAgQVNTRVJUX1RSVUUodGhyZWFkLnN0YXJ0UHVzaChCdWZmZXIoIkhlbGxvIFdvcmxkIikpKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCB0aHJlYWQuZW5kUHVzaCgpKTsKKworICAgIGxvY2subG9jaygpOworICAgIEJ1ZmZlciBidWZmZXI7CisgICAgRVhQRUNUX0VRKElvUmVzdWx0OjpPaywgcXVldWUucG9wTG9ja2VkKCZidWZmZXIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkIiwgYnVmZmVyLmRhdGEoKSk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIHRocmVhZC5zdG9wKCk7Cit9CisKK1RFU1QoQnVmZmVyUXVldWUsIHBvcExvY2tlZFdpdGhDbG9zZWRRdWV1ZSkgeworICAgIExvY2sgbG9jazsKKyAgICBCdWZmZXJRdWV1ZSBxdWV1ZSgyLCBsb2NrKTsKKyAgICBUZXN0VGhyZWFkIHRocmVhZChsb2NrLCBxdWV1ZSk7CisKKyAgICBBU1NFUlRfVFJVRSh0aHJlYWQuc3RhcnQoKSk7CisgICAgQVNTRVJUX1RSVUUodGhyZWFkLnN0YXJ0UHVzaChCdWZmZXIoIkhlbGxvIFdvcmxkIikpKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6Ok9rLCB0aHJlYWQuZW5kUHVzaCgpKTsKKworICAgIC8vIENsb3NpbmcgdGhlIHF1ZXVlIHNoYWxsIG5vdCBwcmV2ZW50IHB1bGxpbmcgaXRlbXMgZnJvbSBpdC4KKyAgICAvLyBBZnRlciB0aGF0LCBJb1Jlc3VsdDo6RXJyb3Igc2hhbGwgYmUgcmV0dXJuZWQuCisgICAgdGhyZWFkLmRvQ2xvc2UoKTsKKworICAgIEFTU0VSVF9UUlVFKHRocmVhZC5zdGFydFB1c2goQnVmZmVyKCJGb28gQmFyIikpKTsKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6OkVycm9yLCB0aHJlYWQuZW5kUHVzaCgpKTsKKworICAgIGxvY2subG9jaygpOworICAgIEJ1ZmZlciBidWZmZXI7CisgICAgRVhQRUNUX0VRKElvUmVzdWx0OjpPaywgcXVldWUucG9wTG9ja2VkKCZidWZmZXIpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIkhlbGxvIFdvcmxkIiwgYnVmZmVyLmRhdGEoKSk7CisKKyAgICBFWFBFQ1RfRVEoSW9SZXN1bHQ6OkVycm9yLCBxdWV1ZS5wb3BMb2NrZWQoJmJ1ZmZlcikpOworICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8gV29ybGQiLCBidWZmZXIuZGF0YSgpKTsKKyAgICBsb2NrLnVubG9jaygpOworCisgICAgdGhyZWFkLnN0b3AoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9DaGFubmVsU3RyZWFtLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0NoYW5uZWxTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDAyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9DaGFubmVsU3RyZWFtLmNwcApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjaW5jbHVkZSAiQ2hhbm5lbFN0cmVhbS5oIgorCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlckNoYW5uZWwuaCIKKworI2RlZmluZSBFTVVHTF9ERUJVR19MRVZFTCAgMAorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK3VzaW5nIElvUmVzdWx0ID0gUmVuZGVyQ2hhbm5lbDo6SW9SZXN1bHQ7CisKK0NoYW5uZWxTdHJlYW06OkNoYW5uZWxTdHJlYW0oc3RkOjpzaGFyZWRfcHRyPFJlbmRlckNoYW5uZWxJbXBsPiBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmU2l6ZSkKKyAgICA6IElPU3RyZWFtKGJ1ZlNpemUpLCBtQ2hhbm5lbChjaGFubmVsKSB7CisgICAgbVdyaXRlQnVmZmVyLnJlc2l6ZV9ub2luaXQoYnVmU2l6ZSk7Cit9CisKK3ZvaWQqIENoYW5uZWxTdHJlYW06OmFsbG9jQnVmZmVyKHNpemVfdCBtaW5TaXplKSB7CisgICAgaWYgKG1Xcml0ZUJ1ZmZlci5zaXplKCkgPCBtaW5TaXplKSB7CisgICAgICAgIG1Xcml0ZUJ1ZmZlci5yZXNpemVfbm9pbml0KG1pblNpemUpOworICAgIH0KKyAgICByZXR1cm4gbVdyaXRlQnVmZmVyLmRhdGEoKTsKK30KKworaW50IENoYW5uZWxTdHJlYW06OmNvbW1pdEJ1ZmZlcihzaXplX3Qgc2l6ZSkgeworICAgIGFzc2VydChzaXplIDw9IG1Xcml0ZUJ1ZmZlci5zaXplKCkpOworICAgIGlmIChtV3JpdGVCdWZmZXIuaXNBbGxvY2F0ZWQoKSkgeworICAgICAgICBtV3JpdGVCdWZmZXIucmVzaXplKHNpemUpOworICAgICAgICBtQ2hhbm5lbC0+d3JpdGVUb0d1ZXN0KHN0ZDo6bW92ZShtV3JpdGVCdWZmZXIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ2hhbm5lbC0+d3JpdGVUb0d1ZXN0KAorICAgICAgICAgICAgICAgIFJlbmRlckNoYW5uZWw6OkJ1ZmZlcihtV3JpdGVCdWZmZXIuZGF0YSgpLCBtV3JpdGVCdWZmZXIuZGF0YSgpICsgc2l6ZSkpOworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworY29uc3QgdW5zaWduZWQgY2hhciogQ2hhbm5lbFN0cmVhbTo6cmVhZFJhdyh2b2lkKiBidWYsIHNpemVfdCogaW5vdXRfbGVuKSB7CisgICAgc2l6ZV90IHdhbnRlZCA9ICppbm91dF9sZW47CisgICAgc2l6ZV90IGNvdW50ID0gMFU7CisgICAgYXV0byBkc3QgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmKTsKKyAgICBEKCJ3YW50ZWQgJWQgYnl0ZXMiLCAoaW50KXdhbnRlZCk7CisgICAgd2hpbGUgKGNvdW50IDwgd2FudGVkKSB7CisgICAgICAgIGlmIChtUmVhZEJ1ZmZlckxlZnQgPiAwKSB7CisgICAgICAgICAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbjxzaXplX3Q+KHdhbnRlZCAtIGNvdW50LCBtUmVhZEJ1ZmZlckxlZnQpOworICAgICAgICAgICAgbWVtY3B5KGRzdCArIGNvdW50LAorICAgICAgICAgICAgICAgICAgIG1SZWFkQnVmZmVyLmRhdGEoKSArIChtUmVhZEJ1ZmZlci5zaXplKCkgLSBtUmVhZEJ1ZmZlckxlZnQpLAorICAgICAgICAgICAgICAgICAgIGF2YWlsKTsKKyAgICAgICAgICAgIGNvdW50ICs9IGF2YWlsOworICAgICAgICAgICAgbVJlYWRCdWZmZXJMZWZ0IC09IGF2YWlsOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBibG9ja2luZyA9IChjb3VudCA9PSAwKTsKKyAgICAgICAgYXV0byByZXN1bHQgPSBtQ2hhbm5lbC0+cmVhZEZyb21HdWVzdCgmbVJlYWRCdWZmZXIsIGJsb2NraW5nKTsKKyAgICAgICAgRCgicmVhZEZyb21HdWVzdCgpIHJldHVybmVkICVkLCBzaXplICVkIiwgKGludClyZXN1bHQsIChpbnQpbVJlYWRCdWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBJb1Jlc3VsdDo6T2spIHsKKyAgICAgICAgICAgIG1SZWFkQnVmZmVyTGVmdCA9IG1SZWFkQnVmZmVyLnNpemUoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCA+IDApIHsgIC8vIFRoZXJlIGlzIHNvbWUgZGF0YSB0byByZXR1cm4uCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBSZXN1bHQgY2FuIG9ubHkgYmUgSW9SZXN1bHQ6OkVycm9yIGlmIHxjb3VudCA9PSAwfCBzaW5jZSB8YmxvY2tpbmd8CisgICAgICAgIC8vIHdhcyB0cnVlLCBpdCBjYW5ub3QgYmUgSW9SZXN1bHQ6OlRyeUFnYWluLgorICAgICAgICBhc3NlcnQocmVzdWx0ID09IElvUmVzdWx0OjpFcnJvcik7CisgICAgICAgIEQoImVycm9yIHdoaWxlIHRyeWluZyB0byByZWFkIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICAqaW5vdXRfbGVuID0gY291bnQ7CisgICAgRCgicmVhZCAlZCBieXRlcyIsIChpbnQpY291bnQpOworICAgIHJldHVybiAoY29uc3QgdW5zaWduZWQgY2hhciopYnVmOworfQorCit2b2lkIENoYW5uZWxTdHJlYW06OmZvcmNlU3RvcCgpIHsKKyAgICBtQ2hhbm5lbC0+c3RvcEZyb21Ib3N0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvQ2hhbm5lbFN0cmVhbS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvQ2hhbm5lbFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjJmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9DaGFubmVsU3RyZWFtLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvSU9TdHJlYW0uaCIKKyNpbmNsdWRlICJSZW5kZXJDaGFubmVsSW1wbC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgZW11Z2wgeworCisvLyBBbiBJT1N0cmVhbSBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBob3N0IFJlbmRlclRocmVhZCB0bworLy8gd3JhcCBhIFJlbmRlckNoYW5uZWxJbXBsIGNoYW5uZWwuCitjbGFzcyBDaGFubmVsU3RyZWFtIGZpbmFsIDogcHVibGljIElPU3RyZWFtIHsKK3B1YmxpYzoKKyAgICBDaGFubmVsU3RyZWFtKHN0ZDo6c2hhcmVkX3B0cjxSZW5kZXJDaGFubmVsSW1wbD4gY2hhbm5lbCwgc2l6ZV90IGJ1ZlNpemUpOworCisgICAgdm9pZCBmb3JjZVN0b3AoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCogYWxsb2NCdWZmZXIoc2l6ZV90IG1pblNpemUpIG92ZXJyaWRlIGZpbmFsOworICAgIHZpcnR1YWwgaW50IGNvbW1pdEJ1ZmZlcihzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgZmluYWw7CisgICAgdmlydHVhbCBjb25zdCB1bnNpZ25lZCBjaGFyKiByZWFkUmF3KHZvaWQqIGJ1Ziwgc2l6ZV90KiBpbm91dF9sZW4pCisgICAgICAgICAgICBvdmVycmlkZSBmaW5hbDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVuZGVyQ2hhbm5lbEltcGw+IG1DaGFubmVsOworICAgIFJlbmRlckNoYW5uZWw6OkJ1ZmZlciBtV3JpdGVCdWZmZXI7CisgICAgUmVuZGVyQ2hhbm5lbDo6QnVmZmVyIG1SZWFkQnVmZmVyOworICAgIHNpemVfdCBtUmVhZEJ1ZmZlckxlZnQgPSAwOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9Db2xvckJ1ZmZlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9Db2xvckJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODMwZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0NvbG9yQnVmZmVyLmNwcApAQCAtMCwwICsxLDM3MSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJDb2xvckJ1ZmZlci5oIgorCisjaW5jbHVkZSAiRGlzcGF0Y2hUYWJsZXMuaCIKKyNpbmNsdWRlICJHTGNvbW1vbi9HTHV0aWxzLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhyZWFkSW5mby5oIgorI2luY2x1ZGUgIlRleHR1cmVEcmF3LmgiCisjaW5jbHVkZSAiVGV4dHVyZVJlc2l6ZS5oIgorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIHsKKworLy8gTGF6aWx5IGNyZWF0ZSBhbmQgYmluZCBhIGZyYW1lYnVmZmVyIG9iamVjdCB0byB0aGUgY3VycmVudCBob3N0IGNvbnRleHQuCisvLyB8ZmJvfCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWVidWZmZXIgb2JqZWN0IG5hbWUuCisvLyB8dGV4fCBpcyB0aGUgbmFtZSBvZiBhIHRleHR1cmUgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgZnJhbWVidWZmZXIgb2JqZWN0CisvLyBvbiBjcmVhdGlvbiBvbmx5LiBJLmUuIGFsbCByZW5kZXJpbmcgb3BlcmF0aW9ucyB3aWxsIHRhcmdldCBpdC4KKy8vIHJldHVybnMgdHJ1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuCitib29sIGJpbmRGYm8oR0x1aW50KiBmYm8sIEdMdWludCB0ZXgpIHsKKyAgICBpZiAoKmZibykgeworICAgICAgICAvLyBmYm8gYWxyZWFkeSBleGlzdCAtIGp1c3QgYmluZAorICAgICAgICBzX2dsZXMyLmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAqZmJvKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc19nbGVzMi5nbEdlbkZyYW1lYnVmZmVycygxLCBmYm8pOworICAgIHNfZ2xlczIuZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsICpmYm8pOworICAgIHNfZ2xlczIuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCB0ZXgsIDApOworICAgIEdMZW51bSBzdGF0dXMgPSBzX2dsZXMyLmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTF9GUkFNRUJVRkZFUik7CisgICAgaWYgKHN0YXR1cyAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMpIHsKKyAgICAgICAgRVJSKCJDb2xvckJ1ZmZlcjo6YmluZEZibzogRkJPIG5vdCBjb21wbGV0ZTogJSN4XG4iLCBzdGF0dXMpOworICAgICAgICBzX2dsZXMyLmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKKyAgICAgICAgc19nbGVzMi5nbERlbGV0ZUZyYW1lYnVmZmVycygxLCBmYm8pOworICAgICAgICAqZmJvID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCB1bmJpbmRGYm8oKSB7CisgICAgc19nbGVzMi5nbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Cit9CisKKy8vIEhlbHBlciBjbGFzcyB0byB1c2UgYSBDb2xvckJ1ZmZlcjo6SGVscGVyIGNvbnRleHQuCisvLyBVc2FnZSBpcyBwcmV0dHkgc2ltcGxlOgorLy8KKy8vICAgICB7CisvLyAgICAgICAgU2NvcGVkSGVscGVyQ29udGV4dCBjb250ZXh0KG1faGVscGVyKTsKKy8vICAgICAgICBpZiAoIWNvbnRleHQuaXNPaygpKSB7CisvLyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorLy8gICAgICAgIH0KKy8vICAgICAgICAuLi4uIGRvIHNvbWV0aGluZyAuLi4uCisvLyAgICAgfSAgIC8vIGF1dG9tYXRpY2FsbHkgY2FsbHMgbV9oZWxwZXItPnRlYXJkb3duQ29udGV4dCgpOworLy8KK2NsYXNzIFNjb3BlZEhlbHBlckNvbnRleHQgeworcHVibGljOgorICAgIFNjb3BlZEhlbHBlckNvbnRleHQoQ29sb3JCdWZmZXI6OkhlbHBlciogaGVscGVyKSA6IG1IZWxwZXIoaGVscGVyKSB7CisgICAgICAgIGlmICghaGVscGVyLT5zZXR1cENvbnRleHQoKSkgeworICAgICAgICAgICAgbUhlbHBlciA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzT2soKSBjb25zdCB7IHJldHVybiBtSGVscGVyICE9IE5VTEw7IH0KKworICAgIH5TY29wZWRIZWxwZXJDb250ZXh0KCkgeworICAgICAgICByZWxlYXNlKCk7CisgICAgfQorCisgICAgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBpZiAobUhlbHBlcikgeworICAgICAgICAgICAgbUhlbHBlci0+dGVhcmRvd25Db250ZXh0KCk7CisgICAgICAgICAgICBtSGVscGVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK3ByaXZhdGU6CisgICAgQ29sb3JCdWZmZXI6OkhlbHBlciogbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0NvbG9yQnVmZmVyKiBDb2xvckJ1ZmZlcjo6Y3JlYXRlKEVHTERpc3BsYXkgcF9kaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcF9pbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2VnbGltYWdlX3RleHR1cmVfMmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWxwZXIqIGhlbHBlcikgeworICAgIEdMZW51bSB0ZXhJbnRlcm5hbEZvcm1hdCA9IDA7CisKKyAgICBzd2l0Y2ggKHBfaW50ZXJuYWxGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBHTF9SR0I6CisgICAgICAgIGNhc2UgR0xfUkdCNTY1X09FUzoKKyAgICAgICAgICAgIHRleEludGVybmFsRm9ybWF0ID0gR0xfUkdCOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBHTF9SR0JBOgorICAgICAgICBjYXNlIEdMX1JHQjVfQTFfT0VTOgorICAgICAgICBjYXNlIEdMX1JHQkE0X09FUzoKKyAgICAgICAgICAgIHRleEludGVybmFsRm9ybWF0ID0gR0xfUkdCQTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIFNjb3BlZEhlbHBlckNvbnRleHQgY29udGV4dChoZWxwZXIpOworICAgIGlmICghY29udGV4dC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ29sb3JCdWZmZXIgKmNiID0gbmV3IENvbG9yQnVmZmVyKHBfZGlzcGxheSwgaGVscGVyKTsKKworICAgIHNfZ2xlczIuZ2xHZW5UZXh0dXJlcygxLCAmY2ItPm1fdGV4KTsKKyAgICBzX2dsZXMyLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgY2ItPm1fdGV4KTsKKworICAgIGludCBuQ29tcCA9ICh0ZXhJbnRlcm5hbEZvcm1hdCA9PSBHTF9SR0IgPyAzIDogNCk7CisKKyAgICB1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBuQ29tcCAqIHBfd2lkdGggKiBwX2hlaWdodDsKKyAgICBjaGFyKiBpbml0aWFsSW1hZ2UgPSBzdGF0aWNfY2FzdDxjaGFyKj4oOjptYWxsb2MoYnVmc2l6ZSkpOworICAgIG1lbXNldChpbml0aWFsSW1hZ2UsIDB4ZmYsIGJ1ZnNpemUpOworCisgICAgc19nbGVzMi5nbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRleEludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhJbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHTF9VTlNJR05FRF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxJbWFnZSk7CisgICAgOjpmcmVlKGluaXRpYWxJbWFnZSk7CisKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICAvLworICAgIC8vIGNyZWF0ZSBhbm90aGVyIHRleHR1cmUgZm9yIHRoYXQgY29sb3JidWZmZXIgZm9yIGJsaXQKKyAgICAvLworICAgIHNfZ2xlczIuZ2xHZW5UZXh0dXJlcygxLCAmY2ItPm1fYmxpdFRleCk7CisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGNiLT5tX2JsaXRUZXgpOworICAgIHNfZ2xlczIuZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhJbnRlcm5hbEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGV4SW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgY2ItPm1fd2lkdGggPSBwX3dpZHRoOworICAgIGNiLT5tX2hlaWdodCA9IHBfaGVpZ2h0OworICAgIGNiLT5tX2ludGVybmFsRm9ybWF0ID0gdGV4SW50ZXJuYWxGb3JtYXQ7CisKKyAgICBpZiAoaGFzX2VnbGltYWdlX3RleHR1cmVfMmQpIHsKKyAgICAgICAgY2ItPm1fZWdsSW1hZ2UgPSBzX2VnbC5lZ2xDcmVhdGVJbWFnZUtIUigKKyAgICAgICAgICAgICAgICBwX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICBFR0xfR0xfVEVYVFVSRV8yRF9LSFIsCisgICAgICAgICAgICAgICAgKEVHTENsaWVudEJ1ZmZlcilTYWZlUG9pbnRlckZyb21VSW50KGNiLT5tX3RleCksCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgY2ItPm1fYmxpdEVHTEltYWdlID0gc19lZ2wuZWdsQ3JlYXRlSW1hZ2VLSFIoCisgICAgICAgICAgICAgICAgcF9kaXNwbGF5LAorICAgICAgICAgICAgICAgIHNfZWdsLmVnbEdldEN1cnJlbnRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgRUdMX0dMX1RFWFRVUkVfMkRfS0hSLAorICAgICAgICAgICAgICAgIChFR0xDbGllbnRCdWZmZXIpU2FmZVBvaW50ZXJGcm9tVUludChjYi0+bV9ibGl0VGV4KSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICBjYi0+bV9yZXNpemVyID0gbmV3IFRleHR1cmVSZXNpemUocF93aWR0aCwgcF9oZWlnaHQpOworCisgICAgc19nbGVzMi5nbEZpbmlzaCgpOworICAgIHJldHVybiBjYjsKK30KKworQ29sb3JCdWZmZXI6OkNvbG9yQnVmZmVyKEVHTERpc3BsYXkgZGlzcGxheSwgSGVscGVyKiBoZWxwZXIpIDoKKyAgICAgICAgbV9kaXNwbGF5KGRpc3BsYXkpLAorICAgICAgICBtX2hlbHBlcihoZWxwZXIpIHt9CisKK0NvbG9yQnVmZmVyOjp+Q29sb3JCdWZmZXIoKSB7CisgICAgU2NvcGVkSGVscGVyQ29udGV4dCBjb250ZXh0KG1faGVscGVyKTsKKworICAgIGlmIChtX2JsaXRFR0xJbWFnZSkgeworICAgICAgICBzX2VnbC5lZ2xEZXN0cm95SW1hZ2VLSFIobV9kaXNwbGF5LCBtX2JsaXRFR0xJbWFnZSk7CisgICAgfQorICAgIGlmIChtX2VnbEltYWdlKSB7CisgICAgICAgIHNfZWdsLmVnbERlc3Ryb3lJbWFnZUtIUihtX2Rpc3BsYXksIG1fZWdsSW1hZ2UpOworICAgIH0KKworICAgIGlmIChtX2ZibykgeworICAgICAgICBzX2dsZXMyLmdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtX2Zibyk7CisgICAgfQorCisgICAgR0x1aW50IHRleFsyXSA9IHttX3RleCwgbV9ibGl0VGV4fTsKKyAgICBzX2dsZXMyLmdsRGVsZXRlVGV4dHVyZXMoMiwgdGV4KTsKKworICAgIGRlbGV0ZSBtX3Jlc2l6ZXI7Cit9CisKK3ZvaWQgQ29sb3JCdWZmZXI6OnJlYWRQaXhlbHMoaW50IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGl4ZWxzKSB7CisgICAgU2NvcGVkSGVscGVyQ29udGV4dCBjb250ZXh0KG1faGVscGVyKTsKKyAgICBpZiAoIWNvbnRleHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYmluZEZibygmbV9mYm8sIG1fdGV4KSkgeworICAgICAgICBzX2dsZXMyLmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwX2Zvcm1hdCwgcF90eXBlLCBwaXhlbHMpOworICAgICAgICB1bmJpbmRGYm8oKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29sb3JCdWZmZXI6OnN1YlVwZGF0ZShpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwaXhlbHMpIHsKKyAgICBTY29wZWRIZWxwZXJDb250ZXh0IGNvbnRleHQobV9oZWxwZXIpOworICAgIGlmICghY29udGV4dC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleCk7CisgICAgc19nbGVzMi5nbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19BTElHTk1FTlQsIDEpOworICAgIHNfZ2xlczIuZ2xUZXhTdWJJbWFnZTJEKAorICAgICAgICAgICAgR0xfVEVYVFVSRV8yRCwgMCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcF9mb3JtYXQsIHBfdHlwZSwgcGl4ZWxzKTsKK30KKworYm9vbCBDb2xvckJ1ZmZlcjo6YmxpdEZyb21DdXJyZW50UmVhZEJ1ZmZlcigpCit7CisgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICBpZiAoIXRJbmZvLT5jdXJyQ29udGV4dC5nZXQoKSkgeworICAgICAgICAvLyBubyBDdXJyZW50IGNvbnRleHQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgcmVhZCBzdXJmYWNlIGludG8gbV9ibGl0RUdMSW1hZ2UuCisgICAgLy8gVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgdGVtcG9yYXJ5IHRleHR1cmUsIGJpbmQgaXQgdG8gdGhlIEVHTEltYWdlCisgICAgLy8gdGhlbiBjYWxsIGdsQ29weVRleFN1YkltYWdlMkQoKS4KKyAgICBHTHVpbnQgdG1wVGV4OworICAgIEdMaW50IGN1cnJUZXhCaW5kOworICAgIGlmICh0SW5mby0+Y3VyckNvbnRleHQtPmlzR0wyKCkpIHsKKyAgICAgICAgc19nbGVzMi5nbEdldEludGVnZXJ2KEdMX1RFWFRVUkVfQklORElOR18yRCwgJmN1cnJUZXhCaW5kKTsKKyAgICAgICAgc19nbGVzMi5nbEdlblRleHR1cmVzKDEsJnRtcFRleCk7CisgICAgICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0bXBUZXgpOworICAgICAgICBzX2dsZXMyLmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoR0xfVEVYVFVSRV8yRCwgbV9ibGl0RUdMSW1hZ2UpOworICAgICAgICBzX2dsZXMyLmdsQ29weVRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLCBtX2hlaWdodCk7CisgICAgICAgIHNfZ2xlczIuZ2xEZWxldGVUZXh0dXJlcygxLCAmdG1wVGV4KTsKKyAgICAgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGN1cnJUZXhCaW5kKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNfZ2xlczEuZ2xHZXRJbnRlZ2VydihHTF9URVhUVVJFX0JJTkRJTkdfMkQsICZjdXJyVGV4QmluZCk7CisgICAgICAgIHNfZ2xlczEuZ2xHZW5UZXh0dXJlcygxLCZ0bXBUZXgpOworICAgICAgICBzX2dsZXMxLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdG1wVGV4KTsKKyAgICAgICAgc19nbGVzMS5nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMX1RFWFRVUkVfMkQsIG1fYmxpdEVHTEltYWdlKTsKKyAgICAgICAgc19nbGVzMS5nbENvcHlUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLCBtX2hlaWdodCk7CisgICAgICAgIHNfZ2xlczEuZ2xEZWxldGVUZXh0dXJlcygxLCAmdG1wVGV4KTsKKyAgICAgICAgc19nbGVzMS5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGN1cnJUZXhCaW5kKTsKKyAgICB9CisKKyAgICBTY29wZWRIZWxwZXJDb250ZXh0IGNvbnRleHQobV9oZWxwZXIpOworICAgIGlmICghY29udGV4dC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghYmluZEZibygmbV9mYm8sIG1fdGV4KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2F2ZSBjdXJyZW50IHZpZXdwb3J0IGFuZCBtYXRjaCBpdCB0byB0aGUgY3VycmVudCBjb2xvcmJ1ZmZlciBzaXplLgorICAgIEdMaW50IHZwb3J0WzRdID0geyAwLCB9OworICAgIHNfZ2xlczIuZ2xHZXRJbnRlZ2VydihHTF9WSUVXUE9SVCwgdnBvcnQpOworICAgIHNfZ2xlczIuZ2xWaWV3cG9ydCgwLCAwLCBtX3dpZHRoLCBtX2hlaWdodCk7CisKKyAgICAvLyByZW5kZXIgbV9ibGl0VGV4CisgICAgbV9oZWxwZXItPmdldFRleHR1cmVEcmF3KCktPmRyYXcobV9ibGl0VGV4LCAwLiwgMCwgMCk7CisKKyAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHZpZXdwb3J0LgorICAgIHNfZ2xlczIuZ2xWaWV3cG9ydCh2cG9ydFswXSwgdnBvcnRbMV0sIHZwb3J0WzJdLCB2cG9ydFszXSk7CisgICAgdW5iaW5kRmJvKCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb2xvckJ1ZmZlcjo6YmluZFRvVGV4dHVyZSgpIHsKKyAgICBpZiAoIW1fZWdsSW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBSZW5kZXJUaHJlYWRJbmZvICp0SW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgIGlmICghdEluZm8tPmN1cnJDb250ZXh0LmdldCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHRJbmZvLT5jdXJyQ29udGV4dC0+aXNHTDIoKSkgeworICAgICAgICBzX2dsZXMyLmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoR0xfVEVYVFVSRV8yRCwgbV9lZ2xJbWFnZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzX2dsZXMxLmdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoR0xfVEVYVFVSRV8yRCwgbV9lZ2xJbWFnZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbG9yQnVmZmVyOjpiaW5kVG9SZW5kZXJidWZmZXIoKSB7CisgICAgaWYgKCFtX2VnbEltYWdlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICBpZiAoIXRJbmZvLT5jdXJyQ29udGV4dC5nZXQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh0SW5mby0+Y3VyckNvbnRleHQtPmlzR0wyKCkpIHsKKyAgICAgICAgc19nbGVzMi5nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTF9SRU5ERVJCVUZGRVJfT0VTLCBtX2VnbEltYWdlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNfZ2xlczEuZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoR0xfUkVOREVSQlVGRkVSX09FUywgbV9lZ2xJbWFnZSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIENvbG9yQnVmZmVyOjpwb3N0KGZsb2F0IHJvdGF0aW9uLCBmbG9hdCBkeCwgZmxvYXQgZHkpIHsKKyAgICAvLyBOT1RFOiBEbyBub3QgY2FsbCBtX2hlbHBlci0+c2V0dXBDb250ZXh0KCkgaGVyZSEKKyAgICByZXR1cm4gbV9oZWxwZXItPmdldFRleHR1cmVEcmF3KCktPmRyYXcobV9yZXNpemVyLT51cGRhdGUobV90ZXgpLCByb3RhdGlvbiwgZHgsIGR5KTsKK30KKwordm9pZCBDb2xvckJ1ZmZlcjo6cmVhZGJhY2sodW5zaWduZWQgY2hhciogaW1nKSB7CisgICAgU2NvcGVkSGVscGVyQ29udGV4dCBjb250ZXh0KG1faGVscGVyKTsKKyAgICBpZiAoIWNvbnRleHQuaXNPaygpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGJpbmRGYm8oJm1fZmJvLCBtX3RleCkpIHsKKyAgICAgICAgc19nbGVzMi5nbFJlYWRQaXhlbHMoCisgICAgICAgICAgICAgICAgMCwgMCwgbV93aWR0aCwgbV9oZWlnaHQsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIGltZyk7CisgICAgICAgIHVuYmluZEZibygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0NvbG9yQnVmZmVyLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9Db2xvckJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTRmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9Db2xvckJ1ZmZlci5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfTElCUkVOREVSX0NPTE9SQlVGRkVSX0gKKyNkZWZpbmUgX0xJQlJFTkRFUl9DT0xPUkJVRkZFUl9ICisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc21hcnRfcHRyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKworY2xhc3MgVGV4dHVyZURyYXc7CitjbGFzcyBUZXh0dXJlUmVzaXplOworCisvLyBBIGNsYXNzIHVzZWQgdG8gbW9kZWwgYSBndWVzdCBjb2xvciBidWZmZXIsIGFuZCB1c2VkIHRvIGltcGxlbWVudCBzZXZlcmFsCisvLyByZWxhdGVkIHRoaW5nczoKKy8vCisvLyAgLSBFdmVyeSBncmFsbG9jIG5hdGl2ZSBidWZmZXIgd2l0aCBIVyByZWFkIG9yIHdyaXRlIHJlcXVpcmVtZW50cyB3aWxsCisvLyAgICBhbGxvY2F0ZSBhIGhvc3QgQ29sb3JCdWZmZXIgaW5zdGFuY2UuIFdoZW4gZ3JhbGxvY19sb2NrKCkgaXMgY2FsbGVkLAorLy8gICAgdGhlIGd1ZXN0IHdpbGwgdXNlIENvbG9yQnVmZmVyOjpyZWFkUGl4ZWxzKCkgdG8gcmVhZCB0aGUgY3VycmVudCBjb250ZW50CisvLyAgICBvZiB0aGUgYnVmZmVyLiBXaGVuIGdyYWxsb2NfdW5sb2NrKCkgaXMgbGF0ZXIgY2FsbGVkLCBpdCB3aWxsIGNhbGwKKy8vICAgIENvbG9yQnVmZmVyOjpzdWJVcGRhdGUoKSB0byBzZW5kIHRoZSB1cGRhdGVkIHBpeGVscy4KKy8vCisvLyAgLSBFdmVyeSBndWVzdCB3aW5kb3cgRUdMU3VyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhIGhvc3QgUEJ1ZmZlcgorLy8gICAgKHNlZSBXaW5kb3dTdXJmYWNlLmgpIHRoYXQgY2FuIGhhdmUgYSBDb2xvckJ1ZmZlciBpbnN0YW5jZSBhdHRhY2hlZCB0bworLy8gICAgaXQgKHRocm91Z2ggV2luZG93U3VyZmFjZTo6YXR0YWNoQ29sb3JCdWZmZXIoKSkuIFdoZW4gc3VjaCBhbiBhdHRhY2htZW50CisvLyAgICBleGlzdHMsIFdpbmRvd1N1cmZhY2U6OmZsdXNoQ29sb3JCdWZmZXIoKSB3aWxsIGNvcHkgdGhlIFBCdWZmZXIncworLy8gICAgcGl4ZWwgZGF0YSBpbnRvIHRoZSBDb2xvckJ1ZmZlci4gVGhlIGxhdHRlciBjYW4gdGhlbiBiZSBkaXNwbGF5ZWQKKy8vICAgIGluIHRoZSBjbGllbnQncyBVSSBzdWItd2luZG93IHdpdGggQ29sb3JCdWZmZXI6OnBvc3QoKS4KKy8vCisvLyAgLSBHdWVzdCBFR0xJbWFnZXMgYXJlIGltcGxlbWVudGVkIGFzIG5hdGl2ZSBncmFsbG9jIGJ1ZmZlcnMgdG9vLgorLy8gICAgVGhlIGd1ZXN0IGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoKSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBlbmQgdXAKKy8vICAgIGNhbGxpbmcgQ29sb3JCdWZmZXI6OmJpbmRUb1RleHR1cmUoKSB0byBiaW5kIHRoZSBjdXJyZW50IGNvbnRleHQncworLy8gICAgR0xfVEVYVFVSRV8yRCB0byB0aGUgYnVmZmVyLiBTaW1pbGFybHksIHRoZSBndWVzdCB2ZXJzaW9ucyBvZgorLy8gICAgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoKSB3aWxsIGVuZCB1cCBjYWxsaW5nCisvLyAgICBDb2xvckJ1ZmZlcjo6YmluZFRvUmVuZGVyYnVmZmVyKCkuCisvLworLy8gVGhpcyBmb3JjZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHVzZSBhIGhvc3QgRUdMSW1hZ2UgdG8gaW1wbGVtZW50IGVhY2gKKy8vIENvbG9yQnVmZmVyLgorLy8KKy8vIEFzIGFuIGFkZGl0aW9uYWwgdHdpc3QuCisKK2NsYXNzIENvbG9yQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvLyBIZWxwZXIgaW50ZXJmYWNlIGNsYXNzIHVzZWQgZHVyaW5nIENvbG9yQnVmZmVyIG9wZXJhdGlvbnMuIFRoaXMgaXMKKyAgICAvLyBpbnRyb2R1Y2VkIHRvIHJlbW92ZSBjb3VwbGluZyBmcm9tIHRoZSBGcmFtZUJ1ZmZlciBjbGFzcyBpbXBsZW1lbnRhdGlvbi4KKyAgICBjbGFzcyBIZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgSGVscGVyKCkge30KKyAgICAgICAgdmlydHVhbCB+SGVscGVyKCkge30KKyAgICAgICAgdmlydHVhbCBib29sIHNldHVwQ29udGV4dCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlYXJkb3duQ29udGV4dCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBUZXh0dXJlRHJhdyogZ2V0VGV4dHVyZURyYXcoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBDb2xvckJ1ZmZlciBpbnN0YW5jZS4KKyAgICAvLyB8cF9kaXNwbGF5fCBpcyB0aGUgaG9zdCBFR0xEaXNwbGF5IGhhbmRsZS4KKyAgICAvLyB8cF93aWR0aHwgYW5kIHxwX2hlaWdodHwgYXJlIHRoZSBidWZmZXIncyBkaW1lbnNpb25zIGluIHBpeGVscy4KKyAgICAvLyB8cF9pbnRlcm5hbEZvcm1hdHwgaXMgdGhlIGludGVybmFsIHBpeGVsIGZvcm1hdCB0byB1c2UsIHZhbGlkIHZhbHVlcworICAgIC8vIGFyZTogR0xfUkdCLCBHTF9SR0I1NjUsIEdMX1JHQkEsIEdMX1JHQjVfQTFfT0VTIGFuZCBHTF9SR0JBNF9PRVMuCisgICAgLy8gSW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byB1c2Ugc29tZXRoaW5nIGVsc2UgdGhvdWdoLgorICAgIC8vIHxoYXNfZWdsaW1hZ2VfdGV4dHVyZV8yZHwgc2hvdWxkIGJlIHRydWUgaWZmIHRoZSBkaXNwbGF5IHN1cHBvcnRzCisgICAgLy8gdGhlIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSBleHRlbnNpb24uCisgICAgLy8gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgc3RhdGljIENvbG9yQnVmZmVyKiBjcmVhdGUoRUdMRGlzcGxheSBwX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwX2ludGVybmFsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2VnbGltYWdlX3RleHR1cmVfMmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVscGVyKiBoZWxwZXIpOworCisgICAgLy8gRGVzdHJ1Y3Rvci4KKyAgICB+Q29sb3JCdWZmZXIoKTsKKworICAgIC8vIFJldHVybiBDb2xvckJ1ZmZlciB3aWR0aCBhbmQgaGVpZ2h0IGluIHBpeGVscworICAgIEdMdWludCBnZXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBHTHVpbnQgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9oZWlnaHQ7IH0KKworICAgIC8vIFJlYWQgdGhlIENvbG9yQnVmZmVyIGluc3RhbmNlJ3MgcGl4ZWwgdmFsdWVzIGludG8gaG9zdCBtZW1vcnkuCisgICAgdm9pZCByZWFkUGl4ZWxzKGludCB4LAorICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBHTGVudW0gcF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIEdMZW51bSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBpeGVscyk7CisKKyAgICAvLyBVcGRhdGUgdGhlIENvbG9yQnVmZmVyIGluc3RhbmNlJ3MgcGl4ZWwgdmFsdWVzIGZyb20gaG9zdCBtZW1vcnkuCisgICAgdm9pZCBzdWJVcGRhdGUoaW50IHgsCisgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgR0xlbnVtIHBfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIEdMZW51bSBwX3R5cGUsCisgICAgICAgICAgICAgICAgICAgdm9pZCAqcGl4ZWxzKTsKKworICAgIC8vIERyYXcgYSBDb2xvckJ1ZmZlciBpbnN0YW5jZSwgaS5lLiBibGl0IGl0IHRvIHRoZSBjdXJyZW50IGd1ZXN0CisgICAgLy8gZnJhbWVidWZmZXIgb2JqZWN0IC8gd2luZG93IHN1cmZhY2UuIFRoaXMgZG9lc24ndCBkaXNwbGF5IGFueXRoaW5nLgorICAgIGJvb2wgZHJhdygpOworCisgICAgLy8gUG9zdCB0aGlzIENvbG9yQnVmZmVyIHRvIHRoZSBob3N0IG5hdGl2ZSBzdWItd2luZG93LgorICAgIC8vIHxyb3RhdGlvbnwgaXMgdGhlIHJvdGF0aW9uIGFuZ2xlIGluIGRlZ3JlZXMsIGNsb2Nrd2lzZSBpbiB0aGUgR0wKKyAgICAvLyBjb29yZGluYXRlIHNwYWNlLgorICAgIGJvb2wgcG9zdChmbG9hdCByb3RhdGlvbiwgZmxvYXQgZHgsIGZsb2F0IGR5KTsKKworICAgIC8vIEJpbmQgdGhlIGN1cnJlbnQgY29udGV4dCdzIEVHTF9URVhUVVJFXzJEIHRleHR1cmUgdG8gdGhpcyBDb2xvckJ1ZmZlcidzCisgICAgLy8gRUdMSW1hZ2UuIFRoaXMgaXMgaW50ZW5kZWQgdG8gaW1wbGVtZW50IGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoKQorICAgIC8vIGZvciBhbGwgR0xFUyB2ZXJzaW9ucy4KKyAgICBib29sIGJpbmRUb1RleHR1cmUoKTsKKworICAgIC8vIEJpbmQgdGhlIGN1cnJlbnQgY29udGV4dCdzIEVHTF9SRU5ERVJCVUZGRVJfT0VTIHJlbmRlciBidWZmZXIgdG8gdGhpcworICAgIC8vIENvbG9yQnVmZmVyJ3MgRUdMSW1hZ2UuIFRoaXMgaXMgaW50ZW5kZWQgdG8gaW1wbGVtZW50CisgICAgLy8gZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoKSBmb3IgYWxsIEdMRVMgdmVyc2lvbnMuCisgICAgYm9vbCBiaW5kVG9SZW5kZXJidWZmZXIoKTsKKworICAgIC8vIENvcHkgdGhlIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgY29udGV4dCdzIHJlYWQgc3VyZmFjZSB0byB0aGlzCisgICAgLy8gQ29sb3JCdWZmZXIuIFRoaXMgaXMgdXNlZCBmcm9tIFdpbmRvd1N1cmZhY2U6OmZsdXNoQ29sb3JCdWZmZXIoKS4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlIChlLmcuIG5vIGN1cnJlbnQgY29udGV4dCkuCisgICAgYm9vbCBibGl0RnJvbUN1cnJlbnRSZWFkQnVmZmVyKCk7CisKKyAgICAvLyBSZWFkIHRoZSBjb250ZW50IG9mIHRoZSB3aG9sZSBDb2xvckJ1ZmZlciBhcyAzMi1iaXQgUkdCQSBwaXhlbHMuCisgICAgLy8gfGltZ3wgbXVzdCBiZSBhIGJ1ZmZlciBsYXJnZSBlbm91Z2ggKGkuZS4gd2lkdGggKiBoZWlnaHQgKiA0KS4KKyAgICB2b2lkIHJlYWRiYWNrKHVuc2lnbmVkIGNoYXIqIGltZyk7CisKK3ByaXZhdGU6CisgICAgQ29sb3JCdWZmZXIoRUdMRGlzcGxheSBkaXNwbGF5LCBIZWxwZXIqIGhlbHBlcik7CisKK3ByaXZhdGU6CisgICAgR0x1aW50IG1fdGV4ID0gMDsKKyAgICBHTHVpbnQgbV9ibGl0VGV4ID0gMDsKKyAgICBFR0xJbWFnZUtIUiBtX2VnbEltYWdlID0gbnVsbHB0cjsKKyAgICBFR0xJbWFnZUtIUiBtX2JsaXRFR0xJbWFnZSA9IG51bGxwdHI7CisgICAgR0x1aW50IG1fd2lkdGggPSAwOworICAgIEdMdWludCBtX2hlaWdodCA9IDA7CisgICAgR0x1aW50IG1fZmJvID0gMDsKKyAgICBHTGVudW0gbV9pbnRlcm5hbEZvcm1hdCA9IDA7CisgICAgRUdMRGlzcGxheSBtX2Rpc3BsYXkgPSBudWxscHRyOworICAgIEhlbHBlciogbV9oZWxwZXIgPSBudWxscHRyOworICAgIFRleHR1cmVSZXNpemUqIG1fcmVzaXplciA9IG51bGxwdHI7Cit9OworCit0eXBlZGVmIGVtdWdsOjpTbWFydFB0cjxDb2xvckJ1ZmZlcj4gQ29sb3JCdWZmZXJQdHI7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRGlzcGF0Y2hUYWJsZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0Rpc3BhdGNoVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NDI4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0Rpc3BhdGNoVGFibGVzLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MURpc3BhdGNoLmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjJEaXNwYXRjaC5oIgorCitleHRlcm4gR0xFU3YyRGlzcGF0Y2ggc19nbGVzMjsKK2V4dGVybiBHTEVTdjFEaXNwYXRjaCBzX2dsZXMxOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRmJDb25maWcuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRmJDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzA5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GYkNvbmZpZy5jcHAKQEAgLTAsMCArMSwyNzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkZiQ29uZmlnLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbWlzYy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK25hbWVzcGFjZSB7CisKKyNkZWZpbmUgRSguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisKK2NvbnN0IEdMdWludCBrQ29uZmlnQXR0cmlidXRlc1tdID0geworICAgIEVHTF9ERVBUSF9TSVpFLCAgICAgLy8gbXVzdCBiZSBmaXJzdCAtIHNlZSBnZXREZXB0aFNpemUoKQorICAgIEVHTF9TVEVOQ0lMX1NJWkUsICAgLy8gbXVzdCBiZSBzZWNvbmQgLSBzZWUgZ2V0U3RlbmNpbFNpemUoKQorICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsLy8gbXVzdCBiZSB0aGlyZCAtIHNlZSBnZXRSZW5kZXJhYmxlVHlwZSgpCisgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICAvLyBtdXN0IGJlIGZvdXJ0aCAtIHNlZSBnZXRTdXJmYWNlVHlwZSgpCisgICAgRUdMX0NPTkZJR19JRCwgICAgICAvLyBtdXN0IGJlIGZpZnRoICAtIHNlZSBjaG9vc2VDb25maWcoKQorICAgIEVHTF9CVUZGRVJfU0laRSwKKyAgICBFR0xfQUxQSEFfU0laRSwKKyAgICBFR0xfQkxVRV9TSVpFLAorICAgIEVHTF9HUkVFTl9TSVpFLAorICAgIEVHTF9SRURfU0laRSwKKyAgICBFR0xfQ09ORklHX0NBVkVBVCwKKyAgICBFR0xfTEVWRUwsCisgICAgRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwKKyAgICBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLAorICAgIEVHTF9NQVhfUEJVRkZFUl9XSURUSCwKKyAgICBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsCisgICAgRUdMX05BVElWRV9WSVNVQUxfSUQsCisgICAgRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKKyAgICBFR0xfU0FNUExFUywKKyAgICBFR0xfU0FNUExFX0JVRkZFUlMsCisgICAgRUdMX1RSQU5TUEFSRU5UX1RZUEUsCisgICAgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCisgICAgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFLAorICAgIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCisgICAgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCisgICAgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAorICAgIEVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKKyAgICBFR0xfTUFYX1NXQVBfSU5URVJWQUwsCisgICAgRUdMX0xVTUlOQU5DRV9TSVpFLAorICAgIEVHTF9BTFBIQV9NQVNLX1NJWkUsCisgICAgRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAorICAgIC8vRUdMX01BVENIX05BVElWRV9QSVhNQVAsCisgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCwKKyAgICBFR0xfQ09ORk9STUFOVAorfTsKKworY29uc3Qgc2l6ZV90IGtDb25maWdBdHRyaWJ1dGVzTGVuID0KKyAgICAgICAgc2l6ZW9mKGtDb25maWdBdHRyaWJ1dGVzKSAvIHNpemVvZihrQ29uZmlnQXR0cmlidXRlc1swXSk7CisKK2Jvb2wgaXNDb21wYXRpYmxlSG9zdENvbmZpZyhFR0xDb25maWcgY29uZmlnLCBFR0xEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAvLyBGaWx0ZXIgb3V0IGNvbmZpZ3Mgd2hpY2ggZG8gbm90IHN1cHBvcnQgcGJ1ZmZlcnMsIHNpbmNlIHRoZXkKKyAgICAvLyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgd2luZG93IHN1cmZhY2VzLgorICAgIEVHTGludCBzdXJmYWNlVHlwZTsKKyAgICBzX2VnbC5lZ2xHZXRDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkaXNwbGF5LCBjb25maWcsIEVHTF9TVVJGQUNFX1RZUEUsICZzdXJmYWNlVHlwZSk7CisgICAgaWYgKCEoc3VyZmFjZVR5cGUgJiBFR0xfUEJVRkZFUl9CSVQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGaWx0ZXIgb3V0IGNvbmZpZ3MgdGhhdCBkbyBub3Qgc3VwcG9ydCBSR0IgcGl4ZWwgdmFsdWVzLgorICAgIEVHTGludCByZWRTaXplID0gMCwgZ3JlZW5TaXplID0gMCwgYmx1ZVNpemUgPSAwOworICAgIHNfZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKKyAgICAgICAgICAgIGRpc3BsYXksIGNvbmZpZyxFR0xfUkVEX1NJWkUsICZyZWRTaXplKTsKKyAgICBzX2VnbC5lZ2xHZXRDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkaXNwbGF5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmZ3JlZW5TaXplKTsKKyAgICBzX2VnbC5lZ2xHZXRDb25maWdBdHRyaWIoCisgICAgICAgICAgICBkaXNwbGF5LCBjb25maWcsIEVHTF9CTFVFX1NJWkUsICZibHVlU2l6ZSk7CisgICAgaWYgKCFyZWRTaXplIHx8ICFncmVlblNpemUgfHwgIWJsdWVTaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0ZiQ29uZmlnOjp+RmJDb25maWcoKSB7CisgICAgZGVsZXRlIFtdIG1BdHRyaWJWYWx1ZXM7Cit9CisKK0ZiQ29uZmlnOjpGYkNvbmZpZyhFR0xDb25maWcgaG9zdENvbmZpZywgRUdMRGlzcGxheSBob3N0RGlzcGxheSkgOgorICAgICAgICBtRWdsQ29uZmlnKGhvc3RDb25maWcpLCBtQXR0cmliVmFsdWVzKCkgeworICAgIG1BdHRyaWJWYWx1ZXMgPSBuZXcgR0xpbnRba0NvbmZpZ0F0dHJpYnV0ZXNMZW5dOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0NvbmZpZ0F0dHJpYnV0ZXNMZW47ICsraSkgeworICAgICAgICBtQXR0cmliVmFsdWVzW2ldID0gMDsKKyAgICAgICAgc19lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGhvc3REaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb25maWdBdHRyaWJ1dGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1BdHRyaWJWYWx1ZXNbaV0pOworCisgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZ3Vlc3Qgd2luZG93IHN1cmZhY2VzIGJ5IHdyYXBwaW5nCisgICAgICAgIC8vIHRoZW0gYXJvdW5kIGhvc3QgUGJ1ZmZlcnMsIHNvIGFsd2F5cyByZXBvcnQgaXQgdG8gdGhlIGd1ZXN0LgorICAgICAgICBpZiAoa0NvbmZpZ0F0dHJpYnV0ZXNbaV0gPT0gRUdMX1NVUkZBQ0VfVFlQRSkgeworICAgICAgICAgICAgbUF0dHJpYlZhbHVlc1tpXSB8PSBFR0xfV0lORE9XX0JJVDsKKyAgICAgICAgfQorICAgIH0KK30KKworRmJDb25maWdMaXN0OjpGYkNvbmZpZ0xpc3QoRUdMRGlzcGxheSBkaXNwbGF5KSA6IG1EaXNwbGF5KGRpc3BsYXkpIHsKKyAgICBpZiAoZGlzcGxheSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICBFKCIlczogSW52YWxpZCBkaXNwbGF5IHZhbHVlICVwIChFR0xfTk9fRElTUExBWSlcbiIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCAodm9pZCopZGlzcGxheSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFR0xpbnQgbnVtSG9zdENvbmZpZ3MgPSAwOworICAgIGlmICghc19lZ2wuZWdsR2V0Q29uZmlncyhkaXNwbGF5LCBOVUxMLCAwLCAmbnVtSG9zdENvbmZpZ3MpKSB7CisgICAgICAgIEUoIiVzOiBDb3VsZCBub3QgZ2V0IG51bWJlciBvZiBob3N0IEVHTCBjb25maWdzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEVHTENvbmZpZyogaG9zdENvbmZpZ3MgPSBuZXcgRUdMQ29uZmlnW251bUhvc3RDb25maWdzXTsKKyAgICBzX2VnbC5lZ2xHZXRDb25maWdzKGRpc3BsYXksIGhvc3RDb25maWdzLCBudW1Ib3N0Q29uZmlncywgJm51bUhvc3RDb25maWdzKTsKKworICAgIG1Db25maWdzID0gbmV3IEZiQ29uZmlnKltudW1Ib3N0Q29uZmlnc107CisgICAgZm9yIChFR0xpbnQgaSA9IDA7ICBpIDwgbnVtSG9zdENvbmZpZ3M7ICsraSkgeworICAgICAgICAvLyBGaWx0ZXIgb3V0IGNvbmZpZ3MgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBvdXIgaW1wbGVtZW50YXRpb24uCisgICAgICAgIGlmICghaXNDb21wYXRpYmxlSG9zdENvbmZpZyhob3N0Q29uZmlnc1tpXSwgZGlzcGxheSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1Db25maWdzW21Db3VudF0gPSBuZXcgRmJDb25maWcoaG9zdENvbmZpZ3NbaV0sIGRpc3BsYXkpOworICAgICAgICBtQ291bnQrKzsKKyAgICB9CisKKyAgICBkZWxldGUgW10gaG9zdENvbmZpZ3M7Cit9CisKK0ZiQ29uZmlnTGlzdDo6fkZiQ29uZmlnTGlzdCgpIHsKKyAgICBmb3IgKGludCBuID0gMDsgbiA8IG1Db3VudDsgKytuKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnc1tuXTsKKyAgICB9CisgICAgZGVsZXRlIFtdIG1Db25maWdzOworfQorCitpbnQgRmJDb25maWdMaXN0OjpjaG9vc2VDb25maWcoY29uc3QgRUdMaW50KiBhdHRyaWJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCogY29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgY29uZmlnc1NpemUpIGNvbnN0IHsKKyAgICBFR0xpbnQgbnVtSG9zdENvbmZpZ3MgPSAwOworICAgIGlmICghc19lZ2wuZWdsR2V0Q29uZmlncyhtRGlzcGxheSwgTlVMTCwgMCwgJm51bUhvc3RDb25maWdzKSkgeworICAgICAgICBFKCIlczogQ291bGQgbm90IGdldCBudW1iZXIgb2YgaG9zdCBFR0wgY29uZmlnc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgRUdMQ29uZmlnKiBtYXRjaGVkQ29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtSG9zdENvbmZpZ3NdOworCisgICAgLy8gSWYgRUdMX1NVUkZBQ0VfVFlQRSBhcHBlYXJzIGluIHxhdHRyaWJzfCwgdGhlIHZhbHVlIHBhc3NlZCB0bworICAgIC8vIGVnbENob29zZUNvbmZpZyBzaG91bGQgYmUgZm9yY2VkIHRvIEVHTF9QQlVGRkVSX0JJVCBiZWNhdXNlIHRoYXQncworICAgIC8vIHdoYXQgaXQgdXNlZCBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgZXhjbHVzaXZlbHkuIFRoaXMgZm9yY2VzCisgICAgLy8gdGhlIHJld3JpdGUgb2YgfGF0dHJpYnN8IGludG8gYSBuZXcgYXJyYXkuCisgICAgYm9vbCBoYXNTdXJmYWNlVHlwZSA9IGZhbHNlOworICAgIGJvb2wgd2FudFN3YXBQcmVzZXJ2ZWQgPSBmYWxzZTsKKyAgICBpbnQgc3VyZmFjZVR5cGVJZHggPSAwOworICAgIGludCBudW1BdHRyaWJzID0gMDsKKyAgICB3aGlsZSAoYXR0cmlic1tudW1BdHRyaWJzXSAhPSBFR0xfTk9ORSkgeworICAgICAgICBpZiAoYXR0cmlic1tudW1BdHRyaWJzXSA9PSBFR0xfU1VSRkFDRV9UWVBFKSB7CisgICAgICAgICAgICBoYXNTdXJmYWNlVHlwZSA9IHRydWU7CisgICAgICAgICAgICBzdXJmYWNlVHlwZUlkeCA9IG51bUF0dHJpYnM7CisgICAgICAgICAgICBpZiAoYXR0cmlic1tudW1BdHRyaWJzKzFdICYgRUdMX1NXQVBfQkVIQVZJT1JfUFJFU0VSVkVEX0JJVCkgeworICAgICAgICAgICAgICAgIHdhbnRTd2FwUHJlc2VydmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBudW1BdHRyaWJzICs9IDI7CisgICAgfQorCisgICAgRUdMaW50KiBuZXdBdHRyaWJzID0gTlVMTDsKKworICAgIGlmICghaGFzU3VyZmFjZVR5cGUpIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gRUdMX1NVUkZBQ0VfVFlQRSBpbiB8YXR0cmlic3wuCisgICAgICAgIG5ld0F0dHJpYnMgPSBuZXcgR0xpbnRbbnVtQXR0cmlicyArIDNdOworICAgICAgICBtZW1jcHkobmV3QXR0cmlicywgYXR0cmlicywgbnVtQXR0cmlicyAqIHNpemVvZihHTGludCkpOworICAgICAgICBuZXdBdHRyaWJzW251bUF0dHJpYnNdID0gRUdMX1NVUkZBQ0VfVFlQRTsKKyAgICAgICAgbmV3QXR0cmlic1tudW1BdHRyaWJzICsgMV0gPSAwOworICAgICAgICBuZXdBdHRyaWJzW251bUF0dHJpYnMgKyAyXSA9IEVHTF9OT05FOworICAgIH0gZWxzZSBpZiAod2FudFN3YXBQcmVzZXJ2ZWQgJiYgZW11Z2w6OmdldEFwaUxldmVsKCkgPD0gMTkpIHsKKyAgICAgICAgLy8gRm9yIGFwaSA8PSAxOSwgdGhlcmUgaXMgYSBidWcgaW4gc29tZSBwdWJsaWMgc3lzdGVtIGltYWdlcworICAgICAgICAvLyB0aGF0IGNhdXNlcyBVSSBpc3N1ZSBpZiB0aGUgaG9zdCByZWplY3RzCisgICAgICAgIC8vIEVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQsIHdoaWxlIHRoZXkgYXJlIG5vdCB1c2luZworICAgICAgICAvLyB0aGlzIGZlYXR1cmUuCisgICAgICAgIC8vIFNvIHdlIHdpcGUgaXQgb3V0LgorICAgICAgICBuZXdBdHRyaWJzID0gbmV3IEdMaW50W251bUF0dHJpYnMrMV07CisgICAgICAgIG1lbWNweShuZXdBdHRyaWJzLCBhdHRyaWJzLCAobnVtQXR0cmlicysxKSAqIHNpemVvZihHTGludCkpOworICAgICAgICBuZXdBdHRyaWJzW3N1cmZhY2VUeXBlSWR4KzFdICY9IH4oRUdMaW50KUVHTF9TV0FQX0JFSEFWSU9SX1BSRVNFUlZFRF9CSVQ7CisgICAgfQorCisgICAgaWYgKHNfZWdsLmVnbENob29zZUNvbmZpZyhtRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRyaWJzID8gbmV3QXR0cmlicyA6IGF0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZENvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSG9zdENvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUhvc3RDb25maWdzKSA9PSBFR0xfRkFMU0UpIHsKKyAgICAgICAgaWYgKG5ld0F0dHJpYnMpIGRlbGV0ZSBbXSBuZXdBdHRyaWJzOworICAgICAgICBkZWxldGUgW10gbWF0Y2hlZENvbmZpZ3M7CisgICAgICAgIHJldHVybiAtc19lZ2wuZWdsR2V0RXJyb3IoKTsKKyAgICB9CisKKyAgICBkZWxldGUgW10gbmV3QXR0cmliczsKKworICAgIGludCByZXN1bHQgPSAwOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgbnVtSG9zdENvbmZpZ3M7ICsrbikgeworICAgICAgICAvLyBEb24ndCBjb3VudCBvciB3cml0ZSBtb3JlIHRoYW4gfGNvbmZpZ3NTaXplfCBpdGVtcyBpZiB8Y29uZmlnc3wKKyAgICAgICAgLy8gaXMgbm90IE5VTEwuCisgICAgICAgIGlmIChjb25maWdzICYmIGNvbmZpZ3NTaXplID4gMCAmJiByZXN1bHQgPj0gY29uZmlnc1NpemUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFNraXAgaW5jb21wYXRpYmxlIGhvc3QgY29uZmlncy4KKyAgICAgICAgaWYgKCFpc0NvbXBhdGlibGVIb3N0Q29uZmlnKG1hdGNoZWRDb25maWdzW25dLCBtRGlzcGxheSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIEZpbmQgdGhlIEZiQ29uZmlnIHdpdGggdGhlIHNhbWUgRUdMX0NPTkZJR19JRAorICAgICAgICBFR0xpbnQgaG9zdENvbmZpZ0lkOworICAgICAgICBzX2VnbC5lZ2xHZXRDb25maWdBdHRyaWIoCisgICAgICAgICAgICAgICAgbURpc3BsYXksIG1hdGNoZWRDb25maWdzW25dLCBFR0xfQ09ORklHX0lELCAmaG9zdENvbmZpZ0lkKTsKKyAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBtQ291bnQ7ICsraykgeworICAgICAgICAgICAgaW50IGd1ZXN0Q29uZmlnSWQgPSBtQ29uZmlnc1trXS0+Z2V0Q29uZmlnSWQoKTsKKyAgICAgICAgICAgIGlmIChndWVzdENvbmZpZ0lkID09IGhvc3RDb25maWdJZCkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbWF0Y2guIFdyaXRlIGl0IHRvIHxjb25maWdzfCBpZiBpdCBpcyBub3QgTlVMTC4KKyAgICAgICAgICAgICAgICBpZiAoY29uZmlncyAmJiByZXN1bHQgPCBjb25maWdzU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWdzW3Jlc3VsdF0gPSAodWludDMyX3QpazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ICsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIFtdIG1hdGNoZWRDb25maWdzOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkIEZiQ29uZmlnTGlzdDo6Z2V0UGFja0luZm8oRUdMaW50KiBudW1Db25maWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCogbnVtQXR0cmlidXRlcykgY29uc3QgeworICAgIGlmIChudW1Db25maWdzKSB7CisgICAgICAgICpudW1Db25maWdzID0gbUNvdW50OworICAgIH0KKyAgICBpZiAobnVtQXR0cmlidXRlcykgeworICAgICAgICAqbnVtQXR0cmlidXRlcyA9IHN0YXRpY19jYXN0PEVHTGludD4oa0NvbmZpZ0F0dHJpYnV0ZXNMZW4pOworICAgIH0KK30KKworRUdMaW50IEZiQ29uZmlnTGlzdDo6cGFja0NvbmZpZ3MoR0x1aW50IGJ1ZmZlckJ5dGVTaXplLCBHTHVpbnQqIGJ1ZmZlcikgY29uc3QgeworICAgIEdMdWludCBudW1BdHRyaWJzID0gc3RhdGljX2Nhc3Q8R0x1aW50PihrQ29uZmlnQXR0cmlidXRlc0xlbik7CisgICAgR0x1aW50IGtHTHVpbnRTaXplID0gc3RhdGljX2Nhc3Q8R0x1aW50PihzaXplb2YoR0x1aW50KSk7CisgICAgR0x1aW50IG5lZWRlZEJ5dGVTaXplID0gKG1Db3VudCArIDEpICogbnVtQXR0cmlicyAqIGtHTHVpbnRTaXplOworICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlckJ5dGVTaXplIDwgbmVlZGVkQnl0ZVNpemUpIHsKKyAgICAgICAgcmV0dXJuIC1uZWVkZWRCeXRlU2l6ZTsKKyAgICB9CisgICAgLy8gV3JpdGUgdG8gdGhlIGJ1ZmZlciB0aGUgY29uZmlnIGF0dHJpYnV0ZSBpZHMsIGZvbGxvd2VkIGZvciBlYWNoIG9uZQorICAgIC8vIG9mIHRoZSBjb25maWdzLCB0aGVpciB2YWx1ZXMuCisgICAgbWVtY3B5KGJ1ZmZlciwga0NvbmZpZ0F0dHJpYnV0ZXMsIGtDb25maWdBdHRyaWJ1dGVzTGVuICoga0dMdWludFNpemUpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ291bnQ7ICsraSkgeworICAgICAgICBtZW1jcHkoYnVmZmVyICsgKGkgKyAxKSAqIGtDb25maWdBdHRyaWJ1dGVzTGVuLAorICAgICAgICAgICAgICAgbUNvbmZpZ3NbaV0tPm1BdHRyaWJWYWx1ZXMsCisgICAgICAgICAgICAgICBrQ29uZmlnQXR0cmlidXRlc0xlbiAqIGtHTHVpbnRTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIG1Db3VudDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZiQ29uZmlnLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GYkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjExMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GYkNvbmZpZy5oCkBAIC0wLDAgKzEsMTYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgX0xJQlJFTkRFUl9GQl9DT05GSUdfSAorI2RlZmluZSBfTElCUkVOREVSX0ZCX0NPTkZJR19ICisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvLyBBIGNsYXNzIHVzZWQgdG8gbW9kZWwgYSBndWVzdCBFR0wgY29uZmlnLgorLy8gVGhpcyByZWFsbHkgd3JhcHMgYSBob3N0IEVHTENvbmZpZyBoYW5kbGUsIGFuZCBwcm92aWRlcyBhIGZldyBjYWNoZWQKKy8vIGF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggZGlyZWN0IGFjY2Vzc29ycywgbGlrZQorLy8gZ2V0RGVwdGhTaXplKCkuCisvLworLy8gRWFjaCBGYkNvbmZpZyBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIGlkIHdoaWNoIGlzIGl0cyBpbmRleCBpbgorLy8gYW4gRmJDb25maWdMaXN0IGluc3RhbmNlIChhcyBkZWNsYXJlZCBiZWxvdykuIEl0IGlzIG5vdCByZWxhdGVkIHRvCisvLyB0aGUgaG9zdCBFR0xDb25maWcgdmFsdWUgb3IgaXRzIEVHTF9DT05GSUdfSUQuCisvLworLy8gT25lIGRvZXNuJ3QgY3JlYXRlIGFuIEZiQ29uZmlnIGluc3RhbmNlLiBJbnN0ZWFkLCBjcmVhdGUgYW5kIGluaXRpYWxpemUKKy8vIGFuIEZiQ29uZmlnTGlzdCBmcm9tIHRoZSBob3N0IEVHTERpc3BsYXksIGFuZCB1c2UgaXRzIHNpemUoKSBhbmQgZ2V0KCkKKy8vIG1ldGhvZHMgdG8gYWNjZXNzIGl0LgorY2xhc3MgRmJDb25maWcgeworcHVibGljOgorICAgIC8vIERlc3RydWN0b3IKKyAgICB+RmJDb25maWcoKTsKKworICAgIC8vIFJldHJpZXZlIGhvc3QgRUdMQ29uZmlnLgorICAgIEVHTENvbmZpZyBnZXRFZ2xDb25maWcoKSBjb25zdCB7IHJldHVybiBtRWdsQ29uZmlnOyB9CisKKyAgICAvLyBHZXQgZGVwdGggc2l6ZSBpbiBiaXRzLgorICAgIEdMdWludCBnZXREZXB0aFNpemUoKSBjb25zdCB7IHJldHVybiBnZXRBdHRyaWJWYWx1ZSgwKTsgfQorCisgICAgLy8gR2V0IHN0ZW5jaWwgc2l6ZSBpbiBiaXRzLgorICAgIEdMdWludCBnZXRTdGVuY2lsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldEF0dHJpYlZhbHVlKDEpOyB9CisKKyAgICAvLyBHZXQgcmVuZGVyYWJsZSB0eXBlIG1hc2suCisgICAgR0x1aW50IGdldFJlbmRlcmFibGVUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXR0cmliVmFsdWUoMik7IH0KKworICAgIC8vIEdldCBzdXJmYWNlIHR5cGUgbWFzay4KKyAgICBHTHVpbnQgZ2V0U3VyZmFjZVR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRBdHRyaWJWYWx1ZSgzKTsgfQorCisgICAgLy8gR2V0IHRoZSBFR0xfQ09ORklHX0lEIHZhbHVlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgb2YgdGhlCisgICAgLy8gdW5kZXJseWluZyBob3N0IEVHTENvbmZpZyBoYW5kbGUuCisgICAgR0xpbnQgZ2V0Q29uZmlnSWQoKSBjb25zdCB7IHJldHVybiAoR0xpbnQpZ2V0QXR0cmliVmFsdWUoNCk7IH0KKworcHJpdmF0ZToKKyAgICBGYkNvbmZpZygpOworICAgIEZiQ29uZmlnKEZiQ29uZmlnJiBvdGhlcik7CisKKyAgICBleHBsaWNpdCBGYkNvbmZpZyhFR0xDb25maWcgaG9zdENvbmZpZywgRUdMRGlzcGxheSBob3N0RGlzcGxheSk7CisKKyAgICBmcmllbmQgY2xhc3MgRmJDb25maWdMaXN0OworCisgICAgR0x1aW50IGdldEF0dHJpYlZhbHVlKGludCBuKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQXR0cmliVmFsdWVzID8gbUF0dHJpYlZhbHVlc1tuXSA6IDBVOworICAgIH0KKworICAgIEVHTENvbmZpZyBtRWdsQ29uZmlnOworICAgIEdMaW50KiBtQXR0cmliVmFsdWVzOworfTsKKworLy8gQSBjbGFzcyB0byBtb2RlbCB0aGUgbGlzdCBvZiBGYkNvbmZpZyBmb3IgYSBnaXZlbiBFR0xEaXNwbGF5LCB0aGlzIGlzCisvLyBidWlsdCBmcm9tIHRoZSBsaXN0IG9mIGhvc3QgRUdMQ29uZmlnIGhhbmRsZXMsIGZpbHRlcmVkIHRvIG9ubHkgYWNjZXB0CisvLyBjb25maWdzIHRoYXQgYXJlIHVzZWZ1bCBieSB0aGUgcmVuZGVyaW5nIGxpYnJhcnkgKGUuZy4gdGhleSBtdXN0IHN1cHBvcnQKKy8vIFBCdWZmZXJzIGFuZCBSR0IgcGl4ZWwgdmFsdWVzKS4KKy8vCisvLyBVc2FnZSBpcyB0aGUgZm9sbG93aW5nOgorLy8KKy8vIDEpIENyZWF0ZSBuZXcgaW5zdGFuY2UgYnkgcGFzc2luZyBob3N0IEVHTERpc3BsYXkgdmFsdWUuCisvLworLy8gMikgQ2FsbCBlbXB0eSgpIHRvIGNoZWNrIHRoYXQgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB3aGljaCB3b3VsZCBpbmRpY2F0ZQorLy8gICAgYW4gZXJyb3IgZHVyaW5nIGNyZWF0aW9uLgorLy8KKy8vIDMpIEZiQ29uZmlnIGluc3RhbmNlcyBhcmUgaWRlbnRpZmllZCBieSBudW1iZXJzIGluIDAuLihOLTEpIHJhbmdlLCB3aGVyZQorLy8gICAgTiBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzaXplKCkgbWV0aG9kLgorLy8KKy8vIDQpIENvbnZlcnQgYW4gRmJDb25maWcgaWQgaW50byBhbiBGYkNvbmZpZyBpbnN0YW5jZSB3aXRoIGdldCgpLgorLy8KKy8vIDUpIFVzZSBnZXRQYWNrSW5mbygpIGFuZCBwYWNrQ29uZmlncygpIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0CisvLyAgICBhdmFpbGFibGUgY29uZmlncyB0byB0aGUgZ3Vlc3QuCitjbGFzcyBGYkNvbmZpZ0xpc3QgeworcHVibGljOgorICAgIC8vIENyZWF0ZSBhIG5ldyBsaXN0IG9mIEZiQ29uZmlnIGluc3RhbmNlLCBieSBxdWVyeWluZyBhbGwgY29tcGF0aWJsZQorICAgIC8vIGhvc3QgY29uZmlncyBmcm9tIHxkaXNwbGF5fC4gQSBjb21wYXRpYmxlIGNvbmZpZyBpcyBvbmUgdGhhdCBzdXBwb3J0cworICAgIC8vIFBidWZmZXJzIGFuZCBSR0IgcGl4ZWwgdmFsdWVzLgorICAgIC8vCisgICAgLy8gQWZ0ZXIgY29uc3RydWN0aW9uLCBjYWxsIGVtcHR5KCkgdG8gY2hlY2sgaWYgdGhlcmUgYXJlIGl0ZW1zLgorICAgIC8vIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBjb25zdHJ1Y3Rpb24uCisgICAgZXhwbGljaXQgRmJDb25maWdMaXN0KEVHTERpc3BsYXkgZGlzcGxheSk7CisKKyAgICAvLyBEZXN0cnVjdG9yLgorICAgIH5GYkNvbmZpZ0xpc3QoKTsKKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGUgbGlzdCBpcyBlbXB0eS4gdHJ1ZSBtZWFucyB0aGVyZSB3YXMgYW4gZXJyb3IKKyAgICAvLyBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBtQ291bnQgPT0gMDsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgRmJDb25maWcgaW5zdGFuY2VzIGluIHRoZSBsaXN0LgorICAgIC8vIEVhY2ggaW5zdGFuY2UgaXMgaWRlbnRpZmllZCBieSBhIG51bWJlciBmcm9tIDAgdG8gTi0xLAorICAgIC8vIHdoZXJlIE4gaXMgdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90PihtQ291bnQpOyB9CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgRmJDb25maWcgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHxndWVzdElkfCwKKyAgICAvLyB3aGljaCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCB8c2l6ZSgpIC0gMXwuIFJldHVybnMKKyAgICAvLyBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAgICBjb25zdCBGYkNvbmZpZyogZ2V0KGludCBndWVzdElkKSBjb25zdCB7CisgICAgICAgIGlmIChndWVzdElkID49IDAgJiYgZ3Vlc3RJZCA8IG1Db3VudCkgeworICAgICAgICAgICAgcmV0dXJuIG1Db25maWdzW2d1ZXN0SWRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBVc2UgfGF0dHJpYnN8IGEgbGlzdCBvZiBFR0wgYXR0cmlidXRlIG5hbWUvdmFsdWVzIHRlcm1pbmF0ZWQgYnkKKyAgICAvLyBFR0xfTk9ORSwgdG8gc2VsZWN0IGEgc2V0IG9mIG1hdGNoaW5nIEZiQ29uZmlnIGluc3RhbmNlcy4KKyAgICAvLworICAgIC8vIE9uIHN1Y2Nlc3MsIHJldHVybnMgdGhlIG51bWJlciBvZiBtYXRjaGluZyBpbnN0YW5jZXMuCisgICAgLy8gSWYgfGNvbmZpZ3N8IGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBndWVzdCBJRHMKKyAgICAvLyBvZiB0aGUgbWF0Y2hlZCBGYkNvbmZpZyBpbnN0YW5jZXMuCisgICAgLy8KKyAgICAvLyB8Y29uZmlnc1NpemV8IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgfGNvbmZpZ3N8IGFycmF5LiBUaGUKKyAgICAvLyBmdW5jdGlvbiB3aWxsIG5ldmVyIHdyaXRlIG1vcmUgdGhhbiB8Y29uZmlnc1NpemV8IGVudHJpZXMgaW50bworICAgIC8vIHxjb25maWdzU2l6ZXwuCisgICAgRUdMaW50IGNob29zZUNvbmZpZyhjb25zdCBFR0xpbnQqIGF0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQqIGNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICBFR0xpbnQgY29uZmlnc1NpemUpIGNvbnN0OworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgZ3Vlc3QgYmVmb3JlIHBhY2tlZAorICAgIC8vIGNvbmZpZyBsaXN0IGluZm9ybWF0aW9uLiBJZiB8bnVtQ29uZmlnc3wgaXMgTlVMTCwgdGhlbiB8Km51bUNvbmZpZ3N8CisgICAgLy8gd2lsbCBiZSBzZXQgb24gcmV0dXJuIHRvIHRoZSBudW1iZXIgb2YgY29uZmlnIGluc3RhbmNlcy4KKyAgICAvLyBJZiB8bnVtQXR0cmlic3wgaXMgbm90IE5VTEwsIHRoZW4gfCpudW1BdHRyaWJzfCB3aWxsIGJlIHNldCBvbiByZXR1cm4KKyAgICAvLyB0byB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZSB2YWx1ZXMgY2FjaGVkIGJ5IGVhY2ggRmJDb25maWcgaW5zdGFuY2UuCisgICAgdm9pZCBnZXRQYWNrSW5mbyhFR0xpbnQqIG11bUNvbmZpZ3MsIEVHTGludCogbnVtQXR0cmlicykgY29uc3Q7CisKKyAgICAvLyBXcml0ZSB0aGUgZnVsbCBsaXN0IGluZm9ybWF0aW9uIGludG8gYW4gYXJyYXkgb2YgRUdMdWludCBpdGVtcy4KKyAgICAvLyB8YnVmZmVyfCBpcyB0aGUgb3V0cHV0IGJ1ZmZlciB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZGF0YS4KKyAgICAvLyB8YnVmZmVyQnl0ZVNpemV8IGlzIHRlaCBidWZmZXIgc2l6ZSBpbiBieXRlcy4KKyAgICAvLyBPbiBzdWNjZXNzLCB0aGlzIHJldHVybnMKKyAgICBFR0xpbnQgcGFja0NvbmZpZ3MoR0x1aW50IGJ1ZmZlckJ5dGVTaXplLCBHTHVpbnQqIGJ1ZmZlcikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgRmJDb25maWdMaXN0KGNvbnN0IEZiQ29uZmlnTGlzdCYgb3RoZXIpID0gZGVsZXRlOworCisgICAgaW50IG1Db3VudCA9IDA7CisgICAgRmJDb25maWcqKiBtQ29uZmlncyA9IG51bGxwdHI7CisgICAgRUdMRGlzcGxheSBtRGlzcGxheSA9IDA7Cit9OworCisjZW5kaWYgIC8vIF9MSUJSRU5ERVJfRkJfQ09ORklHX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZlbmNlU3luYy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GZW5jZVN5bmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2FmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GZW5jZVN5bmMuY3BwCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJGZW5jZVN5bmMuaCIKKworI2luY2x1ZGUgIkRpc3BhdGNoVGFibGVzLmgiCisjaW5jbHVkZSAiRnJhbWVCdWZmZXIuaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0VHTERpc3BhdGNoLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhyZWFkSW5mby5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2NvbnRhaW5lcnMvTG9va3VwLmgiCisKK0ZlbmNlU3luYzo6RmVuY2VTeW5jKGJvb2wgaGFzTmF0aXZlRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICBib29sIGRlc3Ryb3lXaGVuU2lnbmFsZWQpIDoKKyAgICBtRGVzdHJveVdoZW5TaWduYWxlZChkZXN0cm95V2hlblNpZ25hbGVkKSB7CisKKyAgICBhc3NlcnQobUNvdW50ID09IDEpOworICAgIGlmIChoYXNOYXRpdmVGZW5jZSkgaW5jUmVmKCk7CisKKyAgICAvLyBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYSB2YWxpZCArIGN1cnJlbnQgT3BlbkdMIGNvbnRleHQKKyAgICBhc3NlcnQoUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCkpOworICAgIGFzc2VydChSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKS0+Y3VyckNvbnRleHQuZ2V0KCkpOworCisgICAgbURpc3BsYXkgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+Z2V0RGlzcGxheSgpOworICAgIG1TeW5jID0gc19lZ2wuZWdsQ3JlYXRlU3luY0tIUihtRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1NZTkNfRkVOQ0VfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworRUdMaW50IEZlbmNlU3luYzo6d2FpdCh1aW50NjRfdCB0aW1lb3V0KSB7CisgICAgaW5jUmVmKCk7CisgICAgRUdMaW50IHdhaXRfcmVzID0KKyAgICAgICAgc19lZ2wuZWdsQ2xpZW50V2FpdFN5bmNLSFIobURpc3BsYXksIG1TeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfU1lOQ19GTFVTSF9DT01NQU5EU19CSVRfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0KTsKKyAgICBkZWNSZWYoKTsKKyAgICByZXR1cm4gd2FpdF9yZXM7Cit9CisKK3ZvaWQgRmVuY2VTeW5jOjpzaWduYWxlZE5hdGl2ZUZkKCkgeworICAgIGlmICghZGVjUmVmKCkgJiYgbURlc3Ryb3lXaGVuU2lnbmFsZWQpIHsKKyAgICAgICAgZGVjUmVmKCk7CisgICAgfQorICAgIC8vIE5PVEU6IERvIG5vdCB1c2UgYW55dGhpbmcgbGlrZSB0aGlzIGNvbnN0cnVjdGlvbjoKKyAgICAvLyBkZWNSZWYoKTsKKyAgICAvLyBpZiAobURlc3Ryb3lXaGVuU2lnbmFsZWQpIC4uLgorICAgIC8vIElmIHRoZSBvYmplY3Qgd2FzIG9yaWdpbmFsbHkgY29uc3RydWN0ZWQgd2l0aAorICAgIC8vIG1EZXN0cm95V2hlblNpZ25hbGVkID09IGZhbHNlLAorICAgIC8vIHRoZSBmaXJzdCBkZWNSZWYoKSB3aWxsIGhhdmUgZGVzdHJveWVkIHRoaXMgb2JqZWN0LAorICAgIC8vIHdoaWNoIHdvdWxkIG1ha2Ugc3Vic2VxdWVudCBhY2Nlc3MgdG8KKyAgICAvLyB8bURlc3Ryb3lXaGVuU2lnbmFsZWR8IGNvcnJ1cHQgbWVtb3J5IGltbWVkaWF0ZWx5LgorICAgIC8vIFBsZWFzZSBrZWVwIHRoaXMgaW4gbWluZC4KK30KKwordm9pZCBGZW5jZVN5bmM6OmRlc3Ryb3koKSB7CisgICAgc19lZ2wuZWdsRGVzdHJveVN5bmNLSFIobURpc3BsYXksIG1TeW5jKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZlbmNlU3luYy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRmVuY2VTeW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNzcwOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZlbmNlU3luYy5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvTGF6eUluc3RhbmNlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSA8RUdML2VnbGV4dC5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorCisvLyBUaGUgRmVuY2VTeW5jIGNsYXNzIHdyYXBzIGFjdHVhbCBFR0xTeW5jS0hSIG9iamVjdHMKKy8vIGFuZCBpc3N1ZXMgY2FsbHMgdG8gZWdsQ3JlYXRlU3luY0tIUiwgZWdsQ2xpZW50V2FpdFN5bmNLSFIsCisvLyBhbmQgZWdsRGVzdHJveVN5bmNLSFIuCisvLworLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzczoKKy8vIC0gV2UgbmVlZCB0byB0cmFjayBFR0wgc3luYyBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIGd1ZXN0IGFuZAorLy8gICByZWFsaXplZCBpbiB0aGUgaG9zdCBPcGVuR0wgZHJpdmVyLiBUaGV5IGFyZSBwYXNzZWQgYmV0d2VlbgorLy8gICBndWVzdCBhbmQgaG9zdCBhbGwgdGhlIHRpbWUuCisvLyAtIEluIHBhcnRpY3VsYXIsIHdlIGFsc28gbmVlZCB0byBkZXN0cm95IEVHTCBzeW5jIG9iamVjdHMgYXQKKy8vICAgdGhlIHByb3BlciB0aW1lLiBUaGVyZSBhcmUgYXQgbGVhc3QgMyBpc3N1ZXMgKHJlZmVyZW5jZWQgYmVsb3cKKy8vICAgaW4gc3BlYyBjb21tZW50cyk6CisvLyAgIDEgQWNjb3JkaW5nIHRvIHNwZWMsIHdlIHdvdWxkIG5lZWQgdG8gYWxsb3cgY29uY3VycmVudAorLy8gICAgIGVnbENsaWVudFdhaXRTeW5jS0hSIGFuZCBlZ2xEZXN0cm95U3luY0tIUiB0byBhbGwgZmluaXNoCisvLyAgICAgcHJvcGVybHkuCisvLyAgIDIgSWYgdGhlIEVHTCBzeW5jIG9iamVjdCBpcyBvZiBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRAorLy8gICAgIG5hdHVyZSwgd2UgY2Fubm90IG1pcnJvciB0aGUgZ3Vlc3QncyBjYWxsIHRvIGVnbERlc3Ryb3lTeW5jS0hSCisvLyAgICAgYnkgY2FsbGluZyB0aGUgc2FtZSBmdW5jdGlvbiBvbiB0aGUgaG9zdCwgYmVjYXVzZSBHb2xkZmlzaAorLy8gICAgIHN5bmMgZGV2aWNlIGNhbiBvbmx5IGtub3cgd2hlbiBuYXRpdmUgZmVuY2UgRkQncyBhcmUgc2lnbmFsZWQKKy8vICAgICB3aGVuIGEgaG9zdC1zaWRlIEVHTCBzeW5jIG9iamVjdCBpcyBzaWduYWxlZC4gVGh1cywgd2Ugd291bGQKKy8vICAgICBuZWVkIHRvIGRlbGV0ZSBzdWNoIHN5bmMgb2JqZWN0cyBhZnRlciBib3RoIHRoZSBndWVzdCBhbmQKKy8vICAgICB0aGUgR29sZGZpc2ggc3luYyBkZXZpY2UgYXJlIGRvbmUgd2l0aCB0aGVtLgorLy8gICAzIFdlIHNvbWV0aW1lcyBjcmVhdGUgc3luYyBvYmplY3RzIHRoYXQgYXJlIG9ubHkgc2VlbiBieQorLy8gICAgIHRoZSBHb2xkZmlzaCBPcGVuR0wgZHJpdmVyIGluIHRoZSBndWVzdCwgc3VjaCBhcyBmb3IKKy8vICAgICBpbXBsZW1lbnRpbmcgZWdsU3dhcEJ1ZmZlcnMoKSBpbiBhIHdheSB0aGF0IGF2b2lkcworLy8gICAgIG91dCBvZiBvcmRlciBmcmFtZXMuIEl0IGlzIGN1bWJlcnNvbWUgdG8gZWdsRGVzdHJveVN5bmNLSFIKKy8vICAgICB0aG9zZSBvbiB0aGUgZ3Vlc3QsIGFzIHRoYXQgd291bGQgcmVxdWlyZSBzdGFydGluZyB1cCBhbm90aGVyIGd1ZXN0CisvLyAgICAgdGhyZWFkIGFuZCBPcGVuR0wgY29udGV4dCAoY29tcGxldGUgd2l0aCBob3N0IGNvbm5lY3Rpb24pCisvLyAgICAgdG8gZGVzdHJveSBpdC4KK2NsYXNzIEZlbmNlU3luYyB7CitwdWJsaWM6CisgICAgLy8gVGhlIGNvbnN0cnVjdG9yIHdyYXBzIGVnbENyZWF0ZVN5bmNLSFIgb24gdGhlIGhvc3QgT3BlbkdMIGRyaXZlci4KKyAgICAvLyB8aGFzTmF0aXZlRmVuY2V8IHNwZWNpZmllcyB3aGV0aGVyIHRoaXMgc3luYyBvYmplY3QKKyAgICAvLyBpcyBvZiBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRCBuYXR1cmUgKDIpLCBhbmQKKyAgICAvLyB8ZGVzdHJveVdoZW5TaWduYWxlZHwgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGRlc3Ryb3kKKyAgICAvLyB0aGUgc3luYyBvYmplY3Qgd2hlbiB0aGUgbmF0aXZlIGZlbmNlIEZEIGJlY29tZXMgc2lnbmFsZWQgKDMpLgorICAgIEZlbmNlU3luYyhib29sIGhhc05hdGl2ZUZlbmNlLAorICAgICAgICAgICAgICBib29sIGRlc3Ryb3lXaGVuU2lnbmFsZWQpOworCisgICAgLy8gd2FpdCgpIHdyYXBzIGVnbENsaWVudFdhaXRTeW5jS0hSLiBEdXJpbmcgc3VjaCBhIHdhaXQsIHdlIG5lZWQKKyAgICAvLyB0byBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB3aGlsZSB0aGUgd2FpdCBpcyBhY3RpdmUsCisgICAgLy8gaW4gY2FzZSB0aGVyZSBpcyBhIGNvbmN1cnJlbnQgY2FsbCB0byBlZ2xEZXN0cm95U3luY0tIUiAoMSkuCisgICAgRUdMaW50IHdhaXQodWludDY0X3QgdGltZW91dCk7CisKKyAgICAvLyBzaWduYWxlZE5hdGl2ZUZkKCk6IHVwb24gd2hlbiB0aGUgbmF0aXZlIGZlbmNlIGZkCisgICAgLy8gaXMgc2lnbmFsZWQgZHVlIHRvIHRoZSBzeW5jIG9iamVjdCBiZWluZyBzaWduYWxlZCwKKyAgICAvLyB0aGlzIG1ldGhvZCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBhZGp1c3RzIHRoZSByZWZlcmVuY2UgY291bnQgZG93biBieSAxLiBUaGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcKKyAgICAvLyAgICsxIHRvIHRoZSBjb3VudCBhZGRlZCBhdCB0aGUgYmVnaW5uaW5nIGluIHRoZSBjb25zdHJ1Y3RvciwKKyAgICAvLyAgIGlmIHRoaXMgZmVuY2Ugb2JqZWN0IGlzIG9mIHR5cGUgRUdMX1NZTkNfTkFUSVZFX0ZFTkNFX0FORFJPSUQgKDIpLgorICAgIC8vIC0gaWYgfG1EZXN0cm95V2hlblNpZ25hbGVkfCBpcyB0cnVlLCB0aGlzIG1ldGhvZCBkZWNyZW1lbnRzIHRoZQorICAgIC8vICAgcmVmZXJlbmNlIGNvdW50IGFnYWluIHRvIGRlc3Ryb3kgaXQgKDMpLgorICAgIHZvaWQgc2lnbmFsZWROYXRpdmVGZCgpOworCisgICAgLy8gaW5jUmVmKCkgLyBkZWNSZWYoKSBpbmNyZW1lbnQvZGVjcmVtZW50IHJlZmVuY2UgY291bnRzIGluIG9yZGVyCisgICAgLy8gdG8gZGVhbCB3aXRoIHN5bmMgb2JqZWN0IGRlc3RydWN0aW9uLiBUaGlzIGlzIGEgc2ltcGxlIHJlZmVyZW5jZQorICAgIC8vIGNvdW50aW5nIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYWxtb3N0IGxpdGVyYWxseSB0aGUga3JlZigpIGluCisgICAgLy8gdGhlIExpbnV4IGtlcm5lbC4KKyAgICAvLworICAgIC8vIFdlIGRvIG5vdCB1c2Ugc2hhcmVkX3B0ciBvciBhbnl0aGluZyBsaWtlIHRoYXQgaGVyZSBiZWNhdXNlCisgICAgLy8gd2UgbmVlZCB0byBleHBsaWNpdGx5IG1hbmlwdWxhdGUgdGhlIHJlZmVyZW5jZSBjb3VudCBpbiBvcmRlciB0bworICAgIC8vIHNhdGlzZnkgKDEsMiwzKSBhYm92ZS4KKyAgICB2b2lkIGluY1JlZigpIHsgYXNzZXJ0KG1Db3VudCA+IDApOyArK21Db3VudDsgfQorICAgIGJvb2wgZGVjUmVmKCkgeworICAgICAgICBhc3NlcnQobUNvdW50ID4gMCk7CisgICAgICAgIGlmIChtQ291bnQgPT0gMSB8fCAtLW1Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAvLyBkZXN0cm95KCkgaGVyZSB3b3VsZCBkZWxheSBjYWxscyB0byBlZ2xEZXN0cm95U3luY0tIUgorICAgICAgICAgICAgLy8gaW4gdGhlIGhvc3QgZHJpdmVyIHVudGlsIGFsbCB3YWl0cyBoYXZlIGNvbXBsZXRlZCwKKyAgICAgICAgICAgIC8vIHdoaWNoIGlzIGEgYml0IGRpZmZlcmVudCBmcm9tIHNpbXBseSBhbGxvd2luZyBjb25jdXJyZW50IGNhbGxzLgorICAgICAgICAgICAgLy8gQnV0LCBmcm9tIHRoZSBndWVzdCdzIHBlcnNwZWN0aXZlLCB0aGUgY29udHJhY3Qgb2YgYWxsb3dpbmcKKyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgdG8gZmluaXNoIGlzIHN0aWxsIGZ1bGZpbGxlZCwgYW5kIHRoZXJlIGlzCisgICAgICAgICAgICAvLyBubyByZWFzb24gdG8gdGhpbmsgKHRoZW9yZXRpY2FsbHkgb3IgcHJhY3RpY2FsbHkpIHRoYXQKKyAgICAgICAgICAgIC8vIGlzIHVuZGVzaXJhYmxlIHRvIGRlc3Ryb3kgdGhlIHVuZGVybHlpbmcgRUdMIHN5bmMgb2JqZWN0CisgICAgICAgICAgICAvLyBhIHRpbnkgYml0IGxhdGVyLiBXZSBjb3VsZCBoYXZlIHB1dCBpbiBleHRyYSBsb2dpYyB0byBhbGxvdworICAgICAgICAgICAgLy8gY29uY3VycmVudCBkZXN0cnVjdGlvbiwgYnV0IHRoaXMgd291bGQgaGF2ZSBtYWRlIHRoZSBjb2RlCisgICAgICAgICAgICAvLyB1bmRlc2lyYWJseSBsZXNzIHNpbXBsZS4KKyAgICAgICAgICAgIGRlc3Ryb3koKTsKKyAgICAgICAgICAgIC8vIFRoaXMgZGVsZXRlLXRoZW4tcmV0dXJuIHNlZW1zIE9LLgorICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorcHJpdmF0ZToKKyAgICBib29sIG1EZXN0cm95V2hlblNpZ25hbGVkOworICAgIHN0ZDo6YXRvbWljPGludD4gbUNvdW50ID0gezF9OworCisgICAgLy8gRUdMIHN0YXRlIG5lZWRlZCBmb3IgY2FsbGluZyBPcGVuR0wgc3luYyBvcGVyYXRpb25zLgorICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CisgICAgRUdMU3luY0tIUiBtU3luYzsKKworICAgIC8vIGRlc3Ryb3koKSB3cmFwcyBlZ2xEZXN0cm95U3luY0tIUi4gVGhpcyBpcyBwcml2YXRlLCBiZWNhdXNlIHdlIG5lZWQKKyAgICAvLyBjYXJlZnVsIGNvbnRyb2wgb2Ygd2hlbiBlZ2xEZXN0cm95U3luY0tIUiBpcyBhY3R1YWxseSBjYWxsZWQuCisgICAgdm9pZCBkZXN0cm95KCk7Cit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRnJhbWVCdWZmZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRnJhbWVCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjA5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9GcmFtZUJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxMzM4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5oIgorCisjaW5jbHVkZSAiRGlzcGF0Y2hUYWJsZXMuaCIKKyNpbmNsdWRlICJOYXRpdmVTdWJXaW5kb3cuaCIKKyNpbmNsdWRlICJSZW5kZXJUaHJlYWRJbmZvLmgiCisjaW5jbHVkZSAiZ2xlczJfZGVjLmgiCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0VHTERpc3BhdGNoLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3lzdGVtL1N5c3RlbS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sb2dnaW5nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgY2xhc3MgdG8gY2FsbCB0aGUgYmluZF9sb2NrZWQoKSAvIHVuYmluZF9sb2NrZWQoKSBwcm9wZXJseS4KK2NsYXNzIFNjb3BlZEJpbmQgeworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yIHdpbGwgY2FsbCBiaW5kX2xvY2tlZCgpIG9uIHxmYnwuCisgICAgLy8gVXNlIGlzVmFsaWQoKSB0byBjaGVjayBmb3IgZXJyb3JzLgorICAgIFNjb3BlZEJpbmQoRnJhbWVCdWZmZXIqIGZiKSA6IG1GYihmYikgeworICAgICAgICBpZiAoIW1GYi0+YmluZF9sb2NrZWQoKSkgeworICAgICAgICAgICAgbUZiID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBjb250cnVjdGlvbiBib3VuZCB0aGUgZnJhbWVidWZmZXIgY29udGV4dCBwcm9wZXJseS4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtRmIgIT0gTlVMTDsgfQorCisgICAgLy8gVW5ib3VuZCB0aGUgZnJhbWVidWZmZXIgZXhwbGljdGx5LiBUaGlzIGlzIGFsc28gY2FsbGVkIGJ5IHRoZQorICAgIC8vIGRlc3RydWN0b3IuCisgICAgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBpZiAobUZiKSB7CisgICAgICAgICAgICBtRmItPnVuYmluZF9sb2NrZWQoKTsKKyAgICAgICAgICAgIG1GYiA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEZXN0cnVjdG9yIHdpbGwgY2FsbCByZWxlYXNlKCkuCisgICAgflNjb3BlZEJpbmQoKSB7CisgICAgICAgIHJlbGVhc2UoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRnJhbWVCdWZmZXIqIG1GYjsKK307CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIGEgQ29sb3JCdWZmZXI6OkhlbHBlciBpbnN0YW5jZSB0aGF0IHJlZGlyZWN0cyBjYWxscworLy8gdG8gYSBGcmFtZUJ1ZmZlciBpbnN0YW5jZS4KK2NsYXNzIENvbG9yQnVmZmVySGVscGVyIDogcHVibGljIENvbG9yQnVmZmVyOjpIZWxwZXIgeworcHVibGljOgorICAgIENvbG9yQnVmZmVySGVscGVyKEZyYW1lQnVmZmVyKiBmYikgOiBtRmIoZmIpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0dXBDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbUZiLT5iaW5kX2xvY2tlZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZWFyZG93bkNvbnRleHQoKSB7CisgICAgICAgIG1GYi0+dW5iaW5kX2xvY2tlZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgVGV4dHVyZURyYXcqIGdldFRleHR1cmVEcmF3KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZiLT5nZXRUZXh0dXJlRHJhdygpOworICAgIH0KK3ByaXZhdGU6CisgICAgRnJhbWVCdWZmZXIqIG1GYjsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitGcmFtZUJ1ZmZlciAqRnJhbWVCdWZmZXI6OnNfdGhlRnJhbWVCdWZmZXIgPSBOVUxMOworSGFuZGxlVHlwZSBGcmFtZUJ1ZmZlcjo6c19uZXh0SGFuZGxlID0gMDsKKworc3RhdGljIGNoYXIqIGdldEdMRVMyRXh0ZW5zaW9uU3RyaW5nKEVHTERpc3BsYXkgcF9kcHkpCit7CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisKKyAgICBzdGF0aWMgY29uc3QgR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfUEJVRkZFUl9CSVQsCisgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworCisgICAgaW50IG47CisgICAgaWYgKCFzX2VnbC5lZ2xDaG9vc2VDb25maWcocF9kcHksIGNvbmZpZ0F0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywgMSwgJm4pIHx8IG4gPT0gMCkgeworICAgICAgICBFUlIoIiVzOiBDb3VsZCBub3QgZmluZCBHTEVTIDIueCBjb25maWchXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKworICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgcGJ1ZkF0dHJpYnNbXSA9IHsKKyAgICAgICAgRUdMX1dJRFRILCAxLAorICAgICAgICBFR0xfSEVJR0hULCAxLAorICAgICAgICBFR0xfTk9ORQorICAgIH07CisKKyAgICBzdXJmYWNlID0gc19lZ2wuZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UocF9kcHksIGNvbmZpZywgcGJ1ZkF0dHJpYnMpOworICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7CisgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBjcmVhdGUgR0xFUyAyLnggUGJ1ZmZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBHTGludCBnbGVzMkNvbnRleHRBdHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLAorICAgICAgICBFR0xfTk9ORQorICAgIH07CisKKyAgICBFR0xDb250ZXh0IGN0eCA9IHNfZWdsLmVnbENyZWF0ZUNvbnRleHQocF9kcHksIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsZXMyQ29udGV4dEF0dHJpYnMpOworICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IGNyZWF0ZSBHTEVTIDIueCBDb250ZXh0IVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgc19lZ2wuZWdsRGVzdHJveVN1cmZhY2UocF9kcHksIHN1cmZhY2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIXNfZWdsLmVnbE1ha2VDdXJyZW50KHBfZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjdHgpKSB7CisgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCBtYWtlIEdMRVMgMi54IGNvbnRleHQgY3VycmVudCFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHNfZWdsLmVnbERlc3Ryb3lTdXJmYWNlKHBfZHB5LCBzdXJmYWNlKTsKKyAgICAgICAgc19lZ2wuZWdsRGVzdHJveUNvbnRleHQocF9kcHksIGN0eCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHRoZSBzdHJpbmcgcG9pbnRlciBtYXkgYmVjb21lIGludmFsaWQgd2hlbiB0aGUgY29udGV4dCBpcyBkZXN0cm95ZWQKKyAgICBjb25zdCBjaGFyKiBzID0gKGNvbnN0IGNoYXIqKXNfZ2xlczIuZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyk7CisgICAgY2hhciogZXh0U3RyaW5nID0gc3RyZHVwKHMgPyBzIDogIiIpOworCisgICAgLy8gSXQgaXMgcmFyZSBidXQgc29tZSBkcml2ZXJzIGFjdHVhbGx5IGZhaWwgdGhpcy4uLgorICAgIGlmICghc19lZ2wuZWdsTWFrZUN1cnJlbnQocF9kcHksIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgIEVSUigiJXM6IENvdWxkIG5vdCB1bmJpbmQgY29udGV4dC4gUGxlYXNlIHRyeSB1cGRhdGluZyBncmFwaGljcyBjYXJkIGRyaXZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGZyZWUoZXh0U3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNfZWdsLmVnbERlc3Ryb3lDb250ZXh0KHBfZHB5LCBjdHgpOworICAgIHNfZWdsLmVnbERlc3Ryb3lTdXJmYWNlKHBfZHB5LCBzdXJmYWNlKTsKKworICAgIHJldHVybiBleHRTdHJpbmc7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmZpbmFsaXplKCl7CisgICAgbV9jb2xvcmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAobV91c2VTdWJXaW5kb3cpIHsKKyAgICAgICAgcmVtb3ZlU3ViV2luZG93KCk7CisgICAgfQorICAgIG1fd2luZG93cy5jbGVhcigpOworICAgIG1fY29udGV4dHMuY2xlYXIoKTsKKyAgICBzX2VnbC5lZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHNfZWdsLmVnbERlc3Ryb3lDb250ZXh0KG1fZWdsRGlzcGxheSwgbV9lZ2xDb250ZXh0KTsKKyAgICBzX2VnbC5lZ2xEZXN0cm95Q29udGV4dChtX2VnbERpc3BsYXksIG1fcGJ1ZkNvbnRleHQpOworICAgIHNfZWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9wYnVmU3VyZmFjZSk7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OmluaXRpYWxpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIHVzZVN1YldpbmRvdykKK3sKKyAgICBHTF9MT0coIkZyYW1lQnVmZmVyOjppbml0aWFsaXplIik7CisgICAgaWYgKHNfdGhlRnJhbWVCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgRnJhbWVCdWZmZXIgb2JqZWN0CisgICAgLy8KKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBuZXcgRnJhbWVCdWZmZXIod2lkdGgsIGhlaWdodCwgdXNlU3ViV2luZG93KTsKKyAgICBpZiAoIWZiKSB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBmYlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUgYmFja2VuZCBFR0wgZGlzcGxheQorICAgIC8vCisgICAgZmItPm1fZWdsRGlzcGxheSA9IHNfZWdsLmVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgaWYgKGZiLT5tX2VnbERpc3BsYXkgPT0gRUdMX05PX0RJU1BMQVkpIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gSW5pdGlhbGl6ZSBiYWNrZW5kIEVHTCBkaXNwbGF5XG4iKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR0xfTE9HKCJjYWxsIGVnbEluaXRpYWxpemUiKTsKKyAgICBpZiAoIXNfZWdsLmVnbEluaXRpYWxpemUoZmItPm1fZWdsRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZiLT5tX2NhcHMuZWdsTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYi0+bV9jYXBzLmVnbE1pbm9yKSkgeworICAgICAgICBFUlIoIkZhaWxlZCB0byBlZ2xJbml0aWFsaXplXG4iKTsKKyAgICAgICAgR0xfTE9HKCJGYWlsZWQgdG8gZWdsSW5pdGlhbGl6ZSIpOworICAgICAgICBkZWxldGUgZmI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBEQkcoImVnbDogJWQgJWRcbiIsIGZiLT5tX2NhcHMuZWdsTWFqb3IsIGZiLT5tX2NhcHMuZWdsTWlub3IpOworICAgIEdMX0xPRygiZWdsOiAlZCAlZCIsIGZiLT5tX2NhcHMuZWdsTWFqb3IsIGZiLT5tX2NhcHMuZWdsTWlub3IpOworICAgIHNfZWdsLmVnbEJpbmRBUEkoRUdMX09QRU5HTF9FU19BUEkpOworCisgICAgLy8KKyAgICAvLyBpZiBHTEVTMiBwbHVnaW4gaGFzIGxvYWRlZCAtIHRyeSB0byBtYWtlIEdMRVMyIGNvbnRleHQgYW5kCisgICAgLy8gZ2V0IEdMRVMyIGV4dGVuc2lvbiBzdHJpbmcKKyAgICAvLworICAgIGNoYXIqIGdsZXMyRXh0ZW5zaW9ucyA9IE5VTEw7CisgICAgZ2xlczJFeHRlbnNpb25zID0gZ2V0R0xFUzJFeHRlbnNpb25TdHJpbmcoZmItPm1fZWdsRGlzcGxheSk7CisgICAgaWYgKCFnbGVzMkV4dGVuc2lvbnMpIHsKKyAgICAgICAgLy8gQ291bGQgbm90IGNyZWF0ZSBHTEVTMiBjb250ZXh0IC0gZHJvcCBHTDIgY2FwYWJpbGl0eQorICAgICAgICBFUlIoIkZhaWxlZCB0byBvYnRhaW4gR0xFUyAyLnggZXh0ZW5zaW9ucyBzdHJpbmchXG4iKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDcmVhdGUgRUdMIGNvbnRleHQgZm9yIGZyYW1lYnVmZmVyIHBvc3QgcmVuZGVyaW5nLgorICAgIC8vCisgICAgR0xpbnQgc3VyZmFjZVR5cGUgPSAodXNlU3ViV2luZG93ID8gRUdMX1dJTkRPV19CSVQgOiAwKSB8IEVHTF9QQlVGRkVSX0JJVDsKKworICAgIC8vIE9uIExpbnV4LCB3ZSBuZWVkIFJHQjg4OCBleGFjdGx5LCBvciBlZ2xNYWtlQ3VycmVudCB3aWxsIGZhaWwsCisgICAgLy8gYXMgZ2xYTWFrZUNvbnRleHRDdXJyZW50IG5lZWRzIHRvIG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlCisgICAgLy8gbmF0aXZlIHBpeG1hcC4KKyAgICBFR0xpbnQgd2FudGVkUmVkU2l6ZSA9IDg7CisgICAgRUdMaW50IHdhbnRlZEdyZWVuU2l6ZSA9IDg7CisgICAgRUdMaW50IHdhbnRlZEJsdWVTaXplID0gODsKKyAgICBFR0xpbnQgd2FudGVkQWxwaGFTaXplID0gMDsKKworICAgIGNvbnN0IEdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgRUdMX1JFRF9TSVpFLCB3YW50ZWRSZWRTaXplLAorICAgICAgICBFR0xfR1JFRU5fU0laRSwgd2FudGVkR3JlZW5TaXplLAorICAgICAgICBFR0xfQkxVRV9TSVpFLCB3YW50ZWRCbHVlU2l6ZSwKKyAgICAgICAgRUdMX0FMUEhBX1NJWkUsIHdhbnRlZEFscGhhU2l6ZSwKKyAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgc3VyZmFjZVR5cGUsCisgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworCisgICAgRUdMaW50IHRvdGFsX251bV9jb25maWdzID0gMDsKKyAgICBzX2VnbC5lZ2xHZXRDb25maWdzKGZiLT5tX2VnbERpc3BsYXksIE5VTEwsIDAsICZ0b3RhbF9udW1fY29uZmlncyk7CisKKyAgICBzdGQ6OnZlY3RvcjxFR0xDb25maWc+IGFsbF9jb25maWdzKHRvdGFsX251bV9jb25maWdzKTsKKyAgICBFR0xpbnQgdG90YWxfZWdsX2NvbXBhdGlibGVfY29uZmlncyA9IDA7CisgICAgc19lZ2wuZWdsQ2hvb3NlQ29uZmlnKGZiLT5tX2VnbERpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0F0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxfY29uZmlnc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfbnVtX2NvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbF9lZ2xfY29tcGF0aWJsZV9jb25maWdzKTsKKworICAgIHVpbnQzMl90IHRvdGFsX2V4YWN0X21hdGNoZXMgPSAwOworICAgIHN0ZDo6dmVjdG9yPEVHTGludD4gZXhhY3RfbWF0Y2hfaW5kaWNlczsKKyAgICBmb3IgKEVHTGludCBpID0gMDsgaSA8IHRvdGFsX2VnbF9jb21wYXRpYmxlX2NvbmZpZ3M7IGkrKykgeworICAgICAgICBFR0xpbnQgcixnLGIsYTsKKyAgICAgICAgRUdMQ29uZmlnIGMgPSBhbGxfY29uZmlnc1tpXTsKKyAgICAgICAgc19lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGZiLT5tX2VnbERpc3BsYXksIGMsIEVHTF9SRURfU0laRSwgJnIpOworICAgICAgICBzX2VnbC5lZ2xHZXRDb25maWdBdHRyaWIoZmItPm1fZWdsRGlzcGxheSwgYywgRUdMX0dSRUVOX1NJWkUsICZnKTsKKyAgICAgICAgc19lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGZiLT5tX2VnbERpc3BsYXksIGMsIEVHTF9CTFVFX1NJWkUsICZiKTsKKyAgICAgICAgc19lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGZiLT5tX2VnbERpc3BsYXksIGMsIEVHTF9BTFBIQV9TSVpFLCAmYSk7CisKKyAgICAgICAgaWYgKHIgPT0gd2FudGVkUmVkU2l6ZSAmJgorICAgICAgICAgICAgZyA9PSB3YW50ZWRHcmVlblNpemUgJiYKKyAgICAgICAgICAgIGIgPT0gd2FudGVkQmx1ZVNpemUgJiYKKyAgICAgICAgICAgIGEgPT0gd2FudGVkQWxwaGFTaXplKSB7CisgICAgICAgICAgICB0b3RhbF9leGFjdF9tYXRjaGVzKys7CisgICAgICAgICAgICBleGFjdF9tYXRjaF9pbmRpY2VzLnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChleGFjdF9tYXRjaF9pbmRpY2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEVSUigiRmFpbGVkIG9uIGVnbENob29zZUNvbmZpZ1xuIik7CisgICAgICAgIGZyZWUoZ2xlczJFeHRlbnNpb25zKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmItPm1fZWdsQ29uZmlnID0gYWxsX2NvbmZpZ3NbZXhhY3RfbWF0Y2hfaW5kaWNlc1swXV07CisKKyAgICBzdGF0aWMgY29uc3QgR0xpbnQgZ2xDb250ZXh0QXR0cmlic1tdID0geworICAgICAgICBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworCisgICAgR0xfTE9HKCJhdHRlbXB0aW5nIHRvIGNyZWF0ZSBlZ2wgY29udGV4dCIpOworICAgIGZiLT5tX2VnbENvbnRleHQgPSBzX2VnbC5lZ2xDcmVhdGVDb250ZXh0KGZiLT5tX2VnbERpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmItPm1fZWdsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19DT05URVhULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsQ29udGV4dEF0dHJpYnMpOworICAgIGlmIChmYi0+bV9lZ2xDb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBjb250ZXh0IDB4JXhcbiIsIHNfZWdsLmVnbEdldEVycm9yKCkpOworICAgICAgICBmcmVlKGdsZXMyRXh0ZW5zaW9ucyk7CisgICAgICAgIGRlbGV0ZSBmYjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEdMX0xPRygiYXR0ZW1wdGluZyB0byBjcmVhdGUgZWdsIHBidWZmZXIgY29udGV4dCIpOworICAgIC8vCisgICAgLy8gQ3JlYXRlIGFub3RoZXIgY29udGV4dCB3aGljaCBzaGFyZXMgd2l0aCB0aGUgZWdsQ29udGV4dCB0byBiZSB1c2VkCisgICAgLy8gd2hlbiB3ZSBiaW5kIHRoZSBwYnVmZmVyLiBUaGF0IHByZXZlbnQgc3dpdGNoaW5nIGRyYXdhYmxlIGJpbmRpbmcKKyAgICAvLyBiYWNrIGFuZCBmb3J0aCBvbiBmcmFtZWJ1ZmZlciBjb250ZXh0LgorICAgIC8vIFRoZSBtYWluIHB1cnBvc2Ugb2YgaXQgaXMgdG8gc29sdmUgYSAiYmxhbmtpbmciIGJlaGF2aW91ciB3ZSBzZWUgb24KKyAgICAvLyBvbiBNYWMgcGxhdGZvcm0gd2hlbiBzd2l0Y2hpbmcgYmluZGVkIGRyYXdhYmxlIGZvciBhIGNvbnRleHQgaG93ZXZlcgorICAgIC8vIGl0IGlzIG1vcmUgZWZmaWNpZW50IG9uIG90aGVyIHBsYXRmb3JtcyBhcyB3ZWxsLgorICAgIC8vCisgICAgZmItPm1fcGJ1ZkNvbnRleHQgPSBzX2VnbC5lZ2xDcmVhdGVDb250ZXh0KGZiLT5tX2VnbERpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiLT5tX2VnbENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmItPm1fZWdsQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xDb250ZXh0QXR0cmlicyk7CisgICAgaWYgKGZiLT5tX3BidWZDb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBQYnVmZmVyIENvbnRleHQgMHgleFxuIiwgc19lZ2wuZWdsR2V0RXJyb3IoKSk7CisgICAgICAgIGZyZWUoZ2xlczJFeHRlbnNpb25zKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR0xfTE9HKCJjb250ZXh0IGNyZWF0aW9uIHN1Y2Nlc3NmdWwiKTsKKyAgICAvLworICAgIC8vIGNyZWF0ZSBhIDF4MSBwYnVmZmVyIHN1cmZhY2Ugd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBiaW5kaW5nCisgICAgLy8gdGhlIEZCIGNvbnRleHQuCisgICAgLy8gVGhlIEZCIG91dHB1dCB3aWxsIGdvIHRvIGEgc3Vid2luZG93LCBpZiBvbmUgZXhpc3QuCisgICAgLy8KKyAgICBzdGF0aWMgY29uc3QgRUdMaW50IHBidWZBdHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9XSURUSCwgMSwKKyAgICAgICAgRUdMX0hFSUdIVCwgMSwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworCisgICAgZmItPm1fcGJ1ZlN1cmZhY2UgPSBzX2VnbC5lZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShmYi0+bV9lZ2xEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmItPm1fZWdsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZkF0dHJpYnMpOworICAgIGlmIChmYi0+bV9wYnVmU3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgcGJ1ZiBzdXJmYWNlIGZvciBGQiAweCV4XG4iLCBzX2VnbC5lZ2xHZXRFcnJvcigpKTsKKyAgICAgICAgZnJlZShnbGVzMkV4dGVuc2lvbnMpOworICAgICAgICBkZWxldGUgZmI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBHTF9MT0coImF0dGVtcHRpbmcgdG8gbWFrZSBjb250ZXh0IGN1cnJlbnQiKTsKKyAgICAvLyBNYWtlIHRoZSBjb250ZXh0IGN1cnJlbnQKKyAgICBTY29wZWRCaW5kIGJpbmQoZmIpOworICAgIGlmICghYmluZC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gbWFrZSBjdXJyZW50XG4iKTsKKyAgICAgICAgZnJlZShnbGVzMkV4dGVuc2lvbnMpOworICAgICAgICBkZWxldGUgZmI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgR0xfTE9HKCJjb250ZXh0LWN1cnJlbnQgc3VjY2Vzc2Z1bCIpOworCisgICAgLy8KKyAgICAvLyBJbml0aWxpemUgZnJhbWVidWZmZXIgY2FwYWJpbGl0aWVzCisgICAgLy8KKyAgICAvL2NvbnN0IGNoYXIqIGdsZXMyRXh0ZW5zaW9ucyA9IChjb25zdCBjaGFyICopc19nbGVzMi5nbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKKyAgICBib29sIGhhc19nbF9vZXNfaW1hZ2UgPSBmYWxzZTsKKworLy8gICAgIHByaW50ZigiR0xFUzIgWyVzXVxuIiwgZ2xlczJFeHRlbnNpb25zKTsKKworICAgIGhhc19nbF9vZXNfaW1hZ2UgPSB0cnVlOworCisgICAgaWYgKGhhc19nbF9vZXNfaW1hZ2UpIHsKKyAgICAgICAgaGFzX2dsX29lc19pbWFnZSAmPSBzdHJzdHIoZ2xlczJFeHRlbnNpb25zLCAiR0xfT0VTX0VHTF9pbWFnZSIpICE9IE5VTEw7CisgICAgfQorICAgIGZyZWUoKHZvaWQqKWdsZXMyRXh0ZW5zaW9ucyk7CisgICAgZ2xlczJFeHRlbnNpb25zID0gTlVMTDsKKworICAgIGNvbnN0IGNoYXIgKmVnbEV4dGVuc2lvbnMgPSBzX2VnbC5lZ2xRdWVyeVN0cmluZyhmYi0+bV9lZ2xEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfRVhURU5TSU9OUyk7CisKKyAgICBpZiAoZWdsRXh0ZW5zaW9ucyAmJiBoYXNfZ2xfb2VzX2ltYWdlKSB7CisgICAgICAgIGZiLT5tX2NhcHMuaGFzX2VnbGltYWdlX3RleHR1cmVfMmQgPQorICAgICAgICAgICAgIHN0cnN0cihlZ2xFeHRlbnNpb25zLCAiRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlIikgIT0gTlVMTDsKKyAgICAgICAgZmItPm1fY2Fwcy5oYXNfZWdsaW1hZ2VfcmVuZGVyYnVmZmVyID0KKyAgICAgICAgICAgICBzdHJzdHIoZWdsRXh0ZW5zaW9ucywgIkVHTF9LSFJfZ2xfcmVuZGVyYnVmZmVyX2ltYWdlIikgIT0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZiLT5tX2NhcHMuaGFzX2VnbGltYWdlX3RleHR1cmVfMmQgPSBmYWxzZTsKKyAgICAgICAgZmItPm1fY2Fwcy5oYXNfZWdsaW1hZ2VfcmVuZGVyYnVmZmVyID0gZmFsc2U7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGYWlsIGluaXRpYWxpemF0aW9uIGlmIG5vdCBhbGwgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zCisgICAgLy8gZXhpc3Q6CisgICAgLy8gICAgIEVHTF9LSFJfZ2xfdGV4dHVyZV8yZF9pbWFnZQorICAgIC8vICAgICBHTF9PRVNfRUdMX0lNQUdFIChieSBib3RoIEdMRVMgaW1wbGVtZW50YXRpb25zIFsxIGFuZCAyXSkKKyAgICAvLworICAgIGlmICghZmItPm1fY2Fwcy5oYXNfZWdsaW1hZ2VfdGV4dHVyZV8yZCkgeworICAgICAgICBFUlIoIkZhaWxlZDogTWlzc2luZyBlZ2xfaW1hZ2UgcmVsYXRlZCBleHRlbnNpb24ocylcbiIpOworICAgICAgICBiaW5kLnJlbGVhc2UoKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgR0xfTE9HKCJob3N0IHN5c3RlbSBoYXMgZW5vdWdoIGV4dGVuc2lvbnMiKTsKKyAgICAvLworICAgIC8vIEluaXRpYWxpemUgc2V0IG9mIGNvbmZpZ3MKKyAgICAvLworICAgIGZiLT5tX2NvbmZpZ3MgPSBuZXcgRmJDb25maWdMaXN0KGZiLT5tX2VnbERpc3BsYXkpOworICAgIGlmIChmYi0+bV9jb25maWdzLT5lbXB0eSgpKSB7CisgICAgICAgIEVSUigiRmFpbGVkOiBJbml0aWFsaXplIHNldCBvZiBjb25maWdzXG4iKTsKKyAgICAgICAgYmluZC5yZWxlYXNlKCk7CisgICAgICAgIGRlbGV0ZSBmYjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdGhhdCB3ZSBoYXZlIGNvbmZpZyBmb3IgZWFjaCBHTEVTIGFuZCBHTEVTMgorICAgIC8vCisgICAgc2l6ZV90IG5Db25maWdzID0gZmItPm1fY29uZmlncy0+c2l6ZSgpOworICAgIGludCBuR0xDb25maWdzID0gMDsKKyAgICBpbnQgbkdMMkNvbmZpZ3MgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkNvbmZpZ3M7ICsraSkgeworICAgICAgICBHTGludCBydHlwZSA9IGZiLT5tX2NvbmZpZ3MtPmdldChpKS0+Z2V0UmVuZGVyYWJsZVR5cGUoKTsKKyAgICAgICAgaWYgKDAgIT0gKHJ0eXBlICYgRUdMX09QRU5HTF9FU19CSVQpKSB7CisgICAgICAgICAgICBuR0xDb25maWdzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgIT0gKHJ0eXBlICYgRUdMX09QRU5HTF9FUzJfQklUKSkgeworICAgICAgICAgICAgbkdMMkNvbmZpZ3MrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gRG9uJ3QgZmFpbCBpbml0aWFsaXphdGlvbiBpZiBubyBHTEVTIGNvbmZpZ3MgZXhpc3QKKyAgICAvLworCisgICAgLy8KKyAgICAvLyBJZiBubyBjb25maWdzIGF0IGFsbCwgZXhpdAorICAgIC8vCisgICAgaWYgKG5HTENvbmZpZ3MgKyBuR0wyQ29uZmlncyA9PSAwKSB7CisgICAgICAgIEVSUigiRmFpbGVkOiBObyBHTEVTIDIueCBjb25maWdzIGZvdW5kIVxuIik7CisgICAgICAgIGJpbmQucmVsZWFzZSgpOworICAgICAgICBkZWxldGUgZmI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBHTF9MT0coIlRoZXJlIGFyZSBzdWZmaWNpZW50IEVHTGNvbmZpZ3MgYXZhaWxhYmxlIik7CisKKyAgICAvLworICAgIC8vIENhY2hlIHRoZSBHTCBzdHJpbmdzIHNvIHdlIGRvbid0IGhhdmUgdG8gdGhpbmsgYWJvdXQgdGhyZWFkaW5nIG9yCisgICAgLy8gY3VycmVudC1jb250ZXh0IHdoZW4gYXNrZWQgZm9yIHRoZW0uCisgICAgLy8KKyAgICBmYi0+bV9nbFZlbmRvciA9IChjb25zdCBjaGFyKilzX2dsZXMyLmdsR2V0U3RyaW5nKEdMX1ZFTkRPUik7CisgICAgZmItPm1fZ2xSZW5kZXJlciA9IChjb25zdCBjaGFyKilzX2dsZXMyLmdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKTsKKyAgICBmYi0+bV9nbFZlcnNpb24gPSAoY29uc3QgY2hhciopc19nbGVzMi5nbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKKworICAgIGZiLT5tX3RleHR1cmVEcmF3ID0gbmV3IFRleHR1cmVEcmF3KCk7CisgICAgaWYgKCFmYi0+bV90ZXh0dXJlRHJhdykgeworICAgICAgICBFUlIoIkZhaWxlZDogY3JlYXRpb24gb2YgVGV4dHVyZURyYXcgaW5zdGFuY2VcbiIpOworICAgICAgICBiaW5kLnJlbGVhc2UoKTsKKyAgICAgICAgZGVsZXRlIGZiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gcmVsZWFzZSB0aGUgRkIgY29udGV4dAorICAgIGJpbmQucmVsZWFzZSgpOworCisgICAgLy8KKyAgICAvLyBLZWVwIHRoZSBzaW5nbGV0b24gZnJhbWVidWZmZXIgcG9pbnRlcgorICAgIC8vCisgICAgc190aGVGcmFtZUJ1ZmZlciA9IGZiOworICAgIEdMX0xPRygiYmFzaWMgRUdMIGluaXRpYWxpemF0aW9uIHN1Y2Nlc3NmdWwiKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworRnJhbWVCdWZmZXI6OkZyYW1lQnVmZmVyKGludCBwX3dpZHRoLCBpbnQgcF9oZWlnaHQsIGJvb2wgdXNlU3ViV2luZG93KSA6CisgICAgbV9mcmFtZWJ1ZmZlcldpZHRoKHBfd2lkdGgpLAorICAgIG1fZnJhbWVidWZmZXJIZWlnaHQocF9oZWlnaHQpLAorICAgIG1fd2luZG93V2lkdGgocF93aWR0aCksCisgICAgbV93aW5kb3dIZWlnaHQocF9oZWlnaHQpLAorICAgIG1fdXNlU3ViV2luZG93KHVzZVN1YldpbmRvdyksCisgICAgbV9mcHNTdGF0cyhnZXRlbnYoIlNIT1dfRlBTX1NUQVRTIikgIT0gbnVsbHB0ciksCisgICAgbV9jb2xvckJ1ZmZlckhlbHBlcihuZXcgQ29sb3JCdWZmZXJIZWxwZXIodGhpcykpIHt9CisKK0ZyYW1lQnVmZmVyOjp+RnJhbWVCdWZmZXIoKSB7CisgICAgZGVsZXRlIG1fdGV4dHVyZURyYXc7CisgICAgZGVsZXRlIG1fY29uZmlnczsKKyAgICBkZWxldGUgbV9jb2xvckJ1ZmZlckhlbHBlcjsKKyAgICBmcmVlKG1fZmJJbWFnZSk7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OnNldFBvc3RDYWxsYmFjayhlbXVnbDo6UmVuZGVyZXI6Ok9uUG9zdENhbGxiYWNrIG9uUG9zdCwgdm9pZCogb25Qb3N0Q29udGV4dCkKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgbV9vblBvc3QgPSBvblBvc3Q7CisgICAgbV9vblBvc3RDb250ZXh0ID0gb25Qb3N0Q29udGV4dDsKKyAgICBpZiAobV9vblBvc3QgJiYgIW1fZmJJbWFnZSkgeworICAgICAgICBtX2ZiSW1hZ2UgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKDQgKiBtX2ZyYW1lYnVmZmVyV2lkdGggKiBtX2ZyYW1lYnVmZmVySGVpZ2h0KTsKKyAgICAgICAgaWYgKCFtX2ZiSW1hZ2UpIHsKKyAgICAgICAgICAgIEVSUigib3V0IG9mIG1lbW9yeSwgY2FuY2VsbGluZyBPblBvc3QgY2FsbGJhY2siKTsKKyAgICAgICAgICAgIG1fb25Qb3N0ID0gTlVMTDsKKyAgICAgICAgICAgIG1fb25Qb3N0Q29udGV4dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN1YldpbmRvd1JlcGFpbnQodm9pZCogcGFyYW0pIHsKKyAgICBhdXRvIGZiID0gc3RhdGljX2Nhc3Q8RnJhbWVCdWZmZXIqPihwYXJhbSk7CisgICAgZmItPnJlcG9zdCgpOworfQorCitib29sIEZyYW1lQnVmZmVyOjpzZXR1cFN1YldpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgcF93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZiaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpSb3QpIHsKKyAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgIGlmICghbV91c2VTdWJXaW5kb3cpIHsKKyAgICAgICAgRVJSKCIlczogQ2Fubm90IGNyZWF0ZSBuYXRpdmUgc3ViLXdpbmRvdyBpbiB0aGlzIGNvbmZpZ3VyYXRpb25cbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgLy8gSWYgdGhlIHN1YndpbmRvdyBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZGltZW5zaW9ucworICAgIGlmICghbV9zdWJXaW4pIHsKKworICAgICAgICAvLyBDcmVhdGUgbmF0aXZlIHN1YndpbmRvdyBmb3IgRkIgZGlzcGxheSBvdXRwdXQKKyAgICAgICAgbV94ID0gd3g7CisgICAgICAgIG1feSA9IHd5OworICAgICAgICBtX3dpbmRvd1dpZHRoID0gd3c7CisgICAgICAgIG1fd2luZG93SGVpZ2h0ID0gd2g7CisKKyAgICAgICAgbV9zdWJXaW4gPSBjcmVhdGVTdWJXaW5kb3cocF93aW5kb3csIG1feCwgbV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3dpbmRvd1dpZHRoLCBtX3dpbmRvd0hlaWdodCwgc3ViV2luZG93UmVwYWludCwgdGhpcyk7CisgICAgICAgIGlmIChtX3N1YldpbikgeworICAgICAgICAgICAgbV9uYXRpdmVXaW5kb3cgPSBwX3dpbmRvdzsKKworICAgICAgICAgICAgLy8gY3JlYXRlIEVHTFN1cmZhY2UgZnJvbSB0aGUgZ2VuZXJhdGVkIHN1YndpbmRvdworICAgICAgICAgICAgbV9lZ2xTdXJmYWNlID0gc19lZ2wuZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtX2VnbERpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZWdsQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N1YldpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgIGlmIChtX2VnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhbiB0eXBpY2FsbHkgaGFwcGVuIHdpdGggc29mdHdhcmUtb25seSByZW5kZXJlcnMgbGlrZSBPU01lc2EuCisgICAgICAgICAgICAgICAgZGVzdHJveVN1YldpbmRvdyhtX3N1Yldpbik7CisgICAgICAgICAgICAgICAgbV9zdWJXaW4gPSAoRUdMTmF0aXZlV2luZG93VHlwZSkwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX3B4ID0gMDsKKyAgICAgICAgICAgICAgICBtX3B5ID0gMDsKKworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXQgdGhpcyBwb2ludCwgaWYgdGhlIHN1YndpbmRvdyBkb2Vzbid0IGV4aXN0LCBpdCBpcyBiZWNhdXNlIGl0IGVpdGhlciBjb3VsZG4ndCBiZSBjcmVhdGVkCisgICAgLy8gaW4gdGhlIGZpcnN0IHBsYWNlIG9yIHRoZSBFR0xTdXJmYWNlIGNvdWxkbid0IGJlIGNyZWF0ZWQuCisgICAgaWYgKG1fc3ViV2luICYmIGJpbmRTdWJ3aW5fbG9ja2VkKCkpIHsKKworICAgICAgICAvLyBPbmx5IGF0dGVtcHQgdG8gdXBkYXRlIHdpbmRvdyBnZW9tZXRyeSBpZiBhbnl0aGluZyBoYXMgYWN0dWFsbHkgY2hhbmdlZC4KKyAgICAgICAgYm9vbCB1cGRhdGVTdWJXaW5kb3cgPSAhKG1feCA9PSB3eCAmJiBtX3kgPT0gd3kgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fd2luZG93V2lkdGggPT0gd3cgJiYgbV93aW5kb3dIZWlnaHQgPT0gd2gpOworCisgICAgICAgIC8vIE9uIE1hYywgc2luY2Ugd2luZG93IGNvb3JkaW5hdGVzIGFyZSBZLXVwIGFuZCBub3QgWS1kb3duLCB0aGUKKyAgICAgICAgLy8gc3Vid2luZG93IG1heSBub3QgY2hhbmdlIGRpbWVuc2lvbnMsIGJ1dCBiZWNhdXNlIHRoZSBtYWluIHdpbmRvdworICAgICAgICAvLyBkaWQsIHRoZSBzdWJ3aW5kb3cgdGVjaG5pY2FsbHkgbmVlZHMgdG8gYmUgcmUtcG9zaXRpb25lZC4gVGhpcworICAgICAgICAvLyBjYW4gaGFwcGVuIG9uIHJvdGF0aW9uLCBzbyBhIGNoYW5nZSBpbiBaLXJvdGF0aW9uIGNhbiBiZSBjaGVja2VkCisgICAgICAgIC8vIGZvciB0aGlzIGNhc2UuIEhvd2V2ZXIsIHRoaXMgKnNob3VsZCBub3QqIGJlIGRvbmUgb24gV2luZG93cy9MaW51eCwKKyAgICAgICAgLy8gYmVjYXVzZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gcmVzaXplIGEgbmF0aXZlIHdpbmRvdyBvbiB0aG9zZSBob3N0cworICAgICAgICAvLyB3aWxsIGJsb2NrIGlmIHRoZSBzaGFwZSBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZSwgZnJlZXppbmcgdGhlCisgICAgICAgIC8vIGVtdWxhdG9yLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgICAgICB1cGRhdGVTdWJXaW5kb3cgfD0gKG1felJvdCAhPSB6Um90KTsKKyNlbmRpZgorICAgICAgICBpZiAodXBkYXRlU3ViV2luZG93KSB7CisKKyAgICAgICAgICAgIG1feCA9IHd4OworICAgICAgICAgICAgbV95ID0gd3k7CisgICAgICAgICAgICBtX3dpbmRvd1dpZHRoID0gd3c7CisgICAgICAgICAgICBtX3dpbmRvd0hlaWdodCA9IHdoOworCisgICAgICAgICAgICBzdWNjZXNzID0gOjptb3ZlU3ViV2luZG93KG1fbmF0aXZlV2luZG93LCBtX3N1YldpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV94LCBtX3ksIG1fd2luZG93V2lkdGgsIG1fd2luZG93SGVpZ2h0KTsKKworICAgICAgICAvLyBPdGhlcndpc2UsIGVuc3VyZSB0aGF0IGF0IGxlYXN0IHZpZXdwb3J0IHBhcmFtZXRlcnMgYXJlIHByb3Blcmx5IHVwZGF0ZWQuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAvLyBTdWJ3aW4gY3JlYXRpb24gb3IgbW92ZW1lbnQgd2FzIHN1Y2Nlc3NmdWwsCisgICAgICAgICAgICAvLyB1cGRhdGUgdmlld3BvcnQgYW5kIHogcm90YXRpb24gYW5kIGRyYXcKKyAgICAgICAgICAgIC8vIHRoZSBsYXN0IHBvc3RlZCBjb2xvciBidWZmZXIuCisgICAgICAgICAgICBzX2dsZXMyLmdsVmlld3BvcnQoMCwgMCwgZmJ3ICogZHByLCBmYmggKiBkcHIpOworICAgICAgICAgICAgbV9kcHIgPSBkcHI7CisgICAgICAgICAgICBtX3pSb3QgPSB6Um90OworICAgICAgICAgICAgaWYgKG1fbGFzdFBvc3RlZENvbG9yQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcG9zdChtX2xhc3RQb3N0ZWRDb2xvckJ1ZmZlciwgZmFsc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzX2dsZXMyLmdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX0RFUFRIX0JVRkZFUl9CSVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQpOworICAgICAgICAgICAgICAgIHNfZWdsLmVnbFN3YXBCdWZmZXJzKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1bmJpbmRfbG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OnJlbW92ZVN1YldpbmRvdygpIHsKKyAgICBpZiAoIW1fdXNlU3ViV2luZG93KSB7CisgICAgICAgIEVSUigiJXM6IENhbm5vdCByZW1vdmUgbmF0aXZlIHN1Yi13aW5kb3cgaW4gdGhpcyBjb25maWd1cmF0aW9uXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIHJlbW92ZWQgPSBmYWxzZTsKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgaWYgKG1fc3ViV2luKSB7CisgICAgICAgIHNfZWdsLmVnbE1ha2VDdXJyZW50KG1fZWdsRGlzcGxheSwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHNfZWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlKTsKKyAgICAgICAgZGVzdHJveVN1YldpbmRvdyhtX3N1Yldpbik7CisKKyAgICAgICAgbV9lZ2xTdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisgICAgICAgIG1fc3ViV2luID0gKEVHTE5hdGl2ZVdpbmRvd1R5cGUpMDsKKyAgICAgICAgcmVtb3ZlZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiByZW1vdmVkOworfQorCitIYW5kbGVUeXBlIEZyYW1lQnVmZmVyOjpnZW5IYW5kbGUoKQoreworICAgIEhhbmRsZVR5cGUgaWQ7CisgICAgZG8geworICAgICAgICBpZCA9ICsrc19uZXh0SGFuZGxlOworICAgIH0gd2hpbGUoIGlkID09IDAgfHwKKyAgICAgICAgICAgICBtX2NvbnRleHRzLmZpbmQoaWQpICE9IG1fY29udGV4dHMuZW5kKCkgfHwKKyAgICAgICAgICAgICBtX3dpbmRvd3MuZmluZChpZCkgIT0gbV93aW5kb3dzLmVuZCgpICk7CisKKyAgICByZXR1cm4gaWQ7Cit9CisKK0hhbmRsZVR5cGUgRnJhbWVCdWZmZXI6OmNyZWF0ZUNvbG9yQnVmZmVyKGludCBwX3dpZHRoLCBpbnQgcF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gcF9pbnRlcm5hbEZvcm1hdCkKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgSGFuZGxlVHlwZSByZXQgPSAwOworCisgICAgQ29sb3JCdWZmZXJQdHIgY2IoQ29sb3JCdWZmZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgIGdldERpc3BsYXkoKSwKKyAgICAgICAgICAgIHBfd2lkdGgsCisgICAgICAgICAgICBwX2hlaWdodCwKKyAgICAgICAgICAgIHBfaW50ZXJuYWxGb3JtYXQsCisgICAgICAgICAgICBnZXRDYXBzKCkuaGFzX2VnbGltYWdlX3RleHR1cmVfMmQsCisgICAgICAgICAgICBtX2NvbG9yQnVmZmVySGVscGVyKSk7CisgICAgaWYgKGNiLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gZ2VuSGFuZGxlKCk7CisgICAgICAgIG1fY29sb3JidWZmZXJzW3JldF0uY2IgPSBjYjsKKyAgICAgICAgbV9jb2xvcmJ1ZmZlcnNbcmV0XS5yZWZjb3VudCA9IDE7CisKKyAgICAgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICAgICAgdWludDY0X3QgcHVpZCA9IHRJbmZvLT5tX3B1aWQ7CisgICAgICAgIGlmIChwdWlkKSB7CisgICAgICAgICAgICBtX3Byb2NPd25lZENvbG9yQnVmZmVyc1twdWlkXS5pbnNlcnQocmV0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitIYW5kbGVUeXBlIEZyYW1lQnVmZmVyOjpjcmVhdGVSZW5kZXJDb250ZXh0KGludCBwX2NvbmZpZywgSGFuZGxlVHlwZSBwX3NoYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBfaXNHTDIpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIGVtdWdsOjpSZWFkV3JpdGVNdXRleDo6QXV0b1dyaXRlTG9jayBjb250ZXh0TG9jayhtX2NvbnRleHRTdHJ1Y3R1cmVMb2NrKTsKKyAgICBIYW5kbGVUeXBlIHJldCA9IDA7CisKKyAgICBjb25zdCBGYkNvbmZpZyogY29uZmlnID0gZ2V0Q29uZmlncygpLT5nZXQocF9jb25maWcpOworICAgIGlmICghY29uZmlnKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgUmVuZGVyQ29udGV4dFB0ciBzaGFyZTsKKyAgICBpZiAocF9zaGFyZSAhPSAwKSB7CisgICAgICAgIFJlbmRlckNvbnRleHRNYXA6Oml0ZXJhdG9yIHMobV9jb250ZXh0cy5maW5kKHBfc2hhcmUpKTsKKyAgICAgICAgaWYgKHMgPT0gbV9jb250ZXh0cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzaGFyZSA9ICgqcykuc2Vjb25kOworICAgIH0KKyAgICBFR0xDb250ZXh0IHNoYXJlZENvbnRleHQgPQorICAgICAgICAgICAgc2hhcmUuZ2V0KCkgPyBzaGFyZS0+Z2V0RUdMQ29udGV4dCgpIDogRUdMX05PX0NPTlRFWFQ7CisKKyAgICBSZW5kZXJDb250ZXh0UHRyIHJjdHgoUmVuZGVyQ29udGV4dDo6Y3JlYXRlKAorICAgICAgICBtX2VnbERpc3BsYXksIGNvbmZpZy0+Z2V0RWdsQ29uZmlnKCksIHNoYXJlZENvbnRleHQsIHBfaXNHTDIpKTsKKyAgICBpZiAocmN0eC5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIHJldCA9IGdlbkhhbmRsZSgpOworICAgICAgICBtX2NvbnRleHRzW3JldF0gPSByY3R4OworICAgICAgICBSZW5kZXJUaHJlYWRJbmZvICp0aW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgICAgICB1aW50NjRfdCBwdWlkID0gdGluZm8tPm1fcHVpZDsKKyAgICAgICAgLy8gVGhlIG5ldyBlbXVsYXRvciBtYW5hZ2VzIHJlbmRlciBjb250ZXh0cyBwZXIgZ3Vlc3QgcHJvY2Vzcy4KKyAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHBlci10aHJlYWQgbWFuYWdlbWVudCBpZiB0aGUgc3lzdGVtIGltYWdlIGRvZXMgbm90CisgICAgICAgIC8vIHN1cHBvcnQgaXQuCisgICAgICAgIGlmIChwdWlkKSB7CisgICAgICAgICAgICBtX3Byb2NPd25lZFJlbmRlckNvbnRleHRbcHVpZF0uaW5zZXJ0KHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aW5mby0+bV9jb250ZXh0U2V0Lmluc2VydChyZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworSGFuZGxlVHlwZSBGcmFtZUJ1ZmZlcjo6Y3JlYXRlV2luZG93U3VyZmFjZShpbnQgcF9jb25maWcsIGludCBwX3dpZHRoLCBpbnQgcF9oZWlnaHQpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgSGFuZGxlVHlwZSByZXQgPSAwOworCisgICAgY29uc3QgRmJDb25maWcqIGNvbmZpZyA9IGdldENvbmZpZ3MoKS0+Z2V0KHBfY29uZmlnKTsKKyAgICBpZiAoIWNvbmZpZykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFdpbmRvd1N1cmZhY2VQdHIgd2luKFdpbmRvd1N1cmZhY2U6OmNyZWF0ZSgKKyAgICAgICAgICAgIGdldERpc3BsYXkoKSwgY29uZmlnLT5nZXRFZ2xDb25maWcoKSwgcF93aWR0aCwgcF9oZWlnaHQpKTsKKyAgICBpZiAod2luLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gZ2VuSGFuZGxlKCk7CisgICAgICAgIG1fd2luZG93c1tyZXRdID0gc3RkOjpwYWlyPFdpbmRvd1N1cmZhY2VQdHIsIEhhbmRsZVR5cGU+KHdpbiwwKTsKKyAgICAgICAgUmVuZGVyVGhyZWFkSW5mbyAqdGluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICAgICAgdGluZm8tPm1fd2luZG93U2V0Lmluc2VydChyZXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmRyYWluUmVuZGVyQ29udGV4dCgpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIGVtdWdsOjpSZWFkV3JpdGVNdXRleDo6QXV0b1dyaXRlTG9jayBjb250ZXh0TG9jayhtX2NvbnRleHRTdHJ1Y3R1cmVMb2NrKTsKKyAgICBSZW5kZXJUaHJlYWRJbmZvICp0aW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgIGlmICh0aW5mby0+bV9jb250ZXh0U2V0LmVtcHR5KCkpIHJldHVybjsKKyAgICBmb3IgKHN0ZDo6c2V0PEhhbmRsZVR5cGU+OjppdGVyYXRvciBpdCA9IHRpbmZvLT5tX2NvbnRleHRTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IHRpbmZvLT5tX2NvbnRleHRTZXQuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgSGFuZGxlVHlwZSBjb250ZXh0SGFuZGxlID0gKml0OworICAgICAgICBtX2NvbnRleHRzLmVyYXNlKGNvbnRleHRIYW5kbGUpOworICAgIH0KKyAgICB0aW5mby0+bV9jb250ZXh0U2V0LmNsZWFyKCk7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmRyYWluV2luZG93U3VyZmFjZSgpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIFJlbmRlclRocmVhZEluZm8gKnRpbmZvID0gUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCk7CisgICAgaWYgKHRpbmZvLT5tX3dpbmRvd1NldC5lbXB0eSgpKSByZXR1cm47CisgICAgZm9yIChzdGQ6OnNldDxIYW5kbGVUeXBlPjo6aXRlcmF0b3IgaXQgPSB0aW5mby0+bV93aW5kb3dTZXQuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IHRpbmZvLT5tX3dpbmRvd1NldC5lbmQoKTsgKytpdCkgeworICAgICAgICBIYW5kbGVUeXBlIHdpbmRvd0hhbmRsZSA9ICppdDsKKyAgICAgICAgaWYgKG1fd2luZG93cy5maW5kKHdpbmRvd0hhbmRsZSkgIT0gbV93aW5kb3dzLmVuZCgpKSB7CisgICAgICAgICAgICBIYW5kbGVUeXBlIG9sZENvbG9yQnVmZmVySGFuZGxlID0gbV93aW5kb3dzW3dpbmRvd0hhbmRsZV0uc2Vjb25kOworICAgICAgICAgICAgaWYgKG9sZENvbG9yQnVmZmVySGFuZGxlKSB7CisgICAgICAgICAgICAgICAgQ29sb3JCdWZmZXJNYXA6Oml0ZXJhdG9yIGNpdChtX2NvbG9yYnVmZmVycy5maW5kKG9sZENvbG9yQnVmZmVySGFuZGxlKSk7CisgICAgICAgICAgICAgICAgaWYgKGNpdCAhPSBtX2NvbG9yYnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoLS0oKmNpdCkuc2Vjb25kLnJlZmNvdW50ID09IDApIHsgbV9jb2xvcmJ1ZmZlcnMuZXJhc2UoY2l0KTsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fd2luZG93cy5lcmFzZSh3aW5kb3dIYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIHRpbmZvLT5tX3dpbmRvd1NldC5jbGVhcigpOworfQorCit2b2lkIEZyYW1lQnVmZmVyOjpEZXN0cm95UmVuZGVyQ29udGV4dChIYW5kbGVUeXBlIHBfY29udGV4dCkKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgZW11Z2w6OlJlYWRXcml0ZU11dGV4OjpBdXRvV3JpdGVMb2NrIGNvbnRleHRMb2NrKG1fY29udGV4dFN0cnVjdHVyZUxvY2spOworICAgIG1fY29udGV4dHMuZXJhc2UocF9jb250ZXh0KTsKKyAgICBSZW5kZXJUaHJlYWRJbmZvICp0aW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgIHVpbnQ2NF90IHB1aWQgPSB0aW5mby0+bV9wdWlkOworICAgIC8vIFRoZSBuZXcgZW11bGF0b3IgbWFuYWdlcyByZW5kZXIgY29udGV4dHMgcGVyIGd1ZXN0IHByb2Nlc3MuCisgICAgLy8gRmFsbCBiYWNrIHRvIHBlci10aHJlYWQgbWFuYWdlbWVudCBpZiB0aGUgc3lzdGVtIGltYWdlIGRvZXMgbm90CisgICAgLy8gc3VwcG9ydCBpdC4KKyAgICBpZiAocHVpZCkgeworICAgICAgICBhdXRvIGl0ZSA9IG1fcHJvY093bmVkUmVuZGVyQ29udGV4dC5maW5kKHB1aWQpOworICAgICAgICBpZiAoaXRlICE9IG1fcHJvY093bmVkUmVuZGVyQ29udGV4dC5lbmQoKSkgeworICAgICAgICAgICAgaXRlLT5zZWNvbmQuZXJhc2UocF9jb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRpbmZvLT5tX2NvbnRleHRTZXQuZXJhc2UocF9jb250ZXh0KTsKKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OkRlc3Ryb3lXaW5kb3dTdXJmYWNlKEhhbmRsZVR5cGUgcF9zdXJmYWNlKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBpZiAobV93aW5kb3dzLmVyYXNlKHBfc3VyZmFjZSkgIT0gMCkgeworICAgICAgICBSZW5kZXJUaHJlYWRJbmZvICp0aW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgICAgICB0aW5mby0+bV93aW5kb3dTZXQuZXJhc2UocF9zdXJmYWNlKTsKKyAgICB9Cit9CisKK2ludCBGcmFtZUJ1ZmZlcjo6b3BlbkNvbG9yQnVmZmVyKEhhbmRsZVR5cGUgcF9jb2xvcmJ1ZmZlcikgeworICAgIFJlbmRlclRocmVhZEluZm8gKnRJbmZvID0gUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCk7CisKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisKKyAgICBDb2xvckJ1ZmZlck1hcDo6aXRlcmF0b3IgYyhtX2NvbG9yYnVmZmVycy5maW5kKHBfY29sb3JidWZmZXIpKTsKKyAgICBpZiAoYyA9PSBtX2NvbG9yYnVmZmVycy5lbmQoKSkgeworICAgICAgICAvLyBiYWQgY29sb3JidWZmZXIgaGFuZGxlCisgICAgICAgIEVSUigiRkI6IG9wZW5Db2xvckJ1ZmZlciBjYiBoYW5kbGUgJSN4IG5vdCBmb3VuZFxuIiwgcF9jb2xvcmJ1ZmZlcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKCpjKS5zZWNvbmQucmVmY291bnQrKzsKKworICAgIHVpbnQ2NF90IHB1aWQgPSB0SW5mby0+bV9wdWlkOworICAgIGlmIChwdWlkKSB7CisgICAgICAgIG1fcHJvY093bmVkQ29sb3JCdWZmZXJzW3B1aWRdLmluc2VydChwX2NvbG9yYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmNsb3NlQ29sb3JCdWZmZXIoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyKSB7CisgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKyAgICBjbG9zZUNvbG9yQnVmZmVyTG9ja2VkKHBfY29sb3JidWZmZXIpOworICAgIHVpbnQ2NF90IHB1aWQgPSB0SW5mby0+bV9wdWlkOworICAgIGlmIChwdWlkKSB7CisgICAgICAgIGF1dG8gaXRlID0gbV9wcm9jT3duZWRDb2xvckJ1ZmZlcnMuZmluZChwdWlkKTsKKyAgICAgICAgaWYgKGl0ZSAhPSBtX3Byb2NPd25lZENvbG9yQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaXRlLT5zZWNvbmQuZXJhc2UocF9jb2xvcmJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmNsb3NlQ29sb3JCdWZmZXJMb2NrZWQoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyKSB7CisgICAgQ29sb3JCdWZmZXJNYXA6Oml0ZXJhdG9yIGMobV9jb2xvcmJ1ZmZlcnMuZmluZChwX2NvbG9yYnVmZmVyKSk7CisgICAgaWYgKGMgPT0gbV9jb2xvcmJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBoYXJtbGVzczogaXQgaXMgbm9ybWFsIGZvciBndWVzdCBzeXN0ZW0gdG8gaXNzdWUKKyAgICAgICAgLy8gY2xvc2VDb2xvckJ1ZmZlciBjb21tYW5kIHdoZW4gdGhlIGNvbG9yIGJ1ZmZlciBpcyBhbHJlYWR5CisgICAgICAgIC8vIGdhcmJhZ2UgY29sbGVjdGVkIG9uIHRoZSBob3N0LiAod2UgZG9udCBoYXZlIGEgbWVjaGFuaXNtCisgICAgICAgIC8vIHRvIGdpdmUgZ3Vlc3QgYSBub3RpY2UgeWV0KQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgtLSgqYykuc2Vjb25kLnJlZmNvdW50ID09IDApIHsKKyAgICAgICAgbV9jb2xvcmJ1ZmZlcnMuZXJhc2UoYyk7CisgICAgfQorfQorCit2b2lkIEZyYW1lQnVmZmVyOjpjbGVhbnVwUHJvY0dMT2JqZWN0cyh1aW50NjRfdCBwdWlkKSB7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgIC8vIENsZWFuIHVwIGNvbG9yIGJ1ZmZlcnMuCisgICAgLy8gQSBjb2xvciBidWZmZXIgbmVlZHMgdG8gYmUgY2xvc2VkIGFzIG1hbnkgdGltZXMgYXMgaXQgaXMgb3BlbmVkIGJ5CisgICAgLy8gdGhlIGd1ZXN0IHByb2Nlc3MsIHRvIGdpdmUgdGhlIGNvcnJlY3QgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIChOb3RlIHRoYXQgYSBjb2xvciBidWZmZXIgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgZ3Vlc3QgcHJvY2Vzc2VzLikKKyAgICB7CisgICAgICAgIGF1dG8gcHJvY0l0ZSA9IG1fcHJvY093bmVkQ29sb3JCdWZmZXJzLmZpbmQocHVpZCk7CisgICAgICAgIGlmIChwcm9jSXRlICE9IG1fcHJvY093bmVkQ29sb3JCdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY2I6IHByb2NJdGUtPnNlY29uZCkgeworICAgICAgICAgICAgICAgIGNsb3NlQ29sb3JCdWZmZXJMb2NrZWQoY2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wcm9jT3duZWRDb2xvckJ1ZmZlcnMuZXJhc2UocHJvY0l0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cCBFR0xJbWFnZSBoYW5kbGVzCisgICAgeworICAgICAgICAvLyBCaW5kIGNvbnRleHQgYmVmb3JlIHBvdGVudGlhbGx5IHRyaWdnZXJpbmcgYW55IGdsIGNhbGxzCisgICAgICAgIFNjb3BlZEJpbmQgYmluZCh0aGlzKTsKKyAgICAgICAgYXV0byBwcm9jSXRlID0gbV9wcm9jT3duZWRFR0xJbWFnZXMuZmluZChwdWlkKTsKKyAgICAgICAgaWYgKHByb2NJdGUgIT0gbV9wcm9jT3duZWRFR0xJbWFnZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBlZ2xJbWcgOiBwcm9jSXRlLT5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICBzX2VnbC5lZ2xEZXN0cm95SW1hZ2VLSFIobV9lZ2xEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RUdMSW1hZ2VLSFI+KChIYW5kbGVUeXBlKWVnbEltZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wcm9jT3duZWRFR0xJbWFnZXMuZXJhc2UocHJvY0l0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDbGVhbnVwIHJlbmRlciBjb250ZXh0cworICAgIHsKKyAgICAgICAgYXV0byBwcm9jSXRlID0gbV9wcm9jT3duZWRSZW5kZXJDb250ZXh0LmZpbmQocHVpZCk7CisgICAgICAgIGlmIChwcm9jSXRlICE9IG1fcHJvY093bmVkUmVuZGVyQ29udGV4dC5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGN0eDogcHJvY0l0ZS0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgbV9jb250ZXh0cy5lcmFzZShjdHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wcm9jT3duZWRSZW5kZXJDb250ZXh0LmVyYXNlKHByb2NJdGUpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEZyYW1lQnVmZmVyOjpmbHVzaFdpbmRvd1N1cmZhY2VDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfc3VyZmFjZSkKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisKKyAgICBXaW5kb3dTdXJmYWNlTWFwOjppdGVyYXRvciB3KCBtX3dpbmRvd3MuZmluZChwX3N1cmZhY2UpICk7CisgICAgaWYgKHcgPT0gbV93aW5kb3dzLmVuZCgpKSB7CisgICAgICAgIEVSUigiRkI6OmZsdXNoV2luZG93U3VyZmFjZUNvbG9yQnVmZmVyOiB3aW5kb3cgaGFuZGxlICUjeCBub3QgZm91bmRcbiIsIHBfc3VyZmFjZSk7CisgICAgICAgIC8vIGJhZCBzdXJmYWNlIGhhbmRsZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgV2luZG93U3VyZmFjZSogc3VyZmFjZSA9ICgqdykuc2Vjb25kLmZpcnN0LmdldCgpOworICAgIHN1cmZhY2UtPmZsdXNoQ29sb3JCdWZmZXIoKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZyYW1lQnVmZmVyOjpzZXRXaW5kb3dTdXJmYWNlQ29sb3JCdWZmZXIoSGFuZGxlVHlwZSBwX3N1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKworICAgIFdpbmRvd1N1cmZhY2VNYXA6Oml0ZXJhdG9yIHcoIG1fd2luZG93cy5maW5kKHBfc3VyZmFjZSkgKTsKKyAgICBpZiAodyA9PSBtX3dpbmRvd3MuZW5kKCkpIHsKKyAgICAgICAgLy8gYmFkIHN1cmZhY2UgaGFuZGxlCisgICAgICAgIEVSUigiJXM6IGJhZCB3aW5kb3cgc3VyZmFjZSBoYW5kbGUgJSN4XG4iLCBfX0ZVTkNUSU9OX18sIHBfc3VyZmFjZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDb2xvckJ1ZmZlck1hcDo6aXRlcmF0b3IgYyggbV9jb2xvcmJ1ZmZlcnMuZmluZChwX2NvbG9yYnVmZmVyKSApOworICAgIGlmIChjID09IG1fY29sb3JidWZmZXJzLmVuZCgpKSB7CisgICAgICAgIERCRygiJXM6IGJhZCBjb2xvciBidWZmZXIgaGFuZGxlICUjeFxuIiwgX19GVU5DVElPTl9fLCBwX2NvbG9yYnVmZmVyKTsKKyAgICAgICAgLy8gYmFkIGNvbG9yYnVmZmVyIGhhbmRsZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKCp3KS5zZWNvbmQuZmlyc3QtPnNldENvbG9yQnVmZmVyKCgqYykuc2Vjb25kLmNiKTsKKyAgICAoKncpLnNlY29uZC5zZWNvbmQgPSBwX2NvbG9yYnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZyYW1lQnVmZmVyOjpyZWFkQ29sb3JCdWZmZXIoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgdm9pZCAqcGl4ZWxzKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKworICAgIENvbG9yQnVmZmVyTWFwOjppdGVyYXRvciBjKCBtX2NvbG9yYnVmZmVycy5maW5kKHBfY29sb3JidWZmZXIpICk7CisgICAgaWYgKGMgPT0gbV9jb2xvcmJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYmFkIGNvbG9yYnVmZmVyIGhhbmRsZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKCpjKS5zZWNvbmQuY2ItPnJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCitib29sIEZyYW1lQnVmZmVyOjp1cGRhdGVDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpCit7CisgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworCisgICAgQ29sb3JCdWZmZXJNYXA6Oml0ZXJhdG9yIGMoIG1fY29sb3JidWZmZXJzLmZpbmQocF9jb2xvcmJ1ZmZlcikgKTsKKyAgICBpZiAoYyA9PSBtX2NvbG9yYnVmZmVycy5lbmQoKSkgeworICAgICAgICAvLyBiYWQgY29sb3JidWZmZXIgaGFuZGxlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAoKmMpLnNlY29uZC5jYi0+c3ViVXBkYXRlKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEZyYW1lQnVmZmVyOjpiaW5kQ29sb3JCdWZmZXJUb1RleHR1cmUoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKworICAgIENvbG9yQnVmZmVyTWFwOjppdGVyYXRvciBjKCBtX2NvbG9yYnVmZmVycy5maW5kKHBfY29sb3JidWZmZXIpICk7CisgICAgaWYgKGMgPT0gbV9jb2xvcmJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgLy8gYmFkIGNvbG9yYnVmZmVyIGhhbmRsZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICgqYykuc2Vjb25kLmNiLT5iaW5kVG9UZXh0dXJlKCk7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OmJpbmRDb2xvckJ1ZmZlclRvUmVuZGVyYnVmZmVyKEhhbmRsZVR5cGUgcF9jb2xvcmJ1ZmZlcikKK3sKKyAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisKKyAgICBDb2xvckJ1ZmZlck1hcDo6aXRlcmF0b3IgYyggbV9jb2xvcmJ1ZmZlcnMuZmluZChwX2NvbG9yYnVmZmVyKSApOworICAgIGlmIChjID09IG1fY29sb3JidWZmZXJzLmVuZCgpKSB7CisgICAgICAgIC8vIGJhZCBjb2xvcmJ1ZmZlciBoYW5kbGUKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAoKmMpLnNlY29uZC5jYi0+YmluZFRvUmVuZGVyYnVmZmVyKCk7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OmJpbmRDb250ZXh0KEhhbmRsZVR5cGUgcF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSBwX2RyYXdTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSBwX3JlYWRTdXJmYWNlKQoreworICAgIGVtdWdsOjpNdXRleDo6QXV0b0xvY2sgbXV0ZXgobV9sb2NrKTsKKworICAgIFdpbmRvd1N1cmZhY2VQdHIgZHJhdywgcmVhZDsKKyAgICBSZW5kZXJDb250ZXh0UHRyIGN0eDsKKworICAgIC8vCisgICAgLy8gaWYgdGhpcyBpcyBub3QgYW4gdW5iaW5kIG9wZXJhdGlvbiAtIG1ha2Ugc3VyZSBhbGwgaGFuZGxlcyBhcmUgZ29vZAorICAgIC8vCisgICAgaWYgKHBfY29udGV4dCB8fCBwX2RyYXdTdXJmYWNlIHx8IHBfcmVhZFN1cmZhY2UpIHsKKyAgICAgICAgUmVuZGVyQ29udGV4dE1hcDo6aXRlcmF0b3IgciggbV9jb250ZXh0cy5maW5kKHBfY29udGV4dCkgKTsKKyAgICAgICAgaWYgKHIgPT0gbV9jb250ZXh0cy5lbmQoKSkgeworICAgICAgICAgICAgLy8gYmFkIGNvbnRleHQgaGFuZGxlCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjdHggPSAoKnIpLnNlY29uZDsKKyAgICAgICAgV2luZG93U3VyZmFjZU1hcDo6aXRlcmF0b3IgdyggbV93aW5kb3dzLmZpbmQocF9kcmF3U3VyZmFjZSkgKTsKKyAgICAgICAgaWYgKHcgPT0gbV93aW5kb3dzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBiYWQgc3VyZmFjZSBoYW5kbGUKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkcmF3ID0gKCp3KS5zZWNvbmQuZmlyc3Q7CisKKyAgICAgICAgaWYgKHBfcmVhZFN1cmZhY2UgIT0gcF9kcmF3U3VyZmFjZSkgeworICAgICAgICAgICAgV2luZG93U3VyZmFjZU1hcDo6aXRlcmF0b3IgdyggbV93aW5kb3dzLmZpbmQocF9yZWFkU3VyZmFjZSkgKTsKKyAgICAgICAgICAgIGlmICh3ID09IG1fd2luZG93cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIGJhZCBzdXJmYWNlIGhhbmRsZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWQgPSAoKncpLnNlY29uZC5maXJzdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlYWQgPSBkcmF3OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzX2VnbC5lZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3ID8gZHJhdy0+Z2V0RUdMU3VyZmFjZSgpIDogRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkID8gcmVhZC0+Z2V0RUdMU3VyZmFjZSgpIDogRUdMX05PX1NVUkZBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHggPyBjdHgtPmdldEVHTENvbnRleHQoKSA6IEVHTF9OT19DT05URVhUKSkgeworICAgICAgICBFUlIoImVnbE1ha2VDdXJyZW50IGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGlmIChjdHguZ2V0KCktPmdldEVtdWxhdGVkR0xFUzFDb250ZXh0KCkpIHsKKyAgICAgICAgICAgIERCRygiJXM6IGZvdW5kIGVtdWxhdGVkIGdsZXMxIGNvbnRleHQgQCAlcFxuIiwgX19GVU5DVElPTl9fLCBjdHguZ2V0KCktPmdldEVtdWxhdGVkR0xFUzFDb250ZXh0KCkpOworICAgICAgICAgICAgc19nbGVzMS5zZXRfY3VycmVudF9nbGVzX2NvbnRleHQoY3R4LmdldCgpLT5nZXRFbXVsYXRlZEdMRVMxQ29udGV4dCgpKTsKKyAgICAgICAgICAgIERCRygiJXM6IHNldCBlbXVsYXRlZCBnbGVzMSBjb250ZXh0IGN1cnJlbnQgaW4gdGhyZWFkIGluZm9cbiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgICAgIGlmIChkcmF3LmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBEQkcoIiVzOiBzZXR1cCBtYWtlIGN1cnJlbnQgKG51bGwgZHJhdyBzdXJmYWNlKVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBzX2dsZXMxLm1ha2VfY3VycmVudF9zZXR1cCgwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgREJHKCIlczogc2V0dXAgbWFrZSBjdXJyZW50IChkcmF3IHN1cmZhY2UgJXV4JXUpXG4iLCBfX0ZVTkNUSU9OX18sIGRyYXctPmdldFdpZHRoKCksIGRyYXctPmdldEhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICBzX2dsZXMxLm1ha2VfY3VycmVudF9zZXR1cChkcmF3LT5nZXRXaWR0aCgpLCBkcmF3LT5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEQkcoIiVzOiBzZXQgdXAgdGhlIGVtdWxhdGVkIGdsZXMxIGNvbnRleHQncyBpbmZvXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBCaW5kIHRoZSBzdXJmYWNlKHMpIHRvIHRoZSBjb250ZXh0CisgICAgLy8KKyAgICBSZW5kZXJUaHJlYWRJbmZvICp0aW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworICAgIFdpbmRvd1N1cmZhY2VQdHIgYmluZERyYXcsIGJpbmRSZWFkOworICAgIGlmIChkcmF3LmdldCgpID09IE5VTEwgJiYgcmVhZC5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIC8vIFVuYmluZCB0aGUgY3VycmVudCByZWFkIGFuZCBkcmF3IHN1cmZhY2VzIGZyb20gdGhlIGNvbnRleHQKKyAgICAgICAgYmluZERyYXcgPSB0aW5mby0+Y3VyckRyYXdTdXJmOworICAgICAgICBiaW5kUmVhZCA9IHRpbmZvLT5jdXJyUmVhZFN1cmY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmluZERyYXcgPSBkcmF3OworICAgICAgICBiaW5kUmVhZCA9IHJlYWQ7CisgICAgfQorCisgICAgaWYgKGJpbmREcmF3LmdldCgpICE9IE5VTEwgJiYgYmluZFJlYWQuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICBpZiAoYmluZERyYXcuZ2V0KCkgIT0gYmluZFJlYWQuZ2V0KCkpIHsKKyAgICAgICAgICAgIGJpbmREcmF3LT5iaW5kKGN0eCwgV2luZG93U3VyZmFjZTo6QklORF9EUkFXKTsKKyAgICAgICAgICAgIGJpbmRSZWFkLT5iaW5kKGN0eCwgV2luZG93U3VyZmFjZTo6QklORF9SRUFEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJpbmREcmF3LT5iaW5kKGN0eCwgV2luZG93U3VyZmFjZTo6QklORF9SRUFERFJBVyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIHVwZGF0ZSB0aHJlYWQgaW5mbyB3aXRoIGN1cnJlbnQgYm91bmQgY29udGV4dAorICAgIC8vCisgICAgdGluZm8tPmN1cnJDb250ZXh0ID0gY3R4OworICAgIHRpbmZvLT5jdXJyRHJhd1N1cmYgPSBkcmF3OworICAgIHRpbmZvLT5jdXJyUmVhZFN1cmYgPSByZWFkOworICAgIGlmIChjdHgpIHsKKyAgICAgICAgaWYgKGN0eC0+aXNHTDIoKSkgdGluZm8tPm1fZ2wyRGVjLnNldENvbnRleHREYXRhKCZjdHgtPmRlY29kZXJDb250ZXh0RGF0YSgpKTsKKyAgICAgICAgZWxzZSB0aW5mby0+bV9nbERlYy5zZXRDb250ZXh0RGF0YSgmY3R4LT5kZWNvZGVyQ29udGV4dERhdGEoKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW5mby0+bV9nbERlYy5zZXRDb250ZXh0RGF0YShOVUxMKTsKKyAgICAgICAgdGluZm8tPm1fZ2wyRGVjLnNldENvbnRleHREYXRhKE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSGFuZGxlVHlwZSBGcmFtZUJ1ZmZlcjo6Y3JlYXRlQ2xpZW50SW1hZ2UoSGFuZGxlVHlwZSBjb250ZXh0LCBFR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBSZW5kZXJDb250ZXh0UHRyIGN0eDsKKworICAgIGlmIChjb250ZXh0KSB7CisgICAgICAgIFJlbmRlckNvbnRleHRNYXA6Oml0ZXJhdG9yIHIoIG1fY29udGV4dHMuZmluZChjb250ZXh0KSApOworICAgICAgICBpZiAociA9PSBtX2NvbnRleHRzLmVuZCgpKSB7CisgICAgICAgICAgICAvLyBiYWQgY29udGV4dCBoYW5kbGUKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eCA9ICgqcikuc2Vjb25kOworICAgIH0KKworICAgIEVHTENvbnRleHQgZWdsQ29udGV4dCA9IGN0eCA/IGN0eC0+Z2V0RUdMQ29udGV4dCgpIDogRUdMX05PX0NPTlRFWFQ7CisgICAgRUdMSW1hZ2VLSFIgaW1hZ2UgPSBzX2VnbC5lZ2xDcmVhdGVJbWFnZUtIUigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2VnbERpc3BsYXksIGVnbENvbnRleHQsIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEVHTENsaWVudEJ1ZmZlcj4oYnVmZmVyKSwgTlVMTCk7CisgICAgSGFuZGxlVHlwZSBpbWdIbmQgPSAoSGFuZGxlVHlwZSlyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oaW1hZ2UpOworCisgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICB1aW50NjRfdCBwdWlkID0gdEluZm8tPm1fcHVpZDsKKyAgICBpZiAocHVpZCkgeworICAgICAgICBlbXVnbDo6TXV0ZXg6OkF1dG9Mb2NrIG11dGV4KG1fbG9jayk7CisgICAgICAgIG1fcHJvY093bmVkRUdMSW1hZ2VzW3B1aWRdLmluc2VydChpbWdIbmQpOworICAgIH0KKyAgICByZXR1cm4gaW1nSG5kOworfQorCitFR0xCb29sZWFuIEZyYW1lQnVmZmVyOjpkZXN0cm95Q2xpZW50SW1hZ2UoSGFuZGxlVHlwZSBpbWFnZSkgeworICAgIC8vIGVnbERlc3Ryb3lJbWFnZUtIUiBoYXMgaXRzIG93biBsb2NrICBhbHJlYWR5LgorICAgIEVHTEJvb2xlYW4gcmV0ID0gc19lZ2wuZWdsRGVzdHJveUltYWdlS0hSKG1fZWdsRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxFR0xJbWFnZUtIUj4oaW1hZ2UpKTsKKyAgICBpZiAoIXJldCkgcmV0dXJuIGZhbHNlOworICAgIFJlbmRlclRocmVhZEluZm8gKnRJbmZvID0gUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCk7CisgICAgdWludDY0X3QgcHVpZCA9IHRJbmZvLT5tX3B1aWQ7CisgICAgaWYgKHB1aWQpIHsKKyAgICAgICAgZW11Z2w6Ok11dGV4OjpBdXRvTG9jayBtdXRleChtX2xvY2spOworICAgICAgICBtX3Byb2NPd25lZEVHTEltYWdlc1twdWlkXS5lcmFzZShpbWFnZSk7CisgICAgICAgIC8vIFdlIGRvbid0IGV4cGxpY2l0bHkgY2FsbCBtX3Byb2NPd25lZEVHTEltYWdlcy5lcmFzZShwdWlkKSB3aGVuIHRoZSBzaXplCisgICAgICAgIC8vIHJlYWNoZXMgMCwgc2luY2UgaXQgY291bGQgZ28gYmV0d2VlbiB6ZXJvIGFuZCBvbmUgbWFueSB0aW1lcyBpbiB0aGUKKyAgICAgICAgLy8gbGlmZXRpbWUgb2YgYSBwcm9jZXNzLgorICAgICAgICAvLyBJdCB3aWxsIGJlIGNsZWFuZWQgdXAgYnkgY2xlYW51cFByb2NHTE9iamVjdHMocHVpZCkgd2hlbiB0aGUgcHJvY2VzcyBpcworICAgICAgICAvLyBkZWFkLgorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8KKy8vIFRoZSBmcmFtZWJ1ZmZlciBsb2NrIHNob3VsZCBiZSBoZWxkIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKKy8vCitib29sIEZyYW1lQnVmZmVyOjpiaW5kX2xvY2tlZCgpCit7CisgICAgRUdMQ29udGV4dCBwcmV2Q29udGV4dCA9IHNfZWdsLmVnbEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgRUdMU3VyZmFjZSBwcmV2UmVhZFN1cmYgPSBzX2VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfUkVBRCk7CisgICAgRUdMU3VyZmFjZSBwcmV2RHJhd1N1cmYgPSBzX2VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisKKyAgICBpZiAocHJldkNvbnRleHQgIT0gbV9wYnVmQ29udGV4dCB8fCBwcmV2UmVhZFN1cmYgIT0gbV9wYnVmU3VyZmFjZQorICAgICAgICB8fCBwcmV2RHJhd1N1cmYgIT0gbV9wYnVmU3VyZmFjZSkgeworICAgICAgICBpZiAoIXNfZWdsLmVnbE1ha2VDdXJyZW50KG1fZWdsRGlzcGxheSwgbV9wYnVmU3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BidWZTdXJmYWNlLCBtX3BidWZDb250ZXh0KSkgeworICAgICAgICAgICAgRVJSKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVJSKCJOZXN0ZWQgJXMgY2FsbCBkZXRlY3RlZCwgc2hvdWxkIG5ldmVyIGhhcHBlbiIsIF9fZnVuY19fKTsKKyAgICB9CisKKyAgICBtX3ByZXZDb250ZXh0ID0gcHJldkNvbnRleHQ7CisgICAgbV9wcmV2UmVhZFN1cmYgPSBwcmV2UmVhZFN1cmY7CisgICAgbV9wcmV2RHJhd1N1cmYgPSBwcmV2RHJhd1N1cmY7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OmJpbmRTdWJ3aW5fbG9ja2VkKCkKK3sKKyAgICBFR0xDb250ZXh0IHByZXZDb250ZXh0ID0gc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBFR0xTdXJmYWNlIHByZXZSZWFkU3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9SRUFEKTsKKyAgICBFR0xTdXJmYWNlIHByZXZEcmF3U3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKworICAgIGlmIChwcmV2Q29udGV4dCAhPSBtX2VnbENvbnRleHQgfHwgcHJldlJlYWRTdXJmICE9IG1fZWdsU3VyZmFjZQorICAgICAgICB8fCBwcmV2RHJhd1N1cmYgIT0gbV9lZ2xTdXJmYWNlKSB7CisgICAgICAgIGlmICghc19lZ2wuZWdsTWFrZUN1cnJlbnQobV9lZ2xEaXNwbGF5LCBtX2VnbFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lZ2xTdXJmYWNlLCBtX2VnbENvbnRleHQpKSB7CisgICAgICAgICAgICBFUlIoImVnbE1ha2VDdXJyZW50IGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBFUlIoIk5lc3RlZCAlcyBjYWxsIGRldGVjdGVkLCBzaG91bGQgbmV2ZXIgaGFwcGVuIiwgX19mdW5jX18pOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW5pdGlhbGl6ZSBHTCBzdGF0ZSBpbiBlZ2xDb250ZXh0IGlmIG5vdCB5ZXQgaW5pdGlsYWl6ZWQKKyAgICAvLworICAgIGlmICghbV9lZ2xDb250ZXh0SW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbV9lZ2xDb250ZXh0SW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIG1fcHJldkNvbnRleHQgPSBwcmV2Q29udGV4dDsKKyAgICBtX3ByZXZSZWFkU3VyZiA9IHByZXZSZWFkU3VyZjsKKyAgICBtX3ByZXZEcmF3U3VyZiA9IHByZXZEcmF3U3VyZjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGcmFtZUJ1ZmZlcjo6dW5iaW5kX2xvY2tlZCgpCit7CisgICAgRUdMQ29udGV4dCBjdXJDb250ZXh0ID0gc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBFR0xTdXJmYWNlIGN1clJlYWRTdXJmID0gc19lZ2wuZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX1JFQUQpOworICAgIEVHTFN1cmZhY2UgY3VyRHJhd1N1cmYgPSBzX2VnbC5lZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisKKyAgICBpZiAobV9wcmV2Q29udGV4dCAhPSBjdXJDb250ZXh0IHx8IG1fcHJldlJlYWRTdXJmICE9IGN1clJlYWRTdXJmIHx8CisgICAgICAgIG1fcHJldkRyYXdTdXJmICE9IGN1ckRyYXdTdXJmKSB7CisgICAgICAgIGlmICghc19lZ2wuZWdsTWFrZUN1cnJlbnQobV9lZ2xEaXNwbGF5LCBtX3ByZXZEcmF3U3VyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZXZSZWFkU3VyZiwgbV9wcmV2Q29udGV4dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fcHJldkNvbnRleHQgPSBFR0xfTk9fQ09OVEVYVDsKKyAgICBtX3ByZXZSZWFkU3VyZiA9IEVHTF9OT19TVVJGQUNFOworICAgIG1fcHJldkRyYXdTdXJmID0gRUdMX05PX1NVUkZBQ0U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRnJhbWVCdWZmZXI6OmNyZWF0ZVRyaXZpYWxDb250ZXh0KEhhbmRsZVR5cGUgc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSogY29udGV4dE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVR5cGUqIHN1cmZPdXQpIHsKKyAgICBhc3NlcnQoY29udGV4dE91dCk7CisgICAgYXNzZXJ0KHN1cmZPdXQpOworCisgICAgKmNvbnRleHRPdXQgPSBjcmVhdGVSZW5kZXJDb250ZXh0KDAsIHNoYXJlZCwgdHJ1ZSk7CisgICAgLy8gWmVybyBzaXplIGlzIGZvcm1hbGx5IGFsbG93ZWQgaGVyZSwgYnV0IFN3aWZ0U2hhZGVyIGRvZXNuJ3QgbGlrZSBpdCBhbmQKKyAgICAvLyBmYWlscy4KKyAgICAqc3VyZk91dCA9IGNyZWF0ZVdpbmRvd1N1cmZhY2UoMCwgMSwgMSk7Cit9CisKK2Jvb2wgRnJhbWVCdWZmZXI6OnBvc3QoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyLCBib29sIG5lZWRMb2NrQW5kQmluZCkKK3sKKyAgICBpZiAobmVlZExvY2tBbmRCaW5kKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisgICAgfQorICAgIGJvb2wgcmV0ID0gZmFsc2U7CisKKyAgICBDb2xvckJ1ZmZlck1hcDo6aXRlcmF0b3IgYyggbV9jb2xvcmJ1ZmZlcnMuZmluZChwX2NvbG9yYnVmZmVyKSApOworICAgIGlmIChjID09IG1fY29sb3JidWZmZXJzLmVuZCgpKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBtX2xhc3RQb3N0ZWRDb2xvckJ1ZmZlciA9IHBfY29sb3JidWZmZXI7CisKKyAgICBpZiAobV9zdWJXaW4pIHsKKyAgICAgICAgLy8gYmluZCB0aGUgc3Vid2luZG93IGVnbFN1cmZhY2UKKyAgICAgICAgaWYgKG5lZWRMb2NrQW5kQmluZCAmJiAhYmluZFN1Yndpbl9sb2NrZWQoKSkgeworICAgICAgICAgICAgRVJSKCJGcmFtZUJ1ZmZlcjo6cG9zdCgpOiBlZ2xNYWtlQ3VycmVudCBmYWlsZWRcbiIpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRoZSB2aWV3cG9ydAorICAgICAgICBHTGludCB2cFs0XTsKKyAgICAgICAgc19nbGVzMi5nbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2cCk7CisKKyAgICAgICAgLy8gZGl2aWRlIGJ5IGRldmljZSBwaXhlbCByYXRpbyBiZWNhdXNlIHdpbmRvd2luZyBjb29yZGluYXRlcyBpZ25vcmUgRFBSLAorICAgICAgICAvLyBidXQgdGhlIGZyYW1lYnVmZmVyIGluY2x1ZGVzIERQUgorICAgICAgICB2cFsyXSA9IHZwWzJdIC8gbV9kcHI7CisgICAgICAgIHZwWzNdID0gdnBbM10gLyBtX2RwcjsKKworICAgICAgICAvLyBmaW5kIHRoZSB4IGFuZCB5IHZhbHVlcyBhdCB0aGUgb3JpZ2luIHdoZW4gImZ1bGx5IHNjcm9sbGVkIgorICAgICAgICAvLyBtdWx0aXBseSBieSAyIGJlY2F1c2UgdGhlIHRleHR1cmUgZ29lcyBmcm9tIC0xIHRvIDEsIG5vdCAwIHRvIDEKKyAgICAgICAgZmxvYXQgZnggPSAyLmYgKiAodnBbMl0gLSBtX3dpbmRvd1dpZHRoKSAvIChmbG9hdCkgdnBbMl07CisgICAgICAgIGZsb2F0IGZ5ID0gMi5mICogKHZwWzNdIC0gbV93aW5kb3dIZWlnaHQpIC8gKGZsb2F0KSB2cFszXTsKKworICAgICAgICAvLyBmaW5hbGx5LCBjb21wdXRlIHRyYW5zbGF0aW9uIHZhbHVlcworICAgICAgICBmbG9hdCBkeCA9IG1fcHggKiBmeDsKKyAgICAgICAgZmxvYXQgZHkgPSBtX3B5ICogZnk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gcmVuZGVyIHRoZSBjb2xvciBidWZmZXIgdG8gdGhlIHdpbmRvdworICAgICAgICAvLworICAgICAgICBpZiAobV96Um90ICE9IDAuMGYpIHsKKyAgICAgICAgICAgIHNfZ2xlczIuZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSAoKmMpLnNlY29uZC5jYi0+cG9zdChtX3pSb3QsIGR4LCBkeSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIHNfZWdsLmVnbFN3YXBCdWZmZXJzKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3RvcmUgcHJldmlvdXMgYmluZGluZworICAgICAgICBpZiAobmVlZExvY2tBbmRCaW5kKSB7CisgICAgICAgICAgICB1bmJpbmRfbG9ja2VkKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBzdWItd2luZG93LCBkb24ndCBkaXNwbGF5IGFueXRoaW5nLCB0aGUgY2xpZW50IHdpbGwKKyAgICAgICAgLy8gcmVseSBvbiBtX29uUG9zdCB0byBnZXQgdGhlIHBpeGVscyBpbnN0ZWFkLgorICAgICAgICByZXQgPSB0cnVlOworICAgIH0KKworICAgIC8vCisgICAgLy8gb3V0cHV0IEZQUyBzdGF0aXN0aWNzCisgICAgLy8KKyAgICBpZiAobV9mcHNTdGF0cykgeworICAgICAgICBsb25nIGxvbmcgY3VyclRpbWUgPSBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmdldCgpLT5nZXRIaWdoUmVzVGltZVVzKCkgLyAxMDAwOworICAgICAgICBtX3N0YXRzTnVtRnJhbWVzKys7CisgICAgICAgIGlmIChjdXJyVGltZSAtIG1fc3RhdHNTdGFydFRpbWUgPj0gMTAwMCkgeworICAgICAgICAgICAgZmxvYXQgZHQgPSAoZmxvYXQpKGN1cnJUaW1lIC0gbV9zdGF0c1N0YXJ0VGltZSkgLyAxMDAwLjBmOworICAgICAgICAgICAgcHJpbnRmKCJGUFM6ICU1LjNmXG4iLCAoZmxvYXQpbV9zdGF0c051bUZyYW1lcyAvIGR0KTsKKyAgICAgICAgICAgIG1fc3RhdHNTdGFydFRpbWUgPSBjdXJyVGltZTsKKyAgICAgICAgICAgIG1fc3RhdHNOdW1GcmFtZXMgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZW5kIGZyYW1lYnVmZmVyICh3aXRob3V0IEZQUyBvdmVybGF5KSB0byBjYWxsYmFjaworICAgIC8vCisgICAgaWYgKG1fb25Qb3N0KSB7CisgICAgICAgICgqYykuc2Vjb25kLmNiLT5yZWFkYmFjayhtX2ZiSW1hZ2UpOworICAgICAgICBtX29uUG9zdChtX29uUG9zdENvbnRleHQsCisgICAgICAgICAgICAgICAgIG1fZnJhbWVidWZmZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgbV9mcmFtZWJ1ZmZlckhlaWdodCwKKyAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIEdMX1VOU0lHTkVEX0JZVEUsCisgICAgICAgICAgICAgICAgIG1fZmJJbWFnZSk7CisgICAgfQorCitFWElUOgorICAgIGlmIChuZWVkTG9ja0FuZEJpbmQpIHsKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEZyYW1lQnVmZmVyOjpyZXBvc3QoKSB7CisgICAgaWYgKG1fbGFzdFBvc3RlZENvbG9yQnVmZmVyKSB7CisgICAgICAgIHJldHVybiBwb3N0KG1fbGFzdFBvc3RlZENvbG9yQnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvRnJhbWVCdWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZyYW1lQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyMGQxMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL0ZyYW1lQnVmZmVyLmgKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMS0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgX0xJQlJFTkRFUl9GUkFNRUJVRkZFUl9ICisjZGVmaW5lIF9MSUJSRU5ERVJfRlJBTUVCVUZGRVJfSAorCisjaW5jbHVkZSAiQ29sb3JCdWZmZXIuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbXV0ZXguaCIKKyNpbmNsdWRlICJGYkNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlckNvbnRleHQuaCIKKyNpbmNsdWRlICJUZXh0dXJlRHJhdy5oIgorI2luY2x1ZGUgIldpbmRvd1N1cmZhY2UuaCIKKworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpLmgiCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL1JlbmRlcmVyLmgiCisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gVHlwZSBvZiBoYW5kbGVzLCBhLmsuYS4gIm9iamVjdCBuYW1lcyIgaW4gdGhlIEdMIHNwZWNpZmljYXRpb24uCisvLyBUaGVzZSBhcmUgaW50ZWdlcnMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSBhIHJlc291cmNlIG9mIGEgZ2l2ZW4gdHlwZS4KK3R5cGVkZWYgdWludDMyX3QgSGFuZGxlVHlwZTsKKworc3RydWN0IENvbG9yQnVmZmVyUmVmIHsKKyAgICBDb2xvckJ1ZmZlclB0ciBjYjsKKyAgICB1aW50MzJfdCByZWZjb3VudDsgIC8vIG51bWJlciBvZiBjbGllbnQtc2lkZSByZWZlcmVuY2VzCit9OworCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxIYW5kbGVUeXBlLCBzdGQ6OnBhaXI8V2luZG93U3VyZmFjZVB0ciwgSGFuZGxlVHlwZT4gPiBXaW5kb3dTdXJmYWNlTWFwOworCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDxIYW5kbGVUeXBlLCBSZW5kZXJDb250ZXh0UHRyPiBSZW5kZXJDb250ZXh0TWFwOwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9zZXQ8SGFuZGxlVHlwZT4gUmVuZGVyQ29udGV4dFNldDsKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBSZW5kZXJDb250ZXh0U2V0PiBQcm9jT3duZWRSZW5kZXJDb250ZXh0czsKKwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8SGFuZGxlVHlwZSwgQ29sb3JCdWZmZXJSZWY+IENvbG9yQnVmZmVyTWFwOwordHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldDxIYW5kbGVUeXBlPiBDb2xvckJ1ZmZlclNldDsKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBDb2xvckJ1ZmZlclNldD4gUHJvY093bmVkQ29sb3JCdWZmZXJzOworCit0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX3NldDxIYW5kbGVUeXBlPiBFR0xJbWFnZVNldDsKK3R5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBFR0xJbWFnZVNldD4gUHJvY093bmVkRUdMSW1hZ2VzOworCisvLyBBIHN0cnVjdHVyZSB1c2VkIHRvIGxpc3QgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgdW5kZXJseWluZyBFR0wKKy8vIGltcGxlbWVudGF0aW9uIHRoYXQgdGhlIEZyYW1lQnVmZmVyIGluc3RhbmNlIGRlcGVuZHMgb24uCisvLyB8aGFzX2VnbGltYWdlX3RleHR1cmVfMmR8IGlzIHRydWUgaWZmIHRoZSBFR0xfS0hSX2dsX3RleHR1cmVfMkRfaW1hZ2UKKy8vIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCisvLyB8aGFzX2VnbGltYWdlX3JlbmRlcmJ1ZmZlcnwgaXMgdHJ1ZSBpZmYgdGhlIEVHTF9LSFJfZ2xfcmVuZGVyYnVmZmVyX2ltYWdlCisvLyBleHRlbnNpb24gaXMgc3VwcG9ydGVkLgorLy8gfGVnbE1ham9yfCBhbmQgfGVnbE1pbm9yfCBhcmUgdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgb2YKKy8vIHRoZSB1bmRlcmx5aW5nIEVHTCBpbXBsZW1lbnRhdGlvbi4KK3N0cnVjdCBGcmFtZUJ1ZmZlckNhcHMgeworICAgIGJvb2wgaGFzX2VnbGltYWdlX3RleHR1cmVfMmQ7CisgICAgYm9vbCBoYXNfZWdsaW1hZ2VfcmVuZGVyYnVmZmVyOworICAgIEVHTGludCBlZ2xNYWpvcjsKKyAgICBFR0xpbnQgZWdsTWlub3I7Cit9OworCisvLyBUaGUgRnJhbWVCdWZmZXIgY2xhc3MgaG9sZHMgdGhlIGdsb2JhbCBzdGF0ZSBvZiB0aGUgZW11bGF0aW9uIGxpYnJhcnkgb24KKy8vIHRvcCBvZiB0aGUgdW5kZXJseWluZyBFR0wvR0xFUyBpbXBsZW1lbnRhdGlvbi4gSXQgc2hvdWxkIHByb2JhYmx5IGJlCisvLyBuYW1lZCAiRGlzcGxheSIgaW5zdGVhZCBvZiAiRnJhbWVCdWZmZXIiLgorLy8KKy8vIFRoZXJlIGlzIG9ubHkgb25lIGdsb2JhbCBpbnN0YW5jZSwgdGhhdCBjYW4gYmUgcmV0cmlldmVkIHdpdGggZ2V0RkIoKSwKKy8vIGFuZCB3aGljaCBtdXN0IGJlIHByZXZpb3VzbHkgc2V0dXAgYnkgY2FsbGluZyBpbml0aWFsaXplKCkuCisvLworY2xhc3MgRnJhbWVCdWZmZXIgeworcHVibGljOgorICAgIC8vIEluaXRpYWxpemUgdGhlIGdsb2JhbCBpbnN0YW5jZS4KKyAgICAvLyB8d2lkdGh8IGFuZCB8aGVpZ2h0fCBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVtdWxhdG9yIEdQVSBkaXNwbGF5CisgICAgLy8gaW4gcGl4ZWxzLiB8dXNlU3ViV2luZG93fCBpcyB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlcgorICAgIC8vIHdpbGwgdXNlIHNldHVwU3ViV2luZG93KCkgdG8gbGV0IEVtdUdMIGRpc3BsYXkgdGhlIEdQVSBjb250ZW50IGluIGl0cworICAgIC8vIG93biBzdWItd2luZG93cy4gSWYgZmFsc2UsIHRoaXMgbWVhbnMgdGhlIGNhbGxlciB3aWxsIHVzZQorICAgIC8vIHNldFBvc3RDYWxsYmFjaygpIGluc3RlYWQgdG8gcmV0cmlldmUgdGhlIGNvbnRlbnQuCisgICAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCB1c2VTdWJXaW5kb3cpOworCisgICAgLy8gU2V0dXAgYSBzdWItd2luZG93IHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgdGhlIGVtdWxhdGVkIEdQVQorICAgIC8vIG9uLXRvcCBvZiBhbiBleGlzdGluZyBVSSB3aW5kb3cuIHxwX3dpbmRvd3wgaXMgdGhlIHBsYXRmb3JtLXNwZWNpZmljCisgICAgLy8gcGFyZW50IHdpbmRvdyBoYW5kbGUuIHx3eHwsIHx3eXwsIHx3d3wgYW5kIHx3aHwgYXJlIHRoZQorICAgIC8vIGRpbWVuc2lvbnMgaW4gcGl4ZWxzIG9mIHRoZSBzdWItd2luZG93LCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IHdpbmRvdydzCisgICAgLy8gY29vcmRpbmF0ZS4gfGZid3wgYW5kIHxmYmh8IGFyZSB0aGUgZGltZW5zaW9ucyB1c2VkIHRvIGluaXRpYWxpemUKKyAgICAvLyB0aGUgZnJhbWVidWZmZXIsIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGltZW5zaW9ucyBvZiB0aGUKKyAgICAvLyBzdWItd2luZG93IChpbiB3aGljaCBjYXNlIHNjYWxpbmcgd2lsbCBiZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkpLgorICAgIC8vIHxkcHJ8IGlzIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8gb2YgdGhlIG1vbml0b3IsIHdoaWNoIGlzIG5lZWRlZCBmb3IKKyAgICAvLyBwcm9wZXIgcGFubmluZyBvbiBoaWdoLWRlbnNpdHkgZGlzcGxheXMgKGxpa2UgcmV0aW5hKQorICAgIC8vIHx6Um90fCBpcyBhIHJvdGF0aW9uIGFuZ2xlIGluIGRlZ3JlZXMsIChjbG9ja3dpc2UgaW4gdGhlIFktdXB3YXJkcyBHTAorICAgIC8vIGNvb3JkaW5hdGUgc3BhY2UpLgorICAgIC8vCisgICAgLy8gSWYgYSBzdWItd2luZG93IGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHN1YndpbmRvdworICAgIC8vIGFuZCBmcmFtZWJ1ZmZlciBwcm9wZXJ0aWVzIHRvIG1hdGNoIHRoZSBnaXZlbiB2YWx1ZXMuCisgICAgLy8KKyAgICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgLy8KKyAgICAvLyBOT1RFOiBUaGlzIGNhbiByZXR1cm4gZmFsc2UgZm9yIHNvZnR3YXJlLW9ubHkgRUdMIGVuZ2luZXMgbGlrZSBPU01lc2EuCisgICAgYm9vbCBzZXR1cFN1YldpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgcF93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3gsIGludCB3eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3dywgaW50IHdoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZidywgaW50IGZiaCwgZmxvYXQgZHByLCBmbG9hdCB6Um90KTsKKworICAgIC8vIFJlbW92ZSB0aGUgc3ViLXdpbmRvdyBjcmVhdGVkIGJ5IHNldHVwU3ViV2luZG93KCksIGlmIGFueS4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCByZW1vdmVTdWJXaW5kb3coKTsKKworICAgIC8vIEZpbmFsaXplIHRoZSBpbnN0YW5jZS4KKyAgICB2b2lkIGZpbmFsaXplKCk7CisKKyAgICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBnbG9iYWwgaW5zdGFuY2UuIGluaXRpYWxpemUoKSBtdXN0IGJlIGNhbGxlZAorICAgIC8vIHByZXZpb3VzbHksIG9yIHRoaXMgd2lsbCByZXR1cm4gTlVMTC4KKyAgICBzdGF0aWMgRnJhbWVCdWZmZXIgKmdldEZCKCkgeyByZXR1cm4gc190aGVGcmFtZUJ1ZmZlcjsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHVuZGVybHlpbmcgZGlzcGxheS4KKyAgICBjb25zdCBGcmFtZUJ1ZmZlckNhcHMgJmdldENhcHMoKSBjb25zdCB7IHJldHVybiBtX2NhcHM7IH0KKworICAgIC8vIFJldHVybiB0aGUgZW11bGF0ZWQgR1BVIGRpc3BsYXkgd2lkdGggaW4gcGl4ZWxzLgorICAgIGludCBnZXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVidWZmZXJXaWR0aDsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBlbXVsYXRlZCBHUFUgZGlzcGxheSBoZWlnaHQgaW4gcGl4ZWxzLgorICAgIGludCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX2ZyYW1lYnVmZmVySGVpZ2h0OyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIGxpc3Qgb2YgY29uZmlncyBhdmFpbGFibGUgZnJvbSB0aGlzIGRpc3BsYXkuCisgICAgY29uc3QgRmJDb25maWdMaXN0KiBnZXRDb25maWdzKCkgY29uc3QgeyByZXR1cm4gbV9jb25maWdzOyB9CisKKyAgICAvLyBTZXQgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZSB0aGUgZW11bGF0ZWQgR1BVIGNvbnRlbnQKKyAgICAvLyBpcyB1cGRhdGVkLiBUaGlzIGNhbiBiZSByZWxhdGl2ZWx5IHNsb3cgd2l0aCBob3N0LWJhc2VkIEdQVSBlbXVsYXRpb24sCisgICAgLy8gc28gb25seSBkbyB0aGlzIHdoZW4geW91IG5lZWQgdG8uCisgICAgdm9pZCBzZXRQb3N0Q2FsbGJhY2soZW11Z2w6OlJlbmRlcmVyOjpPblBvc3RDYWxsYmFjayBvblBvc3QsIHZvaWQqIG9uUG9zdENvbnRleHQpOworCisgICAgLy8gUmV0cmlldmUgdGhlIEdMIHN0cmluZ3Mgb2YgdGhlIHVuZGVybHlpbmcgRUdML0dMRVMgaW1wbGVtZW50YXRpb24uCisgICAgLy8gT24gcmV0dXJuLCB8KnZlbmRvcnwsIHwqcmVuZGVyZXJ8IGFuZCB8KnZlcnNpb258IHdpbGwgcG9pbnQgdG8gc3RyaW5ncworICAgIC8vIHRoYXQgYXJlIG93bmVkIGJ5IHRoZSBpbnN0YW5jZSAoYW5kIG11c3Qgbm90IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIpLgorICAgIHZvaWQgZ2V0R0xTdHJpbmdzKGNvbnN0IGNoYXIqKiB2ZW5kb3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHJlbmRlcmVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiB2ZXJzaW9uKSBjb25zdCB7CisgICAgICAgICp2ZW5kb3IgPSBtX2dsVmVuZG9yOworICAgICAgICAqcmVuZGVyZXIgPSBtX2dsUmVuZGVyZXI7CisgICAgICAgICp2ZXJzaW9uID0gbV9nbFZlcnNpb247CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFJlbmRlckNvbnRleHQgaW5zdGFuY2UgZm9yIHRoaXMgZGlzcGxheSBpbnN0YW5jZS4KKyAgICAvLyB8cF9jb25maWd8IGlzIHRoZSBpbmRleCBvZiBvbmUgb2YgdGhlIGNvbmZpZ3MgcmV0dXJuZWQgYnkgZ2V0Q29uZmlncygpLgorICAgIC8vIHxwX3NoYXJlfCBpcyBlaXRoZXIgRUdMX05PX0NPTlRFWFQgb3IgdGhlIGhhbmRsZSBvZiBhIHNoYXJlZCBjb250ZXh0LgorICAgIC8vIHxwX2lzR0wyfCBpcyB0cnVlIHRvIGNyZWF0ZSBhIEdMRVMgMi54IGNvbnRleHQsIG9yIGZhbHNlIGZvciBhIEdMRVMgMS54CisgICAgLy8gb25lLgorICAgIC8vIFJldHVybiBhIG5ldyBoYW5kbGUgdmFsdWUsIHdoaWNoIHdpbGwgYmUgMCBpbiBjYXNlIG9mIGVycm9yLgorICAgIEhhbmRsZVR5cGUgY3JlYXRlUmVuZGVyQ29udGV4dCgKKyAgICAgICAgICAgIGludCBwX2NvbmZpZywgSGFuZGxlVHlwZSBwX3NoYXJlLCBib29sIHBfaXNHTDIgPSBmYWxzZSk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgV2luZG93U3VyZmFjZSBpbnN0YW5jZSBmcm9tIHRoaXMgZGlzcGxheSBpbnN0YW5jZS4KKyAgICAvLyB8cF9jb25maWd8IGlzIHRoZSBpbmRleCBvZiBvbmUgb2YgdGhlIGNvbmZpZ3MgcmV0dXJuZWQgYnkgZ2V0Q29uZmlncygpLgorICAgIC8vIHxwX3dpZHRofCBhbmQgfHBfaGVpZ2h0fCBhcmUgdGhlIHdpbmRvdyBkaW1lbnNpb25zIGluIHBpeGVscy4KKyAgICAvLyBSZXR1cm4gYSBuZXcgaGFuZGxlIHZhbHVlLCBvciAwIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgSGFuZGxlVHlwZSBjcmVhdGVXaW5kb3dTdXJmYWNlKGludCBwX2NvbmZpZywgaW50IHBfd2lkdGgsIGludCBwX2hlaWdodCk7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgQ29sb3JCdWZmZXIgaW5zdGFuY2UgZnJvbSB0aGlzIGRpc3BsYXkgaW5zdGFuY2UuCisgICAgLy8gfHBfd2lkdGh8IGFuZCB8cF9oZWlnaHR8IGFyZSBpdHMgZGltZW5zaW9ucyBpbiBwaXhlbHMuCisgICAgLy8gfHBfaW50ZXJuYWxGb3JtYXR8IGlzIHRoZSBwaXhlbCBmb3JtYXQuIFNlZSBDb2xvckJ1ZmZlcjo6Y3JlYXRlKCkgZm9yCisgICAgLy8gbGlzdCBvZiB2YWxpZCB2YWx1ZXMuIE5vdGUgdGhhdCBDb2xvckJ1ZmZlciBpbnN0YW5jZXMgYXJlIHJlZmVyZW5jZS0KKyAgICAvLyBjb3VudGVkLiBVc2Ugb3BlbkNvbG9yQnVmZmVyIC8gY2xvc2VDb2xvckJ1ZmZlciB0byBvcGVyYXRlIG9uIHRoZQorICAgIC8vIGludGVybmFsIGNvdW50LgorICAgIEhhbmRsZVR5cGUgY3JlYXRlQ29sb3JCdWZmZXIoCisgICAgICAgIGludCBwX3dpZHRoLCBpbnQgcF9oZWlnaHQsIEdMZW51bSBwX2ludGVybmFsRm9ybWF0KTsKKworICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIGEgcmVuZGVyIHRocmVhZCB0ZXJtaW5hdGVzIHRvIGRlc3Ryb3kgYWxsCisgICAgLy8gdGhlIHJlbWFpbmluZyBjb250ZXh0cyBpdCBjcmVhdGVkLiBOZWNlc3NhcnkgdG8gYXZvaWQgbGVha2luZyBob3N0CisgICAgLy8gY29udGV4dHMgd2hlbiBhIGd1ZXN0IGFwcGxpY2F0aW9uIGNyYXNoZXMsIGZvciBleGFtcGxlLgorICAgIHZvaWQgZHJhaW5SZW5kZXJDb250ZXh0KCk7CisKKyAgICAvLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBhIHJlbmRlciB0aHJlYWQgdGVybWluYXRlcyB0byBkZXN0cm95IGFsbAorICAgIC8vIHJlbWFpbmluZyB3aW5kb3cgc3VyZnFjZSBpdCBjcmVhdGVkLiBOZWNlc3NhcnkgdG8gYXZvaWQgbGVha2luZworICAgIC8vIGhvc3QgYnVmZmVycyB3aGVuIGEgZ3Vlc3QgYXBwbGljYXRpb24gY3Jhc2hlcywgZm9yIGV4YW1wbGUuCisgICAgdm9pZCBkcmFpbldpbmRvd1N1cmZhY2UoKTsKKworICAgIC8vIERlc3Ryb3kgYSBnaXZlbiBSZW5kZXJDb250ZXh0IGluc3RhbmNlLiB8cF9jb250ZXh0fCBpcyBpdHMgaGFuZGxlCisgICAgLy8gdmFsdWUgYXMgcmV0dXJuZWQgYnkgY3JlYXRlUmVuZGVyQ29udGV4dCgpLgorICAgIHZvaWQgRGVzdHJveVJlbmRlckNvbnRleHQoSGFuZGxlVHlwZSBwX2NvbnRleHQpOworCisgICAgLy8gRGVzdHJveSBhIGdpdmVuIFdpbmRvd1N1cmZhY2UgaW5zdGFuY2UuIHxwX3N1cmNhY2V8IGlzIGl0cyBoYW5kbGUKKyAgICAvLyB2YWx1ZSBhcyByZXR1cm5lZCBieSBjcmVhdGVXaW5kb3dTdXJmYWNlKCkuCisgICAgdm9pZCBEZXN0cm95V2luZG93U3VyZmFjZShIYW5kbGVUeXBlIHBfc3VyZmFjZSk7CisKKyAgICAvLyBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBDb2xvckJ1ZmZlcgorICAgIC8vIGluc3RhbmNlLiB8cF9jb2xvcmJ1ZmZlcnwgaXMgaXRzIGhhbmRsZSB2YWx1ZSBhcyByZXR1cm5lZCBieQorICAgIC8vIGNyZWF0ZUNvbG9yQnVmZmVyKCkuCisgICAgaW50IG9wZW5Db2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIpOworCisgICAgLy8gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gQ29sb3JCdWZmZXIKKyAgICAvLyBpbnN0YW5jZS4gfHBfY29sb3JidWZmZXJ8IGlzIGl0cyBoYW5kbGUgdmFsdWUgYXMgcmV0dXJuZWQgYnkKKyAgICAvLyBjcmVhdGVDb2xvckJ1ZmZlcigpLiBOb3RlIHRoYXQgaWYgdGhlIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIDAsCisgICAgLy8gdGhlIGluc3RhbmNlIGlzIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5LgorICAgIHZvaWQgY2xvc2VDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIpOworICAgIHZvaWQgY2xvc2VDb2xvckJ1ZmZlckxvY2tlZChIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIpOworCisgICAgdm9pZCBjbGVhbnVwUHJvY0dMT2JqZWN0cyh1aW50NjRfdCBwdWlkKTsKKyAgICAvLyBFcXVpdmFsZW50IGZvciBlZ2xNYWtlQ3VycmVudCgpIGZvciB0aGUgY3VycmVudCBkaXNwbGF5LgorICAgIC8vIHxwX2NvbnRleHR8LCB8cF9kcmF3U3VyZmFjZXwgYW5kIHxwX3JlYWRTdXJmYWNlfCBhcmUgdGhlIGhhbmRsZSB2YWx1ZXMKKyAgICAvLyBvZiB0aGUgY29udGV4dCwgdGhlIGRyYXcgc3VyZmFjZSBhbmQgdGhlIHJlYWQgc3VyZmFjZSwgcmVzcGVjdGl2ZWx5LgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLgorICAgIC8vIE5vdGU6IGlmIGFsbCBoYW5kbGUgdmFsdWVzIGFyZSAwLCB0aGlzIGlzIGFuIHVuYmluZCBvcGVyYXRpb24uCisgICAgYm9vbCAgYmluZENvbnRleHQoSGFuZGxlVHlwZSBwX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSBwX2RyYXdTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZVR5cGUgcF9yZWFkU3VyZmFjZSk7CisKKyAgICAvLyBBdHRhY2ggYSBDb2xvckJ1ZmZlciB0byBhIFdpbmRvd1N1cmZhY2UgaW5zdGFuY2UuCisgICAgLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBXaW5kb3dTdXJmYWNlOjpzZXRDb2xvckJ1ZmZlcigpLgorICAgIC8vIHxwX3N1cmZhY2V8IGlzIHRoZSB0YXJnZXQgV2luZG93U3VyZmFjZSdzIGhhbmRsZSB2YWx1ZS4KKyAgICAvLyB8cF9jb2xvcmJ1ZmZlcnwgaXMgdGhlIENvbG9yQnVmZmVyIGhhbmRsZSB2YWx1ZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgIHNldFdpbmRvd1N1cmZhY2VDb2xvckJ1ZmZlcigKKyAgICAgICAgICAgIEhhbmRsZVR5cGUgcF9zdXJmYWNlLCBIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIpOworCisgICAgLy8gQ29weSB0aGUgY29udGVudCBvZiBhIFdpbmRvd1N1cmZhY2UncyBQYnVmZmVyIHRvIGl0cyBhdHRhY2hlZAorICAgIC8vIENvbG9yQnVmZmVyLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFdpbmRvd1N1cmZhY2U6OmZsdXNoQ29sb3JCdWZmZXIoKQorICAgIC8vIHxwX3N1cmZhY2V8IGlzIHRoZSB0YXJnZXQgV2luZG93U3VyZmFjZSdzIGhhbmRsZSB2YWx1ZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICBib29sICBmbHVzaFdpbmRvd1N1cmZhY2VDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfc3VyZmFjZSk7CisKKyAgICAvLyBCaW5kIHRoZSBjdXJyZW50IGNvbnRleHQncyBFR0xfVEVYVFVSRV8yRCB0ZXh0dXJlIHRvIGEgQ29sb3JCdWZmZXIKKyAgICAvLyBpbnN0YW5jZSdzIEVHTEltYWdlLiBUaGlzIGlzIGludGVuZGVkIHRvIGltcGxlbWVudAorICAgIC8vIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMoKSBmb3IgYWxsIEdMRVMgdmVyc2lvbnMuCisgICAgLy8gfHBfY29sb3JidWZmZXJ8IGlzIHRoZSBDb2xvckJ1ZmZlcidzIGhhbmRsZSB2YWx1ZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICBib29sICBiaW5kQ29sb3JCdWZmZXJUb1RleHR1cmUoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyKTsKKworICAgIC8vIEJpbmQgdGhlIGN1cnJlbnQgY29udGV4dCdzIEVHTF9SRU5ERVJCVUZGRVJfT0VTIHJlbmRlciBidWZmZXIgdG8gdGhpcworICAgIC8vIENvbG9yQnVmZmVyJ3MgRUdMSW1hZ2UuIFRoaXMgaXMgaW50ZW5kZWQgdG8gaW1wbGVtZW50CisgICAgLy8gZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoKSBmb3IgYWxsIEdMRVMgdmVyc2lvbnMuCisgICAgLy8gfHBfY29sb3JidWZmZXJ8IGlzIHRoZSBDb2xvckJ1ZmZlcidzIGhhbmRsZSB2YWx1ZS4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICBib29sICBiaW5kQ29sb3JCdWZmZXJUb1JlbmRlcmJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIpOworCisgICAgLy8gUmVhZCB0aGUgY29udGVudCBvZiBhIGdpdmVuIENvbG9yQnVmZmVyIGludG8gY2xpZW50IG1lbW9yeS4KKyAgICAvLyB8cF9jb2xvcmJ1ZmZlcnwgaXMgdGhlIENvbG9yQnVmZmVyJ3MgaGFuZGxlIHZhbHVlLiBTaW1pbGFyCisgICAgLy8gdG8gZ2xSZWFkUGl4ZWxzKCksIHRoaXMgY2FuIGJlIGEgc2xvdyBvcGVyYXRpb24uCisgICAgLy8gfHh8LCB8eXwsIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgb2YKKyAgICAvLyBhIHJlY3RhbmdsZSB3aG9zZSBwaXhlbCB2YWx1ZXMgd2lsbCBiZSB0cmFuc2ZlcmVkIHRvIHRoZSBob3N0LgorICAgIC8vIHxmb3JtYXR8IGluZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBwaXhlbCBkYXRhLCBlLmcuIEdMX1JHQiBvciBHTF9SR0JBLgorICAgIC8vIHx0eXBlfCBpcyB0aGUgdHlwZSBvZiBwaXhlbCBkYXRhLCBlLmcuIEdMX1VOU0lHTkVEX0JZVEUuCisgICAgLy8gfHBpeGVsc3wgaXMgdGhlIGFkZHJlc3Mgb2YgYSBjYWxsZXItcHJvdmlkZWQgYnVmZmVyIHRoYXQgd2lsbCBiZSBmaWxsZWQKKyAgICAvLyB3aXRoIHRoZSBwaXhlbCBkYXRhLgorICAgIHZvaWQgIHJlYWRDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpOworCisgICAgLy8gVXBkYXRlIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gQ29sb3JCdWZmZXIgZnJvbSBjbGllbnQgZGF0YS4KKyAgICAvLyB8cF9jb2xvcmJ1ZmZlcnwgaXMgdGhlIENvbG9yQnVmZmVyJ3MgaGFuZGxlIHZhbHVlLiBTaW1pbGFyCisgICAgLy8gdG8gZ2xSZWFkUGl4ZWxzKCksIHRoaXMgY2FuIGJlIGEgc2xvdyBvcGVyYXRpb24uCisgICAgLy8gfHh8LCB8eXwsIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgb2YKKyAgICAvLyBhIHJlY3RhbmdsZSB3aG9zZSBwaXhlbCB2YWx1ZXMgd2lsbCBiZSB0cmFuc2ZlcmVkIHRvIHRoZSBHUFUKKyAgICAvLyB8Zm9ybWF0fCBpbmRpY2F0ZXMgdGhlIGZvcm1hdCBvZiB0aGUgcGl4ZWwgZGF0YSwgZS5nLiBHTF9SR0Igb3IgR0xfUkdCQS4KKyAgICAvLyB8dHlwZXwgaXMgdGhlIHR5cGUgb2YgcGl4ZWwgZGF0YSwgZS5nLiBHTF9VTlNJR05FRF9CWVRFLgorICAgIC8vIHxwaXhlbHN8IGlzIHRoZSBhZGRyZXNzIG9mIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG5ldyBwaXhlbCBkYXRhLgorICAgIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCB1cGRhdGVDb2xvckJ1ZmZlcihIYW5kbGVUeXBlIHBfY29sb3JidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpOworCisgICAgLy8gRGlzcGxheSB0aGUgY29udGVudCBvZiBhIGdpdmVuIENvbG9yQnVmZmVyIGludG8gdGhlIGZyYW1lYnVmZmVyJ3MKKyAgICAvLyBzdWItd2luZG93LiB8cF9jb2xvcmJ1ZmZlcnwgaXMgYSBoYW5kbGUgdmFsdWUuCisgICAgLy8gfG5lZWRMb2NrQW5kQmluZHwgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gcmVxdWlyZXMKKyAgICAvLyBhY3F1aXJpbmcvcmVsZWFzaW5nIHRoZSBGcmFtZUJ1ZmZlciBpbnN0YW5jZSdzIGxvY2sgYW5kIGJpbmRpbmcgdGhlCisgICAgLy8gY29udGV4dHMuIEl0IHNob3VsZCBiZSB8ZmFsc2V8IG9ubHkgd2hlbiBjYWxsZWQgaW50ZXJuYWxseS4KKyAgICBib29sIHBvc3QoSGFuZGxlVHlwZSBwX2NvbG9yYnVmZmVyLCBib29sIG5lZWRMb2NrQW5kQmluZCA9IHRydWUpOworCisgICAgLy8gUmUtcG9zdCB0aGUgbGFzdCBDb2xvckJ1ZmZlciB0aGF0IHdhcyBkaXNwbGF5ZWQgdGhyb3VnaCBwb3N0KCkuCisgICAgLy8gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGRldGVjdCB0aGF0IHRoZSBzdWItd2luZG93IGNvbnRlbnQgbmVlZHMgdG8KKyAgICAvLyBiZSByZS1kaXNwbGF5ZWQgZm9yIGFueSByZWFzb24uCisgICAgYm9vbCByZXBvc3QoKTsKKworICAgIC8vIFJldHVybiB0aGUgaG9zdCBFR0xEaXNwbGF5IHVzZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICBFR0xEaXNwbGF5IGdldERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2VnbERpc3BsYXk7IH0KKworICAgIC8vIENoYW5nZSB0aGUgcm90YXRpb24gb2YgdGhlIGRpc3BsYXllZCBHUFUgc3ViLXdpbmRvdy4KKyAgICB2b2lkIHNldERpc3BsYXlSb3RhdGlvbihmbG9hdCB6Um90KSB7CisgICAgICAgIG1felJvdCA9IHpSb3Q7CisgICAgICAgIHJlcG9zdCgpOworICAgIH0KKworICAgIC8vIENoYW5nZXMgd2hhdCBjb29yZGluYXRlIG9mIHRoaXMgZnJhbWVidWZmZXIgd2lsbCBiZSBkaXNwbGF5ZWQgYXQgdGhlCisgICAgLy8gY29ybmVyIG9mIHRoZSBHUFUgc3ViLXdpbmRvdy4gU3BlY2lmaWNhbGx5LCB8cHh8IGFuZCB8cHl8ID0gMCBtZWFucworICAgIC8vIGFsaWduIHRoZSBib3R0b20tbGVmdCBvZiB0aGUgZnJhbWVidWZmZXIgd2l0aCB0aGUgYm90dG9tLWxlZnQgb2YgdGhlCisgICAgLy8gc3ViLXdpbmRvdywgYW5kIHxweHwgYW5kIHxweXwgPSAxIG1lYW5zIGFsaWduIHRoZSB0b3AgcmlnaHQgb2YgdGhlCisgICAgLy8gZnJhbWVidWZmZXIgd2l0aCB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBzdWItd2luZG93LiBJbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgLy8gaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVzZSBzdGF0ZXMuCisgICAgdm9pZCBzZXREaXNwbGF5VHJhbnNsYXRpb24oZmxvYXQgcHgsIGZsb2F0IHB5KSB7CisKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHRoZSB2YWx1ZXMgdG8gZW5zdXJlIHRoZXkgYXJlIGJldHdlZW4gMCBhbmQgMQorICAgICAgICBtX3B4ID0gcHggPiAxID8gMSA6IChweCA8IDAgPyAwIDogcHgpOworICAgICAgICBtX3B5ID0gcHkgPiAxID8gMSA6IChweSA8IDAgPyAwIDogcHkpOworICAgICAgICByZXBvc3QoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYSBUZXh0dXJlRHJhdyBpbnN0YW5jZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhpcyBzdXJmYWNlcworICAgIC8vIGFuZCB3aW5kb3dzIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICBUZXh0dXJlRHJhdyogZ2V0VGV4dHVyZURyYXcoKSBjb25zdCB7IHJldHVybiBtX3RleHR1cmVEcmF3OyB9CisKKyAgICAvLyBDcmVhdGUgYW4gZWdsSW1hZ2UgYW5kIHJldHVybiBpdHMgaGFuZGxlLiAgUmVmZXJlbmNlOgorICAgIC8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2VnbC9leHRlbnNpb25zL0tIUi9FR0xfS0hSX2ltYWdlX2Jhc2UudHh0CisgICAgSGFuZGxlVHlwZSBjcmVhdGVDbGllbnRJbWFnZShIYW5kbGVUeXBlIGNvbnRleHQsIEVHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKKyAgICAvLyBDYWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBlZ2xEZXN0cm95SW1hZ2VLSFIsIHJldHVybiBpZiBzdWNjZWVkcyBvcgorICAgIC8vIG5vdC4gUmVmZXJlbmNlOgorICAgIC8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2VnbC9leHRlbnNpb25zL0tIUi9FR0xfS0hSX2ltYWdlX2Jhc2UudHh0CisgICAgRUdMQm9vbGVhbiBkZXN0cm95Q2xpZW50SW1hZ2UoSGFuZGxlVHlwZSBpbWFnZSk7CisKKyAgICAvLyBVc2VkIGludGVybmFsbHkuCisgICAgYm9vbCBiaW5kX2xvY2tlZCgpOworICAgIGJvb2wgdW5iaW5kX2xvY2tlZCgpOworCisgICAgdm9pZCBsb2NrQ29udGV4dFN0cnVjdHVyZVJlYWQoKSB7IG1fY29udGV4dFN0cnVjdHVyZUxvY2subG9ja1JlYWQoKTsgfQorICAgIHZvaWQgdW5sb2NrQ29udGV4dFN0cnVjdHVyZVJlYWQoKSB7IG1fY29udGV4dFN0cnVjdHVyZUxvY2sudW5sb2NrUmVhZCgpOyB9CisKKyAgICAvLyBGb3IgdXNlIHdpdGggc3luYyB0aHJlYWRzIGFuZCBvdGhlcndpc2UsIGFueSB0aW1lIHdlIG5lZWQgYSBHTCBjb250ZXh0CisgICAgLy8gbm90IHNwZWNpZmljYWxseSBmb3IgZHJhd2luZywgYnV0IHRvIG9idGFpbiBjZXJ0YWluIHRoaW5ncyBhYm91dAorICAgIC8vIEdMIHN0YXRlLgorICAgIC8vIEl0IGNhbiBiZSB1bnNhZmUgLyBsZWFreSB0byBjaGFuZ2UgdGhlIHN0cnVjdHVyZSBvZiBjb250ZXh0cworICAgIC8vIG91dHNpZGUgdGhlIGZhY2lsaXRpZXMgdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHByb3ZpZGVzLgorICAgIHZvaWQgY3JlYXRlVHJpdmlhbENvbnRleHQoSGFuZGxlVHlwZSBzaGFyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVUeXBlKiBjb250ZXh0T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlVHlwZSogc3VyZk91dCk7CisKK3ByaXZhdGU6CisgICAgRnJhbWVCdWZmZXIoaW50IHBfd2lkdGgsIGludCBwX2hlaWdodCwgYm9vbCB1c2VTdWJXaW5kb3cpOworICAgIH5GcmFtZUJ1ZmZlcigpOworICAgIEhhbmRsZVR5cGUgZ2VuSGFuZGxlKCk7CisKKyAgICBib29sIGJpbmRTdWJ3aW5fbG9ja2VkKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIEZyYW1lQnVmZmVyICpzX3RoZUZyYW1lQnVmZmVyOworICAgIHN0YXRpYyBIYW5kbGVUeXBlIHNfbmV4dEhhbmRsZTsKKyAgICBpbnQgbV94ID0gMDsKKyAgICBpbnQgbV95ID0gMDsKKyAgICBpbnQgbV9mcmFtZWJ1ZmZlcldpZHRoID0gMDsKKyAgICBpbnQgbV9mcmFtZWJ1ZmZlckhlaWdodCA9IDA7CisgICAgaW50IG1fd2luZG93V2lkdGggPSAwOworICAgIGludCBtX3dpbmRvd0hlaWdodCA9IDA7CisgICAgZmxvYXQgbV9kcHIgPSAwOworCisgICAgYm9vbCBtX3VzZVN1YldpbmRvdyA9IGZhbHNlOworICAgIGJvb2wgbV9lZ2xDb250ZXh0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworICAgIGJvb2wgbV9mcHNTdGF0cyA9IGZhbHNlOworICAgIGludCBtX3N0YXRzTnVtRnJhbWVzID0gMDsKKyAgICBsb25nIGxvbmcgbV9zdGF0c1N0YXJ0VGltZSA9IDA7CisKKyAgICBlbXVnbDo6TXV0ZXggbV9sb2NrOworICAgIGVtdWdsOjpSZWFkV3JpdGVNdXRleCBtX2NvbnRleHRTdHJ1Y3R1cmVMb2NrOworICAgIEZiQ29uZmlnTGlzdCogbV9jb25maWdzID0gbnVsbHB0cjsKKyAgICBGQk5hdGl2ZVdpbmRvd1R5cGUgbV9uYXRpdmVXaW5kb3cgPSAwOworICAgIEZyYW1lQnVmZmVyQ2FwcyBtX2NhcHMgPSB7fTsKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheSA9IG51bGxwdHI7CisgICAgUmVuZGVyQ29udGV4dE1hcCBtX2NvbnRleHRzOworICAgIFdpbmRvd1N1cmZhY2VNYXAgbV93aW5kb3dzOworICAgIENvbG9yQnVmZmVyTWFwIG1fY29sb3JidWZmZXJzOworICAgIENvbG9yQnVmZmVyOjpIZWxwZXIqIG1fY29sb3JCdWZmZXJIZWxwZXIgPSBudWxscHRyOworCisgICAgRUdMU3VyZmFjZSBtX2VnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKKyAgICBFR0xDb250ZXh0IG1fZWdsQ29udGV4dCA9IEVHTF9OT19DT05URVhUOworICAgIEVHTFN1cmZhY2UgbV9wYnVmU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOworICAgIEVHTENvbnRleHQgbV9wYnVmQ29udGV4dCA9IEVHTF9OT19DT05URVhUOworCisgICAgRUdMQ29udGV4dCBtX3ByZXZDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7CisgICAgRUdMU3VyZmFjZSBtX3ByZXZSZWFkU3VyZiA9IEVHTF9OT19TVVJGQUNFOworICAgIEVHTFN1cmZhY2UgbV9wcmV2RHJhd1N1cmYgPSBFR0xfTk9fU1VSRkFDRTsKKyAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIG1fc3ViV2luID0ge307CisgICAgVGV4dHVyZURyYXcqIG1fdGV4dHVyZURyYXcgPSBudWxscHRyOworICAgIEVHTENvbmZpZyAgbV9lZ2xDb25maWcgPSBudWxscHRyOworICAgIEhhbmRsZVR5cGUgbV9sYXN0UG9zdGVkQ29sb3JCdWZmZXIgPSAwOworICAgIGZsb2F0ICAgICAgbV96Um90ID0gMDsKKyAgICBmbG9hdCAgICAgIG1fcHggPSAwOworICAgIGZsb2F0ICAgICAgbV9weSA9IDA7CisKKyAgICBlbXVnbDo6UmVuZGVyZXI6Ok9uUG9zdENhbGxiYWNrIG1fb25Qb3N0ID0gbnVsbHB0cjsKKyAgICB2b2lkKiBtX29uUG9zdENvbnRleHQgPSBudWxscHRyOworICAgIHVuc2lnbmVkIGNoYXIqIG1fZmJJbWFnZSA9IG51bGxwdHI7CisKKyAgICBjb25zdCBjaGFyKiBtX2dsVmVuZG9yID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyKiBtX2dsUmVuZGVyZXIgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIG1fZ2xWZXJzaW9uID0gbnVsbHB0cjsKKworICAgIC8vIFRoZSBob3N0IGFzc29jaWF0ZXMgY29sb3IgYnVmZmVycyB3aXRoIGd1ZXN0IHByb2Nlc3NlcyBmb3IgbWVtb3J5CisgICAgLy8gY2xlYW51cC4gR3Vlc3QgcHJvY2Vzc2VzIGFyZSBpZGVudGlmaWVkIHdpdGggYSBob3N0IGdlbmVyYXRlZCB1bmlxdWUgSUQuCisgICAgUHJvY093bmVkQ29sb3JCdWZmZXJzIG1fcHJvY093bmVkQ29sb3JCdWZmZXJzOworICAgIFByb2NPd25lZEVHTEltYWdlcyBtX3Byb2NPd25lZEVHTEltYWdlczsKKyAgICBQcm9jT3duZWRSZW5kZXJDb250ZXh0cyBtX3Byb2NPd25lZFJlbmRlckNvbnRleHQ7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9OYXRpdmVTdWJXaW5kb3cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL05hdGl2ZVN1YldpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTQwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9OYXRpdmVTdWJXaW5kb3cuaApAQCAtMCwwICsxLDcwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBOQVRJVkVfU1VCX1dJTkRPV19ICisjZGVmaW5lIE5BVElWRV9TVUJfV0lORE9XX0gKKworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpX3BsYXRmb3JtX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICgqU3ViV2luZG93UmVwYWludENhbGxiYWNrKSh2b2lkKik7CisKKy8vIENyZWF0ZSBhIG5ldyBzdWItd2luZG93IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGNvbnRlbnQgb2YgdGhlCisvLyBlbXVsYXRlZCBHUFUgb24gdG9wIG9mIHRoZSByZWd1bGFyIFVJIHdpbmRvdy4KKy8vIHxwX3dpbmRvd3wgaXMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGhhbmRsZSB0byB0aGUgbWFpbiBVSSB3aW5kb3cuCisvLyB8eHwsIHx5fCBpcyB0aGUgcG9zaXRpb24gc3ViLXdpbmRvdyByZWxhdGl2ZSB0byB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZQorLy8gbWFpbiB3aW5kb3cuCisvLyB8d2lkdGh8IGFuZCB8aGVpZ2h0fCBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHN1Yi13aW5kb3csIGFzIHdlbGwgYXMgb2YKKy8vIHRoZSBlbXVsYXRlZCBmcmFtZWJ1ZmZlci4KKy8vIHxyZXBhaW50X2NhbGxiYWNrfCBtYXkgYmUgaW52b2tlZCBldmVyeSB0aW1lIHRoZSB3aW5kb3cgaGFzIHRvIGJlIHJlcGFpbnRlZAorLy8gKHN1Y2ggYXMgcmVjZWl2aW5nIGEgV01fUEFJTlQgZXZlbnQgb24gV2luZG93cykuIElmIHRoZSBwcm92aWRlZCBhcmd1bWVudCBpcworLy8gIE5VTEwsIG5vdGhpbmcgd2lsbCBiZSBpbnZva2VkLgorLy8gfHJlcGFpbnRfY2FsbGJhY2tfcGFyYW18IGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCisvLyByZXBhaW50IGNhbGxiYWNrIHdoZW4vaWYgaXQncyBpbnZva2VkLgorLy8gT24gc3VjY2VzcywgcmV0dXJuIGEgbmV3IHBsYXRmb3JtLXNwZWNpZmljIHdpbmRvdyBoYW5kbGUsIGNhc3QgYXMgYW4KKy8vIEVHTE5hdGl2ZVdpbmRvd1R5cGUuIE9yIDAvTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuCitFR0xOYXRpdmVXaW5kb3dUeXBlIGNyZWF0ZVN1YldpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgcF93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YldpbmRvd1JlcGFpbnRDYWxsYmFjayByZXBhaW50X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVwYWludF9jYWxsYmFja19wYXJhbSk7CisKKy8vIERlc3Ryb3kgYSBzdWItd2luZG93IHByZXZpb3VzbHkgY3JlYXRlZCB0aHJvdWdoIGNyZWF0ZVN1YldpbmRvdygpIGFib3ZlLgordm9pZCBkZXN0cm95U3ViV2luZG93KEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luKTsKKworLy8gTW92ZXMgYSBzdWItd2luZG93IHByZXZpb3VzbHkgY3JlYXRlZCB0aHJvdWdoIGNyZWF0ZVN1YldpbmRvdygpIGFib3ZlLgorLy8gfHBfcGFyZW50X3dpbmRvd3wgaXMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGhhbmRsZSB0byB0aGUgbWFpbiBVSSB3aW5kb3cuCisvLyB8cF9zdWJfd2luZG93fCBpcyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgaGFuZGxlIHRvIHRoZSBFR0wgc3Vid2luZG93LgorLy8gfHh8LHx5fCx8d2lkdGh8LHxoZWlnaHR8IGFyZSB0aGUgbmV3IGxvY2F0aW9uIGFuZCBkaW1lbnNpb25zIG9mIHRoZQorLy8gc3Vid2luZG93LgoraW50IG1vdmVTdWJXaW5kb3coRkJOYXRpdmVXaW5kb3dUeXBlIHBfcGFyZW50X3dpbmRvdywKKyAgICAgICAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgcF9zdWJfd2luZG93LAorICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL05hdGl2ZVN1YldpbmRvd19jb2NvYS5tIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvTmF0aXZlU3ViV2luZG93X2NvY29hLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2NzRiNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL05hdGl2ZVN1YldpbmRvd19jb2NvYS5tCkBAIC0wLDAgKzEsMTAxIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIk5hdGl2ZVN1YldpbmRvdy5oIgorI2luY2x1ZGUgPENvY29hL0NvY29hLmg+CisKKy8qCisgKiBFbXVHTFZpZXcgaW5oZXJpdCBmcm9tIE5TVmlldyBhbmQgb3ZlcnJpZGUgdGhlIGlzT3BhcXVlCisgKiBtZXRob2QgdG8gcmV0dXJuIFlFUy4gVGhhdCBwcmV2ZW50cyBkcmF3aW5nIG9mIHVuZGVybHlpbmcgd2luZG93L3ZpZXcKKyAqIHdoZW4gdGhlIHZpZXcgbmVlZHMgdG8gYmUgcmVkcmF3bi4KKyAqLworQGludGVyZmFjZSBFbXVHTFZpZXcgOiBOU1ZpZXcgeworfSBAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBFbXVHTFZpZXcKKworICAtIChCT09MKWlzT3BhcXVlIHsKKyAgICAgIHJldHVybiBZRVM7CisgIH0KKworQGVuZAorCisKK0VHTE5hdGl2ZVdpbmRvd1R5cGUgY3JlYXRlU3ViV2luZG93KEZCTmF0aXZlV2luZG93VHlwZSBwX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViV2luZG93UmVwYWludENhbGxiYWNrIHJlcGFpbnRfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXBhaW50X2NhbGxiYWNrX3BhcmFtKSB7CisgICAgTlNXaW5kb3cqIHdpbiA9IChOU1dpbmRvdyAqKXBfd2luZG93OworICAgIGlmICghd2luKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qICh4LHkpIGFzc3VtZSBhbiB1cHBlci1sZWZ0IG9yaWdpbiwgYnV0IENvY29hIHVzZXMgYSBsb3dlci1sZWZ0IG9yaWdpbiAqLworICAgIE5TUmVjdCBjb250ZW50X3JlY3QgPSBbd2luIGNvbnRlbnRSZWN0Rm9yRnJhbWVSZWN0Olt3aW4gZnJhbWVdXTsKKyAgICBpbnQgY29jb2FfeSA9IChpbnQpY29udGVudF9yZWN0LnNpemUuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpOworICAgIE5TUmVjdCBjb250ZW50UmVjdCA9IE5TTWFrZVJlY3QoeCwgY29jb2FfeSwgd2lkdGgsIGhlaWdodCk7CisKKyAgICBOU1ZpZXcgKmdsVmlldyA9IFtbRW11R0xWaWV3IGFsbG9jXSBpbml0V2l0aEZyYW1lOmNvbnRlbnRSZWN0XTsKKyAgICBpZiAoZ2xWaWV3KSB7CisgICAgICAgIFtnbFZpZXcgc2V0V2FudHNCZXN0UmVzb2x1dGlvbk9wZW5HTFN1cmZhY2U6WUVTXTsKKyAgICAgICAgW1t3aW4gY29udGVudFZpZXddIGFkZFN1YnZpZXc6Z2xWaWV3XTsKKyAgICAgICAgW3dpbiBtYWtlS2V5QW5kT3JkZXJGcm9udDpuaWxdOworICAgIH0KKworICAgIHJldHVybiAoRUdMTmF0aXZlV2luZG93VHlwZSlnbFZpZXc7Cit9CisKK3ZvaWQgZGVzdHJveVN1YldpbmRvdyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbikgeworICAgIGlmKHdpbil7CisgICAgICAgIE5TVmlldyAqZ2xWaWV3ID0gKE5TVmlldyAqKXdpbjsKKyAgICAgICAgW2dsVmlldyByZW1vdmVGcm9tU3VwZXJ2aWV3XTsKKyAgICAgICAgW2dsVmlldyByZWxlYXNlXTsKKyAgICB9Cit9CisKK2ludCBtb3ZlU3ViV2luZG93KEZCTmF0aXZlV2luZG93VHlwZSBwX3BhcmVudF93aW5kb3csCisgICAgICAgICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHBfc3ViX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgICAgTlNXaW5kb3cgKndpbiA9IChOU1dpbmRvdyAqKXBfcGFyZW50X3dpbmRvdzsKKyAgICBpZiAoIXdpbikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBOU1ZpZXcgKmdsVmlldyA9IChOU1ZpZXcgKilwX3N1Yl93aW5kb3c7CisgICAgaWYgKCFnbFZpZXcpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogVGhlIHZpZXcgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIGhpZXJhcmNoeSB0byBiZSBwcm9wZXJseSByZXNpemVkICovCisgICAgW2dsVmlldyByZW1vdmVGcm9tU3VwZXJ2aWV3XTsKKworICAgIC8qICh4LHkpIGFzc3VtZSBhbiB1cHBlci1sZWZ0IG9yaWdpbiwgYnV0IENvY29hIHVzZXMgYSBsb3dlci1sZWZ0IG9yaWdpbiAqLworICAgIE5TUmVjdCBjb250ZW50X3JlY3QgPSBbd2luIGNvbnRlbnRSZWN0Rm9yRnJhbWVSZWN0Olt3aW4gZnJhbWVdXTsKKyAgICBpbnQgY29jb2FfeSA9IChpbnQpY29udGVudF9yZWN0LnNpemUuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpOworICAgIE5TUmVjdCBuZXdGcmFtZSA9IE5TTWFrZVJlY3QoeCwgY29jb2FfeSwgd2lkdGgsIGhlaWdodCk7CisgICAgW2dsVmlldyBzZXRGcmFtZTpuZXdGcmFtZV07CisKKyAgICAvKiBSZS1hZGQgdGhlIHN1Yi13aW5kb3cgdG8gdGhlIHZpZXcgaGllcmFyY2h5ICovCisgICAgW1t3aW4gY29udGVudFZpZXddIGFkZFN1YnZpZXc6Z2xWaWV3XTsKKyAgICBbd2luIG1ha2VLZXlBbmRPcmRlckZyb250Om5pbF07CisKKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL05hdGl2ZVN1YldpbmRvd193aW4zMi5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9OYXRpdmVTdWJXaW5kb3dfd2luMzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDQ1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9OYXRpdmVTdWJXaW5kb3dfd2luMzIuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiTmF0aXZlU3ViV2luZG93LmgiCisKK3N0cnVjdCBTdWJXaW5kb3dVc2VyRGF0YSB7CisgICAgU3ViV2luZG93UmVwYWludENhbGxiYWNrIHJlcGFpbnRfY2FsbGJhY2s7CisgICAgdm9pZCogcmVwYWludF9jYWxsYmFja19wYXJhbTsKK307CisKK3N0YXRpYyBMUkVTVUxUIENBTExCQUNLIHN1YldpbmRvd1Byb2MoSFdORCBod25kLCBVSU5UIHVNc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pIHsKKyAgICBpZiAodU1zZyA9PSBXTV9QQUlOVCkgeworICAgICAgICBhdXRvIHVzZXJfZGF0YSA9CisgICAgICAgICAgICAoU3ViV2luZG93VXNlckRhdGEqKUdldFdpbmRvd0xvbmdQdHIoaHduZCwgR1dMUF9VU0VSREFUQSk7CisgICAgICAgIGlmICh1c2VyX2RhdGEgJiYgdXNlcl9kYXRhLT5yZXBhaW50X2NhbGxiYWNrKSB7CisgICAgICAgICAgICB1c2VyX2RhdGEtPnJlcGFpbnRfY2FsbGJhY2sodXNlcl9kYXRhLT5yZXBhaW50X2NhbGxiYWNrX3BhcmFtKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodU1zZyA9PSBXTV9OQ0RFU1RST1kpIHsKKyAgICAgICAgU3ViV2luZG93VXNlckRhdGEqIHVzZXJfZGF0YSA9CisgICAgICAgICAgICAoU3ViV2luZG93VXNlckRhdGEqKUdldFdpbmRvd0xvbmdQdHIoaHduZCwgR1dMUF9VU0VSREFUQSk7CisgICAgICAgIGRlbGV0ZSB1c2VyX2RhdGE7CisgICAgfQorICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIHVNc2csIHdQYXJhbSwgbFBhcmFtKTsKK30KKworRUdMTmF0aXZlV2luZG93VHlwZSBjcmVhdGVTdWJXaW5kb3coRkJOYXRpdmVXaW5kb3dUeXBlIHBfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YldpbmRvd1JlcGFpbnRDYWxsYmFjayByZXBhaW50X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVwYWludF9jYWxsYmFja19wYXJhbSl7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgY2xhc3NOYW1lW10gPSAic3ViV2luIjsKKworICAgIFdORENMQVNTIHdjID0ge307CisgICAgaWYgKCFHZXRDbGFzc0luZm8oR2V0TW9kdWxlSGFuZGxlKE5VTEwpLCBjbGFzc05hbWUsICZ3YykpIHsKKyAgICAgICAgd2Muc3R5bGUgPSAgQ1NfT1dOREMgfCBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsvLyByZWRyYXcgaWYgc2l6ZSBjaGFuZ2VzCisgICAgICAgIHdjLmxwZm5XbmRQcm9jID0gJnN1YldpbmRvd1Byb2M7ICAgICAgICAgICAgICAgLy8gcG9pbnRzIHRvIHdpbmRvdyBwcm9jZWR1cmUKKyAgICAgICAgd2MuY2JXbmRFeHRyYSA9IHNpemVvZih2b2lkKikgOyAgICAgICAgICAgICAgICAvLyBzYXZlIGV4dHJhIHdpbmRvdyBtZW1vcnkKKyAgICAgICAgd2MubHBzekNsYXNzTmFtZSA9IGNsYXNzTmFtZTsgICAgICAgICAgICAgICAgICAvLyBuYW1lIG9mIHdpbmRvdyBjbGFzcworICAgICAgICBSZWdpc3RlckNsYXNzKCZ3Yyk7CisgICAgfQorCisgICAgRUdMTmF0aXZlV2luZG93VHlwZSByZXQgPSBDcmVhdGVXaW5kb3dFeCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFdTX0VYX05PUEFSRU5UTk9USUZZLCAgLy8gZG8gbm90IGJvdGhlciBvdXIgcGFyZW50IHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICBXU19DSElMRHxXU19ESVNBQkxFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgseSx3aWR0aCxoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBhdXRvIHVzZXJfZGF0YSA9IG5ldyBTdWJXaW5kb3dVc2VyRGF0YSgpOworICAgIHVzZXJfZGF0YS0+cmVwYWludF9jYWxsYmFjayA9IHJlcGFpbnRfY2FsbGJhY2s7CisgICAgdXNlcl9kYXRhLT5yZXBhaW50X2NhbGxiYWNrX3BhcmFtID0gcmVwYWludF9jYWxsYmFja19wYXJhbTsKKworICAgIFNldFdpbmRvd0xvbmdQdHIocmV0LCBHV0xQX1VTRVJEQVRBLCAoTE9OR19QVFIpdXNlcl9kYXRhKTsKKyAgICBTaG93V2luZG93KHJldCwgU1dfU0hPVyk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBkZXN0cm95U3ViV2luZG93KEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luKXsKKyAgICBQb3N0TWVzc2FnZSh3aW4sIFdNX0NMT1NFLCAwLCAwKTsKK30KKworaW50IG1vdmVTdWJXaW5kb3coRkJOYXRpdmVXaW5kb3dUeXBlIHBfcGFyZW50X3dpbmRvdywKKyAgICAgICAgICAgICAgICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgcF9zdWJfd2luZG93LAorICAgICAgICAgICAgICAgICAgaW50IHgsCisgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKKyAgICBCT09MIHJldCA9IE1vdmVXaW5kb3cocF9zdWJfd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvTmF0aXZlU3ViV2luZG93X3gxMS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9OYXRpdmVTdWJXaW5kb3dfeDExLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWVhMWExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvTmF0aXZlU3ViV2luZG93X3gxMS5jcHAKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiTmF0aXZlU3ViV2luZG93LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgQm9vbCBXYWl0Rm9yTWFwTm90aWZ5KERpc3BsYXkgKmQsIFhFdmVudCAqZSwgY2hhciAqYXJnKSB7CisgICAgaWYgKGUtPnR5cGUgPT0gTWFwTm90aWZ5ICYmIGUtPnhtYXAud2luZG93ID09IChXaW5kb3cpYXJnKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEJvb2wgV2FpdEZvckNvbmZpZ3VyZU5vdGlmeShEaXNwbGF5ICpkLCBYRXZlbnQgKmUsIGNoYXIgKmFyZykgeworICAgIGlmIChlLT50eXBlID09IENvbmZpZ3VyZU5vdGlmeSAmJiBlLT54bWFwLndpbmRvdyA9PSAoV2luZG93KWFyZykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBEaXNwbGF5ICpzX2Rpc3BsYXkgPSBOVUxMOworCitFR0xOYXRpdmVXaW5kb3dUeXBlIGNyZWF0ZVN1YldpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgcF93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YldpbmRvd1JlcGFpbnRDYWxsYmFjayByZXBhaW50X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcmVwYWludF9jYWxsYmFja19wYXJhbSkgeworICAgLy8gVGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyBwcm90ZWN0ZWQgYnkgYSBsb2NrCisgICAvLyBpbiBGcmFtZUJ1ZmZlciBzbyBpdCBpcyBzYWZlIHRvIGNoZWNrIGFuZCBpbml0aWFsaXplIHNfZGlzcGxheSBoZXJlCisgICBpZiAoIXNfZGlzcGxheSkgeworICAgICAgIHNfZGlzcGxheSA9IFhPcGVuRGlzcGxheShOVUxMKTsKKyAgIH0KKworICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIHdhOworICAgIHdhLmV2ZW50X21hc2sgPSBTdHJ1Y3R1cmVOb3RpZnlNYXNrOworICAgIHdhLm92ZXJyaWRlX3JlZGlyZWN0ID0gVHJ1ZTsKKyAgICBXaW5kb3cgd2luID0gWENyZWF0ZVdpbmRvdyhzX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF93aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlGcm9tUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlGcm9tUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlGcm9tUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXRXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YSk7CisgICAgWE1hcFdpbmRvdyhzX2Rpc3BsYXksd2luKTsKKyAgICBYU2V0V2luZG93QmFja2dyb3VuZChzX2Rpc3BsYXksIHdpbiwgQmxhY2tQaXhlbChzX2Rpc3BsYXksIDApKTsKKyAgICBYRXZlbnQgZTsKKyAgICBYSWZFdmVudChzX2Rpc3BsYXksICZlLCBXYWl0Rm9yTWFwTm90aWZ5LCAoY2hhciAqKXdpbik7CisgICAgcmV0dXJuIHdpbjsKK30KKwordm9pZCBkZXN0cm95U3ViV2luZG93KEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luKSB7CisgICAgaWYgKCFzX2Rpc3BsYXkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBYRGVzdHJveVdpbmRvdyhzX2Rpc3BsYXksIHdpbik7Cit9CisKK2ludCBtb3ZlU3ViV2luZG93KEZCTmF0aXZlV2luZG93VHlwZSBwX3BhcmVudF93aW5kb3csCisgICAgICAgICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHBfc3ViX3dpbmRvdywKKyAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgaW50IHksCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgICAgLy8gVGhpcyB2YWx1ZSBpcyBzZXQgZHVyaW5nIGNyZWF0ZSwgc28gaWYgaXQgaXMgc3RpbGwgbnVsbCwgc2ltcGx5CisgICAgLy8gcmV0dXJuIGJlY2F1c2UgdGhlIGdsb2JhbCBzdGF0ZSBpcyBjb3JydXB0ZWQKKyAgICBpZiAoIXNfZGlzcGxheSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHNvbWV0aGluZyBoYXMgY2hhbmdlZCwgb3RoZXJ3aXNlIFhJZkV2ZW50IHdpbGwgYmxvY2sgYW5kCisgICAgLy8gZnJlZXplIHRoZSBlbXVsYXRvci4KKyAgICBYV2luZG93QXR0cmlidXRlcyBhdHRyczsKKyAgICBpZiAoIVhHZXRXaW5kb3dBdHRyaWJ1dGVzKHNfZGlzcGxheSwgcF9zdWJfd2luZG93LCAmYXR0cnMpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHggPT0gYXR0cnMueCAmJiB5ID09IGF0dHJzLnkgJiYKKyAgICAgICAgd2lkdGggPT0gYXR0cnMud2lkdGggJiYgaGVpZ2h0ID09IGF0dHJzLmhlaWdodCkgeworICAgICAgICAvLyBUZWNobmljYWxseSwgcmVzaXppbmcgd2FzIGEgc3VjY2VzcyBiZWNhdXNlIGl0IHdhcyB1bm5lZWRlZC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVGhpcyBwcmV2ZW50cyBmbGlja2VyIG9uIHJlc2l6ZS4KKyAgICBYU2V0V2luZG93QmFja2dyb3VuZFBpeG1hcChzX2Rpc3BsYXksIHBfc3ViX3dpbmRvdywgTm9uZSk7CisKKyAgICBpbnQgcmV0ID0gWE1vdmVSZXNpemVXaW5kb3coCisgICAgICAgICAgICAgICAgc19kaXNwbGF5LAorICAgICAgICAgICAgICAgIHBfc3ViX3dpbmRvdywKKyAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKworICAgIFhFdmVudCBlOworICAgIFhJZkV2ZW50KHNfZGlzcGxheSwgJmUsIFdhaXRGb3JDb25maWd1cmVOb3RpZnksIChjaGFyICopcF9zdWJfd2luZG93KTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZWFkQnVmZmVyLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlYWRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODUxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZWFkQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJSZWFkQnVmZmVyLmgiCisKKyNpbmNsdWRlICJFcnJvckxvZy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK1JlYWRCdWZmZXI6OlJlYWRCdWZmZXIoc2l6ZV90IGJ1ZnNpemUpIHsKKyAgICBtX3NpemUgPSBidWZzaXplOworICAgIG1fYnVmID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhtX3NpemUpOworICAgIG1fdmFsaWREYXRhID0gMDsKKyAgICBtX3JlYWRQdHIgPSBtX2J1ZjsKK30KKworUmVhZEJ1ZmZlcjo6flJlYWRCdWZmZXIoKSB7CisgICAgZnJlZShtX2J1Zik7Cit9CisKK2ludCBSZWFkQnVmZmVyOjpnZXREYXRhKElPU3RyZWFtKiBzdHJlYW0sIGludCBtaW5TaXplKSB7CisgICAgYXNzZXJ0KHN0cmVhbSk7CisgICAgYXNzZXJ0KG1pblNpemUgPiAoaW50KW1fdmFsaWREYXRhKTsKKworICAgIGNvbnN0IGludCBtaW5TaXplVG9SZWFkID0gbWluU2l6ZSAtIG1fdmFsaWREYXRhOworICAgIGludCBtYXhTaXplVG9SZWFkOworICAgIGNvbnN0IGludCBmcmVlVGFpbFNpemUgPSBtX2J1ZiArIG1fc2l6ZSAtIChtX3JlYWRQdHIgKyBtX3ZhbGlkRGF0YSk7CisgICAgaWYgKGZyZWVUYWlsU2l6ZSA+PSBtaW5TaXplVG9SZWFkKSB7CisgICAgICAgIG1heFNpemVUb1JlYWQgPSBmcmVlVGFpbFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyZWVUYWlsU2l6ZSArIChtX3JlYWRQdHIgLSBtX2J1ZikgPj0gbWluU2l6ZVRvUmVhZCkgeworICAgICAgICAgICAgLy8gVGhlcmUncyBzb21lIGdhcCBpbiB0aGUgYmVnaW5uaW5nLCBpZiB3ZSBtb3ZlIHRoZSBkYXRhIG92ZXIgaXQKKyAgICAgICAgICAgIC8vIHRoYXQncyBnb2luZyB0byBiZSBlbm91Z2guCisgICAgICAgICAgICBtZW1tb3ZlKG1fYnVmLCBtX3JlYWRQdHIsIG1fdmFsaWREYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggc3BhY2UgZXZlbiB3aXRoIG1vdmluZywgcmVhbGxvY2F0ZS4KKyAgICAgICAgICAgIC8vIE5vdGU6IG1ha2Ugc3VyZSB3ZSBjYW4gZml0IGF0IGxlYXN0IHR3byBvZiB0aGUgcmVxdWVzdGVkIHBhY2tldHMKKyAgICAgICAgICAgIC8vICBpbnRvIHRoZSBuZXcgYnVmZmVyIHRvIG1pbmltaXplIHRoZSByZWFsbG9jYXRpb25zIGFuZAorICAgICAgICAgICAgLy8gIG1lbW1vdmUoKS1pbmcgc3R1ZmYgYXJvdW5kLgorICAgICAgICAgICAgc2l6ZV90IG5ld19zaXplID0gc3RkOjptYXg8c2l6ZV90PigKKyAgICAgICAgICAgICAgICAgICAgMiAqIG1pblNpemVUb1JlYWQgKyBtX3ZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgMiAqIG1fc2l6ZSk7CisgICAgICAgICAgICBpZiAobmV3X3NpemUgPCBtX3NpemUpIHsgIC8vIG92ZXJmbG93IGNoZWNrCisgICAgICAgICAgICAgICAgbmV3X3NpemUgPSBJTlRfTUFYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCBhdXRvIG5ld19idWYgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghbmV3X2J1ZikgeworICAgICAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGFsbG9jICV6dSBieXRlcyBmb3IgUmVhZEJ1ZmZlclxuIiwgbmV3X3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KG5ld19idWYsIG1fcmVhZFB0ciwgbV92YWxpZERhdGEpOworICAgICAgICAgICAgZnJlZShtX2J1Zik7CisgICAgICAgICAgICBtX2J1ZiA9IG5ld19idWY7CisgICAgICAgICAgICBtX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBXZSBjYW4gcmVhZCBtb3JlIG5vdywgbGV0J3MgcmVxdWVzdCBpdCBpbiBjYXNlIGFsbCBkYXRhIGlzIHJlYWR5CisgICAgICAgIC8vIGZvciByZWFkaW5nLgorICAgICAgICBtYXhTaXplVG9SZWFkID0gbV9zaXplIC0gbV92YWxpZERhdGE7CisgICAgICAgIG1fcmVhZFB0ciA9IG1fYnVmOworICAgIH0KKworICAgIC8vIGdldCBmcmVzaCBkYXRhIGludG8gdGhlIGJ1ZmZlcjsKKyAgICBpbnQgcmVhZFRvdGFsID0gMDsKKyAgICBkbyB7CisgICAgICAgIGNvbnN0IHNpemVfdCByZWFkTm93ID0gc3RyZWFtLT5yZWFkKG1fcmVhZFB0ciArIG1fdmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplVG9SZWFkIC0gcmVhZFRvdGFsKTsKKyAgICAgICAgaWYgKCFyZWFkTm93KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVhZFRvdGFsICs9IHJlYWROb3c7CisgICAgICAgIG1fdmFsaWREYXRhICs9IHJlYWROb3c7CisgICAgfSB3aGlsZSAocmVhZFRvdGFsIDwgbWluU2l6ZVRvUmVhZCk7CisKKyAgICByZXR1cm4gcmVhZFRvdGFsOworfQorCit2b2lkIFJlYWRCdWZmZXI6OmNvbnN1bWUoc2l6ZV90IGFtb3VudCkgeworICAgIGFzc2VydChhbW91bnQgPD0gbV92YWxpZERhdGEpOworICAgIG1fdmFsaWREYXRhIC09IGFtb3VudDsKKyAgICBtX3JlYWRQdHIgKz0gYW1vdW50OworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlYWRCdWZmZXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlYWRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ3MmFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVhZEJ1ZmZlci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvSU9TdHJlYW0uaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKworY2xhc3MgUmVhZEJ1ZmZlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmVhZEJ1ZmZlcihzaXplX3QgYnVmU2l6ZSk7CisgICAgflJlYWRCdWZmZXIoKTsKKyAgICBpbnQgZ2V0RGF0YShJT1N0cmVhbSAqc3RyZWFtLCBpbnQgbWluU2l6ZSk7IC8vIGdldCBmcmVzaCBkYXRhIGZyb20gdGhlIHN0cmVhbQorICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZigpIHsgcmV0dXJuIG1fcmVhZFB0cjsgfSAvLyByZXR1cm4gdGhlIG5leHQgcmVhZCBsb2NhdGlvbgorICAgIHNpemVfdCB2YWxpZERhdGEoKSB7IHJldHVybiBtX3ZhbGlkRGF0YTsgfSAvLyByZXR1cm4gdGhlIGFtb3VudCBvZiB2YWxpZCBkYXRhIGluIHJlYWRwdHIKKyAgICB2b2lkIGNvbnN1bWUoc2l6ZV90IGFtb3VudCk7IC8vIG5vdGlmeSB0aGF0ICdhbW91bnQnIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQ7Citwcml2YXRlOgorICAgIHVuc2lnbmVkIGNoYXIgKm1fYnVmOworICAgIHVuc2lnbmVkIGNoYXIgKm1fcmVhZFB0cjsKKyAgICBzaXplX3QgbV9zaXplOworICAgIHNpemVfdCBtX3ZhbGlkRGF0YTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbEltcGwuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbEltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjdiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJDaGFubmVsSW1wbC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNpbmNsdWRlICJSZW5kZXJDaGFubmVsSW1wbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgZW11Z2wgeworCisjZGVmaW5lIEVNVUdMX0RFQlVHX0xFVkVMIDAKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vZGVidWcuaCIKKwordXNpbmcgQnVmZmVyID0gUmVuZGVyQ2hhbm5lbDo6QnVmZmVyOwordXNpbmcgSW9SZXN1bHQgPSBSZW5kZXJDaGFubmVsOjpJb1Jlc3VsdDsKK3VzaW5nIFN0YXRlID0gUmVuZGVyQ2hhbm5lbDo6U3RhdGU7Cit1c2luZyBBdXRvTG9jayA9IGFuZHJvaWQ6OmJhc2U6OkF1dG9Mb2NrOworCisvLyBUaGVzZSBjb25zdGFudHMgY29ycmVzcG9uZCB0byB0aGUgY2FwYWNpdGllcyBvZiBidWZmZXIgcXVldWVzCisvLyB1c2VkIGJ5IGVhY2ggUmVuZGVyQ2hhbm5lbEltcGwgaW5zdGFuY2UuIEJlbmNobWFya2luZyBzaG93cyB0aGF0CisvLyBpdCdzIGltcG9ydGFudCB0byBoYXZlIGEgbGFyZ2UgcXVldWUgZm9yIGd1ZXN0IC0+IGhvc3QgdHJhbnNmZXJzLAorLy8gYnV0IGEgbXVjaCBzbWFsbGVyIG9uZSB3b3JrcyBmb3IgaG9zdCAtPiBndWVzdCBvbmVzLgorc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0d1ZXN0VG9Ib3N0UXVldWVDYXBhY2l0eSA9IDEwMjRVOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga0hvc3RUb0d1ZXN0UXVldWVDYXBhY2l0eSA9IDE2VTsKKworUmVuZGVyQ2hhbm5lbEltcGw6OlJlbmRlckNoYW5uZWxJbXBsKCkKKyAgICA6IG1Mb2NrKCksCisgICAgICBtRnJvbUd1ZXN0KGtHdWVzdFRvSG9zdFF1ZXVlQ2FwYWNpdHksIG1Mb2NrKSwKKyAgICAgIG1Ub0d1ZXN0KGtIb3N0VG9HdWVzdFF1ZXVlQ2FwYWNpdHksIG1Mb2NrKSB7CisgICAgdXBkYXRlU3RhdGVMb2NrZWQoKTsKK30KKwordm9pZCBSZW5kZXJDaGFubmVsSW1wbDo6c2V0RXZlbnRDYWxsYmFjayhFdmVudENhbGxiYWNrJiYgY2FsbGJhY2spIHsKKyAgICBtRXZlbnRDYWxsYmFjayA9IHN0ZDo6bW92ZShjYWxsYmFjayk7Cit9CisKK3ZvaWQgUmVuZGVyQ2hhbm5lbEltcGw6OnNldFdhbnRlZEV2ZW50cyhTdGF0ZSBzdGF0ZSkgeworICAgIEQoInN0YXRlPSVkIiwgKGludClzdGF0ZSk7CisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgbVdhbnRlZEV2ZW50cyB8PSBzdGF0ZTsKKyAgICBub3RpZnlTdGF0ZUNoYW5nZUxvY2tlZCgpOworfQorCitSZW5kZXJDaGFubmVsOjpTdGF0ZSBSZW5kZXJDaGFubmVsSW1wbDo6c3RhdGUoKSBjb25zdCB7CisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TdGF0ZTsKK30KKworSW9SZXN1bHQgUmVuZGVyQ2hhbm5lbEltcGw6OnRyeVdyaXRlKEJ1ZmZlciYmIGJ1ZmZlcikgeworICAgIEQoImJ1ZmZlciBzaXplPSVkIiwgKGludClidWZmZXIuc2l6ZSgpKTsKKyAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1Gcm9tR3Vlc3QudHJ5UHVzaExvY2tlZChzdGQ6Om1vdmUoYnVmZmVyKSk7CisgICAgdXBkYXRlU3RhdGVMb2NrZWQoKTsKKyAgICBERCgibUZyb21HdWVzdC50cnlQdXNoTG9ja2VkKCkgcmV0dXJuZWQgJWQsIHN0YXRlICVkIiwgKGludClyZXN1bHQsCisgICAgICAgKGludCltU3RhdGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0lvUmVzdWx0IFJlbmRlckNoYW5uZWxJbXBsOjp0cnlSZWFkKEJ1ZmZlciogYnVmZmVyKSB7CisgICAgRCgiZW50ZXIiKTsKKyAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1Ub0d1ZXN0LnRyeVBvcExvY2tlZChidWZmZXIpOworICAgIHVwZGF0ZVN0YXRlTG9ja2VkKCk7CisgICAgREQoIm1Ub0d1ZXN0LnRyeVBvcExvY2tlZCgpIHJldHVybmVkICVkLCBidWZmZXIgc2l6ZSAlZCwgc3RhdGUgJWQiLAorICAgICAgIChpbnQpcmVzdWx0LCAoaW50KWJ1ZmZlci0+c2l6ZSgpLCAoaW50KW1TdGF0ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBSZW5kZXJDaGFubmVsSW1wbDo6c3RvcCgpIHsKKyAgICBEKCJlbnRlciIpOworICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgIG1Gcm9tR3Vlc3QuY2xvc2VMb2NrZWQoKTsKKyAgICBtVG9HdWVzdC5jbG9zZUxvY2tlZCgpOworfQorCitib29sIFJlbmRlckNoYW5uZWxJbXBsOjp3cml0ZVRvR3Vlc3QoQnVmZmVyJiYgYnVmZmVyKSB7CisgICAgRCgiYnVmZmVyIHNpemU9JWQiLCAoaW50KWJ1ZmZlci5zaXplKCkpOworICAgIEF1dG9Mb2NrIGxvY2sobUxvY2spOworICAgIElvUmVzdWx0IHJlc3VsdCA9IG1Ub0d1ZXN0LnB1c2hMb2NrZWQoc3RkOjptb3ZlKGJ1ZmZlcikpOworICAgIHVwZGF0ZVN0YXRlTG9ja2VkKCk7CisgICAgREQoIm1Ub0d1ZXN0LnB1c2hMb2NrZWQoKSByZXR1cm5lZCAlZCwgc3RhdGUgJWQiLCAoaW50KXJlc3VsdCwgKGludCltU3RhdGUpOworICAgIG5vdGlmeVN0YXRlQ2hhbmdlTG9ja2VkKCk7CisgICAgcmV0dXJuIHJlc3VsdCA9PSBJb1Jlc3VsdDo6T2s7Cit9CisKK0lvUmVzdWx0IFJlbmRlckNoYW5uZWxJbXBsOjpyZWFkRnJvbUd1ZXN0KEJ1ZmZlciogYnVmZmVyLCBib29sIGJsb2NraW5nKSB7CisgICAgRCgiZW50ZXIiKTsKKyAgICBBdXRvTG9jayBsb2NrKG1Mb2NrKTsKKyAgICBJb1Jlc3VsdCByZXN1bHQ7CisgICAgaWYgKGJsb2NraW5nKSB7CisgICAgICAgIHJlc3VsdCA9IG1Gcm9tR3Vlc3QucG9wTG9ja2VkKGJ1ZmZlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gbUZyb21HdWVzdC50cnlQb3BMb2NrZWQoYnVmZmVyKTsKKyAgICB9CisgICAgdXBkYXRlU3RhdGVMb2NrZWQoKTsKKyAgICBERCgibUZyb21HdWVzdC4lcygpIHJldHVybiAlZCwgYnVmZmVyIHNpemUgJWQsIHN0YXRlICVkIiwKKyAgICAgICBibG9ja2luZyA/ICJwb3BMb2NrZWQiIDogInRyeVBvcExvY2tlZCIsIChpbnQpcmVzdWx0LAorICAgICAgIChpbnQpYnVmZmVyLT5zaXplKCksIChpbnQpbVN0YXRlKTsKKyAgICBub3RpZnlTdGF0ZUNoYW5nZUxvY2tlZCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUmVuZGVyQ2hhbm5lbEltcGw6OnN0b3BGcm9tSG9zdCgpIHsKKyAgICBEKCJlbnRlciIpOworCisgICAgQXV0b0xvY2sgbG9jayhtTG9jayk7CisgICAgbUZyb21HdWVzdC5jbG9zZUxvY2tlZCgpOworICAgIG1Ub0d1ZXN0LmNsb3NlTG9ja2VkKCk7CisgICAgbVN0YXRlIHw9IFN0YXRlOjpTdG9wcGVkOworICAgIG5vdGlmeVN0YXRlQ2hhbmdlTG9ja2VkKCk7Cit9CisKK3ZvaWQgUmVuZGVyQ2hhbm5lbEltcGw6OnVwZGF0ZVN0YXRlTG9ja2VkKCkgeworICAgIFN0YXRlIHN0YXRlID0gUmVuZGVyQ2hhbm5lbDo6U3RhdGU6OkVtcHR5OworCisgICAgaWYgKG1Ub0d1ZXN0LmNhblBvcExvY2tlZCgpKSB7CisgICAgICAgIHN0YXRlIHw9IFN0YXRlOjpDYW5SZWFkOworICAgIH0KKyAgICBpZiAobUZyb21HdWVzdC5jYW5QdXNoTG9ja2VkKCkpIHsKKyAgICAgICAgc3RhdGUgfD0gU3RhdGU6OkNhbldyaXRlOworICAgIH0KKyAgICBpZiAobVRvR3Vlc3QuaXNDbG9zZWRMb2NrZWQoKSkgeworICAgICAgICBzdGF0ZSB8PSBTdGF0ZTo6U3RvcHBlZDsKKyAgICB9CisgICAgbVN0YXRlID0gc3RhdGU7Cit9CisKK3ZvaWQgUmVuZGVyQ2hhbm5lbEltcGw6Om5vdGlmeVN0YXRlQ2hhbmdlTG9ja2VkKCkgeworICAgIFN0YXRlIGF2YWlsYWJsZSA9IG1TdGF0ZSAmIG1XYW50ZWRFdmVudHM7CisgICAgaWYgKGF2YWlsYWJsZSAhPSAwKSB7CisgICAgICAgIEQoImNhbGxiYWNrIHdpdGggJWQiLCAoaW50KWF2YWlsYWJsZSk7CisgICAgICAgIG1XYW50ZWRFdmVudHMgJj0gfm1TdGF0ZTsKKyAgICAgICAgbUV2ZW50Q2FsbGJhY2soYXZhaWxhYmxlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbEltcGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNoYW5uZWxJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzMDZkMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNoYW5uZWxJbXBsLmgKQEAgLTAsMCArMSw4OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvUmVuZGVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkJ1ZmZlclF1ZXVlLmgiCisjaW5jbHVkZSAiUmVuZGVyZXJJbXBsLmgiCisKK25hbWVzcGFjZSBlbXVnbCB7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBSZW5kZXJDaGFubmVsIGludGVyZmFjZSB0aGF0IGNvbm5lY3RzIGEgZ3Vlc3QKKy8vIGNsaWVudCB0aHJlYWQgKHJlYWxseSBhbiBBbmRyb2lkUGlwZSBpbXBsZW1lbnRhdGlvbikgdG8gYSBob3N0CisvLyBSZW5kZXJUaHJlYWQgaW5zdGFuY2UuCitjbGFzcyBSZW5kZXJDaGFubmVsSW1wbCBmaW5hbCA6IHB1YmxpYyBSZW5kZXJDaGFubmVsIHsKK3B1YmxpYzoKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIFJlbmRlckNoYW5uZWxJbXBsKCk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgIC8vIFJlbmRlckNoYW5uZWwgb3ZlcnJpZGVuIG1ldGhvZHMuIFRoZXNlIGFyZSBjYWxsZWQgZnJvbSB0aGUgZ3Vlc3QKKyAgICAvLyBjbGllbnQgdGhyZWFkLgorCisgICAgLy8gU2V0IHRoZSBldmVudCB8Y2FsbGJhY2t8IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGhvc3QgY2hhbmdlcyB0aGUKKyAgICAvLyBzdGF0ZSBvZiB0aGUgY2hhbm5lbCwgYWNjb3JkaW5nIHRvIHRoZSBldmVudCBtYXNrIHByb3ZpZGVkIGJ5CisgICAgLy8gc2V0V2FudGVkRXZlbnRzKCkuIENhbGwgdGhpcyBmdW5jdGlvbiByaWdodCBhZnRlciBjcmVhdGluZyB0aGUKKyAgICAvLyBpbnN0YW5jZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXZlbnRDYWxsYmFjayhFdmVudENhbGxiYWNrJiYgY2FsbGJhY2spIG92ZXJyaWRlIGZpbmFsOworCisgICAgLy8gU2V0IHRoZSBtYXNrIG9mIGV2ZW50cyB0aGUgZ3Vlc3Qgd2FudHMgdG8gYmUgbm90aWZpZWQgb2YgZnJvbSB0aGUKKyAgICAvLyBob3N0IHRocmVhZC4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2FudGVkRXZlbnRzKFN0YXRlIHN0YXRlKSBvdmVycmlkZSBmaW5hbDsKKworICAgIC8vIFJldHVybiB0aGUgY3VycmVudCBjaGFubmVsIHN0YXRlIHJlbGF0aXZlIHRvIHRoZSBndWVzdC4KKyAgICB2aXJ0dWFsIFN0YXRlIHN0YXRlKCkgY29uc3Qgb3ZlcnJpZGUgZmluYWw7CisKKyAgICAvLyBUcnkgdG8gc2VuZCBhIGJ1ZmZlciBmcm9tIHRoZSBndWVzdCB0byB0aGUgaG9zdCByZW5kZXIgdGhyZWFkLgorICAgIHZpcnR1YWwgSW9SZXN1bHQgdHJ5V3JpdGUoQnVmZmVyJiYgYnVmZmVyKSBvdmVycmlkZSBmaW5hbDsKKworICAgIC8vIFRyeSB0byByZWFkIGEgYnVmZmVyIGZyb20gdGhlIGhvc3QgcmVuZGVyIHRocmVhZCBpbnRvIHRoZSBndWVzdC4KKyAgICB2aXJ0dWFsIElvUmVzdWx0IHRyeVJlYWQoQnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlIGZpbmFsOworCisgICAgLy8gQ2xvc2UgdGhlIGNoYW5uZWwgZnJvbSB0aGUgZ3Vlc3QuCisgICAgdmlydHVhbCB2b2lkIHN0b3AoKSBvdmVycmlkZSBmaW5hbDsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB0aGUgaG9zdCByZW5kZXIgdGhyZWFkLgorCisgICAgLy8gU2VuZCBhIGJ1ZmZlciB0byB0aGUgZ3Vlc3QsIHRoaXMgY2FsbCBpcyBibG9ja2luZy4gT24gc3VjY2VzcywKKyAgICAvLyBtb3ZlIHxidWZmZXJ8IGludG8gdGhlIGNoYW5uZWwgYW5kIHJldHVybiB0cnVlLiBPbiBmYWlsdXJlLCByZXR1cm4KKyAgICAvLyBmYWxzZSAobWVhbmluZyB0aGF0IHRoZSBjaGFubmVsIHdhcyBjbG9zZWQpLgorICAgIGJvb2wgd3JpdGVUb0d1ZXN0KEJ1ZmZlciYmIGJ1ZmZlcik7CisKKyAgICAvLyBSZWFkIGRhdGEgZnJvbSB0aGUgZ3Vlc3QuIElmIHxibG9ja2luZ3wgaXMgdHJ1ZSwgdGhlIGNhbGwgd2lsbCBiZQorICAgIC8vIGJsb2NraW5nLiBPbiBzdWNjZXNzLCBtb3ZlIGl0ZW0gaW50byB8KmJ1ZmZlcnwgYW5kIHJldHVybiB0cnVlLiBPbgorICAgIC8vIGZhaWx1cmUsIHJldHVybiBJb1Jlc3VsdDo6RXJyb3IgdG8gaW5kaWNhdGUgdGhlIGNoYW5uZWwgd2FzIGNsb3NlZCwKKyAgICAvLyBvciBJb1Jlc3VsdDo6VHJ5QWdhaW4gdG8gaW5kaWNhdGUgaXQgd2FzIGVtcHR5ICh0aGlzIGNhbiBoYXBwZW4gb25seQorICAgIC8vIGlmIHxibG9ja2luZ3wgaXMgZmFsc2UpLgorICAgIElvUmVzdWx0IHJlYWRGcm9tR3Vlc3QoQnVmZmVyKiBidWZmZXIsIGJvb2wgYmxvY2tpbmcpOworCisgICAgLy8gQ2xvc2UgdGhlIGNoYW5uZWwgZnJvbSB0aGUgaG9zdC4KKyAgICB2b2lkIHN0b3BGcm9tSG9zdCgpOworCitwcml2YXRlOgorICAgIHZvaWQgdXBkYXRlU3RhdGVMb2NrZWQoKTsKKyAgICB2b2lkIG5vdGlmeVN0YXRlQ2hhbmdlTG9ja2VkKCk7CisKKyAgICBFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOworCisgICAgLy8gQSBzaW5nbGUgbG9jayB0byBwcm90ZWN0IHRoZSBzdGF0ZSBhbmQgdGhlIHR3byBidWZmZXIgcXVldWVzIGF0IHRoZQorICAgIC8vIHNhbWUgdGltZS4gTk9URTogVGhpcyBuZWVkcyB0byBhcHBlYXIgYmVmb3JlIHRoZSBCdWZmZXJRdWV1ZSBpbnN0YW5jZXMuCisgICAgbXV0YWJsZSBhbmRyb2lkOjpiYXNlOjpMb2NrIG1Mb2NrOworICAgIFN0YXRlIG1TdGF0ZSA9IFN0YXRlOjpFbXB0eTsKKyAgICBTdGF0ZSBtV2FudGVkRXZlbnRzID0gU3RhdGU6OkVtcHR5OworICAgIEJ1ZmZlclF1ZXVlIG1Gcm9tR3Vlc3Q7CisgICAgQnVmZmVyUXVldWUgbVRvR3Vlc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRleHQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NjVmMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRleHQuY3BwCkBAIC0wLDAgKzEsODcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSAiUmVuZGVyQ29udGV4dC5oIgorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YxRGlzcGF0Y2guaCIKKworI2luY2x1ZGUgPE9wZW5nbENvZGVjQ29tbW9uL0Vycm9yTG9nLmg+CisKK2V4dGVybiBHTEVTdjFEaXNwYXRjaCBzX2dsZXMxOworCitSZW5kZXJDb250ZXh0KiBSZW5kZXJDb250ZXh0OjpjcmVhdGUoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBzaGFyZWRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNHbDIpIHsKKyAgICB2b2lkKiBlbXVsYXRlZEdMRVMxQ29udGV4dCA9IE5VTEw7CisKKyAgICBib29sIHNob3VsZEVtdWxhdGVHTEVTMSA9IHNfZ2xlczEudW5kZXJseWluZ19nbGVzMl9hcGkgIT0gTlVMTDsKKyAgICBpbnQgY2xpZW50VmVyc2lvbjsKKworICAgIGlmIChzaG91bGRFbXVsYXRlR0xFUzEpIHsKKyAgICAgICAgY2xpZW50VmVyc2lvbiA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xpZW50VmVyc2lvbiA9IGlzR2wyID8gMiA6IDE7CisgICAgfQorCisgICAgY29uc3QgRUdMaW50IGNvbnRleHRBdHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCBjbGllbnRWZXJzaW9uLAorICAgICAgICBFR0xfTk9ORQorICAgIH07CisgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gc19lZ2wuZWdsQ3JlYXRlQ29udGV4dCgKKyAgICAgICAgICAgIGRpc3BsYXksIGNvbmZpZywgc2hhcmVkQ29udGV4dCwgY29udGV4dEF0dHJpYnMpOworICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGZhaWxlZCB0byBjcmVhdGUgY29udGV4dCAoRUdMX05PX0NPTlRFWFQgcmVzdWx0KVxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaXNHbDIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZW5kZXJDb250ZXh0KGRpc3BsYXksIGNvbnRleHQsIGlzR2wyLCBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAoc2hvdWxkRW11bGF0ZUdMRVMxKSB7CisgICAgICAgIERCRygiJXM6IHNob3VsZCBiZSBjcmVhdGluZyBhIGVtdWxhdGVkIGdsZXMxIGNvbnRleHQgaGVyZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaWYgKHNoYXJlZENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgICAgIERCRygiJXM6IHRoYW5rZnVsbHksIHRoaXMgY29udGV4dCBpc24ndCBzaGFyaW5nIGFueXRoaW5nIDopXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgREJHKCIlczogdGhpcyBjb250ZXh0IGlzIHNoYXJlZC4gbmVlZCB0byBtYWludGFpbiBhIHNvcnQgb2YgbWFwIEkgZ3Vlc3NcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICAgICAgZW11bGF0ZWRHTEVTMUNvbnRleHQgPSBzX2dsZXMxLmNyZWF0ZV9nbGVzMV9jb250ZXh0KE5VTEwsIHNfZ2xlczEudW5kZXJseWluZ19nbGVzMl9hcGkpOworICAgICAgICBEQkcoIiVzOiBjcmVhdGVkIGEgZW11bGF0ZWQgZ2xlczEgY29udGV4dCBAICVwXG4iLCBfX0ZVTkNUSU9OX18sIGVtdWxhdGVkR0xFUzFDb250ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFJlbmRlckNvbnRleHQoZGlzcGxheSwgY29udGV4dCwgaXNHbDIsIGVtdWxhdGVkR0xFUzFDb250ZXh0KTsKK30KKworUmVuZGVyQ29udGV4dDo6UmVuZGVyQ29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0dsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZW11bGF0ZWRHTEVTMUNvbnRleHQpIDoKKyAgICAgICAgbURpc3BsYXkoZGlzcGxheSksCisgICAgICAgIG1Db250ZXh0KGNvbnRleHQpLAorICAgICAgICBtSXNHbDIoaXNHbDIpLAorICAgICAgICBtRW11bGF0ZWRHTEVTMUNvbnRleHQoZW11bGF0ZWRHTEVTMUNvbnRleHQpLAorICAgICAgICBtQ29udGV4dERhdGEoKSB7IH0KKworUmVuZGVyQ29udGV4dDo6flJlbmRlckNvbnRleHQoKSB7CisgICAgaWYgKG1Db250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIHNfZWdsLmVnbERlc3Ryb3lDb250ZXh0KG1EaXNwbGF5LCBtQ29udGV4dCk7CisgICAgfQorICAgIGlmIChtRW11bGF0ZWRHTEVTMUNvbnRleHQgIT0gTlVMTCkgeworICAgICAgICBzX2dsZXMxLmRlc3Ryb3lfZ2xlczFfY29udGV4dChtRW11bGF0ZWRHTEVTMUNvbnRleHQpOworICAgICAgICBtRW11bGF0ZWRHTEVTMUNvbnRleHQgPSBOVUxMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRleHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2M0NmJiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ29udGV4dC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9MSUJSRU5ERVJfUkVOREVSX0NPTlRFWFRfSAorI2RlZmluZSBfTElCUkVOREVSX1JFTkRFUl9DT05URVhUX0gKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zbWFydF9wdHIuaCIKKyNpbmNsdWRlICJHTERlY29kZXJDb250ZXh0RGF0YS5oIgorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorCisvLyBBIGNsYXNzIHVzZWQgdG8gbW9kZWwgYSBndWVzdCBFR0xDb250ZXh0LiBUaGlzIHNpbXBseSB3cmFwcyBhIGhvc3QKKy8vIEVHTENvbnRleHQsIGFzc29jaWF0ZWQgd2l0aCBhbiBHTERlY29kZXJDb250ZXh0RGF0YSBpbnN0YW5jZSB0aGF0IGlzCisvLyB1c2VkIHRvIHN0b3JlIGNvcGllcyBvZiBndWVzdC1zaWRlIGFycmF5cy4KK2NsYXNzIFJlbmRlckNvbnRleHQgeworcHVibGljOgorICAgIC8vIENyZWF0ZSBhIG5ldyBSZW5kZXJDb250ZXh0IGluc3RhbmNlLgorICAgIC8vIHxkaXNwbGF5fCBpcyB0aGUgaG9zdCBFR0xEaXNwbGF5IGhhbmRsZS4KKyAgICAvLyB8Y29uZmlnfCBpcyB0aGUgaG9zdCBFR0xDb25maWcgdG8gdXNlLgorICAgIC8vIHxzaGFyZWRDb250ZXh0fCBpcyBlaXRoZXIgRUdMX05PX0NPTlRFWFQgb2YgYSBob3N0IEVHTENvbnRleHQgaGFuZGxlLgorICAgIC8vIHxpc0dsMnwgaXMgdHJ1ZSBpZmYgdGhlIG5ldyBjb250ZXh0IHdpbGwgYmUgdXNlZCB3aXRoIEdMRVN2Miwgb3IKKyAgICAvLyBHTEVTdjEgb3RoZXJ3aXNlLgorICAgIHN0YXRpYyBSZW5kZXJDb250ZXh0ICpjcmVhdGUoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgc2hhcmVkQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNHTDIgPSBmYWxzZSk7CisKKyAgICAvLyBEZXN0cnVjdG9yLgorICAgIH5SZW5kZXJDb250ZXh0KCk7CisKKyAgICAvLyBSZXRyaWV2ZSBob3N0IEVHTENvbnRleHQgdmFsdWUuCisgICAgRUdMQ29udGV4dCBnZXRFR0xDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbUNvbnRleHQ7IH0KKworICAgIC8vIFJldHJpZXZlIGVtdWxhdGVkIEdMRVMxIGNvbnRleHQuCisgICAgdm9pZCogZ2V0RW11bGF0ZWRHTEVTMUNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtRW11bGF0ZWRHTEVTMUNvbnRleHQ7IH0KKworICAgIC8vIFJldHVybiB0cnVlIGlmZiB0aGlzIGlzIGEgR0xFU3YyIGNvbnRleHQuCisgICAgYm9vbCBpc0dMMigpIGNvbnN0IHsgcmV0dXJuIG1Jc0dsMjsgfQorCisgICAgLy8gUmV0cmlldmUgR0xEZWNvZGVyQ29udGV4dERhdGEgaW5zdGFuY2UgcmVmZXJlbmNlIGZvciB0aGlzCisgICAgLy8gUmVuZGVyQ29udGV4dCBpbnN0YW5jZS4KKyAgICBHTERlY29kZXJDb250ZXh0RGF0YSYgZGVjb2RlckNvbnRleHREYXRhKCkgeyByZXR1cm4gbUNvbnRleHREYXRhOyB9CisKK3ByaXZhdGU6CisgICAgUmVuZGVyQ29udGV4dCgpOworCisgICAgUmVuZGVyQ29udGV4dChFR0xEaXNwbGF5IGRpc3BsYXksCisgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICBib29sIGlzR2wyLAorICAgICAgICAgICAgICAgICAgdm9pZCogZW11bGF0ZWRHTEVTMUNvbnRleHQpOworCitwcml2YXRlOgorICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CisgICAgRUdMQ29udGV4dCBtQ29udGV4dDsKKyAgICBib29sIG1Jc0dsMjsKKyAgICB2b2lkKiBtRW11bGF0ZWRHTEVTMUNvbnRleHQ7CisgICAgR0xEZWNvZGVyQ29udGV4dERhdGEgbUNvbnRleHREYXRhOworfTsKKwordHlwZWRlZiBlbXVnbDo6U21hcnRQdHI8UmVuZGVyQ29udGV4dD4gUmVuZGVyQ29udGV4dFB0cjsKKworI2VuZGlmICAvLyBfTElCUkVOREVSX1JFTkRFUl9DT05URVhUX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRyb2wuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjODAzZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRyb2wuY3BwCkBAIC0wLDAgKzEsNzE1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiUmVuZGVyQ29udHJvbC5oIgorCisjaW5jbHVkZSAiRGlzcGF0Y2hUYWJsZXMuaCIKKyNpbmNsdWRlICJGYkNvbmZpZy5oIgorI2luY2x1ZGUgIkZlbmNlU3luYy5oIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyQ29udGV4dC5oIgorI2luY2x1ZGUgIlJlbmRlclRocmVhZEluZm8uaCIKKyNpbmNsdWRlICJTeW5jVGhyZWFkLmgiCisjaW5jbHVkZSAiQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mby5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvU3RyaW5nVmlldy5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9mZWF0dXJlX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zeW5jX2RldmljZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi90aHJlYWQuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpBdXRvTG9jazsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkxvY2s7CisKKyNkZWZpbmUgREVCVUdfR1JBTExPQ19TWU5DIDAKKyNkZWZpbmUgREVCVUdfRUdMX1NZTkMgMAorCisjZGVmaW5lIFJFTkRFUkNPTlRST0xfRFBSSU5UKC4uLikgZG8geyBcCisgICAgaWYgKCFWRVJCT1NFX0NIRUNLKGdsZXMpKSB7IFZFUkJPU0VfRU5BQkxFKGdsZXMpOyB9IFwKKyAgICBWRVJCT1NFX1RJRF9GVU5DVElPTl9EUFJJTlQoZ2xlcywgX19WQV9BUkdTX18pOyBcCit9IHdoaWxlKDApCisKKyNpZiBERUJVR19HUkFMTE9DX1NZTkMKKyNkZWZpbmUgR1JTWU5DX0RQUklOVCBSRU5ERVJDT05UUk9MX0RQUklOVAorI2Vsc2UKKyNkZWZpbmUgR1JTWU5DX0RQUklOVCguLi4pCisjZW5kaWYKKworI2lmIERFQlVHX0VHTF9TWU5DCisjZGVmaW5lIEVHTFNZTkNfRFBSSU5UIFJFTkRFUkNPTlRST0xfRFBSSU5UCisjZWxzZQorI2RlZmluZSBFR0xTWU5DX0RQUklOVCguLi4pCisjZW5kaWYKKworLy8gR3JhbGxvY1N5bmMgaXMgYSBjbGFzcyB0aGF0IGhlbHBzIHRvIHJlZmxlY3QgdGhlIGJlaGF2aW9yIG9mCisvLyBncmFsbG9ja19sb2NrL2dyYWxsb2NfdW5sb2NrIG9uIHRoZSBndWVzdC4KKy8vIElmIHdlIGRvbid0IHVzZSB0aGlzLCBhcHBzIHRoYXQgdXNlIGdyYWxsb2MgYnVmZmVycyAoc3VjaCBhcyB3ZWJjYW0pCisvLyB3aWxsIGhhdmUgb3V0IG9mIG9yZGVyIGZyYW1lcywKKy8vIGFzIEdMIGNhbGxzIGZyb20gZGlmZmVyZW50IHRocmVhZHMgaW4gdGhlIGd1ZXN0CisvLyBhcmUgYWxsb3dlZCB0byBhcnJpdmUgYXQgdGhlIGhvc3QgaW4gYW55IG9yZGVyaW5nLgorY2xhc3MgR3JhbGxvY1N5bmMgeworcHVibGljOgorICAgIEdyYWxsb2NTeW5jKCkgeworICAgICAgICAvLyBIYXZpbmcgaW4tb3JkZXIgd2ViY2FtIGZyYW1lcyBpcyBuaWNlLCBidXQgbm90IGF0IHRoZSBjb3N0CisgICAgICAgIC8vIG9mIHBvdGVudGlhbCBkZWFkbG9ja3M7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiB3aGF0IHNpdHVhdGlvbnMgaW4gd2hpY2gKKyAgICAgICAgLy8gd2UgYWN0dWFsbHkgbG9jay91bmxvY2sgdGhlIGdyYWxsb2MgY29sb3IgYnVmZmVyLgorICAgICAgICAvLworICAgICAgICAvLyBUbyBhdm9pZCBkZWFkbG9jazoKKyAgICAgICAgLy8gd2UgcmVxdWlyZSByY0NvbG9yQnVmZmVyQ2FjaGVGbHVzaCB0byBiZSBjYWxsZWQKKyAgICAgICAgLy8gd2hlbmV2ZXIgZ3JhbGxvY19sb2NrIGlzIGNhbGxlZCBvbiB0aGUgZ3Vlc3QsCisgICAgICAgIC8vIGFuZCB3ZSByZXF1aXJlIHJjVXBkYXRlV2luZG93Q29sb3JCdWZmZXIgdG8gYmUgY2FsbGVkCisgICAgICAgIC8vIHdoZW5ldmVyIGdyYWxsb2NfdW5sb2NrIGlzIGNhbGxlZCBvbiB0aGUgZ3Vlc3QuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgdGhlIHN5c3RlbSBpbWFnZSBvcHRpbWl6ZSBvdXQKKyAgICAgICAgLy8gdGhlIGNhbGwgdG8gcmNVcGRhdGVXaW5kb3dDb2xvckJ1ZmZlciBpbiB0aGUgY2FzZSBvZiB6ZXJvCisgICAgICAgIC8vIHdpZHRoL2hlaWdodCwgYnV0IHNpbmNlIHdlJ3JlIHVzaW5nIHRoYXQgYXMgc3luY2hyb25pemF0aW9uLAorICAgICAgICAvLyB0aGF0IGxhY2sgb2YgY2FsbGluZyBjYW4gbGVhZCB0byBhIGRlYWRsb2NrIG9uIHRoZSBob3N0CisgICAgICAgIC8vIGluIG1hbnkgc2l0dWF0aW9ucworICAgICAgICAvLyAoc3dpdGNoaW5nIGNhbWVyYSBzaWRlcywgZXhpdGluZyBiZW5jaG1hcmsgYXBwcywgZXRjKQorICAgICAgICAvLyBTbywgd2UgcHV0IEdyYWxsb2NTeW5jIHVuZGVyIHRoZSBmZWF0dXJlIGNvbnRyb2wuCisgICAgICAgIG1FbmFibGVkID0gZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkKGFuZHJvaWQ6OmZlYXR1cmVjb250cm9sOjpHcmFsbG9jU3luYyk7CisKKyAgICAgICAgLy8gVGhlcmUgYXJlIHR3byBwb3RlbnRpYWwgdHJpY2t5IHNpdHVhdGlvbnMgdG8gaGFuZGxlOgorICAgICAgICAvLyBhLiBNdWx0aXBsZSB1c2VycyBvZiBncmFsbG9jIGJ1ZmZlcnMgdGhhdCBhbGwgd2FudCB0bworICAgICAgICAvLyBjYWxsIGdyYWxsb2NfbG9jay4gVGhpcyBpcyBvYmVzZXJ2ZWQgdG8gaGFwcGVuIG9uIG9sZGVyIEFQSXMKKyAgICAgICAgLy8gKDw9IDE5KS4KKyAgICAgICAgLy8gYi4gVGhlIHBpcGUgZG9lc24ndCBoYXZlIHRvIHByZXNlcnZlIG9yZGVyaW5nIG9mIHRoZQorICAgICAgICAvLyBncmFsbG9jX2xvY2sgYW5kIGdyYWxsb2NfdW5sb2NrIGNvbW1hbmRzIHRoZW1zZWx2ZXMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRvIGhhbmRsZSBhKSwgbm90aWNlIHRoZSBzaXR1YXRpb24gaXMgb25lIG9mIG9uZSB0eXBlIG9mIHVzZXMKKyAgICAgICAgLy8gbmVlZGluZyBtdWx0aXBsZSBsb2NrcyB0aGF0IG5lZWRzIHRvIGV4Y2x1ZGUgY29uY3VycmVudCB1c2UKKyAgICAgICAgLy8gYnkgYW5vdGhlciB0eXBlIG9mIHVzZXIuIFRoaXMgbWFwcyB3ZWxsIHRvIGEgcmVhZC93cml0ZSBsb2NrLAorICAgICAgICAvLyB3aGVyZSBncmFsbG9jX2xvY2sgYW5kIGdyYWxsb2NfdW5sb2NrIHVzZXJzIGFyZSByZWFkZXJzCisgICAgICAgIC8vIGFuZCByY0ZsdXNoV2luZG93Q29sb3JCdWZmZXIgaXMgdGhlIHdyaXRlci4KKyAgICAgICAgLy8gRnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGhvc3QgcHJlcGFyaW5nIGFuZCBwb3N0aW5nCisgICAgICAgIC8vIGJ1ZmZlcnMsIHRoZXNlIGFyZSBpbmRlZWQgcmVhZC93cml0ZSBvcGVyYXRpb25zLgorICAgICAgICAvLworICAgICAgICAvLyBUbyBoYW5kbGUgYiksIHdlIGdpdmUgdXAgb24gbG9ja2luZyB3aGVuIHRoZSBzdGF0ZSBpcyBvYnNlcnZlZAorICAgICAgICAvLyB0byBiZSBiYWQuIGxvY2tTdGF0ZSB0cmFja3MgaG93IG1hbnkgY29sb3IgYnVmZmVyIGxvY2tzIHRoZXJlIGFyZS4KKyAgICAgICAgLy8gSWYgbG9ja1N0YXRlIDwgMCwgaXQgbWVhbnMgd2UgZGVmaW5pdGVseSBoYXZlIGFuIHVubG9jayBiZWZvcmUgbG9jaworICAgICAgICAvLyBzb3J0IG9mIHNpdHVhdGlvbiwgYW5kIHNob3VsZCBnaXZlIHVwLgorICAgICAgICBsb2NrU3RhdGUgPSAwOworICAgIH0KKworICAgIC8vIGxvY2tDb2xvckJ1ZmZlclByZXBhcmUgaXMgZGVzaWduZWQgdG8gaGFuZGxlCisgICAgLy8gZ3JhbGxvY19sb2NrL3VubG9jayByZXF1ZXN0cywgYW5kIHVzZXMgdGhlIHJlYWQgbG9jay4KKyAgICAvLyBXaGVuIHJjRmx1c2hXaW5kb3dDb2xvckJ1ZmZlciBpcyBjYWxsZWQgKHdoZW4gZnJhbWVzIGFyZSBwb3N0ZWQpLAorICAgIC8vIHdlIHVzZSB0aGUgd3JpdGUgbG9jayAoc2VlIEdyYWxsb2NTeW5jUG9zdExvY2spLgorICAgIHZvaWQgbG9ja0NvbG9yQnVmZmVyUHJlcGFyZSgpIHsKKyAgICAgICAgaW50IG5ld0xvY2tTdGF0ZSA9ICsrbG9ja1N0YXRlOworICAgICAgICBpZiAobUVuYWJsZWQgJiYgbmV3TG9ja1N0YXRlID09IDEpIHsKKyAgICAgICAgICAgIG1HcmFsbG9jQ29sb3JCdWZmZXJMb2NrLmxvY2tSZWFkKCk7CisgICAgICAgIH0gZWxzZSBpZiAobUVuYWJsZWQpIHsKKyAgICAgICAgICAgIEdSU1lOQ19EUFJJTlQoIndhcm5pbmc6IHJlY3Vyc2l2ZS9tdWx0aXBsZSBsb2NrcyBmcm9tIGd1ZXN0ISIpOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgdW5sb2NrQ29sb3JCdWZmZXJQcmVwYXJlKCkgeworICAgICAgICBpbnQgbmV3TG9ja1N0YXRlID0gLS1sb2NrU3RhdGU7CisgICAgICAgIGlmIChtRW5hYmxlZCAmJiBuZXdMb2NrU3RhdGUgPT0gMCkgbUdyYWxsb2NDb2xvckJ1ZmZlckxvY2sudW5sb2NrUmVhZCgpOworICAgIH0KKyAgICBhbmRyb2lkOjpiYXNlOjpSZWFkV3JpdGVMb2NrIG1HcmFsbG9jQ29sb3JCdWZmZXJMb2NrOworcHJpdmF0ZToKKyAgICBib29sIG1FbmFibGVkOworICAgIHN0ZDo6YXRvbWljPGludD4gbG9ja1N0YXRlOworICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKEdyYWxsb2NTeW5jKTsKK307CisKK2NsYXNzIEdyYWxsb2NTeW5jUG9zdExvY2sgOiBwdWJsaWMgYW5kcm9pZDo6YmFzZTo6QXV0b1dyaXRlTG9jayB7CitwdWJsaWM6CisgICAgR3JhbGxvY1N5bmNQb3N0TG9jayhHcmFsbG9jU3luYyYgZ3JhbGxvY3N5bmMpIDoKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b1dyaXRlTG9jayhncmFsbG9jc3luYy5tR3JhbGxvY0NvbG9yQnVmZmVyTG9jaykgeyB9Cit9OworCitzdGF0aWMgOjplbXVnbDo6TGF6eUluc3RhbmNlPEdyYWxsb2NTeW5jPiBzR3JhbGxvY1N5bmMgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK3N0YXRpYyBjb25zdCBHTGludCByZW5kZXJlclZlcnNpb24gPSAxOworCisvLyBHTEFzeW5jU3dhcCB2ZXJzaW9uIGhpc3Rvcnk6CisvLyAiQU5EUk9JRF9FTVVfTkFUSVZFX1NZTkMiOiBvcmlnaW5hbCB2ZXJzaW9uCisvLyAiQU5EUk9JREVNVV9uYXRpdmVfc3luY192MiI6ICtjbGVhbnVwIG9mIHN5bmMgb2JqZWN0cworLy8gKFdlIG5lZWQgYWxsIHRoZSBkaWZmZXJlbnQgc3RyaW5ncyB0byBub3QgYmUgcHJlZml4ZXMgb2YgYW55IG90aGVyCisvLyBkdWUgdG8gaG93IHRoZXkgYXJlIGNoZWNrZWQgZm9yIGluIHRoZSBHTCBleHRlbnNpb25zIG9uIHRoZSBndWVzdCkKK3N0YXRpYyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3IGtBc3luY1N3YXBTdHIgPSAiQU5EUk9JRF9FTVVfbmF0aXZlX3N5bmNfdjIiOworCitzdGF0aWMgdm9pZCByY1RyaWdnZXJXYWl0KHVpbnQ2NF90IGdsc3luY19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRocmVhZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVsaW5lKTsKKworc3RhdGljIEdMaW50IHJjR2V0UmVuZGVyZXJWZXJzaW9uKCkKK3sKKyAgICBlbXVnbF9zeW5jX3JlZ2lzdGVyX3RyaWdnZXJfd2FpdChyY1RyaWdnZXJXYWl0KTsKKworICAgIHNHcmFsbG9jU3luYy5wdHIoKTsKKyAgICByZXR1cm4gcmVuZGVyZXJWZXJzaW9uOworfQorCitzdGF0aWMgRUdMaW50IHJjR2V0RUdMVmVyc2lvbihFR0xpbnQqIG1ham9yLCBFR0xpbnQqIG1pbm9yKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICB9CisgICAgKm1ham9yID0gKEVHTGludClmYi0+Z2V0Q2FwcygpLmVnbE1ham9yOworICAgICptaW5vciA9IChFR0xpbnQpZmItPmdldENhcHMoKS5lZ2xNaW5vcjsKKworICAgIHJldHVybiBFR0xfVFJVRTsKK30KKworc3RhdGljIEVHTGludCByY1F1ZXJ5RUdMU3RyaW5nKEVHTGVudW0gbmFtZSwgdm9pZCogYnVmZmVyLCBFR0xpbnQgYnVmZmVyU2l6ZSkKK3sKKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKyAgICBpZiAoIWZiKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHNfZWdsLmVnbFF1ZXJ5U3RyaW5nKGZiLT5nZXREaXNwbGF5KCksIG5hbWUpOworICAgIGlmICghc3RyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGVnbFN0cihzdHIpOworCisgICAgaW50IGxlbiA9IGVnbFN0ci5zaXplKCkgKyAxOworICAgIGlmICghYnVmZmVyIHx8IGxlbiA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIC1sZW47CisgICAgfQorCisgICAgc3RyY3B5KChjaGFyICopYnVmZmVyLCBlZ2xTdHIuY19zdHIoKSk7CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIEVHTGludCByY0dldEdMU3RyaW5nKEVHTGVudW0gbmFtZSwgdm9pZCogYnVmZmVyLCBFR0xpbnQgYnVmZmVyU2l6ZSkKK3sKKyAgICBSZW5kZXJUaHJlYWRJbmZvICp0SW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworCisgICAgLy8gd2hhdGV2ZXIgd2UgZW5kIHVwIHJldHVybmluZywKKyAgICAvLyBpdCB3aWxsIGhhdmUgYSB0ZXJtaW5hdGluZyBcMCwKKyAgICAvLyBzbyBhY2NvdW50IGZvciBpdCBoZXJlLgorICAgIHN0ZDo6c3RyaW5nIGdsU3RyOworCisgICAgaWYgKHRJbmZvICYmIHRJbmZvLT5jdXJyQ29udGV4dC5nZXQoKSkgeworICAgICAgICBjb25zdCBjaGFyICpzdHIgPSBudWxscHRyOworICAgICAgICBpZiAodEluZm8tPmN1cnJDb250ZXh0LT5pc0dMMigpKSB7CisgICAgICAgICAgICBzdHIgPSAoY29uc3QgY2hhciAqKXNfZ2xlczIuZ2xHZXRTdHJpbmcobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHIgPSAoY29uc3QgY2hhciAqKXNfZ2xlczEuZ2xHZXRTdHJpbmcobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cikgeworICAgICAgICAgICAgZ2xTdHIgKz0gc3RyOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV2UgYWRkIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBHTCBwcm90b2NvbCBudW1iZXIgaW50byBHTF9FWFRFTlNJT05TCisgICAgYm9vbCBpc0NoZWNrc3VtRW5hYmxlZCA9CisgICAgICAgIGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZChhbmRyb2lkOjpmZWF0dXJlY29udHJvbDo6R0xQaXBlQ2hlY2tzdW0pOworICAgIGJvb2wgYXN5bmNTd2FwRW5hYmxlZCA9CisgICAgICAgIGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZChhbmRyb2lkOjpmZWF0dXJlY29udHJvbDo6R0xBc3luY1N3YXApICYmCisgICAgICAgIGVtdWdsX3N5bmNfZGV2aWNlX2V4aXN0cygpOworCisgICAgaWYgKGlzQ2hlY2tzdW1FbmFibGVkICYmIG5hbWUgPT0gR0xfRVhURU5TSU9OUykgeworICAgICAgICBnbFN0ciArPSBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvOjpnZXRNYXhWZXJzaW9uU3RyaW5nKCk7CisgICAgICAgIGdsU3RyICs9ICIgIjsKKyAgICB9CisKKyAgICBpZiAoYXN5bmNTd2FwRW5hYmxlZCAmJiBuYW1lID09IEdMX0VYVEVOU0lPTlMpIHsKKyAgICAgICAgZ2xTdHIgKz0ga0FzeW5jU3dhcFN0cjsKKyAgICAgICAgZ2xTdHIgKz0gIiAiOworICAgIH0KKworICAgIGludCBuZXh0QnVmZmVyU2l6ZSA9IGdsU3RyLnNpemUoKSArIDE7CisKKyAgICBpZiAoIWJ1ZmZlciB8fCBuZXh0QnVmZmVyU2l6ZSA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgcmV0dXJuIC1uZXh0QnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICBzbnByaW50ZigoY2hhciAqKWJ1ZmZlciwgbmV4dEJ1ZmZlclNpemUsICIlcyIsIGdsU3RyLmNfc3RyKCkpOworICAgIHJldHVybiBuZXh0QnVmZmVyU2l6ZTsKK30KKworc3RhdGljIEVHTGludCByY0dldE51bUNvbmZpZ3ModWludDMyX3QqIHBfbnVtQXR0cmlicykKK3sKKyAgICBpbnQgbnVtQ29uZmlncyA9IDAsIG51bUF0dHJpYnMgPSAwOworCisgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPmdldENvbmZpZ3MoKS0+Z2V0UGFja0luZm8oJm51bUNvbmZpZ3MsICZudW1BdHRyaWJzKTsKKyAgICBpZiAocF9udW1BdHRyaWJzKSB7CisgICAgICAgICpwX251bUF0dHJpYnMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtQXR0cmlicyk7CisgICAgfQorICAgIHJldHVybiBudW1Db25maWdzOworfQorCitzdGF0aWMgRUdMaW50IHJjR2V0Q29uZmlncyh1aW50MzJfdCBidWZTaXplLCBHTHVpbnQqIGJ1ZmZlcikKK3sKKyAgICBHTHVpbnQgYnVmZmVyU2l6ZSA9IChHTHVpbnQpYnVmU2l6ZTsKKyAgICByZXR1cm4gRnJhbWVCdWZmZXI6OmdldEZCKCktPmdldENvbmZpZ3MoKS0+cGFja0NvbmZpZ3MoYnVmZmVyU2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdGljIEVHTGludCByY0Nob29zZUNvbmZpZyhFR0xpbnQgKmF0dHJpYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGF0dHJpYnNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbmZpZ3Nfc2l6ZSkKK3sKKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKyAgICBpZiAoIWZiIHx8IGF0dHJpYnNfc2l6ZT09MCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZmItPmdldENvbmZpZ3MoKS0+Y2hvb3NlQ29uZmlnKAorICAgICAgICAgICAgYXR0cmlicywgKEVHTGludCopY29uZmlncywgKEVHTGludCljb25maWdzX3NpemUpOworfQorCitzdGF0aWMgRUdMaW50IHJjR2V0RkJQYXJhbShFR0xpbnQgcGFyYW0pCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFR0xpbnQgcmV0ID0gMDsKKworICAgIHN3aXRjaChwYXJhbSkgeworICAgICAgICBjYXNlIEZCX1dJRFRIOgorICAgICAgICAgICAgcmV0ID0gZmItPmdldFdpZHRoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQl9IRUlHSFQ6CisgICAgICAgICAgICByZXQgPSBmYi0+Z2V0SGVpZ2h0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQl9YRFBJOgorICAgICAgICAgICAgcmV0ID0gNzI7IC8vIFhYWDogc2hvdWxkIGJlIGltcGxlbWVudGVkCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQl9ZRFBJOgorICAgICAgICAgICAgcmV0ID0gNzI7IC8vIFhYWDogc2hvdWxkIGJlIGltcGxlbWVudGVkCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQl9GUFM6CisgICAgICAgICAgICByZXQgPSA2MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZCX01JTl9TV0FQX0lOVEVSVkFMOgorICAgICAgICAgICAgcmV0ID0gMTsgLy8gWFhYOiBzaG91bGQgYmUgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZCX01BWF9TV0FQX0lOVEVSVkFMOgorICAgICAgICAgICAgcmV0ID0gMTsgLy8gWFhYOiBzaG91bGQgYmUgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQzMl90IHJjQ3JlYXRlQ29udGV4dCh1aW50MzJfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoYXJlLCB1aW50MzJfdCBnbFZlcnNpb24pCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBUbyBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCB0aGUgZ3Vlc3QsIGNyZWF0ZSBHTEVTMiBjb250ZXh0IHdoZW4gR0wKKyAgICAvLyB2ZXJzaW9uPT0yIG9yIDMKKyAgICBIYW5kbGVUeXBlIHJldCA9IGZiLT5jcmVhdGVSZW5kZXJDb250ZXh0KGNvbmZpZywgc2hhcmUsIGdsVmVyc2lvbiA9PSAyIHx8IGdsVmVyc2lvbiA9PSAzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByY0Rlc3Ryb3lDb250ZXh0KHVpbnQzMl90IGNvbnRleHQpCit7CisgICAgU3luY1RocmVhZDo6ZGVzdHJveVN5bmNUaHJlYWQoKTsKKworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZiLT5EZXN0cm95UmVuZGVyQ29udGV4dChjb250ZXh0KTsKK30KKworc3RhdGljIHVpbnQzMl90IHJjQ3JlYXRlV2luZG93U3VyZmFjZSh1aW50MzJfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZmItPmNyZWF0ZVdpbmRvd1N1cmZhY2UoY29uZmlnLCB3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIHZvaWQgcmNEZXN0cm95V2luZG93U3VyZmFjZSh1aW50MzJfdCB3aW5kb3dTdXJmYWNlKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZiLT5EZXN0cm95V2luZG93U3VyZmFjZSggd2luZG93U3VyZmFjZSApOworfQorCitzdGF0aWMgdWludDMyX3QgcmNDcmVhdGVDb2xvckJ1ZmZlcih1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgR0xlbnVtIGludGVybmFsRm9ybWF0KQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGZiLT5jcmVhdGVDb2xvckJ1ZmZlcih3aWR0aCwgaGVpZ2h0LCBpbnRlcm5hbEZvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgcmNPcGVuQ29sb3JCdWZmZXIyKHVpbnQzMl90IGNvbG9yYnVmZmVyKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZmItPm9wZW5Db2xvckJ1ZmZlciggY29sb3JidWZmZXIgKTsKK30KKworc3RhdGljIHZvaWQgcmNPcGVuQ29sb3JCdWZmZXIodWludDMyX3QgY29sb3JidWZmZXIpCit7CisgICAgKHZvaWQpIHJjT3BlbkNvbG9yQnVmZmVyMihjb2xvcmJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIHJjQ2xvc2VDb2xvckJ1ZmZlcih1aW50MzJfdCBjb2xvcmJ1ZmZlcikKK3sKKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKyAgICBpZiAoIWZiKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmItPmNsb3NlQ29sb3JCdWZmZXIoIGNvbG9yYnVmZmVyICk7Cit9CisKK3N0YXRpYyBpbnQgcmNGbHVzaFdpbmRvd0NvbG9yQnVmZmVyKHVpbnQzMl90IHdpbmRvd1N1cmZhY2UpCit7CisgICAgR1JTWU5DX0RQUklOVCgid2FpdGluZyBmb3IgZ3JhbGxvYyBjYiBsb2NrIik7CisgICAgR3JhbGxvY1N5bmNQb3N0TG9jayBsb2NrKHNHcmFsbG9jU3luYy5nZXQoKSk7CisgICAgR1JTWU5DX0RQUklOVCgibG9jayBncmFsbG9jIGNiIGxvY2sgeyIpOworCisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICBHUlNZTkNfRFBSSU5UKCJ1bmxvY2sgZ3JhbGxvYyBjYiBsb2NrIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFmYi0+Zmx1c2hXaW5kb3dTdXJmYWNlQ29sb3JCdWZmZXIod2luZG93U3VyZmFjZSkpIHsKKyAgICAgICAgR1JTWU5DX0RQUklOVCgidW5sb2NrIGdyYWxsb2MgY2IgbG9jayB9Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBHUlNZTkNfRFBSSU5UKCJ1bmxvY2sgZ3JhbGxvYyBjYiBsb2NrIH0iKTsKKworICAgIHJldHVybiAwOworfQorCisvLyBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhpcyBjYWxscyByY0ZsdXNoV2luZG93Q29sb3JCdWZmZXIsCisvLyB0aGUgIkFzeW5jIiBwYXJ0IGlzIGluIHRoZSByZXR1cm4gdHlwZSwgd2hpY2ggaXMgdm9pZAorLy8gdmVyc3VzIHJldHVybiB0eXBlIGludCBmb3IgcmNGbHVzaFdpbmRvd0NvbG9yQnVmZmVyLgorLy8KKy8vIFRoZSBkaWZmZXJlbnQgcmV0dXJuIHR5cGUsIGV2ZW4gd2hpbGUgY2FsbGluZyB0aGUgc2FtZQorLy8gZnVuY3Rpb25zIGludGVybmFsbHksIHdpbGwgZW5kIHVwIG1ha2luZyB0aGUgZW5jb2RlcgorLy8gYW5kIGRlY29kZXIgdXNlIGEgZGlmZmVyZW50IHByb3RvY29sLiBUaGlzIGlzIGJlY2F1c2UKKy8vIHRoZSBlbmNvZGVyIGdlbmVyYWxseSBvYmV5cyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb25zOgorLy8KKy8vIC0gVGhlIGVuY29kZXIgd2lsbCBpbW1lZGlhdGVseSBzZW5kIGFuZCB3YWl0IGZvciBhIGNvbW1hbmQKKy8vICAgcmVzdWx0IGlmIHRoZSByZXR1cm4gdHlwZSBpcyBub3Qgdm9pZC4KKy8vIC0gVGhlIGVuY29kZXIgd2lsbCBjYWNoZSB0aGUgY29tbWFuZCBpbiBhIGJ1ZmZlciBhbmQgc2VuZAorLy8gICBhdCBhIGNvbnZlbmllbnQgdGltZSBpZiB0aGUgcmV0dXJuIHR5cGUgaXMgdm9pZC4KKy8vCisvLyBJdCBjYW4gYWxzbyBiZSBleHBlbnNpdmUgcGVyZm9ybWFuY2Utd2lzZSB0byB0cmlnZ2VyCisvLyBzZW5kaW5nIHRyYWZmaWMgYmFjayB0byB0aGUgZ3Vlc3QuIEdlbmVyYWxseSwgdGhlIG1vcmUgd2UgYXZvaWQKKy8vIGVuY29kaW5nIGNvbW1hbmRzIHRoYXQgcGVyZm9ybSB0d28td2F5IHRyYWZmaWMsIHRoZSBiZXR0ZXIuCisvLworLy8gSGVuY2UsIHxyY0ZsdXNoV2luZG93Q29sb3JCdWZmZXJBc3luY3wgd2lsbCBhdm9pZCBleHRyYSB0cmFmZmljOworLy8gd2l0aCByZXR1cm4gdHlwZSB2b2lkLAorLy8gdGhlIGd1ZXN0IHdpbGwgbm90IHdhaXQgdW50aWwgdGhpcyBmdW5jdGlvbiByZXR1cm5zLAorLy8gbm9yIHdpbGwgaXQgaW1tZWRpYXRlbHkgc2VuZCB0aGUgY29tbWFuZCwKKy8vIHJlc3VsdGluZyBpbiBtb3JlIGFzeW5jaHJvbm91cyBiZWhhdmlvci4KK3N0YXRpYyB2b2lkIHJjRmx1c2hXaW5kb3dDb2xvckJ1ZmZlckFzeW5jKHVpbnQzMl90IHdpbmRvd1N1cmZhY2UpCit7CisgICAgcmNGbHVzaFdpbmRvd0NvbG9yQnVmZmVyKHdpbmRvd1N1cmZhY2UpOworfQorCitzdGF0aWMgdm9pZCByY1NldFdpbmRvd0NvbG9yQnVmZmVyKHVpbnQzMl90IHdpbmRvd1N1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yQnVmZmVyKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmYi0+c2V0V2luZG93U3VyZmFjZUNvbG9yQnVmZmVyKHdpbmRvd1N1cmZhY2UsIGNvbG9yQnVmZmVyKTsKK30KKworc3RhdGljIEVHTGludCByY01ha2VDdXJyZW50KHVpbnQzMl90IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHJhd1N1cmYsIHVpbnQzMl90IHJlYWRTdXJmKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKKyAgICB9CisKKyAgICBib29sIHJldCA9IGZiLT5iaW5kQ29udGV4dChjb250ZXh0LCBkcmF3U3VyZiwgcmVhZFN1cmYpOworCisgICAgcmV0dXJuIChyZXQgPyBFR0xfVFJVRSA6IEVHTF9GQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHJjRkJQb3N0KHVpbnQzMl90IGNvbG9yQnVmZmVyKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZiLT5wb3N0KGNvbG9yQnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQgcmNGQlNldFN3YXBJbnRlcnZhbChFR0xpbnQgaW50ZXJ2YWwpCit7CisgICAvLyBYWFg6IFRCRCAtIHNob3VsZCBiZSBpbXBsZW1lbnRlZAorfQorCitzdGF0aWMgdm9pZCByY0JpbmRUZXh0dXJlKHVpbnQzMl90IGNvbG9yQnVmZmVyKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZiLT5iaW5kQ29sb3JCdWZmZXJUb1RleHR1cmUoY29sb3JCdWZmZXIpOworfQorCitzdGF0aWMgdm9pZCByY0JpbmRSZW5kZXJidWZmZXIodWludDMyX3QgY29sb3JCdWZmZXIpCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmItPmJpbmRDb2xvckJ1ZmZlclRvUmVuZGVyYnVmZmVyKGNvbG9yQnVmZmVyKTsKK30KKworc3RhdGljIEVHTGludCByY0NvbG9yQnVmZmVyQ2FjaGVGbHVzaCh1aW50MzJfdCBjb2xvckJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IHBvc3RDb3VudCwgaW50IGZvclJlYWQpCit7CisgICAvLyBncmFsbG9jX2xvY2soKSBvbiB0aGUgZ3Vlc3QgY2FsbHMgcmNDb2xvckJ1ZmZlckNhY2hlRmx1c2gKKyAgIEdSU1lOQ19EUFJJTlQoIndhaXRpbmcgZm9yIGdyYWxsb2MgY2IgbG9jayIpOworICAgc0dyYWxsb2NTeW5jLT5sb2NrQ29sb3JCdWZmZXJQcmVwYXJlKCk7CisgICBHUlNZTkNfRFBSSU5UKCJsb2NrIGdyYWxsb2MgY2IgbG9jayB7Iik7CisgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmNSZWFkQ29sb3JCdWZmZXIodWludDMyX3QgY29sb3JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCB4LCBHTGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmItPnJlYWRDb2xvckJ1ZmZlcihjb2xvckJ1ZmZlciwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworfQorCitzdGF0aWMgaW50IHJjVXBkYXRlQ29sb3JCdWZmZXIodWludDMyX3QgY29sb3JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHgsIEdMaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICBHUlNZTkNfRFBSSU5UKCJ1bmxvY2sgZ3JhbGxvYyBjYiBsb2NrIik7CisgICAgICAgIHNHcmFsbG9jU3luYy0+dW5sb2NrQ29sb3JCdWZmZXJQcmVwYXJlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmYi0+dXBkYXRlQ29sb3JCdWZmZXIoY29sb3JCdWZmZXIsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKworICAgIEdSU1lOQ19EUFJJTlQoInVubG9jayBncmFsbG9jIGNiIGxvY2siKTsKKyAgICBzR3JhbGxvY1N5bmMtPnVubG9ja0NvbG9yQnVmZmVyUHJlcGFyZSgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgcmNDcmVhdGVDbGllbnRJbWFnZSh1aW50MzJfdCBjb250ZXh0LCBFR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlcikKK3sKKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKyAgICBpZiAoIWZiKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBmYi0+Y3JlYXRlQ2xpZW50SW1hZ2UoY29udGV4dCwgdGFyZ2V0LCBidWZmZXIpOworfQorCitzdGF0aWMgaW50IHJjRGVzdHJveUNsaWVudEltYWdlKHVpbnQzMl90IGltYWdlKQoreworICAgIEZyYW1lQnVmZmVyICpmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgIGlmICghZmIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGZiLT5kZXN0cm95Q2xpZW50SW1hZ2UoaW1hZ2UpOworfQorCitzdGF0aWMgdm9pZCByY1NlbGVjdENoZWNrc3VtSGVscGVyKHVpbnQzMl90IHByb3RvY29sLCB1aW50MzJfdCByZXNlcnZlZCkgeworICAgIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnNldFZlcnNpb24ocHJvdG9jb2wpOworfQorCisvLyB8cmNUcmlnZ2VyV2FpdHwgaXMgY2FsbGVkIGZyb20gdGhlIGdvbGRmaXNoIHN5bmMKKy8vIGtlcm5lbCBkcml2ZXIgd2hlbmV2ZXIgYSBuYXRpdmUgZmVuY2UgZmQgaXMgY3JlYXRlZC4KKy8vIFdlIHdpbGwgdGhlbiBuZWVkIHRvIHVzZSB0aGUgaG9zdCB0byBmaW5kIG91dAorLy8gd2hlbiB0byBzaWduYWwgdGhhdCBuYXRpdmUgZmVuY2UgZmQuIFdlIHVzZQorLy8gU3luY1RocmVhZCBmb3IgdGhhdC4KKy8vCisvLyBUaGUgcHVycG9zZSBvZiB8cmNUcmlnZ2VyV2FpdHwgaXMgdG8gdGVsbCB3aGljaAorLy8gU3luY1RocmVhZCB3aGljaCBzeW5jIG9iamVjdCAvIHRpbWVsaW5lIHRvIHNpZ25hbC4KK3N0YXRpYyB2b2lkIHJjVHJpZ2dlcldhaXQodWludDY0X3QgZWdsc3luY19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRocmVhZF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVsaW5lKSB7CisgICAgRmVuY2VTeW5jKiBmZW5jZVN5bmMgPSAoRmVuY2VTeW5jKikodWludHB0cl90KWVnbHN5bmNfcHRyOworICAgIEVHTFNZTkNfRFBSSU5UKCJlZ2xzeW5jPTB4JWxseCAiCisgICAgICAgICAgICAgICAgICAgImZlbmNlU3luYz0lcCAiCisgICAgICAgICAgICAgICAgICAgInRocmVhZF9wdHI9MHglbGx4ICIKKyAgICAgICAgICAgICAgICAgICAidGltZWxpbmU9MHglbGx4IiwKKyAgICAgICAgICAgICAgICAgICBlZ2xzeW5jX3B0ciwgZmVuY2VTeW5jLCB0aHJlYWRfcHRyLCB0aW1lbGluZSk7CisgICAgU3luY1RocmVhZCogc3luY1RocmVhZCA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U3luY1RocmVhZCo+KHRocmVhZF9wdHIpOworICAgIHN5bmNUaHJlYWQtPnRyaWdnZXJXYWl0KGZlbmNlU3luYywgdGltZWxpbmUpOworfQorCisvLyB8cmNDcmVhdGVTeW5jS0hSfCBpbXBsZW1lbnRzIHRoZSBndWVzdCdzCisvLyB8ZWdsQ3JlYXRlU3luY0tIUnwgYnkgY2FsbGluZyB0aGUgaG9zdCdzIGltcGxlbWVudGF0aW9uCisvLyBvZiB8ZWdsQ3JlYXRlU3luY0tIUnwuIEEgU3luY1RocmVhZCBpcyBhbHNvIHN0YXJ0ZWQKKy8vIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgcmVuZGVyaW5nIHRocmVhZCwgZm9yCisvLyBwdXJwb3NlcyBvZiBzaWduYWxpbmcgYW55IG5hdGl2ZSBmZW5jZSBmZCdzIHRoYXQKKy8vIGdldCBjcmVhdGVkIGluIHRoZSBndWVzdCBvZmYgdGhlIHN5bmMgb2JqZWN0CisvLyBjcmVhdGVkIGhlcmUuCitzdGF0aWMgdm9pZCByY0NyZWF0ZVN5bmNLSFIoRUdMZW51bSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCogYXR0cmlicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1fYXR0cmlicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdHJveV93aGVuX3NpZ25hbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBlZ2xzeW5jX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogc3luY3RocmVhZF9vdXQpIHsKKyAgICBFR0xTWU5DX0RQUklOVCgidHlwZT0weCV4IG51bV9hdHRyaWJzPSVkIiwKKyAgICAgICAgICAgIHR5cGUsIG51bV9hdHRyaWJzKTsKKworICAgIGJvb2wgaGFzTmF0aXZlRmVuY2UgPQorICAgICAgICB0eXBlID09IEVHTF9TWU5DX05BVElWRV9GRU5DRV9BTkRST0lEOworCisgICAgRmVuY2VTeW5jKiBmZW5jZVN5bmMgPSBuZXcgRmVuY2VTeW5jKGhhc05hdGl2ZUZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3doZW5fc2lnbmFsZWQpOworCisgICAgLy8gVGhpcyBNVVNUIGJlIHByZXNlbnQsIG9yIHdlIGdldCBhIGRlYWRsb2NrIGVmZmVjdC4KKyAgICBzX2dsZXMyLmdsRmx1c2goKTsKKworICAgIGlmIChzeW5jdGhyZWFkX291dCkgKnN5bmN0aHJlYWRfb3V0ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdD4oU3luY1RocmVhZDo6Z2V0U3luY1RocmVhZCgpKTsKKworICAgIGlmIChlZ2xzeW5jX291dCkgeworICAgICAgICB1aW50NjRfdCByZXMgPSAodWludDY0X3QpKHVpbnRwdHJfdClmZW5jZVN5bmM7CisgICAgICAgICplZ2xzeW5jX291dCA9IHJlczsKKyAgICAgICAgRUdMU1lOQ19EUFJJTlQoInNlbmQgb3V0IGVnbHN5bmMgMHglbGx4IiwgcmVzKTsKKyAgICB9Cit9CisKKy8vIHxyY0NsaWVudFdhaXRTeW5jS0hSfCBpbXBsZW1lbnRzIHxlZ2xDbGllbnRXYWl0U3luY0tIUnwKKy8vIG9uIHRoZSBndWVzdCB0aHJvdWdoIHVzaW5nIHRoZSBob3N0J3MgZXhpc3RpbmcKKy8vIHxlZ2xDbGllbnRXYWl0U3luY0tIUnwgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGRvbmUKKy8vIHRocm91Z2ggdGhlIEZlbmNlU3luYyBvYmplY3QuCitzdGF0aWMgRUdMaW50IHJjQ2xpZW50V2FpdFN5bmNLSFIodWludDY0X3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lb3V0KSB7CisgICAgUmVuZGVyVGhyZWFkSW5mbyAqdEluZm8gPSBSZW5kZXJUaHJlYWRJbmZvOjpnZXQoKTsKKyAgICBGcmFtZUJ1ZmZlciAqZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKworICAgIEVHTFNZTkNfRFBSSU5UKCJoYW5kbGU9MHglbHggZmxhZ3M9MHgleCB0aW1lb3V0PSUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICBoYW5kbGUsIGZsYWdzLCB0aW1lb3V0KTsKKworICAgIEZlbmNlU3luYyogZmVuY2VTeW5jID0gKEZlbmNlU3luYyopKHVpbnRwdHJfdCloYW5kbGU7CisKKyAgICBpZiAoIWZlbmNlU3luYykgeworICAgICAgICBFR0xTWU5DX0RQUklOVCgiZmVuY2VTeW5jIG51bGwsIHJldHVybiBjb25kaXRpb24gc2F0aXNmaWVkIik7CisgICAgICAgIHJldHVybiBFR0xfQ09ORElUSU9OX1NBVElTRklFRF9LSFI7CisgICAgfQorCisgICAgLy8gU29tZXRpbWVzIGEgZ3JhbGxvYy1idWZmZXItb25seSB0aHJlYWQgaXMgZG9pbmcgc3R1ZmYgd2l0aCBzeW5jLgorICAgIC8vIFRoaXMgaGFwcGVucyBhbGwgdGhlIHRpbWUgd2l0aCBZb3VUdWJlIHZpZGVvcyBpbiB0aGUgYnJvd3Nlci4KKyAgICAvLyBJbiB0aGlzIGNhc2UsIGNyZWF0ZSBhIGNvbnRleHQgb24gdGhlIGhvc3QganVzdCBmb3Igc3luY2luZy4KKyAgICBpZiAoIXRJbmZvLT5jdXJyQ29udGV4dCkgeworICAgICAgICB1aW50MzJfdCBncmFsbG9jX3N5bmNfY3h0LCBncmFsbG9jX3N5bmNfc3VyZjsKKyAgICAgICAgZmItPmNyZWF0ZVRyaXZpYWxDb250ZXh0KDAsIC8vIFRoZXJlIGlzIG5vIGNvbnRleHQgdG8gc2hhcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhbGxvY19zeW5jX2N4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFsbG9jX3N5bmNfc3VyZik7CisgICAgICAgIGZiLT5iaW5kQ29udGV4dChncmFsbG9jX3N5bmNfY3h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY19zeW5jX3N1cmYsCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jX3N5bmNfc3VyZik7CisgICAgICAgIC8vIFRoaXMgY29udGV4dCBpcyB0aGVuIGNsZWFuZWQgdXAgd2hlbiB0aGUgcmVuZGVyIHRocmVhZCBleGl0cy4KKyAgICB9CisKKyAgICByZXR1cm4gZmVuY2VTeW5jLT53YWl0KHRpbWVvdXQpOworfQorCitzdGF0aWMgaW50IHJjRGVzdHJveVN5bmNLSFIodWludDY0X3QgaGFuZGxlKSB7CisgICAgRmVuY2VTeW5jKiBmZW5jZVN5bmMgPSAoRmVuY2VTeW5jKikodWludHB0cl90KWhhbmRsZTsKKyAgICBhc3NlcnQoZmVuY2VTeW5jKTsKKyAgICBmZW5jZVN5bmMtPmRlY1JlZigpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByY1NldFB1aWQodWludDY0X3QgcHVpZCkgeworICAgIFJlbmRlclRocmVhZEluZm8gKnRJbmZvID0gUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCk7CisgICAgdEluZm8tPm1fcHVpZCA9IHB1aWQ7Cit9CisKK3ZvaWQgaW5pdFJlbmRlckNvbnRyb2xDb250ZXh0KHJlbmRlckNvbnRyb2xfZGVjb2Rlcl9jb250ZXh0X3QgKmRlYykKK3sKKyAgICBkZWMtPnJjR2V0UmVuZGVyZXJWZXJzaW9uID0gcmNHZXRSZW5kZXJlclZlcnNpb247CisgICAgZGVjLT5yY0dldEVHTFZlcnNpb24gPSByY0dldEVHTFZlcnNpb247CisgICAgZGVjLT5yY1F1ZXJ5RUdMU3RyaW5nID0gcmNRdWVyeUVHTFN0cmluZzsKKyAgICBkZWMtPnJjR2V0R0xTdHJpbmcgPSByY0dldEdMU3RyaW5nOworICAgIGRlYy0+cmNHZXROdW1Db25maWdzID0gcmNHZXROdW1Db25maWdzOworICAgIGRlYy0+cmNHZXRDb25maWdzID0gcmNHZXRDb25maWdzOworICAgIGRlYy0+cmNDaG9vc2VDb25maWcgPSByY0Nob29zZUNvbmZpZzsKKyAgICBkZWMtPnJjR2V0RkJQYXJhbSA9IHJjR2V0RkJQYXJhbTsKKyAgICBkZWMtPnJjQ3JlYXRlQ29udGV4dCA9IHJjQ3JlYXRlQ29udGV4dDsKKyAgICBkZWMtPnJjRGVzdHJveUNvbnRleHQgPSByY0Rlc3Ryb3lDb250ZXh0OworICAgIGRlYy0+cmNDcmVhdGVXaW5kb3dTdXJmYWNlID0gcmNDcmVhdGVXaW5kb3dTdXJmYWNlOworICAgIGRlYy0+cmNEZXN0cm95V2luZG93U3VyZmFjZSA9IHJjRGVzdHJveVdpbmRvd1N1cmZhY2U7CisgICAgZGVjLT5yY0NyZWF0ZUNvbG9yQnVmZmVyID0gcmNDcmVhdGVDb2xvckJ1ZmZlcjsKKyAgICBkZWMtPnJjT3BlbkNvbG9yQnVmZmVyID0gcmNPcGVuQ29sb3JCdWZmZXI7CisgICAgZGVjLT5yY0Nsb3NlQ29sb3JCdWZmZXIgPSByY0Nsb3NlQ29sb3JCdWZmZXI7CisgICAgZGVjLT5yY1NldFdpbmRvd0NvbG9yQnVmZmVyID0gcmNTZXRXaW5kb3dDb2xvckJ1ZmZlcjsKKyAgICBkZWMtPnJjRmx1c2hXaW5kb3dDb2xvckJ1ZmZlciA9IHJjRmx1c2hXaW5kb3dDb2xvckJ1ZmZlcjsKKyAgICBkZWMtPnJjTWFrZUN1cnJlbnQgPSByY01ha2VDdXJyZW50OworICAgIGRlYy0+cmNGQlBvc3QgPSByY0ZCUG9zdDsKKyAgICBkZWMtPnJjRkJTZXRTd2FwSW50ZXJ2YWwgPSByY0ZCU2V0U3dhcEludGVydmFsOworICAgIGRlYy0+cmNCaW5kVGV4dHVyZSA9IHJjQmluZFRleHR1cmU7CisgICAgZGVjLT5yY0JpbmRSZW5kZXJidWZmZXIgPSByY0JpbmRSZW5kZXJidWZmZXI7CisgICAgZGVjLT5yY0NvbG9yQnVmZmVyQ2FjaGVGbHVzaCA9IHJjQ29sb3JCdWZmZXJDYWNoZUZsdXNoOworICAgIGRlYy0+cmNSZWFkQ29sb3JCdWZmZXIgPSByY1JlYWRDb2xvckJ1ZmZlcjsKKyAgICBkZWMtPnJjVXBkYXRlQ29sb3JCdWZmZXIgPSByY1VwZGF0ZUNvbG9yQnVmZmVyOworICAgIGRlYy0+cmNPcGVuQ29sb3JCdWZmZXIyID0gcmNPcGVuQ29sb3JCdWZmZXIyOworICAgIGRlYy0+cmNDcmVhdGVDbGllbnRJbWFnZSA9IHJjQ3JlYXRlQ2xpZW50SW1hZ2U7CisgICAgZGVjLT5yY0Rlc3Ryb3lDbGllbnRJbWFnZSA9IHJjRGVzdHJveUNsaWVudEltYWdlOworICAgIGRlYy0+cmNTZWxlY3RDaGVja3N1bUhlbHBlciA9IHJjU2VsZWN0Q2hlY2tzdW1IZWxwZXI7CisgICAgZGVjLT5yY0NyZWF0ZVN5bmNLSFIgPSByY0NyZWF0ZVN5bmNLSFI7CisgICAgZGVjLT5yY0NsaWVudFdhaXRTeW5jS0hSID0gcmNDbGllbnRXYWl0U3luY0tIUjsKKyAgICBkZWMtPnJjRmx1c2hXaW5kb3dDb2xvckJ1ZmZlckFzeW5jID0gcmNGbHVzaFdpbmRvd0NvbG9yQnVmZmVyQXN5bmM7CisgICAgZGVjLT5yY0Rlc3Ryb3lTeW5jS0hSID0gcmNEZXN0cm95U3luY0tIUjsKKyAgICBkZWMtPnJjU2V0UHVpZCA9IHJjU2V0UHVpZDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRyb2wuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckNvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZlMWUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyQ29udHJvbC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9SRU5ERVJfQ09OVFJPTF9ICisjZGVmaW5lIF9SRU5ERVJfQ09OVFJPTF9ICisKKyNpbmNsdWRlICJyZW5kZXJDb250cm9sX2RlYy5oIgorCit2b2lkIGluaXRSZW5kZXJDb250cm9sQ29udGV4dChyZW5kZXJDb250cm9sX2RlY29kZXJfY29udGV4dF90ICpkZWMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckxpYkltcGwuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyTGliSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhYjRhYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlckxpYkltcGwuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyNpbmNsdWRlICJSZW5kZXJMaWJJbXBsLmgiCisKKyNpbmNsdWRlICJSZW5kZXJlckltcGwuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9jcmFzaF9yZXBvcnRlci5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9mZWF0dXJlX2NvbnRyb2wuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbG9nZ2luZy5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9taXNjLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3N5bmNfZGV2aWNlLmgiCisKK25hbWVzcGFjZSBlbXVnbCB7CisKK3ZvaWQgUmVuZGVyTGliSW1wbDo6c2V0QXBpTGV2ZWwoaW50IGFwaSkgeworICAgIGVtdWdsOjpzZXRBcGlMZXZlbChhcGkpOworfQorCit2b2lkIFJlbmRlckxpYkltcGw6OnNldExvZ2dlcihlbXVnbF9sb2dnZXJfc3RydWN0IGxvZ2dlcikgeworICAgIHNldF9lbXVnbF9sb2dnZXIobG9nZ2VyLmNvYXJzZSk7CisgICAgc2V0X2VtdWdsX2N4dF9sb2dnZXIobG9nZ2VyLmZpbmUpOworfQorCit2b2lkIFJlbmRlckxpYkltcGw6OnNldENyYXNoUmVwb3J0ZXIoZW11Z2xfY3Jhc2hfcmVwb3J0ZXJfdCByZXBvcnRlcikgeworICAgIHNldF9lbXVnbF9jcmFzaF9yZXBvcnRlcihyZXBvcnRlcik7Cit9CisKK3ZvaWQgUmVuZGVyTGliSW1wbDo6c2V0RmVhdHVyZUNvbnRyb2xsZXIoZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkX3QgZmVhdHVyZUNvbnRyb2xsZXIpIHsKKyAgICBzZXRfZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkKGZlYXR1cmVDb250cm9sbGVyKTsKK30KKwordm9pZCBSZW5kZXJMaWJJbXBsOjpzZXRTeW5jRGV2aWNlCisgICAgKGVtdWdsX3N5bmNfY3JlYXRlX3RpbWVsaW5lX3QgY3JlYXRlX3RpbWVsaW5lLAorICAgICBlbXVnbF9zeW5jX2NyZWF0ZV9mZW5jZV90IGNyZWF0ZV9mZW5jZSwKKyAgICAgZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCB0aW1lbGluZV9pbmMsCisgICAgIGVtdWdsX3N5bmNfZGVzdHJveV90aW1lbGluZV90IGRlc3Ryb3lfdGltZWxpbmUsCisgICAgIGVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0X3QgcmVnaXN0ZXJfdHJpZ2dlcl93YWl0LAorICAgICBlbXVnbF9zeW5jX2RldmljZV9leGlzdHNfdCBkZXZpY2VfZXhpc3RzKSB7CisgICAgc2V0X2VtdWdsX3N5bmNfY3JlYXRlX3RpbWVsaW5lKGNyZWF0ZV90aW1lbGluZSk7CisgICAgc2V0X2VtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlKGNyZWF0ZV9mZW5jZSk7CisgICAgc2V0X2VtdWdsX3N5bmNfdGltZWxpbmVfaW5jKHRpbWVsaW5lX2luYyk7CisgICAgc2V0X2VtdWdsX3N5bmNfZGVzdHJveV90aW1lbGluZShkZXN0cm95X3RpbWVsaW5lKTsKKyAgICBzZXRfZW11Z2xfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXQocmVnaXN0ZXJfdHJpZ2dlcl93YWl0KTsKKyAgICBzZXRfZW11Z2xfc3luY19kZXZpY2VfZXhpc3RzKGRldmljZV9leGlzdHMpOworfQorCitSZW5kZXJlclB0ciBSZW5kZXJMaWJJbXBsOjppbml0UmVuZGVyZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlU3ViV2luZG93KSB7CisgICAgaWYgKCFtUmVuZGVyZXIuZXhwaXJlZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IGF1dG8gcmVzID0gc3RkOjptYWtlX3NoYXJlZDxSZW5kZXJlckltcGw+KCk7CisgICAgaWYgKCFyZXMtPmluaXRpYWxpemUod2lkdGgsIGhlaWdodCwgdXNlU3ViV2luZG93KSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgbVJlbmRlcmVyID0gcmVzOworICAgIHJldHVybiByZXM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyTGliSW1wbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyTGliSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMTdmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJMaWJJbXBsLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvUmVuZGVyTGliLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGVtdWdsIHsKKworY2xhc3MgUmVuZGVyTGliSW1wbCBmaW5hbCA6IHB1YmxpYyBSZW5kZXJMaWIgeworcHVibGljOgorICAgIFJlbmRlckxpYkltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXBpTGV2ZWwoaW50IGFwaSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldExvZ2dlcihlbXVnbF9sb2dnZXJfc3RydWN0IGxvZ2dlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldENyYXNoUmVwb3J0ZXIoZW11Z2xfY3Jhc2hfcmVwb3J0ZXJfdCByZXBvcnRlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldEZlYXR1cmVDb250cm9sbGVyKGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZF90IGZlYXR1cmVDb250cm9sbGVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3luY0RldmljZShlbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVnbF9zeW5jX2Rlc3Ryb3lfdGltZWxpbmVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXVnbF9zeW5jX3JlZ2lzdGVyX3RyaWdnZXJfd2FpdF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWdsX3N5bmNfZGV2aWNlX2V4aXN0c190KSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmVuZGVyZXJQdHIgaW5pdFJlbmRlcmVyKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlU3ViV2luZG93KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19DT1BZX0FTU0lHTl9BTkRfTU9WRShSZW5kZXJMaWJJbXBsKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPFJlbmRlcmVyPiBtUmVuZGVyZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlclRocmVhZC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGM5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMjI3IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIlJlbmRlclRocmVhZC5oIgorCisjaW5jbHVkZSAiQ2hhbm5lbFN0cmVhbS5oIgorI2luY2x1ZGUgIkVycm9yTG9nLmgiCisjaW5jbHVkZSAiRnJhbWVCdWZmZXIuaCIKKyNpbmNsdWRlICJSZWFkQnVmZmVyLmgiCisjaW5jbHVkZSAiUmVuZGVyQ29udHJvbC5oIgorI2luY2x1ZGUgIlJlbmRlcmVySW1wbC5oIgorI2luY2x1ZGUgIlJlbmRlckNoYW5uZWxJbXBsLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhyZWFkSW5mby5oIgorCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9FR0xEaXNwYXRjaC5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvR0xFU3YyRGlzcGF0Y2guaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MURpc3BhdGNoLmgiCisjaW5jbHVkZSAiLi4vLi4vLi4vc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNkZWZpbmUgRU1VR0xfREVCVUdfTEVWRUwgMAorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9kZWJ1Zy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gU3RhcnQgd2l0aCBhIHNtYWxsZXIgYnVmZmVyIHRvIG5vdCB3YXN0ZSBtZW1vcnkgb24gYSBsb3ctdXNlZCByZW5kZXIgdGhyZWFkcy4KK3N0YXRpYyBjb25zdGV4cHIgaW50IGtTdHJlYW1CdWZmZXJTaXplID0gMTI4ICogMTAyNDsKKworUmVuZGVyVGhyZWFkOjpSZW5kZXJUaHJlYWQoc3RkOjp3ZWFrX3B0cjxSZW5kZXJlckltcGw+IHJlbmRlcmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlbmRlckNoYW5uZWxJbXBsPiBjaGFubmVsKQorICAgIDogbUNoYW5uZWwoY2hhbm5lbCksIG1SZW5kZXJlcihyZW5kZXJlcikge30KKworUmVuZGVyVGhyZWFkOjp+UmVuZGVyVGhyZWFkKCkgPSBkZWZhdWx0OworCisvLyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxSZW5kZXJUaHJlYWQ+IFJlbmRlclRocmVhZDo6Y3JlYXRlKAorICAgICAgICBzdGQ6OndlYWtfcHRyPFJlbmRlcmVySW1wbD4gcmVuZGVyZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZW5kZXJDaGFubmVsSW1wbD4gY2hhbm5lbCkgeworICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyVGhyZWFkPigKKyAgICAgICAgICAgIG5ldyBSZW5kZXJUaHJlYWQocmVuZGVyZXIsIGNoYW5uZWwpKTsKK30KKworaW50cHRyX3QgUmVuZGVyVGhyZWFkOjptYWluKCkgeworICAgIENoYW5uZWxTdHJlYW0gc3RyZWFtKG1DaGFubmVsLCBSZW5kZXJDaGFubmVsOjpCdWZmZXI6OmtTbWFsbFNpemUpOworCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmIChzdHJlYW0ucmVhZCgmZmxhZ3MsIHNpemVvZihmbGFncykpICE9IHNpemVvZihmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gfGZsYWdzfCB1c2VkIHRvIGhhdmUgc29tZXRoaW5nLCBub3cgdGhleSdyZSBub3QgdXNlZC4KKyAgICAodm9pZClmbGFnczsKKworICAgIFJlbmRlclRocmVhZEluZm8gdEluZm87CisgICAgQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbyB0Q2hlY2tzdW1JbmZvOworICAgIENoZWNrc3VtQ2FsY3VsYXRvciYgY2hlY2tzdW1DYWxjID0gdENoZWNrc3VtSW5mby5nZXQoKTsKKworICAgIC8vCisgICAgLy8gaW5pdGlhbGl6ZSBkZWNvZGVycworICAgIC8vCisgICAgdEluZm8ubV9nbERlYy5pbml0R0woZ2xlczFfZGlzcGF0Y2hfZ2V0X3Byb2NfZnVuYywgTlVMTCk7CisgICAgdEluZm8ubV9nbDJEZWMuaW5pdEdMKGdsZXMyX2Rpc3BhdGNoX2dldF9wcm9jX2Z1bmMsIE5VTEwpOworICAgIGluaXRSZW5kZXJDb250cm9sQ29udGV4dCgmdEluZm8ubV9yY0RlYyk7CisKKyAgICBSZWFkQnVmZmVyIHJlYWRCdWYoa1N0cmVhbUJ1ZmZlclNpemUpOworCisgICAgaW50IHN0YXRzX3RvdGFsQnl0ZXMgPSAwOworICAgIGxvbmcgbG9uZyBzdGF0c190MCA9IGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTo6Z2V0KCktPmdldEhpZ2hSZXNUaW1lVXMoKSAvIDEwMDA7CisKKyAgICAvLworICAgIC8vIG9wZW4gZHVtcCBmaWxlIGlmIFJFTkRFUl9EVU1QX0RJUiBpcyBkZWZpbmVkCisgICAgLy8KKyAgICBjb25zdCBjaGFyKiBkdW1wX2RpciA9IGdldGVudigiUkVOREVSRVJfRFVNUF9ESVIiKTsKKyAgICBGSUxFKiBkdW1wRlAgPSBOVUxMOworICAgIGlmIChkdW1wX2RpcikgeworICAgICAgICBzaXplX3QgYnNpemUgPSBzdHJsZW4oZHVtcF9kaXIpICsgMzI7CisgICAgICAgIGNoYXIqIGZuYW1lID0gbmV3IGNoYXJbYnNpemVdOworICAgICAgICBzbnByaW50ZihmbmFtZSwgYnNpemUsICIlcy9zdHJlYW1fJXAiLCBkdW1wX2RpciwgdGhpcyk7CisgICAgICAgIGR1bXBGUCA9IGZvcGVuKGZuYW1lLCAid2IiKTsKKyAgICAgICAgaWYgKCFkdW1wRlApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogc3RyZWFtIGR1bXAgZmFpbGVkIHRvIG9wZW4gZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZm5hbWUpOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZVtdIGZuYW1lOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIC8vIExldCdzIG1ha2Ugc3VyZSB3ZSByZWFkIGVub3VnaCBkYXRhIGZvciBhdCBsZWFzdCBzb21lIHByb2Nlc3NpbmcuCisgICAgICAgIGludCBwYWNrZXRTaXplOworICAgICAgICBpZiAocmVhZEJ1Zi52YWxpZERhdGEoKSA+PSA4KSB7CisgICAgICAgICAgICAvLyBXZSBrbm93IHRoYXQgcGFja2V0IHNpemUgaXMgdGhlIHNlY29uZCBpbnQzMl90IGZyb20gdGhlIHN0YXJ0LgorICAgICAgICAgICAgcGFja2V0U2l6ZSA9ICooY29uc3QgaW50MzJfdCopKHJlYWRCdWYuYnVmKCkgKyA0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlYWQgZW5vdWdoIGRhdGEgdG8gYXQgbGVhc3QgYmUgYWJsZSB0byBnZXQgdGhlIHBhY2tldCBzaXplIG5leHQKKyAgICAgICAgICAgIC8vIHRpbWUuCisgICAgICAgICAgICBwYWNrZXRTaXplID0gODsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHNob3VsZCd2ZSBwcm9jZXNzZWQgdGhlIHBhY2tldCBvbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIGlmIGl0CisgICAgICAgIC8vIHdhcyBhbHJlYWR5IGluIHRoZSBidWZmZXIuCisgICAgICAgIGFzc2VydChwYWNrZXRTaXplID4gKGludClyZWFkQnVmLnZhbGlkRGF0YSgpKTsKKworICAgICAgICBjb25zdCBpbnQgc3RhdCA9IHJlYWRCdWYuZ2V0RGF0YSgmc3RyZWFtLCBwYWNrZXRTaXplKTsKKyAgICAgICAgaWYgKHN0YXQgPD0gMCkgeworICAgICAgICAgICAgRCgiV2FybmluZzogcmVuZGVyIHRocmVhZCBjb3VsZCBub3QgcmVhZCBkYXRhIGZyb20gc3RyZWFtIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBERCgicmVuZGVyIHRocmVhZCByZWFkICVkIGJ5dGVzLCBvcCAlZCwgcGFja2V0IHNpemUgJWQiLAorICAgICAgICAgICAoaW50KXJlYWRCdWYudmFsaWREYXRhKCksICooaW50MzJfdCopcmVhZEJ1Zi5idWYoKSwKKyAgICAgICAgICAgKihpbnQzMl90KikocmVhZEJ1Zi5idWYoKSArIDQpKTsKKworICAgICAgICAvLworICAgICAgICAvLyBsb2cgcmVjZWl2ZWQgYmFuZHdpZHRoIHN0YXRpc3RpY3MKKyAgICAgICAgLy8KKyAgICAgICAgc3RhdHNfdG90YWxCeXRlcyArPSByZWFkQnVmLnZhbGlkRGF0YSgpOworICAgICAgICBsb25nIGxvbmcgZHQgPSBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmdldCgpLT5nZXRIaWdoUmVzVGltZVVzKCkgLyAxMDAwIC0gc3RhdHNfdDA7CisgICAgICAgIGlmIChkdCA+IDEwMDApIHsKKyAgICAgICAgICAgIC8vIGZsb2F0IGR0cyA9IChmbG9hdClkdCAvIDEwMDAuMGY7CisgICAgICAgICAgICAvLyBwcmludGYoIlVzZWQgQmFuZHdpZHRoICU1LjNmIE1CL3NcbiIsICgoZmxvYXQpc3RhdHNfdG90YWxCeXRlcyAvCisgICAgICAgICAgICAvLyBkdHMpIC8gKDEwMjQuMGYqMTAyNC4wZikpOworICAgICAgICAgICAgc3RhdHNfdG90YWxCeXRlcyA9IDA7CisgICAgICAgICAgICBzdGF0c190MCA9IGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTo6Z2V0KCktPmdldEhpZ2hSZXNUaW1lVXMoKSAvIDEwMDA7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBkdW1wIHN0cmVhbSB0byBmaWxlIGlmIG5lZWRlZAorICAgICAgICAvLworICAgICAgICBpZiAoZHVtcEZQKSB7CisgICAgICAgICAgICBpbnQgc2tpcCA9IHJlYWRCdWYudmFsaWREYXRhKCkgLSBzdGF0OworICAgICAgICAgICAgZndyaXRlKHJlYWRCdWYuYnVmKCkgKyBza2lwLCAxLCByZWFkQnVmLnZhbGlkRGF0YSgpIC0gc2tpcCwgZHVtcEZQKTsKKyAgICAgICAgICAgIGZmbHVzaChkdW1wRlApOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBwcm9ncmVzczsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcHJvZ3Jlc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gdHJ5IHRvIHByb2Nlc3Mgc29tZSBvZiB0aGUgY29tbWFuZCBidWZmZXIgdXNpbmcgdGhlIEdMRVN2MQorICAgICAgICAgICAgLy8gZGVjb2RlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIERSSVZFUiBXT1JLQVJPVU5EOgorICAgICAgICAgICAgLy8gT24gTGludXggd2l0aCBOVklESUEgR1BVJ3MgYXQgbGVhc3QsIHdlIG5lZWQgdG8gYXZvaWQgcGVyZm9ybWluZworICAgICAgICAgICAgLy8gR0xFUyBvcHMgd2hpbGUgc29tZW9uZSBlbHNlIGhvbGRzIHRoZSBGcmFtZUJ1ZmZlciB3cml0ZSBsb2NrLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRvIGJlIG1vcmUgc3BlY2lmaWMsIG9uIExpbnV4IHdpdGggTlZJRElBIFF1YWRybyBLMjIwMCB2MzYxLnh4LAorICAgICAgICAgICAgLy8gd2UgZ2V0IGEgc2VnZmF1bHQgaW4gdGhlIE5WSURJQSBkcml2ZXIgd2hlbiBnbFRleFN1YkltYWdlMkQKKyAgICAgICAgICAgIC8vIGlzIGNhbGxlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIGdsWE1ha2UoQ29udGV4dClDdXJyZW50LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRvIGZpeCwgdGhpcyBkcml2ZXIgd29ya2Fyb3VuZCBhdm9pZHMgY2FsbGluZworICAgICAgICAgICAgLy8gYW55IHNvcnQgb2YgR0xFUyBjYWxsIHdoZW4gd2UgYXJlIGNyZWF0aW5nL2Rlc3Ryb3lpbmcgRUdMCisgICAgICAgICAgICAvLyBjb250ZXh0cy4KKyAgICAgICAgICAgIEZyYW1lQnVmZmVyOjpnZXRGQigpLT5sb2NrQ29udGV4dFN0cnVjdHVyZVJlYWQoKTsKKyAgICAgICAgICAgIHNpemVfdCBsYXN0ID0gdEluZm8ubV9nbERlYy5kZWNvZGUoCisgICAgICAgICAgICAgICAgICAgIHJlYWRCdWYuYnVmKCksIHJlYWRCdWYudmFsaWREYXRhKCksICZzdHJlYW0sICZjaGVja3N1bUNhbGMpOworICAgICAgICAgICAgaWYgKGxhc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgcHJvZ3Jlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgIHJlYWRCdWYuY29uc3VtZShsYXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHRyeSB0byBwcm9jZXNzIHNvbWUgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIHVzaW5nIHRoZSBHTEVTdjIKKyAgICAgICAgICAgIC8vIGRlY29kZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBsYXN0ID0gdEluZm8ubV9nbDJEZWMuZGVjb2RlKHJlYWRCdWYuYnVmKCksIHJlYWRCdWYudmFsaWREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sICZjaGVja3N1bUNhbGMpOworICAgICAgICAgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPnVubG9ja0NvbnRleHRTdHJ1Y3R1cmVSZWFkKCk7CisKKyAgICAgICAgICAgIGlmIChsYXN0ID4gMCkgeworICAgICAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZWFkQnVmLmNvbnN1bWUobGFzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyB0cnkgdG8gcHJvY2VzcyBzb21lIG9mIHRoZSBjb21tYW5kIGJ1ZmZlciB1c2luZyB0aGUKKyAgICAgICAgICAgIC8vIHJlbmRlckNvbnRyb2wgZGVjb2RlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGxhc3QgPSB0SW5mby5tX3JjRGVjLmRlY29kZShyZWFkQnVmLmJ1ZigpLCByZWFkQnVmLnZhbGlkRGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sICZjaGVja3N1bUNhbGMpOworICAgICAgICAgICAgaWYgKGxhc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVhZEJ1Zi5jb25zdW1lKGxhc3QpOworICAgICAgICAgICAgICAgIHByb2dyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocHJvZ3Jlc3MpOworICAgIH0KKworICAgIGlmIChkdW1wRlApIHsKKyAgICAgICAgZmNsb3NlKGR1bXBGUCk7CisgICAgfQorCisgICAgLy8gZXhpdCBzeW5jIHRocmVhZCwgaWYgYW55LgorICAgIFN5bmNUaHJlYWQ6OmRlc3Ryb3lTeW5jVGhyZWFkKCk7CisKKyAgICAvLworICAgIC8vIFJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgY3VycmVudCB0aHJlYWQncyBjb250ZXh0L3N1cmZhY2VzIGlmIGFueQorICAgIC8vCisgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPmJpbmRDb250ZXh0KDAsIDAsIDApOworICAgIGlmICh0SW5mby5jdXJyQ29udGV4dCB8fCB0SW5mby5jdXJyRHJhd1N1cmYgfHwgdEluZm8uY3VyclJlYWRTdXJmKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJFUlJPUjogUmVuZGVyVGhyZWFkIGV4aXRpbmcgd2l0aCBjdXJyZW50IGNvbnRleHQvc3VyZmFjZXNcbiIpOworICAgIH0KKworICAgIEZyYW1lQnVmZmVyOjpnZXRGQigpLT5kcmFpbldpbmRvd1N1cmZhY2UoKTsKKyAgICBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+ZHJhaW5SZW5kZXJDb250ZXh0KCk7CisKKyAgICBEQkcoIkV4aXRlZCBhIFJlbmRlclRocmVhZCBAJXBcbiIsIHRoaXMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyVGhyZWFkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNmMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyVGhyZWFkLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL211dGV4LmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3RocmVhZC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgZW11Z2wgeworCitjbGFzcyBSZW5kZXJDaGFubmVsSW1wbDsKK2NsYXNzIFJlbmRlcmVySW1wbDsKKworLy8gQSBjbGFzcyB1c2VkIHRvIG1vZGVsIGEgdGhyZWFkIG9mIHRoZSBSZW5kZXJTZXJ2ZXIuIEVhY2ggb25lIG9mIHRoZW0KKy8vIGhhbmRsZXMgYSBzaW5nbGUgZ3Vlc3QgY2xpZW50IC8gcHJvdG9jb2wgYnl0ZSBzdHJlYW0uCitjbGFzcyBSZW5kZXJUaHJlYWQgOiBwdWJsaWMgZW11Z2w6OlRocmVhZCB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlIGEgbmV3IFJlbmRlclRocmVhZCBpbnN0YW5jZS4KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFJlbmRlclRocmVhZD4gY3JlYXRlKAorICAgICAgICAgICAgc3RkOjp3ZWFrX3B0cjxSZW5kZXJlckltcGw+IHJlbmRlcmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlbmRlckNoYW5uZWxJbXBsPiBjaGFubmVsKTsKKworICAgIHZpcnR1YWwgflJlbmRlclRocmVhZCgpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmZiB0aGUgdGhyZWFkIGhhcyBmaW5pc2hlZC4KKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIHRocmVhZCdzIHN0YWNrIGhhcyBiZWVuCisgICAgYm9vbCBpc0ZpbmlzaGVkKCkgeyByZXR1cm4gdHJ5V2FpdChOVUxMKTsgfQorCitwcml2YXRlOgorICAgIFJlbmRlclRocmVhZChzdGQ6OndlYWtfcHRyPFJlbmRlcmVySW1wbD4gcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZW5kZXJDaGFubmVsSW1wbD4gY2hhbm5lbCk7CisKKyAgICB2aXJ0dWFsIGludHB0cl90IG1haW4oKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZW5kZXJDaGFubmVsSW1wbD4gbUNoYW5uZWw7CisgICAgc3RkOjp3ZWFrX3B0cjxSZW5kZXJlckltcGw+IG1SZW5kZXJlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyVGhyZWFkSW5mby5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJUaHJlYWRJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgwNjlkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyVGhyZWFkSW5mby5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgIlJlbmRlclRocmVhZEluZm8uaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3RocmVhZF9zdG9yZS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBUaHJlYWRJbmZvU3RvcmUgOiBwdWJsaWMgOjplbXVnbDo6VGhyZWFkU3RvcmUgeworcHVibGljOgorICAgIFRocmVhZEluZm9TdG9yZSgpIDogOjplbXVnbDo6VGhyZWFkU3RvcmUoTlVMTCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgOjplbXVnbDo6TGF6eUluc3RhbmNlPFRocmVhZEluZm9TdG9yZT4gc190bHMgPSBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK1JlbmRlclRocmVhZEluZm86OlJlbmRlclRocmVhZEluZm8oKSB7CisgICAgc190bHMtPnNldCh0aGlzKTsKK30KKworUmVuZGVyVGhyZWFkSW5mbzo6flJlbmRlclRocmVhZEluZm8oKSB7CisgICAgc190bHMtPnNldChOVUxMKTsKK30KKworUmVuZGVyVGhyZWFkSW5mbyogUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJUaHJlYWRJbmZvKj4oc190bHMtPmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlclRocmVhZEluZm8uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlclRocmVhZEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ViZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyVGhyZWFkSW5mby5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9MSUJfT1BFTkdMX1JFTkRFUl9USFJFQURfSU5GT19ICisjZGVmaW5lIF9MSUJfT1BFTkdMX1JFTkRFUl9USFJFQURfSU5GT19ICisKKyNpbmNsdWRlICJSZW5kZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV2luZG93U3VyZmFjZS5oIgorI2luY2x1ZGUgIkdMRVN2MURlY29kZXIuaCIKKyNpbmNsdWRlICJHTEVTdjJEZWNvZGVyLmgiCisjaW5jbHVkZSAicmVuZGVyQ29udHJvbF9kZWMuaCIKKyNpbmNsdWRlICJTeW5jVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK3R5cGVkZWYgdWludDMyX3QgSGFuZGxlVHlwZTsKK3R5cGVkZWYgc3RkOjpzZXQ8SGFuZGxlVHlwZT4gVGhyZWFkQ29udGV4dFNldDsKK3R5cGVkZWYgc3RkOjpzZXQ8SGFuZGxlVHlwZT4gV2luZG93U3VyZmFjZVNldDsKKworLy8gQSBjbGFzcyB1c2VkIHRvIG1vZGVsIHRoZSBzdGF0ZSBvZiBlYWNoIFJlbmRlclRocmVhZCByZWxhdGVkCitzdHJ1Y3QgUmVuZGVyVGhyZWFkSW5mbyB7CisgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZS4gT25seSBjYWxsIHRoaXMgb25jZSBwZXIgdGhyZWFkLgorICAgIC8vIEZ1dHVyZSBjYWxsbHMgdG8gZ2V0KCkgd2lsbCByZXR1cm4gdGhpcyBpbnN0YW5jZSB1bnRpbAorICAgIC8vIGl0IGlzIGRlc3Ryb3llZC4KKyAgICBSZW5kZXJUaHJlYWRJbmZvKCk7CisKKyAgICAvLyBEZXN0cnVjdG9yLgorICAgIH5SZW5kZXJUaHJlYWRJbmZvKCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgaW5zdGFuY2UsIGlmIGFueSwgb3IgTlVMTC4KKyAgICBzdGF0aWMgUmVuZGVyVGhyZWFkSW5mbyogZ2V0KCk7CisKKyAgICAvLyBDdXJyZW50IEVHTCBjb250ZXh0LCBkcmF3IHN1cmZhY2UgYW5kIHJlYWQgc3VyZmFjZS4KKyAgICBSZW5kZXJDb250ZXh0UHRyIGN1cnJDb250ZXh0OworICAgIFdpbmRvd1N1cmZhY2VQdHIgY3VyckRyYXdTdXJmOworICAgIFdpbmRvd1N1cmZhY2VQdHIgY3VyclJlYWRTdXJmOworCisgICAgLy8gRGVjb2RlciBzdGF0ZXMuCisgICAgR0xFU3YxRGVjb2RlciAgICAgICAgICAgICAgICAgICBtX2dsRGVjOworICAgIEdMRVN2MkRlY29kZXIgICAgICAgICAgICAgICAgICAgbV9nbDJEZWM7CisgICAgcmVuZGVyQ29udHJvbF9kZWNvZGVyX2NvbnRleHRfdCBtX3JjRGVjOworCisgICAgLy8gQWxsIHRoZSBjb250ZXh0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5IHRoaXMgcmVuZGVyIHRocmVhZC4KKyAgICAvLyBOZXcgZW11bGF0b3IgbWFuYWdlcyBjb250ZXh0cyBpbiBndWVzdCBwcm9jZXNzIGxldmVsLAorICAgIC8vIG1fY29udGV4dFNldCBzaG91bGQgYmUgZGVwcmVjYXRlZC4gSXQgaXMgb25seSBrZXB0IGZvcgorICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29uLgorICAgIFRocmVhZENvbnRleHRTZXQgICAgICAgICAgICAgICAgbV9jb250ZXh0U2V0OworICAgIC8vIGFsbCB0aGUgd2luZG93IHN1cmZhY2VzIHRoYXQgYXJlIGNyZWF0ZWQgYnkgdGhpcyByZW5kZXIgdGhyZWFkCisgICAgV2luZG93U3VyZmFjZVNldCAgICAgICAgICAgICAgICBtX3dpbmRvd1NldDsKKworICAgIC8vIFN5bmMgdGltZWxpbmUgaW5mbyArIHN5bmMgdGhyZWFkIHBvaW50ZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3luY1RocmVhZD4gICAgIHN5bmNUaHJlYWQ7CisKKyAgICAvLyBUaGUgdW5pcXVlIGlkIG9mIG93bmVyIGd1ZXN0IHByb2Nlc3Mgb2YgdGhpcyByZW5kZXIgdGhyZWFkCisgICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICBtX3B1aWQgPSAwOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJXaW5kb3cuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyV2luZG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTI4YmNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyV2luZG93LmNwcApAQCAtMCwwICsxLDQ1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIlJlbmRlcldpbmRvdy5oIgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbWVzc2FnZV9jaGFubmVsLmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL211dGV4LmgiCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3RocmVhZC5oIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmgiCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2RlZmluZSBERUJVRyAwCisKKyNpZiBERUJVRworIyAgZGVmaW5lIEQoLi4uKSBteV9kZWJ1ZyhfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXywgX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lIEQoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCituYW1lc3BhY2UgeworCisjaWYgREVCVUcKK3ZvaWQgbXlfZGVidWcoY29uc3QgY2hhciogZnVuY3Rpb24sIGludCBsaW5lLCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICAgIHN0YXRpYyA6OmVtdWdsOjpNdXRleCBtdXRleDsKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBtdXRleC5sb2NrKCk7CisgICAgZnByaW50ZihzdGRlcnIsICIlczolZDoiLCBmdW5jdGlvbiwgbGluZSk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOworICAgIG11dGV4LnVubG9jaygpOworICAgIHZhX2VuZChhcmdzKTsKK30KKyNlbmRpZgorCisvLyBMaXN0IG9mIHBvc3NpYmxlIGNvbW1hbmRzIHRvIHNlbmQgdG8gdGhlIHJlbmRlciB3aW5kb3cgdGhyZWFkIGZyb20KKy8vIHRoZSBtYWluIG9uZS4KK2VudW0gQ29tbWFuZCB7CisgICAgQ01EX0lOSVRJQUxJWkUsCisgICAgQ01EX1NFVF9QT1NUX0NBTExCQUNLLAorICAgIENNRF9TRVRVUF9TVUJXSU5ET1csCisgICAgQ01EX1JFTU9WRV9TVUJXSU5ET1csCisgICAgQ01EX1NFVF9ST1RBVElPTiwKKyAgICBDTURfU0VUX1RSQU5TTEFUSU9OLAorICAgIENNRF9SRVBBSU5ULAorICAgIENNRF9GSU5BTElaRSwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBBIHNpbmdsZSBtZXNzYWdlIHNlbnQgZnJvbSB0aGUgbWFpbiB0aHJlYWQgdG8gdGhlIHJlbmRlciB3aW5kb3cgdGhyZWFkLgorLy8gfGNtZHwgZGV0ZXJtaW5lcyB3aGljaCBmaWVsZHMgYXJlIHZhbGlkIHRvIHJlYWQuCitzdHJ1Y3QgUmVuZGVyV2luZG93TWVzc2FnZSB7CisgICAgQ29tbWFuZCBjbWQ7CisgICAgdW5pb24geworICAgICAgICAvLyBDTURfSU5JVElBTElaRQorICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgaW50IHdpZHRoOworICAgICAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgICAgIGJvb2wgdXNlU3ViV2luZG93OworICAgICAgICB9IGluaXQ7CisKKyAgICAgICAgLy8gQ01EX1NFVF9QT1NUX0NBTExCQUNLCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBlbXVnbDo6UmVuZGVyZXI6Ok9uUG9zdENhbGxiYWNrIG9uX3Bvc3Q7CisgICAgICAgICAgICB2b2lkKiBvbl9wb3N0X2NvbnRleHQ7CisgICAgICAgIH0gc2V0X3Bvc3RfY2FsbGJhY2s7CisKKyAgICAgICAgLy8gQ01EX1NFVFVQX1NVQldJTkRPVworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgRkJOYXRpdmVXaW5kb3dUeXBlIHBhcmVudDsKKyAgICAgICAgICAgIGludCB3eDsKKyAgICAgICAgICAgIGludCB3eTsKKyAgICAgICAgICAgIGludCB3dzsKKyAgICAgICAgICAgIGludCB3aDsKKyAgICAgICAgICAgIGludCBmYnc7CisgICAgICAgICAgICBpbnQgZmJoOworICAgICAgICAgICAgZmxvYXQgZHByOworICAgICAgICAgICAgZmxvYXQgcm90YXRpb247CisgICAgICAgIH0gc3Vid2luZG93OworCisgICAgICAgIC8vIENNRF9TRVRfVFJBTlNMQVRJT047CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBmbG9hdCBweDsKKyAgICAgICAgICAgIGZsb2F0IHB5OworICAgICAgICB9IHRyYW5zOworCisgICAgICAgIC8vIENNRF9TRVRfUk9UQVRJT04KKyAgICAgICAgZmxvYXQgcm90YXRpb247CisKKyAgICAgICAgLy8gcmVzdWx0IG9mIG9wZXJhdGlvbnMuCisgICAgICAgIGJvb2wgcmVzdWx0OworICAgIH07CisKKyAgICAvLyBQcm9jZXNzIHRoZSBjdXJyZW50IG1lc3NhZ2UsIGFuZCB1cGRhdGVzIGl0cyB8cmVzdWx0fCBmaWVsZC4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2Ugb24gZmFpbHVyZS4KKyAgICBib29sIHByb2Nlc3MoKSBjb25zdCB7CisgICAgICAgIGNvbnN0IFJlbmRlcldpbmRvd01lc3NhZ2UmIG1zZyA9ICp0aGlzOworICAgICAgICBGcmFtZUJ1ZmZlciogZmI7CisgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobXNnLmNtZCkgeworICAgICAgICAgICAgY2FzZSBDTURfSU5JVElBTElaRToKKyAgICAgICAgICAgICAgICBEKCJDTURfSU5JVElBTElaRSB3PSVkIGg9JWRcbiIsIG1zZy5pbml0LndpZHRoLCBtc2cuaW5pdC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEdMX0xPRygiUmVuZGVyV2luZG93OiBDTURfSU5JVElBTElaRSB3PSVkIGg9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICBtc2cuaW5pdC53aWR0aCwgbXNnLmluaXQuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGcmFtZUJ1ZmZlcjo6aW5pdGlhbGl6ZShtc2cuaW5pdC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuaW5pdC5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmluaXQudXNlU3ViV2luZG93KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDTURfRklOQUxJWkU6CisgICAgICAgICAgICAgICAgRCgiQ01EX0ZJTkFMSVpFXG4iKTsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGNvbW1hbmQgbWF5IGJlIGlzc3VlZCBldmVuIHdoZW4gZnJhbWUgYnVmZmVyIGlzIG5vdAorICAgICAgICAgICAgICAgIC8vIHlldCBjcmVhdGVkIChlLmcuIGlmIENNRF9JTklUSUFMSVpFIGZhaWxlZCksCisgICAgICAgICAgICAgICAgLy8gc28gbWFrZSBzdXJlIHdlIGNoZWNrIGlmIGl0IGlzIHRoZXJlIGJlZm9yZSBmaW5hbGl6aW5nCisgICAgICAgICAgICAgICAgaWYgKGNvbnN0IGF1dG8gZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKSkgeworICAgICAgICAgICAgICAgICAgICBmYi0+ZmluYWxpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBDTURfU0VUX1BPU1RfQ0FMTEJBQ0s6CisgICAgICAgICAgICAgICAgRCgiQ01EX1NFVF9QT1NUX0NBTExCQUNLXG4iKTsKKyAgICAgICAgICAgICAgICBmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgICAgICAgICAgICAgIGZiLT5zZXRQb3N0Q2FsbGJhY2sobXNnLnNldF9wb3N0X2NhbGxiYWNrLm9uX3Bvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc2V0X3Bvc3RfY2FsbGJhY2sub25fcG9zdF9jb250ZXh0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENNRF9TRVRVUF9TVUJXSU5ET1c6CisgICAgICAgICAgICAgICAgRCgiQ01EX1NFVFVQX1NVQldJTkRPVzogcGFyZW50PSVwIHd4PSVkIHd5PSVkIHd3PSVkIHdoPSVkIGZidz0lZCBmYmg9JWQgZHByPSVmIHJvdGF0aW9uPSVmXG4iLAorICAgICAgICAgICAgICAgICAgICAodm9pZCopbXNnLnN1YndpbmRvdy5wYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cud3gsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cud3ksCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cud3csCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cud2gsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cuZmJ3LAorICAgICAgICAgICAgICAgICAgICBtc2cuc3Vid2luZG93LmZiaCwKKyAgICAgICAgICAgICAgICAgICAgbXNnLnN1YndpbmRvdy5kcHIsCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cucm90YXRpb24pOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZyYW1lQnVmZmVyOjpnZXRGQigpLT5zZXR1cFN1YldpbmRvdygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cucGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN1YndpbmRvdy53eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cud3ksCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3Vid2luZG93Lnd3LAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN1YndpbmRvdy53aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cuZmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN1YndpbmRvdy5mYmgsCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc3Vid2luZG93LmRwciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zdWJ3aW5kb3cucm90YXRpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENNRF9SRU1PVkVfU1VCV0lORE9XOgorICAgICAgICAgICAgICAgIEQoIkNNRF9SRU1PVkVfU1VCV0lORE9XXG4iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+cmVtb3ZlU3ViV2luZG93KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9ST1RBVElPTjoKKyAgICAgICAgICAgICAgICBEKCJDTURfU0VUX1JPVEFUSU9OIHJvdGF0aW9uPSVmXG4iLCBtc2cucm90YXRpb24pOworICAgICAgICAgICAgICAgIGZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgICAgICAgICAgICAgaWYgKGZiKSB7CisgICAgICAgICAgICAgICAgICAgIGZiLT5zZXREaXNwbGF5Um90YXRpb24obXNnLnJvdGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQ01EX1NFVF9UUkFOU0xBVElPTjoKKyAgICAgICAgICAgICAgICBEKCJDTURfU0VUX1RSQU5TTEFUSU9OIHRyYW5zbGF0aW9uPSVmLCVmXG4iLCBtc2cudHJhbnMucHgsIG1zZy50cmFucy5weSk7CisgICAgICAgICAgICAgICAgZmIgPSBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmIpIHsKKyAgICAgICAgICAgICAgICAgICAgZmItPnNldERpc3BsYXlUcmFuc2xhdGlvbihtc2cudHJhbnMucHgsIG1zZy50cmFucy5weSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENNRF9SRVBBSU5UOgorICAgICAgICAgICAgICAgIEQoIkNNRF9SRVBBSU5UXG4iKTsKKyAgICAgICAgICAgICAgICBmYiA9IEZyYW1lQnVmZmVyOjpnZXRGQigpOworICAgICAgICAgICAgICAgIGlmIChmYikgeworICAgICAgICAgICAgICAgICAgICBmYi0+cmVwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK307CisKKy8vIFNpbXBsZSBzeW5jaHJvbml6YXRpb24gc3RydWN0dXJlIHVzZWQgdG8gZXhjaGFuZ2UgZGF0YSBiZXR3ZWVuIHRoZQorLy8gbWFpbiBhbmQgcmVuZGVyIHdpbmRvdyB0aHJlYWRzLiBVc2FnZSBpcyB0aGUgZm9sbG93aW5nOgorLy8KKy8vIFRoZSBtYWluIHRocmVhZCBkb2VzIHRoZSBmb2xsb3dpbmcgaW4gYSBsb29wOgorLy8KKy8vICAgICAgY2FuV3JpdGVDbWQud2FpdCgpCisvLyAgICAgIHVwZGF0ZXMgfG1lc3NhZ2V8IGJ5IHdyaXRpbmcgYSBuZXcgfGNtZHwgdmFsdWUgYW5kIGFwcHJvcHJpYXRlCisvLyAgICAgIHBhcmFtZXRlcnMuCisvLyAgICAgIGNhblJlYWRDbWQuc2lnbmFsKCkKKy8vICAgICAgY2FuUmVhZFJlc3VsdC53YWl0KCkKKy8vICAgICAgcmVhZHMgfG1lc3NhZ2UucmVzdWx0fAorLy8gICAgICBjYW5Xcml0ZVJlc3VsdC5zaWduYWwoKQorLy8KKy8vIFRoZSByZW5kZXIgd2luZG93IHRocmVhZCB3aWxsIGRvIHRoZSBmb2xsb3dpbmc6CisvLworLy8gICAgICBjYW5SZWFkQ21kLndhaXQoKQorLy8gICAgICByZWFkcyB8bWVzc2FnZS5jbWR8IGFuZCBhY3RzIHVwb24gaXQuCisvLyAgICAgIGNhbldyaXRlUmVzdWx0LndhaXQoKQorLy8gICAgICB3cml0ZXMgfG1lc3NhZ2UucmVzdWx0fAorLy8gICAgICBjYW5SZWFkUmVzdWx0LnNpZ25hbCgpCisvLyAgICAgIGNhbldyaXRlQ21kLnNpZ25hbCgpCisvLworY2xhc3MgUmVuZGVyV2luZG93Q2hhbm5lbCB7CitwdWJsaWM6CisgICAgUmVuZGVyV2luZG93Q2hhbm5lbCgpIDogbUluKCksIG1PdXQoKSB7fQorICAgIH5SZW5kZXJXaW5kb3dDaGFubmVsKCkge30KKworICAgIC8vIFNlbmQgYSBtZXNzYWdlIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAgIC8vIE5vdGUgdGhhdCB0aGUgY29udGVudCBvZiB8bXNnfCBpcyBjb3BpZWQgaW50byB0aGUgY2hhbm5lbC4KKyAgICAvLyBSZXR1cm5zIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQgKHRydWUgb3IgZmFsc2UpLgorICAgIGJvb2wgc2VuZE1lc3NhZ2VBbmRHZXRSZXN1bHQoY29uc3QgUmVuZGVyV2luZG93TWVzc2FnZSYgbXNnKSB7CisgICAgICAgIEQoIm1zZy5jbWQ9JWRcbiIsIG1zZy5jbWQpOworICAgICAgICBtSW4uc2VuZChtc2cpOworICAgICAgICBEKCJ3YWl0aW5nIGZvciByZXN1bHRcbiIpOworICAgICAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgICAgICBtT3V0LnJlY2VpdmUoJnJlc3VsdCk7CisgICAgICAgIEQoInJlc3VsdD0lc1xuIiwgcmVzdWx0ID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSByZW5kZXIgd2luZG93IHRocmVhZC4KKyAgICAvLyBPbiBleGl0LCB8Km1zZ3wgZ2V0cyBhIGNvcHkgb2YgdGhlIG1lc3NhZ2UuIFRoZSBjYWxsZXIKKyAgICAvLyBtdXN0IGFsd2F5cyBjYWxsIHNlbmRSZXN1bHQoKSBhZnRlciBwcm9jZXNzaW5nIHRoZSBtZXNzYWdlLgorICAgIHZvaWQgcmVjZWl2ZU1lc3NhZ2UoUmVuZGVyV2luZG93TWVzc2FnZSogbXNnKSB7CisgICAgICAgIEQoImVudGVyaW5nXG4iKTsKKyAgICAgICAgbUluLnJlY2VpdmUobXNnKTsKKyAgICAgICAgRCgibWVzc2FnZSBjbWQ9JWRcbiIsIG1zZy0+Y21kKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHJlc3VsdCBmcm9tIHRoZSByZW5kZXIgd2luZG93IHRocmVhZCB0byB0aGUgbWFpbiBvbmUuCisgICAgLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVNZXNzYWdlKCkuCisgICAgdm9pZCBzZW5kUmVzdWx0KGJvb2wgcmVzdWx0KSB7CisgICAgICAgIEQoIndhaXRpbmcgdG8gc2VuZCByZXN1bHQgKCVzKVxuIiwgcmVzdWx0ID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKKyAgICAgICAgbU91dC5zZW5kKHJlc3VsdCk7CisgICAgICAgIEQoInJlc3VsdCBzZW50XG4iKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgZW11Z2w6Ok1lc3NhZ2VDaGFubmVsPFJlbmRlcldpbmRvd01lc3NhZ2UsIDE2VT4gbUluOworICAgIGVtdWdsOjpNZXNzYWdlQ2hhbm5lbDxib29sLCAxNlU+IG1PdXQ7Cit9OworCituYW1lc3BhY2UgeworCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHdpbmRvdyByZW5kZXIgdGhyZWFkLgorLy8gSXRzIHB1cnBvc2UgaXMgdG8gbGlzdGVuIGZvciBjb21tYW5kcyBmcm9tIHRoZSBtYWluIHRocmVhZCBpbiBhIGxvb3AsCisvLyBwcm9jZXNzIHRoZW0sIHRoZW4gcmV0dXJuIGEgYm9vbGVhbiByZXN1bHQgZm9yIGVhY2ggb25lIG9mIHRoZW0uCisvLworLy8gVGhlIHRocmVhZCBlbmRzIHdpdGggYSBDTURfRklOQUxJWkUuCisvLworY2xhc3MgUmVuZGVyV2luZG93VGhyZWFkIDogcHVibGljIGVtdWdsOjpUaHJlYWQgeworcHVibGljOgorICAgIFJlbmRlcldpbmRvd1RocmVhZChSZW5kZXJXaW5kb3dDaGFubmVsKiBjaGFubmVsKSA6IG1DaGFubmVsKGNoYW5uZWwpIHt9CisKKyAgICB2aXJ0dWFsIGludHB0cl90IG1haW4oKSB7CisgICAgICAgIEQoIkVudGVyaW5nIHJlbmRlciB3aW5kb3cgdGhyZWFkIHRocmVhZFxuIik7CisjaWZuZGVmIF9XSU4zMgorICAgICAgICBzaWdzZXRfdCBzZXQ7CisgICAgICAgIHNpZ2ZpbGxzZXQoJnNldCk7CisgICAgICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJnNldCwgTlVMTCk7CisjZW5kaWYKKyAgICAgICAgYm9vbCBydW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKHJ1bm5pbmcpIHsKKyAgICAgICAgICAgIFJlbmRlcldpbmRvd01lc3NhZ2UgbXNnID0ge307CisKKyAgICAgICAgICAgIEQoIldhaXRpbmcgZm9yIG1lc3NhZ2UgZnJvbSBtYWluIHRocmVhZFxuIik7CisgICAgICAgICAgICBtQ2hhbm5lbC0+cmVjZWl2ZU1lc3NhZ2UoJm1zZyk7CisKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbXNnLnByb2Nlc3MoKTsKKyAgICAgICAgICAgIGlmIChtc2cuY21kID09IENNRF9GSU5BTElaRSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRCgiU2VuZGluZyByZXN1bHQgKCVzKSB0byBtYWluIHRocmVhZFxuIiwgcmVzdWx0ID8gInN1Y2Nlc3MiIDogImZhaWx1cmUiKTsKKyAgICAgICAgICAgIG1DaGFubmVsLT5zZW5kUmVzdWx0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgRCgiRXhpdGluZyB0aHJlYWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVuZGVyV2luZG93Q2hhbm5lbCogbUNoYW5uZWw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworUmVuZGVyV2luZG93OjpSZW5kZXJXaW5kb3coaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3N1Yl93aW5kb3cpIHsKKyAgICBpZiAodXNlX3RocmVhZCkgeworICAgICAgICBtQ2hhbm5lbCA9IG5ldyBSZW5kZXJXaW5kb3dDaGFubmVsKCk7CisgICAgICAgIG1UaHJlYWQgPSBuZXcgUmVuZGVyV2luZG93VGhyZWFkKG1DaGFubmVsKTsKKyAgICAgICAgbVRocmVhZC0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBSZW5kZXJXaW5kb3dNZXNzYWdlIG1zZyA9IHt9OworICAgIG1zZy5jbWQgPSBDTURfSU5JVElBTElaRTsKKyAgICBtc2cuaW5pdC53aWR0aCA9IHdpZHRoOworICAgIG1zZy5pbml0LmhlaWdodCA9IGhlaWdodDsKKyAgICBtc2cuaW5pdC51c2VTdWJXaW5kb3cgPSB1c2Vfc3ViX3dpbmRvdzsKKyAgICBtVmFsaWQgPSBwcm9jZXNzTWVzc2FnZShtc2cpOworfQorCitSZW5kZXJXaW5kb3c6On5SZW5kZXJXaW5kb3coKSB7CisgICAgRCgiRW50ZXJpbmdcbiIpOworICAgIHJlbW92ZVN1YldpbmRvdygpOworICAgIEQoIlNlbmRpbmcgQ01EX0ZJTkFMSVpFXG4iKTsKKyAgICBSZW5kZXJXaW5kb3dNZXNzYWdlIG1zZyA9IHt9OworICAgIG1zZy5jbWQgPSBDTURfRklOQUxJWkU7CisgICAgKHZvaWQpIHByb2Nlc3NNZXNzYWdlKG1zZyk7CisKKyAgICBpZiAobVRocmVhZCkgeworICAgICAgICBtVGhyZWFkLT53YWl0KE5VTEwpOworICAgICAgICBkZWxldGUgbVRocmVhZDsKKyAgICAgICAgZGVsZXRlIG1DaGFubmVsOworICAgIH0KK30KKworYm9vbCBSZW5kZXJXaW5kb3c6OmdldEhhcmR3YXJlU3RyaW5ncyhjb25zdCBjaGFyKiogdmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcmVuZGVyZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiB2ZXJzaW9uKSB7CisgICAgRCgiRW50ZXJpbmdcbiIpOworICAgIC8vIFRPRE8oZGlnaXQpOiBNb3ZlIHRoaXMgdG8gcmVuZGVyIHdpbmRvdyB0aHJlYWQuCisgICAgRnJhbWVCdWZmZXIqIGZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgaWYgKCFmYikgeworICAgICAgICBEKCJObyBmcmFtZWJ1ZmZlciFcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZiLT5nZXRHTFN0cmluZ3ModmVuZG9yLCByZW5kZXJlciwgdmVyc2lvbik7CisgICAgRCgiRXhpdGluZyB2ZW5kb3I9WyVzXSByZW5kZXJlcj1bJXNdIHZlcnNpb249WyVzXVxuIiwKKyAgICAgICp2ZW5kb3IsICpyZW5kZXJlciwgKnZlcnNpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyV2luZG93OjpzZXRQb3N0Q2FsbGJhY2soZW11Z2w6OlJlbmRlcmVyOjpPblBvc3RDYWxsYmFjayBvblBvc3QsIHZvaWQqIG9uUG9zdENvbnRleHQpIHsKKyAgICBEKCJFbnRlcmluZ1xuIik7CisgICAgUmVuZGVyV2luZG93TWVzc2FnZSBtc2cgPSB7fTsKKyAgICBtc2cuY21kID0gQ01EX1NFVF9QT1NUX0NBTExCQUNLOworICAgIG1zZy5zZXRfcG9zdF9jYWxsYmFjay5vbl9wb3N0ID0gb25Qb3N0OworICAgIG1zZy5zZXRfcG9zdF9jYWxsYmFjay5vbl9wb3N0X2NvbnRleHQgPSBvblBvc3RDb250ZXh0OworICAgICh2b2lkKSBwcm9jZXNzTWVzc2FnZShtc2cpOworICAgIEQoIkV4aXRpbmdcbiIpOworfQorCitib29sIFJlbmRlcldpbmRvdzo6c2V0dXBTdWJXaW5kb3coRkJOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB6Um90KSB7CisgICAgRCgiRW50ZXJpbmcgbUhhc1N1YldpbmRvdz0lc1xuIiwgbUhhc1N1YldpbmRvdyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgUmVuZGVyV2luZG93TWVzc2FnZSBtc2cgPSB7fTsKKyAgICBtc2cuY21kID0gQ01EX1NFVFVQX1NVQldJTkRPVzsKKyAgICBtc2cuc3Vid2luZG93LnBhcmVudCA9IHdpbmRvdzsKKyAgICBtc2cuc3Vid2luZG93Lnd4ID0gd3g7CisgICAgbXNnLnN1YndpbmRvdy53eSA9IHd5OworICAgIG1zZy5zdWJ3aW5kb3cud3cgPSB3dzsKKyAgICBtc2cuc3Vid2luZG93LndoID0gd2g7CisgICAgbXNnLnN1YndpbmRvdy5mYncgPSBmYnc7CisgICAgbXNnLnN1YndpbmRvdy5mYmggPSBmYmg7CisgICAgbXNnLnN1YndpbmRvdy5kcHIgPSBkcHI7CisgICAgbXNnLnN1YndpbmRvdy5yb3RhdGlvbiA9IHpSb3Q7CisKKyAgICBtSGFzU3ViV2luZG93ID0gcHJvY2Vzc01lc3NhZ2UobXNnKTsKKyAgICBEKCJFeGl0aW5nIG1IYXNTdWJXaW5kb3c9JXNcbiIsIG1IYXNTdWJXaW5kb3cgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gbUhhc1N1YldpbmRvdzsKK30KKworYm9vbCBSZW5kZXJXaW5kb3c6OnJlbW92ZVN1YldpbmRvdygpIHsKKyAgICBEKCJFbnRlcmluZyBtSGFzU3ViV2luZG93PSVzXG4iLCBtSGFzU3ViV2luZG93ID8gInRydWUiIDogImZhbHNlIik7CisgICAgaWYgKCFtSGFzU3ViV2luZG93KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhhc1N1YldpbmRvdyA9IGZhbHNlOworCisgICAgUmVuZGVyV2luZG93TWVzc2FnZSBtc2cgPSB7fTsKKyAgICBtc2cuY21kID0gQ01EX1JFTU9WRV9TVUJXSU5ET1c7CisgICAgYm9vbCByZXN1bHQgPSBwcm9jZXNzTWVzc2FnZShtc2cpOworICAgIEQoIkV4aXRpbmcgcmVzdWx0PSVzXG4iLCByZXN1bHQgPyAic3VjY2VzcyIgOiAiZmFpbHVyZSIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUmVuZGVyV2luZG93OjpzZXRSb3RhdGlvbihmbG9hdCB6Um90KSB7CisgICAgRCgiRW50ZXJpbmcgcm90YXRpb249JWZcbiIsIHpSb3QpOworICAgIFJlbmRlcldpbmRvd01lc3NhZ2UgbXNnID0ge307CisgICAgbXNnLmNtZCA9IENNRF9TRVRfUk9UQVRJT047CisgICAgbXNnLnJvdGF0aW9uID0gelJvdDsKKyAgICAodm9pZCkgcHJvY2Vzc01lc3NhZ2UobXNnKTsKKyAgICBEKCJFeGl0aW5nXG4iKTsKK30KKwordm9pZCBSZW5kZXJXaW5kb3c6OnNldFRyYW5zbGF0aW9uKGZsb2F0IHB4LCBmbG9hdCBweSkgeworICAgIEQoIkVudGVyaW5nIHRyYW5zbGF0aW9uPSVmLCVmXG4iLCBweCwgcHkpOworICAgIFJlbmRlcldpbmRvd01lc3NhZ2UgbXNnID0ge307CisgICAgbXNnLmNtZCA9IENNRF9TRVRfVFJBTlNMQVRJT047CisgICAgbXNnLnRyYW5zLnB4ID0gcHg7CisgICAgbXNnLnRyYW5zLnB5ID0gcHk7CisgICAgKHZvaWQpIHByb2Nlc3NNZXNzYWdlKG1zZyk7CisgICAgRCgiRXhpdGluZ1xuIik7Cit9CisKK3ZvaWQgUmVuZGVyV2luZG93OjpyZXBhaW50KCkgeworICAgIEQoIkVudGVyaW5nXG4iKTsKKyAgICBSZW5kZXJXaW5kb3dNZXNzYWdlIG1zZyA9IHt9OworICAgIG1zZy5jbWQgPSBDTURfUkVQQUlOVDsKKyAgICAodm9pZCkgcHJvY2Vzc01lc3NhZ2UobXNnKTsKKyAgICBEKCJFeGl0aW5nXG4iKTsKK30KKworYm9vbCBSZW5kZXJXaW5kb3c6OnByb2Nlc3NNZXNzYWdlKGNvbnN0IFJlbmRlcldpbmRvd01lc3NhZ2UmIG1zZykgeworICAgIGlmIChtQ2hhbm5lbCkgeworICAgICAgICByZXR1cm4gbUNoYW5uZWwtPnNlbmRNZXNzYWdlQW5kR2V0UmVzdWx0KG1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1zZy5wcm9jZXNzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyV2luZG93LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJXaW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzljYmUyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyV2luZG93LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vIENvcHlyaWdodCAyMDE0LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQU5EUk9JRF9FTVVHTF9MSUJSRU5ERVJfUkVOREVSX1dJTkRPV19ICisjZGVmaW5lIEFORFJPSURfRU1VR0xfTElCUkVOREVSX1JFTkRFUl9XSU5ET1dfSAorCisjaW5jbHVkZSAiT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGkuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi90aHJlYWQuaCIKKworY2xhc3MgUmVuZGVyV2luZG93Q2hhbm5lbDsKK3N0cnVjdCBSZW5kZXJXaW5kb3dNZXNzYWdlOworCisvLyBIZWxwZXIgY2xhc3MgdXNlZCB0byBtYW5hZ2UgdGhlIHN1Yi13aW5kb3cgdGhhdCBkaXNwbGF5cyB0aGUgZW11bGF0ZWQgR1BVCisvLyBvdXRwdXQuIFRvIHVzZSBpdCwgZG8gdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgMSkgQ3JlYXRlIGEgbmV3IGluc3RhbmNlLCBwYXNzaW5nIHRoZSBzaXplIG9mIHRoZSBlbXVsYXRlZCBhY2NlbGVyYXRlZAorLy8gICAgIGZyYW1lYnVmZmVyIGluIHBpeGVscyB5b3UgbmVlZC4KKy8vCisvLyAgMikgQ2hlY2sgaXNWYWxpZCgpIGFmdGVyIGNvbnN0cnVjdGlvbi4gSWYgZmFsc2UsIHRoZSBsaWJyYXJ5IGNvdWxkIG5vdAorLy8gICAgIGluaXRpYWxpemUgdGhlIGNsYXNzIHByb3Blcmx5LCBhbmQgb25lIHNob3VsZCBhYm9ydC4KKy8vCisvLyAgMykgT3B0aW9uYWw6IGNhbGwgc2V0UG9zdENhbGxiYWNrKCkgdG8gc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoCisvLyAgICAgd2lsbCBiZSBjYWxsZWQgZXZlcnl0aW1lIGEgbmV3IGZyYW1lIGlzIGRyYXduLgorLy8KKy8vICA0KSBDYWxsIHNldHVwU3ViV2luZG93KCkgdG8gc2V0dXAgYSBuZXcgc3ViLXdpbmRvdyB3aXRoaW4gdGhlIFVJIHdpbmRvdy4KKy8vICAgICBPbmUgY2FuIGNhbGwgcmVtb3ZlU3ViV2luZG93KCkgdG8gcmVtb3ZlIGl0LCBhbmQgb25lIGNhbiBjYWxsCisvLyAgICAgc2V0dXBTdWJXaW5kb3coKSArIHJlbW92ZVN1YldpbmRvdygpIGFueSBudW1iZXIgb2YgdGltZSAoZS5nLiBmb3IKKy8vICAgICBjaGFuZ2luZyB0aGUgcG9zaXRpb24gLyByb3RhdGlvbiBvZiB0aGUgc3Vid2luZG93KS4KKy8vCisvLyAgNSkgT3B0aW9uYWw6IGNhbGwgc2V0Um90YXRpb24oKSB0byBvbmx5IGNoYW5nZSB0aGUgZGlzcGxheSByb3RhdGlvbiBvZgorLy8gICAgIHRoZSBzdWItd2luZG93IGNvbnRlbnQuCisvLworLy8gIDYpIENhbGwgcmVwYWludCgpIHRvIGZvcmNlIGEgcmVwYWludCgpLgorLy8KK2NsYXNzIFJlbmRlcldpbmRvdyB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZS4gfHdpZHRofCBhbmQgfGhlaWdodHwgYXJlIHRoZSBkaW1lbnNpb25zIG9mIHRoZQorICAgIC8vIGVtdWxhdGVkIGFjY2VsZXJhdGVkIGZyYW1lYnVmZmVyLiB8dXNlX3RocmVhZHwgY2FuIGJlIHRydWUgdG8gZm9yY2UKKyAgICAvLyB0aGUgdXNlIG9mIGEgc2VwYXJhdGUgdGhyZWFkLCB3aGljaCBtaWdodCBiZSByZXF1aXJlZCBvbiBzb21lIHBsYXRmb3JtcworICAgIC8vIHRvIGF2b2lkIEdMLXJlYWx0ZWQgY29ycnVwdGlvbiBpc3N1ZXMgaW4gdGhlIG1haW4gd2luZG93LiBDYWxsCisgICAgLy8gaXNWYWxpZCgpIGFmdGVyIGNvbnN0cnVjdGlvbiB0byB2ZXJpZnkgdGhhdCBpdCB3b3JrZWQgcHJvcGVybHkuCisgICAgLy8KKyAgICAvLyB8dXNlX3N1Yl93aW5kb3d8IGlzIHRydWUgaWYgdGhlIGNsaWVudCB3aWxsIGNhbGwgc2V0dXBTdWJXaW5kb3coKSwKKyAgICAvLyBhbmQgZmFsc2UgaWYgaXQgd2lsbCBjYWxsIHNldFBvc3RDYWxsYmFjaygpLgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgY2FsbCBkb2Vzbid0IGRpc3BsYXkgYW55dGhpbmcsIGl0IGp1c3QgaW5pdGlhbGl6ZXMKKyAgICAvLyB0aGUgbGlicmFyeSwgdXNlIHNldHVwU3ViV2luZG93KCkgdG8gZGlzcGxheSBzb21ldGhpbmcuCisgICAgUmVuZGVyV2luZG93KGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCB1c2VfdGhyZWFkLCBib29sIHVzZV9zdWJfd2luZG93KTsKKworICAgIC8vIERlc3RydWN0b3IuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNhbGwgcmVtb3ZlU3ViV2luZG93KCkgaXMgbmVlZGVkLgorICAgIH5SZW5kZXJXaW5kb3coKTsKKworICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgUmVuZGVyV2luZG93IGluc3RhbmNlIGlzIHZhbGlkLCB3aGljaCByZWFsbHkKKyAgICAvLyBtZWFucyB0aGF0IHRoZSBjb25zdHJ1Y3RvciBzdWNjZWVkZWQuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbVZhbGlkOyB9CisKKyAgICAvLyBSZXR1cm4gbWlzYy4gR0wgc3RyaW5ncyB0byB0aGUgY2FsbGVyLiBPbiBzdWNjZXNzLCByZXR1cm4gdHJ1ZSBhbmQgc2V0cworICAgIC8vIHwqdmVuZG9yfCB0byB0aGUgR0wgdmVuZG9yIHN0cmluZywgfCpyZW5kZXJlcnwgdG8gdGhlIEdMIHJlbmRlcmVyIG9uZSwKKyAgICAvLyBhbmQgfCp2ZXJzaW9ufCB0byB0aGUgR0wgdmVyc2lvbiBvbmUuIE9uIGZhaWx1cmUsIHJldHVybiBmYWxzZS4KKyAgICBib29sIGdldEhhcmR3YXJlU3RyaW5ncyhjb25zdCBjaGFyKiogdmVuZG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiByZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogdmVyc2lvbik7CisKKyAgICAvLyBTcGVjaWZ5IGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBldmVyeXRpbWUgYSBuZXcgZnJhbWUgaXMKKyAgICAvLyBkaXNwbGF5ZWQuIFRoaXMgaXMgcmVsYXRpdmVseSBzbG93IGJ1dCBhbGxvd3Mgb25lIHRvIGNhcHR1cmUgdGhlCisgICAgLy8gb3V0cHV0LgorICAgIHZvaWQgc2V0UG9zdENhbGxiYWNrKGVtdWdsOjpSZW5kZXJlcjo6T25Qb3N0Q2FsbGJhY2sgb25Qb3N0LCB2b2lkKiBvblBvc3RDb250ZXh0KTsKKworICAgIC8vIFN0YXJ0IGRpc3BsYXlpbmcgdGhlIGVtdWxhdGVkIGZyYW1lYnVmZmVyIHVzaW5nIGEgc3ViLXdpbmRvdyBvZiBhCisgICAgLy8gcGFyZW50IHx3aW5kb3d8IGlkLiB8d3h8LCB8d3l8LCB8d3d8IGFuZCB8d2h8IGFyZSB0aGUgcG9zaXRpb24KKyAgICAvLyBhbmQgZGltZW5zaW9uIG9mIHRoZSBzdWItd2luZG93LCByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgorICAgIC8vIHxmYnd8IGFuZCB8ZmJofCBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHVuZGVybHlpbmcgZ3Vlc3QgZnJhbWVidWZmZXIuCisgICAgLy8gfGRwcnwgaXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyBmb3IgdGhlIG1vbml0b3IsIHdoaWNoIGlzIHJlcXVpcmVkIGZvcgorICAgIC8vIGhpZ2hlci1kZW5zaXR5IGRpc3BsYXlzIChzdWNoIGFzIHJldGluYSkuCisgICAgLy8gfHJvdGF0aW9ufCBpcyBhIGNsb2Nrd2lzZS1yb3RhdGlvbiBmb3IgdGhlIGNvbnRlbnQuIE9ubHkgbXVsdGlwbGVzIG9mCisgICAgLy8gOTAuIGFyZSBhY2NlcHRlZC4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAvLworICAgIC8vIElmIHRoZSBzdWJ3aW5kb3cgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUKKyAgICAvLyB0aGUgZGltZW5zaW9ucyBvZiB0aGUgc3Vid2luZG93LCBiYWNraW5nIGZyYW1lYnVmZmVyLCBhbmQgcmVuZGVyaW5nCisgICAgLy8gcGlwZWxpbmUgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVlcy4KKyAgICAvLworICAgIC8vIE9uZSBjYW4gY2FsbCByZW1vdmVTdWJXaW5kb3coKSB0byByZW1vdmUgdGhlIHN1Yi13aW5kb3cuCisgICAgYm9vbCBzZXR1cFN1YldpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd3LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZidywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYmgsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkcHIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByb3RhdGlvbik7CisKKyAgICAvLyBSZW1vdmUgdGhlIHN1Yi13aW5kb3cgY3JlYXRlZCBieSBjYWxsaW5nIHNldHVwU3ViV2luZG93KCkuCisgICAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBkaXNjYXJkIHRoZSBjb250ZW50IG9mIHRoZSBlbXVsYXRlZCBmcmFtZWJ1ZmZlciwKKyAgICAvLyBpdCBqdXN0IGhpZGVzIGl0IGZyb20gdGhlIG1haW4gd2luZG93LiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UKKyAgICAvLyBvdGhlcndpc2UuCisgICAgYm9vbCByZW1vdmVTdWJXaW5kb3coKTsKKworICAgIC8vIENoYW5nZSB0aGUgZGlzcGxheSByb3RhdGlvbiBvbiB0aGUgZmx5LiB8elJvdHwgaXMgYSBjbG9ja3dpc2Ugcm90YXRpb24KKyAgICAvLyBhbmdsZSBpbiBkZWdyZWVzLiBPbmx5IG11bHRpcGxlcyBvZiA5MC4gYXJlIGFjY2VwdGVkLgorICAgIHZvaWQgc2V0Um90YXRpb24oZmxvYXQgelJvdCk7CisKKyAgICAvLyBDaGFuZ2UgdGhlIGRpc3BsYXkgdHJhbnNsYXRpb24uIHxweHwsfHB5fCBhcmUgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDEsCisgICAgLy8gd2l0aCAoMCwwKSBpbmRpY2F0aW5nICJhbGlnbiB0aGUgYm90dG9tIGxlZnQgb2YgdGhlIGZyYW1lYnVmZmVyIHdpdGggdGhlCisgICAgLy8gYm90dG9tIGxlZnQgb2YgdGhlIHN1YndpbmRvdyIsIGFuZCAoMSwxKSBpbmRpY2F0aW5nICJhbGlnbiB0aGUgdG9wIHJpZ2h0IG9mCisgICAgLy8gdGhlIGZyYW1lYnVmZmVyIHdpdGggdGhlIHRvcCByaWdodCBvZiB0aGUgc3Vid2luZG93LiIKKyAgICB2b2lkIHNldFRyYW5zbGF0aW9uKGZsb2F0IHB4LCBmbG9hdCBweSk7CisKKyAgICAvLyBGb3JjZSBhIHJlcGFpbnQgb2YgdGhlIHdob2xlIGNvbnRlbnQgaW50byB0aGUgc3ViLXdpbmRvdy4KKyAgICB2b2lkIHJlcGFpbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIHByb2Nlc3NNZXNzYWdlKGNvbnN0IFJlbmRlcldpbmRvd01lc3NhZ2UmIG1zZyk7CisKKyAgICBib29sIG1WYWxpZCA9IGZhbHNlOworICAgIGJvb2wgbUhhc1N1YldpbmRvdyA9IGZhbHNlOworICAgIGVtdWdsOjpUaHJlYWQqIG1UaHJlYWQgPSBudWxscHRyOworICAgIFJlbmRlcldpbmRvd0NoYW5uZWwqIG1DaGFubmVsID0gbnVsbHB0cjsKK307CisKKyNlbmRpZiAgLy8gQU5EUk9JRF9FTVVHTF9MSUJSRU5ERVJfUkVOREVSX1dJTkRPV19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJlckltcGwuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyZXJJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQ2NDZmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvUmVuZGVyZXJJbXBsLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorI2luY2x1ZGUgIlJlbmRlcmVySW1wbC5oIgorCisjaW5jbHVkZSAiUmVuZGVyQ2hhbm5lbEltcGwuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sb2dnaW5nLmgiCisjaW5jbHVkZSAiRXJyb3JMb2cuaCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8ga1VzZVN1YndpbmRvd1RocmVhZCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBSZW5kZXJXaW5kb3cgc2hvdWxkIHVzZQorLy8gYSBzZXBhcmF0ZSB0aHJlYWQgdG8gbWFuYWdlIGl0cyBzdWJ3aW5kb3cgR0wvR0xFUyBjb250ZXh0LgorLy8gRm9yIG5vdywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGVudGlyZWx5IGZvciB0aGUgZm9sbG93aW5nCisvLyByZWFzb25zOgorLy8KKy8vIC0gSXQgbXVzdCBiZSBkaXNhYmxlZCBvbiBXaW5kb3dzIGF0IGFsbCB0aW1lcywgb3RoZXJ3aXNlIHRoZSBtYWluIHdpbmRvdworLy8gICBiZWNvbWVzIHVucmVzcG9uc2l2ZSBhZnRlciBhIGZldyBzZWNvbmRzIG9mIHVzZXIgaW50ZXJhY3Rpb24gKGUuZy4gdHJ5aW5nCisvLyAgIHRvIG1vdmUgaXQgb3ZlciB0aGUgZGVza3RvcCkuIFByb2JhYmx5IGR1ZSB0byB0aGUgc3VidGxlIGlzc3VlcyBhcm91bmQKKy8vICAgaW5wdXQgb24gdGhpcyBwbGF0Zm9ybSAoaW5wdXQtcXVldWUgaXMgZ2xvYmFsLCBtZXNzYWdlLXF1ZXVlIGlzCisvLyAgIHBlci10aHJlYWQpLiBBbHNvLCB0aGlzIG1lc3NlcyBjb25zaWRlcmFibHkgdGhlIGRpc3BsYXkgb2YgdGhlCisvLyAgIG1haW4gd2luZG93IHdoZW4gcnVubmluZyB0aGUgZXhlY3V0YWJsZSB1bmRlciBXaW5lLgorLy8KKy8vIC0gT24gTGludXgvWEdMIGFuZCBPU1gvQ29jb2EsIHRoaXMgdXNlZCB0byBiZSBuZWNlc3NhcnkgdG8gYXZvaWQgY29ycnVwdGlvbgorLy8gICBpc3N1ZXMgd2l0aCB0aGUgR0wgc3RhdGUgb2YgdGhlIG1haW4gd2luZG93IHdoZW4gdXNpbmcgdGhlIFNETCBVSS4KKy8vICAgQWZ0ZXIgdGhlIHN3aXRjaCB0byBRdCwgdGhpcyBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IGFuZCBtYXkgYWN0dWFsbHkgY2F1c2UKKy8vICAgdW5kZXNpcmVkIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBVSSB0aHJlYWQgYW5kIHRoZSBSZW5kZXJXaW5kb3cgdGhyZWFkOgorLy8gICBmb3IgZXhhbXBsZSwgaW4gYSBtdWx0aS1tb25pdG9yIHNldHVwIHRoZSBjb250ZXh0IG1pZ2h0IGJlIHJlY3JlYXRlZCB3aGVuCisvLyAgIGRyYWdnaW5nIHRoZSB3aW5kb3cgYmV0d2VlbiBtb25pdG9ycywgdHJpZ2dlcmluZyBhIFF0LXNwZWNpZmljIGNhbGxiYWNrCisvLyAgIGluIHRoZSBjb250ZXh0IG9mIFJlbmRlcldpbmRvdyB0aHJlYWQsIHdoaWNoIHdpbGwgYmVjb21lIGJsb2NrZWQgb24gdGhlIFVJCisvLyAgIHRocmVhZCwgd2hpY2ggbWF5IGluIHR1cm4gYmUgYmxvY2tlZCBvbiBzb21ldGhpbmcgZWxzZS4KK3N0YXRpYyBjb25zdCBib29sIGtVc2VTdWJ3aW5kb3dUaHJlYWQgPSBmYWxzZTsKKworUmVuZGVyZXJJbXBsOjpSZW5kZXJlckltcGwoKQorICAgIDogbUNsZWFudXBUaHJlYWQoW3RoaXNdKCkgeworICAgICAgICAgIHdoaWxlIChjb25zdCBhdXRvIGlkID0gbUNsZWFudXBQcm9jZXNzSWRzLnJlY2VpdmUoKSkgeworICAgICAgICAgICAgICBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+Y2xlYW51cFByb2NHTE9iamVjdHMoKmlkKTsKKyAgICAgICAgICB9CisgICAgICB9KSB7CisgICAgbUNsZWFudXBUaHJlYWQuc3RhcnQoKTsKK30KKworUmVuZGVyZXJJbXBsOjp+UmVuZGVyZXJJbXBsKCkgeworICAgIHN0b3AoKTsKKyAgICBtUmVuZGVyV2luZG93LnJlc2V0KCk7Cit9CisKK2Jvb2wgUmVuZGVyZXJJbXBsOjppbml0aWFsaXplKGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCB1c2VTdWJXaW5kb3cpIHsKKyAgICBpZiAobVJlbmRlcldpbmRvdykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlcldpbmRvdz4gcmVuZGVyV2luZG93KAorICAgICAgICAgICAgbmV3IFJlbmRlcldpbmRvdyh3aWR0aCwgaGVpZ2h0LCBrVXNlU3Vid2luZG93VGhyZWFkLCB1c2VTdWJXaW5kb3cpKTsKKyAgICBpZiAoIXJlbmRlcldpbmRvdykgeworICAgICAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgcmVuZGVyaW5nIHdpbmRvdyBjbGFzc1xuIik7CisgICAgICAgIEdMX0xPRygiQ291bGQgbm90IGNyZWF0ZSByZW5kZXJpbmcgd2luZG93IGNsYXNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFyZW5kZXJXaW5kb3ctPmlzVmFsaWQoKSkgeworICAgICAgICBFUlIoIkNvdWxkIG5vdCBpbml0aWFsaXplIGVtdWxhdGVkIGZyYW1lYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1SZW5kZXJXaW5kb3cgPSBzdGQ6Om1vdmUocmVuZGVyV2luZG93KTsKKyAgICBHTF9MT0coIk9wZW5HTCByZW5kZXJlciBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkiKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJlckltcGw6OnN0b3AoKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtVGhyZWFkVmVjdG9yTG9jayk7CisgICAgbVN0b3BwZWQgPSB0cnVlOworICAgIGF1dG8gdGhyZWFkcyA9IHN0ZDo6bW92ZShtVGhyZWFkcyk7CisgICAgbG9jay51bmxvY2soKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgdCA6IHRocmVhZHMpIHsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gY2hhbm5lbCA9IHQuc2Vjb25kLmxvY2soKSkgeworICAgICAgICAgICAgY2hhbm5lbC0+c3RvcEZyb21Ib3N0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gV2UncmUgc3RvcHBpbmcgdGhlIHJlbmRlcmVyLCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gY2xlYW4gdXAgcmVzb3VyY2VzCisgICAgLy8gb2Ygc29tZSBwZW5kaW5nIHByb2Nlc3Nlczogd2UnbGwgZGVzdHJveSBldmVyeXRoaW5nIHNvb24uCisgICAgbUNsZWFudXBQcm9jZXNzSWRzLnN0b3AoKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgdCA6IHRocmVhZHMpIHsKKyAgICAgICAgdC5maXJzdC0+d2FpdCgpOworICAgIH0KKyAgICBtQ2xlYW51cFRocmVhZC53YWl0KCk7Cit9CisKK1JlbmRlckNoYW5uZWxQdHIgUmVuZGVyZXJJbXBsOjpjcmVhdGVSZW5kZXJDaGFubmVsKCkgeworICAgIGNvbnN0IGF1dG8gY2hhbm5lbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UmVuZGVyQ2hhbm5lbEltcGw+KCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyVGhyZWFkPiBydChSZW5kZXJUaHJlYWQ6OmNyZWF0ZSgKKyAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgY2hhbm5lbCkpOworICAgIGlmICghcnQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIFJlbmRlclRocmVhZFxuIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHsKKyAgICAgICAgYW5kcm9pZDo6YmFzZTo6QXV0b0xvY2sgbG9jayhtVGhyZWFkVmVjdG9yTG9jayk7CisKKyAgICAgICAgaWYgKG1TdG9wcGVkKSByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBpZiAoIXJ0LT5zdGFydCgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzdGFydCBSZW5kZXJUaHJlYWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICAvLyBjbGVhbiB1cCB0aGUgdGhyZWFkcyB0aGF0IGFyZSBubyBsb25nZXIgcnVubmluZworICAgICAgICBtVGhyZWFkcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihtVGhyZWFkcy5iZWdpbigpLCBtVGhyZWFkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgVGhyZWFkV2l0aENoYW5uZWwmIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNlY29uZC5leHBpcmVkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpcnN0LT5pc0ZpbmlzaGVkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkcy5lbmQoKSk7CisKKyAgICAgICAgREJHKCJTdGFydGVkIG5ldyBSZW5kZXJUaHJlYWQgKHRvdGFsICUiIFBSSXU2NCAiKSBAJXBcbiIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obVRocmVhZHMuc2l6ZSgpICsgMSksIHJ0LmdldCgpKTsKKworICAgICAgICBtVGhyZWFkcy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHJ0KSwgY2hhbm5lbCk7CisgICAgfQorCisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKK1JlbmRlcmVySW1wbDo6SGFyZHdhcmVTdHJpbmdzIFJlbmRlcmVySW1wbDo6Z2V0SGFyZHdhcmVTdHJpbmdzKCkgeworICAgIGFzc2VydChtUmVuZGVyV2luZG93KTsKKworICAgIGNvbnN0IGNoYXIqIHZlbmRvciA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciogcmVuZGVyZXIgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIqIHZlcnNpb24gPSBudWxscHRyOworICAgIGlmICghbVJlbmRlcldpbmRvdy0+Z2V0SGFyZHdhcmVTdHJpbmdzKCZ2ZW5kb3IsICZyZW5kZXJlciwgJnZlcnNpb24pKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisgICAgSGFyZHdhcmVTdHJpbmdzIHJlczsKKyAgICByZXMudmVuZG9yID0gdmVuZG9yID8gdmVuZG9yIDogIiI7CisgICAgcmVzLnJlbmRlcmVyID0gcmVuZGVyZXIgPyByZW5kZXJlciA6ICIiOworICAgIHJlcy52ZXJzaW9uID0gdmVyc2lvbiA/IHZlcnNpb24gOiAiIjsKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIFJlbmRlcmVySW1wbDo6c2V0UG9zdENhbGxiYWNrKFJlbmRlcmVySW1wbDo6T25Qb3N0Q2FsbGJhY2sgb25Qb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0KSB7CisgICAgYXNzZXJ0KG1SZW5kZXJXaW5kb3cpOworICAgIG1SZW5kZXJXaW5kb3ctPnNldFBvc3RDYWxsYmFjayhvblBvc3QsIGNvbnRleHQpOworfQorCitib29sIFJlbmRlcmVySW1wbDo6c2hvd09wZW5HTFN1YndpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB6Um90KSB7CisgICAgYXNzZXJ0KG1SZW5kZXJXaW5kb3cpOworICAgIHJldHVybiBtUmVuZGVyV2luZG93LT5zZXR1cFN1YldpbmRvdyh3aW5kb3csIHd4LCB3eSwgd3csIHdoLCBmYncsIGZiaCwgZHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Um90KTsKK30KKworYm9vbCBSZW5kZXJlckltcGw6OmRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3coKSB7CisgICAgYXNzZXJ0KG1SZW5kZXJXaW5kb3cpOworICAgIHJldHVybiBtUmVuZGVyV2luZG93LT5yZW1vdmVTdWJXaW5kb3coKTsKK30KKwordm9pZCBSZW5kZXJlckltcGw6OnNldE9wZW5HTERpc3BsYXlSb3RhdGlvbihmbG9hdCB6Um90KSB7CisgICAgYXNzZXJ0KG1SZW5kZXJXaW5kb3cpOworICAgIG1SZW5kZXJXaW5kb3ctPnNldFJvdGF0aW9uKHpSb3QpOworfQorCit2b2lkIFJlbmRlcmVySW1wbDo6c2V0T3BlbkdMRGlzcGxheVRyYW5zbGF0aW9uKGZsb2F0IHB4LCBmbG9hdCBweSkgeworICAgIGFzc2VydChtUmVuZGVyV2luZG93KTsKKyAgICBtUmVuZGVyV2luZG93LT5zZXRUcmFuc2xhdGlvbihweCwgcHkpOworfQorCit2b2lkIFJlbmRlcmVySW1wbDo6cmVwYWludE9wZW5HTERpc3BsYXkoKSB7CisgICAgYXNzZXJ0KG1SZW5kZXJXaW5kb3cpOworICAgIG1SZW5kZXJXaW5kb3ctPnJlcGFpbnQoKTsKK30KKwordm9pZCBSZW5kZXJlckltcGw6OmNsZWFudXBQcm9jR0xPYmplY3RzKHVpbnQ2NF90IHB1aWQpIHsKKyAgICBtQ2xlYW51cFByb2Nlc3NJZHMuc2VuZChwdWlkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJlckltcGwuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1JlbmRlcmVySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjUzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9SZW5kZXJlckltcGwuaApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9SZW5kZXJlci5oIgorCisjaW5jbHVkZSAiUmVuZGVyV2luZG93LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL0xvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2Uvc3luY2hyb25pemF0aW9uL01lc3NhZ2VDaGFubmVsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvRnVuY3RvclRocmVhZC5oIgorCisjaW5jbHVkZSAiUmVuZGVyVGhyZWFkLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK2NsYXNzIFJlbmRlcmVySW1wbCBmaW5hbCA6IHB1YmxpYyBSZW5kZXJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFJlbmRlcmVySW1wbD4geworcHVibGljOgorICAgIFJlbmRlcmVySW1wbCgpOworICAgIH5SZW5kZXJlckltcGwoKTsKKworICAgIGJvb2wgaW5pdGlhbGl6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGJvb2wgdXNlU3ViV2luZG93KTsKKworICAgIHZvaWQgc3RvcCgpOworCitwdWJsaWM6CisgICAgUmVuZGVyQ2hhbm5lbFB0ciBjcmVhdGVSZW5kZXJDaGFubmVsKCkgZmluYWw7CisgICAgSGFyZHdhcmVTdHJpbmdzIGdldEhhcmR3YXJlU3RyaW5ncygpIGZpbmFsOworICAgIHZvaWQgc2V0UG9zdENhbGxiYWNrKE9uUG9zdENhbGxiYWNrIG9uUG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbnRleHQpIGZpbmFsOworICAgIGJvb2wgc2hvd09wZW5HTFN1YndpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHpSb3QpIGZpbmFsOworICAgIGJvb2wgZGVzdHJveU9wZW5HTFN1YndpbmRvdygpIGZpbmFsOworICAgIHZvaWQgc2V0T3BlbkdMRGlzcGxheVJvdGF0aW9uKGZsb2F0IHpSb3QpIGZpbmFsOworICAgIHZvaWQgc2V0T3BlbkdMRGlzcGxheVRyYW5zbGF0aW9uKGZsb2F0IHB4LCBmbG9hdCBweSkgZmluYWw7CisgICAgdm9pZCByZXBhaW50T3BlbkdMRGlzcGxheSgpIGZpbmFsOworICAgIHZvaWQgY2xlYW51cFByb2NHTE9iamVjdHModWludDY0X3QgcHVpZCkgZmluYWw7Citwcml2YXRlOgorICAgIERJU0FMTE9XX0NPUFlfQVNTSUdOX0FORF9NT1ZFKFJlbmRlcmVySW1wbCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlcldpbmRvdz4gbVJlbmRlcldpbmRvdzsKKworICAgIGFuZHJvaWQ6OmJhc2U6OkxvY2sgbVRocmVhZFZlY3RvckxvY2s7CisKKyAgICB1c2luZyBUaHJlYWRXaXRoQ2hhbm5lbCA9IHN0ZDo6cGFpcjxzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyVGhyZWFkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPFJlbmRlckNoYW5uZWxJbXBsPj47CisKKyAgICBzdGQ6OnZlY3RvcjxUaHJlYWRXaXRoQ2hhbm5lbD4gbVRocmVhZHM7CisgICAgYm9vbCBtU3RvcHBlZCA9IGZhbHNlOworCisgICAgLy8gQSBtZXNzYWdlIGNoYW5uZWwgYW5kIGEgY2xlYW51cCB0aHJlYWQgZm9yIEdMIHJlc291cmNlcyBvZiBmaW5pc2hlZAorICAgIC8vIGd1ZXN0IHByb2Nlc3Nlcy4gQ2xlYW51cCB0YWtlcyB0aW1lLCBzbyB3ZSBzaG91bGQgb2ZmbG9hZCBpdCBpbnRvIGEKKyAgICAvLyB3b3JrZXIgdGhyZWFkLgorICAgIGFuZHJvaWQ6OmJhc2U6Ok1lc3NhZ2VDaGFubmVsPHVpbnQ2NF90LCA2ND4gbUNsZWFudXBQcm9jZXNzSWRzOworICAgIGFuZHJvaWQ6OmJhc2U6OkZ1bmN0b3JUaHJlYWQgbUNsZWFudXBUaHJlYWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1N5bmNUaHJlYWQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvU3luY1RocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmYzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1N5bmNUaHJlYWQuY3BwCkBAIC0wLDAgKzEsMjc4IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSAiU3luY1RocmVhZC5oIgorCisjaW5jbHVkZSAiRGlzcGF0Y2hUYWJsZXMuaCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5oIgorI2luY2x1ZGUgIlJlbmRlclRocmVhZEluZm8uaCIKKworI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vc3luY19kZXZpY2UuaCIKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKworc3RhdGljIHVpbnQ2NF90IGN1cnJfbXMoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgcmV0dXJuIHR2LnR2X3VzZWMgLyAxMDAwICsgdHYudHZfc2VjICogMTAwMDsKK30KKworI2RlZmluZSBEUFJJTlQoZm10LCAuLi4pIGRvIHsgXAorICAgIGlmICghVkVSQk9TRV9DSEVDSyhzeW5jdGhyZWFkcykpIFZFUkJPU0VfRU5BQkxFKHN5bmN0aHJlYWRzKTsgXAorICAgIFZFUkJPU0VfVElEX0ZVTkNUSU9OX0RQUklOVChzeW5jdGhyZWFkcywgIkAgdGltZT0lbGx1OiAiIGZtdCwgY3Vycl9tcygpLCAjI19fVkFfQVJHU19fKTsgXAorfSB3aGlsZSgwKQorCisjZWxzZQorCisjZGVmaW5lIERQUklOVCguLi4pCisKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga1RpbWVsaW5lSW50ZXJ2YWwgPSAxOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtEZWZhdWx0VGltZW91dE5zZWNzID0gNVVMTCAqIDEwMDBVTEwgKiAxMDAwVUxMICogMTAwMFVMTDsKKworU3luY1RocmVhZDo6U3luY1RocmVhZChFR0xDb250ZXh0IHBhcmVudENvbnRleHQpIDoKKyAgICBtRGlzcGxheShFR0xfTk9fRElTUExBWSksCisgICAgbUNvbnRleHQoMCksIG1TdXJmKDApIHsKKworICAgIGlmIChwYXJlbnRDb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGVtdWdsX2NyYXNoX3JlcG9ydGVyKAorICAgICAgICAgICAgICAgICJFUlJPUjogYXR0ZW1wdGVkIHRvIHN0YXJ0IGEgU3luY1RocmVhZCAiCisgICAgICAgICAgICAgICAgIndpdGggRUdMX05PX0NPTlRFWFQgYXMgcGFyZW50IGNvbnRleHQhIik7CisgICAgfQorCisgICAgRnJhbWVCdWZmZXIgKmZiID0gRnJhbWVCdWZmZXI6OmdldEZCKCk7CisgICAgbURpc3BsYXkgPSBmYi0+Z2V0RGlzcGxheSgpOworCisgICAgdGhpcy0+c3RhcnQoKTsKKworICAgIGluaXRTeW5jQ29udGV4dCgpOworfQorCit2b2lkIFN5bmNUaHJlYWQ6OnRyaWdnZXJXYWl0KEZlbmNlU3luYyogZmVuY2VTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lbGluZSkgeworICAgIERQUklOVCgiZmVuY2VTeW5jSW5mbz0weCVsbHggdGltZWxpbmU9MHglbHggLi4uIiwKKyAgICAgICAgICAgIGZlbmNlU3luY0luZm8sIHRpbWVsaW5lKTsKKyAgICBTeW5jVGhyZWFkQ21kIHRvX3NlbmQ7CisgICAgdG9fc2VuZC5vcENvZGUgPSBTWU5DX1RIUkVBRF9XQUlUOworICAgIHRvX3NlbmQuZmVuY2VTeW5jID0gZmVuY2VTeW5jOworICAgIHRvX3NlbmQudGltZWxpbmUgPSB0aW1lbGluZTsKKyAgICBEUFJJTlQoIm9wY29kZT0ldSIsIHRvX3NlbmQub3BDb2RlKTsKKyAgICBzZW5kQXN5bmModG9fc2VuZCk7CisgICAgRFBSSU5UKCJleGl0Iik7Cit9CisKK3ZvaWQgU3luY1RocmVhZDo6Y2xlYW51cCgpIHsKKyAgICBEUFJJTlQoImVudGVyIik7CisgICAgU3luY1RocmVhZENtZCB0b19zZW5kOworICAgIHRvX3NlbmQub3BDb2RlID0gU1lOQ19USFJFQURfRVhJVDsKKyAgICBzZW5kQW5kV2FpdEZvclJlc3VsdCh0b19zZW5kKTsKKyAgICBEUFJJTlQoImV4aXQiKTsKK30KKworLy8gUHJpdmF0ZSBtZXRob2RzIGJlbG93Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBTeW5jVGhyZWFkOjppbml0U3luY0NvbnRleHQoKSB7CisgICAgRFBSSU5UKCJlbnRlciIpOworICAgIFN5bmNUaHJlYWRDbWQgdG9fc2VuZDsKKyAgICB0b19zZW5kLm9wQ29kZSA9IFNZTkNfVEhSRUFEX0lOSVQ7CisgICAgc2VuZEFuZFdhaXRGb3JSZXN1bHQodG9fc2VuZCk7CisgICAgRFBSSU5UKCJleGl0Iik7Cit9CisKK2ludHB0cl90IFN5bmNUaHJlYWQ6Om1haW4oKSB7CisgICAgRFBSSU5UKCJpbiBzeW5jIHRocmVhZCIpOworCisgICAgYm9vbCBleGl0aW5nID0gZmFsc2U7CisgICAgdWludDMyX3QgbnVtX2l0ZXIgPSAwOworCisgICAgd2hpbGUgKCFleGl0aW5nKSB7CisgICAgICAgIFN5bmNUaHJlYWRDbWQgY21kID0ge307CisKKyAgICAgICAgRFBSSU5UKCJ3YWl0aW5nIHRvIHJlY2VpdmUgY29tbWFuZCIpOworICAgICAgICBtSW5wdXQucmVjZWl2ZSgmY21kKTsKKyAgICAgICAgbnVtX2l0ZXIrKzsKKworICAgICAgICBEUFJJTlQoInN5bmMgdGhyZWFkIEAlcCBudW0gaXRlcjogJXUiLCB0aGlzLCBudW1faXRlcik7CisKKyAgICAgICAgYm9vbCBuZWVkX3JlcGx5ID0gY21kLm5lZWRSZXBseTsKKyAgICAgICAgaW50IHJlc3VsdCA9IGRvU3luY1RocmVhZENtZCgmY21kKTsKKworICAgICAgICBpZiAobmVlZF9yZXBseSkgeworICAgICAgICAgICAgRFBSSU5UKCJzZW5kaW5nIHJlc3VsdCIpOworICAgICAgICAgICAgbU91dHB1dC5zZW5kKHJlc3VsdCk7CisgICAgICAgICAgICBEUFJJTlQoInNlbnQgcmVzdWx0Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY21kLm9wQ29kZSA9PSBTWU5DX1RIUkVBRF9FWElUKSBleGl0aW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICBEUFJJTlQoImV4aXRlZCBzeW5jIHRocmVhZCIpOworICAgIHJldHVybiAwOworfQorCitpbnQgU3luY1RocmVhZDo6c2VuZEFuZFdhaXRGb3JSZXN1bHQoU3luY1RocmVhZENtZCYgY21kKSB7CisgICAgRFBSSU5UKCJzZW5kIHdpdGggb3Bjb2RlPSVkIiwgY21kLm9wQ29kZSk7CisgICAgY21kLm5lZWRSZXBseSA9IHRydWU7CisgICAgbUlucHV0LnNlbmQoY21kKTsKKyAgICBpbnQgcmVzdWx0ID0gLTE7CisgICAgbU91dHB1dC5yZWNlaXZlKCZyZXN1bHQpOworICAgIERQUklOVCgicmVzdWx0PSVkIiwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFN5bmNUaHJlYWQ6OnNlbmRBc3luYyhTeW5jVGhyZWFkQ21kJiBjbWQpIHsKKyAgICBEUFJJTlQoInNlbmQgd2l0aCBvcGNvZGU9JXUgZmVuY2VTeW5jSW5mbz0weCVsbHgiLAorICAgICAgICAgICBjbWQub3BDb2RlLCBjbWQuZmVuY2VTeW5jSW5mbyk7CisgICAgY21kLm5lZWRSZXBseSA9IGZhbHNlOworICAgIG1JbnB1dC5zZW5kKGNtZCk7Cit9CisKK3ZvaWQgU3luY1RocmVhZDo6ZG9TeW5jQ29udGV4dEluaXQoKSB7CisgICAgLy8gfG1UTFN8IGlzIGNsZWFuZWQgdXAgb24gZG9FeGl0KCksIHdoaWNoIGlzIGNhbGxlZAorICAgIC8vIHdoZW4gUmVuZGVyVGhyZWFkcyBleGl0LgorICAgIC8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgbWFrZSB0aGUgc3Vic2VxdWVudAorICAgIC8vIEZyYW1lQnVmZmVyOjoqKiogY2FsbHMgdXNlIHxtVExTfCBhcyB0aHJlYWQgbG9jYWwgc3RvcmFnZSwKKyAgICAvLyBiZWNhdXNlIHRoZSBzZW1hbnRpY3Mgb2YgdGhlIHxSZW5kZXJUaHJlYWRJbmZvfCBjb25zdHJ1Y3RvcgorICAgIC8vIGFyZSB0byBib3RoIGNyZWF0ZSB0aGUgb2JqZWN0IF9hbmRfIHRvIHNldCBpdCB0bworICAgIC8vIHRoZSB0aHJlYWQgbG9jYWwgY29weS4KKyAgICBtVExTID0gbmV3IFJlbmRlclRocmVhZEluZm8oKTsKKworICAgIERQUklOVCgiZW50ZXIiKTsKKyAgICBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+Y3JlYXRlVHJpdmlhbENvbnRleHQoMCwgLy8gbm8gc2hhcmUgY29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhpcy0+bUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGlzLT5tU3VyZik7CisgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPmJpbmRDb250ZXh0KG1Db250ZXh0LCBtU3VyZiwgbVN1cmYpOworICAgIERQUklOVCgiZXhpdCIpOworfQorCit2b2lkIFN5bmNUaHJlYWQ6OmRvU3luY1dhaXQoU3luY1RocmVhZENtZCogY21kKSB7CisgICAgRFBSSU5UKCJlbnRlciIpOworCisgICAgYXNzZXJ0KGNtZC0+ZmVuY2VTeW5jKTsKKworICAgIEVHTGludCB3YWl0X3Jlc3VsdCA9IDB4MDsKKworICAgIERQUklOVCgid2FpdCBvbiBzeW5jIG9iajogJXAiLCBjbWQtPmZlbmNlU3luYyk7CisgICAgd2FpdF9yZXN1bHQgPSBjbWQtPmZlbmNlU3luYy0+d2FpdChrRGVmYXVsdFRpbWVvdXROc2Vjcyk7CisKKyAgICBEUFJJTlQoImRvbmUgd2FpdGluZywgd2l0aCB3YWl0IHJlc3VsdD0weCV4LiAiCisgICAgICAgICAgICJpbmNyZW1lbnQgdGltZWxpbmUgKGFuZCBzaWduYWwgZmVuY2UpIiwKKyAgICAgICAgICAgd2FpdF9yZXN1bHQpOworCisgICAgaWYgKHdhaXRfcmVzdWx0ICE9IEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX0tIUikgeworICAgICAgICBEUFJJTlQoImVycm9yOiBlZ2xDbGllbnRXYWl0U3luYyBhYm5vcm1hbCBleGl0IDB4JXhcbiIsCisgICAgICAgICAgICAgICB3YWl0X3Jlc3VsdCk7CisgICAgfQorCisgICAgRFBSSU5UKCJpc3N1ZSB0aW1lbGluZSBpbmNyZW1lbnQiKTsKKworICAgIC8vIFdlIGFsd2F5cyB1bmNvbmRpdGlvbmFsbHkgaW5jcmVtZW50IHRpbWVsaW5lIGF0IHRoaXMgcG9pbnQsIGV2ZW4KKyAgICAvLyBpZiB0aGUgY2FsbCB0byBlZ2xDbGllbnRXYWl0U3luYyByZXR1cm5lZCBhYm5vcm1hbGx5LgorICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBjb25zaWRlcjoKKyAgICAvLyAtIEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX0tIUjogZWl0aGVyIHRoZSBzeW5jIG9iamVjdCBpcyBhbHJlYWR5CisgICAgLy8gICBzaWduYWxlZCBhbmQgd2UgbmVlZCB0byBpbmNyZW1lbnQgdGhpcyB0aW1lbGluZSBpbW1lZGlhdGVseSwgb3IKKyAgICAvLyAgIHdlIGhhdmUgd2FpdGVkIHVudGlsIHRoZSBvYmplY3QgaXMgc2lnbmFsZWQsIGFuZCB0aGVuCisgICAgLy8gICB3ZSBpbmNyZW1lbnQgdGhlIHRpbWVsaW5lLgorICAgIC8vIC0gRUdMX1RJTUVPVVRfRVhQSVJFRF9LSFI6IHRoZSBmZW5jZSBjb21tYW5kIHdlIHB1dCBpbiBlYXJsaWVyCisgICAgLy8gICBpbiB0aGUgT3BlbkdMIHN0cmVhbSBpcyBub3QgYWN0dWFsbHkgZXZlciBzaWduYWxlZCwgYW5kIHdlCisgICAgLy8gICBlbmQgdXAgYmxvY2tpbmcgaW4gdGhlIGFib3ZlIGVnbENsaWVudFdhaXRTeW5jS0hSIGNhbGwgdW50aWwKKyAgICAvLyAgIG91ciB0aW1lb3V0IHJ1bnMgb3V0LiBJbiB0aGlzIGNhc2UsIHByb3ZpZGVkIHdlIGhhdmUgd2FpdGVkCisgICAgLy8gICBmb3IgfGtEZWZhdWx0VGltZW91dE5zZWNzfCwgdGhlIGd1ZXN0IHdpbGwgaGF2ZSByZWNlaXZlZCBhbGwKKyAgICAvLyAgIHJlbGV2YW50IGVycm9yIG1lc3NhZ2VzIGFib3V0IGZlbmNlIGZkJ3Mgbm90IGJlaW5nIHNpZ25hbGVkCisgICAgLy8gICBpbiB0aW1lLCBzbyB3ZSBhcmUgcHJvcGVybHkgZW11bGF0aW5nIGJhZCBiZWhhdmlvciBldmVuIGlmCisgICAgLy8gICB3ZSBub3cgaW5jcmVtZW50IHRoZSB0aW1lbGluZS4KKyAgICAvLyAtIEVHTF9GQUxTRSAoZXJyb3IpOiBjaGFuY2VzIGFyZSwgdGhlIHVuZGVybHlpbmcgRUdMIGltcGxlbWVudGF0aW9uCisgICAgLy8gICBvbiB0aGUgaG9zdCBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgZmVuY2Ugb2JqZWN0cy4gSW4gdGhpcyBjYXNlLAorICAgIC8vICAgd2Ugc2hvdWxkIGZhaWwgc2FmZTogMSkgSXQgbXVzdCBiZSBvbmx5IHZlcnkgb2xkIG9yIGZhdWx0eQorICAgIC8vICAgZ3JhcGhpY3MgZHJpdmVycyAvIEdQVSdzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBmZW5jZSBvYmplY3RzLgorICAgIC8vICAgMikgVGhlIGNvbnNlcXVlbmNlcyBvZiBzaWduYWxpbmcgdG9vIGVhcmx5IGFyZSBnZW5lcmFsbHksIG91dCBvZgorICAgIC8vICAgb3JkZXIgZnJhbWVzIGFuZCBzY3JhbWJsZWQgdGV4dHVyZXMgaW4gc29tZSBhcHBzLiBCdXQsIG5vdAorICAgIC8vICAgaW5jcmVtZW50aW5nIHRoZSB0aW1lbGluZSBtZWFucyB0aGF0IHRoZSBhcHAncyByZW5kZXJpbmcgZnJlZXplcy4KKyAgICAvLyAgIFNvLCBkZXNwaXRlIHRoZSBmYXVsdHkgR1BVIGRyaXZlciwgbm90IGluY3JlbWVudGluZyBpcyB0b28gaGVhdnl3ZWlnaHQgYSByZXNwb25zZS4KKworICAgIGVtdWdsX3N5bmNfdGltZWxpbmVfaW5jKGNtZC0+dGltZWxpbmUsIGtUaW1lbGluZUludGVydmFsKTsKKyAgICBjbWQtPmZlbmNlU3luYy0+c2lnbmFsZWROYXRpdmVGZCgpOworCisgICAgRFBSSU5UKCJkb25lIHRpbWVsaW5lIGluY3JlbWVudCIpOworCisgICAgRFBSSU5UKCJleGl0Iik7Cit9CisKK3ZvaWQgU3luY1RocmVhZDo6ZG9FeGl0KCkgeworICAgIC8vIFRoaXMgc2VxdWVuY2UgcGFyYWxsZWxzIHRoZSBleGl0IHNlcXVlbmNlCisgICAgLy8gaW4gUmVuZGVyVGhyZWFkLgorICAgIEZyYW1lQnVmZmVyOjpnZXRGQigpLT5iaW5kQ29udGV4dCgwLCAwLCAwKTsKKyAgICBGcmFtZUJ1ZmZlcjo6Z2V0RkIoKS0+ZHJhaW5XaW5kb3dTdXJmYWNlKCk7CisgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPmRyYWluUmVuZGVyQ29udGV4dCgpOworICAgIGRlbGV0ZSBtVExTOworfQorCitpbnQgU3luY1RocmVhZDo6ZG9TeW5jVGhyZWFkQ21kKFN5bmNUaHJlYWRDbWQqIGNtZCkgeworICAgIGludCByZXN1bHQgPSAwOworICAgIHN3aXRjaCAoY21kLT5vcENvZGUpIHsKKyAgICBjYXNlIFNZTkNfVEhSRUFEX0lOSVQ6CisgICAgICAgIERQUklOVCgiZXhlYyBTWU5DX1RIUkVBRF9JTklUIik7CisgICAgICAgIGRvU3luY0NvbnRleHRJbml0KCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1lOQ19USFJFQURfV0FJVDoKKyAgICAgICAgRFBSSU5UKCJleGVjIFNZTkNfVEhSRUFEX1dBSVQiKTsKKyAgICAgICAgZG9TeW5jV2FpdChjbWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNZTkNfVEhSRUFEX0VYSVQ6CisgICAgICAgIERQUklOVCgiZXhlYyBTWU5DX1RIUkVBRF9FWElUIik7CisgICAgICAgIGRvRXhpdCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gSW50ZXJmYWNlIGZvciBsaWJPcGVuZ2xSZW5kZXIgVExTCisKKy8qIHN0YXRpYyAqLworU3luY1RocmVhZCogU3luY1RocmVhZDo6Z2V0U3luY1RocmVhZCgpIHsKKyAgICBSZW5kZXJUaHJlYWRJbmZvKiB0SW5mbyA9IFJlbmRlclRocmVhZEluZm86OmdldCgpOworCisgICAgaWYgKCF0SW5mby0+c3luY1RocmVhZC5nZXQoKSkgeworICAgICAgICBEUFJJTlQoInN0YXJ0aW5nIGEgc3luYyB0aHJlYWQgZm9yIHJlbmRlciB0aHJlYWQgaW5mbz0lcCIsIHRJbmZvKTsKKyAgICAgICAgdEluZm8tPnN5bmNUaHJlYWQucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IFN5bmNUaHJlYWQoc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKSkpOworICAgIH0KKworICAgIHJldHVybiB0SW5mby0+c3luY1RocmVhZC5nZXQoKTsKK30KKworLyogc3RhdGljICovCit2b2lkIFN5bmNUaHJlYWQ6OmRlc3Ryb3lTeW5jVGhyZWFkKCkgeworICAgIFJlbmRlclRocmVhZEluZm8qIHRJbmZvID0gUmVuZGVyVGhyZWFkSW5mbzo6Z2V0KCk7CisKKyAgICBEUFJJTlQoImV4aXRpbmcgYSBzeW5jIHRocmVhZCBmb3IgcmVuZGVyIHRocmVhZCBpbmZvPSVwLiIsIHRJbmZvKTsKKworICAgIGlmICghdEluZm8tPnN5bmNUaHJlYWQpIHJldHVybjsKKworICAgIHRJbmZvLT5zeW5jVGhyZWFkLT5jbGVhbnVwKCk7CisgICAgaW50cHRyX3QgZXhpdFN0YXR1czsKKyAgICB0SW5mby0+c3luY1RocmVhZC0+d2FpdCgmZXhpdFN0YXR1cyk7CisgICAgdEluZm8tPnN5bmNUaHJlYWQucmVzZXQobnVsbHB0cik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9TeW5jVGhyZWFkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9TeW5jVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZWY0MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1N5bmNUaHJlYWQuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGZW5jZVN5bmMuaCIKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi90aHJlYWQuaCIKKworLy8gU3luY1RocmVhZC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoZSBwdXJwb3NlIG9mIFN5bmNUaHJlYWQgaXMgdG8gdHJhY2sgc3luYyBkZXZpY2UgdGltZWxpbmVzIGFuZCBnaXZlIG91dCArCisvLyBzaWduYWwgRkQncyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIGNvbXBsZXRpb24gb2YgaG9zdC1zaWRlIEdMIGZlbmNlIGNvbW1hbmRzLgorCisvLyBXZSBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzeW5jIHRocmVhZCBpbiAzIHdheXM6CitlbnVtIFN5bmNUaHJlYWRPcENvZGUgeworICAgIC8vIE5vbmJsb2NraW5nIGNvbW1hbmQgdG8gaW5pdGlhbGl6ZSBzeW5jIHRocmVhZCdzIGNvbnRlbnRzLAorICAgIC8vIHN1Y2ggYXMgdGhlIEVHTCBjb250ZXh0IGZvciBzeW5jIG9wZXJhdGlvbnMKKyAgICBTWU5DX1RIUkVBRF9JTklUID0gMCwKKyAgICAvLyBOb25ibG9ja2luZyBjb21tYW5kIHRvIHdhaXQgb24gYSBnaXZlbiBGZW5jZVN5bmMgb2JqZWN0CisgICAgLy8gYW5kIHRpbWVsaW5lIGhhbmRsZS4KKyAgICAvLyBBIGZlbmNlIEZEIG9iamVjdCBpbiB0aGUgZ3Vlc3QgaXMgc2lnbmFsZWQuCisgICAgU1lOQ19USFJFQURfV0FJVCA9IDEsCisgICAgLy8gQmxvY2tpbmcgY29tbWFuZCB0byBjbGVhbiB1cCBhbmQgZXhpdCB0aGUgc3luYyB0aHJlYWQuCisgICAgU1lOQ19USFJFQURfRVhJVCA9IDIKK307CisKK3N0cnVjdCBTeW5jVGhyZWFkQ21kIHsKKyAgICBTeW5jVGhyZWFkT3BDb2RlIG9wQ29kZSA9IFNZTkNfVEhSRUFEX0lOSVQ7CisgICAgRmVuY2VTeW5jKiBmZW5jZVN5bmMgPSBudWxscHRyOworICAgIHVpbnQ2NF90IHRpbWVsaW5lID0gMDsKKyAgICBib29sIG5lZWRSZXBseSA9IGZhbHNlOworfTsKKworc3RydWN0IFJlbmRlclRocmVhZEluZm87CitjbGFzcyBTeW5jVGhyZWFkIDogcHVibGljIGVtdWdsOjpUaHJlYWQgeworcHVibGljOgorICAgIC8vIC0gY29uc3RydWN0b3I6IHN0YXJ0IHVwIHRoZSBzeW5jIHRocmVhZCBmb3IgYSBnaXZlbiBjb250ZXh0LgorICAgIC8vIFRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3luYyB0aHJlYWQgaXMgbm9uYmxvY2tpbmcuCisgICAgLy8gLSBUcmlnZ2VycyBhIHxTeW5jVGhyZWFkQ21kfCB3aXRoIG9wIGNvZGUgfFNZTkNfVEhSRUFEX0lOSVR8CisgICAgU3luY1RocmVhZChFR0xDb250ZXh0IGNvbnRleHQpOworICAgIC8vIHx0cmlnZ2VyV2FpdHw6IGFzeW5jIHdhaXQgd2l0aCBhIGdpdmVuIEZlbmNlU3luYyBvYmplY3QuCisgICAgLy8gV2UgdXNlIHRoZSB3YWl0KCkgbWV0aG9kIHRvIGRvIGEgZWdsQ2xpZW50V2FpdFN5bmNLSFIuCisgICAgLy8gQWZ0ZXIgd2FpdCBpcyBvdmVyLCB0aGUgdGltZWxpbmUgd2lsbCBiZSBpbmNyZW1lbnRlZCwKKyAgICAvLyB3aGljaCBzaG91bGQgc2lnbmFsIHRoZSBndWVzdC1zaWRlIGZlbmNlIEZELgorICAgIC8vIFRoaXMgbWV0aG9kIGlzIGhvdyB0aGUgZ29sZGZpc2ggc3luYyB2aXJ0dWFsIGRldmljZQorICAgIC8vIGtub3dzIHdoZW4gdG8gaW5jcmVtZW50IHRpbWVsaW5lcyAvIHNpZ25hbCBuYXRpdmUgZmVuY2UgRkQncy4KKyAgICB2b2lkIHRyaWdnZXJXYWl0KEZlbmNlU3luYyogZmVuY2VTeW5jLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZWxpbmUpOworICAgIC8vIHxjbGVhbnVwfDogZm9yIHVzZSB3aXRoIGRlc3RydWN0b3JzIGFuZCBvdGhlciBjbGVhbnVwIGZ1bmN0aW9ucy4KKyAgICAvLyBpdCBkZXN0cm95cyB0aGUgc3luYyBjb250ZXh0IGFuZCBleGl0cyB0aGUgc3luYyB0aHJlYWQuCisgICAgLy8gVGhpcyBpcyBibG9ja2luZzsgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCB3ZSdyZSBzdXJlCisgICAgLy8gdGhlIHN5bmMgdGhyZWFkIGlzIGdvbmUuCisgICAgLy8gLSBUcmlnZ2VycyBhIHxTeW5jVGhyZWFkQ21kfCB3aXRoIG9wIGNvZGUgfFNZTkNfVEhSRUFEX0VYSVR8CisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICAvLyBXZSBhc3N1bWUgdGhlIGludmFyaWFudCB0aGF0IHN5bmMgdGhyZWFkcyBjb3JyZXNwb25kIDE6MQorICAgIC8vIHdpdGggcmVuZGVyIHRocmVhZHMuCisgICAgLy8gVGhlcmVmb3JlLCB3ZSBjcmVhdGUgYW5kIGRlc3Ryb3kgc3luYyB0aHJlYWRzIHVzaW5nCisgICAgLy8gb25seSB0aGUgdHdvIGZ1bmN0aW9ucyBiZWxvdywgfGdldFN5bmNUaHJlYWR8IGFuZCB8ZGVzdHJveVN5bmNUaHJlYWR8LgorICAgIC8vIC0gfGdldFN5bmNUaHJlYWR8IGxvb2tzIGF0IHJlbmRlciB0aHJlYWQncyBUTFMgZm9yIGEgc3luYyB0aHJlYWQuCisgICAgLy8gICBJZiB0aGVyZSBpc24ndCBvbmUsIGEgc3luYyB0aHJlYWQgaXMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuCisgICAgLy8gLSB8ZGVzdHJveVN5bmNUaHJlYWR8IGNsZWFucyB1cCBhbmQgZGVsZXRlcyB0aGUgc3luYyB0aHJlYWQsCisgICAgLy8gICBpZiB0aGVyZSBpcyBvbmUgc3RhcnRlZCBhbHJlYWR5LgorICAgIC8vICAgSXQgaXMgbWVhbnQgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHJlbmRlciB0aHJlYWRzIGV4aXQgb3IKKyAgICAvLyAgIEVHTCBjb250ZXh0cyBhcmUgZGVzdHJveWVkLgorICAgIHN0YXRpYyBTeW5jVGhyZWFkKiBnZXRTeW5jVGhyZWFkKCk7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveVN5bmNUaHJlYWQoKTsKKworcHJpdmF0ZToKKyAgICAvLyB8aW5pdFN5bmNDb250ZXh0fCBjcmVhdGVzIGFuIEVHTCBjb250ZXh0IGV4cHJlc3NseSBmb3IgY2FsbGluZworICAgIC8vIGVnbENsaWVudFdhaXRTeW5jS0hSIGluIHRoZSBwcm9jZXNzaW5nIGNhdXNlZCBieSB8dHJpZ2dlcldhaXR8LgorICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgY29uc3RydWN0b3Igb25seS4gSXQgaXMgbm9uLWJsb2NraW5nLgorICAgIC8vIC0gVHJpZ2dlcnMgYSB8U3luY1RocmVhZENtZHwgd2l0aCBvcCBjb2RlIHxTWU5DX1RIUkVBRF9JTklUfAorICAgIHZvaWQgaW5pdFN5bmNDb250ZXh0KCk7CisKKyAgICAvLyBUaHJlYWQgZnVuY3Rpb24gZXhlY3V0aW5nIGFsbCBzeW5jIGNvbW1hbmRzLgorICAgIC8vIEl0IGxpc3RlbnMgZm9yIHxTeW5jVGhyZWFkQ21kfCBvYmplY3RzIG9mZiB0aGUgbWVzc2FnZSBjaGFubmVsCisgICAgLy8gfG1JbnB1dHwsIGFuZCBydW5zIHRoZW0gc2VyaWFsbHkuCisgICAgdmlydHVhbCBpbnRwdHJfdCBtYWluKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU3luY1RocmVhZENoYW5uZWxDYXBhY2l0eSA9IDI1NjsKKyAgICBhbmRyb2lkOjpiYXNlOjpNZXNzYWdlQ2hhbm5lbDxTeW5jVGhyZWFkQ21kLCBrU3luY1RocmVhZENoYW5uZWxDYXBhY2l0eT4gbUlucHV0OworCisgICAgLy8gfG1PdXRwdXR8IGhvbGRzIHJlc3VsdCBvZiBjbWRzIGluIGNhc2Ugb2YgYmxvY2tpbmcgY29tbWFuZHMKKyAgICAvLyB0aGF0IHJlcXVpcmUgcmV0dXJuIHJlc3VsdHMuCisgICAgYW5kcm9pZDo6YmFzZTo6TWVzc2FnZUNoYW5uZWw8R0xpbnQsIGtTeW5jVGhyZWFkQ2hhbm5lbENhcGFjaXR5PiBtT3V0cHV0OworCisgICAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzeW5jIHRocmVhZAorICAgIC8vIGZyb20gYW5vdGhlciB0aHJlYWQ6CisgICAgLy8gLSB8c2VuZEFuZFdhaXRGb3JSZXN1bHR8IGlzc3VlcyB8Y21kfCB0byB0aGUgc3luYyB0aHJlYWQsCisgICAgLy8gICBhbmQgYmxvY2tzIHVudGlsIGl0IHJlY2VpdmVzIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQuCisgICAgLy8gLSB8c2VuZEFzeW5jfCBpc3N1ZXMgfGNtZHwgdG8gdGhlIHN5bmMgdGhyZWFkIGFuZCBkb2VzIG5vdAorICAgIC8vICAgd2FpdCBmb3IgdGhlIHJlc3VsdCwgcmV0dXJuaW5nIGltbWVkaWF0ZWx5IGFmdGVyLgorICAgIEdMaW50IHNlbmRBbmRXYWl0Rm9yUmVzdWx0KFN5bmNUaHJlYWRDbWQmIGNtZCk7CisgICAgdm9pZCBzZW5kQXN5bmMoU3luY1RocmVhZENtZCYgY21kKTsKKworICAgIC8vIHxkb1N5bmNUaHJlYWRDbWR8IGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBiZWxvdworICAgIC8vIGV4ZWN1dGUgdGhlIGFjdHVhbCBjb21tYW5kcy4gVGhlc2UgcnVuIG9uIHRoZSBzeW5jIHRocmVhZC4KKyAgICBHTGludCBkb1N5bmNUaHJlYWRDbWQoU3luY1RocmVhZENtZCogY21kKTsKKyAgICB2b2lkIGRvU3luY0NvbnRleHRJbml0KCk7CisgICAgdm9pZCBkb1N5bmNXYWl0KFN5bmNUaHJlYWRDbWQqIGNtZCk7CisgICAgdm9pZCBkb0V4aXQoKTsKKworICAgIC8vIEVHTCBvYmplY3RzIC8gb2JqZWN0IGhhbmRsZXMgc3BlY2lmaWMgdG8KKyAgICAvLyBhIHN5bmMgdGhyZWFkLgorICAgIEVHTERpc3BsYXkgbURpc3BsYXk7CisgICAgUmVuZGVyVGhyZWFkSW5mbyogbVRMUzsKKyAgICB1aW50MzJfdCBtQ29udGV4dDsKKyAgICB1aW50MzJfdCBtU3VyZjsKK307CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1RleHR1cmVEcmF3LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1RleHR1cmVEcmF3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRmM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvVGV4dHVyZURyYXcuY3BwCkBAIC0wLDAgKzEsMjk5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJUZXh0dXJlRHJhdy5oIgorCisjaW5jbHVkZSAiRGlzcGF0Y2hUYWJsZXMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZGVmaW5lIEVSUiguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisKK25hbWVzcGFjZSB7CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgc2hhZGVyLgorLy8gfHNoYWRlclR5cGV8IGlzIHRoZSBzaGFkZXIgdHlwZSAoZS5nLiBHTF9WRVJURVhfU0hBREVSKS4KKy8vIHxzaGFkZXJUZXh0fCBpcyBhIDAtdGVybWluYXRlZCBDIHN0cmluZyBmb3IgdGhlIHNoYWRlciBzb3VyY2UgdG8gdXNlLgorLy8gT24gc3VjY2VzcywgcmV0dXJuIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBjb21waWxlZCBzaGFkZXIsIG9yIDAgb24gZmFpbHVyZS4KK0dMdWludCBjcmVhdGVTaGFkZXIoR0xpbnQgc2hhZGVyVHlwZSwgY29uc3QgY2hhciogc2hhZGVyVGV4dCkgeworICAgIC8vIENyZWF0ZSBuZXcgc2hhZGVyIGhhbmRsZSBhbmQgYXR0YWNoIHNvdXJjZS4KKyAgICBHTHVpbnQgc2hhZGVyID0gc19nbGVzMi5nbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKKyAgICBpZiAoIXNoYWRlcikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgR0xjaGFyKiB0ZXh0ID0gc3RhdGljX2Nhc3Q8Y29uc3QgR0xjaGFyKj4oc2hhZGVyVGV4dCk7CisgICAgY29uc3QgR0xpbnQgdGV4dExlbiA9IDo6c3RybGVuKHNoYWRlclRleHQpOworICAgIHNfZ2xlczIuZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmdGV4dCwgJnRleHRMZW4pOworCisgICAgLy8gQ29tcGlsZXIgdGhlIHNoYWRlci4KKyAgICBHTGludCBzdWNjZXNzOworICAgIHNfZ2xlczIuZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7CisgICAgc19nbGVzMi5nbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZzdWNjZXNzKTsKKyAgICBpZiAoc3VjY2VzcyA9PSBHTF9GQUxTRSkgeworICAgICAgICBzX2dsZXMyLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBzaGFkZXI7Cit9CisKKy8vIE5vIHNjYWxpbmcgLyBwcm9qZWN0aW9uIHNpbmNlIHdlIHdhbnQgdG8gZmlsbCB0aGUgd2hvbGUgdmlld3BvcnQgd2l0aAorLy8gdGhlIHRleHR1cmUsIGhlbmNlIGEgdHJpdmlhbCB2ZXJ0ZXggc2hhZGVyIHRoYXQgb25seSBzdXBwb3J0cyB0cmFuc2xhdGlvbi4KKy8vIE5vdGU6IHdlIHVzZWQgdG8gaGF2ZSBhIHByb3BlciBmcmVlLWFuZ2xlIHJvdGF0aW9uIHN1cHBvcnQgaW4gdGhpcyBzaGFkZXIsCisvLyAgYnV0IGxvb2tzIGxpa2UgU3dpZnRTaGFkZXIgZG9lc24ndCBzdXBwb3J0IGVpdGhlciBjb21wbGljYXRlZCBjYWxjdWxhdGlvbnMKKy8vICBmb3IgZ2xfUG9zaXRpb24vdmFyeWluZ3Mgb3IganVzdCBkb2Vzbid0IGxpa2UgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgaW4KKy8vICBzaGFkZXI7IGFueXdheSB0aGUgbmV3IGNvZGUgaGFzIGhhcmRjb2RlZCB0ZXh0dXJlIGNvb3JkaW5hdGUgbWFwcGluZyBmb3IKKy8vICBkaWZmZXJlbnQgcm90YXRpb24gYW5nbGVzIGFuZCB3b3JrcyBpbiBib3RoIG5hdGl2ZSBPcGVuR0wgYW5kIFN3aWZ0U2hhZGVyLgorY29uc3QgY2hhciBrVmVydGV4U2hhZGVyU291cmNlW10gPQorICAgICJhdHRyaWJ1dGUgdmVjNCBwb3NpdGlvbjtcbiIKKyAgICAiYXR0cmlidXRlIHZlYzIgaW5Db29yZDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIG91dENvb3JkO1xuIgorICAgICJ1bmlmb3JtIHZlYzIgdHJhbnNsYXRpb247XG4iCisKKyAgICAidm9pZCBtYWluKHZvaWQpIHtcbiIKKyAgICAiICBnbF9Qb3NpdGlvbi54eSA9IHBvc2l0aW9uLnh5IC0gdHJhbnNsYXRpb24ueHk7XG4iCisgICAgIiAgZ2xfUG9zaXRpb24uencgPSBwb3NpdGlvbi56dztcbiIKKyAgICAiICBvdXRDb29yZCA9IGluQ29vcmQ7XG4iCisgICAgIn1cbiI7CisKKy8vIFNpbWlsYXJseSwganVzdCBpbnRlcnBvbGF0ZSB0ZXh0dXJlIGNvb3JkaW5hdGVzLgorY29uc3QgY2hhciBrRnJhZ21lbnRTaGFkZXJTb3VyY2VbXSA9CisgICAgInZhcnlpbmcgbG93cCB2ZWMyIG91dENvb3JkO1xuIgorICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xuIgorCisgICAgInZvaWQgbWFpbih2b2lkKSB7XG4iCisgICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIG91dENvb3JkKTtcbiIKKyAgICAifVxuIjsKKworLy8gSGFyZC1jb2RlZCBhcnJheXMgb2YgdmVydGV4IGluZm9ybWF0aW9uLgorc3RydWN0IFZlcnRleCB7CisgICAgZmxvYXQgcG9zWzNdOworICAgIGZsb2F0IGNvb3JkWzJdOworfTsKKworY29uc3QgVmVydGV4IGtWZXJ0aWNlc1tdID0geworICAgIHt7ICsxLCAtMSwgKzAgfSwgeyArMSwgKzEgfX0sCisgICAge3sgKzEsICsxLCArMCB9LCB7ICsxLCArMCB9fSwKKyAgICB7eyAtMSwgKzEsICswIH0sIHsgKzAsICswIH19LAorICAgIHt7IC0xLCAtMSwgKzAgfSwgeyArMCwgKzEgfX0sCisKKyAgICB7eyArMSwgLTEsICswIH0sIHsgKzEsICswIH19LAorICAgIHt7ICsxLCArMSwgKzAgfSwgeyArMCwgKzAgfX0sCisgICAge3sgLTEsICsxLCArMCB9LCB7ICswLCArMSB9fSwKKyAgICB7eyAtMSwgLTEsICswIH0sIHsgKzEsICsxIH19LAorCisgICAge3sgKzEsIC0xLCArMCB9LCB7ICswLCArMCB9fSwKKyAgICB7eyArMSwgKzEsICswIH0sIHsgKzAsICsxIH19LAorICAgIHt7IC0xLCArMSwgKzAgfSwgeyArMSwgKzEgfX0sCisgICAge3sgLTEsIC0xLCArMCB9LCB7ICsxLCArMCB9fSwKKworICAgIHt7ICsxLCAtMSwgKzAgfSwgeyArMCwgKzEgfX0sCisgICAge3sgKzEsICsxLCArMCB9LCB7ICsxLCArMSB9fSwKKyAgICB7eyAtMSwgKzEsICswIH0sIHsgKzEsICswIH19LAorICAgIHt7IC0xLCAtMSwgKzAgfSwgeyArMCwgKzAgfX0sCit9OworCisvLyBWZXJ0ZXggaW5kaWNlcyBmb3IgcHJlZGVmaW5lZCByb3RhdGlvbiBhbmdsZXMuCitjb25zdCBHTHVieXRlIGtJbmRpY2VzW10gPSB7CisgICAgMCwgMSwgMiwgMiwgMywgMCwgICAgICAvLyAwCisgICAgNCwgNSwgNiwgNiwgNywgNCwgICAgICAvLyA5MAorICAgIDgsIDksIDEwLCAxMCwgMTEsIDgsICAgLy8gMTgwCisgICAgMTIsIDEzLCAxNCwgMTQsIDE1LCAxMiAvLyAyNzAKK307CisKK2NvbnN0IEdMaW50IGtJbmRpY2VzTGVuID0gc2l6ZW9mKGtJbmRpY2VzKSAvIHNpemVvZihrSW5kaWNlc1swXSk7Citjb25zdCBHTGludCBrSW5kaWNlc1BlckRyYXcgPSA2OworCit9ICAvLyBuYW1lc3BhY2UKKworVGV4dHVyZURyYXc6OlRleHR1cmVEcmF3KCkgOgorICAgICAgICBtVmVydGV4U2hhZGVyKDApLAorICAgICAgICBtRnJhZ21lbnRTaGFkZXIoMCksCisgICAgICAgIG1Qcm9ncmFtKDApLAorICAgICAgICBtUG9zaXRpb25TbG90KC0xKSwKKyAgICAgICAgbUluQ29vcmRTbG90KC0xKSwKKyAgICAgICAgbVRleHR1cmVTbG90KC0xKSwKKyAgICAgICAgbVRyYW5zbGF0aW9uU2xvdCgtMSkgeworICAgIC8vIENyZWF0ZSBzaGFkZXJzIGFuZCBwcm9ncmFtLgorICAgIG1WZXJ0ZXhTaGFkZXIgPSBjcmVhdGVTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwga1ZlcnRleFNoYWRlclNvdXJjZSk7CisgICAgbUZyYWdtZW50U2hhZGVyID0gY3JlYXRlU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwga0ZyYWdtZW50U2hhZGVyU291cmNlKTsKKworICAgIG1Qcm9ncmFtID0gc19nbGVzMi5nbENyZWF0ZVByb2dyYW0oKTsKKyAgICBzX2dsZXMyLmdsQXR0YWNoU2hhZGVyKG1Qcm9ncmFtLCBtVmVydGV4U2hhZGVyKTsKKyAgICBzX2dsZXMyLmdsQXR0YWNoU2hhZGVyKG1Qcm9ncmFtLCBtRnJhZ21lbnRTaGFkZXIpOworCisgICAgR0xpbnQgc3VjY2VzczsKKyAgICBzX2dsZXMyLmdsTGlua1Byb2dyYW0obVByb2dyYW0pOworICAgIHNfZ2xlczIuZ2xHZXRQcm9ncmFtaXYobVByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmc3VjY2Vzcyk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gR0xfRkFMU0UpIHsKKyAgICAgICAgR0xjaGFyIG1lc3NhZ2VzWzI1Nl07CisgICAgICAgIHNfZ2xlczIuZ2xHZXRQcm9ncmFtSW5mb0xvZygKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbSwgc2l6ZW9mKG1lc3NhZ2VzKSwgMCwgJm1lc3NhZ2VzWzBdKTsKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IGNyZWF0ZS9saW5rIHByb2dyYW06ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG1lc3NhZ2VzKTsKKyAgICAgICAgc19nbGVzMi5nbERlbGV0ZVByb2dyYW0obVByb2dyYW0pOworICAgICAgICBtUHJvZ3JhbSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzX2dsZXMyLmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7CisKKyAgICAvLyBSZXRyaWV2ZSBhdHRyaWJ1dGUvdW5pZm9ybSBsb2NhdGlvbnMuCisgICAgbVBvc2l0aW9uU2xvdCA9IHNfZ2xlczIuZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgInBvc2l0aW9uIik7CisgICAgc19nbGVzMi5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1Qb3NpdGlvblNsb3QpOworCisgICAgbUluQ29vcmRTbG90ID0gc19nbGVzMi5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiaW5Db29yZCIpOworICAgIHNfZ2xlczIuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtSW5Db29yZFNsb3QpOworCisgICAgbVRyYW5zbGF0aW9uU2xvdCA9IHNfZ2xlczIuZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ0cmFuc2xhdGlvbiIpOworICAgIG1UZXh0dXJlU2xvdCA9IHNfZ2xlczIuZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ0ZXh0dXJlIik7CisKKyNpZiAwCisgICAgcHJpbnRmKCJTTE9UUyBwb3NpdGlvbj0lZCBpbkNvb3JkPSVkIHRleHR1cmU9JWQgdHJhbnNsYXRpb249JWRcbiIsCisgICAgICAgICAgbVBvc2l0aW9uU2xvdCwgbUluQ29vcmRTbG90LCBtVGV4dHVyZVNsb3QsIG1UcmFuc2xhdGlvblNsb3QpOworI2VuZGlmCisKKyAgICAvLyBDcmVhdGUgdmVydGV4IGFuZCBpbmRleCBidWZmZXJzLgorICAgIHNfZ2xlczIuZ2xHZW5CdWZmZXJzKDEsICZtVmVydGV4QnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXIpOworICAgIHNfZ2xlczIuZ2xCdWZmZXJEYXRhKAorICAgICAgICAgICAgR0xfQVJSQVlfQlVGRkVSLCBzaXplb2Yoa1ZlcnRpY2VzKSwga1ZlcnRpY2VzLCBHTF9TVEFUSUNfRFJBVyk7CisKKyAgICBzX2dsZXMyLmdsR2VuQnVmZmVycygxLCAmbUluZGV4QnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbUluZGV4QnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsQnVmZmVyRGF0YShHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa0luZGljZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1NUQVRJQ19EUkFXKTsKK30KKworYm9vbCBUZXh0dXJlRHJhdzo6ZHJhdyhHTHVpbnQgdGV4dHVyZSwgZmxvYXQgcm90YXRpb24sIGZsb2F0IGR4LCBmbG9hdCBkeSkgeworICAgIGlmICghbVByb2dyYW0pIHsKKyAgICAgICAgRVJSKCIlczogbm8gcHJvZ3JhbVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRPRE8oZGlnaXQpOiBTYXZlIHByZXZpb3VzIHByb2dyYW0gc3RhdGUuCisKKyAgICBzX2dsZXMyLmdsVXNlUHJvZ3JhbShtUHJvZ3JhbSk7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgR0xlbnVtIGVyciA9IHNfZ2xlczIuZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnIgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IHVzZSBwcm9ncmFtIGVycm9yPTB4JXhcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBTZXR1cCB0aGUgfHBvc2l0aW9ufCBhdHRyaWJ1dGUgdmFsdWVzLgorICAgIHNfZ2xlczIuZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgbVZlcnRleEJ1ZmZlcik7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJyID0gc19nbGVzMi5nbEdldEVycm9yKCk7CisgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBFUlIoIiVzOiBDb3VsZCBub3QgYmluZCBHTF9BUlJBWV9CVUZGRVIgZXJyb3I9MHgleFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyKTsKKyAgICB9CisjZW5kaWYKKworICAgIHNfZ2xlczIuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShtUG9zaXRpb25TbG90KTsKKyAgICBzX2dsZXMyLmdsVmVydGV4QXR0cmliUG9pbnRlcihtUG9zaXRpb25TbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZlcnRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJyID0gc19nbGVzMi5nbEdldEVycm9yKCk7CisgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBFUlIoIiVzOiBDb3VsZCBnbFZlcnRleEF0dHJpYlBvaW50ZXIgd2l0aCBtUG9zaXRpb25TbG90IGVycm9yPTB4JXhcbiIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBTZXR1cCB0aGUgfGluQ29vcmR8IGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAgc19nbGVzMi5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1JbkNvb3JkU2xvdCk7CisgICAgc19nbGVzMi5nbFZlcnRleEF0dHJpYlBvaW50ZXIobUluQ29vcmRTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkxPQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZlcnRleCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxHTHZvaWQqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIDMpKSk7CisKKyAgICAvLyBzZXR1cCB0aGUgfHRleHR1cmV8IHVuaWZvcm0gdmFsdWUuCisgICAgc19nbGVzMi5nbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOworICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBzX2dsZXMyLmdsVW5pZm9ybTFpKG1UZXh0dXJlU2xvdCwgMCk7CisKKyAgICAvLyBzZXR1cCB0aGUgfHRyYW5zbGF0aW9ufCB1bmlmb3JtIHZhbHVlLgorICAgIHNfZ2xlczIuZ2xVbmlmb3JtMmYobVRyYW5zbGF0aW9uU2xvdCwgZHgsIGR5KTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBWYWxpZGF0ZSBwcm9ncmFtLCBqdXN0IHRvIGJlIHN1cmUuCisgICAgc19nbGVzMi5nbFZhbGlkYXRlUHJvZ3JhbShtUHJvZ3JhbSk7CisgICAgR0xpbnQgdmFsaWRTdGF0ZSA9IDA7CisgICAgc19nbGVzMi5nbEdldFByb2dyYW1pdihtUHJvZ3JhbSwgR0xfVkFMSURBVEVfU1RBVFVTLCAmdmFsaWRTdGF0ZSk7CisgICAgaWYgKHZhbGlkU3RhdGUgPT0gR0xfRkFMU0UpIHsKKyAgICAgICAgR0xjaGFyIG1lc3NhZ2VzWzI1Nl07CisgICAgICAgIHNfZ2xlczIuZ2xHZXRQcm9ncmFtSW5mb0xvZygKKyAgICAgICAgICAgICAgICBtUHJvZ3JhbSwgc2l6ZW9mKG1lc3NhZ2VzKSwgMCwgJm1lc3NhZ2VzWzBdKTsKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IHJ1biBwcm9ncmFtOiAlc1xuIiwgX19GVU5DVElPTl9fLCBtZXNzYWdlcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIERvIHRoZSByZW5kZXJpbmcuCisgICAgc19nbGVzMi5nbEJpbmRCdWZmZXIoR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1JbmRleEJ1ZmZlcik7CisjaWZuZGVmIE5ERUJVRworICAgIGVyciA9IHNfZ2xlczIuZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnIgIT0gR0xfTk9fRVJST1IpIHsKKyAgICAgICAgRVJSKCIlczogQ291bGQgbm90IGdsQmluZEJ1ZmZlcihHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikgZXJyb3I9MHgleFxuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIFdlIG1heSBvbmx5IGdldCAwLCA5MCwgMTgwLCAyNzAgaW4gfHJvdGF0aW9ufCBzbyBmYXIuCisgICAgY29uc3QgaW50IGludFJvdGF0aW9uID0gKChpbnQpcm90YXRpb24pLzkwOworICAgIGFzc2VydChpbnRSb3RhdGlvbiA+PSAwICYmIGludFJvdGF0aW9uIDw9IDMpOworICAgIGNvbnN0IGludHB0cl90IGluZGV4U2hpZnQgPSBpbnRSb3RhdGlvbiAqIGtJbmRpY2VzUGVyRHJhdzsKKworICAgIHNfZ2xlczIuZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBrSW5kaWNlc1BlckRyYXcsIEdMX1VOU0lHTkVEX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgR0x2b2lkKilpbmRleFNoaWZ0KTsKKyNpZm5kZWYgTkRFQlVHCisgICAgZXJyID0gc19nbGVzMi5nbEdldEVycm9yKCk7CisgICAgaWYgKGVyciAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBFUlIoIiVzOiBDb3VsZCBub3QgZ2xEcmF3RWxlbWVudHMoKSBlcnJvcj0weCV4XG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlcnIpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gVE9ETyhkaWdpdCk6IFJlc3RvcmUgcHJldmlvdXMgcHJvZ3JhbSBzdGF0ZS4KKworICAgIHJldHVybiB0cnVlOworfQorCitUZXh0dXJlRHJhdzo6flRleHR1cmVEcmF3KCkgeworICAgIHNfZ2xlczIuZ2xEZWxldGVCdWZmZXJzKDEsICZtSW5kZXhCdWZmZXIpOworICAgIHNfZ2xlczIuZ2xEZWxldGVCdWZmZXJzKDEsICZtVmVydGV4QnVmZmVyKTsKKworICAgIGlmIChtRnJhZ21lbnRTaGFkZXIpIHsKKyAgICAgICAgc19nbGVzMi5nbERlbGV0ZVNoYWRlcihtRnJhZ21lbnRTaGFkZXIpOworICAgIH0KKyAgICBpZiAobVZlcnRleFNoYWRlcikgeworICAgICAgICBzX2dsZXMyLmdsRGVsZXRlU2hhZGVyKG1WZXJ0ZXhTaGFkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1RleHR1cmVEcmF3LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9UZXh0dXJlRHJhdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzA2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9UZXh0dXJlRHJhdy5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBURVhUVVJFX0RSQVdfSAorI2RlZmluZSBURVhUVVJFX0RSQVdfSAorCisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisvLyBIZWxwZXIgY2xhc3MgdXNlZCB0byBkcmF3IGEgc2ltcGxlIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgZnJhbWVidWZmZXIuCisvLyBVc2FnZSBpcyBwcmV0dHkgc2ltcGxlOgorLy8KKy8vICAgMSkgQ3JlYXRlIGEgVGV4dHVyZURyYXcgaW5zdGFuY2UuCisvLworLy8gICAyKSBFYWNoIHRpbWUgeW91IHdhbnQgdG8gZHJhdyBhIHRleHR1cmUsIGNhbGwgZHJhdyh0ZXh0dXJlLCByb3RhdGlvbiksCisvLyAgICAgIHdoZXJlIHx0ZXh0dXJlfCBpcyB0aGUgbmFtZSBvZiBhIEdMRVMgMi54IHRleHR1cmUgb2JqZWN0LCBhbmQKKy8vICAgICAgfHJvdGF0aW9ufCBpcyBhbiBhbmdsZSBpbiBkZWdyZWVzIGRlc2NyaWJpbmcgdGhlIGNsb2Nrd2lzZSByb3RhdGlvbgorLy8gICAgICBpbiB0aGUgR0wgeS11cHdhcmRzIGNvb3JkaW5hdGUgc3BhY2UuIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIHdob2xlCisvLyAgICAgIGZyYW1lYnVmZmVyIHdpdGggdGV4dHVyZSBjb250ZW50LgorLy8KK2NsYXNzIFRleHR1cmVEcmF3IHsKK3B1YmxpYzoKKyAgICBUZXh0dXJlRHJhdygpOworICAgIH5UZXh0dXJlRHJhdygpOworCisgICAgLy8gRmlsbCB0aGUgY3VycmVudCBmcmFtZWJ1ZmZlciB3aXRoIHRoZSBjb250ZW50IG9mIHx0ZXh0dXJlfCwgd2hpY2ggbXVzdAorICAgIC8vIGJlIHRoZSBuYW1lIG9mIGEgR0xFUyAyLnggdGV4dHVyZSBvYmplY3QuIHxyb3RhdGlvbkRlZ3JlZXN8IGlzIGEKKyAgICAvLyBjbG9ja3dpc2Ugcm90YXRpb24gYW5nbGUgaW4gZGVncmVlcyAoY2xvY2t3aXNlIGluIHRoZSBHTCBZLXVwd2FyZHMKKyAgICAvLyBjb29yZGluYXRlIHNwYWNlOyBvbmx5IHN1cHBvcnRlZCB2YWx1ZXMgYXJlIDAsIDkwLCAxODAsIDI3MCkuIHxkeCxkeXwgaXMKKyAgICAvLyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIGltYWdlIHRvd2FyZHMgdGhlIG9yaWdpbi4KKyAgICBib29sIGRyYXcoR0x1aW50IHRleHR1cmUsIGZsb2F0IHJvdGF0aW9uRGVncmVlcywgZmxvYXQgZHgsIGZsb2F0IGR5KTsKKworcHJpdmF0ZToKKyAgICBHTHVpbnQgbVZlcnRleFNoYWRlcjsKKyAgICBHTHVpbnQgbUZyYWdtZW50U2hhZGVyOworICAgIEdMdWludCBtUHJvZ3JhbTsKKyAgICBHTGludCBtUG9zaXRpb25TbG90OworICAgIEdMaW50IG1JbkNvb3JkU2xvdDsKKyAgICBHTGludCBtVGV4dHVyZVNsb3Q7CisgICAgR0xpbnQgbVRyYW5zbGF0aW9uU2xvdDsKKyAgICBHTHVpbnQgbVZlcnRleEJ1ZmZlcjsKKyAgICBHTHVpbnQgbUluZGV4QnVmZmVyOworfTsKKworI2VuZGlmICAvLyBURVhUVVJFX0RSQVdfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvVGV4dHVyZVJlc2l6ZS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9UZXh0dXJlUmVzaXplLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNhZDhjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvVGV4dHVyZVJlc2l6ZS5jcHAKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJUZXh0dXJlUmVzaXplLmgiCisKKyNpbmNsdWRlICJEaXNwYXRjaFRhYmxlcy5oIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjaW5jbHVkZSAiR0xFUzIvZ2wyZXh0LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNkZWZpbmUgRVJSKC4uLikgIGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgViguLi4pICBWRVJCT1NFX1BSSU5UKGdsZXMsX19WQV9BUkdTX18pCisjZGVmaW5lIE1BWF9GQUNUT1JfUE9XRVIgNAorCitzdGF0aWMgY29uc3QgY2hhciBrQ29tbW9uU2hhZGVyU291cmNlW10gPQorICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZVVjAwLCB2VVYwMTtcbiIKKyAgICAiI2lmIEZBQ1RPUiA+IDJcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZVVjAyLCB2VVYwMztcbiIKKyAgICAiI2lmIEZBQ1RPUiA+IDRcbiIKKyAgICAidmFyeWluZyB2ZWMyIHZVVjA0LCB2VVYwNSwgdlVWMDYsIHZVVjA3O1xuIgorICAgICIjaWYgRkFDVE9SID4gOFxuIgorICAgICJ2YXJ5aW5nIHZlYzIgdlVWMDgsIHZVVjA5LCB2VVYxMCwgdlVWMTEsIHZVVjEyLCB2VVYxMywgdlVWMTQsIHZVVjE1O1xuIgorICAgICIjZW5kaWZcbiIKKyAgICAiI2VuZGlmXG4iCisgICAgIiNlbmRpZlxuIjsKKworc3RhdGljIGNvbnN0IGNoYXIga1ZlcnRleFNoYWRlclNvdXJjZVtdID0KKyAgICAiYXR0cmlidXRlIHZlYzIgYVBvc2l0aW9uO1xuIgorCisgICAgInZvaWQgbWFpbigpIHtcbiIKKyAgICAiICBnbF9Qb3NpdGlvbiA9IHZlYzQoYVBvc2l0aW9uLCAwLCAxKTtcbiIKKyAgICAiICB2ZWMyIHV2ID0gKChhUG9zaXRpb24gKyAxLjApIC8gMi4wKSArIDAuNSAvIGtEaW1lbnNpb247XG4iCisgICAgIiAgdlVWMDAgPSB1djtcbiIKKyAgICAiICAjaWZkZWYgSE9SSVpPTlRBTFxuIgorICAgICIgIHZVVjAxID0gdXYgKyB2ZWMyKCAxLjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgICNpZiBGQUNUT1IgPiAyXG4iCisgICAgIiAgdlVWMDIgPSB1diArIHZlYzIoIDIuMCAvIGtEaW1lbnNpb24ueCwgMCk7XG4iCisgICAgIiAgdlVWMDMgPSB1diArIHZlYzIoIDMuMCAvIGtEaW1lbnNpb24ueCwgMCk7XG4iCisgICAgIiAgI2lmIEZBQ1RPUiA+IDRcbiIKKyAgICAiICB2VVYwNCA9IHV2ICsgdmVjMiggNC4wIC8ga0RpbWVuc2lvbi54LCAwKTtcbiIKKyAgICAiICB2VVYwNSA9IHV2ICsgdmVjMiggNS4wIC8ga0RpbWVuc2lvbi54LCAwKTtcbiIKKyAgICAiICB2VVYwNiA9IHV2ICsgdmVjMiggNi4wIC8ga0RpbWVuc2lvbi54LCAwKTtcbiIKKyAgICAiICB2VVYwNyA9IHV2ICsgdmVjMiggNy4wIC8ga0RpbWVuc2lvbi54LCAwKTtcbiIKKyAgICAiICAjaWYgRkFDVE9SID4gOFxuIgorICAgICIgIHZVVjA4ID0gdXYgKyB2ZWMyKCA4LjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjA5ID0gdXYgKyB2ZWMyKCA5LjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjEwID0gdXYgKyB2ZWMyKDEwLjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjExID0gdXYgKyB2ZWMyKDExLjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjEyID0gdXYgKyB2ZWMyKDEyLjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjEzID0gdXYgKyB2ZWMyKDEzLjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjE0ID0gdXYgKyB2ZWMyKDE0LjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgIHZVVjE1ID0gdXYgKyB2ZWMyKDE1LjAgLyBrRGltZW5zaW9uLngsIDApO1xuIgorICAgICIgICNlbmRpZlxuIiAgLy8gRkFDVE9SID4gOAorICAgICIgICNlbmRpZlxuIiAgLy8gRkFDVE9SID4gNAorICAgICIgICNlbmRpZlxuIiAgLy8gRkFDVE9SID4gMgorCisgICAgIiAgI2Vsc2VcbiIKKyAgICAiICB2VVYwMSA9IHV2ICsgdmVjMigwLCAgMS4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICAjaWYgRkFDVE9SID4gMlxuIgorICAgICIgIHZVVjAyID0gdXYgKyB2ZWMyKDAsICAyLjAgLyBrRGltZW5zaW9uLnkpO1xuIgorICAgICIgIHZVVjAzID0gdXYgKyB2ZWMyKDAsICAzLjAgLyBrRGltZW5zaW9uLnkpO1xuIgorICAgICIgICNpZiBGQUNUT1IgPiA0XG4iCisgICAgIiAgdlVWMDQgPSB1diArIHZlYzIoMCwgIDQuMCAvIGtEaW1lbnNpb24ueSk7XG4iCisgICAgIiAgdlVWMDUgPSB1diArIHZlYzIoMCwgIDUuMCAvIGtEaW1lbnNpb24ueSk7XG4iCisgICAgIiAgdlVWMDYgPSB1diArIHZlYzIoMCwgIDYuMCAvIGtEaW1lbnNpb24ueSk7XG4iCisgICAgIiAgdlVWMDcgPSB1diArIHZlYzIoMCwgIDcuMCAvIGtEaW1lbnNpb24ueSk7XG4iCisgICAgIiAgI2lmIEZBQ1RPUiA+IDhcbiIKKyAgICAiICB2VVYwOCA9IHV2ICsgdmVjMigwLCAgOC4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYwOSA9IHV2ICsgdmVjMigwLCAgOS4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxMCA9IHV2ICsgdmVjMigwLCAxMC4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxMSA9IHV2ICsgdmVjMigwLCAxMS4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxMiA9IHV2ICsgdmVjMigwLCAxMi4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxMyA9IHV2ICsgdmVjMigwLCAxMy4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxNCA9IHV2ICsgdmVjMigwLCAxNC4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICB2VVYxNSA9IHV2ICsgdmVjMigwLCAxNS4wIC8ga0RpbWVuc2lvbi55KTtcbiIKKyAgICAiICAjZW5kaWZcbiIgIC8vIEZBQ1RPUiA+IDgKKyAgICAiICAjZW5kaWZcbiIgIC8vIEZBQ1RPUiA+IDQKKyAgICAiICAjZW5kaWZcbiIgIC8vIEZBQ1RPUiA+IDIKKyAgICAiICAjZW5kaWZcbiIgIC8vIEhPUklaT05UQUwvVkVSVElDQUwKKyAgICAifVxuIjsKKworY29uc3QgY2hhciBrRnJhZ21lbnRTaGFkZXJTb3VyY2VbXSA9CisgICAgInVuaWZvcm0gc2FtcGxlcjJEIHVUZXh0dXJlO1xuIgorCisgICAgInZlYzMgcmVhZCh2ZWMyIHV2KSB7XG4iCisgICAgIiAgdmVjMyByID0gdGV4dHVyZTJEKHVUZXh0dXJlLCB1dikucmdiO1xuIgorICAgICIgICNpZmRlZiBIT1JJWk9OVEFMXG4iCisgICAgIiAgci5yZ2IgPSBwb3coci5yZ2IsIHZlYzMoMi4yKSk7XG4iCisgICAgIiAgI2VuZGlmXG4iCisgICAgIiAgcmV0dXJuIHI7XG4iCisgICAgIn1cbiIKKworICAgICJ2b2lkIG1haW4oKSB7XG4iCisgICAgIiAgdmVjMyBzdW0gPSByZWFkKHZVVjAwKSArIHJlYWQodlVWMDEpO1xuIgorICAgICIgICNpZiBGQUNUT1IgPiAyXG4iCisgICAgIiAgc3VtICs9IHJlYWQodlVWMDIpICsgcmVhZCh2VVYwMyk7XG4iCisgICAgIiAgI2lmIEZBQ1RPUiA+IDRcbiIKKyAgICAiICBzdW0gKz0gcmVhZCh2VVYwNCkgKyByZWFkKHZVVjA1KSArIHJlYWQodlVWMDYpICsgcmVhZCh2VVYwNyk7XG4iCisgICAgIiAgI2lmIEZBQ1RPUiA+IDhcbiIKKyAgICAiICBzdW0gKz0gcmVhZCh2VVYwOCkgKyByZWFkKHZVVjA5KSArIHJlYWQodlVWMTApICsgcmVhZCh2VVYxMSkgKyIKKyAgICAiICAgICAgcmVhZCh2VVYxMikgKyByZWFkKHZVVjEzKSArIHJlYWQodlVWMTQpICsgcmVhZCh2VVYxNSk7XG4iCisgICAgIiAgI2VuZGlmXG4iCisgICAgIiAgI2VuZGlmXG4iCisgICAgIiAgI2VuZGlmXG4iCisgICAgIiAgc3VtIC89IGZsb2F0KEZBQ1RPUik7XG4iCisgICAgIiAgI2lmZGVmIFZFUlRJQ0FMXG4iCisgICAgIiAgc3VtLnJnYiA9IHBvdyhzdW0ucmdiLCB2ZWMzKDEuMCAvIDIuMikpO1xuIgorICAgICIgICNlbmRpZlxuIgorICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoc3VtLnJnYiwgMS4wKTtcbiIKKyAgICAifVxuIjsKKworc3RhdGljIGNvbnN0IGZsb2F0IGtWZXJ0ZXhEYXRhW10gPSB7LTEsIC0xLCAzLCAtMSwgLTEsIDN9OworCitzdGF0aWMgdm9pZCBkZXRhY2hTaGFkZXJzKEdMdWludCBwcm9ncmFtKSB7CisgICAgR0x1aW50IHNoYWRlcnNbMl0gPSB7fTsKKyAgICBHTHNpemVpIGNvdW50ID0gMDsKKyAgICBzX2dsZXMyLmdsR2V0QXR0YWNoZWRTaGFkZXJzKHByb2dyYW0sIDIsICZjb3VudCwgc2hhZGVycyk7CisgICAgaWYgKHNfZ2xlczIuZ2xHZXRFcnJvcigpID09IEdMX05PX0VSUk9SKSB7CisgICAgICAgIGZvciAoR0xzaXplaSBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHNfZ2xlczIuZ2xEZXRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyc1tpXSk7CisgICAgICAgICAgICBzX2dsZXMyLmdsRGVsZXRlU2hhZGVyKHNoYWRlcnNbaV0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgR0x1aW50IGNyZWF0ZVNoYWRlcihHTGVudW0gdHlwZSwgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IGNoYXIqPiBzb3VyY2UpIHsKKyAgICBHTGludCBzdWNjZXNzLCBpbmZvTGVuZ3RoOworCisgICAgR0x1aW50IHNoYWRlciA9IHNfZ2xlczIuZ2xDcmVhdGVTaGFkZXIodHlwZSk7CisgICAgaWYgKHNoYWRlcikgeworICAgICAgICBzX2dsZXMyLmdsU2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlLnNpemUoKSwgc291cmNlLmJlZ2luKCksIG51bGxwdHIpOworICAgICAgICBzX2dsZXMyLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOworICAgICAgICBzX2dsZXMyLmdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJnN1Y2Nlc3MpOworICAgICAgICBpZiAoc3VjY2VzcyA9PSBHTF9GQUxTRSkgeworICAgICAgICAgICAgc19nbGVzMi5nbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbmd0aCk7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmZvTG9nKGluZm9MZW5ndGggKyAxLCAnXDAnKTsKKyAgICAgICAgICAgIHNfZ2xlczIuZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbmd0aCwgbnVsbHB0ciwgJmluZm9Mb2dbMF0pOworICAgICAgICAgICAgRVJSKCIlcyBzaGFkZXIgY29tcGlsZSBmYWlsZWQ6XG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gR0xfVkVSVEVYX1NIQURFUikgPyAiVmVydGV4IiA6ICJGcmFnbWVudCIsCisgICAgICAgICAgICAgICAgICAgIGluZm9Mb2cuY19zdHIoKSk7CisgICAgICAgICAgICBzX2dsZXMyLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CisgICAgICAgICAgICBzaGFkZXIgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzaGFkZXI7Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaFNoYWRlcnMoVGV4dHVyZVJlc2l6ZTo6RnJhbWVidWZmZXIqIGZiLCBjb25zdCBjaGFyKiBmYWN0b3JEZWZpbmUsCisgICAgICAgIGNvbnN0IGNoYXIqIGRpbWVuc2lvbkRlZmluZSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0KSB7CisKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gZGltZW5zaW9uQ29uc3Q7CisgICAgZGltZW5zaW9uQ29uc3QgPDwgImNvbnN0IHZlYzIga0RpbWVuc2lvbiA9IHZlYzIoIiA8PCB3aWR0aCA8PCAiLCAiIDw8IGhlaWdodCA8PCAiKTtcbiI7CisKKyAgICBHTHVpbnQgdlNoYWRlciA9IGNyZWF0ZVNoYWRlcihHTF9WRVJURVhfU0hBREVSLCB7CisgICAgICAgICAgICBmYWN0b3JEZWZpbmUsIGRpbWVuc2lvbkRlZmluZSwKKyAgICAgICAgICAgIGtDb21tb25TaGFkZXJTb3VyY2UsIGRpbWVuc2lvbkNvbnN0LnN0cigpLmNfc3RyKCksIGtWZXJ0ZXhTaGFkZXJTb3VyY2UKKyAgICB9KTsKKyAgICBHTHVpbnQgZlNoYWRlciA9IGNyZWF0ZVNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHsKKyAgICAgICAgZmFjdG9yRGVmaW5lLCBkaW1lbnNpb25EZWZpbmUsIGtDb21tb25TaGFkZXJTb3VyY2UsIGtGcmFnbWVudFNoYWRlclNvdXJjZQorICAgIH0pOworCisgICAgaWYgKCF2U2hhZGVyIHx8ICFmU2hhZGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzX2dsZXMyLmdsQXR0YWNoU2hhZGVyKGZiLT5wcm9ncmFtLCB2U2hhZGVyKTsKKyAgICBzX2dsZXMyLmdsQXR0YWNoU2hhZGVyKGZiLT5wcm9ncmFtLCBmU2hhZGVyKTsKKyAgICBzX2dsZXMyLmdsTGlua1Byb2dyYW0oZmItPnByb2dyYW0pOworCisgICAgc19nbGVzMi5nbFVzZVByb2dyYW0oZmItPnByb2dyYW0pOworICAgIGZiLT5hUG9zaXRpb24gPSBzX2dsZXMyLmdsR2V0QXR0cmliTG9jYXRpb24oZmItPnByb2dyYW0sICJhUG9zaXRpb24iKTsKKyAgICBmYi0+dVRleHR1cmUgPSBzX2dsZXMyLmdsR2V0VW5pZm9ybUxvY2F0aW9uKGZiLT5wcm9ncmFtLCAidVRleHR1cmUiKTsKK30KKworVGV4dHVyZVJlc2l6ZTo6VGV4dHVyZVJlc2l6ZShHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpIDoKKyAgICAgICAgbVdpZHRoKHdpZHRoKSwKKyAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICBtRmFjdG9yKDEpLAorICAgICAgICBtRkJXaWR0aCh7MCx9KSwKKyAgICAgICAgbUZCSGVpZ2h0KHswLH0pIHsKKyAgICAvLyBTd2lmdFNoYWRlciBzdHJpY3RseSBmb2xsb3dzIHRoZSBHTEVTdjIgc3BlYyBhbmQgZG9lc24ndCBhbGxvdyByZW5kZXJpbmcKKyAgICAvLyBpbnRvIGZ1bGwgR0xfRkxPQVQgdGV4dHVyZXMuIExldCdzIGRldGVjdCBpdCBhbmQgcmVkdWNlIHRoZSBwcmVjaXNpb24KKyAgICAvLyBvbiBkZW1hbmQuIEJUVywgR0xfSEFMRl9GTE9BVCBpcyBhbHNvIG9ubHkgcHJlc2VudCBpbiBHTEVTdjMsIHNvIHVzZSB0aGUKKyAgICAvLyBleHRlbnNpb24gaW5zdGVhZC4KKyAgICBjb25zdCBjaGFyKiB2ZW5kb3IsICpyZW5kZXJlciwgKnZlcnNpb247CisgICAgRnJhbWVCdWZmZXI6OmdldEZCKCktPmdldEdMU3RyaW5ncygmdmVuZG9yLCAmcmVuZGVyZXIsICZ2ZXJzaW9uKTsKKyAgICBpZiAocmVuZGVyZXIgJiYgc3Ryc3RyKHJlbmRlcmVyLCAiU3dpZnRTaGFkZXIiKSkgeworICAgICAgICBtVGV4dHVyZURhdGFUeXBlID0gR0xfSEFMRl9GTE9BVF9PRVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRleHR1cmVEYXRhVHlwZSA9IEdMX0ZMT0FUOworICAgIH0KKworICAgIHNfZ2xlczIuZ2xHZW5UZXh0dXJlcygxLCAmbUZCV2lkdGgudGV4dHVyZSk7CisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GQldpZHRoLnRleHR1cmUpOworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworCisgICAgc19nbGVzMi5nbEdlblRleHR1cmVzKDEsICZtRkJIZWlnaHQudGV4dHVyZSk7CisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GQkhlaWdodC50ZXh0dXJlKTsKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfQ0xBTVBfVE9fRURHRSk7CisKKyAgICBzX2dsZXMyLmdsR2VuRnJhbWVidWZmZXJzKDEsICZtRkJXaWR0aC5mcmFtZWJ1ZmZlcik7CisgICAgc19nbGVzMi5nbEdlbkZyYW1lYnVmZmVycygxLCAmbUZCSGVpZ2h0LmZyYW1lYnVmZmVyKTsKKworICAgIG1GQldpZHRoLnByb2dyYW0gPSBzX2dsZXMyLmdsQ3JlYXRlUHJvZ3JhbSgpOworICAgIG1GQkhlaWdodC5wcm9ncmFtID0gc19nbGVzMi5nbENyZWF0ZVByb2dyYW0oKTsKKworICAgIHNfZ2xlczIuZ2xHZW5CdWZmZXJzKDEsICZtVmVydGV4QnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXIpOworICAgIHNfZ2xlczIuZ2xCdWZmZXJEYXRhKEdMX0FSUkFZX0JVRkZFUiwgc2l6ZW9mKGtWZXJ0ZXhEYXRhKSwga1ZlcnRleERhdGEsIEdMX1NUQVRJQ19EUkFXKTsKK30KKworVGV4dHVyZVJlc2l6ZTo6flRleHR1cmVSZXNpemUoKSB7CisgICAgR0x1aW50IGZiWzJdID0ge21GQldpZHRoLmZyYW1lYnVmZmVyLCBtRkJIZWlnaHQuZnJhbWVidWZmZXJ9OworICAgIHNfZ2xlczIuZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoMiwgZmIpOworCisgICAgR0x1aW50IHRleFsyXSA9IHttRkJXaWR0aC50ZXh0dXJlLCBtRkJIZWlnaHQudGV4dHVyZX07CisgICAgc19nbGVzMi5nbERlbGV0ZVRleHR1cmVzKDIsIHRleCk7CisKKyAgICBkZXRhY2hTaGFkZXJzKG1GQldpZHRoLnByb2dyYW0pOworICAgIGRldGFjaFNoYWRlcnMobUZCSGVpZ2h0LnByb2dyYW0pOworCisgICAgc19nbGVzMi5nbERlbGV0ZVByb2dyYW0obUZCV2lkdGgucHJvZ3JhbSk7CisgICAgc19nbGVzMi5nbERlbGV0ZVByb2dyYW0obUZCSGVpZ2h0LnByb2dyYW0pOworCisgICAgc19nbGVzMi5nbERlbGV0ZUJ1ZmZlcnMoMSwgJm1WZXJ0ZXhCdWZmZXIpOworfQorCitHTHVpbnQgVGV4dHVyZVJlc2l6ZTo6dXBkYXRlKEdMdWludCB0ZXh0dXJlKSB7CisgICAgLy8gU3RvcmUgdGhlIHZpZXdwb3J0LiBUaGUgdmlld3BvcnQgaXMgY2xvYmJlcmVkIGR1ZSB0byB0aGUgZnJhbWVidWZmZXJzLgorICAgIEdMaW50IHZwb3J0WzRdID0geyAwLCB9OworICAgIHNfZ2xlczIuZ2xHZXRJbnRlZ2VydihHTF9WSUVXUE9SVCwgdnBvcnQpOworCisgICAgLy8gQ29ycmVjdGx5IGRlYWwgd2l0aCByb3RhdGVkIHNjcmVlbnMuCisgICAgR0xpbnQgdFdpZHRoID0gdnBvcnRbMl0sIHRIZWlnaHQgPSB2cG9ydFszXTsKKyAgICBpZiAoKG1XaWR0aCA8IG1IZWlnaHQpICE9ICh0V2lkdGggPCB0SGVpZ2h0KSkgeworICAgICAgICBzdGQ6OnN3YXAodFdpZHRoLCB0SGVpZ2h0KTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSBzY2FsaW5nIGZhY3RvciBuZWVkZWQgdG8gZ2V0IGFuIGltYWdlIGp1c3QgbGFyZ2VyIHRoYW4gdGhlIHRhcmdldCB2aWV3cG9ydC4KKyAgICB1bnNpZ25lZCBpbnQgZmFjdG9yID0gMTsKKyAgICBmb3IgKGludCBpID0gMCwgdyA9IG1XaWR0aCAvIDIsIGggPSBtSGVpZ2h0IC8gMjsKKyAgICAgICAgaSA8IE1BWF9GQUNUT1JfUE9XRVIgJiYgdyA+PSB0V2lkdGggJiYgaCA+PSB0SGVpZ2h0OworICAgICAgICBpKyssIHcgLz0gMiwgaCAvPSAyLCBmYWN0b3IgKj0gMikgeworICAgIH0KKworICAgIC8vIE5vIHJlc2l6aW5nIG5lZWRlZC4KKyAgICBpZiAoZmFjdG9yID09IDEpIHsKKyAgICAgICAgcmV0dXJuIHRleHR1cmU7CisgICAgfQorCisgICAgc19nbGVzMi5nbEdldEVycm9yKCk7IC8vIENsZWFyIGFueSBHTCBlcnJvcnMuCisgICAgc2V0dXBGcmFtZWJ1ZmZlcnMoZmFjdG9yKTsKKyAgICByZXNpemUodGV4dHVyZSk7CisgICAgc19nbGVzMi5nbFZpZXdwb3J0KHZwb3J0WzBdLCB2cG9ydFsxXSwgdnBvcnRbMl0sIHZwb3J0WzNdKTsgLy8gUmVzdG9yZSB0aGUgdmlld3BvcnQuCisKKyAgICAvLyBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmVzaXppbmcsIGp1c3QgdXNlIHRoZSB1bnNjYWxlZCB0ZXh0dXJlLgorICAgIEdMZW51bSBlcnJvciA9IHNfZ2xlczIuZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnJvciAhPSBHTF9OT19FUlJPUikgeworICAgICAgICBWKCJHTCBlcnJvciB3aGlsZSByZXNpemluZzogMHgleCAoaWdub3JlZClcbiIsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHRleHR1cmU7CisgICAgfQorCisgICAgcmV0dXJuIG1GQkhlaWdodC50ZXh0dXJlOworfQorCit2b2lkIFRleHR1cmVSZXNpemU6OnNldHVwRnJhbWVidWZmZXJzKHVuc2lnbmVkIGludCBmYWN0b3IpIHsKKyAgICBpZiAoZmFjdG9yID09IG1GYWN0b3IpIHsKKyAgICAgICAgLy8gVGhlIGZhY3RvciBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byB1cGRhdGUgdGhlIGZyYW1lYnVmZmVycy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgZnJhbWVidWZmZXIgc2l6ZXMgdG8gbWF0Y2ggdGhlIG5ldyBmYWN0b3IuCisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GQldpZHRoLnRleHR1cmUpOworICAgIHNfZ2xlczIuZ2xUZXhJbWFnZTJEKAorICAgICAgICBHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsIG1XaWR0aCAvIGZhY3RvciwgbUhlaWdodCwgMCwgR0xfUkdCLAorICAgICAgICAgICAgICAgIG1UZXh0dXJlRGF0YVR5cGUsIG51bGxwdHIpOworICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICBzX2dsZXMyLmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCBtRkJXaWR0aC5mcmFtZWJ1ZmZlcik7CisgICAgc19nbGVzMi5nbEZyYW1lYnVmZmVyVGV4dHVyZTJEKAorICAgICAgICBHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsIG1GQldpZHRoLnRleHR1cmUsIDApOworCisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GQkhlaWdodC50ZXh0dXJlKTsKKyAgICBzX2dsZXMyLmdsVGV4SW1hZ2UyRCgKKyAgICAgICAgR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCBtV2lkdGggLyBmYWN0b3IsIG1IZWlnaHQgLyBmYWN0b3IsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAgICBtVGV4dHVyZURhdGFUeXBlLCBudWxscHRyKTsKKyAgICBzX2dsZXMyLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgc19nbGVzMi5nbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgbUZCSGVpZ2h0LmZyYW1lYnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsRnJhbWVidWZmZXJUZXh0dXJlMkQoCisgICAgICAgIEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwgR0xfVEVYVFVSRV8yRCwgbUZCSGVpZ2h0LnRleHR1cmUsIDApOworCisgICAgLy8gVXBkYXRlIHRoZSBzaGFkZXJzIHRvIHRoZSBuZXcgZmFjdG9yLiBGaXJzdCBkZXRhY2ggdGhlIG9sZCBzaGFkZXJzLi4uCisgICAgZGV0YWNoU2hhZGVycyhtRkJXaWR0aC5wcm9ncmFtKTsKKyAgICBkZXRhY2hTaGFkZXJzKG1GQkhlaWdodC5wcm9ncmFtKTsKKworICAgIC8vIC4uLiB0aGVuIGF0dGFjaCB0aGUgbmV3IG9uZXMuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGZhY3RvckRlZmluZTsKKyAgICBmYWN0b3JEZWZpbmUgPDwgIiNkZWZpbmUgRkFDVE9SICIgPDwgZmFjdG9yIDw8ICdcbic7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmFjdG9yRGVmaW5lU3RyID0gZmFjdG9yRGVmaW5lLnN0cigpOworICAgIGF0dGFjaFNoYWRlcnMoJm1GQldpZHRoLCBmYWN0b3JEZWZpbmVTdHIuY19zdHIoKSwgIiNkZWZpbmUgSE9SSVpPTlRBTFxuIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBhdHRhY2hTaGFkZXJzKCZtRkJIZWlnaHQsIGZhY3RvckRlZmluZVN0ci5jX3N0cigpLCAiI2RlZmluZSBWRVJUSUNBTFxuIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgIG1GYWN0b3IgPSBmYWN0b3I7Cit9CisKK3ZvaWQgVGV4dHVyZVJlc2l6ZTo6cmVzaXplKEdMdWludCB0ZXh0dXJlKSB7CisgICAgc19nbGVzMi5nbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsQWN0aXZlVGV4dHVyZShHTF9URVhUVVJFMCk7CisKKyAgICAvLyBGaXJzdCBzY2FsZSB0aGUgaG9yaXpvbnRhbCBkaW1lbnNpb24gYnkgcmVuZGVyaW5nIHRoZSBpbnB1dCB0ZXh0dXJlIHRvIGEgc2NhbGVkIGZyYW1lYnVmZmVyLgorICAgIHNfZ2xlczIuZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GQldpZHRoLmZyYW1lYnVmZmVyKTsKKyAgICBzX2dsZXMyLmdsVmlld3BvcnQoMCwgMCwgbVdpZHRoIC8gbUZhY3RvciwgbUhlaWdodCk7CisgICAgc19nbGVzMi5nbFVzZVByb2dyYW0obUZCV2lkdGgucHJvZ3JhbSk7CisgICAgc19nbGVzMi5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1GQldpZHRoLmFQb3NpdGlvbik7CisgICAgc19nbGVzMi5nbFZlcnRleEF0dHJpYlBvaW50ZXIobUZCV2lkdGguYVBvc2l0aW9uLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIDApOworICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKKworICAgIC8vIFN0b3JlIHRoZSBjdXJyZW50IHRleHR1cmUgZmlsdGVycyBhbmQgc2V0IHRvIG5lYXJlc3QgZm9yIHNjYWxpbmcuCisgICAgR0xpbnQgbWFnX2ZpbHRlciwgbWluX2ZpbHRlcjsKKyAgICBzX2dsZXMyLmdsR2V0VGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCAmbWFnX2ZpbHRlcik7CisgICAgc19nbGVzMi5nbEdldFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgJm1pbl9maWx0ZXIpOworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgc19nbGVzMi5nbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICBzX2dsZXMyLmdsVW5pZm9ybTFpKG1GQldpZHRoLnVUZXh0dXJlLCAwKTsKKyAgICBzX2dsZXMyLmdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIHNpemVvZihrVmVydGV4RGF0YSkgLyAoMiAqIHNpemVvZihmbG9hdCkpKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIHByZXZpb3VzIHRleHR1cmUgZmlsdGVycy4KKyAgICBzX2dsZXMyLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIG1hZ19maWx0ZXIpOworICAgIHNfZ2xlczIuZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgbWluX2ZpbHRlcik7CisKKyAgICAvLyBTZWNvbmRseSwgc2NhbGUgdGhlIHZlcnRpY2FsIGRpbWVuc2lvbiB1c2luZyB0aGUgc2Vjb25kIGZyYW1lYnVmZmVyLgorICAgIHNfZ2xlczIuZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GQkhlaWdodC5mcmFtZWJ1ZmZlcik7CisgICAgc19nbGVzMi5nbFZpZXdwb3J0KDAsIDAsIG1XaWR0aCAvIG1GYWN0b3IsIG1IZWlnaHQgLyBtRmFjdG9yKTsKKyAgICBzX2dsZXMyLmdsVXNlUHJvZ3JhbShtRkJIZWlnaHQucHJvZ3JhbSk7CisgICAgc19nbGVzMi5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1GQkhlaWdodC5hUG9zaXRpb24pOworICAgIHNfZ2xlczIuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKG1GQkhlaWdodC5hUG9zaXRpb24sIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgMCk7CisgICAgc19nbGVzMi5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GQldpZHRoLnRleHR1cmUpOworICAgIHNfZ2xlczIuZ2xVbmlmb3JtMWkobUZCSGVpZ2h0LnVUZXh0dXJlLCAwKTsKKyAgICBzX2dsZXMyLmdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIHNpemVvZihrVmVydGV4RGF0YSkgLyAoMiAqIHNpemVvZihmbG9hdCkpKTsKKworICAgIC8vIENsZWFyIHRoZSBiaW5kaW5ncy4KKyAgICBzX2dsZXMyLmdsQmluZEJ1ZmZlcihHTF9BUlJBWV9CVUZGRVIsIDApOworICAgIHNfZ2xlczIuZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOworICAgIHNfZ2xlczIuZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1RleHR1cmVSZXNpemUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1RleHR1cmVSZXNpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmMwYTgyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvVGV4dHVyZVJlc2l6ZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9MSUJSRU5ERVJfVEVYVFVSRVJFU0laRV9ICisjZGVmaW5lIF9MSUJSRU5ERVJfVEVYVFVSRVJFU0laRV9ICisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworY2xhc3MgVGV4dHVyZVJlc2l6ZSB7CitwdWJsaWM6CisgICAgVGV4dHVyZVJlc2l6ZShHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQpOworICAgIH5UZXh0dXJlUmVzaXplKCk7CisKKyAgICAvLyBTY2FsZXMgdGhlIGdpdmVuIHRleHR1cmUgZm9yIHRoZSBjdXJyZW50IHZpZXdwb3J0IGFuZCByZXR1cm5zIHRoZSBzY2FsZWQKKyAgICAvLyB0ZXh0dXJlLiBNYXkgcmV0dXJuIHRoZSBpbnB1dCBpZiBubyBzY2FsaW5nIGlzIHJlcXVpcmVkLgorICAgIEdMdWludCB1cGRhdGUoR0x1aW50IHRleHR1cmUpOworCisgICAgc3RydWN0IEZyYW1lYnVmZmVyIHsKKyAgICAgICAgR0x1aW50IHRleHR1cmU7CisgICAgICAgIEdMdWludCBmcmFtZWJ1ZmZlcjsKKyAgICAgICAgR0x1aW50IHByb2dyYW07CisgICAgICAgIEdMdWludCBhUG9zaXRpb247CisgICAgICAgIEdMdWludCB1VGV4dHVyZTsKKyAgICB9OworCitwcml2YXRlOgorICAgIHZvaWQgc2V0dXBGcmFtZWJ1ZmZlcnModW5zaWduZWQgaW50IGZhY3Rvcik7CisgICAgdm9pZCByZXNpemUoR0x1aW50IHRleHR1cmUpOworCitwcml2YXRlOgorICAgIEdMdWludCBtV2lkdGg7CisgICAgR0x1aW50IG1IZWlnaHQ7CisgICAgdW5zaWduZWQgaW50IG1GYWN0b3I7CisgICAgRnJhbWVidWZmZXIgbUZCV2lkdGg7CisgICAgRnJhbWVidWZmZXIgbUZCSGVpZ2h0OworICAgIEdMdWludCBtVmVydGV4QnVmZmVyOworICAgIEdMZW51bSBtVGV4dHVyZURhdGFUeXBlOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9XaW5kb3dTdXJmYWNlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1dpbmRvd1N1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGUzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9XaW5kb3dTdXJmYWNlLmNwcApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJXaW5kb3dTdXJmYWNlLmgiCisKKyNpbmNsdWRlICJFcnJvckxvZy5oIgorI2luY2x1ZGUgIkZiQ29uZmlnLmgiCisKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0VHTERpc3BhdGNoLmgiCisKKyNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKK1dpbmRvd1N1cmZhY2U6OldpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnKSA6CisgICAgICAgIG1Db25maWcoY29uZmlnKSwKKyAgICAgICAgbURpc3BsYXkoZGlzcGxheSkge30KKworV2luZG93U3VyZmFjZTo6fldpbmRvd1N1cmZhY2UoKSB7CisgICAgaWYgKG1TdXJmYWNlKSB7CisgICAgICAgIHNfZWdsLmVnbERlc3Ryb3lTdXJmYWNlKG1EaXNwbGF5LCBtU3VyZmFjZSk7CisgICAgfQorfQorCitXaW5kb3dTdXJmYWNlICpXaW5kb3dTdXJmYWNlOjpjcmVhdGUoRUdMRGlzcGxheSBkaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBfaGVpZ2h0KSB7CisgICAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBXaW5kb3dTdXJmYWNlIG9iamVjdAorICAgIFdpbmRvd1N1cmZhY2UgKndpbiA9IG5ldyBXaW5kb3dTdXJmYWNlKGRpc3BsYXksIGNvbmZpZyk7CisgICAgaWYgKCF3aW4pIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcGJ1ZmZlciB0byBiZSB1c2VkIGFzIHRoZSBlZ2wgc3VyZmFjZQorICAgIC8vIGZvciB0aGF0IHdpbmRvdy4KKyAgICBpZiAoIXdpbi0+cmVzaXplKHBfd2lkdGgsIHBfaGVpZ2h0KSkgeworICAgICAgICBkZWxldGUgd2luOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gd2luOworfQorCisKK3ZvaWQgV2luZG93U3VyZmFjZTo6c2V0Q29sb3JCdWZmZXIoQ29sb3JCdWZmZXJQdHIgcF9jb2xvckJ1ZmZlcikgeworICAgIG1BdHRhY2hlZENvbG9yQnVmZmVyID0gcF9jb2xvckJ1ZmZlcjsKKworICAgIC8vIHJlc2l6ZSB0aGUgd2luZG93IGlmIHRoZSBhdHRhY2hlZCBjb2xvciBidWZmZXIgaXMgb2YgZGlmZmVyZW50CisgICAgLy8gc2l6ZS4KKyAgICB1bnNpZ25lZCBpbnQgY2JXaWR0aCA9IG1BdHRhY2hlZENvbG9yQnVmZmVyLT5nZXRXaWR0aCgpOworICAgIHVuc2lnbmVkIGludCBjYkhlaWdodCA9IG1BdHRhY2hlZENvbG9yQnVmZmVyLT5nZXRIZWlnaHQoKTsKKworICAgIGlmIChjYldpZHRoICE9IG1XaWR0aCB8fCBjYkhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIHJlc2l6ZShjYldpZHRoLCBjYkhlaWdodCk7CisgICAgfQorfQorCit2b2lkIFdpbmRvd1N1cmZhY2U6OmJpbmQoUmVuZGVyQ29udGV4dFB0ciBwX2N0eCwgQmluZFR5cGUgcF9iaW5kVHlwZSkgeworICAgIGlmIChwX2JpbmRUeXBlID09IEJJTkRfUkVBRCkgeworICAgICAgICBtUmVhZENvbnRleHQgPSBwX2N0eDsKKyAgICB9IGVsc2UgaWYgKHBfYmluZFR5cGUgPT0gQklORF9EUkFXKSB7CisgICAgICAgIG1EcmF3Q29udGV4dCA9IHBfY3R4OworICAgIH0gZWxzZSBpZiAocF9iaW5kVHlwZSA9PSBCSU5EX1JFQUREUkFXKSB7CisgICAgICAgIG1SZWFkQ29udGV4dCA9IHBfY3R4OworICAgICAgICBtRHJhd0NvbnRleHQgPSBwX2N0eDsKKyAgICB9Cit9CisKK0dMdWludCBXaW5kb3dTdXJmYWNlOjpnZXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1XaWR0aDsgfQorR0x1aW50IFdpbmRvd1N1cmZhY2U6OmdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1IZWlnaHQ7IH0KKworYm9vbCBXaW5kb3dTdXJmYWNlOjpmbHVzaENvbG9yQnVmZmVyKCkgeworICAgIGlmICghbUF0dGFjaGVkQ29sb3JCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmICghbVdpZHRoIHx8ICFtSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUF0dGFjaGVkQ29sb3JCdWZmZXItPmdldFdpZHRoKCkgIT0gbVdpZHRoIHx8CisgICAgICAgIG1BdHRhY2hlZENvbG9yQnVmZmVyLT5nZXRIZWlnaHQoKSAhPSBtSGVpZ2h0KSB7CisgICAgICAgIC8vIFhYWDogc2hvdWxkIG5ldmVyIGhhcHBlbiAtIGhvdyB0aGlzIG5lZWRzIHRvIGJlIGhhbmRsZWQ/CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGltZW5zaW9ucyBkbyBub3QgbWF0Y2hcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtRHJhd0NvbnRleHQuZ2V0KCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEcmF3IGNvbnRleHQgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHRoZSBzdXJmYWNlIGN1cnJlbnQKKyAgICBFR0xDb250ZXh0IHByZXZDb250ZXh0ID0gc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBFR0xTdXJmYWNlIHByZXZSZWFkU3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9SRUFEKTsKKyAgICBFR0xTdXJmYWNlIHByZXZEcmF3U3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKworICAgIGNvbnN0IGJvb2wgbmVlZFRvU2V0ID0gcHJldkNvbnRleHQgIT0gbURyYXdDb250ZXh0LT5nZXRFR0xDb250ZXh0KCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZSZWFkU3VyZiAhPSBtU3VyZmFjZSB8fCBwcmV2RHJhd1N1cmYgIT0gbVN1cmZhY2U7CisgICAgaWYgKG5lZWRUb1NldCkgeworICAgICAgICBpZiAoIXNfZWdsLmVnbE1ha2VDdXJyZW50KG1EaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EcmF3Q29udGV4dC0+Z2V0RUdMQ29udGV4dCgpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBtYWtpbmcgZHJhdyBjb250ZXh0IGN1cnJlbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbUF0dGFjaGVkQ29sb3JCdWZmZXItPmJsaXRGcm9tQ3VycmVudFJlYWRCdWZmZXIoKTsKKworICAgIGlmIChuZWVkVG9TZXQpIHsKKyAgICAgICAgLy8gcmVzdG9yZSBjdXJyZW50IGNvbnRleHQvc3VyZmFjZQorICAgICAgICBzX2VnbC5lZ2xNYWtlQ3VycmVudChtRGlzcGxheSwgcHJldkRyYXdTdXJmLCBwcmV2UmVhZFN1cmYsIHByZXZDb250ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXaW5kb3dTdXJmYWNlOjpyZXNpemUodW5zaWduZWQgaW50IHBfd2lkdGgsIHVuc2lnbmVkIGludCBwX2hlaWdodCkKK3sKKyAgICBpZiAobVN1cmZhY2UgJiYgbVdpZHRoID09IHBfd2lkdGggJiYgbUhlaWdodCA9PSBwX2hlaWdodCkgeworICAgICAgICAvLyBubyBuZWVkIHRvIHJlc2l6ZQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBFR0xDb250ZXh0IHByZXZDb250ZXh0ID0gc19lZ2wuZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBFR0xTdXJmYWNlIHByZXZSZWFkU3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9SRUFEKTsKKyAgICBFR0xTdXJmYWNlIHByZXZEcmF3U3VyZiA9IHNfZWdsLmVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKyAgICBFR0xTdXJmYWNlIHByZXZQYnVmID0gbVN1cmZhY2U7CisgICAgYm9vbCBuZWVkUmViaW5kQ29udGV4dCA9IG1TdXJmYWNlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2UmVhZFN1cmYgPT0gbVN1cmZhY2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEcmF3U3VyZiA9PSBtU3VyZmFjZSk7CisKKyAgICBpZiAobmVlZFJlYmluZENvbnRleHQpIHsKKyAgICAgICAgc19lZ2wuZWdsTWFrZUN1cnJlbnQoCisgICAgICAgICAgICAgICAgbURpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOworICAgIH0KKworICAgIC8vCisgICAgLy8gRGVzdHJveSBwcmV2aW91cyBzdXJmYWNlCisgICAgLy8KKyAgICBpZiAobVN1cmZhY2UpIHsKKyAgICAgICAgc19lZ2wuZWdsRGVzdHJveVN1cmZhY2UobURpc3BsYXksIG1TdXJmYWNlKTsKKyAgICAgICAgbVN1cmZhY2UgPSBOVUxMOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHBidWZmZXIgc3VyZmFjZS4KKyAgICAvLworICAgIGNvbnN0IEVHTGludCBwYnVmQXR0cmlic1s1XSA9IHsKKyAgICAgICAgRUdMX1dJRFRILCAoRUdMaW50KSBwX3dpZHRoLCBFR0xfSEVJR0hULCAoRUdMaW50KSBwX2hlaWdodCwgRUdMX05PTkUsCisgICAgfTsKKworICAgIG1TdXJmYWNlID0gc19lZ2wuZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UobURpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZkF0dHJpYnMpOworICAgIGlmIChtU3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbmRlcmVyIGVycm9yOiBmYWlsZWQgdG8gY3JlYXRlL3Jlc2l6ZSBwYnVmZmVyISFcbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbVdpZHRoID0gcF93aWR0aDsKKyAgICBtSGVpZ2h0ID0gcF9oZWlnaHQ7CisKKyAgICBpZiAobmVlZFJlYmluZENvbnRleHQpIHsKKyAgICAgICAgc19lZ2wuZWdsTWFrZUN1cnJlbnQoCisgICAgICAgICAgICAgICAgbURpc3BsYXksCisgICAgICAgICAgICAgICAgKHByZXZEcmF3U3VyZiA9PSBwcmV2UGJ1ZikgPyBtU3VyZmFjZSA6IHByZXZEcmF3U3VyZiwKKyAgICAgICAgICAgICAgICAocHJldlJlYWRTdXJmID09IHByZXZQYnVmKSA/IG1TdXJmYWNlIDogcHJldlJlYWRTdXJmLAorICAgICAgICAgICAgICAgIHByZXZDb250ZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1dpbmRvd1N1cmZhY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL1dpbmRvd1N1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFhZDdlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvV2luZG93U3VyZmFjZS5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfTElCUkVOREVSX1dJTkRPV19TVVJGQUNFX0gKKyNkZWZpbmUgX0xJQlJFTkRFUl9XSU5ET1dfU1VSRkFDRV9ICisKKyNpbmNsdWRlICJDb2xvckJ1ZmZlci5oIgorI2luY2x1ZGUgIlJlbmRlckNvbnRleHQuaCIKKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zbWFydF9wdHIuaCIKKworI2luY2x1ZGUgPEVHTC9lZ2wuaD4KKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisKKy8vIEEgY2xhc3MgdXNlZCB0byBtb2RlbCBhIGd1ZXN0LXNpZGUgd2luZG93IHN1cmZhY2UuIFRoZSBpbXBsZW1lbnRhdGlvbgorLy8gdXNlcyBhIGhvc3QgUGJ1ZmZlciB0byBhY3QgYXMgdGhlIEVHTCByZW5kZXJpbmcgc3VyZmFjZSBpbnN0ZWFkLgorY2xhc3MgV2luZG93U3VyZmFjZSB7CitwdWJsaWM6CisgICAgLy8gQ3JlYXRlIGEgbmV3IFdpbmRvd1N1cmZhY2UgaW5zdGFuY2UuCisgICAgLy8gfGRpc3BsYXl8IGlzIHRoZSBob3N0IEVHTERpc3BsYXkgdmFsdWUuCisgICAgLy8gfGNvbmZpZ3wgaXMgdGhlIGhvc3QgRUdMQ29uZmlnIHZhbHVlLgorICAgIC8vIHx3aWR0aHwgYW5kIHxoZWlnaHR8IGFyZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBQYnVmZmVyLgorICAgIC8vIFJldHVybiBhIG5ldyBXaW5kb3dTdXJmYWNlIGluc3RhbmNlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAgICBzdGF0aWMgV2luZG93U3VyZmFjZSogY3JlYXRlKEVHTERpc3BsYXkgZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKKworICAgIC8vIERlc3RydWN0b3IuCisgICAgfldpbmRvd1N1cmZhY2UoKTsKKworICAgIC8vIFJldHJpZXZlIHRoZSBob3N0IEVHTFN1cmZhY2Ugb2YgdGhlIFdpbmRvd1N1cmZhY2UncyBQYnVmZmVyLgorICAgIEVHTFN1cmZhY2UgZ2V0RUdMU3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1TdXJmYWNlOyB9CisKKyAgICAvLyBBdHRhY2ggYSBDb2xvckJ1ZmZlciB0byB0aGlzIFdpbmRvd1N1cmZhY2UuCisgICAgLy8gT25jZSBhdHRhY2hlZCwgY2FsbGluZyBmbHVzaENvbG9yQnVmZmVyKCkgd2lsbCBjb3B5IHRoZSBQYnVmZmVyJ3MKKyAgICAvLyBwaXhlbHMgdG8gdGhlIGNvbG9yIGJ1ZmZlci4KKyAgICAvLworICAgIC8vIElNUE9SVEFOVDogVGhpcyBhdXRvbWF0aWNhbGx5IHJlc2l6ZXMgdGhlIFBidWZmZXIncyB0byB0aGUgQ29sb3JCdWZmZXIncworICAgIC8vIGRpbWVuc2lvbnMuIFBvdGVudGlhbGx5IGxvc2luZyBwaXhlbCB2YWx1ZXMgaW4gdGhlIHByb2Nlc3MuCisgICAgdm9pZCBzZXRDb2xvckJ1ZmZlcihDb2xvckJ1ZmZlclB0ciBwX2NvbG9yQnVmZmVyKTsKKworICAgIC8vIENvcHkgdGhlIFBidWZmZXIncyBwaXhlbHMgdG8gdGhlIGF0dGFjaGVkIGNvbG9yIGJ1ZmZlci4KKyAgICAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgb3IgZmFsc2Ugb24gZXJyb3IgKGUuZy4gaWYgdGhlcmUgaXMgbm8KKyAgICAvLyBhdHRhY2hlZCBjb2xvciBidWZmZXIpLgorICAgIGJvb2wgZmx1c2hDb2xvckJ1ZmZlcigpOworCisgICAgLy8gVXNlZCBieSBiaW5kKCkgYmVsb3cuCisgICAgZW51bSBCaW5kVHlwZSB7CisgICAgICAgIEJJTkRfUkVBRCwKKyAgICAgICAgQklORF9EUkFXLAorICAgICAgICBCSU5EX1JFQUREUkFXCisgICAgfTsKKworICAgIC8vIFRPRE8oZGlnaXQpOiBXaGF0IGlzIHRoaXMgdXNlZCBmb3IgZXhhY3RseT8gRm9yIGV4YW1wbGUsIHRoZQorICAgIC8vIG1SZWFkQ29udGV4dCBpcyBuZXZlciB1c2VkIGJ5IHRoaXMgY2xhc3MuIFRoZSBtRHJhd0NvbnRleHQgaXMgb25seQorICAgIC8vIHVzZWQgdGVtcG9yYXJpbHkgZHVyaW5nIGZsdXNoQ29sb3JCdWZmZXIoKSBvcGVyYXRpb24sIGFuZCBjb3VsZCBiZQorICAgIC8vIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgZnVuY3Rpb24gaW5zdGVhZC4gTWF5YmUgdGhpcyBpcyBvbmx5IHVzZWQKKyAgICAvLyB0byBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyBvbiB0aGUgc21hcnQgcG9pbnRlcnMuCisgICAgLy8KKyAgICAvLyBCaW5kIGEgY29udGV4dCB0byB0aGUgV2luZG93U3VyZmFjZSAoaHVoPyBOb3JtYWxseSB5b3Ugd291bGQgYmluZCBhCisgICAgLy8gc3VyZmFjZSB0byB0aGUgY29udGV4dCwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kKQorICAgIC8vCisgICAgLy8gfHBfY3R4fCBpcyBhIFJlbmRlckNvbnRleHQgcG9pbnRlci4KKyAgICAvLyB8cF9iaW5kVHlwZXwgaXMgdGhlIHR5cGUgb2YgYmluZC4gRm9yIEJJTkRfUkVBRCwgdGhpcyBhc3NpZ25zIHxwX2N0eHwKKyAgICAvLyB0byBtUmVhZENvbnRleHQsIGZvciBCSU5EX0RSQVcsIGl0IGFzc2lnbnMgaXQgdG8gbURyYXdDb250ZXh0LCBhbmQgZm9yCisgICAgLy8gZm9yIEJJTkRfUkVBRERSQVcsIGl0IGFzc2lnbnMgaXQgdG8gYm90aC4KKyAgICB2b2lkIGJpbmQoUmVuZGVyQ29udGV4dFB0ciBwX2N0eCwgQmluZFR5cGUgcF9iaW5kVHlwZSk7CisKKyAgICBHTHVpbnQgZ2V0V2lkdGgoKSBjb25zdDsKKyAgICBHTHVpbnQgZ2V0SGVpZ2h0KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgV2luZG93U3VyZmFjZShjb25zdCBXaW5kb3dTdXJmYWNlJiBvdGhlcikgPSBkZWxldGU7CisKKyAgICBXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZyk7CisKKyAgICBib29sIHJlc2l6ZSh1bnNpZ25lZCBpbnQgcF93aWR0aCwgdW5zaWduZWQgaW50IHBfaGVpZ2h0KTsKKworcHJpdmF0ZToKKyAgICBFR0xTdXJmYWNlIG1TdXJmYWNlID0gRUdMX05PX1NVUkZBQ0U7CisgICAgQ29sb3JCdWZmZXJQdHIgbUF0dGFjaGVkQ29sb3JCdWZmZXI7CisgICAgUmVuZGVyQ29udGV4dFB0ciBtUmVhZENvbnRleHQ7CisgICAgUmVuZGVyQ29udGV4dFB0ciBtRHJhd0NvbnRleHQ7CisgICAgR0x1aW50IG1XaWR0aCA9IDA7CisgICAgR0x1aW50IG1IZWlnaHQgPSAwOworICAgIEVHTENvbmZpZyBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICBFR0xEaXNwbGF5IG1EaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7Cit9OworCit0eXBlZGVmIGVtdWdsOjpTbWFydFB0cjxXaW5kb3dTdXJmYWNlPiBXaW5kb3dTdXJmYWNlUHRyOworCisjZW5kaWYgIC8vIF9MSUJSRU5ERVJfV0lORE9XX1NVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZhZmFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaS5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExLTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpLmgiCisKKyNpbmNsdWRlICJFcnJvckxvZy5oIgorI2luY2x1ZGUgIk9wZW5HTEVTRGlzcGF0Y2gvRUdMRGlzcGF0Y2guaCIKKyNpbmNsdWRlICJPcGVuR0xFU0Rpc3BhdGNoL0dMRVN2MURpc3BhdGNoLmgiCisjaW5jbHVkZSAiT3BlbkdMRVNEaXNwYXRjaC9HTEVTdjJEaXNwYXRjaC5oIgorI2luY2x1ZGUgIlJlbmRlckxpYkltcGwuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworR0xFU3YyRGlzcGF0Y2ggc19nbGVzMjsKK0dMRVN2MURpc3BhdGNoIHNfZ2xlczE7CisKK1JFTkRFUl9BUElDQUxMIGVtdWdsOjpSZW5kZXJMaWJQdHIgUkVOREVSX0FQSUVOVFJZIGluaXRMaWJyYXJ5KCkKK3sKKyAgICAvLworICAgIC8vIExvYWQgRUdMIFBsdWdpbgorICAgIC8vCisgICAgaWYgKCFpbml0X2VnbF9kaXNwYXRjaCgpKSB7CisgICAgICAgIC8vIEZhaWxlZCB0byBsb2FkIEVHTAorICAgICAgICBwcmludGYoIkZhaWxlZCB0byBpbml0X2VnbF9kaXNwYXRjaFxuIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vCisgICAgLy8gTG9hZCBHTEVTIFBsdWdpbgorICAgIC8vCisgICAgaWYgKCFnbGVzMV9kaXNwYXRjaF9pbml0KCZzX2dsZXMxKSkgeworICAgICAgICAvLyBGYWlsZWQgdG8gbG9hZCBHTEVTCisgICAgICAgIEVSUigiRmFpbGVkIHRvIGdsZXMxX2Rpc3BhdGNoX2luaXRcbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiBmYWlsdXJlIHRvIGluaXQgdGhlIEdMRVMyIGRpc3BhdGNoIHRhYmxlIGlzIG5vdCBmYXRhbCAqLworICAgIGlmICghZ2xlczJfZGlzcGF0Y2hfaW5pdCgmc19nbGVzMikpIHsKKyAgICAgICAgRVJSKCJGYWlsZWQgdG8gZ2xlczJfZGlzcGF0Y2hfaW5pdFxuIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBlbXVnbDo6UmVuZGVyTGliUHRyKG5ldyBlbXVnbDo6UmVuZGVyTGliSW1wbCgpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGkuZW50cmllcyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvbGliT3BlbmdsUmVuZGVyL3JlbmRlcl9hcGkuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU0ZWJjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9saWJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaS5lbnRyaWVzCkBAIC0wLDAgKzEsOSBAQAorIXJlbmRlcl9hcGkKKworJSNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvUmVuZGVyTGliLmgiCislCisKKyMgSW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGxvYWQgdGhlIGNvcnJlc3BvbmRpbmcgRUdML0dMRVMKKyMgdHJhbnNsYXRpb24gbGlicmFyaWVzLgorIyBSZXR1cm5zIGVpdGhlciB0aGUgbGlicmFyeSBhY2Nlc3NvciBzbWFydCBwb2ludGVyIG9yIG51bGwgb24gZmFpbHVyZS4KK2VtdWdsOjpSZW5kZXJMaWJQdHIgaW5pdExpYnJhcnkodm9pZCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL0FuZHJvaWQubWsgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMzA2NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEyIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKworIyMjIGhvc3QgbGlicmFyeSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworJChjYWxsIGVtdWdsLWJlZ2luLXN0YXRpYy1saWJyYXJ5LGxpYl9yZW5kZXJDb250cm9sX2RlYykKKyQoY2FsbCBlbXVnbC1pbXBvcnQsbGliT3BlbmdsQ29kZWNDb21tb24pCiskKGNhbGwgZW11Z2wtZ2VuLWRlY29kZXIsJChMT0NBTF9QQVRIKSxyZW5kZXJDb250cm9sKQorIyBGb3IgcmVuZGVyQ29udHJvbF90eXBlcy5oCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChMT0NBTF9QQVRIKSkKKworJChjYWxsIGVtdWdsLWV4cG9ydCxDRkxBR1MsJChFTVVHTF9VU0VSX0NGTEFHUykpCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMvcmVuZGVyQ29udHJvbC5hdHRyaWIgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wuYXR0cmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTRlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wuYXR0cmliCkBAIC0wLDAgKzEsNTUgQEAKKyMgRm9yIGRvY3VtZW50YXRpb24gb24gdGhlIC5hdHRyaWIgZmlsZSBmb3JtYXQsIHNlZToKKyMgYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1JFQURNRQorCitHTE9CQUwKKwliYXNlX29wY29kZSAxMDAwMAorCWVuY29kZXJfaGVhZGVycyA8c3RkaW50Lmg+IDxFR0wvZWdsLmg+ICJnbFV0aWxzLmgiCisKK3JjR2V0RUdMVmVyc2lvbgorICAgIGRpciBtYWpvciBvdXQKKyAgICBsZW4gbWFqb3Igc2l6ZW9mKEVHTGludCkKKyAgICBkaXIgbWlub3Igb3V0CisgICAgbGVuIG1pbm9yIHNpemVvZihFR0xpbnQpCisKK3JjUXVlcnlFR0xTdHJpbmcKKyAgICBkaXIgYnVmZmVyIG91dAorICAgIGxlbiBidWZmZXIgYnVmZmVyU2l6ZQorCityY0dldEdMU3RyaW5nCisgICAgZGlyIGJ1ZmZlciBvdXQKKyAgICBsZW4gYnVmZmVyIGJ1ZmZlclNpemUKKworcmNHZXROdW1Db25maWdzCisgICAgZGlyIG51bUF0dHJpYnMgb3V0CisgICAgbGVuIG51bUF0dHJpYnMgc2l6ZW9mKHVpbnQzMl90KQorCityY0dldENvbmZpZ3MKKyAgICBkaXIgYnVmZmVyIG91dAorICAgIGxlbiBidWZmZXIgYnVmU2l6ZQorCityY0Nob29zZUNvbmZpZworICAgIGRpciBhdHRyaWJzIGluCisgICAgbGVuIGF0dHJpYnMgYXR0cmlic19zaXplCisgICAgZGlyIGNvbmZpZ3Mgb3V0CisgICAgdmFyX2ZsYWcgY29uZmlncyBudWxsQWxsb3dlZAorICAgIGxlbiBjb25maWdzIGNvbmZpZ3Nfc2l6ZSpzaXplb2YodWludDMyX3QpCisKK3JjUmVhZENvbG9yQnVmZmVyCisgICAgZGlyIHBpeGVscyBvdXQKKyAgICBsZW4gcGl4ZWxzICgoKGdsVXRpbHNQaXhlbEJpdFNpemUoZm9ybWF0LCB0eXBlKSAqIHdpZHRoKSA+PiAzKSAqIGhlaWdodCkKKworcmNVcGRhdGVDb2xvckJ1ZmZlcgorICAgIGRpciBwaXhlbHMgaW4KKyAgICBsZW4gcGl4ZWxzICgoKGdsVXRpbHNQaXhlbEJpdFNpemUoZm9ybWF0LCB0eXBlKSAqIHdpZHRoKSA+PiAzKSAqIGhlaWdodCkKKyAgICB2YXJfZmxhZyBwaXhlbHMgaXNMYXJnZQorCityY0Nsb3NlQ29sb3JCdWZmZXIKKyAgICBmbGFnIGZsdXNoT25FbmNvZGUKKworcmNDcmVhdGVTeW5jS0hSCisgICAgZGlyIGF0dHJpYnMgaW4KKyAgICBsZW4gYXR0cmlicyBudW1fYXR0cmlicworICAgIGRpciBnbHN5bmNfb3V0IG91dAorICAgIGxlbiBnbHN5bmNfb3V0IHNpemVvZih1aW50NjRfdCkKKyAgICBkaXIgc3luY3RocmVhZF9vdXQgb3V0CisgICAgbGVuIHN5bmN0aHJlYWRfb3V0IHNpemVvZih1aW50NjRfdCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMvcmVuZGVyQ29udHJvbC5pbiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMvcmVuZGVyQ29udHJvbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTEwYmVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9yZW5kZXJDb250cm9sX2RlYy9yZW5kZXJDb250cm9sLmluCkBAIC0wLDAgKzEsMzQgQEAKK0dMX0VOUlRZKEdMaW50LCByY0dldFJlbmRlcmVyVmVyc2lvbikKK0dMX0VOVFJZKEVHTGludCwgcmNHZXRFR0xWZXJzaW9uLCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKQorR0xfRU5UUlkoRUdMaW50LCByY1F1ZXJ5RUdMU3RyaW5nLCBFR0xlbnVtIG5hbWUsIHZvaWQgKmJ1ZmZlciwgRUdMaW50IGJ1ZmZlclNpemUpCitHTF9FTlRSWShFR0xpbnQsIHJjR2V0R0xTdHJpbmcsIEVHTGVudW0gbmFtZSwgdm9pZCAqYnVmZmVyLCBFR0xpbnQgYnVmZmVyU2l6ZSkKK0dMX0VOVFJZKEVHTGludCwgcmNHZXROdW1Db25maWdzLCB1aW50MzJfdCAqbnVtQXR0cmlicykKK0dMX0VOVFJZKEVHTGludCwgcmNHZXRDb25maWdzLCB1aW50MzJfdCBidWZTaXplLCBHTHVpbnQgKmJ1ZmZlcikKK0dMX0VOVFJZKEVHTGludCwgcmNDaG9vc2VDb25maWcsIEVHTGludCAqYXR0cmlicywgdWludDMyX3QgYXR0cmlic19zaXplLCB1aW50MzJfdCAqY29uZmlncywgdWludDMyX3QgY29uZmlnc19zaXplKQorR0xfRU5UUlkoRUdMaW50LCByY0dldEZCUGFyYW0sIEVHTGludCBwYXJhbSkKK0dMX0VOVFJZKHVpbnQzMl90LCByY0NyZWF0ZUNvbnRleHQsIHVpbnQzMl90IGNvbmZpZywgdWludDMyX3Qgc2hhcmUsIHVpbnQzMl90IGdsVmVyc2lvbikKK0dMX0VOVFJZKHZvaWQsIHJjRGVzdHJveUNvbnRleHQsIHVpbnQzMl90IGNvbnRleHQpCitHTF9FTlRSWSh1aW50MzJfdCwgcmNDcmVhdGVXaW5kb3dTdXJmYWNlLCB1aW50MzJfdCBjb25maWcsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpCitHTF9FTlRSWSh2b2lkLCByY0Rlc3Ryb3lXaW5kb3dTdXJmYWNlLCB1aW50MzJfdCB3aW5kb3dTdXJmYWNlKQorR0xfRU5UUlkodWludDMyX3QsIHJjQ3JlYXRlQ29sb3JCdWZmZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIEdMZW51bSBpbnRlcm5hbEZvcm1hdCkKK0dMX0VOVFJZKHZvaWQsIHJjT3BlbkNvbG9yQnVmZmVyLCB1aW50MzJfdCBjb2xvcmJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIHJjQ2xvc2VDb2xvckJ1ZmZlciwgdWludDMyX3QgY29sb3JidWZmZXIpCitHTF9FTlRSWSh2b2lkLCByY1NldFdpbmRvd0NvbG9yQnVmZmVyLCB1aW50MzJfdCB3aW5kb3dTdXJmYWNlLCB1aW50MzJfdCBjb2xvckJ1ZmZlcikKK0dMX0VOVFJZKGludCwgcmNGbHVzaFdpbmRvd0NvbG9yQnVmZmVyLCB1aW50MzJfdCB3aW5kb3dTdXJmYWNlKQorR0xfRU5UUlkoRUdMaW50LCByY01ha2VDdXJyZW50LCB1aW50MzJfdCBjb250ZXh0LCB1aW50MzJfdCBkcmF3U3VyZiwgdWludDMyX3QgcmVhZFN1cmYpCitHTF9FTlRSWSh2b2lkLCByY0ZCUG9zdCwgdWludDMyX3QgY29sb3JCdWZmZXIpCitHTF9FTlRSWSh2b2lkLCByY0ZCU2V0U3dhcEludGVydmFsLCBFR0xpbnQgaW50ZXJ2YWwpCitHTF9FTlRSWSh2b2lkLCByY0JpbmRUZXh0dXJlLCB1aW50MzJfdCBjb2xvckJ1ZmZlcikKK0dMX0VOVFJZKHZvaWQsIHJjQmluZFJlbmRlcmJ1ZmZlciwgdWludDMyX3QgY29sb3JCdWZmZXIpCitHTF9FTlRSWShFR0xpbnQsIHJjQ29sb3JCdWZmZXJDYWNoZUZsdXNoLCB1aW50MzJfdCBjb2xvcmJ1ZmZlciwgRUdMaW50IHBvc3RDb3VudCxpbnQgZm9yUmVhZCkKK0dMX0VOVFJZKHZvaWQsIHJjUmVhZENvbG9yQnVmZmVyLCB1aW50MzJfdCBjb2xvcmJ1ZmZlciwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIHZvaWQgKnBpeGVscykKK0dMX0VOVFJZKGludCwgcmNVcGRhdGVDb2xvckJ1ZmZlciwgdWludDMyX3QgY29sb3JidWZmZXIsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCB2b2lkICpwaXhlbHMpCitHTF9FTlRSWShpbnQsIHJjT3BlbkNvbG9yQnVmZmVyMiwgdWludDMyX3QgY29sb3JidWZmZXIpCitHTF9FTlRSWSh1aW50MzJfdCwgcmNDcmVhdGVDbGllbnRJbWFnZSwgdWludDMyX3QgY29udGV4dCwgRUdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpCitHTF9FTlRSWShpbnQsIHJjRGVzdHJveUNsaWVudEltYWdlLCB1aW50MzJfdCBpbWFnZSkKK0dMX0VOVFJZKHZvaWQsIHJjU2VsZWN0Q2hlY2tzdW1IZWxwZXIsIHVpbnQzMl90IG5ld1Byb3RvY29sLCB1aW50MzJfdCByZXNlcnZlZCkKK0dMX0VOVFJZKHZvaWQsIHJjQ3JlYXRlU3luY0tIUiwgRUdMZW51bSB0eXBlLCBFR0xpbnQqIGF0dHJpYnMsIHVpbnQzMl90IG51bV9hdHRyaWJzLCBpbnQgZGVzdHJveV93aGVuX3NpZ25hbGVkLCB1aW50NjRfdCogZ2xzeW5jX291dCwgdWludDY0X3QqIHN5bmN0aHJlYWRfb3V0KQorR0xfRU5UUlkoRUdMaW50LCByY0NsaWVudFdhaXRTeW5jS0hSLCB1aW50NjRfdCBzeW5jLCBFR0xpbnQgZmxhZ3MsIHVpbnQ2NF90IHRpbWVvdXQpCitHTF9FTlRSWSh2b2lkLCByY0ZsdXNoV2luZG93Q29sb3JCdWZmZXJBc3luYywgdWludDMyX3Qgd2luZG93U3VyZmFjZSkKK0dMX0VOVFJZKGludCwgcmNEZXN0cm95U3luY0tIUiwgdWludDY0X3Qgc3luYyk7CitHTF9FTlRSWSh2b2lkLCByY1NldFB1aWQsIHVpbnQ2NF90IHB1aWQpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9yZW5kZXJDb250cm9sX2RlYy9yZW5kZXJDb250cm9sLnR5cGVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvbGlicy9yZW5kZXJDb250cm9sX2RlYy9yZW5kZXJDb250cm9sLnR5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ODQ5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2wudHlwZXMKQEAgLTAsMCArMSwxNCBAQAordWludDMyX3QgMzIgMHglMDh4Cit1aW50NjRfdCA2NCAweCUwMTZseAorRUdMaW50IDMyIDB4JTA4eAorR0xpbnQgMzIgMHglMDh4CitHTHVpbnQgMzIgMHglMDh4CitHTGVudW0gMzIgMHglMDh4CitFR0xlbnVtIDMyIDB4JTA4eAordWludDMyX3QqIDMyIDB4JTA4eAorRUdMaW50KiAzMiAweCUwOHgKK2ludCogMzIgMHglMDh4CitHTGludCogMzIgMHglMDh4CitHTHVpbnQqIDMyIDB4JTA4eAordm9pZCogMzIgMHglMDh4Cit1aW50NjRfdCogMzIgMHglMDh4CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2xfdHlwZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L2xpYnMvcmVuZGVyQ29udHJvbF9kZWMvcmVuZGVyQ29udHJvbF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjE1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL3JlbmRlckNvbnRyb2xfZGVjL3JlbmRlckNvbnRyb2xfdHlwZXMuaApAQCAtMCwwICsxLDI4IEBACisvKgorKiBDb3B5cmlnaHQgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxFR0wvZWdsLmg+CisjaW5jbHVkZSAiZ2xVdGlscy5oIgorCisvLyB2YWx1ZXMgZm9yICdwYXJhbScgYXJndW1lbnQgb2YgcmNHZXRGQlBhcmFtCisjZGVmaW5lIEZCX1dJRFRIICAgIDEKKyNkZWZpbmUgRkJfSEVJR0hUICAgMgorI2RlZmluZSBGQl9YRFBJICAgICAzCisjZGVmaW5lIEZCX1lEUEkgICAgIDQKKyNkZWZpbmUgRkJfRlBTICAgICAgNQorI2RlZmluZSBGQl9NSU5fU1dBUF9JTlRFUlZBTCA2CisjZGVmaW5lIEZCX01BWF9TV0FQX0lOVEVSVkFMIDcKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BbmRyb2lkLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKKyMgRGV0ZXJtaW5lIGlmIHRoZSBlbXVnZW4gYnVpbGQgbmVlZHMgdG8gYmUgYnVpbHRzIGZyb20KKyMgc291cmNlcy4KK0xPQ0FMX1BBVEg6PSQoY2FsbCBteS1kaXIpCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1ob3N0LWV4ZWN1dGFibGUsZW11Z2VuKQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBBcGlHZW4uY3BwIFwKKyAgICBFbnRyeVBvaW50LmNwcCBcCisgICAgbWFpbi5jcHAgXAorICAgIFBhcnNlci5jcHAgXAorICAgIHN0clV0aWxzLmNwcCBcCisgICAgVHlwZUZhY3RvcnkuY3BwIFwKKworTE9DQUxfSU5TVEFMTCA6PSBmYWxzZQorCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKKworIyBUaGUgbG9jYXRpb24gb2YgdGhlIGVtdWdlbiBob3N0IHRvb2wgdGhhdCBpcyB1c2VkIHRvIGdlbmVyYXRlIHdpcmUKKyMgcHJvdG9jb2wgZW5jb2RlcnMvIGRlY29kZXJzLiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgb3RoZXIgZW11Z2wgbW9kdWxlcy4KK0VNVUdMX0VNVUdFTiA6PSAkKExPQ0FMX0JVSUxUX01PRFVMRSkKKworJChjYWxsIGVtdWdsLWJlZ2luLWhvc3QtZXhlY3V0YWJsZSxlbXVnZW5fdW5pdHRlc3RzKQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBQYXJzZXIuY3BwIFwKKyAgICBQYXJzZXJfdW5pdHRlc3QuY3BwCitMT0NBTF9JTlNUQUxMIDo9IGZhbHNlCiskKGNhbGwgZW11Z2wtaW1wb3J0LGxpYmVtdWdsX2d0ZXN0X2hvc3QpCiskKGNhbGwgZW11Z2wtZW5kLW1vZHVsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BcGlHZW4uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL0FwaUdlbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1MWViYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BcGlHZW4uY3BwCkBAIC0wLDAgKzEsMTQwNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJBcGlHZW4uaCIKKyNpbmNsdWRlICJFbnRyeVBvaW50LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzdHJVdGlscy5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIERlZmluZSB0aGlzIHRvIDEgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSAnaXNMYXJnZScgdmFyaWFibGUgZmxhZworICogdGhhdCBpbnN0cnVjdHMgdGhlIGVuY29kZXIgdG8gc2VuZCBsYXJnZSBkYXRhIGJ1ZmZlcnMgYnkgYSBkaXJlY3QKKyAqIHdyaXRlIHRocm91Z2ggdGhlIHBpcGUgKGkuZS4gd2l0aG91dCBjb3B5aW5nIGl0IGludG8gYSB0ZW1wb3JhcnkKKyAqIGJ1ZmZlci4gVGhpcyBoYXMgZGVmaW5pdGUgcGVyZm9ybWFuY2UgYmVuZWZpdHMgd2hlbiB1c2luZyBhIFFFTVUgUGlwZS4KKyAqCisgKiBTZXQgdG8gMCBvdGhlcndpc2UuCisgKi8KKyNkZWZpbmUgV0lUSF9MQVJHRV9TVVBQT1JUICAxCisKKy8vIFNldCB0byAxIHRvIGVuc3VyZSBidWZmZXJzIHBhc3NlZCB0by9mcm9tIEVHTC9HTCBhcmUgcHJvcGVybHkgYWxpZ25lZC4KKy8vIFRoaXMgcHJldmVudHMgY3Jhc2hlcyB3aXRoIGNlcnRhaW4gYmFja2VuZHMgKGUuZy4gT1NNZXNhKS4KKyNkZWZpbmUgVVNFX0FMSUdORURfQlVGRkVSUyAxCisKKy8vIFNldCB0aGVzZSB0byAxIGlmIHlvdSB3YW50IHRvIGluc3RydW1lbnQgZWl0aGVyIGd1ZXN0J3Mgb3IgaG9zdCdzIGNvZGUgZm9yCisvLyB0aW1lLXBlci1jYWxsIHByaW50aW5nLgorI2RlZmluZSBJTlNUUlVNRU5UX1RJTUlOR19HVUVTVCAwCisjZGVmaW5lIElOU1RSVU1FTlRfVElNSU5HX0hPU1QgMAorCitFbnRyeVBvaW50ICogQXBpR2VuOjpmaW5kRW50cnlCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKQoreworICAgIEVudHJ5UG9pbnQgKiBlbnRyeSA9IE5VTEw7CisKKyAgICBzaXplX3QgbiA9IHRoaXMtPnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZiAoYXQoaSkubmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGVudHJ5ID0gJihhdChpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZW50cnk7Cit9CisKK3ZvaWQgQXBpR2VuOjpwcmludEhlYWRlcihGSUxFICpmcCkgY29uc3QKK3sKKyAgICBmcHJpbnRmKGZwLCAiLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIVxuIik7CisgICAgZnByaW50ZihmcCwgIi8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJ1xuIik7Cit9CisKK2ludCBBcGlHZW46OmdlblByb2NUeXBlcyhjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIFNpZGVUeXBlIHNpZGUpCit7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAid3QiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHJpbnRIZWFkZXIoZnApOworCisgICAgY29uc3QgY2hhciogYmFzZW5hbWUgPSBtX2Jhc2VuYW1lLmNfc3RyKCk7CisKKyAgICBmcHJpbnRmKGZwLCAiI2lmbmRlZiBfXyVzXyVzX3Byb2NfdF9oXG4iLCBiYXNlbmFtZSwgc2lkZVN0cmluZyhzaWRlKSk7CisgICAgZnByaW50ZihmcCwgIiNkZWZpbmUgX18lc18lc19wcm9jX3RfaFxuIiwgYmFzZW5hbWUsIHNpZGVTdHJpbmcoc2lkZSkpOworICAgIGZwcmludGYoZnAsICJcblxuIik7CisgICAgZnByaW50ZihmcCwgIlxuI2luY2x1ZGUgXCIlc190eXBlcy5oXCJcbiIsYmFzZW5hbWUpOworICAgIGZwcmludGYoZnAsICIjaWZuZGVmICVzX0FQSUVOVFJZXG4iLGJhc2VuYW1lKTsKKyAgICBmcHJpbnRmKGZwLCAiI2RlZmluZSAlc19BUElFTlRSWSBcbiIsYmFzZW5hbWUpOworICAgIGZwcmludGYoZnAsICIjZW5kaWZcbiIpOworCisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIEVudHJ5UG9pbnQgKmUgPSAmYXQoaSk7CisKKyAgICAgICAgZnByaW50ZihmcCwgInR5cGVkZWYgIik7CisgICAgICAgIGUtPnJldHZhbCgpLnByaW50VHlwZShmcCk7CisgICAgICAgIGZwcmludGYoZnAsICIgKCVzX0FQSUVOVFJZIColc18lc19wcm9jX3QpICgiLCBiYXNlbmFtZSwgZS0+bmFtZSgpLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgICAgICBpZiAoc2lkZSA9PSBDTElFTlRfU0lERSkgeyBmcHJpbnRmKGZwLCAidm9pZCAqIGN0eCIpOyB9CisgICAgICAgIGlmIChlLT5jdXN0b21EZWNvZGVyKCkgJiYgc2lkZSA9PSBTRVJWRVJfU0lERSkgeyBmcHJpbnRmKGZwLCAidm9pZCAqY3R4Iik7IH0KKworICAgICAgICBWYXJzQXJyYXkgJiBldmFycyA9IGUtPnZhcnMoKTsKKyAgICAgICAgc2l6ZV90IG4gPSBldmFycy5zaXplKCk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBuOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghZXZhcnNbal0uaXNWb2lkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSAwIHx8IHNpZGUgPT0gQ0xJRU5UX1NJREUgfHwgKHNpZGUgPT0gU0VSVkVSX1NJREUgJiYgZS0+Y3VzdG9tRGVjb2RlcigpKSkgZnByaW50ZihmcCwgIiwgIik7CisgICAgICAgICAgICAgICAgZXZhcnNbal0ucHJpbnRUeXBlKGZwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiKTtcbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXG5cbiNlbmRpZlxuIik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBcGlHZW46OmdlbkZ1bmNUYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIFNpZGVUeXBlIHNpZGUpCit7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAid3QiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHJpbnRIZWFkZXIoZnApOworCisgICAgZnByaW50ZihmcCwgIiNpZm5kZWYgX18lc18lc19mdGFibGVfdF9oXG4iLCBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgIGZwcmludGYoZnAsICIjZGVmaW5lIF9fJXNfJXNfZnRhYmxlX3RfaFxuIiwgbV9iYXNlbmFtZS5jX3N0cigpLCBzaWRlU3RyaW5nKHNpZGUpKTsKKyAgICBmcHJpbnRmKGZwLCAiXG5cbiIpOworICAgIGZwcmludGYoZnAsICJzdGF0aWMgY29uc3Qgc3RydWN0IF8lc19mdW5jc19ieV9uYW1lIHtcbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICJcdGNvbnN0IGNoYXIgKm5hbWU7XG4iIFwKKyAgICAgICAgICAgICJcdHZvaWQgKnByb2M7XG4iIFwKKyAgICAgICAgICAgICJ9ICVzX2Z1bmNzX2J5X25hbWVbXSA9IHtcbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRW50cnlQb2ludCAqZSA9ICZhdChpKTsKKyAgICAgICAgaWYgKGUtPm5vdEFwaSgpKSBjb250aW51ZTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0e1wiJXNcIiwgKHZvaWQqKSVzfSxcbiIsIGUtPm5hbWUoKS5jX3N0cigpLCBlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICAgIGZwcmludGYoZnAsICJ9O1xuIik7CisgICAgZnByaW50ZihmcCwgInN0YXRpYyBjb25zdCBpbnQgJXNfbnVtX2Z1bmNzID0gc2l6ZW9mKCVzX2Z1bmNzX2J5X25hbWUpIC8gc2l6ZW9mKHN0cnVjdCBfJXNfZnVuY3NfYnlfbmFtZSk7XG4iLAorICAgICAgICAgICAgbV9iYXNlbmFtZS5jX3N0cigpLCBtX2Jhc2VuYW1lLmNfc3RyKCksIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwgIlxuXG4jZW5kaWZcbiIpOworICAgIHJldHVybiAwOworfQorCitpbnQgQXBpR2VuOjpnZW5Db250ZXh0KGNvbnN0IHN0ZDo6c3RyaW5nICYgZmlsZW5hbWUsIFNpZGVUeXBlIHNpZGUpCit7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAid3QiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHJpbnRIZWFkZXIoZnApOworCisgICAgZnByaW50ZihmcCwgIiNpZm5kZWYgX18lc18lc19jb250ZXh0X3RfaFxuIiwgbV9iYXNlbmFtZS5jX3N0cigpLCBzaWRlU3RyaW5nKHNpZGUpKTsKKyAgICBmcHJpbnRmKGZwLCAiI2RlZmluZSBfXyVzXyVzX2NvbnRleHRfdF9oXG4iLCBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworCisgICAgZnByaW50ZihmcCwgIlxuI2luY2x1ZGUgXCIlc18lc19wcm9jLmhcIlxuIiwKKyAgICAgICAgICAgIG1fYmFzZW5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIHNpZGUgPT0gQ0xJRU5UX1NJREUgPyAiY2xpZW50IiA6ICJzZXJ2ZXIiKTsKKyAgICBmcHJpbnRmKGZwLCAiXG4jaW5jbHVkZSBcIiVzX3R5cGVzLmhcIlxuIiwgbV9iYXNlbmFtZS5jX3N0cigpKTsKKworICAgIFN0cmluZ1ZlYyAmIGNvbnRleHRIZWFkZXJzID0gc2lkZSA9PSBDTElFTlRfU0lERSA/IG1fY2xpZW50Q29udGV4dEhlYWRlcnMgOiBtX3NlcnZlckNvbnRleHRIZWFkZXJzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGV4dEhlYWRlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlICVzXG4iLCBjb250ZXh0SGVhZGVyc1tpXS5jX3N0cigpKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIlxuIik7CisKKyAgICBmcHJpbnRmKGZwLCAiXG5zdHJ1Y3QgJXNfJXNfY29udGV4dF90IHtcblxuIiwKKyAgICAgICAgICAgIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhzaWRlKSk7CisKKyAgICAvLyBBUEkgZW50cnkgcG9pbnRzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBFbnRyeVBvaW50ICplID0gJmF0KGkpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHQlc18lc19wcm9jX3QgJXM7XG4iLCBlLT5uYW1lKCkuY19zdHIoKSwgc2lkZVN0cmluZyhzaWRlKSwgZS0+bmFtZSgpLmNfc3RyKCkpOworICAgIH0KKworICAgIC8vIHZpcnR1YWwgZGVzdHJ1Y3RvcgorICAgIGZwcmludGYoZnAsICJcdHZpcnR1YWwgfiVzXyVzX2NvbnRleHRfdCgpIHt9XG4iLCBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgIC8vIGFjY2Vzc29yCisgICAgaWYgKHNpZGUgPT0gQ0xJRU5UX1NJREUgfHwgc2lkZSA9PSBXUkFQUEVSX1NJREUpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIlxuXHR0eXBlZGVmICVzXyVzX2NvbnRleHRfdCAqQ09OVEVYVF9BQ0NFU1NPUl9UWVBFKHZvaWQpO1xuIiwKKyAgICAgICAgICAgICAgICBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdGF0aWMgdm9pZCBzZXRDb250ZXh0QWNjZXNzb3IoQ09OVEVYVF9BQ0NFU1NPUl9UWVBFICpmKTtcbiIpOworICAgIH0KKworICAgIC8vIGluaXQgZnVuY3Rpb24KKyAgICBmcHJpbnRmKGZwLCAiXHRpbnQgaW5pdERpc3BhdGNoQnlOYW1lKCB2b2lkICooKmdldFByb2MpKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnVzZXJEYXRhKSwgdm9pZCAqdXNlckRhdGEpO1xuIik7CisKKyAgICAvL2NsaWVudCBzaXRlIHNldCBlcnJvciB2aXJ0dWFsIGZ1bmMKKyAgICBpZiAoc2lkZSA9PSBDTElFTlRfU0lERSkgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHR2aXJ0dWFsIHZvaWQgc2V0RXJyb3IodW5zaWduZWQgaW50ICBlcnJvcil7ICh2b2lkKWVycm9yOyB9O1xuIik7CisgICAgICAgIGZwcmludGYoZnAsICJcdHZpcnR1YWwgdW5zaWduZWQgaW50IGdldEVycm9yKCl7IHJldHVybiAwOyB9O1xuIik7CisgICAgfQorCisgICAgZnByaW50ZihmcCwgIn07XG4iKTsKKworICAgIGZwcmludGYoZnAsICJcbiNlbmRpZlxuIik7CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFwaUdlbjo6Z2VuRW50cnlQb2ludHMoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlbmFtZSwgU2lkZVR5cGUgc2lkZSkKK3sKKworICAgIGlmIChzaWRlICE9IENMSUVOVF9TSURFICYmIHNpZGUgIT0gV1JBUFBFUl9TSURFKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRW50cnkgcG9pbnRzIGFyZSBvbmx5IGRlZmluZWQgZm9yIENsaWVudCBhbmQgV3JhcHBlciBjb21wb25lbnRzXG4iKTsKKyAgICAgICAgcmV0dXJuIC05OTk7CisgICAgfQorCisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLmNfc3RyKCksICJ3dCIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgIH0KKworICAgIHByaW50SGVhZGVyKGZwKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgPHN0ZGlvLmg+XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgPHN0ZGxpYi5oPlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiJXNfJXNfY29udGV4dC5oXCJcbiIsIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhzaWRlKSk7CisgICAgZnByaW50ZihmcCwgIlxuIik7CisKKyAgICBmcHJpbnRmKGZwLCAiI2lmbmRlZiBHTF9UUlVFXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiZXh0ZXJuIFwiQ1wiIHtcbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHQiKTsgYXQoaSkucHJpbnQoZnAsIGZhbHNlKTsgZnByaW50ZihmcCwgIjtcbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAifTtcblxuIik7CisgICAgZnByaW50ZihmcCwgIiNlbmRpZlxuIik7CisKKyAgICBmcHJpbnRmKGZwLCAiI2lmbmRlZiBHRVRfQ09OVEVYVFxuIik7CisgICAgZnByaW50ZihmcCwgInN0YXRpYyAlc18lc19jb250ZXh0X3Q6OkNPTlRFWFRfQUNDRVNTT1JfVFlQRSAqZ2V0Q3VycmVudENvbnRleHQgPSBOVUxMO1xuIiwKKyAgICAgICAgICAgIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhzaWRlKSk7CisKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgInZvaWQgJXNfJXNfY29udGV4dF90OjpzZXRDb250ZXh0QWNjZXNzb3IoQ09OVEVYVF9BQ0NFU1NPUl9UWVBFICpmKSB7IGdldEN1cnJlbnRDb250ZXh0ID0gZjsgfVxuIiwKKyAgICAgICAgICAgIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhzaWRlKSk7CisgICAgZnByaW50ZihmcCwgIiNkZWZpbmUgR0VUX0NPTlRFWFQgJXNfJXNfY29udGV4dF90ICogY3R4ID0gZ2V0Q3VycmVudENvbnRleHQoKVxuIiwKKyAgICAgICAgICAgICAgICBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgIGZwcmludGYoZnAsICIjZW5kaWZcblxuIik7CisKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRW50cnlQb2ludCAqZSA9ICZhdChpKTsKKyAgICAgICAgZS0+cHJpbnQoZnApOworICAgICAgICBmcHJpbnRmKGZwLCAie1xuIik7CisgICAgICAgIGZwcmludGYoZnAsICJcdEdFVF9DT05URVhUO1xuIik7CisKKyAgICAgICAgYm9vbCBzaG91bGRSZXR1cm4gPSAhZS0+cmV0dmFsKCkuaXNWb2lkKCk7CisgICAgICAgIGJvb2wgc2hvdWxkQ2FsbFdpdGhDb250ZXh0ID0gKHNpZGUgPT0gQ0xJRU5UX1NJREUpOworICAgICAgICAvL3BhcmFtIGNoZWNrCisgICAgICAgIGlmIChzaG91bGRDYWxsV2l0aENvbnRleHQpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGo9MDsgajxlLT52YXJzKCkuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZS0+dmFycygpW2pdLnBhcmFtQ2hlY2tFeHByZXNzaW9uKCkgIT0gIiIpCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdCVzXG4iLCBlLT52YXJzKClbal0ucGFyYW1DaGVja0V4cHJlc3Npb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiXHQlc2N0eC0+JXMoJXMiLAorICAgICAgICAgICAgICAgIHNob3VsZFJldHVybiA/ICJyZXR1cm4gIiA6ICIiLAorICAgICAgICAgICAgICAgIGUtPm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIHNob3VsZENhbGxXaXRoQ29udGV4dCA/ICJjdHgiIDogIiIpOworICAgICAgICBzaXplX3QgbnZhcnMgPSBlLT52YXJzKCkuc2l6ZSgpOworCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnZhcnM7IGorKykgeworICAgICAgICAgICAgaWYgKCFlLT52YXJzKClbal0uaXNWb2lkKCkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaiAhPSAwIHx8IHNob3VsZENhbGxXaXRoQ29udGV4dCA/ICIsIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZS0+dmFycygpW2pdLm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiKTtcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAifVxuXG4iKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgQXBpR2VuOjpnZW5PcGNvZGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSkKK3sKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLmNfc3RyKCksICJ3dCIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgIH0KKworICAgIHByaW50SGVhZGVyKGZwKTsKKyAgICBmcHJpbnRmKGZwLCAiI2lmbmRlZiBfX0dVQVJEXyVzX29wY29kZXNfaF9cbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwgIiNkZWZpbmUgX19HVUFSRF8lc19vcGNvZGVzX2hfXG5cbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAiI2RlZmluZSBPUF8lcyBcdFx0XHRcdFx0JXVcbiIsIGF0KGkpLm5hbWUoKS5jX3N0cigpLCAodW5zaWduZWQgaW50KWkgKyBtX2Jhc2VPcGNvZGUpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiI2RlZmluZSBPUF9sYXN0IFx0XHRcdFx0XHQldVxuIiwgKHVuc2lnbmVkIGludClzaXplKCkgKyBtX2Jhc2VPcGNvZGUpOworICAgIGZwcmludGYoZnAsIlxuXG4jZW5kaWZcbiIpOworICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIDA7CisKK30KK2ludCBBcGlHZW46OmdlbkF0dHJpYnV0ZXNUZW1wbGF0ZShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUgKQoreworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUuY19zdHIoKSwgInd0Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoYXQoaSkuaGFzUG9pbnRlcnMoKSkgeworICAgICAgICAgICAgZnByaW50ZihmcCwgIiMiKTsKKyAgICAgICAgICAgIGF0KGkpLnByaW50KGZwKTsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIlc1xuXG4iLCBhdChpKS5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFwaUdlbjo6Z2VuRW5jb2RlckhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAid3QiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcmludEhlYWRlcihmcCk7CisgICAgc3RkOjpzdHJpbmcgY2xhc3NuYW1lID0gbV9iYXNlbmFtZSArICJfZW5jb2Rlcl9jb250ZXh0X3QiOworCisgICAgZnByaW50ZihmcCwgIlxuI2lmbmRlZiBHVUFSRF8lc1xuIiwgY2xhc3NuYW1lLmNfc3RyKCkpOworICAgIGZwcmludGYoZnAsICIjZGVmaW5lIEdVQVJEXyVzXG5cbiIsIGNsYXNzbmFtZS5jX3N0cigpKTsKKworICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSBcIklPU3RyZWFtLmhcIlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiQ2hlY2tzdW1DYWxjdWxhdG9yLmhcIlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiJXNfJXNfY29udGV4dC5oXCJcblxuXG4iLCBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoQ0xJRU5UX1NJREUpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9lbmNvZGVySGVhZGVycy5zaXplKCk7IGkrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgJXNcbiIsIG1fZW5jb2RlckhlYWRlcnNbaV0uY19zdHIoKSk7CisgICAgfQorICAgIGZwcmludGYoZnAsICJcbiIpOworCisgICAgZnByaW50ZihmcCwgInN0cnVjdCAlcyA6IHB1YmxpYyAlc18lc19jb250ZXh0X3Qge1xuXG4iLAorICAgICAgICAgICAgY2xhc3NuYW1lLmNfc3RyKCksIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhDTElFTlRfU0lERSkpOworICAgIGZwcmludGYoZnAsICJcdElPU3RyZWFtICptX3N0cmVhbTtcbiIpOworICAgIGZwcmludGYoZnAsICJcdENoZWNrc3VtQ2FsY3VsYXRvciAqbV9jaGVja3N1bUNhbGN1bGF0b3I7XG5cbiIpOworCisgICAgZnByaW50ZihmcCwgIlx0JXMoSU9TdHJlYW0gKnN0cmVhbSwgQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IpO1xuIiwgY2xhc3NuYW1lLmNfc3RyKCkpOworICAgIGZwcmludGYoZnAsICJ9O1xuXG4iKTsKKworICAgIGZwcmludGYoZnAsICIjZW5kaWYgIC8vIEdVQVJEXyVzIiwgY2xhc3NuYW1lLmNfc3RyKCkpOworCisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gRm9ybWF0IHRoZSBieXRlIGxlbmd0aCBleHByZXNzaW9uIGZvciBhIGdpdmVuIHZhcmlhYmxlIGludG8gYSB1c2VyLXByb3ZpZGVkIGJ1ZmZlcgorLy8gSWYgdGhlIHZhcmlhYmxlIHR5cGUgaXMgbm90IGEgcG9pbnRlciwgdGhpcyBpcyBzaW1wbHkgaXRzIHNpemUgYXMgYSBkZWNpbWFsIGNvbnN0YW50CisvLyBJZiB0aGUgdmFyaWFibGUgaXMgYSBwb2ludGVyLCB0aGlzIHdpbGwgYmUgYW4gZXhwcmVzc2lvbiBwcm92aWRlZCBieSB0aGUgLmF0dHJpYiBmaWxlCisvLyB0aHJvdWdoIHRoZSAnbGVuJyBhdHRyaWJ1dGUuCisvLworLy8gUmV0dXJucyAxIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIsIDAgb3RoZXJ3aXNlCisvLworc3RhdGljIGludCBnZXRWYXJFbmNvZGluZ1NpemVFeHByZXNzaW9uKFZhciYgIHZhciwgRW50cnlQb2ludCogZSwgY2hhciogYnVmZiwgc2l6ZV90IGJ1ZmZsZW4pCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKCF2YXIuaXNQb2ludGVyKCkpIHsKKyAgICAgICAgc25wcmludGYoYnVmZiwgYnVmZmxlbiwgIiV1IiwgKHVuc2lnbmVkIGludCkgdmFyLnR5cGUoKS0+Ynl0ZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgY29uc3QgY2hhciogbGVuRXhwciA9IHZhci5sZW5FeHByZXNzaW9uKCkuY19zdHIoKTsKKyAgICAgICAgY29uc3QgY2hhciogdmFybmFtZSA9IHZhci5uYW1lKCkuY19zdHIoKTsKKyAgICAgICAgaWYgKGUgIT0gTlVMTCAmJiBsZW5FeHByWzBdID09ICdcMCcpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGRhdGEgbGVuIGlzIHVuZGVmaW5lZCBmb3IgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSgpLmNfc3RyKCksIHZhcm5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YXIubnVsbEFsbG93ZWQoKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZiwgYnVmZmxlbiwgIigoJXMgIT0gTlVMTCkgPyAlcyA6IDApIiwgdmFybmFtZSwgbGVuRXhwcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmLCBidWZmbGVuLCAiJXMiLCBsZW5FeHByKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdyaXRlVmFyRW5jb2RpbmdTaXplKFZhciYgdmFyLCBib29sIGluY2x1ZGVPdXQsIEZJTEUqIGZwKQoreworICAgIGludCByZXQgPSAwOworICAgIGlmICghdmFyLmlzUG9pbnRlcigpKSB7CisgICAgICAgIGZwcmludGYoZnAsICIldSIsICh1bnNpZ25lZCBpbnQpIHZhci50eXBlKCktPmJ5dGVzKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGlmICh2YXIucG9pbnRlckRpcigpID09IFZhcjo6UE9JTlRFUl9PVVQgJiYgIWluY2x1ZGVPdXQpIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIwIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiX19zaXplXyVzIiwgdmFyLm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHZvaWQgd3JpdGVWYXJFbmNvZGluZ0V4cHJlc3Npb24oVmFyJiB2YXIsIEZJTEUqIGZwKQoreworICAgIGNvbnN0IGNoYXIqIHZhcm5hbWUgPSB2YXIubmFtZSgpLmNfc3RyKCk7CisKKyAgICBpZiAodmFyLmlzUG9pbnRlcigpKSB7CisgICAgICAgIC8vIGVuY29kZSBhIHBvaW50ZXIgaGVhZGVyCisgICAgICAgIGZwcmludGYoZnAsICJcdCoodW5zaWduZWQgaW50ICopKHB0cikgPSBfX3NpemVfJXM7IHB0ciArPSA0O1xuIiwgdmFybmFtZSk7CisKKyAgICAgICAgVmFyOjpQb2ludGVyRGlyIGRpciA9IHZhci5wb2ludGVyRGlyKCk7CisgICAgICAgIGlmIChkaXIgPT0gVmFyOjpQT0lOVEVSX0lOT1VUIHx8IGRpciA9PSBWYXI6OlBPSU5URVJfSU4pIHsKKyAgICAgICAgICAgIGlmICh2YXIubnVsbEFsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGlmICglcyAhPSBOVUxMKSAiLCB2YXJuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2YXIucGFja0V4cHJlc3Npb24oKS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIlczsiLCB2YXIucGFja0V4cHJlc3Npb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIm1lbWNweShwdHIsICVzLCBfX3NpemVfJXMpOyIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJuYW1lLCB2YXJuYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnByaW50ZihmcCwgInB0ciArPSBfX3NpemVfJXM7XG4iLCB2YXJuYW1lKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGVuY29kZSBhIG5vbiBwb2ludGVyIHZhcmlhYmxlCisgICAgICAgIGlmICghdmFyLmlzVm9pZCgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdG1lbWNweShwdHIsICYlcywgJXUpOyBwdHIgKz0gJXU7XG4iLAorICAgICAgICAgICAgICAgICAgICB2YXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpIHZhci50eXBlKCktPmJ5dGVzKCksCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgdmFyLnR5cGUoKS0+Ynl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZiBXSVRIX0xBUkdFX1NVUFBPUlQKK3N0YXRpYyB2b2lkIHdyaXRlVmFyTGFyZ2VFbmNvZGluZ0V4cHJlc3Npb24oVmFyJiB2YXIsIEZJTEUqIGZwKQoreworICAgIGNvbnN0IGNoYXIqIHZhcm5hbWUgPSB2YXIubmFtZSgpLmNfc3RyKCk7CisKKyAgICBmcHJpbnRmKGZwLCAiXHRzdHJlYW0tPndyaXRlRnVsbHkoJl9fc2l6ZV8lcyw0KTtcbiIsIHZhcm5hbWUpOworICAgIGZwcmludGYoZnAsICJcdGlmICh1c2VDaGVja3N1bSkgY2hlY2tzdW1DYWxjdWxhdG9yLT5hZGRCdWZmZXIoJl9fc2l6ZV8lcyw0KTtcbiIsIHZhcm5hbWUpOworICAgIGlmICh2YXIubnVsbEFsbG93ZWQoKSkgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHRpZiAoJXMgIT0gTlVMTCkge1xuIiwgdmFybmFtZSk7CisgICAgfQorICAgIGlmICh2YXIud3JpdGVFeHByZXNzaW9uKCkgIT0gIiIpIHsKKyAgICAgICAgZnByaW50ZihmcCwgIiVzIiwgdmFyLndyaXRlRXhwcmVzc2lvbigpLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoZnAsICJcdFx0c3RyZWFtLT53cml0ZUZ1bGx5KCVzLCBfX3NpemVfJXMpO1xuIiwgdmFybmFtZSwgdmFybmFtZSk7CisgICAgICAgIGZwcmludGYoZnAsICJcdFx0aWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPmFkZEJ1ZmZlciglcywgX19zaXplXyVzKTtcbiIsIHZhcm5hbWUsIHZhcm5hbWUpOworICAgIH0KKyAgICBpZiAodmFyLm51bGxBbGxvd2VkKCkpIGZwcmludGYoZnAsICJcdH1cbiIpOworfQorI2VuZGlmIC8qIFdJVEhfTEFSR0VfU1VQUE9SVCAqLworCitzdGF0aWMgdm9pZCB3cml0ZUVuY29kaW5nQ2hlY2tzdW1WYWxpZGF0b3JPblJldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgRklMRSogZnApIHsKKyAgICBmcHJpbnRmKGZwLCAiXHRpZiAodXNlQ2hlY2tzdW0pIHtcbiIKKyAgICAgICAgICAgICAgICAiXHRcdHVuc2lnbmVkIGNoYXIgKmNoZWNrc3VtQnVmUHRyID0gTlVMTDtcbiIKKyAgICAgICAgICAgICAgICAiXHRcdHVuc2lnbmVkIGNoYXIgY2hlY2tzdW1CdWZbQ2hlY2tzdW1DYWxjdWxhdG9yOjprTWF4Q2hlY2tzdW1TaXplXTtcbiIKKyAgICAgICAgICAgICAgICAiXHRcdGlmIChjaGVja3N1bVNpemUgPiAwKSBjaGVja3N1bUJ1ZlB0ciA9ICZjaGVja3N1bUJ1ZlswXTtcbiIKKyAgICAgICAgICAgICAgICAiXHRcdHN0cmVhbS0+cmVhZGJhY2soY2hlY2tzdW1CdWZQdHIsIGNoZWNrc3VtU2l6ZSk7XG4iCisgICAgICAgICAgICAgICAgIlx0XHRpZiAoIWNoZWNrc3VtQ2FsY3VsYXRvci0+dmFsaWRhdGUoY2hlY2tzdW1CdWZQdHIsIGNoZWNrc3VtU2l6ZSkpIHtcbiIKKyAgICAgICAgICAgICAgICAiXHRcdFx0QUxPR0UoXCIlczogR0wgY29tbXVuaWNhdGlvbiBlcnJvciwgcGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlIHRvIGIuYW5kcm9pZC5jb20uXFxuXCIpO1xuIgorICAgICAgICAgICAgICAgICJcdFx0XHRhYm9ydCgpO1xuIgorICAgICAgICAgICAgICAgICJcdFx0fVxuIgorICAgICAgICAgICAgICAgICJcdH1cbiIsCisgICAgICAgICAgICBmdW5jTmFtZQorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEd1ZXN0VGltZVByaW50aW5nKGNvbnN0IEVudHJ5UG9pbnQqIGUsIGJvb2wgaGFzVGltZUJlZm9yZVJlYWRiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogZnApIHsKKyNpZiBJTlNUUlVNRU5UX1RJTUlOR19HVUVTVAorICAgIGZwcmludGYoZnAsICJcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0czEpO1xuIik7CisgICAgZnByaW50ZihmcCwgIlx0bG9uZyB0aW1lRGlmZiA9IHRzMS50dl9zZWMqMTAwMDAwMCArIHRzMS50dl9uc2VjLzEwMDAgLSAodHMwLnR2X3NlYyoxMDAwMDAwICsgdHMwLnR2X25zZWMvMTAwMCk7XG4iKTsKKyAgICBpZiAoaGFzVGltZUJlZm9yZVJlYWRiYWNrKSB7CisgICAgICAgIGZwcmludGYoZnAsICJcdGxvbmcgdGltZURpZmYyID0gdHMxLnR2X3NlYyoxMDAwMDAwICsgdHMxLnR2X25zZWMvMTAwMCAtICh0czIudHZfc2VjKjEwMDAwMDAgKyB0czIudHZfbnNlYy8xMDAwKTtcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRBTE9HVyhcIiVzOiAlJWxkICglJWxkKSB1c1xcblwiLCB0aW1lRGlmZiwgdGltZURpZmYyKTtcbiIsIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHRBTE9HVyhcIiVzOiAlJWxkIHVzXFxuXCIsIHRpbWVEaWZmKTtcbiIsIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYKK30KKworaW50IEFwaUdlbjo6Z2VuRW5jb2RlckltcGwoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQoreworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUuY19zdHIoKSwgInd0Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpbnRIZWFkZXIoZnApOworICAgIGZwcmludGYoZnAsICJcblxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIDxzdHJpbmcuaD5cbiIpOworICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSBcIiVzX29wY29kZXMuaFwiXG5cbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiJXNfZW5jLmhcIlxuXG5cbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIDxzdGRpby5oPlxuXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAibmFtZXNwYWNlIHtcblxuIik7CisKKyAgICAvLyB1bnN1cHBvcnQgcHJpbnRvdXQKKyAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgInZvaWQgZW5jX3Vuc3VwcG9ydGVkKClcbiIKKyAgICAgICAgICAgICJ7XG4iCisgICAgICAgICAgICAiXHRBTE9HRShcIkZ1bmN0aW9uIGlzIHVuc3VwcG9ydGVkXFxuXCIpO1xuIgorICAgICAgICAgICAgIn1cblxuIik7CisKKyAgICAvLyBlbnRyeSBwb2ludHM7CisgICAgc3RkOjpzdHJpbmcgY2xhc3NuYW1lID0gbV9iYXNlbmFtZSArICJfZW5jb2Rlcl9jb250ZXh0X3QiOworCisgICAgc2l6ZV90IG4gPSBzaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgRW50cnlQb2ludCAqZSA9ICZhdChpKTsKKworICAgICAgICBpZiAoZS0+dW5zdXBwb3J0ZWQoKSkgY29udGludWU7CisKKyAgICAgICAgZS0+cHJpbnQoZnAsIHRydWUsICJfZW5jIiwgLyogY2xhc3NuYW1lICsgIjo6IiAqLyIiLCAidm9pZCAqc2VsZiIpOworICAgICAgICBmcHJpbnRmKGZwLCAie1xuIik7CisKKyNpZiBJTlNUUlVNRU5UX1RJTUlOR19HVUVTVAorICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdHJ1Y3QgdGltZXNwZWMgdHMwLCB0czE7XG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0Y2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzMCk7XG4iKTsKKyNlbmRpZgorCisvLyAgICAgIGZwcmludGYoZnAsICJcblx0REJHKFwiPj4+PiAlc1xcblwiKTtcbiIsIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlxuXHQlcyAqY3R4ID0gKCVzICopc2VsZjtcbiIsCisgICAgICAgICAgICAgICAgY2xhc3NuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgY2xhc3NuYW1lLmNfc3RyKCkpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRJT1N0cmVhbSAqc3RyZWFtID0gY3R4LT5tX3N0cmVhbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgIlx0Q2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IgPSBjdHgtPm1fY2hlY2tzdW1DYWxjdWxhdG9yO1xuIgorICAgICAgICAgICAgICAgICAgICAiXHRib29sIHVzZUNoZWNrc3VtID0gY2hlY2tzdW1DYWxjdWxhdG9yLT5nZXRWZXJzaW9uKCkgPiAwO1xuXG4iKTsKKyAgICAgICAgVmFyc0FycmF5ICYgZXZhcnMgPSBlLT52YXJzKCk7CisgICAgICAgIHNpemVfdCAgbWF4dmFycyA9IGV2YXJzLnNpemUoKTsKKyAgICAgICAgc2l6ZV90ICBqOworCisgICAgICAgIGNoYXIgICAgYnVmZlsyNTZdOworCisgICAgICAgIC8vIERlZmluZSB0aGUgX19zaXplX1hYWCB2YXJpYWJsZXMgdGhhdCBjb250YWluIHRoZSBzaXplIG9mIGRhdGEKKyAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvaW50ZXJzLgorICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4dmFyczsgaisrKSB7CisgICAgICAgICAgICBWYXImIHZhciA9IGV2YXJzW2pdOworCisgICAgICAgICAgICBpZiAoIXZhci5pc1BvaW50ZXIoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29uc3QgY2hhciogdmFybmFtZSA9IHZhci5uYW1lKCkuY19zdHIoKTsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGNvbnN0IHVuc2lnbmVkIGludCBfX3NpemVfJXMgPSAiLCB2YXJuYW1lKTsKKworICAgICAgICAgICAgZ2V0VmFyRW5jb2RpbmdTaXplRXhwcmVzc2lvbih2YXIsIGUsIGJ1ZmYsIHNpemVvZihidWZmKSk7CisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXM7XG4iLCBidWZmKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaGFzTGFyZ2VGaWVsZHMgPSBmYWxzZTsKKyNpZiBXSVRIX0xBUkdFX1NVUFBPUlQKKyAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIGNhcmUgb2YgJ2lzTGFyZ2UnIHZhcmlhYmxlIGluIGEgc3BlY2lhbCB3YXkKKyAgICAgICAgLy8gQW55dGhpbmcgYmVmb3JlIGFuIGlzTGFyZ2UgdmFyaWFibGUgY2FuIGJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlCisgICAgICAgIC8vIGJ1ZmZlciwgd2hpY2ggaXMgdGhlbiBjb21taXRlZC4gRWFjaCBpc0xhcmdlIHZhcmlhYmxlIGlzIGEgcG9pbnRlcgorICAgICAgICAvLyB0byBkYXRhIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gZGlyZWN0bHkgdGhyb3VnaCB0aGUgcGlwZSwgd2hpY2gKKyAgICAgICAgLy8gd2lsbCBiZSBpbnN0YW50IHdoZW4gdXNpbmcgYSBRRU1VIHBpcGUKKworICAgICAgICBzaXplX3QgIG52YXJzICAgPSAwOworICAgICAgICBzaXplX3QgIG5wb2ludGVycyA9IDA7CisKKyAgICAgICAgLy8gRmlyc3QsIGNvbXB1dGUgdGhlIHRvdGFsIHNpemUsIDggYnl0ZXMgZm9yIHRoZSBvcGNvZGUgKyBwYXlsb2FkIHNpemUgKHdpdGhvdXQgY2hlY2tzdW0pCisgICAgICAgIGZwcmludGYoZnAsICJcdCB1bnNpZ25lZCBjaGFyICpwdHI7XG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0IHVuc2lnbmVkIGNoYXIgKmJ1ZjtcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHQgY29uc3Qgc2l6ZV90IHNpemVXaXRob3V0Q2hlY2tzdW0gPSA4Iik7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heHZhcnM7IGorKykgeworICAgICAgICAgICAgZnByaW50ZihmcCwgIiArICIpOworICAgICAgICAgICAgbnBvaW50ZXJzICs9IHdyaXRlVmFyRW5jb2RpbmdTaXplKGV2YXJzW2pdLCBmYWxzZSwgZnApOworICAgICAgICB9CisgICAgICAgIGlmIChucG9pbnRlcnMgPiAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICsgJXp1KjQiLCBucG9pbnRlcnMpOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICI7XG4iKTsKKworICAgICAgICAvLyBUaGVuLCBzaXplIG9mIHRoZSBjaGVja3N1bSBzdHJpbmcKKyAgICAgICAgZnByaW50ZihmcCwgIlx0IGNvbnN0IHNpemVfdCBjaGVja3N1bVNpemUgPSBjaGVja3N1bUNhbGN1bGF0b3ItPmNoZWNrc3VtQnl0ZVNpemUoKTtcbiIpOworCisgICAgICAgIC8vIEFuZCwgc2l6ZSBvZiB0aGUgd2hvbGUgdGhpbmcKKyAgICAgICAgZnByaW50ZihmcCwgIlx0IGNvbnN0IHNpemVfdCB0b3RhbFNpemUgPSBzaXplV2l0aG91dENoZWNrc3VtICsgY2hlY2tzdW1TaXplO1xuIik7CisKKyAgICAgICAgLy8gV2UgbmVlZCB0byBkaXZpZGUgdGhlIHBhY2tldCBpbnRvIGZyYWdtZW50cy4gRWFjaCBmcmFnbWVudCBjb250YWlucworICAgICAgICAvLyBlaXRoZXIgY29waWVkIGFyZ3VtZW50cyB0byBhIHRlbXBvcmFyeSBidWZmZXIsIG9yIGRpcmVjdCB3cml0ZXMgZm9yCisgICAgICAgIC8vIGxhcmdlIHZhcmlhYmxlcy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGZpcnN0IGZyYWdtZW50IG11c3QgYWxzbyBjb250YWluIHRoZSBvcGNvZGUrcGF5bG9hZF9zaXplK2NoZWNrc3VtX3NpemUKKyAgICAgICAgLy8KKyAgICAgICAgbnZhcnMgPSAwOworICAgICAgICB3aGlsZSAobnZhcnMgPCBtYXh2YXJzIHx8IG1heHZhcnMgPT0gMCkgeworCisgICAgICAgICAgICAvLyBTa2lwIG92ZXIgbm9uLWxhcmdlIGZpZWxkcworICAgICAgICAgICAgZm9yIChqID0gbnZhcnM7IGogPCBtYXh2YXJzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZhcnNbal0uaXNMYXJnZSgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV3JpdGUgYSBmcmFnbWVudCBpZiBuZWVkZWQuCisgICAgICAgICAgICBpZiAobnZhcnMgPT0gMCB8fCBqID4gbnZhcnMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwbHVzID0gIiI7CisKKyAgICAgICAgICAgICAgICBpZiAobnZhcnMgPT0gMCAmJiBqID09IG1heHZhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlIHNob3J0Y3V0IGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgd2UgZG9uJ3QgaGF2ZSBsYXJnZSB2YXJpYWJsZXM7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGJ1ZiA9IHN0cmVhbS0+YWxsb2ModG90YWxTaXplKTtcbiIpOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzTGFyZ2VGaWVsZHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIgZnJvbSB0aGUgc3RyZWFtIHVudGlsIHRoZSBmaXJzdCBsYXJnZSB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRidWYgPSBzdHJlYW0tPmFsbG9jKCIpOworICAgICAgICAgICAgICAgICAgICBwbHVzID0gIiI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG52YXJzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsIjgiKTsgcGx1cyA9ICIgKyAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChqID4gbnZhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5wb2ludGVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBudmFyczsgaiA8IG1heHZhcnMgJiYgIWV2YXJzW2pdLmlzTGFyZ2UoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzIiwgcGx1cyk7IHBsdXMgPSAiICsgIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBucG9pbnRlcnMgKz0gd3JpdGVWYXJFbmNvZGluZ1NpemUoZXZhcnNbal0sIHRydWUsIGZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucG9pbnRlcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzJXp1KjQiLCBwbHVzLCBucG9pbnRlcnMpOyBwbHVzID0gIiArICI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwiKTtcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRwdHIgPSBidWY7XG4iKTsKKworICAgICAgICAgICAgICAgIC8vIGVuY29kZSBwYWNrZXQgaGVhZGVyIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBpZiAobnZhcnMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRpbnQgdG1wID0gT1BfJXM7bWVtY3B5KHB0ciwgJnRtcCwgNCk7IHB0ciArPSA0O1xuIiwgIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0bWVtY3B5KHB0ciwgJnRvdGFsU2l6ZSwgNCk7ICBwdHIgKz0gNDtcblxuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1heHZhcnMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG5cdGlmICh1c2VDaGVja3N1bSkgY2hlY2tzdW1DYWxjdWxhdG9yLT5hZGRCdWZmZXIoYnVmLCBwdHItYnVmKTtcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBlbmNvZGUgbm9uLWxhcmdlIGZpZWxkcyBpbiB0aGlzIGZyYWdtZW50CisgICAgICAgICAgICAgICAgZm9yIChqID0gbnZhcnM7IGogPCBtYXh2YXJzICYmICFldmFyc1tqXS5pc0xhcmdlKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICB3cml0ZVZhckVuY29kaW5nRXhwcmVzc2lvbihldmFyc1tqXSxmcCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuXHRpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKGJ1ZiwgcHRyLWJ1Zik7XG4iKTsKKyAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGZyYWdtZW50IGlzIGNvbW1pdGVkIGlmIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGFyZ2UgdmFyaWFibGUKKyAgICAgICAgICAgICAgICBpZiAoaiA8IG1heHZhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0c3RyZWFtLT5mbHVzaCgpO1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG9uZSBvciBtb3JlIGxhcmdlIHZhcmlhYmxlcywgd3JpdGUgdGhlbSBkaXJlY3RseS4KKyAgICAgICAgICAgIC8vIEFzIHNpemUgKyBkYXRhCisgICAgICAgICAgICBmb3IgKCA7IGogPCBtYXh2YXJzICYmIGV2YXJzW2pdLmlzTGFyZ2UoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgd3JpdGVWYXJMYXJnZUVuY29kaW5nRXhwcmVzc2lvbihldmFyc1tqXSwgZnApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudmFycyA9IGo7CisgICAgICAgIH0KKworI2Vsc2UgLyogIVdJVEhfTEFSR0VfU1VQUE9SVCAqLworICAgICAgICBzaXplX3QgbnZhcnMgPSBldmFycy5zaXplKCk7CisgICAgICAgIHNpemVfdCBucG9pbnRlcnMgPSAwOworICAgICAgICBmcHJpbnRmKGZwLCAiXHQgY29uc3Qgc2l6ZV90IHNpemVXaXRob3V0Q2hlY2tzdW0gPSA4Iik7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnZhcnM7IGorKykgeworICAgICAgICAgICAgbnBvaW50ZXJzICs9IGdldFZhckVuY29kaW5nU2l6ZUV4cHJlc3Npb24oZXZhcnNbal0sZSxidWZmLHNpemVvZihidWZmKSk7CisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICsgJXMiLCBidWZmKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiICsgJXUgKiA0O1xuIiwgKHVuc2lnbmVkIGludCkgbnBvaW50ZXJzKTsKKyAgICAgICAgLy8gU2l6ZSBvZiBjaGVja3N1bQorICAgICAgICBmcHJpbnRmKGZwLCAiXHQgY29uc3Qgc2l6ZV90IGNoZWNrc3VtU2l6ZSA9IGNoZWNrc3VtQ2FsY3VsYXRvci0+Y2hlY2tzdW1CeXRlU2l6ZSgpO1xuIik7CisgICAgICAgIC8vIFNpemUgb2YgdGhlIHdob2xlIHRoaW5nCisgICAgICAgIGZwcmludGYoZnAsICJcdCBjb25zdCBzaXplX3QgdG90YWxTaXplID0gc2l6ZVdpdGhvdXRDaGVja3N1bSArIGNoZWNrc3VtU2l6ZTtcbiIpOworCisgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBmcm9tIHRoZSBzdHJlYW07CisgICAgICAgIGZwcmludGYoZnAsICJcdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBzdHJlYW0tPmFsbG9jKHNpemVXaXRob3V0Q2hlY2tzdW0pO1xuXG4iKTsKKworICAgICAgICAvLyBlbmNvZGUgaW50byB0aGUgc3RyZWFtOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRpbnQgdG1wID0gT1BfJXM7IG1lbWNweShwdHIsICZ0bXAsIDQpOyBwdHIgKz0gNDtcbiIsICBlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGZwcmludGYoZnAsICJcdG1lbWNweShwdHIsICZzaXplV2l0aG91dENoZWNrc3VtLCA0KTsgIHB0ciArPSA0O1xuXG4iKTsKKworICAgICAgICAvLyBvdXQgdmFyaWFibGVzCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbnZhcnM7IGorKykgeworICAgICAgICAgICAgd3JpdGVWYXJFbmNvZGluZ0V4cHJlc3Npb24oZXZhcnNbal0sIGZwKTsKKyAgICAgICAgfQorI2VuZGlmIC8qICFXSVRIX0xBUkdFX1NVUFBPUlQgKi8KKworICAgICAgICAvLyBjaGVja3N1bQorICAgICAgICBpZiAoaGFzTGFyZ2VGaWVsZHMpIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGJ1ZiA9IHN0cmVhbS0+YWxsb2MoY2hlY2tzdW1TaXplKTtcbiIpOworICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0aWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPndyaXRlQ2hlY2tzdW0oYnVmLCBjaGVja3N1bVNpemUpO1xuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGlmICh1c2VDaGVja3N1bSkgY2hlY2tzdW1DYWxjdWxhdG9yLT53cml0ZUNoZWNrc3VtKHB0ciwgY2hlY2tzdW1TaXplKTsgcHRyICs9IGNoZWNrc3VtU2l6ZTtcblxuIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbiB2YXJpYWJsZXM7CisgICAgICAgIGJvb2wgaGFzVGltZUJlZm9yZVJlYWRiYWNrID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzUmVhZGJhY2tDaGVja3N1bSA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG52YXJzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChldmFyc1tqXS5pc1BvaW50ZXIoKSkgeworICAgICAgICAgICAgICAgIFZhcjo6UG9pbnRlckRpciBkaXIgPSBldmFyc1tqXS5wb2ludGVyRGlyKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBWYXI6OlBPSU5URVJfSU5PVVQgfHwgZGlyID09IFZhcjo6UE9JTlRFUl9PVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFybmFtZSA9IGV2YXJzW2pdLm5hbWUoKS5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBpbmRlbnQgPSAiXHQiOworCisjaWYgSU5TVFJVTUVOVF9USU1JTkdfR1VFU1QKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNUaW1lQmVmb3JlUmVhZGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1RpbWVCZWZvcmVSZWFkYmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyBmbHVzaCB0aGUgc3RyZWFtIGJlZm9yZSBtZWFzdXJpbmcgdGhlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdHJlYW0tPmZsdXNoKCk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHN0cnVjdCB0aW1lc3BlYyB0czI7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0czIpO1xuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZiAoZXZhcnNbal0ubnVsbEFsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0aWYgKCVzICE9IE5VTEwpIHtcbiIsdmFybmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAiXHRcdCI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXNzdHJlYW0tPnJlYWRiYWNrKCVzLCBfX3NpemVfJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIHZhcm5hbWUsIHZhcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXNpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKCVzLCBfX3NpemVfJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIHZhcm5hbWUsIHZhcm5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXZhcnNbal0ubnVsbEFsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0fVxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFzUmVhZGJhY2tDaGVja3N1bSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisvL1hYWCAgICAgICBmcHJpbnRmKGZwLCAiXG5cdERCRyhcIjw8PDwgJXNcXG5cIik7XG4iLCBlLT5uYW1lKCkuY19zdHIoKSk7CisKKyAgICAgICAgLy8gdG9kbyAtIHJldHVybiB2YWx1ZSBmb3IgcG9pbnRlcnMKKyAgICAgICAgaWYgKGUtPnJldHZhbCgpLmlzUG9pbnRlcigpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICVzIDogcmV0dXJuIHZhbHVlIG9mIHBvaW50ZXIgaXMgdW5zdXBwb3J0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGlmIChlLT5mbHVzaE9uRW5jb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdHJlYW0tPmZsdXNoKCk7XG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEd1ZXN0VGltZVByaW50aW5nKGUsIGhhc1RpbWVCZWZvcmVSZWFkYmFjaywgZnApOworICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0IHJldHVybiBOVUxMO1xuIik7CisgICAgICAgIH0gZWxzZSBpZiAoZS0+cmV0dmFsKCkudHlwZSgpLT5uYW1lKCkgIT0gInZvaWQiKSB7CisjaWYgSU5TVFJVTUVOVF9USU1JTkdfR1VFU1QKKyAgICAgICAgICAgIGlmICghaGFzVGltZUJlZm9yZVJlYWRiYWNrKSB7CisgICAgICAgICAgICAgICAgaGFzVGltZUJlZm9yZVJlYWRiYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdHJlYW0tPmZsdXNoKCk7XG4iKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHRzdHJ1Y3QgdGltZXNwZWMgdHMyO1xuIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0Y2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzMik7XG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXG5cdCVzIHJldHZhbDtcbiIsIGUtPnJldHZhbCgpLnR5cGUoKS0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0c3RyZWFtLT5yZWFkYmFjaygmcmV0dmFsLCAldSk7XG4iLCh1bnNpZ25lZCkgZS0+cmV0dmFsKCkudHlwZSgpLT5ieXRlcygpKTsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdGlmICh1c2VDaGVja3N1bSkgY2hlY2tzdW1DYWxjdWxhdG9yLT5hZGRCdWZmZXIoJnJldHZhbCwgJXUpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSBlLT5yZXR2YWwoKS50eXBlKCktPmJ5dGVzKCkpOworICAgICAgICAgICAgd3JpdGVFbmNvZGluZ0NoZWNrc3VtVmFsaWRhdG9yT25SZXR1cm4oZS0+bmFtZSgpLmNfc3RyKCksIGZwKTsKKyAgICAgICAgICAgIGFkZEd1ZXN0VGltZVByaW50aW5nKGUsIGhhc1RpbWVCZWZvcmVSZWFkYmFjaywgZnApOworICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0cmV0dXJuIHJldHZhbDtcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGUtPmZsdXNoT25FbmNvZGUoKSkgZnByaW50ZihmcCwgIlx0c3RyZWFtLT5mbHVzaCgpO1xuIik7CisgICAgICAgICAgICBpZiAoaGFzUmVhZGJhY2tDaGVja3N1bSkgd3JpdGVFbmNvZGluZ0NoZWNrc3VtVmFsaWRhdG9yT25SZXR1cm4oZS0+bmFtZSgpLmNfc3RyKCksIGZwKTsKKyAgICAgICAgICAgIGFkZEd1ZXN0VGltZVByaW50aW5nKGUsIGhhc1RpbWVCZWZvcmVSZWFkYmFjaywgZnApOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZnAsICJ9XG5cbiIpOworICAgIH0KKworICAgIGZwcmludGYoZnAsICJ9ICAvLyBuYW1lc3BhY2VcblxuIik7CisKKyAgICAvLyBjb25zdHJ1Y3RvcgorICAgIGZwcmludGYoZnAsICIlczo6JXMoSU9TdHJlYW0gKnN0cmVhbSwgQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IpXG57XG4iLCBjbGFzc25hbWUuY19zdHIoKSwgY2xhc3NuYW1lLmNfc3RyKCkpOworICAgIGZwcmludGYoZnAsICJcdG1fc3RyZWFtID0gc3RyZWFtO1xuIik7CisgICAgZnByaW50ZihmcCwgIlx0bV9jaGVja3N1bUNhbGN1bGF0b3IgPSBjaGVja3N1bUNhbGN1bGF0b3I7XG5cbiIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgRW50cnlQb2ludCAqZSA9ICZhdChpKTsKKyAgICAgICAgaWYgKGUtPnVuc3VwcG9ydGVkKCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsIAorICAgICAgICAgICAgICAgICAgICAiXHR0aGlzLT4lcyA9ICglc18lc19wcm9jX3QpICZlbmNfdW5zdXBwb3J0ZWQ7XG4iLAorICAgICAgICAgICAgICAgICAgICBlLT5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIHNpZGVTdHJpbmcoQ0xJRU5UX1NJREUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICJcdHRoaXMtPiVzID0gJiVzX2VuYztcbiIsCisgICAgICAgICAgICAgICAgICAgIGUtPm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihmcCwgIn1cblxuIik7CisKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiAwOworfQorCisKK2ludCBBcGlHZW46OmdlbkRlY29kZXJIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKQoreworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUuY19zdHIoKSwgInd0Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpbnRIZWFkZXIoZnApOworICAgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZSA9IG1fYmFzZW5hbWUgKyAiX2RlY29kZXJfY29udGV4dF90IjsKKworICAgIGZwcmludGYoZnAsICJcbiNpZm5kZWYgR1VBUkRfJXNcbiIsIGNsYXNzbmFtZS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKGZwLCAiI2RlZmluZSBHVUFSRF8lc1xuXG4iLCBjbGFzc25hbWUuY19zdHIoKSk7CisKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJPcGVuZ2xSZW5kZXIvSU9TdHJlYW0uaFwiXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJDaGVja3N1bUNhbGN1bGF0b3IuaFwiXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCIlc18lc19jb250ZXh0LmhcIlxuXG5cbiIsIG1fYmFzZW5hbWUuY19zdHIoKSwgc2lkZVN0cmluZyhTRVJWRVJfU0lERSkpOworICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSBcImVtdWdsL2NvbW1vbi9sb2dnaW5nLmhcIlxuIik7CisjaWYgSU5TVFJVTUVOVF9USU1JTkdfSE9TVAorICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSBcInRpbWUuaFwiXG4iKTsKKyNlbmRpZgorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2RlY29kZXJIZWFkZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSAlc1xuIiwgbV9kZWNvZGVySGVhZGVyc1tpXS5jX3N0cigpKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIlxuIik7CisKKyAgICBmcHJpbnRmKGZwLCAic3RydWN0ICVzIDogcHVibGljICVzXyVzX2NvbnRleHRfdCB7XG5cbiIsCisgICAgICAgICAgICBjbGFzc25hbWUuY19zdHIoKSwgbV9iYXNlbmFtZS5jX3N0cigpLCBzaWRlU3RyaW5nKFNFUlZFUl9TSURFKSk7CisgICAgZnByaW50ZihmcCwgIlx0c2l6ZV90IGRlY29kZSh2b2lkICpidWYsIHNpemVfdCBidWZzaXplLCBJT1N0cmVhbSAqc3RyZWFtLCBDaGVja3N1bUNhbGN1bGF0b3IqIGNoZWNrc3VtQ2FsYyk7XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiXG59O1xuXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2VuZGlmICAvLyBHVUFSRF8lc1xuIiwgY2xhc3NuYW1lLmNfc3RyKCkpOworCisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFwaUdlbjo6Z2VuQ29udGV4dEltcGwoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBTaWRlVHlwZSBzaWRlKQoreworICAgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUuY19zdHIoKSwgInd0Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHByaW50SGVhZGVyKGZwKTsKKworICAgIHN0ZDo6c3RyaW5nIGNsYXNzbmFtZSA9IG1fYmFzZW5hbWUgKyAiXyIgKyBzaWRlU3RyaW5nKHNpZGUpICsgIl9jb250ZXh0X3QiOworICAgIHNpemVfdCBuID0gc2l6ZSgpOworICAgIGZwcmludGYoZnAsICJcblxuI2luY2x1ZGUgPHN0cmluZy5oPlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiJXNfJXNfY29udGV4dC5oXCJcblxuXG4iLCBtX2Jhc2VuYW1lLmNfc3RyKCksIHNpZGVTdHJpbmcoc2lkZSkpOworICAgIGZwcmludGYoZnAsICIjaW5jbHVkZSA8c3RkaW8uaD5cblxuIik7CisKKyAgICBmcHJpbnRmKGZwLCAiaW50ICVzOjppbml0RGlzcGF0Y2hCeU5hbWUodm9pZCAqKCpnZXRQcm9jKShjb25zdCBjaGFyICosIHZvaWQgKnVzZXJEYXRhKSwgdm9pZCAqdXNlckRhdGEpXG57XG4iLCBjbGFzc25hbWUuY19zdHIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgRW50cnlQb2ludCAqZSA9ICZhdChpKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0JXMgPSAoJXNfJXNfcHJvY190KSBnZXRQcm9jKFwiJXNcIiwgdXNlckRhdGEpO1xuIiwKKyAgICAgICAgICAgICAgICBlLT5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBlLT5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBzaWRlU3RyaW5nKHNpZGUpLAorICAgICAgICAgICAgICAgIGUtPm5hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIlx0cmV0dXJuIDA7XG4iKTsKKyAgICBmcHJpbnRmKGZwLCAifVxuXG4iKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiAwOworfQorCitpbnQgQXBpR2VuOjpnZW5EZWNvZGVySW1wbChjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAid3QiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcmludEhlYWRlcihmcCk7CisKKyAgICBzdGQ6OnN0cmluZyBjbGFzc25hbWUgPSBtX2Jhc2VuYW1lICsgIl9kZWNvZGVyX2NvbnRleHRfdCI7CisKKyAgICBzaXplX3QgbiA9IHNpemUoKTsKKworICAgIGJvb2wgY2hhbmdlc0NoZWNrc3VtID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBFbnRyeVBvaW50JiBlcCA9IGF0KGkpOworICAgICAgICBpZiAoZXAubmFtZSgpLmZpbmQoIlNlbGVjdENoZWNrc3VtIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNoYW5nZXNDaGVja3N1bSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZwcmludGYoZnAsICJcblxuI2luY2x1ZGUgPHN0cmluZy5oPlxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiJXNfb3Bjb2Rlcy5oXCJcblxuIiwgbV9iYXNlbmFtZS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCIlc19kZWMuaFwiXG5cblxuIiwgbV9iYXNlbmFtZS5jX3N0cigpKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJQcm90b2NvbFV0aWxzLmhcIlxuXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvLmhcIlxuXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgPHN0ZGlvLmg+XG5cbiIpOworICAgIGZwcmludGYoZnAsICJ0eXBlZGVmIHVuc2lnbmVkIGludCB0c2l6ZV90OyAvLyBUYXJnZXQgXCJzaXplX3RcIiwgd2hpY2ggaXMgMzItYml0IGZvciBub3cuIEl0IG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIGhvc3QncyBzaXplX3Qgd2hlbiBlbXVnZW4gaXMgY29tcGlsZWQuXG5cbiIpOworCisgICAgLy8gaGVscGVyIG1hY3JvcworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiI2lmZGVmIE9QRU5HTF9ERUJVR19QUklOVE9VVFxuIgorICAgICAgICAgICAgIiMgIGRlZmluZSBERUJVRyguLi4pIGRvIHsgaWYgKGVtdWdsX2N4dF9sb2dnZXIpIHsgZW11Z2xfY3h0X2xvZ2dlcihfX1ZBX0FSR1NfXyk7IH0gfSB3aGlsZSgwKVxuIgorICAgICAgICAgICAgIiNlbHNlXG4iCisgICAgICAgICAgICAiIyAgZGVmaW5lIERFQlVHKC4uLikgICgodm9pZCkwKVxuIgorICAgICAgICAgICAgIiNlbmRpZlxuXG4iKTsKKworICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAiI2lmZGVmIENIRUNLX0dMRVJST1JcbiIKKyAgICAgICAgICAgICIjICBkZWZpbmUgU0VUX0xBU1RDQUxMKG5hbWUpICBzcHJpbnRmKGxhc3RDYWxsLCAjbmFtZSlcbiIKKyAgICAgICAgICAgICIjZWxzZVxuIgorICAgICAgICAgICAgIiMgIGRlZmluZSBTRVRfTEFTVENBTEwobmFtZSkgICgodm9pZCkwKVxuIgorICAgICAgICAgICAgIiNlbmRpZlxuXG4iKTsKKworICAgIC8vIGhlbHBlciB0ZW1wbGF0ZXMKKyAgICBmcHJpbnRmKGZwLCAidXNpbmcgbmFtZXNwYWNlIGVtdWdsO1xuXG4iKTsKKworICAgIC8vIGRlY29kZXIgc3dpdGNoOworICAgIGZwcmludGYoZnAsICJzaXplX3QgJXM6OmRlY29kZSh2b2lkICpidWYsIHNpemVfdCBsZW4sIElPU3RyZWFtICpzdHJlYW0sIENoZWNrc3VtQ2FsY3VsYXRvciogY2hlY2tzdW1DYWxjKSB7XG4iLCBjbGFzc25hbWUuY19zdHIoKSk7CisgICAgZnByaW50ZihmcCwKKyJcdGlmIChsZW4gPCA4KSByZXR1cm4gMDsgXG5cCisjaWZkZWYgQ0hFQ0tfR0xfRVJST1JcblwKK1x0Y2hhciBsYXN0Q2FsbFsyNTZdID0gezB9O1xuXAorI2VuZGlmXG5cCitcdHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopYnVmO1xuXAorXHRjb25zdCB1bnNpZ25lZCBjaGFyKiBjb25zdCBlbmQgPSAoY29uc3QgdW5zaWduZWQgY2hhciopYnVmICsgbGVuO1xuIik7CisgICAgaWYgKCFjaGFuZ2VzQ2hlY2tzdW0pIHsKKyAgICAgICAgZnByaW50ZihmcCwKK1IiKCAgICBjb25zdCBzaXplX3QgY2hlY2tzdW1TaXplID0gY2hlY2tzdW1DYWxjLT5jaGVja3N1bUJ5dGVTaXplKCk7CisgICAgY29uc3QgYm9vbCB1c2VDaGVja3N1bSA9IGNoZWNrc3VtU2l6ZSA+IDA7CispIik7CisgICAgfQorICAgIGZwcmludGYoZnAsCisiXHR3aGlsZSAoZW5kIC0gcHRyID49IDgpIHtcblwKK1x0XHR1aW50MzJfdCBvcGNvZGUgPSAqKHVpbnQzMl90ICopcHRyOyAgIFxuXAorXHRcdGludDMyX3QgcGFja2V0TGVuID0gKihpbnQzMl90ICopKHB0ciArIDQpO1xuXAorXHRcdGlmIChlbmQgLSBwdHIgPCBwYWNrZXRMZW4pIHJldHVybiBwdHIgLSAodW5zaWduZWQgY2hhciopYnVmO1xuIik7CisgICAgaWYgKGNoYW5nZXNDaGVja3N1bSkgeworICAgICAgICBmcHJpbnRmKGZwLAorUiIoICAgICAgICAvLyBEbyB0aGlzIG9uIGV2ZXJ5IGl0ZXJhdGlvbiwgYXMgc29tZSBjb21tYW5kcyBtYXkgY2hhbmdlIHRoZSBjaGVja3N1bQorICAgICAgICAvLyBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICBjb25zdCBzaXplX3QgY2hlY2tzdW1TaXplID0gY2hlY2tzdW1DYWxjLT5jaGVja3N1bUJ5dGVTaXplKCk7CisgICAgICAgIGNvbnN0IGJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bVNpemUgPiAwOworKSIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAiXHRcdHN3aXRjaChvcGNvZGUpIHtcbiIpOworCisgICAgZm9yIChzaXplX3QgZiA9IDA7IGYgPCBuOyBmKyspIHsKKyAgICAgICAgZW51bSBQYXNzX3QgeworICAgICAgICAgICAgUEFTU19GSVJTVCA9IDAsCisgICAgICAgICAgICBQQVNTX1ZhcmlhYmxlRGVjbGFyYXRpb25zID0gUEFTU19GSVJTVCwKKyAgICAgICAgICAgIFBBU1NfUHJvdG9jb2wsCisgICAgICAgICAgICBQQVNTX1RtcEJ1ZmZBbGxvYywKKyAgICAgICAgICAgIFBBU1NfTWVtQWxsb2MsCisgICAgICAgICAgICBQQVNTX0RlYnVnUHJpbnQsCisgICAgICAgICAgICBQQVNTX0Z1bmN0aW9uQ2FsbCwKKyAgICAgICAgICAgIFBBU1NfRmx1c2hPdXRwdXQsCisgICAgICAgICAgICBQQVNTX0VwaWxvZywKKyAgICAgICAgICAgIFBBU1NfTEFTVCB9OworICAgICAgICBFbnRyeVBvaW50ICplID0gJigqdGhpcylbZl07CisKKyAgICAgICAgLy8gY29uc3RydWN0IGEgcHJpbnRvdXQgc3RyaW5nOworICAgICAgICBzdGQ6OnN0cmluZyBwcmludFN0cmluZzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlLT52YXJzKCkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFZhciAqdiA9ICZlLT52YXJzKClbaV07CisgICAgICAgICAgICBpZiAoIXYtPmlzVm9pZCgpKSAgcHJpbnRTdHJpbmcgKz0gKHYtPmlzUG9pbnRlcigpID8gIiVwKCV1KSIgOiB2LT50eXBlKCktPnByaW50Rm9ybWF0KCkpICsgIiAiOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyAtIGFkZCBmb3IgcmV0dXJuIHZhbHVlOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdGNhc2UgT1BfJXM6IHtcbiIsIGUtPm5hbWUoKS5jX3N0cigpKTsKKworI2lmIElOU1RSVU1FTlRfVElNSU5HX0hPU1QKKyAgICAgICAgZnByaW50ZihmcCwgIlx0XHRcdHN0cnVjdCB0aW1lc3BlYyB0czAsIHRzMSwgdHMyO1xuIik7CisgICAgICAgIGZwcmludGYoZnAsICJcdFx0XHRjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMwKTtcbiIpOworI2VuZGlmCisgICAgICAgIGJvb2wgdG90YWxUbXBCdWZmRXhpc3QgPSBmYWxzZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdG90YWxUbXBCdWZmT2Zmc2V0ID0gIjAiOworICAgICAgICBzdGQ6OnN0cmluZyAqdG1wQnVmT2Zmc2V0ID0gbmV3IHN0ZDo6c3RyaW5nW2UtPnZhcnMoKS5zaXplKCldOworCisgICAgICAgIC8vIGNvbnN0cnVjdCByZXR2YWwgdHlwZSBzdHJpbmcKKyAgICAgICAgc3RkOjpzdHJpbmcgcmV0dmFsVHlwZTsKKyAgICAgICAgaWYgKCFlLT5yZXR2YWwoKS5pc1ZvaWQoKSkgeworICAgICAgICAgICAgcmV0dmFsVHlwZSA9IGUtPnJldHZhbCgpLnR5cGUoKS0+bmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgcGFzcyA9IFBBU1NfRklSU1Q7IHBhc3MgPCBQQVNTX0xBU1Q7IHBhc3MrKykgeworI2lmIElOU1RSVU1FTlRfVElNSU5HX0hPU1QKKyAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfRnVuY3Rpb25DYWxsKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0XHRcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0czIpO1xuIik7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfRnVuY3Rpb25DYWxsICYmCisgICAgICAgICAgICAgICAgIWUtPnJldHZhbCgpLmlzVm9pZCgpICYmCisgICAgICAgICAgICAgICAgIWUtPnJldHZhbCgpLmlzUG9pbnRlcigpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0XHRcdCooJXMgKikoJnRtcEJ1Zlslc10pID0gIiwgcmV0dmFsVHlwZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUbXBCdWZmT2Zmc2V0LmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX0Z1bmN0aW9uQ2FsbCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcdFx0XHR0aGlzLT4lcygiLCBlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGUtPmN1c3RvbURlY29kZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAidGhpcyIpOyAvLyBhZGQgYSBjb250ZXh0IHRvIHRoZSBjYWxsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09IFBBU1NfRGVidWdQcmludCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0REVCVUcoXCIlcyglJXApOiAlcyglcylcXG5cIiwgc3RyZWFtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYmFzZW5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUtPm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRTdHJpbmcuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGUtPnZhcnMoKS5zaXplKCkgPiAwICYmICFlLT52YXJzKClbMF0uaXNWb2lkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJvZmZzZXQgPSAiOCI7IC8vIHNraXAgdGhlIGhlYWRlcgorICAgICAgICAgICAgVmFyc0FycmF5ICYgZXZhcnMgPSBlLT52YXJzKCk7CisgICAgICAgICAgICAvLyBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91dCBwb2ludGVyczsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZXZhcnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBWYXIgKnYgPSAmIGV2YXJzW2pdOworICAgICAgICAgICAgICAgIGlmICh2LT5pc1ZvaWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyX25hbWUgPSB2LT5uYW1lKCkuY19zdHIoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJfdHlwZV9uYW1lID0gdi0+dHlwZSgpLT5uYW1lKCkuY19zdHIoKTsKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCB2YXJfdHlwZV9ieXRlcyA9IHYtPnR5cGUoKS0+Ynl0ZXMoKTsKKworICAgICAgICAgICAgICAgIGlmICgocGFzcyA9PSBQQVNTX0Z1bmN0aW9uQ2FsbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGogIT0gMCB8fCBlLT5jdXN0b21EZWNvZGVyKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX0RlYnVnUHJpbnQgJiYgaiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghdi0+aXNQb2ludGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gUEFTU19WYXJpYWJsZURlY2xhcmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdCVzIHZhcl8lcyA9IFVucGFjazwlcyx1aW50JXVfdD4ocHRyICsgJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX2J5dGVzICogOFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcm9mZnNldC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfRnVuY3Rpb25DYWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID09IFBBU1NfRGVidWdQcmludCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgInZhcl8lcyIsIHZhcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXJvZmZzZXQgKz0gIiArICIgKyB0b1N0cmluZyh2YXJfdHlwZV9ieXRlcyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfVmFyaWFibGVEZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0dWludDMyX3Qgc2l6ZV8lcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IFVucGFjazx1aW50MzJfdCx1aW50MzJfdD4ocHRyICsgJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJvZmZzZXQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHYtPnBvaW50ZXJEaXIoKSA9PSBWYXI6OlBPSU5URVJfSU4gfHwKKyAgICAgICAgICAgICAgICAgICAgdi0+cG9pbnRlckRpcigpID09IFZhcjo6UE9JTlRFUl9JTk9VVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX1ZhcmlhYmxlRGVjbGFyYXRpb25zKSB7CisjaWYgVVNFX0FMSUdORURfQlVGRkVSUworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdElucHV0QnVmZmVyIGlucHRyXyVzKHB0ciArICVzICsgNCwgc2l6ZV8lcyk7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyb2Zmc2V0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX0Z1bmN0aW9uQ2FsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYtPm51bGxBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemVfJXMgPT0gMCA/IG51bGxwdHIgOiAoJXMpKGlucHRyXyVzLmdldCgpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVzKShpbnB0cl8lcy5nZXQoKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09IFBBU1NfRGVidWdQcmludCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglcykoaW5wdHJfJXMuZ2V0KCkpLCBzaXplXyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2Vsc2UgIC8vICFVU0VfQUxJR05FRF9CVUZGRVJTCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zaWduZWQgY2hhciAqaW5wdHJfJXMgPSAocHRyICsgJXMgKyA0KTtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJvZmZzZXQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gUEFTU19GdW5jdGlvbkNhbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LT5udWxsQWxsb3dlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplXyVzID09IDAgPyBOVUxMIDogKCVzKShpbnB0cl8lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglcykoaW5wdHJfJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PSBQQVNTX0RlYnVnUHJpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJXMpKGlucHRyXyVzKSwgc2l6ZV8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAgLy8gIVVTRV9BTElHTkVEX0JVRkZFUlMKKyAgICAgICAgICAgICAgICAgICAgdmFyb2Zmc2V0ICs9ICIgKyA0ICsgc2l6ZV8iOworICAgICAgICAgICAgICAgICAgICB2YXJvZmZzZXQgKz0gdmFyX25hbWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gb3V0IHBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfVG1wQnVmZkFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdGFsVG1wQnVmZkV4aXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRzaXplX3QgdG90YWxUbXBTaXplID0gc2l6ZV8lcztcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0dG90YWxUbXBTaXplICs9IHNpemVfJXM7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wQnVmT2Zmc2V0W2pdID0gdG90YWxUbXBCdWZmT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxUbXBCdWZmT2Zmc2V0ICs9ICIgKyBzaXplXyI7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRtcEJ1ZmZPZmZzZXQgKz0gdmFyX25hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFRtcEJ1ZmZFeGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PSBQQVNTX01lbUFsbG9jKSB7CisjaWYgVVNFX0FMSUdORURfQlVGRkVSUworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdE91dHB1dEJ1ZmZlciBvdXRwdHJfJXMoJnRtcEJ1Zlslc10sIHNpemVfJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1Zk9mZnNldFtqXS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PSBQQVNTX0Z1bmN0aW9uQ2FsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYtPm51bGxBbGxvd2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemVfJXMgPT0gMCA/IG51bGxwdHIgOiAoJXMpKG91dHB0cl8lcy5nZXQoKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglcykob3V0cHRyXyVzLmdldCgpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT0gUEFTU19EZWJ1Z1ByaW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVzKShvdXRwdHJfJXMuZ2V0KCkpLCBzaXplXyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX0ZsdXNoT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0b3V0cHRyXyVzLmZsdXNoKCk7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlICAvLyAhVVNFX0FMSUdORURfQlVGRkVSUworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdHVuc2lnbmVkIGNoYXIgKm91dHB0cl8lcyA9ICZ0bXBCdWZbJXNdO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEJ1Zk9mZnNldFtqXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRtZW1zZXQob3V0cHRyXyVzLCAwLCAlcyk7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcodi0+dHlwZSgpLT5ieXRlcygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09IFBBU1NfRnVuY3Rpb25DYWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi0+bnVsbEFsbG93ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZV8lcyA9PSAwID8gTlVMTCA6ICglcykob3V0cHRyXyVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCVzKShvdXRwdHJfJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl90eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyA9PSBQQVNTX0RlYnVnUHJpbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJXMpKG91dHB0cl8lcyksIHNpemVfJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdHlwZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyb2Zmc2V0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYgIC8vICFVU0VfQUxJR05FRF9CVUZGRVJTCisgICAgICAgICAgICAgICAgICAgIHZhcm9mZnNldCArPSAiICsgNCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX1Byb3RvY29sKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRpZiAodXNlQ2hlY2tzdW0pIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnZhbGlkT3JEaWUoY2hlY2tzdW1DYWxjLCBwdHIsICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHRyICsgJXMsIGNoZWNrc3VtU2l6ZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHRcdFx0XHRcdFwiJXM6OmRlY29kZSwiCisgICAgICAgICAgICAgICAgICAgICAgICAiIE9QXyVzOiBHTCBjaGVja3N1bUNhbGN1bGF0b3IgZmFpbHVyZVxcblwiKTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHR9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFyb2Zmc2V0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJvZmZzZXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSgpLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICB2YXJvZmZzZXQgKz0gIiArIDQiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFzcyA9PSBQQVNTX0Z1bmN0aW9uQ2FsbCB8fAorICAgICAgICAgICAgICAgIHBhc3MgPT0gUEFTU19EZWJ1Z1ByaW50KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIik7XG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhc3MgPT0gUEFTU19UbXBCdWZmQWxsb2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWUtPnJldHZhbCgpLmlzVm9pZCgpICYmICFlLT5yZXR2YWwoKS5pc1BvaW50ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdGFsVG1wQnVmZkV4aXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdHNpemVfdCB0b3RhbFRtcFNpemUgPSBzaXplb2YoJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsVHlwZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdHRvdGFsVG1wU2l6ZSArPSBzaXplb2YoJXMpO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsVHlwZS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICB0b3RhbFRtcEJ1ZmZFeGlzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0b3RhbFRtcEJ1ZmZFeGlzdCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHR0b3RhbFRtcFNpemUgKz0gY2hlY2tzdW1TaXplO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHR1bnNpZ25lZCBjaGFyICp0bXBCdWYgPSBzdHJlYW0tPmFsbG9jKHRvdGFsVG1wU2l6ZSk7XG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXNzID09IFBBU1NfRXBpbG9nKSB7CisgICAgICAgICAgICAgICAgLy8gc2VuZCBiYWNrIG91dCBwb2ludGVycyBkYXRhIGFzIHdlbGwgYXMgcmV0dmFsCisgICAgICAgICAgICAgICAgaWYgKHRvdGFsVG1wQnVmZkV4aXN0KSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdGlmICh1c2VDaGVja3N1bSkge1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OndyaXRlQ2hlY2tzdW0oY2hlY2tzdW1DYWxjLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZ0bXBCdWZbMF0sIHRvdGFsVG1wU2l6ZSAtIGNoZWNrc3VtU2l6ZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICImdG1wQnVmW3RvdGFsVG1wU2l6ZSAtIGNoZWNrc3VtU2l6ZV0sIGNoZWNrc3VtU2l6ZSk7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0XHRcdH1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRcdFx0c3RyZWFtLT5mbHVzaCgpO1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IC8vIHBhc3M7CisKKyNpZiBJTlNUUlVNRU5UX1RJTUlOR19IT1NUCisgICAgICAgIGZwcmludGYoZnAsICJcdFx0XHRjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMxKTtcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdFx0bG9uZyB0aW1lRGlmZiA9IHRzMS50dl9zZWMqMTAwMDAwMCArIHRzMS50dl9uc2VjLzEwMDAgLSAodHMwLnR2X3NlYyoxMDAwMDAwICsgdHMwLnR2X25zZWMvMTAwMCk7XG4iKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0XHRcdGxvbmcgdGltZURpZmYyID0gdHMxLnR2X3NlYyoxMDAwMDAwICsgdHMxLnR2X25zZWMvMTAwMCAtICh0czIudHZfc2VjKjEwMDAwMDAgKyB0czIudHZfbnNlYy8xMDAwKTtcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdFx0cHJpbnRmKFwiKHRpbWluZykgJSU0bGQuJSUwNmxkICVzOiAlJWxkICglJWxkKSB1c1xcblwiLCAiCisgICAgICAgICAgICAgICAgICAgICJ0czEudHZfc2VjLCB0czEudHZfbnNlYy8xMDAwLCB0aW1lRGlmZiwgdGltZURpZmYyKTtcbiIsIGUtPm5hbWUoKS5jX3N0cigpKTsKKyNlbmRpZgorICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdFx0U0VUX0xBU1RDQUxMKFwiJXNcIik7XG4iLCBlLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGZwcmludGYoZnAsICJcdFx0XHRicmVhaztcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdH1cbiIpOworCisgICAgICAgIGRlbGV0ZSBbXSB0bXBCdWZPZmZzZXQ7CisgICAgfQorICAgIGZwcmludGYoZnAsICJcdFx0ZGVmYXVsdDpcbiIpOworICAgIGZwcmludGYoZnAsICJcdFx0XHRyZXR1cm4gcHRyIC0gKHVuc2lnbmVkIGNoYXIqKWJ1ZjtcbiIpOworICAgIGZwcmludGYoZnAsICJcdFx0fSAvL3N3aXRjaFxuIik7CisgICAgaWYgKHN0cnN0cihtX2Jhc2VuYW1lLmNfc3RyKCksICJnbCIpKSB7CisgICAgICAgIGZwcmludGYoZnAsICIjaWZkZWYgQ0hFQ0tfR0xfRVJST1JcbiIpOworICAgICAgICBmcHJpbnRmKGZwLCAiXHRcdGludCBlcnIgPSBsYXN0Q2FsbFswXSA/IHRoaXMtPmdsR2V0RXJyb3IoKSA6IEdMX05PX0VSUk9SO1xuIik7CisgICAgICAgIGZwcmludGYoZnAsICJcdFx0aWYgKGVycikgZnByaW50ZihzdGRlcnIsIFwiJXMgRXJyb3I6IDB4JSVYIGluICUlc1xcblwiLCBlcnIsIGxhc3RDYWxsKTtcbiIsIG1fYmFzZW5hbWUuY19zdHIoKSk7CisgICAgICAgIGZwcmludGYoZnAsICIjZW5kaWZcbiIpOworICAgIH0KKworICAgIGZwcmludGYoZnAsICJcdFx0cHRyICs9IHBhY2tldExlbjtcbiIpOworICAgIGZwcmludGYoZnAsICJcdH0gLy8gd2hpbGVcbiIpOworICAgIGZwcmludGYoZnAsICJcdHJldHVybiBwdHIgLSAodW5zaWduZWQgY2hhciopYnVmO1xuIik7CisgICAgZnByaW50ZihmcCwgIn1cbiIpOworCisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFwaUdlbjo6cmVhZFNwZWMoY29uc3Qgc3RkOjpzdHJpbmcgJiBmaWxlbmFtZSkKK3sKKyAgICBGSUxFICpzcGVjZnAgPSBmb3BlbihmaWxlbmFtZS5jX3N0cigpLCAicnQiKTsKKyAgICBpZiAoc3BlY2ZwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNoYXIgbGluZVsxMDAwXTsKKyAgICB1bnNpZ25lZCBpbnQgbGMgPSAwOworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIHNwZWNmcCkgIT0gTlVMTCkgeworICAgICAgICBsYysrOworICAgICAgICBFbnRyeVBvaW50IHJlZjsKKyAgICAgICAgaWYgKHJlZi5wYXJzZShsYywgc3RkOjpzdHJpbmcobGluZSkpKSB7CisgICAgICAgICAgICBwdXNoX2JhY2socmVmKTsKKyAgICAgICAgICAgIHVwZGF0ZU1heEVudHJ5UG9pbnRzUGFyYW1zKHJlZi52YXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmY2xvc2Uoc3BlY2ZwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEFwaUdlbjo6cmVhZEF0dHJpYnV0ZXMoY29uc3Qgc3RkOjpzdHJpbmcgJiBhdHRyaWJGaWxlbmFtZSkKK3sKKyAgICBlbnVtIHsgU1RfTkFNRSwgU1RfQVRUIH0gc3RhdGU7CisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGF0dHJpYkZpbGVuYW1lLmNfc3RyKCksICJydCIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihhdHRyaWJGaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjaGFyIGJ1ZlsxMDAwXTsKKworICAgIHN0YXRlID0gU1RfTkFNRTsKKyAgICBFbnRyeVBvaW50ICpjdXJyZW50RW50cnkgPSBOVUxMOworICAgIHNpemVfdCBsYyA9IDA7CisgICAgYm9vbCBnbG9iYWxBdHRyaWJ1dGVzID0gZmFsc2U7CisgICAgd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSAhPSBOVUxMKSB7CisgICAgICAgIGxjKys7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmUoYnVmKTsKKyAgICAgICAgaWYgKGxpbmUuc2l6ZSgpID09IDApIGNvbnRpbnVlOyAvLyBjb3VsZCB0aGF0IGhhcHBlbj8KKworICAgICAgICBpZiAobGluZS5hdCgwKSA9PSAnIycpIGNvbnRpbnVlOyAvLyBjb21tZW50CisKKyAgICAgICAgc2l6ZV90IGZpcnN0ID0gbGluZS5maW5kX2ZpcnN0X25vdF9vZigiIFx0XG4iKTsKKyAgICAgICAgaWYgKHN0YXRlID09IFNUX0FUVCAmJiAoZmlyc3QgPT0gc3RkOjpzdHJpbmc6Om5wb3MgfHwgZmlyc3QgPT0gMCkpIHN0YXRlID0gU1RfTkFNRTsKKworICAgICAgICBsaW5lID0gdHJpbShsaW5lKTsKKyAgICAgICAgaWYgKGxpbmUuc2l6ZSgpID09IDAgfHwgbGluZS5hdCgwKSA9PSAnIycpIGNvbnRpbnVlOworCisgICAgICAgIHN3aXRjaChzdGF0ZSkgeworICAgICAgICBjYXNlIFNUX05BTUU6CisgICAgICAgICAgICBpZiAobGluZSA9PSAiR0xPQkFMIikgeworICAgICAgICAgICAgICAgIGdsb2JhbEF0dHJpYnV0ZXMgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnbG9iYWxBdHRyaWJ1dGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5ID0gZmluZEVudHJ5QnlOYW1lKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RW50cnkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICV1OiBhdHRyaWJ1dGUgb2Ygbm9uIGV4aXN0YW50IGVudHJ5IHBvaW50ICVzXG4iLCAodW5zaWduZWQgaW50KWxjLCBsaW5lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlID0gU1RfQVRUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RfQVRUOgorICAgICAgICAgICAgaWYgKGdsb2JhbEF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICBzZXRHbG9iYWxBdHRyaWJ1dGUobGluZSwgbGMpOworICAgICAgICAgICAgfSBlbHNlICBpZiAoY3VycmVudEVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RW50cnktPnNldEF0dHJpYnV0ZShsaW5lLCBsYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgQXBpR2VuOjpzZXRHbG9iYWxBdHRyaWJ1dGUoY29uc3Qgc3RkOjpzdHJpbmcgJiBsaW5lLCBzaXplX3QgbGMpCit7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgc2l6ZV90IGxhc3Q7CisgICAgc3RkOjpzdHJpbmcgdG9rZW4gPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgcG9zID0gbGFzdDsKKworICAgIGlmICh0b2tlbiA9PSAiYmFzZV9vcGNvZGUiKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgaWYgKHN0ci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaW5lICV1OiBtaXNzaW5nIHZhbHVlIGZvciBiYXNlX29wY29kZVxuIiwgKHVuc2lnbmVkKSBsYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRCYXNlT3Bjb2RlKGF0b2koc3RyLmNfc3RyKCkpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSAgaWYgKHRva2VuID09ICJlbmNvZGVyX2hlYWRlcnMiKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgd2hpbGUgKHN0ci5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5jb2RlckhlYWRlcnMoKS5wdXNoX2JhY2soc3RyKTsKKyAgICAgICAgICAgIHN0ciA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRva2VuID09ICJjbGllbnRfY29udGV4dF9oZWFkZXJzIikgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIHdoaWxlIChzdHIuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGNsaWVudENvbnRleHRIZWFkZXJzKCkucHVzaF9iYWNrKHN0cik7CisgICAgICAgICAgICBzdHIgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbiA9PSAic2VydmVyX2NvbnRleHRfaGVhZGVycyIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICB3aGlsZSAoc3RyLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBzZXJ2ZXJDb250ZXh0SGVhZGVycygpLnB1c2hfYmFjayhzdHIpOworICAgICAgICAgICAgc3RyID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworICAgICAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gImRlY29kZXJfaGVhZGVycyIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICB3aGlsZSAoc3RyLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICBkZWNvZGVySGVhZGVycygpLnB1c2hfYmFjayhzdHIpOworICAgICAgICAgICAgc3RyID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworICAgICAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiAldSA6IHVua25vd24gZ2xvYmFsIGF0dHJpYnV0ZSAlc1xuIiwgKHVuc2lnbmVkIGludClsYywgbGluZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BcGlHZW4uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9BcGlHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGU4N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL0FwaUdlbi5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9fQVBJX0dFTl9IXworI2RlZmluZSBfX0FQSV9HRU5fSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJFbnRyeVBvaW50LmgiCisKKworY2xhc3MgQXBpR2VuIDogcHJpdmF0ZSBzdGQ6OnZlY3RvcjxFbnRyeVBvaW50PiB7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBTdHJpbmdWZWM7CisgICAgdHlwZWRlZiBlbnVtIHsgQ0xJRU5UX1NJREUsIFNFUlZFUl9TSURFLCBXUkFQUEVSX1NJREUgfSBTaWRlVHlwZTsKKworICAgIEFwaUdlbihjb25zdCBzdGQ6OnN0cmluZyAmIGJhc2VuYW1lKSA6CisgICAgICAgIG1fYmFzZW5hbWUoYmFzZW5hbWUpLAorICAgICAgICBtX21heEVudHJ5UG9pbnRzUGFyYW1zKDApLAorICAgICAgICBtX2Jhc2VPcGNvZGUoMCkKKyAgICB7IH0KKyAgICB2aXJ0dWFsIH5BcGlHZW4oKSB7fQorICAgIGludCByZWFkU3BlYyhjb25zdCBzdGQ6OnN0cmluZyAmIGZpbGVuYW1lKTsKKyAgICBpbnQgcmVhZEF0dHJpYnV0ZXMoY29uc3Qgc3RkOjpzdHJpbmcgJiBhdHRyaWJGaWxlbmFtZSk7CisgICAgc2l6ZV90IG1heEVudHJ5UG9pbnRzUGFyYW1zKCkgeyAgcmV0dXJuIG1fbWF4RW50cnlQb2ludHNQYXJhbXM7IH0KKyAgICB2b2lkIHVwZGF0ZU1heEVudHJ5UG9pbnRzUGFyYW1zKHNpemVfdCB2YWwpIHsKKyAgICAgICAgaWYgKG1fbWF4RW50cnlQb2ludHNQYXJhbXMgPT0gMCB8fCB2YWwgPiBtX21heEVudHJ5UG9pbnRzUGFyYW1zKSBtX21heEVudHJ5UG9pbnRzUGFyYW1zID0gdmFsOworICAgIH0KKyAgICBpbnQgYmFzZU9wY29kZSgpIHsgcmV0dXJuIG1fYmFzZU9wY29kZTsgfQorICAgIHZvaWQgc2V0QmFzZU9wY29kZShpbnQgYmFzZSkgeyBtX2Jhc2VPcGNvZGUgPSBiYXNlOyB9CisKKyAgICBjb25zdCBjaGFyICpzaWRlU3RyaW5nKFNpZGVUeXBlIHNpZGUpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcmV0dmFsOworICAgICAgICBzd2l0Y2goc2lkZSkgeworICAgICAgICBjYXNlIENMSUVOVF9TSURFOgorICAgICAgICAgICAgcmV0dmFsID0gImNsaWVudCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRVJWRVJfU0lERToKKyAgICAgICAgICAgIHJldHZhbCA9ICJzZXJ2ZXIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV1JBUFBFUl9TSURFOgorICAgICAgICAgICAgcmV0dmFsID0gIndyYXBwZXIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR2YWwgPSAidW5rbm93biI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisKKyAgICBTdHJpbmdWZWMgJiBjbGllbnRDb250ZXh0SGVhZGVycygpIHsgcmV0dXJuIG1fY2xpZW50Q29udGV4dEhlYWRlcnM7IH0KKyAgICBTdHJpbmdWZWMgJiBlbmNvZGVySGVhZGVycygpIHsgcmV0dXJuIG1fZW5jb2RlckhlYWRlcnM7IH0KKyAgICBTdHJpbmdWZWMgJiBzZXJ2ZXJDb250ZXh0SGVhZGVycygpIHsgcmV0dXJuIG1fc2VydmVyQ29udGV4dEhlYWRlcnM7IH0KKyAgICBTdHJpbmdWZWMgJiBkZWNvZGVySGVhZGVycygpIHsgcmV0dXJuIG1fZGVjb2RlckhlYWRlcnM7IH0KKworICAgIEVudHJ5UG9pbnQgKiBmaW5kRW50cnlCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKTsKKyAgICBpbnQgZ2VuT3Bjb2Rlcyhjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpOworICAgIGludCBnZW5BdHRyaWJ1dGVzVGVtcGxhdGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKyAgICBpbnQgZ2VuUHJvY1R5cGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSwgU2lkZVR5cGUgc2lkZSk7CisgICAgaW50IGdlbkZ1bmNUYWJsZShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIFNpZGVUeXBlIHNpZGUpOworCisgICAgaW50IGdlbkNvbnRleHQoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBTaWRlVHlwZSBzaWRlKTsKKyAgICBpbnQgZ2VuQ29udGV4dEltcGwoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lLCBTaWRlVHlwZSBzaWRlKTsKKworICAgIGludCBnZW5FbnRyeVBvaW50cyhjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUsIFNpZGVUeXBlIHNpZGUpOworCisgICAgaW50IGdlbkVuY29kZXJIZWFkZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKyAgICBpbnQgZ2VuRW5jb2RlckltcGwoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKKworICAgIGludCBnZW5EZWNvZGVySGVhZGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSk7CisgICAgaW50IGdlbkRlY29kZXJJbXBsKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRIZWFkZXIoRklMRSAqZnApIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIG1fYmFzZW5hbWU7CisgICAgU3RyaW5nVmVjIG1fY2xpZW50Q29udGV4dEhlYWRlcnM7CisgICAgU3RyaW5nVmVjIG1fZW5jb2RlckhlYWRlcnM7CisgICAgU3RyaW5nVmVjIG1fc2VydmVyQ29udGV4dEhlYWRlcnM7CisgICAgU3RyaW5nVmVjIG1fZGVjb2RlckhlYWRlcnM7CisgICAgc2l6ZV90IG1fbWF4RW50cnlQb2ludHNQYXJhbXM7IC8vIHJlY29yZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUgZW50cnkgcG9pbnRzOworICAgIGludCBtX2Jhc2VPcGNvZGU7CisgICAgaW50IHNldEdsb2JhbEF0dHJpYnV0ZShjb25zdCBzdGQ6OnN0cmluZyAmIGxpbmUsIHNpemVfdCBsYyk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9FbnRyeVBvaW50LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9FbnRyeVBvaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzNiZWYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL0VudHJ5UG9pbnQuY3BwCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgIkVudHJ5UG9pbnQuaCIKKworI2luY2x1ZGUgIlBhcnNlci5oIgorI2luY2x1ZGUgIlR5cGVGYWN0b3J5LmgiCisjaW5jbHVkZSAic3RyVXRpbHMuaCIKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworRW50cnlQb2ludDo6RW50cnlQb2ludCgpCit7CisgICAgcmVzZXQoKTsKK30KKworRW50cnlQb2ludDo6fkVudHJ5UG9pbnQoKQoreworfQorCit2b2lkIEVudHJ5UG9pbnQ6OnJlc2V0KCkKK3sKKyAgICBtX3Vuc3VwcG9ydGVkID0gZmFsc2U7CisgICAgbV9jdXN0b21EZWNvZGVyID0gZmFsc2U7CisgICAgbV9ub3RBcGkgPSBmYWxzZTsKKyAgICBtX2ZsdXNoT25FbmNvZGUgPSBmYWxzZTsKKyAgICBtX3ZhcnMuZW1wdHkoKTsKK30KKworLy8gcmV0dXJuIHRydWUgZm9yIHZhbGlkIGxpbmUgKG5lZWQgdG8gZ2V0IGludG8gdGhlIGVudHJ5IHBvaW50cyBsaXN0KQorYm9vbCBFbnRyeVBvaW50OjpwYXJzZSh1bnNpZ25lZCBpbnQgbGMsIGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyKQoreworICAgIHNpemVfdCBwb3MsIGxhc3Q7CisgICAgc3RkOjpzdHJpbmcgZmllbGQ7CisKKyAgICByZXNldCgpOworICAgIHN0ZDo6c3RyaW5nIGxpbmVzdHIgPSB0cmltKHN0cik7CisKKyAgICBpZiAobGluZXN0ci5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIGlmIChsaW5lc3RyLmF0KDApID09ICcjJykgcmV0dXJuIGZhbHNlOworCisgICAgLy8gc2tpcCBQUkVGSVgKKyAgICBmaWVsZCA9IGdldE5leHRUb2tlbihsaW5lc3RyLCAwLCAmbGFzdCwgIigiKTsKKyAgICBwb3MgPSBsYXN0ICsgMTsKKyAgICAvLyByZXR1cm4gdHlwZQorICAgIGZpZWxkID0gZ2V0TmV4dFRva2VuKGxpbmVzdHIsIHBvcywgJmxhc3QsICIsKSIpOworCisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgc3RkOjpzdHJpbmcgcmV0VHlwZU5hbWU7CisgICAgaWYgKCFwYXJzZVR5cGVEZWNsYXJhdGlvbihmaWVsZCwgJnJldFR5cGVOYW1lLCAmZXJyb3IpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJsaW5lOiAlZDogUGFyc2luZyBlcnJvciBpbiBmaWVsZCA8JXM+OiAlc1xuIiwKKyAgICAgICAgICAgICAgICBsYywgCisgICAgICAgICAgICAgICAgZmllbGQuY19zdHIoKSwgCisgICAgICAgICAgICAgICAgZXJyb3IuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9zID0gbGFzdCArIDE7CisgICAgY29uc3QgVmFyVHlwZSAqdGhlVHlwZSA9IFR5cGVGYWN0b3J5OjppbnN0YW5jZSgpLT5nZXRWYXJUeXBlQnlOYW1lKHJldFR5cGVOYW1lKTsKKyAgICBpZiAodGhlVHlwZS0+bmFtZSgpID09ICJVTktOT1dOIikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVOS05PV04gcmV0dmFsOiAlc1xuIiwgbGluZXN0ci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBtX3JldHZhbC5pbml0KHN0ZDo6c3RyaW5nKCIiKSwKKyAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiIiksCisgICAgICAgICAgICAgICAgICBWYXI6OlBPSU5URVJfT1VULAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIiIpLAorICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoIiIpKTsKKworICAgIC8vIGZ1bmN0aW9uIG5hbWUKKyAgICBtX25hbWUgPSBnZXROZXh0VG9rZW4obGluZXN0ciwgcG9zLCAmbGFzdCwgIiwpIik7CisgICAgcG9zID0gbGFzdCArIDE7CisKKyAgICAvLyBwYXJhbWV0ZXJzOworICAgIGludCBudmFycyA9IDA7CisgICAgd2hpbGUgKHBvcyA8IGxpbmVzdHIuc2l6ZSgpIC0gMSkgeworICAgICAgICBmaWVsZCA9IGdldE5leHRUb2tlbihsaW5lc3RyLCBwb3MsICZsYXN0LCAiLCkiKTsKKyAgICAgICAgaWYgKGZpZWxkID09ICJ2b2lkIikgeworICAgICAgICAgICAgLy8gJ3ZvaWQnIGlzIHVzZWQgYXMgYSBzcGVjaWFsIGNhc2UgZm9yIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHRha2UKKyAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgYXQgYWxsLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdmFydHlwZSwgdmFybmFtZTsKKyAgICAgICAgaWYgKCFwYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uKGZpZWxkLCAmdmFydHlwZSwgJnZhcm5hbWUsICZlcnJvcikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAibGluZTogJWQ6IFBhcnNpbmcgZXJyb3IgaW4gZmllbGQgPCVzPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbGMsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgIGVycm9yLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG52YXJzKys7CisgICAgICAgIGNvbnN0IFZhclR5cGUgKnYgPSBUeXBlRmFjdG9yeTo6aW5zdGFuY2UoKS0+Z2V0VmFyVHlwZUJ5TmFtZSh2YXJ0eXBlKTsKKyAgICAgICAgaWYgKHYtPmlkKCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogVW5rbm93biB0eXBlOiAlc1xuIiwgbGMsIHZhcnR5cGUuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodmFybmFtZSA9PSAiIiAmJgorICAgICAgICAgICAgICAgICEodi0+bmFtZSgpID09ICJ2b2lkIiAmJiAhdi0+aXNQb2ludGVyKCkpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgInZhciIgPDwgbnZhcnM7CisgICAgICAgICAgICAgICAgdmFybmFtZSA9IG9zcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV92YXJzLnB1c2hfYmFjayhWYXIodmFybmFtZSwgdiwgc3RkOjpzdHJpbmcoIiIpLCBWYXI6OlBPSU5URVJfSU4sICIiLCAiIikpOworICAgICAgICB9CisgICAgICAgIHBvcyA9IGxhc3QgKyAxOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBFbnRyeVBvaW50OjpwcmludChGSUxFICpmcCwgYm9vbCBuZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWVfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWVfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIGN0eF9wYXJhbSApIGNvbnN0Cit7CisgICAgZnByaW50ZihmcCwgIiVzICVzJXMlcygiLAorICAgICAgICAgICAgbV9yZXR2YWwudHlwZSgpLT5uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgIG5hbWVfcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgICBtX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG5hbWVfc3VmZml4LmNfc3RyKCkpOworCisgICAgaWYgKGN0eF9wYXJhbSAhPSAiIikgZnByaW50ZihmcCwgIiVzICIsIGN0eF9wYXJhbS5jX3N0cigpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV92YXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtX3ZhcnNbaV0uaXNWb2lkKCkpIGNvbnRpbnVlOworICAgICAgICBpZiAoaSAhPSAwIHx8IGN0eF9wYXJhbSAhPSAiIikgZnByaW50ZihmcCwgIiwgIik7CisgICAgICAgIGZwcmludGYoZnAsICIlcyAlcyIsIG1fdmFyc1tpXS50eXBlKCktPm5hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICAgIGZwcmludGYoZnAsICIpJXMiLCBuZXdsaW5lPyAiXG4iIDogIiIpOworfQorCitWYXIgKiBFbnRyeVBvaW50Ojp2YXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKQoreworICAgIFZhciAqdiA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZhcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICAgICAgdiA9ICZtX3ZhcnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKK30KKworYm9vbCBFbnRyeVBvaW50OjpoYXNQb2ludGVycygpCit7CisgICAgYm9vbCBwb2ludGVycyA9IGZhbHNlOworICAgIGlmIChtX3JldHZhbC5pc1BvaW50ZXIoKSkgcG9pbnRlcnMgPSB0cnVlOworICAgIGlmICghcG9pbnRlcnMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3ZhcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaXNQb2ludGVyKCkpIHsKKyAgICAgICAgICAgICAgICBwb2ludGVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBvaW50ZXJzOworfQorCitpbnQgRW50cnlQb2ludDo6c2V0QXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZsaW5lLCBzaXplX3QgbGMpCit7CisgICAgc2l6ZV90IHBvcyA9IDA7CisgICAgc2l6ZV90IGxhc3Q7CisgICAgc3RkOjpzdHJpbmcgdG9rZW4gPSBnZXROZXh0VG9rZW4obGluZSwgMCwgJmxhc3QsIFdISVRFU1BBQ0UpOworCisgICAgaWYgKHRva2VuID09ICJsZW4iKSB7CisgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhcm5hbWUgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisKKyAgICAgICAgaWYgKHZhcm5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICV1OiBNaXNzaW5nIHZhcmlhYmxlIG5hbWUgaW4gJ2xlbicgYXR0cmlidXRlXG4iLCAodW5zaWduZWQgaW50KWxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBWYXIgKiB2ID0gdmFyKHZhcm5hbWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogdmFyaWFibGUgJXMgaXMgbm90IGEgcGFyYW1ldGVyIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWxjLCB2YXJuYW1lLmNfc3RyKCksIG5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgdGhlIHNpemUgZXhwcmVzc2lvbiBpbnRvIHZhcgorICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICB2LT5zZXRMZW5FeHByZXNzaW9uKGxpbmUuc3Vic3RyKHBvcykpOworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gInBhcmFtX2NoZWNrIikgeworICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICBzdGQ6OnN0cmluZyB2YXJuYW1lID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworCisgICAgICAgIGlmICh2YXJuYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogTWlzc2luZyB2YXJpYWJsZSBuYW1lIGluICdwYXJhbV9jaGVjaycgYXR0cmlidXRlXG4iLCAodW5zaWduZWQgaW50KWxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBWYXIgKiB2ID0gdmFyKHZhcm5hbWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogdmFyaWFibGUgJXMgaXMgbm90IGEgcGFyYW1ldGVyIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWxjLCB2YXJuYW1lLmNfc3RyKCksIG5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICAvLyBzZXQgdGhlIHNpemUgZXhwcmVzc2lvbiBpbnRvIHZhcgorICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICB2LT5zZXRQYXJhbUNoZWNrRXhwcmVzc2lvbihsaW5lLnN1YnN0cihwb3MpKTsKKworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gImRpciIpIHsKKyAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFybmFtZSA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgaWYgKHZhcm5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6ICV1OiBNaXNzaW5nIHZhcmlhYmxlIG5hbWUgaW4gJ2RpcicgYXR0cmlidXRlXG4iLCAodW5zaWduZWQgaW50KWxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBWYXIgKiB2ID0gdmFyKHZhcm5hbWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogdmFyaWFibGUgJXMgaXMgbm90IGEgcGFyYW1ldGVyIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWxjLCB2YXJuYW1lLmNfc3RyKCksIG5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorCisgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBvaW50ZXJEaXJTdHIgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIGlmIChwb2ludGVyRGlyU3RyLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogbWlzc2luZyBwb2ludGVyIGRpcmVjdGlvbnNcbiIsICh1bnNpZ25lZCBpbnQpbGMpOworICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvaW50ZXJEaXJTdHIgPT0gIm91dCIpIHsKKyAgICAgICAgICAgIHYtPnNldFBvaW50ZXJEaXIoVmFyOjpQT0lOVEVSX09VVCk7CisgICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRpclN0ciA9PSAiaW5vdXQiKSB7CisgICAgICAgICAgICB2LT5zZXRQb2ludGVyRGlyKFZhcjo6UE9JTlRFUl9JTk9VVCk7CisgICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRpclN0ciA9PSAiaW4iKSB7CisgICAgICAgICAgICB2LT5zZXRQb2ludGVyRGlyKFZhcjo6UE9JTlRFUl9JTik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogdW5rbm93IHBvaW50ZXIgZGlyZWN0aW9uICVzXG4iLCAodW5zaWduZWQgaW50KWxjLCBwb2ludGVyRGlyU3RyLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbiA9PSAidmFyX2ZsYWciKSB7CisgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhcm5hbWUgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIGlmICh2YXJuYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogTWlzc2luZyB2YXJpYWJsZSBuYW1lIGluICd2YXJfZmxhZycgYXR0cmlidXRlXG4iLCAodW5zaWduZWQgaW50KWxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBWYXIgKiB2ID0gdmFyKHZhcm5hbWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogdmFyaWFibGUgJXMgaXMgbm90IGEgcGFyYW1ldGVyIG9mICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWxjLCB2YXJuYW1lLmNfc3RyKCksIG5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZyA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgICAgIGlmIChmbGFnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXU6IG1pc3NpbmcgZmxhZ1xuIiwgKHVuc2lnbmVkIGludCkgbGMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICAgICAgaWYgKGZsYWcgPT0gIm51bGxBbGxvd2VkIikgeworICAgICAgICAgICAgICAgIGlmICh2LT5pc1BvaW50ZXIoKSkgeworICAgICAgICAgICAgICAgICAgICB2LT5zZXROdWxsQWxsb3dlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICV1OiBzZXR0aW5nIG51bGxBbGxvd2VkIGZvciBub24tcG9pbnRlciB2YXJpYWJsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBsYywgdi0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAiaXNMYXJnZSIpIHsKKyAgICAgICAgICAgICAgICBpZiAodi0+aXNQb2ludGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdi0+c2V0SXNMYXJnZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6ICV1OiBzZXR0aW5nIGlzTGFyZ2UgZmxhZyBmb3IgYSBub24tcG9pbnRlciB2YXJpYWJsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSBsYywgdi0+bmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiAldTogdW5rbm93IGZsYWcgJXNcbiIsICh1bnNpZ25lZCBpbnQpbGMsIGZsYWcuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRva2VuID09ICJjdXN0b21fcGFjayIpIHsKKyAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFybmFtZSA9IGdldE5leHRUb2tlbihsaW5lLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKworICAgICAgICBpZiAodmFybmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXU6IE1pc3NpbmcgdmFyaWFibGUgbmFtZSBpbiAnY3VzdG9tX3BhY2snIGF0dHJpYnV0ZVxuIiwgKHVuc2lnbmVkIGludClsYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgVmFyICogdiA9IHZhcih2YXJuYW1lKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXU6IHZhcmlhYmxlICVzIGlzIG5vdCBhIHBhcmFtZXRlciBvZiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClsYywgdmFybmFtZS5jX3N0cigpLCBuYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHRoZSBzaXplIGV4cHJlc3Npb24gaW50byB2YXIKKyAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgdi0+c2V0UGFja0V4cHJlc3Npb24obGluZS5zdWJzdHIocG9zKSk7CisgICAgfSBlbHNlIGlmICh0b2tlbiA9PSAiY3VzdG9tX3dyaXRlIikgeworICAgICAgICBwb3MgPSBsYXN0OworICAgICAgICBzdGQ6OnN0cmluZyB2YXJuYW1lID0gZ2V0TmV4dFRva2VuKGxpbmUsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworCisgICAgICAgIGlmICh2YXJuYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogTWlzc2luZyB2YXJpYWJsZSBuYW1lIGluICdjdXN0b21fd3JpdGUnIGF0dHJpYnV0ZVxuIiwgKHVuc2lnbmVkIGludClsYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgVmFyICogdiA9IHZhcih2YXJuYW1lKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXU6IHZhcmlhYmxlICVzIGlzIG5vdCBhIHBhcmFtZXRlciBvZiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClsYywgdmFybmFtZS5jX3N0cigpLCBuYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IHRoZSBzaXplIGV4cHJlc3Npb24gaW50byB2YXIKKyAgICAgICAgcG9zID0gbGFzdDsKKyAgICAgICAgdi0+c2V0V3JpdGVFeHByZXNzaW9uKGxpbmUuc3Vic3RyKHBvcykpOworICAgIH0gZWxzZSBpZiAodG9rZW4gPT0gImZsYWciKSB7CisgICAgICAgIHBvcyA9IGxhc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWcgPSBnZXROZXh0VG9rZW4obGluZSwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIGlmIChmbGFnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiAldTogbWlzc2luZyBmbGFnXG4iLCAodW5zaWduZWQgaW50KSBsYyk7CisgICAgICAgICAgICByZXR1cm4gLTQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZyA9PSAidW5zdXBwb3J0ZWQiKSB7CisgICAgICAgICAgICBzZXRVbnN1cHBvcnRlZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFnID09ICJjdXN0b21fZGVjb2RlciIpIHsKKyAgICAgICAgICAgIHNldEN1c3RvbURlY29kZXIodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZyA9PSAibm90X2FwaSIpIHsKKyAgICAgICAgICAgIHNldE5vdEFwaSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFnID09ICJmbHVzaE9uRW5jb2RlIikgeworICAgICAgICAgICAgc2V0Rmx1c2hPbkVuY29kZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogJXU6IHVua25vd24gZmxhZyAlc1xuIiwgKHVuc2lnbmVkIGludClsYywgZmxhZy5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogJXU6IHVua25vd24gYXR0cmlidXRlICVzXG4iLCAodW5zaWduZWQgaW50KWxjLCB0b2tlbi5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9FbnRyeVBvaW50LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vRW50cnlQb2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNjFkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vRW50cnlQb2ludC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9fRW50cnlQb2ludF9fSF9fCisjZGVmaW5lIF9fRW50cnlQb2ludF9fSF9fCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJWYXIuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxWYXI+IFZhcnNBcnJheTsKKworY2xhc3MgRW50cnlQb2ludCB7CitwdWJsaWM6CisgICAgRW50cnlQb2ludCgpOworICAgIHZpcnR1YWwgfkVudHJ5UG9pbnQoKTsKKyAgICBib29sIHBhcnNlKHVuc2lnbmVkIGludCBsYywgY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHIpOworICAgIHZvaWQgcmVzZXQoKTsgLy8gcmVzZXQgdGhlIGNsYXNzIHRvIGVtcHR5OworICAgIHZvaWQgcHJpbnQoRklMRSAqZnAgPSBzdGRvdXQsIGJvb2wgbmV3bGluZSA9IHRydWUsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWVfc3VmZml4ID0gc3RkOjpzdHJpbmcoIiIpLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lX3ByZWZpeCA9IHN0ZDo6c3RyaW5nKCIiKSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgY3R4X3BhcmFtID0gc3RkOjpzdHJpbmcoIiIpKSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKyAgICBWYXJzQXJyYXkgJiB2YXJzKCkgeyByZXR1cm4gbV92YXJzOyB9CisgICAgVmFyICYgcmV0dmFsKCkgeyByZXR1cm4gbV9yZXR2YWw7IH0KKyAgICBWYXIgKiB2YXIoY29uc3Qgc3RkOjpzdHJpbmcgJiBuYW1lKTsKKyAgICBib29sIGhhc1BvaW50ZXJzKCk7CisgICAgYm9vbCB1bnN1cHBvcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5zdXBwb3J0ZWQ7IH0KKyAgICB2b2lkIHNldFVuc3VwcG9ydGVkKGJvb2wgc3RhdGUpIHsgbV91bnN1cHBvcnRlZCA9IHN0YXRlOyB9CisgICAgYm9vbCBjdXN0b21EZWNvZGVyKCkgeyByZXR1cm4gbV9jdXN0b21EZWNvZGVyOyB9CisgICAgdm9pZCBzZXRDdXN0b21EZWNvZGVyKGJvb2wgc3RhdGUpIHsgbV9jdXN0b21EZWNvZGVyID0gc3RhdGU7IH0KKyAgICBib29sIG5vdEFwaSgpIGNvbnN0IHsgcmV0dXJuIG1fbm90QXBpOyB9CisgICAgdm9pZCBzZXROb3RBcGkoYm9vbCBzdGF0ZSkgeyBtX25vdEFwaSA9IHN0YXRlOyB9CisgICAgYm9vbCBmbHVzaE9uRW5jb2RlKCkgY29uc3QgeyByZXR1cm4gbV9mbHVzaE9uRW5jb2RlOyB9CisgICAgdm9pZCBzZXRGbHVzaE9uRW5jb2RlKGJvb2wgc3RhdGUpIHsgbV9mbHVzaE9uRW5jb2RlID0gc3RhdGU7IH0KKyAgICBpbnQgc2V0QXR0cmlidXRlKGNvbnN0IHN0ZDo6c3RyaW5nICZsaW5lLCBzaXplX3QgbGMpOworCitwcml2YXRlOgorICAgIGVudW0geyBQUl9SRVRWQUwgPSAwLCBQUl9OQU1FLCBQUl9WQVJTLCBQUl9ET05FIH0gcHJTdGF0ZTsKKyAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgVmFyIG1fcmV0dmFsOworICAgIFZhcnNBcnJheSBtX3ZhcnM7CisgICAgYm9vbCBtX3Vuc3VwcG9ydGVkOworICAgIGJvb2wgbV9jdXN0b21EZWNvZGVyOworICAgIGJvb2wgbV9ub3RBcGk7CisgICAgYm9vbCBtX2ZsdXNoT25FbmNvZGU7CisKKyAgICB2b2lkIGVycih1bnNpZ25lZCBpbnQgbGMsIGNvbnN0IGNoYXIgKm1zZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxpbmUgJWQ6ICVzXG4iLCBsYywgbXNnKTsKKyAgICB9Cit9OworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlci5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vUGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM5ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlci5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJQYXJzZXIuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2RlZmluZSBXSElURVNQQUNFICIgXHRcbiIKKworLy8gUGFyc2UgdGhlIHxpbnB1dHwgc3RyaW5nIGFzIGEgbGlzdCBvZiB0eXBlLXNwZWNpZmljIHRva2Vucy4KKy8vIFRoaXMgdG9rZW5pemVzIHRoZSBpbnB1dCwgdXNpbmcgd2hpdGVzcGFjZSBhcyBzZXBhcmF0b3JzIGFuZCAnKicgYXMKKy8vIGEgc2luZ2xlIHRva2VuIHRvby4gT24gc3VjY2VzcywgcmV0dXJuIHRydWUgYW5kIHNldHMgfCpvdXR8IHRvIHRoZQorLy8gbGlzdCBvZiB0b2tlbnMuIE9uIGZhaWx1cmUsIHJldHVybiBmYWxzZS4KKy8vCisvLyBFeGFtcGxlOiAnY29uc3QgY2hhcioqZm9vJyAtPiBbJ2NvbnN0JywgJ2NoYXInLCAnKicsICcqJywgJ2ZvbyddCisvLworc3RhdGljIGJvb2wgcGFyc2VUeXBlVG9rZW5zKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgICBvdXQtPmNsZWFyKCk7CisgICAgc2l6ZV90IHBvcyA9IDBVOworCisgICAgLy8gUGFyc2UgYWxsIHRva2VucyBpbiB0aGUgaW5wdXQsIHRyZWF0ICcqJyBhcyBhIHNpbmdsZSB0b2tlbi4KKyAgICAvLyBJLmUuCisgICAgZm9yICg7OykgeworICAgICAgICAvLyBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgcG9zID0gaW5wdXQuZmluZF9maXJzdF9ub3Rfb2YoV0hJVEVTUEFDRSwgcG9zKTsKKyAgICAgICAgaWYgKHBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYnJlYWs7ICAvLyBlbmQgb2YgcGFyc2UuCisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3RhciwgZW5zdXJlIGl0IGZvbGxvd3MgYSB0eXBlIG5hbWUuCisgICAgICAgIC8vIG90aGVyd2lzZSB0cmVhdCBpdCBhcyBwYXJ0IG9mIHRoZSBmaW5hbCB0eXBlLgorICAgICAgICBpZiAoaW5wdXRbcG9zXSA9PSAnKicpIHsKKyAgICAgICAgICAgIG91dC0+cHVzaF9iYWNrKHN0ZDo6c3RyaW5nKCIqIikpOworICAgICAgICAgICAgcG9zICs9IDFVOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5kIGVuZCBvZiB0eXBlL3Rva2VuLgorICAgICAgICBzaXplX3QgZW5kID0gaW5wdXQuZmluZF9maXJzdF9vZihXSElURVNQQUNFICIqIiwgcG9zKTsKKyAgICAgICAgaWYgKGVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgZW5kID0gaW5wdXQuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gaW5wdXQuc3Vic3RyKHBvcywgZW5kIC0gcG9zKTsKKyAgICAgICAgaWYgKHN0ci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmVycm9yID0gIlVuZXhwZWN0ZWQgZW1wdHkgdG9rZW4gIT8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgb3V0LT5wdXNoX2JhY2soc3RyKTsKKyAgICAgICAgcG9zID0gZW5kOworICAgIH0KKworICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgICAgIC8vIFNhbml0eSBjaGVjazogcmVxdWlyZSBub24tZW1wdHkgaW5wdXQKKyAgICAgICAgaWYgKG91dC0+ZW1wdHkoKSkgeworICAgICAgICAgICAgKmVycm9yID0gIkVtcHR5IHBhcmFtZXRlciBkZWNsYXJhdGlvbiEiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrOiBUaGVyZSBtdXN0IGJlIGJhc2UgdHlwZSBuYW1lIGJlZm9yZSBhbnkgJyonCisgICAgICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgb3V0LT5zaXplKCk7ICsrbikgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcmIHRva2VuID0gKCpvdXQpW25dOworICAgICAgICAgICAgaWYgKHRva2VuID09ICIqIikgeworICAgICAgICAgICAgICAgICplcnJvciA9ICJVbmV4cGVjdGVkICcqJyBiZWZvcmUgdHlwZSBuYW1lIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuICE9ICJjb25zdCIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBHaXZlbiB8dG9rZW5zfCwgYW4gaW5wdXQgdmVjdG9yIG9mIHN0cmluZ3MsIGpvaW4gdGhlIGZpcnN0IHxjb3VudHwgaXRlbXMKKy8vIGludG8gYSBub3JtYWxpemVkIHR5cGUgc3RyaW5nLCBhbmQgcmV0dXJuIGl0Lgorc3RhdGljIHN0ZDo6c3RyaW5nIGJ1aWxkVHlwZVN0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50KSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworCisgICAgZm9yIChzaXplX3QgbiA9IDA7IG4gPCBjb3VudDsgKytuKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiA9IHRva2Vuc1tuXTsKKyAgICAgICAgaWYgKG4gPiAwICYmIHRva2VuICE9ICIqIikgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQodG9rZW4pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0ZDo6c3RyaW5nIG5vcm1hbGl6ZVR5cGVEZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zOworICAgIGlmICghcGFyc2VUeXBlVG9rZW5zKGlucHV0LCAmdG9rZW5zLCBOVUxMKSkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHJldHVybiBidWlsZFR5cGVTdHJpbmcodG9rZW5zLCB0b2tlbnMuc2l6ZSgpKTsKK30KKworYm9vbCBwYXJzZVR5cGVEZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKSB7CisgICAgLy8gVGhlIHR5cGUgbmFtZSBjYW4gYmUgbWFkZSBvZiBzZXZlcmFsIHRva2VucywgZS5nLiAndW5zaWduZWQgaW50JworICAgIC8vIHVzZSBhbiBhcnJheSB0byBzdG9yZSB0aGVtLCBhbmQgYSBjb3VudCB2YXJpYWJsZS4gRWFjaCBpdGVtIGNhbiBiZQorICAgIC8vIG9uZSBvZiAnKicsICdjb25zdCcgb3IgYSB0eXBlIG5hbWUgY29tcG9uZW50IChlLmcuICdzdHJ1Y3QnLCAndW5zaWduZWQnKQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7CisKKyAgICBpZiAoIXBhcnNlVHlwZVRva2VucyhpbnB1dCwgJnRva2VucywgZXJyb3IpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTYW5pdHkgY2hlY2ssIHRoZXJlIG11c3QgYmUgYSBsZWFzdCBvbmUgbm9uLXNwZWNpYWwgdG9rZW5zLgorICAgIHNpemVfdCBub25TcGVjaWFsQ291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwgdG9rZW5zLnNpemUoKTsgKytuKSB7CisgICAgICAgIGlmICh0b2tlbnNbbl0gIT0gIioiICYmIHRva2Vuc1tuXSAhPSAiY29uc3QiKSB7CisgICAgICAgICAgICBub25TcGVjaWFsQ291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobm9uU3BlY2lhbENvdW50ID09IDApIHsKKyAgICAgICAgKmVycm9yID0gIk1pc3NpbmcgdHlwZSBuYW1lIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBCdWlsZCB0aGUgdHlwZSBuYW1lIGZyb20gYWxsIHRva2VucyBiZWZvcmUgaXQuCisgICAgKnR5cGVOYW1lID0gYnVpbGRUeXBlU3RyaW5nKHRva2VucywgdG9rZW5zLnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBwYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHZhcmlhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zOworCisgICAgaWYgKCFwYXJzZVR5cGVUb2tlbnMocGFyYW0sICZ0b2tlbnMsIGVycm9yKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrLCB0aGVyZSBtdXN0IGJlIGEgbGVhc3QgdHdvIG5vbi1zcGVjaWFsIHRva2Vucy4KKyAgICBzaXplX3Qgbm9uU3BlY2lhbENvdW50ID0gMDsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IHRva2Vucy5zaXplKCk7ICsrbikgeworICAgICAgICBpZiAodG9rZW5zW25dICE9ICIqIiAmJiB0b2tlbnNbbl0gIT0gImNvbnN0IikgeworICAgICAgICAgICAgbm9uU3BlY2lhbENvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5vblNwZWNpYWxDb3VudCA9PSAwKSB7CisgICAgICAgICplcnJvciA9ICJNaXNzaW5nIHR5cGUgbmFtZSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5vblNwZWNpYWxDb3VudCA9PSAxKSB7CisgICAgICAgICplcnJvciA9ICJNaXNzaW5nIHZhcmlhYmxlIG5hbWUiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrOiB2YXJpYWJsZSBuYW1lIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5ICdjb25zdCcgb3IgJyonCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMuc2l6ZSgpIC0gMVVdOworICAgIGlmIChsYXN0VG9rZW4gPT0gIioiKSB7CisgICAgICAgICplcnJvciA9ICJFeHRyYSAnKicgYWZ0ZXIgdmFyaWFibGUgbmFtZSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGxhc3RUb2tlbiA9PSAiY29uc3QiKSB7CisgICAgICAgICplcnJvciA9ICJFeHRyYSAnY29uc3QnIGFmdGVyIHZhcmlhYmxlIG5hbWUiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgdmFyaWFibGUgbmFtZSBhcyB0aGUgbGFzdCB0b2tlbi4KKyAgICBpZiAodmFyaWFibGVOYW1lKSB7CisgICAgICAgICp2YXJpYWJsZU5hbWUgPSBsYXN0VG9rZW47CisgICAgfQorICAgIC8vIEJ1aWxkIHRoZSB0eXBlIG5hbWUgZnJvbSBhbGwgdG9rZW5zIGJlZm9yZSBpdC4KKyAgICAqdHlwZU5hbWUgPSBidWlsZFR5cGVTdHJpbmcodG9rZW5zLCB0b2tlbnMuc2l6ZSgpIC0gMVUpOworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MmMwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vUGFyc2VyLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBQQVJTRVJfSAorI2RlZmluZSBQQVJTRVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBOb3JtYWxpemUgYSB0eXBlIGRlY2xhcmF0aW9uLiBUaGlzIGdldHMgcmlkIG9mIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZQorLy8gYXMgd2VsbCBhcyBlbnN1cmUgdGhlcmUgaXMgYSBzaW5nbGUgc3BhY2Ugc2VwYXJhdGluZyBhbGwgaW5wdXQgdG9rZW5zLAorLy8gd2l0aCB0aGUgZXhjZXB0aW9uIG9mICcqJyB3aGljaCBpcyB0cmVhdGVkIHNwZWNpYWxseSBieSBuZXZlciBiZWluZworLy8gcHJlcGVuZGVkIHdpdGggYSBzcGFjZS4KKy8vIHxpbnB1dHwgaXMgdGhlIGlucHV0IHR5cGUgZGVjbGFyYXRpb24uIFJldHVybiBub3JtYWxpemVkIGZvcm0uCisvLyBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHRyeSB0byB2YWxpZGF0ZSB0aGUgaW5wdXQuCitzdGQ6OnN0cmluZyBub3JtYWxpemVUeXBlRGVjbGFyYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGlucHV0KTsKKworLy8gUGFyc2UgYSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbi4gfGlucHV0fCBpcyB0aGUgdHlwZSBkZWNsYXJhdGlvbgorLy8gKGUuZy4gJ2NvbnN0IGNoYXIqKicpLiBPbiBzdWNjZXNzIHJldHVybiB0cnVlIGFuZCBzZXRzIHwqdHlwZU5hbWV8IHRvCisvLyB0aGUgYXBwcm9wcmlhdGUgbm9ybWFsaXplZCB0eXBlIHN0cmluZy4gT24gZmFpbHVyZSwgcmV0dXJuIGZhbHNlIGFuZAorLy8gc2V0cyB8KmVycm9yfCB3aXRoIGEgaHVtYW4tZnJpZW5kbHkgbWVzc2FnZSBleHBsYWluaW5nIHRoZSByZWFzb24gZm9yCisvLyBmYWlsdXJlLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgdHlwZSBzdHJpbmcgaXMgbm9ybWFsaXplZCwgc2VlIGNvbW1lbnQgZm9yCisvLyBwYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uKCkgZm9yIGV4YW1wbGVzLgorLy8KKy8vIE5PVEU6IFRoaXMgZG9lcyBub3Qgc3VwcG9ydCBkZWNsYXJhdGlvbnMgb2YgYXJyYXlzIG9yIGZ1bmN0aW9ucyEKKy8vCitib29sIHBhcnNlVHlwZURlY2xhcmF0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3IpOworCisvLyBQYXJzZSBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWNsYXJhdGlvbiBhbmQgZXh0cmFjdCB0aGUgdHlwZSBhbmQgdmFyaWFibGUKKy8vIG5hbWUgZnJvbSBpdC4gfHBhcmFtfCBpcyB0aGUgaW5kaXZpZHVhbCBwYXJhbWV0ZXIgZGVjbGFyYXRpb24gZnJvbSB0aGUKKy8vIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIChlLmcuICdjb25zdCBjaGFyICppdGVtcycpCisvLworLy8gT24gc3VjY2VzcywgcmV0dXJucyB0cnVlIGFuZCBzZXRzIHwqdmFydHlwZXwgYW5kIHwqdmFybmFtZXwgdG8gdGhlCisvLyBhcHByb3ByaWF0ZSB0eXBlIG5hbWUgYW5kIHZhcmlhYmxlIG5hbWUuIHx2YXJuYW1lfCBjYW4gYmUgTlVMTCBpZiB0aGUgY2FsbGVyCisvLyBpc24ndCBpbnRlcmVzdGVkIGluIHRoZSB2YXJpYWJsZSBuYW1lLgorLy8KKy8vIE9uIGZhaWx1cmUsIHJldHVybiBmYWxzZSBhbmQgc2V0cyB8KmVycm9yfCB0byBhIGh1bWFuLWZyaWVuZGx5IG1lc3NhZ2UKKy8vIGV4cGxhaW5pbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZS4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHJldHVybmVkIHR5cGUgbmFtZSBpcyBub3JtYWxpemVkIHdpdGggcmVnYXJkcyB0byB3aGl0ZXNwYWNlCisvLyBhbmQgc3RhciBsb2NhdGlvbiwgZS5nLjoKKy8vCisvLyAgICAgIGNvbnN0IHZvaWQgKml0ZW1zICAgICAgICAgICAtPiAnY29uc3Qgdm9pZConCisvLyAgICAgIGNoYXIqICppdGVtcyAgICAgICAgICAgICAgICAtPiAnY2hhcioqJworLy8gICAgICBjb25zdCB2b2lkICogY29uc3QgKiBpdGVtcyAgLT4gJ2NvbnN0IHZvaWQqIGNvbnN0KicKKy8vICAgICAgdW5zaWduZWQgaW50ICpjb25zdCBkYXRhICAgIC0+ICd1bnNpZ25lZCBpbnQqIGNvbnN0JworLy8KK2Jvb2wgcGFyc2VQYXJhbWV0ZXJEZWNsYXJhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIHR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB2YXJpYWJsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yKTsKKworI2VuZGlmICAvLyBQQVJTRVJfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlcl91bml0dGVzdC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vUGFyc2VyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDRiMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1BhcnNlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJQYXJzZXIuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgQVJSQVlMRU4oeCkgIChzaXplb2YoeCkgLyBzaXplb2YoeFswXSkpCisKK1RFU1QoUGFyc2VyVGVzdCwgbm9ybWFsaXplVHlwZURlY2xhcmF0aW9uKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkOworICAgICAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICB9IGtEYXRhW10gPSB7CisgICAgICAgIHsgImNoYXIiLCAiY2hhciIgfSwKKyAgICAgICAgeyAiY29uc3QgdW5zaWduZWQgaW50IiwgIiAgIGNvbnN0ICAgdW5zaWduZWRcdGludFxuIiB9LAorICAgICAgICB7ICJjaGFyKiBjb25zdCoqIiwgImNoYXIgKmNvbnN0KiAqIiB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGV4dCA9ICJXaGVuIHBhcnNpbmcgJyI7CisgICAgICAgIHRleHQgKz0ga0RhdGFbbl0uaW5wdXQ7CisgICAgICAgIHRleHQgKz0gIiciOworCisgICAgICAgIHJlc3VsdCA9IG5vcm1hbGl6ZVR5cGVEZWNsYXJhdGlvbihrRGF0YVtuXS5pbnB1dCk7CisgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZCwgcmVzdWx0LmNfc3RyKCkpIDw8IHRleHQ7CisgICAgfQorfQorCitURVNUKFBhcnNlclRlc3QsIHBhcnNlVHlwZURlY2xhcmF0aW9uKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGlucHV0OworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZFR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkRXJyb3I7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICJjb25zdCIsIGZhbHNlLCBOVUxMLCAiTWlzc2luZyB0eXBlIG5hbWUiIH0sCisgICAgICAgIHsgImNvbnN0IGNvbnN0IiwgZmFsc2UsIE5VTEwsICJNaXNzaW5nIHR5cGUgbmFtZSIgfSwKKyAgICAgICAgeyAiZm9vIiwgdHJ1ZSwgImZvbyIsIE5VTEwgfSwKKyAgICAgICAgeyAidm9pZCIsIHRydWUsICJ2b2lkIiwgTlVMTCB9LAorICAgICAgICB7ICJjb25zdCBmb28iLCB0cnVlLCAiY29uc3QgZm9vIiwgTlVMTCB9LAorICAgICAgICB7ICJmb28gKiIsIHRydWUsICJmb28qIiwgTlVMTCB9LAorICAgICAgICB7ICJjaGFyIGZvbyIsIHRydWUsICJjaGFyIGZvbyIsIE5VTEwgfSwKKyAgICAgICAgeyAiXHR1bnNpZ25lZCBcdCAgaW50XG4iLCB0cnVlLCAidW5zaWduZWQgaW50IiwgTlVMTCB9LAorICAgICAgICB7ICJjb25zdCAqIGNoYXIiLCBmYWxzZSwgTlVMTCwgIlVuZXhwZWN0ZWQgJyonIGJlZm9yZSB0eXBlIG5hbWUiIH0sCisgICAgICAgIHsgImNvbnN0IGNoYXIgKiAiLCB0cnVlLCAiY29uc3QgY2hhcioiLCBOVUxMIH0sCisgICAgICAgIHsgImNvbnN0IHZvaWQqY29uc3QgKiAqIiwgdHJ1ZSwgImNvbnN0IHZvaWQqIGNvbnN0KioiLCBOVUxMIH0sCisgICAgfTsKKyAgICBjb25zdCBzaXplX3Qga0RhdGFTaXplID0gQVJSQVlMRU4oa0RhdGEpOworICAgIGZvciAoc2l6ZV90IG4gPSAwOyBuIDwga0RhdGFTaXplOyArK24pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFybmFtZSwgdmFydHlwZSwgZXJyb3I7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRleHQgPSAiV2hlbiBwYXJzaW5nICciOworICAgICAgICB0ZXh0ICs9IGtEYXRhW25dLmlucHV0OworICAgICAgICB0ZXh0ICs9ICInIjsKKworICAgICAgICBFWFBFQ1RfRVEoa0RhdGFbbl0uZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICBwYXJzZVR5cGVEZWNsYXJhdGlvbihrRGF0YVtuXS5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSkgPDwgdGV4dDsKKyAgICAgICAgaWYgKGtEYXRhW25dLmV4cGVjdGVkKSB7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRUeXBlLCB2YXJ0eXBlLmNfc3RyKCkpIDw8IHRleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRFcnJvciwgZXJyb3IuY19zdHIoKSkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVChQYXJzZXJUZXN0LCBwYXJzZVBhcmFtZXRlckRlY2xhcmF0aW9uKSB7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIGlucHV0OworICAgICAgICBib29sIGV4cGVjdGVkOworICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZFR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkVmFyaWFibGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkRXJyb3I7CisgICAgfSBrRGF0YVtdID0geworICAgICAgICB7ICJmb28iLCBmYWxzZSwgTlVMTCwgTlVMTCwgIk1pc3NpbmcgdmFyaWFibGUgbmFtZSIgfSwKKyAgICAgICAgeyAiY29uc3QiLCBmYWxzZSwgTlVMTCwgTlVMTCwgIk1pc3NpbmcgdHlwZSBuYW1lIiB9LAorICAgICAgICB7ICJjb25zdCBmb28iLCBmYWxzZSwgTlVMTCwgTlVMTCwgIk1pc3NpbmcgdmFyaWFibGUgbmFtZSIgfSwKKyAgICAgICAgeyAiY29uc3QgY29uc3QiLCBmYWxzZSwgTlVMTCwgTlVMTCwgIk1pc3NpbmcgdHlwZSBuYW1lIiB9LAorICAgICAgICB7ICJjaGFyIGZvbyIsIHRydWUsICJjaGFyIiwgImZvbyIsIE5VTEwgfSwKKyAgICAgICAgeyAidW5zaWduZWQgICBpbnRcdCBiYXJcbiIsIHRydWUsICJ1bnNpZ25lZCBpbnQiLCAiYmFyIiwgTlVMTCB9LAorICAgICAgICB7ICJjb25zdCAqIGNoYXIgZm9vIiwgZmFsc2UsIE5VTEwsIE5VTEwsICJVbmV4cGVjdGVkICcqJyBiZWZvcmUgdHlwZSBuYW1lIiB9LAorICAgICAgICB7ICJjb25zdCBjaGFyICogZm9vIiwgdHJ1ZSwgImNvbnN0IGNoYXIqIiwgImZvbyIsIE5VTEwgfSwKKyAgICAgICAgeyAiY29uc3Qgdm9pZCpjb25zdCAqZGF0YSIsIHRydWUsICJjb25zdCB2b2lkKiBjb25zdCoiLCAiZGF0YSIsIE5VTEwgfSwKKyAgICAgICAgeyAiY2hhciBmb28gY29uc3QiLCBmYWxzZSwgTlVMTCwgTlVMTCwgIkV4dHJhICdjb25zdCcgYWZ0ZXIgdmFyaWFibGUgbmFtZSIgfSwKKyAgICAgICAgeyAiaW50IGJhcioiLCBmYWxzZSwgTlVMTCwgTlVMTCwgIkV4dHJhICcqJyBhZnRlciB2YXJpYWJsZSBuYW1lIiB9LAorICAgIH07CisgICAgY29uc3Qgc2l6ZV90IGtEYXRhU2l6ZSA9IEFSUkFZTEVOKGtEYXRhKTsKKyAgICBmb3IgKHNpemVfdCBuID0gMDsgbiA8IGtEYXRhU2l6ZTsgKytuKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHZhcm5hbWUsIHZhcnR5cGUsIGVycm9yOworICAgICAgICBzdGQ6OnN0cmluZyB0ZXh0ID0gIldoZW4gcGFyc2luZyAnIjsKKyAgICAgICAgdGV4dCArPSBrRGF0YVtuXS5pbnB1dDsKKyAgICAgICAgdGV4dCArPSAiJyI7CisKKyAgICAgICAgRVhQRUNUX0VRKGtEYXRhW25dLmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgcGFyc2VQYXJhbWV0ZXJEZWNsYXJhdGlvbihrRGF0YVtuXS5pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSA8PCB0ZXh0OworICAgICAgICBpZiAoa0RhdGFbbl0uZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFR5cGUsIHZhcnR5cGUuY19zdHIoKSkgPDwgdGV4dDsKKyAgICAgICAgICAgIEVYUEVDVF9TVFJFUShrRGF0YVtuXS5leHBlY3RlZFZhcmlhYmxlLCB2YXJuYW1lLmNfc3RyKCkpIDw8IHRleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfU1RSRVEoa0RhdGFbbl0uZXhwZWN0ZWRFcnJvciwgZXJyb3IuY19zdHIoKSkgPDwgdGV4dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9SRUFETUUgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTg1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vUkVBRE1FCkBAIC0wLDAgKzEsMzMyIEBACitJbnRyb2R1Y3Rpb246CistLS0tLS0tLS0tLS0tCitUaGUgZW11Z2VuIHRvb2wgaXMgYSB0b29sIHRvIGdlbmVyYXRlIGEgd2lyZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbgorYmFzZWQgb24gcHJvdmlkZWQgQVBJLiAgVGhlIHRvb2wgZ2VuZXJhdGVzIGMrKyBlbmNvZGVyIGNvZGUgdGhhdCB0YWtlcworQVBJIGNhbGxzIGFuZCBlbmNvZGVzIHRoZW0gaW50byB0aGUgd2lyZSBhbmQgZGVjb2RlciBjb2RlIHRoYXQgZGVjb2RlcwordGhlIHdpcmUgc3RyZWFtIGFuZCBjYWxscyBzZXJ2ZXIgbWF0Y2hpbmcgQVBJLgorVGhlIGVtdWdlbiB0b29sIGluY2x1ZGVzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSB0aGF0IGVuYWJsZXMgdG8KK2dlbmVyYXRlIGFuIHdyYXBwZXIgbGlicmFyeS4gVGhlIHdyYXBwZXIgbGlicmFyeSBwcm92aWRlcyBlbnRyeSBwb2ludHMKK2ZvciB0aGUgc3BlY2lmaWVkIEFQSSwgd2hlcmUgZWFjaCBlbnRyeSByb3V0ZXMgdGhlIGNhbGwgdmlhIGEgZGlzcGF0Y2gKK3RhYmxlLiBUaGUgZGlzcGF0Y2ggdGFibGUgbWF5IGJlIGluaXRpYWxpemVkIGFzIHJlcXVpcmVkIGJ5IGEgc3BlY2lmaWMgYXBwbGljYXRpb24uCisKK1RoZSBmb2xsb3dpbmcgcGFyYWdyYXBocyBpbmNsdWRlcyB0aGUgZm9sbG93aW5nOgorICAgICogV2lyZSBQcm90b2NvbCBEZXNjcmlwdGlvbgorICAgICogSW5wdXQgZmlsZXMgZGVzY3JpcHRpb24gJiBmb3JtYXQKKyAgICAqIEdlbmVyYXRlZCBjb2RlIGRlc2NyaXB0aW9uLgorCisKK05vdGU6IEluIHRoaXMgZG9jdW1lbnQsIHRoZSBjYWxsZXIgaXMgcmVmZXJyZWQgdG8gYXMgRW5jb2RlciBvciBDbGllbnQKK2FuZCB0aGUgY2FsbGVlIGlzIHJlZmVycmVkIHRvIGFzIHRoZSBEZWNvZGVyIG9yIFNlcnZlci4gVGhlc2UgdGVybXMKK2FyZSB1c2VkIGludGVyY2hhbmdlYWJseSBieSB0aGUgY29udGV4dC4KKworCisKK1dpcmUgUHJvdG9jb2wgcGFja2V0IHN0cnVjdHVyZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0EgZ2VuZXJhbCBFbmNvZGVyLT5EZWNvZGVyIHBhY2tldCBpcyBzdHJ1Y3R1cmVkIGFzIGZvbGxvd2luZzoKK3N0cnVjdCBQYWNrZXQgeworCXVuc2lnbmVkIGludCBvcGNvZGU7CisJdW5zaWduZWQgaW50IHBhY2tldF9sZW47CisJ4oCmIHBhcmFtZXRlciAxCisJ4oCmIHBhcmFtZXRlciAyCit9OworQSBnZW5lcmFsIERlY29kZXItPkVuY29kZXIgcmVwbHkgaXMgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgaW4gdGhlCitjb250ZXh0IG9mIHRoZSDigJhjYWxs4oCZIHRoYXQgdHJpZ2dlcmVkIGl0LCB0aHVzIGl0IGluY2x1ZGVzIHRoZSByZXBseQorZGF0YSBvbmx5LCB3aXRoIG5vIGNvbnRleHQgaGVhZGVycy4gSW4gcHJlY2lzZSB0ZXJtIHRlcm1zLCBhIHJlcGx5CitwYWNrZXQgd2lsbCBsb29rIGxpa2U6CisKK3N0cnVjdCB7CisJLi4uLy8gcmVwbHkgZGF0YQorfTsKKworY29uc2lkZXIgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjYWxsOgoraW50IGZvbyhpbnQgcDEsIHNob3J0IHMxKQord2lsbCBiZSBlbmNvZGVkIGludG8gOgoreworCTEwMSwgLy8gZm9vIG9wY29kZQorCTE0LCAvLyBzaXplb2Yob3Bjb2RlKSArIHNpemVvZihwYWNrZXRfbGVuKSArIHNpemVvZihpbnQpICsgc2l6ZW9mKHNob3J0KQorCXAxLCAvLyA0IGJ5dGVzCisJczEgLy8gMiBieXRlcworfQorCitTaW5jZSDigJhmb2/igJkgcmV0dXJucyB2YWx1ZSwgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byByZWFkIGJhY2sgdGhlIHJldHVybiBwYWNrZXQgZnJvbSB0aGUgc2VydmVyLT5jbGllbnQgc3RyZWFtLiBUaGUgcmV0dXJuIHZhbHVlIGluIHRoaXMgZXhhbXBsZSBpcyBpbiB0aHVzIHRoZSByZXR1cm4gcGFja2V0IGlzOgoreworCWludCByZXR2YWw7Cit9CisKKworUG9pbnRlciBkZWNvZGluZzoKKy0tLS0tLS0tLS0tLS0tLS0KK1RoZSB3aXJlIHByb3RvY29sIGFsc28gYWxsb3dzIGV4Y2hhbmdpbmcgb2YgcG9pbnRlciBkYXRhCisoYXJyYXlzKS4gUG9pbnRlcnMgYXJlIGRlZmluZWQgd2l0aCBkaXJlY3Rpb25zOgorCisJaW4gOiBEYXRhIGlzIHNlbnQgZnJvbSB0aGUgY2FsbGVyIHRvIHRoZSBjYWxsZQorCW91dDogRGF0YSBpcyBzZW50IGZyb20gdGhlIGNhbGxlZSB0byB0aGUgY2FsbGVyCisJaW5fb3V0OiBkYXRhIGlzIHNlbnQgZnJvbSB0aGUgY2FsbGVyIGFuZCByZXR1cm4gaW4gcGxhY2UuCisKK+KAmGlu4oCZIGFuZCDigJhpbl9vdXTigJkgZW5jb2RlZCB3aXRoIHRoZWlyIGxlbjoKK3sKKwl1bnNpbmdlZCBpbnQgcG9pbnRlcl9kYXRhX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbcG9pbnRlcl9kYXRhX2xlbl074oCmIC8vIHBvaW50ZXIgZGF0YQorfQorCivigJhvdXTigJkgcG9pbnRlcnMgYXJlIGVuY29kZWQgYnkgZGF0YSBsZW5ndGggb25seToKK3sKK3Vuc2lnbmVkIGludCBwb2ludGVyX2RhdGFfbGVuOworfQorCivigJhvdXTigJkgYW5kIOKAmGluX291dOKAmSBwb2ludGVy4oCZcyBkYXRhIGlzIHJldHVybmVkIGluIHRoZSByZXR1cm4KK3BhY2tldC4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY2FsbDoKKworaW50IGZvbyhpbnQgbiwgaW50ICpwdHIpOyAvLyBhc3N1bWUgdGhhdCDigJhkYXRh4oCZIGlzIGluX291dCBwb2ludGVyIHdoaWNoIGNvbnRhaW5zIOKAmG7igJkgaW50cworCitUaGUgY2FsbGVyIHBhY2tldCB3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgoreworCTEwMSwgLy8gZm9vIG9wY29kZQorCXh4LCBzaXplb2Yob3Bjb2RlKSArIHNpemVvZihkYXRhbGVuKSArIHNpemVvZihpbnQpICsgc2l6ZW9mKHVuc2lnbmVkIGludCkgKyBuICogc2l6ZW9mKGludCk7CisJbiwgLy8gdGhlIG4gcGFyYW1ldGVyCisJbiAqIHNpemVvZihpbnQpLCAvLyBzaXplIG9mIHRoZSBkYXRhIGluIHB0cgorCeKApiAvLyBuKiBzaXplb2YoaW50KSBieXRlcworfQorCitUaGUgcmV0dXJuIHBhY2tldCBpczsKK3sKKwnigKYuIC8vIG4gKiBzaXplb2YoaW50KSBieXRlcyBvZiBkYXRhIHJldHVybiBpbiBwdHIKKwlyZXR2YWwgLy8gc2l6ZW9mKGludCkgLSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbjsKK30KKworRW5kaWFuZXNzCistLS0tLS0tLS0KK1RoZSBXaXJlIHByb3RvY29sIGlzIGRlc2lnbmVkIHRvIGltcG9zZSBtaW5pbXVtIG92ZXJoZWFkIG9uIHRoZSBjbGllbnQKK3NpZGUuIFRodXMsIHRoZSBkYXRhIGVuZGlhbm5lc3MgdGhhdCBpcyBzZW50IGFjcm9zcyB0aGUgd2lyZSBpcworZGV0ZXJtaW5lZCBieSB0aGUg4oCYY2xpZW504oCZIHNpZGUuIEl0IGlzIHVwIHRvIHRoZSBzZXJ2ZXIgc2lkZSB0bworZGV0ZXJtaW5lIHRoZSBjbGllbnQgZW5kaWFuZXNzIGFuZCBtYXJzaGFsIHRoZSBwYWNrZXRzIGFzIHJlcXVpcmVkLgorCisKKworRW11Z2VuIGlucHV0IGZpbGVzIC0gcHJvdG9jb2wgc3BlY2lmaWNhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHByb3RvY29sIGdlbmVyYXRlZCBieSBlbXVnZW4gY29uc2lzdHMgb2YgdHdvIGlucHV0IGZpbGVzOgorCisxLiBiYXNlbmFtZS5pbiAtIEEgc2VwY2lmaWNhdGlvbiBvZiB0aGUgcHJvdG9jb2wgUlBDIHByb2NlZHVyZXMuIFRoaXMKK3BhcnQgb2YgdGhlIHNwZWNpZmljYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKK2Zyb20gYy9jKysgaGVhZGVyIGZpbGVzIG9yIHNpbWlsYXIuCisKK+KAmGJhc2VuYW1l4oCZIGlzIHRoZSBiYXNlbmFtZSBmb3IgdGhlIHByb3RvY29sIGFuZCB3aWxsIGJlIHVzZWQgdG8gcHJlZml4Cit0aGUgZmlsZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIHByb3RvY29sLiAgQSBsaW5lIGluIHRoZSAuaW4KK2ZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCitbcHJlZml4XShyZXR2YWxUeXBlLCBGdW5jTmFtZSwgPHBhcmFtIHR5cGU+IFtwYXJhbSBuYW1lXSwuLi4pCit3aGVyZSAKKwlyZXR2YWxUeXBlIC0gVGhlIGZ1bmN0aW9uIHJldHVybiB2YWx1ZSB0eXBlCisJRnVuY05hbWUgLSBmdW5jdGlvbiBuYW1lCisJPHBhcmFtIHR5cGU+IG1hbmRhdG9yeSBwYXJhbWV0ZXIgdHlwZQorCVtwYXJhbSBuYW1lXSAtIG9wdGlvbmFsIHBhcmFtZXRlciBuYW1lCitFeGFtcGxlczoKK0dMX0VOVFJZKHZvaWQsIGdsVmVydGV4MWYsIGZsb2F0IHYpIAorWFhYKGludCAqLCBmb28sIGludCBuLCBmbG9hdCwgc2hvcnQpCitYWFgodm9pZCwgZ2xGbHVzaCwgdm9pZCkKKworTm90ZTogRW1wdHkgbGluZXMgaW4gdGhlIGZpbGUgYXJlIGlnbm9yZWQuIEEgbGluZSBzdGFydHMgd2l0aCAjIGlzIGEgY29tbWVudAorCisyLiBiYXNlbmFtZS5hdHRyaWIgLSBBdHRyaWJ1dGVzIGluZm9ybWF0aW9uIG9mIHRoZSBBUEkuIAorVGhpcyBmaWxlIGluY2x1ZGVzIGFkZGl0aW9uYWwgZmxhZ3MsIHBvaW50ZXJzIGRhdGFsZW4gaW5mb3JtYXRpb24gYW5kCitnbG9iYWwgYXR0cmlidXRlcyBvZiB0aGUgcHJvdG9jb2wuIEZvciB1cHRvZGF0ZSBmb3JtYXQgb2YgdGhlIGZpbGUsCitwbGVhc2UgcmVmZXIgdG8gdGhlIHNwZWNpZmljYXRpb24gZmlsZSBpbiB0aGUgcHJvamVjdCBzb3VyY2UKK3RyZWUuIFRoZSBmb3JtYXQgb2YgdGhlIC5hdHRyaWIgZmlsZSBpcyBkZXNjcmliZWQgYmVsb3cuCisKKzMuIGJhc2VuYW1lLnR5cGVzIC0gVHlwZXMgaW5mb3JtYXRpb24KKworVGhpcyBmaWxlcyBkZXNjcmliZXMgdGhlIHR5cGVzIHRoYXQgYXJlIGRlc2NyaWJlZCBieSB0aGUgQVBJLiBBIHR5cGUKK2lzIGRlZmluZWQgYXMgZm9sbG93czoKKzx0eXBlIG5hbWU+IDxzaXplIGluIGJpdHM+IDxwcmludCBmb3JtYXQgc3RyaW5nPiA8aXMgYSBwb2ludGVyPyB0cnVlfGZhbHNlPgord2hlcmU6Cis8dHlwZSBuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgdHlwZSBhcyBkZXNjcmliZWQgaW4gdGhlIEFQSQorPHNpemUgaW4gYml0cz4gMCwgOCwgMTYsIDMyIHNpemVzIGFyZSBhY2NlcHRlZAorPHByaW50IGZvcm1hdCBzdHJpbmc+IGEgc3RyaW5nIHRvIGZvcm1hdCB0aGUgdmFsdWUgb2YgdGhlIHR5cGUsIGFzCithY2NldGVkIGJ5IHByaW50ZigzKQorPGlzIHBvaW50ZXI/PiB0cnVlIG9yIGZhbHNlIHN0cmluZyBzcGVjaWVzIHdoZXRoZXIgdGhlIHR5cGUgc2hvdWxkIGJlCit0cmVhdGVkIGFzIGEgcG9pbnRlci4KKworZXhhbXBsZToKK0dMaW50IDMyICVkIGZhbHNlCitHTGludCogMzIgJXAgdHJ1ZQorR0xwdHIgIDMyICVwIHRydWUKKworRW5jb2RlciBnZW5lcmF0ZWQgY29kZSBmaWxlcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBlbmNvZGVyIGZpbGVzLCBvbmUgc2hvdWxkIHJ1biB0aGUg4oCYZW11Z2Vu4oCZCit0b29sIGFzIGZvbGxvd3M6CisKK2VtdWdlbiAtaSA8aW5wdXQgZGlyZWN0b3J5PiAtRSA8ZW5jb2RlciBmaWxlcyBvdXRwdXQgZGlyZWN0b3J5PiA8YmFzZW5hbWU+Cit3aGVyZToKKwk8aW5wdXQgZGlyZWN0b3J5PiBjb250YWluZXMgdGhlIGFwaSBzcGVjaWZpY2F0aW9uIGZpbGVzICAoYmFzZW5hbWUuaW4gKyBiYXNlbmFtZS5hdHRyaWIpCisJPGVuY29kZXIgZGlyZWN0b3J5PiAtIGEgZGlyZWN0b3J5IG5hbWUgdG8gZ2VuZXJhdGUgdGhlIGVuY29kZXIgb3V0cHV0IGZpbGVzCisJYmFzZW5hbWUgLSBUaGUgYmFzZW5hbWUgZm9yIHRoZSBhcGkuCisKK0Fzc3VtaW5nIHRoZSBiYXNlbmFtZSBpcyDigJhhcGnigJksIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGdlbmVyYXRlZDoKKworYXBpX29wY29kZXMuaCAtIGRlZmluZXMgdGhlIHByb3RvY29sIG9wY29kZXMuIFRoZSBmaXJzdCBvcGNvZGUgdmFsdWUKK2lzIDAsIHVubGVzcyBkZWZpbmVkIG90aGVyd2lzZSBpbiB0aGUgLmF0dHJpYiBmaWxlCisKK2FwaV9lbnRyeS5jcHAgLSBkZWZpbmVzIGVudHJ5IHBvaW50cyBmb3IgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZQorZGVmaW5lZCBieSB0aGUgcHJvdG9jb2wuIHRoaXMgRmlsZSBhbHNvIGluY2x1ZGVzIGEgZnVuY3Rpb24gY2FsbAor4oCYc2V0Q29udGV4dEFjY2Vzc29yKHZvaWQgKigqZikoKSkuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8KK3Byb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucyB0byBhY2Nlc3MKK3RoZSBlbmNvZGVyIGNvbnRleHQuIEZvciBleGFtcGxlLCBzdWNoIGNhbGxiYWNrIGNvdWxkIGZldGNoIHRoZQorY29udGV4dCBmcm9tIGEgVGhyZWFkIExvY2FsIFN0b3JhZ2UgKFRMUykgbG9jYXRpb24uCisKK2FwaV9jbGllbnRfcHJvYy5oIC0gdHlwZSBkZWZpbnRpb25zIGZvciB0aGUgcHJvdG9jb2wgcHJvY2VkdXJlcy4gCisKK2FwaV9jbGllbnRfY29udGV4dC5oIC0gZGVmaW5lcyB0aGUgY2xpZW50IHNpZGUgZGlzcGF0Y2ggdGFibGUgZGF0YQorc3RydWN0dXJlIHRoYXQgc3RvcmVzIHRoZSBlbmNvZGluZyBmdW5jdGlvbnMuIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgYWxzbworaW5jbHVkZXMg4oCYYWNjZXNzb3Jz4oCZIG1ldGhvZHMgc3VjaCB0aGF0IGxpYnJhcnkgdXNlciBjYW4gb3ZlcnJpZGUKK2RlZmF1bHQgZW50cmllcyBmb3Igc3BlY2lhbCBjYXNlIGhhbmRsaW5nLgorCithcGlfY2xpZW50X2NvbnRleHQuY3BwIC0gZGVmaW5lcyBhbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IKK2Rpc3BhdGNoIHRhYmxlCisKK2FwaV9lbmMuaCAtIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgZW5jb2RlciBkYXRhIHN0cmN1dHVyZS4gVGhlCitlbmNvZGVyIGRhdGEgc3RydWN0dXJlIGluaGVyaXRzIGl0cyBmdW5jdGlvbmFsaXR5IGZyb20gdGhlCivigJhjbGllbnRfY29udGV4dOKAmSBjbGFzcyBhYm92ZSBhbmQgYWRkcyBlbmNvZGluZyBhbmQgc3RyZWFtaW5nCitmdW5jdGlvbmFsaXR5LgorCithcGlfZW5jLmNwcCAtIEVuY29kZXIgaW1wbGVtZW50YXRpb24uIAorCitEZWNvZGVyIGdlbmVyYXRlZCBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBkZWNvZGVyIGZpbGVzLCBvbmUgc2hvdWxkIHJ1biB0aGUg4oCYZW11Z2Vu4oCZCit0b29sIGFzIGZvbGxvd3M6CitlbXVnZW4gLWkgPGlucHV0IGRpcmVjdG9yeT4gLUQgPGRlY29kZXIgZmlsZXMgb3V0cHV0IGRpcmVjdG9yeT4gYmFzZW5hbWUKK3doZXJlOgorCTxpbnB1dCBkaXJlY3Rvcnk+IGNvbnRhaW5lcyB0aGUgYXBpIHNwZWNpZmljYXRpb24gZmlsZXMgIChiYXNlbmFtZS5pbiArIGJhc2VuYW1lLmF0dHJpYikKKwk8ZGVjb2RlciBkaXJlY3Rvcnk+IC0gYSBkaXJlY3RvcnkgbmFtZSB0byBnZW5lcmF0ZSB0aGUgZGVjb2RlciBvdXRwdXQgZmlsZXMKKwliYXNlbmFtZSAtIFRoZSBiYXNlbmFtZSBmb3IgdGhlIGFwaS4KKworV2l0aCByZXNlcGN0IHRvIHRoZSBleGFtcGxlIGFib3ZlLCBFbXVnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgZm9sbG93aW5nCitmaWxlczoKKworYXBpX29wY29kZXMuaCAtIFByb3RvY29sIG9wY29kZXMKKworYXBpX3NlcnZlcl9wcm9jLmggLSB0eXBlIGRlZmluaXRpb25zIGZvciB0aGUgc2VydmVyIHNpZGUgcHJvY2VkdXJlcworCithcGlfc2VydmVyX2NvbnRleHQuaCAtIGRpc3BhdGNoIHRhYmxlIHRoZSBkZWNvZGVyIGZ1bmN0aW9ucworCithcGlfc2VydmVyX2NvbnRleHQuY3BwIC0gZGlzcGF0Y2ggdGFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KK2FwaV9kZWMuaCAtIERlY29kZXIgaGVhZGVyIGZpbGUKKworYXBpX2RlYy5jcHAgLSBEZWNvZGVyIGltcGxlbWVudGF0aW9uLiBJbiBhZGR0aW9uLCB0aGlzIGZpbGUgaW5jbHVkZXMKK2FuIGludGlhaWxpemF0aW9uIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIHVzZXIgcHJvdmlkZWQgY2FsbGJhY2sgdG8KK2luaXRpYWxpemUgdGhlIEFQSSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uIEFuIGV4YW1wbGUgZm9yIHN1Y2gKK2luaXRpYWxpemF0aW9uIGlzIGxvYWRpbmcgYSBzZXQgb2YgZnVuY3Rpb25zIGZyb20gYSBzaGFyZWQgbGlicmFyeQorbW9kdWxlLgorCitXcmFwcGVyIGdlbmVyYXRlZCBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0luIG9yZGVyIHRvIGdlbmVyYXRlIGEgd3JhcHBlciBsaWJyYXJ5IGZpbGVzLCBvbmUgc2hvdWxkIHJ1biB0aGUKKydlbXVnZW4nIHRvb2wgYXMgZm9sbG93czoKKworZW11Z2VuIC1pIDxpbnB1dCBkaXJlY3Rvcnk+IC1XIDx3cmFwcGVyIGZpbGVzIG91dHB1dCBkaXJlY3Rvcnk+IGJhc2VuYW1lCit3aGVyZToKKwk8aW5wdXQgZGlyZWN0b3J5PiBjb250YWluZXMgdGhlIGFwaSBzcGVjaWZpY2F0aW9uIGZpbGVzICAoYmFzZW5hbWUuaW4gKyBiYXNlbmFtZS5hdHRyaWIpCisJPHdyYXBwZXIgZGlyZWN0b3J5PiAtIGEgZGlyZWN0b3J5IG5hbWUgdG8gZ2VuZXJhdGUgdGhlIHdyYXBwZXIgb3V0cHV0IGZpbGVzCisJYmFzZW5hbWUgLSBUaGUgYmFzZW5hbWUgZm9yIHRoZSBhcGkuCisKK1dpdGggcmVzZXBjdCB0byB0aGUgZXhhbXBsZSBhYm92ZSwgRW11Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZworZmlsZXM6CisKK2FwaV93cmFwcGVyX3Byb2MuaCAtIHR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSB3cmFwcGVyIHByb2NlZHVyZXMKKworYXBpX3dyYXBwZXJfY29udGV4dC5oIC0gZGlzcGF0Y2ggdGFibGUgdGhlIHdyYXBwZXIgZnVuY3Rpb25zCisKK2FwaV93cmFwcGVyX2NvbnRleHQuY3BwIC0gZGlzcGF0Y2ggdGFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KK2FwaV93cmFwcGVyX2VudHJ5LmNwcCAtIGVudHJ5IHBvaW50cyBmb3IgdGhlIEFQSQorCisKKy5hdHRyaWIgZmlsZSBmb3JtYXQgZGVzY3JpcHRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgLmF0dHJpYiBmaWxlIGlzIGFuIGlucHV0IGZpbGUgdG8gZW11Z2VuIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUKKyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBjb2RlIGdlbmVyYXRpb24uCitUaGUgZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93czoKKworYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggIyBpcyBpZ25vcmVkIChjb21tZW50KQorYSBlbXB0eSBsaW5lIGp1c3Qgd2hpdGVzcGFjZSBvZiAoIiAiICJcdCIgIlxuIikgaXMgaWdub3JlZC4KKworVGhlIGZpbGUgaXMgZGl2aWRlZCBpbnRvICdzZWN0aW9ucycsIGVhY2ggZGVzY3JpYmVzIGEgc3BlY2lmaWMgQVBJCitmdW5jdGlvbiBjYWxsLiBBIHNlY3Rpb24gc3RhcnRzIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluCitjb2x1bW4gMC4KKworQSBzZWN0aW9uIHRoYXQgc3RhcnRzIHdpdGggdGhlIHJlc2VydmVkIHdvcmQgJ0dMT0JBTCcgcHJvdmlkZXMgZ2xvYmFsCithdHRyaWJ1dGVzLgorCitiZWxvdyBhcmUgZmV3IHNlY3Rpb25zIGV4YW1wbGVzOgorCitHTE9CQUwKKyAgZW5jb2Rlcl9oZWFkZXJzIHN0cmluZy5oIGt1a3UuaAorCitnbFZlcnRleDNmdgorCWxlbiBkYXRhIChzaXplKQorZ2xUZXhJbWFnZTJECisgICAgICAgbGVuIHBpeGVscyAocGl4ZWxzID09IE5VTEw/IDAgOiAoZm9ybWF0X3BpeGVsX3NpemUoaW50ZXJuYWxmb3JtYXQpICogd2lkdGggKiBoZWlnaHQgKiB0eXBlX3NpemUodHlwZSkpKQorCisKK0dsb2JhbCBzZWN0aW9uIGZsYWdzIGRlc2NyaXB0aW9uOgorCitiYXNlX29wY29kZQorICAgIHNldCB0aGUgYmFzZSBvcGNvZGUgdmFsdWUgZm9yIHRoaXMgYXBpCisgICAgZm9ybWF0OiBiYXNlX29wY29kZSAxMDAKKworZW5jb2Rlcl9oZWFkZXJzCisgICAgYSBsaXN0IG9mIGhlYWRlcnMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBlbmNvZGVyIGhlYWRlciBmaWxlCisgICAgZm9ybWF0OiBlbmNvZGVyX2hlYWRlcnMgPHN0ZGlvLmg+ICJrdWt1LmgiCisKK2NsaWVudF9jb250ZXh0X2hlYWRlcnMKKyAgICBhIGxpc3Qgb2YgaGVhZGVycyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGNsaWVudCBjb250ZXh0IGhlYWRlciBmaWxlCisgICAgZm9ybWF0OiBjbGllbnRfY29udGV4dF9oZWFkZXJzIDxzdGRpby5oPiAia3VrdS5oIgorCitkZWNvZGVyX2hlYWRlcnMKKyAgICBhIGxpc3Qgb2YgaGVhZGVycyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRlY29kZXIgaGVhZGVyIGZpbGUKKyAgICBmb3JtYXQ6IGRlY29kZXJfaGVhZGVycyA8c3RkaW8uaD4gImt1a3UuaCIKKworc2VydmVyX2NvbnRleHRfaGVhZGVycworICAgIGEgbGlzdCBvZiBoZWFkZXJzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc2VydmVyIGNvbnRleHQgaGVhZGVyIGZpbGUKKyAgICBmb3JtYXQ6IHNlcnZlcl9jb250ZXh0X2hlYWRlcnMgPHN0ZGlvLmg+ICJrdWt1LmgiCisKKworRW50cnkgcG9pbnQgZmxhZ3MgZGVzY3JpcHRpb246CisKKyBsZW4KKwlkZXNjaXB0aW9uIDogcHJvdmlkZSBhbiBleHByZXNzaW9uIHRvIGNhbGN1YWx0ZSBhbiBleHByZXNzaW9uIGRhdGEgbGVuCisJZm9ybWF0OiBsZW4gPHZhciBuYW1lPiA8YyBleHByZXNzaW9uIHRoYXQgY2FsY2x1YXRlcyB0aGUgZGF0YSBsZW4+CisKK2N1c3RvbV9wYWNrCisJZGVzY3JpcHRpb246IHByb3ZpZGUgYW4gZXhwcmVzc2lvbiB0byBwYWNrIGRhdGEgaW50byB0aGUgc3RyZWFtLgorCWZvcm1hdDogY3VzdG9tX3BhY2sgPHZhciBuYW1lPiA8YysrIGV4cHJlc3Npb24gdGhhdCBwYWNrIGRhdGEgZnJvbSB2YXIgaW50byB0aGUgc3RyZWFtPgorCVRoZSBzdHJlYW0gaXMgcmVwcmVzZW50ZWQgYnkgYSAodW5zaWduZWQgY2hhciAqKXB0ci4gVGhlIGV4cHJlc3Npb24gbWF5IGFsc28gcmVmZXIKKwl0byBvdGhlciBmdW5jdGlvbiBwYXJhbWV0ZXJzLiBJbiBhZGRpdGlvbiwgdGhlIGV4cHJlc3Npb24gbWF5IHJlZmVyIHRvICd2b2lkICpzZWxmJyB3aGljaAorCWlzIHRoZSBlbmNvZGluZyBjb250ZXh0IGFzIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisKKyBkaXIKKwlkZXNjcmlwdGlvbiA6IHNldCBhIHBvaW50ZXIgZGlyZWN0aW9uIChpbiAtIGZvciBkYXRhIHRoYXQgZ29lcworCXRvIHRoZSBjb2RlYywgb3V0IGZyb20gZGF0YSB0aGF0IHJldHVybnMgZnJvbSB0aGUgY29kZWMuCisgICAgIAlmb3JtYXQ6IGRpciA8dmFybmFtZT4gPFtpbiB8IG91dCB8IGlub3V0XT4KKworIHZhcl9mbGFnIAorIAkgZGVzY3JpcHRpb24gOiBzZXQgdmFyaWFibGUgZmxhZ3MKKyAJIGZvcm1hdDogdmFyX2ZsYWcgPHZhcm5hbWU+IDwgbnVsbEFsbG93ZWQgfCBpc0xhcmdlIHwgLi4uID4KKworICAgICAgICBudWxsQWxsb3dlZCAtPiBmb3IgcG9pbnRlciB2YXJpYWJsZXMsIGluZGljYXRlcyB0aGF0IE5VTEwgaXMgYSB2YWxpZCB2YWx1ZQorICAgICAgICBpc0xhcmdlICAgICAtPiBmb3IgcG9pbnRlciB2YXJpYWJsZXMsIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIHNob3VsZCBiZSBzZW50IHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIGNvcHkKKworIGZsYWcKKwlkZXNjcmlwdGlvbjogc2V0IGVudHJ5IHBvaW50IGZsYWc7IAorCWZvcm1hdDogZmxhZyA8IHVuc3VwcG9ydGVkIHwgLi4uID4KKwlzdXBwb3J0ZWQgZmxhZ3MgYXJlOgorCXVuc3VwcG9ydGVkIC0gVGhlIGVuY29kZXIgc2lkZSBpbXBsZW1lbnRhdGlvbiBpcyBwb2ludGVkIHRvICJ1bnN1cHBvcmVkIHJlcG9ydGluZyBmdW5jdGlvbiIuIAorCWN1c3RvbV9kZWNvZGVyIC0gVGhlIGRlY29kZXIgaXMgZXhwZWN0ZWQgdG8gYmUgcHJvdmlkZWQgd2l0aAorCQkgICAgICAgCSBjdXN0b20gaW1wbGVtZW50YXRpb24uIFRoZSBjYWxsIHRvIHRoZQorCQkgICAgICAgCSBkZW9jZGVyIGZ1bmN0aW9uIGluY2x1ZGVzIGEgcG9pbnRlciB0byB0aGUKKwkJICAgICAgIAkgY29udGV4dAorICAgIG5vdF9hcGkgLSB0aGUgZnVuY3Rpb24gaXMgbm90IG5hdGl2ZSBnbCBhcGkKKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vVHlwZUZhY3RvcnkuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1R5cGVGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBjYzk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1R5cGVGYWN0b3J5LmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJUeXBlRmFjdG9yeS5oIgorCisjaW5jbHVkZSAiUGFyc2VyLmgiCisjaW5jbHVkZSAiVmFyVHlwZS5oIgorI2luY2x1ZGUgInN0clV0aWxzLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCitUeXBlRmFjdG9yeSAqIFR5cGVGYWN0b3J5OjptX2luc3RhbmNlID0gTlVMTDsKKwordHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVmFyVHlwZT4gVHlwZU1hcDsKK3N0YXRpYyAgVHlwZU1hcCBnX3Zhck1hcDsKK3N0YXRpYyBib29sIGdfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKK3N0YXRpYyBpbnQgZ190eXBlSWQgPSAwOworCisKKyNkZWZpbmUgQUREX1RZUEUobmFtZSwgc2l6ZSwgcHJpbnRmb3JtYXQsaXNwb2ludGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ192YXJNYXAuaW5zZXJ0KHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgVmFyVHlwZT4obmFtZSwgVmFyVHlwZShnX3R5cGVJZCsrLCBuYW1lLCAoc2l6ZSArIDcpID4+IDMsIHByaW50Zm9ybWF0ICwgaXNwb2ludGVyKSkpOworCit2b2lkIFR5cGVGYWN0b3J5Ojppbml0QmFzZVR5cGVzKCkKK3sKKyAgICBnX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBBRERfVFlQRSgiVU5LTk9XTiIsIDAsICIweCV4IiwgZmFsc2UpOworICAgIEFERF9UWVBFKCJ2b2lkIiwgMCwgIjB4JXgiLCBmYWxzZSk7CisgICAgQUREX1RZUEUoImNoYXIiLCA4LCAiJWMiLCBmYWxzZSk7CisgICAgQUREX1RZUEUoImludCIsIDMyLCAiJWQiLCBmYWxzZSk7CisgICAgQUREX1RZUEUoImZsb2F0IiwgMzIsICIlZCIsIGZhbHNlKTsKKyAgICBBRERfVFlQRSgic2hvcnQiLCAxNiwgIiVkIiwgZmFsc2UpOworfQorCitpbnQgVHlwZUZhY3Rvcnk6OmluaXRGcm9tRmlsZShjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgaWYgKCFnX2luaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRCYXNlVHlwZXMoKTsKKyAgICB9CisKKyAgICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLmNfc3RyKCksICJydCIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjaGFyIGxpbmVbMTAwMF07CisgICAgaW50IGxjID0gMDsKKyAgICB3aGlsZShmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSAhPSBOVUxMKSB7CisgICAgICAgIGxjKys7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ciA9IHRyaW0obGluZSk7CisgICAgICAgIGlmIChzdHIuc2l6ZSgpID09IDAgfHwgc3RyLmF0KDApID09ICcjJykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV90IHBvcyA9IDAsIGxhc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIG5hbWUgPSBnZXROZXh0VG9rZW4oc3RyLCBwb3MsICZsYXN0LCBXSElURVNQQUNFKTsKKyAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZVR5cGVEZWNsYXJhdGlvbihuYW1lKTsKKyAgICAgICAgaWYgKG5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6ICVkIDogbWlzc2luZyB0eXBlIG5hbWVcbiIsIGxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBsYXN0ICsgMTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2l6ZTsKKyAgICAgICAgc2l6ZSA9IGdldE5leHRUb2tlbihzdHIsIHBvcywgJmxhc3QsIFdISVRFU1BBQ0UpOworICAgICAgICBpZiAoc2l6ZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogJWQgOiBtaXNzaW5nIHR5cGUgd2lkdGhcbiIsIGxjKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBsYXN0ICsgMTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJpbnRTdHJpbmc7CisgICAgICAgIHByaW50U3RyaW5nID0gZ2V0TmV4dFRva2VuKHN0ciwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIGlmIChwcmludFN0cmluZy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogJWQgOiBtaXNzaW5nIHByaW50LXN0cmluZ1xuIiwgbGMpOworICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGlzcG9pbnRlciBkZWZpbml0aW9uIGlzIG9wdGlvbmFsIHNpbmNlIHdlIGNhbiBqdXN0CisgICAgICAgIC8vIGxvb2sgYXQgdGhlIHR5cGUgbmFtZSwgYW5kIGRldGVybWluZSBpdCBpcyBhIHBvaW50ZXIgaWYKKyAgICAgICAgLy8gaXQgZW5kcyB3aXRoICcqJy4KKyAgICAgICAgYm9vbCBpc1BvaW50ZXIgPSAobmFtZVtuYW1lLnNpemUoKSAtIDFVXSA9PSAnKicpOworCisgICAgICAgIHBvcyA9IGxhc3QgKyAxOworICAgICAgICBzdGQ6OnN0cmluZyBwb2ludGVyRGVmOworICAgICAgICBwb2ludGVyRGVmID0gZ2V0TmV4dFRva2VuKHN0ciwgcG9zLCAmbGFzdCwgV0hJVEVTUEFDRSk7CisgICAgICAgIGlmIChwb2ludGVyRGVmLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBKdXN0IGEgbGl0dGxlIHNhbml0eSBjaGVjay4KKyAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZygidHJ1ZSIpPT1wb2ludGVyRGVmKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc1BvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogJWQ6IGludmFsaWQgaXNQb2ludGVyIGRlZmluaXRpb246ICd0cnVlJyBidXQgbmFtZSBkb2VzIG5vdCBlbmQgd2l0aCAnKichXG4iLCBsYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ZDo6c3RyaW5nKCJmYWxzZSIpPT1wb2ludGVyRGVmKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlZDogaW52YWxpZCBpc1BvaW50ZXIgZGVmaW5pdGlvbjogJ2ZhbHNlJyBidXQgbmFtZSBkb2VzIGVuZCB3aXRoICcqJyFcbiIsIGxjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogJWQgOiBpbnZhbGlkIGlzUG9pbnRlciBkZWZpbml0aW9uLCBtdXN0IGJlIGVpdGhlciBcInRydWVcIiBvciBcImZhbHNlXCJcbiIsIGxjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgYml0U2l6ZSA9IGF0b2koc2l6ZS5jX3N0cigpKTsKKyAgICAgICAgc2l6ZV90IGJ5dGVTaXplID0gKGJpdFNpemUgKyA3KSA+PiAzOworCisgICAgICAgIGlmIChnZXRWYXJUeXBlQnlOYW1lKG5hbWUpLT5pZCgpICE9IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiV2FyaW5pbmc6ICVkIDogdHlwZSAlcyBpcyBhbHJlYWR5IGtub3duLCBkZWZpbml0aW9uIGluIGxpbmUgJWQgaXMgdGFrZW5cbiIsCisgICAgICAgICAgICAgICAgICAgIGxjLCBuYW1lLmNfc3RyKCksIGxjKTsKKyAgICAgICAgfQorICAgICAgICBnX3Zhck1hcC5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBWYXJUeXBlPigKKyAgICAgICAgICAgICAgICBuYW1lLCBWYXJUeXBlKGdfdHlwZUlkKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlcikpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3ROYW1lID0gImNvbnN0ICIgKyBuYW1lOworICAgICAgICBnX3Zhck1hcC5pbnNlcnQoc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBWYXJUeXBlPigKKyAgICAgICAgICAgICAgICBjb25zdE5hbWUsIFZhclR5cGUoZ190eXBlSWQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUG9pbnRlcikpKTsgLy9hZGQgYSBjb25zdCB0eXBlCisgICAgfQorICAgIGdfaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiAwOworfQorCisKK2NvbnN0IFZhclR5cGUgKiBUeXBlRmFjdG9yeTo6Z2V0VmFyVHlwZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmIHR5cGUpCit7CisgICAgaWYgKCFnX2luaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRCYXNlVHlwZXMoKTsKKyAgICB9CisgICAgVHlwZU1hcDo6aXRlcmF0b3IgaSA9IGdfdmFyTWFwLmZpbmQodHlwZSk7CisgICAgaWYgKGkgPT0gZ192YXJNYXAuZW5kKCkpIHsKKyAgICAgICAgaSA9IGdfdmFyTWFwLmZpbmQoIlVOS05PV04iKTsKKyAgICB9CisgICAgcmV0dXJuICYoaS0+c2Vjb25kKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1R5cGVGYWN0b3J5LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vVHlwZUZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVlMmNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1R5cGVGYWN0b3J5LmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgX19UWVBFX19GQUNUT1JZX19IX18KKyNkZWZpbmUgX19UWVBFX19GQUNUT1JZX19IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJWYXJUeXBlLmgiCisKK2NsYXNzIFR5cGVGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgVHlwZUZhY3RvcnkgKmluc3RhbmNlKCkgeworICAgICAgICBpZiAobV9pbnN0YW5jZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBtX2luc3RhbmNlID0gbmV3IFR5cGVGYWN0b3J5OworICAgICAgICB9CisgICAgICAgIHJldHVybiBtX2luc3RhbmNlOworICAgIH0KKyAgICBjb25zdCBWYXJUeXBlICogZ2V0VmFyVHlwZUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdHlwZSk7CisgICAgaW50ICBpbml0RnJvbUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVuYW1lKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIFR5cGVGYWN0b3J5ICptX2luc3RhbmNlOworICAgIHZvaWQgaW5pdEJhc2VUeXBlcygpOworICAgIFR5cGVGYWN0b3J5KCkge30KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9WYXIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9WYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDhkNzIzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1Zhci5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9fVkFSX19IX18KKyNkZWZpbmUgX19WQVJfX0hfXworCisjaW5jbHVkZSAiVmFyVHlwZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdGRpby5oPgorCitjbGFzcyBWYXIgeworcHVibGljOgorICAgIC8vIHBvaW50ZXIgZGF0YSBkaXJlY3Rpb24gLSBmcm9tIHRoZSBjbGllbnQgcG9pbnQgb2Ygdmlldy4KKyAgICB0eXBlZGVmIGVudW0geyBQT0lOVEVSX09VVCA9IDB4MSwgUE9JTlRFUl9JTiA9IDB4MiwgUE9JTlRFUl9JTk9VVCA9IDB4MyB9IFBvaW50ZXJEaXI7CisgICAgVmFyKCkgPSBkZWZhdWx0OworCisgICAgVmFyKGNvbnN0IHN0ZDo6c3RyaW5nICYgbmFtZSwKKyAgICAgICAgY29uc3QgVmFyVHlwZSAqIHZhcnR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGVuRXhwcmVzc2lvbiwKKyAgICAgICAgUG9pbnRlckRpciBkaXIsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZwYWNrRXhwcmVzc2lvbiwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJndyaXRlRXhwcmVzc2lvbikgOgorICAgICAgICBtX25hbWUobmFtZSksCisgICAgICAgIG1fdHlwZShjb25zdF9jYXN0PFZhclR5cGUgKj4odmFydHlwZSkpLAorICAgICAgICBtX2xlbkV4cHJlc3Npb24obGVuRXhwcmVzc2lvbiksCisgICAgICAgIG1fcG9pbnRlckRpcihkaXIpLAorICAgICAgICBtX3BhY2tFeHByZXNzaW9uKHBhY2tFeHByZXNzaW9uKSwKKyAgICAgICAgbV93cml0ZUV4cHJlc3Npb24od3JpdGVFeHByZXNzaW9uKQorICAgIHsKKyAgICB9CisKKyAgICB2b2lkIGluaXQoY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSwgY29uc3QgVmFyVHlwZSAqIHZhcnR5cGUsCisgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxlbkV4cHJlc3Npb24sCisgICAgICAgICAgICAgIFBvaW50ZXJEaXIgZGlyLAorICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYWNrRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgd3JpdGVFeHByZXNzaW9uKSB7CisgICAgICAgIG1fbmFtZSA9IG5hbWU7CisgICAgICAgIG1fdHlwZSA9IHZhcnR5cGU7CisgICAgICAgIG1fbGVuRXhwcmVzc2lvbiA9IGxlbkV4cHJlc3Npb247CisgICAgICAgIG1fcGFja0V4cHJlc3Npb24gPSBwYWNrRXhwcmVzc2lvbjsKKyAgICAgICAgbV93cml0ZUV4cHJlc3Npb24gPSB3cml0ZUV4cHJlc3Npb247CisgICAgICAgIG1fcG9pbnRlckRpciA9IGRpcjsKKyAgICAgICAgbV9udWxsQWxsb3dlZCA9IGZhbHNlOworICAgICAgICBtX2lzTGFyZ2UgPSBmYWxzZTsKKworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIGNvbnN0IFZhclR5cGUgKiB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90eXBlOyB9CisgICAgYm9vbCBpc1BvaW50ZXIoKSBjb25zdCB7IHJldHVybiBtX3R5cGUtPmlzUG9pbnRlcigpOyB9CisgICAgYm9vbCBpc1ZvaWQoKSBjb25zdCB7IHJldHVybiAoKG1fdHlwZS0+Ynl0ZXMoKSA9PSAwKSAmJiAoIW1fdHlwZS0+aXNQb2ludGVyKCkpKTsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgbGVuRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fbGVuRXhwcmVzc2lvbjsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFja0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybihtX3BhY2tFeHByZXNzaW9uKTsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nICYgd3JpdGVFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4obV93cml0ZUV4cHJlc3Npb24pOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbUNoZWNrRXhwcmVzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fcGFyYW1DaGVja0V4cHJlc3Npb247IH0KKyAgICB2b2lkIHNldExlbkV4cHJlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJiBsZW5FeHByZXNzaW9uKSB7IG1fbGVuRXhwcmVzc2lvbiA9IGxlbkV4cHJlc3Npb247IH0KKyAgICB2b2lkIHNldFBhY2tFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFja0V4cHJlc3Npb24pIHsgbV9wYWNrRXhwcmVzc2lvbiA9IHBhY2tFeHByZXNzaW9uOyB9CisgICAgdm9pZCBzZXRXcml0ZUV4cHJlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJiB3cml0ZUV4cHJlc3Npb24pIHsgbV93cml0ZUV4cHJlc3Npb24gPSB3cml0ZUV4cHJlc3Npb247IH0KKyAgICB2b2lkIHNldFBhcmFtQ2hlY2tFeHByZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFyYW1DaGVja0V4cHJlc3Npb24pIHsgbV9wYXJhbUNoZWNrRXhwcmVzc2lvbiA9IHBhcmFtQ2hlY2tFeHByZXNzaW9uOyB9CisgICAgdm9pZCBzZXRQb2ludGVyRGlyKFBvaW50ZXJEaXIgZGlyKSB7IG1fcG9pbnRlckRpciA9IGRpcjsgfQorICAgIFBvaW50ZXJEaXIgcG9pbnRlckRpcigpIHsgcmV0dXJuIG1fcG9pbnRlckRpcjsgfQorICAgIHZvaWQgc2V0TnVsbEFsbG93ZWQoYm9vbCBzdGF0ZSkgeyBtX251bGxBbGxvd2VkID0gc3RhdGU7IH0KKyAgICB2b2lkIHNldElzTGFyZ2UoYm9vbCBzdGF0ZSkgeyBtX2lzTGFyZ2UgPSBzdGF0ZTsgfQorICAgIGJvb2wgbnVsbEFsbG93ZWQoKSBjb25zdCB7IHJldHVybiBtX251bGxBbGxvd2VkOyB9CisgICAgYm9vbCBpc0xhcmdlKCkgY29uc3QgeyByZXR1cm4gbV9pc0xhcmdlOyB9CisgICAgdm9pZCBwcmludFR5cGUoRklMRSAqZnApIHsgZnByaW50ZihmcCwgIiVzIiwgbV90eXBlLT5uYW1lKCkuY19zdHIoKSk7IH0KKyAgICB2b2lkIHByaW50VHlwZU5hbWUoRklMRSAqZnApIHsgcHJpbnRUeXBlKGZwKTsgZnByaW50ZihmcCwgIiAlcyIsIG1fbmFtZS5jX3N0cigpKTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKKyAgICBjb25zdCBWYXJUeXBlICogbV90eXBlID0gbnVsbHB0cjsKKyAgICBib29sIG1fcG9pbnRlciA9IGZhbHNlOyAvLyBpcyB0aGlzIHZhcmlhYmxlIGEgcG9pbnRlcjsKKyAgICBzdGQ6OnN0cmluZyBtX2xlbkV4cHJlc3Npb247IC8vIGFuIGV4cHJlc3Npb24gdG8gY2FsY3VhbHRlIGEgcG9pbnRlciBkYXRhIHNpemUKKyAgICBQb2ludGVyRGlyIG1fcG9pbnRlckRpciA9IFBPSU5URVJfSU47CisgICAgYm9vbCBtX251bGxBbGxvd2VkID0gZmFsc2U7CisgICAgYm9vbCBtX2lzTGFyZ2UgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyBtX3BhY2tFeHByZXNzaW9uOyAvLyBhbiBleHByZXNzaW9uIHRvIHBhY2sgZGF0YSBpbnRvIHRoZSBzdHJlYW0KKyAgICBzdGQ6OnN0cmluZyBtX3dyaXRlRXhwcmVzc2lvbjsgLy8gYW4gZXhwcmVzc2lvbiB0byB3cml0ZSBkYXRhIGludG8gdGhlIHN0cmVhbQorICAgIHN0ZDo6c3RyaW5nIG1fcGFyYW1DaGVja0V4cHJlc3Npb247IC8vYW4gZXhwcmVzc2lvbiB0byBjaGVjayBwYXJhbWV0ZXIgdmFsdWUKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL1ZhclR5cGUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9WYXJUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY5MzdhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9WYXJUeXBlLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpZm5kZWYgX19WQVJUWVBFX19IX18KKyNkZWZpbmUgX19WQVJUWVBFX19IX18KKworI2luY2x1ZGUgPHN0cmluZz4KKworLy8gVmFyVHlwZSBtb2RlbHMgdGhlIHR5cGVzIG9mIHZhbHVlcyB1c2VkIG9uIHRoZSB3aXJlIHByb3RvY29sIGJ5CisvLyBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycy4gRWFjaCB0eXBlIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgaWQsCisvLyBhbmQgYSBuYW1lLCBhbmQgcHJvdmlkZXMgYSBzaXplIGluIGJ5dGVzIGZvciB0aGUgdmFsdWVzLCBhIHByaW50Zi1saWtlCisvLyBmb3JtYXR0ZXIgc3RyaW5nLCBhbmQgYSBmbGFnIHRlbGxpbmcgaWYgdGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGEKKy8vIHBvaW50ZXIuCitjbGFzcyBWYXJUeXBlIHsKK3B1YmxpYzoKKyAgICBWYXJUeXBlKCkgOgorICAgICAgICAgICAgbV9pZCgwKSwKKyAgICAgICAgICAgIG1fbmFtZSgiZGVmYXVsdF9jb25zdHJ1Y3RlZCIpLAorICAgICAgICAgICAgbV9ieXRlU2l6ZSgwKSwKKyAgICAgICAgICAgIG1fcHJpbnRGb3JtYXQoIjB4JXgiKSwKKyAgICAgICAgICAgIG1faXNQb2ludGVyKGZhbHNlKSB7fQorCisgICAgVmFyVHlwZShzaXplX3QgaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmludEZvcm1hdCwKKyAgICAgICAgICAgIGJvb2wgaXNQb2ludGVyKSA6CisgICAgICAgICAgICBtX2lkKGlkKSwKKyAgICAgICAgICAgIG1fbmFtZShuYW1lKSwKKyAgICAgICAgICAgIG1fYnl0ZVNpemUoYnl0ZVNpemUpLAorICAgICAgICAgICAgbV9wcmludEZvcm1hdChwcmludEZvcm1hdCksCisgICAgICAgICAgICBtX2lzUG9pbnRlcihpc1BvaW50ZXIpIHt9CisKKyAgICB+VmFyVHlwZSgpIHt9CisKKyAgICBzaXplX3QgaWQoKSBjb25zdCB7IHJldHVybiBtX2lkOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKyAgICBzaXplX3QgYnl0ZXMoKSBjb25zdCB7IHJldHVybiBtX2J5dGVTaXplOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByaW50Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbV9wcmludEZvcm1hdDsgfQorICAgIGJvb2wgaXNQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gbV9pc1BvaW50ZXI7IH0KKworcHJpdmF0ZToKKyAgICBzaXplX3QgbV9pZDsKKyAgICBzdGQ6OnN0cmluZyBtX25hbWU7CisgICAgc2l6ZV90IG1fYnl0ZVNpemU7CisgICAgc3RkOjpzdHJpbmcgbV9wcmludEZvcm1hdDsKKyAgICBib29sIG1faXNQb2ludGVyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vZXJyb3JzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5YzI5MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9lcnJvcnMuaApAQCAtMCwwICsxLDI0IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfRVJST1JTX0hfCisjZGVmaW5lIF9FUlJPUlNfSF8KKworI2RlZmluZSBCQURfVVNBR0UgLTEKKyNkZWZpbmUgQkFEX1NQRUNfRklMRSAtMgorI2RlZmluZSBCQURfVFlQRVNfRklMRSAtMworI2RlZmluZSBCQURfQVRUUklCVVRFU19GSUxFIC00CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL2dldG9wdC5jIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjM1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vZ2V0b3B0LmMKQEAgLTAsMCArMSw3NiBAQAorI2luY2x1ZGUgImdldG9wdC5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSAgX2dldHByb2duYW1lKCkgbmFyZ3ZbMF0KKworaW50IG9wdGVyciA9IDE7CitpbnQgb3B0aW5kID0gMTsKK2ludCBvcHRvcHQgPSAwOworY2hhciogb3B0YXJnOworCitpbnQgZ2V0b3B0KGludCBhcmdjLCBjaGFyKiBjb25zdCBhcmd2W10sIGNvbnN0IGNoYXIqIG9zdHIpIHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRW1wdHlbXSA9ICIiOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwbGFjZSA9IGtFbXB0eTsKKyAgICBpZiAoISpwbGFjZSkgeworICAgICAgICBpZiAob3B0aW5kID49IGFyZ2MpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgY29uc3QgY2hhciogYXJnID0gYXJndltvcHRpbmRdOworICAgICAgICBpZiAoYXJnWzBdICE9ICctJykgeworICAgICAgICAgICAgLy8gTm90IGFuIG9wdGlvbi4KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnWzFdID09ICctJyAmJiAhYXJnWzJdKSB7CisgICAgICAgICAgICAvLyAnLS0nIC0+IGVuZCBvZiBvcHRpb25zLgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghYXJnWzFdKSB7CisgICAgICAgICAgICAvLyBTaW5nbGUgJy0nLCBJZiB0aGUgcHJvZ3JhbSB3YW50cyBpdCwgdHJlYXQgaXQgYXMgYW4gb3B0aW9uLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCdzIHRoZSBlbmQgb2Ygb3B0aW9ucy4KKyAgICAgICAgICAgIGlmICghc3RyY2hyKG9zdHIsICctJykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHRvcHQgPSAnLSc7CisgICAgICAgICAgICBwbGFjZSA9IGFyZyArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcHRvcHQgPSBhcmdbMV07CisgICAgICAgICAgICBwbGFjZSA9IGFyZyArIDI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2hhciogb2luZGV4ID0gc3RyY2hyKG9zdHIsIG9wdG9wdCk7CisgICAgaWYgKCFvaW5kZXgpIHsKKyAgICAgICAgLy8gVW5zdXBwb3J0ZWQgb3B0aW9uLgorICAgICAgICAodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbGxlZ2FsIG9wdGlvbiAtLSAlY1xuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAnPyc7CisgICAgfQorICAgIGlmIChvaW5kZXhbMV0gIT0gJzonKSB7CisgICAgICAgIC8vIE5vIGFyZ3VtZW50IG5lZWRlZC4KKyAgICAgICAgb3B0YXJnID0gTlVMTDsKKyAgICAgICAgaWYgKCEqcGxhY2UpCisgICAgICAgICAgICBvcHRpbmQrKzsKKyAgICAgICAgcmV0dXJuIG9wdG9wdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudC4gRWl0aGVyIGFmdGVyIHRoZSBvcHRpb24gY2hhcmFjdGVyLAorICAgIC8vIG9yIHRoZSBhcmd1bWVudCB0aGF0IGZvbGxvd3MuCisgICAgaWYgKCpwbGFjZSkgeworICAgICAgICBvcHRhcmcgPSAoY2hhciAqKXBsYWNlOworICAgIH0gZWxzZSBpZiAoYXJnYyA+ICsrb3B0aW5kKSB7CisgICAgICAgIG9wdGFyZyA9IChjaGFyICopYXJndltvcHRpbmRdOworICAgIH0gZWxzZSBpZiAob2luZGV4WzJdID09ICc6JykgeworICAgICAgICAvLyBPcHRpb25hbCBhcmd1bWVudCBpcyBtaXNzaW5nLgorICAgICAgICBwbGFjZSA9IGtFbXB0eTsKKyAgICAgICAgb3B0YXJnID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIG9wdG9wdDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBNaXNzaW5nIGFyZ3VtZW50LgorICAgICAgICBwbGFjZSA9IGtFbXB0eTsKKyAgICAgICAgKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tJWNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSwgb3B0b3B0KTsKKyAgICAgICAgcmV0dXJuICc6JzsKKyAgICB9CisgICAgcmV0dXJuIG9wdG9wdDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9nZXRvcHQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA0ODUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL2dldG9wdC5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgR0VUT1BUX0gKKyNkZWZpbmUgR0VUT1BUX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gaW50IG9wdGluZDsKK2V4dGVybiBjaGFyKiBvcHRhcmc7CitleHRlcm4gaW50IG9wdG9wdDsKKworaW50IGdldG9wdChpbnQgYXJnYywgY2hhciogY29uc3QgYXJndltdLCBjb25zdCBjaGFyKiBvc3RyKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBHRVRPUFRfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL21haW4uY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MDg2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vbWFpbi5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJFbnRyeVBvaW50LmgiCisjaW5jbHVkZSAic3RyVXRpbHMuaCIKKyNpbmNsdWRlICJBcGlHZW4uaCIKKyNpbmNsdWRlICJUeXBlRmFjdG9yeS5oIgorI2luY2x1ZGUgImdldG9wdC5oIgorCitjb25zdCBzdGQ6OnN0cmluZyBTUEVDX0VYVEVOU0lPTiA9IHN0ZDo6c3RyaW5nKCIuaW4iKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIEFUVFJJQl9FWFRFTlNJT04gPSBzdGQ6OnN0cmluZygiLmF0dHJpYiIpOworY29uc3Qgc3RkOjpzdHJpbmcgVFlQRVNfRVhURU5USU9OID0gc3RkOjpzdHJpbmcoIi50eXBlcyIpOworCisKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdIDxiYXNlIG5hbWU+XG4iLCBmaWxlbmFtZSk7CisgICAgZnByaW50ZihzdGRlcnIsICJcdC1oOiBUaGlzIG1lc3NhZ2VcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXHQtRSA8ZGlyPjogZ2VuZXJhdGUgZW5jb2RlciBpbnRvIGRpclxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJcdC1EIDxkaXI+OiBnZW5lcmF0ZSBkZWNvZGVyIGludG8gZGlyXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LWk6IGlucHV0IGRpciwgbG9jYWwgZGlyZWN0b3J5IGJ5IGRlZmF1bHRcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXHQtVCA6IGdlbmVyYXRlIGF0dHJpYnV0ZSB0ZW1wbGF0ZSBpbnRvIHRoZSBpbnB1dCBkaXJlY3Rvcnlcblx0XHRubyBvdGhlciBmaWxlcyBhcmUgZ2VuZXJhdGVkXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0LVcgOiBnZW5lcmF0ZSB3cmFwcGVyIGludG8gZGlyXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVyRGlyID0gIiI7CisgICAgc3RkOjpzdHJpbmcgZGVjb2RlckRpciA9ICIiOworICAgIHN0ZDo6c3RyaW5nIHdyYXBwZXJEaXIgPSAiIjsKKyAgICBzdGQ6OnN0cmluZyBpbkRpciA9ICIuIjsKKyAgICBib29sIGdlbmVyYXRlQXR0cmlidXRlc1RlbXBsYXRlID0gZmFsc2U7CisKKyAgICBpbnQgYzsKKyAgICB3aGlsZSgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiVEU6RDppOmhXOiIpKSAhPSAtMSkgeworICAgICAgICBzd2l0Y2goYykgeworICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgIHdyYXBwZXJEaXIgPSBzdGQ6OnN0cmluZyhvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgZ2VuZXJhdGVBdHRyaWJ1dGVzVGVtcGxhdGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgZW5jb2RlckRpciA9IHN0ZDo6c3RyaW5nKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICBkZWNvZGVyRGlyID0gc3RkOjpzdHJpbmcob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIGluRGlyID0gc3RkOjpzdHJpbmcob3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBhcmd1bWVudCAhIVxuIik7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPj0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbb3B0aW9uc10gPGJhc2UgbmFtZT4gXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIEJBRF9VU0FHRTsKKyAgICB9CisKKyAgICBpZiAoZW5jb2RlckRpci5zaXplKCkgPT0gMCAmJgorICAgICAgICBkZWNvZGVyRGlyLnNpemUoKSA9PSAwICYmCisgICAgICAgIGdlbmVyYXRlQXR0cmlidXRlc1RlbXBsYXRlID09IGZhbHNlICYmCisgICAgICAgIHdyYXBwZXJEaXIuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgc3BlY2lmaWVkIC0gYWJvcnRpbmdcbiIpOworICAgICAgICByZXR1cm4gQkFEX1VTQUdFOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGJhc2VOYW1lID0gc3RkOjpzdHJpbmcoYXJndltvcHRpbmRdKTsKKyAgICBBcGlHZW4gYXBpRW50cmllcyhiYXNlTmFtZSk7CisKKyAgICAvLyBpbml0IHR5cGVzOworICAgIHN0ZDo6c3RyaW5nIHR5cGVzRmlsZW5hbWUgPSBpbkRpciArICIvIiArIGJhc2VOYW1lICsgVFlQRVNfRVhURU5USU9OOworCisgICAgaWYgKFR5cGVGYWN0b3J5OjppbnN0YW5jZSgpLT5pbml0RnJvbUZpbGUodHlwZXNGaWxlbmFtZSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc2luZyBvciBlcnJvciByZWFkaW5nIHR5cGVzIGZpbGU6ICVzLi4uaWdub3JlZFxuIiwgdHlwZXNGaWxlbmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGluRGlyICsgIi8iICsgYmFzZU5hbWUgKyBTUEVDX0VYVEVOU0lPTjsKKyAgICBpZiAoYXBpRW50cmllcy5yZWFkU3BlYyhmaWxlbmFtZSkgPCAwKSB7CisgICAgICAgIHBlcnJvcihmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9TUEVDX0ZJTEU7CisgICAgfQorCisKKyAgICBpZiAoZ2VuZXJhdGVBdHRyaWJ1dGVzVGVtcGxhdGUpIHsKKyAgICAgICAgYXBpRW50cmllcy5nZW5BdHRyaWJ1dGVzVGVtcGxhdGUoaW5EaXIgKyAiLyIgKyBiYXNlTmFtZSArIEFUVFJJQl9FWFRFTlNJT04pOworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGF0dHJpYkZpbGVOYW1lID0gaW5EaXIgKyAiLyIgKyBiYXNlTmFtZSArIEFUVFJJQl9FWFRFTlNJT047CisgICAgaWYgKGFwaUVudHJpZXMucmVhZEF0dHJpYnV0ZXMoYXR0cmliRmlsZU5hbWUpIDwgMCkgeworICAgICAgICBwZXJyb3IoYXR0cmliRmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIHBhcnNlIGF0dHJpYnV0ZXNcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGlmIChlbmNvZGVyRGlyLnNpemUoKSAhPSAwKSB7CisKKyAgICAgICAgYXBpRW50cmllcy5nZW5PcGNvZGVzKGVuY29kZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfb3Bjb2Rlcy5oIik7CisgICAgICAgIGFwaUVudHJpZXMuZ2VuQ29udGV4dChlbmNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX2NsaWVudF9jb250ZXh0LmgiLCBBcGlHZW46OkNMSUVOVF9TSURFKTsKKyAgICAgICAgYXBpRW50cmllcy5nZW5Db250ZXh0SW1wbChlbmNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX2NsaWVudF9jb250ZXh0LmNwcCIsIEFwaUdlbjo6Q0xJRU5UX1NJREUpOworCisgICAgICAgIGFwaUVudHJpZXMuZ2VuUHJvY1R5cGVzKGVuY29kZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfY2xpZW50X3Byb2MuaCIsIEFwaUdlbjo6Q0xJRU5UX1NJREUpOworICAgICAgICBhcGlFbnRyaWVzLmdlbkZ1bmNUYWJsZShlbmNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX2Z0YWJsZS5oIiwgQXBpR2VuOjpDTElFTlRfU0lERSk7CisKKyAgICAgICAgYXBpRW50cmllcy5nZW5FbnRyeVBvaW50cyhlbmNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX2VudHJ5LmNwcCIsIEFwaUdlbjo6Q0xJRU5UX1NJREUpOworICAgICAgICBhcGlFbnRyaWVzLmdlbkVuY29kZXJIZWFkZXIoZW5jb2RlckRpciArICIvIiArIGJhc2VOYW1lICsgIl9lbmMuaCIpOworICAgICAgICBhcGlFbnRyaWVzLmdlbkVuY29kZXJJbXBsKGVuY29kZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfZW5jLmNwcCIpOworICAgIH0KKworICAgIGlmIChkZWNvZGVyRGlyLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGFwaUVudHJpZXMuZ2VuT3Bjb2RlcyhkZWNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX29wY29kZXMuaCIpOworICAgICAgICBhcGlFbnRyaWVzLmdlblByb2NUeXBlcyhkZWNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX3NlcnZlcl9wcm9jLmgiLCBBcGlHZW46OlNFUlZFUl9TSURFKTsKKyAgICAgICAgYXBpRW50cmllcy5nZW5Db250ZXh0KGRlY29kZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfc2VydmVyX2NvbnRleHQuaCIsIEFwaUdlbjo6U0VSVkVSX1NJREUpOworICAgICAgICBhcGlFbnRyaWVzLmdlbkNvbnRleHRJbXBsKGRlY29kZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfc2VydmVyX2NvbnRleHQuY3BwIiwgQXBpR2VuOjpTRVJWRVJfU0lERSk7CisgICAgICAgIGFwaUVudHJpZXMuZ2VuRGVjb2RlckhlYWRlcihkZWNvZGVyRGlyICsgIi8iICsgYmFzZU5hbWUgKyAiX2RlYy5oIik7CisgICAgICAgIGFwaUVudHJpZXMuZ2VuRGVjb2RlckltcGwoZGVjb2RlckRpciArICIvIiArIGJhc2VOYW1lICsgIl9kZWMuY3BwIik7CisgICAgfQorCisgICAgaWYgKHdyYXBwZXJEaXIuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgYXBpRW50cmllcy5nZW5Qcm9jVHlwZXMod3JhcHBlckRpciArICIvIiArIGJhc2VOYW1lICsgIl93cmFwcGVyX3Byb2MuaCIsIEFwaUdlbjo6V1JBUFBFUl9TSURFKTsKKyAgICAgICAgYXBpRW50cmllcy5nZW5Db250ZXh0KHdyYXBwZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfd3JhcHBlcl9jb250ZXh0LmgiLCBBcGlHZW46OldSQVBQRVJfU0lERSk7CisgICAgICAgIGFwaUVudHJpZXMuZ2VuQ29udGV4dEltcGwod3JhcHBlckRpciArICIvIiArIGJhc2VOYW1lICsgIl93cmFwcGVyX2NvbnRleHQuY3BwIiwgQXBpR2VuOjpXUkFQUEVSX1NJREUpOworICAgICAgICBhcGlFbnRyaWVzLmdlbkVudHJ5UG9pbnRzKHdyYXBwZXJEaXIgKyAiLyIgKyBiYXNlTmFtZSArICJfd3JhcHBlcl9lbnRyeS5jcHAiLCBBcGlHZW46OldSQVBQRVJfU0lERSk7CisgICAgfQorCisjaWZkZWYgREVCVUdfRFVNUAorICAgIGludCB3aXRoUG9pbnRlcnMgPSAwOworICAgIHByaW50ZigiJWQgZnVuY3Rpb25zIGZvdW5kXG4iLCBpbnQoYXBpRW50cmllcy5zaXplKCkpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwaUVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGFwaUVudHJpZXNbaV0uaGFzUG9pbnRlcnMoKSkgeworICAgICAgICAgICAgd2l0aFBvaW50ZXJzKys7CisgICAgICAgICAgICBhcGlFbnRyaWVzW2ldLnByaW50KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdGRvdXQsICIlZCBlbnRyaWVzIGhhcyBwb2l0bmVyc1xuIiwgd2l0aFBvaW50ZXJzKTsKKyNlbmRpZgorCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vc3RyVXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3N0clV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTcwNTRiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3N0clV0aWxzLmNwcApAQCAtMCwwICsxLDQ5IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2luY2x1ZGUgInN0clV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworc3RkOjpzdHJpbmcgZ2V0TmV4dFRva2VuKGNvbnN0IHN0ZDo6c3RyaW5nICYgc3RyLCBzaXplX3QgcG9zLCBzaXplX3QgKiBsYXN0LCBjb25zdCBzdGQ6OnN0cmluZyAmIGRlbGltKQoreworICAgIGlmIChzdHIuc2l6ZSgpID09IDAgfHwgcG9zID49IHN0ci5zaXplKCkpIHJldHVybiAiIjsKKworICAgIHBvcyA9IHN0ci5maW5kX2ZpcnN0X25vdF9vZihXSElURVNQQUNFLCBwb3MpOworICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHJldHVybiAiIjsKKworICAgICpsYXN0ID0gc3RyLmZpbmRfZmlyc3Rfb2YoZGVsaW0sIHBvcyk7CisgICAgaWYgKCpsYXN0ID09IHN0ZDo6c3RyaW5nOjpucG9zKSAqbGFzdCA9IHN0ci5zaXplKCk7CisgICAgc3RkOjpzdHJpbmcgcmV0dmFsID0gc3RyLnN1YnN0cihwb3MsICpsYXN0IC0gcG9zKTsKKyAgICByZXR2YWwgPSB0cmltKHJldHZhbCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGQ6OnN0cmluZyB0cmltKGNvbnN0IHN0cmluZyAmIHN0cikKK3sKKyAgc3RyaW5nIHJlc3VsdDsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc3RhcnQgPSBzdHIuZmluZF9maXJzdF9ub3Rfb2YoV0hJVEVTUEFDRSwgMCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHN0ci5maW5kX2xhc3Rfbm90X29mKFdISVRFU1BBQ0UpOworICBpZiAoc3RhcnQgPT0gc3RyaW5nOjpucG9zIHx8IGVuZCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgPSBzdHJpbmcoIiIpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA9IHN0ci5zdWJzdHIoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vc3RyVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi9zdHJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTA5MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vc3RyVXRpbHMuaApAQCAtMCwwICsxLDMzIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBTVFJfVVRJTFNfSF8KKyNkZWZpbmUgU1RSX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2RlZmluZSBXSElURVNQQUNFICIgXHRcbiIKKworc3RkOjpzdHJpbmcgdHJpbShjb25zdCBzdGQ6OnN0cmluZyAmIHN0cik7CitzdGQ6OnN0cmluZyBnZXROZXh0VG9rZW4oY29uc3Qgc3RkOjpzdHJpbmcgJiBzdHIsIHNpemVfdCBwb3MsIHNpemVfdCAqIGxhc3QsIGNvbnN0IHN0ZDo6c3RyaW5nICYgZGVsaW0pOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0ZDo6c3RyaW5nIGlubGluZSB0b1N0cmluZyhjb25zdCBUJiB0KSB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdDsKKyAgICByZXR1cm4gc3Muc3RyKCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvcnVuLXRlc3RzLnNoIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3J1bi10ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzQwOWVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3J1bi10ZXN0cy5zaApAQCAtMCwwICsxLDEyOSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0IC1lCisKK2V4cG9ydCBMQU5HPUMKK2V4cG9ydCBMQ19BTEw9QworCitQUk9HRElSPSQoZGlybmFtZSAiJDAiKQorUFJPR05BTUU9JChiYXNlbmFtZSAiJDAiKQorCitmYXRhbCAoKSB7CisgICAgZWNobyAiRVJST1I6ICRAIgorICAgIGV4aXQgMQorfQorCitPUFRfRU1VR0VOPQorT1BUX0hFTFA9CitPUFRfT1VUX0RJUj0KK09QVF9UT09MPQorCitmb3IgT1BUOyBkbworICAgIE9QVEFSRz0kKGV4cHIgIngkT1BUIiA6ICJ4W149XSo9XFwoLipcXCkiIHx8IHRydWUpCisgICAgY2FzZSAkT1BUIGluCisgICAgLS1oZWxwfC1ofC0/KQorICAgICAgICBPUFRfSEVMUD10cnVlCisgICAgICAgIDs7CisgICAgLS1lbXVnZW49KikKKyAgICAgICAgT1BUX0VNVUdFTj0kT1BUQVJHCisgICAgICAgIDs7CisgICAgLS1vdXQtZGlyPSopCisgICAgICAgIE9QVF9PVVRfRElSPSRPUFRBUkcKKyAgICAgICAgOzsKKyAgICAtLXRvb2w9KikKKyAgICAgICAgT1BUX1RPT0w9JE9QVEFSRworICAgICAgICA7OworICAgIC0qKQorICAgICAgICBmYXRhbCAiSW52YWxpZCBvcHRpb24gJyRPUFQnLCBzZWUgLS1oZWxwLiIKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBmYXRhbCAiVGhpcyBzY3JpcHQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cywgc2VlIC0taGVscC4iCisgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitpZiBbICIkT1BUX0hFTFAiIF07IHRoZW4KKyAgICBjYXQgPDxFT0YKK1VzYWdlOiAkUFJPR05BTUUgW29wdGlvbnNdCisKK1J1biB0aGUgZW11Z2VuIHRlc3Qgc3VpdGUuIFRoaXMgc2NyaXB0cyBsb29rcyBmb3Igc3ViLWRpcmVjdG9yaWVzCituYW1lZCB0LjxudW1iZXI+L2lucHV0LCBhbmQgdXNlcyB0aGVtIGFzIGlucHV0IHRvICdlbXVnZW4nLiBJdCB0aGVuCitjb21wYXJlcyB0aGUgb3V0cHV0IHRvIHQuPG51bWJlcj4vZXhwZWN0ZWQvIGNvbnRlbnQuCisKK1ZhbGlkIG9wdGlvbnM6CisgICAgLS1oZWxwfC1ofC0/ICAgICAgICAgUHJpbnQgdGhpcyBoZWxwLgorICAgIC0tb3V0LWRpcj08ZGlyPiAgICAgIEdlbmVyYXRlIG91dHB1dHMgaW50byA8ZGlyPi4KKyAgICAtLWVtdWdlbj08cHJvZ3JhbT4gICBFbXVnZW4gcHJvZ3JhbSBwYXRoLCBpZiBub3QgaW4gcGF0aC4KKyAgICAtLXRvb2w9PHRvb2w+ICAgICAgICBMYXVuY2ggdmlzdWFsIGRpZmYgdG9vbCBpbiBjYXNlIG9mIGRpZmZlcmVuY2VzLgorRU9GCisgICAgZXhpdCAwCitmaQorCisjIEZpbmQgZW11Z2VuIHByb2dyYW0KK0VNVUdFTj0KK2lmIFsgIiRPUFRfRU1VR0VOIiBdOyB0aGVuCisgICAgRU1VR0VOPSRPUFRfRU1VR0VOCitlbHNlCisgICAgRU1VR0VOPSQod2hpY2ggZW11Z2VuIDI+L2Rldi9udWxsIHx8IHRydWUpCisgICAgaWYgWyAteiAiJEVNVUdFTiIgXTsgdGhlbgorICAgICAgICBmYXRhbCAiQ2Fubm90IGZpbmQgJ2VtdWdlbicgcHJvZ3JhbSBpbiBQQVRILCB1c2UgLS1lbXVnZW49PHByb2dyYW0+IG9wdGlvbi4iCisgICAgZmkKKyAgICBlY2hvICJBdXRvLWNvbmZpZzogLS1lbXVnZW49JEVNVUdFTiIKK2ZpCitpZiBbICEgLWYgIiRFTVVHRU4iIF07IHRoZW4KKyAgICBmYXRhbCAiRW11Z2VuIHByb2dyYW0gZG9lc24ndCBleGlzdDogJEVNVUdFTiIKK2ZpCisKKyMgQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkuCitPVVRfRElSPQoraWYgWyAiJE9QVF9PVVRfRElSIiBdOyB0aGVuCisgICAgT1VUX0RJUj0kT1BUX09VVF9ESVIKK2Vsc2UKKyAgICBPVVRfRElSPS90bXAvJFVTRVItZW11Z2VuLXRlc3RpbmcKKyAgICBlY2hvICJBdXRvLWNvbmZpZzogLS1vdXQtZGlyPSRPVVRfRElSIgorZmkKK21rZGlyIC1wICIkT1VUX0RJUiIgJiYgcm0gLXJmICIkT1VUX0RJUi9lbXVnZW4iCisKK09VVF9ESVI9JE9VVF9ESVIvZW11Z2VuCisKKyMgRmluZCB0ZXN0IGRpcmVjdG9yaWVzCitURVNUX0RJUlM9JChjZCAiJFBST0dESVIiICYmIGZpbmQgLiAtbmFtZSAidC4qIiB8IHNlZCAtZSAnc3xeXC4vfHwnKQorZm9yIFRFU1RfRElSIGluICRURVNUX0RJUlM7IGRvCisgICAgSU49JFBST0dESVIvJFRFU1RfRElSL2lucHV0CisgICAgUFJFRklYRVM9JChjZCAkSU4gJiYgZmluZCAuIC1uYW1lICIqLmluIiB8IHNlZCAtZSAnc3xeXC4vfHxnJyAtZSAnc3xcLmluJHx8ZycpCisgICAgT1VUPSRPVVRfRElSLyRURVNUX0RJUgorICAgIG1rZGlyIC1wICIkT1VUL2VuY29kZXIiCisgICAgbWtkaXIgLXAgIiRPVVQvZGVjb2RlciIKKyAgICBta2RpciAtcCAiJE9VVC93cmFwcGVyIgorICAgIGZvciBQUkVGSVggaW4gJFBSRUZJWEVTOyBkbworICAgICAgICBlY2hvICJQcm9jZXNzaW5nICRJTi9mb28uKiIKKyAgICAgICAgJEVNVUdFTiAtaSAiJFBST0dESVIvJFRFU1RfRElSL2lucHV0IiAtRCAiJE9VVC9kZWNvZGVyIiAtRSAiJE9VVC9lbmNvZGVyIiAtVyAiJE9VVC93cmFwcGVyIiAkUFJFRklYCisgICAgZG9uZQorICAgIGlmICEgZGlmZiAtcXIgIiRQUk9HRElSLyRURVNUX0RJUi9leHBlY3RlZCIgIiRPVVQiOyB0aGVuCisgICAgICAgIGlmIFsgIiRPUFRfVE9PTCIgXTsgdGhlbgorICAgICAgICAgICAgJE9QVF9UT09MICIkUFJPR0RJUi8kVEVTVF9ESVIvZXhwZWN0ZWQiICIkT1VUIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJFUlJPUjogSW52YWxpZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGFjdHVhbCBhbmQgZXhwZWN0ZWQgb3V0cHV0ISIKKyAgICAgICAgICAgIGRpZmYgLWJ1ck4gIiRQUk9HRElSLyRURVNUX0RJUi9leHBlY3RlZCIgIiRPVVQiCisgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKyAgICBmaQorZG9uZQorCitlY2hvICJBbGwgZ29vZCEiCitleGl0IDAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19kZWMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2RlY29kZXIvZm9vX2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhZTRjMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19kZWMuY3BwCkBAIC0wLDAgKzEsMTE5IEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZm9vX29wY29kZXMuaCIKKworI2luY2x1ZGUgImZvb19kZWMuaCIKKworCisjaW5jbHVkZSAiUHJvdG9jb2xVdGlscy5oIgorCisjaW5jbHVkZSAiQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mby5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdHNpemVfdDsgLy8gVGFyZ2V0ICJzaXplX3QiLCB3aGljaCBpcyAzMi1iaXQgZm9yIG5vdy4gSXQgbWF5IG9yIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgaG9zdCdzIHNpemVfdCB3aGVuIGVtdWdlbiBpcyBjb21waWxlZC4KKworI2lmZGVmIE9QRU5HTF9ERUJVR19QUklOVE9VVAorIyAgZGVmaW5lIERFQlVHKC4uLikgZG8geyBpZiAoZW11Z2xfY3h0X2xvZ2dlcikgeyBlbXVnbF9jeHRfbG9nZ2VyKF9fVkFfQVJHU19fKTsgfSB9IHdoaWxlKDApCisjZWxzZQorIyAgZGVmaW5lIERFQlVHKC4uLikgICgodm9pZCkwKQorI2VuZGlmCisKKyNpZmRlZiBDSEVDS19HTEVSUk9SCisjICBkZWZpbmUgU0VUX0xBU1RDQUxMKG5hbWUpICBzcHJpbnRmKGxhc3RDYWxsLCAjbmFtZSkKKyNlbHNlCisjICBkZWZpbmUgU0VUX0xBU1RDQUxMKG5hbWUpICAoKHZvaWQpMCkKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgZW11Z2w7CisKK3NpemVfdCBmb29fZGVjb2Rlcl9jb250ZXh0X3Q6OmRlY29kZSh2b2lkICpidWYsIHNpemVfdCBsZW4sIElPU3RyZWFtICpzdHJlYW0sIENoZWNrc3VtQ2FsY3VsYXRvciogY2hlY2tzdW1DYWxjKSB7CisJaWYgKGxlbiA8IDgpIHJldHVybiAwOyAKKyNpZmRlZiBDSEVDS19HTF9FUlJPUgorCWNoYXIgbGFzdENhbGxbMjU2XSA9IHswfTsKKyNlbmRpZgorCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGNvbnN0IGVuZCA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilidWYgKyBsZW47CisgICAgY29uc3Qgc2l6ZV90IGNoZWNrc3VtU2l6ZSA9IGNoZWNrc3VtQ2FsYy0+Y2hlY2tzdW1CeXRlU2l6ZSgpOworICAgIGNvbnN0IGJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bVNpemUgPiAwOworCXdoaWxlIChlbmQgLSBwdHIgPj0gOCkgeworCQl1aW50MzJfdCBvcGNvZGUgPSAqKHVpbnQzMl90ICopcHRyOyAgIAorCQlpbnQzMl90IHBhY2tldExlbiA9ICooaW50MzJfdCAqKShwdHIgKyA0KTsKKwkJaWYgKGVuZCAtIHB0ciA8IHBhY2tldExlbikgcmV0dXJuIHB0ciAtICh1bnNpZ25lZCBjaGFyKilidWY7CisJCXN3aXRjaChvcGNvZGUpIHsKKwkJY2FzZSBPUF9mb29BbHBoYUZ1bmM6IHsKKwkJCUZvb0ludCB2YXJfZnVuYyA9IFVucGFjazxGb29JbnQsdWludDMyX3Q+KHB0ciArIDgpOworCQkJRm9vRmxvYXQgdmFyX3JlZiA9IFVucGFjazxGb29GbG9hdCx1aW50MzJfdD4ocHRyICsgOCArIDQpOworCQkJaWYgKHVzZUNoZWNrc3VtKSB7CisJCQkJQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbzo6dmFsaWRPckRpZShjaGVja3N1bUNhbGMsIHB0ciwgOCArIDQgKyA0LCBwdHIgKyA4ICsgNCArIDQsIGNoZWNrc3VtU2l6ZSwgCisJCQkJCSJmb29fZGVjb2Rlcl9jb250ZXh0X3Q6OmRlY29kZSwgT1BfZm9vQWxwaGFGdW5jOiBHTCBjaGVja3N1bUNhbGN1bGF0b3IgZmFpbHVyZVxuIik7CisJCQl9CisJCQlERUJVRygiZm9vKCVwKTogZm9vQWxwaGFGdW5jKCVkICVmIClcbiIsIHN0cmVhbSwgdmFyX2Z1bmMsIHZhcl9yZWYpOworCQkJdGhpcy0+Zm9vQWxwaGFGdW5jKHZhcl9mdW5jLCB2YXJfcmVmKTsKKwkJCVNFVF9MQVNUQ0FMTCgiZm9vQWxwaGFGdW5jIik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QX2Zvb0lzQnVmZmVyOiB7CisJCQl1aW50MzJfdCBzaXplX3N0dWZmIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gVW5wYWNrPHVpbnQzMl90LHVpbnQzMl90PihwdHIgKyA4KTsKKwkJCUlucHV0QnVmZmVyIGlucHRyX3N0dWZmKHB0ciArIDggKyA0LCBzaXplX3N0dWZmKTsKKwkJCWlmICh1c2VDaGVja3N1bSkgeworCQkJCUNoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnZhbGlkT3JEaWUoY2hlY2tzdW1DYWxjLCBwdHIsIDggKyA0ICsgc2l6ZV9zdHVmZiwgcHRyICsgOCArIDQgKyBzaXplX3N0dWZmLCBjaGVja3N1bVNpemUsIAorCQkJCQkiZm9vX2RlY29kZXJfY29udGV4dF90OjpkZWNvZGUsIE9QX2Zvb0lzQnVmZmVyOiBHTCBjaGVja3N1bUNhbGN1bGF0b3IgZmFpbHVyZVxuIik7CisJCQl9CisJCQlzaXplX3QgdG90YWxUbXBTaXplID0gc2l6ZW9mKEZvb0Jvb2xlYW4pOworCQkJdG90YWxUbXBTaXplICs9IGNoZWNrc3VtU2l6ZTsKKwkJCXVuc2lnbmVkIGNoYXIgKnRtcEJ1ZiA9IHN0cmVhbS0+YWxsb2ModG90YWxUbXBTaXplKTsKKwkJCURFQlVHKCJmb28oJXApOiBmb29Jc0J1ZmZlciglcCgldSkgKVxuIiwgc3RyZWFtLCAodm9pZCopKGlucHRyX3N0dWZmLmdldCgpKSwgc2l6ZV9zdHVmZik7CisJCQkqKEZvb0Jvb2xlYW4gKikoJnRtcEJ1ZlswXSkgPSAJCQl0aGlzLT5mb29Jc0J1ZmZlcigodm9pZCopKGlucHRyX3N0dWZmLmdldCgpKSk7CisJCQlpZiAodXNlQ2hlY2tzdW0pIHsKKwkJCQlDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvOjp3cml0ZUNoZWNrc3VtKGNoZWNrc3VtQ2FsYywgJnRtcEJ1ZlswXSwgdG90YWxUbXBTaXplIC0gY2hlY2tzdW1TaXplLCAmdG1wQnVmW3RvdGFsVG1wU2l6ZSAtIGNoZWNrc3VtU2l6ZV0sIGNoZWNrc3VtU2l6ZSk7CisJCQl9CisJCQlzdHJlYW0tPmZsdXNoKCk7CisJCQlTRVRfTEFTVENBTEwoImZvb0lzQnVmZmVyIik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QX2Zvb1Vuc3VwcG9ydGVkOiB7CisJCQl1aW50MzJfdCBzaXplX3BhcmFtcyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IFVucGFjazx1aW50MzJfdCx1aW50MzJfdD4ocHRyICsgOCk7CisJCQlJbnB1dEJ1ZmZlciBpbnB0cl9wYXJhbXMocHRyICsgOCArIDQsIHNpemVfcGFyYW1zKTsKKwkJCWlmICh1c2VDaGVja3N1bSkgeworCQkJCUNoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnZhbGlkT3JEaWUoY2hlY2tzdW1DYWxjLCBwdHIsIDggKyA0ICsgc2l6ZV9wYXJhbXMsIHB0ciArIDggKyA0ICsgc2l6ZV9wYXJhbXMsIGNoZWNrc3VtU2l6ZSwgCisJCQkJCSJmb29fZGVjb2Rlcl9jb250ZXh0X3Q6OmRlY29kZSwgT1BfZm9vVW5zdXBwb3J0ZWQ6IEdMIGNoZWNrc3VtQ2FsY3VsYXRvciBmYWlsdXJlXG4iKTsKKwkJCX0KKwkJCURFQlVHKCJmb28oJXApOiBmb29VbnN1cHBvcnRlZCglcCgldSkgKVxuIiwgc3RyZWFtLCAodm9pZCopKGlucHRyX3BhcmFtcy5nZXQoKSksIHNpemVfcGFyYW1zKTsKKwkJCXRoaXMtPmZvb1Vuc3VwcG9ydGVkKCh2b2lkKikoaW5wdHJfcGFyYW1zLmdldCgpKSk7CisJCQlTRVRfTEFTVENBTEwoImZvb1Vuc3VwcG9ydGVkIik7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QX2Zvb0RvRW5jb2RlckZsdXNoOiB7CisJCQlGb29JbnQgdmFyX3BhcmFtID0gVW5wYWNrPEZvb0ludCx1aW50MzJfdD4ocHRyICsgOCk7CisJCQlpZiAodXNlQ2hlY2tzdW0pIHsKKwkJCQlDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvOjp2YWxpZE9yRGllKGNoZWNrc3VtQ2FsYywgcHRyLCA4ICsgNCwgcHRyICsgOCArIDQsIGNoZWNrc3VtU2l6ZSwgCisJCQkJCSJmb29fZGVjb2Rlcl9jb250ZXh0X3Q6OmRlY29kZSwgT1BfZm9vRG9FbmNvZGVyRmx1c2g6IEdMIGNoZWNrc3VtQ2FsY3VsYXRvciBmYWlsdXJlXG4iKTsKKwkJCX0KKwkJCURFQlVHKCJmb28oJXApOiBmb29Eb0VuY29kZXJGbHVzaCglZCApXG4iLCBzdHJlYW0sIHZhcl9wYXJhbSk7CisJCQl0aGlzLT5mb29Eb0VuY29kZXJGbHVzaCh2YXJfcGFyYW0pOworCQkJU0VUX0xBU1RDQUxMKCJmb29Eb0VuY29kZXJGbHVzaCIpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUF9mb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHI6IHsKKwkJCXVpbnQzMl90IHNpemVfcGFyYW0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSBVbnBhY2s8dWludDMyX3QsdWludDMyX3Q+KHB0ciArIDgpOworCQkJSW5wdXRCdWZmZXIgaW5wdHJfcGFyYW0ocHRyICsgOCArIDQsIHNpemVfcGFyYW0pOworCQkJaWYgKHVzZUNoZWNrc3VtKSB7CisJCQkJQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbzo6dmFsaWRPckRpZShjaGVja3N1bUNhbGMsIHB0ciwgOCArIDQgKyBzaXplX3BhcmFtLCBwdHIgKyA4ICsgNCArIHNpemVfcGFyYW0sIGNoZWNrc3VtU2l6ZSwgCisJCQkJCSJmb29fZGVjb2Rlcl9jb250ZXh0X3Q6OmRlY29kZSwgT1BfZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyOiBHTCBjaGVja3N1bUNhbGN1bGF0b3IgZmFpbHVyZVxuIik7CisJCQl9CisJCQlERUJVRygiZm9vKCVwKTogZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyKCVwKCV1KSApXG4iLCBzdHJlYW0sIChjb25zdCB2b2lkKiBjb25zdCopKGlucHRyX3BhcmFtLmdldCgpKSwgc2l6ZV9wYXJhbSk7CisJCQl0aGlzLT5mb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIoKGNvbnN0IHZvaWQqIGNvbnN0KikoaW5wdHJfcGFyYW0uZ2V0KCkpKTsKKwkJCVNFVF9MQVNUQ0FMTCgiZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyIik7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIHB0ciAtICh1bnNpZ25lZCBjaGFyKilidWY7CisJCX0gLy9zd2l0Y2gKKwkJcHRyICs9IHBhY2tldExlbjsKKwl9IC8vIHdoaWxlCisJcmV0dXJuIHB0ciAtICh1bnNpZ25lZCBjaGFyKilidWY7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fZGVjLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyNTA5MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19kZWMuaApAQCAtMCwwICsxLDIwIEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKworI2lmbmRlZiBHVUFSRF9mb29fZGVjb2Rlcl9jb250ZXh0X3QKKyNkZWZpbmUgR1VBUkRfZm9vX2RlY29kZXJfY29udGV4dF90CisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvSU9TdHJlYW0uaCIKKyNpbmNsdWRlICJDaGVja3N1bUNhbGN1bGF0b3IuaCIKKyNpbmNsdWRlICJmb29fc2VydmVyX2NvbnRleHQuaCIKKworCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL2xvZ2dpbmcuaCIKKworc3RydWN0IGZvb19kZWNvZGVyX2NvbnRleHRfdCA6IHB1YmxpYyBmb29fc2VydmVyX2NvbnRleHRfdCB7CisKKwlzaXplX3QgZGVjb2RlKHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUsIElPU3RyZWFtICpzdHJlYW0sIENoZWNrc3VtQ2FsY3VsYXRvciogY2hlY2tzdW1DYWxjKTsKKworfTsKKworI2VuZGlmICAvLyBHVUFSRF9mb29fZGVjb2Rlcl9jb250ZXh0X3QKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19vcGNvZGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fb3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTljYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fb3Bjb2Rlcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworI2lmbmRlZiBfX0dVQVJEX2Zvb19vcGNvZGVzX2hfCisjZGVmaW5lIF9fR1VBUkRfZm9vX29wY29kZXNfaF8KKworI2RlZmluZSBPUF9mb29BbHBoYUZ1bmMgCQkJCQkyMDAKKyNkZWZpbmUgT1BfZm9vSXNCdWZmZXIgCQkJCQkyMDEKKyNkZWZpbmUgT1BfZm9vVW5zdXBwb3J0ZWQgCQkJCQkyMDIKKyNkZWZpbmUgT1BfZm9vRG9FbmNvZGVyRmx1c2ggCQkJCQkyMDMKKyNkZWZpbmUgT1BfZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyIAkJCQkJMjA0CisjZGVmaW5lIE9QX2xhc3QgCQkJCQkyMDUKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19zZXJ2ZXJfY29udGV4dC5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fc2VydmVyX2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZmY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fc2VydmVyX2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmb29fc2VydmVyX2NvbnRleHQuaCIKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IGZvb19zZXJ2ZXJfY29udGV4dF90Ojppbml0RGlzcGF0Y2hCeU5hbWUodm9pZCAqKCpnZXRQcm9jKShjb25zdCBjaGFyICosIHZvaWQgKnVzZXJEYXRhKSwgdm9pZCAqdXNlckRhdGEpCit7CisJZm9vQWxwaGFGdW5jID0gKGZvb0FscGhhRnVuY19zZXJ2ZXJfcHJvY190KSBnZXRQcm9jKCJmb29BbHBoYUZ1bmMiLCB1c2VyRGF0YSk7CisJZm9vSXNCdWZmZXIgPSAoZm9vSXNCdWZmZXJfc2VydmVyX3Byb2NfdCkgZ2V0UHJvYygiZm9vSXNCdWZmZXIiLCB1c2VyRGF0YSk7CisJZm9vVW5zdXBwb3J0ZWQgPSAoZm9vVW5zdXBwb3J0ZWRfc2VydmVyX3Byb2NfdCkgZ2V0UHJvYygiZm9vVW5zdXBwb3J0ZWQiLCB1c2VyRGF0YSk7CisJZm9vRG9FbmNvZGVyRmx1c2ggPSAoZm9vRG9FbmNvZGVyRmx1c2hfc2VydmVyX3Byb2NfdCkgZ2V0UHJvYygiZm9vRG9FbmNvZGVyRmx1c2giLCB1c2VyRGF0YSk7CisJZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyID0gKGZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cl9zZXJ2ZXJfcHJvY190KSBnZXRQcm9jKCJmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIiLCB1c2VyRGF0YSk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19zZXJ2ZXJfY29udGV4dC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2RlY29kZXIvZm9vX3NlcnZlcl9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzZmY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19zZXJ2ZXJfY29udGV4dC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworI2lmbmRlZiBfX2Zvb19zZXJ2ZXJfY29udGV4dF90X2gKKyNkZWZpbmUgX19mb29fc2VydmVyX2NvbnRleHRfdF9oCisKKyNpbmNsdWRlICJmb29fc2VydmVyX3Byb2MuaCIKKworI2luY2x1ZGUgImZvb190eXBlcy5oIgorCisKK3N0cnVjdCBmb29fc2VydmVyX2NvbnRleHRfdCB7CisKKwlmb29BbHBoYUZ1bmNfc2VydmVyX3Byb2NfdCBmb29BbHBoYUZ1bmM7CisJZm9vSXNCdWZmZXJfc2VydmVyX3Byb2NfdCBmb29Jc0J1ZmZlcjsKKwlmb29VbnN1cHBvcnRlZF9zZXJ2ZXJfcHJvY190IGZvb1Vuc3VwcG9ydGVkOworCWZvb0RvRW5jb2RlckZsdXNoX3NlcnZlcl9wcm9jX3QgZm9vRG9FbmNvZGVyRmx1c2g7CisJZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyX3NlcnZlcl9wcm9jX3QgZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyOworCXZpcnR1YWwgfmZvb19zZXJ2ZXJfY29udGV4dF90KCkge30KKwlpbnQgaW5pdERpc3BhdGNoQnlOYW1lKCB2b2lkICooKmdldFByb2MpKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnVzZXJEYXRhKSwgdm9pZCAqdXNlckRhdGEpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fc2VydmVyX3Byb2MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9kZWNvZGVyL2Zvb19zZXJ2ZXJfcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTA0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZGVjb2Rlci9mb29fc2VydmVyX3Byb2MuaApAQCAtMCwwICsxLDE5IEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKyNpZm5kZWYgX19mb29fc2VydmVyX3Byb2NfdF9oCisjZGVmaW5lIF9fZm9vX3NlcnZlcl9wcm9jX3RfaAorCisKKworI2luY2x1ZGUgImZvb190eXBlcy5oIgorI2lmbmRlZiBmb29fQVBJRU5UUlkKKyNkZWZpbmUgZm9vX0FQSUVOVFJZIAorI2VuZGlmCit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vQWxwaGFGdW5jX3NlcnZlcl9wcm9jX3QpIChGb29JbnQsIEZvb0Zsb2F0KTsKK3R5cGVkZWYgRm9vQm9vbGVhbiAoZm9vX0FQSUVOVFJZICpmb29Jc0J1ZmZlcl9zZXJ2ZXJfcHJvY190KSAodm9pZCopOwordHlwZWRlZiB2b2lkIChmb29fQVBJRU5UUlkgKmZvb1Vuc3VwcG9ydGVkX3NlcnZlcl9wcm9jX3QpICh2b2lkKik7Cit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vRG9FbmNvZGVyRmx1c2hfc2VydmVyX3Byb2NfdCkgKEZvb0ludCk7Cit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyX3NlcnZlcl9wcm9jX3QpIChjb25zdCB2b2lkKiBjb25zdCopOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2NsaWVudF9jb250ZXh0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9lbmNvZGVyL2Zvb19jbGllbnRfY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5ZTg4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9lbmNvZGVyL2Zvb19jbGllbnRfY29udGV4dC5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImZvb19jbGllbnRfY29udGV4dC5oIgorCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgZm9vX2NsaWVudF9jb250ZXh0X3Q6OmluaXREaXNwYXRjaEJ5TmFtZSh2b2lkICooKmdldFByb2MpKGNvbnN0IGNoYXIgKiwgdm9pZCAqdXNlckRhdGEpLCB2b2lkICp1c2VyRGF0YSkKK3sKKwlmb29BbHBoYUZ1bmMgPSAoZm9vQWxwaGFGdW5jX2NsaWVudF9wcm9jX3QpIGdldFByb2MoImZvb0FscGhhRnVuYyIsIHVzZXJEYXRhKTsKKwlmb29Jc0J1ZmZlciA9IChmb29Jc0J1ZmZlcl9jbGllbnRfcHJvY190KSBnZXRQcm9jKCJmb29Jc0J1ZmZlciIsIHVzZXJEYXRhKTsKKwlmb29VbnN1cHBvcnRlZCA9IChmb29VbnN1cHBvcnRlZF9jbGllbnRfcHJvY190KSBnZXRQcm9jKCJmb29VbnN1cHBvcnRlZCIsIHVzZXJEYXRhKTsKKwlmb29Eb0VuY29kZXJGbHVzaCA9IChmb29Eb0VuY29kZXJGbHVzaF9jbGllbnRfcHJvY190KSBnZXRQcm9jKCJmb29Eb0VuY29kZXJGbHVzaCIsIHVzZXJEYXRhKTsKKwlmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIgPSAoZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyX2NsaWVudF9wcm9jX3QpIGdldFByb2MoImZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0ciIsIHVzZXJEYXRhKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2NsaWVudF9jb250ZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fY2xpZW50X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYwMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2NsaWVudF9jb250ZXh0LmgKQEAgLTAsMCArMSwyNyBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisjaWZuZGVmIF9fZm9vX2NsaWVudF9jb250ZXh0X3RfaAorI2RlZmluZSBfX2Zvb19jbGllbnRfY29udGV4dF90X2gKKworI2luY2x1ZGUgImZvb19jbGllbnRfcHJvYy5oIgorCisjaW5jbHVkZSAiZm9vX3R5cGVzLmgiCisKKworc3RydWN0IGZvb19jbGllbnRfY29udGV4dF90IHsKKworCWZvb0FscGhhRnVuY19jbGllbnRfcHJvY190IGZvb0FscGhhRnVuYzsKKwlmb29Jc0J1ZmZlcl9jbGllbnRfcHJvY190IGZvb0lzQnVmZmVyOworCWZvb1Vuc3VwcG9ydGVkX2NsaWVudF9wcm9jX3QgZm9vVW5zdXBwb3J0ZWQ7CisJZm9vRG9FbmNvZGVyRmx1c2hfY2xpZW50X3Byb2NfdCBmb29Eb0VuY29kZXJGbHVzaDsKKwlmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHJfY2xpZW50X3Byb2NfdCBmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHI7CisJdmlydHVhbCB+Zm9vX2NsaWVudF9jb250ZXh0X3QoKSB7fQorCisJdHlwZWRlZiBmb29fY2xpZW50X2NvbnRleHRfdCAqQ09OVEVYVF9BQ0NFU1NPUl9UWVBFKHZvaWQpOworCXN0YXRpYyB2b2lkIHNldENvbnRleHRBY2Nlc3NvcihDT05URVhUX0FDQ0VTU09SX1RZUEUgKmYpOworCWludCBpbml0RGlzcGF0Y2hCeU5hbWUoIHZvaWQgKigqZ2V0UHJvYykoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpLCB2b2lkICp1c2VyRGF0YSk7CisJdmlydHVhbCB2b2lkIHNldEVycm9yKHVuc2lnbmVkIGludCAgZXJyb3IpeyAodm9pZCllcnJvcjsgfTsKKwl2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRFcnJvcigpeyByZXR1cm4gMDsgfTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2NsaWVudF9wcm9jLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fY2xpZW50X3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMyN2YwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2NsaWVudF9wcm9jLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisjaWZuZGVmIF9fZm9vX2NsaWVudF9wcm9jX3RfaAorI2RlZmluZSBfX2Zvb19jbGllbnRfcHJvY190X2gKKworCisKKyNpbmNsdWRlICJmb29fdHlwZXMuaCIKKyNpZm5kZWYgZm9vX0FQSUVOVFJZCisjZGVmaW5lIGZvb19BUElFTlRSWSAKKyNlbmRpZgordHlwZWRlZiB2b2lkIChmb29fQVBJRU5UUlkgKmZvb0FscGhhRnVuY19jbGllbnRfcHJvY190KSAodm9pZCAqIGN0eCwgRm9vSW50LCBGb29GbG9hdCk7Cit0eXBlZGVmIEZvb0Jvb2xlYW4gKGZvb19BUElFTlRSWSAqZm9vSXNCdWZmZXJfY2xpZW50X3Byb2NfdCkgKHZvaWQgKiBjdHgsIHZvaWQqKTsKK3R5cGVkZWYgdm9pZCAoZm9vX0FQSUVOVFJZICpmb29VbnN1cHBvcnRlZF9jbGllbnRfcHJvY190KSAodm9pZCAqIGN0eCwgdm9pZCopOwordHlwZWRlZiB2b2lkIChmb29fQVBJRU5UUlkgKmZvb0RvRW5jb2RlckZsdXNoX2NsaWVudF9wcm9jX3QpICh2b2lkICogY3R4LCBGb29JbnQpOwordHlwZWRlZiB2b2lkIChmb29fQVBJRU5UUlkgKmZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cl9jbGllbnRfcHJvY190KSAodm9pZCAqIGN0eCwgY29uc3Qgdm9pZCogY29uc3QqKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9lbmNvZGVyL2Zvb19lbmMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMjc4MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9lbmNvZGVyL2Zvb19lbmMuY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZm9vX29wY29kZXMuaCIKKworI2luY2x1ZGUgImZvb19lbmMuaCIKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNlIHsKKwordm9pZCBlbmNfdW5zdXBwb3J0ZWQoKQoreworCUFMT0dFKCJGdW5jdGlvbiBpcyB1bnN1cHBvcnRlZFxuIik7Cit9CisKK3ZvaWQgZm9vQWxwaGFGdW5jX2VuYyh2b2lkICpzZWxmICwgRm9vSW50IGZ1bmMsIEZvb0Zsb2F0IHJlZikKK3sKKworCWZvb19lbmNvZGVyX2NvbnRleHRfdCAqY3R4ID0gKGZvb19lbmNvZGVyX2NvbnRleHRfdCAqKXNlbGY7CisJSU9TdHJlYW0gKnN0cmVhbSA9IGN0eC0+bV9zdHJlYW07CisJQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IgPSBjdHgtPm1fY2hlY2tzdW1DYWxjdWxhdG9yOworCWJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bUNhbGN1bGF0b3ItPmdldFZlcnNpb24oKSA+IDA7CisKKwkgdW5zaWduZWQgY2hhciAqcHRyOworCSB1bnNpZ25lZCBjaGFyICpidWY7CisJIGNvbnN0IHNpemVfdCBzaXplV2l0aG91dENoZWNrc3VtID0gOCArIDQgKyA0OworCSBjb25zdCBzaXplX3QgY2hlY2tzdW1TaXplID0gY2hlY2tzdW1DYWxjdWxhdG9yLT5jaGVja3N1bUJ5dGVTaXplKCk7CisJIGNvbnN0IHNpemVfdCB0b3RhbFNpemUgPSBzaXplV2l0aG91dENoZWNrc3VtICsgY2hlY2tzdW1TaXplOworCWJ1ZiA9IHN0cmVhbS0+YWxsb2ModG90YWxTaXplKTsKKwlwdHIgPSBidWY7CisJaW50IHRtcCA9IE9QX2Zvb0FscGhhRnVuYzttZW1jcHkocHRyLCAmdG1wLCA0KTsgcHRyICs9IDQ7CisJbWVtY3B5KHB0ciwgJnRvdGFsU2l6ZSwgNCk7ICBwdHIgKz0gNDsKKworCQltZW1jcHkocHRyLCAmZnVuYywgNCk7IHB0ciArPSA0OworCQltZW1jcHkocHRyLCAmcmVmLCA0KTsgcHRyICs9IDQ7CisKKwlpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKGJ1ZiwgcHRyLWJ1Zik7CisJaWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPndyaXRlQ2hlY2tzdW0ocHRyLCBjaGVja3N1bVNpemUpOyBwdHIgKz0gY2hlY2tzdW1TaXplOworCit9CisKK0Zvb0Jvb2xlYW4gZm9vSXNCdWZmZXJfZW5jKHZvaWQgKnNlbGYgLCB2b2lkKiBzdHVmZikKK3sKKworCWZvb19lbmNvZGVyX2NvbnRleHRfdCAqY3R4ID0gKGZvb19lbmNvZGVyX2NvbnRleHRfdCAqKXNlbGY7CisJSU9TdHJlYW0gKnN0cmVhbSA9IGN0eC0+bV9zdHJlYW07CisJQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IgPSBjdHgtPm1fY2hlY2tzdW1DYWxjdWxhdG9yOworCWJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bUNhbGN1bGF0b3ItPmdldFZlcnNpb24oKSA+IDA7CisKKwljb25zdCB1bnNpZ25lZCBpbnQgX19zaXplX3N0dWZmID0gICg0ICogc2l6ZW9mKGZsb2F0KSk7CisJIHVuc2lnbmVkIGNoYXIgKnB0cjsKKwkgdW5zaWduZWQgY2hhciAqYnVmOworCSBjb25zdCBzaXplX3Qgc2l6ZVdpdGhvdXRDaGVja3N1bSA9IDggKyBfX3NpemVfc3R1ZmYgKyAxKjQ7CisJIGNvbnN0IHNpemVfdCBjaGVja3N1bVNpemUgPSBjaGVja3N1bUNhbGN1bGF0b3ItPmNoZWNrc3VtQnl0ZVNpemUoKTsKKwkgY29uc3Qgc2l6ZV90IHRvdGFsU2l6ZSA9IHNpemVXaXRob3V0Q2hlY2tzdW0gKyBjaGVja3N1bVNpemU7CisJYnVmID0gc3RyZWFtLT5hbGxvYyh0b3RhbFNpemUpOworCXB0ciA9IGJ1ZjsKKwlpbnQgdG1wID0gT1BfZm9vSXNCdWZmZXI7bWVtY3B5KHB0ciwgJnRtcCwgNCk7IHB0ciArPSA0OworCW1lbWNweShwdHIsICZ0b3RhbFNpemUsIDQpOyAgcHRyICs9IDQ7CisKKwkqKHVuc2lnbmVkIGludCAqKShwdHIpID0gX19zaXplX3N0dWZmOyBwdHIgKz0gNDsKKwltZW1jcHkocHRyLCBzdHVmZiwgX19zaXplX3N0dWZmKTtwdHIgKz0gX19zaXplX3N0dWZmOworCisJaWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPmFkZEJ1ZmZlcihidWYsIHB0ci1idWYpOworCWlmICh1c2VDaGVja3N1bSkgY2hlY2tzdW1DYWxjdWxhdG9yLT53cml0ZUNoZWNrc3VtKHB0ciwgY2hlY2tzdW1TaXplKTsgcHRyICs9IGNoZWNrc3VtU2l6ZTsKKworCisJRm9vQm9vbGVhbiByZXR2YWw7CisJc3RyZWFtLT5yZWFkYmFjaygmcmV0dmFsLCAxKTsKKwlpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKCZyZXR2YWwsIDEpOworCWlmICh1c2VDaGVja3N1bSkgeworCQl1bnNpZ25lZCBjaGFyICpjaGVja3N1bUJ1ZlB0ciA9IE5VTEw7CisJCXVuc2lnbmVkIGNoYXIgY2hlY2tzdW1CdWZbQ2hlY2tzdW1DYWxjdWxhdG9yOjprTWF4Q2hlY2tzdW1TaXplXTsKKwkJaWYgKGNoZWNrc3VtU2l6ZSA+IDApIGNoZWNrc3VtQnVmUHRyID0gJmNoZWNrc3VtQnVmWzBdOworCQlzdHJlYW0tPnJlYWRiYWNrKGNoZWNrc3VtQnVmUHRyLCBjaGVja3N1bVNpemUpOworCQlpZiAoIWNoZWNrc3VtQ2FsY3VsYXRvci0+dmFsaWRhdGUoY2hlY2tzdW1CdWZQdHIsIGNoZWNrc3VtU2l6ZSkpIHsKKwkJCUFMT0dFKCJmb29Jc0J1ZmZlcjogR0wgY29tbXVuaWNhdGlvbiBlcnJvciwgcGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlIHRvIGIuYW5kcm9pZC5jb20uXG4iKTsKKwkJCWFib3J0KCk7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBmb29Eb0VuY29kZXJGbHVzaF9lbmModm9pZCAqc2VsZiAsIEZvb0ludCBwYXJhbSkKK3sKKworCWZvb19lbmNvZGVyX2NvbnRleHRfdCAqY3R4ID0gKGZvb19lbmNvZGVyX2NvbnRleHRfdCAqKXNlbGY7CisJSU9TdHJlYW0gKnN0cmVhbSA9IGN0eC0+bV9zdHJlYW07CisJQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IgPSBjdHgtPm1fY2hlY2tzdW1DYWxjdWxhdG9yOworCWJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bUNhbGN1bGF0b3ItPmdldFZlcnNpb24oKSA+IDA7CisKKwkgdW5zaWduZWQgY2hhciAqcHRyOworCSB1bnNpZ25lZCBjaGFyICpidWY7CisJIGNvbnN0IHNpemVfdCBzaXplV2l0aG91dENoZWNrc3VtID0gOCArIDQ7CisJIGNvbnN0IHNpemVfdCBjaGVja3N1bVNpemUgPSBjaGVja3N1bUNhbGN1bGF0b3ItPmNoZWNrc3VtQnl0ZVNpemUoKTsKKwkgY29uc3Qgc2l6ZV90IHRvdGFsU2l6ZSA9IHNpemVXaXRob3V0Q2hlY2tzdW0gKyBjaGVja3N1bVNpemU7CisJYnVmID0gc3RyZWFtLT5hbGxvYyh0b3RhbFNpemUpOworCXB0ciA9IGJ1ZjsKKwlpbnQgdG1wID0gT1BfZm9vRG9FbmNvZGVyRmx1c2g7bWVtY3B5KHB0ciwgJnRtcCwgNCk7IHB0ciArPSA0OworCW1lbWNweShwdHIsICZ0b3RhbFNpemUsIDQpOyAgcHRyICs9IDQ7CisKKwkJbWVtY3B5KHB0ciwgJnBhcmFtLCA0KTsgcHRyICs9IDQ7CisKKwlpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKGJ1ZiwgcHRyLWJ1Zik7CisJaWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPndyaXRlQ2hlY2tzdW0ocHRyLCBjaGVja3N1bVNpemUpOyBwdHIgKz0gY2hlY2tzdW1TaXplOworCisJc3RyZWFtLT5mbHVzaCgpOworfQorCit2b2lkIGZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cl9lbmModm9pZCAqc2VsZiAsIGNvbnN0IHZvaWQqIGNvbnN0KiBwYXJhbSkKK3sKKworCWZvb19lbmNvZGVyX2NvbnRleHRfdCAqY3R4ID0gKGZvb19lbmNvZGVyX2NvbnRleHRfdCAqKXNlbGY7CisJSU9TdHJlYW0gKnN0cmVhbSA9IGN0eC0+bV9zdHJlYW07CisJQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IgPSBjdHgtPm1fY2hlY2tzdW1DYWxjdWxhdG9yOworCWJvb2wgdXNlQ2hlY2tzdW0gPSBjaGVja3N1bUNhbGN1bGF0b3ItPmdldFZlcnNpb24oKSA+IDA7CisKKwljb25zdCB1bnNpZ25lZCBpbnQgX19zaXplX3BhcmFtID0gOworCSB1bnNpZ25lZCBjaGFyICpwdHI7CisJIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkgY29uc3Qgc2l6ZV90IHNpemVXaXRob3V0Q2hlY2tzdW0gPSA4ICsgX19zaXplX3BhcmFtICsgMSo0OworCSBjb25zdCBzaXplX3QgY2hlY2tzdW1TaXplID0gY2hlY2tzdW1DYWxjdWxhdG9yLT5jaGVja3N1bUJ5dGVTaXplKCk7CisJIGNvbnN0IHNpemVfdCB0b3RhbFNpemUgPSBzaXplV2l0aG91dENoZWNrc3VtICsgY2hlY2tzdW1TaXplOworCWJ1ZiA9IHN0cmVhbS0+YWxsb2ModG90YWxTaXplKTsKKwlwdHIgPSBidWY7CisJaW50IHRtcCA9IE9QX2Zvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cjttZW1jcHkocHRyLCAmdG1wLCA0KTsgcHRyICs9IDQ7CisJbWVtY3B5KHB0ciwgJnRvdGFsU2l6ZSwgNCk7ICBwdHIgKz0gNDsKKworCSoodW5zaWduZWQgaW50ICopKHB0cikgPSBfX3NpemVfcGFyYW07IHB0ciArPSA0OworCW1lbWNweShwdHIsIHBhcmFtLCBfX3NpemVfcGFyYW0pO3B0ciArPSBfX3NpemVfcGFyYW07CisKKwlpZiAodXNlQ2hlY2tzdW0pIGNoZWNrc3VtQ2FsY3VsYXRvci0+YWRkQnVmZmVyKGJ1ZiwgcHRyLWJ1Zik7CisJaWYgKHVzZUNoZWNrc3VtKSBjaGVja3N1bUNhbGN1bGF0b3ItPndyaXRlQ2hlY2tzdW0ocHRyLCBjaGVja3N1bVNpemUpOyBwdHIgKz0gY2hlY2tzdW1TaXplOworCit9CisKK30gIC8vIG5hbWVzcGFjZQorCitmb29fZW5jb2Rlcl9jb250ZXh0X3Q6OmZvb19lbmNvZGVyX2NvbnRleHRfdChJT1N0cmVhbSAqc3RyZWFtLCBDaGVja3N1bUNhbGN1bGF0b3IgKmNoZWNrc3VtQ2FsY3VsYXRvcikKK3sKKwltX3N0cmVhbSA9IHN0cmVhbTsKKwltX2NoZWNrc3VtQ2FsY3VsYXRvciA9IGNoZWNrc3VtQ2FsY3VsYXRvcjsKKworCXRoaXMtPmZvb0FscGhhRnVuYyA9ICZmb29BbHBoYUZ1bmNfZW5jOworCXRoaXMtPmZvb0lzQnVmZmVyID0gJmZvb0lzQnVmZmVyX2VuYzsKKwl0aGlzLT5mb29VbnN1cHBvcnRlZCA9IChmb29VbnN1cHBvcnRlZF9jbGllbnRfcHJvY190KSAmZW5jX3Vuc3VwcG9ydGVkOworCXRoaXMtPmZvb0RvRW5jb2RlckZsdXNoID0gJmZvb0RvRW5jb2RlckZsdXNoX2VuYzsKKwl0aGlzLT5mb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIgPSAmZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyX2VuYzsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2VuYy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjU4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fZW5jLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisKKyNpZm5kZWYgR1VBUkRfZm9vX2VuY29kZXJfY29udGV4dF90CisjZGVmaW5lIEdVQVJEX2Zvb19lbmNvZGVyX2NvbnRleHRfdAorCisjaW5jbHVkZSAiSU9TdHJlYW0uaCIKKyNpbmNsdWRlICJDaGVja3N1bUNhbGN1bGF0b3IuaCIKKyNpbmNsdWRlICJmb29fY2xpZW50X2NvbnRleHQuaCIKKworCisjaW5jbHVkZSAiZm9vVXRpbHMuaCIKKyNpbmNsdWRlICJmb29CYXNlLmgiCisKK3N0cnVjdCBmb29fZW5jb2Rlcl9jb250ZXh0X3QgOiBwdWJsaWMgZm9vX2NsaWVudF9jb250ZXh0X3QgeworCisJSU9TdHJlYW0gKm1fc3RyZWFtOworCUNoZWNrc3VtQ2FsY3VsYXRvciAqbV9jaGVja3N1bUNhbGN1bGF0b3I7CisKKwlmb29fZW5jb2Rlcl9jb250ZXh0X3QoSU9TdHJlYW0gKnN0cmVhbSwgQ2hlY2tzdW1DYWxjdWxhdG9yICpjaGVja3N1bUNhbGN1bGF0b3IpOworfTsKKworI2VuZGlmICAvLyBHVUFSRF9mb29fZW5jb2Rlcl9jb250ZXh0X3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fZW50cnkuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExMjljCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2VudHJ5LmNwcApAQCAtMCwwICsxLDUzIEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImZvb19jbGllbnRfY29udGV4dC5oIgorCisjaWZuZGVmIEdMX1RSVUUKK2V4dGVybiAiQyIgeworCXZvaWQgZm9vQWxwaGFGdW5jKEZvb0ludCBmdW5jLCBGb29GbG9hdCByZWYpOworCUZvb0Jvb2xlYW4gZm9vSXNCdWZmZXIodm9pZCogc3R1ZmYpOworCXZvaWQgZm9vVW5zdXBwb3J0ZWQodm9pZCogcGFyYW1zKTsKKwl2b2lkIGZvb0RvRW5jb2RlckZsdXNoKEZvb0ludCBwYXJhbSk7CisJdm9pZCBmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIoY29uc3Qgdm9pZCogY29uc3QqIHBhcmFtKTsKK307CisKKyNlbmRpZgorI2lmbmRlZiBHRVRfQ09OVEVYVAorc3RhdGljIGZvb19jbGllbnRfY29udGV4dF90OjpDT05URVhUX0FDQ0VTU09SX1RZUEUgKmdldEN1cnJlbnRDb250ZXh0ID0gTlVMTDsKK3ZvaWQgZm9vX2NsaWVudF9jb250ZXh0X3Q6OnNldENvbnRleHRBY2Nlc3NvcihDT05URVhUX0FDQ0VTU09SX1RZUEUgKmYpIHsgZ2V0Q3VycmVudENvbnRleHQgPSBmOyB9CisjZGVmaW5lIEdFVF9DT05URVhUIGZvb19jbGllbnRfY29udGV4dF90ICogY3R4ID0gZ2V0Q3VycmVudENvbnRleHQoKQorI2VuZGlmCisKK3ZvaWQgZm9vQWxwaGFGdW5jKEZvb0ludCBmdW5jLCBGb29GbG9hdCByZWYpCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29BbHBoYUZ1bmMoY3R4LCBmdW5jLCByZWYpOworfQorCitGb29Cb29sZWFuIGZvb0lzQnVmZmVyKHZvaWQqIHN0dWZmKQoreworCUdFVF9DT05URVhUOworCSBpZiAobiA9PSBOVUxMKSB7IExPRyhFUlJPUikgPDwgIk5VTEwgc3R1ZmYiOyByZXR1cm47IH0KKwlyZXR1cm4gY3R4LT5mb29Jc0J1ZmZlcihjdHgsIHN0dWZmKTsKK30KKwordm9pZCBmb29VbnN1cHBvcnRlZCh2b2lkKiBwYXJhbXMpCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29VbnN1cHBvcnRlZChjdHgsIHBhcmFtcyk7Cit9CisKK3ZvaWQgZm9vRG9FbmNvZGVyRmx1c2goRm9vSW50IHBhcmFtKQoreworCUdFVF9DT05URVhUOworCWN0eC0+Zm9vRG9FbmNvZGVyRmx1c2goY3R4LCBwYXJhbSk7Cit9CisKK3ZvaWQgZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyKGNvbnN0IHZvaWQqIGNvbnN0KiBwYXJhbSkKK3sKKwlHRVRfQ09OVEVYVDsKKwljdHgtPmZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cihjdHgsIHBhcmFtKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2Z0YWJsZS5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL2VuY29kZXIvZm9vX2Z0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTdlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fZnRhYmxlLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisjaWZuZGVmIF9fZm9vX2NsaWVudF9mdGFibGVfdF9oCisjZGVmaW5lIF9fZm9vX2NsaWVudF9mdGFibGVfdF9oCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBfZm9vX2Z1bmNzX2J5X25hbWUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqcHJvYzsKK30gZm9vX2Z1bmNzX2J5X25hbWVbXSA9IHsKKwl7ImZvb0FscGhhRnVuYyIsICh2b2lkKilmb29BbHBoYUZ1bmN9LAorCXsiZm9vSXNCdWZmZXIiLCAodm9pZCopZm9vSXNCdWZmZXJ9LAorCXsiZm9vVW5zdXBwb3J0ZWQiLCAodm9pZCopZm9vVW5zdXBwb3J0ZWR9LAorCXsiZm9vRG9FbmNvZGVyRmx1c2giLCAodm9pZCopZm9vRG9FbmNvZGVyRmx1c2h9LAorCXsiZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyIiwgKHZvaWQqKWZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cn0sCit9Oworc3RhdGljIGNvbnN0IGludCBmb29fbnVtX2Z1bmNzID0gc2l6ZW9mKGZvb19mdW5jc19ieV9uYW1lKSAvIHNpemVvZihzdHJ1Y3QgX2Zvb19mdW5jc19ieV9uYW1lKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC9lbmNvZGVyL2Zvb19vcGNvZGVzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fb3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTljYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvZW5jb2Rlci9mb29fb3Bjb2Rlcy5oCkBAIC0wLDAgKzEsMTQgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworI2lmbmRlZiBfX0dVQVJEX2Zvb19vcGNvZGVzX2hfCisjZGVmaW5lIF9fR1VBUkRfZm9vX29wY29kZXNfaF8KKworI2RlZmluZSBPUF9mb29BbHBoYUZ1bmMgCQkJCQkyMDAKKyNkZWZpbmUgT1BfZm9vSXNCdWZmZXIgCQkJCQkyMDEKKyNkZWZpbmUgT1BfZm9vVW5zdXBwb3J0ZWQgCQkJCQkyMDIKKyNkZWZpbmUgT1BfZm9vRG9FbmNvZGVyRmx1c2ggCQkJCQkyMDMKKyNkZWZpbmUgT1BfZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyIAkJCQkJMjA0CisjZGVmaW5lIE9QX2xhc3QgCQkJCQkyMDUKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC93cmFwcGVyL2Zvb193cmFwcGVyX2NvbnRleHQuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL3dyYXBwZXIvZm9vX3dyYXBwZXJfY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxMzJiMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC93cmFwcGVyL2Zvb193cmFwcGVyX2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmb29fd3JhcHBlcl9jb250ZXh0LmgiCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBmb29fd3JhcHBlcl9jb250ZXh0X3Q6OmluaXREaXNwYXRjaEJ5TmFtZSh2b2lkICooKmdldFByb2MpKGNvbnN0IGNoYXIgKiwgdm9pZCAqdXNlckRhdGEpLCB2b2lkICp1c2VyRGF0YSkKK3sKKwlmb29BbHBoYUZ1bmMgPSAoZm9vQWxwaGFGdW5jX3dyYXBwZXJfcHJvY190KSBnZXRQcm9jKCJmb29BbHBoYUZ1bmMiLCB1c2VyRGF0YSk7CisJZm9vSXNCdWZmZXIgPSAoZm9vSXNCdWZmZXJfd3JhcHBlcl9wcm9jX3QpIGdldFByb2MoImZvb0lzQnVmZmVyIiwgdXNlckRhdGEpOworCWZvb1Vuc3VwcG9ydGVkID0gKGZvb1Vuc3VwcG9ydGVkX3dyYXBwZXJfcHJvY190KSBnZXRQcm9jKCJmb29VbnN1cHBvcnRlZCIsIHVzZXJEYXRhKTsKKwlmb29Eb0VuY29kZXJGbHVzaCA9IChmb29Eb0VuY29kZXJGbHVzaF93cmFwcGVyX3Byb2NfdCkgZ2V0UHJvYygiZm9vRG9FbmNvZGVyRmx1c2giLCB1c2VyRGF0YSk7CisJZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyID0gKGZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cl93cmFwcGVyX3Byb2NfdCkgZ2V0UHJvYygiZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyIiwgdXNlckRhdGEpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvd3JhcHBlci9mb29fd3JhcHBlcl9jb250ZXh0LmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvd3JhcHBlci9mb29fd3JhcHBlcl9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkYjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC93cmFwcGVyL2Zvb193cmFwcGVyX2NvbnRleHQuaApAQCAtMCwwICsxLDI1IEBACisvLyBHZW5lcmF0ZWQgQ29kZSAtIERPIE5PVCBFRElUICEhCisvLyBnZW5lcmF0ZWQgYnkgJ2VtdWdlbicKKyNpZm5kZWYgX19mb29fd3JhcHBlcl9jb250ZXh0X3RfaAorI2RlZmluZSBfX2Zvb193cmFwcGVyX2NvbnRleHRfdF9oCisKKyNpbmNsdWRlICJmb29fc2VydmVyX3Byb2MuaCIKKworI2luY2x1ZGUgImZvb190eXBlcy5oIgorCisKK3N0cnVjdCBmb29fd3JhcHBlcl9jb250ZXh0X3QgeworCisJZm9vQWxwaGFGdW5jX3dyYXBwZXJfcHJvY190IGZvb0FscGhhRnVuYzsKKwlmb29Jc0J1ZmZlcl93cmFwcGVyX3Byb2NfdCBmb29Jc0J1ZmZlcjsKKwlmb29VbnN1cHBvcnRlZF93cmFwcGVyX3Byb2NfdCBmb29VbnN1cHBvcnRlZDsKKwlmb29Eb0VuY29kZXJGbHVzaF93cmFwcGVyX3Byb2NfdCBmb29Eb0VuY29kZXJGbHVzaDsKKwlmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHJfd3JhcHBlcl9wcm9jX3QgZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyOworCXZpcnR1YWwgfmZvb193cmFwcGVyX2NvbnRleHRfdCgpIHt9CisKKwl0eXBlZGVmIGZvb193cmFwcGVyX2NvbnRleHRfdCAqQ09OVEVYVF9BQ0NFU1NPUl9UWVBFKHZvaWQpOworCXN0YXRpYyB2b2lkIHNldENvbnRleHRBY2Nlc3NvcihDT05URVhUX0FDQ0VTU09SX1RZUEUgKmYpOworCWludCBpbml0RGlzcGF0Y2hCeU5hbWUoIHZvaWQgKigqZ2V0UHJvYykoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdXNlckRhdGEpLCB2b2lkICp1c2VyRGF0YSk7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC93cmFwcGVyL2Zvb193cmFwcGVyX2VudHJ5LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9leHBlY3RlZC93cmFwcGVyL2Zvb193cmFwcGVyX2VudHJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTkxMzkzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL3dyYXBwZXIvZm9vX3dyYXBwZXJfZW50cnkuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIEdlbmVyYXRlZCBDb2RlIC0gRE8gTk9UIEVESVQgISEKKy8vIGdlbmVyYXRlZCBieSAnZW11Z2VuJworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZm9vX3dyYXBwZXJfY29udGV4dC5oIgorCisjaWZuZGVmIEdMX1RSVUUKK2V4dGVybiAiQyIgeworCXZvaWQgZm9vQWxwaGFGdW5jKEZvb0ludCBmdW5jLCBGb29GbG9hdCByZWYpOworCUZvb0Jvb2xlYW4gZm9vSXNCdWZmZXIodm9pZCogc3R1ZmYpOworCXZvaWQgZm9vVW5zdXBwb3J0ZWQodm9pZCogcGFyYW1zKTsKKwl2b2lkIGZvb0RvRW5jb2RlckZsdXNoKEZvb0ludCBwYXJhbSk7CisJdm9pZCBmb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIoY29uc3Qgdm9pZCogY29uc3QqIHBhcmFtKTsKK307CisKKyNlbmRpZgorI2lmbmRlZiBHRVRfQ09OVEVYVAorc3RhdGljIGZvb193cmFwcGVyX2NvbnRleHRfdDo6Q09OVEVYVF9BQ0NFU1NPUl9UWVBFICpnZXRDdXJyZW50Q29udGV4dCA9IE5VTEw7Cit2b2lkIGZvb193cmFwcGVyX2NvbnRleHRfdDo6c2V0Q29udGV4dEFjY2Vzc29yKENPTlRFWFRfQUNDRVNTT1JfVFlQRSAqZikgeyBnZXRDdXJyZW50Q29udGV4dCA9IGY7IH0KKyNkZWZpbmUgR0VUX0NPTlRFWFQgZm9vX3dyYXBwZXJfY29udGV4dF90ICogY3R4ID0gZ2V0Q3VycmVudENvbnRleHQoKQorI2VuZGlmCisKK3ZvaWQgZm9vQWxwaGFGdW5jKEZvb0ludCBmdW5jLCBGb29GbG9hdCByZWYpCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29BbHBoYUZ1bmMoIGZ1bmMsIHJlZik7Cit9CisKK0Zvb0Jvb2xlYW4gZm9vSXNCdWZmZXIodm9pZCogc3R1ZmYpCit7CisJR0VUX0NPTlRFWFQ7CisJcmV0dXJuIGN0eC0+Zm9vSXNCdWZmZXIoIHN0dWZmKTsKK30KKwordm9pZCBmb29VbnN1cHBvcnRlZCh2b2lkKiBwYXJhbXMpCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29VbnN1cHBvcnRlZCggcGFyYW1zKTsKK30KKwordm9pZCBmb29Eb0VuY29kZXJGbHVzaChGb29JbnQgcGFyYW0pCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29Eb0VuY29kZXJGbHVzaCggcGFyYW0pOworfQorCit2b2lkIGZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cihjb25zdCB2b2lkKiBjb25zdCogcGFyYW0pCit7CisJR0VUX0NPTlRFWFQ7CisJY3R4LT5mb29UYWtlQ29uc3RWb2lkUHRyQ29uc3RQdHIoIHBhcmFtKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL3dyYXBwZXIvZm9vX3dyYXBwZXJfcHJvYy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2V4cGVjdGVkL3dyYXBwZXIvZm9vX3dyYXBwZXJfcHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NGI5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvZXhwZWN0ZWQvd3JhcHBlci9mb29fd3JhcHBlcl9wcm9jLmgKQEAgLTAsMCArMSwxOSBAQAorLy8gR2VuZXJhdGVkIENvZGUgLSBETyBOT1QgRURJVCAhIQorLy8gZ2VuZXJhdGVkIGJ5ICdlbXVnZW4nCisjaWZuZGVmIF9fZm9vX3dyYXBwZXJfcHJvY190X2gKKyNkZWZpbmUgX19mb29fd3JhcHBlcl9wcm9jX3RfaAorCisKKworI2luY2x1ZGUgImZvb190eXBlcy5oIgorI2lmbmRlZiBmb29fQVBJRU5UUlkKKyNkZWZpbmUgZm9vX0FQSUVOVFJZIAorI2VuZGlmCit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vQWxwaGFGdW5jX3dyYXBwZXJfcHJvY190KSAoRm9vSW50LCBGb29GbG9hdCk7Cit0eXBlZGVmIEZvb0Jvb2xlYW4gKGZvb19BUElFTlRSWSAqZm9vSXNCdWZmZXJfd3JhcHBlcl9wcm9jX3QpICh2b2lkKik7Cit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vVW5zdXBwb3J0ZWRfd3JhcHBlcl9wcm9jX3QpICh2b2lkKik7Cit0eXBlZGVmIHZvaWQgKGZvb19BUElFTlRSWSAqZm9vRG9FbmNvZGVyRmx1c2hfd3JhcHBlcl9wcm9jX3QpIChGb29JbnQpOwordHlwZWRlZiB2b2lkIChmb29fQVBJRU5UUlkgKmZvb1Rha2VDb25zdFZvaWRQdHJDb25zdFB0cl93cmFwcGVyX3Byb2NfdCkgKGNvbnN0IHZvaWQqIGNvbnN0Kik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvaW5wdXQvZm9vLmF0dHJpYiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9pbnB1dC9mb28uYXR0cmliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjQ0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvaW5wdXQvZm9vLmF0dHJpYgpAQCAtMCwwICsxLDE1IEBACitHTE9CQUwKKyAgICBiYXNlX29wY29kZSAyMDAKKyAgICBlbmNvZGVyX2hlYWRlcnMgImZvb1V0aWxzLmgiICJmb29CYXNlLmgiCisKK2Zvb0lzQnVmZmVyCisgICAgZGlyIHN0dWZmIGluCisgICAgbGVuIHN0dWZmICg0ICogc2l6ZW9mKGZsb2F0KSkKKyAgICBwYXJhbV9jaGVjayBzdHVmZiBpZiAobiA9PSBOVUxMKSB7IExPRyhFUlJPUikgPDwgIk5VTEwgc3R1ZmYiOyByZXR1cm47IH0KKworZm9vVW5zdXBwb3J0ZWQKKyAgICBkaXIgcGFyYW1zIGluCisgICAgZmxhZyB1bnN1cHBvcnRlZAorCitmb29Eb0VuY29kZXJGbHVzaAorICAgIGZsYWcgZmx1c2hPbkVuY29kZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2lucHV0L2Zvby5pbiBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9pbnB1dC9mb28uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5OGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9ob3N0L3Rvb2xzL2VtdWdlbi90ZXN0cy90LjAwMS9pbnB1dC9mb28uaW4KQEAgLTAsMCArMSw1IEBACitGT09fRU5UUlkodm9pZCwgZm9vQWxwaGFGdW5jLCBGb29JbnQgZnVuYywgRm9vRmxvYXQgcmVmKQorRk9PX0VOVFJZKEZvb0Jvb2xlYW4sIGZvb0lzQnVmZmVyLCB2b2lkKiBzdHVmZikKK0ZPT19FTlRSWSh2b2lkLCBmb29VbnN1cHBvcnRlZCwgdm9pZCogcGFyYW1zKQorRk9PX0VOVFJZKHZvaWQsIGZvb0RvRW5jb2RlckZsdXNoLCBGb29JbnQgcGFyYW0pCitGT09fRU5UUlkodm9pZCwgZm9vVGFrZUNvbnN0Vm9pZFB0ckNvbnN0UHRyLCBjb25zdCB2b2lkKiBjb25zdCogcGFyYW0pCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvdC4wMDEvaW5wdXQvZm9vLnR5cGVzIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2lucHV0L2Zvby50eXBlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ3MmZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3QuMDAxL2lucHV0L2Zvby50eXBlcwpAQCAtMCwwICsxLDEwIEBACitGb29Cb29sZWFuIDggJWQKK0Zvb0ludCAzMiAlZAorRm9vU2hvcnQgMTYgJWQKK0Zvb0Zsb2F0IDMyICVmCitGb29FbnVtIDMyICUwOHgKK0Zvb1ZvaWQgMCAleAorRm9vQ2hhciA4ICVkCitGb29DaGFyKiAzMiAweCUwOHgKK3ZvaWQqIDMyIDB4JTA4eAordm9pZCpjb25zdCogMzIgMHglMDh4CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2NyaXB0cy9nZW4taGVhZGVycy5zaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zY3JpcHRzL2dlbi1oZWFkZXJzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhMmFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2NyaXB0cy9nZW4taGVhZGVycy5zaApAQCAtMCwwICsxLDExNCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFJ1biB0aGlzIHNjcmlwdCB0byByZS1nZW5lcmF0ZSBoZWFkZXJzIHdpdGggdGhlIGdlbi1lbnRyaWVzLnB5IHNjcmlwdC4KKworc2V0IC1lCitleHBvcnQgTEFORz1DCitleHBvcnQgTENfQUxMPUMKKworUFJPR0RJUj0kKGRpcm5hbWUgIiQwIikKKworcGFuaWMgKCkgeworICAgIGVjaG8gIkVSUk9SOiAkQCIKKyAgICBleGl0IDEKK30KKworUUVNVV9UT1BfRElSPSQoY2QgJFBST0dESVIvLi4vLi4vLi4gJiYgcHdkIC1QKQorU0NSSVBUX0RJUj1hbmRyb2lkL3NjcmlwdHMKK2lmIFsgISAtZCAiJFFFTVVfVE9QX0RJUi8kU0NSSVBUX0RJUiIgXTsgdGhlbgorICAgIHBhbmljICJNaXNzaW5nIHNjcmlwdHMgZGlyZWN0b3J5OiAkUUVNVV9UT1BfRElSLyRTQ1JJUFRfRElSIgorZmkKKworY2QgJFFFTVVfVE9QX0RJUgorR0VOX0VOVFJJRVM9JFNDUklQVF9ESVIvZ2VuLWVudHJpZXMucHkKK2lmIFsgISAtZiAiJEdFTl9FTlRSSUVTIiBdOyB0aGVuCisgICAgcGFuaWMgIk1pc3Npbmcgc2NyaXB0OiAkR0VOX0VOVFJJRVMiCitmaQorCitGQUlMVVJFUz0KKworIyAkMTogU291cmNlIGZpbGUKKyMgJDI6IFRhcmdldCBmaWxlCisjICQzOiBnZW4tZW50cmllcyBzY3JpcHQuCitnZW5fZnVuY3Rpb25zX2hlYWRlciAoKSB7CisgICAgbG9jYWwgU1JDX0ZJTEU9IiQxIgorICAgIGxvY2FsIERTVF9GSUxFPSIkMiIKKyAgICBsb2NhbCBHRU5fRU5UUklFUz0iJDMiCisgICAgaWYgWyAhIC1mICIkU1JDX0ZJTEUiIF07IHRoZW4KKyAgICAgICAgZWNobyAiRVJST1I6IE1pc3Npbmcgc291cmNlIGZpbGU6ICRTUkNfRklMRSIKKyAgICAgICAgRkFJTFVSRVM9dHJ1ZQorICAgIGVsc2UKKyAgICAgICAgZWNobyAiR2VuZXJhdGluZyAkRFNUX0ZJTEUiCisgICAgICAgICRHRU5fRU5UUklFUyAtLW1vZGU9ZnVuY3Rpb25zICRTUkNfRklMRSAtLW91dHB1dD0kRFNUX0ZJTEUKKyAgICBmaQorfQorCisjICQxOiBTb3VyY2UgZmlsZQorIyAkMjogVGFyZ2V0IGZpbGUKKyMgJDM6IGdlbi1lbnRyaWVzIHNjcmlwdC4KK2dlbl9mdW5jYXJnc19oZWFkZXIgKCkgeworICAgIGxvY2FsIFNSQ19GSUxFPSIkMSIKKyAgICBsb2NhbCBEU1RfRklMRT0iJDIiCisgICAgbG9jYWwgR0VOX0VOVFJJRVM9IiQzIgorICAgIGlmIFsgISAtZiAiJFNSQ19GSUxFIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkVSUk9SOiBNaXNzaW5nIHNvdXJjZSBmaWxlOiAkU1JDX0ZJTEUiCisgICAgICAgIEZBSUxVUkVTPXRydWUKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIkdlbmVyYXRpbmcgJERTVF9GSUxFIgorICAgICAgICAkR0VOX0VOVFJJRVMgLS1tb2RlPWZ1bmNhcmdzICRTUkNfRklMRSAtLW91dHB1dD0kRFNUX0ZJTEUKKyAgICBmaQorfQorCisKKyMjCisjIyAgbGliT3BlbmdsUmVuZGVyIGhlYWRlcnMuCisjIworTElCUkVOREVSX0RJUj1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5nbFJlbmRlcgorTElCUkVOREVSX0lOQ0xVREU9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIKK2dlbl9mdW5jYXJnc19oZWFkZXIgXAorICAgICAgICAiJExJQlJFTkRFUl9ESVIiL3JlbmRlcl9hcGkuZW50cmllcyBcCisgICAgICAgICIkTElCUkVOREVSX0lOQ0xVREUiL3JlbmRlcl9hcGlfZnVuY3Rpb25zLmggXAorICAgICAgICAiJEdFTl9FTlRSSUVTIgorCisjIworIyMgbGliT3BlbkdMRVNEaXNwYXRjaCBoZWFkZXJzLgorIyMKK09QRU5HTEVTX0RJU1BBVENIX1NSQ0RJUj1hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzL2xpYk9wZW5HTEVTRGlzcGF0Y2gKK09QRU5HTEVTX0RJU1BBVENIX0lOQ0xVREU9YW5kcm9pZC9hbmRyb2lkLWVtdWdsL2hvc3QvaW5jbHVkZS9PcGVuR0xFU0Rpc3BhdGNoCisKK2dlbl9mdW5jdGlvbnNfaGVhZGVyIFwKKyAgICAgICAgIiRPUEVOR0xFU19ESVNQQVRDSF9TUkNESVIiL3JlbmRlcl9lZ2wuZW50cmllcyBcCisgICAgICAgICIkT1BFTkdMRVNfRElTUEFUQ0hfSU5DTFVERSIvUmVuZGVyRUdMX2Z1bmN0aW9ucy5oIFwKKyAgICAgICAgIiRHRU5fRU5UUklFUyIKKworZ2VuX2Z1bmN0aW9uc19oZWFkZXIgXAorICAgICAgICAiJE9QRU5HTEVTX0RJU1BBVENIX1NSQ0RJUiIvcmVuZGVyX2VnbF9leHRlbnNpb25zLmVudHJpZXMgXAorICAgICAgICAiJE9QRU5HTEVTX0RJU1BBVENIX0lOQ0xVREUiL1JlbmRlckVHTF9leHRlbnNpb25zX2Z1bmN0aW9ucy5oIFwKKyAgICAgICAgIiRHRU5fRU5UUklFUyIKKworR0xFU19FTlRSSUVTPSJnbGVzX2NvbW1vbiBnbGVzX2V4dGVuc2lvbnMgZ2xlczFfb25seSBnbGVzMV9leHRlbnNpb25zIGdsZXMyX29ubHkgXAorZ2xlczJfZXh0ZW5zaW9ucyBnbGVzM19vbmx5IgorCitmb3IgRU5UUlkgaW4gJEdMRVNfRU5UUklFUzsgZG8KKyAgICBTUkNfRklMRT0kT1BFTkdMRVNfRElTUEFUQ0hfU1JDRElSLyR7RU5UUll9LmVudHJpZXMKKyAgICBEU1RfRklMRT0kT1BFTkdMRVNfRElTUEFUQ0hfSU5DTFVERS8ke0VOVFJZfV9mdW5jdGlvbnMuaAorICAgIGdlbl9mdW5jYXJnc19oZWFkZXIgIiRTUkNfRklMRSIgIiREU1RfRklMRSIgIiRHRU5fRU5UUklFUyIKK2RvbmUKKworaWYgWyAiJEZBSUxVUkVTIiBdOyB0aGVuCisgICAgZXhpdCAxCitmaQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NjcmlwdHMvdXBkYXRlLWVtdWdsLXNvdXJjZXMuc2ggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2NyaXB0cy91cGRhdGUtZW11Z2wtc291cmNlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOWRiZjlmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NjcmlwdHMvdXBkYXRlLWVtdWdsLXNvdXJjZXMuc2gKQEAgLTAsMCArMSwxNDAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldCAtZQorCitleHBvcnQgTEFORz1DCitleHBvcnQgTENfQUxMPUMKKworUFJPR0RJUj0kKGRpcm5hbWUgIiQwIikKK1BST0dOQU1FPSQoYmFzZW5hbWUgIiQwIikKKworZmF0YWwgKCkgeworICAgIGVjaG8gIkVSUk9SOiAkQCIKKyAgICBleGl0IDEKK30KKworIyBBc3N1bWUgdGhpcyBpcyB1bmRlciAkQU9TUC9leHRlcm5hbC9xZW11L2FuZHJvaWQvdGhpcmRfcGFydHkvCitBT1NQX0RJUj0kUFJPR0RJUi8uLi8uLi8uLgorQU9TUF9ESVI9JChjZCAiJEFPU1BfRElSIiAmJiBwd2QgLVApCisKK09QVF9BT1NQX0RJUj0KK09QVF9FTVVHRU49CitPUFRfSEVMUD0KKworZm9yIE9QVDsgZG8KKyAgICBPUFRBUkc9JChleHByICJ4JE9QVCIgOiAieFtePV0qPVxcKC4qXFwpIiB8fCB0cnVlKQorICAgIGNhc2UgJE9QVCBpbgorICAgIC0taGVscHwtaHwtXD8pCisgICAgICAgIE9QVF9IRUxQPXRydWUKKyAgICAgICAgOzsKKyAgICAtLWFvc3AtZGlyPSopCisgICAgICAgIE9QVF9BT1NQX0RJUj0kT1BUQVJHCisgICAgICAgIDs7CisgICAgLS1lbXVnZW49KikKKyAgICAgICAgT1BUX0VNVUdFTj0kT1BUQVJHCisgICAgICAgIDs7CisgICAgLSopCisgICAgICAgIGZhdGFsICJJbnZhbGlkIG9wdGlvbiAnJE9QVCcsIHNlZSAtLWhlbHAuIgorICAgICAgICA7OworICAgICopCisgICAgICAgIGZhdGFsICJUaGlzIHNjcmlwdCBkb2Vzbid0IHRha2UgYXJndW1lbnRzLCBzZWUgLS1oZWxwLiIKKyAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgIiRPUFRfSEVMUCIgXTsgdGhlbgorICAgIGNhdCA8PEVPRgorVXNhZ2U6ICRQUk9HTkFNRSBbb3B0aW9uc10KKworVXBkYXRlIHRoZSBzb3VyY2VzIG9mIHRoZSBHUFUgZW11bGF0aW9uIGVuY29kZXIgYW5kIGRlY29kZXIsIGFmdGVyIGFuIHVwZGF0ZQordG8gdGhlICdlbXVnZW4nIHRvb2wuCisKK1ZhbGlkIG9wdGlvbnMgKGRlZmF1bHRzIGFyZSBpbiBicmFja2V0cyk6CisgICAgLS1oZWxwfC1ofC0/ICAgICAgICAgUHJpbnQgdGhpcyBoZWxwLgorICAgIC0tYW9zcC1kaXI9PGRpcj4gICAgIFNwZWNpZnkgdG9wLWxldmVsIEFPU1AgZGlyZWN0b3J5IFskQU9TUF9ESVJdLgorICAgIC0tZW11Z2VuPTxwcm9ncmFtPiAgIEVtdWdlbiBwcm9ncmFtIHBhdGgsIGlmIG5vdCBpbiBwYXRoLgorRU9GCisgICAgZXhpdCAwCitmaQorCitFTVVHRU49CitpZiBbICIkT1BUX0VNVUdFTiIgXTsgdGhlbgorICAgIEVNVUdFTj0kT1BUX0VNVUdFTgorICAgIGlmIFsgISAtZiAiJEVNVUdFTiIgXTsgdGhlbgorICAgICAgICBmYXRhbCAiTWlzc2luZyBlbXVnZW4gYmluYXJ5OiAkRU1VR0VOIgorICAgIGZpCitlbHNlCisgICAgRU1VR0VOPSRQUk9HRElSLy4uL29ianMvYnVpbGQvaW50ZXJtZWRpYXRlczY0L2VtdWdlbi9lbXVnZW4KKyAgICBpZiBbICEgLWYgIiRFTVVHRU4iIF07IHRoZW4KKyAgICAgICAgZmF0YWwgIk1pc3NpbmcgZW11Z2VuIGJpbmFyeTogJEVNVUdFTiwgcGxlYXNlIGJ1aWxkIGl0IG9yIHVzZSAtLWVtdWdlbj08cHJvZ3JhbT4iCisgICAgZmkKKyAgICBlY2hvICJBdXRvLWNvbmZpZzogLS1lbXVnZW49JEVNVUdFTiIKK2ZpCisKK2lmIFsgIiRPUFRfQU9TUF9ESVIiIF07IHRoZW4KKyAgICBBT1NQX0RJUj0kT1BUX0FPU1BfRElSCitlbHNlCisgICAgZWNobyAiQXV0by1jb25maWc6IC0tYW9zcC1kaXI9JEFPU1BfRElSIgorZmkKK2lmIFsgISAtZiAiJEFPU1BfRElSL2J1aWxkL2VudnNldHVwLnNoIiBdOyB0aGVuCisgICAgZmF0YWwgIk5vdCBhbiBBT1NQIGRpcmVjdG9yeTogJEFPU1BfRElSIgorZmkKKworQU9TUF9ESVI9JChjZCAiJEFPU1BfRElSIiAmJiBwd2QgLVApCisKKyMgRmluZCB0aGUgc291cmNlcyBmb3IgdGhlIGVuY29kZXI6CitFTkNPREVSX1RPUF9ESVI9JEFPU1BfRElSL2RldmljZS9nZW5lcmljL2dvbGRmaXNoLW9wZW5nbC9zeXN0ZW0KK0RFQ09ERVJfVE9QX0RJUj0kUFJPR0RJUi8uLi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvaG9zdC9saWJzCisKK2lmIFsgISAtZCAiJEVOQ09ERVJfVE9QX0RJUiIgXTsgdGhlbgorICAgIGZhdGFsICJNaXNzaW5nIGVuY29kZXIgc291cmNlIGRpcmVjdG9yeTogJEVOQ09ERVJfVE9QX0RJUiIKK2ZpCitpZiBbICEgLWQgIiRERUNPREVSX1RPUF9ESVIiIF07IHRoZW4KKyAgICBmYXRhbCAiTWlzc2luZyBkZWNvZGVyIHNvdXJjZSBkaXJlY3Rvcnk6ICRERUNPREVSX1RPUF9ESVIiCitmaQorCisKKworIyBHTEVTdjEgZW5jb2RlcgorR0xFU3YxX0lOUFVUX0RJUj0kREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMKK0dMRVN2Ml9JTlBVVF9ESVI9JERFQ09ERVJfVE9QX0RJUi9HTEVTdjJfZGVjCitSRU5ERVJDT05UUk9MX0lOUFVUX0RJUj0kREVDT0RFUl9UT1BfRElSL3JlbmRlckNvbnRyb2xfZGVjCisKKyMgVGhlIGVuY29kZXIgaGFzIHByZWZpeCBHTCB3aGlsZSBkZWNvZGVyIGhhcyBHTEVTCitjcCAtZiAkREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMvZ2xlczEuYXR0cmliICRERUNPREVSX1RPUF9ESVIvR0xFU3YxX2RlYy9nbC5hdHRyaWIKK2NwIC1mICRERUNPREVSX1RPUF9ESVIvR0xFU3YxX2RlYy9nbGVzMS5pbiAkREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMvZ2wuaW4KK2NwIC1mICRERUNPREVSX1RPUF9ESVIvR0xFU3YxX2RlYy9nbGVzMS50eXBlcyAkREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMvZ2wudHlwZXMKKworY3AgLWYgJERFQ09ERVJfVE9QX0RJUi9HTEVTdjJfZGVjL2dsZXMyLmF0dHJpYiAkREVDT0RFUl9UT1BfRElSL0dMRVN2Ml9kZWMvZ2wyLmF0dHJpYgorY3AgLWYgJERFQ09ERVJfVE9QX0RJUi9HTEVTdjJfZGVjL2dsZXMyLmluICRERUNPREVSX1RPUF9ESVIvR0xFU3YyX2RlYy9nbDIuaW4KK2NwIC1mICRERUNPREVSX1RPUF9ESVIvR0xFU3YyX2RlYy9nbGVzMi50eXBlcyAkREVDT0RFUl9UT1BfRElSL0dMRVN2Ml9kZWMvZ2wyLnR5cGVzCisKKyRFTVVHRU4gLWkgJERFQ09ERVJfVE9QX0RJUi9HTEVTdjFfZGVjIC1FICRFTkNPREVSX1RPUF9ESVIvR0xFU3YxX2VuYyBnbAorJEVNVUdFTiAtaSAkREVDT0RFUl9UT1BfRElSL0dMRVN2Ml9kZWMgLUUgJEVOQ09ERVJfVE9QX0RJUi9HTEVTdjJfZW5jIGdsMgorJEVNVUdFTiAtaSAkREVDT0RFUl9UT1BfRElSL3JlbmRlckNvbnRyb2xfZGVjIC1FICRFTkNPREVSX1RPUF9ESVIvcmVuZGVyQ29udHJvbF9lbmMgcmVuZGVyQ29udHJvbAorCitybSAkREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMvZ2wuYXR0cmliCitybSAkREVDT0RFUl9UT1BfRElSL0dMRVN2MV9kZWMvZ2wuaW4KK3JtICRERUNPREVSX1RPUF9ESVIvR0xFU3YxX2RlYy9nbC50eXBlcworCitybSAkREVDT0RFUl9UT1BfRElSL0dMRVN2Ml9kZWMvZ2wyLmF0dHJpYgorcm0gJERFQ09ERVJfVE9QX0RJUi9HTEVTdjJfZGVjL2dsMi5pbgorcm0gJERFQ09ERVJfVE9QX0RJUi9HTEVTdjJfZGVjL2dsMi50eXBlcworCitlY2hvICJEb25lLCBzZWUgJEVOQ09ERVJfVE9QX0RJUiIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9BbmRyb2lkLm1rIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2VmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorIyBUaGlzIGJ1aWxkIHNjcmlwdCBjb3JyZXNwb25kcyB0byBhIGxpYnJhcnkgY29udGFpbmluZyBtYW55IGRlZmluaXRpb25zCisjIGNvbW1vbiB0byBib3RoIHRoZSBndWVzdCBhbmQgdGhlIGhvc3QuIFRoZXkgcmVsYXRlIHRvCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2NvbW1vblNvdXJjZXMgOj0gXAorICAgICAgICBnbFV0aWxzLmNwcCBcCisgICAgICAgIENoZWNrc3VtQ2FsY3VsYXRvci5jcHAgXAorICAgICAgICBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvLmNwcCBcCisKK2hvc3RfY29tbW9uU291cmNlcyA6PSAkKGNvbW1vblNvdXJjZXMpCisKK2hvc3RfY29tbW9uTGRMaWJzIDo9ICQoQ1hYX1NURF9MSUIpCisKKyMjIyBPcGVuZ2xDb2RlY0NvbW1vbiAgaG9zdCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiskKGNhbGwgZW11Z2wtYmVnaW4tc3RhdGljLWxpYnJhcnksbGliT3BlbmdsQ29kZWNDb21tb24pCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGhvc3RfY29tbW9uU291cmNlcykKKyQoY2FsbCBlbXVnbC1pbXBvcnQsIGxpYmVtdWdsX2NvbW1vbikKKyQoY2FsbCBlbXVnbC1leHBvcnQsQ19JTkNMVURFUywkKEVNVUdMX1BBVEgpL2hvc3QvaW5jbHVkZS9PcGVuZ2xSZW5kZXIgJChMT0NBTF9QQVRIKSkKKyQoY2FsbCBlbXVnbC1leHBvcnQsTERMSUJTLCQoaG9zdF9jb21tb25MZExpYnMpKQorJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCisKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9DaGVja3N1bUNhbGN1bGF0b3IuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9DaGVja3N1bUNhbGN1bGF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhM2EzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvci5jcHAKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJDaGVja3N1bUNhbGN1bGF0b3IuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gQ2hlY2tsaXN0IHdoZW4gaW1wbGVtZW50aW5nIG5ldyBwcm90b2NvbDoKKy8vIDEuIHVwZGF0ZSBDSEVDS1NVTUhFTFBFUl9NQVhfVkVSU0lPTgorLy8gMi4gdXBkYXRlIGNoZWNrc3VtQnl0ZVNpemUoKQorLy8gMy4gdXBkYXRlIGFkZEJ1ZmZlciwgd3JpdGVDaGVja3N1bSwgcmVzZXRDaGVja3N1bSwgdmFsaWRhdGUKKworLy8gY2hhbmdlIENIRUNLU1VNSEVMUEVSX01BWF9WRVJTSU9OIHdoZW4geW91IHdhbnQgdG8gdXBkYXRlIHRoZSBwcm90b2NvbCB2ZXJzaW9uCisjZGVmaW5lIENIRUNLU1VNSEVMUEVSX01BWF9WRVJTSU9OIDEKKworLy8gdXRpbGl0eSBtYWNyb3MgdG8gY3JlYXRlIGNoZWNrc3VtIHN0cmluZyBhdCBjb21waWxhdGlvbiB0aW1lCisjZGVmaW5lIENIRUNLU1VNSEVMUEVSX1ZFUlNJT05fU1RSX1BSRUZJWCAiQU5EUk9JRF9FTVVfQ0hFQ0tTVU1fSEVMUEVSX3YiCisjZGVmaW5lIENIRUNLU1VNSEVMUEVSX01BQ1JPX1RPX1NUUih4KSAjeAorI2RlZmluZSBDSEVDS1NVTUhFTFBFUl9NQUNST19WQUxfVE9fU1RSKHgpIENIRUNLU1VNSEVMUEVSX01BQ1JPX1RPX1NUUih4KQorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFZlcnNpb24gPSBDSEVDS1NVTUhFTFBFUl9NQVhfVkVSU0lPTjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrTWF4VmVyc2lvblN0clByZWZpeCA9IENIRUNLU1VNSEVMUEVSX1ZFUlNJT05fU1RSX1BSRUZJWDsKK3N0YXRpYyBjb25zdCBjaGFyKiBrTWF4VmVyc2lvblN0ciA9IENIRUNLU1VNSEVMUEVSX1ZFUlNJT05fU1RSX1BSRUZJWCBDSEVDS1NVTUhFTFBFUl9NQUNST19WQUxfVE9fU1RSKENIRUNLU1VNSEVMUEVSX01BWF9WRVJTSU9OKTsKKworI3VuZGVmIENIRUNLU1VNSEVMUEVSX01BWF9WRVJTSU9OCisjdW5kZWYgQ0hFQ0tTVU1IRUxQRVJfVkVSU0lPTl9TVFJfUFJFRklYCisjdW5kZWYgQ0hFQ0tTVU1IRUxQRVJfTUFDUk9fVE9fU1RSCisjdW5kZWYgQ0hFQ0tTVU1IRUxQRVJfTUFDUk9fVkFMX1RPX1NUUgorCit1aW50MzJfdCBDaGVja3N1bUNhbGN1bGF0b3I6OmdldE1heFZlcnNpb24oKSB7cmV0dXJuIGtNYXhWZXJzaW9uO30KK2NvbnN0IGNoYXIqIENoZWNrc3VtQ2FsY3VsYXRvcjo6Z2V0TWF4VmVyc2lvblN0cigpIHtyZXR1cm4ga01heFZlcnNpb25TdHI7fQorY29uc3QgY2hhciogQ2hlY2tzdW1DYWxjdWxhdG9yOjpnZXRNYXhWZXJzaW9uU3RyUHJlZml4KCkge3JldHVybiBrTWF4VmVyc2lvblN0clByZWZpeDt9CisKK2Jvb2wgQ2hlY2tzdW1DYWxjdWxhdG9yOjpzZXRWZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pIHsKKyAgICBpZiAodmVyc2lvbiA+IGtNYXhWZXJzaW9uKSB7ICAvLyB1bnN1cHBvcnRlZCB2ZXJzaW9uCisgICAgICAgIExPR19DSEVDS1NVTUhFTFBFUigiJXM6IENoZWNrc3VtQ2FsY3VsYXRvciBTZXQgVW5zdXBwb3J0ZWQgdmVyc2lvbiBWZXJzaW9uICVkXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbV92ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobV9pc0VuY29kaW5nQ2hlY2tzdW0pIHsgLy8gc2V0VmVyc2lvbiBpcyBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBlbmNvZGluZyBjaGVja3N1bXMKKyAgICAgICAgTE9HX0NIRUNLU1VNSEVMUEVSKCIlczogY2FsbGVkIGJldHdlZW4gYWRkQnVmZmVyIGFuZCB3cml0ZUNoZWNrc3VtXG4iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbV92ZXJzaW9uID0gdmVyc2lvbjsKKyAgICBtX2NoZWNrc3VtU2l6ZSA9IGNoZWNrc3VtQnl0ZVNpemUodmVyc2lvbik7CisgICAgTE9HX0NIRUNLU1VNSEVMUEVSKCIlczogQ2hlY2tzdW1DYWxjdWxhdG9yIFNldCBWZXJzaW9uICVkXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbV92ZXJzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDaGVja3N1bUNhbGN1bGF0b3I6OmFkZEJ1ZmZlcihjb25zdCB2b2lkKiBidWYsIHNpemVfdCBwYWNrZXRMZW4pIHsKKyAgICBtX2lzRW5jb2RpbmdDaGVja3N1bSA9IHRydWU7CisgICAgc3dpdGNoIChtX3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbV92MUJ1ZmZlclRvdGFsTGVuZ3RoICs9IHBhY2tldExlbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYm9vbCBDaGVja3N1bUNhbGN1bGF0b3I6OndyaXRlQ2hlY2tzdW0odm9pZCogb3V0cHV0Q2hlY2tzdW0sIHNpemVfdCBvdXRwdXRDaGVja3N1bUxlbikgeworICAgIGlmIChvdXRwdXRDaGVja3N1bUxlbiA8IGNoZWNrc3VtQnl0ZVNpemUoKSkgcmV0dXJuIGZhbHNlOworICAgIGNoYXIgKmNoZWNrc3VtUHRyID0gKGNoYXIgKilvdXRwdXRDaGVja3N1bTsKKyAgICBzd2l0Y2ggKG1fdmVyc2lvbikgeworICAgICAgICBjYXNlIDE6IHsgLy8gcHJvdG9jb2wgdjEgaXMgdG8gcmV2ZXJzZSB0aGUgcGFja2V0TGVuIGFuZCB3cml0ZSBpdCBhdCB0aGUgZW5kCisgICAgICAgICAgICB1aW50MzJfdCB2YWwgPSBjb21wdXRlVjFDaGVja3N1bSgpOworICAgICAgICAgICAgbWVtY3B5KGNoZWNrc3VtUHRyLCAmdmFsLCBzaXplb2YodmFsKSk7CisgICAgICAgICAgICBtZW1jcHkoY2hlY2tzdW1QdHIrc2l6ZW9mKHZhbCksICZtX251bVdyaXRlLCBzaXplb2YobV9udW1Xcml0ZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzZXRDaGVja3N1bSgpOworICAgIG1fbnVtV3JpdGUrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDaGVja3N1bUNhbGN1bGF0b3I6OnJlc2V0Q2hlY2tzdW0oKSB7CisgICAgc3dpdGNoIChtX3ZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbV92MUJ1ZmZlclRvdGFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX2lzRW5jb2RpbmdDaGVja3N1bSA9IGZhbHNlOworfQorCitib29sIENoZWNrc3VtQ2FsY3VsYXRvcjo6dmFsaWRhdGUoY29uc3Qgdm9pZCogZXhwZWN0ZWRDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRDaGVja3N1bUxlbikgeworICAgIGNvbnN0IHNpemVfdCBjaGVja3N1bVNpemUgPSBjaGVja3N1bUJ5dGVTaXplKCk7CisgICAgaWYgKGV4cGVjdGVkQ2hlY2tzdW1MZW4gIT0gY2hlY2tzdW1TaXplKSB7CisgICAgICAgIG1fbnVtUmVhZCsrOworICAgICAgICByZXNldENoZWNrc3VtKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBpc1ZhbGlkOworICAgIHN3aXRjaCAobV92ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdmFsID0gY29tcHV0ZVYxQ2hlY2tzdW0oKTsKKyAgICAgICAgICAgIGFzc2VydChjaGVja3N1bVNpemUgPT0gc2l6ZW9mKHZhbCkgKyBzaXplb2YobV9udW1SZWFkKSk7CisgICAgICAgICAgICBpc1ZhbGlkID0gMCA9PSBtZW1jbXAoJnZhbCwgZXhwZWN0ZWRDaGVja3N1bSwgc2l6ZW9mKHZhbCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgMCA9PSBtZW1jbXAoJm1fbnVtUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZXhwZWN0ZWRDaGVja3N1bSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1fbnVtUmVhZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlzVmFsaWQgPSB0cnVlOyAgLy8gTm8gY2hlY2tzdW0gaXMgYSB2YWxpZCBjaGVja3N1bS4KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX251bVJlYWQrKzsKKyAgICByZXNldENoZWNrc3VtKCk7CisgICAgcmV0dXJuIGlzVmFsaWQ7Cit9CisKK3VpbnQzMl90IENoZWNrc3VtQ2FsY3VsYXRvcjo6Y29tcHV0ZVYxQ2hlY2tzdW0oKSBjb25zdCB7CisgICAgdWludDMyX3QgcmV2TGVuID0gbV92MUJ1ZmZlclRvdGFsTGVuZ3RoOworICAgIHJldkxlbiA9IChyZXZMZW4gJiAweGZmZmYwMDAwKSA+PiAxNiB8IChyZXZMZW4gJiAweDAwMDBmZmZmKSA8PCAxNjsKKyAgICByZXZMZW4gPSAocmV2TGVuICYgMHhmZjAwZmYwMCkgPj4gOCB8IChyZXZMZW4gJiAweDAwZmYwMGZmKSA8PCA4OworICAgIHJldkxlbiA9IChyZXZMZW4gJiAweGYwZjBmMGYwKSA+PiA0IHwgKHJldkxlbiAmIDB4MGYwZjBmMGYpIDw8IDQ7CisgICAgcmV2TGVuID0gKHJldkxlbiAmIDB4Y2NjY2NjY2MpID4+IDIgfCAocmV2TGVuICYgMHgzMzMzMzMzMykgPDwgMjsKKyAgICByZXZMZW4gPSAocmV2TGVuICYgMHhhYWFhYWFhYSkgPj4gMSB8IChyZXZMZW4gJiAweDU1NTU1NTU1KSA8PCAxOworICAgIHJldHVybiByZXZMZW47Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9DaGVja3N1bUNhbGN1bGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MyZjAxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9DaGVja3N1bUNhbGN1bGF0b3IuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLy8gU2V0IFRSQUNFX0NIRUNLU1VNSEVMUEVSIHRvIDEgdG8gZGVidWcgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgR0xwcm90b2NvbAorLy8gaW5zdGFuY2VzLgorI2RlZmluZSBUUkFDRV9DSEVDS1NVTUhFTFBFUiAwCisKKyNpZiBUUkFDRV9DSEVDS1NVTUhFTFBFUgorI2RlZmluZSBMT0dfQ0hFQ0tTVU1IRUxQRVIoeC4uLikgZnByaW50ZihzdGRlcnIsIHgpCisjZWxzZQorI2RlZmluZSBMT0dfQ0hFQ0tTVU1IRUxQRVIoeC4uLikKKyNlbmRpZgorCisvLyBDaGVja3N1bUNhbGN1bGF0b3IgYWRkcyBjaGVja3N1bSBhcyBhbiBhcnJheSBvZiBieXRlcyB0byBHTCBwaXBlIGNvbW11bmljYXRpb24sIHdoaWNoCisvLyBzaXplIGRlcGVuZHMgb24gdGhlIHByb3RvY29sIHZlcnNpb24uIEVhY2ggcGlwZSBzaG91bGQgdXNlIG9uZSBDaGVja3N1bUNhbGN1bGF0b3IuCisvLyBJdCBjYW46CisvLyAgICAgICgxKSB0YWtlIGEgbGlzdCBvZiBidWZmZXJzIG9uZSBieSBvbmUgYW5kIGNvbXB1dGUgdGhlaXIgY2hlY2tzdW0gc3RyaW5nLAorLy8gICAgICAgICAgaW4gdGhpcyBjYXNlIHRoZSBjaGVja3N1bSBzaG91bGQgYmUgYXMgdGhlIGRhdGEgaW4gdGhvc2UgYnVmZmVycyBhcmUKKy8vICAgICAgICAgIGNvbmNhdGVuYXRlZDsKKy8vICAgICAgKDIpIGNvbXB1dGUgdGhlIGNoZWNrc3VtIG9mIHRoZSBidWZmZXIgbGlzdCwgdGhlbiBlaXRoZXIgd3JpdGUgdGhlbSBpbnRvCisvLyAgICAgICAgICBhIGJ1ZmZlciBwcm92aWRlZCBieSB1c2VyLCBvciBjb21wYXJlIGl0IGFnYWluc3QgYSBjaGVja3N1bSBwcm92aWRlZAorLy8gICAgICAgICAgYnkgdXNlcgorLy8gICAgICAoMykgc3VwcG9ydCBkaWZmZXJlbnQgY2hlY2tzdW0gdmVyc2lvbiBpbiBmdXR1cmUuCisvLworLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGNoZWNrc3VtIHZlcnNpb24gMCBiZWhhdmVzIHRoZSBzYW1lIGFzIHRoZXJlIGlzCisvLyBubyBjaGVja3N1bSAoaS5lLiwgY2hlY2tzdW1CeXRlU2l6ZSByZXR1cm5zIDAsIHZhbGlkYXRlIGFsd2F5cyByZXR1cm5zIHRydWUsCisvLyBhZGRCdWZmZXIgYW5kIHdyaXRlQ2hlY2tTdW0gZG9lcyBub3RoaW5nKS4KKy8vCisvLyBOb3RpY2UgdGhhdCB0byBkZXRlY3QgcGFja2FnZSBsb3N0LCBDaGVja3N1bUNhbGN1bGF0b3IgYWxzbyBrZWVwcyB0cmFjayBvZiBob3cKKy8vIG1hbnkgdGltZXMgaXQgZ2VuZXJhdGVzL3ZhbGlkYXRlcyBjaGVja3N1bXMsIGFuZCBtaWdodCB1c2UgaXQgYXMgcGFydCBvZiB0aGUKKy8vIGNoZWNrc3VtLgorLy8KKy8vIFRvIGV2YWx1YXRlIGNoZWNrc3VtcyBmcm9tIGEgbGlzdCBvZiBkYXRhIGJ1ZmZlcnMgYnVmMSwgYnVmMi4uLiBQbGVhc2UgY2FsbAorLy8gYWRkQnVmZmVyKGJ1ZjEsIGJ1ZjFsZW4pLCBhZGRCdWZmZXIoYnVmMiwgYnVmMmxlbikgLi4uIGluIG9yZGVyLgorLy8gVGhlbiBpZiB0aGUgY2hlY2tzdW0gbmVlZHMgdG8gYmUgZW5jb2RlZCBpbnRvIGEgYnVmZmVyLCBvbmUgbmVlZHMgdG8gYWxsb2NhdGUKKy8vIGEgY2hlY2tzdW0gYnVmZmVyIHdpdGggc2l6ZSBjaGVja3N1bUJ5dGVTaXplKCksIGFuZCBjYWxsCisvLyB3cml0ZUNoZWNrc3VtKGNoZWNrc3VtQnVmZmVyKSB0byB3cml0ZSB0aGUgY2hlY2tzdW0gdG8gdGhlIGJ1ZmZlci4KKy8vIElmIHRoZSBjaGVja3N1bSBuZWVkcyB0byBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBhbiBleGlzdGluZyBvbmUsIG9uZSBuZWVkcyB0bworLy8gY2FsbCB2YWxpZGF0ZShleGlzdENoZWNrc3VtLCBleGlzdENoZWNrc3VtTGVuKS4KKy8vCisvLyBUaGUgY2hlY2tzdW0gZ2VuZXJhdG9yIGFuZCB2YWxpZGF0b3IgbXVzdCBiZSBzZXQgdG8gdGhlIHNhbWUgdmVyc2lvbiwgYW5kCisvLyB0aGUgdmFsaWRhdG9yIG11c3QgY2hlY2sgQUxMIGNoZWNrc3VtcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2VuZXJhdGVkLAorLy8gb3RoZXJ3aXNlIHRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlLgorLy8KKy8vIEl0IGlzIGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBjaGVja3N1bSB2ZXJzaW9uIGJldHdlZW4gY2FsY3VsYXRpbmcgdHdvCisvLyBjaGVja3N1bXMuIFRoaXMgaXMgZGVzaWduZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29uLgorLy8KKy8vIEV4YW1wbGUgMSwgZW5jb2RpbmcgYW5kIGRlY29kaW5nOgorLy8KKy8vIGJvb2wgdGVzdENoZWNrc3VtKHZvaWQqIGJ1Ziwgc2l6ZV90IGJ1ZkxlbikgeworLy8gICAgIC8vIGVuY29kaW5nIG1lc3NhZ2UKKy8vICAgICBDaGVja3N1bUNhbGN1bGF0b3IgZW5jb2RlcjsKKy8vICAgICBlbmNvZGVyLnNldFZlcnNpb24oMSk7CisvLyAgICAgZW5jb2Rlci5hZGRCdWZmZXIoYnVmLCBidWZMZW4pOworLy8gICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IG1lc3NhZ2UoYnVmTGVuICsgZW5jb2Rlci5jaGVja3N1bUJ5dGVTaXplKCkpOworLy8gICAgIG1lbWNweSgmbWVzc2FnZVswXSwgYnVmLCBidWZMZW4pOworLy8gICAgIGVuY29kZXIud3JpdGVDaGVja3N1bSgmbWVzc2FnZVswXSArIGJ1ZkxlbiwgZW5jb2Rlci5jaGVja3N1bUJ5dGVTaXplKCkpOworLy8KKy8vICAgICAvLyBkZWNvZGluZyBtZXNzYWdlCisvLyAgICAgQ2hlY2tzdW1DYWxjdWxhdG9yIGRlY29kZXI7CisvLyAgICAgZGVjb2Rlci5zZXRWZXJzaW9uKDEpOworLy8gICAgIGRlY29kZXIuYWRkQnVmZmVyKCZtZXNzYWdlWzBdLCBidWZMZW4pOworLy8gICAgIHJldHVybiBkZWNvZGVyLnZhbGlkYXRlKCZtZXNzYWdlWzBdICsgYnVmTGVuLCBkZWNvZGVyLmNoZWNrc3VtQnl0ZVNpemUoKSk7CisvLyB9CisvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRydWUuCisvLworLy8gRXhhbXBsZSAyLCBkZWNvZGluZyB3aWxsIGZhaWwgaWYgdGhlIG9yZGVyIG9mIG1lc3NhZ2VzIGlzIHdyb25nOgorLy8KKy8vIGJvb2wgdGVzdENoZWNrc3VtT3JkZXIodm9pZCogYnVmMSwgc2l6ZV90IGJ1ZkxlbjEsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZjIsIHNpemVfdCBidWZMZW4yKSB7CisvLyAgICAgLy8gZW5jb2RpbmcgbWVzc2FnZXMKKy8vICAgICBDaGVja3N1bUNhbGN1bGF0b3IgZW5jb2RlcjsKKy8vICAgICBlbmNvZGVyLnNldFZlcnNpb24oMSk7CisvLworLy8gICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IG1lc3NhZ2UxKGJ1ZkxlbjEgKyBlbmNvZGVyLmNoZWNrc3VtQnl0ZVNpemUoKSk7CisvLyAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gbWVzc2FnZTIoYnVmTGVuMiArIGVuY29kZXIuY2hlY2tzdW1CeXRlU2l6ZSgpKTsKKy8vCisvLyAgICAgZW5jb2Rlci5hZGRCdWZmZXIoYnVmMSwgYnVmTGVuMSk7CisvLyAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gbWVzc2FnZTEoYnVmTGVuMSArIGVuY29kZXIuY2hlY2tzdW1CeXRlU2l6ZSgpKTsKKy8vICAgICBtZW1jcHkoJm1lc3NhZ2UxWzBdLCBidWYxLCBidWZMZW4xKTsKKy8vICAgICBlbmNvZGVyLndyaXRlQ2hlY2tzdW0oJm1lc3NhZ2UxWzBdICsgYnVmTGVuMSwgZW5jb2Rlci5jaGVja3N1bUJ5dGVTaXplKCkpOworLy8KKy8vICAgICBlbmNvZGVyLmFkZEJ1ZmZlcihidWYyLCBidWZMZW4yKTsKKy8vICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBtZXNzYWdlMihidWZMZW4yICsgZW5jb2Rlci5jaGVja3N1bUJ5dGVTaXplKCkpOworLy8gICAgIG1lbWNweSgmbWVzc2FnZTJbMF0sIGJ1ZjIsIGJ1ZkxlbjIpOworLy8gICAgIGVuY29kZXIud3JpdGVDaGVja3N1bSgmbWVzc2FnZTJbMF0gKyBidWZMZW4yLCBlbmNvZGVyLmNoZWNrc3VtQnl0ZVNpemUoKSk7CisvLworLy8gICAgIC8vIGRlY29kaW5nIG1lc3NhZ2VzCisvLyAgICAgQ2hlY2tzdW1DYWxjdWxhdG9yIGRlY29kZXI7CisvLyAgICAgZGVjb2Rlci5zZXRWZXJzaW9uKDEpOworLy8gICAgIGRlY29kZXIuYWRkQnVmZmVyKCZtZXNzYWdlMlswXSwgYnVmTGVuMik7CisvLyAgICAgLy8gcmV0dXJucyBmYWxzZSBiZWNhdXNlIHRoZSBkZWNvZGluZyBvcmRlciBpcyBub3QgY29uc2lzdGVudCB3aXRoCisvLyAgICAgLy8gZW5jb2Rpbmcgb3JkZXIKKy8vICAgICBpZiAoIWRlY29kZXIudmFsaWRhdGUoJm1lc3NhZ2UyWzBdK2J1ZkxlbjIsIGRlY29kZXIuY2hlY2tzdW1CeXRlU2l6ZSgpKSkgeworLy8gICAgICAgICByZXR1cm4gZmFsc2U7CisvLyAgICAgfQorLy8KKy8vICAgICBkZWNvZGVyLmFkZEJ1ZmZlcigmbWVzc2FnZTFbMF0sIGJ1ZkxlbjEpOworLy8gICAgIGlmICghZGVjb2Rlci52YWxpZGF0ZSgmbWVzc2FnZTFbMF0rYnVmTGVuMSwgZGVjb2Rlci5jaGVja3N1bUJ5dGVTaXplKCkpKSB7CisvLyAgICAgICAgIHJldHVybiBmYWxzZTsKKy8vICAgICB9CisvLworLy8gICAgIHJldHVybiBmYWxzZTsKKy8vIH0KKworY2xhc3MgQ2hlY2tzdW1DYWxjdWxhdG9yIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Q2hlY2tzdW1MZW5ndGggPSA4OworCisgICAgLy8gR2V0IGFuZCBzZXQgY3VycmVudCBjaGVja3N1bSB2ZXJzaW9uCisgICAgdWludDMyX3QgZ2V0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fdmVyc2lvbjsgfQorICAgIC8vIENhbGwgc2V0VmVyc2lvbiB0byBzZXQgYSBjaGVja3N1bSB2ZXJzaW9uLiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQorICAgIC8vIGFkZEJ1ZmZlcigpLCB3cml0ZUNoZWNrc3VtKCkgYW5kIHZhbGlkYXRlKCkuIEFuZCBpdCBzaG91bGQgYmUgY2FsbGVkCisgICAgLy8gZXhhY3Qgb25jZSBwZXIgcmVuZGVyaW5nIHRocmVhZCBpZiBib3RoIGhvc3QgYW5kIGd1ZXN0IHN1cHBvcnQgY2hlY2tzdW0uCisgICAgLy8gSXQgd29uJ3QgYmUgY2FsbGVkIGlmIGVpdGhlciBob3N0IG9yIGd1ZXN0IGRvZXMgbm90IHN1cHBvcnQgY2hlY2tzdW0uCisgICAgYm9vbCBzZXRWZXJzaW9uKHVpbnQzMl90IHZlcnNpb24pOworCisgICAgLy8gTWF4aW11bSBzdXBwb3J0ZWQgY2hlY2tzdW0gdmVyc2lvbgorICAgIHN0YXRpYyB1aW50MzJfdCBnZXRNYXhWZXJzaW9uKCk7CisgICAgLy8gQSB2ZXJzaW9uIHN0cmluZyB0aGF0IGxvb2tzIGxpa2UgIkFORFJPSURfRU1VX0NIRUNLU1VNX0hFTFBFUl92MSIKKyAgICAvLyBVc2VkIG11bHRpcGxlIHRpbWVzIHdoZW4gdGhlIGd1ZXN0IHF1ZXJpZXMgdGhlIG1heGltdW0gc3VwcG9ydGVkIHZlcnNpb24KKyAgICAvLyBmcm9tIHRoZSBob3N0LgorICAgIC8vIFRoZSBsaWJyYXJ5IG93bnMgdGhlIHJldHVybmVkIHBvaW50ZXIuIFRoZSByZXR1cm5lZCBwb2ludGVyIHdpbGwgYmUKKyAgICAvLyBkZWNvbnN0cnVjdGVkIHdoZW4gdW5sb2FkaW5nIGxpYnJhcnkuCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE1heFZlcnNpb25TdHIoKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TWF4VmVyc2lvblN0clByZWZpeCgpOworCisgICAgLy8gU2l6ZSBvZiBjaGVja3N1bSBpbiB0aGUgY3VycmVudCB2ZXJzaW9uCisgICAgc2l6ZV90IGNoZWNrc3VtQnl0ZVNpemUoKSBjb25zdCB7IHJldHVybiBtX2NoZWNrc3VtU2l6ZTsgfQorCisgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IGNoZWNrc3VtIHZhbHVlIGZyb20gdGhlIGRhdGEKKyAgICAvLyBhdCB8YnVmfCBvZiB8YnVmTGVufCBieXRlcy4gT25jZSBhbGwgYnVmZmVycworICAgIC8vIGhhdmUgYmVlbiBhZGRlZCwgY2FsbCB3cml0ZUNoZWNrc3VtKCkgdG8gc3RvcmUKKyAgICAvLyB0aGUgZmluYWwgY2hlY2tzdW0gdmFsdWUgYW5kIHJlc2V0IGl0cyBzdGF0ZS4KKyAgICB2b2lkIGFkZEJ1ZmZlcihjb25zdCB2b2lkKiBidWYsIHNpemVfdCBidWZMZW4pOworICAgIC8vIFdyaXRlIHRoZSBjaGVja3N1bSBmcm9tIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdG8gb3V0cHV0Q2hlY2tzdW0KKyAgICAvLyBXaWxsIHJlc2V0IHRoZSBsaXN0IG9mIGJ1ZmZlcnMgYnkgY2FsbGluZyByZXNldENoZWNrc3VtLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiB0aGUgYnVmZmVyIGlzIG5vdCBsb25nIGVub3VnaAorICAgIC8vIFBsZWFzZSBxdWVyeSBidWZmZXIgc2l6ZSBmcm9tIGNoZWNrc3VtQnl0ZVNpemUoKQorICAgIGJvb2wgd3JpdGVDaGVja3N1bSh2b2lkKiBvdXRwdXRDaGVja3N1bSwgc2l6ZV90IG91dHB1dENoZWNrc3VtTGVuKTsKKyAgICAvLyBSZXN0b3JlIHRoZSBzdGF0ZXMgZm9yIGNvbXB1dGluZyBjaGVja3N1bXMuCisgICAgLy8gQXV0b21hdGljYWxseSBjYWxsZWQgYXQgdGhlIGVuZCBvZiB3cml0ZUNoZWNrc3VtIGFuZCB2YWxpZGF0ZS4KKyAgICAvLyBDYW4gYWxzbyBiZSB1c2VkIHRvIGFiYW5kb24gdGhlIGN1cnJlbnQgY2hlY2tzdW0gYmVpbmcgY2FsY3VsYXRlZC4KKyAgICAvLyBOb3RlczogaXQgZG9lc24ndCB1cGRhdGUgdGhlIGludGVybmFsIHJlYWQgLyB3cml0ZSBjb3VudGVyCisgICAgdm9pZCByZXNldENoZWNrc3VtKCk7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZyb20gdGhlIGxpc3Qgb2YgYnVmZmVycyBhbmQKKyAgICAvLyBjb21wYXJlIGl0IHdpdGggdGhlIGNoZWNrc3VtIGVuY29kZWQgaW4gZXhwZWN0ZWRDaGVja3N1bQorICAgIC8vIFdpbGwgcmVzZXQgdGhlIGxpc3Qgb2YgYnVmZmVycyBieSBjYWxsaW5nIHJlc2V0Q2hlY2tzdW0uCisgICAgYm9vbCB2YWxpZGF0ZShjb25zdCB2b2lkKiBleHBlY3RlZENoZWNrc3VtLCBzaXplX3QgZXhwZWN0ZWRDaGVja3N1bUxlbik7CisKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrVmVyc2lvbjFDaGVja3N1bVNpemUgPSA4OyAgLy8gMiB4IHVpbnQzMl90CisKKyAgICBzdGF0aWNfYXNzZXJ0KGtWZXJzaW9uMUNoZWNrc3VtU2l6ZSA8PSBrTWF4Q2hlY2tzdW1MZW5ndGgsCisgICAgICAgICAgICAgICAgICAiSW52YWxpZCBDaGVja3N1bUNhbGN1bGF0b3I6OmtNYXhDaGVja3N1bUxlbmd0aCB2YWx1ZSIpOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgY2hlY2tzdW1CeXRlU2l6ZSh1aW50MzJfdCB2ZXJzaW9uKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uID09IDEgPyBrVmVyc2lvbjFDaGVja3N1bVNpemUgOiAwOworICAgIH0KKworICAgIHVpbnQzMl90IG1fdmVyc2lvbiA9IDA7CisgICAgdWludDMyX3QgbV9jaGVja3N1bVNpemUgPSBjaGVja3N1bUJ5dGVTaXplKDApOworICAgIC8vIEEgdGVtcG9yYXJ5IHN0YXRlIHVzZWQgdG8gY29tcHV0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIGEgbGlzdCBvZiBidWZmZXJzLAorICAgIC8vIGlmIGFkZEJ1ZmZlciBpcyBjYWxsZWQuCisgICAgdWludDMyX3QgbV9udW1SZWFkID0gMDsKKyAgICB1aW50MzJfdCBtX251bVdyaXRlID0gMDsKKyAgICAvLyBtX2lzRW5jb2RpbmdDaGVja3N1bSBpcyB0cnVlIHdoZW4gYmV0d2VlbiBhZGRCdWZmZXIgYW5kIHdyaXRlQ2hlY2tzdW0KKyAgICBib29sIG1faXNFbmNvZGluZ0NoZWNrc3VtID0gZmFsc2U7Citwcml2YXRlOgorICAgIC8vIENvbXB1dGUgYSAzMmJpdCBjaGVja3N1bQorICAgIC8vIFVzZWQgaW4gcHJvdG9jb2wgdjEKKyAgICB1aW50MzJfdCBjb21wdXRlVjFDaGVja3N1bSgpIGNvbnN0OworICAgIC8vIFRoZSBidWZmZXIgdXNlZCBpbiBwcm90b2NvbCB2ZXJzaW9uIDEgdG8gY29tcHV0ZSBjaGVja3N1bS4KKyAgICB1aW50MzJfdCBtX3YxQnVmZmVyVG90YWxMZW5ndGggPSAwOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mby5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWUxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8uY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvLmgiCisKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuaCIKKyNpbmNsdWRlICJlbXVnbC9jb21tb24vbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImVtdWdsL2NvbW1vbi90aHJlYWRfc3RvcmUuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgeworCitjbGFzcyBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRTdG9yZSA6IHB1YmxpYyA6OmVtdWdsOjpUaHJlYWRTdG9yZSB7CitwdWJsaWM6CisgICAgQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkU3RvcmUoKSA6IDo6ZW11Z2w6OlRocmVhZFN0b3JlKG51bGxwdHIpIHt9Cit9OworCisjaWZkZWYgVFJBQ0VfQ0hFQ0tTVU1IRUxQRVIKK3N0ZDo6YXRvbWljPHNpemVfdD4gc051bUluc3RhbmNlcygwKTsKKyNlbmRpZiAgLy8gVFJBQ0VfQ0hFQ0tTVU1IRUxQRVIKK30KKworc3RhdGljIDo6ZW11Z2w6OkxhenlJbnN0YW5jZTxDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRTdG9yZT4gc190bHMgPQorICAgICAgICBMQVpZX0lOU1RBTkNFX0lOSVQ7CisKK3N0YXRpYyBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvKiBnZXRDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvKj4oc190bHMtPmdldCgpKTsKK30KKworQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbzo6Q2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbygpIHsKKyAgICBMT0dfQ0hFQ0tTVU1IRUxQRVIoIiVzOiBDaGVja3N1bSB0aHJlYWQgY3JlYXRlZCAoJXUgaW5zdGFuY2VzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQgaW50KSgrK3NOdW1JbnN0YW5jZXMpKTsKKyAgICBzX3Rscy0+c2V0KHRoaXMpOworfQorCitDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvOjp+Q2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbygpIHsKKyAgICBMT0dfQ0hFQ0tTVU1IRUxQRVIoIiVzOiBHTHByb3RvY29sIGRlc3Ryb3llZCAoJXUgaW5zdGFuY2VzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQgaW50KSgtLXNOdW1JbnN0YW5jZXMpKTsKKyAgICBzX3Rscy0+c2V0KG51bGxwdHIpOworfQorCitDaGVja3N1bUNhbGN1bGF0b3ImIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OmdldCgpIHsKKyAgICByZXR1cm4gZ2V0Q2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbygpLT5tX3Byb3RvY29sOworfQorCitib29sIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnNldFZlcnNpb24odWludDMyX3QgdmVyc2lvbikgeworICAgIHJldHVybiBnZXRDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvKCktPm1fcHJvdG9jb2wuc2V0VmVyc2lvbih2ZXJzaW9uKTsKK30KKworYm9vbCBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvOjp3cml0ZUNoZWNrc3VtKENoZWNrc3VtQ2FsY3VsYXRvciogY2FsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXRDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0cHV0Q2hlY2tzdW1MZW4pIHsKKyAgICBjYWxjLT5hZGRCdWZmZXIoYnVmLCBidWZMZW4pOworICAgIHJldHVybiBjYWxjLT53cml0ZUNoZWNrc3VtKG91dHB1dENoZWNrc3VtLCBvdXRwdXRDaGVja3N1bUxlbik7Cit9CisKK2Jvb2wgQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbzo6dmFsaWRhdGUoQ2hlY2tzdW1DYWxjdWxhdG9yKiBjYWxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY2hlY2tzdW1MZW4pIHsKKyAgICBjYWxjLT5hZGRCdWZmZXIoYnVmLCBidWZMZW4pOworICAgIHJldHVybiBjYWxjLT52YWxpZGF0ZShjaGVja3N1bSwgY2hlY2tzdW1MZW4pOworfQorCit2b2lkIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm86OnZhbGlkT3JEaWUoQ2hlY2tzdW1DYWxjdWxhdG9yKiBjYWxjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGVja3N1bUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtZXNzYWdlKSB7CisgICAgaWYgKCF2YWxpZGF0ZShjYWxjLCBidWYsIGJ1ZkxlbiwgY2hlY2tzdW0sIGNoZWNrc3VtTGVuKSkgeworICAgICAgICBlbXVnbF9jcmFzaF9yZXBvcnRlcihtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8uaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vQ2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0NoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8uaApAQCAtMCwwICsxLDYwIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkNoZWNrc3VtQ2FsY3VsYXRvci5oIgorCisvLyBDaGVja3N1bUNhbGN1bGF0b3JUaHJlYWRJbmZvIGlzIHRoZSBjbGFzcyB0aGF0IG1ha2VzIENoZWNrc3VtQ2FsY3VsYXRvcgorLy8gdGhyZWFkLXNhZmUuIE9uIHRoZSBob3N0LCBwbGVhc2Ugb25seSB1c2UgQ2hlY2tzdW1DYWxjdWxhdG9yIHRocm91Z2ggdGhpcworLy8gY2xhc3MuCisKK2NsYXNzIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8geworcHVibGljOgorICAgIENoZWNrc3VtQ2FsY3VsYXRvclRocmVhZEluZm8oKTsKKyAgICB+Q2hlY2tzdW1DYWxjdWxhdG9yVGhyZWFkSW5mbygpOworCisgICAgQ2hlY2tzdW1DYWxjdWxhdG9yJiBnZXQoKTsKKworICAgIHN0YXRpYyBib29sIHNldFZlcnNpb24odWludDMyX3QgdmVyc2lvbik7CisKKyAgICBzdGF0aWMgdWludDMyX3QgZ2V0TWF4VmVyc2lvbigpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRNYXhWZXJzaW9uU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gQ2hlY2tzdW1DYWxjdWxhdG9yOjpnZXRNYXhWZXJzaW9uU3RyKCk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgd3JpdGVDaGVja3N1bShDaGVja3N1bUNhbGN1bGF0b3IqIGNhbGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0cHV0Q2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0cHV0Q2hlY2tzdW1MZW4pOworCisgICAgc3RhdGljIGJvb2wgdmFsaWRhdGUoQ2hlY2tzdW1DYWxjdWxhdG9yKiBjYWxjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGVja3N1bUxlbik7CisKKyAgICBzdGF0aWMgdm9pZCB2YWxpZE9yRGllKENoZWNrc3VtQ2FsY3VsYXRvciogY2FsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjaGVja3N1bUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lc3NhZ2UpOworCitwcml2YXRlOgorICAgIENoZWNrc3VtQ2FsY3VsYXRvciBtX3Byb3RvY29sOworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vRXJyb3JMb2cuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vRXJyb3JMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FkNjFmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9FcnJvckxvZy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisjaWZuZGVmIF9FUlJPUl9MT0dfSF8KKyNkZWZpbmUgX0VSUk9SX0xPR19IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgRVJSKC4uLikgICAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKQorI2lmZGVmIEVNVUdMX0RFQlVHCisjICAgIGRlZmluZSBEQkcoLi4uKSAgICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCisjZWxzZQorIyAgICBkZWZpbmUgREJHKC4uLikgICAgKCh2b2lkKTApCisjZW5kaWYKKworI2VuZGlmICAvLyBfRVJST1JfTE9HX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0dMRGVjb2RlckNvbnRleHREYXRhLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL0dMRGVjb2RlckNvbnRleHREYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhOWUyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vR0xEZWNvZGVyQ29udGV4dERhdGEuaApAQCAtMCwwICsxLDcyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIENvbnZlbmllbnQgY2xhc3MgdXNlZCB0byBob2xkIHRoZSBjb21tb24gY29udGV4dCBkYXRhIHNoYXJlZAorLy8gYnkgYm90aCB0aGUgR0xFU3YxIGFuZCBHTEVTdjIgZGVjb2RlcnMuIFRoaXMgY29ycmVzcG9uZHMgdG8KKy8vIHZlcnRleCBhdHRyaWJ1dGUgYnVmZmVycy4KK2NsYXNzICBHTERlY29kZXJDb250ZXh0RGF0YSB7CitwdWJsaWM6CisgICAgLy8gTGlzdCBvZiBzdXBwb3J0ZWQgdmVydGV4IGF0dHJpYnV0ZSBpbmRpY2VzLCBhcyB0aGV5IGFwcGVhciBpbgorICAgIC8vIGEgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKCkgY2FsbC4KKyAgICBlbnVtIFBvaW50ZXJEYXRhTG9jYXRpb24geworICAgICAgICBWRVJURVhfTE9DQVRJT04gPSAwLAorICAgICAgICBOT1JNQUxfTE9DQVRJT04gPSAxLAorICAgICAgICBDT0xPUl9MT0NBVElPTiA9IDIsCisgICAgICAgIFBPSU5UU0laRV9MT0NBVElPTiA9IDMsCisgICAgICAgIFRFWENPT1JEMF9MT0NBVElPTiA9IDQsCisgICAgICAgIFRFWENPT1JEMV9MT0NBVElPTiA9IDUsCisgICAgICAgIFRFWENPT1JEMl9MT0NBVElPTiA9IDYsCisgICAgICAgIFRFWENPT1JEM19MT0NBVElPTiA9IDcsCisgICAgICAgIFRFWENPT1JENF9MT0NBVElPTiA9IDgsCisgICAgICAgIFRFWENPT1JENV9MT0NBVElPTiA9IDksCisgICAgICAgIFRFWENPT1JENl9MT0NBVElPTiA9IDEwLAorICAgICAgICBURVhDT09SRDdfTE9DQVRJT04gPSAxMSwKKyAgICAgICAgTUFUUklYSU5ERVhfTE9DQVRJT04gPSAxMiwKKyAgICAgICAgV0VJR0hUX0xPQ0FUSU9OID0gMTMsCisgICAgICAgIExBU1RfTE9DQVRJT04gPSAxNAorICAgIH07CisKKyAgICAvLyBTdG9yZSB8bGVufCBieXRlcyBmcm9tIHxkYXRhfCBpbnRvIHRoZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoCisgICAgLy8gdmVydGV4IGF0dHJpYnV0ZSBpbmRleCB8bG9jfC4KKyAgICB2b2lkIHN0b3JlUG9pbnRlckRhdGEodW5zaWduZWQgaW50IGxvYywgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgeworICAgICAgICBpZiAobG9jIDwgbVBvaW50ZXJEYXRhLnNpemUoKSkgeworICAgICAgICAgICAgYXV0byYgcHRyRGF0YSA9IG1Qb2ludGVyRGF0YVtsb2NdOworICAgICAgICAgICAgcHRyRGF0YS5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhKSArIGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2VyIGVycm9yLCBkb24ndCBkbyBhbnl0aGluZyBoZXJlCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4gcG9pbnRlciB0byBkYXRhIGFzc29jaWF0ZWQgd2l0aCB2ZXJ0ZXggYXR0cmlidXRlIGluZGV4IHxsb2N8CisgICAgdm9pZCogcG9pbnRlckRhdGEodW5zaWduZWQgaW50IGxvYykgY29uc3QgeworICAgICAgICBpZiAobG9jIDwgbVBvaW50ZXJEYXRhLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhcio+KG1Qb2ludGVyRGF0YVtsb2NdLmRhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVc2VyIGVycm9yLiBSZXR1cm4gbnVsbHB0ci4KKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdCBpbnQga01heFZlcnRleEF0dHJpYnV0ZXMgPSA2NDsKKworICAgIHN0ZDo6YXJyYXk8c3RkOjp2ZWN0b3I8Y2hhcj4sIGtNYXhWZXJ0ZXhBdHRyaWJ1dGVzPiBtUG9pbnRlckRhdGEgPSB7fTsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL01ha2VmaWxlIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGJmNDMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACisKK1JPT1Q9Li4vLi4KKworaW5jbHVkZSAkKFJPT1QpL21ha2UvY29tbW9uZGVmcworCitDWFhGSUxFUyA9IFRjcFN0cmVhbS5jcHAgR0xDbGllbnRTdGF0ZS5jcHAgZ2xVdGlscy5jcHAKK0NYWElOQ1MgKz0gLUkkKFJPT1QpL2xpYnMvR0xFU3YxIC1JJChST09UKS9pbmNsdWRlCisKK0xJQlJBUllfTkFNRSA9IGxpYmNvZGVjQ29tbW9uLmEKKworaW5jbHVkZSAkKENPTU1PTlJVTEVTKQorCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vUHJvdG9jb2xVdGlscy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9Qcm90b2NvbFV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzMjNjOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vUHJvdG9jb2xVdGlscy5oCkBAIC0wLDAgKzEsMTc5IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCituYW1lc3BhY2UgZW11Z2wgeworCisvLyBBIGhlbHBlciB0ZW1wbGF0ZSB0byBleHRyYWN0IHZhbHVlcyBmb3JtIHRoZSB3aXJlIHByb3RvY29sIHN0cmVhbQorLy8gYW5kIGNvbnZlcnQgdGhlbSB0byBhcHByb3ByaWF0ZSBob3N0IHZhbHVlcy4KKy8vCisvLyBUaGUgd2lyZSBwcm90b2NvbCB1c2VzIDMyLWJpdCBleGNsdXNpdmVseSB3aGVuIHRyYW5zZmVycmluZworLy8gR0xpbnRwdHIgb3IgR0xzaXplaSB2YWx1ZXMsIGFzIHdlbGwgYXMgb3BhcXVlIGhhbmRsZXMgbGlrZSBHTGVnbEltYWdlLAorLy8gZnJvbSB0aGUgZ3Vlc3QgKGV2ZW4gd2hlbiB0aGUgZ3Vlc3QgaXMgNjQtYml0KS4KKy8vCisvLyBUaGUgY29ycmVzcG9uZGluZyBob3N0IGRlZmluaXRpb25zIGRlcGVuZCBvbiB0aGUgaG9zdCBiaXRuZXNzLiBGb3IKKy8vIGV4YW1wbGUsIEdMaW50cHRyIGlzIDY0LWJpdCBvbiBsaW51eC14ODZfNjQuIFRoZSBmb2xsb3dpbmcgaXMgYSBzZXQKKy8vIG9mIHRlbXBsYXRlcyB0aGF0IGNhbiBzaW1wbGlmeSB0aGUgY29udmVyc2lvbiBvZiBwcm90b2NvbCB2YWx1ZXMKKy8vIGludG8gaG9zdCBvbmVzLgorLy8KKy8vIFRoZSBtb3N0IGltcG9ydGFudCBvbmUgaXM6CisvLworLy8gICAgIHVucGFjazxIT1NUX1RZUEUsU0laRV9UWVBFPihjb25zdCB2b2lkKiBwdHIpCisvLworLy8gV2hpY2ggcmVhZHMgYnl0ZXMgZnJvbSB8cHRyfCwgdXNpbmcgfFNJWkVfVFlQRXwgYXMgdGhlIHVuZGVybHlpbmcKKy8vIHNpemVkLWludGVnZXIgc3BlY2lmaWVyIChlLmcuICd1aW50MzJfdCcpLCBhbmQgY29udmVydGluZyB0aGUgcmVzdWx0CisvLyBpbnRvIGEgfEhPU1RfVFlQRXwgdmFsdWUuIEZvciBleGFtcGxlOgorLy8KKy8vICAgICB1bnBhY2s8RUdMSW1hZ2UsdWludDMyX3Q+KHB0ciArIDEyKTsKKy8vCisvLyB3aWxsIHJlYWQgYSA0LWJ5dGUgdmFsdWUgZnJvbSB8cHRyICsgMTJ8IGFuZCBjb252ZXJ0IGl0IGludG8KKy8vIGFuIEVHTEltYWdlLCB3aGljaCBpcyBhIGhvc3Qgdm9pZCouIFRoZSB0ZW1wbGF0ZSBkZXRlY3RzIGhvc3QKKy8vIHBvaW50ZXIgdHlwZXMgdG8gcGVyZm9ybSBwcm9wZXIgdHlwZSBjYXN0aW5nLgorLy8KKy8vIFRPRE8oZGlnaXQpOiBBZGQgY3VzdG9tIHVucGFja2VycyB0byBoYW5kbGUgZ2VuZXJpYyBvcGFxdWUgdm9pZCogdmFsdWVzLgorLy8gICAgICAgICAgICAgIGFuZCBtYXAgdGhlbSB0byB1bmlxdWUgMzItYml0IHZhbHVlcy4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitzdHJ1Y3QgVW5wYWNrZXJUIHsKKyAgICBzdGF0aWMgVCB1bnBhY2soY29uc3Qgdm9pZCogcHRyKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID09IHNpemVvZihTKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQmFkIGlucHV0IGFyZ3VtZW50cywgaGF2ZSB0byBiZSBvZiB0aGUgc2FtZSBzaXplIik7CisgICAgICAgIHJldHVybiAqKGNvbnN0IFQqKXB0cjsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK3N0cnVjdCBVbnBhY2tlclQ8VCosIFM+IHsKKyAgICBzdGF0aWMgVCogdW5wYWNrKGNvbnN0IHZvaWQqIHB0cikgeworICAgICAgICByZXR1cm4gKFQqKSh1aW50cHRyX3QpKCooY29uc3QgUyopcHRyKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFVucGFja2VyVDxzc2l6ZV90LCB1aW50MzJfdD4geworICAgIHN0YXRpYyBzc2l6ZV90IHVucGFjayhjb25zdCB2b2lkKiBwdHIpIHsKKyAgICAgICAgcmV0dXJuIChzc2l6ZV90KSooY29uc3QgaW50MzJfdCopcHRyOworICAgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBTPgoraW5saW5lIFQgVW5wYWNrKGNvbnN0IHZvaWQqIHB0cikgeworICAgIHJldHVybiBVbnBhY2tlclQ8VCwgUz46OnVucGFjayhwdHIpOworfQorCisvLyBIZWxwZXIgY2xhc3NlcyBHZW5lcmljSW5wdXRCdWZmZXIgYW5kIEdlbmVyaWNPdXRwdXRCdWZmZXIgdXNlZCB0byBlbnN1cmUKKy8vIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBwYXNzZWQgdG8gRUdML0dMIGZ1bmN0aW9ucyBhcmUgcHJvcGVybHkgYWxpZ25lZAorLy8gKHByZXZlbnRpbmcgY3Jhc2hlcyB3aXRoIHNvbWUgYmFja2VuZHMpLgorLy8KKy8vIFVzYWdlIGV4YW1wbGU6CisvLworLy8gICAgR2VuZXJpY0lucHV0QnVmZmVyPD4gaW5wdXRCdWZmZXIocHRySW4sIHNpemVJbik7CisvLyAgICBHZW5lcmljT3V0cHV0QnVmZmVyPD4gb3V0cHV0QnVmZmVyKHB0ck91dCwgc2l6ZU91dCk7CisvLyAgICBnbERvR2V0U3R1ZmYoaW5wdXRCdWZmZXIuZ2V0KCksIG91dHB1dEJ1ZmZlci5nZXQoKSk7CisvLyAgICBvdXRwdXRCdWZmZXIuZmx1c2goKTsKKy8vCisvLyBnZXQoKSB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgfHB0cnwgaWYgaXQgd2FzIGFsaWduZWQgb24gdGhlCisvLyBjb25maWd1cmVkIGJvdW5kYXJ5ICg4IGJ5dGVzIGJ5IGRlZmF1bHQpLiBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZQorLy8gYWRkcmVzcyBvZiBhbiBhbGlnbmVkIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHxzaXplfCBieXRlcyBzdGFydGluZyBmcm9tIHxwdHJ8LgorLy8KKy8vIEFsbG93ZWQgYWxpZ25tZW50IHZhbHVlcyBhcmUgMSwgMiwgNCwgOC4KKy8vCisvLyBvdXRwdXRCdWZmZXIuZmx1c2goKSBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGNvcHkgYmFjayB0byB8cHRyfCBleHBsaWN0bHksCisvLyBpZiBuZWVkZWQuIEl0IGlzIGEgbm8tb3AgaWYgfHB0cnwgd2FzIGFsaWduZWQuCisvLworLy8gQm90aCBjbGFzc2VzIHRyeSB0byBtaW5pbWl6ZSBoZWFwIHVzYWdlIGFzIG11Y2ggYXMgcG9zc2libGUgLSB0aGUgZmlyc3QKKy8vIHRlbXBsYXRlIGFyZ3VtZW50IGRlZmluZXMgdGhlIHNpemUgb2YgYW4gaW50ZXJuYWwgYXJyYXkgR2VuZXJpYypCdWZmZXItcyB1c2UKKy8vIGlmIHRoZSB8cHRyfCdzIHxzaXplfCBpcyBzbWFsbCBlbm91Z2guIElmIGl0IGRvZXNuJ3QgZml0IGludG8gdGhlIGludGVybmFsCisvLyBhcnJheSwgYW4gYWxpZ25lZCBjb3B5IGlzIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCBhbmQgZnJlZWQgaW4gdGhlIGR0b3IuCisKK3RlbXBsYXRlIDxzaXplX3QgU3RhY2tTaXplID0gMTAyNCwgc2l6ZV90IEFsaWduID0gOD4KK2NsYXNzIEdlbmVyaWNJbnB1dEJ1ZmZlciB7CisgICAgc3RhdGljX2Fzc2VydChBbGlnbiA9PSAxIHx8IEFsaWduID09IDIgfHwgQWxpZ24gPT0gNCB8fCBBbGlnbiA9PSA4LAorICAgICAgICAgICAgICAgICAgIkJhZCBhbGlnbm1lbnQgcGFyYW1ldGVyIik7CisKK3B1YmxpYzoKKyAgICBHZW5lcmljSW5wdXRCdWZmZXIoY29uc3Qgdm9pZCogaW5wdXQsIHNpemVfdCBzaXplKSA6IG1PcmlnQnVmZihpbnB1dCkgeworICAgICAgICBpZiAoKCh1aW50cHRyX3QpaW5wdXQgJiAoQWxpZ24gLSAxVSkpID09IDApIHsKKyAgICAgICAgICAgIG1QdHIgPSBjb25zdF9jYXN0PHZvaWQqPihpbnB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8PSBTdGFja1NpemUpIHsKKyAgICAgICAgICAgICAgICBtUHRyID0gJm1BcnJheVswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVB0ciA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShtUHRyLCBpbnB1dCwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+R2VuZXJpY0lucHV0QnVmZmVyKCkgeworICAgICAgICBpZiAobVB0ciAhPSBtT3JpZ0J1ZmYgJiYgbVB0ciAhPSAmbUFycmF5WzBdKSB7CisgICAgICAgICAgICBmcmVlKG1QdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZ2V0KCkgY29uc3QgeyByZXR1cm4gbVB0cjsgfQorCitwcml2YXRlOgorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgYWxpZ25lZCBidWZmZXIsIG1pZ2h0IHBvaW50IGVpdGhlciB0byBtT3JnQnVmLCB0byBtQXJyYXkKKyAgICAvLyBzdGFydCBvciB0byBhIGhlYXAtYWxsb2NhdGVkIGNodW5rIG9mIGRhdGEuCisgICAgdm9pZCogbVB0cjsKKyAgICAvLyBPcmlnaW5hbCBidWZmZXIuCisgICAgY29uc3Qgdm9pZCogbU9yaWdCdWZmOworICAgIC8vIElucGxhY2UgYWxpZ25lZCBhcnJheSBmb3Igc21hbGwgZW5vdWdoIGJ1ZmZlcnMuCisgICAgY2hhciBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhBbGlnbikpKSBtQXJyYXlbU3RhY2tTaXplXTsKK307CisKK3RlbXBsYXRlIDxzaXplX3QgU3RhY2tTaXplID0gMTAyNCwgc2l6ZV90IEFsaWduID0gOD4KK2NsYXNzIEdlbmVyaWNPdXRwdXRCdWZmZXIgeworICAgIHN0YXRpY19hc3NlcnQoQWxpZ24gPT0gMSB8fCBBbGlnbiA9PSAyIHx8IEFsaWduID09IDQgfHwgQWxpZ24gPT0gOCwKKyAgICAgICAgICAgICAgICAgICJCYWQgYWxpZ25tZW50IHBhcmFtZXRlciIpOworCitwdWJsaWM6CisgICAgR2VuZXJpY091dHB1dEJ1ZmZlcih1bnNpZ25lZCBjaGFyKiBwdHIsIHNpemVfdCBzaXplKSA6CisgICAgICAgICAgICBtT3JpZ0J1ZmYocHRyKSwgbVNpemUoc2l6ZSkgeworICAgICAgICBpZiAoKCh1aW50cHRyX3QpcHRyICYgKEFsaWduIC0gMVUpKSA9PSAwKSB7CisgICAgICAgICAgICBtUHRyID0gcHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNpemUgPD0gU3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgbVB0ciA9ICZtQXJyYXlbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QdHIgPSBjYWxsb2MoMSwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB+R2VuZXJpY091dHB1dEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1QdHIgIT0gbU9yaWdCdWZmICYmIG1QdHIgIT0gJm1BcnJheVswXSkgeworICAgICAgICAgICAgZnJlZShtUHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIG1QdHI7IH0KKworICAgIHZvaWQgZmx1c2goKSB7CisgICAgICAgIGlmIChtUHRyICE9IG1PcmlnQnVmZikgeworICAgICAgICAgICAgbWVtY3B5KG1PcmlnQnVmZiwgbVB0ciwgbVNpemUpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIEEgcG9pbnRlciB0byB0aGUgYWxpZ25lZCBidWZmZXIsIG1pZ2h0IHBvaW50IGVpdGhlciB0byBtT3JnQnVmLCB0byBtQXJyYXkKKyAgICAvLyBzdGFydCBvciB0byBhIGhlYXAtYWxsb2NhdGVkIGNodW5rIG9mIGRhdGEuCisgICAgdm9pZCogbVB0cjsKKyAgICAvLyBPcmlnaW5hbCBidWZmZXIuCisgICAgdW5zaWduZWQgY2hhciogbU9yaWdCdWZmOworICAgIC8vIE9yaWdpbmFsIGJ1ZmZlciBzaXplLgorICAgIHNpemVfdCBtU2l6ZTsKKyAgICAvLyBJbnBsYWNlIGFycmF5IGZvciBzbWFsbCBlbm91Z2ggYnVmZmVycy4KKyAgICB1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKEFsaWduKSkpIG1BcnJheVtTdGFja1NpemVdOworfTsKKworLy8gUGluIHRoZSBkZWZhdWx0cyBmb3IgdGhlIGNvbW1vbmx5IHVzZWQgdHlwZSBuYW1lcwordXNpbmcgSW5wdXRCdWZmZXIgPSBHZW5lcmljSW5wdXRCdWZmZXI8PjsKK3VzaW5nIE91dHB1dEJ1ZmZlciA9IEdlbmVyaWNPdXRwdXRCdWZmZXI8PjsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL2dsVXRpbHMuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9nbFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU4MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9PcGVuZ2xDb2RlY0NvbW1vbi9nbFV0aWxzLmNwcApAQCAtMCwwICsxLDQxNiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKyNpbmNsdWRlICJnbFV0aWxzLmgiCisKKyNpbmNsdWRlICJFcnJvckxvZy5oIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3NpemVfdCBnbFNpemVvZihHTGVudW0gdHlwZSkKK3sKKyAgICBzaXplX3QgcmV0dmFsID0gMDsKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgR0xfQllURToKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgIHJldHZhbCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICBjYXNlIEdMX0hBTEZfRkxPQVRfT0VTOgorICAgICAgICByZXR2YWwgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0lOVDoKKyAgICBjYXNlIEdMX0ZMT0FUOgorICAgIGNhc2UgR0xfRklYRUQ6CisgICAgY2FzZSBHTF9CT09MOgorICAgICAgICByZXR2YWwgPSAgNDsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgR0xfRE9VQkxFCisgICAgY2FzZSBHTF9ET1VCTEU6CisgICAgICAgIHJldHZhbCA9IDg7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBHTF9GTE9BVF9WRUMyOgorICAgIGNhc2UgR0xfSU5UX1ZFQzI6CisgICAgY2FzZSBHTF9CT09MX1ZFQzI6CisgICAgICAgIHJldHZhbCA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0xfSU5UX1ZFQzM6CisgICAgY2FzZSBHTF9CT09MX1ZFQzM6CisgICAgY2FzZSBHTF9GTE9BVF9WRUMzOgorICAgICAgICByZXR2YWwgPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9WRUM0OgorICAgIGNhc2UgR0xfQk9PTF9WRUM0OgorICAgIGNhc2UgR0xfSU5UX1ZFQzQ6CisgICAgY2FzZSBHTF9GTE9BVF9NQVQyOgorICAgICAgICByZXR2YWwgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9NQVQzOgorICAgICAgICByZXR2YWwgPSAzNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9GTE9BVF9NQVQ0OgorICAgICAgICByZXR2YWwgPSA2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9TQU1QTEVSXzJEOgorICAgIGNhc2UgR0xfU0FNUExFUl9DVUJFOgorICAgICAgICByZXR2YWwgPSA0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBFUlIoIioqKiogRVJST1IgdW5rbm93biB0eXBlIDB4JXggKCVzLCVkKVxuIiwgdHlwZSwgX19GVU5DVElPTl9fLF9fTElORV9fKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKKworfQorCitzaXplX3QgZ2xVdGlsc1BhcmFtU2l6ZShHTGVudW0gcGFyYW0pCit7CisgICAgc2l6ZV90IHMgPSAwOworCisgICAgc3dpdGNoKHBhcmFtKQorICAgIHsKKyAgICBjYXNlIEdMX0RFUFRIX1RFU1Q6CisgICAgY2FzZSBHTF9ERVBUSF9GVU5DOgorICAgIGNhc2UgR0xfREVQVEhfQklUUzoKKyAgICBjYXNlIEdMX01BWF9DTElQX1BMQU5FUzoKKyAgICBjYXNlIEdMX0dSRUVOX0JJVFM6CisgICAgY2FzZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIOgorICAgIGNhc2UgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEg6CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSDoKKyAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUzoKKyAgICBjYXNlIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVM6CisgICAgY2FzZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM6CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgorICAgIGNhc2UgR0xfVEVYVFVSRV9HRU5fTU9ERV9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0VOVl9NT0RFOgorICAgIGNhc2UgR0xfRk9HX01PREU6CisgICAgY2FzZSBHTF9GT0dfREVOU0lUWToKKyAgICBjYXNlIEdMX0ZPR19TVEFSVDoKKyAgICBjYXNlIEdMX0ZPR19FTkQ6CisgICAgY2FzZSBHTF9TUE9UX0VYUE9ORU5UOgorICAgIGNhc2UgR0xfQ09OU1RBTlRfQVRURU5VQVRJT046CisgICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046CisgICAgY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046CisgICAgY2FzZSBHTF9TSElOSU5FU1M6CisgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERToKKyAgICBjYXNlIEdMX1BPSU5UX1NJWkU6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX01JTjoKKyAgICBjYXNlIEdMX1BPSU5UX1NJWkVfTUFYOgorICAgIGNhc2UgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRToKKyAgICBjYXNlIEdMX0NVTExfRkFDRV9NT0RFOgorICAgIGNhc2UgR0xfRlJPTlRfRkFDRToKKyAgICBjYXNlIEdMX1NIQURFX01PREVMOgorICAgIGNhc2UgR0xfREVQVEhfV1JJVEVNQVNLOgorICAgIGNhc2UgR0xfREVQVEhfQ0xFQVJfVkFMVUU6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0ZBSUw6CisgICAgY2FzZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTDoKKyAgICBjYXNlIEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTOgorICAgIGNhc2UgR0xfU1RFTkNJTF9SRUY6CisgICAgY2FzZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSzoKKyAgICBjYXNlIEdMX01BVFJJWF9NT0RFOgorICAgIGNhc2UgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIOgorICAgIGNhc2UgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfU1RBQ0tfREVQVEg6CisgICAgY2FzZSBHTF9BTFBIQV9URVNUX0ZVTkM6CisgICAgY2FzZSBHTF9BTFBIQV9URVNUX1JFRjoKKyAgICBjYXNlIEdMX0FMUEhBX1RFU1Q6CisgICAgY2FzZSBHTF9CTEVORF9EU1Q6CisgICAgY2FzZSBHTF9CTEVORF9TUkM6CisgICAgY2FzZSBHTF9CTEVORDoKKyAgICBjYXNlIEdMX0xPR0lDX09QX01PREU6CisgICAgY2FzZSBHTF9TQ0lTU09SX1RFU1Q6CisgICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9VTklUUzoKKyAgICBjYXNlIEdMX0FDVElWRV9URVhUVVJFOgorICAgIGNhc2UgR0xfQUxQSEFfQklUUzoKKyAgICBjYXNlIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfQkxVRV9CSVRTOgorICAgIGNhc2UgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTA6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FMToKKyAgICBjYXNlIEdMX0NMSVBfUExBTkUyOgorICAgIGNhc2UgR0xfQ0xJUF9QTEFORTM6CisgICAgY2FzZSBHTF9DTElQX1BMQU5FNDoKKyAgICBjYXNlIEdMX0NMSVBfUExBTkU1OgorICAgIGNhc2UgR0xfQ09MT1JfQVJSQVk6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICBjYXNlIEdMX0NPTE9SX0FSUkFZX1NJWkU6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9TVFJJREU6CisgICAgY2FzZSBHTF9DT0xPUl9BUlJBWV9UWVBFOgorICAgIGNhc2UgR0xfQ09MT1JfTE9HSUNfT1A6CisgICAgY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKKyAgICBjYXNlIEdMX1BBQ0tfQUxJR05NRU5UOgorICAgIGNhc2UgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UOgorICAgIGNhc2UgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVM6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVM6CisgICAgY2FzZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTOgorICAgIGNhc2UgR0xfUE9JTlRfU01PT1RIOgorICAgIGNhc2UgR0xfUE9JTlRfU01PT1RIX0hJTlQ6CisgICAgY2FzZSBHTF9QT0lOVF9TUFJJVEVfT0VTOgorICAgIGNhc2UgR0xfQ09PUkRfUkVQTEFDRV9PRVM6CisgICAgY2FzZSBHTF9DT01CSU5FX0FMUEhBOgorICAgIGNhc2UgR0xfU1JDMF9SR0I6CisgICAgY2FzZSBHTF9TUkMxX1JHQjoKKyAgICBjYXNlIEdMX1NSQzJfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDBfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDFfUkdCOgorICAgIGNhc2UgR0xfT1BFUkFORDJfUkdCOgorICAgIGNhc2UgR0xfU1JDMF9BTFBIQToKKyAgICBjYXNlIEdMX1NSQzFfQUxQSEE6CisgICAgY2FzZSBHTF9TUkMyX0FMUEhBOgorICAgIGNhc2UgR0xfT1BFUkFORDBfQUxQSEE6CisgICAgY2FzZSBHTF9PUEVSQU5EMV9BTFBIQToKKyAgICBjYXNlIEdMX09QRVJBTkQyX0FMUEhBOgorICAgIGNhc2UgR0xfUkdCX1NDQUxFOgorICAgIGNhc2UgR0xfQUxQSEFfU0NBTEU6CisgICAgY2FzZSBHTF9DT01CSU5FX1JHQjoKKyAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUjoKKyAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEw6CisgICAgY2FzZSBHTF9QT0xZR09OX09GRlNFVF9VTklUUzoKKyAgICBjYXNlIEdMX1JFRF9CSVRTOgorICAgIGNhc2UgR0xfUkVTQ0FMRV9OT1JNQUw6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0U6CisgICAgY2FzZSBHTF9TQU1QTEVfQUxQSEFfVE9fT05FOgorICAgIGNhc2UgR0xfU0FNUExFX0JVRkZFUlM6CisgICAgY2FzZSBHTF9TQU1QTEVfQ09WRVJBR0U6CisgICAgY2FzZSBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUOgorICAgIGNhc2UgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFOgorICAgIGNhc2UgR0xfU0FNUExFUzoKKyAgICBjYXNlIEdMX1NURU5DSUxfQklUUzoKKyAgICBjYXNlIEdMX1NURU5DSUxfQ0xFQVJfVkFMVUU6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0ZVTkM6CisgICAgY2FzZSBHTF9TVEVOQ0lMX1RFU1Q6CisgICAgY2FzZSBHTF9TVEVOQ0lMX1ZBTFVFX01BU0s6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0JBQ0tfRlVOQzoKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLOgorICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX1JFRjoKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19GQUlMOgorICAgIGNhc2UgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTDoKKyAgICBjYXNlIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1M6CisgICAgY2FzZSBHTF9TVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLOgorICAgIGNhc2UgR0xfVEVYVFVSRV8yRDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQklORElOR18yRDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUDoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQklORElOR19FWFRFUk5BTF9PRVM6CisgICAgY2FzZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRToKKyAgICBjYXNlIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFOgorICAgIGNhc2UgR0xfVU5QQUNLX0FMSUdOTUVOVDoKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWToKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORzoKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9TSVpFOgorICAgIGNhc2UgR0xfVkVSVEVYX0FSUkFZX1NUUklERToKKyAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWV9UWVBFOgorICAgIGNhc2UgR0xfU1BPVF9DVVRPRkY6CisgICAgY2FzZSBHTF9URVhUVVJFX01JTl9GSUxURVI6CisgICAgY2FzZSBHTF9URVhUVVJFX01BR19GSUxURVI6CisgICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKKyAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgorICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQOgorICAgIGNhc2UgR0xfR0VORVJBVEVfTUlQTUFQX0hJTlQ6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVM6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUzoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9PRVM6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVM6CisgICAgY2FzZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUzoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX09FUzoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUzoKKyAgICBjYXNlIEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTOgorICAgIGNhc2UgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkc6CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HOgorICAgIGNhc2UgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRV9PRVM6CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUzoKKyAgICBjYXNlIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9MRVZFTF9PRVM6CisgICAgY2FzZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVM6CisgICAgY2FzZSBHTF9GRU5DRV9TVEFUVVNfTlY6CisgICAgY2FzZSBHTF9GRU5DRV9DT05ESVRJT05fTlY6CisgICAgY2FzZSBHTF9URVhUVVJFX1dJRFRIX1FDT006CisgICAgY2FzZSBHTF9URVhUVVJFX0hFSUdIVF9RQ09NOgorICAgIGNhc2UgR0xfVEVYVFVSRV9ERVBUSF9RQ09NOgorICAgIGNhc2UgR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVRfUUNPTToKKyAgICBjYXNlIEdMX1RFWFRVUkVfRk9STUFUX1FDT006CisgICAgY2FzZSBHTF9URVhUVVJFX1RZUEVfUUNPTToKKyAgICBjYXNlIEdMX1RFWFRVUkVfSU1BR0VfVkFMSURfUUNPTToKKyAgICBjYXNlIEdMX1RFWFRVUkVfTlVNX0xFVkVMU19RQ09NOgorICAgIGNhc2UgR0xfVEVYVFVSRV9UQVJHRVRfUUNPTToKKyAgICBjYXNlIEdMX1RFWFRVUkVfT0JKRUNUX1ZBTElEX1FDT006CisgICAgY2FzZSBHTF9CTEVORF9FUVVBVElPTl9SR0JfT0VTOgorICAgIGNhc2UgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTOgorICAgIGNhc2UgR0xfQkxFTkRfRFNUX1JHQl9PRVM6CisgICAgY2FzZSBHTF9CTEVORF9TUkNfUkdCX09FUzoKKyAgICBjYXNlIEdMX0JMRU5EX0RTVF9BTFBIQV9PRVM6CisgICAgY2FzZSBHTF9CTEVORF9TUkNfQUxQSEFfT0VTOgorICAgIGNhc2UgR0xfTUFYX0xJR0hUUzoKKyAgICBjYXNlIEdMX1NIQURFUl9UWVBFOgorICAgIGNhc2UgR0xfREVMRVRFX1NUQVRVUzoKKyAgICBjYXNlIEdMX0NPTVBJTEVfU1RBVFVTOgorICAgIGNhc2UgR0xfSU5GT19MT0dfTEVOR1RIOgorICAgIGNhc2UgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEg6CisgICAgY2FzZSBHTF9DVVJSRU5UX1BST0dSQU06CisgICAgY2FzZSBHTF9MSU5LX1NUQVRVUzoKKyAgICBjYXNlIEdMX1ZBTElEQVRFX1NUQVRVUzoKKyAgICBjYXNlIEdMX0FUVEFDSEVEX1NIQURFUlM6CisgICAgY2FzZSBHTF9BQ1RJVkVfVU5JRk9STVM6CisgICAgY2FzZSBHTF9BQ1RJVkVfQVRUUklCVVRFUzoKKyAgICBjYXNlIEdMX1NVQlBJWEVMX0JJVFM6CisgICAgY2FzZSBHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFOgorICAgIGNhc2UgR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUzoKKyAgICBjYXNlIEdMX1NIQURFUl9DT01QSUxFUjoKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfQVRUUklCUzoKKyAgICBjYXNlIEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgorICAgIGNhc2UgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUzoKKyAgICBjYXNlIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTOgorICAgIGNhc2UgR0xfTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTOgorICAgIGNhc2UgR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKKyAgICBjYXNlIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRToKKyAgICBjYXNlIEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTOgorICAgIGNhc2UgR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVM6CisgICAgY2FzZSBHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX09FUzoKKyAgICBjYXNlIEdMX0xJTkVfV0lEVEg6CisgICAgICAgIHMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRToKKyAgICBjYXNlIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRToKKyAgICBjYXNlIEdMX0RFUFRIX1JBTkdFOgorICAgIGNhc2UgR0xfTUFYX1ZJRVdQT1JUX0RJTVM6CisgICAgY2FzZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRToKKyAgICBjYXNlIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFOgorICAgICAgICBzPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NQT1RfRElSRUNUSU9OOgorICAgIGNhc2UgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT046CisgICAgY2FzZSBHTF9DVVJSRU5UX05PUk1BTDoKKyAgICAgICAgcyA9ICAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQjoKKyAgICBjYXNlIEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFM6CisgICAgY2FzZSBHTF9DVVJSRU5UX0NPTE9SOgorICAgIGNhc2UgR0xfRk9HX0NPTE9SOgorICAgIGNhc2UgR0xfQU1CSUVOVDoKKyAgICBjYXNlIEdMX0RJRkZVU0U6CisgICAgY2FzZSBHTF9TUEVDVUxBUjoKKyAgICBjYXNlIEdMX0VNSVNTSU9OOgorICAgIGNhc2UgR0xfUE9TSVRJT046CisgICAgY2FzZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UOgorICAgIGNhc2UgR0xfVEVYVFVSRV9FTlZfQ09MT1I6CisgICAgY2FzZSBHTF9TQ0lTU09SX0JPWDoKKyAgICBjYXNlIEdMX1ZJRVdQT1JUOgorICAgIGNhc2UgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTOgorICAgIGNhc2UgR0xfQ09MT1JfQ0xFQVJfVkFMVUU6CisgICAgY2FzZSBHTF9DT0xPUl9XUklURU1BU0s6CisgICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgorICAgIGNhc2UgR0xfQkxFTkRfQ09MT1I6CisgICAgICAgIHMgPSAgNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9NT0RFTFZJRVdfTUFUUklYOgorICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVg6CisgICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWDoKKyAgICAgICAgcyA9IDE2OworICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEVSUigiZ2xVdGlsc1BhcmFtU2l6ZTogdW5rbm93IHBhcmFtIDB4JTA4eFxuIiwgcGFyYW0pOworICAgICAgICBzID0gMTsgLy8gYXNzdW1lIDEKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgZ2xVdGlsc1BhY2tQb2ludGVyRGF0YSh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBHTGVudW0gdHlwZSwgdW5zaWduZWQgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuKQoreworICAgIHVuc2lnbmVkIGludCAgdnNpemUgPSBzaXplICogZ2xTaXplb2YodHlwZSk7CisgICAgaWYgKHN0cmlkZSA9PSAwKSBzdHJpZGUgPSB2c2l6ZTsKKworICAgIGlmIChzdHJpZGUgPT0gdnNpemUpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBkYXRhbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGRhdGFsZW47IGkgKz0gdnNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QsIHNyYywgdnNpemUpOworICAgICAgICAgICAgZHN0ICs9IHZzaXplOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGdsVXRpbHNQaXhlbEJpdFNpemUoR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCit7CisgICAgaW50IGNvbXBvbmVudHMgPSAwOworICAgIGludCBjb21wb25lbnRzaXplID0gMDsKKyAgICBpbnQgcGl4ZWxzaXplID0gMDsKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgR0xfQllURToKKyAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6CisgICAgICAgIGNvbXBvbmVudHNpemUgPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMX1NIT1JUOgorICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNToKKyAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ6CisgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOgorICAgIGNhc2UgR0xfUkdCNTY1X09FUzoKKyAgICBjYXNlIEdMX1JHQjVfQTFfT0VTOgorICAgIGNhc2UgR0xfUkdCQTRfT0VTOgorICAgICAgICBwaXhlbHNpemUgPSAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTF9JTlQ6CisgICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6CisgICAgY2FzZSBHTF9GTE9BVDoKKyAgICBjYXNlIEdMX0ZJWEVEOgorICAgIGNhc2UgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTOgorICAgICAgICBwaXhlbHNpemUgPSAzMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgRVJSKCJnbFV0aWxzUGl4ZWxCaXRTaXplOiB1bmtub3duIHBpeGVsIHR5cGUgLSBhc3N1bWluZyBwaXhlbCBkYXRhIDBcbiIpOworICAgICAgICBjb21wb25lbnRzaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAocGl4ZWxzaXplID09IDApIHsKKyAgICAgICAgc3dpdGNoKGZvcm1hdCkgeworI2lmIDAKKyAgICAgICAgY2FzZSBHTF9SRUQ6CisgICAgICAgIGNhc2UgR0xfR1JFRU46CisgICAgICAgIGNhc2UgR0xfQkxVRToKKyNlbmRpZgorICAgICAgICBjYXNlIEdMX0FMUEhBOgorICAgICAgICBjYXNlIEdMX0xVTUlOQU5DRToKKyAgICAgICAgY2FzZSBHTF9ERVBUSF9DT01QT05FTlQ6CisgICAgICAgIGNhc2UgR0xfREVQVEhfU1RFTkNJTF9PRVM6CisgICAgICAgICAgICBjb21wb25lbnRzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKKyAgICAgICAgICAgIGNvbXBvbmVudHMgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkdCOgorI2lmIDAKKyAgICAgICAgY2FzZSBHTF9CR1I6CisjZW5kaWYKKyAgICAgICAgICAgIGNvbXBvbmVudHMgPSAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0xfUkdCQToKKyAgICAgICAgY2FzZSBHTF9CR1JBX0VYVDoKKyAgICAgICAgICAgIGNvbXBvbmVudHMgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUlIoImdsVXRpbHNQaXhlbEJpdFNpemU6IHVua25vd24gcGl4ZWwgZm9ybWF0Li4uXG4iKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMgPSAwOworICAgICAgICB9CisgICAgICAgIHBpeGVsc2l6ZSA9IGNvbXBvbmVudHMgKiBjb21wb25lbnRzaXplOworICAgIH0KKworICAgIHJldHVybiBwaXhlbHNpemU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL2dsVXRpbHMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vZ2xVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYzE5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL2dsVXRpbHMuaApAQCAtMCwwICsxLDQxIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc2l6ZV90IGdsU2l6ZW9mKEdMZW51bSB0eXBlKTsKKworc2l6ZV90IGdsVXRpbHNQYXJhbVNpemUoR0xlbnVtIHBhcmFtKTsKKwordm9pZCAgIGdsVXRpbHNQYWNrUG9pbnRlckRhdGEodW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIHVuc2lnbmVkIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbik7CisKK2ludCBnbFV0aWxzUGl4ZWxCaXRTaXplKEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL2dsX2Jhc2VfdHlwZXMuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvT3BlbmdsQ29kZWNDb21tb24vZ2xfYmFzZV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzU5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL09wZW5nbENvZGVjQ29tbW9uL2dsX2Jhc2VfdHlwZXMuaApAQCAtMCwwICsxLDYyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworI2lmbmRlZiBfX0dMX0JBU0VfVFlQRVNfX0gKKyNkZWZpbmUgX19HTF9CQVNFX1RZUEVTX19ICisKKyNpbmNsdWRlIDxLSFIva2hycGxhdGZvcm0uaD4KKworI2lmbmRlZiBnbGVzMV9BUElFTlRSWQorI2RlZmluZSBnbGVzMV9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCisjZW5kaWYKKworI2lmbmRlZiBnbGVzMl9BUElFTlRSWQorI2RlZmluZSBnbGVzMl9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCisjZW5kaWYKKwordHlwZWRlZiB2b2lkICAgICAgICAgICAgIEdMdm9pZDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgR0xib29sZWFuOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgIEdMYml0ZmllbGQ7Cit0eXBlZGVmIGNoYXIgICAgICAgICAgICAgR0xjaGFyOwordHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKK3R5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Cit0eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Cit0eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKK3R5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKK3R5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOwordHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMY2xhbXB4OwordHlwZWRlZiBraHJvbm9zX2ludHB0cl90IEdMaW50cHRyOwordHlwZWRlZiBraHJvbm9zX3NzaXplX3QgIEdMc2l6ZWlwdHI7Cit0eXBlZGVmIGNoYXIgKkdMc3RyOworLyogSlIgWFhYIFRyZWF0aW5nIHRoaXMgYXMgYW4gaW4gaGFuZGxlIC0gaXMgdGhpcyBjb3JyZWN0PyAqLwordHlwZWRlZiB2b2lkICogR0xlZ2xJbWFnZU9FUzsKKworLyogRXJyb3JDb2RlICovCisjaWZuZGVmIEdMX0lOVkFMSURfRU5VTQorI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vQW5kcm9pZC5tayBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkNzJiZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NyBAQAorIyBUaGlzIGJ1aWxkIHNjcmlwdCBjb3JyZXNwb25kcyB0byBhIGxpYnJhcnkgY29udGFpbmluZyBtYW55IGRlZmluaXRpb25zCisjIGNvbW1vbiB0byBib3RoIHRoZSBndWVzdCBhbmQgdGhlIGhvc3QuIFRoZXkgcmVsYXRlIHRvCisjCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyBlbXVnbF9jb21tb24gaG9zdCBsaWJyYXJ5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY29tbW9uU291cmNlcyA6PSBcCisgICAgICAgIGNyYXNoX3JlcG9ydGVyLmNwcCBcCisgICAgICAgIGZlYXR1cmVfY29udHJvbC5jcHAgXAorICAgICAgICBsb2dnaW5nLmNwcCBcCisgICAgICAgIG1pc2MuY3BwIFwKKyAgICAgICAgc2hhcmVkX2xpYnJhcnkuY3BwIFwKKyAgICAgICAgc3RyaW5ncGFyc2luZy5jcHAgXAorICAgICAgICBzb2NrZXRzLmNwcCBcCisgICAgICAgIHN5bmNfZGV2aWNlLmNwcAorCitob3N0X2NvbW1vblNvdXJjZXMgOj0gJChjb21tb25Tb3VyY2VzKQorCitob3N0X2NvbW1vbkxkTGlicyA6PSAkKENYWF9TVERfTElCKQorCitpZm5lcSAod2luZG93cywkKEJVSUxEX1RBUkdFVF9PUykpCisgICAgaG9zdF9jb21tb25MZExpYnMgKz0gLWxkbCAtbHB0aHJlYWQKK2VuZGlmCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1zdGF0aWMtbGlicmFyeSxsaWJlbXVnbF9jb21tb24pCitMT0NBTF9TUkNfRklMRVMgOj0gJChob3N0X2NvbW1vblNvdXJjZXMpCiskKGNhbGwgZW11Z2wtZXhwb3J0LENfSU5DTFVERVMsJChFTVVHTF9QQVRIKS9zaGFyZWQpCiskKGNhbGwgZW11Z2wtZXhwb3J0LExETElCUywkKGhvc3RfY29tbW9uTGRMaWJzKSkKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQorCisjIyMgZW11Z2xfY29tbW9uX3VuaXR0ZXN0cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2hvc3RfY29tbW9uU291cmNlcyA6PSBcCisgICAgc2hhcmVkX2xpYnJhcnlfdW5pdHRlc3QuY3BwIFwKKyAgICBzdHJpbmdwYXJzaW5nX3VuaXR0ZXN0LmNwcAorCiskKGNhbGwgZW11Z2wtYmVnaW4tZXhlY3V0YWJsZSxlbXVnbCQoQlVJTERfVEFSR0VUX1NVRkZJWClfY29tbW9uX2hvc3RfdW5pdHRlc3RzKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoaG9zdF9jb21tb25Tb3VyY2VzKQorJChjYWxsIGVtdWdsLWltcG9ydCxsaWJlbXVnbF9jb21tb24gbGliZW11Z2xfZ3Rlc3QpCiskKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKQorJChjYWxsIGVtdWdsLWVuZC1tb2R1bGUpCisKKyQoY2FsbCBlbXVnbC1iZWdpbi1zaGFyZWQtbGlicmFyeSxsaWIkKEJVSUxEX1RBUkdFVF9TVUZGSVgpZW11Z2xfdGVzdF9zaGFyZWRfbGlicmFyeSkKK0xPQ0FMX1NSQ19GSUxFUyA6PSB0ZXN0aW5nL3Rlc3Rfc2hhcmVkX2xpYnJhcnkuY3BwCitMT0NBTF9DRkxBR1MgOj0gLWZ2aXNpYmlsaXR5PWRlZmF1bHQKKyQoY2FsbCBlbXVnbC1lbmQtbW9kdWxlKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY29uZGl0aW9uX3ZhcmlhYmxlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9jb25kaXRpb25fdmFyaWFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjJkMmYwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY29uZGl0aW9uX3ZhcmlhYmxlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vQ29uZGl0aW9uVmFyaWFibGUuaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6Q29uZGl0aW9uVmFyaWFibGU7CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjA1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9jcmFzaF9yZXBvcnRlci5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgImNyYXNoX3JlcG9ydGVyLmgiCisKKyNpbmNsdWRlIDxjc3RkbGliPgorCit2b2lkIGRlZmF1bHRfY3Jhc2hfcmVwb3J0ZXIoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgICBhYm9ydCgpOworfQorCitlbXVnbF9jcmFzaF9yZXBvcnRlcl90IGVtdWdsX2NyYXNoX3JlcG9ydGVyID0gZGVmYXVsdF9jcmFzaF9yZXBvcnRlcjsKKwordm9pZCBzZXRfZW11Z2xfY3Jhc2hfcmVwb3J0ZXIoZW11Z2xfY3Jhc2hfcmVwb3J0ZXJfdCBjcmFzaF9yZXBvcnRlcikgeworICAgIGlmIChjcmFzaF9yZXBvcnRlcikgeworICAgICAgICBlbXVnbF9jcmFzaF9yZXBvcnRlciA9IGNyYXNoX3JlcG9ydGVyOworICAgIH0gZWxzZSB7CisgICAgICAgIGVtdWdsX2NyYXNoX3JlcG9ydGVyID0gZGVmYXVsdF9jcmFzaF9yZXBvcnRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9jcmFzaF9yZXBvcnRlci5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk2YzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vY3Jhc2hfcmVwb3J0ZXIuaApAQCAtMCwwICsxLDIyIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIk9wZW5nbFJlbmRlci9yZW5kZXJfYXBpX3R5cGVzLmgiCisKK2V4dGVybiBlbXVnbF9jcmFzaF9yZXBvcnRlcl90IGVtdWdsX2NyYXNoX3JlcG9ydGVyOwordm9pZCBzZXRfZW11Z2xfY3Jhc2hfcmVwb3J0ZXIoZW11Z2xfY3Jhc2hfcmVwb3J0ZXJfdCBjcmFzaF9yZXBvcnRlcik7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9kZWJ1Zy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDMxMzgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vZGVidWcuaApAQCAtMCwwICsxLDMzIEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjcHJhZ21hIG9uY2UKKworLy8gVXNhZ2U6IERlZmluZSBFTVVHTF9ERUJVR19MRVZFTCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIHRvCisvLyAgICAgICAgc2VsZWN0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEQoKSBhbmQgREQoKSBtYWNyb3MuCisKKyNpZiBkZWZpbmVkKEVNVUdMX0RFQlVHX0xFVkVMKSAmJiBFTVVHTF9ERUJVR19MRVZFTCA+IDAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBEKC4uLikgIChwcmludGYoIiVzOiVkOiVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKSwgcHJpbnRmKF9fVkFfQVJHU19fKSwgcHJpbnRmKCJcbiIpLCBmZmx1c2goc3Rkb3V0KSkKKyNlbHNlCisjZGVmaW5lIEQoLi4uKSAgKHZvaWQpMAorI2VuZGlmIC8vIEVNVUdMX0RFQlVHX0xFVkVMID4gMAorCisjaWYgZGVmaW5lZChFTVVHTF9ERUJVR19MRVZFTCkgJiYgRU1VR0xfREVCVUdfTEVWRUwgPiAxCisjZGVmaW5lIEREKC4uLikgRChfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIEREKC4uLikgKHZvaWQpMAorI2VuZGlmIC8vIEVNVUdMX0RFQlVHX0xFVkVMID4gMQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vZmVhdHVyZV9jb250cm9sLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL2ZlYXR1cmVfY29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkMjFmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL2ZlYXR1cmVfY29udHJvbC5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgImZlYXR1cmVfY29udHJvbC5oIgorCitzdGF0aWMgYm9vbCBkZWZhdWx0RmVhdHVyZUlzRW5hYmxlZChhbmRyb2lkOjpmZWF0dXJlY29udHJvbDo6RmVhdHVyZSBmZWF0dXJlKSB7CisgICAgKHZvaWQpZmVhdHVyZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2VtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZF90IGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZCA9IGRlZmF1bHRGZWF0dXJlSXNFbmFibGVkOworCit2b2lkIHNldF9lbXVnbF9mZWF0dXJlX2lzX2VuYWJsZWQoZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkX3QgZmVhdHVyZV9pc19lbmFibGVkKSB7CisgICAgZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkID0gZmVhdHVyZV9pc19lbmFibGVkOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vZmVhdHVyZV9jb250cm9sLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9mZWF0dXJlX2NvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI0Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vZmVhdHVyZV9jb250cm9sLmgKQEAgLTAsMCArMSwyMiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV90eXBlcy5oIgorCitleHRlcm4gZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkX3QgZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkOwordm9pZCBzZXRfZW11Z2xfZmVhdHVyZV9pc19lbmFibGVkKGVtdWdsX2ZlYXR1cmVfaXNfZW5hYmxlZF90IGZlYXR1cmVfaXNfZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9sYXp5X2luc3RhbmNlLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9sYXp5X2luc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1N2ZhZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL2xhenlfaW5zdGFuY2UuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBMYXp5SW5zdGFuY2UgPSBhbmRyb2lkOjpiYXNlOjpMYXp5SW5zdGFuY2U8VD47CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbG9nZ2luZy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9sb2dnaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2NiYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbG9nZ2luZy5jcHAKQEAgLTAsMCArMSwzOCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9sb2dnaW5nLmgiCisKK3ZvaWQgZGVmYXVsdF9sb2dnZXIoY29uc3QgY2hhciogZm10LCAuLi4pIHsgfQorCitlbXVnbF9sb2dnZXJfdCBlbXVnbF9sb2dnZXIgPSBkZWZhdWx0X2xvZ2dlcjsKK2VtdWdsX2xvZ2dlcl90IGVtdWdsX2N4dF9sb2dnZXIgPSBkZWZhdWx0X2xvZ2dlcjsKKwordm9pZCBzZXRfZW11Z2xfbG9nZ2VyKGVtdWdsX2xvZ2dlcl90IGYpIHsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgZW11Z2xfbG9nZ2VyID0gZGVmYXVsdF9sb2dnZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW11Z2xfbG9nZ2VyID0gZjsKKyAgICB9Cit9CisKK3ZvaWQgc2V0X2VtdWdsX2N4dF9sb2dnZXIoZW11Z2xfbG9nZ2VyX3QgZikgeworICAgIGlmICghZikgeworICAgICAgICBlbXVnbF9jeHRfbG9nZ2VyID0gZGVmYXVsdF9sb2dnZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW11Z2xfY3h0X2xvZ2dlciA9IGY7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbG9nZ2luZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Yzc3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9sb2dnaW5nLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV90eXBlcy5oIgorCitleHRlcm4gZW11Z2xfbG9nZ2VyX3QgZW11Z2xfbG9nZ2VyOworZXh0ZXJuIGVtdWdsX2xvZ2dlcl90IGVtdWdsX2N4dF9sb2dnZXI7Cit2b2lkIHNldF9lbXVnbF9sb2dnZXIoZW11Z2xfbG9nZ2VyX3QgZik7Cit2b2lkIHNldF9lbXVnbF9jeHRfbG9nZ2VyKGVtdWdsX2xvZ2dlcl90IGYpOworCisjZGVmaW5lIEdMX0xPR0dJTkcgMQorCisjaWYgR0xfTE9HR0lORworCisjZGVmaW5lIEdMX0xPRyguLi4pIGRvIHsgXAorICAgIGVtdWdsX2xvZ2dlcihfX1ZBX0FSR1NfXyk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0xfQ1hUX0xPRyguLi4pIGRvIHsgXAorICAgIGVtdWdsX2N4dF9sb2dnZXIoX19WQV9BUkdTX18pOyBcCit9IHdoaWxlICgwKQorCisjZWxzZQorI2RlZmluZSBHTF9MT0coLi4uKSAwCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21lc3NhZ2VfY2hhbm5lbC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbWVzc2FnZV9jaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxZjM1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21lc3NhZ2VfY2hhbm5lbC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeW5jaHJvbml6YXRpb24vTWVzc2FnZUNoYW5uZWwuaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBDYXBhY2l0eT4KK3VzaW5nIE1lc3NhZ2VDaGFubmVsID0gYW5kcm9pZDo6YmFzZTo6TWVzc2FnZUNoYW5uZWw8VCwgQ2FwYWNpdHk+OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21pc2MuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbWlzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVlMGJiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21pc2MuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9taXNjLmgiCisKK3N0YXRpYyBpbnQgc19hcGkgPSAtMTsKKwordm9pZCBlbXVnbDo6c2V0QXBpTGV2ZWwoaW50IGFwaSkgeworICAgIHNfYXBpID0gYXBpOworfQorCitpbnQgZW11Z2w6OmdldEFwaUxldmVsKCkgeworICAgIHJldHVybiBzX2FwaTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21pc2MuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA3YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbWlzYy5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKK25hbWVzcGFjZSBlbXVnbCB7CisgICAgLy8gU2V0IGFuZCBnZXQgQVBJIHZlcnNpb24gb2Ygc3lzdGVtIGltYWdlLgorICAgIC8vIHNldEFwaVZlcnNpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2Ugd2hlbiBpbml0aWFsaXppbmcgUmVuZGVyTGliCisgICAgdm9pZCBzZXRBcGlMZXZlbChpbnQgYXBpKTsKKyAgICBpbnQgZ2V0QXBpTGV2ZWwoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9tdXRleC5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVhOTVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vbXV0ZXguaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5bmNocm9uaXphdGlvbi9Mb2NrLmgiCisKK25hbWVzcGFjZSBlbXVnbCB7CisKK3VzaW5nIE11dGV4ID0gYW5kcm9pZDo6YmFzZTo6TG9jazsKK3VzaW5nIFJlYWRXcml0ZU11dGV4ID0gYW5kcm9pZDo6YmFzZTo6UmVhZFdyaXRlTG9jazsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2MjJmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmNwcApAQCAtMCwwICsxLDE2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgiCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gc3RhdGljCitTaGFyZWRMaWJyYXJ5KiBTaGFyZWRMaWJyYXJ5OjpvcGVuKGNvbnN0IGNoYXIqIGxpYnJhcnlOYW1lKSB7CisgICAgY2hhciBlcnJvclsxXTsKKyAgICByZXR1cm4gb3BlbihsaWJyYXJ5TmFtZSwgZXJyb3IsIHNpemVvZihlcnJvcikpOworfQorCisjaWZkZWYgX1dJTjMyCisKKy8vIHN0YXRpYworU2hhcmVkTGlicmFyeSogU2hhcmVkTGlicmFyeTo6b3Blbihjb25zdCBjaGFyKiBsaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlcnJvclNpemUpIHsKKyAgICBITU9EVUxFIGxpYiA9IExvYWRMaWJyYXJ5KGxpYnJhcnlOYW1lKTsKKyAgICBpZiAobGliKSB7CisgICAgICAgIHJldHVybiBuZXcgU2hhcmVkTGlicmFyeShsaWIpOworICAgIH0KKworICAgIGlmIChlcnJvclNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGVycm9yIGludG8gaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4KKyAgICBEV09SRCBlcnJvckNvZGUgPSA6OkdldExhc3RFcnJvcigpOworICAgIExQU1RSIG1lc3NhZ2UgPSBOVUxMOworICAgIHNpemVfdCBtZXNzYWdlTGVuID0gRm9ybWF0TWVzc2FnZUEoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgZXJyb3JDb2RlLAorICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAgICAgICAoTFBTVFIpICZtZXNzYWdlLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIE5VTEwpOworCisgICAgaW50IHJldCA9IHNucHJpbnRmKGVycm9yLCBlcnJvclNpemUsICIlLipzIiwgKGludCltZXNzYWdlTGVuLCBtZXNzYWdlKTsKKyAgICBpZiAocmV0IDwgMCB8fCByZXQgPT0gc3RhdGljX2Nhc3Q8aW50PihlcnJvclNpemUpKSB7CisgICAgICAgIC8vIHNucHJpbnRmKCkgb24gV2luZG93cyBkb2Vzbid0IGJlaGF2ZSBhcyBleHBlY3RlZCBieSBDOTksCisgICAgICAgIC8vIHRoaXMgcGF0aCBpcyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBwcm9wZXJseQorICAgICAgICAvLyB6ZXJvLXRlcm1pbmF0ZWQuCisgICAgICAgIHJldCA9IHN0YXRpY19jYXN0PGludD4oZXJyb3JTaXplIC0gMSk7CisgICAgICAgIGVycm9yW3JldF0gPSAnXDAnOworICAgIH0KKyAgICAvLyBSZW1vdmUgYW55IHRyYWlsaW5nIFxyXG4gYWRkZWQgYnkgRm9ybWF0TWVzc2FnZQorICAgIGlmIChyZXQgPiAwICYmIGVycm9yW3JldCAtIDFdID09ICdcbicpIHsKKyAgICAgICAgZXJyb3JbLS1yZXRdID0gJ1wwJzsKKyAgICB9CisgICAgaWYgKHJldCA+IDAgJiYgZXJyb3JbcmV0IC0gMV0gPT0gJ1xyJykgeworICAgICAgICBlcnJvclstLXJldF0gPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworU2hhcmVkTGlicmFyeTo6U2hhcmVkTGlicmFyeShIYW5kbGVUeXBlIGxpYikgOiBtTGliKGxpYikge30KKworU2hhcmVkTGlicmFyeTo6flNoYXJlZExpYnJhcnkoKSB7CisgICAgaWYgKG1MaWIpIHsKKyAgICAgICAgRnJlZUxpYnJhcnkobUxpYik7CisgICAgfQorfQorCitTaGFyZWRMaWJyYXJ5OjpGdW5jdGlvblB0ciBTaGFyZWRMaWJyYXJ5OjpmaW5kU3ltYm9sKAorICAgICAgICBjb25zdCBjaGFyKiBzeW1ib2xOYW1lKSBjb25zdCB7CisgICAgaWYgKCFtTGliIHx8ICFzeW1ib2xOYW1lKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGdW5jdGlvblB0cj4oCisgICAgICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MobUxpYiwgc3ltYm9sTmFtZSkpOworfQorCisjZWxzZSAvLyAhX1dJTjMyCisKKy8vIHN0YXRpYworU2hhcmVkTGlicmFyeSogU2hhcmVkTGlicmFyeTo6b3Blbihjb25zdCBjaGFyKiBsaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlcnJvclNpemUpIHsKKyAgICBjb25zdCBjaGFyKiBsaWJQYXRoID0gbGlicmFyeU5hbWU7CisgICAgY2hhciogcGF0aCA9IE5VTEw7CisKKyAgICBjb25zdCBjaGFyKiBsaWJCYXNlTmFtZSA9IHN0cnJjaHIobGlicmFyeU5hbWUsICcvJyk7CisgICAgaWYgKCFsaWJCYXNlTmFtZSkgeworICAgICAgICBsaWJCYXNlTmFtZSA9IGxpYnJhcnlOYW1lOworICAgIH0KKworICAgIGlmICghc3RyY2hyKGxpYkJhc2VOYW1lLCAnLicpKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vIGV4dGVuc2lvbiBpbiB0aGlzIGxpYnJhcnkgbmFtZSwgc28gYXBwZW5kIG9uZS4KKyNpZmRlZiBfX0FQUExFX18KKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIga0RsbEV4dGVuc2lvbltdID0gIi5keWxpYiI7CisjZWxzZQorICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrRGxsRXh0ZW5zaW9uW10gPSAiLnNvIjsKKyNlbmRpZgorICAgICAgICBzaXplX3QgcGF0aExlbiA9IHN0cmxlbihsaWJyYXJ5TmFtZSkgKyBzaXplb2Yoa0RsbEV4dGVuc2lvbik7CisgICAgICAgIHBhdGggPSBzdGF0aWNfY2FzdDxjaGFyKj4obWFsbG9jKHBhdGhMZW4pKTsKKyAgICAgICAgc25wcmludGYocGF0aCwgcGF0aExlbiwgIiVzJXMiLCBsaWJyYXJ5TmFtZSwga0RsbEV4dGVuc2lvbik7CisgICAgICAgIGxpYlBhdGggPSBwYXRoOworICAgIH0KKworICAgIGRsZXJyb3IoKTsgIC8vIGNsZWFyIGVycm9yLgorCisjaWZkZWYgX19BUFBMRV9fCisgICAgLy8gT24gT1NYLCBzb21lIGxpYnJhcmllcyBkb24ndCBpbmNsdWRlIGFuIGV4dGVuc2lvbiAobm90YWJseSBPcGVuR0wpCisgICAgLy8gT24gT1NYIHdlIHRyeSB0byBvcGVuIHxsaWJyYXJ5TmFtZXwgZmlyc3QuICBJZiB0aGF0IGRvZXNuJ3QgZXhpc3QsCisgICAgLy8gd2UgdHJ5IHxsaWJyYXJ5TmFtZXwuZHlsaWIKKyAgICB2b2lkKiBsaWIgPSBkbG9wZW4obGlicmFyeU5hbWUsIFJUTERfTk9XKTsKKyAgICBpZiAobGliID09IE5VTEwpIHsKKyAgICAgICAgbGliID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XKTsKKyAgICB9CisjZWxzZQorICAgIHZvaWQqIGxpYiA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyk7CisjZW5kaWYKKworICAgIGlmIChwYXRoKSB7CisgICAgICAgIGZyZWUocGF0aCk7CisgICAgfQorCisgICAgaWYgKGxpYikgeworICAgICAgICByZXR1cm4gbmV3IFNoYXJlZExpYnJhcnkobGliKTsKKyAgICB9CisKKyAgICBzbnByaW50ZihlcnJvciwgZXJyb3JTaXplLCAiJXMiLCBkbGVycm9yKCkpOworICAgIHJldHVybiBOVUxMOworfQorCitTaGFyZWRMaWJyYXJ5OjpTaGFyZWRMaWJyYXJ5KEhhbmRsZVR5cGUgbGliKSA6IG1MaWIobGliKSB7fQorCitTaGFyZWRMaWJyYXJ5Ojp+U2hhcmVkTGlicmFyeSgpIHsKKyAgICBpZiAobUxpYikgeworICAgICAgICBkbGNsb3NlKG1MaWIpOworICAgIH0KK30KKworU2hhcmVkTGlicmFyeTo6RnVuY3Rpb25QdHIgU2hhcmVkTGlicmFyeTo6ZmluZFN5bWJvbCgKKyAgICAgICAgY29uc3QgY2hhciogc3ltYm9sTmFtZSkgY29uc3QgeworICAgIGlmICghbUxpYiB8fCAhc3ltYm9sTmFtZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY3Rpb25QdHI+KGRsc3ltKG1MaWIsIHN5bWJvbE5hbWUpKTsKK30KKworI2VuZGlmICAvLyAhX1dJTjMyCisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc2hhcmVkX2xpYnJhcnkuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3NDY3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NoYXJlZF9saWJyYXJ5LmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBFTVVHTF9DT01NT05fU0hBUkVEX0xJQlJBUllfSAorI2RlZmluZSBFTVVHTF9DT01NT05fU0hBUkVEX0xJQlJBUllfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gQSBjbGFzcyB1c2VkIHRvIG9wZW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyBzaGFyZWQgbGlicmFyeSwgYW5kIHByb2JlCisvLyBpdCBmb3Igc3ltYm9scy4gVXNhZ2UgaXMgdGhlIGZvbGxvd2luZzoKKy8vCisvLyAgICAvLyBPcGVuIHRoZSBsaWJyYXJ5LgorLy8gICAgU2hhcmVkTGlicmFyeSogbGlicmFyeSA9IFNoYXJlZExpYnJhcnk6Om9wZW4oImxpYkZvbyIpOworLy8gICAgaWYgKCFsaWJyYXJ5KSB7CisvLyAgICAgICAgLi4uIGNvdWxkIG5vdCBmaW5kIC8gb3BlbiBsaWJyYXJ5IQorLy8gICAgfQorLy8KKy8vICAgIC8vUHJvYmUgZm9yIGZ1bmN0aW9uIHN5bWJvbC4KKy8vICAgIEZ1bmN0aW9uUHRyIG15X2Z1bmMgPSBsaWJyYXJ5LT5maW5kU3ltYm9sKCJteV9mdW5jIik7CisvLworLy8gICAgLy8gQ2xvc2VzIGxpYnJhcnkvCisvLyAgICBkZWxldGUgbGlicmFyeTsKKy8vCitjbGFzcyBTaGFyZWRMaWJyYXJ5IHsKK3B1YmxpYzoKKyAgICAvLyBPcGVuIGEgZ2l2ZW4gbGlicmFyeS4gIElmIHxsaWJyYXJ5TmFtZXwgaGFzIG5vIGV4dGVuc2lvbiwgYQorICAgIC8vIHBsYXRmb3JtLWFwcHJvcHJpYXRlIGV4dGVuc2lvbiBpcyBhZGRlZCBhbmQgdGhhdCBwYXRoIGlzIG9wZW5lZC4KKyAgICAvLyBJZiB0aGUgfGxpYnJhcnlOYW1lfCBoYXMgYW4gZXh0ZW5zaW9uLCB0aGF0IGZvcm0gaXMgb3BlbmVkLgorICAgIC8vCisgICAgLy8gT24gT1NYLCBzb21lIGxpYnJhcmllcyBkb24ndCBpbmNsdWRlIGFuIGV4dGVuc2lvbiAobm90YWJseSBPcGVuR0wpCisgICAgLy8gT24gT1NYIHdlIHRyeSB0byBvcGVuIHxsaWJyYXJ5TmFtZXwgZmlyc3QuICBJZiB0aGF0IGRvZXNuJ3QgZXhpc3QsCisgICAgLy8gd2UgdHJ5IHxsaWJyYXJ5TmFtZXwuZHlsaWIKKyAgICAvLworICAgIC8vIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSBuZXcgU2hhcmVkTGlicmFyeSBpbnN0YW5jZSB0aGF0IG11c3QgYmUKKyAgICAvLyBkZWxldGVkIGJ5IHRoZSBjYWxsZXIuCisgICAgc3RhdGljIFNoYXJlZExpYnJhcnkqIG9wZW4oY29uc3QgY2hhciogbGlicmFyeU5hbWUpOworCisgICAgLy8gQSB2YXJpYW50IG9mIG9wZW4oKSB0aGF0IGNhbiByZXBvcnQgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBpZiBsb2FkaW5nCisgICAgLy8gdGhlIGxpYnJhcnkgZmFpbHMuIHxlcnJvcnwgaXMgYSBjYWxsZXItcHJvdmlkZWQgYnVmZmVyIG9mIHxlcnJvclNpemV8CisgICAgLy8gYnl0ZXMgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNucHJpbnRmKCkgYW5kIGFsd2F5cyB6ZXJvIHRlcm1pbmF0ZWQuCisgICAgLy8KKyAgICAvLyBPbiBzdWNjZXNzLCByZXR1cm4gYSBuZXcgU2hhcmVkTGlicmFyeSBpbnN0YW5jZSwgYW5kIGRvIG5vdCB0b3VjaAorICAgIC8vIHRoZSBjb250ZW50IG9mIHxlcnJvcnwuIE9uIGZhaWx1cmUsIHJldHVybiBOVUxMLCBhbmQgc2V0cyB0aGUgY29udGVudAorICAgIC8vIG9mIHxlcnJvcnwuCisgICAgc3RhdGljIFNoYXJlZExpYnJhcnkqIG9wZW4oY29uc3QgY2hhciogbGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVycm9yU2l6ZSk7CisKKyAgICAvLyBDbG9zZXMgYW4gZXhpc3RpbmcgU2hhcmVkTGlicmFyeSBpbnN0YW5jZS4KKyAgICB+U2hhcmVkTGlicmFyeSgpOworCisgICAgLy8gR2VuZXJpYyBmdW5jdGlvbiBwb2ludGVyIHR5cGUsIGZvciB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlCisgICAgLy8gZmluZFN5bWJvbCgpIG1ldGhvZC4KKyAgICB0eXBlZGVmIHZvaWQgKCpGdW5jdGlvblB0cikodm9pZCk7CisKKyAgICAvLyBQcm9iZSBhIGdpdmVuIFNoYXJlZExpYnJhcnkgaW5zdGFuY2UgdG8gZmluZCBhIHN5bWJvbCBuYW1lZAorICAgIC8vIHxzeW1ib2xOYW1lfCBpbiBpdC4gUmV0dXJuIGl0cyBhZGRyZXNzIGFzIGEgRnVuY3Rpb25QdHIsIG9yCisgICAgLy8gTlVMTCBpZiB0aGUgc3ltYm9sIGlzIG5vdCBmb3VuZC4KKyAgICBGdW5jdGlvblB0ciBmaW5kU3ltYm9sKGNvbnN0IGNoYXIqIHN5bWJvbE5hbWUpIGNvbnN0OworCitwcml2YXRlOgorI2lmZGVmIF9XSU4zMgorICAgIHR5cGVkZWYgSE1PRFVMRSBIYW5kbGVUeXBlOworI2Vsc2UKKyAgICB0eXBlZGVmIHZvaWQqIEhhbmRsZVR5cGU7CisjZW5kaWYKKworICAgIC8vIENvbnN0cnVjdG9yIGludGVudGlvbmFsbHkgaGlkZGVuLgorICAgIFNoYXJlZExpYnJhcnkoSGFuZGxlVHlwZSk7CisKKyAgICBIYW5kbGVUeXBlIG1MaWI7Cit9OworCisvLyBNYWNybyB0byBjb21wb3NlIGVtdWdsIHNoYXJlZCBsaWJyYXJ5IG5hbWUgdW5kZXIgdmFyaW91cyBPUyBhbmQgYml0bmVzcworLy8gZWcuCisvLyAgICAgb24geDg2XzY0LCBFTVVHTF9MSUJOQU1FKCJmb28iKSAtLT4gImxpYjY0Zm9vIgorCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorIyAgZGVmaW5lIEVNVUdMX0xJQk5BTUUobmFtZSkgImxpYjY0IiBuYW1lCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorIyAgZGVmaW5lIEVNVUdMX0xJQk5BTUUobmFtZSkgImxpYiIgbmFtZQorI2Vsc2UKKy8qIFRoaXMgaGVhZGVyIGlzIGluY2x1ZGVkIGJ5IHRhcmdldCB3L28gdXNpbmcgRU1VR0xfTElCTkFNRSgpLiAgRG9uJ3QgI2Vycm9yLCBsZWF2ZSBpdCB1bmRlZmluZWQgKi8KKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKKworI2VuZGlmICAvLyBFTVVHTF9DT01NT05fU0hBUkVEX0xJQlJBUllfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc2hhcmVkX2xpYnJhcnlfdW5pdHRlc3QuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc2hhcmVkX2xpYnJhcnlfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDZjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zaGFyZWRfbGlicmFyeS5oIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBIYWNrIHRvIGdldCB0aGUgY3VycmVudCBleGVjdXRhYmxlJ3MgZnVsbCBwYXRoLgorbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIGludGVybmFsIHsKKworZXh0ZXJuIHN0ZDo6c3RyaW5nIGdfZXhlY3V0YWJsZV9wYXRoOworCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCisKK25hbWVzcGFjZSBlbXVnbCB7CisKK25hbWVzcGFjZSB7CisKKy8vIFJldHVybiB0aGUgbmFtZS9wYXRoIG9mIHRoZSB0ZXN0IHNoYXJlZCBsaWJyYXJ5IHRvIGxvYWQuCisvLyBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGluY2x1ZGUgYSBwbGF0Zm9ybS1zcGVjaWZpYyBleHRlbnNpb24uCisvLyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGVzdCBzaGFyZWQgbGlicmFyeSBpcyB1bmRlciB0aGUgbGliLyBzdWItZGlyZWN0b3J5CisvLyBvZiB0aGUgY3VycmVudCBleGVjdXRhYmxlJ3MgcGF0aCEKK3N0ZDo6c3RyaW5nIEdldFRlc3RMaWJyYXJ5TmFtZSgpIHsKKyNpZmRlZiBfX3g4Nl82NF9fCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0xpYnJhcnlQcmVmaXhbXSA9ICJsaWI2NCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga1N1YkRpcltdID0gImxpYjY0LyI7CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBjaGFyIGtMaWJyYXJ5UHJlZml4W10gPSAibGliIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrU3ViRGlyW10gPSAibGliLyI7CisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGVzdExpYnJhcnlTdWZmaXhbXSA9ICJlbXVnbF90ZXN0X3NoYXJlZF9saWJyYXJ5IjsKKworICAgIGNvbnN0IGNoYXIqIGV4ZWNfcGF0aCA9IHRlc3Rpbmc6OmludGVybmFsOjpnX2V4ZWN1dGFibGVfcGF0aC5jX3N0cigpOworCisjaWZkZWYgX1dJTjMyCisgICAgY29uc3QgY2hhciogcCA9IHN0cnJjaHIoZXhlY19wYXRoLCAnLycpOworICAgIGNvbnN0IGNoYXIqIHAyID0gc3RycmNocihleGVjX3BhdGgsICdcXCcpOworICAgIGlmIChwMikgeworICAgICAgICBpZiAoIXAgfHwgcDIgPiBwKSB7CisgICAgICAgICAgICBwID0gcDI7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGNvbnN0IGNoYXIqIHAgPSBzdHJyY2hyKGV4ZWNfcGF0aCwgJy8nKTsKKyNlbmRpZgorCisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKworICAgIGlmICghcCkgeworICAgICAgICBwYXRoID0gIi4vIjsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXRoID0gc3RkOjpzdHJpbmcoZXhlY19wYXRoLCBwIC0gZXhlY19wYXRoICsgMVUpOworICAgIH0KKyAgICBwYXRoICs9IGtTdWJEaXI7CisgICAgcGF0aCArPSBrTGlicmFyeVByZWZpeDsKKyAgICBwYXRoICs9IGtUZXN0TGlicmFyeVN1ZmZpeDsKKyAgICBwcmludGYoIkxpYnJhcnkgcGF0aDogJXNcbiIsIHBhdGguY19zdHIoKSk7CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK2NsYXNzIFNoYXJlZExpYnJhcnlUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFNoYXJlZExpYnJhcnlUZXN0KCkgeworICAgICAgICAvLyBMb2NhdGUgdGhlIHNoYXJlZCBsaWJyYXJ5CisgICAgICAgIG1MaWJyYXJ5UGF0aCA9IEdldFRlc3RMaWJyYXJ5TmFtZSgpOworICAgIH0KKworICAgIH5TaGFyZWRMaWJyYXJ5VGVzdCgpIHt9CisKKyAgICBjb25zdCBjaGFyKiBsaWJyYXJ5X3BhdGgoKSBjb25zdCB7IHJldHVybiBtTGlicmFyeVBhdGguY19zdHIoKTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1MaWJyYXJ5UGF0aDsKK307CisKK2NsYXNzIFNjb3BlZFNoYXJlZExpYnJhcnkgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNjb3BlZFNoYXJlZExpYnJhcnkoY29uc3QgU2hhcmVkTGlicmFyeSogbGliKSA6IG1MaWIobGliKSB7fQorICAgIH5TY29wZWRTaGFyZWRMaWJyYXJ5KCkgeworICAgICAgICBkZWxldGUgbUxpYjsKKyAgICB9CisgICAgY29uc3QgU2hhcmVkTGlicmFyeSogZ2V0KCkgY29uc3QgeyByZXR1cm4gbUxpYjsgfQorCisgICAgY29uc3QgU2hhcmVkTGlicmFyeSogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG1MaWI7IH0KKworICAgIHZvaWQgcmVsZWFzZSgpIHsKKyAgICAgICAgZGVsZXRlIG1MaWI7CisgICAgICAgIG1MaWIgPSBOVUxMOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBTaGFyZWRMaWJyYXJ5KiBtTGliOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihTaGFyZWRMaWJyYXJ5VGVzdCwgT3BlbikgeworICAgIFNjb3BlZFNoYXJlZExpYnJhcnkgbGliKFNoYXJlZExpYnJhcnk6Om9wZW4obGlicmFyeV9wYXRoKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShsaWIuZ2V0KCkpOworfQorCitURVNUX0YoU2hhcmVkTGlicmFyeVRlc3QsIE9wZW5GYWlsdXJlV2l0aEVycm9yKSB7CisgICAgY2hhciBlcnJvclsyNTZdOworICAgIGVycm9yWzBdID0gJ1wwJzsKKyAgICBTaGFyZWRMaWJyYXJ5KiBsaWIgPSBTaGFyZWRMaWJyYXJ5OjpvcGVuKCIvdG1wL2RvZXMvbm90L2V4aXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlcnJvcikpOworICAgIEVYUEVDVF9GQUxTRShsaWIpOworICAgIEVYUEVDVF9UUlVFKGVycm9yWzBdKQorICAgICAgICAgICAgPDwgIkNvdWxkIG5vdCBnZXQgZXJyb3Igc3RyaW5nIHdoZW4gZmFpbGluZyB0byBsb2FkIGxpYnJhcnkiOworICAgIHByaW50ZigiRXhwZWN0ZWQgbGlicmFyeSBsb2FkIGZhaWx1cmU6IFslc11cbiIsIGVycm9yKTsKK30KKworVEVTVF9GKFNoYXJlZExpYnJhcnlUZXN0LCBPcGVuTGlicmFyeVdpdGhFeHRlbnNpb24pIHsKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gbGlicmFyeV9wYXRoKCk7CisKKyAgICAvLyB0ZXN0IGV4dGVuc2lvbiBhcHBlbmQKKyAgICBTY29wZWRTaGFyZWRMaWJyYXJ5IGxpYk5vRXh0ZW5zaW9uKFNoYXJlZExpYnJhcnk6Om9wZW4ocGF0aC5jX3N0cigpKSk7CisgICAgRVhQRUNUX1RSVUUobGliTm9FeHRlbnNpb24uZ2V0KCkpOworICAgIGxpYk5vRXh0ZW5zaW9uLnJlbGVhc2UoKTsKKworI2lmZGVmIF9XSU4zMgorICAgIHBhdGggKz0gIi5kbGwiOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgLy8gdHJ5IHRvIG9wZW4gdGhlIGxpYnJhcnkgd2l0aG91dCBhbiBleHRlbnNpb24KKworICAgIHBhdGggKz0gIi5keWxpYiI7CisjZWxzZQorICAgIHBhdGggKz0gIi5zbyI7CisjZW5kaWYKKworICAgIC8vIHRlc3Qgb3BlbiB3aXRoIHByZXBlbmRlZCBleHRlbnNpb24KKyAgICBTY29wZWRTaGFyZWRMaWJyYXJ5IGxpYihTaGFyZWRMaWJyYXJ5OjpvcGVuKHBhdGguY19zdHIoKSkpOworICAgIEVYUEVDVF9UUlVFKGxpYi5nZXQoKSk7Cit9CisKKyNpZmRlZiBfX0FQUExFX18KK1RFU1RfRihTaGFyZWRMaWJyYXJ5VGVzdCwgT3BlbkxpYnJhcnlXaXRob3V0RXh0ZW5zaW9uKSB7CisgICAgY29uc3QgY2hhciogbGlicmFyeSA9ICIvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9PcGVuR0wuZnJhbWV3b3JrL09wZW5HTCI7CisgICAgU2NvcGVkU2hhcmVkTGlicmFyeSBsaWIoU2hhcmVkTGlicmFyeTo6b3BlbihsaWJyYXJ5KSk7CisgICAgRVhQRUNUX1RSVUUobGliLmdldCgpKTsKK30KKyNlbmRpZgorCitURVNUX0YoU2hhcmVkTGlicmFyeVRlc3QsIEZpbmRTeW1ib2wpIHsKKyAgICBTY29wZWRTaGFyZWRMaWJyYXJ5IGxpYihTaGFyZWRMaWJyYXJ5OjpvcGVuKGxpYnJhcnlfcGF0aCgpKSk7CisgICAgRVhQRUNUX1RSVUUobGliLmdldCgpKTsKKworICAgIGlmIChsaWIuZ2V0KCkpIHsKKyAgICAgICAgdHlwZWRlZiBpbnQgKCpGb29GdW5jdGlvbikodm9pZCk7CisKKyAgICAgICAgRm9vRnVuY3Rpb24gZm9vX2Z1bmMgPSByZWludGVycHJldF9jYXN0PEZvb0Z1bmN0aW9uPigKKyAgICAgICAgICAgICAgICBsaWItPmZpbmRTeW1ib2woImZvb19mdW5jdGlvbiIpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZm9vX2Z1bmMpOworICAgICAgICBFWFBFQ1RfRVEoNDIsICgqZm9vX2Z1bmMpKCkpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zbWFydF9wdHIuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NtYXJ0X3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTkwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zbWFydF9wdHIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGVtdWdsIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBTbWFydFB0ciA9IHN0ZDo6c2hhcmVkX3B0cjxUPjsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zb2NrZXRzLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NvY2tldHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMWExYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zb2NrZXRzLmNwcApAQCAtMCwwICsxLDI0NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3NvY2tldHMuaCIKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdzMnRjcGlwLmg+CisjZWxzZQorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIHNvY2tldFNldERvbnRMaW5nZXIoaW50IHMpIHsKKyNpZmRlZiBfV0lOMzIKKyAgLy8gVE9ETzogVmVyaWZ5IGRlZmF1bHQgYmVoYXZpb3Igb24gV0lORE9XUworI2Vsc2UKKyAgICAvLyBVbmdyYWNlZnVsIHNodXRkb3duLCBubyByZWFzb24gdG8gbGluZ2VyIGF0IGFsbAorICAgIHN0cnVjdCBsaW5nZXIgc29fbGluZ2VyOworICAgIHNvX2xpbmdlci5sX29ub2ZmICA9IDE7CisgICAgc29fbGluZ2VyLmxfbGluZ2VyID0gMDsKKyAgICBpZihzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgJnNvX2xpbmdlciwgc2l6ZW9mIHNvX2xpbmdlcikgPCAwKQorICAgICAgcGVycm9yKCJTZXR0aW5nIHNvY2tldCBvcHRpb24gU09fTElOR0VSPXtvbiwgMH0gZmFpbGVkIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc29ja2V0U2V0UmV1c2VBZGRyZXNzKGludCBzKSB7CisjaWZkZWYgX1dJTjMyCisgICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9uIFdpbmRvd3MgaXMgZXF1aXZhbGVudCB0byBTT19SRVVTRUFERFIKKyAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIHNldCB0aGlzIG9wdGlvbi4gTW9yZW92ZXIsIG9uZSBzaG91bGQgbmV2ZXIKKyAgICAvLyBzZXQgdGhpcyBvcHRpb24gd2l0aCBXaW5Tb2NrIGJlY2F1c2UgaXQncyBiYWRseSBpbXBsZW1lbnRlZCBhbmQKKyAgICAvLyBnZW5lcmF0ZXMgYSBodWdlIHNlY3VyaXR5IGlzc3VlLiBTZWU6CisgICAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczc0MDYyMSh2PXZzLjg1KS5hc3B4CisjZWxzZQorICAgIGludCB2YWwgPSAxOworICAgIGlmKHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmdmFsLCBzaXplb2YodmFsKSkgPCAwKQorICAgICAgcGVycm9yKCJTZXR0aW5nIHNvY2tldCBvcHRpb24gU09fUkVVU0VBRERSIGZhaWxlZCIpOworI2VuZGlmCit9CisKKy8vIEhlbHBlciB1bmlvbiB0byBzdG9yZSBhIHNvY2tldCBhZGRyZXNzLgorc3RydWN0IFNvY2tBZGRyIHsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIHVuaW9uIHsKKyAgICAgICAgc29ja2FkZHIgZ2VuZXJpYzsKKyAgICAgICAgc29ja2FkZHJfaW4gaW5ldDsKKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIHNvY2thZGRyX3VuIGxvY2FsOworI2VuZGlmCisgICAgfTsKKworICAgIGludCBnZXRGYW1pbHkoKSBjb25zdCB7IHJldHVybiBnZW5lcmljLnNhX2ZhbWlseTsgfQorCisgICAgdm9pZCBpbml0RW1wdHkoKSB7CisgICAgICAgIDo6bWVtc2V0KHRoaXMsIDAsIHNpemVvZigqdGhpcykpOworICAgICAgICB0aGlzLT5sZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZigqdGhpcykpOworICAgIH0KKworICAgIGludCBpbml0RnJvbUluZXQodWludDMyX3QgaXBfYWRkcmVzcywgaW50IHBvcnQpIHsKKyAgICAgICAgaWYgKHBvcnQgPCAwIHx8IHBvcnQgPj0gNjU1MzYpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICA6Om1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgICAgICAgdGhpcy0+aW5ldC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgdGhpcy0+aW5ldC5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICB0aGlzLT5pbmV0LnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKGlwX2FkZHJlc3MpOworICAgICAgICB0aGlzLT5sZW4gPSBzaXplb2YodGhpcy0+aW5ldCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpbml0RnJvbUxvY2FsaG9zdChpbnQgcG9ydCkgeworICAgICAgICByZXR1cm4gaW5pdEZyb21JbmV0KDB4N2YwMDAwMDEsIHBvcnQpOworICAgIH0KKworI2lmbmRlZiBfV0lOMzIKKyAgICAvLyBJbml0aWFsaXplIHRoZSBTb2NrQWRkciBmcm9tIGEgVW5peCBwYXRoLiBSZXR1cm5zIDAgb24gc3VjY2VzcywKKyAgICAvLyBvciAtZXJybm8gY29kZSBvbiBmYWlsdXJlLgorICAgIGludCBpbml0RnJvbVVuaXhQYXRoKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICAgICAgaWYgKCFwYXRoIHx8ICFwYXRoWzBdKQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgc2l6ZV90IHBhdGhMZW4gPSA6OnN0cmxlbihwYXRoKTsKKyAgICAgICAgaWYgKHBhdGhMZW4gPj0gc2l6ZW9mKGxvY2FsLnN1bl9wYXRoKSkKKyAgICAgICAgICAgIHJldHVybiAtRTJCSUc7CisKKyAgICAgICAgOjptZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgICAgIHRoaXMtPmxvY2FsLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgICAgICAgOjptZW1jcHkodGhpcy0+bG9jYWwuc3VuX3BhdGgsIHBhdGgsIHBhdGhMZW4gKyAxVSk7CisgICAgICAgIHRoaXMtPmxlbiA9IHBhdGhMZW4gKyBvZmZzZXRvZihzb2NrYWRkcl91biwgc3VuX3BhdGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYKK307CisKK2ludCBzb2NrZXRCaW5kSW50ZXJuYWwoY29uc3QgU29ja0FkZHIqIGFkZHIsIGludCBzb2NrZXRUeXBlKSB7CisgICAgaW50IHMgPSA6OnNvY2tldChhZGRyLT5nZXRGYW1pbHkoKSwgc29ja2V0VHlwZSwgMCk7CisgICAgaWYgKHMgPCAwKSB7CisgICAgICAgIHBlcnJvcigiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQgdG8gYmluZCIpOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKworICAgIHNvY2tldFNldERvbnRMaW5nZXIocyk7CisgICAgc29ja2V0U2V0UmV1c2VBZGRyZXNzKHMpOworCisgICAgLy8gQmluZCB0byB0aGUgc29ja2V0LgorICAgIGlmICg6OmJpbmQocywgJmFkZHItPmdlbmVyaWMsIGFkZHItPmxlbikgPCAwIHx8CisgICAgICAgIDo6bGlzdGVuKHMsIDUpIDwgMCkgeworICAgICAgICBpbnQgcmV0ID0gLWVycm5vOworICAgICAgICBwZXJyb3IoIkNvdWxkIG5vdCBiaW5kIG9yIGxpc3RlbiB0byBzb2NrZXQiKTsKKyAgICAgICAgOjpjbG9zZShzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gczsKK30KKworaW50IHNvY2tldENvbm5lY3RJbnRlcm5hbChjb25zdCBTb2NrQWRkciogYWRkciwgaW50IHNvY2tldFR5cGUpIHsKKyAgICBpbnQgcyA9IDo6c29ja2V0KGFkZHItPmdldEZhbWlseSgpLCBzb2NrZXRUeXBlLCAwKTsKKyAgICBpZiAocyA8IDApIHsKKyAgICAgICAgcGVycm9yKCJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCB0byBjb25uZWN0Iik7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgc29ja2V0U2V0RG9udExpbmdlcihzKTsKKyAgICBzb2NrZXRTZXRSZXVzZUFkZHJlc3Mocyk7CisKKyAgICBpbnQgcmV0OworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gOjpjb25uZWN0KHMsICZhZGRyLT5nZW5lcmljLCBhZGRyLT5sZW4pOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICA6OmNsb3NlKHMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBzOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBzb2NrZXRUY3BEaXNhYmxlTmFnbGUoaW50IHMpIHsKKyAgICAvLyBkaXNhYmxlIE5hZ2xlIGFsZ29yaXRobSB0byBpbXByb3ZlIGJhbmR3aWR0aCBvZiBzbWFsbAorICAgIC8vIHBhY2tldHMgd2hpY2ggYXJlIHF1aXRlIGNvbW1vbiBpbiBvdXIgaW1wbGVtZW50YXRpb24uCisjaWZkZWYgX1dJTjMyCisgICAgRFdPUkQgIGZsYWc7CisjZWxzZQorICAgIGludCAgICBmbGFnOworI2VuZGlmCisgICAgZmxhZyA9IDE7CisgICAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCisgICAgICAgICAgICAgICAoY29uc3QgY2hhciopJmZsYWcsIHNpemVvZihmbGFnKSk7Cit9CisKK2ludCBzb2NrZXRHZXRQb3J0KGludCBzKSB7CisgICAgU29ja0FkZHIgYWRkcjsKKyAgICBhZGRyLmluaXRFbXB0eSgpOworICAgIGlmIChnZXRzb2NrbmFtZShzLCAmYWRkci5nZW5lcmljLCAmYWRkci5sZW4pIDwgMCkgeworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICBzd2l0Y2ggKGFkZHIuZ2VuZXJpYy5zYV9mYW1pbHkpIHsKKyAgICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICAgICAgcmV0dXJuIG50b2hzKGFkZHIuaW5ldC5zaW5fcG9ydCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICA7CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworfQorCisjaWZuZGVmIF9XSU4zMgoraW50IHNvY2tldExvY2FsU2VydmVyKGNvbnN0IGNoYXIqIHBhdGgsIGludCBzb2NrZXRUeXBlKSB7CisgICAgU29ja0FkZHIgYWRkcjsKKyAgICBpbnQgcmV0ID0gYWRkci5pbml0RnJvbVVuaXhQYXRoKHBhdGgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBzb2NrZXRCaW5kSW50ZXJuYWwoJmFkZHIsIHNvY2tldFR5cGUpOworfQorCitpbnQgc29ja2V0TG9jYWxDbGllbnQoY29uc3QgY2hhciogcGF0aCwgaW50IHNvY2tldFR5cGUpIHsKKyAgICBTb2NrQWRkciBhZGRyOworICAgIGludCByZXQgPSBhZGRyLmluaXRGcm9tVW5peFBhdGgocGF0aCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHNvY2tldENvbm5lY3RJbnRlcm5hbCgmYWRkciwgc29ja2V0VHlwZSk7Cit9CisjZW5kaWYgIC8vICFfV0lOMzIKKworaW50IHNvY2tldFRjcDRMb29wYmFja1NlcnZlcihpbnQgcG9ydCwgaW50IHNvY2tldFR5cGUpIHsKKyAgICBTb2NrQWRkciBhZGRyOworICAgIGludCByZXQgPSBhZGRyLmluaXRGcm9tTG9jYWxob3N0KHBvcnQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBzb2NrZXRCaW5kSW50ZXJuYWwoJmFkZHIsIHNvY2tldFR5cGUpOworfQorCitpbnQgc29ja2V0VGNwNExvb3BiYWNrQ2xpZW50KGludCBwb3J0LCBpbnQgc29ja2V0VHlwZSkgeworICAgIFNvY2tBZGRyIGFkZHI7CisgICAgaW50IHJldCA9IGFkZHIuaW5pdEZyb21Mb2NhbGhvc3QocG9ydCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIHNvY2tldENvbm5lY3RJbnRlcm5hbCgmYWRkciwgc29ja2V0VHlwZSk7Cit9CisKK2ludCBzb2NrZXRUY3BDbGllbnQoY29uc3QgY2hhciogaG9zdG5hbWUsIGludCBwb3J0LCBpbnQgc29ja2V0VHlwZSkgeworICAgIC8vIFRPRE8oZGlnaXQpOiBJbXBsZW1lbnQgdGhpcy4KKyAgICByZXR1cm4gLUVOT1NZUzsKK30KKworaW50IHNvY2tldEFjY2VwdChpbnQgc2VydmVyU29ja2V0KSB7CisgICAgaW50IHJldDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IDo6YWNjZXB0KHNlcnZlclNvY2tldCwgTlVMTCwgTlVMTCk7CisgICAgfSB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zb2NrZXRzLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zb2NrZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkY2RmOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3NvY2tldHMuaApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRU1VR0xfQ09NTU9OX1NPQ0tFVFNfSAorI2RlZmluZSBFTVVHTF9DT01NT05fU09DS0VUU19ICisKKy8vIEEgc2V0IG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBkZWFsIHdpdGggc29ja2V0cyBpbiBhIHBvcnRhYmxlIHdheS4KKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gRGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSBmb3Igc29ja2V0IGRlc2NyaXB0b3IgfHN8LiBUaGlzIGFzc3VtZXMKKy8vIHRoYXQgfHN8IGlzIGEgVENQIHNvY2tldCBkZXNjcmlwdG9yLgordm9pZCBzb2NrZXRUY3BEaXNhYmxlTmFnbGUoaW50IHMpOworCisvLyBSZXR1cm4gdGhlIHBvcnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gSVAgb3IgSVB2NiBzb2NrZXQsCisvLyBvciAtZXJybm8gY29kZSBvbiBmYWlsdXJlLgoraW50IHNvY2tldEdldFBvcnQoaW50IHMpOworCisvLyBCaW5kIHRvIGEgbG9jYWwvVW5peCBwYXRoLCBhbmQgcmV0dXJuIGl0cyBzb2NrZXQgZGVzY3JpcHRvciBvbiBzdWNjZXNzLAorLy8gb3IgLWVycm5vIGNvZGUgb24gZmFpbHVyZS4KK2ludCBzb2NrZXRMb2NhbFNlcnZlcihjb25zdCBjaGFyKiBwYXRoLCBpbnQgc29ja2V0VHlwZSk7CisKKy8vIENvbm5lY3QgdG8gYSBVbml4IGxvY2FsIHBhdGgsIGFuZCByZXR1cm4gYSBuZXcgc29ja2V0IGRlc2NyaXB0b3IKKy8vIG9uIHN1Y2Nlc3MsIG9yIC1lcnJubyBjb2RlIG9uIGZhaWx1cmUuCitpbnQgc29ja2V0TG9jYWxDbGllbnQoY29uc3QgY2hhciogcGF0aCwgaW50IHNvY2tldFR5cGUpOworCisvLyBCaW5kIHRvIGEgbG9jYWxob3N0IFRDUCBzb2NrZXQsIGFuZCByZXR1cm4gaXRzIHNvY2tldCBkZXNjcmlwdG9yIG9uCisvLyBzdWNjZXNzLCBvciAtZXJybm8gY29kZSBvbiBmYWlsdXJlLgoraW50IHNvY2tldFRjcDRMb29wYmFja1NlcnZlcihpbnQgcG9ydCwgaW50IHNvY2tldFR5cGUpOworCisvLyBDb25uZWN0IHRvIGEgbG9jYWxob3N0IFRDUCBwb3J0LCBhbmQgcmV0dXJuIGEgbmV3IHNvY2tldCBkZXNjcmlwdG9yIG9uCisvLyBzdWNjZXNzLCBvciAtZXJybm8gY29kZSBvbiBmYWlsdXJlLgoraW50IHNvY2tldFRjcDRMb29wYmFja0NsaWVudChpbnQgcG9ydCwgaW50IHNvY2tldFR5cGUpOworCisvLyBDb25uZWN0IHRvIGEgVENQIGhvc3QsIGFuZCByZXR1cm4gYSBuZXcgc29ja2V0IGRlc2NyaXB0b3Igb24KKy8vIHN1Y2Nlc3MsIG9yIC1lcnJubyBjb2RlIG9uIGZhaWx1cmUuCitpbnQgc29ja2V0VGNwQ2xpZW50KGNvbnN0IGNoYXIqIGhvc3RuYW1lLCBpbnQgcG9ydCwgaW50IHNvY2tldFR5cGUpOworCisvLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbi4gfHNlcnZlclNvY2tldHwgbXVzdCBiZSBhIGJvdW5kIHNlcnZlciBzb2NrZXQKKy8vIGRlc2NyaXB0b3IuIFJldHVybnMgbmV3IHNvY2tldCBkZXNjcmlwdG9yIG9uIHN1Y2Nlc3MsIG9yIC1lcnJubyBjb2RlCisvLyBvbiBmYWlsdXJlLgoraW50IHNvY2tldEFjY2VwdChpbnQgc2VydmVyU29ja2V0KTsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCisKKyNlbmRpZiAgLy8gRU1VR0xfQ09NTU9OX1NPQ0tFVFNfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3RyaW5ncGFyc2luZy5jcHAgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zdHJpbmdwYXJzaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2IzYWRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3RyaW5ncGFyc2luZy5jcHAKQEAgLTAsMCArMSwxODAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImVtdWdsL2NvbW1vbi9zdHJpbmdwYXJzaW5nLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8vIFJlcGxhY2VzIHxybXwgd2l0aCB8cmVwfCBpbiB8c3RyfC4KKy8vIEV4YW1wbGU6IHJtID0gImEiLCByZXAgPSAiYmIiLCBzdHIgPSAiYWJjZCIgcmV0dXJucyAiYmJiY2QiCitzdGQ6OnN0cmluZyByZXBsYWNlX3dpdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeworICAgIHN0ZDo6c3RyaW5nIHJlczsKKyAgICBzaXplX3QgcCA9IDA7CisgICAgd2hpbGUgKHAgPCBzdHIuc2l6ZSgpKSB7CisgICAgICAgIHNpemVfdCBtYXRjaF9wb3MgPSBzdHIuZmluZChybSwgIHApOworICAgICAgICBpZiAobWF0Y2hfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICByZXMuYXBwZW5kKHN0ci5zdWJzdHIocCwgbWF0Y2hfcG9zIC0gcCkpOworICAgICAgICAgICAgcmVzLmFwcGVuZChyZXApOworICAgICAgICAgICAgcCA9IG1hdGNoX3BvcyArIHJtLnNpemUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyLnN1YnN0cihwLCBzdHIuc2l6ZSgpIC0gcCkpOworICAgICAgICAgICAgcCA9IHN0ci5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gUmVtb3ZlcyBldmVyeXRoaW5nIGJldHdlZW4gImluIiBhbmQgIm91dCIgY2hhcmFjdGVycworLy8gaW5jbHVkaW5nIHRoZSBpbi9vdXQgY2hhcmFjdGVycyB0aGVtc2VsdmVzLgorLy8gT25seSBjYXJlcyBhYm91dCBmdWxsIG1hdGNoZXMuCisvLyBPbmx5IG9uZSBsZXZlbCBkZWVwLgorLy8gRXhhbXBsZTogc3JjID0gImEgKDEgMiliKDMpIiwKKy8vICAgICAgICAgIGluID0gIigiLCBvdXQgPSAiKSIKKy8vICAgICAgICAgIHJldHVybnMgImEgYiIKKy8vIEV4YW1wbGU6IHNyYyA9ICJhICgxIDIgKDMpKSIKKy8vICAgICAgICAgIGluID0gIigiLCBvdXQgPSAiKSIKKy8vICAgICAgICAgIHJldHVybnMgImEgKSIKK3N0ZDo6c3RyaW5nIHJlbW92ZV9pbl9vdXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpIHsKKyAgICBzdGQ6OnN0cmluZyByZXM7CisgICAgc2l6ZV90IHAgPSAwOworCisgICAgd2hpbGUgKHAgPCBzcmMuc2l6ZSgpKSB7CisgICAgICAgIGJvb2wgZm91bmRfbWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgc2l6ZV90IGluX3BvcyA9IHNyYy5maW5kKGluLCBwKTsKKyAgICAgICAgc2l6ZV90IG91dF9wb3M7CisgICAgICAgIGlmIChpbl9wb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIG91dF9wb3MgPSBzcmMuZmluZChvdXQsIGluX3BvcyArIGluLnNpemUoKSk7CisgICAgICAgICAgICBpZiAob3V0X3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIGZvdW5kX21hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmVyciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dF9wb3MgPSBzcmMuZmluZChvdXQsIHApOworICAgICAgICAgICAgaWYgKG91dF9wb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAqZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3JjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kX21hdGNoKSB7CisgICAgICAgICAgICByZXMuYXBwZW5kKHNyYy5zdWJzdHIocCwgaW5fcG9zIC0gcCkpOworICAgICAgICAgICAgcCA9IG91dF9wb3MgKyBvdXQuc2l6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzLmFwcGVuZChzcmMuc3Vic3RyKHAsIHNyYy5zaXplKCkgLSBwKSk7CisgICAgICAgICAgICBwID0gc3JjLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIElzb2xhdGVzIGV2ZXJ5dGhpbmcgYmV0d2VlbiAiaW4iIGFuZCAib3V0IiBjaGFyYWN0ZXJzLAorLy8gbm90IGluY2x1ZGluZyB0aGUgaW4vb3V0IGNoYXJhY3RlcnMgdGhlbXNlbHZlcy4KKy8vIE9ubHkgY2FyZXMgYWJvdXQgZnVsbCBtYXRjaGVzLgorLy8gT25seSBvbmUgbGV2ZWwgZGVlcC4KKy8vIEV4YW1wbGU6IHNyYyA9ICJhICgxIDIpYigzKSIsCisvLyAgICAgICAgICBpbiA9ICIoIiwgb3V0ID0gIikiCisvLyAgICAgICAgICByZXR1cm5zIHZlY3RvciB3aXRoIFsiMSAyIiwgIjMiXQorLy8gRXhhbXBsZTogc3JjID0gImEgKDEgMiAoMykpIgorLy8gICAgICAgICAgaW4gPSAiKCIsIG91dCA9ICIpIgorLy8gICAgICAgICAgcmV0dXJucyB2ZWN0b3Igd2l0aCBbIjEgMiAoMyJdCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaXNvbGF0ZV9pbl9vdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogZXJyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycl9yZXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICBzaXplX3QgcCA9IDA7CisKKyAgICB3aGlsZSAocCA8IHNyYy5zaXplKCkpIHsKKyAgICAgICAgYm9vbCBmb3VuZF9tYXRjaCA9IGZhbHNlOworICAgICAgICBzaXplX3QgaW5fcG9zID0gc3JjLmZpbmQoaW4sIHApOworICAgICAgICBzaXplX3Qgb3V0X3BvczsKKyAgICAgICAgaWYgKGluX3BvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgb3V0X3BvcyA9IHNyYy5maW5kKG91dCwgaW5fcG9zICsgaW4uc2l6ZSgpKTsKKyAgICAgICAgICAgIGlmIChvdXRfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgZm91bmRfbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soc3JjLnN1YnN0cihpbl9wb3MgKyBpbi5zaXplKCksIG91dF9wb3MgLSBpbl9wb3MgLSBpbi5zaXplKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmVyciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9yZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRfcG9zID0gc3JjLmZpbmQob3V0LCBwKTsKKyAgICAgICAgICAgIGlmIChvdXRfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgKmVyciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycl9yZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmRfbWF0Y2gpIHsKKyAgICAgICAgICAgIHAgPSBvdXRfcG9zICsgb3V0LnNpemUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAgPSBzcmMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gU3BsaXRzIGEgc3RyaW5nIHxzcmN8IGRlbGltaXRlZCBieSB8ZGVsaW18LgorLy8gRXhhbXBsZTogZGVsaW0gPSAiLCIsIHNyYyA9ICIxLDIsMyIKKy8vICAgICAgICAgIHJldHVybnMgdmVjdG9yIHdpdGggWyIxIiwiMiIsIjMiXQorc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWxpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc3JjKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlczsKKyAgICBjb25zdCBzaXplX3Qgbm90Zm91bmQgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICBzaXplX3QgZGVsaW1fc2l6ZSA9IGRlbGltLnNpemUoKTsKKyAgICBzaXplX3QgcCA9IDA7CisgICAgc2l6ZV90IGRlbGltX2xvYyA9IHNyYy5zaXplKCk7CisKKyAgICB3aGlsZSAocCA8IHNyYy5zaXplKCkpIHsKKyAgICAgICAgZGVsaW1fbG9jID0gc3JjLmZpbmQoZGVsaW0sIHApOworICAgICAgICBpZiAoZGVsaW1fbG9jICE9IG5vdGZvdW5kKSB7CisgICAgICAgICAgICByZXMucHVzaF9iYWNrKHNyYy5zdWJzdHIocCwgZGVsaW1fbG9jIC0gcCkpOworICAgICAgICAgICAgcCA9IGRlbGltX2xvYyArIGRlbGltX3NpemU7CisgICAgICAgICAgICBkZWxpbV9sb2MgPSBwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzLnB1c2hfYmFjayhzcmMuc3Vic3RyKHAsIHNyYy5zaXplKCkgLSBwKSk7CisgICAgICAgICAgICBwID0gc3JjLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIEF0dGVtcHRzIHRvIGZpbmQgYW55IHN0cmluZyBpbiB0b19maW5kIGluIHNyYy4KKy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hdGNoLCBvciBzdGQ6OnN0cmluZzo6bnBvcworLy8gRXhhbXBsZTogc3JjID0gImFiY2RlZiIsIHRvX2ZpbmQgPSBbImIiLCAiYyIsICJkIl0KKy8vICAgICAgICAgIHJldHVybnMgMworc2l6ZV90IG11bHRpX2ZpbmQoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgdG9fZmluZCkgeworCisgICAgc2l6ZV90IHJlcyA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9fZmluZC5zaXplKCk7IGkrKykgeworICAgICAgICBzaXplX3QgcCA9IHNyYy5maW5kKHRvX2ZpbmRbaV0pOworICAgICAgICBpZiAocCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgcmVzID0gcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3RyaW5ncGFyc2luZy5oIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3RyaW5ncGFyc2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjI4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zdHJpbmdwYXJzaW5nLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFJlcGxhY2VzIHxybXwgd2l0aCB8cmVwfCBpbiB8c3RyfC4KKy8vIEV4YW1wbGU6IHJtID0gImEiLCByZXAgPSAiYmIiLCBzdHIgPSAiYWJjZCIgcmV0dXJucyAiYmJiY2QiCitzdGQ6OnN0cmluZyByZXBsYWNlX3dpdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiByZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKy8vIFJlbW92ZXMgZXZlcnl0aGluZyBiZXR3ZWVuICJpbiIgYW5kICJvdXQiIGNoYXJhY3RlcnMKKy8vIGluY2x1ZGluZyB0aGUgaW4vb3V0IGNoYXJhY3RlcnMgdGhlbXNlbHZlcy4KKy8vIE9ubHkgY2FyZXMgYWJvdXQgZnVsbCBtYXRjaGVzLgorLy8gT25seSBvbmUgbGV2ZWwgZGVlcC4KKy8vICplcnIgPSB0cnVlIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyBwYXJzaW5nLAorLy8gaW4gd2hpY2ggY2FzZSB0aGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkLgorLy8gRXhhbXBsZTogc3JjID0gImEgKDEgMiliKDMpIiwKKy8vICAgICAgICAgIGluID0gIigiLCBvdXQgPSAiKSIKKy8vICAgICAgICAgIHJldHVybnMgImEgYiIKKy8vIEV4YW1wbGU6IHNyYyA9ICJhICgxIDIgKDMpKSIKKy8vICAgICAgICAgIGluID0gIigiLCBvdXQgPSAiKSIKKy8vICAgICAgICAgIHJldHVybnMgImEgKSIKK3N0ZDo6c3RyaW5nIHJlbW92ZV9pbl9vdXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpOworCisvLyBJc29sYXRlcyBldmVyeXRoaW5nIGJldHdlZW4gImluIiBhbmQgIm91dCIgY2hhcmFjdGVycywKKy8vIG5vdCBpbmNsdWRpbmcgdGhlIGluL291dCBjaGFyYWN0ZXJzIHRoZW1zZWx2ZXMuCisvLyBPbmx5IGNhcmVzIGFib3V0IGZ1bGwgbWF0Y2hlcy4KKy8vIE9ubHkgb25lIGxldmVsIGRlZXAuCisvLyAqZXJyID0gdHJ1ZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgcGFyc2luZywKKy8vIGluIHdoaWNoIGNhc2UgZW1wdHkgdmVjdG9yIGlzIHJldHVybmVkLgorLy8gRXhhbXBsZTogc3JjID0gImEgKDEgMiliKDMpIiwKKy8vICAgICAgICAgIGluID0gIigiLCBvdXQgPSAiKSIKKy8vICAgICAgICAgIHJldHVybnMgdmVjdG9yIHdpdGggWyIxIDIiLCAiMyJdCisvLyBFeGFtcGxlOiBzcmMgPSAiYSAoMSAyICgzKSkiCisvLyAgICAgICAgICBpbiA9ICIoIiwgb3V0ID0gIikiCisvLyAgICAgICAgICByZXR1cm5zIHZlY3RvciB3aXRoIFsiMSAyICgzIl0KK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpc29sYXRlX2luX291dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpOworCisvLyBTcGxpdHMgYSBzdHJpbmcgfHNyY3wgZGVsaW1pdGVkIGJ5IHxkZWxpbXwuCisvLyBFeGFtcGxlOiBkZWxpbSA9ICIsIiwgc3JjID0gIjEsMiwzIgorLy8gICAgICAgICAgcmV0dXJucyB2ZWN0b3Igd2l0aCBbIjEiLCIyIiwiMyJdCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcmIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMpOworCisvLyBBdHRlbXB0cyB0byBmaW5kIGFueSBzdHJpbmcgaW4gdG9fZmluZCBpbiBzcmMuCisvLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBtYXRjaCwgb3Igc3RkOjpzdHJpbmc6Om5wb3MKKy8vIEV4YW1wbGU6IHNyYyA9ICJhYmNkZWYiLCB0b19maW5kID0gWyJiIiwgImMiLCAiZCJdCisvLyAgICAgICAgICByZXR1cm5zIDMKK3NpemVfdCBtdWx0aV9maW5kKGNvbnN0IHN0ZDo6c3RyaW5nJiBzcmMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHRvX2ZpbmQpOworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zdHJpbmdwYXJzaW5nX3VuaXR0ZXN0LmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3N0cmluZ3BhcnNpbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZGY3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi9zdHJpbmdwYXJzaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiZW11Z2wvY29tbW9uL3N0cmluZ3BhcnNpbmcuaCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK25hbWVzcGFjZSBlbXVnbCB7CisKK1RFU1QoU3RyaW5nUGFyc2luZywgRW1wdHkpIHsKKyAgICBzdGQ6OnN0cmluZyBlOworICAgIHN0ZDo6c3RyaW5nIHJlcGxhY2VfcmVzID0gcmVwbGFjZV93aXRoKHN0ZDo6c3RyaW5nKCJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICBFWFBFQ1RfU1RSRVEoIiIsIHJlcGxhY2VfcmVzLmNfc3RyKCkpOworCisgICAgYm9vbCBlcnIgPSBmYWxzZTsKKyAgICBzdGQ6OnN0cmluZyByZW1vdmVfaW5vdXRfcmVzID0KKyAgICAgICAgcmVtb3ZlX2luX291dChlLCBlLCBlLCAmZXJyKTsKKyAgICBFWFBFQ1RfRkFMU0UoZXJyKTsKKworICAgIEVYUEVDVF9TVFJFUSgiIiwgcmVtb3ZlX2lub3V0X3Jlcy5jX3N0cigpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpc29sYXRlX2lub3V0X3JlcyA9CisgICAgICAgIGlzb2xhdGVfaW5fb3V0KGUsIGUsIGUsICZlcnIpOworICAgIEVYUEVDVF9GQUxTRShlcnIpOworCisgICAgRVhQRUNUX0VRKDAsIGlzb2xhdGVfaW5vdXRfcmVzLnNpemUoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3BsaXRfcmVzID0KKyAgICAgICAgc3BsaXQoZSwgZSk7CisgICAgRVhQRUNUX0VRKDAsIHNwbGl0X3Jlcy5zaXplKCkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0X25vbmVtcHR5X2RlbGltX3JlcyA9CisgICAgICAgIHNwbGl0KHN0ZDo6c3RyaW5nKCIoIiksIGUpOworICAgIEVYUEVDVF9FUSgwLCBzcGxpdF9yZXMuc2l6ZSgpKTsKK30KKworVEVTVChTdHJpbmdQYXJzaW5nLCBTaW1wbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBlKCJhIGIgKDEgMiAzKSAoNCA1KSAoNiA3KSIpOworICAgIHN0ZDo6c3RyaW5nIHJlcGxhY2VfcmVzID0gcmVwbGFjZV93aXRoKHN0ZDo6c3RyaW5nKCJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoImIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICBFWFBFQ1RfU1RSRVEoImIiLCByZXBsYWNlX3Jlcy5zdWJzdHIoMCwxKS5jX3N0cigpKTsKKworICAgIC8vIFJlcGxhY2Ugd2l0aCBzb21ldGhpbmcgbG9uZ2VyIHRoYW4gdGhlIHN0cmluZyBpdHNlbGYKKyAgICByZXBsYWNlX3JlcyA9IHJlcGxhY2Vfd2l0aChzdGQ6OnN0cmluZygiMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJhc2RmYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgRVhQRUNUX1NUUkVRKCJhIGIgKDEgYXNkZmFzZGZhc2RmYXNkZmFzZGZhc2RmYXNkZiAzKSAoNCA1KSAoNiA3KSIsCisgICAgICAgICAgICAgICAgIHJlcGxhY2VfcmVzLmNfc3RyKCkpOworCisKKyAgICBib29sIGVyciA9IGZhbHNlOworICAgIHN0ZDo6c3RyaW5nIHJlbW92ZV9pbm91dF9yZXMgPQorICAgICAgICByZW1vdmVfaW5fb3V0KGUsICIoIiwgIikiLCAmZXJyKTsKKyAgICBFWFBFQ1RfRkFMU0UoZXJyKTsKKyAgICBFWFBFQ1RfU1RSRVEoImEgYiAgICIsIHJlbW92ZV9pbm91dF9yZXMuY19zdHIoKSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaXNvbGF0ZV9pbm91dF9yZXMgPQorICAgICAgICBpc29sYXRlX2luX291dChlLCAiKCIsICIpIiwgJmVycik7CisgICAgRVhQRUNUX0ZBTFNFKGVycik7CisgICAgRVhQRUNUX0VRKDMsIGlzb2xhdGVfaW5vdXRfcmVzLnNpemUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxIDIgMyIsIGlzb2xhdGVfaW5vdXRfcmVzWzBdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiNCA1IiwgaXNvbGF0ZV9pbm91dF9yZXNbMV0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCI2IDciLCBpc29sYXRlX2lub3V0X3Jlc1syXS5jX3N0cigpKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzcGxpdF9yZXMgPQorICAgICAgICBzcGxpdCgiICIsIGUpOworICAgIEVYUEVDVF9FUSg5LCBzcGxpdF9yZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImEiLCBzcGxpdF9yZXNbMF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJiIiwgc3BsaXRfcmVzWzFdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiKDEiLCBzcGxpdF9yZXNbMl0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIyIiwgc3BsaXRfcmVzWzNdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiMykiLCBzcGxpdF9yZXNbNF0uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCIoNCIsIHNwbGl0X3Jlc1s1XS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIjUpIiwgc3BsaXRfcmVzWzZdLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUSgiKDYiLCBzcGxpdF9yZXNbN10uY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKCI3KSIsIHNwbGl0X3Jlc1s4XS5jX3N0cigpKTsKKworICAgIC8vIG11bHRpX2ZpbmQgcmV0dXJucyBwb3NpdGlvbiBvZiB0aGUgbGFzdCBvbmUKKyAgICBzaXplX3QgbWF0Y2hfcmVzID0gbXVsdGlfZmluZChlLCBzcGxpdF9yZXMpOworICAgIEVYUEVDVF9FUSgyMSwgbWF0Y2hfcmVzKTsKKworICAgIC8vIG11bHRpX2ZpbmQgcmV0dXJucyBzdGQ6OnN0cmluZzo6bnBvcworICAgIC8vIGlmIHRoZXJlIGFyZW4ndCBhbnkgbWF0Y2hlcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBub21hdGNoZXM7CisgICAgbm9tYXRjaGVzLnB1c2hfYmFjaygieyIpOworICAgIG5vbWF0Y2hlcy5wdXNoX2JhY2soIn0iKTsKKyAgICBub21hdGNoZXMucHVzaF9iYWNrKCI4Iik7CisgICAgbm9tYXRjaGVzLnB1c2hfYmFjaygiYXNkZiIpOworICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZzo6bnBvcywgbXVsdGlfZmluZChlLCBub21hdGNoZXMpKTsKKworICAgIC8vIFNwbGl0IHdpdGggdHJhaWxpbmcgZGVsaW1pdGVyCisgICAgc3BsaXRfcmVzID0gc3BsaXQoIiAiLCBzdGQ6OnN0cmluZygiMSAyIDMgIikpOworICAgIEVYUEVDVF9FUSgzLCBzcGxpdF9yZXMuc2l6ZSgpKTsKKworICAgIC8vIFNwbGl0IHdpdGggbXVsdGlwbGUgdHJhaWxpbmcgZGVsaW1pdGVycworICAgIHNwbGl0X3JlcyA9IHNwbGl0KCIgIiwgc3RkOjpzdHJpbmcoIjEgMiAzICAiKSk7CisgICAgRVhQRUNUX0VRKDQsIHNwbGl0X3Jlcy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgc3BsaXRfcmVzWzNdLmNfc3RyKCkpOworCisgICAgLy8gU3BsaXQgd2l0aCBtdWx0aXBsZSBkZWxpbWl0ZXJzCisgICAgc3BsaXRfcmVzID0gc3BsaXQoIiAiLCBzdGQ6OnN0cmluZygiMSAyICAzICAiKSk7CisgICAgRVhQRUNUX0VRKDUsIHNwbGl0X3Jlcy5zaXplKCkpOworICAgIEVYUEVDVF9TVFJFUSgiIiwgc3BsaXRfcmVzWzRdLmNfc3RyKCkpOworCisgICAgLy8gQ2FzZXMgd2hlcmUgd2UgZXhwZWN0IGVyciA9IHRydWU6CisgICAgLy8gMS4gT25seSBvbmUgbGV2ZWwgZGVlcCBpcyBzdXBwb3J0ZWQKKyAgICAvLyAyLiBQYXJ0aWFsIGluL291dCBtYXRjaGVzCisgICAgc3RkOjpzdHJpbmcgZjAoImEgYiAoMSAyIDMgKDQgNSkgKDYgNykpIik7CisgICAgc3RkOjpzdHJpbmcgZjEoIihhIGIiKTsKKyAgICBzdGQ6OnN0cmluZyBmMigiYSBiKSIpOworICAgCisgICAgZXJyID0gZmFsc2U7CisgICAgcmVtb3ZlX2lub3V0X3JlcyA9IHJlbW92ZV9pbl9vdXQoZjAsICIoIiwgIikiLCAmZXJyKTsKKyAgICBFWFBFQ1RfVFJVRShlcnIpOworICAgIEVYUEVDVF9TVFJFUShmMC5jX3N0cigpLCByZW1vdmVfaW5vdXRfcmVzLmNfc3RyKCkpOworCisgICAgZXJyID0gZmFsc2U7CisgICAgaXNvbGF0ZV9pbm91dF9yZXMgPSBpc29sYXRlX2luX291dChmMCwgIigiLCAiKSIsICZlcnIpOworICAgIEVYUEVDVF9UUlVFKGVycik7CisgICAgRVhQRUNUX0VRKDAsIGlzb2xhdGVfaW5vdXRfcmVzLnNpemUoKSk7CisKKyAgICBlcnIgPSBmYWxzZTsKKyAgICByZW1vdmVfaW5vdXRfcmVzID0gcmVtb3ZlX2luX291dChmMSwgIigiLCAiKSIsICZlcnIpOworICAgIEVYUEVDVF9UUlVFKGVycik7CisKKyAgICBlcnIgPSBmYWxzZTsKKyAgICBpc29sYXRlX2lub3V0X3JlcyA9IGlzb2xhdGVfaW5fb3V0KGYxLCAiKCIsICIpIiwgJmVycik7CisgICAgRVhQRUNUX1RSVUUoZXJyKTsKKworICAgIGVyciA9IGZhbHNlOworICAgIHJlbW92ZV9pbm91dF9yZXMgPSByZW1vdmVfaW5fb3V0KGYyLCAiKCIsICIpIiwgJmVycik7CisgICAgRVhQRUNUX1RSVUUoZXJyKTsKKworICAgIGVyciA9IGZhbHNlOworICAgIGlzb2xhdGVfaW5vdXRfcmVzID0gaXNvbGF0ZV9pbl9vdXQoZjIsICIoIiwgIikiLCAmZXJyKTsKKyAgICBFWFBFQ1RfVFJVRShlcnIpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3N5bmNfZGV2aWNlLmNwcCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3N5bmNfZGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2QyOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3luY19kZXZpY2UuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlICJzeW5jX2RldmljZS5oIgorCitzdGF0aWMgdWludDY0X3QgZGVmYXVsdENyZWF0ZVRpbWVsaW5lKCkgeyByZXR1cm4gMDsgfQorCitzdGF0aWMgaW50IGRlZmF1bHRDcmVhdGVGZW5jZSh1aW50NjRfdCB0aW1lbGluZSwgdWludDMyX3QgcHQpIHsKKyAgICAodm9pZCl0aW1lbGluZTsKKyAgICAodm9pZClwdDsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRUaW1lbGluZUluYyh1aW50NjRfdCB0aW1lbGluZSwgdWludDMyX3QgaG93bXVjaCkgeworICAgICh2b2lkKXRpbWVsaW5lOworICAgICh2b2lkKWhvd211Y2g7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0RGVzdHJveVRpbWVsaW5lKHVpbnQ2NF90IHRpbWVsaW5lKSB7CisgICAgKHZvaWQpdGltZWxpbmU7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0UmVnaXN0ZXJUcmlnZ2VyV2FpdChlbXVnbF9zeW5jX3RyaWdnZXJfd2FpdF90IGYpIHsKKyAgICAodm9pZClmOworICAgIHJldHVybjsKK30KKworc3RhdGljIGJvb2wgZGVmYXVsdERldmljZUV4aXN0cygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2VtdWdsX3N5bmNfY3JlYXRlX3RpbWVsaW5lX3QgZW11Z2xfc3luY19jcmVhdGVfdGltZWxpbmUgPSBkZWZhdWx0Q3JlYXRlVGltZWxpbmU7CitlbXVnbF9zeW5jX2NyZWF0ZV9mZW5jZV90IGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlID0gZGVmYXVsdENyZWF0ZUZlbmNlOworZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCBlbXVnbF9zeW5jX3RpbWVsaW5lX2luYyA9IGRlZmF1bHRUaW1lbGluZUluYzsKK2VtdWdsX3N5bmNfZGVzdHJveV90aW1lbGluZV90IGVtdWdsX3N5bmNfZGVzdHJveV90aW1lbGluZSA9IGRlZmF1bHREZXN0cm95VGltZWxpbmU7CitlbXVnbF9zeW5jX3JlZ2lzdGVyX3RyaWdnZXJfd2FpdF90IGVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0ID0gZGVmYXVsdFJlZ2lzdGVyVHJpZ2dlcldhaXQ7CitlbXVnbF9zeW5jX2RldmljZV9leGlzdHNfdCBlbXVnbF9zeW5jX2RldmljZV9leGlzdHMgPSBkZWZhdWx0RGV2aWNlRXhpc3RzOworCit2b2lkIHNldF9lbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZShlbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZV90IGYpIHsKKyAgICBlbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZSA9IGY7Cit9CisKK3ZvaWQgc2V0X2VtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlKGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlX3QgZikgeworICAgIGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlID0gZjsKK30KKwordm9pZCBzZXRfZW11Z2xfc3luY190aW1lbGluZV9pbmMoZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCBmKSB7CisgICAgZW11Z2xfc3luY190aW1lbGluZV9pbmMgPSBmOworfQorCit2b2lkIHNldF9lbXVnbF9zeW5jX2Rlc3Ryb3lfdGltZWxpbmUoZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lX3QgZikgeworICAgIGVtdWdsX3N5bmNfZGVzdHJveV90aW1lbGluZSA9IGY7Cit9CisKK3ZvaWQgc2V0X2VtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0KGVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0X3QgZikgeworICAgIGVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0ID0gZjsKK30KKwordm9pZCBzZXRfZW11Z2xfc3luY19kZXZpY2VfZXhpc3RzKGVtdWdsX3N5bmNfZGV2aWNlX2V4aXN0c190IGYpIHsKKyAgICBlbXVnbF9zeW5jX2RldmljZV9leGlzdHMgPSBmOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vc3luY19kZXZpY2UuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3N5bmNfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlYjJjMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3N5bmNfZGV2aWNlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoKKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJPcGVuZ2xSZW5kZXIvcmVuZGVyX2FwaV90eXBlcy5oIgorCitleHRlcm4gZW11Z2xfc3luY19jcmVhdGVfdGltZWxpbmVfdCBlbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZTsKK2V4dGVybiBlbXVnbF9zeW5jX2NyZWF0ZV9mZW5jZV90IGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlOworZXh0ZXJuIGVtdWdsX3N5bmNfdGltZWxpbmVfaW5jX3QgZW11Z2xfc3luY190aW1lbGluZV9pbmM7CitleHRlcm4gZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lX3QgZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lOworZXh0ZXJuIGVtdWdsX3N5bmNfcmVnaXN0ZXJfdHJpZ2dlcl93YWl0X3QgZW11Z2xfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXQ7CitleHRlcm4gZW11Z2xfc3luY19kZXZpY2VfZXhpc3RzX3QgZW11Z2xfc3luY19kZXZpY2VfZXhpc3RzOworCit2b2lkIHNldF9lbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZShlbXVnbF9zeW5jX2NyZWF0ZV90aW1lbGluZV90KTsKK3ZvaWQgc2V0X2VtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlKGVtdWdsX3N5bmNfY3JlYXRlX2ZlbmNlX3QpOwordm9pZCBzZXRfZW11Z2xfc3luY190aW1lbGluZV9pbmMoZW11Z2xfc3luY190aW1lbGluZV9pbmNfdCk7Cit2b2lkIHNldF9lbXVnbF9zeW5jX2Rlc3Ryb3lfdGltZWxpbmUoZW11Z2xfc3luY19kZXN0cm95X3RpbWVsaW5lX3QpOwordm9pZCBzZXRfZW11Z2xfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXQoZW11Z2xfc3luY19yZWdpc3Rlcl90cmlnZ2VyX3dhaXRfdCB0cmlnZ2VyX2ZuKTsKK3ZvaWQgc2V0X2VtdWdsX3N5bmNfZGV2aWNlX2V4aXN0cyhlbXVnbF9zeW5jX2RldmljZV9leGlzdHNfdCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90ZXN0aW5nL3Rlc3Rfc2hhcmVkX2xpYnJhcnkuY3BwIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vdGVzdGluZy90ZXN0X3NoYXJlZF9saWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OThhOTYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL3NoYXJlZC9lbXVnbC9jb21tb24vdGVzdGluZy90ZXN0X3NoYXJlZF9saWJyYXJ5LmNwcApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIFRoaXMgc291cmNlIGZpbGUgbXVzdCBiZSBjb21waWxlZCBpbnRvIGEgc2ltcGxlIHNoYXJlZCBsaWJyYXJ5IHdoaWNoCisvLyB3aWxsIGJlIHVzZWQgYnkgc2hhcmVkX2xpYnJhcnlfdW5pdHRlc3QuY3BwIHRvIHZlcmlmeSB0aGF0IHRoZQorLy8gZW11Z2w6OlNoYXJlZExpYnJhcnkgY2xhc3Mgd29ya3MgcHJvcGVybHkuCisKKworZXh0ZXJuICJDIiBpbnQgZm9vX2Z1bmN0aW9uKHZvaWQpIHsKKyAgICByZXR1cm4gNDI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90ZXN0aW5nL3Rlc3RfdGhyZWFkLmggYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90ZXN0aW5nL3Rlc3RfdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjOGU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3Rlc3RpbmcvdGVzdF90aHJlYWQuaApAQCAtMCwwICsxLDc4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRU1VR0xfQ09NTU9OX1RFU1RJTkdfVEVTVF9USFJFQURfSAorI2RlZmluZSBFTVVHTF9DT01NT05fVEVTVElOR19URVNUX1RIUkVBRF9ICisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOIDEKKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjICBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gVmVyeSBiYXNpYyBwbGF0Zm9ybSB0aHJlYWQgd3JhcHBlciB0aGF0IG9ubHkgdXNlcyBhIHRpbnkgc3RhY2suCisvLyBUaGlzIHNoYWxsIG9ubHkgYmUgdXNlZCBkdXJpbmcgdW5pdCB0ZXN0aW5nLCBhbmQgYWxsb3dzIHRlc3QgY29kZQorLy8gdG8gbm90IGRlcGVuZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgZW11Z2w6OlRocmVhZC4KK2NsYXNzIFRlc3RUaHJlYWQgeworcHVibGljOgorICAgIC8vIE1haW4gdGhyZWFkIGZ1bmN0aW9uIHR5cGUuCisgICAgdHlwZWRlZiB2b2lkKiAoVGhyZWFkRnVuY3Rpb24pKHZvaWQqIHBhcmFtKTsKKworICAgIC8vIENvbnN0cnVjdG9yIGFjdHVhbGx5IGxhdW5jaGVzIGEgbmV3IHBsYXRmb3JtIHRocmVhZC4KKyAgICBUZXN0VGhyZWFkKFRocmVhZEZ1bmN0aW9uKiBmdW5jLCB2b2lkKiBmdW5jUGFyYW0pIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgbVRocmVhZCA9IENyZWF0ZVRocmVhZChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Mzg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCBXSU5BUEkgKCopKHZvaWQqKSlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworI2Vsc2UKKyAgICAgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOworICAgICAgICBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRyLCAxNjM4NCk7CisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAgJmF0dHIsIGZ1bmMsIGZ1bmNQYXJhbSk7CisgICAgICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKyNlbmRpZgorICAgIH0KKworICAgIH5UZXN0VGhyZWFkKCkgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBDbG9zZUhhbmRsZShtVGhyZWFkKTsKKyNlbmRpZgorICAgIH0KKworICAgIHZvaWQgam9pbigpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChtVGhyZWFkLCBJTkZJTklURSk7CisjZWxzZQorICAgICAgICB2b2lkKiByZXQgPSBOVUxMOworICAgICAgICBwdGhyZWFkX2pvaW4obVRocmVhZCwgJnJldCk7CisjZW5kaWYKKyAgICB9CisKK3ByaXZhdGU6CisjaWZkZWYgX1dJTjMyCisgICAgSEFORExFIG1UaHJlYWQ7CisjZWxzZQorICAgIHB0aHJlYWRfdCBtVGhyZWFkOworI2VuZGlmCit9OworCit9ICAvLyBuYW1lc3BhY2UgZW11Z2wKKworI2VuZGlmICAvLyBFTVVHTF9DT01NT05fVEVTVElOR19URVNUX1RIUkVBRF9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90aHJlYWQuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNmJiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90aHJlYWQuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkLmgiCisKK25hbWVzcGFjZSBlbXVnbCB7CisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlRocmVhZDsKKworfSAgLy8gbmFtZXNwYWNlIGVtdWdsCmRpZmYgLS1naXQgYS9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90aHJlYWRfc3RvcmUuaCBiL2FuZHJvaWQvYW5kcm9pZC1lbXVnbC9zaGFyZWQvZW11Z2wvY29tbW9uL3RocmVhZF9zdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmFlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2FuZHJvaWQtZW11Z2wvc2hhcmVkL2VtdWdsL2NvbW1vbi90aHJlYWRfc3RvcmUuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3RocmVhZHMvVGhyZWFkU3RvcmUuaCIKKworbmFtZXNwYWNlIGVtdWdsIHsKKworLy8gTm9uLXRlbXBsYXRlZCBUaHJlYWRTdG9yZSBpbiBhbmRyb2lkOjpiYXNlIGlzIGFjdHVhbGx5IGNhbGxlZAorLy8gVGhyZWFkU3RvcmVCYXNlLCB3aGlsZSBhbmRyb2lkOjpiYXNlOjpUaHJlYWRTdG9yZSBpcyBhIHRlbXBsYXRlZCB2ZXJzaW9uCisvLyB3aGljaCBhdXRvLWNhc3RzIGFuZCBhdXRvLWRlbGV0ZXMgdGhlIHN0b3JlZCBkYXRhLgorLy8gVGhhdCdzIHdoeSBpdCdzIHByZWZlcnJlZCB0byB1c2UgYW5kcm9pZDo6YmFzZTo6VGhyZWFkU3RvcmU8PiBkaXJlY3RseSBvdmVyCisvLyB0aGUgZW11Z2w6OlRocmVhZFN0b3JlLgordXNpbmcgVGhyZWFkU3RvcmUgPSBhbmRyb2lkOjpiYXNlOjpUaHJlYWRTdG9yZUJhc2U7CisKK30gIC8vIG5hbWVzcGFjZSBlbXVnbApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9NYWtlZmlsZS5jb21tb24ubWsgYi9hbmRyb2lkL2J1aWxkL01ha2VmaWxlLmNvbW1vbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBkMzFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9NYWtlZmlsZS5jb21tb24ubWsKQEAgLTAsMCArMSwyMzMgQEAKK0JVSUxEX1RBUkdFVF9UQUcgOj0gJChCVUlMRF9UQVJHRVRfT1MpLSQoQlVJTERfVEFSR0VUX0FSQ0gpCisKKyMgQnVpbGQgbGliZXh0NF91dGlscyBhbmQgcmVsYXRlZCBtb2R1bGVzLworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvemxpYi5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGliY3VybC5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlidXVpZC5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlieG1sMi5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NvdXJjZXMubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc291cmNlcy5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9zb3VyY2VzLm1rCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NvdXJjZXMubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYmJyZWFrcGFkLm1rCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC90aGlyZF9wYXJ0eS9RdDUubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbGlianBlZy5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlicG5nLm1rCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc291cmNlcy5tYWtlCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L0FuZHJvaWQubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYkFOR0xFdHJhbnNsYXRpb24ubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L1Byb3RvYnVmLm1rCisKK2lmZXEgKHRydWUsJChCVUlMRF9CRU5DSE1BUktTKSkKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NvdXJjZXMubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3RoaXJkX3BhcnR5L2dvb2dsZS1iZW5jaG1hcmsvc291cmNlcy5taworZW5kaWYKKworRU1VTEFUT1JfVkVSU0lPTl9DRkxBR1MgOj0KKworQU5EUk9JRF9TREtfVE9PTFNfUkVWSVNJT04gOj0gJChzdHJpcCAkKEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OKSkKK2lmZGVmIEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OCisgICAgRU1VTEFUT1JfVkVSU0lPTl9DRkxBR1MgKz0gLURBTkRST0lEX1NES19UT09MU19SRVZJU0lPTj0kKEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OKQorZW5kaWYKKworQU5EUk9JRF9TREtfVE9PTFNfQlVJTERfTlVNQkVSIDo9ICQoc3RyaXAgJChBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIpKQoraWZkZWYgQU5EUk9JRF9TREtfVE9PTFNfQlVJTERfTlVNQkVSCisgICAgRU1VTEFUT1JfVkVSU0lPTl9DRkxBR1MgKz0gLURBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVI9JChBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIpCitlbmRpZgorCitFTVVMQVRPUl9DT01NT05fQ0ZMQUdTIDo9IC1XZXJyb3I9aW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KKworIyBJbmNsdWRlIHRoZSBlbXVsYXRvciB2ZXJzaW9uIGRlZmluaXRpb24gZnJvbSBNYWtlZmlsZS5jb21tb24ubWsKK0VNVUxBVE9SX0NPTU1PTl9DRkxBR1MgKz0gJChFTVVMQVRPUl9WRVJTSU9OX0NGTEFHUykKKworaWZlcSAodHJ1ZSwkKEJVSUxEX0RFQlVHKSkKKyAgICBFTVVMQVRPUl9DT01NT05fQ0ZMQUdTICs9IC1ERU5BQkxFX0RMT0c9MQorZWxzZQorICAgIEVNVUxBVE9SX0NPTU1PTl9DRkxBR1MgKz0gLURFTkFCTEVfRExPRz0wCitlbmRpZgorCitFTVVMQVRPUl9DUkFTSFVQTE9BRCA6PSAkKHN0cmlwICQoRU1VTEFUT1JfQ1JBU0hVUExPQUQpKQoraWZkZWYgRU1VTEFUT1JfQ1JBU0hVUExPQUQKKyAgICBFTVVMQVRPUl9DT01NT05fQ0ZMQUdTICs9IC1EQ1JBU0hVUExPQUQ9JChFTVVMQVRPUl9DUkFTSFVQTE9BRCkKK2VuZGlmCisKKyMgJChCVUlMRF9PQkpTX0RJUikvYnVpbGQgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIGNvbmZpZy1ob3N0LmgKKyMgJChnZW5lcmF0ZWQtcHJvdG8tc291cmNlcy1kaXIpIGlzIG5lZWRlZCB0byBhY2Nlc3MgZ2VuZXJhdGVkCisjIHByb3RvYnVmZiBoZWFkZXJzLgorRU1VTEFUT1JfQ09NTU9OX0lOQ0xVREVTIDo9IFwKKyAgICAkKEJVSUxEX09CSlNfRElSKS9idWlsZCBcCisgICAgJChnZW5lcmF0ZWQtcHJvdG8tc291cmNlcy1kaXIpIFwKKworRU1VR0xfU1JDRElSIDo9ICQoTE9DQUxfUEFUSCkvYW5kcm9pZC9hbmRyb2lkLWVtdWdsCitFTVVHTF9JTkNMVURFUyA6PSAkKEVNVUdMX1NSQ0RJUikvaG9zdC9pbmNsdWRlCitpZmVxICh0cnVlLCQoQlVJTERfRU1VR0xfUFJJTlRPVVQpKQorICAgIEVNVUdMX1VTRVJfQ0ZMQUdTIDo9IC1ET1BFTkdMX0RFQlVHX1BSSU5UT1VUCitlbHNlCisgICAgRU1VR0xfVVNFUl9DRkxBR1MgOj0KK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMKKyMjIyAgZ2VuLWh3LWNvbmZpZy1kZWZzOiBHZW5lcmF0ZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zIGhlYWRlcgorIyMjCisjIyMgIFRoZSAnZ2VuLWh3LWNvbmZpZy5weScgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGh3LWNvbmZpZy1kZWZzLmgKKyMjIyAgaGVhZGVyIGZyb20gdGhlIGFuIC5pbmkgZmlsZSBsaWtlIGFuZHJvaWQvYXZkL2hhcmR3YXJlLXByb3BlcnRpZXMuaW5pCisjIyMKKyMjIyAgRHVlIHRvIHRoZSB3YXkgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtIHdvcmtzLCB3ZSBuZWVkIHRvIHJlZ2VuZXJhdGUKKyMjIyAgaXQgZm9yIGVhY2ggbW9kdWxlICh0aGUgb3V0cHV0IHdpbGwgZ28gaW50byBhIG1vZHVsZS1zcGVjaWZpYyBkaXJlY3RvcnkpLgorIyMjCisjIyMgIFRoaXMgZGVmaW5lcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgaW5zaWRlIGEgbW9kdWxlIGRlZmluaXRpb24KKyMjIworIyMjICAkKGNhbGwgZ2VuLWh3LWNvbmZpZy1kZWZzKQorIyMjCisKKyMgRmlyc3QsIGRlZmluZSBhIHJ1bGUgdG8gZ2VuZXJhdGUgYSBkdW1teSAiZW11bGF0b3JfaHdfY29uZmlnX2RlZnMiIG1vZHVsZQorIyB3aGljaCBwdXJwb3NlIGlzIHNpbXBseSB0byBob3N0IHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGluIGl0cyBvdXRwdXQgZGlyZWN0b3J5LgoraW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCQoQlVJTERfVEFSR0VUX0JJVFMpLGVtdWxhdG9yX2h3X2NvbmZpZ19kZWZzKQorCitRRU1VX0hBUkRXQVJFX1BST1BFUlRJRVNfSU5JIDo9IFwKKyAgICAkKF9CVUlMRF9ST09UKS9hbmRyb2lkL2FuZHJvaWQtZW11L2FuZHJvaWQvYXZkL2hhcmR3YXJlLXByb3BlcnRpZXMuaW5pCisKK1FFTVVfSFdfQ09ORklHX0RFRlNfSCA6PSAkKGludGVybWVkaWF0ZXMpL2FuZHJvaWQvYXZkL2h3LWNvbmZpZy1kZWZzLmgKKyQoUUVNVV9IV19DT05GSUdfREVGU19IKTogUFJJVkFURV9QQVRIIDo9ICQoX0JVSUxEX1JPT1QpL2FuZHJvaWQvc2NyaXB0cworJChRRU1VX0hXX0NPTkZJR19ERUZTX0gpOiBQUklWQVRFX0NVU1RPTV9UT09MID0gJChQUklWQVRFX1BBVEgpL2dlbi1ody1jb25maWcucHkgJDwgJEAKKyQoUUVNVV9IV19DT05GSUdfREVGU19IKTogJChRRU1VX0hBUkRXQVJFX1BST1BFUlRJRVNfSU5JKSAkKFBSSVZBVEVfQ1VTVE9NX1RPT0wpCisJJChoaWRlKSBybSAtZiAkQAorCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCisKK1FFTVVfSFdfQ09ORklHX0RFRlNfSU5DTFVERVMgOj0gJChpbnRlcm1lZGlhdGVzKQorCisjIFNlY29uZCwgZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBjYWxsZWQgaW5zaWRlIGVhY2ggbW9kdWxlIHRoYXQgY29udGFpbnMKKyMgYSBzb3VyY2UgZmlsZSB0aGF0IGluY2x1ZGVzIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIGZpbGUuCitnZW4taHctY29uZmlnLWRlZnMgPSBcCisgICQoZXZhbCBMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKFFFTVVfSFdfQ09ORklHX0RFRlNfSCkpXAorICAkKGV2YWwgTE9DQUxfQ19JTkNMVURFUyArPSAkKFFFTVVfSFdfQ09ORklHX0RFRlNfSU5DTFVERVMpKQorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgIyBvbiBXaW5kb3dzLCBsaW5rIHRoZSBpY29uIGZpbGUgYXMgd2VsbCBpbnRvIHRoZSBleGVjdXRhYmxlCisgICMgdW5mb3J0dW5hdGVseSwgb3VyIGJ1aWxkIHN5c3RlbSBkb2Vzbid0IGhlbHAgdXMgbXVjaCwgc28gd2UgbmVlZAorICAjIHRvIHVzZSBzb21lIHdlaXJkIHBhdGhuYW1lcyB0byBtYWtlIHRoaXMgd29yay4uLgorCitXSU5EUkVTX0NQVV8zMiA6PSBpMzg2CitXSU5EUkVTX0NQVV82NCA6PSB4ODYtNjQKKworRU1VTEFUT1JfSUNPTl9PQkogOj0gJChCVUlMRF9PQkpTX0RJUikvYnVpbGQvZW11bGF0b3JfaWNvbiQoQlVJTERfVEFSR0VUX0JJVFMpLm8KKyQoRU1VTEFUT1JfSUNPTl9PQkopOiBQUklWQVRFX1RBUkdFVCA6PSAkKFdJTkRSRVNfQ1BVXyQoQlVJTERfVEFSR0VUX0JJVFMpKQorJChFTVVMQVRPUl9JQ09OX09CSik6ICQoTE9DQUxfUEFUSCkvYW5kcm9pZC9pbWFnZXMvZW11bGF0b3JfaWNvbi5yYworCUBlY2hvICJXaW5kcmVzICgkKFBSSVZBVEVfVEFSR0VUKSk6ICRAIgorCSQoaGlkZSkgJChCVUlMRF9UQVJHRVRfV0lORFJFUykgLS10YXJnZXQ9cGUtJChQUklWQVRFX1RBUkdFVCkgJDwgLUkgJChMT0NBTF9QQVRIKS9hbmRyb2lkL2ltYWdlcyAtbyAkQAorCisjIFVzYWdlOiAkKGV2YWwgJChjYWxsIGluc2VydC13aW5kb3dzLWljb24pKQorZGVmaW5lIGluc2VydC13aW5kb3dzLWljb24KKyAgICBMT0NBTF9QUkVCVUlMVF9PQkpfRklMRVMgKz0gJChFTVVMQVRPUl9JQ09OX09CSikKK2VuZGVmCisKK2VuZGlmICAjIEJVSUxEX1RBUkdFVF9PUyA9PSB3aW5kb3dzCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL2FuZHJvaWQtZW11L01ha2VmaWxlLmFuZHJvaWQtZW11Lm1rCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC9hbmRyb2lkLWVtdS9NYWtlZmlsZS5jcmFzaC1zZXJ2aWNlLm1rCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3FlbXUxL01ha2VmaWxlLnFlbXUxLWNvbW1vbi5taworCisjIFdlIHdhbnQgdG8gYnVpbGQgYWxsIHZhcmlhbnRzIG9mIHRoZSBlbXVsYXRvciBiaW5hcmllcy4gVGhpcyBtYWtlcworIyBpdCBlYXNpZXIgdG8gY2F0Y2ggdGFyZ2V0LXNwZWNpZmljIHJlZ3Jlc3Npb25zIGR1cmluZyBlbXVsYXRvciBkZXZlbG9wbWVudC4KK0VNVUxBVE9SX1RBUkdFVF9BUkNIIDo9IGFybQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvcWVtdTEvTWFrZWZpbGUucWVtdTEtdGFyZ2V0Lm1rCisKKyMgTm90ZTogdGhlIHNhbWUgYmluYXJ5IGhhbmRsZXMgeDg2IGFuZCB4ODZfNjQKK0VNVUxBVE9SX1RBUkdFVF9BUkNIIDo9IHg4NgoraW5jbHVkZSAkKExPQ0FMX1BBVEgpL2FuZHJvaWQvcWVtdTEvTWFrZWZpbGUucWVtdTEtdGFyZ2V0Lm1rCisKK0VNVUxBVE9SX1RBUkdFVF9BUkNIIDo9IG1pcHMKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9hbmRyb2lkL3FlbXUxL01ha2VmaWxlLnFlbXUxLXRhcmdldC5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjCisjIyMgIGVtdWxhdG9yOiBMQVVOQ0hFUiBGT1IgVEFSR0VULVNQRUNJRklDIEVNVUxBVE9SCisjIyMKKworIyBOT1RFOiBCdWlsZCBhcyAzMi1iaXQgb3IgNjQtYml0IGV4ZWN1dGFibGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKKyMgICAgICAgRU1VTEFUT1JfUFJPR1JBTV9CSVRORVNTLgoraWZlcSAoJChCVUlMRF9UQVJHRVRfQklUUyksJChFTVVMQVRPUl9QUk9HUkFNX0JJVE5FU1MpKQorICAgICQoY2FsbCBzdGFydC1lbXVsYXRvci1wcm9ncmFtLCBlbXVsYXRvcikKKworICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIGFuZHJvaWQvZW11bGF0b3IvbWFpbi1lbXVsYXRvci5jcHAgXAorCisgICAgIyBOZWVkZWQgdG8gY29tcGlsZSB0aGUgY2FsbCB0byBhbmRyb2lkUXRTZXR1cEVudigpIGluIG1haW4tZW11bGF0b3IuY3BwCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ09ORklHX1FUCisKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpCisKKyAgICAjIE5lZWQgdGhlIGJ1aWxkIG51bWJlciBhcyB3ZWxsCisgICAgTE9DQUxfQ0ZMQUdTICs9ICQoRU1VTEFUT1JfVkVSU0lPTl9DRkxBR1MpCisKKyAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICQoQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUykKKworICAgIExPQ0FMX0xETElCUyArPSAkKEFORFJPSURfRU1VX0xETElCUykKKworICAgICMgRW5zdXJlIHRoaXMgaXMgYWx3YXlzIGJ1aWx0LCBldmVuIGlmIDMyLWJpdCBiaW5hcmllcyBhcmUgZGlzYWJsZWQuCisgICAgTE9DQUxfSUdOT1JFX0JJVE5FU1MgOj0gdHJ1ZQorCisgICAgaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgJChldmFsICQoY2FsbCBpbnNlcnQtd2luZG93cy1pY29uKSkKKyAgICBlbmRpZgorCisgICAgIyBUbyBhdm9pZCBydW50aW1lIGxpbmtpbmcgaXNzdWVzIG9uIExpbnV4IGFuZCBXaW5kb3dzLCBhIGN1c3RvbSBjb3B5IG9mIHRoZQorICAgICMgQysrIHN0YW5kYXJkIGxpYnJhcnkgaXMgY29waWVkIHRvICQoQlVJTERfT0JKU19ESVIpL2xpYls2NF0sIGEgcGF0aCB0aGF0IGlzIGFkZGVkCisgICAgIyB0byB0aGUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGJ5IHRoZSB0b3AtbGV2ZWwgJ2VtdWxhdG9yJyBsYXVuY2hlcgorICAgICMgcHJvZ3JhbSBiZWZvcmUgaXQgc3Bhd25zIHRoZSBlbXVsYXRpb24gZW5naW5lLiBIb3dldmVyLCAnZW11bGF0b3InIGNhbm5vdAorICAgICMgdXNlIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5LCBzbyBzdGF0aWNhbGx5IGxpbmsgaXQgYWdhaW5zdCB0aGUKKyAgICAjIGV4ZWN1dGFibGUgaW5zdGVhZC4KKyAgICAkKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKQorCisgICAgJChjYWxsIGVuZC1lbXVsYXRvci1wcm9ncmFtKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjCisgICAgIyMjICBlbXVsYXRvci1jaGVjazogYSBzdGFuZGFsb25lIHF1ZXN0aW9uIGFuc3dlcmluZyBzZXJ2aWNlCisgICAgIyMjCisKKyAgICAkKGNhbGwgc3RhcnQtZW11bGF0b3ItcHJvZ3JhbSwgZW11bGF0b3ItY2hlY2spCisKKyAgICBMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBhbmRyb2lkL2VtdWxhdG9yLWNoZWNrL21haW4tZW11bGF0b3ItY2hlY2suY3BwIFwKKyAgICAgICAgYW5kcm9pZC9lbXVsYXRvci1jaGVjay9QbGF0Zm9ybUluZm8uY3BwIFwKKworICAgIExPQ0FMX0NfSU5DTFVERVMgKz0gJChBTkRST0lEX0VNVV9JTkNMVURFUykKKyAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9ICQoQU5EUk9JRF9FTVVfU1RBVElDX0xJQlJBUklFUykKKyAgICBMT0NBTF9MRExJQlMgOj0gJChBTkRST0lEX0VNVV9MRExJQlMpCisKKyAgICBMT0NBTF9JR05PUkVfQklUTkVTUyA6PSB0cnVlCisKKyAgICBpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICAgICAgJChldmFsICQoY2FsbCBpbnNlcnQtd2luZG93cy1pY29uKSkKKyAgICBlbmRpZgorCisgICAgaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGxpbnV4KQorICAgICAgICAjIEZvciBQbGF0Zm9ybUluZm8uY3BwCisgICAgICAgIExPQ0FMX0xETElCUyArPSAtbFgxMQorICAgIGVuZGlmCisKKyAgICAkKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKQorCisgICAgJChjYWxsIGVuZC1lbXVsYXRvci1wcm9ncmFtKQorZW5kaWYgICMgQlVJTERfVEFSR0VUX0JJVFMgPT0gRU1VTEFUT1JfUFJPR1JBTV9CSVRORVNTCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMKKyMjIyAgR1BVIGVtdWxhdGlvbiBsaWJyYXJpZXMKKyMjIworaW5jbHVkZSAkKEVNVUdMX1NSQ0RJUikvQW5kcm9pZC5taworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjCisjIyMgIFFFTVUyCisjIyMKK2lmZGVmIFFFTVUyX1RPUF9ESVIKK2luY2x1ZGUgJChRRU1VMl9UT1BfRElSKS9hbmRyb2lkLXFlbXUyLWdsdWUvYnVpbGQvTWFrZWZpbGUucWVtdTIubWsKK2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL01ha2VmaWxlLnRvcC5tayBiL2FuZHJvaWQvYnVpbGQvTWFrZWZpbGUudG9wLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWZlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL01ha2VmaWxlLnRvcC5tawpAQCAtMCwwICsxLDI4NiBAQAorTE9DQUxfUEFUSCA6PSAkKF9CVUlMRF9ST09UKQorCisjIFRoaXMgZGVmaW5lcyBFTVVMQVRPUl9CVUlMRF8zMkJJVFMgdG8gaW5kaWNhdGUgdGhhdCAzMi1iaXQgYmluYXJpZXMKKyMgbXVzdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbS4gRm9yIG5vdywgb25seSBmb3IgV2luZG93cyBiZWNhdXNlCisjIHRoZSBXaW42NCBkbyBub3Qgd29yayB5ZXQgcHJvcGVybHkgKGUuZy4gY2FuJ3QgZW11bGF0ZSAzMi1iaXQgQVJNKS4KKyMgVGhlIDMyLWJpdCBMaW51eCBiaW5hcmllcyBhcmUgb2Jzb2xldGUuCitFTVVMQVRPUl9CVUlMRF8zMkJJVFMgOj0gJChzdHJpcCAkKGZpbHRlciB3aW5kb3dzLCQoQlVJTERfVEFSR0VUX09TKSkpCisKKyMgVGhpcyBkZWZpbmVzIEVNVUxBVE9SX0JVSUxEXzY0QklUUyB0byBpbmRpY2F0ZSB0aGF0IDY0LWJpdCBiaW5hcmllcworIyBtdXN0IGJlIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQgc3lzdGVtLiBGb3Igbm93LCBvbmx5IGRvIGl0IGZvcgorIyBXaW5kb3dzLCBMaW51eCBhbmQgRGFyd2luLgorRU1VTEFUT1JfQlVJTERfNjRCSVRTIDo9ICQoc3RyaXAgJChmaWx0ZXIgbGludXggZGFyd2luIHdpbmRvd3MsJChCVUlMRF9UQVJHRVRfT1MpKSkKKworIyBFTVVMQVRPUl9QUk9HUkFNX0JJVE5FU1MgaXMgdGhlIGJpdG5lc3Mgb2YgdGhlICdlbXVsYXRvcicgbGF1bmNoZXIgcHJvZ3JhbS4KKyMgSXQgd2lsbCBiZSAzMiBpZiB3ZSBhbGxvdyAzMi1iaXQgYmluYXJpZXMgdG8gYmUgYnVpbHQsIDY0IG90aGVyd2lzZS4KK2lmbmVxICgsJChFTVVMQVRPUl9CVUlMRF8zMkJJVFMpKQorICAgIEVNVUxBVE9SX1BST0dSQU1fQklUTkVTUyA6PSAzMgorZWxzZQorICAgIEVNVUxBVE9SX1BST0dSQU1fQklUTkVTUyA6PSA2NAorZW5kaWYKKworIyBBIGZ1bmN0aW9uIHRoYXQgaW5jbHVkZXMgYSBmaWxlIG9ubHkgaWYgMzItYml0IGJpbmFyaWVzIGFyZSBuZWNlc3NhcnksCisjIG9yIGlmIExPQ0FMX0lHTk9SRV9CSVRORVNTIGlzIGRlZmluZWQgZm9yIHRoZSBjdXJyZW50IG1vZHVsZS4KKyMgJDE6IEJ1aWxkIGZpbGUgdG8gaW5jbHVkZS4KK2luY2x1ZGUtaWYtYml0bmVzcy0zMiA9IFwKKyAgICAkKGlmICQoc3RyaXAgJChMT0NBTF9JR05PUkVfQklUTkVTUykkKGZpbHRlciB0cnVlLCQoTE9DQUxfSE9TVF9CVUlMRCkpJChFTVVMQVRPUl9CVUlMRF8zMkJJVFMpKSxcCisgICAgICAgICQoZXZhbCBpbmNsdWRlICQxKSkKKworIyBBIGZ1bmN0aW9uIHRoYXQgaW5jbHVkZXMgYSBmaWxlIG9ubHkgb2YgRU1VTEFUT1JfQlVJTERfNjRCSVRTIGlzIG5vdCBlbXB0eS4KKyMgb3IgaWYgTE9DQUxfSUdOT1JFX0JJVE5FU1MgaXMgZGVmaW5lZCBmb3IgdGhlIGN1cnJlbnQgbW9kdWxlLgorIyAkMTogQnVpbGQgZmlsZSB0byBpbmNsdWRlLgoraW5jbHVkZS1pZi1iaXRuZXNzLTY0ID0gXAorICAgICQoaWYgJChzdHJpcCAkKExPQ0FMX0lHTk9SRV9CSVRORVNTKSQoZmlsdGVyIHRydWUsJChMT0NBTF9IT1NUX0JVSUxEKSkkKEVNVUxBVE9SX0JVSUxEXzY0QklUUykpLFwKKyAgICAgICAgJChldmFsIGluY2x1ZGUgJDEpKQorCitCVUlMRF9UQVJHRVRfQ0ZMQUdTIDo9IC1nIC1mYWxpZ24tZnVuY3Rpb25zCitpZmVxICgkKEJVSUxEX0RFQlVHKSx0cnVlKQorICAgIEJVSUxEX09QVF9DRkxBR1MgKz0gLU8wCitlbHNlCisgICAgQlVJTERfT1BUX0NGTEFHUyArPSAtTzMgLUROREVCVUc9MQorCisgICAgIyBXZSB1c2UgYSB2ZXJzaW9uIG9mIENsYW5nIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZXNlIHlldC4KKyAgICBpZm5lcSAoJChCVUlMRF9UQVJHRVRfT1MpLGRhcndpbikKKyAgICAgICAgQlVJTERfT1BUX0NGTEFHUyArPSAtZnVucm9sbC1sb29wcyAtZmx0byAtZnRyYWNlcgorICAgIGVuZGlmCitlbmRpZgorQlVJTERfVEFSR0VUX0NGTEFHUyArPSAkKEJVSUxEX09QVF9DRkxBR1MpCisKKyMgR2VuZXJhdGUgcG9zaXRpb24taW5kZXBlbmRlbnQgYmluYXJpZXMuIERvbid0IGFkZCAtZlBJQyB3aGVuIHRhcmdldHRpbmcKKyMgV2luZG93cywgYmVjYXVzZSBuZXdlciB0b29sY2hhaW4gY29tcGxhaW4gbG91ZGx5IGFib3V0IGl0LCBzaW5jZSBhbGwKKyMgV2luZG93cyBjb2RlIGlzIHBvc2l0aW9uLWluZGVwZW5kZW50LgoraWZuZXEgKHdpbmRvd3MsJChCVUlMRF9UQVJHRVRfT1MpKQorICBCVUlMRF9UQVJHRVRfQ0ZMQUdTICs9IC1mUElDCitlbmRpZgorCisjIEVuc3VyZSB0aGF0IDxpbnR0eXBlcy5oPiBhbHdheXMgZGVmaW5lcyBhbGwgaW50ZXJlc3RpbmcgbWFjcm9zLgorQlVJTERfVEFSR0VUX0NGTEFHUyArPSAtRF9fU1REQ19MSU1JVF9NQUNST1M9MSAtRF9fU1REQ19GT1JNQVRfTUFDUk9TPTEKKworIyBFbnN1cmUgd2UgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzLiBGb3IgdGhpcmQtcGFydHkgbGlicmFyaWVzLCB0aGlzIG11c3QKKyMgYmUgZGlzYWJsZWQgd2l0aCAtV25vLWVycm9yCitpZm5lcSAoLCQoZmlsdGVyIHdpbmRvd3MgbGludXgsICQoQlVJTERfVEFSR0VUX09TKSkpCitCVUlMRF9UQVJHRVRfQ0ZMQUdTICs9IC1XZXJyb3IKK2VuZGlmCisKKyMgVE9ETzogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgQnJlYWtwYWQgaGVhZGVycyBoYXZlIGJlZW4gZml4ZWQgdG8gbm90IHVzZQorIyAgICAgICBNU1ZDLXNwZWNpZmljICNwcmFnbWEgY2FsbHMuCitpZmVxICh3aW5kb3dzLCQoQlVJTERfVEFSR0VUX09TKSkKK0JVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLVduby11bmtub3duLXByYWdtYXMKK2VuZGlmCisKK0JVSUxEX1RBUkdFVF9DRkxBR1MzMiA6PQorQlVJTERfVEFSR0VUX0NGTEFHUzY0IDo9CisKK0JVSUxEX1RBUkdFVF9MRExJQlMgOj0KK0JVSUxEX1RBUkdFVF9MRExJQlMzMiA6PQorQlVJTERfVEFSR0VUX0xETElCUzY0IDo9CisKK0JVSUxEX1RBUkdFVF9MREZMQUdTIDo9CitCVUlMRF9UQVJHRVRfTERGTEFHUzMyIDo9CitCVUlMRF9UQVJHRVRfTERGTEFHUzY0IDo9CisKK2lmbmVxICgsJChCVUlMRF9TQU5JVElaRVIpKQorICAgIEJVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLWZzYW5pdGl6ZT0kKEJVSUxEX1NBTklUSVpFUikgLWczCisgICAgaWZlcSAoJChCVUlMRF9TQU5JVElaRVIpLGFkZHJlc3MpCisgICAgICAgIEJVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKKyAgICAgICAgQlVJTERfVEFSR0VUX0xERkxBR1MgKz0gLWxhc2FuCisgICAgZW5kaWYKKyAgICBpZmVxICgkKEJVSUxEX1NBTklUSVpFUiksdGhyZWFkKQorICAgICAgICBCVUlMRF9UQVJHRVRfTERGTEFHUyArPSAtbHRzYW4KKyAgICBlbmRpZgorZW5kaWYKKyMgRW5hYmxlIGxhcmdlLWZpbGUgc3VwcG9ydCAoaS5lLiBtYWtlIG9mZl90IGEgNjQtYml0IHZhbHVlKS4KKyMgRnVuIGZhY3Q6IFRoZSBtaW5ndzMyIHRvb2xjaGFpbiBzdGlsbCB1c2VzIDMyLWJpdCBvZmZfdCB2YWx1ZXMgYnkgZGVmYXVsdAorIyBldmVuIHdoZW4gZ2VuZXJhdGluZyBXaW42NCBiaW5hcmllcywgc28gbW9kaWZ5IE1ZX0NGTEFHUyBpbnN0ZWFkIG9mCisjIE1ZX0NGTEFHUzMyLgorQlVJTERfVEFSR0VUX0NGTEFHUyArPSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1EX0xBUkdFRklMRV9TT1VSQ0UKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGZyZWVic2QpCisgIEJVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLUkgL3Vzci9sb2NhbC9pbmNsdWRlCitlbmRpZgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgIyB3ZSBuZWVkIFdpbjMyIGZlYXR1cmVzIHRoYXQgYXJlIGF2YWlsYWJsZSBzaW5jZSBXaW5kb3dzIFZpc3RhIChOVCA2LjApCisgIEJVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLURXSU5WRVI9MHg2MDAgLURfV0lOMzJfV0lOTlQ9MHg2MDAKKyAgIyBMQVJHRUFERFJFU1NBV0FSRSBnaXZlcyBtb3JlIGFkZHJlc3Mgc3BhY2UgdG8gMzItYml0IHByb2Nlc3MKKyAgQlVJTERfVEFSR0VUX0xERkxBR1MzMiArPSAtWGxpbmtlciAtLWxhcmdlLWFkZHJlc3MtYXdhcmUKKyAgIyBoYXZlIGxpbmtlciBidWlsZCBidWlsZC1pZCBzZWN0aW9uIGZvciBzeW1ib2wgbG9va3VwIGluIGNyYXNoIHJlcG9ydGluZworICBCVUlMRF9UQVJHRVRfTERGTEFHUzMyICs9IC1YbGlua2VyIC0tYnVpbGQtaWQKKyAgQlVJTERfVEFSR0VUX0xERkxBR1M2NCArPSAtWGxpbmtlciAtLWJ1aWxkLWlkCitlbmRpZgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksZGFyd2luKQorICAgIEJVSUxEX1RBUkdFVF9DRkxBR1MgKz0gLURfREFSV0lOX0NfU09VUkNFPTEKKyAgICAjIENsYW5nIGNvbXBsYWlucyBhYm91dCB0aGlzIGZsYWcgYmVpbmcgbm90IHVzZWZ1bCBhbnltb3JlLgorICAgIEJVSUxEX1RBUkdFVF9DRkxBR1MgOj0gJChmaWx0ZXItb3V0IC1mYWxpZ24tZnVuY3Rpb25zLCQoQlVJTERfVEFSR0VUX0NGTEFHUykpCitlbmRpZgorCisjIE5PVEU6IFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIG9ubHkgdXNlZCBieSB0aGUgc3RhbmRhbG9uZSBidWlsZC4KK0JVSUxEX1RBUkdFVF9FWEVFWFQgOj0KK0JVSUxEX1RBUkdFVF9ETExFWFQgOj0gLnNvCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgQlVJTERfVEFSR0VUX0VYRUVYVCA6PSAuZXhlCisgIEJVSUxEX1RBUkdFVF9ETExFWFQgOj0gLmRsbAorZW5kaWYKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCisgIEJVSUxEX1RBUkdFVF9ETExFWFQgOj0gLmR5bGliCitlbmRpZgorCisjIFNvbWUgQ0ZMQUdTIGJlbG93IHVzZSAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIGJ1dCB0aGlzIGlzIG5vdAorIyBzdXBwb3J0ZWQgb24gR0NDIDMueCB3aGljaCBpcyBzdGlsbCBwcmVzZW50IHVuZGVyIEN5Z3dpbi4KKyMgRmluZCBvdXQgYnkgcHJvYmluZyBHQ0MgZm9yIHN1cHBvcnQgb2YgdGhpcyBmbGFnLiBOb3RlIHRoYXQgdGhlIHRlc3QKKyMgaXRzZWxmIG9ubHkgd29ya3Mgb24gR0NDIDQueCBhbnl3YXkuCitHQ0NfV19OT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSUyA6PSAtV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICBpZmVxICgsJChzaGVsbCBnY2MgLVEgLS1oZWxwPXdhcm5pbmdzIDI+L2Rldi9udWxsIHwgZ3JlcCBtaXNzaW5nLWZpZWxkLWluaXRpYWxpemVycykpCisgICAgICAgICQoaW5mbyBlbXVsYXRvcjogSWdub3JpbmcgdW5zdXBwb3J0ZWQgR0NDIGZsYWcgJChHQ0NfV19OT19NSVNTSU5HX0ZJRUxEX0lOSVRJQUxJWkVSUykpCisgICAgICAgIEdDQ19XX05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTIDo9CisgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAjIEVuc3VyZSB0aGF0IHByaW50ZigpIGV0IGFsIHVzZSBHTlUgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXJzIGFzIHJlcXVpcmVkCisgICMgYnkgUUVNVS4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiB1c2luZyB0aGUgbmV3ZXIgTWluZ3c2NCBjcm9zcy10b29sY2hhaW4uCisgICMgU2VlIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvYXBwcy90cmFjL21pbmd3LXc2NC93aWtpL2dudSUyMHByaW50ZgorICBCVUlMRF9UQVJHRVRfQ0ZMQUdTICs9IC1EX19VU0VfTUlOR1dfQU5TSV9TVERJTz0xCitlbmRpZgorCisjIEVuYWJsZSB3YXJuaW5nLCBleGNlcHQgdGhvc2UgcmVsYXRlZCB0byBtaXNzaW5nIGZpZWxkIGluaXRpYWxpemVycworIyAodGhlIFFFTVUgY29kaW5nIHN0eWxlIGxvdmVzIHVzaW5nIHRoZXNlKS4KKyMgQWxzbyBkaXNhYmxlIHRoZSBzdHJpY3Qgb3ZlcmZsb3cgY2hlY2tpbmcsIGFzIEdDQyBzb21ldGltZXMgaW5saW5lcyBzbyBtdWNoCisjIHdpdGggTFRPIGVuYWJsZWQgdGhhdCBpdCBmaW5kcyBzb21lIGNvbXBhcmlzb25zIHRvIGJlY29tZSBhICsgYiA8IGEganVzdAorIyBiZWNhdXNlIG9mIGlubGluaW5nLCB3aXRoIG5vIG9yaWdpbmFsIHJlbHlpbmcgb24gdGhlIG92ZXJmbG93IGF0IGFsbC4KKyMKK0JVSUxEX1RBUkdFVF9DRkxBR1MgKz0gXAorICAgIC1XYWxsICQoR0NDX1dfTk9fTUlTU0lOR19GSUVMRF9JTklUSUFMSVpFUlMpIC1Xbm8tc3RyaWN0LW92ZXJmbG93CisKK0JVSUxEX1RBUkdFVF9DWFhGTEFHUyA6PSAtV25vLWludmFsaWQtb2Zmc2V0b2YKKworIyBOZWVkZWQgdG8gYnVpbGQgYmxvY2suYyBvbiBMaW51eC94ODZfNjQuCitCVUlMRF9UQVJHRVRfQ0ZMQUdTICs9IC1EX0dOVV9TT1VSQ0U9MQorCisjIEEgdXNlZnVsIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RhcnQgdGhlIGRlY2xhcmF0aW9uIG9mIGEgaG9zdAorIyBtb2R1bGUuIEF2b2lkcyByZXBlYXRpbmcgdGhlIHNhbWUgc3R1ZmYgYWdhaW4gYW5kIGFnYWluLgorIyBVc2FnZToKKyMKKyMgICQoY2FsbCBzdGFydC1lbXVsYXRvci1saWJyYXJ5LCA8bW9kdWxlLW5hbWU+KQorIworIyAgLi4uIGRlY2xhcmF0aW9ucworIworIyAgJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorIworc3RhcnQtZW11bGF0b3ItbGlicmFyeSA9IFwKKyAgICAkKGV2YWwgaW5jbHVkZSAkKENMRUFSX1ZBUlMpKSBcCisgICAgJChldmFsIExPQ0FMX01PRFVMRSA6PSAkMSkgXAorICAgICQoZXZhbCBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gU1RBVElDX0xJQlJBUklFUykgXAorICAgICQoZXZhbCBMT0NBTF9CVUlMRF9GSUxFIDo9ICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkpCisKKyMgVXNlZCB3aXRoIHN0YXJ0LWVtdWxhdG9yLWxpYnJhcnkKK2VuZC1lbXVsYXRvci1saWJyYXJ5ID0gXAorICAgICQoZXZhbCAkKGVuZC1lbXVsYXRvci1tb2R1bGUtZXYpKSBcCisKK2RlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5ID0gXAorICAgICQoY2FsbCBzdGFydC1lbXVsYXRvci1saWJyYXJ5LCQxKSBcCisgICAgJChldmFsIExPQ0FMX0JVSUxEX0ZJTEUgOj0gJChQUkVCVUlMVF9TVEFUSUNfTElCUkFSWSkpIFwKKyAgICAkKGV2YWwgTE9DQUxfU1JDX0ZJTEVTIDo9ICQyKSBcCisgICAgJChldmFsICQoZW5kLWVtdWxhdG9yLW1vZHVsZS1ldikpIFwKKworIyBBIHZhcmlhbnQgb2Ygc3RhcnQtZW11bGF0b3ItbGlicmFyeSB0byBzdGFydCB0aGUgZGVmaW5pdGlvbiBvZiBhIGhvc3QKKyMgcHJvZ3JhbSBpbnN0ZWFkLiBVc2Ugd2l0aCBlbmQtZW11bGF0b3ItcHJvZ3JhbQorc3RhcnQtZW11bGF0b3ItcHJvZ3JhbSA9IFwKKyAgICAkKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSwkMSkgXAorICAgICQoZXZhbCBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVhFQ1VUQUJMRVMpIFwKKyAgICAkKGV2YWwgTE9DQUxfQlVJTERfRklMRSA6PSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkpCisKKyMgQSB2YXJpZW50IG9mIGVuZC1lbXVsYXRvci1saWJyYXJ5IGZvciBob3N0IHByb2dyYW1zIGluc3RlYWQKK2VuZC1lbXVsYXRvci1wcm9ncmFtID0gXAorICAgICQoZXZhbCBMT0NBTF9MRExJQlMgKz0gJChRRU1VX1NZU1RFTV9MRExJQlMpKSBcCisgICAgJChldmFsICQoZW5kLWVtdWxhdG9yLW1vZHVsZS1ldikpIFwKKworIyBBIHZhcmlhbnQgb2Ygc3RhcnQtZW11bGF0b3ItcHJvZ3JhbSB0aGF0IGFsc28gbGlua3MgdGhlIEdvb2dsZSBCZW5jaG1hcmsKKyMgbGlicmFyeSB0byB0aGUgZmluYWwgcHJvZ3JhbS4gVXNlIHdpdGggZW5kLWVtdWxhdG9yLWJlbmNobWFyay4KKyMgTk9URTogVGhlc2UgYXJlIF9ub3RfIGNvbXBpbGVkIGJ5IGRlZmF1bHQsIHVubGVzcyBCVUlMRF9CRU5DSE1BUktTIGlzCisjIHNldCB0byAndHJ1ZScsIHdoaWNoIGhhcHBlbnMgaXMgeW91IGNhbGwgYW5kcm9pZC9jb25maWd1cmUuc2ggd2l0aCB0aGUKKyMgLS1iZW5jaG1hcmtzIG9wdGlvbi4KK3N0YXJ0LWVtdWxhdG9yLWJlbmNobWFyayA9IFwKKyAgJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sJDEpCisKKyMgQSB2YXJpYW50IG9mIGVuZC1lbXVsYXRvci1wcm9ncmFtIGZvciBob3N0IGJlbmNobWFyayBwcm9ncmFtcyBpbnN0ZWFkLgorZW5kLWVtdWxhdG9yLWJlbmNobWFyayA9IFwKKyAgJChldmFsIExPQ0FMX0NfSU5DTFVERVMgKz0gJCQoR09PR0xFX0JFTkNITUFSS19JTkNMVURFUykpIFwKKyAgJChldmFsIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gJCQoR09PR0xFX0JFTkNITUFSS19TVEFUSUNfTElCUkFSSUVTKSkgXAorICAkKGV2YWwgTE9DQUxfTERMSUJTICs9ICQkKEdPT0dMRV9CRU5DSE1BUktfTERMSUJTKSkgXAorICAkKGNhbGwgbG9jYWwtbGluay1zdGF0aWMtYysrbGliKSBcCisgICQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxEX0JFTkNITUFSS1MpKSwkKGNhbGwgZW5kLWVtdWxhdG9yLXByb2dyYW0pKQorCitkZWZpbmUgZW5kLWVtdWxhdG9yLW1vZHVsZS1ldgorTE9DQUxfQklUUyA6PSAkJChCVUlMRF9UQVJHRVRfQklUUykKK2luY2x1ZGUgJCQoTE9DQUxfQlVJTERfRklMRSkKK2VuZGVmCisKKyMgVGhlIGNvbW1vbiBsaWJyYXJpZXMKKyMKK1FFTVVfU1lTVEVNX0xETElCUyA6PSAtbG0KK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICBRRU1VX1NZU1RFTV9MRExJQlMgKz0gLW13aW5kb3dzIC1tY29uc29sZQorZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGZyZWVic2QpCisgICAgUUVNVV9TWVNURU1fTERMSUJTICs9IC1ML3Vzci9sb2NhbC9saWIgLWxwdGhyZWFkIC1sWDExIC1sdXRpbAorZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGxpbnV4KQorICBRRU1VX1NZU1RFTV9MRExJQlMgKz0gLWx1dGlsIC1scnQKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAjIGFtZDY0LW1pbmd3MzJtc3ZjLSB0b29sY2hhaW4gc3RpbGwgbmFtZSBpdCB3czJfMzIuICBNYXkgY2hhbmdlIGl0IG9uY2UgYW1kNjQtbWluZ3czMm1zdmMtCisgICMgaXMgc3RhYmlsaXplZAorICBRRU1VX1NZU1RFTV9MRExJQlMgKz0gLWx3aW5tbSAtbHdzMl8zMiAtbGlwaGxwYXBpCitlbHNlCisgIFFFTVVfU1lTVEVNX0xETElCUyArPSAtbHB0aHJlYWQKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCisgIFFFTVVfU1lTVEVNX0ZSQU1FV09SS1MgOj0gXAorICAgICAgQXVkaW9Vbml0IFwKKyAgICAgIEFWRm91bmRhdGlvbiBcCisgICAgICBDb2NvYSBcCisgICAgICBDb3JlQXVkaW8gXAorICAgICAgQ29yZU1lZGlhIFwKKyAgICAgIENvcmVWaWRlbyBcCisgICAgICBGb3JjZUZlZWRiYWNrIFwKKyAgICAgIElPS2l0IFwKKyAgICAgIFFUS2l0IFwKKworICBRRU1VX1NZU1RFTV9MRExJQlMgKz0gJChRRU1VX1NZU1RFTV9GUkFNRVdPUktTOiU9LVdsLC1mcmFtZXdvcmssJSkKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCisgICAgQ1hYX1NURF9MSUIgOj0gLWxjKysKK2Vsc2UKKyAgICBDWFhfU1REX0xJQiA6PSAtbHN0ZGMrKworZW5kaWYKKworaWZkZWYgRU1VTEFUT1JfQlVJTERfMzJCSVRTCitCVUlMRF9UQVJHRVRfQklUUyA6PSAzMgorQlVJTERfVEFSR0VUX0FSQ0ggOj0geDg2CitCVUlMRF9UQVJHRVRfU1VGRklYIDo9CitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC9idWlsZC9NYWtlZmlsZS5jb21tb24ubWsKK2VuZGlmCisKK2lmZGVmIEVNVUxBVE9SX0JVSUxEXzY0QklUUworQlVJTERfVEFSR0VUX0JJVFMgOj0gNjQKK0JVSUxEX1RBUkdFVF9BUkNIIDo9IHg4Nl82NAorQlVJTERfVEFSR0VUX1NVRkZJWCA6PSA2NAorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvYW5kcm9pZC9idWlsZC9NYWtlZmlsZS5jb21tb24ubWsKK2VuZGlmCisKKyQoZm9yZWFjaCBwcmVidWlsdF9wYWlyLCQoUFJFQlVJTFRfUEFUSF9QQUlSUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGluc3RhbGwtcHJlYnVpbHQsICQocHJlYnVpbHRfcGFpcikpKSkKKworJChmb3JlYWNoIHByZWJ1aWx0X3N5bV9wYWlyLCQoUFJFQlVJTFRfU1lNUEFUSF9QQUlSUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGluc3RhbGwtcHJlYnVpbHQtc3ltbGluaywgJChwcmVidWlsdF9zeW1fcGFpcikpKSkKKworIyMgVk9JTEEhIQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9SRUFETUUgYi9hbmRyb2lkL2J1aWxkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ViYmYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgbWFueSBNYWtlZmlsZSBidWlsZCBzY3JpcHRzIHRoYXQgaW1wbGVtZW50Cit0aGUgQW5kcm9pZCBlbXVsYXRvcidzIGJ1aWxkIHN5c3RlbS4gVGhpcyBpcyBoZWF2aWx5IGluc3BpcmVkIGZyb20KK3RoZSBBbmRyb2lkIHBsYXRmb3JtIGJ1aWxkIHN5c3RlbSwgYW5kIHRoZSBOREsgYnVpbGQgc3lzdGVtcy4KKworVGhlIG1haW4gZ29hbCBpcyB0byBtYWtlIHRoZSAubWsgZmlsZXMgZGVzY3JpYmluZyBhbGwgbW9kdWxlcyBhbmQgdGhlaXIKK2RlcGVuZGVuY2llcyBzaW1wbGUgdG8gd3JpdGUuIFRoaXMgbW92ZXMgaG93ZXZlciBhIGxvdCBvZiBjb21wbGV4aXR5IGludG8KK3RoZSBidWlsZCBzeXN0ZW0uIEZvciBleGFtcGxlLCBpdCBtdXN0IGJlIGNhcGFibGUgb2YgcGVyZm9ybWluZyBhIHRvcG9sb2dpY2FsCitzb3J0IG9mIGFsbCBtb2R1bGVzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8gcHJvcGVybHkgcGVyZm9ybSBleHBvcnRzLgorCitUaGUgc3ViLWRpcmVjdG9yaWVzIGhlcmUgYXJlOgorCisgIGdtc2wvICAgVGhlIEdOVSBNYWtlIFN0YW5kYXJkIExpYnJhcnkgKGh0dHA6Ly9nbXNsLnNvdXJjZWZvcmdlLm5ldC8pLgorICAgICAgICAgIFRoaXMgcHJvdmlkZXMgbWFueSB1c2VmdWwgZnVuY3Rpb24gdG8gc2ltcGxpZnkgdGhlIGxpZmUgb2YKKyAgICAgICAgICBNYWtlZmlsZSBwcm9ncmFtbWVycy4KKworICBjb3JlLyAgIENvcmUgYnVpbGQgc3lzdGVtIGluZnJhc3RydWN0dXJlIHNjcmlwdHMuIFRoZXNlIGFyZSB2ZXJ5IGdlbmVyaWMgYW5kCisgICAgICAgICAgZG8gbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBzaG91bGQgYmUgc3BlY2lmaWMgdG8gYnVpbGRpbmcgZW11bGF0b3IKKyAgICAgICAgICBiaW5hcmllcy4KKworICBhd2svICAgIEEgZmV3IGF3ayBzY3JpcHRzIHVzZWQgYnkgdGhlIGJ1aWxkIHN5c3RlbSwgZXNwZWNpYWxseSB0byBzdXBwb3J0CisgICAgICAgICAgYnVpbGRpbmcgb24gQ3lnd2luLiBXaGlsZSB0aGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBub3csCisgICAgICAgICAgdGhpcyBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgTkRLIGJ1aWxkIHN5c3RlbSwgYW5kIG1heSBhbGxvdyB1cyB0bworICAgICAgICAgIGJ1aWxkIHRoZSBlbXVsYXRvciBkaXJlY3RseSBvbiBXaW5kb3dzIGluIHRoZSBmdXR1cmUuCisKKyAgZW11bGF0b3IvICBUaGVzZSBidWlsZCBzY3JpcHRzIGNvbnRhaW4gYWxsIGluc3RydWN0aW9ucyBzcGVjaWZpYyB0byBidWlsZGluZworICAgICAgICAgICAgIGVtdWxhdG9yIGJpbmFyaWVzLgorCitUaGUgdG9wLWxldmVsIEdOVW1ha2VmaWxlIHNob3VsZCBpbmNsdWRlIGFuZHJvaWQvYnVpbGQvZW11bGF0b3IvbWFpbi5tayB3aGljaAord2lsbCBpbmNsdWRlIGFsbCBvdGhlciBmaWxlcyBpbiB0aGUgY29ycmVjdCBvcmRlciwgdGhlbiBwYXJzZSB0aGUgdG9wLWxldmVsCitwcm9qZWN0IGJ1aWxkIGZpbGVzLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9hd2svY2hlY2stYXdrLmF3ayBiL2FuZHJvaWQvYnVpbGQvYXdrL2NoZWNrLWF3ay5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMGJjOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvYXdrL2NoZWNrLWF3ay5hd2sKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNoZWNrIHRoYXQgYSBnaXZlbiBhd2sgZXhlY3V0YWJsZQorIyBpbXBsZW1lbnRzIHRoZSBtYXRjaCgpIGFuZCBzdWJzdHIoKSBmdW5jdGlvbnMgYXBwcm9wcmlhdGVseS4KKyMKKyMgVGhlc2Ugd2VyZSBpbnRyb2R1Y2VkIGluIG5hd2svZ2F3aywgYnV0IHRoZSBvcmlnaW5hbCBhd2sKKyMgZG9lcyBub3QgaGF2ZSB0aGVtLgorIworQkVHSU4geworICAgIFJTVEFSVD0wCisgICAgUkxFTkdUSD0wCisgICAgczE9IkEgcmVhbCB3b3JsZCBleGFtcGxlIgorICAgIGlmICghIG1hdGNoKHMxLCJ3b3JsZCIpKSB7CisgICAgICAgIHByaW50ICJGYWlsIG1hdGNoIgorICAgIH0gZWxzZSBpZiAoUlNUQVJUICE9IDgpIHsKKyAgICAgICAgcHJpbnQgIkZhaWwgUlNUQVJUID0iUlNUQVJUCisgICAgfSBlbHNlIGlmIChSTEVOR1RIICE9IDUpIHsKKyAgICAgICAgcHJpbnQgIkZhaWwgUkxFTkdUSCA9IlJMRU5HVEgKKyAgICB9IGVsc2UgeworICAgICAgICBzMj1zdWJzdHIoczEsUlNUQVJULFJMRU5HVEgpCisgICAgICAgIGlmIChzMiAhPSAid29ybGQiKSB7CisgICAgICAgICAgICBwcmludCAiRmFpbCBzdWJzdHI9InMyCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludCAiUGFzcyIKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvYXdrL2dlbi1jeWd3aW4tZGVwcy1jb252ZXJ0ZXIuYXdrIGIvYW5kcm9pZC9idWlsZC9hd2svZ2VuLWN5Z3dpbi1kZXBzLWNvbnZlcnRlci5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2OTFiOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvYXdrL2dlbi1jeWd3aW4tZGVwcy1jb252ZXJ0ZXIuYXdrCkBAIC0wLDAgKzEsMjAxIEBACisjIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIGJlCisjIHJ1biBieSB0aGUgTkRLIGJ1aWxkIHN5c3RlbSB0byBwcm9jZXNzIGRlcGVuZGVuY3kgZmlsZXMgZ2VuZXJhdGVkIGJ5CisjIEdDQyBvbiBXaW5kb3dzLCBhbmQgY29udmVydCB0aGVtIHRvIGEgZm9ybWF0IHRoYXQgaXMgc3VpdGFibGUgZm9yCisjIEN5Z3dpbidzIEdOVSBNYWtlLgorIworIyBUaGUgbWFpbiBpc3N1ZSB0byBzb2x2ZSBoZXJlIGlzIHRoYXQgdGhlIGRlcGVuZGVuY3kgZmlsZXMgZ2VuZXJhdGVkCisjIGJ5IEdDQyB1c2UgbmF0aXZlIHdpbmRvd3MgcGF0aCBuYW1lcywgYXMgaW46CisjCisjICAgIEM6L0Zvby9mb28ubzogXAorIyAgICAgIEM6L0Zvby9zcmMvZm9vLmggXAorIyAgICAgIEM6L0Zvby9zcmMvZm9vLmMgXAorIyAgICAgIEQ6L0Jhci9iYXIvYmFyLmgKKyMKKyMgQW5kIHRoZSBmaWxlIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCB0byBjb252ZXJ0IGVhY2ggc3VjaCBwYXRoIGludG8KKyMgYSBDeWd3aW4tc3BlY2lmaWMgb25lLCBhcyBpbjoKKyMKKyMgICAgL2N5Z2RyaXZlL2MvRm9vL2Zvby5vOiBcCisjICAgICAgL2N5Z2RyaXZlL2MvRm9vL3NyYy9mb28uaCBcCisjICAgICAgL2N5Z2RyaXZlL2MvRm9vL3NyYy9mb28uYyBcCisjICAgICAgL2N5Z2RyaXZlL2QvQmFyL2Jhci9iYXIuaAorIworIyBQcmV2aW91c2x5LCB0aGlzIGNvbnZlcnNpb24gd2FzIGRvbmUgd2l0aCBhbiBhd2sgc2NyaXB0IHRoYXQgYXNzdW1lZAorIyB0aGF0IHRoZSBjeWd3aW4gZHJpdmUgcHJlZml4IHdhcyBhbHdheXMgJ2N5Z2RyaXZlJy4gVGhpcyBkaWRuJ3Qgd29yaworIyB3ZWxsIHdoZW4gdGhpcyB3YXMgbm90IHRoZSBjYXNlLCBvciB3aGVuIHVzaW5nIGRyaXZlLWxlc3MgbW91bnRzCisjIChlLmcuIHdoZW4gIC9ob21lL21udCB3b3VsZCBtYXAgdG8gLy9zZXJ2ZXIvc3ViZGlyKQorIworIyBUbyBzb2x2ZSB0aGUgaXNzdWUgY29ycmVjdGx5LCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlCisjIEN5Z3dpbiBtb3VudCB0YWJsZSAoaS5lLiB0aGUgb3V0cHV0IG9mIHRoZSAnbW91bnQnIGNvbW1hbmQpLCBhbmQKKyMgYnVpbGQgYSBzZWQgc2NyaXB0IHRoYXQgd2lsbCBwcm9wZXJseSByZXBsYWNlIGhvc3QgcGF0aHMgaW50byB0aGUKKyMgY29ycmVzcG9uZGluZyBjeWd3aW4gZXF1aXZhbGVudC4KKyMKKyMgTk9URTogVGhlIHNlZCBzY3JpcHQgd2lsbCBiZSBydW4gZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uLCBub3QgZHVyaW5nIHRoZQorIyBwYXJzZSBwaGFzZS4KKyMKKyMgVGhpcyBhd2sgc2NyaXB0IGV4cGVjdHMgaXRzIGlucHV0IHRvIGJlIHRoZSBvdXRwdXQgb2YgdGhlIEN5Z3dpbiAibW91bnQiIGNvbW1hbmQKKyMgYXMgaW46CisjCisjICBDOi9jeWd3aW4vYmluIG9uIC91c3IvYmluIHR5cGUgbnRmcyAoYmluYXJ5LGF1dG8pCisjICBDOi9jeWd3aW4vbGliIG9uIC91c3IvbGliIHR5cGUgbnRmcyAoYmluYXJ5LGF1dG8pCisjICBDOi9jeWd3aW4gb24gLyB0eXBlIG50ZnMgKGJpbmFyeSxhdXRvKQorIyAgQzogb24gL2N5Z2RyaXZlL2MgdHlwZSBudGZzIChiaW5hcnkscG9zaXg9MCx1c2VyLG5vdW1vdW50LGF1dG8pCisjICBEOiBvbiAvY3lnZHJpdmUvZCB0eXBlIHVkZiAoYmluYXJ5LHBvc2l4PTAsdXNlcixub3Vtb3VudCxhdXRvKQorIyAgLy9zZXJ2ZXIvc3ViZGlyIG9uIC9ob21lL21udC4yJCB0eXBlIC4uLi4KKyMKKyMgSXQgZmlyc3QgYnVpbGRzIGEgc2VkIHNjcmlwdCB0aGF0IGNvbnZlcnQgYWxsIHdpbmRvd3MgcGF0aCBpbiB0aGUKKyMgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBjeWd3aW4gZXF1aXZhbGVudC4gRm9yIGV4YW1wbGUsIHRoaXMgd291bGQgbG9vaworIyBsaWtlIHRoZSBmb2xsb3dpbmcgKGJ1dCBhbGwgb24gYSBzaW5nbGUgbGluZSk6CisjCisjICBzIV4vL3NlcnZlci9zdWJkaXIhL2hvbWUvbW50XC4yXCQhaWc7CisjICBzISAvL3NlcnZlci9zdWJkaXIhIC9ob21lL21udFwuMlwkIWlnOworIyAgcyFeQzovY3lnd2luL2JpbiEvdXNyL2JpbiFpZzsKKyMgIHMhIEM6L2N5Z3dpbi9iaW4hIC91c3IvYmluIWlnOworIyAgcyFeQzovY3lnd2luL2xpYiEvdXNyL2xpYiFpZzsKKyMgIHMhIEM6L2N5Z3dpbi9saWIhIC91c3IvbGliIWlnOworIyAgcyFeQzovY3lnd2luLyEvIWlnOworIyAgcyEgQzovY3lnd2luLyEgLyFpZzsKKyMgIHMhXkM6IS9jeWdkcml2ZS9jIWlnOworIyAgcyEgQzohIC9jeWdkcml2ZS9jIWlnOworIyAgcyFeRDohL2N5Z2RyaXZlL2QhaWc7CisjICBzISBEOiEgL2N5Z2RyaXZlL2QhaWc7CisjCisjIE5vdGUgdGhhdCB3ZSBwcm9wZXJseSBlc2NhcGUgcmVnZXggbWV0YSBjaGFyYWN0ZXJzIGxpa2UgLiBvciAkCisjIHRvIGF2b2lkIGNvbmZ1c2luZyBzZWQuIEFsc28gZGVhbCB3aXRoIHRoZSBjYXNlcyB3aGVyZSB0aGUgcGF0aAorIyBpcyB0aGUgZmlyc3QgaW4gdGhlIGxpbmUsIG9yIHByZWZpeGVkIHdpdGggYSBzcGFjZSBpbiB0aGUgZGVwcyBmaWxlLgorIworIyBBZnRlciB0aGlzLCB0aGUgc2VkIGludm9rYXRpb24gaXMgaGFyZC1jb2RlZCBpbnRvIGEgZ2VuZXJhdGVkIHNoZWxsCisjIHNjcmlwdCB0aGF0IGNhbiBiZSBpbnZva2VkIGRpcmVjdGx5IGF0IGJ1aWxkIHRpbWUuCisjCitCRUdJTiB7CisgICMgc2V0dXAgb3VyIGNvdW50CisgIGNvdW50ID0gMAorfQorCiskMiA9PSAib24iIHsKKyAgICAjIHJlY29yZCBhIG5ldyAoaG9zdC1wYXRoLGN5Z3dpbi1wYXRoKSBwYWlyCisgICAgY291bnQgKysKKworICAgICMgQ29udmVydCBiYWNrd2FyZHMgc2xhc2hlcyBpbnRvIGZvcndhcmQgb25lcyBpbiB0aGUgaG9zdCBwYXRoLgorICAgICMgVGhpcyBpcyB0byBzdXBwb3J0IE1TeXMnIG1vdW50IGNvbW1hbmQsIHdoaWNoIG91dHB1dHMgV2luZG93cy1zdHlsZQorICAgICMgc2VwYXJhdG9ycywgdW5saWtlIEN5Z3dpbidzIHZlcnNpb24gb2YgdGhlIHNhbWUgdG9vbC4KKyAgICBnc3ViKCJcXFxcIiwiLyIsJDEpCisKKyAgICBob3N0W2NvdW50XSA9ICQxCisgICAgY3lnd2luW2NvdW50XSA9ICQzCit9CisKK0VORCB7CisgICAgIyBXZSBoYXZlIHJlY29yZGVkIGFsbCAoaG9zdCxjeWd3aW4pIHBhdGggcGFpcnMsCisgICAgIyBub3cgdHJ5IHRvIHNvcnQgdGhlbSBzbyB0aGF0IHRoZSBvbmVzIHdpdGggdGhlIGxvbmdlc3QgaG9zdCBwYXRoCisgICAgIyBhcHBlYXIgZmlyc3QKKyAgICBmb3IgKGlpID0gMjsgaWkgPD0gY291bnQ7IGlpKyspIHsKKyAgICAgICAgZm9yIChqaiA9IGlpLTE7IGpqID4gMDsgamotLSkgeworICAgICAgICAgICAgaWYgKGxlbmd0aChob3N0W2pqXSkgPiBsZW5ndGgoaG9zdFtqaisxXSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW5ndGgoaG9zdFtqal0pID09IGxlbmd0aChob3N0W2pqKzFdKSAmJgorICAgICAgICAgICAgICAgIGhvc3RbampdID4gaG9zdFtqaisxXSkgeworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBjeWd3aW5bampdCisgICAgICAgICAgICBjeWd3aW5bampdID0gY3lnd2luW2pqKzFdCisgICAgICAgICAgICBjeWd3aW5bamorMV0gPSB0bXAKKyAgICAgICAgICAgIHRtcCA9IGhvc3RbampdCisgICAgICAgICAgICBob3N0W2pqXSA9IGhvc3RbamorMV0KKyAgICAgICAgICAgIGhvc3RbamorMV0gPSB0bXAKKyAgICAgICAgfQorICAgIH0KKworICAgICMgYnVpbGQvbmRrL2luaXQubWsgZGVmaW5lcyBWRVJCT1NFIHRvIDEgd2hlbiBpdCBuZWVkcyB0byBkdW1wIHRoZQorICAgICMgbGlzdCBvZiBzdWJzdGl0dXRpb25zIGluIGEgaHVtYW4tZnJpZW5kbHkgZm9ybWF0LCBnZW5lcmFsbHkgd2hlbgorICAgICMgTkRLX0xPRyBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudAorICAgICMKKyAgICAjIE90aGVyd2lzZSwganVzdCBnZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBzZWQgc2NyaXB0CisgICAgIworICAgIGlmIChWRVJCT1NFID09IDEpIHsKKyAgICAgICAgZm9yIChubiA9IDE7IG5uIDw9IGNvdW50OyBubisrKSB7CisgICAgICAgICAgICBwcmludGYoICIkKGluZm8gJXMgPT4gJXMpIiwgY3lnd2luW25uXSwgaG9zdFtubl0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUkVTVUxUID0gIiIKKyAgICAgICAgZm9yIChubiA9IDE7IG5uIDw9IGNvdW50OyBubisrKSB7CisgICAgICAgICAgICBhZGRfZHJpdmVfcnVsZShob3N0W25uXSwgY3lnd2luW25uXSkKKyAgICAgICAgfQorCisgICAgICAgICMgTm90ZTogdGhlIHJvbGUgb2YgdGhlIGdlbmVyYXRlZCBzaGVsbCBzY3JpcHQgaXMgdG8gZmlyc3QgY2hlY2sKKyAgICAgICAgIyAgICAgICB0aGF0ICQxLm9yZyBleGlzdHMuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCB0aGlzIHNpbXBseQorICAgICAgICAjICAgICAgIG1lYW5zIHRoYXQgR0NDIGRpZG4ndCBnZW5lcmF0ZSBhIGRlcGVkZW5jeSBmaWxlIChlLmcuIHdoZW4KKyAgICAgICAgIyAgICAgICBjb21waWxpbmcgYW4gYXNzZW1ibGVyIGZpbGUpLgorICAgICAgICAjCisgICAgICAgICMgICAgICAgSWYgdGhlIGZpbGUgZXhpc3RzLCBpdCBpcyBwcm9jZXNzZWQgd2l0aCBvdXIgc2VkIHNjcmlwdCwKKyAgICAgICAgIyAgICAgICB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gJDEsIGFuZCB3ZSByZW1vdmUgdGhlIG9yaWdpbmFsICQxLm9yZworICAgICAgICAjCisgICAgICAgIHByaW50ICIjIS9iaW4vc2giCisgICAgICAgIHByaW50ICIjIEFVVE8tR0VORVJBVEVEIEZJTEUsIERPIE5PVCBFRElUISIKKyAgICAgICAgcHJpbnQgImlmIFsgLWYgJDEub3JnIF07IHRoZW4iCisgICAgICAgIHByaW50ICIgIHNlZCAtZSAnIiBSRVNVTFQgIicgJDEub3JnID4gJDEgJiYgcm0gLWYgJDEub3JnIgorICAgICAgICBwcmludCAiZmkiCisgICAgfQorfQorCisjIFdlIG5lZWQgdG8gcXVvdGUgc29tZSBjaGFyYWN0ZXJzIHNvIHRoYXQgJ3NlZCcgZG9lc24ndAorIyBiZWxpZXZlIHRoZXkgYXJlIHJlZ2V4IG9wZXJhdG9ycy4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0aAorIyBjb250YWlucyBhIGRvdCAoLiksIHdlIG5lZWQgdG8gZXNjYXBlIGl0IGludG8gIlwuIgorIworZnVuY3Rpb24gc2VkX3F1b3RlX3BhdGggKHN0cikKK3sKKyAgICAjIFdpbmRvd3MgcGF0aCBuYW1lcyBjYW5ub3QgY29udGFpbiBhbnkgb2Y6IDw+OiJ8PyoKKyAgICAjIHNlZSBtc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvYWEzNjUyNDcodj12cy44NSkuYXNweAorICAgICMKKyAgICAjIEFueXRoaW5nIGVsc2UgaXMgdmFsaWQuIFRoZSByZWdleCBtZXRhIGNoYXJhY3RlcnMgYXJlOiBeLltdJCgpfCorP3t9XAorICAgICMKKyAgICAjIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBlc2NhcGUgdGhlc2Ugd2hlbiB0aGV5IGFwcGVhciBpbiBwYXRoIG5hbWVzOiBeLltdJCgpK3t9XAorICAgICMKKyAgICBnc3ViKCJcXF4iLCJcXF4iLHN0cikKKyAgICBnc3ViKCJcXC4iLCJcXC4iLHN0cikKKyAgICBnc3ViKCJcXFsiLCJcXFsiLHN0cikKKyAgICBnc3ViKCJcXF0iLCJcXF0iLHN0cikKKyAgICBnc3ViKCJcXCQiLCJcXCQiLHN0cikKKyAgICBnc3ViKCJcXCgiLCJcXCgiLHN0cikKKyAgICBnc3ViKCJcXCkiLCJcXCkiLHN0cikKKyAgICBnc3ViKCJcXCsiLCJcXCsiLHN0cikKKyAgICBnc3ViKCJcXHsiLCJcXHsiLHN0cikKKyAgICBnc3ViKCJcXH0iLCJcXH0iLHN0cikKKworICAgIHJldHVybiBzdHIKK30KKworZnVuY3Rpb24gYWRkX2RyaXZlX3J1bGUgKGhvc3RwYXRoLGN5Z3BhdGgpCit7CisgICAgaG9zdHBhdGggPSBzZWRfcXVvdGVfcGF0aChob3N0cGF0aCkKKwljeWdwYXRoID0gc2VkX3F1b3RlX3BhdGgoY3lncGF0aCkKKwkKKyAgICAjIFRoZSByb290IGRpcmVjdG9yeSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSB3ZSBuZWVkCisJIyB0byBhZGQgYSBzbGFzaCBhdCB0aGUgZW5kIG9mIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QgcGF0aAorCSMgb3RoZXJ3aXNlIGM6L2N5Z3dpbi9mb28gd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gLy9mb28KKwkjIGluc3RlYWQgb2YgL2Zvby4KKwkjCisgICAgaWYgKGN5Z3BhdGggPT0gIi8iKSB7CisgICAgICAgIGhvc3RwYXRoID0gaG9zdHBhdGggIi8iCisgICAgfQorCSMgd2hlbiB0aGUgaG9zdHBhdGggc3RhcnRzIHRoZSBsaW5lCisgICAgUkVTVUxUID0gUkVTVUxUICJzIV4iIGhvc3RwYXRoICIhIiBjeWdwYXRoICIhaWc7IgorCisJIyB3aGVuIHRoZSBob3N0cGF0aCBkb2VzIG5vdCBzdGFydCB0aGUgbGluZSAoaXQgd2lsbCBhbHdheXMgYmUgYWZ0ZXIgYSBzcGFjZSkKKwlSRVNVTFQgPSBSRVNVTFQgInMhICIgaG9zdHBhdGggIiEgIiBjeWdwYXRoICIhaWc7IgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9hd2svZ2VuLXdpbmRvd3MtaG9zdC1wYXRoLmF3ayBiL2FuZHJvaWQvYnVpbGQvYXdrL2dlbi13aW5kb3dzLWhvc3QtcGF0aC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzZWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvYXdrL2dlbi13aW5kb3dzLWhvc3QtcGF0aC5hd2sKQEAgLTAsMCArMSwxNDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIE1ha2VmaWxlIGZyYWdtZW50IHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQKKyMgYXQgcnVudGltZSBieSB0aGUgTkRLIGJ1aWxkIHN5c3RlbSBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIHBhc3MuCisjCisjIFRoZSBwdXJwb3NlIG9mIHRoaXMgZ2VuZXJhdGVkIGZyYWdtZW50IGlzIHRvIGRlZmluZSBhIGZ1bmN0aW9uLCBuYW1lZAorIyAnY3lnd2luLXRvLWhvc3QtcGF0aCcgdGhhdCB3aWxsIHRyYW5zZm9ybSBhIEN5Z3dpbi1zcGVjaWZpYyBwYXRoIGludG8gdGhlCisjIGNvcnJlc3BvbmRpbmcgV2luZG93cyBzcGVjaWZpYyBvbmUsIGkuZS4gY2FsbGluZworIworIyAgICQoY2FsbCBjeWd3aW4tdG8taG9zdC1wYXRoLC9jeWdkcml2ZS9jL1N0dWZmLykgIC0tPiBjOi9TdHVmZgorIworIyBBIG5haXZlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd291bGQgYmUgdGhlIGZvbGxvd2luZzoKKyMKKyMgICBjeWd3aW4tdG8taG9zdC1wYXRoID0gJChzaGVsbCBjeWdwYXRoIC1tICQxKQorIworIyBVbmZvcnR1bmF0ZWx5LCBjYWxsaW5nICdjeWdwYXRoIC1tJyBmcm9tIEdOVSBNYWtlIGlzIGhvcnJpZGx5IHNsb3cgYW5kIHBlb3BsZQorIyBoYXZlIGNvbXBsYWluZWQgdGhhdCB0aGlzIHdhcyBhZGRpbmcgc2V2ZXJhbCBtaW51dGVzIHRvIHRoZWlyIGJ1aWxkcywgZXZlbiBpbgorIyB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorIworIyBUaGUgc2NyaXB0IGV4cGVjdHMgaXRzIGlucHV0IHRvIGJlIHRoZSBvdXRwdXQgb2YgdGhlIEN5Z3dpbiAibW91bnQiIGNvbW1hbmQKKyMgYXMgaW46CisjCisjICBDOi9jeWd3aW4vYmluIG9uIC91c3IvYmluIHR5cGUgbnRmcyAoYmluYXJ5LGF1dG8pCisjICBDOi9jeWd3aW4vbGliIG9uIC91c3IvbGliIHR5cGUgbnRmcyAoYmluYXJ5LGF1dG8pCisjICBDOi9jeWd3aW4gb24gLyB0eXBlIG50ZnMgKGJpbmFyeSxhdXRvKQorIyAgQzogb24gL2N5Z2RyaXZlL2MgdHlwZSBudGZzIChiaW5hcnkscG9zaXg9MCx1c2VyLG5vdW1vdW50LGF1dG8pCisjICBEOiBvbiAvY3lnZHJpdmUvZCB0eXBlIHVkZiAoYmluYXJ5LHBvc2l4PTAsdXNlcixub3Vtb3VudCxhdXRvKQorIworIyBUaGUgc2NyaXB0J3Mgb3V0cHV0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBHTlUgTWFrZSAnZXZhbCcgZnVuY3Rpb24KKyMgYW5kIHdpbGwgbG9vayBsaWtlOgorIworIyAgJChwYXRzdWJzdCAvJSxDOi9jeWd3aW4vLAorIyAgJChwYXRzdWJzdCAvdXNyL2Jpbi8lLEM6L2N5Z3dpbi9iaW4vLAorIyAgJChwYXRzdWJzdCAvdXNyL2xpYi8lLEM6L2N5Z3dpbi9saWIvLAorIyAgJChwYXRzdWJzdCAvY3lnZHJpdmUvQy8lLEM6LywKKyMgICQocGF0c3Vic3QgL2N5Z2RyaXZlL0QvJSxEOi8sCisjICAkKHBhdHN1YnN0IC9jeWdkcml2ZS9jLyUsQzovLAorIyAgJChwYXRzdWJzdCAvY3lnZHJpdmUvZC8lLEQ6LywkMSkpKSkpCisjCitCRUdJTiB7CisgICMgc2V0dXAgb3VyIGNvdW50CisgIGNvdW50ID0gMAorfQorCiskMiA9PSAib24iIHsKKyAgICAjIHJlY29yZCBhIG5ldyAoaG9zdC1wYXRoLGN5Z3dpbi1wYXRoKSBwYWlyCisgICAgY291bnQgKysKKyAgICBob3N0W2NvdW50XSA9ICQxCisgICAgY3lnd2luW2NvdW50XSA9ICQzCit9CisKK0VORCB7CisgICAgIyBEcml2ZSBsZXR0ZXJzIGFyZSBzcGVjaWFsIGNhc2VzIGJlY2F1c2Ugd2UgbXVzdCBtYXRjaCBib3RoCisgICAgIyB0aGUgdXBwZXIgYW5kIGxvd2VyIGNhc2UgdmVyc2lvbnMgdG8gdGhlIHNhbWUgZHJpdmUsIGkuZS4KKyAgICAjIGlmICJtb3VudCIgbGlzdHMgdGhhdCAvY3lnZHJpdmUvYyBtYXBzIHRvIEM6LCB3ZSBuZWVkIHRvCisgICAgIyBtYXAgYm90aCAvY3lnZHJpdmUvYyBhbmQgL2N5Z2RyaXZlL0MgdG8gQzogaW4gb3VyIGZpbmFsIHJ1bGVzLgorICAgICMKKyAgICBjb3VudDEgPSBjb3VudAorICAgIGZvciAobm4gPSAxOyBubiA8PSBjb3VudDE7IG5uKyspIHsKKyAgICAgICAgaWYgKCFtYXRjaChob3N0W25uXSwiXltBLVphLXpdOiQiKSkgeworICAgICAgICAgICAgIyBub3QgYSBkcml2ZXIgbGV0dGVyIG1hcHBpbmcsIHNraXAgdGhpcyBwYWlyCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB9CisgICAgICAgIGxldHRlciA9IHN1YnN0cihob3N0W25uXSwxLDEpCisgICAgICAgIGxvICAgICA9IHRvbG93ZXIobGV0dGVyKQorICAgICAgICB1cCAgICAgPSB0b3VwcGVyKGxldHRlcikKKworICAgICAgICAjIElmIHRoZSBjeWd3aW4gcGF0aCBlbmRzIGluIC88bG8+LCB0aGVuIHN1YnN0aXR1dGUgaXQgd2l0aCAvPHVwPgorICAgICAgICAjIHRvIGNyZWF0ZSBhIG5ldyBwYWlyLgorICAgICAgICBpZiAobWF0Y2goY3lnd2luW25uXSwiLyJsbyIkIikpIHsKKyAgICAgICAgICAgIGNvdW50KysKKyAgICAgICAgICAgIGhvc3RbY291bnRdID0gaG9zdFtubl0KKyAgICAgICAgICAgIGN5Z3dpbltjb3VudF0gPSBzdWJzdHIoY3lnd2luW25uXSwxLGxlbmd0aChjeWd3aW5bbm5dKS0xKSB1cAorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgfQorCisgICAgICAgICMgSWYgdGhlIGN5Z3dpbiBwYXRoIGVuZHMgaW4gLzx1cD4sIHRoZW4gc3Vic3RpdHV0ZSBpdCB3aXRoIC88bG8+CisgICAgICAgICMgdG8gY3JlYXRlIGEgbmV3IHBhaXIuCisgICAgICAgIGlmIChtYXRjaChjeWd3aW5bbm5dLCIvInVwIiQiKSkgeworICAgICAgICAgICAgY291bnQrKworICAgICAgICAgICAgaG9zdFtjb3VudF0gPSBob3N0W25uXQorICAgICAgICAgICAgY3lnd2luW2NvdW50XSA9IHN1YnN0cihjeWd3aW5bbm5dLDEsbGVuZ3RoKGN5Z3dpbltubl0pLTEpIGxvCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB9CisgICAgfQorCisgICAgIyBXZSBoYXZlIHJlY29yZGVkIGFsbCAoaG9zdCxjeWd3aW4pIHBhdGggcGFpcnMsCisgICAgIyBub3cgdHJ5IHRvIHNvcnQgdGhlbSBzbyB0aGF0IHRoZSBvbmVzIHdpdGggdGhlIGxvbmdlc3QgY3lnd2luIHBhdGgKKyAgICAjIGFwcGVhciBmaXJzdAorICAgIGZvciAoaWkgPSAyOyBpaSA8PSBjb3VudDsgaWkrKykgeworICAgICAgICBmb3IgKGpqID0gaWktMTsgamogPiAwOyBqai0tKSB7CisgICAgICAgICAgICBpZiAobGVuZ3RoKGN5Z3dpbltqal0pID4gbGVuZ3RoKGN5Z3dpbltqaisxXSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZW5ndGgoY3lnd2luW2pqXSkgPT0gbGVuZ3RoKGN5Z3dpbltqaisxXSkgJiYKKyAgICAgICAgICAgICAgICBjeWd3aW5bampdID4gY3lnd2luW2pqKzFdKSB7CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGN5Z3dpbltqal0KKyAgICAgICAgICAgIGN5Z3dpbltqal0gPSBjeWd3aW5bamorMV0KKyAgICAgICAgICAgIGN5Z3dpbltqaisxXSA9IHRtcAorICAgICAgICAgICAgdG1wID0gaG9zdFtqal0KKyAgICAgICAgICAgIGhvc3RbampdID0gaG9zdFtqaisxXQorICAgICAgICAgICAgaG9zdFtqaisxXSA9IHRtcAorICAgICAgICB9CisgICAgfQorCisgICAgIyBidWlsZC9uZGsvaW5pdC5tayBkZWZpbmVzIFZFUkJPU0UgdG8gMSB3aGVuIGl0IG5lZWRzIHRvIGR1bXAgdGhlCisgICAgIyBsaXN0IG9mIHN1YnN0aXR1dGlvbnMgaW4gYSBodW1hbi1mcmllbmRseSBmb3JtYXQsIGdlbmVyYWxseSB3aGVuCisgICAgIyBOREtfTE9HIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50CisgICAgIworICAgICMgT3RoZXJ3aXNlLCBqdXN0IGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIE1ha2UgZnVuY3Rpb24gZGVmaW5pdGlvbgorICAgICMKKyAgICBpZiAoVkVSQk9TRSA9PSAxKSB7CisgICAgICAgIGZvciAobm4gPSAxOyBubiA8PSBjb3VudDsgbm4rKykgeworICAgICAgICAgICAgcHJpbnRmKCAiJChpbmZvICVzID0+ICVzKSIsIGN5Z3dpbltubl0sIGhvc3Rbbm5dKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFJFU1VMVCA9ICIkMSIKKyAgICAgICAgZm9yIChubiA9IDE7IG5uIDw9IGNvdW50OyBubisrKSB7CisgICAgICAgICAgICBhZGRfZHJpdmVfcnVsZShob3N0W25uXSwgY3lnd2luW25uXSkKKyAgICAgICAgfQorICAgICAgICBwcmludCBSRVNVTFQKKyAgICB9Cit9CisKK2Z1bmN0aW9uIGFkZF9kcml2ZV9ydWxlIChob3N0cGF0aCxjeWdwYXRoKQoreworICAgIGlmIChjeWdwYXRoID09ICIvIikgeworICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgLworICAgICAgICBSRVNVTFQgPSAiJChwYXRzdWJzdCAvJSwiIGhvc3RwYXRoICIvJSxcbiIgUkVTVUxUICIpIgorICAgICAgICByZXR1cm4KKyAgICB9CisgICAgIyBkZWZhdWx0IHJ1bGUgb3RoZXJ3aXNlCisgICAgUkVTVUxUID0gIiQocGF0c3Vic3QgIiBjeWdwYXRoICIvJSwiIGhvc3RwYXRoICIvJSxcbiIgUkVTVUxUICIpIgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9jb3JlL2RlZmluaXRpb25zLWZpbGVzLm1rIGIvYW5kcm9pZC9idWlsZC9jb3JlL2RlZmluaXRpb25zLWZpbGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzcwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtZmlsZXMubWsKQEAgLTAsMCArMSwyNTkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGZpbGUgYW5kIGRpcmVjdG9yeSBjcmVhdGlvbgorIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogZ2VuZXJhdGUtZGlyCisjIEFyZ3VtZW50czogMTogZGlyZWN0b3J5IHBhdGgKKyMgUmV0dXJucyAgOiBHZW5lcmF0ZSBhIHJ1bGUsIGJ1dCBub3QgZGVwZW5kZW5jeSwgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHdpdGgKKyMgICAgICAgICAgICBob3N0LW1rZGlyLgorIyBVc2FnZSAgICA6ICQoY2FsbCBnZW5lcmF0ZS1kaXIsPHBhdGg+KQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmaW5lIGV2LWdlbmVyYXRlLWRpcgorX19idWlsZF9kaXIgOj0gJDEKK2lmZXEgKCwkJChfX2J1aWxkX2Rpcl9mbGFnX18kJChfX2J1aWxkX2RpcikpKQorIyBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBkb2Vzbid0IHdvcmsgYmVjYXVzZSBwYXRoIGluIHdpbmRvd3MgbWF5IGNvbnRhaW4KKyMgJzonIGlmIG5kay1idWlsZCBpcyBjYWxsZWQgaW5zaWRlIGpuaS8gZGlyZWN0b3J5IHdoZW4gcGF0aCBpcyBleHBhbmRlZAorIyB0byBmdWxsLXBhdGgsIGVnLiBDOi9wYXRoL3RvL3Byb2plY3Qvam5pLworIworIyAgICBfX2J1aWxkX2Rpcl9mbGFnX18kMSA6PSB0cnVlCisjCitfX2J1aWxkX2Rpcl9mbGFnX18kJChfX2J1aWxkX2RpcikgOj0gdHJ1ZQorJDE6CisJQCQkKGNhbGwgaG9zdC1ta2RpciwkJEApCitlbmRpZgorZW5kZWYKKworZ2VuZXJhdGUtZGlyID0gJChldmFsICQoY2FsbCBldi1nZW5lcmF0ZS1kaXIsJDEpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogZ2VuZXJhdGUtZmlsZS1kaXIKKyMgQXJndW1lbnRzOiAxOiBmaWxlIHBhdGgKKyMgUmV0dXJucyAgOiBHZW5lcmF0ZSBhIGRlcGVuZGVuY3kgYW5kIGEgcnVsZSB0byBlbnN1cmUgdGhhdCB0aGUgcGFyZW50CisjICAgICAgICAgICAgZGlyZWN0b3J5IG9mIHRoZSBpbnB1dCBmaWxlIHBhdGggd2lsbCBiZSBjcmVhdGVkIGJlZm9yZSBpdC4KKyMgICAgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gZW5mb3JjZSBhIGNhbGwgdG8gaG9zdC1ta2Rpci4KKyMgVXNhZ2UgICAgOiAkKGNhbGwgZ2VuZXJhdGUtZmlsZS1kaXIsPGZpbGU+KQorIyBSYXRpb25hbGU6IE1hbnkgb2JqZWN0IGZpbGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBzYW1lIG91dHB1dCBkaXJlY3RvcnkuCisjICAgICAgICAgICAgSW50cm9kdWNpbmcgYSBkZXBlbmRlbmN5IG9uIHRoZSBsYXR0ZXIgYXZvaWRzIGNhbGxpbmcgbWtkaXIgLXAKKyMgICAgICAgICAgICBmb3IgZXZlcnkgb25lIG9mIHRoZW0uCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZmluZSBldi1nZW5lcmF0ZS1maWxlLWRpcgorX19idWlsZF9maWxlX2RpciA6PSAkKGNhbGwgcGFyZW50LWRpciwkMSkKKyQkKGNhbGwgZ2VuZXJhdGUtZGlyLCQkKF9fYnVpbGRfZmlsZV9kaXIpKQorJDE6fCAkJChfX2J1aWxkX2ZpbGVfZGlyKQorZW5kZWYKKworZ2VuZXJhdGUtZmlsZS1kaXIgPSAkKGV2YWwgJChjYWxsIGV2LWdlbmVyYXRlLWZpbGUtZGlyLCQxKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGdlbmVyYXRlLWxpc3QtZmlsZQorIyBBcmd1bWVudHM6IDE6IGxpc3Qgb2Ygc3RyaW5ncyAocG9zc2libHkgdmVyeSBsb25nKQorIyAgICAgICAgICAgIDI6IGZpbGUgbmFtZQorIyBSZXR1cm5zICA6IHdyaXRlIHRoZSBjb250ZW50IG9mIGEgcG9zc2libHkgdmVyeSBsb25nIHN0cmluZyBsaXN0IHRvIGEgZmlsZS4KKyMgICAgICAgICAgICB0aGlzIHNoYWxsIGJlIHVzZWQgaW4gY29tbWFuZHMgYW5kIHdpbGwgd29yayBhcm91bmQgbGltaXRhdGlvbnMKKyMgICAgICAgICAgICBvZiBob3N0IGNvbW1hbmQtbGluZSBsZW5ndGhzLgorIyBVc2FnZSAgICA6ICQoY2FsbCBob3N0LWVjaG8tdG8tZmlsZSw8c3RyaW5nLWxpc3Q+LDxmaWxlPikKKyMgUmF0aW9uYWxlOiBXaGVuIHRoZXJlIGlzIGEgdmVyeSBsYXJnZSBudW1iZXIgb2Ygb2JqZWN0cyBhbmQvb3IgbGlicmFyaWVzIGF0CisjICAgICAgICAgICAgbGluayB0aW1lLCB0aGUgc2l6ZSBvZiB0aGUgY29tbWFuZCBiZWNvbWVzIHRvbyBsYXJnZSBmb3IgdGhlCisjICAgICAgICAgICAgaG9zdCBzeXN0ZW0ncyBtYXhpbXVtLiBWYXJpb3VzIHRvb2xzIGhvd2V2ZXIgc3VwcG9ydCB0aGUKKyMgICAgICAgICAgICBAPGxpc3RmaWxlPiBzeW50YXgsIHdoZXJlIDxsaXN0ZmlsZT4gaXMgdGhlIHBhdGggb2YgYSBmaWxlCisjICAgICAgICAgICAgd2hpY2ggY29udGVudCB3aWxsIGJlIHBhcnNlZCBhcyBpZiB0aGV5IHdlcmUgb3B0aW9ucy4KKyMKKyMgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2VuZXJhdGUgc3VjaCBhIGxpc3QgZmlsZSBmcm9tIGEgbG9uZworIyAgICAgICAgICAgIGxpc3Qgb2Ygc3RyaW5ncyBpbiBpbnB1dC4KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBIZWxwZXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhlIEdOVSBNYWtlICQod29yZCAuLi4pIGZ1bmN0aW9uIGRvZXMKKyMgbm90IGFjY2VwdCBhIDAgaW5kZXgsIHNvIHdlIG5lZWQgdG8gYnVtcCBhbnkgb2YgdGhlc2UgdG8gMSB3aGVuCisjIHdlIGZpbmQgdGhlbS4KKyMKK2luZGV4LWlzLXplcm8gPSAkKGZpbHRlciAwIDAwIDAwMCAwMDAwIDAwMDAwIDAwMDAwMCAwMDAwMDAwLCQxKQorYnVtcC0wLXRvLTEgPSAkKGlmICQoY2FsbCBpbmRleC1pcy16ZXJvLCQxKSwxLCQxKQorCistdGVzdC1idW1wLTAtdG8tMSA9IFwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCQoY2FsbCBidW1wLTAtdG8tMSkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMSwkKGNhbGwgYnVtcC0wLXRvLTEsMCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMSwkKGNhbGwgYnVtcC0wLXRvLTEsMSkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMiwkKGNhbGwgYnVtcC0wLXRvLTEsMikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMSwkKGNhbGwgYnVtcC0wLXRvLTEsMDApKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LDEsJChjYWxsIGJ1bXAtMC10by0xLDAwMCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMSwkKGNhbGwgYnVtcC0wLXRvLTEsMDAwMCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMSwkKGNhbGwgYnVtcC0wLXRvLTEsMDAwMDApKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LDEsJChjYWxsIGJ1bXAtMC10by0xLDAwMDAwMCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsMTAsJChjYWxsIGJ1bXAtMC10by0xLDEwKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwxMDAsJChjYWxsIGJ1bXAtMC10by0xLDEwMCkpCisKKyMgU2FtZSBhcyAkKHdvcmRsaXN0IC4uLikgZXhjZXB0IHRoZSBzdGFydCBpbmRleCwgaWYgMCwgaXMgYnVtcGVkIHRvIDEKK2luZGV4LXdvcmQtbGlzdCA9ICQod29yZGxpc3QgJChjYWxsIGJ1bXAtMC10by0xLCQxKSwkMiwkMykKKworLXRlc3QtaW5kZXgtd29yZC1saXN0ID0gXAorICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBpbmRleC13b3JkLWxpc3QsMSwxKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxhIGIsJChjYWxsIGluZGV4LXdvcmQtbGlzdCwwLDIsYSBiIGMgZCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsYiBjLCQoY2FsbCBpbmRleC13b3JkLWxpc3QsMiwzLGEgYiBjIGQpKVwKKworIyBOT1RFOiBXaXRoIEdOVSBNYWtlICQxIGFuZCAkKDEpIGFyZSBlcXVpdmFsZW50LCB3aGljaCBtZWFucworIyAgICAgICB0aGF0ICQxMCBpcyBlcXVpdmFsZW50IHRvICQoMSkwLCBhbmQgKm5vdCogJCgxMCkuCisKKyMgVXNlZCB0byBnZW5lcmF0ZSBhIHNsaWNlIG9mIHVwIHRvIDEwIGl0ZW1zIHN0YXJ0aW5nIGZyb20gaW5kZXggJDEsCisjIElmICQxIGlzIDAsIGl0IHdpbGwgYmUgYnVtcGVkIHRvIDEgKGFuZCBvbmx5IDkgaXRlbXMgd2lsbCBiZSBwcmludGVkKQorIyAkMTogc3RhcnQgKHRlbnRoKSBpbmRleC4gQ2FuIGJlIDAKKyMgJDI6IHdvcmQgbGlzdAorIworZGVmaW5lIGxpc3QtZmlsZS1zdGFydC1nZW4tMTAKKwkkJChoaWRlKSAkJChCVUlMRF9IT1NUX0VDSE9fTikgIiQoY2FsbCBpbmRleC13b3JkLWxpc3QsJDEwLCQxOSwkMikgIiA+PiAkJEAKK2VuZGVmCisKKyMgVXNlZCB0byBnZW5lcmF0ZSBhIHNsaWNlIG9mIGFsd2F5cyAxMCBpdGVtcyBzdGFydGluZyBmcm9tIGluZGV4ICQxCisjICQxOiBzdGFydCAodGVudGgpIGluZGV4LiBDQU5OT1QgQkUgMAorIyAkMjogd29yZCBsaXN0CitkZWZpbmUgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAKKwkkJChoaWRlKSAkJChCVUlMRF9IT1NUX0VDSE9fTikgIiQod29yZGxpc3QgJDEwLCQxOSwkMikgIiA+PiAkJEAKK2VuZGVmCisKKyMgU2FtZSBhcyBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwgZXhjZXB0IHRoYXQgdGhlIHdvcmQgbGlzdCBtaWdodCBiZQorIyBlbXB0eSBhdCBwb3NpdGlvbiAkMTAgKGkuZS4gJCgxKTApCitkZWZpbmUgbGlzdC1maWxlLW1heWJlLWdlbi0xMAoraWZuZXEgKCQod29yZCAkMTAsJDIpLCkKKwkkJChoaWRlKSAkJChCVUlMRF9IT1NUX0VDSE9fTikgIiQod29yZGxpc3QgJDEwLCQxOSwkMikgIiA+PiAkJEAKK2VuZGlmCitlbmRlZgorCitkZWZpbmUgbGlzdC1maWxlLXN0YXJ0LWdlbi0xMDAKKyQoY2FsbCBsaXN0LWZpbGUtc3RhcnQtZ2VuLTEwLCQxMCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTEsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDEyLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxMywkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTQsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE1LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxNiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTcsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE4LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxOSwkMikKK2VuZGVmCisKK2RlZmluZSBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMDAKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTAsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDExLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxMiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTMsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE0LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxNSwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTYsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE3LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxOCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTksJDIpCitlbmRlZgorCitkZWZpbmUgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAKK2lmbmVxICgkKHdvcmQgJChjYWxsIGJ1bXAtMC10by0xLCQxMDApLCQyKSwpCitpZm5lcSAoJCh3b3JkICQxOTksJDIpLCkKKyQoY2FsbCBsaXN0LWZpbGUtc3RhcnQtZ2VuLTEwLCQxMCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTEsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDEyLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxMywkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTQsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE1LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxNiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTcsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDE4LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxOSwkMikKK2Vsc2UKK2lmbmVxICgkKHdvcmQgJDE1MCwkMiksKQorJChjYWxsIGxpc3QtZmlsZS1zdGFydC1nZW4tMTAsJDEwLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxMSwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMCwkMTIsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAsJDEzLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwLCQxNCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxNSwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxNiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxNywkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxOCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxOSwkMikKK2Vsc2UKKyQoY2FsbCBsaXN0LWZpbGUtc3RhcnQtZ2VuLTEwLCQxMCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxMSwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxMiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxMywkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwLCQxNCwkMikKK2VuZGlmCitlbmRpZgorZW5kaWYKK2VuZGVmCisKK2RlZmluZSBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwMDAKK2lmbmVxICgkKHdvcmQgJChjYWxsIGJ1bXAtMC10by0xLCQxMDAwKSwkMiksKQoraWZuZXEgKCQod29yZCAkMTk5OSwkMiksKQorJChjYWxsIGxpc3QtZmlsZS1zdGFydC1nZW4tMTAwLCQxMCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMDAsJDExLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwMCwkMTIsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAwLCQxMywkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMDAsJDE0LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwMCwkMTUsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAwLCQxNiwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMDAsJDE3LCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwMCwkMTgsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAwLCQxOSwkMikKK2Vsc2UKK2lmbmVxICgkKHdvcmQgJDE1MDAsJDIpLCkKKyQoY2FsbCBsaXN0LWZpbGUtc3RhcnQtZ2VuLTEwMCwkMTAsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAwLCQxMSwkMikKKyQoY2FsbCBsaXN0LWZpbGUtYWx3YXlzLWdlbi0xMDAsJDEyLCQyKQorJChjYWxsIGxpc3QtZmlsZS1hbHdheXMtZ2VuLTEwMCwkMTMsJDIpCiskKGNhbGwgbGlzdC1maWxlLWFsd2F5cy1nZW4tMTAwLCQxNCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwMCwkMTUsJDIpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAsJDE2LCQyKQorJChjYWxsIGxpc3QtZmlsZS1tYXliZS1nZW4tMTAwLCQxNywkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwMCwkMTgsJDIpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAsJDE5LCQyKQorZWxzZQorJChjYWxsIGxpc3QtZmlsZS1zdGFydC1nZW4tMTAwLCQxMCwkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwMCwkMTEsJDIpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAsJDEyLCQyKQorJChjYWxsIGxpc3QtZmlsZS1tYXliZS1nZW4tMTAwLCQxMywkMikKKyQoY2FsbCBsaXN0LWZpbGUtbWF5YmUtZ2VuLTEwMCwkMTQsJDIpCitlbmRpZgorZW5kaWYKK2VuZGlmCitlbmRlZgorCisKK2RlZmluZSBnZW5lcmF0ZS1saXN0LWZpbGUtZXYKK19fbGlzdF9maWxlIDo9ICQyCisKKy5QSE9OWTogJCQoX19saXN0X2ZpbGUpLnRtcAorCiskJChjYWxsIGdlbmVyYXRlLWZpbGUtZGlyLCQkKF9fbGlzdF9maWxlKS50bXApCisKKyQkKF9fbGlzdF9maWxlKS50bXA6CisJJCQoaGlkZSkgJCQoQlVJTERfSE9TVF9FQ0hPX04pICIiID4gJCRACiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDAsJDEpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDEsJDEpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDIsJDEpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDMsJDEpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDQsJDEpCiskKGNhbGwgbGlzdC1maWxlLW1heWJlLWdlbi0xMDAwLDUsJDEpCisKKyQkKF9fbGlzdF9maWxlKTogJCQoX19saXN0X2ZpbGUpLnRtcAorCSQkKGhpZGUpICQkKGNhbGwgaG9zdC1jb3B5LWlmLWRpZmZlciwkJEAudG1wLCQkQCkKKwkkJChoaWRlKSAkJChjYWxsIGhvc3Qtcm0sJCRALnRtcCkKKworZW5kZWYKKworZ2VuZXJhdGUtbGlzdC1maWxlID0gJChldmFsICQoY2FsbCBnZW5lcmF0ZS1saXN0LWZpbGUtZXYsJDEsJDIpKQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtZ3JhcGgubWsgYi9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtZ3JhcGgubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ODBiYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1ncmFwaC5tawpAQCAtMCwwICsxLDUzOCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRGVmaW5pdGlvbnMgb2YgdmFyaW91cyBncmFwaC1yZWxhdGVkIGdlbmVyaWMgZnVuY3Rpb25zLCB1c2VkIGJ5CisjIG5kay1idWlsZCBpbnRlcm5hbGx5LgorIworCisjIENvZGluZyBzdHlsZSBub3RlOgorIworIyBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGluIHRoaXMgZmlsZSBiZWdpbiB3aXRoICdfYnVpbGRfbW9kXycKKyMgQWxsIGludGVybmFsIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYmVnaW4gd2l0aCAnLWJ1aWxkLW1vZC0nCisjCisKKyMgU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBkZWJ1ZyB0aGUgZnVuY3Rpb25zIGhlcmUuCitfYnVpbGRfbW9kX2RlYnVnIDo9ICQoaWYgJChCVUlMRF9ERUJVR19NT0RVTEVTKSx0cnVlKQorX2J1aWxkX3RvcG9fZGVidWcgOj0gJChpZiAkKEJVSUxEX0RFQlVHX1RPUE8pLHRydWUpCisKKyMgVXNlICQoY2FsbCAtYnVpbGQtbW9kLWRlYnVnLDxtZXNzYWdlPikgdG8gcHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIG9ubHkKKyMgaWYgX2J1aWxkX21vZF9kZWJ1ZyBpcyBzZXQgdG8gJ3RydWUnLiBVc2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgZnVuY3Rpb25zCisjIGF2YWlsYWJsZSBoZXJlLgorIworaWZlcSAodHJ1ZSwkKF9idWlsZF9tb2RfZGVidWcpKQorLWJ1aWxkLW1vZC1kZWJ1ZyA9ICQoaW5mbyAkMSkKK2Vsc2UKKy1idWlsZC1tb2QtZGVidWcgOj0gJChlbXB0eSkKK2VuZGlmCisKK2lmZXEgKHRydWUsJChfYnVpbGRfdG9wb19kZWJ1ZykpCistYnVpbGQtdG9wby1kZWJ1ZyA9ICQoaW5mbyAkMSkKK2Vsc2UKKy1idWlsZC10b3BvLWRlYnVnID0gJChlbXB0eSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZpbHRlciBhIGxpc3Qgb2YgbW9kdWxlIHdpdGggYSBwcmVkaWNhdGUgZnVuY3Rpb24KKyMgJDE6IGxpc3Qgb2YgbW9kdWxlIG5hbWVzLgorIyAkMjogcHJlZGljYXRlIGZ1bmN0aW9uLCB3aWxsIGJlIGNhbGxlZCB3aXRoICQoY2FsbCAkMiw8bmFtZT4pLCBpZiB0aGUKKyMgICAgIHJlc3VsdCBpcyBub3QgZW1wdHksIDxuYW1lPiB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuCisjIE91dDogc3Vic2V0IG9mIGlucHV0IGxpc3QsIHdoZXJlIGVhY2ggaXRlbSBwYXNzZXMgdGhlIHByZWRpY2F0ZS4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCistYnVpbGQtbW9kLWZpbHRlciA9ICQoc3RyaXAgXAorICAgICQoZm9yZWFjaCBfYnVpbGRfbW9kX2ZpbHRlcl9uLCQxLFwKKyAgICAgICAgJChpZiAkKGNhbGwgJDIsJChfYnVpbGRfbW9kX2ZpbHRlcl9uKSksJChfYnVpbGRfbW9kX2ZpbHRlcl9uKSlcCisgICAgKSkKKworLXRlc3QtYnVpbGQtbW9kLWZpbHRlciA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWZ1bmMgPSAkJChjYWxsIHNlcSxmb28sJCQxKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsZm9vLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsZm9vIGJhciwtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28gZm9vLCQoY2FsbCAtYnVpbGQtbW9kLWZpbHRlcixhYWEgZm9vIGJhciBmb28sLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGV2YWwgLWxvY2FsLWZ1bmMgPSAkJChjYWxsIHNuZSxmb28sJCQxKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsZm9vLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGJhciwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXIsZm9vIGJhciwtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxhYWEgYmFyLCQoY2FsbCAtYnVpbGQtbW9kLWZpbHRlcixhYWEgZm9vIGJhciwtbG9jYWwtZnVuYykpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRmlsdGVyIG91dCBhIGxpc3Qgb2YgbW9kdWxlcyB3aXRoIGEgcHJlZGljYXRlIGZ1bmN0aW9uCisjICQxOiBsaXN0IG9mIG1vZHVsZSBuYW1lcy4KKyMgJDI6IHByZWRpY2F0ZSBmdW5jdGlvbiwgd2lsbCBiZSBjYWxsZWQgd2l0aCAkKGNhbGwgJDIsPG5hbWU+KSwgaWYgdGhlCisjICAgICByZXN1bHQgaXMgbm90IGVtcHR5LCA8bmFtZT4gd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVzdWx0LgorIyBPdXQ6IHN1YnNldCBvZiBpbnB1dCBsaXN0LCB3aGVyZSBlYWNoIGl0ZW0gZG9lc24ndCBwYXNzIHRoZSBwcmVkaWNhdGUuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLWJ1aWxkLW1vZC1maWx0ZXItb3V0ID0gJChzdHJpcCBcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfZmlsdGVyX24sJDEsXAorICAgICAgICAkKGlmICQoY2FsbCAkMiwkKF9idWlsZF9tb2RfZmlsdGVyX24pKSwsJChfYnVpbGRfbW9kX2ZpbHRlcl9uKSlcCisgICAgKSkKKworLXRlc3QtYnVpbGQtbW9kLWZpbHRlci1vdXQgPSBcCisgICAgJChldmFsIC1sb2NhbC1mdW5jID0gJCQoY2FsbCBzZXEsZm9vLCQkMSkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIC1idWlsZC1tb2QtZmlsdGVyLW91dCwsLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWZpbHRlci1vdXQsZm9vLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGJhciwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXItb3V0LGZvbyBiYXIsLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsYWFhIGJhciwkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXItb3V0LGFhYSBmb28gYmFyIGZvbywtbG9jYWwtZnVuYykpXAorICAgICQoZXZhbCAtbG9jYWwtZnVuYyA9ICQkKGNhbGwgc25lLGZvbywkJDEpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWZpbHRlci1vdXQsLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgLWJ1aWxkLW1vZC1maWx0ZXItb3V0LGZvbywtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIC1idWlsZC1tb2QtZmlsdGVyLW91dCxmb28gYmFyLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbyBmb28sJChjYWxsIC1idWlsZC1tb2QtZmlsdGVyLW91dCxhYWEgZm9vIGJhciBmb28sLWxvY2FsLWZ1bmMpKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEZpbmQgdGhlIGZpcnN0IGl0ZW0gaW4gYSBsaXN0IHRoYXQgY2hlY2tzIGEgdmFsaWQgcHJlZGljYXRlLgorIyAkMTogbGlzdCBvZiBuYW1lcy4KKyMgJDI6IHByZWRpY2F0ZSBmdW5jdGlvbiwgd2lsbCBiZSBjYWxsZWQgd2l0aCAkKGNhbGwgJDIsPG5hbWU+KSwgaWYgdGhlCisjICAgICByZXN1bHQgaXMgbm90IGVtcHR5LCA8bmFtZT4gd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVzdWx0LgorIyBPdXQ6IHN1YnNldCBvZiBpbnB1dCBsaXN0LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy1idWlsZC1tb2QtZmluZC1maXJzdCA9ICQoZmlyc3R3b3JkICQoY2FsbCAtYnVpbGQtbW9kLWZpbHRlciwkMSwkMikpCisKKy10ZXN0LWJ1aWxkLW1vZC1maW5kLWZpcnN0LmVtcHR5ID0gXAorICAgICQoZXZhbCAtbG9jYWwtcHJlZCA9ICQkKGNhbGwgc2VxLGZvbywkJDEpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWZpbmQtZmlyc3QsLC1sb2NhbC1wcmVkKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgLWJ1aWxkLW1vZC1maW5kLWZpcnN0LGJhciwtbG9jYWwtcHJlZCkpCisKKy10ZXN0LWJ1aWxkLW1vZC1maW5kLWZpcnN0LnNpbXBsZSA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLXByZWQgPSAkJChjYWxsIHNlcSxmb28sJCQxKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgLWJ1aWxkLW1vZC1maW5kLWZpcnN0LGZvbywtbG9jYWwtcHJlZCkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIC1idWlsZC1tb2QtZmluZC1maXJzdCxhYWEgZm9vIGJhciwtbG9jYWwtcHJlZCkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIC1idWlsZC1tb2QtZmluZC1maXJzdCxhYWEgZm9vIGZvbyBiYXIsLWxvY2FsLXByZWQpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTWFueSB0cmVlIHdhbGtpbmcgb3BlcmF0aW9ucyByZXF1aXJlIHNldHRpbmcgYSAndmlzaXRlZCcgZmxhZyBvbgorIyBzcGVjaWZpYyBncmFwaCBub2Rlcy4gVGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb25zIGhlbHAgaW1wbGVtZW50CisjIHRoaXMgd2hpbGUgaGlkaW5nIGRldGFpbHMgdG8gdGhlIGNhbGxlcnMuCisjCisjIFRlY2huaWNhbCBub3RlOgorIyAgX2J1aWxkX21vZF90cmVlX3Zpc2l0ZWQuPG5hbWU+IHdpbGwgYmUgJ3RydWUnIGlmIHRoZSBub2RlIHdhcyB2aXNpdGVkLAorIyAgb3IgZW1wdHkgb3RoZXJ3aXNlLgorIworIyAgX2J1aWxkX21vZF90cmVlX3Zpc2l0b3JzIGxpc3RzIGFsbCB2aXNpdGVkIG5vZGVzLCB1c2VkIHRvIGNsZWFuIGFsbAorIyAgX2J1aWxkX21vZF90cmVlX3Zpc2l0ZWQuPG5hbWU+IHZhcmlhYmxlcyBpbiAtYnVpbGQtbW9kLXRyZWUtc2V0dXAtdmlzaXQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENhbGwgdGhpcyBiZWZvcmUgdHJlZSB0cmF2ZXJzYWwuCistYnVpbGQtbW9kLXRyZWUtc2V0dXAtdmlzaXQgPSBcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfdHJlZV92aXNpdG9yLCQoX2J1aWxkX21vZF90cmVlX3Zpc2l0b3JzKSxcCisgICAgICAgICQoZXZhbCBfYnVpbGRfbW9kX3RyZWVfdmlzaXRlZC4kJChfYnVpbGRfbW9kX3RyZWVfdmlzaXRvcikgOj0pKVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF90cmVlX3Zpc2l0b3JzIDo9KQorCisjIFJldHVybnMgbm9uLWVtcHR5IGlmIGEgbm9kZSB3YXMgdmlzaXRlZC4KKy1idWlsZC1tb2QtdHJlZS1pcy12aXNpdGVkID0gXAorICAgICQoX2J1aWxkX21vZF90cmVlX3Zpc2l0ZWQuJDEpCisKKyMgU2V0IHRoZSB2aXNpdGVkIHN0YXRlIG9mIGEgbm9kZSB0byAndHJ1ZScKKy1idWlsZC1tb2QtdHJlZS1zZXQtdmlzaXRlZCA9IFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF90cmVlX3Zpc2l0ZWQuJDEgOj0gdHJ1ZSlcCisgICAgJChldmFsIF9idWlsZF9tb2RfdHJlZV92aXNpdG9ycyArPSAkMSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1hbnkgZ3JhcGggd2Fsa2luZyBvcGVyYXRpb25zIHJlcXVpcmUgYSB3b3JrIHF1ZXVlIGFuZCBjb21wdXRpbmcKKyMgZGVwZW5kZW5jaWVzIC8gY2hpbGRyZW4gbm9kZXMuIEhlcmUgYXJlIGEgZmV3IGhlbHBlciBmdW5jdGlvbnMgdGhhdAorIyBjYW4gYmUgdXNlZCB0byBtYWtlIHRoZWlyIGNvZGUgY2xlYXJlci4gVGhpcyB1c2VzIGEgZmV3IGdsb2JhbAorIyB2YXJpYWJsZXMgdGhhdCBzaG91bGQgYmUgZGVmaW5lZCBhcyBmb2xsb3dzIGR1cmluZyB0aGUgb3BlcmF0aW9uOgorIworIyAgX2J1aWxkX21vZF9tb2R1bGUgICAgIGN1cnJlbnQgZ3JhcGggbm9kZSBuYW1lLgorIyAgX2J1aWxkX21vZF93cSAgICAgICAgIGN1cnJlbnQgbm9kZSB3b3JrIHF1ZXVlLgorIyAgX2J1aWxkX21vZF9saXN0ICAgICAgIGN1cnJlbnQgcmVzdWx0IChsaXN0IG9mIG5vZGVzKS4KKyMgIF9idWlsZF9tb2RfZGVwZW5kcyAgICBjdXJyZW50IGdyYXBoIG5vZGUncyBjaGlsZHJlbi4KKyMgICAgICAgICAgICAgICAgICAgICAgeW91IG11c3QgY2FsbCAtYnVpbGQtbW9kLWdldC1kZXBlbmRzIHRvIHNldCB0aGlzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBQb3AgZmlyc3QgaXRlbSBmcm9tIHdvcmstcXVldWUgaW50byBfYnVpbGRfbW9kX21vZHVsZS4KKy1idWlsZC1tb2QtcG9wLWZpcnN0ID0gXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX21vZHVsZSA6PSAkJChjYWxsIGZpcnN0LCQkKF9idWlsZF9tb2Rfd3EpKSlcCisgICAgJChldmFsIF9idWlsZF9tb2Rfd3EgICAgIDo9ICQkKGNhbGwgcmVzdCwkJChfYnVpbGRfbW9kX3dxKSkpCisKKy10ZXN0LWJ1aWxkLW1vZC1wb3AtZmlyc3QgPSBcCisgICAgJChldmFsIF9idWlsZF9tb2Rfd3EgOj0gQSBCIEMpXAorICAgICQoY2FsbCAtYnVpbGQtbW9kLXBvcC1maXJzdClcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEsJChfYnVpbGRfbW9kX21vZHVsZSkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxCIEMsJChfYnVpbGRfbW9kX3dxKSlcCisKKworIyBQdXNoIGxpc3Qgb2YgaXRlbXMgYXQgdGhlIGJhY2sgb2YgdGhlIHdvcmstcXVldWUuCistYnVpbGQtbW9kLXB1c2gtYmFjayA9IFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF93cSA6PSAkKHN0cmlwICQoX2J1aWxkX21vZF93cSkgJDEpKQorCistdGVzdC1idWlsZC1tb2QtcHVzaC1iYWNrID0gXAorICAkKGV2YWwgX2J1aWxkX21vZF93cSA6PSBBIEIgQylcCisgICQoY2FsbCAtYnVpbGQtbW9kLXB1c2gtYmFjaywgRCAgICBFKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LEEgQiBDIEQgRSwkKF9idWlsZF9tb2Rfd3EpKQorCisjIFNldCBfYnVpbGRfbW9kX2RlcGVuZHMgdG8gdGhlIGRpcmVjdCBkZXBlbmRlbmNpZXMgb2YgX2J1aWxkX21vZF9tb2R1bGUKKy1idWlsZC1tb2QtZ2V0LWRlcGVuZHMgPSBcCisgICAgJChldmFsIF9idWlsZF9tb2RfZGVwZW5kcyA6PSAkJChjYWxsICQkKF9idWlsZF9tb2RfZGVwc19mdW5jKSwkJChfYnVpbGRfbW9kX21vZHVsZSkpKQorCisjIFNldCBfYnVpbGRfbW9kX2RlcGVuZHMgdG8gdGhlIGRpcmVjdCBkZXBlbmRlbmNpZXMgb2YgX2J1aWxkX21vZF9tb2R1bGUgdGhhdAorIyBhcmUgbm90IGFscmVhZHkgaW4gX2J1aWxkX21vZF9saXN0LgorLWJ1aWxkLW1vZC1nZXQtbmV3LWRlcGVuZHMgPSBcCisgICAgJChjYWxsIC1idWlsZC1tb2QtZ2V0LWRlcGVuZHMpXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX2RlcGVuZHMgOj0gJCQoZmlsdGVyLW91dCAkJChfYnVpbGRfbW9kX2xpc3QpLCQkKF9idWlsZF9tb2RfZGVwZW5kcykpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21wdXRlIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUKKyMgJDE6IGxpc3Qgb2YgbW9kdWxlcy4KKyMgJDI6IGRlcGVuZGVuY3kgZnVuY3Rpb24sICQoY2FsbCAkMiw8bW9kdWxlPikgc2hvdWxkIHJldHVybiBhbGwgdGhlCisjICAgICBtb2R1bGUgdGhhdCA8bW9kdWxlPiBkZXBlbmRzIG9uLgorIyBPdXQ6IHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgbW9kdWxlcyBmcm9tIHRob3NlIGluICQxLiBBbHdheXMgaW5jbHVkZXMKKyMgICAgICB0aGUgbW9kdWxlcyBpbiAkMS4gT3JkZXIgaXMgcmFuZG9tLgorIworIyBJbXBsZW1lbnRhdGlvbiBub3RlOgorIyAgIHdlIHVzZSB0aGUgLWJ1aWxkLW1vZC10cmVlLXh4eCBmdW5jdGlvbnMgdG8gZmxhZyAndmlzaXRlZCcgbm9kZXMKKyMgICBpbiB0aGUgZ3JhcGguIEEgbm9kZSBpcyB2aXNpdGVkIG9uY2UgaXQgaGFzIGJlZW4gcHV0IGludG8gdGhlIHdvcmsKKyMgICBxdWV1ZS4gRm9yIGVhY2ggaXRlbSBpbiB0aGUgd29yayBxdWV1ZSwgZ2V0IHRoZSBkZXBlbmRlbmNpZXMgYW5kCisjICAgYXBwZW5kIGFsbCB0aG9zZSB0aGF0IHdlcmUgbm90IHZpc2l0ZWQgeWV0LgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy1idWlsZC1tb2QtZ2V0LWNsb3N1cmUgPSAkKHN0cmlwIFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF93cSA6PSlcCisgICAgJChldmFsIF9idWlsZF9tb2RfbGlzdCA6PSlcCisgICAgJChldmFsIF9idWlsZF9tb2RfZGVwc19mdW5jIDo9ICQyKVwKKyAgICAkKGNhbGwgLWJ1aWxkLW1vZC10cmVlLXNldHVwLXZpc2l0KVwKKyAgICAkKGZvcmVhY2ggX2J1aWxkX21vZF9tb2R1bGUsJDEsXAorICAgICAgICAkKGNhbGwgLWJ1aWxkLW1vZC1jbG9zdXJlLXZpc2l0LCQoX2J1aWxkX21vZF9tb2R1bGUpKVwKKyAgICApXAorICAgICQoY2FsbCAtYnVpbGQtbW9kLWNsb3N1cmUtcmVjdXJzaXZlKVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF9kZXBzIDo9KVwKKyAgICAkKF9idWlsZF9tb2RfbGlzdClcCisgICAgKQorCisjIFVzZWQgaW50ZXJuYWxseSB0byB2aXNpdCBhIG5ldyBub2RlIGR1cmluZyAtYnVpbGQtbW9kLWdldC1jbG9zdXJlLgorIyBUaGlzIGFwcGVuZHMgdGhlIG5vZGUgdG8gdGhlIHdvcmsgcXVldWUsIGFuZCBzZXQgaXRzICd2aXNpdCcgZmxhZy4KKy1idWlsZC1tb2QtY2xvc3VyZS12aXNpdCA9IFwKKyAgICAkKGNhbGwgLWJ1aWxkLW1vZC1wdXNoLWJhY2ssJDEpXAorICAgICQoY2FsbCAtYnVpbGQtbW9kLXRyZWUtc2V0LXZpc2l0ZWQsJDEpCisKKy1idWlsZC1tb2QtY2xvc3VyZS1yZWN1cnNpdmUgPSBcCisgICAgJChjYWxsIC1idWlsZC1tb2QtcG9wLWZpcnN0KVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF9saXN0ICs9ICQkKF9idWlsZF9tb2RfbW9kdWxlKSlcCisgICAgJChjYWxsIC1idWlsZC1tb2QtZ2V0LWRlcGVuZHMpXAorICAgICQoZm9yZWFjaCBfYnVpbGRfbW9kX2RlcCwkKF9idWlsZF9tb2RfZGVwZW5kcyksXAorICAgICAgICAkKGlmICQoY2FsbCAtYnVpbGQtbW9kLXRyZWUtaXMtdmlzaXRlZCwkKF9idWlsZF9tb2RfZGVwKSksLFwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtY2xvc3VyZS12aXNpdCwkKF9idWlsZF9tb2RfZGVwKSlcCisgICAgICAgIClcCisgICAgKVwKKyAgICAkKGlmICQoX2J1aWxkX21vZF93cSksJChjYWxsIC1idWlsZC1tb2QtY2xvc3VyZS1yZWN1cnNpdmUpKQorCistdGVzdC1idWlsZC1tb2QtZ2V0LWNsb3N1cmUuZW1wdHkgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWdldC1jbG9zdXJlLCwtbG9jYWwtZGVwcykpCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtY2xvc3VyZS5zaW5nbGUgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9KVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQSwkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtY2xvc3VyZSxBLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC1jbG9zdXJlLmRvdWJsZSA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEgQiwkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtY2xvc3VyZSxBLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC1jbG9zdXJlLmNpcmN1bGFyLWRlcHMgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9IEIpXAorICAgICQoZXZhbCBCX2RlcGVuZHMgOj0gQylcCisgICAgJChldmFsIENfZGVwZW5kcyA6PSBBKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQSBCIEMsJChjYWxsIC1idWlsZC1tb2QtZ2V0LWNsb3N1cmUsQSwtbG9jYWwtZGVwcykpCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtY2xvc3VyZS5BQkNERSA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQiBDKVwKKyAgICAkKGV2YWwgQl9kZXBlbmRzIDo9IEQpXAorICAgICQoZXZhbCBDX2RlcGVuZHMgOj0gRCBFKVwKKyAgICAkKGV2YWwgRF9kZXBlbmRzIDo9KVwKKyAgICAkKGV2YWwgRV9kZXBlbmRzIDo9KVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQSBCIEMgRCBFLCQoY2FsbCAtYnVpbGQtbW9kLWdldC1jbG9zdXJlLEEsLWxvY2FsLWRlcHMpKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRm9yIHRvcG9sb2dpY2FsIHNvcnQsIHdlIG5lZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiBpbmNvbWluZyBlZGdlcworIyBpbiBlYWNoIGdyYXBoIG5vZGUuIFRoZSBmb2xsb3dpbmcgaGVscGVyIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhpcyBhbmQKKyMgaGlkZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorIworIyBDb3VudCB0aGUgbnVtYmVyIG9mIGluY29taW5nIGVkZ2VzIGZvciBlYWNoIG5vZGUgZHVyaW5nIHRvcG9sb2dpY2FsCisjIHNvcnQgd2l0aCBhIHN0cmluZyBvZiB4eHh4cy4gSS5lLjoKKyMgIDAgZWRnZSAgLT4gJycKKyMgIDEgZWRnZSAgLT4gJ3gnCisjICAyIGVkZ2VzIC0+ICd4eCcKKyMgIDMgZWRnZXMgLT4gJ3h4eCcKKyMgIGV0Yy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB6ZXJvIHRoZSBpbmNvbWluZyBlZGdlIGNvdW50ZXIgZm9yIG1vZHVsZSAkMQorLWJ1aWxkLW1vZC10b3BvLXplcm8taW5jb21pbmcgPSBcCisgICAgJChldmFsIF9idWlsZF9tb2RfdG9wb19pbmNvbWluZy4kMSA6PSkKKworIyBpbmNyZW1lbnQgdGhlIGluY29taW5nIGVkZ2UgY291bnRlciBmb3IgbW9kdWxlICQxCistYnVpbGQtbW9kLXRvcG8taW5jcmVtZW50LWluY29taW5nID0gXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX3RvcG9faW5jb21pbmcuJDEgOj0gJCQoX2J1aWxkX21vZF90b3BvX2luY29taW5nLiQxKXgpCisKKyMgZGVjcmVtZW50IHRoZSBpbmNvbWluZyBlZGdlIGNvdW50ZXIgZm9yIG1vZHVsZSAkMQorLWJ1aWxkLW1vZC10b3BvLWRlY3JlbWVudC1pbmNvbWluZyA9IFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF90b3BvX2luY29taW5nLiQxIDo9ICQkKF9idWlsZF9tb2RfdG9wb19pbmNvbWluZy4kMToleD0lKSkKKworIyByZXR1cm4gbm9uLWVtcHR5IGlmIHRoZSBtb2R1bGUgJDEncyBpbmNvbWluZyBlZGdlIGNvdW50ZXIgaXMgPiAwCistYnVpbGQtbW9kLXRvcG8taGFzLWluY29taW5nID0gJChfYnVpbGRfbW9kX3RvcG9faW5jb21pbmcuJDEpCisKKyMgRmluZCBmaXJzdCBub2RlIGluIGEgbGlzdCB0aGF0IGhhcyB6ZXJvIGluY29taW5nIGVkZ2VzLgorIyAkMTogbGlzdCBvZiBub2RlcworIyBPdXQ6IGZpcnN0IG5vZGUgdGhhdCBoYXMgemVybyBpbmNvbWluZyBlZGdlcywgb3IgZW1wdHkuCistYnVpbGQtbW9kLXRvcG8tZmluZC1maXJzdC16ZXJvLWluY29taW5nID0gJChmaXJzdHdvcmQgJChjYWxsIC1idWlsZC1tb2QtZmlsdGVyLW91dCwkMSwtYnVpbGQtbW9kLXRvcG8taGFzLWluY29taW5nKSkKKworIyBPbmx5IHVzZSBmb3IgZGVidWdnaW5nOgorLWJ1aWxkLW1vZC10b3BvLWR1bXAtY291bnQgPSBcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfbW9kdWxlLCQxLFwKKyAgICAgICAgJChpbmZvIC4uICQoX2J1aWxkX21vZF9tb2R1bGUpIGluY29taW5nPSckKF9idWlsZF9tb2RfdG9wb19pbmNvbWluZy4kKF9idWlsZF9tb2RfbW9kdWxlKSknKSkKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmV0dXJuIHRoZSB0b3BvbG9naWNhbGx5IG9yZGVyZWQgY2xvc3VyZSBvZiBhbGwgbm9kZXMgZnJvbSBhIHRvcC1sZXZlbAorIyBvbmUuIFRoaXMgbWVhbnMgdGhhdCBhIG5vZGUgQSwgaW4gdGhlIHJlc3VsdCwgd2lsbCBhbHdheXMgYXBwZWFyIGFmdGVyCisjIG5vZGUgQiBpZiBBIGRlcGVuZHMgb24gQi4gQXNzdW1lcyB0aGF0IHRoZSBncmFwaCBpcyBhIERBRyAoaWYgdGhlcmUgYXJlCisjIGNpcmN1bGFyIGRlcGVuZGVuY2llcywgdGhpcyBwcm9wZXJ0eSBjYW5ub3QgYmUgZ3VhcmFudGVlZCwgYnV0IGF0IGxlYXN0CisjIHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IGxvb3AgaW5maW5pdGVseSkuCisjCisjICQxOiB0b3AtbGV2ZWwgbm9kZSBuYW1lLgorIyAkMjogZGVwZW5kZW5jeSBmdW5jdGlvbiwgaS5lLiAkKGNhbGwgJDIsPG5hbWU+KSByZXR1cm5zIHRoZSBjaGlsZHJlbgorIyAgICAgbm9kZXMgZm9yIDxuYW1lPi4KKyMgUmV0dXJuOiBsaXN0IG9mIG5vZGVzLCBpbmNsdWRlICQxLCB3aGljaCB3aWxsIGFsd2F5cyBiZSB0aGUgZmlyc3QuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCistYnVpbGQtbW9kLWdldC10b3BvLWxpc3QgPSAkKHN0cmlwIFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF90b3BfbW9kdWxlIDo9ICQxKVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF9kZXBzX2Z1bmMgOj0gJDIpXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX25vZGVzIDo9ICQoY2FsbCAtYnVpbGQtbW9kLWdldC1jbG9zdXJlLCQxLCQyKSlcCisgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby1jb3VudCwkKF9idWlsZF9tb2Rfbm9kZXMpKVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF9saXN0IDo9KVwKKyAgICAkKGV2YWwgX2J1aWxkX21vZF93cSA6PSAkKGNhbGwgLWJ1aWxkLW1vZC10b3BvLWZpbmQtZmlyc3QtemVyby1pbmNvbWluZywkKF9idWlsZF9tb2Rfbm9kZXMpKSlcCisgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby1zb3J0KVwKKyAgICAkKF9idWlsZF9tb2RfbGlzdCkgJChfYnVpbGRfbW9kX25vZGVzKVwKKyAgICApCisKKyMgR2l2ZW4gYSBjbG9zdXJlIGxpc3Qgb2Ygbm9kZXMsIGNvdW50IHRoZWlyIGluY29taW5nIGVkZ2VzLgorIyAkMTogbGlzdCBvZiBub2RlcywgbXVzdCBiZSBhIGdyYXBoIGNsb3N1cmUuCistYnVpbGQtbW9kLXRvcG8tY291bnQgPSBcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfbW9kdWxlLCQxLFwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby16ZXJvLWluY29taW5nLCQoX2J1aWxkX21vZF9tb2R1bGUpKSlcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfbW9kdWxlLCQxLFwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtZ2V0LWRlcGVuZHMpXAorICAgICAgICAkKGZvcmVhY2ggX2J1aWxkX21vZF9kZXAsJChfYnVpbGRfbW9kX2RlcGVuZHMpLFwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby1pbmNyZW1lbnQtaW5jb21pbmcsJChfYnVpbGRfbW9kX2RlcCkpXAorICAgICAgICApXAorICAgICkKKworLWJ1aWxkLW1vZC10b3BvLXNvcnQgPSBcCisgICAgJChjYWxsIC1idWlsZC10b3BvLWRlYnVnLC1idWlsZC1tb2QtdG9wby1zb3J0OiB3cT0nJChfYnVpbGRfbW9kX3dxKScgbGlzdD0nJChfYnVpbGRfbW9kX2xpc3QpJylcCisgICAgJChjYWxsIC1idWlsZC1tb2QtcG9wLWZpcnN0KVwKKyAgICAkKGlmICQoX2J1aWxkX21vZF9tb2R1bGUpLFwKKyAgICAgICAgJChldmFsIF9idWlsZF9tb2RfbGlzdCArPSAkKF9idWlsZF9tb2RfbW9kdWxlKSlcCisgICAgICAgICQoZXZhbCBfYnVpbGRfbW9kX25vZGVzIDo9ICQoZmlsdGVyLW91dCAkKF9idWlsZF9tb2RfbW9kdWxlKSwkKF9idWlsZF9tb2Rfbm9kZXMpKSlcCisgICAgICAgICQoY2FsbCAtYnVpbGQtbW9kLXRvcG8tZGVjcmVtZW50LWluY29taW5nLCQoX2J1aWxkX21vZF9tb2R1bGUpKVwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtZ2V0LWRlcGVuZHMpXAorICAgICAgICAkKGNhbGwgLWJ1aWxkLXRvcG8tZGVidWcsLWJ1aWxkLW1vZC10b3BvLXNvcnQ6ICAgZGVwcz0nJChfYnVpbGRfbW9kX2RlcGVuZHMpJylcCisgICAgICAgICQoZm9yZWFjaCBfYnVpbGRfbW9kX2RlcCwkKF9idWlsZF9tb2RfZGVwZW5kcyksXAorICAgICAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby1kZWNyZW1lbnQtaW5jb21pbmcsJChfYnVpbGRfbW9kX2RlcCkpXAorICAgICAgICAgICAgJChpZiAkKGNhbGwgLWJ1aWxkLW1vZC10b3BvLWhhcy1pbmNvbWluZywkKF9idWlsZF9tb2RfZGVwKSksLFwKKyAgICAgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLW1vZC1wdXNoLWJhY2ssJChfYnVpbGRfbW9kX2RlcCkpXAorICAgICAgICAgICAgKVwKKyAgICAgICAgKVwKKyAgICAgICAgJChjYWxsIC1idWlsZC1tb2QtdG9wby1zb3J0KVwKKyAgICApCisKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvLWxpc3QuZW1wdHkgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWdldC10b3BvLWxpc3QsLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvLWxpc3Quc2luZ2xlID0gXAorICAgICQoZXZhbCAtbG9jYWwtZGVwcyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEsJChjYWxsIC1idWlsZC1tb2QtZ2V0LXRvcG8tbGlzdCxBLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvLWxpc3Qubm8taW5maW5pdGUtbG9vcCA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSBDKVwKKyAgICAkKGV2YWwgQ19kZXBlbmRzIDo9IEEpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxBIEIgQywkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtdG9wby1saXN0LEEsLWxvY2FsLWRlcHMpKQorCistdGVzdC1idWlsZC1tb2QtZ2V0LXRvcG8tbGlzdC5BQkMgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9IEIgQylcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSlcCisgICAgJChldmFsIENfZGVwZW5kcyA6PSBCKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQSBDIEIsJChjYWxsIC1idWlsZC1tb2QtZ2V0LXRvcG8tbGlzdCxBLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvLWxpc3QuQUJDRCA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQiBDKVwKKyAgICAkKGV2YWwgQl9kZXBlbmRzIDo9IEQpXAorICAgICQoZXZhbCBDX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIERfZGVwZW5kcyA6PSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEgQyBCIEQsJChjYWxsIC1idWlsZC1tb2QtZ2V0LXRvcG8tbGlzdCxBLC1sb2NhbC1kZXBzKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvLWxpc3QuQUJDLmNpcmN1bGFyID0gXAorICAgICQoZXZhbCAtbG9jYWwtZGVwcyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSBCKVwKKyAgICAkKGV2YWwgQl9kZXBlbmRzIDo9IEMpXAorICAgICQoZXZhbCBDX2RlcGVuZHMgOj0gQilcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEgQiBDLCQoY2FsbCAtYnVpbGQtbW9kLWdldC10b3BvLWxpc3QsQSwtbG9jYWwtZGVwcykpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUmV0dXJuIHRoZSB0b3BvbG9naWNhbGx5IG9yZGVyZWQgY2xvc3VyZSBvZiBhbGwgZGVwZW5kZW5jaWVzIGZyb20gYQorIyB0b3AtbGV2ZWwgbm9kZS4KKyMKKyMgJDE6IHRvcC1sZXZlbCBub2RlIG5hbWUuCisjICQyOiBkZXBlbmRlbmN5IGZ1bmN0aW9uLCBpLmUuICQoY2FsbCAkMiw8bmFtZT4pIHJldHVybnMgdGhlIGNoaWxkcmVuCisjICAgICBub2RlcyBmb3IgPG5hbWU+LgorIyBSZXR1cm46IGxpc3Qgb2Ygbm9kZXMsIGluY2x1ZGUgJDEsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgaW5jbHVkZWQuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCistYnVpbGQtbW9kLWdldC10b3BvbG9naWNhbC1kZXBlbmRzID0gJChjYWxsIHJlc3QsJChjYWxsIC1idWlsZC1tb2QtZ2V0LXRvcG8tbGlzdCwkMSwkMikpCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtdG9wb2xvZ2ljYWwtZGVwZW5kcy5zaW1wbGUgPSBcCisgICAgJChldmFsIC1sb2NhbC1nZXQtZGVwcyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSBCKVwKKyAgICAkKGV2YWwgQl9kZXBlbmRzIDo9KVwKKyAgICAkKGV2YWwgdG9wb19kZXBzIDo9ICQkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtdG9wb2xvZ2ljYWwtZGVwZW5kcyxBLC1sb2NhbC1nZXQtZGVwcykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxCLCQodG9wb19kZXBzKSx0b3BvIGRlcGVuZGVuY2llcykKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvbG9naWNhbC1kZXBlbmRzLkFCQyA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWdldC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9IEIgQylcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSlcCisgICAgJChldmFsIENfZGVwZW5kcyA6PSBCKVwKKyAgICAkKGV2YWwgYmZzX2RlcHMgOj0gJCQoY2FsbCAtYnVpbGQtbW9kLWdldC1iZnMtZGVwZW5kcyxBLC1sb2NhbC1nZXQtZGVwcykpXAorICAgICQoZXZhbCB0b3BvX2RlcHMgOj0gJCQoY2FsbCAtYnVpbGQtbW9kLWdldC10b3BvbG9naWNhbC1kZXBlbmRzLEEsLWxvY2FsLWdldC1kZXBzKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEIgQywkKGJmc19kZXBzKSxkZnMgZGVwZW5kZW5jaWVzKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQyBCLCQodG9wb19kZXBzKSx0b3BvIGRlcGVuZGVuY2llcykKKworLXRlc3QtYnVpbGQtbW9kLWdldC10b3BvbG9naWNhbC1kZXBlbmRzLmNpcmN1bGFyID0gXAorICAgICQoZXZhbCAtbG9jYWwtZ2V0LWRlcHMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSBDKVwKKyAgICAkKGV2YWwgQ19kZXBlbmRzIDo9IEIpXAorICAgICQoZXZhbCBiZnNfZGVwcyA6PSAkJChjYWxsIC1idWlsZC1tb2QtZ2V0LWJmcy1kZXBlbmRzLEEsLWxvY2FsLWdldC1kZXBzKSlcCisgICAgJChldmFsIHRvcG9fZGVwcyA6PSAkJChjYWxsIC1idWlsZC1tb2QtZ2V0LXRvcG9sb2dpY2FsLWRlcGVuZHMsQSwtbG9jYWwtZ2V0LWRlcHMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQiBDLCQoYmZzX2RlcHMpLGRmcyBkZXBlbmRlbmNpZXMpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxCIEMsJCh0b3BvX2RlcHMpLHRvcG8gZGVwZW5kZW5jaWVzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJldHVybiBicmVhZHRoLWZpcnN0IHdhbGsgb2YgYSBncmFwaCwgc3RhcnRpbmcgZnJvbSBhbiBhcmJpdHJhcnkKKyMgbm9kZS4KKyMKKyMgVGhpcyBwZXJmb3JtcyBhIGJyZWFkdGgtZmlyc3Qgd2FsayBvZiB0aGUgZ3JhcGggYW5kIHdpbGwgcmV0dXJuIGEKKyMgbGlzdCBvZiBub2Rlcy4gTm90ZSB0aGF0ICQxIHdpbGwgYWx3YXlzIGJlIHRoZSBmaXJzdCBpbiB0aGUgbGlzdC4KKyMKKyMgJDE6IHJvb3Qgbm9kZSBuYW1lLgorIyAkMjogZGVwZW5kZW5jeSBmdW5jdGlvbiwgaS5lLiAkKGNhbGwgJDIsPG5hbWU+KSByZXR1cm5zIHRoZSBub2RlcworIyAgICAgdGhhdCA8bmFtZT4gZGVwZW5kcyBvbi4KKyMgUmVzdWx0OiBsaXN0IG9mIGRlcGVuZGVudCBtb2R1bGVzLCAkMSB3aWxsIGJlIHBhcnQgb2YgaXQuCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCistYnVpbGQtbW9kLWdldC1iZnMtbGlzdCA9ICQoc3RyaXAgXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX3dxIDo9ICQoY2FsbCBzdHJpcC1saWItcHJlZml4LCQxKSkgXAorICAgICQoZXZhbCBfYnVpbGRfbW9kX2RlcHNfZnVuYyA6PSAkMilcCisgICAgJChldmFsIF9idWlsZF9tb2RfbGlzdCA6PSlcCisgICAgJChjYWxsIC1idWlsZC1tb2QtdHJlZS1zZXR1cC12aXNpdClcCisgICAgJChjYWxsIC1idWlsZC1tb2QtdHJlZS1zZXQtdmlzaXRlZCwkKF9idWlsZF9tb2Rfd3EpKVwKKyAgICAkKGNhbGwgLWJ1aWxkLW1vZC1iZnMtcmVjdXJzaXZlKSBcCisgICAgJChfYnVpbGRfbW9kX2xpc3QpKQorCisjIFJlY3Vyc2l2ZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gYSBkZXB0aC1maXJzdCBzY2FuLgorIyBNdXN0IGluaXRpYWxpemUgX2J1aWxkX21vZF9saXN0LCBfYnVpbGRfbW9kX2ZpZWxkLCBfYnVpbGRfbW9kX3dxCisjIGJlZm9yZSBjYWxsaW5nIHRoaXMuCistYnVpbGQtbW9kLWJmcy1yZWN1cnNpdmUgPSBcCisgICAgJChjYWxsIC1idWlsZC1tb2QtZGVidWcsLWJ1aWxkLW1vZC1iZnMtcmVjdXJzaXZlIHdxPSckKF9idWlsZF9tb2Rfd3EpJyBsaXN0PSckKF9idWlsZF9tb2RfbGlzdCknIHZpc2l0ZWQ9JyQoX2J1aWxkX21vZF90cmVlX3Zpc2l0b3JzKScpXAorICAgICQoY2FsbCAtYnVpbGQtbW9kLXBvcC1maXJzdClcCisgICAgJChldmFsIF9idWlsZF9tb2RfbGlzdCArPSAkJChfYnVpbGRfbW9kX21vZHVsZSkpXAorICAgICQoY2FsbCAtYnVpbGQtbW9kLWdldC1kZXBlbmRzKVwKKyAgICAkKGNhbGwgLWJ1aWxkLW1vZC1kZWJ1ZywuICBub2RlPSckKF9idWlsZF9tb2RfbW9kdWxlKScgZGVwcz0nJChfYnVpbGRfbW9kX2RlcGVuZHMpJylcCisgICAgJChmb3JlYWNoIF9idWlsZF9tb2RfY2hpbGQsJChfYnVpbGRfbW9kX2RlcGVuZHMpLFwKKyAgICAgICAgJChpZiAkKGNhbGwgLWJ1aWxkLW1vZC10cmVlLWlzLXZpc2l0ZWQsJChfYnVpbGRfbW9kX2NoaWxkKSksLFwKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtbW9kLXRyZWUtc2V0LXZpc2l0ZWQsJChfYnVpbGRfbW9kX2NoaWxkKSlcCisgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLW1vZC1wdXNoLWJhY2ssJChfYnVpbGRfbW9kX2NoaWxkKSlcCisgICAgICAgIClcCisgICAgKVwKKyAgICAkKGlmICQoX2J1aWxkX21vZF93cSksJChjYWxsIC1idWlsZC1tb2QtYmZzLXJlY3Vyc2l2ZSkpCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtYmZzLWxpc3QuZW1wdHkgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCAtYnVpbGQtbW9kLWdldC1iZnMtbGlzdCwsLWxvY2FsLWRlcHMpKQorCistdGVzdC1idWlsZC1tb2QtZ2V0LWJmcy1saXN0LkEgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9KVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQSwkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtYmZzLWxpc3QsQSwtbG9jYWwtZGVwcykpCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtYmZzLWxpc3QuQUJDREVGID0gXAorICAgICQoZXZhbCAtbG9jYWwtZGVwcyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSBCIEMpXAorICAgICQoZXZhbCBCX2RlcGVuZHMgOj0gRCBFKVwKKyAgICAkKGV2YWwgQ19kZXBlbmRzIDo9IEYgRSlcCisgICAgJChldmFsIERfZGVwZW5kcyA6PSlcCisgICAgJChldmFsIEVfZGVwZW5kcyA6PSlcCisgICAgJChldmFsIEZfZGVwZW5kcyA6PSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEEgQiBDIEQgRSBGLCQoY2FsbCAtYnVpbGQtbW9kLWdldC1iZnMtbGlzdCxBLC1sb2NhbC1kZXBzKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZXR1cm4gYnJlYWR0aC1maXJzdCB3YWxrIG9mIGEgZ3JhcGgsIHN0YXJ0aW5nIGZyb20gYW4gYXJiaXRyYXJ5CisjIG5vZGUuCisjCisjIFRoaXMgcGVyZm9ybXMgYSBicmVhZHRoLWZpcnN0IHdhbGsgb2YgdGhlIGdyYXBoIGFuZCB3aWxsIHJldHVybiBhCisjIGxpc3Qgb2Ygbm9kZXMuIE5vdGUgdGhhdCAkMSB3aWxsIF9ub3RfIGJlIHBhcnQgb2YgdGhlIGxpc3QuCisjCisjICQxOiByb290IG5vZGUgbmFtZS4KKyMgJDI6IGRlcGVuZGVuY3kgZnVuY3Rpb24sIGkuZS4gJChjYWxsICQyLDxuYW1lPikgcmV0dXJucyB0aGUgbm9kZXMKKyMgICAgIHRoYXQgPG5hbWU+IGRlcGVuZHMgb24uCisjIFJlc3VsdDogbGlzdCBvZiBkZXBlbmRlbnQgbW9kdWxlcywgJDEgd2lsbCBub3QgYmUgcGFydCBvZiBpdC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy1idWlsZC1tb2QtZ2V0LWJmcy1kZXBlbmRzID0gJChjYWxsIHJlc3QsJChjYWxsIC1idWlsZC1tb2QtZ2V0LWJmcy1saXN0LCQxLCQyKSkKKworLXRlc3QtYnVpbGQtbW9kLWdldC1iZnMtZGVwZW5kcy5zaW1wbGUgPSBcCisgICAgJChldmFsIC1sb2NhbC1kZXBzLWZ1bmMgPSAkJCgkJDFfZGVwZW5kcykpXAorICAgICQoZXZhbCBBX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSlcCisgICAgJChldmFsIGRlcHMgOj0gJCQoY2FsbCAtYnVpbGQtbW9kLWdldC1iZnMtZGVwZW5kcyxBLC1sb2NhbC1kZXBzLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQiwkKGRlcHMpKQorCistdGVzdC1idWlsZC1tb2QtZ2V0LWJmcy1kZXBlbmRzLkFCQyA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMtZnVuYyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSBCIEMpXAorICAgICQoZXZhbCBCX2RlcGVuZHMgOj0pXAorICAgICQoZXZhbCBDX2RlcGVuZHMgOj0gQilcCisgICAgJChldmFsIGRlcHMgOj0gJCQoY2FsbCAtYnVpbGQtbW9kLWdldC1iZnMtZGVwZW5kcyxBLC1sb2NhbC1kZXBzLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsQiBDLCQoZGVwcykpXAorCistdGVzdC1idWlsZC1tb2QtZ2V0LWJmcy1kZXBlbmRzLkFCQ0RFID0gXAorICAgICQoZXZhbCAtbG9jYWwtZGVwcy1mdW5jID0gJCQoJCQxX2RlcGVuZHMpKVwKKyAgICAkKGV2YWwgQV9kZXBlbmRzIDo9IEIgQylcCisgICAgJChldmFsIEJfZGVwZW5kcyA6PSBEKVwKKyAgICAkKGV2YWwgQ19kZXBlbmRzIDo9IEQgRSBGKVwKKyAgICAkKGV2YWwgRF9kZXBlbmRzIDo9KVwKKyAgICAkKGV2YWwgRV9kZXBlbmRzIDo9KVwKKyAgICAkKGV2YWwgRl9kZXBlbmRzIDo9KVwKKyAgICAkKGV2YWwgZGVwcyA6PSAkJChjYWxsIC1idWlsZC1tb2QtZ2V0LWJmcy1kZXBlbmRzLEEsLWxvY2FsLWRlcHMtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxCIEMgRCBFIEYsJChkZXBzKSlcCisKKy10ZXN0LWJ1aWxkLW1vZC1nZXQtYmZzLWRlcGVuZHMubG9vcCA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLWRlcHMtZnVuYyA9ICQkKCQkMV9kZXBlbmRzKSlcCisgICAgJChldmFsIEFfZGVwZW5kcyA6PSBCKVwKKyAgICAkKGV2YWwgQl9kZXBlbmRzIDo9IEEpXAorICAgICQoZXZhbCBkZXBzIDo9ICQkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtYmZzLWRlcGVuZHMsQSwtbG9jYWwtZGVwcy1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LEIsJChkZXBzKSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1ob3N0Lm1rIGIvYW5kcm9pZC9idWlsZC9jb3JlL2RlZmluaXRpb25zLWhvc3QubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3YTk5MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1ob3N0Lm1rCkBAIC0wLDAgKzEsMjY3IEBACisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFRoZXNlIGRlZmluaXRpb25zIGNvbnRhaW4gYSBmZXcgaG9zdC1zcGVjaWZpYyBmdW5jdGlvbnMuIEkuZS4gdGhleSBhcmUKKyMgdHlwaWNhbGx5IHVzZWQgdG8gZ2VuZXJhdGUgc2hlbGwgY29tbWFuZHMgZHVyaW5nIHRoZSBidWlsZCBhbmQgdGhlaXIKKyMgaW1wbGVtZW50YXRpb24gd2lsbCBkZXBlbmQgb24gdGhlIHZhbHVlIG9mIHRoZSBCVUlMRF9IT1NUX09TIHZhcmlhYmxlLgorIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogaG9zdC1wYXRoCisjIEFyZ3VtZW50czogMTogZmlsZSBwYXRoCisjIFJldHVybnMgIDogZmlsZSBwYXRoLCBhcyB1bmRlcnN0b29kIGJ5IHRoZSBob3N0IGZpbGUgc3lzdGVtCisjIFVzYWdlICAgIDogJChjYWxsIGhvc3QtcGF0aCw8cGF0aD4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBDeWd3aW4gcGF0aHMgaW50bworIyAgICAgICAgICAgIEN5Z3dpbi1zcGVjaWZpYyBvbmVzLiBPbiBvdGhlciBwbGF0Zm9ybXMsIGl0IHdpbGwganVzdAorIyAgICAgICAgICAgIHJldHVybiBpdHMgYXJndW1lbnQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLGN5Z3dpbikKK2hvc3QtcGF0aCA9ICQoaWYgJChzdHJpcCAkMSksJChjYWxsIGN5Z3dpbi10by1ob3N0LXBhdGgsJDEpKQorZWxzZQoraG9zdC1wYXRoID0gJDEKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBob3N0LXJtCisjIEFyZ3VtZW50czogMTogbGlzdCBvZiBmaWxlcworIyBVc2FnZSAgICA6ICQoY2FsbCBob3N0LXJtLDxmaWxlcz4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRvIHRoZSBob3N0LXNwZWNpZmljIHNoZWxsIGNvbW1hbmQgdXNlZAorIyAgICAgICAgICAgIHRvIHJlbW92ZSBzb21lIGZpbGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQoraG9zdC1ybSA9IFwKKyAgICAkKGV2YWwgX19ob3N0X3JtX2ZpbGVzIDo9ICQoZm9yZWFjaCBfX2hvc3Rfcm1fZmlsZSwkMSwkKHN1YnN0IC8sXCwkKHdpbGRjYXJkICQoX19ob3N0X3JtX2ZpbGUpKSkpKVwKKyAgICAkKGlmICQoX19ob3N0X3JtX2ZpbGVzKSxkZWwgL2YvcSAkKF9faG9zdF9ybV9maWxlcykgPk5VTCAyPk5VTCkKK2Vsc2UKK2hvc3Qtcm0gPSBybSAtZiAkMQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGhvc3Qtcm1kaXIKKyMgQXJndW1lbnRzOiAxOiBsaXN0IG9mIGZpbGVzIG9yIGRpcmVjdG9yaWVzCisjIFVzYWdlICAgIDogJChjYWxsIGhvc3Qtcm0sPGZpbGVzPikKKyMgUmF0aW9uYWxlOiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgdG8gdGhlIGhvc3Qtc3BlY2lmaWMgc2hlbGwgY29tbWFuZCB1c2VkCisjICAgICAgICAgICAgdG8gcmVtb3ZlIHNvbWUgZmlsZXMgX2FuZF8gZGlyZWN0b3JpZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCitob3N0LXJtZGlyID0gXAorICAgICQoZXZhbCBfX2hvc3Rfcm1kaXJfZmlsZXMgOj0gJChmb3JlYWNoIF9faG9zdF9ybWRpcl9maWxlLCQxLCQoc3Vic3QgLyxcLCQod2lsZGNhcmQgJChfX2hvc3Rfcm1kaXJfZmlsZSkpKSkpXAorICAgICQoaWYgJChfX2hvc3Rfcm1kaXJfZmlsZXMpLGRlbCAvZi9zL3EgJChfX2hvc3Rfcm1kaXJfZmlsZXMpID5OVUwgMj5OVUwpCitlbHNlCitob3N0LXJtZGlyID0gcm0gLXJmICQxCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogaG9zdC1ta2RpcgorIyBBcmd1bWVudHM6IDE6IGRpcmVjdG9yeSBwYXRoCisjIFVzYWdlICAgIDogJChjYWxsIGhvc3QtbWtkaXIsPHBhdGg+CisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRvIHRoZSBob3N0LXNwZWNpZmljIHNoZWxsIGNvbW1hbmQgdXNlZAorIyAgICAgICAgICAgIHRvIGNyZWF0ZSBhIHBhdGggaWYgaXQgZG9lc24ndCBleGlzdC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmZXEgKCQoQlVJTERfSE9TVF9PUyksd2luZG93cykKK2hvc3QtbWtkaXIgPSBtZCAkKHN1YnN0IC8sXCwiJDEiKSA+TlVMIDI+TlVMIHx8IHJlbQorZWxzZQoraG9zdC1ta2RpciA9IG1rZGlyIC1wICQxCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogaG9zdC1jcAorIyBBcmd1bWVudHM6IDE6IHNvdXJjZSBmaWxlCisjICAgICAgICAgICAgMjogdGFyZ2V0IGZpbGUKKyMgVXNhZ2UgICAgOiAkKGNhbGwgaG9zdC1jcCw8c3JjLWZpbGU+LDxkc3QtZmlsZT4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRvIHRoZSBob3N0LXNwZWNpZmljIHNoZWxsIGNvbW1hbmQgdXNlZAorIyAgICAgICAgICAgIHRvIGNvcHkgYSBzaW5nbGUgZmlsZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQoraG9zdC1jcCA9IGNvcHkgL2IveSAkKHN1YnN0IC8sXCwiJDEiICIkMiIpID4gTlVMCitlbHNlCitob3N0LWNwID0gY3AgLWYgJDEgJDIKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBob3N0LW12CisjIEFyZ3VtZW50czogMTogc291cmNlIGZpbGUKKyMgICAgICAgICAgICAyOiB0YXJnZXQgZmlsZQorIyBVc2FnZSAgICA6ICQoY2FsbCBob3N0LW12LDxzcmMtZmlsZT4sPGRzdC1maWxlPikKKyMgUmF0aW9uYWxlOiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgdG8gdGhlIGhvc3Qtc3BlY2lmaWMgc2hlbGwgY29tbWFuZCB1c2VkCisjICAgICAgICAgICAgdG8gbW92ZSBhIHNpbmdsZSBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCitob3N0LW12ID0gbW92ZSAveSAkKHN1YnN0IC8sXCwiJDEiICIkMiIpID4gTlVMCitlbHNlCitob3N0LW12ID0gbXYgLWYgJDEgJDIKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBob3N0LWluc3RhbGwKKyMgQXJndW1lbnRzOiAxOiBzb3VyY2UgZmlsZQorIyAgICAgICAgICAgIDI6IHRhcmdldCBmaWxlCisjIFVzYWdlICAgIDogJChjYWxsIGhvc3QtaW5zdGFsbCw8c3JjLWZpbGU+LDxkc3QtZmlsZT4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBleHBhbmRzIHRvIHRoZSBob3N0LXNwZWNpZmljIHNoZWxsIGNvbW1hbmQgdXNlZAorIyAgICAgICAgICAgIHRvIGluc3RhbGwgYSBmaWxlIG9yIGRpcmVjdG9yeSwgd2hpbGUgcHJlc2VydmluZyBpdHMgdGltZXN0YW1wcworIyAgICAgICAgICAgIChpZiBwb3NzaWJsZSkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCitob3N0LWluc3RhbGwgPSBjb3B5IC9iL3kgJChzdWJzdCAvLFwsIiQxIiAiJDIiKSA+IE5VTAorZWxzZQoraG9zdC1pbnN0YWxsID0gaW5zdGFsbCAtcCAkMSAkMgorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGhvc3QtZWNoby1idWlsZC1zdGVwCisjIEFyZ3VtZW50czogMTogU3RlcCBkZXNjcmlwdGlvbiAoZS5nLiAnQ29tcGlsZSBDKysnLCBvciAnU3RhdGljTGlicmFyeScpCisjICAgICAgICAgICAgMjogT3B0aW9uYWwgcHJlZml4LgorIyBVc2FnZSAgICA6IC0tLS0+fCQoY2FsbCBob3N0LWVjaG8tYnVpbGQtc3RlcCxDb21waWxlKSAuLi4ub3RoZXIgdGV4dC4uLgorIyBSYXRpb25hbGU6IFRoaXMgZnVuY3Rpb24gZXhwYW5kcyB0byB0aGUgaG9zdC1zcGVjaWZpYyBzaGVsbCBjb21tYW5kIHVzZWQKKyMgICAgICAgICAgICB0byBwcmludCB0aGUgcHJlZml4IG9mIGEgZ2l2ZW4gYnVpbGQgc3RlcCAvIGNvbW1hbmQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitob3N0LWVjaG8tYnVpbGQtc3RlcCA9IEAgJChCVUlMRF9IT1NUX0VDSE8pICQoaWYgJChzdHJpcCAkMiksWyQyXSAsKSQoY2FsbCBsZWZ0LWp1c3RpZnktcXVvdGVkLTE1LCQxKToKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGhvc3QtYy1pbmNsdWRlcworIyBBcmd1bWVudHM6IDE6IGxpc3Qgb2YgZmlsZSBwYXRocyAoZS5nLiAiZm9vIGJhciIpCisjIFJldHVybnMgIDogbGlzdCBvZiBpbmNsdWRlIGNvbXBpbGVyIG9wdGlvbnMgKGUuZy4gIi1JZm9vIC1JYmFyIikKKyMgVXNhZ2UgICAgOiAkKGNhbGwgaG9zdC1jLWluY2x1ZGVzLDxwYXRocz4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBDeWd3aW4gcGF0aHMgaW50bworIyAgICAgICAgICAgIEN5Z3dpbi1zcGVjaWZpYyBvbmVzLiBPbiBvdGhlciBwbGF0Zm9ybXMsIGl0IHdpbGwganVzdAorIyAgICAgICAgICAgIHJldHVybiBpdHMgYXJndW1lbnQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLGN5Z3dpbikKK2hvc3QtYy1pbmNsdWRlcyA9ICQocGF0c3Vic3QgJSwtSSUsJChjYWxsIGhvc3QtcGF0aCwkMSkpCitlbHNlCitob3N0LWMtaW5jbHVkZXMgPSAkKDE6JT0tSSUpCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogaG9zdC1jb3B5LWlmLWRpZmZlcgorIyBBcmd1bWVudHM6IDE6IHNvdXJjZSBmaWxlCisjICAgICAgICAgICAgMjogZGVzdGluYXRpb24gZmlsZQorIyBVc2FnZSAgICA6ICQoY2FsbCBob3N0LWNvcHktaWYtZGlmZmVyLDxzcmMtZmlsZT4sPGRzdC1maWxlPikKKyMgUmF0aW9uYWxlOiBUaGlzIGZ1bmN0aW9uIGNvcHkgc291cmNlIGZpbGUgdG8gZGVzdGluYXRpb24gZmlsZSBpZiBjb250ZW50cyBhcmUKKyMgICAgICAgICAgICBkaWZmZXJlbnQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCitob3N0LWNvcHktaWYtZGlmZmVyID0gJChCVUlMRF9IT1NUX0NNUCkgLXMgJDEgJDIgPiBOVUwgfHwgY29weSAvYi95ICQoc3Vic3QgLyxcLCIkMSIgIiQyIikgPiBOVUwKK2Vsc2UKK2hvc3QtY29weS1pZi1kaWZmZXIgPSAkKEJVSUxEX0hPU1RfQ01QKSAtcyAkMSAkMiA+IC9kZXYvbnVsbCAyPiYxIHx8IGNwIC1mICQxICQyCitlbmRpZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBob3N0LXBhdGgtaXMtYWJzb2x1dGUKKyMgQXJndW1lbnRzOiAxOiBmaWxlIHBhdGgKKyMgVXNhZ2UgICAgOiAkKGNhbGwgaG9zdC1wYXRoLWlzLWFic29sdXRlLDxwYXRoPikKKyMgUmF0aW9uYWxlOiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBub24tZW1wdHkgcmVzdWx0IGlmIHRoZSBpbnB1dCBwYXRoIGlzCisjICAgICAgICAgICAgYWJzb2x1dGUgb24gdGhlIGhvc3QgZmlsZXN5c3RlbS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHRha2UgY2FyZSBkcml2ZSBwcmVmaXggaW4gZmlsZSBwYXRocywgZS5nLjoKKyMgICAgL2ZvbyAgICAgICAtPiB0b3AtbGV2ZWwgJ2ZvbycgZGlyZWN0b3J5IG9uIGN1cnJlbnQgZHJpdmUuCisjICAgIC8vYmFyL2ZvbyAgLT4gdG9wLWxldmVsICdmb28nIG9uIG5ldHdvcmsgc2hhcmUgJ2JhcicKKyMgICAgYzovZm9vICAgICAtPiB0b3AtbGV2ZWwgJ2ZvbycgZGlyZWN0b3J5IG9uIEMgZHJpdmUuCisjICAgIGM6Zm9vICAgICAgLT4gJ2Zvbycgc3ViZGlyZWN0b3J5IG9uIEMgZHJpdmUncyBjdXJyZW50IGRpcmVjdG9yeS4KKyMKKyMgVHJlYXQgYWxsIG9mIHRoZW0gYXMgYWJzb2x1dGUuIEZpbHRlcmluZyB0aGUgZmlyc3QgdHdvIGNhc2VzIGlzIGVhc3kKKyMgYnkgc2ltcGx5IGxvb2tpbmcgYXQgdGhlIGZpcnN0IGNoYXJhY3Rlci4gVGhlIG90aGVyIG9uZXMgYXJlIG1vcmUKKyMgY29tcGxpY2F0ZWQgYW5kIHRoZSBzaW1wbGVzdCB3YXkgaXMgc3RpbGwgdG8gdHJ5IGFsbCBhbHBoYWJldCBsZXR0ZXJzCisjIGRpcmVjdGx5LiBBbnl0aGluZyBlbHNlIGludm9sdmVzIHZlcnkgY29tcGxpY2F0ZWQgR05VIE1ha2UgcGFyc2luZworIyB2b29kb28uCituZGstd2luZG93cy1kcml2ZS1sZXR0ZXJzIDo9IGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgeiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMIE0gTiBPIFAgUSBSIFMgVCBVIFYgVyBYIFkgWgorCituZGstd2luZG93cy1kcml2ZS1wYXR0ZXJucyA6PSAkKGZvcmVhY2ggX2RyaXZlLCQobmRrLXdpbmRvd3MtZHJpdmUtbGV0dGVycyksJChfZHJpdmUpOiUpCisKK3dpbmRvd3MtcGF0aC1pcy1hYnNvbHV0ZSA9ICQoaWYgJChmaWx0ZXIgLyUgJChuZGstd2luZG93cy1kcml2ZS1wYXR0ZXJucyksJChzdWJzdCBcLC8sJDEpKSx0cnVlKQorCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCitob3N0LXBhdGgtaXMtYWJzb2x1dGUgPSAkKGNhbGwgd2luZG93cy1wYXRoLWlzLWFic29sdXRlLCQxKQorZWxzZQoraG9zdC1wYXRoLWlzLWFic29sdXRlID0gJChpZiAkKGZpbHRlciAvJSwkMSksdHJ1ZSkKK2VuZGlmCisKKy10ZXN0LWhvc3QtcGF0aC1pcy1hYnNvbHV0ZS5yZWxhdGl2ZS1wYXRocyA9IFwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgaG9zdC1wYXRoLWlzLWFic29sdXRlLGZvbykpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBob3N0LXBhdGgtaXMtYWJzb2x1dGUsZm9vL2JhcikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBob3N0LXBhdGgtaXMtYWJzb2x1dGUsLikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBob3N0LXBhdGgtaXMtYWJzb2x1dGUsLi4pKQorCistdGVzdC1ob3N0LXBhdGgtaXMtYWJzb2x1dGUuYWJzb2x1dGUtcGF0aHMgPSBcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx0cnVlLCQoY2FsbCBob3N0LXBhdGgtaXMtYWJzb2x1dGUsLykpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsdHJ1ZSwkKGNhbGwgaG9zdC1wYXRoLWlzLWFic29sdXRlLC9mb28pKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LHRydWUsJChjYWxsIGhvc3QtcGF0aC1pcy1hYnNvbHV0ZSwvZm9vL2JhcikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsdHJ1ZSwkKGNhbGwgaG9zdC1wYXRoLWlzLWFic29sdXRlLC8vZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx0cnVlLCQoY2FsbCBob3N0LXBhdGgtaXMtYWJzb2x1dGUsLy4pKQorCistdGVzdC1ob3N0LXBhdGgtaXMtYXNib2x1dGUud2luZG93cy1yZWxhdGl2ZS1wYXRocyA9IFwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCQoY2FsbCB3aW5kb3dzLXBhdGgtaXMtYWJzb2x1dGUsZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwkKGNhbGwgd2luZG93cy1wYXRoLWlzLWFic29sdXRlLGZvby9iYXIpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCQoY2FsbCB3aW5kb3dzLXBhdGgtaXMtYWJzb2x1dGUsLikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsJChjYWxsIHdpbmRvd3MtcGF0aC1pcy1hYnNvbHV0ZSwuLikpCisKKy10ZXN0LWhvc3QtcGF0aC1pcy1hc2JvbHV0ZS53aW5kb3dzLWFic29sdXRlLXBhdGhzID0gXAorICAkKGNhbGwgdGVzdC1leHBlY3QsdHJ1ZSwkKGNhbGwgd2luZG93cy1wYXRoLWlzLWFic29sdXRlLGM6LykpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsdHJ1ZSwkKGNhbGwgd2luZG93cy1wYXRoLWlzLWFic29sdXRlLHg6KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx0cnVlLCQoY2FsbCB3aW5kb3dzLXBhdGgtaXMtYWJzb2x1dGUsSzpmb28pKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LHRydWUsJChjYWxsIHdpbmRvd3MtcGF0aC1pcy1hYnNvbHV0ZSxDOlxGb29cQmFyKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx0cnVlLCQoY2FsbCB3aW5kb3dzLXBhdGgtaXMtYWJzb2x1dGUsXEZvbykpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGhvc3QtZGlyLXBhcmVudAorIyBBcmd1bWVudHM6IDE6IGZpbGUgcGF0aAorIyBVc2FnZSAgICA6ICQoY2FsbCBob3N0LWRpci1wYXJlbnQsPHBhdGg+KQorIyBSYXRpb25hbGU6IFJldHVybiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiBhIGdpdmVuIHBhdGguCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgT24gV2luZG93cywgZGVmaW5pbmcgaG9zdC1kaXItcGFyZW50IGlzIGEgYml0IG1vcmUgdHJpY2t5IGJlY2F1c2UgdGhlCisjIEdOVSBNYWtlICQoZGlyIC4uLikgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIHdoZW4gaXQKKyMgcmVhY2hlcyB0aGUgdG9wIG9mIHRoZSBkaXJlY3RvcnkgdHJlZSwgYW5kIHdlIHdhbnQgdG8gZW5mb3JjZSB0aGlzIHRvCisjIGF2b2lkIGluZmluaXRlIGxvb3BzLgorIworIyAgICQoZGlyIEM6KSAgICAgLT4gQzogICAgICAgKGVtcHR5IGV4cGVjdGVkKQorIyAgICQoZGlyIEM6LykgICAgLT4gQzovICAgICAgKGVtcHR5IGV4cGVjdGVkKQorIyAgICQoZGlyIEM6XCkgICAgLT4gQzpcICAgICAgKGVtcHR5IGV4cGVjdGVkKQorIyAgICQoZGlyIEM6L2ZvbykgLT4gQzovICAgICAgKGNvcnJlY3QpCisjICAgJChkaXIgQzpcZm9vKSAtPiBDOlwgICAgICAoY29ycmVjdCkKKyMKK19idWlsZF9uZWVkX3dpbmRvd3NfaG9zdF9kaXJfcGFyZW50IDo9ICQoc3RyaXAgJChmaWx0ZXIgQzosJChkaXIgQzopKSkKKworaWZkZWYgX2J1aWxkX25lZWRfd2luZG93c19ob3N0X2Rpcl9wYXJlbnQKKword2luZG93cy1ob3N0LWRpci1wYXJlbnQgPSAkKHN0cmlwIFwKKyAgICAkKGV2YWwgX19ob3N0X2Rpcl9ub2RlIDo9ICQocGF0c3Vic3QgJS8sJSwkKHN1YnN0IFwsLywkMSkpKVwKKyAgICAkKGV2YWwgX19ob3N0X2Rpcl9wYXJlbnQgOj0gJChkaXIgJChfX2hvc3RfZGlyX25vZGUpKSlcCisgICAgJChmaWx0ZXItb3V0ICQxLCQoX19ob3N0X2Rpcl9wYXJlbnQpKVwKKyAgICApCisKK2hvc3QtZGlyLXBhcmVudCA9ICQoY2FsbCB3aW5kb3dzLWhvc3QtZGlyLXBhcmVudCwkMSkKK2Vsc2UKK2hvc3QtZGlyLXBhcmVudCA9ICQocGF0c3Vic3QgJS8sJSwkKGRpciAkMSkpCitlbmRpZgorCistdGVzdC1ob3N0LWRpci1wYXJlbnQgPSBcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGhvc3QtZGlyLXBhcmVudCwvZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwvZm9vLCQoY2FsbCBob3N0LWRpci1wYXJlbnQsL2Zvby9iYXIpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgaG9zdC1kaXItcGFyZW50LGZvby9iYXIpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LGZvby9iYXIsJChjYWxsIGhvc3QtZGlyLXBhcmVudCxmb28vYmFyL3pvbykpCisKK2lmZGVmIF9idWlsZF9uZWVkX3dpbmRvd3NfaG9zdF9kaXJfcGFyZW50CistdGVzdC1ob3N0LWRpci1wYXJlbnQud2luZG93cyA9IFwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgaG9zdC1kaXItcGFyZW50LEM6KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGhvc3QtZGlyLXBhcmVudCxDOi8pKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgaG9zdC1kaXItcGFyZW50LEM6XCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsQzovLCQoY2FsbCBob3N0LWRpci1wYXJlbnQsQzovZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxDOlwsJChjYWxsIGhvc3QtZGlyLXBhcmVudCxDOlxmb28pKQorZW5kaWYgICMgX2J1aWxkX25lZWRfd2luZG93c19ob3N0X2Rpcl9wYXJlbnQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1pbml0Lm1rIGIvYW5kcm9pZC9idWlsZC9jb3JlL2RlZmluaXRpb25zLWluaXQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NiYTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1pbml0Lm1rCkBAIC0wLDAgKzEsNDY1IEBACisjIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgQnVpbGQgc3lzdGVtIGluaXRpYWxpemF0aW9uLgorIworIyBJbnB1dCB2YXJpYWJsZXM6CisjICAgIEJVSUxEX1NZU1RFTV9ST09UCisjICAgICAgIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSByb290IGJ1aWxkIHN5c3RlbSBkaXJlY3RvcmllcywgaS5lLgorIyAgICAgICAnZ21zbCcsICdjb3JlJywgJ2F3aycuCisjCisjICAgIEJVSUxEX1NZU1RFTV9OQU1FCisjICAgICAgIERlZmF1bHQgcHJlZml4IHVzZWQgaW4gYnVpbGQgc3lzdGVtIGxvZ3MuIERlZmF1bHQgdmFsdWUgaXMgJ0J1aWxkJy4KKyMKKyMgICAgQlVJTERfTE9HCisjICAgICAgIFNldCB0byAnMScgdG8gZW5hYmxlIGludGVybmFsIGJ1aWxkIHN5c3RlbSBsb2dzLgorIworIyAgICBCVUlMRF9TWVNURU1fUFJFQlVJTFRfRElSCisjICAgICAgIElmIGRlZmluZWQsIG11c3QgcG9pbnQgdG8gYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGNvbnRhaW4gaG9zdAorIyAgICAgICB0b29sIGJpbmFyaWVzIHVuZGVyICQoQlVJTERfU1lTVEVNX1BSRUJVSUxUX0RJUikvPGhvc3Q+L2Jpbi8KKyMgICAgICAgd2hlcmUgPGhvc3Q+IGNhbiBiZSB0aGUgMzItYml0IG9yIDY0LWJpdCBob3N0IHRhZywgZGVwZW5kaW5nCisjICAgICAgIG9uIHRoZSB2YWx1ZSBvZiBCVUlMRF9GT1JDRV9IT1NUXzMyQklUIChzZWUgYmVsb3cpLgorIworIyAgICBCVUlMRF9GT1JDRV9IT1NUXzMyQklUCisjICAgICAgIFNldCB0byAnMScgdG8gZm9yY2UgdGhlIHVzZSBvZiAzMi1iaXQgaG9zdCBwcmVidWlsdCB0b29sIGJpbmFyaWVzLAorIyAgICAgICB3aGVuIEJVSUxEX1NZU1RFTV9QUkVCVUlMVF9ESVIgaXMgZGVmaW5lZCAoaWdub3JlZCBvdGhlcndpc2UpCisjCisjICAgIEJVSUxEX0hPU1RfT1MKKyMgICAgICAgSG9zdCBvcGVyYXRpbmcgc3lzdGVtIG5hbWUuIElmIHVuZGVmaW5lZCwgd2lsbCBiZSBhdXRvLWRldGVjdGVkLgorIyAgICAgICBFeGFtcGxlczogbGludXgsIGRhcndpbiwgd2luZG93cworIworIyAgICBCVUlMRF9IT1NUX0FSQ0gKKyMgICAgICAgSG9zdCBvcGVyYXRpbmcgc3lzdGVtIGFyY2hpdGVjdHVyZS4gSWYgdW5kZWZpbmVkIHdpbGwgYmUgYXV0by1kZXRlY3RlZC4KKyMgICAgICAgRXhhbXBsZXM6IHg4NiwgeDg2XzY0CisjCisjICAgIEJVSUxEX0hPU1RfQVdLCisjICAgICAgIFBhdGggdG8gdGhlIGhvc3QgJ2F3aycgZXhlY3V0YWJsZS4gQXV0by1kZXRlY3RlZCBpZiB1bmRlZmluZWQuCisjCisjICAgIEJVSUxEX0hPU1RfQ01QCisjICAgICAgIFBhdGggdG8gdGhlIGhvc3QgJ2NtcCcgZXhlY3V0YWJsZS4gQXV0by1kZXRlY3RlZCBpZiB1bmRlZmluZWQuCisjCisjICAgIEJVSUxEX0hPU1RfRUNITworIyAgICAgICBQYXRoIHRvIHRoZSBob3N0ICdlY2hvJyBleGVjdXRhYmxlLiBBdXRvLWRldGVjdGVkIGlmIHVuZGVmaW5lZC4KKyMKKyMgICAgQlVJTERfSE9TVF9QWVRIT04KKyMgICAgICAgUGF0aCB0byB0aGUgaG9zdCAncHl0aG9uJyBleGVjdXRhYmxlLiBBdXRvLWRldGVjdGVkIGlmIHVuZGVmaW5lZC4KKworIyBEaXNhYmxlIEdOVSBNYWtlIGltcGxpY2l0IHJ1bGVzCisKKyMgdGhpcyB0dXJucyBvZmYgdGhlIHN1ZmZpeCBydWxlcyBidWlsdCBpbnRvIG1ha2UKKy5TVUZGSVhFUzoKKworIyB0aGlzIHR1cm5zIG9mZiB0aGUgUkNTIC8gU0NDUyBpbXBsaWNpdCBydWxlcyBvZiBHTlUgTWFrZQorJSA6IFJDUy8lLHYKKyUgOiBSQ1MvJQorJSA6ICUsdgorJSA6IHMuJQorJSA6IFNDQ1Mvcy4lCisKKyMgSWYgYSBydWxlIGZhaWxzLCBkZWxldGUgJEAuCisuREVMRVRFX09OX0VSUk9SOgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIERlZmluZSBhIGZldyB1c2VmdWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMuCisjIE1vcmUgc3R1ZmYgd2lsbCBmb2xsb3cgaW4gZGVmaW5pdGlvbnMubWsuCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgVXNlZCB0byBvdXRwdXQgd2FybmluZ3MgYW5kIGVycm9yIGZyb20gdGhlIGxpYnJhcnksIGl0J3MgcG9zc2libGUgdG8KKyMgZGlzYWJsZSBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgdGhlc2UgZGVmaW5pdGlvbnMKKyMgbWFudWFsbHkgb3IgYnkgc2V0dGluZyBCVUlMRF9OT19XQVJOSU5HUy4KKworQlVJTERfU1lTVEVNX05BTUUgOj0gJChzdHJpcCAkKEJVSUxEX1NZU1RFTV9OQU1FKSkKK2lmbmRlZiBCVUlMRF9TWVNURU1fTkFNRQorICAgIEJVSUxEX1NZU1RFTV9OQU1FIDo9IEJ1aWxkCitlbmRpZgorCitfYnVpbGRfbmFtZSAgICA6PSAkKEJVSUxEX1NZU1RFTV9OQU1FKQorLWJ1aWxkLWluZm8gICAgID0gJChpbmZvICQoX2J1aWxkX25hbWUpOiAkMSAkMiAkMyAkNCAkNSkKKy1idWlsZC13YXJuaW5nICA9ICQod2FybmluZyAkKF9idWlsZF9uYW1lKTogJDEgJDIgJDMgJDQgJDUpCistYnVpbGQtZXJyb3IgICAgPSAkKGVycm9yICQoX2J1aWxkX25hbWUpOiAkMSAkMiAkMyAkNCAkNSkKKworaWZkZWYgQlVJTERfTk9fV0FSTklOR1MKKy1idWlsZC13YXJuaW5nIDo9CitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogLWJ1aWxkLWxvZworIyBBcmd1bWVudHM6IDE6IHRleHQgdG8gcHJpbnQgd2hlbiBCVUlMRF9MT0cgaXMgZGVmaW5lZCB0byAxCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCAtYnVpbGQtbG9nLDxzb21lIHRleHQ+KQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAoJChCVUlMRF9MT0cpLDEpCitfYnVpbGRfbG9nIDo9IDEKKy1idWlsZC1sb2cgPSAkKGluZm8gJChfYnVpbGRfbmFtZSk6ICQxKQorZWxzZQorX2J1aWxkX2xvZyA6PSAwCistYnVpbGQtbG9nIDo9CitlbmRpZgorCisjIENoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBHTlUgTWFrZSAzLjgxCisjIFdlIGRvIHRoaXMgYnkgZGV0ZWN0aW5nIHdoZXRoZXIgJ2xhc3R3b3JkJyBpcyBzdXBwb3J0ZWQKKyMKK01BS0VfVEVTVCA6PSAkKGxhc3R3b3JkIGEgYiBjIGQgZSBmKQoraWZuZXEgKCQoTUFLRV9URVNUKSxmKQorICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsR05VIE1ha2UgdmVyc2lvbiAkKE1BS0VfVkVSU0lPTikgaXMgdG9vIGxvdyAoc2hvdWxkIGJlID49IDMuODEpKQorZW5kaWYKKyQoY2FsbCAtYnVpbGQtbG9nLCBHTlUgTWFrZSB2ZXJzaW9uICQoTUFLRV9WRVJTSU9OKSBkZXRlY3RlZCkKKworCitCVUlMRF9TWVNURU1fUFJFQlVJTFRfRElSIDo9ICQoc3RyaXAgJChCVUlMRF9TWVNURU1fUFJFQlVJTFRfRElSKSkKK2lmZGVmIEJVSUxEX1NZU1RFTV9QUkVCVUlMVF9ESVIKKyAgICBpZmVxICgsJChzdHJpcCAkKHdpbGRjYXJkICQoQlVJTERfU1lTVEVNX1BSRUJVSUxUX0RJUikpKSkKKyAgICAgICAgJChlcnJvciBNaXNzaW5nIHByZWJ1aWx0cyBkaXJlY3Rvcnk6ICQoQlVJTERfU1lTVEVNX1BSRUJVSUxUX0RJUikpCisgICAgZW5kaWYKK2VuZGlmCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgSG9zdCBzeXN0ZW0gYXV0by1kZXRlY3Rpb24uCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMKKyMgRGV0ZXJtaW5lIGhvc3Qgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUgZnJvbSB0aGUgZW52aXJvbm1lbnQKKyMKK0JVSUxEX0hPU1RfT1MgOj0gJChzdHJpcCAkKEJVSUxEX0hPU1RfT1MpKQoraWZuZGVmIEJVSUxEX0hPU1RfT1MKKyAgICAjIE9uIGFsbCBtb2Rlcm4gdmFyaWFudHMgb2YgV2luZG93cyAoaW5jbHVkaW5nIEN5Z3dpbiBhbmQgV2luZSkKKyAgICAjIHRoZSBPUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBkZWZpbmVkIHRvICdXaW5kb3dzX05UJworICAgICMKKyAgICAjIFRoZSB2YWx1ZSBvZiBQUk9DRVNTT1JfQVJDSElURUNUVVJFIHdpbGwgYmUgeDg2IG9yIEFNRDY0CisgICAgIworICAgIGlmZXEgKCQoT1MpLFdpbmRvd3NfTlQpCisgICAgICAgIEJVSUxEX0hPU1RfT1MgOj0gd2luZG93cworICAgIGVsc2UKKyAgICAgICAgIyBGb3Igb3RoZXIgc3lzdGVtcywgdXNlIHRoZSBgdW5hbWVgIG91dHB1dAorICAgICAgICBVTkFNRSA6PSAkKHNoZWxsIHVuYW1lIC1zKQorICAgICAgICBpZm5lcSAoLCQoZmluZHN0cmluZyBMaW51eCwkKFVOQU1FKSkpCisgICAgICAgICAgICBCVUlMRF9IT1NUX09TIDo9IGxpbnV4CisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmVxICgsJChmaW5kc3RyaW5nIERhcndpbiwkKFVOQU1FKSkpCisgICAgICAgICAgICBCVUlMRF9IT1NUX09TIDo9IGRhcndpbgorICAgICAgICBlbmRpZgorICAgICAgICAjIFdlIHNob3VsZCBub3QgYmUgdGhlcmUsIGJ1dCBqdXN0IGluIGNhc2UgIQorICAgICAgICBpZm5lcSAoLCQoZmluZHN0cmluZyBDWUdXSU4sJChVTkFNRSkpKQorICAgICAgICAgICAgQlVJTERfSE9TVF9PUyA6PSB3aW5kb3dzCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmZXEgKCQoQlVJTERfSE9TVF9PUyksKQorICAgICAgICAgICAgJChjYWxsIC1idWlsZC1pbmZvLFVuYWJsZSB0byBkZXRlcm1pbmUgQlVJTERfSE9TVF9PUyBmcm9tIHVuYW1lIC1zOiAkKFVOQU1FKSkKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbyxQbGVhc2UgZGVmaW5lIEJVSUxEX0hPU1RfT1MgaW4geW91ciBlbnZpcm9ubWVudC4pCisgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLWVycm9yLEFib3J0aW5nLikKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorICAgICQoY2FsbCAtYnVpbGQtbG9nLEhvc3QgT1Mgd2FzIGF1dG8tZGV0ZWN0ZWQ6ICQoQlVJTERfSE9TVF9PUykpCitlbHNlCisgICAgJChjYWxsIC1idWlsZC1sb2csSG9zdCBPUyBmcm9tIGVudmlyb25tZW50OiAkKEJVSUxEX0hPU1RfT1MpKQorZW5kaWYKKworIyBGb3IgYWxsIHN5c3RlbXMsIHdlIHdpbGwgaGF2ZSBCVUlMRF9IT1NUX09TX0JBU0UgZGVmaW5lZCBhcworIyAkKEJVSUxEX0hPU1RfT1MpLCBleGNlcHQgb24gQ3lnd2luIHdoZXJlIHdlIHdpbGwgaGF2ZToKKyMKKyMgIEJVSUxEX0hPU1RfT1MgICAgICA9PSBjeWd3aW4KKyMgIEJVSUxEX0hPU1RfT1NfQkFTRSA9PSB3aW5kb3dzCisjCisjIFRyeWluZyB0byBkZXRlY3QgdGhhdCB3ZSdyZSBydW5uaW5nIGZyb20gQ3lnd2luIGlzIHRyaWNreQorIyBiZWNhdXNlIHdlIGNhbid0IHVzZSAkKE9TVFlQRSk6IEl0J3MgYSBCYXNoIHNoZWxsIHZhcmlhYmxlCisjIHRoYXQgaXMgbm90IGV4cG9ydGVkIHRvIHN1Yi1wcm9jZXNzZXMsIGFuZCBpc24ndCBkZWZpbmVkIGJ5CisjIG90aGVyIHNoZWxscyAoZm9yIHRob3NlIHdpdGggcmVhbGx5IHdlaXJkIHNldHVwcykuCisjCisjIEluc3RlYWQsIHdlIGFzc3VtZSB0aGF0IGEgcHJvZ3JhbSBuYW1lZCAvYmluL3VuYW1lLmV4ZQorIyB0aGF0IGNhbiBiZSBpbnZva2VkIGFuZCByZXR1cm5zIGEgdmFsaWQgdmFsdWUgY29ycmVzcG9uZHMKKyMgdG8gYSBDeWd3aW4gaW5zdGFsbGF0aW9uLgorIworQlVJTERfSE9TVF9PU19CQVNFIDo9ICQoQlVJTERfSE9TVF9PUykKKworaWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQorICAgIGlmbmVxICgsJChzdHJpcCAkKHdpbGRjYXJkIC9iaW4vdW5hbWUuZXhlKSkpCisgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLEZvdW5kIC9iaW4vdW5hbWUuZXhlIG9uIFdpbmRvd3MgaG9zdCwgY2hlY2tpbmcgZm9yIEN5Z3dpbikKKyAgICAgICAgIyBOT1RFOiBUaGUgMj5OVUwgaGVyZSBpcyBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UncmUgcnVubmluZyBpbnNpZGUgdGhlCisgICAgICAgICMgICAgICAgbmF0aXZlIFdpbmRvd3Mgc2hlbGwuIE9uIGN5Z3dpbiwgdGhpcyB3aWxsIGNyZWF0ZSBhbiBlbXB0eSBOVUwgZmlsZQorICAgICAgICAjICAgICAgIHRoYXQgd2UncmUgZ29pbmcgdG8gcmVtb3ZlIGxhdGVyIChzZWUgYmVsb3cpLgorICAgICAgICBVTkFNRSA6PSAkKHNoZWxsIC9iaW4vdW5hbWUuZXhlIC1zIDI+TlVMKQorICAgICAgICAkKGNhbGwgLWJ1aWxkLWxvZyx1bmFtZSAtcyByZXR1cm5lZDogJChVTkFNRSkpCisgICAgICAgIGlmbmVxICgsJChmaWx0ZXIgQ1lHV0lOJSwkKFVOQU1FKSkpCisgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLWxvZyxDeWd3aW4gZGV0ZWN0ZWQ6ICQoc2hlbGwgdW5hbWUgLWEpKQorICAgICAgICAgICAgQlVJTERfSE9TVF9PUyA6PSBjeWd3aW4KKyAgICAgICAgICAgIERVTU1ZIDo9ICQoc2hlbGwgcm0gLWYgTlVMKSAjIENsZWFuaW5nIHVwCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmbmVxICgsJChmaWx0ZXIgTUlOR1czMiUsJChVTkFNRSkpKQorICAgICAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLE1TeXMgZGV0ZWN0ZWQ6ICQoc2hlbGwgdW5hbWUgLWEpKQorICAgICAgICAgICAgICAgIEJVSUxEX0hPU1RfT1MgOj0gY3lnd2luCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgJChjYWxsIC1idWlsZC1sb2csQ3lnd2luICpub3QqIGRldGVjdGVkISkKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKK2VuZGlmCisKK2lmbmVxICgkKEJVSUxEX0hPU1RfT1MpLCQoQlVJTERfSE9TVF9PU19CQVNFKSkKKyAgICAkKGNhbGwgLWJ1aWxkLWxvZywgSG9zdCBvcGVyYXRpbmcgc3lzdGVtIGRldGVjdGVkOiAkKEJVSUxEX0hPU1RfT1MpLCBiYXNlIE9TOiAkKEJVSUxEX0hPU1RfT1NfQkFTRSkpCitlbHNlCisgICAgJChjYWxsIC1idWlsZC1sb2csIEhvc3Qgb3BlcmF0aW5nIHN5c3RlbSBkZXRlY3RlZDogJChCVUlMRF9IT1NUX09TKSkKK2VuZGlmCisKKyMgQWx3YXlzIHVzZSAvdXNyL2Jpbi9maWxlIG9uIERhcndpbiB0byBhdm9pZCByZWx5aW5nIG9uIGJyb2tlbiBQb3J0cworIyB2ZXJzaW9uLiBTZWUgaHR0cDovL2IuYW5kcm9pZC5jb20vNTM3NjkgLgorQlVJTERfSE9TVF9GSUxFX1BST0dSQU0gOj0gZmlsZQoraWZlcSAoJChCVUlMRF9IT1NUX09TKSxkYXJ3aW4pCitCVUlMRF9IT1NUX0ZJTEVfUFJPR1JBTSA6PSAvdXNyL2Jpbi9maWxlCitlbmRpZgorCitCVUlMRF9IT1NUX0FSQ0ggOj0gJChzdHJpcCAkKEJVSUxEX0hPU1RfQVJDSCkpCitCVUlMRF9IT1NUX0FSQ0g2NCA6PQoraWZuZGVmIEJVSUxEX0hPU1RfQVJDSAorICAgIGlmZXEgKCQoQlVJTERfSE9TVF9PU19CQVNFKSx3aW5kb3dzKQorICAgICAgICBCVUlMRF9IT1NUX0FSQ0ggOj0gJChQUk9DRVNTT1JfQVJDSElURUNUVVJFKQorICAgICAgICBpZmVxICgkKEJVSUxEX0hPU1RfQVJDSCksQU1ENjQpCisgICAgICAgICAgICBCVUlMRF9IT1NUX0FSQ0ggOj0geDg2CisgICAgICAgIGVuZGlmCisgICAgICAgICMgV2luZG93cyBpcyA2NC1iaXQgaWYgZWl0aGVyIFByb2dyYW1XNjQzMiBvciBQcm9ncmFtRmlsZXMoeDg2KSBpcyBzZXQKKyAgICAgICAgaWZuZXEgKCIvIiwkKHNoZWxsIGVjaG8gIiVQcm9ncmFtVzY0MzIlLyVQcm9ncmFtRmlsZXMoeDg2KSUiKSkKKyAgICAgICAgICAgIEJVSUxEX0hPU1RfQVJDSDY0IDo9IHg4Nl82NAorICAgICAgICBlbmRpZgorICAgIGVsc2UgIyBCVUlMRF9IT1NUX09TX0JBU0UgIT0gd2luZG93cworICAgICAgICBVTkFNRSA6PSAkKHNoZWxsIHVuYW1lIC1tKQorICAgICAgICBpZm5lcSAoLCQoZmluZHN0cmluZyA4NiwkKFVOQU1FKSkpCisgICAgICAgICAgICBCVUlMRF9IT1NUX0FSQ0ggOj0geDg2CisgICAgICAgICAgICBpZm5lcSAoLCQoc2hlbGwgJChCVUlMRF9IT1NUX0ZJTEVfUFJPR1JBTSkgLUwgJChTSEVMTCkgfCBncmVwICd4ODZbXy1dNjQnKSkKKyAgICAgICAgICAgICAgICBCVUlMRF9IT1NUX0FSQ0g2NCA6PSB4ODZfNjQKKyAgICAgICAgICAgIGVuZGlmCisgICAgICAgIGVuZGlmCisgICAgICAgICMgV2Ugc2hvdWxkIHByb2JhYmx5IHNob3VsZCBub3QgY2FyZSBhdCBhbGwKKyAgICAgICAgaWZuZXEgKCwkKGZpbmRzdHJpbmcgUG93ZXIsJChVTkFNRSkpKQorICAgICAgICAgICAgQlVJTERfSE9TVF9BUkNIIDo9IHBwYworICAgICAgICBlbmRpZgorICAgICAgICBpZmVxICgkKEJVSUxEX0hPU1RfQVJDSCksKQorICAgICAgICAgICAgJChjYWxsIC1idWlsZC1pbmZvLFVuc3VwcG9ydGVkIGhvc3QgYXJjaGl0ZWN0dXJlOiAkKFVOQU1FKSkKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsQWJvcnRpbmcpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYgIyBCVUlMRF9IT1NUX09TX0JBU0UgIT0gd2luZG93cworICAgICQoY2FsbCAtYnVpbGQtbG9nLEhvc3QgQ1BVIHdhcyBhdXRvLWRldGVjdGVkOiAkKEJVSUxEX0hPU1RfQVJDSCkpCitlbHNlCisgICAgJChjYWxsIC1idWlsZC1sb2csSG9zdCBDUFUgZnJvbSBlbnZpcm9ubWVudDogJChCVUlMRF9IT1NUX0FSQ0gpKQorZW5kaWYKKworaWZlcSAoLCQoQlVJTERfSE9TVF9BUkNINjQpKQorICAgIEJVSUxEX0hPU1RfQVJDSDY0IDo9ICQoQlVJTERfSE9TVF9BUkNIKQorZW5kaWYKKworQlVJTERfSE9TVF9UQUcgOj0gJChCVUlMRF9IT1NUX09TX0JBU0UpLSQoQlVJTERfSE9TVF9BUkNIKQorQlVJTERfSE9TVF9UQUc2NCA6PSAkKEJVSUxEX0hPU1RfT1NfQkFTRSktJChCVUlMRF9IT1NUX0FSQ0g2NCkKKworIyBUaGUgZGlyZWN0b3J5IHNlcGFyYXRvciB1c2VkIG9uIHRoaXMgaG9zdAorQlVJTERfSE9TVF9ESVJTRVAgOj0gOgoraWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQorICBCVUlMRF9IT1NUX0RJUlNFUCA6PSA7CitlbmRpZgorCisjIFRoZSBob3N0IGV4ZWN1dGFibGUgZXh0ZW5zaW9uCitCVUlMRF9IT1NUX0VYRUVYVCA6PQoraWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQorICBCVUlMRF9IT1NUX0VYRUVYVCA6PSAuZXhlCitlbmRpZgorCisjIElmIHdlIGFyZSBvbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBydW5uaW5nCisjIEN5Z3dpbiAxLjUsIHdoaWNoIGlzIGRlcHJlY2F0ZWQgYW5kIHdvbid0IHJ1biBvdXIgdG9vbGNoYWluCisjIGJpbmFyaWVzIHByb3Blcmx5LgorIworaWZlcSAoJChCVUlMRF9IT1NUX1RBRyksd2luZG93cy14ODYpCisgICAgaWZlcSAoJChCVUlMRF9IT1NUX09TKSxjeWd3aW4pCisgICAgICAgICMgT24gY3lnd2luLCAndW5hbWUgLXInIHJldHVybnMgc29tZXRoaW5nIGxpa2UgMS41LjIzKDAuMjI1LzUvMykKKyAgICAgICAgIyBXZSByZWNvZ25pemUgMS41LiBhcyB0aGUgcHJlZml4IHRvIGxvb2sgZm9yIHRoZW4uCisgICAgICAgIENZR1dJTl9WRVJTSU9OIDo9ICQoc2hlbGwgdW5hbWUgLXIpCisgICAgICAgIGlmbmVxICgkKGZpbHRlciBYWDEuNS4lLFhYJChDWUdXSU5fVkVSU0lPTikpLCkKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbyxZb3Ugc2VlbSB0byBiZSBydW5uaW5nIEN5Z3dpbiAxLjUsIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQuKQorICAgICAgICAgICAgJChjYWxsIC1idWlsZC1pbmZvLFBsZWFzZSB1cGdyYWRlIHRvIEN5Z3dpbiAxLjcgb3IgaGlnaGVyLikKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsQWJvcnRpbmcuKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCisgICAgIyBzcGVjaWFsLWNhc2UgdGhlIGhvc3QtdGFnCisgICAgQlVJTERfSE9TVF9UQUcgOj0gd2luZG93cworZW5kaWYKKworJChjYWxsIC1idWlsZC1sb2csQlVJTERfSE9TVF9UQUcgc2V0IHRvICQoQlVJTERfSE9TVF9UQUcpKQorCisjIENoZWNrIGZvciBidWlsZC1zeXN0ZW0tc3BlY2lmaWMgdmVyc2lvbnMgb2Ygb3VyIGhvc3QgdG9vbHMKK2lmbmVxICgsJChCVUlMRF9TWVNURU1fUFJFQlVJTFRfRElSKSkKKyAgICBpZmVxICgxLCQoQlVJTERfRk9SQ0VfSE9TVF8zMkJJVCkpCisgICAgICAgIEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSIDo9ICQoQlVJTERfU1lTVEVNX1BSRUJVSUxUX0RJUikvJChCVUlMRF9IT1NUX1RBRykKKyAgICBlbHNlCisgICAgICAgIEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSIDo9ICQoQlVJTERfU1lTVEVNX1BSRUJVSUxUX0RJUikvJChCVUlMRF9IT1NUX1RBRzY0KQorICAgICAgICBpZmVxICgsJChzdHJpcCAkKHdpbGRjYXJkICQoQlVJTERfSE9TVF9QUkVCVUlMVF9ESVIpKSkpCisgICAgICAgICAgICBCVUlMRF9IT1NUX1BSRUJVSUxUX0RJUiA6PSAkKEJVSUxEX1NZU1RFTV9QUkVCVUlMVF9ESVIpLyQoQlVJTERfSE9TVF9UQUcpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKyAgICBCVUlMRF9IT1NUX1BSRUJVSUxUX0RJUiA6PSAkKHN0cmlwICQod2lsZGNhcmQgJChCVUlMRF9IT1NUX1BSRUJVSUxUX0RJUikpKQorZWxzZQorICAgIEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSIDo9CitlbmRpZgorCitCVUlMRF9IT1NUX0FXSyA6PSAkKHN0cmlwICQoQlVJTERfSE9TVF9BV0spKQorQlVJTERfSE9TVF9QWVRIT04gOj0gJChzdHJpcCAkKEJVSUxEX0hPU1RfUFlUSE9OKSkKKworaWZkZWYgQlVJTERfSE9TVF9QUkVCVUlMVF9ESVIKKyAgICAkKGNhbGwgLWJ1aWxkLWxvZyxIb3N0IHRvb2xzIHByZWJ1aWx0IGRpcmVjdG9yeTogJChCVUlMRF9IT1NUX1BSRUJVSUxUX0RJUikpCisgICAgIyBUaGUgd2luZG93cyBwcmVidWlsdCBiaW5hcmllcyBhcmUgZm9yIG5kay1idWlsZC5jbWQKKyAgICAjIE9uIGN5Z3dpbiwgd2UgbXVzdCB1c2UgdGhlIEN5Z3dpbiB2ZXJzaW9uIG9mIHRoZXNlIHRvb2xzIGluc3RlYWQuCisgICAgaWZuZXEgKCQoQlVJTERfSE9TVF9PUyksY3lnd2luKQorICAgICAgICBpZm5kZWYgQlVJTERfSE9TVF9BV0sKKyAgICAgICAgICAgIEJVSUxEX0hPU1RfQVdLIDo9ICQod2lsZGNhcmQgJChCVUlMRF9IT1NUX1BSRUJVSUxUX0RJUikvYXdrJChCVUlMRF9IT1NUX0VYRUVYVCkpCisgICAgICAgIGVuZGlmCisgICAgICAgIGlmbmRlZiBCVUlMRF9IT1NUX1BZVEhPTgorICAgICAgICAgICAgQlVJTERfSE9TVF9QWVRIT04gOj0gJCh3aWxkY2FyZCAkKEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSKS9weXRob24kKEJVSUxEX0hPU1RfRVhFRVhUKSkKKyAgICAgICAgZW5kaWYKKyAgICBlbmRpZgorZWxzZQorICAgICQoY2FsbCAtYnVpbGQtbG9nLEhvc3QgdG9vbHMgcHJlYnVpbHQgZGlyZWN0b3J5IG5vdCBmb3VuZCwgdXNpbmcgc3lzdGVtIHRvb2xzKQorZW5kaWYKKworQlVJTERfSE9TVF9FQ0hPIDo9ICQoc3RyaXAgJChCVUlMRF9IT1NUX0VDSE8pKQoraWZkZWYgQlVJTERfSE9TVF9QUkVCVUlMVF9ESVIKKyAgICBpZm5kZWYgQlVJTERfSE9TVF9FQ0hPCisgICAgICAgICMgU3BlY2lhbCBjYXNlLCBvbiBDeWd3aW4sIGFsd2F5cyB1c2UgdGhlIGhvc3QgZWNobywgbm90IG91ciBwcmVidWlsdCBvbmUKKyAgICAgICAgIyB3aGljaCBhZGRzIFxyXG4gYXQgdGhlIGVuZCBvZiBsaW5lcy4KKyAgICAgICAgaWZuZXEgKCQoQlVJTERfSE9TVF9PUyksY3lnd2luKQorICAgICAgICAgICAgQlVJTERfSE9TVF9FQ0hPIDo9ICQoc3RyaXAgJCh3aWxkY2FyZCAkKEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSKS9lY2hvJChCVUlMRF9IT1NUX0VYRUVYVCkpKQorICAgICAgICBlbmRpZgorICAgIGVuZGlmCitlbmRpZgoraWZuZGVmIEJVSUxEX0hPU1RfRUNITworICAgIEJVSUxEX0hPU1RfRUNITyA6PSBlY2hvCitlbmRpZgorJChjYWxsIC1idWlsZC1sb2csSG9zdCAnZWNobycgdG9vbDogJChCVUlMRF9IT1NUX0VDSE8pKQorCisjIERlZmluZSBCVUlMRF9IT1NUX0VDSE9fTiB0byBwZXJmb3JtIHRoZSBlcXVpdmFsZW50IG9mICdlY2hvIC1uJyBvbiBhbGwgcGxhdGZvcm1zLgoraWZlcSAoJChCVUlMRF9IT1NUX09TKSx3aW5kb3dzKQorICAjIE91ciBjdXN0b20gdG9vbGJveCBlY2hvIGJpbmFyeSBzdXBwb3J0cyAtbi4KKyAgQlVJTERfSE9TVF9FQ0hPX04gOj0gJChCVUlMRF9IT1NUX0VDSE8pIC1uCitlbHNlCisgICMgT24gUG9zaXgsIGp1c3QgdXNlIGJhcmUgcHJpbnRmLgorICBCVUlMRF9IT1NUX0VDSE9fTiA6PSBwcmludGYgJXMKK2VuZGlmCiskKGNhbGwgLWJ1aWxkLWxvZyxIb3N0ICdlY2hvIC1uJyB0b29sOiAkKEJVSUxEX0hPU1RfRUNIT19OKSkKKworQlVJTERfSE9TVF9DTVAgOj0gJChzdHJpcCAkKEJVSUxEX0hPU1RfQ01QKSkKK2lmZGVmIEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSCisgICAgaWZuZGVmIEJVSUxEX0hPU1RfQ01QCisgICAgICAgIEJVSUxEX0hPU1RfQ01QIDo9ICQoc3RyaXAgJCh3aWxkY2FyZCAkKEJVSUxEX0hPU1RfUFJFQlVJTFRfRElSKS9jbXAkKEJVSUxEX0hPU1RfRVhFRVhUKSkpCisgICAgZW5kaWYKK2VuZGlmCitpZm5kZWYgQlVJTERfSE9TVF9DTVAKKyAgICBCVUlMRF9IT1NUX0NNUCA6PSBjbXAKK2VuZGlmCiskKGNhbGwgLWJ1aWxkLWxvZyxIb3N0ICdjbXAnIHRvb2w6ICQoQlVJTERfSE9TVF9DTVApKQorCisjCisjIFZlcmlmeSB0aGF0IHRoZSAnYXdrJyB0b29sIGhhcyB0aGUgZmVhdHVyZXMgd2UgbmVlZC4KKyMgQm90aCBOYXdrIGFuZCBHYXdrIGRvLgorIworQlVJTERfSE9TVF9BV0sgOj0gJChzdHJpcCAkKEJVSUxEX0hPU1RfQVdLKSkKK2lmbmRlZiBCVUlMRF9IT1NUX0FXSworICAgIEJVSUxEX0hPU1RfQVdLIDo9IGF3aworZW5kaWYKKyQoY2FsbCAtYnVpbGQtbG9nLEhvc3QgJ2F3aycgdG9vbDogJChCVUlMRF9IT1NUX0FXSykpCisKKyMgTG9jYXRpb24gb2YgYWxsIGF3ayBzY3JpcHRzIHdlIHVzZQorQlVJTERfQVdLIDo9ICQoQlVJTERfU1lTVEVNX1JPT1QpL2F3aworaWZlcSAoLCQoc3RyaXAgJCh3aWxkY2FyZCAkKEJVSUxEX0FXSykpKSkKKyAgICAkKGNhbGwgLWJ1aWxkLWVycm9yLE1pc3NpbmcgYXdrIHNjcmlwdHMgZGlyZWN0b3J5OiAkKEJVSUxEX0FXSykpCitlbmRpZgorCitBV0tfVEVTVCA6PSAkKHNoZWxsICQoQlVJTERfSE9TVF9BV0spIC1mICQoQlVJTERfQVdLKS9jaGVjay1hd2suYXdrKQorJChjYWxsIC1idWlsZC1sb2csSG9zdCAnYXdrJyB0ZXN0IHJldHVybmVkOiAkKEFXS19URVNUKSkKK2lmbmVxICgkKEFXS19URVNUKSxQYXNzKQorICAgICQoY2FsbCAtYnVpbGQtaW5mbyxIb3N0ICdhd2snIHRvb2wgaXMgb3V0ZGF0ZWQuIFBsZWFzZSBkZWZpbmUgQlVJTERfSE9TVF9BV0sgdG8gcG9pbnQgdG8gR2F3ayBvciBOYXdrICEpCisgICAgJChjYWxsIC1idWlsZC1lcnJvcixBYm9ydGluZy4pCitlbmRpZgorCisjCisjIE9uIEN5Z3dpbi9NU3lzLCBkZWZpbmUgdGhlICdjeWd3aW4tdG8taG9zdC1wYXRoJyBmdW5jdGlvbiBoZXJlIGRlcGVuZGluZyBvbiB0aGUKKyMgZW52aXJvbm1lbnQuIFRoZSBydWxlcyBhcmUgdGhlIGZvbGxvd2luZzoKKyMKKyMgMS8gSWYgQlVJTERfVVNFX0NZR1BBVEg9MSBhbmQgY3lncGF0aCBkb2VzIGV4aXN0IGluIHlvdXIgcGF0aCwgY3lnd2luLXRvLWhvc3QtcGF0aAorIyAgICBjYWxscyAiY3lncGF0aCAtbSIgZm9yIGVhY2ggaG9zdCBwYXRoLiAgU2luY2UgaW52b2tpbmcgJ2N5Z3BhdGggLW0nIGZyb20gR05VCisjICAgIE1ha2UgZm9yIGVhY2ggc291cmNlIGZpbGUgaXMgX3ZlcnlfIHNsb3csIHRoaXMgaXMgb25seSBhIGJhY2t1cCBwbGFuIGluCisjICAgIGNhc2Ugb3VyIGF1dG9tYXRpYyBzdWJzdGl0dXRpb24gZnVuY3Rpb24gKGRlc2NyaWJlZCBiZWxvdykgZG9lc24ndCB3b3JrLgorIworIyAyLyBHZW5lcmF0ZSBhIE1ha2UgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyB0aGUgbWFwcGluZyBmcm9tIGN5Z3dpbi9tc3lzIHRvIGhvc3QKKyMgICAgcGF0aHMgdGhyb3VnaCBzaW1wbGUgc3Vic3RpdHV0aW9ucy4gIEl0J3MgcmVhbGx5IGEgc2VyaWVzIG9mIG5lc3RlZCBwYXRzdWJzdAorIyAgICBjYWxscywgdGhhdCBsb28gbGlrZToKKyMKKyMgICAgIGN5Z3dpbi10by1ob3N0LXBhdGggPSAkKHBhdHN1YnN0IC9jeWdkcml2ZS9jLyUsYzovJSxcCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHBhdHN1c2J0IC9jeWdkcml2ZS9kLyUsZDovJSwgXAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxKQorIyAgICBvciBpbiBNU3lzOgorIyAgICAgY3lnd2luLXRvLWhvc3QtcGF0aCA9ICQocGF0c3Vic3QgL2MvJSxjOi8lLFwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQocGF0c3VzYnQgL2QvJSxkOi8lLCBcCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDEpCisjCisjIGV4Y2VwdCB0aGF0IHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBpcyBidWlsdCBmcm9tIHRoZSBsaXN0IG9mIG1vdW50ZWQKKyMgZHJpdmVzIGFzIHJlcG9ydGVkIGJ5ICJtb3VudCIgYW5kIGRlYWxzIHdpdGggZHJpdmUgbGV0dGVyIGNhc2VzIChpLmUuCisjICcvY3lnZHJpdmUvYycgYW5kICcvY3lnZHJpdmUvQycpCisjCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLGN5Z3dpbikKKyAgICBDWUdQQVRIIDo9ICQoc3RyaXAgJChIT1NUX0NZR1BBVEgpKQorICAgIGlmbmRlZiBDWUdQQVRICisgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLCBQcm9iaW5nIGZvciAnY3lncGF0aCcgcHJvZ3JhbSkKKyAgICAgICAgQ1lHUEFUSCA6PSAkKHN0cmlwICQoc2hlbGwgd2hpY2ggY3lncGF0aCAyPi9kZXYvbnVsbCkpCisgICAgICAgIGlmbmRlZiBDWUdQQVRICisgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLWxvZywgJ2N5Z3BhdGgnIHdhcyAqbm90KiBmb3VuZCBpbiB5b3VyIHBhdGgpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLCAnY3lncGF0aCcgZm91bmQgYXM6ICQoQ1lHUEFUSCkpCisgICAgICAgIGVuZGlmCisgICAgZW5kaWYKKworICAgIGlmZXEgKCQoQlVJTERfVVNFX0NZR1BBVEgpLDEpCisgICAgICAgIGlmbmRlZiBDWUdQQVRICisgICAgICAgICAgICAkKGNhbGwgLWJ1aWxkLWluZm8sTm8gY3lncGF0aCkKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsQWJvcnRpbmcpCisgICAgICAgIGVuZGlmCisgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLCBGb3JjZWQgdXNhZ2Ugb2YgJ2N5Z3BhdGggLW0nIHRocm91Z2ggQlVJTERfVVNFX0NZR1BBVEg9MSkKKyAgICAgICAgY3lnd2luLXRvLWhvc3QtcGF0aCA9ICQoc3RyaXAgJChzaGVsbCAkKENZR1BBVEgpIC1tICQxKSkKKyAgICBlbHNlCisgICAgICAgICMgQ2FsbCBhbiBhd2sgc2NyaXB0IHRvIGdlbmVyYXRlIGEgTWFrZWZpbGUgZnJhZ21lbnQgdXNlZCB0byBkZWZpbmUgYSBmdW5jdGlvbgorICAgICAgICBXSU5ET1dTX0hPU1RfUEFUSF9GUkFHTUVOVCA6PSAkKHNoZWxsIG1vdW50IHwgdHIgJ1xcJyAnLycgfCAkKEJVSUxEX0hPU1RfQVdLKSAtZiAkKEJVSUxEX0FXSykvZ2VuLXdpbmRvd3MtaG9zdC1wYXRoLmF3aykKKyAgICAgICAgaWZlcSAoJChfYnVpbGRfbG9nKSwxKQorICAgICAgICAgICAgJChpbmZvIFVzaW5nIGN5Z3dpbiBzdWJzdGl0dXRpb24gcnVsZXM6KQorICAgICAgICAgICAgJChldmFsICQoc2hlbGwgbW91bnQgfCB0ciAnXFwnICcvJyB8ICQoQlVJTERfSE9TVF9BV0spIC1mICQoQlVJTERfQVdLKS9nZW4td2luZG93cy1ob3N0LXBhdGguYXdrIC12VkVSQk9TRT0xKSkKKyAgICAgICAgZW5kaWYKKyAgICAgICAgJChldmFsIGN5Z3dpbi10by1ob3N0LXBhdGggPSAkKFdJTkRPV1NfSE9TVF9QQVRIX0ZSQUdNRU5UKSkKKyAgICBlbmRpZgorZW5kaWYgIyBCVUlMRF9IT1NUX09TID09IGN5Z3dpbgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogaG9zdC1wcmVidWlsdC10YWcKKyMgQXJndW1lbnRzOiAxOiBwYXJlbnQgcGF0aCBvZiAicHJlYnVpbHQiCisjIFJldHVybnMgIDogcGF0aCAkMS9wcmVidWlsdC8oQlVJTERfSE9TVF9UQUc2NCkgZXhpc3RzIGFuZCBCVUlMRF9GT1JDRV9IT1NUXzMyQklUCisjICAgICAgICAgICAgaXNuJ3QgZGVmaW5lZCB0byAxLCBvciAkMS9wcmVidWlsdC8oQlVJTERfSE9TVF9UQUcpCisjIFVzYWdlICAgIDogJChjYWxsIGhvc3QtcHJlYnVpbHQtdGFnLCA8cGF0aD4pCisjIFJhdGlvbmFsZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb2JsZSBhdmFpbGFibGUgNjQtYml0IHRvb2xjaGFpbiBvcgorIyAgICAgICAgICAgIHJldHVybiAzMi1iaXQgb25lIGFzIGRlZmF1bHQuICBOb3RlIHRoYXQgQlVJTERfSE9TVF9UQUc2ND09QlVJTERfSE9TVF9UQUcgZm9yCisjICAgICAgICAgICAgMzItYml0IHN5c3RlbSAob3IgMzItYml0IHVzZXJsYW5kIGluIDY0LWJpdCBzeXN0ZW0pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0ZPUkNFX0hPU1RfMzJCSVQpLDEpCitob3N0LXByZWJ1aWx0LXRhZyA9ICQxL3ByZWJ1aWx0LyQoQlVJTERfSE9TVF9UQUcpCitlbHNlCitob3N0LXByZWJ1aWx0LXRhZyA9ICQoc3RyaXAgXAorICAgICQoaWYgJChzdHJpcCAkKHdpbGRjYXJkICQxL3ByZWJ1aWx0LyQoQlVJTERfSE9TVF9UQUc2NCkpKSxcCisgICAgICAgICQxL3ByZWJ1aWx0LyQoQlVJTERfSE9TVF9UQUc2NCksXAorICAgICAgICAkMS9wcmVidWlsdC8kKEJVSUxEX0hPU1RfVEFHKVwKKyAgICApKQorZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1tb2R1bGVzLm1rIGIvYW5kcm9pZC9idWlsZC9jb3JlL2RlZmluaXRpb25zLW1vZHVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ZGZiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy1tb2R1bGVzLm1rCkBAIC0wLDAgKzEsOTExIEBACisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIyBNb2R1bGUgZGF0YWJhc2UgZnVuY3Rpb25zLgorIworCisjIFRoZSBsaXN0IG9mIGRlZmF1bHQgQysrIGV4dGVuc2lvbnMgc3VwcG9ydGVkIGJ5IEdDQy4KK2RlZmF1bHQtYysrLWV4dGVuc2lvbnMgOj0gLmNjIC5jcCAuY3h4IC5jcHAgLkNQUCAuYysrIC5DCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgTW9kdWxlcyBkYXRhYmFzZQorIworIyBUaGUgZm9sbG93aW5nIGRlY2xhcmF0aW9ucyBhcmUgdXNlZCB0byBtYW5hZ2UgdGhlIGxpc3Qgb2YgbW9kdWxlcworIyBkZWZpbmVkIGluIGFwcGxpY2F0aW9uJ3MgQW5kcm9pZC5tayBmaWxlcy4KKyMKKyMgVGVjaG5pY2FsIG5vdGU6CisjICAgIFdlIHVzZSBfX2J1aWxkX21vZHVsZXMgdG8gaG9sZCB0aGUgbGlzdCBvZiBhbGwgbW9kdWxlcyBjb3JyZXNwb25kaW5nCisjICAgIHRvIGEgZ2l2ZW4gYXBwbGljYXRpb24uCisjCisjICAgIEZvciBlYWNoIG1vZHVsZSAnZm9vJywgX19idWlsZF9tb2R1bGVzLmZvby48ZmllbGQ+IGlzIHVzZWQKKyMgICAgdG8gc3RvcmUgbW9kdWxlLXNwZWNpZmljIGluZm9ybWF0aW9uLgorIworIyAgICAgICAgdHlwZSAgICAgICAgIC0+IHR5cGUgb2YgbW9kdWxlIChlLmcuICdzdGF0aWMnLCAnc2hhcmVkJywgLi4uKQorIyAgICAgICAgZGVwZW5kcyAgICAgIC0+IGxpc3Qgb2Ygb3RoZXIgbW9kdWxlcyB0aGlzIG1vZHVsZSBkZXBlbmRzIG9uCisjCisjICAgIEFsc28sIExPQ0FMX1hYWFggdmFsdWVzIGRlZmluZWQgZm9yIGEgbW9kdWxlIGFyZSByZWNvcmRlZCBpbiBYWFhYLCBlLmcuOgorIworIyAgICAgICAgUEFUSCAgIC0+IHJlY29yZGVkIExPQ0FMX1BBVEggZm9yIHRoZSBtb2R1bGUKKyMgICAgICAgIENGTEFHUyAtPiByZWNvcmRlZCBMT0NBTF9DRkxBR1MgZm9yIHRoZSBtb2R1bGUKKyMgICAgICAgIC4uLgorIworIyAgICBTb21lIG9mIHRoZXNlIGFyZSBjcmVhdGVkIGJ5IGJ1aWxkIHNjcmlwdHMgbGlrZSBCVUlMRF9TVEFUSUNfTElCUkFSWToKKyMKKyMgICAgICAgIE1BS0VGSUxFIC0+IFRoZSBBbmRyb2lkLm1rIHdoZXJlIHRoZSBtb2R1bGUgaXMgZGVmaW5lZC4KKyMgICAgICAgIExERkxBR1MgIC0+IEZpbmFsIGxpbmtlciBmbGFncworIyAgICAgICAgT0JKRUNUUyAgLT4gTGlzdCBvZiBtb2R1bGUgb2JqZWN0cworIyAgICAgICAgQlVJTFRfTU9EVUxFIC0+IGxvY2F0aW9uIG9mIG1vZHVsZSBidWlsdCBmaWxlIChlLmcuIG9iai88YXBwPi88YWJpPi9saWJmb28uc28pCisjCisjICAgIE5vdGUgdGhhdCBzb21lIG1vZHVsZXMgYXJlIG5ldmVyIGluc3RhbGxlZCAoZS5nLiBzdGF0aWMgbGlicmFyaWVzKS4KKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGUgbGlzdCBvZiBMT0NBTF9YWFhYIHZhcmlhYmxlcyB0aGF0IGFyZSByZWNvcmRlZCBmb3IgZWFjaCBtb2R1bGUgZGVmaW5pdGlvbgorIyBUaGVzZSBhcmUgZG9jdW1lbnRlZCBieSBkb2NzL0FORFJPSUQtTUsuVFhULiBFeGNlcHRpb24gaXMgTE9DQUxfTU9EVUxFCisjCittb2R1bGVzLUxPQ0FMUyA6PSBcCisgICAgQUxMT1dfVU5ERUZJTkVEX1NZTUJPTFMgXAorICAgIEFTTUZMQUdTIFwKKyAgICBCVUlMVF9NT0RVTEVfTk9UX0NPUElFRCBcCisgICAgQ0ZMQUdTIFwKKyAgICBDT05MWUZMQUdTIFwKKyAgICBDUFBGTEFHUyBcCisgICAgQ1BQX0VYVEVOU0lPTiBcCisgICAgQ1BQX0ZFQVRVUkVTIFwKKyAgICBDWFhGTEFHUyBcCisgICAgQ19JTkNMVURFUyBcCisgICAgRElTQUJMRV9GT1JNQVRfU1RSSU5HX0NIRUNLUyBcCisgICAgRElTQUJMRV9OT19FWEVDVVRFIFwKKyAgICBESVNBQkxFX1JFTFJPIFwKKyAgICBFWFBPUlRfQVNNRkxBR1MgXAorICAgIEVYUE9SVF9DRkxBR1MgXAorICAgIEVYUE9SVF9DT05MWUZMQUdTIFwKKyAgICBFWFBPUlRfQ1BQRkxBR1MgXAorICAgIEVYUE9SVF9DX0lOQ0xVREVTIFwKKyAgICBFWFBPUlRfTERGTEFHUyBcCisgICAgRVhQT1JUX0xETElCUyBcCisgICAgRklMVEVSX0FTTSBcCisgICAgTERGTEFHUyBcCisgICAgTERMSUJTIFwKKyAgICBNT0RVTEUgXAorICAgIE1PRFVMRV9GSUxFTkFNRSBcCisgICAgUEFUSCBcCisgICAgUENIIFwKKyAgICBTSEFSRURfTElCUkFSSUVTIFwKKyAgICBTSE9SVF9DT01NQU5EUyBcCisgICAgU1JDX0ZJTEVTIFwKKyAgICBTVEFUSUNfTElCUkFSSUVTIFwKKyAgICBUSElOX0FSQ0hJVkUgXAorICAgIFdIT0xFX1NUQVRJQ19MSUJSQVJJRVMgXAorCisjIFRoZSBmb2xsb3dpbmcgYXJlIGdlbmVyYXRlZCBieSB0aGUgYnVpbGQgc2NyaXB0cyB0aGVtc2VsdmVzCisKKyMgTE9DQUxfTUFLRUZJTEUgd2lsbCBjb250YWluIHRoZSBwYXRoIHRvIHRoZSBBbmRyb2lkLm1rIGRlZmluaW5nIHRoZSBtb2R1bGUKK21vZHVsZXMtTE9DQUxTICs9IE1BS0VGSUxFCisKKyMgTE9DQUxfTERGTEFHUyB3aWxsIGNvbnRhaW4gdGhlIHNldCBvZiBmaW5hbCBsaW5rZXIgZmxhZ3MgZm9yIHRoZSBtb2R1bGUKK21vZHVsZXMtTE9DQUxTICs9IExERkxBR1MKKworIyBMT0NBTF9PQkpFQ1RTIHdpbGwgY29udGFpbiB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgZ2VuZXJhdGVkIGZyb20gdGhlCisjIG1vZHVsZSdzIHNvdXJjZXMsIGlmIGFueS4KK21vZHVsZXMtTE9DQUxTICs9IE9CSkVDVFMKKworIyBMT0NBTF9CVUlMVF9NT0RVTEUgd2lsbCBjb250YWluIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9saWMgdmVyc2lvbiBvZgorIyB0aGUgZ2VuZXJhdGVkIG1vZHVsZSAoaS5lLiB0aGUgb25lIGNvbnRhaW5pbmcgYWxsIHN5bWJvbHMgdXNlZCBkdXJpbmcKKyMgbmF0aXZlIGRlYnVnZ2luZykuIEl0IGlzIGdlbmVyYWxseSB1bmRlciAkUFJPSkVDVC9vYmovbG9jYWwvCittb2R1bGVzLUxPQ0FMUyArPSBCVUlMVF9NT0RVTEUKKworIyBMT0NBTF9PQkpTX0RJUiB3aWxsIGNvbnRhaW4gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgZmlsZXMgZm9yCisjIHRoaXMgbW9kdWxlIHdpbGwgYmUgc3RvcmVkLiBVc3VhbGx5ICRQUk9KRUNUL29iai9sb2NhbC88bW9kdWxlPi9vYmoKK21vZHVsZXMtTE9DQUxTICs9IE9CSlNfRElSCisKKyMgTE9DQUxfSU5TVEFMTEVEIHdpbGwgY29udGFpbiB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGxlZCB2ZXJzaW9uCisjIG9mIHRoZSBtb2R1bGUuIFVzdWFsbHkgJFBST0pFQ1QvbGlicy88YWJpPi88cHJlZml4Pjxtb2R1bGU+PHN1ZmZpeD4KKyMgd2hlcmUgPHByZWZpeD4gYW5kIDxzdWZmaXg+IGRlcGVuZCBvbiB0aGUgbW9kdWxlIGNsYXNzLgorbW9kdWxlcy1MT0NBTFMgKz0gSU5TVEFMTEVECisKKyMgTE9DQUxfTU9EVUxFX0NMQVNTIHdpbGwgY29udGFpbiB0aGUgdHlwZSBvZiB0aGUgbW9kdWxlCisjIChlLmcuIFNUQVRJQ19MSUJSQVJZLCBTSEFSRURfTElCUkFSWSwgZXRjLi4uKQorbW9kdWxlcy1MT0NBTFMgKz0gTU9EVUxFX0NMQVNTCisKKyMgdGhlIGxpc3Qgb2YgbWFuYWdlZCBmaWVsZHMgcGVyIG1vZHVsZQorbW9kdWxlcy1maWVsZHMgPSBkZXBlbmRzIFwKKyAgICAgICAgICAgICAgICAgJChtb2R1bGVzLUxPQ0FMUykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZXMtY2xlYXIKKyMgQXJndW1lbnRzOiBOb25lCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBtb2R1bGVzLWNsZWFyKQorIyBSYXRpb25hbGU6IGNsZWFycyB0aGUgbGlzdCBvZiBkZWZpbmVkIG1vZHVsZXMga25vd24gYnkgdGhlIGJ1aWxkIHN5c3RlbQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbW9kdWxlcy1jbGVhciA9IFwKKyAgICAkKGZvcmVhY2ggX19tb2QsJChfX2J1aWxkX21vZHVsZXMpLFwKKyAgICAgICAgJChmb3JlYWNoIF9fZmllbGQsJChtb2R1bGVzLWZpZWxkcyksXAorICAgICAgICAgICAgJChldmFsIF9fYnVpbGRfbW9kdWxlcy4kKF9fbW9kKS4kKF9fZmllbGQpIDo9ICQoZW1wdHkpKVwKKyAgICAgICAgKVwKKyAgICApXAorICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMgOj0gJChlbXB0eV9zZXQpKSBcCisgICAgJChldmFsIF9fYnVpbGRfdG9wX21vZHVsZXMgOj0gJChlbXB0eSkpIFwKKyAgICAkKGV2YWwgX19idWlsZF9pbXBvcnRfbGlzdCA6PSAkKGVtcHR5KSkgXAorICAgICQoZXZhbCBfX2J1aWxkX2ltcG9ydF9kZXB0aCA6PSAkKGVtcHR5KSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZXMtY2xlYXItbG9jYWwtdmFycworIyBBcmd1bWVudHM6IE5vbmUKKyMgUmV0dXJucyAgOiBOb25lCisjIFVzYWdlICAgIDogJChjYWxsIG1vZHVsZXMtY2xlYXItbG9jYWx2YXJzKQorIyBSYXRpb25hbGU6IGNsZWFycyBhbGwgbW9kdWxlLXNwZWNpZmljIExPQ0FMX1hYWCB2YXJpYWJsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbgorIyAgICAgICAgICAgIG9mIExPQ0FMX1BBVEguIFR5cGljYWxseSB1c2VkIHRvIGltcGxlbWVudCAkKENMRUFSX1ZBUlMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGVzLWNsZWFyLWxvY2FsLXZhcnMgPSBcCisgICAgJChjYWxsIGNsZWFyLXZhcnMsICQoZmlsdGVyLW91dCBMT0NBTF9QQVRILCQobW9kdWxlcy1MT0NBTFM6JT1MT0NBTF8lKSkpXAorCSQoZXZhbCBMT0NBTF9QQVRIIDo9ICQkKHN0cmlwICQkKExPQ0FMX1BBVEgpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZXMtZ2V0LWxpc3QKKyMgQXJndW1lbnRzOiBOb25lCisjIFJldHVybnMgIDogVGhlIGxpc3Qgb2YgYWxsIHJlY29yZGVkIG1vZHVsZXMKKyMgVXNhZ2UgICAgOiAkKGNhbGwgbW9kdWxlcy1nZXQtbGlzdCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZXMtZ2V0LWxpc3QgPSAkKF9fYnVpbGRfbW9kdWxlcykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZXMtZ2V0LXRvcC1saXN0CisjIEFyZ3VtZW50czogTm9uZQorIyBSZXR1cm5zICA6IFRoZSBsaXN0IG9mIGFsbCByZWNvcmRlZCBub24taW1wb3J0ZWQgbW9kdWxlcworIyBVc2FnZSAgICA6ICQoY2FsbCBtb2R1bGVzLWdldC10b3AtbGlzdCkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZXMtZ2V0LXRvcC1saXN0ID0gJChfX2J1aWxkX3RvcF9tb2R1bGVzKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogbW9kdWxlLWFkZAorIyBBcmd1bWVudHM6IDE6IG1vZHVsZSBuYW1lCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBtb2R1bGUtYWRkLDxtb2R1bGVuYW1lPikKKyMgUmF0aW9uYWxlOiBhZGQgYSBuZXcgbW9kdWxlLiBJZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UKKyMgICAgICAgICAgICBhbmQgYWJvcnQuIFRoaXMgd2lsbCByZWNvcmQgYWxsIExPQ0FMX1hYWCB2YXJpYWJsZXMgZm9yIHRoZSBtb2R1bGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtYWRkID0gXAorICAkKGNhbGwgYXNzZXJ0LWRlZmluZWQsTE9DQUxfTUFLRUZJTEUgTE9DQUxfQlVJTFRfTU9EVUxFIExPQ0FMX09CSlNfRElSIExPQ0FMX01PRFVMRV9DTEFTUylcCisgICQoaWYgJChjYWxsIHNldF9pc19tZW1iZXIsJChfX2J1aWxkX21vZHVsZXMpLCQxKSxcCisgICAgJChjYWxsIC1idWlsZC1pbmZvLFRyeWluZyB0byBkZWZpbmUgbG9jYWwgbW9kdWxlICckMScgaW4gJChMT0NBTF9NQUtFRklMRSkuKVwKKyAgICAkKGNhbGwgLWJ1aWxkLWluZm8sQnV0IHRoaXMgbW9kdWxlIHdhcyBhbHJlYWR5IGRlZmluZWQgYnkgJChfX2J1aWxkX21vZHVsZXMuJDEuTUFLRUZJTEUpLilcCisgICAgJChjYWxsIC1idWlsZC1lcnJvcixBYm9ydGluZy4pXAorICApXAorICAkKGV2YWwgX19idWlsZF9tb2R1bGVzIDo9ICQoY2FsbCBzZXRfaW5zZXJ0LCQoX19idWlsZF9tb2R1bGVzKSwkMSkpXAorICAkKGlmICQoc3RyaXAgJChfX2J1aWxkX2ltcG9ydF9kZXB0aCkpLCxcCisgICAgJChldmFsIF9fYnVpbGRfdG9wX21vZHVsZXMgOj0gJChjYWxsIHNldF9pbnNlcnQsJChfX2J1aWxkX3RvcF9tb2R1bGVzKSwkMSkpXAorICApXAorICAkKGlmICQoY2FsbCBtb2R1bGUtY2xhc3MtaXMtaW5zdGFsbGFibGUsJChMT0NBTF9NT0RVTEVfQ0xBU1MpKSxcCisgICAgJChldmFsIExPQ0FMX0lOU1RBTExFRCA6PSAkKEJVSUxEX0lOU1RBTExfRElSKS8kKG5vdGRpciAkKExPQ0FMX0JVSUxUX01PRFVMRSkpKSxcCisgICAgJChldmFsIExPQ0FMX0lOU1RBTExFRCA6PSAkKExPQ0FMX0JVSUxUX01PRFVMRSkpXAorICApXAorICAkKGZvcmVhY2ggX19maWVsZCxTVEFUSUNfTElCUkFSSUVTIFdIT0xFX1NUQVRJQ19MSUJSQVJJRVMgU0hBUkVEX0xJQlJBUklFUyxcCisgICAgJChldmFsIExPQ0FMXyQoX19maWVsZCkgOj0gJChjYWxsIHN0cmlwLWxpYi1wcmVmaXgsJChMT0NBTF8kKF9fZmllbGQpKSkpKVwKKyAgJChmb3JlYWNoIF9fbG9jYWwsJChtb2R1bGVzLUxPQ0FMUyksXAorICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMuJDEuJChfX2xvY2FsKSA6PSAkKExPQ0FMXyQoX19sb2NhbCkpKVwKKyAgKVwKKyAgJChjYWxsIG1vZHVsZS1oYW5kbGUtYysrLWZlYXR1cmVzLCQxKQorCisKKyMgUmV0cmlldmUgdGhlIGNsYXNzIG9mIG1vZHVsZSAkMQorbW9kdWxlLWdldC1jbGFzcyA9ICQoX19idWlsZF9tb2R1bGVzLiQxLk1PRFVMRV9DTEFTUykKKworIyBSZXRyaWV2ZSBidWlsdCBsb2NhdGlvbiBvZiBtb2R1bGUgJDEKK21vZHVsZS1nZXQtYnVpbHQgPSAkKF9fYnVpbGRfbW9kdWxlcy4kMS5CVUlMVF9NT0RVTEUpCisKKyMgUmV0dXJucyAkKHRydWUpIGlzIG1vZHVsZSAkMSBpcyBpbnN0YWxsYWJsZQorIyBBbiBpbnN0YWxsYWJsZSBtb2R1bGUgaXMgb25lIHRoYXQgd2lsbCBiZSBjb3BpZWQgdG8gJFBST0pFQ1QvbGlicy88YWJpPi8KKyMgKGUuZy4gc2hhcmVkIGxpYnJhcmllcykuCisjCittb2R1bGUtaXMtaW5zdGFsbGFibGUgPSAkKGNhbGwgbW9kdWxlLWNsYXNzLWlzLWluc3RhbGxhYmxlLCQoY2FsbCBtb2R1bGUtZ2V0LWNsYXNzLCQxKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZS1nZXQtZXhwb3J0CisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgICAgICAgICAgICAyOiBleHBvcnQgdmFyaWFibGUgbmFtZSB3aXRob3V0IExPQ0FMX0VYUE9SVF8gcHJlZml4IChlLmcuICdDRkxBR1MnKQorIyBSZXR1cm5zICA6IEV4cG9ydGVkIHZhbHVlCisjIFVzYWdlICAgIDogJChjYWxsIG1vZHVsZS1nZXQtZXhwb3J0LDxtb2R1bGVuYW1lPiw8dmFybmFtZT4pCisjIFJhdGlvbmFsZTogUmV0dXJuIHRoZSByZWNvcmRlZCB2YWx1ZSBvZiBMT0NBTF9FWFBPUlRfJDIsIGlmIGFueSwgZm9yIG1vZHVsZSAkMQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbW9kdWxlLWdldC1leHBvcnQgPSAkKF9fYnVpbGRfbW9kdWxlcy4kMS5FWFBPUlRfJDIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBtb2R1bGUtZ2V0LWxpc3RlZC1leHBvcnQKKyMgQXJndW1lbnRzOiAxOiBsaXN0IG9mIG1vZHVsZSBuYW1lcworIyAgICAgICAgICAgIDI6IGV4cG9ydCB2YXJpYWJsZSBuYW1lIHdpdGhvdXQgTE9DQUxfRVhQT1JUXyBwcmVmaXggKGUuZy4gJ0NGTEFHUycpCisjIFJldHVybnMgIDogRXhwb3J0ZWQgdmFsdWVzCisjIFVzYWdlICAgIDogJChjYWxsIG1vZHVsZS1nZXQtbGlzdGVkLWV4cG9ydCw8bW9kdWxlLWxpc3Q+LDx2YXJuYW1lPikKKyMgUmF0aW9uYWxlOiBSZXR1cm4gdGhlIHJlY29yZGVkIHZhbHVlIG9mIExPQ0FMX0VYUE9SVF8kMiwgaWYgYW55LCBmb3IgbW9kdWxlcworIyAgICAgICAgICAgIGxpc3RlZCBpbiAkMS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1nZXQtbGlzdGVkLWV4cG9ydCA9ICQoc3RyaXAgXAorICAgICQoZm9yZWFjaCBfX2xpc3RlZF9tb2R1bGUsJDEsXAorICAgICAgICAkKGNhbGwgbW9kdWxlLWdldC1leHBvcnQsJChfX2xpc3RlZF9tb2R1bGUpLCQyKVwKKyAgICApKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogbW9kdWxlcy1yZXN0b3JlLWxvY2FscworIyBBcmd1bWVudHM6IDE6IG1vZHVsZSBuYW1lCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBtb2R1bGUtcmVzdG9yZS1sb2NhbHMsPG1vZHVsZW5hbWU+KQorIyBSYXRpb25hbGU6IFJlc3RvcmUgdGhlIHJlY29yZGVkIExPQ0FMX1hYWCBkZWZpbml0aW9ucyBmb3IgYSBnaXZlbiBtb2R1bGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtcmVzdG9yZS1sb2NhbHMgPSBcCisgICAgJChmb3JlYWNoIF9fbG9jYWwsJChtb2R1bGVzLUxPQ0FMUyksXAorICAgICAgICAkKGV2YWwgTE9DQUxfJChfX2xvY2FsKSA6PSAkKF9fYnVpbGRfbW9kdWxlcy4kMS4kKF9fbG9jYWwpKSlcCisgICAgKQorCisjIER1bXAgYWxsIG1vZHVsZSBpbmZvcm1hdGlvbi4gT25seSB1c2UgdGhpcyBmb3IgZGVidWdnaW5nCittb2R1bGVzLWR1bXAtZGF0YWJhc2UgPSBcCisgICAgJChpbmZvIE1vZHVsZXMgWyQoVEFSR0VUX0FSQ0hfQUJJKV06ICQoX19idWlsZF9tb2R1bGVzKSkgXAorICAgICQoZm9yZWFjaCBfX21vZCwkKF9fYnVpbGRfbW9kdWxlcyksXAorICAgICAgICAkKGluZm8gJChzcGFjZTQpJChfX21vZCk6KVwKKyAgICAgICAgJChmb3JlYWNoIF9fZmllbGQsJChtb2R1bGVzLWZpZWxkcyksXAorICAgICAgICAgICAgJChldmFsIF9fZmllbGR2YWwgOj0gJChzdHJpcCAkKF9fYnVpbGRfbW9kdWxlcy4kKF9fbW9kKS4kKF9fZmllbGQpKSkpXAorICAgICAgICAgICAgJChpZiAkKF9fZmllbGR2YWwpLFwKKyAgICAgICAgICAgICAgICAkKGlmICQoZmlsdGVyIDEsJCh3b3JkcyAkKF9fZmllbGR2YWwpKSksXAorICAgICAgICAgICAgICAgICAgICAkKGluZm8gJChzcGFjZTQpJChzcGFjZTQpJChfX2ZpZWxkKTogJChfX2ZpZWxkdmFsKSksXAorICAgICAgICAgICAgICAgICAgICAkKGluZm8gJChzcGFjZTQpJChzcGFjZTQpJChfX2ZpZWxkKTogKVwKKyAgICAgICAgICAgICAgICAgICAgJChmb3JlYWNoIF9fZmllbGRpdGVtLCQoX19maWVsZHZhbCksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChpbmZvICQoc3BhY2U0KSQoc3BhY2U0KSQoc3BhY2U0KSQoX19maWVsZGl0ZW0pKVwKKyAgICAgICAgICAgICAgICAgICAgKVwKKyAgICAgICAgICAgICAgICApXAorICAgICAgICAgICAgKVwKKyAgICAgICAgKVwKKyAgICApXAorICAgICQoaW5mbyBUb3AgbW9kdWxlczogJChfX2J1aWxkX3RvcF9tb2R1bGVzKSlcCisgICAgJChpbmZvIC0tLSBlbmQgb2YgbW9kdWxlcyBsaXN0KQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBtb2R1bGUtYWRkLXN0YXRpYy1kZXBlbmRzCisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgICAgICAgICAgICAyOiBsaXN0L3NldCBvZiBzdGF0aWMgbGlicmFyeSBtb2R1bGVzIHRoaXMgbW9kdWxlIGRlcGVuZHMgb24uCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBtb2R1bGUtYWRkLXN0YXRpYy1kZXBlbmRzLDxtb2R1bGVuYW1lPiw8bGlzdCBvZiBtb2R1bGUgbmFtZXM+KQorIyBSYXRpb25hbGU6IFJlY29yZCB0aGF0IGEgbW9kdWxlIGRlcGVuZHMgb24gYSBzZXQgb2Ygc3RhdGljIGxpYnJhcmllcy4KKyMgICAgICAgICAgICBVc2UgbW9kdWxlLWdldC1zdGF0aWMtZGVwZW5kZW5jaWVzIHRvIHJldHJpZXZlIGZpbmFsIGxpc3QuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtYWRkLXN0YXRpYy1kZXBlbmRzID0gXAorICAgICQoY2FsbCBtb2R1bGUtYWRkLWRlcGVuZHMtYW55LCQxLCQyLGRlcGVuZHMpIFwKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IG1vZHVsZS1hZGQtc2hhcmVkLWRlcGVuZHMKKyMgQXJndW1lbnRzOiAxOiBtb2R1bGUgbmFtZQorIyAgICAgICAgICAgIDI6IGxpc3Qvc2V0IG9mIHNoYXJlZCBsaWJyYXJ5IG1vZHVsZXMgdGhpcyBtb2R1bGUgZGVwZW5kcyBvbi4KKyMgUmV0dXJucyAgOiBOb25lCisjIFVzYWdlICAgIDogJChjYWxsIG1vZHVsZS1hZGQtc2hhcmVkLWRlcGVuZHMsPG1vZHVsZW5hbWU+LDxsaXN0IG9mIG1vZHVsZSBuYW1lcz4pCisjIFJhdGlvbmFsZTogUmVjb3JkIHRoYXQgYSBtb2R1bGUgZGVwZW5kcyBvbiBhIHNldCBvZiBzaGFyZWQgbGlicmFyaWVzLgorIyAgICAgICAgICAgIFVzZSBtb2R1bGdlLWdldC1zaGFyZWQtZGVwZW5kZW5jaWVzIHRvIHJldHJpZXZlIGZpbmFsIGxpc3QuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtYWRkLXNoYXJlZC1kZXBlbmRzID0gXAorICAgICQoY2FsbCBtb2R1bGUtYWRkLWRlcGVuZHMtYW55LCQxLCQyLGRlcGVuZHMpIFwKKworIyBVc2VkIGludGVybmFsbHkgYnkgbW9kdWxlLWFkZC1zdGF0aWMtZGVwZW5kcyBhbmQgbW9kdWxlLWFkZC1zaGFyZWQtZGVwZW5kcworIyBOT1RFOiB0aGlzIGZ1bmN0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgZXhpc3RpbmcgZGVwZW5kZW5jeSBvcmRlciB3aGVuIG5ldyBkZXBlbmRzIGFyZSBhZGRlZC4KKyMKK21vZHVsZS1hZGQtZGVwZW5kcy1hbnkgPSBcCisgICAgJChldmFsIF9fYnVpbGRfbW9kdWxlcy4kMS4kMyArPSAkKGZpbHRlci1vdXQgJChfX2J1aWxkX21vZHVsZXMuJDEuJDMpLCQyKSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybnMgbm9uLWVtcHR5IGlmIGEgbW9kdWxlIGlzIGEgc3RhdGljIGxpYnJhcnkKKyMgQXJndW1lbnRzOiAxOiBtb2R1bGUgbmFtZQorIyBSZXR1cm5zICAgICA6IG5vbi1lbXB0eSBpZmYgdGhlIG1vZHVsZSBpcyBhIHN0YXRpYyBsaWJyYXJ5LgorIyBVc2FnZSAgICAgICA6ICQoaWYgJChjYWxsIG1vZHVsZS1pcy1zdGF0aWMtbGlicmFyeSw8bmFtZT4pLC4uLikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1pcy1zdGF0aWMtbGlicmFyeSA9ICQoc3RyaXAgXAorICAkKGZpbHRlciBTVEFUSUNfTElCUkFSWSBQUkVCVUlMVF9TVEFUSUNfTElCUkFSWSxcCisgICAgJChjYWxsIG1vZHVsZS1nZXQtY2xhc3MsJDEpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZXR1cm5zIG5vbi1lbXB0eSBpZiBhIG1vZHVsZSBpcyBhIHNoYXJlZCBsaWJyYXJ5CisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgUmV0dXJucyAgICAgOiBub24tZW1wdHkgaWZmIHRoZSBtb2R1bGUgaXMgYSBzaGFyZWQgbGlicmFyeS4KKyMgVXNhZ2UgICAgICAgOiAkKGlmICQoY2FsbCBtb2R1bGUtaXMtc2hhcmVkLWxpYnJhcnksPG5hbWU+KSwuLi4pCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtaXMtc2hhcmVkLWxpYnJhcnkgPSAkKHN0cmlwIFwKKyAgJChmaWx0ZXIgU0hBUkVEX0xJQlJBUlkgUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlksXAorICAgICQoY2FsbCBtb2R1bGUtZ2V0LWNsYXNzLCQxKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsdGVyIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdG8gcmV0YWluIG9ubHkgdGhlIHN0YXRpYyBsaWJyYXJpZXMuCisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUgbGlzdAorIyBSZXR1cm5zICAgICA6IGlucHV0IGxpc3QgbW9kdWxlcyB3aGljaCBhcmUgc3RhdGljIGxpYnJhcmllcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1maWx0ZXItc3RhdGljLWxpYnJhcmllcyA9ICQoY2FsbCBmaWx0ZXItYnksJDEsbW9kdWxlLWlzLXN0YXRpYy1saWJyYXJ5KQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbHRlciBhIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIHJldGFpbiBvbmx5IHRoZSBzaGFyZWQgbGlicmFyaWVzLgorIyBBcmd1bWVudHM6IDE6IG1vZHVsZSBuYW1lIGxpc3QKKyMgUmV0dXJucyAgICAgOiBpbnB1dCBsaXN0IG1vZHVsZXMgd2hpY2ggYXJlIHNoYXJlZCBsaWJyYXJpZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtZmlsdGVyLXNoYXJlZC1saWJyYXJpZXMgPSAkKGNhbGwgZmlsdGVyLWJ5LCQxLG1vZHVsZS1pcy1zaGFyZWQtbGlicmFyeSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZXR1cm4gdGhlIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgZm9yIGEgZ2l2ZW4gbW9kdWxlLgorIyBBcmd1bWVudHM6IDE6IG1vZHVsZSBuYW1lCisjIFJldHVybnMgICAgIDogTGlzdCBvZiBzdGF0aWMgbGlicmFyeSBtb2R1bGVzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbW9kdWxlLWdldC1zdGF0aWMtbGlicyA9ICQoX19idWlsZF9tb2R1bGVzLiQxLlNUQVRJQ19MSUJSQVJJRVMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmV0dXJuIHRoZSBMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTIGZvciBhIGdpdmVuIG1vZHVsZS4KKyMgQXJndW1lbnRzOiAxOiBtb2R1bGUgbmFtZQorIyBSZXR1cm5zICAgICA6IExpc3Qgb2Ygd2hvbGUgc3RhdGljIGxpYnJhcnkgbW9kdWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1nZXQtd2hvbGUtc3RhdGljLWxpYnMgPSAkKF9fYnVpbGRfbW9kdWxlcy4kMS5XSE9MRV9TVEFUSUNfTElCUkFSSUVTKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybiBhbGwgc3RhdGljIGxpYnJhcmllcyBmb3IgYSBnaXZlbiBtb2R1bGUuCisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgUmV0dXJucyAgICAgOiBMaXN0IG9mIHN0YXRpYyBsaWJyYXJ5IG1vZHVsZXMgKHdob2xlIG9yIG5vdCkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtZ2V0LWFsbC1zdGF0aWMtbGlicyA9ICQoc3RyaXAgXAorICAkKF9fYnVpbGRfbW9kdWxlcy4kMS5TVEFUSUNfTElCUkFSSUVTKSBcCisgICQoX19idWlsZF9tb2R1bGVzLiQxLldIT0xFX1NUQVRJQ19MSUJSQVJJRVMpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybiB0aGUgbGlzdCBvZiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIGZvciBhIGdpdmVuIG1vZHVsZS4KKyMgQXJndW1lbnRzOiAxOiBtb2R1bGUgbmFtZQorIyBSZXR1cm5zICAgICA6IExpc3Qgb2Ygc2hhcmVkIGxpYnJhcnkgbW9kdWxlcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1nZXQtc2hhcmVkLWxpYnMgPSAkKF9fYnVpbGRfbW9kdWxlcy4kMS5TSEFSRURfTElCUkFSSUVTKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybiB0aGUgbGlzdCBvZiBhbGwgbGlicmFyaWVzIGEgbW9kdWxlcyBkZXBlbmRzIGRpcmVjdGx5IG9uLgorIyBUaGlzIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGl0cyBMT0NBTF9TVEFUSUNfTElCUkFSSUVTLAorIyBMT0NBTF9XSE9MRV9TVEFUSUNfTElCUkFSSUVTLCBhbmQgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyB2YXJpYWJsZXMuCisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgUmV0dXJucyAgICAgOiBMaXN0IG9mIGxpYnJhcnkgbW9kdWxlcyAoc3RhdGljIG9yIHNoYXJlZCkuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtZ2V0LWRpcmVjdC1saWJzID0gJChzdHJpcCBcCisgICQoX19idWlsZF9tb2R1bGVzLiQxLlNUQVRJQ19MSUJSQVJJRVMpIFwKKyAgJChfX2J1aWxkX21vZHVsZXMuJDEuV0hPTEVfU1RBVElDX0xJQlJBUklFUykgXAorICAkKF9fYnVpbGRfbW9kdWxlcy4kMS5TSEFSRURfTElCUkFSSUVTKSkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXB1dGVzIHRoZSBmdWxsIGNsb3N1cmUgb2YgYSBtb2R1bGUgYW5kIGl0cyBkZXBlbmRlbmNpZXMuIE9yZGVyIGlzCisjIGRlZmluZWQgYnkgYSBicmVhZHRoLWZpcnN0IHdhbGsgb2YgdGhlIGdyYXBoLgorIyAkMSB3aWxsIGJlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSByZXN1bHQuCisjCisjIEFyZ3VtZW50czogMTogbW9kdWxlIG5hbWUKKyMgUmV0dXJucyAgICAgOiBMaXN0IG9mIGFsbCBtb2R1bGVzICQxIGRlcGVuZHMgb24uCisjCisjIE5vdGU6IERvIG5vdCB1c2UgdGhpcyB0byBkZXRlcm1pbmUgYnVpbGQgZGVwZW5kZW5jaWVzLiBUaGUgcmV0dXJuZWQgbGlzdAorIyAgICAgICBpcyBtdWNoIHRvbyBsYXJnZSBmb3IgdGhpcy4gRm9yIGV4YW1wbGUgY29uc2lkZXIgdGhlIGZvbGxvd2luZworIyAgICAgICBkZXBlbmRlbmN5IGdyYXBoOgorIworIyAgIG1haW4uZXhlIC0+IGxpYkEuYSAtPiBsaWJmb28uc28gLT4gbGliQi5hCisjCisjICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYWxsIGZvdXIgbW9kdWxlcyBpbiB0aGUgcmVzdWx0LCB3aGlsZQorIyAgICAgICBhdCBsaW5rIHRpbWUgYnVpbGRpbmcgbWFpbi5leGUgb25seSByZXF1aXJlcyB0aGUgZmlyc3QgdGhyZWUuCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtZ2V0LWFsbC1kZXBlbmRlbmNpZXMgPSAkKGNhbGwgLWJ1aWxkLW1vZC1nZXQtY2xvc3VyZSwkMSxtb2R1bGUtZ2V0LWRlcGVuZHMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcHV0ZSB0aGUgbGlzdCBvZiBhbGwgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIHJlcXVpcmVkIHRvIGxpbmsgYQorIyBnaXZlbiBtb2R1bGUuCisjCisjIE5vdGUgdGhhdCB0aGUgcmVzdWx0IGlzIHRvcG9sb2dpY2FsbHkgb3JkZXJlZCwgaS5lLiBpZiBsaWJyYXJ5IEEgZGVwZW5kcworIyBvbiBsaWJyYXJ5IEIsIHRoZW4gQSB3aWxsIGFsd2F5cyBhcHBlYXIgYWZ0ZXIgQiBpbiB0aGUgcmVzdWx0LgorIworIyBBcmd1bWVudHM6IDE6IG1vZHVsZSBuYW1lCisjIFJldHVybnMgICAgIDogTGlzdCBvZiBhbGwgbGlicmFyeSAkMSBkZXBlbmRzIGF0IGxpbmsgdGltZS4KKyMKKyMgTm90ZTogVGhpcyBkb2Vzbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZWd1bGFyIGFuZCB3aG9sZSBzdGF0aWMKKyMgICAgICAgbGlicmFyaWVzLiBVc2UgbW9kdWxlLWV4dHJhY3Qtd2hvbGUtc3RhdGljLWxpYnMgdG8gZmlsdGVyIHRoZQorIyAgICAgICByZXN1bHQgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21vZHVsZS1nZXQtbGluay1saWJzID0gJChzdHJpcCBcCisgICQoZXZhbCBfYnVpbGRfbW9kX2xpbmtfbW9kdWxlIDo9ICQxKSBcCisgICQoY2FsbCAtYnVpbGQtbW9kLWdldC10b3BvbG9naWNhbC1kZXBlbmRzLCQxLC1idWlsZC1tb2QtbGluay1kZXBzKSkKKworIyBTcGVjaWFsIGRlcGVuZGVuY3kgZnVuY3Rpb24gdXNlZCBieSBtb2R1bGUtZ2V0LWxpbmstbGlicy4KKyMgVGhlIHJ1bGVzIHRvIGZvbGxvdyBhcmUgdGhlIGZvbGxvd2luZzoKKyMgIC0gaWYgJDEgaXMgdGhlIGxpbmsgbW9kdWxlLCBvciBpZiBpdCBpcyBhIHN0YXRpYyBsaWJyYXJ5LCB0aGVuIGFsbAorIyAgICBkaXJlY3QgZGVwZW5kZW5jaWVzLgorIyAgLSBvdGhlcndpc2UsIHRoZSBtb2R1bGUgaXMgYSBzaGFyZWQgbGlicmFyeSwgZG9uJ3QgYWRkIGJ1aWxkIGRlcHMuCistYnVpbGQtbW9kLWxpbmstZGVwcyA9IFwKKyAgJChpZiAkKGNhbGwgc2VxLCQxLCQoX2J1aWxkX21vZF9saW5rX21vZHVsZSkpJChjYWxsIG1vZHVsZS1pcy1zdGF0aWMtbGlicmFyeSwkMSksXAorICAgICQoY2FsbCBtb2R1bGUtZ2V0LWRpcmVjdC1saWJzLCQxKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgbGlzdCBvZiBzdGF0aWMgbGlicmFyaWVzIHRoYXQgbmVlZAorIyB0byBiZSBsaW5rZWQgYXMgd2hvbGUsIGkuZS4gcGxhY2VkIGluIGEgc3BlY2lhbCBzZWN0aW9uIG9uIHRoZSBmaW5hbAorIyBsaW5rIGNvbW1hbmQuCisjIEFyZ3VtZW50czogJDE6IG1vZHVsZSBuYW1lLgorIyAgICAgICAgICAgICQyOiBsaXN0IG9mIGFsbCBzdGF0aWMgbGluay10aW1lIGxpYnJhcmllcyAocmVndWxhciBvciB3aG9sZSkuCisjIFJldHVybnMgIDogbGlzdCBvZiBzdGF0aWMgbGlicmFyaWVzIGZyb20gJyQyJyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkCisjICAgICAgICAgICAgYXMgd2hvbGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittb2R1bGUtZXh0cmFjdC13aG9sZS1zdGF0aWMtbGlicyA9ICQoc3RyaXAgXAorICAkKGV2YWwgX2J1aWxkX21vZF93aG9sZV9hbGwgOj0gJChjYWxsIG1hcCxtb2R1bGUtZ2V0LXdob2xlLXN0YXRpYy1saWJzLCQxICQyKSlcCisgICQoZXZhbCBfYnVpbGRfbW9kX3dob2xlX3Jlc3VsdCA6PSAkKGZpbHRlciAkKF9idWlsZF9tb2Rfd2hvbGVfYWxsKSwkMikpXAorICAkKF9idWlsZF9tb2Rfd2hvbGVfcmVzdWx0KSkKKworIyBVc2VkIHRvIHJlY29tcHV0ZSBhbGwgZGVwZW5kZW5jaWVzIG9uY2UgYWxsIG1vZHVsZSBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZWNvcmRlZC4KKyMKK21vZHVsZXMtY29tcHV0ZS1kZXBlbmRlbmNpZXMgPSBcCisgICAgJChmb3JlYWNoIF9fbW9kdWxlLCQoX19idWlsZF9tb2R1bGVzKSxcCisgICAgICAgICQoY2FsbCBtb2R1bGUtY29tcHV0ZS1kZXBlbmRzLCQoX19tb2R1bGUpKVwKKyAgICApCisKK21vZHVsZS1jb21wdXRlLWRlcGVuZHMgPSBcCisgICAgJChjYWxsIG1vZHVsZS1hZGQtc3RhdGljLWRlcGVuZHMsJDEsJChfX2J1aWxkX21vZHVsZXMuJDEuU1RBVElDX0xJQlJBUklFUykpXAorICAgICQoY2FsbCBtb2R1bGUtYWRkLXN0YXRpYy1kZXBlbmRzLCQxLCQoX19idWlsZF9tb2R1bGVzLiQxLldIT0xFX1NUQVRJQ19MSUJSQVJJRVMpKVwKKyAgICAkKGNhbGwgbW9kdWxlLWFkZC1zaGFyZWQtZGVwZW5kcywkMSwkKF9fYnVpbGRfbW9kdWxlcy4kMS5TSEFSRURfTElCUkFSSUVTKSlcCisKK21vZHVsZS1nZXQtaW5zdGFsbGVkID0gJChfX2J1aWxkX21vZHVsZXMuJDEuSU5TVEFMTEVEKQorCittb2R1bGUtZ2V0LWRlcGVuZHMgPSAkKF9fYnVpbGRfbW9kdWxlcy4kMS5kZXBlbmRzKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogbW9kdWxlcy1nZXQtYWxsLWluc3RhbGxhYmxlCisjIEFyZ3VtZW50czogMTogbGlzdCBvZiBtb2R1bGUgbmFtZXMKKyMgUmV0dXJucyAgOiBMaXN0IG9mIGFsbCB0aGUgaW5zdGFsbGFibGUgbW9kdWxlcyAkMSBkZXBlbmRzIG9uIHRyYW5zaXRpdmVseS4KKyMgVXNhZ2UgICAgOiAkKGNhbGwgbW9kdWxlcy1hbGwtZ2V0LWluc3RhbGxhYmxlLDxsaXN0IG9mIG1vZHVsZSBuYW1lcz4pCisjIFJhdGlvbmFsZTogVGhpcyBjb21wdXRlcyB0aGUgY2xvc3VyZSBvZiBhbGwgaW5zdGFsbGFibGUgbW9kdWxlIGRlcGVuZGVuY2llcyBzdGFydGluZyBmcm9tICQxCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZvciBub3csIG9ubHkgdGhlIGNsb3N1cmUgb2YgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyBpcyBlbm91Z2gKK21vZHVsZXMtZ2V0LWFsbC1pbnN0YWxsYWJsZSA9ICQoc3RyaXAgXAorICAgICQoZm9yZWFjaCBfX2FsbGRlcCwkKGNhbGwgbW9kdWxlLWdldC1hbGwtZGVwZW5kZW5jaWVzLCQxKSxcCisgICAgICAgICQoaWYgJChjYWxsIG1vZHVsZS1pcy1pbnN0YWxsYWJsZSwkKF9fYWxsZGVwKSksJChfX2FsbGRlcCkpXAorICAgICkpCisKKyMgUmV0dXJuIHRoZSBDKysgZXh0ZW5zaW9uKHMpIG9mIGEgZ2l2ZW4gbW9kdWxlCisjICQxOiBtb2R1bGUgbmFtZQorbW9kdWxlLWdldC1jKystZXh0ZW5zaW9ucyA9ICQoc3RyaXAgXAorICAgICQoaWYgJChfX2J1aWxkX21vZHVsZXMuJDEuQ1BQX0VYVEVOU0lPTiksXAorICAgICAgICAkKF9fYnVpbGRfbW9kdWxlcy4kMS5DUFBfRVhURU5TSU9OKSxcCisgICAgICAgICQoZGVmYXVsdC1jKystZXh0ZW5zaW9ucylcCisgICAgKSkKKworIyBSZXR1cm4gdGhlIGxpc3Qgb2YgQysrIHNvdXJjZXMgb2YgYSBnaXZlbiBtb2R1bGUKKyMKK21vZHVsZS1nZXQtYysrLXNvdXJjZXMgPSBcCisgICAgJChldmFsIF9fZmlsZXMgOj0gJChfX2J1aWxkX21vZHVsZXMuJDEuU1JDX0ZJTEVTOiUubmVvbj0lKSkgXAorICAgICQoZXZhbCBfX2ZpbGVzIDo9ICQoX19maWxlczolLmFybT0lKSkgXAorICAgICQoZXZhbCBfX2V4dGVuc2lvbnMgOj0gJChjYWxsIG1vZHVsZS1nZXQtYysrLWV4dGVuc2lvbnMsJDEpKVwKKyAgICAkKGZpbHRlciAkKGZvcmVhY2ggX19leHRlbnNpb24sJChfX2V4dGVuc2lvbnMpLCUkKF9fZXh0ZW5zaW9uKSksJChfX2ZpbGVzKSkKKworIyBSZXR1cm5zIHRydWUgaWYgYSBtb2R1bGUgaGFzIEMrKyBzb3VyY2VzCisjCittb2R1bGUtaGFzLWMrKy1zb3VyY2VzID0gJChzdHJpcCAkKGNhbGwgbW9kdWxlLWdldC1jKystc291cmNlcywkMSkpCisKKworIyBBZGQgQysrIGRlcGVuZGVuY2llcyB0byBhbnkgbW9kdWxlIHRoYXQgaGFzIEMrKyBzb3VyY2VzLgorIyAkMTogbGlzdCBvZiBDKysgcnVudGltZSBzdGF0aWMgbGlicmFyaWVzIChpZiBhbnkpCisjICQyOiBsaXN0IG9mIEMrKyBydW50aW1lIHNoYXJlZCBsaWJyYXJpZXMgKGlmIGFueSkKKyMKK21vZHVsZXMtYWRkLWMrKy1kZXBlbmRlbmNpZXMgPSBcCisgICAgJChmb3JlYWNoIF9fbW9kdWxlLCQoX19idWlsZF9tb2R1bGVzKSxcCisgICAgICAgICQoaWYgJChjYWxsIG1vZHVsZS1oYXMtYysrLXNvdXJjZXMsJChfX21vZHVsZSkpLFwKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtbG9nLE1vZHVsZSAnJChfX21vZHVsZSknIGhhcyBDKysgc291cmNlcylcCisgICAgICAgICAgICAkKGNhbGwgbW9kdWxlLWFkZC1jKystZGVwcywkKF9fbW9kdWxlKSwkMSwkMiksXAorICAgICAgICApXAorICAgICkKKworCisjIFJldHVybiB0aGUgY29tcGlsZXIgZmxhZ3MgdXNlZCB0byBjb21waWxlIGEgQysrIG1vZHVsZQorIyBPcmRlciBtYXR0ZXJzIGFuZCBzaG91bGQgbWF0Y2ggdGhlIG9uZSB1c2VkIGJ5IHRoZSBidWlsZCBjb21tYW5kCittb2R1bGUtZ2V0LWMrKy1mbGFncyA9ICQoc3RyaXAgXAorICAgICQoX19idWlsZF9tb2R1bGVzLiQxLkNGTEFHUykgXAorICAgICQoX19idWlsZF9tb2R1bGVzLiQxLkNQUEZMQUdTKSBcCisgICAgJChfX2J1aWxkX21vZHVsZXMuJDEuQ1hYRkxBR1MpKQorCisjIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgY2VydGFpbiBmbGFncyBmcm9tIGEgbW9kdWxlIGNvbXBpbGVyIGZsYWdzCisjICQxOiBNb2R1bGUgbmFtZQorIyAkMjogTGlzdCBvZiBmbGFncyB0byByZW1vdmUKKyMKK21vZHVsZS1maWx0ZXItb3V0LWNvbXBpbGVyLWZsYWdzID0gXAorICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMuJDEuQ0ZMQUdTICAgICA6PSAkKGZpbHRlci1vdXQgJDIsJChfX2J1aWxkX21vZHVsZXMuJDEuQ0ZMQUdTKSkpXAorICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMuJDEuQ09OTFlGTEFHUyA6PSAkKGZpbHRlci1vdXQgJDIsJChfX2J1aWxkX21vZHVsZXMuJDEuQ09OTFlGTEFHUykpKVwKKyAgICAkKGV2YWwgX19idWlsZF9tb2R1bGVzLiQxLkNQUEZMQUdTICAgOj0gJChmaWx0ZXItb3V0ICQyLCQoX19idWlsZF9tb2R1bGVzLiQxLkNQUEZMQUdTKSkpXAorICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMuJDEuQ1hYRkxBR1MgICA6PSAkKGZpbHRlci1vdXQgJDIsJChfX2J1aWxkX21vZHVsZXMuJDEuQ1hYRkxBR1MpKSlcCisgICAgJChldmFsIF9fYnVpbGRfbW9kdWxlcy4kMS5BU01GTEFHUyAgIDo9ICQoZmlsdGVyLW91dCAkMiwkKF9fYnVpbGRfbW9kdWxlcy4kMS5BU01GTEFHUykpKQorCisjIFJldHVybiB0cnVlIGlmIGEgbW9kdWxlJ3MgY29tcGlsZXIgZmxhZ3MgZW5hYmxlIHJ0dGkKKyMgV2UganVzdCBsb29rIGF0IC1mcnR0aSBhbmQgLWZuby1ydHRpIG9uIHRoZSBjb21tYW5kLWxpbmUKKyMgYW5kIGtlZXAgdGhlIGxhc3Qgb25lIG9mIHRoZXNlIGZsYWdzLgorbW9kdWxlLWZsYWdzLWhhdmUtcnR0aSA9ICQoc3RyaXAgXAorICAgICAgICAkKGZpbHRlciAtZnJ0dGksXAorICAgICAgICAgICAgJChsYXN0d29yZCAkKGZpbHRlciAtZnJ0dGkgLWZuby1ydHRpLCQoY2FsbCBtb2R1bGUtZ2V0LWMrKy1mbGFncywkMSkpKVwKKyAgICAgICAgKVwKKyAgICApCisKKyMgU2FtZSB3aXRoIEMrKyBleGNlcHRpb24gc3VwcG9ydCAoaS5lLiAtZmV4Y2VwdGlvbnMgYW5kIC1mbm8tZXhjZXB0aW9ucykKKyMKK21vZHVsZS1mbGFncy1oYXZlLWV4Y2VwdGlvbnMgPSAkKHN0cmlwIFwKKyAgICAgICAgJChmaWx0ZXIgLWZleGNlcHRpb25zLFwKKyAgICAgICAgICAgICQobGFzdHdvcmQgJChmaWx0ZXIgLWZleGNlcHRpb25zIC1mbm8tZXhlY2VwdGlvbnMsJChjYWxsIG1vZHVsZS1nZXQtYysrLWZsYWdzLCQxKSkpXAorICAgICAgICApXAorICAgICkKKworIyBIYW5kbGUgdGhlIGRlZmluaXRpb24gb2YgTE9DQUxfQ1BQX0ZFQVRVUkVTLCBpLmUuOgorIworIyAgLSBJZiBpdCBpcyBkZWZpbmVkLCBjaGVjayB0aGF0IGl0IG9ubHkgY29udGFpbnMgdmFsaWQgdmFsdWVzCisjICAtIElmIGl0IGlzIHVuZGVmaW5lZCwgdHJ5IHRvIGNvbXB1dGUgaXRzIHZhbHVlIGF1dG9tYXRpY2FsbHkgYnkKKyMgICAgbG9va2luZyBhdCB0aGUgQysrIGNvbXBpbGVyIGZsYWdzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZQorIworIyBBZnRlciB0aGlzLCB3ZSByZW1vdmUgYWxsIGZlYXR1cmVzIGZsYWdzIGZyb20gdGhlIG1vZHVsZSdzIGNvbW1hbmQtbGluZQorIyBBbmQgYWRkIG9ubHkgdGhlIGNvcnJlY3Qgb25lcyBiYWNrIGluIExPQ0FMX0NQUF9GTEFHUworIworbW9kdWxlLWhhbmRsZS1jKystZmVhdHVyZXMgPSBcCisgICAgJChpZiAkKHN0cmlwICQoX19idWlsZF9tb2R1bGVzLiQxLkNQUF9GRUFUVVJFUykpLFwKKyAgICAgICAgJChldmFsIF9fY3h4YmFkIDo9ICQoZmlsdGVyLW91dCBydHRpIGV4Y2VwdGlvbnMsJChfX2J1aWxkX21vZHVsZXMuJDEuQ1BQX0ZFQVRVUkVTKSkpXAorICAgICAgICAkKGlmICQoX19jeHhiYWQpLFwKKyAgICAgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbyxXQVJOSU5HOiBJZ25vcmluZyBpbnZhbGlkIHZhbHVlcyBpbiBMT0NBTF9DUFBfRkVBVFVSRVMgZGVmaW5pdGlvbiBpbiAkKF9fYnVpbGRfbW9kdWxlcy4kMS5NQUtFRklMRSk6ICQoX19jeHhiYWQpKVwKKyAgICAgICAgICAgICQoZXZhbCBfX2J1aWxkX21vZHVsZXMuJDEuQ1BQX0ZFQVRVUkVTIDo9ICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoX19jeHhiYWQpLCQoX19idWlsZF9tb2R1bGVzLiQxLkNQUF9GRUFUVVJFUykpKSlcCisgICAgICAgIClcCisgICAgLFwKKyAgICAgICAgJChldmFsIF9fYnVpbGRfbW9kdWxlcy4kMS5DUFBfRkVBVFVSRVMgOj0gJChzdHJpcCBcCisgICAgICAgICAgICAkKGlmICQoY2FsbCBtb2R1bGUtZmxhZ3MtaGF2ZS1ydHRpLCQxKSxydHRpKSBcCisgICAgICAgICAgICAkKGlmICQoY2FsbCBtb2R1bGUtZmxhZ3MtaGF2ZS1leGNlcHRpb25zLCQxKSxleGNlcHRpb25zKSBcCisgICAgICAgICkpIFwKKyAgICApXAorICAgICQoY2FsbCBtb2R1bGUtZmlsdGVyLW91dC1jb21waWxlci1mbGFncywkMSwtZnJ0dGkgLWZuby1ydHRpIC1mZXhjZXB0aW9ucyAtZm5vLWV4Y2VwdGlvbnMpXAorCisjIFJldHVybnMgdHJ1ZSBpZiBhIG1vZHVsZSBvciBpdHMgZGVwZW5kZW5jaWVzIGhhdmUgc3BlY2lmaWMgQysrIGZlYXR1cmVzCisjIChpLmUuIFJUVEkgb3IgRXhjZXB0aW9ucykKKyMKKyMgJDE6IG1vZHVsZSBuYW1lCisjICQyOiBsaXN0IG9mIGZlYXR1cmVzIChlLmcuICdydHRpJyBvciAnZXhjZXB0aW9ucycpCisjCittb2R1bGUtaGFzLWMrKy1mZWF0dXJlcyA9ICQoc3RyaXAgXAorICAgICQoZXZhbCBfX2N4eGRlcHMgIDo9ICQoY2FsbCBtb2R1bGUtZ2V0LWFsbC1kZXBlbmRlbmNpZXMsJDEpKVwKKyAgICAkKGV2YWwgX19jeHhmbGFncyA6PSAkKGZvcmVhY2ggX19jeHhkZXAsJChfX2N4eGRlcHMpLCQoX19idWlsZF9tb2R1bGVzLiQoX19jeHhkZXApLkNQUF9GRUFUVVJFUykpKVwKKyAgICAkKGlmICQoZmlsdGVyICQyLCQoX19jeHhmbGFncykpLHRydWUsKVwKKyAgICApCisKKyMgQWRkIHN0YW5kYXJkIEMrKyBkZXBlbmRlbmNpZXMgdG8gYSBnaXZlbiBtb2R1bGUKKyMKKyMgJDE6IG1vZHVsZSBuYW1lCisjICQyOiBsaXN0IG9mIEMrKyBydW50aW1lIHN0YXRpYyBsaWJyYXJpZXMgKGlmIGFueSkKKyMgJDM6IGxpc3Qgb2YgQysrIHJ1bnRpbWUgc2hhcmVkIGxpYnJhcmllcyAoaWYgYW55KQorIworbW9kdWxlLWFkZC1jKystZGVwcyA9IFwKKyAgICAkKGlmICQoY2FsbCBzdHJpcCwkMiksJChjYWxsIC1idWlsZC1sb2csQWRkIGRlcGVuZGVuY3kgJyQoY2FsbCBzdHJpcCwkMiknIHRvIG1vZHVsZSAnJDEnKSlcCisgICAgJChldmFsIF9fYnVpbGRfbW9kdWxlcy4kMS5TVEFUSUNfTElCUkFSSUVTICs9ICQoMikpXAorICAgICQoaWYgJChjYWxsIHN0cmlwLCQzKSwkKGNhbGwgLWJ1aWxkLWxvZyxBZGQgZGVwZW5kZW5jeSAnJChjYWxsIHN0cmlwLCQzKScgdG8gbW9kdWxlICckMScpKVwKKyAgICAkKGV2YWwgX19idWlsZF9tb2R1bGVzLiQxLlNIQVJFRF9MSUJSQVJJRVMgKz0gJCgzKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IGNoZWNrLXVzZXItZGVmaW5lCisjIEFyZ3VtZW50czogMTogbmFtZSBvZiB2YXJpYWJsZSB0aGF0IG11c3QgYmUgZGVmaW5lZCBieSB0aGUgdXNlcgorIyAgICAgICAgICAgIDI6IG5hbWUgb2YgTWFrZWZpbGUgd2hlcmUgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBkZWZpbmVkCisjICAgICAgICAgICAgMzogbmFtZS9kZXNjcmlwdGlvbiBvZiB0aGUgTWFrZWZpbGUgd2hlcmUgdGhlIGNoZWNrIGlzIGRvbmUsIHdoaWNoCisjICAgICAgICAgICAgICAgbXVzdCBiZSBpbmNsdWRlZCBieSAkMgorIyBSZXR1cm5zICA6IE5vbmUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NoZWNrLXVzZXItZGVmaW5lID0gJChpZiAkKHN0cmlwICQoJDEpKSwsXAorICAkKGNhbGwgLWJ1aWxkLWVycm9yLE1pc3NpbmcgJDEgYmVmb3JlIGluY2x1ZGluZyAkMyBpbiAkMikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhpcyBpcyB1c2VkIHRvIGNoZWNrIHRoYXQgTE9DQUxfTU9EVUxFIGlzIHByb3Blcmx5IGRlZmluZWQgYnkgYW4gQW5kcm9pZC5taworIyBmaWxlIGJlZm9yZSBpbmNsdWRpbmcgb25lIG9mIHRoZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKSwgZXRjLi4uIGZpbGVzLgorIworIyBGdW5jdGlvbiA6IGNoZWNrLXVzZXItTE9DQUxfTU9EVUxFCisjIEFyZ3VtZW50czogMTogbmFtZS9kZXNjcmlwdGlvbiBvZiB0aGUgaW5jbHVkZWQgYnVpbGQgTWFrZWZpbGUgd2hlcmUgdGhlCisjICAgICAgICAgICAgICAgY2hlY2sgaXMgZG9uZQorIyBSZXR1cm5zICA6IE5vbmUKKyMgVXNhZ2UgICAgOiAkKGNhbGwgY2hlY2stdXNlci1MT0NBTF9NT0RVTEUsIEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hlY2stZGVmaW5lZC1MT0NBTF9NT0RVTEUgPSBcCisgICQoY2FsbCBjaGVjay11c2VyLWRlZmluZSxMT0NBTF9NT0RVTEUsJChMT0NBTF9NQUtFRklMRSksJCgxKSkgXAorICAkKGlmICQoY2FsbCBzZXEsJCh3b3JkcyAkKExPQ0FMX01PRFVMRSkpLDEpLCxcCisgICAgJChjYWxsIC1idWlsZC1pbmZvLExPQ0FMX01PRFVMRSBkZWZpbml0aW9uIGluICQoTE9DQUxfTUFLRUZJTEUpIG11c3Qgbm90IGNvbnRhaW4gc3BhY2UpXAorICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsUGxlYXNlIGNvcnJlY3QgZXJyb3IuIEFib3J0aW5nKVwKKyAgKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgaXMgdXNlZCB0byBjaGVjayB0aGF0IExPQ0FMX01PRFVMRV9GSUxFTkFNRSwgaWYgZGVmaW5lZCwgaXMgY29ycmVjdC4KKyMKKyMgRnVuY3Rpb24gOiBjaGVjay11c2VyLUxPQ0FMX01PRFVMRV9GSUxFTkFNRQorIyBSZXR1cm5zICA6IE5vbmUKKyMgVXNhZ2UgICAgOiAkKGNhbGwgY2hlY2stdXNlci1MT0NBTF9NT0RVTEVfRklMRU5BTUUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjaGVjay1MT0NBTF9NT0RVTEVfRklMRU5BTUUgPSBcCisgICQoaWYgJChzdHJpcCAkKExPQ0FMX01PRFVMRV9GSUxFTkFNRSkpLFwKKyAgICAkKGlmICQoY2FsbCBzZXEsJCh3b3JkcyAkKExPQ0FMX01PRFVMRV9GSUxFTkFNRSkpLDEpLCxcCisgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbywkKExPQ0FMX01BS0VGSUxFKTokKExPQ0FMX01PRFVMRSk6IExPQ0FMX01PRFVMRV9GSUxFTkFNRSBtdXN0IG5vdCBjb250YWluIHNwYWNlcylcCisgICAgICAgICQoY2FsbCAtYnVpbGQtZXJyb3IsUGxhc2UgY29ycmVjdCBlcnJvci4gQWJvcnRpbmcpXAorICAgIClcCisgICAgJChpZiAkKGZpbHRlciAlJChUQVJHRVRfTElCX0VYVEVOU0lPTikgJSQoVEFSR0VUX1NPTkFNRV9FWFRFTlNJT04pLCQoTE9DQUxfTU9EVUxFX0ZJTEVOQU1FKSksXAorICAgICAgICAkKGNhbGwgLWJ1aWxkLWluZm8sJChMT0NBTF9NQUtFRklMRSk6JChMT0NBTF9NT0RVTEUpOiBMT0NBTF9NT0RVTEVfRklMRU5BTUUgc2hvdWxkIG5vdCBpbmNsdWRlIGZpbGUgZXh0ZW5zaW9ucylcCisgICAgKVwKKyAgKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uICA6IGhhbmRsZS1tb2R1bGUtZmlsZW5hbWUKKyMgQXJndW1lbnRzIDogMTogZGVmYXVsdCBmaWxlIHByZWZpeAorIyAgICAgICAgICAgICAyOiBmaWxlIHN1ZmZpeAorIyBSZXR1cm5zICAgOiBOb25lCisjIFVzYWdlICAgICA6ICQoY2FsbCBoYW5kbGUtbW9kdWxlLWZpbGVuYW1lLDxwcmVmaXg+LDxzdWZmaXg+KQorIyBSYXRpb25hbGUgOiBUbyBiZSB1c2VkIHRvIGNoZWNrIGFuZCBvciBzZXQgdGhlIG1vZHVsZSdzIGZpbGVuYW1lIHRocm91Z2gKKyMgICAgICAgICAgICAgdGhlIExPQ0FMX01PRFVMRV9GSUxFTkFNRSB2YXJpYWJsZS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hhbmRsZS1tb2R1bGUtZmlsZW5hbWUgPSAkKGV2YWwgJChjYWxsIGV2LWhhbmRsZS1tb2R1bGUtZmlsZW5hbWUsJDEsJDIpKQorCisjCisjIENoZWNrIHRoYXQgTE9DQUxfTU9EVUxFX0ZJTEVOQU1FIGlzIHByb3Blcmx5IGRlZmluZWQKKyMgLSB3aXRoIG9uZSBzaW5nbGUgaXRlbQorIyAtIHdpdGhvdXQgYSBsaWJyYXJ5IGZpbGUgZXh0ZW5zaW9uCisjIC0gd2l0aCBubyBkaXJlY3Rvcnkgc2VwYXJhdG9ycworIworZGVmaW5lIGV2LWNoZWNrLW1vZHVsZS1maWxlbmFtZQoraWZuZXEgKDEsJCQod29yZHMgJCQoTE9DQUxfTU9EVUxFX0ZJTEVOQU1FKSkpCisgICAgJCQoY2FsbCAtYnVpbGQtaW5mbywkJChMT0NBTF9NQUtFRklMRSk6JCQoTE9DQUxfTU9EVUxFKTogTE9DQUxfTU9EVUxFX0ZJTEVOQU1FIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwYWNlKQorICAgICQkKGNhbGwgLWJ1aWxkLWVycm9yLEFib3J0aW5nKQorZW5kaWYKK2lmbmVxICgsJCQoZmlsdGVyICUkJChUQVJHRVRfTElCX0VYVEVOU0lPTikgJSQkKFRBUkdFVF9TT05BTUVfRVhURU5TSU9OKSwkJChMT0NBTF9NT0RVTEVfRklMRU5BTUUpKSkKKyAgICAkJChjYWxsIC1idWlsZC1pbmZvLCQkKExPQ0FMX01BS0VGSUxFKTokJChMT0NBTF9NT0RVTEUpOiBMT0NBTF9NT0RVTEVfRklMRU5BTUUgbXVzdCBub3QgY29udGFpbiBhIGZpbGUgZXh0ZW5zaW9uKQorICAgICQkKGNhbGwgLWJ1aWxkLWVycm9yLEFib3J0aW5nKQorZW5kaWYKK2lmbmVxICgxLCQkKHdvcmRzICQkKHN1YnN0IC8sICwkJChMT0NBTF9NT0RVTEVfRklMRU5BTUUpKSkpCisgICAgJCQoY2FsbCAtYnVpbGQtaW5mbywkJChMT0NBTF9NQUtFRklMRSk6JCQoTE9DQUxfTU9EVUxFKTogTE9DQUxfTU9EVUxFX0ZJTEVOQU1FIG11c3Qgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMpCisgICAgJCQoY2FsbCAtYnVpbGQtZXJyb3IsQWJvcnRpbmcpCitlbmRpZgorZW5kZWYKKworIworIyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBMT0NBTF9NT0RVTEVfRklMRU5BTUUuIElmIG5vbmUgZXhpc3RzLAorIyBpbmZlciBpdCBmcm9tIHRoZSBMT0NBTF9NT0RVTEUgbmFtZS4KKyMKKyMgJDE6IGRlZmF1bHQgZmlsZSBwcmVmaXgKKyMgJDI6IGRlZmF1bHQgZmlsZSBzdWZmaXgKKyMKK2RlZmluZSBldi1oYW5kbGUtbW9kdWxlLWZpbGVuYW1lCitMT0NBTF9NT0RVTEVfRklMRU5BTUUgOj0gJCQoc3RyaXAgJCQoTE9DQUxfTU9EVUxFX0ZJTEVOQU1FKSkKK2lmbmRlZiBMT0NBTF9NT0RVTEVfRklMRU5BTUUKKyAgICBMT0NBTF9NT0RVTEVfRklMRU5BTUUgOj0gJDEkJChMT0NBTF9NT0RVTEUpCitlbmRpZgorJCQoZXZhbCAkJChjYWxsIGV2LWNoZWNrLW1vZHVsZS1maWxlbmFtZSkpCitMT0NBTF9NT0RVTEVfRklMRU5BTUUgOj0gJCQoTE9DQUxfTU9EVUxFX0ZJTEVOQU1FKSQyCitlbmRlZgorCitoYW5kbGUtcHJlYnVpbHQtbW9kdWxlLWZpbGVuYW1lID0gJChldmFsICQoY2FsbCBldi1oYW5kbGUtcHJlYnVpbHQtbW9kdWxlLWZpbGVuYW1lLCQxKSkKKworIworIyBDaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBMT0NBTF9NT0RVTEVfRklMRU5BTUUgZm9yIGEgX3ByZWJ1aWx0XyBtb2R1bGUuCisjIElmIG5vbmUgZXhpc3RzLCBpbmZlciBpdCBmcm9tICQoTE9DQUxfU1JDX0ZJTEVTKQorIworIyAkMTogZGVmYXVsdCBmaWxlIHN1ZmZpeAorIworZGVmaW5lIGV2LWhhbmRsZS1wcmVidWlsdC1tb2R1bGUtZmlsZW5hbWUKK0xPQ0FMX01PRFVMRV9GSUxFTkFNRSA6PSAkJChzdHJpcCAkJChMT0NBTF9NT0RVTEVfRklMRU5BTUUpKQoraWZuZGVmIExPQ0FMX01PRFVMRV9GSUxFTkFNRQorICAgIExPQ0FMX01PRFVMRV9GSUxFTkFNRSA6PSAkJChub3RkaXIgJChMT0NBTF9TUkNfRklMRVMpKQorICAgIExPQ0FMX01PRFVMRV9GSUxFTkFNRSA6PSAkJChMT0NBTF9NT0RVTEVfRklMRU5BTUU6JSQkKFRBUkdFVF9MSUJfRVhURU5TSU9OKT0lKQorICAgIExPQ0FMX01PRFVMRV9GSUxFTkFNRSA6PSAkJChMT0NBTF9NT0RVTEVfRklMRU5BTUU6JSQkKFRBUkdFVF9TT05BTUVfRVhURU5TSU9OKT0lKQorZW5kaWYKK0xPQ0FMX01PRFVMRV9GSUxFTkFNRSA6PSAkJChMT0NBTF9NT0RVTEVfRklMRU5BTUUpJDEKKyQkKGV2YWwgJCQoY2FsbCBldi1jaGVjay1tb2R1bGUtZmlsZW5hbWUpKQorZW5kZWYKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uICA6IGhhbmRsZS1tb2R1bGUtYnVpbHQKKyMgUmV0dXJucyAgIDogTm9uZQorIyBVc2FnZSAgICAgOiAkKGNhbGwgaGFuZGxlLW1vZHVsZS1idWlsdCkKKyMgUmF0aW9uYWxlIDogVG8gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0ZWQKKyMgICAgICAgICAgICAgYmluYXJ5IGZpbGUsIGFuZCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRvIHBsYWNlIGl0cyBvYmplY3QgZmlsZXMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYW5kbGUtbW9kdWxlLWJ1aWx0ID0gXAorICAgICQoZXZhbCBMT0NBTF9CVUlMVF9NT0RVTEUgOj0gJChUQVJHRVRfT1VUKS8kKExPQ0FMX01PRFVMRV9GSUxFTkFNRSkpXAorICAgICQoZXZhbCBMT0NBTF9PQkpTX0RJUiAgICAgOj0gJChUQVJHRVRfT0JKUykvJChMT0NBTF9NT0RVTEUpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXB1dGUgdGhlIHJlYWwgcGF0aCBvZiBhIHByZWJ1aWx0IGZpbGUuCisjCisjIEZ1bmN0aW9uIDogbG9jYWwtcHJlYnVpbHQtcGF0aAorIyBBcmd1bWVudHM6IDE6IHByZWJ1aWx0IHBhdGggKGFzIGxpc3RlZCBpbiAkKExPQ0FMX1NSQ19GSUxFUykpCisjIFJldHVybnMgIDogZnVsbCBwYXRoLiBJZiAkMSBiZWdpbnMgd2l0aCBhIC8sIHRoZSBwYXRoIGlzIGNvbnNpZGVyZWQKKyMgICAgICAgICAgICBhYnNvbHV0ZSBhbmQgcmV0dXJuZWQgYXMtaXMuIE90aGVyd2lzZSwgJChMT0NBTF9QQVRIKS8kMSBpcworIyAgICAgICAgICAgIHJldHVybmVkIGluc3RlYWQuCisjIFVzYWdlICAgIDogJChjYWxsIGxvY2FsLXByZWJ1aWx0LXBhdGgsJChMT0NBTF9TUkNfRklMRVMpKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9jYWwtcHJlYnVpbHQtcGF0aCA9ICQoY2FsbCBsb2NhbC1zb3VyY2UtZmlsZS1wYXRoLCQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoaXMgaXMgdXNlZCB0byBzdHJpcCBhbnkgbGliIHByZWZpeCBmcm9tIExPQ0FMX01PRFVMRSwgdGhlbiBjaGVjayB0aGF0CisjIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBuYW1lIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQuCisjCisjIEZ1bmN0aW9uIDogY2hlY2stdXNlci1MT0NBTF9NT0RVTEUKKyMgQXJndW1lbnRzOiAxOiBwYXRoIG9mIEFuZHJvaWQubWsgd2hlcmUgdGhpcyBMT0NBTF9NT0RVTEUgaXMgZGVmaW5lZAorIyBSZXR1cm5zICA6IE5vbmUKKyMgVXNhZ2UgICAgOiAkKGNhbGwgY2hlY2stTE9DQUxfTU9EVUxFLCQoTE9DQUxfTUFLRUZJTEUpKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hlY2stTE9DQUxfTU9EVUxFID0gXAorICAkKGV2YWwgTE9DQUxfTU9EVUxFIDo9ICQkKGNhbGwgc3RyaXAtbGliLXByZWZpeCwkJChMT0NBTF9NT0RVTEUpKSkKKworIworIyAgTW9kdWxlIGltcG9ydHMKKyMKKworIyBMaXN0IG9mIG1vZHVsZSBpbXBvcnQgZGlyZWN0b3JpZXMuCitfX2J1aWxkX2ltcG9ydF9kaXJzIDo9CisKKyMgQWRkIGFuIG9wdGlvbmFsIHNpbmdsZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgaW1wb3J0IHBhdGhzCisjCitpbXBvcnQtYWRkLXBhdGgtb3B0aW9uYWwgPSBcCisgICQoaWYgJChzdHJpcCAkKHdpbGRjYXJkICQxKSksXAorICAgICQoY2FsbCAtYnVpbGQtbG9nLEFkZGluZyBpbXBvcnQgZGlyZWN0b3J5OiAkMSlcCisgICAgJChldmFsIF9fYnVpbGRfaW1wb3J0X2RpcnMgKz0gJDEpXAorICApXAorCisjIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBpbXBvcnQgcGF0aHMKKyMgVGhpcyB3aWxsIHdhcm4gaWYgdGhlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorIworaW1wb3J0LWFkZC1wYXRoID0gXAorICAkKGlmICQoc3RyaXAgJCh3aWxkY2FyZCAkMSkpLFwKKyAgICAkKGNhbGwgLWJ1aWxkLWxvZyxBZGRpbmcgaW1wb3J0IGRpcmVjdG9yeTogJDEpXAorICAgICQoZXZhbCBfX2J1aWxkX2ltcG9ydF9kaXJzICs9ICQxKVwKKyAgLFwKKyAgICAkKGNhbGwgLWJ1aWxkLWluZm8sV0FSTklORzogSWdub3JpbmcgdW5rbm93biBpbXBvcnQgZGlyZWN0b3J5OiAkMSlcCisgIClcCisKK2ltcG9ydC1maW5kLW1vZHVsZSA9ICQoc3RyaXAgXAorICAgICAgJChldmFsIF9faW1wb3J0ZWRfbW9kdWxlIDo9KVwKKyAgICAgICQoZm9yZWFjaCBfX2ltcG9ydF9kaXIsJChfX2J1aWxkX2ltcG9ydF9kaXJzKSxcCisgICAgICAgICQoaWYgJChfX2ltcG9ydGVkX21vZHVsZSksLFwKKyAgICAgICAgICAkKGNhbGwgLWJ1aWxkLWxvZywgIFByb2JpbmcgJChfX2ltcG9ydF9kaXIpLyQxL0FuZHJvaWQubWspXAorICAgICAgICAgICQoaWYgJChzdHJpcCAkKHdpbGRjYXJkICQoX19pbXBvcnRfZGlyKS8kMS9BbmRyb2lkLm1rKSksXAorICAgICAgICAgICAgJChldmFsIF9faW1wb3J0ZWRfbW9kdWxlIDo9ICQoX19pbXBvcnRfZGlyKS8kMSlcCisgICAgICAgICAgKVwKKyAgICAgICAgKVwKKyAgICAgIClcCisgICAgICAkKF9faW1wb3J0ZWRfbW9kdWxlKVwKKyAgICApCisKK0JVSUxEX01PRFVMRV9QQVRIX1ZBUk5BTUUgOj0gJChzdHJpcCAkKEJVSUxEX01PRFVMRV9QQVRIX1ZBUk5BTUUpKQoraWZuZGVmIEJVSUxEX01PRFVMRV9QQVRIX1ZBUk5BTUUKKyAgICBCVUlMRF9NT0RVTEVfUEFUSF9WQVJOQU1FIDo9IEJVSUxEX01PRFVMRV9QQVRICitlbmRpZgorCitCVUlMRF9NT0RVTEVfUEFUSCA6PSAkKHN0cmlwICQoJChCVUlMRF9NT0RVTEVfUEFUSF9WQVJOQU1FKSkpCitpZmRlZiBCVUlMRF9NT0RVTEVfUEFUSAorICBpZm5lcSAoJCh3b3JkcyAkKEJVSUxEX01PRFVMRV9QQVRIKSksMSkKKyAgICAkKGNhbGwgLWJ1aWxkLWluZm8sRVJST1I6IFlvdSAkKEJVSUxEX01PRFVMRV9QQVRIX1ZBUk5BTUUpIHZhcmlhYmxlIGNvbnRhaW5zIHNwYWNlcykKKyAgICAkKGNhbGwgLWJ1aWxkLWluZm8sUGxlYXNlIGZpeCB0aGUgZXJyb3IgYW5kIHN0YXJ0IGFnYWluLikKKyAgICAkKGNhbGwgLWJ1aWxkLWVycm9yLEFib3J0aW5nKQorICBlbmRpZgorZW5kaWYKKworbW9kdWxlcy1yZXNldC1pbXBvcnRzID0gXAorICAkKGV2YWwgX19idWlsZF9pbXBvcnRfZGlycyA6PSlcCisgICQoZm9yZWFjaCBfX2ltcG9ydF9wYXRoLCQoc3Vic3QgJChCVUlMRF9IT1NUX0RJUlNFUCksJChzcGFjZSksJChCVUlMRF9NT0RVTEVfUEFUSCkpLFwKKyAgICAkKGNhbGwgaW1wb3J0LWFkZC1wYXRoLCQoX19pbXBvcnRfcGF0aCkpXAorICAgKQorCisjIGRlc2NyaWJlZCBpbiBkb2NzL0lNUE9SVC1NT0RVTEUuVFhUCisjICQxOiB0YWcgbmFtZSBmb3IgdGhlIGxvb2t1cAorIworIyBTbWFsbCB0ZWNobmljYWwgbm90ZSBvbiBfX2J1aWxkX2ltcG9ydF9kZXB0aDogd2UgdXNlIHRoaXMgdmFyaWFibGUgdG8KKyMgcmVjb3JkIHRoZSBkZXB0aCBvZiByZWN1cnNpdmUgaW1wb3J0LW1vZHVsZSBjYWxscy4gVGhlIHZhcmlhYmxlIGlzCisjIGluaXRpYWxseSBlbXB0eSwgYW5kIHdlIGFwcGVuZCBhICJ4IiB0byBpdCBlYWNoIHRpbWUgaW1wb3J0LW1vZHVsZSBpcworIyBjYWxsZWQuIEkuZS4gZm9yIHRocmVlIHJlY3Vyc2l2ZSBjYWxscyB0byBpbXBvcnQtbW9kdWxlLCB3ZSB3b3VsZCBnZXQKKyMgdGhlIHZhbHVlczoKKyMKKyMgICBmaXJzdCBjYWxsOiAgIHgKKyMgICBzZWNvbmQgY2FsbDogIHh4CisjICAgdGhpcmQgY2FsbDogICB4eHgKKyMKKyMgVGhpcyBpcyB1c2VkIGluIG1vZHVsZS1hZGQgdG8gYWRkIHRoZSB0b3AtbGV2ZWwgbW9kdWxlcyAoaS5lLiB0aG9zZQorIyB0aGF0IGFyZSBub3QgYWRkZWQgd2l0aCBpbXBvcnQtbW9kdWxlKSB0byBfX2J1aWxkX3RvcF9tb2R1bGVzLCBjb3JyZXNwb25kaW5nCisjIHRvIHRoZSBkZWZhdWx0IGxpc3Qgb2Ygd2FudGVkIG1vZHVsZXMgKHNlZSBzZXR1cC10b29sY2hhaW4ubWspLgorIworaW1wb3J0LW1vZHVsZSA9IFwKKyAgICAkKGV2YWwgX19pbXBvcnRfdGFnIDo9ICQoc3RyaXAgJDEpKVwKKyAgICAkKGlmICQoY2FsbCBzZXEsJCh3b3JkcyAkKF9faW1wb3J0X3RhZykpLDEpLCxcCisgICAgICAkKGNhbGwgLWJ1aWxkLWluZm8sJChMT0NBTF9NQUtFRklMRSk6IENhbm5vdCBpbXBvcnQgbW9kdWxlIHdpdGggc3BhY2VzIGluIHRhZzogJyQoX19pbXBvcnRfdGFnKScpXAorICAgIClcCisgICAgJChpZiAkKGNhbGwgc2V0X2lzX21lbWJlciwkKF9fYnVpbGRfaW1wb3J0X2xpc3QpLCQoX19pbXBvcnRfdGFnKSksXAorICAgICAgJChjYWxsIC1idWlsZC1sb2csU2tpcHBpbmcgZHVwbGljYXRlIGltcG9ydCBmb3IgbW9kdWxlIHdpdGggdGFnICckKF9faW1wb3J0X3RhZyknKVwKKyAgICAsXAorICAgICAgJChjYWxsIC1idWlsZC1sb2csTG9va2luZyBmb3IgaW1wb3J0ZWQgbW9kdWxlIHdpdGggdGFnICckKF9faW1wb3J0X3RhZyknKVwKKyAgICAgICQoZXZhbCBfX2ltcG9ydGVkX3BhdGggOj0gJChjYWxsIGltcG9ydC1maW5kLW1vZHVsZSwkKF9faW1wb3J0X3RhZykpKVwKKyAgICAgICQoaWYgJChfX2ltcG9ydGVkX3BhdGgpLFwKKyAgICAgICAgJChjYWxsIC1idWlsZC1sb2csICAgIEZvdW5kIGluICQoX19pbXBvcnRlZF9wYXRoKSlcCisgICAgICAgICQoZXZhbCBfX2J1aWxkX2ltcG9ydF9kZXB0aCA6PSAkKF9fYnVpbGRfaW1wb3J0X2RlcHRoKXgpIFwKKyAgICAgICAgJChldmFsIF9fYnVpbGRfaW1wb3J0X2xpc3QgOj0gJChjYWxsIHNldF9pbnNlcnQsJChfX2J1aWxkX2ltcG9ydF9saXN0KSwkKF9faW1wb3J0X3RhZykpKVwKKyAgICAgICAgJChldmFsIGluY2x1ZGUgJChfX2ltcG9ydGVkX3BhdGgpL0FuZHJvaWQubWspXAorICAgICAgICAkKGV2YWwgX19idWlsZF9pbXBvcnRfZGVwdGggOj0gJChfX2J1aWxkX2ltcG9ydF9kZXB0aDoleD0lKSlcCisgICAgICAsXAorICAgICAgICAkKGNhbGwgLWJ1aWxkLWluZm8sJChMT0NBTF9NQUtFRklMRSk6IENhbm5vdCBmaW5kIG1vZHVsZSB3aXRoIHRhZyAnJChfX2ltcG9ydF90YWcpJyBpbiBpbXBvcnQgcGF0aClcCisgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbyxBcmUgeW91IHN1cmUgeW91ciAkKEJVSUxEX01PRFVMRV9QQVRIX1ZBUk5BTUUpIHZhcmlhYmxlIGlzIHByb3Blcmx5IGRlZmluZWQgPylcCisgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbyxUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIHdlcmUgc2VhcmNoZWQ6KVwKKyAgICAgICAgJChmb3IgX19pbXBvcnRfZGlyLCQoX19idWlsZF9pbXBvcnRfZGlycyksXAorICAgICAgICAgICQoY2FsbCAtYnVpbGQtaW5mbywgICAgJChfX2ltcG9ydF9kaXIpKVwKKyAgICAgICAgKVwKKyAgICAgICAgJChjYWxsIC1idWlsZC1lcnJvcixBYm9ydGluZy4pXAorICAgICAgKVwKKyAgICkKKworIyBPbmx5IHVzZWQgZm9yIGRlYnVnZ2luZworIworaW1wb3J0LWRlYnVnID0gXAorICAgICQoaW5mbyBJTVBPUlQgRElSRUNUT1JJRVM6KVwKKyAgICAkKGZvcmVhY2ggX19kaXIsJChfX2J1aWxkX2ltcG9ydF9kaXJzKSxcCisgICAgICAkKGluZm8gLS0gJChfX2RpcikpXAorICAgIClcCisKKyMKKyMgIE1vZHVsZSBjbGFzc2VzCisjCitfYnVpbGRfbW9kdWxlX2NsYXNzZXMgOj0KKworIyBSZWdpc3RlciBhIG5ldyBtb2R1bGUgY2xhc3MKKyMgJDE6IGNsYXNzIG5hbWUgKGUuZy4gU1RBVElDX0xJQlJBUlkpCisjICQyOiBvcHRpb25hbCBmaWxlIHByZWZpeCAoZS5nLiAnbGliJykKKyMgJDM6IG9wdGlvbmFsIGZpbGUgc3VmZml4IChlLmcuICcuc28nKQorIworbW9kdWxlLWNsYXNzLXJlZ2lzdGVyID0gXAorICAgICQoZXZhbCBfYnVpbGRfbW9kdWxlX2NsYXNzZXMgKz0gJDEpIFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZHVsZV9jbGFzcy4kMS5GSUxFX1BSRUZJWCA6PSAkMikgXAorICAgICQoZXZhbCBfYnVpbGRfbW9kdWxlX2NsYXNzLiQxLkZJTEVfU1VGRklYIDo9ICQzKSBcCisgICAgJChldmFsIF9idWlsZF9tb2R1bGVfY2xhc3MuJDEuSU5TVEFMTEFCTEUgOj0gJChmYWxzZSkpIFwKKworIyBTYW1lIGEgbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLCBmb3IgaW5zdGFsbGFibGUgbW9kdWxlcworIworIyBBbiBpbnN0YWxsYWJsZSBtb2R1bGUgaXMgb25lIHRoYXQgd2lsbCBiZSBjb3BpZWQgdG8gJFBST0pFQ1QvbGlicy88YWJpPi8KKyMgZHVyaW5nIHRoZSBidWlsZC4KKyMKKyMgJDE6IGNsYXNzIG5hbWUKKyMgJDI6IG9wdGlvbmFsIGZpbGUgcHJlZml4CisjICQzOiBvcHRpb25hbCBmaWxlIHN1ZmZpeAorIworbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLWluc3RhbGxhYmxlID0gXAorICAgICQoY2FsbCBtb2R1bGUtY2xhc3MtcmVnaXN0ZXIsJDEsJDIsJDMpIFwKKyAgICAkKGV2YWwgX2J1aWxkX21vZHVsZV9jbGFzcy4kMS5JTlNUQUxMQUJMRSA6PSAkKHRydWUpKQorCisjIFJldHVybnMgJCh0cnVlKSBpZiAkMSBpcyBhIHZhbGlkL3JlZ2lzdGVyZWQgTE9DQUxfTU9EVUxFX0NMQVNTIHZhbHVlCisjCittb2R1bGUtY2xhc3MtY2hlY2sgPSAkKGNhbGwgc2V0X2lzX21lbWJlciwkKF9idWlsZF9tb2R1bGVfY2xhc3NlcyksJDEpCisKKyMgUmV0dXJucyAkKHRydWUpIGlmICQxIGNvcnJlc3BvbmRzIHRvIGFuIGluc3RhbGxhYmxlIG1vZHVsZSBjbGFzcworIworbW9kdWxlLWNsYXNzLWlzLWluc3RhbGxhYmxlID0gJChpZiAkKF9idWlsZF9tb2R1bGVfY2xhc3MuJDEuSU5TVEFMTEFCTEUpLCQodHJ1ZSksJChmYWxzZSkpCisKKyMKKyMgUmVnaXN0ZXIgdmFsaWQgbW9kdWxlIGNsYXNzZXMKKyMKKworIyBzdGF0aWMgbGlicmFyaWVzOgorIyA8Zm9vPiAtPiBsaWI8Zm9vPi5hIGJ5IGRlZmF1bHQKKyQoY2FsbCBtb2R1bGUtY2xhc3MtcmVnaXN0ZXIsU1RBVElDX0xJQlJBUlksbGliLCQoVEFSR0VUX0xJQl9FWFRFTlNJT04pKQorCisjIHNoYXJlZCBsaWJyYXJpZXM6CisjIDxmb28+IC0+IGxpYjxmb28+LnNvCisjIGEgc2hhcmVkIGxpYnJhcnkgaXMgaW5zdGFsbGFibGUuCiskKGNhbGwgbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLWluc3RhbGxhYmxlLFNIQVJFRF9MSUJSQVJZLGxpYiwkKFRBUkdFVF9TT05BTUVfRVhURU5TSU9OKSkKKworIyBleGVjdXRhYmxlCisjIDxmb28+IC0+IDxmb28+CisjIGFuIGV4ZWN1dGFibGUgaXMgaW5zdGFsbGFibGUuCiskKGNhbGwgbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLWluc3RhbGxhYmxlLEVYRUNVVEFCTEUsLCkKKworIyBwcmVidWlsdCBzaGFyZWQgbGlicmFyeQorIyA8Zm9vPiAtPiA8Zm9vPiAgKHdlIGFzc3VtZSBpdCBpcyBhbHJlYWR5IHdlbGwtbmFtZWQpCisjIGl0IGlzIGluc3RhbGxhYmxlCiskKGNhbGwgbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLWluc3RhbGxhYmxlLFBSRUJVSUxUX1NIQVJFRF9MSUJSQVJZLCwpCisKKyMgcHJlYnVpbHQgc3RhdGljIGxpYnJhcnkKKyMgPGZvbz4gLT4gPGZvbz4gKHdlIGFzc3VtZSBpdCBpcyBhbHJlYWR5IHdlbGwtbmFtZWQpCiskKGNhbGwgbW9kdWxlLWNsYXNzLXJlZ2lzdGVyLFBSRUJVSUxUX1NUQVRJQ19MSUJSQVJZLCwpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtdGVzdHMubWsgYi9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtdGVzdHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy10ZXN0cy5tawpAQCAtMCwwICsxLDEwNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgRGVmaW5pdGlvbnMgZm9yIHRoZSBidWlsZCBzeXN0ZW0ncyBpbnRlcm5hbCB1bml0IHRlc3RzLgorIworCisjCisjIEEgZnVuY3Rpb24gd2hpY2ggbmFtZXMgYmVnaW4gd2l0aCAtdGVzdC0gKGUuZy4gLXRlc3QtZm9vKSBpcyBhc3N1bWVkCisjIHRvIGJlIGFuIGludGVybmFsIHVuaXQgdGVzdC4gSXQgd2lsbCBiZSBydW4gYXV0b21hdGljYWxseSBieSBuZGstYnVpbGQKKyMgaWYgQlVJTERfU1lTVEVNX1VOSVRfVEVTVFMgaXMgZGVmaW5lZCBpbiB5b3VyIGVudmlyb25tZW50IHRvIDEgb3IgMi4KKyMKKyMgRWFjaCB0ZXN0IHNob3VsZCBjYWxsIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0aGF0IHdpbGwKKyMgcmVnaXN0ZXIgYSBmYWlsdXJlOgorIworIyAgICQoY2FsbCB0ZXN0LWV4cGVjdCw8ZXhwZWN0ZWQtdmFsdWU+LDxhY3R1YWwtdmFsdWU+KQorIworIyAgICAgIFRoaXMgd2lsbCBjaGVjayB0aGF0IDxhY3R1YWwtdmFsdWU+IGlzIGVxdWFsIHRvIDxleHBlY3RlZC12YWx1ZT4uCisjICAgICAgSWYgbm90LCB0aGlzIHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBhbmQgaW5jcmVtZW50IHRoZSBmYWlsdXJlCisjICAgICAgY291bnRlci4KKyMKKyMgICAkKGNhbGwgdGVzdC1hc3NlcnQsPGV4cGVjdGVkLXZhbHVlPiw8YWN0dWFsLXZhbHVlPikKKyMKKyMgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gdGVzdC1leHBlY3QsIHRob3VnaCBpdCB3aWxsIGFib3J0IHRoZSBwcm9ncmFtCisjICAgICAgaW1tZWRpYXRlbHkgYWZ0ZXIgZGlzcGxheWluZyBhbiBlcnJvciBtZXNzYWdlLgorIworIyBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IGNoZWNrcyB0aGF0IHRoZSAnZmlsdGVyJyBmdW5jdGlvbiB3b3JrcyBjb3JyZWN0bHk6CisjCisjICAgLXRlc3QtZmlsdGVyID0gXAorIyAgICAgJChjYWxsIHRlc3QtZXhwZWN0LGJhciwkKGZpbHRlciBiYXIsZm9vIGJhcikpCisjCisjCisKKy1idWlsZC10ZXN0LXN0YXJ0ID0gXAorICAkKGV2YWwgX3Rlc3RfbmFtZSA6PSAkMSlcCisgICQoZXZhbCBfdGVzdF9saXN0ICs9ICQxKVwKKyAgJChldmFsIF90ZXN0X2ZhaWxlZCA6PSlcCisgICQoaW5mbyBbJDEgIFJVTl0pCisKKyMgRW5kIGN1cnJlbnQgdW5pdCB0ZXN0LgorIworLWJ1aWxkLXRlc3QtZW5kID0gXAorICAkKGlmICQoX3Rlc3RfZmFpbGVkKSxcCisgICAgJChpbmZvIFskKF90ZXN0X25hbWUpIEZBSUxdKSQoZXJyb3IgQWJvcnRpbmcpXAorICAgICQoZXZhbCBfdGVzdF9mYWlsdXJlcyArPSAkJChfdGVzdF9uYW1lKSlcCisgICxcCisgICAgJChpbmZvIFskKF90ZXN0X25hbWUpICAgT0tdKVwKKyAgKQorCisjIERlZmluZSBCVUlMRF9TWVNURU1fVU5JVF9URVNUUyB0byAyIHRvIGR1bXAgZWFjaCB0ZXN0LWV4cGVjdC9hc3NlcnQgY2hlY2suCisjCitpZmVxICgyLCQoQlVJTERfU1lTVEVNX1VOSVRfVEVTVFMpKQorLWJ1aWxkLXRlc3QtbG9nID0gJChpbmZvIC4gICQoX3Rlc3RfbmFtZSk6ICQxKQorZWxzZQorLWJ1aWxkLXRlc3QtbG9nID0gJChlbXB0eSkKK2VuZGlmCisKK3Rlc3QtZXhwZWN0ID0gXAorICAkKGNhbGwgLWJ1aWxkLXRlc3QtbG9nLGV4cGVjdCAnJDInID09ICckMScpXAorICAkKGlmICQoY2FsbCBzbmUsJDEsJDIpLFwKKyAgICAkKGluZm8gRVJST1IgPCQoX3Rlc3RfbmFtZSk+OiQzKVwKKyAgICAkKGluZm8gLiAgZXhwZWN0ZWQgdmFsdWU6JyQxJylcCisgICAgJChpbmZvIC4gIGFjdHVhbCB2YWx1ZTogICckMicpXAorICAgICQoZXZhbCBfdGVzdF9mYWlsZWQgOj0gdHJ1ZSlcCisgICkKKwordGVzdC1hc3NlcnQgPSBcCisgICQoY2FsbCAtYnVpbGQtdGVzdC1sb2csYXNzZXJ0ICckMicgPT0gJyQxJylcCisgICQoaWYgJChjYWxsIHNuZSwkMSwkMiksXAorICAgICQoaW5mbyBBU1NFUlQgPCQoX3Rlc3RfbmFtZSk+OiQzKVwKKyAgICAkKGluZm8gLiAgZXhwZWN0ZWQgdmFsdWU6JyQxJylcCisgICAgJChpbmZvIC4gIGFjdHVhbCB2YWx1ZTogICckMicpXAorICAgICQoZXZhbCBfdGVzdF9mYWlsZWQgOj0gdHJ1ZSlcCisgICAgJChlcnJvciBBYm9ydGluZy4pXAorICApCisKKyMgUnVuIGFsbCB0aGUgdGVzdHMsIGkuZS4gYWxsIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIHdpdGggYSAtdGVzdC0KKyMgcHJlZml4IHdpbGwgYmUgY2FsbGVkIG5vdyBpbiBzdWNjZXNzaW9uLgorLWJ1aWxkLXJ1bi1hbGwtdGVzdHMgPSBcCisgICQoaW5mbyA9PT09PT09PT09PT09PT09PSBTVEFSVElORyBCVUlMRCBTWVNURU0gVU5JVCBURVNUUyA9PT09PT09PT09PT09PT09PSlcCisgICQoZXZhbCBfdGVzdF9saXN0IDo9KVwKKyAgJChldmFsIF90ZXN0X2ZhaWx1cmVzIDo9KVwKKyAgJChmb3JlYWNoIF90ZXN0LCQoZmlsdGVyIC10ZXN0LSUsJCguVkFSSUFCTEVTKSksXAorICAgICQoY2FsbCAtYnVpbGQtdGVzdC1zdGFydCwkKF90ZXN0KSlcCisgICAgJChjYWxsICQoX3Rlc3QpKVwKKyAgICAkKGNhbGwgLWJ1aWxkLXRlc3QtZW5kKVwKKyAgKVwKKyAgJChldmFsIF90ZXN0X2NvdW50IDo9ICQkKHdvcmRzICQkKF90ZXN0X2xpc3QpKSlcCisgICQoZXZhbCBfdGVzdF9mYWlsX2NvdW50IDo9ICQkKHdvcmRzICQkKF90ZXN0X2ZhaWx1cmVzKSkpXAorICAkKGlmICQoX3Rlc3RfZmFpbHVyZXMpLFwKKyAgICAkKGluZm8gQEBAQEBAQEBAQEAgRkFJTEVEICQoX3Rlc3RfZmFpbF9jb3VudCkgb2YgJChfdGVzdF9jb3VudCkgQlVJTEQgU1lTVEVNIFVOSVQgVEVTVFMgQEBAQEBAQClcCisgICAgJChmb3JlYWNoIF90ZXN0X25hbWUsJChfdGVzdF9mYWlsdXJlcyksXAorICAgICAgJChpbmZvIC4gICQoX3Rlc3RfbmFtZSkpKVwKKyAgLFwKKyAgICAkKGluZm8gPT09PT09PT09PT09PT09PT09PSBQQVNTRUQgJChfdGVzdF9jb3VudCkgQlVJTEQgU1lTVEVNIFVOSVQgVEVTVFMgPT09PT09PT09PT09PT09PT0pXAorICApCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtdXRpbHMubWsgYi9hbmRyb2lkL2J1aWxkL2NvcmUvZGVmaW5pdGlvbnMtdXRpbHMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5OTkxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvY29yZS9kZWZpbml0aW9ucy11dGlscy5tawpAQCAtMCwwICsxLDM3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBDb21tb24gdXRpbGl0eSBmdW5jdGlvbnMuCisjCisjIE5PVEU6IEFsbCB0aGUgZnVuY3Rpb25zIGhlcmUgc2hvdWxkIGJlIHB1cmVseSBmdW5jdGlvbmFsLCBpLmUuIGF2b2lkCisjICAgICAgIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb3IgZGVwZW5kIG9uIHRoZSBmaWxlIHN5c3RlbSAvIGVudmlyb25tZW50CisjICAgICAgIHZhcmlhYmxlcy4gVGhpcyBtYWtlcyB0ZXN0aW5nIGVhc2llci4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWNybyAgICA6IGVtcHR5CisjIFJldHVybnMgIDogYW4gZW1wdHkgbWFjcm8KKyMgVXNhZ2UgICAgOiAkKGVtcHR5KQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZW1wdHkgOj0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWNybyAgICA6IHNwYWNlCisjIFJldHVybnMgIDogYSBzaW5nbGUgc3BhY2UKKyMgVXNhZ2UgICAgOiAkKHNwYWNlKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3BhY2UgIDo9ICQoZW1wdHkpICQoZW1wdHkpCisKK3NwYWNlNCA6PSAkKHNwYWNlKSQoc3BhY2UpJChzcGFjZSkkKHNwYWNlKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hY3JvICAgIDogY29tbWEKKyMgUmV0dXJucyAgOiBhIHNpbmdsZSBjb21tYQorIyBVc2FnZSAgICA6ICQoY29tbWEpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjb21tYSA6PSAsCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFjcm8gICAgOiBjb2xvbgorIyBSZXR1cm5zICA6IGEgc2luZ2xlIGNvbG9uCisjIFVzYWdlICAgIDogJChjb2xvbikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NvbG9uIDo9IDoKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbiA6IHJlbW92ZS1kdXBsaWNhdGVzCisjIEFyZ3VtZW50czogYSBsaXN0CisjIFJldHVybnMgIDogdGhlIGxpc3Qgd2l0aCBkdXBsaWNhdGUgaXRlbXMgcmVtb3ZlZCwgb3JkZXIgaXMgcHJlc2VydmVkLgorIyBVc2FnZSAgICA6ICQoY2FsbCByZW1vdmUtZHVwbGljYXRlcywgPExJU1Q+KQorIyBOb3RlICAgICA6IFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgJ3VuaXEnIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IEdNU0wsCisjICAgICAgICAgICAgaG93ZXZlciB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vbi1yZWN1cnNpdmUgYW5kICptdWNoKgorIyAgICAgICAgICAgIGZhc3Rlci4gSXQgd2lsbCBhbHNvIG5vdCBleHBsb2RlIHRoZSBzdGFjayB3aXRoIGEgbG90IG9mCisjICAgICAgICAgICAgaXRlbXMgbGlrZSAndW5pcScgZG9lcy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JlbW92ZS1kdXBsaWNhdGVzID0gJChzdHJpcCBcCisgICQoZXZhbCBfX3VuaXFfcmV0IDo9KSBcCisgICQoZm9yZWFjaCBfX3VuaXFfaXRlbSwkMSxcCisgICAgJChpZiAkKGZpbmRzdHJpbmcgJChfX3VuaXFfaXRlbSksJChfX3VuaXFfcmV0KSksLFwKKyAgICAgICQoZXZhbCBfX3VuaXFfcmV0ICs9ICQoX191bmlxX2l0ZW0pKVwKKyAgICApXAorICApXAorICAkKF9fdW5pcV9yZXQpKQorCistdGVzdC1yZW1vdmUtZHVwbGljYXRlcyA9IFwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgcmVtb3ZlLWR1cGxpY2F0ZXMpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbyBiYXIsJChjYWxsIHJlbW92ZS1kdXBsaWNhdGVzLGZvbyBiYXIpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbyBiYXIsJChjYWxsIHJlbW92ZS1kdXBsaWNhdGVzLGZvbyBiYXIgZm9vIGJhcikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vIGJhciwkKGNhbGwgcmVtb3ZlLWR1cGxpY2F0ZXMsZm9vIGZvbyBiYXIgYmFyIGJhcikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBjbGVhci12YXJzCisjIEFyZ3VtZW50czogMTogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcworIyAgICAgICAgICAgIDI6IGZpbGUgd2hlcmUgdGhlIHZhcmlhYmxlIHNob3VsZCBiZSBkZWZpbmVkCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBjbGVhci12YXJzLCBWQVIxIFZBUjIgVkFSMy4uLikKKyMgUmF0aW9uYWxlOiBDbGVhcnMvdW5kZWZpbmVzIGFsbCB2YXJpYWJsZXMgaW4gYXJndW1lbnQgbGlzdAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2xlYXItdmFycyA9ICQoZm9yZWFjaCBfX3Zhcm5hbWUsJDEsJChldmFsICQoX192YXJuYW1lKSA6PSAkKGVtcHR5KSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBmaWx0ZXItYnkKKyMgQXJndW1lbnRzOiAxOiBsaXN0CisjICAgICAgICAgICAgMjogcHJlZGljYXRlIGZ1bmN0aW9uLCB3aWxsIGJlIGNhbGxlZCBhcyAkKGNhbGwgJDIsPG5hbWU+KQorIyAgICAgICAgICAgICAgIGFuZCBpdCB0aGlzIHJldHVybnMgYSBub24tZW1wdHkgdmFsdWUsIHRoZW4gPG5hbWU+CisjICAgICAgICAgICAgICAgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmVzdWx0LgorIyBSZXR1cm5zICA6IGVsZW1lbnRzIG9mICQxIHRoYXQgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uICQyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaWx0ZXItYnkgPSAkKHN0cmlwIFwKKyAgJChmb3JlYWNoIF9fZmlsdGVyX2J5X24sJDEsXAorICAgICQoaWYgJChjYWxsICQyLCQoX19maWx0ZXJfYnlfbikpLCQoX19maWx0ZXJfYnlfbikpKSkKKworLXRlc3QtZmlsdGVyLWJ5ID0gXAorICAgICQoZXZhbCAtbG9jYWwtZnVuYyA9ICQkKGNhbGwgc2VxLGZvbywkJDEpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBmaWx0ZXItYnksLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgZmlsdGVyLWJ5LGZvbywtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIGZpbHRlci1ieSxmb28gYmFyLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbyBmb28sJChjYWxsIGZpbHRlci1ieSxhYWEgZm9vIGJhciBmb28sLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGV2YWwgLWxvY2FsLWZ1bmMgPSAkJChjYWxsIHNuZSxmb28sJCQxKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgZmlsdGVyLWJ5LCwtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGZpbHRlci1ieSxmb28sLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsYmFyLCQoY2FsbCBmaWx0ZXItYnksZm9vIGJhciwtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCxhYWEgYmFyLCQoY2FsbCBmaWx0ZXItYnksYWFhIGZvbyBiYXIsLWxvY2FsLWZ1bmMpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogZmlsdGVyLW91dC1ieQorIyBBcmd1bWVudHM6IDE6IGxpc3QKKyMgICAgICAgICAgICAyOiBwcmVkaWNhdGUgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkIGFzICQoY2FsbCAkMiw8bmFtZT4pCisjICAgICAgICAgICAgICAgYW5kIGl0IHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2YWx1ZSwgdGhlbiA8bmFtZT4KKyMgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByZXN1bHQuCisjIFJldHVybnMgIDogZWxlbWVudHMgb2YgJDEgdGhhdCBkbyBub3Qgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uICQyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaWx0ZXItb3V0LWJ5ID0gJChzdHJpcCBcCisgICQoZm9yZWFjaCBfX2ZpbHRlcl9vdXRfYnlfbiwkMSxcCisgICAgJChpZiAkKGNhbGwgJDIsJChfX2ZpbHRlcl9vdXRfYnlfbikpLCwkKF9fZmlsdGVyX291dF9ieV9uKSkpKQorCistdGVzdC1maWx0ZXItb3V0LWJ5ID0gXAorICAgICQoZXZhbCAtbG9jYWwtZnVuYyA9ICQkKGNhbGwgc2VxLGZvbywkJDEpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBmaWx0ZXItb3V0LWJ5LCwtbG9jYWwtZnVuYykpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGZpbHRlci1vdXQtYnksZm9vLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGJhciwkKGNhbGwgZmlsdGVyLW91dC1ieSxmb28gYmFyLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGFhYSBiYXIsJChjYWxsIGZpbHRlci1vdXQtYnksYWFhIGZvbyBiYXIgZm9vLC1sb2NhbC1mdW5jKSlcCisgICAgJChldmFsIC1sb2NhbC1mdW5jID0gJCQoY2FsbCBzbmUsZm9vLCQkMSkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGZpbHRlci1vdXQtYnksLC1sb2NhbC1mdW5jKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgZmlsdGVyLW91dC1ieSxmb28sLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vLCQoY2FsbCBmaWx0ZXItb3V0LWJ5LGZvbyBiYXIsLWxvY2FsLWZ1bmMpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vIGZvbywkKGNhbGwgZmlsdGVyLW91dC1ieSxhYWEgZm9vIGJhciBmb28sLWxvY2FsLWZ1bmMpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogZmluZC1maXJzdAorIyBBcmd1bWVudHM6IDE6IGxpc3QKKyMgICAgICAgICAgICAyOiBwcmVkaWNhdGUgZnVuY3Rpb24sIHdpbGwgYmUgY2FsbGVkIGFzICQoY2FsbCAkMiw8bmFtZT4pLgorIyBSZXR1cm5zICA6IHRoZSBmaXJzdCBpdGVtIG9mICQxIHRoYXQgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaW5kLWZpcnN0ID0gJChmaXJzdHdvcmQgJChjYWxsIGZpbHRlci1ieSwkMSwkMikpCisKKy10ZXN0LWZpbmQtZmlyc3QuZW1wdHkgPSBcCisgICAgJChldmFsIC1sb2NhbC1wcmVkID0gJCQoY2FsbCBzZXEsZm9vLCQkMSkpXAorICAgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGZpbmQtZmlyc3QsLC1sb2NhbC1wcmVkKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LCwkKGNhbGwgZmluZC1maXJzdCxiYXIsLWxvY2FsLXByZWQpKQorCistdGVzdC1maW5kLWZpcnN0LnNpbXBsZSA9IFwKKyAgICAkKGV2YWwgLWxvY2FsLXByZWQgPSAkJChjYWxsIHNlcSxmb28sJCQxKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgZmluZC1maXJzdCxmb28sLWxvY2FsLXByZWQpKVwKKyAgICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vLCQoY2FsbCBmaW5kLWZpcnN0LGFhYSBmb28gYmFyLC1sb2NhbC1wcmVkKSlcCisgICAgJChjYWxsIHRlc3QtZXhwZWN0LGZvbywkKGNhbGwgZmluZC1maXJzdCxhYWEgZm9vIGZvbyBiYXIsLWxvY2FsLXByZWQpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uIDogcGFyZW50LWRpcgorIyBBcmd1bWVudHM6IDE6IHBhdGgKKyMgUmV0dXJucyAgOiBQYXJlbnQgZGlyIG9yIHBhdGggb2YgJDEsIHdpdGggZmluYWwgc2VwYXJhdG9yIHJlbW92ZWQuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKEJVSUxEX0hPU1RfT1MpLHdpbmRvd3MpCisjIE9uIFdpbmRvd3MsIGRlZmluaW5nIHBhcmVudC1kaXIgaXMgYSBiaXQgbW9yZSB0cmlja3kgYmVjYXVzZSB0aGUKKyMgR05VIE1ha2UgJChkaXIgLi4uKSBmdW5jdGlvbiBkb2Vzbid0IHJldHVybiBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdAorIyByZWFjaGVzIHRoZSB0b3Agb2YgdGhlIGRpcmVjdG9yeSB0cmVlLCBhbmQgd2Ugd2FudCB0byBlbmZvcmNlIHRoaXMgdG8KKyMgYXZvaWQgaW5maW5pdGUgbG9vcHMuCisjCisjICAgJChkaXIgQzopICAgICAtPiBDOiAgICAgICAoZW1wdHkgZXhwZWN0ZWQpCisjICAgJChkaXIgQzovKSAgICAtPiBDOi8gICAgICAoZW1wdHkgZXhwZWN0ZWQpCisjICAgJChkaXIgQzpcKSAgICAtPiBDOlwgICAgICAoZW1wdHkgZXhwZWN0ZWQpCisjICAgJChkaXIgQzovZm9vKSAtPiBDOi8gICAgICAoY29ycmVjdCkKKyMgICAkKGRpciBDOlxmb28pIC0+IEM6XCAgICAgIChjb3JyZWN0KQorIworcGFyZW50LWRpciA9ICQocGF0c3Vic3QgJS8sJSwkKHN0cmlwIFwKKyAgICAkKGV2YWwgX19kaXJfbm9kZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChzdWJzdCBcLC8sJDEpKSlcCisgICAgJChldmFsIF9fZGlyX3BhcmVudCA6PSAkKGRpciAkKF9fZGlyX25vZGUpKSlcCisgICAgJChmaWx0ZXItb3V0ICQxLCQoX19kaXJfcGFyZW50KSlcCisgICAgKSkKK2Vsc2UKK3BhcmVudC1kaXIgPSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJCgxOiUvPSUpKSkKK2VuZGlmCisKKy10ZXN0LXBhcmVudC1kaXIgPSBcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIHBhcmVudC1kaXIpKVwKKyAgJChjYWxsIHRlc3QtZXhwZWN0LC4sJChjYWxsIHBhcmVudC1kaXIsZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIHBhcmVudC1kaXIsZm9vL2JhcikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vLCQoY2FsbCBwYXJlbnQtZGlyLGZvby9iYXIvKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTdHJpcCBhbnkgJ2xpYicgcHJlZml4IGluIGZyb250IG9mIGEgZ2l2ZW4gc3RyaW5nLgorIworIyBGdW5jdGlvbiA6IHN0cmlwLWxpYi1wcmVmaXgKKyMgQXJndW1lbnRzOiAxOiBtb2R1bGUgbmFtZQorIyBSZXR1cm5zICA6IG1vZHVsZSBuYW1lLCB3aXRob3V0IGFueSAnbGliJyBwcmVmaXggaWYgYW55CisjIFVzYWdlICAgIDogJChjYWxsIHN0cmlwLWxpYi1wcmVmaXgsJChMT0NBTF9NT0RVTEUpKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaXAtbGliLXByZWZpeCA9ICQoMTpsaWIlPSUpCisKKy10ZXN0LXN0cmlwLWxpYi1wcmVmaXggPSBcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIHN0cmlwLWxpYi1wcmVmaXgsKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIHN0cmlwLWxpYi1wcmVmaXgsZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28sJChjYWxsIHN0cmlwLWxpYi1wcmVmaXgsbGliZm9vKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxub2xpYmZvbywkKGNhbGwgc3RyaXAtbGliLXByZWZpeCxub2xpYmZvbykpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vbGliLCQoY2FsbCBzdHJpcC1saWItcHJlZml4LGZvb2xpYikpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsZm9vIGJhciwkKGNhbGwgc3RyaXAtbGliLXByZWZpeCxsaWJmb28gbGliYmFyKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBMZWZ0LWp1c3RpZnkgaW5wdXQgc3RyaW5nIHdpdGggc3BhY2VzIHRvIGZpbGwgYSB3aWR0aCBvZiAxNS4KKyMgRnVuY3Rpb246IGxlZnQtanVzdGlmeS1xdW90ZWQtMTUKKyMgQXJndW1lbnRzOiAxOiBJbnB1dCB0ZXh0CisjIFJldHVybnM6IEEgcXVvdGVkIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGNvbW1hbmQgc2NyaXB0cyB0byBwcmludAorIyAgICAgICAgICB0aGUgbGVmdC1qdXN0aWZpZWQgaW5wdXQgd2l0aCBob3N0LWVjaG8uCisjCisjIFVzYWdlOiAgLS0tLT5AJChjYWxsIGhvc3QtZWNobywgJChjYWxsIGxlZnQtanVzdGlmeS1xdW90ZWQtMTUsJChfVEVYVCkpOiBEbyBzdHVmZikKKyMgICAgICAgICBXaGVyZSAtLS0tPiBpcyBhIFRBQiBjaGFyYWN0ZXIuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitsZWZ0LWp1c3RpZnktcXVvdGVkLTE1ID0gJChjYWxsIC1sZWZ0LWp1c3RpZnksJDEseHh4eHh4eHh4eHh4eHh4KQorCistdGVzdC1sZWZ0LWp1c3RpZnktcXVvdGVkLTE1ID0gXAorICAkKGNhbGwgdGVzdC1leHBlY3QsIiAgICAgICAgICAgICAgICIsJChjYWxsIGxlZnQtanVzdGlmeS1xdW90ZWQtMTUsKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwiRm9vIEJhciAgICAgICAgIiwkKGNhbGwgbGVmdC1qdXN0aWZ5LXF1b3RlZC0xNSxGb28gQmFyKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwiVmVyeSBsb25nIHN0cmluZyBvdmVyIDE1IGNoYXJhY3RlcnMgd2lkZSIsJChzdHJpcCBcCisgICAgJChjYWxsIGxlZnQtanVzdGlmeS1xdW90ZWQtMTUsVmVyeSBsb25nIHN0cmluZyBvdmVyIDE1IGNoYXJhY3RlcnMgd2lkZSkpKQorCisjIFVzZWQgaW50ZXJuYWxseSB0byBjb21wdXRlIGEgcXVvdGVkIGxlZnQtanVzdGlmaWVkIHRleHQgc3RyaW5nLgorIyAkMTogSW5wdXQgc3RyaW5nLgorIyAkMjogQSBzZXJpZXMgb2YgY29udGlndW91cyB4J3MsIGl0cyBsZW5ndGggZGV0ZXJtaW5lcyB0aGUgZnVsbCB3aWR0aCB0byBqdXN0aWZ5IHRvLgorIyBSZXR1cm46IEEgcXVvdGVkIHN0cmluZyB3aXRoIHRoZSBpbnB1dCB0ZXh0IGxlZnQtanVzdGlmaWVkIGFwcHJvcHJpYXRlbHkuCistbGVmdC1qdXN0aWZ5ID0gJChzdHJpcCBcCisgICAgJChldmFsIF9fbGpfdGVtcCA6PSAkKHN1YnN0ICQoc3BhY2UpLHgsJDEpKVwKKyAgICAkKGZvcmVhY2ggX19sal9hLCQoX19nbXNsX2NoYXJhY3RlcnMpLCQoZXZhbCBfX2xqX3RlbXAgOj0gJCQoc3Vic3QgJCQoX19sal9hKSx4LCQoX19sal90ZW1wKSkpKVwKKyAgICAkKGV2YWwgX19sal9tYXJnaW4gOj0gJCQoY2FsbCAtanVzdGlmaWNhdGlvbi1tYXJnaW4sJChfX2xqX3RlbXApLCQyKSkpIiQxJChzdWJzdCB4LCQoc3BhY2UpLCQoX19sal9tYXJnaW4pKSIKKworLXRlc3QtbGVmdC1qdXN0aWZ5ID0gXAorICAkKGNhbGwgdGVzdC1leHBlY3QsIiIsJChjYWxsIC1sZWZ0LWp1c3RpZnksLCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsImZvbyIsJChjYWxsIC1sZWZ0LWp1c3RpZnksZm9vLHh4eCkpXAorICAkKGNhbGwgdGVzdC1leHBlY3QsImZvbyAiLCQoY2FsbCAtbGVmdC1qdXN0aWZ5LGZvbyx4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwiZm9vICAgIiwkKGNhbGwgLWxlZnQtanVzdGlmeSxmb28seHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwiZm9vICAgICAgICAgIiwkKGNhbGwgLWxlZnQtanVzdGlmeSxmb28seHh4eHh4eHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwidmVyeSBsb25nIHN0cmluZyIsJChjYWxsIC1sZWZ0LWp1c3RpZnksdmVyeSBsb25nIHN0cmluZyx4eHgpKVwKKworIyBVc2VkIGludGVybmFsbHkgdG8gY29tcHV0ZSBhIGp1c3RpZmljYXRpb24gbWFyZ2luLgorIyBFeHBlY3RzICQxIHRvIGJlIGRlZmluZWQgdG8gYSBzdHJpbmcgb2YgY29uc2VjdXRpdmUgeCdzIChlLmcuICd4eHh4JykKKyMgRXhwZWN0cyAkMiB0byBiZSBkZWZpbmVkIHRvIGEgbWF4aW11bSBzdHJpbmcgb2YgeCdzIChlLmcuICd4eHh4eHh4eHgnKQorIyBSZXR1cm5zIGEgc3RyaW5nIG9mIHgncyBzdWNoIGFzICQxICsgJChyZXN1bHQpIGlzIGVxdWFsIHRvICQyCisjIElmICQxIGlzIGxhcmdlciB0aGFuICQyLCByZXR1cm4gZW1wdHkgc3RyaW5nLi4KKy1qdXN0aWZpY2F0aW9uLW1hcmdpbiA9ICQoc3RyaXAgXAorICAgICQoaWYgJDIsXAorICAgICAgJChpZiAkMSxcCisgICAgICAgICQoY2FsbCAtanVzdGlmaWNhdGlvbi1tYXJnaW4taW5uZXIsJDEsJDIpLFwKKyAgICAgICAgJDJcCisgICAgICApLFwKKyAgICAkMSkpCisKKy1qdXN0aWZpY2F0aW9uLW1hcmdpbi1pbm5lciA9ICQoaWYgJChmaW5kc3RyaW5nICQyLCQxKSwseCQoY2FsbCAtanVzdGlmaWNhdGlvbi1tYXJnaW4taW5uZXIseCQxLCQyKSkKKworLXRlc3QtanVzdGlmaWNhdGlvbi1tYXJnaW4gPSBcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbiwsKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbix4eHgseHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4eHh4eHgsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbiwseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4eHh4eCwkKGNhbGwgLWp1c3RpZmljYXRpb24tbWFyZ2luLHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4eHh4LCQoY2FsbCAtanVzdGlmaWNhdGlvbi1tYXJnaW4seHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4eHgsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbix4eHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4eCwkKGNhbGwgLWp1c3RpZmljYXRpb24tbWFyZ2luLHh4eHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCx4LCQoY2FsbCAtanVzdGlmaWNhdGlvbi1tYXJnaW4seHh4eHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbix4eHh4eHgseHh4eHh4KSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIC1qdXN0aWZpY2F0aW9uLW1hcmdpbix4eHh4eHh4eHh4eCx4eHh4eHgpKVwKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWNybyAgICA6IGxhc3QtYnV0LW9uZQorIyBBcmd1bWVudHM6IDE6IGxpc3QKKyMgUmV0dXJucyAgOiBSZXR1cm4gdGhlIGxhc3QtYnV0LWZpcnN0IGl0ZW0gaW4gYSBsaXN0LgorIyBVc2FnZSAgICA6ICQoY2FsbCBsYXN0LWJ1dC1vbmUsPGxpc3Q+KQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGFzdC1idXQtb25lID0gJChzdHJpcCBcCisgICQoZXZhbCBfX2xib19sZW4gOj0gJCQod29yZHMgJDEpKVwKKyAgJChpZiAkKGZpbHRlci1vdXQgMCAxLCQoX19sYm9fbGVuKSksXAorICAgICQod29yZGxpc3QgJChfX2xib19sZW4pLCQoX19sYm9fbGVuKSx4eHggJDEpKSkKKworLXRlc3QtbGFzdC1idXQtb25lID0gXAorICAkKGNhbGwgdGVzdC1leHBlY3QsLCQoY2FsbCBsYXN0LWJ1dC1vbmUsKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCwsJChjYWxsIGxhc3QtYnV0LW9uZSxmb28xKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxmb28xLCQoY2FsbCBsYXN0LWJ1dC1vbmUsZm9vMSBiYXIyKSlcCisgICQoY2FsbCB0ZXN0LWV4cGVjdCxiYXIyLCQoY2FsbCBsYXN0LWJ1dC1vbmUsZm9vMSBiYXIyIHpvbzMpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hY3JvICAgIDogdGhpcy1tYWtlZmlsZQorIyBSZXR1cm5zICA6IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IE1ha2VmaWxlIGluIHRoZSBpbmNsdXNpb24gc3RhY2sKKyMgVXNhZ2UgICAgOiAkKHRoaXMtbWFrZWZpbGUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0aGlzLW1ha2VmaWxlID0gJChsYXN0d29yZCAkKE1BS0VGSUxFX0xJU1QpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hY3JvICAgIDogcGFyZW50LW1ha2VmaWxlCisjIFJldHVybnMgIDogdGhlIG5hbWUgb2YgdGhlIHBhcmVudCBNYWtlZmlsZSBpbiB0aGUgaW5jbHVzaW9uIGxpc3QuCisjIFVzYWdlICAgIDogJChwYXJlbnQtbWFrZWZpbGUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwYXJlbnQtbWFrZWZpbGUgPSAkKGNhbGwgbGFzdC1idXQtb25lLCQoTUFLRUZJTEVfTElTVCkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBhc3NlcnQtZGVmaW5lZAorIyBBcmd1bWVudHM6IDE6IGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMKKyMgUmV0dXJucyAgOiBOb25lCisjIFVzYWdlICAgIDogJChjYWxsIGFzc2VydC1kZWZpbmVkLCBWQVIxIFZBUjIgVkFSMy4uLikKKyMgUmF0aW9uYWxlOiBDaGVja3MgdGhhdCBhbGwgdmFyaWFibGVzIGxpc3RlZCBpbiAkMSBhcmUgZGVmaW5lZCwgb3IgYWJvcnQgdGhlCisjICAgICAgICAgICAgYnVpbGQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2Fzc2VydC1kZWZpbmVkID0gJChmb3JlYWNoIF9fdmFybmFtZSwkKHN0cmlwICQxKSxcCisgICQoaWYgJChzdHJpcCAkKCQoX192YXJuYW1lKSkpLCxcCisgICAgJChjYWxsIC1idWlsZC1lcnJvciwgQXNzZXJ0aW9uIGZhaWx1cmU6ICQoX192YXJuYW1lKSBpcyBub3QgZGVmaW5lZClcCisgIClcCispCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBjaGVjay1yZXF1aXJlZC12YXJzCisjIEFyZ3VtZW50czogMTogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcworIyAgICAgICAgICAgIDI6IGZpbGUgd2hlcmUgdGhlIHZhcmlhYmxlKHMpIHNob3VsZCBiZSBkZWZpbmVkCisjIFJldHVybnMgIDogTm9uZQorIyBVc2FnZSAgICA6ICQoY2FsbCBjaGVjay1yZXF1aXJlZC12YXJzLCBWQVIxIFZBUjIgVkFSMy4uLiwgPGZpbGU+KQorIyBSYXRpb25hbGU6IENoZWNrcyB0aGF0IGFsbCByZXF1aXJlZCB2YXJzIGxpc3RlZCBpbiAkMSB3ZXJlIGRlZmluZWQgYnkgJDIKKyMgICAgICAgICAgICBvciBhYm9ydCB0aGUgYnVpbGQgd2l0aCBhbiBlcnJvcgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorY2hlY2stcmVxdWlyZWQtdmFycyA9ICQoZm9yZWFjaCBfX3Zhcm5hbWUsJDEsXAorICAkKGlmICQoc3RyaXAgJCgkKF9fdmFybmFtZSkpKSwsXAorICAgICQoY2FsbCAtYnVpbGQtaW5mbywgUmVxdWlyZWQgdmFyaWFibGUgJChfX3Zhcm5hbWUpIGlzIG5vdCBkZWZpbmVkIGJ5ICQyKVwKKyAgICAkKGNhbGwgLWJ1aWxkLWVycm9yLEFib3J0aW5nKVwKKyAgKVwKKykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWNybyAgICA6IG15LWRpcgorIyBSZXR1cm5zICA6IHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgTWFrZWZpbGUKKyMgVXNhZ2UgICAgOiAkKG15LWRpcikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK215LWRpciA9ICQoY2FsbCBwYXJlbnQtZGlyLCQobGFzdHdvcmQgJChNQUtFRklMRV9MSVNUKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb24gOiBhbGwtbWFrZWZpbGVzLXVuZGVyCisjIEFyZ3VtZW50czogMTogZGlyZWN0b3J5IHBhdGgKKyMgUmV0dXJucyAgOiBhIGxpc3Qgb2YgYWxsIG1ha2VmaWxlcyBpbW1lZGlhdGVseSBiZWxvdyBzb21lIGRpcmVjdG9yeQorIyBVc2FnZSAgICA6ICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCA8c29tZSBwYXRoPikKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2FsbC1tYWtlZmlsZXMtdW5kZXIgPSAkKHdpbGRjYXJkICQxLyovQW5kcm9pZC5taykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWNybyAgICA6IGFsbC1zdWJkaXItbWFrZWZpbGVzCisjIFJldHVybnMgIDogbGlzdCBvZiBhbGwgbWFrZWZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBjdXJyZW50IE1ha2VmaWxlJ3MKKyMgICAgICAgICAgICBsb2NhdGlvbgorIyBVc2FnZSAgICA6ICQoYWxsLXN1YmRpci1tYWtlZmlsZXMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithbGwtc3ViZGlyLW1ha2VmaWxlcyA9ICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1hY3JvICAgIDogaGlkZQorIyBSZXR1cm5zICA6IG5vdGhpbmcKKyMgVXNhZ2UgICAgOiAkKGhpZGUpPG1ha2UgY29tbWFuZHM+CisjIFJhdGlvbmFsZTogVG8gYmUgdXNlZCBhcyBhIHByZWZpeCBmb3IgTWFrZSBidWlsZCBjb21tYW5kcyB0byBoaWRlIHRoZW0KKyMgICAgICAgICAgICBieSBkZWZhdWx0IGR1cmluZyB0aGUgYnVpbGQuIFRvIHNob3cgdGhlbSwgc2V0IFY9MSBpbiB5b3VyCisjICAgICAgICAgICAgZW52aXJvbm1lbnQgb3IgY29tbWFuZC1saW5lLgorIworIyAgICAgICAgICAgIEZvciBleGFtcGxlOgorIworIyAgICAgICAgICAgICAgICBmb28ubzogZm9vLmMKKyMgICAgICAgICAgICAgICAgLS0+fCQoaGlkZSkgPGJ1aWxkLWNvbW1hbmRzPgorIworIyAgICAgICAgICAgIFdoZXJlICctLT58JyBzdGFuZHMgZm9yIGEgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZmVxICgkKFYpLDEpCitoaWRlID0gJChlbXB0eSkKK2Vsc2UKK2hpZGUgPSBACitlbmRpZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2NvcmUvbWtkZXBzLnNoIGIvYW5kcm9pZC9idWlsZC9jb3JlL21rZGVwcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYmVjZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9jb3JlL21rZGVwcy5zaApAQCAtMCwwICsxLDUxIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjIFRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBkZXBlbmRlbmN5IGZpbGVzIGdlbmVyYXRlZCBieSBHQ0MKKyMgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCAuZCBmaWxlIHdpbGwgaGF2ZSBhIGxpbmUgbGlrZToKKyMKKyMgICAgc291cmNlLm86IC9mdWxsL3BhdGgvdG8vc291cmNlLmMgb3RoZXIuaCBoZWFkZXJzLmgKKyMgICAgLi4uCisjCisjIHRoZSBzY3JpcHQgaXMgdXNlZCB0byByZXBsYWNlICdzb3VyY2UubycgdG8gYSBmdWxsIHBhdGgsIGFzIGluCisjCisjICAgIG9ianMvaW50ZXJtZWRpYXRlcy9lbXVsYXRvci9zb3VyY2UubzogL2Z1bGwvcGF0aC90by9zb3VyY2UuYyBvdGhlci5oIGhlYWRlcnMuaAorIworIyBwYXJhbWV0ZXJzCisjCisjICQxOiBvYmplY3QgZmlsZSAoZnVsbCBwYXRoKQorIyAkMjogc291cmNlIGRlcGVuZGVuY3kgZmlsZSB0byBtb2RpZnkgKGVyYXNlZCBvbiBzdWNjZXNzKQorIyAkMzogdGFyZ2V0IHNvdXJjZSBkZXBlbmRlbmN5IGZpbGUKKyMKKworIyBxdW90ZSB0aGUgb2JqZWN0IHBhdGguIHdlIGNoYW5nZSBhIHNpbmdsZSAnLicgaW50bworIyBhICdcLicgc2luY2UgdGhpcyB3aWxsIGJlIHBhcnNlZCBieSBzZWQuCisjCitPQkpFQ1Q9YGVjaG8gJDEgfCBzZWQgLWUgcy9cXFxcLi9cXFxcXFxcXC4vZ2AKKyNlY2hvIE9CSkVDVD0kT0JKRUNUCisKK09CSl9OQU1FPWBiYXNlbmFtZSAkT0JKRUNUYAorI2VjaG8gT0JKX05BTUU9JE9CSl9OQU1FCisKKyMgd2UgcmVwbGFjZSAkT0JKX05BTUUgd2l0aCAkT0JKRUNUIG9ubHkgaWYgJE9CSl9OQU1FIHN0YXJ0cyB0aGUgbGluZQorIyB0aGF0J3MgYmVjYXVzZSBzb21lIHZlcnNpb25zIG9mIEdDQyAoZS5nLiA0LjIuMykgYWxyZWFkeSBwcm9kdWNlCisjIGEgY29ycmVjdCBkZXBlbmRlbmN5IGxpbmUgd2l0aCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBvYmplY3QgZmlsZS4KKyMgSW4gdGhpcyBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHRvdWNoIGFueXRoaW5nCisjCitjYXQgJDIgfCBzZWQgLWUgcyVeJE9CSl9OQU1FJSRPQkpFQ1QlZyA+ICQzICYmIHJtIC1mICQyCisKKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2JpbmFyeS5tYWtlIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9iaW5hcnkubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVhMTZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9iaW5hcnkubWFrZQpAQCAtMCwwICsxLDEyMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBkZWZpbml0aW9ucyBzaGFyZWQgYnkgaG9zdF9leGVjdXRhYmxlLm1ha2UgYW5kIGhvc3Rfc3RhdGljX2xpYnJhcnkubWFrZQorIworCisjIFNhbml0eSBjaGVjaworTE9DQUxfQklUUyA/PSA2NAoraWZuZXEgKCwkKGZpbHRlci1vdXQgMzIgNjQsJChMT0NBTF9CSVRTKSkpCisgICAgJChlcnJvciBMT0NBTF9CSVRTIHNob3VsZCBiZSBkZWZpbmVkIHRvIGVpdGhlciAzMiBvciA2NCkpCitlbmRpZgorCiskKGNhbGwgbG9jYWwtYnVpbGQtZGVmaW5lLENDKQorJChjYWxsIGxvY2FsLWJ1aWxkLWRlZmluZSxDWFgpCiskKGNhbGwgbG9jYWwtYnVpbGQtZGVmaW5lLEFSKQorJChjYWxsIGxvY2FsLWJ1aWxkLWRlZmluZSxMRCkKKyQoY2FsbCBsb2NhbC1idWlsZC1kZWZpbmUsRFVNUFNZTVMpCisKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgJChjYWxsIGxvY2FsLWJ1aWxkLXZhcixDRkxBR1MkKExPQ0FMX0JJVFMpKSBcCisgICAgJChjYWxsIGxvY2FsLWJ1aWxkLXZhcixDRkxBR1MpIFwKKyAgICAkKExPQ0FMX0NGTEFHUykKKworTE9DQUxfQ1hYRkxBR1MgOj0gXAorICAgICQoY2FsbCBsb2NhbC1idWlsZC12YXIsQ1hYRkxBR1MkKExPQ0FMX0JJVFMpKSBcCisgICAgJChjYWxsIGxvY2FsLWJ1aWxkLXZhcixDWFhGTEFHUykgXAorICAgICQoTE9DQUxfQ1hYRkxBR1MpCisKK0xPQ0FMX0xERkxBR1MgOj0gXAorICAgICQoY2FsbCBsb2NhbC1idWlsZC12YXIsTERGTEFHUyQoTE9DQUxfQklUUykpIFwKKyAgICAkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLExERkxBR1MpIFwKKyAgICAkKExPQ0FMX0xERkxBR1MpCisKK0xPQ0FMX0xETElCUyA6PSBcCisgICAgJChMT0NBTF9MRExJQlMpIFwKKyAgICAkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLExETElCUykgXAorICAgICQoY2FsbCBsb2NhbC1idWlsZC12YXIsTERMSUJTJChMT0NBTF9CSVRTKSkKKworIyBFbnN1cmUgb25seSBvbmUgb2YgLW0zMiBvciAtbTY0IGlzIGJlaW5nIHVzZWQgYW5kIHBsYWNlIGl0IGZpcnN0LgorTE9DQUxfQ0ZMQUdTIDo9IFwKKyAgICAtbSQoTE9DQUxfQklUUykgXAorICAgICQoZmlsdGVyLW91dCAtbTMyIC1tNjQsICQoTE9DQUxfQ0ZMQUdTKSkKKworTE9DQUxfTERGTEFHUyA6PSBcCisgICAgLW0kKExPQ0FMX0JJVFMpIFwKKyAgICAkKGZpbHRlci1vdXQgLW0zMiAtbTY0LCAkKExPQ0FMX0xERkxBR1MpKQorCitMT0NBTF9DUFBfRVhURU5TSU9OUyA6PSAuY3BwIC5jYyAuQyAuY3h4IC5jKysKK0xPQ0FMX0NYWF9FWFRFTlNJT05fUEFUVEVSTlMgOj0gJChmb3JlYWNoIHBhdHRlcm4sJChMT0NBTF9DUFBfRVhURU5TSU9OUyksJSQocGF0dGVybikpCisKKyMgdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSdyZSBnb2luZyB0byBwbGFjZSBvdXIgb2JqZWN0IGZpbGVzCitMT0NBTF9PQkpTX0RJUiAgOj0gJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQorTE9DQUxfT0JKRUNUUyAgIDo9CitMT0NBTF9DX1NPVVJDRVMgOj0gJChmaWx0ZXIgICUuYywkKExPQ0FMX1NSQ19GSUxFUykpCitMT0NBTF9HRU5FUkFURURfQ19TT1VSQ0VTIDo9ICQoZmlsdGVyICUuYywkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSkKK0xPQ0FMX0dFTkVSQVRFRF9DWFhfU09VUkNFUyA6PSBcCisgICAgJChmaWx0ZXIgJChMT0NBTF9DWFhfRVhURU5TSU9OX1BBVFRFUk5TKSxcCisgICAgICAgICQoTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMpKQorTE9DQUxfQ1hYX1NPVVJDRVMgOj0gXAorICAgICQoZmlsdGVyICQoTE9DQUxfQ1hYX0VYVEVOU0lPTl9QQVRURVJOUyksXAorICAgICAgICAkKExPQ0FMX1NSQ19GSUxFUykpCitMT0NBTF9PQkpDX1NPVVJDRVMgOj0gJChmaWx0ZXIgJS5tICUubW0sJChMT0NBTF9TUkNfRklMRVMpKQorCitMT0NBTF9DRkxBR1MgOj0gJChzdHJpcCAkKHBhdHN1YnN0ICUsLUklLCQoTE9DQUxfQ19JTkNMVURFUykpICQoTE9DQUxfQ0ZMQUdTKSkKKworIyBIQUNLIEFUVEFDSzogRm9yIHRoZSBEYXJ3aW4geDg2IGJ1aWxkLCB3ZSBuZWVkIHRvIGFkZAorIyAnLXJlYWRfb25seV9yZWxvY3Mgc3VwcHJlc3MnIHRvIHRoZSBsaW5rZXIgY29tbWFuZCB0byBhdm9pZCBlcnJvcnMuCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyktJChCVUlMRF9UQVJHRVRfQklUUyksZGFyd2luLTMyKQorICBMT0NBTF9MRExJQlMgKz0gLVdsLC1yZWFkX29ubHlfcmVsb2NzLHN1cHByZXNzCitlbmRpZgorCiskKGZvcmVhY2ggc3JjLCQoTE9DQUxfQ19TT1VSQ0VTKSwgXAorICAgICQoZXZhbCAkKGNhbGwgY29tcGlsZS1jLXNvdXJjZSwkKHNyYykpKSBcCispCisKKyQoZm9yZWFjaCBzcmMsJChMT0NBTF9RVF9NT0NfU1JDX0ZJTEVTKSwgXAorICAgICQoZXZhbCAkKGNhbGwgY29tcGlsZS1xdC1tb2Mtc291cmNlLCQoc3JjKSkpIFwKKykKKworJChmb3JlYWNoIHNyYywkKExPQ0FMX1FUX1JFU09VUkNFUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGNvbXBpbGUtcXQtcmVzb3VyY2VzLCQoc3JjKSkpIFwKKykKKworJChmb3JlYWNoIHNyYywkKExPQ0FMX1FUX1VJX1NSQ19GSUxFUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGNvbXBpbGUtcXQtdWljLXNvdXJjZSwkKHNyYykpKSBcCispCisKKyQoZm9yZWFjaCBzcmMsJChMT0NBTF9QUk9UT19TT1VSQ0VTKSwgXAorICAgICQoZXZhbCAkKGNhbGwgY29tcGlsZS1wcm90by1zb3VyY2UsJChzcmMpKSkgXAorKQorCiskKGZvcmVhY2ggc3JjLCQoTE9DQUxfR0VORVJBVEVEX0NfU09VUkNFUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGNvbXBpbGUtZ2VuZXJhdGVkLWMtc291cmNlLCQoc3JjKSkpIFwKKykKKworJChmb3JlYWNoIHNyYywkKExPQ0FMX0dFTkVSQVRFRF9DWFhfU09VUkNFUyksIFwKKyAgICAkKGV2YWwgJChjYWxsIGNvbXBpbGUtZ2VuZXJhdGVkLWN4eC1zb3VyY2UsJChzcmMpKSkgXAorKQorCiskKGZvcmVhY2ggc3JjLCQoTE9DQUxfQ1hYX1NPVVJDRVMpLCBcCisgICAgJChldmFsICQoY2FsbCBjb21waWxlLWN4eC1zb3VyY2UsJChzcmMpKSkgXAorKQorCiskKGZvcmVhY2ggc3JjLCQoTE9DQUxfT0JKQ19TT1VSQ0VTKSwgXAorICAgICQoZXZhbCAkKGNhbGwgY29tcGlsZS1vYmpjLXNvdXJjZSwkKHNyYykpKSBcCispCisKKyMgRW5zdXJlIHRoYXQgd2UgYnVpbGQgYWxsIGdlbmVyYXRlZCBzb3VyY2VzIGJlZm9yZSB0aGUgb2JqZWN0cworJChMT0NBTF9PQkpFQ1RTKTogfCAkKExPQ0FMX0dFTkVSQVRFRF9TT1VSQ0VTKSAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCitMT0NBTF9PQkpFQ1RTICs9ICQoTE9DQUxfUFJFQlVJTFRfT0JKX0ZJTEVTKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9jbGVhcl92YXJzLm1ha2UgYi9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2NsZWFyX3ZhcnMubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFiYTNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9jbGVhcl92YXJzLm1ha2UKQEAgLTAsMCArMSw0OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gY2xlYXIgdmFyaWFibGVzIHVzZWQgdG8gZGVmaW5lIGEgZ2l2ZW4gJ21vZHVsZScKKyMKK0xPQ0FMX0JJVFMgOj0KK0xPQ0FMX0NDIDo9CitMT0NBTF9DWFggOj0KK0xPQ0FMX0NfSU5DTFVERVMgOj0KK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9CitMT0NBTF9BUiA6PQorTE9DQUxfQ0ZMQUdTIDo9CitMT0NBTF9DWFhGTEFHUyA6PQorTE9DQUxfSE9TVF9CVUlMRCA6PQorTE9DQUxfSUdOT1JFX0JJVE5FU1MgOj0KK0xPQ0FMX0lOU1RBTEwgOj0gdHJ1ZQorTE9DQUxfSU5TVEFMTF9ESVIgOj0KK0xPQ0FMX0xEIDo9CitMT0NBTF9MREZMQUdTIDo9CitMT0NBTF9MRExJQlMgOj0KK0xPQ0FMX1NSQ19GSUxFUyA6PQorTE9DQUxfTU9EVUxFIDo9CitMT0NBTF9NT0RVTEVfUEFUSDo9CitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9CitMT0NBTF9RVF9NT0NfU1JDX0ZJTEVTIDo9CitMT0NBTF9RVF9SRVNPVVJDRVMgOj0KK0xPQ0FMX1FUX1VJX1NSQ19GSUxFUyA6PQorTE9DQUxfUFJPVE9fU09VUkNFUyA6PQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQorTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyA6PQorTE9DQUxfU1lNQk9MX0ZJTEUgOj0KK0xPQ0FMX0JVSUxUX01PRFVMRSA6PQorTE9DQUxfUFJFQlVJTFRfT0JKX0ZJTEVTIDo9CitMT0NBTF9HRU5FUkFURURfU09VUkNFUyA6PQorCitMT0NBTF9DUFBfRVhURU5TSU9OIDo9IC5jcHAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvZGVmaW5pdGlvbnMubWFrZSBiL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvZGVmaW5pdGlvbnMubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRjYzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9kZWZpbml0aW9ucy5tYWtlCkBAIC0wLDAgKzEsNTA5IEBACisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCVUlMRF9TWVNURU1fUk9PVCA6PSAkKF9CVUlMRF9DT1JFX0RJUikKKworIyBXZSB1c2UgdGhlIEdOVSBNYWtlIFN0YW5kYXJkIExpYnJhcnkKK2luY2x1ZGUgJChCVUlMRF9TWVNURU1fUk9PVCkvZ21zbC9nbXNsCisKK2luY2x1ZGUgJChfQlVJTERfQ09SRV9ESVIpL2NvcmUvZGVmaW5pdGlvbnMtdGVzdHMubWsKK2luY2x1ZGUgJChfQlVJTERfQ09SRV9ESVIpL2NvcmUvZGVmaW5pdGlvbnMtaW5pdC5taworaW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvY29yZS9kZWZpbml0aW9ucy11dGlscy5taworaW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvY29yZS9kZWZpbml0aW9ucy1ob3N0Lm1rCitpbmNsdWRlICQoX0JVSUxEX0NPUkVfRElSKS9jb3JlL2RlZmluaXRpb25zLWdyYXBoLm1rCitpbmNsdWRlICQoX0JVSUxEX0NPUkVfRElSKS9jb3JlL2RlZmluaXRpb25zLW1vZHVsZXMubWsKK2luY2x1ZGUgJChfQlVJTERfQ09SRV9ESVIpL2NvcmUvZGVmaW5pdGlvbnMtZmlsZXMubWsKKyNpbmNsdWRlICQoX0JVSUxEX0NPUkVfRElSKS9jb3JlL2RlZmluaXRpb25zLWJ1aWxkLm1rCisKKyMgUmVwbGFjZSBhbGwgZXh0ZW5zaW9ucyBpbiBmaWxlcyBmcm9tICQxIG1hdGNoaW5nIGFueSBvZgorIyAkKExPQ0FMX0NYWF9FWFRFTlNJT05fUEFUVEVSTlMpIHdpdGggLm8KK2xvY2FsLWN4eC1zcmMtdG8tb2JqID0gJChzdHJpcCBcCisgICAgJChldmFsIF9sb2NhbF9jeHhfc3JjIDo9ICQxKVwKKyAgICAkKGZvcmVhY2ggcGF0dGVybiwkKExPQ0FMX0NYWF9FWFRFTlNJT05fUEFUVEVSTlMpLFwKKyAgICAgICAgJChldmFsIF9sb2NhbF9jeHhfc3JjIDo9ICQkKF9sb2NhbF9jeHhfc3JjOiQocGF0dGVybik9JS5vKSkpXAorICAgICQoX2xvY2FsX2N4eF9zcmMpKQorCisjIFJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGludGVybWVkaWF0ZSBmaWxlcyBmb3IgYSBnaXZlbgorIyBraW5kIG9mIGV4ZWN1dGFibGUKKyMgJDEgPSBiaXRuZXNzICgzMiBvciA2NCkKKyMgJDIgPSBtb2R1bGUgbmFtZQoraW50ZXJtZWRpYXRlcy1kaXItZm9yID0gJChCVUlMRF9PQkpTX0RJUikvYnVpbGQvaW50ZXJtZWRpYXRlcyQoMSkvJCgyKQorCisjIFJldHVybiB0aGUgbmFtZSBvZiBhIGdpdmVuIGJ1aWxkLXJlbGF0ZWQgdmFyaWFibGUgdGhhdCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIKKyMgZm9yIHRoZSBidWlsZCBob3N0IG9yIGJ1aWxkIHRhcmdldC4gSS5lLiBpZiBMT0NBTF9IT1NUX0JVSUxEIGlzIG5vdCBkZWZpbmVkLAorIyByZXR1cm4gJChCVUlMRF9UQVJHRVRfJDEpLCBvciAkKEJVSUxEX0hPU1RfJDEpIGluc3RlYWQuCisjICQxOiBWYXJpYWJsZSBuYW1lIHN1ZmZpeCAoZS5nLiBDQywgTEQsIGV0Yy4uLikKK2xvY2FsLWJ1aWxkLXZhciA9ICQoaWYgJChzdHJpcCAkKExPQ0FMX0hPU1RfQlVJTEQpKSwkKEJVSUxEX0hPU1RfJDEpLCQoQlVJTERfVEFSR0VUXyQxKSkKKworIyBJZiBMT0NBTF9YWFggaXMgbm90IGRlZmluZWQsIHNldCBpdCB0byB0aGUgdmFsdWUgb2YgQlVJTERfVEFSR0VUX1hYWCBvcgorIyBCVUlMRF9IT1NUX1hYWCBkZXBlbmRpbmcgb24gdGhlIGRlZmluaXRpb24gb2YgTE9DQUxfSE9TVF9CVUlMRC4KK2xvY2FsLWJ1aWxkLWRlZmluZSA9ICQoaWYgJChzdHJpcCAkKExPQ0FMXyQxKSksLCQoZXZhbCBMT0NBTF8kMSA6PSAkJChjYWxsIGxvY2FsLWJ1aWxkLXZhciwkMSkpKQorCisjIFJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGludGVybWVkaWF0ZSBmaWxlcyBmb3IgdGhlIGN1cnJlbnQKKyMgbW9kdWxlLiBMT0NBTF9NT0RVTEUgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCitsb2NhbC1pbnRlcm1lZGlhdGVzLWRpciA9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsJChCVUlMRF9UQVJHRVRfQklUUyksJChMT0NBTF9NT0RVTEUpKQorCisjIFJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlICdwcm90b2MnIHRvb2wuCisjIFNlZSBMT0NBTF9QUk9UT19TT1VSQ0VTIGZvciBkZXRhaWxzLgorZ2VuZXJhdGVkLXByb3RvLXNvdXJjZXMtZGlyID0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvciwkKEJVSUxEX1RBUkdFVF9CSVRTKSxwcm90by1zb3VyY2VzKQorCisjIExvY2F0aW9uIG9mIGludGVybWVkaWF0ZSBzdGF0aWMgbGlicmFyaWVzIGR1cmluZyBidWlsZC4KK2xvY2FsLWxpYnJhcnktcGF0aCA9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsJChCVUlMRF9UQVJHRVRfQklUUyksJCgxKSkvJCgxKS5hCisKKyMgTG9jYXRpb24gb2YgdW5zdHJpcHBlZCBleGVjdXRhYmxlcyBkdXJpbmcgYnVpbGQuCitsb2NhbC1leGVjdXRhYmxlLXBhdGggPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLCQoQlVJTERfVEFSR0VUX0JJVFMpLCQoMSkpLyQoMSkkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLEVYRUVYVCkKKworIyBMb2NhdGlvbiBvZiB1bnN0cmlwcGVkIHNoYXJlZCBsaWJyYXJpZXMgZHVyaW5nIGJ1aWxkLgorbG9jYWwtc2hhcmVkLWxpYnJhcnktcGF0aCA9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsJChCVUlMRF9UQVJHRVRfQklUUyksJCgxKSkvJCgxKSQoY2FsbCBsb2NhbC1idWlsZC12YXIsRExMRVhUKQorCisjIExvY2F0aW9uIG9mIGZpbmFsIChwb3RlbnRpYWxseSBzdHJpcHBlZCkgZXhlY3V0YWJsZXMuCitsb2NhbC1leGVjdXRhYmxlLWluc3RhbGwtcGF0aCA9ICQoQlVJTERfT0JKU19ESVIpLyQoaWYgJChMT0NBTF9JTlNUQUxMX0RJUiksJChMT0NBTF9JTlNUQUxMX0RJUikvKSQoMSkkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLEVYRUVYVCkKKworIyBMb2NhdGlvbiBvZiBmaW5hbCAocG90ZW50aWFsbHkgc3RyaXBwZWQpIHNoYXJlZCBsaWJyYXJpZXMuCitsb2NhbC1zaGFyZWQtbGlicmFyeS1pbnN0YWxsLXBhdGggPSAkKEJVSUxEX09CSlNfRElSKS8kKGlmICQoTE9DQUxfSU5TVEFMTF9ESVIpLCQoTE9DQUxfSU5TVEFMTF9ESVIpLGxpYiQoQlVJTERfVEFSR0VUX1NVRkZJWCkpLyQoMSkkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLERMTEVYVCkKKworIyBMb2NhdGlvbiBvZiBmaW5hbCBzeW1ib2wgZmlsZSBiYXNlZCBvbiBmaW5hbCBleGVjdXRhYmxlL3NoYXJlZCBsaWJyYXJ5IHBhdGgKK2xvY2FsLXN5bWJvbC1pbnN0YWxsLXBhdGggPSAkKHN1YnN0ICQoQlVJTERfT0JKU19ESVIpLCQoX0JVSUxEX1NZTUJPTFNfRElSKSwkKDEpKS5zeW0KKworIyBMb2NhdGlvbiBvZiBmaW5hbCBkZWJ1ZyBpbmZvIGZpbGUgYmFzZWQgb24gZmluYWwgZXhlY3V0YWJsZS9zaGFyZWQgbGlicmFyeSBwYXRoCitsb2NhbC1kZWJ1Zy1pbmZvLWluc3RhbGwtcGF0aCA9ICQoc3Vic3QgJChCVUlMRF9PQkpTX0RJUiksJChfQlVJTERfREVCVUdfSU5GT19ESVIpLCQoMSkpJChpZiAkKGZpbmRzdHJpbmcgZGFyd2luLCQoQlVJTERfVEFSR0VUX09TKSksLmRTWU0pCisKK2xkbGlic19zdGFydF93aG9sZSA6PSAtV2wsLS13aG9sZS1hcmNoaXZlCitsZGxpYnNfZW5kX3dob2xlIDo9IC1XbCwtLW5vLXdob2xlLWFyY2hpdmUKK2xkbGlic19mb3JjZV9sb2FkIDo9IC1XbCwtZm9yY2VfbG9hZCwKKworIyBSZXR1cm4gdGhlIGxpc3Qgb2YgbG9jYWwgc3RhdGljIGxpYnJhcmllcworbG9jYWwtc3RhdGljLWxpYnJhcmllcy1sZGxpYnMtZGFyd2luID0gJChzdHJpcCBcCisgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyksXAorICAgICAgICQobGRsaWJzX2ZvcmNlX2xvYWQpJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKVwKKyAgICQoZm9yZWFjaCBsaWIsJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSxcCisgICAgICAgJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKSkKKworbG9jYWwtc3RhdGljLWxpYnJhcmllcy1sZGxpYnMtbGludXggPSAkKHN0cmlwIFwKKyAgICAkKGlmICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUyksIFwKKyAgICAgICAgJChsZGxpYnNfc3RhcnRfd2hvbGUpIFwKKyAgICAgICAgJChmb3JlYWNoIGxpYiwkKExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMpLCQoY2FsbCBsb2NhbC1saWJyYXJ5LXBhdGgsJChsaWIpKSkgXAorICAgICAgICAkKGxkbGlic19lbmRfd2hvbGUpIFwKKyAgICApIFwKKyAgICAkKGZvcmVhY2ggbGliLCQoTE9DQUxfU1RBVElDX0xJQlJBUklFUyksJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKSBcCisgICAgKQorCitsb2NhbC1zdGF0aWMtbGlicmFyaWVzLWxkbGlicy13aW5kb3dzID0gICQobG9jYWwtc3RhdGljLWxpYnJhcmllcy1sZGxpYnMtbGludXgpCisKK2xvY2FsLXN0YXRpYy1saWJyYXJpZXMtbGRsaWJzID0gJChsb2NhbC1zdGF0aWMtbGlicmFyaWVzLWxkbGlicy0kKEJVSUxEX1RBUkdFVF9PUykpCisKKyMgRXhwYW5kIHRvIGEgc2hlbGwgc3RhdGVtZW50IHRoYXQgY2hhbmdlcyB0aGUgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLgorIyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgZm9yIFF0LXJlbGF0ZWQgc3R1ZmYsIGFuZCBvbiBXaW5kb3dzLCB0aGUKKyMgV2luZG93cyBsaWJyYXJpZXMgYXJlIHBsYWNlZCB1bmRlciBiaW4vIGluc3RlYWQgb2YgbGliLyBzbyB0aGVyZSBpcyBubworIyBwb2ludCBpbiBjaGFuZ2luZyB0aGUgUEFUSCB2YXJpYWJsZS4KK3NldC1ob3N0LWxpYnJhcnktc2VhcmNoLXBhdGggPSAkKGNhbGwgc2V0LWhvc3QtbGlicmFyeS1zZWFyY2gtcGF0aC0kKEJVSUxEX1RBUkdFVF9PUyksJDEpCitzZXQtaG9zdC1saWJyYXJ5LXNlYXJjaC1wYXRoLWxpbnV4ID0gTERfTElCUkFSWV9QQVRIPSQxCitzZXQtaG9zdC1saWJyYXJ5LXNlYXJjaC1wYXRoLWRhcndpbiA9IERZTERfTElCUkFSWV9QQVRIPSQxCitzZXQtaG9zdC1saWJyYXJ5LXNlYXJjaC1wYXRoLXdpbmRvd3MgPQorCisjIFRvb2xjaGFpbiBjb250cm9sIHN1cHBvcnQuCisjIEl0J3MgcG9zc2libGUgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHJlZ3VsYXIgdG9vbGNoYWluIGFuZCB0aGUgaG9zdCBvbmUKKyMgaW4gY2VydGFpbiBjYXNlcy4KKworIyBDb21waWxlIGEgQyBzb3VyY2UgZmlsZQorIworZGVmaW5lICBjb21waWxlLWMtc291cmNlCitTUkM6PSQoMSkKK09CSjo9JCQoTE9DQUxfT0JKU19ESVIpLyQkKFNSQzolLmM9JS5vKQorTE9DQUxfT0JKRUNUUyArPSAkJChPQkopCitfQlVJTERfREVQRU5ERU5DWV9ESVJTICs9ICQkKGRpciAkJChPQkopKQorJCQoT0JKKTogUFJJVkFURV9DRkxBR1MgOj0gJCQoTE9DQUxfQ0ZMQUdTKSAtSSQkKExPQ0FMX1BBVEgpIC1JJCQoTE9DQUxfT0JKU19ESVIpCiskJChPQkopOiBQUklWQVRFX0NDICAgICA6PSAkJChMT0NBTF9DQykKKyQkKE9CSik6IFBSSVZBVEVfT0JKICAgIDo9ICQkKE9CSikKKyQkKE9CSik6IFBSSVZBVEVfTU9EVUxFIDo9ICQkKExPQ0FMX01PRFVMRSkKKyQkKE9CSik6IFBSSVZBVEVfU1JDICAgIDo9ICQkKExPQ0FMX1BBVEgpLyQkKFNSQykKKyQkKE9CSik6IFBSSVZBVEVfU1JDMCAgIDo9ICQkKFNSQykKKyQkKE9CSik6ICQkKExPQ0FMX1BBVEgpLyQkKFNSQykKKwlAbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT0JKKSkKKwlAZWNobyAiQ29tcGlsZTogJCQoUFJJVkFURV9NT0RVTEUpIDw9ICQkKFBSSVZBVEVfU1JDMCkiCisJJChoaWRlKSAkJChQUklWQVRFX0NDKSAkJChQUklWQVRFX0NGTEFHUykgLWMgLW8gJCQoUFJJVkFURV9PQkopIC1NTUQgLU1QIC1NRiAkJChQUklWQVRFX09CSikuZC50bXAgJCQoUFJJVkFURV9TUkMpCisJJChoaWRlKSAkJChfQlVJTERfQ09SRV9ESVIpL2NvcmUvbWtkZXBzLnNoICQkKFBSSVZBVEVfT0JKKSAkJChQUklWQVRFX09CSikuZC50bXAgJCQoUFJJVkFURV9PQkopLmQKK2VuZGVmCisKKyMgQ29tcGlsZSBhIEMrKyBzb3VyY2UgZmlsZQorIworZGVmaW5lICBjb21waWxlLWN4eC1zb3VyY2UKK1NSQzo9JCgxKQorT0JKOj0kJChMT0NBTF9PQkpTX0RJUikvJCQoY2FsbCBsb2NhbC1jeHgtc3JjLXRvLW9iaiwkJChTUkMpKQorTE9DQUxfT0JKRUNUUyArPSAkJChPQkopCitfQlVJTERfREVQRU5ERU5DWV9ESVJTICs9ICQkKGRpciAkJChPQkopKQorJCQoT0JKKTogUFJJVkFURV9DRkxBR1MgOj0gJCQoTE9DQUxfQ0ZMQUdTKSAkJChMT0NBTF9DWFhGTEFHUykgLUkkJChMT0NBTF9QQVRIKSAtSSQkKExPQ0FMX09CSlNfRElSKQorJCQoT0JKKTogUFJJVkFURV9DWFggICAgOj0gJCQoTE9DQUxfQ1hYKQorJCQoT0JKKTogUFJJVkFURV9PQkogICAgOj0gJCQoT0JKKQorJCQoT0JKKTogUFJJVkFURV9NT0RVTEUgOj0gJCQoTE9DQUxfTU9EVUxFKQorJCQoT0JKKTogUFJJVkFURV9TUkMgICAgOj0gJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorJCQoT0JKKTogUFJJVkFURV9TUkMwICAgOj0gJCQoU1JDKQorJCQoT0JKKTogJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PQkopKQorCUBlY2hvICJDb21waWxlOiAkJChQUklWQVRFX01PRFVMRSkgPD0gJCQoUFJJVkFURV9TUkMwKSIKKwkkKGhpZGUpICQkKFBSSVZBVEVfQ1hYKSAkJChQUklWQVRFX0NGTEFHUykgLWMgLW8gJCQoUFJJVkFURV9PQkopIC1NTUQgLU1QIC1NRiAkJChQUklWQVRFX09CSikuZC50bXAgJCQoUFJJVkFURV9TUkMpCisJJChoaWRlKSAkJChfQlVJTERfQ09SRV9ESVIpL2NvcmUvbWtkZXBzLnNoICQkKFBSSVZBVEVfT0JKKSAkJChQUklWQVRFX09CSikuZC50bXAgJCQoUFJJVkFURV9PQkopLmQKK2VuZGVmCisKKyMgQ29tcGlsZSBhbiBPYmplY3RpdmUtQyBzb3VyY2UgZmlsZQorIworZGVmaW5lICBjb21waWxlLW9iamMtc291cmNlCitTUkM6PSQoMSkKK09CSjo9JCQoTE9DQUxfT0JKU19ESVIpLyQkKG5vdGRpciAkJChTUkM6JS5tPSUubykpCitMT0NBTF9PQkpFQ1RTICs9ICQkKE9CSikKK19CVUlMRF9ERVBFTkRFTkNZX0RJUlMgKz0gJCQoZGlyICQkKE9CSikpCiskJChPQkopOiBQUklWQVRFX0NGTEFHUyA6PSAkJChMT0NBTF9DRkxBR1MpIC1JJCQoTE9DQUxfUEFUSCkgLUkkJChMT0NBTF9PQkpTX0RJUikKKyQkKE9CSik6IFBSSVZBVEVfQ0MgICAgIDo9ICQkKExPQ0FMX0NDKQorJCQoT0JKKTogUFJJVkFURV9PQkogICAgOj0gJCQoT0JKKQorJCQoT0JKKTogUFJJVkFURV9NT0RVTEUgOj0gJCQoTE9DQUxfTU9EVUxFKQorJCQoT0JKKTogUFJJVkFURV9TUkMgICAgOj0gJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorJCQoT0JKKTogUFJJVkFURV9TUkMwICAgOj0gJCQoU1JDKQorJCQoT0JKKTogJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PQkopKQorCUBlY2hvICJDb21waWxlOiAkJChQUklWQVRFX01PRFVMRSkgPD0gJCQoUFJJVkFURV9TUkMwKSIKKwkkKGhpZGUpICQkKFBSSVZBVEVfQ0MpICQkKFBSSVZBVEVfQ0ZMQUdTKSAtYyAtbyAkJChQUklWQVRFX09CSikgLU1NRCAtTVAgLU1GICQkKFBSSVZBVEVfT0JKKS5kLnRtcCAkJChQUklWQVRFX1NSQykKKwkkKGhpZGUpICQkKF9CVUlMRF9DT1JFX0RJUikvY29yZS9ta2RlcHMuc2ggJCQoUFJJVkFURV9PQkopICQkKFBSSVZBVEVfT0JKKS5kLnRtcCAkJChQUklWQVRFX09CSikuZAorZW5kZWYKKworIyBDb21waWxlIGEgZ2VuZXJhdGVkIEMgc291cmNlIGZpbGVzIworIworZGVmaW5lIGNvbXBpbGUtZ2VuZXJhdGVkLWMtc291cmNlCitTUkM6PSQoMSkKK09CSjo9JCQoTE9DQUxfT0JKU19ESVIpLyQkKG5vdGRpciAkJChTUkM6JS5jPSUubykpCitMT0NBTF9PQkpFQ1RTICs9ICQkKE9CSikKK19CVUlMRF9ERVBFTkRFTkNZX0RJUlMgKz0gJCQoZGlyICQkKE9CSikpCiskJChPQkopOiBQUklWQVRFX0NGTEFHUyA6PSAkJChMT0NBTF9DRkxBR1MpIC1JJCQoTE9DQUxfUEFUSCkgLUkkJChMT0NBTF9PQkpTX0RJUikKKyQkKE9CSik6IFBSSVZBVEVfQ0MgICAgIDo9ICQkKExPQ0FMX0NDKQorJCQoT0JKKTogUFJJVkFURV9PQkogICAgOj0gJCQoT0JKKQorJCQoT0JKKTogUFJJVkFURV9NT0RVTEUgOj0gJCQoTE9DQUxfTU9EVUxFKQorJCQoT0JKKTogUFJJVkFURV9TUkMgICAgOj0gJCQoU1JDKQorJCQoT0JKKTogUFJJVkFURV9TUkMwICAgOj0gJCQoU1JDKQorJCQoT0JKKTogJCQoU1JDKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PQkopKQorCUBlY2hvICJDb21waWxlOiAkJChQUklWQVRFX01PRFVMRSkgPD0gJCQoUFJJVkFURV9TUkMwKSIKKwkkKGhpZGUpICQkKFBSSVZBVEVfQ0MpICQkKFBSSVZBVEVfQ0ZMQUdTKSAtYyAtbyAkJChQUklWQVRFX09CSikgLU1NRCAtTVAgLU1GICQkKFBSSVZBVEVfT0JKKS5kLnRtcCAkJChQUklWQVRFX1NSQykKKwkkKGhpZGUpICQkKF9CVUlMRF9DT1JFX0RJUikvY29yZS9ta2RlcHMuc2ggJCQoUFJJVkFURV9PQkopICQkKFBSSVZBVEVfT0JKKS5kLnRtcCAkJChQUklWQVRFX09CSikuZAorZW5kZWYKKworZGVmaW5lIGNvbXBpbGUtZ2VuZXJhdGVkLWN4eC1zb3VyY2UKK1NSQzo9JCgxKQorT0JKOj0kJChMT0NBTF9PQkpTX0RJUikvJCQoY2FsbCBsb2NhbC1jeHgtc3JjLXRvLW9iaiwkJChub3RkaXIgJCQoU1JDKSkpCitMT0NBTF9PQkpFQ1RTICs9ICQkKE9CSikKK19CVUlMRF9ERVBFTkRFTkNZX0RJUlMgKz0gJCQoZGlyICQkKE9CSikpCiskJChPQkopOiBQUklWQVRFX0NGTEFHUyA6PSAkJChMT0NBTF9DRkxBR1MpIC1JJCQoTE9DQUxfUEFUSCkgLUkkJChMT0NBTF9PQkpTX0RJUikKKyQkKE9CSik6IFBSSVZBVEVfQ1hYICAgIDo9ICQkKExPQ0FMX0NYWCkKKyQkKE9CSik6IFBSSVZBVEVfT0JKICAgIDo9ICQkKE9CSikKKyQkKE9CSik6IFBSSVZBVEVfTU9EVUxFIDo9ICQkKExPQ0FMX01PRFVMRSkKKyQkKE9CSik6IFBSSVZBVEVfU1JDICAgIDo9ICQkKFNSQykKKyQkKE9CSik6IFBSSVZBVEVfU1JDMCAgIDo9ICQkKFNSQykKKyQkKE9CSik6ICQkKFNSQykKKwlAbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT0JKKSkKKwlAZWNobyAiQ29tcGlsZTogJCQoUFJJVkFURV9NT0RVTEUpIDw9ICQkKFBSSVZBVEVfU1JDMCkiCisJJChoaWRlKSAkJChQUklWQVRFX0NYWCkgJCQoUFJJVkFURV9DRkxBR1MpIC1jIC1vICQkKFBSSVZBVEVfT0JKKSAtTU1EIC1NUCAtTUYgJCQoUFJJVkFURV9PQkopLmQudG1wICQkKFBSSVZBVEVfU1JDKQorCSQoaGlkZSkgJCQoX0JVSUxEX0NPUkVfRElSKS9jb3JlL21rZGVwcy5zaCAkJChQUklWQVRFX09CSikgJCQoUFJJVkFURV9PQkopLmQudG1wICQkKFBSSVZBVEVfT0JKKS5kCitlbmRlZgorCisjIEluc3RhbGwgYSBmaWxlCisjCitkZWZpbmUgaW5zdGFsbC10YXJnZXQKK1NSQzo9JCgxKQorRFNUOj0kKDIpCiskJChEU1QpOiBQUklWQVRFX1NSQyA6PSAkJChTUkMpCiskJChEU1QpOiBQUklWQVRFX0RTVCA6PSAkJChEU1QpCiskJChEU1QpOiBQUklWQVRFX0RTVF9OQU1FIDo9ICQkKG5vdGRpciAkJChEU1QpKQorJCQoRFNUKTogUFJJVkFURV9TUkNfTkFNRSA6PSAkJChTUkMpCiskJChEU1QpOiAkJChTUkMpCisJQG1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX0RTVCkpCisJQGVjaG8gIkluc3RhbGw6ICQkKFBSSVZBVEVfRFNUX05BTUUpIDw9ICQkKFBSSVZBVEVfU1JDX05BTUUpIgorCSQoaGlkZSkgY3AgLWYgJCQoUFJJVkFURV9TUkMpICQkKFBSSVZBVEVfRFNUKQoraW5zdGFsbDogJCQoRFNUKQorZW5kZWYKKworZGVmaW5lICBjcmVhdGUtZGlyCiskKDEpOgorCW1rZGlyIC1wICQoMSkKK2VuZGVmCisKK2RlZmluZSB0cmFuc2Zvcm0tZ2VuZXJhdGVkLXNvdXJjZQorQGVjaG8gIkdlbmVyYXRlZDogJChQUklWQVRFX01PRFVMRSkgPD0gJDwiCitAbWtkaXIgLXAgJChkaXIgJEApCiskKGhpZGUpICQoUFJJVkFURV9DVVNUT01fVE9PTCkKK2VuZGVmCisKKyMgSW5zdGFsbHMgYSBiaW5hcnkgdG8gYSBuZXcgZGVzdGluYXRpb24KKyMgSWYgcmVxdWlyZWQsIHdpbGwgc3RyaXAgdGhlIGJpbmFyeQorZGVmaW5lIGluc3RhbGwtYmluYXJ5CitfU1JDIDo9ICQoMSkKK19TUkMxIDo9ICQkKG5vdGRpciAkJChfU1JDKSkKK19EU1QgOj0gJCgyKQorX0JVSUxEX0VYRUNVVEFCTEVTICs9ICQkKF9EU1QpCiskJChfRFNUKTogUFJJVkFURV9EU1QgOj0gJCQoX0RTVCkKKyQkKF9EU1QpOiBQUklWQVRFX1NSQyA6PSAkJChfU1JDKQorJCQoX0RTVCk6IFBSSVZBVEVfT0JKQ09QWSA6PSAkJChCVUlMRF9UQVJHRVRfT0JKQ09QWSkKKyQkKF9EU1QpOiBQUklWQVRFX09CSkNPUFlfRkxBR1MgOj0gJCgzKQorJCQoX0RTVCk6ICQkKF9TUkMpCisJQG1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX0RTVCkpCisJQGVjaG8gIkluc3RhbGw6ICQkKFBSSVZBVEVfRFNUKSIKK2lmZXEgKHRydWUsJCQoQlVJTERfU1RSSVBfQklOQVJJRVMpKQoraWZlcSAoZGFyd2luLCQkKEJVSUxEX1RBUkdFVF9PUykpCisJJChoaWRlKSBzdHJpcCAtUyAtbyAkJChQUklWQVRFX0RTVCkgJCQoUFJJVkFURV9TUkMpCitlbHNlICAjIEJVSUxEX1RBUkdFVF9PUyAhPSBkYXJ3aW4KKwkkKGhpZGUpICQkKFBSSVZBVEVfT0JKQ09QWSkgJCQoUFJJVkFURV9PQkpDT1BZX0ZMQUdTKSAkJChQUklWQVRFX1NSQykgJCQoUFJJVkFURV9EU1QpCitlbmRpZiAgIyBCVUlMRF9UQVJHRVRfT1MgIT0gZGFyd2luCitlbHNlICAjIEJVSUxEX1NUUklQX0JJTkFSSUVTICE9IHRydWUKKwkkKGhpZGUpIGNwIC1mICQkKFBSSVZBVEVfU1JDKSAkJChQUklWQVRFX0RTVCkKK2VuZGlmICMgQlVJTERfU1RSSVBfQklOQVJJRVMgIT0gdHJ1ZQorZW5kZWYKKworIyBJbnN0YWxscyBhIHByZWJ1aWx0IGxpYnJhcnkKKyMgSWYgcmVxdWlyZWQsIHdpbGwgZ2VuZXJhdGVzIHN5bWJvbHMgYW5kIGRlYnVnIGluZm8KK2RlZmluZSBpbnN0YWxsLXByZWJ1aWx0CitfUEFJUiA6PSAkKHN1YnN0IDosICwkKDEpKQorX1NSQyA6PSAkJCh3b3JkIDEsICQkKF9QQUlSKSkKK19EU1QgOj0gJCQod29yZCAyLCAkJChfUEFJUikpCiskKGNhbGwgaW5zdGFsbC1iaW5hcnksJCQoX1NSQyksJCQoX0RTVCksLS1zdHJpcC11bm5lZWRlZCkKK2lmZXEgKHRydWUsJChCVUlMRF9HRU5FUkFURV9TWU1CT0xTKSkKKyQkKGV2YWwgJCQoY2FsbCBidWlsZC1pbnN0YWxsLWRlYnVnLWluZm8sJCQoX1NSQyksJCQoX0RTVCkpKQorJCQoZXZhbCAkJChjYWxsIGJ1aWxkLWluc3RhbGwtc3ltYm9sLCQkKF9TUkMpLCQkKF9EU1QpKSkKK2VuZGlmCitlbmRlZgorCisjIEluc3RhbGxzIGEgcHJlYnVpbHQgc3ltbGluaworIyBJZiByZXF1aXJlZCwgd2lsbCBnZW5lcmF0ZSBzeW1ib2xzCitkZWZpbmUgaW5zdGFsbC1wcmVidWlsdC1zeW1saW5rCitfUEFJUiA6PSAkKHN1YnN0IDosICwkKDEpKQorX1NSQyA6PSAkJCh3b3JkIDEsICQkKF9QQUlSKSkKK19EU1QgOj0gJCQod29yZCAyLCAkJChfUEFJUikpCitfQlVJTERfRVhFQ1VUQUJMRVMgKz0gJCQoX0RTVCkKKyQkKF9EU1QpOiBQUklWQVRFX0RTVCA6PSAkJChfRFNUKQorJCQoX0RTVCk6IFBSSVZBVEVfU1JDIDo9ICQkKF9TUkMpCiskJChfRFNUKTogJCQoX1NSQykKKwlAZWNobyAiSW5zdGFsbGluZyBzeW1saW5rOiAkJChQUklWQVRFX0RTVCkiCisJJChoaWRlKSBjcCAtZmEgJCQoUFJJVkFURV9TUkMpICQkKFBSSVZBVEVfRFNUKQoraWZlcSAodHJ1ZSwkKEJVSUxEX0dFTkVSQVRFX1NZTUJPTFMpKQorJCQoZXZhbCAkJChjYWxsIGJ1aWxkLWluc3RhbGwtc3ltYm9sLCQkKF9TUkMpLCQkKF9EU1QpKSkKKworIyBhbHNvIGNvcHkgb3ZlciBkZWJ1Zy1pbmZvIGxpbmsKK2lmZXEgKGRhcndpbiwkKEJVSUxEX1RBUkdFVF9PUykpCitfREVCVUdfSU5GT19TUkMgOj0gJCQoX1NSQykuZFNZTQorX0RFQlVHX0lORk8gOj0gJCQoY2FsbCBsb2NhbC1kZWJ1Zy1pbmZvLWluc3RhbGwtcGF0aCwkJChfRFNUKSkKK19CVUlMRF9ERUJVR19JTkZPUyArPSAkJChfREVCVUdfSU5GTykKKyQkKF9ERUJVR19JTkZPKTogUFJJVkFURV9ERUJVR19JTkZPIDo9ICQkKF9ERUJVR19JTkZPKQorJCQoX0RFQlVHX0lORk8pOiBQUklWQVRFX0RFQlVHX0lORk9fU1JDIDo9ICQkKF9ERUJVR19JTkZPX1NSQykKKyQkKF9ERUJVR19JTkZPKTogJCQoX1NSQykKKwlAZWNobyAiSW5zdGFsbGluZyBzeW1saW5rIGRlYnVnIGluZm86ICQkKFBSSVZBVEVfREVCVUdfSU5GTykiCisJJChoaWRlKSBjcCAtZmEgJCQoUFJJVkFURV9ERUJVR19JTkZPX1NSQykgJCQoUFJJVkFURV9ERUJVR19JTkZPKQorZW5kaWYgIyBCVUlMRF9UQVJHRVRfT1M9ZGFyd2luCisKK2VuZGlmICMgQlVJTERfR0VORVJBVEVfU1lNQk9MUworZW5kZWYKKworIyBCdWlsZHMgYW5kIGluc3RhbGxzIHRoZSBkZWJ1Zy1pbmZvIGZvciBhIGJpbmFyeSB0byBhIGRlYnVnIGRlc3RpbmF0aW9uCitkZWZpbmUgYnVpbGQtaW5zdGFsbC1kZWJ1Zy1pbmZvCitfSU5URVJNRURJQVRFX01PRFVMRSA6PSAkKDEpCitfTU9EVUxFIDo9ICQoMikKK19ERUJVR19JTkZPIDo9ICQkKGNhbGwgbG9jYWwtZGVidWctaW5mby1pbnN0YWxsLXBhdGgsJCQoX01PRFVMRSkpCitfQlVJTERfREVCVUdfSU5GT1MgKz0gJCQoX0RFQlVHX0lORk8pCiskJChfREVCVUdfSU5GTyk6IFBSSVZBVEVfREVCVUdfSU5GTyA6PSAkJChfREVCVUdfSU5GTykKKyQkKF9ERUJVR19JTkZPKTogUFJJVkFURV9JTlRFUk1FRElBVEVfTU9EVUxFIDo9ICQkKF9JTlRFUk1FRElBVEVfTU9EVUxFKQorJCQoX0RFQlVHX0lORk8pOiBQUklWQVRFX09CSkNPUFkgOj0gJCQoQlVJTERfVEFSR0VUX09CSkNPUFkpCiskJChfREVCVUdfSU5GTyk6ICQkKF9JTlRFUk1FRElBVEVfTU9EVUxFKQorCUBlY2hvICJCdWlsZCBkZWJ1ZyBpbmZvOiAkJChQUklWQVRFX0RFQlVHX0lORk8pIgorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9ERUJVR19JTkZPKSkKK2lmZXEgKGRhcndpbiwkKEJVSUxEX1RBUkdFVF9PUykpCitpZmVxICgsJCQod2lsZGNhcmQgJCQoX0lOVEVSTUVESUFURV9NT0RVTEUpLmRTWU0pKQorCSQoaGlkZSkgZHN5bXV0aWwgLS1vdXQ9JCQoUFJJVkFURV9ERUJVR19JTkZPKSAkJChQUklWQVRFX0lOVEVSTUVESUFURV9NT0RVTEUpCitlbHNlICMgZFNZTSBleGlzdHMKKwkkKGhpZGUpIGNwIC1yZiAkJChQUklWQVRFX0lOVEVSTUVESUFURV9NT0RVTEUpLmRTWU0gJCQoUFJJVkFURV9ERUJVR19JTkZPKQorZW5kaWYKK2Vsc2UgIyBCVUlMRF9UQVJHRVRfT1MgIT0gZGFyd2luCisJJChoaWRlKSBjcCAtZiAkJChQUklWQVRFX0lOVEVSTUVESUFURV9NT0RVTEUpICQkKFBSSVZBVEVfREVCVUdfSU5GTykKK2VuZGlmICMgQlVJTERfVEFSR0VUX09TCitlbmRlZgorCisjIEJ1aWxkcywgdGhlbiBpbnN0YWxscyBhIHN5bWJvbCBmcm9tIGEgbW9kdWxlIHRhcmdldAorZGVmaW5lIGJ1aWxkLWluc3RhbGwtc3ltYm9sCitfSU5URVJNRURJQVRFX01PRFVMRSA6PSAkKDEpCitfTU9EVUxFIDo9ICQoMikKK19TWU1CT0wgOj0gJCQoY2FsbCBsb2NhbC1zeW1ib2wtaW5zdGFsbC1wYXRoLCQkKF9NT0RVTEUpKQorX1NZTUJPTF9ERVAgOj0gJCQoX0lOVEVSTUVESUFURV9NT0RVTEUpCitfQlVJTERfU1lNQk9MUyArPSAkJChfU1lNQk9MKQorCitpZmVxIChkYXJ3aW4sJChCVUlMRF9UQVJHRVRfT1MpKQorX0RTWU0gOj0gJCQoY2FsbCBsb2NhbC1kZWJ1Zy1pbmZvLWluc3RhbGwtcGF0aCwkJChfTU9EVUxFKSkKK19TWU1CT0xfREVQICs9ICQkKF9EU1lNKQorZW5kaWYKKworJCQoX1NZTUJPTCk6IFBSSVZBVEVfRFNZTSA6PSAkJChfRFNZTSkKKyQkKF9TWU1CT0wpOiBQUklWQVRFX0RVTVBTWU1TIDo9ICQkKEJVSUxEX1RBUkdFVF9EVU1QU1lNUykKKyQkKF9TWU1CT0wpOiBQUklWQVRFX01PRFVMRSA6PSAkJChfSU5URVJNRURJQVRFX01PRFVMRSkKK2lmZXEgKGRhcndpbiwkKEJVSUxEX1RBUkdFVF9PUykpCiskJChfU1lNQk9MKTogUFJJVkFURV9NT0RVTEVfRFNZTSA6PSAkJChfRFNZTSkKK2VuZGlmCiskJChfU1lNQk9MKTogUFJJVkFURV9TWU1CT0wgOj0gJCQoX1NZTUJPTCkKKyQkKF9TWU1CT0wpOiAkJChfU1lNQk9MX0RFUCkKKwlAZWNobyAiQnVpbGQgU3ltYm9sOiAkJChQUklWQVRFX1NZTUJPTCkiCisJQG1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX1NZTUJPTCkpCitpZmVxIChkYXJ3aW4sJChCVUlMRF9UQVJHRVRfT1MpKQorCSQkKFBSSVZBVEVfRFVNUFNZTVMpIC1nICQkKFBSSVZBVEVfRFNZTSkgJCQoUFJJVkFURV9NT0RVTEUpID4gJCQoUFJJVkFURV9TWU1CT0wpCitlbHNlCisJJChoaWRlKSAkJChQUklWQVRFX0RVTVBTWU1TKSAkJChQUklWQVRFX01PRFVMRSkgPiAkJChQUklWQVRFX1NZTUJPTCkKK2VuZGlmCitlbmRlZgorCisKK2luc3RhbGwtZXhlY3V0YWJsZSA9ICQoZXZhbCAkKGNhbGwgaW5zdGFsbC1zdHJpcHBlZC1iaW5hcnksJDEsJDIsLS1zdHJpcC1hbGwpKQoraW5zdGFsbC1zaGFyZWQtbGlicmFyeSA9ICQoZXZhbCAkKGNhbGwgaW5zdGFsbC1zdHJpcHBlZC1iaW5hcnksJDEsJDIsLS1zdHJpcC11bm5lZWRlZCkpCisKKyMgR2VuZXJhdGUgRExMIHN5bWJvbCBmaWxlCisjCisjIE5PVEU6IFRoZSBmaWxlIGlzIGFsd2F5cyBuYW1lZCBmb28uZGVmCisjCitkZWZpbmUgZ2VuZXJhdGUtc3ltYm9sLWZpbGUKK1NSQzo9JCgxKQorT0JKOj0kJChMT0NBTF9PQkpTX0RJUikvJCQobm90ZGlyICQkKFNSQzolLmVudHJpZXM9JS5kZWYpKQorTE9DQUxfR0VORVJBVEVEX1NZTUJPTF9GSUxFOj0kJChPQkopCiskJChPQkopOiBQUklWQVRFX1NSQyA6PSAkJChTUkMpCiskJChPQkopOiBQUklWQVRFX0RTVCA6PSAkJChPQkopCiskJChPQkopOiBQUklWQVRFX01PREUgOj0gJCQoR0VOX0VOVFJJRVNfTU9ERV8kKEJVSUxEX1RBUkdFVF9PUykpCiskJChPQkopOiAkJChTUkMpCisJQG1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX0RTVCkpCisJQGVjaG8gIkdlbmVyYXRlIHN5bWJvbCBmaWxlOiAkJChub3RkaXIgJCQoUFJJVkFURV9EU1QpKSIKKwkkKGhpZGUpIGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9JCQoUFJJVkFURV9NT0RFKSAtLW91dHB1dD0kJChQUklWQVRFX0RTVCkgJCQoUFJJVkFURV9TUkMpCitlbmRlZgorCitHRU5fRU5UUklFU19NT0RFX2RhcndpbiA6PSBfc3ltYm9scworR0VOX0VOVFJJRVNfTU9ERV93aW5kb3dzIDo9IGRlZgorR0VOX0VOVFJJRVNfTU9ERV9saW51eCA6PSBzeW0KKworRVhQT1JURURfU1lNQk9MX0xJU1Rfd2luZG93cyA6PQorRVhQT1JURURfU1lNQk9MX0xJU1RfZGFyd2luIDo9IC1XbCwtZXhwb3J0ZWRfc3ltYm9sc19saXN0LAorRVhQT1JURURfU1lNQk9MX0xJU1RfbGludXggOj0gLVdsLC0tdmVyc2lvbi1zY3JpcHQ9CisKK3N5bWJvbC1maWxlLWxpbmtlci1mbGFncyA9ICQoRVhQT1JURURfU1lNQk9MX0xJU1RfJChCVUlMRF9UQVJHRVRfT1MpKSQxCisKKyMgR2VuZXJhdGUgYW5kIGNvbXBpbGUgc291cmNlIGZpbGUgdGhyb3VnaCB0aGUgUXQgJ21vYycgdG9vbAorIyBOT1RFOiBUaGlzIGV4cGVjdHMgUVRfTU9DX1RPT0wgdG8gYmUgZGVmaW5lZC4KK2RlZmluZSBjb21waWxlLXF0LW1vYy1zb3VyY2UKK1NSQzo9JCgxKQorTU9DX1NSQzo9JCQoTE9DQUxfT0JKU19ESVIpL21vY18kJChub3RkaXIgJCQoU1JDOiUuaD0lLmNwcCkpCitpZmVxICgsJCQoc3RyaXAgJCQoUVRfTU9DX1RPT0wpKSkKKyQkKGVycm9yIFFUX01PQ19UT09MIGlzIG5vdCBkZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGdlbmVyYXRlICQkKE1PQ19TUkMpICEhKQorZW5kaWYKKworIyBPUyBYIGlzIG5vdCBoYXBweSB3aXRoIHRoZSByZWxhdGl2ZSBpbmNsdWRlIHBhdGggaWYgdGhlIGludGVybWVkaWF0ZQorIyBidWlsZCBkaXJlY3RvcnkgaXMgdW5kZXIgYSBzeW1saW5rLiBTbyB3ZSdyZSBnb2luZyB0byBmb3JjZSBtb2MgdG8gdXNlIHRoZQorIyBhYnNvbHV0ZSBwYXRoIHdpdGggdGhlIHBhdGggcHJlZml4IGZsYWcgKC1wKS4KKyQkKE1PQ19TUkMpOiBQUklWQVRFX1NSQ19ESVIgOj0gJCQoYWJzcGF0aCAkJChkaXIgJCQoTE9DQUxfUEFUSCkvJCQoU1JDKSkpCiskJChNT0NfU1JDKTogUFJJVkFURV9TUkMgOj0gJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorJCQoTU9DX1NSQyk6IFBSSVZBVEVfRFNUIDo9ICQkKE1PQ19TUkMpCiskJChNT0NfU1JDKTogJCQoUFJJVkFURV9TUkMpICQkKE1PQ19UT09MKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9EU1QpKQorCUBlY2hvICJRdCBtb2M6ICQkKG5vdGRpciAkJChQUklWQVRFX0RTVCkpIDwtLSAkJChQUklWQVRFX1NSQykiCisJJChoaWRlKSAkJChRVF9NT0NfVE9PTCkgLW8gJCQoUFJJVkFURV9EU1QpICQkKFBSSVZBVEVfU1JDKSAtcCAkJChQUklWQVRFX1NSQ19ESVIpCisKKyQkKGV2YWwgJCQoY2FsbCBjb21waWxlLWdlbmVyYXRlZC1jeHgtc291cmNlLCQkKE1PQ19TUkMpKSkKK2VuZGVmCisKKyMgR2VuZXJhdGUgYW5kIGNvbXBpbGUgYSBRdCByZXNvdXJjZSBzb3VyY2UgZmlsZSB0aHJvdWdoIHRoZSAncmNjJyB0b29sLgorIyBOT1RFOiBUaGlzIGV4cGVjdHMgUVRfUkNDX1RPT0wgdG8gYmUgZGVmaW5lZC4KK2RlZmluZSBjb21waWxlLXF0LXJlc291cmNlcworU1JDIDo9ICQoMSkKK1JDQ19TUkMgOj0gJCQoTE9DQUxfT0JKU19ESVIpL3JjY18kJChub3RkaXIgJCQoU1JDOiUucXJjPSUuY3BwKSkKK2lmZXEgKCwkJChzdHJpcCAkJChRVF9SQ0NfVE9PTCkpKQorJCQoZXJyb3IgUVRfUkNDX1RPT0wgaXMgbm90IGRlZmluZWQgd2hlbiB0cnlpbmcgdG8gZ2VuZXJhdGUgJCQoUkNDX1NSQykgISEpCitlbmRpZgorJCQoUkNDX1NSQyk6IFBSSVZBVEVfU1JDIDo9ICQkKExPQ0FMX1BBVEgpLyQkKFNSQykKKyQkKFJDQ19TUkMpOiBQUklWQVRFX0RTVCA6PSAkJChSQ0NfU1JDKQorJCQoUkNDX1NSQyk6IFBSSVZBVEVfTkFNRSA6PSAkJChub3RkaXIgJCQoU1JDOiUucXJjPSUpKQorJCQoUkNDX1NSQyk6ICQkKFBSSVZBVEVfU1JDKSAkJChRVF9SQ0NfVE9PTCkKKwlAbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfRFNUKSkKKwlAZWNobyAiUXQgcmNjOiAkJChub3RkaXIgJCQoUFJJVkFURV9EU1QpKSA8LS0gJCQoUFJJVkFURV9TUkMpIgorCSQoaGlkZSkgJCQoUVRfUkNDX1RPT0wpIC1vICQkKFBSSVZBVEVfRFNUKSAtLW5hbWUgJCQoUFJJVkFURV9OQU1FKSAkJChQUklWQVRFX1NSQykKKworJCQoZXZhbCAkJChjYWxsIGNvbXBpbGUtZ2VuZXJhdGVkLWN4eC1zb3VyY2UsJCQoUkNDX1NSQykpKQorZW5kZWYKKworIyBQcm9jZXNzIGEgUXQgLnVpIHNvdXJjZSBmaWxlIHRocm91Z2ggdGhlICd1aWMnIHRvb2wgdG8gZ2VuZXJhdGUgYSBoZWFkZXIuCisjIE5PVEU6IFRoaXMgZXhwZWN0cyBRVF9VSUNfVE9PTCBhbmQgUVRfVUlDX1RPT0xfTERQQVRIIHRvIGJlIGRlZmluZWQuCitkZWZpbmUgY29tcGlsZS1xdC11aWMtc291cmNlCitTUkMgOj0gJCgxKQorVUlDX1NSQyA6PSAkJChMT0NBTF9PQkpTX0RJUikvdWlfJCQobm90ZGlyICQkKFNSQzolLnVpPSUuaCkpCitpZmVxICgsJCQoc3RyaXAgJCQoUVRfVUlDX1RPT0wpKSkKKyQkKGVycm9yIFFUX1VJQ19UT09MIGlzIG5vdCBkZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGdlbmVyYXRlICQkKFVJQ19TUkMpICEhKQorZW5kaWYKK2lmZXEgKCwkJChzdHJpcCAkJChRVF9VSUNfVE9PTF9MRFBBVEgpKSkKKyQkKGVycm9yIFFUX1VJQ19UT09MX0xEUEFUSCBpcyBub3QgZGVmaW5lZCB3aGVuIHRyeWluZyB0byBnZW5lcmF0ZSAkJChVSUNfU1JDKSAhISkKK2VuZGlmCiskJChVSUNfU1JDKTogUFJJVkFURV9TUkMgOj0gJCQoTE9DQUxfUEFUSCkvJCQoU1JDKQorJCQoVUlDX1NSQyk6IFBSSVZBVEVfRFNUIDo9ICQkKFVJQ19TUkMpCiskJChVSUNfU1JDKTogJCQoUFJJVkFURV9TUkMpICQkKFFUX1VJQ19UT09MKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9EU1QpKQorCUBlY2hvICJRdCB1aWM6ICQkKG5vdGRpciAkJChQUklWQVRFX0RTVCkpIDwtLSAkJChQUklWQVRFX1NSQykiCisJJChoaWRlKSAkJChjYWxsIHNldC1ob3N0LWxpYnJhcnktc2VhcmNoLXBhdGgsJCQoUVRfVUlDX1RPT0xfTERQQVRIKSkgJCQoUVRfVUlDX1RPT0wpIC1vICQkKFBSSVZBVEVfRFNUKSAkJChQUklWQVRFX1NSQykKKworTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJCQoVUlDX1NSQykKK2VuZGVmCisKKyMgR2VuZXJhdGUgYW5kIGNvbXBpbGUgYSAucHJvdG8gUHJvdG9idWYgc291cmNlIGZpbGUgdGhyb3VnaCB0aGUgJ3Byb3RvYycgdG9vbC4KKyMgTk9URTogVGhpcyBleHBlY3RzIFBST1RPQ19UT09MIHRvIGJlIGRlZmluZWQuCitkZWZpbmUgY29tcGlsZS1wcm90by1zb3VyY2UKK1NSQyA6PSAkKDEpCitPVVRfU1JDIDo9ICQkKGdlbmVyYXRlZC1wcm90by1zb3VyY2VzLWRpcikvJCQoU1JDOiUucHJvdG89JS5wYi5jYykKK2lmZXEgKCwkJChzdHJpcCAkJChQUk9UT0NfVE9PTCkpKQorICAgICQkKGVycm9yIFBST1RPQ19UT09MIGlzIG5vdCBkZWZpbmVkIHdoZW4gdHJ5aW5nIHRvIGdlbmVyYXRlICQkKE9VVF9TUkMpICEhKQorZW5kaWYKKyQkKE9VVF9TUkMpOiBQUklWQVRFX1NSQyA6PSAkJChMT0NBTF9QQVRIKS8kJChTUkMpCiskJChPVVRfU1JDKTogUFJJVkFURV9EU1RfRElSIDo9ICQkKGRpciAkJChPVVRfU1JDKSkKKyQkKE9VVF9TUkMpOiBQUklWQVRFX0RTVCA6PSAkJChPVVRfU1JDKQorJCQoT1VUX1NSQyk6IFBSSVZBVEVfTkFNRSA6PSAkJChub3RkaXIgJCQoU1JDOiUucHJvdG89JSkpCiskJChPVVRfU1JDKTogJCQoUFJJVkFURV9TUkMpICQkKFBST1RPQ19UT09MKQorCUBta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9EU1QpKQorCUBlY2hvICJQcm90b2M6ICQkKG5vdGRpciAkJChQUklWQVRFX0RTVCkpIDwtLSAkJChQUklWQVRFX1NSQykiCisJJChoaWRlKSAkJChQUk9UT0NfVE9PTCkgLUkkJChkaXIgJCQoUFJJVkFURV9TUkMpKSAtLWNwcF9vdXQ9JCQoUFJJVkFURV9EU1RfRElSKSAkJChQUklWQVRFX1NSQykKKworJCQoZXZhbCAkJChjYWxsIGNvbXBpbGUtZ2VuZXJhdGVkLWN4eC1zb3VyY2UsJCQoT1VUX1NSQykpKQorZW5kZWYKKworIyBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gZm9yY2UgYSBtb2R1bGUgdG8gbGluayBzdGF0aWNhbGx5IHRvIHRoZSBDKysgc3RhbmRhcmQKKyMgbGlicmFyeSBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0IChpLmUuIExpbnV4IGFuZCBXaW5kb3dzKS4KKyMKKyMgTk9URTogT24gV2luZG93cywgcmVjZW50IE1pbmd3IHZlcnNpb25zIGFkZCBzdXBwb3J0IGZvciBzdGQ6OnRocmVhZCB0aHJvdWdoCisjICAgICAgIHRoZSBsaWJ3aW5wdGhyZWFkLTEgbGlicmFyeSwgd2hpY2ggbGlic3RkYysrIGRlcGVuZHMgb24sIHJlcXVpcmluZworIyAgICAgICBzcGVjaWFsIGxpbmstdGltZSBmbGFncyAoaW5zdGVhZCBvZiB0aGUgY2xhc3NpYyAtc3RhdGljLWxpYnN0ZGMrKykuCisjCisjICAgICAgIFdlIGRldGVjdCB3aGV0aGVyIHRoaXMgaXMgdGhlIGNhc2UgYnkgaW5zcGVjdGluZyB0aGUgY29udGVudCBvZgorIyAgICAgICBQUkVCVUlMVF9QQVRIX1BBSVJTLCB3aGljaCBpcyBzZXQgYnkgY29uZmlnLm1ha2UsIHRoZSBhdXRvLWdlbmVyYXRlZAorIyAgICAgICBmaWxlIHRoYXQgY29tZXMgZnJvbSBydW5uaW5nICdhbmRyb2lkL2NvbmZpZ3VyZS5zaCAtLW1pbmd3JworIworX0hBU19XSU5QVEhSRUFEIDo9ICQoaWYgJChmaWx0ZXIgJWxpYndpbnB0aHJlYWQtMS5kbGwsJChQUkVCVUlMVF9QQVRIX1BBSVJTKSksdHJ1ZSkKKworbG9jYWwtbGluay1zdGF0aWMtYysrbGliID0gJChldmFsICQoZXYtbG9jYWwtbGluay1zdGF0aWMtYysrbGliKSkKK2RlZmluZSBldi1sb2NhbC1saW5rLXN0YXRpYy1jKytsaWIKK2lmZXEgKGRhcndpbiwkKEJVSUxEX1RBUkdFVF9PUykpCitMT0NBTF9MRExJQlMgKz0gJChDWFhfU1REX0xJQikKK2Vsc2UKK2lmZXEgKHRydWUsJChfSEFTX1dJTlBUSFJFQUQpKQorTE9DQUxfTERMSUJTICs9IC1XbCwtQnN0YXRpYyAtbHN0ZGMrKyAtbHdpbnB0aHJlYWQgLVdsLC1CZHluYW1pYworZWxzZSAjICFsaWJ3aW5wdGhyZWFkCitMT0NBTF9MRCA6PSAkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLENYWCkKK0xPQ0FMX0xETElCUyArPSAtc3RhdGljLWxpYnN0ZGMrKworZW5kaWYgICMgIV9IQVNfV0lOUFRIUkVBRAorZW5kaWYgICMgQlVJTERfVEFSR0VUX09TICE9IGRhcndpbgorZW5kZWYKKworaWZuZXEgKCwkKEJVSUxEX1NZU1RFTV9VTklUX1RFU1RTKSkKKyQoY2FsbCAtYnVpbGQtcnVuLWFsbC10ZXN0cykKK2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2dldGRpci5tYWtlIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9nZXRkaXIubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjZmMzdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9nZXRkaXIubWFrZQpAQCAtMCwwICsxLDE5IEBACisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHVzZWQgdG8gcmV0dXJuIGluICdkaXInIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0KKyMgd2UgcmVhbGx5IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHQKKyMKK2RpciA6PSAkKEJVSUxEX1RBUkdFVF9PUykKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvaG9zdF9leGVjdXRhYmxlLm1ha2UgYi9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2hvc3RfZXhlY3V0YWJsZS5tYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjM3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2hvc3RfZXhlY3V0YWJsZS5tYWtlCkBAIC0wLDAgKzEsNDggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgZmlyc3QsIGNhbGwgYSBsaWJyYXJ5IGNvbnRhaW5pbmcgYWxsIG9iamVjdCBmaWxlcworTE9DQUxfQlVJTFRfTU9EVUxFIDo9ICQoY2FsbCBsb2NhbC1leGVjdXRhYmxlLXBhdGgsJChMT0NBTF9NT0RVTEUpKQoraW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3IvYmluYXJ5Lm1ha2UKKworTE9DQUxfTElCUkFSSUVTIDo9ICQoZm9yZWFjaCBsaWIsXAorICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSxcCisgICAgJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKQorCitMT0NBTF9MRExJQlMgOj0gXAorICAgICQoY2FsbCBsb2NhbC1zdGF0aWMtbGlicmFyaWVzLWxkbGlicykgXAorICAgICQoZm9yZWFjaCBsaWIsJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKSwkKGNhbGwgbG9jYWwtc2hhcmVkLWxpYnJhcnktcGF0aCwkKGxpYikpKSBcCisgICAgJChMT0NBTF9MRExJQlMpCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9MREZMQUdTIDo9ICQoTERGTEFHUykgJChMT0NBTF9MREZMQUdTKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0xETElCUyAgOj0gJChMT0NBTF9MRExJQlMpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfTEQgICAgICA6PSAkKExPQ0FMX0xEKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX09CSlMgICAgOj0gJChMT0NBTF9PQkpFQ1RTKQorCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfT0JKRUNUUykgJChMT0NBTF9MSUJSQVJJRVMpCisJQCBta2RpciAtcCAkKGRpciAkQCkKKwlAIGVjaG8gIkV4ZWN1dGFibGU6ICRAIgorCSQoaGlkZSkgJChQUklWQVRFX0xEKSAkKFBSSVZBVEVfTERGTEFHUykgLW8gJEAgJChQUklWQVRFX0xJQlJBUlkpICQoUFJJVkFURV9PQkpTKSAkKFBSSVZBVEVfTERMSUJTKQorCitfQlVJTERfRVhFQ1VUQUJMRVMgKz0gJChMT0NBTF9CVUlMVF9NT0RVTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoZm9yZWFjaCBsaWIsJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSwkKGNhbGwgbG9jYWwtbGlicmFyeS1wYXRoLCQobGliKSkpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoZm9yZWFjaCBsaWIsJChMT0NBTF9TSEFSRURfTElCUkFSSUVTKSwkKGNhbGwgbG9jYWwtc2hhcmVkLWxpYnJhcnktcGF0aCwkKGxpYikpKQorCitpZmVxICh0cnVlLCQoTE9DQUxfSU5TVEFMTCkpCitMT0NBTF9JTlNUQUxMX01PRFVMRSA6PSAkKGNhbGwgbG9jYWwtZXhlY3V0YWJsZS1pbnN0YWxsLXBhdGgsJChMT0NBTF9NT0RVTEUpKQorJChldmFsICQoY2FsbCBpbnN0YWxsLWJpbmFyeSwkKExPQ0FMX0JVSUxUX01PRFVMRSksJChMT0NBTF9JTlNUQUxMX01PRFVMRSksLS1zdHJpcC1hbGwpKQorCitpbmNsdWRlICQoX0JVSUxEX0NPUkVfRElSKS9lbXVsYXRvci9zeW1ib2xzLm1ha2UKK2VuZGlmICAjIExPQ0FMX0lOU1RBTEwgPT0gdHJ1ZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9ob3N0X3NoYXJlZF9saWJyYXJ5Lm1ha2UgYi9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL2hvc3Rfc2hhcmVkX2xpYnJhcnkubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JmNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9ob3N0X3NoYXJlZF9saWJyYXJ5Lm1ha2UKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBmaXJzdCwgY2FsbCBhIGxpYnJhcnkgY29udGFpbmluZyBhbGwgb2JqZWN0IGZpbGVzCitMT0NBTF9CVUlMVF9NT0RVTEUgOj0gJChjYWxsIGxvY2FsLXNoYXJlZC1saWJyYXJ5LXBhdGgsJChMT0NBTF9NT0RVTEUpKQoraW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3IvYmluYXJ5Lm1ha2UKKworTE9DQUxfTElCUkFSSUVTIDo9ICQoZm9yZWFjaCBsaWIsXAorICAgICQoTE9DQUxfV0hPTEVfU1RBVElDX0xJQlJBUklFUykgJChMT0NBTF9TVEFUSUNfTElCUkFSSUVTKSxcCisgICAgJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKQorCitMT0NBTF9MRExJQlMgOj0gJChjYWxsIGxvY2FsLXN0YXRpYy1saWJyYXJpZXMtbGRsaWJzKSAkKExPQ0FMX0xETElCUykKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0xERkxBR1MgOj0gJChMREZMQUdTKSAkKExPQ0FMX0xERkxBR1MpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfTERMSUJTICA6PSAkKExPQ0FMX0xETElCUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9MRCAgICAgIDo9ICQoTE9DQUxfTEQpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfT0JKUyAgICA6PSAkKExPQ0FMX09CSkVDVFMpCisKK0xPQ0FMX1NZTUJPTF9GSUxFIDo9ICQoc3RyaXAgJChMT0NBTF9TWU1CT0xfRklMRSkpCitpZmRlZiBMT0NBTF9TWU1CT0xfRklMRQorJChldmFsICQoY2FsbCBnZW5lcmF0ZS1zeW1ib2wtZmlsZSwkKExPQ0FMX1BBVEgpLyQoTE9DQUxfU1lNQk9MX0ZJTEUpKSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9HRU5FUkFURURfU1lNQk9MX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfTERGTEFHUyArPSAkKGNhbGwgc3ltYm9sLWZpbGUtbGlua2VyLWZsYWdzLCQoTE9DQUxfR0VORVJBVEVEX1NZTUJPTF9GSUxFKSkKK2VuZGlmCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9PQkpFQ1RTKSAkKExPQ0FMX0xJQlJBUklFUykKKwlAIG1rZGlyIC1wICQoZGlyICRAKQorCUAgZWNobyAiU2hhcmVkTGlicmFyeTogJEAiCisJJChoaWRlKSAkKFBSSVZBVEVfTEQpICQoUFJJVkFURV9MREZMQUdTKSAtc2hhcmVkIC1vICRAICQoUFJJVkFURV9MSUJSQVJZKSAkKFBSSVZBVEVfT0JKUykgJChQUklWQVRFX0xETElCUykKKworX0JVSUxEX0VYRUNVVEFCTEVTICs9ICQoTE9DQUxfQlVJTFRfTU9EVUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGZvcmVhY2ggbGliLCQoTE9DQUxfU1RBVElDX0xJQlJBUklFUyksJChjYWxsIGxvY2FsLWxpYnJhcnktcGF0aCwkKGxpYikpKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKGZvcmVhY2ggbGliLCQoTE9DQUxfU0hBUkVEX0xJQlJBUklFUyksJChjYWxsIGxvY2FsLXNoYXJlZC1saWJyYXJ5LXBhdGgsJChsaWIpKSkKKworaWZlcSAodHJ1ZSwkKExPQ0FMX0lOU1RBTEwpKQorTE9DQUxfSU5TVEFMTF9NT0RVTEUgOj0gJChjYWxsIGxvY2FsLXNoYXJlZC1saWJyYXJ5LWluc3RhbGwtcGF0aCwkKExPQ0FMX01PRFVMRSkpCiskKGV2YWwgJChjYWxsIGluc3RhbGwtYmluYXJ5LCQoTE9DQUxfQlVJTFRfTU9EVUxFKSwkKExPQ0FMX0lOU1RBTExfTU9EVUxFKSwtLXN0cmlwLXVubmVlZGVkKSkKKworaW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3Ivc3ltYm9scy5tYWtlCitlbmRpZiAgIyBMT0NBTF9JTlNUQUxMID09IHRydWUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvaG9zdF9zdGF0aWNfbGlicmFyeS5tYWtlIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9ob3N0X3N0YXRpY19saWJyYXJ5Lm1ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5MzVmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvaG9zdF9zdGF0aWNfbGlicmFyeS5tYWtlCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgYSBob3N0IGV4ZWN1dGFibGUsIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCBleGVjdXRhYmxlIHNob3VsZCBiZQorIyBwdXQgaW4gTE9DQUxfQlVJTFRfTU9EVUxFIGZvciB1c2UgYnkgdGhlIGNhbGxlcgorIworCisjJChpbmZvIFNUQVRJQ19MSUJSQVJZIFNSQ1M9JChMT0NBTF9TUkNfRklMRVMpKQorTE9DQUxfQlVJTFRfTU9EVUxFIDo9ICQoY2FsbCBsb2NhbC1saWJyYXJ5LXBhdGgsJChMT0NBTF9NT0RVTEUpKQorTE9DQUxfQ0MgPz0gJChjYWxsIGxvY2FsLWJ1aWxkLXZhcixDQykKK0xPQ0FMX0NYWCA/PSAkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLENYWCkKK2luY2x1ZGUgJChfQlVJTERfQ09SRV9ESVIpL2VtdWxhdG9yL2JpbmFyeS5tYWtlCisKK0xPQ0FMX0FSIDo9ICQoc3RyaXAgJChMT0NBTF9BUikpCitpZm5kZWYgTE9DQUxfQVIKKyAgICBMT0NBTF9BUiA6PSAkKGNhbGwgbG9jYWwtYnVpbGQtdmFyLEFSKQorZW5kaWYKK0FSRkxBR1MgOj0gY3JzCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BUiA6PSAkKExPQ0FMX0FSKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX09CSkVDVFMgOj0gJChMT0NBTF9PQkpFQ1RTKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX09CSkVDVFMpCisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBlY2hvICJMaWJyYXJ5OiAkQCIKKwkkKGhpZGUpICQoUFJJVkFURV9BUikgJChBUkZMQUdTKSAkQCAkKFBSSVZBVEVfT0JKRUNUUykKKworX0JVSUxEX0xJQlJBUklFUyArPSAkKExPQ0FMX0JVSUxUX01PRFVMRSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvbWFpbi5tYWtlIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9tYWluLm1ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1MTBmOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvbWFpbi5tYWtlCkBAIC0wLDAgKzEsODIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgZGlzYWJsZSBpbXBsaWNpdCBydWxlcworLlNVRkZJWEVTOgorJTo6ICUsdgorJTo6IFJDUy8lCislOjogUkNTLyUsdgorJTo6IHMuJQorJTo6IFNDQ1Mvcy4lCislLmM6ICUudyAlLmNoCisKKyMgdGhpcyBpcyBhIHNldCBvZiBkZWZpbml0aW9ucyB0aGF0IGFsbG93IHRoZSB1c2FnZSBvZiBNYWtlZmlsZS5hbmRyb2lkCisjIGV2ZW4gaWYgd2UncmUgbm90IHVzaW5nIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbS4KKyMKKworQlVJTERfT0JKU19ESVIgOj0gb2JqcworCitfQlVJTERfQ09SRV9ESVIgIDo9IGFuZHJvaWQvYnVpbGQKK19CVUlMRF9DT05GSUdfTUFLRSA6PSAkKEJVSUxEX09CSlNfRElSKS9idWlsZC9jb25maWcubWFrZQorX0JVSUxEX0NPTkZJR19IT1NUX0ggOj0gJChCVUlMRF9PQkpTX0RJUikvYnVpbGQvY29uZmlnLWhvc3QuaAorX0JVSUxEX1NZTUJPTFNfRElSIDo9ICQoQlVJTERfT0JKU19ESVIpL2J1aWxkL3N5bWJvbHMKK19CVUlMRF9ERUJVR19JTkZPX0RJUiA6PSAkKEJVSUxEX09CSlNfRElSKS9idWlsZC9kZWJ1Z19pbmZvCisKK2lmZXEgKCQod2lsZGNhcmQgJChfQlVJTERfQ09ORklHX01BS0UpKSwpCisgICAgJChlcnJvciAiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAnJChfQlVJTERfQ09ORklHX01BS0UpJyBkb2Vzbid0IGV4aXN0LCBwbGVhc2UgcnVuIHRoZSAnYW5kcm9pZC9jb25maWd1cmUuc2gnIHNjcmlwdCIpCitlbmRpZgorCitpbmNsdWRlICQoX0JVSUxEX0NPTkZJR19NQUtFKQoraW5jbHVkZSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3IvZGVmaW5pdGlvbnMubWFrZQorCisuUEhPTlk6IGFsbCBsaWJyYXJpZXMgZXhlY3V0YWJsZXMgY2xlYW4gY2xlYW4tY29uZmlnIGNsZWFuLW9ianMtZGlyIFwKKyAgICAgICAgY2xlYW4tZXhlY3V0YWJsZXMgY2xlYW4tbGlicmFyaWVzCisKK0NMRUFSX1ZBUlMgICAgICAgICAgICAgICAgOj0gJChfQlVJTERfQ09SRV9ESVIpL2VtdWxhdG9yL2NsZWFyX3ZhcnMubWFrZQorQlVJTERfSE9TVF9FWEVDVVRBQkxFICAgICA6PSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3IvaG9zdF9leGVjdXRhYmxlLm1ha2UKK0JVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkgOj0gJChfQlVJTERfQ09SRV9ESVIpL2VtdWxhdG9yL2hvc3Rfc3RhdGljX2xpYnJhcnkubWFrZQorQlVJTERfSE9TVF9TSEFSRURfTElCUkFSWSA6PSAkKF9CVUlMRF9DT1JFX0RJUikvZW11bGF0b3IvaG9zdF9zaGFyZWRfbGlicmFyeS5tYWtlCitQUkVCVUlMVF9TVEFUSUNfTElCUkFSWSAgIDo9ICQoX0JVSUxEX0NPUkVfRElSKS9lbXVsYXRvci9wcmVidWlsdF9zdGF0aWNfbGlicmFyeS5tYWtlCisKK19CVUlMRF9ERVBFTkRFTkNZX0RJUlMgOj0KKworYWxsOiBsaWJyYXJpZXMgZXhlY3V0YWJsZXMgc3ltYm9scyBkZWJ1Z2luZm8KK19CVUlMRF9FWEVDVVRBQkxFUyA6PQorX0JVSUxEX1NZTUJPTFMgOj0KK19CVUlMRF9MSUJSQVJJRVMgOj0KK19CVUlMRF9ERUJVR19JTkZPUyA6PQorCitjbGVhbjogY2xlYW4taW50ZXJtZWRpYXRlcworCitkaXN0Y2xlYW46IGNsZWFuIGNsZWFuLWNvbmZpZworCisjIGxldCdzIHJvbGwKK2luY2x1ZGUgJChfQlVJTERfQ09SRV9ESVIpL01ha2VmaWxlLnRvcC5taworCitsaWJyYXJpZXM6ICQoX0JVSUxEX0xJQlJBUklFUykKK2V4ZWN1dGFibGVzOiAkKF9CVUlMRF9FWEVDVVRBQkxFUykKK3N5bWJvbHM6ICQoX0JVSUxEX1NZTUJPTFMpCitkZWJ1Z2luZm86ICQoX0JVSUxEX0RFQlVHX0lORk9TKQorCitjbGVhbi1pbnRlcm1lZGlhdGVzOgorCXJtIC1yZiAkKEJVSUxEX09CSlNfRElSKS9pbnRlcm1lZGlhdGVzICQoX0JVSUxEX0VYRUNVVEFCTEVTKSBcCisJICAgICQoX0JVSUxEX0xJQlJBUklFUykgJChfQlVJTERfU1lNQk9MUykgJChfQlVJTERfU1lNQk9MU19ESVIpCisKK2NsZWFuLWNvbmZpZzoKKwlybSAtZiAkKF9CVUlMRF9DT05GSUdfTUFLRSkgJChfQlVJTERfQ09ORklHX0hPU1RfSCkKKworIyBpbmNsdWRlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24KK19CVUlMRF9ERVBFTkRFTkNZX0RJUlMgOj0gJChzb3J0ICQoX0JVSUxEX0RFUEVOREVOQ1lfRElSUykpCistaW5jbHVkZSAkKHdpbGRjYXJkICQoX0JVSUxEX0RFUEVOREVOQ1lfRElSUzolPSUvKi5kKSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvcHJlYnVpbHRfc3RhdGljX2xpYnJhcnkubWFrZSBiL2FuZHJvaWQvYnVpbGQvZW11bGF0b3IvcHJlYnVpbHRfc3RhdGljX2xpYnJhcnkubWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGY1YTg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9lbXVsYXRvci9wcmVidWlsdF9zdGF0aWNfbGlicmFyeS5tYWtlCkBAIC0wLDAgKzEsMjQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMkKGluZm8gUFJFQlVJTFRfU1RBVElDX0xJQlJBUlkgJChMT0NBTF9NT0RVTEUpIFNSQ1M9JChMT0NBTF9TUkNfRklMRVMpKQorTE9DQUxfQlVJTFRfTU9EVUxFIDo9ICQoY2FsbCBsb2NhbC1saWJyYXJ5LXBhdGgsJChMT0NBTF9NT0RVTEUpKQorCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfU1JDX0ZJTEVTKQorCUBta2RpciAtcCAkKGRpciAkQCkKKwlAZWNobyAiUHJlYnVpbHRMaWJyYXJ5OiAkQCIKKwkkKGhpZGUpIGNwIC1mICQ8ICRACisKK19CVUlMRF9MSUJSQVJJRVMgKz0gJChMT0NBTF9CVUlMVF9NT0RVTEUpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL3N5bWJvbHMubWFrZSBiL2FuZHJvaWQvYnVpbGQvZW11bGF0b3Ivc3ltYm9scy5tYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NTJjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL2VtdWxhdG9yL3N5bWJvbHMubWFrZQpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworaWZlcSAodHJ1ZSwkKEJVSUxEX0dFTkVSQVRFX1NZTUJPTFMpKQorJChldmFsICQoY2FsbCBidWlsZC1pbnN0YWxsLWRlYnVnLWluZm8sJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQoTE9DQUxfSU5TVEFMTF9NT0RVTEUpKSkKKyQoZXZhbCAkKGNhbGwgYnVpbGQtaW5zdGFsbC1zeW1ib2wsJChMT0NBTF9CVUlMVF9NT0RVTEUpLCQoTE9DQUxfSU5TVEFMTF9NT0RVTEUpKSkKK2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2dtc2wvUkVBRE1FIGIvYW5kcm9pZC9idWlsZC9nbXNsL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTJhZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9idWlsZC9nbXNsL1JFQURNRQpAQCAtMCwwICsxLDI3IEBACitHTlUgTWFrZSBTdGFuZGFyZCBMaWJyYXJ5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFZpc2l0IGh0dHA6Ly9nbXNsLnNmLm5ldCBmb3IgbW9yZSBkZXRhaWxzCisKKzIuIFRvIHVzZSB0aGUgR01TTCBpbiB5b3VyIE1ha2VmaWxlIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIHRoZSBmaWxlcworCisgICBnbXNsCisgICBfX2dtc2wKKworICAgQWRkIAorCisgICBpbmNsdWRlIGdtc2wKKworICAgdG8geW91ciBNYWtlZmlsZShzKS4KKworMy4gVG8gcnVuIHRoZSBHTVNMIHRlc3Qgc3VpdGUgaGF2ZSAKKworICAgZ21zbAorICAgX19nbXNsCisgICBnbXNsLXRlc3RzCisKKyAgIEFuZCB0aGVuIHJ1bgorCisgICBtYWtlIC1mIGdtc2wtdGVzdHMKKworIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZ21zbC9fX2dtc2wgYi9hbmRyb2lkL2J1aWxkL2dtc2wvX19nbXNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NmZmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL2dtc2wvX19nbXNsCkBAIC0wLDAgKzEsODU0IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgR05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeSAoR01TTCkKKyMKKyMgQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggR05VIE1ha2UncyAkKGNhbGwpIHRoYXQKKyMgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIGluIHN0YW5kYXJkIEdOVSBNYWtlLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBKb2huIEdyYWhhbS1DdW1taW5nCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdNU0wKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIAorIyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpvaG4gR3JhaGFtLUN1bW1pbmcgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisjIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyMgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyBpcyB0aGUgR05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeSB2ZXJzaW9uIG51bWJlciBhcyBhIGxpc3Qgd2l0aAorIyB0aHJlZSBpdGVtczogbWFqb3IsIG1pbm9yLCByZXZpc2lvbgorCitnbXNsX3ZlcnNpb24gOj0gMSAwIDExCisKKyMgVXNlZCB0byBvdXRwdXQgd2FybmluZ3MgYW5kIGVycm9yIGZyb20gdGhlIGxpYnJhcnksIGl0J3MgcG9zc2libGUgdG8KKyMgZGlzYWJsZSBhbnkgd2FybmluZ3Mgb3IgZXJyb3JzIGJ5IG92ZXJyaWRpbmcgdGhlc2UgZGVmaW5pdGlvbnMKKyMgbWFudWFsbHkgb3IgYnkgc2V0dGluZyBHTVNMX05PX1dBUk5JTkdTIG9yIEdNU0xfTk9fRVJST1JTCisKK19fZ21zbF9uYW1lIDo9IEdOVSBNYWtlIFN0YW5kYXJkIExpYnJhcnkKK19fZ21zbF93YXJuaW5nID0gJCh3YXJuaW5nICQoX19nbXNsX25hbWUpOiAkMSkKK19fZ21zbF9lcnJvciA9ICQoZXJyb3IgJChfX2dtc2xfbmFtZSk6ICQxKQorCitpZmRlZiBHTVNMX05PX1dBUk5JTkdTCitfX2dtc2xfd2FybmluZyA6PQorZW5kaWYKK2lmZGVmIEdNU0xfTk9fRVJST1JTCitfX2dtc2xfZXJyb3IgOj0KK2VuZGlmCisKKyMgSWYgR01TTF9UUkFDRSBpcyBlbmFibGVkIHRoZW4gY2FsbHMgdG8gdGhlIGxpYnJhcnkgZnVuY3Rpb25zIGFyZQorIyB0cmFjZWQgdG8gc3Rkb3V0IHVzaW5nIHdhcm5pbmcgbWVzc2FnZXMgd2l0aCB0aGVpciBhcmd1bWVudHMKKworaWZkZWYgR01TTF9UUkFDRQorX19nbXNsX3RyMSA9ICQod2FybmluZyAkMCgnJDEnKSkKK19fZ21zbF90cjIgPSAkKHdhcm5pbmcgJDAoJyQxJywnJDInKSkKK19fZ21zbF90cjMgPSAkKHdhcm5pbmcgJDAoJyQxJywnJDInLCckMycpKQorZWxzZQorX19nbXNsX3RyMSA6PQorX19nbXNsX3RyMiA6PQorX19nbXNsX3RyMyA6PQorZW5kaWYKKworIyBGaWd1cmUgb3V0IHdoZXRoZXIgd2UgaGF2ZSAkKGV2YWwpIG9yIG5vdCAoR05VIE1ha2UgMy44MCBhbmQgYWJvdmUpCisjIGlmIHdlIGRvIG5vdCB0aGVuIG91dHB1dCBhIHdhcm5pbmcgbWVzc2FnZSwgaWYgd2UgZG8gdGhlbiBzb21lCisjIGZ1bmN0aW9ucyB3aWxsIGJlIGVuYWJsZWQuCisKK19fZ21zbF9oYXZlX2V2YWwgOj0gJChmYWxzZSkKK19fZ21zbF9pZ25vcmUgOj0gJChldmFsIF9fZ21zbF9oYXZlX2V2YWwgOj0gJCh0cnVlKSkKKworIyBJZiB0aGlzIGlzIGJlaW5nIHJ1biB3aXRoIEVsZWN0cmljIENsb3VkJ3MgZW1ha2UgdGhlbiB3YXJuIHRoYXQKKyMgdGhlaXIgJChldmFsKSBzdXBwb3J0IGlzIGluY29tcGxldGUuCisKK2lmZGVmIEVDTE9VRF9CVUlMRF9JRAorJCh3YXJuaW5nIFlvdSBhcmUgdXNpbmcgRWxlY3RyaWMgQ2xvdWQncyBlbWFrZSB3aGljaCBoYXMgaW5jb21wbGV0ZSAkJChldmFsKSBzdXBwb3J0KQorX19nbXNsX2hhdmVfZXZhbCA6PSAkKGZhbHNlKQorZW5kaWYKKworIyBTZWUgaWYgd2UgaGF2ZSAkKGxhc3R3b3JkKSAoR05VIE1ha2UgMy44MSBhbmQgYWJvdmUpCisKK19fZ21zbF9oYXZlX2xhc3R3b3JkIDo9ICQobGFzdHdvcmQgJChmYWxzZSkgJCh0cnVlKSkKKworIyBTZWUgaWYgd2UgaGF2ZSBuYXRpdmUgb3IgYW5kIGFuZCAoR05VIE1ha2UgMy44MSBhbmQgYWJvdmUpCisKK19fZ21zbF9oYXZlX29yIDo9ICQoaWYgJChmaWx0ZXItb3V0IHVuZGVmaW5lZCwgIFwKKyAgICAkKG9yaWdpbiBvcikpLCQoY2FsbCBvciwkKHRydWUpLCQoZmFsc2UpKSkKK19fZ21zbF9oYXZlX2FuZCA6PSAkKGlmICQoZmlsdGVyLW91dCB1bmRlZmluZWQsIFwKKyAgICAkKG9yaWdpbiBhbmQpKSwkKGNhbGwgYW5kLCQodHJ1ZSksJCh0cnVlKSkpCisKK2lmbmVxICgkKF9fZ21zbF9oYXZlX2V2YWwpLCQodHJ1ZSkpCiskKGNhbGwgX19nbXNsX3dhcm5pbmcsR05VIE1ha2UgJChNQUtFX1ZFUlNJT04pIGRvZXMgbm90IHN1cHBvcnQgJCQkJChldmFsKTogc29tZSBmdW5jdGlvbnMgZGlzYWJsZWQpCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBnbXNsX2NvbXBhdGlibGUKKyMgQXJndW1lbnRzOiBMaXN0IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgbGlicmFyeSB2ZXJzaW9uIG51bWJlciAobWFqIG1pbiByZXYpCisjIFJldHVybnM6ICAgJCh0cnVlKSBpZiB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgaXMgY29tcGF0aWJsZQorIyAgICAgICAgICAgIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIG51bWJlciwgb3RoZXJ3aXNlICQoZmFsc2UpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2dtc2xfY29tcGF0aWJsZSA9ICQoc3RyaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICQoaWYgJChjYWxsIGd0LCQod29yZCAxLCQxKSwkKHdvcmQgMSwkKGdtc2xfdmVyc2lvbikpKSwgICAgICAgICAgICAgICBcCisgICAgICAgICQoZmFsc2UpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJChpZiAkKGNhbGwgbHQsJCh3b3JkIDEsJDEpLCQod29yZCAxLCQoZ21zbF92ZXJzaW9uKSkpLCAgICAgICAgICAgXAorICAgICAgICAgICAgJCh0cnVlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAkKGlmICQoY2FsbCBndCwkKHdvcmQgMiwkMSksJCh3b3JkIDIsJChnbXNsX3ZlcnNpb24pKSksICAgICAgIFwKKyAgICAgICAgICAgICAgICAkKGZhbHNlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICQoaWYgJChjYWxsIGx0LCQod29yZCAyLCQxKSwkKHdvcmQgMiwkKGdtc2xfdmVyc2lvbikpKSwgICBcCisgICAgICAgICAgICAgICAgICAgICQodHJ1ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgJChjYWxsIGx0ZSwkKHdvcmQgMywkMSksJCh3b3JkIDMsJChnbXNsX3ZlcnNpb24pKSkpKSkpKQorCisjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBMT0dJQ0FMIE9QRVJBVE9SUworIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBub3QgaXMgZGVmaW5lZCBpbiBnbXNsCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGFuZAorIyBBcmd1bWVudHM6IFR3byBib29sZWFuIHZhbHVlcworIyBSZXR1cm5zOiAgIFJldHVybnMgJCh0cnVlKSBpZiBib3RoIG9mIHRoZSBib29sZWFucyBhcmUgdHJ1ZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpZm5lcSAoJChfX2dtc2xfaGF2ZV9hbmQpLCQodHJ1ZSkpCithbmQgPSAkKF9fZ21zbF90cjIpJChpZiAkMSwkKGlmICQyLCQodHJ1ZSksJChmYWxzZSkpLCQoZmFsc2UpKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgb3IKKyMgQXJndW1lbnRzOiBUd28gYm9vbGVhbiB2YWx1ZXMKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgZWl0aGVyIG9mIHRoZSBib29sZWFucyBpcyB0cnVlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lmbmVxICgkKF9fZ21zbF9oYXZlX29yKSwkKHRydWUpKQorb3IgPSAkKF9fZ21zbF90cjIpJChpZiAkMSQyLCQodHJ1ZSksJChmYWxzZSkpCitlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICB4b3IKKyMgQXJndW1lbnRzOiBUd28gYm9vbGVhbiB2YWx1ZXMKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgZXhhY3RseSBvbmUgb2YgdGhlIGJvb2xlYW5zIGlzIHRydWUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoreG9yID0gJChfX2dtc2xfdHIyKSQoaWYgJDEsJChpZiAkMiwkKGZhbHNlKSwkKHRydWUpKSwkKGlmICQyLCQodHJ1ZSksJChmYWxzZSkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBuYW5kCisjIEFyZ3VtZW50czogVHdvIGJvb2xlYW4gdmFsdWVzCisjIFJldHVybnM6ICAgUmV0dXJucyB2YWx1ZSBvZiAnbm90IGFuZCcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbmFuZCA9ICQoX19nbXNsX3RyMikkKGlmICQxLCQoaWYgJDIsJChmYWxzZSksJCh0cnVlKSksJCh0cnVlKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgbm9yCisjIEFyZ3VtZW50czogVHdvIGJvb2xlYW4gdmFsdWVzCisjIFJldHVybnM6ICAgUmV0dXJucyB2YWx1ZSBvZiAnbm90IG9yJworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitub3IgPSAkKF9fZ21zbF90cjIpJChpZiAkMSQyLCQoZmFsc2UpLCQodHJ1ZSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHhub3IKKyMgQXJndW1lbnRzOiBUd28gYm9vbGVhbiB2YWx1ZXMKKyMgUmV0dXJuczogICBSZXR1cm5zIHZhbHVlIG9mICdub3QgeG9yJworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit4bm9yID0kKF9fZ21zbF90cjIpJChpZiAkMSwkKGlmICQyLCQodHJ1ZSksJChmYWxzZSkpLCQoaWYgJDIsJChmYWxzZSksJCh0cnVlKSkpCisKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIExJU1QgTUFOSVBVTEFUSU9OIEZVTkNUSU9OUworIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgZmlyc3QgKHNhbWUgYXMgTElTUCdzIGNhciwgb3IgaGVhZCkKKyMgQXJndW1lbnRzOiAxOiBBIGxpc3QKKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgbGlzdAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitmaXJzdCA9ICQoX19nbXNsX3RyMSkkKGZpcnN0d29yZCAkMSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgbGFzdAorIyBBcmd1bWVudHM6IDE6IEEgbGlzdAorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIGxpc3QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraWZlcSAoJChfX2dtc2xfaGF2ZV9sYXN0d29yZCksJCh0cnVlKSkKK2xhc3QgPSAkKF9fZ21zbF90cjEpJChsYXN0d29yZCAkMSkKK2Vsc2UKK2xhc3QgPSAkKF9fZ21zbF90cjEpJChpZiAkMSwkKHdvcmQgJCh3b3JkcyAkMSksJDEpKQorZW5kaWYKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgcmVzdCAoc2FtZSBhcyBMSVNQJ3MgY2RyLCBvciB0YWlsKQorIyBBcmd1bWVudHM6IDE6IEEgbGlzdAorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIGxpc3Qgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3Jlc3QgPSAkKF9fZ21zbF90cjEpJCh3b3JkbGlzdCAyLCQod29yZHMgJDEpLCQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBjaG9wCisjIEFyZ3VtZW50czogMTogQSBsaXN0CisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgbGlzdCB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjaG9wID0gJChfX2dtc2xfdHIxKSQod29yZGxpc3QgMiwkKHdvcmRzICQxKSx4ICQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBtYXAKKyMgQXJndW1lbnRzOiAxOiBOYW1lIG9mIGZ1bmN0aW9uIHRvICQoY2FsbCkgZm9yIGVhY2ggZWxlbWVudCBvZiBsaXN0CisjICAgICAgICAgICAgMjogTGlzdCB0byBpdGVyYXRlIG92ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24gaW4gMQorIyBSZXR1cm5zOiAgIFRoZSBsaXN0IGFmdGVyIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYXAgPSAkKF9fZ21zbF90cjIpJChzdHJpcCAkKGZvcmVhY2ggYSwkMiwkKGNhbGwgJDEsJGEpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgcGFpcm1hcAorIyBBcmd1bWVudHM6IDE6IE5hbWUgb2YgZnVuY3Rpb24gdG8gJChjYWxsKSBmb3IgZWFjaCBwYWlyIG9mIGVsZW1lbnRzCisjICAgICAgICAgICAgMjogTGlzdCB0byBpdGVyYXRlIG92ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24gaW4gMQorIyAgICAgICAgICAgIDM6IFNlY29uZCBsaXN0IHRvIGl0ZXJhdGUgb3ZlciBjYWxsaW5nIHRoZSBmdW5jdGlvbiBpbiAxCisjIFJldHVybnM6ICAgVGhlIGxpc3QgYWZ0ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24gb24gZWFjaCBwYWlyIG9mIGVsZW1lbnRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BhaXJtYXAgPSAkKHN0cmlwICQoX19nbXNsX3RyMylcCisgICAgICAgICAgJChpZiAkMiQzLCQoY2FsbCAkMSwkKGNhbGwgZmlyc3QsJDIpLCQoY2FsbCBmaXJzdCwkMykpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgcGFpcm1hcCwkMSwkKGNhbGwgcmVzdCwkMiksJChjYWxsIHJlc3QsJDMpKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGxlcQorIyBBcmd1bWVudHM6IDE6IEEgbGlzdCB0byBjb21wYXJlIGFnYWluc3QuLi4KKyMgICAgICAgICAgICAyOiAuLi50aGlzIGxpc3QKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIHR3byBsaXN0cyBhcmUgaWRlbnRpY2FsCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xlcSA9ICQoX19nbXNsX3RyMikkKHN0cmlwICQoaWYgJChjYWxsIHNlcSwkKHdvcmRzICQxKSwkKHdvcmRzICQyKSksICAgICBcCisgICAgICAgICAgJChjYWxsIF9fZ21zbF9saXN0X2VxdWFsLCQxLCQyKSwkKGZhbHNlKSkpCisKK19fZ21zbF9saXN0X2VxdWFsID0gJChpZiAkKHN0cmlwICQxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoY2FsbCBzZXEsJChjYWxsIGZpcnN0LCQxKSwkKGNhbGwgZmlyc3QsJDIpKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBfX2dtc2xfbGlzdF9lcXVhbCwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIHJlc3QsJDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCByZXN0LCQyKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmFsc2UpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICQodHJ1ZSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGxuZQorIyBBcmd1bWVudHM6IDE6IEEgbGlzdCB0byBjb21wYXJlIGFnYWluc3QuLi4KKyMgICAgICAgICAgICAyOiAuLi50aGlzIGxpc3QKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIHR3byBsaXN0cyBhcmUgZGlmZmVyZW50CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xuZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgbm90LCQoY2FsbCBsZXEsJDEsJDIpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICByZXZlcnNlCisjIEFyZ3VtZW50czogMTogQSBsaXN0IHRvIHJldmVyc2UKKyMgUmV0dXJuczogICBUaGUgbGlzdCB3aXRoIGl0cyBlbGVtZW50cyBpbiByZXZlcnNlIG9yZGVyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JldmVyc2UgPSQoX19nbXNsX3RyMSkkKHN0cmlwICQoaWYgJDEsJChjYWxsIHJldmVyc2UsJChjYWxsIHJlc3QsJDEpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmlyc3QsJDEpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgdW5pcQorIyBBcmd1bWVudHM6IDE6IEEgbGlzdCBmcm9tIHdoaWNoIHRvIHJlbW92ZSByZXBlYXRlZCBlbGVtZW50cworIyBSZXR1cm5zOiAgIFRoZSBsaXN0IHdpdGggZHVwbGljYXRlIGVsZW1lbnRzIHJlbW92ZWQgd2l0aG91dCByZW9yZGVyaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3VuaXEgPSAkKHN0cmlwICQoX19nbXNsX3RyMSkkKGlmICQxLCQoY2FsbCB1bmlxLCQoY2FsbCBjaG9wLCQxKSkgXAorICAgICAgICAgICAgJChpZiAkKGZpbHRlciAkKGNhbGwgbGFzdCwkMSksJChjYWxsIGNob3AsJDEpKSwsJChjYWxsIGxhc3QsJDEpKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGxlbmd0aAorIyBBcmd1bWVudHM6IDE6IEEgbGlzdAorIyBSZXR1cm5zOiAgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbGVuZ3RoID0gJChfX2dtc2xfdHIxKSQod29yZHMgJDEpCisKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNUUklORyBNQU5JUFVMQVRJT04gRlVOQ1RJT05TCisjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zbGF0ZXMgYW55IEdOVSBNYWtlICd0cnVlJyB2YWx1ZSAoaS5lLiBhCisjIG5vbi1lbXB0eSBzdHJpbmcpIHRvIG91ciAkKHRydWUpCisKK19fZ21zbF9tYWtlX2Jvb2wgPSAkKGlmICQoc3RyaXAgJDEpLCQodHJ1ZSksJChmYWxzZSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHNlcQorIyBBcmd1bWVudHM6IDE6IEEgc3RyaW5nIHRvIGNvbXBhcmUgYWdhaW5zdC4uLgorIyAgICAgICAgICAgIDI6IC4uLnRoaXMgc3RyaW5nCisjIFJldHVybnM6ICAgUmV0dXJucyAkKHRydWUpIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgaWRlbnRpY2FsCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NlcSA9ICQoX19nbXNsX3RyMikkKGlmICQoZmlsdGVyLW91dCB4eCx4JChzdWJzdCAkMSwsJDIpJChzdWJzdCAkMiwsJDEpeCksJChmYWxzZSksJCh0cnVlKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgc25lCisjIEFyZ3VtZW50czogMTogQSBzdHJpbmcgdG8gY29tcGFyZSBhZ2FpbnN0Li4uCisjICAgICAgICAgICAgMjogLi4udGhpcyBzdHJpbmcKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc25lID0gJChfX2dtc2xfdHIyKSQoY2FsbCBub3QsJChjYWxsIHNlcSwkMSwkMikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHNwbGl0CisjIEFyZ3VtZW50czogMTogVGhlIGNoYXJhY3RlciB0byBzcGxpdCBvbgorIyAgICAgICAgICAgIDI6IEEgc3RyaW5nIHRvIHNwbGl0CisjIFJldHVybnM6ICAgU3BsaXRzIGEgc3RyaW5nIGludG8gYSBsaXN0IHNlcGFyYXRlZCBieSBzcGFjZXMgYXQgdGhlIHNwbGl0CisjICAgICAgICAgICAgY2hhcmFjdGVyIGluIHRoZSBmaXJzdCBhcmd1bWVudAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzcGxpdCA9ICQoX19nbXNsX3RyMikkKHN0cmlwICQoc3Vic3QgJDEsICwkMikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIG1lcmdlCisjIEFyZ3VtZW50czogMTogVGhlIGNoYXJhY3RlciB0byBwdXQgYmV0d2VlbiBmaWVsZHMKKyMgICAgICAgICAgICAyOiBBIGxpc3QgdG8gbWVyZ2UgaW50byBhIHN0cmluZworIyBSZXR1cm5zOiAgIE1lcmdlcyBhIGxpc3QgaW50byBhIHNpbmdsZSBzdHJpbmcsIGxpc3QgZWxlbWVudHMgYXJlIHNlcGFyYXRlZAorIyAgICAgICAgICAgIGJ5IHRoZSBjaGFyYWN0ZXIgaW4gdGhlIGZpcnN0IGFyZ3VtZW50CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21lcmdlID0gJChfX2dtc2xfdHIyKSQoc3RyaXAgJChpZiAkMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgJChpZiAkKGNhbGwgc2VxLDEsJCh3b3JkcyAkMikpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJDIsJChjYWxsIGZpcnN0LCQyKSQxJChjYWxsIG1lcmdlLCQxLCQoY2FsbCByZXN0LCQyKSkpKSkKKworaWZkZWYgX19nbXNsX2hhdmVfZXZhbAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgdHIKKyMgQXJndW1lbnRzOiAxOiBUaGUgbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIHRyYW5zbGF0ZSBmcm9tIAorIyAgICAgICAgICAgIDI6IFRoZSBsaXN0IG9mIGNoYXJhY3RlcnMgdG8gdHJhbnNsYXRlIHRvCisjICAgICAgICAgICAgMzogVGhlIHRleHQgdG8gdHJhbnNsYXRlCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgdGV4dCBhZnRlciB0cmFuc2xhdGluZyBjaGFyYWN0ZXJzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RyID0gJChzdHJpcCAkKF9fZ21zbF90cjMpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEkMiQzKSAgICAgICAgICAgICAgXAorICAgICAkKGV2YWwgX19nbXNsX3QgOj0gJDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICQoZm9yZWFjaCBjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICQoam9pbiAkKGFkZHN1ZmZpeCA6LCQxKSwkMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgJChldmFsIF9fZ21zbF90IDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgJChzdWJzdCAkKHdvcmQgMSwkKHN1YnN0IDosICwkYykpLCQod29yZCAyLCQoc3Vic3QgOiwgLCRjKSksIFwKKyAgICAgICAgICAgICAgICAgJChfX2dtc2xfdCkpKSkkKF9fZ21zbF90KSkKKworIyBDb21tb24gY2hhcmFjdGVyIGNsYXNzZXMgZm9yIHVzZSB3aXRoIHRoZSB0ciBmdW5jdGlvbi4gIEVhY2ggb2YKKyMgdGhlc2UgaXMgYWN0dWFsbHkgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgbXVzdCBiZSB3cmFwcGVkIHdpdGgKKyMgJCgpIG9yICR7fSB0byBiZSB1c2VkLgorCitbQS1aXSA6PSBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFogIworW2Etel0gOj0gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6ICMKK1swLTldIDo9IDAgMSAyIDMgNCA1IDYgNyA4IDkgIworW0EtRl0gOj0gQSBCIEMgRCBFIEYgIworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICB1YworIyBBcmd1bWVudHM6IDE6IFRleHQgdG8gdXBwZXIgY2FzZQorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIHRleHQgaW4gdXBwZXIgY2FzZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1YyA9ICQoX19nbXNsX3RyMSkkKGNhbGwgYXNzZXJ0X25vX2RvbGxhciwkMCwkMSkkKGNhbGwgdHIsJChbYS16XSksJChbQS1aXSksJDEpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGxjCisjIEFyZ3VtZW50czogMTogVGV4dCB0byBsb3dlciBjYXNlCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgdGV4dCBpbiBsb3dlciBjYXNlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2xjID0gJChfX2dtc2xfdHIxKSQoY2FsbCBhc3NlcnRfbm9fZG9sbGFyLCQwLCQxKSQoY2FsbCB0ciwkKFtBLVpdKSwkKFthLXpdKSwkMSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgc3RybGVuCisjIEFyZ3VtZW50czogMTogQSBzdHJpbmcKKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitfX2dtc2xfY2hhcmFjdGVycyA6PSBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFoKK19fZ21zbF9jaGFyYWN0ZXJzICs9IGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgegorX19nbXNsX2NoYXJhY3RlcnMgKz0gMCAxIDIgMyA0IDUgNiA3IDggOQorX19nbXNsX2NoYXJhY3RlcnMgKz0gYCB+ICEgQCBcIyAkJCAlIF4gJiAqICggKSAtIF8gPSArCitfX2dtc2xfY2hhcmFjdGVycyArPSB7IH0gWyBdIFwgOiA7ICcgIiA8ID4gLCAuIC8gPyB8CisKKyMgQXNpZGU6IGlmIHlvdSByZWFkIHRoZSBhYm92ZSB5b3UgbWlnaHQgdGhpbmsgdGhhdCB0aGUgbG93ZXItY2FzZQorIyBsZXR0ZXIgeCBpcyBtaXNzaW5nLCBhbmQgdGhhdCB0aGF0J3MgYW4gZXJyb3IuICBJdCBpcyBtaXNzaW5nLCBidXQKKyMgaXQncyBub3QgYW4gZXJyb3IuICBfX2dtc2xfY2hhcmFjdGVycyBpcyB1c2VkIGJ5IHRoZSBzdHJsZW4KKyMgZnVuY3Rpb24uICBzdHJsZW4gd29ya3MgYnkgdHJhbnNmb3JtaW5nIGV2ZXJ5IGNoYXJhY3RlciBhbmQgc3BhY2UKKyMgaW50byB0aGUgbGV0dGVyIHggYW5kIHRoZW4gY291bnRpbmcgdGhlIHgncy4gIFNpbmNlIHRoZXJlJ3Mgbm8gbmVlZAorIyB0byB0cmFuc2Zvcm0geCBpbnRvIHggSSBvbWl0dGVkIGl0LgorCisjIFRoaXMgcmVzdWx0cyBpbiBfX2dtc2xfc3BhY2UgY29udGFpbmluZyBqdXN0IGEgc3BhY2UKKworX19nbXNsX3NwYWNlIDo9IAorX19nbXNsX3NwYWNlICs9CisKK3N0cmxlbiA9ICQoX19nbXNsX3RyMSkkKGNhbGwgYXNzZXJ0X25vX2RvbGxhciwkMCwkMSkkKHN0cmlwICQoZXZhbCBfX3RlbXAgOj0gJChzdWJzdCAkKF9fZ21zbF9zcGFjZSkseCwkMSkpJChmb3JlYWNoIGEsJChfX2dtc2xfY2hhcmFjdGVycyksJChldmFsIF9fdGVtcCA6PSAkJChzdWJzdCAkJGEseCwkKF9fdGVtcCkpKSkkKGV2YWwgX190ZW1wIDo9ICQoc3Vic3QgeCx4ICwkKF9fdGVtcCkpKSQod29yZHMgJChfX3RlbXApKSkKKworIyBUaGlzIHJlc3VsdHMgaW4gX19nbXNsX25ld2xpbmUgY29udGFpbmluZyBqdXN0IGEgbmV3bGluZQorCitkZWZpbmUgX19nbXNsX25ld2xpbmUKKworCitlbmRlZgorCisjIFRoaXMgcmVzdWx0cyBpbiBfX2dtc2xfdGFiIGNvbnRhaW5pbmcgYSB0YWIKKworX19nbXNsX3RhYiA6PQkjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHN1YnN0cgorIyBBcmd1bWVudHM6IDE6IEEgc3RyaW5nCisjIAkgICAgIDI6IFN0YXJ0IHBvc2l0aW9uIChmaXJzdCBjaGFyYWN0ZXIgaXMgMSkKKyMJICAgICAzOiBFbmQgcG9zaXRpb24gKGluY2x1c2l2ZSkKKyMgUmV0dXJuczogICBBIHN1YnN0cmluZy4gIAorIyBOb3RlOiAgICAgIFRoZSBzdHJpbmcgaW4gJDEgbXVzdCBub3QgY29udGFpbiBhIKcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWJzdHIgPSAkKF9fZ21zbF90cjMpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEkMiQzKSQoc3RyaXAgJChldmFsIF9fdGVtcCA6PSAkJChzdWJzdCAkJChfX2dtc2xfc3BhY2UpLKcgLCQkMSkpJChmb3JlYWNoIGEsJChfX2dtc2xfY2hhcmFjdGVycyksJChldmFsIF9fdGVtcCA6PSAkJChzdWJzdCAkJGEsJCRhJCQoX19nbXNsX3NwYWNlKSwkKF9fdGVtcCkpKSkkKGV2YWwgX190ZW1wIDo9ICQod29yZGxpc3QgJDIsJDMsJChfX3RlbXApKSkpJChzdWJzdCCnLCQoX19nbXNsX3NwYWNlKSwkKHN1YnN0ICQoX19nbXNsX3NwYWNlKSwsJChfX3RlbXApKSkKKworZW5kaWYgIyBfX2dtc2xfaGF2ZV9ldmFsCisKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNFVCBNQU5JUFVMQVRJT04gRlVOQ1RJT05TCisjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFNldHMgYXJlIHJlcHJlc2VudGVkIGJ5IHNvcnRlZCwgZGVkdXBsaWNhdGVkIGxpc3RzLiAgVG8gY3JlYXRlIGEgc2V0CisjIGZyb20gYSBsaXN0IHVzZSBzZXRfY3JlYXRlLCBvciBzdGFydCB3aXRoIHRoZSBlbXB0eV9zZXQgYW5kCisjIHNldF9pbnNlcnQgaW5kaXZpZHVhbCBlbGVtZW50cworCisjIFRoaXMgaXMgdGhlIGVtcHR5IHNldAorZW1wdHlfc2V0IDo9IAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBzZXRfY3JlYXRlCisjIEFyZ3VtZW50czogMTogQSBsaXN0IG9mIHNldCBlbGVtZW50cworIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgc2V0CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NldF9jcmVhdGUgPSAkKF9fZ21zbF90cjEpJChzb3J0ICQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBzZXRfaW5zZXJ0CisjIEFyZ3VtZW50czogMTogQSBzaW5nbGUgZWxlbWVudCB0byBhZGQgdG8gYSBzZXQKKyMgICAgICAgICAgICAyOiBBIHNldAorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIHNldCB3aXRoIHRoZSBlbGVtZW50IGFkZGVkCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NldF9pbnNlcnQgPSAkKF9fZ21zbF90cjIpJChzb3J0ICQxICQyKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBzZXRfcmVtb3ZlCisjIEFyZ3VtZW50czogMTogQSBzaW5nbGUgZWxlbWVudCB0byByZW1vdmUgZnJvbSBhIHNldAorIyAgICAgICAgICAgIDI6IEEgc2V0CisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgc2V0IHdpdGggdGhlIGVsZW1lbnQgcmVtb3ZlZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXRfcmVtb3ZlID0gJChfX2dtc2xfdHIyKSQoZmlsdGVyLW91dCAkMSwkMikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgc2V0X2lzX21lbWJlcgorIyBBcmd1bWVudHM6IDE6IEEgc2luZ2xlIGVsZW1lbnQgCisjICAgICAgICAgICAgMjogQSBzZXQKKyMgUmV0dXJuczogICBSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIHNldAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXRfaXNfbWVtYmVyID0gJChfX2dtc2xfdHIyKSQoaWYgJChmaWx0ZXIgJDEsJDIpLCQodHJ1ZSksJChmYWxzZSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHNldF91bmlvbgorIyBBcmd1bWVudHM6IDE6IEEgc2V0CisjICAgICAgICAgICAgMjogQW5vdGhlciBzZXQKKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGUgdHdvIHNldHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc2V0X3VuaW9uID0gJChfX2dtc2xfdHIyKSQoc29ydCAkMSAkMikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgc2V0X2ludGVyc2VjdGlvbgorIyBBcmd1bWVudHM6IDE6IEEgc2V0CisjICAgICAgICAgICAgMjogQW5vdGhlciBzZXQKKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzZXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NldF9pbnRlcnNlY3Rpb24gPSAkKF9fZ21zbF90cjIpJChmaWx0ZXIgJDEsJDIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHNldF9pc19zdWJzZXQKKyMgQXJndW1lbnRzOiAxOiBBIHNldAorIyAgICAgICAgICAgIDI6IEFub3RoZXIgc2V0CisjIFJldHVybnM6ICAgUmV0dXJucyAkKHRydWUpIGlmIHRoZSBmaXJzdCBzZXQgaXMgYSBzdWJzZXQgb2YgdGhlIHNlY29uZAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXRfaXNfc3Vic2V0ID0gJChfX2dtc2xfdHIyKSQoY2FsbCBzZXRfZXF1YWwsJChjYWxsIHNldF9pbnRlcnNlY3Rpb24sJDEsJDIpLCQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBzZXRfZXF1YWwKKyMgQXJndW1lbnRzOiAxOiBBIHNldAorIyAgICAgICAgICAgIDI6IEFub3RoZXIgc2V0CisjIFJldHVybnM6ICAgUmV0dXJucyAkKHRydWUpIGlmIHRoZSB0d28gc2V0cyBhcmUgaWRlbnRpY2FsCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3NldF9lcXVhbCA9ICQoX19nbXNsX3RyMikkKGNhbGwgc2VxLCQxLCQyKQorCisjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBUklUSE1FVElDIExJQlJBUlkKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgSW50ZWdlcnMgYSByZXByZXNlbnRlZCBieSBsaXN0cyB3aXRoIHRoZSBlcXVpdmFsZW50IG51bWJlciBvZiB4J3MuCisjIEZvciBleGFtcGxlIHRoZSBudW1iZXIgNCBpcyB4IHggeCB4LiAgVGhlIG1heGltdW0gaW50ZWdlciB0aGF0IHRoZQorIyBsaWJyYXJ5IGNhbiBoYW5kbGUgYXMgX2lucHV0XyBpcyBfX2dtc2xfaW5wdXRfaW50IHdoaWNoIGlzIGRlZmluZWQKKyMgaGVyZSBhcyA2NTUzNgorCitfX2dtc2xfc2l4dGVlbiA6PSB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4IHggeCB4CitfX2dtc2xfaW5wdXRfaW50IDo9ICQoZm9yZWFjaCBhLCQoX19nbXNsX3NpeHRlZW4pLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoZm9yZWFjaCBiLCQoX19nbXNsX3NpeHRlZW4pLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZm9yZWFjaCBjLCQoX19nbXNsX3NpeHRlZW4pLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoX19nbXNsX3NpeHRlZW4pKSkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbnRfZGVjb2RlCisjIEFyZ3VtZW50czogMTogQSBudW1iZXIgb2YgeCdzIHJlcHJlc2VudGF0aW9uCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgaW50ZWdlciBmb3IgaHVtYW4gY29uc3VtcHRpb24gdGhhdCBpcyByZXByZXNlbnRlZAorIyAgICAgICAgICAgIGJ5IHRoZSBzdHJpbmcgb2YgeCdzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludF9kZWNvZGUgPSAkKF9fZ21zbF90cjEpJCh3b3JkcyAkMSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgaW50X2VuY29kZQorIyBBcmd1bWVudHM6IDE6IEEgbnVtYmVyIGluIGh1bWFuLXJlYWRhYmxlIGludGVnZXIgZm9ybQorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIGludGVnZXIgZW5jb2RlZCBhcyBhIHN0cmluZyBvZiB4J3MKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50X2VuY29kZSA9ICQoX19nbXNsX3RyMSkkKHdvcmRsaXN0IDEsJDEsJChfX2dtc2xfaW5wdXRfaW50KSkKKworIyBUaGUgYXJpdGhtZXRpYyBsaWJyYXJ5IGZ1bmN0aW9ucyBjb21lIGluIHR3byBmb3Jtczogb25lIGZvcm0gb2YgZWFjaAorIyBmdW5jdGlvbiB0YWtlcyBpbnRlZ2VycyBhcyBhcmd1bWVudHMgYW5kIHRoZSBvdGhlciBmb3JtIHRha2VzIHRoZQorIyBlbmNvZGVkIGZvcm0gKHgncyBjcmVhdGVkIGJ5IGEgY2FsbCB0byBpbnRfZW5jb2RlKS4gIEZvciBleGFtcGxlLAorIyB0aGVyZSBhcmUgdHdvIHBsdXMgZnVuY3Rpb25zOgorIworIyBwbHVzICAgICAgICBDYWxsZWQgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhbiBpbnRlZ2VyCisjIGludF9wbHVzICAgIENhbGxlZCB3aXRoIGVuY29kZWQgYXJndW1lbnRzIGFuZCByZXR1cm5zIGFuIGVuY29kZWQgcmVzdWx0CisjCisjIHBsdXMgd2lsbCBiZSBzbG93ZXIgdGhhbiBpbnRfcGx1cyBiZWNhdXNlIGl0cyBhcmd1bWVudHMgYW5kIHJlc3VsdAorIyBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQgYmV0d2VlbiB0aGUgeCdzIGZvcm1hdCBhbmQgaW50ZWdlcnMuICBJZiBkb2luZworIyBhIGNvbXBsZXggY2FsY3VsYXRpb24gdXNlIHRoZSBpbnRfKiBmb3JtcyB3aXRoIGEgc2luZ2xlIGVuY29kaW5nIG9mCisjIGlucHV0cyBhbmQgc2luZ2xlIGRlY29kaW5nIG9mIHRoZSBvdXRwdXQuICBGb3Igc2ltcGxlIGNhbGN1bGF0aW9ucworIyB0aGUgZGlyZWN0IGZvcm1zIGNhbiBiZSB1c2VkLgorCisjIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHdyYXAgYW4gaW50XyogZnVuY3Rpb24gaW50byBhIGZ1bmN0aW9uIHRoYXQKKyMgdGFrZXMgYSBwYWlyIG9mIGludGVnZXJzLCBwZXJoYXBzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYW4gaW50ZWdlcgorIyByZXN1bHQKK19fZ21zbF9pbnRfd3JhcCA9ICQoY2FsbCBpbnRfZGVjb2RlLCQoY2FsbCAkMSwkKGNhbGwgaW50X2VuY29kZSwkMiksJChjYWxsIGludF9lbmNvZGUsJDMpKSkKK19fZ21zbF9pbnRfd3JhcDEgPSAkKGNhbGwgaW50X2RlY29kZSwkKGNhbGwgJDEsJChjYWxsIGludF9lbmNvZGUsJDIpKSkKK19fZ21zbF9pbnRfd3JhcDIgPSAkKGNhbGwgJDEsJChjYWxsIGludF9lbmNvZGUsJDIpLCQoY2FsbCBpbnRfZW5jb2RlLCQzKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgaW50X3BsdXMKKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgICAgICAgICAgICAyOiBBbm90aGVyIG51bWJlciBpbiB4J3MgcmVwcmVzbnRhdGlvbgorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIHN1bSBvZiB0aGUgdHdvIG51bWJlcnMgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludF9wbHVzID0gJChzdHJpcCAkKF9fZ21zbF90cjIpJDEgJDIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHBsdXMgKHdyYXBwZWQgdmVyc2lvbiBvZiBpbnRfcGx1cykKKyMgQXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyCisjICAgICAgICAgICAgMjogQW5vdGhlciBpbnRlZ2VyCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgc3VtIG9mIHRoZSB0d28gaW50ZWdlcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcGx1cyA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwLGludF9wbHVzLCQxLCQyKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbnRfc3VidHJhY3QKKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgICAgICAgICAgICAyOiBBbm90aGVyIG51bWJlciBpbiB4J3MgcmVwcmVzbnRhdGlvbgorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBudW1iZXJzIGluIHgncyByZXByZXNlbnRhdGlvbiwKKyMgICAgICAgICAgICBvciBvdXRwdXRzIGFuIGVycm9yIG9uIGEgbnVtZXJpYyB1bmRlcmZsb3cKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50X3N1YnRyYWN0ID0gJChzdHJpcCAkKF9fZ21zbF90cjIpJChpZiAkKGNhbGwgaW50X2d0ZSwkMSwkMiksIFwKKyAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgeHgsJChqb2luICQxLCQyKSksICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJChjYWxsIF9fZ21zbF93YXJuaW5nLFN1YnRyYWN0aW9uIHVuZGVyZmxvdykpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBzdWJ0cmFjdCAod3JhcHBlZCB2ZXJzaW9uIG9mIGludF9zdWJ0cmFjdCkKKyMgQXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyCisjICAgICAgICAgICAgMjogQW5vdGhlciBpbnRlZ2VyCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgdHdvIGludGVnZXJzLAorIyAgICAgICAgICAgIG9yIG91dHB1dHMgYW4gZXJyb3Igb24gYSBudW1lcmljIHVuZGVyZmxvdworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWJ0cmFjdCA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwLGludF9zdWJ0cmFjdCwkMSwkMikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgaW50X211bHRpcGx5CisjIEFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjICAgICAgICAgICAgMjogQW5vdGhlciBudW1iZXIgaW4geCdzIHJlcHJlc250YXRpb24KKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB0d28gbnVtYmVycyBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50X211bHRpcGx5ID0gJChzdHJpcCAkKF9fZ21zbF90cjIpJChmb3JlYWNoIGEsJDEsJDIpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBtdWx0aXBseSAod3JhcHBlZCB2ZXJzaW9uIG9mIGludF9tdWx0aXBseSkKKyMgQXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyCisjICAgICAgICAgICAgMjogQW5vdGhlciBpbnRlZ2VyCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgcHJvZHVjdCBvZiB0aGUgdHdvIGludGVnZXJzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK211bHRpcGx5ID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfaW50X3dyYXAsaW50X211bHRpcGx5LCQxLCQyKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbnRfZGl2aWRlCisjIEFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjICAgICAgICAgICAgMjogQW5vdGhlciBudW1iZXIgaW4geCdzIHJlcHJlc250YXRpb24KKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZWdlciBkaXZpc2lvbiBvZiBhcmd1bWVudCAxIGRpdmlkZWQKKyMgICAgICAgICAgICBieSBhcmd1bWVudCAyIGluIHgncyByZXByZXNlbnRhdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnRfZGl2aWRlID0gJChfX2dtc2xfdHIyKSQoc3RyaXAgJChpZiAkMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICQoaWYgJChjYWxsIGludF9ndGUsJDEsJDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICB4ICQoY2FsbCBpbnRfZGl2aWRlLCQoY2FsbCBpbnRfc3VidHJhY3QsJDEsJDIpLCQyKSwpLCBcCisgICAgICAgICAgICAgICAgICQoY2FsbCBfX2dtc2xfZXJyb3IsRGl2aXNpb24gYnkgemVybykpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBkaXZpZGUgKHdyYXBwZWQgdmVyc2lvbiBvZiBpbnRfZGl2aWRlKQorIyBBcmd1bWVudHM6IDE6IEFuIGludGVnZXIKKyMgICAgICAgICAgICAyOiBBbm90aGVyIGludGVnZXIKKyMgUmV0dXJuczogICBSZXR1cm5zIHRoZSBpbnRlZ2VyIGRpdmlzaW9uIG9mIHRoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RpdmlkZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwLGludF9kaXZpZGUsJDEsJDIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGludF9tYXgsIGludF9taW4KKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgICAgICAgICAgICAyOiBBbm90aGVyIG51bWJlciBpbiB4J3MgcmVwcmVzbnRhdGlvbgorIyBSZXR1cm5zOiAgIFJldHVybnMgdGhlIG1heGltdW0gb3IgbWluaW11bSBvZiBpdHMgYXJndW1lbnRzIGluIHgncworIyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludF9tYXggPSAkKF9fZ21zbF90cjIpJChzdWJzdCB4eCx4LCQoam9pbiAkMSwkMikpCitpbnRfbWluID0gJChfX2dtc2xfdHIyKSQoc3Vic3QgeHgseCwkKGZpbHRlciB4eCwkKGpvaW4gJDEsJDIpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgbWF4LCBtaW4KKyMgQXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyCisjICAgICAgICAgICAgMjogQW5vdGhlciBpbnRlZ2VyCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgbWF4aW11bSBvciBtaW5pbXVtIG9mIGl0cyBpbnRlZ2VyIGFyZ3VtZW50cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittYXggPSAkKF9fZ21zbF90cjIpJChjYWxsIF9fZ21zbF9pbnRfd3JhcCxpbnRfbWF4LCQxLCQyKQorbWluID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfaW50X3dyYXAsaW50X21pbiwkMSwkMikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiBpbnRfZ3QsIGludF9ndGUsIGludF9sdCwgaW50X2x0ZSwgaW50X2VxLCBpbnRfbmUKKyMgQXJndW1lbnRzOiBUd28geCdzIHJlcHJlc2VudGF0aW9uIG51bWJlcnMgdG8gYmUgY29tcGFyZWQKKyMgUmV0dXJuczogICAkKHRydWUpIG9yICQoZmFsc2UpCisjCisjIGludF9ndCAgICBGaXJzdCBhcmd1bWVudCBncmVhdGVyIHRoYW4gc2Vjb25kIGFyZ3VtZW50CisjIGludF9ndGUgICBGaXJzdCBhcmd1bWVudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc2Vjb25kIGFyZ3VtZW50CisjIGludF9sdCAgICBGaXJzdCBhcmd1bWVudCBsZXNzIHRoYW4gc2Vjb25kIGFyZ3VtZW50IAorIyBpbnRfbHRlICAgRmlyc3QgYXJndW1lbnQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudAorIyBpbnRfZXEgICAgRmlyc3QgYXJndW1lbnQgaXMgbnVtZXJpY2FsbHkgZXF1YWwgdG8gdGhlIHNlY29uZCBhcmd1bWVudAorIyBpbnRfbmUgICAgRmlyc3QgYXJndW1lbnQgaXMgbm90IG51bWVyaWNhbGx5IGVxdWFsIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50X2d0ID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfbWFrZV9ib29sLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0ICQod29yZHMgJDIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdvcmRzICQoY2FsbCBpbnRfbWF4LCQxLCQyKSkpKQoraW50X2d0ZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX21ha2VfYm9vbCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICQoY2FsbCBpbnRfZ3QsJDEsJDIpJChjYWxsIGludF9lcSwkMSwkMikpCitpbnRfbHQgPSAkKF9fZ21zbF90cjIpJChjYWxsIF9fZ21zbF9tYWtlX2Jvb2wsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgJCh3b3JkcyAkMSksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQod29yZHMgJChjYWxsIGludF9tYXgsJDEsJDIpKSkpCitpbnRfbHRlID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfbWFrZV9ib29sLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGludF9sdCwkMSwkMikkKGNhbGwgaW50X2VxLCQxLCQyKSkKK2ludF9lcSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX21ha2VfYm9vbCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyICQod29yZHMgJDEpLCQod29yZHMgJDIpKSkKK2ludF9uZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX21ha2VfYm9vbCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyLW91dCAkKHdvcmRzICQxKSwkKHdvcmRzICQyKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogZ3QsIGd0ZSwgbHQsIGx0ZSwgZXEsIG5lCisjIEFyZ3VtZW50czogVHdvIGludGVnZXJzIHRvIGJlIGNvbXBhcmVkCisjIFJldHVybnM6ICAgJCh0cnVlKSBvciAkKGZhbHNlKQorIworIyBndCAgICBGaXJzdCBhcmd1bWVudCBncmVhdGVyIHRoYW4gc2Vjb25kIGFyZ3VtZW50CisjIGd0ZSAgIEZpcnN0IGFyZ3VtZW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBzZWNvbmQgYXJndW1lbnQKKyMgbHQgICAgRmlyc3QgYXJndW1lbnQgbGVzcyB0aGFuIHNlY29uZCBhcmd1bWVudCAKKyMgbHRlICAgRmlyc3QgYXJndW1lbnQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudAorIyBlcSAgICBGaXJzdCBhcmd1bWVudCBpcyBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgc2Vjb25kIGFyZ3VtZW50CisjIG5lICAgIEZpcnN0IGFyZ3VtZW50IGlzIG5vdCBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgc2Vjb25kIGFyZ3VtZW50CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2d0ID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfaW50X3dyYXAyLGludF9ndCwkMSwkMikKK2d0ZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwMixpbnRfZ3RlLCQxLCQyKQorbHQgPSAkKF9fZ21zbF90cjIpJChjYWxsIF9fZ21zbF9pbnRfd3JhcDIsaW50X2x0LCQxLCQyKQorbHRlID0gJChfX2dtc2xfdHIyKSQoY2FsbCBfX2dtc2xfaW50X3dyYXAyLGludF9sdGUsJDEsJDIpCitlcSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwMixpbnRfZXEsJDEsJDIpCituZSA9ICQoX19nbXNsX3RyMikkKGNhbGwgX19nbXNsX2ludF93cmFwMixpbnRfbmUsJDEsJDIpCisKKyMgaW5jcmVtZW50IGFkZHMgMSB0byBpdHMgYXJndW1lbnQsIGRlY3JlbWVudCBzdWJ0cmFjdHMgMS4gIE5vdGUgdGhhdAorIyBkZWNyZW1lbnQgZG9lcyBub3QgcmFuZ2UgY2hlY2sgYW5kIGhlbmNlIHdpbGwgbm90IHVuZGVyZmxvdywgYnV0CisjIHdpbGwgaW5jb3JyZWN0bHkgc2F5IHRoYXQgMCAtIDEgPSAwCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGludF9pbmMKKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgUmV0dXJuczogICBUaGUgbnVtYmVyIGluY3JlbWVudGVkIGJ5IDEgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludF9pbmMgPSAkKHN0cmlwICQoX19nbXNsX3RyMSkkMSB4KQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbmMKKyMgQXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyCisjIFJldHVybnM6ICAgVGhlIGFyZ3VtZW50IGluY3JlbWVudGVkIGJ5IDEKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW5jID0gJChfX2dtc2xfdHIxKSQoY2FsbCBfX2dtc2xfaW50X3dyYXAxLGludF9pbmMsJDEpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGludF9kZWMKKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgUmV0dXJuczogICBUaGUgbnVtYmVyIGRlY3JlbWVudGVkIGJ5IDEgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludF9kZWMgPSAkKF9fZ21zbF90cjEpJChzdHJpcCAkKGlmICQoY2FsbCBzbmUsMCwkKHdvcmRzICQxKSksIFwKKyAgICAgICAgICAgICAgJCh3b3JkbGlzdCAyLCQod29yZHMgJDEpLCQxKSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgJChjYWxsIF9fZ21zbF93YXJuaW5nLERlY3JlbWVudCB1bmRlcmZsb3cpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgZGVjCisjIEFyZ3VtZW50czogMTogQW4gaW50ZWdlcgorIyBSZXR1cm5zOiAgIFRoZSBhcmd1bWVudCBkZWNyZW1lbnRlZCBieSAxCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlYyA9ICQoX19nbXNsX3RyMSkkKGNhbGwgX19nbXNsX2ludF93cmFwMSxpbnRfZGVjLCQxKQorCisjIGRvdWJsZSBkb3VibGVzIGl0cyBhcmd1bWVudCwgYW5kIGhhbHZlIGhhbHZlcyBpdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbnRfZG91YmxlCisjIEFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzIHJlcHJlc2VudGF0aW9uCisjIFJldHVybnM6ICAgVGhlIG51bWJlciBkb3VibGVkIChpLmUuICogMikgYW5kIHJldHVybmVkIGluIHgncyByZXByZXNlbnRhdGlvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnRfZG91YmxlID0gJChzdHJpcCAkKF9fZ21zbF90cjEpJDEgJDEpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGRvdWJsZQorIyBBcmd1bWVudHM6IDE6IEFuIGludGVnZXIKKyMgUmV0dXJuczogICBUaGUgaW50ZWdlciB0aW1lcyAyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RvdWJsZSA9ICQoX19nbXNsX3RyMSkkKGNhbGwgX19nbXNsX2ludF93cmFwMSxpbnRfZG91YmxlLCQxKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBpbnRfaGFsdmUKKyMgQXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgUmV0dXJuczogICBUaGUgbnVtYmVyIGhhbHZlZCAoaS5lLiAvIDIpIGFuZCByZXR1cm5lZCBpbiB4J3MgcmVwcmVzZW50YXRpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50X2hhbHZlID0gJChfX2dtc2xfdHIxKSQoc3RyaXAgJChzdWJzdCB4eCx4LCQoZmlsdGVyLW91dCB4eSB4IHksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChqb2luICQxLCQoZm9yZWFjaCBhLCQxLHkgeCkpKSkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGhhbHZlCisjIEFyZ3VtZW50czogMTogQW4gaW50ZWdlcgorIyBSZXR1cm5zOiAgIFRoZSBpbnRlZ2VyIGRpdmlkZWQgYnkgMgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoYWx2ZSA9ICQoX19nbXNsX3RyMSkkKGNhbGwgX19nbXNsX2ludF93cmFwMSxpbnRfaGFsdmUsJDEpCisKK2lmZGVmIF9fZ21zbF9oYXZlX2V2YWwKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFTU09DSUFUSVZFIEFSUkFZUworIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgc2V0CisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBhc3NvY2lhdGl2ZSBhcnJheQorIyAgICAgICAgICAgIDI6IFRoZSBrZXkgdmFsdWUgdG8gYXNzb2NpYXRlCisjICAgICAgICAgICAgMzogVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5CisjIFJldHVybnM6ICAgTm9uZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzZXQgPSAkKF9fZ21zbF90cjMpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEkMiQzKSQoZXZhbCBfX2dtc2xfYWFfJDFfJDIgPSAkMykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgZ2V0CisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBhc3NvY2lhdGl2ZSBhcnJheQorIyAgICAgICAgICAgIDI6IFRoZSBrZXkgdG8gcmV0cmlldmUKKyMgUmV0dXJuczogICBUaGUgdmFsdWUgc3RvcmVkIGluIHRoZSBhcnJheSBmb3IgdGhhdCBrZXkKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ2V0ID0gJChzdHJpcCAkKF9fZ21zbF90cjIpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEkMikkKGlmICQoZmlsdGVyLW91dCB1bmRlZmluZWQsJChvcmlnaW4gX19nbXNsX2FhXyQxXyQyKSksIFwKKyAgICAkKF9fZ21zbF9hYV8kMV8kMikpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBrZXlzCisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBhc3NvY2lhdGl2ZSBhcnJheQorIyBSZXR1cm5zOiAgIFJldHVybnMgYSBsaXN0IG9mIGFsbCBkZWZpbmVkIGtleXMgaW4gdGhlIGFycmF5CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2tleXMgPSAkKF9fZ21zbF90cjEpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEpJChzb3J0ICQocGF0c3Vic3QgX19nbXNsX2FhXyQxXyUsJSwgXAorICAgICAgICAgICAgICAgICAgJChmaWx0ZXIgX19nbXNsX2FhXyQxXyUsJCguVkFSSUFCTEVTKSkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBkZWZpbmVkCisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBhc3NvY2lhdGl2ZSBhcnJheQorIyAgICAgICAgICAgIDI6IFRoZSBrZXkgdG8gdGVzdAorIyBSZXR1cm5zOiAgIFJldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIGRlZmluZWQgKGkuZS4gbm90IGVtcHR5KQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWZpbmVkID0gJChfX2dtc2xfdHIyKSQoY2FsbCBhc3NlcnRfbm9fZG9sbGFyLCQwLCQxJDIpJChjYWxsIHNuZSwkKGNhbGwgZ2V0LCQxLCQyKSwpCisKK2VuZGlmICMgX19nbXNsX2hhdmVfZXZhbAorCitpZmRlZiBfX2dtc2xfaGF2ZV9ldmFsCisjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOQU1FRCBTVEFDS1MKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIHB1c2gKKyMgQXJndW1lbnRzOiAxOiBOYW1lIG9mIHN0YWNrCisjICAgICAgICAgICAgMjogVmFsdWUgdG8gcHVzaCBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChtdXN0IG5vdCBjb250YWluCisjICAgICAgICAgICAgICAgYSBzcGFjZSkKKyMgUmV0dXJuczogICBOb25lCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3B1c2ggPSAkKF9fZ21zbF90cjIpJChjYWxsIGFzc2VydF9ub19kb2xsYXIsJDAsJDEkMikkKGV2YWwgX19nbXNsX3N0YWNrXyQxIDo9ICQyICQoaWYgJChmaWx0ZXItb3V0IHVuZGVmaW5lZCxcCisgICAgJChvcmlnaW4gX19nbXNsX3N0YWNrXyQxKSksJChfX2dtc2xfc3RhY2tfJDEpKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgcG9wCisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBzdGFjaworIyBSZXR1cm5zOiAgIFRvcCBlbGVtZW50IGZyb20gdGhlIHN0YWNrIGFmdGVyIHJlbW92aW5nIGl0CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3BvcCA9ICQoX19nbXNsX3RyMSkkKGNhbGwgYXNzZXJ0X25vX2RvbGxhciwkMCwkMSkkKHN0cmlwICQoaWYgJChmaWx0ZXItb3V0IHVuZGVmaW5lZCwkKG9yaWdpbiBfX2dtc2xfc3RhY2tfJDEpKSwgXAorICAgICQoY2FsbCBmaXJzdCwkKF9fZ21zbF9zdGFja18kMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICQoZXZhbCBfX2dtc2xfc3RhY2tfJDEgOj0gJChjYWxsIHJlc3QsJChfX2dtc2xfc3RhY2tfJDEpKSkpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBwZWVrCisjIEFyZ3VtZW50czogMTogTmFtZSBvZiBzdGFjaworIyBSZXR1cm5zOiAgIFRvcCBlbGVtZW50IGZyb20gdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcGVlayA9ICQoX19nbXNsX3RyMSkkKGNhbGwgYXNzZXJ0X25vX2RvbGxhciwkMCwkMSkkKGNhbGwgZmlyc3QsJChfX2dtc2xfc3RhY2tfJDEpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRnVuY3Rpb246ICBkZXB0aAorIyBBcmd1bWVudHM6IDE6IE5hbWUgb2Ygc3RhY2sKKyMgUmV0dXJuczogICBOdW1iZXIgb2YgaXRlbXMgb24gdGhlIHN0YWNrCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2RlcHRoID0gJChfX2dtc2xfdHIxKSQoY2FsbCBhc3NlcnRfbm9fZG9sbGFyLCQwLCQxKSQod29yZHMgJChfX2dtc2xfc3RhY2tfJDEpKQorCitlbmRpZiAjIF9fZ21zbF9oYXZlX2V2YWwKKworIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgREVCVUdHSU5HIEZBQ0lMSVRJRVMKKyMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUYXJnZXQ6ICAgIGdtc2wtcHJpbnQtJQorIyBBcmd1bWVudHM6IFRoZSAlIHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIHRoYXQgeW91CisjICAgICAgICAgICAgd2lzaCB0byBwcmludCBvdXQuCisjIEFjdGlvbjogICAgRWNob3MgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRoYXQgbWF0Y2hlcyB0aGUgJSBhbmQgaXRzIHZhbHVlLgorIyAgICAgICAgICAgIEZvciBleGFtcGxlLCAnbWFrZSBnbXNsLXByaW50LVNIRUxMJyB3aWxsIG91dHB1dCB0aGUgdmFsdWUgb2YKKyMgICAgICAgICAgICB0aGUgU0hFTEwgdmFyaWFibGUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZ21zbC1wcmludC0lOiA7IEBlY2hvICQqID0gJCgkKikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgYXNzZXJ0CisjIEFyZ3VtZW50czogMTogQSBib29sZWFuIHRoYXQgbXVzdCBiZSB0cnVlIG9yIHRoZSBhc3NlcnRpb24gd2lsbCBmYWlsCisjICAgICAgICAgICAgMjogVGhlIG1lc3NhZ2UgdG8gcHJpbnQgd2l0aCB0aGUgYXNzZXJ0aW9uCisjIFJldHVybnM6ICAgTm9uZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithc3NlcnQgPSAkKGlmICQxLCwkKGNhbGwgX19nbXNsX2Vycm9yLEFzc2VydGlvbiBmYWlsdXJlOiAkMikpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGdW5jdGlvbjogIGFzc2VydF9leGlzdHMKKyMgQXJndW1lbnRzOiAxOiBOYW1lIG9mIGZpbGUgdGhhdCBtdXN0IGV4aXN0LCBpZiBpdCBpcyBtaXNzaW5nIGFuIGFzc2VydGlvbgorIyAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkCisjIFJldHVybnM6ICAgTm9uZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithc3NlcnRfZXhpc3RzID0gJChjYWxsIGFzc2VydCwkKHdpbGRjYXJkICQxKSxmaWxlICckMScgbWlzc2luZykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgYXNzZXJ0X25vX2RvbGxhcgorIyBBcmd1bWVudHM6IDE6IE5hbWUgb2YgYSBmdW5jdGlvbiBiZWluZyBleGVjdXRkCisjICAgICAgICAgICAgMjogQXJndW1lbnRzIHRvIGNoZWNrCisjIFJldHVybnM6ICAgTm9uZQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCithc3NlcnRfbm9fZG9sbGFyID0gJChjYWxsIGFzc2VydCwkKGNhbGwgbm90LCQoZmluZHN0cmluZyAkJCwkMikpLCQxIGNhbGxlZCB3aXRoIGEgZG9sbGFyIHNpZ24gaW4gYXJndW1lbnQpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2J1aWxkL2dtc2wvZ21zbCBiL2FuZHJvaWQvYnVpbGQvZ21zbC9nbXNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2J1aWxkL2dtc2wvZ21zbApAQCAtMCwwICsxLDg5IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgR05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeSAoR01TTCkKKyMKKyMgQSBsaWJyYXJ5IG9mIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHdpdGggR05VIE1ha2UncyAkKGNhbGwpIHRoYXQKKyMgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIGluIHN0YW5kYXJkIEdOVSBNYWtlLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCBKb2huIEdyYWhhbS1DdW1taW5nCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdNU0wKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIAorIyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpvaG4gR3JhaGFtLUN1bW1pbmcgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisjIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyMgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgRGV0ZXJtaW5lIGlmIHRoZSBsaWJyYXJ5IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQgYW5kIGlmIHNvIGRvbid0CisjIGJvdGhlciBpbmNsdWRpbmcgaXQgYWdhaW4KKworaWZuZGVmIF9fZ21zbF9pbmNsdWRlZAorCisjIFN0YW5kYXJkIGRlZmluaXRpb25zIGZvciB0cnVlIGFuZCBmYWxzZS4gIHRydWUgaXMgYW55IG5vbi1lbXB0eQorIyBzdHJpbmcsIGZhbHNlIGlzIGFuIGVtcHR5IHN0cmluZy4gVGhlc2UgYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aAorIyAkKGlmKS4KKwordHJ1ZSAgOj0gVAorZmFsc2UgOj0KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZ1bmN0aW9uOiAgbm90CisjIEFyZ3VtZW50czogMTogQSBib29sZWFuIHZhbHVlCisjIFJldHVybnM6ICAgUmV0dXJucyB0aGUgb3Bwb3NpdGUgb2YgdGhlIGFyZy4gKHRydWUgLT4gZmFsc2UsIGZhbHNlIC0+IHRydWUpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25vdCA9ICQoaWYgJDEsJChmYWxzZSksJCh0cnVlKSkKKworIyBQcmV2ZW50IHJlaW5jbHVzaW9uIG9mIHRoZSBsaWJyYXJ5CisKK19fZ21zbF9pbmNsdWRlZCA6PSAkKHRydWUpCisKKyMgVHJ5IHRvIGRldGVybWluZSB3aGVyZSB0aGlzIGZpbGUgaXMgbG9jYXRlZC4gIElmIHRoZSBjYWxsZXIgZGlkCisjIGluY2x1ZGUgL2Zvby9nbXNsIHRoZW4gZXh0cmFjdCB0aGUgL2Zvby8gc28gdGhhdCBfX2dtc2wgZ2V0cworIyBpbmNsdWRlZCB0cmFuc3BhcmVudGx5CisKK2lmbmVxICgkKE1BS0VGSUxFX0xJU1QpLCkKK19fZ21zbF9yb290IDo9ICQod29yZCAkKHdvcmRzICQoTUFLRUZJTEVfTElTVCkpLCQoTUFLRUZJTEVfTElTVCkpCisKKyMgSWYgdGhlcmUgYXJlIGFueSBzcGFjZXMgaW4gdGhlIHBhdGggaW4gX19nbXNsX3Jvb3QgdGhlbiBnaXZlIHVwCisKK2lmZXEgKDEsJCh3b3JkcyAkKF9fZ21zbF9yb290KSkpCitfX2dtc2xfcm9vdCA6PSAkKHBhdHN1YnN0ICVnbXNsLCUsJChfX2dtc2xfcm9vdCkpCitlbHNlCitfX2dtc2xfcm9vdCA6PQorZW5kaWYKKworaW5jbHVkZSAkKF9fZ21zbF9yb290KV9fZ21zbAorCitlbHNlCisKK2luY2x1ZGUgX19nbXNsCisKK2VuZGlmCisKK2VuZGlmICMgX19nbXNsX2luY2x1ZGVkCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZ21zbC9nbXNsLXRlc3RzIGIvYW5kcm9pZC9idWlsZC9nbXNsL2dtc2wtdGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNWJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvZ21zbC9nbXNsLXRlc3RzCkBAIC0wLDAgKzEsNjQ3IEBACisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgR05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeSAoR01TTCkgVGVzdCBTdWl0ZQorIworIyBUZXN0IHN1aXRlIGZvciB0aGUgR01TTAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBKb2huIEdyYWhhbS1DdW1taW5nCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdNU0wKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIAorIyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEpvaG4gR3JhaGFtLUN1bW1pbmcgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorIyBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisjIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyMgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyMgQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisjIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5QSE9OWTogYWxsCithbGw6CisJQGVjaG8KKwlAZWNobyBUZXN0IFN1bW1hcnkKKwlAZWNobyAtLS0tLS0tLS0tLS0KKwlAZWNobyAiJChjYWxsIGludF9kZWNvZGUsJChwYXNzZWQpKSB0ZXN0cyBwYXNzZWQ7ICQoY2FsbCBpbnRfZGVjb2RlLCQoZmFpbGVkKSkgdGVzdHMgZmFpbGVkIgorCitpbmNsdWRlIGdtc2wKKworcGFzc2VkIDo9CitmYWlsZWQgOj0KKworRUNITyA6PSAvYmluL2VjaG8KKworc3RhcnRfdGVzdCA9ICQoc2hlbGwgJChFQ0hPKSAtbiAiVGVzdGluZyAnJDEnOiAiID4mMikkKGV2YWwgY3VycmVudF90ZXN0IDo9IE9LKQorc3RvcF90ZXN0ICA9ICQoc2hlbGwgJChFQ0hPKSAiICQoY3VycmVudF90ZXN0KSIgPiYyKQordGVzdF9wYXNzID0gLiQoZXZhbCBwYXNzZWQgOj0gJChjYWxsIGludF9pbmMsJChwYXNzZWQpKSkKK3Rlc3RfZmFpbCA9IFgkKGV2YWwgZmFpbGVkIDo9ICQoY2FsbCBpbnRfaW5jLCQoZmFpbGVkKSkpJChldmFsIGN1cnJlbnRfdGVzdCA6PSBFUlJPUiAnJDEnICE9ICckMicpCit0ZXN0X2Fzc2VydCA9ICQoaWYgJChmaWx0ZXIgdW5kZWZpbmVkLCQob3JpZ2luIDIpKSwkKGV2YWwgMiA6PSkpJChzaGVsbCAkKEVDSE8pIC1uICQoaWYgJChjYWxsIHNlcSwkMSwkMiksJChjYWxsIHRlc3RfcGFzcywkMSwkMiksJChjYWxsIHRlc3RfZmFpbCwkMSwkMikpID4mMikKKworJChjYWxsIHN0YXJ0X3Rlc3Qsbm90KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBub3QsJCh0cnVlKSksJChmYWxzZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG5vdCwkKGZhbHNlKSksJCh0cnVlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LG9yKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBvciwkKHRydWUpLCQodHJ1ZSkpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG9yLCQodHJ1ZSksJChmYWxzZSkpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG9yLCQoZmFsc2UpLCQodHJ1ZSkpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG9yLCQoZmFsc2UpLCQoZmFsc2UpKSwkKGZhbHNlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGFuZCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgYW5kLCQodHJ1ZSksJCh0cnVlKSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgYW5kLCQodHJ1ZSksJChmYWxzZSkpLCQoZmFsc2UpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBhbmQsJChmYWxzZSksJCh0cnVlKSksJChmYWxzZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGFuZCwkKGZhbHNlKSwkKGZhbHNlKSksJChmYWxzZSkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCx4b3IpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHhvciwkKHRydWUpLCQodHJ1ZSkpLCQoZmFsc2UpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB4b3IsJCh0cnVlKSwkKGZhbHNlKSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgeG9yLCQoZmFsc2UpLCQodHJ1ZSkpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHhvciwkKGZhbHNlKSwkKGZhbHNlKSksJChmYWxzZSkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxuYW5kKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBuYW5kLCQodHJ1ZSksJCh0cnVlKSksJChmYWxzZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG5hbmQsJCh0cnVlKSwkKGZhbHNlKSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbmFuZCwkKGZhbHNlKSwkKHRydWUpKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBuYW5kLCQoZmFsc2UpLCQoZmFsc2UpKSwkKHRydWUpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsbm9yKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBub3IsJCh0cnVlKSwkKHRydWUpKSwkKGZhbHNlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbm9yLCQodHJ1ZSksJChmYWxzZSkpLCQoZmFsc2UpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBub3IsJChmYWxzZSksJCh0cnVlKSksJChmYWxzZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG5vciwkKGZhbHNlKSwkKGZhbHNlKSksJCh0cnVlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHhub3IpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHhub3IsJCh0cnVlKSwkKHRydWUpKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB4bm9yLCQodHJ1ZSksJChmYWxzZSkpLCQoZmFsc2UpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB4bm9yLCQoZmFsc2UpLCQodHJ1ZSkpLCQoZmFsc2UpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB4bm9yLCQoZmFsc2UpLCQoZmFsc2UpKSwkKHRydWUpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsZmlyc3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGZpcnN0LDEgMiAzKSwxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBmaXJzdCwxKSwxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBmaXJzdCwpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGxhc3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxhc3QsMSAyIDMpLDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxhc3QsMSksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGFzdCwpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHJlc3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHJlc3QsMSAyIDMpLDIgMykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcmVzdCwxKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHJlc3QsKSwpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxjaG9wKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBjaG9wLDEgMiAzKSwxIDIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGNob3AsMSAyIDMgNCksMSAyIDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGNob3AsMSksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBjaG9wLCksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsbGVuZ3RoKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsZW5ndGgsMSAyIDMpLDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxlbmd0aCwxIDIgMyA0KSw0KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsZW5ndGgsMSksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGVuZ3RoLCksMCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LG1hcCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWFwLG9yaWdpbixfX3VuZGVmaW5lZCBtYXAgTUFLRSksdW5kZWZpbmVkIGZpbGUgZGVmYXVsdCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWFwLG9yaWdpbiwpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKK2pvaW5lbSA9ICQxJDIKKyQoY2FsbCBzdGFydF90ZXN0LHBhaXJtYXApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBhaXJtYXAsYWRkc3VmZml4LDIgMSAzLGEgYiBjKSxhMiBiMSBjMykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcGFpcm1hcCxhZGRwcmVmaXgsMiAxIDMsYSBiIGMgZCksMmEgMWIgM2MgZCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcGFpcm1hcCxhZGRwcmVmaXgsMiAxIDMgNCxhIGIgYyksMmEgMWIgM2MpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBhaXJtYXAsam9pbmVtLDIgMSAzIDQsYSBiIGMpLDJhIDFiIDNjIDQpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxzZXEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYmMsYWJjKSxUKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXEseCwpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2VxLCx4KSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSx4LHgpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhJWMsYWJjKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYmMsYSVjKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYmMsQUJDKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYmMsKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSwsKSxUKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXEsYSBiIGMsYSBiIGMpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYSUgYmIlIGNjLGFhJSBiYiUgY2MpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNlcSxhYSUgYmIlIGNjLGFhJSBiYiBjYyksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXEsYWElIGJiJSBjYyx4eCB5eSB6eiksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc25lKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzbmUsYWJjLGFiYyksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzbmUseCwpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNuZSwseCksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc25lLHgseCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzbmUsYWJjLEFCQyksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc25lLGFiYywpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNuZSwsKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNuZSxhIGIgYyxhIGIgYyksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzbmUsYWElIGJiJSBjYyxhYSUgYmIlIGNjKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNuZSxhYSUgYmIlIGNjLGFhJSBiYiBjYyksVCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHN0cmxlbikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3RybGVuLCksMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3RybGVuLGEpLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN0cmxlbixhIGIpLDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN0cmxlbixhICksMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3RybGVuLCBhKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdHJsZW4sICApLDIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN0cmxlbiwgICApLDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN0cmxlbiwgICAgKSw0KQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc3Vic3RyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJzdHIseHl6LDEsMSkseCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3Vic3RyLHh5eiwxLDIpLHh5KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJzdHIseHl6LDIsMykseXopCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZywxLDEpLHMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZywxLDIpLHNvKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJzdHIsc29tZSBzdHJpbmcsMSwzKSxzb20pCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZywxLDQpLHNvbWUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZywxLDUpLHNvbWUgKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJzdHIsc29tZSBzdHJpbmcsMSw2KSxzb21lIHMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZyw1LDUpLCApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZyw1LDYpLCBzKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJzdHIsc29tZSBzdHJpbmcsNSw3KSwgc3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZyw1LDgpLCBzdHIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnN0cixzb21lIHN0cmluZywxLDEwMCksc29tZSBzdHJpbmcpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxsYykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGMsVGhlIFF1aWNrIEJyb3duIEZveCksdGhlIHF1aWNrIGJyb3duIGZveCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGMsdGhlMSBxdWljazIgYnJvd24zIGZveDQpLHRoZTEgcXVpY2syIGJyb3duMyBmb3g0KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsYyxUaGVfKSx0aGVfKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsYywpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHVjKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1YyxUaGUgUXVpY2sgQnJvd24gRm94KSxUSEUgUVVJQ0sgQlJPV04gRk9YKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1Yyx0aGUxIHF1aWNrMiBicm93bjMgZm94NCksVEhFMSBRVUlDSzIgQlJPV04zIEZPWDQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHVjLFRoZV8pLFRIRV8pCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHVjLCksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsdHIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHRyLEEgQiBDLDEgMiAzLENBUElUQUwpLDMxUElUMUwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHRyLGEgYiBjLDEgMiAzLENBUElUQUwpLENBUElUQUwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHRyLEUgTCBJLDMgMSAxLEkgQU0gRUxJVEUpLDEgQU0gMzExVDMpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxsZXEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxlcSwxIDIgMywxIDIgMyksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGVxLDEgMiAzLDEgMiAzIDQpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGVxLDEgMiAzIDQsMSAyIDMpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGVxLDEsMSksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbGVxLCwpLFQpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxsbmUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxuZSwxIDIgMywxIDIgMyksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsbmUsMSAyIDMsMSAyIDMgNCksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbG5lLDEgMiAzIDQsMSAyIDMpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGxuZSwxLDEpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbG5lLCwpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGVtcHR5X3NldCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGVtcHR5X3NldCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoZW1wdHlfc2V0KSwkKGNhbGwgc2V0X2NyZWF0ZSwpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc2V0X2NyZWF0ZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2NyZWF0ZSwpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2NyZWF0ZSwxIDIgMiAzKSwxIDIgMykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2NyZWF0ZSwyIDEgMSAyIDIgMyksMSAyIDMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9jcmVhdGUsMSksMSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHNldF9pbnNlcnQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pbnNlcnQsMSwkKGVtcHR5X3NldCkpLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pbnNlcnQsMSwkKGNhbGwgc2V0X2NyZWF0ZSwxKSksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2luc2VydCwxLCQoY2FsbCBzZXRfY3JlYXRlLDEgMikpLDEgMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2luc2VydCwwLCQoY2FsbCBzZXRfY3JlYXRlLDEgMikpLDAgMSAyKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc2V0X3JlbW92ZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3JlbW92ZSwxLCQoZW1wdHlfc2V0KSksJChlbXB0eV9zZXQpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfcmVtb3ZlLDEsJChjYWxsIHNldF9jcmVhdGUsMSAyKSksMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3JlbW92ZSwxLCQoY2FsbCBzZXRfY3JlYXRlLDEgMTEgMikpLDExIDIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9yZW1vdmUsMCwkKGNhbGwgc2V0X2NyZWF0ZSwxIDIpKSwxIDIpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxzZXRfaXNfbWVtYmVyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfaXNfbWVtYmVyLDEsJChlbXB0eV9zZXQpKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pc19tZW1iZXIsMSwkKGNhbGwgc2V0X2NyZWF0ZSwyIDMpKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pc19tZW1iZXIsMSwkKGNhbGwgc2V0X2NyZWF0ZSwxIDIgMykpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pc19tZW1iZXIsMSwkKGNhbGwgc2V0X2NyZWF0ZSwxKSksVCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHNldF91bmlvbikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3VuaW9uLCwpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3VuaW9uLDEgMiwpLDEgMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3VuaW9uLCwzIDQpLDMgNCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X3VuaW9uLDEgMiwzIDQpLDEgMiAzIDQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF91bmlvbiwxIDIgMywzIDQgNSksMSAyIDMgNCA1KQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc2V0X2ludGVyc2VjdGlvbikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2ludGVyc2VjdGlvbiwsKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pbnRlcnNlY3Rpb24sMSAyLCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfaW50ZXJzZWN0aW9uLCwzIDQpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2ludGVyc2VjdGlvbiwxIDIsMyA0KSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pbnRlcnNlY3Rpb24sMSAyIDMgNCwzIDQgNSksMyA0KQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3Qsc2V0X2lzX3N1YnNldCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2lzX3N1YnNldCwsKSxUKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfaXNfc3Vic2V0LDEgMiwpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2lzX3N1YnNldCwsMyA0KSxUKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfaXNfc3Vic2V0LDEgMiwzIDQpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2lzX3N1YnNldCwxIDIsMSAyIDMgNCA1KSxUKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfaXNfc3Vic2V0LDEgMiwxIDIpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9pc19zdWJzZXQsMSAyLDEgMyA0IDUpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHNldF9lcXVhbCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2VxdWFsLCwpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNldF9lcXVhbCwxLCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzZXRfZXF1YWwsLDEpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2VxdWFsLDEsMSksVCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2VxdWFsLDEgMiwpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2VxdWFsLCwxIDIpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc2V0X2VxdWFsLDEgMiwxIDIgMyksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X2VuY29kZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2VuY29kZSwwKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9lbmNvZGUsMSkseCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2VuY29kZSwyKSx4IHgpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9lbmNvZGUsMTApLHggeCB4IHggeCB4IHggeCB4IHgpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfZGVjb2RlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZGVjb2RlLCksMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RlY29kZSx4KSwxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZGVjb2RlLHggeCksMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RlY29kZSx4IHggeCB4IHggeCB4IHggeCB4KSwxMCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGludF9wbHVzKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfcGx1cywkKGNhbGwgaW50X2VuY29kZSwzKSwkKGNhbGwgaW50X2VuY29kZSw0KSksJChjYWxsIGludF9lbmNvZGUsNykpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9wbHVzLCQoY2FsbCBpbnRfZW5jb2RlLDApLCQoY2FsbCBpbnRfZW5jb2RlLDQpKSwkKGNhbGwgaW50X2VuY29kZSw0KSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X3BsdXMsJChjYWxsIGludF9lbmNvZGUsMyksJChjYWxsIGludF9lbmNvZGUsMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfcGx1cywkKGNhbGwgaW50X2VuY29kZSwwKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9wbHVzLCQoY2FsbCBpbnRfZW5jb2RlLDEpLCQoY2FsbCBpbnRfZW5jb2RlLDApKSwkKGNhbGwgaW50X2VuY29kZSwxKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHBsdXMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBsdXMsMyw0KSw3KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwbHVzLDQsMyksNykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcGx1cywwLDQpLDQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBsdXMsMywwKSwzKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwbHVzLDAsMCksMCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKK19fZ21zbF93YXJuaW5nID0gJDEKKyQoY2FsbCBzdGFydF90ZXN0LGludF9zdWJ0cmFjdCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X3N1YnRyYWN0LCQoY2FsbCBpbnRfZW5jb2RlLDMpLCQoY2FsbCBpbnRfZW5jb2RlLDQpKSxTdWJ0cmFjdGlvbiB1bmRlcmZsb3cpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9zdWJ0cmFjdCwkKGNhbGwgaW50X2VuY29kZSw0KSwkKGNhbGwgaW50X2VuY29kZSwzKSksJChjYWxsIGludF9lbmNvZGUsMSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9zdWJ0cmFjdCwkKGNhbGwgaW50X2VuY29kZSwzKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMykpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9zdWJ0cmFjdCwkKGNhbGwgaW50X2VuY29kZSwwKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9zdWJ0cmFjdCwkKGNhbGwgaW50X2VuY29kZSwxKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMSkpCiskKGNhbGwgc3RvcF90ZXN0KQorCitfX2dtc2xfd2FybmluZyA9IHggeCB4IHggeCB4IHggeCB4IHgKKyQoY2FsbCBzdGFydF90ZXN0LHN1YnRyYWN0KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJ0cmFjdCwzLDQpLDEwKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzdWJ0cmFjdCw0LDMpLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHN1YnRyYWN0LDMsMCksMykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3VidHJhY3QsMCwwKSwwKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X211bHRpcGx5KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbXVsdGlwbHksJChjYWxsIGludF9lbmNvZGUsMyksJChjYWxsIGludF9lbmNvZGUsNCkpLCQoY2FsbCBpbnRfZW5jb2RlLDEyKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X211bHRpcGx5LCQoY2FsbCBpbnRfZW5jb2RlLDQpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKSwkKGNhbGwgaW50X2VuY29kZSwxMikpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9tdWx0aXBseSwkKGNhbGwgaW50X2VuY29kZSwzKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9tdWx0aXBseSwkKGNhbGwgaW50X2VuY29kZSwwKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9tdWx0aXBseSwkKGNhbGwgaW50X2VuY29kZSwxKSwkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxtdWx0aXBseSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbXVsdGlwbHksMyw0KSwxMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbXVsdGlwbHksNCwzKSwxMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbXVsdGlwbHksMywwKSwwKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtdWx0aXBseSwwLDMpLDApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG11bHRpcGx5LDAsMCksMCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKK19fZ21zbF9lcnJvciA9ICQxCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfZGl2aWRlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZGl2aWRlLCQoY2FsbCBpbnRfZW5jb2RlLDMpLCQoY2FsbCBpbnRfZW5jb2RlLDQpKSwkKGNhbGwgaW50X2VuY29kZSwwKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RpdmlkZSwkKGNhbGwgaW50X2VuY29kZSw0KSwkKGNhbGwgaW50X2VuY29kZSwzKSksJChjYWxsIGludF9lbmNvZGUsMSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kaXZpZGUsJChjYWxsIGludF9lbmNvZGUsMzEpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKSwkKGNhbGwgaW50X2VuY29kZSwxMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kaXZpZGUsJChjYWxsIGludF9lbmNvZGUsMzApLCQoY2FsbCBpbnRfZW5jb2RlLDMpKSwkKGNhbGwgaW50X2VuY29kZSwxMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kaXZpZGUsJChjYWxsIGludF9lbmNvZGUsMjkpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKSwkKGNhbGwgaW50X2VuY29kZSw5KSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RpdmlkZSwkKGNhbGwgaW50X2VuY29kZSwwKSwkKGNhbGwgaW50X2VuY29kZSwxKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kaXZpZGUsJChjYWxsIGludF9lbmNvZGUsMSksJChjYWxsIGludF9lbmNvZGUsMCkpLERpdmlzaW9uIGJ5IHplcm8pCiskKGNhbGwgc3RvcF90ZXN0KQorCitfX2dtc2xfZXJyb3IgPSB4IHggeCB4IHggeCB4IHggeCB4CiskKGNhbGwgc3RhcnRfdGVzdCxkaXZpZGUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRpdmlkZSwzLDQpLDApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRpdmlkZSw0LDMpLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRpdmlkZSwyMSwyKSwxMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZGl2aWRlLDIwLDIpLDEwKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBkaXZpZGUsMTksMiksOSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZGl2aWRlLDEsMCksMTApCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxhc3NvY2lhdGl2ZSBhcnJheSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ2V0LG15YXJyYXksa2V5MSksKQorJChjYWxsIHNldCxteWFycmF5LGtleTEsdmFsdWUxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBnZXQsbXlhcnJheSxrZXkxKSx2YWx1ZTEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGdldCxteWFycmF5LGtleTIpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ2V0LG15YXJyYXkxLGtleTEpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZGVmaW5lZCxteWFycmF5LGtleTEpLFQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRlZmluZWQsbXlhcnJheSxrZXkyKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRlZmluZWQsbXlhcnJheTEsa2V5MSksKQorJChjYWxsIHNldCxteWFycmF5LGtleTIsdmFsdWUyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBrZXlzLG15YXJyYXkpLGtleTEga2V5MikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwga2V5cyxteWFycmF5MSksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsbmFtZWQgc3RhY2spCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBvcCxteXN0YWNrKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHB1c2gsbXlzdGFjayxlMikpCiskKGNhbGwgcHVzaCxteXN0YWNrLGUxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwb3AsbXlzdGFjayksZTEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBvcCxteXN0YWNrKSxlMikKKyQoY2FsbCBwdXNoLG15c3RhY2ssZjMpCiskKGNhbGwgcHVzaCxteXN0YWNrLGYxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwb3AsbXlzdGFjayksZjEpCiskKGNhbGwgcHVzaCxteXN0YWNrLGYyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwZWVrLG15c3RhY2spLGYyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBkZXB0aCxteXN0YWNrKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBwb3AsbXlzdGFjayksZjIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRlcHRoLG15c3RhY2spLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHBvcCxteW90aGVyc3RhY2spLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LHJldmVyc2UpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHJldmVyc2UsKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHJldmVyc2UsMSksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcmV2ZXJzZSwxIDIpLDIgMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgcmV2ZXJzZSwxIDIgMyksMyAyIDEpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCx1bmlxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1bmlxLCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1bmlxLGEpLGEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHVuaXEsYSBhKSxhKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1bmlxLGEgYWEpLGEgYWEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHVuaXEsYSBhYSBhKSxhIGFhKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCB1bmlxLGEgYiBiYSBhYiBiIGEgYSBiYSBhKSxhIGIgYmEgYWIpCiskKGNhbGwgc3RvcF90ZXN0KQorCitjOj0sCiskKGNhbGwgc3RhcnRfdGVzdCxzcGxpdCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3BsaXQsJGMsY29tbWEkY3NlcGFyYXRlZCRjc3RyaW5nKSxjb21tYSBzZXBhcmF0ZWQgc3RyaW5nKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzcGxpdCwqLHN0YXIqZmllbGQqcmVjb3JkKSxzdGFyIGZpZWxkIHJlY29yZCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3BsaXQsKixzdGFyKiksc3RhcikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgc3BsaXQsKixzdGFyKmZpZWxkKSxzdGFyIGZpZWxkKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBzcGxpdCwqLHN0YXIqKioqZmllbGQpLHN0YXIgZmllbGQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIHNwbGl0LCosKSwpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxtZXJnZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWVyZ2UsJGMsbGlzdCBvZiB0aGluZ3MpLGxpc3QkY29mJGN0aGluZ3MpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG1lcmdlLCosbGlzdCBvZiB0aGluZ3MpLGxpc3Qqb2YqdGhpbmdzKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtZXJnZSwqLGxpc3QpLGxpc3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG1lcmdlLCosKSwpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfbWF4KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbWF4LCQoY2FsbCBpbnRfZW5jb2RlLDIpLCQoY2FsbCBpbnRfZW5jb2RlLDEpKSwkKGNhbGwgaW50X2VuY29kZSwyKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X21heCwkKGNhbGwgaW50X2VuY29kZSwxKSwkKGNhbGwgaW50X2VuY29kZSwyKSksJChjYWxsIGludF9lbmNvZGUsMikpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9tYXgsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbWF4LCQoY2FsbCBpbnRfZW5jb2RlLDApLCQoY2FsbCBpbnRfZW5jb2RlLDIpKSwkKGNhbGwgaW50X2VuY29kZSwyKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X21heCwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwyKSksJChjYWxsIGludF9lbmNvZGUsMikpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9tYXgsJChjYWxsIGludF9lbmNvZGUsMCksJChjYWxsIGludF9lbmNvZGUsMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDApKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsbWF4KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMiwxKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMSwyKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMiwwKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMCwyKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMiwyKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBtYXgsMCwwKSwwKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X21pbikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X21pbiwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwxKSksJChjYWxsIGludF9lbmNvZGUsMSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9taW4sJChjYWxsIGludF9lbmNvZGUsMSksJChjYWxsIGludF9lbmNvZGUsMikpLCQoY2FsbCBpbnRfZW5jb2RlLDEpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbWluLCQoY2FsbCBpbnRfZW5jb2RlLDIpLCQoY2FsbCBpbnRfZW5jb2RlLDApKSwkKGNhbGwgaW50X2VuY29kZSwwKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X21pbiwkKGNhbGwgaW50X2VuY29kZSwwKSwkKGNhbGwgaW50X2VuY29kZSwyKSksJChjYWxsIGludF9lbmNvZGUsMCkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9taW4sJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMikpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbWluLCQoY2FsbCBpbnRfZW5jb2RlLDApLCQoY2FsbCBpbnRfZW5jb2RlLDApKSwkKGNhbGwgaW50X2VuY29kZSwwKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LG1pbikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDIsMSksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDEsMiksMSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDIsMCksMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDAsMiksMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDIsMiksMikKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbWluLDAsMCksMCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKK19fZ21zbF9lcnJvciA9ICQxCiskKGNhbGwgc3RhcnRfdGVzdCxhc3NlcnQgZnVuY3Rpb25zKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBhc3NlcnQsJCh0cnVlKSxpZ25vcmUpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgYXNzZXJ0LCQoZmFsc2UpLGZhaWxlZCksQXNzZXJ0aW9uIGZhaWx1cmU6IGZhaWxlZCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgYXNzZXJ0X2V4aXN0cyxnbXNsLXRlc3RzKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGFzc2VydF9leGlzdHMsTUlTU0lORy1nbXNsLXRlc3RzKSxBc3NlcnRpb24gZmFpbHVyZTogZmlsZSAnTUlTU0lORy1nbXNsLXRlc3RzJyBtaXNzaW5nKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X2luYykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2luYywkKGNhbGwgaW50X2VuY29kZSwwKSksJChjYWxsIGludF9lbmNvZGUsMSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9pbmMsJChjYWxsIGludF9lbmNvZGUsMSkpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfaW5jLCQoY2FsbCBpbnRfZW5jb2RlLDQpKSwkKGNhbGwgaW50X2VuY29kZSw1KSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2luYywkKGNhbGwgaW50X2VuY29kZSwxMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDExKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGluYykKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW5jLDApLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGluYywxKSwyKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbmMsNCksNSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW5jLDEwKSwxMSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKK19fZ21zbF93YXJuaW5nID0gJDEKKyQoY2FsbCBzdGFydF90ZXN0LGludF9kZWMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kZWMsJChjYWxsIGludF9lbmNvZGUsMCkpLERlY3JlbWVudCB1bmRlcmZsb3cpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kZWMsJChjYWxsIGludF9lbmNvZGUsMSkpLCQoY2FsbCBpbnRfZW5jb2RlLDApKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZGVjLCQoY2FsbCBpbnRfZW5jb2RlLDQpKSwkKGNhbGwgaW50X2VuY29kZSwzKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RlYywkKGNhbGwgaW50X2VuY29kZSwxMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDkpKQorJChjYWxsIHN0b3BfdGVzdCkKKworX19nbXNsX3dhcm5pbmcgPSB4IHggeCB4IHggeCB4IHggeCB4CiskKGNhbGwgc3RhcnRfdGVzdCxkZWMpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRlYywwKSwxMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZGVjLDEpLDApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRlYyw0KSwzKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBkZWMsMTApLDkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfZG91YmxlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZG91YmxlLCQoY2FsbCBpbnRfZW5jb2RlLDApKSwkKGNhbGwgaW50X2VuY29kZSwwKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2RvdWJsZSwkKGNhbGwgaW50X2VuY29kZSwxKSksJChjYWxsIGludF9lbmNvZGUsMikpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9kb3VibGUsJChjYWxsIGludF9lbmNvZGUsNCkpLCQoY2FsbCBpbnRfZW5jb2RlLDgpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsZG91YmxlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBkb3VibGUsMCksMCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZG91YmxlLDEpLDIpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGRvdWJsZSw0KSw4KQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X2hhbHZlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfaGFsdmUsJChjYWxsIGludF9lbmNvZGUsMCkpLCQoY2FsbCBpbnRfZW5jb2RlLDApKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfaGFsdmUsJChjYWxsIGludF9lbmNvZGUsMikpLCQoY2FsbCBpbnRfZW5jb2RlLDEpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfaGFsdmUsJChjYWxsIGludF9lbmNvZGUsOCkpLCQoY2FsbCBpbnRfZW5jb2RlLDQpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfaGFsdmUsJChjYWxsIGludF9lbmNvZGUsNykpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaGFsdmUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGhhbHZlLDApLDApCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGhhbHZlLDIpLDEpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGhhbHZlLDgpLDQpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGhhbHZlLDcpLDMpCiskKGNhbGwgc3RvcF90ZXN0KSAKKworJChjYWxsIHN0YXJ0X3Rlc3QsZ3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGd0LDIsMyksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBndCwzLDIpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGd0LDIsMiksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsZ3RlKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBndGUsMiwzKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGd0ZSwzLDIpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGd0ZSwyLDIpLCQodHJ1ZSkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxsdCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbHQsMiwzKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBsdCwzLDIpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbHQsMiwyKSwpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxsdGUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGx0ZSwyLDMpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGx0ZSwzLDIpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbHRlLDIsMiksJCh0cnVlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGVxKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBlcSwyLDMpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZXEsMywyKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGVxLDIsMiksJCh0cnVlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LG5lKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBuZSwyLDMpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIG5lLDMsMiksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgbmUsMiwyKSwpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfZ3QpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9ndCwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwzKSksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZ3QsJChjYWxsIGludF9lbmNvZGUsMyksJChjYWxsIGludF9lbmNvZGUsMikpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9ndCwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwyKSksKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X2d0ZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2d0ZSwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwzKSksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZ3RlLCQoY2FsbCBpbnRfZW5jb2RlLDMpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZ3RlLCQoY2FsbCBpbnRfZW5jb2RlLDIpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKSwkKHRydWUpKQorJChjYWxsIHN0b3BfdGVzdCkKKworJChjYWxsIHN0YXJ0X3Rlc3QsaW50X2x0KQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbHQsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMykpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9sdCwkKGNhbGwgaW50X2VuY29kZSwzKSwkKGNhbGwgaW50X2VuY29kZSwyKSksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbHQsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMikpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGludF9sdGUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9sdGUsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMykpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9sdGUsJChjYWxsIGludF9lbmNvZGUsMyksJChjYWxsIGludF9lbmNvZGUsMikpLCkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2x0ZSwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwyKSksJCh0cnVlKSkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGludF9lcSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X2VxLCQoY2FsbCBpbnRfZW5jb2RlLDIpLCQoY2FsbCBpbnRfZW5jb2RlLDMpKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9lcSwkKGNhbGwgaW50X2VuY29kZSwzKSwkKGNhbGwgaW50X2VuY29kZSwyKSksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfZXEsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMikpLCQodHJ1ZSkpCiskKGNhbGwgc3RvcF90ZXN0KQorCiskKGNhbGwgc3RhcnRfdGVzdCxpbnRfbmUpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGludF9uZSwkKGNhbGwgaW50X2VuY29kZSwyKSwkKGNhbGwgaW50X2VuY29kZSwzKSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgaW50X25lLCQoY2FsbCBpbnRfZW5jb2RlLDMpLCQoY2FsbCBpbnRfZW5jb2RlLDIpKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBpbnRfbmUsJChjYWxsIGludF9lbmNvZGUsMiksJChjYWxsIGludF9lbmNvZGUsMikpLCkKKyQoY2FsbCBzdG9wX3Rlc3QpCisKKyQoY2FsbCBzdGFydF90ZXN0LGdtc2xfY29tcGF0aWJsZSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLCQoZ21zbF92ZXJzaW9uKSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLDAgOSAwKSwkKHRydWUpKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBnbXNsX2NvbXBhdGlibGUsMCAwIDEpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGdtc2xfY29tcGF0aWJsZSwwIDAgMCksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLDIgMCAwKSwpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGdtc2xfY29tcGF0aWJsZSwxIDEgMCksKQorJChjYWxsIHRlc3RfYXNzZXJ0LCQoY2FsbCBnbXNsX2NvbXBhdGlibGUsMSAwIDgpLCQodHJ1ZSkpCiskKGNhbGwgdGVzdF9hc3NlcnQsJChjYWxsIGdtc2xfY29tcGF0aWJsZSwxIDAgOCksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLDEgMCAxMCksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLDEgMCAxMSksJCh0cnVlKSkKKyQoY2FsbCB0ZXN0X2Fzc2VydCwkKGNhbGwgZ21zbF9jb21wYXRpYmxlLDEgMCAxMiksKQorJChjYWxsIHN0b3BfdGVzdCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvYnVpbGQvZ21zbC9pbmRleC5odG1sIGIvYW5kcm9pZC9idWlsZC9nbXNsL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjOTNhZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvYnVpbGQvZ21zbC9pbmRleC5odG1sCkBAIC0wLDAgKzEsNjg3IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPjxoZWFkPgorICA8bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIj4KKyAgPHRpdGxlPkdOVSBNYWtlIFN0YW5kYXJkIExpYnJhcnk8L3RpdGxlPjwvaGVhZD4KKworPGJvZHk+Cis8aDE+R05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeTwvaDE+CitUaGUgR05VIE1ha2UgU3RhbmRhcmQgTGlicmFyeSAoR01TTCkgaXMgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucworaW1wbGVtZW50ZWQgdXNpbmcgbmF0aXZlIEdOVSBNYWtlIGZ1bmN0aW9uYWxpdHkgdGhhdCBwcm92aWRlIGxpc3QgYW5kCitzdHJpbmcgbWFuaXB1bGF0aW9uLCBpbnRlZ2VyIGFyaXRobWV0aWMsIGFzc29jaWF0aXZlIGFycmF5cywgc3RhY2tzLAorYW5kIGRlYnVnZ2luZyBmYWNpbGl0aWVzLiZuYnNwOyBUaGUgR01TTCBpcyByZWxlYXNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2UuPGJyPgorPGJyPgorPGEgaHJlZj0iaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9nbXNsLyI+W1Byb2plY3QgUGFnZV08L2E+IDxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTEyOTg4NyI+W0Rvd25sb2FkXTwvYT4KKzxhIGhyZWY9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvZm9ydW0vZm9ydW0ucGhwP2ZvcnVtX2lkPTQ0MzkxNiI+W0Rpc2N1c3Npb24KK0ZvcnVtXTwvYT48YnI+Cis8aDI+VXNpbmcgR01TTDwvaDI+CitUaGUgdHdvIGZpbGVzIG5lZWRlZCBhcmUgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5nbXNsPC9zcGFuPgorYW5kIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+X19nbXNsPC9zcGFuPi4mbmJzcDsgVG8KK2luY2x1ZGUgdGhlIEdNU0wgaW4geW91ciBNYWtlZmlsZSBkbzxicj4KKzxwcmUgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0MHB4OyI+aW5jbHVkZSBnbXNsPC9wcmU+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmdtc2w8L3NwYW4+IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXM8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPiBfX2dtc2w8L3NwYW4+LiZuYnNwOyBUbyBjaGVjayB0aGF0Cit5b3UgaGF2ZSB0aGUgcmlnaHQgdmVyc2lvbiBvZiA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmdtc2w8L3NwYW4+Cit1c2UgdGhlIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Z21zbF9jb21wYXRpYmxlPC9zcGFuPgorZnVuY3Rpb24gKHNlZQorYmVsb3cpLiBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+MQorMCAxMTwvc3Bhbj4uPGJyPgorPGJyPgorVGhlIEdNU0wgcGFja2FnZSBhbHNvIGluY2x1ZGVzIGEgdGVzdCBzdWl0ZSBmb3IgR01TTC4mbmJzcDsgSnVzdCBydW4gPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5tYWtlIC1mIGdtc2wtdGVzdHM8L3NwYW4+Ljxicj4KKzxoMj5Mb2dpY2FsIE9wZXJhdG9yczwvaDI+R01TTCBoYXMgYm9vbGVhbiAkKHRydWUpIChhIG5vbi1lbXB0eSBzdHJpbmcpCithbmQgJChmYWxzZSkgKGFuIGVtcHR5IHN0cmluZykuJm5ic3A7IFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGNhbiBiZQordXNlZCB3aXRoIHRob3NlIHZhcmlhYmxlcy48YnI+Cis8YnI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPm5vdDwvc3Bhbj48YnI+CisKKzxicj4KKworPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IEEgYm9vbGVhbiB2YWx1ZTwvc3Bhbj48YnIgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKworPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5SZXR1cm5zOiZuYnNwOyZuYnNwOyBSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIGJvb2xlYW4gaXMgJChmYWxzZSkgYW5kIHZpY2UgdmVyc2E8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+CisKKzxociBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+PC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPmFuZDwvc3Bhbj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogVHdvIGJvb2xlYW4gdmFsdWVzPC9zcGFuPjxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5SZXR1cm5zOiZuYnNwOyZuYnNwOyBSZXR1cm5zICQodHJ1ZSkgaWYgYm90aCBvZiB0aGUgYm9vbGVhbnMgYXJlIHRydWU8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPm9yPC9zcGFuPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiBUd28gYm9vbGVhbiB2YWx1ZXM8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPlJldHVybnM6Jm5ic3A7Jm5ic3A7IFJldHVybnMgJCh0cnVlKSBpZiBlaXRoZXIgb2YgdGhlIGJvb2xlYW5zIGlzIHRydWU8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPnhvcjwvc3Bhbj48YnIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkOyI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogVHdvIGJvb2xlYW4gdmFsdWVzPC9zcGFuPjxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5SZXR1cm5zOiZuYnNwOyZuYnNwOyBSZXR1cm5zICQodHJ1ZSkgaWYgZXhhY3RseSBvbmUgb2YgdGhlIGJvb2xlYW5zIGlzIHRydWU8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPm5hbmQ8L3NwYW4+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IFR3byBib29sZWFuIHZhbHVlczwvc3Bhbj48YnIgc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+UmV0dXJuczombmJzcDsmbmJzcDsgUmV0dXJucyB2YWx1ZSBvZiAnbm90IGFuZCc8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsiPm5vcjwvc3Bhbj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogVHdvIGJvb2xlYW4gdmFsdWVzPC9zcGFuPjxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5SZXR1cm5zOiZuYnNwOyZuYnNwOyBSZXR1cm5zIHZhbHVlIG9mICdub3Qgb3InPC9zcGFuPjxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij54bm9yPC9zcGFuPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiBUd28gYm9vbGVhbiB2YWx1ZXM8L3NwYW4+PGJyIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPlJldHVybnM6Jm5ic3A7Jm5ic3A7IFJldHVybnMgdmFsdWUgb2YgJ25vdCB4b3InPC9zcGFuPjxiciBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4KKzxoMj5MaXN0IE1hbmlwdWxhdGlvbiBGdW5jdGlvbnM8L2gyPgorJm5ic3A7QSBsaXN0IGlzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnM7IHRoZSBsaXN0IHNlcGFyYXRvciBpcyBhIHNwYWNlLjxicj4KKworPGJyPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7Ij48Yj5maXJzdDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBsaXN0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgbGlzdDxicj4KKzwvc3Bhbj4KKzxocj48Yj5sYXN0PC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIGxpc3Q8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIGxpc3Q8YnI+Cis8L3NwYW4+Cis8aHI+PGI+cmVzdDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBsaXN0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBsaXN0IHdpdGggdGhlIGZpcnN0IGVsZW1lbnQKK3JlbW92ZWQ8YnI+Cis8L3NwYW4+Cis8aHI+PGI+Y2hvcDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBsaXN0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBsaXN0IHdpdGggdGhlIGxhc3QgZWxlbWVudCByZW1vdmVkPGJyPgorPC9zcGFuPgorPGhyPjxiPm1hcDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogTmFtZSBvZiBmdW5jdGlvbiB0bworJChjYWxsKSBmb3IgZWFjaCBlbGVtZW50IG9mIGxpc3Q8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogTGlzdCB0bworaXRlcmF0ZSBvdmVyIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGluIDE8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBsaXN0IGFmdGVyIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIGVhY2gKK2VsZW1lbnQ8YnI+Cis8L3NwYW4+Cis8aHI+PGI+cGFpcm1hcDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogTmFtZSBvZiBmdW5jdGlvbiB0bworJChjYWxsKSBmb3IgZWFjaCBwYWlyIG9mIGVsZW1lbnRzPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IExpc3QgdG8KK2l0ZXJhdGUgb3ZlciBjYWxsaW5nIHRoZSBmdW5jdGlvbiBpbiAxPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDM6IFNlY29uZAorbGlzdCB0byBpdGVyYXRlIG92ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24gaW4gMTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGxpc3QgYWZ0ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24gb24gZWFjaAorcGFpciBvZiBlbGVtZW50czxicj4KKzwvc3Bhbj4KKzxocj48Yj5sZXE8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbGlzdCB0byBjb21wYXJlCithZ2FpbnN0Li4uPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IC4uLnRoaXMKK2xpc3Q8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgJCh0cnVlKSBpZiB0aGUgdHdvIGxpc3RzIGFyZSBpZGVudGljYWw8YnI+Cis8L3NwYW4+Cis8aHI+PGI+bG5lPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIGxpc3QgdG8gY29tcGFyZQorYWdhaW5zdC4uLjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiAuLi50aGlzCitsaXN0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIHR3byBsaXN0cyBhcmUgZGlmZmVyZW50PGJyPgorPC9zcGFuPgorPGhyPjxiPnJldmVyc2U8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbGlzdCB0byByZXZlcnNlPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtUaGUgbGlzdCB3aXRoIGl0cyBlbGVtZW50cyBpbiByZXZlcnNlIG9yZGVyPGJyPgorPC9zcGFuPgorPGhyPjxiPnVuaXE8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbGlzdCB0byBkZWR1cGxpY2F0ZTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGxpc3Qgd2l0aCBlbGVtZW50cyBpbiBvcmRlciB3aXRob3V0IGR1cGxpY2F0ZXM8YnI+Cis8L3NwYW4+Cis8aHI+PGI+bGVuZ3RoPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIGxpc3Q8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3Q8YnI+Cis8L3NwYW4+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPgorPGgyPlN0cmluZyBNYW5pcHVsYXRpb24gRnVuY3Rpb25zPC9oMj4KK0Egc3RyaW5nIGlzIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLjxicj4KKzxicj4KKzxociBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMnB4OyI+PGI+c2VxPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIHN0cmluZyB0byBjb21wYXJlCithZ2FpbnN0Li4uPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IC4uLnRoaXMKK3N0cmluZzxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyAkKHRydWUpIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUKK2lkZW50aWNhbDxicj4KKzwvc3Bhbj4KKzxocj48Yj5zbmU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgc3RyaW5nIHRvIGNvbXBhcmUKK2FnYWluc3QuLi48YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogLi4udGhpcworc3RyaW5nPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zICQodHJ1ZSkgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSBub3QKK3RoZSBzYW1lPGJyPgorPC9zcGFuPgorPGhyPjxiPnN0cmxlbjwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBzdHJpbmc8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nPGJyPgorPC9zcGFuPgorPGhyPjxiPnN1YnN0cjwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBzdHJpbmc8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogU3RhcnQgb2Zmc2V0IChmaXJzdCBjaGFyYWN0ZXIgaXMgMSk8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMzogRW5kaW5nIG9mZnNldCAoaW5jbHVzaXZlKTxicj5SZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgYSBzdWJzdHJpbmc8YnI+Cis8L3NwYW4+Cis8aHI+PGI+c3BsaXQ8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IFRoZSBjaGFyYWN0ZXIgdG8KK3NwbGl0IG9uPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IEEKK3N0cmluZyB0byBzcGxpdDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7U3BsaXRzIGEgc3RyaW5nIGludG8gYSBsaXN0IHNlcGFyYXRlZCBieQorc3BhY2VzIGF0IHRoZSBzcGxpdDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBjaGFyYWN0ZXIKK2luIHRoZSBmaXJzdCBhcmd1bWVudDxicj4KKzwvc3Bhbj4KKzxocj48Yj5tZXJnZTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogVGhlIGNoYXJhY3RlciB0bworcHV0IGJldHdlZW4gZmllbGRzPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IEEgbGlzdAordG8gbWVyZ2UgaW50byBhIHN0cmluZzxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7TWVyZ2VzIGEgbGlzdCBpbnRvIGEgc2luZ2xlIHN0cmluZywgbGlzdAorZWxlbWVudHMgYXJlIHNlcGFyYXRlZDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBieSB0aGUKK2NoYXJhY3RlciBpbiB0aGUgZmlyc3QgYXJndW1lbnQ8YnI+Cis8L3NwYW4+Cis8aHI+PGI+dHI8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IFRoZSBsaXN0IG9mCitjaGFyYWN0ZXJzIHRvIHRyYW5zbGF0ZSBmcm9tIDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBUaGUKK2xpc3Qgb2YgY2hhcmFjdGVycyB0byB0cmFuc2xhdGUgdG88YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMzogVGhlCit0ZXh0IHRvIHRyYW5zbGF0ZTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgdGV4dCBhZnRlciB0cmFuc2xhdGluZyBjaGFyYWN0ZXJzPGJyPgorPC9zcGFuPgorPGhyPjxiPnVjPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBUZXh0IHRvIHVwcGVyIGNhc2U8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHRleHQgaW4gdXBwZXIgY2FzZTxicj4KKzwvc3Bhbj4KKzxocj48Yj5sYzwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogVGV4dCB0byBsb3dlciBjYXNlPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSB0ZXh0IGluIGxvd2VyIGNhc2U8YnI+Cis8L3NwYW4+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPgorPGgyPlNldCBNYW5pcHVsYXRpb24gRnVuY3Rpb25zPC9oMj4KK1NldHMgYXJlIHJlcHJlc2VudGVkIGJ5IHNvcnRlZCwgZGVkdXBsaWNhdGVkIGxpc3RzLiAgVG8gY3JlYXRlIGEgc2V0Citmcm9tIGEgbGlzdCB1c2UgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OgorbW9ub3NwYWNlOyI+c2V0X2NyZWF0ZTwvc3Bhbj4sIG9yIHN0YXJ0IHdpdGggdGhlIDxzcGFuCitzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmVtcHR5X3NldDwvc3Bhbj4gYW5kIDxzcGFuCitzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnNldF9pbnNlcnQ8L3NwYW4+IGluZGl2aWR1YWwgZWxlbWVudHMuCitUaGUgZW1wdHkgc2V0IGlzIGRlZmluZWQgYXMgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OgorbW9ub3NwYWNlOyI+ZW1wdHlfc2V0PC9zcGFuPi48cD4KKworPGhyPjxiPnNldF9jcmVhdGU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbGlzdCBvZiBzZXQgZWxlbWVudHM8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgc2V0PGJyPgorPC9zcGFuPgorCis8aHI+PGI+c2V0X2luc2VydDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBzaW5nbGUgZWxlbWVudCB0byBhZGQgdG8gYSBzZXQ8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyOiBBIHNldDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgc2V0IHdpdGggdGhlIGVsZW1lbnQgYWRkZWQ8YnI+Cis8L3NwYW4+CisKKzxocj48Yj5zZXRfcmVtb3ZlPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIHNpbmdsZSBlbGVtZW50IHRvIHJlbW92ZSBmcm9tIGEgc2V0PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7MjogQSBzZXQ8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHNldCB3aXRoIHRoZSBlbGVtZW50IHJlbW92ZWQ8YnI+Cis8L3NwYW4+CisKKzxocj48Yj5zZXRfaXNfbWVtYmVyPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIHNpbmdsZSBlbGVtZW50PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7MjogQSBzZXQ8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgJCh0cnVlKSBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgc2V0PGJyPgorPC9zcGFuPgorCis8aHI+PGI+c2V0X3VuaW9uPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIHNldDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzI6IEFub3RoZXIgc2V0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSB1bmlvbiBvZiB0aGUgdHdvIHNldHM8YnI+Cis8L3NwYW4+CisKKzxocj48Yj5zZXRfaW50ZXJzZWN0aW9uPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIHNldDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzI6IEFub3RoZXIgc2V0PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzZXRzPGJyPgorPC9zcGFuPgorCis8aHI+PGI+c2V0X2lzX3N1YnNldDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBzZXQ8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyOiBBbm90aGVyIHNldDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyAkKHRydWUpIGlmIHRoZSBmaXJzdCBzZXQgaXMgYSBzdWJzZXQgb2YgdGhlIHNlY29uZDxicj4KKzwvc3Bhbj4KKworPGhyPjxiPnNldF9lcXVhbDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBzZXQ8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyOiBBbm90aGVyIHNldDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyAkKHRydWUpIGlmIHRoZSB0d28gc2V0cyBhcmUgaWRlbnRpY2FsPGJyPgorPC9zcGFuPgorCis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPgorPGgyPkludGVnZXIgQXJpdGhtZXRpYyBGdW5jdGlvbnM8L2gyPgorSW50ZWdlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IGxpc3RzIHdpdGggdGhlIGVxdWl2YWxlbnQgbnVtYmVyIG9mCit4J3MuJm5ic3A7IEZvciBleGFtcGxlIHRoZSBudW1iZXIgNCBpcyB4IHggeCB4LiZuYnNwOyBUaGUgbWF4aW11bQoraW50ZWdlciB0aGF0IHRoZSBsaWJyYXJ5IGNhbiBoYW5kbGUgYXMgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmlucHV0PC9zcGFuPiAoaS5lLiBhcyB0aGUgYXJndW1lbnQgdG8gYQorY2FsbCB0byA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludF9lbmNvZGU8L3NwYW4+KSBpcworNjU1MzYuIFRoZXJlIGlzIG5vIGxpbWl0IG9uIGludGVnZXIgc2l6ZSBmb3IgaW50ZXJuYWwgY29tcHV0YXRpb25zIG9yCitvdXRwdXQuPGJyPgorPGJyPgorVGhlIGFyaXRobWV0aWMgbGlicmFyeSBmdW5jdGlvbnMgY29tZSBpbiB0d28gZm9ybXM6IG9uZSBmb3JtIG9mIGVhY2gKK2Z1bmN0aW9uIHRha2VzIGludGVnZXJzIGFzIGFyZ3VtZW50cyBhbmQgdGhlIG90aGVyIGZvcm0gdGFrZXMgdGhlCitlbmNvZGVkIGZvcm0gKHgncyBjcmVhdGVkIGJ5IGEgY2FsbCB0byA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludF9lbmNvZGU8L3NwYW4+KS4mbmJzcDsgRm9yIGV4YW1wbGUsCit0aGVyZSBhcmUgdHdvIHBsdXMgZnVuY3Rpb25zOiA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPnBsdXM8L3NwYW4+CisoY2FsbGVkIHdpdGggaW50ZWdlciBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gaW50ZWdlcikgYW5kIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+aW50X3BsdXM8L3NwYW4+IChjYWxsZWQgd2l0aCBlbmNvZGVkCithcmd1bWVudHMgYW5kIHJldHVybnMgYW4gZW5jb2RlZCByZXN1bHQpLjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+cGx1czwvc3Bhbj4gd2lsbCBiZSBzbG93ZXIgdGhhbiA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPmludF9wbHVzPC9zcGFuPiBiZWNhdXNlIGl0cyBhcmd1bWVudHMKK2FuZCByZXN1bHQgaGF2ZSB0byBiZSB0cmFuc2xhdGVkIGJldHdlZW4gdGhlIHgncyBmb3JtYXQgYW5kCitpbnRlZ2Vycy4mbmJzcDsgSWYgZG9pbmcgYSBjb21wbGV4IGNhbGN1bGF0aW9uIHVzZSB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5pbnRfKjwvc3Bhbj4gZm9ybXMgd2l0aCBhIHNpbmdsZQorZW5jb2Rpbmcgb2YgaW5wdXRzIGFuZCBzaW5nbGUgZGVjb2Rpbmcgb2YgdGhlIG91dHB1dC4mbmJzcDsgRm9yIHNpbXBsZQorY2FsY3VsYXRpb25zIHRoZSBkaXJlY3QgZm9ybXMgY2FuIGJlIHVzZWQuPGJyPgorPGJyPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7Ij48Yj5pbnRfZGVjb2RlPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIG51bWJlciBvZiB4J3MKK3JlcHJlc2VudGF0aW9uPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBpbnRlZ2VyIGZvciBodW1hbiBjb25zdW1wdGlvbgordGhhdCBpcyByZXByZXNlbnRlZDxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBieSB0aGUKK3N0cmluZyBvZiB4J3M8YnI+Cis8L3NwYW4+Cis8aHI+PGI+aW50X2VuY29kZTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBudW1iZXIgaW4KK2h1bWFuLXJlYWRhYmxlIGludGVnZXIgZm9ybTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyB0aGUgaW50ZWdlciBlbmNvZGVkIGFzIGEgc3RyaW5nIG9mIHgnczxicj4KKzwvc3Bhbj4KKzxocj48Yj5pbnRfcGx1czwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBBbm90aGVyCitudW1iZXIgaW4geCdzIHJlcHJlc250YXRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHN1bSBvZiB0aGUgdHdvIG51bWJlcnMgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KKzwvc3Bhbj4KKzxocj48Yj5wbHVzICh3cmFwcGVkIHZlcnNpb24gb2YgaW50X3BsdXMpPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IEFub3RoZXIKK2ludGVnZXI8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHN1bSBvZiB0aGUgdHdvIGludGVnZXJzPGJyPgorPC9zcGFuPgorPGhyPjxiPmludF9zdWJ0cmFjdDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBBbm90aGVyCitudW1iZXIgaW4geCdzIHJlcHJlc250YXRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBudW1iZXJzIGluCit4J3MgcmVwcmVzZW50YXRpb24sPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IG9yIG91dHB1dHMKK2FuIGVycm9yIG9uIGEgbnVtZXJpYyB1bmRlcmZsb3c8YnI+Cis8L3NwYW4+Cis8aHI+PGI+c3VidHJhY3QgKHdyYXBwZWQgdmVyc2lvbiBvZiBpbnRfc3VidHJhY3QpPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IEFub3RoZXIKK2ludGVnZXI8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBpbnRlZ2Vycyw8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgb3Igb3V0cHV0cworYW4gZXJyb3Igb24gYSBudW1lcmljIHVuZGVyZmxvdzxicj4KKzwvc3Bhbj4KKzxocj48Yj5pbnRfbXVsdGlwbHk8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbnVtYmVyIGluIHgncworcmVwcmVzZW50YXRpb248YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogQW5vdGhlcgorbnVtYmVyIGluIHgncyByZXByZXNudGF0aW9uPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB0d28gbnVtYmVycyBpbiB4J3MKK3JlcHJlc2VudGF0aW9uPGJyPgorPC9zcGFuPgorPGhyPjxiPm11bHRpcGx5ICh3cmFwcGVkIHZlcnNpb24gb2YgaW50X211bHRpcGx5KTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQW4gaW50ZWdlcjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBBbm90aGVyCitpbnRlZ2VyPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBwcm9kdWN0IG9mIHRoZSB0d28gaW50ZWdlcnM8YnI+Cis8L3NwYW4+Cis8aHI+PGI+aW50X2RpdmlkZTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBBbm90aGVyCitudW1iZXIgaW4geCdzIHJlcHJlc250YXRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlZ2VyIGRpdmlzaW9uIG9mCithcmd1bWVudCAxIGRpdmlkZWQ8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgYnkKK2FyZ3VtZW50IDIgaW4geCdzIHJlcHJlc2VudGF0aW9uPGJyPgorPC9zcGFuPgorPGhyPjxiPmRpdmlkZSAod3JhcHBlZCB2ZXJzaW9uIG9mIGludF9kaXZpZGUpPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IEFub3RoZXIKK2ludGVnZXI8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdGhlIGludGVnZXIgZGl2aXNpb24gb2YgdGhlIGZpcnN0Cithcmd1bWVudCBieSB0aGUgc2Vjb25kPGJyPgorPC9zcGFuPgorPGhyPjxiPmludF9tYXgsIGludF9taW48L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbnVtYmVyIGluIHgncworcmVwcmVzZW50YXRpb248YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogQW5vdGhlcgorbnVtYmVyIGluIHgncyByZXByZXNudGF0aW9uPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gb2YgaXRzCithcmd1bWVudHMgaW4geCdzPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CityZXByZXNlbnRhdGlvbjxicj4KKzwvc3Bhbj4KKzxocj48Yj5tYXgsIG1pbjwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQW4gaW50ZWdlcjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAyOiBBbm90aGVyCitpbnRlZ2VyPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtSZXR1cm5zIHRoZSBtYXhpbXVtIG9yIG1pbmltdW0gb2YgaXRzIGludGVnZXIKK2FyZ3VtZW50czxicj4KKzwvc3Bhbj4KKzxocj48Yj5pbnRfZ3QsIGludF9ndGUsIGludF9sdCwgaW50X2x0ZSwgaW50X2VxLCBpbnRfbmU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IFR3byB4J3MgcmVwcmVzZW50YXRpb24KK251bWJlcnMgdG8gYmUgY29tcGFyZWQ8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwOyQodHJ1ZSkgb3IgJChmYWxzZSk8YnI+Cis8YnI+CitpbnRfZ3QgRmlyc3QgYXJndW1lbnQgZ3JlYXRlciB0aGFuIHNlY29uZCBhcmd1bWVudDxicj4KK2ludF9ndGUgRmlyc3QgYXJndW1lbnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudDxicj4KK2ludF9sdCBGaXJzdCBhcmd1bWVudCBsZXNzIHRoYW4gc2Vjb25kIGFyZ3VtZW50IDxicj4KK2ludF9sdGUgRmlyc3QgYXJndW1lbnQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudDxicj4KK2ludF9lcSBGaXJzdCBhcmd1bWVudCBpcyBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgc2Vjb25kIGFyZ3VtZW50PGJyPgoraW50X25lIEZpcnN0IGFyZ3VtZW50IGlzIG5vdCBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgc2Vjb25kIGFyZ3VtZW50PGJyPgorPC9zcGFuPgorPGhyPjxiPmd0LCBndGUsIGx0LCBsdGUsIGVxLCBuZTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogVHdvIGludGVnZXJzIHRvIGJlCitjb21wYXJlZDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7JCh0cnVlKSBvciAkKGZhbHNlKTxicj4KKzxicj4KK2d0IEZpcnN0IGFyZ3VtZW50IGdyZWF0ZXIgdGhhbiBzZWNvbmQgYXJndW1lbnQ8YnI+CitndGUgRmlyc3QgYXJndW1lbnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHNlY29uZCBhcmd1bWVudDxicj4KK2x0IEZpcnN0IGFyZ3VtZW50IGxlc3MgdGhhbiBzZWNvbmQgYXJndW1lbnQgPGJyPgorbHRlIEZpcnN0IGFyZ3VtZW50IGxlc3MgdGhhbiBvciBlcXVhbCB0byBzZWNvbmQgYXJndW1lbnQ8YnI+CitlcSBGaXJzdCBhcmd1bWVudCBpcyBudW1lcmljYWxseSBlcXVhbCB0byB0aGUgc2Vjb25kIGFyZ3VtZW50PGJyPgorbmUgRmlyc3QgYXJndW1lbnQgaXMgbm90IG51bWVyaWNhbGx5IGVxdWFsIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQ8YnI+Cis8L3NwYW4+CitpbmNyZW1lbnQgYWRkcyAxIHRvIGl0cyBhcmd1bWVudCwgZGVjcmVtZW50IHN1YnRyYWN0cyAxLiBOb3RlIHRoYXQ8YnI+CitkZWNyZW1lbnQgZG9lcyBub3QgcmFuZ2UgY2hlY2sgYW5kIGhlbmNlIHdpbGwgbm90IHVuZGVyZmxvdywgYnV0PGJyPgord2lsbCBpbmNvcnJlY3RseSBzYXkgdGhhdCAwIC0gMSA9IDA8YnI+Cis8aHI+PGI+aW50X2luYzwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQSBudW1iZXIgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIG51bWJlciBpbmNyZW1lbnRlZCBieSAxIGluIHgncworcmVwcmVzZW50YXRpb248YnI+Cis8L3NwYW4+Cis8aHI+PGI+aW5jPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBbiBpbnRlZ2VyPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtUaGUgYXJndW1lbnQgaW5jcmVtZW50ZWQgYnkgMTxicj4KKzwvc3Bhbj4KKzxocj48Yj5pbnRfZGVjPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIG51bWJlciBpbiB4J3MKK3JlcHJlc2VudGF0aW9uPGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtUaGUgbnVtYmVyIGRlY3JlbWVudGVkIGJ5IDEgaW4geCdzCityZXByZXNlbnRhdGlvbjxicj4KKzwvc3Bhbj4KKzxocj48Yj5kZWM8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEFuIGludGVnZXI8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBhcmd1bWVudCBkZWNyZW1lbnRlZCBieSAxPGJyPgorPC9zcGFuPgorPGhyPjxiPmludF9kb3VibGU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbnVtYmVyIGluIHgncworcmVwcmVzZW50YXRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgZG91YmxlZCAoaS5lLiAqIDIpIGFuZCByZXR1cm5lZCBpbgoreCdzIHJlcHJlc2VudGF0aW9uPGJyPgorPC9zcGFuPgorPGhyPjxiPmRvdWJsZTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogQW4gaW50ZWdlcjxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7VGhlIGludGVnZXIgdGltZXMgMjxicj4KKzwvc3Bhbj4KKzxocj48Yj5pbnRfaGFsdmU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEEgbnVtYmVyIGluIHgncworcmVwcmVzZW50YXRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBudW1iZXIgaGFsdmVkIChpLmUuIC8gMikgYW5kIHJldHVybmVkIGluCit4J3MgcmVwcmVzZW50YXRpb248YnI+Cis8L3NwYW4+Cis8aHI+PGI+aGFsdmU8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IEFuIGludGVnZXI8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSBpbnRlZ2VyIGRpdmlkZWQgYnkgMjxicj4KKzwvc3Bhbj4KKzxociBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMnB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij48L3NwYW4+Cis8aDI+QXNzb2NpYXRpdmUgQXJyYXlzPC9oMj4KK0FuIGFzc29jaWF0ZSBhcnJheSBtYXBzIGEga2V5IHZhbHVlIChhIHN0cmluZyB3aXRoIG5vIHNwYWNlcyBpbiBpdCkgdG8KK2Egc2luZ2xlIHZhbHVlIChhbnkgc3RyaW5nKS4mbmJzcDsmbmJzcDsmbmJzcDsgPGJyPgorPGI+PGJyPgorPC9iPgorPGhyIHN0eWxlPSJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAycHg7Ij48Yj5zZXQ8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2YgYXNzb2NpYXRpdmUKK2FycmF5PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IFRoZSBrZXkKK3ZhbHVlIHRvIGFzc29jaWF0ZTxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAzOiBUaGUKK3ZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5PGJyPgorUmV0dXJuczombmJzcDsmbmJzcDsmbmJzcDtOb25lPGJyPgorPC9zcGFuPgorPGhyPjxiPmdldDwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogTmFtZSBvZiBhc3NvY2lhdGl2ZQorYXJyYXk8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogVGhlIGtleQordG8gcmV0cmlldmU8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGFycmF5IGZvciB0aGF0IGtleTxicj4KKzwvc3Bhbj4KKzxocj48Yj5rZXlzPC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBOYW1lIG9mIGFzc29jaWF0aXZlCithcnJheTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7UmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRlZmluZWQga2V5cyBpbiB0aGUKK2FycmF5PGJyPgorPC9zcGFuPgorPGhyPjxiPmRlZmluZWQ8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2YgYXNzb2NpYXRpdmUKK2FycmF5PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IFRoZSBrZXkKK3RvIHRlc3Q8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1JldHVybnMgdHJ1ZSBpZiB0aGUga2V5IGlzIGRlZmluZWQgKGkuZS4gbm90CitlbXB0eSk8YnI+Cis8L3NwYW4+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPgorPGgyPk5hbWVkIFN0YWNrczwvaDI+CitBIHN0YWNrIGlzIGFuIG9yZGVyZWQgbGlzdCBvZiBzdHJpbmdzICh3aXRoIG5vIHNwYWNlcyBpbiB0aGVtKS48YnI+Cis8YnI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxiPnB1c2g8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2Ygc3RhY2s8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgMjogVmFsdWUKK3RvIHB1c2ggb250byB0aGUgdG9wIG9mIHRoZSBzdGFjayAobXVzdCBub3QgY29udGFpbjxicj4KKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBhIHNwYWNlKTxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7Tm9uZTxicj4KKzwvc3Bhbj4KKzxocj48Yj5wb3A8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2Ygc3RhY2s8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RvcCBlbGVtZW50IGZyb20gdGhlIHN0YWNrIGFmdGVyIHJlbW92aW5nIGl0PGJyPgorPC9zcGFuPgorPGhyPjxiPnBlZWs8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2Ygc3RhY2s8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO1RvcCBlbGVtZW50IGZyb20gdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQ8YnI+Cis8L3NwYW4+Cis8aHI+PGI+ZGVwdGg8L2I+PGJyPgorPGJyPgorPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5Bcmd1bWVudHM6IDE6IE5hbWUgb2Ygc3RhY2s8YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO051bWJlciBvZiBpdGVtcyBvbiB0aGUgc3RhY2s8YnI+Cis8L3NwYW4+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+PC9zcGFuPgorPGgyPk1pc2NlbGxhbmVvdXMgYW5kIERlYnVnZ2luZyBGYWNpbGl0aWVzPC9oMj4KK0dNU0wgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50czsgYWxsIGFyZSBhY2Nlc3NlZCBhcyBub3JtYWwgR05VCitNYWtlIHZhcmlhYmxlcyBieSB3cmFwcGluZyB0aGVtIGluIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+JCgpPC9zcGFuPiBvciA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPiR7fTwvc3Bhbj4uPGJyPgorPGJyPgorPHRhYmxlIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjIiPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5Db25zdGFudDwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5WYWx1ZTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkPjxzcGFuIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5QdXJwb3NlPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij50cnVlPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5UPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+Qm9vbGVhbiBmb3IgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4kKGlmKTwvc3Bhbj4KK2FuZCByZXR1cm4gZnJvbSZuYnNwOyBHTVNMIGZ1bmN0aW9uczxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5mYWxzZTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+Qm9vbGVhbiBmb3IgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4kKGlmKTwvc3Bhbj4KK2FuZCByZXR1cm4gZnJvbSBHTVNMIGZ1bmN0aW9uczxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij5nbXNsX3ZlcnNpb248L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjEgMCAwPC9zcGFuPjxicj4KKyAgICAgIDwvdGQ+CisgICAgICA8dGQ+R01TTCB2ZXJzaW9uIG51bWJlciBhcyBsaXN0OiBtYWpvciBtaW5vciByZXZpc2lvbjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQ7Ij48YnI+CitnbXNsX2NvbXBhdGlibGU8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij48YnI+Cis8YnI+CitBcmd1bWVudHM6IExpc3QgY29udGFpbmluZyB0aGUgZGVzaXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyIChtYWogbWluCityZXYpPGJyPgorPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+UmV0dXJuczombmJzcDsmbmJzcDsKKyQodHJ1ZSkgaWYgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IGlzIGNvbXBhdGlibGU8YnI+Cis8L3NwYW4+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKK3dpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIG51bWJlciwgb3RoZXJ3aXNlICQoZmFsc2UpPC9zcGFuPgorPGhyPjxiPmdtc2wtcHJpbnQtJSAodGFyZ2V0IG5vdCBhIGZ1bmN0aW9uKTwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogVGhlICUgc2hvdWxkIGJlCityZXBsYWNlZCBieSB0aGUgbmFtZSBvZiBhIHZhcmlhYmxlIHRoYXQgeW91PGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHdpc2ggdG8KK3ByaW50IG91dC48YnI+CitBY3Rpb246Jm5ic3A7Jm5ic3A7Jm5ic3A7IEVjaG9zIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IG1hdGNoZXMKK3RoZSAlIGFuZCBpdHMgdmFsdWUuPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IEZvcgorZXhhbXBsZSwgJ21ha2UgZ21zbC1wcmludC1TSEVMTCcgd2lsbCBvdXRwdXQgdGhlIHZhbHVlIG9mPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHRoZSBTSEVMTAordmFyaWFibGU8YnI+Cis8L3NwYW4+Cis8aHI+PGI+YXNzZXJ0PC9iPjxicj4KKzxicj4KKzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+QXJndW1lbnRzOiAxOiBBIGJvb2xlYW4gdGhhdCBtdXN0CitiZSB0cnVlIG9yIHRoZSBhc3NlcnRpb24gd2lsbCBmYWlsPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IDI6IFRoZQorbWVzc2FnZSB0byBwcmludCB3aXRoIHRoZSBhc3NlcnRpb248YnI+CitSZXR1cm5zOiZuYnNwOyZuYnNwOyZuYnNwO05vbmU8YnI+Cis8L3NwYW4+Cis8aHI+PGI+YXNzZXJ0X2V4aXN0czwvYj48YnI+Cis8YnI+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkFyZ3VtZW50czogMTogTmFtZSBvZiBmaWxlIHRoYXQKK211c3QgZXhpc3QsIGlmIGl0IGlzIG1pc3NpbmcgYW4gYXNzZXJ0aW9uPGJyPgorJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHdpbGwgYmUKK2dlbmVyYXRlZDxicj4KK1JldHVybnM6Jm5ic3A7Jm5ic3A7Jm5ic3A7Tm9uZTxicj4KKzwvc3Bhbj4KKzxociBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMnB4OyI+PGJyPgorR01TTCBoYXMgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChvciBjb21tYW5kLWxpbmUgb3ZlcnJpZGVzKQordGhhdCBjb250cm9sIHZhcmlvdXMgYml0cyBvZiBmdW5jdGlvbmFsaXR5Ojxicj4KKzxicj4KKzx0YWJsZSBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+VmFyaWFibGU8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD48c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+UHVycG9zZTwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+R01TTF9OT19XQVJOSU5HUzwvc3Bhbj48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkPklmIHNldCBwcmV2ZW50cyBHTVNMIGZyb20gb3V0cHV0dGluZyB3YXJuaW5nIG1lc3NhZ2VzOgorYXJ0aXRobWV0aWMgZnVuY3Rpb25zIGdlbmVyYXRlIHVuZGVyZmxvdyB3YXJuaW5ncy48YnI+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyI+R01TTF9OT19FUlJPUlM8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD5JZiBzZXQgcHJldmVudHMgR01TTCBmcm9tIGdlbmVyYXRpbmcgZmF0YWwgZXJyb3JzOiBkaXZpc2lvbgorYnkgemVybyBvciBmYWlsZWQgYXNzZXJ0aW9ucyBhcmUgZmF0YWwuPGJyPgorICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPkdNU0xfVFJBQ0U8L3NwYW4+PGJyPgorICAgICAgPC90ZD4KKyAgICAgIDx0ZD5FbmFibGVzIGZ1bmN0aW9uIHRyYWNpbmcuJm5ic3A7IENhbGxzIHRvIEdNU0wgZnVuY3Rpb25zIHdpbGwKK3Jlc3VsdCBpbiBuYW1lIGFuZCBhcmd1bWVudHMgYmVpbmcgdHJhY2VkLjxicj4KKyAgICAgIDwvdGQ+CisgICAgPC90cj4KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsiPjwvc3Bhbj48YnI+Cis8aHI+CitDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNiA8YSBocmVmPSJodHRwOi8vd3d3LmpnYy5vcmcvIj5Kb2huIEdyYWhhbS1DdW1taW5nPC9hPi48YnI+Cis8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBoZWlnaHQ6IDJweDsiPgorPHRhYmxlIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogbGVmdDsiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIyIj4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZCBzdHlsZT0id2lkdGg6IDUwJTsiPkpvaG4gR3JhaGFtLUN1bW1pbmcncyB3b3JrIG9uIHRoaXMKK3Byb2plY3Qgd2FzIHNwb25zb3JlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmVsZWN0cmljLWNsb3VkLmNvbS8iPkVsZWN0cmljCitDbG91ZCwgSW5jPC9hPi48YnI+CisgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmVsZWN0cmljLWNsb3VkLmNvbS8iPjxpbWcgYWx0PSIiIHNyYz0iaHR0cDovL2dtc2wuc2YubmV0L2VjX2xvZ28uZ2lmIiBzdHlsZT0iYm9yZGVyOiAwcHggc29saWQgOyB3aWR0aDogMjIzcHg7IGhlaWdodDogNDdweDsiPjwvYT48YnI+CisgICAgICA8L3RkPgorICAgICAgPHRkIGFsaWduPSJyaWdodCI+CisgICAgICA8cD48YSBocmVmPSJodHRwOi8vc291cmNlZm9yZ2UubmV0LyI+PGltZyBzcmM9Imh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvc2Zsb2dvLnBocD9ncm91cF9pZD0xMjk4ODcmYW1wO3R5cGU9MSIgYWx0PSJTb3VyY2VGb3JnZS5uZXQgTG9nbyIgYm9yZGVyPSIwIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiPjwvYT48L3A+CisgICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGJvZHk+Cis8L3RhYmxlPgorPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvY29uZmlndXJlLnNoIGIvYW5kcm9pZC9jb25maWd1cmUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWNlNmUzZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvY29uZmlndXJlLnNoCkBAIC0wLDAgKzEsMTI0MSBAQAorIyEvYmluL3NoCisjCisjIHRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gcmVidWlsZCB0aGUgQW5kcm9pZCBlbXVsYXRvciBmcm9tIHNvdXJjZXMKKyMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBJdCBhbHNvIGNvbnRhaW5zIGxvZ2ljIHRvIHNwZWVkIHVwIHRoZQorIyByZWJ1aWxkIGlmIGl0IGRldGVjdHMgdGhhdCB5b3UncmUgdXNpbmcgdGhlIEFuZHJvaWQgYnVpbGQgc3lzdGVtCisjCisjIGhlcmUncyB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91IGNhbiBkZWZpbmUgYmVmb3JlCisjIGNhbGxpbmcgdGhpcyBzY3JpcHQgdG8gY29udHJvbCBpdCAoYmVzaWRlcyBvcHRpb25zKToKKyMKKyMKKworIyBmaXJzdCwgbGV0J3Mgc2VlIHdoaWNoIHN5c3RlbSB3ZSdyZSBydW5uaW5nIHRoaXMgb24KK1BST0dOQU1FPWBiYXNlbmFtZSAkMGAKK1BST0dESVI9YGRpcm5hbWUgJDBgCisKKyMjIExvZ2dpbmcgc3VwcG9ydAorIyMKK1ZFUkJPU0U9eWVzCitWRVJCT1NFMj1ubworCitwYW5pYyAoKSB7CisgICAgZWNobyAiRVJST1I6ICRAIgorICAgIGV4aXQgMQorfQorCitsb2cgKCkgeworICAgIGlmIFsgIiRWRVJCT1NFIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgICAgIGVjaG8gIiQxIgorICAgIGZpCit9CisKK2xvZzIgKCkgeworICAgIGlmIFsgIiRWRVJCT1NFMiIgPSAieWVzIiBdIDsgdGhlbgorICAgICAgICBlY2hvICIkMSIKKyAgICBmaQorfQorCisjIyBOb3JtYWxpemUgT1MgYW5kIENQVQorIyMKKworQlVJTERfQVJDSD0kKHVuYW1lIC1tKQorY2FzZSAiJEJVSUxEX0FSQ0giIGluCisgICAgaT84NikgQlVJTERfQVJDSD14ODYKKyAgICA7OworICAgIHg4Nl82NHxhbWQ2NCkgQlVJTERfQVJDSD14ODZfNjQKKyAgICA7OworICAgICopIHBhbmljICIkQlVJTERfQVJDSCBidWlsZHMgYXJlIG5vdCBzdXBwb3J0ZWQhIgorICAgIDs7Citlc2FjCisKK2xvZzIgIkJVSUxEX0FSQ0g9JEJVSUxEX0FSQ0giCisKKyMgYXQgdGhpcyBwb2ludCwgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIENQVSBhcmU6CisjICAgeDg2CisjICAgeDg2XzY0CisjCisjIG90aGVyIHZhbHVlcyBtYXkgYmUgcG9zc2libGUgYnV0IGhhdmVuJ3QgYmVlbiB0ZXN0ZWQKKyMKKworQlVJTERfRVhFRVhUPQorQlVJTERfT1M9YHVuYW1lIC1zYAorY2FzZSAiJEJVSUxEX09TIiBpbgorICAgIERhcndpbikgQlVJTERfT1M9ZGFyd2luOzsKKyAgICBMaW51eCkgQlVJTERfT1M9bGludXg7OworICAgIEZyZWVCU0QpIEJVSUxEX09TPWZyZWVic2Q7OworICAgIENZR1dJTip8Kl9OVC0qKQorICAgICAgICBwYW5pYyAiUGxlYXNlIGJ1aWxkIFdpbmRvd3MgYmluYXJpZXMgb24gTGludXggd2l0aCAtLW1pbmd3IG9wdGlvbi4iCisgICAgICAgIDs7CisgICAgKikgcGFuaWMgIlVua25vd24gYnVpbGQgT1M6ICRCVUlMRF9PUyI7OworZXNhYworCitCVUlMRF9UQUc9JEJVSUxEX09TLSRCVUlMRF9BUkNICisKK2xvZzIgIkJVSUxEX1RBRz0kQlVJTERfVEFHIgorbG9nMiAiQlVJTERfRVhFRVhUPSRCVUlMRF9FWEVFWFQiCisKK0hPU1RfT1M9JEJVSUxEX09TCitIT1NUX0FSQ0g9JEJVSUxEX0FSQ0gKK0hPU1RfVEFHPSRIT1NUX09TLSRIT1NUX0FSQ0gKKworIyMjIyBUb29sY2hhaW4gc3VwcG9ydAorIyMjIworCitXSU5EUkVTPQorCisjIFZhcmlvdXMgcHJvYmVzIGFyZSBnb2luZyB0byBuZWVkIHRvIHJ1biBhIHNtYWxsIEMgcHJvZ3JhbQorVE1QQz0vdG1wL2FuZHJvaWQtJCQtdGVzdC5jCitUTVBPPS90bXAvYW5kcm9pZC0kJC10ZXN0Lm8KK1RNUEU9L3RtcC9hbmRyb2lkLSQkLXRlc3QkQlVJTERfRVhFRVhUCitUTVBMPS90bXAvYW5kcm9pZC0kJC10ZXN0LmxvZworCisjIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzCitjbGVhbl90ZW1wICgpIHsKKyAgICBybSAtZiAkVE1QQyAkVE1QTyAkVE1QTCAkVE1QTEUKK30KKworIyBjbGVhbnVwIHRlbXAgZmlsZXMgdGhlbiBleGl0IHdpdGggYW4gZXJyb3IKK2NsZWFuX2V4aXQgKCkgeworICAgIGNsZWFuX3RlbXAKKyAgICBleGl0IDEKK30KKworIyB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0dXAgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIgYW5kIGNoZWNrIHRoYXQgdGhleSB3b3JrIGFzIGFkdmVydGl6ZWQKK3NldHVwX3Rvb2xjaGFpbiAoKSB7CisgICAgaWYgWyAteiAiJENDIiBdIDsgdGhlbgorICAgICAgICBDQz1nY2MKKyAgICBmaQorCisgICAgIyBjaGVjayB0aGF0IHdlIGNhbiBjb21waWxlIGEgdHJpdmlhbCBDIHByb2dyYW0gd2l0aCB0aGlzIGNvbXBpbGVyCisgICAgY2F0ID4gJFRNUEMgPDxFT0YKK2ludCBtYWluKHZvaWQpIHt9CitFT0YKKyAgICBjb21waWxlCisgICAgaWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgICAgIGVjaG8gInlvdXIgQyBjb21waWxlciBkb2Vzbid0IHNlZW0gdG8gd29yazogJENDIgorICAgICAgICBjYXQgJFRNUEwKKyAgICAgICAgY2xlYW5fZXhpdAorICAgIGZpCisgICAgbG9nICJDQyAgICAgICAgIDogY29tcGlsZXIgY2hlY2sgb2sgKCRDQykiCisgICAgQ0NfVkVSPWAkQ0MgLS12ZXJzaW9uYAorICAgIGxvZyAiQ0NfVkVSICAgICA6ICRDQ19WRVIiCisKKyAgICAjIGNoZWNrIHRoYXQgd2UgY2FuIGxpbmsgdGhlIHRyaXZpYWwgcHJvZ3JhbSBpbnRvIGFuIGV4ZWN1dGFibGUKKyAgICBpZiBbIC16ICIkTEQiIF0gOyB0aGVuCisgICAgICAgIExEPSRDQworICAgIGZpCisgICAgbGluaworICAgIGlmIFsgJD8gIT0gMCBdIDsgdGhlbgorICAgICAgICBlY2hvICJ5b3VyIGxpbmtlciBkb2Vzbid0IHNlZW0gdG8gd29yazoiCisgICAgICAgIGNhdCAkVE1QTAorICAgICAgICBjbGVhbl9leGl0CisgICAgZmkKKyAgICBsb2cgIkxEICAgICAgICAgOiBsaW5rZXIgY2hlY2sgb2sgKCRMRCkiCisKKyAgICBpZiBbIC16ICIkQVIiIF07IHRoZW4KKyAgICAgICAgQVI9YXIKKyAgICBmaQorICAgIGxvZyAiQVIgICAgICAgICA6IGFyY2hpdmVyICgkQVIpIgorICAgIGNsZWFuX3RlbXAKK30KKworIyB0cnkgdG8gY29tcGlsZSB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBpbiAkVE1QQyBpbnRvIGFuIG9iamVjdAorIyBzdG9yZXMgdGhlIGVycm9yIGxvZyBpbnRvICRUTVBMCisjCitjb21waWxlICgpIHsKKyAgICBsb2cyICJPYmplY3QgICAgIDogJENDIC1vICRUTVBPIC1jICRDRkxBR1MgJFRNUEMiCisgICAgJENDIC1vICRUTVBPIC1jICRDRkxBR1MgJFRNUEMgMj4gJFRNUEwKK30KKworIyB0cnkgdG8gbGluayB0aGUgcmVjZW50bHkgYnVpbHQgZmlsZSBpbnRvIGFuIGV4ZWN1dGFibGUuIGVycm9yIGxvZyBpbiAkVE1QTAorIworbGluaygpIHsKKyAgICBsb2cyICJMaW5rICAgICAgOiAkTEQgLW8gJFRNUEUgJFRNUE8gJExERkxBR1MiCisgICAgJExEIC1vICRUTVBFICRUTVBPICRMREZMQUdTIDI+ICRUTVBMCit9CisKKyMjIEZlYXR1cmUgdGVzdCBzdXBwb3J0CisjIworCisjIGNoZWNrIHRoYXQgYSBnaXZlbiBDIGhlYWRlciBmaWxlIGV4aXN0cyBvbiB0aGUgaG9zdCBzeXN0ZW0KKyMgJDE6IHZhcmlhYmxlIG5hbWUgd2hpY2ggd2lsbCBiZSBzZXQgdG8gInllcyIgb3IgIm5vIiBkZXBlbmRpbmcgb24gcmVzdWx0CisjICQyOiBoZWFkZXIgbmFtZQorIworIyB5b3UgY2FuIGRlZmluZSBFWFRSQV9DRkxBR1MgZm9yIGV4dHJhIEMgY29tcGlsZXIgZmxhZ3MKKyMgZm9yIGNvbnZlbmllbmNlLCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgdW5zZXQgYnkgdGhlIGZ1bmN0aW9uLgorIworZmVhdHVyZV9jaGVja19oZWFkZXIgKCkgeworICAgIGxvY2FsIHJlc3VsdF9jaCBPTERfQ0ZMQUdTCisgICAgbG9nMiAiSGVhZGVyQ2hlY2s6ICQyIgorICAgIGVjaG8gIiNpbmNsdWRlICQyIiA+ICRUTVBDCisgICAgY2F0ID4+ICRUTVBDIDw8RU9GCisgICAgICAgIGludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KK0VPRgorICAgIE9MRF9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAkRVhUUkFfQ0ZMQUdTIgorICAgIGNvbXBpbGUKKyAgICBpZiBbICQ/ICE9IDAgXTsgdGhlbgorICAgICAgICByZXN1bHRfY2g9bm8KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdF9jaD15ZXMKKyAgICBmaQorICAgIGxvZyAiSGVhZGVyQ2hlY2s6ICQyIFskcmVzdWx0X2NoXSIKKyAgICBFWFRSQV9DRkxBR1M9CisgICAgQ0ZMQUdTPSRPTERfQ0ZMQUdTCisgICAgZXZhbCAkMT0kcmVzdWx0X2NoCisgICAgY2xlYW5fdGVtcAorfQorCisjIEZpbmQgcGF0dGVybiAkMSBpbiBzdHJpbmcgJDIKKyMgVGhpcyBpcyB0byBiZSB1c2VkIGluIGlmIHN0YXRlbWVudHMgYXMgaW46CisjCisjICAgIGlmIHBhdHRlcm5fbWF0Y2ggPHBhdHRlcm4+IDxzdHJpbmc+OyB0aGVuCisjICAgICAgIC4uLgorIyAgICBmaQorIworcGF0dGVybl9tYXRjaCAoKSB7CisgICAgZWNobyAiJDIiIHwgZ3JlcCAtcSAtRSAtZSAiJDEiCit9CisKKyMgRmluZCBpZiBhIGdpdmVuIHNoZWxsIHByb2dyYW0gaXMgYXZhaWxhYmxlLgorIyBXZSBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSAnd2hpY2ggPGZvbz4nIGNvbW1hbmQKKyMgbWF5IHJldHVybiBlaXRoZXIgYW4gZW1wdHkgc3RyaW5nIChMaW51eCkgb3Igc29tZXRoaW5nIGxpa2UKKyMgIm5vIDxmb28+IGluIC4uLiIgKERhcndpbikuIEFsc28sIHdlIG5lZWQgdG8gcmVkaXJlY3Qgc3RkZXJyCisjIHRvIC9kZXYvbnVsbCBmb3IgQ3lnd2luCisjCisjICQxOiB2YXJpYWJsZSBuYW1lCisjICQyOiBwcm9ncmFtIG5hbWUKKyMKKyMgUmVzdWx0OiBzZXQgJDEgdG8gdGhlIGZ1bGwgcGF0aCBvZiB0aGUgY29ycmVzcG9uZGluZyBjb21tYW5kCisjICAgICAgICAgb3IgdG8gdGhlIGVtcHR5L3VuZGVmaW5lZCBzdHJpbmcgaWYgbm90IGF2YWlsYWJsZQorIworZmluZF9wcm9ncmFtICgpIHsKKyAgICBsb2NhbCBQUk9HCisgICAgUFJPRz1gd2hpY2ggJDIgMj4vZGV2L251bGwgfHwgdHJ1ZWAKKyAgICBpZiBbIC1uICIkUFJPRyIgXSA7IHRoZW4KKyAgICAgICAgaWYgcGF0dGVybl9tYXRjaCAnXm5vICcgIiRQUk9HIjsgdGhlbgorICAgICAgICAgICAgUFJPRz0KKyAgICAgICAgZmkKKyAgICBmaQorICAgIGV2YWwgJDE9IiRQUk9HIgorfQorCisjIERlZmF1bHQgdmFsdWUgb2YgLS11aSBvcHRpb24uCitVSV9ERUZBVUxUPXF0CisKKyMgRGVmYXVsdCB2YWx1ZSBvZiAtLWdsZXMgb3B0aW9uLgorR0xFU19ERUZBVUxUPWRnbAorCisjIFBhcnNlIG9wdGlvbnMKK09QVElPTl9RRU1VMl9TUkNESVI9CitPUFRJT05fREVCVUc9bm8KK09QVElPTl9TQU5JVElaRVI9bm8KK09QVElPTl9FTVVHTF9QUklOVE9VVD1ubworT1BUSU9OX0lHTk9SRV9BVURJTz1ubworT1BUSU9OX0FPU1BfUFJFQlVJTFRTX0RJUj0KK09QVElPTl9PVVRfRElSPQorT1BUSU9OX0hFTFA9bm8KK09QVElPTl9TVFJJUD15ZXMKK09QVElPTl9DUkFTSFVQTE9BRD0KK09QVElPTl9NSU5HVz1ubworT1BUSU9OX0dMRVM9CitPUFRJT05fU0RLX1JFVj0KK09QVElPTl9TWU1CT0xTPW5vCitPUFRJT05fQkVOQ0hNQVJLUz1ubworQU5EUk9JRF9TREtfVE9PTFNfUkVWSVNJT049CitBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVI9CisKK0dMRVNfU1VQUE9SVD1ubworCitQQ0JJT1NfUFJPQkU9eWVzCisKK0hPU1RfQ0M9JHtDQzotZ2NjfQorT1BUSU9OX0NDPQorCitIT1NUX0NYWD0ke0NYWDotZysrfQorT1BUSU9OX0NYWD0KKworQU9TUF9QUkVCVUlMVFNfRElSPSQoZGlybmFtZSAiJDAiKS8uLi8uLi8uLi9wcmVidWlsdHMKK2lmIFsgLWQgIiRBT1NQX1BSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICBBT1NQX1BSRUJVSUxUU19ESVI9JChjZCAiJEFPU1BfUFJFQlVJTFRTX0RJUiIgJiYgcHdkIC1QIDI+L2Rldi9udWxsKQorZWxzZQorICAgIEFPU1BfUFJFQlVJTFRTX0RJUj0KK2ZpCisKK2ZvciBvcHQgZG8KKyAgb3B0YXJnPWBleHByICJ4JG9wdCIgOiAneFtePV0qPVwoLipcKSdgCisgIGNhc2UgIiRvcHQiIGluCisgIC0taGVscHwtaHwtXD8pIE9QVElPTl9IRUxQPXllcworICA7OworICAtLXZlcmJvc2UpCisgICAgaWYgWyAiJFZFUkJPU0UiID0gInllcyIgXSA7IHRoZW4KKyAgICAgICAgVkVSQk9TRTI9eWVzCisgICAgZWxzZQorICAgICAgICBWRVJCT1NFPXllcworICAgIGZpCisgIDs7CisgIC0tdmVyYm9zaXR5PSopCisgICAgaWYgWyAiJG9wdGFyZyIgLWd0IDEgXTsgdGhlbgorICAgICAgICBWRVJCT1NFPXllcworICAgICAgICBpZiBbICIkb3B0YXJnIiAtZ3QgMiBdOyB0aGVuCisgICAgICAgICAgICBWRVJCT1NFMj15ZXMKKyAgICAgICAgZmkKKyAgICBmaQorICAgIDs7CisKKyAgLS1kZWJ1ZykgT1BUSU9OX0RFQlVHPXllczsgT1BUSU9OX1NUUklQPW5vCisgIDs7CisgIC0tbWluZ3cpIE9QVElPTl9NSU5HVz15ZXMKKyAgOzsKKyAgLS1zYW5pdGl6ZXI9KikgT1BUSU9OX1NBTklUSVpFUj0kb3B0YXJnCisgIDs7CisgIC0tZW11Z2wtcHJpbnRvdXQpIE9QVElPTl9FTVVHTF9QUklOVE9VVD15ZXMKKyAgOzsKKyAgLS1jYz0qKSBPUFRJT05fQ0M9IiRvcHRhcmciCisgIDs7CisgIC0tY3h4PSopIE9QVElPTl9DWFg9IiRvcHRhcmciCisgIDs7CisgIC0tc3RyaXApIE9QVElPTl9TVFJJUD15ZXMKKyAgOzsKKyAgLS1uby1zdHJpcCkgT1BUSU9OX1NUUklQPW5vCisgIDs7CisgIC0tY3Jhc2gtc3RhZ2luZykgT1BUSU9OX0NSQVNIVVBMT0FEPXN0YWdpbmcKKyAgOzsKKyAgLS1jcmFzaC1wcm9kKSBPUFRJT05fQ1JBU0hVUExPQUQ9cHJvZAorICA7OworICAtLW91dC1kaXI9KikgT1BUSU9OX09VVF9ESVI9JG9wdGFyZworICA7OworICAtLWFvc3AtcHJlYnVpbHRzLWRpcj0qKSBPUFRJT05fQU9TUF9QUkVCVUlMVFNfRElSPSRvcHRhcmcKKyAgOzsKKyAgLS1xZW11Mi1zcmMtZGlyPSopIE9QVElPTl9RRU1VMl9TUkNESVI9JG9wdGFyZworICA7OworICAtLW5vLXBjYmlvcykgUENCSU9TX1BST0JFPW5vCisgIDs7CisgIC0tbm8tdGVzdHMpCisgICMgSWdub3JlIHRoaXMgb3B0aW9uLCBvbmx5IHVzZWQgYnkgYW5kcm9pZC9yZWJ1aWxkLnNoCisgIDs7CisgIC0tc3ltYm9scykgT1BUSU9OX1NZTUJPTFM9eWVzCisgIDs7CisgIC0tbm8tc3ltYm9scykgT1BUSU9OX1NZTUJPTFM9bm8KKyAgOzsKKyAgLS1nbGVzPWRnbCkgT1BUSU9OX0dMRVM9ZGdsCisgIDs7CisgIC0tZ2xlcz1hbmdsZSkgT1BUSU9OX0dMRVM9YW5nbGUKKyAgOzsKKyAgLS1nbGVzPSopIGVjaG8gIlVua25vd24gLS1nbGVzIHZhbHVlLCB0cnkgb25lIG9mOiBkZ2wgYW5nbGUiCisgIDs7CisgIC0tc2RrLXJldmlzaW9uPSopIEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OPSRvcHRhcmcKKyAgOzsKKyAgLS1zZGstYnVpbGQtbnVtYmVyPSopIEFORFJPSURfU0RLX1RPT0xTX0JVSUxEX05VTUJFUj0kb3B0YXJnCisgIDs7CisgIC0tYmVuY2htYXJrcykgT1BUSU9OX0JFTkNITUFSS1M9eWVzCisgIDs7CisgICopCisgICAgZWNobyAidW5rbm93biBvcHRpb24gJyRvcHQnLCB1c2UgLS1oZWxwIgorICAgIGV4aXQgMQorICBlc2FjCitkb25lCisKKyMgUHJpbnQgdGhlIGhlbHAgbWVzc2FnZQorIworaWYgWyAiJE9QVElPTl9IRUxQIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgY2F0IDw8IEVPRgorCitVc2FnZTogcmVidWlsZC5zaCBbb3B0aW9uc10KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitFT0YKKyAgICBlY2hvICJTdGFuZGFyZCBvcHRpb25zOiIKKyAgICBlY2hvICIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UiCisgICAgZWNobyAiICAtLWNjPVBBVEggICAgICAgICAgICAgICAgICAgU3BlY2lmeSBDIGNvbXBpbGVyIFskSE9TVF9DQ10iCisgICAgZWNobyAiICAtLWN4eD1QQVRIICAgICAgICAgICAgICAgICAgU3BlY2lmeSBDKysgY29tcGlsZXIgWyRIT1NUX0NYWF0iCisgICAgZWNobyAiICAtLW5vLXN0cmlwICAgICAgICAgICAgICAgICAgRG8gbm90IHN0cmlwIGVtdWxhdG9yIGV4ZWN1dGFibGVzLiIKKyAgICBlY2hvICIgIC0tc3RyaXAgICAgICAgICAgICAgICAgICAgICBTdHJpcCBlbXVsYXRvciBleGVjdXRhYmxlcyAoZGVmYXVsdCkuIgorICAgIGVjaG8gIiAgLS1zeW1ib2xzICAgICAgICAgICAgICAgICAgIEdlbmVyYXRpbmcgQnJlYWtwYWQgc3ltYm9sIGZpbGVzLiIKKyAgICBlY2hvICIgIC0tbm8tc3ltYm9scyAgICAgICAgICAgICAgICBEbyBub3QgZ2VuZXJhdGUgQnJlYWtwYWQgc3ltYm9sIGZpbGVzIChkZWZhdWx0KS4iCisgICAgZWNobyAiICAtLWNyYXNoLVtzdGFnaW5nLHByb2RdICAgICAgU2VuZCBjcmFzaGVzIHRvIHNwZWNpZmljIHNlcnZlciAobm8gY3Jhc2ggcmVwb3J0aW5nIGJ5IGRlZmF1bHQpLiIKKyAgICBlY2hvICIgIC0tZ2xlcz1kZ2wgICAgICAgICAgICAgICAgICBCdWlsZCB0aGUgT3BlbkdMRVMgdG8gRGVza3RvcCBPcGVuR0wgVHJhbnNsYXRvciAoZGVmYXVsdCkiCisgICAgZWNobyAiICAtLWdsZXM9YW5nbGUgICAgICAgICAgICAgICAgQnVpbGQgdGhlIE9wZW5HTEVTIHRvIEFOR0xFIHdyYXBwZXIiCisgICAgZWNobyAiICAtLWFvc3AtcHJlYnVpbHRzLWRpcj08cGF0aD4gVXNlIHNwZWNpZmljIHByZWJ1aWx0IHRvb2xjaGFpbiByb290IGRpcmVjdG9yeSBbJEFPU1BfUFJFQlVJTFRTX0RJUl0iCisgICAgZWNobyAiICAtLW91dC1kaXI9PHBhdGg+ICAgICAgICAgICAgVXNlIHNwZWNpZmljIG91dHB1dCBkaXJlY3RvcnkgW29ianMvXSIKKyAgICBlY2hvICIgIC0tbWluZ3cgICAgICAgICAgICAgICAgICAgICBCdWlsZCBXaW5kb3dzIGV4ZWN1dGFibGUgb24gTGludXgiCisgICAgZWNobyAiICAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgVmVyYm9zZSBjb25maWd1cmF0aW9uIgorICAgIGVjaG8gIiAgLS1kZWJ1ZyAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIGRlYnVnIHZlcnNpb24gb2YgdGhlIGVtdWxhdG9yIgorICAgIGVjaG8gIiAgLS1zYW5pdGl6ZXI9Wy4uLl0gICAgICAgICAgIEJ1aWxkIHdpdGggTExWTSBzYW5pdGl6ZXIgKHNhbml0aXplcj1bYWRkcmVzcywgdGhyZWFkXSkiCisgICAgZWNobyAiICAtLW5vLXBjYmlvcyAgICAgICAgICAgICAgICAgRGlzYWJsZSBjb3B5aW5nIG9mIFBDIEJpb3MgZmlsZXMiCisgICAgZWNobyAiICAtLW5vLXRlc3RzICAgICAgICAgICAgICAgICAgRG9uJ3QgcnVuIHVuaXQgdGVzdCBzdWl0ZSIKKyAgICBlY2hvICIgIC0tYmVuY2htYXJrcyAgICAgICAgICAgICAgICBCdWlsZCBiZW5jaG1hcmsgcHJvZ3JhbXMuIgorICAgIGVjaG8gIiIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgIiRPUFRJT05fQU9TUF9QUkVCVUlMVFNfRElSIiBdOyB0aGVuCisgICAgaWYgWyAhIC1kICIkT1BUSU9OX0FPU1BfUFJFQlVJTFRTX0RJUiIvZ2NjIC1hIFwKKyAgICAgICAgICEgLWQgIiRPUFRJT05fQU9TUF9QUkVCVUlMVFNfRElSIi9jbGFuZyBdOyB0aGVuCisgICAgICAgIGVjaG8gIkVSUk9SOiBQcmVidWlsdHMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAkT1BUSU9OX0FPU1BfUFJFQlVJTFRTX0RJUi9nY2MiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgQU9TUF9QUkVCVUlMVFNfRElSPSRPUFRJT05fQU9TUF9QUkVCVUlMVFNfRElSCitmaQorCitpZiBbIC16ICIkT1BUSU9OX0dMRVMiIF07IHRoZW4KKyAgICBPUFRJT05fR0xFUz0kR0xFU19ERUZBVUxUCisgICAgbG9nICJBdXRvLWNvbmZpZzogLS1nbGVzPSRPUFRJT05fR0xFUyIKK2ZpCisKK2lmIFsgIiRPUFRJT05fT1VUX0RJUiIgXTsgdGhlbgorICAgIE9VVF9ESVI9IiRPUFRJT05fT1VUX0RJUiIKKyAgICBta2RpciAtcCAiJE9VVF9ESVIiIHx8IHBhbmljICJDb3VsZCBub3QgY3JlYXRlIG91dHB1dCBkaXJlY3Rvcnk6ICRPVVRfRElSIgorZWxzZQorICAgIE9VVF9ESVI9b2JqcworICAgIGxvZyAiQXV0by1jb25maWc6IC0tb3V0LWRpcj1vYmpzIgorZmkKKworQ0NBQ0hFPQoraWYgWyAiJFVTRV9DQ0FDSEUiICE9IDAgXTsgdGhlbgorICAgIENDQUNIRT0kKHdoaWNoIGNjYWNoZSAyPi9kZXYvbnVsbCB8fCB0cnVlKQorZmkKKworaWYgWyAtbiAiJENDQUNIRSIgLWEgLWYgIiRDQ0FDSEUiIF07IHRoZW4KKyAgICBpZiBbICIkSE9TVF9PUyIgPSAiZGFyd2luIiAtYSAiJE9QVElPTl9ERUJVRyIgPSAieWVzIiBdOyB0aGVuCisgICAgICAgICMgaHR0cDovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwMjk3CisgICAgICAgICMgY2NhY2hlIHdvcmtzIGZvciBtaW5ndy9nZGIsIHRoZXJlZm9yZSBwcm9iYWJseSB3b3JrcyBmb3IgZ2NjL2dkYgorICAgICAgICBsb2cgIlByZWJ1aWx0ICAgOiBDQ0FDSEUgZGlzYWJsZWQgZm9yIE9TWCBkZWJ1ZyBidWlsZHMiCisgICAgICAgIENDQUNIRT0KKyAgICBlbHNlCisgICAgICAgIGxvZyAiUHJlYnVpbHQgICA6IENDQUNIRT0kQ0NBQ0hFIgorICAgIGZpCitlbHNlCisgICAgbG9nICJQcmVidWlsdCAgIDogQ0NBQ0hFIGNhbid0IGJlIGZvdW5kIgorICAgIENDQUNIRT0KK2ZpCisKKyMgVXNlIGdlbi1hbmRyb2lkLXNkay10b29sY2hhaW4uc2ggdG8gZ2VuZXJhdGUgYSB0b29sY2hhaW4gdGhhdCB3aWxsCisjIGJ1aWxkIGJpbmFyaWVzIGNvbXBhdGlibGUgd2l0aCB0aGUgU0RLIGRlcGxveWVtZW50IHN5c3RlbXMuCitHRU5fU0RLPSRQUk9HRElSL3NjcmlwdHMvZ2VuLWFuZHJvaWQtc2RrLXRvb2xjaGFpbi5zaAorR0VOX1NES19GTEFHUz0tLWN4eDExCitpZiBbICIkQ0NBQ0hFIiBdOyB0aGVuCisgICAgR0VOX1NES19GTEFHUz0iJEdFTl9TREtfRkxBR1MgLS1jY2FjaGU9JENDQUNIRSIKK2Vsc2UKKyAgICBHRU5fU0RLX0ZMQUdTPSIkR0VOX1NES19GTEFHUyAtLW5vLWNjYWNoZSIKK2ZpCitTREtfVE9PTENIQUlOX0RJUj0kT1VUX0RJUi9idWlsZC90b29sY2hhaW4KK0dFTl9TREtfRkxBR1M9IiRHRU5fU0RLX0ZMQUdTIC0tYW9zcC1kaXI9JEFPU1BfUFJFQlVJTFRTX0RJUi8uLiIKKyIkR0VOX1NESyIgJEdFTl9TREtfRkxBR1MgIiRTREtfVE9PTENIQUlOX0RJUiIgfHwgcGFuaWMgIkNhbm5vdCBnZW5lcmF0ZSBTREsgdG9vbGNoYWluISIKK0JJTlBSRUZJWD0kKCIkR0VOX1NESyIgJEdFTl9TREtfRkxBR1MgLS1wcmludD1iaW5wcmVmaXggIiRTREtfVE9PTENIQUlOX0RJUiIpCitDQz0iJFNES19UT09MQ0hBSU5fRElSLyR7QklOUFJFRklYfWdjYyIKK0NYWD0iJFNES19UT09MQ0hBSU5fRElSLyR7QklOUFJFRklYfWcrKyIKK0FSPSIkU0RLX1RPT0xDSEFJTl9ESVIvJHtCSU5QUkVGSVh9YXIiCitMRD0kQ0MKK09CSkNPUFk9IiRTREtfVE9PTENIQUlOX0RJUi8ke0JJTlBSRUZJWH1vYmpjb3B5IgorVE9PTENIQUlOX1NZU1JPT1Q9IiQoIiR7R0VOX1NES30iICRHRU5fU0RLX0ZMQUdTIC0tcHJpbnQ9c3lzcm9vdCAiJHtTREtfVE9PTENIQUlOX0RJUn0iKSIKKworaWYgWyAtbiAiJE9QVElPTl9DQyIgXTsgdGhlbgorICAgIGVjaG8gIlVzaW5nIHNwZWNpZmllZCBDIGNvbXBpbGVyOiAkT1BUSU9OX0NDIgorICAgIENDPSIkT1BUSU9OX0NDIgorZmkKKworaWYgWyAtbiAiJE9QVElPTl9DWFgiIF07IHRoZW4KKyAgICBlY2hvICJVc2luZyBzcGVjaWZpZWQgQysrIGNvbXBpbGVyOiAkT1BUSU9OX0NYWCIKKyAgICBDQz0iJE9QVElPTl9DWFgiCitmaQorCitzZXR1cF90b29sY2hhaW4KKworQlVJTERfQVI9JEFSCitCVUlMRF9DQz0kQ0MKK0JVSUxEX0NYWD0kQ1hYCitCVUlMRF9MRD0kTEQKK0JVSUxEX09CSkNPUFk9JE9CSkNPUFkKK0JVSUxEX0NGTEFHUz0kQ0ZMQUdTCitCVUlMRF9DWFhGTEFHUz0kQ1hYRkxBR1MKK0JVSUxEX0xERkxBR1M9JExERkxBR1MKKworIyBUZWFjaCBtYWtlIHRvIGJ1aWxkIHN0YXRpYyBleGVjdXRhYmxlcyB3aGVyZSB0aGlzIG1ha2VzIHNlbnNlLiBEYXJ3aW4gZG9lc24ndAorIyBoYXZlIGEgc2FuZSB3YXkgb2YgbGlua2luZyBzdGF0aWNhbGx5IGFnYWluc3Qgc3lzdGVtIGxpYnJhcmllcyBhdCBhbGwuCitpZiBbICIkSE9TVF9PUyIgPSAiZGFyd2luIiBdOyB0aGVuCisgIEJVSUxEX1NUQVRJQ19GTEFHUz0KK2Vsc2UKKyAgQlVJTERfU1RBVElDX0ZMQUdTPSItc3RhdGljIgorZmkKKworaWYgWyAiJE9QVElPTl9NSU5HVyIgPSAieWVzIiBdIDsgdGhlbgorICAgICMgQXJlIHdlIG9uIExpbnV4ID8KKyAgICBsb2cgIk1pbmd3ICAgICAgOiBDaGVja2luZyBmb3IgTGludXggaG9zdCIKKyAgICBpZiBbICIkSE9TVF9PUyIgIT0gImxpbnV4IiBdIDsgdGhlbgorICAgICAgICBlY2hvICJTb3JyeSwgYnV0IG1pbmd3IGNvbXBpbGF0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIG9uIExpbnV4ICEiCisgICAgICAgIGV4aXQgMQorICAgIGZpCisgICAgR0VOX1NES19GTEFHUz0iJEdFTl9TREtfRkxBR1MgLS1ob3N0PXdpbmRvd3MteDg2XzY0IgorICAgICIkR0VOX1NESyIgJEdFTl9TREtfRkxBR1MgIiRTREtfVE9PTENIQUlOX0RJUiIgfHwgcGFuaWMgIkNhbm5vdCBnZW5lcmF0ZSBTREsgdG9vbGNoYWluISIKKyAgICBCSU5QUkVGSVg9JCgiJEdFTl9TREsiICRHRU5fU0RLX0ZMQUdTIC0tcHJpbnQ9YmlucHJlZml4ICIkU0RLX1RPT0xDSEFJTl9ESVIiKQorICAgIENDPSIkU0RLX1RPT0xDSEFJTl9ESVIvJHtCSU5QUkVGSVh9Z2NjIgorICAgIENYWD0iJFNES19UT09MQ0hBSU5fRElSLyR7QklOUFJFRklYfWcrKyIKKyAgICBMRD0kQ0MKKyAgICBXSU5EUkVTPSRTREtfVE9PTENIQUlOX0RJUi8ke0JJTlBSRUZJWH13aW5kcmVzCisgICAgQVI9IiRTREtfVE9PTENIQUlOX0RJUi8ke0JJTlBSRUZJWH1hciIKKyAgICBPQkpDT1BZPSIkU0RLX1RPT0xDSEFJTl9ESVIvJHtCSU5QUkVGSVh9b2JqY29weSIKKyAgICBIT1NUX09TPXdpbmRvd3MKKyAgICBIT1NUX1RBRz0kSE9TVF9PUy0kSE9TVF9BUkNICitmaQorCisjIFRyeSB0byBmaW5kIHRoZSBHTEVTIGVtdWxhdGlvbiBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYXV0b21hdGljYWxseQorR0xFU19ESVI9YW5kcm9pZC9hbmRyb2lkLWVtdWdsCitpZiBbICEgLWQgIiRHTEVTX0RJUiIgXTsgdGhlbgorICAgIHBhbmljICJHTEVTICAgICAgIDogQ291bGQgbm90IGZpbmQgR1BVIGVtdWxhdGlvbiBzb3VyY2VzITogJEdMRVNfRElSIgorZWxzZQorICAgIGVjaG8gIkdMRVMgICAgICAgOiBGb3VuZCBHUFUgZW11bGF0aW9uIHNvdXJjZXM6ICRHTEVTX0RJUiIKK2ZpCisKK2lmIFsgIiRQQ0JJT1NfUFJPQkUiID0gInllcyIgXTsgdGhlbgorICAgIFBDQklPU19ESVI9JEFPU1BfUFJFQlVJTFRTX0RJUi9xZW11LWtlcm5lbC94ODYvcGMtYmlvcworICAgIGlmIFsgISAtZCAiJFBDQklPU19ESVIiIF07IHRoZW4KKyAgICAgICAgbG9nMiAiUEMgQmlvcyAgICA6IFByb2JpbmcgJFBDQklPU19ESVIgKG1pc3NpbmcpIgorICAgICAgICBQQ0JJT1NfRElSPS4uL3BjLWJpb3MKKyAgICBmaQorICAgIGxvZzIgIlBDIEJpb3MgICAgOiBQcm9iaW5nICRQQ0JJT1NfRElSIgorICAgIGlmIFsgISAtZCAiJFBDQklPU19ESVIiIF07IHRoZW4KKyAgICAgICAgbG9nICJQQyBCaW9zICAgIDogQ291bGQgbm90IGZpbmQgcHJlYnVpbHRzIGRpcmVjdG9yeS4iCisgICAgZWxzZQorICAgICAgICBta2RpciAtcCAkT1VUX0RJUi9saWIvcGMtYmlvcyB8fCBwYW5pYyAiQ291bGQgbm90IGNyZWF0ZSBkaXIgJE9VVF9ESVIvbGliL3BjLWJpb3MiCisgICAgICAgIGZvciBCSU9TX0ZJTEUgaW4gYmlvcy5iaW4gdmdhYmlvcy1jaXJydXMuYmluIGJpb3MtMjU2ay5iaW4gZWZpLXZpcnRpby5yb20ga3ZtdmFwaWMuYmluIGxpbnV4Ym9vdC5iaW47IGRvCisgICAgICAgICAgICBsb2cgIlBDIEJpb3MgICAgOiBDb3B5aW5nICRCSU9TX0ZJTEUiCisgICAgICAgICAgICBjcCAtZiAkUENCSU9TX0RJUi8kQklPU19GSUxFICRPVVRfRElSL2xpYi9wYy1iaW9zLyRCSU9TX0ZJTEUgfHwKKyAgICAgICAgICAgICAgICBwYW5pYyAiTWlzc2luZyBCSU9TIGZpbGU6ICRQQ0JJT1NfRElSLyRCSU9TX0ZJTEUiCisgICAgICAgIGRvbmUKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIEJJT1MgZmlsZXMgYXJlIG9ubHkgcmVxdWlyZWQgYnkgUUVNVSAyLjcuMCwgbW92ZSB0aGVtIHRvIHRoZSBub24tb3B0aW9uYWwKKyAgICAgICAgIyBsaXN0IGFib3ZlIG9uY2UgdGhlIGJpZyByZWJhc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICAgIGZvciBCSU9TX0ZJTEUgaW4gbGludXhib290X2RtYS5iaW47IGRvCisgICAgICAgICAgICBpZiBbICEgLWYgIiRQQ0JJT1NfRElSLyRCSU9TX0ZJTEUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBsb2cgIlBDIEJpb3MgICA6IFNraXBwaW5nIG9wdGlvbmFsIG1pc3NpbmcgJEJJT1NfRklMRSIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGxvZyAiUEMgQmlvcyAgICA6IENvcHlpbmcgJEJJT1NfRklMRSIKKyAgICAgICAgICAgIGNwIC1mICRQQ0JJT1NfRElSLyRCSU9TX0ZJTEUgJE9VVF9ESVIvbGliL3BjLWJpb3MvJEJJT1NfRklMRSB8fAorICAgICAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgY29weSBCSU9TIGZpbGU6ICRQQ0JJT1NfRElSLyRCSU9TX0ZJTEUiCisgICAgICAgIGRvbmUKKyAgICBmaQorZmkKKworc2V0dXBfdG9vbGNoYWluCisKKyMjIworIyMjICBBdWRpbyBzdWJzeXN0ZW1zIHByb2JlcworIyMjCitQUk9CRV9DT1JFQVVESU89bm8KK1BST0JFX0FMU0E9bm8KK1BST0JFX09TUz1ubworUFJPQkVfRVNEPW5vCitQUk9CRV9QVUxTRUFVRElPPW5vCitQUk9CRV9XSU5BVURJTz1ubworCitjYXNlICIkSE9TVF9PUyIgaW4KKyAgICBkYXJ3aW4pIFBST0JFX0NPUkVBVURJTz15ZXM7CisgICAgOzsKKyAgICBsaW51eCkgUFJPQkVfQUxTQT15ZXM7IFBST0JFX09TUz15ZXM7IFBST0JFX0VTRD15ZXM7IFBST0JFX1BVTFNFQVVESU89eWVzOworICAgIDs7CisgICAgZnJlZWJzZCkgUFJPQkVfT1NTPXllczsKKyAgICA7OworICAgIHdpbmRvd3MpIFBST0JFX1dJTkFVRElPPXllcworICAgIDs7Citlc2FjCisKK3Byb2JlX3ByZWJ1aWx0c19kaXIgKCkgeworICAgIGxvY2FsIFBSRUJVSUxUU19ESVIKKyAgICBQUkVCVUlMVFNfRElSPSRBT1NQX1BSRUJVSUxUU19ESVIvYW5kcm9pZC1lbXVsYXRvci1idWlsZC8kMworICAgIGlmIFsgISAtZCAiJFBSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgcHJlYnVpbHRzIGRpcmVjdG9yeTogJFBSRUJVSUxUU19ESVIiCisgICAgZmkKKyAgICBsb2cgIiQxIHByZWJ1aWx0cyBkaXI6ICRQUkVCVUlMVFNfRElSIgorICAgIGV2YWwgJDI9XCRQUkVCVUlMVFNfRElSCit9CisKKyMjIworIyMjICBabGliIHByb2JlCisjIyMKK3Byb2JlX3ByZWJ1aWx0c19kaXIgIlpsaWIiIFpMSUJfUFJFQlVJTFRTX0RJUiBxZW11LWFuZHJvaWQtZGVwcworCisjIyMKKyMjIyAgTGlicG5nIHByb2JlCisjIyMKK3Byb2JlX3ByZWJ1aWx0c19kaXIgIkxpYnBuZyIgTElCUE5HX1BSRUJVSUxUU19ESVIgcWVtdS1hbmRyb2lkLWRlcHMKKworIyMjCisjIyMgIExpYnhtbDIgcHJvYmUKKyMjIworcHJvYmVfcHJlYnVpbHRzX2RpciAiTGlieG1sMiIgTElCWE1MMl9QUkVCVUlMVFNfRElSIGNvbW1vbi9saWJ4bWwyCisKKyMjIworIyMjICBMaWJjdXJsIHByb2JlCisjIyMKK3Byb2JlX3ByZWJ1aWx0c19kaXIgIkxpYkNVUkwiIExJQkNVUkxfUFJFQlVJTFRTX0RJUiBjdXJsCisKKyMjIworIyMjICBMaWJBTkdMRXRyYW5zbGF0aW9uIHByb2JlCisjIyMKK3Byb2JlX3ByZWJ1aWx0c19kaXIgIkxpYkFOR0xFdHJhbnNsYXRpb24iIEFOR0xFX1RSQU5TTEFUSU9OX1BSRUJVSUxUU19ESVIgY29tbW9uL0FOR0xFCisKKyMjIworIyMjICBQcm90b2J1ZiBsaWJyYXJ5IHByb2JlCisjIyMKK3Byb2JlX3ByZWJ1aWx0c19kaXIgIlByb3RvYnVmIiBQUk9UT0JVRl9QUkVCVUlMVFNfRElSIHByb3RvYnVmCisKK0NBQ0VSVFNfRklMRT0iJFBST0dESVIvZGF0YS9jYS1idW5kbGUucGVtIgoraWYgWyAhIC1mICIkQ0FDRVJUU19GSUxFIiBdOyB0aGVuCisgICAgcGFuaWMgIk1pc3NpbmcgY2FjZXJ0cyBmaWxlOiAkQ0FDRVJUU19GSUxFIgorZmkKK21rZGlyIC1wICRPVVRfRElSL2xpYgorY3AgLWYgIiRDQUNFUlRTX0ZJTEUiICIkT1VUX0RJUi9saWIvIgorCitBRFZBTkNFRF9GRUFUVVJFX0ZJTEU9IiRQUk9HRElSL2RhdGEvYWR2YW5jZWRGZWF0dXJlcy5pbmkiCitpZiBbICEgLWYgIiRBRFZBTkNFRF9GRUFUVVJFX0ZJTEUiIF07IHRoZW4KKyAgICBwYW5pYyAiTWlzc2luZyBhZHZhbmNlZCBmZWF0dXJlIGZpbGU6ICRBRFZBTkNFRF9GRUFUVVJFX0ZJTEUiCitmaQorbWtkaXIgLXAgJE9VVF9ESVIvbGliCitjcCAtZiAiJEFEVkFOQ0VEX0ZFQVRVUkVfRklMRSIgIiRPVVRfRElSL2xpYi8iCisKKyMjIworIyMjICBCcmVha3BhZCBwcm9iZQorIyMjCitwcm9iZV9wcmVidWlsdHNfZGlyICJCcmVha3BhZCIgQlJFQUtQQURfUFJFQlVJTFRTX0RJUiBjb21tb24vYnJlYWtwYWQKK2lmIFsgIiRPUFRJT05fTUlOR1ciID0gInllcyIgXSA7IHRoZW4KKyAgICBEVU1QU1lNUz0kQlJFQUtQQURfUFJFQlVJTFRTX0RJUi8kQlVJTERfVEFHL2Jpbi9kdW1wX3N5bXNfZHdhcmYKK2Vsc2UKKyAgICAjI01hYyBhbmQgTGludXggYnVpbGRzCisgICAgRFVNUFNZTVM9JEJSRUFLUEFEX1BSRUJVSUxUU19ESVIvJEJVSUxEX1RBRy9iaW4vZHVtcF9zeW1zCitmaQorCisjIyMKKyMjIyAgUXQgcHJvYmUKKyMjIworcHJvYmVfcHJlYnVpbHRzX2RpciAiUXQiIFFUX1BSRUJVSUxUU19ESVIgcXQKKworIyMjCisjIyMgIGUyZnNwcm9ncyBwcm9iZQorIyMjCitwcm9iZV9wcmVidWlsdHNfZGlyICJlMmZzcHJvZ3MiIEUyRlNQUk9HU19QUkVCVUlMVFNfRElSIGNvbW1vbi9lMmZzcHJvZ3MKKworIyBjcmVhdGUgdGhlIG9ianMgZGlyZWN0b3J5IHRoYXQgaXMgZ29pbmcgdG8gY29udGFpbiBhbGwgZ2VuZXJhdGVkIGZpbGVzCisjIGluY2x1ZGluZyB0aGUgY29uZmlndXJhdGlvbiBvbmVzCisjCitta2RpciAtcCAkT1VUX0RJUgorCisjIyMKKyMjIyAgQ29tcGlsZXIgcHJvYmUKKyMjIworCisjIyMjCisjIyMjICBIb3N0IHN5c3RlbSBwcm9iZQorIyMjIworCisjIGJlY2F1c2UgdGhlIHByZXZpb3VzIHZlcnNpb24gY291bGQgYmUgcmVhZC1vbmx5CitjbGVhbl90ZW1wCisKKyMgY2hlY2sgd2hldGhlciB3ZSBoYXZlIDxieXRlc3dhcC5oPgorIworZmVhdHVyZV9jaGVja19oZWFkZXIgSEFWRV9CWVRFU1dBUF9IICAgICAgIjxieXRlc3dhcC5oPiIKK2ZlYXR1cmVfY2hlY2tfaGVhZGVyIEhBVkVfTUFDSElORV9CU1dBUF9IICI8bWFjaGluZS9ic3dhcC5oPiIKK2ZlYXR1cmVfY2hlY2tfaGVhZGVyIEhBVkVfRk5NQVRDSF9IICAgICAgICI8Zm5tYXRjaC5oPiIKKworIyBjaGVjayBmb3IgTWluZ3cgdmVyc2lvbi4KK2lmIFsgIiRIT1NUX09TIiA9ICJ3aW5kb3dzIiBdOyB0aGVuCitsb2cgIk1pbmd3ICAgICAgOiBQcm9iaW5nIGZvciBHQ0MgdmVyc2lvbi4iCitHQ0NfVkVSU0lPTj0kKCRDQyAtdiAyPiYxIHwgYXdrICckMSA9PSAiZ2NjIiAmJiAkMiA9PSAidmVyc2lvbiIgeyBwcmludCAkMzsgfScpCitHQ0NfTUFKT1I9JChlY2hvICIkR0NDX1ZFUlNJT04iIHwgY3V0IC1mMSAtZC4pCitHQ0NfTUlOT1I9JChlY2hvICIkR0NDX1ZFUlNJT04iIHwgY3V0IC1mMiAtZC4pCitsb2cgIk1pbmd3ICAgICAgOiBGb3VuZCBHQ0MgdmVyc2lvbiAkR0NDX01BSk9SLiRHQ0NfTUlOT1IgWyRHQ0NfVkVSU0lPTl0iCitNSU5HV19HQ0NfVkVSU0lPTj0kKCggJEdDQ19NQUpPUiAqIDEwMCArICRHQ0NfTUlOT1IgKSkKK2ZpCisjIEJ1aWxkIHRoZSBjb25maWcubWFrZSBmaWxlCisjCisKK1BSRUJVSUxUX1BBVEhfUEFJUlM9CitQUkVCVUlMVF9TWU1QQVRIX1BBSVJTPQorCisjIENvcHkgYSBzaW5nbGUgZmlsZQorIyAkMTogU291cmNlIGZpbGUgcGF0aC4KKyMgJDI6IERlc3RpbmF0aW9uIGZpbGUgcGF0aCAobm90IGEgZGlyZWN0b3J5ISkKK2NvcHlfZmlsZSAoKSB7CisgICAgbG9jYWwgU1JDX0ZJTEU9IiQxIgorICAgIGxvY2FsIERTVF9GSUxFPSIkMiIKKworICAgIGxvZzIgIkNvcHlpbmcgJFNSQ19GSUxFIC0+ICREU1RfRklMRSIKKworICAgIGNhc2UgJERTVF9GSUxFIGluCisgICAgICAgICovKQorICAgICAgICAgICAgaWYgWyAhIC1kICIkRFNUX0ZJTEUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBta2RpciAtcCAiJHtEU1RfRklMRSUlL30iIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYyAiQ2Fubm90IGNyZWF0ZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6ICREU1RfRklMRSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBEU1RfRklMRT0ke0RTVF9GSUxFJSUvfQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIGlmIFsgLWQgIiREU1RfRklMRSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIERTVF9GSUxFPSR7RFNUX0ZJTEV9LworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxvY2FsIERTVF9ESVI9IiQoZGlybmFtZSAiJERTVF9GSUxFIikiCisgICAgICAgICAgICAgICAgaWYgWyAhIC1kICIkRFNUX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBta2RpciAtcCAiJChkaXJuYW1lICIkRFNUX0ZJTEUiKSIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IGNyZWF0ZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6ICREU1RfRElSIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgY3AgLWEgJFNSQ19GSUxFICREU1RfRklMRSB8fAorICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjb3B5ICRTUkNfRklMRSBpbnRvICREU1RfRklMRSAhPyIKK30KKworCisjIFNldCBhIHByZWJ1aWx0IGZpbGUgdG8gYmUgY29waWVkCisjICQxOiBQS0cgcm9vdCBkaXJlY3RvcnkKKyMgJDI6IFNvdXJjZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gUEtHIFNSQyBkaXJlY3RvcnkKKyMgJDM6IERlc3RpbmF0aW9uIGZpbGUgcGF0aCAobm90IGEgZGlyZWN0b3J5ISkgcmVsYXRpdmUgdG8gT1VUX0RJUgoraW5zdGFsbF9wcmVidWlsdF9kbGwgKCkgeworICAgIGxvY2FsIFNSQ19GSUxFPSIkMSIKKyAgICBsb2NhbCBEU1RfRklMRT0iJDIiCisKKyAgICBpZiBbIC1MICRTUkNfRklMRSBdOyB0aGVuCisgICAgICAgIFBSRUJVSUxUX1NZTVBBVEhfUEFJUlM9IiRQUkVCVUlMVF9TWU1QQVRIX1BBSVJTICRTUkNfRklMRTokRFNUX0ZJTEUiCisgICAgZWxzZQorICAgICAgICBQUkVCVUlMVF9QQVRIX1BBSVJTPSIkUFJFQlVJTFRfUEFUSF9QQUlSUyAkU1JDX0ZJTEU6JERTVF9GSUxFIgorICAgIGZpCit9CisKK1BSRUJVSUxUX0FSQ0hTPQorY2FzZSAkSE9TVF9PUyBpbgorICAgIHdpbmRvd3MpCisgICAgICAgIFBSRUJVSUxUX0FSQ0hTPSJ4ODYgeDg2XzY0IgorICAgICAgICA7OworICAgICopCisgICAgICAgIFBSRUJVSUxUX0FSQ0hTPSJ4ODZfNjQiCisgICAgICAgIDs7Citlc2FjCisKKyMjIworIyMjIENvcHkgQU5HTEUgaWYgYXZhaWxhYmxlCisjIyMKK0FOR0xFX1BSRUJVSUxUU19ESVI9JEFPU1BfUFJFQlVJTFRTX0RJUi9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkL2NvbW1vbi9BTkdMRQoraWYgWyAtZCAkQU5HTEVfUFJFQlVJTFRTX0RJUiBdOyB0aGVuCisgICAgQU5HTEVfUFJFRklYPWxpYgorICAgIEFOR0xFX0hPU1Q9JEhPU1RfT1MKKyAgICBjYXNlICRBTkdMRV9IT1NUIGluCisgICAgICAgIHdpbmRvd3MpCisgICAgICAgICAgICBBTkdMRV9TVUZGSVg9LmRsbAorICAgICAgICAgICAgOzsKKyAgICAgICAgbGludXgpCisgICAgICAgICAgICBBTkdMRV9TVUZGSVg9LnNvCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgIGVzYWMKKyAgICAjIFdpbmRvd3Mgb25seSAoZm9yIG5vdykKKyAgICBpZiBbICIkQU5HTEVfSE9TVCIgPSAid2luZG93cyIgXTsgdGhlbgorICAgICAgICBsb2cgIkNvcHlpbmcgQU5HTEUgcHJlYnVpbHQgbGlicmFyaWVzIGZyb20gJEFOR0xFX1BSRUJVSUxUU19ESVIiCisgICAgICAgIGZvciBMSUJOQU1FIGluIEVHTCBHTEVTdjI7IGRvICMgR0xFU3YyIG9ubHkgZm9yIG5vdworICAgICAgICAgICAgZm9yIEFOR0xFX0FSQ0ggaW4gJFBSRUJVSUxUX0FSQ0hTOyBkbworICAgICAgICAgICAgICAgIGlmIFsgIiRBTkdMRV9BUkNIIiA9ICJ4ODYiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgQU5HTEVfTElCRElSPWxpYgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQU5HTEVfTElCRElSPWxpYjY0CisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBBTkdMRV9MSUJOQU1FPSRBTkdMRV9QUkVGSVgkTElCTkFNRSRBTkdMRV9TVUZGSVgKKyAgICAgICAgICAgICAgICBBTkdMRV9TUkNESVI9JEFOR0xFX1BSRUJVSUxUU19ESVIvJEFOR0xFX0hPU1QtJEFOR0xFX0FSQ0gKKworICAgICAgICAgICAgICAgIEFOR0xFX0RTVERJUj0iJE9VVF9ESVIvJEFOR0xFX0xJQkRJUi9nbGVzX2FuZ2xlIgorICAgICAgICAgICAgICAgIEFOR0xFX0RTVExJQj0iJEFOR0xFX0xJQk5BTUUiCisgICAgICAgICAgICAgICAgaWYgWyAtZiAiJEFOR0xFX1NSQ0RJUi9saWIvJEFOR0xFX0xJQk5BTUUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9wcmVidWlsdF9kbGwgIiRBTkdMRV9TUkNESVIvbGliLyRBTkdMRV9MSUJOQU1FIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRBTkdMRV9EU1RESVIvJEFOR0xFX0RTVExJQiIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZmkKK2ZpCisKKyMjIworIyMjIENvcHkgU3dpZnRzaGFkZXIgaWYgYXZhaWxhYmxlCisjIyMKK1NXSUZUU0hBREVSX1BSRUJVSUxUU19ESVI9JEFPU1BfUFJFQlVJTFRTX0RJUi9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkL2NvbW1vbi9zd2lmdHNoYWRlcgoraWYgWyAtZCAkU1dJRlRTSEFERVJfUFJFQlVJTFRTX0RJUiBdOyB0aGVuCisgICAgbG9nICJDb3B5aW5nIFN3aWZ0c2hhZGVyIHByZWJ1aWx0IGxpYnJhcmllcyBmcm9tICRTV0lGVFNIQURFUl9QUkVCVUlMVFNfRElSIgorICAgIFNXSUZUU0hBREVSX1BSRUZJWD1saWIKKyAgICBTV0lGVFNIQURFUl9IT1NUPSRIT1NUX09TCisgICAgY2FzZSAkU1dJRlRTSEFERVJfSE9TVCBpbgorICAgICAgICB3aW5kb3dzKQorICAgICAgICAgICAgU1dJRlRTSEFERVJfU1VGRklYPS5kbGwKKyAgICAgICAgICAgIDs7CisgICAgICAgIGRhcndpbikKKyAgICAgICAgICAgIFNXSUZUU0hBREVSX1NVRkZJWD0uZHlsaWIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGxpbnV4KQorICAgICAgICAgICAgU1dJRlRTSEFERVJfU1VGRklYPS5zbworICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICBlc2FjCisgICAgZm9yIExJQk5BTUUgaW4gRUdMIEdMRVNfQ00gR0xFU3YyOyBkbworICAgICAgICBmb3IgU1dJRlRTSEFERVJfQVJDSCBpbiAkUFJFQlVJTFRfQVJDSFM7IGRvCisgICAgICAgICAgICBpZiBbICIkU1dJRlRTSEFERVJfQVJDSCIgPSAieDg2IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgU1dJRlRTSEFERVJfTElCRElSPWxpYgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFNXSUZUU0hBREVSX0xJQkRJUj1saWI2NAorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIFNXSUZUU0hBREVSX0xJQk5BTUU9JFNXSUZUU0hBREVSX1BSRUZJWCRMSUJOQU1FJFNXSUZUU0hBREVSX1NVRkZJWAorICAgICAgICAgICAgU1dJRlRTSEFERVJfU1JDRElSPSRTV0lGVFNIQURFUl9QUkVCVUlMVFNfRElSLyRTV0lGVFNIQURFUl9IT1NULSRTV0lGVFNIQURFUl9BUkNICisKKyAgICAgICAgICAgIFNXSUZUU0hBREVSX0RTVERJUj0iJE9VVF9ESVIvJFNXSUZUU0hBREVSX0xJQkRJUi9nbGVzX3N3aWZ0c2hhZGVyIgorICAgICAgICAgICAgU1dJRlRTSEFERVJfRFNUTElCPSIkU1dJRlRTSEFERVJfTElCTkFNRSIKKyAgICAgICAgICAgIGlmIFsgLWYgIiRTV0lGVFNIQURFUl9TUkNESVIvbGliLyRTV0lGVFNIQURFUl9MSUJOQU1FIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgaW5zdGFsbF9wcmVidWlsdF9kbGwgIiRTV0lGVFNIQURFUl9TUkNESVIvbGliLyRTV0lGVFNIQURFUl9MSUJOQU1FIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJFNXSUZUU0hBREVSX0RTVERJUi8kU1dJRlRTSEFERVJfRFNUTElCIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2ZpCisKKworIyMjCisjIyMgIENvcHkgTWVzYSBpZiBhdmFpbGFibGUKKyMjIworTUVTQV9QUkVCVUlMVFNfRElSPSRBT1NQX1BSRUJVSUxUU19ESVIvYW5kcm9pZC1lbXVsYXRvci1idWlsZC9tZXNhCitpZiBbIC1kICRNRVNBX1BSRUJVSUxUU19ESVIgXTsgdGhlbgorICAgIGxvZyAiQ29weWluZyBNZXNhIHByZWJ1aWx0IGxpYnJhcmllcyBmcm9tICRNRVNBX1BSRUJVSUxUU19ESVIiCisgICAgY2FzZSAkSE9TVF9PUyBpbgorICAgICAgICB3aW5kb3dzKQorICAgICAgICAgICAgTUVTQV9MSUJOQU1FPW9wZW5nbDMyLmRsbAorICAgICAgICAgICAgOzsKKyAgICAgICAgbGludXgpCisgICAgICAgICAgICBNRVNBX0xJQk5BTUU9ImxpYkdMLnNvIGxpYkdMLnNvLjEiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgTUVTQV9MSUJOQU1FPQorICAgIGVzYWMKKyAgICBmb3IgTElCTkFNRSBpbiAkTUVTQV9MSUJOQU1FOyBkbworICAgICAgICBmb3IgTUVTQV9BUkNIIGluICRQUkVCVUlMVF9BUkNIUzsgZG8KKyAgICAgICAgICAgIGlmIFsgIiRNRVNBX0FSQ0giID0gIng4NiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIE1FU0FfTElCRElSPWxpYgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1FU0FfTElCRElSPWxpYjY0CisgICAgICAgICAgICBmaQorICAgICAgICAgICAgTUVTQV9TUkNESVI9JE1FU0FfUFJFQlVJTFRTX0RJUi8kSE9TVF9PUy0kTUVTQV9BUkNICisgICAgICAgICAgICBNRVNBX0RTVERJUj0iJE9VVF9ESVIvJE1FU0FfTElCRElSL2dsZXNfbWVzYSIKKyAgICAgICAgICAgIE1FU0FfRFNUTElCPSIkTElCTkFNRSIKKyAgICAgICAgICAgIGlmIFsgIiRMSUJOQU1FIiA9ICJvcGVuZ2wzMi5kbGwiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBNRVNBX0RTVExJQj0ibWVzYV9vcGVuZ2wzMi5kbGwiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaW5zdGFsbF9wcmVidWlsdF9kbGwgIiRNRVNBX1NSQ0RJUi9saWIvJExJQk5BTUUiICIkTUVTQV9EU1RESVIvJE1FU0FfRFNUTElCIgorICAgICAgICBkb25lCisgICAgZG9uZQorZmkKKworIyBDb3B5IFF0IHNoYXJlZCBsaWJyYXJpZXMsIGlmIG5lZWRlZC4KK2xvZyAiQ29weWluZyBRdCBwcmVidWlsdCBsaWJyYXJpZXMgZnJvbSAkUVRfUFJFQlVJTFRTX0RJUiIKK2ZvciBRVF9BUkNIIGluICRQUkVCVUlMVF9BUkNIUzsgZG8KKyAgICBRVF9TUkNESVI9JFFUX1BSRUJVSUxUU19ESVIvJEhPU1RfT1MtJFFUX0FSQ0gKKyAgICBjYXNlICRRVF9BUkNIIGluCisgICAgICAgIHg4NikgUVRfRFNURElSPSRPVVRfRElSL2xpYi9xdDs7CisgICAgICAgIHg4Nl82NCkgUVRfRFNURElSPSRPVVRfRElSL2xpYjY0L3F0OzsKKyAgICAgICAgKikgcGFuaWMgIkludmFsaWQgUXQgaG9zdCBhcmNoaXRlY3R1cmU6ICRRVF9BUkNIIjs7CisgICAgZXNhYworICAgIG1rZGlyIC1wICIkUVRfRFNURElSIiB8fCBwYW5pYyAiQ291bGQgbm90IGNyZWF0ZSBRdCBsaWJyYXJ5IHN1Yi1kaXJlY3RvcnkhIgorICAgIGlmIFsgISAtZCAiJFFUX1NSQ0RJUiIgXTsgdGhlbgorICAgICAgICBjb250aW51ZQorICAgIGZpCisgICAgY2FzZSAkSE9TVF9PUyBpbgorICAgICAgICB3aW5kb3dzKSBRVF9ETExfRklMVEVSPSIqLmRsbCI7OworICAgICAgICBkYXJ3aW4pIFFUX0RMTF9GSUxURVI9IiouZHlsaWIiOzsKKyAgICAgICAgKikgUVRfRExMX0ZJTFRFUj0iKi5zbyoiOzsKKyAgICBlc2FjCisgICAgUVRfTElCUz0kKGNkICIkUVRfU1JDRElSIiAmJiBmaW5kIC4gLW5hbWUgIiRRVF9ETExfRklMVEVSIiAtbm90IC1wYXRoICIqLmRTWU0vKiIgMj4vZGV2L251bGwpCisgICAgaWYgWyAteiAiJFFUX0xJQlMiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNhbm5vdCBmaW5kIFF0IHByZWJ1aWx0IGxpYnJhcmllcyE/IgorICAgIGZpCisgICAgZm9yIFFUX0xJQiBpbiAkUVRfTElCUzsgZG8KKyAgICAgICAgUVRfTElCPSR7UVRfTElCIy4vfQorICAgICAgICBRVF9EU1RfTElCPSRRVF9MSUIKKyAgICAgICAgaWYgWyAiJEhPU1RfT1MiID0gIndpbmRvd3MiIF07IHRoZW4KKyAgICAgICAgICAgICMgTk9URTogT24gV2luZG93cywgdGhlIHByZWJ1aWx0IGxpYnJhcmllcyBhcmUgcGxhY2VkIHVuZGVyCisgICAgICAgICAgICAjICRQUkVCVUlMVFMvcXQvYmluLCBub3QgJFBSRUJVSUxUUy9xdC9saWIsIGVuc3VyZSB0aGF0IHRoZXkKKyAgICAgICAgICAgICMgYXJlIGFsd2F5cyBjb3BpZWQgdG8gJE9VVF9ESVIvbGliWzY0XS9xdC9saWIvLgorICAgICAgICAgICAgUVRfRFNUX0xJQj0kKHByaW50ZiAlcyAiJFFUX0RTVF9MSUIiIHwgc2VkIC1lICdzfF5iaW4vfGxpYi98ZycpCisgICAgICAgIGZpCisgICAgICAgIGluc3RhbGxfcHJlYnVpbHRfZGxsICIkUVRfU1JDRElSLyRRVF9MSUIiICIkUVRfRFNURElSLyRRVF9EU1RfTElCIgorICAgIGRvbmUKK2RvbmUKKworIyBDb3B5IGUyZnNwcm9ncyBiaW5hcmllcy4KK2xvZyAiQ29weWluZyBlMmZzcHJvZ3MgYmluYXJpZXMuIgorZm9yIEUyRlNfQVJDSCBpbiAkUFJFQlVJTFRfQVJDSFM7IGRvCisgICAgIyBOT1RFOiBpbiB3aW5kb3dzIG9ubHkgMzItYml0IGJpbmFyaWVzIGFyZSBhdmFpbGFibGUsIHNvIHdlJ2xsIGNvcHkgdGhlCisgICAgIyAzMi1iaXQgZXhlY3V0YWJsZXMgdG8gdGhlIGJpbjY0LyBkaXJlY3RvcnkgdG8gY292ZXIgYWxsIG91ciBiYXNlcworICAgIGNhc2UgJEhPU1RfT1MgaW4KKyAgICAgICAgd2luZG93cykgRTJGU19TUkNESVI9JEUyRlNQUk9HU19QUkVCVUlMVFNfRElSLyRIT1NUX09TLXg4Njs7CisgICAgICAgICopIEUyRlNfU1JDRElSPSRFMkZTUFJPR1NfUFJFQlVJTFRTX0RJUi8kSE9TVF9PUy0kRTJGU19BUkNIOzsKKyAgICBlc2FjCisKKyAgICBpZiBbICEgLWQgIiRFMkZTX1NSQ0RJUiIgXTsgdGhlbgorICAgICAgICBjb250aW51ZQorICAgIGZpCisKKyAgICBjYXNlICRFMkZTX0FSQ0ggaW4KKyAgICAgICAgeDg2KSBFMkZTX0RTVERJUj0kT1VUX0RJUi9iaW47OworICAgICAgICB4ODZfNjQpIEUyRlNfRFNURElSPSRPVVRfRElSL2JpbjY0OzsKKyAgICAgICAgKikgcGFuaWMgIkludmFsaWQgZTJmc3Byb2dzIGhvc3QgYXJjaGl0ZWN0dXJlOiAkRTJGU19BUkNIIgorICAgIGVzYWMKKyAgICBjb3B5X2ZpbGUgIiRFMkZTX1NSQ0RJUi9zYmluLyoiICIkRTJGU19EU1RESVIvIgorZG9uZQorCisjIENvcHkgdGhlIHJlcXVlc3RlZCBsaWJyYXJ5IGZyb20gdGhlIHRvb2xjaGFpbiBzeXNyb290LgorIyBUaGlzIGZ1bmN0aW9uCisjICAgLSByZXNvbHZlcyBzeW1saW5rcyB0byBmaW5kIHRoZSBhY3R1YWwgbGlicmFyeQorIyAgIC0gY29waWVzIHRoZSBhY3R1YWwgbGlicmFyeSB3aXRoIHRoZSByZXNvbHZlZCBuYW1lLgorIyAgIC0gY29waWVzIGFsbCB0aGUgc3ltbGlua3MgZm91bmQgaW4gJFNSQ0RJUiB0byB0aGF0IGxpYnJhcnkgYXMgd2VsbC4KKyMgVGhpcyB3YXksIGxpbmtpbmcgYWdhaW5zdCBnZW5lcmljL3NwZWNpZmljIHZlcnNpb24gd29ya3Mgb24gc3lzdGVtcyB0aGF0CisjIGRvL2Rvbid0IHVuZGVyc3RhbmQgc3ltbGlua3MuCisjICAgJDE6IERlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyMgICAkMjogU291cmNlIGRpcmVjdG9yeS4KKyMgICAkMzogTmFtZSBvZiB0aGUgbGlicmFyeSAod2l0aG91dCB0aGUgLnNvIHN1ZmZpeCkuCitjb3B5X3Rvb2xjaGFpbl9saWIgKCkgeworICAgIGxvY2FsIERFU1RESVIgU1JDRElSIE5BTUUKKyAgICBsb2NhbCBGUk9NIFJFQUxOQU1FCisgICAgbG9jYWwgU1lNTElOSyBTWU1OQU1FCisgICAgREVTVERJUj0iJDEiCisgICAgU1JDRElSPSIkMiIKKyAgICBOQU1FPSIkMy5zbyIKKworICAgIG1rZGlyIC1wICIke0RFU1RESVJ9IiB8fCBwYW5pYyAiRmFpbGVkIHRvIGNyZWF0ZWQgJHtERVNURElSfSIKKworICAgIEZST009IiQocmVhZGxpbmsgLXFubSAiJHtTUkNESVJ9LyR7TkFNRX0iKSIgfHwKKyAgICAgICAgICAgIHBhbmljICJDb3VsbmQndCByZXNvbHZlICR7U1JDRElSfS8ke05BTUV9IgorICAgIFJFQUxOQU1FPSIkKGJhc2VuYW1lICIke0ZST019IikiCisKKyAgICBjcCAtZiAiJHtGUk9NfSIgIiR7REVTVERJUn0vJHtSRUFMTkFNRX0iIHx8CisgICAgICAgICAgICBwYW5pYyAiQ291bmQndCBjb3B5ICR7RlJPTX0gLS0+ICR7REVTVERJUn0vJHtSRUFMTkFNRX0iCisKKyAgICAjIE5vdyByZS1jcmVhdGUgYWxsIHRoZSBzeW1saW5rcyBhcyByZWxhdGl2ZSBwYXRoIHN5bWxpbmtzLgorICAgIGZvciBTWU1MSU5LIGluICIke1NSQ0RJUn0vJHtOQU1FfSIuKjsgZG8KKyAgICAgICAgaWYgWyAiJHtTWU1MSU5LfSIgPSAiJHtGUk9NfSIgLW8gIiQocmVhZGxpbmsgLXFubSAiJHtTWU1MSU5LfSIpIiAhPSAiJHtGUk9NfSIgXTsgdGhlbgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgU1lNTkFNRT0iJChiYXNlbmFtZSAiJHtTWU1MSU5LfSIpIgorICAgICAgICBpZiBbICEgLWUgIiR7REVTVERJUn0vJHtTWU1OQU1FfSIgLW8gIiQocmVhZGxpbmsgLXFubSAiJHtERVNURElSfS8ke1NZTU5BTUV9IikiICE9ICIke0RFU1RESVJ9LyR7UkVBTE5BTUV9IiBdOyB0aGVuCisgICAgICAgICAgICBybSAtZiAiJHtERVNURElSfS8ke1NZTU5BTUV9IgorICAgICAgICAgICAgbG4gLXMgIiR7UkVBTE5BTUV9IiAiJHtERVNURElSfS8ke1NZTU5BTUV9IiB8fCBcCisgICAgICAgICAgICAgICAgICAgIHBhbmljICJGYWlsZWQgdG8gY3JlYXRlIHN5bWxpbmsgJHtERVNURElSfS8ke1NZTU5BTUV9IC0tPiAke1JFQUxOQU1FfSIKKyAgICAgICAgZmkKKyAgICBkb25lCit9CisKK2lmIFsgLW4gIiR7VE9PTENIQUlOX1NZU1JPT1R9IiBdOyB0aGVuCisgICAgIyBXZSBjdXJyZW50bHkgb25seSBidW5kbGUgbGlicmFyaWVzIGZvciBsaW51eAorICAgICMgLSBtaW5ndzogU3RhdGljYWxseSBsaW5rcyBhbGwgbGlicmFyaWVzIChiLmFuZHJvaWQuY29tLzE5MTM2OSkKKyAgICAjIC0gZGFyd2luOiBXZSB1c2UgdGhlIGRldmVsb3BtZW50IG1hY2hpbmUncyBpbnN0YWxsZWQgU0RLLiBObyBwb2ludAorICAgICMgICAgICAgYnVuZGxpbmcsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSB1bmlmb3JtIGxpYnJhcmllcyB0byBiZWdpbiB3aXRoLgorICAgIGNhc2UgJEhPU1RfT1MgaW4KKyAgICAgICAgbGludXgqKQorICAgICAgICAgICAgbG9nICJDb3B5aW5nIHRvb2xjaGFpbiBsaWJyYXJpZXMgdG8gYnVuZGxlIHdpdGggdGhlIHByb2dyYW0iCisgICAgICAgICAgICBmb3IgQlVORExFRF9MSUIgaW4gbGlic3RkYysrOyBkbworICAgICAgICAgICAgICAgIGxvZyAiICBCdW5kbGluZyAke0JVTkRMRURfTElCfSIKKyAgICAgICAgICAgICAgICBjb3B5X3Rvb2xjaGFpbl9saWIgIiR7T1VUX0RJUn0vbGliL2xpYnN0ZGMrKyIgIiR7VE9PTENIQUlOX1NZU1JPT1R9L2xpYjMyIiAiJHtCVU5ETEVEX0xJQn0iCisgICAgICAgICAgICAgICAgY29weV90b29sY2hhaW5fbGliICIke09VVF9ESVJ9L2xpYjY0L2xpYnN0ZGMrKyIgIiR7VE9PTENIQUlOX1NZU1JPT1R9L2xpYjY0IiAiJHtCVU5ETEVEX0xJQn0iCisgICAgICAgICAgICBkb25lCisgICAgICAgIDs7CisgICAgICAgICopIGxvZyAiTm90IGNvcHlpbmcgdG9vbGNoYWluIGxpYnJhcmllcyBmb3IgJHtIT1NUX09TfSI7OworICAgIGVzYWMKK2ZpCisKKyMjIworIyMjICBMaWJ3aW5wdGhyZWFkcy0xLmRsbCBwcm9iZQorIyMjCisKKyMgJDE6IERMTCBuYW1lIChlLmcuIGxpYndpbnB0aHJlYWQtMS5kbGwpCitwcm9iZV9taW5nd19kbGxzICgpIHsKKyAgICBsb2NhbCBETExTIERMTCBTUkNfRExMIERTVF9ETEwgTUlOR1dfU1lTUk9UTworICAgIE1JTkdXX1NZU1JPT1Q9JCgiJEdFTl9TREsiICRHRU5fU0RLX0ZMQUdTIC0tcHJpbnQ9c3lzcm9vdCB1bnVzZWRfcGFyYW1ldGVyKQorICAgIERMTFM9JChjZCAiJE1JTkdXX1NZU1JPT1QiICYmIGZpbmQgLiAtbmFtZSAiJDEiIDI+L2Rldi9udWxsKQorICAgIGlmIFsgLXogIiRETExTIiBdOyB0aGVuCisgICAgICAgIGxvZyAiTWluZ3cgICAgICA6IE5vICQxIGF2YWlsYWJsZS4iCisgICAgZWxzZQorICAgICAgICBsb2cgIk1pbmd3ICAgICAgOiBDb3B5aW5nIHByZWJ1aWx0ICQxIGxpYnJhcmllcy4iCisgICAgICAgIGZvciBETEwgaW4gJERMTFM7IGRvCisgICAgICAgICAgICBTUkNfRExMPSR7RExMIy4vfSAgIyBSZW1vdmUgaW5pdGlhbCAuLyBpbiBETEwgcGF0aC4KKyAgICAgICAgICAgIGNhc2UgJFNSQ19ETEwgaW4KKyAgICAgICAgICAgICAgICBiaW4vKikKKyAgICAgICAgICAgICAgICAgICAgRFNUX0RMTD1saWI2NCR7U1JDX0RMTCMjYmlufQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGxpYjMyLyopCisgICAgICAgICAgICAgICAgICAgIERTVF9ETEw9bGliJHtTUkNfRExMIyNsaWIzMn0KKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICBEU1RfRExMPSRTUkNfRExMCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBsb2cyICIgICAkU1JDX0RMTCAtPiAkRFNUX0RMTCIKKyAgICAgICAgICAgIGluc3RhbGxfcHJlYnVpbHRfZGxsICIkTUlOR1dfU1lTUk9PVCIvJFNSQ19ETEwgIiRPVVRfRElSIi8kRFNUX0RMTAorICAgICAgICBkb25lCisgICAgZmkKK30KKworaWYgWyAiJE9QVElPTl9NSU5HVyIgXTsgdGhlbgorICAgIHByb2JlX21pbmd3X2RsbHMgbGlid2lucHRocmVhZC0xLmRsbAorZmkKKworIyBSZS1jcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorY29uZmlnX21rPSRPVVRfRElSL2J1aWxkL2NvbmZpZy5tYWtlCitjb25maWdfZGlyPSQoZGlybmFtZSAkY29uZmlnX21rKQorbWtkaXIgLXAgIiRjb25maWdfZGlyIiAyPiAkVE1QTAoraWYgWyAkPyAhPSAwIF0gOyB0aGVuCisgICAgZWNobyAiQ2FuJ3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgYnVpbGQgY29uZmlnIGZpbGU6ICRjb25maWdfZGlyIgorICAgIGNhdCAkVE1QTAorICAgIGNsZWFuX2V4aXQKK2ZpCisKK2xvZyAiR2VuZXJhdGUgICA6ICRjb25maWdfbWsiCisKK2VjaG8gIiMgVGhpcyBmaWxlIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5ICRQUk9HTkFNRS4gRG8gbm90IGVkaXQgISIgPiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9UQVJHRVRfT1MgICAgICAgOj0gJEhPU1RfT1MiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX1RBUkdFVF9BUkNIICAgICA6PSAkSE9TVF9BUkNIIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9UQVJHRVRfQ0MgICAgICAgOj0gJENDIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9UQVJHRVRfQ1hYICAgICAgOj0gJENYWCIgPj4gJGNvbmZpZ19taworZWNobyAiQlVJTERfVEFSR0VUX0xEICAgICAgIDo9ICRMRCIgPj4gJGNvbmZpZ19taworZWNobyAiQlVJTERfVEFSR0VUX0FSICAgICAgIDo9ICRBUiIgPj4gJGNvbmZpZ19taworZWNobyAiQlVJTERfVEFSR0VUX09CSkNPUFkgIDo9ICRPQkpDT1BZIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9UQVJHRVRfV0lORFJFUyAgOj0gJFdJTkRSRVMiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX1RBUkdFVF9EVU1QU1lNUyA6PSAkRFVNUFNZTVMiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX09CSlNfRElSICAgICAgICA6PSAkT1VUX0RJUiIgPj4gJGNvbmZpZ19taworCitlY2hvICIiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX0hPU1RfQVIgICAgICAgICA6PSAkQlVJTERfQVIiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX0hPU1RfQ0MgICAgICAgICA6PSAkQlVJTERfQ0MiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX0hPU1RfQ1hYICAgICAgICA6PSAkQlVJTERfQ1hYIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9IT1NUX0xEICAgICAgICAgOj0gJEJVSUxEX0xEIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9IT1NUX09CSkNPUFkgICAgOj0gJEJVSUxEX09CSkNPUFkiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX0hPU1RfQ0ZMQUdTICAgICA6PSAkQlVJTERfQ0ZMQUdTIiA+PiAkY29uZmlnX21rCitlY2hvICJCVUlMRF9IT1NUX0xERkxBR1MgICAgOj0gJEJVSUxEX0xERkxBR1MiID4+ICRjb25maWdfbWsKK2VjaG8gIkJVSUxEX0hPU1RfRFVNUFNZTVMgICA6PSAkRFVNUFNZTVMiID4+ICRjb25maWdfbWsKKworZWNobyAiQ09ORklHX0NPUkVBVURJTyAgOj0gJFBST0JFX0NPUkVBVURJTyIgPj4gJGNvbmZpZ19taworZWNobyAiQ09ORklHX1dJTkFVRElPICAgOj0gJFBST0JFX1dJTkFVRElPIiA+PiAkY29uZmlnX21rCitlY2hvICJDT05GSUdfRVNEICAgICAgICA6PSAkUFJPQkVfRVNEIiA+PiAkY29uZmlnX21rCitlY2hvICJDT05GSUdfQUxTQSAgICAgICA6PSAkUFJPQkVfQUxTQSIgPj4gJGNvbmZpZ19taworZWNobyAiQ09ORklHX09TUyAgICAgICAgOj0gJFBST0JFX09TUyIgPj4gJGNvbmZpZ19taworZWNobyAiQ09ORklHX1BVTFNFQVVESU8gOj0gJFBST0JFX1BVTFNFQVVESU8iID4+ICRjb25maWdfbWsKK2VjaG8gIlFUX1BSRUJVSUxUU19ESVIgIDo9ICRRVF9QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCisKK2lmIFsgIiRPUFRJT05fQkVOQ0hNQVJLUyIgPSAieWVzIiBdOyB0aGVuCisgIGVjaG8gIkJVSUxEX0JFTkNITUFSS1MgOj0gdHJ1ZSIgPj4gJGNvbmZpZ19taworZmkKKworaWYgWyAiJE9QVElPTl9HTEVTIiA9ICJhbmdsZSIgXSA7IHRoZW4KKyAgICBlY2hvICJFTVVMQVRPUl9VU0VfQU5HTEUgOj0gdHJ1ZSIgPj4gJGNvbmZpZ19taworZWxzZQorICAgIGVjaG8gIkVNVUxBVE9SX1VTRV9BTkdMRSA6PSBmYWxzZSIgPj4gJGNvbmZpZ19taworZmkKKworZWNobyAiWkxJQl9QUkVCVUlMVFNfRElSIDo9ICRaTElCX1BSRUJVSUxUU19ESVIiID4+ICRjb25maWdfbWsKK2VjaG8gIkxJQlBOR19QUkVCVUlMVFNfRElSIDo9ICRMSUJQTkdfUFJFQlVJTFRTX0RJUiIgPj4gJGNvbmZpZ19taworZWNobyAiTElCWE1MMl9QUkVCVUlMVFNfRElSIDo9ICRMSUJYTUwyX1BSRUJVSUxUU19ESVIiID4+ICRjb25maWdfbWsKK2VjaG8gIkxJQkNVUkxfUFJFQlVJTFRTX0RJUiA6PSAkTElCQ1VSTF9QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCitlY2hvICJBTkdMRV9UUkFOU0xBVElPTl9QUkVCVUlMVFNfRElSIDo9ICRBTkdMRV9UUkFOU0xBVElPTl9QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCitlY2hvICJCUkVBS1BBRF9QUkVCVUlMVFNfRElSIDo9ICRCUkVBS1BBRF9QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCisjIGxpYnV1aWQgaXMgYSBwYXJ0IG9mIGUyZnNwcm9ncyBwYWNrYWdlCitlY2hvICJMSUJVVUlEX1BSRUJVSUxUU19ESVIgOj0gJEUyRlNQUk9HU19QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCitlY2hvICJQUk9UT0JVRl9QUkVCVUlMVFNfRElSIDo9ICRQUk9UT0JVRl9QUkVCVUlMVFNfRElSIiA+PiAkY29uZmlnX21rCisKK2lmIFsgJE9QVElPTl9ERUJVRyA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiQlVJTERfREVCVUcgOj0gdHJ1ZSIgPj4gJGNvbmZpZ19taworZmkKK2lmIFsgJE9QVElPTl9TQU5JVElaRVIgIT0gIm5vIiBdIDsgdGhlbgorICAgIGVjaG8gIkJVSUxEX1NBTklUSVpFUiA6PSAkT1BUSU9OX1NBTklUSVpFUiIgPj4gJGNvbmZpZ19taworZmkKK2lmIFsgJE9QVElPTl9FTVVHTF9QUklOVE9VVCA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiQlVJTERfRU1VR0xfUFJJTlRPVVQgOj0gdHJ1ZSIgPj4gJGNvbmZpZ19taworZmkKK2lmIFsgIiRPUFRJT05fU1RSSVAiID0gInllcyIgXTsgdGhlbgorICAgIGVjaG8gIkJVSUxEX1NUUklQX0JJTkFSSUVTIDo9IHRydWUiID4+ICRjb25maWdfbWsKK2ZpCitpZiBbICIkT1BUSU9OX1NZTUJPTFMiID0gInllcyIgXTsgdGhlbgorICAgIGVjaG8gIkJVSUxEX0dFTkVSQVRFX1NZTUJPTFMgOj0gdHJ1ZSIgPj4gJGNvbmZpZ19taworICAgIGVjaG8gIiIgPj4gJGNvbmZpZ19taworZmkKK2lmIFsgIiRPUFRJT05fQ1JBU0hVUExPQUQiID0gInByb2QiIF07IHRoZW4KKyAgICBlY2hvICJFTVVMQVRPUl9DUkFTSFVQTE9BRCA6PSBQUk9EIiA+PiAkY29uZmlnX21rCitlbGlmIFsgIiRPUFRJT05fQ1JBU0hVUExPQUQiID0gInN0YWdpbmciIF07IHRoZW4KKyAgICBlY2hvICJFTVVMQVRPUl9DUkFTSFVQTE9BRCA6PSBTVEFHSU5HIiA+PiAkY29uZmlnX21rCitlbHNlCisgICAgZWNobyAiRU1VTEFUT1JfQ1JBU0hVUExPQUQgOj0gTk9ORSIgPj4gJGNvbmZpZ19taworZmkKKworaWYgWyAiJEFORFJPSURfU0RLX1RPT0xTX1JFVklTSU9OIiBdIDsgdGhlbgorICBlY2hvICJBTkRST0lEX1NES19UT09MU19SRVZJU0lPTiA6PSAkQU5EUk9JRF9TREtfVE9PTFNfUkVWSVNJT04iID4+ICRjb25maWdfbWsKK2ZpCisKK2lmIFsgIiRBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIiIF0gOyB0aGVuCisgIGVjaG8gIkFORFJPSURfU0RLX1RPT0xTX0JVSUxEX05VTUJFUiA6PSAkQU5EUk9JRF9TREtfVE9PTFNfQlVJTERfTlVNQkVSIiA+PiAkY29uZmlnX21rCitmaQorCitpZiBbICIkY29uZmlnX21rIiA9ICJ5ZXMiIF0gOyB0aGVuCisgICAgZWNobyAiIiA+PiAkY29uZmlnX21rCisgICAgZWNobyAiVVNFX01JTkdXIDo9IDEiID4+ICRjb25maWdfbWsKKyAgICBlY2hvICJIT1NUX09TICAgOj0gd2luZG93cyIgPj4gJGNvbmZpZ19taworICAgIGVjaG8gIkhPU1RfTUlOR1dfVkVSU0lPTiA6PSAkTUlOR1dfR0NDX1ZFUlNJT04iID4+ICRjb25maWdfbWsKK2ZpCisKK2lmIFsgLXogIiRPUFRJT05fUUVNVTJfU1JDRElSIiBdOyB0aGVuCisgICAgUUVNVTJfVE9QX0RJUj0kQU5EUk9JRF9FTVVMQVRPUl9RRU1VMl9TUkNESVIKKyAgICBpZiBbIC1uICIkUUVNVTJfVE9QX0RJUiIgXTsgdGhlbgorICAgICAgICBsb2cgIlFFTVUyICAgICAgOiAkUUVNVTJfVE9QX0RJUiAgW2Vudmlyb25tZW50XSIKKyAgICBlbHNlCisgICAgICAgIFFFTVUyX1RPUF9ESVI9JFBST0dESVIvLi4KKyAgICAgICAgbG9nICJRRU1VMiAgICAgIDogJFFFTVUyX1RPUF9ESVIgIFthdXRvLWRldGVjdF0iCisgICAgZmkKKyAgICBpZiBbICEgLWQgIiRRRU1VMl9UT1BfRElSIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIFFFTVUyIHNvdXJjZSBkaXJlY3Rvcnk6ICRRRU1VMl9UT1BfRElSIgorICAgIGZpCisgICAgUUVNVTJfVE9QX0RJUj0kKGNkICIkUUVNVTJfVE9QX0RJUiIgJiYgcHdkIC1QKQorZWxzZQorICAgIFFFTVUyX1RPUF9ESVI9JE9QVElPTl9RRU1VMl9TUkNESVIKKyAgICBsb2cgIlFFTVUyICAgICAgOiAkUUVNVTJfVE9QX0RJUiAgWy0tcWVtdTItc3JjLWRpcl0iCitmaQorCitpZiBbICEgLWQgIiRRRU1VMl9UT1BfRElSIi9hbmRyb2lkLXFlbXUyLWdsdWUgXTsgdGhlbgorICAgIHBhbmljICJNaXNzaW5nIGRpcmVjdG9yeTogJFFFTVUyX1RPUF9ESVIvYW5kcm9pZC1xZW11Mi1nbHVlIgorZWxzZQorICAgIGVjaG8gIlFFTVUyX1RPUF9ESVIgOj0gJFFFTVUyX1RPUF9ESVIiID4+ICRjb25maWdfbWsKK2ZpCisKK2VjaG8gIlBSRUJVSUxUX1BBVEhfUEFJUlMgOj0gXFwiID4+ICRjb25maWdfbWsKK2ZvciBQUkVCVUlMVF9QQVRIX1BBSVIgaW4gJFBSRUJVSUxUX1BBVEhfUEFJUlM7CitkbworICAgIGVjaG8gIiAgICAkUFJFQlVJTFRfUEFUSF9QQUlSIFxcIiA+PiAkY29uZmlnX21rCitkb25lCitlY2hvICIiID4+ICRjb25maWdfbWsKKworZWNobyAiUFJFQlVJTFRfU1lNUEFUSF9QQUlSUyA6PSBcXCIgPj4gJGNvbmZpZ19taworZm9yIFBSRUJVSUxUX1NZTVBBVEhfUEFJUiBpbiAkUFJFQlVJTFRfU1lNUEFUSF9QQUlSUzsKK2RvCisgICAgZWNobyAiICAgICRQUkVCVUlMVF9TWU1QQVRIX1BBSVIgXFwiID4+ICRjb25maWdfbWsKK2RvbmUKK2VjaG8gIiIgPj4gJGNvbmZpZ19taworCisjIEJ1aWxkIHRoZSBjb25maWctaG9zdC5oIGZpbGUKKyMKK2NvbmZpZ19oPSRPVVRfRElSL2J1aWxkL2NvbmZpZy1ob3N0LmgKK2NhdCA+ICRjb25maWdfaCA8PEVPRgorLyogVGhpcyBmaWxlIHdhcyBhdXRvZ2VuZXJhdGVkIGJ5ICckUFJPR05BTUUnICovCisKKyNkZWZpbmUgQ09ORklHX1FFTVVfU0hBUkVESVIgICAiL3Vzci9sb2NhbC9zaGFyZS9xZW11IgorCitFT0YKKworaWYgWyAiJEhBVkVfQllURVNXQVBfSCIgPSAieWVzIiBdIDsgdGhlbgorICBlY2hvICIjZGVmaW5lIENPTkZJR19CWVRFU1dBUF9IIDEiID4+ICRjb25maWdfaAorZmkKK2lmIFsgIiRIQVZFX01BQ0hJTkVfQllURVNXQVBfSCIgPSAieWVzIiBdIDsgdGhlbgorICBlY2hvICIjZGVmaW5lIENPTkZJR19NQUNISU5FX0JTV0FQX0ggMSIgPj4gJGNvbmZpZ19oCitmaQoraWYgWyAiJEhBVkVfRk5NQVRDSF9IIiA9ICJ5ZXMiIF0gOyB0aGVuCisgIGVjaG8gIiNkZWZpbmUgQ09ORklHX0ZOTUFUQ0ggIDEiID4+ICRjb25maWdfaAorZmkKK2VjaG8gIiNkZWZpbmUgQ09ORklHX0dEQlNUVUIgIDEiID4+ICRjb25maWdfaAorZWNobyAiI2RlZmluZSBDT05GSUdfU0xJUlAgICAgMSIgPj4gJGNvbmZpZ19oCitlY2hvICIjZGVmaW5lIENPTkZJR19TS0lOUyAgICAxIiA+PiAkY29uZmlnX2gKK2VjaG8gIiNkZWZpbmUgQ09ORklHX1RSQUNFICAgIDEiID4+ICRjb25maWdfaAorZWNobyAiI2RlZmluZSBDT05GSUdfUVQgICAgICAgMSIgPj4gJGNvbmZpZ19oCitlY2hvICIjdW5kZWYgQ09ORklHX1NETCIgPj4gJGNvbmZpZ19oCisKK2Nhc2UgIiRIT1NUX09TIiBpbgorICAgIHdpbmRvd3MpCisgICAgICAgIGVjaG8gIiNkZWZpbmUgQ09ORklHX1dJTjMyICAxIiA+PiAkY29uZmlnX2gKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICBlY2hvICIjZGVmaW5lIENPTkZJR19QT1NJWCAgMSIgPj4gJGNvbmZpZ19oCisgICAgICAgIDs7Citlc2FjCisKK2Nhc2UgIiRIT1NUX09TIiBpbgorICAgIGxpbnV4KQorICAgICAgICBlY2hvICIjZGVmaW5lIENPTkZJR19LVk1fR1NfUkVTVE9SRSAxIiA+PiAkY29uZmlnX2gKKyAgICAgICAgOzsKK2VzYWMKKworIyBvbmx5IExpbnV4IGhhcyBmZGF0YXN5bmMoKQorY2FzZSAiJEhPU1RfT1MiIGluCisgICAgbGludXgpCisgICAgICAgIGVjaG8gIiNkZWZpbmUgQ09ORklHX0ZEQVRBU1lOQyAgICAxIiA+PiAkY29uZmlnX2gKKyAgICAgICAgOzsKK2VzYWMKKworY2FzZSAiJEhPU1RfT1MiIGluCisgICAgbGludXh8ZGFyd2luKQorICAgICAgICBlY2hvICIjZGVmaW5lIENPTkZJR19NQURWSVNFICAxIiA+PiAkY29uZmlnX2gKKyAgICAgICAgOzsKK2VzYWMKKworIyB0aGUgLW5hbmQtbGltaXRzIG9wdGlvbnMgY2FuIG9ubHkgd29yayBvbiBub24td2luZG93cyBzeXN0ZW1zCitpZiBbICIkSE9TVF9PUyIgIT0gIndpbmRvd3MiIF0gOyB0aGVuCisgICAgZWNobyAiI2RlZmluZSBDT05GSUdfTkFORF9MSU1JVFMgIDEiID4+ICRjb25maWdfaAorZmkKK2VjaG8gIiNkZWZpbmUgUUVNVV9WRVJTSU9OICAgIFwiMC4xMC41MFwiIiA+PiAkY29uZmlnX2gKK2VjaG8gIiNkZWZpbmUgUUVNVV9QS0dWRVJTSU9OIFwiQW5kcm9pZFwiIiA+PiAkY29uZmlnX2gKK0JTRD0KK2Nhc2UgIiRIT1NUX09TIiBpbgorICAgIGxpbnV4KSBDT05GSUdfT1M9TElOVVgKKyAgICA7OworICAgIGRhcndpbikgQ09ORklHX09TPURBUldJTgorICAgICAgICAgICAgQlNEPTEKKyAgICA7OworICAgIGZyZWVic2QpIENPTkZJR19PUz1GUkVFQlNECisgICAgICAgICAgICAgQlNEPTEKKyAgICA7OworICAgIHdpbmRvd3MpIENPTkZJR19PUz1XSU4zMgorICAgIDs7CisgICAgKikgQ09ORklHX09TPSRIT1NUX09TCitlc2FjCisKK2Nhc2UgJEhPU1RfT1MgaW4KKyAgICBsaW51eHxkYXJ3aW4pCisgICAgICAgIGVjaG8gIiNkZWZpbmUgQ09ORklHX0lPVkVDIDEiID4+ICRjb25maWdfaAorICAgICAgICA7OworZXNhYworCitlY2hvICIjZGVmaW5lIENPTkZJR18kQ09ORklHX09TICAgMSIgPj4gJGNvbmZpZ19oCitpZiBbICIkQlNEIiBdOyB0aGVuCisgICAgZWNobyAiI2RlZmluZSBDT05GSUdfQlNEICAgICAgIDEiID4+ICRjb25maWdfaAorICAgIGVjaG8gIiNkZWZpbmUgT19MQVJHRUZJTEUgICAgICAwIiA+PiAkY29uZmlnX2gKKyAgICBlY2hvICIjZGVmaW5lIE1BUF9BTk9OWU1PVVMgICAgTUFQX0FOT04iID4+ICRjb25maWdfaAorZmkKKworY2FzZSAiJEhPU1RfT1MiIGluCisgICAgbGludXgpCisgICAgICAgIGVjaG8gIiNkZWZpbmUgQ09ORklHX1NJR05BTEZEICAgICAgIDEiID4+ICRjb25maWdfaAorICAgICAgICA7OworZXNhYworCitlY2hvICIjZGVmaW5lIENPTkZJR19BTkRST0lEICAgICAgIDEiID4+ICRjb25maWdfaAorCitsb2cgIkdlbmVyYXRlICAgOiAkY29uZmlnX2giCisKKyMgR2VuZXJhdGUgdGhlIFFBUEkgaGVhZGVycyBhbmQgc291cmNlcyBmcm9tIHFhcGktc2NoZW1hLmpzb24KKyMgSWRlYWxseSwgdGhpcyB3b3VsZCBiZSBkb25lIGluIG91ciBNYWtlZmlsZXMsIGJ1dCBhcyBmYXIgYXMgSQorIyB1bmRlcnN0YW5kLCB0aGUgcGxhdGZvcm0gYnVpbGQgZG9lc24ndCBzdXBwb3J0IGEgc2luZ2xlIHRvb2wKKyMgdGhhdCBnZW5lcmF0ZXMgc2V2ZXJhbCBzb3VyY2VzIGZpbGVzLCBub3IgdGhlIHN0YW5kYWxvbmUgb25lLgorZXhwb3J0IFBZVEhPTkRPTlRXUklURUJZVEVDT0RFPTEKK0FVVE9HRU5FUkFURURfRElSPSRPVVRfRElSL2J1aWxkL3FlbXUxLXFhcGktYXV0by1nZW5lcmF0ZWQKK1FBUElfU0NIRU1BPSRQUk9HRElSL3FlbXUxL3FhcGktc2NoZW1hLmpzb24KK1FBUElfU0NSSVBUUz0kUFJPR0RJUi9xZW11MS9zY3JpcHRzCitta2RpciAtcCAiJEFVVE9HRU5FUkFURURfRElSIgorcHl0aG9uICRRQVBJX1NDUklQVFMvcWFwaS10eXBlcy5weSBxYXBpLnR5cGVzIC0tb3V0cHV0LWRpcj0kQVVUT0dFTkVSQVRFRF9ESVIgLWIgPCAkUUFQSV9TQ0hFTUEKK3B5dGhvbiAkUUFQSV9TQ1JJUFRTL3FhcGktdmlzaXQucHkgLS1vdXRwdXQtZGlyPSRBVVRPR0VORVJBVEVEX0RJUiAtYiA8ICRRQVBJX1NDSEVNQQorcHl0aG9uICRRQVBJX1NDUklQVFMvcWFwaS1jb21tYW5kcy5weSAtLW91dHB1dC1kaXI9JEFVVE9HRU5FUkFURURfRElSIC1tIDwgJFFBUElfU0NIRU1BCisKK2xvZyAiR2VuZXJhdGUgICA6ICRBVVRPR0VORVJBVEVEX0RJUiIKKworaWYgWyAteiAiJE9QVElPTl9QUkVCVUlMVF9RRU1VMiIgXTsgdGhlbgorICAgIFFFTVUyX0NPTkZJR1VSRT0kUUVNVTJfVE9QX0RJUi9hbmRyb2lkLXFlbXUyLWdsdWUvYnVpbGQvY29uZmlndXJlLnNoCisgICAgaWYgWyAtZiAiJFFFTVUyX0NPTkZJR1VSRSIgXTsgdGhlbgorICAgICAgICBsb2cgIlFFTVUyICAgIDogQ29uZmlndXJpbmcuIgorICAgICAgICAuICIkUUVNVTJfQ09ORklHVVJFIgorICAgIGZpCitmaQorCitjbGVhbl90ZW1wCisKK2VjaG8gIlJlYWR5IHRvIGdvLiBUeXBlICdtYWtlJyB0byBidWlsZCBlbXVsYXRvciIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvZGF0YS9hZHZhbmNlZEZlYXR1cmVzLmluaSBiL2FuZHJvaWQvZGF0YS9hZHZhbmNlZEZlYXR1cmVzLmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlkOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kYXRhL2FkdmFuY2VkRmVhdHVyZXMuaW5pCkBAIC0wLDAgKzEsODIgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkdmFuY2VkIGVtdWxhdG9yIGZlYXR1cmVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEdMUGlwZUNoZWNrc3VtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGb3IgZXZlcnkgR0wgY2FsbCB0aGF0IHRyYW5zZmVycyBiZXR3ZWVuIGhvc3QgYW5kIGd1ZXN0LCBHTFBpcGVDaGVja3N1bSA9IG9uCisjIHdpbGwgY29tcHV0ZSBhIGNoZWNrc3VtIGNvbnNpc3Rpbmcgb2Ygc29tZSBmdW5jdGlvbiBvZiB0aGUgYWN0dWFsIGJpdCB2ZWN0b3IKKyMgY29ycmVzcG9uZGluZyB0byB0aGUgR0wgY29tbWFuZCwgdmVyaWZ5aW5nIHRoYXQgdGhlIHNhbWUgY2hlY2tzdW0gc2hvd3MgdXAKKyMgb24gYm90aCB0aGUgaG9zdCBhbmQgZ3Vlc3QuIFZpb2xhdGlvbnMgb2YgdGhlIGNoZWNrc3VtIChtaXNtYXRjaGVzKSByZXN1bHQKKyMgaW4gYW4gYWJvcnQoKSBhbmQgY3Jhc2ggcmVwb3J0IGJlaW5nIHNlbnQuCisjCisjIEN1cnJlbnRseSwgdGhlIGNoZWNrc3VtIGlzIG1haW5seSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBjb21tYW5kIGl0c2VsZiBhbmQgYWxsCisjIGFycmF5cyBwYXNzZWQgdGhyb3VnaCB0aGUgcGlwZSBhcmUgb2YgcHJvcGVyIGxlbmd0aC4KK0dMUGlwZUNoZWNrc3VtID0gb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgR3JhbGxvY1N5bmMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1vc3QgYXBwcyB0aGF0IGRpc3BsYXkgaW1hZ2VzIGRvIHNvIHRocm91Z2ggT3BlbkdMLCBidXQgdGhlcmUgYXJlIHNvbWUgYXBwcworIyB0aGF0IHdyaXRlIGRpcmVjdGx5IHRvIGdyYWxsb2MgY29sb3IgYnVmZmVycy4gSW4gb3VyIGdvbGRmaXNoLWRyaXZlciBncmFsbG9jCisjIGltcGxlbWVudGF0aW9uLCB3aGljaCByZXByZXNlbnRzIGdyYWxsb2MgY29sb3IgYnVmZmVycyBhcyBob3N0IE9wZW5HTCBjb2xvcgorIyBidWZmZXJzLgorIworIyBGb3IgZXhhbXBsZSwgaW4gdGhlIGNhbWVyYSBhcHAsIHRoZSBlbXVsYXRlZCB3ZWJjYW0gZHJpdmVyIHdpbGwgcHVsbCBmcmFtZXMKKyMgdG8gYSBncmFsbG9jIGNvbG9yIGJ1ZmZlciBkaXJlY3RseSwgYW5kIHRoZW4gaW4gYW5vdGhlciB0aHJlYWQgb3IgcHJvY2VzcywKKyMgdGhlIGNvbG9yIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGNhbWVyYSBmcmFtZSBwcmV2aWV3IGNvdWxkIGJlIHBvc3RlZAorIyBvbnNjcmVlbi4KKyMKKyMgVGhlc2Ugb3BlcmF0aW9ucyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBoYXZlIHRoZWlyIG9yZGVyIHByZXNlcnZlZCB3aGVuIGFycml2aW5nCisjIGZyb20gdGhlIGd1ZXN0LCBhbmQgaWYgZXhlY3V0ZWQgb24gdGhlIGhvc3QgaW4gdGhlIHdyb25nIG9yZGVyLCB3ZSBjb3VsZAorIyBlbmQgdXAgd2l0aCBvdXQgb2Ygb3JkZXIgd2ViY2FtIGZyYW1lcywgZm9yIGluc3RhbmNlLgorIworIyBHcmFsbG9jU3luYyA9IG9uIGFkZHMgc3luY2hyb25pemF0aW9uIHRvIHRoZSBob3N0IGZvciB0aGlzIHVzZSBjYXNlIHdoZXJlIGFwcHMKKyMgZGlyZWN0bHkgd3JpdGUgdG8gZ3JhbGxvYyBjb2xvciBidWZmZXJzIGFuZCB0aGVuIHBvc3QgdGhlbS4KKyMgR3JhbGxvYyBzeW5jIGRpc2FibGVkIGZvciBub3cgYmVjYXVzZSBpdCBpcyBtYWtpbmcgQ1RTIHNhZC4KK0dyYWxsb2NTeW5jID0gb2ZmCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEdMQXN5bmNTd2FwLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPcGVuR0wgYXBwcyBpbiB0aGUgZ3Vlc3QgcHJlc2VudCB0aGVpciBjb250ZW50cyBpbmRpcmVjdGx5IHRocm91Z2gKKyMgU3VyZmFjZUZsaW5nZXIuIFRoZSBnb2xkZmlzaCBkcml2ZXIncyBpbXBsZW1lbnRhdGlvbiBvZiBlZ2xTd2FwQnVmZmVycyBpcworIyBiYXNlZCBvbiBxdWV1aW5nIHRoZSBmaW5pc2hlZCBmcmFtZSAoYnVmZmVyKSB0byBTdXJmYWNlRmxpbmdlci4KKyMgU3VyZmFjZUZsaW5nZXIgdGhlbiBhY3F1aXJlcyB0aGF0IGZpbmlzaGVkIGJ1ZmZlciBmcm9tIHRoZSBPcGVuR0wgYXBwLAorIyBkb2VzIHRoZSBhY3R1YWwgcG9zdGluZyB0byB0aGUgZGlzcGxheSAod2hpY2ggbWF5IGludm9sdmUgYSBjYWxsIGluIHR1cm4KKyMgdG8gZWdsU3dhcEJ1ZmZlcnMsIGVzcC4gaWYgd2UgYXJlIG5vdCB1c2luZyBoYXJkd2FyZSBjb21wb3NlciksCisjIGFuZCByZWxlYXNlcyB0aGUgYnVmZmVyLCBhbGxvd2luZyB0aGUgT3BlbkdMIGFwcCB0byBkZXF1ZXVlIGEgZnJlc2gKKyMgYnVmZmVyIGZvciB3aGF0ZXZlciB0byBkcmF3IG5leHQuCisjCisjIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiB3ZSBhcmUgdXNpbmcgaG9zdCBHUFUsIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQgIworIyBpbiB0aGUgaG9zdCBub3QgdGhlIGd1ZXN0ICh3aGF0IHRoZSB1c2VyIHNlZXMgaXMgbm90IGR1ZSB0byBhbnkgY29uY3JldGUKKyMgYWN0aW9uIGluc2lkZSB0aGUgZ3Vlc3QsIGJ1dCBkdWUgdG8gdGhlIGhvc3QgR1BVIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgaG9zdAorIyBkaXNwbGF5KSwgc28gaXQncyBub3QgYWx3YXlzIGNsZWFyIHdoYXQgYSAiZmluaXNoZWQgZnJhbWUiIG1lYW5zLiBJbgorIyBwYXJ0aWN1bGFyLCB0aGUgZnJhbWUgaXMgbm90IG5lY2Vzc2FyaWx5IGZpbmlzaGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBxdWV1ZWQKKyMgaW4gdGhlIGd1ZXN0LCBkZXBlbmRpbmcgb24gaG9zdCBkcml2ZXIgcXVpcmtzLiBTbywgcG9zdGluZyB1bmZpbmlzaGVkIG9yCisjIGV2ZW4gb2xkZXIgYnVmZmVycyB0byBTdXJmYWNlRmxpbmdlciB3aWxsIHJlc3VsdCBpbiBvdXQgb2Ygb3JkZXIgZnJhbWVzLgorIworIyBHTEFzeW5jU3dhcCA9IG9mZiBwcmV0ZW5kcyB0aGlzIGlzc3VlIGRvZXNuJ3QgZXhpc3QgYW5kIGl0J3MgdXAgdG8gdGhlIGhvc3QKKyMgZHJpdmVyIHRvIHByb3Blcmx5IHN5bmNocm9uaXplIHVwb24gY2FsbGluZyByY0ZsdXNoV2luZG93Q29sb3JCdWZmZXIuCisjIEdMQXN5bmNTd2FwID0gb24gdXNlcyB0aGUgaG9zdCBHTCBkcml2ZXIncyBmZW5jZSBjb21tYW5kcyBhbmQgZmVuY2UgZmQncyBpbgorIyB0aGUgZ3Vlc3QgaW4gb3JkZXIgdG8gaGF2ZSBleHBsaWNpdCBzaWduYWxzIG9mIGJ1ZmZlciBzd2FwcyBjb21wbGV0ZS4gVGhpcworIyBwcmVzZXJ2ZXMgZnJhbWUgb3JkZXJpbmcgYXQgYSBzbGlnaHQgcGVyZm9ybWFuY2UgY29zdCwgYnV0IHRoZSBjb3N0IGlzIGxlc3MKKyMgdGhhbiB0aGF0IG9mIG90aGVyIHNvbHV0aW9ucyBsaWtlIGNhbGxpbmcgZ2xGaW5pc2goKSBvbiB0aGUgaG9zdC4KK0dMQXN5bmNTd2FwID0gb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgRW5jcnlwdFVzZXJEYXRhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENUUyByZXF1aXJlcyB0aGF0IHVzZXJkYXRhIGJlIGVuY3J5cHRlZCwgYXQgbGVhc3QgZm9yIGFwaTIzIGFuZCBsYXRlci4gSG93ZXZlcgorIyBmb3Igbm9uIEdvb2dsZSBpbWFnZXMgb3Igb2xkZXIgc3lzdGVtIGltYWdlcywgdGhpcyBpcyBub3QgcmVxdWlyZWQgb3Igbm90CisjIGltcGxlbXRlZC4gRW11bGF0b3Igd2lsbCBlbmFibGUgdGhpcyBmZWF0dXJlIG9ubHkgaWYgdGhlIHN5c3RlbSBzYXlzIGl0IHN1cHBvcnRzCisjIGVuY3J5cHRpb24uIEl0IGlzIG9uIGJ5IGRlZmF1bHQgb24gdGhlIGhvc3QsIGFuZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcnVsZSwKKyMgYSBmZWF0dXJlIGlzIG9ubHkgb24gaWYgYm90aCBob3N0IGFuZCBndWVzdCBzdXBwb3J0IGl0OyBzbyBpdCBlZmZlY3RpdmVseSBsZWF2ZXMKKyMgdG8gZ3Vlc3QgdG8gZGVjaWRlLgorRW5jcnlwdFVzZXJEYXRhID0gb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSW50ZWxQZXJmb3JtYW5jZU1vbml0b3JpbmdVbml0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNvbWUgQ1RTIHRlc3RzIChtYWlubHkgU2ltcGxlUGVyZikgcmVxdWlyZSB0aGF0IHRoZSBDUFUgZXhwb3NlIHNvbWUga2luZCBvZgorIyBjb3VudGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgQ1BVIHBlcmZvcm1hbmNlIGluIGN5Y2xlcywKKyMgY2FjaGUgaGl0L21pc3MsIGV0Yy4KKyMgSG93ZXZlciwgdGhlIHVzZSBvZiB0aGlzIG9uIHRoZSB2Q1BVIHJlcXVpcmVzIHRoYXQgdGhlIGd1ZXN0IGtlcm5lbCBiZSBpbgorIyBhIGZhaXJseSByZWNlbnQgc3RhdGUsIG90aGVyd2lzZSB0aGUgZW11bGF0b3Igd2lsbCBrZXJuZWwgcGFuaWMgb24gc3RhcnR1cC4KK0ludGVsUGVyZm9ybWFuY2VNb25pdG9yaW5nVW5pdCA9IG9uCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kYXRhL2NhLWJ1bmRsZS5wZW0gYi9hbmRyb2lkL2RhdGEvY2EtYnVuZGxlLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTlhNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kYXRhL2NhLWJ1bmRsZS5wZW0KQEAgLTAsMCArMSwzOTg4IEBACisjIworIyMgQnVuZGxlIG9mIENBIFJvb3QgQ2VydGlmaWNhdGVzCisjIworIyMgQ2VydGlmaWNhdGUgZGF0YSBmcm9tIE1vemlsbGEgYXMgb2Y6IE1vbiBBcHIgMjcgMDg6NTg6MDQgMjAxNQorIyMKKyMjIFRoaXMgaXMgYSBidW5kbGUgb2YgWC41MDkgY2VydGlmaWNhdGVzIG9mIHB1YmxpYyBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcworIyMgKENBKS4gVGhlc2Ugd2VyZSBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByb290IGNlcnRpZmljYXRlcworIyMgZmlsZSAoY2VydGRhdGEudHh0KS4gIFRoaXMgZmlsZSBjYW4gYmUgZm91bmQgaW4gdGhlIG1vemlsbGEgc291cmNlIHRyZWU6CisjIyBodHRwOi8vaGcubW96aWxsYS5vcmcvcmVsZWFzZXMvbW96aWxsYS1yZWxlYXNlL3Jhdy1maWxlL2RlZmF1bHQvc2VjdXJpdHkvbnNzL2xpYi9ja2Z3L2J1aWx0aW5zL2NlcnRkYXRhLnR4dAorIyMKKyMjIEl0IGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdCBhbmQgdGhlcmVmb3JlCisjIyBjYW4gYmUgZGlyZWN0bHkgdXNlZCB3aXRoIGN1cmwgLyBsaWJjdXJsIC8gcGhwX2N1cmwsIG9yIHdpdGgKKyMjIGFuIEFwYWNoZSttb2Rfc3NsIHdlYnNlcnZlciBmb3IgU1NMIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KKyMjIEp1c3QgY29uZmlndXJlIHRoaXMgZmlsZSBhcyB0aGUgU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUuCisjIworIyMgQ29udmVyc2lvbiBkb25lIHdpdGggbWstY2EtYnVuZGxlLnBsIHZlcnNpb24gMS4yNS4KKyMjIFNIQTE6IGVkM2MwYmJmYjc5MTJiY2MwMGNkMjAzM2IwY2I4NWM5OGQxMDU1OWMKKyMjCisKKworRXF1aWZheCBTZWN1cmUgQ0EKKz09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURJRENDQW9tZ0F3SUJBZ0lFTmQ3MHp6QU5CZ2txaGtpRzl3MEJBUVVGQURCT01Rc3dDUVlEVlFRR0V3SlZVekVRTUE0R0ExVUUKK0NoTUhSWEYxYVdaaGVERXRNQ3NHQTFVRUN4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjUKK01CNFhEVGs0TURneU1qRTJOREUxTVZvWERURTRNRGd5TWpFMk5ERTFNVm93VGpFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBb1QKK0IwVnhkV2xtWVhneExUQXJCZ05WQkFzVEpFVnhkV2xtWVhnZ1UyVmpkWEpsSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVUQ0IKK256QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXdWMnhXR2NJWXU2Z21pMGZDRzJSRkdpWUNoNysyZ1J2RTRSaUljUFIKK2ZNNmZCZUM0QWZCT05PemlpcFVFWkt6eGExTmZCYlBMWjRDL1FnS08vdDBCQ2V6aEFCUlAvUHZ3RE4xRHVsc3I0UitBY0prVlY1TVcKKzhRK1hhcmZDYUNNY3pFMVpNS3hSSGp1dks5YnVZMFY3eGRsZlVOTGpVQTg2aU9lL0ZQM2d4N2tDQXdFQUFhT0NBUWt3Z2dFRk1IQUcKK0ExVWRId1JwTUdjd1phQmpvR0drWHpCZE1Rc3dDUVlEVlFRR0V3SlZVekVRTUE0R0ExVUVDaE1IUlhGMWFXWmhlREV0TUNzR0ExVUUKK0N4TWtSWEYxYVdaaGVDQlRaV04xY21VZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNUTB3Q3dZRFZRUURFd1JEVWt3eE1Cb0cKK0ExVWRFQVFUTUJHQkR6SXdNVGd3T0RJeU1UWTBNVFV4V2pBTEJnTlZIUThFQkFNQ0FRWXdId1lEVlIwakJCZ3dGb0FVU09abytTdlMKK3NwWFhSOWdqSUJCUE01aVFuOVF3SFFZRFZSME9CQllFRkVqbWFQa3IwcktWMTBmWUl5QVFUek9Za0ovVU1Bd0dBMVVkRXdRRk1BTUIKK0FmOHdHZ1lKS29aSWh2WjlCMEVBQkEwd0N4c0ZWak11TUdNREFnYkFNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBRmpPS2VyODk5NjEKK3pnSzVGN1dGMGJuajRKWE1KVEVOQUthU2JuKzJrbU9lVUpYUm1tL2tFZDVqaFc2WTdxai9Xc2pUVmJKbWNWZmV3Q0hyUFNxbkkwa0IKK0JJWkNlL3p1ZjZJV1VyVm5aOU5BMnpzbVdMSW9kejJ1RkhkaDF2b3FaaWVnRGZxbmMxenFjUEdVSVdWRVgvcjg3eWxvcWFLSGVlOTUKKzcwK3NCM2M0CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dsb2JhbFNpZ24gUm9vdCBDQQorPT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURkVENDQWwyZ0F3SUJBZ0lMQkFBQUFBQUJGVXRhdzVRd0RRWUpLb1pJaHZjTkFRRUZCUUF3VnpFTE1Ba0dBMVVFQmhNQ1FrVXgKK0dUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHMKK2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MDVPREE1TURFeE1qQXdNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlYKK0JBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWlZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWUQKK1ZRUURFeEpIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGEKK0R1YVpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZweHkwU3k2c2MKK1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUzhwRjk0RzNWTlRDT1hrTno4a0hwMVdyanNvazZWams0YndZOGlHbGIKK0trM0ZwMVM0YkluTW0vazh5dVg5aWZVU1BKSjRsdGJjZEc2VFJHSFJqY2RHc25VT2h1Z1ppdFZ0Yk5WNEZwV2k2Y2dLT092eUpCTlAKK2MxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKVTI2UXpuczNkTGx3UjVFaVVXTVdlYTZ4cmtFbUNNZ1pLOUZHcWtqV1pDclgKK2d6VC9MQ3JCYkJsRFNnZUY1OU44OWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKK0hSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJnZTJZYVJRMlh5b2xRTDMwRXpUU28vL3o5U3pBTkJna3Foa2lHOXcwQkFRVUYKK0FBT0NBUUVBMW5QbmZFOTIwSTIvN0xxaXZqVEZLREsxZlB4c25Dd3J2UW1lVTc5clhxb1JTTGJsQ0tPenlqMWhUZE5HQ2JNK3c2RGoKK1kxVWI4cnJ2clRuaFE3azRvK1l2aWlZNzc2QlFWdm5HQ3YwNHpjUUxjRkdVbDVnRTM4TmZsTlVWeVJSQm5NUmRkV1FWRGY5Vk1PeUcKK2ovOE43eXk1WTBiMnF2emZ2R245TGhKSVpKcmdsZkNtN3ltUEFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEgKK2htNHF4Rll4bGRCbmlZVXIrV3ltWFVhZERLcUM1SmxSM1hDMzIxWTlZZVJxNFZ6Vzl2NDkza0hNQjY1alVyOVRVL1FyNmNmOXR2ZUMKK1g0WFNRUmpiZ2JNRUhNVWZwSUJ2RlNESjNneUlDaDNXWmxYaS9FakpLU1pwNEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMgorPT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHVqQ0NBcUtnQXdJQkFnSUxCQUFBQUFBQkQ0WW01ZzB3RFFZSktvWklodmNOQVFFRkJRQXdUREVnTUI0R0ExVUVDeE1YUjJ4dgorWW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzYjJKaAorYkZOcFoyNHdIaGNOTURZeE1qRTFNRGd3TURBd1doY05NakV4TWpFMU1EZ3dNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VAorYVdkdUlGSnZiM1FnUTBFZ0xTQlNNakVUTUJFR0ExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbgorYmpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2JQSkE2K0xtOG9tVVZDeEtzK0lWU2JDOU4vaEhENgorRXJQTHY0ZGZ4bitHMDdJd1hOYjlyZkY3M09YNFlKWUpraEQxMEZQZSszdCtjNGlzVW9oN1NxYktTYVplcUtlTVdoRzhlb0xydm96cAorczZ5V0pRZVhTcGtxQnkrMEhuZS9pZysxQW53YmxyakZ1VG9zdk5ZU3VldFpmZUxRQm9aZlhrbHF0VGxlaURUc3ZIZ01DSmlFYktqTgorUzdTZ2ZReDVUZkM0TGNzaHl0VnNXMzNob0NtRW9mblRsRW5MSkdLUklMemRDOVhaelBucUp3b3JjNUhHblJ1c3lNdm80S0QwTDVDTAorVGZ1d05odjJHWHFGNEczeVlST0lYSi9na3dwUmw0cGF6cStyMWZlcUNhcGd2ZHpaWDk5eXFXQVRYZ0FCeVVyNlA2VHFCd01oQW82QworeWdQQ200OENBd0VBQWFPQm5EQ0JtVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RQorRmdRVW0rSUhWMmNjSHNCcUJ0NVp0Sm90Mzl3WmhpNHdOZ1lEVlIwZkJDOHdMVEFyb0NtZ0o0WWxhSFIwY0RvdkwyTnliQzVuYkc5aQorWVd4emFXZHVMbTVsZEM5eWIyOTBMWEl5TG1OeWJEQWZCZ05WSFNNRUdEQVdnQlNiNGdkWFp4d2V3R29HM2xtMG1pM2YzQm1HTGpBTgorQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBbVlGVGh4eG9sNGFSN09CS3VFUUxxNEdzSjAvV3diZ2NRM2l6REpyODZpdzhibUViVFVzcAorOVo4RkhTYkJ1T21EQUdKRnRxa0lrN21wTTBzWW1zTDRoNGhPMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdQorMDF5aVBxRmJRZlhmNVdSRExlblZPYXZTb3QrM2k5REFnQmtjUmNBdGpPajRMYVIwVmtuRkJiVlBGZDV1UkhnNWg2aCt1L041R0pHNworOUcrZHdmQ01OWXhkQWZ2RGJibnZSRzE1UmpGK0N2NnBnc0gvNzZ0dUlNUlF5VitkVFpzWGpBemxBY21nUVdwelUvcWxVTFJ1SlEvNworVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3Q1FZRFZRUUdFd0pWCitVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2CitjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCitJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oCitkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3CitDUVlEVlFRR0V3SlZVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5CitkWE4wSUU1bGRIZHZjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXhPVGs1SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2CitjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdUlFTnNZWE56SURNZ1VIVmliR2xqSUZCeWFXMWhjbmtnCitRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCitnZ0VCQU11Nm5GTDhlQjhhSG04Yk4zTzkrTWxybEJJd1QvQTJSL1hRa1FyMUY4aWxZY0VXUUUzN2ltR1E1WFlnd1JFR2Zhc3NicWIxCitFVUdPK2kydEttRlpwR2NtVE5Eb3ZGSmJjQ0FFV05GNnlhUnB2SU1YWkswRmk3elFXTTZOalBYcjhFSkpDNTJYSjJjeWJ1R3VreFVjCitjTHdnVFM4WTNwS0k2R3lGVnhFYTZYN2pKaEZVb2tXV1ZZUEtNSW5vM05pajdTcUFQMzk1WlZjK0ZTQm1DQytWazcrcVJ5K29ScGZ3CitFdUwrd2dvclVlWjI1cmRHdCtJTnBzeW93MHhaVllubTZGTmNIT3FkOEdJV0M2ZkpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqCiswNTVpTjlXRlpaNE81bE1rZEJ0ZUhSSlRXOGNzNTROSk94V3VpbWk1VjVjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBCitFUlNXd2F1U0NQYy9MOG15L3VSYW4yVGUyeUZQaHBrMGRqWlgzZEFWTDhXdGZ4VWZOMkp6UHRUblg4NFhBOXMxK2l2YnJtQUpYeDVmCitqMjY3Q3ozcVdoTWVER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCisvWTR3anlsR3NCNDlOZG80WWhZWVNxM210bEZzM3E5aTZ3SFFIaVQrZW84U0doSm91UHRtbVJRVVJWeXU1NjVwRjRFcldqZkpYaXIwCit4dUtoWEZTYnBsUUF6L0R4d2NlWU1CbzdOaGJibzI3cS9hMnl3dHJ2QWtjVGlzRHhzekd0VHh6aFQ1eXZEd3lkOTNnTjJQUTFWb0RhCit0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1ZlcmlzaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVHakNDQXdJQ0VRRHNvS2VMYm5WcUFjL0VmTXd2bEY3WE1BMEdDU3FHU0liM0RRRUJCUVVBTUlIS01Rc3dDUVlEVlFRR0V3SlYKK1V6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnlkWE4wSUU1bGRIZHYKK2Ntc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmwKK0lHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmgKK2RHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16QWVGdzA1T1RFd01ERXdNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUlIS01Rc3cKK0NRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUYVdkdUlGUnkKK2RYTjBJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeE9UazVJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHYKK2NtbDZaV1FnZFhObElHOXViSGt4UlRCREJnTlZCQU1UUEZabGNtbFRhV2R1SUVOc1lYTnpJRFFnVUhWaWJHbGpJRkJ5YVcxaGNua2cKK1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnTFNCSE16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKK2dnRUJBSzNMcFJGcHhsbXI4WSsxR1E5V3pzeTFIeURrbmlZbFMrQnpaWWxaM3RDRDVQVVB0YnV0OFh6b0lmems2QXp1ZkVVaUdYYVMKK3RCTzNJRnNKK21HdXFQS2xqWVhDS3RiZVpqYlNtd0wwcUpKZ2ZKeHB0SThrSHRDR1V2WXluRUZZSGlLOXpVVmlsUWh1MEdiZFU2TE0KKzhCRGNWSE9MQktGR016TmNGMEM1bmszVDg3NVZnK2l4aVk1YWZKcVdJcEE3aUNYeTBsT0lBZ3dMZVBMbU54ZExNRVlINUlCdHB0aVcKK0x1Z3MrQkd6T0ExbXBwdnF5U05iMjQ3aTh4T09HbGt0cWdMdzdLU0hadHpCUC9YWXVmVHNnc2JTUFpVZDVjQlBoTW5abzBRb0JtclgKK1JhendhMnJ2VGwvNEVZSWVPR00wWmxEVVBwTnorakREWnEzL2t5Mlg3d01DQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKK2ovb2xhMDliNUtST0oxV3JJaFZaUE1xMUN0UksyNnZkb1Y5VHhhQlhPY0xPUnl1K09zaFd2OExaSnhBNnNRVTh3SGN4dXpyVEJYdHQKK21od3dqSURMazVNcWc2c0ZVWUlDQUJGbmEvT0lZVWRmQTVQVld3M2c4ZFNoTWpXRnNqcmJzSUtyMGNzS3ZFK01XOFZMQURzZktvS20KK2ZqYUYzSDQ4WndDMTVEdFM0S2pyWFJYNXhtM3dyUjBPaGJlcG1uTVVXbHVQUVNqQTFlZ3RUYVJlemFyWjdjN2MyTlU4UWgwWHdSSmQKK1JUakRPUFA4aFM2RFJraXkxeUJma2phUDUza1BtRjZaNlBEUXBMdjFVNzBxemxtd3IyNS9iTHZTSGdDd0llMzRRV0tDdWRpeXhMdEcKK1VQTXh4WThCcUhUcjlYZ24ydWYzWmtQem5vTStJS3JETldDUnpnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRW50cnVzdC5uZXQgUHJlbWl1bSAyMDQ4IFNlY3VyZSBTZXJ2ZXIgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVLakNDQXhLZ0F3SUJBZ0lFT0dQZStEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnRERVVNQklHQTFVRUNoTUxSVzUwY25WemRDNXUKK1pYUXhRREErQmdOVkJBc1VOM2QzZHk1bGJuUnlkWE4wTG01bGRDOURVRk5mTWpBME9DQnBibU52Y25BdUlHSjVJSEpsWmk0Z0tHeHAKK2JXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazVJRVZ1ZEhKMWMzUXVibVYwSUV4cGJXbDBaV1F4TXpBeEJnTlYKK0JBTVRLa1Z1ZEhKMWMzUXVibVYwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQ2d5TURRNEtUQWVGdzA1T1RFeU1qUXgKK056VXdOVEZhRncweU9UQTNNalF4TkRFMU1USmFNSUcwTVJRd0VnWURWUVFLRXd0RmJuUnlkWE4wTG01bGRERkFNRDRHQTFVRUN4UTMKK2QzZDNMbVZ1ZEhKMWMzUXVibVYwTDBOUVUxOHlNRFE0SUdsdVkyOXljQzRnWW5rZ2NtVm1MaUFvYkdsdGFYUnpJR3hwWVdJdUtURWwKK01DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHQTFVRUF4TXFSVzUwY25WemRDNXUKK1pYUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0tESXdORGdwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKK01JSUJDZ0tDQVFFQXJVMUxxUktHc3VxaklBY1ZGbVFxSzB2UnZ3dEtUWTd0Z0hhbFo3ZDRRTUJ6UXNob3dOdFRLOTFldUhhWU5aT0wKK0dwMThFem9PSDF1M0hzL2xKQlFlc1lHcGpYMjR6R3RMQS9FQ0ROeXJwVUFrQUg5MGxLR2RDQ216aUF2MWgzZWRWYzNrdzM3WGFtU3IKK2hSU0dsVnVYTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVFhUelcKK25MTFBLUVA1TDZSUXN0Ukl6Z1V5VllyOXNtUk1EdVNZQjNYYmY5KzVDRlZnaFRBcCtYdElwR21HNHpVL0hvWmRlbm9WdmU4QWpoVWkKK1ZCY0FrQ2FUdkE1SmFKRy8rRWZUblpWQ3dRNU4zMjhtejhNWUlXSm1RM0RXMWNBSDRRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEUKK0JBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVVmVTQjBSR0F2dGlKdVFpak1mbWhKQWtXdVhBd0RRWUoKK0tvWklodmNOQVFFRkJRQURnZ0VCQUR1YmoxYWJNT2RUbVh4NmVhZE5sOWNabFpEN0JoL0tNM3hHWTQrV1ppVDZRQnNoSjhybWNuUHkKK1QvNHhtZjNJREV4b1U4YUFnaE9ZK3JhdDJsMDk4YzV1OWhVUmxJSU03aitWcnhHckQ5Y3YzaDhEajFjc0hzbTdtaHBFbGVzWVQ2WWYKK3pYMVhFQytiQkFsYWhMVnUyQjA2NGRhZTBXeDVYbmtjRk1YajBFeVRPMlU4N2Q4OXZxYmxsUnJEdFJuRHZWNWJ1LzhqNzJnWnl4S1QKK0oxd0RMVzh3MEI2MkdxemVXdmZScXFnbnB2NTVnY1I1bVROWHVoS3dxZUJDYkpQS1Z0NytiWVFMQ0l0K2plclhtQ0hHOCtjOGVTOWUKK25ORk1GWTNoN0NJM3pKcERDNWZjZ0pDTnMyZWJiMGdJRlZiUHYvRXJmRjZhZHVsWmtNVjhnelVSWlZFPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290Cis9PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURkekNDQWwrZ0F3SUJBZ0lFQWdBQXVUQU5CZ2txaGtpRzl3MEJBUVVGQURCYU1Rc3dDUVlEVlFRR0V3SkpSVEVTTUJBR0ExVUUKK0NoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWURWUVFERXhsQ1lXeDBhVzF2Y21VZ1EzbGkKK1pYSlVjblZ6ZENCU2IyOTBNQjRYRFRBd01EVXhNakU0TkRZd01Gb1hEVEkxTURVeE1qSXpOVGt3TUZvd1dqRUxNQWtHQTFVRUJoTUMKK1NVVXhFakFRQmdOVkJBb1RDVUpoYkhScGJXOXlaVEVUTUJFR0ExVUVDeE1LUTNsaVpYSlVjblZ6ZERFaU1DQUdBMVVFQXhNWlFtRnMKK2RHbHRiM0psSUVONVltVnlWSEoxYzNRZ1VtOXZkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLTUUKK3V5S3JtRDFYNkNaeW1yVjUxQ25pNGVpVmdMR3c0MXVPS3ltYVpOK2hYZTJ3Q1FWdDJ5Z3V6bUtpWXY2MGlOb1M2empySVozQVFTc0IKK1VudUlkOU1jajhlNnVZaTFhZ25uYytnUlFLZlJ6TXBpalMzbGp3dW1VTktvVU1NbzZ2V3JKWWVLbXBZY3FXZTRQd3pWOS9sU0V5L0MKK0c5VndjUENQd0JMS0JzdWE0ZG5LTTNwMzF2anN1ZkZvUkVKSUU5TEF3cVN1WG1EK3RxWUYvTFRkQjFrQzFGa1ltR1AxcFdQZ2tBeDkKK1hiSUdldk9GNnV2VUE2NWVoRDVmL3hYdGFiejVPVFp5ZGM5M1VrM3p5WkFzdVQzbHlTTlRQeDhrbUNGY0I1a3B2Y1k2N09kdWhqcHIKK2wzUmpNNzFvR0RId2VJMTJ2L3llamwwcWhxZE5rTnduR2prQ0F3RUFBYU5GTUVNd0hRWURWUjBPQkJZRUZPV2RXVENDUjFqTXJQb0kKK1ZEYUdlenExQkUzd01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRTXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUIKK0JRVUFBNElCQVFDRkRGMk81RzlSYUVJRm9OMjdUeWNsaEFPOTkyVDlMZGN3NDZRUUYrdmFLU20yZVQ5Mjloa1RJN2dRQ3ZsWXBOUmgKK2NMMEVZV29TaWhmVkNyM0Z2REI4MXVrTUpZMkdRRS9zektOK09NWTNFVS90M1dneGprelNzd0YwN3I1MVhnZElHbjl3L3haY2hNQjUKK2hiZ0YvWCsrWlJHakQ4QUN0UGhTTnprRTFha3hlaGkvb0NyMEVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2EKK1k3MWs1aCszenZEeW55NjdHN2Z5VUloemtzTGk0eGFObWpJQ3E0NFkzZWtRRWU1K05hdVFyejR3bEhyUU16Mm5aUS8xL0k2ZVlzOUgKK1JDd0JYYnNkdFRMU1I5STRMdEQrZ2R3eWFoNjE3anpWL09lQkhSbkRKRUxxWXptcAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBZGRUcnVzdCBMb3ctVmFsdWUgU2VydmljZXMgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUdEQ0NBd0NnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmxNUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTAorUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVQorY25WemRDQkRiR0Z6Y3lBeElFTkJJRkp2YjNRd0hoY05NREF3TlRNd01UQXpPRE14V2hjTk1qQXdOVE13TVRBek9ETXhXakJsTVFzdworQ1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhIVEFiQmdOVkJBc1RGRUZrWkZSeWRYTjBJRlJVVUNCTworWlhSM2IzSnJNU0V3SHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgorQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNXbHRRaFNXRGlhK2hCQnd6ZXhPRGNFeVBOd1RYSCs5Wk9FUXBuWHZVR1cydWxDRHRiS1JZNgorNTRleU5BYkZ2QVdsQTN5Q3l5a1FydUdJZ2IzV250UCtMVmJCRmM3akpwMFZMaEQ3Qm84d0JONm50R08wLzdHY3JqeXZkN1pXeGJXcgorb3VscE9qME9NM2t5UDNDQ2twbGhiWTB3Q0k5eFA2WklWeG40SmR4TFpseWxkSStZcnNqNXdBWWk1Nnh6MzZVdSsxTGNzUlZsSVBvMQorWm1uZTN5enhicnd3Mnl3a0V0dnJOVFZva01zQXNKY2hQWFFoSTJVMEs3dDRXYVBXNFhZNW1xUkpqb3gwcjI2a21xUFptOUk0WEp1aQorR014MUk0Uys2K0pOTTNHT0d2REMrTWNkb3EwRGx5ejR6eVhHOXJna01iRmpYWkovWS9BbHlWTXVINzlOQWdNQkFBR2pnZEl3Z2M4dworSFFZRFZSME9CQllFRkpXeHRQQ1V0cjNIMnRFUkNTRyt3YTlKL1JCN01Bc0dBMVVkRHdRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBRAorQVFIL01JR1BCZ05WSFNNRWdZY3dnWVNBRkpXeHRQQ1V0cjNIMnRFUkNTRyt3YTlKL1JCN29XbWtaekJsTVFzd0NRWURWUVFHRXdKVAorUlRFVU1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhIVEFiQmdOVkJBc1RGRUZrWkZSeWRYTjBJRlJVVUNCT1pYUjNiM0pyTVNFdworSHdZRFZRUURFeGhCWkdSVWNuVnpkQ0JEYkdGemN5QXhJRU5CSUZKdmIzU0NBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUN4dAorWkJzZnpRM2R1UUg2bG1NME1raEhtYTZYN2YxeUZxWnpSMXIwNjkzcDlkYjdSY3dwaVVSZHYwWTVQZWp1dkUxVWhoNGRiT01YSjBQaAoraVZZcnFXOXlUa2t6NDNKOEtpT2F2RDcvS0NydG8vOGNJN3BEVndsblRVdGlCaTM0LzJ5ZFlCN1lIRXQ5dFRFdjJkQjhYZmplYTRNWQorZURkWEwrZ3pCMmZmSHNkcktwVjJybzlYby9EMFVyU3BVd2pQNEUvVGVsT0wvYnNjVmpieS9ySzI1WGE3MVNKbHB6LyswV2F0Qzd4cgorbVlidlAzM3pHRExLZThianEyUkdsZmdtYWRsVmczc3NsZ2YvV1N4RW84Ymw2YW5jb1dPQVdpRmVJYzlUVlBDNmI0bmJxS3FWejR2agorY2N3ZUd5QkVDTUI2dGtEOXhPUTE0UjBXSE5DOEs0N1djZGs9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0FkZFRydXN0IEV4dGVybmFsIFJvb3QKKz09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU5qQ0NBeDZnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnZNUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTAorUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRAorVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aGJDQkRRU0JTYjI5ME1CNFhEVEF3TURVek1ERXdORGd6T0ZvWERUSXdNRFV6TURFdworTkRnek9Gb3diekVMTUFrR0ExVUVCaE1DVTBVeEZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNU1l3SkFZRFZRUUxFeDFCWkdSVQorY25WemRDQkZlSFJsY201aGJDQlVWRkFnVG1WMGQyOXlhekVpTUNBR0ExVUVBeE1aUVdSa1ZISjFjM1FnUlhoMFpYSnVZV3dnUTBFZworVW05dmREQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxmM0dqUG04Z0FFTFRuZ1RsdnRIN3hzRDgyMQorK2lPMnp0NmJFVE9YcENsTWZaT2Z2VXE4ayswREd1T1B6K1Z0VUZyV2x5bVVXb0N3U1hyYkxwWDl1TXEvTnpndEhqNlJRYTF3VnNmdworVHovb01wNTB5c2lRVk9uR1h3OTRuWnBBUEE2c1lhcGVGSStlaDZGcVVOelhtazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tbworYVNZWWtLdE1zRThqcXpwUGhOamZ6cC9oYVcrNzEwTFhhMFRreDYzdWJVRmZjbHB4Q0RlemVXV2tXYUNVTi9jQUx3M0NrbkxhMERoeQorMnhTb1JjUmRLbjIzdE5iRTdxek5FMFMzeVN2ZFF3QWwrbUc1YVdwWUl4RzNwek9QVm5WWjljMHAxMGEzQ2l0bHR0TkNieFd5dUh2NworNytsZFU5VTBXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEVlIwUAorQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdnWmtHQTFVZEl3U0JrVENCam9BVXJiMlllalMwSnZmNnhDWlU3d085NENUTAorVkJxaGM2UnhNRzh4Q3pBSkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVY25WemRDQkJRakVtTUNRR0ExVUVDeE1kUVdSaworVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4SWpBZ0JnTlZCQU1UR1VGa1pGUnlkWE4wSUVWNGRHVnlibUZzSUVOQgorSUZKdmIzU0NBUUV3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUxDYjRJVWx3dFlqNGcrV0JwS2RRWmljMllSNWdka2VXeFFISXpabAorajdEWWQ3dXNRV3hIWUlOUnNQa3lQZWY4OWlZVHg0QVdwYjlhL0lmUGVIbUpJWnJpVEFjS2hqVzg4dDVSeE5LV3Q5eCtUdTV3L1J3NQorNnd3Q1VSUXRqcjBXNE1IZlJuWG5KSzNzOUVLMGhaTndFR2U2blFZMVNoalRLM3JNVVVLaGVtUFI1cnVoeFN2Q05yNFREZWE5WTM1NQorZTZjSkRVQ3JhdDJQaXNQMjlvd2FRZ1ZSMUVYMW42ZGlJV2dWSUVNOG1lZDh2U1RZcVpFWGM0Zy9WaHN4T0JpMGNRK2F6Y2dPbm80dQorRytHTW1JUExIekh4UkV6R0JITkpkbUFQeC9pOUY0QnJMdW5NVEE1YW1ua1BJQW91MVo1akpoNVZrcFRZZ2hkYWU5Qzh4NDlPaGdRPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBZGRUcnVzdCBQdWJsaWMgU2VydmljZXMgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUZUQ0NBdjJnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmtNUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTAorUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU0F3SGdZRFZRUURFeGRCWkdSVQorY25WemRDQlFkV0pzYVdNZ1EwRWdVbTl2ZERBZUZ3MHdNREExTXpBeE1EUXhOVEJhRncweU1EQTFNekF4TURReE5UQmFNR1F4Q3pBSgorQmdOVkJBWVRBbE5GTVJRd0VnWURWUVFLRXd0QlpHUlVjblZ6ZENCQlFqRWRNQnNHQTFVRUN4TVVRV1JrVkhKMWMzUWdWRlJRSUU1bAorZEhkdmNtc3hJREFlQmdOVkJBTVRGMEZrWkZSeWRYTjBJRkIxWW14cFl5QkRRU0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgorQUFPQ0FROEFNSUlCQ2dLQ0FRRUE2Um93ajRPSUZNRWcyRHlianh0K0EzUzcybW5UUnFYNGpzSU1FWkJScFM5bVZFQlY2dHNmU2xidQorbnlOdTlEbkxvYmx2OG43NVhZY21ZWjRjK09Mc3BvSDRJY1VrekJFTVA5c21jbnJIQVpjSEYvblhHQ3d3ZlE1NkhtSWV4a3ZBL1gxaQorZDlORUhpZjJQMHRFczdjNDJUa2ZZTlZSa25NRHRBQnA0L01VVHU3UjNBblBkelJHVUxENEVmTCtPSG4zQnpuK1VaS1hDMXNJWHpTRworQWEySWwrdG16VjdSLzl4OThvVGF1bmV0M0lBSXg2ZUgxbFdmbDJyb3lCRmt1dWNaS1Q4UnMzaVFoQ0JTV3hIdmVOQ0Q5dFZJa05BdworSE0rQStXRCtlZVNJOHQwQTY1UkY2MldVYVVDNndOVzB1THA5QkJHbzZ6RUZscFJPV0NHT245QmcvUUlEQVFBQm80SFJNSUhPTUIwRworQTFVZERnUVdCQlNCUGpmWWtyQWZkNTljdEt0enF1ZjJOR0F2K2pBTEJnTlZIUThFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgorL3pDQmpnWURWUjBqQklHR01JR0RnQlNCUGpmWWtyQWZkNTljdEt0enF1ZjJOR0F2K3FGb3BHWXdaREVMTUFrR0ExVUVCaE1DVTBVeAorRkRBU0JnTlZCQW9UQzBGa1pGUnlkWE4wSUVGQ01SMHdHd1lEVlFRTEV4UkJaR1JVY25WemRDQlVWRkFnVG1WMGQyOXlhekVnTUI0RworQTFVRUF4TVhRV1JrVkhKMWMzUWdVSFZpYkdsaklFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVAzRlVyNAorSk5valZoYVRkdDAyS0xtdUc3akQ4V1M2SUJoNGxTa25Wd1c4ZkNyMHVWRlYyb2NDM2c4V0Z6SDRxbmt1Q1JPN3I3SWdHUkxsay9sTAorK1lQb1JOV3lRU1cvaUhWdi94RDhTbFRRWC9ENjd6WnpmUnMyUmNZaGJiUVZ1RTdQbkZ5bFBWb0FqZ2JqUEdzeWUvS2Y4TGI5My9BbworR0Vqd3hyelF2elNBbHNKS3NXMk94NUJGM2k5bnJFVUVvM3JjVlpMSlIyYllHb3pIN1p4T211QVN1N1ZxVElUaDRTSU5od0JrL294OQorWWpsbHB1OUN0b0FsRW1FQnFDUVRjQUFSSmwvNk5WREZTTXdHUitnbjJIQ05YMlRtb1VRbVhpTHNrczMvUXBwRUlXMWN4ZU1pSFY5SAorRXVmT1gxMzYyS3F4TXkzWmR2Sk9Pak1NSzdNdGtBWT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQWRkVHJ1c3QgUXVhbGlmaWVkIENlcnRpZmljYXRlcyBSb290Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUhqQ0NBd2FnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQm5NUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTAorUVdSa1ZISjFjM1FnUVVJeEhUQWJCZ05WQkFzVEZFRmtaRlJ5ZFhOMElGUlVVQ0JPWlhSM2IzSnJNU013SVFZRFZRUURFeHBCWkdSVQorY25WemRDQlJkV0ZzYVdacFpXUWdRMEVnVW05dmREQWVGdzB3TURBMU16QXhNRFEwTlRCYUZ3MHlNREExTXpBeE1EUTBOVEJhTUdjeAorQ3pBSkJnTlZCQVlUQWxORk1SUXdFZ1lEVlFRS0V3dEJaR1JVY25WemRDQkJRakVkTUJzR0ExVUVDeE1VUVdSa1ZISjFjM1FnVkZSUQorSUU1bGRIZHZjbXN4SXpBaEJnTlZCQU1UR2tGa1pGUnlkWE4wSUZGMVlXeHBabWxsWkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRworOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTVCNmEvdHdKV29la24wZStFVit2aERUYllqeDVlTGZwTUxYc0RCd3F4QmIvNE94eAorNjRyMUVXN3RUdzJSMGhJWUxVa1ZBY0trSWhQSEVXVC9JaEthdVk1Y0x3alBjV3F6WndGWjhWMUc4N0I0cGZZT1FucmpmeHZNMFBDMworS1AwcTZwNnpzTGtFcXYzMng3U3h1Q3FnKzFqeEdhQnZjQ1YrUG1sS2Z3OGkyTyt0Q0JHYUtabmhxa1JGbWhKZVBwMXRVdnpub0QxbworTC9CTGNId1RPSzI4RlNYeDFzNnJvc0F4MWkrZjRQOFVXZnlFazltSGZFeFVFK3VmMFMwUitCZzZPdDRsMmZmVFFPMmtCaExFTytHUgord1ZZMThCVGNaVFlKYnF1a0I4YzEwY0lETXpaYmRTWnRRdkVTYTBOdlMzR1UralFkN1JOdXlvQi9tQzlzdVdYWTZRSURBUUFCbzRIVQorTUlIUk1CMEdBMVVkRGdRV0JCUTVsWXRpaTF6SjFJQzZXQStYUHhVSVE4eVlwekFMQmdOVkhROEVCQU1DQVFZd0R3WURWUjBUQVFILworQkFVd0F3RUIvekNCa1FZRFZSMGpCSUdKTUlHR2dCUTVsWXRpaTF6SjFJQzZXQStYUHhVSVE4eVlwNkZycEdrd1p6RUxNQWtHQTFVRQorQmhNQ1UwVXhGREFTQmdOVkJBb1RDMEZrWkZSeWRYTjBJRUZDTVIwd0d3WURWUVFMRXhSQlpHUlVjblZ6ZENCVVZGQWdUbVYwZDI5eQorYXpFak1DRUdBMVVFQXhNYVFXUmtWSEoxYzNRZ1VYVmhiR2xtYVdWa0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y05BUUVGQlFBRAorZ2dFQkFCbXJkZXI0aTJWaGxSTzZhUVR2aHNvVG9NZXFUMlFiUHhqMnFDMHNWWThGdHpEcVFtb2R3Q1ZSTGFlL0RMUHQ3d2gvYkR4RworR3VvWVE5OTJ6UGxtaHB3c2FQWHBGL2d4c3hqRTFraDlJMHhvd1g2N0FSUnZ4ZGx1M3JzRVFtcjQ5bHg5NWRyNmgrc05OVkpuMEo2WAorZGdXVFA1WEhBZVpwVlRoL0VHR1p5ZU5mcHNvK2dtTklxdUlJU0Q2cThyS0ZZcWEwcDltOU41eG90UzFXZmJDM1A2Q3hCOWJwVDl6ZQorUlhFd01uOGJMZ241djFLaDdzS0FQZ1pjTGxWQXdSdjFjRVd3M0YzNjluSmFkOUpqemM5WWlRQkNZejk1T2RCRXNJSnVRUm5vM2VEQgoraUZyUkhuR1RIeVF3ZE9VZXFONDhKemQvZzY2ZWQ4L3dNTEgvUzVub3hxRT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRWtUQ0NBM21nQXdJQkFnSUVSV3RRVkRBTkJna3Foa2lHOXcwQkFRVUZBRENCc0RFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVgorQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKdworYjNKaGRHVmtJR0o1SUhKbFptVnlaVzVqWlRFZk1CMEdBMVVFQ3hNV0tHTXBJREl3TURZZ1JXNTBjblZ6ZEN3Z1NXNWpMakV0TUNzRworQTFVRUF4TWtSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNMAorTWxvWERUSTJNVEV5TnpJd05UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdQorTVRrd053WURWUVFMRXpCM2QzY3VaVzUwY25WemRDNXVaWFF2UTFCVElHbHpJR2x1WTI5eWNHOXlZWFJsWkNCaWVTQnlaV1psY21WdQorWTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlZCQU1USkVWdWRISjFjM1FnVW05dgorZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgorQUxhVnRrTkMrc1p0S205STM1Uk1PVmNGN3NONUVVRm9OdTNzL3BvQmo2RTRLUHozRUVabUxrMGVHckVhVHNiUndKV0lzTW4vTVlzegorQTl1M2czcytJSVJlN2JKV0tLZjQ0TGxBY1RmRnkwY09seXBvd0NLVlloWGJSOW4xMEN2L2drdkpyVDdlVE51UWdGQS9DWXFFQU93dworQ2owWXpmdjlLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJcmI2OAorajZ4U2xrdXFVWTNrRXpFWjZFNU5uOXVzczJyVnZEbFVjY3A2ZW4rUTNYMGRnTm1CdTFrbXdoSCs1cFBpOTREa1pmczBOdzRwZ0hCTgorcnppR0xwNS9WNitlRjY3ckhNc29JVisySE5qbm9nUWkrZFBhMk1zQ0F3RUFBYU9Cc0RDQnJUQU9CZ05WSFE4QkFmOEVCQU1DQVFZdworRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMQorTXpReVdqQWZCZ05WSFNNRUdEQVdnQlJva09SbnBLWlRnTWVHWnFUeDkwdEQrNFM5YlRBZEJnTlZIUTRFRmdRVWFKRGtaNlNtVTRESAoraG1hazhmZExRL3VFdlcwd0hRWUpLb1pJaHZaOUIwRUFCQkF3RGhzSVZqY3VNVG8wTGpBREFnU1FNQTBHQ1NxR1NJYjNEUUVCQlFVQQorQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dE8xS3pLdHZuMUlTTQorWS9ZUHl5WUJrVkJzOUY4VTRwTjB3Qk9lTURwUTQ3Umd4Unp3SWtTTmNVZXN5QnJKNlp1YUFHQVQvM0IrWHhGTlNSdXpGVko3eVZUYQordjUyVnIydWEySjdwOGVSRGplSVJSRHEvcjcyRFFuTlNpNnE3cHluUDlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUUworVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2L2V1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMAordEh1dTJndVFPSFh2Z1IxbTB2ZFhjRGF6di93b3IzRWxoVnNUL2g1L1dyUTgKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworUlNBIFNlY3VyaXR5IDIwNDggdjMKKz09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURZVENDQWttZ0F3SUJBZ0lRQ2dFQkFRQUFBbndBQUFBS0FBQUFBakFOQmdrcWhraUc5dzBCQVFVRkFEQTZNUmt3RndZRFZRUUsKK0V4QlNVMEVnVTJWamRYSnBkSGtnU1c1ak1SMHdHd1lEVlFRTEV4UlNVMEVnVTJWamRYSnBkSGtnTWpBME9DQldNekFlRncwd01UQXkKK01qSXlNRE01TWpOYUZ3MHlOakF5TWpJeU1ETTVNak5hTURveEdUQVhCZ05WQkFvVEVGSlRRU0JUWldOMWNtbDBlU0JKYm1NeEhUQWIKK0JnTlZCQXNURkZKVFFTQlRaV04xY21sMGVTQXlNRFE0SUZZek1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKK0FRRUF0NDlWY2RLQTNYdHBlYWZ3R0ZBeVBHSm45Z3FWQjkzbUcvT2UyZEpCVkd1dG4zeStHYzM3UnF0QmFCNFk2bFhJTDVGNGlTajcKK0p5bGcvOStQakR2SlNadTFwSlRPQWVvK3RXTjdmeWI5R2QzQUliMkUwUzFQUnNOTzNOZzNPVHNvcjh1ZEd1b3JyeUdsd1NNaXVMZ2IKK1doT0hWNFBSOENEbjZFOGpRckFBcFgySjZlbGhjNVNZY1NhOExXcmc5MDN3OGJZcU9ER0JEU25oQU1GUkQweFMrQVJhcW4xeTA3aUgKK0tydGpFQU1xczZGUERWcGVScmM5RHZWMDdKbWYrVDBrZ1lpbTNXQlU2SlUyUGNZSms1cWpFb0FBVlprWlI3M1FwWHpEdXZzZjkvVVAKKytLeTV0ZlEzbUJNWTNvVmJ0d3lDTzRkdmxUbFlNTnB1QVdnWElzekFDd0lEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC8KK01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZkJnTlZIU01FR0RBV2dCUUh3MUV3cEtycFJhNDFKUHIvSkN3ejBMR2RqREFkQmdOVkhRNEUKK0ZnUVVCOE5STUtTcTZVV3VOU1Q2L3lRc005Q3huWXd3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUY4K2huWnV1RFU4VGpZY0hubVkKK3YvM1ZFaEY1VWc3dU1ZbTgzWC81MGNZVkllaUtBVlFOT3Z0VXVkWmoxTEdxbGsyaVFrM1VVeCtMRU41L1piNWdFeWR4aUtSejQ0UmoKKzBhUlY0VkNUNWhzT2VkQm52RWJJdno4WERaWG14cEJwM3VlMEw5NlZmZEFTUHowK2YwMC9GR2oxRVZEVndmU1FwUWdkTVdEL1lJd2oKK1ZBcXYvcUZ1eGRGNkttaDR6eDZDQ2lDMEg2M2xoYkpxYUhWT3JTVTNsSVcrdmFIVTZyY01TenlkNkJJQThGK3NEZUdzY0dOejkzOTUKK256SWxRblFGZ0NpL3ZjRWtsbGdWc1JjaDZZbEwyd2VJWi9RVnJYQStMMDJGTzhLMzIvNllhQ09KNFhRUDN2VEZoR01wRzh6TEI4a0EKK3BLblh3aUpQWjlkMzdDQUZZZDQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dlb1RydXN0IEdsb2JhbCBDQQorPT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURWRENDQWp5Z0F3SUJBZ0lEQWpSV01BMEdDU3FHU0liM0RRRUJCUVVBTUVJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUsKK0V3MUhaVzlVY25WemRDQkpibU11TVJzd0dRWURWUVFERXhKSFpXOVVjblZ6ZENCSGJHOWlZV3dnUTBFd0hoY05NREl3TlRJeE1EUXcKK01EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKK0xqRWJNQmtHQTFVRUF4TVNSMlZ2VkhKMWMzUWdSMnh2WW1Gc0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKK0NnS0NBUUVBMnN3WVl6RDk5QmNqR2xaK1c5ODhiRGprY2JkNGtkUzhvZGhNK0toRHRnUHBUU0VIQ0lqYVdDOW1PU205QlhpTG5Uam8KK0JiZHFmbkdrNXNSZ3ByRHZnT1NKS0ErZUpkYnRnL090cHBISG1NbENHRFVVbmEyWVJwSXVUOHJ4aDBQQkZwVlhMVkR2aVMyQWVsZXQKKzh1NWZhOUlBamJrVStCUVZOZG5BUnFON2NzaVJ2OGxWSzgzUWx6NmNKbVRNMzg2REdYSEtUdWJVMVh1cEdjMVYzc2pzMGw0NFUrVmMKK1Q0d3QvbEFqTnZ4bTVzdU9wRGtaQUxlVkFqbVJDdzcrT0M3UkhRV2E5azArYnc4SEhhOHNIbzlnT2VMNk5sTVRPZFJlSml2YlBhZ1UKK3ZUTHJHQU1vVWdSeDVhc3pQZUU0dXdjMmhHS2NlZW9XTVBSZndDdm9jV3ZrK1FJREFRQUJvMU13VVRBUEJnTlZIUk1CQWY4RUJUQUQKK0FRSC9NQjBHQTFVZERnUVdCQlRBZXBob2pZbjdxd1ZrREJGOXFuMWx1TXJNVGpBZkJnTlZIU01FR0RBV2dCVEFlcGhvalluN3F3VmsKK0RCRjlxbjFsdU1yTVRqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFOZU1wYXVVdlhWU09LVkNVbjVrYUZPU1BlQ3BpbEtJblo1N1EKK3p4cGVSK25Cc3FUUDNVRWFCVTZiUys1S2IxVlNzeVNoTndyclpIWXFMaXp6L1R0MWtMLzZjZGpIUFRmU3RRV1ZZcm1tM29rOU5uczQKK2QwaVhyS1lnank2bXlRekNzcGxGQU1mT0VWRWlJdUNsNnJZVlNBbGs2bDVQZFBjRlBzZUtVZ3piRmJTOWJadmx4ckZVYUtuamFaQzIKK21xVVB1TGsvSUgydVNyVzRuT1FkdHF2bWxLWEJ4NE90Mi9Vbmh3NEViTlgvM2FCZDdZZFN0eXNWQXE0NXBtcDA2ZHJFNTd4Tk5CNnAKK1hFMHpYNUlKTDRobVhYZVh4eDEyRTZuVjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm0KK013PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2VvVHJ1c3QgR2xvYmFsIENBIDIKKz09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURaakNDQWs2Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJFTVFzd0NRWURWUVFHRXdKVlV6RVdNQlFHQTFVRUNoTU4KK1IyVnZWSEoxYzNRZ1NXNWpMakVkTUJzR0ExVUVBeE1VUjJWdlZISjFjM1FnUjJ4dlltRnNJRU5CSURJd0hoY05NRFF3TXpBME1EVXcKK01EQXdXaGNOTVRrd016QTBNRFV3TURBd1dqQkVNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWoKK0xqRWRNQnNHQTFVRUF4TVVSMlZ2VkhKMWMzUWdSMnh2WW1Gc0lFTkJJREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXcKK2dnRUtBb0lCQVFEdlBFMUFQUkRmTzFNQTRXZitsR0FWUG9XSThZa05rTWdvSTVrRjZDc2duY2J6WUViWXdiTFZqREhaM0NCNUpJRy8KK05UTDhZMm5ic1NwcjdpRlk4Z2pwZU10dnkvd1dVc2lSeFA4OWM5NnhQcWZDZldiQjlYNVNKQnJpMVdlUjBJSVExM2hMVHl0Q09iMWsKK0xVQ2dzQkRUT0VoR2lLRU11em96S21LWSt3Q2RFMWwvYnp0eXF1Nm1ENGI1QldIcVozOE1ONWFMNW1rV1J4SENKMWtEczZaZ3dpRkEKK1Z2cWd4MzA2RStQc1Y4ZXoxcTZkaVlEM0FlY3M5cFlyRXcxNUxObkE1SVo3UzR3TWNvS0sreGZOQUd3NkV6eXdoSWRMRm5vcHNrL2IKK0hkUUw4MlkzdmRqMlY3dGVKSHE0UEl1NStwSWFHb1NlMkhTUHFodC9YdlQrUlNJaEFnTUJBQUdqWXpCaE1BOEdBMVVkRXdFQi93UUYKK01BTUJBZjh3SFFZRFZSME9CQllFRkhFNE52SUNNVk5ISzI2NlpVYXBFQlZZSUFVSk1COEdBMVVkSXdRWU1CYUFGSEU0TnZJQ01WTkgKK0syNjZaVWFwRUJWWUlBVUpNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFBL2UxSzZ0ZEVQeDcKK3NySmVySnNPZmxONFdUNUNCUDUxbzYyc2dVN1hBb3RleEMzSVVuYkhMQi84Z1RLWTBVdkdrcE16TlRFdi9OZ2RSTjNnZ1grZDZZdmgKK1pKRmlDemtJakt4MG5WblplbGxTbHhHNUZudHZSZE9XMlRGOUFqWVBuRHR1enl3TkEwWkY2NkQwZjBoRXhnaEF6TjRiY0xVcHJicUwKK096UmxkUnR4SVIwc0ZBcXdscFc0MXVyeVpmc3B1ay9xa1pOMGFiYnkvK0VhMEF6UmRvWExpaVc5bDE0c2J4V1pKdWUyS2Y4aTdNa0MKK3gxWUF6VW01czJ4N1V3UWE0cWpKcWhJRkk4TE81N3NFQXN6QVI2TGt4Q2t2VzBWWGlWSHVQT3RTQ1A4SE5SNmZOV3BIU2xhWTBWcUYKK0g0ejFJcityem9QejRpSXBybjJEUUtpNmJBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2VvVHJ1c3QgVW5pdmVyc2FsIENBCis9PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmFEQ0NBMUNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkZNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTgorUjJWdlZISjFjM1FnU1c1akxqRWVNQndHQTFVRUF4TVZSMlZ2VkhKMWMzUWdWVzVwZG1WeWMyRnNJRU5CTUI0WERUQTBNRE13TkRBMQorTURBd01Gb1hEVEk1TURNd05EQTFNREF3TUZvd1JURUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdQorWXk0eEhqQWNCZ05WQkFNVEZVZGxiMVJ5ZFhOMElGVnVhWFpsY25OaGJDQkRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUAorQURDQ0Fnb0NnZ0lCQUtZVlZhQ2p4dUFmakowaFVOZkJ2aXRidGFTZW9kbHlXTDBBRzB5L1lja1VIVVdDcThZZGdOWTk2eENjT3E5dAorSlBpOGNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFRRak9nTkIwZQorUlhiZFQ4b1lOK3lGRlhvWkNQelZ4NXp3OHFrdUVLbVM1ajFZUGFrV2FEd3ZkU0VZZnloM3BlRmhGN2VtNmZnZW1kdHpidlFLb2lGcworN3RxcWhaSm1yL1o2YTRMYXVpSUlOUS9QUXZFMSttcnVmaXNsekRvUjVHMnZjN0oySGEzUXNuaG5HcVE1SEZFTFoxYUQvVGhkRGM3ZAorOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3dtWjdjUlFnKzU5SUpEVFdVM1lCT1U1Zlh0UWxFSUdRV0Z3TUNURk1OYU43VgorcW5KTmsyMkNEdHVjdmMrMDgxeGRWSHBwQ1piVzJ4SEJqWFdvdE04NXlNNDh2Q1I4NW1MSzRiMTlwNzFYWlF2ay9pWHR0bWtRM0NnYQorUnIwQkhkQ1h0ZUdZTzhBM1pOWTlsTzRMNGZVb3JndFd2M0dMSXlsQmpvYkZTMUo3MkhHckg0b1ZwanVEV3RkWUFWSEdURUhaZjloQgorWjNLaUtOOWdnNm1leUh2OFUzTnlXZldUZWhkMkRzNzM1VnpaQzFVMG9xcGJ0V3BVNXhQS1YreVhiZlJlQmk5RmkxalVJeGFTNUJadQorS0dOWk1OOVFBWnhqaVJxZjJ4ZVVnbkEzd3lTZW1rZldXc3BPcUdtSmNoK1JiTnQrbmh1dHh4OXozU3hQR1dYOWY1TkFFQzdTOE8wOAorbmk0b1Bta21NOFY3QWdNQkFBR2pZekJoTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xN0xxcXdETGlJSmxGMAorWEcwRDA4RFlqM3JXTUI4R0ExVWRJd1FZTUJhQUZOcTdMcXF3RExpSUpsRjBYRzBEMDhEWWozcldNQTRHQTFVZER3RUIvd1FFQXdJQgoraGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQU1Yam14N1hmdUpSQXlYSEVxRFhzUmgzQ2hmTW9XSWF3Qy95T3NqbVBSRldyWklSYworYWFuUW1qZzgrdVVmTmVWRTQ0QjVsR2lrdThTZlBlRTB6VEJHaTFRcmxhWHY5eitaaFAwMTVzOHh4dHhxdjZmWEl3amhtRjdEV2doMgorcWFhdmR5KzNZTDFFUm1ydmwvOXpsY0dPNkpQNy9URzM3RmNSRVVXYk1QRWFpRG5CVHp5bkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TAorb0pIUmZOYkRmbERWblZpK1FUanJ1WFU4RmRtYnlVcURXY0RhVS8wenV6WVltNFVQRmQzdUxheDJrN25aQVkxSUVLajc5VGlHOGRzSworeHIyRW95TkIzdFozYjRYVWhSeFE0SzVSaXJxTlBuYml1Y29uOGwrZjcyNVpEUWJZS3hlazBueHJ1MThVR2tpUEdrem5zMGNjamt4RgorS3lEdVNOL24zUW1PR0tqYVFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMgorREZLV2tvUmVwcU8xcEQ0cjJjellHMGVxOGtUYVQva0Q2UEFVeXovemc5N1F3VlRqdCtnS04wMkxJRmtETUJtaExNaTlFUi9mcnNsSworeGZNblptYUdyR2lSLzlubVV4d1BpMXhwWlFvbXlCNDB3MTFSZTllcG5BYWhOdDNWaVpTODJlUXRERjRKYkFpWGZLTTlmSlAvUDZFVQorcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm1iSnhQZ1dwNlpLeTdQdFhueTNZdXhhZEl3VnlRRDh2SQorUC9ybU11R05HMitrNW83WStTbElpczV6L2l3PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitHZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMgorPT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmJEQ0NBMVNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQkhNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTgorUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMWMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd0hoY05NRFF3TXpBMAorTURVd01EQXdXaGNOTWprd016QTBNRFV3TURBd1dqQkhNUXN3Q1FZRFZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZworU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMWMzUWdWVzVwZG1WeWMyRnNJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQQorQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3pWRkxCeVQ3eTJkeXhVeHBaS2VleHcwVW81ZGZSN2NYRlM2R3FkSHRYcjBvbS9OajFYcWR1R2R0MAorREU4MVd6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUdGRiszUXMxNworajFoaE5Od3FDUGt1d3dHbUlrUWNUQWVDNWx2TzBFcDhCTk1aY3lmd3FwaC9McTlPNjRjZUpIZHFYYmJvVzBXNjNNT2hCVzlXam84UQorSnFWSnd5N1hRWWNpNEUrR3ltQzE2cUZqd0FHWEVIbTlBRHdTYlNzVnNheExzZTRZdVU2VzNOeDIvenUrejE4RHdQdzc2TDVHRy8vYQorUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2JLTlpyVk1hcVc5ZWlMQnNaektJQzlwdFp2VGRyaHJWdGdyclk2c2xXdktrMgorV1AwK0dmUHREQ2Fwa3pqNFQ4RmRJZ2JRbCtyaHJjWlY0SUVyS0lNNit2UjdJVkVBdmxJNHpzMW1lYWowZ1ZiaTBJTUpSMUZiVUdyUAorMjBnYVhUNzN5L1psOTJ6eGxmZ0NPekpXZ2psNlc3MHZpUnUvb2JUby8zK05qTjhEOFdCT1dCRk02Nk0vRUN1RG1nRnoyWlJ0aEFBbgorWnF6d2NFQUpRcEt0VDVNTllRbFJKTmlTMVF1VVliS0hzdTMvbWpYL2hWVEs3VVJEckJzOEZtdElTZ29jUUlnZmtzSUxBQVgvOHNnQworU3FTcXFjeVpscHd2V09COTRiNjdCOXhmQkhKY01UVEQ3Rjh0NEQxa2tDTG0wZXk0THQxWnJ0bWhONzlVTmR4ek1rK01CQjR6c3NsRworOGRoY3lGVlF5V2k5cUxvMkNRSURBUUFCbzJNd1lUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjI4MVhoK3FRMgorKy9DZlhHSng3VHowUnpnUUt6QWZCZ05WSFNNRUdEQVdnQlIyODFYaCtxUTIrL0NmWEdKeDdUejBSemdRS3pBT0JnTlZIUThCQWY4RQorQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBR2JCeGlQejJlQXVibC9vejY2d3NDVk5LL2c3V0p0QUpEZGF5NnNXU2YregorZFhrem9TOXRjQmMwa2Y1bmZvL3NtK1ZlZ3FsVkh5L2MxRkVIRXY2c0ZqNHNOY1pqL053UTZ3MmpxdEI4ek5IUUwxRXV4QlJhM3VnWgorNFQ3R3pLUXA1eTZFcWdZd2VIWlVjeWlZV1RqZ0FBMWkwMEo5SVordVBUcU0xZnAzRFJnckZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyKworbWJwQ0VyR1I5SHhvNHNqb3J5enF5WDZ1dXlvOURSWGNOSlcyR0hTb2FnL0h0UFFUeE9SYjdRclNwSmRNS3UwdmJCS0pQZkVuY0twcQorQTFJaG4wQ29aMUR5ODFvZjM5OGo5dHg0VHVhWVQxVTZVK1B2OHZTZngzellXSzhwSXBlNDRMMlJMckIyN0ZjUnorOHBSUFBwaFhwZworWStSZE00a1gyVEdxMnRiekdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUAorcG04bTF3azhPaHdSRHFac04vZXRSSWNzS01mWWRJS3owRzlLVjdzMUtTZWdpK2docDRka05sM00yQmFzeDdJblFKSlZPQ2lOVVc3ZAorRkdkVGJIRmNKb1JOZFZxMmZtQldxVTJ0KzVzZWwvTU4yZEtYVkhmYVBSSzM0Qjd2Q0FhcytZV0g2YUxjcjM0WUVvUDlWaGRCTHRVcAorZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1hRTUFKS09TTGFraFQyK3pOVlZYeHh2anBvaXhNcHRFbQorWDM2dldremFINmJ5SEN4K3JnSVcwbGJRTDFkVFIraVMKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVmlzYSBlQ29tbWVyY2UgUm9vdAorPT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEb2pDQ0FvcWdBd0lCQWdJUUU0WTFUUjAvQnZMQitXVUYxWkFjWWpBTkJna3Foa2lHOXcwQkFRVUZBREJyTVFzd0NRWURWUVFHCitFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsY201aGRHbHZibUZzSUZObGNuWnBZMlVnCitRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52YlcxbGNtTmxJRkp2YjNRd0hoY05NREl3TmpJMk1ESXhPRE0yCitXaGNOTWpJd05qSTBNREF4TmpFeVdqQnJNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tCitWbWx6WVNCSmJuUmxjbTVoZEdsdmJtRnNJRk5sY25acFkyVWdRWE56YjJOcFlYUnBiMjR4SERBYUJnTlZCQU1URTFacGMyRWdaVU52CitiVzFsY21ObElGSnZiM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZWOTVXSG02aDJtQ3hsQ2ZMCitGOXNIUDRDRlQ4aWN0dEQwYjAvUG1kamgyOEpJWERxc09UUEhIMnFMSmowck5mVklzWkhCQWs0RWxwRjdzRFB3c1JST0VXKzFRSzhiCitSYVZLNzM2MnJQS2dIMWcvRWtaZ1BJMmg0SDNQVno0ekh2dEg4YW9WbHdkVlpxVzFMUzdZZ0ZteXB3MjNSdXdoWS84MXE2VUN6eXIwCitUUDU3OVpSZGhFMm84bUNQMnc0bFBKOXpjYytVMzBycTI5OXlPSXp6bHIzeEY3elN1anRGV3NhbjlzWVhpd0dkL0Jtb0tvTVd1RHBJCisvazQrb0tzR0dlbFQ4NEFUQiswdHZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzCitHSHhCdmZhTGRYZTZZSjJFNS80dEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHCitNQjBHQTFVZERnUVdCQlFWT0lNUFB5dy9jRE1lelViK0I0d2c0TmZEdHpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVgvRkJmWHhjCitDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1J6Q1NzMDBSc2NhNEJJR3NEb284WXR5azZmZVVXCitZRk40UE1DdkZZUDNqMUl6Skwxa2s1ZnVpL2ZiR0todGNiUDNMQmZRZENWcDkvNXJQSlMrVFV0QmpFN2ljOURqa0NKelE4M3o3K3B6Cit6a1dLc0taSi8weDluWEdJeEhZZGtGc2Q3djNNOSs3OVlLV3hlaFp4MFJiUWZCSThiR21YMjY1Zk9acHdMd1U4R1VZRW1TQTIwR0J1CitZUWE3RmtLTWNQY3crK0RiWnFNQUFiM21MTnFSWDZCR2kwMXFuRDA5M1FWRy9uYS9vQW84NUFEbUo3Zi9oQzNldWlJbmxoQng2eUx0CiszOTh6bk0vanJhNk8xSTdtVDFHdkZwTGdYUFlIRHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDZXJ0dW0gUm9vdCBDQQorPT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREREQ0NBZlNnQXdJQkFnSURBUUFnTUEwR0NTcUdTSWIzRFFFQkJRVUFNRDR4Q3pBSkJnTlZCQVlUQWxCTU1Sc3dHUVlEVlFRSworRXhKVmJtbDZaWFJ2SUZOd0xpQjZJRzh1Ynk0eEVqQVFCZ05WQkFNVENVTmxjblIxYlNCRFFUQWVGdzB3TWpBMk1URXhNRFEyTXpsYQorRncweU56QTJNVEV4TURRMk16bGFNRDR4Q3pBSkJnTlZCQVlUQWxCTU1Sc3dHUVlEVlFRS0V4SlZibWw2WlhSdklGTndMaUI2SUc4dQorYnk0eEVqQVFCZ05WQkFNVENVTmxjblIxYlNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU02eAord1M3VFQzek5KYzRZUGsvRWpHK0FhblBJVzFING05TGN1d0Jjc2FEOGRRUHVnZkNJN2lOUzZlWVZNNDJzTFFuRmR2a3JPWUNKNUpkTAora0tXb2VQaHpRM3VrWWJEWVdNemhiR1orblBNSlhsVmpoTldvNy9PeExqQm9zOFE4Mkt4dWpabGFrRTQwM0RhYWo0R0lVTGR0bGtJSgorODllVmd3MUJTN0JxYS9qOEQzNWluMmZFN1NaZkVDWVBDRS93cEZjb3pvKzQ3VVgyYnU0bFhhcHVPYjdra3kvWlI2Qnk2L3FtVzYvSworVXovaURzYVdWaEZ1OStsbXFTYllmNVZUN1FxRmlMcFBLYVZDakY2Mi9JVWdBS3BvQzZFYWhRR2N4RVpqZ29pMklySHUvcXBHV1g3UAorTlN6VnR0cGQ5MGd6RkZTMjY5bHZ6czJJMXFzYjJwWTdIVmtDQXdFQUFhTVRNQkV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcQoraGtpRzl3MEJBUVVGQUFPQ0FRRUF1STNPNytjVXVzL3VzRVNTYkxRNVBxS0VicTI0SVhmUzFIZUNoK1lnUVlIdTR2Z1J0MlBSRnplKworR1hZa0hBUWFUT3M5cW1kdkxkVE4vbVV4Y01VYnBnSUt1bUI3YlZqQ21rbitZeklMYStNNndLeXJPN0RvMHdsUmpCQ0R4alRneFN2ZworR3JaZ0ZDZHNNbmVNdkxKeW1NL056RCs1eUNSQ0ZOWlgvT1ltUTZrZDVZQ1F6Z05VS0Q3M1A5UDRUZTFxQ2pxVEU1czdGQ01UWTV3LworMFljbmVlVk1VZU1CcllWZEdqdXgxWE1RcE5QeXZHNWs5VnBXa0tqSERreDBEeTV4Ty9mSVIvUnBieFh5RVY2REhweDhVcTc5QXRvUworcUZsbkdOdThjTjJic1dudGdNNkpRRWhxRGpYS0tXWVZJWlFzNkdBcW00VktRUE5yaWlUc0JoWXNjdz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0NvbW9kbyBBQUEgU2VydmljZXMgcm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWJNQmtHQTFVRUNBd1MKK1IzSmxZWFJsY2lCTllXNWphR1Z6ZEdWeU1SQXdEZ1lEVlFRSERBZFRZV3htYjNKa01Sb3dHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWcKK1RHbHRhWFJsWkRFaE1COEdBMVVFQXd3WVFVRkJJRU5sY25ScFptbGpZWFJsSUZObGNuWnBZMlZ6TUI0WERUQTBNREV3TVRBd01EQXcKK01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdNRWtkeVpXRjBaWElnVFdGdVkyaGwKK2MzUmxjakVRTUE0R0ExVUVCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlYKK0JBTU1HRUZCUVNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKK2dnRUJBTDVBbmZSdTRlcDJoeHhOUlVTT3ZrYklnd2Fkd1NyK0dCK081QUw2ODZ0ZFVJb1dNUXVhQnRERmNDTE5TUzFVWTh5MmJtaEcKK0MxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlM00vdmc0YWlqSlJQbjJqeW1KQkdoQ2ZIZHIvanpEVXMKK2kxNEhaR1dDd0Vpd3FKSDVZWjkySUZDb2tjZG10ZXQ0WWdOVzhJb2FFK294b3g2Z21mMDQ5dlluTWxodkIvVnJ1UHNVSzYrM3FzelcKK1kxOXpqTm9GbWFnNHFNc1hlRFpSck9tZTlIZzZqYzhQMlVMaW1BeXJMNThPQWQ3dm41bEo4UzNmckhSTkc1aTFSOFhsS2RINWtCakgKK1lweStnOGNtZXo2S0pjZkEzWjNtTldnUUlKMlAyTjdTdzRTY0RWN29MOGtDQXdFQUFhT0J3RENCdlRBZEJnTlZIUTRFRmdRVW9CRUsKK0l6Nlc4UWZzNHE4cDc0S2xmOUF3cExRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3ZXdZRFZSMGYKK0JIUXdjakE0b0RhZ05JWXlhSFIwY0RvdkwyTnliQzVqYjIxdlpHOWpZUzVqYjIwdlFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmwKK2N5NWpjbXd3TnFBMG9ES0dNR2gwZEhBNkx5OWpjbXd1WTI5dGIyUnZMbTVsZEM5QlFVRkRaWEowYVdacFkyRjBaVk5sY25acFkyVnoKK0xtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBQ0ZiOEF2Q2I2UCtrK3RaN3hrU0F6ay9FeGZZQVdNeW10cndVU1dnRWR1am0KKzdsM3NBZzlnMW8xUUdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKK1J0MHZ4dUJxdzhNMEF5eDlsdDFhd2c2bkNwbkJCWXVyREMvelhEclBiRGRWQ1lmZVUwQnNXTy84dHF0bGJnVDJHOXc4NEZvVnhwN1oKKzhWbElNQ0ZsQTJ6czZTRno3SnNEb2VBM3JhQVZHSS82dWdMT3B5eXBFQk1zMU9VSUpxc2lsMkQ0a0Y1MDFLS2FVNzN5cVdqZ29tN0MKKzEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTNzbVBpOVdJc2d0UnFBRUZROFRtRG41WHBOcGFZYmc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDb21vZG8gU2VjdXJlIFNlcnZpY2VzIHJvb3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFUHpDQ0F5ZWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCK01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTCitSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93R0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnCitUR2x0YVhSbFpERWtNQ0lHQTFVRUF3d2JVMlZqZFhKbElFTmxjblJwWm1sallYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3CitNREF3TUZvWERUSTRNVEl6TVRJek5UazFPVm93ZmpFTE1Ba0dBMVVFQmhNQ1IwSXhHekFaQmdOVkJBZ01Fa2R5WldGMFpYSWdUV0Z1CitZMmhsYzNSbGNqRVFNQTRHQTFVRUJ3d0hVMkZzWm05eVpERWFNQmdHQTFVRUNnd1JRMjl0YjJSdklFTkJJRXhwYldsMFpXUXhKREFpCitCZ05WQkFNTUcxTmxZM1Z5WlNCRFpYSjBhV1pwWTJGMFpTQlRaWEoyYVdObGN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQCitBRENDQVFvQ2dnRUJBTUJ4TTRLSzBIRHJjNGVDUU5VZDVNdkpEa0tRK2Q0MHVhRzZFZlFsaGZQTWNtM3llNWRyc3dmeGR5U1JYeVdQCis5blE5NUlEQytEd044NzlBNnZmSVV0RnliKy9JcTBHNGJpNFhLcFZwRE0zU0hwUjdMWlFkcW5YWHM1akxyTHhrVTBDOGo2eXNOc3RjCityYnZkNEpRWDdORmMwTC92cFpYSmtNV3dyUHNiUTk5NkNGMjN1UEpBR3lzbm5sRE9YbVdDaUl4ZTAwNE1ldW9Ja2JZMnFpdEMrK3JDCitvem5sMnlZNHJZc0s3aGxqeHh3azN3TjQydWJxd1VjYUN3dEdDZDBDL043TGgxL1hNR05vb2E3Y01xRzZ2djVFcTJpMnBSY1YvYjNWCitwNmVhNUVRejZZaU8vTzFSNjVOeFRxMEI1MFNPcXkzTHFQNEJTVWp3d04zSGFOaVMvajBDQXdFQUFhT0J4ekNCeERBZEJnTlZIUTRFCitGZ1FVUE5pVGlNTEFnZ25NQVprR2t5RHBubkFKWTA4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3CitnWUVHQTFVZEh3UjZNSGd3TzZBNW9EZUdOV2gwZEhBNkx5OWpjbXd1WTI5dGIyUnZZMkV1WTI5dEwxTmxZM1Z5WlVObGNuUnBabWxqCitZWFJsVTJWeWRtbGpaWE11WTNKc01EbWdONkExaGpOb2RIUndPaTh2WTNKc0xtTnZiVzlrYnk1dVpYUXZVMlZqZFhKbFEyVnlkR2xtCithV05oZEdWVFpYSjJhV05sY3k1amNtd3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSWNCYlNNZGZsc1hmY0ZoTXMrUDUvT0tsRmxtCis0SjRvcUY3VHQvUTA1cW81c3BjV3hZSnZNcVRwak9ldi9lL0M2TGxMcXFQMDV0cU5aU0g3dW9EckppaUZHdjQ1ak41YkJBUzBWUG1qCitaNTVCK2dsU3pBVklxTWsvSVFRZXpraHIvSVhvd251dmY3Zk0rRjg2L1RYR0RlK1gzRXlyRWVGcnl6SFJiUHRJZ0t2Y25EZTRJUlJMCitEWEU5N0lNemJ0RnVNaGJzbU1jV2kxbW1OS3NGVnkyVDk2b1R5OUlUNHJjdU84MXJVQmNKYUQ2MUpsZnV0dUMyM2JrcGdIbDlqNlB3CitwQ2lrRmNTRjlDZlVhNy9sWE9SbEFuWlV0T00zWmlUVEdXSElVaERsaXplYXVhbjVIYi9xbVpKaGx2OEJ6YUZmRGJ4eHZBNnNDeDFICitSUjNCN0h6cy9Taz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ29tb2RvIFRydXN0ZWQgU2VydmljZXMgcm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFUXpDQ0F5dWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkhRakViTUJrR0ExVUVDQXdTCitSM0psWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhEQWRUWVd4bWIzSmtNUm93R0FZRFZRUUtEQkZEYjIxdlpHOGdRMEVnCitUR2x0YVhSbFpERWxNQ01HQTFVRUF3d2NWSEoxYzNSbFpDQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekFlRncwd05EQXhNREV3CitNREF3TURCYUZ3MHlPREV5TXpFeU16VTVOVGxhTUg4eEN6QUpCZ05WQkFZVEFrZENNUnN3R1FZRFZRUUlEQkpIY21WaGRHVnlJRTFoCitibU5vWlhOMFpYSXhFREFPQmdOVkJBY01CMU5oYkdadmNtUXhHakFZQmdOVkJBb01FVU52Ylc5a2J5QkRRU0JNYVcxcGRHVmtNU1V3CitJd1lEVlFRRERCeFVjblZ6ZEdWa0lFTmxjblJwWm1sallYUmxJRk5sY25acFkyVnpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCitBUThBTUlJQkNnS0NBUUVBMzNGdk5saFRXdkkyVkZlQXhIUUlJTzBZZnlvZDVqV2FIaVdzbk9XV2ZuSlNvQlZDMjFuZFpIb2EwTGg3CiszVGtWdkZWSXhPMDZBT294RWJyeWNYUWFaN2pQTTh5b01hK2o0OWQvdnpNdFRHbzg3SXZEa3RKVGR5UjBuQWR1Y1B5OUMxdDJ1bC95CisvOWMzUzBwZ2VQZncrc3B3dE9wWnFxUE9TQytwdzdJTGZoZHlGZ3ltQnd3Yk9NL0pZcmMvb0pPbGgwSHl0M0JBZDlpK0ZIempxTUI2CitqdWxqYXRFUG1zYlM5SXM2RkFSVzFPMjR6RzcxKytJc1dMMS9UMnNyOTJBa1dDVE9KdTgwa1RyVjQ0SFFzdkFFQXRkYnR6NlNyR3NTCitpdm5rQmJBN2tVbGNzdXRUNnZpZlI0YnV2NVhBd0FhZjBsdGVFUnYweHdRMUtkSlZYT1R0NndJREFRQUJvNEhKTUlIR01CMEdBMVVkCitEZ1FXQkJURmUxaTk3ZG9sYWRMM1dSYW9zekxBZXlkYjlEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCCisvekNCZ3dZRFZSMGZCSHd3ZWpBOG9EcWdPSVkyYUhSMGNEb3ZMMk55YkM1amIyMXZaRzlqWVM1amIyMHZWSEoxYzNSbFpFTmxjblJwCitabWxqWVhSbFUyVnlkbWxqWlhNdVkzSnNNRHFnT0tBMmhqUm9kSFJ3T2k4dlkzSnNMbU52Ylc5a2J5NXVaWFF2VkhKMWMzUmxaRU5sCitjblJwWm1sallYUmxVMlZ5ZG1salpYTXVZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFESWs0RTdpYlN2dUlRU1RJM1M4TnR3Cit1bGVHRlRRUXVTOS9IckNvaVdDaGlzSjNERkJLbXdDTDJJdjBRZUxRZzRwS0hCUUdzS05vQlhBeE1LZFRtdzdwU3FCWWFXY09ycDMyCitwU3hCdnp3R2ErUlp6RzBROFpadkg5LzBCQUtrbjBVK3lOajZOa1pFVUQrQ2w1RWZLTnNZRVl3cTVHV0RWeElTakJjL2xEYitYYkRBCitCSGNUdVBRVjFUODR6SlE2VmRDc21QVzZBRi9naGhtQmVDOG93SDdUekVJSzlhNVFvTkUreHFGeDdEK2dJSXhtT29tMGp0VFlzVTBsCitSKzR2aU1pMTRRVkZ3TDRVY2Q1Ni9ZNTdmVTBJbHFVU2MvQXR5amNuZEJJblRNdTJsK25acmdodFdqbEEzUVZIZFdwYUliT2pHTTlPCis5eTVYdDVod1hzakVlTEJpCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1F1b1ZhZGlzIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjBEQ0NCTGlnQXdJQkFnSUVPclpRaXpBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRQorQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFbE1DTUdBMVVFQ3hNY1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMAorZVRFdU1Dd0dBMVVFQXhNbFVYVnZWbUZrYVhNZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TVRBegorTVRreE9ETXpNek5hRncweU1UQXpNVGN4T0RNek16TmFNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScAorY3lCTWFXMXBkR1ZrTVNVd0l3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEVlFRRAorRXlWUmRXOVdZV1JwY3lCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgorQUFPQ0FROEFNSUlCQ2dLQ0FRRUF2MkcxbFZPNlYvejY4bWNMT2hyZkVZQmtsYlRSdk0xNnovWXBsaTRrVkVBa09QY2FoZHhZVE11aworSjBLWDBKK0Rpc1BrQmdOYkFLVlJIbkFFZE9MQjFEcXIxNjA3QnhnRmp2MkRyT3BtMlJnYmFJcjFWeHFZdXZYdGRqMTgyZDZVYWp0TAorRjhIVmo3MWxPRHFWMEQxVk5rN2ZlVmN4S2g3WVdXVkpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTAorWXpjUzE5RHN3M3NnUVVTajdjdWdGK0Z4WmM0ZFpqSDNkZ0VaeUgwRFdMYVZTUjJtRWlib3hneDI0T05teStwZHBpYnU1Y3hmdldlbgorQVNjT29zcFV4YkY2bFIxeEhrb3BpZ1BjYWtYQnBCbGViemJOdzZLd3QvNWNPT0pTdlBoRVErYVF1d0lEQVFBQm80SUNVakNDQWs0dworUFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2ZG1Ga2FYTnZabVp6YUc5eQorWlM1amIyMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0NBUm9HQTFVZElBU0NBUkV3Z2dFTk1JSUJDUVlKS3dZQkJBRytXQUFCTUlINworTUlIVUJnZ3JCZ0VGQlFjQ0FqQ0J4eHFCeEZKbGJHbGhibU5sSUc5dUlIUm9aU0JSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sagorWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoYzNOMWJXVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJSFJvWlc0Z1lYQndiR2xqWVdKcworWlNCemRHRnVaR0Z5WkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUnBiMjRnY0hKaAorWTNScFkyVnpMQ0JoYm1RZ2RHaGxJRkYxYjFaaFpHbHpJRU5sY25ScFptbGpZWFJsSUZCdmJHbGplUzR3SWdZSUt3WUJCUVVIQWdFVworRm1oMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhNdVltMHdIUVlEVlIwT0JCWUVGSXRMYmUzVEtia0dHZXc1T2Fud2w0UnF5Ky9mTUlHdQorQmdOVkhTTUVnYVl3Z2FPQUZJdExiZTNUS2JrR0dldzVPYW53bDRScXkrL2ZvWUdFcElHQk1IOHhDekFKQmdOVkJBWVRBa0pOTVJrdworRndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNU1V3SXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMAorYUc5eWFYUjVNUzR3TEFZRFZRUURFeVZSZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Z2dRNgordGxDTE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWl0UVV0ZjcwbXBLbkdkU2tmbklZajlsbworZkZJazNXZHZPWHJFcWw0OTRsaXdUWENZaEdIb0crTnBHQTdPKzBkUW9FNy84Q1FmdmJMTzlTZjg3QzlUcW5ON0F6MTBidVlXbnV1bAorTHNTL1ZpZFFLMks2dmtzY1BGVmNRUjBrdm9JZ1IxM1ZSSDU2Rm1qZmZVMVJjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeAorZ0k0SlZybWNHbUQrWGNIWGV0d1JlTkRXWGNHMzFhMHltUU02aXN4VUpUa3hnWHNUSWxHNlJteWh1NTc2Qkd4SkpuU1AwblByekRDaQorNXVwWklvZjRsL1VPL2VyTWtxUVd4RklZNmlIT3NmSG1oSUhsdXFtR0tQSkRXbDBTbmF3ZTJhamxDbXFuZjZDSEtjL3lpVTNVN01YaQorNW5yUU5pT0tTblEyK1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitRdW9WYWRpcyBSb290IENBIDIKKz09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCitFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNakFlRncwd05qRXhNalF4CitPREkzTURCYUZ3MHpNVEV4TWpReE9ESXpNek5hTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCithVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCitEd0F3Z2dJS0FvSUNBUUNhR01wTGxBMEFMYThES1lyd0Q0SElya3daaFIwSW42c3BSSVh6TDRHdE1oNlFScitqaGlZYUh2NStIQmc2CitYSnhnRnlvNmRJTXpNSDFoVkJITDdhdmc1dEtpZnZWcmJ4aTNDZ3N0L2VrKzd3ckdzeERwM01KR0YvaGQvYVRhLzU1Sldwem1NK1lrCitsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCitsRGVQU0hGakl1d1haUWVWaWt2Zmo4WmFDdVd3NDE5ZWF4R3JEUG1GNjBUcCtBUno4dW4rWEppTTlYT3ZhN1IremRSY0FpdE1PZUd5CitsWlV0UW9mWDFiT1FRN2RzRS9IZTNmYkUrSWsvMFhYMWtzT1IxWXFJMEpEczNHM2VpY0psY1phTERRUDluTDliRnF5UzIrcitlWHl0Cis2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCit3UTVoWUlpelB0R28vS1BhSGJEUnNTTlUzMFIyYmUxQjJNR3lJclpUSE44MUhkeWhkeW94NUMzMTVlWGJ5T0QvNVlEWEMyT2cvek9oCitEN29zRlJYcWw3UFNvclcrOG95V0hocVBIV3lrWVRlNWhuTXoxNWVXbmlOOWdxUk1nZUtoMGJwblg1VUhveWNSN2hZUWU3eEZTa3l5CitCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCitKMGY3T3lIaitPc2RXd0lEQVFBQm80R3dNSUd0TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3Q3dZRFZSMFBCQVFEQWdFR01CMEdBMVVkCitEZ1FXQkJRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVWF6QnVCZ05WSFNNRVp6QmxnQlFhaEdLOFNFd3pKUVRVN3REMkE4UVpSdEdVCithNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCitFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNb0lDQlFrd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFENEtGazJmQmx1b3JuRmRMd1V2CitaK1lUUllQRU52Ynp3Q1lNRGJWSFpGMzR0SExKUnFVREdDZFZpWGg5ZHVxV05JQVhJTnpuZy9pTi9BZTQybDlOTG1leWhQM1pSUHgzCitVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtCitWakIzcGpkNE0xSVFXSzQvWVk3eWFySHZHSDVLV1dQS2phSlcxYWN2dkZZZnp6bkI0dnNLcUJVc2ZVMTZZOFpzbDBRODBtL0RTaGNLCisrSkRTVjZJWlVhVXRsMEhhQjArcFVOcVFqWlJHNFQ3d2xQMFFBRGoxTytoQTRiUnVWaG9nekc5WWplMHVSWS9XNlpNLzU3RXMzenJXCitJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCitXVmFqK2FoSmVmaXZEcmtSb0h5M2F1MDAwTFltWWpnYWh3ejQ2UDB1MDVCL0I1RXFIZForWElXRG1iQTRDRC9wWHZrMUIrVEpZbTVYCitmNmRRbGZlNnlKdm1qcUlCeGRabXYzbGg4endjNGJtQ1hGMmd3K25ZU0wwWm9oRVVHVzZ5aGh0b1BrZzNHb2kzWFpaZW5NZnZKMklJCis0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04CitWQ0xBQVZCcFE1NzBzdTl0K096YThlT3g3OStSajFRcUN5WEJKaG5FVWhBRlpkV0NFT3JDTWMwdQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitRdW9WYWRpcyBSb290IENBIDMKKz09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlHblRDQ0JJV2dBd0lCQWdJQ0JjWXdEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCitFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNekFlRncwd05qRXhNalF4CitPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCithVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCitEd0F3Z2dJS0FvSUNBUURNVjBJV1ZKem1tTlBUVGU3KzdjZWZRemxLWmJQb0ZvZzAydzFaa1hUUGtyZ0VRSzBDU3pHcnZJMlJhTmdnCitEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCitLVFZvcEFGUEQ2UXVOKzhiditPUEVLaHlxMWhYNTFTR3lNbnpXOW9zMmwyT2JqeWpQdHI3Z3VYZDhseXlCVE52aWpiTzBCTk8vNzlLCitERFJNcHNNaHZWQUVWZXV4dTUzN1JSNWtGZDVWQVl3Q2RyWExvVDlDYWJ3dnZXaERGbGFKS2pkaGtmMm1yazdBeXhSbGxEZExrZ2J2CitCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCitwNWlqSlVNdjcvRmZKdUdJVGZoZWJ0ZlpGRzRaTTJtbk80U0prOFJUVlJPaFVYaEErTGpKb3U1N3VsSkNnNTRVN1FWU1dsbFdwNWY4CituVDhLS2RqY1Q1RU9FN3plbGFUZmk1bStySnN6aU8rMWdhOGJ4aUpUeVBiSDdwY1VzTVY4ZUZMSThNNXVkMkNFcHVrcWRpRHRXQUVYCitNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCitHZit6MGd6c2tTYUhpck9pNFhDUExBcmx6VzFvVWV2YVB3Vi9pekxtRTF4ci9sOUE0aUxJdExSa1Q5YTZmVWcrcUdrTTE3dUdjY2x6Cit1RDg3blNWTDJ2OUE2d0lEQVFBQm80SUJsVENDQVpFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQjRRWURWUjBnQklIWk1JSFdNSUhUCitCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCitZWFJsSUdOdmJuTjBhWFIxZEdWeklHRmpZMlZ3ZEdGdVkyVWdiMllnZEdobElGRjFiMVpoWkdseklGSnZiM1FnUTBFZ015QkRaWEowCithV1pwWTJGMFpTQlFiMnhwWTNrZ0x5QkRaWEowYVdacFkyRjBhVzl1SUZCeVlXTjBhV05sSUZOMFlYUmxiV1Z1ZEM0d0xRWUlLd1lCCitCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlECitWUjBPQkJZRUZQTEFFK0NDUXo3NzdpOW5NcFkxWE51NHl3TFFNRzRHQTFVZEl3Um5NR1dBRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0Cit5d0xRb1Vta1J6QkZNUXN3Q1FZRFZRUUdFd0pDVFRFWk1CY0dBMVVFQ2hNUVVYVnZWbUZrYVhNZ1RHbHRhWFJsWkRFYk1Ca0dBMVVFCitBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCitxeU0wN3VjcDJzTmJ0ckNEMmREUTRpSDc4MkNuTzExZ1V5ZWltL1lJSWlybnY2Qnk1WndrYWpHeGtIb24yNFFSaVNlbWQxbzQxNytzCitodnp1WFlPOEJzYlJkMnNQYlNRdlMzcHNwd2VXeXVPRW42MklpeDJyRm8xYlpoZlpGdlNMZ05MZCtMSjJ3L3c0RTZvTTNrSnBLMjd6CitQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyCitQYitpU3d3UUhZYVpUS3J6Y2hHVDVPcjJtOXFvWGFkTnQ1NENybk1BeU5vakErajU2aGwwWWdDVXl5SWd2cFNuV2JXQ2FyNlplWHFwCis4a29rVXZkMC9icE81cWdkQW02eERZQkV3YTdUSXpkZnU0VjhLNUl1Nkg2bGk5Mlo0YjhuYnkxZHFudUgvZ3JkUy95TzlTYmtibkJDCitialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CitnL1d3WWpuUGJGZmlUTktSQ3c1MUtCdWF2LzBhUS9IS2QvczdqMkc0YVNnV1FnUmVjQ29jSWRpUDRiMGpXeTEwUUpMWll4a05jOTFwCit2R0pIdk9CMEs3THJmYjVCRzdYQVJzV2hJc3RmVHNFb2t0NFl1dFVxS0xzUml4ZVRtSmxnbEZ3anoxb25sMTRMQlFhVE54NDdhVGJyCitxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUAorVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdworSGhjTk1ETXdPVE13TURReU1EUTVXaGNOTWpNd09UTXdNRFF5TURRNVdqQlFNUXN3Q1FZRFZRUUdFd0pLVURFWU1CWUdBMVVFQ2hNUAorVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRFZRUUxFeDVUWldOMWNtbDBlU0JEYjIxdGRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3pzLzUvMDIyeDd4WjhWNlVNYlhhS0wwdS9aUHRNN29ydworOHlsODlmL3VLdURwNmJwYlpDS2FtbThzT2lacFVRV1pKdHpWSEdweHhwcDlIcDNkZkd6R2pHZG5Tajc0Y2JBWko2a0pES2FWdjB1TQorRFBwVm1Edlk2Q0toUzNFNGVheVhrbW16aVg3cUlXZ0dtQlNXaDlKaE5yeHRKMWFlVis3QXdGYjlNcytrMlk3Q0k5ZU5xUFBZSmF5WAorNUhBNDlMWTZ0SjA3bHlaRG82RzhTVmx5VENNd2h3Rlk5azYrSEdoV1pxL05RVjNJczAwcVZVYXJIOW9lNGtBOTI4MTl1WktBbkRmZAorREpaa25kd2k5MlNMMzJIZUZaUlNGYUI5VXNsTHFDSEp4ckh0eThPVllORVA4S3R3K04vTFRYN3MxdnFyMmIxL1ZQS2w2WG42MmRaMgorSkNoekFnTUJBQUdqUHpBOU1CMEdBMVVkRGdRV0JCU2djMG1aYU55RlcyWGpteWd2VjUrOU03d0hTREFMQmdOVkhROEVCQU1DQVFZdworRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBYUVDcHFMdmtUMTE1c3dXMUY3TmdFK3ZHa2wzZworMGROcS92dSttMjIveHdWdFdTREVIUEMzMm9SWUFtUDZTQmJ2VDZVTDkwcVk4aitlRzYxSGEyUE9DRWZyVWo5NG5LOU5ydmpWVDgrYQorbUNvUVFUbFN4TjNabXc3dmt3R3VzaTdLYUVJa1FteXdzem8remVuYVNNUVZ5K241QncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSgorczU4K09tSll4VW10WWc1eHBUS3FMOGFKZGtOQUV4Tm5QYUpVSlJETDhUcnkyZnJiU1ZhN3B2Nm5RVFhENEloaHlZakgzellRSXBoWgorNnJCSysxWVdjMjZzVGZjaW9VK3RIWG90UlNmbE1NRmU4dG9UeXlWQ1VaVkhBNHhzSWN4MFF1MVQvek9Manc5WEFSWXZ6NmJ1eVhBaQorRkwzOXZtd0xBdz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1NvbmVyYSBDbGFzcyAyIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRElEQ0NBZ2lnQXdJQkFnSUJIVEFOQmdrcWhraUc5dzBCQVFVRkFEQTVNUXN3Q1FZRFZRUUdFd0pHU1RFUE1BMEdBMVVFQ2hNRworVTI5dVpYSmhNUmt3RndZRFZRUURFeEJUYjI1bGNtRWdRMnhoYzNNeUlFTkJNQjRYRFRBeE1EUXdOakEzTWprME1Gb1hEVEl4TURRdworTmpBM01qazBNRm93T1RFTE1Ba0dBMVVFQmhNQ1Jra3hEekFOQmdOVkJBb1RCbE52Ym1WeVlURVpNQmNHQTFVRUF4TVFVMjl1WlhKaAorSUVOc1lYTnpNaUJEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMworL0VpOXZYK0FMVFU3NFcrb1o2bS9BeHhOakc4eVI5VkJhS1FUQk1FMURKcUVRL3hjSGYrSnMrZ1hHTTJSWC91SjQrcS9UbDE4R3liVAorZFhudDVvVGpWK1d0S2NUME9pam5wWHVFTm1tei9WNTJ2YU10bWRPUVRpTW9mUmhqOFZRN0pwMTJXNWRDc3YrdThFN3MzVG1WVG9NRworZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWp2T3I3blFLVjBiYTVjVHBwQ0Q4UAordE9GQ3g0ajFQNWlvcDdvYzRIRng3MWhYZ1ZCNlhHdDBSZzZEQTVqRGpxaHU4bll5YmllRHduUHozQmpvdEpQcWRVUnJCR0FnY1ZlSAorbmZPK29KQWpQWW9rNGRvaDI4TUNBd0VBQWFNek1ERXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ05WSFE0RUNnUUlTcUNxV0lUVAorWGp3d0N3WURWUjBQQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJhem9mNUZuSVZWMHNkMlp2bm9pWXc3Sk5uMzlZdAorMGpTdjl6aWx6cXNXdWFzdmZEWExyTkFQdEV3ci9JRHZhNHlSWHpaMjk5dXpHeG5xOUxJUi9XRnhSTDhvc3pvZHY3TkQ2SisvM0RFSQorY2JDZGpkWTBSektReG1Vazk2QktmQVJ6anpsdkY0eHl0YjFMeUhyNGU0UERLRTZjQ2VwblA3Sm5CQnZERk5yNDUwa2trZEFkYXZwaAorT2U5cjV5RjFCZ2ZZRXJRaElIQkNjWUhhUEpvMnZxWmJEV3BzbWgrUmUvbjU3MEs2VGs2ZXpBeU5sTnpaUlp4ZTdFSlFZNjcwWGNTeAorRXR6S082Z3VuUlJhQlhXMzdOZGo0cm8xdGdRSWtlamFuWnoyWnJVWXJBcW1WQ1kwTTlJYndkUi9HanFPQzZveWJ0djhUeVdmMlRMSAorbGxwd3JOOU0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR1akNDQXFLZ0F3SUJBZ0lFQUppV2lqQU5CZ2txaGtpRzl3MEJBUVVGQURCVk1Rc3dDUVlEVlFRR0V3Sk9UREVlTUJ3R0ExVUUKK0NoTVZVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1TVNZd0pBWURWUVFERXgxVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGcKK1VtOXZkQ0JEUVRBZUZ3MHdNakV5TVRjd09USXpORGxhRncweE5URXlNVFl3T1RFMU16aGFNRlV4Q3pBSkJnTlZCQVlUQWs1TU1SNHcKK0hBWURWUVFLRXhWVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNHhKakFrQmdOVkJBTVRIVk4wWVdGMElHUmxjaUJPWldSbGNteGgKK2JtUmxiaUJTYjI5MElFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW1OSzFVUkY2Z2FZVW1IRnQKK3Zzem5FeHZXSnc1NnMyb1lITFpoV3RWaENiL2VrQlBIWis3ZDg5ckZEQktlTlZVK0xDZUlRR3YzM04waVlmWEN4dzcxOXRWMlUwMlAKK2pMd1lkamVGbmVqS1NjZlNUNWdUQ2FJK0lvaWNmOWJ5RUdXMDdsOFkxUmZqK01YOTRwMmk3MU1PaFhlaUQrRXdSKzRBNXpOOVJHY2EKK0MxSG9pNkNlVUpob05GSWZMbTBCOG1CRjhqSHJxVEZvS2J0NlFaN0dHWCtVdEZFNUEzK3kzcWN5bTdSSGptKzBTcTdscjdIY3NCdGgKK3ZKbHkzdVNKdDNvbVhkb3pTVnRTbkE3MWlxM0R1RDNvQm1yQzFTb0xiSHVFdlZZRnk0WmxrdXhFSzdDT3VkeHdDMGJhcmJ4amlEbjYKKzIycitJL3E4NUVqMFp5dHFFUkFoU1FJREFRQUJvNEdSTUlHT01Bd0dBMVVkRXdRRk1BTUJBZjh3VHdZRFZSMGdCRWd3UmpCRUJnUlYKK0hTQUFNRHd3T2dZSUt3WUJCUVVIQWdFV0xtaDBkSEE2THk5M2QzY3VjR3RwYjNabGNtaGxhV1F1Ym13dmNHOXNhV05wWlhNdmNtOXYKK2RDMXdiMnhwWTNrd0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTb2ZldThZNlIwRTNRQTdKYmcwelRCTEw5cytEQU4KK0Jna3Foa2lHOXcwQkFRVUZBQU9DQVFFQUJZU0hWWFEyWWNHNzBkVEdGYWdUdEoray9ydnVGYlF2Qmd3cDhxaVNwR0VOL0t0Y0NGdFIKK0V5dE53aXBoeVBnSldQd3RBckk1ZlpsbWdiOXVYSlZGSUd6bWVhZlIyQndwL01JZ0oxSEk4WHhkTkdkcGhSRXd4Z0RTMS9QVGZMYncKK01WY29Fb0p6NlRNdnBsVzBDNUdVUjV6NnUzcENNdWl1ZmkzSXZLd1V2OWtQMlZ2OHdmbDZsZUY5ZnBiOGNiRENUTWpmUlRUSnpnM3kKK25HUUkwRHZES2NXeTdaQUV3YkVwa2NVd2I4R3BjalBNL2wwV0Z5d1JhZWQrL3NXRENOKzgzQ0k2TGlCcEl6bFdZR2VRaXk1Mk9mc1IKK2lKZjJmTDFMdUNBV1p3V040anZCY2orVWxUZkhYYm1lMkpPaEY0Ly9ER1lWd1NSOE1ud0RIVHVoV0VVeWt3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVVROIERBVEFDb3JwIFNHQyBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRVhqQ0NBMGFnQXdJQkFnSVFSTDRNaTFBQUliUVIweXBvQnFtdGFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmt6RUxNQWtHQTFVRQorQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBbFZVTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoYTJVZ1EybDBlVEVlTUJ3R0ExVUVDaE1WVkdobAorSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhob2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4R3pBWgorQmdOVkJBTVRFbFZVVGlBdElFUkJWRUZEYjNKd0lGTkhRekFlRncwNU9UQTJNalF4T0RVM01qRmFGdzB4T1RBMk1qUXhPVEEyTXpCYQorTUlHVE1Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DVlZReEZ6QVZCZ05WQkFjVERsTmhiSFFnVEdGclpTQkRhWFI1TVI0dworSEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeElUQWZCZ05WQkFzVEdHaDBkSEE2THk5M2QzY3VkWE5sY25SeQorZFhOMExtTnZiVEViTUJrR0ExVUVBeE1TVlZST0lDMGdSRUZVUVVOdmNuQWdVMGRETUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQworQVE4QU1JSUJDZ0tDQVFFQTMrNVlFS0lyYmxYRWpyOHVSZ25uNEFnUExpdDZFNVFidmZhMmdJNWxCWk1BSHJ5djRnK09HUTBTUit5cworcmFQNkxuRDQzbTc3VmtJVm5pNWM3eVBlSWJrRmRpY1pEMC9XdzV5MHZwUVpZL0ttRVFyclUwaWN2dklwT3hib0dxQk1wc24wR0Zsbword0hEeVV3REFYbENDcFZadk52bEs0RVNHb0UxTzFrZHVTVXJMWjllbXhBVzVqaDcwL1AvTjV6YmduQVZzc2pNaUZkQzA0TXdYd0xMQQorOVA0eVB5a3FsWHZZOHFkT0QxUjhvUTJBc3drRHdmOWMzVjZhUHJ5dXZFZUthcTV4eWgreEtyaGZRZ1VMN0VZdzBYSUx5dWxXYmZYdgorMzNpK1licXlwYTRFVEx5b3JHa1ZsNzN2NjdTTXZ6WDQxTVBSS0E1Y09wOXdHRE1nZDhTaXJ3SURBUUFCbzRHck1JR29NQXNHQTFVZAorRHdRRUF3SUJ4akFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJUTXRHenozLzY0UEdnWFlWT2t0S2VSUjIwVHpBOQorQmdOVkhSOEVOakEwTURLZ01LQXVoaXhvZEhSd09pOHZZM0pzTG5WelpYSjBjblZ6ZEM1amIyMHZWVlJPTFVSQlZFRkRiM0p3VTBkRAorTG1OeWJEQXFCZ05WSFNVRUl6QWhCZ2dyQmdFRkJRY0RBUVlLS3dZQkJBR0NOd29EQXdZSllJWklBWWI0UWdRQk1BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFBbk5aY0Fpb3NvdmNZek1CNHAvT0wzMVpqVVFMdGd5cityRnl3Sk5uOVEra0hjcnBZNkNpTStpVm5Kb3dmdAorR3pldC9IeStVVWxhM2pvS1ZBZ1dSY0tac1lmTmpHamdhUVBweEU2WXNqdU1Gck1Pb0F5WVVKdVRxWEFKeUN5amo5OEM1T0J4T3ZHMAorSTNLZ3FnSGYzNWcrRkZDZ01TYTlLT2xhTUNaMStYdGdISTN6elZBbWJRUW5tdC9WRFVWSEtXc3M1bmJacVNsOU10M0pOank5cmpYeAorRVo0ZHU1QS9Fa2RPanRkK0QySnpIVkltT0J3WVNmMHdkSnJFNVNJdjJNQ043WkY2VEFDUGNuOWQydDBiaTBWcjU5MXBsNmpGVmt3UAorRFBhZmVwRTM5cGVDNE4xeGFmOTJQMkJOUE0vM21mbkdWL1RKVlRsNHVpeDV5YWFJSy9RSQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitVVE4gVVNFUkZpcnN0IEhhcmR3YXJlIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFZERDQ0ExeWdBd0lCQWdJUVJMNE1pMUFBSkxRUjB6WXEvbVVLL1RBTkJna3Foa2lHOXcwQkFRVUZBRENCbHpFTE1Ba0dBMVVFCitCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsCitJRlZUUlZKVVVsVlRWQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUUxFeGhvZEhSd09pOHZkM2QzTG5WelpYSjBjblZ6ZEM1amIyMHhIekFkCitCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGhjbVV3SGhjTk9Ua3dOekE1TVRneE1EUXlXaGNOTVRrd056QTVNVGd4CitPVEl5V2pDQmx6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwCitlVEVlTUJ3R0ExVUVDaE1WVkdobElGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG9kSFJ3T2k4dmQzZDNMblZ6CitaWEowY25WemRDNWpiMjB4SHpBZEJnTlZCQU1URmxWVVRpMVZVMFZTUm1seWMzUXRTR0Z5WkhkaGNtVXdnZ0VpTUEwR0NTcUdTSWIzCitEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN4OThNNFA3U29mODg1Z2xGbjBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJCit3cnRoZEJLV0hUeHFjdFU4RUdjNk9lMHJFODFtNjVVSk02UnNsN0hveHV6QmRYbWNSbDZOcTlCcS9ia3FWUmNRVkxNWjhKcjI4YkZkCit0cWR0KytCeEYydWlpUHNBMy80YU1YY01tZ0Y2c1RMakt3RUhPRzdEcFY0anZFV2JlMURCeVRDUDIrVXJldE5iK3pOQUhxRFZtQmU4CitpNGZEaWROZG9JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUlEc2pmCitQZTU4QkV5ZENsNXJrZGJ1eCswb2phdE5oNGx6MEc2azBCNFdpeFRoZGtRRGYyT3M1TTFKbk1XUzlLc3lvVWhiQWdNQkFBR2pnYmt3CitnYll3Q3dZRFZSMFBCQVFEQWdIR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZLRnlYeVliS0poRGxWMEhOOVdGCitscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDBkSEE2THk5amNtd3VkWE5sY25SeWRYTjBMbU52YlM5VlZFNHRWVk5GCitVa1pwY25OMExVaGhjbVIzWVhKbExtTnliREF4QmdOVkhTVUVLakFvQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdVR0NDc0dBUVVGCitCd01HQmdnckJnRUZCUWNEQnpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVJ4a1AzblRHbVpldi9LMG9YbldPNnkxbjdrNTdLOWNNCisvL2JleTFXaUN1Rk1WR1dUWUd1ZkVweXRYb01zNjFxdXdPUXQ5QUJqSGJqQWJQTFBTYnROazI4R3Bnb2lza2xpQ0U3L3lNZ1Vzb2dXCitYZWNCNUJLVjVVVTBzNHRwdmMrMGhZOTFVWjU5T2pnNkZFZ1N4dnVuT3hxTkRZSkFCK2dFQ0pDaGljc1pVTi9LSEFHOEhRUVpleEIyCitsenZ1a0pES3hBNGZGbTUxN3pQNDAyOWJIcGJqNEhSM2RIdUtvbTR0M1hiV09UQ0M4S3VjVXZJcXg2OUpYbjdIYU9XQ2djaHFKL2tuCitpQ3JWV0ZDVkgvQTdIRmU3ZlJRNVlpdWF5WlNTS3FNaURQK0pKbjFmSXl0SDF4VWRxV3FlVVEwcVVaNkIrZFE3WG5BU2Z4QXluQjY3CituZmhtcUE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDYW1lcmZpcm1hIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFdlRDQ0E2V2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCL01Rc3dDUVlEVlFRR0V3SkZWVEVuTUNVR0ExVUVDaE1lCitRVU1nUTJGdFpYSm1hWEp0WVNCVFFTQkRTVVlnUVRneU56UXpNamczTVNNd0lRWURWUVFMRXhwb2RIUndPaTh2ZDNkM0xtTm9ZVzFpCitaWEp6YVdkdUxtOXlaekVpTUNBR0ExVUVBeE1aUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkREFlRncwd016QTVNekF4CitOakV6TkROYUZ3MHpOekE1TXpBeE5qRXpORFJhTUg4eEN6QUpCZ05WQkFZVEFrVlZNU2N3SlFZRFZRUUtFeDVCUXlCRFlXMWxjbVpwCitjbTFoSUZOQklFTkpSaUJCT0RJM05ETXlPRGN4SXpBaEJnTlZCQXNUR21oMGRIQTZMeTkzZDNjdVkyaGhiV0psY25OcFoyNHViM0puCitNU0l3SUFZRFZRUURFeGxEYUdGdFltVnljeUJ2WmlCRGIyMXRaWEpqWlNCU2IyOTBNSUlCSURBTkJna3Foa2lHOXcwQkFRRUZBQU9DCitBUTBBTUlJQkNBS0NBUUVBdHpaVjVhVmRHRERnMm9sVWtmekl4MUw0TDFEWjc3RjFjMlZIZlJ0YnVuWEYvS0dJSlBvdjdjb0lTamxVCit4RkY2dGRwZzZqZzhnYkxMOGJ2WmtTTS9TQUZ3ZGFrRktxMGZjZlBKVkQwZEJtcEFQck1NaGU1Y0czbkNZc1M0Tm80MVhRRU1Jd1JICitOYXFiWUU2Z1pqM0xKZ3FjUUtIMFhaaS9jYXVsQUdncTdZTjZENklVdGRRaXM0Q3dQQXhhVVdrdFdCaVA3Wm1lOGE3aWxlYjJSNmpXCitEQSt3V0ZqYncyWTNucHVSVkRNMzBwUWNha2pKeWZLbDJxVU1JL2NqRHB3eVZWNXhuSVFGVVpvdC9lWk9LalJhM3NwQU4yY01WQ0ZWCitkOW9LRE15WHJvRGNsRFpLOUQ3T05oTWVVK1NzVGpvRjdOdXVjcHc0aTlBNU80a0tQbmYrZFFJQkE2T0NBVVF3Z2dGQU1CSUdBMVVkCitFd0VCL3dRSU1BWUJBZjhDQVF3d1BBWURWUjBmQkRVd016QXhvQytnTFlZcmFIUjBjRG92TDJOeWJDNWphR0Z0WW1WeWMybG5iaTV2CitjbWN2WTJoaGJXSmxjbk55YjI5MExtTnliREFkQmdOVkhRNEVGZ1FVNDVUMXNVM3AyNkVwVzFlTFRYWUdkdUhSb29vd0RnWURWUjBQCitBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFuQmdOVkhSRUVJREFlZ1J4amFHRnRZbVZ5YzNKdmIzUkFZMmhoCitiV0psY25OcFoyNHViM0puTUNjR0ExVWRFZ1FnTUI2QkhHTm9ZVzFpWlhKemNtOXZkRUJqYUdGdFltVnljMmxuYmk1dmNtY3dXQVlECitWUjBnQkZFd1R6Qk5CZ3NyQmdFRUFZR0hMZ29EQVRBK01Ed0dDQ3NHQVFVRkJ3SUJGakJvZEhSd09pOHZZM0J6TG1Ob1lXMWlaWEp6CithV2R1TG05eVp5OWpjSE12WTJoaGJXSmxjbk55YjI5MExtaDBiV3d3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUF4Qmw4SWFoc0FpCitmSi83a1BNYTBRT3g3eFA1SVY4RW5OckpwWTBuYkphSGtiNUJrQUZ5aytjZWZWLzJpY1pkcDBBSlBheEpSVVhjTG8wd2FMSUp1dnZECitMOHk2Qzk4L2QzdEdmVG9TSkk2V2p6d0ZDbS9TbENnZGJRekFMb2dpMWRqUEhSUEg4RWpYMXdXbno4ZEhuanM4Tk1pQVQ5UVV1L3dOCitVUGY2cyt4Q1g2bmRiY2owZGM5N3dYSW1zUUVjWEN6OWVrNjBBY1VGVjdublBLb0YyWWpwQjBaQnp1OUJnYTVZMzRPaXJzclhkeC9uCitBRHlkYjQ3a01na2RUWGcwZURROGxKc203VTl4eGhsNnZTQWlTRnIrUzMwRHQrZFl2c1l5VG5RZWFOMm9hRnV6UHU1aWZkbUE2QXAxCitlcmZ1dEdXYUlaRGdxdENZdkRpMWN6eUwrTnc9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0NhbWVyZmlybWEgR2xvYmFsIENoYW1iZXJzaWduIFJvb3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRXhUQ0NBNjJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQjlNUXN3Q1FZRFZRUUdFd0pGVlRFbk1DVUdBMVVFQ2hNZQorUVVNZ1EyRnRaWEptYVhKdFlTQlRRU0JEU1VZZ1FUZ3lOelF6TWpnM01TTXdJUVlEVlFRTEV4cG9kSFJ3T2k4dmQzZDNMbU5vWVcxaQorWlhKemFXZHVMbTl5WnpFZ01CNEdBMVVFQXhNWFIyeHZZbUZzSUVOb1lXMWlaWEp6YVdkdUlGSnZiM1F3SGhjTk1ETXdPVE13TVRZeAorTkRFNFdoY05NemN3T1RNd01UWXhOREU0V2pCOU1Rc3dDUVlEVlFRR0V3SkZWVEVuTUNVR0ExVUVDaE1lUVVNZ1EyRnRaWEptYVhKdAorWVNCVFFTQkRTVVlnUVRneU56UXpNamczTVNNd0lRWURWUVFMRXhwb2RIUndPaTh2ZDNkM0xtTm9ZVzFpWlhKemFXZHVMbTl5WnpFZworTUI0R0ExVUVBeE1YUjJ4dlltRnNJRU5vWVcxaVpYSnphV2R1SUZKdmIzUXdnZ0VnTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRFFBdworZ2dFSUFvSUJBUUNpY0tMUW4wS3VXeGZIMkgzUEZJUDhUOG1odHhPdml0ZWVQZ1FLa290Z1Z2cTBNaStJVGFGZ0NQUzNDVTZnU1M5SgorMXRQZm5aZGFuNVFFY093L1dkbTN6R2FMbUZJb0NRTGZ4UytFalhxWGQ3L3NRSjBsY3F1MVB6S1krN2UzL0hLRTVUV0grVlg2b3g4TworYnk0bzNXbWcyVUlReHZpMVJNTFFRMy9idk9TaVBHcFZlQXAzcWRqcUdUSzNMLzVjUHh2dXNaanN5cTE2YVVYamxnOVY5dWJ0ZGVwbAorNkRKV2swYUpxQ1dLWlFidWE3OTVCOUR4dDYvdExFMlN1OENvWDZkbmZRVHlGUWh3ckpMV2ZRVFNNL3RNdGdzTCt4ckp4STBEcVg1YworOGxDckVxV2h6MGhRcGUvU3lCb1QrckIvc1lJY2Qyb1BYOXdMbFkvdlEzN21SUWtsQWdFRG80SUJVRENDQVV3d0VnWURWUjBUQVFILworQkFnd0JnRUIvd0lCRERBL0JnTlZIUjhFT0RBMk1EU2dNcUF3aGk1b2RIUndPaTh2WTNKc0xtTm9ZVzFpWlhKemFXZHVMbTl5Wnk5agorYUdGdFltVnljMmxuYm5KdmIzUXVZM0pzTUIwR0ExVWREZ1FXQkJSRG5EYWZzSjR3VGNiT1g2MFFxK1VEcGZxcEZEQU9CZ05WSFE4QgorQWY4RUJBTUNBUVl3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUNvR0ExVWRFUVFqTUNHQkgyTm9ZVzFpWlhKemFXZHVjbTl2ZEVCagorYUdGdFltVnljMmxuYmk1dmNtY3dLZ1lEVlIwU0JDTXdJWUVmWTJoaGJXSmxjbk5wWjI1eWIyOTBRR05vWVcxaVpYSnphV2R1TG05eQorWnpCYkJnTlZIU0FFVkRCU01GQUdDeXNHQVFRQmdZY3VDZ0VCTUVFd1B3WUlLd1lCQlFVSEFnRVdNMmgwZEhBNkx5OWpjSE11WTJoaAorYldKbGNuTnBaMjR1YjNKbkwyTndjeTlqYUdGdFltVnljMmxuYm5KdmIzUXVhSFJ0YkRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQQorUER0d2tma0VWQ2VSNGUzdC9taC9ZVjNsUVdWUE12RVlCWlJxSE40ZmNOcytleklDTkxVTWJLR0tmS1gwai8vVTJLMFgxUzBFMFQ5WQorZ09LQldZaSt3T05Ha3lUK2tMMG1vakF0NkpjbVZ6V0pkSllZOWhYaXJ5UVpWZ0lDc3JvUEZPckdpbWJCaGtWVmk3NlN2cHlrQk1kSgorUEo3b0tYcUoxLzZ2LzJqMXBSZVF2YXlaektXR1Z3bG5SdHZXRnNKRzhlU3BVUFdQMFpJVjAxOCt4Z0JKT201WXN0SFJKdzBseURMNAorSUJITmZUSXpTSlJVVE4zY2VjUXduK3VPdUZXMTE0aGN4V29rUGJMVEJRTlJ4Z2Z2ekJSeWREMXVjczRZS0l4S29IZmxDU3RGUkVlcwordDJkL0FZb0ZXcE8rb2NILytPY09aNlJIU1haZGRaQWE5U2FQOEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitOZXRMb2NrIE5vdGFyeSAoQ2xhc3MgQSkgUm9vdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJR2ZUQ0NCV1dnQXdJQkFnSUNBUU13RFFZSktvWklodmNOQVFFRUJRQXdnYTh4Q3pBSkJnTlZCQVlUQWtoVk1SQXdEZ1lEVlFRSQorRXdkSWRXNW5ZWEo1TVJFd0R3WURWUVFIRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNgorZEc5dWMyRm5hU0JMWm5RdU1Sb3dHQVlEVlFRTEV4RlVZVzUxYzJsMGRtRnVlV3RwWVdSdmF6RTJNRFFHQTFVRUF4TXRUbVYwVEc5agorYXlCTGIzcHFaV2Q1ZW05cElDaERiR0Z6Y3lCQktTQlVZVzUxYzJsMGRtRnVlV3RwWVdSdk1CNFhEVGs1TURJeU5ESXpNVFEwTjFvWAorRFRFNU1ESXhPVEl6TVRRME4xb3dnYTh4Q3pBSkJnTlZCQVlUQWtoVk1SQXdEZ1lEVlFRSUV3ZElkVzVuWVhKNU1SRXdEd1lEVlFRSAorRXdoQ2RXUmhjR1Z6ZERFbk1DVUdBMVVFQ2hNZVRtVjBURzlqYXlCSVlXeHZlbUYwWW1sNmRHOXVjMkZuYVNCTFpuUXVNUm93R0FZRAorVlFRTEV4RlVZVzUxYzJsMGRtRnVlV3RwWVdSdmF6RTJNRFFHQTFVRUF4TXRUbVYwVEc5amF5QkxiM3BxWldkNWVtOXBJQ2hEYkdGegorY3lCQktTQlVZVzUxYzJsMGRtRnVlV3RwWVdSdk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdkhTTQorRDd0TTlEY2VxUVdDMk9iaGJIRHFlTFZ1MFRoRURhaUR6bDNTMXRXQnhkUkw1MXVVY0NiYk81MXFUR0wzY2ZOazFtRTdQZXR6b3pmWgoreitxTWtqdk45d2ZjWm5TWDlFVWkzZlJjNEw5dDg3NWxNK1FWT3IvYm1KQlZPTVR0cGxWakM3QjRCUFRqYnNFL2p2eFJlQitTbm9QQworL3Rtd3FjbThXZ0QvcWFpWWRQdjJMRDRWT1EyMkJGV29EcGdnUXJPeEphMSttbTlkVTdHckRQenI0UE42czZpei8wYjJZNkxZT3BoNwordHF5Ri83QWxUM1JqNXhNSHBRcVBCZmZBWkc5K3B5ZUFsdDdVTG9aZ3gyc3JYbk43RitlUlAyUU0yRXNpTkN1Yk12SklINStoQ29SNgorNHNLdGx6Mk8xY0g1VnFOUTZjYTArcGlpN3BYbUtnT00zd0lEQVFBQm80SUNuekNDQXBzd0RnWURWUjBQQVFIL0JBUURBZ0FHTUJJRworQTFVZEV3RUIvd1FJTUFZQkFmOENBUVF3RVFZSllJWklBWWI0UWdFQkJBUURBZ0FITUlJQ1lBWUpZSVpJQVliNFFnRU5CSUlDVVJhQworQWsxR1NVZFpSVXhGVFNFZ1JYcGxiaUIwWVc1MWMybDBkbUZ1ZVNCaElFNWxkRXh2WTJzZ1MyWjBMaUJCYkhSaGJHRnViM01nVTNwdgorYkdkaGJIUmhkR0Z6YVNCR1pXeDBaWFJsYkdWcFltVnVJR3hsYVhKMElHVnNhbUZ5WVhOdmF5QmhiR0Z3YW1GdUlHdGxjM3AxYkhRdQorSUVFZ2FHbDBaV3hsYzJsMFpYTWdabTlzZVdGdFlYUmhkQ0JoSUU1bGRFeHZZMnNnUzJaMExpQjBaWEp0Wld0bVpXeGxiRzl6YzJWbgorTFdKcGVuUnZjMmwwWVhOaElIWmxaR2t1SUVFZ1pHbG5hWFJoYkdseklHRnNZV2x5WVhNZ1pXeG1iMmRoWkdGellXNWhheUJtWld4MAorWlhSbGJHVWdZWG9nWld4dmFYSjBJR1ZzYkdWdWIzSjZaWE5wSUdWc2FtRnlZWE1nYldWbmRHVjBaV3hsTGlCQmVpQmxiR3BoY21GegorSUd4bGFYSmhjMkVnYldWbmRHRnNZV3hvWVhSdklHRWdUbVYwVEc5amF5QkxablF1SUVsdWRHVnlibVYwSUdodmJteGhjR3BoYmlCaAorSUdoMGRIQnpPaTh2ZDNkM0xtNWxkR3h2WTJzdWJtVjBMMlJ2WTNNZ1kybHRaVzRnZG1GbmVTQnJaWEpvWlhSdklHRjZJR1ZzYkdWdQorYjNKNlpYTkFibVYwYkc5amF5NXVaWFFnWlMxdFlXbHNJR05wYldWdUxpQkpUVkJQVWxSQlRsUWhJRlJvWlNCcGMzTjFZVzVqWlNCaAorYm1RZ2RHaGxJSFZ6WlNCdlppQjBhR2x6SUdObGNuUnBabWxqWVhSbElHbHpJSE4xWW1wbFkzUWdkRzhnZEdobElFNWxkRXh2WTJzZworUTFCVElHRjJZV2xzWVdKc1pTQmhkQ0JvZEhSd2N6b3ZMM2QzZHk1dVpYUnNiMk5yTG01bGRDOWtiMk56SUc5eUlHSjVJR1V0YldGcAorYkNCaGRDQmpjSE5BYm1WMGJHOWpheTV1WlhRdU1BMEdDU3FHU0liM0RRRUJCQVVBQTRJQkFRQklKRWIzdWxaditzZ29BMEJPNVRFNQorYXlaclUzL2IzOS96Y1QwbXdCUU94bWQ3STZnTWM5MEJ1OGJLYmpjNVZkWEhqRllnRGlnS0R0SXFwTEJKVXNZNEIvNitDZ21NMFpqUAoreXRvVU1hRlAwam44RHhFc1E4UGRxNVBIVlQ1SGZCZ2FBTnp6ZTlqeWYxSnNJUFFMWDJsUzlPNzRzaWxnNitOSk1TRU4xclVRUWVKQgorQ1d6aUdwcFdTM2NDOXFDYm1pZUg2RlVwY2NLUW4wVjRHdUVWWkQzUUR0aWdkcCt1eGRBdTZ0WVBWdXhrZjFxYkZGZ0JKMzRUVU1kcgorS3Vab1BMOWNvQW9iNFE1NjZlS0F3K25wOXYxc0VaN1E1U2duSzFReVFoU0NkZVpLOEN0bWRXT01vdnNFUG9NT216YndHT1FtSU1PTQorOENnSHJUd1hab2kxL2JhSQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitYUmFtcCBHbG9iYWwgQ0EgUm9vdAorPT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU1EQ0NBeGlnQXdJQkFnSVFVSlJzN0JqcTFaeE4xWmZ2ZFkrZ3JUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmdqRUxNQWtHQTFVRQorQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzZHk1NGNtRnRjSE5sWTNWeWFYUjVMbU52YlRFa01DSUdBMVVFQ2hNYldGSmhiWEFnVTJWagorZFhKcGRIa2dVMlZ5ZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQgorZFhSb2IzSnBkSGt3SGhjTk1EUXhNVEF4TVRjeE5EQTBXaGNOTXpVd01UQXhNRFV6TnpFNVdqQ0JnakVMTUFrR0ExVUVCaE1DVlZNeAorSGpBY0JnTlZCQXNURlhkM2R5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZworVTJWeWRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UllVbUZ0Y0NCSGJHOWlZV3dnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcAorZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNZSkI2OUZiUzYzOGVNcFNlMk9BdHA4N1pPcUN3dQorSVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1BLWjJHRzltY0RaaHRkaEFvV09SbHNIOUttSG1mNE1NeAorZm9BcnRZekFRRHNSaHRETG9vWTJZS1RWTUlKdDJXN1FEeElFTTVkZlQyRmE4T1Q1a2F2bkhUdTg2TS8wYXkwMGZPSklZUnlPODJGRQorekcrZ1NxbVVzRTNhNTZrMGVuSTRxRUhNUEpRUmZldklwb3kzaHN2S016dlpQVGVMKzNvK2hpem5jOWNLVjZ4a214bnI5QThFQ0lxcworQXhjWlpQUmFKU0tOTkN5eTltZ2RFbTNUaWg0VTJzU1BwdUlqaGRWNkRiMXE0T25zN0JlN1FodG5xaVh0UllNaC9NSEpmTlZpUHZyeQoreFMzVC9kUmxBZ01CQUFHamdaOHdnWnd3RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZAorRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNWlBvajBHWTRRSm5NNWk1QVNzalZ5MTZiWWJNRFlHQTFVZEh3UXZNQzB3SzZBcAorb0NlR0pXaDBkSEE2THk5amNtd3VlSEpoYlhCelpXTjFjbWwwZVM1amIyMHZXRWREUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQworQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFKRVZPUU1CRzJmN1NoejVDbUJib2RwTmwyTDVKRk1uMTRKa1RwQXV3MGtiSzVyYworL0toNFp6WHhIZkFSdmJkSTR4RDJEZDgvMHNtMnFsV2tTTG9DMjk1WkxoVmJPNTBXZlVmWE4rcGZUWFlTTnJzZjE2R0JCRVlnb3l4dAorcVo0QmZqOHB6Z0NUMy8zSmtuT0ppV1NlNXl2a0hKRXMwcm5PZmM1dk1ablQ1cjdTSHBEd0NSUjVYQ09yVGRMYUlSOU5tWG1kNGM4bgorbnhDYkhJZ05zSXBrUVRHNERteVFKS1NiWEhHUHVydCtIQnZiYW9BUElienAyNmEzUVBTeWk2bXg1TythR3RBOWFabnVxQ2lqNFR5egorOExJUm5NOThRT2JkNTBOOW90ZzZ0YW1OOGpTWnhOUVE0UWI5Q1lRUU8rN0VUUFRzSjN4Q3duUjhnb29KeWJRREpidz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR28gRGFkZHkgQ2xhc3MgMiBDQQorPT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFQURDQ0F1aWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVoTUI4R0ExVUVDaE1ZCitWR2hsSUVkdklFUmhaR1I1SUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwCitabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBME1EWXlPVEUzTURZeU1Gb1hEVE0wTURZeU9URTNNRFl5TUZvd1l6RUxNQWtHCitBMVVFQmhNQ1ZWTXhJVEFmQmdOVkJBb1RHRlJvWlNCSGJ5QkVZV1JrZVNCSGNtOTFjQ3dnU1c1akxqRXhNQzhHQTFVRUN4TW9SMjhnCitSR0ZrWkhrZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFECitnZ0VOQURDQ0FRZ0NnZ0VCQU42ZDErcFhHRW1oVyt2WFgwaUc2cjdkLytUdlp4ejBaV2l6VjNHZ1huZTc3WnRKNlhDQVBWWVlZd2h2CisydkxNMEQ5L0FsUWlWQkRZc29IVXdIVTlTMy9IZDhNK2VLc2FBN1VnYXk5cUs3SEZpSDdFdXg2d3dkaEZKMitxTjFqM2h5YlgyQzMyCitxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaUVxSVRMZGlPcjE4U1BhQUlCUWkyWEtWbE9BUkZtUjZqCitZR0IweFVHbGNtSWJZc1VmYjE4YVFyNENVV1dvcmlNWWF2eDRBNmxOZjRERCtxdGEvS0ZBcE1vWkZ2Nnl5TzllY3czdWQ3MmE5bm1ZCit2TEVIWjZJVkRkMmdXTVpFZXdvK1lpaGZ1a0VIVTFqUEVYNDRkTVg0LzdWcGtJK0VkT3FYRzY4Q0FRT2pnY0F3Z2Iwd0hRWURWUjBPCitCQllFRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvYXRUak1JR05CZ05WSFNNRWdZVXdnWUtBRk5MRXNOS1IxRXdSY2JOaHl6MmgvdDJvCithdFRqb1dla1pUQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjVJRWR5YjNWd0xDQkpibU11CitNVEV3THdZRFZRUUxFeWhIYnlCRVlXUmtlU0JEYkdGemN5QXlJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHCitBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQURKTDg3TEtQcEg4RXNhaEI0eU9kNkF6QmhSY2tCNFk5d2ltCitQUW9aK1llQUVXNXA1SllYTVA4MGtXTnlPTzdNSEFHakhaUW9wREgyZXNSVTEvYmxNVmdEb3N6T1l0dVVSWE8xdjBYSkpMWFZnZ0t0CitJM2xwamJpMlRjN1BUTW96SStnY2lLcWRpMEZ1RnNrZzVZbWV6VHZhY1BkK21TWWdGRlFscTI1emhlYWJJWjBLYklJT3FQakNEUG9RCitIbXlXNzRjTnhBOWhpNjN1Z3l1VitJNlNoSEk1NnlEcWcrMkR6WmR1Q0x6clRpYTJjeXZrMC9aTS9pWng0bUVSZEVyL1Z4cUhEM1ZJCitMczlSYVJlZ0FoSmhsZFhSUUxJUVRPN0VyQkJEcHFXZUN0V1ZZcG9OejRpQ3hUSU01Q3VmUmVZTm55aWNzYmtxV2xldE53K3ZIWC9iCit2Wjg9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1N0YXJmaWVsZCBDbGFzcyAyIENBCis9PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFRHpDQ0F2ZWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SlZVekVsTUNNR0ExVUVDaE1jCitVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakV5TURBR0ExVUVDeE1wVTNSaGNtWnBaV3hrSUVOc1lYTnpJRElnCitRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF3TmpJNU1UY3pPVEUyV2hjTk16UXdOakk1TVRjek9URTJXakJvCitNUXN3Q1FZRFZRUUdFd0pWVXpFbE1DTUdBMVVFQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHCitBMVVFQ3hNcFUzUmhjbVpwWld4a0lFTnNZWE56SURJZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dFZ01BMEdDU3FHCitTSWIzRFFFQkFRVUFBNElCRFFBd2dnRUlBb0lCQVFDM01zais2WEdtQklXdERCRmszODVONzhnREdJYy9vYXY3UEthZjhNT2gydFRZCitiaXRUa1Bza3BENkU4SjdvWCt6bEowVDFLS1kvZTk3Z0t2RElyMU12bnNvRkFaTWVqMlljT2FkTitscTJjd1FsWnV0M2YrZFp4a3FaCitKUlJVNnliSDgzOFoxVEJ3ajYrd1Jpci9yZXNwN2RlZnFnU0hvOVQ1aWFVMFg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtCitlcHNaR0QzL2NWRThNQzVmdmoxM2M3SmRCbXpESTFhYUs0VW1raHluQXJQa1B3MnZDSG1DdURZOTZwelROYk84YWNyMXpKM28vV1NOCitGNEF6Ymw1S1habkpIb2UwblJyQTFXNFROU05lMzV0ZlBlL1c5M2JDNmo2N2VBMGNRbWRyQk5qNDF0cHZpL0pFb0FHckFnRURvNEhGCitNSUhDTUIwR0ExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlJ6dDBmCitodlJiVmF6YzF4RENEcW1JNTZGc3BHb3dhREVMTUFrR0ExVUVCaE1DVlZNeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vCitibTlzYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFzVEtWTjBZWEptYVdWc1pDQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnCitRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQVdkUDRpZDBja2FWYUdzCithZlB6V2RxYkFZY2FUMWVwb1hrSkt0djNMN0llek1kZWF0aURoNkdYNzBrMVBuY0dRVmhpdjQ1WXVBcG5QK3l6M1NGbUg4bFUrbkxNCitQVXhBMklHdmQ1NkRlcnVpeC9VMEY0N1pFVUQwL0N3cVRSVi9wMkpkTGlYVEFBc2dHaDFvK1JlNDlMMkw3U2haM1UwV2l4ZUR5TEpsCit4eTE2cGFxOFU0WnQzVmVreXZnZ1FRdG84UFQ3ZEw1V1hYcDU5ZmtkaGVNdGxiNzFjWkJEekkwZm1nQUtoeW5wVlNKWUFDUHE0eEpECitLVnRIQ04yTVFXcGxCcWpsSWFwQnRKVWhsYmw5MFRTckU5YXR2TnppUFRuTnZUNTFjS0VZV1FQSklyU1BuTlZlS3RlbHR0UUtiZmkzCitRQkZHbWg5NURtSy9ENWZzNEM4ZkY1UT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUh5VENDQmJHZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI5TVFzd0NRWURWUVFHRXdKSlRERVdNQlFHQTFVRUNoTU4KK1UzUmhjblJEYjIwZ1RIUmtMakVyTUNrR0ExVUVDeE1pVTJWamRYSmxJRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJsbmJtbHUKK1p6RXBNQ2NHQTFVRUF4TWdVM1JoY25SRGIyMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFl3T1RFM01UazAKK05qTTJXaGNOTXpZd09URTNNVGswTmpNMldqQjlNUXN3Q1FZRFZRUUdFd0pKVERFV01CUUdBMVVFQ2hNTlUzUmhjblJEYjIwZ1RIUmsKK0xqRXJNQ2tHQTFVRUN4TWlVMlZqZFhKbElFUnBaMmwwWVd3Z1EyVnlkR2xtYVdOaGRHVWdVMmxuYm1sdVp6RXBNQ2NHQTFVRUF4TWcKK1UzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXcKK2dnSUtBb0lDQVFEQmlOc0p2R3hHZkhpZmxYdTFNNUR5Y21MV3dUWWdJaVJlenVsMzhrTUtvZ1prcE15T052ZzQ1aVB3Ym0yeFBOMXkKK280VWNvZE05dERNcjB5K3YvdXF3UVZsbnRzUUdmUXFlZElYV2VVeUFOM3JmT1FWU1dmZjBHMFpEcE5LRmhkTERjZk4xWWpTNkxJcC8KK0hvL3U3VFRRRWNlV3pWSTl1alBXM1UzZUN6dEtTNS9DSmkvNnRSWWNjalYzeWp4ZDVzcmhKb3NhTm5aY0FkdDBGQ1grN2JXZ2lBL2QKK2VNb3RId2VYTUFFdGNubjZSdFlUS3FpNXBxdURTUjNsOHUvZDVBR09HQXFQWTFNV2hXS3BEaGs2ekxWbXBzSnJkQWZrSytGMlByUnQKKzJQWkU0WE5pSHp2RXZxQlRWaVZzVVFuM3Fxdkt2M2I5Ylp2em5kdS9QV2E4REZhcXI1aElsVHBMMzZkWVVOazRkYWxiNmtNTUF2K1oKKzYraHNUWEJiS1dXYzNhcGR6SzhCTWV3TTY5S042T3FjZStadTl5ZG1EQnBJMTI1QzR6L2VJVDU3NFExdysyT3FxR3dhVkxSY0pYckoKK29zbUxGcWE3TEg0WFhnVk5XRzRTSFFIdUVoQU54akovR1AvODlQck5icEhvTmttK0draHBpOEtXVFJvU3Nta1h3UXFRMXZwNUlraS8KK3VudHArSERIK25vMzJOZ04wblpQVi8rUXQrT1IwdDN2d21DM1p6cmQvcXFjOE5TTGYzSWl6c2FmbDdiNHI0cWdFS2paK3hqR3RyVmMKK1VqeUp0aGtxY3dFS0R3T3pFbUR5ZWkrQjI2TnUveVl3bC9XTDNZbFh0cTA5czY4cnhiZDJBdkNsMWl1YWhoUXFjdmJqTTR4ZENVc1QKKzM3dU1kQk5TU3dJREFRQUJvNElDVWpDQ0FrNHdEQVlEVlIwVEJBVXdBd0VCL3pBTEJnTlZIUThFQkFNQ0FhNHdIUVlEVlIwT0JCWUUKK0ZFNEw3eHFrUUZ1bEYybUhNTW8wYUVQUVFhN3lNR1FHQTFVZEh3UmRNRnN3TEtBcW9DaUdKbWgwZEhBNkx5OWpaWEowTG5OMFlYSjAKK1kyOXRMbTl5Wnk5elpuTmpZUzFqY213dVkzSnNNQ3VnS2FBbmhpVm9kSFJ3T2k4dlkzSnNMbk4wWVhKMFkyOXRMbTl5Wnk5elpuTmoKK1lTMWpjbXd1WTNKc01JSUJYUVlEVlIwZ0JJSUJWRENDQVZBd2dnRk1CZ3NyQmdFRUFZRzFOd0VCQVRDQ0FUc3dMd1lJS3dZQkJRVUgKK0FnRVdJMmgwZEhBNkx5OWpaWEowTG5OMFlYSjBZMjl0TG05eVp5OXdiMnhwWTNrdWNHUm1NRFVHQ0NzR0FRVUZCd0lCRmlsb2RIUncKK09pOHZZMlZ5ZEM1emRHRnlkR052YlM1dmNtY3ZhVzUwWlhKdFpXUnBZWFJsTG5Ca1pqQ0IwQVlJS3dZQkJRVUhBZ0l3Z2NNd0p4WWcKK1UzUmhjblFnUTI5dGJXVnlZMmxoYkNBb1UzUmhjblJEYjIwcElFeDBaQzR3QXdJQkFScUJsMHhwYldsMFpXUWdUR2xoWW1sc2FYUjUKK0xDQnlaV0ZrSUhSb1pTQnpaV04wYVc5dUlDcE1aV2RoYkNCTWFXMXBkR0YwYVc5dWN5b2diMllnZEdobElGTjBZWEowUTI5dElFTmwKK2NuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJRkJ2YkdsamVTQmhkbUZwYkdGaWJHVWdZWFFnYUhSMGNEb3ZMMk5sY25RdWMzUmgKK2NuUmpiMjB1YjNKbkwzQnZiR2xqZVM1d1pHWXdFUVlKWUlaSUFZYjRRZ0VCQkFRREFnQUhNRGdHQ1dDR1NBR0crRUlCRFFRckZpbFQKK2RHRnlkRU52YlNCR2NtVmxJRk5UVENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFOQmdrcWhraUc5dzBCQVFVRkFBT0MKK0FnRUFGbXlaOUdZTU5QWFFoVjU5Q3V6YUVFNDRIRjdmcGlVRlM1RXl3ZWc3OFQzZFJBbGJCMG1LS2N0bUFyZXhtdmNsbUFrOGpodmgKKzNUYUhLMHU3YU5NNVpqMmdKc2Z5T1pFZFVhdUNlMzdWemxyazRnTlhjR21YQ1BsZVdLWUszNHdHbWtVV0ZqZ0tYbGYyWXNkNkFnWG0KK3ZCNjE4cDcwcVNtRCtMSVU0MjRvaDBURGtCcmVPS2s4ckVOTlpFWE8zU2lwWFBKemV3VDRGK2lyc2ZNdVhHUnVjekU2RXJpOHN4SGsKK2ZZK0JVWm83alluMFRaTm1lendEN2RPYUhacnpaVkQxb05CMW55K3Y4T3FDUTVqNGFaeUplY1JEamtaeTQyUTJFcS8zSlI0NGlaQjMKK2ZzTnJhcm5EeTBSTHJIaVFpK2ZITEI1TEVVVElORkluelFwZG40WEJpZFVhZVBLVkVGTXkzWUNFWm5YWnRXZ28rMkV1dm9Tb09NQ1oKK0VvYWxIbWRrclFZdUw2bHdoY2VXRDN5SlpmV09RMVFPcTkybGdEbVVZTUEweVpad0xLTVM5UjlJZTcwY2ZtdTNuWkQwSWp1dStQd3EKK3l2cUNVcUR2cjB0VmsrdkJ0ZkFpaTZ3MFRpWWlCS0dITEhWS3QrVjlFOWU0REdUQU50TEpMNFlTakNNSndSdUNPM05KbzJwWGg1VGwKKzFuakZtVU5qNDAzZ2R5M2haWmx5YVFRYVJ3bm1Ed0ZXSlBzZnZ3NTVxVmd1dWNRSkFYNlZ1bTBBQmo2eTZrb1FPZGpRSy9XLzdIVy8KK2x3TEZDUnNJM0ZVMzRvSDdONFJEWWlESzUxWkxaZXIrYk1Fa2t5U2hOT3NGLzVvaXJwdDlQL0ZsVVFxbU1HcXo5SWdjZ0EzOGNvcm8KK2cxND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVGFpd2FuIEdSQ0EKKz09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZjakNDQTFxZ0F3SUJBZ0lRSDUxWld0Y3Z3Z1pFcFlBSWFlTmU5akFOQmdrcWhraUc5dzBCQVFVRkFEQS9NUXN3Q1FZRFZRUUcKK0V3SlVWekV3TUM0R0ExVUVDZ3duUjI5MlpYSnViV1Z1ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFgKK0RUQXlNVEl3TlRFek1qTXpNMW9YRFRNeU1USXdOVEV6TWpNek0xb3dQekVMTUFrR0ExVUVCaE1DVkZjeE1EQXVCZ05WQkFvTUowZHYKK2RtVnlibTFsYm5RZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKK2dnSVBBRENDQWdvQ2dnSUJBSm9sdU96TW9uV29lL2ZPVzFtS3lkR0dFZ2hVN0p6eTUwYjJpUE44NmFYZlRFYzJwQnNCSEg4ZVY0cU4KK3c4WFJJZVBhSkQ5SUsvdWZMcUdVNXl3Y2s5Ry9Hd0dIVTVuT3AvVUtJWFozLzZtM3huT1VUMGIzRUVrMytxaFpTVjFxZ1FkVzhvcjUKK0J0RDNjQ0pOdExkQnVUSzRzZkN4dzV3L2NQMVQzWUdxMkdONDl0aFRicUdzYW9Ra2NsU0d4dEt5eWh3T2VZSFd0WEJpQ0FFdVRrOE8KKzFSR3ZxYS9sbXIvY3pJZHRKdVRKVjZMN2x2bk00VDlUakd4TWZwdFRDQXRzRi90bnlNS3RzYzJBdEpmY2RnRVdGZWxxMTZUaGVFZk8KK2h0WDdNZlA2TWI0MHFpajdjRXdkU2NldkxKMXRacWEyaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3YKK0o1cEdmYUVOZGExVWhoWGNTVHZ4bHM0UG02RHNvM3BkdnRVcWRVTGxlOTZsdHFxdktLeXNrS3c0dDlWb05TWjYzUGM3OC8xRm05RzcKK1EzaHViL0ZDVkdxWThBMnRsK2xTWHVuVmFuTGVhdmNiWUJUMHBlUzJjV2VxSCtyaVRjRkNRUDVuUmhjNEwwYy9jWnl1NVNIS1lTMXQKK0I2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSEVnS1hUaUNROFA4Tkh1SkIKK085TkFPdWVOWGRwbTVBS3dCMUtZWEE2T001ekNwcFg3VlJsdVRJNnVTdys5d1RoTlhvK0VIV2JOeFdDV3RGSmFCWW1PbFhxWXdaRTgKK2xTT3lEdlI1dE1sOHdVb2hBZ01CQUFHamFqQm9NQjBHQTFVZERnUVdCQlRNek8vTUtXQ2tPN0dTdGp6Nk1tS1ByQ1VWT3pBTUJnTlYKK0hSTUVCVEFEQVFIL01Ea0dCR2NxQndBRU1UQXZNQzBDQVFBd0NRWUZLdzREQWhvRkFEQUhCZ1ZuS2dNQUFBUVVBNXZ3SWhQL2xTZzIKKzA5eWV3REw3TVRxS1VXVXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRUNBU3ZvbXljNWVNTjFQaG5SMldQV3VzNE16ZUtSNmRCY1oKK1R1bFN0Ym5nQ25SaXFtaktlS0JNbW80c0l5N1ZhaElrdjlSbzA0clEySnlmdEI4TTNqaCtWemo4amVKUFhneWZxenZTLzNXWHk2VGoKK1p3ai81Y0FXdFVnQmZlbjVDdjhiNVdwcHYzZ2hxTUtuSTZtR3EzWlc2QTRNOWhQZEttYUtaRWs5R2hpSGtBU2ZRbEszVDh2K1IwRjIKK05lLy9BSFkyUlRLYnhrYUZYZUlrc0I3alNKYVlWMGVVVlhvUFFiRkVKUFBCL2hwcnY0ajl3YWJhazJCZWdVcVpJSnhJWmhtMUFIbFUKK0Q3Z3NMMHU4cVYxYllIK01oNlhnVW1NcXZ0ZzdoVUFWL2g2MlpUL0ZTOXArdFhvMUthTXVlcGhnSXFQMGZTZE9MZXEwZER6cEQ2UXoKK0R4QVJ2Qk1CMXVVTzA3KzFFcUxoUlNQQXpBaHVZYmVKcTRQakpCN21YUWZuSHlBK3oyZkk1Nnd3YlNkTGFHNUxLbHdDQ0RUYitIYmsKK1o2TW1uRCtpTXNKS3hZRVlNUkJXcW9UdkxRci91QjkzMHIrbFdLQmk1TmRMa1hXTmlZQ1lmbTNMVTA1ZXIvYXlsNFdYdWRwVkJya2sKKzd0ZkdPQjVqR3hJN2xlRllyUExmaE5WZm1TOE5WVnZtT05zdVAzTHBTSVhMdXlrVGp4NDRWYm56c3NRd21TTk9YZkpJb1JJTTNCS1EKK0NaQlVrUU04UitYVnlXWGd0MHQ5N0VmVHN3cytyWjdRZEFBTzY3MVJyY0RlTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3kKKytmd0MwMGZtY2M0UUF1NG5qSVQvckVVTkUxeURNdUFscFlZc2ZQUVMKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3dpc3Njb20gUm9vdCBDQSAxCis9PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjJUQ0NBOEdnQXdJQkFnSVFYQXVGWEF2bldVSGZWOHcvZjUyb05qQU5CZ2txaGtpRzl3MEJBUVVGQURCa01Rc3dDUVlEVlFRRworRXdKamFERVJNQThHQTFVRUNoTUlVM2RwYzNOamIyMHhKVEFqQmdOVkJBc1RIRVJwWjJsMFlXd2dRMlZ5ZEdsbWFXTmhkR1VnVTJWeQorZG1salpYTXhHekFaQmdOVkJBTVRFbE4zYVhOelkyOXRJRkp2YjNRZ1EwRWdNVEFlRncwd05UQTRNVGd4TWpBMk1qQmFGdzB5TlRBNAorTVRneU1qQTJNakJhTUdReEN6QUpCZ05WQkFZVEFtTm9NUkV3RHdZRFZRUUtFd2hUZDJsemMyTnZiVEVsTUNNR0ExVUVDeE1jUkdsbgorYVhSaGJDQkRaWEowYVdacFkyRjBaU0JUWlhKMmFXTmxjekViTUJrR0ExVUVBeE1TVTNkcGMzTmpiMjBnVW05dmRDQkRRU0F4TUlJQworSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTBMbXdxQXpadXo4aCtCdlZNNU9BRm1VZ2RiSTltMkJ0UnNpTQorTVc4WHcvcWFiRmJ0UE1XUlY4UE5xNVpKa0NvWlN4NmpiVmZkOFN0aUtIVkZYcXJXVy9vTEpkaWhGdmtjeEM3bWxTcG56TkFwYmp5RgorTkRoaFNiRUFuOVk2Y1Y5TmJjNWZ1YW5raVg5cVV2ckttL0xjcWZtZG1VYy9UaWxmdEthTlhYc0xtUkVEQS83bjI5dWoveDJselpBZQorQVI4MXNIOEEyNUJ2eG41NzBlNTZlcWVxREZkdnBHM0ZFenV3cGRudE1oeTBYbWVMVk54emgrWFRGM3htVUhKZDFCcFl3ZG5QMklrQworYjZkSnREWmQwS1RlQnl5MmRiY29rZGFYdmlqMW1CN3FXeWJKdmJDWGM5cXVrU2JyYU1INU9SWFdaMHNLYlUvTHo3RGtRbkdNVTNubgorN3VIYkhhQnVIWXdhZHpWY0ZoNHJVeDgwaTlGcy9QSm5CM3IxcmUzV21xdWhzVXZoekRkZi9YL05UYTY0SDV4RCtTcFlWVU5GdkpiTgorY0E3OHllTm11azZOTzRITEZXUjd1WlRvWFROU2hYRXVUNDZpQmhGUnllUExvVzR4Q0dRTXd0STg5VGJvMTlBT2VDTWdrY2trS21VcAorV3lMM0ljNkRYcVR6M2t2VGFJOUdkVnlEQ1c0cGE4UndqUFdkMXlBdi8wYlNLempDTDNVY1BYN2FwZThlWUlWcFF0UE0rR1ArSGtNNQoraGFhMlkwRVFzM01ldk5QNnluMFdSK0tuMWRDamlnb0lsbUpXYmpUYjJRSzVNSFhqQk5Mbmo4S3dFVUFLck5WeEFtS0xNYjdkeGlOWQorTVVKRExYVDV4cDZtaWcvcC9yK0Q1a05YSkxydlJqU3ExeElCT08wQ0F3RUFBYU9CaGpDQmd6QU9CZ05WSFE4QkFmOEVCQU1DQVlZdworSFFZRFZSMGhCQll3RkRBU0JnZGdoWFFCVXdBQkJnZGdoWFFCVXdBQk1CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRY3dId1lEVlIwagorQkJnd0ZvQVVBeVV2M20rQ0FUcGNMTndyb1dtMVo5U00wLzB3SFFZRFZSME9CQllFRkFNbEw5NXZnZ0U2WEN6Y0s2RnB0V2ZVak5QOQorTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElDQVFBMUVNdnNwZ1FORFEvTndOdXJxUEtJbHd6Zmt5OU5mRUJXTVhycnBBOWd6WHJ6dnNNbgoramdNK3BOMFM3MzRlZEFZOFB6SHlISHVSTVNHMDhOQnNsOVRwbDdJa1ZoNVd3elc5aUFVUFd4QWFaT0hIZ2pENU1xMmVVQ3puZUFYUQorTWJGYW1JcDFUcEJjYWhRcTRGSkhnbURtSHRxQnNmc1VDMXJ4bjlLVnVqN1FHOVlWSGFPK2h0WGJEOEJKWkxzdVVCbEwwaVQ0M1I0SAorVnRBNG9KVndJSGFNMTkwZTNwOXh4Q1B2Z3hOY295UVZUU2xBUEdyRXFkaTNwa1NsRGZUZ25YY2VRSEFtL05yWk51UjU1TFUvdkp0bAordnJzUmxzL2J4aWc1T2dqT1IxdFRXc1daL2wycDNlOU0xTWFsclFMbWpBY1NIbThEMFcrZ28vTXB2UkxIVUtLd2Y0aXBtWGVhc2NDbAorT1M1Y2ZHbmlMTERxTjJxazRWcmg5VkRsZysrbHV5cUk1NHpiL1cxZWx4bW9mbVoxYTNIcXY3SEhiNkQwanFUc05GRmJqQ1lEY0tGMworMVFFU1Z3QTEyeVBlRG9vb21mMnhFRzlML3pndFlFNHNuT3RudGExSjdrc2ZySy83RFpCYVptQndYYXJOZU5RazdzaEJvSk1Ca3B4cQorbnZ5NUpNV3pGWUordnE2VksrdXh3TnJqQVdBTFhtbXNoRlpodm5FWC9oMFRELzdHaDBYcC9qS2dHZzBUcEpSVmNhVVdpN3JLaWJDeQoreC95UDJGUzFrMktkenM5Wit6MFl6aXJMTlJXQ1hmOVVJbHR4VXZ1M3lmNWdtd0JCWlBDcUt1eTJRa1BPaVdhQnlJdWZPVlFESmRNVworTlk2RTBGLzZNQnIxbW16MERsUDVPbHZSSEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsTVFzd0NRWURWUVFHCitFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3CitJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1EwRXdIaGNOTURZeE1URXdNREF3TURBd1doY05NekV4CitNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMCitFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3CitnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdERoWE81RU9BWExHSDg3ZGcrWEVTcGE3Y0pwU0lxdlRPCis5U0E1S0ZoZ0RQaUEycWtWbFRKaFBMV3hLSVNLaXR5ZkNneURGM3FQa0t5SzUzbFRYREdFS3ZZUG1ESTJkc3plM1R5b291OXEreUh5CitVbUhmbnlEWEgrS3gyZjRZWk5JU1cxLzVXQmcxdkVmTm9UYjVhMy9Vc0RnK3dSdkRqRFBaMkM4WS9pZ1BzNmVEMXNOdVJNQmhOWllXCisvbG1jaTNadDEvR2lTdzByL3d0eTJwNWcwSTZRTmNaNFZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5CitvZWI2cE5uVkZ6RjFyb1Y5SXE0L0FVYUc5aWg1eUxIYTVGY1h4SDRjRHJDMGtxWldzNzJ5bCsycXAvQzN4YWcvbFJiUS82R1c2d2hmCitHSGRQQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJGCis2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QU5CZ2txCitoa2lHOXcwQkFRVUZBQU9DQVFFQW9nNjgzK0x0OE9OeWMzcGtsTC8zY21iWU11UkNkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjCitFa3hZNU5NOWcwbEZXSmMxYVJxb1IrcFd4bm1yRXRobmdZVGZmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuCitTYk5kNjdJSkt1c203WGkrZlQ4cjg3Y21OVzFmaVFHMlNWdWZBUVdicXowbHdjeTJmOEx4YjRiRyttUm82NEV0bE90Q3QvcU1IdDFpCis4YjVRWjdkc3ZmUHhIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCisrbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURyekNDQXBlZ0F3SUJBZ0lRQ0R2Z1ZwQkNSckdoZFdySldaSEhTakFOQmdrcWhraUc5dzBCQVFVRkFEQmhNUXN3Q1FZRFZRUUcKK0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXcKK0hnWURWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkRRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXcKK01EQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDMKK2R5NWthV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFTkJNSUlCSWpBTkJna3EKK2hraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCQ1NETUFaT24KK1RqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3bmg2VmZlNjNTS01JMnRhdmVndzUKK0JtVi9TbDBmdkJmNHE3N3VLTmQwZjNwNG1WbUZhRzVjSXpKTHYwN0E2RnB0NDNDL2R4Qy8vQUgyaGRtb1JCQllNcWwxR05YUm9yNUgKKzRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQVDE5c2RsNmdTemVSbnR3aTVtM09GQnFPYXN2K3piTVVaQmZIV3ltZU1yL3kKKzd2clRDMExVcTdkQk10b00xTy80Z2RXN2pWZy90UnZvU1NpaWNOb3hCTjMzc2hieVRBcE9CNmp0U2oxZXRYK2prTU92SndJREFRQUIKK28yTXdZVEFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBOTVRTlZiUlRMdG0KKzhLUGlHeHZEbDdJOTBWVXdId1lEVlIwakJCZ3dGb0FVQTk1UU5WYlJUTHRtOEtQaUd4dkRsN0k5MFZVd0RRWUpLb1pJaHZjTkFRRUYKK0JRQURnZ0VCQU11Y042cElFeElLK3QxRW5FOVNzUFRmcmdUMWVYa0lveVFZL0VzcmhNQXR1ZFhIL3ZUQkgxakx1RzJjZW5Ubm1DbXIKK0ViWGpjS0NoelV5SW1aT01rWERpcXc4Y3ZwT3AvMlBWNUFkZzA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXQKK3RlcDNTcCtkV09JcldjQkFJKzB0S0lKRlBubFVraWFZNElCSXFEZnY4Tlo1WUJiZXJPZ096VzZzUkJjNEwwbmE0VVUrS3JrMlU4ODYKK1VBYjNMdWpFVjBsc1lTRVkxUVN0ZUR3c09vQnJwK3V2RlJUcDJJbkJ1VGhzNHBGc2l2OWt1WGNsVnpEQUd5U2o0ZHpwMzBkOHRiUWsKK0NBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnNNUXN3Q1FZRFZRUUcKK0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3cKK0tRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXcKK01Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREVScFoybERaWEowSUVsdVl6RVoKK01CY0dBMVVFQ3hNUWQzZDNMbVJwWjJsalpYSjBMbU52YlRFck1Da0dBMVVFQXhNaVJHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnUKK1kyVWdSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtKzlTNzVTMHQKK01xYmY1WUUveWMwbFNiWnhLc1BWbERSbm9nb2NzRjlwcGtDeHhMZXlqOUNZcEtsQldUclQzSlRXUE50ME9LUkt6RTBsZ3ZkS3BWTVMKK09PN3pTVzF4a1g1anRxdW1YOE9raFBoUFlsRysrTVhzMnppUzR3YmxDSkVNeENoQlZmdkxXb2tWZm5Ib05iOU5jZ2s5dmpvNFVGdDMKK01SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCSWs1bFlZZUJRVkNtZVZ5SjNobEtWOVV1NWwwY1V5eCttTTBhQmhha2FIUFEKK05BUVRYS0Z4MDFwOFZkdGVaT0UzaHpCV0JPVVJ0Q21BRXZGNU9ZaWlBaEY4SjJhM2lMZDQ4c29LcURpckNtVEN2MlpkbFlUQm9TVWUKK2gxMGFVQXNnRXN4QnUyNExVVGk0UzhzQ0F3RUFBYU5qTUdFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUIKK0FmOHdIUVlEVlIwT0JCWUVGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUI4R0ExVWRJd1FZTUJhQUZMRSt3MmtEK0w5SEFkU1kKK0pob0lBdTlqWkN2RE1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQWNHZ2FYM05lY256eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVEKK1Y4R0s4M3JaRVdXT05mcWUvRVcxbnRsTU1VdTRrZWhETEk2emVNN2I0MU41Y2RibElaUUIybFdIbWlSazlvcG16TjZjTjgyb05MRnAKK215UElubmdpSzNCRDQxVkhNV0VaNzFqRmhTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0sKK21ORVZYNThTdm53Mll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKK3ZFc1hDUysweXg1RGFNa0hKOEhTWFBmcUlibG9FcHc4bkwrZS9JQmNtMlBON0VlcUpTZG5vRGZ6QUlKOVZOZXArT2t1RTZOMzZCOUsKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ2VydHBsdXMgQ2xhc3MgMiBQcmltYXJ5IENBCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGtqQ0NBbnFnQXdJQkFnSVJBSVc5Uy9QWTJ1TnA5cFRYWDhPbFJDTXdEUVlKS29aSWh2Y05BUUVGQlFBd1BURUxNQWtHQTFVRQorQmhNQ1JsSXhFVEFQQmdOVkJBb1RDRU5sY25Sd2JIVnpNUnN3R1FZRFZRUURFeEpEYkdGemN5QXlJRkJ5YVcxaGNua2dRMEV3SGhjTgorT1Rrd056QTNNVGN3TlRBd1doY05NVGt3TnpBMk1qTTFPVFU1V2pBOU1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeQorZEhCc2RYTXhHekFaQmdOVkJBTVRFa05zWVhOeklESWdVSEpwYldGeWVTQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUAorQURDQ0FRb0NnZ0VCQU54UWx0QVMrRFhTQ0hoNnRsSncvVy91ejdrUnkxMTM0ZXpwZmdTTjFzeHZjME5YWUt3ekNrVHNBMThjZ0NTUgorNWFpUlZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUxrY0FibVh1WgorVmcydjd0SzhSMWZqZVVsN05Ja25KSVRlc2V6cFdFNytUdDlhdmtHdHJBakZHQTd2MGxQdWJOQ2RFZ0VUamR5QVl2ZVZxVVNJU25GTworWUZXZTJ5TVplVllIREQ5akMxeXc0cjUrRmZ5VU0xaEJPSFRFNFkrTDN5YXNIN1dMTzdkRFdXdXdKS1p0a0l2RWN1cGRNNWkzeTk1ZQorZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTBIR2Rwd1BGQzQwZXMvQ2djWmxVQ0F3RUFBYU9CakRDQmlUQVBCZ05WSFJNRQorQ0RBR0FRSC9BZ0VLTUFzR0ExVWREd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU0M010MzhzT0tBemUzYk9reW5tNGpydm9NSWt3RVFZSgorWUlaSUFZYjRRZ0VCQkFRREFnRUdNRGNHQTFVZEh3UXdNQzR3TEtBcW9DaUdKbWgwZEhBNkx5OTNkM2N1WTJWeWRIQnNkWE11WTI5dAorTDBOU1RDOWpiR0Z6Y3pJdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNuVk0rSVJCbkwzOVIvQU45V00ySzE5MUVCa092RAorUDlHSVJPa2tYZS9uRkwwZ3Q1bzhBUDV0bjl1UTNOZjBZdGFMY0YzbjVRUklxV2g4eWZGQzgyeC94WHA4SFZHSXV0SUtQaWRkM2kxUgorVHRNVFpHbmtMdVBUNTVzSm1hYmdsWnZPR3RkL3Zqek9Vck1SRmNFUEY4MER1NXdsRmJxaWRvbjhCdkVZMEpOTERueUN0NlgwOWwvKworN1VDbW5ZUjBPYm5jSG9VVzJpa2JoaU1BeWJ1SmZtNkFpQjR2RkxRREpLZ3lid09hUnl3d3ZsYkdwMElDY0J2cVFOaTZCUU53QjZTVworLy8xSU13cmgzS1dCa0p0TjNYM241N0xOWE1ocWxmaWw5bzNFWFhnSXZuc0cxa25QR1RaUUl5NEk1cDRGVFVjWTFSYnBzZGEyRU5XNworbDcraWpyUlUKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRFNUIFJvb3QgQ0EgWDMKKz09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURTakNDQWpLZ0F3SUJBZ0lRUksrd2dOYWpKN3FKTURtR0x2aEFhekFOQmdrcWhraUc5dzBCQVFVRkFEQS9NU1F3SWdZRFZRUUsKK0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVREa1JUVkNCU2IyOTBJRU5CSUZnek1CNFgKK0RUQXdNRGt6TURJeE1USXhPVm9YRFRJeE1Ea3pNREUwTURFeE5Wb3dQekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjEKK2NtVWdWSEoxYzNRZ1EyOHVNUmN3RlFZRFZRUURFdzVFVTFRZ1VtOXZkQ0JEUVNCWU16Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKK2dnRVBBRENDQVFvQ2dnRUJBTit2NlpkUUNJTlh0TXhpWmZhUWd1ekgweXhyTU1wYjdObkRmY2RBd1JnVWkrRG9NM1pKS3VNL0lVbVQKK3JFNE9yejVJeTJYdS9OTWhEMlhTS3RreWo0emw5M2V3RW51MWxjQ0pvNm02N1hNdWVnd0dNb09pZm9vVU1NMFJvT0VxT0xsNUNqSDkKK1VMMkFaZCszVVdPRHlPS0lZZXBMWVlIc1VtdTVvdUpMR2lpZlNLT2VETm9Kamo0WExoN2RJTjlieGlxS3F5NjljSzNGQ3hvbGtIUnkKK3hYdHFxelRXTUluLzVXZ1RlMVFMeU5hdTdGcWNraDQ5WkxPTXh0Ky95VUZ3N0JaeTFTYnNPRlU1UTlEOC9SaGNRUEdYNjlXYW00MGQKK3V0b2x1Y2JZMzhFVkFqcXIybTd4UGk3MVhBaWNQTmFEYWVRUW14a3F0aWxYNCtVOW01L3dBbDBDQXdFQUFhTkNNRUF3RHdZRFZSMFQKK0FRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNU25zYVI3TEhINjIrRkxrSFgveEJWZ2hZa1EKK01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQ2pHaXliRndCY3FSN3VLR1kzT3IrRHh6OUx3d21nbFNCZDQ5bFpSTkkrRFQ2OWlrdWcKK2RCL09FSUtjZEJvZGZwZ2EzY3NUUzdNZ1JPU1I2Y3o4ZmFYYmF1WCs1djNnVHQyM0FEcTFjRW12OHVYckF2SFJBb3NaeTVRNlhrakUKK0dCNVlHVjhlQWxyd0RQR3hyYW5jV1lhTGJ1bVI5WWJLK3JsbU02cFpXODdpcHhaelI4c3J6Sm13TjBqUDQxWkw5YzhQREhJeWg4YncKK1JMdFRjbTFEOVNaSW1sSm50MWlyL21kMmNYamJEYUpXRkJNNUpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlMKK2ZaR0wrVDB5aldXMDZYeXhWM2JxeGJZb09iOFZaUnpJOW5lV2FncU5kd3ZZa1FzRWpnZmJLYllLN3AyQ05UVVEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRFNUIEFDRVMgQ0EgWDYKKz09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVDVENDQXZHZ0F3SUJBZ0lRRFY2WkN0YWR0M2pzMkFkV080WVYyVEFOQmdrcWhraUc5dzBCQVFVRkFEQmJNUXN3Q1FZRFZRUUcKK0V3SlZVekVnTUI0R0ExVUVDaE1YUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUXhFVEFQQmdOVkJBc1RDRVJUVkNCQlEwVlQKK01SY3dGUVlEVlFRREV3NUVVMVFnUVVORlV5QkRRU0JZTmpBZUZ3MHdNekV4TWpBeU1URTVOVGhhRncweE56RXhNakF5TVRFNU5UaGEKK01Gc3hDekFKQmdOVkJBWVRBbFZUTVNBd0hnWURWUVFLRXhkRWFXZHBkR0ZzSUZOcFoyNWhkSFZ5WlNCVWNuVnpkREVSTUE4R0ExVUUKK0N4TUlSRk5VSUVGRFJWTXhGekFWQmdOVkJBTVREa1JUVkNCQlEwVlRJRU5CSUZnMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKK0FROEFNSUlCQ2dLQ0FRRUF1VDMxTE1tVTNIV0tsVjFqNklSM2RtYTVXWkZjUnQyU1BwLzVEZ08wUFdHU3ZTTW10V1B1a3RLZTFqekkKK0RaQmZaSUd4cUFnTlROajUwd1VvVXJRQkpjV1ZIQXgrUGhDRWRjL0JHWkZqeitpb2tZaTVRMUs3Z0xGVmlZc3grdEMzZHI1QlBUQ2EKK3BDSWxGM1BvSHVMVHJDcTlXemdoMVNwTDExVjk0enBWdmRkdGF3SlhhK1pIZkFqSWdycmVwNGM5b1cyNE1GYkNzd0tCWHkzMTRwb3cKK0dDaTRadFBMQVpadjZvcEZWZGJnbmY5bkt4Y0NwazRhYWhFTGZyZDc1NWpXakhadndUdmJVSk4rNWRDT0h6ZTR2YnJHbjJ6cGZEUHkKK01qd21SL29uSkFMSmZoMWJpRUlUYWpWOGZUWHBMbWFSY3BQVk1pYkVkUFZUbzdOZG12WUp5d0lEQVFBQm80SElNSUhGTUE4R0ExVWQKK0V3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdIR01COEdBMVVkRVFRWU1CYUJGSEJyYVMxdmNITkFkSEoxYzNSa2MzUXUKK1kyOXRNR0lHQTFVZElBUmJNRmt3VndZS1lJWklBV1VEQWdFQkFUQkpNRWNHQ0NzR0FRVUZCd0lCRmp0b2RIUndPaTh2ZDNkM0xuUnkKK2RYTjBaSE4wTG1OdmJTOWpaWEowYVdacFkyRjBaWE12Y0c5c2FXTjVMMEZEUlZNdGFXNWtaWGd1YUhSdGJEQWRCZ05WSFE0RUZnUVUKK0NYSUdUaGhERCtYV3pNTnFpekY3ZUkrb2c3Z3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS1BZanRheTI4NEY1ekxOQWRNRUErVjIKKzVGWXJuSm1RNkFnd2JOOTlQZTdsdjdVa1FJUko0ZEVvcnNUQ09sTXdpUEgxZDI1Unl2ci9tYThrWHh1Zy9mS3NoTXJmcWZCZkJDNnQKK0ZyOGhseENCUGVQL2g0MHkzSlRsUjRwZWFoUEpsSlU5MHU3SU5KWFFnTlN0TWdpQVZEemd2VkpUMTFKOHNtay9mM3JQYW5USytnUXEKK25FeGFCcVhwSUsxRlpnOXA4ZDIvNmVNeWkvcmd3WVpOY2p3dTJKTjRDaXI0Mk5JblBSbUpYMXA3aWp2TUROcFJyc2NMOXl1d053WHMKK3ZGY2o0ampTbTJqelZoS0lUMEo4dURIRXRkdmt5Q0UwNlVnUk5lNzZ4NUpYeFo4MDVNZjI5dzRMVEp4b2VIdHhNY2ZySHVCblFmTzMKK29LZk41WG96Tm1yNm1pcz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEK3pDQ0F1T2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnR6RS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCitiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0RBSlVVakVQCitNQTBHQTFVRUJ3d0dRVTVMUVZKQk1WWXdWQVlEVlFRS0RFMG9ZeWtnTWpBd05TQlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwCithY1dmYVcwZ2RtVWdRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMakFlRncwd05UQTFNVE14CitNREkzTVRkYUZ3MHhOVEF6TWpJeE1ESTNNVGRhTUlHM01UOHdQUVlEVlFRREREWlV3NXhTUzFSU1ZWTlVJRVZzWld0MGNtOXVhV3NnCitVMlZ5ZEdsbWFXdGhJRWhwZW0xbGRDQlRZY1NmYkdGNXhMRmp4TEZ6eExFeEN6QUpCZ05WQkFZTUFsUlNNUTh3RFFZRFZRUUhEQVpCCitUa3RCVWtFeFZqQlVCZ05WQkFvTVRTaGpLU0F5TURBMUlGVERuRkpMVkZKVlUxUWdRbWxzWjJrZ3hMQnNaWFJweFo5cGJTQjJaU0JDCithV3hweFo5cGJTQkh3N3gyWlc1c2FjU2ZhU0JJYVhwdFpYUnNaWEpwSUVFdXhaNHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCitBUThBTUlJQkNnS0NBUUVBeWxJRjFtTUQyQnhmM2RKN1hmSU1ZR0ZiYXp0MEszZ05mVVc5SW5Ub2pBUEJ4aEVxUFpXOHFaU3d1NUdYCit5R2w4aE1XMGtXeHNFMnFrVmEya2hlaVZmck1BcndEQ0JSajFjSjAyaTY3TDVCdUJmNU9JKzJwVnUzMkZrczY2V0ovYk1zVzlYZThpCitTaTlCQjM1SlliT0c3RTZtUVc2RXZBUHM5VHNjeUIvQzdxanU2aEpLalJUUDh3cmdVRG41Q0RYNEVWbXQ1eUxxUzhvVUJ0NUN1cktaCis4eTFVaUJBRzZ1RWFQajFuSC92TyszeUM2QkZkU3NHNUZPcFUyV2FiZklsOUJKcGl5ZWxTUEo2Yzc5TDFKdVRtNVJoOGkyN2ZiTXg0CitXMDl5c3N0Y1A0d0ZqZEZNaksyU3grRjRmMlZzU1FaUUxKNHl3dGRLeG5XS1dVNTFiMGRld1FJREFRQUJveEF3RGpBTUJnTlZIUk1FCitCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVY5VlgvTjVhQVdTR2svS0VWVENEMjFGL2FBeVQ4ejVBYTlDRUttdTQ2CitzV3J2Ny9oZzBVdzJaa1VkODJZQ2RBUjdrakNvM2dwMkQrK1ZicjNKTitZYURheUpTRnZNZ3piQzlVWmNXWUpXdE5YK0k3VFlWQnhFCitxOFNuNVJUT1BFRmhmRVBtemNTQkNZc2srMVFsMWhhb2xneG5CMit6VUVmakhDUW8zU3FZcEdIKzIrb1NON3dCR2pTRnZXNVA1NUZ5CitCMFNGSGxqS1ZFVGQ5Nnk1eTRraGN0dVB3R2twbHlxanJoZ2pseHhCS290OEtzRjhrT2lwS01EVGtjYXRLSWRBYUxYLzdLZlMwemdZCituTk45YVYzd3hxVWVKQnVqUi94cEIyam41SnEwN1EraGg0Y0N6b2ZTU0U3aHZQL0w4WEtTUkdRREplcmVXMjZmeWZKT3JOM0gKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFUERDQ0F5U2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnZqRS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCitiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0V3SlVVakVQCitNQTBHQTFVRUJ3d0dRVzVyWVhKaE1WMHdXd1lEVlFRS0RGUlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnCitRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMaUFvWXlrZ1MyRnp4TEZ0SURJd01EVXdIaGNOCitNRFV4TVRBM01UQXdOelUzV2hjTk1UVXdPVEUyTVRBd056VTNXakNCdmpFL01EMEdBMVVFQXd3MlZNT2NVa3RVVWxWVFZDQkZiR1ZyCitkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4TVFzd0NRWURWUVFHRXdKVVVqRVBNQTBHCitBMVVFQnd3R1FXNXJZWEpoTVYwd1d3WURWUVFLREZSVXc1eFNTMVJTVlZOVUlFSnBiR2RwSU1Td2JHVjBhY1dmYVcwZ2RtVWdRbWxzCithY1dmYVcwZ1I4TzhkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxpQW9ZeWtnUzJGenhMRnRJREl3TURVd2dnRWlNQTBHCitDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3BObjdEa1VOTXd4bVlDTWpIV0h0UEZveWx6a2tCSDNNT3JIVVRwdnFlCitMQ0RlMkpBT0N0RnAwaWY3cW5lZkoxSWw0c3RkMk5pRFVCZDlpcldDUHdTT3ROWHdTYWRrdHg0dVh5Q2NVSFZQcitHMVFSVDBtSktJCit4K1hsWkVkaFIzbjl3Rkh4d1pubjNNNXErNisxQVREY1JoenZpdXlWNzl6L3J4QWM2NTNZc0twcWhSZ05GOGsrdi9HYjBBbUpRdjJnCitRclNkaVZGVktjOGJjTHlFVkszQkV4K1k5QzUyWUl0ZFA1cXR5Z3kvcDFaYmozZTQxWjU1U1pJLzRQR1hKSHBzbXhjUGJlOVRtSkVyCis1QSsrV1hrSGVMdVhsZlNmYWRSWWh3cXA0OHkyV0JtZkppR3h4Rm1Oc2tGMXdLMXB6cHdBQ1BJMi96N3dvUThhckJUOXBtQVBBZ01CCitBQUdqUXpCQk1CMEdBMVVkRGdRV0JCVFpON05PQmYzWno1OFNGcTYyaVMvckpUcUlIREFQQmdOVkhROEJBZjhFQlFNREJ3WUFNQThHCitBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFISmdscmZKM05ncFhpT0ZYN0t6TFhiN2lOY1gvbnR0CitSYmoyaFd5Zkl2d3FFQ0xzcXJrdzlxdFkxamtRTVprcEFMMkpaa0g3ZE42UndSZ0xuN1ZoeTUwNnZ2V29sS01pVlc0WFNmL1NLZkU0CitKbDN2cGFvNitYRjc1dHBZSGROMHdnSDZQbWxZWDYzTGFMNFVMcHRzd0xiY29DYjZkeHJpSk5vYU4rQm5yZEZ6Z3cybEdoMXVFcEorCitoR0lBRjcyOEpSaFg4dGVwYjFtSXZEUzNMb1Y0blpiY0ZNTXNpbEtibG94U1pqMkdGb3RIdUZFSmpPcDl6WWh5czJBenNmQUtSTzhQCis5UWszaUNRT0xHc2dPcUw2RWZKQU5aeEVhR003ckROdlk3d3N1L0xTeTNaOWZZallIY2dGSFc2OGxLbG1qSGR4eC9xUitpOVJudWs1CitVcmJuQkVJPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTd2lzc1NpZ24gR29sZCBDQSAtIEcyCis9PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlZCQVlUQWtOSU1SVXcKK0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hIekFkQmdOVkJBTVRGbE4zYVhOelUybG5iaUJIYjJ4a0lFTkJJQzBnUnpJd0hoY04KK01EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkZNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHAKK2MzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlRkMmx6YzFOcFoyNGdSMjlzWkNCRFFTQXRJRWN5TUlJQ0lqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXIrVHVmb3NrRGhKdXFWQXRGa1E3a3BKY3lyaGRoSkpDRXlxOFpWZUNRRDVYSk0xUWl5VXEKK3QyLzg3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrYmJxQkhINUMKK2pDQTEyVU5OaFBxRTIxSXM4dzRuZHd0cnZ4RXZjbmlmTHRnKzVoZzNXaXB5K2RwaWtKS1Z5aCtjNmJNOEs4dnpBUk8vV3MvQnRRcGcKK3ZkMjFtV1JUdUtDV3MyL2lKbmVSak9CaUVBS2ZOQStrMVpJelVkNitqYnFFZW1BOGF0dWZLK3plM2dFL2JrM2xVSWJMdEsvdFJFREYKK3lscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlIKK0FpVHlzeWJVYTlvRVZlWEJDc2R0TURlUUt1U2VGRE5lRmhkVnhWdTF5elNKa3ZHZEpvK2hCOVRHc25oUTJ3d01DM3dMakVIWHVlbmQKK2pJajNvMDJ5TXN6WUY5ck50ODVtbmRUOVh2KzlsejRwZGVkK3AySllyeVUwcFVISFBid05VTW9EQXc4SVdoK1ZjM2hpdjY5eUZHa08KK3BlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaWFHNTlqZTg4M1dYMFhheFIKKzd5U0FycXBXbDIvNXJYM2FZVCtZZHp5bGtiWWNqQ2JhWmFJSmJjSGlWT081eWt4TWdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2kKK0dxSjNVTS9FWTVMc1J4bWQ2K1pyenNFQ0F3RUFBYU9CckRDQnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXcKK0F3RUIvekFkQmdOVkhRNEVGZ1FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjQKK09mUEFlR1plNkRybjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKK0wzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFDZTY0NVI4OGE3QTNoZm0KKzVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek9VWXJIVURGdTRVcCtHQzlwV2JZOVpJRXIKKzQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTVPMU0vd3lTVFZsdHBrdXpGd2JzNEFPUHNGNm00M01kOEFZT2YKK01rZTZVaUkwSFRKNkNWYW5mQ1UycVQxTDJzQ0Nid3E3RXNpSFN5Y1IrUjR0eDVNL250dGZKbXRTMlM2SzhSVEdSSTBWcWJlL3ZkNm0KK0d1NnVMZnRJZHhmK3UreXZHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHAKK21vL2E3N0t3UEorSGJCSXJaWEFWVWpFYUpNOXZNU05RSDR4UGp5UERkRUZqSEZXb0ZOMCs0RkZRei9FYk1GWU9rckNDaGRpRHl5SmsKK3ZDMjRKZFZVb3JnRzZxMlNwQ1Nnd1lhMVNoTnFSODh1QzFhVlZNdk9tdHRxdEtheTIwRUloaWQzOTJxZ1Ftd0xPTTdYZFZBeWtzTGYKK0t6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnIKK05VMExiYnFoUGNDVDRIOGpzMVd0Y2lWT1J2blNGdSt3Wk1FQm51bktvR3FZRHMvWVlQSXZTYmprUXVFNE5SYjB5RzVQOTRGVzZMcWoKK3ZpT3ZydjF2QStBQ096QjIraHR0UWM4QnNlbTR5V2IwMnliek9xUjA4a2trVzhtdzBGZkIrajU2NFpmSgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTd2lzc1NpZ24gU2lsdmVyIENBIC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGdlRDQ0E2V2dBd0lCQWdJSVR4dlVMMVM3TDBzd0RRWUpLb1pJaHZjTkFRRUZCUUF3UnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUCitCZ05WQkFvVERGTjNhWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNQjRYCitEVEEyTVRBeU5UQTRNekkwTmxvWERUTTJNVEF5TlRBNE16STBObG93UnpFTE1Ba0dBMVVFQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zCithWE56VTJsbmJpQkJSekVoTUI4R0ExVUVBeE1ZVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHCis5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBeFBHSGY5TjRNZmM0eWZqRG1VTzh4L2U4TitkT2NicExqNlZ6SFZ4dW1LNERWNjQ0CitOME12RnowZnlNNW9FTUY0cmhrREt4RDZMSG1EOXVpNWFMbFY4Z1JFcHpuNS9BU0xIdkdpVFNmNVlYdTZ0K1dpRTdicllUN1FiTkhtCisrL3BlN1IyMG5xQTFXNkdTeS9CSmt2NkZDZ1UrNXRrTDRrKzczSlUzL0pIcE1qVWkwUjg2VGllRm5iQVZsRExhWVExSFRXQkNycEpICis2SU5hVUZqcGlvdTVYYUhjM1psS0h6Wm51MGprZzdZMzYwZzZydzluanhjSDZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1CitNR29NOVpEdWxlYnl6WUxzMmFGSzdQYXlTK1ZGaGVadGVKTUVMcHlDYlRhcHhERmtINGFEQ3lyME5RcDR5VlhQUWJCSDZUQ2ZtYjVoCitxQWFFdVNoNlh6alpHNms0c0lOL2M4SERPMGdxZ2c4aG03ak1xRFhEaEJ1RHN6NitwSlZwQVRxSkFIZ0UyY24wbVJtclZuNWJpNFk1CitGWkdrRUN3Sk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkhIVEJzCitST29wTjRXU2FHYThnemorZXprdTAxRHdIL3RlWUxhcHB2b25RZkdiR0hMeTlZUjBTc2xueEZTdVNHVGZqTkZ1c0IzaEI0OElIcG1jCitjZWxNMktYM1J4SWZkTkZSbm9iendxSWpRQXR6MjB1bTUzTUdqTUdnNmNGWnJFYjY1aS80ejNHY1JtMjV4QldOT0hrRFJVanZ4RjNYCitDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0JyRENCcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCitCQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVGNkROd2VSQnRqcGJPOHRGbmIwY3dwajZobGd3SHdZRFZSMGpCQmd3Rm9BVUY2RE53ZVJCCit0anBiTzh0Rm5iMGN3cGo2aGxnd1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRURBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwCitjRG92TDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUhQR2dlQW4waTBQCis0SlV3NHBwQmYxQXNYMTlpWWFtR2Fta1lESFJKMWwyRTZrRlNHRzlZclZCV0lHckd2U2hwV0pIY2tSRTFxVG9kdkJxbFlKN1lIMzlGCitrV25aZnJ0NGNzRUdEeXJPajRWd1lheWd6UXU0T1NsV2hESk9ocnM5eENyWjF4OXk3djVSb1NKQnNYRUNZeHFDc0dLclhsY1NIOS9MCiszWFdnd0YxNWtJd2I0RkRtM2pIK21IdHdYNldRMkszNEFyWnYwMkRkUUVzaXhUMnRPbnFmR2hwSGtYa3p1b0xjTW1rRGxtNGZTL0J4CisvdU5uY3FDeHYxeUw1UHFaSXNlRXVSdU5JNWMvN1NYZ3oyVzc5V0VFNzkwZXNscEJJbHFobjEwczZGdkpiYWtNREhpcVlNWldqd0ZhCitER2k4YVJsNXhCOStsd1cveGVra1VWN1UxVXRUN2RraldqWURaYVBCQTYxQk1QTkdHNFdRcjJXMTFiSGtGbHQ0ZFIyWGVtMVpxU3FQCitlOTdEaDRrUW1VbHplTWc5dlZFMWRDclY4WDVwR3lxN083MGx1SnBhUFhKaGtHYUg3Z3pXVGRRUmRBdHEvZ3NEL0tOVlY0bitTc3V1CitXeGNGeVBLTkl6RlRPTkl0YWorQ3VZMElhdmRlUVhSdXd4RitCNndwWUpFL09NcFhFQTI5TUMvSHBlWkJvTnF1QlllYW9LUmxiRXdKCitESW02dU5PNXdKT0tNUHFONVpwckZRRk9aNnJhWWxZK2hBaG0wc1EyZmFjK0VQeUk0TlNBNVFDOXF2Tk9CcU42YXZsaWN1TUpUK3ViCitEZ0VqOForN2ZOemNiQkdYSmJMeXRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGZEQ0NBbVNnQXdJQkFnSVFHS3kxYXYxcHRoVTZZMnl2MnZyRW9UQU5CZ2txaGtpRzl3MEJBUVVGQURCWU1Rc3dDUVlEVlFRRworRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFeE1DOEdBMVVFQXhNb1IyVnZWSEoxYzNRZ1VISnBiV0Z5ZVNCRAorWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeE1qY3dNREF3TURCYUZ3MHpOakEzTVRZeU16VTVOVGxhTUZneAorQ3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUQorY21sdFlYSjVJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQgorQ2dLQ0FRRUF2cmdWZS8vVWZIMW5yWU5rZThoQ1V5M2Y5b1FJSUdIV0FWbHFuRVFScis5Mi9aVit6bUV3dTNxRFh3SzlBV2JLN2hXTgorYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakFaSVZjRlUySXg3ZTY0SFhwclFVOQorbmNlSlNPQzdLTWdENFRDVFpGNVN3Rmx3SWpWWGlJcnhsUXFEMTd3eGN3RTA3ZTlHY2VCckFxZzFjbXVYbTJiZ3l4eDVYOWdhQkdnZQorUndMbW5XRGlOcGNCMzg0MWt0KytaOGR0ZDFrN2o1M1drQldVdkVJMEVNRTUrYkVuUG43V2luWEZzcStXMDZMZW0rU1l2bjNoNllHdAordG0vODF3N2E0RFN3RFJwMzUrTUltTzlZK3B5RXR6YXZ3dCtzMHZRUUJuQnhOUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRAorQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUxOVlFRWmNWaS9DUE5tRmJTdnRyMlpuSk01SXdEUVlKS29aSQoraHZjTkFRRUZCUUFEZ2dFQkFGcHdmeXpkdHpSUDlZWlJxU2ErUzdpcThYRU4zR0hIb09vMEhucDNEd1ExNkNlUGJKQy9rUllrUmo1SworVHM0ckZ0VUxVaDM4SDJlaUFrVXhUODd6K2dPbmVaMVRhdG5hWXpyNGdOZlRtZUdsNGI3VVZYR1lOVHEraytxdXJVS3lrRy9nL0NGTgorTldNemlVbldtMDdLeCtkT0NRRDMyc2Z2bVdLWmQ3YVZJbDZLb0t2MHVIaVl5amdabWNseW5uak5TNnl2R2FCekVpMzh3a0c2Z1pIYQorRmxveHQvbTBjWUFTU0pseWMxcFpVOEZqVWpQdHA4blNPUUp3K3VDeFFtWXBxcHRSN1RCVUloUmYyYXNkd2VTVThQajFLL2ZxeW5oRworMXJpUi9hWU5LeG9VQVQ2QThFS2dsUWRlYmMzTVM2UkZqYXNTNkxQZVd1V2dmT2dQSWgxYTZWaz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKwordGhhd3RlIFByaW1hcnkgUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCcVRFTE1Ba0dBMVVFCitCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyCithV05sY3lCRWFYWnBjMmx2YmpFNE1EWUdBMVVFQ3hNdktHTXBJREl3TURZZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2CitjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WQkFNVEZuUm9ZWGQwWlNCUWNtbHRZWEo1SUZKdmIzUWdRMEV3SGhjTk1EWXhNVEUzCitNREF3TURBd1doY05Nell3TnpFMk1qTTFPVFU1V2pDQnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnCitTVzVqTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12CitLR01wSURJd01EWWdkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4SHpBZEJnTlZCQU1UCitGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNzCitvUEQ3Z0ZuVW5NZWt6NTJoV1hNSkVFVU1EU3h1YVBGc1cwaG9TVmszL0FzekdjSjNmOHdRTFpVMEhPYnJUUW1uSE5LNHlaYzJBcmVKCisxQ1JmQnNETVJKU1VqUUppYit0YTNSR05LSnBjaEpBUWVnMjlkR1l2YWppZzR0VlVST3NkQjU4SHVtL3U2ZjFPQ3luMVBvU2dBZkdjCitxL2djZm9tazZLSFljV1VObzFGNzdyelNJbUFOdVZ1ZDM3cjhVVnNMcjVpeTZTN3BCT2hpaDk0cnlOZE93VXhrSHQzUGgxaTZTay9LCithQWNkSEoxS3h0VXZrY3g4Y1hJY3hjQm42ekw5eVpKY2xOcUZ3SnUvVTMwckNmU01uWkVmbDJwU3k5NEpOcVIzMkh1SFVFVFZQbTRwCithZnM1U1NZZUNhV0FlMEF0NitnbmhjbitZZjErNW55WEhkV2RBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lECitWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSN1cwWFByODdMZXYweGtocHF0dk5HNjFkSVVEQU5CZ2txaGtpRzl3MEJBUVVGCitBQU9DQVFFQWVSSEFTN09SdHZ6dzZXZlVEVzVGdmxYb2s5TE9Bei90MmlXd0hWZkxIanAyb0V6c1VIYm9aSElNcEtueHVJdlcxb2VFCit1ekxsUVJIQWQ5bXpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCit4UGNXNmNUWWN2bkljM3pmRmk4VnFUNzlhaWUyb2V0YXVwZ2YxZU5OWkFxZEU4aGh1dlU1SEllNnVMMTdJbi8yL3F4QWVlV3NFRzg5CitqeHQ1ZG92RU43TWhHSVRsTmdEcll5Q1p1ZW4rTXdTN1FjakJBdmxFWXlDZWdjNUMwOVkvTEhiVFk1eFozWSttNFE2Z0xrSDNMcFZICit6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3alZhTWFBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQnlqRUxNQWtHQTFVRQorQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbmJpQlVjblZ6ZENCTworWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaGRYUm9iM0pwZW1WaworSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdFlYSjVJRU5sY25ScAorWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6VXdIaGNOTURZeE1UQTRNREF3TURBd1doY05Nell3TnpFMk1qTTFPVFU1V2pDQgoreWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTEV4WldaWEpwVTJsbgorYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVG93T0FZRFZRUUxFekVvWXlrZ01qQXdOaUJXWlhKcFUybG5iaXdnU1c1akxpQXRJRVp2Y2lCaAorZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuYmlCRGJHRnpjeUF6SUZCMVlteHBZeUJRY21sdAorWVhKNUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6VXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdworZ2dFS0FvSUJBUUN2SkFnSUtYbzFubUFNcXVkTE8wN2NmTHc4UlJ5N0srRCtLUUw1VndpalpJVVZKL1h4cmNneGlWMGk2Q3FxcGtLegorai9pNVZiZXh0MHV6L285K0IxZnM3MFBiWm1JVlljOWdEYVRZM3ZqZ3cySUlQVlFUNjBuS1dWU0ZKdVVyanh1ZjYvV2hrY0l6U2RoRAorWTJwU1M5S1A2SEJSVGRHSmFYdkhjUGF6M0JKMDIzdGRTMWJUbHI4VmQ2R3c5S0lsOHE4Y2ttY1k1ZlFHQk8rUXVlUUE1TjA2dFJuLworQXJyMFBPN2dpK3MzaSt6MDE2enk5dkE5cjkxMWtUTVpIUnhBeTNRa0dTR1QyUlQrckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcgorZmsvRmxhNE9uZFRSUThCbmMrTVVDSDdsUDU5enVETUt6MTAvTkllV2l1NVQ2Q1VWQWdNQkFBR2pnYkl3Z2E4d0R3WURWUjBUQVFILworQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdiUVlJS3dZQkJRVUhBUXdFWVRCZm9WMmdXekJaTUZjd1ZSWUphVzFoWjJVdgorWjJsbU1DRXdIekFIQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQorYVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZIL1RaYWZDM2V5NzhEQUo4ME01K2dLdk16RXpNQTBHQ1NxRworU0liM0RRRUJCUVVBQTRJQkFRQ1RKRW93WDJMUDJCcVlMejNxM0prdHZYZjJwWGtpT096RXA2QjRFcTFpRGtWd1pNWG5sMll0bUFsKworWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WTVnYVJRQmk1K01IdDM5dEJxdUNXSU1uTlpCVTRnY21VN3FLRQorS1FzVGI0N2JETjBsQXR1a2l4bEUwa0Y2QldsS1dFOWd5bjZDYWdzQ3FpVVhPYlhiZitlRVpTcVZpcjJHM2w2QkZvTXRFTXplL2FpQworS20wb0h3MEx4T1huR2lZWjRmUVJieEMxbGZ6blFnVXkyODZkVVY0b3RwNkYwMXZ2cFgxRlFIS090dzVyRGdiN016VkljYmlkSjR2RQorWlY4TmhuYWNSSHIybFZ6MlhUSUlNNlJVdGhnL2FGenlRa3FGT0ZTRFg5SG9MUEtzRWRhbzdXTnEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU2VjdXJlVHJ1c3QgQ0EKKz09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKK0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhGekFWQmdOVkJBTVREbE5sWTNWeVpWUnkKK2RYTjBJRU5CTUI0WERUQTJNVEV3TnpFNU16RXhPRm9YRFRJNU1USXpNVEU1TkRBMU5Wb3dTREVMTUFrR0ExVUVCaE1DVlZNeElEQWUKK0JnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKK0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVgKK09aRXpadW0rNFlPdllseUowZndrVzJHejRCRVJRUndkYnZDNHUvamVwNEc2cGtqR254Mjl2bzZwUVQ2NGxPMHBHdFNPMGdNZEErOXQKK0RXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKK0dGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqN0RhVWFIcDNwTEhuRGkrQmV1SzFjb2J2b211TDhBL2IKKzAxay91bks4UkNTYzQzT3o5NjlYTDBJbW5hbDB1Z0JTOGt2TlUzeEhDemFGRG1hcENKY1dORmZCWnZlQTQrMXdWTWVUNEM0b0ZWbUgKK3Vyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KK0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVVFqSzJGdm9FL2Y1ZFMzckQvZmRNUUIxYVE2OHdOQVlEVlIwZkJDMHdLekFwb0NlZ0pZWWoKK2FIUjBjRG92TDJOeWJDNXpaV04xY21WMGNuVnpkQzVqYjIwdlUxUkRRUzVqY213d0VBWUpLd1lCQkFHQ054VUJCQU1DQVFBd0RRWUoKK0tvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKK1NjZU5RUWNTYzVSK0RDTWgvYndRZjJBUVduTDFtQTZzN0xsLzNYcHZYZE1jOVArSUJXbENxUVZ4eUxlc0p1Z3V0SXhxLzNIY3VMSGYKK21ieDhJVlFyNUZpaXUxY3BycDZwb3hrbUQ1a3VDTER2L1duUG1Sb0pqZU9ubnl2Sk5qUjdKTE40VEpVWHBBWW1IclprVWpaZllHZloKK25NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKKzNJdEh1dUc1MVdMUW9xRDBad1Y0S1dNYWJ3VFcrTVpNbzVxeE43U041U2hMSFo0c3dyaG92TzBDN2pFPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTZWN1cmUgR2xvYmFsIENBCis9PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR2RENDQXFTZ0F3SUJBZ0lRQjFZaXBPalVpb2xOOUJQSThQanFwVEFOQmdrcWhraUc5dzBCQVFVRkFEQktNUXN3Q1FZRFZRUUcKK0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkgKK2JHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKK01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2cKK1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdk5TN1lyR3hWYVFaeDVSTm9KTE5QMk13aFIvangKK1lEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKK2JxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKam5JRkhvdmRSSVdDUXRCSndCMWcKKzhORVhMSlhyOXFYQmtxUEZ3cWNJWUExZ0JCQ1dlWjRXTk9hcHR2b2xSVG5JSG1YNWsvV3E4VkxjbVpnOXBZWWFERFV6K2t1bEJBWVYKK0hER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKKzBYUG5qM3BEQWdNQkFBR2pnWjB3Z1pvd0V3WUpLd1lCQkFHQ054UUNCQVllQkFCREFFRXdDd1lEVlIwUEJBUURBZ0dHTUE4R0ExVWQKK0V3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSzlFQk1KQmZraUQyMDQ1QXV6c2hIcm16c21rTURRR0ExVWRId1F0TUNzd0thQW4KK29DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKK01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQmpHZ2hBZmFSZVV3MTMySHF1SHcwTFVSWUQ3eGg4eU9PdmFsaVRGR0NSc29UY2lFNisKK09ZbzY4K2FDaVYwQk43T3JKS1FWRHBJMVdrcEVYazVYK25YT0gwak9adlE4UUNhU21Hd2I3aVJHREJlelVxWGJwWkdSenpmVGIrY24KK0NEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKKzNDWU52NlpIZEFiWWlORTZLVENFenRJNWdHSWJxTWRYU2J4cVZWRm5GVXErTlFmazFYV1lOM2t3Rk5zcG5XekZhY3hIVmFJdzk4eGMKK2Y4TERtQnhyVGhhQTYzcDRaVVdpQUJxdkRBMVZaRFJJdUpLNThiUlFLZkpQSXgvYWJLd2ZST0hkSTNoUlc4Y1cKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUhUQ0NBd1dnQXdJQkFnSVFUb0V0aW9KbDRBc0M3ajQxQWtibFBUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmdURUxNQWtHQTFVRQorQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRworQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVkJBTVRIa05QVFU5RVR5QkRaWEowYVdacFkyRjBhVzl1SUVGMQorZEdodmNtbDBlVEFlRncwd05qRXlNREV3TURBd01EQmFGdzB5T1RFeU16RXlNelU1TlRsYU1JR0JNUXN3Q1FZRFZRUUdFd0pIUWpFYgorTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRAorVDAxUFJFOGdRMEVnVEdsdGFYUmxaREVuTUNVR0ExVUVBeE1lUTA5TlQwUlBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQorTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwRUNMaTNMamtSdjNVY0ViVkFTWTA2bS93ZWFLWFR1SAorKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dworeEhHelV2QWhUYUhZdWpsOEhKNmpKSjN5Z3hhWXFoWjhRNXNWVzdldU5KSCsxR0ltR0VhYVArdkIrZkdRVit1c2VnMkwyM0l3YW1iVgorNEVhamNOeG8yZjhFU0lsMzNyWHArMmR0UWVtOE9iMHkyV0lDOGJHb1BXNDNuT0l2NHRPaUpvdkd1RlZEaU9FalBxWFNKRGxxUjZzQQorMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQorckxzbTl3SURBUUFCbzRHT01JR0xNQjBHQTFVZERnUVdCQlFMV09XTHhrd1ZONlJBcVRDcEliNUhObHBXL3pBT0JnTlZIUThCQWY4RQorQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QkpCZ05WSFI4RVFqQkFNRDZnUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbU52Ylc5aworYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQworQVFFQVBwaWVtL1liNmRjNXQzaXVIWElZU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUAorT0dFSXFCNkJDc0F2SUM5Qmk1SGNTRVc4OGNiZXVuWnJNOGdBTFRGR1RPM25uYytJbFA4endGYm9KSVltdU5nNE9OOHFhOTBTek1jLworUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYworSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZEJBNitDNE9tRjRPNU1CS2d4VE1WQmJrTgorKzhjRmR1UFlTbzM4TkJlanhpRW92akJGTVI3SGVMNVlZVGlzTytJQlpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworTmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDVqQ0NBczZnQXdJQkFnSVFWOHN6YjhKY0Z1WkhGaGZqa0RGbzREQU5CZ2txaGtpRzl3MEJBUVVGQURCaU1Rc3dDUVlEVlFRRworRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdU1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcgorSUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dIaGNOTURZeE1qQXhNREF3TURBd1doY05Namt4TWpNeAorTWpNMU9UVTVXakJpTVFzd0NRWURWUVFHRXdKVlV6RWhNQjhHQTFVRUNoTVlUbVYwZDI5eWF5QlRiMngxZEdsdmJuTWdUQzVNTGtNdQorTVRBd0xnWURWUVFERXlkT1pYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURrdkg2U01HM0cySTRyQzd4R3p1QW5sdDdlK2ZvUzB6d3pjN01FTDd4eAorak9XZnRpSmdQbDlkemduL2dnd2JtbEZRR2lhSjNkVmhYUm5jRWc4dENxSkRYUmZRTkpJZzZuUFBPQ3dHSmdsNmN2ZjZVREw0d3BQVAorYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmxtR05wU0FXK0x2OHp0dW1YV1duNFp4bXVrMkdXUkJYVAorY3JBL3ZHcDk3RWgvamNPcnFuRXJVMmxCVXpTMXNMbkZCZ3JFc0VYMVFWMXVpVVY3UFRzbWpIVEM1ZExSZmJJUjFQdFlNaUthZ01uYworL1F6cGYxNERsODQ3QUJTSEozQTRxWTV1c3lkMm1GSGdCZU1ocXhyVmhTSThLYldhRnNXQXFQUzdhekNQTDBZQ29yRU1JdURUQWdNQgorQUFHamdaY3dnWlF3SFFZRFZSME9CQllFRkNFd3lmc0ExMDZZMm9lcUt0Q25MckZBTWFkTU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUAorQmdOVkhSTUJBZjhFQlRBREFRSC9NRklHQTFVZEh3UkxNRWt3UjZCRm9FT0dRV2gwZEhBNkx5OWpjbXd1Ym1WMGMyOXNjM05zTG1OdgorYlM5T1pYUjNiM0pyVTI5c2RYUnBiMjV6UTJWeWRHbG1hV05oZEdWQmRYUm9iM0pwZEhrdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQQorQTRJQkFRQzdya3ZudDFmcmY2b3R0M05IaFdyQjVLVWQ1T2M4NmZSWlpYZTFlbHRhalNVMjRIcVhMampBVjJDRG1BYURuN2wyZW01UQorNExxSUxQeEZ6Qml3bVpWUkR1d2R1SWovaDFBY2dzTGo0REtBdjZBTFI4akRNZStaWnpLQVR4Y2hlUXhwWE41ZU5LNEN0U2JxVU45LworR0dVc3lmSmo0YWtIL254eEgyc3pKR29lQmZjRmFNQnFFc3N1WG1ITHJpalRmc0swWnBFbVh6d3VKRi9MV0EvcktPeXZFWmJ6M0h0dgord0tlSThsTjNzMkJlcnE0bzJqVXNielJGMHliaDN1eGJUeWRyRm55OVJBUVlnck9KZVJjUWNUMTZvaFpPOVFITnBHeGxhS0ZKZGx4RAoreWRpOE5tZHNwWlMxMU15NXZXbzFWaUhlMk1Qcis4dWtZRXl3VmFDZ2UxZXkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworV2VsbHNTZWN1cmUgUHVibGljIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRXZUQ0NBNldnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JoVEVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvTQorRjFkbGJHeHpJRVpoY21kdklGZGxiR3h6VTJWamRYSmxNUnd3R2dZRFZRUUxEQk5YWld4c2N5QkdZWEpuYnlCQ1lXNXJJRTVCTVRZdworTkFZRFZRUUREQzFYWld4c2MxTmxZM1Z5WlNCUWRXSnNhV01nVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt3SGhjTgorTURjeE1qRXpNVGN3TnpVMFdoY05Nakl4TWpFME1EQXdOelUwV2pDQmhURUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9NRjFkbAorYkd4eklFWmhjbWR2SUZkbGJHeHpVMlZqZFhKbE1Sd3dHZ1lEVlFRTERCTlhaV3hzY3lCR1lYSm5ieUJDWVc1cklFNUJNVFl3TkFZRAorVlFRRERDMVhaV3hzYzFObFkzVnlaU0JRZFdKc2FXTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUR1YjdTOWVlS1BDQ0dlT0FSQkplK3JXeHhUa3F4dG50M0N4QzVGbEFNMQoraUdkMFYrUGZqTGluZG84Nzk2akUyeWxqRHBGb05vcVhqb3B4YUFrSDVPalVEay80MWl0TXBCYjU3ME9ZajdPZVV0OXRrVG1QT0wxMworaTBOajY3ZVQvREJNSEFHVHRoUDc5NkVmdnlYaGREY3NIcVJlUEdqNFM3OE51UjR1TnVpcDVLZjREOHVDZFh3MUxTTFd3cjhMODdUOAorYkpWaEhsZlhCSUV5ZzFKNTVvTmp6N2ZMWTRzUjRyMWU2L2FON1pWeUtMU3NFbUxwU2pQbWd6S3VCWFdWdllTVjJ5cGNtNDR1RExpQgorSzBIbU9GYWZTWnRzZHZxS1hmY0JlWUY4d1lOQUJmNXgvUXcvekU1Z0NRNWxSeEF2QWNBRlA0LzRzMEh2V2tKK1dlL1Nsd3hsQWdNQgorQUFHamdnRTBNSUlCTURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTURrR0ExVWRId1F5TURBd0xxQXNvQ3FHS0doMGRIQTZMeTlqY213dQorY0d0cExuZGxiR3h6Wm1GeVoyOHVZMjl0TDNkemNISmpZUzVqY213d0RnWURWUjBQQVFIL0JBUURBZ0hHTUIwR0ExVWREZ1FXQkJRbQorbFJrUTJlaWhsNUgvM0JuWnRRUSswbk1LYWpDQnNnWURWUjBqQklHcU1JR25nQlFtbFJrUTJlaWhsNUgvM0JuWnRRUSswbk1LYXFHQgoraTZTQmlEQ0JoVEVMTUFrR0ExVUVCaE1DVlZNeElEQWVCZ05WQkFvTUYxZGxiR3h6SUVaaGNtZHZJRmRsYkd4elUyVmpkWEpsTVJ3dworR2dZRFZRUUxEQk5YWld4c2N5QkdZWEpuYnlCQ1lXNXJJRTVCTVRZd05BWURWUVFEREMxWFpXeHNjMU5sWTNWeVpTQlFkV0pzYVdNZworVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSG1DQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFMa1ZzVVNSekNQSQorSzAxMzQvaWFleWNOelhLN21RREtmR1laVU1iVm1PMnJ2d05hNVUzbEhzaFBjWmVHMWVNZC9aREpQSFYzVjNwOStONzAxTlgzbGVaMAorYmgwOHJueWQyd0lEQlN4eFN5VStCK05lbXZWbUZ5bUlHamlmejZwQkE0U1hhNU00ZXNvd1JCc2tSRFBRNU5IY0tEajBFME0xTlNsagorcUh5aXRhMDRwTzJ0L2NhYUgvK1hjLzc3c3pXbms0YkdkcEVBNXF4UkZzUW5NbHpiYzlxbGsxZU9QbTAxSmdoWjFlZEUxM1lnWStlcworRTJmRGJiRndSbnpWbGhFOWlXOWRxS0hyalFyYXd4MHpiS1BxWnhtYW1YOUxQWU5SS2gzS0w0WU1vbjRRTFN2VUZwVUxCNm91RkpKSgordHlsdjJHMHhmZlg4b1JBSGg4NHZXZHcrV05zPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUxNQWtHQTFVRUJoTUMKK1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUUKK0NoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKK2RYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQ1IwSXgKK0d6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVIKK1EwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KK2IzSnBkSGt3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUURSM3N2ZGNtQ0ZZWDdkZVNSRnRTcllwbjFQbElMQnM1QkFIK1gKKzRRb2tQQjBCQk80OTBvMEpsd3pnZGVUNiszZUtLdlVEWUVzMml4WWpGcTBKY2ZSSzlDaFF0UDZJSEc0L2JDOHZDVmxicFZzTE01bmkKK3d6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKK0JBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLQmdncWhrak9QUVFEQXdOb0FEQmxBakVBN3dOYmVxeTNlQXB5dDRqZi83VkcKK0ZBa0srcURtZlFqR0dvZTlHS2h6dlNiS1lBeWR6cG1mejF3UE1PRytGREhxQWpBVTlKTThTYWN6ZXBCR1I3TmpmUk9iVHJkdkdEZUEKK1UvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitJR0MvQQorPT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUFqQ0NBdXFnQXdJQkFnSUZPUkZGRUpRd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z1lVeEN6QUpCZ05WQkFZVEFrWlNNUTh3RFFZRAorVlFRSUV3WkdjbUZ1WTJVeERqQU1CZ05WQkFjVEJWQmhjbWx6TVJBd0RnWURWUVFLRXdkUVRTOVRSMFJPTVE0d0RBWURWUVFMRXdWRQorUTFOVFNURU9NQXdHQTFVRUF4TUZTVWRETDBFeEl6QWhCZ2txaGtpRzl3MEJDUUVXRkdsblkyRkFjMmRrYmk1d2JTNW5iM1YyTG1aeQorTUI0WERUQXlNVEl4TXpFME1qa3lNMW9YRFRJd01UQXhOekUwTWpreU1sb3dnWVV4Q3pBSkJnTlZCQVlUQWtaU01ROHdEUVlEVlFRSQorRXdaR2NtRnVZMlV4RGpBTUJnTlZCQWNUQlZCaGNtbHpNUkF3RGdZRFZRUUtFd2RRVFM5VFIwUk9NUTR3REFZRFZRUUxFd1ZFUTFOVAorU1RFT01Bd0dBMVVFQXhNRlNVZERMMEV4SXpBaEJna3Foa2lHOXcwQkNRRVdGR2xuWTJGQWMyZGtiaTV3YlM1bmIzVjJMbVp5TUlJQgorSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXNoL1IwR0xGTXp2QUJJYUlzOXo0aVBmOTMwUGZlbzJhU1Z6MgorVHFyTUhMbWg2eWVKOGticE8wcHgxUjJPTGMvbXJhdGpVTWRVQzI0U3laQTJ4dGd2MnBHcWFNVnkvaGNLc2hkK2ViVXlpSERLY01DVworU283a1ZjMGRKNVMvem5JcTdGejVjeUQrdmZjdWlXZTR1MGR6RXZmUk5XazY4Z3E1cnY5R1FrYWl2NkdGR3ZtLzVQOUpoZmVqY0lZeQorSEYyZllQZXByYVgvejlFMCtYMWJGOGJjMWc0b2E4TGQ4ZlV6YUoxTy9JZDhOaExXbzREb1F3MVZZWlRxWkRkSDZuZkswTEpZQmNOZAorZnJHb1JwQXhWczV3S3BheU1MaDM1bm5BdlNrNy9aUjNUTDBnelVFbDRDN0hHN3Z1cEFSQjBsMnRFbXFLbTBmN3lkMUdRT0dkUERQUQordFFJREFRQUJvM2N3ZFRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQlJqQVZCZ05WSFNBRURqQU1NQW9HQ0NxQgorZWdGNUFRRUJNQjBHQTFVZERnUVdCQlNqQlM4WVlGRENpUXJkS3lGUC80NU9xREF4TmpBZkJnTlZIU01FR0RBV2dCU2pCUzhZWUZEQworaVFyZEt5RlAvNDVPcURBeE5qQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFCZHdtMlBwM0ZVUm8vQzltT25UZ1hlUXAvd1lIRTRSSworcTg5dG9COVJsUGhKeTNRMkZMd1YzZHVKTDkyUG9GMTg5UkxybjU0NHBFZk1zNWJadnB3bHF3TitNdytWZ1EzOUZ1Q0l2amZ3YkYzUQorTVpzeUsxMFhaWk9ZWUx4dWo3R29QQjdaSFBPcEprTDVaQjNDNTVMMjlCNWFxaGxTWGEvb292ZGdvUGFOOEluMWJ1QUtCUUdWeVlzZworQ3JwYS9Kb3NQTDNEdDhsZGVDVUZQMVlVbXd6YSt6cEkvcGRwWHNvUWh2ZE9sZ1FJVGV5d3ZsM2NPNDVQd2YyYU5qU2FURlIrRndOSQorbFFnUkhBZHZoUWgrWFUzRW5kdjdyczZ5MGJPNGcyd2Rzck41OGRod21YN3dFd0xPWHQxUjA5ODJnYUViZUM5eHMvRlpURVlZS0t1RgorMG1CV1dnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGZUQ0NBbVdnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQmdNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYworVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFcU1DZ0dBMVVFQ3hNaFUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaAorZEdsdmJpQkZWaUJTYjI5MFEwRXhNQjRYRFRBM01EWXdOakF5TVRJek1sb1hEVE0zTURZd05qQXlNVEl6TWxvd1lERUxNQWtHQTFVRQorQmhNQ1NsQXhKVEFqQmdOVkJBb1RIRk5GUTA5TklGUnlkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4S2pBb0JnTlZCQXNUSVZObAorWTNWeWFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1JWWWdVbTl2ZEVOQk1UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQworQVFvQ2dnRUJBTHgvN0ZlYkpPRCtuTHBDZWFtSWl2cUE0UFVIS1VQcWpnbzBObzBjK3FlMU9Yai9sM1gzTCtTcWF3U0VSTXFtNG1pTworL1ZWUVlnK2tjUTdPQnpndFFvVlFyVHlXYjR2Vm9nN1Aza21KUGRaa0xqamxIbXkxVjRxZTcwZ096WHBwRm9kRXRaRGtCcDJ1b1FTWAorV0hudklFcUNhNHdpdit3ZkQrbUVjZTN4RHVTNEdCUE1WalpkMFpvZVVXczVibUIyaURRTDg3UFJzSjNLWWVKa0hjRkdCN2hqM1I0egorWmJPT0NWVlNQYlc5L3dmcnJXRlZHQ3lwYVpoS3FrREZNeFJsZEFENWtkNnZBMGpGUUZUY0Q0U1FhQ0RGa3BiY0x1VUNSYXJBWDFUNAorYmVwSnoxMXNTNi92bXNKV1hNWTFWa0pxTUYvQ3EvYmlQVCt6eVJHUE1VelhuMGtDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkRWSworOVUydlA5ZUNPS3lyY1dVWGRZeWRWWlBtTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTBHQ1NxRworU0liM0RRRUJCUVVBQTRJQkFRQ29oK25zK0VCblhjUEJac2RBUzVmOGh4T1FXc1R2b01wZmk3ZW50L0hXdFdTM2lyTzRHOHphKzZ4bQoraUVITzZQemsyeDZJcHUwblVCc0NNQ1JHZWY0RWgzQ1hRSFBSd01GWEdacHBwU2VacTUxaWhQWlJ3U3pKSXhYWUtMZXJKUk8xUnVHRworQXY4bWpNU0lraDFXL2hsbjhsWGtnS05ybkt0MzRWRnhEU0RiRUpyYnZYWjVCM2VaS0syYVh0cXhUMFFzTlk2bGxzZjlnL0JZeG5uVworbUh5b2pmNkdQZ2NXa3VGNzV4M3NNM1orUWk1S2hmbVJpV2lFQTRHbG01cSs0emZGVkt0V094Z3RRYVFNK0VMYm1hRGdjbSs3WGVFVworVDFNS1pQbE85TDlPVkwxNGJJanF2NXdUSk1Kd2FhSi9EOGc4clFqSnNKaEFveXJuaUlQdGQ0OTAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEOFRDQ0F0bWdBd0lCQWdJUVFUMXl4L1JySDRGRGZmSFNLRlRmbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCaWpFTE1Ba0dBMVVFCitCaE1DUTBneEVEQU9CZ05WQkFvVEIxZEpVMlZMWlhreEd6QVpCZ05WQkFzVEVrTnZjSGx5YVdkb2RDQW9ZeWtnTWpBd05URWlNQ0FHCitBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JICitiRzlpWVd3Z1VtOXZkQ0JIUVNCRFFUQWVGdzB3TlRFeU1URXhOakF6TkRSYUZ3MHpOekV5TVRFeE5qQTVOVEZhTUlHS01Rc3dDUVlECitWUVFHRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWJNQmtHQTFVRUN4TVNRMjl3ZVhKcFoyaDBJQ2hqS1NBeU1EQTFNU0l3CitJQVlEVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWFNWTmxTMlY1CitJRWRzYjJKaGJDQlNiMjkwSUVkQklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXkwK3pBSnM5CitOdDM1MFVscWF4QkpIK3pZSzdMRytES0JLVU9WVEpvWkl5RVZSZDdqeUJ4UlZWdXVrK2czL3l0cjZkVHF2aXJkcUZFcjEyYkRZVnhnCitBc2oxem5KN083anlUbVVJbXMya2FobkJBYnR6cHRmMnc5M052S1NMdFpsaHVBR2lvOVJOMUFVOWthMzR0QWh4Wks5dzhSeHJmdmJECitkNTBrYzN2a0RJemgyVGJobVlzRm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaCisveXhWaUpHZzRFOEhzQ2hXakJnYmwwU09pZDNnRjI3bkt1K1BPUW94aElMWVFCUkpMbnBCNUtmKzQyVE13Vmx4U3l3aHAxdDk0QjNSCitMb0didzlobzk3MldHNnh3c1JZVUM5dGd1U1lCQlFJREFRQUJvMUV3VHpBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC9CQVV3CitBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXdFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCitLb1pJaHZjTkFRRUZCUUFEZ2dFQkFFdWgvd3VIYnJQNXdVT3hTUE1vd0IwdXlRbEIrcFFBSEtTa3EwbFBqejBlNzAxdnZieWs5dkltCitNTWtReWgySSszUVpINFZGdmJCc1VmazJmdHYxVERJNlFVOWJSOC9vQ3kyMnhCbWRkTVZIeGp0cUQ2d1UyenowYzV5cEJkOEEzSFI0CisrdmcxWUZrQ0V4aDh2UHROc0NCdFE3dGdNSHBuTTF6Rm1kSDRMVGxTYy91TXFwY2xYSExaQ0I2clRqempnVEdmQTZiN3dQNHBpRlhhCitoTlZRQTdiaWhLT21OcW9ST2dIaEdFdldSR2l6UGZsVGRJU3pScEZHbGdDM2dDeTI0ZU1RNHR1aTV5aVBBWlppRmo0QTR4eWxOb0VZCitva3hTZHNBUm8yN21IYnJqV3I0MlU4VStkWStHYVNsWVU3V2N1MitmWE1VWTdOMHY0WmpKL0w3ZkNnMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlIcURDQ0JwQ2dBd0lCQWdJUkFNeTQ1NzlPS1JyOW90eG1wUndzRHhFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Y2pFTE1Ba0dBMVVFCitCaE1DU0ZVeEVUQVBCZ05WQkFjVENFSjFaR0Z3WlhOME1SWXdGQVlEVlFRS0V3MU5hV055YjNObFl5Qk1kR1F1TVJRd0VnWURWUVFMCitFd3RsTFZONmFXZHVieUJEUVRFaU1DQUdBMVVFQXhNWlRXbGpjbTl6WldNZ1pTMVRlbWxuYm04Z1VtOXZkQ0JEUVRBZUZ3MHdOVEEwCitNRFl4TWpJNE5EUmFGdzB4TnpBME1EWXhNakk0TkRSYU1ISXhDekFKQmdOVkJBWVRBa2hWTVJFd0R3WURWUVFIRXdoQ2RXUmhjR1Z6CitkREVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nVEhSa0xqRVVNQklHQTFVRUN4TUxaUzFUZW1sbmJtOGdRMEV4SWpBZ0JnTlZCQU1UCitHVTFwWTNKdmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCCitBUUR0eUFEVmdYdk5PQUJIek51RXdTRnBMSFNRRENIWlU0ZnRQa05FVTYrcitJQ2JQSGlOMUkydXVPL1RFZHlCNXM4N2xveldieFhHCitkMzZoTCtCZmtyWW4xM2FhSFVNODZ0bnNMKzQ1ODJwblM0dUN6eUw0WlZYK0xNc3ZmVWg2UFhYNXFxQW51M2pDQnNwUnduNW1TNi9OCitvcWROQW9JL2dxeUZ4dUVQa0VlWmxBcHhjcE1xeWFiQXZqeFdUSE9TSi9GcnRmWDkvREFGWUpMRzY1WitBWkhDYWJFZUhYdFRSYmpjCitRUi9KaTNIV1ZCVGppMVI0UDc3MFlqdGI5YVBzMVpKMDRuUXc3d0hiNGRTcm1ac3FhL2k5cGh5R0kwSmY3RW5lbW90YjlISTZRTVZKCitQcVcranFweDYyejY5UnJrYXYxN2ZWVkE3MWh1NXRuVnZDU3J3ZSszQWdNQkFBR2pnZ1EzTUlJRU16Qm5CZ2dyQmdFRkJRY0JBUVJiCitNRmt3S0FZSUt3WUJCUVVITUFHR0hHaDBkSEJ6T2k4dmNtTmhMbVV0YzNwcFoyNXZMbWgxTDI5amMzQXdMUVlJS3dZQkJRVUhNQUtHCitJV2gwZEhBNkx5OTNkM2N1WlMxemVtbG5ibTh1YUhVdlVtOXZkRU5CTG1OeWREQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01JSUJjd1lECitWUjBnQklJQmFqQ0NBV1l3Z2dGaUJnd3JCZ0VFQVlHb0dBSUJBUUV3Z2dGUU1DZ0dDQ3NHQVFVRkJ3SUJGaHhvZEhSd09pOHZkM2QzCitMbVV0YzNwcFoyNXZMbWgxTDFOYVUxb3ZNSUlCSWdZSUt3WUJCUVVIQWdJd2dnRVVIb0lCRUFCQkFDQUFkQUJoQUc0QStnQnpBTzBBCitkQUIyQU9FQWJnQjVBQ0FBNlFCeUFIUUFaUUJzQUcwQVpRQjZBT2tBY3dEcEFHZ0FaUUI2QUNBQTZRQnpBQ0FBWlFCc0FHWUFid0JuCitBR0VBWkFEaEFITUE0UUJvQUc4QWVnQWdBR0VBSUFCVEFIb0Fid0JzQUdjQTRRQnNBSFFBWVFCMEFQTUFJQUJUQUhvQWJ3QnNBR2NBCis0UUJzQUhRQVlRQjBBT0VBY3dCcEFDQUFVd0I2QUdFQVlnRGhBR3dBZVFCNkFHRUFkQUJoQUNBQWN3QjZBR1VBY2dCcEFHNEFkQUFnCitBR3NBWlFCc0FHd0FJQUJsQUd3QWFnRGhBSElBYmdCcEFEb0FJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVpRQXRBSE1BCitlZ0JwQUdjQWJnQnZBQzRBYUFCMUFDOEFVd0JhQUZNQVdnQXZNSUhJQmdOVkhSOEVnY0F3Z2Iwd2dicWdnYmVnZ2JTR0lXaDBkSEE2CitMeTkzZDNjdVpTMXplbWxuYm04dWFIVXZVbTl2ZEVOQkxtTnliSWFCam14a1lYQTZMeTlzWkdGd0xtVXRjM3BwWjI1dkxtaDFMME5PCitQVTFwWTNKdmMyVmpKVEl3WlMxVGVtbG5ibThsTWpCU2IyOTBKVEl3UTBFc1QxVTlaUzFUZW1sbmJtOGxNakJEUVN4UFBVMXBZM0p2CitjMlZqSlRJd1RIUmtMaXhNUFVKMVpHRndaWE4wTEVNOVNGVS9ZMlZ5ZEdsbWFXTmhkR1ZTWlhadlkyRjBhVzl1VEdsemREdGlhVzVoCitjbmt3RGdZRFZSMFBBUUgvQkFRREFnRUdNSUdXQmdOVkhSRUVnWTR3Z1l1QkVHbHVabTlBWlMxemVtbG5ibTh1YUhXa2R6QjFNU013CitJUVlEVlFRRERCcE5hV055YjNObFl5QmxMVk42YVdkdXc3TWdVbTl2ZENCRFFURVdNQlFHQTFVRUN3d05aUzFUZW1sbmJzT3pJRWhUCitXakVXTUJRR0ExVUVDaE1OVFdsamNtOXpaV01nUzJaMExqRVJNQThHQTFVRUJ4TUlRblZrWVhCbGMzUXhDekFKQmdOVkJBWVRBa2hWCitNSUdzQmdOVkhTTUVnYVF3Z2FHQUZNZWdTWFVXWVlUYk1VdUUwdkUzUUpEdlR0ejNvWGFrZERCeU1Rc3dDUVlEVlFRR0V3SklWVEVSCitNQThHQTFVRUJ4TUlRblZrWVhCbGMzUXhGakFVQmdOVkJBb1REVTFwWTNKdmMyVmpJRXgwWkM0eEZEQVNCZ05WQkFzVEMyVXRVM3BwCitaMjV2SUVOQk1TSXdJQVlEVlFRREV4bE5hV055YjNObFl5QmxMVk42YVdkdWJ5QlNiMjkwSUVOQmdoRUF6TGpudjA0cEd2MmkzR2FsCitIQ3dQRVRBZEJnTlZIUTRFRmdRVXg2QkpkUlpoaE5zeFM0VFM4VGRBa085TzNQY3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBTk1UCituR1pqV1M3S1hIQU0vSU84VmJIMGpnZHNaaWZPd1RzZ3FSeTdSbFJ3N2xyTW9IZnFhRVFuNi9JcDNYZXAxZnZqMUtjRXhKVzRDK0ZFCithR0FIUXpBeFFtSGw3dG5sSk5VYjMrRktHNnFmeDEvNGVoSHFFNU1BeW9wWXNlN3REazIwMTZnMkpuemdPc0hWVjRMeGRiYjlpVi9hCis4Nmc0bnpVR0NNNGlsYjdOMWZ5K1c5NTVhOXg2cVdWbXZyRWxXbC90ZnRPc1JtMU05REtIdENBRTRHeDRzSGZSaFVaTHBoSzNkZWhLCit5VlpzMTVLcm5mVkpPTkpQVStOVmtCSGJtSmJHU2ZJKzlKOGI0UGVJM0NWaW1VVFljNzgvTVBNTU56N1V3aWlBYzdFQnQ1MWFsaFFCCitTNmtSblNscUx0QmRnY0RQc2lCRHh3UGdOMDVkQ3R4WklDVT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ2VydGlnbmEKKz09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURxRENDQXBDZ0F3SUJBZ0lKQVA3YzR3RVB5VWovTUEwR0NTcUdTSWIzRFFFQkJRVUFNRFF4Q3pBSkJnTlZCQVlUQWtaU01SSXcKK0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aE1CNFhEVEEzTURZeU9URTFNVE13TlZvWERUSTMKK01EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0kKK1EyVnlkR2xuYm1Fd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURJYVBISjF0YXpOSFVtZ2g3c3RMN3EKK1hPRW03UkZIWWVHaWZCWjRRQ0hrWUo1YXlHUGh4TEdXa3Y4WWJXa2o0U3RpOTkzaU5pK1JCN2xJenc3c2ViWXM1elJMY0FnbG96eUgKK0d4bnlnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3ekJmc1YxL3AKK29ncVlDZDdqWDV4djNFampoUXNWV3FhNm42eEk0d215OS9ReTNsNDB2aHg0WFVKYnpnNGlqMDJRMTMweUdMTUxMR3Evamo4VUVZa2cKK0RuY1V0VDJVQ0lmM0pSN1ZzbUFBN0c4cUtDVnVLajRZWXhjbFB6NUVJQmIySnNnbHJnVkt0T2RqTFBPTUZsTitYUHNSR2dqQlJtS2YKK0lyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVEKK3RDUlp2Z0h5VXRWRjlsbzUzQkV3WkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUoKK0JnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhnZ2tBL3R6akFRL0oKK1NQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKK2hRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aGJWNmxVbVBPRXZqdkt0cHY2emYrRXdMSHl6cysKK0ltdmFZUzUvMUhJOTNURGhIa3hBR1l3UDE1elJnekI3bUZuY2ZjYTVEQ2xNb1RPaTYyYzZaWVRUbHVMdGRrVndqN1VyM3ZrajFrbHUKK1BCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dUhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkKKzFna0lsMlBsd1M2d3QwUW13Q2JBcjFVd25qdlZOaW9aQlBSY0h2L1BMTGYvMFAySFFCSFZFU083U01BaHFhUW9MZjBWK0xCT0svUXcKK1d5SDhFWkUwdmtIdmU1MlhkZitYbGNDV1dDL3F1MGJYdStUWkxnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFcWpDQ0E1S2dBd0lCQWdJT0xtb0FBUUFDSDlkU0lTd1JYRHN3RFFZSktvWklodmNOQVFFRkJRQXdkakVMTUFrR0ExVUVCaE1DCitSRVV4SERBYUJnTlZCQW9URTFSRElGUnlkWE4wUTJWdWRHVnlJRWR0WWtneElqQWdCZ05WQkFzVEdWUkRJRlJ5ZFhOMFEyVnVkR1Z5CitJRU5zWVhOeklESWdRMEV4SlRBakJnTlZCQU1USEZSRElGUnlkWE4wUTJWdWRHVnlJRU5zWVhOeklESWdRMEVnU1Vrd0hoY05NRFl3CitNVEV5TVRRek9EUXpXaGNOTWpVeE1qTXhNakkxT1RVNVdqQjJNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVFZFTWdWSEoxCitjM1JEWlc1MFpYSWdSMjFpU0RFaU1DQUdBMVVFQ3hNWlZFTWdWSEoxYzNSRFpXNTBaWElnUTJ4aGMzTWdNaUJEUVRFbE1DTUdBMVVFCitBeE1jVkVNZ1ZISjFjM1JEWlc1MFpYSWdRMnhoYzNNZ01pQkRRU0JKU1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCitBUW9DZ2dFQkFLdUFoNXVPOE1OOGg5Zm9KSUlSc3p6ZFEyTHUrTU5GMnVqaG9GL1JLckxxazJqZnRNaldRK25FZFZsLy9PRWQrREZ3CitJeHVJbmllNWUvMDYwc21wNlJRdmtMNERVc0ZKemZiOTVBaG1DMWVLb2tLZ3VOVi9hVnlRTXJLWERjcEszRVkrQWxXSlUrTWFXc3MyCit4Z2RXOTR6UEVmUk11ekJ3QkpXbDlqbU0vWE9CQ0gySlhqSWVJcWtpUlV1d1ppNHd6SjlsL2Z6TGdhbng0RHV2bzRiUmllckVSWGxRCitYYTdwSVhTU1RZdFpnbytVNCtsSzhlZEpzQlRqOVdMTDFYSzlIN25TbjZETnFQb0J5TmtOMzlyOFI1Mnp5RlRmU1VyeElhbitHRTd1CitTTlFadSs5OTVPS2R5MXUyYnYvanpWcm5kSUlGdW9BbE9NdmthWjZ2UWFvYWhQVUNBd0VBQWFPQ0FUUXdnZ0V3TUE4R0ExVWRFd0VCCisvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCVGpxMVJNZ0tIYlZrTzNrVXJMODRKNkUxd0lxekNCCis3UVlEVlIwZkJJSGxNSUhpTUlIZm9JSGNvSUhaaGpWb2RIUndPaTh2ZDNkM0xuUnlkWE4wWTJWdWRHVnlMbVJsTDJOeWJDOTJNaTkwCitZMTlqYkdGemMxOHlYMk5oWDBsSkxtTnliSWFCbjJ4a1lYQTZMeTkzZDNjdWRISjFjM1JqWlc1MFpYSXVaR1V2UTA0OVZFTWxNakJVCitjblZ6ZEVObGJuUmxjaVV5TUVOc1lYTnpKVEl3TWlVeU1FTkJKVEl3U1Vrc1R6MVVReVV5TUZSeWRYTjBRMlZ1ZEdWeUpUSXdSMjFpCitTQ3hQVlQxeWIyOTBZMlZ5ZEhNc1JFTTlkSEoxYzNSalpXNTBaWElzUkVNOVpHVS9ZMlZ5ZEdsbWFXTmhkR1ZTWlhadlkyRjBhVzl1CitUR2x6ZEQ5aVlYTmxQekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBak5mZmZ1NGJnQkN6Zy9YYkVlcHJTNmlTR05uM0J6bjFMTDRHCitkWHBvVXhVYzZrcnRYdndqc2hPZzB3bi85dll1YTBGeGVjM2liZjJ1V1d1RkhiaE9JcHJ0WmpsdVM1VG1WZndMRzR0M3dWTVRab25aCitLTmFMODBWS1k3Zjlld3RoWGJodHZzUGNXM25TN1libG9rMitYblI4YXUwV09COS9XSUZhR3VzeWlDMnk4emwzZ0s5ZXRtRjFLZHNqCitUWWpLVUNqTGhkTFRFS0paYnRPVFZBQjZva2FWaGdXY3FSbVk1VEZ5REFEaVo5bEE0Q1F6ZTI4c3VWeXJaWjBzckhicU5abjFsN2tQCitKT3pIZGlFb1phNVg2QWVJZFVwV29OSUZPcVRtalpLSUxQUHk0Y0hHWWR0QnhjZWI5dzRhVVVYQ1lXdmNaQ2NYakZxMzJuUW96WmZrCit2UT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQSBJCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEM1RDQ0FzV2dBd0lCQWdJT0hhSUFBUUFDN0xkZ2dIaU50Z1l3RFFZSktvWklodmNOQVFFRkJRQXdlVEVMTUFrR0ExVUVCaE1DCitSRVV4SERBYUJnTlZCQW9URTFSRElGUnlkWE4wUTJWdWRHVnlJRWR0WWtneEpEQWlCZ05WQkFzVEcxUkRJRlJ5ZFhOMFEyVnVkR1Z5CitJRlZ1YVhabGNuTmhiQ0JEUVRFbU1DUUdBMVVFQXhNZFZFTWdWSEoxYzNSRFpXNTBaWElnVlc1cGRtVnljMkZzSUVOQklFa3dIaGNOCitNRFl3TXpJeU1UVTFOREk0V2hjTk1qVXhNak14TWpJMU9UVTVXakI1TVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRWRU1nCitWSEoxYzNSRFpXNTBaWElnUjIxaVNERWtNQ0lHQTFVRUN4TWJWRU1nVkhKMWMzUkRaVzUwWlhJZ1ZXNXBkbVZ5YzJGc0lFTkJNU1l3CitKQVlEVlFRREV4MVVReUJVY25WemRFTmxiblJsY2lCVmJtbDJaWEp6WVd3Z1EwRWdTVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFECitnZ0VQQURDQ0FRb0NnZ0VCQUtSM0k1WkVyNUQwTWFjUTlDYUhuUE00MlE5ZTNzOUI2REd0eG5TUkpKWjRIZ21nbTVxVlNrcjFZbndDCitxTXFzKzFvRWRqbmVYL0g1czcvekExaFYwcXEzNHdRaTBmaVUyaUlJQUkzVGZDWmR6SGQ1NXl4NE9hZ21jdzZpWFNWcGhVOVZEcHJ2Cit4cmxFNFZjOTN4OVVJdVZ2WmFvemhEcnp6bnErVlpldWpSSVBGRFBpVUhERFNZY1R2RkhlMTVnU1d1ODZnek9TQm5XTGtud1NhSHR3CithZysxbTdaM1cwaFpuZVR2V3EzendaN1UxMFZPeWxZMElidytGMXR2ZHd4SUFVTXBzTjAvbG03bWxhb013Q0MyL1Q0Mko1empYTTlPCitnZHdadTVHUWZlem1sd1Flazh3aVNkZVhocllUQ2p4REkzZCs4TnptelNRZk80T2JORHFETk9NQ0F3RUFBYU5qTUdFd0h3WURWUjBqCitCQmd3Rm9BVWtxUjFMS1Nldm9GRTYzbjhpc1dWcGVzUWRYTXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCitBWVl3SFFZRFZSME9CQllFRkpLa2RTeWtucjZCUk90NS9JckZsYVhyRUhWek1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQW8wdUNHCisxZWI0ZS9DWDNDSnJPNVVVVmc4Uk1LV2FUenF3T3VBR3kyWDE3Y2FYSi80bDhsZm1YcFdNUG1SZ0ZWcC9MdzBCeGJGZy9VVTF6L0N5Cit2d2JaNzFxK3MySWh0TmVyTlh4VFBxWW44YUV0Mmhvam5jemQ3RHd0bmljMFhRL0NObm04eVVwaUxlMXIyWDFCUTN5MnFzcnRZYkUzCitnaFVKR29vV01OanN5ZFpIY25oTEVFWVVqbDhPcit6SEw2c1ExN2J4YnV5R3NzTG9EWkp6M0tMMER6cS9ZU01RaVp4SVFHNXdBTFBUCit1amRFV0JGNkFtcUk4RGMwOEJucHJOUmxjL1pwakdTVU9ubUZLYkFXS3d5Q1B3YWN4LzBRSzU0UExMYWU0eFcvMlRZY3VpVWFVajBhCis3Q0lNSE9Da29qM3c2RG5QZ2NCNzdWMGZiOFhRQzllWQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRG56Q0NBb2VnQXdJQkFnSUJKakFOQmdrcWhraUc5dzBCQVFVRkFEQnhNUXN3Q1FZRFZRUUdFd0pFUlRFY01Cb0dBMVVFQ2hNVAorUkdWMWRITmphR1VnVkdWc1pXdHZiU0JCUnpFZk1CMEdBMVVFQ3hNV1ZDMVVaV3hsVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFRworQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQklESXdIaGNOT1Rrd056QTVNVEl4TVRBd1doY05NVGt3TnpBNQorTWpNMU9UQXdXakJ4TVFzd0NRWURWUVFHRXdKRVJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwRworQTFVRUN4TVdWQzFVWld4bFUyVmpJRlJ5ZFhOMElFTmxiblJsY2pFak1DRUdBMVVFQXhNYVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCUworYjI5MElFTkJJREl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3JDNk0xNElzcEZMRVVoYTg4RU9RNQorYnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaENRTi9QbzdxQ1dXcVNHNndjbXRvSQorS3lVbitXa2pSL0hnNnl4Nm0vVVRBdEIrTkh6Q25qd0FXYXYxMmd6MU1qd3JyRkRhMXNQZWc1VEtxQXlaTWc0SVNGWmJhdnZhNFZoWQorQVVsZmNrRThGUVlCamwydHFyaVR0TTJlNjZmb2FpMVNOTnM2NzF4MVVkcmI4ekg1N25HWU1zUlVGVVFNK1p0VjdhM2ZHQWlnbzRhSworU2U1VEJZOFpUTlhlV0htYjBtb2NRcXZGMWFmUGFBK1c1T0ZobUhaaHlKRjgxajRBNHBGUWgrR2RDdWF0bDlJZHhqcDl5N3phQXpUVgoramxzQjlXb0h0eGEyYmtwL0FnTUJBQUdqUWpCQU1CMEdBMVVkRGdRV0JCUXh3M2tidXZWVDF4ZmdpWG90RjJ3S3N5dWRNekFQQmdOVgorSFJNRUNEQUdBUUgvQWdFRk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWxHUlpyVGxrNXlucgorRS81YXc0c1RWOGdFSlBCMGQ4Qmc0MmY3NlltbWc3K1dnbnh1MU1NOTc1NkFicnNwdEpoNnNUdFU2emtYUjM0YWpndjhIekZaTVFTeQoremhmekxNZGlObFhpSXRpSlZiU1lTS3BrK3RZY050aEVlRnBhSXpwWGwvVjZNRSt1bjJwTVN5dU9vQVBqUHVDcDFOSjcwck9vNG5JOAorclo3L2dGbmttMFcwOWp1d3pUa1ptRExsNmlGaGtPUXhJWTQwc2Zjdk5VcUZFTnJuaWpjaHZsbGo0UEtGaURGVDFGUVVoWEI1OUM0RworZHlkMUx4KzRpdm4reGJyWU51U0Q3T2RsdDc5ald2TkdyNEdVTjlSQmpOWWoxaDdQOVdnYlJHT2lXcnFuTlZtaDVYQUZtdzRqVjVtVQorQ20yNk9XTW9ocEx6R0lUWSs5SFBCVlprVnc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDb21TaWduIFNlY3VyZWQgQ0EKKz09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEcXpDQ0FwT2dBd0lCQWdJUkFNY29Sd216dUd4RmpCMzZKUFUyVHVrd0RRWUpLb1pJaHZjTkFRRUZCUUF3UERFYk1Ca0dBMVVFCitBeE1TUTI5dFUybG5iaUJUWldOMWNtVmtJRU5CTVJBd0RnWURWUVFLRXdkRGIyMVRhV2R1TVFzd0NRWURWUVFHRXdKSlREQWVGdzB3CitOREF6TWpReE1UTTNNakJhRncweU9UQXpNVFl4TlRBME5UWmFNRHd4R3pBWkJnTlZCQU1URWtOdmJWTnBaMjRnVTJWamRYSmxaQ0JECitRVEVRTUE0R0ExVUVDaE1IUTI5dFUybG5iakVMTUFrR0ExVUVCaE1DU1V3d2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3CitnZ0VLQW9JQkFRREd0V2hmSFpRVnc2UUlWUzNqb0ZkNjcrbDBLcnU1ZkZkSkdoRmVUeW1IREVqV2F1ZVAxSDVYSkxrR2llUWNQT3FzCis0OW9oZ0hNaEN1OTVtR3dmQ1AraFVIM3ltQnZKVkc4K3BTanNJUVFQUmJzSFBhSEEraXFZSFU0R2svdjFpRHVyWDhzV3YrYnpua3FICis3Um5xd3A5RDVQR0JwWDhRVHo3UlNtS3RVeHZMZy84SFphV1NMV2FwVzdoYTlCMjBJWkZLRjN1ZU12NVdKRG15VklSRDlZVEMyTHhCCitrTXlkMW1qYTZZSlFxVHRvejdWZEFwUmdGckZEMlVOZDNWMkhidXE3czhscjlnT1VDWERlRmhGNksraDJqMGtRbUhlNVkxeUxNNWQxCis5Z3VNc3F0YjNuUWdKVC9qOHhINWgyaUdOWEhESFl3dDYrVWFyQTl6MVlKWlFJRFRBZ01CQUFHamdhY3dnYVF3REFZRFZSMFRCQVV3CitBd0VCL3pCRUJnTlZIUjhFUFRBN01EbWdONkExaGpOb2RIUndPaTh2Wm1Wa2FYSXVZMjl0YzJsbmJpNWpieTVwYkM5amNtd3ZRMjl0CitVMmxuYmxObFkzVnlaV1JEUVM1amNtd3dEZ1lEVlIwUEFRSC9CQVFEQWdHR01COEdBMVVkSXdRWU1CYUFGTUZMN1hDMjl6NThBRHNBCitqOGMrRGtXZkhsM3NNQjBHQTFVZERnUVdCQlRCUysxd3R2YytmQUE3QUkvSFBnNUZueDVkN0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DCitBUUVBRnMvdWtoTlFxM3NVbmpPMlFpQnExQlc5Q2F2OGN1anZSM3FRckZIQlpFN3BpTDFEUllIalppTS9Fb1pOR2VRRnNPWTN3bzNhCitCaWpKRDRta1U2bDFQN0NXKzZ0TU0xWDVlQ1pHYnhzMm1QdENkc0dDdVk3ZSswWDVZeHRpT3prR3luZDZxRHdKejJ3MlBROEtSVXRwCitGaHBGZlRNRFpmbFNjWkFtbGF4TURQV0xrei9NZFhTRm1Mci9ZbnBOSDRuK3JyMlVBSm0vRWFYYzRIbkZGZ3Q5QW1FZDZvWDVBaFZQCis1MXFKVGhSdjR6ZExoZlhCUEdIZy9RVkJzcEovd3gyZzBLNVNaR0JyR01ZbW5OajFaT1EyR21LZmlnOCsvMjFPR1ZaT0lKRnNuelF6CitPalJYVURwdmdWNEd4dlUrZkU2T0s4NWxCaTVkMGlwVGRGN1RiaWVlanc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDeWJlcnRydXN0IEdsb2JhbCBSb290Cis9PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURvVENDQW9tZ0F3SUJBZ0lMQkFBQUFBQUJENFdxTFVnd0RRWUpLb1pJaHZjTkFRRUZCUUF3T3pFWU1CWUdBMVVFQ2hNUFEzbGkKK1pYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUURFeFpEZVdKbGNuUnlkWE4wSUVkc2IySmhiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTQKK01EQXdNRm9YRFRJeE1USXhOVEE0TURBd01Gb3dPekVZTUJZR0ExVUVDaE1QUTNsaVpYSjBjblZ6ZEN3Z1NXNWpNUjh3SFFZRFZRUUQKK0V4WkRlV0psY25SeWRYTjBJRWRzYjJKaGJDQlNiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEKKytNaTh2UlJRWmhQLzhOTjU3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcKKzBvelNKOGJpL3phZm1HV2dFMDdHS21TYjFaQVN6eFFHOUR2ajFDaSs2QTc0cTA1SWxHMk9sVEVRWE8yaUxiM1ZPbTJ5SEx0Z3dFWkwKK0FmVkpybjVHaXRCMGphRU1Bczd1L09lUHVHdG04MzlFQUw5bUpSUXIzUkF3SFFlV1AwMzJhN2lQdDNzTXBUanIza2ZiMVYwNS9JaW4KKzg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056RnRBcEQwbXBTUEN6cXJkc3hhY3dPVUJkcnNUaVhTWlQKKzhNNGNJd2hocUpRWnVnUmlRT3dmT0hCM0VnWnhwekFZWFNVbnBRSURBUUFCbzRHbE1JR2lNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVAKK0JnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTMkNIc05lc3lzSUV5R1ZqSmV6NnR1aFMxd1Z6QS9CZ05WSFI4RU9EQTIKK01EU2dNcUF3aGk1b2RIUndPaTh2ZDNkM01pNXdkV0pzYVdNdGRISjFjM1F1WTI5dEwyTnliQzlqZEM5amRISnZiM1F1WTNKc01COEcKK0ExVWRJd1FZTUJhQUZMWUlldzE2ekt3Z1RJWldNbDdQcTI2RkxYQlhNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJXN3dvam9GUk8KK2xaZkorSW5hUmNIVW93QWw5QjhUcTdlamhWaHB3akN0MkJXS0xlUEp6WUZhK0hNaldxZDhCZlA5SWpzTzBRYkUyelpNY3dTTzViQWkKKzVNWHpMcVhaSStPNFRrb2dwMjRDSko4aVlHZDdpeDF5Q2NVeFhPbDVuNEJIUGEyaEN3Y1VQVWYvQTJrYURBdEU1Mk1scDMreXliaDIKK2hPMGo5bjBIcTBWKzA5K3p2K21LdHMyb29tY3JVdFczWmZBNVRHT2drWG1UVWc5VTNZTzduOUdQcDFOenc4di9NT3g4QkxqWVJCK1QKK1gzRUpJcmR1UHVvY0EwNmRHaUJoKzRFMzdGNzhDa1dyMStjWFZkQ2c2bUNicHZiampGc3B3Z1pnRkowdGwweXBreFdkWWNRQlgwalcKK1dMMVdNUkpPRWNnaDRMTVJrV1hidEthSU9NNVYKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRnNEQ0NBNWlnQXdJQkFnSVFGY2k5WlVkY3I3aVhBRjdrQnRLOG5UQU5CZ2txaGtpRzl3MEJBUVVGQURCZU1Rc3dDUVlEVlFRRworRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MFpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZworVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdOREV5TWpBd01qTXhNamRhRncwek5ERXlNakF3TWpNeAorTWpkYU1GNHhDekFKQmdOVkJBWVRBbFJYTVNNd0lRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcQorTUNnR0ExVUVDd3doWlZCTFNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNFNVUDdvM2JpRE4xWjgydEgzMDZUbTJkMHk4VTgyTjB5d0VoYWpmcWhGQUhTeVpiQ1VOcworSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWhpakh5bDNTSkNSSW1ISjdLMlJLaQorbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1hEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdgorcU94NFVYQ0tYQkNEVVNIM0VUMDBobDdsU00yWGdZSTFUQm5zWmZacnhRV2g3a2NUMXJNaEo1UVFDdGtrTzdxK1JCTkdNRCtYUE5qWAorMTJydU96ampLOVNYRHJrYjV3ZEpmemNxK1hkNHoxVHRXMGFkbzRBT2tVUEIxbHRmRkxxZnBvMGtSMEJadjNJNHNqWnNOLytaMFYwTworV1FxcmFmZkFzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVV0gxKworRVRPeFF2ZGliQmpXendsb1BuOXM5aDZQWXEybFk5c0pweDhpUWtFZWI1bUtQdGY1UDBCNmViQ2xBWkxTblQwSUZhVVFBUzJ6TW5hbworbFEyemVwcjdCeEI0RVcvaGo4ZTZEeVVhZENybEhKaEJtZDhoaCtpVkJtb0tzMnBIZG1YMk9zK1BZaGNaZXdvb3pSclNneDRoeHl5LwordnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaQorWm8xakRpVk4xUm15NW5rM3B5S2RWREVDQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaQorTUF3R0ExVWRFd1FGTUFNQkFmOHdPUVlFWnlvSEFBUXhNQzh3TFFJQkFEQUpCZ1VyRGdNQ0dnVUFNQWNHQldjcUF3QUFCQlJGc01MSAorQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQnV2bDJJQ08xSjJCMAorMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbFB3WnBWblBEaW1aSSt5bUJWM1FHeXB6cQorS09nNFp5WXI4ZFcxUDJXVCtEWmRqbzJOUUNDSEdlcnZKOEE5dERrUEpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVgoreHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDL2dwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUAorTlh1YnJqbHBDMkpnUUNBMmo2LzdOdTR0Q0VvZHVMK2JYUGpxcFJ1Z2M2YlkrRzdnTXdSZmFLb25oKzNad1pDYzdiM2phald2WTkrcgorR05tNjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUJvMk0zSVV4RQoreEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMvalE2ZmJqcEtkeDJxY2d3K0JSeAorZ01ZZU5raDBJa0ZjaDRMb0dIR0xRWWxFNTM1WVc2aTRqUlBwcDJ6RFIrMnpHcDFpcm8yQzZwU2UzVmtRdzYzZDRrM2pNZFhIN09qeQorc1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEVXOWMzcmtJTzNhUWFiM3lJVk1VV2J1RjZhQzc0T3I4TnBEeUpPM2luVG1PRAorQkNFSVo0M3lna25RVy8yeHpRK0RoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1RceGMzXHg5Y1x4NDJceEM0XHhCMFRBSyBVRUtBRSBLXHhDM1x4QjZrIFNlcnRpZmlrYSBIaXptZXQgU2FceEM0XHg5RmxheVx4YzRceGIxXHg2M1x4YzRceGIxc1x4YzRceGIxIC0gU1x4QzNceEJDclx4QzNceEJDbSAzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGRnpDQ0EvK2dBd0lCQWdJQkVUQU5CZ2txaGtpRzl3MEJBUVVGQURDQ0FTc3hDekFKQmdOVkJBWVRBbFJTTVJnd0ZnWURWUVFICitEQTlIWldKNlpTQXRJRXR2WTJGbGJHa3hSekJGQmdOVkJBb01QbFREdkhKcmFYbGxJRUpwYkdsdGMyVnNJSFpsSUZSbGEyNXZiRzlxCithV3NnUVhKaHhaOTB4TEZ5YldFZ1MzVnlkVzExSUMwZ1ZNT2NRc1N3VkVGTE1VZ3dSZ1lEVlFRTEREOVZiSFZ6WVd3Z1JXeGxhM1J5CitiMjVwYXlCMlpTQkxjbWx3ZEc5c2IycHBJRUZ5WWNXZmRNU3hjbTFoSUVWdWMzUnBkTU84YzhPOElDMGdWVVZMUVVVeEl6QWhCZ05WCitCQXNNR2t0aGJYVWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwTVVvd1NBWURWUVFEREVGVXc1eEN4TEJVUVVzZ1ZVVkxRVVVnCitTOE8yYXlCVFpYSjBhV1pwYTJFZ1NHbDZiV1YwSUZOaHhKOXNZWG5Fc1dQRXNYUEVzU0F0SUZQRHZITER2RzBnTXpBZUZ3MHdOekE0CitNalF4TVRNM01EZGFGdzB4TnpBNE1qRXhNVE0zTURkYU1JSUJLekVMTUFrR0ExVUVCaE1DVkZJeEdEQVdCZ05WQkFjTUQwZGxZbnBsCitJQzBnUzI5allXVnNhVEZITUVVR0ExVUVDZ3crVk1POGNtdHBlV1VnUW1sc2FXMXpaV3dnZG1VZ1ZHVnJibTlzYjJwcGF5QkJjbUhGCituM1RFc1hKdFlTQkxkWEoxYlhVZ0xTQlV3NXhDeExCVVFVc3hTREJHQmdOVkJBc01QMVZzZFhOaGJDQkZiR1ZyZEhKdmJtbHJJSFpsCitJRXR5YVhCMGIyeHZhbWtnUVhKaHhaOTB4TEZ5YldFZ1JXNXpkR2wwdzd4enc3d2dMU0JWUlV0QlJURWpNQ0VHQTFVRUN3d2FTMkZ0CitkU0JUWlhKMGFXWnBhMkZ6ZVc5dUlFMWxjbXRsZW1reFNqQklCZ05WQkFNTVFWVERuRUxFc0ZSQlN5QlZSVXRCUlNCTHc3WnJJRk5sCitjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUMwZ1U4Tzhjc084YlNBek1JSUJJakFOQmdrcWhraUc5dzBCCitBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFpbTFML3hDSU9zUDJmcFRvNmlCa2NLNGhnYjQ2ZXp6YjhSMVNmMW42OHlKTWxhQ1F2RWhPCitFYXY3dDdXTmVvTW9qQ1pHMkU2VlFJZGhuOFdlYllHSFYyeUtPN1JtNnN4QS9PT3FiTExMQWRzeXY5THJoYytoRFZYRFd6aFhjTGgxCit4bm5SRkREdEcxaGJhKzgxOHFFaFRzWE9mSmxmYkxtNElwTlFwODFNY0dxK2FnVi9FNXdySHVyK1I4NEVwVytza3k1OEs1K2VlUk9SCis2T3FleWpoMWptS3dsWk1xNWQvcFhwZHVJRjlmaEhwRU9SbEFITHBWSy9zd3NvSHZoT1BjN0pnNE9RT0ZDS2xVQXdVcDhNbVBpK29MCitobVVaRWRQcENTUGVhSk1EeVRZY0lXN09qR2J4bVREWTE3UERIZmlCTHFpOWdndG0vb0xMNGVBYWdzTkFnUUlEQVFBQm8wSXdRREFkCitCZ05WSFE0RUZnUVV2WWlIeVkvMnBBb0xxdXZGL3BFam5hdEtpakl3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCitNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFCMTgra21QTk9tM0pwSVdtZ1YwNTB2UWJUbHN3eWIyenJneHZNVGZ2Q3I0CitONUVZM0FUSVpKa3JHRzJBQTFuSnJ2aFkwRDd0d3lPZmFUeUdPQnllNzlvbmVOR0VOM0dLUEVzNXozNUZCdFl0MklwTmVCTFdyY0xUCit5OUxRUWZNbU5rcWJsV3dNN3VYUlF5ZG13WWozZXJNZ2JPcXdhU3ZISU9nTUE4UkJCWm5pUCtScitLQ0dnY2VFeGgvVlM0RVNzaFloCitMQk9oZ0xKZURFb1RuaURZWWtDcmtPcGtTaStzRFFFU2VVV29MNGNaYU1qaWhjY3dzblg1T0QreXdKTzBhK0lEUk01bm9OK0oxcTJNCitkcU1UdzVSaEsydlpiTUVIQ2lJSGhXeUZKRWFwdmorTGVJU0NmaVFNbmYyQk4rTWxxTzAyVHBVc3laeVEydXlwUWp5dHRnST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQnV5cGFzcyBDbGFzcyAyIENBIDEKKz09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURVekNDQWp1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJMTVFzd0NRWURWUVFHRXdKT1R6RWRNQnNHQTFVRUNnd1UKK1FuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hIVEFiQmdOVkJBTU1GRUoxZVhCaGMzTWdRMnhoYzNNZ01pQkRRU0F4TUI0WERUQTIKK01UQXhNekV3TWpVd09Wb1hEVEUyTVRBeE16RXdNalV3T1Zvd1N6RUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmgKK2MzTWdRVk10T1Rnek1UWXpNekkzTVIwd0d3WURWUVFEREJSQ2RYbHdZWE56SUVOc1lYTnpJRElnUTBFZ01UQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSXM4QjBYWTl0L214OHE2alVQRlI0MndXc0U0MjVLRUhLOFQxQTl2TmtZZ3hDN00KK2NYQTBvalRUTnk3WTNUcDNMOERyS2VoYzByV3BrVFNISWxuK3pOdm5tYStXd2FqSFFOMmxGWXh1eUh5WEE4dm1JUExYbDE4eG9TODMKKzByN3V2cW10cUV5ZUlXWkRPNmk4OHdtak9OVlpKTUhDUjNheGlGeUNPN3NycGdUWGpBZVB6ZFZCSGZDdXVDa3NsRkpnTkpRNzJ1QTQKKzBaMHpQaFgwa3pMRkFOcTFLV1lPT25nUElWSmZBdVdTZXlYVGtoNHZGWjJCNUoyTzZPK0p6aFJNVkIwY2dSSk5jS2krRUFVWGZoL1IKK3VGZFY3YzI3VXNLd0huakNUVFpveTFZbXdWTEJ2WGIzV05WeWZoOUVkcnNBaVIwV25WRTE3MDNDVnU5cjRJdzdEZWtDQXdFQUFhTkMKK01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVQNDJhV1l2OGUzdWNvNjg0c0RudGtIR0Exc2d3RGdZRFZSMFAKK0FRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVZHbjRUaXJub0I2TkxKekt5UUpIeUlkRmtoYjVqYXRMUGdjSVYKKzFYcCtEQ21zTng0Y2ZIWlNsZHExZnlPaEtYZGx5VEtkcUM1V3EyQjJ6aGEwalg5NHdOV1pVWU4vWHRtK0RLaFE3U0xIclFWTWR2dnQKKzdoNUhaUGIzSjMxY0tBOUZ4VnhpWHFhYWtaRzNVeGN1M0sxZ25aWmtPYjFuYUxLdUJjdE41MThmVjRiVklKd28rMjhUT1BYMkVaTDIKK2ZabGVId3pvcTBRa0tYSkFQVFpTcjR4WWtIUEI3R0VzZWFIc2g3VS8yazNaSVFBdzNwRGFEdE1hU0trK2hRc1VpNHk4UVo1cTl3NXcKK3dEWDNPYUpkWnRCN1daK29SeEthSnlPa0xZNG5nNUlnb2RjVmYvRXVHTzcwU0g4dmYvR2hHTFdoQzVTZ1lpQXluQjMyMU8rL1RJaG8KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQnV5cGFzcyBDbGFzcyAzIENBIDEKKz09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURVekNDQWp1Z0F3SUJBZ0lCQWpBTkJna3Foa2lHOXcwQkFRVUZBREJMTVFzd0NRWURWUVFHRXdKT1R6RWRNQnNHQTFVRUNnd1UKK1FuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hIVEFiQmdOVkJBTU1GRUoxZVhCaGMzTWdRMnhoYzNNZ015QkRRU0F4TUI0WERUQTEKK01EVXdPVEUwTVRNd00xb1hEVEUxTURVd09URTBNVE13TTFvd1N6RUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMWVYQmgKK2MzTWdRVk10T1Rnek1UWXpNekkzTVIwd0d3WURWUVFEREJSQ2RYbHdZWE56SUVOc1lYTnpJRE1nUTBFZ01UQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1NPMTNUWktXVGVYeCtIZ0pIcVRqbm1HY1pFQzREVkM2OVRCNHNTdmVabjhBS3gKK2lmWmdpc1Jic0VMUndDR295K0diNzJSUnRxZlBGZlYwZ0dnRWtLQllvdVowcGxOVFZVaGpQNUpXM1NST2p2aTZLLy96TklxZUtOYzAKK242d3YxZy94cEMrOVVySkpoVzA1TmZCRU1KTkdKUE8yNTFQN3ZHR3ZxYU1VKzhJWEY0UnM0SHlJK01rY1Z5endQWDZVdkNXVGhPaWEKK0FKcEZCVUpYZ1BST3p0bXVPZmJJVXhBTVpUcEhlMkRDMXZxUnljWnhiTDJSaHp5UmhrbXI4dytnYkNaMlhoeXNtM0hsamJ5YklSNmMKKzFqaCtKSUFWTVlLV3NVblRZamRiaUF3S1lqVCtwMGgrbWJFd2k1QTNsUnlvSDZVc2pmUlZ5TnZkV1FyQ3JYaWc5SXNDQXdFQUFhTkMKK01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVPQlRteVBDcHBBUDBUajRpbzF2eTF1Q3RRSFF3RGdZRFZSMFAKK0FRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQUJaNk9NeVNVOUUyTmRGbS9zb1Q0SlhKRVZLaXJaZ0NGUEJkeTcKK3BZbXJFek1xbmppM2pHOENjbVBIYzNjZUNRYTZPeWg3cEVmSllXc0lDQ0Q4aWdXS0g3eTZ4c0wrejI3c0V6TnhaeTVwK3Frc1AyYkEKK0VsbE5DMVFDa29TNzJ4THZnM0J3ZU1oVCt0L0d4di9jaUM4SHdFbWRNbGRnMC9MMm1TbGY1Nm9Cekt3enFCd0t1NUhFQTZCdnRqVDUKK2h0T3pkbFNZOUVxQnMxT2RUVURzNVhjVFJhOWJxaC9ZTDB5Q2UvNHF4Rmk3VC95ZS9RTmxHaW9PdzZVZ0ZwUnJlYWFpRXJTN0dxUWoKK2VsL3dyb1FrNVBNcis0b2tveWVZWmRvd2RYYjhHWkhvMit1YlB6Sy9RSmNISnJyTTg1U0ZTbm9uazgrUVF0UzRXeGFtNTh0QUE5MTUKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRUJHIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx4QzRceDlGbGF5XHhjNFx4YjFceDYzXHhjNFx4YjFzXHhjNFx4YjEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUY1ekNDQTgrZ0F3SUJBZ0lJVEs5elFoeU9kQUl3RFFZSktvWklodmNOQVFFRkJRQXdnWUF4T0RBMkJnTlZCQU1NTDBWQ1J5QkYKK2JHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4TVRjd05RWURWUVFLREM1RlFrY2cKK1FtbHNhY1dmYVcwZ1ZHVnJibTlzYjJwcGJHVnlhU0IyWlNCSWFYcHRaWFJzWlhKcElFRXV4WjR1TVFzd0NRWURWUVFHRXdKVVVqQWUKK0Z3MHdOakE0TVRjd01ESXhNRGxhRncweE5qQTRNVFF3TURNeE1EbGFNSUdBTVRnd05nWURWUVFEREM5RlFrY2dSV3hsYTNSeWIyNXAKK2F5QlRaWEowYVdacGEyRWdTR2w2YldWMElGTmh4SjlzWVhuRXNXUEVzWFBFc1RFM01EVUdBMVVFQ2d3dVJVSkhJRUpwYkduRm4ybHQKK0lGUmxhMjV2Ykc5cWFXeGxjbWtnZG1VZ1NHbDZiV1YwYkdWeWFTQkJMc1dlTGpFTE1Ba0dBMVVFQmhNQ1ZGSXdnZ0lpTUEwR0NTcUcKK1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUR1b0lSaDBEcHFaaEF5MkRFNGY2ZW41ZjJoNGZ1WGQ3aHhsdWdUbGthRFQ3YnkKK1gzSldiaE5ncFFHUjRsdkZ6VmNmZDJOUi95ODkyN2svcXFrMTUzblE5ZEFrdGlIcTZ5T1UvaW0vKzRtUkRHU2FCVW9yekF6dThUMmIKK2dtbWtUUGlhYitjaTJoQzZYNUw4R0NjS3FLcEUraTRzdFB0R21nZ0RnM0tyaU9ScWNzbmxaUjl1S2crZHMrZzc1QXh1ZXRwWC9kZnIKK2VZdGVJQWJUZGd0c0FwV2psdVRMZGxIUktKMmhHdnhFb2szTWVuYW9EVDIvRjA4aWlGRDlycmJza0ZCS1c1K1ZRYXJLRDdKSy9vQ1oKK1RxTkdGYXY0YzBKcXdtWjJzUW9tRmQyVGt1emJxVjlVSWxLUmNGMFQ2a2pzYmdOczJkMXMvT3NOQS8rbWd4S2I4YW1URDhVbVRER3kKK1k1bGhjdWNxWkpuU3VPbDE0bnlwcVpvYXFzTlcyeENhUElOU3RudVd0NnlIZDZpNThtY0xsRU96cno1eitrSTJzU1hGQ2pFbU4xWm4KK3VxTUxmZGIzaWMxbm9iYzZIbVpQOXFCVkZDVk1MRE1OcGtHTXZRUXhhaEJ5Q3AwT0xuYTlYdk5SaVl1b1AxVnp2OXM2eGlRRmxwSkkKK3FrdU5LZ1BsVjVFUTlHb29GVzVIZDRSY1VYU2ZHZW5tSG1NV09lTVJGZU5ZR2tTOXk4UnNadGVFQnQ4dzlEZWlReUo1MGhCczM3dm0KK0V4SDhuWVFLRTN2d085RDhvd3JYaWVxV2ZvMUloUjVrWDl0VW9xelZlZ0o1YTlLSzhHZmFaWElORkhEazZZNTRqekowZkZmeTF0YjAKK05va2IrQ2xzaTduMmw5R2tMcXErQ3huQ1JlbHdYUUlEQUozWm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKKy93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTU4N0dUL3dXWjViNlNxTUh3UVNueTJyZTJrY3dId1lEVlIwakJCZ3dGb0FVNTg3R1Qvd1cKK1o1YjZTcU1Id1FTbnkycmUya2N3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUp1WW1sMis4eWdqZHNaczkzL21RSjdBTnR5VkRSMnQKK0ZjVTIyTlU1Ny9JZUlsNnpnclJkdTB3YXlwSU4zMGNrSHJNazJwR0k2WU53M1pQWDZicXozeFphUHQ3Z3lQdlQvV3dwK0JWR29HZ20KK3pKTlNyb0lCazVES2Q4cE5TZS9pV3RrcXZURE9UTEtCdGpET1dVL2FXUjFxZXFSRnNJSW1nWVoyOWZVUUFManVzd25vVDRjQ0I2NGsKK1hQQmZyQW93eklwQW9ITUV3ZnVKSlBhYUhGeTNQQXBuTmdVSU1iT3YyQUZvS3VCNGozVGV1Rkdrakd3Z1BhTDdzOVFKL1h2Q2dLcVQKK2JDbVlJYWk3RnZPcEVsOTB0WWVZOHBVbTN6VHZpbE9SaUYwYWxLTS9mQ0w0MTRpNnBveVdxRDFTTkdLZkFCNVVWVUpueGsxR2o3c1UKK1JUMEtsaGFPRUtHWG1kWFRNSVhNM3JSeXQ3eUtQQmdwYVAzY2NRZnVKRGxxK3UybHJEZ3YrUjRRRGdaeEdoQk0vblYrL3g1WE9VTEsKKzErRVZvVlpWV1J2Um82OFIyRTdEcFN2dmtML0E3SUlUVzQzV2NpeVRUbzlxS2QrRlBOTU40S0lZRXN4VkwwZTNwNXNDL2tIMmlFeHQKKzJxa0JSNE5rSjJJUWd0WVNlMTRESHpTcHlaSCtyMTF0aGllM0k2cDFHTW9nNTdBUDE0a09wbWNpWS9TRFFTc0dTN3RZMWRIWHQ3a1EKK1k5aUpTclNxM1JaajlXNitZS0g0N2VqV2tFOGF4c1dnS2RPbklhajFXanozeDBtaUlacEtsVklnbG5LYVpzdjMwb1pEZkNLK2x2bTkKK0FhaEgzZVU3UVBsMUs1c3JSbVNHalI3MGovc0hkOURxU2FJY2pWSVVwZ3FUCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK2NlcnRTSUdOIFJPT1QgQ0EKKz09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVEFsSlBNUkV3RHdZRAorVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQWVGdzB3TmpBM01EUXhOekl3TURSYQorRncwek1UQTNNRFF4TnpJd01EUmFNRHN4Q3pBSkJnTlZCQVlUQWxKUE1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRQorQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SQorSlVxT3RkdTBLQnVxVjVEbzBTTFRaTHJUaytqVXJJWmhRR3BnVjJoVWhFMjhhbFFDQmYvZm01b3FybDBIajByREtIL3YreXY2ZWZISAorcmZBUVV5U1FpMmJKcUlpcnIxcWpBT20rdWtidVczTjdMQmVDZ1Y1aUxLRUNaYk85eFNzQWZzVDhBek5YRGUzaStzNWRSZFk0elRXMgorc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1FPQTcrajB4Ym0wYnFRZld3Q0hURAorMElnenRuelhkTi9jaE5GRERuVTVvU1ZBS09wNHl3NHNMam1kakl0dUZod3ZKb0lRNHVObGxBb0V3RjczWFZ2NEVPTFF1bnBMKzk0MworQUFBYVd5amowcHh6UGpLSG1LSEpVUy9YM3F3enMwOENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QgorQWY4RUJBTUNBY1l3SFFZRFZSME9CQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQgorQVFBKzBoeUpMalg4K0hYZDVuOWxpUFJ5VE1rczF6Sk84OTBaZVVlOWpqdGJrdzlRU1NRVGF4UUdjdThKMDZHaDQwQ0V5ZWNZTW5ROAorU0c0UG4wdlU5eDdUazRaa1ZKZGpjbERWVmMvNklKTUNvcHZESTVOT0ZsVjJvSEI1YmMwaEg4OHZMYndaNDRneCtGa2FnUW5JbDZaMAoreDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdAordkJUakQ0YXU4YXMreDZBSnpLTkkwZURiWk9lU3RjK3Zja053aS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOegorVG9nVlo5NmVkaEJpSUw1VmFaVkRBRGxOOXU2d1drNUpSRlJZWDBLRAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDTk5JQyBST09UCis9PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURWVENDQWoyZ0F3SUJBZ0lFU1RNQUFUQU5CZ2txaGtpRzl3MEJBUVVGQURBeU1Rc3dDUVlEVlFRR0V3SkRUakVPTUF3R0ExVUUKK0NoTUZRMDVPU1VNeEV6QVJCZ05WQkFNVENrTk9Ua2xESUZKUFQxUXdIaGNOTURjd05ERTJNRGN3T1RFMFdoY05NamN3TkRFMk1EY3cKK09URTBXakF5TVFzd0NRWURWUVFHRXdKRFRqRU9NQXdHQTFVRUNoTUZRMDVPU1VNeEV6QVJCZ05WQkFNVENrTk9Ua2xESUZKUFQxUXcKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURUTmZjL2MzZXQ2RnR6RjhMUmIrMVZ2RzdxNktSNXNtekQKK28rL2huN0U3U0lYMW1sd2hJaEFzeFlMTzJ1T2FiamZoaHl6Y3VReGF1b2hWMy8ycTJ4OHg2Z0h4M3prQndSUDlTRkloeEZYZjJ0aXoKK1ZIYTZkTEczZmRmQTZQWlp4VTNJdmEwZkZOcmZXRVFsTWhrcXgzNStqcTQ0c0RCN1IzSUpNZkF3MjhNYmRpbTdhWFpPVi9rYlpLS1QKK1ZyZHZtVzdiQ2dTY0VlT0FIOHRqbEJBS3FlRmtnakg1akNmdHBwa0E5bkNUR1BpaE5JYWozWHJDR0huMmVtVTF6NURydlRPVG4xT3IKK2N6dm1telFnTHgzdnFSMWpHcUNBMndNditTWWFodEtOdTZtK1VqcUhaMGdOdjdTZzJDYStJMTl6TjM4bTVwSUVvMy9QSUtlMzh6cksKK3k1bkxBZ01CQUFHamN6QnhNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFmQmdOVkhTTUVHREFXZ0JSbDhqR3RLdmYzM1ZLV0NzY0MKK3dRN3ZwdFU3RVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQi9qQWRCZ05WSFE0RUZnUVVaZkl4clNyMzk5MVMKK2xnckhBc0VPNzZiVk94RXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRXMxN3N6a3JyL0RicTJmbFR0TFAxc2UzMWNwb2xuS09PSzUKK0d2K2U1bTR5M1I2dTZqVzM5Wk9SVHRwQzRjTVhZRkR5MFZ3bXVZSzM2bTNrbklUbkEza1hyNWc5bE52SHVnRG51TDhCVjhGM1JUSU0KK08vRzBIQWl3L1ZHZ29kMmFIUk0ybW0yM3h6eTU0Y1haRi9xRDFUMFZvRHk3SGd2aXlKQS9xSVlNL1BtTFhvWExUMXRMWWhGSHhVVjgKK0JTOUJzWjRRYVJ1Wmx1QlZlZnRPaHBtNGxOcUdPR3FUbytmTGJ1WGY2aUZWaVp4OWZYK1k5UUNKN3VPRXdGeVd0Y1ZHNmtiZ2hWVzIKK0c4a1Mxc0hOellEekFnRTh5R25MUlVoajJKVFE3SVVPTzA0UlpmU0NqS1k5cmk0aWxBbklYT284Z1YwV0tnT1hGbFVKMjRwQmdwNW0KK214RT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQXBwbGljYXRpb25DQSAtIEphcGFuZXNlIEdvdmVybm1lbnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURvRENDQW9pZ0F3SUJBZ0lCTVRBTkJna3Foa2lHOXcwQkFRVUZBREJETVFzd0NRWURWUVFHRXdKS1VERWNNQm9HQTFVRUNoTVQKK1NtRndZVzVsYzJVZ1IyOTJaWEp1YldWdWRERVdNQlFHQTFVRUN4TU5RWEJ3YkdsallYUnBiMjVEUVRBZUZ3MHdOekV5TVRJeE5UQXcKK01EQmFGdzB4TnpFeU1USXhOVEF3TURCYU1FTXhDekFKQmdOVkJBWVRBa3BRTVJ3d0dnWURWUVFLRXhOS1lYQmhibVZ6WlNCSGIzWmwKK2NtNXRaVzUwTVJZd0ZBWURWUVFMRXcxQmNIQnNhV05oZEdsdmJrTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKK0NnS0NBUUVBcDIzZ2RFNkhqNlVHM21paTI0YVpTMlFOY2ZBS0JadU9xdUhNTHRKcU84RjZ0SmRoallxK3hwcWNCclNHVWVRM0RuUjQKK2ZsK0tmNVNrMTBjSS9WQmFWdVJvckNoem9IdnBmeGlTUUU4dG5mV3VSRWh6TmdhZVpDdzdOQ1BiWENia2NYbVAxRzU1SXJtVHdjck4KK3dWYnRpR3JYb0RraEJGY3Nvdlc4UjBGUFhqUWlsYlVmS1cxZVN2Tk5jcjVCVmlDSC9PbFFSOWN3Rk81Y2pGVzZXWTJIL0NQZWs5QUUKK2pQM3ZiYjNRZXNtbE9tcHlNOFpLRFFVWEtpMTdzYWZZMXZDKzlEL3FEaWh0UVdFamRuakR1R1drODFxdXpNS3EyZWRZM3JaK25ZVnUKK255b0tiNThES1RDWEtCMjh0ODlVS1U1Uk1ma250aWdtL3FKajVrRVc4RE9ZUndJREFRQUJvNEdlTUlHYk1CMEdBMVVkRGdRV0JCUlUKK1dzc21QM0hNbEVZTmxsUHFhMGpRay81Q2RUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1dRWURWUjBSQkZJd1VLUk9NRXd4Q3pBSkJnTlYKK0JBWVRBa3BRTVJnd0ZnWURWUVFLREEvbWw2WG1uS3psbTczbWxML2x1cHd4SXpBaEJnTlZCQXNNR3VPQ291T0RsK09EcXVPQ3NlT0QKK3ZPT0N0K09EcCtPRHMwTkJNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRGxxUkhaM09EcnMKK28yZEdEL21MQnFqN2FwQXh6bjdzMnRHSmZIcnJMZ3k5bVRMbnNDVFd3Ly8xc29nSmh5empWT0dqcHJJSUM4Q0ZxTWpTbkhIMkhaOWcKKy9EZ3pFK0dlM0F0ZjJoWlFLWHN2Y0pFUG1ibzBOSTJWZE1WK2VLbG1YYjNLSVhkQ0VLeG1KajNla2F2OUZmQnY3V3hmRVBqekZ2WUQKK2lvK25FaEVNeS8wL2VjR2MvV0x1bzg5VURORXJYeGMrNHo2L3dDcytDWnYraUtaK3RKSVgvQ09VZ2IxdXA4V013dXNSUmR2NFFjbVcKK2R1cHdYM2tTYStTakIxb0Y3eWRKenlHZmlrd0pjR2FwSnNFckVVNHowZzc4MW16U0RqSmthUCt0QlhoZkF4Mm80NUNzSk9BUFFLZEwKK3Jvc290NExLR0FmbXQxdDA2U0FaZjdJYmlWUT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRC9qQ0NBdWFnQXdJQkFnSVFGYXh1bEJteWVVdEI5aWVwd3hnUEh6QU5CZ2txaGtpRzl3MEJBUXNGQURDQm1ERUxNQWtHQTFVRQorQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNElFZGxiMVJ5ZFhOMAorSUVsdVl5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTJNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeQorZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjek1CNFhEVEE0TURRd01qQXdNREF3TUZvWERUTTNNVEl3TVRJegorTlRrMU9Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBbworWXlrZ01qQXdPQ0JIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTBCZ05WQkFNVAorTFVkbGIxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITXpDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOemlYbUpZSFROWE9USXordXZMaDR5bjFFcmRCb2pxWkk0eG1LVTRrQjZZenk1agorSy9CR3ZFU3lpYUhBS0F4SmNDR1ZuMlRBcHBNU0FtVW1oc2FsaWZENjE0U2djSzlQR3BjL0JrVFZ5ZXR5RUgza01TajdIR0htS0FkRQorYzVJaWFhY0RpR3lkWThoUzJwZ241d2hNY0Q2MHlSTEJ4V2VEWFRQekF4SHNhdEJUNHRHNk5tQ1VnTHRoWTJ4YkYzN2ZRSlFlcXczQworSVNod2lQL1dKbXhzWUFRbFRsVitmZSsvbEVqZXR4M2RjSTBGWDRpbG0vTEM3dXJSUUVGdFlqZ2RWZ2JGQTBkUklCbjhleEFMRG1LdQorZGxXL1gzZStQa2tCVXoyWUpRTjJKRm9kdE51SjZubmx0ck03UDdwTUtFRi9CcXhxanNIUTlnVWRmZVpDaHVPbDFVY0NBd0VBQWFOQworTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRk1SNXlvNmhUZ01kSE54cgorMnpGYmxENC9NSDh0TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OQorY3I1SHFRNlhFcmhLOFdUVE9kOGxOTlRCelU2QjhBOEV4Q1N6TkpiR3Bxb3czMmhoYzlmNWpvV0o3dzVlbFNoS0tpZVBFSTR1ZkliRQorQXA3YURIZGxEa1FOa3YzOXN4WTIraEVOSFl3T0I0bHFLVmIzY3ZUZEZaeDNOV1pYcXhOVDJJN0JRTVhYRXhaYWNzZTNhUUhFZXJHRAorQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSFNKc01DOHRKUDMzcwordC8zTGpXZUpHcXZ0dXg2akFBZ0lGeXFDWERGZFJvb3RENGFiZE5sRis5UkFzWHFxYUMyR3Nwa2k0Y0VyeDV6NDgxK29naExyR1JFdAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCit0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDaURDQ0FnMmdBd0lCQWdJUU5md21YTm1FVDhrOUpqMVhtNjdYVmpBS0JnZ3Foa2pPUFFRREF6Q0JoREVMTUFrR0ExVUVCaE1DCitWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRTRNRFlHQTFVRUN4TXZLR01wSURJd01EY2dkR2hoZDNSbExDQkpibU11CitJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnCitRMEVnTFNCSE1qQWVGdzB3TnpFeE1EVXdNREF3TURCYUZ3MHpPREF4TVRneU16VTVOVGxhTUlHRU1Rc3dDUVlEVlFRR0V3SlZVekVWCitNQk1HQTFVRUNoTU1kR2hoZDNSbExDQkpibU11TVRnd05nWURWUVFMRXk4b1l5a2dNakF3TnlCMGFHRjNkR1VzSUVsdVl5NGdMU0JHCitiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFa01DSUdBMVVFQXhNYmRHaGhkM1JsSUZCeWFXMWhjbmtnVW05dmRDQkRRU0F0CitJRWN5TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVvdFdjZ251Vm5mRlNlSWYraWhhL0JlYmZvd0pQRFFmR0FGRzZEQUpTCitMU0trUWpuRS9vL3F5Y0crMUUzL24zcWU0ckY4bXEybmhnbHpoOUhubXVONnBhcHUrN3F6Y01CbmlLSTExS09hc2YydHd1OHgrcWk1Cis4L3NJeHBIUit5bVZvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVCittdGdBTUFEbmEzK0ZHTzZMdHM2S0RQZ1I0YnN3Q2dZSUtvWkl6ajBFQXdNRGFRQXdaZ0l4QU4zNDRGZEhXNmZtQ3NPOTlZQ0tselVOCitHNGs4VklaM0tNcWg5SG5ldGVZNHNQQmxjSXgvQWxUQ3YvL1lvVDdaendJeEFNU05sUHpjVTlMY25YZ1dIeFV6STFOUzQxb3hYWjNLCitycjBUS1VRTkoxdW81MmljRXZkWVB5NXlBbGVqajZFVUxnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKwordGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQnJqRUxNQWtHQTFVRQorQmhNQ1ZWTXhGVEFUQmdOVkJBb1RESFJvWVhkMFpTd2dTVzVqTGpFb01DWUdBMVVFQ3hNZlEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMgorYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJd01EZ2dkR2hoZDNSbExDQkpibU11SUMwZ1JtOXlJR0YxZEdodgorY21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVkJBTVRHM1JvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFZ0xTQkhNekFlRncwdworT0RBME1ESXdNREF3TURCYUZ3MHpOekV5TURFeU16VTVOVGxhTUlHdU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaAorZDNSbExDQkpibU11TVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sY25acFkyVnpJRVJwZG1semFXOXVNVGd3TmdZRAorVlFRTEV5OG9ZeWtnTWpBd09DQjBhR0YzZEdVc0lFbHVZeTRnTFNCR2IzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEVrTUNJRworQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXZkQ0JEUVNBdElFY3pNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQorTUlJQkNnS0NBUUVBc3I4bkxQdmIyRnZkZUhzYm5uZG1nY3Mrdkh5dTg2WW5talNqYURGeE9ETmk1UE54Wm5teHFXV2pwWXZWajJBdAorUDBMTXFtc3l3Q1BMTEVIZDVOLzhZWnppYzdJaWxSRkRHRi9FdGg5WGJBb0ZXQ0xJTmt3NmZLWFJ6NGF2aUtkRUFoTjBjWE1LUWxrQworK0JzVWEwTGZiMSs2YTRLaW5Wdm5TcjBlQVhMYlMzVG9PMzkvZlI4RXRDYWI0TFJhckVjOVZialhzQ1pTS0FFeFFHYlkyU1M5OWlyWQorN0NGSlhKdjJldWwvVlRWK2xtdU5rNU1ueTVLNzZxeEF3Si9DK0lEUFhmUmEzTTUwaHFZK2JBdFR5cjJTemhrR2N1WU1YRGhweHdUVwordkd6T1cvYjNhSnpjSlJWSWlLSHBxZmlZbk9EejFURW9ZUkZzWjVhTk9abkx3a1VrT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RQorQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVyV3lxbEdDYzdlVC8rajRLZEN0akEvZTJXYjh3RFFZSgorS29aSWh2Y05BUUVMQlFBRGdnRUJBQnBBMkpWbHJBbVNpY1k1OUJEbHFRNW1VMTE0M3Zva2tidm5SRkhmeGhZMEN1OXFSRkhxS3dlSworQTNyRDZ6OEtMRklXb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQordDhqTFo4SEpuQm9ZdU1URFNRUHhZQTVRelViRjgzZDU5N1lWNERqYnh5OG9vQXcvZHlaMDJTVVMyakhhR2g3Y0tVR1JJanhwcDdzQworOHJaY0p3T0o5QWJxbStSeWd1T2hDY0hwQUJuVFB0UndhN3B4cHFwWXJ2Uzc2V3kyNzRmTW03di9PZVpXWWRNS3A4UmNUR0I3QlhjbQorZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadU1kUkFHbUkwTmo4MUFhNnNZNkE9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNyakNDQWpXZ0F3SUJBZ0lRUExMMFNBb0E0djdySkR0ZVlEN0RhekFLQmdncWhrak9QUVFEQXpDQm1ERUxNQWtHQTFVRUJoTUMKK1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBM0lFZGxiMVJ5ZFhOMElFbHUKK1l5NGdMU0JHYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURTJNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkQKK1pYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0SUVjeU1CNFhEVEEzTVRFd05UQXdNREF3TUZvWERUTTRNREV4T0RJek5UazEKK09Wb3dnWmd4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUhaVzlVY25WemRDQkpibU11TVRrd053WURWUVFMRXpBb1l5a2cKK01qQXdOeUJIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTBCZ05WQkFNVExVZGwKK2IxUnlkWE4wSUZCeWFXMWhjbmtnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dMU0JITWpCMk1CQUdCeXFHU000OUFnRUcKK0JTdUJCQUFpQTJJQUJCV3g2UDBERlVQbHJPdUhOeEZpNzlLRE5sSjlSVmNMU28xN1ZEczZibDhWQXNCUXBzOGxMMzNLU0xqSFVHTWMKK0tpRUlmSm8yMkF2KzBTYkZXREV3S0NYelhWMmp1TGFsdEpMdGJDeWY2OTFEaWFJOFMwaVJIVkRzSnQvV1lDNjlJYU5DTUVBd0R3WUQKK1ZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcSsKK0VWWFZNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR1NXV2Fib0NkNkx1dnBhaUlqd0g1SFRScWp5U2t3Q1kvdHNYempiTGtHVHFRN20KK25kd3hITEtncHhnY2VlSEhOZ0l3T2xhdm1uUnM5dnVENERQVENGK2huTUpibjBiV3RzdVJCbU9pQnVjenJENm9nUkxReTdyUWtndTIKK25wYXFCQStLCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFdVRDQ0E2R2dBd0lCQWdJUVFCckVaQ0d6RXlFRERydmtFaHJGSFRBTkJna3Foa2lHOXcwQkFRc0ZBRENCdlRFTE1Ba0dBMVVFCitCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPCitaWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd09DQldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrCitJSFZ6WlNCdmJteDVNVGd3TmdZRFZRUURFeTlXWlhKcFUybG5iaUJWYm1sMlpYSnpZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1CitJRUYxZEdodmNtbDBlVEFlRncwd09EQTBNREl3TURBd01EQmFGdzB6TnpFeU1ERXlNelU1TlRsYU1JRzlNUXN3Q1FZRFZRUUdFd0pWCitVekVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2CitjbXN4T2pBNEJnTlZCQXNUTVNoaktTQXlNREE0SUZabGNtbFRhV2R1TENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sCitJRzl1YkhreE9EQTJCZ05WQkFNVEwxWmxjbWxUYVdkdUlGVnVhWFpsY25OaGJDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwCithRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeDJFM1hyRUJOTnRpMXhXYi8xaGFqQ01qCisxbUNPa2RlUW1JTjY1bGdaT0l6Rjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQCitNaUpoZ3NXSEgyNk1mRjhXSUZGRTBYQlBWK3JqSE9QTWVlNVkyQTdDczBXVHdDem5taGNyZXdBM2VrRXplT0V6NHZNUUduK0hMTDcyCis5ZmRDNHVXL2gyS0pYd0JMMzhYZDVIVkVNa0U2SG5GdWFjc0xkVVlJMGNyU0s1WFF6L3U1UUd0a2pGZE4vQk1SZVlUdFhsVDJOSjhJCitBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFRySjlWQU1mMkNHcVV1Vi9jNERQeGhHRDVXeWNSCit0UHdXOHJ0V2FvQWxqUUlEQVFBQm80R3lNSUd2TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNRzBHCitDQ3NHQVFVRkJ3RU1CR0V3WDZGZG9Gc3dXVEJYTUZVV0NXbHRZV2RsTDJkcFpqQWhNQjh3QndZRkt3NERBaG9FRkkvbDB4cUdySTJPCithOFBQZ0dyVVNCZ3NleGt1TUNVV0kyaDBkSEE2THk5c2IyZHZMblpsY21semFXZHVMbU52YlM5MmMyeHZaMjh1WjJsbU1CMEdBMVVkCitEZ1FXQkJTMmQvcHBTRWVmVXhMVnd1b0hNbllIMFpjSEdUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFTdmo0c0FQbUxHZDc1SlIzCitZOHh1VFBsOURnM2N5TGsxdVhCUFkvb2srbXlEakVlZE8yUHptdmwyTXBXUnNYZThySnErc2VReEljYUJsVlphRHJIQzFMR21XYXp4CitZOHU0VEIxWmtFcnZrQllvSDFxdUVQdUJVRGdNYk16eFBjUDFZK096NHlISkpEbnAvUlZtUnZRYkVkQk5jNk45UnZrOTdhaGZZdFR4CitQL2pnZEZjckdKMkJ0TVFvMnBTWHBYRHJyQjIrQnhIdzFkdmQ1WXp3MVRLd2crWlg0bysvdnFHcXZ6MGR0ZFE0NnRld1hEcFBhaitQCit3R1pzWTZycDJhUVc5SUhSbFJRT2ZjMlZOTm5TajNCemdYdWNmcjJZWWRoRmg1aVF4ZXVHTU1ZMXYvRC93MVdJZzB2dkJaSUdjZks0CittSk8zN00yQ1lmRTQ1aytYbUNwYWpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGhEQ0NBd3FnQXdJQkFnSVFMNEQrSTR3T0lnOUlaeElva1llc3N6QUtCZ2dxaGtqT1BRUURBekNCeWpFTE1Ba0dBMVVFQmhNQworVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSMworYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWegorWlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNUlFTmxjblJwWm1sagorWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpRd0hoY05NRGN4TVRBMU1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCeWpFTAorTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnBVMmxuYmlCVQorY25WemRDQk9aWFIzYjNKck1Ub3dPQVlEVlFRTEV6RW9ZeWtnTWpBd055QldaWEpwVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSbworYjNKcGVtVmtJSFZ6WlNCdmJteDVNVVV3UXdZRFZRUURFenhXWlhKcFUybG5iaUJEYkdGemN5QXpJRkIxWW14cFl5QlFjbWx0WVhKNQorSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVNuVm5wOAorVXRwa213NHRYTmhlckpJOS9nSG1HVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHegorcmwwQnAzdmVmTEsreW1WaEFJYXUybzk3MEltdFRSMVpta0d4dkVlQTNKNWl3L21qZ2JJd2dhOHdEd1lEVlIwVEFRSC9CQVV3QXdFQgorL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXZaMmxtTUNFdworSHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqYUhSMGNEb3ZMMnh2WjI4dWRtVnlhWE5wWjI0dQorWTI5dEwzWnpiRzluYnk1bmFXWXdIUVlEVlIwT0JCWUVGTE1Xa2YzdXBtN2t0UzVKajRkNGdZRHM1YkcxTUFvR0NDcUdTTTQ5QkFNRAorQTJnQU1HVUNNR1loREJnbVlGbzRlMVpDNEtmOE5vUlJrU0FzZGsxRFBjUWRoQ1BRck5aOE5RYk96V205a0EzYmJFaENIUTZxUWdJeAorQUp3OVNEa2pPVmdhRlJKWmFwN3YxVm15SFZJc21YSE54eW5mR3lwaGUzSFIzdlBBNVEwNlNxb3RwOWlHS3QwdUVBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVGVENDQXYyZ0F3SUJBZ0lHU1VFczVBQVFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR25NUXN3Q1FZRFZRUUdFd0pJVlRFUk1BOEcKK0ExVUVCd3dJUW5Wa1lYQmxjM1F4RlRBVEJnTlZCQW9NREU1bGRFeHZZMnNnUzJaMExqRTNNRFVHQTFVRUN3d3VWR0Z1dzdwenc2MTAKK2RzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkIKK2NtRnVlU0FvUTJ4aGMzTWdSMjlzWkNrZ1JzV1JkR0Z1dzdwenc2MTBkc09oYm5rd0hoY05NRGd4TWpFeE1UVXdPREl4V2hjTk1qZ3gKK01qQTJNVFV3T0RJeFdqQ0JwekVMTUFrR0ExVUVCaE1DU0ZVeEVUQVBCZ05WQkFjTUNFSjFaR0Z3WlhOME1SVXdFd1lEVlFRS0RBeE8KK1pYUk1iMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtYVdOaGRHbHYKK2JpQlRaWEoyYVdObGN5a3hOVEF6QmdOVkJBTU1MRTVsZEV4dlkyc2dRWEpoYm5rZ0tFTnNZWE56SUVkdmJHUXBJRWJGa1hSaGJzTzYKK2M4T3RkSGJEb1c1NU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeENSZWM3NUxiUlREb2ZUamw1QnUKKzBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncKKy9IcFl6WTZiN2NOR2JJUndYZHJ6QVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWsKK0gzQjVyOXM1VkExbGRka1ZRWlFCcjE3czlvM3gvNjFrL2lDYTExenIvcVlmQ0dTamkzWlZyUjQ3S0dBdWh5WG9xcThmeG1SR0lMZHcKK2Z6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MkJKdHIrVUJkQURUSExwbDEKK25lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VFTUE0R0ExVWREd0VCL3dRRUF3SUIKK0JqQWRCZ05WSFE0RUZnUVV6UHBuay9DMnVOQ2x3Qjd6VS8yTVU5K0QxNVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUt0Lzdod1cKK3FadzhVUUNnd0JFSUJhZVo1bThCaUZSaGJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGEKK1l0T1VaY1RoNW0yQytDOGxjTEloSnNGeVVSK01MTU9Fa01OYWo3clA5S2RscGV1WTBmc0Zza1oxRlNOcWI0VmpNSUR3MVo0ZktSekMKK2JMQlFXVjJRV3p1b0RURFB2MzEvenZHZGc3M0pSbTRncHZsaFVib2hMM3UrcFJWam9kU1ZoL0dldWZPSjh6MkZ1TGpidnJXNUtmbmEKK053VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTJYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXUKK2RaV0FVV3BMTUthd1lxR1Q4WnZZenNSamRUOVpSN0U9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1N0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRnlqQ0NBN0tnQXdJQkFnSUVBSmlXakRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKT1RERWVNQndHQTFVRQorQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaGRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0ZworVW05dmRDQkRRU0F0SUVjeU1CNFhEVEE0TURNeU5qRXhNVGd4TjFvWERUSXdNRE15TlRFeE1ETXhNRm93V2pFTE1Ba0dBMVVFQmhNQworVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiakVyTUNrR0ExVUVBd3dpVTNSaFlYUWdaR1Z5SUU1bAorWkdWeWJHRnVaR1Z1SUZKdmIzUWdRMEVnTFNCSE1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1WWgorNTI5MXFqNUxuTFc0cko0TDVQblp5cXRkajdVNUVJTFhyMUhnTytFQVNHclAydUVHUXhHWnFoUWxFcTBpNkFCdFE4U3B1T1VmaVV0bgordldGSTcvM1M0R0NJNWJrWVlDakRkeXV0c0RlcU45NWtXU3BHVitSTHVmZzNmTlUyNTREQnR2UFVaNXVXNk03WHhncFQwR3RKbHZPagorQ3dWM1NQY2w1WENzTUJRZ0plTi9kVnJsU1BoT2V3TUhCUHFDWVlkdThEdkVwTWZROVhRK3BWMGFDUEtiSmRMMnJBUW1QbFU2WWlpbAorZTdJd3IvZzN3dEc2MWpqOTlPOUpNRGVaSmlGSWhRR3A1UmJuM0pCVjN3L29PTTJaTnlGUFhmVWliMnJGRWhaZ0YxWHlaV2FtcHpDUgorT01FNEhZWUVoTG9hSlhoZW5hL01VR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSQorQ1QwdWdwVE5HbVhaSzRpYW1id1lmcC91ZldaOFByMlV1SUhPelpnd2VNRnZaOUMrWCtCbzdkN2lzY2tzV1hpU3F0OHJZR1B5NVY2NQorNDhyNmYxQ0dQcUkwR0F3SmFDZ1JIT1RodVZ3K1I3b3lQeGpNVzRUMTgydDB4SEowNGVPTG9FcTlqV1l2NnEwMTJpRFRpSUpoOEJJaQordHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLZU41S3psVy9IZFhadDFidjhIYi9DM20xcjczNworcVdtUlJwZG9nQlEySGJOL3V5bVlOcVVnK29KZ1lqT2s3TmE2QjZkdXhjOFVwdWZXa2pUWWdmWDhIVjJxWEI3Mm8wMDd1UGM1QWdNQgorQUFHamdaY3dnWlF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJTQmdOVkhTQUVTekJKTUVjR0JGVWRJQUF3UHpBOUJnZ3JCZ0VGQlFjQworQVJZeGFIUjBjRG92TDNkM2R5NXdhMmx2ZG1WeWFHVnBaQzV1YkM5d2IyeHBZMmxsY3k5eWIyOTBMWEJ2YkdsamVTMUhNakFPQmdOVgorSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKRm9Nb2NWSFluaXRmR3NOaWcwalF0OFlvanJNQTBHQ1NxR1NJYjNEUUVCQ3dVQQorQTRJQ0FRQ29RVXBuS3BLQmdsQnU0ZGZZc3prNzh3SVZDVkJSN3kyOUpIdUloanY1dEx5U0NaYTU5c0NySTJBR2VZd1JUbEhTZVlBegorKzUxSXZ1eEJRNEVmZmtkQUhPVjZDTXFxaTNXdEZNVEM2R1k4Z2dlbjVpZUNXeGptRDI3WlVENktRaGdweHJSVy9GWVFvQVVYdlF3agorZi9TVDdad2FVYjdkUlVHL2tTUzBINHpwWDg5N0labWZsWjg1T2tZY2JQbk5lNXlRelNpcHg2bFZ1NnhpTkdJMUUwc1VPbFdEdVlhTgora3FiRzlBY2xWTXdXVnhKS2duaklGTmtYZ2lZdFhTQWZlYTcrMUhBV0ZwV0QyRFU1LzFKZGRSd1d4Uk5WejBmTWRXVlNTdDd3c0tmaworQ3BZTCs2M0M0aVdFc3Qza3ZYNVpiSnZ3OE5qbnl2THBsemgraWI3TSt6a1hZVDl5MnpxUjJHVUJHUjJ0VUtSWENueEx2Snh4Y3lwRgorVVJtRnpJNzlSNmQwbFIybzBhOU9GN0ZwSnNLcWVGZGJ4VTJuNVo0RkY1VEtzbCtnU1JpTk5Pa21iRWdlcW1pU0JlR0NjMXFiM0FkYgorQ0cxOW5kZU5JZG44RkNDcXdrWGZQK2NBc2xIa3d2Z0Z1WGthakRUem5sdmtOMXRyU3Q4c1Y0cEFXamE2M1hWRUNEZENjQXorM0Y0aAorb0tPS3dKQ2NhTnBRNWtVUVIzaTJUdEpseWNNMzMrRkNZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVgorSVBWVllwYnRiWk5Rdk9TcWVLM1p5d3BsaDZabXdjU0JvM2M2V0I0TDdvT0xuUjdTVXFUTUhXK3dtRzJVTWJYNGNRcmN1Zng5TW1EbQorNjYrS0FRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ0EgRGlzaWcKKz09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVEekNDQXZlZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJLTVFzd0NRWURWUVFHRXdKVFN6RVRNQkVHQTFVRUJ4TUsKK1FuSmhkR2x6YkdGMllURVRNQkVHQTFVRUNoTUtSR2x6YVdjZ1lTNXpMakVSTUE4R0ExVUVBeE1JUTBFZ1JHbHphV2N3SGhjTk1EWXcKK016SXlNREV6T1RNMFdoY05NVFl3TXpJeU1ERXpPVE0wV2pCS01Rc3dDUVlEVlFRR0V3SlRTekVUTUJFR0ExVUVCeE1LUW5KaGRHbHoKK2JHRjJZVEVUTUJFR0ExVUVDaE1LUkdsemFXY2dZUzV6TGpFUk1BOEdBMVVFQXhNSVEwRWdSR2x6YVdjd2dnRWlNQTBHQ1NxR1NJYjMKK0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1M5akhCZllqOW1RR3AySHZ5Y1hYeE1jYnpkV2I2VVNoR2hKZDROTHhzL0x4RldZZ20KK0dFckVOeCtoU2tTOTQzRUU5VVFYNGovOFNGaHZYSjU2Q2JwUk55SWpaa01oc0R4a292aHFGUTQvNjFIaFZLbmRCcG5YbWp4VWl6a0QKK1B3L0Z6c2JyZzNJQ3FCOXg4eTM0ZFFqYllrem8rczc1NTJvZnRtczFncnJpanhhU2ZRVU1iRVlEWGNEdGFiODZ3WXFnNkk3WnVVVW8KK2h3anN0TW9Wdm9MZHRVU0xMYTJHREdoaWJZVlc4cXdVWXpyRzBabXNOSGhXUzgrMnJUK01pdGNFNWVONFRQV0dxdldQK2oxc2NhTXQKK3ltZnJhSHR1TTZrTWdpaW9UR29oUUJVZ0RDWmJnOEtwRmhYQUpJSmRLeGF0eW1QMmRBQ3czMFBFRUdCV1oyTkZBZ01CQUFHamdmOHcKK2dmd3dEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVqYkpKYUoxeUNDVzV3Q2YxVUpOV1NFWngrWTh3RGdZRFZSMFAKK0FRSC9CQVFEQWdFR01EWUdBMVVkRVFRdk1DMkJFMk5oYjNCbGNtRjBiM0pBWkdsemFXY3VjMnVHRm1oMGRIQTZMeTkzZDNjdVpHbHoKK2FXY3VjMnN2WTJFd1pnWURWUjBmQkY4d1hUQXRvQ3VnS1lZbmFIUjBjRG92TDNkM2R5NWthWE5wWnk1emF5OWpZUzlqY213dlkyRmYKK1pHbHphV2N1WTNKc01DeWdLcUFvaGlab2RIUndPaTh2WTJFdVpHbHphV2N1YzJzdlkyRXZZM0pzTDJOaFgyUnBjMmxuTG1OeWJEQWEKK0JnTlZIU0FFRXpBUk1BOEdEU3VCSHBHVDVnb0FBQUFCQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFGMDBkR0ZNcnp2WS81OXQKK1dEWWNQUXVCRFJJclJoQ0EvZWM4SjlCNnlLbTJmblF3TTZNNmludDB3SGw1UXBOdC83RXBGSUtySVl3dkYvay9KaS8xV2NidmdBYTMKK21ra3A3TTUrY1R4cUVFSEE5dE9hc254YWtaekFyRnZJVFY3MzRWUC9RM2Y4bmt0bmJOZnpnOUdnNEg4bDM3aVlDNW95T0d3d29QUC8KK0NCVXo5MUJLZXo2alBpQ3AzQzlXZ0FydFFWQ3d5ZlRzc3VNbVJBQU9iNTRHdkNLV1UzQmx4RkFLUm11a0x5ZUJFaWNUWHhDaGRzNksKK2V6ZnF3emxoQTVXWU91ZHNpQ1VJL0hsb0RZZDlZdmkwWC92RjJFeTlXTHcvUTF2VUhnRk5QR08rSSsrTXpWcFF1R2hVK1FxWk14RUEKKzRaN0NSbmVDOVZrR2pDRk1od25ONWFnPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitKdXVyLVNLCis9PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUU1akNDQTg2Z0F3SUJBZ0lFTzQ1TC9EQU5CZ2txaGtpRzl3MEJBUVVGQURCZE1SZ3dGZ1lKS29aSWh2Y05BUWtCRmdsd2EybEEKK2Myc3VaV1V4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0V4bEJVeUJUWlhKMGFXWnBkSE5sWlhKcGJXbHphMlZ6YTNWek1SQXcKK0RnWURWUVFERXdkS2RYVnlMVk5MTUI0WERUQXhNRGd6TURFME1qTXdNVm9YRFRFMk1EZ3lOakUwTWpNd01Wb3dYVEVZTUJZR0NTcUcKK1NJYjNEUUVKQVJZSmNHdHBRSE5yTG1WbE1Rc3dDUVlEVlFRR0V3SkZSVEVpTUNBR0ExVUVDaE1aUVZNZ1UyVnlkR2xtYVhSelpXVnkKK2FXMXBjMnRsYzJ0MWN6RVFNQTRHQTFVRUF4TUhTblYxY2kxVFN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKK2dnRUJBSUZ4Tmo0ekI5YmpNSTBUZm5jeVJzdlBHYkpnTVVhWGh2U1lScVRDWlVYUDAwQjg0MW9pcUJCNE04eUlzZE9CU3ZaaUYzdGYKK1RRb3UwTStMSSs1UEFrNjc2dzdLdlJoajZJQWNqZUVjalQzZy8xdGY2bVRsbCtnL21YOE1DZ2t6QUJwVHB5SGhPRXZXZ3h1dHIyVEMKKytSeDZqR1pJVFdZZkdBcmlQcnNmQjJXVGhia2FzTG5FK3cwUjl2WFcrUnZITEN1M0dGSCs0SHYycUVpdmJEdFBMKy80MFVjZUpsZncKK1VSMHpsdi92V1QzYVRkRVZOTWZxUHhaSWU1RWNnRU1QUGJnRlB0R3psYzNZeWcvQ1EyZmJ0NVBnSW9JdXZ2Vm9LSU81d1R0cGV5RGEKK1RweHQ0YnJOajNwc3NBa2kxNHNMMnh6VldpWmJEY0RxNVdEUW4vNDEzejhDQXdFQUFhT0NBYXd3Z2dHb01BOEdBMVVkRXdFQi93UUYKK01BTUJBZjh3Z2dFV0JnTlZIU0FFZ2dFTk1JSUJDVENDQVFVR0Npc0dBUVFCemg4QkFRRXdnZll3Z2RBR0NDc0dBUVVGQndJQ01JSEQKK0hvSEFBRk1BWlFCbEFDQUFjd0JsQUhJQWRBQnBBR1lBYVFCckFHRUFZUUIwQUNBQWJ3QnVBQ0FBZGdEa0FHd0FhZ0JoQUhNQWRBQmgKK0FIUUFkUUJrQUNBQVFRQlRBQzBBYVFCekFDQUFVd0JsQUhJQWRBQnBBR1lBYVFCMEFITUFaUUJsQUhJQWFRQnRBR2tBY3dCckFHVUEKK2N3QnJBSFVBY3dBZ0FHRUFiQUJoQUcwQUxRQlRBRXNBSUFCekFHVUFjZ0IwQUdrQVpnQnBBR3NBWVFCaEFIUUFhUUJrQUdVQUlBQnIKK0FHa0FiZ0J1QUdrQWRBQmhBRzBBYVFCekFHVUFhd0J6TUNFR0NDc0dBUVVGQndJQkZoVm9kSFJ3T2k4dmQzZDNMbk5yTG1WbEwyTncKK2N5OHdLd1lEVlIwZkJDUXdJakFnb0I2Z0hJWWFhSFIwY0RvdkwzZDNkeTV6YXk1bFpTOXFkWFZ5TDJOeWJDOHdIUVlEVlIwT0JCWUUKK0ZBU3Fla2VqNUltdkdzOEtRS2NZUDIvdjZYMitNQjhHQTFVZEl3UVlNQmFBRkFTcWVrZWo1SW12R3M4S1FLY1lQMi92NlgyK01BNEcKK0ExVWREd0VCL3dRRUF3SUI1akFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBZThFWWxGT2lDZlArSm1lYVVPVERCUzhyTlhpUlRIeW8KK0VSRjVURWxack1qM2hXVmNScnM3RUtBQ3I4MVB0Y3cyS3V4ZC91K2drY20yazI5OGdGVHN4d2h3RFk3N2d1d3FZSGhwTmpiUnhaeUwKK2FiVkF5SlJsZC9KWElXWTd6b1ZBdGpOakdyOTVIdnhjSGRNZGt4dUxERjJGdlprd01oZ0prVkxwZktHNi8yU1NtdXorTmU2TUw2NzgKK0lJYnNTdDRiZURJM3BvSFNuYTlhRWhiS21WdjhiMjBPeGFBZWhzbVIwRnlZZ2w5akRJcGFxOWlWcHN6TGl0YS9aRXVPeW9xeXNPa2gKK01wNnFxSVdZTklFNUlUdW9PbEl5UGZack40WUdXaFdZM1BBUlp2NDBJTGNEOUVFUWZUbUVlWlp5WTdhV0F1VnJ1YTBaVGJ2R1JOczIKK3l5cWNqZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlETURDQ0FoaWdBd0lCQWdJQ0ErZ3dEUVlKS29aSWh2Y05BUUVGQlFBd1J6RUxNQWtHQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9UCitEVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUI0WERUQXpNRFV4CitOVEExTVRNeE5Gb1hEVEl6TURVeE5UQTBOVEl5T1Zvd1J6RUxNQWtHQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9URFVodmJtZHJiMjVuCitJRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnVW05dmRDQkRRU0F4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCitBQU9DQVE4QU1JSUJDZ0tDQVFFQXJQODR0dWxtQWtuam9yVGhrUGxBajNuNTRyMTUvZ0s5N2lTU0hTTDIyb1Z5YWY3WFB3blUzWkcxCitBcHpRalZyaFZjTlFocmtwSnNMajJhRHhhUU1vSUlCRklpMVdwenRVbFZZaVdSOG8zeDhnUFcyaU5yNGpvTEZ1dGJFblB6bFRDZXFyCithdWgwc3NKbFhJNi9mTU40aE0yZUZ2ejFMazhnS2dpZmQvUEZIc1NhVW1ZZVNGN2pFQWFQSXBqaFpZNGJYU05tTzdpbE1sSElocXFoCitxWjUvZHBUQ3BteTNRZkRWeUFZNDV0UU00dk03VEcxUWpNU0RKOEVUaEZrOW5uVjB0dGdDWGpxUWVzQkNObkxzYWszYzc4UUEzeE1ZCitWMThtZU1qV0NubDN2L2V2dDNhNXBRdUVGMTBRNm0vaHE1VVJYMjA4bzF4TmcxdnlzeG1LZ0lzTGh3SURBUUFCb3lZd0pEQVNCZ05WCitIUk1CQWY4RUNEQUdBUUgvQWdFRE1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpCitoOWxlZ1lzQ21FRUlqRXk4MnR2dUp4dUM1MnBGN0JhTFQ0V2c4N0p3dlZxV3VzcHViZTVHaTI3bktpNldzeGt6NjdTZnFMSTM3cGlvCitsN1l1dG1jbjFLWkovUnlUWlhhZVFpL2NJbXlhVC9KYUZUbXhjZGNyVWVodEhKakEyU3Iwb1lKNzFjbEJvaU1CZERoVml3KzVMbWVpCitJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnNFaFRrWVkyc0VKQ2VoRkM3OEpadlJaK0s4OHBzCitUL29ST2hVVlJzUE5INE5iTFVFUzdWQm5RUk05SWF1VWlxcE9mTUd4KzZmV3RTY3ZsNnR1NEIzaTBSd3NIMFRpL0w2Um9aejcxaWxUCitjNGFmVTloRERsM1dZNEp4SFlCMHl2YmlBbXZaV2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTZWN1cmVTaWduIFJvb3RDQTExCis9PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURiVENDQWxXZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJZTVFzd0NRWURWUVFHRXdKS1VERXJNQ2tHQTFVRUNoTWkKK1NtRndZVzRnUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5d2dTVzVqTGpFY01Cb0dBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlMKK2IyOTBRMEV4TVRBZUZ3MHdPVEEwTURnd05EVTJORGRhRncweU9UQTBNRGd3TkRVMk5EZGFNRmd4Q3pBSkJnTlZCQVlUQWtwUU1Tc3cKK0tRWURWUVFLRXlKS1lYQmhiaUJEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWekxDQkpibU11TVJ3d0dnWURWUVFERXhOVFpXTjEKK2NtVlRhV2R1SUZKdmIzUkRRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkwKK1RKc3ppMW9VUmFUbmtCYlIzMWZTSVJDa0YvM2ZyTllmcCtUYmZQZnMzN2dEMnBSWS9WMXlmSXcvWHdGbmRCV1c0d0k4aDl1dXl3R08KK3d2Tm14b1ZGOUFMR09yVmlzcS82bkwrazV0U0FNSmp6RGJhVGo2blUyRGJ5c1B5S3lpeWhGVE9WTWRyQUcvTHVZcG1HWXorLzNaTXEKK2c2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5VUszMUJRMUZUMFp4L1NnK1Uvc0UyQzNYWlIxS0cvclAKK083QXhtalZ1eUlzRzB3Q1I4cFFJWlV5eE5BWUFlb25pOE1jRFdjL1YxdWluTXJQbW1FQ0d4YzBuRW92TWU4NjNFVHhpWUFjalBpdEEKK2JwU0FDVzIyczI5M2J6VUlVUHNDaDhVK2lRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVXL2hOVDdLbGh0UTYwdkZqbXFDK0NmWlgKK3Q5NHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLQ2gKK09CWm1McWRXSHlHY0J2b2Q3YmtpeFRnbTJFNVA3S04vZWQ1R0lhR0hkNDhIQ0pxeXBNV3ZEektZQzN4bUtiYWJmU1ZTU1VPclRDNHIKK2JucHdyeFlPNHdKcyswTG1HSjFGMkZYSTZEdmQ1K0gwTGdzY05GeHNXRXI3akloUVg1VWN2KzJySXJWbHM0VzZuZys0cmVWNkc0cFEKK09oMjlEYng3VkZBTHVVS3ZWYUFZZ2ExbG1lKys1SnkveElXclFiSlViOXdsemUxNDRvNE1qUWxKM1dON1dtbVdBaUdvdlZKWjZYMDEKK3k4aFN5bitCL3RscjAvY1I3U1hmK09mNXBQcHlsNFJURGFYUU1oaFJkbGtVYkEvcjdGK0FqSFZEZzhPRm1QOU1uaTBONUhlRGswNjEKK2xnZUxLQk9iakJtTlFTZEpRTzdlNWlORU9keWhJdGE2QS9JPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBQ0VESUNPTSBSb290Cis9PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ0VENDQTUyZ0F3SUJBZ0lJWVkzSGhqc0JnZ1V3RFFZSktvWklodmNOQVFFRkJRQXdSREVXTUJRR0ExVUVBd3dOUVVORlJFbEQKK1QwMGdVbTl2ZERFTU1Bb0dBMVVFQ3d3RFVFdEpNUTh3RFFZRFZRUUtEQVpGUkVsRFQwMHhDekFKQmdOVkJBWVRBa1ZUTUI0WERUQTQKK01EUXhPREUyTWpReU1sb1hEVEk0TURReE16RTJNalF5TWxvd1JERVdNQlFHQTFVRUF3d05RVU5GUkVsRFQwMGdVbTl2ZERFTU1Bb0cKK0ExVUVDd3dEVUV0Sk1ROHdEUVlEVlFRS0RBWkZSRWxEVDAweEN6QUpCZ05WQkFZVEFrVlRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKK0FBT0NBZzhBTUlJQ0NnS0NBZ0VBLzVLVjRXZ0dkclFzeUZoSXl2MkFWQ2xWWXlUL2tHV2JFSFY3dzJyYllnSUI4aGlHdFh4YU9MSGsKK1dMbjcwOWd0bjcweU43OHNGVzIrdGZRaDBoT1IyUWV0QVFYVzg3MTN6bDlDZ1FyNWF1T0RBS2dyTGxVVFk0SEtSeHg3WEJaWGVodUQKK1lBUTZQbVhEelFIZTNxVFdETHFPM3RrRTdoZFdJcHVQWS8xTkZndTNlM2VNK1NXMTBXMlpFaTVQR3JqbTZnU1NyajBSdVZGQ1BZZXcKK01ZV3ZlVnFjL3VkT1hwSlBRL3lyT3EybEVpWm11ZUlNMTVqTzFGaWxsVUFLdDBTZEUzUXJ3cVhySWhXWUVOaUx4UVNmSFk5ZzVRWWIKK204KzVlYUE5b2lNL1FqOXIraHdEZXpDTnptekF2K1liWDc5bnVJUVoxUlh2ZTh1UU5qRml5YndDcTBaZm0vNGFhSlEwUFpDT3JmYmsKK0hRbC9Tb2c0UDc1bi9UU1c5UjI4TUhUTE9PN1ZiS3ZVL1BRQXR3QmJoVElXZGpQcDJLT1puUVVBcWhibTg0RjliMzJxaG0ydEZYVFQKK3hLSnhxdlFVZmVjeXVCKzgxZkZPdlc4WEFqblhEcFZDT3NjQVB1a21ZeEhxQzlGSy94aWRzdGQ3THpyWmx2dm9IcEt1RTFYSTJTZjIKKzNFZ2JzQ1RCaGVOM25acWs4d3dSSFEzSXRCVHV0WUpYQ2I4Z1dIOHZJaVBZY010NWJNbEw4cWtxeVB5SEs5Y2FVUGduNkM5RDR6cTkKKzJGZHgvYzZtVWx2NTNVM3Q1Zlp2aWUyN2s1eDJJWFh3a2t3cDl5K2NBUzcrVUVhZVpBd1Vzd2RieGNKemJQRUhYRVVrRkRXdWcvRnEKK1RZbDYrclBZTFdid05vZjFLMU1DQXdFQUFhT0JxakNCcHpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLYXoKKzRTc3JTYmJYYzZHcWxQVUI1M05sVEt4UU1BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVXByUGhLeXRKdHRkem9hcVUKKzlRSG5jMlZNckZBd1JBWURWUjBnQkQwd096QTVCZ1JWSFNBQU1ERXdMd1lJS3dZQkJRVUhBZ0VXSTJoMGRIQTZMeTloWTJWa2FXTnYKK2JTNWxaR2xqYjIxbmNtOTFjQzVqYjIwdlpHOWpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUNBUURPTEF0U1VXSW1mUXduZzQvRjl0cWcKK2FIdFBrbDdxcEhNeUVWTkVza1RMbmV3UGVVS3pFS2JIRFozTHR2by9PbnpxdjRoVEd6ejNndm9GTlRQaE5haFh3T2Y5alU4L2t6SlAKK2VHWURkd2RZNlpYSWZqN1FlUUNNOGh0Uk01dThsT2s2ZTI1U0xUS2VJNlJGKzdZdUU3Q0xHTEhkenRVZHAwSi9WYjc3Vzd0SDFQd2sKK3pRU3VsZ1VWMXF6T01QUEtDOFc2NGlMZ3BxMGk1QUx1ZEJGL1RQOTRIVFhhNWdJMDZ4Z1NZWGNHQ1JaajZoaXRvb2NmOHNlQUNRbDEKK1RoQ29qejJHdUhVUndDUmlpcFo3U2tYcDdGbkZ2bXVENXVIb3JMVXdIdjRGQjRENTRTTU5VSThGbVA4c1grZzd0cTNQZ2JVaGg4b0kKK0tpTW5NQ0FyeisyVVc2eXlldExIS0tHS0M1dE5TaXh0aFQ4SmNqeG40dG5jQjdyclpYdGFBV1BXa0Z0UEYyWTlmd3NabzVOakVGSXEKK254UVdXT0xjcGZTaEZvc09rWXVCeXB0Wit0aHJrUWRsVlY5U0g2ODYrNURkYWFWYm5HME9MTGI2enF5bGZESktaMERjTURRajNkY0UKK0kyYncvRldBcC90bUdZSTFaMkp3T1Y1dngrcVFRRVFJSHJpeTF0dnVXYWNOR0hrMHZGUVlYbFBLTkZIdFJRcm1qc2VDTmo2bk9HT3AKK01Dd1hFR0NTbjFXSEVsa1F3ZzluYVJITVRoNStTcHF0cjBDb2RheFdrSFM0b0p5bGVXL2M2UnJJYVFYcHV2b0RzM3prNEU3Q3pwM28KK3RrWU5ibjVYT21lVXdzc2ZuSGRLWjA1cGhrT1RPUHUyMjArRGtkUmdma3MrS3pnSFZaaGVwQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK01pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVDakNDQXZLZ0F3SUJBZ0lKQU1KK1F3Uk9SejhaTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVIKK01BOEdBMVVFQnd3SVFuVmtZWEJsYzNReEZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnYKK2MyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KK2RUQWVGdzB3T1RBMk1UWXhNVE13TVRoYUZ3MHlPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUUKK0J3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2YzJWaklHVXQKK1UzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRDQ0FTSXcKK0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQa2Q2bUp2aVpwV053clp1dXlqTkEKK2ZXMldicUVPUk83aEU1MlVRbEthdlhXRmRDeW9EaDJUdGhpM2pDeW96L3RjY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcKKzBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0EKK3B4bjFudHhWVXdPWGV3ZEkvNW43TjRva3hGbk1VQkJqanFxcEdyQ0VHb2I1WDd1eFVHNmswUXJNMVhGK0g2Y2JmUFZUYmlKZnl5dm0KKzFIeGRydGJDeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MStyVUMKK0F3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUTEQ4YmYKK1FrUE1QY3UxU0NPaEducW1LcnMwYURBZkJnTlZIU01FR0RBV2dCVExEOGJmUWtQTVBjdTFTQ09oR25xbUtyczBhREFiQmdOVkhSRUUKK0ZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUURKMFE1ZUx0WE1zM3creS93OS93MG8KK2xaTUV5TC9helhtNFE1RHdwTDd2OHU4aG1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlgKK0kvT01uNzRkc2VHa2RkdWc0bFFVc2JvY0thUVk5aEs2b2hRVTR6RTF5RUQvdCtBRmRsZkJIRm55K0wvazdTVmlYSVR3Zm40ZnM3NzUKK3R5RVJ6QU1CVm5DbkVKSWVHelNCSHEyY0dzTUVQTzBDWWRZZUJ2TmZPb2Z5Sy9GRmgrVTlyTkhIVjRTOWE2N2MyUG0yRzJKd0N6MDIKK3lVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXRITU4xUnE0MUJhYjJYRDBoN2xid3lZSWkKK0xYcFVxM0REZlNKbGduQ1cKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2xvYmFsU2lnbiBSb290IENBIC0gUjMKKz09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURYekNDQWtlZ0F3SUJBZ0lMQkFBQUFBQUJJVmhUQ0tJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VERFZ01CNEdBMVVFQ3hNWFIyeHYKK1ltRnNVMmxuYmlCU2IyOTBJRU5CSUMwZ1VqTXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnBaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmgKK2JGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTRNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFQKK2FXZHVJRkp2YjNRZ1EwRWdMU0JTTXpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG4KK2JqQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU13bGRwQjVCbmdpRnZYQWc3YUV5aWllL1FWMkVjV3QKK2lITDhSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUZ0hlTUNPRkoKKzBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tS1BacE8vYkx5Q2lSNVoyS1lWYzMKK3JIUVUzSFRnT3U1eUx5NmMrOUM3di9VOUFPRUdNK2lDSzY1VHBqb1djNHpkUVE0Z09zQzBwNkhwc2srUUxqSmc2VmZMdVFTU2FHamwKK09DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjIKK3htbUZnaGNDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKK0ZJL3dTMytvTGtVa3JrMVErbU9haTk3aTNSdThNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMUU52QVVLcit5QXp2OTVaVVJVbTcKK2xnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcGpqTTVSY09PNUxsWGJLcjgKK0VwYnNVOFl0NUNSc3VaUmorOXhUYUdkV1BvTzR6elVodzhsby9zN2F3bE9xekpDSzZmQmRSb3lWM1hwWUtCb3ZIZDdOQURkQmorMUUKK2JkZFRLSmQrODJjRUhoWFhpcGEwMDk1TUo2Uk1HM056ZHZRWG1jSWZlZzdqTFFpdENod3MvenlyVlE0UGtYNDI2OE5YU2I3aExpMTgKK1lJdkRRVkVUSTUzTzl6SnJsQUdvbWVjc014ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3IKK2twZURNZG16dGNwSFdEOWYKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJR0ZEQ0NBL3lnQXdJQkFnSUlVK3c3N3Z1eVNGOHdEUVlKS29aSWh2Y05BUUVGQlFBd1VURUxNQWtHQTFVRUJoTUNSVk14UWpCQQorQmdOVkJBTU1PVUYxZEc5eWFXUmhaQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVpwY20xaGNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMgorTWpZek5EQTJPREFlRncwd09UQTFNakF3T0RNNE1UVmFGdzB6TURFeU16RXdPRE00TVRWYU1GRXhDekFKQmdOVkJBWVRBa1ZUTVVJdworUUFZRFZRUURERGxCZFhSdmNtbGtZV1FnWkdVZ1EyVnlkR2xtYVdOaFkybHZiaUJHYVhKdFlYQnliMlpsYzJsdmJtRnNJRU5KUmlCQgorTmpJMk16UXdOamd3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERAorVXRkOXRoRElBbDZ6UXlyRVQycXl5aHhkS0pwNEVScHBXVmV2dFNCQzVJc1A1dDlicGdPU0wvVVI1R0xYTW5FNDJRUU1jYXM5VVg0UAorQjk5akJWenB2NVJ2d1NtQ3dMVGFVYkRCUEx1dE4wcGN5dkZMTmc0a3E3L0RoSGY5cUZEMHNlZkdMOUl0V1kxNkNrNldhVklDcWphWQorN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWlOQTl3Qmo0Z0dGck85M0liSld5VGRCU1RvM094RHFxSAorRUNOWlh5QUZHVWZ0YUk2U0VzcGQvTllyc3BJOElNL2hYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SQorcGxEOWFtTUw5Wk1XR3htUHN1MmJtOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WAorTWJTY3lKQ3laL1FZRnBNNi9FZlkwWGlXTVIrNkt3eGZYWm10WTRsYUpDQjIyTi85cTA2bUlxcWRYdVluaW4xb0thUG5pcmphRWJzWAorTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9US0k4eFdWdlR5UUttdEZMSworYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGNk5rQmlEa2FsNFprUWRVN2h3eHUrZy9HdlVnVQordnpsTjFKNUJ0bytXSFdPV2s5bVZCbmd4YUo0M0JqdUFpVVZoT1NQSEcwU2pGZVVjK0pJd3V3SURBUUFCbzRIdk1JSHNNQklHQTFVZAorRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUmx6ZXVyTlI0QVBuN1ZkTUFjdEhOSAorRGhwa0x6Q0JwZ1lEVlIwZ0JJR2VNSUdiTUlHWUJnUlZIU0FBTUlHUE1DOEdDQ3NHQVFVRkJ3SUJGaU5vZEhSd09pOHZkM2QzTG1acAorY20xaGNISnZabVZ6YVc5dVlXd3VZMjl0TDJOd2N6QmNCZ2dyQmdFRkJRY0NBakJRSGs0QVVBQmhBSE1BWlFCdkFDQUFaQUJsQUNBQQorYkFCaEFDQUFRZ0J2QUc0QVlRQnVBRzhBZGdCaEFDQUFOQUEzQUNBQVFnQmhBSElBWXdCbEFHd0Fid0J1QUdFQUlBQXdBRGdBTUFBeAorQURjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFCZDlvUG0wM2NYRjY2MUxKTFdoQXF2ZHBZaEtzZzlWU3l0WGpEdmxNZDMreERMeAorNTF0a2xqWXlHT3lsTW5mWDQwUzJ3QkVxZ0xrOWFtNThtOU90L01QV28rWmtLWHpSNFRnZWdpdi9KMld2K3hZVnhDNXhoT1cxLy9xaworUjcxa01ydjJKWVNpSjBMMUlMRENFeEFSelJBVnVrS1FLdEpFNFpZbTZ6RklFdjBxMnNrR3ozUWVxVXZWaHlqNWVUU1NQaTVFNlBhUAorVDQ4MVB5V3pPZHhqS3BCcklGL0VVaEpPbHl3cXJKMlgza2p5bzJiYnd0S0RsYVptcDU0bEQra0xNNUZsQ2xyRDJWUVMzYS9EVGc0ZgorSmw0TjNMT043TldCY043U1R5UUY4MnhPOVV4SlpvM1IvOUlMSlVGSS9sR0V4a0t2Z0FUUDBINWtTZVR5MzZMc3NVekFLaDNudExGbAorb3NTODhaajBxbkFIWTdTNDJqdE0ra0FpTUZzUnB2QUZEc1lDQTBpcmhwdUYzZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUgorY3JIZWRVVG5RbjNpVjJ0OTNKbThQWU1vNm9DVGpjVk1aY0Z3Z2JnNC9FTXhzdllETkVleXJQc2lCc3NlM1JkSEhGOW11ZE1hb3RvUgorc2FTOEk4bmt2b2YvdVpTMitGMGdTdFJmNTcxb2UyWHlGUjdTT3FrdDZkaHJKS3lYV0VSSHJWa1k4U0ZsY043T05HQ29RUEh6UEtURAorS0NPTS9pY3pRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCakxNaQorNkV0OFZjYWQrcU1VdTJXRmJtNVBFbjRLUEoyVgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitJemVucGUuY29tCis9PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUY4VENDQTltZ0F3SUJBZ0lRQUxDM1doWklYNy9oeS9XTDF4bm1mVEFOQmdrcWhraUc5dzBCQVFzRkFEQTRNUXN3Q1FZRFZRUUcKK0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDZaVzV3WlM1amIyMHdIaGNOTURjeE1qRXoKK01UTXdPREk0V2hjTk16Y3hNakV6TURneU56STFXakE0TVFzd0NRWURWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXUKK1FTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREoKKzAzcktEeDZzcDRib0ZtVnFzY0liUlRKeGxkbitFRnZNcitlbGVRR1BpY1BLOGxWeDkzZStkNVR6Y3FRc1JOaWVrcHNVT3FIbkpKQUsKK0NsYU94ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZITG1ZUlkyeFUKKyt6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYdWFPS21NUHNPelRGbFVGcGZuWEMKK1BDREZZYnBSUjZBZ2tKT2hrRXZ6VG55RlJWU2EwUVVtUWJDMVRSMHp2c1FEeUNWOHdYRGJPL1FKTFZRblNLd3Y0Y1NzUHNqTGtreFQKK09UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArSnJVVjg2ZjhoQm5wN0tHSXRFUnBoSVB6aWRGMEJxbk1DOWJDM2llRlVDYksKK0Y3akplb2RXTEJvQkhteStFNjBRckxVazlUaVJvZFpMMnZHNzB0NUh0Zkc4Z2ZaWmE4OFpVK21ORmN0S3k2bHZST1ViUWMvaGhxZksKKzBHcWZ2RXlOQmpOYW9vWGxrRFdnWWx3V1R2RGpvdm9ER3JRc2NiTllMTjU3QzlzYUQrdmVJUjhHZHdZRHNNbnZtZnpBdVU4TGhpaisKKzBybnE0OXFsdzBkcEV1RGI4UFlaaSsxN2NOY0MxdTJIR0Nnc0JDUk1kK1JJaWhyR081clVEOHI2ZGRJQlFGcU5lYitMejB2UHFoYkIKK2xlU3RUSW8rRjVIVXNXTGxndVdBQktRRGZvMi8ybitpRDVkUEROTU4rOWZSNVhKK0hNaDMvMXVhRDdldUJVYmw4YWdXN0Vla0Z3SUQKK0FRQUJvNEgyTUlIek1JR3dCZ05WSFJFRWdhZ3dnYVdCRDJsdVptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndysKK1NWcEZUbEJGSUZNdVFTNGdMU0JEU1VZZ1FUQXhNek0zTWpZd0xWSk5aWEpqTGxacGRHOXlhV0V0UjJGemRHVnBlaUJVTVRBMU5TQkcKK05qSWdVemd4UXpCQkJnTlZCQWtNT2tGMlpHRWdaR1ZzSUUxbFpHbDBaWEp5WVc1bGJ5QkZkRzl5WW1sa1pXRWdNVFFnTFNBd01UQXgKK01DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME8KK0JCWUVGQjBjWlE2bzhpVjd0SkhQNUxHeDVyMVZkR3dGTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFCNHBnd1dTcDlNaURyQXl3NmwKK0ZuMmZ1VWhmR0k4TllqYjJ6Umxyckt2VjlwRjlybkh6UDdNT2VJV2JsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2EKK2tFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTZhd21xeGludWFFbG5NSUFrZWpFV09WdCs4Und1M1d3SnJmSXh3WUpPdWJ2NXZyOHEKK2hUL0FRS002V2Z4WlN6d29KTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3MKK2cxbHdMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUVnl2ZWhRUDUKK2FUZkxubmhxQmJURk1YaUo3SHFuaGVHNWV6emV2aDU1aE02ZmNBNVp3alV1a0NveDJlUkZla0drTGhPYk5BNW1lMG1yWkpmUVJzTjUKK25YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piVWpXdW1EcXR1aldUSTZjZlNOMDFScGl5RUdqa3BUSEMKK0NsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvUW5NRmxFUFZqanhPQVRvWnBSOUdUbmZRWGVXQklpR0gvcFI5aE5pVHJkWm8KK1EwaXkyK3R6Sk9lUmYxU2t0b0ErbmFNOFRITENWOFNnMU13NEo4N1ZCcDZpU05ucG44NkNjRGFUbWp2ZmxpSGpXYmNNMnBFMzhQMVoKK1dyT1p5R2xzUXlZQk5XTmdWWWtET25YWXVrclpWUC91M29EWUxkRTQxVjR0QzVoOVBtemIvQ2FJeHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDaGFtYmVycyBvZiBDb21tZXJjZSBSb290IC0gMjAwOAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJSFR6Q0NCVGVnQXdJQkFnSUpBS1BhUW42a3NhN2FNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3VNUXN3Q1FZRFZRUUdFd0pGVlRGRAorTUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdgorYlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdQorUVM0eEtUQW5CZ05WQkFNVElFTm9ZVzFpWlhKeklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeQorTWprMU1Gb1hEVE00TURjek1URXlNamsxTUZvd2dhNHhDekFKQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObAorWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dEwyRmtaSEpsYzNNcE1SSXdFQVlEVlFRRgorRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbAorY25NZ2IyWWdRMjl0YldWeVkyVWdVbTl2ZENBdElESXdNRGd3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQworQVFDdkFNdHdOeXVBV2tvNmJIaVVmYU4vR2gvMk5kVzkyOHNOUkhJK0pyS1FVcnBqT3loWWI2V3piWlNtODkxa0RGWDI5dWZ5SWlLQQorWHVGaXhyWXA0WUZzOHIvbGZUSnFWS0F5R1ZuK0g0dlhQV0NHaFNSdjR4R3pkejRnbGpVaGE3TUkyWEF1WlBlRWtsUFdEckNRaW9yagoraDQwRzA3MlFEdUtab1J1R0R0cWFDcnNMWVZBR1V2R2VmM2JzeXcvUUhnM1BtVEE5SE1SRkVGaXMxdFBvMStYcXhRRUhkOVpSNWdOLworaWtpbFRXaDF1ZW04bms0WmNmVXlTNXh0WUJrTCs4eWRkZHkvSnMyUGszZzVlWE5lSlE3S1hPdDNFZ2ZMWkVGSGNwT3JVTVByQ1haaworTk5JNXQzWVJDUTEyUmNTcHJqMXFyN1Y5WlMrVVdCRHNYSHl2ZnVLMkdOblFtMDVhU2QrcFpndk1QTVo0ZktlY0hlUE9qbE8rQmQ1ZworRDJ2bEd0cy80K0VoeVNuQjhlc0huRkliQVVSUlBIc2wxOFRsVWxSZEpRZktGaUM0cmVSQjdub0kvcGx2ZzZhUkFyQnNObFZxNTMzMQorbHViS2dkYVg4WlNENmUyd3NXc1NhUjZzKzEycHhaanB0RnRZZXI0OW9rUTZZMW5VQ3lYZUcwKzk1UUdlemRJcDFaOFhHUXB2dnd5UQorMHdsZjJlT0tOY3g1V2swWk41SzN4TUd0ci9SNUpKcXlBUXV4cjF5Vzg0QXkrMXc5bVBHZ1AwcmV2cStVTHRsVm1oZHVZSjFqYkxoagoreWE2QlhCZzE0SkM3dmp4UE55SzVmdXZQbm5jaHBqMDRnZnRJMmpFOUsrT0o5ZEMxdlg3Z1VNUVNpYk1qbWhBeGhkdXViKzg0TXhoMgorRVFJREFRQUJvNElCYkRDQ0FXZ3dFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJEREFkQmdOVkhRNEVGZ1FVK1NTc0Q3SzErSG5BK21DSQorRzhUWlRRS2VGeGt3Z2VNR0ExVWRJd1NCMnpDQjJJQVUrU1NzRDdLMStIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSgorQmdOVkJBWVRBa1ZWTVVNd1FRWURWUVFIRXpwTllXUnlhV1FnS0hObFpTQmpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaAorYldWeVptbHliV0V1WTI5dEwyRmtaSEpsYzNNcE1SSXdFQVlEVlFRRkV3bEJPREkzTkRNeU9EY3hHekFaQmdOVkJBb1RFa0ZESUVOaAorYldWeVptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXRJREl3TURpQworQ1FDajJrSitwTEd1MmpBT0JnTlZIUThCQWY4RUJBTUNBUVl3UFFZRFZSMGdCRFl3TkRBeUJnUlZIU0FBTUNvd0tBWUlLd1lCQlFVSAorQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBSkFTcnlJMQord3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1dQSiswVzJhZWF1ZkR1VjJJNkErdHp5TVAzaVU2WHN4UHBjRzFMYXdrMGxnSAorM3FMUGFZUmdNK2dRRFJPcEk5Q0Y1WTU3cHA0OWNoTnlNL1dxZmNaakh3ajAvZ0YvSk04ckxGUUozdUlyYlpMR09VOFc2angrZWtiVQorUldwR3FPdDFnbGFucTZCOGFCTXo5cDB3OEc4bk9TUWpLcEQ5a0NrMThwUGZOS1hHOS9qdmpBOWlTbnl1MC9WVStJMjJtbGFIRm9JNgorTTZ0YUlnajNncnJxTHVCSG1yUzFSYU1GTzluY0xrVkFPK3JjZitnNzY5SHNKdGcxcERERk9xeFhuck4ycFNCNytSNUtCV0lCcGloMQorWUplU0RXNCtUVGRERFpJVm5CZ2l6Vkdab0NrYVBGK0tNak5iTU1lSkwwZVlENk1EeHZieHJOOHk4Tm1CR3VTY3ZmYUFGUERSTExtRgorOWRpanNjaWxJZVVjRTVmdURyM2ZLYW52TkZOYjArUnFFNFFHdGpJQ3hGS3VJdExjc2lGQ0d0cEE4Q25KN0FvTVhPTFF1c3hJMHpjSworekJJS2lubXdQUU4vYVV2ME5DQjlzelRxamt0azlUNzlzeU5uRlEwRXVQQXR3UWxSUExKc0ZmQ2xJOWVEZE9UbExzbittQ2RDeHF2RworbnJEUVd6aWxtMURlZmhpWXRVVTc5bm0wNlBjYWV3YUQrOUNMMnJ2SHZSaXJDRzg4Z0d0QVB4a1p1bVdLNXI3VlhOTTIxKzlBVWlSZworT0djRU1leVA4NExHM3JsVjh6c3hrVnJjdFFnVnJYWWxDZzE3TG9maURLWUd2Q1lRYlRlZDdOMTRqSHlBeGZEWmQwalEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2xvYmFsIENoYW1iZXJzaWduIFJvb3QgLSAyMDA4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJSFNUQ0NCVEdnQXdJQkFnSUpBTW5OMCtuVmZTUE9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3NNUXN3Q1FZRFZRUUdFd0pGVlRGRAorTUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnljbVZ1ZENCaFpHUnlaWE56SUdGMElIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdgorYlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdQorUVM0eEp6QWxCZ05WQkFNVEhrZHNiMkpoYkNCRGFHRnRZbVZ5YzJsbmJpQlNiMjkwSUMwZ01qQXdPREFlRncwd09EQTRNREV4TWpNeAorTkRCYUZ3MHpPREEzTXpFeE1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZworWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSgorUVRneU56UXpNamczTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWxCZ05WQkFNVEhrZHNiMkpoYkNCRAorYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1EZgorVnRQa09wdDJSYlFUMi8vQnRobUxOMEVZbFZKSDZ4ZWRLWWlPTld3R01pNUhZdk5KQkw5OVJEYXhjY3k5V2dsejFkbUZSUCtSVnlYZgorWGphT2NORmNjVU1kMmRydlhOTDdHNzA2dGN1dG84eEVwdzJ1SVJVL3VYcGJrblhZcEJJNGlSbUt0NERTNGpKdlZweVIxb2dRQzdOMAorWkpKMFlQUDJ6eGhQWUxJajBNYzd6bUZMbVkvQ0ROQkFzcGpjRGFoT283a0tybUNnclVWU1k3cG12V2pnK2I0YXFJRzdIa0Y0ZGRQQgorL2dCVnNJZFU2Q2VRTlIxTU02MlgvSmN1bUlTL0xNbWp2OUdZRVJUdFkvakttSWhZRjVudFJRT1hmanlHSG9pTXZ2S1JoSTlsTk5nQQorVEgyM01SZGFLWG9LR0NRd296ZTFlcWtCZlNiVytRNk9XZkg5R3pPMUtUc1hPMEcySWQzVXdEMmxuNThmUTFESnU3eHNlcGVZN3MyTQorSC91Y1VhNkxjTDBubjNIQWE2eDlrR2JvMTEwNkRiRFZ3bzNWeUoyZHdXM1EwTDlSNU9QNHd6ZzJydGFuZGVhdmhFTmRrNUlNYWdmZQorT3gyWUl0YXN3VFhibzZBbC8zSzFkaDNlYmVrc1ppeFNoTkJGa3M0YzVlVXpIZHdIVTFTanFvSTdtamN2M04yZ1pPbm0zYjJ1L0dTRgorSFR5bnlRYmVoUDlyNkdzYVBNV2lzMEw3aXdrK1h3aFN4MkxFMUFWeHY4Ums1UGloZytnK0VwdW9IdFEyVFM5eDlvMG85b09wRTlKaAord1pHN1NNQTBqMEdNUzB6YmFSTC9VSlNjSUlOWmMrMThvZkx4L2QzM1NkTkRXS0JXWThvOVBlVTFWbG5wRHNvZ3pDdExreWtQQWdNQgorQUFHamdnRnFNSUlCWmpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFTU1CMEdBMVVkRGdRV0JCUzVDY3FjSHR2VGJEcHJydTFVOFZ1VAorQmpVdVhqQ0I0UVlEVlIwakJJSFpNSUhXZ0JTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUQmpVdVhxR0JzcVNCcnpDQnJERUxNQWtHQTFVRQorQmhNQ1JWVXhRekJCQmdOVkJBY1RPazFoWkhKcFpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbQorYVhKdFlTNWpiMjB2WVdSa2NtVnpjeWt4RWpBUUJnTlZCQVVUQ1VFNE1qYzBNekk0TnpFYk1Ca0dBMVVFQ2hNU1FVTWdRMkZ0WlhKbQorYVhKdFlTQlRMa0V1TVNjd0pRWURWUVFERXg1SGJHOWlZV3dnUTJoaGJXSmxjbk5wWjI0Z1VtOXZkQ0F0SURJd01EaUNDUURKemRQcAorMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3dLQVlJS3dZQkJRVUhBZ0VXSEdoMAorZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUlDSWYzRGVraWpaQlpSRworLzVCWHFmRXYzeG9OYS9wOERoeEpKSGtuMkVhcWJ5bFpVb2h3RXVyZFBmV2JVMVJ2NFdDaXFBbTU3T3RaZk1ZMThkd1k2ZkZuNWErNgorUmVBSjNzcEVEOElYRG5lUlJYb3pYMStXTEdpTHdVZVBtSnM5d096TDlkV0Nrb1ExMGI0Mk9GWnlNVnRITGFvWHBHTlI2d29CclgvcworZFo3TG9SL3hmeEt4dWVSa2YyZldJeXIwdURsZG1PZ2hwK0c5UFVJYWRKcHdyMmhzVUYxSnovLzdEbDNtTEVmWGdUcFpBTFZ6YTJNZworOWpGRkNEa085SEIrUUhCYVA5QnJRcWwwUFNndkFtMTFjcFVKalVoanhzWWpWNUtUWGpYQmpma0s5eXlkWWh6MnJYemRwakVldHJISAorZm9VbStxUnF0ZHBqTU5Idmt6ZXlaaTk5QmZmbnQwdVlsRFhBMlRvcHdaMnlVRE1kU3FsYXBza0Q3KzMwNTZodWlyUlhoT3VrUDlEdQorcXFxSFcyUG9rK0pycU5TNGNuaHJHKzA1NUYzTG02cUgxVTlPQVA3WmFwODhNUThvQWdGOW1PaW5zS0prbm5uNFNQSVZxY3pteUVUcgorUDNpWjhudHhQanp4bUtmRkdCSS81cnNvTTBMcFJRcDhiZktHZVMvRmdobDlDWWw4c2xSMmlLN2V3ZlBNNFc3Yk1kYVRycG1nN3lWcQorYzVpSld6b3VFNGdldjhDU2xEUWI0eWUzaXg1dlF2L242VGViVUIwdG92a0M3c3RZV0RweHZHampxc0d2SENnZm90d2paVCtCNnE2WgorMDlnd3p4TU5UeFhKaEx5blNDMzRNQ04zMkVaTGVXMzJqTzA2ZjJBUmVQVHBtNjdWVk1CMGdORUxRcC9CCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dvIERhZGR5IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRHhUQ0NBcTJnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVAorQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEdqQVlCZ05WQkFvVEVVZHZSR0ZrWkhrdVkyOXRMQ0JKYm1NdQorTVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQorTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1lNeEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRFZRUUlFd2RCY21sNgorYjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNUm93R0FZRFZRUUtFeEZIYjBSaFpHUjVMbU52YlN3Z1NXNWpMakV4TUM4RworQTFVRUF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMOXhZZ2p4K2xrMDl4dkpHS1AzZ0VsWTZTS0RFNmJGSUVNQk80VHg1b1ZKbnlmcQorOW9RYlRxQzAyM0NZeHpJQnNRVStCMDd1OVBwUEwxa3dJdWVyR1ZacjRvQUgvUE1XZFlBNVVYdmwrVFcyZEU2cGpZSVQ1TFkvcVFPRAorK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3lEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZAorZk1oOCs3QXJVNlNTWW1sUkpRVmhHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbAorTkFKV0p3R1J0RHR3S2o5dXNlaWNpQUY5bjlUNTIxTnRZSjIvTE9kWXE3aGZSdnpPeEJzRFBBbnJTVEZjYVVhejRFY0NBd0VBQWFOQworTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkRxYWhRY1FaeWkyNy9hOQorQlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YV1djRFlmRitPd1l4ZFMyaElJNVBaWWUwOTZhYwordk5qcEw5RGJXdTdQZEl4enREaEMyZ1Y3K0FKMXVQMmxzZGV1OXRmZUU4dFRFSDZLUnRHWCtyY3VLeEdya0xBbmdQbm9uMXJwTjUrcgorNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVgorTjhHYjVES2o3VGpvMkdUekxINFUvQUxxbjgzL0IyZ1gyeUtRT0MxNmpkRlU4V25qWHpQS2VqMTdDdVBLZjE4NTVlSjF1c1YyR0RQTworTFBBdlRLMzNzZWZPVDZqRW0wcFVCc1YvZmRVSUQrSWMvbjRYdUt4ZTl0UVdza01KREUzMnAydTBtWVJseW5xSTR1SkV2bHozNmh6MQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDNUQ0NBc1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVAorQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cworYjJkcFpYTXNJRWx1WXk0eE1qQXdCZ05WQkFNVEtWTjBZWEptYVdWc1pDQlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMAorZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2dZOHhDekFKQmdOVkJBWVRBbFZUTVJBdworRGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZworVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRJd01BWURWUVFERXlsVGRHRnlabWxsYkdRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQgorZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwzdHdRUDg5by84QXJGdgorVzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWduTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29UcworYmhtNWlTemNoRnZWZFB0clg4V0pwUkJTaVVaVjlMaDFIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOaworTjNtU3dPeEdYbi9oYlZOTVlxL05Id3RqdXpxZCsveDVBSmhoZE04bWdrQmo4N0p5YWhrTm1jclVEblhNTi91TGljRlo4V0ovWDdOZgorWlRENHA3ZE5kbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwSFpiVQorSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQworQVFZd0hRWURWUjBPQkJZRUZId01NaCtuMlRCL3hIMW9vMktvb2M2ckIxc25NQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFSV2ZvbAorVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeAorNG1jdWpKVURKaTVEblVveDlnNjFETHUzNGpkL0lyb0FvdzU3VXZ0cnV6dkUwM2xSVHMyUTlHY0hHY2c4Um5vTkFYM0ZXT2R0NW9VdworRjVva3hCRGdCUGZnOG4vVXFnci9RaDAzN1pUbFpGa1NJSGM0MHpJK09JRjFsblA2YUkreHk4NGZ4ZXo2bkg3UGZySHhCeTIyL0wvSworcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMW1NcFlqbjBxN3BCWgorYzJUNU5uUmVKYUgxWmdVdWZ6a1ZxU3I3VUl1T2hXbjAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKK0IwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhKVEFqQmdOVkJBb1RIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXMKK2IyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnNaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmwKK0lFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKK0JBWVRBbFZUTVJBd0RnWURWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFQKK2RHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5ZG1salpYTWcKK1VtOXZkQ0JEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0MKK0FRb0NnZ0VCQU5VTU9zUXErVTdpOWI0WmwxK09pRk94SHovTHo1OGdFMjBwT3NnUGZUejNhM1k0WTlrMllLaWJYbHdBZ0xJdldYLzIKK2gva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGEKK2hIUVV3MmVlQkdnNjM0NUFXaDFLVHM5RGtUdm5WdFlBY010UzdudDlyanJudkRINVJmYkNZTThUV1FJcmdNdzBSOSs1M3BCbGJRTFAKK0xKR21wdWZlaFJoSmZHWk9venB0cWJYdU5DNjZEUU80TTk5SDY3RnJqU1habTg2QjBVVkdNcFp3aDk0Q0RrbERoYlpzYzd0azZtRkIKK3JNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXcKK0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUcKK1NJYjNEUUVCQ3dVQUE0SUJBUUJMTnFhRWQybmRPeG1mWnlNSWJ3NWh5ZjJFM0YvWU5vSE4yQnRCTFo5ZzNjY2FhTm5SYm9iaGlDUFAKK0U5NUR6K0kwc3dTZEh5blZ2L2hleU5YQnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHkKK3hRR2poZEJ5UHExenF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKK2lFRFBmVVlkL3g3SDRjNy9JOXZHK28xVlRxa0M1MGNSUmo3MC9iMTdLU2E3cVdGaU55aTJMU3IyRUlaa3lYQ24wcTIzS1hCNTZqemEKK1l5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ05zU2k2CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0FmZmlybVRydXN0IENvbW1lcmNpYWwKKz09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUworQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVI4d0hRWURWUVFEREJaQlptWnBjbTFVY25WemRDQkRiMjF0WlhKamFXRnNNQjRYRFRFdworTURFeU9URTBNRFl3TmxvWERUTXdNVEl6TVRFME1EWXdObG93UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seQorYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRgorQUFPQ0FROEFNSUlCQ2dLQ0FRRUE5aHRQWndjcm9SWDFCaUxMSHdHeTQzTkZCa1JKTEx0SkpSVFd6c08zcXl4UHhrRXlsRmY2RXFkYgorRHVLUEh4NkdHYWVxdFMyNVh3Mkt3cStGTlhreUxic2NZamZ5c1Z0S1Bjck5jVi9wUXI2VTZNamUrU0pJWk1ibHE4WXJiYTBGOFByVgorQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUxNZUlySm1xYlRGZXVyQ0ErdWtWNgorQmZPOW0ya1ZybjFPSUdQRU5YWTZCd0xKTi8zSFIrN284WFlkY3hYeWw2UzF5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3dworTW1XZDVqeVRYbEJPZXVNNjFHN01HdnY1MGpldUpDcXJWd01pS0ExSmRYKzNLTnAxdjQ3ajNBNTVNUUlEQVFBQm8wSXdRREFkQmdOVgorSFE0RUZnUVVuWlBHVTR0ZXlxOC9ueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQworQVFZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHWFVQRworaGk0K2M3SW1mVStUcWJiRUtwcXJJWmNVc2Q2TTA2dUpGZGhySk5UeEZxN1lwRnpVZjFHTzdSZ0JzWk5qdmJ6NFlZQ2FuckhPUW5EaQorcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0WjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdgorMHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnTjUzVHltMStOSDRObjNKMml4dWZjdjFTTlVGRkFwWXZITEthYzBraAorc1VsSFJVZTA3Mm8wRWNsTm1zeFp0OVlDbmxwT1piV1VyaHZmS2JBVzhiOEFuZ2M2RjJTMUJMVWpJWmtLbFR1WGZPOD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQWZmaXJtVHJ1c3QgTmV0d29ya2luZworPT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEVERDQ0FqU2dBd0lCQWdJSWZFOEVPUnpVbVMwd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTCitCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3CitNREV5T1RFME1EZ3lORm9YRFRNd01USXpNVEUwTURneU5Gb3dSREVMTUFrR0ExVUVCaE1DVlZNeEZEQVNCZ05WQkFvTUMwRm1abWx5CitiVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnpkQ0JPWlhSM2IzSnJhVzVuTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGCitBQU9DQVE4QU1JSUJDZ0tDQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFCitIaTN5WUowd1RzeUVoZUlzeng2ZS9qYXJNM2MxUk5nMWxobzlOdWg2RHRqVlI2RnFhWXZaL0xzNnJubGExZlRXY2J1YWtDTnJtcmVJCitkSWNNSGwrNW5pMzZxMU1yM0x0MlBwTk1DQWlNSHFJakhOUnFyU0s2bVFFdWJXWEx2aVJtVlNSTFFFU3hHOWZod29YQTNoQS9QZTI0CisvUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcDZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiCitoKzB0K252dWpBcmpxV2FKR2N0QitkMUVObUhQNG5kR3lIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WCitIUTRFRmdRVUJ4L1M1NXphd202aVFMU3dlbEFRVUhURXlMMHdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCitBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk90REl1CitVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenVRWTB4MitjMDZsa2gxUUY2CisxMlM0WkRuTnllMnY3VXNEU0tlZ21RR0EzR1dqTnE1bFdVaFBna3ZJWmZGWEhlVlpMZ28vYk5qUjllVUp0R3hVQUFyZ0ZVMkhkVzIzCitXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHVvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5CisvWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDh4M2V2WktpVDMvWnBnNEpnOGtsQ05PMWFBRlNGSEJZMmtneGMrcWF0djlzPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBZmZpcm1UcnVzdCBQcmVtaXVtCis9PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZSakNDQXk2Z0F3SUJBZ0lJYll3VVJyR21DdTR3RFFZSktvWklodmNOQVFFTUJRQXdRVEVMTUFrR0ExVUVCaE1DVlZNeEZEQVMKK0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNQjRYRFRFd01ERXkKK09URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnkKK2RYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKK01JSUNDZ0tDQWdFQXhCTGZxVi8rUWQzZDlaK0s0L2FzNFR4NG1yelk4SDk2b0RNcTNJMGdXNjR0YitlVDJUWndhbWpQamxHamhWdG4KK0JLQVFKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaK2pqZVJGY1YKKzVmaU15TmxJNGcwV0p4MGV5SU9GSmJlNnFsVkJ6QU1pU3kyUmpZdm1pYTlteCtuL0srazhyTnJTczhQaGFKeUorSG9BVnQ3MFZaVnMKKys3cGszV0tMM3d0M011dGl6Q2FhbTd1cVlvTk10QVo2TU1ncHYrMEdUWmU1SE1ReEs5VmZ2Rk1TRjV5WlZ5bG1kMkVoTVFjdUpVbWQKK0dQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3NzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVIKK3A5RWl4QXFuT0Voc3Mvbi9mYXVHVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TkkKK1MrTEkrSCtTcUhaR25FSmxQcVFld1FjRFdrWXR1SmZ6dDlXeVZTSHZ1dHhNQUpmN0ZKVW5NNy9vUTBkRzBnaVpGbUE3bW43UzV1MDQKKzZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYUMxbkVXVEozczd4Z2FWWTUKKy9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWE93RjBsa0xnQU9JdWErckY3bktzdTcvKzZxcW8KKytOejJzbm1LdG1jQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZKM0FaNllNSXRrbTlVV3JwbVZTRVNmWVJheGpNQThHQTFVZEV3RUIKKy93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXYKK01pUElzMGxhVVp4MktJMTVxbGRHRjlYMVV2YTNST2dJUkw4WWhOSUxnTTNGRXYwQVZRVmhoMEhjdFNTZVBNVFl5UHR3bmk5NGxvTWcKK050NThEMmtUaUtWMU5wZ0lwc2Jmck03aldOYTNQdDY2OCtzMFFOaWlnZlY0UHkvVnBmelpvdFJlQkE0WHJmNUI4T1d5Y3ZwRWdqTkMKKzZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFFNS1NPeUFSaXFjVHROZDU2bCswT09GNlMKK0w1TndwYW1jYjZkOUV4MSt4Z2hJc1Y1bjYxRUlKZW5tSld0U0taR2Mwamx6Q0ZmZW1RYTBXNTBRQnVIQ0FLaTRIRW9DQ2hUUXdVSEsKKys0dzFJWDJDT1BLcFZKRVpOWk9VYldvNnhiTFF1NG1HaytpYnlRODZwM3E0b2ZCNFJ2cjhOeS9saW9UejMvNEUyYUZvb0M4azRnbVYKK0J0V1Z5dUVrbHV0ODlwTUZ1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmcKK0l4cEhZb1dsekJrMGdHK3pyQnJqbi9CN1NLM1ZBZGxudHFseWsrb3Racld5dU9ROVBMTHZUSXpxNndlL3F6V2FWWWE4R0thMXFGNjAKK2cyeHJhVURUbjl6eHcybHJ1ZUZ0Q2ZUeHFsQjJDbnA5ZWhlaFZaWkNtVEVKM1dBUmpRVXdmdWFPUnRHZEZOckhGK1FGbG96RUpMVWIKK3p4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlS2VDMnVBbG9HUndZUXc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQworPT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgorQkFvTUMwRm1abWx5YlZSeWRYTjBNU0F3SGdZRFZRUUREQmRCWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0SUVWRFF6QWVGdzB4TURBeAorTWpreE5ESXdNalJhRncwME1ERXlNekV4TkRJd01qUmFNRVV4Q3pBSkJnTlZCQVlUQWxWVE1SUXdFZ1lEVlFRS0RBdEJabVpwY20xVQorY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdFZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQorSWdOaUFBUU5NRjRiRlowRDBLRjVOYmM2UEpKNnloVWN6V0x6bkNaY0J6M2xWUHFqMXN3UzZ2UVVYK2lPR2Fzdkxram1yQmhEZUt6UQorTjhPOXNzMHM1a2ZpR3VaanVEMHVMM2pFVDl2MEQ2Um9URlZ5YTVVZFRoaENsWGpNTnp5UjRwdGxLeW1qUWpCQU1CMEdBMVVkRGdRVworQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBSworQmdncWhrak9QUVFEQXdObkFEQmtBakFYQ2ZPSGlGQmFyOGpBUXI5SFgvVnNhb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWAorNTdoRzhmMmg0bkVDTUVKWmgwUFVVZCs2MHdreVdzNklmbGM5bkY5Q2EvVUhMYlh3Z3BQNVdXK3VaUHBZNVlzZTQyTyt0WUhOYndLTQorZVE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBCis9PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk1NU0l3SUFZRFZRUUsKK0V4bFZibWw2WlhSdklGUmxZMmh1YjJ4dloybGxjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZ1EyVnlkR2xtYVdOaGRHbHYKK2JpQkJkWFJvYjNKcGRIa3hJakFnQmdOVkJBTVRHVU5sY25SMWJTQlVjblZ6ZEdWa0lFNWxkSGR2Y21zZ1EwRXdIaGNOTURneE1ESXkKK01USXdOek0zV2hjTk1qa3hNak14TVRJd056TTNXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlUKK1pXTm9ibTlzYjJkcFpYTWdVeTVCTGpFbk1DVUdBMVVFQ3hNZVEyVnlkSFZ0SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKK01TSXdJQVlEVlFRREV4bERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKK0FROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIVVYrcnBES21ZWWUyYmcrRzBqQUMKK2wvalhhVmVoR0RsZGFtUjV4Z0ZackR3eFNqaDgwZ1RTU3lqb0lGODdCNkxNVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEoKK0o3eXNibktESERCeTMrQ2k2ZExoZEhVWnZTcWVleFZVQkJ2WFF6bXRWU2pGNGhxNzlNRGtyamhKTTh4MmhaODVSZEtrbnZJU2pGSDQKK2ZPUXRmL1dzWCtzV243RXQwYnJNa1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzAKK2N2VzBRTTh4QWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVkhSTUIKK0FmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUUlkczNMQi84azlzWE43YnVRdk9LRU4wWjE5ekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKK0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eXNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2oKK2pTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTEk5TUE0R3hXTCtGcERRM1pxcjhoZ1ZEWkJxV28vNVUzMEtyKzRyUDEKK21TMUZoSXJsUWduWGRBSXY5NG5ZbWVtOEo5UkhqYm9OUmh4M3p4U2tITG1rTWNTY0tIUUROUDh6R1NhbDZRMTB0ejZYeG5ib0o1YWoKK1p0M2hydkpCVzhxWVZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKKzAzWW5uWm90QnFiSjdEblNxOXVmbWdzbkFqVXBzVUNWNS9ub25GV0lHVWJXdHpUMWZzNDVtdGs0OFZIM1R5dz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ2VydGlub21pcyAtIEF1dG9yaXTDqSBSYWNpbmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZuRENDQTRTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJqTVFzd0NRWURWUVFHRXdKR1VqRVRNQkVHQTFVRUNoTUsKK1EyVnlkR2x1YjIxcGN6RVhNQlVHQTFVRUN4TU9NREF3TWlBME16TTVPVGc1TURNeEpqQWtCZ05WQkFNTUhVTmxjblJwYm05dGFYTWcKK0xTQkJkWFJ2Y21sMHc2a2dVbUZqYVc1bE1CNFhEVEE0TURreE56QTRNamcxT1ZvWERUSTRNRGt4TnpBNE1qZzFPVm93WXpFTE1Ba0cKK0ExVUVCaE1DUmxJeEV6QVJCZ05WQkFvVENrTmxjblJwYm05dGFYTXhGekFWQmdOVkJBc1REakF3TURJZ05ETXpPVGs0T1RBek1TWXcKK0pBWURWUVFEREIxRFpYSjBhVzV2YldseklDMGdRWFYwYjNKcGRNT3BJRkpoWTJsdVpUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQUQKK2dnSVBBRENDQWdvQ2dnSUJBSjJGbjRiVDQ2L0hzbXR1TStDZXQwSTBWWjM1Z2I1ajJDTjJEcGRVelpsTUd2RTV4NGpZRjFBTW5tSGEKK3dFNVYzdWRhdUhwT2Q0Y041YmpyK3A1ZWV4N0V6eWgweDVQMUZNWWlLQVQ1a2NPckozTnFEaTVOOHk0b0gzRGZWUzlPN2NkeGJ3bHkKK0x1M1ZNcGZROFZoMzBXQzhUbDdibW9UMlIyRkZLL1pRcG45cWNTZEloRFdlclA1cHFaNTZYalVsK3JTblNUVjNscWMyVytITjN5TncKKzJGMU1wUWlEOGFZa09CT283Qytvb1dmSHBpMkdSKzZLL095YkRuVDBLMGtDZTVCMWpQeVpPUUU1MWtxSjVaNTJxejZXS0RnbWk5Mk4KK2pNRDJBUjV2cFRFU09IMlZ3bkh1N1hTdTVEYWlRM1hWOFFDYjR1VFh6RUlEUzNoNjVYMjd1SzR1SUpQVDVHSGZjZUYyWjVjL3R0OXEKK2MxcGtJdVZDMjgrQkE1UFk5T01RNEhMMkFIQ3M4TUY2RHdWL3p6UnBSYldUNUJuYlVoWWpCWWtPalVqa0pXK3plTDlpOVFmNmxTVEMKK2xyTG9veVBDWFFQOHc5UGxmTWwxSTlmMDliemU1Ti9OZ0wrUmlIMm5FN1E1dWl5NnZkRnJ6UE9sS08xRW5uMVNvMitXTGhsK0hQTmIKK3h4YU91MkI5ZDJaSFZJSUFFV0JzTXNHb09CdnJicGdUMXU0NDlmQ2ZEdS8rTVlIQjBpU1ZMMU42YWFMd0Q0WkZqbGlDSzB3aTFGNmcKKzUzMG1KMGpmSlVhTlNpaDhocDc1bXhwWnVXVy9CZDIyUWwwOTVnQklnbDRnOXhHQzNzclluK1kzUnlZZTYzajNZY05CWkZnQ1FmbmEKKzROSDQrZWo5VWppMjlZbmZBZ01CQUFHald6QlpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEcKK0ExVWREZ1FXQkJRTmpMWmgya1M0MFJSOXc3NTlYa2p3enNwcXNEQVhCZ05WSFNBRUVEQU9NQXdHQ2lxQmVnRldBZ0lBQVFFd0RRWUoKK0tvWklodmNOQVFFRkJRQURnZ0lCQUNRK1lBWitIZTg2UHR2cXJ4eWFMQUVMOU1XMTJVa3g5RjFCallrTVR2OXNvdjMvNGdiSU9aL3gKK1dxbmRJbGdWcUlyVHNlWXlDWUlEYk5jL0NNZjR1Ym9BYmJuVy9GSXlYYVIvcERHVXU3Wk1PSDhvTURYL255TlR0N2J1RkhBQVFDdmEKK1I2czBmbDZuVmpCaEs0dERyUDIyaUNqMWE3WStZRXE2UXBBMFo0M3E2MTlGVkRzWHJJdmt4bVVQN3RDTVhXWTV6aktuMkJDWHdINDAKK25KK1U4L2FHSDg4YmM2MlVlWWRvY01NenBYRG4yTlU0bEc5amVldS9DZzRJNThVdkQwS2dLeFJBL3lIZ0JjVW40WVFSRTdyV2hoMUIKK0N4TWppZFBKQytpS3VucWpvM00zTllCOUVyZ3pkMEE0d1BwZU1OTHl0cU94MXFLVmw0R2JVdTFwVFArQTVGUGJWRnNEYlZSZnNianYKK0pMMXZueEhEeDJUQ0R5aGloV1plR251eXQrK3VOY2taTTZpNEo5c3pWYjlvNFhWSVJGYjd6ZE5JdTBlSk9xeHA5WURHNUVSUUwxVEUKK3FrUEZNVEZZdlpiRjZuVnNtbld4VGZqM2wvK1dGdktYVGVqMjh4SDVPbjJLT0c0RXkrSFRSUldxcGRFZG5WMWo2Q1RtTmhUaWg2MGIKK1dmVkVtL3ZYZDN3ZkFYQmlvU0Fhb3NVYUtQUWhBKzR1MmNHQTZyblpndFpiZHNMTE83WFNBUENqRHVHdGJrRDMyNkMwMEVhdUZkZEUKK3drMDErZElMOGhmMnJHYlZKTEpQMFJ5WndHNzFmZXQwQkxqNVRYY0oxN1RQQnpBSjhiZ0FWdGtYRmhZS0s0YmZqd0VaR3VXN2dtUC8KK3ZndDJGbDQzTitiWWRKZWltVVY1CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1Jvb3QgQ0EgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUdpekNDQlhPZ0F3SUJBZ0lFTzBYbGFEQU5CZ2txaGtpRzl3MEJBUVVGQURCb01Rc3dDUVlEVlFRR0V3SkZVekVmTUIwR0ExVUUKK0NoTVdSMlZ1WlhKaGJHbDBZWFFnVm1Gc1pXNWphV0Z1WVRFUE1BMEdBMVVFQ3hNR1VFdEpSMVpCTVNjd0pRWURWUVFERXg1U2IyOTAKK0lFTkJJRWRsYm1WeVlXeHBkR0YwSUZaaGJHVnVZMmxoYm1Fd0hoY05NREV3TnpBMk1UWXlNalEzV2hjTk1qRXdOekF4TVRVeU1qUTMKK1dqQm9NUXN3Q1FZRFZRUUdFd0pGVXpFZk1CMEdBMVVFQ2hNV1IyVnVaWEpoYkdsMFlYUWdWbUZzWlc1amFXRnVZVEVQTUEwR0ExVUUKK0N4TUdVRXRKUjFaQk1TY3dKUVlEVlFRREV4NVNiMjkwSUVOQklFZGxibVZ5WVd4cGRHRjBJRlpoYkdWdVkybGhibUV3Z2dFaU1BMEcKK0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFER0txdFhFVGN2SW9yS0EzUWR5dTB0b2d1OE0xSkFKa2UrV21tbU8zSTIKK0Ywem8zN2k3TDNiaFFFWjBaUUtRVWdpMC82aU13ZURIaVZZUU9UUHZhTFJmWDlwdEk2R0pYaUtqU2did0ovQlh1ZmpwVGpKM0NqOUIKK1pQUHJaZTUyL2xTcWZSMGdydlBYZE1JS1gvVUlLRklJekZWZDBnL2Jtb0dsdTZHendaVE5WT0F5ZFRHUkdtS3kzblhpejArSjJaR1EKK0QwRWJ0RnBLZDcxbmcrQ1Q1MTZuRE9lQjAvUlNyRk95QThkRUp2dDU1Y3MwWUZBUWV4dmJhOWRIcTE5OGFNcHVuVUVERU81cm1YdGUKK0phakNxK1RBODF5YzQ3N09NVXhrSGw2QW92V0RmZ3pXeW94VmpyN2d2a2tIRDZNa1FYcFlIWVRxV0JMSTRiZnQ3NVBlbEFneEFnTUIKK0FBR2pnZ003TUlJRE56QXlCZ2dyQmdFRkJRY0JBUVFtTUNRd0lnWUlLd1lCQlFVSE1BR0dGbWgwZEhBNkx5OXZZM053TG5CcmFTNW4KK2RtRXVaWE13RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQWpDQ0FqUUdBMVVkSUFTQ0Fpc3dnZ0luTUlJQ0l3WUtLd1lCQkFHL1ZRSUIKK0FEQ0NBaE13Z2dIb0JnZ3JCZ0VGQlFjQ0FqQ0NBZG9lZ2dIV0FFRUFkUUIwQUc4QWNnQnBBR1FBWVFCa0FDQUFaQUJsQUNBQVF3QmwKK0FISUFkQUJwQUdZQWFRQmpBR0VBWXdCcEFQTUFiZ0FnQUZJQVlRRHRBSG9BSUFCa0FHVUFJQUJzQUdFQUlBQkhBR1VBYmdCbEFISUEKK1lRQnNBR2tBZEFCaEFIUUFJQUJXQUdFQWJBQmxBRzRBWXdCcEFHRUFiZ0JoQUM0QURRQUtBRXdBWVFBZ0FFUUFaUUJqQUd3QVlRQnkKK0FHRUFZd0JwQVBNQWJnQWdBR1FBWlFBZ0FGQUFjZ0RoQUdNQWRBQnBBR01BWVFCekFDQUFaQUJsQUNBQVF3QmxBSElBZEFCcEFHWUEKK2FRQmpBR0VBWXdCcEFQTUFiZ0FnQUhFQWRRQmxBQ0FBY2dCcEFHY0FaUUFnQUdVQWJBQWdBR1lBZFFCdUFHTUFhUUJ2QUc0QVlRQnQKK0FHa0FaUUJ1QUhRQWJ3QWdBR1FBWlFBZ0FHd0FZUUFnQUhBQWNnQmxBSE1BWlFCdUFIUUFaUUFnQUVFQWRRQjBBRzhBY2dCcEFHUUEKK1lRQmtBQ0FBWkFCbEFDQUFRd0JsQUhJQWRBQnBBR1lBYVFCakFHRUFZd0JwQVBNQWJnQWdBSE1BWlFBZ0FHVUFiZ0JqQUhVQVpRQnUKK0FIUUFjZ0JoQUNBQVpRQnVBQ0FBYkFCaEFDQUFaQUJwQUhJQVpRQmpBR01BYVFEekFHNEFJQUIzQUdVQVlnQWdBR2dBZEFCMEFIQUEKK09nQXZBQzhBZHdCM0FIY0FMZ0J3QUdzQWFRQXVBR2NBZGdCaEFDNEFaUUJ6QUM4QVl3QndBSE13SlFZSUt3WUJCUVVIQWdFV0dXaDAKK2RIQTZMeTkzZDNjdWNHdHBMbWQyWVM1bGN5OWpjSE13SFFZRFZSME9CQllFRkhzMTAwRFNISGdaWnU5MEVDamNQayt5ZUFUOE1JR1YKK0JnTlZIU01FZ1kwd2dZcUFGSHMxMDBEU0hIZ1padTkwRUNqY1BrK3llQVQ4b1d5a2FqQm9NUXN3Q1FZRFZRUUdFd0pGVXpFZk1CMEcKK0ExVUVDaE1XUjJWdVpYSmhiR2wwWVhRZ1ZtRnNaVzVqYVdGdVlURVBNQTBHQTFVRUN4TUdVRXRKUjFaQk1TY3dKUVlEVlFRREV4NVMKK2IyOTBJRU5CSUVkbGJtVnlZV3hwZEdGMElGWmhiR1Z1WTJsaGJtR0NCRHRGNVdnd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFDUmgKK1R2VzF5RUlDS3JOY2RhM0ZiY3JubEQrbGFKV0l3VlRBRUdtaUVpOFlQeVZRcUh4SzZzWUoyZlIxeGtEYXIxQ2RQYVVXdTIweHhzZHoKK0NraitJSEx0Yjh6b2cyRVdScEFCbFV0OWpwcFNDUy8yYnh6a29YSFBqQ3BhRjNPRFIwMFBOdnNFVFVsUjRoVEpaR0g3MUJUZzlKNjMKK05JOEtKcjJYWFBSNU9rb3dHY3l0VDZDWWlyUXhseXJpYzIxK2VMajRpSWxQc1NLUlpFdjFVTjREMitYRmR1Y1RablYrWmZzQm41T0gKK2lKMzVSbGQ4VFdDdm1ITVRJNlFna1lINjBHRm11SDNScjladkhtdzk2Ukg5cWZtQ0lvYVpNM0ZhNmhsWFBaSE5xY0NqYmdjVHBzbnQKKytHaWpuc05hY2dtSEtOSEVjOFJ6R0Y5UWRSWXhuN2ZvZk1NPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBLVRydXN0LW5RdWFsLTAzCis9PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR6ekNDQXJlZ0F3SUJBZ0lEQVd3ZU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHTk1Rc3dDUVlEVlFRR0V3SkJWREZJTUVZR0ExVUUKK0Nndy9RUzFVY25WemRDQkhaWE11SUdZdUlGTnBZMmhsY21obGFYUnpjM2x6ZEdWdFpTQnBiU0JsYkdWcmRISXVJRVJoZEdWdWRtVnkKK2EyVm9jaUJIYldKSU1Sa3dGd1lEVlFRTERCQkJMVlJ5ZFhOMExXNVJkV0ZzTFRBek1Sa3dGd1lEVlFRRERCQkJMVlJ5ZFhOMExXNVIKK2RXRnNMVEF6TUI0WERUQTFNRGd4TnpJeU1EQXdNRm9YRFRFMU1EZ3hOekl5TURBd01Gb3dnWTB4Q3pBSkJnTlZCQVlUQWtGVU1VZ3cKK1JnWURWUVFLREQ5QkxWUnlkWE4wSUVkbGN5NGdaaTRnVTJsamFHVnlhR1ZwZEhOemVYTjBaVzFsSUdsdElHVnNaV3QwY2k0Z1JHRjAKK1pXNTJaWEpyWldoeUlFZHRZa2d4R1RBWEJnTlZCQXNNRUVFdFZISjFjM1F0YmxGMVlXd3RNRE14R1RBWEJnTlZCQU1NRUVFdFZISjEKK2MzUXRibEYxWVd3dE1ETXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdFBXRnVBL09RTzhCQkM0U0EKK3pld3FvNTFydTI3Q1FvVDNVUlRob0tndFVhTlI4dDRqOERSRS81VHJ6QVVqbFVDNUIzaWxKZllLdlVXRzZObTl3QVNPaFVSaDczK24KK3lmckJKY3lGTEdNL0JXQnpTUVhnWUhpVkVFdmMrUkZaem5GL1FKdUtxaVRmQzBMaTIxYThTdEtsREp1M1F6N2RnOU1tRUFMUDZpUEUKK1NVN2wwK20waUtzTXJtS1MxR1dIMldyWDlJV2Y1RE1pSmFYbHlETzZ3OGRCM0YvR2Fzd0FEbTB5cUxhSE5nQmlkNXNlSHpUTGtEeDQKK2lIUUY2M24xazNGbHlwM0hheGd0UFZ4TzU5WDRQekY5ajRmc0NpSXZJK24rdTMzSjRQVHM2M3pFc01NdFlyV2FjZGF4YXVqczJlM1YKK2N1eStWd0hPQlZXZjN0RmdpQkN6QWdNQkFBR2pOakEwTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RVFZRFZSME9CQW9FQ0VScWxXZFYKK2VSRlBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFWZFJVMFZsSVhMT1RoYXEvWXkva2dNNDAKK296UmlQdmJZN21lSU1RUURid3ZVQi90T2RRL1RMdFBBRjhmR0tPd0dEUkVrRGc2bFhiK01zaE9XY2R6VXpnNE5DbWd5YkxsQk1SbXIKK3NRZDdUWmpUWExEUjhLZENvTFhFanEvKzhULzA3MDlHQUhickF2djVuZEpBbHNlSU9yaWZFWG56Z0dXb3ZSL1RlSUdnVVV3M3RLWmQKK0pYRFJac2xvK1M0UkZHanhWSmdJckNhU0Q5NkpudFQ2czNrcjBxTjUxT3lMcklkVGFFSk1VVkYwSGhzbkx1UDFIeWwwVGUydjkrR1MKK21ZSG92anJIRjFEMnQ4YjhtN0NLYTlhSUE1R1BCbmM2aFFMZG1OVkRlRC9HTUJXc20ydkxWN2VKVVlzNjZNbUVETnV4VUNBS0drcTYKK2FocTk3QnZJeFlTYXpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVFdDQSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFU01CQUdBMVVFQ2d3SgorVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaAorZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNeldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRRworRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVVjBOQgorSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSworQW9JQkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkVBY0swSE1NeAorUWhaSGhUTWlkcklLYncvbEpWQlBoWWErdjVndUVHY2V2aEVGaGdXUXhGblFmSGdRc0lCY3QrSEhLM1hMZkordXRkR2RJemRqcDl4Qworb2kyU0JCdFF3WHU0UGh2SlZnU0xMMUticmFsVzZjSC9yYWxZaHpDMmdmZVhSZndaVnpzcmIrUkg5SmxGL2gzeCtKZWppQjAzSEZ5UAorNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3pyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcgoreStVUGl6Z043Z3I4L2crWW56QXgzV3hTWmZtTGdiNGk0UnhZQTdxUkc0a0hBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQgorQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScU9Gc21qZDZMV3ZKUGVsU0RHUmpqQ0RXbXVqQU5CZ2txaGtpRworOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDTUVySmsvOXE1NllBZjRsQworbXRZUjVWUE9MOHp5MmdYRS91SlF4RHFHZmN6YWZoQUpPNUkxS2xPeS91c3JCZGxzWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsVworUXROb1VSaStWSnEvUkVHNlNiNGd1bWxjN3JoM3pjNXNINjJEbGhoOURyVVVPWVR4S09rdG81NTdIbnB5V29PemVXL3Z0UHpRQ3FWWQorVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueQorWWgwaWd6eVh4ZmtaWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbE1DTUdBMVVFQ2hNYworVTBWRFQwMGdWSEoxYzNRZ1UzbHpkR1Z0Y3lCRFR5NHNURlJFTGpFbk1DVUdBMVVFQ3hNZVUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaAorZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWERUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQworU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeWRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhKekFsQmdOVkJBc1RIbE5sWTNWeQorYVhSNUlFTnZiVzExYm1sallYUnBiMjRnVW05dmRFTkJNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgorQU5BVk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3J6YmwrZHArKworK1Q0Mk5LQTd3Zll4RVVWMGt6MVhnTVg1aVpuSzVhdHExTFhhUVpBUXdkYldRb25Ddi9RNEVwVk1WQVgzTnVSRmczc1VaZGJjREUzUgorM240TXF6dkVGYjQ2VnFaYWIzWnBVcWw2dWNqcmFwcGRVdEF0Q21zMUZna1FoTkJxeWpvR0FEZEg1SDVYVHorTDYyZTRpS3JGdmxOVgorc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V09vam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xSworRU90T2doWTZyQ2NNVS9HdDFTU3dhd05Rd1MwOEZ0MUVOQ2NhZGZzQ0F3RUFBYU5DTUVBd0hRWURWUjBPQkJZRUZBcUZxWGRsQlpoOAorUUlINEQ1Y3NPUEVLN0R6UE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUEwR0NTcUdTSWIzRFFFQgorQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGY29KeERqclN6RytudEtFagordS9Za244c1gvb3ltenNMUzI4eU4vSEg4QXluQmJGMHpYMlMyWlR1SmJ4aDJlUFhjb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYaworM2ZzK0JYemlIVjdHcDd5WFQyZzY5ZWt1Q2tPMnIxZGNZbWg4dC8yamlvU2dyR0srS3dtSE5QQnFBYnViS1ZZOC9nQTN6eU5zOFU2cQordG5SR0VteVI3alRWN0pxUjUwUytrREZ5MVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOQorbXZWWEl3QUhJUmMvU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0VDLUFDQworPT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZWakNDQkQ2Z0F3SUJBZ0lRN2lzOTY5UWgzaFNvWXF3RTg5M0VBVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0I4ekVMTUFrR0ExVUUKK0JoTUNSVk14T3pBNUJnTlZCQW9UTWtGblpXNWphV0VnUTJGMFlXeGhibUVnWkdVZ1EyVnlkR2xtYVdOaFkybHZJQ2hPU1VZZ1VTMHcKK09EQXhNVGMyTFVrcE1TZ3dKZ1lEVlFRTEV4OVRaWEoyWldseklGQjFZbXhwWTNNZ1pHVWdRMlZ5ZEdsbWFXTmhZMmx2TVRVd013WUQKK1ZRUUxFeXhXWldkbGRTQm9kSFJ3Y3pvdkwzZDNkeTVqWVhSalpYSjBMbTVsZEM5MlpYSmhjbkpsYkNBb1l5a3dNekUxTURNR0ExVUUKK0N4TXNTbVZ5WVhKeGRXbGhJRVZ1ZEdsMFlYUnpJR1JsSUVObGNuUnBabWxqWVdOcGJ5QkRZWFJoYkdGdVpYTXhEekFOQmdOVkJBTVQKK0JrVkRMVUZEUXpBZUZ3MHdNekF4TURjeU16QXdNREJhRncwek1UQXhNRGN5TWpVNU5UbGFNSUh6TVFzd0NRWURWUVFHRXdKRlV6RTcKK01Ea0dBMVVFQ2hNeVFXZGxibU5wWVNCRFlYUmhiR0Z1WVNCa1pTQkRaWEowYVdacFkyRmphVzhnS0U1SlJpQlJMVEE0TURFeE56WXQKK1NTa3hLREFtQmdOVkJBc1RIMU5sY25abGFYTWdVSFZpYkdsamN5QmtaU0JEWlhKMGFXWnBZMkZqYVc4eE5UQXpCZ05WQkFzVExGWmwKK1oyVjFJR2gwZEhCek9pOHZkM2QzTG1OaGRHTmxjblF1Ym1WMEwzWmxjbUZ5Y21Wc0lDaGpLVEF6TVRVd013WURWUVFMRXl4S1pYSmgKK2NuRjFhV0VnUlc1MGFYUmhkSE1nWkdVZ1EyVnlkR2xtYVdOaFkybHZJRU5oZEdGc1lXNWxjekVQTUEwR0ExVUVBeE1HUlVNdFFVTkQKK01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBc3lMSFQrS1hRcFdJUjROQTloMFg4NE56SkI1Ujg1aUsKK3c1SzQvMENRQlhDSFlNa0FxYldVWlJraUZSZkNRMnhtUkpvTkJENDViNlZMZXFwanQ0cEVuZGxqa1lSbTRDZ1B1a0xqYm83M0ZDZVQKK2FlNlJEcU5mRHJIclpxSnlUeElUaG1WNlB0dFBCL1NuQ1dEYU9rS1p4N0ovc3hhVkhNZjVOTFdVaGRXWlhxQklvSDduRjJXNG9uVzQKK0h2UGxRbjJ2N2ZPS1NHUmRnaFNUMk1Eay83TlFjdkoyOXJOZFFsQjUwSlErYXd3QXZ0aHJEazRxN0Q3U3pJS2lHR1V6RTNlZW1sMGEKK0U5akQyejNJbDNydWNPMm41bnpiY2M4dGxHTGZiZGIxT0w0L3BZVUtHYmlvMkFsMVFuREU2dS9MRHNnMHFCSWltQXk0RTVTMlMrencKKzBKRG5Kd0lEQVFBQm80SGpNSUhnTUIwR0ExVWRFUVFXTUJTQkVtVmpYMkZqWTBCallYUmpaWEowTG01bGREQVBCZ05WSFJNQkFmOEUKK0JUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVb01PTFJLbzNwVVcvbDRCYTBmRjRvcHZwWFkwd2Z3WUQKK1ZSMGdCSGd3ZGpCMEJnc3JCZ0VFQWZWNEFRTUJDakJsTUN3R0NDc0dBUVVGQndJQkZpQm9kSFJ3Y3pvdkwzZDNkeTVqWVhSalpYSjAKK0xtNWxkQzkyWlhKaGNuSmxiREExQmdnckJnRUZCUWNDQWpBcEdpZFdaV2RsZFNCb2RIUndjem92TDNkM2R5NWpZWFJqWlhKMExtNWwKK2RDOTJaWEpoY25KbGJDQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS0JJVzRJQjlrMUl1RGxWTlp5QWVsT1oxVnIvc1hFN3pEa0oKK2xGN1cydSsrQVZ0ZDB4N1kvWDFQemFCQjREU1R2OHZpaHB3M2twQldITnpyS1FYbHhKN0hOZCtLRE0zRklVUHBxb2psTmNBWlFtTmEKK0FsNmtTQmc2aFcvY25idy9uWnpCaDdoNllRanBkd3QvY0t0NjNkbVhMR1FlaGIrOGRKYWh3M29TN0F3YWJvTU1QT2h5UnAvN1NOVmUKK2wrYXhvZmprNzBZbGxKeUoyMms0dnV4Y0RsYkhaVkhsVUlpSXYwTFZLejNsK2JxZUxyUEs5SE9TQWd1K1RHYnJJUDY1eTdXWmYrYTIKK0UvcktTMDNaN2xOR0JqdkdUcTJUV29GK2JDcExhZ1ZGalBJaHBER1FoMnhsbkoybFlKVTZVbi8xMGFzSWJ2UHVXL21JUFg2NGIyNEQKKzVFST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTVRDQ0F4bWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQmxURUxNQWtHQTFVRUJoTUNSMUl4UkRCQ0JnTlZCQW9UCitPMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5CithWFI1TVVBd1BnWURWUVFERXpkSVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6CitJRkp2YjNSRFFTQXlNREV4TUI0WERURXhNVEl3TmpFek5EazFNbG9YRFRNeE1USXdNVEV6TkRrMU1sb3dnWlV4Q3pBSkJnTlZCQVlUCitBa2RTTVVRd1FnWURWUVFLRXp0SVpXeHNaVzVwWXlCQlkyRmtaVzFwWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6CitJRU5sY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vCitJRWx1YzNScGRIVjBhVzl1Y3lCU2IyOTBRMEVnTWpBeE1UQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCCitBS2xUQU9NdXB2YU8rbURZTFpVKytDd3FWRTdOdVlSaGxGaFBqejJMNUVQemRZbU5VZVRETjlLS2lFMTVIcmNTM1VONFNvcVM1dGRJCisxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSmZlbDNyKzBhZTUwWCtiT2RPRkFQcGxwNWtZQ3ZONjZtMHpIN3RTWUpuVHhhCis3MUhGSzkrV1hlc3lIZ0xhY0Vuc2JnekltamVOOS9FMllFc21MSUtlMEhqekRROWpwRkV3NGZrckp4SUgyT3E5R0dLWXNGazNmYjd1Cis4eUJSUWxxRDc1TzZhUlh4WXAyZm1UbUNvYmQwTG92VXhRdDdML0RJQ3RvOWVRcWFreHlsS0hKemtVT2FwOUZOaFlTNXFYU1BGRURICiszTjZzUVdSc3RCbWJBbU50SkdTUFJMSWw2czVkZEF4ak1seU5oK1VDQXdFQUFhT0JpVENCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvCitNQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXBwRkMvUk5oU2lPZUNLUXA1ZGdUQkNQdVFTVXdSd1lEVlIwZUJFQXdQcUE4CitNQVdDQXk1bmNqQUZnZ011WlhVd0JvSUVMbVZrZFRBR2dnUXViM0puTUFXQkF5NW5jakFGZ1FNdVpYVXdCb0VFTG1Wa2RUQUdnUVF1CitiM0puTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBZjczbEI0WHR1UDdLTWhqZENTazRjTng2Tlpyb2tnY2xQRWc4aHdBT1hoaVZ0CitYZE1pS2Foc29nMnA2ejBHVzVrNng4ekRtalIvcXc3SVRoemgrdVRjelEyK3Z5VCtiT2Ryd2czSUJwNU9qV0VvcG1yOTVmWmk2aGc4CitUcUJUbmJJNm5PdWxuSkVXdGsyQzRBd0ZTS2xzOWN6NHk1MUp0UEFDcGYxd0ErMktJYVd1RTRaSnd6Tnp2b2M3ZElzWFJTWk1GcEdECisvbWQ5elUxalovcnpBeEtXZUFhTnNXZnRqaisrbjA4QzliTUpML05NaDk4cXk1VjhBY3lzTm5xL29uTjY5NC9CdFpxaEZMS1BNNThOCis3eUxjWm51RXZVVVhCajA4eXJsM05JL0s2czgvTVQ3amlPT0FTU1hJbDdXZG1wbE5zRHo0U2dDYlpOMmZPVXZSSjllNAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitBY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGdXpDQ0E2T2dBd0lCQWdJSVZ3b1JsMExFNDh3d0RRWUpLb1pJaHZjTkFRRUxCUUF3YXpFTE1Ba0dBMVVFQmhNQ1NWUXhEakFNCitCZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFCitBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5CitNakV4TWpJd01sb3dhekVMTUFrR0ExVUVCaE1DU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6CitJRk11Y0M1QkxpOHdNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCitJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdlVUdWZDbHJKCit3a2c0Q3NJY29CaC9rYldIdVVBLzNSMW9Id2lEMVMwZWlLRDRqMWFQYlprQ2twQVcxVjhJYkluWDRheThJTUt4NElOUmltbE5BSlphCitieS9BUkg2akR1U1J6Vmp1M1B2SEhrVkgzU2U1Q0FHZnBpRWQ5VUV0TDB6OUtLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082Cit6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJL2dDY3pXdzYzaWd4ZEJ6Y0l5MnpTZWtjaVJEWEZ6TXd1anQwcTdiZDlaZzFmCitZVkVpVlJ2alJ1UGpQZEExWXByYnJ4VElXNkhNaVJ2aE1DYjhvSnNmZ2FkSEh3VHJvem1TQnArWjA3L1Q2azlRbkJuK2xvY2VQR1gyCitveGdrZzRZUTUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkZiZThsCitFZktYR2tKaDkwcVg2SXV4RUFmNlpZR3lvam5QOXp6L0dQdkc4VnFMV2VJQ3JIdVMwRTRVVDFsRjlneGVLRit3NkQ5Rno4K3ZtMi83CitoTk4zV3BWdnJKU0VudTY4d0VxUFNwUDRSQ0hpTVVWaFVFNFEyT00xZkV3WnRONEZ2Nk1HbjhpMXplUWYxeGNHRFhxVmRGVU5hQnI4CitFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm5mcGIyVThXQU5GQW9XUEFTVUhFWE1Mcm1lR084OUxLdG15dXkvdUU1CitqRjY2Q3lDVTNudUR1UC9qVm8yM0VlazdqUEt4d1YyZHBBdE1LOW15R1BXMW4wc0NBd0VBQWFOak1HRXdIUVlEVlIwT0JCWUVGRkxZCitpRHJJbjNobTdZbnplemh3bE1rQ0FqYlFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVXRpSU9zaWZlR2J0CitpZk43T0hDVXlRSUNOdEF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFMZTNLSHdHQ21TVXlJCitXT1lkaVBjVVpFaW0yRmdLRGs4VE5kODFIZFR0QmpISWdUNXExZDA3R2pMdWtEMFIwaTcwanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwCitKWk4xVXQ2bm5hME9oNGxTY1dvV1BCa2RnL2lhS1dXKzlEK2EyZkR6V29jaGNZQk55K0E0bXorNyt1QXdUYytHMDJVUUdSalJsd0t4CitLM0pDYUt5Z3ZVNWEyaGkvYTVpQjBQMmF2bDRWU00wUkZibkFLVnkwNklqM1BqYXV0Mkw5SG1MZWNIZ1FIRWhiMnJ5a09McG43VlUrCitYbGZmMUFOQVRJR2swazlqcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDCis0eXlYWDA0ZmtaVDYvaXlqMkhZYXVFMnlPRStiK2gxSVlIa200dlA5cWRDYTZIQ1BTWHJXNWIwS0R0c3Q4NDIvNitPa2ZjdkhsWEhvCisycU44eGNMNGRKSUVHNGFzcENKVFFMYXMva3gyei91VU1zQTFuM1kvYnVXUWJxQ21KcUs0TEw3Uks0WDlwMmpJdWdFcnNXeDBIYmh6CitsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VVpDekpKN1ZMa241bC85TXQ0YmxPdkgra1FTR1FRWGVtCitPUi9xbnVPZjBHWnZCZXlxZG42L2F4YWc2N1hIL0pKVUx5c1JKeVUzZUV4UmFyRHp6RmhkRlBGcVNCWC93Z2Uyc1kwUGpseFFSck05Cit2d0dZVDdKWlZFYytOSHQ0YlZhVExuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1RydXN0aXMgRlBTIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRFp6Q0NBaytnQXdJQkFnSVFHeCt0dGlENUpOTTJhL2ZIOFl5Z1dUQU5CZ2txaGtpRzl3MEJBUVVGQURCRk1Rc3dDUVlEVlFRRworRXdKSFFqRVlNQllHQTFVRUNoTVBWSEoxYzNScGN5Qk1hVzFwZEdWa01Sd3dHZ1lEVlFRTEV4TlVjblZ6ZEdseklFWlFVeUJTYjI5MAorSUVOQk1CNFhEVEF6TVRJeU16RXlNVFF3TmxvWERUSTBNREV5TVRFeE16WTFORm93UlRFTE1Ba0dBMVVFQmhNQ1IwSXhHREFXQmdOVgorQkFvVEQxUnlkWE4wYVhNZ1RHbHRhWFJsWkRFY01Cb0dBMVVFQ3hNVFZISjFjM1JwY3lCR1VGTWdVbTl2ZENCRFFUQ0NBU0l3RFFZSgorS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTVZRZTU0N05kRGZ4SXpOanB2dG84QTJtZlJDNnFjK2dJTVBwcWRaaDhtUQorUlVOK0FPcUdlU29EdlQwM21ZbG10K1dLVm9hVG5HaExhQVNNazVNQ1BqRFNOem9pWVlrY2hVNTlqOVd2ZXpYMmZpaEhpVEhjRG5saworSDVuU1c3citmMkMvcmV2blBEZ3BhaS9sa1F0Vi8reHZXTlV0eWQ1TVpuR1BETmNFMmdmbUhoamp2U2tDcVBvYzRWdTVnNmhCU0x3YQorY1kzbll1VXRzdXZmZk0vYnExcktNZkZNSXZNRkUvZUMrWE41REw3WFN4ekEwUlU4azBGazBlYStJeGNpQUlsZUgydWxyRzZuUzR6dAorbzNMbXIyTk5MNFhTRkRXYUxrNk02aktZS0lhaGtRbEJPclRoNC9MNjhNa0tva0hkcWVNRHg0Z1ZPeHpVR3BUWG4yUlpFbTBDQXdFQQorQWFOVE1GRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlM2K25FbGVZdFhRU1VoaGd0eDY3SmtEb3NoWnpBZAorQmdOVkhRNEVGZ1FVdXZweEpYbUxWMEVsSVlZTGNldXlaQTZMSVdjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFINVkvLzAxR1gyYworR0UrZXNDdThqb3dVL3l5ZzJrZGJ3KytCTGE4RjZuUklXL00rVGdmSGJjV3prODhpTlZ5MlAzVW5Yd21XemFEK3ZrQU1YQkpWK0pPQworeWlucFhqOVdWNHM0TnZkRkdrd296WjVCdU8xV1RJU2tRTWk0c0tVcmFYQUVhc1A0MUJJeStRN0RzZHd5aEVRc2I4dEdEK3BtUVE5UAorOFZpbHBnME5EMkhlcFo1ZGZXV2hQQmZucUZWTzc2REg3Y1pFZjFUMW8rQ1A4SHhWSW84cHRvR2o0VzFPTEJ1QVoreXRJSjhNWW1IVgorbC85RDdTM0IybDBwS29VL3JHWHVoZzhGalpCZjMrNmY5TC91SGZ1WTVIK1FLNFI0RUE1c1NWUHZGVnRsUmtwZHI3cjdPbklkemZZbAoraUI2WHpDR2NLUUVOWmV0WDJmTlhscnRJellFPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTdGFydENvbSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJSGh6Q0NCVytnQXdJQkFnSUJMVEFOQmdrcWhraUc5dzBCQVFzRkFEQjlNUXN3Q1FZRFZRUUdFd0pKVERFV01CUUdBMVVFQ2hNTgorVTNSaGNuUkRiMjBnVEhSa0xqRXJNQ2tHQTFVRUN4TWlVMlZqZFhKbElFUnBaMmwwWVd3Z1EyVnlkR2xtYVdOaGRHVWdVMmxuYm1sdQorWnpFcE1DY0dBMVVFQXhNZ1UzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EWXdPVEUzTVRrMAorTmpNM1doY05Nell3T1RFM01UazBOak0yV2pCOU1Rc3dDUVlEVlFRR0V3SkpUREVXTUJRR0ExVUVDaE1OVTNSaGNuUkRiMjBnVEhSaworTGpFck1Da0dBMVVFQ3hNaVUyVmpkWEpsSUVScFoybDBZV3dnUTJWeWRHbG1hV05oZEdVZ1UybG5ibWx1WnpFcE1DY0dBMVVFQXhNZworVTNSaGNuUkRiMjBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBdworZ2dJS0FvSUNBUURCaU5zSnZHeEdmSGlmbFh1MU01RHljbUxXd1RZZ0lpUmV6dWwzOGtNS29nWmtwTXlPTnZnNDVpUHdibTJ4UE4xeQorbzRVY29kTTl0RE1yMHkrdi91cXdRVmxudHNRR2ZRcWVkSVhXZVV5QU4zcmZPUVZTV2ZmMEcwWkRwTktGaGRMRGNmTjFZalM2TElwLworSG8vdTdUVFFFY2VXelZJOXVqUFczVTNlQ3p0S1M1L0NKaS82dFJZY2NqVjN5anhkNXNyaEpvc2FOblpjQWR0MEZDWCs3YldnaUEvZAorZU1vdEh3ZVhNQUV0Y25uNlJ0WVRLcWk1cHF1RFNSM2w4dS9kNUFHT0dBcVBZMU1XaFdLcERoazZ6TFZtcHNKcmRBZmtLK0YyUHJSdAorMlBaRTRYTmlIenZFdnFCVFZpVnNVUW4zcXF2S3YzYjliWnZ6bmR1L1BXYThERmFxcjVoSWxUcEwzNmRZVU5rNGRhbGI2a01NQXYrWgorNitoc1RYQmJLV1djM2FwZHpLOEJNZXdNNjlLTjZPcWNlK1p1OXlkbURCcEkxMjVDNHovZUlUNTc0UTF3KzJPcXFHd2FWTFJjSlhySgorb3NtTEZxYTdMSDRYWGdWTldHNFNIUUh1RWhBTnhqSi9HUC84OVByTmJwSG9Oa20rR2tocGk4S1dUUm9Tc21rWHdRcVExdnA1SWtpLwordW50cCtIREgrbm8zMk5nTjBuWlBWLytRdCtPUjB0M3Z3bUMzWnpyZC9xcWM4TlNMZjNJaXpzYWZsN2I0cjRxZ0VLaloreGpHdHJWYworVWp5SnRoa3Fjd0VLRHdPekVtRHllaStCMjZOdS95WXdsL1dMM1lsWHRxMDlzNjhyeGJkMkF2Q2wxaXVhaGhRcWN2YmpNNHhkQ1VzVAorMzd1TWRCTlNTd0lEQVFBQm80SUNFRENDQWd3d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRAorVlIwT0JCWUVGRTRMN3hxa1FGdWxGMm1ITU1vMGFFUFFRYTd5TUI4R0ExVWRJd1FZTUJhQUZFNEw3eHFrUUZ1bEYybUhNTW8wYUVQUQorUWE3eU1JSUJXZ1lEVlIwZ0JJSUJVVENDQVUwd2dnRkpCZ3NyQmdFRUFZRzFOd0VCQVRDQ0FUZ3dMZ1lJS3dZQkJRVUhBZ0VXSW1oMAorZEhBNkx5OTNkM2N1YzNSaGNuUnpjMnd1WTI5dEwzQnZiR2xqZVM1d1pHWXdOQVlJS3dZQkJRVUhBZ0VXS0doMGRIQTZMeTkzZDNjdQorYzNSaGNuUnpjMnd1WTI5dEwybHVkR1Z5YldWa2FXRjBaUzV3WkdZd2djOEdDQ3NHQVFVRkJ3SUNNSUhDTUNjV0lGTjBZWEowSUVOdgorYlcxbGNtTnBZV3dnS0ZOMFlYSjBRMjl0S1NCTWRHUXVNQU1DQVFFYWdaWk1hVzFwZEdWa0lFeHBZV0pwYkdsMGVTd2djbVZoWkNCMAorYUdVZ2MyVmpkR2x2YmlBcVRHVm5ZV3dnVEdsdGFYUmhkR2x2Ym5NcUlHOW1JSFJvWlNCVGRHRnlkRU52YlNCRFpYSjBhV1pwWTJGMAorYVc5dUlFRjFkR2h2Y21sMGVTQlFiMnhwWTNrZ1lYWmhhV3hoWW14bElHRjBJR2gwZEhBNkx5OTNkM2N1YzNSaGNuUnpjMnd1WTI5dAorTDNCdmJHbGplUzV3WkdZd0VRWUpZSVpJQVliNFFnRUJCQVFEQWdBSE1EZ0dDV0NHU0FHRytFSUJEUVFyRmlsVGRHRnlkRU52YlNCRworY21WbElGTlRUQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFqby9uM0pSNQorZlBHRmY1OUpiMnZLWGZ1TS9nVEZ3V0xSZlVLS3ZGTzNsQU5tTUQreDV3cW5VQ0JWSlg5MmVoUU42d1FPUU9ZKzJJaXJCeWVEcVhXbQorTjNQSC9VdlNUYTBYUU1oR3ZqdC9VZnpEdGdVeDNNMkZJazV4dC9KeFhyQWF4cnFUaTNpU1NvWDRlQStEL2krdExQZmtwTHN0ME9jTgorT3JnK3p2WjQ5cTVISk1xak5UYk94OGFIbU5ycysrbXl6aWViaU1NRW9mWUxXV2l2eWRzUUQwMzJaR05jcFJKdmtyS1RsTWVJRnc2VAordG41aWk1Qi9xMDZmL09OMUZFOHFNdDliRGVEMWU1TU5xNkhQaCtHbEJFWG9QQktsQ2NXdzBiZFQ4MkFVdW9WcGFpRjhIM1ZoRnlBWAorZTJ3N1FTbGM0YXhhMGMyTW0rdGdIUm5zOStXdzJ2bDVHS1ZGUDBsRFY5TGRKTlVzby8yUmpTZTE1ZXNVQnBwTWV5RzdPcTB3QmhqQQorMk1GckxIOVpYRjJSc1hBaVYrdUthMGhLMVE4cDdNWkF3QytJVEdnQkYzZjBKQmxQdmZyaHNpQWhTOTBhMkNsOXFyamVWT3doVllCcworSHZVd3lLTVE1YkxtS2hReHc0VXRqSml4aGxwUGlWa3R1Y2YzSE1pS2Y4Q2RCVXJtUWs5aW8yMHBwQitGcTl2bGdjaXRLajFNWFZ1RQorSm5IRWhWNXhKTXFsRzJ6WVlkTWE0RlRienJxcE1yVWk5bk5CQ1YyNEYxME9ENW1RMWtmYWJ3bzZZaWdVWjRMWjhkQ0FXWnZMTWRpYgorRDR4M1RyVm9pdkpzOWlRT0xXeHd4WFBSM2hUUWNZKzIwM3NDOXVPNDFBbHVhNTUxaERubWZ5V2w4a2dBd0tRQjJqOD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZZekNDQTB1Z0F3SUJBZ0lCT3pBTkJna3Foa2lHOXcwQkFRc0ZBREJUTVFzd0NRWURWUVFHRXdKSlRERVdNQlFHQTFVRUNoTU4KK1UzUmhjblJEYjIwZ1RIUmtMakVzTUNvR0ExVUVBeE1qVTNSaGNuUkRiMjBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2cKK1J6SXdIaGNOTVRBd01UQXhNREV3TURBeFdoY05Nemt4TWpNeE1qTTFPVEF4V2pCVE1Rc3dDUVlEVlFRR0V3SkpUREVXTUJRR0ExVUUKK0NoTU5VM1JoY25SRGIyMGdUSFJrTGpFc01Db0dBMVVFQXhNalUzUmhjblJEYjIwZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKK2RIa2dSekl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJpVFpiQjdjZ05yMkN1K0VXSUFPVmVxOE8KK28xWEpKWmxLeGRCV1FZZVFUU0ZncEJTSE84MzlzajYwWndOcTdlRVBTOENSaFhCRjRFS2UzaWtqMUFFTm9CQjV1TnNEdmZPcEw5SEcKKzRBL0xub29VQ3JpOTlsWmk4Y1Z5dGpJbDJiTHp2V1hGRFN4dTFaSnZHSXNBUVJTQ2IwQWdKbm9vRC9VZWZ5ZjNsTEUzUGJmSGtmZmkKK0FlejlsSW5oekc3VE50WUtHWG11MXpTQ1pmOThRcnUyM1F1bU5LOUxZUDUvUTBrR2k0eER1RmJ5Mlg4aFF4ZnFwMGlWQVhWMTZpdWwKK1E1WHFGWVNkQ0kwbWJsV2JxOXpTT2RJeEhXRGlyTXhXUlNUMUhGU3I3b2JkbGpLRitFeFA2SlYydGdYZE5pTm52UDhWNHNvNzVxYnMKK08rd21FVFJJamZhQUt4b2pBdXVLSERwMktudFdGaHh5S3JPcTQyQ2xBSjhFbStKdkhoUllXNlZzaTFnOHc3cE9PbHozNFpZclB1OEgKK3ZLVGxYY3hObnczaDNLcTc0VzRhN0kvaHRreE5lWEpkRnpVTEhkZkJSOXFXSk9EUWNxaGFYMll0RU53dktoT3VKdjRLSEJuTTBENEwKK25NZ0pMdmxibG5wSG5PbDY4d1ZRZEpWem5qQUo4NWVDWHVhUE9RZ2VXZVUxRkVJVC93Q2M5NzZxVU0vaVVValh1Ryt2K0U1K001aVMKK0ZHSTZkV1BQZS9yZWdqdXB1em5peEwwc0FBN0lGNndUNzAwbGp0aXprQytwMmlsOUhhOTBPcklud01FZVBuV2pGcW12ZWlKZG54TWEKK3o2ZWc2K09HQ3RQOTVwYVYxeVBJTjkzRWZLbzJySmdhRXJIZ1R1aXhPL1hXYi9FdzF3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEUKK0JUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVUzhXMFFHdXRITE9sSEdWdVJqYUpod1VNRHJZd0RRWUoKK0tvWklodmNOQVFFTEJRQURnZ0lCQUhOWFB5elZsVEorTjl1V2t1c1pYbjVUNTBIc0ViWkg3N1hlN1hSY3hmR09TZUQ4YnBrVHpaK0sKKzJzMDZDdGc2V2drL1h6VFFMd1BTWmgwYXZaeVFOOGdNamdkYWxFVkdLdWErZXRxaHFhUnBFcEt3ZlRiVVJJZlhVZkVwWTlaMXpSYmsKK0o0a2QrTUl5U1AzYm1kQ1BYMVIwekt4bk5CRmkyUXdLTjRmUm94ZElqdElYSGZiWC9kdGw2LzJvMVBYV1Q2UmJkZWpGMG1DeTJ3bCsKK0pZdDd1bEtTbmo3b3hYZWhQT0JLYzJ0aHo0YmNRLy8vSWY0alhTUks5ZE50RDJJRUJWZUMybTZrTXlWNVN5NVVHWXZNTEQwdzZkRUcKKy8rZ3lScjYxTTNaM3FBRmRsc0hCMWI2dUpjREpIZ29KSUlpaERzbnpiMDJDVkFBZ3A5S1A1RGxVRnk2TkhyZ2J1eHU5bWs0N0VEVGMKK25JaFQ3Nkl4VzFoUGtXTEl3cHFhelJWZE9Lbld2dmdUdFo4U2FmSlFZcXo3RnpmMDdyaDFaMkFRKzROUStVUzFkWnhBRjdMKy9YbGQKK2JsaFlYekQ4QUs2dk04RU9UbXk2cDZhaGZ6TGJPT0N4Y2hjS0s1SHNhbU1tN1luVWVNeDBIZ1g0YS82TWFuWTVLYTVsSXhLVkNDSWMKK2w4NWJCdTRNNHJ1OEgwU1Q5dGc0UlFVaDdlU3RxeEsyQTZSQ0xpM0VDVG9EWjJtRW11RlprSW9vaGRWZGRMSFJEaUJZbXhPbHNHT20KKzdYdEgvVVZWTUtUdW10VG00b2Z2bU1reWdoRXBJcndBQ2pGZUxRL0FqdWxyc284dUJ0alJrY2ZHRXZSTS9UQVh3OEhhT0Z2anFlcm0KK29icDU3M1BZdGxOWExmYlE0ZGRJCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0J1eXBhc3MgQ2xhc3MgMiBSb290IENBCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVCitRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nUTJ4aGMzTWdNaUJTYjI5MElFTkJNQjRYCitEVEV3TVRBeU5qQTRNemd3TTFvWERUUXdNVEF5TmpBNE16Z3dNMW93VGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxCitlWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3SGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3CitEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTmZIWHZmQkI5UjMrME1oOVBUMWFlVHVNZ0hibzRZZjVGa051dWQxCitnMUxyNmh4aEZVaTdIUWZLaks2dzNKYWQ2c05na29hQ0tIT2NWZ2IvUzJUd0RDbzNTYlhsend4ODd2Rkt1M013WmZQVkw0TzJmdVBuCis5WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MTFLMkdTY3VWcjFRR2JOZ0dFNDFiCisvK0VtR1ZuQUpMcUJjWG1RUkZCb0pKUmZ1TE1SOFNsQllhTkJ5eU0yMWNIeE1sQVFUbi8waHBQc2hOT092RXUvWEFGT0J6M2NGSXFVCitDcVRxYy9zTFVlZ1RCeGo2RHZFcjBWUVZmVHpoOTdRWlFtZGlYbmZnb2xYc3R0bHBGOVU2cjBUdFNzV2U1SG9uZk9WMTE2ckxKZWZmCithd3JiRDAyVFRxaWd6WHN1OGxrQmFyY051QWVCZm9zNEd6am1DbGVaUGU0aDZLUDFEQmJkaSt3MGpwd3FIQUFWRjQxb2c5SndueGdJCit6UkZvMWNsclVzM0VSby9jdGZQWVYzTWU2WlE1QkwvVDNqamV0RlBzYVJ5aWZzU1A1QnR3cmZLaStmdjNGbVJtYVo5SlVhTGlGUmhuCitCa3AvMVd5MVRiTXo0R0hyWGI3cG1BOHkxeDFMUEM1YUFWS1JDZkxmNm8zWUJrQmpxaEhrL3NNM25oUlNQL1RpelBKaGs5SDlaMnZYCitVcTYvYUt0QVE2QlhOVk40OEZQNFlVSUhaTWJYYjV0TU9BMWpyR0t2Tm91aWN3b045U0c5ZEtwTjZuSURTZHZIWHgxaVk4ZjkzWkhzCitNKzcxYmJSdU1HamV5Tlltc0hWZWU3UUhJSmloZGpLNFRXeFBBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlECitWUjBPQkJZRUZNbUFkK0Jpa29MMVJwenp1dmRNdzk2NG82MDVNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGCitBQU9DQWdFQVUxOGg5YnF3T2xJNUxKS3diQURKNzg0Zzd3YnlscDdwcEhSL2VoYjh0L1cyK3hVYlA2dW13SEpkRUxGeDdyeFA0NjJzCitBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0T2x1d2xONUU0MEVJCitvc0hzSGRiOVQ3YldSOUFVQzhybXlyVjdkMzVCSDE2RHg3YU1PWmF3UDVhQlFXOWdrT0xvK2ZzaWNkbDlzejFHdjdTRXI1QWNENDhTCithcS92N2g1NnJnSktpaGNyZHY2c1ZJa2tMRTgvdHJLblRveW9rWmY3S2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkCitEbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyRElTQ0xJQnJRWW9Jd091bGE5K1pFc3VLMVY2QURKSGdKZ2cyU01YNk9CRTEveVdECitMZko2djlyOWp2Nmx5MFVzSDhTSVU2NTNEdG1hZHNXT0xCMmp1dFhzTXE3QXFxejMwWHBONjlRSDRrajNJbzZ3cEo5cXpvNnlzbUQwCitveUxRSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNzV0OThiaUdDCit3V2c1VGJTWVdHWml6RXFRWHNQNkp3U3hlUlYwbWN5K3JTRGVKbUFjNjFaUnBxUHE1S00vcC85aDNQRmFUV3d5STBQdXJLanU3a29TCitDVHhkY2NLK2VmckNoMmdkQy8xY2Fjd0cwSnA5VkprcXlUa2FHYTlMS2tQelkxMWFXT0l2NHgza3FkYlFDdENldjllQkNmSEp4eVlOCitySmdXVnFBPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitCdXlwYXNzIENsYXNzIDMgUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQorUW5WNWNHRnpjeUJCVXkwNU9ETXhOak16TWpjeElEQWVCZ05WQkFNTUYwSjFlWEJoYzNNZ1EyeGhjM01nTXlCU2IyOTBJRU5CTUI0WAorRFRFd01UQXlOakE0TWpnMU9Gb1hEVFF3TVRBeU5qQTRNamcxT0Zvd1RqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMQorZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBd0hnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRE1nVW05dmRDQkRRVENDQWlJdworRFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSAorc0o4WVpMeWE5dnJWZWRpUVlrd2lMOTQ0UGRiZ3FPa2NMTnQ0RWVtT2FGRVZjc2Z6TTRma29GMExYT0JYQnlvdzljM0VOM2NvVFJpUgorNXIvVlV2MXhMWEErNThiRWl1UHdLQXYwZHBpaGk0ZFZzam9UL0xjK0p6ZU9JdU9vVHlydllMczl0em5ERGdGSG1WMFNUOXREK2xlaAorN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgwREpxMWwxc0RQR3piam5pYXpFdU9RQW5GTjQ0d093WgorWm9ZUzZKMXlGaE5rVXNlcE54ejlnakR0aEJnZDlLNWMvM0FUQU91eDlUTjZTOVpWK0FXTlMybXc5Yk1vTmx3VXhGRnpUV3NMOFRRSAorMnhjNTE5d29lMnYxbi9NdXdVOFhLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVgorL2FmbWlTVFl6SXcwYk9Jakw5a1NHaUc1VlpGdkM1RjVHUXl0UUlnTGNPSjYwZzdZYUVpN2doTTVFRmpwMkNvSHhoTGJXTnZTTzFVUQorUndVVloySitHR09tUmo4SkRsUXlYcjhOWW5vbjc0RG8yOWxMQmxvM1dpWFFDQkozMUc4SlVKYzl5QjNEMzR4Rk1GYkcwMlNyWnZQQQorWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQSzlEeDJoekxhYmpLU1dKdHlOQmpZdDFnRDFpcQorajZHOEJhVm1vczhiZHJLRVpMRk1PVkxBTUxyd2pFc0NzTGEzQWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRAorVlIwT0JCWUVGRWU0emYvbGIrNzRzdXd2VGc3NUpiQ09QR3ZETUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRgorQUFPQ0FnRUFBQ0FqUVRVRWtNSkFZbUR2NGpWTTF6K3M0alNRdUtGdmR2b1dGcVJJTnl6cGtNTHlQUGdLbjlpQjVidGIyaVVzcEtkVgorY1NReTlzZ0w4cnhxK0pPc3NnZkNYNS9iek1pS3FyNXFiK0ZKRU13eDE0Qzd1OGpZb2c1a1YrcWk5Y0twTVJYU0lHcnMvQ0lCS00rRwordUlBZXFjd1JwVHp5RnJOSG5melNnQ0hFeTlCSGNFR2h5b01aQ0N4dDhsMTNuSW9VRTlRMkhKTHc1UVkzM0tibWtKczRqMXhyRzBhRworUTBKZlBnRUhVMVJkWlgzM2luT2htbFJhSHlsREZDZkNoUSsxaUhzYU81UzNIV0NudFp6bktXbFhXcHVUZWtNd0d3UFhZc2hBcHFyOAorWk9SSzE1RlRBYWdnaUc2Y1gwUzV5MkNCTk94djAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMgorS1NiMTJ0akU4blZoejM2dWRtTktla0JsazRmNEhvQ01odVdHMW84Ty9GTXNZT2dXWVJxaVBrTjd6VGxnVkdyMThva21BV2lEU0tJegorNk1rRWtiSVJOQkUrNnRCREdSOERrNUFNLzFFOVYvUkJidUhMb0w3cnlXUE5iY3prK0RhcWFKM3R2VjJYY0VRTnRnNDEzT0VNWGJ1ZworVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkR1NzlsZU5LR2VmOUpPeHFERFBEZQorZU96SThrMU1HdDZDS2ZqQld0cnQ3dVluWHVoRjBKMGNVYWhvcTBUajBJdHE0L2c3dTl4TjEyVHlVYjdtcXF0YTZUSHVCcnh6dnhOaQorQ3AvSHVaYz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NCitJbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVCitjblZ6ZENCRFpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd0hoY05NRGd4CitNREF4TVRBeU9UVTJXaGNOTXpNeE1EQXhNak0xT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6CitkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JECitaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdnZ0VpTUEwR0NTcUdTSWIzCitEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5ZFpQd1lpSnZKSzdnZW5hc2ZiM1pKTlc0dC96TjhFTGc2M2lJVmw2Ym1sUWRUUXlLCis5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3L1JMeVRQV0dyVHMwTnZ2QWdKMWdPUkg4RUdvZWwxNVlVCitOcERRU1h1aGRmc2FhM094K002cENTenlVOVhERkVTNGhxWDJpeXM1MnFNelZObjZjaHIzSWhVY2lKRnJmMmJsdzJxQXNDVHozNFpGCitpUDBaZjNXSEh4K3hHd3B6SkZ1NVplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXCiswZURyWGx0TUVuQU1iRVFncXhIWTlCbjIwcHhTTitmNnRzSXhPMHJVRkptdHh4cjFYVi82QjdoOERSL1dneDZ6QWdNQkFBR2pRakJBCitNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUzFBL2QyTzJHQ2FoS3FHRlByCitBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3lXTDZ1a0syWUo1ZitBYkd3VWdDNFRlUWJJWFFiCitmc0R1WG1rcUphOWMxaDNhMG5uSjg1Y3A0SWFIM2dSWkQvRloxR1NGUzVtdkpRUWV5VWFwbDk2Q3NodHduNXoycjNFeDNYc0ZwU3pUCit1Y3BIOXNyeTl1ZXR1VWcvdkJhM3dXMzA2Z212N1BPMTV3V2VwaDZLVTFIV2s0SE1kSlAydWRxbUpRVjBlVnArUUQ2Q1N5WVJNRzdoCitQMEhIUndBMTFmWFQ5MVErZ1QzYVNXcWFzKzhRUGVicmI5SElJa2ZMek04Qk1aTFpHT01pdmdrZUdqNWFzdVJyREZSNmZVTk91SW1sCitlOWVpUFphR3pQSW1OQzFxa3AyYUd0QXc0bDFPQkxCZml5QitkOEU5bFlMUlJwbzdQSGk0YjZIUURXU2llQjRwVHBQRHBGUVVXdz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0VFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUF6Q0NBdXVnQXdJQkFnSVFWSUQ1b0hQdFB3Qk15b25ZNDNIbVNqQU5CZ2txaGtpRzl3MEJBUVVGQURCMU1Rc3dDUVlEVlFRRworRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MWN6RW9NQ1lHQTFVRUF3d2ZSVVVnUTJWeQorZEdsbWFXTmhkR2x2YmlCRFpXNTBjbVVnVW05dmRDQkRRVEVZTUJZR0NTcUdTSWIzRFFFSkFSWUpjR3RwUUhOckxtVmxNQ0lZRHpJdworTVRBeE1ETXdNVEF4TURNd1doZ1BNakF6TURFeU1UY3lNelU1TlRsYU1IVXhDekFKQmdOVkJBWVRBa1ZGTVNJd0lBWURWUVFLREJsQgorVXlCVFpYSjBhV1pwZEhObFpYSnBiV2x6YTJWemEzVnpNU2d3SmdZRFZRUUREQjlGUlNCRFpYSjBhV1pwWTJGMGFXOXVJRU5sYm5SeQorWlNCU2IyOTBJRU5CTVJnd0ZnWUpLb1pJaHZjTkFRa0JGZ2x3YTJsQWMyc3VaV1V3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQgorRHdBd2dnRUtBb0lCQVFESUlNRHM0TVZMcXdkNGxmTkU3dnNMRFA5MGptRzdzV0xxSTlpcm9XVXlldXVPRjArVzJBcDdrYUpqYk1lTQorVEM1NXY2a0YvR2xjbFkxaStibHc3Y05SZmRDVDVtenJNRXZodkgyL1Vwdk9ibnRsOGppeHdLSXk3Mkt5YU9CaFU4RTJsZi9zbExvMgorcnB3Y3B6SVA1WHkweG05MC9Yc1k2S3hYN1FZZ1N6SXdXRnY5emFqbW9meHd2STZTYzl1WHAzd2hyajNCOVVpSGJDZTlueVYwZ1ZXdworOTNYMlBhUmthOVpQNTg1QXJRL2RNdE84aWhKVG1NbUoreEFkVFg3TmZoOVdEU0Z3aGZZZ2d4LzJ1aDhFaitwM2lEWEUvK3BPb1l0TgorUDJNYlJNTkUxQ1YyeXJlTjF4NUtabVROWE1XY2crSENDSWlhN0U2ajhUNGNMTmxzSGFGTEFnTUJBQUdqZ1lvd2dZY3dEd1lEVlIwVAorQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJMeVdqN3FWaHkvelFhczhmRWx5YWxMMUJTWgorTUVVR0ExVWRKUVErTUR3R0NDc0dBUVVGQndNQ0JnZ3JCZ0VGQlFjREFRWUlLd1lCQlFVSEF3TUdDQ3NHQVFVRkJ3TUVCZ2dyQmdFRgorQlFjRENBWUlLd1lCQlFVSEF3a3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBSHYyNU1BTnFobEh0MDFYby82dHU3RnExUStlMitSagoreFk2aFVGYVRscmc0d0NRaVpyeFRGR0dWdjlESEtwWTVQMzBvc3hCQUlXckVyN0JTZHhqaGx0aFdYZVBkTmw0ZHAxQlVvTVVxNUtxTQorbElwUG5UWC9kcVFHRTVHaW9uMEFSRDlWMDRJOEd0VmJ2RlpNSWk1R1E0b2tRQzN6RXJnN2NCcWtscmthcjRkQkdtb1lEUVpQeHo1dQordVNsTkRVbUpFWWN5VytaTEJNamtYT1owYzVSZEZwZ1RsZjc3MjdGRTVUcHdyRGRyNXJNemNpakpzMWVnOWdJV2lBWUx0cVpMSUNqVQorM2oyTHJUY0ZVM1QrYnN5OFF4ZHhYdm5GekJxcFllNzNkZ3p6Y3ZSeXJjOXlBallIUjgvdkdWQ0pZTXpwSkpVUHdzc2Q4bTkya01mTQorZGNHV3haMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVFVSS1RSVVNUIENlcnRpZmljYXRlIFNlcnZpY2VzIFByb3ZpZGVyIFJvb3QgMjAwNworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFUFRDQ0F5V2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQnZ6RS9NRDBHQTFVRUF3dzJWTU9jVWt0VVVsVlRWQ0JGCitiR1ZyZEhKdmJtbHJJRk5sY25ScFptbHJZU0JJYVhwdFpYUWdVMkhFbjJ4aGVjU3hZOFN4YzhTeE1Rc3dDUVlEVlFRR0V3SlVVakVQCitNQTBHQTFVRUJ3d0dRVzVyWVhKaE1WNHdYQVlEVlFRS0RGVlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnCitRbWxzYWNXZmFXMGdSOE84ZG1WdWJHbkVuMmtnU0dsNmJXVjBiR1Z5YVNCQkxzV2VMaUFvWXlrZ1FYSmhiTVN4YXlBeU1EQTNNQjRYCitEVEEzTVRJeU5URTRNemN4T1ZvWERURTNNVEl5TWpFNE16Y3hPVm93Z2I4eFB6QTlCZ05WQkFNTU5sVERuRkpMVkZKVlUxUWdSV3hsCithM1J5YjI1cGF5QlRaWEowYVdacGEyRWdTR2w2YldWMElGTmh4SjlzWVhuRXNXUEVzWFBFc1RFTE1Ba0dBMVVFQmhNQ1ZGSXhEekFOCitCZ05WQkFjTUJrRnVhMkZ5WVRGZU1Gd0dBMVVFQ2d4VlZNT2NVa3RVVWxWVFZDQkNhV3huYVNERXNHeGxkR25GbjJsdElIWmxJRUpwCitiR25GbjJsdElFZkR2SFpsYm14cHhKOXBJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNGdLR01wSUVGeVlXekVzV3NnTWpBd056Q0NBU0l3CitEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3UzUGdxTXlLVllGZWFLN3ljOVNyVG9KZFBOTThJZzNCbnVpRDlOCitZdkRkRTNlUFlha3F0ZFR5dVRGWUtUc3ZQMnFjYjNOMkplNDBJSUR1NnJmd3hBck5LNGFVeWVOZ3NVUlNzbG9wdEpHWGc5aTNwaFF2CitLVW1pOHdVRys3UlAycUZzbW1hZjhFTUp5dXB5aitzQTF6VTUxMVlYUnhjdzlMNi9QOEpvcnpaQXdhbjBxYWZvRUdzSWl2ZUdIdHlhCitLaFVHOXFQdzlPREhGTlJSZjgrMDIyMnZSNVlYbTNkeDJLZHhuU1FNOXBRL2hURVNUN3J1VG9LNHVUNlBJemRlektLcWRmY1lid25UCitycWRVS0RUNzRlQTdZSDJndm5tSmhzaWZMZmtLUzhSUW91ZjllUmJIZWdzWXo4NU03MzNXQjIrWThhK3h3WHJYZ1RXNHFoZTA0TXNDCitBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGQ25Ga0tzbHJ4SGtZYitqLzRoaGtlWU8vcHlCTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQCitCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQVFEZHI0T3V3bzBSU1ZnckVTTEZGNlFTVTJUSi9zCitQeCtFbldWVVhLZ1dBa0Q2YmhvM2hPOXluWVlLVloxV0tLeG1MTkE2VnBNMEJ5V3RDTENQeUE4SldjcWRtQnpsVlBpNVJYOXFsMitJCithRTFLQmlZM2lBSU90c2JXY3BuT2EzZmFZakdrVmgrdVg0MTMybDMyaVB3YTJaNjFnZkF5dU9PSTBKenphcUM1bXhSWk5UWlB6L09PCitYbDBYclJXVjJOMnkxUlZ1QUU2elM4OW1sT1RnemJVRjJtTlhpK1d6cXR2QUxoeVFSTnNhWFJpazdyNEVXNW5WY1Y5VlpXUmkxYUtiCitCRm1HeUdKMzUzeUNSV285Rjcvc25YVU1ycU52V3RNdm1EYjA4UFVacXhGZHlLYmpLbGhxUWduRHZaSW1aaklOWFFoVmRQK01tTkFLCitwb1JxMFRsOQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIDIwMDkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFTXpDQ0F4dWdBd0lCQWdJRENZUHpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FMHhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLCitEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVEFlCitGdzB3T1RFeE1EVXdPRE0xTlRoYUZ3MHlPVEV4TURVd09ETTFOVGhhTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFCitMVlJ5ZFhOMElFZHRZa2d4SnpBbEJnTlZCQU1NSGtRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnTWpBd09UQ0NBU0l3CitEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTk95U3M5NlIrOTFteVA2T2kvV1VFV0pOVHJHYTl2KzJ3Qm9xT0FECitFUjAzVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0MnRTSEtYemxBCitCRjliZnN5anhpdXBRQjdaTm9UV1NQT1NIalJHSUNUQnBGR09TaHJ2VUQ5cFhSbC9SY1BIQVk5UnlTUG9jcTYwdkZZSmZ4TExITEd2CitLWkFLeVZYTUQ5TzBHdTFITlZwSzdaeHpCQ0hRcXIwTUU3VUF5aVpzeEdzTWxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6CitwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScC9obmQySE44Z2NxVzNvN3RzeklGWllRMDV1YjlWeEMxWDNhL0w3QVFEY1VDCitBd0VBQWFPQ0FSb3dnZ0VXTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRlAzYUZNU2ZNTjRodlI1Q09meXJZeU5KCis0UEdFTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmpkRzl5CitlUzVrTFhSeWRYTjBMbTVsZEM5RFRqMUVMVlJTVlZOVUpUSXdVbTl2ZENVeU1FTnNZWE56SlRJd015VXlNRU5CSlRJd01pVXlNREl3CitNRGtzVHoxRUxWUnlkWE4wSlRJd1IyMWlTQ3hEUFVSRlAyTmxjblJwWm1sallYUmxjbVYyYjJOaGRHbHZibXhwYzNRd1E2QkJvRCtHCitQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnNMMlF0ZEhKMWMzUmZjbTl2ZEY5amJHRnpjMTh6WDJOaFh6SmZNakF3CitPUzVqY213d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIK1gyekRJMzZTY2ZTRjZnSERPRkJKcGlCU1ZZRVFCckxMcE1FK2JVTUptCisySDZOTUxWd01lbmlhY2Z6Y05zZ0ZZYlFEZkMrckFGMWhNNStuMDIvdDJBN25QUEtIZUplYU5pam5aZmxRR0RTTmlIKzBMUzRGOXAwCitvMy9VMzdDWUFxeHZhMnNzSlNSeW9XWHVKVnJsNWpMbjh0K3JTZnJ6a0drajJ3VFo1MXhZL0dYVWw3N00vQzRLekNVcU5RVDRZSkVWCitkVDFCL3lNZkdjaHM2NEpUQktia1RDSk5qWXk2emx0ejdHUlVVRzNSbkZYN2FjTTJ3NHk4UElXbWF3b21EZUNUbUdDdWZzWWtsNHBoCitYNUdPWnBJSmh6Yk5pNXN0UHZaUjFGRFVXU2k5Zy9MTUtIdFRobTNZSm9odzErcVJ6VDY1eXNDUWJsckdYblJsMTF6K28rST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRVF6Q0NBeXVnQXdJQkFnSURDWVAwTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSworREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBdworT1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVd05EWmFNRkF4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSworREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBdworT1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmUworZWdwbmxqZ0o5aEJPbFNKem1ZM2FGUzNuQmZ3WmN5SzNqcGdBdkR3OXJLRnMrOVo1SlV1dDhNeGsyb2crS2JnUENkTTAzVFAxWXRIaAorelJucDdoaFBURml1NGg3V0RGc1ZXdGc2dU1RWVpCN2pNN0sxaVhkT0RML1psR3NUbDI4U28vNlpxUVRNRmV4Z2FEYnRDSHUzOWIrVAorN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFJwNzVtcG9vNktyM0hHckhoRlBDK09oMjV6MXV4YXY2MAorc1VZZ292c2VPM0R2azVoOWpIT1c4c1h2aFhDdEtTYjhIZ1ErSEtEWUQ4dFNnMko4N290VGxaQ3BWNkxxWVFYWStVM0VKL3B1cmUzNQorMTFIM2E2VUNBd0VBQWFPQ0FTUXdnZ0VnTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5PVWlreGlFeW9aTHN5dgorY29wOU50ZWFITnhuTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCM1FZRFZSMGZCSUhWTUlIU01JR0hvSUdFb0lHQmhuOXNaR0Z3T2k4dgorWkdseVpXTjBiM0o1TG1RdGRISjFjM1F1Ym1WMEwwTk9QVVF0VkZKVlUxUWxNakJTYjI5MEpUSXdRMnhoYzNNbE1qQXpKVEl3UTBFbAorTWpBeUpUSXdSVllsTWpBeU1EQTVMRTg5UkMxVWNuVnpkQ1V5TUVkdFlrZ3NRejFFUlQ5alpYSjBhV1pwWTJGMFpYSmxkbTlqWVhScAorYjI1c2FYTjBNRWFnUktCQ2hrQm9kSFJ3T2k4dmQzZDNMbVF0ZEhKMWMzUXVibVYwTDJOeWJDOWtMWFJ5ZFhOMFgzSnZiM1JmWTJ4aAorYzNOZk0xOWpZVjh5WDJWMlh6SXdNRGt1WTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQKworUFBvZVVTYnJoL1lwM3VEeDFNWWtDZW5CejFVYnRERFp6aHIrQmxHbUZhUXQ3N0pMdnlBb0pVblJwalozTk9oazMxS3hFY2R6ZXMwNQorbnNLdGpIRWg4bHBycjk4OFRsV3Zzb1JsRkltNWQ4c3FNYjdQbzIzUGIwaVVNa1p2NTNHTW9LYUVHVGNIOGdORkNTdUdkWHpmWDJsWAorQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYXhwZUcwSUxENUVKdC9yRGlaRTRPSnVkQQorTkNhMUNJblhDR05qT0NkMUhqUHFicWpkbjVsUGRFMkJpWUJMM1pxWEtWd3Z2b0ZCdVl6LzZuMWdCcDdOMXozVExxTVZ2S2ptSnVWdgordzl5NEF5SHFueGJ4TEZTMQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitQU0NQcm9jZXJ0Cis9PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUpoakNDQjI2Z0F3SUJBZ0lCQ3pBTkJna3Foa2lHOXcwQkFRc0ZBRENDQVI0eFBqQThCZ05WQkFNVE5VRjFkRzl5YVdSaFpDQmsKK1pTQkRaWEowYVdacFkyRmphVzl1SUZKaGFYb2daR1ZzSUVWemRHRmtieUJXWlc1bGVtOXNZVzV2TVFzd0NRWURWUVFHRXdKV1JURVEKK01BNEdBMVVFQnhNSFEyRnlZV05oY3pFWk1CY0dBMVVFQ0JNUVJHbHpkSEpwZEc4Z1EyRndhWFJoYkRFMk1EUUdBMVVFQ2hNdFUybHoKK2RHVnRZU0JPWVdOcGIyNWhiQ0JrWlNCRFpYSjBhV1pwWTJGamFXOXVJRVZzWldOMGNtOXVhV05oTVVNd1FRWURWUVFMRXpwVGRYQmwKK2NtbHVkR1Z1WkdWdVkybGhJR1JsSUZObGNuWnBZMmx2Y3lCa1pTQkRaWEowYVdacFkyRmphVzl1SUVWc1pXTjBjbTl1YVdOaE1TVXcKK0l3WUpLb1pJaHZjTkFRa0JGaFpoWTNKaGFYcEFjM1Z6WTJWeWRHVXVaMjlpTG5abE1CNFhEVEV3TVRJeU9ERTJOVEV3TUZvWERUSXcKK01USXlOVEl6TlRrMU9Wb3dnZEV4SmpBa0Jna3Foa2lHOXcwQkNRRVdGMk52Ym5SaFkzUnZRSEJ5YjJObGNuUXVibVYwTG5abE1ROHcKK0RRWURWUVFIRXdaRGFHRmpZVzh4RURBT0JnTlZCQWdUQjAxcGNtRnVaR0V4S2pBb0JnTlZCQXNUSVZCeWIzWmxaV1J2Y2lCa1pTQkQKK1pYSjBhV1pwWTJGa2IzTWdVRkpQUTBWU1ZERTJNRFFHQTFVRUNoTXRVMmx6ZEdWdFlTQk9ZV05wYjI1aGJDQmtaU0JEWlhKMGFXWnAKK1kyRmphVzl1SUVWc1pXTjBjbTl1YVdOaE1Rc3dDUVlEVlFRR0V3SldSVEVUTUJFR0ExVUVBeE1LVUZORFVISnZZMlZ5ZERDQ0FpSXcKK0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOVzM5S09VTTZGR3FWVmhTUTJvaDNOZWtTMXd3UVlhbE5vOTdCVkMKK3dmV01ybW9YOFlxdC9JQ1Y2b05Fb2x0NlZjNVBwNlhWdXJnZm9DZkFVRk0ramJuQURyZ1YzTlpzK0o3NEJDWGZnSThRaGQxOUwzdUEKKzNWY0FaQ1A0YnNtK2xVL2hkZXpnZmw2VnpiSHZ2bnBDMk1rczArc2FHaUtMdDM4R2llVTg5UkxBdTlNTG1WK1FmSTR0TDNjemtrb2gKK1JxaXBDS3p4OWhFQzJaVVdubzB2bHVZQzNYWENGQ3BhMXNsOUpjTEIvS3BuaGVMc3Z0RjhQUHF2MVc3L1UwSFU5VEk0c2VKZnhQbU8KK0VPOEdxUUtKLytNTWJwZmczNTNiSWREMFBnaHBiTmpVNURiNGc3YXlObytjN3pvM0ZuMi9vbW5YTzF0eTBLK3FQMXhtazZ3S0ltRzIKKzBxQ1p5RlNUWGFpMjBiMWRDbDUzbEtJdHdJS092TW9ES2pTdWMvSFV0UXk5dm1lYlZPdmgrcUJhN0RoK1BzSE1vc2RFTVhYcVArVUgKKzBxdWhKWmIyNXVTZ1hUY1lPV0VBTTExRzFBREV0TW84OGFLalB2TTYvMmt3TGtEZDlwK2NKc21XTjYzbk9hSy82bW5iVlNLVlV5cVUKK3RkK3RGamlCZFdianh5d2JrNXlxaktQSzJXdzhGMjJjM0h4VDRDQW5RemI1RXVFOFhMMW12NkpwSXppNG1XQ1pEbFpUT3B4K0ZJeXcKK0JtL3hobmFRci8ydi9wREdqNTkvaTVJam5PY1Zkby9WaTVRVGNtbjdLMkZqaU8vbXBGN21veGRxV0VmTGNVOFVDMTdJQWdnbW9zdnAKK3IydUtHY2ZMRkZiMTRkcTEyZnkvY3pqYStlZXZicVEzNGdjbkFnTUJBQUdqZ2dNWE1JSURFekFTQmdOVkhSTUJBZjhFQ0RBR0FRSC8KK0FnRUJNRGNHQTFVZEVnUXdNQzZDRDNOMWMyTmxjblJsTG1kdllpNTJaYUFiQmdWZ2hsNENBcUFTREJCU1NVWXRSeTB5TURBd05EQXoKK05pMHdNQjBHQTFVZERnUVdCQlJCRHhrNHFwbC9RZ3VrMXllWVZLSVhUQzFSVkRDQ0FWQUdBMVVkSXdTQ0FVY3dnZ0ZEZ0JTdHV5SWQKK3h1RFNBYWo5ZGxCU2srMll3VTJ1MDZHQ0FTYWtnZ0VpTUlJQkhqRStNRHdHQTFVRUF4TTFRWFYwYjNKcFpHRmtJR1JsSUVObGNuUnAKK1ptbGpZV05wYjI0Z1VtRnBlaUJrWld3Z1JYTjBZV1J2SUZabGJtVjZiMnhoYm04eEN6QUpCZ05WQkFZVEFsWkZNUkF3RGdZRFZRUUgKK0V3ZERZWEpoWTJGek1Sa3dGd1lEVlFRSUV4QkVhWE4wY21sMGJ5QkRZWEJwZEdGc01UWXdOQVlEVlFRS0V5MVRhWE4wWlcxaElFNWgKK1kybHZibUZzSUdSbElFTmxjblJwWm1sallXTnBiMjRnUld4bFkzUnliMjVwWTJFeFF6QkJCZ05WQkFzVE9sTjFjR1Z5YVc1MFpXNWsKK1pXNWphV0VnWkdVZ1UyVnlkbWxqYVc5eklHUmxJRU5sY25ScFptbGpZV05wYjI0Z1JXeGxZM1J5YjI1cFkyRXhKVEFqQmdrcWhraUcKKzl3MEJDUUVXRm1GamNtRnBla0J6ZFhOalpYSjBaUzVuYjJJdWRtV0NBUW93RGdZRFZSMFBBUUgvQkFRREFnRUdNRTBHQTFVZEVRUkcKK01FU0NEbkJ5YjJObGNuUXVibVYwTG5abG9CVUdCV0NHWGdJQm9Bd01DbEJUUXkwd01EQXdNREtnR3dZRllJWmVBZ0tnRWd3UVVrbEcKK0xVb3RNekUyTXpVek56TXROekIyQmdOVkhSOEViekJ0TUVhZ1JLQkNoa0JvZEhSd09pOHZkM2QzTG5OMWMyTmxjblJsTG1kdllpNTIKK1pTOXNZM0l2UTBWU1ZFbEdTVU5CUkU4dFVrRkpXaTFUU0VFek9EUkRVa3hFUlZJdVkzSnNNQ09nSWFBZmhoMXNaR0Z3T2k4dllXTnkKK1lXbDZMbk4xYzJObGNuUmxMbWR2WWk1MlpUQTNCZ2dyQmdFRkJRY0JBUVFyTUNrd0p3WUlLd1lCQlFVSE1BR0dHMmgwZEhBNkx5OXYKK1kzTndMbk4xYzJObGNuUmxMbWR2WWk1MlpUQkJCZ05WSFNBRU9qQTRNRFlHQm1DR1hnTUJBakFzTUNvR0NDc0dBUVVGQndJQkZoNW8KK2RIUndPaTh2ZDNkM0xuTjFjMk5sY25SbExtZHZZaTUyWlM5a2NHTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQ3RaNnlLWnU0U3EKK1Q5NlF4dEdHY1NPZVN3T1JSM0M3d0pKZzdPRFU1MjNHMCsxbmczZFMxZkxsZDZjMnN1TlV2dG03Q3BzUjcySDB4cGt6bWZXdkFEbU4KK2c3K212VFYrTEZ3eE5HOXMyL05rQVppcWxDeEIzUldHeW1zcFRoYkFTZnpYZzBnVEIxR0VNVktJdTRZWHgyc3ZpaUN0eFF1UGNENHEKK3V4dHhqN21rb1AzWWxkbXZXYjhsSzVqcFk1TXZZQjdFcXZoMzlZdHNMKzErTHJWUFFBM3V2RmQzNTltMjFEK1ZKem9nMWVXdXEydzEKK244R2hIVm5jaElIdVRRZmlTTGFlUzVVdFFiSGg2TjUrTHdVZWFPNi91NUJsT3NqdTZyRVlOeHhpazZTZ01leHhiSkhtcEhtSldoU24KK0ZGQUZUS1FBVnpBc3diVmhsdHcrSG9Tdk9VTFA1ZEFzc1NTODMwREQ3WDlqU3IzaFR4SmtocFh6c09mSXQrRlR2WkxtOHd5V3Vldm8KKzVwTHRwNEVKRkF2OGxYclBqOVkwVHpZUzNGN1JOSFhHUm9BdmxRU014NGJFcUNhSnFEOFptNEc3VWFSS2hxc0xFUSt4cm1OVGJTanEKKzNUTldPQnl5cllEVDEzSzltbXlaWStnQXUwRjJCYmRibVJpS3c3Z1NYRmJQVmd4OTZPTFA3YngwUi92dTB4ZE9JazlXLzFEekx1WTUKK3BvTFdjY3JldDlXNmFBanRtY3o5b3BMTGFiaWQrUXFrcGo1UGt5Z3FZV3dISmdEL2xsOW9ocmk0enNwVjRLdXhQWCtZMXpNT1dqM1kKK2VNTEVZQy9IWXZCaGtkSTRzUGFlVmR0QWdBVVNNODRka3B2UmFiUC92L0dTQ21FMVA5MytodlM4NEJweHMyS20KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgRVYgQ2VydGlmaWNhdGVzIFJvb3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUQ5ekNDQXQrZ0F3SUJBZ0lFU0o4QUFUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmlqRUxNQWtHQTFVRUJoTUNRMDR4TWpBd0JnTlYKK0JBb01LVU5vYVc1aElFbHVkR1Z5Ym1WMElFNWxkSGR2Y21zZ1NXNW1iM0p0WVhScGIyNGdRMlZ1ZEdWeU1VY3dSUVlEVlFRRERENUQKK2FHbHVZU0JKYm5SbGNtNWxkQ0JPWlhSM2IzSnJJRWx1Wm05eWJXRjBhVzl1SUVObGJuUmxjaUJGVmlCRFpYSjBhV1pwWTJGMFpYTWcKK1VtOXZkREFlRncweE1EQTRNekV3TnpFeE1qVmFGdzB6TURBNE16RXdOekV4TWpWYU1JR0tNUXN3Q1FZRFZRUUdFd0pEVGpFeU1EQUcKK0ExVUVDZ3dwUTJocGJtRWdTVzUwWlhKdVpYUWdUbVYwZDI5eWF5QkpibVp2Y20xaGRHbHZiaUJEWlc1MFpYSXhSekJGQmdOVkJBTU0KK1BrTm9hVzVoSUVsdWRHVnlibVYwSUU1bGRIZHZjbXNnU1c1bWIzSnRZWFJwYjI0Z1EyVnVkR1Z5SUVWV0lFTmxjblJwWm1sallYUmwKK2N5QlNiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFtMzV6N3IwN2VLcGtRMEgxVU4rVThpNnkKK2pVcU9SbFRTSVJMSU9USkNCdW1EMVo5UzdlVm5BenRVd1l5Wm1jenB3QS8vRGRtRUViSzQwY3RiM0I3NWFERms0WnY2ZE90b3VTQ1YKKzk4WVBqVWVzV2diZFlhdmk3TmlmRnkyY3lqdzFsMVZ4elVPRnNVY1c5U3hUZ0hiUDB3Qmt2VUNaM2N6WTI4U2YxaE5mUVlPTCtRMkgKK2tsWTBiQm9RQ3hmVldoeVhXSVE4aEJvdVhKRTBiaGxmZnhkcHhXWHZheUhHMVZBNnYyRzVCWTN2YnpRNnNtOFVZNzhXTzV1cEt2MjMKK0t6aG1Cc1VzNHFwbkhrV25qUVJtUXZhUEsrK0lJR21QTW93VWM5b3JocEZqSXByeXA5dk9pWXVyWGNjVXdWc3dhaCt4dDU0dWdRRUMKKzdjK1dYbVBicU9ZNHR3SURBUUFCbzJNd1lUQWZCZ05WSFNNRUdEQVdnQlI4Y2tzNXg4RGJZcVZQbTZvWU5KS2l5b09DV1RBUEJnTlYKK0hSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVmSEpMT2NmQTIyS2xUNXVxR0RTU29zcUQKK2dsa3dEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBQ3JEeDBNM2o5MnRwTElNN3R3VWJZOG9wSmhKeXd5QTZ2UHRJMloxZmNYVElXZDUKKzBYUEZ0UU8zV0t3TVZDL0dWaE1QTWRvRzUyVTdIVzgyMjhnZCtmMkFCc3FqUFdZV3FKMU1GbjNBbFVhMVVlVGlIOWZxQmsxampaYU0KKzcrY3pWMEk2NjR6QmVjaE5kbjNlOXJHM2dlQ2crYUY0UmhjYVZwandUajJySE8zc09kd0hTUGRqL2dhdXdxUmNhbHN5aU1YSE00V3MKK1prSkh3bGdrbWVIbFB1VjFMSTVEMWwwOGVCNm9sWUlwVU5IUkZycnZ3YjU2MmJUWXpCNU1SdUYzc1RHcnZTckl6bzl1b1YxL0EzVTAKKzVLMkpSVlJldnE0b3Bicy9lSG5yYzdNS0RmMit5ZmRXclBhMzdTK2JJU25IT0xhVnhBVHl3eTM5RkNxUW1ia0h6Sjg9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1N3aXNzY29tIFJvb3QgQ0EgMgorPT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUYyVENDQThHZ0F3SUJBZ0lRSHA0bzZFank1ZS9EZkVvZVdoaG50akFOQmdrcWhraUc5dzBCQVFzRkFEQmtNUXN3Q1FZRFZRUUcKK0V3SmphREVSTUE4R0ExVUVDaE1JVTNkcGMzTmpiMjB4SlRBakJnTlZCQXNUSEVScFoybDBZV3dnUTJWeWRHbG1hV05oZEdVZ1UyVnkKK2RtbGpaWE14R3pBWkJnTlZCQU1URWxOM2FYTnpZMjl0SUZKdmIzUWdRMEVnTWpBZUZ3MHhNVEEyTWpRd09ETTRNVFJhRncwek1UQTIKK01qVXdOek00TVRSYU1HUXhDekFKQmdOVkJBWVRBbU5vTVJFd0R3WURWUVFLRXdoVGQybHpjMk52YlRFbE1DTUdBMVVFQ3hNY1JHbG4KK2FYUmhiQ0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pFYk1Ca0dBMVVFQXhNU1UzZHBjM05qYjIwZ1VtOXZkQ0JEUVNBeU1JSUMKK0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFsVUpPaEoxUjV0TUo2SEphSTJuYmVIQ09GdkVyancwRHpwUE0KK0xnQUllNnN6alBUcFFPWVhUS3VldUVjVU1uY3kzU2dNM2hoTFgzYWYrRGs3L0U2SjJIekZaKytyMHJrMFgyczY4MlEyenNLd3p4Tm8KK3lzakw2N1hpUFM0aDMrb3MxT0Q1Y0paTS8ycFltTGNYNUJ0UzVYNEhBQjFmMnVZK2xRUzNhWWc1b1VGZ0pXRkxsVGxvWWh5eEN3V0oKK3dEYUNGQ0UvcnR1aC9ieHZIR0NHdGxPVVNia3JSc1ZQQUN1L29idkxQK0RIVnh4WDZOWnArTUVrVXAySVZkM0NoeTUwSTlBVS9TcEgKK1dydW1uZjJVNU5HS3BWK0dZM2FGeTYvL1NTajhnTzFNZWRLNzVNRHZBZTVRUVFnMUkzQXJxUmEwakc2RjZiWVJ6ekhkVXlZYjN5MWEKK1NnSkEvTVRBdHVreEdnZ281V0RESDhTUWpoQmlZRVFON0FxK1ZSaHhMS1gwc3J3Vll2OGM0NzRkMmg1WHN6eCt6WUlka2VOTDZ5eFMKK05MQ0svUkpPbHJEcmNIK2VPZmRtUXJHcnJGTGFka0JYZXlxOTZHNERzZ3VBaFlpZERNZkNkN0NhbWxmMHVQb1RYR2lUT21la2w5QWIKK21iZUdNa3RnMk03djBBeC9sWjl2aDArSGlvNWZDSHlxVy94YXZxR1JuMVY5VHJBTGFjeXdsS2luaC9MVFNsRGNYM0t3Rm5VZXk3UVkKK1lwcXdwem1xbTU5bTJJMm1iSllWNCtieStQR0RZbXk3VmVsaGs2TTk5YkZYaTA4anNKdmxsR292MzR6ZmxWRXBZS0VMS2VSY1ZWaTMKK3FQeVo3aVZOVEE2ejAweVBoT2dwRC8wUVZBS0Z5UG5sdzR2UDV3OENBd0VBQWFPQmhqQ0JnekFPQmdOVkhROEJBZjhFQkFNQ0FZWXcKK0hRWURWUjBoQkJZd0ZEQVNCZ2RnaFhRQlV3SUJCZ2RnaFhRQlV3SUJNQklHQTFVZEV3RUIvd1FJTUFZQkFmOENBUWN3SFFZRFZSME8KK0JCWUVGRTBtSUNLSlM5UFZwQXFoYjk3aUVvSEY4VHd1TUI4R0ExVWRJd1FZTUJhQUZFMG1JQ0tKUzlQVnBBcWhiOTdpRW9IRjhUd3UKK01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQXlDcktrRzh0OXZvSlhpYmxxZi9QMHdTNFJmYmdaUG5tM3FLaHlOMmFiR3Uyc0V6c08KK3YyTHduTitlZTZGVFNBNUJlc29ncHhjYnRuanNRSkh6UXEwUXcxenYvMkJaZjgyRm80czlTQndsQWp4bmZmVXk2Uzh3NVgybGVqalEKKzgyWXFaaDZOTTRPS2IzeHVxRnAxbXJqWDJsaElSRWVvVFBwTVNRcEt3aEkzcUVBTXc4amgwRmNObHpLVnh6cWZsOU5YK0F2ZTVYTHoKK285di90ZGhac25QZFRTcHhzcnBKOWNzYzFmVjV5Sm16L01GTWRPTzB2U2szRlFRb0h0NUZSbkRzcjdwNERvb3F6Z0I1M01CZkdXY3MKK2EwdnZhR2dMUStPc3dXSUo3NmJkWldHZ3I0UlZTSkZTSE1ZbGtTclF3U0lqWVZtdlJSR0ZIUUVrTkkvUHMvOFhjaUFUd29DcUlTeHgKK09RN1FqMXpCMDlHT0luSkdUQjJXcms5eHNlRUZLWlpaOUx1ZWRUM1BEVGNOWXRzbWpHT3BJOTluQmp4OE90bzBRdUZtdEVZRTNzYVcKK21BOUxTSG9rTW5XUm42ejNhT2txdVZWbHpsMWgweWR3MkRmK243bXZvQzVXdDZObFVlMDdxeFMvVEZFRDZGK0tCWnZ1aW02Yzc3OW8KKytzamFDK05DeWRBWEZKeTNTdUN2a3ljaFZTYTFaQytOOGYrbVFBV0ZCVnpLQnhsY0N4TW9URmgvd3FYdlJkcGcwNjVsWVoxVGczVEMKK3J2SmN3aGJ0a2o2RVBuTmdpTHgyOUN6UDBIMTkwN2hlMFpFU0VPbk4zY29sNDlYdG1TKytkWUZMSlBsRlJwVEpLU0ZUbkNaRnFoTVgKKzVPZk5lT0k1d1NzU25xYWVHOFhtRHRreDJRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3dpc3Njb20gUm9vdCBFViBDQSAyCis9PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjREQ0NBOGlnQXdJQkFnSVJBUEw2Wk9KMFk5T04vUkFkQkI5MnlsZ3dEUVlKS29aSWh2Y05BUUVMQlFBd1p6RUxNQWtHQTFVRQorQmhNQ1kyZ3hFVEFQQmdOVkJBb1RDRk4zYVhOelkyOXRNU1V3SXdZRFZRUUxFeHhFYVdkcGRHRnNJRU5sY25ScFptbGpZWFJsSUZObAorY25acFkyVnpNUjR3SEFZRFZRUURFeFZUZDJsemMyTnZiU0JTYjI5MElFVldJRU5CSURJd0hoY05NVEV3TmpJME1EazBOVEE0V2hjTgorTXpFd05qSTFNRGcwTlRBNFdqQm5NUXN3Q1FZRFZRUUdFd0pqYURFUk1BOEdBMVVFQ2hNSVUzZHBjM05qYjIweEpUQWpCZ05WQkFzVAorSEVScFoybDBZV3dnUTJWeWRHbG1hV05oZEdVZ1UyVnlkbWxqWlhNeEhqQWNCZ05WQkFNVEZWTjNhWE56WTI5dElGSnZiM1FnUlZZZworUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1UM0hTOVg2bGRzOTNCZFk3QnhVZ2xnUkNnegorbzNwT0N2clk2bXlMVVJZYVZhNVVKc1RNUlFkQlR4QjVmM0hTZWs0L09FNnpBTWFWeWx2TndTcUQxeWNmTVE0akZyY2x5eHkwdVlBeQorWGhxZGsvSG9QR0FzcDE1WEdWaFJYcndzVmd1NDJPK0xnclE4dU1Ja3FCUEhvQ0UyRzNwWEtTaW5Mcjl4SlpEelJJTnBVS1RrNFJ0aQorR1pRSm8vUER2Ty8wdmV6YkU1M1BuVWdKVW1mQU55a1JIdnZTRWFlRkdIUjU1RStGRk90U04rS3hSZGpNRFVOL3JoUFNheXMvcDhMaQorcUcxMlcwT2Z2clNkc3lhR094OS81ZkxvWmlnV0pkQkxsemluNU04SjBUYkRDNzdhTzBSWWpiN3huZ2xyUHZNeXh5dUh4dXhlblBhSAorWmEwektjUXZpZG01eThrRG5mdHNsRkdYRUJ1R0N4b2JQL1lDZm52VXhWRmtLSjMxMDZ5RGdZalRkTFJabmNIcllUTmFSZEhMT2RBRworYWxOZ0hhLzIrMm04YXR3Qno3MzVqOW05VzhFNlg0N2FEMHVwbTUwcUtHc2FDbnc4cXlJTDVYY3RjZmFDTllHdStIdUI1dXIrclBRYQorbTNSYzZJOGs5bDJkUnNRczBoNHJJV3FESjJkVlNxVGp5REtYWnBCeTJ1UFVaQzVmNDZGcTltRFU1elhOeXNSb2pkZHh5Tk1rTTNPeAorYlBscTRTamJYOFk5Nkw1VjVqY2I3U1RaRHhtUFgyTVlXRkNCVVdWdjhwOSthZ1RuTkNSeHVuWkxXQjRadlJWZ1Jhb01Fa0FCblJEaQoreHpnSGNncGx3TGE3SlNuYUZwNkxOWXRoN2VWeFY0TzFQSEdmNDArL2ZoNkJuMEdYQWdNQkFBR2pnWVl3Z1lNd0RnWURWUjBQQVFILworQkFRREFnR0dNQjBHQTFVZElRUVdNQlF3RWdZSFlJVjBBVk1DQWdZSFlJVjBBVk1DQWpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFRAorTUIwR0ExVWREZ1FXQkJSRjJhV0JiajJJVFkxeDBrYkJia1VlODhTQW5UQWZCZ05WSFNNRUdEQVdnQlJGMmFXQmJqMklUWTF4MGtiQgorYmtVZTg4U0FuVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbERwekJwOVNTekJjMVA2eFhDWDUxNDV2OVlka24rMFVqcmdFamloTAorajZwN2pqbTAyVmoyZTZFMUNxR2RpdmRqNWV1OU9ZTFU0M290Yjk4VFBMcitmbGFZQy9OVW44MUVUbTQ4NFQ0VnZ3WW1uZVR3a0xiVQord3A0d0xoL3Z4M3JFVU1mcWU5cFF5M29teXdDMFdxdTFreCtBaVlRRWxZMk5md21UdjlTb3FPUmpiZGxrNUxncFdnaS9VT0dFRDFWNworWHdnaUcvVzltUjRVOXM3MFdCQ0Nzd285R2NHL1c2dXFtZGp5TWIzbE9HYmNXQVhIN1dNYUxncVhmSWVUSzdLSzQvSHNHT1YxdGltSAorNTl5TEduNjAyTW5UaWhkc2ZTbEV2b3FxOVg0NkxtZ3hrN2xxMnByZzIra3VwWVROSEFxNFNnajVuUEZoSnBpVHQzdG03SkZlM1ZFLworMjNNUHJRUllDZDBFQXBVS1B0TjIzNllRSG9BOTZNMmtaTkV6eDVMSDRrNUU0d25KVHNKZGh3NFNucjhQeVFVUTNucWpzVHp5UDZXcQorSjNtdE1YMGYvZndaYWNYZHVUOTh6Y2Ewd2pBZWZtNlMxMzloZGxxUDY1Vk52QkZ1SVh4Wk41blFCcno1Qm0weUZxWFphYWpoM0R5QQorSG1CUjNOZFVJUjdLWW5kUCt0aVBzeXM2RFhoeXlXaEJXa2RLd3FQckd0Y0txend5VmNnS0VaemZkTmJ3UUJVZHlMbVB0VGJGci9naQordU1vZDg5YTJHUStmWVdWcTZuVElmSS9EVDExbGdoL1pEWW5hZFhMNzcvRkhaeE96eU5FWmlDY21tcGw1Zng3a0xEOTc3dkhlVFl1VworbDhQVlAzd2JJKzJrc3gwV2NrTkxJT0ZaZnNMb3JTYS9vdmM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0NBIERpc2lnIFJvb3QgUjEKKz09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmFUQ0NBMUdnQXdJQkFnSUpBTU1EbXU1UWtHNG9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1GSXhDekFKQmdOVkJBWVRBbE5MTVJNdworRVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdU1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcAorWnlCU2IyOTBJRkl4TUI0WERURXlNRGN4T1RBNU1EWTFObG9YRFRReU1EY3hPVEE1TURZMU5sb3dVakVMTUFrR0ExVUVCaE1DVTBzeAorRXpBUkJnTlZCQWNUQ2tKeVlYUnBjMnhoZG1FeEV6QVJCZ05WQkFvVENrUnBjMmxuSUdFdWN5NHhHVEFYQmdOVkJBTVRFRU5CSUVScAorYzJsbklGSnZiM1FnVWpFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNxdzNqMzNKaWpwMXBlZHhpeQorM1FSa0QyUDltNVlKZ05Yb3FxWGluQ2FVT3VpWmM0eWQzOWZmZy9ONFQwRGhmOUtuMHVYS0U1UG43Y1ozWHphMWxLL29PSTdibStWOAordTh5TjYzVno0U1RONXFjdEdTN1kxb3ByRk9zSVlnclkzTE1BVGNNamZGOURDQ015RXR6dERLM0FmUStsZWtMWlduRFp2NmZYQVJ6MgorbTZ1T3QwcUdlS0FlVmpHdTc0SUtnRUgzRzhtdXF6SW0xQ3hyN1gxcjVPSmVJZ3BGeTRReFRheisyOUZIdXZsZ2x6bXhaY2ZlKzVuaworQ2lLeExVM2xTQ1pwcStLcTgvdjhraWt5NmJNK1RSOG5vYzJPdVJmN0pUN0pidk4zMmcwUzlsM0h1ellRMVZUVzgrRGlSMGptM2hUYQorWVZLdkpyVDFjVS9KMTlJRzMyUEsveUhvV1FiZ0NOV0VGVlAzUStWOHhhQ0ptR3R6eG1qT1pkNjlmd1gzc2U3MlY2RmdsY1hNNnBNNgordnBtdW13S2pyY2tXdGM3ZFhwbDRmaG81ZnJMQUJhVEFncVdqUjU2TTZseTJ2R2ZiNWlwTjBnVGNvNjVGOTd5TG5CeW4xdFVEM0FqTAorTGhiS1hFQXo2R2ZETHVlbVJPb1JSUncxWlMwZVJXRWtHNEl1cFowelhXWDRRZmt1eTVRL0g2TU1NU1JFN2NkZXJWQzZ4a0diclBBWAorWmNENFhXOWJvQW8wUE83WDZvaWZtUG12VGlUNmw3SmtkdHFyOU8zancyRHYxZmtDeUMyZmc2OW5hUWFuTVZYVnowdHYvd1FGeDFpcworWHhZYjVkS2o2ekhiSHpNVlRkRHlwVlAxeStFOVRtZ3QyQkxkcXZMbVRadEo1Y1Vvb2Jxd1dzYWd0UUlEQVFBQm8wSXdRREFQQmdOVgorSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVWlRcTBPSk1hNXF2dW01RVkrZlU4UGpYUQorMDRJd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFES0w5cDFLeWI0VTVZeXNPTW82Q2RRYnpvYXozZXZVdWlpK0VxNUZMQVIwckJOUgoreFZnWVprMkMydFhjazhBbjRiNThuMUtlRWxiMjFaeXA5SFdjK2pjU2p4eVQ3RmYrQncrcjFSTDNENjVoWGxhQVNmWDhNUFdiVHg5QgorTHh5RTA0bkg0dG9DZHUwSnoyekJ1QnlESEJiNmxNMTlvTWdZMHNpZGJ2VzlhZFJ0UFRYb0hxSlBZTmNIS2Z5eW82U2RiaFdTVmhsTQorQ3JEcGZOSVpUVUpHN0wzOTlsZGIzWmgrcEUzTWNnT0RXRjN2a3pwQmVtT3FmRHFvOWF5azBkMmlMYllxL0o4Qmp1SVFzY1RLNUdmYgorVlNVWlAvM29ObjZ6NGVHQnJ4RVdpMUNYWUJtQ0FNQnJUWE80MFJNSFB1cTJNVS93UXBwdDRoRjA1WlNzallTVlBDR3Z4ZHBIeU44NQorWW1MTFcxQUwxNEZBQlp5YjdicTJpeDRFYjVZZ09lMmtmU25iU002QzNOUUNqUjBFTVZySFMvQnNZVkxYdEZIQ2dXek40ZnVub2RLUworZHMreER6ZFlwUEpTY1djL0RJaDRnSW5CeUxVZmttTytwM3FLVml3YXFLYWN0VjJ6WTlBVElLSHJrV3pRalgydjN3dmtGN21HbmppeAorbEF4WWpPQlZxanRqYlpxSllMaGtLcExHTi9SK1EwTzNjK2dCNTMrWEQ5ZnlleG45R3RlUHlmcUZhM3Fkbm9tMnBpaVprNGhBOXo3TgorVWFQSzZ1OTVSeUcxL2pMaXg4TlJiNzZBZFBDa3d6cnlUK2xmM3hrSzhqc1RRNnd4cExQbjYvd1kxZ0dwOHlxUE5nN3J0TEc4dDB6SgorYTcraDg5bjA3ZUx3NCsxa25qMHZsbEpQZ0ZPTAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitDQSBEaXNpZyBSb290IFIyCis9PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZhVENDQTFHZ0F3SUJBZ0lKQUpLNGlOdXdpc0ZqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkl4Q3pBSkJnTlZCQVlUQWxOTE1STXcKK0VRWURWUVFIRXdwQ2NtRjBhWE5zWVhaaE1STXdFUVlEVlFRS0V3cEVhWE5wWnlCaExuTXVNUmt3RndZRFZRUURFeEJEUVNCRWFYTnAKK1p5QlNiMjkwSUZJeU1CNFhEVEV5TURjeE9UQTVNVFV6TUZvWERUUXlNRGN4T1RBNU1UVXpNRm93VWpFTE1Ba0dBMVVFQmhNQ1Uwc3gKK0V6QVJCZ05WQkFjVENrSnlZWFJwYzJ4aGRtRXhFekFSQmdOVkJBb1RDa1JwYzJsbklHRXVjeTR4R1RBWEJnTlZCQU1URUVOQklFUnAKK2MybG5JRkp2YjNRZ1VqSXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkMKK3czT2VOY0p4Vlg2Qis2dEdVT0RCZkVsNDVxdDVXRHphLzN3Y245aVhBbmcrYTBFRTZVRzl2Z01zUmZZdlpOU3JYYU5IUFdTYjZXaWEKK3hzd2JQN3Erc29zMEFpNllWUm44akcrcVg5cE16azBESWFQWTBqU1RWcGJMVEF3QUZqeGZHczNJeDJ5bXJkTXhwN3pvNWVGbTF0TDcKK0E3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlUVRnMDZvdjgwZWdFRkdFdFFYNnN4M2RPeTFGVSsxNlMKK0dCc0VXbWpHeWNUNnR4T2dtTGNSSzdmV1Y4eDhuaGZSeXlYK2hrNGtMbFlNZUUyZUFSS21LNmNCWlc1OFloMkVoTi9xd0d1MXBTcVYKK2c4TlRFUXh6SFF1eVJwRFJRanJPUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmEKKzVCZW55OTEySDlBWmR1Z3NCYlBXbkRUWWx0eGhoNUVGNUVRSU04SGF1UWhsMUs2eU5nM3J1amk2RE9XYm51dU5adDJaejlhSlFmWUUKK2tvb3BLVzFyT2h6bmRYMENjUTd6d09lOXl4bmRuV0N5d21aZ3RyRUU3c25taHJtYVprQ281eEh0Z1VVRGkvWm5XZWpCQmhHOTNjK0EKK0FrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9Sc25MTU9QUmVpc2pRUzFuNnlxRW03MFhvb1FMNmkKK0ZoL2Y1RGNmRVhQN2tBcGxRNklOZlBnR0FWVXpmYkFOdVBUMXJxVkNWM3cyRVl4N1hzUURuWXg1blFJREFRQUJvMEl3UURBUEJnTlYKK0hSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV0Wm40cjdDVTllTWcxZ3F0ems1V3BDNXUKK1F1MHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQ1lHWG5EblpUUElnbTdabkJjNkczcG1zZ0gyZUR0cFhpL3EvMDc1S01PWUttRk0KK3RDUVNpbjF0RVJUM25MWEs1cnllSjQ1TUdjaXB2WHJBMXpZT2JZVnlicWpHb20zMituTmpmN3h1ZVFnY25ZcWZHb3BUcHRpNzJUVlYKK3NSSEZxUU96Vmp1NWhKTWlYbjdCOWhKU2krb3NaN3orTmt6MXVNL1JzMG1TTzlNcERwa2JsdmRodUR2RUs3WjRiTFFqYi9EOTA3SmUKK2RSK1psYWlzOXRyaHhURjcrOUZHczlLOFo3UmlWTG9KOTJPd2s2S2ErZWxTTG90Z0Vxdjg5V0JXN3hCY2k4UWFRdHlEVzJRT3k3VzgKKzFrL0JmRHh1alJOdCszdnJNTkRjVGEvRjFiYWxURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96angKK21ISEV0MzhPRmRBbGFiMGluU3Z0QmZaR1I2enR3UERVTytMczdwWmJrQk5PSGxZNjY3RHZscnVXSXhHNjhrT0dkR1NWeUNoMTN4MDEKK3V0STNnemhUT0RZN3oyenArV3NPMFBzRTZFOTMxMlVCZUlZTWVqNGhZdkYvWTNFTXlaOUUyNmdub25XK2JvRSsxOERyRzVnUGNGdzAKK3Nvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zek1PbDZXOEtqcHRsd2xDRnRhT2cKK1V4TE1WWWRoODRHdUVFWmh2VVFodU1JOWRNOStKRFg2SEFjT216MGl5dTh4TDR5c0VyM3ZRQ2o4S1dlZnNoTlBaaVRFVXhucEhpa1YKKzcrWnRzSDh0Wi8zemJCdDFScVBsU2hmcHBOY0wKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQUNDVlJBSVoxCis9PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRUF3d0pRVU5EVmxKQgorU1ZveE1SQXdEZ1lEVlFRTERBZFFTMGxCUTBOV01RMHdDd1lEVlFRS0RBUkJRME5XTVFzd0NRWURWUVFHRXdKRlV6QWVGdzB4TVRBMQorTURVd09UTTNNemRhRncwek1ERXlNekV3T1RNM016ZGFNRUl4RWpBUUJnTlZCQU1NQ1VGRFExWlNRVWxhTVRFUU1BNEdBMVVFQ3d3SAorVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORFZqRUxNQWtHQTFVRUJoTUNSVk13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQworRHdBd2dnSUtBb0lDQVFDYnFhdS9ZVXFYcnkrWFpwcDBYOURabHYzUDR1Um03eDhmUnpQQ1JLUGZtdDRmdFZUZEZYeHBOUkZ2dThnTQoram1vWUh0aVAyUmE4RUVnMlhQQmpzNUJhWENRMzE2UFd5d2x4dWZFQmNvU3dmZHROZ00zODAyL0orTnEyRG9MU1JZV29HMmlvUGVqMAorUkd5OW9jTExBNzZNUGhNQWhOOUtTTURqSWdybzZUZW5HRXl4Q1EwalZuOEVUZGtYaEJpbHlOcEFsSFByemc1WFBBT0JPcDBLb1ZkRAorYWF4WGJYbVFlT1cxdER2WXZFeU5LS0dubzZlNkFrNGwwU3F1N2E0RElyaHJJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWgorMG0vQThwLzRlN01DUXZ0UXFSMHRrdzhqcThiQkQ1TC8wS0lWOVZNSmNSei9SUk9FNWlaZStPQ0lIQXI4RnJhb2N3YTQ4R09FQXFERworV3V6bmROOXdycU9ESmVyV3g1ZUhrNmZHaW9vemwyQTNFRDZYUG00cEZkYWhEOUdJTEJLZmI2cWt4a0xyUWFMamxVUFRBWVZ0anJzNworOHlNMngvNDc0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PbTNXUgorNUxwU0xobCswZlhOV2huOHVnYjIrMUtvUzVrRTNmajV0SXRRbzA1aWlmQ0hKUHFEUXNHSCt0VXRLU3BhY1hwa2F0Y25ZR01OMjg1SgorOVkwZmtJa3lGL2h6UTdqU1dwT0dZZGJoZFFycWVXWjJpRTl4NndRbDFncGFlcFBsdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSSworUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJS3dZQkJRVUhBUUVFY1RCdk1Fd0dDQ3NHQVFVRkJ6QUNoa0JvZEhSdworT2k4dmQzZDNMbUZqWTNZdVpYTXZabWxzWldGa2JXbHVMMEZ5WTJocGRtOXpMMk5sY25ScFptbGpZV1J2Y3k5eVlXbDZZV05qZGpFdQorWTNKME1COEdDQ3NHQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgorVnVxQjVUYk1qQjQvdlRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOS0h0T1BmTnllVFZmWlc2b0hsTnN5TQorSGorOU1JSUJjd1lEVlIwZ0JJSUJhakNDQVdZd2dnRmlCZ1JWSFNBQU1JSUJXRENDQVNJR0NDc0dBUVVGQndJQ01JSUJGQjZDQVJBQQorUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQWNnQjBBR2tBWmdCcEFHTUFZUUJqQUdrQTh3QnVBQ0FBVWdCaAorQU8wQWVnQWdBR1FBWlFBZ0FHd0FZUUFnQUVFQVF3QkRBRllBSUFBb0FFRUFad0JsQUc0QVl3QnBBR0VBSUFCa0FHVUFJQUJVQUdVQQorWXdCdUFHOEFiQUJ2QUdjQTdRQmhBQ0FBZVFBZ0FFTUFaUUJ5QUhRQWFRQm1BR2tBWXdCaEFHTUFhUUR6QUc0QUlBQkZBR3dBWlFCagorQUhRQWNnRHpBRzRBYVFCakFHRUFMQUFnQUVNQVNRQkdBQ0FBVVFBMEFEWUFNQUF4QURFQU5RQTJBRVVBS1FBdUFDQUFRd0JRQUZNQQorSUFCbEFHNEFJQUJvQUhRQWRBQndBRG9BTHdBdkFIY0Fkd0IzQUM0QVlRQmpBR01BZGdBdUFHVUFjekF3QmdnckJnRUZCUWNDQVJZaworYUhSMGNEb3ZMM2QzZHk1aFkyTjJMbVZ6TDJ4bFoybHpiR0ZqYVc5dVgyTXVhSFJ0TUZVR0ExVWRId1JPTUV3d1NxQklvRWFHUkdoMAorZEhBNkx5OTNkM2N1WVdOamRpNWxjeTltYVd4bFlXUnRhVzR2UVhKamFHbDJiM012WTJWeWRHbG1hV05oWkc5ekwzSmhhWHBoWTJOMgorTVY5a1pYSXVZM0pzTUE0R0ExVWREd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSQoraHZjTkFRRUZCUUFEZ2dJQkFKY3hBcC9uL1VOblNFUVU1Q21IN1V3b1p0Q1BOZHBOWWJkS2wwMjEyNURnQlM0T3hublE4cGRwRDcwRQorUjltKzI3VXAycHZacnFtWjFkTThNSlAxamFHby9BYU5SUFRLRnBWOE05eGlpNmczK0NmWUNTMGI3OGdVSnlDcFpFVC9MdFoxcW14TgorWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttQU0vRUtYTVJOdDZHR1Q2ZDdobUtHOVd3N1k0OQorbkNyQURkZzladU04RGIzVmxGemk0cWMxR3dRQTlqOWFqZXBEdlYrSkhhbkJzTXlaNGswQUN0ckpKMXZuRTVCYzVQVXpvbFZ0M09BSgorVFMreEpsc25kUUFKeEdKM0tRaGZubG1zdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXMworc0NQZEs2alQyaVdIN2VoVlJFMkk5RForaEpwNHJQY09Wa2tPMWpNbDFvUlFRbXdnRWgwcTFiNjg4bkNCcEhCZ3ZnVzFtNTRFUkw1aAorSTZ6cHBTU01FWUNVV3FLaXVVblN3ZHpScCsweEVTeWVHYWJ1NFZYaHdPclBEWVRrRjdlaWZLWGVWU1VHN3N6QWgxeEEyc3lWUDFYZworTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RmQzK1lKNW95WFNyamhPN0ZtR1l2bGlBZAorM2RqREo5ZXcrZjdaZmMzUW40OExGRmhSbnkrTHd6Z3QzdWlQMW8ySHBQVldReGFaTFBTa1ZyUTB1R0UzeWNKWWdCdWdsNkg4V1kzcAorRWZiUkQwdFZORVlxaTRZNworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitUV0NBIEdsb2JhbCBSb290IENBCis9PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZRVENDQXltZ0F3SUJBZ0lDREw0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0dBMVVFQmhNQ1ZGY3hFakFRQmdOVkJBb1QKK0NWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVRWRmREUVNCSGJHOWlZV3dnVW05dmRDQkQKK1FUQWVGdzB4TWpBMk1qY3dOakk0TXpOYUZ3MHpNREV5TXpFeE5UVTVOVGxhTUZFeEN6QUpCZ05WQkFZVEFsUlhNUkl3RUFZRFZRUUsKK0V3bFVRVWxYUVU0dFEwRXhFREFPQmdOVkJBc1RCMUp2YjNRZ1EwRXhIREFhQmdOVkJBTVRFMVJYUTBFZ1IyeHZZbUZzSUZKdmIzUWcKK1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDd0Jkdkk2NHpFYm9vaDc0NU5uSEVLSDFKdzdXMkMKK25KZkYxMHhPUlVuTFFFSzFFalJzR2NKMHBERmZoUUtYN0VNekNsUFNuSXlPdDdoNTJ5dlZhdktPWnNUdUt3RUhrdFN6MEFMZlVQWlYKK3IyWU95K0JIWUM4ck1qazFVam9vZy9oN0ZzWVl1R0xXUnlXUnp2QVpFazJ0WS9YVFAzVmZLZkNoTUJ3cW9KaW1GYjN1L1JrMjhPS1IKK1E0LzZ5dFlRSjBsTTc5M0I4WVZ3bThycXFGcEQvRzJHYjNQcE4wV3A4RGJIekloMUhydHNCditiYXo0WDdHR3FjWHpHSGFMM1Nla1YKK3RUeldvV0gxRWZjRmJ4MzlFYjdRTUFmQ0tiQUpUaWJjNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVcKK0tLRCt1NFpxeVBwY0MxamN4a3QyeUtzaTJYTVBwZlJhQW9rL1Q1NGlndTZpZEZNcVBWTW5hUjFzampJc1pBQW1ZMkUyVHFOR3R6OTkKK3N5MnNiWkNpbGFMT3o5cUM1d2MwR1picHVDR3FLWDZtT0w2T0tVb2habmtmczhPMUNXZmUxdFFIUnZNcTJ1WWlOMkRMZ2JZUG9BL3AKK3lKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQUJEemZ1QlNPNk4rcGpXeG4KK2tqTWR3TGZTN0pMSXZnbS9MQ2tGYndKcm51Kzh2eXE4VzhCUWowRndjWWV5VGJjRXFZU2pNcSt1N21zWGk3S3gvbXpoa0l5SXFKZEkKK3pzaE55L01HejE5cUNrS3hIaDUzTDQ2ZzVwSU9CdndGSXRJbTRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUMKK0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFYelNCZHUrV0hkWGx0ZGtDWTRRV3dhNmcKK2NGR245MHhITmNnTDF5ZzlpWEhacWpOQjZoUWJiQ0VBd0d4Q0dYNmZhVnNnUXQraTB0ckVmSmRMamJEb3JNanVwV2tFbVFxU3Bxc24KK0xocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0ZINnZQTk93L0tQNE0KKzhWZUdUc2xWOXh6VTJLVjlCbnB2MWQ4UTM0Rk9JV1d4dHVFWGVaVkZCczVmek54R2lXTm9SSTJUOUdSd29EMmRLQVhET1hDNFluc2cKKy9lVGI2UWlodUo0OUNjZFAreXo0azNaQjNsTGc0VmZTblFPOGQ1NytuaWxlOThGUllCL2UyZ3V5TFhXM1EwaVQ1L1o1eG9SZGdGbGcKK2xQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gxNVFhaURMeEluUWlycVdtMkJKcFRHQ2pBdTRyN05SamtndGV2aTkyYTZPMkpyeVAKK0E5Z0s4a3hrUnIwNVl1V1c2elJqRVNqTWxmR3Q3Ky9jZ0ZoSTZVdTQ2bVdzNmZ5QXRiWElSZm1zd1ovWnVlcGlpSTdFOFV1REVxM20KK2k0VFduc0xyZ3hpZmFyc2JKR0F6Y016czl6THpYTmw1ZmUrZXBQN0pJOE1rN2hXU3NUMlJUeWFHdldaekpCUHFwSzVqd2ExOWhBTTgKK0VIaUdHM25qeFBQeUJKVWdyaU9DeExNNkFHSy81allrNFZlNnh4NlFkZFZmUDVWaEs4RTd6ZVd6YUdIUVJpYXBJVkpwTGVzdXgrdDMKK3pxWTZ0UU16VDNiUjUxeFVBVjNMZVBUSkRML1BFbzRYTFNOb2xPZXIvcW15S3diUUJNMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVGVsaWFTb25lcmEgUm9vdCBDQSB2MQorPT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGT0RDQ0F5Q2dBd0lCQWdJUkFKVytGcUQzTGtieGV6bUNjdnFMelpZd0RRWUpLb1pJaHZjTkFRRUZCUUF3TnpFVU1CSUdBMVVFCitDZ3dMVkdWc2FXRlRiMjVsY21FeEh6QWRCZ05WQkFNTUZsUmxiR2xoVTI5dVpYSmhJRkp2YjNRZ1EwRWdkakV3SGhjTk1EY3hNREU0CitNVEl3TURVd1doY05Nekl4TURFNE1USXdNRFV3V2pBM01SUXdFZ1lEVlFRS0RBdFVaV3hwWVZOdmJtVnlZVEVmTUIwR0ExVUVBd3dXCitWR1ZzYVdGVGIyNWxjbUVnVW05dmRDQkRRU0IyTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrCis2eWZ3SWFQemFTWlZmcDNGVlJhUlhQM3ZJYjlUZ0hvdDBwR01Zekh3N0NUd3c2WFNjbndRYmZRM3QrWG1mSG5xakxXQ2k2NUl0cXdBCiszR1YxN0NwTlg4R0g5U0JsSzRHb1J6NkpJNVV3RnBCLzZGY0hTT2NacnI5Rlo3RTNHd1lxL3Q3NXJIMkQrMTY2NUkrWFo3NUxqbzFrCitCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4Ky9qWGg3VkI3cVRDTkdkTUpqbWhuCitYYjg4bHhoVHV5bGl4Y3BlY3NISGx0VGJMYUMwSDJrRDdPcmlVUEVNUFBDczgxTXQ4QnoxN1d3NU9YT0FGc2hTc0NQTjREN2MzVHhICitvTHMxaXVLWWFJdSs1Yjl5N3RMNnBlMFM3ZnlZR0trbWR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzCitGMGZVVFBIU2lYaytUVDJZcUdIZU9oN1MrRjRENE1ISkhJelRqVTNUbFRhek4xOWpZNXN6RlBBdEptdFRmSW1NTXNKdTdEMGhBRG5KCitvV2ppVUlNdXNEb3I4emFnckMva2IySENVUWs1UG90VHVidG4ydHhUdVhaWk5wMUQ1U0RnUFRKZ2hTSlJ0OGN6dTkwVkw2UjRwZ2Q3CitnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnNzbEVTbDFNcFd0VHdFaERjCitUd0s3RXBJdll0US9hVU44RGRiOFdIVUJpSjFZRmt2ZXVwRC9Sd0dKQm1yMlg3S1Fhck1DcGdLSXY3TkhmaXJaMWZwb2VEVk5BZ01CCitBQUdqUHpBOU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnRUdNQjBHQTFVZERnUVdCQlR3ajFrNEFMUDFqNXFXCitETlhyK251cUYrZ1RFakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBdnVSY1lrNGs5QXdJLy9EVERHamtrMGtpUDBRbmI3dHQzb05tCit6cWpNRGZ6MW1nYmxkeFNSNjUxQmU1a3FoT1gvL0NIQlhmRGtIMWUzZGFtaFh3SW0vOWZIOTA3ZVQvajNIRWJBZWs5QUxDSTE4Qm14CiswR3RuTExDbzRNQkFOelgyaEZ4YzQ2OUNlUDZueVExUTZnMkVkdlpSNzROVHhuci9EbFpKTG85NjFnem1KMVRqVFFwZ2NtTE5rUWZXCitwYi9JbVd2dHhCbm1xMHdST01Wdk1lSnVTY2cvZG9BbUF5WXA0RGIyOWlCVDR4ZHdOQmVkWTJnZWErekRUWWE0RXpBdlhVWU5SMFBWCitHNnBaRHJsY2pRWklyWFNIWDhmOE1WUkJFK0xISVE2ZTRCNE40Y0I3UTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjCitjNDF0ZXlXUnl1NUZyZ1pMQU16VHNWbFEyanFJT3lsRFJsNlhLMVRPVTIrTlN1ZVcrcjl4RGtLTGZQMG9vTkJJeXRyRWdVeTdvbk9UCitKc2pyRE5ZbWlMYkFKTSs3dlZ2cmRYM3BDSTZHTXl4NWR3bHBwWW44czNDUWgzYVAweUs3UXM2OWN3c2dKaXJRbXoxd0hpUnN6WWQyCitxUmVXdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbkhML0VWbFA2CitZMlhROHh3T0Z2VnJobGhOR05Ua0RZNmxuVnVSM0hZa1VEL0dLdnZadDV5MTF1YlEyZWdaaXhWeFNLMjM2dGhaaU5TUXZ4YXoyZW1zCitXV0ZVeUJ5NnlzSEs0YmtnVEk4Nms0bWxvTXkvMC9aMXBIV1diVlk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0UtVHVncmEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJR1N6Q0NCRE9nQXdJQkFnSUlhbWcrbkZHYnkxTXdEUVlKS29aSWh2Y05BUUVMQlFBd2diSXhDekFKQmdOVkJBWVRBbFJTTVE4dworRFFZRFZRUUhEQVpCYm10aGNtRXhRREErQmdOVkJBb01OMFV0VkhYRW4zSmhJRVZDUnlCQ2FXeHB4WjlwYlNCVVpXdHViMnh2YW1scworWlhKcElIWmxJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVkJBc01IVVV0VkhWbmNtRWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTgorWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMVozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEV6TURNdworTlRFeU1EazBPRm9YRFRJek1ETXdNekV5TURrME9Gb3dnYkl4Q3pBSkJnTlZCQVlUQWxSU01ROHdEUVlEVlFRSERBWkJibXRoY21FeAorUURBK0JnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkNhV3hweFo5cGJTQlVaV3R1YjJ4dmFtbHNaWEpwSUhabElFaHBlbTFsZEd4bAorY21rZ1FTN0ZuaTR4SmpBa0JnTlZCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1TZ3dKZ1lEVlFRRAorREI5RkxWUjFaM0poSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQorTUlJQ0NnS0NBZ0VBNHZVL2t3VlJIb1ZpVkY1NkMvVVlCNE91ZnE5ODk5U0thNlZqUXptNVMvZkR4bVNKUFpRdVZJQlNPVGtIUzB2ZAoraFFkMmg4eS9MNVZNekgyblBieEhENWh3K0l5RkhuU09rbTBiUU5HWkRidDFic2lwYTVyQWhER3Z5a1BMNnlzMDZJK1hhd0diMVE1SworQ0twYmtuU0ZROU9BcnFHSVc2Nno2bDdMRnBwM1JNaWg5bFJvenQ2UGx5dTZXMEFDREdRWHdMV1R6ZUh4RTJiT0RIbnYwWkVvcTErZworRWxJd2N4bU9qK0dNQjZMRHUwcnc2aDhWcU80bHpLUkcrQnNpNzdNT1E3b3NKTGpGTEZ6VUhQaGRaTDNEazE0b3B6OG44WTRlMHlwUQorQmFOVjJjdm5PVlBBbUo2TVZHS0xKckQzZlkxODVNYWVaa0pWZ2tmbnNsaU5admNIZkM0MjVsQWNQOXRESk1XL2hrZDVzM2tjOTFyMAorRSt4cytEL2lXUitWN2tJK3VhMm9Nb1ZKbDBiK1N6R1BXc3V0ZEVjZjZaRzMzeWdFSXFEVUQxM2llVS9xYklXR3ZhaW16dVQ2dytHegorcnQ0OFVlN0xFM3dCZjRRT1hWR1VuaE1NdGk2bFRQazVjRFp2bHNvdURFUlZ4Y3I2WFFLajM5WmtqRnF6QVFxcHRRcEhGLy92a1VBcQoranFGR09qR1k1Ukg4ekx0SlZvcjh1ZEJobW05bGJPYkR5ejUxU2Y2UHArS0p4V2ZYblVZVFRqRjJPeVN6bmhGbGhxdC83eDNVK0x6bgorckZwY3QxcEhYRlhPVmJRaWNWdGJDL0RQM0tCaFpPcXAxMmdLWTZmZ0RUK2dyOU9xMG43dlVhRG1VU3RWa2hVWFU4dTNaZzVtVFBqNQorZFV5UTV4Snd4MFVDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkM3ajI3SkowSnhVZVZ6Nkp5cit6RTdTNkU1VU1BOEdBMVVkRXdFQgorL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVUx1UGJza25RbkZSNVhQb25LdjdNVHRMb1RsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFRworTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBRk56cjBUYmRGNGtWMUpJKzJkMUxvSE5nUWsyWHo4bGtHcEQ0ZUtleGQwZENyZk9BSwora0VoNDdVNllBNW4rS0dDUkhUQWR1R044cU9ZMXRmclRZWGJtMWdkTHltbWFzb1I2ZDVORkZ4V2ZKTkNZRXhML3U2QXUvVTVNaC9qTworWEtxWUd3WGdBRVpLZ29DbE00c28zTzA0MDkvbFB1bisrMW5kWVlSUDBsU1dFMkVUUG8rQWFiNlRSN1UxUTlKYXV6MWM3N05DUjgwNworVlJNR3NBbmIvV1AyT29nS21XOSs0YzRiVTJwRVppTlJDSHU4VzFLaS9RWTNPRUJoajBxV3VKQTMrR2JIZUpBQUZTNkxyVkUxVXdlbworYTJpdStVNDhCeWJOQ0FWd3pEay9kcjJsMDJjbUFZYW1VOUpnTzN4RGYxV0t2SlVhd1NnNVRCOUQwcEgwY2xtS3VWYjhQN1NkMm5DYworZGxxTVExRHVqakJ5VGQvL1NmZkdxV2ZaYmF3Q0VlSTZGaVduV0FqTGIxTkJuRWc0UjJnejBkZkhqOVIwSWRUREJaQjYvODZXaUxFVgorS1YwanE5QmdvUkpQM3ZRWHpUTGx5Yi9JUTYzOUxvN3hyK0wwbVBvU0h5RFl3S2NNaGNXUTlEc3RsaWF4TEw1TXErdXgwb3JKMjNnVAorRHg0Sm5XMlBBSjhDMnNINkgzcDZDY1JLNW9ncWw1K0ppLzAzWDE4NnpqaFpoa3V2Y1F1MDJQSndUNTh5RStPd3AxZmwydHBEeTRRMAorOGlqRTZtMzBLdS9CYTNiYSszNjdoVHpTVThKTnZuSGhSZEg5STJjTkUzWDd6MlZuSXAydXNBblJDZjhkTkwvK0k1YzMwam42UFEwRworQzdUYk82T3JiMXdkdG43b3M0STA3UVpjSkE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUR3ekNDQXF1Z0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb00KK0lsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlUKK2NuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3SGhjTk1EZ3gKK01EQXhNVEEwTURFMFdoY05Nek14TURBeE1qTTFPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHoKK2RHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkQKK1pXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd2dnRWlNQTBHQ1NxR1NJYjMKK0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkQXFTem0xbnpIb3F2TkszOERjTFoKK1NCbnVhWS9KSVB3aHFnY1o3YkJjckdYSFgrMENmSHQ4TFJ2V3VybUF3aGlDRm9UNlpyQUl4bFFqZ2VUTnVVay85azl1TjBnb09BL0YKK3Z1ZG9jUDA1bDAzU3g1aVJVS3JFUkxNamZUbEg2VkppMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAKKzJjdStmak9sYnBTRDhEVDZJYXZxam5LZ1A2VGVNRnZ2aGsxcWxWdERSS2dRRlJ6bEFWZkZtUEhtQmlpUnFpREZ0MU1tVVVPeUN4R1YKK1dPSEFEM2Jad0kxOGdmTnljSjV2L2hxTzJWODF4ckp2Tkh5K1NFL2lXam5YMkoxNG5wK0dQZ05lR1l0RW90WEhBZ01CQUFHalFqQkEKK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTL1dTQTJBSG1nb0NKcmpOWHkKK1lkSzRMTXVDU2pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU1RT2lZUXNmZE9oeU5zWnQrVTJlK2lLbzRZRld6ODI3bitxcmtSazQKK3I2cDhGVTN6dHFPTnBmU085a1NwcCtnaGxhMCtBR0lXaVBBQ3V2eGhJK1l6bXpCNmF6WmllNjBFSTRSWVplTGJLNHJuSlZNM1lsTmYKK3ZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWd0lFb0hOTi9xL3hXQTViclhldGhiZFh3RmVpbEhma0NvTVJOM3pVQTd0RkZIZWk0UjQwY1IKKzNwMW0wSXZWVkdiNmcxWHFmTUlwaVJ2cGI3UE80Z1dFeVM4K2VJVmlic2xmd1hoamRGakFTQmdNbVRucnBNd2F0WGxhalJXYzJCUU4KKzlub0hWOGNpZ3dVdFBKc2xKajBZczZsRGZNaklxMlNQRHFPL25CdWRNTnZhMEJrdXFqengrek9BZHVUTnJSbFBCU2VPRTZGdXdnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQXRvcyBUcnVzdGVkUm9vdCAyMDExCis9PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGR6Q0NBbCtnQXdJQkFnSUlYRFBMWWl4ZnN6SXdEUVlKS29aSWh2Y05BUUVMQlFBd1BERWVNQndHQTFVRUF3d1ZRWFJ2Y3lCVQorY25WemRHVmtVbTl2ZENBeU1ERXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEVlFRR0V3SkVSVEFlRncweE1UQTNNRGN4TkRVNAorTXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTUZVRjBiM01nVkhKMWMzUmxaRkp2YjNRZ01qQXhNVEVOTUFzRworQTFVRUNnd0VRWFJ2Y3pFTE1Ba0dBMVVFQmhNQ1JFVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDVgoraFR1WGJ5bzdManZQcHZNcE5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cgorNTRyTVZENlFVTStBMUpYNzZMV0MxQlRGdHFsVkpWZmJzVkQyc0dCa1dYcHB6d08zYncyK3lqNXZkSExxcWpBcWMySytTWkZoeUJIKworRGdNcTkyb2czQUlWRFY0VmF2empnc0cxeFoxa0NXeWpXWmdISjhjYmxpdGhkSEZzUS9IM05Za1E0SjdzVmFFM0lxS0hCQVVzUjMyMAorSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MExjcDJBTUJZSGxUOG9EdjNGZFU5VDFuU2F0Q1F1amdLUgorejNiRm14NVZkSng0SWJId0xmRUxuOExWbGhnZjhGUWllb3dIQWdNQkFBR2pmVEI3TUIwR0ExVWREZ1FXQkJTbnBRYXhMS1lKWU83UgorbCtsd3JydzdHV3piSVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZLZWxCckVzcGdsZzd0R1g2WEN1dkRzWgorYk5zaE1CZ0dBMVVkSUFRUk1BOHdEUVlMS3dZQkJBR3dMUU1FQVFFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQgorQ3dVQUE0SUJBUUFtZHpUYmxFaUdLa0dkTEQ0R2tHREVqS3dMVkxnZnVYdlRCem5rK2o1N3NqMU83WjhqdlpmemExenY3djFBcHQraAorazZFS2hxenZJTkI1QWIxNDl4bllKREUwQkFHbXVoV2F3eWZjMkU4UHpCaGovNWtQRHBGcmRSYmhJZnpZSnNkSHQ2YlBXSEp4ZnJyaAorVFpWSE84bXZiYUcwd2V5SjlyUVBPTFhpWk53bHo2YmI2NXBjbWFIRkNONzk1dHJWMWxwRkRNUzN3clVVNzdRUi93NFZ0ZlgxMjhhOQorNjFxbjhGWWlxVHhsVk1ZVnFMMkduczJEbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRworM21CL3VmTlBSSkx2S3JjWVBxY1oyUXQ5c1RkQlFyQzZZQjN5L2drUnNQQ0hlNmVkCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK1F1b1ZhZGlzIFJvb3QgQ0EgMSBHMworPT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZZRENDQTBpZ0F3SUJBZ0lVZUZoZkxxMHNHVXZqTndjMU5CTW90WmJVWlpNd0RRWUpLb1pJaHZjTkFRRUxCUUF3U0RFTE1Ba0cKK0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWNCZ05WQkFNVEZWRjFiMVpoWkdseklGSnYKK2IzUWdRMEVnTVNCSE16QWVGdzB4TWpBeE1USXhOekkzTkRSYUZ3MDBNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk4KK01Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklERWcKK1J6TXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDZ3ZsQVFqdW55YkVDMEJKeUZ1VEhLM0Mza0Vha0UKK1BCdFZ3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlck5yd1U4bG0KK1BOU3NBZ0hhSk5NN3FBSkdyNlFjNC9oeldIYTM5ZzZRRGJYd3o4ejYrY1pNNWNPR01BcU5GMzQxNjhYZnV3NmN3STJINDRnNGhXZjYKK1BzZXI0Qk9jQlJpWXo1UDFzWkswL0NQVHo5WEVKMG5nbmp5YkNLT0xYU29oNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU4KK29malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwVWh0U3RaSTVjZ01KWXIyd1lCWnVwdDBsd2dObTNmTUUwVURpVG91RzlHL2wKK2c2QW5oRjRFd2ZXUXZUQTl4TytvYWJ3NG02U2tsdEZpMm1uQUFaYXV5OFJSTk9vTXF2OGhqbG1QU2x6a1lacW4wdWtxZUkxUlBUb1YKKzdxSlpqcWxjM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovR0t1YlgKKzlacXpXQjR2TUlrSUcxU2l0WmdqN0FoM0hKVmRZZEhMaVp4Zm9rcVJtdThocWtrV0NLaTlZU2d4eVhTdGhmYlp4YkdMMGVVUU1rMWYKK2l5QTZQRWtmTTRWWkRkdkxDWFZEYVhQN2EzRjk4Ti9FVEgzR295N0lsWG5MYzZLT1RrMGsrMTdrQkw1eUc2WW5MVWxhbVhyWFhBa2cKK3QzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdHpDanZwVWZ6VXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKK0FRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVvNWZXODE2aUVPR3JSWjg4RjJRODdnRnduTXd3RFFZSktvWkkKK2h2Y05BUUVMQlFBRGdnSUJBQmo2VzNYOFBuckhYM2ZIeXQvUFg4TVN4RUJkMURLcXVHclgxUlVWUnBnanBlYVFXeGlaVE9PdFFxT0MKK01UYUl6ZW43eEFTV1NJc0J4NDBCejFzekJwWkdablFkVCszQnRybTBEV0hNWTM3WExuZU1saHdxSTJocmhWZDJjRE1UL3VGUHBpTjMKK0dQb2FqT2k5WmNuUFAvVEpGOXpyeDd6QUJDNHRSaTlwWnNNYmovN3NQdFBLbEw5MkNpVU5xWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3QKK1RyMU54TmdweGlJWTBNV3NjZ0tDUDZvNm9qb2lsekhkQ0dQRGRSUzVZQ2d0VzJqZ0ZxbG1naU5SOWV0VDJER2JlK20zblV2cmlCYlAKKytWMDRpa2t3aiszeDZ4bjBkeG94R0UxblZHd3ZiMlg1Mnozc0lleGU5UFNMeW1CbFZORnhaUFQ1cHFPQk16WXpjZkNrZUY5T3JZTWgKKzNqUkpqZWhackozeWRsbzI4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmEKK3d4L2tOU0JUOGxUUjMyR0RwZ0xpSlRqZWhUSXRYbk9RVWwxQ3hNNDlTK0g1R1lRZDFhSlF6RUg3UVJURHZkYkpXcU5qWmdLQXZRVTYKK08wZWM3QUFtVFBXSVViK29JMzhZQjdBTDdZc21vV1RUWVVyclhKL2VzNjluQTdNZjNXMWRhV2hwcTE0NjdIeHB2TWM3aFU2ZUZibTAKK0ZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0bmg4R0tqd1N0SXNQbTZJazhLYU4xbnJnUzdaa2xtT1YKK2hNSkt6Und1SkljellPWEQKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworUXVvVmFkaXMgUm9vdCBDQSAyIEczCis9PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRllEQ0NBMGlnQXdJQkFnSVVSRmMwSkZ1QmlaczE4czY0S3p0YnB5YndkU2d3RFFZSktvWklodmNOQVFFTEJRQXdTREVMTUFrRworQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBY0JnTlZCQU1URlZGMWIxWmhaR2x6SUZKdgorYjNRZ1EwRWdNaUJITXpBZUZ3MHhNakF4TVRJeE9EVTVNekphRncwME1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTgorTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURJZworUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNocmlXeUFSamNWNGcvUnV2NXIrTHJJM0hpbXRGaAorWmlGZnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVduNHJqeWR1WQorTk03WU14Y29SdnlueWZEU3ROVk5DWEpKK2ZLSDQ2bmFmYUY5YTdJNkphbHRVa1NzK0w1dSs5eW1jNUdRWWFZREZDRHk1NGVqaUsydAorb0l6L3Bnc2xVaVhuRmdIVnk3ZzFnUXlqTy9EaDRmeGFYYzZBY1czNFNhcytPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3ArbworTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTFvOS9OZ0o4TVNQc2M5UEcvU3JqNjFZeHhTc2NmcmY1Qm1yT0RYZktFVnUrbAorVjBQT0thMk1xMVcveFB0YkFkMGpJYUZZQUk3RDBHb1Q3UlBqRWl1QTNHZm1sYkxOSGlKdUt2aEIxUExLRkFlTmlsVVN4bW4xdUlabworTDFOZXNOS3FJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6OGVRUQorc1NXdTFaSzdFOEVNNERuYXREbFh0YXMxcW5JaE80TTE1ekhmZWlGdXVESUlmUjB5a1JWS1luTFA0M2Vodk5VUkczWUJad2pnUVF2RAorNnhWdStLUVoyYUtycitJblVsWXJBb29zRkNUNXYwSUN2eWJJeG8vZ2JqaDlVeTNsN1ppemxXTm9mL2sxOU4rSXhXQTFrc0I4YVJ4aAorbFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHY0M0QnJUd1Yxd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRAorQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTdlZHZkbHEvWU94Slc4YWxkN3R5Rm5HYnhEMHdEUVlKS29aSQoraHZjTkFRRUxCUUFEZ2dJQkFKSGZnRDlEQ1g1eHd2ZnJzNGlQNFZHeXZEMTErU2hkeUx5Wm0zdGRxdVhLNFFyMzZMTFRuOTFuTVg2NgorQWFySGFrRTdrTlFJWExKZ2FwRHd5TTREWXZtTDdmdHVLdHdHVFR3cEQ0a1dpbGhNU0Evb2hHSHFQSEttZCtSQ3JvaWpRMWg1ZnE3SworcFZNTnFUMXd2U0FaWWFSc09QeERNdUhCUi8vNDdQRVJJaktXbk1MMlcybVdleUFNUTBHYVcvWlpHWWplVllnM1VRdDRYQW9lbzBMOQoreDUySUQ4RHllQUlrVkpPdmlZZUl5VXFBSGVyUWJqNWhMamE3TlE0bmx2MW1ORHRoY25QeEZseEhCbFJKQUhwWUVyQUs3NFg5c2JnegorZFdxVEhCTG1ZRjV2SFgvSkh5UExoR0dmSG9KRStWK3RZbFVrbWxLWTdWSG5vWDZYT3VZdkh4SGFVNEFzaFo2ck5SRGJJbDlxeFY2WAorVS9JeUFna3dvMWp3RFFIVmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOdworbU50ZGRiSU5XUWVGRlNNNTF2SGZxU1lQMWtqSHM2WWk5VE0zV3BWSG4zdTZHQlZ2LzlZVVpJTkowZ3BuSWRzUE5XTmdLQ0xqc1pXRAorellXbTNTOFA1MmRTYnJzdmhYejFTblBueFQ3QXZTRVNCVC84dHdOSkFsdklKZWJpVkRqMWVZZU1IVk95VG9WN0JqakhMUGo0c0hLTgorSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTRXU3IyUnowWmlDM29oZUdlN0lVSWFyRnNOTWtkN0VncgorTzNqdFpzU09lV21EM24rTQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitRdW9WYWRpcyBSb290IENBIDMgRzMKKz09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGWURDQ0EwaWdBd0lCQWdJVUx2V2JBaWluMjNyLzFhT3A3cjBEb004U2FoMHdEUVlKS29aSWh2Y05BUUVMQlFBd1NERUxNQWtHCitBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2CitiM1FnUTBFZ015QkhNekFlRncweE1qQXhNVEl5TURJMk16SmFGdzAwTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOCitNUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRE1nCitSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3p5dzRRWjQ3cUZKZW5NaW9LVmpaL2FFekhzMjg2CitJeFNSL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdUZvTTdwbVJMCitNb243RmhZNGZ1dEQ0dE4wU3NKaUNuTUszVW16VjlLd0NvV2RjVHplbzh2QU12TUJPU0JER3pYUlU3T3g3c1dUYVlJK0ZyVW9ScUhlCis2b2tKN1VPNEJVYUtodlZaUjc0YmJ3RWhFTG45cWRJb3loQTVDY29UTnMrY3JhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzCitJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUkZIQUdqeCtmK0lkcHNRN3Z3NGtaNitvY1lmeDZiSXJjMWdNTG5pYTZFdDNVCitWRG1ySnFNejZuV0IyaTNORDAva0E5SHZGWmNiYTVERkFwQ1RaZ0loc1VmZWk1cEtnTGxWajdXaUw4RFdNMmZhZnNTbnRBUkU2MGY3Cis1bGk1OXd6d2V5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWxzU3FpCitNZDVtQlBmQWRPaHgzdjg5V2N5V0poS0xoWlZYR3F0cmRRdEVQUkVvUEh0aHQrS1BaMC9sN0R4TVlJQnBWemdlQVZ1TlZlakgzOERNCitkeU0wU1hWODlwZ1I2eTNlN1VFdUZBVUNmK0QrSU9zMTV4R3NJczVYUGQ3Sk1HMFFBNFhOOGYrTUZyWEJzajZJYkdCL2tFK1Y5L1l0CityUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCt5ZE9jMTdLWHFRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECitBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVeGhmUXZLanFBa1B5R3dhWlhTdVFJTG5Ybk9Rd0RRWUpLb1pJCitodmNOQVFFTEJRQURnZ0lCQURSaDJWYTFFb2RWVGQyak5URkd1NlFIY3J4ZllXTG9wZnNMTjdFOHRyUDZLWjEvQXZXa3lhaVR0M3B4CitLR21QYytGU2tOclZ2anJsdDNacVZvQWgzMTNtNlRxZTVUNzJvbW5IS2dxd0dFZmNJSEI5VXFNK1dYekJ1c25JRlVCaHluTFdjS3pTCit0L0FjNUlZcDhNN3ZhR1BRdFNDS0ZXR2Fmb2FZdE1uQ2R2dk11akFXektOaHhuUVQ1V3Z2b3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRCitUWGxtNjZyOTlJMHhIbkFVcmR6ZVp4Tk1nUlZodkxmWmtYZHhHWUZndS9CWXBiV2NDL2VQSWxVbndFc0JiVHVaRGRRZG0yTm5MOUR1CitEY3BtdkpSUHBxM3QvTzVqckZjL1pTWFBzb2FQMEFqL3VIWVVidDdsSit5cmVMVlR1YlkvNkNENTBxaStZVWJLaDR5RTgvbnhvR2liCitJaDZCSnBzUUJKRnh3QVlmM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1ECitoUGJsOE1GUkVzQUxIZ1FqREZTbFRDOUp4VXJSdG01Z0RXdjhhNHVGSkdTM2lRNnJKVWRiUE05K1NiM0g2UXJHMnZkK0RoY0kwMGlYCiswSEdTOEE4NVBqUnFISDNZOGlLdXUybjBNN1NtU0ZYUkR3NG02T3kyQ3kybmhUWE4vVm5JbjlITlBsb3BOTGs5aE02eFpkUlprWkZXCitkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0L3l3YVpXV0RZV0dXVmpVVFI5MzkrSjM5OXJvRDFCMHkyCitQcHh4VkprRVMvMVkrWmowCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURsakNDQW42Z0F3SUJBZ0lRQzVNY090WTVaK3BuSTcvRHI1cjBTekFOQmdrcWhraUc5dzBCQVFzRkFEQmxNUXN3Q1FZRFZRUUcKK0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXcKK0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3cKK01URTFNVEl3TURBd1dqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUwKK0V4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXcKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURaNXlndlVqODJja21Ja3pUeitHb2VNVlNBbjYxVVFiVkgKKzM1YW8xSytBTGJrS3ozWDlpYVY5SlByaklnd3J2SlVYQ3pPL0dVMUJCcEFBdlF4TkVQNEh0ZWNjYmlKVk1XV1h2ZE1YMGg1aTg5dnEKK2JGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwRWdqQUFMQWNLeEhhZDNBMm02N09lWWZjZ25EbUNYUncKK1ZXbXZvMmlmdjkyMmViUHluWEFwVmZTci81Vmg4OGxBYngzUnZwTzcwNGdxdTUyL2NscFdjVHMvMVBQUkN2NG83NlB1MlptdkE5T1AKK1lMZnlrcUd4dlltSkh6RE53Nll1WWpPdUZnSjNSRnJuZ1FvOHAwUXVlYmcvQkx4Y29JZmhHNjlSanMzc0xQcjQvbTN3T255cWkrUm4KK2xUR05BZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCVE8KK3cwcTVtVlh5dU50Z3Y2bCt2VmExbHphbjFqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5cVZWak9QSVFXNXBKNmQxRWU4OGhqWnYKKzBwM0dlRGdkYVphaWtta3VPR3liZlFUVWlhV3hNVGVLeVNITXEyek5peHlhMXI5STBqSm13WXJBOHk4Njc4RGoxSkdHMFZEakE5dHoKK2QyOUtPVlB0M2liSHRYMnZLMExSZFdMalNpc0N4MUJMNEduaWxtd09SR1lRUkkrdEJldjRlYXltRytnM05KMVR5V0dxb2xLdlNuQVcKK2hzSTZ5TEVUY0RiWXorNzBDalRWVzB6OUI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME0KK2pvbVptV3p3UERDdk9OOXZ2S08rS1NBbnEzVC9FeUo0M3BkU1ZSNkR0VlFnQSs2dXdFOVczamZNdzMrcUJDZTcwM2U0WXRzWGZKd28KK0loTnpiTThtOVlvcDV3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1JqQ0NBYzJnQXdJQkFnSVFDNkZhK2gzZm9MVkpSSy9OSktCczdEQUtCZ2dxaGtqT1BRUURBekJsTVFzd0NRWURWUVFHRXdKVgorVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRAorVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMQorTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMworZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13ZGpBUQorQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRWjU3eXNSR1h0emJnL1dQdU5zVmVwUkMwRkZmTHZDLzhRZEorMVlsSmZabjRmNWR3YgorUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1FSU0FQV1hZUTFxQWs4QzNlTnZKcworS1RtalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCVEwwTDJwNFpnRgorVWFGTk42S0RlYzZOSFNya2hEQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQWxwSUZGQW1zU1MzVjBUOGdqNDNEeWRYTGVmSW53ejVGeQorWVo1ZUVKSlpWcm1EeHhEbk9PbFlKalo5MWVRMGhqa0NNSHcyVS9BdzVXSmpPcG5pdHFNN216VDZIdG9Ra25GZWtST24zYVJ1a3N3eQorMXZVaFpzY3Y2cFpqYW1WRmtwVUJ0QT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoTVFzd0NRWURWUVFHCitFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3CitIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4CitNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzCitkeTVrYVdkcFkyVnlkQzVqYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN5TUlJQklqQU5CZ2txCitoa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1STIvT3U4anFKCitrVHg2NXFzR0dtdlByQzNvWGdra1JMcGltbjdXbzZoKzRGUjFJQVdzVUxlY1l4cHNNTnphSHhteDF4N2UvZGZneTVTRE42N3NIME5PCiszWHNzMHIwdXBTL2txYml0T3RTWnBMWWw2WnRyQUdDU1lQOVBJVWtZOTJlUXEyRUduSS95dXVtMDZaSXlhN1h6VitoZEc4Mk1IYXVWCitCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXenRDTzdURzFGOFBhcHNwVXd0UDFNVll3blNsY1VmSUtkelhPUzB4WktCZ3lNCitVTkdQSGdtK0Y2SG1JY3I5ZytVUXZJT2xDc1JuS1BaekZCUTlSbmJEaHhTSklUUk5ydzlGREtaSm9icTduTVd4TTRNcGhRSURBUUFCCitvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJoakFkQmdOVkhRNEVGZ1FVVGlKVUlCaVY1dU51Cis1Zy82K3JrUzdRWVhqemt3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdCbktKUnZEa2hqNnpIZDZtY1kxWWw5UE1XTFNuL3B2dHNyCitGOSt3WDNOM0tqSVRPWUZuUW9RajhrVm5OZXlJdi9pUHNHRU1OS1N1SUV5RXh0djROZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVCitXVFc5OGtuZHRoL0pzdzFIS2oyWkw3dGN1N1hVSU9HWlgxTkdGZHRvbS9Eek1OVStNZUtOaEo3aml0cmFsajQxRTZWZjhQbHdVSEJICitRUkZYR1U3QWo2NEd4SlVURnk4YkpaOTE4ckdPbWFGdkU3RkJjZjZJS3NoUEVDQlYxL01VUmVYZ1JQVHFoNVV5a3c3K1UwYjZMSjMvCitpeUs1UzlrSlJhVGVwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCitNclk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDUHpDQ0FjV2dBd0lCQWdJUUJWVld2UEplcERVMXc2UVAxYXRGY2pBS0JnZ3Foa2pPUFFRREF6QmhNUXN3Q1FZRFZRUUdFd0pWCitVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lECitWUVFERXhkRWFXZHBRMlZ5ZENCSGJHOWlZV3dnVW05dmRDQkhNekFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3CitNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDNkeTVrCithV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3pNSFl3RUFZSEtvWkl6ajBDCitBUVlGSzRFRUFDSURZZ0FFM2FmWnU0cTRDL3NMZnlIUzhMNitjL016WFJxOE5PcmV4cHU4MEpYMjhNelFDN3BoVzFGR2ZwNHRuKzZPCitZd3dYN0FkdzljK0VMa0NEbk9nL1FXMDdyZE9rRkZrMmVKMERRKzRRRTJ4eTNxNklwNkZydFVQT1o5d2ovd01jbytJK28wSXdRREFQCitCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVXM5dElwUG1oeGRpdU5rSE1FV05wCitZaW04UzhZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeEFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5CiszbWFURC9ITXNRbVAzV3lyK210L29BSXdPV1pid21TTnVKNVEzS2pWU2FMdHg5elJTWDhYQWJqSWhvOU9qSWdycUpxcGlzWFJBTDM0CitWT0thNVZ0OHN5Y1gKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmtEQ0NBM2lnQXdJQkFnSVFCWnNiVjU2T0lUTGlPUWU5cDNkMVhEQU5CZ2txaGtpRzl3MEJBUXdGQURCaU1Rc3dDUVlEVlFRRworRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNFdworSHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMQorTVRJd01EQXdXakJpTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMworZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwRworQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMvNXBCemFONjc1RjFLUERBaU1Ha3o3TUtuSlM3SklUM3lpdGhad3VFcAorcHoxWXEzYWF6YTU3RzRRTnhEQWY4eHVrT0JiclZzYVhiUjJyc25ueXloSFM1Ri9XQlR4U0QxSWZ4cDRWcFg2K242bFhGbGxWY3E5bworazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFZ5U0FkWXlrdHp1eGVUc2lUK0NGaG16VHJCY1plN0ZzYQordk92Sno4MnNORUJmc1hwbTduZklTS2htVjFlZlZGaU9EQ3UzVDZjdzJWYnV5bnRkNDYzSlQxN2xOZWN4eTlxVFh0eU9qNERhdHBHWQorUUpCNXczakh0ckhFdFdvWU9BTVFqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNgorTVVTYU0wQy9DTmRhU2FUQzVxbWdaOTJrSjd5aFR6bTFFVmdYOXlSY1JvOWs5OEZwaUhhWWRqMVpYVUoyaDRtWGFYcEk4T0NpRWh0bQorbW5USzNrc2U1dzVqcnViVTc1S1NPcDQ5M0FEa1JTV0p0cHBFR1N0K3dKUzAwbUZ0NnpQWnhkOUxCQURNZlJ5Vnc0LzNJYkt5RWJlNworZi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZdUtaM0FlRVBsQXdoSGJKVUtTV0piT1VPVWxGSAorZEw0bXJMWkJkZDU2ckYrTlA4bTgwMEVSRWx2bEVGRHJNY1hLY2hZaUNkOThUSFUvWSt3aFg4UWdVV3R2c2F1R2kwL0Mxa1ZmblNEOAorb1I3RndJK2lzWDRLSnBuMTVHa3ZtQjB0OWRtcHNoM2xHd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZAorRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVTdOZmpndEp4WFdSTTN5NW5QK2U2bUs0Y0QwOHdEUVlKS29aSWh2Y05BUUVNQlFBRAorZ2dJQkFMdGgyWDJwYkw0WHhKRWJ3NkdpQUkzalpHZ1BWczkzcm5ENS9acEttYm5KZUZ3TURGL2s1aFFwVmdzMlNWMUVZK0N0bkpZWQorWmhzakRUMTU2VzFyMWxUNDBqekJRMEN1SFZEMVV2eVFPN3VZbVdscng4R25xR2lrSjl5ZCtTZXVNSVc1OW1kTk9qNlBXVGtpVTBUcgoreUYwRHl1MVFlbjFpSVFxQXlITm0wYUFGWUYvb3BiU25yNmozYlRXY2ZGcUsxcUk0bWZONGkvUk4waUFMM2dUdWpKdEhnWElOd0JReQorN3pCWkxxN2djZkpXNUdxWGI1SlFiWmFOYUhxYXNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaAoraXhUWFRCbXlVRUZ4UFQ5TmNDT0dERXJjZ2RMTU1wU0VEUWdKbHh4UHdPNXJJSFF3MHVBNU5CQ0ZJUlVCQ09oVk10NXhTZGtvRjFCTgorNXI1TjBYV3MwTXI3UWJoRHBhclR3d1ZFVHl3Mm0rTDY0a1c0STFOc0JtOW5WWDlHdFV3L2JpaGFlU2JTcEtoaWw5SWU0dTFLaTd3YgorL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUlyL09TbWJhejVtRVAwb1VBNTFBYQorNUJ1Vm5SbWh1Wnl4bTdFQUh1L1FEMDlDYk1rS3ZPNUQranB4cGNoTkpxVTEvWWxkdklWaUhUTFNvQ3RVN1pwWHdkdjZFTThadDR0SworRzQ4QnRpZVZVK2kyaVcxYnZHalVJK2lMVWFKVytmQ21nS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UAorODJaKworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitXb1NpZ24KKz09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGZGpDQ0ExNmdBd0lCQWdJUVhtaldFWEdVWTFCV0FHanpQc25Ga1RBTkJna3Foa2lHOXcwQkFRVUZBREJWTVFzd0NRWURWUVFHCitFd0pEVGpFYU1CZ0dBMVVFQ2hNUlYyOVRhV2R1SUVOQklFeHBiV2wwWldReEtqQW9CZ05WQkFNVElVTmxjblJwWm1sallYUnBiMjRnCitRWFYwYUc5eWFYUjVJRzltSUZkdlUybG5iakFlRncwd09UQTRNRGd3TVRBd01ERmFGdzB6T1RBNE1EZ3dNVEF3TURGYU1GVXhDekFKCitCZ05WQkFZVEFrTk9NUm93R0FZRFZRUUtFeEZYYjFOcFoyNGdRMEVnVEdsdGFYUmxaREVxTUNnR0ExVUVBeE1oUTJWeWRHbG1hV05oCitkR2x2YmlCQmRYUm9iM0pwZEhrZ2IyWWdWMjlUYVdkdU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBCit2Y3FOckxpUkZWYVhlMnRjZXNMZWE5bWhzTU1RSS9xbm9iTE1NZm8rMmFZcGJ4WTk0R3Y0dUVCZjJ6bW9BSHFMb0UxVWZjSWllUHlPCitDYmlvaGRmTWxaZExkTmllZnZBQTVBNkpya2tvUkJvUW1USVBKWWhUcEEyekR4SUlGZ3NEY1NjY2YrSGIwdjFuYU1RRlhRb09YWERYCisySmVndkZOQm1wR045SjQyWm5wK1ZzR1FYK2F4YUNBMnBJd2tMQ3hIQzFsMlpqQzF2dDd0ai9pZDA3c0JNT2J5OHc3Z0xKS0E4NFg1CitLSXEwVkM2YTdmZDIvQlZvRnV0S2JPc3VFby9Vei80TXgxd2RDMzRGTXI1ZXNBa3FRdFhKVHBDeldRMjdlbjdOMVFoYXRIL1lIR2tSCisrU2NQZXdhdlZJTVllK0hkVkhwUmFHNTMvTWEvVWtwbVJxR3laeHE3bzA5M29MNWQvL3hXQzBOeWQ1REtudm55T2ZVTnFmVHExK2V6CitFQzh3UWpjaHpEQnd5WWFZRDh4WVRZTzdmZVVhcFRlTnRxd3lsd0E2WTNFa0hwNDN4UDkwMURmQTR2NklSbUFSM1FnL1VEYXJ1SHFrCitsV0pxYnJES2FpRmFhZlB6K3gxd09aWHpwMjZtZ1ltaGlNVTdjY3FqVXU2RHUvMmdkL1RrYitkQzIyMUttWW8wU0x3WDNPU0FDQ0syCis4akhBUHdRKzY1OGdlZGE0Qm1Sa0FqSFhxYzFTKzRSRmFRa0FLdHhWaThRR1JrdkFTaDBKV3prby9hbXJ6Z0Q1TGtoTEp1WXdUS1ZZCit5clJFZ2svbmtSNHp3N0NUL3hIOGdkTEtIM0VwM1haUGtpV3ZIWUczRHkrTXd3Yk1MeWVqU3VRT21icDhIa1VmZjZvWlJaYjkvRDBDCitBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZPRm16dzdSCis4Yk5MdHdZZ0ZQNkhFdFgyL3ZzK01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQ0FRQ295M0pBc25iQmZudjhyV1RqTW52TVBMWmRSdFAxCitMT0p3WGNndTJBWjltTkVMSWFDSldTUUJuZm12Q1gwS0k0STAxZng4Y3BtNW85ZFU5T3BTY0E3RjlkWTc0VG9KTXVZaE9aTzlzeFhxCitUMnIwOVlzL0wzeU5XQzdGNFRtZ1BzYzlTbk9lUUhyQUsyR3BaOG56SkxtemJWVXNXaDJlSlhMT0M2MnF4MVZpQzc3N1k3TmhSQ09qCit5K0VhRHZlYUJrM2UxQ05PSVpaYk9WdFhIUzlkQ0Y0SmVmOThsN1ZOZzY0TjF1YWplZUF6MEptV0FqQ25Qdi9TbzBNL0JWb0c2a1FDCisybno0U05BenFma0h4NVhoOVQ3MVhYRzY4cFdwZEloaFdlTy95bG9UdW5LMGpGMDJoK21teFR3VHY5N1FSQ2J1dCt3dWNQclhuYmVzCis1Y1ZBV3ViWGJIc3N3MWFiUjgwTHp2b2J0Q0hYdDJhNDlDVXdpMXdOdWVwbnN2UnRydFdobmsvWW4ra25BckFkQnRhUDQvdElFcDkvCitFYUVRUGt4Uk9wYXcwUlB4eDlnbXJqcktrY1JwbmQ4QktXUlJiMmphRk93SVFaZVFqZEN5Z1BMUHdqMi9rV2pGZ0djZXhHQVRWZFZoCittVmQ4dXBVUFlVazZ5blc4eVFxVFAyY09FdklvNGpFYndGY1czd2g4R2NGK0R4K0ZIZ28yZkZ0K0o3eDZ2K0RiOU5wU3ZkNE1WSEF4CitrVU9WeUx6d1B0MEpmakJrVU8xL0FhUXpaMDFvVDc0Vjc3RDJBaEdpR3hNbE90ekNXZkhqWEVhN1p5d0NSdW9lU0tibVc5bTF2RkdpCitrcGJicXNZM0lxYit6Q0Iwb3kycExtdkx3SUlSSWJXVGVlNUVocjdYSHVRZSt3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworV29TaWduIENoaW5hCis9PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRldEQ0NBMENnQXdJQkFnSVFVSEJyemRnVC9CdE9Pek55MGhGSWpUQU5CZ2txaGtpRzl3MEJBUXNGQURCR01Rc3dDUVlEVlFRRworRXdKRFRqRWFNQmdHQTFVRUNoTVJWMjlUYVdkdUlFTkJJRXhwYldsMFpXUXhHekFaQmdOVkJBTU1Fa05CSU9heWcrbUFtdWFndWVpdgorZ2VTNXBqQWVGdzB3T1RBNE1EZ3dNVEF3TURGYUZ3MHpPVEE0TURnd01UQXdNREZhTUVZeEN6QUpCZ05WQkFZVEFrTk9NUm93R0FZRAorVlFRS0V4RlhiMU5wWjI0Z1EwRWdUR2x0YVhSbFpERWJNQmtHQTFVRUF3d1NRMEVnNXJLRDZZQ2E1cUM1NksrQjVMbW1NSUlDSWpBTgorQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBMEVraEhpWDhoOEVxd3F6YmRvWUdUdWZRZERUYzdXVTEvRkRXaUQraworOEgvckQxOTVMNG14L2J4aldEZVRtemo0dDF1cCt0aHh4N1M4Z0plTmJFdnhVTlVxS2Fxb0dYcVc1cFdPZE8yWENsZDE5QVhiYlFzNQordVFGL3F2YlcybXptQmVDa1RWTDgyOUIwdHhHTWU0MVAvNGVEcnY4RkF4TlhVRGYrakpaU0VFeGZ2NVJ4YWRtV1BneERUNzR3d0o4NQorZEU4R1JWMmoxbFk1YUFmTWgwOVFkNU54MlVRSXNZbzA2WW1zMjV0TzRkbmtVa1dNTGhRZmtXc1pIV2dwTEZiRTRoNFRWMlR3WWVPNQorRWQrdzRWZWdHNjNYWDlHdjJ5c3RQOUJvamcvcW53K0xOVmdiRXh6MDNqV2hDbDNXNnQ4U2I4RDdhUWRHY3R5QjlnUWpGK0JOZGVGeQorYjdBbzY1dmg0WU9objBwZHI4eWIrZ0lndGhoaWQ1RTdvOVZscmR4OGtIY2NSRUdrU292cmxYTHA5Z2xrM0tndG4zUjQ2TUdpQ1dPYworNzZEYlQ1MlZxeUJQdDdEM2gxeW1vT1EzT01kYzR6VVBMSzJqZ0tMc0xsM0F6KzJMQmNMbWMyNzJpZFgxMGthTzZtMWpHeDZLeVgybQorK0p6cjVkVmpoVTF6Wm1rUi9zZ085TUhIWmtsVGZ1UVphL0hwZWxtamJYN0ZGK1lueHU4YjIyLzhEVTBHQWJRT1hEQkdWV0N2T0dVNgoreWtlNnJDek1SaCt5UnBZLzgrMG1CZTUzb1dwcmZpMXRXRnhLMUk1bnVQSGExVWFLSi9rUjhzbEMvazdlM3g5Y3hLU0doeFl6b2FjWAorR0tVTjVBWGxLOElyQzZLVmtMbjlZRHhPaVQ3bm5PNGZ1d0VDQXdFQUFhTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZAorRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZPQk52OXliUVYwVDZHVHdwK2tWcE9HQndib3hNQTBHQ1NxR1NJYjNEUUVCQ3dVQQorQTRJQ0FRQnFpbkE0V2JiYWl4akl2aXJUdGhuVlppbDZYYzFiTDNNY0prNmpmVytydHlsTnB1bWxFWU9uT1hPdkVFU1M1aVZkVDJINgoreUFhK1RrdnYvdk14L3NaOGNBcEJXTnJvbVV1V3lYaThtSHdDS2UwSmdPWUtPb0lDS3VMSkw4aFdHU2J1ZUJ3ai9mZVRaVTduODVpWQorcjgzZDJaNUFpREVvT3FzdUM3Q3NEQ1Q2ZWlhWTh4SmhFUFJkRi9kKzRuaVhWT0tNNkNtNmpCQXl2ZDB6YXppR2ZqazlEZ055cDExNQorajBXS1dhNWJJVzR4UnRWWmpjOFZYOTB4SmMvYllOYUJSSElwQWxmMmx0VFcvK29wMnpuRnVDeUtHbzNPeStkQ01ZWUZhQTZlRk4wQQora0xwcFJRamJicENCaHFjcUJUL21oRG40dC9sWFgweWtlVm9RREY3VmEvODFYd1ZSSG15amRhblBVSVBUZlBSbTk0S05QUXg5Nk45NworcUE0YkxKeXVRSENIMnUybkZvSmF2alZzSUU0aVlkbThVWHJOZW1IY1N4SDUvbWMwenk0RVptRmNWNWNqalBPR0cwamZLcStud2YvWQoramo0RHU5Z3FzUG9VSmJKUmE0WkRoUzRISXhhQWpVejd0R003ek1OMDdSdWpIdjQxRDE5OEhSYUc5UTdEbGZFdnIxMGxPMUhtMTNaQgorT05GTEF6a29wUjZSY3RSOXE1Y3p4Tk0rNEdtMktIbWdDWTBjMGY5QmNrZ0cvSm91NXlENW02TGVpZTJ1UEFtdnlsZXprb2x3UU9RdgorVDhKd2cwRFhKQ3hyNXdrZjA5WEh3UWowMnc0N0hBY0xReEdFSVlicGdOUjEyS3Z4QW1MQnNYNVZZYzhUMXlhdzE1ekxLWXM0U2dzTwora0kyNm9RPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGMkRDQ0E4Q2dBd0lCQWdJUVRLcjV5dHRqYitBZjkwN1lXd09HblRBTkJna3Foa2lHOXcwQkFRd0ZBRENCaFRFTE1Ba0dBMVVFCitCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHCitBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2CitiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNVEU1TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DCitSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCitDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHZiaUJCCitkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDUjZGU1MwZ3BXc2F3TkpOM0Z6MFJuCitkSmtyTjZOOUkzQUFjYnhUMzhUNktoS1BTMzhRVnIyZmNISzNZWC9KU3c4WHB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaCitGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQzlCUisrYjdFcGk5UGY1bC90ZnhuUTNLOURBRFdpZXRyTE5QdGo1Z2NGS3QrCis1ZU51L05pbzVKSWsya05yWXJoVi9lckJ2R3kyaS9NT2pacmttMnhwbWZoNFNEQkYxYTNoRFR4RllQd3lsbEVudkdmRHlpNjJhK3BHCit4OGNnb0xFZlpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNlorcFVYCisybnd6VjBFOGpWSHRDN1pjcnl4akd0OVh5RCs4NlYzRW02OUZtZUtqV2lTMHVxbFdQYzl2cXY5SldMN3dxUC8wdUszcE4vdTZ1UFFMCitPdm5vUTBJZWlkaUV5eFB4MmJ2aGlXQzRqQ2hXckJRZG5Bcm5jZXZQRHQwOXFaYWhTTDA4OTYrMURTSk13QkdCN0ZZNzl0T2k0bHUzCitzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUN1OWZmVUdwVlJyK2dveWhoZjNEUXc2S3FMQ0dxUjg0b25BWkZkcitDCitHQ2UwMWE2MHkxRG1hL1JNaG5FdzZhYmZGb2JnMlA5QTNmdlFRb2gvb3pNNkxsd2VRUkdCWTg0WWNXc3I3S2FLdHpGY09tcEg0TU41CitXZFlnR3EveWFwaXFjcnhYU3RKTG5ic1EvTEJNUWVYdEhUMWVLSjJjekwrelVkcW5SK1dFVXdJREFRQUJvMEl3UURBZEJnTlZIUTRFCitGZ1FVdTY5K0FqMzZwdkU4aEk2dDdqaVk3Tmt5TXRRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3CitEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQXJ4MVVhRXQ2NVJ1Mnl5VFVFVUFKTk1uTXZsd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10CityRmFpc05aK0VaTHBMcnFlTHBweXNiMFpSR3hoTmFLYXRCWVNhVnFNNGRjK3BCcm9Md1Awcm1FZEVCc3FwSXQ2eGY0RnB1SEExc2orCitucTZQSzdvOW1malljd2xZUm02bW5QVFhKOU9WMmplRGNoelRjK0NpUjVrRE9GM1ZTWGtBS1J6SDdKc2dIQWNrYVZkNHNqbjhPb1NnCit0Wng4amI4dWsySW50em5hRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXCitzUnFaQ3VoVExKSzdvUWtZZFF4bHFIdkxJN2Nhd2lpRnd4di8wQ3RpNzZSN0NaR1laNHdVQWMxb0JtcGpJWFVEZ0lpS2JvSEdoZktwCitwQzNuOUtVa0VFZUR5czMwalhsWXNRYWI1eG9xMlowQjE1Ujk3UU5LeXZEYjZLa0JQdlZXbWNrZWprazl1K1VKdWVCUFNaSTlGb0pBCit6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TFMwWmovZ0EwUUhEQnc3bWgzYVp3NGdTelFienBnSkhxCitaSng2NFNJRHFaeHVidzVsVDJ5SGgxN3picUQ1ZGFXYlFPaFRzaWVkU3JuQWR5R04vNGZ5M3J5TTd4ZmZ0MGtMMGZKdU1Bc2FEazUyCis3Ukg4OWVsV3NuMi94MjBLazR5bDBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJCitMYVpSZnlIQk5WT0ZCa3BkbjYyN0cxOTAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCaURFTE1Ba0dBMVVFCitCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLCitFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oCitkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TWpBeE1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFCitCaE1DVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLCitFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oCitkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNBRW1VWE5nN0Qyd2l6CiswS3hYRFhidHpTZlRUSzFRZzJIaXFpQk5DUzFrQ2R6T2laL01QYW5zOXMvQjNQSFRzZFo3TnlnUkswZmFPY2E4T2htMFg2YTlmWjJqCitZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWXRKSFVZbVRiZjZNRzhZZ1lhcEFpUEx6K0UvQ0hGSHYyNUIrTzFPUlJ4aEZuCitSZ2hSeTRZVVZEKzhNLzUrYkp6L0ZwMFl2VkdPTmFhblpzaHlaOXNoWnJIVW0zZ0R3RkE2Nk16dzNMeWVUUDZ2QlpZMUgxZGF0Ly9PCisrVDIzTExiMlZOM0k1eEk2VGE1TWlyZGNtclMzSUQzS2Z5STBybjQ3YUdZQlJPY0JUa1pUbXpOZzk1UytVemVRYzBQek1zTlQ3OXVxCisvblJPYWNkcmpHQ1Qzc1RIRE4vaE1xN01renRSZUpWbmkrNDlWdjRNMEdrUEd3L3pKU1pyTTIzM2JrZjZjMFBsZmc2bFpyRXBmREtFCitZMVdKeEEzQmsxUXdHUk9zMDMwM3ArdGRPbXcxWE50QjF4TGFxVWtMMzlpQWlnbVRZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNCitsWHp6YXdXcFhoYUR6TGhuNHVnVG5jeGJndE5NcysxYi85N2xjNndqT3kwQXZ6VlZkQWxKMkVsWUduK1NOdVpSa2c3ekpuMGNUUmU4Cit5ZXhESnRDL1FWOUFxVVJFOUpublY0ZWVVQjlYVktnKy9YUmpMN0ZRWlFubVdFSXVReHBNdFBBbFIxbjZCQjZUMUNaR1NsQ0JzdDYrCitlTGY4WnhYaHlWZUVIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCitCZ05WSFE0RUZnUVVVM20vV3FvclNzOVVnT0hZbThDZDhySURac3N3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGCitNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFGelVmQTNQOXdGOVFabGxESFBGVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXCitGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPVldLUjgya1YyTHlJNDhTcUMvM3ZxT2xMVlNvR0lHMVZlQ2taCis3bDh3WEVza0VWWC9KSnB1WGlvcjdndE5uMy8zQVRpVUZKVkRCd243WUtudUhLc1NqS0NhWHFlWWFsbHRpejhJKzhqUlJhOFlGV1NRCitFZzl6S0M3RjRpUk8vRmpzOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNCis4V2NSaVF5Y0UweHlOTis4MVhIZnFuSGQ0YmxzakR3U1hXWGF2VmNTdGtOci8rWGVUV1lSVWMrWnJ1d1h0dWh4a1l6ZVNmN2ROWEdpCitGU2VVSE05aDR5YTdiNk5uSlNGZDV0MGRDeTVvR3p1Q3IreURaNFhVbUZGMHNibVpnSW4vZjNnWlhIbEtZQzZTUUs1TU55b3N5Y2RpCit5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05L3FTM2Z1UUwzOVplYXRUWGF3MmV3aDBxcEtKNGpqdjljCitKMnZoc0UvekIrNEFMdFJaaDh0U1FaWHE5RWZYN21SQlZYeU5XUUtWM1dLZHdybnVXaWgwaEtXYnQ1REhEQWZmOVlrMmRETFdLTUd3CitzQXZnbkV6REhOYjg0Mm0xUjBhQkw2S0NxOU5qUkhERWpmOHRNN3F0ajN1MWNJaXVQaG5QUUNqWS9NaVF1MTJaSXZWUzVsakZINGd4CitRKzZJSGRmR2pqeERhaDJuR041OVBSYnhZdm5La0tqOQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNqekNDQWhXZ0F3SUJBZ0lRWEl1WnhWcVV4ZEp4VnQ3TmlZRE1KakFLQmdncWhrak9QUVFEQXpDQmlERUxNQWtHQTFVRUJoTUMKK1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKK2FHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKK2JpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUMKK1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRS0V4VlUKK2FHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKK2JpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvSStkNjFTUnZVOFphMkV1cnh0VzIKKzBlWnpjYTdkbk5ZTVlmM2JvSWtEdUFVVTdGZk83bDAvNGlHenp2ZlVpbm5nbzROK0xaZlFZY1R4bWR3bGtXT3JmekNqdEhEaXg2RXoKK25QTy9MbHhUc1YremZUSi9palRqZVhtalFqQkFNQjBHQTFVZERnUVdCQlE2NFFtRzFNOFp3cFoyZEVsMjNPQTF4bU5qbWpBT0JnTlYKK0hROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQTJaNkVXQ056a2x3QkIKK0hVNis0V01Cenp1cVFoRmtvSjJVT1FJUmVWeDdIZnBrdWU0V1FyTy9pc0lKeE96a3NVMENNUURwS21GSGpGSktTMDRZY1BiV1JOWnUKKzlZTzZiVmk5Sk5sV1NPcnZ4S0pHZ1locU9rYlJxWnROeVdIYTBWMVhhaGc9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0dsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUI0VENDQVllZ0F3SUJBZ0lSS2ppa0hKWUtCTjVDc2lpbEMrZzBtQUl3Q2dZSUtvWkl6ajBFQXdJd1VERWtNQ0lHQTFVRUN4TWIKK1IyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUUQKK0V3cEhiRzlpWVd4VGFXZHVNQjRYRFRFeU1URXhNekF3TURBd01Gb1hEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWIKK1IyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJME1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUUQKK0V3cEhiRzlpWVd4VGFXZHVNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV1TVo1MDQ5c0pRNmZMamtaSEFPa3JwcmwKK09RY0pGc3Bqc2JtRytJcFh3VmZPUXZwem9mZGxRdjhld1FDeWJuTU8vOGNoNVJpa3F0bHhQNmpVdWM2TUhhTkNNRUF3RGdZRFZSMFAKK0FRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZGU3dlNjFGdU9KQWYvc0tidnUrTThrOG80VFYKK01Bb0dDQ3FHU000OUJBTUNBMGdBTUVVQ0lRRGNrcUdnRTZiUEE3RG14Q0dYa1BvVVZ5MEQ3TzQ4MDI3S3FHeDJ2S0xldXdJZ0o2aUYKK0p6V2JWc2FqOGtmU3QyNGJBZ0FYcW1lbUZaSGUrcFRzZXd2NG40UT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0hqQ0NBYVNnQXdJQkFnSVJZRmxKNENZdXUxWDVDbmVLY2ZsSzJHd3dDZ1lJS29aSXpqMEVBd013VURFa01DSUdBMVVFQ3hNYgorUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRRAorRXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWERUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYgorUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRRAorRXdwSGJHOWlZV3hUYVdkdU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFUjBVT2x2dDlYYi9wT2RFaCtKOEx0dFY3SHBJNgorU0ZrYzhHSXhMY0I2S1A0YXAxeXp0c3lYNTBYVVdQclJkMjFEb3NDSFpUUUtIM3JkNnp3em9jV2RUYVJ2UVpVNGY4a2VoT3ZSbmttUworaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZAorQmdOVkhRNEVGZ1FVUGVZcFNKdnFCOG9oUkVvbTNtN2Uwb1BRbjFrd0NnWUlLb1pJemowRUF3TURhQUF3WlFJeEFPVnBFc2x1MjhZeAordWdsQjRaZjQrLzJhNG4wU3llMThaTlBMQlNXTFZ0bWc1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJNworeUZ6OVNPOE5kQ0tvQ09KdXhVbk94d3k4cDJGcDhmYzc0U3JMK1N2elpwQTMKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGZERDQ0ExeWdBd0lCQWdJRUFKaWlPVEFOQmdrcWhraUc5dzBCQVFzRkFEQmFNUXN3Q1FZRFZRUUdFd0pPVERFZU1Cd0dBMVVFCitDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoZENCa1pYSWdUbVZrWlhKc1lXNWtaVzRnCitVbTl2ZENCRFFTQXRJRWN6TUI0WERURXpNVEV4TkRFeE1qZzBNbG9YRFRJNE1URXhNekl6TURBd01Gb3dXakVMTUFrR0ExVUVCaE1DCitUa3d4SGpBY0JnTlZCQW9NRlZOMFlXRjBJR1JsY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsCitaR1Z5YkdGdVpHVnVJRkp2YjNRZ1EwRWdMU0JITXpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTDR5CitvbFFQY1Bzc1hGbnJiTVNrVWVpRktyUE1TalR5c0YvekRzY2NQVk1laUFobzJHODlyY0tleklKbkJ5ZUhhSEU2bjNXV0lrWUZzTzJ0Cit4MXVlS3Q2Yy9EckdsYWYxRjJjWTV5OUpDQXhjeitiTU5PMTQrMUN4M0dzeThLTCt0anprN0ZxWHh6OGVjQWd3b056RnMyMXYwSUp5CitFYXZTZ1doWmdoZTNlSkpnK3N6ZVA0VHJqVGd6a0FweUkvbzF6Q1p4TWRGeUtKTFpXeU50WnJWdEIwTHJwalBPa3R2QTlteGplTTNLCitUajIxNVZLYjhiNDc1bFJnc0dZZUNhc0gvbFNKRVVMUjl5UzZZSGdhbVBmSkVmMFd3VFVhVkhYdlE5UGxyazdPNTN2RHhrNWhVVXVyCitta1ZMb1I5QnZVaFRGWEZrQzRhejVTNit6cVFid1NtRW9yWExDQ04yUXlJa0h4Y0UxRzZjeHZ4L0syWWE3SXJsMXM5TjlXTUp0eFU1CisxbnVzNitOODZVNzhkVUxJN1ZpVkRBWkNvcHozNUhDejMzSnZXamRBaWRpRnBOZnhDOTVER2RSS1dDeU1pam1ldjRTSDhSWTdOZ3pwCiswN1RLYkJsQlVnbWhIYkJxdjRMdmNGRWhNdHdGZG96TDkyVGtBMUN2akpGbnE4WHk3bGpZM3I3MzV6SFBiTWs3Y2NIVmlMVmx2TURvCitGeGNIRXJWYzBxc2drN1RtZ29Od05zWE5vNDJ0aSt5andVT0g1a1BpTkw2Vml6WHRCem5hcUIxNm56YWVFckFNWlJLUUZXRFpKa0JFCis0MVpncFJEVWFqejlRZHdPV2tlMjc1ZGhkVS9aL3NleUhkVHRYVW16cVdyTFpvUVQxVnlnM045dWR3YlJjWFhJVjIrdkQzZGJBZ01CCitBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSVXJmckhrbGV1Cit5aldjTGhMNzVMcGRJTnlVVnpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQU1KbWRCVExJWGc0N21BRTZpcVRuQi9kNitPZWEzMUJECitVNWNxUGNvOFI1Z3U0UlY3OFpMellkcVFKUlpsd0o5VVhRNERPMXQzQXB5RXRnMllYelRkTzJQQ3d5aUJ3cHdwTGluaXlNTUI4alBxCitLcXJNQ1FqM1pXZkd6ZC9UdGl1bnZjelJEbkJmdUNQUnk1Rk9DdlRJZXVYWll6YkIxTi84SXBmM1lGM3FLUzlZc3IxWXZZMldUeEIxCit2MGg3UFZHSG9UeDBJc0w4QjMrQTNNU3MvbXJCY0RDdzZZNXA0aXhwZ1pRSnV0MytUY0NEakpSWXdFWWdyNXdmQXZnMVZVa3ZSdFRBCis4S0NXQWc4enhYSHpuaU45bExmOU90TUpnd1loL1dBOXJqTEEwdTZOcHZEbnRJSjhDc3h3eVhtQStQNU05eldFR1lveCt3cloxMytiCis4S0thYThNRlN1MUJZQlF3MGFvUlFtN1RJd0lFQzhabDNkMVNkOXFCYTdLbytnRTR1WmJxS214bmw0bVVucnpoVk5Ya2FuanZTcjByCittajFBZnNiQWRkSnUrMmd3N095TG5mbEpOWm9hTE5temxUblZIcEwzcHJsbEwrVTliVHBJVEFqYzVDZ1NLTDU5TlZ6cTRCWitFeHRxCisxejdYbnZ3dGRiTEJGTlVqQTl0YmJ3cytlQzhOM2pPTkZyZEk1NE9hZ1E5N3dVTk5WUVFYT0VwUjFWbWlpWFRUbjc0ZVM5ZkdiYmVJCitKRzlna2FTQ2hWdFdRYnpRUkt0cUU3N1JMRmkzRWpOWXNqZGozQlAxbEIwL1FGSDFUL1U2N2NqRjY4SWVIUmFWZXNkK1FuR1Ria3NWCit0ekRmcXUxWGhVaXNIV3JkT1duazRYbDR2czRGdjZFTTk0QjdJV2NuTUZrPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitTdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRmNEQ0NBMWlnQXdJQkFnSUVBSmlXalRBTkJna3Foa2lHOXcwQkFRc0ZBREJZTVFzd0NRWURWUVFHRXdKT1RERWVNQndHQTFVRQorQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU2t3SndZRFZRUUREQ0JUZEdGaGRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0ZworUlZZZ1VtOXZkQ0JEUVRBZUZ3MHhNREV5TURneE1URTVNamxhRncweU1qRXlNRGd4TVRFd01qaGFNRmd4Q3pBSkJnTlZCQVlUQWs1TQorTVI0d0hBWURWUVFLREJWVGRHRmhkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNHhLVEFuQmdOVkJBTU1JRk4wWVdGMElHUmxjaUJPWldSbAorY214aGJtUmxiaUJGVmlCU2IyOTBJRU5CTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0OGQraWZraworU3pyU000TTFMR25zM0FtazQxR29KU3Q1dUFnOTRKRzZoSVhHaGFUSzVza3VVNlRKSkI3OVZXWnhYU3pGWUdnRXQ5bkNVaVk0aUtUVworTzBDbXdzMC96WmlUczFRVVdKWlYxVkQraHEya1kzOWNoL2FPNWllU1p4ZVNBZ01zM05abWRPM2RaLy9CWVkxalR3K2JiUmN3SnUrcgorMGg4UW9QbkZmeFpwZ1FOSDdSNW9qWEtoVGJJbXhycHNYMjNXcjlHeEU0NnByZk5lYVhVbUdENUJLeUYvN290ZEJ3YWRROFFwQ2l2OAorS2o2R3l6eURPdm5KRGRyRm1lSzhlRUV6ZHVHL0wxM2xwSmhRREJYZDRQcWNmemhvMExLbWVxZlJNYjEraWxnblE3TzZNNUhUcDVnVgorWEpybTB3OTEyZnhCbUpjK3FpWGJqNUl1c0hzTVgvRmpxVGY1bTNWcFRDZ21KZHJWOGhKd1JWWGozM05lTi9VaGJKQ09OVnJKMHlQcgorMDhDK2VLeENLRmhtcFVadGNBTFhFUGxMVlB4ZGhrcUh6My9LUmF3UldyVWdVWTB2aUVlWE9jRFB1c0JDQVVDWlNDRUxhNmZTL1piVgorMGI1R25VbmdDNmFnSWs0NDBNRThNTHh3anl4MXpOREZqRkU3UFpRSVpDWmhmYm5EWlk4VW5DSFFxdjBYY2dPUHZadU01bDVUbnJtZAorNzRLNzRiemlja0ZiSVpUVFJUZVUwZDhKT1Yzbkk2cWFIY3B0cUFxR2hZcUN2a0lIMXZJNGduUGFoMXZsUE5PZVBxYzdudlFEcy9ueAorZlJOMEF2KzdvZVg2QUhrY3BtWkJpRnhnVjZZdUNjUzYvWnJQcHg5QXc3dk1XZ3BWU3pzNGRsRzRZNHVFbEJibVZ2TUNBd0VBQWFOQworTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRlA2ckFKQ1luaVQ4cWN3YQoraXZzbnVMOHdicWc3TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUGR5eHVWcjVPczdhRUFKU3JSOGtOMG5iSGhwOGRCOU8ydExzSQorZUs5cDBndEozalBGckszQ2lBSjlCcmMxQXNGZ3liL0U2SlRlMU5PcEV5VmEvbTZpcm4wRjNIM3piUEIrcG8zdTJkZk9XQmZvcVNtdQorYzBpSDU1dktiaW1oWkY4WkUvZXVCaEQvVWNhYlRWVWxUNU9aRUFGVGRmRVR6c2VtUVVIU3Y0aWxmMFg4ckxpbHRUTU1nc1Q3Qi9acQorNVNXRVh3Ykt3WVk1RWR0WXpYYzdMTUpNRDE2YTQvQ3JQbUViVUNUQ3dQVHhHZkFSS2JhbEdBS2IxMk5NY0l4SG93TkRYTGxkUnFBTgorYi85WmpyN2RuM0xEV3l2ZmpGdk81UXhHYkpLeUNxTk1WRUlZRlJJWXZkcjh1blJ1LzhHMm9HVFlxVjlWcnA5Y2FuYVcySE5uaC90TgorZjF6dWFjcHpFUHVLcWYyZXZUWTRTVW1IOUE0VThPbUh1RCtuVDNwYWpublVrK1M3YUZLRXJHenA4NWh3VlhJeStUU3JLMG0xelNCaQorNURwNloyT3JsdHh0cnBmcy9KOTJWb2d1WnM5YnRzbWtzTmNGdXVFbkw1TzdKaXFpazdBYjg0NitIVUNqdVRhUFBvSWFHbDZJNmxENAorV2VLRFJpa0w0MFJjNFpXMmFaQ2FGRytYcm9IUGFPK1ptcjYxNStGLytQb1RSeFpNekcwSVFPZUxlRzlRZ2tSUVAyWUdpcXREaEZaSworRHlBdGhnNzEwdHZTZW9wTHphWG9UdkZlSmlVQldTT2dmdEwyZmlGWDF5ZThGVmRNcEViQjRJTWVERXhOSDA4R0dlTDVxUFE2Z3FHeQorZVVONTFxMXZlaWVRQTZUcUpJYy8yYjNaNmZKZlVFa2M3dXpYTGc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitJZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLTVFzd0NRWURWUVFHCitFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3dKUVlEVlFRREV4NUpaR1Z1VkhKMWMzUWdRMjl0YldWeVkybGhiQ0JTCitiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGd4TWpJeldoY05NelF3TVRFMk1UZ3hNakl6V2pCS01Rc3dDUVlEVlFRR0V3SlZVekVTCitNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CCitJREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ25VQm5lUDVrOTFETkc4VzlSWVlLeXFVK1BaNGxkCitoTmxUM1F3bzJkZncvNjZWUTNLWitiVmRmSXJCUXVFeFVIVFJnUTE4elpzaHEwUGlySzFlaG03ekNZb2ZXaks5b3V1VStlaGNDdXovCittTkt2Y2JPMFU1OU9oKytTdkwzc1R6SXdpRXNYWGxmRVU4TDJBcGVOMldJcnZ5UWZZbzNmdzdncFMwbDRQSk5naUNMOG1kbzJ5TUtpCisxQ3hVQUdjMWJuTy9BbGp3cE4zbHNLSW1lc3JnTnFVWkZ2WDl0Kyt1UDBEMWJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDCitYWi9nMVVlOXRPc2JvYnRKU2RpZld3THppdVFra09SaVQwL0JyNHNPZEJlbzBYS0lhbm9CU2N5MFJubkdGN0hhbUI0SFdmcDFJWVZsCiszWkJXenZ1cnBXQ2R4SjM1VXJDTHZZZjVqeXNqQ2lOMk8vY3o0Y2tBODJuNVM2TGdUcngra3ptRUIvZEVjSDcrQjFybHNhelJHTXp5CitOZVZKU1FqS1ZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWktkSHpWCitXWWZDUDA0TVhGTDBQZmRTZ3ZIcW82ejlTVFFhS1BOQmlEb1Q3dWplLzVrZFg3ckw2Qjd5dVZCZ3dESFRjK1h2dnFEdE13dDB2aUFnCit4R2RzOEFnRGVsV0FmMFpPbHFmMEhqN2g5dGdKNFROa0syUFhNbDZmK2NCN0QzaHZsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4Cit1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU5pR1ZyZVRPMDF3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DCitBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVN1VRWndOUHdCb3Z1cEh1K1F1Y21WTWlPTm5Zd0RRWUpLb1pJCitodmNOQVFFTEJRQURnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICis2b2k2bVl0UWxOZUNnTjloQ1FDVHJRMFU1czdCOGplVWVMQmZuTE9pYzdpUEJaTTR6WTArc0xqN3dNK3g4dXd0TFJ2TTdLcWFzNnBnCitnaHN0TzhPRVBWZUtsaDZjZGJqVE1NMWdDSU9RMDQ1VThVMW13RjEwQTBDajdvVit3aDkzbkFib3dhY1lYVktWN2NuZEpaNXQrcW50Citvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzK3dZUStuVlpaakZIS2RwMm1oenBncTd2bXJsUjk0Z2ptbW1WCitZanpsVllBMjExUUMvL0c1WGM3VUkyL1lSWVJLVzJYdmlRemRGS2NneXhpbEpiUU4rUUh3b3RMMEFNaDBqcUVxU0k1bDJ4UEU0aVVYCitmZXUraDFzWElGUlJrMHBUQXd2c1hjb3o3V0w5UmNjdlc5eFlvSUE1NXZyWC9oTVVwdTA5bEVwQ2ROVERkMWx6elk5R3ZsVTQ3L3JvCitrVExxbDFnRUl0NDR3OHk4YmNrek9tb0thVCtneU9weWo0eGpoaU85YlR5V25wWGdTVXlxb3JrcUc1dzJnWGp0dytoRzRpWlpSSFVlCisyWFdKVWMwUWhKMWhZTXRkK1pjaVRZNlk1dU4vOWx1N3JzM0tTb0ZyWGd2elVlRjBLK2wrSjZmWm1VbE8rS1dBMnlVUEhHTmlpc2t6CitaMnM4RUlQR3JkNm96UmFPamZBSE4zR2Y4cXY4UWZYQmkrd0FOMTBKNVU2QTcvcXhYRGdHcFJ0SzRkdzRMVHpjcXgrUUd0VktuTzdSCitjR3pNN3ZSWCtCaTZoRzZICistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0lkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk5NUXN3Q1FZRFZRUUcKK0V3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNvd0tBWURWUVFERXlGSlpHVnVWSEoxYzNRZ1VIVmliR2xqSUZObFkzUnYKK2NpQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGMxTXpNeVdoY05NelF3TVRFMk1UYzFNek15V2pCTk1Rc3dDUVlEVlFRR0V3SlYKK1V6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlMKK2IyOTBJRU5CSURFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUMySXBUOHBFaXY2RWRyQ3ZzbmR1VHkKK1A0bzdla29zTVNxTWpiQ3B3ekZycUhkMmhDYTJySUZDRFFqclZWaTdldmk4WlgzeW9HMkxxRWZwWW5ZZUVlNElGTkd5UkJiMDZ0RDYKK0hpOWUyOHR6UWE2OEFMQktLMEN5ck9FN1M4SXRuZVNobSt3YU9oN3dDTFBRNUNRMUI1K2N0TWxTYmRzSHlvKzFXL0NEODAvSExhWEkKK3JjdVZJS1F4S0ZkWVd1U05HNXFybmcwTThnb3pPU0k1Q3BjdTgxTjN1VVJGL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2YKK3F5OXJnM0x2ZFlEYUJqTWJYY2phWThaTnpheG1NYzNSM2o2SEVEYmh1YVI2NzJCUXNzdktwbGJnTjYrck5CTTVKZWc1WnVTWWVxb1MKK21KeFpab1krcmZHd3lqNEdEM3Z3RVVzM29FUnRlOHVvakhIMDFiV1JOc3p3RmNZcjNsRVhzWmRNVUQyeGxWbDhCWDB0SWRVQXZ3Rm4KK29sNTdwbHp5OXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5Vkd4eWgKK0xyWEhGdWI0cWp5U2ptbTJBY0cxaHAySkR3czRsRlRvNnR5ZVBTVzhVeWJ0MWFzNXFzVkFURlNyc3JUWjJmalhjdHNjdkcyOVpWL3YKK2lEVXFaaS91OXJObDhET05mSmhCYVVZUFF4eHArcHUxMEdGcXpjcEwyVXlRUnFzVldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUwKKzRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRFcvM0ZLcUQyY3lPRUVCc0I1d0lEQVFBQm8wSXdRREFPQmdOVkhROEIKK0FmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTQzSGdudGluUXRuYmNaRnJsSlBydzZQUkZLTXcKK0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKK3Qyb2RJRmZsQVdKQkY5TUoyM1hMYmxTUWRmNGFuNEVLd3QzWDl3blFXM0lWNUI0SmFqMHo4eUdhNWhWK3JWSFZEUkR0ZlVMQWorN0EKK21nalZRZFpjRGlGcGJvQmhEaFhBdU0vRlNSSlN6TDQ2ek5RdU9BWGVOZjBmYjdpQWFKZzlUYURLUUdYU2MzejFpOWtLbFQvWVB5TnQKK0d0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEdsd21FS1lCaEhmcGUvM09zb09PSnVCeHhGY2JlTVg4UzNPRnQKK202L242SjkxZUV5clJqdWF6cjhGR0YxTkZUd1dtaGxRQkpxeW1tOWxpMUpmUEZnRUtDWEFabUV4ZnJuZ2Ria2FxSUhXY2hlenhRTXgKK05SRjRlS0xnNlRDTWY0RGZXTjg4dWllVzRvQTBiZU9ZMDJRbnJFaCtLSGRjeGlWaEpmaUZER1g2eERJdnBaZ0Y1UGdMWnhZV3hvSzQKK01objUrYmw1M0IvTjY2K3JEdDBiMjBYa2V1Y0M0cFZkL0dud1UybGhsWFY1QzE1VjVqZ2NsS2xaTTU3SWNYUjVmMUdKdHNocXVEREkKK2FqakRicDdoTnhicUJXSk1XeEpIN2FlMHMxaFd4MG56ZnhKb0NURng4RzM0VGtmNzFvWHV4VmhBR2FRZHAvbExRemZjYUZwUHordkMKK1pIVGV0QlhaOUZSVUdpOGMxNWR4VkpDTzJTQ2RVeXQvcTQvaTZqQzhVRGZ2OFVlMWZYd3NCT3hvbmJSSlJCRDBja3NjWk9mODVtdVEKKzNXbDlhZjBBVnFXM3JMYXR0OG8rQWUrYworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVgorQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeQorYlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGxaQ0IxYzJVZworYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJdworSGhjTk1Ea3dOekEzTVRjeU5UVTBXaGNOTXpBeE1qQTNNVGMxTlRVMFdqQ0J2akVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVAorRFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeAorT1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cworZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaQorTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDNmhMWnkyNTRNYStLWjZUQUJwM2JxTXJpVlFSckoybUZPV0hMUAorL3ZhQ2ViOXpZUVlLcFNmWXMxL1RSVTRjY3RaT012SnlpZy8zZ3huUWFvQ0FBRVVlc01mbm1yOFNWeWNjbzJndkNvZTlhbXNPWG1YegorSEhmVjFJV05jQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXd2NLVQorcy9KYTVDZWFueVRYeHV6UW15V0M0OHpDeEVYRmpKZDZCbXNxRVorcENtNUlPMi9iMUJFWlF2ZVBCNy8xVTErY1B2UVhMT1pwckU0eQorVEdKMzZyZm81YnMwdkJtTHJweFI1N2QrdFZPeE15TGxiYzl3UEJyNjRwdG50b1AwamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeAorQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJxY2laNgorMEI3dmZlYzdhVkhVYkkyZmtCSm1xekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZVo4ZGxzYTJlVDhpallmVGh3TUVZR3BybWk1WgoraVhNUnJFUFI5UlAvalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgorUmtmejYvZGp3VUFGUUtYU3QvUzFtamEvcVloMmlBUlZCQ3VjaDM4YU56eCtMYVVhMk5TSlhzcTlyRDFzMkcydjFmTjJEODA3aURnaQorbld5VG1zUTl2NEliWlQrbUQxMnEvT1d5RmNxMXJjYThQZENFNk9vR2NyQk5PVEo0dno0Um5BdWtuWm9oOC9DYkN6QjQyOEhjaDBQKwordkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSFZIT2tjOEtULzFFUXJCVlVBZGo4QmJHSm9YOTBnNXBKMTl4TworZTRwSWI0dEY5Zz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0VudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUMrVENDQW9DZ0F3SUJBZ0lOQUthTGVTa0FBQUFBVU5DUitUQUtCZ2dxaGtqT1BRUURBekNCdnpFTE1Ba0dBMVVFQmhNQ1ZWTXgKK0ZqQVVCZ05WQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm4KK1lXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURFeUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGwKK1pDQjFjMlVnYjI1c2VURXpNREVHQTFVRUF4TXFSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKK0lDMGdSVU14TUI0WERURXlNVEl4T0RFMU1qVXpObG9YRFRNM01USXhPREUxTlRVek5sb3dnYjh4Q3pBSkJnTlZCQVlUQWxWVE1SWXcKK0ZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwTDJ4bFoyRnMKK0xYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnWm05eUlHRjFkR2h2Y21sNlpXUWcKK2RYTmxJRzl1YkhreE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXQKK0lFVkRNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHkKK0FzV2ZvUFpiMVlzR0dZWlBVeEJ0QnlRbm9hRDQxVWNaWVV4OXlwTW42blFNNzIrV0NmNWo3SEJkTnExbmQ2N0puWHhWUkRxaVkxRWYKKzllTmkxS2xIQno3TUlLTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUUKK0ZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQ1I5OGNybE9aRjdadkhIM2gKK3Z4R1UwUU9JZGVTTmlhU0tkMGJlYldIdkF2WDd0ZC9NL2s3Ly9xbm1wd0l3VzVuWGhUY0d0WHNJL2VzbmkwcVUrZUg2cDQ0bUNPaDgKK2ttaHRjOWh2SnF3aEFyaVp0eVpCV3lWZ3J0QklHdTRHCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK0NGQ0EgRVYgUk9PVAorPT09PT09PT09PT09CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZqVENDQTNXZ0F3SUJBZ0lFR0VyTTFqQU5CZ2txaGtpRzl3MEJBUXNGQURCV01Rc3dDUVlEVlFRR0V3SkRUakV3TUM0R0ExVUUKK0Nnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFEREF4RFJrTkIKK0lFVldJRkpQVDFRd0hoY05NVEl3T0RBNE1ETXdOekF4V2hjTk1qa3hNak14TURNd056QXhXakJXTVFzd0NRWURWUVFHRXdKRFRqRXcKK01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNUlV3RXdZRFZRUUQKK0RBeERSa05CSUVWV0lGSlBUMVF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFhYV3ZORUQ4ZkJWblYKK0JVMDNzUTdzbUN1T0ZSMzZrMHNYZ2lGeEVGTFhVV1J3RnNKVmFVMk9GVzJmdnd3Ynd1Q2paOVlNck04aXJxOTNWQ3BMVElwVFVuckQKKzdpN2VzM0Vsd2VsZFBlNmhMNlAzS2p6Skl4MXFxeDJocC9IejdLRFZSTThWejNJdkhXT1g2Sm41L1pPa1ZJQk1VdFJTcXk1SjM1RE4KK3VGKytQOTZoeWswZzFDWG9oQ2xUdDdHSUgvLzYycENmQ3FrdFFUK3g4UmdwN2haWkxEUkpHcWdHMTZpSTBnTnllakxpNm1oTmJpeVcKK1pYdktXZnJ5NHQzdU1Dejd6RWFzeEdQcmIzODJLelJ6RXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTcKK3h6Ymg3MmZST2RPWFczTmlHVWd0aHh3RyszU1lJRWx6OEFYU0c3R2dvN2NiY05PSWFibGExamowWXR3bGkzaS8rT2grdUZ6SmxVOWYKK3B5MjVJR3ZQYTkzMURmU0N0L1N5Wmk0UUtQYVhXbnVXRm84QkdTMXNibjg1V0Faa2d3R0RnOE5Oa3QweXhvZWtOK2tXenFvdGFLOEsKK2dXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZ1RuWUdtRTY5ZzYwZFdJb2wKK2hkTEhaUjR0anNiZnRzYmhmNG9FSVJVcGRQQStuSkNkREM3eGlqNWFxZ3dKSHNmVlBLUHRsOE1lTlBvNCtRZ080OEJkSzRQUlZtckoKK3RxaFVVeTU0TW1jOWduOTAwUHZodGdWZ3VYRGJqZ3Y1RTFodmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWYKK0JnTlZIU01FR0RBV2dCVGovaTM5S05BTHRicTJvc1MvQnFvRmpKUDdMekFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIKKy93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVTQvNHQvU2pRQzdXNnRxTEV2d2FxQll5VCt5OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUIKK0FDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlRlai90VXhQUTRpOXEKK2Vjc0FJeWptSGpkWE5ZbUV3blpQTkRhdFo4UE9RUWFJeGZmdTJCcTQxZ3QvVVArVHFoZExqT3p0VW1DeXBBYnFUdXYwYXhuOTYvVWEKKzRDVXFtdHpIUVRiM3lIUUZoRG1WT2RZTE82UW4rZ2pZWEI3NEJHQlNFU2dvQS8vdlUyWUFwVW8wRm1aOC9RbWtycDVuR205QkMyc0cKK0U1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXlQNUhnemcwYjh6QWFyYjhpWFJ2VHZ5VUZUZUdTR24rWm56eEVrOHJVUUVsc2dJZlgKK0JEckRNbEkxRGxiNHBkMTl4SXNORVI5VHl4NnlGN1pvZDFyZzFNdklCNjcxT2k2T043ZlFBVXRES1hlTU9aZVBnbHI0VWVXSm9Cam4KK2FIOWRDaTc3bzBjT1BhWWplc1lCeDQvSVhyOXRnRmEraWlTNk0rcWY0VElSbnZIU1Q0RDJHMEN2T0o0UlVIbHpFaExONW15ZExJaHkKK1BEQ0JCcEVpNmxtdDJoa3VJc0tOdVl5SDRHYThjeU5mSVdSamdFajFvRHdZUFpUSVNFRWRRTHBlL3Y1V09hSEl6MTZlR1dSR0VOb1gKK2tiY0ZnS3lMbVpKOTU2TFlCd3MySitkSWVXQ0t3OWNUWFBoeVFOOUt5OCtaQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0MKK2VrRDY4MTlrUjVMTFU3bTdXYzVQL2RBVlV3SFkzK3ZaNW5idjBDTzdPNmw1czlVQ0tjMkpvNVlQU2pYblRrTEFkYzBIeitZczYzc3UKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9BTkRST0lELUFEQi1RRU1VLlRYVCBiL2FuZHJvaWQvZG9jcy9BTkRST0lELUFEQi1RRU1VLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmEzYzgyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtQURCLVFFTVUuVFhUCkBAIC0wLDAgKzEsNTMgQEAKK0FEQiBDT01NVU5JQ0FUSU9OIE9WRVIgUUVNVUQgU0VSVklDRQorCitJLiBPdmVydmlldzoKKy0tLS0tLS0tLS0tLQorCitJbiBjZXJ0YWluIGNhc2VzIEFEQiBjb21tdW5pY2F0aW9uIG92ZXIgVENQIHBvcnQgZm9yd2FyZGluZyBtaWdodCBiZSB1bnJlbGlhYmxlLgorRm9yIGluc3RhbmNlLCBjb25uZWN0aW9uIG1hbmFnZXIgaW4gdGhlIGd1ZXN0IHN5c3RlbSBtYXkgZGVjaWRlIHRvIHJlc2V0IGFsbAorbmV0d29yayBjb25uZWN0aW9ucywgaW4gd2hpY2ggY2FzZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIEFEQiBob3N0LCBhbmQgQURCCitkYWVtb24gcnVubmluZyBpbiB0aGUgZ3Vlc3Qgd2lsbCBiZSBicm9rZW4sIGFuZCB3aWxsIG5vdCBiZSByZWVzdGFibGlzaCB1bnRpbCBBREIKK2hvc3QgaXMga2lsbGVkLCBhbmQgdGhlbiByZXN0YXJ0ZWQuIFRvIGFkZHJlc3MgdGhpcyBpc3N1ZSBBREIgY29tbXVuaWNhdGlvbiBoYXMKK2JlZW4gbW92ZWQgdG8gdXNlIFFFTVVEIHBpcGUgdG8gdHJhbnNmZXIgZGF0YSBiZXR3ZWVuIHRoZSBlbXVsYXRvciwgYW5kIHRoZQorQURCIGRhZW1vbiBydW5uaW5nIGluIHRoZSBndWVzdC4KKworCitJSS4gSW1wbGVtZW50YXRpb246CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0d28gbWFqb3IgY29tcG9uZW50cyBpbXBsZW1lbnRlZCBpbiB0aGUgZW11bGF0b3IgdG8gc3VwcG9ydCBBREIKK2NvbW11bmljYXRpb24gb3ZlciBRRU1VRCBwaXBlOgorCisxLiBBREIgc2VydmVyLgorMi4gQURCIFFFTVVEIHNlcnZpY2UgKG9yIEFEQiBjbGllbnQpLgorCitBREIgc2VydmVyIGlzIGltcGxlbWVudGVkIGFzIGEgc29ja2V0IHNlcnZlciB0aGF0IGlzIGJvdW5kIHRvIHRoZSBBREIgcG9ydCAod2hpY2gKK2lzIHRoZSAnYmFzZSBwb3J0JyArIDEpLCBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGFjY2VwdGluZyBjb25uZWN0aW9ucyBjb21pbmcgZnJvbQordGhlIEFEQiBob3N0LCBhbmQgYXNzb2NpYXRpYXRpbmcgYWNjZXB0ZWQgY29ubmVjdGlvbnMgd2l0aCBhbiBBREIgY2xpZW50LgorCitBREIgY2xpZW50IGlzIGltcGxlbWVudGVkIGFzIFFFTVVEIHNlcnZpY2UgKG5hbWVkICdhZGInKSwgYW5kIGlzIHJlc3BvbnNpYmxlIGZvcgorYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGNvbWluZyBmcm9tIHRoZSBBREIgZGFlbW9uIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQKK2Fzc29jaWF0aW5nIGFjY2VwdGVkIGNvbm5lY3Rpb25zIHdpdGggQURCIHNlcnZlci4KKworRXNzZW50aWFsbHksIEFEQiBzZXJ2ZXIsIGFuZCBBREIgY2xpZW50IHNlcnZlIGFzIGEgYnJpZGdlIGJldHdlZW4gQURCIHJ1bm5pbmcgb24KK3RoZSBob3N0LCBhbmQgQURCIHJ1bm5pbmcgb24gdGhlIGd1ZXN0OiBBREIgc2VydmVyIHJlY2VpdmVzIGRhdGEgZnJvbSBBREIgaG9zdCwKK2FuZCBjaGFubmVscyB0aGVtIHRocm91Z2ggQURCIGNsaWVudCB0byB0aGUgQURCIGd1ZXN0LiBMaWtld2lzZSwgQURCIGNsaWVudAorcmVjZWl2ZXMgZGF0YSBmcm9tIHRoZSBBREIgZ3Vlc3QsIGFuZCBjaGFubmVscyB0aGVtIHRocm91Z2ggQURCIHNlcnZlciB0byB0aGUgQURCCitob3N0LiBUaGUgb25seSB0cmlja3kgcGFydCBoZXJlIGlzIGVzdGFibGlzaGluZyB0aGUgY29ubmVjdGlvbi4gT25jZSBjb25uZWN0aW9uCitpcyBlc3RhYmxpc2hlZCwgZXZlcnl0aGluZyBpcyBzdHJhaWdodCBmb3J3YXJkLgorCitJSS5JSUkgRXN0YWJsaXNoaW5nIHRoZSBjb25uZWN0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvbm5lY3Rpb24gYmV0d2VlbiBBREIgaG9zdCBhbmQgQURCIGd1ZXN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZXN0YWJsaXNoZWQsCit3aGVuIHRoZXJlIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gQURCIHNvY2tldCBjb25uZWN0aW9uIGluIHRoZSBBREIgc2VydmVyLCBhbmQKK1FFTVVEIHBpcGUgY29ubmVjdGlvbiBpbiB0aGUgQURCIGNsaWVudCwgYW5kIEFEQiBndWVzdCBpcyByZWFkeSB0byByZWNlaXZlIGRhdGEKK2Zyb20gdGhlIEFEQiBob3N0LgorCitTaW5jZSB0aGVyZSBpcyBubyBwYXJ0aWN1bGFyIG9yZGVyLCBpbiB3aGljaCBBREIgc2VydmVyLCBhbmQgQURCIGNsaWVudAorY29ubmVjdGlvbnMgYXJlIG1hZGUsIEFEQiBzZXJ2ZXIgcnVucyBhIGxpc3Qgb2YgcGVuZGluZyBob3N0IGFuZCBndWVzdAorY29ubmVjdGlvbnMuIEV2ZXJ5IHRpbWUgZWl0aGVyIGNvbm5lY3Rpb24gaXMgbWFkZSwgdGhhdCBjb25uZWN0aW9uIGdvZXMgaW50byBhCitwZW5kaW5nIGxpc3Qgb24gY29uZGl0aW9uIHRoYXQgdGhlcmUgaXMgbm8gcGVuZGluZyBjb25uZWN0aW9uIG9uIHRoZSBvdGhlciBzaWRlLgorSWYsIGhvd2V2ZXIsIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGNvbm5lY3Rpb24gZnJvbSB0aGUgb3RoZXIgc2lkZSwgdGhhdAorcGVuZGluZyBjb25uZWN0aW9uIGlzIHJlbW92ZWQgZnJvbSB0aGUgcGVuZGluZyBsaXN0LCBhbmQgZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlCituZXcgY29ubmVjdGlvbi4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9BTkRST0lELUNPRElORy1TVFlMRS5UWFQgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1DT0RJTkctU1RZTEUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NGI3NzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1DT0RJTkctU1RZTEUuVFhUCkBAIC0wLDAgKzEsNzU1IEBACitDb2RpbmcgU3R5bGUgR3VpZGUgZm9yIHRoZSBBbmRyb2lkIGVtdWxhdG9yOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW50cm9kdWN0aW9uOgorLS0tLS0tLS0tLS0tLQorCitJTVBPUlRBTlQ6CisgICAgVGhpcyBndWlkZSBvbmx5IGFwcGxpZXMgdG8gdGhlIEFuZHJvaWQtc3BlY2lmaWMgY29kZSB0aGF0IGlzIGN1cnJlbnRseQorICAgIGZvdW5kIHVuZGVyICRBT1NQL2V4dGVybmFsL3FlbXUvYW5kcm9pZC8gb25seS4gT3RoZXIgcGFydHMgb2YKKyAgICBleHRlcm5hbC9xZW11LyBzaG91bGQgYWRoZXJlIHRvIHRoZSBRRU1VIGNvZGluZyBzdHlsZSwgd2hlbmV2ZXIgcG9zc2libGUuCisKKyAgICBTZWUgdGhlIHNlY3Rpb24gbmFtZSAiU291cmNlIENvZGUgT3JnYW5pemF0aW9uIiBmb3IgbW9yZSBkZXRhaWxzLgorCitUaGlzIGRvY3VtZW50IHNlcnZlcyBhcyBhICpndWlkZSogZm9yIGFueW9uZSB3b3JraW5nIG9uIHRoZSBBbmRyb2lkLXNwZWNpZmljCitwb3J0aW9ucyBvZiB0aGUgQW5kcm9pZCBlbXVsYXRvciBzb3VyY2UgY29kZS4gRG9uJ3QgZm9yZ2V0IHRoYXQgY29uc2lzdGVuY3kKK2ZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeSBpcyBhIHdhc3RlIG9mIHRpbWUuIFVzZSB0aGlzIGluZm9ybWF0aW9uIGFzIGEgd2F5Cit0byBzcGVlZCB1cCB5b3VyIGNvZGluZyBhbmQgY29kZSByZXZpZXdzLCBmaXJzdCBhbmQgZm9yZW1vc3QuCisKK0EgLmNsYW5nX2Zvcm1hdCBmaWxlIGlzIHByb3ZpZGVkIHRvIGF1dG9tYXRpY2FsbHkgcmVmb3JtYXQgeW91ciBtb2RpZmllZCBjb2RlCit0aHJvdWdoICdnaXQgY2xhbmctZm9ybWF0Jy4gVXNlIGl0LCB0aGlzIHdpbGwgc2F2ZSB5b3UgYSBsb3Qgb2YgdGltZS4KKworQWxzbywgdGhlcmUgaXMgbm8gcmVhbCBuZWVkIHRvIHJlZm9ybWF0IGV4aXN0aW5nIGNvZGUgdG8gYWRoZXJlIHRvIHRoZSBndWlkZS4KK1dvdWxkIHlvdSBmZWVsIHRoZSBuZWVkIHRvIGRvIHNvLCBkbyBpdCBpbiBpbmRlcGVuZGVudCBwYXRjaGVzIHRoYXQgYmF0Y2ggYWxsCityZWZvcm1hdHRpbmcgd2l0aG91dCBhbnkgYnVnZml4IC8gY2hhbmdlcyBhdCBhbGwuCisKK0VhY2ggcnVsZSBiZWxvdyBjb21lcyB3aXRoIGEgcmF0aW9uYWxlLiBBZ2Fpbiwgc3RyaWN0IGFkaGVyZW5jZSBpcyBub3QKK25lY2Vzc2FyeS4KKworSU1QT1JUQU5UOiBZb3UgbmVlZCB0byB1c2UgJ2dpdC1jb25maWcnIHRvIGVuc3VyZSAnZ2l0IGNsYW5nLWZvcm1hdCcgd29ya3MKKyAgICAgICAgICAgY29ycmVjdGx5LCBzZWUgZGVkaWNhdGVkIHNlY3Rpb24gYmVsb3cuCisKKworSS4gSGlzdG9yeToKKy0tLS0tLS0tLS0tCisKK1RoaXMgZ3VpZGUgaXMgYSBtaXggb2YgdGhlIEFuZHJvaWQgQysrIGNvZGluZyBzdHlsZSBndWlkZSAobm90IHB1YmxpY2x5CithdmFpbGFibGUpIGFuZCB0aGUgQ2hyb21pdW0gb25lLCBhdmFpbGFibGUgYXQgWzFdLgorCitJbiBjYXNlIG9mIGRvdWJ0LCBmYWxsYmFjayB0byB0aGUgQ2hyb21pdW0gc3R5bGUgZ3VpZGUuCisKKworSUkuIFNvdXJjZSBDb2RlIE9yZ2FuaXphdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhbmQgaG93IHRvIGFwcGx5IHRoaXMgc3R5bGUgZ3VpZGUuCisKK1RoZSAnY2xhc3NpYycgQW5kcm9pZCBlbXVsYXRvciBjb2RlIGJhc2UgbGl2ZXMgdW5kZXIgJEFPU1AvZXh0ZXJuYWwvcWVtdS8sCit3aXRoIG1vc3Qgb2YgdGhlIEFuZHJvaWQtc3BlY2lmaWMgY29kZSB1bmRlciAkQU9TUC9leHRlcm5hbC9xZW11L2FuZHJvaWQvLgorCitUaGUgJ3FlbXUyJyBBbmRyb2lkIGVtdWxhdG9yIGNvZGUgYmFzZSBsaXZlcyB1bmRlciAkQU9TUC9leHRlcm5hbC9xZW11LworYW5kIGlzICpOT1QqIGFmZmVjdGVkIGJ5IHRoaXMgY29kaW5nIHN0eWxlIGd1aWRlLgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC9iYXNlLworICAgICAgU2V0IG9mIGxvdy1sZXZlbCBDKysgaW50ZXJmYWNlcyB0byBzeXN0ZW0gZmFjaWxpdGllcy4KKyAgICAgIFRoZXNlIHNob3VsZCBiZSBjb21wbGV0ZWx5IHNlbGYtY29udGFpbmVkIChpLmUuIG5vdCBkZXBlbmQgb24gb3RoZXIKKyAgICAgIHBhcnRzIG9mIHRoZSBjb2RlIGJhc2UpLCBhbmQgZm9ybSB0aGUgJ2Jhc2UgcGxhdGZvcm0nIHRvIHJlbHkgb24uCisKKyAgICAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIChidXQgc2ltcGxlcikgdGhhbiB0aGUgQ2hyb21pdW0gYmFzZS8gY29tcG9uZW50LgorCisgICAgICAqSU1QT1JUQU5UKjogQW55IG5ldyBhZGRpdGlvbiBoZXJlIHNob3VsZCBjb21lIHdpdGggdW5pdC10ZXN0cyB0aGF0CisgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBydW4gZWFjaCB0aW1lIGFuZHJvaWQvcmVidWlsZC5zaCBydW5zLgorCisgICAgICAgICAgICAgICAgICAgQWxzbyBzZWUgYW5kcm9pZC9iYXNlL3Rlc3RpbmcvIGZvciBoZWxwZXIgY2xhc3NlcyB0byB1c2UKKyAgICAgICAgICAgICAgICAgICBpbnNpZGUgeW91ciB1bml0IHRlc3RzLgorCisgICAgICBHZW5lcmFsbHkgc3BlYWtpbmcsIHRoZSB1c2Ugb2YgQysrIG1ha2VzIGl0IGVhc2llciB0byBwcm92aWRlIGFic3RyYWN0CisgICAgICBpbnRlcmZhY2VzIHRoYXQgY2FuIGJlIHJlcGxhY2VkIGF0IHJ1bnRpbWUgYnkgbW9jayB2ZXJzaW9ucy4gRG9pbmcgc28KKyAgICAgIGluIEMgaXMgYWxzbyBwb3NzaWJsZSwgYnV0IHJlcXVpcmVzIG1vcmUgdHlwaW5nIC8gaXMgbW9yZSBlcnJvci1wcm9uZS4KKworICAgICAgVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byBiZSBhYmxlIHRvIHVuaXQtdGVzdCBhIHN1Yi1jb21wb25lbnQgd2l0aG91dAorICAgICAgaGF2aW5nIHRvIHJ1biBhIGZ1bGwgZW11bGF0b3Igc2Vzc2lvbi4gSW4gcGFydGljdWxhciB0cnkgdG8gdXNlIHRoZQorICAgICAgZmVhdHVyZXMgb2YgYmFzZS9zeXN0ZW0vU3lzdGVtLmggdG8gYWNjZXNzIGxvdy1sZXZlbCBzeXN0ZW0gZmVhdHVyZXMsCisgICAgICB0aGlzIGludGVyZmFjZSBjYW4gYmUgZWFzaWx5IG1vY2tlZCBkdXJpbmcgdW5pdC10ZXN0cyBieSBjcmVhdGluZworICAgICAgYW4gaW5zdGFuY2Ugb2YgYmFzZS90ZXN0aW5nL1Rlc3RTeXN0ZW0uaCwgYWxsb3dpbmcgeW91ciB0ZXN0cyB0byBub3QKKyAgICAgIGRlcGVuZCBvbiB0aGUgc3RhdGUgb2YgdGhlIGRldmVsb3BtZW50IG1hY2hpbmUgd2hlbmV2ZXIgcG9zc2libGUuCisKKyAgICAgIE5PVEU6IERvIG5vdCBwdXQgaGlnaC1sZXZlbCBmZWF0dXJlcyBoZXJlLiBJbWFnaW5lIHlvdSB3b3VsZCByZXVzZSB0aGUKKyAgICAgICAgICAgIGNsYXNzZXMgaW4gdGhpcyBkaXJlY3RvcnkgaW4gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBwcm9ncmFtLgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC91dGlscy8KKyAgICAgIFNpbWlsYXIgbG93LWxldmVsIEMtYmFzZWQgaW50ZXJmYWNlcywgc29tZSBvZiB0aGVtIGFyZSBhY3R1YWwgd3JhcHBlcnMKKyAgICAgIGZvciBhbmRyb2lkL2Jhc2UvIGZlYXR1cmVzLiBTaG91bGQgbm90IGRlcGVuZCBvbiBhbnl0aGluZyBlbHNlIGJlc2lkZXMKKyAgICAgIHN5c3RlbSBpbnRlcmZhY2VzLgorCisgICAgICBOT1RFOiBEbyBub3QgcHV0IGhpZ2gtbGV2ZWwgZmVhdHVyZXMgaGVyZS4KKworICBleHRlcm5hbC9xZW11L2FuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlLworICAgICAgQ3VycmVudGx5IGNvbnRhaW5zIFFFTVUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mIGFuZHJvaWQvYmFzZS8KKyAgICAgIGludGVyZmFjZXMuIEUuZy4gYW5kcm9pZC1xZW11MS1nbHVlL2Jhc2UvYXN5bmMvTG9vcGVyLmggcHJvdmlkZXMKKyAgICAgIGFuZHJvaWQ6OnFlbXU6OmNyZWF0ZUxvb3BlcigpLCB3aGljaCByZXR1cm5zIGEgTG9vcGVyIGluc3RhbmNlCisgICAgICBiYXNlZCBvbiB0aGUgUUVNVSBtYWluIGV2ZW50IGxvb3AuCisKKyAgICAgIEluIHRoaXMgc3BlY2lmaWMgZXhhbXBsZSwgdGhlIGlkZWEgaXMgdG8gdXNlIFRocmVhZExvb3Blcjo6c2V0KCkgd2l0aAorICAgICAgaXRzIHJlc3VsdCB0byBpbmplY3QgaXQgaW50byB0aGUgbWFpbiB0aHJlYWQuIEFueSBjb2RlIHRoYXQgdXNlcworICAgICAgVGhyZWFkTG9vcGVyOjpnZXQoKSB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aHJlYWQncyBMb29wZXIgd2lsbCB1c2UgdGhlCisgICAgICBRRU1VLWJhc2VkIG1haW4gbG9vcCB3aGVuIGl0IHJ1bnMgd2l0aGluIHRoZSBlbXVsYXRvcidzIG1haW4gdGhyZWFkLAorICAgICAgZXZlbiBpZiBpdCBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgUUVNVS4KKworICAgICAgVGhpcyBraW5kIG9mIGRlY291cGxpbmcgaXMgdmVyeSB1c2VmdWwgYW5kIHNob3VsZCBiZSBlbmNvdXJhZ2VkIGluCisgICAgICBnZW5lcmFsLgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC88ZmVhdHVyZT4vCisgICAgICBTaG91bGQgY29udGFpbiBjb2RlIHJlbGF0ZWQgdG8gYSBzcGVjaWZpYyBmZWF0dXJlIHVzZWQgZHVyaW5nIGVtdWxhdGlvbi4KKyAgICAgIElkZWFsbHksIHRoZSBjb2RlIHNob3VsZCBvbmx5IGRlcGVuZCBvbiBhbmRyb2lkL2Jhc2UvIGFuZCBhbmRyb2lkL3V0aWxzLywKKyAgICAgIHN0dWZmIGFzIG11Y2ggYXMgcG9zc2libGUuIEFueXRoaW5nIHRoYXQgaXMgUUVNVS1zcGVjaWZpYyBzaG91bGQgYmUgbW92ZWQKKyAgICAgIHNvbWV3aGVyZSBlbHNlLgorCisgICAgICBBIGdvb2QgZXhhbXBsZSBpcyB0aGUgR1NNL1NNUyBlbXVsYXRpb24gY29kZS4gR2VuZXJpYyBjb2RlIGlzIHByb3ZpZGVkCisgICAgICB1bmRlciBleHRlcm5hbC9xZW11L2FuZHJvaWQvdGVsZXBob255LyAod2l0aCB1bml0LXRlc3RzKSwgd2hpbGUKKyAgICAgIFFFTVUtc3BlY2lmaWMgYmluZGluZ3MgYXJlIGltcGxlbWVudGVkIHVuZGVyIGV4dGVybmFsL3FlbXUvdGVsZXBob255LworICAgICAgd2hpY2ggZGVwZW5kIG9uIGl0LCBhbmQgb3RoZXIgUUVNVSBoZWFkZXJzIC8gZnVuY3Rpb25zLgorCisgICAgICBOT1RFOiBJdCdzIGVzc2VudGlhbGx5IGltcG9zc2libGUgdG8gcHJvcGVybHkgdW5pdC10ZXN0IGNvZGUgdGhhdCBkZXBlbmRzCisgICAgICAgICAgICBvbiBhbnkgUUVNVS1zcGVjaWZpYyBmdW5jdGlvbiwgc28gbW92ZSBhcyBtdWNoIG9mIHlvdXIgY29kZSBhcworICAgICAgICAgICAgcG9zc2libGUgb3V0IG9mIGl0LgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC8KKyAgICAgIFRoZSByZXN0IG9mIHRoZSBzb3VyY2VzIHVuZGVyIHRoaXMgc3ViLWRpcmVjdG9yeSBhcmUgQW5kcm9pZC1zcGVjaWZpYworICAgICAgYW5kIGlzIHByb2JhYmx5IHN0aWxsIGEgbGl0dGxlIGJpdCBtZXNzeS4gV2UgcGxhbiB0byBzb3J0IHRoaXMgb3V0IGJ5CisgICAgICBtb3ZpbmcsIG92ZXIgdGltZSwgYW55dGhpbmcgc3BlY2lmaWMgdG8gUUVNVSBvdXRzaWRlIG9mIHRoaXMgZGlyZWN0b3J5LgorCisgICpJTVBPUlRBTlQqOiBUaGUgZW5kIGdvYWwgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIHNvdXJjZXMgdW5kZXIKKyAgICAgICAgICAgICAgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC8gd2lsbCBjb25zdGl0dXRlIGEgc3RhbmRhbG9uZSBjb21wb25lbnQKKyAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGFzIGEgc3RhbmRhbG9uZSBsaWJyYXJ5LCB0aGF0IGRvZXNuJ3QKKyAgICAgICAgICAgICAgIGRlcGVuZCBvbiB0aGUgUUVNVSBjb2RlLCBvciBpdHMgZGVwZW5kZW5jaWVzIChlLmcuIEdMaWIpLgorCisgICAgICAgICAgICAgICBVbHRpbWF0ZWx5LCB3ZSBwbGFuIHRvIGxpbmsgdGhlIFFFTVUyIGNvZGUgYmFzZSB0byB0aGUgc2FtZQorICAgICAgICAgICAgICAgbGlicmFyeSwgaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBzYW1lIGZlYXR1cmUgc2V0IGZvciBib3RoIHRoZQorICAgICAgICAgICAgICAgY2xhc3NpYyBhbmQgbmV3IGVtdWxhdG9yIGVuZ2luZXMuCisKKyAgV2hlbiBhZGRpbmcgbmV3IGNvZGUsIHRyeSBoYXJkIHRvOgorCisgICAgLSBBdm9pZCB1c2luZyBRRU1VLXNwZWNpZmljIGZ1bmN0aW9ucyBkaXJlY3RseS4gSXQncyBiZXR0ZXIgdG8gZGVjb3VwbGUKKyAgICAgIGEgJ2NsZWFuJyBmZWF0dXJlIGltcGxlbWVudGF0aW9uLCB3aGljaCBjYW4gYmUgdW5pdC10ZXN0ZWQgaW5kZXBlbmRlbnRseSwKKyAgICAgIGFuZCBhIFFFTVUtc3BlY2lmaWMgYmluZGluZyAvIHVzZXIgY29kZSBmb3IgaXQgKHdoaWNoIHdpbGwgdWx0aW1hdGVseQorICAgICAgYmUgcmUtaW1wbGVtZW50ZWQgZm9yIFFFTVUyIGFzIHdlbGwpLgorCisgICAgLSBBdm9pZCB1c2luZyBzeXN0ZW0gaW50ZXJmYWNlcyBkaXJlY3RseS4gVXNlIHRoZSBhYnN0cmFjdGlvbnMgcHJvdmlkZWQKKyAgICAgIGJ5IGFuZHJvaWQvYmFzZS8gYW5kIGFuZHJvaWQvdXRpbHMvIGluc3RlYWQsIHNpbmNlIHRoZXkgY2FuIG1vcmUgZWFzaWx5CisgICAgICBiZSBtb2NrZWQgZHVyaW5nIHVuaXQtdGVzdHMsIG1ha2luZyBvdXIgcmVncmVzc2lvbiB0ZXN0IHN1aXRlIG1vcmUKKyAgICAgIHJvYnVzdCAvIGxlc3MgZGVwZW5kZW50IG9uIGhvc3QvZGV2ZWxvcG1lbnQgc3lzdGVtIHNwZWNpZmljcy4KKworICBUaGUgc3R5bGUgZ3VpZGUgYXBwbGllcyB0byBhbnkgbmV3IGNvZGUgeW91IHdhbnQgdG8gYWRkIHVuZGVyCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC8gdGhhdCBzaG91bGQgbm90IGRlcGVuZCBvbiBRRU1VLXNwZWNpZmljIGhlYWRlcnMgYW5kCisgIGRlY2xhcmF0aW9ucy4KKworCisgIEZpbmFsbHksIHdoZW4gYWRkaW5nIG5ldyBjb2RlLCBmYXZvciBDKysgb3ZlciBDIGlmIHlvdSBjYW4uIFRoZSByZWFzb24gaXMKKyAgdGhhdCBpdCdzIGVhc2llciB0byBwcm92aWRlIGFic3RyYWN0IC8gbW9ja2FibGUgaW50ZXJmYWNlcyBpbiB0aGlzIGxhbmd1YWdlCisgIGNvbXBhcmVkIHRvIEMuIFRoaXMgbGVhZHMgdG8gYmV0dGVyIGRlLWNvdXBsaW5nIGFuZCB1bml0LXRlc3RzLgorCisKK0lJSS4gUnVsZXM6CistLS0tLS0tLS0tLQorCitBcyBzYWlkIHByZXZpb3VzbHksIGlmIHNvbWV0aGluZyBpcyBub3Qgc3BlY2lmaWVkIGhlcmUsIGZhbGwgYmFjayB0byB0aGUKK291dHB1dCBvZiBjbGFuZy1mb3JtYXQgb3IgdGhlIENocm9taXVtIGNvZGluZyBzdHlsZSBndWlkZSBhdCBbMV0sIG90aGVyd2lzZQorYXNrIG9uIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0IGZvciBpbmZvcm1hdGlvbi4KKworMS4gQmFzaWMgQ29kZSBGb3JtYXR0aW5nOgorCisgIE5PVEU6IE1vc3Qgb2YgdGhlc2Ugc2hvdWxkIGJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSAnZ2l0IGNsYW5nLWZvcm1hdCcgISEKKyAgICAgICAgKFNlZSBkZWRpY2F0ZWQgc2VjdGlvbiBiZWxvdykuCisKKyAgLSBObyBUQUJzIGluIHNvdXJjZSBjb2RlIGFsbG93ZWQgKGV4Y2VwdCBmb3IgTWFrZWZpbGVzKS4KKyAgICBSYXRpb25hbGU6IExpZmUgaXMgdG9vIHNob3J0IHRvIHBsYXkgd2l0aCBlZGl0b3Igc2V0dGluZ3MgYWxsIHRoZSB0aW1lLgorCisgIC0gSW5kZW50IHdpZHRoIGlzIDQgY2hhcmFjdGVycy4KKyAgICBSYXRpb25hbGU6IExldCdzIGNob29zZSBvbmUgcmVhc29uYWJsZSBkZWZhdWx0IGFuZCBzdGljayB3aXRoIGl0LgorCisgIC0gQ29udGludWF0aW9uIGluZGVudGF0aW9uIHNob3VsZCBiZSA4IGNoYXJhY3RlcnMuCisgICAgUmF0aW9uYWxlOiBUaGlzIG1ha2VzIGl0IHNsaWdodGx5IGVhc2llciB0byBkZXRlY3QgdGhhdCB0aGUgc2Vjb25kIGxpbmUKKyAgICAgICAgICAgICAgIGlzIHJlYWxseSB0aGUgY29udGludWF0aW9uIGZyb20gdGhlIGZpcnN0IG9uZS4KKworICAgIEUuZy46CisKKyAgICBbWUVTXQorICAgICAgICAgU29tZVN1cGVyTG9uZ1R5cGVOYW1lIHNvbWVTdXBlckxvbmdWYXJpYWJsZU5hbWUgPQorICAgICAgICAgICAgICAgICBDcmVhdGVBbkluc3RhbmNlT2ZTb21lU3VwZXJMb25nVHlwZU5hbWUod2l0aFBhcmFtZXRlcik7CisKKyAgICBbTk9dCisgICAgICAgICBTb21lU3VwZXJMb25nVHlwZU5hbWUgc29tZVN1cGVyTG9uZ1ZhcmlhYmxlTmFtZSA9CisgICAgICAgICAgICAgQ3JlYXRlQW5JbnN0YW5jZU9mU29tZVN1cGVyTG9uZ1R5cGVOYW1lKHdpdGhQYXJhbWV0ZXIpOworCisgIC0gU3RhdGljIHdvcmQgd3JhcCBhdCA4MCBjaGFyYWN0ZXJzLgorICAgIFJhdGlvbmFsZTogVGhhdCdzIGdvb2QgZW5vdWdoLCBsZXQncyBub3QgZmlnaHQgYWJvdXQgaXQuCisKKyAgLSBPbmUgc3BhY2UgYXJvdW5kIGVhY2ggYmluYXJ5IG9wZXJhdG9yLCBlLmcuOgorCisgICAgICAgeCA9IHkgKyB6IC0gNDsKKworICAtIFRoZSBvcGVuaW5nIGN1cmx5IGJyYWNlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIGUuZy46CisKKyAgICAgICB2b2lkIGZvbyhpbnQgeCkgeworICAgICAgICAgIHJldHVybiB4ICsgNDI7CisgICAgICAgfQorCisgICAgUmF0aW9uYWxlOiBMZXQncyBqdXN0IGNob29zZSBvbmUgY29udmVudGlvbiwgdGhpcyBvbmUgc2F2ZXMgYSBsaXR0bGUKKyAgICAgICAgICAgICAgIHZlcnRpY2FsIHNwYWNlLgorCisgIC0gU2luZ2xlLXN0YXRlbWVudHMgY29uZGl0aW9uYWxzIGNhbiBnbyBpbnRvIGEgc2luZ2xlIGxpbmUsIGFuZCBhbHdheXMgdXNlCisgICAgYWNjb2xhZGVzOgorCisgICAgICAgIGlmIChlcnJvcikgeyAgICAgICAgICAgICAgIFtZRVNdCisgICAgICAgICAgICByZXR1cm4gRU5PUEU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuIEVOT1BFOyB9ICAgW1lFU10KKworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICByZXR1cm4gRU5PUEU7ICAgICAgICAgW05PXQorCisgICAgICAgIGlmIChlcnJvcikgcmV0dXJuIEVOT1BFOyAgW05PXQorCisgICAgICAgIGlmIChlcnJvcikgeyByZXR1cm4gRU5PUEU7IH0gZWxzZSB7IHJldHVybiAwOyB9ICBbTk9dICAvLyBub3Qgc2luZ2xlLXN0YXRlbWVudAorCisgICAgICAgIGlmIChlcnJvcikgeyAgICAgICAgICAgIFtZRVNdCisgICAgICAgICAgICByZXR1cm4gRU5PUEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlcnJvciA/IEVOT1BFIDogMDsgICBbWUVTXQorCisgICAgUmF0aW9uYWxlOiBSZWR1Y2VzIHRoZSBjaGFuY2Ugb2YgaW50cm9kdWNpbmcgc3VidGxlIGJ1ZyBsYXRlciB3aGVuCisgICAgICAgICAgICAgICBhZGRpbmcgbW9yZSBzdGF0ZW1lbnRzLiBTYWRseSB0aGlzIHN0aWxsIGhhcHBlbnMgb2NjYXNpb25hbGx5CisgICAgICAgICAgICAgICB0byBldmVyeW9uZS4KKworICAtIFRoZSBjbG9zaW5nIGN1cmx5IGJyYWNlIHNob3VsZCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGl0cyBvd24gbGluZSwgb3IgYXQKKyAgICB0aGUgZW5kIG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIG9wZW5pbmcgYnJhY2U6CisKKyAgICBFLmcuOgorICAgICAgICBGb286OkZvbygpIHt9ICAgICAgICAgW1lFU10KKworICAgICAgICBpZiAoY29uZCkgeyAgICAgICAgICAgW1lFU10KKyAgICAgICAgICAgIGRvU3R1ZmZBKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb1N0dWZmQigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmQpIHsgcmV0dXJuIGVycm9yOyB9ICBbWUVTXQorCisgIC0gVGhlICogYW5kICYgZ28gYnkgdGhlIHR5cGUgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIG5hbWUsIGUuZy46CisKKyAgICAgICB2b2lkIGZvbyhjb25zdCBjaGFyKiBzdHIpOyAgICAgICBbWUVTXQorICAgICAgIHZvaWQgZm9vKGNvbnN0IGNoYXIgKiBzdHIpOyAgICAgIFtOT10KKyAgICAgICB2b2lkIGZvbyhjb25zdCBjaGFyICpzdHIpOyAgICAgICBbTk9dCisKKyAgICBSYXRpb25hbGU6IGl0J3MgbW9yZSBsb2dpY2FsIHNpbmNlIHRoZXkncmUgcmVhbGx5IHBhcnQgb2YgdGhlIHR5cGUuCisKKyAgICBTcGVjaWFsIGV4Y2VwdGlvbjogYSBzcGFjZSBpcyBhbGxvd2VkIGZvciBjYXN0cywgYXMgaW46CisKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihmb28pOyAgIFtZRVNdCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGZvbyk7ICBbWUVTXQorCisgICAgQmVjYXVzZSB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgdGhhdCB0aGlzIGlzIHBhcnQgb2YgdGhlIHR5cGUuCisKKworICAtIERvbid0IGluZGVudCB3aXRoaW4gbmFtZXNwYWNlcywgYW5kIGFsd2F5cyBhZGQgYSBjb21tZW50IHdoZW4gY2xvc2luZyBvbmUsCisgICAgd2hpY2ggc2hvdWxkIGJlIGV4YWN0bHk6ICd9JyArIDIgc3BhY2VzICsgJy8vIG5hbWVzcGFjZScgZXZlbnR1YWxseQorICAgIGZvbGxvd2VkIGJ5IHRoZSBuYW1lc3BhY2UgbmFtZSBpZiBhbnksIGUuZy46CisKKyAgICBbR09PRF0KKworICAgICAgICBuYW1lc3BhY2UgYW5kcm9pZCB7CisgICAgICAgIG5hbWVzcGFjZSBmb28geworCisgICAgICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyBpbnNpZGUgYW5vbnltb3VzIG5hbWVzcGFjZQorCisgICAgICAgIH0gIC8vIG5hbWVzcGFjZSAgICAgICAgICAgIDwtLS0gZGVjbGFyZSBlbmQgb2YgYW5vbnltb3VzIG5hbWVzcGFjZQorCisgICAgICAgIC8vIERlY2xhcmVzIGFuZHJvaWQ6OmZvbzo6Rm9vCisgICAgICAgIGNsYXNzIEZvbyB7CisgICAgICAgICAgIC4uLgorICAgICAgICB9OworCisgICAgICAgIH0gIC8vIG5hbWVzcGFjZSBmb28KKyAgICAgICAgfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCisgIC0gQysrIG1lbWJlciBpbml0aWFsaXphdGlvbiBpbiBjb25zdHJ1Y3RvcnMgc2hvdWxkIGhhcHBlbiBlaXRoZXIgb24gYSBzaW5nbGUKKyAgICBsaW5lLCBvciB1c2Ugb25lIGxpbmUgcGVyIG1lbWJlciwgd2l0aCBtZW1iZXIgaW5pdGlhbGl6YXRpb25zIGFsaWduZWQKKyAgICBhZnRlciB0aGUgY29sb24sIGUuZy46CisKKyAgICAgICAgIGNsYXNzIEZvbyB7CisgICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAgRm9vKCkKKyAgICAgICAgICAgICAgICAgOiBtRmlyc3RNZW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICBtU2Vjb25kTWVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgbVRoaXJkTWVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgbUZvdXJ0aE1lbWJlcigpIHt9CisgICAgICAgICAgICAuLi4uCisgICAgICAgIH07CisKKzIuIE5hbWluZzoKKworICAtIEMrKyBjbGFzcy9zdHJ1Y3QgbmFtZXMgZm9sbG93ICdDYXBpdGFsQ2FtZWxDYXNlJworCisgIC0gQysrIEZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBmb2xsb3cgJ2xvd2VyQ2FtZWxDYXNlKCknCisKKyAgLSBDKysgQ2xhc3MgbWVtYmVyIG5hbWVzIGJlZ2luIHdpdGggYW4gJ20nIHByZWZpeCwgYXMgaW4gbUZvbywgbUJhciwgLi4uCisKKyAgLSBGb3IgQysrIHN0cnVjdHMgdGhhdCBhcmUgUE9EIHR5cGVzIChpLmUuIG5vIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IvdmlydHVhbAorICAgIG1ldGhvZHMgYW5kIHByaXZhdGUgbWVtYmVycyksIHlvdSBjYW4gdXNlICdsb3dlckNhbWVsQ2FzZScgaW5zdGVhZCBmb3IKKyAgICAobmVjZXNzYXJpbHkgcHVibGljKSBtZW1iZXJzLgorCisgIC0gQysrIHZhcmlhYmxlcyBuYW1lcyB1c2UgJ2xvd2VyQ2FtZWxDYXNlJyBvciAnbG93ZXJfdW5kZXJzY29yZV9zcGFjaW5nJyB0bworICAgIHlvdXIgY29udmVuaWVuY2UuCisKKyAgLSBDIHR5cGVzIG5hbWVzIGZvbGxvdyAnQ2FwaXRhbENhbWVsQ2FzZScgYXMgd2VsbC4KKworICAtIEMgZnVuY3Rpb25zIHNob3VsZCBwcmVmZXJhYmx5IHVzZSAnbG93ZXJDYW1lbENhc2UnLiBTb21ldGltZXMgYW4gdW5kZXJzY29yZQorICAgIGNhbiBiZSB1c2VkIHRvIHByZWZpeCBhIGZhbWlseSBvZiByZWxhdGVkIGZ1bmN0aW9ucyB0aG91Z2gsIGFzIGluOgorCisgICAgICAgICAgc2FuZHdpY2hfZ3JhYkNvbmRpbWVudHMoKQorICAgICAgICAgIHNhbmR3aWNoX2FkZFNhdWNlKCkKKyAgICAgICAgICBzYW5kd2ljaF9wdXRCcmVhZCgpCisKKyAgLSBXaGVuIGltcGxlbWVudGluZyAnQyB3aXRoIGNsYXNzZXMnLCBmb2xsb3cgJ29iamVjdFR5cGVfbWV0aG9kTmFtZScsCisgICAgYW5kIGRpc3Rpbmd1aXNoIGJldHdlZW4gZnVuY3Rpb25zIHRoYXQgYWxsb2NhdGUgb2JqZWN0cyBpbiB0aGUgaGVhcCwKKyAgICBhbmQgdGhvc2UgdGhhdCBvbmx5IGluaXRpYWxpemUgdGhlbSBpbiBwbGFjZS4KKworICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vQmFyIEZvb0JhcjsKKworICAgICAgICAgRm9vQmFyKiBmb29CYXJfbmV3KCk7ICAgICAgICAgICAgICAgICAgICAgLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUuCisgICAgICAgICB2b2lkIGZvb0Jhcl9mcmVlKEZvb0JhciogZm9vQmFyKTsgICAgICAgICAvLyBGaW5hbGl6ZSBhbmQgcmVsZWFzZS4KKyAgICAgICAgIHZvaWQgZm9vQmFyX3Jlc2V0Q29sb3IoRm9vQmFyKiBmb29CYXIsIGludCBuZXdDb2xvcik7CisKKyAgICAgICAgIC8vIE5PVEU6IF9jcmVhdGUoKSBhbmQgX2Rlc3Ryb3koKSBhcmUgYWxzbyB2YWxpZCBzdWZmaXhlcyBmb3IKKyAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IGFsc28gcGVyZm9ybSBoZWFwIGFsbG9jYXRpb24vcmVsZWFzZXMuCisKKyAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgICAgICAuLi4gZmllbGQgZGVjbGFyYXRpb25zLgorICAgICAgICAgfSBab287CisKKyAgICAgICAgIHZvaWQgem9vX2luaXQoWm9vKiBiYXIsIC4uLik7ICAvLyBJbml0aWFsaXplIGluc3RhbmNlIGluIHBsYWNlLgorICAgICAgICAgdm9pZCB6b29fZG9uZShab28qIGJhcik7ICAgICAgIC8vIEZpbmFsaXplIGluc3RhbmNlLgorCisgICAgTk9URTogVGhlICd0aGlzJyBwYXJhbWV0ZXIgYWx3YXlzIGNvbWVzIGZpcnN0LgorCisgIC0gQysrIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgbmFtZWQgYWNjb3JkaW5nIHRvIHRoZSBtYWluIGNsYXNzIHRoZXkgZGVjbGFyZQorICAgIGFuZCBmb2xsb3cgJ0NhcGl0YWxDYW1lbENhc2UuaCcuCisKKyAgICBDIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgbmFtZWQgc2ltaWxhcmx5LCBidXQgc2hvdWxkIHVzZQorICAgICdsb3dlcl91bmRlcnNjb3JlX3NwYWNpbmcuaCcgaW5zdGVhZC4gVGhhdCdzIGFjdHVhbGx5IGEgc2ltcGxlIHdheSB0bworICAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBib3RoIGhlYWRlciB0eXBlcy4KKworICAtIERvbid0IHVzZSBoZWFkZXIgaW5jbHVzaW9uIGd1YXJkIG1hY3JvcywgdXNlICcjcHJhZ21hIG9uY2UnIHNpbmNlIGl0J3MKKyAgICBzdXBwb3J0ZWQgYnkgYWxsIG91ciBjb21waWxlcnMgbm93LiBJLmUuCisKKyAgICAgICAgLy8gQ29weXJpZ2h0IGRpc2NsYWltZXIgYmxhaCBibGFoCisgICAgICAgIC8vIC4uLi4KKworICAgICAgICAjcHJhZ21hIG9uY2UKKworICAgICAgICAuLi4gZGVjbGFyYXRpb25zCisKKyAgICBJbnN0ZWFkIG9mOgorCisgICAgICAgIC8vIENvcHlyaWdodCBkaXNjbGFpbWVyIGJsYWggYmxhaAorICAgICAgICAvLyAuLi4uCisKKyAgICAgICAgI2lmbmRlZiBBTkRST0lEX1NUVUZGX0ZPT19CQVJfSAorICAgICAgICAjZGVmaW5lIEFORFJPSURfU1RVRkZfRk9PX0JBUl9ICisKKyAgICAgICAgLi4uIGRlY2xhcmF0aW9ucworCisgICAgICAgICNlbmRpZiAgLy8gQU5EUk9JRF9TVFVGRl9GT09fQkFSX0gKKworICAtIEMrKyBuYW1lc3BhY2UgbmFtZXMgYXJlICdhbGxfbG93ZXJjYXNlJywgYW5kIGF2b2lkIHVzaW5nIHVuZGVyc2NvcmVzCisgICAgaWYgcG9zc2libGUuIE5lc3RlZCBuYW1lc3BhY2VzIGFyZSBvaywgYnV0IHVzZSAnYW5kcm9pZCcgYXMgdGhlIHRvcC1sZXZlbAorICAgIG9uZSB0byBhdm9pZCBjb25mbGljdHMgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIG5lZWQgdG8gaW5jbHVkZSBoZWFkZXJzIGZyb20KKyAgICBvdGhlciB0aGlyZC1wYXJ0eSBDKysgbGlicmFyaWVzIChlLmcuICdhbmRyb2lkOjpiYXNlJywgJ2FuZHJvaWQ6OnRlc3RpbmcnLAorICAgIGV0YykKKworICAtIEMrKyBjb25zdGFudHMgbGlrZSB1bnNjb3BlZCBlbnVtIHZhbHVlcyBhbmQgc3RhdGljIGNoYXJhY3RlciBhcnJheXMKKyAgICBzaG91bGQgYmUgbmFtZWQgdXNpbmcgYSAnaycgcHJlZml4IGZvbGxvd2VkIGJ5IENhbWVsQ2FzZSwgYXMgaW46CisKKyAgICAgICBlbnVtIE1vZGUgeworICAgICAgICAgIGtSZWFkID0gMSA8PCAwLAorICAgICAgICAgIGtXcml0ZSA9IDEgPDwgMSwKKyAgICAgICAgICBrUmVhZFdyaXRlID0ga1JlYWQgfCBrV3JpdGU7CisgICAgICAgfTsKKworICAgICAgIHN0YXRpYyBjaGFyIGtTdHJpbmdbXSA9ICJIZWxsbyBXb3JsZCI7CisKKyAgICBOb3RlIHRoYXQgc2NvcGVkIGVudW1zIChhLmsuYS4gJ2VudW0gY2xhc3NlcycpIGRvbid0IG5lZWQgdGhlIGsgUHJlZml4CisgICAgYnV0IHNob3VsZCBzdGlsbCB1c2UgQ2FtZWxDYXNpbmcgYXMgaW46CisKKyAgICAgICBlbnVtIGNsYXNzIE1vZGUgeworICAgICAgICAgICBSZWFkID0gMSA8PCAwLCAgICAgICAgICAgICAgICAgICAgLy8gTW9kZTo6UmVhZAorICAgICAgICAgICBXcml0ZSA9IDEgPDwgMSwgICAgICAgICAgICAgICAgICAgLy8gTW9kZTo6V3JpdGUKKyAgICAgICAgICAgUmVhZFdyaXRlID0gUmVhZCB8IFdyaXRlICAgICAgICAgIC8vIE1vZGU6OlJlYWRXcml0ZQorICAgICAgIH07CisKKzMuIENvbW1lbnRzOgorCisgIC0gRmF2b3IgQysrIHN0eWxlIGNvbW1lbnRzIGV2ZW4gaW4gQyBzb3VyY2UgZmlsZXMuCisKKyAgICBSYXRpb25hbGU6IFRoZXkgYXJlIGVhc2llciB0byBlZGl0LCBhbmQgYWxsIHJlY2VudCBDIHRvb2xjaGFpbnMgc3VwcG9ydAorICAgICAgICAgICAgICAgdGhlbiBub3cuCisKKyAgLSBXaGVuIGRlY2xhcmluZyBhIG5ldyBDKysgY2xhc3MsIGJlZ2luIHdpdGggYSBjb21tZW50IGV4cGxhaW5pbmcgaXRzCisgICAgcHVycG9zZSBhbmQgYSB1c2FnZSBleGFtcGxlLiBEb24ndCBjb21tZW50IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiB0aG91Z2guCisKKyAgLSBEb2N1bWVudCBlYWNoIHBhcmFtZXRlciBhbmQgdGhlIHJlc3VsdCBvZiBlYWNoIGZ1bmN0aW9uIG9yIG1ldGhvZC4KKyAgICBVc2UgfHBhcmFtTmFtZXwgbm90YXRpb24gdG8gZGVub3RlIGEgZ2l2ZW4gcGFyYW1ldGVyLCBvciBleHByZXNzaW9uIHRoYXQKKyAgICB1c2VzIHRoZSBwYXJhbWV0ZXIgaW5zaWRlIHRoZSBjb21tZW50IHRvIG1ha2UgaXQgY2xlYXJlci4KKworICAtIEluc2lkZSB0aGUgY29kZSwgdXNlIGNvbW1lbnRzIHRvIGRlc2NyaWJlIHRoZSBjb2RlJ3MgaW50ZW5kZWQgYmVoYXZpb3VyLAorICAgIG5vdCB0aGUgZXhhY3QgaW1wbGVtZW50YXRpb24uIEFueXRoaW5nIHRoYXQgaXMgc3VidGxlIHNob3VsZCBoYXZlIGEgY29tbWVudAorICAgIHRoYXQgZXhwbGFpbiB3aHkgdGhpbmdzIGFyZSB0aGUgd2F5IHRoZXkgYXJlLCBpbmNsdWRpbmcgdGVtcG9yYXJ5IGJhbmQtYWlkcywKKyAgICB3b3JrLWFyb3VuZHMgYW5kICdjbGV2ZXIgaGFja3MnIHRvIGhlbHAgZnV0dXJlIG1haW50ZW5hbmNlLgorCisgIC0gVHJ5IHRvIGFkZCBjb21tZW50cyBhZnRlciAjZWxzZSBhbmQgI2VuZGlmIGRpcmVjdGl2ZXMgdG8gaW5kaWNhdGUgd2hhdAorICAgIHRoZXkgcmVsYXRlIHRvLCBhcyBpbjoKKworICAgICAgICNpZmRlZiBfV0lOMzIKKyAgICAgICAuLi4KKyAgICAgICAjZW5kaWYgIC8vICFfV0lOMzIKKworICAgICAgICNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfV0lOMzIpCisgICAgICAgLi4uCisgICAgICAgI2Vsc2UgIC8vICFfX2xpbnV4X18gJiYgIV9XSU4zMiAgICA8LS0gTk9URTogY29uZGl0aW9uIGludmVydGVkIG9uICNlbHNlCisgICAgICAgLi4uCisgICAgICAgI2VuZGlmICAvLyAhX19saW51eF9fICYmICFfV0lOMzIKKworCis0LiBIZWFkZXIgYW5kIG9yZGVyaW5nOgorCisgIFdoZW4gaW5jbHVkaW5nIGhlYWRlciBmaWxlcywgZm9sbG93IHRoaXMgb3JkZXI6CisKKyAgLSBFYWNoIHNvdXJjZSBmaWxlIHNob3VsZCBmaXJzdCBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZSBpdCByZWxhdGVzIHRvLAorICAgIHVzaW5nICIiIG5vdGF0aW9uLCB3aXRoIHBhdGggcmVsYXRpdmUgdG8gZXh0ZXJuYWwvcWVtdS8uCisKKyAgICBGb3IgZXhhbXBsZSwgdGhlIHNvdXJjZSBmaWxlICdhbmRyb2lkL215ZmVhdHVyZS9Gb28uY3BwJyBtaWdodCB1c2U6CisKKyAgICAgICAgI2luY2x1ZGUgImFuZHJvaWQvbXlmZWF0dXJlL0Zvby5oIiAgICBbWUVTXQorCisgICAgQnV0IG5vdDoKKworICAgICAgICAjaW5jbHVkZSA8YW5kcm9pZC9teWZlYXR1cmUvRm9vLmg+ICAgIFtOT10KKyAgICAgICAgI2luY2x1ZGUgIkZvby5oIiAgICAgICAgICAgICAgICAgICAgICBbTk9dCisKKyAgICBSYXRpb25hbGU6ICBJZiB5b3UgZW5kIHVwIG5vdCBpbmNsdWRpbmcgYSByZXF1aXJlZCBoZWFkZXIgaW4KKyAgICB5b3VyX2ZhbmN5X21vZHVsZS5oLCB0aGVuIHlvdSBjYXRjaCB0aGF0IG1pc3Rha2Ugd2hpbGUgdHJ5aW5nIHRvCisgICAgY29tcGlsZSB5b3VyX2ZhbmN5X21vZHVsZS5jLCBpbnN0ZWFkIG9mIHNvbWVvbmUgZWxzZSBoaXR0aW5nIGl0IGxhdGVyCisgICAgd2hlbiBpbmNsdWRpbmcgeW91cl9mYW5jeV9tb2R1bGUuaCBpbiB0aGVpciBjbGllbnQgY29kZS4KKworICAtIFRoZW4gbGlzdCBhbGwgb3RoZXIgaGVhZGVycyBmcm9tIHRoZSBhbmRyb2lkLyBzdWItZGlyZWN0b3J5LAorICAgIHVzZSBjYXNlLWluc2Vuc2l0aXZlICBhbHBoYWJldGljYWwgb3JkZXJpbmcgdG8gZG8gdGhpcywgd2l0aCAiIgorICAgIG5vdGF0aW9uLCBlLmcuOgorCisgICAgYW5kcm9pZC9teWZlYXR1cmUvQXBpLmNwcDoKKworICAgICAgICAjaW5jbHVkZSAiYW5kcm9pZC9teWZlYXR1cmUvQXBpLmgiCisKKyAgICAgICAgI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9Mb2cuaCIKKyAgICAgICAgI2luY2x1ZGUgImFuZHJvaWQvbXlmZWF0dXJlL0hlbHBlci5oIgorICAgICAgICAjaW5jbHVkZSAiYW5kcm9pZC9vdGhlckZlYXRoZXIuaCIKKworICAtIEZvbGxvd2VkIGJ5IGFsbCBoZWFkZXJzIGZyb20gdGhpcmQtcGFydHkgbGlicmFyaWVzLCB1c2luZyA8PiBub3RhdGlvbi4KKyAgLSBGb2xsb3dlZCBieSBhbGwgc3lzdGVtIGhlYWRlcnMsIHVzaW5nIDw+IG5vdGF0aW9uLgorCisgIFNlcGFyYXRlIGVhY2ggaGVhZGVyIGdyb3VwIHdpdGggYW4gZW1wdHkgbGluZS4KKworCis1LiBVbm5hbWVkIG5hbWVzcGFjZXM6CisKKyAgQ29udHJhcnkgdG8gdGhlIENocm9taXVtIHN0eWxlIGd1aWRlLCBhdm9pZCB0aGVtIGlmIHlvdSB3YW50LgorCisgIFJhdGlvbmFsZTogVGhlaXIgbWFpbiBkcmF3YmFjayBpcyB0aGF0IGl0J3MgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBzZXQKKyAgYnJlYWtwb2ludHMgaW50byBmdW5jdGlvbnMgdGhhdCBhcmUgZGVmaW5lZCBpbnRvIGFub255bW91cyBuYW1lc3BhY2VzIHdpdGgKKyAgR0RCIGR1cmluZyBkZWJ1Z2dpbmcuIEkuZS4geW91IG5lZWQgdG8gbWFudWFsbHkgcXVvdGUgdGhlIGZ1bGwgdHlwZSB3aXRoICgiKSwKKyAgYW5kIGF1dG8tY29tcGxldGlvbiBkb2Vzbid0IHdvcmsuIFRoaXMgaXMgcmVhbGx5IG5vdCBjb29sIHdoZW4geW91J3JlIGFscmVhZHkKKyAgaGF2aW5nIGEgaGFyZCB0aW1lIHRyeWluZyB0byB1bmRlc3RhbmQgd2h5IHNvbWV0aGluZyBkb2Vzbid0IHdvcmsuCisKKyAgSW50ZXJuYWwgZnVuY3Rpb25zIGRlY2xhcmVkIHdpdGggJ3N0YXRpYycgZG9uJ3QgaGF2ZSB0aGlzIHByb2JsZW0uCisKKyAgSXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8gcHV0IHdob2xlIGludGVybmFsIGNsYXNzZXMgZGVjbGFyYXRpb25zIGluc2lkZQorICB1bm5hbWVkIG5hbWVzcGFjZXMgdGhvdWdoIHRvIGF2b2lkIGV4cG9ydGluZyBhbGwgaXRzIHN5bWJvbHMgaW4gdGhlCisgIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGUsIGFuZCB1c2UgYmV0dGVyIHJlbG9jYXRpb25zIGFzIHdlbGwsIGUuZy46CisKKyAgICAgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBjbGFzcyBNeVN1cGVyRHVwZXJDbGFzcyA6IHB1YmxpYyBCYXNlQ2xhc3MgeworICAgICAgICAgICAgLi4uLiAvLyBsb3RzIG9mIG1ldGhvZHMgaGVyZS4KKyAgICAgICAgfTsKKworICAgICAgICB9ICAvLyBuYW1lc3BhY2UKKworICAgICAgICBCYXNlQ2xhc3MqIGNyZWF0ZVN1cGVyRHVwZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlTdXBlckR1cGVyQ2xhc3MoKTsKKyAgICAgICAgfQorCisKKzYuIFBsYXRmb3JtLXNwZWNpZmljIGNvZGU6CisKKyAgV2UgZG9uJ3QgcHJvdmlkZSBPU19YWFggbWFjcm9zLCBzbyBjdXJyZW50bHkgdXNlIHRoZSBmb2xsb3dpbmcgY2hlY2tzIGZvcgorICBob3N0LXBsYXRmb3JtIGNvbmRpdGlvbmFsIGNoZWNrczoKKworICAgICAgICAjaWZkZWYgX1dJTjMyCisgICAgICAgIC4uLiBDb2RlIHNwZWNpZmljIHRvIDMyLWJpdCBhbmQgNjQtYml0IFdpbmRvd3MhCisgICAgICAgICNlbmRpZiAgLy8gX1dJTjMyCisKKyAgICAgICAgI2lmZGVmIF9fbGludXhfXworICAgICAgICAuLi4gQ29kZSBzcGVjaWZpYyB0byBMaW51eAorICAgICAgICAjZW5kaWYgIC8vIF9fbGludXhfXworCisgICAgICAgICNpZmRlZiBfX0FQUExFX18KKyAgICAgICAgLi4uIENvZGUgc3BlY2lmaWMgdG8gRGFyd2luIC8gT1MgWAorICAgICAgICAjZW5kaWYgIC8vIF9fQVBQTEVfXworCisgICAgICAgICNpZm5kZWYgX1dJTjMyCisgICAgICAgIC4uLiBDb2RlIHNwZWNpZmljIHRvIExpbnV4IG9yIERhcndpbi4KKyAgICAgICAgI2VuZGlmICAvLyAhX1dJTjMyCisKKyAgQnkgdGhlIHdheSwgcmVmZXIgdG8gT1MgWCBhcyAnZGFyd2luJyBpbnN0ZWFkIGluIHlvdXIgY29tbWVudHMgYW5kIHNvdXJjZQorICBmaWxlIG5hbWVzIGlmIHBvc3NpYmxlLgorCisKK0lWLiBBdXRvbWF0aWMgY29kZSBmb3JtYXR0aW5nIHdpdGggJ2dpdCBjbGFuZy1mb3JtYXQnOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZmlsZSBpcyBwcm92aWRlZCBhdCBleHRlcm5hbC9xZW11L2FuZHJvaWQvLmNsYW5nLWZvcm1hdCB0aGF0IGNvbnRhaW5zIHJ1bGVzCit0byBhcHBseSB3aXRoIHRoZSAnY2xhbmctZm9ybWF0JyB0b29sLiBNb3JlIHNwZWNpZmljYWxseSwgb25lIHNob3VsZCBkbyB0aGUKK2ZvbGxvd2luZyB0byBtYW51YWxseSByZWZvcm1hdCBlbnRpcmUgc291cmNlczoKKworICBjZCBleHRlcm5hbC9xZW11L2FuZHJvaWQvCisgIGNsYW5nLWZvcm1hdCAtc3R5bGU9ZmlsZSAtaSA8bGlzdC1vZi1maWxlcz4KKworVGhlICctc3R5bGU9ZmlsZScgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHRlbGwgY2xhbmctZm9ybWF0IHRvIHVzZSBvdXIKKy5jbGFuZy1mb3JtYXQgZmlsZSwgb3RoZXJ3aXNlLCBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIEdvb2dsZSBzdHlsZSB3aGljaAoraXMgcXVpdGUgZGlmZmVyZW50IQorCitZb3UgY2FuIGFsc28gdXNlIHRoZSAnZ2l0IGNsYW5nLWZvcm1hdCcgY29tbWFuZCwgdGhhdCB3aWxsIG9ubHkgcmVmb3JtYXQKK3RoZSBsaW5lcyB0aGF0IHlvdSBoYXZlIGN1cnJlbnRseSBtb2RpZmllZCBhbmQgYWRkZWQgdG8geW91ciBpbmRleCwgaG93ZXZlcgoreW91IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgZ2l0IHByb2plY3Qgb25jZSB0byBlbnN1cmUgaXQgdXNlcyB0aGUgLmNsYW5nLWZvcm1hdAorZmlsZSBwcm9wZXJseSwgd2l0aDoKKworICBnaXQgY29uZmlnIGNsYW5nZm9ybWF0LnN0eWxlIGZpbGUKKworVGhpcyBlbnN1cmVzIHRoYXQgZ2l0IHdpbGwgcGFzcyAnLXN0eWxlPWZpbGUnIHRvIGNsYW5nLWZvcm1hdCBlYWNoIHRpbWUgeW91CitjYWxsICdnaXQgY2xhbmctZm9ybWF0JyAod2hpY2ggaXRzZWxmIGNhbGxzIGdpdC1jbGFuZy1mb3JtYXQpLgorCisKK1YuIEMrKzExIGFuZCBiZXlvbmQKKworICBBcyBvZiBub3csIEMrKzExIGlzIGVuYWJsZWQgZm9yIGFsbCBwbGF0Zm9ybXMsIGFuZCBoZXJlJ3MgdGhlIGFsbG93ZWQKKyAgZmVhdHVyZXMgKGxpc3QgaXMgYWxzbyBiYXNlZCBvbiBDaHJvbWl1bSBzdHlsZSBbMV0sIGJ1dCBhIGxpdHRsZSBtb3JlCisgIHJlbGF4ZWQpOgorCiswLiBGaXJzdCBvZiBhbGwsIGJlIGNvbnNpc3RlbnQuCisKKyAgSWYgeW91J3JlIGVkaXRpbmcgc29tZSBvbGRlciBmaWxlIHdoaWNoIGhhcyBhIGJ1bmNoIG9mICd0eXBlZGVmJ3MsIGRvbid0IGp1c3QKKyAgdGhyb3cgJ3VzaW5nJyBpbiB0aGUgbWlkZGxlIG9mIHRoZW0uIEVpdGhlciBmb2xsb3cgdGhlIGV4aXN0aW5nIHBhdHRlcm4sIG9yCisgIHVwZ3JhZGUgYXJvdW5kIHlvdXIgY2hhbmdlLiBDb25zaXN0ZW5jeSBoZWxwcyB0aGUgcmVhZGVyIG11Y2ggbW9yZSB0aGFuIHNvbWUKKyAgc2luZ2xlIGZhbmN5IGZlYXR1cmUuCisKKzEuIGF1dG8KKworICBVc2UgYXV0byB3aGVuIHR5cGUgaXMgb2J2aW91cywgbm90IGltcG9ydGFudCBvciBoYXJkIHRvIHNwZWxsOgorCisgIGdvb2Q6CisgICAgIGF1dG8gaSA9IDA7CisgICAgIGF1dG8gZm9vID0gbmV3IEZvbygpOworICAgICBhdXRvIGl0ID0gbWFwLmJlZ2luKCk7CisKKyAgYmFkOgorICAgICBhdXRvIGYgPSBkb1NvbWVTdHVmZigpOworICAgICBvdGhlclN0dWZmKGYtPmJhcigpKTsKKworICBEb24ndCBmb3JnZXQgYWJvdXQgImF1dG8mIiBhbmQgImNvbnN0IGF1dG8mIiB0byBtYWtlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdAorICBjb3BpZWQgb3IgYWNjaWRlbnRhbGx5IG1vZGlmaWVkLgorCisyLiBmb3JlYWNoIGxvb3AKKworICBVc2UgdGhlIGZvcmVhY2ggbG9vcCBmb3IgaXRlcmF0aW9uIG92ZXIgZXZlcnl0aGluZyB5b3UgY2FuCisKKyAgIGludCB2YWx1ZXNbXSA9IHsxLDIsM307CisgICBmb3IgKGludCBpIDogdmFsdWVzKSB7CisgICAgICAgLi4uCisgICB9CisKKyAgVXNlIHRoZSBjb3JyZWN0IHJlZmVyZW5jZSBmb3JtIGZvciB0aGUgdmFyaWFibGUgKCYgb3IgY29uc3QgJik7IGRvbid0CisgIGp1c3QgdGhyb3cgJiYKKworMy4gVW5pZm9ybSBpbml0aWFsaXphdGlvbiBhbmQgaW5pdGlhbGl6ZXIgbGlzdHMKKworICBQcmVmZXIgdW5pZm9ybSBpbml0aWFsaXphdGlvbiBzeW50YXgge30gdG8gZGlzYW1idWdhdGUgdmFyaWFibGVzIGZyb20KKyAgZnVuY3Rpb25zIGFuZCBzdXBwcmVzcyBpbXBsaWNpdCB0eXBlIGNvbnZlcnNpb25zLgorCisgICAgaW50IGkgPSAxLjA7IC8vIGJhZCwgcHJlY2lzaW9uIGxvc3MKKyAgICBpbnQgaSA9IHsxLjB9OyAvLyBnb29kLCBjb21waWxlciBlcnJvcgorCisgICAgRm9vIGYoKTsgLy8gYmFkLCBmdW5jdGlvbiBmIHJldHVybmluZyBmb28gaW5zdGVhZCBvZiBhIHZhcmlhYmxlCisgICAgRm9vIGZ7fTsgLy8gZ29vZCwgZGVmYXVsdC1pbml0aWFsaXplZCB2YXJpYWJsZSBmCisKKzQuIHR5cGUgYWxpYXNlcworCisgIFByZWZlciAidXNpbmciIG92ZXIgInR5cGVkZWYiCisKKyAgIC8vIGVhc2llciB0byB1bmRlcnN0YW5kIC0gIj0iIHNwbGl0cyBhbGlhcyBhbmQgdGhlIGFjdHVhbCB0eXBlCisgICB1c2luZyBmID0gZm9vOjpiYXI6OmJhejsKKworICAgLy8gbXVjaCBzaW1wbGVyIGZvciBmdW5jdGlvbnMgdGhhbiB0eXBlZGVmZWQgdmVyc2lvbiAtCisgICAvLyB0eXBlZGVmIGNoYXIgKCpmdW5jKShibGFoKVsxMF07CisgICB1c2luZyBmdW5jID0gY2hhciAoKikoYmxhaClbMTBdOworCisgICAvLyB0eXBlZGVmIGNhbm5vdCBpbnRvIHRlbXBsYXRlcyA6KQorICAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgICB1c2luZyB2ZWM8VD4gPSBzdGQ6OnZlY3RvcjxULCBvdXJfc3VwZXJfZHVwZXJfYWxsb2NhdG9yPFQ+PjsKKworNS4gb3ZlcnJpZGUgYW5kIGZpbmFsCisKKyAgVXNlIHRoZXNlIG5ldyBrZXl3b3JkcyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvIG1ha2Ugc3VyZSB5b3VyIGRlcml2ZWQgY2xhc3MKKyAgYWN0dWFsbHkgb3ZlcnJpZGVzIHNvbWV0aW5nIGZyb20gYSBiYXNlIGNsYXNzLgorCis2LiBEZWZhdWx0ZWQgYW5kIGRlbGV0ZWQgbWVtYmVycworCisgIFByZWZlciAiPSBkZWZhdWx0IiBhbmQgIj0gZGVsZXRlIiBzeW50YXggb3ZlciB0aGUgZW1wdHkgYnJhY2VzIGFuZCBwcml2YXRlCisgIGRlY2xhcmF0aW9uLiBJdCBib3RoIGltcHJvdmVzIHJlYWRhYmlsaXR5IGFuZCBjb21waWxlciBtZXNzYWdlcy9nZW5lcmF0ZWQKKyAgY29kZS4KKyAgTm90ZTogeW91IGNhbiB1c2UgdGhpcyBzeW50YXggaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGU6CisKKyAgZm9vLmg6CisgICAgc3RydWN0IEZvbyB7CisgICAgICAgIEZvbygpOworICAgIH07CisKKyAgZm9vLmNwcDoKKyAgICBGb286OkZvbygpID0gZGVmYXVsdDsKKworNy4gQ2xhc3MgbWVtYmVyIGluaXRpYWxpemVycworCisgIFVzZSBtZW1iZXIgaW5pdGlhbGl6ZXJzIGluc3RlYWQgb2YgYSBzdGFuZGFsb25lIGNvbnN0cnVjdG9yIGlmIHRoYXQncyB0aGUKKyAgb25seSB0aGluZyBpdCBpcyBuZWVkZWQgZm9yLCBvciBpZiB0aGVyZSBhcmUgbWFueSBjb25zdHJ1Y3RvcnMgYWxsIHJlcXVpcmluZworICB0aGUgc2FtZSBtZW1iZXIgdmFsdWVzCisKKyAgIGNsYXNzIE1lb3cgeworICAgcHVibGljOgorICAgICAgIE1lb3coKSA9IGRlZmF1bHQ7CisKKyAgICAgICBNZW93KGludCBpKSA6IGkoaSkgeworICAgICAgIH0KKworICAgcHJpdmF0ZToKKyAgICAgICBpbnQgaSA9IDA7CisgICAgICAgaW50IGogPSAyOworICAgICAgIHN0ZDo6c3RyaW5nIG1lb3cgPSAibWVvdyI7CisgICB9OworCis4LiBTdHJvbmdseS10eXBlZCBlbnVtcworCisgIFByZWZlciBzY29wZWQgZW51bXMsIGEuay5hLiAiZW51bSBjbGFzc2VzIiwgb3ZlciB0aGUgb2xkIHVuc2NvcGVkIGVudW1zLgorICBJLmUuOgorCisgICAgIFtZRVNdCisgICAgIGVudW0gY2xhc3MgTW9kZSB7CisgICAgICAgICBSZWFkID0gMSA8PCAwLAorICAgICAgICAgV3JpdGUgPSAxIDw8IDEsCisgICAgICAgICBSZWFkV3JpdGUgPSAoMSA8PCAwKSB8ICgxIDw8IDEpLAorICAgICB9OworCisgICAgIFtOT10KKyAgICAgZW51bSBNb2RlIHsKKyAgICAgICAgIGtSZWFkID0gMSA8PCAwLAorICAgICAgICAga1dyaXRlID0gMSA8PCAxLAorICAgICAgICAga1JlYWRXcml0ZSA9IGtSZWFkIHwga1dyaXRlLAorICAgICB9OworCisgIE5vdGU6IFNjb3BlZCBlbnVtcyBoYXZlIG9uZSBkcmF3YmFjazogdGhleSBkbyBub3Qgc3VwcG9ydCBiaXR3aXNlIG9wZXJhdGlvbnMKKyAgICAgICAgd2hpY2ggYXJlIHR5cGljYWxseSBoYW5keSBmb3IgZGVhbGluZyB3aXRoIGJpdGZsYWdzLiBUaGVyZSBpcworICAgICAgICBmb3J0dW5hdGVseSBvbmUgc29sdXRpb24gZm9yIHRoaXMsIHdoaWNoIGlzIHRvIGluY2x1ZGUKKyAgICAgICAgImFuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaCIgaW4geW91ciBzb3VyY2UgZmlsZSwgYW5kIGFkZCB0aGUKKyAgICAgICAgZm9sbG93aW5nIGZsYWcgaWYgeW91J3JlIG5vdCBpbiB0aGUgYW5kcm9pZDo6YmFzZSBuYW1lc3BhY2U6CisKKyAgICAgICAgICAgI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9FbnVtRmxhZ3MuaCIKKworICAgICAgICAgICAuLi4KKworICAgICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OkVudW1GbGFncworCisKKzkuIHN0YXRpY19hc3NlcnQKKworICBVc2Ugd2hlcmUgcG9zc2libGUgb3ZlciB0aGUgcnVudGltZSBhc3NlcnQoKSBjYWxscworCisxMC4gUmF3IHN0cmluZyBsaXRlcmFscworCisgIFVzZSByYXcgc3RyaW5nIGxpdGVyYWxzIGZvciB0aGUgdGhpbmdzIHdoaWNoIG90aGVyd2lzZSBsb29rIGhvcnJpYmxlCisKKyAgICBhdXRvIHMgPSBSIih0ZXh0IHdpdGggbG90cyBvZiAiYmFkIiBjaGFyYWN0ZXJzXHhtbFxldGMKK2V2ZW4KKyBtYW55CisgIG5ld2xpbmVzKSI7CisKKzExLiBTVEwgdXBkYXRlcworCisgIFRFTVBPUkFSWTogbm8gQysrMTEgU1RMIGZlYXR1cmVzIHdvcmsgb24gTWFjIHdpdGggaXRzIGRlZmF1bHQgbGlicmFyeQorICB1bnRpbCB3ZSBzd2l0Y2ggdG8gbGliYysrLCBTVEwgaXMgbGltaXRlZCB0byBDKyswMworCisgIERJU0FCTEVEOiBGZWVsIGZyZWUgdG8gdXNlIGFsbCBuZXcgZmVhdHVyZXMgZnJvbSB0aGUgU1RMLCBidXQgbWFrZSBzdXJlIHRoZXkKKyAgRElTQUJMRUQ6IGFjdHVhbGx5IGNvbXBpbGUgYW5kIHdvcmsgb24gYWxsIHBsYXRmb3JtczogTGludXgsIE1hYyBhbmQgV2luZG93cy4KKyAgRElTQUJMRUQ6IFRha2UgZXh0cmEgY2FyZSB3aXRoIHRoZSBXaW5kb3dzIE1pbkdXIC0gaXQgdGVuZHMgdG8gbGFnIGZvciBxdWl0ZSBhIGxvdAorICBESVNBQkxFRDogY29tcGFyZSB0byBvdGhlcnMsIGUuZy4gc3RkOjp0aHJlYWQgaXMgc3RpbGwgdW5hdmFsaWFibGUgb3V0IG9mIHRoZSBib3gKKyAgRElTQUJMRUQ6IFNvbWV0aGluZyBtYXkgbm90IGNvbXBpbGUsIG90aGVycyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhIGxpdHRsZSBkaWZmZXJlbnRseS4KKyAgRElTQUJMRUQ6IERvIHlvdXIgZHVlIGRpbGlnZW5jZSBiZWZvcmUgYWN0dWFsbHkgc3VibWl0dGluZyB0aGUgY2hhbmdlLgorCisgIERJU0FCTEVEOiBQcmVmZXIgU1RMIGltcGxlbWVudGF0aW9ucyBvdmVyIGEgaGFuZHdyaXR0ZW4gY29kZSwgZS5nLiBzdGQ6OmF0b21pYywKKyAgRElTQUJMRUQ6IHN0ZCBzbWFydCBwb2ludGVycywgcmVnZXhlcywgZXRjCisKKzk5LiBsYW1iZGFzLCBub2V4Y2VwdCwgcnZhbHVlIHJlZmVyZW5jZXMsIG1vdmUgc2VtYW50aWNzLCBwZXJmZWN0IGZvcndhcmRpbmcsCisgICAgY29uc3RleHByCisKKyAgRG8gbm90IHVzZSB0aGUgZmVhdHVyZXMgbGlzdGVkIGhlcmUuCisKKyAgLi4udW5sZXNzOgorICAgIC0gWW91IG5lZWQgdG8gcmV0dXJuIGEgbW92ZS1vbmx5IHR5cGUsIGUuZy4gc3RkOjp1bmlxdWVfcHRyPD4uIFVzZQorICAgICAgc3RkOjptb3ZlKHZhcikgZm9yIHRoaXMgY2FzZS4KKworTUFYX0lOVC4gT3RoZXIgZmVhdHVyZXMgbm90IG1lbnRpb25lZCBoZXJlCisKKyAgSWYgdGhlcmUncyBzb21lIG1pc3NpbmcgZmVhdHVyZSB5b3UgbmVlZCwganVzdCBhZGQgaXQgdG8gdGhlIGxpc3QgYW5kIHNlbmQgYQorICBjb2RlIHJldmlldyB0byB0aGUgdGVhbS4KKworCitWLiBDb250cmlidXRpbmcgY29kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ0wgZGVzY3JpcHRpb25zIHNob3VsZCBmb2xsb3cgdGhlIGZvcm0gKGNvcGllZCBvZmYgb2YgWzJdKToKKworc3VibW9kdWxlOiBTdW1tYXJ5IG9mIGNoYW5nZSBwcmVmZXJhYmx5IDwgNjUgY2hhcnMsIHN1cmVseSA8IDgwCisKK0xvbmdlciBkZXNjcmlwdGlvbiBvZiBjaGFuZ2UgYWRkcmVzc2luZyBhcyBhcHByb3ByaWF0ZTogd2h5IHRoZSBjaGFuZ2UgaXMgbWFkZSwKK2NvbnRleHQgaWYgaXQgaXMgcGFydCBvZiBtYW55IGNoYW5nZXMsIGRlc2NyaXB0aW9uIG9mIHByZXZpb3VzIGJlaGF2aW9yIGFuZAorbmV3bHkgaW50cm9kdWNlZCBkaWZmZXJlbmNlcywgZXRjLgorCitMb25nIGxpbmVzIHNob3VsZCBiZSB3cmFwcGVkIHRvIDgwIGNvbHVtbnMgZm9yIGVhc2llciBsb2cgbWVzc2FnZSB2aWV3aW5nIGluCit0ZXJtaW5hbHMuCisKK0JVRz1iLmFuZHJvaWQuY29tLzEyMzQ1NgorVEVTVD1PcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0ZXN0IHN0ZXBzIHRvIGJlIHBlcmZvcm1lZCBieSBhIGh1bWFuIHRvIHZlcmlmeQorICAgICB0aGlzIHBhdGNoLiBUaGlzIGhlbHBzIGNoZXJyeS1waWNrIGNoYW5nZXMgbGF0ZXIuCisgICAgIEZvciBidWcgZml4ZXMsIGl0J3MgYSBtYW51YWwgcmVncmVzc2lvbiB0ZXN0IChvciBwcmVmZXJhYmx5LCBqdXN0ICJSdW4KKyAgICAgKG5ldykgdW5pdHRlc3RzIiA6KSApLiBGb3IgbmV3IGZlYXR1cmVzLCBzb21lIHNhbml0eSBjaGVja3MuCisKKworTS4gQXBwZW5kaXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1sxXSBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9jb2Rpbmctc3R5bGUKK1syXSBodHRwczovL3d3dy5jaHJvbWl1bS5vcmcvZGV2ZWxvcGVycy9jb250cmlidXRpbmctY29kZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0FORFJPSUQtQ09ORklHLUZJTEVTLlRYVCBiL2FuZHJvaWQvZG9jcy9BTkRST0lELUNPTkZJRy1GSUxFUy5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzYjU3YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9BTkRST0lELUNPTkZJRy1GSUxFUy5UWFQKQEAgLTAsMCArMSwxMDMgQEAKK0FuZHJvaWQgRW11bGF0b3IgQ29uZmlnIEZpbGUgRm9ybWF0czoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb246CistLS0tLS0tLS0tLS0tCisKK1RoZSBBbmRyb2lkIGVtdWxhdG9yIHN1cHBvcnRzIHNldmVyYWwgZmlsZSBmb3JtYXRzIGZvciBpdHMgY29uZmlndXJhdGlvbgorZmlsZXMsIGRlcGVuZGluZyBvbiBzcGVjaWZpYyB1c2FnZS4gVGhpcyBmaWxlIGRvY3VtZW50cyB0aGVtLgorCisKK0kuIEFuZHJvaWQgLmluaSBjb25maWd1cmF0aW9uIGZpbGVzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBjb2RlIGluIGFuZHJvaWQvdXRpbHMvaW5pLltoY10gaXMgdXNlZCB0byBzdXBwb3J0IGEgc2ltcGxlIC5pbmkgZmlsZQorZm9ybWF0IGZvciBzb21lIGNvbmZpZ3VyYXRpb24gZmlsZXMuIEhlcmUncyB0aGUgQk5GIGZvciBpdDoKKworICBmaWxlICAgICAgICAgICAgIDo9IDxsaW5lPioKKyAgbGluZSAgICAgICAgICAgICA6PSA8Y29tbWVudD4gfCA8TEY+IHwgPGFzc2lnbm1lbnQ+CisgIGNvbW1lbnQgICAgICAgICAgOj0gKCc7J3wnIycpIDxub0xGPiogPExGPgorICBhc3NpZ25tZW50ICAgICAgIDo9IDxzcGFjZT4qIDxrZXlOYW1lPiA8c3BhY2U+KiAnPScgPHNwYWNlPiogPHZhbHVlU3RyaW5nPiA8c3BhY2U+KiA8TEY+CisgIGtleU5hbWUgICAgICAgICAgOj0gPGtleU5hbWVTdGFydENoYXI+IDxrZXlOYW1lQ2hhcj4qCisgIGtleU5hbWVTdGFydENoYXIgOj0gW0EtWmEtel9dCisgIGtleU5hbWVDaGFyICAgICAgOj0gW0EtWmEtejAtOV8uLV0KKyAgdmFsdWVTdHJpbmcgICAgICA6PSA8bm9MRj4qCisgIHNwYWNlICAgICAgICAgICAgOj0gJyAnIHwgJ1x0JworICBMRiAgICAgICAgICAgICAgIDo9ICdcclxuJyB8ICdcbicgfCAnXHInCisgIG5vTEYgICAgICAgICAgICAgOj0gW148TEY+XQorCitPciwgaW4gcGxhaW4gRW5nbGlzaDoKKworIC0gTm8gc3VwcG9ydCBmb3Igc2VjdGlvbnMKKyAtIEVtcHR5IGxpbmVzIGFyZSBpZ25vcmVkLCBhcyB3ZWxsIGFzIGxpbmVzIGJlZ2lubmluZyB3aXRoICc7JyBvciAnIycKKyAtIExpbmVzIG11c3QgYmUgb2YgdGhlIGZvcm06ICI8a2V5TmFtZT4gPSA8dmFsdWU+IgorIC0gS2V5IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBvciBhbiB1bmRlcnNjb3JlCisgLSBPdGhlciBrZXkgbmFtZSBjaGFyYWN0ZXJzIGNhbiBiZSBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBkb3RzIG9yCisgICBkYXNoZXMKKworIC0gTGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UgYXJlIGFsbG93ZWQgYW5kIGlnbm9yZWQgYmVmb3JlL2FmdGVyIHRoZSBrZXkKKyAgIG5hbWUgYW5kIGJlZm9yZS9hZnRlciB0aGUgdmFsdWUKKworIC0gVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gdGhlIHZhbHVlLCBleGNlcHQgdGhhdCBpdCBjYW4ndCBjb250YWluCisgICBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlL3RhYiBjaGFyYWN0ZXJzIG9yIG5ld2xpbmUvY2hhcmZlZWQgY2hhcmFjdGVycworCisgLSBFbXB0eSB2YWx1ZXMgYXJlIHBvc3NpYmxlLCBhbmQgd2lsbCBiZSBzdG9yZWQgYXMgYW4gZW1wdHkgc3RyaW5nLgorIC0gQW55IGJhZGx5IGZvcm1hdHRlZCBsaW5lIGlzIGRpc2NhcmRlZCAoYW5kIHdpbGwgcHJpbnQgYSB3YXJuaW5nKQorCisKK0lJLiBBbmRyb2lkICdhY29uZmlnJyBjb25maWd1cmF0aW9uIGZpbGVzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsdGVybmF0aXZlbHksIGFub3RoZXIgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvZGUKK2luIGFuZHJvaWQvY29uZmlnLltoY10uIEl0cyBwdXJwb3NlIGlzIHRvIHN1cHBvcnQgZWFjaCBjb25maWcgZmlsZSBhcyBhCit0cmVlIG9mIGtleS92YWx1ZSBwYWlycy4gTW9yZSBzcGVjaWZpY2FsbHk6CisKKyAtIEVhY2gga2V5IG9yIHZhbHVlIGlzIGEgc3RyaW5nCisgLSBFYWNoIGtleSBjYW4gYmUgYXNzb2NpYXRlZCBlaXRoZXIgdG8gYSB2YWx1ZSwgb3IgYSBzdWItdHJlZQorIC0gQSAoa2V5LHZhbHVlKSBwYWlyIGlzIHdyaXR0ZW4gaW4gdGhlIGNvbmZpZyBmaWxlIGFzOgorCisgICAgICA8a2V5bmFtZT4gPHZhbHVlPgorCisgICB3aGljaCBtZWFucyB0aGUga2V5IG5hbWUsIHNvbWUgc3BhY2VzLCB0aGVuIHRoZSB2YWx1ZS4KKworIC0gRG90cyBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBrZXlzIGluIGEgdHJlZSBwYXRoLCBhcyBpbjoKKworICAgICBzb21lLm90aGVyLm5hbWUgICB2YWx1ZQorCisgICBjb3JyZXNwb25kaW5nIHRvIGEgdG9wLWxldmVsIGtleSBuYW1lZCAnc29tZScgd2l0aCBhIHNpbmdsZQorICAgc3ViLWtleSAnb3RoZXInIHdoaWNoIGl0c2VsZiBoYXMgYSBzdWIta2V5ICduYW1lJyBhc3NvY2lhdGVkIHRvCisgICB2YWx1ZSAndmFsdWUnLgorCisgLSBBcyBhIGNvbnNlcXVlbmNlLCBrZXkgbmFtZXMgKmNhbm5vdCogY29udGFpbiBhIGRvdC4KKworIC0gQWx0ZXJuYXRpdmVseSwgYnJhY2VzIGNhbiBiZSB1c2VkIHRvIGdyb3VwIHN1Yi1rZXlzLCBhcyBpbjoKKworICAgICBzb21lIHsKKyAgICAgICAgb3RoZXIgeworICAgICAgICAgICAgbmFtZSAgIHZhbHVlCisgICAgICAgICAgICBuYW1lMiAgb3RoZXItdmFsdWUKKyAgICAgICAgfQorICAgICB9CisKKyAgIHdoaWNoIGRlZmluZXMgYSB0b3AtbGV2ZWwgJ3NvbWUnIGtleSB3aXRoIHR3byBzdWIta2V5cyAnbmFtZScgYW5kCisgICAnbmFtZTInCisKKyAtIEJyYWNlIGFuZCBkb3Qgbm90YXRpb25zIGFyZSBlcXVpdmFsZW50LCBzbyB0aGUgYWJvdmUgY29uZmlnIGZpbGUKKyAgIGNhbiBhbHNvIGJlIHdyaXR0ZW4gYXM6CisKKyAgICAgICAgc29tZS5vdGhlci5uYW1lIHZhbHVlCisgICAgICAgIHNvbWUub3RoZXIubmFtZTIgb3RoZXItdmFsdWUKKworIC0gSWYgYSBrZXkgYXBwZWFycyB0d2ljZSBpbiB0aGUgY29uZmlnIGZpbGUsIGl0IHJlcGxhY2VzIGFueQorICAgYXNzaWduZWQgdmFsdWUsIGhlbmNlOgorCisgICAgICAgIHNvbWUta2V5ICBmb28KKyAgICAgICAgc29tZS1rZXkgIGJhcgorCisgICBkZWZpbmVzICdzb21lLWtleScgdG8gJ2JhcicKKworIC0gSWYgYSBzaGFycCAoIykgYXBwZWFycyB3aGVuZXZlciBhIGtleSBuYW1lIGlzIGV4cGVjdGVkIGJ5IHRoZSBwYXJzZXIsCisgICB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQgYWxvbmcgYW55dGhpbmcgdGhhdAorICAgZm9sbG93cyBvbiB0aGUgY3VycmVudCBsaW5lLgorCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9BTkRST0lELUVMRkYuVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtRUxGRi5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiMzAxNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9BTkRST0lELUVMRkYuVFhUCkBAIC0wLDAgKzEsMjMgQEAKK0FORFJPSUQgRUxGRiBMSUJSQVJZCisKK1RoZSBkb2NzL0FORFJPSUQtRUxGRi5UWFQgZG9jdW1lbnQgY29udGFpbnMgbm90ZXMgYWJvdXQgdGhlIEVMRkYgbGlicmFyeSB1c2VkCitieSB0aGUgZW11bGF0b3IgdG8gZXh0cmFjdCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBzeW1ib2wgZmlsZXMgb2YgdGhlCitlbXVsYXRlZCBzeXN0ZW0uCisKK1RoZSBFTEZGIGxpYnJhcnkgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBwcm92aWRlIHRoZSBlbXVsYXRvcidzIG1lbW9yeSBjaGVja2VyCitzdWJzeXN0ZW0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCByb3V0aW5lIG5hbWUsIHNvdXJjZSBmaWxlIG5hbWUgYW5kIGxvY2F0aW9uCit3aGVuIGEgbWVtb3J5IGFjY2VzcyB2aW9sYXRpb24gZGV0ZWN0ZWQgYXQgcnVudGltZS4gVGhpcyByZXF1aXJlcyBwYXJzaW5nIHN5bWJvbAorZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGlicmFyaWVzIG9mIHRoZSBlbXVsYXRlZCBzeXN0ZW0sIGluIG9yZGVyIHRvIGV4dHJhY3QKK3JlbGV2YW50IGluZm9ybWF0aW9uIGZyb20gdGhlbS4KKworRHVlIHRvIGxhY2sgb2Ygd2luZG93cyBzdXBwb3J0IG9uIGF2YWlsYWJsZSBvcGVuIHNvdXJjZSBwcm9qZWN0cywgdGhpcyBpcyBhCitmdWxsIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBFTEYvRFdBUkYgcGFyc2VyLgorCitUaGUgbGlicmFyeSBleHBvc2VzIGEgc2ltcGxlIEFQSSB0aGF0IGF0IHRoaXMgcG9pbnQgYWxsb3dzOgorLSBFeHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHJvdXRpbmUsIGNvbnRhaW5pbmcgZ2l2ZW4gUEMgYWRkcmVzcyBpbiB0aGUgZW11bGF0ZWQKKyAgc3lzdGVtLiBSb3V0aW5lIGluZm9ybWF0aW9uLCBjb2xsZWN0ZWQgYnkgdGhlIGxpYnJhcnkgaW5jbHVkZXM6CisgICogUm91dGluZSBuYW1lCisgICogU291cmNlIGZpbGUgbmFtZSBhbmQgbGluZSBjb3JyZXNwb25kZWQgdG8gdGhlIGdpdmVuIGVtdWxhdGVkIFBDLgorICAqIElmIHJvdXRpbmUgaGFwcGVucyB0byBiZSBpbmxpbmVkLCBsaWJyYXJ5IHRyYWNlcyBpbmNsdXNpb24gdXAgdG8gdGhlIGZpcnN0CisgICAgcm91dGluZSB0aGF0IGlzIG5vdCBpbmxpbmVkLCBwcm92aWRpbmcgbmFtZXMgYW5kIHNvdXJjZSBmaWxlIGxvY2F0aW9uCisgICAgaW5mb3JtYXRpb24gZm9yIGFsbCBpbmxpbmVkIHJvdXRpbmVzIGluIHRoYXQgY2hhaW4uCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQU5EUk9JRC1FTVVMQVRJT04tTElCUkFSWS5UWFQgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1FTVVMQVRJT04tTElCUkFSWS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3MzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9BTkRST0lELUVNVUxBVElPTi1MSUJSQVJZLlRYVApAQCAtMCwwICsxLDMxMSBAQAorQW5kcm9pZEVtdTogQW5kcm9pZCBFbXVsYXRpb24gTGlicmFyeSBPdmVydmlldworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb246CistLS0tLS0tLS0tLS0tCisKK0kuIE92ZXJ2aWV3OgorLS0tLS0tLS0tLS0tCisKK1RoZSBBbmRyb2lkIGVtdWxhdG9yIGlzIG5vdyBhIHNldCBvZiBiaW5hcmllcyB3aGljaCBhcmUgYnVpbHQgZnJvbSBlc3NlbnRpYWxseQordHdvIGNvZGUgYmFzZXM6CisKKy0gVGhlICdjbGFzc2ljJyBjb2RlLWJhc2UsIHVuZGVyICRBT1NQL2V4dGVybmFsL3FlbXUvLCB3aGljaCBpcyBiYXNlZCBvbgorICBhIHJlYWxseSBvbGQgdmVyc2lvbiBvZiBRRU1VIDEueCwgaGVhdmlseSBwYXRjaGVkLCBpbXBsZW1lbnRpbmcgYSB2ZXJ5IGxhcmdlCisgIHNldCBvZiBmZWF0dXJlcy4KKworLSBUaGUgJ1FFTVUyJyBjb2RlLWJhc2UsIHVuZGVyICRBT1NQL2V4dGVybmFsL3FlbXUvLCB3aGljaCBpcyBiYXNlZAorICBvbiBhIG11Y2ggbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBRRU1VIDIueCwgdmVyeSBsaWdodGx5IHBhdGNoZWQgYXQgdGhlIG1vbWVudCwKKyAgYnV0IHdoaWNoIGRvZXNuJ3QgaW1wbGVtZW50IG1hbnkgQW5kcm9pZC1zcGVjaWZpYyBmZWF0dXJlcyB0byByZXBsYWNlIHRoZQorICBjbGFzc2ljIGVtdWxhdG9yLgorCitUaGVyZSBhcmUgb3RoZXIgZGlmZmVyZW5jZXMsIGZvciBleGFtcGxlOgorCistIFRoZSBRRU1VMiBjb2RlIGJhc2Ugc3VwcG9ydHMgQW5kcm9pZCBBUk02NCwgTUlQUzY0LCB4ODYgYW5kIHg4Nl82NAorICBzeXN0ZW0gaW1hZ2VzIChidXQgbm90IDMyLWJpdCBBUk0gb3IgTUlQUykuIFdoaWxlIHRoZSBjbGFzc2ljIG9uZSBvbmx5CisgIHN1cHBvcnRzIDMyLWJpdCBBUk0sIE1JUFMsIHg4NiBhbmQgeDg2XzY0LgorCistIFRoZSBRRU1VMiBlbXVsYXRvciBoYXMgbXVjaCBiZXR0ZXIgaS9vIHBlcmZvcm1hbmNlIHRocm91Z2ggdGhlIHVzZSBvZgorICB2aXJ0aW8gdmlydHVhbCBkZXZpY2VzLgorCistIFRoZSBjbGFzc2ljIGVtdWxhdG9yIGhhcyBhIHNraW5uYWJsZSBVSSBiYXNlZCBvbiBTREwyLCB3aXRoIGEgcHJvdG90eXBlCisgIG5ldyBvbmUgYmFzZWQgb24gUXQuIFRoZSBRRU1VMiBvbmUgb25seSBkaXNwbGF5cyBhIG1lcmUgcmVjdGFuZ2xlLgorCitBIHNtYWxsIG51bWJlciBvZiBBbmRyb2lkLXNwZWNpZmljIGZlYXR1cmVzIGhhdmUgYmVlbiBtYW51YWxseSBwb3J0ZWQgdG8gdGhlCitRRU1VMiBjb2RlIGJhc2UgdG8gZW5hYmxlIGl0IHRvIGJvb3QgQW5kcm9pZCBzeXN0ZW0gaW1hZ2VzLCB3aGljaCBtZWFudAorcmV3cml0aW5nIGZyb20gc2NyYXRjaCBleGlzdGluZyBzdXBwb3J0IGNvZGUgKFFFTVUyIGFuZCBjbGFzc2ljIGludGVybmFscyBhcmUKK3F1aXRlIGRpZmZlcmVudCwgc28gY29kZSBzaGFyaW5nIGlzIGFjdHVhbGx5IHByZXR0eSBsb3cpLgorCitIb3dldmVyLCB0aGlzIHNjaGVtZSBkb2Vzbid0IHJlYWxseSBzY2FsZSwgYW5kIG5ldyBmZWF0dXJlcyBhcmUgYmVpbmcgYWRkZWQgdG8KK3RoZSBjbGFzc2ljIGVtdWxhdG9yIGF0IGluY3JlYXNlZCBzcGVlZCBub3csIG1ha2luZyB0aGlzIG1hbnVhbCBwb3J0aW5nIHByb2Nlc3MKK2V2ZW4gbW9yZSBjdW1iZXJzb21lLgorCitUbyBzb2x2ZSB0aGlzLCB0aGUgY2xhc3NpYyBjb2RlYmFzZSBpcyBnb2luZyB0byBiZSByZWZhY3RvcmVkIGludG8gdGhlCitmb2xsb3dpbmc6CisKKyAgLSBBIHN0YXRpYyBsaWJyYXJ5LCBuYW1lZCAnQW5kcm9pZEVtdScsIHByb3ZpZGluZyBhcyBtYW55IEFuZHJvaWQtc3BlY2lmaWMKKyAgICBlbXVsYXRpb24gZmVhdHVyZXMgYXMgcG9zc2libGUsIGluIGEgd2F5IHRoYXQgZG9lc24ndCBkZXBlbmQgb24gX2FueV8gUUVNVQorICAgIGludGVybmFscy4KKworICAtIEFuICdlbmdpbmUnIChRRU1VMSkgdGhhdCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZSBlbXVsYXRpb24gcnVudGltZQorICAgIGFuZCB2aXJ0dWFsIGhhcmR3YXJlIGJvYXJkLgorCisgIC0gQSBRRU1VMS1zcGVjaWZpYyAnZ2x1ZScgYmV0d2VlbiB0aGVzZSB0d28sIHRoYXQgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeQorICAgIHBsdW1iaW5nIGJldHdlZW4gdGhlIGFib3ZlIHR3byBjb21wb25lbnRzLgorCitNZWFud2hpbGUsIHRoZSBRRU1VMiBjb2RlIGJhc2Ugd2lsbCBiZSBtb2RpZmllZCB0byBsaW5rIGFnYWluc3QgZXhhY3RseSB0aGUKK3NhbWUgQW5kcm9pZEVtdSBsaWJyYXJ5LCB3aXRoIHRoZSBoZWxwIG9mIGl0cyBvd24gY3VzdG9tICdnbHVlJywgdG8gZm9ybSB0aGUKK2ZpbmFsIFFFTVUyIGJpbmFyeS4KKworVGhlIGdvYWxzIG9mIEFuZHJvaWRFbXUgYXJlIHRoZSBmb2xsb3dpbmc6CisKKyAgLSBCZWluZyBhIHN0YW5kYWxvbmUgY29tcG9uZW50IHRoYXQgY29tZXMgd2l0aCBpdHMgb3duIHNldCBvZiB1bml0LXRlc3RzCisgICAgdGhhdCBjYW4gYmUgcnVuIG9uIGVhY2ggYnVpbGQgdG8gY2F0Y2ggcmVncmVzc2lvbnMgYW5kIGlzc3VlcyBhcyBzb29uCisgICAgYXMgcG9zc2libGUgKHVubGlrZSB0aGUgcmVzdCBvZiBRRU1VMSAvIFFFTVUyIHdoaWNoIGlzIGVzc2VudGlhbGx5CisgICAgbm90IHVuaXQtdGVzdGFibGUpLgorCisgIC0gUHJvdmlkaW5nIGEgVUkgbGF5ZXIgZGVjb3VwbGVkIGZyb20gdGhlIHVuZGVybHlpbmcgZW11bGF0aW9uIGVuZ2luZQorICAgIChiZSBpdCBiYXNlZCBvbiBTREwyLCBhcyBjdXJyZW50bHksIG9yIG9uIFF0LCBhcyBpbiB0aGUgZnV0dXJlKS4KKworVGhpcyBjYW4gYmUgaWxsdXN0cmF0ZWQgYXMgZm9sbG93czoKKworICAgIF9fX19fX19fX19fXyAgICAgX19fX19fX19fX19fICAgICBfX19fX19fX18gICAgICAgIF9fX19fX19fX19fX19fX19fX19fCisgICB8ICAgICAgICAgICAgfCAgIHwgICAgICAgICAgICB8ICAgfCAgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICB8IEFuZHJvaWRFbXUgfCArIHwgUUVNVTEgR2x1ZSB8ICsgfCAgUUVNVTEgIHwgID09ICB8ICBDbGFzc2ljIGVtdWxhdG9yICB8CisgICB8X19fX19fX19fX19ffCAgIHxfX19fX19fX19fX198ICAgfF9fX19fX19fX3wgICAgICB8X19fX19fX19fX19fX19fX19fX198CisKKyAgICBfX19fX19fX19fX18gICAgIF9fX19fX19fX19fXyAgICAgX19fX19fX19fICAgICAgICBfX19fX19fX19fX19fX19fX19fXworICAgfCAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgfCAgIHwgICAgICAgICB8ICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICAgfCBBbmRyb2lkRW11IHwgKyB8IFFFTVUyIEdsdWUgfCArIHwgIFFFTVUyICB8ICA9PSAgfCAgIFFFTVUyIGVtdWxhdG9yICAgfAorICAgfF9fX19fX19fX19fX3wgICB8X19fX19fX19fX19ffCAgIHxfX19fX19fX198ICAgICAgfF9fX19fX19fX19fX19fX19fX19ffAorCisgICAgX19fX19fX19fX19fICAgICBfX19fX19fX19fX18gICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAgfCAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgfCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8IEFuZHJvaWRFbXUgfCArIHwgdW5pdCB0ZXN0cyB8ICA9PSAgfCAgQW5kcm9pZEVtdSB1bml0LXRlc3Qgc3VpdGUgIHwKKyAgIHxfX19fX19fX19fX198ICAgfF9fX19fX19fX19fX3wgICAgICB8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCisKKworSUkuIEFuZHJvaWRFbXUgaW50ZXJmYWNlczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGFjaGlldmUgdGhpcywgYSBzZXJpZXMgb2YgcHJvZ3JhbW1pbmcgdGVjaG5pcXVlcyB3aWxsIGJlIHVzZWQsIGZvciBleGFtcGxlCisoYWxsIHBhdGhzIHJlbGF0aXZlIHRvICRBT1NQL2V4dGVybmFsL3FlbXUvKToKKworLSBBbmRyb2lkRW11IHByb3ZpZGVzIGdlbmVyaWMgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tCisgIGdsdWUgY29kZS4gRm9yIGV4YW1wbGU6CisKKyAgICAgIGFuZHJvaWQvdGVsZXBob255LzogY29udGFpbnMgZ2VuZXJpYyBBbmRyb2lkRW11IGNvZGUgdXNlZCB0byBzdXBwb3J0CisgICAgICBHU00gYW5kIFNNUyBlbXVsYXRpb24uCisKKyAgICAgIHRlbGVwaG9ueS86IGNvbnRhaW5zIFFFTVUxLXNwZWNpZmljIGNvZGUgdGhhdCB1c2VzIHRoZSBnZW5lcmljIGNvZGUKKyAgICAgIGFuZCBwbHVncyBpdCBpbnRvIHRoZSByZXN0IG9mIHRoZSBlbXVsYXRpb24gZW5naW5lIChlLmcuIHByb3ZpZGluZworICAgICAgYSBDaGFyRHJpdmVyU3RhdGUqIGluc3RhbmNlIGZvciB0aGUgZW11bGF0ZWQgbW9kZW0gc2VyaWFsIGxpbmUpLgorCisgICAgICBOT1RFOiBUaGlzIGlzIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBpdCB3aWxsIGJlIG1vdmVkIHRvIGFub3RoZXIKKyAgICAgICAgICAgIGRpcmVjdG9yeSB0aGF0IGNvbGxlY3RzIGFsbCBnbHVlIGNvZGUuIFNlZSBzZWN0aW9ucyBiZWxvdy4KKworLSBBbmRyb2lkRW11IGNhbiBwcm92aWRlIGFic3RyYWN0IGludGVyZmFjZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYnkgdGhlCisgIGxpYnJhcnkgaW4gYSBnZW5lcmljIHdheSwgYnV0IGNhbiBhbHNvIGJlIG92ZXJyaWRlbiBieSBhIFFFTVUxL1FFTVUyCisgIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLiBGb3IgZXhhbXBsZSAoYWxsIHBhdGhzIHJlbGF0aXZlIHRvIGV4dGVybmFsL3FlbXUvKToKKworICAgIE1vc3Qgb2YgdGhlIEFuZHJvaWRFbXUgY29kZSB0aGF0IG5lZWRzIHRvIGRlYWwgd2l0aCBhc3luY2hyb25vdXMgZXZlbnRzCisgICAgZG9lc24ndCBrbm93IGlmIGl0IHJ1bnMgd2l0aGluIHRoZSBRRU1VIGV2ZW50IGxvb3AsIG9yIGEgbW9yZSBnZW5lcmljCisgICAgb25lLgorCisgICAgVGhpcyBpcyBkb25lIGJ5IHByb3ZpZGluZyBhIGdlbmVyaWMgYWJzdHJhY3QgQysrIGludGVyZmFjZSB0byBldmVudCBsb29wcworICAgIChhbmRyb2lkOjpiYXNlOjpMb29wZXIpLCB3aGljaCBoYXMgYm90aCBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24sIGJhc2VkCisgICAgb24gc2VsZWN0KCksIGFzIHdlbGwgYXMgYW5vdGhlciBvbmUgYmFzZWQgb24gdGhlIFFFTVUgbWFpbiBldmVudCBsb29wCisgICAgKGFuZHJvaWQ6OnFlbXU6Okxvb3BlcikuCisKKyAgICBUaGUgY29kZSBpbiBBbmRyb2lkRW11IGNhbGxzIGFuZHJvaWQ6OmJhc2U6OlRocmVhZExvb3Blcjo6Z2V0KCkgdG8KKyAgICByZXRyaWV2ZSB0aGUgTG9vcGVyIGluc3RhbmNlIGZvciB0aGUgY3VycmVudCB0aHJlYWQuIEJ5IGRlZmF1bHQgdGhpcworICAgIG1ldGhvZCBsYXppbHkgY3JlYXRlcyBhIGdlbmVyaWMgYW5kcm9pZDo6YmFzZTo6TG9vcGVyIG9uLWRlbWFuZC4KKworICAgIEhvd2V2ZXIsIHdoZW4gdGhlIG1haW4gUUVNVSBtYWluIHRocmVhZCBzdGFydHMsIGl0IHdpbGwgY3JlYXRlIGEgbmV3CisgICAgYW5kcm9pZDo6cWVtdTo6TG9vcGVyIGluc3RhbmNlLCBhbmQgaW5qZWN0IGl0IHRocm91Z2ggVGhyZWFkTG9vcGVyOjpzZXQoKQorICAgIGludG8gdGhlIGN1cnJlbnQgdGhyZWFkLgorCisgICAgQXMgc3VjaCwgYW55IEFuZHJvaWRFbXUgY29kZSB0aGF0IHJ1bnMgaW4gdGhpcyB0aHJlYWQgd2lsbCB1c2UgUUVNVTEncworICAgIG1haW4gZXZlbnQgbG9vcCB3aXRob3V0IGtub3dpbmcgaXQuCisKKyAgICBGb3IgbW9yZSBkZXRhaWxzIGxvb2sgYXQgdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorCisgICAgICBhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgKKyAgICAgIGFuZHJvaWQvYmFzZS9hc3luYy9Mb29wZXIuY3BwCisgICAgICBhbmRyb2lkL2Jhc2UvYXN5bmMvVGhyZWFkTG9vcGVyLmgKKyAgICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2FzeW5jL0xvb3Blci5jcHAKKworICAgIFRlY2huaWNhbGx5LCBvbmx5IHRoZSBsYXN0IHNvdXJjZSBmaWxlIGlzIHBhcnQgb2YgdGhlIFFFTVUxLXNwZWNpZmljIGdsdWUuCisKKy0gVGhlIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbSBjbGFzcyBwcm92aWRlcyBhbiBhYnN0cmFjdCBpbnRlcmZhY2UgdG8gdGhlCisgIHVuZGVybHlpbmcgaG9zdCBzeXN0ZW0uIFVuaXQtdGVzdHMgY2FuIHVzZSBhbiBhbmRyb2lkOjpiYXNlOjpUZXN0U3lzdGVtCisgIGluc3RhbmNlIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGluamVjdCBpdHNlbGYgaW50byB0aGUgcHJvY2VzcyBmb3IgdGhlCisgIGR1cmF0aW9uIG9mIHRoZSB0ZXN0IHRvIGVuc3VyZSB0aGF0IG9wZXJhdGlvbnMgYXJlIGFzIGhlcm1ldGljIGFzIHBvc3NpYmxlLgorCisKK0lJSS4gRW11bGF0b3IgVUkgQ29uc2lkZXJhdGlvbnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgY29kZSB0aGF0IGhhbmRsZXMgdGhlIGNsYXNzaWMgZW11bGF0b3IncyBVSSBpcyBjdXJyZW50bHkgZGl2aWRlZCBpbnRvCit0aGUgZm9sbG93aW5nIGdyb3VwcyA6CisKKyAgdWkvY29uc29sZS5jOgorICAgICAgICBRRU1VMS1zcGVjaWZpYyBjb2RlIHRvIG1hbmFnZSBjb25zb2xlIGFuZCBkaXNwbGF5cy4KKyAgICAgICAgRXNzZW50aWFsbHksIFFFTVUgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiAnY29uc29sZXMnIGFuZCAnZGlzcGxheXMnLgorCisgICAgICAgIEEgJ2NvbnNvbGUnIGlzIGFuIG91dHB1dCBzdXJmYWNlIHRoYXQgY2FuIGhvbGQgZWl0aGVyIHRleHQgb3IgZ3JhcGhpY3MuCisgICAgICAgIEEgZ2l2ZW4gVk0gbWF5IGhhdmUgc2V2ZXJhbCBjb25zb2xlcyBlbmFibGVkIGF0IHJ1bnRpbWUuCisKKyAgICAgICAgQSBkaXNwbGF5LCBuYW1lZCBEaXNwbGF5U3RhdGUgaW4gUUVNVTEsIGlzIHNvbWV0aGluZyB0aGF0IGNhbiAiZGlzcGxheSIKKyAgICAgICAgb25lIGNvbnNvbGUgYXQgYSB0aW1lLiBJdCBpcyBwb3NzaWJsZSB0byBzd2l0Y2ggd2hpY2ggY29uc29sZSBpcworICAgICAgICBiZWluZyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBEaXNwbGF5U3RhdGUgYXQgcnVudGltZS4KKworICAgICAgICBGaW5hbGx5LCBhIERpc3BsYXlDaGFuZ2VMaXN0ZW5lciBpcyBhY3R1YWxseSBzb21lIGNvZGUgdGhhdCBhY3R1YWxseQorICAgICAgICBzaG93cyBhIERpc3BsYXlTdGF0ZSB0byB0aGUgc2NyZWVuLCBvciBkb2VzIHNvbWUgc3BlY2lmaWMgaGFuZGxpbmcKKyAgICAgICAgKGUuZy4gdGhlIFZOQyBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgY2FuIGJlIHVzZWQgdG8gc2VuZCB0aGUKKyAgICAgICAgRGlzcGxheVN0YXRlIHRvIGEgcmVtb3RlIGNsaWVudCB1c2luZyB0aGUgVk5DIHByb3RvY29sLgorCisgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9kaXNwbGF5LmM6CisgICAgICAgIFRoZSBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gdXNlZCB0byBzZW5kCisgICAgICAgIHRoZSBEaXNwbGF5U3RhdGUgdG8gdGhlIGVtdWxhdG9yJ3MgVUkgY29kZS4KKworICBhbmRyb2lkL2ZyYW1lYnVmZmVyLmM6CisgICAgICAgIGhlbHBlciBjbGFzcyBhY3RpbmcgYXMgYSBicmlkZ2UgYmV0d2VlbiB0aGUgdmlydHVhbCBmcmFtZWJ1ZmZlcgorICAgICAgICBkZXZpY2UsIGFuZCB0aGUgZW11bGF0b3IncyBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIuCisKKyAgYW5kcm9pZC9za2luLzoKKyAgICAgICAgTWFpbiBVSSBlbXVsYXRvciBjb2RlIChyZXNwb25zaWJsZSBmb3IgZGlzcGxheWluZyB0aGUKKyAgICAgICAgZW11bGF0b3IncyB3aW5kb3cgYW5kIGl0cyBjb250cm9scywgaGFuZGxpbmcgdXNlIGlucHV0KS4gVGhpcyBvbmx5CisgICAgICAgIGRlcGVuZHMgb24gc3R1ZmYgdW5kZXIgYW5kcm9pZC91dGlscy8gYW5kIGFuZHJvaWQvYmFzZS8gYW5kIHRodXMgaXMKKyAgICAgICAgYWxyZWFkeSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IGZyb20gUUVNVTEtc3BlY2lmaWMgY29kZS4gSG93ZXZlciwgaXQKKyAgICAgICAgcmVsaWVzIG9uIGNsaWVudCBjb2RlIHRvIHByb3ZpZGUgYWRlcXVhdGUgY2FsbGJhY2tzIHRvIG9wZXJhdGUuCisKKyAgICAgICAgVGhlIHNraW4gZGlyZWN0b3J5IHByb3ZpZGVzIGFuIGFic3RyYWN0IGludGVyZmFjZSBhcyB3ZWxsIGFzIGFuCisgICAgICAgIGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSB0aGUgU0RMMiBsaWJyYXJ5LgorCisgIGFuZHJvaWQvc2tpbi9xdC86CisgICAgICAgIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBza2luIGludGVyZmFjZSBiYXNlZAorICAgICAgICBvbiB0aGUgUXQgd2lkZ2V0IHRvb2xraXQgKHN0aWxsIGV4cGVyaW1lbnRhbCkuIEFsc28gaW5kZXBlbmRlbnQgZnJvbQorICAgICAgICB0aGUgcmVzdCBvZiBRRU1VMS4KKworICAgICAgICBUbyBidWlsZCBpdCwgb25lIG11c3QgdXNlIHRoZSAtLXVpPXF0IGZsYWcgd2hlbiBjYWxsaW5nCisgICAgICAgIGFuZHJvaWQvY29uZmlndXJlLnNoLCBhbmRyb2lkL3JlYnVpbGQuc2ggb3IgcGFja2FnZS1yZWxlYXNlLnNoCisKKyAgYW5kcm9pZC9lbXVsYXRvci13aW5kb3cuYzoKKyAgICAgICAgVGhlIG1haW4gZ2x1ZSBjb2RlIGJldHdlZW4gdGhlIGdlbmVyaWMgc2tpbiBVSSBjb2RlIGFuZCB0aGUgUUVNVTEKKyAgICAgICAgc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGVtdWxhdG9yLiBQcm92aWRlcyBhcHByb3ByaWF0ZSBjYWxsYmFja3MuCisKK1RoaXMgbWVhbnMgdGhhdCBtb3N0IG9mIHRoZSBVSSBjb2RlIGNhbiBhbHJlYWR5IGJlIHBsYWNlZCBpbiBBbmRyb2lkRW11LCBhbmQKK3RoYXQgaXQgc2hvdWxkIGFsc28gYmUgcG9zc2libGUgdG8gd3JpdGUgYSBmYWtlIGVtdWxhdG9yIGJhY2tlbmQgZm9yIGl0IGluCitvcmRlciB0byBnZW5lcmF0ZSBhIHNtYWxsZXIgcHJvZ3JhbSB0byB0ZXN0IHRoZSBlbXVsYXRvcidzIFVJLCBhcyBpbjoKKworICAgIF9fX19fX19fX19fX19fICAgICBfX19fX19fX19fX19fX19fX18gICAgICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fXworICAgfCAgICAgICAgICAgICAgfCAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgIEFuZHJvaWRFbXUgIHwgKyB8ICBNb2NrIFFFTVUrR2x1ZSAgfCAgPT0gIHwgIEFuZHJvaWQgVUkgdGVzdCBwcm9ncmFtICB8CisgICB8X19fX19fX19fX19fX198ICAgfF9fX19fX19fX19fX19fX19fX3wgICAgICB8X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCitUaGUgZ29hbCBvZiBzdWNoIGEgcHJvZ3JhbSB3b3VsZCBiZSB0byB0ZXN0IHRoZSBVSSdzIGZlYXR1cmVzIHdpdGhvdXQgaGF2aW5nCit0byBzdGFydCBhIGZ1bGwgZW11bGF0aW9uIHNlc3Npb24gKHdoaWNoIHR5cGljYWxseSBhbHNvIGludm9sdmVzIGxvdHMgb2YgbWFudWFsCitjbGlja3MgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyB3b3JrcyBjb3JyZWN0bHkgYXQgdGhlIG1vbWVudCkuCisKK1RoaXMgZWZmb3J0IGlzIGluZGVwZW5kZW50IGZyb20gdGhlIG9uZSBkZXNjcmliZWQgYWJvdmUgYnV0IHNob3VsZCBzaW1wbGlmeQorYW5kIHNwZWVkIHVwIHdvcmsgb24gdGhlIFVJIHRvby4KKworCitJVi4gUmVmYWN0b3JpbmcgcGxhbnM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGdldCB3aGVyZSB3ZSB3YW50LCBzZXZlcmFsIHRoaW5ncyBhcmUgZ29pbmcgdG8gY2hhbmdlLCBhbmQgdGhpcyBzZWN0aW9uCit0cmllcyB0byBkZXRhaWxzIHRoZW0uIE5vdGUgdGhhdCBhbGwgZGV0YWlscyB3aWxsIHByb2JhYmx5IGFwcGVhciBpbiByZWxldmFudAorZW50cmllcyBpbiBodHRwOi8vYi5hbmRyb2lkLmNvbSwgdGhpcyBpcyBhIHByZXZpZXc6CisKKworSVYuMS4gUmVwb3NpdG9yeSBjaGFuZ2VzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgbWFuaWZlc3QgZmlsZXMgdXNlZCB0byBtYW5hZ2UgZW11bGF0b3IgZGV2ZWxvcG1lbnQgYnJhbmNoZXMgd2lsbCBiZQordXBkYXRlZCB0byByZW5hbWUgdGhlIGNoZWNrb3V0IG5hbWVzIG9mIHRoZSBlbXVsYXRvciBzb3VyY2UgZGlyZWN0b3JpZXMuCisKK0kuZS4gd2hpbGUgdGhlIGdpdCByZXBvc2l0b3JpZXMgb24gYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tIHdpbGwgYmUgdGhlCitzYW1lLCB0aGUgZm9sbG93aW5nIGNoYW5nZXMgaW4gdGhlIGNoZWNrb3V0IHRyZWUgd2lsbCBoYXBwZW46CisKKyAgZXh0ZXJuYWwvcWVtdSAgICAgICAgICAtPiBleHRlcm5hbC9xZW11MQorICBleHRlcm5hbC9xZW11ICAtPiBleHRlcm5hbC9xZW11MgorCitXaGVuIHRoZSBzb3VyY2UgcmVmYWN0b3JpbmcgaXMgY29tcGxldGVkLCB3ZSBtYXkgY3JlYXRlIGEgbmV3IGdpdCByZXBvc2l0b3J5CituYW1lZDoKKworICBleHRlcm5hbC9hbmRyb2lkLWVtdS8KKworVG8gaG9sZCB0aGUgc2hhcmVkIEFuZHJvaWRFbXUgc291cmNlcywgYW5kIHJlbGF0ZWQgYnVpbGQgc2NyaXB0cy4KKworCitJVi4yLiBTb3VyY2UgZmlsZSBjaGFuZ2VzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK0EgbmV3IGRpcmVjdG9yeSBuYW1lZCBleHRlcm5hbC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvIHdpbGwgYmUgY3JlYXRlZCBhbmQKK2FsbCBzb3VyY2VzIHVuZGVyIGV4dGVybmFsL3FlbXUxL2FuZHJvaWQvIHRoYXQgc3RpbGwgZGVwZW5kIG9uIFFFTVUtc3BlY2lmaWMKK2RlY2xhcmF0aW9ucyBhbmQgZnVuY3Rpb25zIHdpbGwgYmUgbW92ZWQgaGVyZSBmaXJzdC4KKworVGhlIGdvYWwgaGVyZSBpcyB0byBrZWVwIGFsbCAnZ2VuZXJpYycgQW5kcm9pZEVtdSBjb2RlIHVuZGVyCitleHRlcm5hbC9xZW11MS9hbmRyb2lkLyBhdCBmaXJzdCAocG90ZW50aWFsbHkgbW92aW5nIGl0IHRvIGl0cyBvd24gbG9jYXRpb24KK2xpa2UgZXh0ZXJuYWwvYW5kcm9pZC1lbXUvIGluIHRoZSBmdXR1cmUpLgorCitBZnRlciB0aGlzLCB0aGUgY29kZSB1bmRlciBhbmRyb2lkLXFlbXUxLWdsdWUvIHdpbGwgYmUgcmVmYWN0b3JlZCBpbnRvCitnZW5lcmljIGFuZCBub24tZ2VuZXJpYyBwYXJ0cy4gVGhlIGdlbmVyaWMgb25lcyB3aWxsIGJlIG1vdmVkIHRvCitleHRlcm5hbC9xZW11MS9hbmRyb2lkLywgdGhlIG5vbi1nZW5lcmljIG9uZXMgd2lsbCBzdGF5IGF0IHRoZSBzYW1lIGxvY2F0aW9uLgorCitTaW1pbGFybHksIGV4dGVybmFsL3FlbXUyL2FuZHJvaWQtcWVtdTItZ2x1ZS8gd2lsbCBiZSBjcmVhdGVkLCBhbmQgY29kZQorbWlncmF0ZWQgdGhlcmUgKGhvd2V2ZXIgdGhlcmUgaXMgY3VycmVudGx5IHZlcnkgbGl0dGxlIGNvZGUgaW4gUUVNVTIgdGhhdAord291bGQgYmUgaW1wYWN0ZWQgYnkgdGhpcykuCisKK0FzIGEgcmVtaW5kZXIsIHRoZXJlIGlzIGEgc21hbGwgYW1vdW50IG9mIFFFTVUtc3BlY2lmaWMgY29kZSB0aGF0IGRlYWxzIHdpdGgKK0FuZHJvaWQgdGhhdCBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIGdsdWUsIGR1ZSB0byB0aGUgd2F5IHRoZSBlbXVsYXRpb24gZW5naW5lCit3b3Jrcy4gRXhhbXBsZXMgYXJlIHZpcnR1YWwgaGFyZHdhcmUgZGV2aWNlIGltcGxlbWVudGF0aW9ucywgaW5pdGlhbGl6YXRpb24KK2FuZCB0ZWFyZG93biBjb2RlIHBhdGhzLCBvciBzcGVjaWFsIGZlYXR1cmVzIGxpa2UgdHJhbnNwYXJlbnQgSFRUUCBwcm94eQorc3VwcG9ydCB3aGljaCByZXF1aXJlcyBtb2RpZnlpbmcgdGhlICdzbGlycCcgbmV0d29yayBzdGFjayAoYnkgYWRkaW5nIG9ubHkgdHdvCitjYWxscyB0byBBbmRyb2lkRW11IGZ1bmN0aW9ucykuCisKKworSVYuMy4gQnVpbGQgc3lzdGVtIGFkanVzdG1lbnRzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgY3VycmVudCBidWlsZCBzeXN0ZW0gYXNzdW1lcyB0aGUgZm9sbG93aW5nOgorCisgIC0gUUVNVTIgYmluYXJpZXMgY2FuIGJlIHJlYnVpbHQgYXMgc3RhbmQtYWxvbmUgYmluYXJpZXMgYmVmb3JlIHRoZSBRRU1VMQorICAgIG9uZXMsIHRocm91Z2ggYSBzcGVjaWFsaXplZCBzY3JpcHQgKGFuZHJvaWQvc2NyaXB0cy9idWlsZC1xZW11LWFuZHJvaWQuc2gpCisKKyAgLSAnYW5kcm9pZC9yZWJ1aWxkLnNoJyB3aWxsIHJlYnVpbGQgUUVNVTEgYmluYXJpZXMgYW5kIGNvcHkgUUVNVTIgcHJlYnVpbHRzCisgICAgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkgbG9jYXRpb24uCisKK1RoaXMgb25seSB3b3JrcyBiZWNhdXNlIFFFTVUyIHNvdXJjZXMgZG9uJ3QgZGVwZW5kIG9uIG90aGVyIGNvZGUgZnJvbSB0aGUKK3Byb2plY3QsIGJ1dCB0aGlzIGFzc3VtcHRpb24gd2lsbCBubyBsb25nZXIgaG9sZCB0cnVlLiBBcyBzdWNoLCB0aGUgYnVpbGQKK3N5c3RlbSAobW9yZSBwcmVjaXNlbHkgYW5kcm9pZC9jb25maWd1cmUuc2ggYW5kIGFuZHJvaWQvcmVidWlsZC5zaCkgd2lsbAoraGF2ZSB0byBiZSBhZGp1c3RlZCB0byBlbnN1cmUgdGhhdDoKKworICAtIEFuZHJvaWRFbXUgY29kZSBpcyBidWlsdCBhcyBhIHN0YW5kYWxvbmUgc3RhdGljIGxpYnJhcnkgYmVmb3JlIGFueXRoaW5nCisgICAgZWxzZSAod2l0aCBhcHByb3ByaWF0ZSB1bml0IHRlc3RzLCB3aGljaCB3aWxsIGJlIHJ1biBhcyBwYXJ0IG9mIHRoZQorICAgIGJ1aWxkIHJvdXRpbmUpLgorCisgIC0gUUVNVTEgYW5kIFFFTVUyIGFyZSByZWJ1aWx0IGFmdGVyIHRoYXQsIGFuZCBpbmNsdWRlIEFuZHJvaWRFbXUgaGVhZGVycywKKyAgICBhbmQgbGluayBhZ2FpbnN0IHRoZSBsaWJyYXJ5IHdoZW4gZ2VuZXJhdGluZyBmaW5hbCBleGVjdXRhYmxlcy4gRm9yCisgICAgZXhhbXBsZSwgdGhpcyByZXF1aXJlcyBhZGRpbmcgZmxhZ3MgbGlrZSAtLWFuZHJvaWQtaW5jbHVkZXM9PGRpcj4gYW5kCisgICAgLS1hbmRyb2lkLWxpYmRpcj08ZGlyPiB0byB0aGUgUUVNVTIgJ2NvbmZpZ3VyZScgc2NyaXB0LgorCisgIC0gSWRlYWxseSwgYWxsIG9mIEFuZHJvaWRFbXUsIFFFTVUxIGFuZCBRRU1VMiBzaG91bGQgYmUgcmVidWlsdCBieQorICAgIGFuZHJvaWQvcmVidWlsZC5zaCBhdCB0aGUgc2FtZSB0aW1lIChidXQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIpLCB0bworICAgIGNhdGNoIGJ1aWxkIGJyZWFrcyBhcyBzb29uIGFzIHBvc3NpYmxlLgorCitOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyBydW5uaW5nIHRoZSBRRU1VMiAnY29uZmlndXJlJyBzY3JpcHQgd2hpY2ggaXMKK2luY3JlZGlibHkgc2xvdyAoZS5nLiBhYm91dCAxNSBzZWNvbmRzIG9uIGEgaGlnaC1lbmQgd29ya3N0YXRpb24sIGZvciBlYWNoCit0YXJnZXQgaG9zdCBwbGF0Zm9ybSkuIEl0J3MgcHJvYmFibHkgYSBnb29kIGlkZWEgdG8gZmluZCBhIHdheSB0byBzcGVlZCB0aGlzCitwcm9jZXNzLgorCitHZW5lcmFsbHkgc3BlYWtpbmcsIHdlIHdhbnQgdG8ga2VlcCB0aGUgUUVNVTIgJ2NvbmZpZ3VyZScgc2NyaXB0IGFzIGNsb3NlIGZyb20KK3Vwc3RyZWFtIGFzIHBvc3NpYmxlLiBJdCdzIGFsc28gbm90IHBvc3NpYmxlIHRvIHB1dCBpdHMgb3V0cHV0IGludG8gdmVyc2lvbgorY29udHJvbCAoaXQgY3JlYXRlcyBzeW1saW5rcyBhbmQgTWFrZWZpbGVzIHRoYXQgY29udGFpbiBoYXJkLWNvZGVkIHBhdGhzIHRvCit0aGUgb3JpZ2luYWwgc291cmNlIGRpcmVjdG9yeSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5KSwgc28gYSBtb3JlIGNyZWF0aXZlCitzb2x1dGlvbiB3aWxsIGhhdmUgdG8gYmUgZm91bmQuIFByb2JhYmx5IHNvbWUgd2F5IHRvIHRlbXBsYXRlIHRoZSAnY29uZmlndXJlJworb3V0cHV0LCBnaXZlbiB0aGF0IHRoZSBidWlsZCB1c2VzIGhlcm1ldGljIChvciBwc2V1ZG8taGVybWV0aWMpIHRvb2xjaGFpbnMKK3RvIGJ1aWxkIGJpbmFyaWVzLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0FORFJPSUQtRlJBTUVCVUZGRVIuVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtRlJBTUVCVUZGRVIuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNGNhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1GUkFNRUJVRkZFUi5UWFQKQEAgLTAsMCArMSw5MCBAQAorQW5kcm9pZCBGcmFtZWJ1ZmZlciBlbXVsYXRpb24gdGVjaG5pY2FsIG5vdGVzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IHRyaWVzIHRvIGV4cGxhaW4gaG93IGZyYW1lYnVmZmVyIGVtdWxhdGlvbiB3b3JrcyBpbiB0aGUKK0FuZHJvaWQgZW11bGF0b3IuCisKKzEgLSBIYXJkd2FyZSBlbXVsYXRpb24gKGh3L2FuZHJvaWQvZ29sZGZpc2gvZmIuYyk6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFRoZSBlbXVsYXRlZCBoYXJkd2FyZSBwcm92aWRlcyBhIGJ1bmNoIG9mIGkvbyByZWdpc3RlcnMgdG8gYWxsb3cKKyAgdGhlIGZvbGxvd2luZzoKKworICAtIGxldCB0aGUga2VybmVsIHF1ZXJ5IHRoZSBmcmFtZWJ1ZmZlcidzIGRpbWVuc2lvbnMgKGJvdGggaW4gcGl4ZWxzCisgICAgYW5kIG1pbGxpbWV0ZXJzKSAoc2VlIGdvbGRmaXNoX2ZiX3JlYWQpCisKKyAgLSBsZXQgdGhlIGtlcm5lbCBjb250cm9sIHRoZSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgZm9yIHRoZSBmcmFtZWJ1ZmZlcgorICAgIGFuZCB0aGUgaW50ZXJuYWwgcGl4ZWwgcm90YXRpb24gdG8gYXBwbHkgYmVmb3JlIGRpc3BsYXkgKHNlZQorICAgIGdvbGRmaXNoX2ZiX3dyaXRlKS4KKworICBSZWFkIGRvY3MvR09MREZJU0gtVklSVFVBTC1IQVJEV0FSRS5UWFQgZm9yIGxvdy1sZXZlbCBkZXRhaWxzLgorCisgIFRoZSBwaXhlbCBidWZmZXIgaXMgaXRzZWxmIGEgc2V0IG9mIHBoeXNpY2FsIHBhZ2VzIGFsbG9jYXRlZCBieSB0aGUKKyAga2VybmVsIGRyaXZlciBpbiB0aGUgZW11bGF0ZWQgc3lzdGVtLiBUaGVzZSBwYWdlcyBhcmUgY29udGlndW91cyBpbgorICB0aGUgZW11bGF0ZWQgc3lzdGVtLCBidXQgbm90IGluIHRoZSBlbXVsYXRvcidzIHByb2Nlc3Mgc3BhY2Ugd2hpY2gKKyAgcGxhY2VzIHRoZW0gcmFuZG9tbHkgaW4gdGhlIGhlYXAuCisKKyAgQWxzbywgYSBmdW5jdGlvbiBjYWxsZWQgZ29sZGZpc2hfZmJfdXBkYXRlX2Rpc3BsYXkoKSBpcyBpbiBjaGFyZ2Ugb2YKKyAgY2hlY2tpbmcgdGhlIGRpcnR5IGJpdHMgb2YgdGhlIGZyYW1lYnVmZmVyIHBoeXNpY2FsIHBhZ2VzLCBpbiBvcmRlciB0bworICBjb21wdXRlIHRoZSBib3VuZGluZyByZWN0YW5nbGUgb2YgcGl4ZWwgdXBkYXRlcyBzaW5jZSB0aGUgbGFzdCBjYWxsLCBhbmQKKyAgc2VuZCB0aGVtIHRvIHRoZSBVSSB0aHJvdWdoIHFmcmFtZWJ1ZmZlcl91cGRhdGUoKS4gTW9yZSBvbiB0aGlzIGxhdGVyLgorCisKKzIgLSBGcmFtZWJ1ZmZlciBhYnN0cmFjdCBpbnRlcmZhY2UgKGZyYW1lYnVmZmVyLmgpOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhlIEFuZHJvaWQtc3BlY2lmaWMgaGVhZGVyICdmcmFtZWJ1ZmZlci5oJyBpcyB1c2VkIHRvIHByb3ZpZGUgYSBnZW5lcmljCisgIGludGVyZmFjZSBiZXR3ZWVuIGZyYW1lYnVmZmVyICdwcm9kdWNlcnMnIGFuZCAnY2xpZW50cycuIEVzc2VudGlhbGx5LCBlYWNoCisgIFFGcmFtZUJ1ZmZlciBvYmplY3Q6CisKKyAgICAtIGhvbGRzIGEgY29udGlndW91cyBwaXhlbCBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBlbXVsYXRvci4KKyAgICAtIGNhbiBoYXZlIG9uZSBwcm9kdWNlciBpbiBjaGFyZ2Ugb2YgZHJhd2luZyBpbnRvIHRoZSBwaXhlbCBidWZmZXIKKyAgICAtIGNhbiBoYXZlIHplcm8gb3IgbW9yZSBjbGllbnRzLCBpbiBjaGFyZ2Ugb2YgZGlzcGxheWluZyB0aGUgcGl4ZWwKKyAgICAgIGJ1ZmZlciB0byB0aGUgZmluYWwgVUkgd2luZG93IChvciByZW1vdGUgVk5DIGNvbm5lY3Rpb24sIHdoYXRldmVyKS4KKworICBUaGUgZW11bGF0b3Igd2lsbCBwZXJpb2RpY2FsbHkgY2FsbCAncWZyYW1lYnVmZmVyX2NoZWNrX3VwZGF0ZXMoKScgd2hpY2gKKyAgZG9lcyB0aGUgZm9sbG93aW5nOgorCisgICAgICBmb3JlYWNoIGZiIGluIGZyYW1lYnVmZmVyczoKKyAgICAgICAgICBpZiBmYi5wcm9kdWNlcjoKKyAgICAgICAgICAgIGZiLnByb2R1Y2VyLmNoZWNrX3VwZGF0ZXMoKQorICAgICAgICAgICAgICA9PiBpbiBwcm9kdWNlcgorICAgICAgICAgICAgICAgZm9yZWFjaCB1cCBpbiB1cGRhdGVzOgorICAgICAgICAgICAgICAgICBxZnJhbWVidWZmZXJfdXBkYXRlKGZiLCB1cC54LCB1cC55LCB1cC53LCB1cC5oKQorICAgICAgICAgICAgICAgICAgID0+CisgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIGNsIGluIGZiLmNsaWVudHM6CisgICAgICAgICAgICAgICAgICAgICAgICBjbC51cGRhdGUoY2wub3BhcXVlLCB1cC54LCB1cC55LiB1cC53LCB1cC5oKQorCisgIGh3L2FuZHJvaWQvZ29sZGZpc2gvZmIuYyBpbXBsZW1lbnRzIGEgcHJvZHVjZXIKKyAgdGhlIFFFbXVsYXRvciB0eXBlIGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9tYWluLmMgaW1wbGVtZW50cyBhIGNsaWVudC4KKworCiszIC0gRGlzcGxheVN0YXRlIChjb25zb2xlLmgpOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBUaGUgdXBzdHJlYW0gUUVNVSBzb3VyY2VzIHVzZSBhIERpc3BsYXlTdGF0ZSBvYmplY3QgdG8gbW9kZWwgdGhlIHN0YXRlCisgIG9mIGVhY2ggImRpc3BsYXkiLiBUaGlzIGlzIG5vdCBjb25jZXB0dWFsbHkgZXhhY3RseSB0aGUgc2FtZSB0aGluZyB0aGFuCisgIGEgUUZyYW1lQnVmZmVyIG9iamVjdCBhcyBpdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVtdWxhdGVkIHRleHQtYmFzZWQKKyAgZGlzcGxheXMgaW5zdGVhZCBvZiBwaXhlbCBmcmFtZWJ1ZmZlcnMsIGFuZCBpbmNvcnBvcmF0ZXMgaW5wdXQgc3RhdGUKKyAgYXMgd2VsbC4KKworICBTZWUgc2RsX2Rpc3BsYXlfaW5pdCgpIGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9tYWluLmMgd2hpY2ggaXMgY2FsbGVkIGZyb20gdmwtYW5kcm9pZC5jCisgIG9uIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZSB0aGUgZGlzcGxheS4gVGhpcyByZWFsbHkgcmVnaXN0ZXJzIGEgZnVuY3Rpb24sCisgIHNkbF9yZWZyZXNoKCkgKGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9tYWluLmMpLCB0aGF0IHdpbGwgZ2V0IGNhbGxlZCBldmVyeSAxLzYwdGggb2YKKyAgYSBzZWNvbmQgdG8gaGFuZGxlIHBlbmRpbmcgaW5wdXRzLgorCisgIHNkbF9yZWZyZXNoKCkgYWxzbyBjYWxscyBxZnJhbWVidWZmZXJfY2hlY2tfdXBkYXRlcygpLCBlbnN1cmluZyB0aGF0CisgIGFueSBhbmltYXRpb24gaW4gdGhlIGVtdWxhdGVkIGZyYW1lYnVmZmVyIHdpbGwgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lCisgIGZyZXF1ZW5jeS4KKworICBUaGUgcmVmcmVzaCBmcmVxdWVuY3kgaXMgZGVmaW5lZCBieSB0aGUgR1VJX1JFRlJFU0hfSU5URVJWQUwgZGVmaW5lZAorICBhdCB0aGUgdG9wIG9mIGNvbnNvbGUuaAorCisKKzQgLSBRRW11bGF0b3Igb2JqZWN0OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgQ3VycmVudGx5IGRlZmluZWQgYW5kIGltcGxlbWVudGVkIGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9tYWluLmMgKHdlIG1heSB3YW50IHRvIG1vdmUKKyAgaXQgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24pLiBUaGUgUUVtdWxhdG9yIG9iamVjdCBicmlkZ2VzIHByb3ZpZGVzIGEKKyAgZnJhbWVidWZmZXIgY2xpZW50IHRoYXQgdXNlcyB0aGUgImdlbmVyaWMiIHNraW4gY29kZSB1bmRlciBhbmRyb2lkL3NraW4KKyAgdG8gZGlzcGxheSB0aGUgbWFpbiBVSSB3aW5kb3cuCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQU5EUk9JRC1LRVJORUwuVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtS0VSTkVMLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtS0VSTkVMLlRYVApAQCAtMCwwICsxLDE2MiBAQAorSE9XIFRPIFJFQlVJTFQgVEhFIEFORFJPSUQgRU1VTEFUT1ItU1BFQ0lGSUMgS0VSTkVMOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJLiBIZWxwZXIgc2NyaXB0OgorLS0tLS0tLS0tLS0tLS0tLS0KKworV2Ugbm93IHByb3ZpZGUgYSBoZWxwZXIgc2NyaXB0IHRvIHJlYnVpbGQgdGhlIGtlcm5lbCwKK2l0IGlzIHVuZGVyICRBT1NQL3ByZWJ1aWx0cy9xZW11LWtlcm5lbC9idWlsZC1rZXJuZWwuc2guCisKK01ha2Ugc3VyZSB0byB1c2UgYSBjaGVja291dCBvZiBhb3NwL21hc3Rlciwgbm90IG9uZSBvZiB0aGUgYW9zcC9zdHVkaW8tWFhYCiticmFuY2hlcywgdGhlIGxhdHRlciBkbyBub3QgY29udGFpbiB0aGUgcHJlYnVpbHQgdGFyZ2V0IHRvb2xjaGFpbiBiaW5hcmllcworcmVxdWlyZWQgdG8gcmVidWlsZCB0aGUga2VybmVsLgorCitZb3UgbmVlZCB0aGUgc291cmNlcyBpbiBhbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20va2VybmVsL2dvbGRmaXNoLmdpdCwKK2luIGJyYW5jaCBvcmlnaW4vYW5kcm9pZC1nb2xkZmlzaC08dmVyc2lvbj4sIHdoZXJlIDx2ZXJzaW9uPiBpcyB0aGUKK2tlcm5lbCB2ZXJzaW9uIHRoYXQgYXBwbGllcyB0byB5b3VyIHN5c3RlbSBpbWFnZS4KKworUm91Z2hseSBzcGVha2luZzoKKworICAyLjYuMjcgICAgIC0+IEFueXRoaW5nIGJlZm9yZSBHaW5nZXJicmVhZC4gKDw9IEFuZHJvaWQgMi4yKQorICAyLjYuMjkgICAgIC0+IEZvciBHaW5nZXJicmVhZCAoMi4zKSB1bnRpbCBKZWxseUJlYW4gTVIyICg0LjIueCkKKyAgMy40ICAgICAgICAtPiBGb3IgS2l0S2F0ICg0LjQueCkgYW5kIExvbGxpcG9wIDMyIGJpdCAoNS4wLzUuMSkKKyAgMy4xMCAgICAgICAtPiBGb3IgTG9sbGlwb3AgNjQgYml0IGFuZCBNYXJzaG1hbGxvdyAoNi4wKQorICAzLjE4ICAgICAgIC0+IEN1cnJlbnRseSBleHBlcmltZW50YWwuCisKK0Jlc2lkZXMsIHlvdSBuZWVkIHRvIHNlbGVjdCB0aGUgcmlnaHQgJ2NvbmZpZycsIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZQordmlydHVhbCBib2FyZCB5b3Ugd2FudCB0byBzdXBwb3J0LiBUaGVyZSBhcmUgY3VycmVudGx5IHR3byB0byBjb25zaWRlcjoKKworLSBUaGUgbGVnYWN5IHZpcnR1YWwgYm9hcmQgaXMgY2FsbGVkICdnb2xkZmlzaCcsIGFuZCBjb3JyZXNwb25kcyB0bworICB0aGUgdmlydHVhbCBoYXJkd2FyZSBzdXBwb3J0ZWQgYnkgdGhlIGxlZ2FjeSBRRU1VMSBjb2RlIGJhc2UuCisKKy0gVGhlIG5ld2VzdCB2aXJ0dWFsIGJvYXJkIGlzIGNhbGxlZCAncmFuY2h1JywgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZQorICB2aXJ0dWFsIGhhcmR3YXJlIHN1cHBvcnRlZCBieSB0aGUgUUVNVTIgY29kZSBiYXNlLgorCitUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGF0ICdnb2xkZmlzaCcgc3VwcG9ydHMgb2Jzb2xldGUKK2dvbGRmaXNoLXNwZWNpZmljIE5BTkQgYW5kIGVNTUMgdmlydHVhbCBkZXZpY2VzIHRoYXQgYXJlIHJlcGxhY2VkIGJ5Cit2aXJ0aW8tYmxvY2sgaW4gUUVNVTIgKGZvciBtdWNoIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkpLgorRm9yIG1vcmUgZGV0YWlscywgc2VlIGRvY3MvR09MREZJU0gtVklSVFVBTC1IQVJEV0FSRS5UWFQuCisKK1lvdSBzcGVjaWZ5IHdoaWNoIGFyY2hpdGVjdHVyZSB0byBidWlsZCBmb3Igd2l0aCB0aGUgLS1hcmNoPTxuYW1lPgorb3B0aW9uLCB3aGVyZSA8bmFtZT4gaXMgb25lIG9mIHRoZSBlbXVsYXRvcidzIENQVSBhcmNoaXRlY3R1cmUgbmFtZQorKGUuZy4gJ2FybScsICdtaXBzJywgJ3g4NicsICd4ODZfNjQnLCAnYXJtNjQnIGFuZCAnbWlwczY0JykuCisKK0VhY2ggYXJjaGl0ZWN0dXJlIGhhcyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiAodHlwaWNhbGx5ICdnb2xkZmlzaCcpIHRoYXQKK3lvdSBjYW4gb3ZlcnJpZGUgd2l0aCB0aGUgLS1jb25maWc9PG5hbWU+IG9wdGlvbiwgd2hlcmUgPG5hbWU+IGlzIHRoZSBuYW1lCitvZiBhIHN1Yi1kaXJlY3RvcnkgdW5kZXIgJEtFUk5FTC9hcmNoLyovY29uZmlncy8KKworVGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB3aWxsIGJlIC90bXAva2VybmVsLXFlbXUvPGFyY2g+LTxrZXJuZWxfdmVyc2lvbj4vCitidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGVuIHdpdGggdGhlIC0tb3V0PTxkaXI+IG9wdGlvbi4KKworQnkgZGVmYXVsdCB0aGUgc2NyaXB0IHRyaWVzIHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgdG9vbGNoYWluIGZyb20KKyRBT1NQL3ByZWJ1aWx0cy9nY2MvLCBidXQgeW91IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IG9uZSB1c2luZyB0aGUKKy0tY3Jvc3M9PHByZWZpeD4gb3B0aW9uLgorCitTZWUgYnVpbGQta2VybmVsLnNoIC0taGVscCBmb3IgbW9yZSBvcHRpb25zIGFuZCBkZXRhaWxzLgorCitIZXJlJ3MgYSB0YWJsZSBvZiBvcHRpb25zIHRvIHJlYnVpbGQgcG9wdWxhciBrZXJuZWwgY29uZmlndXJhdGlvbjoKKworICBHb2xkZmlzaDoKKyAgICAgMzItYml0IEFSTXY3LUEgICAgIC0tYXJjaD1hcm0KKyAgICAgMzItYml0IGkzODYgICAgICAgIC0tYXJjaD14ODYKKyAgICAgMzItYml0IE1JUFMgICAgICAgIC0tYXJjaD1taXBzCisgICAgIDY0LWJpdCB4ODZfNjQgICAgICAtLWFyY2g9eDg2XzY0CisKKyAgUmFuY2h1OgorICAgICAzMi1iaXQgQVJNdjctQSAgICAgLS1hcmNoPWFybSAtLWNvbmZpZz1yYW5jaHUKKyAgICAgMzItYml0IGkzODYgICAgICAgIC0tYXJjaD14ODYgLS1jb25maWc9aTM4Nl9yYW5jaHUKKyAgICAgMzItYml0IE1JUFMgICAgICAgIC0tYXJjaD1taXBzIC0tY29uZmlnPXJhbmNodQorICAgICA2NC1iaXQgQVJNdjggICAgICAgLS1hcmNoPWFybTY0CisgICAgIDY0LWJpdCB4ODZfNjQgICAgICAtLWFyY2g9eDg2XzY0IC0tY29uZmlnPXg4Nl82NF9yYW5jaHUKKyAgICAgNjQtYml0IE1JUFMgICAgICAgIC0tYXJjaD1taXA2NCAtLWNvbmZpZz1yYW5jaHUKKworVGhlIHNjcmlwdCB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gaXRzIG91dHB1dCBkaXJlY3Rvcnk6CisKKyAgICBrZXJuZWwtcWVtdSAgICAgICAgICAgIFRoZSBrZXJuZWwgaW1hZ2UgdG8gYmUgdXNlZCB3aXRoIFFFTVUsIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVtdWxhdG9yJ3MgJy1rZXJuZWwgPGZpbGU+JyBvcHRpb24gdG8gdXNlIGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgPGZpbGU+IGlzIHRoZSBwYXRoIHRvIHRoaXMgZmlsZS4KKworICAgIHZtbGludXgtcWVtdSAgICAgICAgICAgVGhlIHN5bWJvbCBmaWxlIHVzZWQgdG8gZGVidWcgdGhlIGtlcm5lbCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHREIgKHNlZSBiZWxvdykuCisKKyAgICBMSU5VWF9LRVJORUxfQ09QWUlORyAgIFRoZSBrZXJuZWwncyBsaWNlbnNlIGZpbGUsIG11c3QgYmUgcHJvdmlkZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjb3B5IG9mIHRoZSBiaW5hcnkuCisKKyAgICBSRUFETUUgICAgICAgICAgICAgICAgIFNtYWxsIFJFQURNRSBmaWxlIGV4cGxhaW5pbmcgaG93IHRoaXMgd2FzIGJ1aWx0LgorCitJSS4gRGVidWdnaW5nIHRoZSBrZXJuZWwgd2l0aCBRRU1VOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiB0aGUgY2FzZSB3aGVyZSB5b3UgbmVlZCB0byBkZWJ1ZyB0aGUga2VybmVsIChlLmcuIHRvIGluc3BlY3Qga2VybmVsIHBhbmljcykKK3lvdSBjYW4gZG8gdGhhdCBieSBmb2xsb3dpbmcgdGhpcyBwcm9jZWR1cmU6CisKKyAgMSkgUmVidWlsZCB0aGUga2VybmVsIGZyb20gc291cmNlcyAoc2VlIHByZXZpb3VzIHNlY3Rpb24pLgorCisgIDIpIFN0YXJ0IHRoZSBlbXVsYXRvciB3aXRoIHNwZWNpYWwgb3B0aW9ucyB0byB1c2UgdGhlIG5ldyBrZXJuZWwgaW1hZ2UsCisgICAgIHN0YXJ0IGtlcm5lbCBkZWJ1Z2dpbmcsIGFuZCBub3Qgc3RhcnQgdGhlIHZDUFUgdG8gd2FpdCB0byBHREI6CisKKyAgICAgICAgIGVtdWxhdG9yIC1rZXJuZWwgL3BhdGgvdG8va2VybmVsLXFlbXUgXAorICAgICAgICAgICAgICAgICAgPG90aGVyLW9wdGlvbnM+IFwKKyAgICAgICAgICAgICAgICAgIC1xZW11IC1zIC1TCisKKyAgMykgSW4gYW5vdGhlciB0ZXJtaW5hbCwgc3RhcnQgYSBHREIgY2xpZW50IHRoYXQgd2lsbCBhdHRhY2ggdG8gdGhlIGVtdWxhdG9yCisgICAgIHByb2Nlc3MsIGFmdGVyIHJlYWRpbmcgdGhlIGtlcm5lbCBzeW1ib2wgZmlsZToKKworICAgICAgICAgJEFPU1AvcHJlYnVpbHRzL2dkYi9saW51eC14ODYvYmluL2dkYgorICAgICAgICAgZmlsZSAvcGF0aC90by92bWxpbnV4LXFlbXUKKyAgICAgICAgIHRhcmdldCByZW1vdGUgOjEyMzQKKyAgICAgICAgIGIgcGFuaWMKKyAgICAgICAgIGMKKworTk9URTogVGhlIHZlcnNpb24gb2YgZ2RiIHVuZGVyICRBT1NQL3ByZWJ1aWx0cy8gc3VwcG9ydHMgYWxsIEFuZHJvaWQgdGFyZ2V0CisgICAgICBhcmNoaXRlY3R1cmVzLiBZb3VyICdob3N0JyBnZGIgcHJvYmFibHkgb25seSBzdXBwb3J0cyB4ODYveDg2XzY0LgorCitOT1RFOiBZb3UgY2FuIHBsYWNlIGFzIG1hbnkgYnJlYWtwb2ludHMgYXMgeW91IHdhbnQgd2l0aCB0aGUgJ2InIGNvbW1hbmQgYmVmb3JlCisgICAgICBzdGFydGluZyBleGVjdXRpb24gd2l0aCB0aGUgJ2MnIGNvbW1hbmQuCisKK09uY2UgeW91IHJlYWNoIHRoZSBicmVha3BvaW50LCB1c2UgJ2J0JyB0byBwcmludCBhIHN0YWNrIHRyYWNlLiBTZWUgdGhlIEdEQgorbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKK0lJSS4gUmVidWlsZGluZyBmcm9tIHNjcmF0Y2g6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBkb24ndCBvciBjYW4ndCB1c2UgdGhlIHNjcmlwdCwgaGVyZSBhcmUgbWFudWFsIGluc3RydWN0aW9uczoKKworWW91IG5lZWQgdG8gaGF2ZSBhbiBhcHByb3ByaWF0ZSBjcm9zcy10b29sY2hhaW4gaW4geW91ciBwYXRoCisoZS5nLiAnYXJtLWVhYmktZ2NjIC0tdmVyc2lvbicgbXVzdCB3b3JrKQorCit0aGVuIChmb3IgdmVyc2lvbiAyLjYuMjkpOgorCitnaXQgY2xvbmUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20va2VybmVsL2dvbGRmaXNoLmdpdCBrZXJuZWwtZ29sZGZpc2gKK2NkIGtlcm5lbC1nb2xkZmlzaAorZ2l0IGNoZWNrb3V0IG9yaWdpbi9hbmRyb2lkLWdvbGRmaXNoLTIuNi4yOQorCitleHBvcnQgQ1JPU1NfQ09NUElMRT1hcm0tZWFiaS0KK2V4cG9ydCBBUkNIPWFybQorZXhwb3J0IFNVQkFSQ0g9YXJtCittYWtlIGdvbGRmaXNoX2RlZmNvbmZpZyAgICAjIGNvbmZpZ3VyZSB0aGUga2VybmVsCittYWtlIC1qMiAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIGl0CisKKz0+IHRoaXMgZ2VuZXJhdGVzIGEgZmlsZSBuYW1lZCBhcmNoL2FybS9ib290L3pJbWFnZQorCitOT1RFOiBCcmFuY2ggYW5kcm9pZC1nb2xkZmlzaC0yLjYuMjcgaXMgb2Jzb2xldGUgbm93LiBEbyBub3QgdXNlIGl0LgorCitOb3csIHlvdSBjYW4gdXNlIGl0IHdpdGg6CisKKyAgZW11bGF0b3IgLWtlcm5lbCBwYXRoL3RvL3lvdXIvbmV3L3pJbWFnZSA8b3RoZXItb3B0aW9ucz4KKworCitZb3UgY2FuIGJ1aWxkIGFuIEFSTXY3LWNvbXBhdGlibGUga2VybmVsIGltYWdlIGJ5IHVzaW5nIGdvbGRmaXNoX2FybXY3X2RlZmNvbmZpZworaW4gdGhlIGFib3ZlIGluc3RydWN0aW9ucyAoaW5zdGVhZCBvZiBnb2xkZmlzaF9kZWZjb25maWcpLiBOb3RlIHRoYXQgeW91IHdpbGwKK25lZWQgdG8gZW5hYmxlIEFSTXY3IGVtdWxhdGlvbiBieSB1c2luZyB0aGUgLWNwdSBjb3J0ZXgtYTggb3B0aW9uLCBhcyBpbjoKKworICBlbXVsYXRvciAta2VybmVsIHBhdGgvdG8veW91ci9uZXcvekltYWdlIDxvdGhlci1vcHRpb25zPiAtcWVtdSAtY3B1IGNvcnRleC1hOAorCitBcyBhIHNwZWNpYWwgY29udmVuaWVuY2UsIGlmIHRoZSBuYW1lIG9mIHlvdXIga2VybmVsIGltYWdlIGVuZHMgaW4gLWFybXY3LCB0aGVuCit0aGUgZW11bGF0b3IgYmluYXJ5IHdpbGwgYXV0b21hdGljYWxseSBlbmFibGUgQVJNdjcgZW11bGF0aW9uIGZvciB5b3UsIHNvIGRvaW5nCit0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBlcXVpdmFsZW50CisKKyAgZW11bGF0b3IgLWtlcm5lbCBwYXRoL3RvL3lvdXIva2VybmVsLWFybXY3IDxvdGhlci1vcHRpb25zPgorCitWb2lsYSAhCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQU5EUk9JRC1LRVlCT0FSRC1FTVVMQVRJT04uVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtS0VZQk9BUkQtRU1VTEFUSU9OLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmOTNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtS0VZQk9BUkQtRU1VTEFUSU9OLlRYVApAQCAtMCwwICsxLDg4IEBACitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGV4cGxhaW5zIGhvdyBrZXlib2FyZCBlbXVsYXRpb24gd29ya3MgaW4gdGhlIEFuZHJvaWQgZW11bGF0b3IuCitTaG9ydCB2ZXJzaW9uOiBpdCdzIG5vdCBwcmV0dHkuCisKK0d1ZXN0IHN5c3RlbSB2aWV3IG9mIGlucHV0IGtleXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZ29sZGZpc2ggZXZlbnRzIHZpcnR1YWwgZGV2aWNlIChzZWUgR09MREZJU0gtVklSVFVBTC1IQVJEV0FSRS5UWFQpIGlzIHVzZWQKK3RvIHNlbmQga2V5Ym9hcmQtcmVsYXRlZCBldmVudHMgdG8gdGhlIGtlcm5lbC4gTW9yZSBzcGVjaWZpY2FsbHk6CisKKyAgLSBFYWNoIHZpcnR1YWwgJ2tleWRvd24nIGlzIHNlbnQgYXMgYSBzaW5nbGUgKEVWX0tFWSwgPGtleWNvZGU+LCAxKSB0dXBsZS4KKyAgLSBFYWNoIHZpcnR1YWwgJ2tleXVwJyBpcyBzZW50IGFzIGEgc2luZ2xlIChFVl9LRVksIDxrZXljb2RlPiwgMCkgdHVwbGUuCisKK1doZXJlIDxrZXljb2RlPiBpcyBhIDktYml0IExpbnV4IGhhcmR3YXJlIGtleWNvZGUsIGFzIGRlZmluZWQgaW4KK2FuZHJvaWQvc2tpbi9saW51eF9rZXljb2Rlcy5oLgorCitUaGUgZ3Vlc3QgQW5kcm9pZCBzeXN0ZW0gcmVjZWl2ZXMgTGludXgga2V5Y29kZXMgZnJvbSB0aGUga2VybmVsLCBhbmQKK3RyYW5zbGF0ZXMgdGhlbSBpbnRvIFVuaWNvZGUgdmFsdWVzIHRocm91Z2ggYSAnY2hhcm1hcCBmaWxlJy4gVGhpcyBmaWxlCithY3RzIGFzIGEgbWFwIGZyb20gKGJhc2Uga2V5IGNvZGUgKyBtb2RpZmllcnMpIC0+IHVuaWNvZGUgcG9pbnQuCisKK0FuIGVtdWxhdGVkIHN5c3RlbSBpbWFnZSBub3JtYWxseSBjb250YWlucyBhIHNpbmdsZSBjaGFybWFwIG5hbWVkICdxd2VydHkyJywKK3dob3NlIGNvbnRlbnQgaXMgZHVwbGljYXRlZCB1bmRlciBhbmRyb2lkL3NraW4vY2hhcm1hcC5jIChzZWUgdGhpcyBmaWxlIGZvcgorZGV0YWlscykuCisKK0l0J3MgcG9zc2libGUgdG8gbG9hZCBhbiBhbHRlcm5hdGl2ZSBjaGFybWFwIGluIHRoZSBlbXVsYXRvciB3aXRoIHRoZQorJy1jaGFybWFwIDxmaWxlPicgb3B0aW9uLCB3aGVyZSA8ZmlsZT4gcG9pbnRzIHRvIGFuIEFuZHJvaWQgY2hhcm1hcCBmaWxlCisod2hpY2ggdHlwaWNhbGx5IGVuZCBpbiAua2NtKS4gVGhpcyBmZWF0dXJlIGhhcyB2ZXJ5IHJhcmVseSBiZWVuIHVzZWQgdGhvdWdoLgorCitUaGUgc291cmNlIGZpbGUgYWJvdmUgYWxzbyBjb250YWlucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIHBlcmZvcm0gYSByZXZlcnNlCittYXBwaW5nIG9wZXJhdGlvbjogZ2l2ZW4gYSBVbmljb2RlIHZhbHVlLCBnZW5lcmF0ZSB0aGUgc2VxdWVuY2Ugb2Yga2V5IHN0cm9rZXMKK2ZvciB0aGUgY29ycmVzcG9uZGluZyAna2V5ZG93bicgb3IgJ2tleXVwJyBldmVudCwgaWYgcG9zc2libGUuCisKK1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBhbHdheXMgcG9zc2libGUsIGZvciBleGFtcGxlLCAncXdlcnR5MicgZG9lc24ndCBjb250YWluCithbnkgZW50cnkgdGhhdCBhbGxvd3Mgb25lIHRvIGdlbmVyYXRlIGFuIGFjY2VudGVkIGxldHRlciBsaWtlICfDqScuIFRoaXMgaXMgYQorKmZ1bmRhbWVudGFsKiBsaW1pdGF0aW9uIG9mIGtleWJvYXJkIGVtdWxhdGlvbiBhcyBpdCBjdXJyZW50bHkgaXMgaW1wbGVtZW50ZWQuCisKKworQW5kcm9pZCBlbXVsYXRvciBVSSBrZXlib2FyZCBoYW5kbGluZzoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gU0RMIDEueCBpcyBiZWluZyB1c2VkLCBpdCBnZW5lcmF0ZXMgU0RMX0tFWURPV04gYW5kIFNES19LRVlVUCBldmVudHMgZnJvbQordXNlciBrZXlwcmVzc2VzLCB0aGVzZSBjb250YWluIHRocmVlIGltcG9ydGFudCBmaWVsZHM6CisKKyAgIGtleWNvZGU6ICAgIEEgaGFyZHdhcmUtYWdub3N0aWMgc2NhbmNvZGUsIGp1c3QgbGlrZSBMaW51eCBrZXljb2RlcyBidXQgd2l0aAorICAgICAgICAgICAgICAgZGlmZmVyZW50IHZhbHVlcy4KKworICAgbW9kOiAgICAgICAgQSBiaXRtYXNrIG9mIGFjdGl2aWUgbW9kaWZpZXIga2V5cyAoZS5nLiBTaGlmdCwgQ3RybCwgTWV0YSkuCisKKyAgIHVuaWNvZGU6ICAgIFRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgdmFsdWUsIGlmIGF2YWlsYWJsZSwgb3IgMC4gTm90ZSB0aGF0CisgICAgICAgICAgICAgICB0aGlzIGlzIG9ubHkgcHJvcGVybHkgcG9wdWxhdGVkIG9uIEtFWURPV04gZXZlbnRzLCBpdCBpcyBhbHdheXMKKyAgICAgICAgICAgICAgIDAgb24gS0VZVVAgb25lLCBkdWUgdG8gdGhlIHdheSBTREwgMS54IGlzIGltcGxlbWVudGVkLgorCisKK1dpdGggU0RMIDIueCwgdGhpbmdzIGFyZSBhIGJpdCBkaWZmZXJlbnQgdGhvdWdoLCBiZWNhdXNlIHRoZSB8dW5pY29kZXwgZmllbGQKK2lzIG5vIGxvbmdlciBwYXJ0IG9mIFNES19LRVlET1dOL0tFWVVQIGV2ZW50cy4gSW5zdGVhZCwgdGhlcmUgaXMgYSBuZXcgZXZlbnQKK3R5cGUgU0RMX1RFWFRJTlBVVCB0aGF0IGNvbnRhaW5zIGEgX2xpc3RfIG9mIFVuaWNvZGUgcG9pbnRzICh0byBhY2NvbW9kYXRlCitmb3IgY29tcGxleCBJbnB1dCBNZXRob2QgRW5naW5lcykuIFRoZXNlIGV2ZW50cyB0eXBpY2FsbHkgYXBwZWFyIGFmdGVyCitTRExfS0VZRE9XTiBvbmVzLgorCitXaGVuIHRoZSBVSSByZWNlaXZlcyBhIFNETF9LRVlET1dOIGV2ZW50LCBpdCBtdXN0IGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggaXQsCitpLmUuOgorCisgIDEpIEl0IG11c3QgY2hlY2sgd2hldGhlciB0aGlzIGlzIG9uZSBvZiB0aGUgVUkga2V5Ym9hcmQgc2hvcnRjdXRzCisgICAgIChlLmcuIEN0cmwtRjExIHRvIHN3aXRjaCB0byB0aGUgcHJldmlvdXMgbGF5b3V0KSwgdGhhdCBtdXN0IF9ub3RfCisgICAgIGJlIHBhc3NlZCB0byB0aGUgZ3Vlc3Qgc3lzdGVtLiBBbmQgaGFuZGxlIHRoZW0uCisKKyAgMikgSXQgbXVzdCByb3RhdGUgRFBhZCAvIEFycm93IGV2ZW50cyBiYXNlZCBvbiB0aGUgbGF5b3V0IG9yaWVudGF0aW9uLAorICAgICBiZWNhdXNlIHRoYXQncyB3aGF0IHRoZSBndWVzdCBzeXN0ZW0gZXhwZWN0cyAoZHVlIHRvIGxvbmcgaGlzdG9yaWNhbAorICAgICByZWFzb25zKS4KKworICAzKSBJdCBtdXN0IHJldmVyc2UtbWFwIHRoZSBVbmljb2RlIHZhbHVlIGludG8gTGludXgga2V5Y29kZXMgdXNpbmcgdGhlCisgICAgIGN1cnJlbnQgY2hhcm1hcC4KKworICAgICBXaGVuIFNETCAxLnggaXMgdXNlZCwgdGhlIHx1bmljb2RlfCBmaWVsZCBmcm9tIHRoZSBTRExfS0VZRE9XTiBldmVudAorICAgICBjYW4gYmUgdXNlZCBkaXJlY3RseSwgZm9yIFNETCAyLngsIHRoZSBTRExfS0VZRE9XTiBldmVudCBtdXN0IGJlIGlnbm9yZWQsCisgICAgIGFuZCB0aGUgU0RMX1RFWFRJTlBVVCBldmVudCBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KKworVG8gYmV0dGVyIG1hdGNoIGJvdGggbW9kZWxzLCB0aGUgVUkgZXZlbnQgaGFuZGxpbmcgdXNlcyBhIG1vZGVsIHNpbWlsYXIgdG8KK1NETCAyLngsIHdoZXJlOgorCisgIC0gU0RMIDIueCBldmVudHMgYXJlIGRpcmVjdGx5IG1hcHBlZCB0byBrRXZlbnRLZXlVcCwga0V2ZW50S2V5RG93biBhbmQKKyAgICBrRXZlbnRUZXh0SW5wdXQgYXMgZGVmaW5lZCBpbiBhbmRyb2lkL3NraW4vZXZlbnQuaAorCisgIC0gU0RMIDEueCBldmVudHMgYXJlIHRyYW5zbGF0ZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBrRXZlbnRYWFggdmFsdWVzLAorICAgIGFuZCBrRXZlbnRUZXh0SW5wdXQgZXZlbnRzIGFyZSBzeW50aGV0aXplZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCisgICAgfHVuaWNvZGV8IGZpZWxkIG9mIFNETF9LRVlET1dOIGV2ZW50cy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9BTkRST0lELVFFTVUtUElQRS5UWFQgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1RRU1VLVBJUEUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTg1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1RRU1VLVBJUEUuVFhUCkBAIC0wLDAgKzEsMzE2IEBACitBbmRyb2lkIFFFTVUgRkFTVCBQSVBFUworPT09PT09PT09PT09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uOgorLS0tLS0tLS0tLS0tLQorCitUaGUgQW5kcm9pZCBlbXVsYXRvciBpbXBsZW1lbnRzIGEgc3BlY2lhbCB2aXJ0dWFsIGRldmljZSB1c2VkIHRvIHByb3ZpZGUKK192ZXJ5XyBmYXN0IGNvbW11bmljYXRpb24gY2hhbm5lbHMgYmV0d2VlbiB0aGUgZ3Vlc3Qgc3lzdGVtIGFuZCB0aGUKK2VtdWxhdG9yIGl0c2VsZi4KKworRnJvbSB0aGUgZ3Vlc3QsIHVzYWdlIGlzIHNpbXBseSBhcyBmb2xsb3dzOgorCisgIDEvIE9wZW4gdGhlIC9kZXYvcWVtdV9waXBlIGRldmljZSBmb3IgcmVhZCt3cml0ZQorCisgICAgIE5PVEU6IFN0YXJ0aW5nIHdpdGggTGludXggMy4xMCwgdGhlIGRldmljZSB3YXMgcmVuYW1lZCBhcworICAgICAgICAgICAvZGV2L2dvbGRmaXNoX3BpcGUgYnV0IGJlaGF2ZXMgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkuCisKKyAgMi8gV3JpdGUgYSB6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGRlc2NyaWJpbmcgd2hpY2ggc2VydmljZSB5b3Ugd2FudCB0bworICAgICBjb25uZWN0LgorCisgIDMvIFNpbXBseSB1c2UgcmVhZCgpIGFuZCB3cml0ZSgpIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZpY2UuCisKK0luIG90aGVyIHdvcmRzOgorCisgICBmZCA9IG9wZW4oIi9kZXYvcWVtdV9waXBlIiwgT19SRFdSKTsKKyAgIGNvbnN0IGNoYXIqIHBpcGVOYW1lID0gIjxwaXBlbmFtZT4iOworICAgcmV0ID0gd3JpdGUoZmQsIHBpcGVOYW1lLCBzdHJsZW4ocGlwZU5hbWUpKzEpOworICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAvLyBlcnJvcgorICAgfQorICAgLi4uIHJlYWR5IHRvIGdvCisKK1doZXJlIDxwaXBlbmFtZT4gaXMgdGhlIG5hbWUgb2YgYSBzcGVjaWZpYyBlbXVsYXRvciBzZXJ2aWNlIHlvdSB3YW50IHRvIHVzZS4KK1N1cHBvcnRlZCBzZXJ2aWNlIG5hbWVzIGFyZSBsaXN0ZWQgbGF0ZXIgaW4gdGhpcyBkb2N1bWVudC4KKworCitJbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gdGhlIGVtdWxhdG9yIHNvdXJjZSB0cmVlOgorCisgICAgLi9ody9hbmRyb2lkL2dvbGRmaXNoL3BpcGUuYyBpbXBsZW1lbnRzIHRoZSB2aXJ0dWFsIGRyaXZlci4KKworICAgIC4vaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmggcHJvdmlkZXMgdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUKKyAgICBpbXBsZW1lbnRlZCBieSBhbnkgZW11bGF0b3IgcGlwZSBzZXJ2aWNlLgorCisgICAgLi9hbmRyb2lkL2h3LXBpcGUtbmV0LmMgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBuZXR3b3JrIHBpcGUKKyAgICBzZXJ2aWNlcyAoaS5lLiAndGNwJyBhbmQgJ3VuaXgnKS4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgorCitJbiB0aGUga2VybmVsIHNvdXJjZSB0cmVlOgorCisgICAgZHJpdmVycy9taXNjL3FlbXVwaXBlL3FlbXVfcGlwZS5jIGNvbnRhaW5zIHRoZSBkcml2ZXIgc291cmNlIGNvZGUKKyAgICB0aGF0IHdpbGwgYmUgYWNjZXNzaWJsZSBhcyAvZGV2L3FlbXVfcGlwZSB3aXRoaW4gdGhlIGd1ZXN0LgorCisKK0RldmljZSAvIERyaXZlciBQcm90b2NvbCBkZXRhaWxzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBkZXZpY2UgYW5kIGRyaXZlciB1c2UgYW4gSS9PIG1lbW9yeSBwYWdlIGFuZCBhbiBJUlEgdG8gY29tbXVuaWNhdGUuCisKKyAgLSBUaGUgZHJpdmVyIHdyaXRlcyB0byB2YXJpb3VzIEkvTyByZWdpc3RlcnMgdG8gc2VuZCBjb21tYW5kcyB0byB0aGUKKyAgICBkZXZpY2UuCisKKyAgLSBUaGUgZGV2aWNlIHJhaXNlcyBhbiBJUlEgdG8gaW5zdHJ1Y3QgdGhlIGRyaXZlciB0aGF0IGNlcnRhaW4gZXZlbnRzCisgICAgb2NjdXJlZC4KKworICAtIFRoZSBkcml2ZXIgcmVhZHMgSS9PIHJlZ2lzdGVycyB0byBnZXQgdGhlIHN0YXR1cyBvZiBpdHMgbGF0ZXN0IGNvbW1hbmQsCisgICAgb3IgdGhlIGxpc3Qgb2YgZXZlbnRzIHRoYXQgb2NjdXJlZCBpbiBjYXNlIG9mIGludGVycnVwdC4KKworRWFjaCBvcGVuZWQgZmlsZSBkZXNjcmlwdG9yIHRvIC9kZXYvcWVtdV9waXBlIGluIHRoZSBndWVzdCBjb3JyZXNwb25kcyB0byBhCiszMi1iaXQgJ2NoYW5uZWwnIHZhbHVlIGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyLgorCitUaGUgZm9sbG93aW5nIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXMgY29tbWFuZHMgc2VudCBieSB0aGUgZHJpdmVyCit0byB0aGUgZGV2aWNlLiBWYXJpYWJsZSBuYW1lcyBiZWdpbm5pbmcgd2l0aCBSRUdfIGNvcnJlc3BvbmQgdG8gMzItYml0IEkvTworcmVnaXN0ZXJzOgorCisgIDAvIENoYW5uZWwgYW5kIGFkZHJlc3MgdmFsdWVzOgorCisgICAgIEVhY2ggY29tbXVuaWNhdGlvbiBjaGFubmVsIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgbm9uLXplcm8gdmFsdWUKKyAgICAgd2hpY2ggaXMgZWl0aGVyIDMyLWJpdCBvciA2NC1iaXQsIGRlcGVuZGluZyBvbiB0aGUgZ3Vlc3QgQ1BVCisgICAgIGFyY2hpdGVjdHVyZS4KKworICAgICBUaGUgY2hhbm5lbCB2YWx1ZSBzZW50IGZyb20gdGhlIGtlcm5lbCB0byB0aGUgZW11bGF0b3Igd2l0aDoKKworICAgICAgICB2b2lkIHdyaXRlX2NoYW5uZWwoY2hhbm5lbCkgeworICAgICAgICAjaWYgNjRCSVRfR1VFU1RfQ1BVCisgICAgICAgICAgUkVHX0NIQU5ORUxfSElHSCA9IChjaGFubmVsID4+IDMyKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgUkVHX0NIQU5ORUwgPSAoY2hhbm5lbCAmIDB4ZmZmZmZmZmZVKTsKKyAgICAgICAgfQorCisgICAgU2ltaWxhcmx5LCB3aGVuIHBhc3NpbmcgYSBrZXJuZWwgYWRkcmVzcyB0byB0aGUgZW11bGF0b3I6CisKKyAgICAgICAgdm9pZCB3cml0ZV9hZGRyZXNzKGJ1ZmZlcl9hZGRyZXNzKSB7CisgICAgICAgICNpZiA2NEJJVF9HVUVTVF9DUFUKKyAgICAgICAgICBSRUdfQUREUkVTU19ISUdIID0gKGJ1ZmZlcl9hZGRyZXNzID4+IDMyKTsKKyAgICAgICAgI2VuZGlmCisgICAgICAgICAgUkVHX0FERFJFU1MgPSAoYnVmZmVyX2FkZHJlc3MgJiAweGZmZmZmZmZmVSk7CisgICAgICAgIH0KKworICAxLyBDcmVhdGluZyBhIG5ldyBjaGFubmVsOgorCisgICAgIFVzZWQgYnkgdGhlIGRyaXZlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBndWVzdCBqdXN0IG9wZW5lZCAvZGV2L3FlbXVfcGlwZQorICAgICB0aGF0IHdpbGwgYmUgaWRlbnRpZmllZCBieSBhIG5hbWVkICc8Y2hhbm5lbD4nOgorCisgICAgICAgIHdyaXRlX2NoYW5uZWwoPGNoYW5uZWw+KQorICAgICAgICBSRUdfQ01EID0gQ01EX09QRU4KKworICAgICBJTVBPUlRBTlQ6IDxjaGFubmVsPiBzaG91bGQgbmV2ZXIgYmUgMAorCisgIDIvIENsb3NpbmcgYSBjaGFubmVsOgorCisgICAgIFVzZWQgYnkgdGhlIGRyaXZlciB0byBpbmRpY2F0ZSB0aGF0IHRoZSBndWVzdCBjYWxsZWQgJ2Nsb3NlJyBvbiB0aGUKKyAgICAgY2hhbm5lbCBmaWxlIGRlc2NyaXB0b3IuCisKKyAgICAgICAgd3JpdGVfY2hhbm5lbCg8Y2hhbm5lbD4pCisgICAgICAgIFJFR19DTUQgPSBDTURfQ0xPU0UKKworICAzLyBXcml0aW5nIGRhdGEgdG8gdGhlIGNoYW5uZWw6CisKKyAgICAgQ29ycmVzcG9uZHMgdG8gd2hlbiB0aGUgZ3Vlc3QgZG9lcyBhIHdyaXRlKCkgb3Igd3JpdGV2KCkgb24gdGhlCisgICAgIGNoYW5uZWwncyBmaWxlIGRlc2NyaXB0b3IuIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgYSBzaW5nbGUKKyAgICAgbWVtb3J5IGJ1ZmZlcjoKKworICAgICAgICB3cml0ZV9jaGFubmVsKDxjaGFubmVsPikKKyAgICAgICAgd3JpdGVfYWRkcmVzcyg8YnVmZmVyLWFkZHJlc3M+KQorICAgICAgICBSRUdfU0laRSAgICA9IDxidWZmZXItc2l6ZT4KKyAgICAgICAgUkVHX0NNRCAgICAgPSBDTURfV1JJVEVfQlVGRkVSCisKKyAgICAgICAgc3RhdHVzID0gUkVHX1NUQVRVUworCisgICAgTk9URTogVGhlIDxidWZmZXItYWRkcmVzcz4gaXMgdGhlICpHVUVTVCogYnVmZmVyIGFkZHJlc3MsIG5vdCB0aGUKKyAgICAgICAgICBwaHlzaWNhbC9rZXJuZWwgb25lLgorCisgICAgSU1QT1JUQU5UOiBUaGUgYnVmZmVyIHNlbnQgdGhyb3VnaCB0aGlzIGNvbW1hbmQgU0hBTEwgQUxXQVlTIGJlIGVudGlyZWx5CisgICAgICAgICAgICAgICBjb250YWluZWQgaW5zaWRlIGEgc2luZ2xlIHBhZ2Ugb2YgZ3Vlc3QgbWVtb3J5LiBUaGlzIGlzCisgICAgICAgICAgICAgICBlbmZvcmNlZCB0byBzaW1wbGlmeSBib3RoIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuCisKKyAgICAgICAgICAgICAgIFdoZW4gYSB3cml0ZSgpIHNwYW5zIHNldmVyYWwgcGFnZXMgb2YgZ3Vlc3QgbWVtb3J5LCB0aGUKKyAgICAgICAgICAgICAgIGRyaXZlciB3aWxsIGlzc3VlIHNldmVyYWwgQ01EX1dSSVRFX0JVRkZFUiBjb21tYW5kcyBpbgorICAgICAgICAgICAgICAgc3VjY2Vzc2lvbiwgdHJhbnNwYXJlbnRseSB0byB0aGUgY2xpZW50LgorCisgICAgVGhlIHZhbHVlIHJldHVybmVkIGJ5IFJFR19TVEFUVVMgc2hvdWxkIGJlOgorCisgICAgICAgPiAwICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHdyaXR0ZW4gdG8gdGhlIHBpcGUKKyAgICAgICAwICAgICAgVG8gaW5kaWNhdGUgZW5kLW9mLXN0cmVhbSBzdGF0dXMKKyAgICAgICA8IDAgICAgQSBuZWdhdGl2ZSBlcnJvciBjb2RlIChzZWUgYmVsb3cpLgorCisgICAgT24gaW1wb3J0YW50IGVycm9yIGNvZGUgaXMgUElQRV9FUlJPUl9BR0FJTiwgdXNlZCB0byBpbmRpY2F0ZSB0aGF0CisgICAgd3JpdGVzIGNhbid0IGJlIHBlcmZvcm1lZCB5ZXQuIFNlZSBDTURfV0FLRV9PTl9XUklURSBmb3IgbW9yZS4KKworICA0LyBSZWFkaW5nIGRhdGEgZnJvbSB0aGUgY2hhbm5lbDoKKworICAgIENvcnJlc3BvbmRzIHRvIHdoZW4gdGhlIGd1ZXN0IGRvZXMgYSByZWFkKCkgb3IgcmVhZHYoKSBvbiB0aGUKKyAgICBjaGFubmVsJ3MgZmlsZSBkZXNjcmlwdG9yLgorCisgICAgICAgIHdyaXRlX2NoYW5uZWwoPGNoYW5uZWw+KQorICAgICAgICB3cml0ZV9hZGRyZXNzKDxidWZmZXItYWRkcmVzcz4pCisgICAgICAgIFJFR19TSVpFICAgID0gPGJ1ZmZlci1zaXplPgorICAgICAgICBSRUdfQ01EICAgICA9IENNRF9SRUFEX0JVRkZFUgorCisgICAgICAgIHN0YXR1cyA9IFJFR19TVEFUVVMKKworICAgIFNhbWUgcmVzdHJpY3Rpb25zIG9uIGJ1ZmZlciBhZGRyZXNzZXMvbGVuZ3RocyBhbmQgc2FtZSBzZXQgb2YgZXJyb3IKKyAgICBjb2Rlcy4KKworICA1LyBXYWl0aW5nIGZvciB3cml0ZSBhYmlsaXR5OgorCisgICAgSWYgQ01EX1dSSVRFX0JVRkZFUiByZXR1cm5zIFBJUEVfRVJST1JfQUdBSU4sIGFuZCB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICAgaXMgbm90IGluIG5vbi1ibG9ja2luZyBtb2RlLCB0aGUgZHJpdmVyIG11c3QgcHV0IHRoZSBjbGllbnQgdGFzayBvbiBhCisgICAgd2FpdCBxdWV1ZSB1bnRpbCB0aGUgcGlwZSBzZXJ2aWNlIGNhbiBhY2NlcHQgZGF0YSBhZ2Fpbi4KKworICAgIEJlZm9yZSB0aGlzLCB0aGUgZHJpdmVyIHdpbGwgZG86CisKKyAgICAgICAgd3JpdGVfY2hhbm5lbCg8Y2hhbm5lbD4pCisgICAgICAgIFJFR19DTUQgICAgID0gQ01EX1dBS0VfT05fV1JJVEUKKworICAgIFRvIGluZGljYXRlIHRvIHRoZSB2aXJ0dWFsIGRldmljZSB0aGF0IGl0IGlzIHdhaXRpbmcgYW5kIHNob3VsZCBiZSB3b2tlbgorICAgIHVwIHdoZW4gdGhlIHBpcGUgYmVjb21lcyB3cml0YWJsZSBhZ2Fpbi4gSG93IHRoaXMgaXMgZG9uZSBpcyBleHBsYWluZWQKKyAgICBsYXRlci4KKworICA2LyBXYWl0aW5nIGZvciByZWFkIGFiaWxpdHk6CisKKyAgICBUaGlzIGlzIHRoZSBzYW1lIHRoYW4gQ01EX1dBS0VfT05fV1JJVEUsIGJ1dCBmb3IgcmVhZGFiaWxpdHkgaW5zdGVhZC4KKworICAgICAgICB3cml0ZV9jaGFubmVsKDxjaGFubmVsPikKKyAgICAgICAgUkVHX0NNRCAgICAgPSBDTURfV0FLRV9PTl9SRUFECisKKyAgNy8gUG9sbGluZyBmb3Igd3JpdGUtYWJsZS9yZWFkLWFibGUgc3RhdGU6CisKKyAgICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgZHJpdmVyIHRvIGltcGxlbWVudCB0aGUgc2VsZWN0KCksCisgICAgcG9sbCgpIGFuZCBlcG9sbCgpIHN5c3RlbSBjYWxscyB3aGVyZSBhIHBpcGUgY2hhbm5lbCBpcyBpbnZvbHZlZC4KKworICAgICAgICB3cml0ZV9jaGFubmVsKDxjaGFubmVsPikKKyAgICAgICAgUkVHX0NNRCAgICAgPSBDTURfUE9MTAorICAgICAgICBtYXNrID0gUkVHX1NUQVRVUworCisgICAgVGhlIG1hc2sgdmFsdWUgcmV0dXJuZWQgYnkgUkVHX1NUQVRVUyBpcyBhIG1peCBvZiBiaXQtZmxhZ3MgZm9yCisgICAgd2hpY2ggZXZlbnRzIGFyZSBhdmFpbGFibGUgLyBoYXZlIG9jY3VyZWQgc2luY2UgdGhlIGxhc3QgY2FsbC4KKyAgICBTZWUgUElQRV9QT0xMX1JFQUQgLyBQSVBFX1BPTExfV1JJVEUgLyBQSVBFX1BPTExfQ0xPU0VELgorCisgIDgvIFNpZ25hbGluZyBldmVudHMgdG8gdGhlIGRyaXZlcjoKKworICAgIFRoZSBkZXZpY2UgY2FuIHNpZ25hbCBldmVudHMgdG8gdGhlIGRyaXZlciBieSByYWlzaW5nIGl0cyBJUlEuCisgICAgVGhlIGRyaXZlcidzIGludGVycnVwdCBoYW5kbGVyIHdpbGwgdGhlbiBoYXZlIHRvIHJlYWQgYSBsaXN0IG9mCisgICAgKGNoYW5uZWwsbWFzaykgcGFpcnMsIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgMCB2YWx1ZSBmb3IgdGhlIGNoYW5uZWwuCisKKyAgICBJbiBvdGhlciB3b3JkcywgdGhlIGRyaXZlcidzIGludGVycnVwdCBoYW5kbGVyIHdpbGwgZG86CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY2hhbm5lbCA9IFJFR19DSEFOTkVMCisgICAgICAgICAgICBpZiAoY2hhbm5lbCA9PSAwKSAgLy8gRU5EIE9GIExJU1QKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgbWFzayA9IFJFR19XQUtFUyAgLy8gQklUIEZMQUdTIE9GIEVWRU5UUworICAgICAgICAgICAgLi4uIHByb2Nlc3MgZXZlbnRzCisgICAgICAgIH0KKworICAgIFRoZSBldmVudHMgcmVwb3J0ZWQgdGhyb3VnaCB0aGlzIGxpc3QgYXJlIHNpbXBseToKKworICAgICAgIFBJUEVfV0FLRV9SRUFEICAgOjogdGhlIGNoYW5uZWwgaXMgbm93IHJlYWRhYmxlLgorICAgICAgIFBJUEVfV0FLRV9XUklURSAgOjogdGhlIGNoYW5uZWwgaXMgbm93IHdyaXRhYmxlLgorICAgICAgIFBJUEVfV0FLRV9DTE9TRUQgOjogdGhlIHBpcGUgc2VydmljZSBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCisKKyAgICBUaGUgUElQRV9XQUtFX1JFQUQgYW5kIFBJUEVfV0FLRV9XUklURSBhcmUgb25seSByZXBvcnRlZCBmb3IgYSBnaXZlbgorICAgIGNoYW5uZWwgaWYgQ01EX1dBS0VfT05fUkVBRCBvciBDTURfV0FLRV9PTl9XUklURSAocmVzcGVjdGl2ZWx5KSB3ZXJlCisgICAgaXNzdWVkIGZvciBpdC4KKworICAgIFBJUEVfV0FLRV9DTE9TRUQgY2FuIGJlIHNpZ25hbGVkIGF0IGFueSB0aW1lLgorCisKKyAgOS8gRmFzdGVyIHJlYWQvd3JpdGVzIHRocm91Z2ggcGFyYW1ldGVyIGJsb2NrczoKKworICAgIFJlY2VudCBHb2xkZmlzaCBrZXJuZWxzIGltcGxlbWVudCBhIGZhc3RlciB3YXkgdG8gcGVyZm9ybSByZWFkcyBhbmQgd3JpdGVzCisgICAgdGhhdCBwZXJmb3JtIGEgc2luZ2xlIEkvTyB3cml0ZSBwZXIgb3BlcmF0aW9uICh3aGljaCBpcyB1c2VmdWwgd2hlbgorICAgIGVtdWxhdGluZyB4ODYgc3lzdGVtIHRocm91Z2ggS1ZNIG9yIEhBWCkuCisKKyAgICBUaGlzIHVzZXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUga25vd24gdG8gYm90aCB0aGUgdmlydHVhbCBkZXZpY2UgYW5kCisgICAgdGhlIGtlcm5lbCwgZGVmaW5lZCBpbiAkUUVNVS9ody9hbmRyb2lkL2dvbGRmaXNoL3BpcGUuaDoKKworICAgIEZvciAzMi1iaXQgZ3Vlc3QgQ1BVczoKKworICAgICAgICBzdHJ1Y3QgYWNjZXNzX3BhcmFtcyB7CisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsOworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3M7CisgICAgICAgICAgICB1aW50MzJfdCBjbWQ7CisgICAgICAgICAgICB1aW50MzJfdCByZXN1bHQ7CisgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3M7CisgICAgICAgIH07CisKKyAgICBBbmQgdGhlIDY0LWJpdCB2YXJpYW50OgorCisgICAgICAgIHN0cnVjdCBhY2Nlc3NfcGFyYW1zXzY0IHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGNoYW5uZWw7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplOworICAgICAgICAgICAgdWludDY0X3QgYWRkcmVzczsKKyAgICAgICAgICAgIHVpbnQzMl90IGNtZDsKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uICovCisgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgfTsKKworICAgIFRoaXMgaXMgc2ltcGx5IGEgd2F5IHRvIHBhY2sgc2V2ZXJhbCBwYXJhbWV0ZXJzIGludG8gYSBzaW5nbGUgc3RydWN0dXJlLgorICAgIFByZWxpbWluYXJ5LCBlLmcuIGF0IGJvb3QgdGltZSwgdGhlIGtlcm5lbCB3aWxsIGFsbG9jYXRlIG9uZSBzdWNoIHN0cnVjdHVyZQorICAgIGFuZCBwYXNzIGl0cyBwaHlzaWNhbCBhZGRyZXNzIHdpdGg6CisKKyAgICAgICBQQVJBTVNfQUREUl9MT1cgID0gKHBhcmFtcyAmIDB4ZmZmZmZmZmYpOworICAgICAgIFBBUkFNU19BRERSX0hJR0ggPSAocGFyYW1zID4+IDMyKSAmIDB4ZmZmZmZmZmY7CisKKyAgICBUaGVuIGZvciBlYWNoIG9wZXJhdGlvbiwgaXQgd2lsbCBkbyBzb21ldGhpbmcgbGlrZToKKworICAgICAgICBwYXJhbXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIHBhcmFtcy5hZGRyZXNzID0gYnVmZmVyOworICAgICAgICBwYXJhbXMuc2l6ZSA9IGJ1ZmZlcl9zaXplOworICAgICAgICBwYXJhbXMuY21kID0gQ01EX1dSSVRFX0JVRkZFUiAob3IgQ01EX1JFQURfQlVGRkVSKQorCisgICAgICAgIFJFR19BQ0NFU1NfUEFSQU1TID0gPGFueT4KKworICAgICAgICBzdGF0dXMgPSBwYXJhbXMuc3RhdHVzCisKKyAgICBUaGUgd3JpdGUgdG8gUkVHX0FDQ0VTU19QQVJBTVMgd2lsbCB0cmlnZ2VyIHRoZSBvcGVyYXRpb24sIGkuZS4gUUVNVSB3aWxsCisgICAgcmVhZCB0aGUgY29udGVudCBvZiB0aGUgcGFyYW1zIGJsb2NrLCB1c2UgaXRzIGZpZWxkcyB0byBwZXJmb3JtIHRoZQorICAgIG9wZXJhdGlvbiB0aGVuIHdyaXRlIGJhY2sgdGhlIHJldHVybiB2YWx1ZSBpbnRvIHBhcmFtcy5zdGF0dXMuCisKKworQXZhaWxhYmxlIHNlcnZpY2VzOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIHRjcDo8cG9ydD4KKworICAgICBPcGVuIGEgVENQIHNvY2tldCB0byBhIGdpdmVuIGxvY2FsaG9zdCBwb3J0LiBUaGlzIHByb3ZpZGVzIGEgdmVyeSBmYXN0CisgICAgIHBhc3MtdGhyb3VnaCB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSB2ZXJ5IHNsb3cgaW50ZXJuYWwgZW11bGF0b3IKKyAgICAgTkFUIHJvdXRlci4gTm90ZSB0aGF0IHlvdSBjYW4gb25seSB1c2UgdGhlIGZpbGUgZGVzY3JpcHRvciB3aXRoIHJlYWQoKQorICAgICBhbmQgd3JpdGUoKSB0aG91Z2gsIHNlbmQoKSBhbmQgcmVjdigpIHdpbGwgcmV0dXJuIGFuIEVOT1RTT0NLIGVycm9yLAorICAgICBhcyB3ZWxsIGFzIGFueSBzb2NrZXQgaW9jdGwoKS4KKworICAgICBGb3Igc2VjdXJpdHkgcmVhc29ucywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNvbm5lY3QgdG8gbm9uLWxvY2FsaG9zdAorICAgICBwb3J0cy4KKworICB1bml4OjxwYXRoPgorCisgICAgIE9wZW4gYSBVbml4LWRvbWFpbiBzb2NrZXQgb24gdGhlIGhvc3QuCisKKyAgb3BlbmdsZXMKKworICAgICBDb25uZWN0cyB0byB0aGUgT3BlbkdMIEVTIGVtdWxhdGlvbiBwcm9jZXNzLiBGb3Igbm93LCB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgaXMgZXF1aXZhbGVudCB0byB0Y3A6MjI0NjgsIGJ1dCB0aGlzIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKworICBxZW11ZAorCisgICAgIENvbm5lY3RzIHRvIHRoZSBRRU1VRCBzZXJ2aWNlIGluc2lkZSB0aGUgZW11bGF0b3IuIFRoaXMgcmVwbGFjZXMgdGhlCisgICAgIGNvbm5lY3Rpb24gdGhhdCB3YXMgcGVyZm9ybWVkIHRocm91Z2ggL2Rldi90dHlTMSBpbiBvbGRlciBBbmRyb2lkIHBsYXRmb3JtCisgICAgIHJlbGVhc2VzLiBTZWUgJFFFTVUvZG9jcy9BTkRST0lELVFFTVVELlRYVCBmb3IgZGV0YWlscy4KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0FORFJPSUQtUUVNVUQtU0VSVklDRVMuVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtUUVNVUQtU0VSVklDRVMuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjBmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1RRU1VRC1TRVJWSUNFUy5UWFQKQEAgLTAsMCArMSwxODkgQEAKK0FORFJPSUQgUUVNVUQgU0VSVklDRVMKKworVGhlIGRvY3MvQU5EUk9JRC1RRU1VRC5UWFQgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyBjbGllbnRzIHJ1bm5pbmcgaW4gdGhlCitlbXVsYXRlZCBzeXN0ZW0gY2FuIGNvbW11bmljYXRlIHdpdGggdGhlIGVtdWxhdG9yIHRocm91Z2ggdGhlICdxZW11ZCcKK211bHRpcGxleGluZyBkYWVtb24uCisKK1RoaXMgZG9jdW1lbnQgbGlzdHMgYWxsIHNlcnZpY2VzIG9mZmljaWFsbHkgcHJvdmlkZWQgYnkgdGhlIGVtdWxhdG9yIHRvCitjbGllbnRzLiBFYWNoIHNlcnZpY2UgaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBuYW1lLiBUaGVyZSBpcyBubyBwcm92aXNpb24KK2ZvciB2ZXJzaW9uaW5nLiBJbnN0ZWFkLCBpZiB5b3UgbmVlZCBuZXcgZmVhdHVyZXMsIGNyZWF0ZSBhIG5ldyBzZXJ2aWNlCit3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IG5hbWUgYW5kIG1vZGlmeSBjbGllbnRzIHRvIHVzZSBpdCBpbiB0aGUgc3lzdGVtCitpbWFnZS4KKworCisiZ3NtIiBzZXJ2aWNlOgorLS0tLS0tLS0tLS0tLS0KKworICAgVGhlIEdTTSBzZXJ2aWNlIHByb3ZpZGVzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsIHdoZXJlIEdTTS9HUFJTIEFUIGNvbW1hbmRzCisgICBjYW4gYmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIGVtdWxhdGVkIHN5c3RlbSBhbmQgYW4gZW11bGF0ZWQgbW9kZW0uCisKKyAgIFRoZSBtZXNzYWdlcyBjb25zaXN0IGluIHVuLWZyYW1lZCBjaGFyYWN0ZXIgbWVzc2FnZXMgYXMgdGhleSBhcHBlYXIgaW4gYQorICAgcmVndWxhciBBVCBjb21tYW5kIGNoYW5uZWwgKGkuZS4gdGVybWluYXRlZCBieSBcclxuIG1vc3Qgb2YgdGhlIHRpbWUpLgorCisgICBUaGVyZSBjYW4gYmUgb25seSAxIGNsaWVudCB0YWxraW5nIHRvIHRoZSBtb2RlbSwgc2luY2UgdGhlIEFUIGNvbW1hbmQKKyAgIHByb3RvY29sIGRvZXMgbm90IGFsbG93IGZvciBhbnl0aGluZyBtb3JlIGNvbXBsZXguCisKKyAgIEltcGxlbWVudGF0aW9uOiBhbmRyb2lkLXFlbXUxLWdsdWUvdGVsZXBob255L21vZGVtX2RyaXZlci5jCisgICBTaW5jZTogICAgICAgICAgU0RLIDEuMAorCisiZ3BzIiBzZXJ2aWNlOgorLS0tLS0tLS0tLS0tLS0KKworICBUaGUgR1BTIHNlcnZpY2UgaXMgdXNlZCB0byBicm9hZGNhc3QgTk1FQSAwMTgzIHNlbnRlbmNlcyBjb250YWluaW5nIGZpeAorICBpbmZvcm1hdGlvbiB0byBhbGwgY2xpZW50cy4gVGhlIHNlcnZpY2UgZG9lc24ndCBsaXN0ZW4gdG8gY2xpZW50cyBhdCBhbGwuCisKKyAgQWxsIHNlbnRlbmNlcyBhcmUgdW4tZnJhbWVkIGFuZCBlbmQgd2l0aCBhIFxuIGNoYXJhY3Rlci4KKworICBJbXBsZW1lbnRhdGlvbjogYW5kcm9pZC9ncHMuYworICBTaW5jZTogICAgICAgICAgU0RLIDEuMAorCisKKyJody1jb250cm9sIiAvICJjb250cm9sIiBzZXJ2aWNlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhpcyBzZXJ2aWNlIGlzIG5hbWVkICJjb250cm9sIiBpbiAxLjAgYW5kIDEuMSwgYW5kICJody1jb250cm9sIgorICBpbiAxLjUgYW5kIGxhdGVyIHJlbGVhc2VzIG9mIHRoZSBTREsuCisKKyAgVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gYWxsb3cgdGhlIGVtdWxhdGVkIHN5c3RlbSB0byBjb250cm9sIHZhcmlvdXMgYXNwZWN0cworICBvZiBoYXJkd2FyZSBlbXVsYXRpb24uIFRoZSBjb3JyZXNwb25kaW5nIGNsaWVudHMgYXJlIGluCisgIGhhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeSBpbiB0aGUgQW5kcm9pZCBzb3VyY2UgdHJlZS4KKworICBBbGwgbWVzc2FnZXMgdXNlIHRoZSBvcHRpb25hbCBmcmFtaW5nIGRlc2NyaWJlZCBpbiBBTkRST0lELVFFTVVELlRYVC4KKyAgT25seSBvbmUgY2xpZW50IGNhbiB0YWxrIHdpdGggdGhlIHNlcnZpY2UgYXQgYW55IG9uZSB0aW1lLCBidXQgY2xpZW50cworICBxdWlja2x5IGNvbm5lY3QvZGlzY29ubmVjdCB0byB0aGUgc2VydmljZSBhbnl3YXkuCisKKyAgU3VwcG9ydGVkIG1lc3NhZ2VzIGFyZToKKworICAgIDEvIENsaWVudCBzZW5kcyAicG93ZXI6bGlnaHQ6YnJpZ2h0bmVzczo8bGlnaHRuYW1lPjo8dmFsPiIsIHdoZXJlCisgICAgICAgPGxpZ2h0bmFtZT4gaXMgdGhlIG5hbWUgb2YgYSBsaWdodCBhbmQgPHZhbD4gaXMgYW4gZGVjaW1hbCB2YWx1ZQorICAgICAgIGJldHdlZW4gMCAob2ZmKSBhbmQgMjU1IChicmlnaHRlc3QpLiBWYWxpZCB2YWx1ZXMgZm9yICdsaWdodCcgYXJlOgorCisgICAgICAgICAgICBsY2RfYmFja2xpZ2h0CisgICAgICAgICAgICBrZXlib2FyZF9iYWNrbGlnaHQKKyAgICAgICAgICAgIGJ1dHRvbl9iYWNrbGlnaHQKKworICAgICAgIEN1cnJlbnRseSwgb25seSAnbGNkX2JhY2tsaWdodCcgaXMgc3VwcG9ydGVkIGJ5IHRoZSBlbXVsYXRvci4KKyAgICAgICBOb3RlIHRoYXQgdGhlIGJyaWdodG5lc3MgdmFsdWUgZG9lc24ndCBzY2FsZSBsaW5lYXJseSBvbiBwaHlzaWNhbAorICAgICAgIGRldmljZXMuCisKKyAgICAyLyBDbGllbnQgc2VuZHMgInNldF9sZWRfc3RhdGU6PGNvbG9yLXJnYj46PG9uLW1zPjo8b2ZmLW1zPiIgd2hlcmUKKyAgICAgICA8Y29sb3ItcmdiPiBpcyBhbiA4LWhleGNoYXIgdmFsdWUgZGVzY3JpYmluZyBhbiB4UkdCIGNvbG9yLCBhbmQKKyAgICAgICA8b24tbXM+IGFuZCA8b2ZmLW1zPiBhcmUgZGVjaW1hbCB2YWx1ZXMgZXhwcmVzc2luZyB0aW1lb3V0IGluCisgICAgICAgbWlsbGlzZWNvbmRzLgorCisgICAgICAgVGhpcyBpcyB1c2VkIHRvIG1vZGlmeSB0aGUgY29sb3Igb2YgdGhlIG5vdGlmaWNhdGlvbiBMRUQgb24gdGhlCisgICAgICAgZW11bGF0ZWQgcGhvbmUgYXMgd2VsbCBhcyBwcm92aWRlIG9uL29mZiB0aW1lb3V0cyBmb3IgZmxhc2hpbmcuCisKKyAgICAgICBjQ3JyZW50bHkgdW5zdXBwb3J0ZWQgYnkgdGhlIGVtdWxhdG9yLgorCisgICAgMy8gQ2xpZW50IHNlbmRzICJ2aWJyYXRvcjo8dGltZW91dD4iLCB3aGVyZSA8dGltZW91dD4gaXMgYSBkZWNpbWFsIHZhbHVlLgorICAgICAgIHVzZWQgdG8gZW5hYmxlIHZpYnJhdG9yIGVtdWxhdGlvbiBmb3IgPHRpbWVvdXQ+IG1pbGxpLXNlY29uZHMuCisKKyAgICAgICBDdXJyZW50bHkgdW5zdXBwb3J0ZWQgYnkgdGhlIGVtdWxhdG9yLgorCisKKyAgSW1wbGVtZW50YXRpb246IGFuZHJvaWQvaHctY29udHJvbC5jCisgIFNpbmNlOiAgICAgICAgICBTREsgMS4wCisKKworInNlbnNvcnMiIHNlcnZpY2U6CistLS0tLS0tLS0tLS0tLS0tLS0KKworICBUaGlzIHNlcnZpY2UgaXMgdXNlZCBmb3Igc2Vuc29yIGVtdWxhdGlvbi4gQWxsIG1lc3NhZ2VzIGFyZSBmcmFtZWQgYW5kIHRoZQorICBwcm90b2NvbCBpcyB0aGUgZm9sbG93aW5nOgorCisgICAgMS8gQ2xpZW50cyBpbml0aWFsbHkgc2VuZHMgImxpc3Qtc2Vuc29ycyIgYW5kIHJlY2VpdmVzIGEgc2luZ2xlIHN0cmluZworICAgICAgIGNvbnRhaW5pbmcgYSBkZWNpbWFsIG1hc2sgdmFsdWUuIFRoZSB2YWx1ZSBpcyBhIHNldCBvZiBiaXQtZmxhZ3MKKyAgICAgICBpbmRpY2F0aW5nIHdoaWNoIHNlbnNvcnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBoYXJkd2FyZSBlbXVsYXRpb24uIFRoZQorICAgICAgIGJpdCBmbGFncyBhcmUgZGVmaW5lZCBhczoKKworICAgICAgICAgYml0IDA6ICAgYWNjZWxlcm9tZXRlcgorICAgICAgICAgYml0IDE6ICAgY29tcGFzcworICAgICAgICAgYml0IDI6ICAgb3JpZW50YXRpb24KKyAgICAgICAgIGJpdCAzOiAgIHRlbXBlcmF0dXJlCisKKyAgICAyLyBDbGllbnQgc2VuZHMgInNldC1kZWxheTo8ZGVsYXktbXM+Iiwgd2hlcmUgPGRlbGF5LW1zPiBpcyBhIGRlY2ltYWwKKyAgICAgICBzdHJpbmcsIHRvIHNldCB0aGUgbWluaW11bSBkZWxheSBpbiBtaWxsaXNlY29uZHMgYmV0d2VlbiBzZW5zb3IgZXZlbnQKKyAgICAgICByZXBvcnRzIGl0IHdhbnRzIHRvIHJlY2VpdmUuCisKKyAgICAzLyBDbGllbnQgc2VuZHMgIndha2UiLCB0aGUgc2VydmljZSBtdXN0IGltbWVkaWF0ZWx5IHNlbmQgYmFjayAid2FrZSIgYXMKKyAgICAgICBhbiBhbnN3ZXIuIFRoaXMgaXMgdXNlZCB0byBzaW1wbGlmeSBwYXJ0cyBvZiB0aGUgY2xpZW50IGVtdWxhdGlvbi4KKworICAgIDQvIENsaWVudCBzZW5kcyAic2V0OjxzZW5zb3ItbmFtZT46PGZsYWc+Iiwgd2hlcmUgPHNlbnNvci1uYW1lPiBpcyB0aGUKKyAgICAgICBuYW1lIG9mIG9uZSBvZiB0aGUgZW11bGF0ZWQgc2Vuc29ycywgYW5kIDxmbGFnPiBpcyBlaXRoZXIgIjAiIG9yICIxIi4KKyAgICAgICBUaGlzIGlzIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlcG9ydCBvZiBkYXRhIGZyb20gYSBnaXZlbgorICAgICAgIGVtdWxhdGVkIHNlbnNvciBoYXJkd2FyZS4KKworICAgICAgIHRoZSBsaXN0IG9mIHZhbGlkIDxzZW5zb3ItbmFtZT4gdmFsdWVzIGlzIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgICAgYWNjZWxlcmF0aW9uICAgICAgOiBmb3IgdGhlIGFjY2VsZXJvbWV0ZXIKKyAgICAgICAgICAgbWFnbmV0aWMtZmllbGQgICAgOiBmb3IgdGhlIGNvbXBhc3MKKyAgICAgICAgICAgb3JpZW50YXRpb24gICAgICAgOiBmb3IgdGhlIG9yaWVudGF0aW9uIHNlbnNvcgorICAgICAgICAgICB0ZW1wZXJhdHVyZSAgICAgICA6IGZvciB0aGUgdGVtcGVyYXR1cmUgc2Vuc29yCisKKworICAgIDUvIElmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZW11bGF0ZWQgc2Vuc29ycyBoYXMgYmVlbiBlbmFibGVkIHdpdGgKKyAgICAgICAic2V0OjxuYW1lPjoxIiwgdGhlbiB0aGUgc2VydmljZSBzaG91bGQgYnJvYWRjYXN0IHBlcmlvZGljYWxseSB0aGUKKyAgICAgICBzdGF0ZSBvZiBzZW5zb3JzLgorCisgICAgICAgdGhpcyBpcyBkb25lIGJ5IGJyb2FkY2FzdGluZyBhIHNlcmllcyBvZiBmcmFtZWQgbWVzc2FnZXMgdGhhdCBsb29rCisgICAgICAgbGlrZToKKworICAgICAgICAgICBhY2NlbGVyYXRpb246PHg+Ojx5Pjo8ej4KKyAgICAgICAgICAgbWFnbmV0aWMtZmllbGQ6PHg+Ojx5Pjo8ej4KKyAgICAgICAgICAgb3JpZW50YXRpb246PGF6aW11dGg+OjxwaXRjaD46PHJvbGw+CisgICAgICAgICAgIHRlbXBlcmF0dXJlOjxjZWxzaXVzPgorICAgICAgICAgICBzeW5jOjx0aW1lX3VzPgorCisgICAgICAgTm90ZSB0aGF0IGVhY2ggbGluZSwgY29ycmVzcG9uZHMgdG8gYW4gaW5kZXBlbmRlbnQgZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgRWFjaCBsaW5lLCBleGNlcHQgdGhlIGxhc3Qgb25lLCBpcyBvcHRpb25hbCBhbmQgc2hvdWxkIG9ubHkgYmUKKyAgICAgICBwcm9kdWNlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBzZW5zb3IgcmVwb3J0aW5nIGhhcyBiZWVuIGVuYWJsZWQKKyAgICAgICB0aHJvdWdoICJzZXQ6PG5hbWU+OjEiLgorCisgICAgICAgPHg+LCA8eT4sIDx6PiwgPGF6aW11dGg+LCA8cGl0Y2g+LCA8cm9sbD4gYW5kIDxjZWxzaXVzPiBhcmUgZmxvYXRpbmcKKyAgICAgICBwb2ludCB2YWx1ZXMgd3JpdHRlbiBhcyBzdHJpbmdzIHdpdGggdGhlICIlZyIgcHJpbnRmIGZvcm1hdHRpbmcgb3B0aW9uLgorCisgICAgICAgVGhlIGxhc3QgJ3N5bmMnIG1lc3NhZ2UgaXMgcmVxdWlyZWQgdG8gZW5kIHRoZSBicm9hZGNhc3QgYW5kIGNvbnRhaW5zCisgICAgICAgdGhlIGN1cnJlbnQgVk0gY2xvY2sgdGltZSBpbiBtaWNyby1zZWNvbmRzLiBUaGUgY2xpZW50IHdpbGwgYWRqdXN0IGl0CisgICAgICAgaW50ZXJuYWxseSB0byBvbmx5IGNhcmUgYWJvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBzZW5zb3IgYnJvYWRjYXN0cy4KKworICAgICAgIElmIHJlcG9ydGluZyBpcyBkaXNhYmxlZCBmb3IgYWxsIHNlbnNvcnMsIG5vIGJyb2FkY2FzdCBtZXNzYWdlIG5lZWRzCisgICAgICAgdG8gYmUgc2VudCBiYWNrIHRvIGNsaWVudHMuCisKKworICBJbXBsZW1lbnRhdGlvbjogYW5kcm9pZC9ody1zZW5zb3JzLmMKKyAgU2luY2U6ICAgICAgICAgIFNESyAxLjUgKGN1cGNha2UpCisKKworImJvb3QtcHJvcGVydGllcyIgc2VydmljZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgV0FSTklORzogVGhlc2UgcHJvcGVydGllcyBkb24ndCBnZXQgc2V0IHVudGlsIGluaXQgc3RhcnRzIGEgc2VydmljZSBpbgorICBjbGFzcyAiY29yZSIgY2FsbGVkICJxZW11LXByb3BzIi4gT3RoZXIgaW5pdCBzZXJ2aWNlcyBpbiBjbGFzcyAiY29yZSIKKyAgaW5jbHVkZSBzZXJ2aWNlbWFuYWdlciBhbmQgdm9sZC4gIElmIHRob3NlIHByb2Nlc3NlcyByZWFkIHRoZSBwcm9wZXJ0eQorICAodGhleSBwcm9iYWJseSBkb24ndCByaWdodCBub3cpLCB0aGVyZSBpcyBhIHNtYWxsIGNoYW5jZSBpdCBoYXMgbm90IGJlZW4gc2V0IHlldC4KKyAgQWxzbywgaW5pdCBzZXJ2aWNlcyBhcmUgc3RhcnRlZCBhc3luY2hyb25vdXNseSwgc28gdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKKyAgc2VydmljZXMgc3RhcnRlZCBqdXN0IGFmdGVyIHFlbXUtcHJvcHMgd2lsbCBub3QgcnVuIGJlZm9yZSBxZW11LXByb3BzLCBhbmQgbWF5CisgIG5vdCBzZWUgdGhlIG5ldyBwcm9wZXJ0aWVzLiBUaGlzIGhhc24ndCBiZWVuIGFuIGlzc3VlLCBidXQgc2hvdWxkIHByb2JhYmx5CisgIGJlIGNsZWFuZWQgdXAuCisKKyAgVGhpcyBzZXJ2aWNlIGlzIHVzZWQgdG8gc2V0IHN5c3RlbSBwcm9wZXJ0aWVzIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0gYXQKKyAgYm9vdCB0aW1lLiBJdCBpcyBpbnZva2VkIGJ5IHRoZSAncWVtdS1wcm9wcycgaGVscGVyIHByb2dyYW0gdGhhdCBpcyBpbnZva2VkCisgIGJ5IC9zeXN0ZW0vZXRjL2luaXQuZ29sZGZpc2gucmMuIEFsbCBtZXNzYWdlcyBhcmUgZnJhbWVkIGFuZCB0aGUgcHJvdG9jb2wKKyAgaXMgdGhlIGZvbGxvd2luZzoKKworICAxLyBDbGllbnRzIHNlbmRzIHRoZSAnbGlzdCcgY29tbWFuZAorCisgIDIvIFNlcnZpY2UgYW5zd2VycyBieSBsaXN0aW5nIGFsbCBzeXN0ZW0gcHJvcGVydGllcyB0byBzZXQuIE9uZSBwZXIKKyAgICAgbWVzc2FnZSB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCisgICAgICAgIDxwcm9wZXJ0eS1uYW1lPj08cHJvcGVydHktdmFsdWU+CisKKyAgICAgTm90ZSB0aGF0IDxwcm9wZXJ0eS12YWx1ZT4gaXMgbm90IHplcm8tdGVybWluYXRlZC4KKworCisgIDMvIEFmdGVyIHNlbmRpbmcgYWxsIHRoZSBwcm9wZXJ0aWVzLCB0aGUgc2VydmljZSBmb3JjZS1jbG9zZXMgdGhlCisgICAgIGNvbm5lY3Rpb24uCisKKyAgSW1wbGVtZW50YXRpb246IGFuZHJvaWQvYm9vdC1wcm9wZXJ0aWVzLmMKKyAgU2luY2U6ICAgICAgICAgIFNESyAxLlhYWCAoZG9udXQpCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQU5EUk9JRC1RRU1VRC5UWFQgYi9hbmRyb2lkL2RvY3MvQU5EUk9JRC1RRU1VRC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyNTRmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9BTkRST0lELVFFTVVELlRYVApAQCAtMCwwICsxLDI4OCBAQAorICAgICAgICAgICAgICAgICAgICBUSEUgQU5EUk9JRCAiUUVNVUQiIE1VTFRJUExFWElORyBEQUVNT04KKworSS4gT3ZlcnZpZXc6CistLS0tLS0tLS0tLS0KKworVGhlIEFuZHJvaWQgc3lzdGVtIGltYWdlIGluY2x1ZGVzIGEgc21hbGwgZGFlbW9uIHByb2dyYW0gbmFtZWQgInFlbXVkIgord2hpY2ggaXMgc3RhcnRlZCBhdCBib290IHRpbWUuIEl0cyBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYSBtdWx0aXBsZXhpbmcKK2NvbW11bmljYXRpb24gY2hhbm5lbCBiZXR3ZWVuIHRoZSBlbXVsYXRlZCBzeXN0ZW0gYW5kIHRoZSBlbXVsYXRvciBwcm9ncmFtCitpdHNlbGYuIEFub3RoZXIgd2F5IHRvIHN1cHBvcnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBlbXVsYXRlZCBzeXN0ZW0gYW5kCit0aGUgZW11bGF0b3IgcHJvZ3JhbSBpcyB1c2luZyBxZW11IHBpcGVzIChzZWUgQU5EUk9JRC1RRU1VLVBJUEUuVFhUIGZvciBkZXRhaWxzCitvbiBxZW11IHBpcGVzKS4KKworSXRzIGdvYWwgaXMgdG8gYWxsb3cgY2VydGFpbiBwYXJ0cyBvZiB0aGUgc3lzdGVtIHRvIHRhbGsgZGlyZWN0bHkgdG8gdGhlCitlbXVsYXRvciB3aXRob3V0IHJlcXVpcmluZyBzcGVjaWFsIGtlcm5lbCBzdXBwb3J0OyB0aGlzIHNpbXBsaWZpZXMgYSBsb3Qgb2YKK3RoaW5ncyBzaW5jZSBpdCBkb2VzICpub3QqIHJlcXVpcmU6CisKKy0gd3JpdGluZy9jb25maWd1cmluZyBhIHNwZWNpZmljIGtlcm5lbCBkcml2ZXIKKy0gd3JpdGluZyB0aGUgY29ycmVzcG9uZGluZyBoYXJkd2FyZSBlbXVsYXRpb24gY29kZSBpbiBody9hbmRyb2lkL2dvbGRmaXNoLyouYworLSBkZWFsaW5nIHdpdGggZGV2aWNlIGFsbG9jYXRpb24gYW5kIHBlcm1pc3Npb24gaXNzdWVzIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW0KKworVGhlIGVtdWxhdG9yIHByb3ZpZGVzICdzZXJ2aWNlcycgdG8gdmFyaW91cyBwYXJ0cyBvZiB0aGUgZW11bGF0ZWQgc3lzdGVtLgorRWFjaCBzZXJ2aWNlIGlzIGlkZW50aWZpZWQgYnkgYSBuYW1lIGFuZCBzZXJ2ZXMgYSBzcGVjaWZpYyBwdXJwb3NlLiBGb3IKK2V4YW1wbGU6CisKKyAgICJnc20iICAgICAgIFVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZW11bGF0ZWQgR1NNIG1vZGVtIHdpdGgKKyAgICAgICAgICAgICAgIEFUIGNvbW1hbmRzLgorCisgICAiZ3BzIiAgICAgICBVc2VkIHRvIHJlY2VpdmUgTk1FQSBzZW50ZW5jZXMgYnJvYWRjYXN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgIGVtdWxhdGVkIEdQUyBkZXZpY2UuCisKKyAgICJzZW5zb3JzIiAgIFVzZWQgdG8gbGlzdCB0aGUgbnVtYmVyIG9mIGVtdWxhdGVkIHNlbnNvcnMsIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgIGVuYWJsZS9kaXNhYmxlIHJlY2VwdGlvbiBvZiBzcGVjaWZpYyBzZW5zb3IgZXZlbnRzLgorCisgICAiY29udHJvbCIgICBVc2VkIHRvIGNvbnRyb2wgbWlzYy4gc2ltcGxlIGVtdWxhdGVkIGhhcmR3YXJlIGRldmljZXMKKyAgICAgICAgICAgICAgIChlLmcuIHZpYnJhdG9yLCBsZWRzLCBMQ0QgYmFja2xpZ2h0LCBldGMuLi4pCisKKworSUkuIEltcGxlbWVudGF0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTaW5jZSB0aGUgImN1cGNha2UiIHBsYXRmb3JtLCB0aGlzIHdvcmtzIGFzIGZvbGxvd3M6CisKKy0gQSAncWVtdWQgY2xpZW50JyBpcyBhbnkgcGFydCBvZiB0aGUgZW11bGF0ZWQgc3lzdGVtIHRoYXQgd2FudHMgdG8gdGFsaworICB0byB0aGUgZW11bGF0b3IuIEl0IGRvZXMgc28gYnk6CisKKyAgLSBjb25uZWN0aW5nIHRvIHRoZSAvZGV2L3NvY2tldC9xZW11ZCBVbml4IGRvbWFpbiBzb2NrZXQKKyAgLSBzZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdGhyb3VnaCB0aGUgc29ja2V0CisgIC0gcmVjZWl2ZXMgdHdvIGJ5dGVzIG9mIGRhdGEsIHdoaWNoIHdpbGwgYmUgIk9LIiBpbiBjYXNlIG9mCisgICAgc3VjY2Vzcywgb3IgIktPIiBpbiBjYXNlIG9mIGZhaWx1cmUuCisKKyAgQWZ0ZXIgYW4gT0ssIHRoZSBzYW1lIGNvbm5lY3Rpb24gY2FuIGJlIHVzZWQgdG8gdGFsayBkaXJlY3RseSB0byB0aGUKKyAgY29ycmVzcG9uZGluZyBzZXJ2aWNlLgorCisKKy0gVGhlIC9kZXYvc29ja2V0L3FlbXVkIFVuaXggc29ja2V0IGlzIGNyZWF0ZWQgYnkgaW5pdCBhbmQgb3duZWQgYnkgdGhlCisgICdxZW11ZCcgZGFlbW9uIHN0YXJ0ZWQgYXQgYm9vdCBieSAvc3lzdGVtL2V0Yy9pbml0LmdvbGRmaXNoLnJjCisKKyAgVGhlIGRhZW1vbiBhbHNvIG9wZW5zIGFuIGVtdWxhdGVkIHNlcmlhbCBwb3J0IChlLmcuIC9kZXYvdHR5UzEpIGFuZAorICB3aWxsIHBhc3MgYWxsIG1lc3NhZ2VzIGJldHdlZW4gY2xpZW50cyBhbmQgZW11bGF0b3Igc2VydmljZXMuIFRodXMsCisgIGV2ZXJ5dGhpbmcgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisKKyAgICAgZW11bGF0b3IgPD09c2VyaWFsPT0+IHFlbXVkIDwtLS0+IC9kZXYvc29ja2V0L3FlbXVkIDwtKy0tPiBjbGllbnQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tPiBjbGllbnQyCisKKyAgQSB2ZXJ5IHNpbXBsZSBtdWx0aXBsZXhpbmcgcHJvdG9jb2wgaXMgdXNlZCBvbiB0aGUgc2VyaWFsIGNvbm5lY3Rpb246CisKKyAgICAgICAgICAgb2Zmc2V0ICAgIHNpemUgICAgZGVzY3JpcHRpb24KKworICAgICAgICAgICAgICAgMCAgICAgICAyICAgICAyLWNoYXIgaGV4IHN0cmluZyBnaXZpbmcgdGhlIGRlc3RpbmF0aW9uIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBjaGFubmVsCisKKyAgICAgICAgICAgICAgIDIgICAgICAgNCAgICAgNC1jaGFyIGhleCBzdHJpbmcgZ2l2aW5nIHRoZSBwYXlsb2FkIHNpemUKKworICAgICAgICAgICAgICAgNiAgICAgICBuICAgICB0aGUgbWVzc2FnZSBwYXlsb2FkCisKKyAgV2hlcmUgZWFjaCBjbGllbnQgZ2V0cyBhICdjaGFubmVsJyBudW1iZXIgYWxsb2NhdGVkIGJ5IHRoZSBkYWVtb24KKyAgYXQgY29ubmVjdGlvbiB0aW1lLgorCisgIE5vdGUgdGhhdCBwYWNrZXRzIGxhcmdlciB0aGFuIDY1NTM1IGJ5dGVzIGNhbm5vdCBiZSBzZW50IGRpcmVjdGx5CisgIHRocm91Z2ggdGhlIHFlbXVkIGNoYW5uZWwuIFRoaXMgaXMgaW50ZW50aW9uYWw7IGZvciBsYXJnZSBkYXRhCisgIGNvbW11bmljYXRpb24sIHRoZSBjbGllbnQgYW5kIHNlcnZpY2Ugc2hvdWxkIHVzZSBhIGZyYWdtZW50YXRpb24KKyAgY29udmVudGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4KKworICBaZXJvLXNpemVkIHBhY2tldHMgYXJlIHNpbGVudGx5IGRpc2NhcmQgYnkgcWVtdWQgYW5kIHRoZSBlbXVsYXRvciBhbmQKKyAgc2hvdWxkIG5vcm1hbGx5IG5vdCBhcHBlYXIgb24gdGhlIHNlcmlhbCBwb3J0LgorCisgIENoYW5uZWwgMCBpcyByZXNlcnZlZCBmb3IgY29udHJvbCBtZXNzYWdlcyBiZXR3ZWVuIHRoZSBkYWVtb24gYW5kIHRoZQorICBlbXVsYXRvci4gVGhlc2UgYXJlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAtIFdoZW4gYSBjbGllbnQgY29ubmVjdHMgdG8gL2Rldi9zb2NrZXQvcWVtdWQgYW5kIHNlbmRzIGEgc2VydmljZQorICAgICAgbmFtZSB0byB0aGUgZGFlbW9uLCB0aGUgbGF0ZXIgc2VuZHMgdG8gdGhlIGVtdWxhdG9yOgorCisgICAgICAgIGNvbm5lY3Q6PHNlcnZpY2U+OjxpZD4KKworICAgICAgd2hlcmUgPHNlcnZpY2U+IGlzIHRoZSBzZXJ2aWNlIG5hbWUsIGFuZCA8aWQ+IGlzIGEgMi1oZXhjaGFyIHN0cmluZworICAgICAgZ2l2aW5nIHRoZSBhbGxvY2F0ZWQgY2hhbm5lbCBpbmRleCBmb3IgdGhlIGNsaWVudC4KKworCisgICAgLSBUaGUgZW11bGF0b3IgY2FuIHJlc3BvbmQgaW4gY2FzZSBvZiBzdWNjZXNzIHdpdGg6CisKKyAgICAgICAgb2s6Y29ubmVjdDo8aWQ+CisKKyAgICAgIG9yLCBpbiBjYXNlIG9mIGZhaWx1cmUsIHdpdGg6CisKKyAgICAgICAgb2s6Y29ubmVjdDo8aWQ+OjxyZWFzb24+CisKKyAgICAgIHdoZXJlIDxyZWFzb24+IGlzIGEgbGliZXJhbCBzdHJpbmcgZ2l2aW5nIHRoZSByZWFzb24gZm9yIGZhaWx1cmUuCisgICAgICBJdCBpcyBuZXZlciBzZW50IHRvIGNsaWVudHMgKHdoaWNoIHdpbGwgb25seSByZWNlaXZlIGEgIktPIikgYW5kCisgICAgICBpcyB1c2VkIHN0cmljdGx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisKKyAgICAtIEFmdGVyIGEgc3VjY2VzZnVsIGNvbm5lY3QsIGFsbCBtZXNzYWdlcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kCisgICAgICB0aGUgY29ycmVzcG9uZGluZyBlbXVsYXRvciBzZXJ2aWNlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdGhlCisgICAgICBjb3JyZXNwb25kaW5nIG51bWJlcmVkIGNoYW5uZWwuCisKKyAgICAgIEJ1dCBpZiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIGZyb20gdGhlIHNvY2tldCwgdGhlIGRhZW1vbiB3aWxsCisgICAgICBzZW5kIHRocm91Z2ggY2hhbm5lbCAwIHRoaXMgbWVzc2FnZSB0byB0aGUgZW11bGF0b3I6CisKKyAgICAgICAgZGlzY29ubmVjdDo8aWQ+CisKKyAgICAtIElmIGFuIGVtdWxhdG9yIHNlcnZpY2UgZGVjaWRlcywgZm9yIHNvbWUgcmVhc29uLCB0byBkaXNjb25uZWN0CisgICAgICBhIGNsaWVudCwgdGhlIGVtdWxhdG9yIHdpbGwgc2VuZCB0byB0aGUgZGFlbW9uIChvbiBjaGFubmVsIDApOgorCisgICAgICAgIGRpc2Nvbm5lY3Q6PGlkPgorCisgICAgICBUaGUgZGFlbW9uIGRlYWxzIHdpdGggdGhpcyBncmFjZWZ1bGx5IChlLmcuIGl0IHdpbGwgd2FpdCB0aGF0IHRoZQorICAgICAgY2xpZW50IGhhcyByZWFkIGFsbCBidWZmZXJlZCBkYXRhIGluIHRoZSBkYWVtb24gYmVmb3JlIGNsb3NpbmcgdGhlCisgICAgICBzb2NrZXQsIHRvIGF2b2lkIHBhY2tldCBsb3NzKS4KKworICAgIC0gQW55IG90aGVyIGNvbW1hbmQgc2VudCBmcm9tIHRoZSBkYWVtb24gdG8gdGhlIGVtdWxhdG9yIHdpbGwgcmVzdWx0CisgICAgICBpbiB0aGUgZm9sbG93aW5nIGFuc3dlcjoKKworICAgICAgICBrbzpiYWQgY29tbWFuZAorCistIFdoaWNoIGV4YWN0IHNlcmlhbCBwb3J0IHRvIG9wZW4gaXMgZGV0ZXJtaW5lZCBieSB0aGUgZW11bGF0b3IgYXQgc3RhcnR1cAorICBhbmQgaXMgcGFzc2VkIHRvIHRoZSBzeXN0ZW0gYXMgYSBrZXJuZWwgcGFyYW1ldGVyLCBlLmcuOgorCisgICAgICAgIGFuZHJvaWQucWVtdWQ9dHR5UzEKKworCistIFRoZSBjb2RlIHRvIHN1cHBvcnQgc2VydmljZXMgYW5kIHRoZWlyIGNsaWVudHMgaW4gdGhlIGVtdWxhdG9yIGlzIGxvY2F0ZWQKKyAgaW4gYW5kcm9pZC9ody1xZW11ZC5jLiBUaGlzIGNvZGUgaXMgaGVhdmlseSBjb21tZW50ZWQuCisKKyAgVGhlIGRhZW1vbidzIHNvdXJjZSBpcyBpbiAkUk9PVC9kZXZlbG9wbWVudC9lbXVsYXRvci9xZW11ZC9xZW11ZC5jCisKKyAgVGhlIGhlYWRlciBpbiAkUk9PVC9oYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlL2hhcmR3YXJlL3FlbXVkLmgKKyAgY2FuIGJlIHVzZWQgYnkgY2xpZW50cyB0byBlYXNlIGNvbm5lY3RpbmcgYW5kIHRhbGtpbmcgdG8gUUVNVUQtYmFzZWQKKyAgc2VydmljZXMuCisKKyAgVGhpcyBpcyB1c2VkIGJ5ICRST09UL2RldmVsb3BlbWVudC9lbXVsYXRvci9zZW5zb3JzL3NlbnNvcnNfcWVtdS5jIHdoaWNoCisgIGltcGxlbWVudHMgZW11bGF0b3Itc3BlY2lmaWMgc2Vuc29yIHN1cHBvcnQgaW4gdGhlIHN5c3RlbSBieSB0YWxraW5nIHRvCisgIHRoZSAic2Vuc29ycyIgc2VydmljZSBwcm92aWRlZCBieSB0aGUgZW11bGF0b3IgKGlmIGF2YWlsYWJsZSkuCisKKyAgQ29kZSBpbiAkUk9PVC9oYXJkd2FyZS9saWJoYXJkd2FyZV9sZWdhY3kgYWxzbyB1c2VzIFFFTVVELWJhc2VkIHNlcnZpY2VzLgorCisKKy0gQ2VydGFpbiBzZXJ2aWNlcyBhbHNvIGltcGxlbWVudCBhIHNpbXBsZSBmcmFtaW5nIHByb3RvY29sIHdoZW4gZXhjaGFuZ2luZworICBtZXNzYWdlcyB3aXRoIHRoZWlyIGNsaWVudHMuIFRoZSBmcmFtaW5nIGhhcHBlbnMgKmFmdGVyKiBzZXJpYWwgcG9ydAorICBtdWx0aXBsZXhpbmcgYW5kIGxvb2tzIGxpa2U6CisKKyAgICAgICAgICAgb2Zmc2V0ICAgIHNpemUgICAgZGVzY3JpcHRpb24KKworICAgICAgICAgICAgICAgMCAgICAgICA0ICAgICA0LWNoYXIgaGV4IHN0cmluZyBnaXZpbmcgdGhlIHBheWxvYWQgc2l6ZQorCisgICAgICAgICAgICAgICA0ICAgICAgIG4gICAgIHRoZSBtZXNzYWdlIHBheWxvYWQKKworICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBmcmFtaW5nIHByb3RvY29sIHVzZWQgb24gdGhlIHNlcmlhbCBwb3J0IGlzCisgIG5vdCBwcmVzZXJ2ZWQgd2hlbiB0YWxraW5nIHRvIGNsaWVudHMgdGhyb3VnaCAvZGV2L3NvY2tldC9xZW11ZC4KKworICBDZXJ0YWluIHNlcnZpY2VzIGRvIG5vdCBuZWVkIGl0IGF0IGFsbCAoR1NNLCBHUFMpIHNvIGl0IGlzIG9wdGlvbmFsIGFuZAorICBtdXN0IGJlIHVzZWQgZGVwZW5kaW5nIG9uIHdoaWNoIHNlcnZpY2UgeW91IHRhbGsgdG8gYnkgY2xpZW50cy4KKworLSBRRU1VIHBpcGUgY29tbXVuaWNhdGlvbiBtb2RlbCB3b3JrcyBzaW1pbGFybHkgdG8gdGhlIHNlcmlhbCBwb3J0IG11bHRpcGxleGluZywKKyAgYnV0IGFsc28gaGFzIHNvbWUgZGlmZmVyZW5jZXMgYXMgZmFyIGFzIGNvbm5lY3RpbmcgY2xpZW50IHdpdGggdGhlIHNlcnZpY2UgaXMKKyAgY29uY2VybmVkOgorCisgICAgIGVtdWxhdG9yIDwtKy0tPiAvZGV2L3FlbXVfcGlwZS9xZW11ZDpzcnYxIDwtLS0+IGNsaWVudDEKKyAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgKy0tPiAvZGV2L3FlbXVfcGlwZS9xZW11ZDpzcnYyIDwtLS0+IGNsaWVudDIKKworICBJbiB0aGUgcGlwZSBtb2RlbCBlYWNoIGNsaWVudCBnZXRzIGNvbm5lY3RlZCB0byB0aGUgZW11bGF0b3IgdGhyb3VnaCBhIHVuaXF1ZQorICBoYW5kbGUgdG8gL2Rldi9xZW11X3BpcGUgKGEgInBpcGUiKSwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IgbXVsdGlwbGV4aW5nIHRoZQorICBjaGFubmVscy4KKworSUlJLiBMZWdhY3kgJ3FlbXVkJzoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBzeXN0ZW0gaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoZSAxLjAgYW5kIDEuMSByZWxlYXNlcyBvZiB0aGUgQW5kcm9pZCBTREsKK2ltcGxlbWVudCBhbiBvbGRlciB2YXJpYW50IG9mIHRoZSBxZW11ZCBkYWVtb24gdGhhdCB1c2VzIGEgc2xpZ2h0bHkKK2RpZmZlcmVudCBwcm90b2NvbCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBlbXVsYXRvci4KKworVGhpcyBpcyBkb2N1bWVudGVkIGhlcmUgc2luY2UgdGhpcyBleHBsYWlucyBzb21lIHN1YnRsZXRpZXMgaW4gdGhlCitpbXBsZW1lbnRhdGlvbiBjb2RlIG9mIGFuZHJvaWQvaHctcWVtdWQuYworCitUaGUgb2xkIHNjaGVtZSBhbHNvIHVzZWQgYSBzZXJpYWwgcG9ydCB0byBhbGxvdyB0aGUgZGFlbW9uIGFuZCB0aGUgZW11bGF0b3IKK3RvIGNvbW11bmljYXRlLiBIb3dldmVyLCB0aGUgbXVsdGlwbGV4aW5nIHByb3RvY29sIHN3YXBzIHRoZSBwb3NpdGlvbiBvZgorJ2NoYW5uZWwnIGFuZCAnbGVuZ3RoJyBpbiB0aGUgaGVhZGVyOgorCisgICAgICAgICAgIG9mZnNldCAgICBzaXplICAgIGRlc2NyaXB0aW9uCisKKyAgICAgICAgICAgICAgIDAgICAgICAgNCAgICAgNC1jaGFyIGhleCBzdHJpbmcgZ2l2aW5nIHRoZSBwYXlsb2FkIHNpemUKKworICAgICAgICAgICAgICAgNCAgICAgICAyICAgICAyLWNoYXIgaGV4IHN0cmluZyBnaXZpbmcgdGhlIGRlc3RpbmF0aW9uIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBjaGFubmVsCisKKyAgICAgICAgICAgICAgIDYgICAgICAgbiAgICAgdGhlIG1lc3NhZ2UgcGF5bG9hZAorCitTZXZlcmFsIG90aGVyIGRpZmZlcmVuY2VzLCBiZXN0IGlsbHVzdHJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgZ3JhcGhpY3M6CisKKyAgICBlbXVsYXRvciA8PT1zZXJpYWw9PT4gcWVtdWQgPC0rLS0+IC9kZXYvc29ja2V0L3FlbXVkX2dzbSA8LS0+IEdTTSBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tPiAvZGV2L3NvY2tldC9xZW11ZF9ncHMgPC0tPiBHUFMgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLT4gL2Rldi9zb2NrZXQvcWVtdWRfY29udHJvbCA8LS0+IGNsaWVudChzKQorCitOb3csIGZvciB0aGUgZGV0YWlsczoKKworIC0gaW5zdGVhZCBvZiBhIHNpbmdsZSAvZGV2L3NvY2tldC9xZW11ZCwgaW5pdCBjcmVhdGVkIHNldmVyYWwgVW5peCBkb21haW4KKyAgIHNvY2tldHMsIG9uZSBwZXIgc2VydmljZToKKworICAgICAgICAvZGV2L3NvY2tldC9xZW11ZF9nc20KKyAgICAgICAgL2Rldi9zb2NrZXQvcWVtdWRfZ3BzCisgICAgICAgIC9kZXYvc29ja2V0L3FlbXVkX2NvbnRyb2wKKworICAgbm90ZSB0aGF0IHRoZXJlIGlzIG5vICJzZW5zb3JzIiBzb2NrZXQgaW4gMS4wIGFuZCAxLjEKKworIC0gdGhlIGRhZW1vbiBjcmVhdGVkIGEgZGUtZmFjdG8gbnVtYmVyZWQgY2hhbm5lbCBmb3IgZWFjaCBvbmUgb2YgdGhlc2UKKyAgIHNlcnZpY2VzLCBldmVuIGlmIG5vIGNsaWVudCBkaWQgY29ubmVjdCB0byBpdCAob25seSBvbmUgY2xpZW50IGNvdWxkCisgICBjb25uZWN0IHRvIGEgZ2l2ZW4gc2VydmljZSBhdCBhIHRpbWUpLgorCisgLSBhdCBzdGFydHVwLCB0aGUgZW11bGF0b3IgZG9lcyBxdWVyeSB0aGUgY2hhbm5lbCBudW1iZXJzIG9mIGFsbCBzZXJ2aWNlcworICAgaXQgaW1wbGVtZW50cywgZS5nLiBpdCB3b3VsZCBzZW5kICp0byogdGhlIGRhZW1vbiBvbiBjaGFubmVsIDA6CisKKyAgICAgICAgY29ubmVjdDo8c2VydmljZT4KKworICAgd2hlcmUgPHNlcnZpY2U+IGNhbiBiZSBvbmUgb2YgImdzbSIsICJncHMiIG9yICJjb250cm9sIgorCisgICAoTm90ZSB0aGF0IG9uIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgZGFlbW9uIGlzIHNlbmRpbmcgY29ubmVjdGlvbgorICAgbWVzc2FnZXMgdG8gdGhlIGVtdWxhdG9yIGluc3RlYWQpLgorCisgLSB0aGUgZGFlbW9uIHdvdWxkIHJlc3BvbmQgd2l0aCBlaXRoZXI6CisKKyAgICAgICAgb2s6Y29ubmVjdDo8c2VydmljZT46PGh4aWQ+CisKKyAgIHdoZXJlIDxzZXJ2aWNlPiB3b3VsZCBiZSB0aGUgc2VydmljZSBuYW1lLCBhbmQgPGh4aWQ+IGEgNC1oZXhjaGFyIGNoYW5uZWwKKyAgIG51bWJlciAoTk9URTogNCBjaGFycywgbm90IDIpLiBPciB3aXRoOgorCisgICAgICAgIGtvOmNvbm5lY3Q6YmFkIG5hbWUKKworCitUaGlzIG9sZCBzY2hlbWUgd2FzIHNpbXBsZXIgdG8gaW1wbGVtZW50IGluIGJvdGggdGhlIGRhZW1vbiBhbmQgdGhlIGVtdWxhdG9yCitidXQgbGFja2VkIGEgbG90IG9mIGZsZXhpYmlsaXR5OgorCisgIC0gYWRkaW5nIGEgbmV3IHNlcnZpY2UgcmVxdWlyZWQgdG8gbW9kaWZ5IC9zeXN0ZW0vZXRjL2luaXQuZ29sZGZpc2gucmMKKyAgICBhcyB3ZWxsIGFzIHRoZSBkYWVtb24gc291cmNlIGZpbGUgKHdoaWNoIGNvbnRhaW5lZCBhIGhhcmQtY29kZWQgbGlzdAorICAgIG9mIHNvY2tldHMgdG8gbGlzdGVuIHRvIGZvciBjbGllbnQgY29ubmVjdGlvbnMpLgorCisgIC0gb25seSBvbmUgY2xpZW50IGNvdWxkIGJlIGNvbm5lY3RlZCB0byBhIGdpdmVuIHNlcnZpY2UgYXQgYSB0aW1lLAorICAgIGV4Y2VwdCBmb3IgdGhlIEdQUyBzcGVjaWFsIGNhc2Ugd2hpY2ggd2FzIGEgdW5pZGlyZWN0aW9ubmFsIGJyb2FkY2FzdAorICAgIGJ5IGNvbnZlbnRpb24uCisKK1RoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG1vdmVzIGFueSBzZXJ2aWNlLXNwZWNpZmljIGNvZGUgdG8gdGhlIGVtdWxhdG9yLAorb25seSB1c2VzIGEgc2luZ2xlIHNvY2tldCBhbmQgYWxsb3dzIGNvbmN1cnJlbnQgY2xpZW50cyBmb3IgYSBhbGwgc2VydmljZXMuCisKKworSVYuIFN0YXRlIHNuYXBzaG90czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1N1cHBvcnQgZm9yIHNuYXBzaG90cyByZWxpZXMgb24gdGhlIHN5bW1ldHJpYyBxZW11ZF8qX3NhdmUgYW5kIHFlbXVkXypfbG9hZAorZnVuY3Rpb25zIHdoaWNoIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSB2YXJpb3VzIFFlbXVkKiBzdHJ1Y3RzIGRlZmluZWQgaW4KK2FuZHJvaWQvaHctcWVtdWQuYy4gVGhlIGhpZ2gtbGV2ZWwgcHJvY2VzcyBpcyBhcyBmb2xsb3dzLgorCitXaGVuIGEgc25hcHNob3QgaXMgbWFkZSwgdGhlIG5hbWVzIGFuZCBjb25maWd1cmF0aW9ucyBvZiBhbGwgc2VydmljZXMgYXJlCitzYXZlZC4gU2VydmljZXMgY2FuIHJlZ2lzdGVyIGEgY3VzdG9tIGNhbGxiYWNrLCB3aGljaCBpcyBpbnZva2VkIGF0IHRoaXMgcG9pbnQKK3RvIGFsbG93IHNhdmluZyBvZiBzZXJ2aWNlLXNwZWNpZmljIHN0YXRlLiBOZXh0LCBjbGllbnRzIGFyZSBzYXZlZCBmb2xsb3dpbmcKK3RoZSBzYW1lIHBhdHRlcm4uIFdlIHNhdmUgdGhlIGNoYW5uZWwgaWQgYW5kIHRoZSBuYW1lIG9mIHNlcnZpY2UgdGhleSBhcmUKK3JlZ2lzdGVyZWQgdG8sIHRoZW4gaW52b2tlIGEgY2xpZW50LXNwZWNpZmljIGNhbGxiYWNrLgorCitXaGVuIGEgc25hcHNob3QgaXMgcmVzdG9yZWQsIHRoZSBmaXJzdCBzdGVwIGlzIHRvIGNoZWNrIHdoZXRoZXIgYWxsIHNlcnZpY2VzCit0aGF0IHdlcmUgcHJlc2VudCB3aGVuIHRoZSBzbmFwc2hvdCB3YXMgbWFkZSBhcmUgYXZhaWxhYmxlLiBUaGVyZSBpcyBjdXJyZW50bHkKK25vIGZ1bmN0aW9uYWxpdHkgdG8gc3RhcnQgc3RhcnQgbWlzc2luZyBzZXJ2aWNlcywgc28gbG9hZGluZyBmYWlscyBpZiBhIHNlcnZpY2UKK2lzIG5vdCBwcmVzZW50LiBJZiBhbGwgc2VydmljZXMgYXJlIHByZXNlbnQsIGNhbGxiYWNrcyBhcmUgdXNlZCB0byByZXN0b3JlCitzZXJ2aWNlLXNwZWNpZmljIHN0YXRlLgorCitOZXh0LCBhbGwgYWN0aXZlIGNsaWVudHMgYXJlIHNodXQgZG93bi4gSW5mb3JtYXRpb24gZnJvbSB0aGUgc25hcHNob3QgaXMgdXNlZAordG8gc3RhcnQgbmV3IGNsaWVudHMgZm9yIHRoZSBzZXJ2aWNlcyBhbmQgY2hhbm5lbHMgYXMgdGhleSB3ZXJlIHdoZW4gdGhlCitzbmFwc2hvdCB3YXMgbWFkZS4gVGhpcyBjb21wbGV0ZXMgdGhlIHJlc3RvcmUgcHJvY2Vzcy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9BTkRST0lELVNLSU4tRklMRVMuVFhUIGIvYW5kcm9pZC9kb2NzL0FORFJPSUQtU0tJTi1GSUxFUy5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0NzE3MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9BTkRST0lELVNLSU4tRklMRVMuVFhUCkBAIC0wLDAgKzEsMjI4IEBACitBbmRyb2lkIEVtdWxhdG9yIFNraW4gRmlsZSBTcGVjaWZpY2F0aW9uOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmV2aXNpb25zOgorLS0tLS0tLS0tLQorICAgIFJldmlzaW9uIDIuIERhdGVkIDIwMDktMTItMDcKKyAgICBEeW5hbWljIExheW91dCBzdXBwb3J0IGFkZGVkIDEwLzIwMTIKKyAgICBEeW5hbWljIExheW91dCBzdXBwb3J0IHJlbW92ZWQgMy8yMDE2CisgICAgUmV2aXNpb24gMy4gRGF0ZWQgMjAxNi0wMy0xMAorCitJbnRyb2R1Y3Rpb246CistLS0tLS0tLS0tLS0tCisKK1RoZSBBbmRyb2lkIGVtdWxhdG9yIHByb2dyYW0gaXMgY2FwYWJsZSBvZiBkaXNwbGF5aW5nIGEgd2luZG93IGNvbnRhaW5pbmcKK2FuIGltYWdlIG9mIGEgZmFrZSBoYW5kc2V0IGFuZCBhc3NvY2lhdGVkIGNvbnRyb2xzIChlLmcuIEQtUGFkLCB0cmFja2JhbGwsCitrZXlib2FyZCkuCisKK1RoZSBjb250ZW50IG9mIHRoaXMgd2luZG93IGlzIGRpY3RhdGVkIGJ5IGEgInNraW4iLCBpLmUuIGEgY29sbGVjdGlvbiBvZgoraW1hZ2VzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgdGhhdCBpbmRpY2F0ZXMgaG93IHRvIHBvcHVsYXRlIHRoZSB3aW5kb3cuCisKK1RoaXMgZG9jdW1lbnQgc3BlY2lmaWVzIGhvdyB0byBnZW5lcmF0ZSBhIG5ldyBza2luIGZvciB0aGUgZW11bGF0b3IuCisKK0dlbmVyYWwgRmlsZSBGb3JtYXQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoICJza2luIiBoYXMgYSB1bmlxdWUgbmFtZSBhbmQgY29ycmVzcG9uZHMgdG8gYSBkaXJlY3RvcnkgZmlsbGVkIHdpdGgKK3ZhcmlvdXMgZmlsZXMuIEFsbCBza2lucyBhcmUgbG9jYXRlZCB1bmRlciBhIHBhcmVudCAic2tpbi1kaXIiIGRpcmVjdG9yeS4KK1lvdSBjYW4gdXNlIHRoZSAnLXNraW4tZGlyIDxwYXRoPicgYW5kICctc2tpbiA8bmFtZT4nIG9wdGlvbnMgd2hlbiBzdGFydGluZwordGhlIGVtdWxhdG9yIHRvIHNwZWNpZnkgdGhlbS4gVGhpcyB3aWxsIGluc3RydWN0IHRoZSBwcm9ncmFtIHRvIGxvb2sgaW50bworCisgICAgPHBhdGg+LzxuYW1lPi8KKworRm9yIHNraW4tc3BlY2lmaWMgZmlsZXMuIFdpdGhvdXQgdGhlc2Ugb3B0aW9ucywgdGhlIGVtdWxhdG9yIHdpbGwgbG9vayBmb3IKK3NraW5zIGluIHRoZSBTREsgaW4gYSB3YXkgZGVzY3JpYmVkIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCisKK1RoZSBtb3N0IGltcG9ydGFudCBmaWxlIGluIGEgc2tpbiBtdXN0IGJlIG5hbWVkICdsYXlvdXQnLCBhcyBpbjoKKworICAgPHBhdGg+LzxuYW1lPi9sYXlvdXQKKworVGhlIGZvcm1hdCBvZiB0aGlzIGZpbGUgbXVzdCBmb2xsb3cgdGhlICJhY29uZmlnIiBzcGVjaWZpY2F0aW9uLCBzZWUKK2RvY3MvQU5EUk9JRC1DT05GSUctRklMRVMuVFhUIGZvciBkZXRhaWxzIGFib3V0IGl0LgorCisKK1BhcnRzOgorLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIHNraW4gZmlsZSBtdXN0IGRlZmluZSBhIGxpc3Qgb2YgJ3BhcnRzJy4KKworQSAnc2tpbiBwYXJ0JyBjb3JyZXNwb25kIHRvIGEgbmFtZWQgaXRlbSB0aGF0IGNhbiBjb250YWluIGEgc2V0IG9mCit2aXN1YWwvY29udHJvbCBlbGVtZW50cyB0aGF0IGNhbiBiZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorCisgLSAnYmFja2dyb3VuZCc6IEEgYmFja2dyb3VuZCBpbWFnZSBpbiBQTkcgZm9ybWF0LgorCisgLSAnZGlzcGxheSc6IEFuIGVtdWxhdGVkIExDRCBzY3JlZW4gYXJlYS4KKworIC0gJ2J1dHRvbnMnOiBBIHNldCBvZiBjbGlja2FibGUgY29udHJvbCBhcmVhcyAoZS5nLiBmb3IgYSBELVBhZCwgb3IKKyAgICAgICAgICAgICAgYSBLZXlib2FyZCkKKworRWFjaCBwYXJ0IGNhbiBiZSBpbmRlcGVuZGVudGx5IHBvc2l0aW9uZWQgYW5kL29yIHJvdGF0ZWQgaW4gdGhlIGxheW91dC4KK0Egc2tpbiBsYXlvdXQgaXMgc2ltcGx5IGFuIGFycmFuZ2VtZW50IG9mIHBhcnRzLgorCitTa2luIExheW91dDoKKy0tLS0tLS0tLS0tLS0KKworVGhlIGxheW91dCBpcyBhIG5hbWVkIHN1Yi1rZXkgb2YgdGhlIHRvcC1sZXZlbCAnbGF5b3V0cycga2V5IGluIHRoZQorY29uZmlnIGZpbGUsIGZvciBleGFtcGxlOgorCisgICAgbGF5b3V0cyB7CisgICAgICAgIG1haW4geworICAgICAgICAgICAgLi4uLgorICAgICAgICB9CisgICAgfQorCitOT1RFOiBwcmV2aW91c2x5LCB5b3UgY291bGQgc3BlY2lmeSBtdWx0aXBsZSBsYXlvdXRzIGluIHRoZSAibGF5b3V0cyIgc2VjdGlvbi4KK1lvdSBjYW4gc3RpbGwgZG8gdGhhdCwgYnV0IGFsbCB0aGUgbGF5b3V0cyBleGNlcHQgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIGlnbm9yZWQuCitJbnN0ZWFkLCB0aGVyZSB3aWxsIGJlIDMgYWRkaXRpb25hbCBsYXlvdXRzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGZpcnN0IG9uZToKK3JvdGF0ZWQgYnkgOTAsIDE4MCwgYW5kIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZS4KKworVGhlIGxheW91dCBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIGtleXMgKGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlcyk6CisKKy0gJ3dpZHRoJzogVGhlIHdpZHRoIG9mIHRoZSBlbXVsYXRvciB3aW5kb3cgaW4gcGl4ZWxzLCBhcyBhbiBpbnRlZ2VyCisKKy0gJ2hlaWdodCc6IFRoZSBoZWlnaHQgb2YgdGhlIGVtdWxhdG9yIHdpbmRvdyBpbiBwaXhlbHMsIGFzIGFuIGludGVnZXIKKworLSAnY29sb3InIDogQmFja2dyb3VuZCBjb2xvciB0byBiZSB1c2VkIHRvIGZpbGwgdGhlIGVtdWxhdG9yIHdpbmRvdy4KKyAgICAgICAgICAgIHRoaXMgaXMgYSAzMi1iaXQgQVJHQiB2YWx1ZSwgdGhlIDB4IHByZWZpeCBjYW4gYmUgdXNlZCB0bworICAgICAgICAgICAgdXNlIGhleGFkZWNpbWFsIG5vdGF0aW9uLgorCistICdldmVudCcgOiBBbiBvcHRpb25hbCBzcGVjaWZpYyBMaW51eCBldmVudCBjb2RlIHRoYXQgaXMgZ2VuZXJhdGVkIHdoZW5ldmVyCisgICAgICAgICAgICB0aGUgZW11bGF0b3Igc3dpdGNoZXMvaW5pdGlhbGl6ZXMgdGhpcyBsYXlvdXQuIFRoaXMgaXMgdXNlZCB0bworICAgICAgICAgICAgZW11bGF0ZSB0aGUgJ2tleWJvYXJkLWxpZCBvcGVuL2Nsb3NlJyBldmVudHMgd2hlbiBlbXVsYXRpbmcKKyAgICAgICAgICAgIGNlcnRhaW4gZGV2aWNlcyB3aXRoIGEgaGFyZHdhcmUga2V5Ym9hcmQuCisKKyAgICAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9mIHRoZSBmb3JtYXQ6CisKKyAgICAgICAgICAgICAgICAgPHR5cGU+Ojxjb2RlPjo8dmFsdWU+CisKKyAgICAgICAgICAgIFdoZXJlIHRoZSBldmVudCB0eXBlLCBjb2RlIGFuZCB2YWx1ZSBhcmUgbnVtZXJpY2FsIHZhbHVlcyBvciwKKyAgICAgICAgICAgIGluIGNlcnRhaW4gY2FzZXMgc3RyaW5nIGFsaWFzZXMgZm9yIExpbnV4IGlucHV0LXN1YnN5c3RlbSBldmVudAorICAgICAgICAgICAgY29kZXMuIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgZW11bGF0b3IgY29uc29sZSBjb21tYW5kcyB0bworICAgICAgICAgICAgcHJpbnQgdmFsaWQgdHlwZXMgYW5kIGNvZGVzOgorCisgICAgICAgICAgICAgICAgZXZlbnQgdHlwZXMgICAgICAgICAtPiBwcmludHMgYWxsIHZhbGlkIHR5cGVzCisgICAgICAgICAgICAgICAgZXZlbnQgY29kZXMgPHR5cGU+ICAtPiBwcmludHMgYWxsIHZhbGlkIGNvZGVzIGZvciA8dHlwZT4KKworICAgICAgICAgICAgVGhlIHR5cGljYWwgZXZlbnQgdG8gYmUgdXNlZCBpcyBFVl9TVzowOjEgZm9yIHBvcnRyYWl0IG1vZGUKKyAgICAgICAgICAgIGFuZCBFVl9TVzowOjAgZm9yIGxhbmRzY2FwZSBvbmVzLiBUaGV5IGNvcnJlc3BvbmRzIHRvICJrZXlib2FyZAorICAgICAgICAgICAgY2xvc2VkIiBhbmQgImtleWJvYXJkIG9wZW5lZCIgcmVzcGVjdGl2ZWx5LCBhbmQgd291bGQgbWF0Y2ggYQorICAgICAgICAgICAgZGV2aWNlIGxpa2UgdGhlIFQtTW9iaWxlIEcxIG9yIHRoZSBWZXJpem9uIERyb2lkLgorCistICdvbmlvbicgOiBTcGVjaWZpZXMgYW4gaW1hZ2UgdG8gb3ZlcmxheSBvbiB0aGUgZGlzcGxheS4gRWFjaCBzdWNoIGtleSBtYXkKKyAgICAgICAgICAgIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzdWIta2V5czoKKyAgICAgICAgICAgIC0gJ2ltYWdlJyBbcmVxdWlyZWRdOiBGaWxlbmFtZSBvZiBpbWFnZSB0byBvdmVybGF5CisgICAgICAgICAgICAtICdhbHBoYScgW29wdGlvbmFsXTogSG93IG9wYXF1ZSB0aGUgaW1hZ2Ugc2hvdWxkIGJlLCBmcm9tIDAgKG5vdAorICAgICAgICAgICAgICB2aXNpYmxlIGF0IGFsbCkgdG8gMTAwIChmdWxseSBvcGFxdWUpLiBEZWZhdWx0IGlzIDUwLgorICAgICAgICAgICAgLSAncm90YXRpb24nIFtvcHRpb25hbF06IEludGVnZXIgaW4gdGhlIDAuLjMgcmFuZ2UsIHNwZWNpZnlpbmcgdGhlCisgICAgICAgICAgICAgIGNsb2Nrd2lzZSByb3RhdGlvbiBvZiB0aGUgaW1hZ2UgaW4gOTAtZGVncmVlIGluY3JlbWVudHMuCisKKy0gJ3BhcnQ8bj4nOiBJbmRpdmlkdWFsIHBhcnQgcmVmZXJlbmNlcyBmb3IgdGhlIGxheW91dC4gVGhleSBhcmUgbmFtZWQKKyAgICAgICAgICAgICBpbiBpbmNyZW1lbnRhbCBudW1lcmljYWwgb3JkZXIsIHN0YXJ0aW5nIGZyb20gJ3BhcnQxJywgYXMgaW4KKyAgICAgICAgICAgICAncGFydDEnLCAncGFydDInLCAncGFydDMnLCBldGMuLi4KKworICAgICAgICAgICAgIEVhY2ggc3VjaCBrZXkgbXVzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgc3ViLWtleXM6CisKKyAgICAgICAgICAgICAgIC0gJ25hbWUnOiBUaGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBwYXJ0IHRvIGJlIGRpc3BsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGRlZmluZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorCisgICAgICAgICAgICAgICAtICd4JzogIEhvcml6b250YWwgb2Zmc2V0IHdoZXJlIHRoZSBwYXJ0IGlzIGRpc3BsYXllZAorICAgICAgICAgICAgICAgLSAneSc6ICBWZXJ0aWNhbCBvZmZzZXQgd2hlcmUgdGhlIHBhcnQgaXMgZGlzcGxheWVkCisKKyAgICAgICAgICAgICAgIC0gJ3JvdGF0aW9uJzogQW4gb3B0aW9uYWwgc3ViLWtleSB3aGljaCB2YWx1ZSBpcyBhIGludGVnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIDAuLjMgcmFuZ2Ugc3BlY2lmeWluZyB0aGUgY2xvY2t3aXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uIChpbiA5MC1kZWdyZWVzIGluY3JlbWVudCkgdG8gYXBwbHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhcnQgYmVmb3JlIGRpc3BsYXkuCisKKy0gJ2RwYWQtcm90YXRpb24nOgorICAgICAgICAgICAgIEFuIG9wdGlvbiBpbnRlZ2VyIGluIHRoZSAwLi4zIHJhbmdlIGluZGljYXRpbmcgd2hpY2gKKyAgICAgICAgICAgICBjb3VudGVyY2xvY2t3aXNlIHJvdGF0aW9uIChpbiA5MC1kZWdyZWVzIGluY3JlbWVudHMpIHRvIGFwcGx5IHRvCisgICAgICAgICAgICAgdGhlIEQtUGFkIGtleXMgZm9yIHByb3BlciB1c2FnZS4KKworICAgICAgICAgICAgIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIGNvbnNpZGVycyB0aGF0CisgICAgICAgICAgICAgdGhlIERQYWQgaXMgaW4gbGFuZHNjYXBlIG1vZGUgd2hlbiB0aGUgZGV2aWNlIGlzIGluIGxhbmRzY2FwZQorICAgICAgICAgICAgIG1vZGUgYW5kIHdpbGwtYXV0by1yb3RhdGUgdGhlIEQtUGFkIHZhbHVlLiBUaGlzIHNldHRpbmcgaXMgdXNlZAorICAgICAgICAgICAgIHRvIGNvdW50ZXItZWZmZWN0IHRoaXMgY29ycmVjdGlvbiBmb3IgY2VydGFpbiBza2lucyB3aGljaAorICAgICAgICAgICAgIGRvIG5vdCByb3RhdGUgdGhlIERQYWQgaW4gbGFuZHNjYXBlIG1vZGUuCisKKworCitTa2luIFBhcnRzOgorLS0tLS0tLS0tLS0KKworRWFjaCBza2luIHBhcnQgaXMgYSBzdWIta2V5IG9mIHRoZSB0b3AtbGV2ZWwgJ3BhcnRzJyBrZXkgaW4gdGhlIGNvbmZpZ3VyYXRpb24KK2ZpbGUuIEZvciBleGFtcGxlOgorCisgICAgcGFydHMgeworICAgICAgICBmb28geworICAgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAgICAgYmFyIHsKKyAgICAgICAgICAgIC4uLgorICAgICAgICB9CisgICAgICAgIHpvbyB7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgfQorICAgIH0KKworRGVmaW5lcyB0aHJlZSBwYXJ0cyBuYW1lZCAnZm9vJywgJ2JhcicgYW5kICd6b28nLgorCitFYWNoIHBhcnQgY2FuIGhhdmUgb25lIG9yIG1vcmUgZWxlbWVudHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlL2tleSBuYW1lIHRoYXQKK3dpbGwgZGV0ZXJtaW5lIGl0cyB2aXN1YWwgYXBwZWFyYW5jZToKKworLSAnYmFja2dyb3VuZCc6CisgICAgICAgIEEgYmFja2dyb3VuZCBpbWFnZSBpbiBQTkcgZm9ybWF0LiBUaGlzIGlzIGEgdHJlZSBrZXkgdGhhdCBjYW4KKyAgICAgICAgaGF2ZSB0aGUgZm9sbG93aW5nIHN1Yi1rZXlzOgorCisgICAgICAgICAgICAtICdpbWFnZSc6ICBOYW1lIG9mIHRoZSBQTkcgaW1hZ2UgaW4gdGhlIHNraW4gZGlyZWN0b3J5CisgICAgICAgICAgICAtICd4JyAgICA6ICBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBpbiBwaXhlbHMgKGludGVnZXIpCisgICAgICAgICAgICAtICd5JyAgICA6ICBPcHRpb25hbCB2ZXJ0aWNhbCBvZmZzZXQgaW4gcGl4ZWxzIChpbnRlZ2VyKQorCistICdkaXNwbGF5JzoKKyAgICAgICAgQW4gb3B0aW9uYWwgcmVjdGFuZ3VsYXIgYXJlYSB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUKKyAgICAgICAgYmFja2dyb3VuZCBpbWFnZSB0byBkaXNwbGF5IGFuIGVtdWxhdGVkIExDRCBzY3JlZW4uIFZhbGlkIHN1Yi1rZXlzCisgICAgICAgIGFyZToKKworICAgICAgICAgICAgLSAneCcgICAgICAgOiBPcHRpb25hbCBob3Jpem9udGFsIG9mZnNldCBpbiBwaXhlbHMgKGludGVnZXIpCisgICAgICAgICAgICAtICd5JyAgICAgICA6IE9wdGlvbmFsIHZlcnRpY2FsIG9mZnNldCBpbiBwaXhlbHMgKGludGVnZXIpCisgICAgICAgICAgICAtICd3aWR0aCcgICA6IFdpZHRoIGluIHBpeGVscyAoaW50ZWdlcikKKyAgICAgICAgICAgIC0gJ2hlaWdodCcgIDogSGVpZ2h0IGluIHBpeGVscyAoaW50ZWdlcikKKyAgICAgICAgICAgIC0gJ3JvdGF0aW9uJzogT3B0aW9uYWwgcm90YXRpb24gdmFsdWUgKDAuLjMpIGluIDkwIGRlZ3JlZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50cy4KKworLSAnYnV0dG9ucyc6CisgICAgICAgIFVzZWQgdG8gZGVmaW5lIGEgbGlzdCBvZiByZWN0YW5ndWxhciBjbGlja2FibGUgY29udHJvbCBhcmVhcyB3aXRoCisgICAgICAgIGFuIG9wdGlvbmFsIGhpZ2gtbGlnaHRpbmcgaW1hZ2UuIEVhY2ggc3ViLWtleSBtdXN0IGhhdmUgYSB1bmlxdWUKKyAgICAgICAgbmFtZSwgYW5kIG1heSBjb250YWluIHRoZSBmb2xsb3dpbmcgc3ViLXN1Yi1rZXlzOgorCisgICAgICAgICAgICAtICd4JyAgICAgICA6IEhvcml6b250YWwgb2Zmc2V0IGluIHBpeGVscyAoaW50ZWdlcikKKyAgICAgICAgICAgIC0gJ3knICAgICAgIDogVmVydGljYWwgb2Zmc2V0IGluIHBpeGVscyAoaW50ZWdlcikKKyAgICAgICAgICAgIC0gJ2ltYWdlJyAgIDogUE5HIGltYWdlIG9mIHRoZSBoaWdoLWxpZ2h0aW5nIGZvciB0aGUgYnV0dG9uCisKKyAgICAgICAgRWFjaCBoaWdobGlnaHQgaW1hZ2Ugd2lsbCBiZSBkcmF3biBvbiB0b3Agb2YgdGhlIGJhY2tncm91bmQgYXJlIGZvcgorICAgICAgICB0aGUgYnV0dG9uLiBBIHR5cGljYWwgb25lIGhhcyA1MCUgb3BhY2l0eS4gVGhlIGhpZ2hsaWdodCB3aWxsIGJlIGRyYXduCisgICAgICAgIHR3aWNlIHRvIHNpbXVsYXRlICdjbGlja2VkJyBzdGF0ZS4KKworICAgICAgICBUaGUgaW1hZ2UncyBkaW1lbnNpb25zIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgY29udHJvbAorICAgICAgICBhcmVhLgorCisgICAgICAgIFRoZSBuYW1lIG9mIGVhY2ggYnV0dG9uIG11c3QgY29ycmVzcG9uZCB0byB0aGUgbGlzdCBvZiBrZXkgc3ltYm9scworICAgICAgICBkZWZpbmVkIGluIHRoZSBfa2V5aW5mb190YWJsZSBhcnJheSBkZWZpbmVkIGluIGFuZHJvaWQvc2tpbi9maWxlLmMuCisKK090aGVyIHRvcC1sZXZlbCBrZXlzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgZmV3IG90aGVyIHRvcC1sZXZlbCBrZXlzIGFyZSBzdXBwb3J0ZWQgZm9yIGxlZ2FjeSByZWFzb25zLCBidXQgdGhlCitjb3JyZXNwb25kaW5nIGRlZmluaXRpb24gaXMgYmVzdCBkZWZpbmVkIGluIHRoZSBoYXJkd2FyZSBwcm9wZXJ0aWVzL2NvbmZpZworZmlsZSBpbnN0ZWFkOgorCistICdrZXlib2FyZC5jaGFybWFwJzoKKyAgICBPcHRpb25hbCwgbXVzdCBiZSB0aGUgbmFtZSBvZiB0aGUgY2hhcm1hcCBiZWluZyB1c2VkIGZvciB0aGlzCisgICAgc2tpbi4gQ3VycmVudGx5IHVudXNlZCBzbyBpZ25vcmUgdGhpcy4KKworLSAnbmV0d29yay5zcGVlZCc6CisgICAgRGVmYXVsdCBuZXR3b3JrIHNwZWVkIGZvciB0aGlzIHNraW4uIFZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZQorICAgIC1uZXRzcGVlZCA8c3BlZWQ+IGVtdWxhdG9yIGNvbW1hbmQtbGluZSBvcHRpb24uCisKKy0gJ25ldHdvcmsuZGVsYXknOgorICAgIERlZmF1bHQgbmV0d29yayBsYXRlbmN5IGZvciB0aGlzIHNraW4uIFZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZQorICAgIC1uZXRkZWxheSA8ZGVsYXk+IGVtdWxhdG9yIGNvbW1hbmQtbGluZSBvcHRpb24uCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQVVESU8uVFhUIGIvYW5kcm9pZC9kb2NzL0FVRElPLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVjMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0FVRElPLlRYVApAQCAtMCwwICsxLDE5NSBAQAorSE9XIEFVRElPIEVNVUxBVElPTiBXT1JLUyBJTiBRRU1VOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGluZ3MgYXJlIGEgYml0IHRyaWNreSwgYnV0IGhlcmUncyBhIHJvdWdoIGRlc2NyaXB0aW9uOgorCisgIFFFTVVTb3VuZENhcmQ6IG1vZGVscyBhIGdpdmVuIGVtdWxhdGVkIHNvdW5kIGNhcmQKKyAgU1dWb2ljZU91dDogICAgbW9kZWxzIGFuIGF1ZGlvIG91dHB1dCBmcm9tIGEgUUVNVVNvdW5kQ2FyZAorICBTV1ZvaWNlSW46ICAgICBtb2RlbHMgYW4gYXVkaW8gaW5wdXQgZnJvbSBhIFFFTVVTb3VuZENhcmQKKworICBIV1ZvaWNlT3V0OiAgICBtb2RlbHMgYW4gYXVkaW8gb3V0cHV0IChiYWNrZW5kKSBvbiB0aGUgaG9zdC4KKyAgSFdWb2ljZUluOiAgICAgbW9kZWxzIGFuIGF1ZGlvIGlucHV0IChiYWNrZW5kKSBvbiB0aGUgaG9zdC4KKworRWFjaCB2b2ljZSBjYW4gaGF2ZSBpdHMgb3duIHNldHRpbmdzIGluIHRlcm1zIG9mIHNhbXBsZSBzaXplLCBlbmRpYW5lc3MsIHJhdGUsIGV0Yy4uLgorCisKK0VtdWxhdGlvbiBmb3IgYSBnaXZlbiBzb3VuZGNhcmQgdHlwaWNhbGx5IGRvZXM6CisKKyAgMS8gQ3JlYXRlIGEgUUVNVVNvdW5kQ2FyZCBvYmplY3QgYW5kIHJlZ2lzdGVyIGl0IHdpdGggQVVEX3JlZ2lzdGVyX2NhcmQoKQorICAyLyBGb3IgZWFjaCBlbXVsYXRlZCBvdXRwdXQsIGNhbGwgQVVEX29wZW5fb3V0KCkgdG8gY3JlYXRlIGEgU1dWb2ljZU91dCBvYmplY3QuCisgIDMvIEZvciBlYWNoIGVtdWxhdGVkIGlucHV0LCBjYWxsIEFVRF9vcGVuX2luKCkgdG8gY3JlYXRlIGEgU1dWb2ljZUluIG9iamVjdC4KKworICBOb3RlIHRoYXQgeW91IG11c3QgcGFzcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIEFVRF9vcGVuX291dCgpIGFuZCBBVURfb3Blbl9pbigpOworICBtb3JlIG9uIHRoaXMgbGF0ZXIuCisKKyAgRWFjaCBTV1ZvaWNlT3V0IGlzIGFzc29jaWF0ZWQgdG8gYSBzaW5nbGUgSFdWb2ljZU91dCwgZWFjaCBTV1ZvaWNlSW4gaXMKKyAgYXNzb2NpYXRlZCB0byBhIHNpbmdsZSBIV1ZvaWNlSW4uCisKKyAgSG93ZXZlciB5b3UgY2FuIGhhdmUgc2V2ZXJhbCBTV1ZvaWNlT3V0IGFzc29jaWF0ZWQgdG8gdGhlIHNhbWUgSFdWb2ljZU91dAorICAoc2FtZSB0aGluZyBmb3IgU1dWb2ljZUluL0hXVm9pY2VJbikuCisKK1NPVU5EIFBMQVlCQUNLIERFVEFJTFM6Cis9PT09PT09PT09PT09PT09PT09PT09PQorCitFYWNoIEhXVm9pY2VPdXQgaGFzIHRoZSBmb2xsb3dpbmcgdG9vOgorCisgIC0gQSBmaXhlZC1zaXplIGNpcmN1bGFyIGJ1ZmZlciBvZiBzdGVyZW8gc2FtcGxlcyAoZm9yIHN0ZXJlbykuCisgICAgd2hvc2UgZm9ybWF0IGlzIGVpdGhlciBmbG9hdHMgb3IgaW50NjRfdCBwZXIgc2FtcGxlIChkZXBlbmRpbmcgb24gYnVpbGQKKyAgICBjb25maWd1cmF0aW9uKS4KKworICAtIEEgJ3NhbXBsZXMnIGZpZWxkIGdpdmluZyB0aGUgKGNvbnN0YW50KSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBzdGVyZW8gYnVmZmVyLgorCisgIC0gQSB0YXJnZXQgY29udmVyc2lvbiBmdW5jdGlvbiwgY2FsbGVkICdjbGlwKCknIHRoYXQgaXMgdXNlZCB0byByZWFkIGZyb20gdGhlIHN0ZXJlbworICAgIGJ1ZmZlciBhbmQgd3JpdGUgaW50byBhIHBsYXRmb3JtLXNwZWNpZmljIHNvdW5kIGJ1ZmZlcnMgKGUuZy4gV2luV2F2ZS1tYW5hZ2VkIGJ1ZmZlcnMKKyAgICBvbiBXaW5kb3dzKS4KKworICAtIEEgJ3Jwb3MnIG9mZnNldCBpbnRvIHRoZSBjaXJjdWxhciBidWZmZXIgd2hpY2ggdGVsbHMgd2hlcmUgdG8gcmVhZCB0aGUgbmV4dCBzYW1wbGVzCisgICAgZnJvbSB0aGUgc3RlcmVvIGJ1ZmZlciBmb3IgdGhlIG5leHQgY29udmVyc2lvbiB0aHJvdWdoICdjbGlwJy4KKworCisgICAgICAgICAgICB8PC0tLS0tLS0tLS0tLS0tLS0tIHNhbXBsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorCisgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisgICAgICAgICAgICB8ICAgICAgIHJwb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICB8X19fX19fX3ZfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICB8X19fX19fX3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorCisKKyAgLSBBICdydW5fb3V0JyBtZXRob2QgdGhhdCBpcyBjYWxsZWQgZWFjaCB0aW1lIHRvIHRlbGwgdGhlIG91dHB1dCBiYWNrZW5kIHRvCisgICAgc2VuZCBzYW1wbGVzIGZyb20gdGhlIHN0ZXJlbyBidWZmZXIgdG8gdGhlIGhvc3Qgc291bmQgY2FyZC9zZXJ2ZXIuIFRoaXMgbWV0aG9kCisgICAgc2hhbGwgYWxzbyBtb2RpZnkgJ3Jwb3MnIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAncGxheWVkJy4gQSBtb3JlIGRldGFpbGVkCisgICAgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9jZXNzIGFwcGVhcnMgYmVsb3cuCisKKyAgLSBBICd3cml0ZScgbWV0aG9kIGNhbGxiYWNrIHVzZWQgdG8gd3JpdGUgYSBidWZmZXIgb2YgZW11bGF0ZWQgc291bmQgc2FtcGxlcyBmcm9tCisgICAgYSBTV1ZvaWNlT3V0IGludG8gdGhlIHN0ZXJlbyBidWZmZXIuIEN1cnJlbnRseSBhbGwgYmFja2VuZHMgc2ltcGx5IGNhbGwgdGhlIGdlbmVyaWMKKyAgICBmdW5jdGlvbiBhdWRpb19wY21fc3dfd3JpdGUoKSB0byBpbXBsZW1lbnQgdGhpcy4KKworICAgIEFjY29yZGluZyB0byBtYWxjLCB0aGUgYXVkaW8gc3ViLXN5c3RlbSdzIG9yaWdpbmFsIGF1dGhvciwgdGhpcyBpcyB0byBhbGxvdworICAgIGEgYmFja2VuZCB0byB1c2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBmdW5jdGlvbiB0byBkbyB0aGUgc2FtZSB0aGluZyBpZiBhdmFpbGFibGUuCisKKyAgICAoU2ltaWxhcmx5LCBhbGwgaW5wdXQgYmFja2VuZHMgaGF2ZSBhICdyZWFkJyBtZXRob2RzIHdoaWNoIHNpbXBseSBjYWxscyAnYXVkaW9fcGNtX3N3X3JlYWQnKQorCitFYWNoIFNXVm9pY2VPdXQgaGFzIHRoZSBmb2xsb3dpbmc6CisKKyAgLSBhICdjb252KCknIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBzb3VuZCBzYW1wbGVzIGZyb20gdGhlIGVtdWxhdGVkIHNvdW5kIGNhcmQgYW5kCisgICAgY29weS9taXggdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBIV1ZvaWNlT3V0J3Mgc3RlcmVvIGJ1ZmZlci4KKworICAtIGEgJ3RvdGFsX2h3X3NhbXBsZXNfbWl4ZWQnIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaGF2ZQorICAgIGFscmVhZHkgYmVlbiBtaXhlZCBpbnRvIHRoZSB0YXJnZXQgSFdWb2ljZU91dCBzdGVyZW8gYnVmZmVyIChzdGFydGluZyBmcm9tIHRoZQorICAgIEhXVm9pY2VPdXQncyAncnBvcycgb2Zmc2V0KS4gTk9URTogdGhpcyBpcyBhIGNvdW50IG9mIHNhbXBsZXMgaW4gdGhlIEhXVm9pY2VPdXQKKyAgICBzdGVyZW8gYnVmZmVyLCBub3QgZW11bGF0ZWQgaGFyZHdhcmUgc291bmQgc2FtcGxlcywgd2hpY2ggY2FuIGhhdmUgZGlmZmVyZW50CisgICAgcHJvcGVydGllcyAoZnJlcXVlbmN5LCBzaXplLCBlbmRpYW5lc3MpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fX19fXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTV1ZvaWNlT3V0MiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgICAgX19fX19fX19fX19fX18gICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICB8CisgICAgICAgICAgICAgICAgIHwgIFNXVm9pY2VPdXQxIHwgICAgICAgICAgfCAgICAgdGhzbTxOPiA6PSB0b3RhbF9od19zYW1wbGVzX21peGVkCisgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX19fX3wgICAgICAgICAgfCAgICAgICAgICAgICAgICBmb3IgU1dWb2ljZU91dDxOPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgIHw8LS0tLS18LS0tLS0tLS0tLS0tdGhzbTItLT58CisgICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgIHw8LS0tdGhzbTEtLS0tLS0tLT58ICAgICAgICB8CisgICAgICAgICAgICAgX19fX19fX3xfX19fX19fX19fX19fX19fX192X19fX19fX198X19fX19fX19fX19fX19fIAorICAgICAgICAgICAgfCAgICAgICB8MTExMTExMTExMTExMTExMTExfCAgICAgICAgdiAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgfDIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnwgICAgICAgICAgICAgICB8CisgICAgICAgICAgICB8X19fX19fX3xfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICBIV1ZvaWNlT3V0IHN0ZXJlbyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgcnBvcworCisKKyAgLSBhICdyYXRpbycgdmFsdWUsIHdoaWNoIGlzIHRoZSByYXRpbyBvZiB0aGUgdGFyZ2V0IEhXVm9pY2VPdXQncyBmcmVxdWVuY3kgYnkKKyAgICB0aGUgU1dWb2ljZU91dCdzIGZyZXF1ZW5jeSwgbXVsdGlwbGllZCBieSAoMSA8PCAzMiksIGFzIGEgNjQtYml0IGludGVnZXIuCisKKyAgICBTbywgaWYgdGhlIEhXVm9pY2VPdXQgaGFzIGEgZnJlcXVlbmN5IG9mIDQ0a0h6LCBhbmQgdGhlIFNXVm9pY2VPdXQgaGFzIGEgZnJlcXVlbmN5CisgICAgb2YgMTFrSHosIHRoZW4gcmF0aW8gd2lsbCBiZSAoNDQvMTEqKDEgPDwgMzIpKSA9IDB4NF8wMDAwXzAwMDAKKworICAtIGEgY2FsbGJhY2sgcHJvdmlkZWQgYnkgdGhlIGVtdWxhdGVkIGhhcmR3YXJlIHdoZW4gdGhlIFNXVm9pY2VPdXQgaXMgY3JlYXRlZC4KKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbWl4IHRoZSBTV1ZvaWNlT3V0J3Mgc2FtcGxlcyBpbnRvIHRoZSB0YXJnZXQKKyAgICBIV1ZvaWNlT3V0IHN0ZXJlbyBidWZmZXIgKGl0IG11c3QgYWxzbyBwZXJmb3JtIGZyZXF1ZW5jeSBpbnRlcnBvbGF0aW9uLAorICAgIHZvbHVtZSBhZGp1c3RtZW50LCBldGMuLikuCisKKyAgICBUaGlzIGNhbGxiYWNrIG5vcm1hbGx5IGNhbGxzIGFub3RoZXIgaGVscGVyIGZ1bmN0aW9ucyBpbiB0aGUgYXVkaW8gc3Vic3lzdGVtCisgICAgKEFVRF93cml0ZSgpKSB0byB0byB0aGUgbWl4aW5nL3ZvbHVtZS1hZGp1c3RtZW50IGZyb20gZW11bGF0ZWQgaGFyZHdhcmUgc2FtcGxlCisgICAgYnVmZmVycy4KKworSGVyZSdzIGEgc21hbGwgZ3JhcGhpY3MgdGhhdCBleHBsYWlucyBpdCBiZXR0ZXI6CisKKyAgIFNXVm9pY2VPdXQ6ICBlbXVsYXRlZCBoYXJkd2FyZSBzb3VuZCBidWZmZXJzOgorICAgICAgICAgIHwKKyAgICAgICAgICB8ICAgKG1peGVkIHRocm91Z2ggQVVEX3dyaXRlKCkgY2FsbGVkIGZyb20gdXNlci1wcm92aWRlZAorICAgICAgICAgIHwgICAgY2FsbGJhY2sgd2hpY2ggaXMgaXRzZWxmIGNhbGxlZCBvbiBlYWNoIGF1ZGlvIHRpbWVyCisgICAgICAgICAgfCAgICB0aWNrKS4KKyAgICAgICAgICB2CisgICBIV1ZvaWNlT3V0OiBzdGVyZW8gc2FtcGxlIGNpcmN1bGFyIGJ1ZmZlcgorICAgICAgICAgIHwKKyAgICAgICAgICB8ICAgKHNlbnQgdGhyb3VnaCBIV1ZvaWNlT3V0J3MgJ2NsaXAnIGZ1bmN0aW9uLCB3aGljaCBpcworICAgICAgICAgIHwgICAgaW52b2tlZCBmcm9tIHRoZSAncnVuX291dCcgbWV0aG9kLCBhbHNvIGNhbGxlZCBvbiBlYWNoCisgICAgICAgICAgfCAgICBhdWRpbyB0aW1lciB0aWNrKQorICAgICAgICAgIHYKKyAgIGJhY2tlbmQtc3BlY2lmaWMgc291bmQgYnVmZmVycworCisKK1RoZSBmdW5jdGlvbiBhdWRpb190aW1lcigpIGluIGF1ZGlvL2F1ZGlvLmMgaXMgY2FsbGVkIHBlcmlvZGljYWxseSBhbmQgaXQgaXMgdXNlZCBhcworYSBwdWxzZSB0byBwZXJmb3JtIHNvdW5kIGJ1ZmZlciB0cmFuc2ZlcnMgYW5kIG1peGluZy4gTW9yZSBzcGVjaWZpY2FsbHkgZm9yIGF1ZGlvCitvdXRwdXQgdm9pY2VzOgorCistIEZvciBlYWNoIEhXVm9pY2VPdXQsIGZpbmQgdGhlIG51bWJlciBvZiBhY3RpdmUgU1dWb2ljZU91dCwgYW5kIHRoZSBtaW5pbXVtIG51bWJlcgorICBvZiAndG90YWxfaHdfc2FtcGxlc19taXhlZCcgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBidWZmZXIuIFdlIHdpbGwKKyAgY2FsbCB0aGlzIHZhbHVlIHRoZSBudW1iZXIgb2YgJ2xpdmUnIHNhbXBsZXMgaW4gdGhlIHN0ZXJlbyBidWZmZXIuCisKKy0gaWYgJ2xpdmUnIGlzIDAsIGNhbGwgdGhlIGNhbGxiYWNrIG9mIGVhY2ggYWN0aXZlIFNXVm9pY2VPdXQgdG8gZmlsbCB0aGUgc3RlcmVvCisgIGJ1ZmZlciwgaWYgbmVlZGVkLCB0aGVuIGV4aXQuCisKKy0gb3RoZXJ3aXNlLCBjYWxsIHRoZSAncnVuX291dCcgbWV0aG9kIG9mIHRoZSBIV1ZvaWNlT3V0IG9iamVjdC4gVGhpcyB3aWxsIGNoYW5nZQorICB0aGUgdmFsdWUgb2YgJ3Jwb3MnIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHBsYXllZC4gVGhlbiB0aGUKKyAgJ3RvdGFsX2h3X3NhbXBsZXNfbWl4ZWQnIGZpZWxkIG9mIGFsbCBhY3RpdmUgU1dWb2ljZU91dHMgaXMgZGVjcmVtZW50ZWQgYnkKKyAgJ3BsYXllZCcsIGFuZCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIHRvIHJlLWZpbGwgdGhlIHN0ZXJlbyBidWZmZXIuCisKK0l0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgU1dWb2ljZU91dCBjYWxsYmFjazoKKworLSB0YWtlcyBhICdmcmVlJyBwYXJhbWV0ZXIgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBzdGVyZW8gc291bmQgc2FtcGxlcyB0aGF0IGNhbgorICBiZSBzZW50IHRvIHRoZSBoYXJkd2FyZSBzdGVyZW8gYnVmZmVyIChiZWZvcmUgcmF0ZSBhZGp1c3RtZW50LCBpLmUuIG5vdCB0aGUgbnVtYmVyCisgIG9mIHNvdW5kIHNhbXBsZXMgaW4gdGhlIFNXVm9pY2VPdXQgZW11bGF0ZWQgaGFyZHdhcmUgc291bmQgYnVmZmVyKS4KKworLSBtdXN0IGNhbGwgQVVEX3dyaXRlKHN3LCBidWZmLCBjb3VudCksIHdoZXJlICdidWZmJyBwb2ludHMgdG8gZW11bGF0ZWQgc291bmQKKyAgc2FtcGxlcywgYW5kIHRoZWlyICdjb3VudCcsIHdoaWNoIG11c3QgYmUgPD0gdGhlICdmcmVlJyBwYXJhbWV0ZXIuCisKKy0gdGhlIGltcGxlbWVudGF0aW9uIG9mIEFVRF93cml0ZSgpIHdpbGwgY2FsbCB0aGUgJ3dyaXRlJyBtZXRob2Qgb2YgdGhlIHRhcmdldAorICBIV1ZvaWNlT3V0LCB3aGljaCBpbiB0dXJucyBjYWxscyB0aGUgZnVuY3Rpb24gYXVkaW9fcGNtX3N3X3dyaXRlKCkgd2hpY2ggZG9lcworICBzdGFuZGFyZCByYXRlL3ZvbHVtZSBhZGp1c3RtZW50IGJlZm9yZSBtaXhpbmcgdGhlIGNvbnZlcnNpb24gaW50byB0aGUgdGFyZ2V0CisgIHN0ZXJlbyBidWZmZXIuIEl0IGFsc28gaW5jcmVhc2VzIHRoZSAndG90YWxfaHdfc2FtcGxlc19taXhlZCcgdmFsdWUgb2YgdGhlCisgIFNXVm9pY2VPdXQuCisKKy0gYXVkaW9fcGNtX3N3X3dyaXRlKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNvdW5kIHNhbXBsZSAqYnl0ZXMqIHRoYXQgaGF2ZQorICBiZWVuIG1peGVkIGludG8gdGhlIHN0ZXJlbyBidWZmZXIsIGFuZCBzbyBkb2VzIEFVRF93cml0ZSgpLgorCitTbywgaW4gdGhlIGVuZCwgd2UgaGF2ZSB0aGUgcHNldWRvLWNvZGU6CisKKyAgICBldmVyeSBzb3VuZCB0aW1lciB0aWNrczoKKyAgICAgIGZvciBodyBpbiBsaXN0X0hXVm9pY2VPdXQ6CisgICAgICAgICBsaXZlID0gTUlOKFtzdy50b3RhbF9od19zYW1wbGVzX21peGVkIGZvciBzdyBpbiBody5saXN0X1NXVm9pY2VPdXQgXSkKKyAgICAgICAgIGlmIGxpdmUgPiAwOgorICAgICAgICAgICAgcGxheWVkID0gaHcucnVuX291dChsaXZlKQorICAgICAgICAgICAgZm9yIHN3IGluIGh3Lmxpc3RfU1dWb2ljZU91dDoKKyAgICAgICAgICAgICAgICBzdy50b3RhbF9od19zYW1wbGVzX21peGVkIC09IHBsYXllZAorCisgICAgICAgIGZvciBzdyBpbiBody5saXN0X1NXVm9pY2VPdXQ6CisgICAgICAgICAgICBmcmVlID0gaHcuc2FtcGxlcyAtIHN3LnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQKKyAgICAgICAgICAgIGlmIGZyZWUgPiAwOgorICAgICAgICAgICAgICAgIHN3LmNhbGxiYWNrKHN3LCBmcmVlKQorCitTT1VORCBSRUNPUkRJTkcgREVUQUlMUzoKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGluZ3MgYXJlIHNpbWlsYXIgYnV0IGluIHJldmVyc2Ugb3JkZXIuIEkuZS4gdGhlIEhXVm9pY2VJbiBhY3F1aXJlcyBzb3VuZCBzYW1wbGVzCitpbiBpdHMgc3RlcmVvIHNvdW5kIGJ1ZmZlciwgYW5kIHRoZSBTV1ZvaWNlSW4gb2JqZWN0cyBtdXN0IGNvbnN1bWUgdGhlbSBhcyBzb29uIGFzCit0aGV5IGNhbi4KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0NIQU5HRVMuVFhUIGIvYW5kcm9pZC9kb2NzL0NIQU5HRVMuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmY4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQ0hBTkdFUy5UWFQKQEAgLTAsMCArMSw5MjAgQEAKK0FuZHJvaWQgRW11bGF0b3IgY2hhbmdlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVmVyc2lvbnM6CisKKyAgIDEuMCA9PiBTREsgTTMgcmVsZWFzZQorICAgMS4xID0+IFNESyBNNSByZWxlYXNlCisgICAxLjIgPT4gSW50ZXJuYWwgcmVsZWFzZSAoYnVpbGQgNzIyNjQpCisgICAxLjMgPT4gSW50ZXJuYWwgcmVsZWFzZSAoYnVpbGQgNzc3ODApCisgICAxLjQgPT4gSW50ZXJuYWwgcmVsZWFzZSAoYnVpbGQgODQ4NTMpCisgICAxLjUgPT4gU0RLIDAuOV9yMQorICAgMS42ID0+IFNESyAxLjBfcjEKKyAgIDEuNyA9PiBTREsgMS4wX3IyCisgICAxLjggPT4gU0RLIDEuMQorICAgMS45ID0+IFNESyAxLjVfcjEgKGFuZCBTREsgMS41X3IyKQorICAgMS4xMCA9PiBTREsgMS41X3IzCisgICAxLjExID0+IFNESyAxLjZfcjEKKyAgIDEuMTIgPT4gU0RLIDIuMAorICAgMS4xMyA9PiBTREsgMi4wLjEgKGJ1dCB3cm9uZ2x5IHRhZ2dlZCAxLjEyKQorCisgICBTdGFydGluZyBmcm9tIGhlcmUsIHRoZSBlbXVsYXRvciB2ZXJzaW9uIG51bWJlciB3aWxsIG1hdGNoCisgICB0aGUgY29ycmVzcG9uZGluZyBTREsgVG9vbHMgcmVsZWFzZSBsZXZlbCwgaS5lLjoKKworICAgNS4wICA9PiBTREsgVG9vbHMgcmVsZWFzZSA1CisgICA2LjAgID0+IFNESyBUb29scyByZWxlYXNlIDYKKyAgIDcuMCAgPT4gU0RLIFRvb2xzIHJlbGVhc2UgNworICAgZXRjLi4uCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDguMCBhbmQgNy4wCisKK0lNUE9SVEFOVCBDSEFOR0VTOgorCitPVEhFUjoKKworLSBUaGUgcGhvbmUgY2FuIG5vdyBiZSBjYWxsZWQgd2l0aCBhZGRpdGlvbmFsIG51bWJlcnMsIHVzaW5nIHRoZSAxLTU1NS01MjEKKyAgcHJlZml4LiBJLmUuIHlvdSBjYW4gbm93IHVzZSBhbGwgb2YgdGhlIGZvbGxvd2luZyBudW1iZXJzIHRvIGNhbGwvc21zIGFuCisgIGVtdWxhdG9yIHRoYXQgcnVucyBvbiBjb25zb2xlIHBvcnQgNTU1NDoKKworICA1NTU0CisgIDUyMSA1NTU0CisgIDU1NSA1MjEgNTU1NAorICAxIDU1NSA1MjEgNTU1NAorCistIEZpeCAtaHR0cC1wcm94eSBpbXBsZW1lbnRhdGlvbiB0byBwcm9wZXJseSB3b3JrIHdpdGggY2h1bmtlZCBlbmNvZGluZ3MuCisKKyAgQWxzbyB0cnkgdG8gY29ubmVjdCB0byB0aGUgcHJveHkgb24gc3RhcnR1cCB0byBzZWUgaWYgdGhlIGhvc3QvcG9ydCBhcmUKKyAgdmFsaWQuIElmIG5vIGNvbm5lY3Rpb24gc3VjY2VlZHMgYWZ0ZXIgMSBzZWNvbmQsIGR1bXAgYSB3YXJuaW5nIGFuZAorICBpZ25vcmUgdGhlIHByb3h5IGZvciB0aGUgc2Vzc2lvbi4KKworLSBUaGUgY29uc29sZSdzICJnZW8gZml4IiBjb21tYW5kIHdhcyBtb2RpZmllZDoKKworICAtIGEgY29tcHV0YXRpb25hbCBidWcgc2VudCB0aGUgd3JvbmcgbGF0aXR1ZGUvbG9uZ2l0dWRlIHRvIHRoZSBlbXVsYXRlZAorICAgIHN5c3RlbSwgcmVzdWx0aW5nIGluIGNvb3JkaW5hdGVzIHRoYXQgY291bGQgYmUgb2ZmIGZyb20gNTAwIHRvIDEwMDAgbWV0ZXJzLgorCisgIC0gZml4ZWQgYW5vdGhlciBidWcgdGhhdCBkaWRuJ3QgcmVwb3J0IHRoZSBhbHRpdHVkZSBjb3JyZWN0bHkuCisKKyAgLSBhZGRlZCBhIGZvdXJ0aCwgb3B0aW9uYWwsIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHRyYWNrZWQKKyAgICBzYXRlbGxpdGVzIHRvIGVtdWxhdGUuIFRoZSBudW1iZXIgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTIsCisgICAgKDEgaXMgdGhlIGRlZmF1bHQpLgorCisgIC0gZml4ZWQgYSBidWcgaW4gcGFyYW1ldGVyIGhhbmRsaW5nOiB0aGUgaW1wbGVtZW50YXRpb24gZGlzYWdyZWVkIHdpdGggdGhlCisgICAgZG9jdW1lbnRhdGlvbiwgcmVxdWlyaW5nIGFuIGFkZGl0aW9uYWwgZHVtbXkgZm91cnRoIGFyZ3VtZW50LiBOb3cgZm91ciBvcgorICAgIGZpdmUgcGFyYW1ldGVycyBhcmUgYWNjZXB0ZWQgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSksIGJ1dCB0aGUgbGFzdCBpcworICAgIGFsd2F5cyB0aGUgc2F0ZWxsaXRlIGNvdW50LgorCisgLSBBZGQgYSBQdWxzZUF1ZGlvIGF1ZGlvIGJhY2tlbmQgb24gTGludXguIEl0IHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0CisgICB1bmxlc3MgaXQncyBpbXBvc3NpYmxlIHRvIGNvbm5lY3QgdG8gdGhlIFBBIGRhZW1vbi4KKworIC0gSXQgaXMgbm93IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgUUVNVSBtb25pdG9yIGZyb20gdGhlIGNvbnNvbGUuCisgICBKdXN0IHR5cGUgInFlbXUgbW9uaXRvciIgYW5kIHlvdSB3aWxsIGJlIGF0IHRoZSBtb25pdG9yIHByb21wdC4KKworICAgTm90ZSB0aGF0IHRoZSBtb25pdG9yICdxdWl0JyBjb21tYW5kIHdpbGwgbm90IHN0b3AgdGhlIGVtdWxhdG9yLAorICAgYnV0IHdpbGwgc2ltcGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGluc3RlYWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDcuMCBhbmQgNi4wCisKK0lNUE9SVEFOVCBDSEFOR0VTOgorCitPVEhFUjoKKworLSBSZW1vdmVkIGF1ZGlvIHN0YWNrIFNETCBkZXBlbmRlbmN5LgorCistIEFkZCBhICctc2hhcmVkLW5ldC1pZCcgb3B0aW9uIHdoaWNoIGFsbG93cyBlbXVsYXRvcnMgdG8gam9pbiBhIHNoYXJlZCBuZXR3b3JrLgorICBUaGlzIGFsbG93cyB0ZXN0aW5nIHNpdHVhdGlvbnMgd2hlcmUgZW11bGF0b3JzIG5lZWQgdG8gY29tbXVuaWNhdGUgZGlyZWN0bHkKKyAgd2l0aCBlYWNoIG90aGVyLiBTZWUgJy1oZWxwLXNoYXJlZC1uZXQtaWQnIGZvciBtb3JlIGRldGFpbHMuCisKKy0gRml4IG5ldCBzaGFwaW5nIHJlZ3Jlc3Npb246IC1uZXRzcGVlZCBhbmQgLW5ldGRlbGF5IGRpZCBub3Qgd29yayBhbnltb3JlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NoYW5nZXMgYmV0d2VlbiA2LjAgYW5kIDUuMAorCitJTVBPUlRBTlQgQ0hBTkdFUzoKKworLSBBZGQgYSAnLW1lbWNoZWNrJyBvcHRpb24gdG8gaW5zdHJ1bWVudCBtZW1vcnkgcmVhZHMvd3JpdGVzIGF0IHJ1bnRpbWUgaW4KKyAgb3JkZXIgdG8gZGV0ZWN0IGJ1ZmZlciB1bmRlci9vdmVyZmxvd3MuIFRoaXMgcmVxdWlyZXMgYSBuZXcgdmVyc2lvbiBvZiB0aGUKKyAgQyBsaWJyYXJ5IHRoYXQgaXMgb25seSBhdmFpbGFibGUgaW4gRnJveW8gYW5kIGFib3ZlLgorCistIEZpeCAnLWh0dHAtcHJveHknIG9uIFdpbjMyLiBUaGlzIHdhcyBhY3R1YWxseSBhIHJlZ3Jlc3Npb24gaW50cm9kdWNlZAorICB3aXRoIHRoZSBEb251dCBTREsuCisKK09USEVSOgorCistIEFkZCBhICctLXN0YXRpYycgb3B0aW9uIHRvIGJvdGggYW5kcm9pZC9jb25maWd1cmUuc2ggYW5kIGFuZHJvaWQvcmVidWlsZC5zaAorICBpbiBvcmRlciB0byBidWlsZCBhIGNvbXBsZXRlbHkgc3RhdGljIGV4ZWN1dGFibGUuIFRoaXMgaXMgcmVxdWlyZWQgdG8gcnVuCisgIHRoZSBlbXVsYXRvciBpbiByZXN0cmljdGVkIGVudmlyb25tZW50cy4gTm8gYXVkaW8gYW5kIGdyYXBoaWNzIGluIHRoaXMgbW9kZQorICBzbyB1c2luZyAnLW5vLXdpbmRvdycgaXMgcmVxdWlyZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDUuMCBhbmQgMS4xMworCitJTVBPUlRBTlQgQ0hBTkdFUzoKKworLSBTdGFydGluZyBmcm9tIHRoaXMgcmVsZWFzZSwgdGhlIGVtdWxhdG9yJ3MgdmVyc2lvbiBudW1iZXIgd2lsbCBtYXRjaCB0aGUKKyAgY29ycmVzcG9uZGluZyBBbmRyb2lkIFNESyBUb29scyBwYWNrYWdlIHJldmlzaW9uIG51bWJlci4gVGhlIGV4YWN0IG51bWJlcgorICBpcyBleHRyYWN0ZWQgYXQgYnVpbGQgdGltZSBmcm9tIHRoZSBBbmRyb2lkIHNvdXJjZSB0cmVlLgorCisgIFRoZSBtaW5vciBudW1iZXIgd2lsbCBub3cgYmUgc3R1Y2sgdG8gMCBzaW5jZSBlYWNoIG9mZmljaWFsIGVtdWxhdG9yCisgIHJlbGVhc2UgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggYSBjb3JyZXNwb25kaW5nIFNESyBUb29scyByZWxlYXNlLgorCisKK09USEVSOgorCistIEZpeGVkIGEgYnVnIHRoYXQgY3Jhc2hlZCB0aGUgZW11bGF0b3Igd2hlbiB0aGUgU0QgQ2FyZCBpbWFnZSBzaXplIHdhcyBleGFjdGx5CisgIDggTUIuIE5vdywgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHNpemUgaXMgOSBNQiwgYW5kIHRoZSBlbXVsYXRvciB3aWxsIGNvbXBsYWluCisgIHdpdGggYSBodW1hbi1mcmllbmRseSBtZXNzYWdlIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBhbmQgaWdub3JlIHRoZSBTRCBDYXJkCisgIGZpbGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDEuMTMgYW5kIDEuMTIKKworSU1QT1JUQU5UIEJVRyBGSVhFUzoKKworLSBGaXggRC1QYWQgcm90YXRpb24gaXNzdWVzIGluIHRoZSBza2lucy4gVGhlIHByb2JsZW0gYmVpbmcgdGhhdCBzd2l0Y2hpbmcKKyAgdGhlIGVtdWxhdG9yIHdpbmRvdyB0byBsYW5kc2NhcGUgbW9kZSByZXN1bHRlZCBpbiBpbmNvcnJlY3RseSByb3RhdGVkCisgIEQtUGFkIGV2ZW50cy4gVGhlIGZpeCBhbGxvd3MgZm9yIGEgbmV3ICdkcGFkLXJvdGF0aW9uJyBmaWVsZCBmb3IgZWFjaAorICBsYXlvdXQuCisKKy0gRml4ZWQgYSBidWcgaW4gVGh1bWIyIGVtdWxhdGlvbiAobm90IHVzZWQgYnkgdHlwaWNhbCBTREsgaW1hZ2VzIHlldCB0aG91Z2gpCisgIHRoYXQgcmVzdWx0ZWQgaW5jb3JyZWN0IGJlaGF2aW91ciAvIGNyYXNoZXMsIGVzcGVjaWFsbHkgaW4gc2luZ2xlLXN0ZXBwaW5nCisgIG1vZGUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDEuMTIgYW5kIDEuMTEKKworSU1QT1JUQU5UIEJVRyBGSVhFUzoKKworLSBGaXhlZCBhIG5hc3R5IHJhY2UgY29uZGl0aW9uIGluIHRoZSBMaW51eCBFc291bkQgYXVkaW8gYmFja2VuZCB3aGljaCByZXN1bHRlZAorICBpbiByYXJlIGxvY2t1cHMgd2hlbiBzdG9wcGluZyB0aGUgZW11bGF0b3Igb24gdGhpcyBwbGF0Zm9ybS4KKworLSBUaGUga2V5LWJpbmRpbmdzIGZvciB0aGUgTWVudSBidXR0b24gKEYyIGFuZCBQYWdlVXAgYnkgZGVmYXVsdCkgZGlkbid0IHdvcmsKKyAgZHVlIHRvIGEgdHlwby4KKworT1RIRVI6CisKKy0gU291cmNlcyBoYXZlIGJlZW4gcmVmcmVzaGVkIGJ5IGEgbGFyZ2UgaW50ZWdyYXRpb24gb2YgdXBzdHJlYW0gUUVNVQorICBzb3VyY2VzICh2ZXJzaW9uIDAuMTAuNTApLiBUaGUgaW50ZWdyYXRpb24gaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjb21taXQsCisgIGRhdGVkIDIwMDktMDYtMTk6CisKKyAgICAgICAgIGQyZTlmZDhmNzAzMjAzYzJlZWVlZDEyMGIxZWY2YzNhNjU3NGUwYWIKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDaGFuZ2VzIGJldHdlZW4gMS4xMSBhbmQgMS4xMAorCitJTVBPUlRBTlQgQlVHIEZJWEVTOgorCistIEZpeGVkIEFORFJPSURfU0RLX0hPTUUgYmVpbmcgaWdub3JlZCBvbiBVbml4IChub3QgV2luZG93cykuIFRoaXMgZW52aXJvbm1lbnQKKyAgdmFyaWFibGUgaXMgdXNlZCB0byBsb2NhdGUgYSB1c2VyJ3MgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgdGhlIFNESywgd2l0aCBhCisgIGRlZmF1bHQgdmFsdWUgb2Ygfi8uYW5kcm9pZAorCitPVEhFUjoKKworLSBBZGQgIktFWV9YWFgiIG5hbWUgYWxpYXMgZm9yIEVWX0tFWSBjb2Rlcy4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb25zb2xlCisgIGNvbW1hbmQgImV2ZW50IGNvZGVzIEVWX0tFWSIgd2lsbCBub3cgcmV0dXJuIEtFWV9YWFggY29kZSBuYW1lcyAoaW4gYWRkaXRpb24KKyAgdG8gQlROX1lZWSBvbmVzKSwgYW5kIHRoYXQgeW91IGNhbiB1c2UgImV2ZW50IHNlbmQgRVZfS0VZOktFWV9TT0ZUMToxIgorICBpbnN0ZWFkIG9mICJldmVudCBzZW5kIEVWX0tFWToyMjk6MSIgdG8gc2ltdWxhdGUgdGhlIHByZXNzIG9mIHRoZSBNZW51CisgIGJ1dHRvbi4KKworICBUaGUgS0VZX1hYWCB2YWx1ZXMgYXJlIGRlZmluZWQgYnkgTGludXguIFRoZSBmb2xsb3dpbmcgQW5kcm9pZC1zcGVjaWZpYworICBtYXBwaW5ncyBhcHBseToKKworICAgICBLRVlfSE9NRSAgID0+IEhvbWUga2V5CisgICAgIEtFWV9CQUNLICAgPT4gQmFjayBrZXkKKyAgICAgS0VZX1NFTkQgICA9PiBDYWxsIGtleSAoZS5nLiBHcmVlbiBQaG9uZSkKKyAgICAgS0VZX0VORCAgICA9PiBFbmRDYWxsIGtleSAoZS5nLiBSZWQgUGhvbmUpCisgICAgIEtFWV9TT0ZUMSAgPT4gTWVudSBrZXkKKworICAgICBLRVlfVk9MVU1FX1VQCisgICAgIEtFWV9WT0xVTUVfRE9XTgorCisgICAgIEtFWV9TRUFSQ0ggPT4gU2VhcmNoIGtleSAoaWYgYW55KQorICAgICBLRVlfUE9XRVIgID0+IFBvd2VyIGJ1dHRvbgorICAgICBLRVlfQ0FNRVJBID0+IENhbWVyYSBidXR0b24KKworICAgICBLRVlfRE9XTiAvIFVQIC8gTEVGVCAvIFJJR0hUID0+IERQYWQga2V5cworICAgICBLRVlfQ0VOVEVSICAgICAgICAgICAgICAgICAgID0+IERQYWQgLyB0cmFja2JhbGwgY2xpY2sKKworICBCZXdhcmU6IEtFWV9NRU5VIGRvZXMgKm5vdCogY29ycmVzcG9uZCB0byB0aGUgIk1lbnUiIGtleSBvZiBtb3N0IEFuZHJvaWQKKyAgICAgICAgICBkZXZpY2VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NoYW5nZXMgYmV0d2VlbiAxLjEwIGFuZCAxLjkKKworSU1QT1JUQU5UIEJVRyBGSVhFUzoKKworLSBGaXhlZCBzb2NrX2FkZHJlc3NfaW5pdF9yZXNvbHZlKCkgaW4gc29ja2V0cy5jIHRvIHdvcmsgcHJvcGVybHkgb24KKyAgSVB2NiBjYXBhYmxlIHN5c3RlbXMsIHdoZW4gdGhlIGxpc3QgcmV0dXJuZWQgYnkgZ2V0YWRkcmluZm8oKSBkb2Vzbid0CisgIG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHNpbXBsaXN0aWMgaGV1cmlzdGljcyB0aGF0IHdlcmUgdXNlZCBieSB0aGUKKyAgcHJldmlvdXMgaW1wbGVtZW50YXRpb24uIE9uIHN1Y2ggc3lzdGVtcywgaW50ZXItZW11bGF0b3IgdGVsZXBob255CisgIGFuZCBTTVMgZGlkbid0IHdvcmsgcHJvcGVybHksIGFzIHdlbGwgYXMgY2VydGFpbiBvdGhlciBuZXR3b3JrLXJlbGF0ZWQKKyAgdGFza3MuCisKK0lNUE9SVEFOVCBDSEFOR0VTOgorCistIFNraW5zIGNhbiBub3cgcHJvdmlkZSBhIGJ1dHRvbiBmb3IgdGhlICJTRUFSQ0giIHNjYW4tY29kZSwgc2ltcGx5IHVzaW5nCisgIHRoZSAic2VhcmNoIiBsYWJlbCBmb3IgaXQuCisKKy0gQSBuZXcgb3B0aW9uICctcHJvcCA8bmFtZT49PHZhbHVlPicgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc3lzdGVtIHByb3BlcnR5CisgIGF0IGJvb3QgdGltZSBpbiB0aGUgZW11bGF0ZWQgc3lzdGVtLiBUaGlzIG9ubHkgd29ya3MgZm9yIHN5c3RlbSBpbWFnZXMKKyAgc3RhcnRpbmcgYXQgMS41X3IzLCBhbmQgd2lsbCBiZSBpZ25vcmVkIGZvciBvbGRlciBvbmVzLgorCisgIE5vdGUgdGhhdCBwcm9wZXJ0aWVzIHN0YXJ0aW5nIHdpdGggInJvLiIgY2FuIG9ubHkgYmUgc2V0IG9uY2UuIE1vcmVvdmVyLAorICBhbGwgc3lzdGVtIHByb3BlcnRpZXMgaW4gdGhlIHN5c3RlbSBidWlsZC5wcm9wIG9yIGxvY2FsLnByb3AgYXJlIHBhcnNlZAorICBieSBpbml0IGJlZm9yZSBhbnl0aGluZyBlbHNlLiBBbnkgInJvLiIgcHJvcGVydHkgaW4gdGhlbSBjYW5ub3QgYmUKKyAgY2hhbmdlZCB3aXRoIHRoaXMgb3B0aW9uLgorCistIEFsbG93IHRoZSBIVFRQIHByb3h5IGltcGxlbWVudGF0aW9uIHRvIHJlY2VpdmUgY2h1bmtlZCBlbmNvZGluZyBkYXRhLgorICBUaGlzIHNoYWxsIHNvbHZlIHByb2JsZW1zIHdoZW4gdGFsa2luZyB0byBNaWNyb3NvZnQgcHJveGllcy4KKworT1RIRVI6CisKKy0gQWxsb3cgdGhlIFNFQVJDSCBrZXktYmluZGluZyAoRjUpIHRvIHdvcmsgb24ga2V5Ym9hcmQtbGVzcyBoYXJkd2FyZQorICBjb25maWd1cmF0aW9ucyAoQVZEcykuCisKKy0gRml4ZWQgYSB0eXBvIHdoaWNoIHByZXZlbnRlZCB0aGUga2VybmVsIGdkYnN0dWIgZnJvbSB3b3JraW5nIHByb3Blcmx5CisKKy0gRml4ZWQgYmFkIFFBREQvUURBREQvUVNVQi9RRFNVQiBlbXVsYXRpb24gaW4gdGhlIEFSTSBKSVQuCisKKy0gRml4ZWQgb25lIG1pbm9yIGNyYXNoIHdoZW4gdGhlIExpbnV4IE9TUyBhdWRpbyBiYWNrZW5kIHdhcyB1c2VkIHdpdGggdGhlCisgIC1kZWJ1Zy1hdWRpbyBvcHRpb24uCisKKy0gRml4ZWQgZW11bGF0b3IgdHJhY2luZyBidWcgKGJhc2ljIGJsb2NrIGFkZHJlc3MgY291bGQgYmUgd3JvbmcpLiBBbmQgYWRkCisgIHN1cHBvcnQgZm9yIHJlY29yZGluZyBuYXRpdmUgKEpOSSkgY2FsbHMgd2hlbiBwcm9maWxpbmcuCisKKy0gRml4ZWQgYnVpbGQgZm9yIHBsYXRmb3JtcyB3aGVyZSBkZXByZWNhdGVkIHN5bWJvbCBFQUlfTk9EQVRBIGlzIG5vdAorICBkZWZpbmVkLgorCistIEZpeCBHUFMgZW11bGF0aW9uIHRvIGFsbG93IHNldmVyYWwgY2xpZW50cyBjb25jdXJyZW50bHkuIFRoZXJlIGFyZSBzdGlsbAorICBwcm9ibGVtcyB0aGF0IG1heSBiZSBkdWUgdG8gY2hhbmdlcyBpbiB0aGUgc3lzdGVtJ3MgZnJhbWV3b3JrLgorCistIEFkZGVkIHNvbWUgdGVjaG5pY2FsIGRvY3VtZW50YXRpb24gaW4gdGhlIGRvY3MvIGRpcmVjdG9yeS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDaGFuZ2VzIGJldHdlZW4gMS45IGFuZCAxLjgKKworSU1QT1JUQU5UIENIQU5HRVM6CisKKy0gTWFueSBmZWF0dXJlcyBoYXZlIGJlZW4gaW50ZWdyYXRlZCBmcm9tIHVwc3RyZWFtIFFFTVUgc291cmNlcywgaW5jbHVkaW5nCisgIHRoZSBuZXcgVENHIGNvZGUgZ2VuZXJhdG9yIHVzZWQgYnkgdGhlIEFSTSB0cmFuc2xhdG9yLiBUaGlzIHNob3VsZCByZXN1bHQKKyAgaW4gc2xpZ2h0bHkgZmFzdGVyIGV4ZWN1dGlvbiBzcGVlZCBvbiBhbGwgc3VwcG9ydGVkIHBsYXRmb3Jtcy4gQW5vdGhlcgorICBiZW5lZml0IGlzIHRoYXQgeW91IG5vIGxvbmdlciByZXF1aXJlIGEgc3BlY2lmaWMgKGFuZCBvYnNvbGV0ZSkgdmVyc2lvbgorICBvZiBHQ0MgdG8gYnVpbGQgdGhlIGVtdWxhdG9yLgorCistIFRoZSBlbXVsYXRvciBub3cgcmVxdWlyZXMgdGhhdCB5b3Ugc3BlY2lmeSBhIHZpcnR1YWwgZGV2aWNlIG5hbWUgd2hlbgorICBzdGFydGluZyB0aGUgZW11bGF0b3IsIHByZWZpeGVkIHdpdGggdGhlICdAJyBzaWduLiBGb3IgZXhhbXBsZSwgdG8gc3RhcnQKKyAgdGhlICdmb28nIHZpcnR1YWwgZGV2aWNlLCB0eXBlOgorCisgICAgICBlbXVsYXRvciBAZm9vCisKKyAgRWFjaCBBVkQgKEFuZHJvaWQgVmlydHVhbCBEZXZpY2UpIGNvcnJlc3BvbmRzIHRvIGEgZGlyZWN0b3J5IHVzZWQgdG8gc3RvcmUKKyAgbXV0YWJsZSBkaXNrIGltYWdlcywgYW4gb3B0aW9uYWwgc3lzdGVtIGltYWdlL2tlcm5lbC9zZGNhcmQsIHBsdXMgc29tZQorICBjb25maWd1cmF0aW9uIGZpbGUocykuCisKKyAgVGhlIGNvbW1hbmQtbGluZSB0b29sICdhbmRyb2lkJyB0aGF0IGNvbWVzIHdpdGggdGhlIFNESyBjYW4gYmUgdXNlZCB0bworICBjcmVhdGUvbGlzdC9yZW1vdmUgdmlydHVhbCBkZXZpY2VzIG9uIHlvdXIgc3lzdGVtLgorCisgIE5vdGUgdGhhdCB0aGUgJ0A8bmFtZT4nIGZvcm0gaXMgYSBjb252ZW5pZW5jZSBzaG9ydGN1dCBmb3IgJy1hdmQgPG5hbWU+Jy4KKyAgSXQgaXMgdGh1cyBwb3NzaWJsZSB0byBwbGFjZSBvcHRpb25zIGFmdGVyIHRoZSBBVkQgbmFtZSBvbiB5b3VyIGNvbW1hbmQKKyAgbGluZSwgYXMgaW46CisKKyAgICAgIGVtdWxhdG9yIEBmb28gLXZlcmJvc2UgLXNoZWxsCisKKyAgRmluYWxseSwgd2hlbiBidWlsZGluZyB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBzb3VyY2UgdHJlZSwgYW4gQVZEIG5hbWUgaXMgbm90CisgIHJlcXVpcmVkIGFuZCAnZW11bGF0b3InIHdpbGwgc3RhcnQgYSBuZXcgZW11bGF0b3IgaW5zdGFuY2UgZXhhY3RseSBhcworICBwcmV2aW91c2x5LgorCistIEEgbmV3IG9wdGlvbiAnLXN5c2RpciA8ZGlyPicgaGFzIGJlZW4gaW50cm9kdWNlZCwgdGhlIGludGVycHJldGF0aW9uIG9mCisgIHRoZSAnLXN5c3RlbScgb3B0aW9uIGhhcyBjaGFuZ2VkLCBhbmQgJy1pbWFnZSA8ZmlsZT4nIHNob3VsZCBub3cgYmUKKyAgY29uc2lkZXJlZCBvYnNvbGV0ZS4gSW4gbW9yZSBkZXRhaWxzOgorCisgICogeW91IHNob3VsZCBub3cgdXNlICctc3lzZGlyIDxkaXI+JyBpbnN0ZWFkIG9mICctc3lzdGVtIDxkaXI+JyB0byBzcGVjaWZ5CisgICAgdGhlIGRpcmVjdG9yeSB3aGVyZSBzeXN0ZW0gaW1hZ2VzIHdpbGwgYmUgc2VhcmNoZWQgYnkgdGhlIGVtdWxhdG9yCisgICAgb24gc3RhcnR1cC4KKworICAqIHlvdSBzaG91bGQgbm93IHVzZSAnLXN5c3RlbSA8ZmlsZT4nIHRvIGluZGljYXRlIHdoaWNoIHN5c3RlbS5pbWcgcGFydGl0aW9uCisgICAgaW1hZ2UgdG8gdXNlIGF0IHN0YXJ0dXAuCisKKyAgKiB5b3Ugc2hvdWxkIG5vdCB1c2UgJy1zeXN0ZW0gPGRpcj4nIG9yICctaW1hZ2UgPHBhdGg+JyBhbnltb3JlLiBIb3dldmVyLAorICAgIHRoZXNlIG9wdGlvbnMgYXJlIHN0aWxsIHN1cHBvcnRlZCBidXQgd2lsbCBwcmludCBhIHdhcm5pbmcgdG8gcmVtaW5kIHlvdQorICAgIHRvIGNoYW5nZSB5b3VyIHNjcmlwdHMvaGFiaXRzLgorCisgIFRoZSBjaGFuZ2Ugd2FzIGRvbmUgdG8gcmVkdWNlIGNvbmZ1c2lvbiBhcyB0byB3aGF0IHRoZXNlIG9wdGlvbnMgcHJvdmlkZS4KKworLSBPcHRpb25zICctbm9hdWRpbycsICctbm9qbmknLCAnLW5vc2tpbicgYW5kICdub2NhY2hlJyBhcmUgZGVwcmVjYXRlZC4KKyAgWW91IHNob3VsZCB1c2UgJy1uby1hdWRpbycsICctbm8tam5pJywgJy1uby1za2luJyBhbmQgJy1uby1jYWNoZScgaW5zdGVhZC4KKworLSBPcHRpb24gJ2luaXRkYXRhJyBpcyBkZXByZWNhdGVkLCB5b3Ugc2hvdWxkIHVzZSAnLWluaXQtZGF0YScgaW5zdGVhZC4KKworLSBIYXJkd2FyZSBlbXVsYXRpb24gaXMgbm93IGxpbWl0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQW5kcm9pZCBWaXJ0dWFsCisgIERldmljZSdzIGNvbmZpZ3VyYXRpb24uIFRoaXMgbWVhbnMgaXQgaXMgbm93IHBvc3NpYmxlIHRvIG5vdCBlbXVsYXRlCisgIGEgdG91Y2gtc2NyZWVuLCB0cmFja2JhbGwsIGRwYWQsIGtleWJvYXJkLCBtb2RlbSwgZXRjLi4uCisKKyAgTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSwgYWxsIGhhcmR3YXJlIHByb3BlcnRpZXMKKyAgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhpcyBvbmx5IGFmZmVjdHMgIm5vcm1hbCIgdmlydHVhbCBkZXZpY2VzCisgIGNyZWF0ZWQgd2l0aCB0aGUgJ2FuZHJvaWQnIHRvb2wuCisKKy0gVGhlIGVtdWxhdG9yIG5vdyBzdXBwb3J0cyBjYXB0dXJpbmcgbmV0d29yayBwYWNrZXRzIHRvIGEgZmlsZS4KKyAgWW91IGNhbiBlaXRoZXIgdXNlIHRoZSBuZXcgLXRjcGR1bXAgPGZpbGU+IGNvbW1hbmQtbGluZSBvcHRpb24sIG9yIHVzZQorICB0aGUgbmV3IGNvbnNvbGUgJ25ldHdvcmsgY2FwdHVyZSBzdGFydCA8ZmlsZT4nIGNvbW1hbmQgKHRoZW4gdXNlCisgICduZXR3b3JrIGNhcHR1cmUgc3RvcCcgdG8gc3RvcCBpdCkuCisKKyAgVGhpcyBjYXB0dXJlcyBhbGwgZXRoZXJuZXQgcGFja2V0cyBvbiB0aGUgdmlydHVhbCBMQU4sIHNvIHRoaXMgaW5jbHVkZXMKKyAgQVJQLCBVRFAsIFRDUCwgZXRjLi4uIFRoZSBmaWxlIGlzIGluIGxpYnBjYXAgZm9ybWF0IGFuZCBjYW4gYmUgb3BlbmVkIHdpdGgKKyAgZXh0ZXJuYWwgdG9vbHMgbGlrZSBXaXJlU2hhcmsgZm9yIGFuYWx5c2lzLgorCitPVEhFUjoKKworLSBUaGUgZmlsZSBpbiB+Ly5hbmRyb2lkL2RlZmF1bHQua2V5c2V0IHdhcyBpZ25vcmVkLCB1bmxlc3MgeW91IHVzZWQKKyAgJy1rZXlzZXQgZGVmYXVsdCcgZXhwbGljaXRlbHkuIEl0IGlzIG5vdyBsb2FkZWQgYXV0b21hdGljYWxseSB3aGVuCisgIGF2YWlsYWJsZS4KKworLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBBTkRST0lEX1NES19ST09UIGNhbiBiZSB1c2VkIHRvIHNwZWNpZml5IHRoZSBsb2NhdGlvbgorICBvZiB0aGUgU0RLIGluc3RhbGxhdGlvbiBwYXRoLgorCistIEVudmlyb25tZW50IHZhcmlhYmxlIEFORFJPSURfU0RLX0hPTUUgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24KKyAgb2YgdGhlICcuYW5kcm9pZCcgZGF0YSBkaXJlY3RvcnkgKHdoaWNoIGRlZmF1bHRzIHRvIHlvdXIgJEhPTUUpLgorCistIEEgbmV3IGNvbnNvbGUgY29tbWFuZCAnYXZkIG5hbWUnIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBuYW1lIG9mIHRoZQorICB2aXJ0dWFsIGRldmljZSBydW5uaW5nIGluIHRoZSBlbXVsYXRvci4gTm90ZSB0aGF0IGl0IHdpbGwgYmUgJzxidWlsZD4nCisgIGlmIHlvdSBydW4gZnJvbSB0aGUgQW5kcm9pZCBidWlsZCBzeXN0ZW0uCisKKyAgQWxzbywgdGhlIGVtdWxhdG9yJ3Mgd2luZG93IHRpdGxlIGFsc28gZGlzcGxheXMgdGhlIEFWRCBuYW1lIG5vdy4KKworLSBUaGUgb3B0aW9uICctbWVtb3J5IDxzaXplPicgaGFzIGJlZW4gYWRkZWQuIDxtZW1vcnk+IG11c3QgYmUgYW4gaW50ZWdlcgorICBzcGVjaWZ5aW5nIHRoZSBhbW91bnQgb2YgcGh5c2ljYWwgUkFNIGluIHRoZSBlbXVsYXRlZCBkZXZpY2UgaW4gbWVnYWJ5dGVzLgorICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA5Ni4KKworLSBUaGUgJy1za2luZGlyIDxwYXRoPicgb3B0aW9uIG5vdyByZXF1aXJlcyB0aGF0IHlvdSBzcGVjaWZ5IGEgJy1za2luIDxuYW1lPicKKyAgb3B0aW9uIGFzIHdlbGwuCisKKy0gQmV0dGVyIGhhbmRsaW5nIG9mIEF1ZGlvIG9uIExpbnV4IGZvciB0aGUgRXNvdW5EIGFuZCBBbHNhIGJhY2tlbmRzCisKKy0gRnVsbHNjcmVlbiB0b2dnbGUgc2hvdWxkIG5vdyB3b3JrIG9uIFdpbmRvd3MgYW5kIE9TIFguIE9uIExpbnV4LCB0aGUKKyAgdG9nZ2xlIHdpbGwgbm90IHN3aXRjaCB0aGUgZGlzcGxheSByZXNvbHV0aW9uIGFueW1vcmUgKHdoaWNoIHJlc3VsdGVkCisgIGluIGRpc3RvcnRlZCBpbWFnZXMpLgorCistIFVzaW5nICctbm8tYXVkaW8nIG5vIGxvbmdlciBkaXNhYmxlcyBzb3VuZCBoYXJkd2FyZSBlbXVsYXRpb24uIEl0IHNpbXBseQorICBtdXRlcyB0aGUgZW11bGF0b3IgcHJvZ3JhbSBvbiB0aGUgaG9zdC4KKworLSBUaGUgd2luZG93IHRpdGxlIGJhciBjaGFuZ2VzIHdoZW4geW91IHRvZ2dsZSBwZXJzaXN0ZW50IHRyYWNrYmFsbCBtb2RlCisgIChGNiBieSBkZWZhdWx0KS4gSXQgd2lsbCBkaXNwbGF5IHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAiUHJlc3MgRjYgdG8gZXhpdCB0cmFja2JhbGwgbW9kZSAuLi4iCisKKyAgVGhlIGFjdHVhbCB0ZXh0IGRlcGVuZHMgb24geW91ciBrZXkgYmluZGluZyBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHRvIGhlbHAKKyAgcGVvcGxlIHRvZ2dsZSB0aGUgbW9kZSBieSBhY2NpZGVudC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDaGFuZ2VzIGJldHdlZW4gMS43IGFuZCAxLjYKKworSU1QT1JUQU5UIEJVRyBGSVhFUzoKKworLSBQcm9wZXJseSBjcmVhdGUgfi8uYW5kcm9pZCBkaXJlY3Rvcnkgd2hlbiBuZWVkZWQuCisKKy0gRG8gbm90IGxlYXZlIHRlbXBvcmFyeSBmaWxlcyBpbiBBbmRyb2lkIGFwcC1zcGVjaWZpYyBkaXJlY3Rvcnkgb24gV2luMzIKKworLSBTdXBwb3J0IGZvciBIVFRQL0hUVFBTIHByb3hpZXMgaGFzIGJlZW4gY29uc2lkZXJhYmx5IGltcHJvdmVkIGFuZCBzaG91bGQgbm93CisgICJqdXN0IHdvcmsiIHdpdGggYSBsb3QgbW9yZSBIVFRQIHByb3hpZXMuIEluIGNhc2Ugb2YgcHJvYmxlbSwgdXNlIHRoZQorICAtZGVidWctcHJveHkgb3B0aW9uIHRvIGR1bXAgZGVidWdnaW5nIGRhdGEgdG8gc3RkZXJyLgorCitPVEhFUjoKKworLSBUcmFja2JhbGwgZW11bGF0aW9uIGhhcyBjaGFuZ2VkLiBGaXJzdCwgdGhlIGF3a3dhcmQgIkNvbnRyb2wtVCIga2V5YmluZGluZworICBpcyBnb25lLiBJbnN0ZWFkLCB5b3UgY2FuIG5vdzoKKworICAgICAtIHByZXNzICdEZWxldGUnIHRvIHNob3cgdGhlIHRyYWNrYmFsbCBhbmQgaGF2ZSBpdCBkaXNhcHBlYXIgYXMgc29vbgorICAgICAgIGFzIHlvdXIgcmVsZWFzZSB0aGUga2V5LgorCisgICAgIC0gcHJlc3MgJ0Y2JyB0byBwZXJmb3JtIGEgcGVyc2lzdGVudCB0cmFja2JhbGwgbW9kZSB0b2dnbGUuCisKKyAgQWxzbywgdHJhY2tiYWxsIGVtdWxhdGlvbiBpcyBmaXhlZCBpbiByb3RhdGVkL2xhbmRzY2FwZSBtb2RlIG5vdy4KKworLSBOZXcgb3B0aW9uICctbmFuZC1saW1pdHMgPGxpbWl0cz4nIGFsbG93cyB5b3UgdG8gc2VuZCBhIHNpZ25hbCB0byBhIHJlbW90ZQorICBwcm9jZXNzIHdoZW4gYSByZWFkIG9yIHdyaXRlIHRocmVzaG9sZCBvbiBmbGFzaCBzdG9yYWdlIGlzIHJlYWNoZWQuIFRoaXMgaXMKKyAgb25seSB1c2VmdWwgZm9yIGhhcmRjb3JlIEFuZHJvaWQgc3lzdGVtIGhhY2tlcnMuCisKKy0gRml4IGVtdWxhdG9yIGJ1aWxkIG9uIHJlY2VudCBDeWd3aW4gcmVsZWFzZXMgKHRoZSAtbW5vLWN5Z3dpbiBoZWFkZXJzIGRvIG5vdAorICB0b2xlcmF0ZSB0aGUgX0dOVV9TT1VSQ0UgbWFjcm8gZGVmaW5pdGlvbiBhbnltb3JlKQorCistIEZpeCBXaW4zMiBlbXVsYXRvciB0byBzdXBwb3J0IFNEIENhcmQgaW1hZ2VzIGxhcmdlciB0aGFuIDIgR2lCCisKKy0gVGhlIG5vbi1BbmRyb2lkIGJ1aWxkIHN5c3RlbSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbiB0byBhbGxvdyBidWlsZGluZworICB0aGUgZW11bGF0b3Igb24gTGludXggeDg2XzY0LiBBbHNvLCB0aGVyZSBpcyBub3cgYSBzaW5nbGUgTWFrZWZpbGUgdGhhdAorICBkcml2ZXMgdGhlIGJ1aWxkIGluIGJvdGggQW5kcm9pZCBhbmQgbm9uLUFuZHJvaWQgbW9kZXMuCisKKy0gJy1xZW11IDxvdGhlci1vcHRpb25zPicgd29ya3MgYWdhaW4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDaGFuZ2VzIGJldHdlZW4gMS42IGFuZCAxLjUKKworSU1QT1JUQU5UIENIQU5HRVM6CisKKy0gRW11bGF0b3Igbm93IHNhdmVzIHRoZSB1c2VyIGltYWdlIGluIDxhbmRyb2lkPi9TREsxLjAvCisKK09USEVSOgorCistIEdldCByaWQgb2YgRXNvdW5ELXJlbGF0ZWQgZnJlZXplcyBvbiBMaW51eCAoYWdhaW4pCisKKy0gRml4IHRoZSBkb2N1bWVudGF0aW9uIGluIC1oZWxwLWF1ZGlvLiAnLWF1ZGlvIGxpc3QnIGRvZXNuJ3Qgd29yaywgb25lCisgIG5lZWRzIHRvIGNhbGwgLWhlbHAtYXVkaW8tb3V0IGFuZCAtaGVscC1hdWRpby1pbiB0byBnZXQgdGhlIGxpc3Qgb2YgdmFsaWQKKyAgYXVkaW8gYmFja2VuZHMKKworLSBGaXggc2Nyb2xsd2hlZWwgRHBhZCBlbXVsYXRpb24gaW4gcm90YXRlZCBtb2RlLiBiZWZvcmUgdGhhdCwgdXNpbmcgdGhlCisgIHNjcm9sbC13aGVlbCB3b3VsZCBhbHdheXMgZ2VuZXJhdGVkIERwYWQgVXAvRG93biBldmVudHMsIGV2ZW4gd2hlbiBpbgorICBsYW5kc2NhcGUgbW9kZS4KKworLSBSZS1lbmFibGUgQ1BVIGZhdWx0IGVtdWxhdGlvbiBpbiBjYXNlIG9mIHVuYWxpZ25lZCBkYXRhIGFjY2Vzcy4gdGhpcyB3YXMKKyAgcHJldmlvdXNseSBkaXNhYmxlZCBiZWNhdXNlIGl0IGNyYXNoZWQgdGhlIGVtdWxhdGVkIGtlcm5lbCBpbiBwcmV2aW91cworICByZWxlYXNlcy4KKworLSBUaGUgZW11bGF0b3Igbm8gbG9uZ2VyIHByaW50cyBhbiBvYnNjdXJlIHdhcm5pbmcgd2hlbiBpdCBkb2Vzbid0IGZpbmQKKyAgdGhlIGVtdWxhdG9yLmNmZyBjb25maWd1cmF0aW9uIGZpbGUgaW4gfi8uYW5kcm9pZC4KKworICAnYnJva2VuIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2Vzbid0IGhhdmUgYSAnd2luZG93JyBlbGVtZW50JworCistIFJlbW92ZWQgYSBidW5jaCBvZiBvYnNvbGV0ZSBvcHRpb25zIChlLmcuIC1jb25zb2xlLCAtYWRiLXBvcnQsIGV0Yy4uLikKKworLSBTZXR0aW5nIHRoZSBuZXR3b3JrIHNwZWVkIHRocm91Z2ggdGhlIGNvbnNvbGUgb3IgdGhlIC1uZXRzcGVlZCBvcHRpb24gd2lsbAorICBwcm9wZXJseSBtb2RpZnkgdGhlIGNvbm5lY3Rpdml0eSBpY29uIG9uIHRoZSBkZXZpY2UuCisKKy0gU2V0dGluZyB0aGUgR1NNIHZvaWNlIHJlZ2lzdHJhdGlvbiBzdGF0ZSB0byAncm9hbWluZycgaW4gdGhlIGNvbnNvbGUgd2lsbAorICBwcm9wZXJseSBtb2RpZnkgdGhlIHZvaWNlIGljb24gb24gdGhlIGRldmljZQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0NoYW5nZXMgYmV0d2VlbiAxLjUgYW5kIDEuNAorCitJTVBPUlRBTlQgQlVHIEZJWEVTOgorCistIEZpeCBzcHVyaW91cyBkaXNjYXJkcyBvZiBTTVMgbWVzc2FnZXMgd2hlbiB1c2luZyB0d28gZW11bGF0b3JzLgorCitPVEhFUjoKKworLSBHZXQgcmlkIG9mIEVzb3VuRC1yZWxhdGVkIGZyZWV6ZXMgb24gTGludXggKGFnYWluKQorCistIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBpbiAtaGVscC1hdWRpby4gJy1hdWRpbyBsaXN0JyBkb2Vzbid0IHdvcms7IG9uZQorICBuZWVkcyB0byBjYWxsIC1oZWxwLWF1ZGlvLW91dCBhbmQgLWhlbHAtYXVkaW8taW4gdG8gZ2V0IHRoZSBsaXN0IG9mIHZhbGlkCisgIGF1ZGlvIGJhY2tlbmRzCisKKy0gRml4IHNjcm9sbHdoZWVsIERwYWQgZW11bGF0aW9uIGluIHJvdGF0ZWQgbW9kZS4gYmVmb3JlIHRoYXQsIHVzaW5nIHRoZQorICBzY3JvbGwtd2hlZWwgd291bGQgYWx3YXlzIGdlbmVyYXRlZCBEcGFkIFVwL0Rvd24gZXZlbnRzLCBldmVuIHdoZW4gaW4KKyAgbGFuZHNjYXBlIG1vZGUuCisKKy0gUmUtZW5hYmxlIENQVSBmYXVsdCBlbXVsYXRpb24gaW4gY2FzZSBvZiB1bmFsaWduZWQgZGF0YSBhY2Nlc3MuIFRoaXMgd2FzCisgIHByZXZpb3VzbHkgZGlzYWJsZWQgYmVjYXVzZSBpdCBjcmFzaGVkIHRoZSBlbXVsYXRlZCBrZXJuZWwgaW4gcHJldmlvdXMKKyAgcmVsZWFzZXMuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDEuNCBhbmQgMS4zCisKK0lNUE9SVEFOVCBCVUcgRklYRVM6CisKKy0gZml4IGZvciBhdWRpby1yZWxhdGVkIExpbnV4IHN0YXJ0dXAgZnJlZXplcyB3aGVuIHVzaW5nIHRoZSAnZXNkJyBhbmQgJ2Fsc2EnCisgIGJhY2tlbmRzCisKKy0gdGhlIG51bWJlciBvZiBhdWRpbyBidWZmZXJzIGluIHRoZSBXaW5kb3dzIGJhY2tlbmQgaGFzIGJlZW4gaW5jcmVtZW50ZWQuCisgIHRoaXMgZ2V0cyByaWQgb2YgYXVkaW8gY2hvcGluZXNzIGlzc3VlcyBvbiBWaXN0YSAoYW5kIHNvbWV0aW1lcyBvbiBYUCB0b28pCisKK05FVyBGRUFUVVJFUzoKKworTkVXIENPTlNPTEUgQ09NTUFORFM6CisKKy0gbmV3ICdnZW8gZml4IDxsb250aXR1ZGU+IDxsYXRpdHVkZT4gWzxhbHRpdHVkZT5dJyBjb21tYW5kIGFsbG93cyB5b3UgdG8KKyAgc2VuZCBhIHNpbXBsZSBHUFMgZml4IHRvIHRoZSBlbXVsYXRlZCBzeXN0ZW0sIHdpdGhvdXQgdGhlIGhlYWRhY2hlcyBvZgorICBOTUVBIDEwODMgZm9ybWF0dGluZy4KKworT1RIRVIgQlVHIEZJWEVTOgorCistIGZpeGVkIHRoZSAtYXVkaW8sIC1hdWRpby1pbiBhbmQgLWF1ZGlvLW91dCBvcHRpb25zICh0aGUgPGJhY2tlbmQ+IHZhbHVlcworICB3ZXJlIHNvbWV0aW1lcyBpZ25vcmVkKQorCitSRUdSRVNTSU9OUzoKKworT1RIRVI6CisKKy0gdGhlIHRyYW5zaXRpb25hbCAnLXFlbXVkJyBvcHRpb24gaW50cm9kdWNlZCBpbiAxLjMgaXMgbm93IGdvbmUuIGl0cworICBiZWhhdmlvdXIgaXMgbm93IHRoZSBkZWZhdWx0LgorCistIHVzZSB0aGUgbmV3ICctb2xkLXN5c3RlbScgb3B0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBhIDEuNCsgZW11bGF0b3IgYmluYXJ5CisgIHdpdGggb2xkZXIgc3lzdGVtIGltYWdlcy4gaWYgeW91IGRvbid0IHVzZSBpdCwgR1NNIGFuZCBHUFMgZW11bGF0aW9uIHdpbGwKKyAgbm90IHdvcmsgY29ycmVjdGx5IChhbW9uZyBvdGhlciB0aGluZ3MpLgorCistIHRoZSBvYnNvbGV0ZSAnLW9sZHJhZGlvJyBvcHRpb24gaXMgbm93IGdvbmUKKworLSBvbiBzb21lIFVuaXggc3lzdGVtcywgU0lHQUxSTSBpcyBibG9ja2VkIGJ5IGRlZmF1bHQsIHNvIHVuYmxvY2sgaXQgd2hlbgorICBjcmVhdGluZyB0aGUgYWxhcm0gdGltZXIKKworLSB0aGUgJ2VzZCcgYW5kICdhbHNhJyBsaWJyYXJpZXMgZHVtcCBhIGxvdCBvZiBlcnJvciBtZXNzYWdlcyB0byB0aGUgY29uc29sZQorICBieSBkZWZhdWx0IG9uIExpbnV4LiB0aGVzZSBhcmUgbm93IGRpc2FibGVkIHVubGVzcyB5b3UgdXNlICctZGVidWcgYXVkaW8nCisKKy0gYWRkZWQgdGhlICctaGVscC1jaGFyLWRldmljZXMnIGhlbHAgdG9waWMgdGhhdCBkZXNjcmliZSB0aGUgc3BlY2lmaWNhdGlvbgorICBvZiB0aGUgPGRldmljZT4gcGFyYW1ldGVyIG9mIG9wdGlvbnMgbGlrZSAtc2VyaWFsLCAtZ3BzLCAtc2hlbGwtc2VyaWFsLAorICBldGMuLi4KKworS05PV04gSVNTVUVTOgorCistIG5vIHN1cHBvcnQgZm9yIHZpZGVvIGlucHV0CistIG5vIHN1cHBvcnQgZm9yIG11dGFibGUgU0lNIENhcmQgZW11bGF0aW9uIHlldAorLSBubyBzdXBwb3J0IGZvciBibHVldG9vdGgKKy0gbm8gc3VwcG9ydCBmb3IgV2lGaQorCistIG9uIHNvbWUgTGludXggbWFjaGluZXMsIHRoZSBlbXVsYXRvciBtaWdodCBnZXQgc3R1Y2sgYXQgc3RhcnR1cC4gdGhpcworICBzZWVtcyB0byBiZSByZWxhdGVkIHRvIGF1ZGlvIGlucHV0IHN1cHBvcnQuIHRyeSBzdGFydGluZyB3aXRoCisgICctYXVkaW8taW4gbm9uZScgb3IgIGV2ZW4gJy1ub2F1ZGlvJyB0byBkaXNhYmxlIHNvdW5kLCBvciBjaG9vc2UgYQorICBkaWZmZXJlbnQgYXVkaW8gYmFja2VuZCBieSAgZGVmaW5pbmcgUUVNVV9BVURJT19EUlYgdG8gYW4gYXBwcm9wcmlhdGUKKyAgdmFsdWUgKHJlYWQgYmVsb3cpLgorCisgIHlvdSBjYW4gYWxzbyBzZWxlY3QgZGlmZmVyZW50IGF1ZGlvIGJhY2tlbmRzIGZvciBib3RoIG91dHB1dCBhbmQgaW5wdXQKKyAgYnkgZGVmaW5pbmcgUUVNVV9BVURJT19PVVRfRFJWIGFuZCBRRU1VX0FVRElPX0lOX0RSViBpbmRlcGVuZGVudGx5LgorCistIG9uIFdpbmRvd3MsIHRoZSBlbXVsYXRvciB0YWtlcyBhYm91dCAxMC0xNSUgb2YgdGhlIENQVSBldmVuIHdoZW4gdGhlCisgIGVtdWxhdGVkIHN5c3RlbSBpcyBpZGxlLiB0aGlzIGlzIGEga25vd24gaXNzdWUgcmVsYXRlZCB0byBRRU1VJ3MgaW50ZXJuYWwKKyAgZXZlbnQgbG9vcCBhbmQgV2luc29jay4gdGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gYSBmdXR1cmUgZW11bGF0b3IgcmVsZWFzZS4KKworLSBHUFMgZW11bGF0aW9uIG9ubHkgaWYgeW91IHVzZSB0aGUgJy1xZW11ZCcgb3B0aW9uLiB0aGlzIGlzIGFuIGV4cGVyaW1lbnRhbAorICBvcHRpb24gdGhhdCBpcyBzb29uIGdvaW5nIHRvIGJlIHRoZSBkZWZhdWx0LiB3aXRob3V0IHRoaXMgb3B0aW9uLCB0aGUKKyAgZW11bGF0ZWQgc3lzdGVtIHdpbGwgc3RhcnQgYnV0IEdQUyBlbXVsYXRpb24gd2lsbCBub3Qgd29yay4KKworICBmb3IgdGhlIHJlY29yZCwgJ3FlbXVkJyBpcyBhIHNlcmlhbCBwb3J0IG11bHRpcGxleGVyIHRoYXQgaXMgdXNlZCB0bworICBtdWx0aXBsZXggc2V2ZXJhbCBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGJldHdlZW4gdGhlIGVtdWxhdG9yIGFuZCB0aGUKKyAgZW11bGF0ZWQgc3lzdGVtLCB0aG91Z2ggYSBzaW5nbGUgc2VyaWFsIHBvcnQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBiZXR3ZWVuIDEuMyBhbmQgMS4yCisKK0lNUE9SVEFOVCBCVUcgRklYRVM6CisKK05FVyBGRUFUVVJFUzoKKworLSAnLWF1ZGlvLWluIDxiYWNrZW5kPicgYWxsb3dzIHlvdSB0byBzZWxlY3QgdGhlIGF1ZGlvIGlucHV0IGJhY2tlbmQgZnJvbSB0aGUKKyAgY29tbWFuZCBsaW5lLiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gZGVmaW5pbmcgUUVNVV9BVURJT19JTl9EUlY9PGJhY2tlbmQ+CisKKyAgJy1hdWRpby1vdXQgPGJhY2tlbmQ+JyB3b3JrcyBmb3IgdGhlIGF1ZGlvIG91dHB1dCwgYW5kICctYXVkaW8gPGJhY2tlbmQ+JworICB3aWxsIHNlbGVjdCBib3RoIGlucHV0IGFuZCBvdXRwdXQgYXQgdGhlIHNhbWUgdGltZQorCistICctZGVidWcgPHRhZ3M+JyBoYXMgcmVwbGFjZWQgdGhlIG9sZCAnLXZlcmJvc2UtPHRhZzE+IC12ZXJib3NlLTx0YWcyPiAuLi4nCisgIGRlYnVnZ2luZyBvcHRpb24uIDx0YWdzPiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGRlYnVnIHRhZ3MKKyAgKHNlZSAtaGVscC1kZWJ1Zy10YWdzIGZvciBhIGNvbXBsZXRlIGxpc3QpLiB5b3UgY2FuIGFsc28gdXNlIHRoZSBzcGVjaWFsCisgIHZhbHVlICdhbGwnIHRvIGluZGljYXRlIGFsbCBkZWJ1ZyB0YWdzLCBvciBwcmVmaXggYSAnLScgYmVmb3JlIGEgdGFnCisgIG5hbWUgdG8gZGlzYWJsZSBpdC4gZm9yIGV4YW1wbGU6CisKKyAgICAtZGVidWcgYWxsLC1hdWRpbworCisgIGVuYWJsZXMgYWxsIGRlYnVnZ2luZyBleGNlcHQgYXVkaW8uICctZGVidWctPHRhZz4nIHN0aWxsIHdvcmtzIHRob3VnaC4KKworICBub3RlIHRoYXQgd2hpbGUgJy12ZXJib3NlLTx0YWc+JyBpcyBkZXByZWNhdGVkLCAnLXZlcmJvc2UnIGlzIHN0aWxsIHN1cHBvcnRlZAorICBhcyBhbiBhbGlhcyB0byAnLWRlYnVnLWluaXQnCisKKy0gJy1rZXlzZXQgPGZpbGU+JyBhbGxvd3MgeW91IHRvIHNwZWNpZmljIHRoZSBrZXlzZXQgZmlsZSB0byB1c2UuIHRoZSBkZWZhdWx0CisgIGlzIHN0aWxsIH4vLmFuZHJvaWQvZGVmYXVsdC5rZXlzZXQgb24gVW5peC4gZm9yIFdpbmRvd3MsIHVzZSAtaGVscC1rZXlzZXQKKyAgdG8gZ2V0IGl0cyBkZWZhdWx0IGxvY2F0aW9uICh3aGljaCBkaWZmZXJzIGJldHdlZW4gWFAgYW5kIFZpc3RhKQorCisKK05FVyBDT05TT0xFIENPTU1BTkRTOgorCistIHRoZSAnZ2VvIG5tZWEgPHNlbnRlbmNlPicgY2FuIGJlIHVzZWQgdG8gc2VuZCBhIE5NRUEgMTA4MyBzZW50ZW5jZSBhcyBpZgorICBpdCBjYW1lIGZyb20gYW4gZW11bGF0ZWQgR1BTIHVuaXQuIE5PVEU6IHRoaXMgZG9lc24ndCB3b3JrIHVubGVzcyB5b3UKKyAgYWxzbyB1c2UgdGhlICctcWVtdWQnIG9wdGlvbiAoc2VlIEtOT1dOIElTU1VFUyBiZWxvdykKKworT1RIRVIgQlVHIEZJWEVTOgorCistIHNldmVyZSBjb2xvciBhcnRlZmFjdCBpc3N1ZXMgd2hlbiBzY2FsaW5nIHRoZSBlbXVsYXRvciB3aW5kb3cgPCAxLjAgd2VyZQorICBmaXhlZC4KKworLSBmaXggcmFyZSByYW5kb20gZW11bGF0b3IgZnJlZXplcyBvbiBMaW51eCBieSBkaXNhYmxpbmcgdGhlICdkeW50aWNrcycgdGltZXIuCisKK1JFR1JFU1NJT05TOgorCitPVEhFUjoKKworLSB0aGUgYW1iaWd1b3VzICctY29uc29sZScgb3B0aW9uIGlzIG5vdyBvYnNvbGV0ZS4gdXNlICctc2hlbGwnIGluc3RlYWQKKworLSB0aGUgbmV3ICctc2hlbGwtc2VyaWFsIDxkZXZpY2U+JyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYSBkZXZpY2UgdG8KKyAgY29ubmVjdCBhIHJvb3Qgc2hlbGwgc2Vzc2lvbiB0byB0aGUgZW11bGF0ZWQgc3lzdGVtLgorCistIHRoZSAnLWRlYnVnLWtlcm5lbCcgb3B0aW9uIGlzIG5vdyBrbm93biBhcyAnLXNob3cta2VybmVsJyAodGhlIC1kZWJ1Zy0KKyAgcHJlZml4IGlzIHJlc2VydmVkIGZvciBzdHJpY3QgZW11bGF0b3IgZGVidWdnaW5nIGZlYXR1cmVzKQorCistICctYWRiLXBvcnQnIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiBvcHRpb25zLiBzaW1pbGFybHkKKyAgJy1wb3J0IDxwb3J0Picgd2lsbCBhY2NlcHQgYW4gb2RkIHBvcnQgbnVtYmVyLCBidXQgd2lsbCBwcmludCBhIHdhcm5pbmcKKyAgdGhhdCBpdCBpcyB1c2luZyA8cG9ydD4tMSBpbnN0ZWFkLgorCistIE1NWCBpcyB1c2VkIG9uIHg4NiB0byBzcGVlZCB1cCB3aW5kb3cgcmVzY2FsaW5nLgorCistIGEgbmV3ICctcWVtdWQnIG9wdGlvbiBpcyByZXF1aXJlZCB0byBoYXZlIEdQUyBzdXBwb3J0IHdvcmsgaW4gdGhpcworICBTREsgKGVpdGhlciB0aHJvdWdoICctZ3BzIDxkZXZpY2U+JyBvciB0aGUgJ2dlbyBubWVhIDxzZW50ZW5jZT4nCisgIGNvbnNvbGUgY29tbWFuZCkKKworICB0aGlzIG9wdGlvbiBpcyBwdXJlbHkgZXhwZXJpbWVudGFsIGFuZCB3aWxsIHNvb24gYmVjb21lIHRoZSBkZWZhdWx0LgorCitLTk9XTiBJU1NVRVM6CisKKy0gbm8gc3VwcG9ydCBmb3IgdmlkZW8gaW5wdXQKKy0gbm8gc3VwcG9ydCBmb3IgbXV0YWJsZSBTSU0gQ2FyZCBlbXVsYXRpb24geWV0CistIG5vIHN1cHBvcnQgZm9yIGJsdWV0b290aAorLSBubyBzdXBwb3J0IGZvciBXaUZpCisKKy0gb24gc29tZSBMaW51eCBtYWNoaW5lcywgdGhlIGVtdWxhdG9yIG1pZ2h0IGdldCBzdHVjayBhdCBzdGFydHVwLiB0aGlzCisgIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gYXVkaW8gaW5wdXQgc3VwcG9ydC4gdHJ5IHN0YXJ0aW5nIHdpdGgKKyAgJy1hdWRpby1pbiBub25lJyBvciAgZXZlbiAnLW5vYXVkaW8nIHRvIGRpc2FibGUgc291bmQsIG9yIGNob29zZSBhCisgIGRpZmZlcmVudCBhdWRpbyBiYWNrZW5kIGJ5ICBkZWZpbmluZyBRRU1VX0FVRElPX0RSViB0byBhbiBhcHByb3ByaWF0ZQorICB2YWx1ZSAocmVhZCBiZWxvdykuCisKKyAgeW91IGNhbiBhbHNvIHNlbGVjdCBkaWZmZXJlbnQgYXVkaW8gYmFja2VuZHMgZm9yIGJvdGggb3V0cHV0IGFuZCBpbnB1dAorICBieSBkZWZpbmluZyBRRU1VX0FVRElPX09VVF9EUlYgYW5kIFFFTVVfQVVESU9fSU5fRFJWIGluZGVwZW5kZW50bHkuCisKKy0gb24gV2luZG93cywgdGhlIGVtdWxhdG9yIHRha2VzIGFib3V0IDEwLTE1JSBvZiB0aGUgQ1BVIGV2ZW4gd2hlbiB0aGUKKyAgZW11bGF0ZWQgc3lzdGVtIGlzIGlkbGUuIHRoaXMgaXMgYSBrbm93biBpc3N1ZSByZWxhdGVkIHRvIFFFTVUncyBpbnRlcm5hbAorICBldmVudCBsb29wIGFuZCBXaW5zb2NrLiB0aGlzIHNob3VsZCBiZSBmaXhlZCBpbiBhIGZ1dHVyZSBlbXVsYXRvciByZWxlYXNlLgorCistIEdQUyBlbXVsYXRpb24gb25seSBpZiB5b3UgdXNlIHRoZSAnLXFlbXVkJyBvcHRpb24uIHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsCisgIG9wdGlvbiB0aGF0IGlzIHNvb24gZ29pbmcgdG8gYmUgdGhlIGRlZmF1bHQuIHdpdGhvdXQgdGhpcyBvcHRpb24sIHRoZQorICBlbXVsYXRlZCBzeXN0ZW0gd2lsbCBzdGFydCBidXQgR1BTIGVtdWxhdGlvbiB3aWxsIG5vdCB3b3JrLgorCisgIGZvciB0aGUgcmVjb3JkLCAncWVtdWQnIGlzIGEgc2VyaWFsIHBvcnQgbXVsdGlwbGV4ZXIgdGhhdCBpcyB1c2VkIHRvCisgIG11bHRpcGxleCBzZXZlcmFsIGNvbW11bmljYXRpb24gY2hhbm5lbHMgYmV0d2VlbiB0aGUgZW11bGF0b3IgYW5kIHRoZQorICBlbXVsYXRlZCBzeXN0ZW0sIHRob3VnaCBhIHNpbmdsZSBzZXJpYWwgcG9ydC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDaGFuZ2VzIGJldHdlZW4gMS4yIGFuZCAxLjEKKworCitJTVBPUlRBTlQgQlVHIEZJWEVTOgorCistIGZpeGVkIGEgdHlwbyB0aGF0IHByZXZlbnRlZCB0aGUgRjkvRjEwIGtleWJvYXJkIHNob3J0Y3V0cyBmcm9tIHdvcmtpbmcKKyAgcHJvcGVybHksIG1ha2luZyBub24tcHJvZ3JhbWF0aWNhbGx5IHRyYWNpbmcgdW51c2FibGUuCisKKy0gaGFsdmUgdGhlIGVtdWxhdG9yJ3MgbWVtb3J5IHJlcXVpcmVtZW50cywgc2F2aW5nIGFyb3VuZCAxMzAgbWVnYWJ5dGVzCisgIG9mIG1lbW9yeSBieSBjaGFuZ2luZyB0aGUgd2F5IGZsYXNoIGltYWdlcyBhcmUgYWNjZXNzZWQgKHdlIG5vdyB1c2UKKyAgdGVtcG9yYXJ5IGZpbGVzIGluc3RlYWQpCisKKy0gdGhpcyBlbXVsYXRvciBiaW5hcnkgc2hvdWxkIGJlIDEwJSB0byAyMCUgZmFzdGVyIHRoYW4gcHJldmlvdXMgb25lcyBvbgorICB0aGUgV2luZG93cyBhbmQgT1MgWCBwbGF0Zm9ybXMuIGZvciBmYXN0ZXIgYm9vdHMsIHlvdSBtYXkgYWxzbyB3YW50IHRvCisgIHVzZSB0aGUgLW5vLWJvb3QtYW5pbSBvcHRpb24gZGVzY3JpYmVkIGJlbG93IHRvIHNwZWVkIHVwIHRoZSBpbml0aWFsCisgIGJvb3Qgc2VxdWVuY2UgYXMgd2VsbCBvbiBzbG93IG1hY2hpbmVzLgorCistIHByb3BlciByb3RhdGlvbiBzdXBwb3J0IHdoZW4gdXNpbmcgS2V5cGFkIDcvOSB0byBzd2l0Y2ggYmV0d2VlbiBsYXlvdXRzCisgIGluIHRoZSBkZWZhdWx0IEhWR0Egc2tpbi4gbm8gbmVlZCB0byB1c2UgQ3RybC1QYWdlRG93biBhbnltb3JlCisKKy0gdGhlIC1odHRwLXByb3h5IDxwcm94eT4gb3B0aW9uIGRpZG4ndCB3b3JrIGNvcnJlY3RseSBvbiBXaW5kb3dzICh1bmxlc3MKKyAgeW91IHdlcmUgdmVyeSBsdWNreSkuCisKKy0gZ2VuZXJhbCBzb2NrZXQgaGFuZGxpbmcgY29kZSBvbiBXaW5kb3dzIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgaW1wcm92ZWQuCisKKworTkVXIEZFQVRVUkVTOgorCistIHRoZSBjb25zb2xlIHBvcnQgbnVtYmVyIG9mIGEgZ2l2ZW4gZW11bGF0b3IgaW5zdGFuY2UgaXMgbm93IGRpc3BsYXllZCBpbgorICBpdHMgd2luZG93J3MgdGl0bGUgYmFyLgorCistIHZvaWNlL3NtcyBhcmUgYXV0b21hdGljYWxseSBmb3J3YXJkZWQgdG8gb3RoZXIgZW11bGF0b3IgaW5zdGFuY2VzIHJ1bm5pbmcKKyAgb24gdGhlIHNhbWUgbWFjaGluZSwgYXMgbG9uZyBhcyB5b3UgdXNlIHRoZWlyIGNvbnNvbGUgcG9ydCBudW1iZXIgYXMgdGhlCisgIGRlc3RpbmF0aW9uIHBob25lIG51bWJlci4KKworICBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIGVtdWxhdG9yIHJ1bm5pbmcsIHRoZSBmaXJzdCBvbmUgd2lsbCB1c3VhbGx5CisgIHVzZSBjb25zb2xlIHBvcnQgNTU1NCwgYW5kIHRoZSBzZWNvbmQgb25lIHdpbGwgdXNlIHBvcnQgNTU1NgorCisgIHRoZW4gZGlhbGluZyA1NTU2IG9uIHRoZSAxc3QgZW11bGF0b3Igd2lsbCBnZW5lcmF0ZSBhbiBpbmNvbWluZyBjYWxsIG9uCisgIHRoZSAybmQgZW11bGF0b3IuIHlvdSBjYW4gYWxzbyBob2xkL3VuaG9sZCBjYWxscyBhcyB3ZWxsLgorCisgIHRoaXMgYWxzbyB3b3JrcyB3aGVuIHNlbmRpbmcgU01TIG1lc3NhZ2VzIGZyb20gb25lIGVtdWxhdG9yIHRvIHRoZSBvdGhlcgorCistIHRoZSBoZWxwIHN5c3RlbSBoYXMgYmVlbiB0b3RhbGx5IHJldmFtcGVkOgorCisgICAqICAtaGVscCAgICAgICAgICAgICAgcHJpbnRzIGEgc3VtbWFyeSBvZiBhbGwgb3B0aW9ucyBhbmQgaGVscCB0b3BpY3MKKyAgICogIC1oZWxwLTxvcHRpb24+ICAgICBwcmludHMgb3B0aW9uLXNwZWNpZmljIGhlbHAKKyAgICogIC1oZWxwLTx0b3BpYz4gICAgICBwcmludHMgdmFyaW91cyB0b3BpY2FsIGhlbHAgdGV4dAorICAgKiAgLWhlbHAtYWxsICAgICAgICAgIHByaW50cyAqYWxsKiBoZWxwIGNvbnRlbnQgYXQgb25jZQorCistIHRoZSBlbXVsYXRvciBub3cgdHJpZXMgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIGhvc3QgdGltZSB6b25lIGFuZCBzZW5kcworICBpdCB0byB0aGUgZW11bGF0ZWQgc3lzdGVtIGF0IHN0YXJ0dXAgKHRocm91Z2ggdGhlIEdTTSBtb2RlbSkuIHRoZXJlIGlzIGFsc28KKyAgYSBuZXcgJy10aW1lem9uZSA8dGltZXpvbmU+JyBvcHRpb24gdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IG9uZS4KKworICBJTVBPUlRBTlQ6IHRoZSA8dGltZXpvbmU+IG5hbWUgbXVzdCBiZSBpbiB6b25laW5mbyBmb3JtYXQsIGkuZS4KKyAgICAgICAgICAgICBBcmVhL0xvY2F0aW9uLCBodW1hbi1mcmllbmRseSBhYmJyZXZpYXRpb25zIGxpa2UgIlBTVCIgb3IgIkNFVCIKKyAgICAgICAgICAgICB3aWxsIG5vdCB3b3JrLiBleGFtcGxlcyBhcmU6CisKKyAgICAgICAgICAgICAgICAgQW1lcmljYS9Mb3NfQW5nZWxlcworICAgICAgICAgICAgICAgICBFdXJvcGUvUGFyaXMKKworLSB0aGUgZW11bGF0b3IgY2FuIG5vdyB1c2UgdXAgdG8gNCBkaXN0aW5jdCBETlMgc2VydmVycyAoaW5zdGVhZCBvZiBvbmx5IG9uZSkuCisgIGJ5IGRlZmF1bHQsIHRoZXkgYXJlIHRha2VuIGZyb20geW91ciBzeXN0ZW0ncyBsaXN0LCB3aGljaCBpcyBvYnRhaW5lZCBieQorICBjYWxsaW5nIEdldE5ldHdvcmtQYXJhbXMoKSBvbiBXaW4zMiwgYW5kIHBhcnNpbmcgL2V0Yy9yZXNvbHYuY29uZiBvbgorICBVbml4LgorCistIGEgbmV3ICctZG5zLXNlcnZlciA8c2VydmVyPicgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQKKyAgbGlzdCBvZiBhbHRlcm5hdGl2ZSBETlMgc2VydmVycyB0byBiZSB1c2VkIGJ5IHRoZSBlbXVsYXRlZCBzeXN0ZW0sIGluc3RlYWQgb2YKKyAgdGhlIHN5c3RlbSdzIGRlZmF1bHQuCisKKy0gYSBuZXcgJy1zY2FsZSA8ZnJhY3Rpb24+JyBvcHRpb24gYWxsb3dzIHlvdSB0byBzY2FsZSB0aGUgZW11bGF0b3IKKyAgd2luZG93LiA8ZnJhY3Rpb24+IGNhbiBiZSBhIG51bWJlciBiZXR3ZWVuIDAuMSBhbmQgMy4wLgorCisgIHlvdSBjYW4gYWxzbyB1c2UgJy1zY2FsZSA8dmFsdWU+ZHBpJywgKGUuZy4gJy1zY2FsZSAxMTBkcGknKSB0byBpbmRpY2F0ZSB0aGUKKyAgcmVzb2x1dGlvbiBvZiB5b3VyIGhvc3QgbW9uaXRvciBzY3JlZW4uIGl0IHdpbGwgYmUgZGl2aWRlZCBieSB0aGUgZW11bGF0ZWQKKyAgZGV2aWNlJ3MgcmVzb2x1dGlvbiB0byBnZXQgYW4gYWJzb2x1dGUgc2NhbGUuCisKKy0gYSBuZXcgJy1kcGktZGV2aWNlIDxkcGk+JyBvcHRpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZpYyB0aGUgcmVzb2x1dGlvbiBvZgorICB0aGUgZW11bGF0ZWQgZGV2aWNlJ3Mgc2NyZWVuLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQ6IHRoZSBkZWZhdWx0CisgIHVzZWQgaXMgMTY1LCB3aGljaCBpcyB0aGUgYXZlcmFnZSBvZiBzZXZlcmFsIHByb3RvdHlwZXMgd2UndmUgYmVlbiB3b3JraW5nCisgIHdpdGguCisKKy0gYWRkIGEgbmV3ICctcG9ydCA8cG9ydD4nIG9wdGlvbiB0byBzcGVjaWZ5IHdoaWNoIHBvcnQgdGhlIGVtdWxhdG9yIHNob3VsZAorICBiaW5kIHRvIGZvciB0aGUgY29uc29sZSwgaW5zdGVhZCBvZiBsZXR0aW5nIGl0IGd1ZXNzLiA8cG9ydD4gbXVzdCBiZSBhbgorICAqZXZlbiogaW50ZWdlciBiZXR3ZWVuIDU1NTQgYW5kIDU1ODQgaW5jbHVkZWQuIHRoZSBjb3JyZXNwb25kaW5nIEFEQiBwb3J0CisgIHdpbGwgYmUgPHBvcnQ+KzEKKworLSBbREVQUkVDQVRFRF0gYWRkIGEgbmV3ICctYWRiLXBvcnQgPHBvcnQ+JyBvcHRpb24gdG8gc3BlY2lmeSB3aGljaCBwb3J0IHRoZQorICBlbXVsYXRvciBzaG91bGQgYmluZCB0bywgaW5zdGVhZCBvZiBsZXR0aW5nIGl0IGd1ZXNzLiA8cG9ydD4gbXVzdCBiZSBhbiBvZGQKKyAgaW50ZWdlciBiZXR3ZWVuIDU1NTUgYW5kIDU1ODUgaW5jbHVkZWQuIHRoZSBjb3JyZXNwb25kaW5nIGNvbnRyb2wgY29uc29sZQorICB3aWxsIGJlIG9uIDxwb3J0Pi0xCisKKyAgTk9URTogLWFkYi1wb3J0IGlzIGRlcHJlY2F0ZWQsIGRvbid0IHVzZSBpdCwgaXQgd2lsbCBwcm9iYWJseSBkaXNhcHBlYXIKKyAgTk9URTI6IHlvdSBjYW5ub3QgdXNlIGJvdGggLXBvcnQgYW5kIC1hZGItcG9ydCBhdCB0aGUgc2FtZSB0aW1lLgorCistIGEgbmV3ICctbm8tYm9vdC1hbmltJyBvcHRpb25zIHRlbGxzIHRoZSBlbXVsYXRlZCBzeXN0ZW0gdG8gZGlzYWJsZSB0aGUgYm9vdAorICBhbmltYXRpb24uIG9uIHNsb3cgc3lzdGVtcywgdGhpcyBjYW4gKnNpZ25pZmljYW50bHkqIHJlZHVjZSB0aGUgdGltZSB0bworICBib290IHRoZSBzeXN0ZW0gaW4gdGhlIGVtdWxhdG9yLgorCistIHlvdSBjYW4gbm93IHJlZGVmaW5lIHRoZSBlbXVsYXRvcidzIGtleWJpbmRpbmcgYnkgd3JpdGluZyBhICdrZXlzZXQnIGZpbGUKKyAgYW5kIHVzZSAnLWtleXNldCA8ZmlsZW5hbWU+JyB0byB1c2UgaXQgd2hlbiBzdGFydGluZyB0aGUgZW11bGF0b3IuIHVzZQorICAtaGVscC1rZXlzZXQgYW5kIC1oZWxwLWtleXNldC1maWxlIGZvciBhbGwgZGV0YWlscy4KKworICB0aGlzIGFsbG93cyB5b3UgdG8gdXNlIHRoZSBlbXVsYXRvciBlZmZlY3RpdmVseSBvbiBrZXlib2FyZHMgd2hpY2ggZG9uJ3QKKyAgaGF2ZSBhIGtleXBhZCwgYnkgdXNpbmcgZGlmZmVyZW50IGtleXMuLgorCistIHlvdSBjYW4gbm93IHRvZ2dsZSBiZXR3ZWVuIHdpbmRvd2VkIGFuZCBmdWxsc2NyZWVuIG1vZGUgYXQgcnVudGltZSBieQorICBwcmVzc2luZyBBbHQtRW50ZXIgKG9ubHkgd29ya3Mgb24gTGludXggYXQgdGhlIG1vbWVudCAhISkKKworLSB1c2UgJy1hdWRpby1vdXQgPGJhY2tlbmQ+JyBhbmQgJy1hdWRpby1pbiA8YmFja2VuZD4nIHRvIGNoYW5nZSB0aGUgb3V0cHV0CisgIGFuZCBpbnB1dCBhdWRpbyBiYWNrZW5kcyB1c2VkIGJ5IHRoZSBlbXVsYXRvci4gc2VlIC1oZWxwLWF1ZGlvLW91dCBhbmQKKyAgLWhlbHAtYXVkaW8taW4gZm9yIGEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMuCisKKyAgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIFFFTVVfQVVESU9fT1VUX0RSViBhbmQgUUVNVV9BVURJT19JTl9EUlYKKyAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCisgIHVzZSAnLWF1ZGlvIDxiYWNrZW5kPicgdG8gc2V0IGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgYmFja2VuZHMgYXQgdGhlCisgIHNhbWUgdGltZS4gdGhpcyBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIFFFTVVfQVVESU9fRFJWIGVudmlyb25tZW50CisgIHZhcmlhYmxlLgorCisKK05FVyBDT05TT0xFIENPTU1BTkRTOgorCistIHRoZSBuZXcgJ3Bvd2VyJyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIHBvd2VyL2JhdHRlcnkgc3RhdGUgb2YKKyAgdGhlIGVtdWxhdGVkIGRldmljZS4KKworLSB0aGUgbmV3ICdldmVudCBzZW5kJyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHNlbmQgc2ltdWxhdGVkIGhhcmR3YXJlIGV2ZW50cworICB0byB0aGUgQW5kcm9pZCBMaW51eCBrZXJuZWwuIGVhY2ggZXZlbnQgbXVzdCBiZSBpbiB0aGUgZm9ybQorICA8dHlwZT46PGNvZGU+Ojx2YWx1ZT4gd2hlcmU6CisKKyAgICA8dHlwZT4gIGlzIGVpdGhlciBhbiBpbnRlZ2VyIG9yIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgYWxpYXMKKyAgICAgICAgICAgICh1c2UgImV2ZW50IHR5cGVzIiB0byBzZWUgYSBsaXN0IG9mIGFsaWFzZXMpCisKKyAgICA8Y29kZT4gIGlzIGVpdGhlciBhbiBpbnRlZ2VyIG9yIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgYWxpYXMKKyAgICAgICAgICAgIHRoYXQgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YgPHR5cGU+ICh1c2UgImV2ZW50IGNvZGVzIDx0eXBlPiIKKyAgICAgICAgICAgIHRvIHNlZSBhIGxpc3Qgb2YgdGhlc2UgYWxpYXNlcykKKworICAgIDx2YWx1ZT4gaXMgYW4gaW50ZWdlcgorCisgIE5PVEU6IEJlIHdhcm5lZCB0aGF0IGl0IGlzIHZlcnkgZWFzeSB0byBjb25mdXNlIHRoZSBrZXJuZWwgYWJvdXQgdGhlIHN0YXRlCisgICAgICAgIG9mIGVtdWxhdGVkIGhhcmR3YXJlIGJ5IHNlbmRpbmcgdGhlIHdyb25nIGV2ZW50LiBBbiAqZXhjZWxsZW50KgorICAgICAgICBrbm93bGVkZ2Ugb2YgdGhlIExpbnV4IGtlcm5lbCBpbnRlcm5hbHMgaXMgZW5jb3VyYWdlZCBiZWZvcmUgcGxheWluZworICAgICAgICB3aXRoICJldmVudCBzZW5kIi4KKworLSB0aGUgbmV3ICdldmVudCB0ZXh0IDx0ZXh0TWVzc2FnZT4nIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gc2ltdWxhdGUKKyAga2V5cHJlc3NlcyBvZiBzbWFsbCB0ZXh0IG1lc3NhZ2VzLCB3aGVyZSA8dGV4dE1lc3NhZ2U+IGlzIGFuIHV0Zi04IHN0cmluZy4KKworLSB0aGUgbmV3ICdhdmQgc3RvcCcgYW5kICdhdmQgc3RhcnQnIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gc3RvcC9zdGFydCB0aGUKKyAgZW11bGF0aW9uLiB5b3UgY2FuIGFsc28gdXNlICdhdmQgc3RhdHVzJyB0byBxdWVyeSB0aGUgY3VycmVudCBzdGF0ZS4KKworLSB0aGUgbmV3ICd3aW5kb3cgc2NhbGUgPHNjYWxlPicgY29tbWFuZCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgc2NhbGUgb2YKKyAgdGhlIGVtdWxhdG9yIHdpbmRvdyBkeW5hbWljYWxseS4gPHNjYWxlPiBpcyBlaXRoZXIgYW4gaW50ZWdlciBmb2xsb3dlZCBieQorICB0aGUgJ2RwaScgc3VmZml4IChlLmcuICcxMjBkcGknKSBvciBhIHJlYWwgbnVtYmVyIGJldHdlZW4gMC4xIGFuZCAzLjAuCisKKyAgaW4gdGhlIGZpcnN0IGNhc2UsIDxzY2FsZT4gc3BlY2lmaWVzIHlvdXIgbW9uaXRvciBkcGk7IGluIHRoZSBzZWNvbmQgb25lLAorICB0aGUgbmV3IHdpbmRvdyBzY2FsZSBpdHNlbGYuCisKKworT1RIRVIgQlVHIEZJWEVTOgorCistIGluIGNhc2Ugb2YgU0RMX0luaXQoKSBmYWlsdXJlLCBwcmludCB0aGUgU0RMIGVycm9yIG1lc3NhZ2UuCistIGRpc2FibGUgbmV0d29ya2luZyBjb2RlJ3MgbG9nZ2luZyB0byAvdG1wL3NsaXJwLmxvZworLSB0aGUgZW11bGF0b3Igbm93IHdvcmtzIHdpdGggMkdCIFNEIENhcmQgZmlsZXMKKy0gdGhlIGVtdWxhdG9yIGRvZXNuJ3QgcHJldmVudCB0aGUgc2NyZWVuc2F2ZXIgdG8ga2ljayBpbiBvbiBPUyBYIGFueW1vcmUKKy0gdGhlIC1vbmlvbiBhbmQgLW9uaW9uLWFscGhhIG9wdGlvbnMgbm93IHdvcmsgcHJvcGVybHkKKy0gYSBzZWNvbmQgZW11bGF0b3IgaW5zdGFuY2UgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZSBTRCBDYXJkIGluc3RhbmNlIHRoYW4gYQorICBmaXJzdCBvbmUgd2lsbCBubyBsb25nZXIgY3Jhc2gKKy0gaXQncyBub3cgcG9zc2libGUgdG8gcHJvcGVybHkgc3RhcnQgdGhlIGVtdWxhdG9yIGluIHRoZSBiYWNrZ3JvdW5kIG9uIGFsbAorICBVbml4IHNoZWxscyAoZS5nLiAiZW11bGF0b3IgJiIpIHdpdGhvdXQgYmVpbmcgaW50ZXJydXB0ZWQvc3RvcHBlZCBieSBhCisgIFNJR1RUSU4gb3IgU0lHVFRPVSBzaWduYWwuCistIGZpeGVkIGEgYnVnIGluIHRoZSBTTVMgZW11bGF0aW9uIHRoYXQgaGFwcGVuZWQgd2hlbiB1c2luZyBHU00gNy1iaXQgZXNjYXBlZAorICBjaGFyYWN0ZXJzLCBpLmUuIGFueXRoaW5nIGluIHRoZSBmb2xsb3dpbmc6IFt8XX5ce31eCistIGZpeGVkIGEgc21hbGwgcmVncmVzc2lvbiB3aGVyZSAtZGF0YSA8Zm9vPiB3b3VsZCBmYWlsIGlmIHRoZSBmaWxlIDxmb28+CisgIGRpZCBub3QgZXhpc3QuCisKKworUkVHUkVTU0lPTlM6CisKKy0gdGhlIC1mbGFzaC1rZXlzIG9wdGlvbnMgZG9lc24ndCB3b3JrIGFueW1vcmUKKworCitLTk9XTiBJU1NVRVM6CisKKy0gbm8gc3VwcG9ydCBmb3IgdmlkZW8gaW5wdXQKKy0gbm8gc3VwcG9ydCBmb3IgbXV0YWJsZSBTSU0gQ2FyZCBlbXVsYXRpb24geWV0CistIG5vIHN1cHBvcnQgZm9yIGJsdWV0b290aAorLSBubyBzdXBwb3J0IGZvciBXaUZpCisKKy0gb24gc29tZSBMaW51eCBtYWNoaW5lcywgdGhlIGVtdWxhdG9yIG1pZ2h0IGdldCBzdHVjayBhdCBzdGFydHVwLiB0aGlzCisgIHNlZW1zIHRvIGJlIHJlbGF0ZWQgdG8gYXVkaW8gaW5wdXQgc3VwcG9ydC4gdHJ5IHN0YXJ0aW5nIHdpdGgKKyAgJy1hdWRpby1pbiBub25lJyBvciBldmVuICctbm9hdWRpbycgdG8gZGlzYWJsZSBzb3VuZCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50CisgIGF1ZGlvIGJhY2tlbmQgYnkgZGVmaW5pbmcgUUVNVV9BVURJT19EUlYgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUKKyAgKHJlYWQgYmVsb3cpLgorCisgIHlvdSBjYW4gYWxzbyBzZWxlY3QgZGlmZmVyZW50IGF1ZGlvIGJhY2tlbmRzIGZvciBib3RoIG91dHB1dCBhbmQgaW5wdXQKKyAgYnkgZGVmaW5pbmcgUUVNVV9BVURJT19PVVRfRFJWIGFuZCBRRU1VX0FVRElPX0lOX0RSViBpbmRlcGVuZGVudGx5LgorCistIG9uIFdpbmRvd3MsIHRoZSBlbXVsYXRvciB0YWtlcyBhYm91dCAxMC0xNSUgb2YgdGhlIENQVSBldmVuIHdoZW4gdGhlCisgIGVtdWxhdGVkIHN5c3RlbSBpcyBpZGxlLiB0aGlzIGlzIGEga25vd24gaXNzdWUgcmVsYXRlZCB0byBRRU1VJ3MgaW50ZXJuYWwKKyAgZXZlbnQgbG9vcCBhbmQgV2luc29jay4gdGhpcyBzaG91bGQgYmUgZml4ZWQgaW4gYSBmdXR1cmUgZW11bGF0b3IgcmVsZWFzZS4KKworT1RIRVI6CisKKy0geW91IGNhbiBub3cgdXNlIC1kZWJ1Zy08Y29tcG9uZW50PiBhbmQvb3IgLWRlYnVnLW5vLTxjb21wb25lbnQ+IHRvCisgIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWJ1ZyBtZXNzYWdlcyBvZiBhIGdpdmVuIGVtdWxhdG9yIGNvbXBvbmVudC4gdGhpcworICBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yIHRyb3VibGVzaG9vdGluZy4gZm9yIGFsbCBkZXRhaWxzLCB1c2UgLWhlbHAtZGVidWcKKyAgYW5kIC1oZWxwLWRlYnVnLXRhZ3MKKworLSB5b3UgY2FuIGFsc28gdXNlICctZGVidWcgPHRhZ3M+JyB3aGVyZSA8dGFncz4gaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAorICBvZiBjb21wb25lbnQgbmFtZXMsIG9wdGlvbmFsbHkgcHJlZml4ZWQgYnkgYSBzaW5nbGUgJy0nLiBzZWUgLWhlbHAtZGVidWcKKyAgYW5kIC1oZWxwLWRlYnVnLXRhZ3MgZm9yIGFsbCBkZXRhaWxzCisKKy0geW91IGNhbiBub3cgZGVmaW5lIHRoZSBBTkRST0lEX1ZFUkJPU0UgZW52aXJvbm1lbnQgdmFyaWFibGUgYXMgYSBsaXN0CisgIG9mICJkZWJ1ZyIgaXRlbXMgKGVhY2ggPGl0ZW0+IGNvcnJlc3BvbmRzIHRvIGEgLWRlYnVnLTxpdGVtPiBvcHRpb24pLgorICBmb3IgZXhhbXBsZSwgZGVmaW5pbmc6CisKKyAgICAgQU5EUk9JRF9WRVJCT1NFPXNvY2tldCxrZXlzCisKKyAgaXMgZXF1aXZhbGVudCB0byB1c2luZyAiLWRlYnVnIHNvY2tldCxrZXlzIiB3aGVuIGludm9raW5nIHRoZSBlbXVsYXRvcgorCistIGFzIGEgc3BlY2lhbCBjYXNlLCAtZGVidWctc2xpcnAgZW5hYmxlcyBsb2dnaW5nIG9mIHRoZSByb3V0ZXIvZmlyZXdhbGwKKyAgb3BlcmF0aW9ucyB0byBhIHRlbXBvcmFyeSBmaWxlIChlLmcuIC90bXAvYW5kcm9pZC9zbGlycC5sb2cpLiB5b3UgY2FuCisgIGFsc28gc3BlY2lmeSBhIGxvZ2dpbmcgYml0bWFzayB3aXRoIHRoZSBBTkRST0lEX1NMSVJQX0xPR01BU0sgZW52aXJvbm1lbnQKKyAgdmFyaWFibGUgKHRoZSBkZWZhdWx0IGlzIGEgbWFzayBvZiA3KS4KKworLSByZW1vdmVkIG1hbnkgb2Jzb2xldGUgLyB1bnVzZWQgc291cmNlIGZpbGVzIGZyb20gdGhlIHJlcG9zaXRvcnkuIGFsc28KKyAgcGVyZm9ybWVkIGEgcmF0aGVyIGhlYXZ5IGNsZWFudXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtIHNvbWV3aGF0CisgIG1vcmUgbWFuYWdlYWJsZS4KKworLSBpbnRlZ3JhdGUgZHludGlja3Mgc3VwcG9ydCBmcm9tIHVwc3RyZWFtIFFFTVUgZGVwb3QuIHRoaXMgb25seSBhbGxvd3Mgb25lCisgIHRvIHByb3ZpZGUgbW9yZSBwcmVjaXNlIHRpbWluZyBhY2N1cmFjeSBpbiB0aGUgZ3Vlc3QgdW5kZXIgTGludXguCisgIChOT1RFOiBkaXNhYmxlZCBpbiB0aGUgc291cmNlIGNvZGUsIHNpbmNlIGl0IHNlZW1zIHRoYXQgaXQgZnJlZXplcworICB0aGUgZW11bGF0b3Igc29tZXRpbWVzKQorCistIGF1ZGlvIGlucHV0IGlzIG5vdyB3b3JraW5nIG9uIE9TIFgsIFdpbmRvd3MgYW5kIExpbnV4LiBvbiBMaW51eCwgdGhlcmUKKyAgYXJlIGZvdXIgZGlmZmVyZW50IGJhY2tlbmRzIHN1cHBvcnRlZDogRXNvdW5ELCBBTFNBLCBPU1MgYW5kIFNETC4gdGhleQorICBhcmUgYWNjZXNzZWQgdGhyb3VnaCBkbG9wZW4vZGxzeW0sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGVtdWxhdG9yIGJpbmFyeQorICB3aWxsIHJ1biBvbiBhbnkgc3lzdGVtLgorCisgIHlvdSBjYW4gc3BlY2lmeSBhIGdpdmVuIGJhY2tlbmQgYnkgZGVmaW5pbmcgdGhlIFFFTVVfQVVESU9fRFJWIGVudmlyb25tZW50CisgIHZhcmlhYmxlIHRvIG9uZSBvZiB0aGVzZSB2YWx1ZXM6CisKKyAgICBhbHNhCisgICAgZXNkCisgICAgc2RsCisgICAgb3NzCisgICAgbm9uZQorCisgIG5vdGUgdGhhdCB0aGUgInNkbCIgYXVkaW8gYmFja2VuZCBpcyB0aGUgbW9zdCBjb21wYXRpYmxlLCBidXQgZG9lc24ndAorICBzdXBwb3J0IGF1ZGlvIGlucHV0IGF0IGFsbCAhIQorCistIGEgbmV3IG9wdGlvbiAnLWNwdS1kZWxheSA8ZGVsYXk+JyBjYW4gYmUgdXNlZCB0byBzbG93IGRvd24gdGhlIENQVQorICBlbXVsYXRpb24uIHRoZSA8ZGVsYXk+IGlzIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAwLiBub3RlIHRoYXQgaXQKKyAgZG9lc24ndCBuZWNlc3NhcmlseSBzY2FsZSBsaW5lYXJseSB3aXRoIGVmZmVjdGl2ZSBwZXJmb3JtYW5jZS4KKworICB0aGUgZGVsYXkgcHJvY2VzcyBpcyBub3QgZXhhY3RseSBkZXRlcm1pbmlzdGljLiB0aGlzIGlzIGp1c3QgYSBoYWNrIHRoYXQKKyAgbWF5IGRpc2FwcGVhciBvciBiZSBjb21wbGV0ZWx5IHJlLWltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUKKworLSBzb21lIG5ldyAiZ3NtIiBhbmQgInNtcyIgc3ViY29tbWFuZHMgd2VyZSBhZGRlZCB0byB0aGUgY29udHJvbCBjb25zb2xlLgorICB0aGV5IGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHZvaWNlL3NtcyBhdXRvLWZvcndhcmRlciBhbmQgYXJlIHByb2JhYmx5CisgIG5vdCB2ZXJ5IHVzZWZ1bCB0byB0eXBpY2FsIGRldmVsb3BlcnMKKworLSBzb21lIGNvZGUgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzYXZlL3Jlc3RvcmUgb2YgdGhlIEFWRCBzdGF0ZSB0by9mcm9tCisgIGEgZmlsZS4gaG93ZXZlciB0aGlzIGlzIG5vdCBwcm9wZXJseSB0ZXN0ZWQgeWV0LCBhbmQgcmVxdWlyZXMgdGhhdCB5b3UKKyAgdXNlIGV4YWN0bHkgdGhlIHNhbWUgb3B0aW9ucyBhbmQgZGlzayBpbWFnZXMgd2hlbiByZWxvYWRpbmcgdGhlIEFWRCBzdGF0ZS4KKworLSBhZGRlZCBhIG5ldyAtY2FjaGUgPGZpbGU+IG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBjYWNoZSBwYXJ0aXRpb24gaW1hZ2UKKyAgZmlsZS4gdGhlIGRlZmF1bHQgaXMgdG8gdXNlIGEgdGVtcG9yYXJ5IGZpbGUgaW5zdGVhZAorCistIGFkZGVkIGEgbmV3IC1yZXBvcnQtY29uc29sZSA8c29ja2V0PiBvcHRpb24gdG8gYmUgYWJsZSB0byByZXBvcnQgdGhlCisgIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgY29uc29sZSBwb3J0IHRvIGEgcmVtb3RlIHRoaXJkLXBhcnR5IChlLmcuIGEKKyAgc2NyaXB0KSBiZWZvcmUgc3RhcnRpbmcgdGhlIGVtdWxhdGlvbi4gc2VlIHRoZSBvdXRwdXQgb2YgLWhlbHAgZm9yIGFsbAorICB0aGUgZGV0YWlscworCistIChvbmx5IHVzZWZ1bCB0byBBbmRyb2lkIGVuZ2luZWVycykKKyAgdGhlIGF1ZGlvIHN1Yi1zeXN0ZW0gaXMgbm93IGNvbXBpbGVkIGluIGl0cyBvd24gc3RhdGljIGxpYnJhcnkgKGNhbGxlZAorICBsaWJxZW11LWF1ZGlvLmEpLCB3aGljaCBnZXRzIGNvcGllZCB0byB0aGUgQW5kcm9pZCAicHJlYnVpbHQvTGludXgvcWVtdSIKKyAgZGlyZWN0b3J5LiB0aGlzIGlzIGRvbmUgdG8gYXZvaWQgZm9yY2luZyBhbGwgZGV2ZWxvcGVycyB0byBpbnN0YWxsIHZhcmlvdXMKKyAgZGV2ZWxvcG1lbnQgcGFja2FnZXMgb24gTGludXgsIGFzIHdlbGwgYXMgYWxsIGJ1aWxkIHNlcnZlcnMuIHRoZXJlIGlzIGFsc28KKyAgbm93IGEgc2NyaXB0IG5hbWVkICJhbmRyb2lkL3RoaXJkX3BhcnR5L3VwZGF0ZS1hdWRpby5zaCIgd2hpY2ggd2lsbCB1cGRhdGUgdGhlIGRlcG90CisgIGZpbGUgYXV0b21hdGljYWxseSBmb3IgeW91OiBjYWxsIGl0IHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlIGF1ZGlvIHNvdXJjZXMuCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvQ0hBUi1ERVZJQ0VTLlRYVCBiL2FuZHJvaWQvZG9jcy9DSEFSLURFVklDRVMuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjNiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvQ0hBUi1ERVZJQ0VTLlRYVApAQCAtMCwwICsxLDIwMSBAQAorUUVNVSBDSEFSQUNURVIgIkRFVklDRVMiIE1BTkFHRU1FTlQKKworSS4gQ2hhckRyaXZlclN0YXRlIG9iamVjdHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT25lIG9mIHRoZSBzdHJhbmdlc3QgYWJzdHJhY3Rpb24gaW4gUUVNVSBpcyB0aGUgIkNoYXJEcml2ZXJTdGF0ZSIKKyhhYmJyZXZpYXRlZCBoZXJlIGFzICJDUyIpLgorCitUaGUgQ1MgaXMgZXNzZW50aWFsbHkgYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYSBjaGFyYWN0ZXIgc3RyZWFtIHRoYXQKK2NhbiBiZSBjb25uZWN0ZWQgdG8gdGhpbmdzIGxpa2UgYSBob3N0IHNlcmlhbCBwb3J0LCBhIGhvc3QgbmV0d29yayBzb2NrZXQsCithbiBlbXVsYXRlZCBkZXZpY2UsIGV0Yy4uLgorCitXaGF0J3MgcmVhbGx5IHVudXN1YWwgaXMgaXRzIGludGVyZmFjZSB0aG91Z2gsIHdoaWNoIGNvbWVzIGZyb20gdGhlIGZhY3QKK3RoYXQgUUVNVSBpbXBsZW1lbnRzIGEgYmlnIGV2ZW50IGxvb3Agd2l0aCBubyBibG9ja2luZyBpL28gYWxsb3dlZC4gWW91CitjYW4gc2VlICJxZW11LWNoYXIuaCIgZm9yIHRoZSBmdWxsIGludGVyZmFjZSwgYnV0IGhlcmUgd2Ugd2lsbCBvbmx5IGRlc2NyaWJlCithIGZldyBpbXBvcnRhbnQgZnVuY3Rpb25zOgorCisgIC0gcWVtdV9jaHJfd3JpdGUoKSBpcyB1c2VkIHRvIHRyeSB0byB3cml0ZSBkYXRhIGludG8gYSBDUyBvYmplY3QuIE5vdGUgdGhhdAorICAgIHN1Y2Nlc3MgaXMgbm90IGd1YXJhbnRlZWQ6IHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAorICAgIHdlcmUgcmVhbGx5IHdyaXR0ZW4gKHdoaWNoIGNhbiBiZSAwKSBhbmQgdGhlIGNhbGxlciBtdXN0IGRlYWwgd2l0aCBpdC4KKyAgICBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byB3cml0aW5nIHRvIGEgbm9uLWJsb2NraW5nIEJTRCBzb2NrZXQgb24gVW5peC4KKworICAgICAgIGludCAgcWVtdV9jaHJfd3JpdGUoIENoYXJEcml2ZXJTdGF0ZSogIGNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgZGF0YWxlbiApOworCisgICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGJ1dCB0aGlzIGRlcGVuZHMgZW50aXJlbHkKKyAgICBvbiB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiAoc29tZSBvZiB0aGVtIHdpbGwganVzdCByZXR1cm4gMCBpbnN0ZWFkKS4KKyAgICBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyBpdCdzIG5vdCBwb3NzaWJsZSB0byByZWxpYWJseSBkaWZmZXJlbnRpYXRlIGJldHdlZW4KKyAgICBhICJjb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiIGFuZCBhbiAib3BlcmF0aW9uIGluIHByb2dyZXNzIiA6LSgKKworICAgIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IGluIGFkdmFuY2UgaG93IG1hbnkgYnl0ZXMgYSBnaXZlbiBDaGFyRHJpdmVyU3RhdGUKKyAgICBjYW4gYWNjZXB0LCBub3IgdG8gYmUgbm90aWZpZWQgd2hlbiBpdHMgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBpcyByZWFkeQorICAgIHRvIGFjY2VwdCBkYXRhIGFnYWluLgorCisKKyAgLSBxZW11X2Nocl9hZGRfaGFuZGxlcigpIGlzIHVzZWQgdG8gYWRkICJyZWFkIiBhbmQgImV2ZW50IiBoYW5kbGVycworICAgIHRvIGEgQ1Mgb2JqZWN0LiBXZSB3aWxsIGlnbm9yZSAiZXZlbnRzIiBoZXJlIGFuZCBmb2N1cyBvbiB0aGUKKyAgICAicmVhZCIgcGFydC4KKworICAgIFRoaW5nIGlzLCB5b3UgY2Fubm90IGRpcmVjdGx5IHJlYWQgZnJvbSBhIENTIG9iamVjdC4gSW5zdGVhZCwgeW91IHByb3ZpZGUKKyAgICB0d28gZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIG9iamVjdCBoYXMgc29tZXRoaW5nIGZvcgorICAgIHlvdToKKworICAgICAgICAtIGEgJ2Nhbl9yZWFkJyBmdW5jdGlvbiB0aGF0IHNoYWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICAgdGhhdCB5b3UgYXJlIHJlYWR5IHRvIGFjY2VwdCBmcm9tIHRoZSBDaGFyRHJpdmVyU3RhdGUuIEl0cworICAgICAgICAgIGludGVyZmFjZSBpczoKKworICAgICAgICAgICAgIHR5cGVkZWYgaW50ICBJT0NhblJXSGFuZGxlciAodm9pZCogIG9wYXF1ZSk7CisKKyAgICAgICAgLSBhICdyZWFkJyBmdW5jdGlvbiB0aGF0IHdpbGwgc2VuZCB5b3UgYnl0ZXMgZnJvbSB0aGUgQ2hhckRyaXZlclN0YXRlCisKKyAgICAgICAgICAgICB0eXBlZGVmIHZvaWQgSU9SZWFkSGFuZGxlciAgKHZvaWQqICAgICAgICAgICBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBkYXRhbGVuKTsKKworICAgICAgICAgIG5vcm1hbGx5LCB0aGUgdmFsdWUgb2YgJ2RhdGFsZW4nIGNhbm5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgcmVzdWx0CisgICAgICAgICAgb2YgYSBwcmV2aW91cyAnY2FuX3JlYWQnIGNhbGwuCisKKyAgICBGb3IgYm90aCBjYWxsYmFja3MsICdvcGFxdWUnIGlzIGEgdmFsdWUgdGhhdCB5b3UgcGFzcyB0byB0aGUgZnVuY3Rpb24KKyAgICBxZW11X2Nocl9hZGRfaGFuZGxlcigpIHdoaWNoIHNpZ25hdHVyZSBpczoKKworICAgICAgICAgdm9pZCBxZW11X2Nocl9hZGRfaGFuZGxlcnMoQ2hhckRyaXZlclN0YXRlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9DYW5SV0hhbmRsZXIgICpmZF9jYW5fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPUmVhZEhhbmRsZXIgICAqZmRfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPRXZlbnRIYW5kbGVyICAqZmRfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKm9wYXF1ZSk7CisKKyAgLSBxZW11X2Nocl9vcGVuKCkgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgQ2hhckRyaXZlclN0YXRlIG9iamVjdCBmcm9tIGEKKyAgICBkZXNjcmlwdGl2ZSBzdHJpbmcsIGl0cyBpbnRlcmZhY2UgaXM6CisKKyAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSogIHFlbXVfY2hyX29wZW4oY29uc3QgY2hhciogIGZpbGVuYW1lKTsKKworICAgIHRoZXJlIGFyZSB2YXJpb3VzIGZvcm1hdHMgZm9yIGFjY2VwdGFibGUgJ2ZpbGVuYW1lcycsIGFuZCB0aGV5IGNvcnJlc3BvbmQKKyAgICB0byB0aGUgcGFyYW1ldGVycyBvZiB0aGUgJy1zZXJpYWwnIFFFTVUgb3B0aW9uIGRlc2NyaWJlZCBoZXJlOgorCisgICAgICAgaHR0cDovL3d3dy5ub25nbnUub3JnL3FlbXUvcWVtdS1kb2MuaHRtbCNTRUMxMAorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAiL2Rldi88ZmlsZT4iIChMaW51eCBhbmQgT1MgWCBvbmx5KToKKyAgICAgICAgICAgIGNvbm5lY3QgdG8gYSBob3N0IGNoYXJhY3RlciBkZXZpY2UgZmlsZSAoZS5nLiAvZGV2L3R0eVMwKQorCisgICAgICAgImZpbGU6PGZpbGVuYW1lPiI6CisgICAgICAgICAgICBXcml0ZSBvdXRwdXQgdG8gYSBnaXZlbiBmaWxlICh3cml0ZSBvbmx5KQorCisgICAgICAgInN0ZGlvIjoKKyAgICAgICAgICAgIFN0YW5kYXJkIGlucHV0L291dHB1dAorCisgICAgICAgInVkcDpbPHJlbW90ZV9ob3N0Pl06PHJlbW90ZV9wb3J0PltAWzxzcmNfaXA+XTo8c3JjX3BvcnQ+XSI6CisgICAgICAgICAgICBDb25uZWN0IHRvIGEgVURQIHNvY2tldCBmb3IgYm90aCByZWFkL3dyaXRlLgorCisgICAgICAgInRjcDpbPGhvc3Q+XTo8cG9ydD5bLHNlcnZlcl1bLG5vd2FpdF1bLG5vZGVsYXldIgorICAgICAgICAgICAgQ29ubmVjdCB0byBhIFRDUCBzb2NrZXQgZWl0aGVyIGFzIGEgY2xpZW50IG9yIGEgc2VydmVyLgorCisgICAgICAgICAgICBUaGUgJ25vd2FpdCcgb3B0aW9uIGlzIHVzZWQgdG8gYXZvaWQgd2FpdGluZyBmb3IgYSBjbGllbnQKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uCisKKyAgICAgICAgICAgIFRoZSAnbm9kZWxheScgaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBUQ1AgTmFnbGUgYWxnb3JpdGhtIHRvCisgICAgICAgICAgICBpbXByb3ZlIHRocm91Z2hwdXQuCisKKyAgICBGb3IgQW5kcm9pZCwgYSBmZXcgc3BlY2lhbCBuYW1lcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybmFsCisgICAgaW1wbGVtZW50YXRpb24gYW5kIHJlZGlyZWN0IHRvIHByb2dyYW0gZnVuY3Rpb25zOgorCisgICAgICAgImFuZHJvaWQta21zZyI6CisgICAgICAgICAgICBBIENoYXJEcml2ZXJTdGF0ZSB0aGF0IGlzIHVzZWQgdG8gcmVjZWl2ZSBrZXJuZWwgbG9nIG1lc3NhZ2VzCisgICAgICAgICAgICBmcm9tIHRoZSBlbXVsYXRlZCAvZGV2L3R0eVMwIHNlcmlhbCBwb3J0LgorCisgICAgICAgImFuZHJvaWQtcWVtdWQiOgorICAgICAgICAgICAgQSBDaGFyRHJpdmVyU3RhdGUgdGhhdCBpcyB1c2VkIHRvIGV4Y2hhbmdlIG1lc3NhZ2VzIGJldHdlZW4gdGhlCisgICAgICAgICAgICBlbXVsYXRvciBwcm9ncmFtIGFuZCB0aGUgInFlbXVkIiBtdWx0aXBsZXhpbmcgZGFlbW9uIHRoYXQgcnVucyBpbgorICAgICAgICAgICAgdGhlIGVtdWxhdGVkIHN5c3RlbS4KKworICAgICAgICAgICAgVGhlICJxZW11ZCIgZGFlbW9uIGlzIHVzZWQgdG8gYWxsb3cgb25lIG9yIG1vcmUgY2xpZW50cyBpbiB0aGUKKyAgICAgICAgICAgIHN5c3RlbSB0byBjb25uZWN0IHRvIHZhcmlvdXMgc2VydmljZXMgcnVubmluZyBpbiB0aGUgZW11bGF0b3IKKyAgICAgICAgICAgIHByb2dyYW0uIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gYnlwYXNzIHRoZSBrZXJuZWwgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIGltcGxlbWVudCBjZXJ0YWluIGZlYXR1cmVzIHdpdGggZWFzZS4KKworICAgICAgICAgICAgKHNlZSBkb2NzL0FORFJPSUQtUUVNVUQuVFhUIGZvciBkZXRhaWxzKQorCisgICAgICAgImFuZHJvaWQtZ3NtIjoKKyAgICAgICAgICAgIEEgQ2hhckRyaXZlclN0YXRlIHRoYXQgaXMgdXNlZCB0byBjb25uZWN0IHRoZSBlbXVsYXRlZCBzeXN0ZW0gdG8KKyAgICAgICAgICAgIGEgaG9zdCBtb2RlbSBkZXZpY2Ugd2l0aCB0aGUgLXJhZGlvIDxkZXZpY2U+IG9wdGlvbi4gT3RoZXJ3aXNlLAorICAgICAgICAgICAgdGhlIHN5c3RlbSB1c2VzIHFlbXVkIHRvIGNvbm5lY3QgdG8gdGhlIGVtdWxhdG9yJ3MgaW50ZXJuYWwgbW9kZW0KKyAgICAgICAgICAgIGVtdWxhdGlvbi4KKworICAgICAgICAiYW5kcm9pZC1ncHMiOgorICAgICAgICAgICAgQSBDaGFyRHJpdmVyU3RhdGUgdGhhdCBpcyB1c2VkIHRvIGNvbm5lY3QgdGhlIGVtdWxhdGVkIHN5c3RlbSB0byBhCisgICAgICAgICAgICBob3N0IEdQUyBkZXZpY2Ugd2l0aCB0aGUgLWdwcyA8ZGV2aWNlPiBvcHRpb24uIE90aGVyd2lzZSB0aGUKKyAgICAgICAgICAgIHN5c3RlbSB1c2VzIHFlbXVkIHRvIGNvbm5lY3QgdG8gdGhlIGVtdWxhdG9yJ3MgaW50ZXJuYWwgR1BTCisgICAgICAgICAgICBlbXVsYXRpb24uCisKKworSUkuIENoYXJEcml2ZXJTdGF0ZSB1c2VyczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIGRlc2NyaWJlZCBhYm92ZSwgYSBDaGFyRHJpdmVyU3RhdGUgInVzZXIiIGlzIGEgcGllY2Ugb2YgY29kZSB0aGF0IGNhbiB3cml0ZQordG8gYSBDaGFyRHJpdmVyU3RhdGUgKGJ5IGNhbGxpbmcgcWVtdV9jaHJfd3JpdGUoKSBleHBsaWNpdGVseSkgYW5kIGNhbiBhbHNvCityZWFkIGZyb20gaXQgYWZ0ZXIgcmVnaXN0ZXJpbmcgY2FuX3JlYWQvcmVhZCBoYW5kbGVycyBmb3IgaXQgdGhyb3VnaAorcWVtdV9jaHJfYWRkX2hhbmRsZXJzKCkuCisKK1R5cGljYWwgZXhhbXBsZXMgYXJlIHRoZSBmb2xsb3dpbmc6CisKKyAgLSBUaGUgaGFyZHdhcmUgc2VyaWFsIHBvcnQgZW11bGF0aW9uIChlLmcuIGh3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMpIHdpbGwKKyAgICByZWFkIGRhdGEgZnJvbSB0aGUga2VybmVsIHRoZW4gc2VuZCBpdCB0byBhIENTLiBJdCBhbHNvIHVzZXMgYSBzbWFsbCBidWZmZXIKKyAgICB0aGF0IGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIENTIGFuZCBzZW5kIGl0IGJhY2sgdG8gdGhlIGtlcm5lbC4KKworICAtIFRoZSBBbmRyb2lkIGVtdWxhdGVkIG1vZGVtIGFsc28gdXNlcyBhIENTIHRvIHRhbGsgd2l0aCBpdHMgY2xpZW50LAorICAgIHdoaWNoIHdpbGwgaW4gbW9zdCBjYXNlcyBiZSBhbiBlbXVsYXRlZCBzZXJpYWwgcG9ydC4KKworCitJSUkuIENoYXJCdWZmZXIgb2JqZWN0czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgQW5kcm9pZCBlbXVsYXRvciBwcm92aWRlcyBhbiBvYmplY3QgY2FsbGVkIGEgQ2hhckJ1ZmZlciB3aGljaCBhY3RzIGFzCithIENoYXJEcml2ZXJTdGF0ZSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIGEgKndyaXRlKiBidWZmZXIgdG8gc2VuZCBkYXRhIHRvIGEKK2dpdmVuIENTIG9iamVjdCwgY2FsbGVkIHRoZSBlbmRwb2ludC4gWW91IGNhbiBjcmVhdGUgb25lIHdpdGg6CisKKyAgICAjaW5jbHVkZSAiY2hhcnBpcGUuaCIKKyAgICBDaGFyRHJpdmVyU3RhdGUqICBxZW11X2Nocl9vcGVuX2J1ZmZlciggQ2hhckRyaXZlclN0YXRlKiAgZW5kcG9pbnQgKTsKKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IENTIG9iamVjdCB0aGF0IHdpbGwgYnVmZmVyIGluIHRoZSBoZWFwIGFueSBkYXRhCit0aGF0IGlzIHNlbnQgdG8gaXQsIGJ1dCBjYW5ub3QgYmUgc2VudCB0byB0aGUgZW5kcG9pbnQgeWV0LiBPbiBlYWNoIGV2ZW50IGxvb3AKK2l0ZXJhdGlvbiwgdGhlIENoYXJCdWZmZXIgd2lsbCB0cnkgdG8gc2VuZCBkYXRhIHRvIHRoZSBlbmRwb2ludCB1bnRpbCBpdAorZG9lc24ndCBoYXZlIGFueSBkYXRhIGxlZnQuCisKK1RoaXMgY2FuIGJlIHVzZWZ1bCB0byBzaW1wbGlmeSBjZXJ0YWluIENTIHVzZXJzIHdobyBkb24ndCB3YW50IHRvIG1haW50YWluCit0aGVpciBvd24gZW1pdCBidWZmZXIuIE5vdGUgdGhhdCB3cml0aW5nIHRvIGEgQ2hhckJ1ZmZlciBhbHdheXMgc3VjY2VlZHMuCisKK05vdGUgYWxzbyB0aGF0IGNhbGxpbmcgcWVtdV9jaHJfYWRkX2hhbmRsZXIoKSBvbiB0aGUgQ2hhckJ1ZmZlciB3aWxsIGRvIHRoZQorc2FtZSBvbiB0aGUgZW5kcG9pbnQuIEFueSBlbmRwb2ludC1pbml0aWF0ZWQgY2FsbHMgdG8gY2FuX3JlYWQoKS9yZWFkKCkKK2NhbGxiYWNrcyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHlvdXIgaGFuZGxlciBmdW5jdGlvbnMuCisKKworSVYuIENoYXJQaXBlIG9iamVjdHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEFuZHJvaWQgZW11bGF0b3IgYWxzbyBwcm92aWRlcyBhIGNvbnZlbmllbnQgYWJzdHJhY3Rpb24gY2FsbGVkIGEgImNoYXJwaXBlIgordXNlZCB0byBjb25uZWN0IHR3byBDaGFyRHJpdmVyU3RhdGUgdXNlcnMgdG9nZXRoZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQKK3RvIGNvbm5lY3QgYSBzZXJpYWwgcG9ydCBlbXVsYXRpb24gKGluIGh3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMpIHRvIHRoZQoraW50ZXJuYWwgR1NNIG1vZGVtIGVtdWxhdGlvbiAoc2VlIGFuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmMpLgorCitFc3NlbnRpYWxseSwgYSAiY2hhcnBpcGUiIGlzIGEgYmktZGlyZWN0aW9ubmFsIGNvbW11bmljYXRpb24gcGlwZSB3aG9zZSB0d28KK2VuZHBvaW50cyBhcmUgYm90aCBDUyBvYmplY3RzLiBZb3UgY2FsbCAicWVtdV9jaHJfb3Blbl9waXBlKCkiIHRvIGNyZWF0ZSB0aGUKK3BpcGUsIGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB0d28gZW5kcG9pbnRzIHRvIHlvdToKKworICAgICNpbmNsdWRlICJjaGFycGlwZS5oIgorICAgIGludCAgcWVtdV9jaHJfb3Blbl9waXBlKENoYXJEcml2ZXJTdGF0ZSogKnBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyRHJpdmVyU3RhdGUqICpwc2Vjb25kKTsKKworV2hlbiB5b3Ugd3JpdGUgdG8gb25lIGVuZCBvZiB0aGUgcGlwZSAod2l0aCBxZW11X2Nocl93cml0ZSgpKSwgdGhlIGNoYXJwaXBlIHdpbGwKK3RyeSB0byB3cml0ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUgdG8gdGhlIG90aGVyIGVuZC4gQW55IHJlbWFpbmluZyBkYXRhIGlzIHN0b3JlZAoraW4gYSBoZWFwLWFsbG9jYXRlZCBidWZmZXIuCisKK1RoZSBjaGFycGlwZSB3aWxsIHRyeSB0byByZS1zZW5kIHRoZSBidWZmZXJlZCBkYXRhIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AKK2l0ZXJhdGlvbiBieSBjYWxsaW5nIHRoZSBjYW5fcmVhZC9yZWFkIGZ1bmN0aW9ucyBvZiB0aGUgY29ycmVzcG9uZGluZyB1c2VyLAoraWYgdGhlcmUgaXMgb25lLgorCitOb3RlIHRoYXQgdGhlcmUgaXMgbm8gbGltaXQgb24gdGhlIGFtb3VudCBvZiBkYXRhIGJ1ZmZlcmVkIGluIGEgY2hhcnBpcGUsCithbmQgd3JpdGluZyB0byBpdCBpcyBuZXZlciBibG9ja2luZy4gVGhpcyBzaW1wbGlmaWVzIENoYXJEcml2ZXJTdGF0ZQordXNlcnMgd2hvIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgYnVmZmVyaW5nIGlzc3Vlcy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvZG9jcy9DUFUtRU1VTEFUSU9OLlRYVCBiL2FuZHJvaWQvZG9jcy9DUFUtRU1VTEFUSU9OLlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVhNGJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0NQVS1FTVVMQVRJT04uVFhUCkBAIC0wLDAgKzEsOTEgQEAKK0hPVyBUSEUgUUVNVSBFWEVDVVRJT04gRU5HSU5FIFdPUktTOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RyYW5zbGF0aW5nIEFSTSB0byB4ODYgbWFjaGluZSBjb2RlOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1FFTVUgc3RhcnRzIGJ5IGlzb2xhdGluZyBjb2RlICJmcmFnbWVudHMiIGZyb20gdGhlIGVtdWxhdGVkIG1hY2hpbmUgY29kZS4KK0VhY2ggImZyYWdtZW50IiBjb3JyZXNwb25kcyB0byBhIHNlcmllcyBvZiBBUk0gaW5zdHJ1Y3Rpb25zIGVuZGluZyB3aXRoIGEKK2JyYW5jaCAoZS5nLiBqdW1wcywgY29uZGl0aW9uYWwgYnJhbmNoZXMsIHJldHVybnMpLgorCitFYWNoIGZyYWdtZW50IGlzIHRyYW5zbGF0ZWQgaW50byBhICJ0cmFuc2xhdGVkIGJsb2NrIiAoYS5rLmEuIFRCKSBvZiBob3N0CittYWNoaW5lIGNvZGUgKGUuZy4geDg2KS4gQWxsIFRCcyBhcmUgcHV0IGluIGEgY2FjaGUgYW5kIGVhY2ggdGltZSB0aGUKK2luc3RydWN0aW9uIHBvaW50ZXIgY2hhbmdlcyAoaS5lLiBhdCB0aGUgZW5kIG9mIFRCIGV4ZWN1dGlvbiksIGEgaGFzaAordGFibGUgbG9va3VwIGlzIHBlcmZvcm1lZCB0byBmaW5kIHRoZSBuZXh0IFRCIHRvIGV4ZWN1dGUuCisKK0lmIG5vbmUgZXhpc3RzLCBhIG5ldyBvbmUgaXMgZ2VuZXJhdGVkLiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpdCBpcworc29tZXRpbWVzIHBvc3NpYmxlIHRvICdsaW5rJyB0aGUgZW5kIG9mIGEgZ2l2ZW4gVEIgdG8gdGhlIHN0YXJ0IG9mCithbm90aGVyIG9uZSBieSB0YWNraW5nIGFuIGV4cGxpY2l0IGp1bXAgaW5zdHJ1Y3Rpb24uCisKK05vdGUgdGhhdCBkdWUgdG8gZGlmZmVyZW5jZXMgaW4gdHJhbnNsYXRpb25zIG9mIG1lbW9yeS1yZWxhdGVkIG9wZXJhdGlvbnMKKyhkZXNjcmliZWQgYmVsb3cgaW4gIk1NVSBlbXVsYXRpb24iKSwgdGhlcmUgYXJlIGFjdHVhbGx5IHR3byBUQiBjYWNoZXMgcGVyCitlbXVsYXRlZCBDUFU6IG9uZSBmb3IgdHJhbnNsYXRlZCBrZXJuZWwgY29kZSwgYW5kIG9uZSBmb3IgdHJhbnNsYXRlZAordXNlci1zcGFjZSBjb2RlLgorCitXaGVuIGEgY2FjaGUgZmlsbHMgdXAsIGl0IGlzIHNpbXBseSB0b3RhbGx5IGVtcHRpZWQgYW5kIHRyYW5zbGF0aW9uIHN0YXJ0cworYWdhaW4uCisKK0NQVSBzdGF0ZSBpcyBrZXB0IGluIGEgc2luZ2xlIGdsb2JhbCBzdHJ1Y3R1cmUgd2hpY2ggdGhlIGdlbmVyYXRlZCBjb2RlCitjYW4gYWNjZXNzIGRpcmVjdGx5ICh3aXRoIGRpcmVjdCBtZW1vcnkgYWRkcmVzc2luZykuCisKK1RoZSBmaWxlIHRhcmdldC1hcm0vdHJhbnNsYXRlLmMgaXMgaW4gY2hhcmdlIG9mIHRyYW5zbGF0aW5nIHRoZSBBUk0gb3IKK1RodW1iIGluc3RydWN0aW9ucyBzdGFydGluZyBhdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyIHBvc2l0aW9uCitpbnRvIGEgVEIuIFRoaXMgaXMgZG9uZSBieSBkZWNvbXBvc2luZyBlYWNoIGluc3RydWN0aW9uIGludG8gYSBzZXJpZXMgb2YKK21pY3JvLW9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBUQ0cgY29kZSBnZW5lcmF0b3IuCisKK1RDRyBzdGFuZHMgZm9yICJUaW55IENvZGUgR2VuZXJhdG9yIiBhbmQgaXMgc3BlY2lmaWMgdG8gUUVNVS4gSXQgc3VwcG9ydHMKK3NldmVyYWwgaG9zdCBtYWNoaW5lIGNvZGUgYmFja2VuZHMuIFNlZSBzb3VyY2UgZmlsZXMgdW5kZXIgdGNnLyBmb3IgZGV0YWlscy4KKworCitNTVUgRW11bGF0aW9uOgorLS0tLS0tLS0tLS0tLS0KKworVGhlIEFSTSBNZW1vcnkgTWFuYWdlbWVudCBVbml0IGlzIGVtdWxhdGVkIGluIHNvZnR3YXJlLCBzaW5jZSBpdCBpcyBzbworZGlmZmVyZW50IGZyb20gdGhlIG9uZSBvbiB0aGUgaG9zdC4gRXNzZW50aWFsbHksIGEgc2luZ2xlIEFSTSBtZW1vcnkgbG9hZC9zdG9yZQoraW5zdHJ1Y3Rpb24gaXMgdHJhbnNsYXRlZCBpbnRvIGEgc2VyaWVzIG9mIGhvc3QgbWFjaGluZSBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsCit0cmFuc2xhdGUgdmlydHVhbCBhZGRyZXNzZXMgaW50byBwaHlzaWNhbCBvbmVzIGJ5IHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZzoKKworLSBmaXJzdCBsb29rdXAgaW4gYSBnbG9iYWwgMjU2LWVudHJpZXMgY2FjaGUgZm9yIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNlZSBpZgorICBhIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgYWxyZWFkeSBzdG9yZWQgdGhlcmUuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHVzZSBpdAorICBkaXJlY3RseS4KKworLSBvdGhlcndpc2UsIGNhbGwgYSBzcGVjaWFsIGhlbHBlciBmdW5jdGlvbiB0aGF0IHdpbGwgaW1wbGVtZW50IHRoZSBmdWxsCisgIHRyYW5zbGF0aW9uIGFjY29yZGluZyB0byB0aGUgZW11bGF0ZWQgc3lzdGVtJ3Mgc3RhdGUsIGFuZCBtb2RpZnkgdGhlCisgIGNhY2hlIGFjY29yZGluZ2x5LgorCitUaGUgcGFnZSBjYWNoZSBpcyBjYWxsZWQgdGhlICJUTEIiIGluIHRoZSBRRU1VIHNvdXJjZXMuCisKK05vdGUgdGhhdCB0aGVyZSBhcmUgYWN0dWFsbHkgdHdvIFRMQnM6IG9uZSBpcyB1c2VkIGZvciBob3N0IG1hY2hpbmUKK2luc3RydWN0aW9ucyB0aGF0IGNvcnJlc3BvbmQgdG8ga2VybmVsIGNvZGUsIGFuZCB0aGUgb3RoZXIgZm9yIGluc3RydWN0aW9ucwordHJhbnNsYXRlZCBmcm9tIHVzZXItbGV2ZWwgY29kZS4KKworVGhpcyBtZWFucyB0aGF0IGEgbWVtb3J5IGxvYWQgaW4gdGhlIGtlcm5lbCB3aWxsIG5vdCBiZSB0cmFuc2xhdGVkIGludG8gdGhlCitzYW1lIGluc3RydWN0aW9ucyB0aGFuIHRoZSBzYW1lIGxvYWQgaW4gdXNlciBzcGFjZS4KKworRWFjaCBUTEIgaXMgYWxzbyBpbXBsZW1lbnRlZCBhcyBhIGdsb2JhbCBwZXItZW11bGF0ZWQtQ1BVIGhhc2gtdGFibGUuCitUaGUgdXNlci1sZXZlbCBUTEIgaXMgZmx1c2hlZCBvbiBlYWNoIHByb2Nlc3MgY29udGV4dCBzd2l0Y2guCisKK1doZW4gaW5pdGlhbGl6aW5nIHRoZSBNTVUgZW11bGF0aW9uLCBvbmUgY2FuIGRlZmluZSBzZXZlcmFsIHpvbmVzIG9mIHRoZQorYWRkcmVzcyBzcGFjZSwgd2l0aCBkaWZmZXJlbnQgYWNjZXNzIHJpZ2h0cyAvIHR5cGUuIFRoaXMgaXMgaG93IG1lbW9yeS1tYXBwZWQKK0kvTyBpcyBpbXBsZW1lbnRlZDogdGhlIHZpcnR1YWwtPnBoeXNpY2FsIGNvbnZlcnNpb24gaGVscGVyIGZ1bmN0aW9uIGRldGVjdHMKK3RoYXQgeW91J3JlIHRyeWluZyB0byByZWFkL3dyaXRlIGZyb20gYW4gSS9PIG1lbW9yeSByZWdpb24sIGFuZCB3aWxsIHRoZW4gY2FsbAorYSBjYWxsYmFjayBmdW5jdGlvbiBhc3NvY2lhdGVkIHRvIGl0LgorCisKK0hhcmR3YXJlIEVtdWxhdGlvbjoKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworTW9zdCBoYXJkd2FyZSBlbXVsYXRpb24gY29kZSBpbml0aWFsaXplcyBieSByZWdpc3RlcmluZyBpdHMgb3duIHJlZ2lvbiBvZgorSS9PIG1lbW9yeSwgYXMgd2VsbCBhcyBwcm92aWRpbmcgcmVhZC93cml0ZSBjYWxsYmFja3MgZm9yIGl0LiBUaGVuIGFjdGlvbnMKK3dpbGwgYmUgYmFzZWQgb24gd2hpY2ggb2Zmc2V0IG9mIHRoZSBJL08gbWVtb3J5IGlzIHJlYWQgZnJvbS93cml0dGVuIHRvIGFuZAorZXZlbnR1YWxseSB3aXRoIHdoaWNoIHZhbHVlLgorCitZb3UgY2FuIGhhdmUgYSBsb29rIGF0IGh3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMgdGhhdCBpbXBsZW1lbnRzIGFuCitlbXVsYXRlZCBzZXJpYWwgcG9ydCBmb3IgdGhlIEdvbGRmaXNoIHBsYXRmb3JtLgorCisiR29sZGZpc2giIGlzIHNpbXBseSB0aGUgbmFtZSBvZiB0aGUgdmlydHVhbCBMaW51eCBwbGF0Zm9ybSB1c2VkIHRvIGJ1aWxkCit0aGUgQW5kcm9pZC1lbXVsYXRvci1zcGVjaWZpYyBrZXJuZWwgaW1hZ2UuIFRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZXMgYXJlCitsb2NhdGVkIGluIHRoZSBvcmlnaW4vYW5kcm9pZC1nb2xkZmlzaC0yLjYuMjkgYnJhbmNoIG9mCitodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9rZXJuZWwvZ29sZGZpc2guZ2l0LiBZb3UgY2FuIGhhdmUgYSBsb29rIGF0CithcmNoL2FybS9tYWNoLWdvbGRmaXNoLyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcga2VybmVsIGRyaXZlciBzb3VyY2VzLgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvREVWRUxPUE1FTlQuVFhUIGIvYW5kcm9pZC9kb2NzL0RFVkVMT1BNRU5ULlRYVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTFmYmUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9kb2NzL0RFVkVMT1BNRU5ULlRYVApAQCAtMCwwICsxLDU0NCBAQAorSW50cm9kdWN0aW9uOgorLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50IHByb3ZpZGVzIGltcG9ydGFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQW5kcm9pZAorZW11bGF0b3IgY29kZWJhc2UsIHdoaWNoIHdpbGwgYmUgdXNlZnVsIGZvciBhbnlvbmUgcGxhbm5pbmcgdG8KK2NvbnRyaWJ1dGUgcGF0Y2hlcyB0byBpdC4KKworCitJLiBHZXR0aW5nIHRoZSBzb3VyY2VzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSS4xKSBHZXQgdGhlICdyZXBvJyB0b29sOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitTZWUgaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vc291cmNlL2Rvd25sb2FkaW5nLmh0bWwgZm9yIGRvd25sb2FkIGFuZAoraW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKworSS4yKSBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgQW5kcm9pZCBTdHVkaW8gZGV2ZWxvcG1lbnQgYnJhbmNoOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitTZWUgdGhlIGNvbnRlbnQgb2YgaHR0cDovL3Rvb2xzLmFuZHJvaWQuY29tL2J1aWxkCisKK0FzIG9mIHRoaXMgd3JpdGluZywgdGhlIG1ham9yIGVtdWxhdG9yIGRldmVsb3BtZW50IGhhcHBlbnMgb24gZW11LW1hc3Rlci1kZXYKKworSS4zKSBDaGVja291dCB0aGUgc291cmNlcyB3aXRoICdyZXBvJzoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCisgICAgbWtkaXIgZW11LW1hc3Rlci1kZXYKKyAgICBjZCBlbXUtbWFzdGVyLWRldgorICAgIHJlcG8gaW5pdCAtdSBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9tYW5pZmVzdCBcCisgICAgICAgICAgICAtYiBlbXUtbWFzdGVyLWRldgorICAgIHJlcG8gc3luYworCitSZXBsYWNlICdlbXUtbWFzdGVyLWRldicgd2l0aCBhbm90aGVyIGJyYW5jaCBuYW1lIGlmIG5lY2Vzc2FyeS4KKworCitJSS4gQnVpbGRpbmcgdGhlIGJpbmFyaWVzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSUkuMSkgUHJlYnVpbHQgYmluYXJpZXM6CistIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitCdWlsZGluZyB0aGUgZW11bGF0b3Igbm93IGRlcGVuZHMgb24gbWFueSBwcmVidWlsdCBsaWJyYXJpZXMgdGhhdCBhcmUgc3RvcmVkCit1bmRlciAkVE9QL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkLy4gTm9ybWFsbHksIHlvdSBkb24ndCBuZWVkIHRvCitjYXJlIGFib3V0IHRoZW0sIGJ1dCByZWFkIHRoZSBzZWN0aW9uIGJlbG93IG5hbWVkICJSZWJ1aWxkaW5nIHByZWJ1aWx0cyIKK2ZvciBtb3JlIGluZm9ybWF0aW9uLCBvciBpZiB5b3UgbmVlZCB0byBhZGQgYSBuZXcgZGVwZW5kZW5jeS4KKworSUkuMikgQnVpbGQgdGhlIGVtdWxhdG9yIGJpbmFyaWVzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworQWZ0ZXIgYnVpbGRpbmcgYWxsIHRoZSBkZXBlbmRlbmNpZXMsIGRvOgorCisgIGNkICRUT1AvZXh0ZXJuYWwvcWVtdQorICAuL2FuZHJvaWQvcmVidWlsZC5zaAorCitOb3RlIHRoYXQgYW5kcm9pZC9yZWJ1aWxkLnNoIHdpbGwgYnVpbGQgYWxsIHNvdXJjZXMsIGJ1dCBhbHNvIHJ1biBhIHNtYWxsCitzZXJpZXMgb2YgdW5pdC10ZXN0cyB0byBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgYXMgZXhwZWN0ZWQuIEluIGNhc2UKK29mIHByb2JsZW0sIHVzZSB0aGUgLS12ZXJib3NlIGZsYWcgdG8gc2VlIHdoYXQncyBmYWlsaW5nLgorCitGaW5hbCBiaW5hcmllcyB3aWxsIGJlIGxvY2F0ZWQgdW5kZXIgdGhlICdvYmpzJyBkaXJlY3RvcnkuIFlvdSBjYW4gc2VsZWN0CithIGRpZmZlcmVudCBsb2NhdGlvbiB3aXRoIC0tb3V0LWRpcj08cGF0aD4uCisKK0FsbCBzY3JpcHRzIGF2YWlsYWJsZSB0byBidWlsZCBlbXVsYXRvciBiaW5hcmllcyB0YWtlIGEgLS1oZWxwIG9wdGlvbiB0aGF0CitkZXNjcmliZSB0aGVtIGluIGRldGFpbCwgYW5kIHByb3ZpZGUgYW4gZXhwbGFuYXRpb24gb2YgYWxsIHN1cHBvcnRlZCBvcHRpb25zLgorCitPbiBMaW51eCwgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgV2luZG93cyBiaW5hcmllcyBieSB1c2luZyB0aGUgLS1taW5ndyBvcHRpb24KK2FzIGluOgorCisgIC4vYW5kcm9pZC9yZWJ1aWxkLnNoIC0tbWluZ3cKKworSWYgeW91IGhhdmUgV2luZSBpbnN0YWxsZWQsIGFuZHJvaWQvcmVidWlsZC5zaCB3aWxsIGRldGVjdCBpdCBhbmQgcnVuIHRoZQordW5pdC10ZXN0cyB3aXRoIGl0LgorCitJTVBPUlRBTlQ6IFVuZm9ydHVuYXRlbHksIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHJ1biB0aGUgV2luZG93cyBlbXVsYXRvcgorICAgICAgICAgICBiaW5hcmllcyB1bmRlciBXaW5lIGFueW1vcmUuIFRoaXMgc2VlbXMgcmVsYXRlZCB0byBPcGVuR0wgQVBJCisgICAgICAgICAgIGVtdWxhdGlvbiBpc3N1ZXMgaW4gV2luZS4KKworYW5kcm9pZC9yZWJ1aWxkLnNoIGFsc28gc3VwcG9ydHMgb3RoZXIgaW50ZXJlc3Rpbmcgb3B0aW9ucyAoZS5nLiAtLWRlYnVnIHRvCitnZW5lcmF0ZSBkZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgYmluYXJpZXMpLiBGb3IgYWxsIGRldGFpbHMsIHVzZToKKworICAuL2FuZHJvaWQvcmVidWlsZC5zaCAtLWhlbHAKKworQW5kIHJlYWQgdGhlIG91dHB1dC4KKworCitJSS4zKSBQYWNrYWdpbmcgYmluYXJ5IHJlbGVhc2VzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1lvdSBjYW4gY3JlYXRlIHJlZGlzdHJpYnV0YWJsZSB0YXJiYWxscyBieSB1c2luZzoKKworICBjZCAkVE9QL2V4dGVybmFsL3FlbXUKKyAgYW5kcm9pZC9zY3JpcHRzL3BhY2thZ2UtcmVsZWFzZS5zaAorCitUaGlzIHdpbGwgY3JlYXRlIC90bXAvYW5kcm9pZC1lbXVsYXRvci08ZGF0ZT4tPHN5c3RlbT4udGFyLmJ6MiBjb250YWluaW5nCithbGwgYmluYXJpZXMsIHJlYWR5IHRvIGJlIHVuY29tcHJlc3NlZCBpbnRvIGFuIEFuZHJvaWQgU0RLIGluc3RhbGxhdGlvbgorZGlyZWN0b3J5LgorCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVwZGF0ZSB0aGUgcHJlYnVpbHQgYmluYXJpZXMgdGhhdCBhcmUgc3RvcmVkIGluCithbiBBT1NQIGNoZWNrb3V0IHVuZGVyOgorCisgICAkQU9TUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci8KKworVGhlc2UgYXJlIHRoZSBiaW5hcmllcyB0aGF0IGFyZSBsYXVuY2hlZCB3aGVuIHlvdSB0eXBlICdlbXVsYXRvcicganVzdAorYWZ0ZXIgYSBwbGF0Zm9ybSBidWlsZCwgaW4gdGhlIHJvb3QgQU9TUCBkaXJlY3RvcnkuCisKK1RvIHVwZGF0ZSB0aGVtLCBkbzoKKworICBhbmRyb2lkL3NjcmlwdHMvcGFja2FnZS1yZWxlYXNlLnNoICAtLWNvcHktcHJlYnVpbHRzPS9wYXRoL3RvL2Fvc3AKKworTm90ZSB0aGF0IHRoaXMgYWxzbyBjcmVhdGVzIGEgUkVBRE1FIGZpbGUgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkgdGhhdAorZGVzY3JpYmVzIHRoZSBnaXQgbG9nIG9mIGVhY2ggc291cmNlIGdpdCB0cmVlIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZS4KKworCitJSS40KSBSZW1vdGUgZGFyd2luIGJ1aWxkczoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgc2NyaXB0cyBkZXNjcmliZSBhYm92ZSB3b3JrIG9uIExpbnV4IGFuZCBEYXJ3aW4gc3lzdGVtcyBvbmx5LgorCitPbiBMaW51eCwgYmluYXJpZXMgZm9yIGJvdGggTGludXggYW5kIFdpbmRvd3MgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LgorCitZb3UgY2FuIGhvd2V2ZXIgYnVpbGQgRGFyd2luIGJpbmFyaWVzIGZyb20gTGludXgsIHByb3ZpZGVkIHRoYXQgeW91IGhhdmUKK2EgRGFyd2luIG1hY2hpbmUgYXZhaWxhYmxlIHRocm91Z2ggU1NILiBUbyBkbyB0aGF0LCBkbyBlaXRoZXIgb25lIG9mIHRoZQorZm9sbG93aW5nOgorCisgIC0gU2V0IEFORFJPSURfRU1VTEFUT1JfREFSV0lOX1NTSD08aG9zdG5hbWU+IGluIHlvdXIgZW52aXJvbm1lbnQuCisgIC0gVXNlIC0tZGFyd2luLXNzaD08aG9zdG5hbWU+IHdoZW4gY2FsbGluZyBvbmUgb2YgdGhlIGJ1aWxkIHNjcmlwdHMuCisKK0l0IGlzIHJlY29tbWVuZGVkIHRvIGFsd2F5cyB1c2UgdGhpcyB3aGVuIHVzaW5nIHBhY2thZ2UtcmVsZWFzZS5zaCwgdGhpcworbWFrZXMgaXQgYW4gaWRlYWwgd2F5IHRvIGNoZWNrIHRoYXQgYSBzb3VyY2UgY29kZSBjaGFuZ2UgYWN0dWFsbHkgY29tcGlsZXMKK2ZvciBhbGwgMyBob3N0IHBsYXRmb3Jtcy4KKworCitJSS41KSBTcGVlZGluZyB1cCBidWlsZHMgd2l0aCAnY2NhY2hlJzoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCB0aGUgJ2NjYWNoZScgYnVpbGQgdG9vbCBvbiB5b3VyIGRldmVsb3BtZW50CittYWNoaW5lKHMpLiBUaGUgQW5kcm9pZCBlbXVsYXRvciBidWlsZCBzY3JpcHRzIHdpbGwgcHJvYmUgZm9yIGl0IGFuZCB1c2UgaXQKK2lmIGF2YWlsYWJsZSwgd2hpY2ggY2FuIHNwZWVkIHVwIGluY3JlbWVudGFsIGJ1aWxkcyBjb25zaWRlcmFibHkuCisKK0J1aWxkIHNjcmlwdHMgYWxzbyBzdXBwb3J0IHRoZSAtLWNjYWNoZT08cHJvZ3JhbT4gYW5kIC0tbm8tY2NhY2hlIG9wdGlvbnMgdG8KK2JldHRlciBjb250cm9sIGNjYWNoZSB1c2FnZS4KKworCisKK0lJSS4gVGVzdGluZzoKKy0tLS0tLS0tLS0tLS0KKworSUlJLjEpIFVuaXQtdGVzdGluZzoKKy0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCisuL2FuZHJvaWQvcmVidWlsZC5zaCBhbHJlYWR5IHJ1bnMgYSBzbWFsbCBzZXQgb2YgdW5pdCB0ZXN0IHByb2dyYW1zIGFuZAordmVyaWZpY2F0aW9uIGNoZWNrcy4gSWYgdGhleSBmYWlsLCBpdCB3aWxsIHByaW50IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgaXQuCisKK01vc3QgdW5pdC10ZXN0cyBhcmUgaW4gQysrIGFuZCB1c2UgdGhlIEdvb2dsZVRlc3QgbGlicmFyeS4gV2hlbmV2ZXIgeW91IGFkZAorYSBuZXcgQW5kcm9pZC1zcGVjaWZpYyBmZWF0dXJlIHRvIHRoZSBjb2RlIGJhc2UsIHRoYXQgZG9lc24ndCBkaXJlY3RseQorbW9kaWZpZXMgdGhlIFFFTVUtYmFzZWQgY29kZSwgYWRkIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyB0byBhdm9pZAorcmVncmVzc2lvbnMgaW4gdGhlIGZ1dHVyZS4KKworCitJSUkuMikgQm9vdGluZyBleGlzdGluZyBBVkRzOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworT3RoZXJ3aXNlLCBhIHNpbXBsZSB3YXkgdG8gdGVzdCBhIGVtdWxhdG9yIGNvZGUgY2hhbmdlIGlzIHRyeWluZyB0byBib290IGFuCitleGlzdGluZyBBVkQsIGJ5IGRvaW5nIHRoZSBmb2xsb3dpbmcgYWZ0ZXIgY2FsbGluZyBhbmRyb2lkL3JlYnVpbGQuc2g6CisKKyAgIGV4cG9ydCBBTkRST0lEX1NES19ST09UPS9wYXRoL3RvL2luc3RhbGxlZC9hbmRyb2lkL3NkaworICAgb2Jqcy9lbXVsYXRvciA8eW91ci1vcHRpb25zPgorCitJSUkuMykgQm9vdGluZyBhbiBBbmRyb2lkIHBsYXRmb3JtIGJ1aWxkOgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB0cnkgYm9vdGluZyBhbiBBbmRyb2lkIHN5c3RlbSBpbWFnZSBidWlsdCBmcm9tIGEgZnJlc2gKK0FPU1AgcGxhdGZvcm0gY2hlY2tvdXQuIE9uZSBoYXMgdG8gc2VsZWN0IGFuIGVtdWxhdG9yLWNvbXBhdGlibGUgYnVpbGQgcHJvZHVjdCwKK2UuZy46CisKKyAgIGNkICRBT1NQLworICAgLiBidWlsZC9lbnZzZXR1cC5zaAorICAgbHVuY2ggYW9zcF9hcm0tdXNlcmRlYnVnCisgICBtYWtlIC1qOAorCitSZWNvbW1lbmRlZCBidWlsZCBwcm9kdWN0cyBhcmUgJ2Fvc3BfPGNwdT4tdXNlcmRlYnVnJyBvciAnYW9zcF88Y3B1Pi1lbmcnLAord2hlcmUgPGNwdT4gY2FuIGJlIG9uZSBvZiAnYXJtJywgJ3g4NicsICdtaXBzJywgJ3g4Nl82NCcsICdhcm02NCcgb3IgJ21pcHM2NCcuCisKK1RvIGJvb3QgdGhlIGdlbmVyYXRlZCBzeXN0ZW0gaW1hZ2U6CisKKyAgIGNkICRUT1AvZXh0ZXJuYWwvcWVtdQorICAgLi9hbmRyb2lkL3JlYnVpbGQuc2gKKyAgIGV4cG9ydCBBTkRST0lEX0JVSUxEX1RPUD0vcGF0aC90by9hb3NwCisgICBvYmpzL2VtdWxhdG9yIDx5b3VyLW9wdGlvbnM+CisKKworSVYuIE92ZXJhbGwgc291cmNlIGxheW91dDoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lWLjEpIENvbW1vbiBBbmRyb2lkLWVtdWxhdGlvbiByZWxhdGVkIHNvdXJjZXM6CistIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGNvbnRhaW4gZ2VuZXJpYyBsaWJyYXJpZXMgdXNlZCBmb3IgQW5kcm9pZAorZW11bGF0aW9uLiBCeSAnZ2VuZXJpYycsIGl0IGlzIG1lYW50IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlcworZG8gbm90IGRlcGVuZCBvbiBhIHNwZWNpZmljIGVtdWxhdGlvbiBlbmdpbmUgKGUuZy4gUUVNVTEgb3IgUUVNVTIgYXMKK2Rlc2NyaWJlZCBiZWxvdykuCisKK1VuZGVyICRUT1AvZXh0ZXJuYWwvcWVtdS8gdGhleSBhcmUgbG9jYXRlZCBhdDoKKworICBhbmRyb2lkL2FuZHJvaWQtZW11LworICAgIEFuZHJvaWQtc3BlY2lmaWMgY29kZSwgdXNlZCB0byBpbXBsZW1lbnQgYSBVSSBhbmQgZnVuY3Rpb25hbCBsYXllciBvbgorICAgIHRvcCBvZiB0aGUgUUVNVSBjb2RlIGJhc2UuIElkZWFsbHksIGFueXRoaW5nIHRoYXQgc2hvdWxkbid0IGltcGFjdCB0aGUKKyAgICBRRU1VIGludGVybmFscyBzaG91bGQgYmUgaGVyZS4KKworICBhbmRyb2lkL2FuZHJvaWQtZW11Z2wvCisgICAgQW5kcm9pZC1zcGVjaWZpYyBHUFUgZW11bGF0aW9uIGxpYnJhcnksIGFsc28gY2FsbGVkICJFbXVHTCIuCisgICAgUmVhZCB0aGUgREVTSUdOLlRYVCBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uCisgICAgb24gaXRzIGRlc2lnbiBhbmQgaG93IGl0IGlzIHVzZWQgYXQgcnVudGltZS4gQWxzbyByZWFkCisgICAgYW5kcm9pZC9kb2NzL0dQVS1FTVVMQVRJT04uVFhULgorCisgIGFuZHJvaWQvdGhpcmRfcGFydHkvCisgICAgQ29udGFpbnMgdmFyaW91cyB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgYnVpbGQgc2NyaXB0cyBhbmQvb3Igc291cmNlcyB0aGF0CisgICAgdGhlIEFuZHJvaWQgZW11bGF0aW9uIGxpYnJhcmllcyBkZXBlbmQgb24gKGUuZy4gemxpYiwgbGlicG5nLCBsaWJTREwpLgorCisKK0lWLjEpICJDbGFzc2ljIiBlbXVsYXRvciBzb3VyY2UgbGF5b3V0OgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtCisKK1RoZSAnY2xhc3NpYycgZW11bGF0b3IgcHJvZ3JhbXMgYXJlIHVzZWQgdG8gcnVuIGxlZ2FjeSBBbmRyb2lkIFNESyBzeXN0ZW0KK2ltYWdlcyAoZnJvbSBDdXBjYWtlIHRvIExvbGxpcG9wKSBhbmQgYXJlIGJhc2VkIG9uIGEgdmVyeSBhbmNpZW50IHZlcnNpb24gb2YKK1FFTVUxICgxLjEwKSB0aGF0IGhhcyBiZWVuIGRyYXN0aWNhbGx5IHBhdGNoZWQgYW5kIGFsdGVyZWQuCisKK0l0cyBzb3VyY2VzIGxpZSB1bmRlciAkVE9QL2V4dGVybmFsL3FlbXUvYW5kcm9pZC9xZW11MS8sIHdpdGggdGhlIGZvbGxvd2luZworaW1wb3J0YW50IHN1Yi1kaXJlY3RvcmllczoKKworICBhbmRyb2lkLXFlbXUxLWdsdWUvCisgICAgR2x1ZSBjb2RlIGJldHdlZW4gUUVNVTEgYW5kIHRoZSBBbmRyb2lkIGVtdWxhdGlvbiBsaWJyYXJpZXMuIElkZWFsbHksCisgICAgaXQgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgY29kZSB0aGF0IGlzIHN1cHBvc2VkIHRvIGtub3cgYWJvdXQgYm90aAorICAgIGFuZHJvaWQvYW5kcm9pZC1lbXUvIGFuZCBhbmRyb2lkL3FlbXUxLyBhdCB0aGUgc2FtZSB0aW1lLgorICAgIChJbiBwcmFjdGljZSBzb21lIG9mIHRoZSBhbmRyb2lkL3FlbXUxLyBpbmNsdWRlcyBhbmRyb2lkL2FuZHJvaWQtZW11LworICAgIGhlYWRlcnMgZGlyZWN0bHksIGJ1dCBzaW5jZSB0aGlzIGlzIGEgbW9zdGx5LWRlcHJlY2F0ZWQgdmVyc2lvbiBvZgorICAgIFFFTVUsIHdlIGRvbid0IHJlYWxseSBib3RoZXIgYWJvdXQgY2xlYW5pbmcgdGhpcyB1cCkuCisKKyAgaW5jbHVkZS9ody9hbmRyb2lkL2dvbGRmaXNoLworICAgIEhlYWRlcnMgZm9yIHRoZSBBbmRyb2lkLXNwZWNpZmljIGdvbGRmaXNoIHZpcnR1YWwgZGV2aWNlcy4KKyAgICBTZWUgZG9jcy9HT0xERklTSC1WSVJUVUFMLVBMQVRGT1JNLlRYVCBmb3IgbW9yZSBkZXRhaWxzLgorCisgIGh3L2FuZHJvaWQvZ29sZGZpc2gvCisgICAgSW1wbGVtZW50YXRpb24gZmlsZXMgZm9yIHRoZSBBbmRyb2lkLXNwZWNpZmljIGdvbGRmaXNoIHZpcnR1YWwgZGV2aWNlcy4KKworICBody9hbmRyb2lkLworICAgIEltcGxlbWVudGF0aW9uIGZpbGVzIGZvciB0aGUgQW5kcm9pZC1zcGVjaWZpYyB2aXJ0dWFsIEFSTSBhbmQgTUlQUworICAgIGJvYXJkcy4gRm9yIHg4NiwgdGhlIGNvbnRlbnQgb2YgaHcvaTM4Ni9wYy5jIHdhcyBtb2RpZmllZCBpbnN0ZWFkLgorCisgIHNsaXJwLWFuZHJvaWQvCisgICAgTW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgc2xpcnAvIGRpcmVjdG9yeSwgd2hpY2ggYWRkcyB2YXJpb3VzIEFuZHJvaWQtc3BlY2lmaWMKKyAgICBmZWF0dXJlcyBhbmQgbW9kaWZpY2F0aW9ucy4KKworR2VuZXJhbGx5IHNwZWFraW5nLCBzb21lIFFFTVUgc291cmNlIGZpbGVzIGhhdmUgYmVlbiByZXdyaXR0ZW4gaW4gc28gc2lnbmZpY2FudAord2F5cyB0aGF0IHRoZXkgZ2FpbmVkIGFuIC1hbmRyb2lkIHByZWZpeCAoZS5nLiB2bC1hbmRyb2lkLmMgdmVyc3VzIHZsLmMpLiBUaGUKK29yaWdpbmFsIGZpbGUgaXMgdHlwaWNhbGx5IGtlcHQgYXMgYSByZWZlcmVuY2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gc2VlCittb2RpZmljYXRpb25zIGFuZCBldmVudHVhbGx5IGludGVncmF0ZSB1cHN0cmVhbSBjaGFuZ2VzLgorCitOb3RlIHRoYXQgdGhlc2Ugc291cmNlcyBhcmUgY29uc2lkZXJlZCAnbGVnYWN5JywgaS5lLiB0aGVyZSBpcyBubyBlZmZvcnQgdG8KK3BvcnQgQW5kcm9pZC1zcGVjaWZpYyBjaGFuZ2VzIGhlcmUgdG8gdXBzdHJlYW0gUUVNVS4KKworCitJVi4yKSBOZXcgJ3FlbXUyJyBlbXVsYXRvciBzb3VyY2UgbGF5b3V0OgorLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLQorCitUaGUgJ25ldycgZW11bGF0b3IgcHJvZ3JhbXMgYXJlIHVzZWQgdG8gcnVuIG1vcmUgdmVyc2lvbiBBbmRyb2lkIHN5c3RlbSBpbWFnZXMKKyhlLmcuIExvbGxpcG9wIG9uIDY0LWJpdCBBUk0gQ1BVcyksIGFuZCBhcmUgYmFzZWQgb24gYSBtdWNoIG1vcmUgcmVjZW50IHZlcnNpb24KK29mIHVwc3RyZWFtIFFFTVUgKDIuNy4wIGF0IHRoaXMgdGltZSksIHdoaWNoIGhhcyBiZWVuIHNsaWdodGx5IG1vZGlmaWVkIHdpdGgKK0FuZHJvaWQtc3BlY2lmaWMgY2hhbmdlcy4KKworVGhlIHNvdXJjZXMgYXJlIHVuZGVyICRUT1AvZXh0ZXJuYWwvcWVtdS8sIGFuZCBtYXRjaCB0aGUgdXBzdHJlYW0gUUVNVSBzb3VyY2UKK3RyZWUgbGF5b3V0LCB0byBlYXNlIGZ1dHVyZSByZWJhc2VzIGFuZCBjaGVycnktcGlja3Mgb2YgdXBzdHJlYW0gZml4ZXMuIFRoaXMKK2lzIHdoeSBhbGwgb3RoZXIgc291cmNlcyBhcmUgdW5kZXIgJFRPUC9leHRlcm5hbC9xZW11L2FuZHJvaWQvIHRvby4KKworTm90ZSB0aGF0IHRoZXNlIHNvdXJjZXMgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmViYXNlZCBvbiB0b3Agb2YgdXBzdHJlYW0gUUVNVQorY2hhbmdlcyAvIHJlbGVhc2VzLiBJdCBpcyBvdXIgZ29hbCB0byB1bHRpbWF0ZWx5IHNlbmQgcGF0Y2hlcyB1cHN0cmVhbSB0bworZW5hYmxlIEFuZHJvaWQgc3VwcG9ydCBpbiBRRU1VLCBidXQgdGhpcyBpcyBsb3dlciBwcmlvcml0eSB0YXNrIGNvbXBhcmVkIHdpdGgKK2dldHRpbmcgdGhpbmdzIHRvIHdvcmsuCisKK09uZSBvZiB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgY2xhc3NpYyBhbmQgbmV3IGNvZGUgYmFzZXMgaXMgdGhhdAordGhleSBkbyBub3Qgc3VwcG9ydCB0aGUgc2FtZSB2aXJ0dWFsIGhhcmR3YXJlLgorCistIFRoZSBjbGFzc2ljIGVtdWxhdG9yIHN1cHBvcnRzIHRoZSAnZ29sZGZpc2gnIHZpcnR1YWwgcGxhdGZvcm0uCisgIFNlZSBkb2NzL0dPTERGSVNILVZJUlRVQUwtSEFSRFdBUkUuVFhUIGZvciBhIGZ1bGwgZGVzY3JpcHRpb24uCisKKy0gVGhlIG5ldyBlbXVsYXRvciBzdXBwb3J0cyB0aGUgJ3JhbmNodScgdmlydHVhbCBwbGF0Zm9ybSwgd2hpY2ggaXMgYW4KKyAgZXZvbHV0aW9uIG9mICdnb2xkZmlzaCcgdGhhdCByZXBsYWNlcyBOQU5EIGFuZCBNTUMgZGV2aWNlcyB3aXRoCisgIHZpcnRpby1ibG9jayBpbnN0ZWFkLCBhcyB3ZWxsIGFzIGEgZmV3IG90aGVyIGRpZmZlcmVuY2VzLgorCitOT1RFOiAncmFuY2h1JyBpcyBzdGlsbCBhIHdvcmsgaW4gcHJvZ3Jlc3MgYW5kIGlzbid0IGNvbXBsZXRlbHkgZG9jdW1lbnRlZAorICAgICAgeWV0LCBmb3IgZnVsbCBkZXRhaWxzLCBvbmUgc2hvdWxkIHJlZmVyIHRvIHRoZSBzb3VyY2VzIHVuZGVyCisgICAgICBleHRlcm5hbC9xZW11IGFzIHdlbGwgYXMgdGhlIGFuZHJvaWQtZ29sZGZpc2gtMy4xMCBicmFuY2gKKyAgICAgIGZvdW5kIG9uIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL2tlcm5lbC9nb2xkZmlzaC5naXQKKworCitWKSBPdmVydmlldyBvZiBhbGwgYmluYXJpZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBBbmRyb2lkIGVtdWxhdG9yIGlzIHJlYWxseSBtYWRlIG9mIHNldmVyYWwgYmluYXJpZXMgdGhhdCB3b3JrIHRvZ2V0aGVyCit0byBpbXBsZW1lbnQgYWxsIHJlcXVpcmVkIGVtdWxhdGlvbiBmZWF0dXJlcy4gVGhpcyBpcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uCitvZiB0aGVtOgorCisgIC0gVGhlICdlbXVsYXRvcicgcHJvZ3JhbSBsYXVuY2hlciwgd2hpY2ggaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgdG8KKyAgICBsYXVuY2ggYSB2aXJ0dWFsIEFuZHJvaWQgZGV2aWNlIChBVkQpLiBUeXBpY2FsbHkgbG9jYXRlZCB1bmRlcjoKKworICAgICAgICAkRVhFQ19ESVIvZW11bGF0b3IKKworICAgIFRoZSByb2xlIG9mIHRoaXMgdGlueSBwcm9ncmFtIGlzIHRvIHJlYWQgdGhlIEFWRCdzIGNvbmZpZ3VyYXRpb24sIGFuZAorICAgIGRldmljZSB3aGljaCBzcGVjaWZpYyBlbXVsYXRpb24gZW5naW5lIHByb2dyYW0gdG8gcnVuIChzZWUgYmVsb3cpLiBJdCBtdXN0CisgICAgYWxzbyBzZXR1cCB0aGUgZW52aXJvbm1lbnQgdG8gZW5zdXJlIHRoYXQgR1BVIGVtdWxhdGlvbiBsaWJyYXJpZXMgYXJlCisgICAgcHJvcGVybHkgbG9hZGVkIHdoZW4gbmVlZGVkICh3aGljaCB0eXBpY2FsbHkgaW52b2x2ZXMgbW9kaWZ5aW5nCisgICAgTERfTElCUkFSWV9QQVRIIG9uIFBvc2l4IHN5c3RlbXMsIGFuZCBQQVRIIG9uIFdpbmRvd3MpLgorCisgIC0gQ1BVLXNwZWNpZmljICJjbGFzc2ljIiAoYS5rLmEgUUVNVTEpIGVtdWxhdGlvbiBlbmdpbmVzLCB3aGljaCBhcmUKKyAgICBpbmRlcGVuZGVudCBwcm9ncmFtIHRoYXQgY2FuIGVtdWxhdGUgYSBzaW5nbGUgdmlydHVhbCBDUFUuIDMyLWJpdAorICAgIGFuZCA2NC1iaXQgdmVyc2lvbnMgYXJlIHR5cGljYWxseSBhdmFpbGFibGUsIGFuZCBhcmUgY2FsbGVkIGJ5CisgICAgJ2VtdWxhdG9yJyBiYXNlZCBvbiBBVkQgY29uZmlndXJhdGlvbiwgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgJEVYRUNfRElSL2VtdWxhdG9yLWFybSAgIC0+CisgICAgICAgICAgICAgICAgMzItYml0IGhvc3QgcHJvZ3JhbSB0byBlbXVsYXRlIDMyLWJpdCBBUk0gQ1BVcy4KKworICAgICAgICAkRVhFQ19ESVIvZW11bGF0b3IteDg2ICAgLT4KKyAgICAgICAgICAgICAgICAzMi1iaXQgaG9zdCBwcm9ncmFtIHRvIGVtdWxhdGUgMzItYml0IHg4NiBhbmQKKyAgICAgICAgICAgICAgICA2NC1iaXQgeDg2XzY0IENQVXMuCisKKyAgICAgICAgJEVYRUNfRElSL2VtdWxhdG9yNjQtYXJtIC0+CisgICAgICAgICAgICAgICAgNjQtYml0IGhvc3QgcHJvZ3JhbSB0byBlbXVsYXRlIDMyLWJpdCBBUk0gQ1BVcy4KKworICAgIFRoZXNlIGFyZSB0YWdnZWQgYXMgImNsYXNzaWMiIGJlY2F1c2UgdGhleSBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlCisgICAgc291cmNlcyB1bmRlciBleHRlcm5hbC9xZW11L2FuZHJvaWQvcWVtdTEsIGFuZCBjYW4gYmUgdXNlZCB0byBlbXVsYXRlIG9sZAorICAgIEFuZHJvaWQgc3lzdGVtIGltYWdlcyAoZS5nLiBhbnl0aGluZyBiZWZvcmUgdGhlIEwgcmVsZWFzZSkuCisKKyAgLSBDUFUtc3BlY2lmaWMgIm5ld2VyIiBRRU1VMiBlbXVsYXRpb24gZW5naW5lcywgYmFzZWQgb24gYSBuZXdlciB2ZXJzaW9uCisgICAgb2YgUUVNVSAoMi4yLjApLCBsb2NhdGVkIHVuZGVyOgorCisgICAgICAgICRFWEVDX0RJUi9xZW11LyRIT1NUX1NZU1RFTS9xZW11LXN5c3RlbS0kQVJDSAorCisgICAgV2hlcmUgJEhPU1RfU1lTVEVNIGlzIGEgaG9zdCBzeXN0ZW0gdGFnIChlLmcuIGxpbnV4LXg4Nl82NCksIGFuZCAkQVJDSAorICAgIGlzIGEgdmlydHVhbCBjcHUgbmFtZSwgZm9sbG93aW5nIFFFTVUgY29udmVudGlvbiAoZS5nLiAnYWFyY2g2NCcgZm9yCisgICAgNjQtYml0IEFSTSBDUFVzKS4KKworICAgIFRoZXkgYXJlIGJ1aWx0IGJ5IGFuZHJvaWQvcmVidWlsZC5zaCBmcm9tIHRoZSBzb3VyY2VzIHVuZGVyCisgICAgZXh0ZXJuYWwvcWVtdS8gdGhhdCBhcmUgX25vdF8gdW5kZXIgZXh0ZXJuYWwvcWVtdS9hbmRyb2lkLy4KKworICAgIE5vdGUgdGhhdCB0aGVzZSBhcmUgc2xpZ2h0bHktbW9kaWZpZWQgUUVNVSBwcm9ncmFtcywgYW5kIHRodXMgYWNjZXB0CisgICAgZW11bGF0b3Itc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbnMsIG5vdCB0aGUgb3JpZ2luYWwgUUVNVSBvbmVzLgorCisgIC0gR1BVIEVtdWxhdGlvbiBsaWJyYXJpZXMsIHdoaWNoIGltcGxlbWVudCBndWVzdCBFR0wvR0xFUyB0byBkZXNrdG9wIEdMCisgICAgdHJhbnNsYXRpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQgR1BVIGVtdWxhdGlvbiBtb2RlIGFsc28ga25vd24gYXMgJ2hvc3QnCisgICAgbW9kZS4gVGhlIGZpbGVzIGFyZToKKworICAgICAgICAkRVhFQ19ESVIvbGliLyAgICAgICAgICAgICAgICAgICAgLT4gZm9yIDMyLWJpdCBob3N0IHByb2dyYW1zLgorICAgICAgICAgICAgICAgIGxpYk9wZW5nbFJlbmRlci5zbworICAgICAgICAgICAgICAgIGxpYkVHTF90cmFuc2xhdG9yLnNvCisgICAgICAgICAgICAgICAgbGliR0xFU19DTV90cmFuc2xhdG9yLnNvCisgICAgICAgICAgICAgICAgbGliR0xFU3YyX3RyYW5zbGF0b3Iuc28KKworICAgICAgICAkRVhFQ19ESVIvbGliNjQvICAgICAgICAgICAgICAgICAgLT4gZm9yIDY0LWJpdCBob3N0IHByb2dyYW1zLgorICAgICAgICAgICAgICAgIGxpYjY0T3BlbmdsUmVuZGVyLnNvCisgICAgICAgICAgICAgICAgbGliNjRFR0xfdHJhbnNsYXRvci5zbworICAgICAgICAgICAgICAgIGxpYjY0R0xFU19DTV90cmFuc2xhdG9yLnNvCisgICAgICAgICAgICAgICAgbGliNjRHTEVTdjJfdHJhbnNsYXRvci5zbworCisgICAgVGhlIGxpYnJhcmllcyBhcmUgbG9hZGVkIGJ5IHRoZSBlbXVsYXRpb24gZW5naW5lIHByb2dyYW1zIHdoZW4gbmVlZGVkCisgICAgKGkuZS4gaWYgdGhlIEFWRCBoYXMgJ2h3LmdwdS5lbmFibGVkJyBzZXQgdG8gJ3llcycpLiBJbiBwYXJ0aWN1bGFyLAorICAgIHRoZSAnZW11bGF0b3InIGxhdW5jaGVyIHRha2VzIGNhcmUgb2YgYWRkaW5nIGVpdGhlciAkRVhFQ19ESVIvbGliLworICAgIG9yICRFWEVDX0RJUi9saWI2NC8gdG8gTERfTElCUkFSWV9QQVRIIChvciBQQVRIIG9uIFdpbmRvd3MpIGJlZm9yZQorICAgIGxhdW5jaGluZyB0aGUgcmVhbCBlbXVsYXRpb24gZW5naW5lLgorCisgICAgVGhlcmUgaXMgYWxzbyB0aGUgcG9zc2liaWxpdHkgb2Ygc3VwcG9ydGluZyBhZGRpdGlvbmFsIEdQVSBlbXVsYXRpb24KKyAgICBtb2RlcywgdGhyb3VnaCBvcHRpb25hbCAnYmFja2VuZHMnLiBGb3IgZXhhbXBsZSwgdGhlICdtZXNhJyBiYWNrZW5kCisgICAgaXMgdXNlZCB0byBwZXJmb3JtIHNvZnR3YXJlLWJhc2VkIE9wZW5HTCByZW5kZXJpbmcsIGFuZCBjYW4gYmUgYWN0aXZhdGVkCisgICAgYnkgdXNpbmcgJy1ncHUgbWVzYScgb3Igc2V0dGluZyAnaHcuZ3B1Lm1vZGUnIHRvICdtZXNhJyBpbiB0aGUgQVZECisgICAgY29uZmlndXJhdGlvbi4KKworICAgIFRoZSBmaWxlcyBvZiBhIGdpdmVuIGJhY2tlbmQgPG5hbWU+IG11c3QgYmUgdW5kZXI6CisKKyAgICAgICAgJEVYRUNfRElSL2xpYi9nbGVzXzxuYW1lPi8gb3IKKyAgICAgICAgJEVYRUNfRElSL2xpYjY0L2dsZXNfPG5hbWU+LworCisgICAgRm9yIG1vcmUgZGV0YWlscywgc2VlIGRvY3MvR1BVLUVNVUxBVElPTi5UWFQKKworICAtIFRoZSAncXVlcnkgYW5zd2VyaW5nIG1hY2hpbmUnLCBhIHNtYWxsIGFwcGxpY2F0aW9uIHdoaWNoIG9ubHkgcHVycG9zZSBpcworICAgIHRvIGFuc3dlciBxdWVyaWVzIGZyb20gQW5kcm9pZCBTdHVkaW86CisKKyAgICAgICAgJEVYRUNfRElSL2VtdWxhdG9yLWNoZWNrCisKKyAgICBDdXJyZW50bHkgdGhlIG9ubHkgcGFyYW1ldGVyIGlzICctYWNjZWwnLCB3aGljaCByZXR1cm5zIHRoZSBzdGF0dXMgb2YKKyAgICB0aGUgaHlwZXJ2aXNvciBzdXBwb3J0IG9uIHRoZSBjdXJyZW50IG1hY2hpbmUgKGlmIGVtdWxhdG9yIGNhbiB1c2UKKyAgICBoYXJkd2FyZSBhY2NlbGVyYXRpb24pLgorCitWSS4gUmVidWlsZGluZyBwcmVidWlsdCBiaW5hcmllczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZW11bGF0b3IgcHJlYnVpbHQgYmluYXJpZXMgYXJlIHN0b3JlZCBpbiBnaXQgcmVwb3NpdG9yaWVzIHVuZGVyOgorCisgICRUT1AvcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3ItYnVpbGQvCisKK0luIHBhcnRpY3VsYXIsIHRoaXMgY29udGFpbnMgYW4gJ2FyY2hpdmUnIHN1Yi1kaXJlY3Rvcnk6CisKKyAgJFRPUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci1idWlsZC9hcmNoaXZlLworICAgICAgIEEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBQQUNLQUdFUy5UWFQgZmlsZSBkZXNjcmliaW5nIGFsbCBzb3VyY2UKKyAgICAgICB0YXJiYWxscyBuZWVkZWQgdG8gcmVidWlsZCB0aGUgcHJlYnVpbHRzIGZyb20gc2NyYXRjaC4gVGhlIGRpcmVjdG9yeQorICAgICAgIGFsc28gY29udGFpbnMgY29waWVzIG9mIHNhaWQgdGFyYmFsbHMgdG8gYXZvaWQgcmUtZG93bmxvYWRpbmcgdGhlbQorICAgICAgIGZyb20gdGhlIEludGVybmV0IGV2ZXJ5IHRpbWUuCisKKyAgJFRPUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci1idWlsZC88bmFtZT4vCisKKyAgICBBIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBiaW5hcmllcyBmb3IgcHJlYnVpbHQgZGVwZW5kZW5jeSA8bmFtZT4uCisgICAgVGhlc2UgYmluYXJpZXMgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2VzIGZyb20gLi4uL2FyY2hpdmUvIHRocm91Z2gKKyAgICBzY3JpcHRzIHByb3ZpZGVkIHVuZGVyICRUT1AvZXh0ZXJuYWwvcWVtdS9hbmRyb2lkL3NjcmlwdHMvLgorCitUaGUgbW9zdCBpbXBvcnRhbnQgZmlsZXMgaGVyZSBhcmUgdGhlIGZvbGxvd2luZzoKKworICAgZXh0ZXJuYWwvYW5kcm9pZC9zY3JpcHRzL2Rvd25sb2FkLXNvdXJjZXMuc2g6CisgICAgICAgQSBzY3JpcHQgdXNlZCB0byBwYXJzZSBQQUNLQUdFUy5UWFQgYW5kIGRvd25sb2FkIG9yIGNoZWNrIGFsbAorICAgICAgIHBhY2thZ2VzIGludG8gdGhlIC4uLi9hcmNoaXZlIG9uZS4KKworICAgICAgIElmIG9uZSB3YW50cyB0byBhZGQgYSBuZXcgcHJlYnVpbHQgbGlicmFyeSwgc3RhcnQgYnkgdXBkYXRpbmcKKyAgICAgICBQQUNLQUdFUy5UWFQsIHRoZW4gcnVuIGRvd25sb2FkLXNvdXJjZXMuc2ggdG8gdXBkYXRlIHRoZQorICAgICAgIC4uLi9hcmNoaXZlLyBjb250ZW50LgorCisgICAgICAgSU1QT1JUQU5UOiBJbiBvdGhlciB3b3JkczogSUYgWU9VIFVQREFURSBQQUNLQUdFUy5UWFQsIEFMV0FZUyBSVU4KKyAgICAgICAgICAgICAgICAgIGRvd25sb2FkLXNvdXJjZXMuc2ggQkVGT1JFIFJVTk5JTkcgT05FIE9GIFRIRSBCVUlMRAorICAgICAgICAgICAgICAgICAgU0NSSVBUUyBCRUxPVy4KKworICAgIGV4dGVybmFsL2FuZHJvaWQvc2NyaXB0cy9idWlsZC08bmFtZT4uc2g6CisgICAgICAgQSBzY3JpcHQgdXNlZCB0byByZWJ1aWxkIGEgZ2l2ZW4gc2V0IG9mIHByZWJ1aWx0IGJpbmFyaWVzLgorICAgICAgIE5vdGUgdGhhdCBieSBkZWZhdWx0LCB3aGVuIGludm9rZWQgb24gTGludXgsIHRoaXMgYnVpbGRzIExpbnV4CisgICAgICAgYW5kIFdpbmRvd3MgYmluYXJpZXMgYXQgdGhlIHNhbWUgdGltZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bworICAgICAgIGJ1aWxkIGZvciBhbGwgc3VwcG9ydGVkIGhvc3QgcGxhdGZvcm1zIHdpdGggdGhlIC0tZGFyd2luLXNzaD08aG9zdG5hbWU+CisgICAgICAgb3B0aW9uLCB0aGF0IHdpbGwgZGlyZWN0IHRoZSBzY3JpcHQgdG8gcGVyZm9ybSBhIHJlbW90ZSBidWlsZCBvbgorICAgICAgIGEgRGFyd2luIG1hY2hpbmUgdGhyb3VnaCBzc2guCisKKyAgICAgICBUaGUgY29ycmVzcG9uZGluZyBiaW5hcmllcyBhcmUgdGhlbiBzdG9yZWQgdW5kZXIgb25lIG9mOgorCisgICAgICAgICAgICRUT1AvcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3ItYnVpbGQvPG5hbWU+LzxzeXN0ZW0+LworICAgICAgICAgICAkVE9QL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkL2NvbW1vbi88bmFtZT4vPHN5c3RlbT4vCisKKyAgICAgICBXaGVyZSA8bmFtZT4gaXMgdGhlIHByZWJ1aWx0IG5hbWUsIGFuZCA8c3lzdGVtPiBpcyBhIGhvc3Qgc3lzdGVtIHRhZworICAgICAgIGxpa2Ugd2luZG93cy14ODYgb3IgbGludXgteDg2XzY0LgorCisgICAgZXh0ZXJuYWwvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXF0LnNoOgorICAgICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoaXMgc2NyaXB0IHdvcmtzIGxpa2UgdGhlIG90aGVyIGJ1aWxkLTxuYW1lPi5zaAorICAgICAgIHNjcmlwdHMsIGV4Y2VwdCB0aGF0IHRoZSBRdCBzb3VyY2UgdGFyYmFsbCBhcmUgbm90IGxpc3RlZCBpbgorICAgICAgIFBBQ0tBR0VTLlRYVCwgbm9yIGlzIGEgY29weSBzdG9yZWQgdW5kZXIgLi4uL2FyY2hpdmUvLgorCisgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBzaW1wbHkgdGhhdCB0aGUgYXJjaGl2ZSBmaWxlIGlzIHRvbyBsYXJnZQorICAgICAgIChzZXZlcmFsIGh1bmRyZWRzIE1CcykuIEFzIHN1Y2gsIG9uZSBzaG91bGQgY2FsbCB0aGlzIHNjcmlwdCB3aXRoCisgICAgICAgdGhlIC0tZG93bmxvYWQgb3B0aW9uIG9uIHRoZSBmaXJzdCB0aW1lLiBUaGlzIHdpbGwgZ3JhYiB0aGUgdGFyYmFsbAorICAgICAgIGZyb20gb2ZmaWNpYWwgUXQgc2VydmVycyBhbmQgcHV0IGl0IHVuZGVyIC4uLi9hcmNoaXZlLyB3aGVyZSBpdAorICAgICAgIHdpbGwgKm5vdCogYmUgcHV0IHVuZGVyIGdpdC4KKworICAgIGV4dGVybmFsL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1xZW11LWFuZHJvaWQuc2g6CisgICAgICAgVGhpcyBpcyBhbm90aGVyIHNwZWNpYWwgZXhjZXB0aW9uIGJlY2F1c2UgdGhpcyBzY3JpcHQgZG9lcyBub3QgYnVpbGQKKyAgICAgICBzb21ldGhpbmcgdGhhdCBpcyBwdXQgb24gZ2l0IHJlcG9zaXRvcmllcy4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBzY3JpcHQKKyAgICAgICBpcyB0byByZWJ1aWxkIHRoZSBRRU1VMiBiaW5hcmllcyBmcm9tIHNvdXJjZXMgdW5kZXIKKyAgICAgICAkVE9QL2V4dGVybmFsL3FlbXUsIHVzaW5nIHRoZSBvcmlnaW5hbCBRRU1VMiBjb25maWd1cmUvYnVpbGQKKyAgICAgICBzeXN0ZW0gKHVubGlrZSBhbmRyb2lkL3JlYnVpbGQuc2gsIHdoaWNoIHVzZXMgdGhlIGVtdWxhdG9yIGJ1aWxkCisgICAgICAgc3lzdGVtIHRvIGNvbXBpbGUgdGhlbSkuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBzYWlkIGJpbmFyaWVzCisgICAgICAgY2Fubm90IHVzZSB0aGUgQW5kcm9pZEVtdSBsaWJyYXJ5IChzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGl0IGluCisgICAgICAgZG9jcy9BTkRST0lELUVNVUxBVElPTi1MSUJSQVJZLlRYVCkuCisKKyAgICAgICBUaGUgcmVhc29uIHRvIHVzZSB0aGlzIHNjcmlwdCBpcyB0byBlYXNlIHRoZSB0YXNrIG9mIHRyYWNraW5nCisgICAgICAgdXBzdHJlYW0gUUVNVSBjaGFuZ2VzLCBhbmQgcmViYXNpbmcgb3VyIG93biBtb2RpZmljYXRpb25zIG9uIHRvcAorICAgICAgIG9mIGl0IChtYWlubHkgYmVjYXVzZSB0aGUgQW5kcm9pZC1zcGVjaWZpYyBmZWF0dXJlcyBhZGRlZCBvbiB0b3AKKyAgICAgICBvZiBpdCBhcmUgd2F5IHRvbyBsYXJnZSB0byBiZSBhY2NlcHRlZCBieSB1cHN0cmVhbSkuCisKKyAgICAgICBJbiBwYXJ0aWN1bGFyLCBidWlsZC1xZW11LWFuZHJvaWQuc2ggZ2VuZXJhdGVzIExJTkstPHN5c3RlbT4uVFhUCisgICAgICAgZmlsZXMgZGVzY3JpYmluZyBhbGwgdGhlIG9iamVjdCBmaWxlcyB1c2VkIGR1cmluZyBhIGxpbmsgb2YgdGhlCisgICAgICAgZmluYWwgUUVNVTIgYmluYXJpZXMuIFRoZXNlIGZpbGVzIGFyZSBsYXRlciBwcm9jZXNzZWQgYnkgYSBoZWxwZXIKKyAgICAgICBzY3JpcHQgbG9jYXRlZCB1bmRlcjoKKworICAgICAgICAgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC1xZW11Mi1nbHVlLyBcCisgICAgICAgICAgICAgICAgICBzY3JpcHRzL2dlbi1xZW11Mi1zb3VyY2VzLW1rLnNoCisKKyAgICAgICB0byBnZW5lcmF0ZSB0aGUgY29ycmVzcG9uZCBBbmRyb2lkIC5tayBydWxlcyB1c2VkIHdpdGgKKyAgICAgICBhbmRyb2lkL3JlYnVpbGQuc2gsIGkuZS46CisKKyAgICAgICAgICBleHRlcm5hbC9xZW11L2FuZHJvaWQtcWVtdTItZ2x1ZS8gXAorICAgICAgICAgICAgICAgICAgYnVpbGQvTWFrZWZpbGUucWVtdTItc291cmNlcy5taworCisgICAgICAgVGhlIG5ldyBRRU1VMiBiaW5hcmllcyBhcmUgY29waWVkIGludG86CisKKyAgICAgICAgICAkVE9QL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkL3FlbXUtYW5kcm9pZC8KKworICAgICAgIE5vdGUgdGhhdCB0aGlzIGRpcmVjdG9yeSBpcyAqbm90KiBiYWNrZWQgYnkgYSBnaXQgcmVwb3NpdG9yeS4KKworVklJLiBPdGhlciByZWxhdGVkIHNvdXJjZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBmdWxsIFNESyBkZXBlbmRzIG9uIG90aGVyIG5vdGFibGUgc291cmNlcyBmcm9tIGRpZmZlcmVudCBsb2NhdGlvbnM6CisKKyogaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc2RrOgorCisgICAgVGhpcyByZXBvc2l0b3J5IGhhcyBhbiBlbXVsYXRvci8gZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHNvdXJjZXMgZm9yCisgICAgdmFyaW91cyBlbXVsYXRvci1yZWxhdGVkIHNvdXJjZXMgYW5kIGJpbmFyaWVzOgorCisgICAgICAgc2RrL2VtdWxhdG9yL29wZW5nbC8KKyAgICAgICAgICBObyBsb25nZXIgZXhpc3RzLCBidXQgdXNlZCB0byBob3N0IHRoZSBzb3VyY2VzIGZvciB0aGUgaG9zdC1zaWRlCisgICAgICAgICAgR1BVIGVtdWxhdGlvbiBsaWJyYXJpZXMuIFRoZXNlIGFyZSBub3cgbG9jYXRlZCB1bmRlcgorICAgICAgICAgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC1lbXVnbCBpbnN0ZWFkLiBSZWFkIHRoZSBERVNJR04uVFhUIGRvY3VtZW50CisgICAgICAgICAgaW4gdGhpcyBkaXJlY3RvcnkgdG8gbGVhcm4gbW9yZSBhYm91dCBob3cgR1BVIGVtdWxhdGlvbiB3b3Jrcy4KKworICAgICAgIHNkay9lbXVsYXRvci9ta3NkY2FyZC8KKyAgICAgICAgICBTb3VyY2VzIGZvciB0aGUgJ21rc2RjYXJkJyBTREsgaG9zdCB0b29sLCB1c2VkIHRvIGdlbmVyYXRlIGFuIGVtcHR5CisgICAgICAgICAgU0RDYXJkIHBhcnRpdGlvbiBpbWFnZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSBlbXVsYXRvci4gVGhpcworICAgICAgICAgIGV4ZWN1dGFibGUgaXMgbmV2ZXIgY2FsbGVkIG9yIHVzZWQgYnkgdGhlIEFuZHJvaWQgZW11bGF0b3IgaXRzZWxmLAorICAgICAgICAgIGJ1dCBieSB0aGUgQVZEIE1hbmFnZXIgVUkgdG9vbCBpbnN0ZWFkLgorCisgICAgICAgc2RrL2VtdWxhdG9yL3NuYXBzaG90L3NuYXBzaG90LmltZworICAgICAgICAgIEFuIGVtcHR5IFFDT1cyIHBhcnRpdGlvbiBpbWFnZSBmaWxlLCB0aGlzIGlzIGNvcGllZCBieSB0aGUgQVZECisgICAgICAgICAgTWFuYWdlciBpbnRvIGEgbmV3IEFWRCdzIGNvbnRlbnQgZGlyZWN0b3J5IGlmIHRoZSB1c2VyIGVuYWJsZXMKKyAgICAgICAgICBzbmFwc2hvdHRpbmcuCisKKyAgICBUaGUgcmVzdCBvZiBzZGsvIGlzIG5vdCByZWxhdGVkIHRvIGVtdWxhdGlvbiBhbmQgY2FuIGJlIGlnbm9yZWQgaGVyZS4KKworCisqIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2RldmljZS9nZW5lcmljL2dvbGRmaXNoLworCisgICAgQ29udGFpbnMgZW11bGF0aW9uIHN1cHBvcnQgbGlicmFyaWVzIHRoYXQgbXVzdCBiZSBpbiB0aGUgc3lzdGVtIGltYWdlCisgICAgZm9yIGVtdWxhdGlvbiB0byB3b3JrIGNvcnJlY3RseS4gRXNzZW50aWFsbHkgSEFMIChIYXJkd2FyZSBBYnN0cmFjdGlvbgorICAgIExheWVyKSBtb2R1bGVzIGZvciB2YXJpb3VzIHZpcnR1YWwgZGV2aWNlcywgYW5kIHRoZSBHUFUgRUdML0dMRVMKKyAgICBzeXN0ZW0gbGlicmFyaWVzIHRoYXQgY29tbXVuaWNhdGUgd2l0aCB0aGUgaG9zdC1zaWRlIG9uZXMgZHVyaW5nCisgICAgZW11bGF0aW9uLgorCisqIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3ByZWJ1aWx0cy9xZW11LWtlcm5lbC8KKworICAgIFByZWJ1aWx0IGtlcm5lbCBpbWFnZXMgY29uZmlndXJlZCB0byBydW4gdW5kZXIgZW11bGF0aW9uLiBSZWFkCisgICAgZG9jcy9BTkRST0lELUtFUk5FTC5UWFQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyogaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IvCisKKyAgICBQcmVidWlsdCBlbXVsYXRvciBhbmQgR1BVIGVtdWxhdGlvbiBsaWJyYXJpZXMgZm9yIHZhcmlvdXMgaG9zdCBwbGF0Zm9ybXMuCisgICAgVGhlc2UgYXJlIHVzZWQgb25seSB3aGVuIGJ1aWxkaW5nIGFuIGVtdWxhdG9yLWNvbXBhdGlibGUgc3lzdGVtIGltYWdlCisgICAgd2l0aCB0aGUgcGxhdGZvcm0gYnVpbGQgKGUuZy4gJ2Fvc3BfPGNwdT4tdXNlcmRlYnVnJykuCisKKyAgICBUaGUgJ2x1bmNoJyBjb21tYW5kIGFkZHMgdGhpcyBkaXJlY3RvcnkgdG8gdGhlIHBhdGggc28geW91IGNhbiBqdXN0CisgICAgdHlwZSAnZW11bGF0b3InIGFmdGVyIGEgc3VjY2VzZnVsIGJ1aWxkLCBhbmQgaGF2ZSB0aGUgY29ycmVzcG9uZGluZworICAgIHN5c3RlbSBpbWFnZSBzdGFydGVkIHVuZGVyIGVtdWxhdGlvbi4KKworICAgIFVwZGF0aW5nIHRoZXNlIGJpbmFyaWVzIHJlcXVpcmVzIHVzaW5nIHRoZSBzY3JpcHQgdW5kZXIKKyAgICBhbmRyb2lkL3NjcmlwdHMvcGFja2FnZS1yZWxlYXNlLnNoIHdpdGggdGhlIC0tY29weS1wcmVidWlsdHMgb3B0aW9uCisgICAgKHNlZSBhYm92ZSkuCmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvRElTUExBWS1TVEFURS5UWFQgYi9hbmRyb2lkL2RvY3MvRElTUExBWS1TVEFURS5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2Mzc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9ESVNQTEFZLVNUQVRFLlRYVApAQCAtMCwwICsxLDI2MyBAQAorVGhpcyB0cmllcyB0byBkb2N1bWVudCB0aGUgbWVzcyB0aGF0IGlzIERpc3BsYXlTdGF0ZSBpbiBRRU1VLgorU2VlICJjb25zb2xlLmgiIGZvciB0aGUgbWFpbiBkZWZpbml0aW9ucywgYW5kIGJlbG93IGZvciBzb21lCitleHBsYW5hdGlvbnM6CisKKworRElTUExBWSBTVEFURSBPQkpFQ1RTOgorPT09PT09PT09PT09PT09PT09PT09PQorCitBIERpc3BsYXlTdGF0ZSBob2xkcyBzdGF0ZSBmb3Igc3R1ZmYgdG8gYmUgZGlzcGxheWVkIG9uIFFFTVUuIE1vcmUKK3ByZWNpc2VseToKKworIC0gQSBEaXNwbGF5U3RhdGUgb3ducyBhICdEaXNwbGF5U3VyZmFjZScgd2hpY2ggaXMgbm90aGluZyBtb3JlIHRoYW4gYQorICAgcGl4ZWwgYnVmZmVyIHdpdGggc3BlY2lmaWMgZGltZW5zaW9ucywgcGl0Y2ggYW5kIGZvcm1hdCBwbHVzIGJ5dGVzCisgICB0byBjYXJyeSBpdHMgY29udGVudC4KKworIC0gQSBEaXNwbGF5U3RhdGUgYWxzbyBob2xkcyBhICdEaXNwbGF5QWxsb2NhdG9yJyB3aGljaCBhbGxvd3MgaXQgdG8KKyAgIGFsbG9jYXRlIGl0cyBzdXJmYWNlIHRocm91Z2ggYSBwcm9wZXIgQVBJLiBGb3IgZXhhbXBsZSwgdGhpcyBpcworICAgdXNlZCBpbiB0aGUgdXBzdHJlYW0gc2RsIFVJIGJhY2tlbmQgdG8gYWxsb2NhdGUgdGhlIHN1cmZhY2UgcGl4ZWxzCisgICB0aHJvdWdoIFNETF9TZXRWaWRlb01vZGUoKS4gVGhlIGRlZmF1bHQgYWxsb2NhdG9yIHNpbXBseSB1c2VzCisgICAnbWFsbG9jJyB0byBkbyB0aGUgYWxsb2NhdGlvbiAod2l0aCAzMi1iaXRzL3BpeGVsKS4KKworIC0gQSBEaXNwbGF5U3RhdGUgYWxzbyBob2xkcyBhIGxpc3Qgb2YgRGlzcGxheUNoYW5nZUxpc3RlbmVyIG9iamVjdC4KKyAgIEVhY2ggbGlzdGVuZXIgY29udGFpbnMgYSBzbWFsbCBzZXQgb2YgY2FsbGJhY2tzIHRoYXQgd2lsbCBiZSBjYWxsZWQKKyAgIHdoZW5ldmVyIGFuICJldmVudCIgaGFwcGVucyBvbiB0aGUgZGlzcGxheSBzdGF0ZS4gRXZlbnRzIGV4YW1wbGVzCisgICBhcmU6CisKKyAgICAgIGRweV91cGRhdGU6ICBhIHJlY3Rhbmd1bGFyIHBvcnRpb24gb2YgdGhlIHN1cmZhY2UgaGFzIGJlZW4gdXBkYXRlZC4KKyAgICAgIGRweV9yZXNpemU6ICB0aGUgaGFyZHdhcmUgZGVjaWRlZCB0byByZXNpemUgdGhlIGZyYW1lYnVmZmVyLgorICAgICAgZHB5X3JlZnJlc2g6IGNhbGxlZCBwZXJpb2RpY2FsbHkgYnkgdGhlIEdVSSB0aW1lci4KKyAgICAgIGRweV9jb3B5OiAgICB0aGUgaGFyZHdhcmUgcGVyZm9ybWVkIGEgcmVjdGFuZ3VsYXIgY29weSBvcGVyYXRpb24uCisgICAgICBkcHlfZmlsbDogICAgdGhlIGhhcmR3YXJlIHBlcmZvcm1lZCBhIHJlY3Rhbmd1bGFyIGZpbGwgb3BlcmF0aW9uLgorICAgICAgZHB5X3NldGRhdGE6IHRoZSBoYXJkd2FyZSBkZWNpZGVkIHRvIGNoYW5nZSB0aGUgZnJhbWVidWZmZXIgYWRkcmVzcy4KKyAgICAgIGRweV90ZXh0X2N1cnNvcjogdGhlIGhhcmR3YXJlIHBsYWNlZCB0aGUgdGV4dCBjdXJzb3IgYXQgYSBnaXZlbiAoeCx5KS4KKworICAgTk9URTogZHB5X3NldGRhdGEgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGhhbiBkcHlfcmVzaXplIGV4Y2VwdCB0aGF0CisgICAgICAgICB0aGVyZSBpcyBhIGd1YXJhbnRlZSB0aGF0IHRoZSBzaXplIGRpZG4ndCBjaGFuZ2UuCisKKyAgIE1vcmUgb24gRGlzcGxheUNoYW5nZUxpc3RlbmVycyBiZWxvdy4KKworIC0gVGhlIGZpbGUgImNvbnNvbGUuaCIgcHJvdmlkZXMgbWFueSBoZWxwZXIgZnVuY3Rpb25zIHRvIGNhbGwgYWxsIGxpc3RlbmVycworICAgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBEaXNwbGF5U3RhdGUuIEZvciBleGFtcGxlLCBkcHlfdXBkYXRlKGRzLHgseSx3LGgpCisgICB3aWxsIGNhbGwgdGhlICdkcHlfdXBkYXRlJyBjYWxsYmFjayBvZiBhbGwgbGlzdGVuZXJzIGZvciB0aGUgZGlzcGxheQorICAgc3RhdGUgJ2RzJy4KKworCitDT05TT0xFUzoKKz09PT09PT09PQorCitBICJjb25zb2xlIiBpcyBzb21ldGhpbmcgdGhhdCBjYW4gd3JpdGUgcGl4ZWxzIGludG8gYSBEaXNwbGF5U3RhdGUuCitUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGNvbnNvbGVzLCBhbmQgdGhleSdyZSBmYWlybHkgZGlmZmVyZW50IGluIHVzYWdlLgorCisgIEdSQVBISUNBTCBDT05TT0xFOgorICAtLS0tLS0tLS0tLS0tLS0tLS0KKworICBBICJHcmFwaGljYWwgY29uc29sZSIgY3JlYXRlcyBhbmQgb3ducyBhIERpc3BsYXlTdGF0ZS4gSXQgaXMgdXNlZCB3aGVuIG9uZQorICBuZWVkcyB0byB3cml0ZSBkaXJlY3RseSB0byB0aGUgRGlzcGxheVN1cmZhY2UgcGl4ZWwgYnVmZmVyLiBBIHR5cGljYWwKKyAgaGFyZHdhcmUgZnJhbWVidWZmZXIgZW11bGF0b3IgKGUuZy4gaHcvdmdhLXBpYy5jKSB3aWxsIGNhbGwgdGhlCisgIGZ1bmN0aW9uIGdyYXBoaWNfY29uc29sZV9pbml0KCkgdG8gY3JlYXRlIHRoZSBEaXNwbGF5U3RhdGUuIE5vdGUgdGhhdAorICB0aGlzIGZ1bmN0aW9ucyBhY2NlcHRzIHNldmVyYWwgY2FsbGJhY2tzIGFuZCBpcyBkZWZpbmVkIGFzOgorCisgICAgICAgIHR5cGVkZWYgdm9pZCAoKnZnYV9od191cGRhdGVfcHRyKSh2b2lkICopOworICAgICAgICB0eXBlZGVmIHZvaWQgKCp2Z2FfaHdfaW52YWxpZGF0ZV9wdHIpKHZvaWQgKik7CisgICAgICAgIHR5cGVkZWYgdm9pZCAoKnZnYV9od19zY3JlZW5fZHVtcF9wdHIpKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgdHlwZWRlZiB2b2lkICgqdmdhX2h3X3RleHRfdXBkYXRlX3B0cikodm9pZCAqLCBjb25zb2xlX2NoX3QgKik7CisKKyAgICAgICAgRGlzcGxheVN0YXRlICpncmFwaGljX2NvbnNvbGVfaW5pdCh2Z2FfaHdfdXBkYXRlX3B0ciB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X2ludmFsaWRhdGVfcHRyIGludmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X3NjcmVlbl9kdW1wX3B0ciBzY3JlZW5fZHVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2FfaHdfdGV4dF91cGRhdGVfcHRyIHRleHRfdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisKKyAgVGhlIHVwZGF0ZS9pbnZhbGlkYXRlL3NjcmVlbl9kdW1wL3RleHRfdXBkYXRlIGZ1bmN0aW9ucyBtdXN0IGJlIHByb3ZpZGVkCisgIGJ5IHRoZSBoYXJkd2FyZSBmcmFtZWJ1ZmZlciBlbXVsYXRpb24sIGFuZCB3aWxsIGJlIGNhbGxlZCB1bmRlciB2YXJpb3VzCisgIGNpcmN1bXN0YW5jZXM6CisKKyAgICAgICd1cGRhdGUnIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgdG8gY2hlY2sgZm9yIGFueSBodyBmcmFtZWJ1ZmZlcgorICAgICAgdXBkYXRlcyAoYW5kIHRoZW4gY29weSB0aGVtIHRvIHRoZSBEaXNwbGF5U3RhdGUsIHRvIGZpbmFsbHkgc2VuZAorICAgICAgdGhlbSB0aHJvdWdoIGRweV91cGRhdGUoKSB0byB0aGUgbGlzdGVuZXJzKS4KKworICAgICAgJ2ludmFsaWRhdGUnIGlzIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBuZXh0IGNhbGwgdG8gJ3VwZGF0ZScKKyAgICAgIHNob3VsZCBzZW5kIHRoZSBjb250ZW50IG9mIF9hbGxfIHRoZSBmcmFtZWJ1ZmZlciwgaW5zdGVhZCBvZiBvbmx5CisgICAgICB0aGUgc21hbGxlc3QgcG9zc2libGUgdXBkYXRlLgorCisgICAgICAnc2NyZWVuX2R1bXAnIGlzIGNhbGxlZCB0byBmb3JjZSBhIHNjcmVlbiBkdW1wIChpLmUuIHByaW50IHRoZQorICAgICAgY29udGVudCBvZiB0aGUgZnJhbWVidWZmZXIgdG8gYSBwcG0gZmlsZSwgd2hpY2ggbmFtZSBpcyBwYXNzZWQgYXMKKyAgICAgIGEgcGFyYW1ldGVyKS4KKworICAgICAgJ3RleHRfdXBkYXRlJyBpcyBjYWxsZWQgdG8gZGlzcGxheSBvbmUgc2luZ2xlIGNoYXJhY3Rlci4gWFhYOiBDb2RlIGlzCisgICAgICBub3QgdmVyeSBjbGVhciwgYnV0IHByb2JhYmx5IHJlbGF0ZWQgdG8gdGV4dCBjb25zb2xlLgorCisKKyAgVEVYVCBDT05TT0xFUzoKKyAgLS0tLS0tLS0tLS0tLS0KKworICBBICJUZXh0IGNvbnNvbGUiIGF0dGFjaGVzIHRvIGFuIGV4aXN0aW5nIERpc3BsYXlTdGF0ZSwgYW5kIGlzIGFibGUgdG8KKyAgdGFrZSBvdmVyIGl0cyByZW5kZXJpbmcgaW4gb3JkZXIgdG8gZGlzcGxheSBhIHRleHQgKnRlcm1pbmFsKi4gSXQncyBub3QKKyAgc3VyZSB3aGV0aGVyIHRoaXMgZW11bGF0ZXMgVlQxMDEgb3Igc29tZXRoaW5nIGVsc2UgKHNlZSB0aGUgY29kZSBpbnNpZGUKKyAgdGhlIGNvbnNvbGVfcHV0Y2hhcigpIGZvciBhbGwgdGhlIGdvcnkgZGV0YWlscyksIGJ1dCB0aGUgbWFpbiBpZGVhIGlzCisgIHRoYXQgeW91IGNyZWF0ZSBhIGNvbnNvbGUgd2l0aCBhIGNhbGwgdG86CisKKyAgICAgICAgQ2hhckRyaXZlclN0YXRlKiAgdGV4dF9jb25zb2xlX2luaXQoY29uc3QgY2hhciogcCk7CisKKyAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBDaGFyRHJpdmVyU3RhdGUqIChzZWUgZG9jcy9DSEFSLURFVklDRVMuVFhUKSB0aGF0CisgIHdpbGwgYmUgY29ubmVjdGVkIHRvIGEgaG9zdCBkZXZpY2UgaWRlbnRpZmllZCBieSB0aGUgc3RyaW5nIGluICdwJy4gVGhpcworICBhbGxvd3MgeW91LCBmb3IgZXhhbXBsZSwgdG8gY29ubmVjdCB0aGUgY29uc29sZSB0byBzdGRpby4KKworICBUaGUgdGV4dCBjb25zb2xlIGNvZGUgaXMgY2FwYWJsZSBvZiBwcm9kdWNpbmcgYSBiaXRtYXAgZWFjaCB0aW1lIHlvdSB1cGRhdGUKKyAgaXRzIGNvbnRlbnQgKGkuZS4gaXQgaW5jbHVkZXMgY29kZSB0byBtYW5hZ2UgZml4ZWQtc2l6ZSBmb250IHJlbmRlcmluZywKKyAgc2Nyb2xsaW5nLCBlc2NhcGUgc2VxdWVuY2VzLCBjb2xvciwgYmxpbmtpbmcgY3Vyc29yLCBldGMuLi4pLgorCisgIC0gQnkgZGVmYXVsdCwgdGhlIGdyYXBoaWNzIGNvbnNvbGUgd3JpdGVzIHRvIGl0cyBEaXNwbGF5U3RhdGUsIGJ1dCB5b3UgY2FuCisgICAgdXNlIGNvbnNvbGVfc2VsZWN0KCkgdG8gY2hhbmdlIHRoYXQgYXQgcnVudGltZS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZAorICAgIHRvIGZvcmNlIHN3aXRjaGluZyBiZXR3ZWVuIHZpcnR1YWwgdGVybWluYWxzIGFuZCB0aGUgZ3JhcGhpY3MgZGlzcGxheS4KKyAgICBUaGVyZSBjYW4gYmUgc2V2ZXJhbCB0ZXh0IGNvbnNvbGVzIGFzc29jaWF0ZWQgdG8gYSBzaW5nbGUgRGlzcGxheVN0YXRlCisgICAgb2JqZWN0LgorCisKK0RJU1BMQVkgQ0hBTkdFIExJU1RFTkVSRVM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVyZSBRRU1VIHNvdXJjZXMgcHJvdmlkZSB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhcmlvdXMKK0Rpc3BsYXlDaGFuZ2VMaXN0ZW5lcnMsIG1vc3Qgbm90YWJsZXMgYXJlIHRoZSBmb2xsb3dpbmc6CisKKyAtIEluIHNkbC5jOiBUaGlzIG9uZSB1c2VzIHRoZSBTREwgbGlicmFyeSB0byBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEKKyAgIERpc3BsYXlTdXJmYWNlIHRocm91Z2ggYSBTRExfV2luZG93LiBUaGUgaW1wbGVtZW50YXRpb24gYWxzbyBzdXBwb3J0cworICAgem9vbWluZyB0aGUgb3V0cHV0IHRvIGFuIGFyYml0cmFyeSBzaXplICh1c2luZyBTREwgZnVuY3Rpb25zKS4KKworIC0gSW4gdm5jLmM6IFRoaXMgbGlzdGVuZXIgaW1wbGVtZW50cyBhIFZOQyBTZXJ2ZXIgdGhhdCBjYW4gYmUgdXNlZCB0bworICAgZGlzcGxheSB0aGUgRGlzcGxheVN1cmZhY2UgcmVtb3RlbHkgdGhyb3VnaCB0aGUgUkRQIHByb3RvY29sLgorCisgLSBJbiBjdXJzZXMuYzogVGhpcyBsaXN0ZW5lciBpcyB1c2VkIHRvIGRpc3BsYXkgdGV4dCBjb25zb2xlcyB0aHJvdWdoIHRoZQorICAgImN1cnNlcyIgbGlicmFyeSBvbiBVbml4IHN5c3RlbXMuIEl0IGNhbm5vdCBiZSB1c2VkIHRvIGRpc3BsYXkgYW55CisgICBncmFwaGljcyB0aG91Z2guCisKK05PVEU6IFRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBpbiB2bC5jIG9ubHkgYWxsb3dzIGZvciBhIHNpbmdsZSBsaXN0ZW5lcgorb24gdGhlIG1haW4gZGlzcGxheSBzdGF0ZSwgYnV0IHRoZSByZXN0IG9mIHRoZSBjb2RlIGRlYWxzIHdpdGggc2V2ZXJhbAorbGlzdGVuZXJzIHBlciBEaXNwbGF5U3RhdGUganVzdCBmaW5lLgorCitFYWNoIERpc3BsYXlDaGFuZ2VMaXN0ZW5lciBjYW4gc3BlY2lmeSBhIHJlZnJlc2ggcGVyaW9kIChlLmcuIGV2ZXJ5IDEvNjB0aAorb2Ygc2Vjb25kKS4gUUVNVSB3aWxsIHRoZW4gY3JlYXRlIGEgdGltZXIgdGhhdCB3aWxsIGJlIHByb2dyYW1tZWQgdG8gY2FsbGVkCit0aGUgbGlzdGVuZXIncyAnZHB5X3JlZnJlc2gnIGNhbGxiYWNrIHBlcmlvZGljYWxseS4gVGhlIHBvaW50IG9mIHRoaXMKK2NhbGxiYWNrIGlzIHRvIHBlcmZvcm0gdGhlIGZvbGxvd2luZzoKKworLSBwb2xsIGZvciBuZXcgdXNlciBpbnB1dCBldmVudHMgZnJvbSB0aGUgdW5kZXJseWluZyBVSSAoZS5nLiBmcm9tIHRoZSBTREwKKyAgZXZlbnQgbG9vcCwgb3IgZnJvbSB0aGUgbmV0d29yayBmb3IgVk5DKS4gVGhlc2Ugc2hvdWxkIGJlIHRyYW5zbGF0ZWQgaW50bworICBndWVzdCBldmVudCBjb2RlcyB3aXRoIGZ1bmN0aW9ucyBsaWtlICdrYmRfcHV0X2tleWNvZGUnIG9yICdrYmRfbW91c2VfZXZlbnQnLgorCistIGNhbGwgdGhlIGdsb2JhbCB2Z2FfaHdfdXBkYXRlKCkgZnVuY3Rpb24uIEl0IHdpbGwsIGlmIHRoZSBncmFwaGljcyBjb25zb2xlCisgIGlzIGJlaW5nIGRpc3BsYXllZCwgY2FsbCB0aGUgJ3VwZGF0ZScgY2FsbGJhY2sgdGhhdCB3YXMgcGFzc2VkIHRvCisgIGdyYXBoaWNfY29uc29sZV9pbml0KCkuIElmIGEgdGV4dCBjb25zb2xlIGlzIGJlaW5nIGRpc3BsYXllZCwgdGhlIGRvZXMKKyAgbm90aGluZy4KKworLSBldmVudHVhbGx5IGNhbGwgdGhlIGdsb2JhbCB2Z2FfaHdfaW52YWxpZGF0ZSgpIHRvIGluZGljYXRlIHRoYXQgdGhlIHdob2xlCisgIGZyYW1lYnVmZmVyIGNvbnRlbnQgc2hvdWxkIGJlIHJlc2VudCBhcyBhbiB1cGRhdGUuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEKKyAgVUkgd2luZG93IHdhcyBtaW5pbWl6ZWQgYW5kIGlzIG1hZGUgdmlzaWJsZSBhZ2FpbiwgZm9yIGV4YW1wbGUuCisKKworSU5JVElBTElaQVRJT04gQU5EIFJVTlRJTUUgRVhFQ1VUSU9OOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbml0aWFsaXphdGlvbiBoYXBwZW5zIGluIHRoZSBxZW11IG1haW4oKSBmdW5jdGlvbiBpbiB0aGUgdmwuYyBzb3VyY2UgZmlsZS4KKworRmlyc3QsIHRoZSBoYXJkd2FyZSBtYWNoaW5lIGlzIGluaXRpYWxpemVkLiBUaGUgaGFyZHdhcmUgZnJhZW1idWZmZXIgZW11bGF0aW9uCitzaGFsbCBjYWxsIGdyYXBoaWNfY29uc29sZV9pbml0KCkgdG8gY3JlYXRlIGEgbmV3IERpc3BsYXlTdGF0ZS4gTm90ZSB0aGF0IHRoZQorb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gaGFzIGEgZGVmYXVsdCBEaXNwbGF5U3VyZmFjZSBvZiA2NDB4NDgwIHBpeGVscworYWxsb2NhdGVkIHRocm91Z2ggbWFsbG9jKCkuIEluIG90aGVyIHdvcmRzLCB0aGUgaGFyZHdhcmUgZW11bGF0aW9uIGRvZXMgbm90CitzZXQgdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkgc3RhdGUgYnkgZGVmYXVsdCEKKworQWZ0ZXIgdGhhdCwgdGhlIGxpc3RlbmVyJ3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKGUuZy4gc2RsX2Rpc3BsYXlfaW5pdCkKK2lzIGNhbGxlZC4gSXQgaXMgcGFzc2VkIHRoZSBEaXNwbGF5U3RhdGUgb2JqZWN0IGFuZCBjYW4gcmVwbGFjZSB0aGUKK2NvcnJlc3BvbmRpbmcgRGlzcGxheVN1cmZhY2Ugd2l0aCBhbm90aGVyIG9uZSB3aXRoIHByb3BlciBkaW1lbnNpb25zLCBhbmQKK2V2ZW50dWFsbHkgY3JlYXRlZCB3aXRoIGEgZGlmZmVyZW50IERpc3BsYXlBbGxvY2F0b3IuIEl0IGFsc28gcmVnaXN0ZXJzIGEKK0Rpc3BsYXlDaGFuZ2VMaXN0ZW5lciB0byByZWNlaXZlIGxhdGVyIHN0YXRlIGNoYW5nZXMuCisKK05vdGUgdGhhdCB0aGUgVk5DIGxpc3RlbmVyIGRvZXNuJ3QgY2hhbmdlIHRoZSBkaW1lbnNpb24gb2YgdGhlIERpc3BsYXlTdGF0ZQorc3VyZmFjZSBpdCBpcyBpbml0aWFsaXplZCB3aXRoLiBIb3dldmVyLCBpdCB3aWxsIHJlYWN0IHRvIGRweV9yZXNpemUgZXZlbnRzCithY2NvcmRpbmdseS4KKworTk9URTogZHB5X3Jlc2l6ZSgpcyBhcmUgY3VycmVudGx5IG9ubHkgZ2VuZXJhdGVkIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4KK2NvbnNvbGVzLCBvciB3aGVuIHRoZSBmcmFtZWJ1ZmZlcidzIHNpemUgaXMgbW9kaWZpZWQgYnkgdGhlIGd1ZXN0IGtlcm5lbC4KKworCitUaGUgR1VJIHRpbWVyLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBsaXN0ZW5lciB0aGFuIGhhcyBvbmUgcmVmcmVzaAorcGVyaW9kLCBkcml2ZXMgdGhlIHdob2xlIHVwZGF0ZSBwcm9jZXNzIChpZiBubyBsaXN0ZW5lciBwcm92aWRlcyBhIHJlZnJlc2gKK3BlcmlvZCwgYSBkZWZhdWx0ICdub19ncmFwaGljJyB0aW1lciBpcyBzZXR1cCB3aXRoIGEgZGVmYXVsdCByZWZyZXNoIHBlcmlvZAorb2YgMzAgZnJhbWUvcykuCisKK1RoaW5ncyBoYXBwZW4gaW4gdGhpcyBvcmRlcjoKKworIC0gdGhlIEdVSSB0aW1lciBraWNrcyBpbiwgYW5kIGNhbGxzIHRoZSAnZHB5X3JlZnJlc2goKScgY2FsbGJhY2sgb2YKKyAgIHRoZSBsaXN0ZW5lciAoZWFjaCBsaXN0ZW5lciBoYXMgaXRzIG93biB0aW1lciwgYnR3KS4KKworIC0gdGhlIGxpc3RlbmVyIGNhbGxiYWNrIHBvbGxzIGZvciB1c2VyIGV2ZW50cywgYW5kIGNhbGxzIHZnYV9od191cGRhdGUoKQorICAgdG8gc2VlIGlmIHRoZXJlIGFyZSBoYXJkd2FyZSBmcmFtZWJ1ZmZlciB1cGRhdGVzLgorCisgLSB2Z2FfaHdfdXBkYXRlKCkgY2hlY2tzIHRoYXQgdGhlIGdyYXBoaWNzIGNvbnNvbGUgaXMgZGlzcGxheWVkIChvdGhlcndpc2UKKyAgIGl0IGV4aXRzKQorCisgLSBpdCB0aGVuIGNhbGxzIHRoZSBncmFwaGljcyBjb25zb2xlJ3MgJ3VwZGF0ZScgY2FsbGJhY2sKKworIC0gdGhlIGNhbGxiYWNrLCBpbXBsZW1lbnRlZCBieSB0aGUgZnJhbWVidWZmZXIgaHcgZW11bGF0aW9uLCBjaGVja3MgZm9yCisgICBkaXJ0eSBwYWdlcyBpbiBvcmRlciB0byBkZXRlY3Qgd2hhdCBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBpbnZva2VkLgorCisgICBGb3IgZXZlcnkgcmVjdGFuZ2xlIG9mIHRoZSBodyBmcmFtZWJ1ZmZlciB0aGF0IHdhcyBtb2RpZmllZCwgaXQgY29waWVzCisgICB0aGUgcGl4ZWxzIGZyb20gVlJBTSBpbnRvIHRoZSBEaXNwbGF5U3RhdGUncyBzdXJmYWNlIGJ1ZmZlciAoZXZlbnR1YWxseQorICAgcGVyZm9ybWluZyBmb3JtYXQgY29udmVyc2lvbiBhdCB0aGUgc2FtZSB0aW1lKS4KKworICAgQWZ0ZXIgdGhhdCwgaXQgY2FsbHMgZHB5X3VwZGF0ZSgpIHRvIHNlbmQgdGhlIHVwZGF0ZSB0byBhbGwgcmVnaXN0ZXJlZAorICAgbGlzdGVuZXJzIGZvciB0aGUgRGlzcGxheVN0YXRlLgorCisgLSBUaGUgbGlzdGVuZXIncyAnZHB5X3VwZGF0ZScgY2FsbGJhY2sgaXMgY2FsbGVkIGFuZCByZWNlaXZlcyBhIHBvaW50ZXIKKyAgIHRvIHRoZSBEaXNwbGF5U3RhdGUsIGFuZCB0aGUgcmVjdGFuZ2xlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVwZGF0ZS4gSXRzCisgICBpbXBsZW1lbnRhdGlvbiBjYW4gdGhlbiB1cGRhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIHNjcmVlbiAob3IgdGhlIGludGVybmFsCisgICBWTkMgZnJhbWVidWZmZXIpLgorCitFdmVudHVhbGx5LCBoYXJkd2FyZSBlbXVsYXRpb24gY2FuIGFsc28gdHJpZ2dlciBvdGhlciBkcHlfeHh4eCBldmVudHMgKGUuZy4KK2RweV9yZXNpemUsIGRweV9jb3B5LCBkcHlfZmlsbC4uLi4pCisKK0hlcmUncyBhIHNpbXBsaWZpZWQgZGlhZ3JhbSBvZiB3aGF0IGhhcHBlbnMgaW4gdGhlIHR5cGljYWwgY2FzZToKKworICAgICAgICAgICAgX19fX19fX19fX19fXworICAgICAgICAgICAgfCAgICAgICAgICAgICB8CisgICAgICAgICAgICB8ICBoYXJkd2FyZSAgIHwKKyAgICAgICAgICAgIHwgZnJhbWVidWZmZXIgfC0tLS0tLS0rCisgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgfAorICAgICAgICAgICAgfF9fX19fX19fX19fX198ICAgICAgIHwKKyAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgfCAzLyBkcy51cGRhdGUoKSAgIHwgNC8gZHB5X3VwZGF0ZShkcyx4LHksdyxoKQorICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICBfX19fX19fX19fX19fICAgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgIHwKKyAgICAgICAgICAgIHwgIERpc3BsYXkgICAgfCA8LS0tLS0rCisgICAgICAgICAgICB8ICAgU3RhdGUgICAgIHwKKyAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAtLS0tLS0tLS0tKworICAgICAgICAgICAgfF9fX19fX19fX19fX198ICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgIHwgMi8gdmdhX2h3X3VwZGF0ZSgpICB8CisgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgIHwgICAgIHwgNS9saXN0ZW5lci5kcHlfdXBkYXRlKGRzLHgseSx3LGgpCisgICAgICAgICAgICAgICAgfCAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgfCA2L2xpc3RlbmVyLmRweV91cGRhdGUoLi4uKQorICAgICAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgfCAgICAgdiAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICBfX19fX19fX19fX19fICAgICBfX19fX19fX19fX19fCisgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHwgIFNETCAgICAgICAgfCAgIHwgIFZOQyAgICAgICAgfAorICAgICAgICAgICAgfCAgIExpc3RlbmVyICB8ICAgfCAgIExpc3RlbmVyICB8CisgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHxfX19fX19fX19fX19ffCAgIHxfX19fX19fX19fX19ffAorICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgfCAxLyBsaXN0ZW5lci5kcHlfcmVmcmVzaCgpCisgICAgICAgICAgICAgICAgfAorCisgICAgICAgICAgICAgICBHVUkgdGltZXIKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0dPTERGSVNILVZJUlRVQUwtSEFSRFdBUkUuVFhUIGIvYW5kcm9pZC9kb2NzL0dPTERGSVNILVZJUlRVQUwtSEFSRFdBUkUuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWEzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvR09MREZJU0gtVklSVFVBTC1IQVJEV0FSRS5UWFQKQEAgLTAsMCArMSwxMDMzIEBACitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSAnZ29sZGZpc2gnIHZpcnR1YWwgaGFyZHdhcmUgcGxhdGZvcm0gdXNlZCB0byBydW4gc29tZQorZW11bGF0ZWQgQW5kcm9pZCBzeXN0ZW1zIHVuZGVyIFFFTVUuIEl0IHNlcnZlcyBhcyBhIHJlZmVyZW5jZSBmb3IgaW1wbGVtZW50ZXJzCitvZiB2aXJ0dWFsIGRldmljZXMgaW4gUUVNVSwgYXMgd2VsbCBhcyBMaW51eCBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gbmVlZCB0bworbWFpbnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVycy4KKworVGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb25zIHdpbGwgYmUgdXNlZCBoZXJlOgorCisgICRRRU1VICAtPiBwYXRoIHRvIHRoZSBBbmRyb2lkIEFPU1AgZGlyZWN0b3J5LCBpLmUuIGEgZ2l0IGNsb25lIG9mCisgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9leHRlcm5hbC9xZW11LmdpdAorCisgICRLRVJORUwgLT4gcGF0aCB0byB0aGUgQW5kcm9pZCBnb2xkZmlzaCBrZXJuZWwgc291cmNlIHRyZWUsIGkuZS4gYSBnaXQgY2xvbmUgb2YKKyAgICAgICAgICAgICBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9rZXJuZWwvZ29sZGZpc2guZ2l0CisKKyAgICAgICAgICAgICBNb3JlIHNwZWNpZmljYWxseSwgdG8gdGhlIGFuZHJvaWQtZ29sZGZpc2gtMi42LjI5IGJyYW5jaCBmb3Igbm93LgorCisnZ29sZGZpc2gnIGlzIHRoZSBuYW1lIG9mIGEgZmFtaWx5IG9mIHNpbWlsYXIgdmlydHVhbCBoYXJkd2FyZSBwbGF0Zm9ybXMsIHRoYXQKK21vc3RseSBkaWZmZXIgaW4gdGhlIHZpcnR1YWwgQ1BVIHRoZXkgc3VwcG9ydC4gJ2dvbGRmaXNoJyBzdGFydGVkIGFzIGFuCitBUk0tc3BlY2lmaWMgcGxhdGZvcm0sIGJ1dCBoYXMgbm93IGJlZW4gcG9ydGVkIHRvIHg4NiBhbmQgTUlQUyB2aXJ0dWFsIENQVXMuCisKK0luc2lkZSBvZiBRRU1VLCBnb2xkZmlzaC1zcGVjaWZpYyB2aXJ0dWFsIGRldmljZSBpbXBsZW1lbnRhdGlvbiBzb3VyY2VzIGZpbGVzCithcmUgaW4gJFFFTVUvaHcvYW5kcm9pZC9nb2xkZmlzaC8qLmMgc291cmNlcworCitJbnNpZGUgdGhlIExpbnV4IGtlcm5lbCB0cmVlLCB0aGV5IGFyZSB1bmRlciAkS0VSTkVML2FyY2gvJEFSQ0gvbWFjaC1nb2xkZmlzaCwKK29yICRLRVJORUwvYXJjaC8kQVJDSC9nb2xkZmlzaC8sIGFzIHdlbGwgYXMgYSBmZXcgYXJjaC1pbmRlcGVuZGVudCBkcml2ZXJzIGluCitkaWZmZXJlbnQgbG9jYXRpb25zIChkZXRhaWxlZCBiZWxvdykuCisKK0dvbGRmaXNoIGRldmljZXMgYXBwZWFyIHRvIHRoZSBMaW51eCBrZXJuZWwgYXMgJ3BsYXRmb3JtIGRldmljZXMnLiBSZWFkIFsxXSBhbmQKK1syXSBmb3IgYW4gaW50cm9kdWN0aW9uIGFuZCByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBmb3IgdGhlc2UuCisKK0VhY2ggZGV2aWNlIGlzIGlkZW50aWZpZWQgYnkgYSBuYW1lLCBhbmQgYW4gb3B0aW9uYWwgdW5pcXVlIGlkIChhbiBpbnRlZ2VyIHVzZWQKK3RvIGRpc3Rpbmd1aXNoIGJldHdlZW4gc2V2ZXJhbCBpZGVudGljYWwgaW5zdGFuY2VzIG9mIHNpbWlsYXIgZGV2aWNlcywgbGlrZQorc2VyaWFsIHBvcnRzLCBvZiBibG9jayBkZXZpY2VzKS4gV2hlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIGdpdmVuIGRldmljZSBjYW4KK2JlIHVzZWQsIGFuIElEIG9mIC0xIGlzIHVzZWQgaW5zdGVhZC4KKworSXQgYWxzbyBjb21tdW5pY2F0ZXMgd2l0aCB0aGUga2VybmVsIHRocm91Z2g6CisKKyAgLSBPbmUgb3IgbW9yZSAzMi1iaXQgb2YgSS9PIHJlZ2lzdGVycywgbWFwcGVkIHRvIHBoeXNpY2FsIGFkZHJlc3NlcyBhdAorICAgIHNwZWNpZmljIGxvY2F0aW9ucyB3aGljaCBkZXBlbmQgb24gdGhlIGFyY2hpdGVjdHVyZS4KKworICAtIFplcm8gb3IgbW9yZSBpbnRlcnJ1cHQgcmVxdWVzdHMsIHVzZWQgdG8gc2lnbmFsIHRvIHRoZSBrZXJuZWwgdGhhdCBhbgorICAgIGltcG9ydGFudCBldmVudCBvY2N1cmVkLgorCisgICAgTm90ZSB0aGF0IElSUSBsaW5lcyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIDMxLCBhbmQgYXJlIHJlbGF0aXZlIHRvIHRoZQorICAgIGdvbGRmaXNoIGludGVycnVwdCBjb250cm9sbGVyLCBkb2N1bWVudGVkIGJlbG93LgorCisKK1sxXSBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy80NDg0OTkvCitbMl0gaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvcGxhdGZvcm0udHh0CisKKworSS4gR29sZGZpc2ggcGxhdGZvcm0gYnVzOgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgJ3BsYXRmb3JtIGJ1cycsIGluIExpbnV4IGtlcm5lbCBzcGVhaywgaXMgYSBzcGVjaWFsIGRldmljZSB0aGF0IGlzIGNhcGFibGUKK29mIGVudW1lcmF0aW5nIG90aGVyIHBsYXRmb3JtIGRldmljZXMgZm91bmQgb24gdGhlIHN5c3RlbSB0byB0aGUga2VybmVsLiBUaGlzCitmbGV4aWJpbGl0eSBhbGxvd3MgdG8gY3VzdG9taXplIHdoaWNoIHZpcnR1YWwgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIHdoZW4gcnVubmluZworYSBnaXZlbiBlbXVsYXRlZCBzeXN0ZW0gY29uZmlndXJhdGlvbi4KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmMKKyAgJEtFUk5FTC9hcmNoL2FybS9tYWNoLWdvbGRmaXNoL3BkZXZfYnVzLmMKKyAgJEtFUk5FTC9hcmNoL3g4Ni9tYWNoLWdvbGRmaXNoL3BkZXZfYnVzLmMKKyAgJEtFUk5FTC9hcmNoL21pcHMvZ29sZGZpc2gvcGRldl9idXMuYworCitEZXZpY2UgcHJvcGVydGllczoKKyAgTmFtZTogZ29sZGZpc2hfZGV2aWNlX2J1cworICBJZDogICAtMQorICBJcnFDb3VudDogMQorCisgIDMyLWJpdCBJL08gcmVnaXN0ZXJzIChvZmZzZXQsIG5hbWUsIGFic3RyYWN0KQorCisgICAgMHgwMCBCVVNfT1AgICAgICBSOiBJdGVyYXRlIHRvIG5leHQgZGV2aWNlIGluIGVudW1lcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgVzogU3RhcnQgZGV2aWNlIGVudW1lcmF0aW9uLgorCisgICAgMHgwNCBHRVRfTkFNRSAgICBXOiBDb3B5IGRldmljZSBuYW1lIHRvIGtlcm5lbCBtZW1vcnkuCisgICAgMHgwOCBOQU1FX0xFTiAgICBSOiBSZWFkIGxlbmd0aCBvZiBjdXJyZW50IGRldmljZSdzIG5hbWUuCisgICAgMHgwYyBJRCAgICAgICAgICBSOiBSZWFkIGlkIG9mIGN1cnJlbnQgZGV2aWNlLgorICAgIDB4MTAgSU9fQkFTRSAgICAgUjogUmVhZCBJL08gYmFzZSBhZGRyZXNzIG9mIGN1cnJlbnQgZGV2aWNlLgorICAgIDB4MTQgSU9fU0laRSAgICAgUjogUmVhZCBJL08gYmFzZSBzaXplIG9mIGN1cnJlbnQgZGV2aWNlLgorICAgIDB4MTggSVJRX0JBU0UgICAgUjogUmVhZCBiYXNlIElSUSBvZiBjdXJyZW50IGRldmljZS4KKyAgICAweDFjIElSUV9DT1VOVCAgIFI6IFJlYWQgSVJRIGNvdW50IG9mIGN1cnJlbnQgZGV2aWNlLgorCisgICAgIyBGb3IgNjQtYml0IGd1ZXN0IGFyY2hpdGVjdHVyZXMgb25seToKKyAgICAweDIwIE5BTUVfQUREUl9ISUdIICBXOiBXcml0ZSBoaWdoIDMyLWJpdCBvZiBrZXJuZWwgYWRkcmVzcyBvZiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIHVzZWQgYnkgR0VUX05BTUUuIE11c3QgYmUgd3JpdHRlbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSB0aGUgR0VUX05BTUUgd3JpdGUuCisKK1RoZSBrZXJuZWwgaXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBvZiBjdXJyZW50IGRldmljZXMgd2l0aCBzb21ldGhpbmcgbGlrZToKKworICAgSU9fV1JJVEUoQlVTX09QLCAwKTsgICAgLy8gU3RhcnQgaXRlcmF0aW9uLCBhbnkgdmFsdWUgb3RoZXIgdGhhbiAwIGlzIGludmFsaWQuCisgICBmb3IgKDs7KSB7CisgICAgIGludCByZXQgPSBJT19SRUFEKEJVU19PUCk7CisgICAgIGlmIChyZXQgPT0gMCAvKiBPUF9ET05FICovKSB7CisgICAgICAgLy8gbm8gbW9yZSBkZXZpY2VzLgorICAgICAgIGJyZWFrOworICAgICB9CisgICAgIGVsc2UgaWYgKHJldCA9PSA4IC8qIE9QX0FERF9ERVYgKi8pIHsKKyAgICAgICAvLyBSZWFkIGRldmljZSBwcm9wZXJ0aWVzLgorICAgICAgIERldmljZSBkZXY7CisgICAgICAgZGV2Lm5hbWVfbGVuICA9IElPX1JFQUQoTkFNRV9MRU4pOworICAgICAgIGRldi5pZCAgICAgICAgPSBJT19SRUFEKElEKTsKKyAgICAgICBkZXYuaW9fYmFzZSAgID0gSU9fUkVBRChJT19CQVNFKTsKKyAgICAgICBkZXYuaW9fc2l6ZSAgID0gSU9fUkVBRChJT19TSVpFKTsKKyAgICAgICBkZXYuaXJxX2Jhc2UgID0gSU9fUkVBRChJUlFfQkFTRSk7CisgICAgICAgZGV2LmlycV9jb3VudCA9IElPX1JFQUQoSVJRX0NPVU5UKTsKKworICAgICAgIGRldi5uYW1lID0ga2FsbG9jKGRldi5uYW1lX2xlbiArIDEpOyAgLy8gYWxsb2NhdGUgcm9vbSBmb3IgZGV2aWNlIG5hbWUuCisgICAgI2lmIDY0QklUX0dVRVNUX0NQVQorICAgICAgIElPX1dSSVRFKE5BTUVfQUREUl9ISUdILCAodWludDMyX3QpKGRldi5uYW1lID4+IDMyKSk7CisgICAgI2VuZGlmCisgICAgICAgSU9fV1JJVEUoR0VUX05BTUUsICh1aW50MzJfdClkZXYubmFtZSk7ICAvLyBjb3B5IHRvIGtlcm5lbCBtZW1vcnkuCisgICAgICAgZGV2Lm5hbWVbZGV2Lm5hbWVfbGVuXSA9IDA7CisKKyAgICAgICAuLiBhZGQgZGV2aWNlIHRvIGtlcm5lbCdzIGxpc3QuCisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgLy8gTm90IHJldHVybmVkIGJ5IGN1cnJlbnQgZ29sZGZpc2ggaW1wbGVtZW50YXRpb24uCisgICAgIH0KKyAgIH0KKworVGhlIGRldmljZSBhbHNvIHVzZXMgYSBzaW5nbGUgSVJRLCB3aGljaCBpdCB3aWxsIHJhaXNlIHRvIGluZGljYXRlIHRvIHRoZSBrZXJuZWwKK3RoYXQgbmV3IGRldmljZXMgYXJlIGF2YWlsYWJsZSwgb3IgdGhhdCBzb21lIG9mIHRoZW0gaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZQora2VybmVsIHdpbGwgdGhlbiBzdGFydCBhIG5ldyBlbnVtZXJhdGlvbi4gVGhlIElSUSBpcyBsb3dlcmVkIGJ5IHRoZSBkZXZpY2Ugb25seQord2hlbiBhIElPX1JFQUQoQlVTX09QKSByZXR1cm5zIDAgKE9QX0RPTkUpLgorCitOT1RFOiBUaGUga2VybmVsIGhhcmQtY29kZXMgYSBwbGF0Zm9ybV9kZXZpY2UgZGVmaW5pdGlvbiB3aXRoIHRoZSBuYW1lCisgICAgICAiZ29sZGZpc2hfcGRldl9idXMiIGZvciB0aGUgcGxhdGZvcm0gYnVzIChlLmcuIHNlZQorICAgICAgJEtFUk5FTC9hcmNoL2FybS9tYWNoLWdvbGRmaXNoL2JvYXJkLWdvbGRmaXNoLmMpLCBob3dldmVyLCB0aGUgYnVzIGl0c2VsZgorICAgICAgd2lsbCBhcHBlYXIgZHVyaW5nIGVudW1lcmF0aW9uIGFzIGEgZGV2aWNlIG5hbWVkICJnb2xkZmlzaF9kZXZpY2VfYnVzIgorCisgICAgICBUaGUga2VybmVsIGRyaXZlciBmb3IgdGhlIHBsYXRmb3JtIGJ1cyBvbmx5IG1hdGNoZXMgdGhlICJnb2xkZmlzaF9wZGV2X2J1cyIKKyAgICAgIG5hbWUsIGFuZCB3aWxsIGlnbm9yZSBhbnkgZGV2aWNlIG5hbWVkICJnb2xkZmlzaF9kZXZpY2VfYnVzIi4KKworCitJSS4gR29sZGZpc2ggaW50ZXJydXB0IGNvbnRyb2xsZXI6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0lNUE9SVEFOVDogVGhlIGNvbnRyb2xsZXIgSVMgTk9UIFVTRUQgSU4gRU1VTEFURUQgWDg2IFNZU1RFTVMuCisgICAgICAgICAgIFRPRE8oZGlnaXQpOiBJbmRpY2F0ZSB3aGljaCB2aXJ0dWFsIFBJQyBpcyB1c2VkIG9uIHg4NiBzeXN0ZW1zLgorCitSZWxldmFudCBmaWxlczoKKyAgJFFFTVUvaHcvYW5kcm9pZC9nb2xkZmlzaC9pbnRlcnJ1cHQuYworICAkS0VSTkVML2FyY2gvYXJtL21hY2gtZ29sZGZpc2gvYm9hcmQtZ29sZGZpc2guYworICAkS0VSTkVML2FyY2gvbWlwcy9nb2xkZmlzaC9nb2xkZmlzaC1pbnRlcnJ1cHQuYworCitEZXZpY2UgcHJvcGVydGllczoKKyAgTmFtZTogZ29sZGZpc2hfaW50ZXJydXB0X2NvbnRyb2xsZXIKKyAgSWQ6IC0xCisgIElycUNvdW50OiAwICAodXNlcyBwYXJlbnQgQ1BVIElSUSBpbnN0ZWFkKS4KKworICAzMi1iaXQgSS9PIHJlZ2lzdGVycyAob2Zmc2V0LCBuYW1lLCBhYnRyYWN0KToKKyAgICAweDAwIFNUQVRVUyAgICAgICBSOiBSZWFkIHRoZSBudW1iZXIgb2YgcGVuZGluZyBpbnRlcnJ1cHRzICgwIHRvIDMyKS4KKyAgICAweDA0IE5VTUJFUiAgICAgICBSOiBSZWFkIHRoZSBsb3dlc3QgcGVuZGluZyBpbnRlcnJ1cHQgaW5kZXgsIG9yIDAgaWYgbm9uZS4KKyAgICAweDA4IERJU0FCTEVfQUxMICBXOiBDbGVhciBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzIChkb2VzIG5vdCBkaXNhYmxlIHRoZW0hKQorICAgIDB4MGMgRElTQUJMRSAgICAgIFc6IERpc2FibGUgYSBnaXZlbiBpbnRlcnJ1cHQsIHZhbHVlIG11c3QgYmUgaW4gWzAuLjMxXS4KKyAgICAweDEwIEVOQUJMRSAgICAgICBXOiBFbmFibGUgYSBnaXZlbiBpbnRlcnJ1cHQsIHZhbHVlIG11c3QgYmUgaW4gWzAuLjMxXS4KKworR29sZGZpc2ggcHJvdmlkZXMgaXRzIG93biBpbnRlcnJ1cHQgY29udHJvbGxlciB0aGF0IGNhbiBtYW5hZ2UgdXAgdG8gMzIgZGlzdGluY3QKK21hc2thYmxlIGludGVycnVwdCByZXF1ZXN0IGxpbmVzLiBUaGUgY29udHJvbGxlciBpdHNlbGYgaXMgY2FzY2FkZWQgZnJvbSBhCitwYXJlbnQgQ1BVIElSUS4KKworV2hhdCB0aGlzIG1lYW5zIGluIHByYWN0aWNlOgorCisgIC0gRWFjaCBJUlEgaGFzIGEgJ2xldmVsJyB0aGF0IGlzIGVpdGhlciAnaGlnaCcgKDEpIG9yICdsb3cnICgwKS4KKworICAtIEVhY2ggSVJRIGFsc28gaGFzIGEgYmluYXJ5ICdlbmFibGUnIGZsYWcuCisKKyAgLSBXaGVuZXZlciAobGV2ZWwgPT0gMSAmJiBlbmFibGVkID09IDEpIGlzIHJlYWNoZWQgZHVlIHRvIGEgc3RhdGUgY2hhbmdlLCB0aGUKKyAgICBjb250cm9sbGVyIHJhaXNlcyBpdHMgcGFyZW50IElSUS4gVGhpcyB0eXBpY2FsbHkgaW50ZXJydXB0cyB0aGUgQ1BVIGFuZAorICAgIGZvcmNlcyB0aGUga2VybmVsIHRvIGRlYWwgd2l0aCB0aGUgaW50ZXJydXB0IHJlcXVlc3QuCisKKyAgLSBSYWlzZWQvRW5hYmxlZCBpbnRlcnJ1cHRzIHRoYXQgaGF2ZSBub3QgYmVlbiBzZXJ2aWNlZCB5ZXQgYXJlIGNhbGxlZAorICAgICJwZW5kaW5nIi4gUmFpc2VkL0Rpc2FibGVkIGludGVycnVwdHMgYXJlIGNhbGxlZCAibWFza2VkIiBhbmQgYXJlCisgICAgZXNzZW50aWFsbHkgc2lsZW50IHVudGlsIGVuYWJsZWQuCisKK1doZW4gdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRyaWdnZXJzIHRoZSBwYXJlbnQgSVJRLCB0aGUga2VybmVsIHNob3VsZCBkbwordGhlIGZvbGxvd2luZzoKKworICBudW1fcGVuZGluZyA9IElPX1JFQUQoU1RBVFVTKTsgIC8vIFJlYWQgbnVtYmVyIG9mIHBlbmRpbmcgaW50ZXJydXB0cy4KKyAgZm9yIChpbnQgbiA9IDA7IG4gPCBudW1fcGVuZGluZzsgKytuKSB7CisgICAgaW50IGlycV9pbmRleCA9IElPX1JFQUQoTlVNQkVSKTsgIC8vIFJlYWQgbi10aCBpbnRlcnJ1cHQgaW5kZXguCisgICAgLi4gc2VydmljZSBpbnRlcnJ1cHQgcmVxdWVzdCB3aXRoIHRoZSBwcm9wZXIgZHJpdmVyLgorICB9CisKK0lPX1dSSVRFKERJU0FCTEUsIDxudW0+KSBvciBJT19XUklURShFTkFCTEUsIDxudW0+KSBjYW4gY2hhbmdlIHRoZSAnZW5hYmxlJyBmbGFnCitvZiBhIGdpdmVuIElSUS4gPG51bT4gbXVzdCBiZSBhIHZhbHVlIGluIHRoZSBbMC4uMzFdIHJhbmdlLiBOb3RlIHRoYXQgZW5hYmxpbmcKK2FuIElSUSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHJhaXNlZCB3aWxsIG1ha2UgaXQgYWN0aXZlLCBpLmUuIGl0IHdpbGwgcmFpc2UKK3RoZSBwYXJlbnQgSVJRLgorCitJT19XUklURShESVNBQkxFX0FMTCwgMCkgY2FuIGJlIHVzZWQgdG8gbG93ZXIgYWxsIGludGVycnVwdCBsZXZlbHMgYXQgb25jZSAoZXZlbgorZGlzYWJsZWQgb25lKS4gTm90ZSB0aGF0IHRoaXMgY29uc3RhbnQgaXMgcHJvYmFibHkgbWlzLW5hbWVkIHNpbmNlIGl0IGRvZXMgbm90CitjaGFuZ2UgdGhlICdlbmFibGUnIGZsYWcgb2YgYW55IElSUS4KKworTm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgd2F5IGZvciB0aGUga2VybmVsIHRvIGxvd2VyIGFuIElSUSBsZXZlbCB0aHJvdWdoCit0aGlzIGRldmljZS4gR2VuZXJhbGx5IHNwZWFraW5nLCBHb2xkZmlzaCBkZXZpY2VzIGFyZSByZXNwb25zaWJsZSBmb3IgbG93ZXJpbmcKK3RoZWlyIG93biBJUlEsIHdoaWNoIGlzIHBlcmZvcm1lZCBlaXRoZXIgd2hlbiBhIHNwZWNpZmljIGNvbmRpdGlvbiBpcyBtZXQsIG9yCit3aGVuIHRoZSBrZXJuZWwgcmVhZHMgZnJvbSBvciB3cml0ZXMgdG8gYSBkZXZpY2Utc3BlY2lmaWMgSS9PIHJlZ2lzdGVyLgorCisKK0lJSS4gR29kbGZpc2ggdGltZXI6Cis9PT09PT09PT09PT09PT09PT09PQorCitOT1RFOiBUaGlzIGlzIG5vdCB1c2VkIG9uIHg4NiBlbXVsYXRlZCBwbGF0Zm9ybXMuCisKK1JlbGV2YW50IGZpbGVzOgorICAkUUVNVS9ody9hbmRyb2lkL2dvbGRmaXNoL3RpbWVyLmMKKyAgJEtFUk5FTC9hcmNoL2FybS9tYWNoLWdvbGRmaXNoL3RpbWVyLmMKKyAgJEtFUk5FTC9hcmNoL21pcHMvZ29sZGZpc2gvZ29sZGZpc2gtdGltZS5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF90aW1lcgorICBJZDogLTEKKyAgSXJxQ291bnQ6IDEKKworICAzMi1iaXQgSS9PIHJlZ2lzdGVycyAob2Zmc2V0LCBuYW1lLCBhYnN0cmFjdCkKKyAgICAweDAwICBUSU1FX0xPVyAgICAgICAgIFI6IEdldCBjdXJyZW50IHRpbWUsIHRoZW4gcmV0dXJuIGxvdy1vcmRlciAzMi1iaXRzLgorICAgIDB4MDQgIFRJTUVfSElHSCAgICAgICAgUjogUmV0dXJuIGhpZ2ggMzItYml0cyBmcm9tIHByZXZpb3VzIFRJTUVfTE9XIHJlYWQuCisgICAgMHgwOCAgQUxBUk1fTE9XICAgICAgICBXOiBTZXQgbG93IDMyLWJpdCB2YWx1ZSBvZiBhbGFybSwgdGhlbiBhcm0gaXQuCisgICAgMHgwYyAgQUxBUk1fSElHSCAgICAgICBXOiBTZXQgaGlnaCAzMi1iaXQgdmFsdWUgb2YgYWxhcm0uCisgICAgMHgxMCAgQ0xFQVJfSU5URVJSVVBUICBXOiBMb3dlciBkZXZpY2UncyBpcnEgbGV2ZWwuCisgICAgMHgxNCAgQ0xFQVJfQUxBUk0KKworVGhpcyBkZXZpY2UgaXMgdXNlZCB0byByZXR1cm4gdGhlIGN1cnJlbnQgaG9zdCB0aW1lIHRvIHRoZSBrZXJuZWwsIGFzIGEKK2hpZ2gtcHJlY2lzaW9uIHNpZ25lZCA2NC1iaXQgbmFub3NlY29uZHMgdmFsdWUsIHN0YXJ0aW5nIGZyb20gYSBsaWJlcmFsIHBvaW50CitpbiB0aW1lLiBUaGlzIHZhbHVlIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBRRU1VICJ2bV9jbG9jayIsIGkuZS4gaXQgc2hvdWxkCitub3QgYmUgdXBkYXRlZCB3aGVuIHRoZSBlbXVsYXRlZCBzeXN0ZW0gZG9lcyBfbm90XyBydW4sIGFuZCBoZW5jZSBjYW5ub3QgYmUKK2Jhc2VkIGRpcmVjdGx5IG9uIGEgaG9zdCBjbG9jay4KKworVG8gcmVhZCB0aGUgdmFsdWUsIHRoZSBrZXJuZWwgbXVzdCBwZXJmb3JtIGFuIElPX1JFQUQoVElNRV9MT1cpLCB3aGljaCByZXR1cm5zCithbiB1bnNpZ25lZCAzMi1iaXQgdmFsdWUsIGJlZm9yZSBhbiBJT19SRUFEKFRJTUVfSElHSCksIHdoaWNoIHJldHVybnMgYSBzaWduZWQKKzMyLWJpdCB2YWx1ZSwgY29ycmVzcG9uZGluZyB0byB0aGUgaGlnaGVyIGhhbGYgb2YgdGhlIGZ1bGwgdmFsdWUuCisKK1RoZSBkZXZpY2UgY2FuIGFsc28gYmUgdXNlZCB0byBwcm9ncmFtIGFuIGFsYXJtLCB3aXRoIHNvbWV0aGluZyBsaWtlOgorCisgIElPX1dSSVRFKEFMQVJNX0hJR0gsIDxoaWdoLXZhbHVlPikgIC8vIE11c3QgaGFwcGVuIGZpcnN0LgorICBJT19XUklURShBTEFSTV9MT1csIDxsb3ctdmFsdWU+KSAgICAvLyBNdXN0IGhhcHBlbiBzZWNvbmQuCisKK1doZW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgcmVhY2hlZCwgdGhlIGRldmljZSB3aWxsIHJhaXNlIGl0cyBJUlEuIE5vdGUKK3RoYXQgdGhlIElSUSBpcyByYWlzZWQgYXMgc29vbiBhcyB0aGUgc2Vjb25kIElPX1dSSVRFKCkgaWYgdGhlIGFsYXJtIHZhbHVlIGlzCithbHJlYWR5IG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4KKworSU9fV1JJVEUoQ0xFQVJfSU5URVJSVVBULCA8YW55PikgY2FuIGJlIHVzZWQgdG8gbG93ZXIgdGhlIElSUSBsZXZlbCBvbmNlIHRoZQorYWxhcm0gaGFzIGJlZW4gaGFuZGxlZCBieSB0aGUga2VybmVsLgorCitJT19XUklURShDTEVBUl9BTEFSTSwgPGFueT4pIGNhbiBiZSB1c2VkIHRvIGRpc2FybSBhbiBleGlzdGluZyBhbGFybSwgaWYgYW55LgorCitOb3RlOiBBdCB0aGUgbW9tZW50LCB0aGUgYWxhcm0gaXMgb25seSB1c2VkIG9uIEFSTS1iYXNlZCBzeXN0ZW0uIE1JUFMgYmFzZWQKKyAgICAgIHN5c3RlbXMgb25seSB1c2UgVElNRV9MT1cgLyBUSU1FX0hJR0ggb24gdGhpcyBkZXZpY2UuCisKKworSUlJLiBHb2xkZmlzaCByZWFsLXRpbWUgY2xvY2sgKFJUQyk6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvdGltZXIuYworICAkS0VSTkVML2RyaXZlcnMvcnRjL3J0Yy1nb2xkZmlzaC5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF9ydGMKKyAgSWQ6IC0xCisgIElycUNvdW50OiAxCisgIEkvTyBSZWdpc3RlcnM6CisgICAgMHgwMCAgVElNRV9MT1cgICAgICAgICBSOiBHZXQgY3VycmVudCB0aW1lLCB0aGVuIHJldHVybiBsb3ctb3JkZXIgMzItYml0cy4KKyAgICAweDA0ICBUSU1FX0hJR0ggICAgICAgIFI6IFJldHVybiBoaWdoIDMyLWJpdHMsIGZyb20gcHJldmlvdXMgVElNRV9MT1cgcmVhZC4KKyAgICAweDA4ICBBTEFSTV9MT1cgICAgICAgIFc6IFNldCBsb3cgMzItYml0IHZhbHVlIG9yIGFsYXJtLCB0aGVuIGFybSBpdC4KKyAgICAweDBjICBBTEFSTV9ISUdIICAgICAgIFc6IFNldCBoaWdoIDMyLWJpdCB2YWx1ZSBvZiBhbGFybS4KKyAgICAweDEwICBDTEVBUl9JTlRFUlJVUFQgIFc6IExvd2VyIGRldmljZSdzIGlycSBsZXZlbC4KKworVGhpcyBkZXZpY2UgaXMgX3ZlcnlfIHNpbWlsYXIgdG8gdGhlIEdvbGRmaXNoIHRpbWVyIG9uZSwgd2l0aCB0aGUgZm9sbG93aW5nCitpbXBvcnRhbnQgZGlmZmVyZW5jZXM6CisKKyAgLSBWYWx1ZXMgcmVwb3J0ZWQgYXJlIHN0aWxsIDY0LWJpdCBuYW5vc2Vjb25kcywgYnV0IHRoZXkgaGF2ZSBhIGdyYW51bGFyaXR5CisgICAgb2YgMSBzZWNvbmQsIGFuZCByZXByZXNlbnQgaG9zdC1zcGVjaWZpYyB2YWx1ZXMgKHJlYWxseSAndGltZSgpICogMWU5JykKKworICAtIFRoZSBhbGFybSBpcyBub24tZnVuY3Rpb25pbmcsIGkuZS4gd3JpdGluZyB0byBBTEFSTV9MT1cgLyBBTEFSTV9ISUdIIHdpbGwKKyAgICB3b3JrLCBidXQgd2lsbCBuZXZlciBhcm0gYW55IGFsYXJtLgorCitUbyBzdXBwb3J0IG9sZCBHb2xkZmlzaCBrZXJuZWxzLCBtYWtlIHN1cmUgdG8gc3VwcG9ydCB3cml0aW5nIHRvCitBTEFSTV9MT1cgLyBBTEFSTV9ISUdIIC8gQ0xFQVJfSU5URVJSVVBULCBldmVuIGlmIHRoZSBkZXZpY2UgbmV2ZXIgcmFpc2VzIGl0cworSVJRLgorCisKK0lWLiBHb2xkZmlzaCBzZXJpYWwgcG9ydCAodHR5KToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMKKyAgJEtFUk5FTC9kcml2ZXJzL2NoYXIvZ29sZGZpc2hfdHR5LmMKKyAgJEtFUk5FTC9hcmNoL2FybS9tYWNoLWdvbGRmaXNoL2luY2x1ZGUvZGVidWctbWFjcm8uUworCitEZXZpY2UgcHJvcGVydGllczoKKyAgTmFtZTogZ29sZGZpc2hfdHR5CisgIElkOiAwIHRvIE4KKyAgSXJxQ291bnQ6CisgIEkvTyBSZWdpc3RlcnM6CisgICAgMHgwMCAgUFVUX0NIQVIgICAgICBXOiBXcml0ZSBhIHNpbmdsZSA4LWJpdCB2YWx1ZSB0byB0aGUgc2VyaWFsIHBvcnQuCisgICAgMHgwNCAgQllURVNfUkVBRFkgICBSOiBSZWFkIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlcmVkIGlucHV0IGJ5dGVzLgorICAgIDB4MDggIENNRCAgICAgICAgICAgVzogU2VuZCBjb21tYW5kIChzZWUgYmVsb3cpLgorICAgIDB4MTAgIERBVEFfUFRSICAgICAgVzogV3JpdGUga2VybmVsIGJ1ZmZlciBhZGRyZXNzLgorICAgIDB4MTQgIERBVEFfTEVOICAgICAgVzogV3JpdGUga2VybmVsIGJ1ZmZlciBzaXplLgorCisgICAgIyBGb3IgNjQtYml0IGd1ZXN0IENQVXMgb25seToKKyAgICAweDE4ICBEQVRBX1BUUl9ISUdIICAgIFc6IFdyaXRlIGhpZ2ggMzIgYml0cyBvZiBrZXJuZWwgYnVmZmVyIGFkZHJlc3MuCisKK1RoaXMgaXMgdGhlIGZpcnN0IGNhc2Ugb2YgYSBtdWx0aS1pbnN0YW5jZSBnb2xkZmlzaCBkZXZpY2UgaW4gdGhpcyBkb2N1bWVudC4KK0VhY2ggaW5zdGFuY2UgaW1wbGVtZW50cyBhIHZpcnR1YWwgc2VyaWFsIHBvcnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGludGVybmFsCitidWZmZXIgd2hlcmUgaW5jb21pbmcgZGF0YSBpcyBzdG9yZWQgdW50aWwgdGhlIGtlcm5lbCBmZXRjaGVzIGl0LgorCitUaGUgQ01EIEkvTyByZWdpc3RlciBpcyB1c2VkIHRvIHNlbmQgdmFyaW91cyBjb21tYW5kcyB0byB0aGUgZGV2aWNlLCBpZGVudGlmaWVkCitieSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAweDAwICBDTURfSU5UX0RJU0FCTEUgICBEaXNhYmxlIGRldmljZS4KKyAgMHgwMSAgQ01EX0lOVF9FTkFCTEUgICAgRW5hYmxlIGRldmljZS4KKyAgMHgwMiAgQ01EX1dSSVRFX0JVRkZFUiAgV3JpdGUgYnVmZmVyIGZyb20ga2VybmVsIHRvIGRldmljZS4KKyAgMHgwMyAgQ01EX1JFQURfQlVGRkVSICAgUmVhZCBidWZmZXIgZnJvbSBkZXZpY2UgdG8ga2VybmVsLgorCitFYWNoIGRldmljZSBpbnN0YW5jZSB1c2VzIG9uZSBJUlEgdGhhdCBpcyByYWlzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcworaW5jb21pbmcvYnVmZmVyZWQgZGF0YSB0byByZWFkLiBUbyByZWFkIHN1Y2ggZGF0YSwgdGhlIGtlcm5lbCBzaG91bGQgZG8gdGhlCitmb2xsb3dpbmc6CisKKyAgICBsZW4gPSBJT19SRUFEKFBVVF9DSEFSKTsgICAvLyBSZWFkIGxlbmd0aCBvZiBpbmNvbWluZyBkYXRhLgorICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOyAgICAgIC8vIE5vdGhpbmcgdG8gZG8uCisKKyAgICBhdmFpbGFibGUgPSBnZXRfYnVmZmVyKGxlbiwgJmJ1ZmZlcik7ICAvLyBHZXQgYWRkcmVzcyBvZiBidWZmZXIgYW5kIGl0cyBzaXplLgorICAgICNpZiA2NEJJVF9HVUVTVF9DUFUKKyAgICBJT19XUklURShEQVRBX1BUUl9ISUdILCBidWZmZXIgPj4gMzIpOworICAgICNlbmRpZgorICAgIElPX1dSSVRFKERBVEFfUFRSLCBidWZmZXIpOyAgICAgICAgICAgIC8vIFdyaXRlIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZS4KKyAgICBJT19XUklURShEQVRBX0xFTiwgYXZhaWxhYmxlKTsgICAgICAgICAvLyBXcml0ZSBidWZmZXIgbGVuZ3RoIHRvIGRldmljZS4KKyAgICBJT19XUklURShDTUQsIENNRF9SRUFEX0JVRkZFUik7ICAgICAgICAvLyBSZWFkIHRoZSBkYXRhIGludG8ga2VybmVsIGJ1ZmZlci4KKworVGhlIGRldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgbG93ZXIgaXRzIElSUSB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YQoraW4gaXRzIGJ1ZmZlci4gSG93ZXZlciwgdGhlIGtlcm5lbCBjYW4gYWxzbyB0ZW1wb3JhcmlseSBkaXNhYmxlIGRldmljZSBpbnRlcnJ1cHRzCit3aXRoIENNRF9JTlRfRElTQUJMRSAvIENNRF9JTlRfRU5BQkxFLgorCitOb3RlIHRoYXQgZGlzYWJsaW5nIGludGVycnVwdHMgZG9lcyBub3QgZmx1c2ggdGhlIGJ1ZmZlciwgbm9yIHByZXZlbnQgaXQgZnJvbQorYnVmZmVyaW5nIGZ1cnRoZXIgZGF0YSBmcm9tIGV4dGVybmFsIGlucHV0cy4KKworVG8gd3JpdGUgdG8gdGhlIHNlcmlhbCBwb3J0LCB0aGUgZGV2aWNlIGNhbiBlaXRoZXIgc2VuZCBhIHNpbmdsZSBieXRlIGF0IGEgdGltZQord2l0aDoKKworICBJT19XUklURShQVVRfQ0hBUiwgPHZhbHVlPikgICAgLy8gU2VuZCB0aGUgbG93ZXIgOCBiaXRzIG9mIDx2YWx1ZT4uCisKK09yIHVzZSB0aGUgbW9kZSBlZmZpY2llbnQgc2VxdWVuY2U6CisKKyAgI2lmIDY0QklUX0dVRVNUX0NQVQorICBJT19XUklURShEQVRBX1BUUl9ISUdILCBidWZmZXIgPj4gMzIpCisgICNlbmRpZgorICBJT19XUklURShEQVRBX1BUUiwgYnVmZmVyKQorICBJT19XUklURShEQVRBX0xFTiwgYnVmZmVyX2xlbikKKyAgSU9fV1JJVEUoQ01ELCBDTURfV1JJVEVfQlVGRkVSKQorCitUaGUgZm9ybWVyIGlzIGxlc3MgZWZmaWNpZW50IGJ1dCBzaW1wbGVyLCBhbmQgaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGhlIGtlcm5lbAordG8gc2VuZCBkZWJ1ZyBtZXNzYWdlcyBvbmx5LgorCitOb3RlIHRoYXQgdGhlIEFuZHJvaWQgZW11bGF0b3IgYWx3YXlzIHJlc2VydmVzIHRoZSBmaXJzdCB0d28gdmlydHVhbCBzZXJpYWwKK3BvcnRzOgorCisgIC0gVGhlIGZpcnN0IG9uZSBpcyB1c2VkIHRvIHJlY2VpdmUga2VybmVsIG1lc3NhZ2VzLCB0aGlzIGlzIGRvbmUgYnkgYWRkaW5nCisgICAgdGhlICdjb25zb2xlPXR0eVMwJyBwYXJhbWV0ZXIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUgaW4KKyAgICAkUUVNVS92bC1hbmRyb2lkLmMKKworICAtIFRoZSBzZWNvbmQgb25lIGlzIHVzZWQgdG8gc2V0dXAgdGhlIGxlZ2FjeSAicWVtdWQiIGNoYW5uZWwsIHVzZWQgb24gb2xkZXIKKyAgICBBbmRyb2lkIHBsYXRmb3JtIHJldmlzaW9ucy4gVGhpcyBpcyBkb25lIGJ5IGFkZGluZyAnYW5kcm9pZC5xZW11ZD10dHlTMScKKyAgICBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSBpbiAkUUVNVS92bC1hbmRyb2lkLmMKKworICAgIFJlYWQgZG9jcy9BTkRST0lELVFFTVVELlRYVCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHRoYXQgcGFzc2VzCisgICAgdGhyb3VnaCB0aGlzIHNlcmlhbCBwb3J0LiBJbiBhIG51dHNoZWxsLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGVtdWxhdGUgb2xkZXIKKyAgICBBbmRyb2lkIHJlbGVhc2VzIChlLmcuIGN1cGNha2UpLiBJdCBwcm92aWRlcyBhIGRpcmVjdCBjb21tdW5pY2F0aW9uIGNoYW5uZWwKKyAgICBiZXR3ZWVuIHRoZSBndWVzdCBzeXN0ZW0gYW5kIHRoZSBlbXVsYXRvci4KKworICAgIE1vcmUgcmVjZW50IEFuZHJvaWQgcGxhdGZvcm1zIGRvIG5vdCB1c2UgUUVNVUQgYW55bW9yZSwgYnV0IGluc3RlYWQgcmVseQorICAgIG9uIHRoZSBtdWNoIGZhc3RlciAiUUVNVSBwaXBlIiBkZXZpY2UsIGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIGRvY3VtZW50IGFzCisgICAgd2VsbCBhcyBpbiBkb2NzL0FORFJPSUQtUUVNVS1QSVBFLlRYVC4KKworCitWLiBHb2xkZmlzaCBmcmFtZWJ1ZmZlcjoKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxldmFudCBmaWxlczoKKyAgJFFFTVUvaHcvYW5kcm9pZC9nb2xkZmlzaC9mYi5jCisgICRLRVJORUwvZHJpdmVycy92aWRlby9nb2xkZmlzaF9mYi5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF9mYgorICBJZDogMCB0byBOICAob25seSBvbmUgdXNlZCBpbiBwcmFjdGljZSkuCisgIElycUNvdW50OiAwCisgIEkvTyBSZWdpc3RlcnM6CisgICAgMHgwMCAgR0VUX1dJRFRIICAgICAgIFI6IFJlYWQgZnJhbWVidWZmZXIgd2lkdGggaW4gcGl4ZWxzLgorICAgIDB4MDQgIEdFVF9IRUlHSFQgICAgICBSOiBSZWFkIGZyYW1lYnVmZmVyIGhlaWdodCBpbiBwaXhlbHMuCisgICAgMHgwOCAgSU5UX1NUQVRVUworICAgIDB4MGMgIElOVF9FTkFCTEUKKyAgICAweDEwICBTRVRfQkFTRQorICAgIDB4MTQgIFNFVF9ST1RBVElPTgorICAgIDB4MTggIFNFVF9CTEFOSyAgICAgICBXOiBTZXQgJ2JsYW5rJyBmbGFnLgorICAgIDB4MWMgIEdFVF9QSFlTX1dJRFRIICBSOiBSZWFkIGZyYW1lYnVmZmVyIHdpZHRoIGluIG1pbGxpbWV0ZXJzLgorICAgIDB4MjAgIEdFVF9QSFlTX0hFSUdIVCBSOiBSZWFkIGZyYW1lYnVmZmVyIGhlaWdodCBpbiBtaWxsaW1ldGVycy4KKyAgICAweDI0ICBHRVRfRk9STUFUICAgICAgUjogUmVhZCBmcmFtZWJ1ZmZlciBwaXhlbCBmb3JtYXQuCisKK1RoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgYSBiaXQgcGVjdWxpYXIsIGJlY2F1c2UgaXQgdXNlcywgaW4gYWRkaXRpb24gdG8gdGhlCit0eXBpY2FsIEkvTyByZWdpc3RlcnMgYW5kIElSUXMsIGEgbGFyZ2UgYXJlYSBvZiBwaHlzaWNhbCBtZW1vcnksIGFsbG9jYXRlZCBieQordGhlIGtlcm5lbCwgYnV0IHZpc2libGUgdG8gdGhlIGVtdWxhdG9yLCB0byBzdG9yZSBhIGxhcmdlIHBpeGVsIGJ1ZmZlci4KKworVGhlIGVtdWxhdG9yIGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwbGF5aW5nIHRoZSBmcmFtZWJ1ZmZlciBjb250ZW50IGluIGl0cyBVSQord2luZG93LCB3aGljaCBjYW4gYmUgcm90YXRlZCwgYXMgaW5zdHJ1Y3RlZCBieSB0aGUga2VybmVsLgorCitJTVBPUlRBTlQgTk9URTogV2hlbiBHUFUgZW11bGF0aW9uIGlzIGVuYWJsZWQsIHRoZSBmcmFtZWJ1ZmZlciB3aWxsIHR5cGljYWxseQorb25seSBiZSB1c2VkIGR1cmluZyBib290LiBOb3RlIHRoYXQgR1BVIGVtdWxhdGlvbiBkb2Vzbid0IHJlbHkgb24gYSBzcGVjaWZpYwordmlydHVhbCBHUFUgZGV2aWNlLCBob3dldmVyLCBpdCB1c2VzIHRoZSAiUUVNVSBQaXBlIiBkZXZpY2UgZGVzY3JpYmVkIGJlbG93LgorRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWFkOgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC9hbmRyb2lkLWVtdWdsL0RFU0lHTgorCitPbiBib290LCB0aGUga2VybmVsIHdpbGwgcmVhZCB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIGZyYW1lYnVmZmVyOgorCisgIElPX1JFQUQoR0VUX1dJRFRIKSBhbmQgSU9fUkVBRChHRVRfSEVJR0hUKSByZXR1cm4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YKKyAgdGhlIGZyYW1lYnVmZmVyIGluIHBpeGVscy4gTm90ZSB0aGF0IGEgJ3JvdycgY29ycmVzcG9uZHMgdG8gY29uc2VjdXRpdmUgYnl0ZXMKKyAgaW4gbWVtb3J5LCBidXQgZG9lc24ndCBuZWNlc3NhcmlseSB0byBhbiBob3Jpem9udGFsIGxpbmUgb24gdGhlIGZpbmFsIGRpc3BsYXksCisgIGR1ZSB0byBwb3NzaWJsZSByb3RhdGlvbiAoc2VlIFNFVF9ST1RBVElPTiBiZWxvdykuCisKKyAgSU9fUkVBRChHRVRfUEhZU19XSURUSCkgYW5kIElPX1JFQUQoR0VUX1BIWVNfSEVJR0hUKSByZXR1cm4gdGhlIGVtdWxhdGVkCisgIHBoeXNpY2FsIHdpZHRoIGFuZCBoZWlnaHQgaW4gbWlsbGltZXRlcnMsIHRoaXMgaXMgbGF0ZXIgdXNlZCBieSB0aGUga2VybmVsCisgIGFuZCB0aGUgcGxhdGZvcm0gdG8gZGV0ZXJtaW5lIHRoZSBkZXZpY2UncyBlbXVsYXRlZCBkZW5zaXR5LgorCisgIElPX1JFQUQoR0VUX0ZPUk1BVCkgcmV0dXJucyBhIHZhbHVlIG1hdGNoaW5nIHRoZSBmb3JtYXQgb2YgcGl4ZWxzIGluIHRoZQorICBmcmFtZWJ1ZmZlci4gTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBBbmRyb2lkIGhhcmR3YXJlCisgIGFic3RyYWN0aW9uIGxheWVyIChIQUwpIGFuZCBjYW5ub3QgY2hhbmdlOgorCisgICAgMHgwMSAgSEFMX1BJWEVMX0ZPUk1BVF9CUkdBXzg4ODgKKyAgICAweDAyICBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OAorICAgIDB4MDMgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OAorICAgIDB4MDQgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NQorICAgIDB4MDUgIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4CisgICAgMHgwNiAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEKKyAgICAweDA4ICBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NAorCisgIEhPV0VWRVIsIHRoZSBrZXJuZWwgZHJpdmVyIG9ubHkgZXhwZWN0cyBhIHZhbHVlIG9mIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NQorICBhdCB0aGUgbW9tZW50LiBVbnRpbCB0aGlzIGlzIGZpeGVkLCB0aGUgdmlydHVhbCBkZXZpY2Ugc2hvdWxkIGFsd2F5cyByZXR1cm4KKyAgdGhlIHZhbHVlIDB4MDQgaGVyZS4gUm93cyBhcmUgbm90IHBhZGRlZCwgc28gdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzaW5nbGUKKyAgZnJhbWVidWZmZXIgd2lsbCBhbHdheXMgYmUgZXhhY3RseSAnd2lkdGggKiBoZWlndGggKiAyJy4KKworICBOb3RlIHRoYXQgR1BVIGVtdWxhdGlvbiBkb2Vzbid0IGhhdmUgdGhpcyBsaW1pdGF0aW9uIGFuZCBjYW4gdXNlIGFuZCBkaXNwbGF5CisgIDMyLWJpdCBzdXJmYWNlcyBwcm9wZXJseSwgYmVjYXVzZSBpdCBkb2Vzbid0IHVzZSB0aGUgZnJhbWVidWZmZXIuCisKK1RoZSBkZXZpY2UgaGFzIGEgJ2JsYW5rJyBmbGFnLiBXaGVuIHNldCB0byAxLCB0aGUgVUkgc2hvdWxkIG9ubHkgZGlzcGxheSBhbgorZW1wdHkvYmxhbmsgZnJhbWVidWZmZXIsIGlnbm9yaW5nIHRoZSBjb250ZW50IG9mIHRoZSBmcmFtZWJ1ZmZlciBtZW1vcnkuCitJdCBpcyBzZXQgd2l0aCBJT19XUklURShTRVRfQkxBTkssIDx2YWx1ZT4pLCB3aGVyZSB2YWx1ZSBjYW4gYmUgMSBvciAwLiBUaGlzIGlzCit1c2VkIHdoZW4gc2ltdWxhdGluZyBzdXNwZW5kL3Jlc3VtZS4KKworSU1QT1JUQU5UOiBUaGUgZnJhbWVidWZmZXIgbWVtb3J5IGlzIGFsbG9jYXRlZCBieSB0aGUga2VybmVsLCB3aGljaCB3aWxsIHNlbmQKK2l0cyBwaHlzaWNhbCBhZGRyZXNzIHRvIHRoZSBkZXZpY2UgYnkgdXNpbmcgSU9fV1JJVEUoU0VUX0JBU0UsIDxhZGRyZXNzPikuCisKK1RoZSBrZXJuZWwgcmVhbGx5IGFsbG9jYXRlcyBhIG1lbW9yeSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgKnR3byoKK2ZyYW1lYnVmZmVycywgaW4gb3JkZXIgdG8gaW1wbGVtZW50IHBhbm5pbmcgLyBkb3VibGUtYnVmZmVyaW5nLiBUaGlzIGFsc28gbWVhbnMKK3RoYXQgY2FsbHMgdG8gSU9fV1JJVEUoU0VUX0JBU0UsIDxhZGRyZXNzPikgd2lsbCBiZSBmcmVxdWVudC4KKworVGhlIGFsbG9jYXRpb24gaGFwcGVucyB3aXRoIGRtYV9hbGxvY193cml0ZWNvbWJpbmUoKSBvbiBBUk0sIHdoaWNoIGNhbiBvbmx5CithbGxvY2F0ZSBhIG1heGltdW0gb2YgNCBNQiwgdGhpcyBsaW1pdHMgdGhlIHNpemUgb2YgZWFjaCBmcmFtZWJ1ZmZlciB0byAyIE1CLAord2hpY2ggbWF5IG5vdCBiZSBlbm91Z2ggdG8gZW11bGF0ZSBoaWdoLWRlbnNpdHkgZGV2aWNlcyA6LSgKKworRm9yIG90aGVyIGFyY2hpdGVjdHVyZXMsIGRtYV9hbGxvY19jb2hlcmVudCgpIGlzIHVzZWQgaW5zdGVhZCwgYW5kIGhhcyB0aGUgc2FtZQordXBwZXIgbGltaXQgLyBsaW1pdGF0aW9uLgorCitUT0RPKGRpZ2l0KTogRXhwbGFpbiBob3cgaXQncyBwb3NzaWJsZSB0byByYWlzZSB0aGlzIGxpbWl0IGJ5IG1vZGlmeWluZgorICAgICAgICAgICAgIENPTlNJU1RFTlRfRE1BX1NJWkUgYW5kL29yIE1BWF9PUkRFUiBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uCisKK1RoZSBkZXZpY2UgdXNlcyBhIHNpbmdsZSBJUlEgdG8gbm90aWZ5IHRoZSBrZXJuZWwgb2Ygc2V2ZXJhbCBldmVudHMuIFdoZW4gaXQKK2lzIHJhaXNlZCwgdGhlIGtlcm5lbCBJUlEgaGFuZGxlciBtdXN0IElPX1JFQUQoSU5UX1NUQVRVUyksIHdoaWNoIHdpbGwgcmV0dXJuCithIHZhbHVlIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBiaXQgZmxhZ3M6CisKKyAgYml0IDA6IFNldCB0byAxIHRvIGluZGljYXRlIGEgVlNZTkMgZXZlbnQuCisKKyAgYml0IDE6IFNldCB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRlbnQgb2YgYSBwcmV2aW91cyBTRVRfQkFTRSBoYXMKKyAgICAgICAgIGJlZW4gcHJvcGVybHkgZGlzcGxheWVkLgorCitOb3RlIHRoYXQgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIGFsc28gbG93ZXJzIHRoZSBkZXZpY2UncyBJUlEgbGV2ZWwuCisKK1RoZSBzZWNvbmQgZmxhZyBpcyBlc3NlbnRpYWxseSBhIHdheSB0byBub3RpZnkgdGhlIGtlcm5lbCB0aGF0IGFuCitJT19XUklURShTRVRfQkFTRSwgPGFkZHJlc3M+KSBvcGVyYXRpb24gaGFzIGJlZW4gc3VjY2VzZnVsbHkgcHJvY2Vzc2VkIGJ5Cit0aGUgZW11bGF0b3IsIGkuZS4gdGhhdCB0aGUgbmV3IGNvbnRlbnQgaGFzIGJlZW4gZGlzcGxheWVkIHRvIHRoZSB1c2VyLgorCitUaGUga2VybmVsIGNhbiBjb250cm9sIHdoaWNoIGZsYWdzIHNob3VsZCByYWlzZSBhbiBJUlEgYnkgdXNpbmcKK0lPX1dSSVRFKElOVF9FTkFCTEUsIDxmbGFncz4pLCB3aGVyZSA8ZmxhZ3M+IGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlCityZXN1bHQgb2YgSU9fUkVBRChJTlRfU1RBVFVTKS4gSWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGlzIDAsIHRoZSBhbiBJUlEKK2ZvciB0aGUgY29ycmVzcG9uZGluZyBldmVudCB3aWxsIG5ldmVyIGJlIGdlbmVyYXRlZCwKKworCitWSS4gR29sZGZpc2ggYXVkaW8gZGV2aWNlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvYXVkaW8uYworICAkS0VSTkVML2RyaXZlcnMvbWlzYy9nb2xkZmlzaF9hdWRpby5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF9hdWRpbworICBJZDogLTEKKyAgSXJxQ291bnQ6IDEKKyAgSS9PIFJlZ2lzdGVyczoKKyAgICAweDAwICBJTlRfU1RBVFVTCisgICAgMHgwNCAgSU5UX0VOQUJMRQorICAgIDB4MDggIFNFVF9XUklURV9CVUZGRVJfMSAgICAgVzogU2V0IGFkZHJlc3Mgb2YgZmlyc3Qga2VybmVsIG91dHB1dCBidWZmZXIuCisgICAgMHgwYyAgU0VUX1dSSVRFX0JVRkZFUl8yICAgICBXOiBTZXQgYWRkcmVzcyBvZiBzZWNvbmQga2VybmVsIG91dHB1dCBidWZmZXIuCisgICAgMHgxMCAgV1JJVEVfQlVGRkVSXzEgICAgICAgICBXOiBTZW5kIGZpcnN0IGtlcm5lbCBidWZmZXIgc2FtcGxlcyB0byBvdXRwdXQuCisgICAgMHgxNCAgV1JJVEVfQlVGRkVSXzIgICAgICAgICBXOiBTZW5kIHNlY29uZCBrZXJuZWwgYnVmZmVyIHNhbXBsZXMgdG8gb3V0cHV0LgorICAgIDB4MTggIFJFQURfU1VQUE9SVEVEICAgICAgICAgUjogUmVhZHMgMSBpZiBpbnB1dCBpcyBzdXBwb3J0ZWQsIDAgb3RoZXJ3aXNlLgorICAgIDB4MWMgIFNFVF9SRUFEX0JVRkZFUgorICAgIDB4MjAgIFNUQVJUX1JFQUQKKyAgICAweDI0ICBSRUFEX0JVRkZFUl9BVkFJTEFCTEUKKworICAgICMgRm9yIDY0LWJpdCBndWVzdCBDUFVzCisgICAgMHgyOCAgU0VUX1dSSVRFX0JVRkZFUl8xX0hJR0ggIFc6IFNldCBoaWdoIDMyIGJpdHMgb2YgMXN0IGtlcm5lbCBvdXRwdXQgYnVmZmVyIGFkZHJlc3MuCisgICAgMHgzMCAgU0VUX1dSSVRFX0JVRkZFUl8yX0hJR0ggIFc6IFNldCBoaWdoIDMyIGJpdHMgIG9mIDJuZCBrZXJuZWwgb3V0cHV0IGJ1ZmZlciBhZGRyZXNzLgorICAgIDB4MzQgIFNFVF9SRUFEX0JVRkZFUl9ISUdIICAgICBXOiBTZXQgaGlnaCAzMiBiaXRzIG9mIGtlcm5lbCBpbnB1dCBidWZmZXIgYWRkcmVzcy4KKworVGhpcyBkZXZpY2UgaW1wbGVtZW50cyBhIHZpcnR1YWwgc291bmQgY2FyZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKworICAtIFN0ZXJlbyBvdXRwdXQgYXQgZml4ZWQgNDQuMSBrSHogZnJlcXVlbmN5LCB1c2luZyBzaWduZWQgMTYtYml0IHNhbXBsZXMuCisgICAgTWFuZGF0b3J5LgorCisgIC0gTW9ubyBpbnB1dCBhdCBmaXhlZCA4IGtIeiBmcmVxdWVuY3ksIHVzaW5nIHNpZ25lZCAxNi1iaXQgc2FtcGxlcy4KKyAgICBPcHRpb25hbC4KKworRm9yIG91dHB1dCwgdGhlIGtlcm5lbCBkcml2ZXIgYWxsb2NhdGVzIHR3byBpbnRlcm5hbCBidWZmZXJzIHRvIGhvbGQgb3V0cHV0CitzYW1wbGVzLCBhbmQgcGFzc2VzIHRoZWlyIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIGVtdWxhdG9yIGFzIGZvbGxvd3M6CisKKyAgI2lmIDY0QklUX0dVRVNUX0NQVQorICBJT19XUklURShTRVRfV1JJVEVfQlVGRkVSXzFfSElHSCwgKHVpbnQzMl90KShidWZmZXIxID4+IDMyKSk7CisgIElPX1dSSVRFKFNFVF9XUklURV9CVUZGRVJfMl9ISUdILCAodWludDMyX3QpKGJ1ZmZlcjIgPj4gMzIpKTsKKyAgI2VuZGlmCisgIElPX1dSSVRFKFNFVF9XUklURV9CVUZGRVJfMSwgKHVpbnQzMl90KWJ1ZmZlcjEpOworICBJT19XUklURShTRVRfV1JJVEVfQlVGRkVSXzIsICh1aW50MzJfdClidWZmZXIyKTsKKworQWZ0ZXIgdGhpcywgc2FtcGxlcyB3aWxsIGJlIHNlbnQgZnJvbSB0aGUgZHJpdmVyIHRvIHRoZSB2aXJ0dWFsIGRldmljZSBieQordXNpbmcgb25lIG9mIElPX1dSSVRFKFdSSVRFX0JVRkZFUl8xLCA8bGVuZ3RoMT4pIG9yCitJT19XUklURShXUklURV9CVUZGRVJfMiwgPGxlbmd0aDI+KSwgZGVwZW5kaW5nIG9uIHdoaWNoIHNhbXBsZSBidWZmZXIgdG8gdXNlLgorTk9URTogRWFjaCBsZW5ndGggaXMgaW4gYnl0ZXMuCisKK05vdGUgaG93ZXZlciB0aGF0IHRoZSBkcml2ZXIgc2hvdWxkIHdhaXQsIGJlZm9yZSBkb2luZyB0aGlzLCB1bnRpbCB0aGUgZGV2aWNlCitnaXZlcyBwZXJtaXNzaW9uIGJ5IHJhaXNpbmcgaXRzIElSUSBhbmQgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgJ3N0YXR1cycgZmxhZ3MuCisKK1RoZSB2aXJ0dWFsIGRldmljZSBoYXMgYW4gaW50ZXJuYWwgJ2ludF9zdGF0dXMnIGZpZWxkIG1hZGUgb2YgMyBiaXQgZmxhZ3M6CisKKyAgYml0MDogMSBpZmYgdGhlIGRldmljZSBpcyByZWFkeSB0byByZWNlaXZlIGRhdGEgZnJvbSB0aGUgZmlyc3QgYnVmZmVyLgorICBiaXQxOiAxIGlmZiB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBzZWNvbmQgYnVmZmVyLgorICBiaXQyOiAxIGlmZiB0aGUgZGV2aWNlIGhhcyBpbnB1dCBzYW1wbGVzIGZvciB0aGUga2VybmVsIHRvIHJlYWQuCisKK05vdGUgdGhhdCBhbiBJT19SRUFEKElOVF9TVEFUVVMpIGFsc28gYXV0b21hdGljYWxseSBsb3dlcnMgdGhlIElSUSBsZXZlbCwKK2V4Y2VwdCBpZiB0aGUgcmVhZCB2YWx1ZSBpcyAwICh3aGljaCBzaG91bGQgbm90IGhhcHBlbiwgc2luY2UgaXQgc2hvdWxkIG5vdAorcmFpc2UgdGhlIElSUSkuCisKK1RoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdHMgY2FuIGJlIG1hc2tlZCBieSB1c2luZyBJT19XUklURShJTlRfRU5BQkxFLCA8bWFzaz4pLAord2hlcmUgPG1hc2s+IGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgJ2ludF9zdGF0dXMnLiBBIDEgYml0IGluIHRoZSBtYXNrIGVuYWJsZXMgdGhlCitJUlEgcmFpc2Ugd2hlbiB0aGUgY29ycmVzcG9uZGluZyBzdGF0dXMgYml0IGlzIGFsc28gc2V0IHRvIDEuCisKK0ZvciBpbnB1dCwgdGhlIGRyaXZlciBzaG91bGQgZmlyc3QgSU9fUkVBRChSRUFEX1NVUFBPUlRFRCksIHdoaWNoIHdpbGwgcmV0dXJuIDEKK2lmIHRoZSB2aXJ0dWFsIGRldmljZSBzdXBwb3J0cyBpbnB1dCwgb3IgMCBvdGhlcndpc2UuIElmIGl0IGRvZXMgc3VwcG9ydCBpdCwKK3RoZSBkcml2ZXIgbXVzdCBhbGxvY2F0ZSBhbiBpbnRlcm5hbCBidWZmZXIgYW5kIHNlbmQgaXRzIHBoeXNpY2FsIGFkZHJlc3Mgd2l0aAorSU9fV1JJVEUoU0VUX1JFQURfQlVGRkVSLCA8cmVhZC1idWZmZXI+KSAod2l0aCBhIHByZXZpb3VzIHdyaXRlIHRvCitTRVRfUkVBRF9CVUZGRVJfSElHSCBvbiA2NC1iaXQgZ3Vlc3QgQ1BVUyksIHRoZW4gcGVyZm9ybQorSU9fV1JJVEUoU1RBUlRfUkVBRCwgPHJlYWQtYnVmZmVyLWxlbmd0aD4pIHRvIHN0YXJ0IHJlY29yZGluZyBhbmQKK3NwZWNpZnkgdGhlIGtlcm5lbCdzIGJ1ZmZlciBsZW5ndGguCisKK0xhdGVyLCB0aGUgZGV2aWNlIHdpbGwgcmFpc2UgaXRzIElSUSBhbmQgc2V0IGJpdDIgb2YgJ2ludF9zdGF0dXMnIHRvIGluZGljYXRlCit0aGVyZSBhcmUgaW5jb21pbmcgc2FtcGxlcyB0byB0aGUgZHJpdmVyLiBJbiBpdHMgaW50ZXJydXB0IGhhbmRsZXIsIHRoZSBsYXR0ZXIKK3Nob3VsZCBJT19SRUFEKFJFQURfQlVGRkVSX0FWQUlMQUJMRSksIHdoaWNoIHRyaWdnZXJzIHRoZSB0cmFuc2ZlciAoZnJvbSB0aGUKK2RldmljZSB0byB0aGUga2VybmVsKSwgYXMgd2VsbCBhcyByZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNhbXBsZXMuCisKKworVklJLiBHb2xkZmlzaCBiYXR0ZXJ5OgorPT09PT09PT09PT09PT09PT09PT09PQorCitSZWxldmFudCBmaWxlczoKKyAgJFFFTVUvaHcvYW5kcm9pZC9nb2xkZmlzaC9iYXR0ZXJ5LmMKKyAgJFFFTVUvaHcvcG93ZXJfc3VwcGx5LmgKKyAgJEtFUk5FTC9kcml2ZXJzL3Bvd2VyL2dvbGRmaXNoX2JhdHRlcnkuYworCitEZXZpY2UgcHJvcGVydGllczoKKyAgTmFtZTogZ29sZGZpc2hfYmF0dGVyeQorICBJZDogLTEKKyAgSXJxQ291bnQ6IDEKKyAgSS9PIFJlZ2lzdGVyczoKKyAgICAweDAwIElOVF9TVEFUVVMgICBSOiBSZWFkIGJhdHRlcnkgYW5kIEEvQyBzdGF0dXMgY2hhbmdlIGJpdHMuCisgICAgMHgwNCBJTlRfRU5BQkxFICAgVzogRW5hYmxlIG9yIGRpc2FibGUgSVJRIG9uIHN0YXR1cyBjaGFuZ2UuCisgICAgMHgwOCBBQ19PTkxJTkUgICAgUjogUmVhZCAwIGlmIEFDIHBvd2VyIGRpc2Nvbm5lY3RlZCwgMSBvdGhlcndpc2UuCisgICAgMHgwYyBTVEFUVVMgICAgICAgUjogUmVhZCBiYXR0ZXJ5IHN0YXR1cyAoY2hhcmdpbmcvZnVsbC8uLi4gc2VlIGJlbG93KS4KKyAgICAweDEwIEhFQUxUSCAgICAgICBSOiBSZWFkIGJhdHRlcnkgaGVhbHRoIChnb29kL292ZXJoZWF0Ly4uLiBzZWUgYmVsb3cpLgorICAgIDB4MTQgUFJFU0VOVCAgICAgIFI6IFJlYWQgMSBpZiBiYXR0ZXJ5IGlzIHByZXNlbnQsIDAgb3RoZXJ3aXNlLgorICAgIDB4MTggQ0FQQUNJVFkgICAgIFI6IFJlYWQgYmF0dGVyeSBjaGFyZ2UgcGVyY2VudGFnZSBpbiBbMC4uMTAwXSByYW5nZS4KKworQSBzaW1wbGUgZGV2aWNlIHVzZWQgdG8gcmVwb3J0IHRoZSBzdGF0ZSBvZiB0aGUgdmlydHVhbCBkZXZpY2UncyBiYXR0ZXJ5LCBhbmQKK3doZXRoZXIgdGhlIGRldmljZSBpcyBwb3dlcmVkIHRocm91Z2ggYSBVU0Igb3IgQS9DIGFkYXB0ZXIuCisKK1RoZSBkZXZpY2UgdXNlcyBhIHNpbmdsZSBJUlEgdG8gbm90aWZ5IHRoZSBrZXJuZWwgdGhhdCB0aGUgYmF0dGVyeSBvciBBL0Mgc3RhdHVzCitjaGFuZ2VkLiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGtlcm5lbCBzaG91bGQgcGVyZm9ybSBhbiBJT19SRUFEKElOVF9TVEFUVVMpCit3aGljaCByZXR1cm5zIGEgMi1iaXQgdmFsdWUgY29udGFpbmluZyBmbGFnczoKKworICBiaXQgMDogU2V0IHRvIDEgdG8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gYmF0dGVyeSBzdGF0dXMuCisgIGJpdCAxOiBTZXQgdG8gMSB0byBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBBL0Mgc3RhdHVzLgorCitOb3RlIHRoYXQgcmVhZGluZyB0aGlzIHJlZ2lzdGVyIGFsc28gbG93ZXJzIHRoZSBJUlEgbGV2ZWwuCisKK1RoZSBBL0Mgc3RhdHVzIGNhbiBiZSByZWFkIHdpdGggSU9fUkVBRChBQ19PTkxJTkUpLCB3aGljaCByZXR1cm5zIDEgaWYgdGhlCitkZXZpY2UgaXMgcG93ZXJlZCwgb3IgMCBvdGhlcndpc2UuCisKK1RoZSBiYXR0ZXJ5IHN0YXR1cyBpcyBzcHJlYWQgb3ZlciBtdWx0aXBsZSBJL08gcmVnaXN0ZXJzOgorCisgIElPX1JFQUQoUFJFU0VOVCkgcmV0dXJucyAxIGlmIHRoZSBiYXR0ZXJ5IGlzIHByZXNlbnQgaW4gdGhlIHZpcnR1YWwgZGV2aWNlLAorICBvciAwIG90aGVyd2lzZS4KKworICBJT19SRUFEKENBUEFDSVRZKSByZXR1cm5zIHRoZSBiYXR0ZXJ5J3MgY2hhcmdlIHBlcmNlbnRhZ2UsIGFzIGFuIGludGVnZXIKKyAgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZS4gTk9URTogVGhpcyByZWdpc3RlciBpcyBwcm9iYWJseSBtaXNuYW1lZCBzaW5jZQorICBpdCBkb2VzIG5vdCByZXByZXNlbnQgdGhlIGJhdHRlcnkncyBjYXBhY2l0eSwgYnV0IGl0J3MgY3VycmVudCBjaGFyZ2UgbGV2ZWwuCisKKyAgSU9fUkVBRChTVEFUVVMpIHJldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisgICAgMHgwMCAgVU5LTk9XTiAgICAgIEJhdHRlcnkgc3RhdGUgaXMgdW5rbm93bi4KKyAgICAweDAxICBDSEFSR0lORyAgICAgQmF0dGVyeSBpcyBjaGFyZ2luZy4KKyAgICAweDAyICBESVNDSEFSR0lORyAgQmF0dGVyeSBpcyBkaXNjaGFyZ2luZy4KKyAgICAweDAzICBOT1RfQ0hBUkdJTkcgQmF0dGVyeSBpcyBub3QgY2hhcmdpbmcgKGUuZy4gZnVsbCBvciBkZWFkKS4KKworICBJT19SRUFEKEhFQUxUSCkgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICAweDAwICBVTktOT1dOICAgICAgICAgQmF0dGVyeSBoZWFsdGggdW5rbm93bi4KKyAgICAweDAxICBHT09EICAgICAgICAgICAgQmF0dGVyeSBpcyBpbiBnb29kIGNvbmRpdGlvbi4KKyAgICAweDAyICBPVkVSSEVBVElORyAgICAgQmF0dGVyeSBpcyBvdmVyLWhlYXRpbmcuCisgICAgMHgwMyAgREVBRCAgICAgICAgICAgIEJhdHRlcnkgaXMgZGVhZC4KKyAgICAweDA0ICBPVkVSVk9MVEFHRSAgICAgQmF0dGVyeSBnZW5lcmF0ZXMgdG9vIG11Y2ggdm9sdGFnZS4KKyAgICAweDA1ICBVTlNQRUNfRkFJTFVSRSAgQmF0dGVyeSBoYXMgdW5zcGVjaWZpZWQgZmFpbHVyZS4KKworVGhlIGtlcm5lbCBjYW4gdXNlIElPX1dSSVRFKElOVF9FTkFCTEUsIDxmbGFncz4pIHRvIHNlbGVjdCB3aGljaCBjb25kaXRpb24KK2NoYW5nZXMgc2hvdWxkIHRyaWdnZXIgYW4gSVJRLiA8ZmxhZ3M+IGlzIGEgMi1iaXQgdmFsdWUgdXNpbmcgdGhlIHNhbWUgZm9ybWF0CithcyBJTlRfU1RBVFVTLgorCisKK1ZJSUkuIEdvbGRmaXNoIGV2ZW50cyBkZXZpY2UgKHVzZXIgaW5wdXQpOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGV2YW50IGZpbGVzOgorICAkUUVNVS9ody9hbmRyb2lkL2dvbGRmaXNoL2V2ZW50c19kZXZpY2UuYworICAkS0VSTkVML2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ29sZGZpc2hfZXZlbnRzLmMKKworRGV2aWNlIHByb3BlcnRpZXM6CisgIE5hbWU6IGdvbGRmaXNoX2V2ZW50cworICBJZDogLTEKKyAgSXJxQ291bnQ6IDEKKyAgSS9PIFJlZ2lzdGVyczoKKyAgICAweDAwIFJFQUQgICAgICAgUjogUmVhZCBuZXh0IGV2ZW50IHR5cGUsIGNvZGUgb3IgdmFsdWUuCisgICAgMHgwMCBTRVRfUEFHRSAgIFc6IFNldCBwYWdlIGluZGV4LgorICAgIDB4MDQgTEVOICAgICAgICBSOiBSZWFkIGxlbmd0aCBvZiBwYWdlIGRhdGEuCisgICAgMHgwOCBEQVRBICAgICAgIFI6IFJlYWQgcGFnZSBkYXRhLgorICAgIC4uLi4gICAgICAgICAgICBSOiBSZWFkIGFkZGl0aW9uYWwgcGFnZSBkYXRhIChzZWUgYmVsb3cpLgorCitUaGlzIGRldmljZSBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBzZXZlcmFsIGtpbmRzIG9mIHVzZXIgaW5wdXQgZXZlbnRzIHRvCit0aGUga2VybmVsLCBpLmUuIGVtdWxhdGVkIGRldmljZSBidXR0b25zLCBoYXJkd2FyZSBrZXlib2FyZCwgdG91Y2ggc2NyZWVuLAordHJhY2tiYWxsIGFuZCBsaWQgZXZlbnRzLgorCitOT1RFOiBBbmRyb2lkIHN1cHBvcnRzIG90aGVyIGlucHV0IGRldmljZXMgbGlrZSBtaWNlIG9yIGdhbWUgY29udHJvbGxlcnMKKyAgICAgIHRocm91Z2ggVVNCIG9yIEJsdWV0b290aCwgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2aXJ0dWFsCisgICAgICBHb2xkZmlzaCBkZXZpY2UuCisKK05PVEU6IFRoZSAnbGlkIGV2ZW50JyBpcyB1c2VmdWwgZm9yIGRldmljZXMgd2l0aCBhIGNsYW1zaGVsbCBvZiBmb2xkYWJsZQorICAgICAga2V5Ym9hcmQgZGVzaWduLCBhbmQgaXMgdXNlZCB0byByZXBvcnQgd2hlbiBpdCBpcyBvcGVuZWQgb3IgY2xvc2VkLgorCitBcyBwZXIgTGludXggY29udmVudGlvbnMsIGVhY2ggJ2VtdWxhdGVkIGV2ZW50JyBpcyBzZW50IHRvIHRoZSBrZXJuZWwgYXMgYQorc2VyaWVzIG9mICg8dHlwZT4sPGNvZGU+LDx2YWx1ZT4pIHRyaXBsZXRzIG9yIDMyLWJpdCB2YWx1ZXMuIEZvciBtb3JlCitpbmZvcm1hdGlvbiwgc2VlOgorCisgIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vaW5wdXQvaW5wdXQudHh0CisKK0FzIHdlbGwgYXMgdGhlIDxsaW51eC9pbnB1dC5oPiBrZXJuZWwgaGVhZGVyLgorCitOb3RlIHRoYXQgaW4gdGhlIGNvbnRleHQgb2YgZ29sZGZpc2g6CisKKyAtIEJ1dHRvbiBhbmQga2V5Ym9hcmQgZXZlbnRzIGFyZSByZXBvcnRlZCB3aXRoOgorICAgICAoRVZfS0VZLCA8Y29kZT4sIDxwcmVzcz4pCisKKyAgIFdoZXJlIDxjb2RlPiBpcyBhIDktYml0IGtleWNvZGUsIGFzIGRlZmluZWQgYnkgPGxpbnV4L2lucHV0Lmg+LCBhbmQKKyAgIDxwcmVzcz4gaXMgMSBmb3Iga2V5L2J1dHRvbiBwcmVzc2VzLCBhbmQgMCBmb3IgcmVsZWFzZXMuCisKKyAtIEZvciB0b3VjaHNjcmVlbiBldmVudHMsIGEgc2luZ2xlLXRvdWNoIGV2ZW50IGlzIHJlcG9ydGVkIHdpdGg6CisgICAgIChFVl9BQlMsIEFCU19YLCA8eC1wb3NpdGlvbj4pICsKKyAgICAgKEVWX0FCUywgQUJTX1ksIDx5LXBvc2l0aW9uPikgKworICAgICAoRVZfQUJTLCBBQlNfWiwgMCkgKworICAgICAoRVZfS0VZLCBCVE5fVE9VQ0gsIDxidXR0b24tc3RhdGU+KSArCisgICAgIChFVl9TWU4sIDAsIDApCisKKyAgIHdoZXJlIDx4LXBvc2l0aW9uPiBhbmQgPHktcG9zaXRpb24+IGFyZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgcG9zaXRpb24KKyAgIG9mIHRoZSB0b3VjaCBldmVudCwgcmVzcGVjdGZ1bGx5LCBhbmQgPGJ1dHRvbi1zdGF0ZT4gaXMgZWl0aGVyIDEgb3IgMCBhbmQKKyAgIGluZGljYXRlcyB0aGUgc3RhcnQvZW5kIG9mIHRoZSB0b3VjaCBnZXN0dXJlLCByZXNwZWN0aXZlbHkuCisKKyAtIEZvciBtdWx0aS10b3VjaCBldmVudHMsIHRoaW5ncyBhcmUgbXVjaCBtb3JlIGNvbXBsaWNhdGVkLiBJbiBhIG51dHNoZWxsLAorICAgdGhlc2UgZXZlbnRzIGFyZSByZXBvcnRlZCB0aHJvdWdoIChFVl9BQlMsIEFCU19NVF9YWFhYWCwgWVlZKSB0cmlwbGV0cywKKyAgIGFzIGRvY3VtZW50ZWQgYXQ6CisKKyAgIGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0CisKKyAgIFRPRE8oZGlnaXQpOiBUaGVyZSBtYXkgYmUgYnVncyBpbiBlaXRoZXIgdGhlIHZpcnR1YWwgZGV2aWNlIG9yIGRyaXZlciBjb2RlCisgICAgICAgICAgICAgICAgd2hlbiBpdCBjb21lcyB0byBtdWx0aS10b3VjaC4gSXJvbiBvdXQgdGhlIHNpdHVhdGlvbiBhbmQgYmV0dGVyCisgICAgICAgICAgICAgICAgZXhwbGFpbiB3aGF0J3MgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbGwgQW5kcm9pZCBwbGF0Zm9ybXMuCisKKyAtIEZvciB0cmFja2JhbGwgZXZlbnRzOgorICAgICAoRVZfUkVMLCBSRUxfWCwgPHgtZGVsdGE+KSArCisgICAgIChFVl9SRUwsIFJFTF9ZLCA8eS1kZWx0YT4pICsKKyAgICAgKEVWX1NZTiwgMCwgMCkKKworICAgV2hlcmUgPHgtZGVsdGE+IGFuZCA8eS1kZWx0YT4gYXJlIHRoZSBzaWduZWQgcmVsYXRpdmUgdHJhY2tiYWxsIGRpc3BsYWNlbWVudAorICAgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpcmVjdGlvbnMsIHJlc3BlY3RpdmVseS4KKworIC0gRm9yIGxpZCBldmVudHM6CisgICAgIChFVl9TVywgMCwgMSkgKyAoRVZfU1lOLCAwLCAwKSAgICAvLyBXaGVuIGxpZCBpcyBjbG9zZWQuCisgICAgIChFVl9TVywgMCwgMCkgKyAoRVZfU1lOLCAwLCAwKSAgICAvLyBXaGVuIGxpZCBpcyBvcGVuZWQuCisKK1doZW4gdGhlIGtlcm5lbCBkcml2ZXIgc3RhcnRzLCBpdCB3aWxsIHByb2JlIHRoZSBkZXZpY2UgdG8ga25vdyB3aGF0IGtpbmQKK29mIGV2ZW50cyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBlbXVsYXRlZCBjb25maWd1cmF0aW9uLiBUaGVyZSBhcmUgc2V2ZXJhbAorY2F0ZWdvcmllcyBvZiBxdWVyaWVzOgorCisgIC0gQXNraW5nIGZvciB0aGUgY3VycmVudCBwaHlzaWNhbCBrZXlib2FyZCAnY2hhcm1hcCcgbmFtZSwgdXNlZCBieSB0aGUgc3lzdGVtCisgICAgdG8gdHJhbnNsYXRlIGtleWNvZGVzIGluIGFjdHVhbCBjaGFyYWN0ZXJzLiBJbiBwcmFjdGljZSwgdGhpcyB3aWxsIG5lYXJseQorICAgIGFsd2F5cyBiZSAnZ29sZGZpc2gnIGZvciBlbXVsYXRlZCBzeXN0ZW1zLCBidXQgdGhpcyBvdXQgb2Ygc3BlYyBmb3IgdGhpcworICAgIGRvY3VtZW50LgorCisgIC0gQXNraW5nIHdoaWNoIGV2ZW50IGNvZGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGEgZ2l2ZW4gZXZlbnQgdHlwZQorICAgIChlLmcuIGFsbCB0aGUgcG9zc2libGUgS0VZX1hYWCB2YWx1ZXMgZ2VuZXJhdGVkIGZvciBFVl9LRVkgdHlwZWQgdHJpcGxldHMpLgorCisgIC0gQXNraW5nIGZvciB2YXJpb3VzIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMgZm9yIGVhY2ggc3VwcG9ydGVkIEVWX0FCUworICAgIGV2ZW50IGNvZGUuIEZvciBleGFtcGxlIHRoZSBtaW4vbWF4IHZhbHVlcyBvZiAoRVZfQUJTLCBBQlNfWCwgLi4uKSB0cmlwbGV0cywKKyAgICB0byBrbm93IHRoZSBib3VuZHMgb2YgdGhlIGlucHV0IHRvdWNoIHBhbmVsLgorCitUaGUga2VybmVsIGRyaXZlciBmaXJzdCBzZWxlY3Qgd2hpY2gga2luZCBvZiBxdWVyeSBpdCB3YW50cyBieSB1c2luZworSU9fV1JJVEUoU0VUX1BBR0UsIDxwYWdlPiksIHdoZXJlIDxwYWdlPiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyAgICBQQUdFX05BTUUgICAgMHgwMDAwICAgS2V5Ym9hcmQgY2hhcm1hcCBuYW1lLgorICAgIFBBR0VfRVZCSVRTICAweDEwMDAwICBFdmVudCBjb2RlIHN1cHBvcnRlZCBzZXRzLgorICAgIFBBR0VfQUJTREFUQSAweDIwMDAzICAocmVhbGx5IDB4MjAwMDAgKyBFVl9BQlMpIEVWX0FCUyBtaW4vbWF4IHZhbHVlcy4KKworT25jZSBhICdwYWdlJyBoYXMgYmVlbiBzZWxlY3RlZCwgaXQgaXMgcG9zc2libGUgdG8gcmVhZCBmcm9tIGl0IHdpdGgKK0lPX1JFQUQoTEVOKSBhbmQgSU9fUkVBRChEQVRBKS4gSW4gcHJhY3RpY2U6CisKKyAgLSBUbyByZWFkIHRoZSBuYW1lIG9mIHRoZSBrZXlib2FyZCBjaGFybWFwLCB0aGUga2VybmVsIHdpbGwgZG86CisKKyAgICAgIElPX1dSSVRFKFNFVF9QQUdFLCBQQUdFX05BTUUpOyAgIyBJbmQKKworICAgICAgY2hhcm1hcF9uYW1lX2xlbiA9IElPX1JFQUQoTEVOKTsKKyAgICAgIGNoYXJtYXBfbmFtZSA9IGthbGxvYyhjaGFybWFwX25hbWVfbGVuICsgMSk7CisgICAgICBmb3IgKGludCBuID0gMDsgbiA8IGNoYXJtYXBfbmFtZV9sZW47ICsrbikKKyAgICAgICAgY2hhcm1hcF9uYW1lW25dID0gKGNoYXIpIElPX1JFQUQoREFUQSk7CisgICAgICBjaGFybWFwX25hbWVbbl0gPSAwOworCisgIC0gVG8gcmVhZCB3aGljaCBjb2RlcyBhIGdpdmVuIGV2ZW50IHR5cGUgKGhlcmUgRVZfS0VZKSBzdXBwb3J0czoKKworICAgICAgSU9fV1JJVEUoU0VUX1BBR0UsIFBBR0VfRVZCSVRTICsgRVZfS0VZKTsgIC8vIE9yIEVWX1JFTCwgRVZfQUJTLCBldGMuLi4KKworICAgICAgYml0bWFza19sZW4gPSBJT19SRUFEKExFTik7CisgICAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBiaXRtYXNrX2xlbjsgKytvZmZzZXQpIHsKKyAgICAgICAgICB1aW50OF90IG1hc2sgPSAodWludDhfdCkgSU9fUkVBRChEQVRBKToKKyAgICAgICAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQgPCA4OyArK2JpdCkgeworICAgICAgICAgICAgICBpbnQgY29kZSA9IChvZmZzZXQgKiA4KSArIGJpdDsKKyAgICAgICAgICAgICAgaWYgKChtYXNrICYgKDEgPDwgYml0KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgLi4uIHJlY29yZCB0aGF0IGtleWNvZGUgfGNvZGV8IGlzIHN1cHBvcnRlZC4KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgIH0KKworICAtIFRvIHJlYWQgdGhlIHJhbmdlIHZhbHVlcyBvZiBhYnNvbHV0ZSBldmVudCB2YWx1ZXM6CisKKyAgICAgIElPX1dSSVRFKFNFVF9QQUdFLCBQQUdFX0FCU0RBVEEpOworICAgICAgbWF4X2VudHJpZXMgPSBJT19SRUFEKExFTik7CisgICAgICBmb3IgKGludCBuID0gMDsgbiA8IG1heF9lbnRyaWVzOyBuICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBtaW4gPSBJT19SRUFEKERBVEEgKyBuKTsKKyAgICAgICAgaW50MzJfdCBtYXggPSBJT19SRUFEKERBVEEgKyBuICsgNCk7CisgICAgICAgIGludDMyX3QgZnV6eiA9IElPX1JFQUQoREFUQSArIG4gKyA4KTsKKyAgICAgICAgaW50MzJfdCBmbGF0ID0gSU9fUkVBRChEQVRBICsgbiArIDEyKTsKKyAgICAgICAgaW50IGV2ZW50X2NvZGUgPSBuLzQ7CisKKyAgICAgICAgLy8gUmVjb3JkIChtaW4sIG1heCwgZnV6eiwgZmxhdCkgdmFsdWVzIGZvciBFVl9BQlMgJ2V2ZW50X2NvZGUnLgorICAgICAgfQorCisgICAgTm90ZSB0aGF0IHRoZSAnZnV6eicgYW5kICdmbGF0JyB2YWx1ZXMgcmVwb3J0ZWQgYnkgR29sZGZpc2ggYXJlIGFsd2F5cyAwLAorICAgIHJlZmVyIHRvIHRoZSBzb3VyY2UgZm9yIG1vcmUgZGV0YWlscy4KKworQXQgcnVudGltZSwgdGhlIGRldmljZSBpbXBsZW1lbnRzIGEgc21hbGwgYnVmZmVyIGZvciBpbmNvbWluZyBldmVudCB0cmlwbGV0cworKGVhY2ggb25lIGlzIHN0b3JlZCBhcyB0aHJlZSAzMi1iaXQgaW50ZWdlcnMgaW4gYSBjaXJjdWxhciBidWZmZXIpLCBhbmQgcmFpc2VzCitpdHMgSVJRIHRvIHNpZ25hbCB0aGVtIHRvIHRoZSBrZXJuZWwuCisKK1doZW4gdGhhdCBoYXBwZW5zLCB0aGUga2VybmVsIGRyaXZlciBzaG91bGQgdXNlIElPX1JFQUQoUkVBRCkgdG8gZXh0cmFjdCB0aGUKKzMyLWJpdCB2YWx1ZXMgZnJvbSB0aGUgZGV2aWNlLiBOb3RlIHRoYXQgdGhyZWUgSU9fUkVBRCgpIGNhbGxzIGFyZSByZXF1aXJlZCB0bworZXh0cmFjdCBhIHNpbmdsZSBldmVudCB0cmlwbGV0LgorCitUaGVyZSBhcmUgYSBmZXcgaW1wb3J0YW50IG5vdGVzIGhlcmU6CisKKyAgLSBUaGUgSVJRIHNob3VsZCBub3QgYmUgcmFpc2VkIF9iZWZvcmVfIHRoZSBrZXJuZWwgZHJpdmVyIGlzIHN0YXJ0ZWQKKyAgICAob3RoZXJ3aXNlIHRoZSBkcml2ZXIgd2lsbCBiZSBjb25mdXNlZCBhbmQgaWdub3JlIGFsbCBldmVudHMpLgorCisgICAgSS5lLiB0aGUgZW11bGF0b3IgY2FuIGJ1ZmZlciBldmVudHMgYmVmb3JlIGtlcm5lbCBpbml0aWFsaXphdGlvbiBjb21wbGV0ZXMsCisgICAgYnV0IHNob3VsZCBvbmx5IHJhaXNlIHRoZSBJUlEsIGlmIG5lZWRlZCwgbGF6aWx5LiBDdXJyZW50bHkgdGhpcyBpcyBkb25lCisgICAgb24gdGhlIGZpcnN0IElPX1JFQUQoTEVOKSBmb2xsb3dpbmcgYSBJT19XUklURShTRVRfUEFHRSwgUEFHRV9BQlNEQVRBKS4KKworICAtIFRoZSBJUlEgaXMgbG93ZXJlZCBieSB0aGUgZGV2aWNlIG9uY2UgYWxsIGV2ZW50IHZhbHVlcyBoYXZlIGJlZW4gcmVhZCwKKyAgICBpLmUuIGl0cyBidWZmZXIgaXMgZW1wdHkuCisKKyAgICBIb3dldmVyLCBvbiB4ODYsIGlmIGFmdGVyIGFuIElPX1JFQUQoUkVBRCksIHRoZXJlIGFyZSBzdGlsbCB2YWx1ZXMgaW4gdGhlCisgICAgZGV2aWNlJ3MgYnVmZmVyLCB0aGUgSVJRIHNob3VsZCBiZSBsb3dlcmVkIHRoZW4gcmUtcmFpc2VkIGltbWVkaWF0ZWx5LgorCisKK0lYLiBHb2xkZmlzaCBOQU5EIGRldmljZToKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvbmFuZC5jCisgICRLRVJORUwvZHJpdmVycy9tdGQvZGV2aWNlcy9nb2xkZmlzaF9uYW5kLmMKKworRGV2aWNlIHByb3BlcnRpZXM6CisgIE5hbWU6IGdvbGRmaXNoX25hbmQKKyAgSWQ6IC0xCisgIElycUNvdW50OiAxCisgIEkvTyBSZWdpc3RlcnM6CisKK1RoaXMgdmlydHVhbCBkZXZpY2UgY2FuIHByb3ZpZGUgYWNjZXNzIHRvIG9uZSBvciBtb3JlIGVtdWxhdGVkIE5BTkQgbWVtb3J5CitiYW5rcyBbM10gKGVhY2ggb25lIGJlaW5nIGJhY2tlZCBieSBhIGRpZmZlcmVudCBob3N0IGZpbGUgaW4gdGhlIGN1cnJlbnQKK2ltcGxlbWVudGF0aW9uKS4KKworVGhlc2UgYXJlIHVzZWQgdG8gYmFjayB0aGUgZm9sbG93aW5nIHZpcnR1YWwgcGFydGl0aW9uIGZpbGVzOgorCisgIC0gc3lzdGVtLmltZworICAtIGRhdGEuaW1nCisgIC0gY2FjaGUuaW1nCisKK1RPRE8oZGlnaXQpOiBDb21wbGV0ZSB0aGlzLgorCisKK1szXSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZsYXNoX21lbW9yeSNOQU5EX21lbW9yaWVzCisKKworWC4gR29sZGZpc2ggTU1DIGRldmljZToKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGV2YW50IGZpbGVzOgorICAkUUVNVS9ody9hbmRyb2lkL2dvbGRmaXNoL21tYy5jCisgICRLRVJORUwvZHJpdmVycy9tbWMvaG9zdC9nb2xkZmlzaC5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF9tbWMKKyAgSWQ6IC0xCisgIElycUNvdW50OiAxCisgIEkvTyBSZWdpc3RlcnM6CisKK1NpbWlsYXIgdG8gdGhlIE5BTkQgZGV2aWNlLCBidXQgdXNlcyBhIGRpZmZlcmVudCwgaGlnaGVyLWxldmVsIGludGVyZmFjZQordG8gYWNjZXNzIHRoZSBlbXVsYXRlZCAnZmxhc2gnIG1lbW9yeS4gVGhpcyBpcyBvbmx5IHVzZWQgdG8gYWNjZXNzIHRoZQordmlydHVhbCBTRENhcmQgZGV2aWNlIHdpdGggdGhlIEFuZHJvaWQgZW11bGF0b3IuCisKK1RPRE8oZGlnaXQpOiBDb21wbGV0ZSB0aGlzLgorCisKK1hJVi4gUUVNVSBQaXBlIGRldmljZToKKz09PT09PT09PT09PT09PT09PT09PT0KKworUmVsZXZhbnQgZmlsZXM6CisgICRRRU1VL2h3L2FuZHJvaWQvZ29sZGZpc2gvcGlwZS5jCisgICRLRVJORUwvZHJpdmVycy9taXNjL3FlbXVwaXBlL3FlbXVfcGlwZS5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBxZW11X3BpcGUKKyAgSWQ6IC0xCisgIElycUNvdW50OiAxCisgIEkvTyBSZWdpc3RlcnM6CisgICAgMHgwMCAgQ09NTUFORCAgICAgICAgICBXOiBXcml0ZSB0byBwZXJmb3JtIGNvbW1hbmQgKHNlZSBiZWxvdykuCisgICAgMHgwNCAgU1RBVFVTICAgICAgICAgICBSOiBSZWFkIHN0YXR1cworICAgIDB4MDggIENIQU5ORUwgICAgICAgICAgUlc6IFJlYWQgb3Igc2V0IGN1cnJlbnQgY2hhbm5lbCBpZC4KKyAgICAweDBjICBTSVpFICAgICAgICAgICAgIFJXOiBSZWFkIG9yIHNldCBjdXJyZW50IGJ1ZmZlciBzaXplLgorICAgIDB4MTAgIEFERFJFU1MgICAgICAgICAgUlc6IFJlYWQgb3Igc2V0IGN1cnJlbnQgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MuCisgICAgMHgxNCAgV0FLRVMgICAgICAgICAgICBSOiBSZWFkIHdha2UgZmxhZ3MuCisgICAgMHgxOCAgUEFSQU1TX0FERFJfTE9XICBSVzogUmVhZC9zZXQgbG93IGJ5dGVzIG9mIHBhcmFtZXRlcnMgYmxvY2sgYWRkcmVzcy4KKyAgICAweDFjICBQQVJBTVNfQUREUl9ISUdIIFJXOiBSZWFkL3NldCBoaWdoIGJ5dGVzIG9mIHBhcmFtZXRlcnMgYmxvY2sgYWRkcmVzcy4KKyAgICAweDIwICBBQ0NFU1NfUEFSQU1TICAgIFc6IFBlcmZvcm0gYWNjZXNzIHdpdGggcGFyYW1ldGVyIGJsb2NrLgorCitUaGlzIGlzIGEgc3BlY2lhbCBkZXZpY2UgdGhhdCBpcyB0b3RhbGx5IHNwZWNpZmljIHRvIFFFTVUsIGJ1dCBhbGxvd3MgZ3Vlc3QKK3Byb2Nlc3NlcyB0byBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBlbXVsYXRvciB3aXRoIGV4dHJlbWVseSBoaWdoCitwZXJmb3JtYW5jZS4gVGhpcyBpcyBhY2hpZXZlZCBieSBhdm9pZGluZyBhbnkgaW4ta2VybmVsIG1lbW9yeSBjb3BpZXMsIHJlbHlpbmcKK29uIHRoZSBmYWN0IHRoYXQgUUVNVSBjYW4gYWNjZXNzIGd1ZXN0IG1lbW9yeSBhdCBydW50aW1lICh1bmRlciBwcm9wZXIKK2NvbmRpdGlvbnMgY29udHJvbGxlZCBieSB0aGUga2VybmVsKS4KKworUGxlYXNlIHJlZmVyIHRvICRRRU1VL2RvY3MvQU5EUk9JRC1RRU1VLVBJUEUuVFhUIGZvciBmdWxsIGRldGFpbHMgb24gdGhlCitkZXZpY2UncyBvcGVyYXRpb25zLgorCisKK1hJSUkuIFFFTVUgVHJhY2UgZGV2aWNlOgorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlbGV2YW50IGZpbGVzOgorICAkUUVNVS9ody9hbmRyb2lkL2dvbGRmaXNoL3RyYWNlLmMKKyAgJEtFUk5FTC9kcml2ZXJzL21pc2MvcWVtdXRyYWNlL3FlbXVfdHJhY2UuYworICAkS0VSTkVML2RyaXZlcnMvbWlzYy9xZW11dHJhY2UvcWVtdV90cmFjZV9zeXNmcy5jCisgICRLRVJORUwvZnMvZXhlYy5jCisgICRLRVJORUwvZXhpdC5jCisgICRLRVJORUwvZm9yay5jCisgICRLRVJORUwvc2NoZWQvY29yZS5jCisgICRLRVJORUwvbW0vbW1hcC5jCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBxZW11X3RyYWNlCisgIElkOiAtMQorICBJcnFDb3VudDogMAorICBJL08gUmVnaXN0ZXJzOgorCitUT0RPKGRpZ2l0KQorCitYSVYuIEdvbGRmaXNoIHN5bmMgZGV2aWNlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIEdvbGRmaXNoIHN5bmMgZGV2aWNl4oCZcyBwdXJwb3NlIGlzIHRvIHByb3ZpZGUgYSBzaW1wbGUsIGtlcm5lbC1zcGFjZS1vbmx5LAorbGlnaHR3ZWlnaHQgcGF0aCB0byBub3RpZnkgdGhlIHZpcnR1YWwgZGV2aWNlIG9mIGhvc3QgZ3JhcGhpY3MgZXZlbnRzIHN1Y2ggYXMKK0dQVSBjb21tYW5kIGNvbXBsZXRpb24uIEl0IGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIGp1c3QgYWJvdXQgYW55dGhpbmcgZWxzZQorYXMgd2VsbCwgYnV0IHRoZSBtYWluIHVzZSBjYXNlIGlzIGluIGdyYXBoaWNzLiBXaXRoIHRoZSBnb2xkZmlzaCBzeW5jIGRldmljZSwKK0FuZHJvaWQgc3luYyBmcmFtZXdvcmsgY2FuIGJlIHVzZWQgaW4gdGhlIGd1ZXN0LCBhbGxvd2luZyBtb3JlIGFzeW5jaHJvbm91cworcHJvY2Vzc2luZyBhbmQgaGlnaGVyIGdyYXBoaWNzIHBlcmZvcm1hbmNlIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBzd19zeW5jX3VzZXIuCisKK0luIHBhcnRpY3VsYXIsIGl04oCZbGwgYmUgcG9zc2libGUgdG8gbm90IGhhdmUgdG8gbWFpbnRhaW4gc2VwYXJhdGUgcmVuZGVyaW5nCit0aHJlYWRzIGp1c3QgZm9yIHN5bmMuIEluZGVlZCwgYSBzZXBhcmF0ZSBHTCB0aHJlYWQgaXMgbmVjZXNzYXJ5IG9uIHRoZSBob3N0IHRvCit3YWl0IG9uIGhvc3QgZmVuY2UgY29tbWFuZHMsIGJ1dCB3aXRob3V0IG5lZWRpbmcgYWxsIHRoZSBleHRyYSBzdHVmZiB0aGF0IGNvbWVzCit3aXRoIGEgY29ubmVjdGlvbiB0byB0aGUgZ3Vlc3QuIEluIGZhY3QsIHdl4oCZZCBleHBlY3QgaGlnaGVyIHBlcmZvcm1hbmNlIGJlY2F1c2UKK29mIHRoZSBwb3RlbnRpYWwgbGFjayBvZiBleHRyYSBHTCBwaXBlIHRyYWZmaWMgdGhhdCB3b3VsZCBpbnZvbHZlIHJldHVybmluZwordmFsdWVzIHRvIHRoZSBndWVzdDsgYSBlZ2xDcmVhdGVTeW5jS0hSIHdpdGggQU5EUk9JRF9OQVRJVkVfRkVOQ0VfRkQgd291bGQgaGF2ZQordGhhdCBmZCBiZSBzaWduYWxlZCB3aXRob3V0IGFueSBleHRyYSBjYWxscyBzdWNoIGFzIGVnbENsaWVudFdhaXRTeW5jS0hSLgorCitCYXNpYyB1c2FnZQorLS0tLS0tLS0tLS0KKworSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgc3luYyBkZXZpY2UgaXMgdXNlZDoKKworMS4gZWdsQ3JlYXRlU3luY0tIUiBpcyBjYWxsZWQgaW4gdGhlIGd1ZXN0IHdpdGggdGhlICJ0eXBlIiBhcmd1bWVudCBzZXQgdG8KK0VHTF9TWU5DX05BVElWRV9GRU5DRV9BTkRST0lELiBUaGlzIHdpbGw6CisgIC0gSW5zZXJ0IGEgZmVuY2UgY29tbWFuZCBpbiB0aGUgT3BlbkdMIGNvbW1hbmQgc3RyZWFtIHRoYXQgc2VydmVzIGFzIGEKKyAgICBzeW5jaHJvbml6YXRpb24gcG9pbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28gY29tbW9uIHRvIGVnbENyZWF0ZVN5bmNLSFIKKyAgICB3aXRoIHRoZSAidHlwZSIgYXJndW1lbnQgc2V0IHRvIEVHTF9TWU5DX0ZFTkNFX0tIUiwgd2hpY2ggaXMgdGhlIG1pbmltYWwKKyAgICBub24tQW5kcm9pZC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KKyAgLSBVc2UgdGhlIHZpcnR1YWwgc3luYyBkZXZpY2UgdG8gcHJvdmlkZSBhIG5hdGl2ZSBmZW5jZSBvYmplY3QsIHdoaWNoIG1heQorICAgIGNyZWF0ZSBhIGZlbmNlIGZpbGUgZGVzY3JpcHRvciAoZmVuY2UgZmQpIGZvciB0aGUgQW5kcm9pZCBzeXN0ZW0gdG8KKyAgICB3YWl0IG9uLiBMaWtlIG90aGVyIHN5bmNocm9uaXphdGlvbiBvYmplY3RzLCB0aGUgZmVuY2Ugb2JqZWN0IGNhbiBiZQorICAgIGluIGFuIHVuc2lnbmFsZWQgb3Igc2lnbmFsZWQgc3RhdGUuIFdoZW4gdGhlIE9wZW5HTCBmZW5jZSBjb21tYW5kIGFib3ZlCisgICAgY29tcGxldGVzLCB0aGUgZmVuY2Ugb2JqZWN0IGlzIHNpZ25hbGVkLCBhbmQgdGhlcmUgYXJlIHByZS1leGlzdGluZworICAgIEFuZHJvaWQgc3luYyBmcmFtZXdvcmsgZnVuY3Rpb25zIHRoYXQgZG8gdGhlIHdhaXRpbmcgYW5kIGRldGVjdAorICAgIHNpZ25hbGVkIHN0YXR1cyBmb3IgZmVuY2UgZmQncy4KKyAgLSBUaGUgdmlydHVhbCBzeW5jIGRldmljZSBkb2VzIHRoZSBqb2Igb2YgZGV0ZXJtaW5pbmcgd2hlbiB0aGF0IGZlbmNlCisgICAgb2JqZWN0IGNhbiBiZSBjb25zaWRlcmVkIHNpZ25hbGVkLiBJdCBrbm93cyBhYm91dCB0aGUgc3BlY2lmaWMgT3BlbkdMCisgICAgZmVuY2Ugb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQsIGFuZCBpdCBjYW4gcXVlcnkgdGhlIGhvc3QgR1BVIHRvCisgICAga25vdyB3aGVuIHRoYXQgZmVuY2Ugb2JqZWN0IGlzIHNpZ25hbGVkIChGZW5jZSBjb21tYW5kcyAvIG9iamVjdHMKKyAgICBjb3JyZXNwb25kKS4KKzIuIFdoZW4gdGhlIGZlbmNlIG9iamVjdCBiZWNvbWVzIHNpZ25hbGVkLCBmdW5jdGlvbnMgd2FpdGluZyBvbiB0aGF0IGZlbmNlCisgICBvYmplY3QgY2FuIHRoZW4gcHJvY2VlZC4gVGhlIG1vc3QgZnJlcXVlbnQgdXNlIGNhc2UgaXMgU3VyZmFjZUZsaW5nZXIsCisgICBvbiBldmVyeSBidWZmZXIgc3dhcCBmb3IgYW55IE9wZW5HTCBhcHA6CisgICAtIEFwcCBjYWxscyBlZ2xTd2FwQnVmZmVycywgd2hpY2ggcXVldWVzIGEgYnVmZmVyIHdpdGggZmVuY2UgZmQgdG8KKyAgICAgU3VyZmFjZUZsaW5nZXIKKyAgIC0gVGhlIGJ1ZmZlciBpcyBub3QgZmluaXNoZWQgZHJhd2luZyB5ZXQsIGJ1dCBTdXJmYWNlRmxpbmdlciBpcyBub3cKKyAgICAgbm90aWZpZWQgdGhhdCB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcHJlc2VudCBhbG9uZyB3aXRoIGFueSBvdGhlcgorICAgICBpbmZvcm1hdGlvbiB0aGUgYnVmZmVyIG9iamVjdCBwcm92aWRlcywgYW5kIHRodXMsIFN1cmZhY2VGbGluZ2VyCisgICAgIGNhbiBkbyB3b3JrIGluIHBhcmFsbGVsLCB1cCB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIGZpbmlzaGVkIGJ1ZmZlcgorICAgICBpcyByZWFsbHkgbmVlZGVkIGluIGNvbXBvc2l0aW9uLgorICAgLSBUaGUgZmVuY2UgZmQgaXMgc2lnbmFsZWQsIGFuZCBTdXJmYWNlRmxpbmdlciBjYW4gc3RhcnQgZG9pbmcgb3BlcmF0aW9ucworICAgICB0aGF0IGRlcGVuZCBvbiB0aGUgYnVmZmVyIGJlaW5nIGZpbmlzaGVkLCBzdWNoIGFzIHNvbWUgb2YKKyAgICAgdGhlIGdyaXR0aWVyIHBhcnRzIG9mIHRoZSBsYXllciBjb21wb3NpdGlvbiBwcm9jZXNzLgorMy4gQ29udHJhc3QgdGhpcyB1c2FnZSB2ZXJzdXMgd2l0aG91dCB0aGUgdmlydHVhbCBzeW5jIGRldmljZSBhbmQgZmVuY2UgZmQnczoKKyAgIGEgc2VwYXJhdGUgT3BlbkdMIHRocmVhZCBpbiB0aGUgZ3Vlc3QgaGFzIHRvIGJlIHN0YXJ0ZWQgZm9yCisgICBldmVyeSBjb250ZXh0IHRoYXQgdXNlcyBzeW5jLCBqdXN0IHRvIGNhbGwgZWdsQ2xpZW50V2FpdFN5bmNLSFIgYW5kCisgICBtYW51YWxseSBub3RpZnkgU3VyZmFjZUZsaW5nZXIuIFdoaWNoIHdhcyBhbHNvIGEgcmVja2xlc3MgdW5kZXJzdGF0ZW1lbnQKKyAgIGJlY2F1c2UgU3VyZmFjZUZsaW5nZXIgcnVucyBpbiBhIGRpZmZlcmVudCBwcm9jZXNzIGZyb20gdGhlIE9wZW5HTCBhcHAuCisKK0ltcGxlbWVudGF0aW9uIG9mIGRldmljZSBhbmQgZHJpdmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgR29sZGZpc2ggc3luYyBkZXZpY2UgY29tbXVuaWNhdGVzIHdpdGggYSBndWVzdC1zaWRlIGtlcm5lbCBkcml2ZXIKK3Rocm91Z2ggY29tbWFuZHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBob3cgd2UgZGV0ZXJtaW5lIGZlbmNlIG9iamVjdHMKK2JlY29taW5nIHNpZ25hbGVkLCBpcyB0aHJvdWdoIGVnbENsaWVudFdhaXRTeW5jS0hSIGNhbGxzIGluIHRoZSBob3N0LgorCisxLiBHdWVzdC0+aG9zdCBjb21tYW5kcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gaW5pdGlhdGUgdGhlIGNhbGxzIHRvCitlZ2xDbGllbnRXYWl0U3luY0tIUiBvbiB0aGUgaG9zdCBhbG9uZyB3aXRoIGEgZWdsQ3JlYXRlU3luY0tIUiBjYWxsIHRoYXQKK3VzZXMgRUdMX1NZTkNfTkFUSVZFX0ZFTkNFX0FORFJPSUQuIFRoZSBwYXJ0aWN1bGFyIGNvbW1hbmQgdGhhdCBkb2VzIHRoaXMKK2lzIGtub3duIGFzIGEgInRyaWdnZXIgd2FpdCIgY29tbWFuZC4gT25jZSB0aGUgY2FsbCB0byBlZ2xDbGllbnRXYWl0U3luY0tIUgorb24gdGhlIGhvc3QgY29tcGxldGVzLCB3ZSB0aGVuIGlzc3VlIGEgaG9zdC0+Z3Vlc3QgY29tbWFuZCB0byB0ZWxsIHRoZSBndWVzdAordGhhdCB0aGUgd2FpdCBpcyBvdmVyICh1cG9uIHdoaWNoIHRoZSBmZW5jZSBmZCBpcyBzaWduYWxlZCkuCisKK0N1cnJlbnRseSwgdGhlcmUgYXJlIG5vIG90aGVyIGNvbW1hbmRzIG9mIGd1ZXN0LT5ob3N0IHR5cGUsIGV4Y2VwdCBwZXJoYXBzCitpbiB0aGUgZnV0dXJlLCB0byBzaWduYWwgdGhhdCBub3QgYWxsIGNvbW1hbmRzIGhhdmUgYmVlbiBoYW5kbGVkIGJ5Cit0aGUgY3VycmVudCBJUlEsIGFuZCB0byB0ZWxsIHRoZSB2aXJ0dWFsIGRldmljZSB0byBjb250aW51ZSByYWlzaW5nIHRoZSBJUlEsCitpbiBjYXNlIHdlIHdhbnQgR29sZGZpc2ggc3luYyBkZXZpY2UgSVJRcyB0byBiZSBzaG9ydCBhcyBwb3NzaWJsZSwgd2hpY2gKK21heSBkZWNyZWFzZSBDUFUgdXNhZ2UgZHVlIHRvIGludGVycnVwdHMgd2hlbiBvbiBoaWdoLXJlZnJlc2gtcmF0ZSBkaXNwbGF5cy4KKworMi4gSG9zdC0+Z3Vlc3QgY29tbWFuZHMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHNpZ25hbCBndWVzdCdzIGZlbmNlIG9iamVjdHMgZnJvbQordGhlIGhvc3Qgd2hlbiBhbiBFR0wgc3luYyBvYmplY3Qgb24gdGhlIGhvc3QgaXMgc2lnbmFsZWQuIFRoaXMgaW52b2x2ZXMgYW4KK2luY3JlbWVudCBvZiB0aGUgZ3Vlc3QncyB0aW1lbGluZTsgdGhlIGZlbmNlIG9iamVjdCBpbiB0aGUgZ3Vlc3QgaXMgY29uc2lkZXJlZAorc2lnbmFsZWQgd2hlbiB0aGUgdGltZWxpbmUgaW4gdGhlIGd1ZXN0IGlzIGluY3JlbWVudGVkIHBhc3QgdGhlIHBvaW50Cithc3NvY2lhdGVkIHdpdGggdGhlIGZlbmNlIG9iamVjdC4KKworVGhpcyBpcyBrbm93biBhcyBhICJ0aW1lbGluZSBpbmNyZW1lbnQiIGNvbW1hbmQuIEN1cnJlbnRseSwgYWxsIG90aGVyIGNvbW1hbmRzCitvZiBndWVzdC0+aG9zdCB0eXBlIGFyZSB1c2VkIG9ubHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisKK1RoZSB0eXBlIG9mIGRhdGEgcmVxdWlyZWQgdG8gcHJvY2VzcyBlYWNoIGNvbW1hbmQgaW5jbHVkZToKKworMS4gR3Vlc3QtPmhvc3QgY29tbWFuZHM6CisgICAgY29kZSBkZXNjcmliaW5nIHRoZSBjb21tYW5kIHRvIHBlcmZvcm0gKHVzdWFsbHksICJ0cmlnZ2VyIHdhaXQiKQorICAgIGhhbmRsZSB0byBob3N0IEVHTCBzeW5jIG9iamVjdAorICAgIGhhbmRsZSB0byBob3N0IHN5bmMgdGhyZWFkIG9iamVjdAorICAgIGhhbmRsZSB0byBndWVzdCdzIHRpbWVsaW5lIG9iamVjdAorCisyLiBIb3N0LT5ndWVzdCBjb21tYW5kczoKKyAgICBjb2RlIGRlc2NyaWJpbmcgdGhlIGNvbW1hbmQgKHVzdWFsbHksICJpbmNyZW1lbnQgdGltZWxpbmUiKQorICAgIG51bWJlciBkZXNjcmliaW5nIGhvdyBtdWNoIHRvIGluY3JlbWVudCB0aGUgdGltZWxpbmUKKyAgICBoYW5kbGUgdG8gZ3Vlc3QncyB0aW1lbGluZSBvYmplY3QKKyAgICB1bmlxdWUgSUQgZm9yIHRoZSBjb21tYW5kIGl0c2VsZiwgc28gdGhhdCB3ZSBjYW4gcHJvcGVybHkgd2FpdCBvbiByZXBsaWVzCisgICAgZnJvbSBndWVzdCBpZiBuZWVkZWQuCisKK0VhY2ggb2YgdGhlc2UgdHlwZXMgb2YgZGF0YSBpcyBwYWNrZWQgdXAgaW4gYSBzdHJ1Y3QgYW5kIHNlbnQgaW4gYmF0Y2hlcwordXNpbmcgY3B1X3BoeXNpY2FsX21lbW9yeV8ocmVhZHx3cml0ZSkuIFNZTkNfUkVHX0JBVENIXyhHVUVTVClDT01NQU5EIGlzIGEgcmVnaXN0ZXIKK3VzZWQgdG8gdGVsbCB1cyB3aGVuIHRoZSBhZGRyZXNzIGZvciBiYXRjaCBvcGVyYXRpb24gaXMgYmVpbmcgd3JpdHRlbiBvciByZWFkLgorCitUaGUgcGFydGljdWxhciBwaHlzaWNhbCBhZGRyZXNzIHdyaXR0ZW4gdG8gaXMgc2V0IHVwIHVwb24gaW5pdGlhbGl6YXRpb24KK29mIHRoZSBnb2xkZmlzaCBzeW5jIGRldmljZSBkcml2ZXIgaW4gdGhlIGtlcm5lbCwgdXNpbmcgdGhlIHJlZ2lzdGVycworU1lOQ19SRUdfQkFUQ0hfKEdVRVNUKUNPTU1BTkRfQUREUihfSElHSCkuIChfSElHSCkgZm9yIDY0LWJpdCBndWVzdHMuCisKK0RldmljZSBwcm9wZXJ0aWVzOgorICBOYW1lOiBnb2xkZmlzaF9zeW5jCisgIElkOiA/Pz8KKyAgSXJxQ291bnQ6IDEKKyAgSS9PIFJlZ2lzdGVyczoKKyAgICAweDAwLi4uMHgwNCBTWU5DX1JFR19CQVRDSF9DT01NQU5EICAgICAgICAgICAgICAgICBSL1c6IFRyaWdnZXJzIGJhdGNoIGhvc3QtPmd1ZXN0IGNvbW1hbmQKKyAgICAweDA0Li4uMHgwOCBTWU5DX1JFR19CQVRDSF9HVUVTVENPTU1BTkQgICAgICAgICAgICBSL1c6IFRyaWdnZXJzIGJhdGNoIGd1ZXN0LT5ob3N0IGNvbW1hbmQKKyAgICAweDA4Li4uMHgwYyBTWU5DX1JFR19CQVRDSF9DT01NQU5EX0FERFIgICAgICAgICAgICBSL1c6IFBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgYmF0Y2ggaG9zdC0+Z3Vlc3QgY29tbWFuZCBsaXZlcworICAgIDB4MGMuLi4weDEwIFNZTkNfUkVHX0JBVENIX0NPTU1BTkRfQUREUl9ISUdIICAgICAgIFIvVzogSGlnaGVyIGJpdHMgaWYgNjQtYml0CisgICAgMHgxMC4uLjB4MTQgU1lOQ19SRUdfQkFUQ0hfR1VFU1RDT01NQU5EX0FERFIgICAgICAgUi9XOiBQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIGJhdGNoIGd1ZXN0LT5ob3N0IGNvbW1hbmQgbGl2ZXMKKyAgICAweDE0Li4uMHgxOCBTWU5DX1JFR19CQVRDSF9HVUVTVENPTU1BTkRfQUREUl9ISUdIICBSL1c6IEhpZ2hlciBiaXRzIGlmIDY0LWJpdApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL0dQVS1FTVVMQVRJT04uVFhUIGIvYW5kcm9pZC9kb2NzL0dQVS1FTVVMQVRJT04uVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZmJhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL2RvY3MvR1BVLUVNVUxBVElPTi5UWFQKQEAgLTAsMCArMSwxNDYgQEAKK0FuIG92ZXJ2aWV3IG9mIEdQVSBFbXVsYXRpb24gZm9yIEFuZHJvaWQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitHUFUgZW11bGF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGZvbGxvd2luZCBBVkQgaGFyZHdhcmUgcHJvcGVydGllczoKKworICBody5ncHUuZW5hYmxlZCAgICBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciBHUFUgZW11bGF0aW9uIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIElmICdmYWxzZScsIHRoZSBidWlsdGluIGd1ZXN0IHNvZnR3YXJlIHJlbmRlcmVyIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgdXNlZCBpbnN0ZWFkLiBOb3RlIHRoYXQgdGhlIGxhdHRlciBpcyB2ZXJ5IHNsb3cgYW5kIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgR0xFUyAxLngsIHNvIG1vc3QgYXBwbGljYXRpb25zIHdpbGwgbm90IHJ1biB3aXRoCisgICAgICAgICAgICAgICAgICAgIGl0IHByb3Blcmx5LgorCisgIGh3LmdwdS5tb2RlICAgICAgIE9ubHkgdXNlZCB3aGVuIGh3LmdwdS5lbmFibGVkIGlzIG9uLiBUaGlzIGlzIGEgc3RyaW5nIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVzIHdoaWNoIGVtdWxhdGlvbiBtb2RlIHRvIHN1cHBvcnQuCisKK0F0IHRoaXMgdGltZSwgdGhlIGZvbGxvd2luZyBtb2RlcyBhcmUgc3VwcG9ydGVkOgorCisgICdob3N0JyAgICBUaGUgZGVmYXVsdCBtb2RlLCB1c2VzIHNwZWNpZmljIHRyYW5zbGF0b3IgbGlicmFyaWVzIHRvIGNvbnZlcnQKKyAgICAgICAgICAgIGd1ZXN0IEVHTC9HTEVTIGNvbW1hbmRzIGludG8gaG9zdCBkZXNrdG9wIEdMIG9uZXMuIFRoaXMgcmVxdWlyZXMKKyAgICAgICAgICAgIHZhbGlkIE9wZW5HTCBkcml2ZXJzIGluc3RhbGxlZCBvbiB0aGUgZGV2ZWxvcG1lbnQgbWFjaGluZSwgYW5kCisgICAgICAgICAgICBvZiBjb3Vyc2UgYSBkaXNwbGF5IGNvbm5lY3Rpb24uCisKKyAgICAgICAgICAgIE5vdGUgdGhhdCBvbiBzb21lIHBsYXRmb3JtcyAoV2luZG93cyBpbiBwYXJ0aWN1bGFyKSwgT3BlbkdMIGRyaXZlcnMKKyAgICAgICAgICAgIGNhbiBiZSBidWdneSwgcmVzdWx0aW5nIGluIHBvb3IgcGVyZm9ybWFuY2UsIHJlbmRlcmluZyBhcnRlZmFjdHMKKyAgICAgICAgICAgIG9yIGV2ZW4gY3Jhc2hlcy4gVG8gd29yay1hcm91bmQgdGhpcywgdXNlIHRoZSAnc3dpZnRzaGFkZXInIG1vZGUuCisKKyAgJ3N3aWZ0c2hhZGVyJworICAgICAgICAgICAgU29mdHdhcmUgT3BlbkdMIHJlbmRlcmVyIHVzaW5nIHRoZSBTd2lmdHNoYWRlciByZW5kZXJlci4KKyAgICAgICAgICAgIFRoaXMgaXMgcmVjb21tZW5kZWQgaWYgdGhlcmUgYXJlIGlzc3VlcyB3aXRoICdob3N0JyBtb2RlLgorICAgICAgICAgICAgSXQgaXMgZ2VuZXJhbGx5IHNsb3dlciB0aGFuIC1ncHUgaG9zdCwgYnV0IHdvcmtzIGVxdWFsbHkgd2VsbAorICAgICAgICAgICAgb24gYWxsIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisKKyAgICAgICAgICAgIFN3aWZ0c2hhZGVyIGFsc28gdGFrZXMgYWR2YW50YWdlIG9mIFNJTUQgb24gbW9kZXJuIENQVXM7CisgICAgICAgICAgICByZWR1Y2luZyBBVkQgcmVzb2x1dGlvbiBtYXkgcmVzdWx0IGluIHNtb290aGVyIHBlcmZvcm1hbmNlLgorCisgICAgICAgICAgICBBbm90aGVyIGJlbmVmaXQgb2YgJ3N3aWZ0c2hhZGVyJyBtb2RlIGlzIHRoYXQgaXQgY2FuIGJlIHJ1biBvbgorICAgICAgICAgICAgaGVhZGxlc3Mgc2VydmVycyB3aGljaCBkbyBub3QgaGF2ZSBhIEdQVSBvciBPcGVuR0wgbGlicmFyaWVzLgorCisgICdtZXNhJyAgICAoREVQUkVDQVRFRDsgcGxlYXNlIHVzZSAnc3dpZnRzaGFkZXInIG1vZGUgaWYgcG9zc2libGUpCisgICAgICAgICAgICBTb2Z0d2FyZS1iYXNlZCBkZXNrdG9wIEdMIHJlbmRlcmVyLCBiYXNlZCBvbiB0aGUgTWVzYTNEIGxpYnJhcnkuCisgICAgICAgICAgICBUaGlzIGlzIHNsb3dlciB0aGFuICdzd2lmdHNoYWRlcicgbW9kZSwKKyAgICAgICAgICAgIGFuZCBzbG93ZXIgdGhhbiAnaG9zdCcgbW9kZSBieSBhIGxhcmdlIG1hcmdpbi4KKworICAnYXV0bycgICAgVXNlcyAnaG9zdCcgbW9kZSBpZiBub3QgcmVtb3RpbmcgKE5YIG9yIENSRCksCisgICAgICAgICAgICAnc3dpZnRzaGFkZXInIG90aGVyd2lzZS4KKworICAnZ3Vlc3QnICAgVXNlIGEgZ3Vlc3Qtc2lkZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb24uCisKK0FsdGVybmF0aXZlbHksIG9uZSBjYW4gdXNlIHRoZSAnLWdwdSA8bW9kZT4nIG9wdGlvbiB0byBmb3JjZSBhIHNwZWNpZmljIG1vZGUuCitWYWx1ZXMgJ29uJywgJ29mZicgYW5kICdhdXRvJyBhcmUgYWxzbyByZWNvZ25pemVkLiBTZWUgLWhlbHAtZ3B1IGZvciBkZXRhaWxzLgorCitIb3N0IG1vZGUgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgYXQgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CisKKyAgICAgICAgJEVYRUNfRElSL2xpYi8KKyAgICAgICAgICAgICAgICBsaWJPcGVuZ2xSZW5kZXIuc28KKyAgICAgICAgICAgICAgICBsaWJFR0xfdHJhbnNsYXRvci5zbworICAgICAgICAgICAgICAgIGxpYkdMRVNfQ01fdHJhbnNsYXRvci5zbworICAgICAgICAgICAgICAgIGxpYkdMRVN2Ml90cmFuc2xhdG9yLnNvCisKKyAgICAgICAgJEVYRUNfRElSL2xpYjY0LworICAgICAgICAgICAgICAgIGxpYjY0T3BlbmdsUmVuZGVyLnNvCisgICAgICAgICAgICAgICAgbGliNjRFR0xfdHJhbnNsYXRvci5zbworICAgICAgICAgICAgICAgIGxpYjY0R0xFU19DTV90cmFuc2xhdG9yLnNvCisgICAgICAgICAgICAgICAgbGliNjRHTEVTdjJfdHJhbnNsYXRvci5zbworCitUaGUgZXhhbXBsZSBhYm92ZSBpcyBmb3IgTGludXgsIHRoZSBzaGFyZWQgbGlicmFyaWVzJyBleHRlbnNpb24gd2lsbCB2YXJ5Cit3aXRoIHRoZSBob3N0IHBsYXRmb3JtIChpLmUuIC5keWxpYiBmb3IgRGFyd2luLCBhbmQgLmRsbCBmb3IgV2luZG93cykuCisKK1BsZWFzZSByZWFkIHRoZSBhbmRyb2lkL2FuZHJvaWQtZW11Z2wvREVTSUdOIGRvY3VtZW50IGZpcnN0LCB3aGljaCBkZXNjcmliZXMKK2hvc3QgbW9kZSBlbXVsYXRpb24gaW4gZGV0YWlsLgorCitUaGUgTWVzYSBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBhbmRyb2lkL3NjcmlwdHMvYnVpbGQtbWVzYS5zaCBzY3JpcHQsCithbmQgaW5zdGFsbGVkIGRpZmZlcmVudGx5LCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLiBGb3IgTGludXgsIHRoaXMgd2lsbCBiZToKKworICAgICAgICAkRVhFQ19ESVIvbGliLworICAgICAgICAgICAgICAgIGdsZXNfbWVzYS8KKyAgICAgICAgICAgICAgICAgICAgbGliR0wuc28KKyAgICAgICAgICAgICAgICAgICAgbGliR0wuc28uMSAtPiBsaWJHTC5zbworCisgICAgICAgICRFWEVDX0RJUi9saWI2NC8KKyAgICAgICAgICAgICAgICBnbGVzX21lc2EvCisgICAgICAgICAgICAgICAgICAgIGxpYkdMLnNvCisgICAgICAgICAgICAgICAgICAgIGxpYkdMLnNvLjEgLT4gbGliR0wuc28KKworRm9yIFdpbmRvd3M6CisKKyAgICAgICAgJEVYRUNfRElSL2xpYi8KKyAgICAgICAgICAgICAgICBnbGVzX21lc2EvCisgICAgICAgICAgICAgICAgICAgIG9wZW5nbDMyLmRsbAorCisgICAgICAgICRFWEVDX0RJUi9saWI2NC8KKyAgICAgICAgICAgICAgICBnbGVzX21lc2EvCisgICAgICAgICAgICAgICAgICAgIG9wZW5nbDMyLmRsbAorCisKK1RoZSAnZW11bGF0b3InIGxhdW5jaGVyIHByb2dyYW0gd29ya3MgYXMgZm9sbG93czoKKworICAtIFBhcnNlIHRoZSBBVkQgY29uZmlndXJhdGlvbiB0byBzZWUgaWYgR1BVIGVtdWxhdGlvbiBpcyBlbmFibGVkLgorCisgIC0gSWYgZW5hYmxlZCwgcHJlcGVuZCAkRVhFQ19ESVIvPGxpYj4vIHRvIExEX0xJQlJBUllfUEFUSCAob3IgUEFUSCBvbgorICAgIFdpbmRvd3MpLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgaG9zdCBsaWJyYXJpZXMgd2lsbCBhbHdheXMgYmUgbG9hZGVkCisgICAgcHJvcGVybHkgdGhyb3VnaCBkbG9wZW4oKSAvIExvYWRMaWJyYXJ5KCkgbGF0ZXIuCisKKyAgLSBJZiAnbWVzYScgbW9kZSBpcyBlbmFibGVkLCBpdCB3aWxsIGFsc28gcHJlcGVuZCAkRVhFQ19ESVIvPGxpYj4vZ2xlc19tZXNhLworICAgIHRvIExEX0xJQlJBUllfUEFUSCAvIFBBVEgsIHRvIGVuc3VyZSB0aGUgY29ycmVzcG9uZGluZyBsaWJyYXJ5IGlzIGxvYWRlZC4KKworTm90ZSB0aGF0IG9uIExpbnV4LCB0aGUgbWVzYSBzdWItZGlyZWN0b3J5IGluY2x1ZGVzIGEgbGluayBmcm9tIGxpYkdMLnNvLjEKK3RvIGxpYkdMLnNvLiBUaGUgbGF0dGVyIGlzIHRoZSBNZXNhIHJlbmRlcmluZyBsaWJyYXJ5LiBUaGUgZm9ybWVyIGlzIGEgbGluaword2hpY2ggaXMgbmVlZGVkIGJlY2F1c2UgdGhlIEFuZHJvaWQgVUkgdXNlcyBTREwyIHdoaWNoIGxpbmtzIGFnYWluc3QgdGhpcworc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKworV2l0aG91dCB0aGUgc3ltbGluaywgY3JlYXRpbmcgdGhlIFVJIHdpbmRvdyB3aWxsIGxvYWQgdGhlIHN5c3RlbSB2ZXJzaW9uIG9mCitsaWJHTC5zby4xLCB3aGljaCB3aWxsIGxhdGVyIHByZXZlbnQgdGhlIGxvYWQgb2YgTWVzYSdzIGxpYkdMLnNvLgorCitJTVBPUlRBTlQgTk9URToKKworICAgIEF0IHRoaXMgdGltZSwgTWVzYSBkb2Vzbid0IGJ1aWxkIGZvciBPUyBYLCBhbmQgdGhlIHJlc3VsdGluZyBsaWJyYXJ5CisgICAgc3RpbGwgZGVwZW5kcyBvbiBYTGliIC8gV2luMzIgR0RJLiBUaGlzIG1lYW5zIHRoYXQgZm9yIHRydWUgaGVhZGxlc3MKKyAgICBlbXVsYXRpb24gb24gTGludXgsIG9uZSBzaG91bGQgcnVuIGFuIFh2ZmIgc2VydmVyIGFuZCBzZXQgRElTUExBWQorICAgIGFwcHJvcHJpYXRlbHkuCisKKworQW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgaXMgdGhlIGFiaWxpdHkgdG8gYWRkIG5ldyAiR1BVIGVtdWxhdGlvbiBiYWNrZW5kcyIuCitUaGUgJ2VtdWxhdG9yJyBwcm9ncmFtIHdpbGwgbG9vayBmb3IgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXM6CisKKyAgICRFWEVDX0RJUi88bGliPi9nbGVzXzxuYW1lPi8KKyAgICAgICAgbGliRUdMLnNvICAgICAgICAgICAgLT4gZGVza3RvcCBFR0wgbGlicmFyeQorICAgICAgICBsaWJHTEVTX0NNLnNvICAgICAgICAtPiBkZXNrdG9wIEdMRVN2MSBsaWJyYXJ5CisgICAgICAgIGxpYkdMRVN2Mi5jbyAgICAgICAgIC0+IGRlc2t0b3AgR0xFU3YyIGxpYnJhcnkKKworV2hlcmUgPG5hbWU+IGlzIGFuIGFyYml0cmFyeSBiYWNrZW5kIG5hbWUuCisKK0lmIG9uZSBvZiB0aGVzZSBsaWJyYXJpZXMgaXMgZGVmaW5lZCwgdGhlbiBpdCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudAordmFyaWFibGUgKGUuZy4gQU5EUk9JRF9FR0xfTElCIC8gQU5EUk9JRF9HTEVTdjFfTElCIC8gQU5EUk9JRF9HTEVTdjJfTElCKSB0bworZW5zdXJlIHRoYXQgbGliT3BlbmdsUmVuZGVyIHdpbGwgdXNlIGl0LCBpbnN0ZWFkIG9mIHRoZSBjb3JyZXNwb25kaW5nIGhvc3QKK3RyYW5zbGF0aW9uIGxpYnJhcnkuCisKKworVGhlIHNvdXJjZSBjb2RlIHJlbGF0ZWQgdG8gdGhlc2UgZmVhdHVyZXMgaXMgbG9jYXRlZCB1bmRlcjoKKworICBhbmRyb2lkL29wZW5nbGVzLmMgICAtPiBHUFUgZW11bGF0aW9uIGxvdy1sZXZlbCBpbml0aWFsaXphdGlvbiB3aGljaCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBlbXVsYXRpb24gZW5naW5lIGlzIHN0YXJ0ZWQuCisKKyAgYW5kcm9pZC9vcGVuZ2wvICAgICAgLT4gR1BVIGVtdWxhdGlvbiBzdXBwb3J0IGNvZGUgdGhhdCBpcyB1c2VkIGJ5ICdlbXVsYXRvcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvYmUgaW5zdGFsbGVkIGJhY2tlbmRzIGFuZCBzZWxlY3QgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIGJhc2VkIG9uIEFWRCBjb25maWd1cmF0aW9uIC8gY29tbWFuZC1saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIGFzIHdlbGwgYXMgc2V0dXAgdGhlIGVudmlyb25tZW50LgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9kb2NzL1BSRUJVSUxULUJJTkFSSUVTLlRYVCBiL2FuZHJvaWQvZG9jcy9QUkVCVUlMVC1CSU5BUklFUy5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyZmU1MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9QUkVCVUlMVC1CSU5BUklFUy5UWFQKQEAgLTAsMCArMSwyMDggQEAKK0ludHJvZHVjdGlvbjoKKz09PT09PT09PT09PT0KKworVGhlIEFuZHJvaWQgZW11bGF0b3IgYnVpbGRzIG5vdyB1c2VzIHNldmVyYWwgcHJlYnVpbHQgaG9zdCBiaW5hcmllcworKHNoYXJlZCBsaWJyYXJpZXMgb3IgZXhlY3V0YWJsZXMpLCBpbiBvcmRlciB0byBzaW1wbGlmeSBhbmQgc3BlZWQgdXAgdGhlCitidWlsZC4KKworVGhlc2UgYmluYXJpZXMgdHlwaWNhbGx5IGNvbWUgZnJvbSB0aGlyZC1wYXJ0eSBvcGVuLXNvdXJjZSBwcm9qZWN0cywKK2ZvciBleGFtcGxlOgorCisgIC0gbGliZmZpLCBnZXR0ZXh0LCBnbGliIGFuZCBvdGhlciBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgYnkgdGhlIGNvZGUgYmFzZQorICAgIHVuZGVyIGV4dGVybmFsL3FlbXUKKworICAtIFRoZSBMTFZNIGFuZCBNZXNhM0QgZ3JhcGhpY3MgbGlicmFyaWVzIHVzZWQgdG8gaW1wbGVtZW50IHNvZnR3YXJlLWJhc2VkCisgICAgR1BVIGVtdWxhdGlvbi4KKworVGhpcyBkb2N1bWVudHMgZXhwbGFpbnMgaG93IHRoZXNlIHByZWJ1aWx0cyB3ZXJlIGdlbmVyYXRlZCwgaG93IHRoZXkgYXJlCit0eXBpY2FsbHkgc3RvcmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBhbmRyb2lkL3JlYnVpbGQuc2ggc2NyaXB0LgorCisKK0kuIExpc3Qgb2YgQW5kcm9pZCBlbXVsYXRvciBwcmVidWlsdCBwYWNrYWdlczoKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGZvbGxvd2luZyBmaWxlIGxpc3RzIHRoZSBsb2NhdGlvbiBvZiBhbGwgc291cmNlIHBhY2thZ2VzIGZvciB0aGUgcHJlYnVpbHRzCityZXF1aXJlZCBieSB0aGUgZW11bGF0b3IgYnVpbGQ6CisKKyAgYW5kcm9pZC9kZXBlbmRlbmNpZXMvUEFDS0FHRVMuVFhUCisKK1RoaXMgaXMgYSBzaW1wbGUgdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgb25lLWxpbmUgcGVyIHBhY2thZ2UuIEZvciBhIGRldGFpbGVkCitkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZSBmb3JtYXQsIHJlYWQgdGhlIGNvbW1lbnRzIGluOgorCisgIGFuZHJvaWQvc2NyaXB0cy91dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnB5CisKK0l0IGlzIHBvc3NpYmxlIHRvIGFwcGx5IGEgc2V0IG9mIHBhdGNoZXMgb24gdG9wIG9mIGFuIG9mZmljaWFsIHNvdXJjZSBwYWNrYWdlCitieSB1c2luZyBhIFBBVENIRVM9PGZpbGU+IGZpZWxkIGluIGEgUEFDS0FHRVMuVFhUIHBhY2thZ2UgZGVzY3JpcHRpb24uIEZvcgorZXhhbXBsZSwgdGhpcyBpcyB1c2VkIHRvIGFwcGx5IGEgZmV3IHBhdGNoZXMgb24gdG9wIG9mIHRoZSBvZmZpY2lhbCBNZXNhM0QKK3JlbGVhc2UgKHNlZSBjdXJyZW50IGNvbnRlbnQgb2YgYW5kcm9pZC9kZXBlbmRlbmNpZXMvIGFuZCBQQUNLQUdFUy5UWFQpLgorCitZb3Ugc2hvdWxkIGNhbGwgdGhlIGZvbGxvd2luZyBzY3JpcHQgdG8gZG93bmxvYWQgYWxsIHNvdXJjZSBwYWNrYWdlcyBmcm9tCitrbm93biByZWxpYWJsZSBzb3VyY2VzLCBhbmQgdmVyaWZ5IHRoZWlyIGNvbnRlbnQgdGhyb3VnaCBzaGExc3VtOgorCisgIGFuZHJvaWQvc2NyaXB0cy9kb3dubG9hZC1zb3VyY2VzLnNoCisKK0lNUE9SVEFOVDogWW91IG11c3QgYWxzbyBjYWxsIHRoaXMgc2NyaXB0IGV2ZXJ5IHRpbWUgeW91IG1vZGlmeSBQQUNLQUdFUy5UWFQuCisKK05vdGUgdGhhdCBieSBkZWZhdWx0LCB0aGlzIHdpbGwgY29weSBQQUNLQUdFUy5UWFQgYW5kIHBhdGNoIGZpbGVzIGxvY2F0ZWQKK3VuZGVyIGFuZHJvaWQvZGVwZW5kZW5jaWVzLyBpbnRvIHRoZSBmb2xsb3dpbmcgdGFyZ2V0IGRpcmVjdG9yeToKKworICAkQU9TUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci1idWlsZC9hcmNoaXZlLworCitZb3UgY2FuIGNoYW5nZSB0aGlzIGRlc3RpbmF0aW9uIGJ5IHVzaW5nIHRoZSAtLWluc3RhbGwtZGlyPTxkaXI+IG9wdGlvbiwgb3IKK2RlZmluaW5nIHRoZSBBTkRST0lEX0VNVUxBVE9SX1BSRUJVSUxUU19ESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQKK3RvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgorCisKK0lJLiBBbmRyb2lkIFNESyBzcGVjaWZpYyB0b29sY2hhaW5zOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RvIGF2b2lkIHN1cnByaXNlcyBhbmQgdW5leHBlY3RlZCBkaWZmZXJlbmNlcyB3aGVuIHBlb3BsZSB1c2UgZGlmZmVyZW50CitzeXN0ZW1zIHRvIGJ1aWxkIHRoZSBzYW1lIHNvdXJjZXMsIHNwZWNpYWwgdG9vbGNoYWlucyBhcmUgdXNlZCB0byBidWlsZAorYWxsIHByZWJ1aWx0cywgbW9yZSBzcGVjaWZpY2FsbHk6CisKKyAgLSBBIExpbnV4IHRvb2xjaGFpbiwgYmFzZWQgb24gR0NDIDQuOCwgd2hpY2ggY29tcGlsZXMgYWdhaW5zdCBHTGliYyAyLjExLAorICAgIHdoaWNoIGlzIGFuY2llbnQgZW5vdWdoIHRvIGxldCBiaW5hcmllcyBydW4gb24gRGViaWFuIFN0YWJsZSBhbmQKKyAgICBSZWRIYXQgc3lzdGVtcy4KKworICAtIEEgY3Jvc3MtdG9vbGNoYWluICh4ODZfNjQtdzY0LW1pbmd3MzIpIHdoaWNoIGdlbmVyYXRlcyBXaW4zMiBhbmQgV2luNjQKKyAgICBiaW5hcmllcyB1bmRlciBMaW51eC4gVGhpcyBpcyBhIGxvdCBtb3JlIGZhc3RlciB0aGFuIHRyeWluZyB0byByZWJ1aWxkCisgICAgdGhlc2Ugd2l0aCBhIHNvbHV0aW9uIGxpa2UgQ3lnd2luIG9uIFdpbmRvd3MuCisKKyAgLSBGb3IgT1MgWCwgd2UgdXNlIGEgcHJlYnVpbHQgQ2xhbmcgYmluYXJ5IChjdXJyZW50bHkgMy41KSBhbmQgd2VsbCBhcyBuZWVkCisgICAgdG8gZW5zdXJlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYmluYXJpZXMgcnVuIGF0IGxlYXN0IG9uIE9TIDEwLjgsIHRoZQorICAgIG1pbmltYWwgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhlIHN5c3RlbSBmb3IgdGhlIFNESy4KKworVG8gbWFrZSB0aGluZ3MgZWFzaWVyLCBhIHNjcmlwdCBpcyBwcm92aWRlZCB0aGF0IGNhbiBnZW5lcmF0ZSBhICd3cmFwcGVyJwordG9vbGNoYWluOgorCisgIGFuZHJvaWQvc2NyaXB0cy9nZW4tYW5kcm9pZC1zZGstdG9vbGNoYWluLnNoIC0taG9zdD08c3lzdGVtPiA8ZHN0LWRpcj4KKworV2hlcmUgPHN5c3RlbT4gaXMgYSBob3N0IHN5c3RlbSBuYW1lIGFzIGluIFsxXSwgYW5kIDxkc3QtZGlyPiBpcyBhCitkaXJlY3Rvcnkgd2hlcmUgd3JhcHBlciBzY3JpcHRzIGZvciBnY2MsIGNjLCBsZCwgYXIsIGFuZCBvdGhlciB0b29sY2hhaW4KK3Byb2dyYW1zIHdpbGwgYmUgY3JlYXRlZCB0byB0YXJnZXQKKworTm90ZSB0aGF0IHRoZXNlIHNjcmlwdHMgaGF2ZSBhIHN5c3RlbS1zcGVjaWZpYyBwcmVmaXg6CisKKyAgLSBUaGUgTGludXggY29tcGlsZXIgd2lsbCBiZSBjYWxsZWQgeDg2XzY0LWxpbnV4LWdjYy4KKyAgLSBUaGUgV2luZG93cyBjb21waWxlciB3aWxsIGJlIGNhbGxlZCB4ODZfNjQtdzY0LW1pbmd3MzItZ2NjLgorICAtIFRoZSBEYXJ3aW4gY29tcGlsZXIgZG9lc24ndCB1c2UgYSBwcmVmaXguCisKK1RoaXMgaXMgZG9uZSB0byBtYWtlIHR5cGljYWwgR05VICdjb25maWd1cmUnIHNjcmlwdCB3b3JrIGVhc2llci4gT25lIHdvdWxkCit0eXBpY2FsbHkgdXNlIHRoZSBjb25maWd1cmUgLS1ob3N0IG9wdGlvbiB0byBlbnN1cmUgdGhlIHdyYXBwZXIgdG9vbGNoYWluCitpcyBiZWluZyB1c2VkLCBpLmUuOgorCisgIC0gT24gTGludXgsIHVzZSAtLWhvc3Q9eDg2XzY0LWxpbnV4CisgIC0gT24gTGludXgsIHdoZW4gZ2VuZXJhdGluZyBXaW5kb3dzIGJpbmFyaWVzLCB1c2UgLS1ob3N0PXg4Nl82NC13NjQtbWluZ3czMgorICAtIE9uIERhcndpbiwgZG9uJ3QgdXNlIC0taG9zdCwgc2luY2UgdGhlIHdyYXBwZXIgdG9vbGNoYWluIGRvZXNuJ3QgdXNlCisgICAgYSAnYmlucHJlZml4JyBhdCBhbGwuCisKK1VzZSB0aGUgLS1oZWxwIG9wdGlvbiB0byBzZWUgbW9yZSBvcHRpb25zIGF2YWlsYWJsZSB3aGVuIGNhbGxpbmcgdGhpcyBzY3JpcHQuCisKK1R5cGljYWxseSwgb25lIHdvdWxkIHByZXBlbmQgPGRzdC1kaXI+IHRvIHlvdXIgUEFUSCBiZWZvcmUgbGF1bmNoaW5nCit0aGUgY29uZmlndXJlIHNjcmlwdCwgYXMgYW4gZXhhbXBsZSwgaGVyZSdzIGhvdyB0byByZWNvbXBpbGUgYSBnaXZlbgorb3BlbnNvdXJjZSBwYWNrYWdlIG9uIExpbnV4OgorCisgICAgL3BhdGgvdG8vZXh0ZXJuYWwvcWVtdS9hbmRyb2lkL3NjcmlwdHMvZ2VuLWFuZHJvaWQtc2RrLXRvb2xjaGFpbi5zaCBcCisgICAgICAgIC90bXAvbXktdG9vbGNoYWluCisKKyAgICBQQVRIPS90bXAvbXktdG9vbGNoYWluOiRQQVRICisKKyAgICBjZCAvcGF0aC90by9vcGVuc291cmNlLXBhY2thZ2UtMS4wLworICAgIC4vY29uZmlndXJlIC0taG9zdD14ODZfNjQtbGludXggLS1wcmVmaXggPGluc3RhbGwtZGlyPiA8b3RoZXItb3B0aW9ucz4KKyAgICBtYWtlIC1qOAorICAgIG1ha2UgaW5zdGFsbAorCitIb3dldmVyLCBzZXZlcmFsIHNoZWxsIHNjcmlwdHMgYXJlIHByb3ZpZGVkIHRvIGF1dG9tYXRlIHRoaXMuCisKKworSUlJLiBSZWJ1aWxkIHNjcmlwdHMgZm9yIHRoaXJkLXBhcnR5IHBhY2thZ2VzOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0aGUgYW5kcm9pZC9zY3JpcHRzLyBkaXJlY3RvcnkgY29udGFpbnMgbWFueSBzaGVsbCBzY3JpcHRzIHVzZWQgdG8gcmVidWlsZAorc3BlY2lmaWMgdGhpcmQtcGFydHkgbGlicmFyaWVzIG9yIGV4ZWN1dGFibGVzLiBJbiBwYXJ0aWN1bGFyOgorCisgIC0gVGhleSBhbGwgdXNlIHNoYXJlZCBmdW5jdGlvbnMgZnJvbSBhbmRyb2lkL3NjcmlwdHMvdXRpbHMvIHRoYXQgbWFrZQorICAgIGl0IGVhc3kgdG8gcGFyc2UgdGhlIFBBQ0tBR0VTLlRYVCBmaWxlLCBleHRyYWN0IHNvdXJjZSB0YXJiYWxsIHRvCisgICAgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yaWVzLCBnZW5lcmF0ZSBTREsgdG9vbGNoYWluIHdyYXBwZXJzLCBhbmQKKyAgICBjb25maWd1cmUgc2ltcGxlIHByb2plY3RzLgorCisgIC0gT24gTGludXgsIHRoZXkgd2lsbCBidWlsZCBiaW5hcmllcyBmb3IgbGludXgteDg2XzY0LCB3aW5kb3dzLXg4NiBhbmQKKyAgICB3aW5kb3dzLXg4Nl82NCBhdXRvbWF0aWNhbGx5LgorCisgICAgQWxzbywgdGhleSBzdXBwb3J0IHRoZSAtLWRhcndpbi1zc2g9PGhvc3RuYW1lPiB3aGljaCBhbGxvd3Mgb25lCisgICAgdG8gcGVyZm9ybSBhIHJlbW90ZSBidWlsZCBvZiBEYXJ3aW4gYmluYXJpZXMgdGhyb3VnaCBTU0guCisKKyAgLSBUaGV5IHBsYWNlIGFsbCBnZW5lcmF0ZWQgYmluYXJpZXMgdW5kZXI6CisKKyAgICAgICAkQU9TUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci1idWlsZC88bmFtZT4KKworICAgIFdoZXJlIDxuYW1lPiBpcyBhIHVuaXF1ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBncm91cCBvZiBiaW5hcmllcy4KKworTW9zdCBmZWF0dXJlcyBhcmUgZXhwbGFpbmVkIHdoZW4gdXNpbmcgdGhlIC0taGVscCBvcHRpb24gb24gb25lIG9mIHRoZXNlCitzY3JpcHRzLgorCitJZiB5b3UgY29uc2lkZXIgYWRkaW5nIG5ldyBwcmVidWlsdCBiaW5hcmllcywgY29uc2lkZXIgd3JpdGluZyBzdWNoIGEKK3NwZWNpYWxpemVkIHNjcmlwdCB0byBnZXQgdGhlIHNhbWUgYmVuZWZpdHMuIEEgZ29vZCBzdGFydGluZyBwb2ludCBpcworbG9va2luZyBhdCBvbmUgb2YgdGhlIGV4aXN0aW5nIHNjcmlwdHMgYW5kIHRyeSB0byBtb2RpZnkgaXQuCisKK0Fub3RoZXIgdGhpbmcgdG8gZG8gaXMgb3BlbiBhIGJ1Z2FuaXplciBlbnRyeSB0byByZXF1ZXN0IGEgbmV3IGdpdAorcmVwb3NpdG9yeSB1bmRlcjoKKworICAgICRBT1NQL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkLzxuZXctcHJvamVjdC1uYW1lPgorCitDb25zaWRlciBwcm92aWRpbmcgYW4gYXJjaGl2ZSBvZiB0aGUgb3JpZ2luYWwgY29udGVudCBmb3IgdGhpcyBkaXJlY3RvcnkKKyhpLmUuIGdlbmVyYXRlZCBieSB5b3VyIG93biBidWlsZCBzY3JpcHQpIHRvIHBvcHVsYXRlIGl0IGZpcnN0LgorCisKK0lWLiBIb3cgcHJlYnVpbHQgYmluYXJpZXMgYXJlIHVzZWQgYnkgdGhlIGJ1aWxkOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBhbmRyb2lkL3JlYnVpbGQuc2ggc2NyaXB0IGlzIGluIGNoYXJnZSBvZiBwbGFjaW5nIHByZWJ1aWx0IGJpbmFyaWVzCit0byB0aGUgY29ycmVjdCBsb2NhdGlvbiB1bmRlciAkT1VUX0RJUi8sIHdoaWNoIGRlZmF1bHRzIHRvIG9ianMvCisKK0luIHBhcnRpY3VsYXI6CisKKyAgLSBxZW11MiBiaW5hcmllcyBtdXN0IGJlIHBsYWNlZCB1bmRlcjoKKworICAgICAgICRPVVRfRElSL3FlbXUvPHN5c3RlbT4vcWVtdS1zeXN0ZW0tPHFlbXUtYXJjaD4KKworICAgIE5vdGUgdGhhdCB0aGVzZSBiaW5hcmllcyBhcmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmc6CisKKyAgICAgICAgYW5kcm9pZC9zY3JpcHRzLworCisgIC0gU3dpZnRzaGFkZXIgbXVzdCBiZSBwbGFjZWQgdW5kZXI6CisKKyAgICAgICAkT1VUX0RJUi9saWIvZ2xlc19zd2lmdHNoYWRlci8gICAgKDMyLWJpdCBvbmVzKQorICAgICAgICRPVVRfRElSL2xpYjY0L2dsZXNfc3dpZnRzaGFkZXIvICAoNjQtYml0IG9uZXMpCisKKyAgLSBNZXNhIGxpYnJhcmllcyBtdXN0IGJlIHBsYWNlZCB1bmRlcjoKKworICAgICAgICRPVVRfRElSL2xpYi9nbGVzX21lc2EvICAgICgzMi1iaXQgb25lcykKKyAgICAgICAkT1VUX0RJUi9saWI2NC9nbGVzX21lc2EvICAoNjQtYml0IG9uZXMpCisKKyAgLSBRdCBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBnbyBpbnRvOgorCisgICAgICAgJE9VVF9ESVIvbGliL3F0LyAgICAgICAgICAgKDMyLWJpdCBvbmVzKQorICAgICAgICRPVVRfRElSL2xpYjY0L3F0LyAgICAgICAgICg2NC1iaXQgb25lcykKKworICAtIEFueSB0aGlyZC1wYXJ0eSBob3N0IGV4ZWN1dGFibGUgKGlmIGFueSkgc2hvdWxkIGdvIHVuZGVyOgorCisgICAgICAgJE9VVF9ESVIvYmluLyAgICAgKDMyLWJpdCBvbmVzKQorICAgICAgICRPVVRfRElSL2JpbjY0LyAgICg2NC1iaXQgb25lcykKKworTm90ZSB0aGF0IHRoZSB0b3AtbGV2ZWwgJ2VtdWxhdG9yJyBsYXVuY2hlciBwcm9ncmFtIHdpbGwgbW9kaWZ5IHRoZSBydW50aW1lCitsaWJyYXJ5IHNlYXJjaCBwYXRoIChlLmcuIExEX0xJQlJBUllfUEFUSCBvbiBMaW51eCkgdG8gZW5zdXJlIHRoYXQgbGlicmFyaWVzCit1bmRlciA8bGliPi8sIDxsaWI+L3F0LyBvciA8bGliPi9nbGVzX3N3aWZ0c2hhZGVyLywgd2hlbmV2ZXIgdGhhdCBtYWtlcyBzZW5zZS4KKworVGhlIFBBVEggaXMgbm90IG1vZGlmaWVkIHRob3VnaCwgc28gdXNlIGV4cGxpY2l0IGJpbi8gb3IgYmluNjQvIHByZWZpeGVzCit3aGVuIGludm9raW5nIGhvc3QgYmluYXJpZXMuCisKKworCitbMV0gVmFsaWQgaG9zdCBzeXN0ZW0gbmFtZXMgYXJlOgorCisgICAgICBkYXJ3aW4teDg2XzY0CisgICAgICBsaW51eC14ODZfNjQKKyAgICAgIHdpbmRvd3MteDg2XzY0CisgICAgICBsaW51eC14ODYKKyAgICAgIHdpbmRvd3MteDg2CmRpZmYgLS1naXQgYS9hbmRyb2lkL2RvY3MvUUVNVS1NRU1PUlktTUFOQUdFTUVOVC5UWFQgYi9hbmRyb2lkL2RvY3MvUUVNVS1NRU1PUlktTUFOQUdFTUVOVC5UWFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZTM4YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZG9jcy9RRU1VLU1FTU9SWS1NQU5BR0VNRU5ULlRYVApAQCAtMCwwICsxLDIyMyBAQAorQW4gb3ZlcnZpZXcgb2YgbWVtb3J5IG1hbmFnZW1lbnQgaW4gUUVNVToKKworSS4gUkFNIE1hbmFnZW1lbnQ6Cis9PT09PT09PT09PT09PT09PT0KKworSS4xLiBSQU0gQWRkcmVzcyBzcGFjZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FsbCBwYWdlcyBvZiB2aXJ0dWFsIFJBTSB1c2VkIGJ5IFFFTVUgYXQgcnVudGltZSBhcmUgYWxsb2NhdGVkIGZyb20KK2NvbnRpZ3VvdXMgYmxvY2tzIGluIGEgc3BlY2lmaWMgYWJzdHJhY3QgIlJBTSBhZGRyZXNzIHNwYWNlIi4KK3xyYW1fYWRkcl90fCBpcyB0aGUgdHlwZSBvZiBibG9jayBhZGRyZXNzZXMgaW4gdGhpcyBzcGFjZS4KKworQSBzaW5nbGUgYmxvY2sgb2YgY29udGlndW91cyBSQU0gaXMgYWxsb2NhdGVkIHdpdGggJ3FlbXVfcmFtX2FsbG9jKCknLCB3aGljaAordGFrZXMgYSBzaXplIGluIGJ5dGVzLCBhbmQgYWxsb2NhdGVzIHRoZSBwYWdlcyB0aHJvdWdoIG1tYXAoKSBpbiB0aGUgUUVNVQoraG9zdCBwcm9jZXNzLiBJdCBhbHNvIHNldHMgdXAgdGhlIGNvcnJlc3BvbmRpbmcgS1ZNIC8gWGVuIC8gSEFYIG1hcHBpbmdzLAorZGVwZW5kaW5nIG9uIGVhY2ggYWNjZWxlcmF0b3IncyBzcGVjaWZpYyBuZWVkcy4KKworRWFjaCBibG9jayBoYXMgYSBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBzbmFwc2hvdCBzdXBwb3J0LgorCisncWVtdV9yYW1fYWxsb2NfZnJvbV9wdHIoKScgY2FuIGFsc28gYmUgdXNlZCB0byBhbGxvY2F0ZWQgYSBuZXcgUkFNCitibG9jaywgYnkgcGFzc2luZyBpdHMgY29udGVudCBleHBsaWNpdGx5IChjYW4gYmUgdXNlZnVsIGZvciBwYWdlcyBvZgorUk9NKS4KKworJ3FlbXVfZ2V0X3JhbV9wdHIoKScgd2lsbCB0cmFuc2xhdGUgYSAncmFtX2FkZHJfdCcgaW50byB0aGUgY29ycmVzcG9uZGluZworYWRkcmVzcyBpbiB0aGUgUUVNVSBob3N0IHByb2Nlc3MuICdxZW11X3JhbV9hZGRyX2Zyb21faG9zdCgpJyBkb2VzIHRoZQorb3Bwb3NpdGUgKGkuZS4gdHJhbnNsYXRlcyBhIGhvc3QgYWRkcmVzcyBpbnRvIGEgcmFtX2FkZHJfdCBpZiBwb3NzaWJsZSwKK29yIHJldHVybiBhbiBlcnJvcikuCisKK05vdGUgdGhhdCByYW1fYWRkcl90IGFkZHJlc3NlcyBhcmUgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mCitRRU1VLCBpLmUuIHRoZSB2aXJ0dWFsIENQVSBuZXZlciBzZWVzIHRoZWlyIHZhbHVlcyBkaXJlY3RseTsgaXQgcmVsaWVzCitpbnN0ZWFkIG9mIGFkZHJlc3NlcyBpbiBpdHMgdmlydHVhbCBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlLCBkZXNjcmliZWQKK2luIHNlY3Rpb24gSUkuIGJlbG93LgorCitBcyBhbiBleGFtcGxlLCB3aGVuIGVtdWxhdGluZyBhbiBBbmRyb2lkL3g4NiB2aXJ0dWFsIGRldmljZSwgdGhlIGZvbGxvd2luZworUkFNIHNwYWNlIGlzIGJlaW5nIHVzZWQ6CisKKyAgMHgwMDAwXzAwMDAgLi4uIDB4MTAwMF8wMDAwICAgInBjLnJhbSIKKyAgMHgxMDAwXzAwMDAgLi4uIDB4MTAwMl8wMDAwICAgImJpb3MuYmluIgorICAweDEwMDJfMDAwMCAuLi4gMHgxMDA0XzAwMDAgICAicGMucm9tIgorCisKK0kuMi4gUkFNIERpcnR5IHRyYWNraW5nOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1FFTVUgYWxzbyBhc3NvY2lhdGVzIHdpdGggZWFjaCBSQU0gcGFnZSBhbiA4LWJpdCAnZGlydHknIGJpdG1hcC4gVGhlCittYWluIGlkZWEgaXMgdGhhdCB3aGVuZXZlciBhIHBhZ2UgaXMgd3JpdHRlbiB0bywgdGhlIHZhbHVlIDB4ZmYgaXMKK3dyaXR0ZW4gdG8gdGhlIHBhZ2UncyAnZGlydHknIGJpdG1hcC4gVmFyaW91cyBjbGllbnRzIGNhbiBsYXRlciBpbnNwZWN0Citzb21lIG9mIHRoZSBmbGFncyBhbmQgY2xlYXIgdGhlbS4gSS5lLjoKKworICBWR0FfRElSVFlfRkxBRyAoMHgxKSBpcyB0eXBpY2FsbHkgdXNlZCBieSBmcmFtZWJ1ZmZlciBkcml2ZXJzIHRvIGRldGVjdAorICB3aGljaCBwYWdlcyBvZiB2aWRlbyBSQU0gd2VyZSB0b3VjaGVkIHNpbmNlIHRoZSBsYXRlc3QgVlNZTkMuIFRoZSBkcml2ZXIKKyAgdHlwaWNhbGx5IGNvcGllcyB0aGUgcGl4ZWwgdmFsdWVzIHRvIHRoZSByZWFsIFFFTVUgb3V0cHV0LCB0aGVuIGNsZWFycworICB0aGUgYml0cy4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCB0byBhdm9pZCBuZWVkbGVzcyBjb3BpZXMgaWYgbm90aGluZworICBjaGFuZ2VkIGluIHRoZSBmcmFtZWJ1ZmZlci4KKworICBNSUdSQVRJT05fRElSVFlfRkxBRyAoMHg4KSBpcyB1c2VkIHRvIHRyYWNrZWQgbW9kaWZpZWQgUkFNIHBhZ2VzIGR1cmluZworICBsaXZlIG1pZ3JhdGlvbiAoaS5lLiBtb3ZpbmcgYSBRRU1VIHZpcnR1YWwgbWFjaGluZSBmcm9tIG9uZSBob3N0IHRvCisgIGFub3RoZXIpCisKKyAgQ09ERV9ESVJUWV9GTEFHICgweDIpIGlzIGEgYml0IG1vcmUgc3BlY2lhbCwgYW5kIGlzIHVzZWQgdG8gc3VwcG9ydAorICBzZWxmLW1vZGlmeWluZyBjb2RlIHByb3Blcmx5LiBNb3JlIG9uIHRoaXMgbGF0ZXIuCisKKworSUkuIFRoZSBwaHlzaWNhbCBhZGRyZXNzIHNwYWNlOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXByZXNlbnRzIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHZpcnR1YWwgQ1BVIGNhbiByZWFkIGZyb20gLyB3cml0ZSB0by4KK3xod2FkZHJ8IGlzIHRoZSB0eXBlIG9mIGFkZHJlc3NlcyBpbiB0aGlzIHNwYWNlLCB3aGljaCBpcyBkZWNvbXBvc2VkCitpbnRvICdwYWdlcycuIEVhY2ggcGFnZSBpbiB0aGUgYWRkcmVzcyBzcGFjZSBpcyBlaXRoZXIgdW5hc3NpZ25lZCwgb3IKK21hcHBlZCB0byBhIHNwZWNpZmljIGtpbmQgb2YgbWVtb3J5IHJlZ2lvbi4KKworU2VlIHxwaHlzX3BhZ2VfZmluZCgpfCBhbmQgfHBoeXNfcGFnZV9maW5kX2FsbG9jKCl8IGluIHRyYW5zbGF0ZS1hbGwuYyBmb3IKK3RoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorCisKK0lJLjEuIE1lbW9yeSByZWdpb24gdHlwZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVyZSBhcmUgc2V2ZXJhbCBtZW1vcnkgcmVnaW9uIHR5cGVzOgorCisgIC0gUmVnaW9ucyBvZiBSQU0gcGFnZXMuCisgIC0gUmVnaW9ucyBvZiBST00gcGFnZXMgKHNpbWlsYXIgdG8gUkFNLCBidXQgY2Fubm90IGJlIHdyaXR0ZW4gdG8pLgorICAtIFJlZ2lvbnMgb2YgSS9PIHBhZ2VzLCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdmlydHVhbCBoYXJkd2FyZS4KKworVmlydHVhbCBkZXZpY2VzIGNhbiByZWdpc3RlciBhIG5ldyBJL08gcmVnaW9uIHR5cGUgYnkgY2FsbGluZworfGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoKXwuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZW0gdG8gcHJvdmlkZQorY2FsbGJhY2tzIHRoYXQgd2lsbCBiZSBpbnZva2VkIGV2ZXJ5IHRpbWUgdGhlIHZpcnR1YWwgQ1BVIHJlYWRzIGZyb20KK29yIHdyaXRlcyB0byBhbnkgcGFnZSBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLgorCitUaGUgbWVtb3J5IHJlZ2lvbiB0eXBlIG9mIGEgZ2l2ZW4gcGFnZSBpcyBlbmNvZGVkIHVzaW5nIFBBR0VfQklUUyBiaXRzCitpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCAgICBtZW1fdHlwZV9pbmRleCAgICAgfCBmbGFncyB8CisgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCitXaGVyZSB8bWVtX3R5cGVfaW5kZXh8IGlzIGEgdW5pcXVlIHZhbHVlIGlkZW50aWZ5aW5nIGEgZ2l2ZW4gbWVtb3J5CityZWdpb24gdHlwZSwgYW5kIHxmbGFnc3wgaXMgYSAzLWJpdCBiaXRtYXAgdXNlZCB0byBzdG9yZSBmbGFncyB0aGF0IGFyZQorb25seSByZWxldmFudCBmb3IgSS9PIHBhZ2VzLgorCitUaGUgZm9sbG93aW5nIG1lbW9yeSByZWdpb24gdHlwZSB2YWx1ZXMgYXJlIGltcG9ydGFudDoKKworICBJT19NRU1fUkFNIChtZW1fdHlwZV9pbmRleD0wLCBmbGFncz0wKToKKyAgICBVc2VkIGZvciByZWd1bGFyIFJBTSBwYWdlcywgYWx3YXlzIGFsbCB6ZXJvIG9uIHB1cnBvc2UuCisKKyAgSU9fTUVNX1JPTSAobWVtX3R5cGVfaW5kZXg9MSwgZmxhZ3M9MCk6CisgICAgVXNlZCBmb3IgUk9NIHBhZ2VzLgorCisgIElPX01FTV9VTkFTU0lHTkVEIChtZW1fdHlwZV9pbmRleD0yLCBmbGFncz0wKToKKyAgICBVc2VkIHRvIGlkZW50aWZ5IHVuYXNzaWduZWQgcGFnZXMgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCisKKyAgSU9fTUVNX05PVERJUlRZIChtZW1fdHlwZV9pbmRleD0zLCBmbGFncz0wKToKKyAgICBVc2VkIHRvIGltcGxlbWVudCB0cmFja2luZyBvZiBkaXJ0eSBSQU0gcGFnZXMuIFRoaXMgaXMgZXNzZW50aWFsbHkKKyAgICB1c2VkIGZvciBSQU0gcGFnZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gdG8geWV0LgorCitBbnkgbWVtX3R5cGVfaW5kZXggdmFsdWUgb2YgNCBvciBoaWdoZXIgY29ycmVzcG9uZHMgdG8gYSBkZXZpY2Utc3BlY2lmaWMKK0kvTyBtZW1vcnkgcmVnaW9uIHR5cGUgKGkuZS4gd2l0aCBjdXN0b20gcmVhZC93cml0ZSBjYWxsYmFrcywgYQorY29ycmVzcG9uZGluZyAnb3BhcXVlJyB2YWx1ZSksIGFuZCBjYW4gYWxzbyB1c2UgdGhlIGZvbGxvd2luZyBiaXRzCitpbiB8ZmxhZ3N8OgorCisgIElPX01FTV9ST01EICgweDEpOgorICAgIFVzZWQgZm9yIFJPTS1saWtlIEkvTyBwYWdlcywgaS5lLiB0aGV5IGFyZSBiYWNrZWQgYnkgYSBwYWdlIGZyb20KKyAgICB0aGUgUkFNIGFkZHJlc3Mgc3BhY2UsIGJ1dCB3cml0aW5nIHRvIHRoZW0gdHJpZ2dlcnMgYSBkZXZpY2Utc3BlY2lmaWMKKyAgICB3cml0ZSBjYWxsYmFjayAoaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkIG9yIGZhdWx0aW5nIHRoZSBDUFUpLgorCisgIElPX01FTV9TVUJQQUdFICgweDAyKQorICAgIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCBub3QgYWxsIGFkZHJlc3NlcyBpbiB0aGlzIHBhZ2UgbWFwIHRvIHRoZSBzYW1lCisgICAgSS9PIHJlZ2lvbiB0eXBlIC8gY2FsbGJhY2tzLgorCisgIElPX01FTV9TVUJXSURUSCAoMHgwNCkKKyAgICBQcm9iYWJseSBvYnNvbGV0ZS4gU2V0IHRvIGluZGljYXRlIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgSS9PIHJlZ2lvbgorICAgIHR5cGUgZG9lc24ndCBzdXBwb3J0IHJlYWRpbmcvd3JpdGluZyB2YWx1ZXMgb2YgYWxsIHBvc3NpYmxlIHNpemVzCisgICAgKDEsIDIgYW5kIDQgYnl0ZXMpLiBUaGlzIHNlZW1zIHRvIGJlIG5ldmVyIHVzZWQgYnkgdGhlIGN1cnJlbnQgY29kZS4KKworTm90ZSB0aGF0IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoKSByZXR1cm5zIGEgbmV3IG1lbW9yeSByZWdpb24gdHlwZSB2YWx1ZS4KKworSUkuMi4gUGh5c2ljYWwgYWRkcmVzcyBtYXA6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUUVNVSBtYWludGFpbnMgZm9yIGVhY2ggYXNzaWduZWQgcGFnZSBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZQordHdvIHZhbHVlczoKKworICB8cGh5c19vZmZzZXR8LCBhIGNvbWJpbmF0aW9uIG9mIHJhbSBhZGRyZXNzIGFuZCBtZW1vcnkgcmVnaW9uIHR5cGUuCisKKyAgfHJlZ2lvbl9vZmZzZXR8LCBhbiBvcHRpb25hbCBvZmZzZXQgaW50byB0aGUgcmVnaW9uIGJhY2tpbmcgdGhlCisgIHBhZ2UuIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIEkvTyBwYWdlcy4KKworVGhlIHxwaHlzX29mZnNldHwgdmFsdWUgaGFzIG1hbnkgaW50ZXJlc3RpbmcgZW5jb2Rpbmcgd2hpY2ggcmVxdWlyZQorZnVydGhlciBjbGFyaWZpY2F0aW9uOgorCisgIC0gR2VuZXJhbGx5IHNwZWFraW5nLCBhIHBoeXNfb2Zmc2V0IHZhbHVlIGlzIGRlY29tcG9zZWQgaW50bworICAgIHRoZSBmb2xsb3dpbmcgYml0IGZpZWxkczoKKworICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgICAgICAgIGhpZ2hfYWRkciAgICAgICAgICAgICAgIHwgICAgIG1lbV90eXBlICAgICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgd2hlcmUgfG1lbV90eXBlfCBpcyBhIFBBR0VfQklUUyBtZW1vcnkgcmVnaW9uIHR5cGUgYXMgZGVzY3JpYmVkCisgICAgcHJldmlvdXNseSwgYW5kIHxoaWdoX2FkZHJ8IG1heSBjb250YWluIHRoZSBoaWdoIGJpdHMgb2YgYQorICAgIHJhbV9hZGRyX3QgYWRkcmVzcyBmb3IgUkFNLWJhY2tlZCBwYWdlcy4KKworTW9yZSBzcGVjaWZpY2FsbHk6CisKKyAgLSBVbmFzc2lnbmVkIHBhZ2VzIGFsd2F5cyBoYXZlIHRoZSBzcGVjaWFsIHZhbHVlIElPX01FTV9VTkFTU0lHTkVECisgICAgKGhpZ2hfYWRkcj0wLCBtZW1fdHlwZT1JT19NRU1fVU5BU1NJR05FRCkKKworICAtIFJBTSBwYWdlcyBoYXZlIG1lbV90eXBlPTAgKGkuZS4gSU9fTUVNX1JBTSkgd2hpbGUgaGlnaF9hZGRyIGFyZQorICAgIHRoZSBoaWdoIGJpdHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmFtX2FkZHJfdC4gSGVuY2UsIGEgc2ltcGxlIGNhbGwgdG8KKyAgICBxZW11X2dldF9yYW1fcHRyKHBoeXNfb2Zmc2V0KSB3aWxsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworICAgIGFkZHJlc3MgaW4gaG9zdCBRRU1VIG1lbW9yeS4KKworICAgIFRoaXMgaXMgdGhlIHJlc29uIHdoeSBJT19NRU1fUkFNIGlzIGFsd2F5cyAwOgorCisgICAgUkFNIHBhZ2UgcGh5c19vZmZzZXQgdmFsdWU6CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICB8ICAgaGlnaF9hZGRyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgMCAgICAgICB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKworICAtIFJPTSBwYWdlcyBhcmUgbGlrZSBSQU0gcGFnZXMsIGJ1dCBoYXZlIG1lbV90eXBlPUlPX01FTV9ST00uCisgICAgUUVNVSBlbnN1cmVzIHRoYXQgd3JpdGluZyB0byBzdWNoIGEgcGFnZSBpcyBhIG5vLW9wLCBleGNlcHQgb24KKyAgICBzb21lIHRhcmdldCBhcmNoaXRlY3R1cmVzLCBsaWtlIFNwYXJjLCB0aGlzIG1heSBjYXVzZSBhIENQVSBmYXVsdC4KKworICAgIFJPTSBwYWdlIHBoeXNfb2Zmc2V0IHZhbHVlOgorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgIGhpZ2hfYWRkciAgICAgICAgICAgICAgICAgICAgIHwgICAgIElPX01FTV9ST00gICAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworCisgIC0gRGlydHkgUkFNIHBhZ2UgdHJhY2tpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgc3BlY2lhbAorICAgIHBoeXNfb2Zmc2V0IHZhbHVlcyB3aXRoIG1lbV90eXBlPUlPX01FTV9OT1RESVJUWS4gTm90ZSB0aGF0IHRoZXNlCisgICAgdmFsdWVzIGRvIG5vdCBhcHBlYXIgZGlyZWN0bHkgaW4gdGhlIHBoeXNpY2FsIHBhZ2UgbWFwLCBidXQgaW4KKyAgICB0aGUgQ1BVIFRMQiBjYWNoZSAoZXhwbGFpbmVkIGxhdGVyKS4KKworICAgIG5vbi1kaXJ0eSBSQU0gcGFnZSBwaHlzX29mZnNldCB2YWx1ZSAoQ1BVIFRMQiBjYWNoZSBvbmx5KToKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgICBoaWdoX2FkZHIgICAgICAgICAgICAgICAgICAgICB8ICBJT19NRU1fTk9URElSVFkgIHwKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgLSBPdGhlciBwYWdlcyBhcmUgSS9PIHBhZ2VzLCBhbmQgdGhlaXIgaGlnaF9hZGRyIHZhbHVlIHdpbGwKKyAgICAgYmUgMCAvIGlnbm9yZWQ6CisKKyAgICBJL08gcGFnZSBwaHlzX29mZnNldCB2YWx1ZToKKyAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgfCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWVtX3R5cGVfaW5kZXggfCBmbGFncyB8CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgIE5vdGUgdGhhdCB3aGVuIHJlYWRpbmcgZnJvbSBvciB3cml0aW5nIHRvIEkvTyBwYWdlcywgdGhlIGxvd2VzdAorICAgIFBBR0VfQklUUyBiaXRzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGh3YWRkciB2YWx1ZSB3aWxsIGJlIGFkZGVkCisgICAgdG8gdGhlIHBhZ2UncyB8cmVnaW9uX29mZnNldHwgdmFsdWUuIFRoaXMgbmV3IGFkZHJlc3MgaXMgcGFzc2VkCisgICAgdG8gdGhlIHJlYWQvd3JpdGUgY2FsbGJhY2sgYXMgdGhlICdpL28gYWRkcmVzcycgZm9yIHRoZSBvcGVyYXRpb24uCisKKyAgIC0gQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgdGhlIEkvTyBwYWdlJ3MgSU9fTUVNX1JPTUQgZmxhZyBpcworICAgICBzZXQsIHRoZW4gaGlnaF9hZGRyIGlzIG5vdCAwLCBidXQgdGhlIGhpZ2ggYml0cyBvZiB0aGUgY29ycmVzcG9uZGluZworICAgICByYW1fYWRkcl90IGJhY2tpbmcgdGhlIHBhZ2UncyBjb250ZW50cyBvbiByZWFkcy4gT24gd3JpdGUgb3BlcmF0aW9ucworICAgICB0aG91Z2gsIHRoZSBJL08gcmVnaW9uIHR5cGUncyB3cml0ZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkLgorCisgICAgIFJPTUQgSS9PIHBhZ2UgcGh5c19vZmZzZXQgdmFsdWU6CisgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgIGhpZ2hfYWRkciAgICAgICAgICAgICAgICAgICAgICB8IG1lbV90eXBlX2luZGV4IHwgZmxhZ3MgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKKyAgICAgTm90ZSB0aGF0IHxyZWdpb25fb2Zmc2V0fCBpcyBpZ25vcmVkIHdoZW4gcmVhZGluZyBmcm9tIHN1Y2ggcGFnZXMsCisgICAgIGl0J3Mgb25seSB1c2VkIHdoZW4gd3JpdGluZyB0byB0aGUgSS9PIHBhZ2UuCmRpZmYgLS1naXQgYS9hbmRyb2lkL2VtdWxhdG9yLWNoZWNrL1BsYXRmb3JtSW5mby5jcHAgYi9hbmRyb2lkL2VtdWxhdG9yLWNoZWNrL1BsYXRmb3JtSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZW11bGF0b3ItY2hlY2svUGxhdGZvcm1JbmZvLmNwcApAQCAtMCwwICsxLDE4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdG9yLWNoZWNrL1BsYXRmb3JtSW5mby5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9zeXN0ZW0vU3lzdGVtLmgiCisKKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIF9fbGludXhfXworCituYW1lc3BhY2Ugeworc3RydWN0IFhEZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoRGlzcGxheSogZCkgY29uc3QgeyBYQ2xvc2VEaXNwbGF5KGQpOyB9CisgICAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHB0cikgY29uc3QgeyBYRnJlZShwdHIpOyB9Cit9OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIFhQdHIgPSBzdGQ6OnVuaXF1ZV9wdHI8VCwgWERlbGV0ZXI+OworCisvLyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYSBzbGlnaHRseSBtb2RpZmllZCB3bWN0cmwgY29kZSB0YWtlbiBmcm9tCisvLyBodHRwczovL2dpdGh1Yi5jb20vZ2Vla2xlc3Mvd21jdHJsIC0gR05VIEdQTCAyIGxpY2Vuc2UKKworc3RhdGljIHN0ZDo6dmVjdG9yPGNoYXI+IGdldFhQcm9wZXJ0eShEaXNwbGF5KiBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3cgd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9tIHhhX3Byb3BfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcF9uYW1lKSB7CisgICAgQXRvbSB4YV9wcm9wX25hbWUgPSBYSW50ZXJuQXRvbShkaXNwLCBwcm9wX25hbWUsIEZhbHNlKTsKKworICAgIC8qIDEwMjQgZXhwbGFuYXRpb24gKFhHZXRXaW5kb3dQcm9wZXJ0eSBtYW5wYWdlKToKKyAgICAgKgorICAgICAqIGxvbmdfbGVuZ3RoID0gU3BlY2lmaWVzIHRoZSBsZW5ndGggaW4gMzItYml0IG11bHRpcGxlcyBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIGRhdGEgdG8gYmUgcmV0cmlldmVkLgorICAgICAqCisgICAgICogTk9URTogIHNlZQorICAgICAqIGh0dHA6Ly9tYWlsLmdub21lLm9yZy9hcmNoaXZlcy93bS1zcGVjLWxpc3QvMjAwMy1NYXJjaC9tc2cwMDA2Ny5odG1sCisgICAgICogSW4gcGFydGljdWxhcjoKKyAgICAgKgorICAgICAqIAlXaGVuIHRoZSBYIHdpbmRvdyBzeXN0ZW0gd2FzIHBvcnRlZCB0byA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgYQorICAgICAqIHJhdGhlciBwZWN1bGlhciBkZXNpZ24gZGVjaXNpb24gd2FzIG1hZGUuIDMyLWJpdCBxdWFudGl0aWVzIHN1Y2gKKyAgICAgKiBhcyBXaW5kb3cgSURzLCBhdG9tcywgZXRjLCB3ZXJlIGtlcHQgYXMgbG9uZ3MgaW4gdGhlIGNsaWVudCBzaWRlCisgICAgICogQVBJcywgZXZlbiB3aGVuIGxvbmcgd2FzIGNoYW5nZWQgdG8gNjQgYml0cy4KKyAgICAgKgorICAgICAqLworCisgICAgQXRvbSB4YV9yZXRfdHlwZTsKKyAgICBpbnQgcmV0X2Zvcm1hdDsKKyAgICB1bnNpZ25lZCBsb25nIHJldF9uaXRlbXM7CisgICAgdW5zaWduZWQgbG9uZyByZXRfYnl0ZXNfYWZ0ZXI7CisgICAgdW5zaWduZWQgY2hhciogcmV0X3Byb3A7CisgICAgaWYgKFhHZXRXaW5kb3dQcm9wZXJ0eShkaXNwLCB3aW4sIHhhX3Byb3BfbmFtZSwgMCwgMTAyNCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4YV9wcm9wX3R5cGUsICZ4YV9yZXRfdHlwZSwgJnJldF9mb3JtYXQsICZyZXRfbml0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldF9ieXRlc19hZnRlciwgJnJldF9wcm9wKSAhPSBTdWNjZXNzKSB7CisgICAgICAgIC8vIENhbm5vdCBnZXQgdGhlIHByb3BlcnR5LgorICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgUkFJSSBvYmplY3QgdG8gbWFrZSBzdXJlIHxyZXRfcHJvcHwgZG9lc24ndCBsZWFrLgorICAgIGNvbnN0IFhQdHI8dW5zaWduZWQgY2hhcj4gcmV0UHJvcFB0cihyZXRfcHJvcCk7CisKKyAgICBpZiAoeGFfcmV0X3R5cGUgIT0geGFfcHJvcF90eXBlKSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb25nIHRtcF9zaXplID0gKHJldF9mb3JtYXQgLyA4KSAqIHJldF9uaXRlbXM7CisgICAgLyogQ29ycmVjdCA2NCBBcmNoaXRlY3R1cmUgaW1wbGVtZW50YXRpb24gb2YgMzIgYml0IGRhdGEgKi8KKyAgICBpZiAocmV0X2Zvcm1hdCA9PSAzMikgeworICAgICAgICB0bXBfc2l6ZSAqPSBzaXplb2YobG9uZykgLyA0OworICAgIH0KKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Y2hhcj4ocmV0X3Byb3AsIHJldF9wcm9wICsgdG1wX3NpemUpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0TGludXhXaW5kb3dNYW5hZ2VyTmFtZSgpIHsKKyAgICBjb25zdCBYUHRyPERpc3BsYXk+IGRpc3AoWE9wZW5EaXNwbGF5KG51bGxwdHIpKTsKKyAgICBpZiAoIWRpc3ApIHsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHN1cFdpbmRvd1B0ckFzQ2hhcnMgPQorICAgICAgICAgICAgZ2V0WFByb3BlcnR5KGRpc3AuZ2V0KCksIERlZmF1bHRSb290V2luZG93KGRpc3AuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhBX1dJTkRPVywgIl9ORVRfU1VQUE9SVElOR19XTV9DSEVDSyIpOworICAgIGlmIChzdXBXaW5kb3dQdHJBc0NoYXJzLmVtcHR5KCkpIHsKKyAgICAgICAgc3VwV2luZG93UHRyQXNDaGFycyA9CisgICAgICAgICAgICAgICAgZ2V0WFByb3BlcnR5KGRpc3AuZ2V0KCksIERlZmF1bHRSb290V2luZG93KGRpc3AuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQV9DQVJESU5BTCwgIl9XSU5fU1VQUE9SVElOR19XTV9DSEVDSyIpOworICAgICAgICBpZiAoc3VwV2luZG93UHRyQXNDaGFycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBDYW5ub3QgZ2V0IHdpbmRvdyBtYW5hZ2VyIGluZm8gcHJvcGVydGllcy4KKyAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdXBXaW5kb3dQdHJBc0NoYXJzLnNpemUoKSA8IHNpemVvZihXaW5kb3cpKSB7CisgICAgICAgIC8vIEJhZCBzaXplIHJldHVybmVkLCBoYXMgdG8gYmUgYXQgbGVhc3Qgb2YgYSBXaW5kb3cgdHlwZSBzaXplCisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBjb25zdCBhdXRvIHN1cFdpbmRvdyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFdpbmRvdyo+KHN1cFdpbmRvd1B0ckFzQ2hhcnMuZGF0YSgpKTsKKworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IHdtTmFtZSA9IGdldFhQcm9wZXJ0eSgKKyAgICAgICAgICAgIGRpc3AuZ2V0KCksICpzdXBXaW5kb3csCisgICAgICAgICAgICBYSW50ZXJuQXRvbShkaXNwLmdldCgpLCAiVVRGOF9TVFJJTkciLCBGYWxzZSksICJfTkVUX1dNX05BTUUiKTsKKyAgICBpZiAod21OYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgd21OYW1lID0KKyAgICAgICAgICAgICAgICBnZXRYUHJvcGVydHkoZGlzcC5nZXQoKSwgKnN1cFdpbmRvdywgWEFfU1RSSU5HLCAiX05FVF9XTV9OQU1FIik7CisgICAgICAgIGlmICh3bU5hbWUuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gQ2Fubm90IGdldCBuYW1lIG9mIHRoZSB3aW5kb3cgbWFuYWdlcgorICAgICAgICAgICAgcmV0dXJuIHt9OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHdtTmFtZS5iZWdpbigpLCB3bU5hbWUuZW5kKCkpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0TGludXhEZXNrdG9wRW52aXJvbm1lbnROYW1lKCkgeworICAgIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworICAgIGF1dG8geGRnID0gU3lzdGVtOjpnZXQoKS0+ZW52R2V0KCJYREdfQ1VSUkVOVF9ERVNLVE9QIik7CisgICAgc3RkOjp0cmFuc2Zvcm0oeGRnLmJlZ2luKCksIHhkZy5lbmQoKSwgeGRnLmJlZ2luKCksIHRvbG93ZXIpOworICAgIGlmICh4ZGcuZW1wdHkoKSkgeworICAgICAgICAvLyB0cnkgYW5vdGhlciBvbmUuLi4KKyAgICAgICAgY29uc3QgYXV0byBnZG0gPSBTeXN0ZW06OmdldCgpLT5lbnZHZXQoIkdETVNFU1NJT04iKTsKKyAgICAgICAgaWYgKGdkbS5maW5kKCJrZGUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgcmV0dXJuICJrZGUiOworICAgICAgICB9IGVsc2UgaWYgKGdkbS5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gIm1hdGUiOworICAgICAgICB9CisgICAgfQorICAgIGlmICh4ZGcgPT0gIngtY2lubmFtb24iKSB7CisgICAgICAgIHJldHVybiAiY2lubmFtb24iOworICAgIH0KKyAgICAvLyB0aGUgcmVzdCBvZiB0aGVtIGFyZSBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyB0aGVpciBuYW1lCisgICAgcmV0dXJuIHhkZzsKK30KKyNlbmRpZgorCitzdGQ6OnN0cmluZyBnZXRXaW5kb3dNYW5hZ2VyTmFtZSgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldygiV2luZG93cyIpOworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ZpZXcoIk1hYyIpOworI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgcmV0dXJuIGdldExpbnV4V2luZG93TWFuYWdlck5hbWUoKTsKKyNlbHNlCisgICAgI2Vycm9yIFVuc3VwcG9ydGVkIHBsYXRmb3JtCisjZW5kaWYKK30KKworCitzdGQ6OnN0cmluZyBnZXREZXNrdG9wRW52aXJvbm1lbnROYW1lKCkgeworI2lmZGVmIF9XSU4zMgorICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdWaWV3KCJXaW5kb3dzIik7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldygiTWFjIik7CisjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICByZXR1cm4gZ2V0TGludXhEZXNrdG9wRW52aXJvbm1lbnROYW1lKCk7CisjZWxzZQorICAgICNlcnJvciBVbnN1cHBvcnRlZCBwbGF0Zm9ybQorI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9hbmRyb2lkL2VtdWxhdG9yLWNoZWNrL1BsYXRmb3JtSW5mby5oIGIvYW5kcm9pZC9lbXVsYXRvci1jaGVjay9QbGF0Zm9ybUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE4ZGNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9lbXVsYXRvci1jaGVjay9QbGF0Zm9ybUluZm8uaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gUmV0dXJucyB0aGUgY3VycmVudCB3aW5kb3cgbWFuYWdlci4gRm9yIE1hYyBhbmQgV2luZG93cywgaXQganVzdCByZXR1cm5zCisvLyB0aGUgcGxhdGZvcm0gbmFtZSAoTWFjL1dpbmRvd3MpLCBmb3IgbGludXggaXQgcXVlcmllcyB0aGUgaW5zdGFsbGVkIHdpbmRvdworLy8gbWFuYWdlciBmb3IgdGhlIG5hbWUKK3N0ZDo6c3RyaW5nIGdldFdpbmRvd01hbmFnZXJOYW1lKCk7CisKKy8vIFJldHVybnMgdGhlIGN1cnJlbnQgZGVza3RvcCBlbnZpcm9ubWVudC4gRm9yIE1hYyBhbmQgV2luZG93cywgaXQganVzdCByZXR1cm5zCisvLyB0aGUgcGxhdGZvcm0gbmFtZSAoTWFjL1dpbmRvd3MpLCBmb3IgbGludXggaXQgaW5zcGVjdHMgdGhlIGNvbW1vbiBlbnZpcm9ubWVudAorLy8gdmFyaWFibGVzIGFuZCBtYWtlcyB0aGUgYmVzdCBndWVzcyBiYXNlZCBvbiB0aGF0Lgorc3RkOjpzdHJpbmcgZ2V0RGVza3RvcEVudmlyb25tZW50TmFtZSgpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9lbXVsYXRvci1jaGVjay9tYWluLWVtdWxhdG9yLWNoZWNrLmNwcCBiL2FuZHJvaWQvZW11bGF0b3ItY2hlY2svbWFpbi1lbXVsYXRvci1jaGVjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1MThmNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZW11bGF0b3ItY2hlY2svbWFpbi1lbXVsYXRvci1jaGVjay5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL09wdGlvbmFsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL1N0cmluZ1ZpZXcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NwdV9hY2NlbGVyYXRvci5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL0NwdUFjY2VsZXJhdG9yLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRvci1jaGVjay9QbGF0Zm9ybUluZm8uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHR1cGxlPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKK3VzaW5nIENvbW1hbmRSZXR1cm4gPSBzdGQ6OnBhaXI8aW50LCBzdGQ6OnN0cmluZz47CisKK3N0YXRpYyBjb25zdCBpbnQga0dlbmVyaWNFcnJvciA9IDEwMDsKKworc3RhdGljIENvbW1hbmRSZXR1cm4gaGVscCgpOworCisvLyBjaGVjayBhYmlsaXR5IHRvIGxhdW5jaCBoYXhtL2t2bSBhY2NlbGVyYXRlZCBWTSBhbmQgZXhpdAorLy8gZGVzaWduZWQgZm9yIHVzZSBieSBBbmRyb2lkIFN0dWRpbworc3RhdGljIENvbW1hbmRSZXR1cm4gY2hlY2tDcHVBY2NlbGVyYXRpb24oKSB7CisgICAgY2hhciogc3RhdHVzID0gbnVsbHB0cjsKKyAgICBBbmRyb2lkQ3B1QWNjZWxlcmF0aW9uIGNhcGFiaWxpdHkgPQorICAgICAgICAgICAgYW5kcm9pZENwdUFjY2VsZXJhdGlvbl9nZXRTdGF0dXMoJnN0YXR1cyk7CisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZSA9IHN0YXR1cyA/IHN0YXR1cyA6ICIiOworICAgIGZyZWUoc3RhdHVzKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoY2FwYWJpbGl0eSwgc3RkOjptb3ZlKG1lc3NhZ2UpKTsKK30KKworc3RhdGljIENvbW1hbmRSZXR1cm4gY2hlY2tIeXBlclYoKSB7CisgICAgcmV0dXJuIGFuZHJvaWQ6OkdldEh5cGVyVlN0YXR1cygpOworfQorCitzdGF0aWMgQ29tbWFuZFJldHVybiBnZXRDcHVJbmZvKCkgeworICAgIGF1dG8gcGFpciA9IGFuZHJvaWQ6OkdldENwdUluZm8oKTsKKyAgICAvLyBHZXRDcHVJbmZvKCkgcmV0dXJucyBhIHNldCBvZiBsaW5lcywgd2UgbmVlZCB0byB0dXJuIGl0IGludG8gYQorICAgIC8vIHNpbmdsZSBsaW5lLgorICAgIHN0ZDo6cmVwbGFjZShwYWlyLnNlY29uZC5iZWdpbigpLCBwYWlyLnNlY29uZC5lbmQoKSwgJ1xuJywgJ3wnKTsKKyAgICByZXR1cm4gcGFpcjsKK30KKworc3RhdGljIENvbW1hbmRSZXR1cm4gZ2V0V2luZG93TWFuYWdlcigpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gYW5kcm9pZDo6Z2V0V2luZG93TWFuYWdlck5hbWUoKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIobmFtZS5lbXB0eSgpID8ga0dlbmVyaWNFcnJvciA6IDAsIG5hbWUpOworfQorCitzdGF0aWMgQ29tbWFuZFJldHVybiBnZXREZXNrdG9wRW52KCkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG5hbWUgPSBhbmRyb2lkOjpnZXREZXNrdG9wRW52aXJvbm1lbnROYW1lKCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG5hbWUuZW1wdHkoKSA/IGtHZW5lcmljRXJyb3IgOiAwLCBuYW1lKTsKK30KKworY29uc3RleHByIHN0cnVjdCBPcHRpb24geworICAgIGNvbnN0IGNoYXIqIGFyZzsKKyAgICBjb25zdCBjaGFyKiBoZWxwOworICAgIENvbW1hbmRSZXR1cm4gKCpoYW5kbGVyKSgpOworICAgIGJvb2wgcHJpbnRSYXdBbmRTdG9wOworfSBvcHRpb25zW10gPSB7CisgICAgICAgIHsiLWgiLCAiXHRTaG93IHRoaXMgaGVscCBtZXNzYWdlIiwgJmhlbHAsIHRydWV9LAorICAgICAgICB7Ii1oZWxwIiwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UiLCAmaGVscCwgdHJ1ZX0sCisgICAgICAgIHsiLS1oZWxwIiwgIlNob3cgdGhpcyBoZWxwIG1lc3NhZ2UiLCAmaGVscCwgdHJ1ZX0sCisgICAgICAgIHsiYWNjZWwiLCAiQ2hlY2sgdGhlIENQVSBhY2NlbGVyYXRpb24gc3VwcG9ydCIsICZjaGVja0NwdUFjY2VsZXJhdGlvbn0sCisgICAgICAgIHsiaHlwZXItdiIsICJDaGVjayBpZiBoeXBlci12IGlzIGluc3RhbGxlZCBhbmQgcnVubmluZyAoV2luZG93cykiLAorICAgICAgICAgJmNoZWNrSHlwZXJWfSwKKyAgICAgICAgeyJjcHUtaW5mbyIsICJSZXR1cm4gdGhlIENQVSBtb2RlbCBpbmZvcm1hdGlvbiIsICZnZXRDcHVJbmZvfSwKKyAgICAgICAgeyJ3aW5kb3ctbWdyIiwgIlJldHVybiB0aGUgY3VycmVudCB3aW5kb3cgbWFuYWdlciBuYW1lIiwKKyAgICAgICAgICZnZXRXaW5kb3dNYW5hZ2VyfSwKKyAgICAgICAgeyJkZXNrdG9wLWVudiIsICJSZXR1cm4gdGhlIGN1cnJlbnQgZGVza3RvcCBlbnZpcm9ubWVudCBuYW1lIiwKKyAgICAgICAgICZnZXREZXNrdG9wRW52fSwKK307CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB1c2FnZSgpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOworICAgIHN0ciA8PAorUiIoVXNhZ2U6IGVtdWxhdG9yLWNoZWNrIDxhcmd1bWVudDE+IFs8YXJndW1lbnQyPi4uLl0KKworUGVyZm9ybXMgdGhlIHNldCBvZiBjaGVja3MgcmVxdWVzdGVkIGluIDxhcmd1bWVudFg+IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgaW4KK3RoZSBmb2xsb3dpbmcgZm9ybWF0OgorPGFyZ3VtZW50MT46Cis8cmV0dXJuIGNvZGUgZm9yIDxhcmd1bWVudDE+PgorPGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBpbmZvcm1hdGlvbiByZXR1cm5lZCBmb3IgPGFyZ3VtZW50MT4+Cis8YXJndW1lbnQxPgorPGFyZ3VtZW50Mj46Cis8cmV0dXJuIGNvZGUgZm9yIDxhcmd1bWVudDI+PgorPGEgc2luZ2xlIGxpbmUgb2YgdGV4dCBpbmZvcm1hdGlvbiByZXR1cm5lZCBmb3IgPGFyZ3VtZW50Mj4+Cis8YXJndW1lbnQyPgorLi4uCisKKzxhcmd1bWVudFg+IGlzIGFueSBvZjoKKworKSI7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG9wdGlvbiA6IG9wdGlvbnMpIHsKKyAgICAgICAgc3RyIDw8ICIgICAgIiA8PCBvcHRpb24uYXJnIDw8ICJcdFx0IiA8PCBvcHRpb24uaGVscCA8PCAnXG4nOworICAgIH0KKworICAgIHN0ciA8PCAnXG4nOworCisgICAgcmV0dXJuIHN0ci5zdHIoKTsKK30KKworc3RhdGljIENvbW1hbmRSZXR1cm4gaGVscCgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMCwgdXNhZ2UoKSk7Cit9CisKK3N0YXRpYyBpbnQgZXJyb3IoY29uc3QgY2hhciogZm9ybWF0LCBjb25zdCBjaGFyKiBhcmcgPSBudWxscHRyKSB7CisgICAgaWYgKGZvcm1hdCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmcpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdXNhZ2UoKS5jX3N0cigpKTsKKyAgICByZXR1cm4ga0dlbmVyaWNFcnJvcjsKK30KKworc3RhdGljIGludCBwcm9jZXNzQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCogYXJndikgeworICAgIGFuZHJvaWQ6OmJhc2U6Ok9wdGlvbmFsPGludD4gcmV0Q29kZTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgICAgIGNvbnN0IFN0cmluZ1ZpZXcgYXJnID0gYXJndltpXTsKKyAgICAgICAgY29uc3QgYXV0byBvcHQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICAgICAgc3RkOjpiZWdpbihvcHRpb25zKSwgc3RkOjplbmQob3B0aW9ucyksCisgICAgICAgICAgICAgICAgW2FyZ10oY29uc3QgT3B0aW9uJiBvcHQpIHsgcmV0dXJuIGFyZyA9PSBvcHQuYXJnOyB9KTsKKyAgICAgICAgaWYgKG9wdCA9PSBzdGQ6OmVuZChvcHRpb25zKSkgeworICAgICAgICAgICAgcHJpbnRmKCIlczpcbiVkXG5Vbmtub3duIGFyZ3VtZW50XG4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICBhcmcuY19zdHIoKSwga0dlbmVyaWNFcnJvciwgYXJnLmNfc3RyKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGhhbmRsZXJSZXMgPSBvcHQtPmhhbmRsZXIoKTsKKyAgICAgICAgaWYgKCFyZXRDb2RlKSB7CisgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgZmlyc3QgcmV0dXJuIHZhbHVlIGZvciB0aGUgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVyc2lvbi4KKyAgICAgICAgICAgIHJldENvZGUgPSBoYW5kbGVyUmVzLmZpcnN0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wdC0+cHJpbnRSYXdBbmRTdG9wKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBoYW5kbGVyUmVzLnNlY29uZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCIlczpcbiVkXG4lc1xuJXNcbiIsCisgICAgICAgICAgICAgICBhcmcuY19zdHIoKSwKKyAgICAgICAgICAgICAgIGhhbmRsZXJSZXMuZmlyc3QsCisgICAgICAgICAgICAgICBoYW5kbGVyUmVzLnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgYXJnLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiByZXRDb2RlLnZhbHVlT3Ioa0dlbmVyaWNFcnJvcik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCogYXJndikgeworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICByZXR1cm4gZXJyb3IoIk1pc3NpbmcgYSByZXF1aXJlZCBhcmd1bWVudChzKSIpOworICAgIH0KKworICAgIHJldHVybiBwcm9jZXNzQXJndW1lbnRzKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9lbXVsYXRvci9tYWluLWVtdWxhdG9yLmNwcCBiL2FuZHJvaWQvZW11bGF0b3IvbWFpbi1lbXVsYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMzVhNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvZW11bGF0b3IvbWFpbi1lbXVsYXRvci5jcHAKQEAgLTAsMCArMSwxMDAxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvKiBUaGlzIGlzIHRoZSBzb3VyY2UgY29kZSB0byB0aGUgdGlueSAiZW11bGF0b3IiIGxhdW5jaGVyIHByb2dyYW0KKyAqIHRoYXQgaXMgaW4gY2hhcmdlIG9mIHN0YXJ0aW5nIHRoZSB0YXJnZXQtc3BlY2lmaWMgZW11bGF0b3IgYmluYXJ5CisgKiBmb3IgYSBnaXZlbiBBVkQsIGkuZS4gZWl0aGVyICdlbXVsYXRvci1hcm0nIG9yICdlbXVsYXRvci14ODYnCisgKgorICogVGhpcyBwcm9ncmFtIHdpbGwgYmUgcmVwbGFjZWQgaW4gdGhlIGZ1dHVyZSBieSB3aGF0IGlzIGN1cnJlbnRseQorICoga25vd24gYXMgJ2VtdWxhdG9yLXVpJywgYnV0IGlzIGEgZ29vZCBwbGFjZWhvbGRlciB1bnRpbCB0aGlzCisgKiBtaWdyYXRpb24gaXMgY29tcGxldGVkLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKworI2luY2x1ZGUgImFuZHJvaWQvYXZkL3NjYW5uZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC91dGlsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0FycmF5U2l6ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9TdHJpbmdWaWV3LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1BhdGhVdGlscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9tZW1vcnkvU2NvcGVkUHRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3N5c3RlbS9TeXN0ZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NhbWVyYS9jYW1lcmEtbGlzdC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1lbXVnbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1oZWxwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9vcGVuZ2wvZW11Z2xfY29uZmlnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9xdC9xdF9zZXR1cC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9leGVjLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9ob3N0X2JpdG5lc3MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3BhbmljLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9idWZwcmludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvd2luMzJfY21kbGluZV9xdW90ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdmVyc2lvbi5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlBhdGhVdGlsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJ1bk9wdGlvbnM7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpTY29wZWRDUHRyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nVmlldzsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN5c3RlbTsKKworI2RlZmluZSBERUJVRyAxCisKKyNpZiBERUJVRworIyAgZGVmaW5lIEQoLi4uKSAgZG8geyBpZiAoYW5kcm9pZF92ZXJib3NlKSBwcmludGYoImVtdWxhdG9yOiIgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgIGRlZmluZSBEKC4uLikgIGRve313aGlsZSgwKQorI2VuZGlmCisKKy8qIFRoZSBleHRlbnNpb24gdXNlZCBieSBkeW5hbWljIGxpYnJhcmllcyBvbiB0aGUgaG9zdCBwbGF0Zm9ybSAqLworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIERMTF9FWFRFTlNJT04gICIuZGxsIgorI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisjICBkZWZpbmUgRExMX0VYVEVOU0lPTiAgIi5keWxpYiIKKyNlbHNlCisjICBkZWZpbmUgRExMX0VYVEVOU0lPTiAgIi5zbyIKKyNlbmRpZgorCisvLyBOYW1lIG9mIEdQVSBlbXVsYXRpb24gbWFpbiBsaWJyYXJ5IGZvciAoMzItYml0IGFuZCA2NC1iaXQgdmVyc2lvbnMpCisjZGVmaW5lIEdMRVNfRU1VTEFUSU9OX0xJQiAgICAibGliT3BlbmdsUmVuZGVyIiBETExfRVhURU5TSU9OCisjZGVmaW5lIEdMRVNfRU1VTEFUSU9OX0xJQjY0ICAibGliNjRPcGVuZ2xSZW5kZXIiIERMTF9FWFRFTlNJT04KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBjaGFyKiBnZXRDbGFzc2ljRW11bGF0b3JQYXRoKGNvbnN0IGNoYXIqIHByb2dEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdmRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3YW50ZWRCaXRuZXNzKTsKKworc3RhdGljIGNoYXIqIGdldFFlbXVFeGVjdXRhYmxlUGF0aChjb25zdCBjaGFyKiBwcm9ncmFtUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXZkQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdhbnRlZEJpdG5lc3MpOworCitzdGF0aWMgdm9pZCB1cGRhdGVMaWJyYXJ5U2VhcmNoUGF0aChpbnQgd2FudGVkQml0bmVzcywgYm9vbCB1c2VTeXN0ZW1MaWJzLCBjb25zdCBjaGFyKiBsYXVuY2hlckRpcik7CisKK3N0YXRpYyBib29sIGNoZWNrQXZkU3lzdGVtRGlyRm9yS2VybmVsUmFuY2h1KGNvbnN0IGNoYXIqIGF2ZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdmRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYW5kcm9pZE91dCk7CisKK3N0YXRpYyBib29sIGNoZWNrRm9yR29vZ2xlQVBJcyhjb25zdCBjaGFyKiBhdmROYW1lKTsKK3N0YXRpYyBpbnQgZ2V0QXBpTGV2ZWwoY29uc3QgY2hhciogYXZkTmFtZSk7CitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0QXZkU3lzdGVtUGF0aChjb25zdCBjaGFyKiBhdmROYW1lKTsKKworI2lmZGVmIF9XSU4zMgorc3RhdGljIGNvbnN0IGNoYXIga0V4ZUV4dGVuc2lvbltdID0gIi5leGUiOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyIGtFeGVFeHRlbnNpb25bXSA9ICIiOworI2VuZGlmCisKKy8vIFJldHVybiB0cnVlIGlmIHN0cmluZyB8c3RyfCBpcyBpbiB8bGlzdHwsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHN0cmluZworLy8gcG9pbnRlcnMgb2YgfGxpc3RTaXplfCBlbGVtZW50cy4KK3N0YXRpYyBib29sIGlzU3RyaW5nSW5MaXN0KGNvbnN0IGNoYXIqIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxpc3RTaXplKSB7CisgICAgc2l6ZV90IG4gPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBsaXN0U2l6ZTsgKytuKSB7CisgICAgICAgIGlmICghc3RyY21wKHN0ciwgbGlzdFtuXSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIENQVSBhcmNoaXRlY3R1cmUgfGF2ZEFyY2h8IGlzIHN1cHBvcnRlZCBieSBRRU1VMSwKKy8vIGkuZS4gdGhlICdnb2xkZmlzaCcgdmlydHVhbCBib2FyZC4KK3N0YXRpYyBib29sIGlzQ3B1QXJjaFN1cHBvcnRlZEJ5R29sZGZpc2goY29uc3QgY2hhciogYXZkQXJjaCkgeworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrU3VwcG9ydGVkW10gPSB7ImFybSIsICJtaXBzIiwgIng4NiIsICJ4ODZfNjQifTsKKyAgICByZXR1cm4gaXNTdHJpbmdJbkxpc3QoYXZkQXJjaCwga1N1cHBvcnRlZCwgQVJSQVlfU0laRShrU3VwcG9ydGVkKSk7Cit9CisKKworLy8gUmV0dXJuIHRydWUgaWYgdGhlIENQVSBhcmNoaXRlY3R1cmUgfGF2ZEFyY2h8IGlzIHN1cHBvcnRlZCBieSBRRU1VMiwKKy8vIGkuZS4gdGhlICdyYW5jaHUnIHZpcnR1YWwgYm9hcmQuCitzdGF0aWMgYm9vbCBpc0NwdUFyY2hTdXBwb3J0ZWRCeVJhbmNodShjb25zdCBjaGFyKiBhdmRBcmNoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTdXBwb3J0ZWRbXSA9CisgICAgICAgICAgICB7ImFybSIsICJhcm02NCIsICJtaXBzIiwgIm1pcHM2NCIsICJ4ODYiLCAieDg2XzY0In07CisgICAgcmV0dXJuIGlzU3RyaW5nSW5MaXN0KGF2ZEFyY2gsIGtTdXBwb3J0ZWQsIEFSUkFZX1NJWkUoa1N1cHBvcnRlZCkpOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZW11bGF0b3JfZGlybmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbGF1bmNoZXJEaXIpIHsKKyAgICBjaGFyKiBjc3RyMSA9IHBhdGhfcGFyZW50KGxhdW5jaGVyRGlyLmNfc3RyKCksIDEpOworICAgIGNoYXIqIGNzdHIyID0gcGF0aF9qb2luKGNzdHIxLCAiZW11bGF0b3IiKTsKKyAgICBzdGQ6OnN0cmluZyBjcHBzdHIoY3N0cjIpOworICAgIGZyZWUoY3N0cjEpOworICAgIGZyZWUoY3N0cjIpOworICAgIHJldHVybiBjcHBzdHI7Cit9CisKK3N0YXRpYyB2b2lkIGRlbGV0ZV9maWxlcyhjb25zdCBTdHJpbmdWaWV3IGZpbGVfZGlyLCBjb25zdCBTdHJpbmdWaWV3IGZpbGVzX3RvX2RlbGV0ZVtdLAorICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2ZpbGVzKSB7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBudW1fZmlsZXM7ICsraSkgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlID0gUGF0aFV0aWxzOjpqb2luKGZpbGVfZGlyLCBmaWxlc190b19kZWxldGVbaV0pOworICAgICAgICBBUG9zaXhTdGF0dXMgcmV0ID0gcGF0aF9kZWxldGVfZmlsZShmaWxlLmNfc3RyKCkpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIEQoIkRlbGV0aW5nIGZpbGUgJXMgZG9uZVxuIiwgZmlsZS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEQoIkRlbGV0aW5nIGZpbGUgJXMgZmFpbGVkXG4iLCBmaWxlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbGVhbl91cF9hdmRfY29udGVudHNfZXhjZXB0X2NvbmZpZ19pbmkoY29uc3QgY2hhciogYXZkX2ZvbGRlcikgeworICAgIC8vIHNkY2FyZC5pbWcgc2hvdWxkIG5vdCBiZSBkZWxldGVkLCBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQgYnkgc2RrIG1hbmFnZXIKKyAgICAvLyBhbmQgd2UgZG9udCBrbm93IGhvdyB0byByZS1jcmVhdGUgaXQgZnJvbSBlbXVsYXRvciB5ZXQKKyAgICAvLyBUT0RPOiBmaXhpdAorICAgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nVmlldyBmaWxlc190b19kZWxldGVbXSA9IHsic3lzdGVtLmltZy5xY293MiIsICJ1c2VyZGF0YS1xZW11LmltZyIsCisgICAgICAgICJ1c2VyZGF0YS1xZW11LmltZy5xY293MiIsICJ1c2VyZGF0YS5pbWciLCAidXNlcmRhdGEuaW1nLnFjb3cyIiwgImNhY2hlLmltZyIsCisgICAgICAgICJjYWNoZS5pbWcucWNvdzIiLCAidmVyc2lvbl9udW0uY2FjaGUiLCAic2RjYXJkLmltZy5xY293MiIsICJlbmNyeXB0aW9ua2V5LmltZyIsCisgICAgICAgICJlbmNyeXB0aW9ua2V5LmltZy5xY293MiIsICJoYXJkd2FyZS1xZW11LmluaSIsICJlbXVsYXRvci11c2VyLmluaSJ9OworICAgIGRlbGV0ZV9maWxlcyhhdmRfZm9sZGVyLCBmaWxlc190b19kZWxldGUsIEFSUkFZX1NJWkUoZmlsZXNfdG9fZGVsZXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfdXNlcmRhdGFfaW1nX2Zyb21fc3lzX2ZvbGRlcihjb25zdCBjaGFyKiBzeXNfZm9sZGVyLCBjb25zdCBjaGFyKiBhdmRfZm9sZGVyKSB7CisgICAgc3RkOjpzdHJpbmcgZGVzdCA9IFBhdGhVdGlsczo6am9pbihhdmRfZm9sZGVyLCAidXNlcmRhdGEuaW1nIik7CisgICAgc3RkOjpzdHJpbmcgc3JjID0gUGF0aFV0aWxzOjpqb2luKHN5c19mb2xkZXIsICJ1c2VyZGF0YS5pbWciKTsKKyAgICBBUG9zaXhTdGF0dXMgcmV0ID0gcGF0aF9jb3B5X2ZpbGUoZGVzdC5jX3N0cigpLCBzcmMuY19zdHIoKSk7CisgICAgRCgiQ29weWluZyAlcyB0byAlcyAlc1xuIiwgc3JjLmNfc3RyKCksIGRlc3QuY19zdHIoKSwgcmV0ID09IDAgPyAiZG9uZSIgOiAiZmFpbGVkIik7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX3VwX2FuZHJvaWRfb3V0KGNvbnN0IGNoYXIqIGFuZHJvaWRfb3V0KSB7CisgICAgLy8gbm90ZTogd2Ugc2hvdWxkIG5vdCBkZWxldGUgJ3VzZXJkYXRhLmltZycgb3RoZXJ3aXNlLCB3ZSB3aWxsIGhhdmUgdG8gcnVuCisgICAgLy8gbWFrZSBhZ2FpbiB0byBjcmVhdGUgaXQ7IGluIGF2ZC8gZm9sZGVyLCBpdCBjYW4gYmUgY29waWVkIGZyb20KKyAgICAvLyBzeXN0ZW0taW1hZ2VzLy4uLi88YXJjaD4vIGRpcmVjdG9yeS4KKyAgICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1ZpZXcgZmlsZXNfdG9fZGVsZXRlW10gPSB7InN5c3RlbS5pbWcucWNvdzIiLCAidXNlcmRhdGEtcWVtdS5pbWciLAorICAgICAgICAidXNlcmRhdGEtcWVtdS5pbWcucWNvdzIiLCAidXNlcmRhdGEuaW1nLnFjb3cyIiwgImNhY2hlLmltZy5xY293MiIsICJ2ZXJzaW9uX251bS5jYWNoZSIsCisgICAgICAgICJoYXJkd2FyZS1xZW11LmluaSIsICJlbXVsYXRvci11c2VyLmluaSJ9OworICAgIGRlbGV0ZV9maWxlcyhhbmRyb2lkX291dCwgZmlsZXNfdG9fZGVsZXRlLCBBUlJBWV9TSVpFKGZpbGVzX3RvX2RlbGV0ZSkpOworfQorCitzdGF0aWMgYm9vbCBjaGVja09zVmVyc2lvbigpIHsKKyNpZm5kZWYgX1dJTjMyCisgICAgcmV0dXJuIHRydWU7CisjZWxzZSAgLy8gX1dJTjMyCisgICAgLy8gTWFrZSBzdXJlIE9TIGlzIFdpbjcrIC0gb3RoZXJ3aXNlIHRoZSBlbXVsYXRpb24gZW5naW5lIGp1c3Qgd29uJ3Qgc3RhcnQuCisgICAgT1NWRVJTSU9OSU5GT1cgdmVyID0ge3NpemVvZih2ZXIpfTsKKyAgICBpZiAoITo6R2V0VmVyc2lvbkV4VygmdmVyKSkgeworICAgICAgICBjb25zdCBhdXRvIGVyciA9ICh1bnNpZ25lZCk6OkdldExhc3RFcnJvcigpOworICAgICAgICBkd2FybmluZygKKyAgICAgICAgICAgImZhaWxlZCB0byBnZXQgb3BlcmF0aW5nIHN5c3RlbSB2ZXJzaW9uLlxuIgorICAgICAgICAgICAiVGhlIEFuZHJvaWQgRW11bGF0b3IgbWF5IG5vdCBydW4gcHJvcGVybHkgb24gV2luZG93cyBWaXN0YSBhbmRcbiIKKyAgICAgICAgICAgIndvbid0IHJ1biBvbiBXaW5kb3dzIFhQIChlcnJvciBjb2RlICVkIFsweCV4XSkuIiwKKyAgICAgICAgICAgZXJyLCBlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdpbmRvd3MgNyBpcyA2LjEKKyAgICAgICAgaWYgKHZlci5kd01ham9yVmVyc2lvbiA8IDYgfHwKKyAgICAgICAgICAgICh2ZXIuZHdNYWpvclZlcnNpb24gPT0gNiAmJiB2ZXIuZHdNaW5vclZlcnNpb24gPCAxKSkgeworICAgICAgICAgICAgZGVycm9yKAorICAgICAgICAgICAgICAgICJXaW5kb3dzIDcgb3IgbmV3ZXIgaXMgcmVxdWlyZWQgdG8gcnVuIHRoZSBBbmRyb2lkIEVtdWxhdG9yLlxuIgorICAgICAgICAgICAgICAgICJQbGVhc2UgdXBncmFkZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYgIC8vIF9XSU4zMgorfQorCisvKiBNYWluIHJvdXRpbmUgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKyAgICBjb25zdCBjaGFyKiBhdmROYW1lID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKiBhdmRBcmNoID0gTlVMTDsKKyAgICBjb25zdCBjaGFyKiBncHUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIGVuZ2luZSA9IE5VTEw7CisgICAgYm9vbCBkb0FjY2VsQ2hlY2sgPSBmYWxzZTsKKyAgICBib29sIGRvTGlzdEF2ZHMgPSBmYWxzZTsKKyAgICBib29sIGZvcmNlMzJiaXQgPSBmYWxzZTsKKyAgICBib29sIG5vV2luZG93ID0gZmFsc2U7CisgICAgYm9vbCB1c2VTeXN0ZW1MaWJzID0gZmFsc2U7CisgICAgYm9vbCBmb3JjZUVuZ2luZUxhdW5jaCA9IGZhbHNlOworICAgIGJvb2wgcXVlcnlWZXJzaW9uID0gZmFsc2U7CisgICAgYm9vbCBkb0xpc3RXZWJjYW1zID0gZmFsc2U7CisgICAgYm9vbCBjbGVhblVwQXZkQ29udGVudCA9IGZhbHNlOworCisgICAgLyogRGVmaW5lIEFORFJPSURfRU1VTEFUT1JfREVCVUcgdG8gMSBpbiB5b3VyIGVudmlyb25tZW50IGlmIHlvdSB3YW50IHRvCisgICAgICogc2VlIHRoZSBkZWJ1ZyBtZXNzYWdlcyBmcm9tIHRoaXMgbGF1bmNoZXIgcHJvZ3JhbS4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiBkZWJ1ZyA9IGdldGVudigiQU5EUk9JRF9FTVVMQVRPUl9ERUJVRyIpOworCisgICAgaWYgKGRlYnVnICE9IE5VTEwgJiYgKmRlYnVnICYmICpkZWJ1ZyAhPSAnMCcpIHsKKyAgICAgICAgYW5kcm9pZF92ZXJib3NlID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWNoZWNrT3NWZXJzaW9uKCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgLyogRGVmaW5lIEFORFJPSURfRU1VTEFUT1JfVVNFX1NZU1RFTV9MSUJTIHRvIDEgaW4geW91ciBlbnZpcm9ubWVudCBpZiB5b3UKKyAgICAgKiB3YW50IHRoZSBlZmZlY3Qgb2YgLXVzZS1zeXN0ZW0tbGlicyB0byBiZSBwZXJtYW5lbnQuCisgICAgICovCisgICAgY29uc3QgY2hhciogc3lzdGVtX2xpYnMgPSBnZXRlbnYoIkFORFJPSURfRU1VTEFUT1JfVVNFX1NZU1RFTV9MSUJTIik7CisgICAgaWYgKHN5c3RlbV9saWJzICYmIHN5c3RlbV9saWJzWzBdICYmIHN5c3RlbV9saWJzWzBdICE9ICcwJykgeworICAgICAgICB1c2VTeXN0ZW1MaWJzID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYgIC8vIF9fbGludXhfXworCisgICAgLyogUGFyc2UgY29tbWFuZC1saW5lIGFuZCBsb29rIGZvcgorICAgICAqIDEpIGFuIGF2ZCBuYW1lIGVpdGhlciBpbiB0aGUgZm9ybSBvciAnLWF2ZCA8bmFtZT4nIG9yICdAPG5hbWU+JworICAgICAqIDIpICctZm9yY2UtMzJiaXQnIHdoaWNoIGFsd2F5cyB1c2UgMzItYml0IGVtdWxhdG9yIG9uIDY0LWJpdCBwbGF0Zm9ybXMKKyAgICAgKiAzKSAnLXZlcmJvc2UnLyctZGVidWctYWxsJy8nLWRlYnVnIGFsbCcvJy1kZWJ1Zy1pbml0Jy8nLWRlYnVnIGluaXQnCisgICAgICogICAgdG8gZW5hYmxlIHZlcmJvc2UgbW9kZS4KKyAgICAgKi8KKyAgICBmb3IgKGludCBubiA9IDE7IG5uIDwgYXJnYzsgbm4rKykgeworICAgICAgICBjb25zdCBjaGFyKiBvcHQgPSBhcmd2W25uXTsKKworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICItYWNjZWwtY2hlY2siKSkgeworICAgICAgICAgICAgZG9BY2NlbENoZWNrID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCItcWVtdSIpKSB7CisgICAgICAgICAgICBmb3JjZUVuZ2luZUxhdW5jaCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IFByb2Nlc3MgLWhlbHAgb3B0aW9ucyBpbW1lZGlhdGVseSwgaWdub3JpbmcgYWxsIG90aGVyCisgICAgICAgIC8vIHBhcmFtZXRlcnMuCisgICAgICAgIGludCBoZWxwU3RhdHVzID0gZW11bGF0b3JfcGFyc2VIZWxwT3B0aW9uKG9wdCk7CisgICAgICAgIGlmIChoZWxwU3RhdHVzID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBoZWxwU3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCAiLXZlcnNpb24iKSkgeworICAgICAgICAgICAgcXVlcnlWZXJzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCAiLXdpcGUtZGF0YSIpKSB7CisgICAgICAgICAgICBjbGVhblVwQXZkQ29udGVudD0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCItdmVyYm9zZSIpIHx8ICFzdHJjbXAob3B0LCItZGVidWctYWxsIikKKyAgICAgICAgICAgICAgICAgfHwgIXN0cmNtcChvcHQsIi1kZWJ1Zy1pbml0IikpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfdmVyYm9zZSA9IDE7CisgICAgICAgICAgICBiYXNlX2VuYWJsZV92ZXJib3NlX2xvZ3MoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCItZGVidWciKSAmJiBubiArIDEgPCBhcmdjICYmCisgICAgICAgICAgICAoIXN0cmNtcChhcmd2W25uICsgMV0sICJhbGwiKSB8fCAhc3RyY21wKGFyZ3Zbbm4gKyAxXSwgImluaXQiKSkpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfdmVyYm9zZSA9IDE7CisgICAgICAgICAgICBiYXNlX2VuYWJsZV92ZXJib3NlX2xvZ3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RyY21wKG9wdCwiLWdwdSIpICYmIG5uICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIGdwdSA9IGFyZ3Zbbm4gKyAxXTsKKyAgICAgICAgICAgIG5uKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RyY21wKG9wdCwiLXJhbmNodSIpKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nOiB0aGUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGRlZmF1bHRzIHRvIGF1dG8tZGV0ZWN0LgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICItZW5naW5lIikgJiYgbm4gKyAxIDwgYXJnYykgeworICAgICAgICAgICAgZW5naW5lID0gYXJndltubiArIDFdOworICAgICAgICAgICAgbm4rKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCItZm9yY2UtMzJiaXQiKSkgeworICAgICAgICAgICAgZm9yY2UzMmJpdCA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RyY21wKG9wdCwiLW5vLXdpbmRvdyIpKSB7CisgICAgICAgICAgICBub1dpbmRvdyA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICAgIGlmICghc3RyY21wKG9wdCwgIi11c2Utc3lzdGVtLWxpYnMiKSkgeworICAgICAgICAgICAgdXNlU3lzdGVtTGlicyA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBfX2xpbnV4X18KKworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICItbGlzdC1hdmRzIikpIHsKKyAgICAgICAgICAgIGRvTGlzdEF2ZHMgPSB0cnVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0cmNtcChvcHQsICItd2ViY2FtLWxpc3QiKSkgeworICAgICAgICAgICAgZG9MaXN0V2ViY2FtcyA9IHRydWU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXZkTmFtZSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0LCItYXZkIikgJiYgbm4rMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgICAgICBhdmROYW1lID0gYXJndltubisxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9wdFswXSA9PSAnQCcgJiYgb3B0WzFdICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBhdmROYW1lID0gb3B0KzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZG9BY2NlbENoZWNrKSB7CisgICAgICAgIC8vIGZvcndhcmQgdGhlIG9wdGlvbiB0byBvdXIgYW5zd2VyaW5nIG1hY2hpbmUKKyAgICAgICAgYXV0byYgc3lzID0gKlN5c3RlbTo6Z2V0KCk7CisgICAgICAgIGNvbnN0IGF1dG8gcGF0aCA9IHN5cy5maW5kQnVuZGxlZEV4ZWN1dGFibGUoImVtdWxhdG9yLWNoZWNrIik7CisgICAgICAgIGlmIChwYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGRlcnJvcigiY2FuJ3QgZmluZCB0aGUgZW11bGF0b3ItY2hlY2sgZXhlY3V0YWJsZSAiCisgICAgICAgICAgICAgICAgICAgICIoY29ycnVwdGVkIHRvb2xzIGluc3RhbGxhdGlvbj8pIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBTeXN0ZW06OlByb2Nlc3NFeGl0Q29kZSBleGl0X2NvZGU7CisgICAgICAgIGJvb2wgcmV0ID0gc3lzLnJ1bkNvbW1hbmQoCisgICAgICAgICAgICAgICAge3BhdGgsICJhY2NlbCJ9LAorICAgICAgICAgICAgICAgIFJ1bk9wdGlvbnM6OldhaXRGb3JDb21wbGV0aW9uIHwgUnVuT3B0aW9uczo6U2hvd091dHB1dCwKKyAgICAgICAgICAgICAgICBTeXN0ZW06OmtJbmZpbml0ZSwgJmV4aXRfY29kZSk7CisgICAgICAgIHJldHVybiByZXQgPyBleGl0X2NvZGUgOiAtMTsKKyAgICB9CisKKyAgICBpZiAoZG9MaXN0QXZkcykgeworICAgICAgICBBdmRTY2FubmVyKiBzY2FubmVyID0gYXZkU2Nhbm5lcl9uZXcoTlVMTCk7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBhdmRTY2FubmVyX25leHQoc2Nhbm5lcik7CisgICAgICAgICAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIGF2ZFNjYW5uZXJfZnJlZShzY2FubmVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGRvTGlzdFdlYmNhbXMpIHsKKyAgICAgICAgYW5kcm9pZF9jYW1lcmFfbGlzdF93ZWJjYW1zKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIElmIEFORFJPSURfRU1VTEFUT1JfRk9SQ0VfMzJCSVQgaXMgc2V0IHRvICd0cnVlJyBvciAnMScgaW4gdGhlCisgICAgICogZW52aXJvbm1lbnQsIHNldCAtZm9yY2UtMzJiaXQgYXV0b21hdGljYWxseS4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIga0VudlZhcltdID0gIkFORFJPSURfRU1VTEFUT1JfRk9SQ0VfMzJCSVQiOworICAgICAgICBjb25zdCBjaGFyKiB2YWwgPSBnZXRlbnYoa0VudlZhcik7CisgICAgICAgIGlmICh2YWwgJiYgKCFzdHJjbXAodmFsLCAidHJ1ZSIpIHx8ICFzdHJjbXAodmFsLCAiMSIpKSkgeworICAgICAgICAgICAgaWYgKCFmb3JjZTMyYml0KSB7CisgICAgICAgICAgICAgICAgRCgiQXV0by1jb25maWc6IC1mb3JjZS0zMmJpdCAoJXM9JXMpXG4iLCBrRW52VmFyLCB2YWwpOworICAgICAgICAgICAgICAgIGZvcmNlMzJiaXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50IGhvc3RCaXRuZXNzID0gYW5kcm9pZF9nZXRIb3N0Qml0bmVzcygpOworICAgIGludCB3YW50ZWRCaXRuZXNzID0gaG9zdEJpdG5lc3M7CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICBpZiAoIWZvcmNlMzJiaXQgJiYgaG9zdEJpdG5lc3MgPT0gMzIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisiRVJST1I6IDMyLWJpdCBMaW51eCBBbmRyb2lkIGVtdWxhdG9yIGJpbmFyaWVzIGFyZSBERVBSRUNBVEVELCB0byB1c2UgdGhlbVxuIgorIiAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuIgorIlxuIgorIiAgICAgICAtIFVzZSB0aGUgJy1mb3JjZS0zMmJpdCcgb3B0aW9uIHdoZW4gaW52b2tpbmcgJ2VtdWxhdG9yJy5cbiIKKyIgICAgICAgLSBTZXQgQU5EUk9JRF9FTVVMQVRPUl9GT1JDRV8zMkJJVCB0byAndHJ1ZScgaW4geW91ciBlbnZpcm9ubWVudC5cbiIKKyJcbiIKKyIgICAgICAgRWl0aGVyIG9uZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIDMyLWJpdCBiaW5hcmllcywgYnV0IHBsZWFzZSBiZVxuIgorIiAgICAgICBhd2FyZSB0aGF0IHRoZXNlIHdpbGwgZGlzYXBwZWFyIGluIGEgZnV0dXJlIEFuZHJvaWQgU0RLIHJlbGVhc2UuXG4iCisiICAgICAgIENvbnNpZGVyIG1vdmluZyB0byBhIDY0LWJpdCBMaW51eCBzeXN0ZW0gYmVmb3JlIHRoYXQgaGFwcGVucy5cbiIKKyJcbiIKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorI2VuZGlmICAvLyBfX2xpbnV4X18KKworICAgIGlmIChmb3JjZTMyYml0KSB7CisgICAgICAgIHdhbnRlZEJpdG5lc3MgPSAzMjsKKyAgICB9CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAvLyBOb3Qgc3VyZSB3aGVuIHRoZSBhbmRyb2lkX2dldEhvc3RCaXRuZXNzIHdpbGwgYnJlYWsgYWdhaW4KKyAgICAvLyBidXQgd2UgYXJlIG5vdCBzaGlwaW5nIDMyYml0IGZvciBPU1ggbG9uZyB0aW1lIGFnby4KKyAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2FuZHJvaWQvaXNzdWVzL2RldGFpbD9pZD0xOTY3NzkKKyAgICBpZiAoZm9yY2UzMmJpdCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyJXQVJOSU5HOiAzMi1iaXQgT1NYIEFuZHJvaWQgZW11bGF0b3IgYmluYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIHVzZSA2NGJpdC5cbiIpOworICAgIH0KKyAgICB3YW50ZWRCaXRuZXNzID0gNjQ7CisjZW5kaWYKKworICAgIC8vIFdoZW4gcnVubmluZyBpbiBhIHBsYXRmb3JtIGJ1aWxkIGVudmlyb25tZW50LCBwb2ludCB0byB0aGUgb3V0cHV0CisgICAgLy8gZGlyZWN0b3J5IHdoZXJlIGltYWdlIHBhcnRpdGlvbiBmaWxlcyBhcmUgbG9jYXRlZC4KKyAgICBjb25zdCBjaGFyKiBhbmRyb2lkT3V0ID0gTlVMTDsKKworICAgIC8vIHByaW50IGEgdmVyc2lvbiBzdHJpbmcgYW5kIGJ1aWxkIGlkIGZvciBlYXNpZXIgZGVidWdnaW5nCisjaWYgZGVmaW5lZCBBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIKKyAgICBEKCJBbmRyb2lkIGVtdWxhdG9yIHZlcnNpb24gJXNcbiIsIEVNVUxBVE9SX1ZFUlNJT05fU1RSSU5HCisgICAgICAiIChidWlsZF9pZCAiIFNUUklOR0lGWShBTkRST0lEX1NES19UT09MU19CVUlMRF9OVU1CRVIpICIpIik7CisjZW5kaWYKKyAgICAvKiBJZiB0aGVyZSBpcyBhbiBBVkQgbmFtZSwgd2UncmUgZ29pbmcgdG8gZXh0cmFjdCBpdHMgdGFyZ2V0IGFyY2hpdGVjdHVyZQorICAgICAqIGJ5IGxvb2tpbmcgYXQgaXRzIGNvbmZpZy5pbmkKKyAgICAgKi8KKyAgICBpZiAoYXZkTmFtZSAhPSBOVUxMKSB7CisgICAgICAgIEQoIkZvdW5kIEFWRCBuYW1lICclcydcbiIsIGF2ZE5hbWUpOworICAgICAgICBhdmRBcmNoID0gcGF0aF9nZXRBdmRUYXJnZXRBcmNoKGF2ZE5hbWUpOworICAgICAgICBEKCJGb3VuZCBBVkQgdGFyZ2V0IGFyY2hpdGVjdHVyZTogJXNcbiIsIGF2ZEFyY2gpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE90aGVyd2lzZSwgdXNpbmcgdGhlIEFORFJPSURfUFJPRFVDVF9PVVQgZGlyZWN0b3J5ICovCisgICAgICAgIGFuZHJvaWRPdXQgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKKworICAgICAgICBpZiAoYW5kcm9pZE91dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJGb3VuZCBBTkRST0lEX1BST0RVQ1RfT1VUOiAlc1xuIiwgYW5kcm9pZE91dCk7CisgICAgICAgICAgICBhdmRBcmNoID0gcGF0aF9nZXRCdWlsZFRhcmdldEFyY2goYW5kcm9pZE91dCk7CisgICAgICAgICAgICBEKCJGb3VuZCBidWlsZCB0YXJnZXQgYXJjaGl0ZWN0dXJlOiAlc1xuIiwKKyAgICAgICAgICAgICAgYXZkQXJjaCA/IGF2ZEFyY2ggOiAiPE5VTEw+Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWF2ZE5hbWUgJiYgIWFuZHJvaWRPdXQgJiYgIWZvcmNlRW5naW5lTGF1bmNoICYmICFxdWVyeVZlcnNpb24pIHsKKyAgICAgICAgZGVycm9yKCJObyBBVkQgc3BlY2lmaWVkLiBVc2UgJ0Bmb28nIG9yICctYXZkIGZvbycgdG8gbGF1bmNoIGEgdmlydHVhbCIKKyAgICAgICAgICAgICAgICIgZGV2aWNlIG5hbWVkICdmb28nXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGNsZWFuVXBBdmRDb250ZW50KSB7CisgICAgICAgIGlmIChhdmROYW1lKSB7CisgICAgICAgICAgICBjaGFyKiBhdmRfZm9sZGVyID0gcGF0aF9nZXRBdmRDb250ZW50UGF0aChhdmROYW1lKTsKKyAgICAgICAgICAgIGlmIChhdmRfZm9sZGVyKSB7CisgICAgICAgICAgICAgICAgY2xlYW5fdXBfYXZkX2NvbnRlbnRzX2V4Y2VwdF9jb25maWdfaW5pKGF2ZF9mb2xkZXIpOworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN5c3RlbVBhdGggPSBnZXRBdmRTeXN0ZW1QYXRoKGF2ZE5hbWUpOworICAgICAgICAgICAgICAgIGlmICghc3lzdGVtUGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHlfdXNlcmRhdGFfaW1nX2Zyb21fc3lzX2ZvbGRlcihzeXN0ZW1QYXRoLmNfc3RyKCksIGF2ZF9mb2xkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKGF2ZF9mb2xkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGFuZHJvaWRPdXQpIHsKKyAgICAgICAgICAgIGNsZWFuX3VwX2FuZHJvaWRfb3V0KGFuZHJvaWRPdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2ZEFyY2ggPT0gTlVMTCkgeworICAgICAgICBhdmRBcmNoID0gIng4NiI7CisgICAgICAgIEQoIkNhbid0IGRldGVybWluZSB0YXJnZXQgQVZEIGFyY2hpdGVjdHVyZTogZGVmYXVsdGluZyB0byAlc1xuIiwgYXZkQXJjaCk7CisgICAgfQorCisgICAgLyogRmluZCBwcm9ncmFtIGRpcmVjdG9yeS4gKi8KKyAgICBjb25zdCBhdXRvIHByb2dEaXJTeXN0ZW0gPSBhbmRyb2lkOjpiYXNlOjpTeXN0ZW06OmdldCgpLT5nZXRQcm9ncmFtRGlyZWN0b3J5KCk7CisgICAgRCgiYXJndlswXTogJyVzJzsgcHJvZ3JhbSBkaXJlY3Rvcnk6ICclcydcbiIsIGFyZ3ZbMF0sIHByb2dEaXJTeXN0ZW0uY19zdHIoKSk7CisKKyAgICBlbnVtIFJhbmNodVN0YXRlIHsKKyAgICAgICAgUkFOQ0hVX0FVVE9ERVRFQ1QsCisgICAgICAgIFJBTkNIVV9PTiwKKyAgICAgICAgUkFOQ0hVX09GRiwKKyAgICB9IHJhbmNodSA9IFJBTkNIVV9BVVRPREVURUNUOworCisgICAgYm9vbCBpc1NuYXBzaG90UHJlc2VudCA9IGZhbHNlOworCisgICAgaWYgKGVuZ2luZSkgeworICAgICAgICBpZiAoIXN0cmNtcChlbmdpbmUsICJhdXRvIikpIHsKKyAgICAgICAgICAgIGlmIChpc1NuYXBzaG90UHJlc2VudCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogb25seSBjbGFzc2ljIGVuZ2luZSBzdXBwb3J0cyBzbmFwc2hvdCwgb3B0aW9uICdhdXRvJyBpZ25vcmVkLlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJhbmNodSA9IFJBTkNIVV9BVVRPREVURUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZW5naW5lLCAiY2xhc3NpYyIpKSB7CisgICAgICAgICAgICByYW5jaHUgPSBSQU5DSFVfT0ZGOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZW5naW5lLCAicWVtdTIiKSkgeworICAgICAgICAgICAgaWYgKGlzU25hcHNob3RQcmVzZW50KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBxZW11MiBkb2VzIG5vdCBzdXBwb3J0IHNuYXBzaG90LCBvcHRpb24gJ3FlbXUyJyBpZ25vcmVkLlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJhbmNodSA9IFJBTkNIVV9PTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFQQU5JQygiSW52YWxpZCAtZW5naW5lIHZhbHVlICclcycsIHBsZWFzZSB1c2Ugb25lIG9mOiBhdXRvLCBjbGFzc2ljLCBxZW11MlxuIiwKKyAgICAgICAgICAgICAgICAgICBlbmdpbmUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJhbmNodSA9PSBSQU5DSFVfQVVUT0RFVEVDVCkgeworICAgICAgICBpZiAoIWF2ZE5hbWUpIHsKKyAgICAgICAgICAgIHJhbmNodSA9IFJBTkNIVV9PTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEF1dG8tZGV0ZWN0IHdoaWNoIGVtdWxhdGlvbiBlbmdpbmUgdG8gbGF1bmNoLgorICAgICAgICAgICAgYm9vbCBjcHVIYXNSYW5jaHUgPSBpc0NwdUFyY2hTdXBwb3J0ZWRCeVJhbmNodShhdmRBcmNoKTsKKyAgICAgICAgICAgIGJvb2wgY3B1SGFzR29sZGZpc2ggPSBpc0NwdUFyY2hTdXBwb3J0ZWRCeUdvbGRmaXNoKGF2ZEFyY2gpOworCisgICAgICAgICAgICBpZiAoY3B1SGFzUmFuY2h1KSB7CisgICAgICAgICAgICAgICAgaWYgKGNwdUhhc0dvbGRmaXNoKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gYXV0by1kZXRlY3QgdGhlIGRlZmF1bHQgZW5naW5lLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBEZWFsIHdpdGggLWtlcm5lbCA8ZmlsZT4sIC1zeXN0ZW1kaXIgPGRpcj4gYW5kIHBsYXRmb3JtCisgICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkcyBhcHByb3ByaWF0ZWx5LiBGb3Igbm93IHRoaXMgb25seSB3b3JrcyByZWxpYWJseSBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVndWxhciBTREsgQVZEIGNvbmZpZ3VyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tBdmRTeXN0ZW1EaXJGb3JLZXJuZWxSYW5jaHUoYXZkTmFtZSwgYXZkQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRPdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBEKCJBdXRvLWNvbmZpZzogLWVuZ2luZSBxZW11MiAoYmFzZWQgb24gY29uZmlndXJhdGlvbilcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuY2h1ID0gUkFOQ0hVX09OOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgRCgiQXV0by1jb25maWc6IC1lbmdpbmUgY2xhc3NpYyAoYmFzZWQgb24gY29uZmlndXJhdGlvbilcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmFuY2h1ID0gUkFOQ0hVX09GRjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEQoIkF1dG8tY29uZmlnOiAtZW5naW5lIHFlbXUyICglcyBkZWZhdWx0KVxuIiwgYXZkQXJjaCk7CisgICAgICAgICAgICAgICAgICAgIHJhbmNodSA9IFJBTkNIVV9PTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNwdUhhc0dvbGRmaXNoKSB7CisgICAgICAgICAgICAgICAgRCgiQXV0by1jb25maWc6IC1lbmdpbmUgY2xhc3NpYyAoJXMgZGVmYXVsdClcbiIsIGF2ZEFyY2gpOworICAgICAgICAgICAgICAgIHJhbmNodSA9IFJBTkNIVV9PRkY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFQQU5JQygiQ1BVIGFyY2hpdGVjdHVyZSAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGF2ZEFyY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgICBpZiAoYXZkTmFtZSkgeworICAgICAgICBpZiAocmFuY2h1ID09IFJBTkNIVV9PRkYgJiYgIWlzQ3B1QXJjaFN1cHBvcnRlZEJ5R29sZGZpc2goYXZkQXJjaCkpIHsKKyAgICAgICAgICAgIEFQQU5JQygiQ1BVIEFyY2hpdGVjdHVyZSAnJXMnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNsYXNzaWMgZW11bGF0b3IiLAorICAgICAgICAgICAgICAgICAgIGF2ZEFyY2gpOworICAgICAgICB9CisgICAgICAgIGlmIChyYW5jaHUgPT0gUkFOQ0hVX09OICYmICFpc0NwdUFyY2hTdXBwb3J0ZWRCeVJhbmNodShhdmRBcmNoKSkgeworICAgICAgICAgICAgQVBBTklDKCJDUFUgQXJjaGl0ZWN0dXJlICclcycgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgUUVNVTIgZW11bGF0b3IiLAorICAgICAgICAgICAgICAgICAgIGF2ZEFyY2gpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHN5c3RlbVBhdGggPSBnZXRBdmRTeXN0ZW1QYXRoKGF2ZE5hbWUpOworICAgICAgICBpZiAoc3lzdGVtUGF0aC5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBlbnYgPSBnZXRlbnYoIkFORFJPSURfU0RLX1JPT1QiKTsKKyAgICAgICAgICAgIGlmICghZW52IHx8ICFlbnZbMF0pIHsKKyAgICAgICAgICAgICAgICBBUEFOSUMoIkNhbm5vdCBmaW5kIEFWRCBzeXN0ZW0gcGF0aC4gUGxlYXNlIGRlZmluZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJBTkRST0lEX1NES19ST09UXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVBBTklDKCJCcm9rZW4gQVZEIHN5c3RlbSBwYXRoLiBDaGVjayB5b3VyIEFORFJPSURfU0RLX1JPT1QgIgorICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUgWyVzXSFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVudik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgX1dJTjMyCisgICAgLy8gV2luZG93cyB2ZXJzaW9uIG9mIFFlbXUxIHdvcmtzIG9ubHkgaW4geDg2IG1vZGUKKyAgICBpZiAocmFuY2h1ID09IFJBTkNIVV9PRkYpIHsKKyAgICAgICAgd2FudGVkQml0bmVzcyA9IDMyOworICAgIH0KKyNlbmRpZgorCisgICAgY2hhciogY19hcmd2MF9kaXJfbmFtZSA9IHBhdGhfZGlybmFtZShhcmd2WzBdKTsKKyAgICBzdGQ6OnN0cmluZyBhcmd2MERpck5hbWUoY19hcmd2MF9kaXJfbmFtZSk7CisgICAgZnJlZShjX2FyZ3YwX2Rpcl9uYW1lKTsKKworICAgIHN0ZDo6c3RyaW5nIGVtdURpck5hbWUgPSBlbXVsYXRvcl9kaXJuYW1lKGFyZ3YwRGlyTmFtZSk7CisKKyAgICBjb25zdCBTdHJpbmdWaWV3IGNhbmRpZGF0ZXNbXSA9IHtwcm9nRGlyU3lzdGVtLCBhcmd2MERpck5hbWUsIGVtdURpck5hbWV9OworICAgIGNoYXIqIGVtdWxhdG9yUGF0aCA9IG51bGxwdHI7CisgICAgU3RyaW5nVmlldyBwcm9nRGlyOworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYW5kaWRhdGVzKTsgKytpKSB7CisgICAgICAgIEQoInRyeSBkaXIgJXNcbiIsIGNhbmRpZGF0ZXNbaV0uY19zdHIoKSk7CisgICAgICAgIHByb2dEaXIgPSBjYW5kaWRhdGVzW2ldOworICAgICAgICBpZiAocmFuY2h1ID09IFJBTkNIVV9PTikgeworICAgICAgICAgICAgZW11bGF0b3JQYXRoID0gZ2V0UWVtdUV4ZWN1dGFibGVQYXRoKHByb2dEaXIuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRlZEJpdG5lc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW11bGF0b3JQYXRoID0gZ2V0Q2xhc3NpY0VtdWxhdG9yUGF0aChwcm9nRGlyLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YW50ZWRCaXRuZXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGF0aF9leGlzdHMoZW11bGF0b3JQYXRoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgRCgiRm91bmQgdGFyZ2V0LXNwZWNpZmljICVkLWJpdCBlbXVsYXRvciBiaW5hcnk6ICVzXG4iLCB3YW50ZWRCaXRuZXNzLCBlbXVsYXRvclBhdGgpOworCisgICAgLyogUmVwbGFjZSBpdCBpbiBvdXIgY29tbWFuZC1saW5lICovCisgICAgYXJndlswXSA9IGVtdWxhdG9yUGF0aDsKKworICAgIC8qIHNldHVwIGxhdW5jaGVyIGRpciAqLworICAgIFN5c3RlbTo6Z2V0KCktPmVudlNldCgiQU5EUk9JRF9FTVVMQVRPUl9MQVVOQ0hFUl9ESVIiLCBwcm9nRGlyKTsKKworICAgIC8qIFNldHVwIGxpYnJhcnkgcGF0aHMgc28gdGhhdCBidW5kbGVkIHN0YW5kYXJkIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHBpY2tlZAorICAgICAqIHVwIGJ5IHRoZSByZS1leGVjJ2VkIGVtdWxhdG9yCisgICAgICovCisgICAgdXBkYXRlTGlicmFyeVNlYXJjaFBhdGgod2FudGVkQml0bmVzcywgdXNlU3lzdGVtTGlicywgcHJvZ0Rpci5jX3N0cigpKTsKKworICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIEdMRVMgZW11bGF0aW9uIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAgKiBhbmQgbW9kaWZ5IGVpdGhlciBMRF9MSUJSQVJZX1BBVEggb3IgUEFUSCBhY2NvcmRpbmdseQorICAgICAqLworCisgICAgLy8gRGV0ZWN0IGlmIHRoaXMgaXMgZ29vZ2xlIEFQSSdzCisgICAgYm9vbCBnb29nbGVBcGlzID0gY2hlY2tGb3JHb29nbGVBUElzKGF2ZE5hbWUpOworICAgIGludCBhcGlMZXZlbCA9IGdldEFwaUxldmVsKGF2ZE5hbWUpOworICAgIEVtdWdsQ29uZmlnIGNvbmZpZzsKKworICAgIGlmICghYW5kcm9pZEVtdWdsQ29uZmlnSW5pdCgmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlQXBpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50ZWRCaXRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1dpbmRvdykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogJXNcbiIsIGNvbmZpZy5zdGF0dXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgRCgiJXNcbiIsIGNvbmZpZy5zdGF0dXMpOworCisgICAgZW11Z2xDb25maWdfc2V0dXBFbnYoJmNvbmZpZyk7CisKKyAgICAvKiBBZGQgPGxpYj4vcXQvIHRvIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAqLworICAgIGFuZHJvaWRRdFNldHVwRW52KHdhbnRlZEJpdG5lc3MsIHByb2dEaXIuY19zdHIoKSk7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAvLyBUYWtlIGNhcmUgb2YgcXVvdGluZyBhbGwgcGFyYW1ldGVycyBiZWZvcmUgc2VuZGluZyB0aGVtIHRvIGV4ZWN2KCkuCisgICAgLy8gU2VlIHRoZSAiRXZleW9uZSBxdW90ZXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0aGUgd3Jvbmcgd2F5IiBvbgorICAgIC8vIE1TRE4uCisgICAgaW50IG47CisgICAgZm9yIChuID0gMDsgbiA8IGFyZ2M7ICsrbikgeworICAgICAgICAvLyBUZWNobmljYWxseSwgdGhpcyBsZWFrcyB0aGUgcXVvdGVkIHN0cmluZ3MsIGJ1dCB3ZSBkb24ndCBjYXJlCisgICAgICAgIC8vIHNpbmNlIHRoaXMgcHJvY2VzcyB3aWxsIHRlcm1pbmF0ZSBhZnRlciB0aGUgZXhlY3YoKSBhbnl3YXkuCisgICAgICAgIGFyZ3Zbbl0gPSB3aW4zMl9jbWRsaW5lX3F1b3RlKGFyZ3Zbbl0pOworICAgICAgICBEKCJRdW90ZWQgcGFyYW06IFslc11cbiIsIGFyZ3Zbbl0pOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGFuZHJvaWRfdmVyYm9zZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHJpbnRmKCJlbXVsYXRvcjogUnVubmluZyA6JXNcbiIsIGVtdWxhdG9yUGF0aCk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICAgICAgcHJpbnRmKCJlbXVsYXRvcjogcWVtdSBiYWNrZW5kOiBhcmd2WyUwMmRdID0gXCIlc1wiXG4iLCBpLCBhcmd2W2ldKTsKKyAgICAgICAgfQorICAgICAgICAvKiBEdW1wIGZpbmFsIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzIHRvIG1ha2UgZGVidWdnaW5nIGVhc2llciAqLworICAgICAgICBwcmludGYoImVtdWxhdG9yOiBDb25jYXRlbmF0ZWQgYmFja2VuZCBwYXJhbWV0ZXJzOlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgICAgIC8qIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcHktcGFzdGUgdGhlIG91dHB1dCB0byBhIGNvbW1hbmQtbGluZSwKKyAgICAgICAgICAgICAqIHF1b3RlIGFueXRoaW5nIHRoYXQgY29udGFpbnMgc3BhY2VzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoc3RyY2hyKGFyZ3ZbaV0sICcgJykgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiICclcyciLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBhcmd2W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisgICAgLy8gTGF1bmNoIGl0IHdpdGggdGhlIHNhbWUgc2V0IG9mIG9wdGlvbnMgIQorICAgIC8vIE5vdGUgdGhhdCBvbiBXaW5kb3dzLCB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBfbm90XyBiZSBxdW90ZWQgb3IKKyAgICAvLyBXaW5kb3dzIHdpbGwgZmFpbCB0byBmaW5kIHRoZSBwcm9ncmFtLgorICAgIHNhZmVfZXhlY3YoZW11bGF0b3JQYXRoLCBhcmd2KTsKKworICAgIC8qIFdlIGNvdWxkIG5vdCBsYXVuY2ggdGhlIHByb2dyYW0gISAqLworICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxhdW5jaCAnJXMnOiAlc1xuIiwgZW11bGF0b3JQYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBlcnJubzsKK30KKworc3RhdGljIGNoYXIqIGJ1ZnByaW50X2VtdWxhdG9yTmFtZShjaGFyKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2dEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXJjaFN1ZmZpeCkgeworICAgIGlmIChwcm9nRGlyKSB7CisgICAgICAgIHAgPSBidWZwcmludChwLCBlbmQsICIlcy8iLCBwcm9nRGlyKTsKKyAgICB9CisgICAgcCA9IGJ1ZnByaW50KHAsIGVuZCwgIiVzJXMlcyIsIHByZWZpeCwgYXJjaFN1ZmZpeCwga0V4ZUV4dGVuc2lvbik7CisgICAgcmV0dXJuIHA7Cit9CisKKy8qIFByb2JlIHRoZSBmaWxlc3lzdGVtIHRvIGNoZWNrIGlmIGFuIGVtdWxhdG9yIGV4ZWN1dGFibGUgbmFtZWQgbGlrZQorICogPHByb2dEaXI+LzxwcmVmaXg+PGFyY2g+IGV4aXN0cy4KKyAqCisgKiB8cHJvZ0RpcnwgaXMgYW4gb3B0aW9uYWwgcHJvZ3JhbSBkaXJlY3RvcnkuIElmIE5VTEwsIHRoZSBleGVjdXRhYmxlCisgKiB3aWxsIGJlIHNlYXJjaGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAqIHxhcmNoU3VmZml4fCBpcyBhbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgc3VmZml4LCBsaWtlICJhcm0iLCBvciAneDg2IgorICogfHdhbnRlZEJpdG5lc3N8IHBvaW50cyB0byBhbiBpbnRlZ2VyIGRlc2NyaWJpbmcgdGhlIHdhbnRlZCBiaXRuZXNzIG9mCisgKiB0aGUgcHJvZ3JhbS4gVGhlIGZ1bmN0aW9uIG1pZ2h0IG1vZGlmeSBpdCwgaW4gdGhlIGNhc2Ugd2hlcmUgaXQgaXMgNjQKKyAqIGJ1dCBvbmx5IDMyLWJpdCB2ZXJzaW9ucyBvZiB0aGUgZXhlY3V0YWJsZXMgYXJlIGZvdW5kIChpbiB0aGlzIGNhc2UsCisgKiB8KndhbnRlZEJpdG5lc3N8IGlzIHNldCB0byAzMikuCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBleGVjdXRhYmxlIChzdHJpbmcgbXVzdCBiZSBmcmVlZCBieQorICogdGhlIGNhbGxlcikuIE9uIGZhaWx1cmUsIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgY2hhciogcHJvYmVUYXJnZXRFbXVsYXRvclBhdGgoY29uc3QgY2hhciogcHJvZ0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhcmNoU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2FudGVkQml0bmVzcykgeworICAgIGNoYXIgcGF0aFtQQVRIX01BWF0sICpwYXRoRW5kID0gcGF0aCArIHNpemVvZihwYXRoKSwgKnA7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrRW11bGF0b3JQcmVmaXhbXSA9ICJlbXVsYXRvci0iOworICAgIHN0YXRpYyBjb25zdCBjaGFyIGtFbXVsYXRvcjY0UHJlZml4W10gPSAiZW11bGF0b3I2NC0iOworCisgICAgLy8gRmlyc3Qgc2VhcmNoIGZvciB0aGUgNjQtYml0IGVtdWxhdG9yIGJpbmFyeS4KKyAgICBpZiAoKndhbnRlZEJpdG5lc3MgPT0gNjQpIHsKKyAgICAgICAgcCA9IGJ1ZnByaW50X2VtdWxhdG9yTmFtZShwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRW11bGF0b3I2NFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoU3VmZml4KTsKKyAgICAgICAgRCgiUHJvYmluZyBwcm9ncmFtOiAlc1xuIiwgcGF0aCk7CisgICAgICAgIGlmIChwIDwgcGF0aEVuZCAmJiBwYXRoX2V4aXN0cyhwYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmR1cChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZW4gZm9yIHRoZSAzMi1iaXQgb25lLgorICAgIHAgPSBidWZwcmludF9lbXVsYXRvck5hbWUocGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VtdWxhdG9yUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoU3VmZml4KTsKKyAgICBEKCJQcm9iaW5nIHByb2dyYW06ICVzXG4iLCBwYXRoKTsKKyAgICBpZiAocCA8IHBhdGhFbmQgJiYgcGF0aF9leGlzdHMocGF0aCkpIHsKKyAgICAgICAgKndhbnRlZEJpdG5lc3MgPSAzMjsKKyAgICAgICAgcmV0dXJuIHN0cmR1cChwYXRoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gRmluZCB0aGUgcGF0aCB0byB0aGUgY2xhc3NpYyBlbXVsYXRvciBiaW5hcnkgdGhhdCBzdXBwb3J0cyBDUFUgYXJjaGl0ZWN0dXJlCisvLyB8YXZkQXJjaHwuIHxwcm9nRGlyfCBpcyB0aGUgcHJvZ3JhbSdzIGRpcmVjdG9yeS4KK3N0YXRpYyBjaGFyKiBnZXRDbGFzc2ljRW11bGF0b3JQYXRoKGNvbnN0IGNoYXIqIHByb2dEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdmRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3YW50ZWRCaXRuZXNzKSB7CisgICAgY29uc3QgY2hhciogZW11bGF0b3JTdWZmaXggPSBlbXVsYXRvcl9nZXRCYWNrZW5kU3VmZml4KGF2ZEFyY2gpOworICAgIGlmICghZW11bGF0b3JTdWZmaXgpIHsKKyAgICAgICAgQVBBTklDKCJUaGlzIGVtdWxhdG9yIGNhbm5vdCBlbXVsYXRlICVzIENQVXMhXG4iLCBhdmRBcmNoKTsKKyAgICB9CisgICAgRCgiTG9va2luZyBmb3IgZW11bGF0b3ItJXMgdG8gZW11bGF0ZSAnJXMnIENQVVxuIiwgZW11bGF0b3JTdWZmaXgsCisgICAgICBhdmRBcmNoKTsKKworICAgIGNoYXIqIHJlc3VsdCA9IHByb2JlVGFyZ2V0RW11bGF0b3JQYXRoKHByb2dEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3JTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudGVkQml0bmVzcyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgQVBBTklDKCJNaXNzaW5nIGVtdWxhdG9yIGVuZ2luZSBwcm9ncmFtIGZvciAnJXMnIENQVS5cbiIsIGF2ZEFyY2gpOworICAgIH0KKyAgICBEKCJyZXR1cm4gcmVzdWx0OiAlc1xuIiwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBDb252ZXJ0IGFuIGVtdWxhdG9yLXNwZWNpZmljIENQVSBhcmNoaXRlY3R1cmUgbmFtZSB8YXZkQXJjaHwgaW50byB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgUUVNVSBvbmUuIFJldHVybiBOVUxMIGlmIHVua25vd24uCitzdGF0aWMgY29uc3QgY2hhciogZ2V0UWVtdUFyY2goY29uc3QgY2hhciogYXZkQXJjaCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBhcmNoOworICAgICAgICBjb25zdCBjaGFyKiBxZW11QXJjaDsKKyAgICB9IGtRZW11QXJjaHNbXSA9IHsKKyAgICAgICAgeyJhcm0iLCAiYXJtZWwifSwKKyAgICAgICAgeyJhcm02NCIsICJhYXJjaDY0In0sCisgICAgICAgIHsibWlwcyIsICJtaXBzZWwifSwKKyAgICAgICAgeyJtaXBzNjQiLCAibWlwczY0ZWwifSwKKyAgICAgICAgeyJ4ODYiLCJpMzg2In0sCisgICAgICAgIHsieDg2XzY0IiwieDg2XzY0In0sCisgICAgfTsKKyAgICBzaXplX3QgbjsKKyAgICBmb3IgKG4gPSAwOyBuIDwgQVJSQVlfU0laRShrUWVtdUFyY2hzKTsgKytuKSB7CisgICAgICAgIGlmICghc3RyY21wKGF2ZEFyY2gsIGtRZW11QXJjaHNbbl0uYXJjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBrUWVtdUFyY2hzW25dLnFlbXVBcmNoOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIFFFTVUgZXhlY3V0YWJsZS4gfHByb2dEaXJ8IGlzIHRoZSBkaXJlY3RvcnkKKy8vIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgcHJvZ3JhbS4gfGF2ZEFyY2h8IGlzIHRoZSBDUFUgYXJjaGl0ZWN0dXJlIG5hbWUuCisvLyBvZiB0aGUgY3VycmVudCBwcm9ncmFtIChpLmUuIHRoZSAnZW11bGF0b3InIGxhdW5jaGVyKS4KKy8vIFJldHVybiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCitzdGF0aWMgY2hhciogZ2V0UWVtdUV4ZWN1dGFibGVQYXRoKGNvbnN0IGNoYXIqIHByb2dEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGF2ZEFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3YW50ZWRCaXRuZXNzKSB7CisvLyBUaGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIG5hbWUuCisjaWZkZWYgX19saW51eF9fCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hvc3RPc1tdID0gImxpbnV4IjsKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9fKQorICAgIHN0YXRpYyBjb25zdCBjaGFyIGtIb3N0T3NbXSA9ICJkYXJ3aW4iOworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hvc3RPc1tdID0gIndpbmRvd3MiOworI2VuZGlmCisgICAgY29uc3QgY2hhciogaG9zdEFyY2ggPSAod2FudGVkQml0bmVzcyA9PSA2NCkgPyAieDg2XzY0IiA6ICJ4ODYiOworICAgIGNvbnN0IGNoYXIqIHFlbXVBcmNoID0gZ2V0UWVtdUFyY2goYXZkQXJjaCk7CisgICAgaWYgKCFxZW11QXJjaCkgeworICAgICAgICBBUEFOSUMoIlFFTVUyIGVtdWxhdG9yIGRvZXMgbm90IHN1cHBvcnQgJXMgQ1BVIGFyY2hpdGVjdHVyZSIsIGF2ZEFyY2gpOworICAgIH0KKworICAgIGNoYXIgZnVsbFBhdGhbUEFUSF9NQVhdOworICAgIGNoYXIqIGZ1bGxQYXRoRW5kID0gZnVsbFBhdGggKyBzaXplb2YoZnVsbFBhdGgpOworICAgIGNoYXIqIHRhaWwgPSBidWZwcmludChmdWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFBhdGhFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy9xZW11LyVzLSVzL3FlbXUtc3lzdGVtLSVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9nRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrSG9zdE9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0QXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdUFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtFeGVFeHRlbnNpb24pOworICAgIGlmICh0YWlsID49IGZ1bGxQYXRoRW5kKSB7CisgICAgICAgIEFQQU5JQygiUUVNVSBleGVjdXRhYmxlIHBhdGggdG9vIGxvbmcgKGNsaXBwZWQpIFslc10uICIKKyAgICAgICAgICAgICAgICJDYW4gbm90IHVzZSBRRU1VMiBlbXVsYXRvci4gIiwgZnVsbFBhdGgpOworICAgIH0KKyAgICByZXR1cm4gc3RyZHVwKGZ1bGxQYXRoKTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlTGlicmFyeVNlYXJjaFBhdGgoaW50IHdhbnRlZEJpdG5lc3MsIGJvb2wgdXNlU3lzdGVtTGlicywgY29uc3QgY2hhciogbGF1bmNoZXJEaXIpIHsKKyAgICBjb25zdCBjaGFyKiBsaWJTdWJEaXIgPSAod2FudGVkQml0bmVzcyA9PSA2NCkgPyAibGliNjQiIDogImxpYiI7CisgICAgY2hhciBmdWxsUGF0aFtQQVRIX01BWF07CisgICAgY2hhciogdGFpbCA9IGZ1bGxQYXRoOworCisgICAgdGFpbCA9IGJ1ZnByaW50KGZ1bGxQYXRoLCBmdWxsUGF0aCArIHNpemVvZihmdWxsUGF0aCksICIlcy8lcyIsIGxhdW5jaGVyRGlyLAorICAgICAgICAgICAgICAgICAgICBsaWJTdWJEaXIpOworCisgICAgaWYgKHRhaWwgPj0gZnVsbFBhdGggKyBzaXplb2YoZnVsbFBhdGgpKSB7CisgICAgICAgIEFQQU5JQygiQ3VzdG9tIGxpYnJhcnkgcGF0aCB0b28gbG9uZyAoY2xpcHBlZCkgWyVzXS4gIgorICAgICAgICAgICAgICAgIkNhbiBub3QgdXNlIGJ1bmRsZWQgbGlicmFyaWVzLiAiLAorICAgICAgICAgICAgICAgZnVsbFBhdGgpOworICAgIH0KKworICAgIEQoIkFkZGluZyBsaWJyYXJ5IHNlYXJjaCBwYXRoOiAnJXMnXG4iLCBmdWxsUGF0aCk7CisgICAgYWRkX2xpYnJhcnlfc2VhcmNoX2RpcihmdWxsUGF0aCk7CisKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBpZiAoIXVzZVN5c3RlbUxpYnMpIHsKKyAgICAgICAgLy8gVXNlIGJ1bmRsZWQgbGlic3RkYysrCisgICAgICAgIHRhaWwgPSBidWZwcmludChmdWxsUGF0aCwgZnVsbFBhdGggKyBzaXplb2YoZnVsbFBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzLyVzL2xpYnN0ZGMrKyIsIGxhdW5jaGVyRGlyLCBsaWJTdWJEaXIpOworCisgICAgICAgIGlmICh0YWlsID49IGZ1bGxQYXRoICsgc2l6ZW9mKGZ1bGxQYXRoKSkgeworICAgICAgICAgICAgQVBBTklDKCJDdXN0b20gbGlicmFyeSBwYXRoIHRvbyBsb25nIChjbGlwcGVkKSBbJXNdLiAiCisgICAgICAgICAgICAgICAgIkNhbiBub3QgdXNlIGJ1bmRsZWQgbGlicmFyaWVzLiAiLAorICAgICAgICAgICAgICAgIGZ1bGxQYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIEQoIkFkZGluZyBsaWJyYXJ5IHNlYXJjaCBwYXRoOiAnJXMnXG4iLCBmdWxsUGF0aCk7CisgICAgICAgIGFkZF9saWJyYXJ5X3NlYXJjaF9kaXIoZnVsbFBhdGgpOworICAgIH0KKyNlbHNlICAvLyAhX19saW51eF9fCisgICAgKHZvaWQpdXNlU3lzdGVtTGliczsKKyNlbmRpZiAgLy8gIV9fbGludXhfXworfQorCisvLyBSZXR1cm4gdGhlIHN5c3RlbSBkaXJlY3RvcnkgcGF0aCBvZiBhIGdpdmVuIEFWRCBuYW1lZCB8YXZkTmFtZXwuCisvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCitzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0QXZkU3lzdGVtUGF0aChjb25zdCBjaGFyKiBhdmROYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGlmICghYXZkTmFtZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBjaGFyKiBzZGtSb290UGF0aCA9IHBhdGhfZ2V0U2RrUm9vdCgpOworICAgIGlmICghc2RrUm9vdFBhdGgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgY2hhciogc3lzdGVtUGF0aCA9IHBhdGhfZ2V0QXZkU3lzdGVtUGF0aChhdmROYW1lLCBzZGtSb290UGF0aCk7CisgICAgaWYgKHN5c3RlbVBhdGggIT0gbnVsbHB0cikgeworICAgICAgICAgcmVzdWx0ID0gc3lzdGVtUGF0aDsKKyAgICAgICAgIEFGUkVFKHN5c3RlbVBhdGgpOworICAgIH0KKyAgICBBRlJFRShzZGtSb290UGF0aCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVmVyaWZ5IGFuZCBBVkQncyBzeXN0ZW0gaW1hZ2UgZGlyZWN0b3J5IHRvIHNlZSBpZiBpdCBzdXBwb3J0cyByYW5jaHUuCitzdGF0aWMgYm9vbCBjaGVja0F2ZFN5c3RlbURpckZvcktlcm5lbFJhbmNodShjb25zdCBjaGFyKiBhdmROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYXZkQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFuZHJvaWRPdXQpIHsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIGNoYXIqIGtlcm5lbF9maWxlID0gTlVMTDsKKworICAgIC8vIEZvciBub3csIGp1c3QgY2hlY2sgdGhhdCBhIGtlcm5lbC1yYW5jaHUgZmlsZSBleGlzdHMuIEFsbCBvZmZpY2lhbAorICAgIC8vIHN5c3RlbSBpbWFnZXMgc2hvdWxkIGhhdmUgdGhhdCBpZiB0aGV5IHN1cHBvcnQgcmFuY2h1LgorICAgIGlmIChhbmRyb2lkT3V0KSB7CisgICAgICAgIC8vIFRoaXMgaXMgcnVubmluZyBpbnNpZGUgYW4gQW5kcm9pZCBwbGF0Zm9ybSBidWlsZC4KKyAgICAgICAgY29uc3QgY2hhciogYW5kcm9pZEJ1aWxkVG9wID0gZ2V0ZW52KCJBTkRST0lEX0JVSUxEX1RPUCIpOworICAgICAgICBpZiAoIWFuZHJvaWRCdWlsZFRvcCB8fCAhYW5kcm9pZEJ1aWxkVG9wWzBdKSB7CisgICAgICAgICAgICBEKCJDYW5ub3QgZmluZCBBbmRyb2lkIGJ1aWxkIHRvcCBkaXJlY3RvcnksIGFzc3VtZSBubyByYW5jaHUgIgorICAgICAgICAgICAgICAic3VwcG9ydCFcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEQoIkZvdW5kIEFORFJPSURfQlVJTERfVE9QOiAlc1xuIiwgYW5kcm9pZEJ1aWxkVG9wKTsKKyAgICAgICAgaWYgKCFwYXRoX2V4aXN0cyhhbmRyb2lkQnVpbGRUb3ApKSB7CisgICAgICAgICAgICBEKCJJbnZhbGlkIEFuZHJvaWQgYnVpbGQgdG9wOiAlc1xuIiwgYW5kcm9pZEJ1aWxkVG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhc3ByaW50Zigma2VybmVsX2ZpbGUsICIlcy9wcmVidWlsdHMvcWVtdS1rZXJuZWwvJXMvJXMiLAorICAgICAgICAgICAgICAgICBhbmRyb2lkQnVpbGRUb3AsIGF2ZEFyY2gsICJrZXJuZWwtcmFuY2h1Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIHJlZ3VsYXIgU0RLIEFWRCBsYXVuY2guCisgICAgICAgIHN0ZDo6c3RyaW5nIHN5c3RlbUltYWdlUGF0aCA9IGdldEF2ZFN5c3RlbVBhdGgoYXZkTmFtZSk7CisgICAgICAgIGlmIChzeXN0ZW1JbWFnZVBhdGguZW1wdHkoKSkgeworICAgICAgICAgICAgRCgiQ2Fubm90IGZpbmQgc3lzdGVtIGltYWdlIHBhdGguIFBsZWFzZSBkZWZpbmUgIgorICAgICAgICAgICAgICAiQU5EUk9JRF9TREtfUk9PVFxuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgYXNwcmludGYoJmtlcm5lbF9maWxlLCAiJXMvJXMiLCBzeXN0ZW1JbWFnZVBhdGguY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgImtlcm5lbC1yYW5jaHUiKTsKKyAgICB9CisgICAgcmVzdWx0ID0gcGF0aF9leGlzdHMoa2VybmVsX2ZpbGUpOworICAgIEQoIlByb2JpbmcgZm9yICVzOiBmaWxlICVzXG4iLCBrZXJuZWxfZmlsZSwgcmVzdWx0ID8gImV4aXN0cyIgOiAibWlzc2luZyIpOworCisgICAgQUZSRUUoa2VybmVsX2ZpbGUpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBnZXRBdmRCdWlsZFByb3BlcnR5KGNvbnN0IGNoYXIqIGF2ZE5hbWUsIGNvbnN0IGNoYXIqIGtleSkgeworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAvLyBSdW5uaW5nIHdpdGhvdXQgYW4gYXZkIChpbnNpZGUgYW5kcm9pZCBidWlsZCBmb2xkZXIsIGZvciBpbnN0YW5jZSkuCisgICAgaWYgKCFhdmROYW1lKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc3lzdGVtSW1hZ2VQYXRoID0gZ2V0QXZkU3lzdGVtUGF0aChhdmROYW1lKTsKKyAgICBpZiAoc3lzdGVtSW1hZ2VQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBidWlsZHByb3BfZmlsZSA9IHN0ZDo6c3RyaW5nKHN5c3RlbUltYWdlUGF0aCkgKyAiL2J1aWxkLnByb3AiOworCisgICAgc3RkOjppZnN0cmVhbSBmaWxlKGJ1aWxkcHJvcF9maWxlKTsKKyAgICBzdGQ6OnN0cmluZyB0ZW1wOworICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZmlsZSwgdGVtcCkpIHsKKyAgICAgICAgc2l6ZV90IGtleXBvcyA9IHRlbXAuZmluZChrZXkpOworICAgICAgICBpZiAoa2V5cG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBrZXlwb3MgPSB0ZW1wLmZpbmQoIj0iKTsKKyAgICAgICAgICAgIGlmIChrZXlwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAvLyBidWlsZC5wcm9wIGtleSB3aXRob3V0ID0sIGNyYXp5IQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdGVtcC5zdWJzdHIoa2V5cG9zICsgMSwgdGVtcC5sZW5ndGgoKSArIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrRm9yR29vZ2xlQVBJcyhjb25zdCBjaGFyKiBhdmROYW1lKSB7CisgICAgc3RkOjpzdHJpbmcgYXBpX3R5cGUgPSBnZXRBdmRCdWlsZFByb3BlcnR5KGF2ZE5hbWUsICJyby5wcm9kdWN0Lm5hbWUiKTsKKyAgICByZXR1cm4gKGFwaV90eXBlLmZpbmQoInNka19nb29nbGUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgfHwKKyAgICAgICAgICAgKGFwaV90eXBlLmZpbmQoImdvb2dsZV9zZGsiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0QXBpTGV2ZWwoY29uc3QgY2hhciogYXZkTmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIGFwaV9sZXZlbCA9CisgICAgICAgICAgICBnZXRBdmRCdWlsZFByb3BlcnR5KGF2ZE5hbWUsICJyby5idWlsZC52ZXJzaW9uLnNkayIpOworICAgIGlmIChhcGlfbGV2ZWwuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gZm9yIGFwaSAxMCBhcm0gc3lzdGVtIGltYWdlcywgdGhlcmUgaXMgbm8gInJvLmJ1aWxkLnZlcnNpb24uc2RrIgorICAgIC8vIHNvLCByZXR1cm4gLTE7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaShhcGlfbGV2ZWwpOworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICAgIEQoIldhcm5pbmc6IENhbm5vdCBmaW5kIHRoZSBhcGkgbGV2ZWwgZm9yIHRoaXMgQVZEOiAlc1xuIiwgZS53aGF0KCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9pbWFnZXMvZW11bGF0b3JfaWNvbi5pY28gYi9hbmRyb2lkL2ltYWdlcy9lbXVsYXRvcl9pY29uLmljbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWMxOTExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9pbWFnZXMvZW11bGF0b3JfaWNvbi5pY28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9pbWFnZXMvZW11bGF0b3JfaWNvbi5yYyBiL2FuZHJvaWQvaW1hZ2VzL2VtdWxhdG9yX2ljb24ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExNjk4MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvaW1hZ2VzL2VtdWxhdG9yX2ljb24ucmMKQEAgLTAsMCArMSwzIEBACisxIElDT04gIi4uL2ltYWdlcy9lbXVsYXRvcl9pY29uLmljbyIKKworCmRpZmYgLS1naXQgYS9hbmRyb2lkL2ltYWdlcy9lbXVsYXRvcl9pY29uXzEyOC5wbmcgYi9hbmRyb2lkL2ltYWdlcy9lbXVsYXRvcl9pY29uXzEyOC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlMGU5NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvaW1hZ2VzL2VtdWxhdG9yX2ljb25fMTI4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL2ltYWdlcy9lbXVsYXRvcl9pY29uXzI1Ni5wbmcgYi9hbmRyb2lkL2ltYWdlcy9lbXVsYXRvcl9pY29uXzI1Ni5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3ZjJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvaW1hZ2VzL2VtdWxhdG9yX2ljb25fMjU2LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL0NPUFlJTkcgYi9hbmRyb2lkL3FlbXUxL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjY2ZiYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvQ09QWUlORwpAQCAtMCwwICsxLDMzOSBAQAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGZyZWUKK3NvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuICBUaGlzCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gbW9zdCBvZiB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0bwordXNpbmcgaXQuICAoU29tZSBvdGhlciBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieQordGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKK2lmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgorVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKK2Rpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKK3lvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCitzb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCityaWdodHMuCisKKyAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKK2Rpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCisKKyAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KK3RoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCitzb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKK3dhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCit0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAorYXV0aG9ycycgcmVwdXRhdGlvbnMuCisKKyAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKK3BhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKK3Byb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKK3Byb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQorcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKwwKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCithIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAordW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAorcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCittZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgordGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKK2VpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCitsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCit0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KK2lzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgorV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCitzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKK2NvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKK2NvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKK25vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKK2FuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhlIFByb2dyYW0uCisKK1lvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoreW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55CisgICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5CisgICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAorICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKKyAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKKyAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCisgICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKKyAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAorICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKwwKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KK3dpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCit1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKK1NlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKKyAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKKyAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKKyAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQorICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKKyAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcworICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91CisgICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAorICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQorCitUaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCittYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQorY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKK2Fzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bworY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQorc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCithbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQorZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50CitpdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCisKK0lmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKK2FjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKK2FjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Citjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgorDAorICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKK290aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwordm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgorSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKK3RoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCitwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwordGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCit0aGlzIExpY2Vuc2UuCisKKyAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bworYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKK2NpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorDAorICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCittYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKK3Rob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKK2NvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwordGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKK29mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKK2xhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKK2VpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCit0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLgorCisgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKK3RvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCittYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscworb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAorb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQorRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCitPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCitQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAorT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKK1RPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKK1BST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAorUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKK0lOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORworT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAorVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCitZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgorUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitJZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcmFjdGl2ZSwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydCBub3RpY2UgbGlrZSB0aGlzCit3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgR25vbW92aXNpb24gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHRoZSBjb21tYW5kcyB5b3UgdXNlIG1heQorYmUgY2FsbGVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGBzaG93IHcnIGFuZCBgc2hvdyBjJzsgdGhleSBjb3VsZCBldmVuIGJlCittb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZSBwcm9ncmFtCisgIGBHbm9tb3Zpc2lvbicgKHdoaWNoIG1ha2VzIHBhc3NlcyBhdCBjb21waWxlcnMpIHdyaXR0ZW4gYnkgSmFtZXMgSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk4OQorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtIGludG8KK3Byb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UgbWF5Citjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aCB0aGUKK2xpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvQ09QWUlORy5MSUIgYi9hbmRyb2lkL3FlbXUxL0NPUFlJTkcuTElCCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL0NPUFlJTkcuTElCCkBAIC0wLDAgKzEsNTA0IEBACisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDIuMSwgRmVicnVhcnkgMTk5OQorCisgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCTUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKK1tUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBMZXNzZXIgR1BMLiAgSXQgYWxzbyBjb3VudHMKKyBhcyB0aGUgc3VjY2Vzc29yIG9mIHRoZSBHTlUgTGlicmFyeSBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBoZW5jZQorIHRoZSB2ZXJzaW9uIG51bWJlciAyLjEuXQorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCitmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQorZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgorCisgIFRoaXMgbGljZW5zZSwgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKK3NwZWNpYWxseSBkZXNpZ25hdGVkIHNvZnR3YXJlIHBhY2thZ2VzLS10eXBpY2FsbHkgbGlicmFyaWVzLS1vZiB0aGUKK0ZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgb3RoZXIgYXV0aG9ycyB3aG8gZGVjaWRlIHRvIHVzZSBpdC4gIFlvdQorY2FuIHVzZSBpdCB0b28sIGJ1dCB3ZSBzdWdnZXN0IHlvdSBmaXJzdCB0aGluayBjYXJlZnVsbHkgYWJvdXQgd2hldGhlcgordGhpcyBsaWNlbnNlIG9yIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIHRoZSBiZXR0ZXIKK3N0cmF0ZWd5IHRvIHVzZSBpbiBhbnkgcGFydGljdWxhciBjYXNlLCBiYXNlZCBvbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tIG9mIHVzZSwKK25vdCBwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQKK3lvdSBoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UKK2ZvciB0aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpOyB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQKK2l0IGlmIHlvdSB3YW50IGl0OyB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBhbmQgdXNlIHBpZWNlcyBvZgoraXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBhcmUgaW5mb3JtZWQgdGhhdCB5b3UgY2FuIGRvCit0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAorZGlzdHJpYnV0b3JzIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGVzZQorcmlnaHRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yCit5b3UgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5IG9yIGlmIHlvdSBtb2RpZnkgaXQuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgd2hldGhlciBncmF0aXMKK29yIGZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHdlIGdhdmUKK3lvdS4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZSBvciBjYW4gZ2V0IHRoZSBzb3VyY2UKK2NvZGUuICBJZiB5b3UgbGluayBvdGhlciBjb2RlIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKK2NvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cywgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQord2l0aCB0aGUgbGlicmFyeSBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKK2l0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgIFdlIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCBhIHR3by1zdGVwIG1ldGhvZDogKDEpIHdlIGNvcHlyaWdodCB0aGUKK2xpYnJhcnksIGFuZCAoMikgd2Ugb2ZmZXIgeW91IHRoaXMgbGljZW5zZSwgd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsCitwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgbGlicmFyeS4KKworICBUbyBwcm90ZWN0IGVhY2ggZGlzdHJpYnV0b3IsIHdlIHdhbnQgdG8gbWFrZSBpdCB2ZXJ5IGNsZWFyIHRoYXQKK3RoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgZnJlZSBsaWJyYXJ5LiAgQWxzbywgaWYgdGhlIGxpYnJhcnkgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB0aGUgcmVjaXBpZW50cyBzaG91bGQga25vdwordGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsIHZlcnNpb24sIHNvIHRoYXQgdGhlIG9yaWdpbmFsCithdXRob3IncyByZXB1dGF0aW9uIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHByb2JsZW1zIHRoYXQgbWlnaHQgYmUKK2ludHJvZHVjZWQgYnkgb3RoZXJzLgorDAorICBGaW5hbGx5LCBzb2Z0d2FyZSBwYXRlbnRzIHBvc2UgYSBjb25zdGFudCB0aHJlYXQgdG8gdGhlIGV4aXN0ZW5jZSBvZgorYW55IGZyZWUgcHJvZ3JhbS4gIFdlIHdpc2ggdG8gbWFrZSBzdXJlIHRoYXQgYSBjb21wYW55IGNhbm5vdAorZWZmZWN0aXZlbHkgcmVzdHJpY3QgdGhlIHVzZXJzIG9mIGEgZnJlZSBwcm9ncmFtIGJ5IG9idGFpbmluZyBhCityZXN0cmljdGl2ZSBsaWNlbnNlIGZyb20gYSBwYXRlbnQgaG9sZGVyLiAgVGhlcmVmb3JlLCB3ZSBpbnNpc3QgdGhhdAorYW55IHBhdGVudCBsaWNlbnNlIG9idGFpbmVkIGZvciBhIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgbXVzdCBiZQorY29uc2lzdGVudCB3aXRoIHRoZSBmdWxsIGZyZWVkb20gb2YgdXNlIHNwZWNpZmllZCBpbiB0aGlzIGxpY2Vuc2UuCisKKyAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBsaWNlbnNlLCB0aGUgR05VIExlc3NlcgorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluIGRlc2lnbmF0ZWQgbGlicmFyaWVzLCBhbmQKK2lzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgV2UgdXNlCit0aGlzIGxpY2Vuc2UgZm9yIGNlcnRhaW4gbGlicmFyaWVzIGluIG9yZGVyIHRvIHBlcm1pdCBsaW5raW5nIHRob3NlCitsaWJyYXJpZXMgaW50byBub24tZnJlZSBwcm9ncmFtcy4KKworICBXaGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCBhIGxpYnJhcnksIHdoZXRoZXIgc3RhdGljYWxseSBvciB1c2luZworYSBzaGFyZWQgbGlicmFyeSwgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gaXMgbGVnYWxseSBzcGVha2luZyBhCitjb21iaW5lZCB3b3JrLCBhIGRlcml2YXRpdmUgb2YgdGhlIG9yaWdpbmFsIGxpYnJhcnkuICBUaGUgb3JkaW5hcnkKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgdGhlcmVmb3JlIHBlcm1pdHMgc3VjaCBsaW5raW5nIG9ubHkgaWYgdGhlCitlbnRpcmUgY29tYmluYXRpb24gZml0cyBpdHMgY3JpdGVyaWEgb2YgZnJlZWRvbS4gIFRoZSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgcGVybWl0cyBtb3JlIGxheCBjcml0ZXJpYSBmb3IgbGlua2luZyBvdGhlciBjb2RlIHdpdGgKK3RoZSBsaWJyYXJ5LgorCisgIFdlIGNhbGwgdGhpcyBsaWNlbnNlIHRoZSAiTGVzc2VyIiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGJlY2F1c2UgaXQKK2RvZXMgTGVzcyB0byBwcm90ZWN0IHRoZSB1c2VyJ3MgZnJlZWRvbSB0aGFuIHRoZSBvcmRpbmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZS4gIEl0IGFsc28gcHJvdmlkZXMgb3RoZXIgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wZXJzIExlc3MKK29mIGFuIGFkdmFudGFnZSBvdmVyIGNvbXBldGluZyBub24tZnJlZSBwcm9ncmFtcy4gIFRoZXNlIGRpc2FkdmFudGFnZXMKK2FyZSB0aGUgcmVhc29uIHdlIHVzZSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbWFueQorbGlicmFyaWVzLiAgSG93ZXZlciwgdGhlIExlc3NlciBsaWNlbnNlIHByb3ZpZGVzIGFkdmFudGFnZXMgaW4gY2VydGFpbgorc3BlY2lhbCBjaXJjdW1zdGFuY2VzLgorCisgIEZvciBleGFtcGxlLCBvbiByYXJlIG9jY2FzaW9ucywgdGhlcmUgbWF5IGJlIGEgc3BlY2lhbCBuZWVkIHRvCitlbmNvdXJhZ2UgdGhlIHdpZGVzdCBwb3NzaWJsZSB1c2Ugb2YgYSBjZXJ0YWluIGxpYnJhcnksIHNvIHRoYXQgaXQgYmVjb21lcworYSBkZS1mYWN0byBzdGFuZGFyZC4gIFRvIGFjaGlldmUgdGhpcywgbm9uLWZyZWUgcHJvZ3JhbXMgbXVzdCBiZQorYWxsb3dlZCB0byB1c2UgdGhlIGxpYnJhcnkuICBBIG1vcmUgZnJlcXVlbnQgY2FzZSBpcyB0aGF0IGEgZnJlZQorbGlicmFyeSBkb2VzIHRoZSBzYW1lIGpvYiBhcyB3aWRlbHkgdXNlZCBub24tZnJlZSBsaWJyYXJpZXMuICBJbiB0aGlzCitjYXNlLCB0aGVyZSBpcyBsaXR0bGUgdG8gZ2FpbiBieSBsaW1pdGluZyB0aGUgZnJlZSBsaWJyYXJ5IHRvIGZyZWUKK3NvZnR3YXJlIG9ubHksIHNvIHdlIHVzZSB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgSW4gb3RoZXIgY2FzZXMsIHBlcm1pc3Npb24gdG8gdXNlIGEgcGFydGljdWxhciBsaWJyYXJ5IGluIG5vbi1mcmVlCitwcm9ncmFtcyBlbmFibGVzIGEgZ3JlYXRlciBudW1iZXIgb2YgcGVvcGxlIHRvIHVzZSBhIGxhcmdlIGJvZHkgb2YKK2ZyZWUgc29mdHdhcmUuICBGb3IgZXhhbXBsZSwgcGVybWlzc2lvbiB0byB1c2UgdGhlIEdOVSBDIExpYnJhcnkgaW4KK25vbi1mcmVlIHByb2dyYW1zIGVuYWJsZXMgbWFueSBtb3JlIHBlb3BsZSB0byB1c2UgdGhlIHdob2xlIEdOVQorb3BlcmF0aW5nIHN5c3RlbSwgYXMgd2VsbCBhcyBpdHMgdmFyaWFudCwgdGhlIEdOVS9MaW51eCBvcGVyYXRpbmcKK3N5c3RlbS4KKworICBBbHRob3VnaCB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgTGVzcyBwcm90ZWN0aXZlIG9mIHRoZQordXNlcnMnIGZyZWVkb20sIGl0IGRvZXMgZW5zdXJlIHRoYXQgdGhlIHVzZXIgb2YgYSBwcm9ncmFtIHRoYXQgaXMKK2xpbmtlZCB3aXRoIHRoZSBMaWJyYXJ5IGhhcyB0aGUgZnJlZWRvbSBhbmQgdGhlIHdoZXJld2l0aGFsIHRvIHJ1bgordGhhdCBwcm9ncmFtIHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgTGlicmFyeS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCisid29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQorZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBsYXR0ZXIgbXVzdAorYmUgY29tYmluZWQgd2l0aCB0aGUgbGlicmFyeSBpbiBvcmRlciB0byBydW4uCisMCisJCSAgR05VIExFU1NFUiBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgb3Igb3RoZXIKK3Byb2dyYW0gd2hpY2ggY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yCitvdGhlciBhdXRob3JpemVkIHBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCit0aGlzIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChhbHNvIGNhbGxlZCAidGhpcyBMaWNlbnNlIikuCitFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCitwcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKKyh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCisKKyAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKK3doaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCitjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQorcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAorc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcworaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKKworICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucworYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKK2ludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgorYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KKworICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQorc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAorb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgord3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcworYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCisgIAorICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKK2NvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Cit5b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgorYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKK2FsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Cit3YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQorTGlicmFyeS4KKworICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAorYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQorZmVlLgorDAorICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCitvZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCitkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKK2Fib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCisgICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKKyAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCisgICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQorICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAorICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgorICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCisgICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgorCisgICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKKyAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCisgICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKKyAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAorICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCisgICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKKworVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQoraXQuCisKK1RodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoreW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCitleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKK2NvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCisKK0luIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKK3dpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgorYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKK3RoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KK3RoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KK3RoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKK2luc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKK29yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKK3RoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KK3RoZXNlIG5vdGljZXMuCisMCisgIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKK3RoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCitzdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgorCisgIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgordGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgorCisgIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCitkZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQordW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55CitpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCittdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKK21lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKK3NvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bworZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAorY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KKworICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQorTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgorbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKK3dvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKK3RoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQorY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Citjb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQorbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCitTZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KKworICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQordGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCitkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KK1doZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCitsaW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQordGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KKworICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQorc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCitmdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0CitmaWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCit3b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQorTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKKworICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQorZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCitBbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKK3doZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KKwwKKyAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbWJpbmUgb3IKK2xpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCit3b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawordW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCitlbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KKworICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKK0xpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQordGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yaworZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKK2NvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKK2RpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKK29mIHRoZXNlIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCisgICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCisgICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKKyAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAorICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAorICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCisgICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKKyAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAorICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQorICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCisgICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCisKKyAgICBiKSBVc2UgYSBzdWl0YWJsZSBzaGFyZWQgbGlicmFyeSBtZWNoYW5pc20gZm9yIGxpbmtpbmcgd2l0aCB0aGUKKyAgICBMaWJyYXJ5LiAgQSBzdWl0YWJsZSBtZWNoYW5pc20gaXMgb25lIHRoYXQgKDEpIHVzZXMgYXQgcnVuIHRpbWUgYQorICAgIGNvcHkgb2YgdGhlIGxpYnJhcnkgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSB1c2VyJ3MgY29tcHV0ZXIgc3lzdGVtLAorICAgIHJhdGhlciB0aGFuIGNvcHlpbmcgbGlicmFyeSBmdW5jdGlvbnMgaW50byB0aGUgZXhlY3V0YWJsZSwgYW5kICgyKQorICAgIHdpbGwgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgaWYKKyAgICB0aGUgdXNlciBpbnN0YWxscyBvbmUsIGFzIGxvbmcgYXMgdGhlIG1vZGlmaWVkIHZlcnNpb24gaXMKKyAgICBpbnRlcmZhY2UtY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIHRoYXQgdGhlIHdvcmsgd2FzIG1hZGUgd2l0aC4KKworICAgIGMpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0CisgICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCisgICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQorICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KKworICAgIGQpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5CisgICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCisgICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgorCisgICAgZSkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCisgICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCisKKyAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCitMaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgorcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCit0aGUgbWF0ZXJpYWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCitjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCit3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCit0aGUgZXhlY3V0YWJsZS4KKworICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQorcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQorYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAordXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQorZGlzdHJpYnV0ZS4KKwwKKyAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKK2ZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKK2xpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgordGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCitwZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgorCisgICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKKyAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5CisgICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgICAgU2VjdGlvbnMgYWJvdmUuCisKKyAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAorICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCisgICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgorCisgIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCit0aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQorYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKK3JpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKK29yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKK3Rlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQorc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aAordGhpcyBMaWNlbnNlLgorDAorICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAoraW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKK2NvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90CitkaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91CittYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50CitsaWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5CithbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KK3RoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KK3JlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCisKK0lmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKK3BhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKK2FuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCisKK0l0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKK3BhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CitzdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCitpbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAorYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCitzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKK2V4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCit3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKK3ZlcnNpb25zIG9mIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4KK1N1Y2ggbmV3IHZlcnNpb25zIHdpbGwgYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwKK2J1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0byBhZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgTGlicmFyeQorc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kCisiYW55IGxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIExpYnJhcnkgZG9lcyBub3Qgc3BlY2lmeSBhCitsaWNlbnNlIHZlcnNpb24gbnVtYmVyLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKwwKKyAgMTQuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBMaWJyYXJ5IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlLAord3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sgZm9yIHBlcm1pc3Npb24uICBGb3Igc29mdHdhcmUgd2hpY2ggaXMKK2NvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHdyaXRlIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMgbWFrZSBleGNlcHRpb25zIGZvciB0aGlzLiAgT3VyCitkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzIG9mIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzCitvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZworYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTUuIEJFQ0FVU0UgVEhFIExJQlJBUlkgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PCitXQVJSQU5UWSBGT1IgVEhFIExJQlJBUlksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLgorRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKK09USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgTElCUkFSWSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCitLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFCitMSUJSQVJZIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBMSUJSQVJZIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRQorVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCitXUklUSU5HIFdJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWQorQU5EL09SIFJFRElTVFJJQlVURSBUSEUgTElCUkFSWSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UKK0ZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFCitMSUJSQVJZIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HCitSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQQorRkFJTFVSRSBPRiBUSEUgTElCUkFSWSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFNPRlRXQVJFKSwgRVZFTiBJRgorU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0CitldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKK3JlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCisKKyAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcworc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK2NvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQorImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCitZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgorc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKK25lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQorICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgorCisgIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAorICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCitUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQorCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvQ2hhbmdlbG9nIGIvYW5kcm9pZC9xZW11MS9DaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyZmVhYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvQ2hhbmdlbG9nCkBAIC0wLDAgKzEsNTc0IEBACit2ZXJzaW9uIDAuMTIuMDoKKworICAtIFVwZGF0ZSB0byBTZWFCSU9TIDAuNS4wCisgIC0gZTEwMDA6IGZpeCBkZXZpY2UgbGluayBzdGF0dXMgaW4gTGludXggKEFudGhvbnkgTGlndW9yaSkKKyAgLSBtb25pdG9yOiBmaXggUU1QIGZvciBiYWxsb29uIGNvbW1hbmQgKEx1aXogQ2FwaXR1bGlubykKKyAgLSBRTVA6IFJldHVybiBhbiBlbXB0eSBkaWN0IGJ5IGRlZmF1bHQgKEx1aXogQ2FwaXR1bGlubykKKyAgLSBRTVA6IE9ubHkgaGFuZGxlIGNvbnZlcnRlZCBjb21tYW5kcyAoTHVpeiBDYXBpdHVsaW5vKQorICAtIHBjaTogc3VwcG9ydCBQQ0kgYmFzZWQgb3B0aW9uIHJvbSBsb2FkaW5nIChHZXJkIEhvZmZtYW4vQW50aG9ueSBMaWd1b3JpKQorICAtIEZpeCBiYWNrY29tcGF0IGZvciBob3RwbHVnIG9mIFNDU0kgY29udHJvbGxlcnMgKERhbmllbCBQLiBCZXJyYW5nZSkKKyAgLSBmZGM6IGZpeCBtaWdyYXRpb24gZnJvbSAwLjExIChKdWFuIFF1aW50ZWxhKQorICAtIHZtd2FyZS12Z2E6IGZpeCBzZWd2IG9uIGN1cnNvciByZXNpemUuIChEYXZlIEFpcmxpZSkKKyAgLSB2bXdhcmUtdmdhOiB2YXJpb3VzIGZpeGVzIChEYXZlIEFpcmxpZS9BbnRob255IExpZ3VvcmkpCisgIC0gcWRldjogaW1wcm92ZSBwcm9wZXJ0eSBlcnJvciByZXBvcnRpbmcuIChHZXJkIEhvZmZtYW5uKQorICAtIGZpeCB2Z2EgbmFtZXMgaW4gZGVmYXVsdF9saXN0IChHZXJkIEhvZmZtYW5uKQorICAtIHVzYi1ob3N0OiBjaGVjayBtb24gYmVmb3JlIHVzaW5nIGl0LiAoR2VyZCBIb2ZmbWFubikKKyAgLSB1c2ItbmV0OiB1c2UgcWRldiBmb3IgLXVzYmRldmljZSAoR2VyZCBIb2ZmbWFubikKKyAgLSBtb25pdG9yOiBDYXRjaCBwcmludGluZyB0byBub24tZXhpc3RlbnQgbW9uaXRvciAoTHVpeiBDYXBpdHVsaW5vKQorICAtIEF2b2lkIHBlcm1hbmVudGx5IGRpc2FibGVkIFFFTVUgbW9uaXRvciB3aGVuIFVOSVggbWlncmF0aW9uIGZhaWxzIChEYW5pZWwgUC4gQmVycmFuZ2UpCisgIC0gRml4IGxvYWRpbmcgb2YgRUxGIG11bHRpYm9vdCBrZXJuZWxzIChLZXZpbiBXb2xmKQorICAtIHFlbXUtaW86IEZpeCBtZW1vcnkgbGVhayAoS2V2aW4gV29sZikKKyAgLSBGaXggdGhpbmtvIGluIGxpbnV4Ym9vdC5TIChQYW9sbyBCb256aW5pKQorICAtIHRhcmdldC1pMzg2OiBGaXggZXZhbHVhdGlvbiBvZiBEUjcgcmVnaXN0ZXIgKEphbiBLaXN6a2EpCisgIC0gdm5jOiBoZXh0aWxlOiBkbyBub3QgZ2VuZXJhdGUgRm9yZWdyb3VuZFNwZWNpZmllZCBhbmQgU3VicmVjdHNDb2xvdXJlZCB0aWxlcyAoQW50aG9ueSBMaWd1b3JpKQorICAtIFMzOTA6IEJhaWwgb3V0IHdpdGhvdXQgS1ZNIChBbGV4YW5kZXIgR3JhZikKKyAgLSBTMzkwOiBEb24ndCB0ZWxsIGd1ZXN0IHdlJ3JlIHVwZGF0aW5nIGNvbmZpZyBzcGFjZSAoQWxleGFuZGVyIEdyYWYpCisgIC0gdGFyZ2V0LXMzOTA6IEZhaWwgb24gdW5rbm93biBpbnN0cnVjdGlvbnMgKEFsZXhhbmRlciBHcmFmKQorICAtIG9zZGVwOiBGaXggcnVudGltZSBmYWlsdXJlIG9uIG9sZGVyIExpbnV4IGtlcm5lbHMgKEFuZHJlIFByenl3YXJhKQorICAtIEZpeCBhIG1ha2UgLWogcmFjZSAoSnVlcmdlbiBMb2NrKQorICAtIHRhcmdldC1hbHBoYTogRml4IGdlbmVyaWMgY3R6NjQuIChSaWNoYXJkIEhlbmRlcnNvbikKKyAgLSBzMzkwOiBGaXggYnVnZ3kgYXNzaWdubWVudCAoU3RlZmFuIFdlaWwpCisgIC0gdGFyZ2V0LW1pcHM6IGZpeCB1c2VyLW1vZGUgZW11bGF0aW9uIHN0YXJ0dXAgKE5hdGhhbiBGcm95ZCkKKyAgLSB0YXJnZXQtaTM4NjogVXBkYXRlIENQVUlEIGZlYXR1cmUgc2V0IGZvciBUQ0cgKEFuZHJlIFByenl3YXJhKQorICAtIHMzOTA6IGZpeCBidWlsZCBvbiAzMiBiaXQgaG9zdCAoTWljaGFlbCBTLiBUc2lya2luKQorCQordmVyc2lvbiAwLjEyLjAtcmMyOgorCisgIC0gdjI6IHByb3Blcmx5IHNhdmUga3ZtIHN5c3RlbSB0aW1lIG1zciByZWdpc3RlcnMgKEdsYXViZXIgQ29zdGEpCisgIC0gY29udmVydCBtb3JlIG1vbml0b3IgY29tbWFuZHMgdG8gcW1wIChMdWl6IENhcGl0dWxpbm8pCisgIC0gdm5jOiBmaXggY2Fwc2xvY2sgdHJhY2tpbmcgbG9naWMuIChHZXJkIEhvZmZtYW5uKQorICAtIFFlbXVPcHRzOiBhbGxvdyBsYXJnZXIgb3B0aW9uIHZhbHVlcy4gKEdlcmQgSG9mZm1hbm4pCisgIC0gc2NzaTogZml4IGRyaXZlIGhvdHBsdWcuIChHZXJkIEhvZmZtYW5uKQorICAtIHBjaTogZG9uJ3QgaHdfZXJyb3IoKSB3aGVuIG5vIHNsb3QgaXMgYXZhaWxhYmxlLiAoR2VyZCBIb2ZmbWFubikKKyAgLSBwY2k6IGRvbid0IGFib3J0KCkgd2hlbiB0cnlpbmcgdG8gaG90cGx1ZyB3aXRoIGFjcGkgb2ZmLiAoR2VyZCBIb2ZmbWFubikKKyAgLSBhbGxvdyBkZWZhdWx0IGRldmljZXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gY29uZmlnIGZpbGUgKEdlcmQgSG9mZm1hbikKKyAgLSB2YzogY29sb3JpemUgY2hhcmRldiB0aXRsZSBsaW5lIHdpdGggYmx1ZSBiYWNrZ3JvdW5kLiAoR2VyZCBIb2ZmbWFubikKKyAgLSBjaGFyZGV2OiBtYWtlIGNoYXJkZXZzIHNwZWNpZmllZCBpbiBjb25maWcgZmlsZSB3b3JrLiAoR2VyZCBIb2ZmbWFubikKKyAgLSBxZGV2OiBhbHNvIG1hdGNoIGJ1cyBuYW1lIGZvciBnbG9iYWwgcHJvcGVydGllcyAoR2VyZCBIb2ZmbWFubikKKyAgLSBxZGV2OiBhZGQgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBzZXQgZ2xvYmFsIGRlZmF1bHRzIGZvciBwcm9wZXJ0aWVzLiAoR2VyZCBIb2ZmbWFubikKKyAgLSBrdm06IHg4NjogU2F2ZS9yZXN0b3JlIGV4Y2VwdGlvbl9pbmRleCAoSmFuIEtpc3prYSkKKyAgLSBxZGV2OiBSZXBsYWNlIGRldmljZSBuYW1lcyBjb250YWluaW5nIHdoaXRlc3BhY2UgKE1hcmt1cyBBcm1icnVzdGVyKQorICAtIGZpeCBydGMtdGQtaGFjayBvbiBob3N0IHdpdGhvdXQgaGlnaC1yZXMgdGltZXJzIChHbGViIE5hdGFwb3YpCisgIC0gdmlydGlvOiB2ZXJpZnkgZmVhdHVyZXMgb24gbG9hZCAoTWljaGFlbCBTLiBUc2lya2luKQorICAtIHZtd2FyZV92Z2E6IGFkZCByb20gZmlsZSBzbyB0aGF0IGl0IGJvb3RzLiAoRGF2ZSBBaXJsaWUpCisgIC0gRG8gbm90IGFib3J0IG9uIHFlbXVfbWFsbG9jKDApIGluIHByb2R1Y3Rpb24gYnVpbGRzIChBbnRob255IExpZ3VvcmkpCisgIC0gRml4IEFSTSB1c2Vyc3BhY2Ugc3RyZXggaW1wbGVtZW50YXRpb24uIChQYXVsIEJyb29rKQorICAtIHFlbXU6IGRlbGV0ZSBydWxlIHRhcmdldCBvbiBlcnJvciAoTWljaGFlbCBTLiBUc2lya2luKQorICAtIFFNUDogYWRkIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHRvIGVycm9yIHJlc3BvbnNlIChNYXJrdXMgQXJtYnJ1c3RlcikKKyAgLSBjb252ZXJ0IG1vcmUgbW9uaXRvciBjb21tYW5kcyB0byBRRXJyb3IgKE1hcmt1cyBBcm1icnVzdGVyKQorICAtIG1vbml0b3I6IEZpeCBkb3VibGUtcHJvbXB0IGFmdGVyICJjaGFuZ2Ugdm5jIHBhc3N3ZCBCTEEiIChNYXJrdXMgQXJtYnJ1c3RlcikKKyAgLSBtb25pdG9yOiBkb19jb250KCk6IERvbid0IGFzayBmb3IgcGFzc3dvcmRzIChMdWl6IENhcGl0dWxpbm8pCisgIC0gbW9uaXRvcjogSW50cm9kdWNlICdibG9ja19wYXNzd2QnIGNvbW1hbmQgKEx1aXogQ2FwaXR1bGlubykKKyAgLSBwY2k6IGludGVycnVwdCBkaXNhYmxlIGJpdCBzdXBwb3J0IChNaWNoYWVsIFMuIFRzaXJraW4pCisgIC0gcGNpOiBpbnRlcnJ1cHQgc3RhdHVzIGJpdCBpbXBsZW1lbnRhdGlvbiAoTWljaGFlbCBTLiBUc2lya2luKQorICAtIHBjaTogcHJlcGFyZSBpcnEgY29kZSBmb3IgaW50ZXJydXB0IHN0YXRlIChNaWNoYWVsIFMuIFRzaXJraW4pCisgIC0gbXNpeDogZnVuY3Rpb24gbWFzayBzdXBwb3J0IChNaWNoYWVsIFMuIFRzaXJraW4pCisgIC0gbXNpeDogbWFjcm8gcmVuYW1lIGZvciBmdW5jdGlvbiBtYXNrIHN1cHBvcnQgKE1pY2hhZWwgUy4gVHNpcmtpbikKKyAgLSBjcHVpZDogRml4IG11bHRpY29yZSBzZXR1cCBvbiBJbnRlbCAoQW5kcmUgUHJ6eXdhcmEpCisgIC0ga3ZtOiB4ODY6IEZpeCBpbml0aWFsIGt2bV9oYXNfbXNyX3N0YXIgKEphbiBLaXN6a2EpCisgIC0gVXBkYXRlIE9wZW5CSU9TIGltYWdlcyB0byByNjQwIChBdXJlbGllbiBKYXJubykJCisKK3ZlcnNpb24gMC4xMC4yOgorCisgIC0gZml4IHNhdmV2bS9sb2Fkdm0gKEFudGhvbnkgTGlndW9yaSkKKyAgLSBsaXZlIG1pZ3JhdGlvbjogZml4IGRpcnR5IHRyYWNraW5nIHdpbmRvd3MgKEdsYXViZXIgQ29zdGEpCisgIC0gbGl2ZSBtaWdyYXRpb246IGltcHJvdmUgZXJyb3IgcHJvcG9nYXRpb24gKEdsYXViZXIgQ29zdGEpCisgIC0gcWNvdzI6IGZpeCBpbWFnZSBjcmVhdGlvbiBmb3IgPiB+MlRCIGltYWdlcyAoQ2hyaXMgV3JpZ2h0KQorICAtIGhvdHBsdWc6IGZpeCBlcnJvciBoYW5kbGluZyBmb3IgaWY9IHBhcmFtZXRlciAoRWR1YXJkbyBIYWJrb3N0KQorICAtIHFjb3cyOiBmaXggZGF0YSBjb3JydXB0aW9uIChOb2xhbiBMZWFrZSkKKyAgLSB2aXJ0aW86IGZpeCBndWVzdCBvb3BzIHdpdGggMi42LjI1IGtlcm5lbHMgKFJ1c3R5IFJ1c3NlbGwpCisgIC0gU0g0OiBhZGQgc3VwcG9ydCBmb3IgLWtlcm5lbCAoVGFrYXNoaSBZb3NoaWksIEF1cmVsaWVuIEphcm5vKQorICAtIGhvdHBsdWc6IGZpeCBjbG9zaW5nIG9mIGNoYXIgZGV2aWNlcyAoSmFuIEtpc3prYSkKKyAgLSBob3RwbHVnOiByZW1vdmUgaW5jb3JyZWN0IGNoZWNrIGZvciBkZXZpY2UgbmFtZSAoRWR1YXJkbyBIYWJrb3N0KQorICAtIGVuYWJsZSAtayBvbiB3aW4zMiAoSGVydmUgUG91c3NpbmVhdSkKKyAgLSBjb25maWd1cmU6IHVzZSBMQU5HPUMgZm9yIGdyZXAgKEFuZHJlYXMgRmFlcmJlcikKKyAgLSBmaXggVkdBIHJlZ3Jlc3Npb24gKG1hbGMpCisJCit2ZXJzaW9uIDAuMTAuMToKKworICAtIHZpcnRpby1uZXQ6IGNoZWNrIHJpZ2h0IHJldHVybiBzaXplIG9uIHNnIGxpc3QgKEFsZXggV2lsbGlhbXNvbikKKyAgLSBNYWtlIHFlbXVfYW5ub3VuY2Vfc2VsZiBoYW5kbGUgaG9sZXMgKGxpdmUgbWlncmF0aW9uIGFmdGVyIGhvdHBsdWcpCisgICAgKE1hcmNlbG8gVG9zYXR0aSkKKyAgLSBSZXZlcnQgcjY4MDQtcjY4MDggKHFjb3cyIGFsbG9jYXRpb24gaW5mbykuICBUaGlzIHNlcmllcyBvZiBjaGFuZ2VzIGFkZGVkCisgICAgYSBoaWdoIGNvc3QgdG8gc3RhcnR1cCBmb3IgbGFyZ2UgcWNvdzIgaW1hZ2VzIChBbnRob255IExpZ3VvcmkpCisgIC0gcWVtdS1pbWc6IGZpeCBoZWxwIG1lc3NhZ2UgKEF1cmVsaWVuIEphcm5vKQorICAtIEZpeCBidWlsZCBmb3Igbm9uLWRlZmF1bHQgaW5zdGFsbHMgb2YgU0RMIChBbnRob255IExpZ3VvcmkpCisgIC0gRml4IHJhY2UgY29uZGl0aW9uIGluIGVudi0+aW50ZXJydXB0X3JlcXVlc3QuICBXaGVuIHVzaW5nIFRDRyBhbmQgYSBkeW50aWNrcworICAgIGhvc3QgdGltZXIsIHRoaXMgY29uZGl0aW9uIGNvdWxkIGNhdXNlIFRDRyB0byBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUKKyAgICBsb29wIChBdXJlbGllbiBKYXJubykKKyAgLSBGaXggcmVhZGluZyBlbmNyeXB0ZWQgaGFyZCBkaXNrIHBhc3N3b3JkcyBkdXJpbmcgZWFybHkgc3RhcnR1cCAoSmFuIEtpc3prYSkKKyAgLSBGaXggZW5jcnlwdGVkIGRpc2sgcmVwb3J0aW5nIGluICdpbmZvIGJsb2NrJyAoSmFuIEtpc3prYSkKKyAgLSBGaXggY29uc29sZSBzaXplIHdpdGggdGlueSBkaXNwbGF5cyAoTXVzaWNQYWwpIChKYW4gS2lzemthKQorICAtIEltcHJvdmUgZXJyb3IgaGFuZGxpbmcgaW4gYmRydl9vcGVuMiAoSmFuIEtpc3prYSkKKyAgLSBBdm9pZCBsZWFraW5nIGRhdGEgaW4gbXV4J2VkIGNoYXJhY3RlciBkZXZpY2VzIChKYW4gS2lzemthKQorICAtIEZpeCBpbml0aWFsIGNoYXJhY3RlciBkZXZpY2UgcmVzZXQgKG5vIGJhbm5lciBpbiBtb25pdG9yKSAoSmFuIEtpc3prYSkKKyAgLSBGaXggY3B1aWQgS1ZNIGNyYXNoIG9uIGkzODYgaG9zdCAoTHVib21pciBSaW50ZWwpCisgIC0gRml4IFNMRVMxMHNwMiBpbnN0YWxsYXRpb24gYnkgYWRkaW5nIElTVEFUMSByZWdpc3RlciB0byBMU0kgU0NTSSBlbXVsYXRpb24KKyAgICAoUnlhbiBIYXJwZXIpCisKK3ZlcnNpb24gMC4xMC4wOgorCisgIC0gVENHIHN1cHBvcnQgKE5vIGxvbmdlciByZXF1aXJlcyBHQ0MgMy54KQorICAtIEtlcm5lbCBWaXJ0dWFsIE1hY2hpbmUgYWNjZWxlcmF0aW9uIHN1cHBvcnQKKyAgLSBCU0QgdXNlcnNwYWNlIGVtdWxhdGlvbgorICAtIEJsdWV0b290aCBlbXVsYXRpb24gYW5kIGhvc3QgcGFzc3Rocm91Z2ggc3VwcG9ydAorICAtIEdEQiBYTUwgcmVnaXN0ZXIgZGVzY3JpcHRpb24gc3VwcG9ydAorICAtIEludGVsIGUxMDAwIGVtdWxhdGlvbgorICAtIEhQRVQgZW11bGF0aW9uCisgIC0gVmlydElPIHBhcmF2aXJ0dWFsIGRldmljZSBzdXBwb3J0CisgIC0gTWFydmVsbCA4OHc4NjE4IC8gTXVzaWNQYWwgZW11bGF0aW9uCisgIC0gTm9raWEgTi1zZXJpZXMgdGFibGV0IGVtdWxhdGlvbiAvIE9NQVAyIHByb2Nlc3NvciBlbXVsYXRpb24KKyAgLSBQQ0kgaG90cGx1ZyBzdXBwb3J0CisgIC0gTGl2ZSBtaWdyYXRpb24gYW5kIG5ldyBzYXZlL3Jlc3RvcmUgZm9ybWF0cworICAtIEN1cnNlcyBkaXNwbGF5IHN1cHBvcnQKKyAgLSBxZW11LW5iZCB1dGlsaXR5IHRvIG1vdW50IHN1cHBvcnRlZCBibG9jayBmb3JtYXRzCisgIC0gQWx0aXZlYyBzdXBwb3J0IGluIFBQQyBlbXVsYXRpb24gYW5kIG5ldyBmaXJtd2FyZSAoT3BlbkJJT1MpCisgIC0gTXVsdGlwbGUgVk5DIGNsaWVudHMgYXJlIG5vdyBzdXBwb3J0ZWQKKyAgLSBUTFMgZW5jcnlwdGlvbiBpcyBub3cgc3VwcG9ydGVkIGluIFZOQworICAtIE1JUFMgTWFnbnVtIFI0MDAwIG1hY2hpbmUgKEhlcnbDqSBQb3Vzc2luZWF1KQorICAtIEJyYWlsbGUgc3VwcG9ydCAoU2FtdWVsIFRoaWJhdWx0KQorICAtIEZyZWVjb20gTXVzaWNQYWwgc3lzdGVtIGVtdWxhdGlvbiAoSmFuIEtpc3prYSkKKyAgLSBPTUFQMjQyeCBhbmQgTm9raWEgTjgwMCwgTjgxMCBtYWNoaW5lcyAoQW5kcnplaiBaYWJvcm93c2tpKQorICAtIEVzb3VuRCBhdWRpbyBkcml2ZXIgKEZyZWRlcmljayBSZWV2ZSkKKyAgLSBHcmF2aXMgVWx0cmFzb3VuZCBHRjEgc291bmQgY2FyZCAoVGlib3IgIlRTIiBTY2jDvHR6KQorICAtIE1hbnksIG1hbnksIGJ1ZyBmaXhlcyBhbmQgbmV3IGZlYXR1cmVzCisKK3ZlcnNpb24gMC45LjE6CisKKyAgLSBURlRQIGJvb3RpbmcgZnJvbSBob3N0IGRpcmVjdG9yeSAoQW50aG9ueSBMaWd1b3JpLCBFcndhbiBWZWx1KQorICAtIFRhcCBkZXZpY2UgZW11bGF0aW9uIGZvciBTb2xhcmlzIChTaXR0aWNoYWkgUGFsYW5pc29uZykKKyAgLSBNb25pdG9yIG11bHRpcGxleGluZyB0byBzZXZlcmFsIEkvTyBjaGFubmVscyAoSmFzb24gV2Vzc2VsKQorICAtIGRzMTIyNXkgbnZyYW0gc3VwcG9ydCAoSGVydmUgUG91c3NpbmVhdSkKKyAgLSBDUFUgbW9kZWwgc2VsZWN0aW9uIHN1cHBvcnQgKEouIE1heWVyLCBQYXVsIEJyb29rLCBIZXJ2ZSBQb3Vzc2luZWF1KQorICAtIFNldmVyYWwgU3BhcmMgZml4ZXMgKEF1cmVsaWVuIEphcm5vLCBCbHVlIFN3aXJsLCBSb2JlcnQgUmVpZikKKyAgLSBNSVBTIDY0LWJpdCBGUFUgc3VwcG9ydCAoVGhpZW1vIFNldWZlcikKKyAgLSBYc2NhbGUgUERBIGVtdWxhdGlvbiAoQW5kcnplaiBaYWJvcm93c2tpKQorICAtIENvbGRGaXJlIHN5c3RlbSBlbXVsYXRpb24gKFBhdWwgQnJvb2spCisgIC0gSW1wcm92ZWQgU0g0IHN1cHBvcnQgKE1hZ251cyBEYW1tKQorICAtIE1JUFM2NCBzdXBwb3J0IChBdXJlbGllbiBKYXJubywgVGhpZW1vIFNldWZlcikKKyAgLSBQcmVsaW1pbmFyeSBBbHBoYSBndWVzdCBzdXBwb3J0IChKLiBNYXllcikKKyAgLSBSZWFkLW9ubHkgc3VwcG9ydCBmb3IgUGFyYWxsZWxzIGRpc2sgaW1hZ2VzIChBbGV4IEJlcmVnc3phc3ppKQorICAtIFNWTSAoeDg2IHZpcnR1YWxpemF0aW9uKSBzdXBwb3J0IChBbGV4YW5kZXIgR3JhZikKKyAgLSBDUklTIGVtdWxhdGlvbiAoRWRnYXIgRS4gSWdsZXNpYXMpCisgIC0gU1BBUkMzMlBMVVMgZXhlY3V0aW9uIHN1cHBvcnQgKEJsdWUgU3dpcmwpCisgIC0gTUlQUyBtaXBzc2ltIHBzZXVkbyBtYWNoaW5lIChUaGllbW8gU2V1ZmVyKQorICAtIFN0cmFjZSBmb3IgTGludXggdXNlcmxhbmQgZW11bGF0aW9uIChTdHVhcnQgQW5kZXJzb24sIFRoYXluZSBIYXJiYXVnaCkKKyAgLSBPTUFQMzEwIE1QVSBlbXVsYXRpb24gcGx1cyBQYWxtIFR8RSBtYWNoaW5lIChBbmRyemVqIFphYm9yb3dza2kpCisgIC0gQVJNIHY2LCB2NywgTkVPTiBTSU1EIGFuZCBTTVAgZW11bGF0aW9uIChQYXVsIEJyb29rL0NvZGVTb3VyY2VyeSkKKyAgLSBHdW1zdGl4IGJvYXJkczogY29ubmV4IGFuZCB2ZXJkZXggZW11bGF0aW9uIChUaG9yc3RlbiBaaXR0ZXJlbGwpCisgIC0gSW50ZWwgbWFpbnN0b25lIElJIGJvYXJkIGVtdWxhdGlvbiAoQXJtaW4gS3VzdGVyKQorICAtIFZNd2FyZSBTVkdBIElJIGdyYXBoaWNzIGNhcmQgc3VwcG9ydCAoQW5kcnplaiBaYWJvcm93c2tpKQorCit2ZXJzaW9uIDAuOS4wOgorCisgIC0gU3VwcG9ydCBmb3IgcmVsYXRpdmUgcGF0aHMgaW4gYmFja2luZyBmaWxlcyBmb3IgZGlzayBpbWFnZXMKKyAgLSBBc3luYyBmaWxlIEkvTyBBUEkKKyAgLSBOZXcgcWNvdzIgZGlzayBpbWFnZSBmb3JtYXQKKyAgLSBTdXBwb3J0IG9mIG11bHRpcGxlIFZNIHNuYXBzaG90cworICAtIExpbnV4OiBzcGVjaWZpYyBob3N0IENEUk9NIGFuZCBmbG9wcHkgc3VwcG9ydAorICAtIFNNTSBzdXBwb3J0CisgIC0gTW92ZWQgUENJIGluaXQsIE1QIHRhYmxlIGluaXQgYW5kIEFDUEkgdGFibGUgaW5pdCB0byBCb2NocyBCSU9TCisgIC0gU3VwcG9ydCBmb3IgTUlQUzMyIFJlbGVhc2UgMiBpbnN0cnVjdGlvbiBzZXQgKFRoaWVtbyBTZXVmZXIpCisgIC0gTUlQUyBNYWx0YSBzeXN0ZW0gZW11bGF0aW9uIChBdXJlbGllbiBKYXJubywgU3RlZmFuIFdlaWwpCisgIC0gRGFyd2luIHVzZXJzcGFjZSBlbXVsYXRpb24gKFBpZXJyZSBkJ0hlcmJlbW9udCkKKyAgLSBtNjhrIHVzZXIgc3VwcG9ydCAoUGF1bCBCcm9vaykKKyAgLSBzZXZlcmFsIHg4NiBhbmQgeDg2XzY0IGVtdWxhdGlvbiBmaXhlcworICAtIE1vdXNlIHJlbGF0aXZlIG9mZnNldCBWTkMgZXh0ZW5zaW9uIChBbnRob255IExpZ3VvcmkpCisgIC0gUFhFIGJvb3Qgc3VwcG9ydCAoQW50aG9ueSBMaWd1b3JpKQorICAtICctZGFlbW9uaXplJyBvcHRpb24gKEFudGhvbnkgTGlndW9yaSkKKwordmVyc2lvbiAwLjguMjoKKworICAtIEFDUEkgc3VwcG9ydAorICAtIFBDIFZHQSBCSU9TIGZpeGVzCisgIC0gc3dpdGNoIHRvIE9wZW5CaW9zIGZvciBTUEFSQyB0YXJnZXRzIChCbHVlIFN3aXJsKQorICAtIFZOQyBzZXJ2ZXIgZml4ZXMKKyAgLSBNSVBTIEZQVSBzdXBwb3J0IChNYXJpdXMgR3JvZWdlcikKKyAgLSBTb2xhcmlzL1NQQVJDIGhvc3Qgc3VwcG9ydCAoSnVlcmdlbiBLZWlsKQorICAtIFBQQyBicmVha3BvaW50cyBhbmQgc2luZ2xlIHN0ZXBwaW5nIChKYXNvbiBXZXNzZWwpCisgIC0gVVNCIHVwZGF0ZXMgKFBhdWwgQnJvb2spCisgIC0gVURQL1RDUC90ZWxuZXQgY2hhcmFjdGVyIGRldmljZXMgKEphc29uIFdlc3NlbCkKKyAgLSBXaW5kb3dzIHNwYXJzZSBmaWxlIHN1cHBvcnQgKEZyZWRpYW5vIFppZ2xpbykKKyAgLSBSVEw4MTM5IE5JQyBUQ1Agc2VnbWVudGF0aW9uIG9mZmxvYWRpbmcgKElnb3IgS292YWxlbmtvKQorICAtIFBDTkVUIE5JQyBzdXBwb3J0IChBbnRvbnkgVCBDdXJ0aXMpCisgIC0gU3VwcG9ydCBmb3IgdmFyaWFibGUgZnJlcXVlbmN5IGhvc3QgQ1BVcworICAtIFdvcmthcm91bmQgZm9yIHdpbjMyIFNNUCBob3N0cworICAtIFN1cHBvcnQgZm9yIEFNRCBGbGFzaCBtZW1vcmllcyAoSm9jZWx5biBNYXllcikKKyAgLSBBdWRpbyBjYXB0dXJlIHRvIFdBViBmaWxlcyBzdXBwb3J0IChtYWxjKQorCit2ZXJzaW9uIDAuOC4xOgorCisgIC0gVVNCIHRhYmxldCBzdXBwb3J0IChCcmFkIENhbXBiZWxsLCBBbnRob255IExpZ3VvcmkpCisgIC0gd2luMzIgaG9zdCBzZXJpYWwgc3VwcG9ydCAoS2F6dSkKKyAgLSBQQyBzcGVha2VyIHN1cHBvcnQgKEpvYWNoaW0gSGVua2UpCisgIC0gSURFIExCQTQ4IHN1cHBvcnQgKEplbnMgQXhib2UpCisgIC0gU1NFMyBzdXBwb3J0CisgIC0gU29sYXJpcyBwb3J0IChKdWVyZ2VuIEtlaWwpCisgIC0gUHJlbGltaW5hcnkgU0g0IHRhcmdldCAoU2FtdWVsIFRhcmRpZXUpCisgIC0gVk5DIHNlcnZlciAoQW50aG9ueSBMaWd1b3JpKQorICAtIHNsaXJwIGZpeGVzIChFZCBTd2llcmsgZXQgYWwuKQorICAtIFVTQiBmaXhlcworICAtIEFSTSBWZXJzYXRpbGUgUGxhdGZvcm0gQmFzZWJvYXJkIGVtdWxhdGlvbiAoUGF1bCBCcm9vaykKKwordmVyc2lvbiAwLjguMDoKKworICAtIEFSTSBzeXN0ZW0gZW11bGF0aW9uOiBBcm0gSW50ZWdyYXRvci9DUCBib2FyZCB3aXRoIGFuIGFybTEwMjZlai1zCisgICAgY3B1IChQYXVsIEJyb29rKQorICAtIFNNUCBzdXBwb3J0CisgIC0gTWFjIE9TIFggY29jb2EgaW1wcm92ZW1lbnRzIChNaWtlIEtyb25lbmJlcmcpCisgIC0gTWFjIE9TIFggQ29yZUF1ZGlvIGRyaXZlciAoTWlrZSBLcm9uZW5iZXJnKQorICAtIERpcmVjdFNvdW5kIGRyaXZlciAobWFsYykKKyAgLSBBTFNBIGF1ZGlvIGRyaXZlciAobWFsYykKKyAgLSBuZXcgYXVkaW8gb3B0aW9uczogJy1zb3VuZGh3JyBhbmQgJy1hdWRpby1oZWxwJyAobWFsYykKKyAgLSBFUzEzNzAgUENJIGF1ZGlvIGRldmljZSAobWFsYykKKyAgLSBJbml0aWFsIFVTQiBzdXBwb3J0CisgIC0gTGludXggaG9zdCBzZXJpYWwgcG9ydCBhY2Nlc3MKKyAgLSBMaW51eCBob3N0IGxvdyBsZXZlbCBwYXJhbGxlbCBwb3J0IGFjY2VzcworICAtIE5ldyBuZXR3b3JrIGVtdWxhdGlvbiBjb2RlIHN1cHBvcnRpbmcgVkxBTnMuCisgIC0gTUlQUyBhbmQgTUlQU2VsIFVzZXIgTGludXggZW11bGF0aW9uCisgIC0gTUlQUyBmaXhlcyB0byBib290IExpbnV4IChEYW5pZWwgSmFjb2Jvd2l0eikKKyAgLSBOWCBiaXQgc3VwcG9ydAorICAtIEluaXRpYWwgU1BBUkMgU01QIHN1cHBvcnQgKEJsdWUgU3dpcmwpCisgIC0gTWFqb3Igb3ZlcmhhdWwgb2YgdGhlIHZpcnR1YWwgRkFUIGRyaXZlciBmb3IgcmVhZC93cml0ZSBzdXBwb3J0CisgICAgKEpvaGFubmVzIFNjaGluZGVsaW4pCisKK3ZlcnNpb24gMC43LjI6CisKKyAgLSB4ODZfNjQgZml4ZXMgKFdpbjIwMDAgYW5kIExpbnV4IDIuNiBib290IGluIDMyIGJpdCkKKyAgLSBtZXJnZSBzZWxmIG1vZGlmeWluZyBjb2RlIGhhbmRsaW5nIGluIGRpcnR5IHJhbSBwYWdlIG1lY2FuaXNtLgorICAtIE1JUFMgZml4ZXMgKFJhbGYgQmFlY2hsZSkKKyAgLSBiZXR0ZXIgdXNlciBuZXQgcGVyZm9ybWFuY2VzCisKK3ZlcnNpb24gMC43LjE6CisKKyAgLSByZWFkLW9ubHkgVmlydHVhbCBGQVQgc3VwcG9ydCAoSm9oYW5uZXMgU2NoaW5kZWxpbikKKyAgLSBXaW5kb3dzIDIwMDAgaW5zdGFsbCBkaXNrIGZ1bGwgaGFjayAob3JpZ2luYWwgaWRlYSBmcm9tIFZsYWRpbWlyCisgICAgTi4gT2xleW5paykKKyAgLSBWTURLIGRpc2sgaW1hZ2UgY3JlYXRpb24gKEZpbGlwIE5hdmFyYSkKKyAgLSBTUEFSQzY0IHByb2dyZXNzIChCbHVlIFN3aXJsKQorICAtIGluaXRpYWwgTUlQUyBzdXBwb3J0IChKb2NlbHluIG1heWVyKQorICAtIE1JUFMgaW1wcm92ZW1lbnRzIChSYWxmIEJhZWNobGUpCisgIC0gNjQgYml0IGZpeGVzIGluIHVzZXIgbmV0d29ya2luZyAoaW5pdGlhbCBwYXRjaCBieSBHd2Vub2xlIEJlYXVjaGVzbmUpCisgIC0gSU9BUElDIHN1cHBvcnQgKEZpbGlwIE5hdmFyYSkKKwordmVyc2lvbiAwLjcuMDoKKworICAtIGJldHRlciBCSU9TIHRyYW5zbGF0aW9uIGFuZCBIREQgZ2VvbWV0cnkgYXV0by1kZXRlY3Rpb24KKyAgLSB1c2VyIG1vZGUgbmV0d29ya2luZyBidWcgZml4CisgIC0gdW5kb2N1bWVudGVkIEZQVSBvcHMgc3VwcG9ydAorICAtIENpcnJ1cyBWR0E6IHN1cHBvcnQgZm9yIDEyODB4MTAyNHhbOCwxNSwxNl0gbW9kZXMKKyAgLSAncGlkZmlsZScgb3B0aW9uCisgIC0gLmRtZyBkaXNrIGltYWdlIGZvcm1hdCBzdXBwb3J0IChKb2hhbm5lcyBTY2hpbmRlbGluKQorICAtIGtleW1hcHMgc3VwcG9ydCAoaW5pdGlhbCBwYXRjaCBieSBKb2hhbm5lcyBTY2hpbmRlbGluKQorICAtIGJpZyBlbmRpYW4gQVJNIHN1cHBvcnQgKExlbm5lcnQgQnV5dGVuaGVrKQorICAtIGFkZGVkIGdlbmVyaWMgNjQgYml0IHRhcmdldCBzdXBwb3J0CisgIC0geDg2XzY0IHRhcmdldCBzdXBwb3J0CisgIC0gaW5pdGlhbCBBUElDIHN1cHBvcnQKKyAgLSBNTVgvU1NFL1NTRTIvUE5JIHN1cHBvcnQKKyAgLSBQQyBwYXJhbGxlbCBwb3J0IHN1cHBvcnQgKE1hcmsgSm9uY2toZWVyZSkKKyAgLSBpbml0aWFsIFNQQVJDNjQgc3VwcG9ydCAoQmx1ZSBTd2lybCkKKyAgLSBTUEFSQyB0YXJnZXQgYm9vdHMgTGludXggKEJsdWUgU3dpcmwpCisgIC0gYXJtdjV0ZSB1c2VyIG1vZGUgc3VwcG9ydCAoUGF1bCBCcm9vaykKKyAgLSBBUk0gVkZQIHN1cHBvcnQgKFBhdWwgQnJvb2spCisgIC0gQVJNICJBbmdlbCIgc2VtaWhvc3Rpbmcgc3lzY2FsbHMgKFBhdWwgQnJvb2spCisgIC0gdXNlciBtb2RlIGdkYiBzdHViIHN1cHBvcnQgKFBhdWwgQnJvb2spCisgIC0gU2FtYmEgMyBzdXBwb3J0CisgIC0gaW5pdGlhbCBDb2NvYSBzdXBwb3J0IChQaWVycmUgZCdIZXJiZW1vbnQpCisgIC0gZ2VuZXJpYyBGUFUgZW11bGF0aW9uIGNvZGUKKyAgLSBWaXJ0dWFsIFBDIHJlYWQtb25seSBkaXNrIGltYWdlIHN1cHBvcnQgKEFsZXggQmVyZWdzemFzemkpCisKK3ZlcnNpb24gMC42LjE6CisKKyAgLSBNYWMgT1MgWCBwb3J0IChQaWVycmUgZCdIZXJiZW1vbnQpCisgIC0gVmlydHVhbCBjb25zb2xlIHN1cHBvcnQKKyAgLSBCZXR0ZXIgbW9uaXRvciBsaW5lIGVkaXRpb24KKyAgLSBOZXcgYmxvY2sgZGV2aWNlIGxheWVyCisgIC0gTmV3ICdxY293JyBncm93YWJsZSBkaXNrIGltYWdlIHN1cHBvcnQgd2l0aCBBRVMgZW5jcnlwdGlvbiBhbmQKKyAgICB0cmFuc3BhcmVudCBkZWNvbXByZXNzaW9uCisgIC0gVk13YXJlIDMgYW5kIDQgcmVhZC1vbmx5IGRpc2sgaW1hZ2Ugc3VwcG9ydCAodW50ZXN0ZWQpCisgIC0gU3VwcG9ydCBmb3IgdXAgdG8gNCBzZXJpYWwgcG9ydHMKKyAgLSBURlRQIHNlcnZlciBzdXBwb3J0IChNYWdudXMgRGFtbSkKKyAgLSBQb3J0IHJlZGlyZWN0aW9uIHN1cHBvcnQgaW4gdXNlciBtb2RlIG5ldHdvcmtpbmcKKyAgLSBTdXBwb3J0IGZvciBub3QgZXhlY3V0YWJsZSBkYXRhIHNlY3Rpb25zCisgIC0gQ29tcHJlc3NlZCBsb29wIGRpc2sgaW1hZ2Ugc3VwcG9ydCAoSm9oYW5uZXMgU2NoaW5kZWxpbikKKyAgLSBMZXZlbCB0cmlnZ2VyZWQgSVJRIGZpeCAoYWthIE5FMjAwMCBQQ0kgcGVyZm9ybWFuY2UgZml4KSAoU3RldmUKKyAgICBXb3JtbGV5KQorICAtIEZpeGVkIEZlZG9yYSBDb3JlIDIgcHJvYmxlbXMgKG5vdyB5b3UgY2FuIHJ1biBxZW11IHdpdGhvdXQgYW55CisgICAgTERfQVNTVU1FX0tFUk5FTCB0cmlja3Mgb24gRkMyKQorICAtIERIQ1AgZml4IGZvciBXaW5kb3dzIChhY2NlcHQgREhDUFJFUVVFU1QgYWxvbmUpCisgIC0gU1BBUkMgc3lzdGVtIGVtdWxhdGlvbiAoQmx1ZSBTd2lybCkKKyAgLSBBdXRvbWF0aWMgU2FtYmEgY29uZmlndXJhdGlvbiBmb3IgaG9zdCBmaWxlIGFjY2VzcyBmcm9tIFdpbmRvd3MuCisgIC0gJy1sb2Fkdm0nIGFuZCAnLWZ1bGwtc2NyZWVuJyBvcHRpb25zCisgIC0gbmUyMDAwIHNhdmV2bSBzdXBwb3J0IChKb2hhbm5lcyBTY2hpbmRlbGluKQorICAtIEN0cmwtQWx0IGlzIG5vdyB0aGUgZGVmYXVsdCBncmFiIGtleS4gQ3RybC1BbHQtWzAtOV0gc3dpdGNoZXMgdG8KKyAgICB0aGUgdmlydHVhbCBjb25zb2xlcy4KKyAgLSBCSU9TIGZsb3BweSBmaXggZm9yIE5UNCAoTWlrZSBOb3JkZWxsLCBEZXJlayBGYXdjdXMsIFZvbGtlciBSdXBwZXJ0KQorICAtIEZsb3BweSBmaXhlcyBmb3IgTlQ0IGFuZCBOVDUgKE1pa2UgTm9yZGVsbCkKKyAgLSBOVDQgSURFIGZpeGVzIChCZW4gUGZhZiwgTWlrZSBOb3JkZWxsKQorICAtIFNETCBBdWRpbyBzdXBwb3J0IGFuZCBTQjE2IGZpeGVzIChtYWxjKQorICAtIEVOVEVSIGluc3RydWN0aW9uIGJ1ZyBmaXggKGluaXRpYWwgcGF0Y2ggYnkgU3RlZmFuIEtpc2Rhcm9jemkpCisgIC0gVkdBIGZvbnQgY2hhbmdlIGZpeAorICAtIFZHQSByZWFkLW9ubHkgQ1JUQyByZWdpc3RlciBmaXgKKwordmVyc2lvbiAwLjYuMDoKKworICAtIG1pbmltYWxpc3QgRlBVIGV4Y2VwdGlvbiBzdXBwb3J0IChOZXRCU0QgRlBVIHByb2JlIGZpeCkKKyAgLSBjcjAuRVQgZml4IChXaW45NSBib290KQorICAtICpCU0QgcG9ydCAoTWFya3VzIE5pZW1pc3RvKQorICAtIEkvTyBhY2Nlc3MgZml4IChzaWduYWxlZCBieSBNYXJrIEpvbmNraGVlcmUpCisgIC0gSURFIGRyaXZlcyBzZXJpYWwgbnVtYmVyIGZpeCAoTWlrZSBOb3JkZWxsKQorICAtIGludDEzIENEUk9NIEJJT1MgZml4IChha2EgU29sYXJpcyB4ODYgaW5zdGFsbCBDRCBmaXgpCisgIC0gaW50MTUsIGFoPTg2IEJJT1MgZml4IChha2EgU29sYXJpcyB4ODYgaGFyZHdhcmUgcHJvYmUgaGFuZyB1cCBmaXgpCisgIC0gQlNSL0JTRiAidW5kZWZpbmVkIGJlaGF2aW91ciIgZml4CisgIC0gdm1kazJyYXc6IGNvbnZlcnQgVk13YXJlIGRpc2sgaW1hZ2VzIHRvIHJhdyBpbWFnZXMKKyAgLSBQQ0kgc3VwcG9ydAorICAtIE5FMksgUENJIHN1cHBvcnQKKyAgLSBkdW1teSBWR0EgUENJIHN1cHBvcnQKKyAgLSBWR0EgZm9udCBzZWxlY3Rpb24gZml4IChEYW5pZWwgU2VycGVsbCkKKyAgLSBQSUMgcmVzZXQgZml4IChIaWRlbWkgS0FXQUkpCisgIC0gUElDIHNwdXJpb3VzIGlycSBzdXBwb3J0IChha2EgU29sYXJpcyBpbnN0YWxsIGJ1ZykKKyAgLSBhZGRlZCAnLWxvY2FsdGltZScgb3B0aW9uCisgIC0gQ2lycnVzIENMLUdENTR4eCBWR0Egc3VwcG9ydCAoaW5pdGlhbCBwYXRjaCBieSBNYWtvdG8gU3V6dWtpIChzdXp1KSkKKyAgLSBBUE0gYW5kIHN5c3RlbSBzaHV0ZG93biBzdXBwb3J0CisgIC0gRml4ZWQgc3lzdGVtIHJlc2V0CisgIC0gU3VwcG9ydCBmb3Igb3RoZXIgUEMgQklPU2VzCisgIC0gSW5pdGlhbCBQb3dlck1hYyBoYXJkd2FyZSBlbXVsYXRpb24KKyAgLSBQb3dlck1hYy9QUkVQIE9wZW5GaXJtd2FyZSBjb21wYXRpYmxlIEJJT1MgKEpvY2VseW4gTWF5ZXIpCisgIC0gaW5pdGlhbCBJREUgQk1ETUEgc3VwcG9ydCAobmVlZGVkIGZvciBEYXJ3aW4geDg2KQorICAtIFNldCB0aGUgZGVmYXVsdCBtZW1vcnkgc2l6ZSBmb3IgUEMgZW11bGF0aW9uIHRvIDEyOCBNQgorCit2ZXJzaW9uIDAuNS41OgorCisgIC0gU0RMIGZ1bGwgc2NyZWVuIHN1cHBvcnQgKGluaXRpYWwgcGF0Y2ggYnkgbWFsYykKKyAgLSBWR0Egc3VwcG9ydCBvbiBQb3dlclBDIFBSRVAKKyAgLSBWQkUgZml4ZXMgKE1hdHRoZXcgTWFzdHJhY2NpKQorICAtIFBJVCBmaXhlcyAoYWthIFdpbjk4IGhhcmR3YXJlIHByb2JlIGFuZCAiVkdBIHNsb3duZXNzIiBidWcpCisgIC0gSURFIG1hc3RlciBvbmx5IGZpeGVzIChha2EgV2luOTggQ0QtUk9NIHByb2JlIGJ1ZykKKyAgLSBBUk0gbG9hZC9zdG9yZSBoYWxmIHdvcmQgZml4IChVbHJpY2ggSGVjaHQpCisgIC0gRkRDIGZpeGVzIGZvciBXaW45OAorCit2ZXJzaW9uIDAuNS40OgorCisgIC0gcWVtdS1mYXN0IGZpeGVzCisgIC0gQklPUyBhcmVhIHByb3RlY3Rpb24gZml4IChha2EgRU1NMzg2LkVYRSBmaXgpIChNaWtlIE5vcmRlbGwpCisgIC0ga2V5Ym9hcmQvbW91c2UgZml4IChNaWtlIE5vcmRlbGwpCisgIC0gSURFIGZpeGVzIChMaW51eCBkaWQgbm90IHJlY29nbml6ZWQgc2xhdmUgZHJpdmVycykKKyAgLSBWTTg2IEVJUCBtYXNraW5nIGZpeCAoYWthIE5UNSBpbnN0YWxsIGZpeCkgKE1pa2UgTm9yZGVsbCkKKyAgLSBRRU1VIGNhbiBub3cgYm9vdCBhIFBvd2VyUEMgTGludXgga2VybmVsIChKb2NlbHluIE1heWVyKQorICAtIFVzZXIgbW9kZSBuZXR3b3JrIHN0YWNrCisgIC0gaW11bCBpbW04IGZpeCArIDB4ODIgb3Bjb2RlIHN1cHBvcnQgKEhpZGVtaSBLQVdBSSkKKyAgLSBwcmVjaXNlIHNlbGYgbW9kaWZ5aW5nIGNvZGUgKGFrYSBCZU9TIGluc3RhbGwgYnVnKQorCit2ZXJzaW9uIDAuNS4zOgorCisgIC0gYWRkZWQgQm9jaHMgVkVTQSBWQkUgc3VwcG9ydAorICAtIFZHQSBtZW1vcnkgbWFwIG1vZGUgMyBhY2Nlc3MgZml4IChPUy8yIGluc3RhbGwgZml4KQorICAtIElERSBmaXhlcyAoSmVucyBBeGJvZSkKKyAgLSBDUFUgaW50ZXJydXB0IGZpeGVzCisgIC0gZml4ZWQgdmFyaW91cyBUTEIgaW52YWxpZGF0aW9uIGNhc2VzIChOVCBpbnN0YWxsKQorICAtIGZpeGVkIGNyMC5XUCBzZW1hbnRpY3MgKFhQIGluc3RhbGwpCisgIC0gZGlyZWN0IGNoYWluaW5nIHN1cHBvcnQgZm9yIFNQQVJDIGFuZCBQb3dlclBDIChmYXN0ZXIpCisgIC0gQVJNIE5XRlBFIHN1cHBvcnQgKGluaXRpYWwgcGF0Y2ggYnkgVWxyaWNoIEhlY2h0KQorICAtIGFkZGVkIHNwZWNpZmljIHg4NiB0byB4ODYgdHJhbnNsYXRvciAoY2xvc2UgdG8gbmF0aXZlIHBlcmZvcm1hbmNlCisgICAgaW4gcWVtdS1pMzg2IGFuZCBxZW11LWZhc3QpCisgIC0gc2htIHN5c2NhbGxzIHN1cHBvcnQgKFBhdWwgTWNLZXJyYXMpCisgIC0gYWRkZWQgYWNjdXJhdGUgQ1IwLk1QL01FL1RTIGVtdWxhdGlvbgorICAtIGZpeGVkIERNQSBtZW1vcnkgd3JpdGUgYWNjZXNzIChXaW45NSBib290IGZsb3BweSBmaXgpCisgIC0gZ3JhcGhpY2FsIHg4NiBsaW51eCBsb2FkZXIKKyAgLSBjb21tYW5kIGxpbmUgbW9uaXRvcgorICAtIGdlbmVyaWMgcmVtb3ZhYmxlIGRldmljZSBzdXBwb3J0CisgIC0gc3VwcG9ydCBvZiBDRC1ST00gY2hhbmdlCisgIC0gbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2Ugc3VwcG9ydAorICAtIGluaXRpYWwgeDg2LTY0IGhvc3Qgc3VwcG9ydCAoR3dlbm9sZSBCZWF1Y2hlc25lKQorICAtIGxyZXQgdG8gb3V0ZXIgcHJpdmlsZWRnZSBmaXggKE9TLzIgaW5zdGFsbCBmaXgpCisgIC0gdGFzayBzd2l0Y2ggZml4ZXMgKFNreU9TIGJvb3QpCisgIC0gVk0gc2F2ZS9yZXN0b3JlIGNvbW1hbmRzCisgIC0gbmV3IHRpbWVyIEFQSQorICAtIG1vcmUgcHJlY2lzZSBSVEMgZW11bGF0aW9uIChwZXJpb2RpYyB0aW1lcnMgKyB0aW1lIHVwZGF0ZXMpCisgIC0gV2luMzIgcG9ydCAoaW5pdGlhbCBwYXRjaCBieSBLYXp1KQorCit2ZXJzaW9uIDAuNS4yOgorCisgIC0gaW1wcm92ZWQgc29mdCBNTVUgc3BlZWQgKGFzc2VtYmx5IGZ1bmN0aW9ucyBhbmQgc3BlY2lhbGl6aW5nKQorICAtIGltcHJvdmVkIG11bHRpdGFza2luZyBzcGVlZCBieSBhdm9pZGluZyBmbHVzaGluZyBUQnMgd2hlbgorICAgIHN3aXRjaGluZyB0YXNrcworICAtIGltcHJvdmVkIHFlbXUtZmFzdCBzcGVlZAorICAtIGltcHJvdmVkIHNlbGYgbW9kaWZ5aW5nIGNvZGUgaGFuZGxpbmcgKGJpZyBwZXJmb3JtYW5jZSBnYWluIGluCisgICAgc29mdG1tdSBtb2RlKS4KKyAgLSBmaXhlZCBJTyBjaGVja2luZworICAtIGZpeGVkIENELVJPTSBkZXRlY3Rpb24gKHdpbjk4IGluc3RhbGwgQ0QpCisgIC0gZml4ZWQgYWRkc2VnIHJlYWwgbW9kZSBidWcgKEdSVUIgYm9vdCBmaXgpCisgIC0gYWRkZWQgUk9NIG1lbW9yeSBzdXBwb3J0ICh3aW45OCBib290KQorICAtIGZpeGVkICdjYWxsIEV2JyBpbiBjYXNlIG9mIHBhZ2luZyBleGNlcHRpb24KKyAgLSB1cGRhdGVkIHRoZSBzY3JpcHQgJ3FlbXUtYmluZm10LWNvbmYuc2gnIHRvIHVzZSBRRU1VIGF1dG9tYWdpY2FsbHkKKyAgICB3aGVuIGxhdW5jaGluZyBleGVjdXRhYmxlcyBmb3IgdGhlIHN1cHBvcnRlZCB0YXJnZXQgQ1BVcy4KKyAgLSBQb3dlclBDIHN5c3RlbSBlbXVsYXRpb24gdXBkYXRlIChKb2NlbHluIE1heWVyKQorICAtIFBDIGZsb3BweSBlbXVsYXRpb24gYW5kIERNQSBmaXhlcyAoSm9jZWx5biBNYXllcikKKyAgLSBwb2xsZWQgbW9kZSBmb3IgUElDIChKb2NlbHluIE1heWVyKQorICAtIGZpeGVkIFBURSBkaXJ0eSBiaXQgaGFuZGxpbmcKKyAgLSBmaXhlZCB4YWRkIHNhbWUgcmVnIGJ1ZworICAtIGZpeGVkIGNtcHhjaGcgZXhjZXB0aW9uIHNhZmVuZXNzCisgIC0gYWNjZXNzIHRvIHZpcnR1YWwgbWVtb3J5IGluIGdkYiBzdHViCisgIC0gdGFzayBnYXRlIGFuZCBOVCBmbGFnIGZpeGVzCisgIC0gZWZsYWdzIG9wdGltaXNhdGlvbiBmaXggZm9yIHN0cmluZyBvcGVyYXRpb25zCisKK3ZlcnNpb24gMC41LjE6CisKKyAgLSBmbG9hdCBhY2Nlc3MgZml4ZXMgd2hlbiB1c2luZyBzb2Z0IG1tdQorICAtIFBDIGVtdWxhdGlvbiBzdXBwb3J0IG9uIFBvd2VyUEMKKyAgLSBBMjAgc3VwcG9ydAorICAtIElERSBDRC1ST00gZW11bGF0aW9uCisgIC0gQVJNIGZpeGVzIChVbHJpY2ggSGVjaHQpCisgIC0gU0IxNiBlbXVsYXRpb24gKG1hbGMpCisgIC0gSVJFVCBhbmQgSU5UIGZpeGVzIGluIFZNODYgbW9kZSB3aXRoIElPUEw9MworICAtIFBvcnQgSS9PcyB1c2UgVFNTIGlvIG1hcAorICAtIEZ1bGwgdGFzayBzd2l0Y2hpbmcvdGFzayBnYXRlIHN1cHBvcnQKKyAgLSBhZGRlZCB2ZXJyLCB2ZXJ3LCBhcnBsLCBmY21vdnh4CisgIC0gUG93ZXJQQyB0YXJnZXQgc3VwcG9ydCAoSm9jZWx5biBNYXllcikKKyAgLSBNYWpvciBTUEFSQyB0YXJnZXQgZml4ZXMgKGR5bmFtaWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBiZWdpbiB0byB3b3JrKQorCit2ZXJzaW9uIDAuNS4wOgorCisgIC0gZnVsbCBoYXJkd2FyZSBsZXZlbCBWR0EgZW11bGF0aW9uCisgIC0gZ3JhcGhpY2FsIGRpc3BsYXkgd2l0aCBTREwKKyAgLSBhZGRlZCBQUy8yIG1vdXNlIGFuZCBrZXlib2FyZCBlbXVsYXRpb24KKyAgLSBwb3B3ICglZXNwKSBmaXgKKyAgLSBtb3YgdG8vZnJvbSBzZWdtZW50IGRhdGEgd2lkdGggZml4CisgIC0gYWRkZWQgcmVhbCBtb2RlIHN1cHBvcnQKKyAgLSBhZGRlZCBCb2NocyBCSU9TIGFuZCBMR1BMJ2VkIFZHQSBCSU9TIGxvYWRlciBpbiBxZW11CisgIC0gbTY4ayBob3N0IHBvcnQgKFJpY2hhcmQgWmlkbGlja3kpCisgIC0gcGFydGlhbCBzb2Z0IE1NVSBzdXBwb3J0IGZvciBtZW1vcnkgbWFwcGVkIEkvT3MKKyAgLSBtdWx0aS10YXJnZXQgYnVpbGQKKyAgLSBmaXhlZDogbm8gZXJyb3IgY29kZSBpbiBoYXJkd2FyZSBpbnRlcnJ1cHRzCisgIC0gZml4ZWQ6IHBvcCBzcywgbW92IHNzLCB4IGFuZCBzdGkgZGlzYWJsZSBoYXJkd2FyZSBpcnFzIGZvciB0aGUgbmV4dCBpbnNuCisgIC0gY29ycmVjdCBzaW5nbGUgc3RlcHBpbmcgdGhydSBzdHJpbmcgb3BlcmF0aW9ucworICAtIHByZWxpbWluYXJ5IFNQQVJDIHRhcmdldCBzdXBwb3J0IChUaG9tYXMgTS4gT2dyaXNlZ2cpCisgIC0gdHVuLWZkIG9wdGlvbiAoUnVzdHkgUnVzc2VsbCkKKyAgLSBhdXRvbWF0aWMgSURFIGdlb21ldHJ5IGRldGVjdGlvbgorICAtIHJlbmFtZWQgJ3ZsJyB0byBxZW11Wy1mYXN0XSBhbmQgdXNlciBxZW11IHRvIHFlbXUte2NwdX0uCisgIC0gYWRkZWQgbWFuIHBhZ2UKKyAgLSBhZGRlZCBmdWxsIHNvZnQgbW11IG1vZGUgdG8gbGF1bmNoIHVucGF0Y2hlZCBPU2VzLgorCit2ZXJzaW9uIDAuNC4zOgorCisgIC0geDg2IGV4Y2VwdGlvbiBmaXggaW4gY2FzZSBvZiBub3AgaW5zdHJ1Y3Rpb24uCisgIC0gZ2NjIDMuMi4yIGJ1ZyB3b3JrYXJvdW5kIChSZWRIYXQgOSBmaXgpCisgIC0gc3BhcmMgYW5kIEFscGhhIGhvc3QgZml4ZXMKKyAgLSBtYW55IEFSTSB0YXJnZXQgZml4ZXM6ICdscycgYW5kICdiYXNoJyBjYW4gYmUgbGF1bmNoZWQuCisKK3ZlcnNpb24gMC40LjI6CisKKyAtIG1hbnkgZXhjZXB0aW9uIGhhbmRsaW5nIGZpeGVzIChjYW4gY29tcGlsZSBhIExpbnV4IGtlcm5lbCBpbnNpZGUgdmwpCisgLSBJREUgZW11bGF0aW9uIHN1cHBvcnQKKyAtIGluaXRpYWwgR0RCIHN0dWIgc3VwcG9ydAorIC0gZGVmZXJyZWQgdXBkYXRlIHN1cHBvcnQgZm9yIGRpc2sgaW1hZ2VzIChSdXN0eSBSdXNzZWxsKQorIC0gYWNjZXB0IFVzZXIgTW9kZSBMaW51eCBDb3B5IE9uIFdyaXRlIGRpc2sgaW1hZ2VzCisgLSBTTVAga2VybmVscyBjYW4gYXQgbGVhc3QgYmUgYm9vdGVkCisKK3ZlcnNpb24gMC40LjE6CisKKyAtIG1vcmUgYWNjdXJhdGUgdGltZXIgc3VwcG9ydCBpbiB2bC4KKyAtIG1vcmUgcmVsaWFibGUgTkUyMDAwIHByb2JlIGluIHZsLgorIC0gYWRkZWQgMi41LjY2IGtlcm5lbCBpbiB2bC10ZXN0LgorIC0gYWRkZWQgVkxUTVBESVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdmwuCisKK3ZlcnNpb24gMC40OgorCisgLSBpbml0aWFsIHN1cHBvcnQgZm9yIHJpbmcgMCB4ODYgcHJvY2Vzc29yIGVtdWxhdGlvbgorIC0gZml4ZWQgc2lnbmFsIGhhbmRsaW5nIGZvciBjb3JyZWN0IGRvc2VtdSBEUE1JIGVtdWxhdGlvbgorIC0gZmFzdCB4ODYgTU1VIGVtdWxhdGlvbiB3aXRoIG1tYXAoKQorIC0gZml4ZWQgcG9wbCAoJWVzcCkgY2FzZQorIC0gTGludXgga2VybmVsIGNhbiBiZSBleGVjdXRlZCBieSBRRU1VIHdpdGggdGhlICd2bCcgY29tbWFuZC4KKwordmVyc2lvbiAwLjM6CisKKyAtIGluaXRpYWwgc3VwcG9ydCBmb3IgQVJNIGVtdWxhdGlvbgorIC0gYWRkZWQgZm5zYXZlLCBmcnN0b3IsIGZuc3RlbnYsIGZsZGVudiBGUFUgaW5zdHJ1Y3Rpb25zCisgLSBhZGRlZCBGUFUgcmVnaXN0ZXIgc2F2ZSBpbiBzaWduYWwgZW11bGF0aW9uCisgLSBpbml0aWFsIEFSTSBwb3J0CisgLSBTcGFyYyBhbmQgQWxwaGEgcG9ydHMgd29yayBvbiB0aGUgcmVncmVzc2lvbiB0ZXN0CisgLSBnZW5lcmljIGlvY3RsIG51bWJlciBjb252ZXJzaW9uCisgLSBmaXhlZCBpb2N0bCB0eXBlIGNvbnZlcnNpb24KKwordmVyc2lvbiAwLjI6CisKKyAtIFBvd2VyUEMgZGlzYXNzZW1ibHkgYW5kIEVMRiBzeW1ib2xzIG91dHB1dCAoUnVzdHkgUnVzc2VsbCkKKyAtIGZsb2NrIHN1cHBvcnQgKFJ1c3R5IFJ1c3NlbGwpCisgLSB1Z2V0cmxpbWl0IHN1cHBvcnQgKFJ1c3R5IFJ1c3NlbGwpCisgLSBmc3RhdDY0IGZpeCAoUnVzdHkgUnVzc2VsbCkKKyAtIGluaXRpYWwgQWxwaGEgcG9ydCAoRmFsayBIdWVmZm5lcikKKyAtIGluaXRpYWwgSUE2NCBwb3J0IChNYXR0IFdpbHNvbikKKyAtIGluaXRpYWwgU3BhcmMgYW5kIFNwYXJjNjQgcG9ydCAoRGF2aWQgUy4gTWlsbGVyKQorIC0gYWRkZWQgSExUIGluc3RydWN0aW9uCisgLSBMUkVUIGluc3RydWN0aW9uIGZpeC4KKyAtIGFkZGVkIEdQRiBnZW5lcmF0aW9uIGZvciBJL09zLgorIC0gYWRkZWQgSU5UMyBhbmQgVEYgZmxhZyBzdXBwb3J0LgorIC0gU0hMIGluc3RydWN0aW9uIEMgZmxhZyBmaXguCisgLSBtbWFwIGVtdWxhdGlvbiBmb3IgaG9zdCBwYWdlIHNpemUgPiA0S0IKKyAtIHNlbGYtbW9kaWZ5aW5nIGNvZGUgc3VwcG9ydAorIC0gYmV0dGVyIFZNODYgc3VwcG9ydCAoZG9zZW11IHdvcmtzIG9uIG5vbiB0cml2aWFsIHByb2dyYW1zKQorIC0gcHJlY2lzZSBleGNlcHRpb24gc3VwcG9ydCAoRUlQIGlzIGNvbXB1dGVkIGNvcnJlY3RseSBpbiBtb3N0IGNhc2VzKQorIC0gbW9yZSBwcmVjaXNlIExEVC9HRFQvSURUIGVtdWxhdGlvbgorIC0gZmFzdGVyIHNlZ21lbnQgbG9hZCBpbiB2bTg2IG1vZGUKKyAtIGRpcmVjdCBjaGFpbmluZyBvZiBiYXNpYyBibG9ja3MgKGZhc3RlciBlbXVsYXRpb24pCisKK3ZlcnNpb24gMC4xLjY6CisKKyAtIGF1dG9tYXRpYyBsaWJyYXJ5IHNlYXJjaCBzeXN0ZW0uIFFFTVUgY2FuIG5vdyB3b3JrIHdpdGggdW5wYXRjaGVkCisgICBFTEYgZHluYW1pYyBsb2FkZXIgYW5kIGxpYmMgKFJ1c3R5IFJ1c3NlbGwpLgorIC0gSVNPIEMgd2FybmluZyBmaXhlcyAoQWxpc3RhaXIgU3RyYWNoYW4pCisgLSBmaXJzdCBzZWxmLXZpcnR1YWxpemFibGUgdmVyc2lvbiAod29ya3Mgb25seSBhcyBsb25nIGFzIHRoZQorICAgdHJhbnNsYXRpb24gY2FjaGUgaXMgbm90IGZsdXNoZWQpCisgLSBSSDkgZml4ZXMKKwordmVyc2lvbiAwLjEuNToKKworIC0gcHBjNjQgc3VwcG9ydCArIHBlcnNvbmFsaXR5KCkgcGF0Y2ggKFJ1c3R5IFJ1c3NlbGwpCisgLSBmaXJzdCBBbHBoYSBDUFUgcGF0Y2hlcyAoRmFsayBIdWVmZm5lcikKKyAtIHJlbW92ZWQgYmZkLmggZGVwZW5kYW5jeQorIC0gZml4ZWQgc2hyZCwgc2hsZCwgaWRpdmwgYW5kIGRpdmwgb24gUG93ZXJQQy4KKyAtIGZpeGVkIGJ1Z2d5IGdsaWJjIFBvd2VyUEMgcmludCgpIGZ1bmN0aW9uICh0ZXN0LWkzODYgcGFzc2VzIG5vdyBvbiBQb3dlclBDKS4KKwordmVyc2lvbiAwLjEuNDoKKworIC0gbW9yZSBhY2N1cmF0ZSBWTTg2IGVtdWxhdGlvbiAoY2FuIGxhdW5jaCBzbWFsbCBET1MgMTYgYml0CisgICBleGVjdXRhYmxlcyBpbiB3aW5lKS4KKyAtIGZpeGVkIHB1c2gvcG9wIGZzL2dzCisgLSBhZGRlZCBpcmV0IGluc3RydWN0aW9uLgorIC0gYWRkZWQgdGltZXMoKSBzeXNjYWxsIGFuZCBTSU9DQVRNQVJLIGlvY3RsLgorCit2ZXJzaW9uIDAuMS4zOgorCisgLSBTMzkwIHN1cHBvcnQgKFVscmljaCBXZWlnYW5kKQorIC0gZ2xpYmMgMi4zLnggY29tcGlsZSBmaXggKFVscmljaCBXZWlnYW5kKQorIC0gc29ja2V0Y2FsbCBlbmRpYW4gZml4IChVbHJpY2ggV2VpZ2FuZCkKKyAtIHN0cnVjdCBzb2NrYWRkciBlbmRpYW4gZml4IChVbHJpY2ggV2VpZ2FuZCkKKyAtIHNlbmRtc2cvcmVjdm1zZyBlbmRpYW4gZml4IChVbHJpY2ggV2VpZ2FuZCkKKyAtIGV4ZWN2ZSBlbmRpYW4gZml4IChVbHJpY2ggV2VpZ2FuZCkKKyAtIGZkc2V0IGVuZGlhbiBmaXggKFVscmljaCBXZWlnYW5kKQorIC0gcGFydGlhbCBzZXRzb2Nrb3B0IHN5c2NhbGwgc3VwcG9ydCAoVWxyaWNoIFdlaWdhbmQpCisgLSBtb3JlIGFjY3VyYXRlIHB1c2hmL3BvcGYgZW11bGF0aW9uCisgLSBmaXJzdCBwYXJ0aWFsIHZtODYoKSBzeXNjYWxsIHN1cHBvcnQgKGNhbiBiZSB1c2VkIHdpdGggcnVuY29tIGV4YW1wbGUpLgorIC0gYWRkZWQgYm91bmQsIGNtcHhjaGc4YiwgY3B1aWQgaW5zdHJ1Y3Rpb25zCisgLSBhZGRlZCAxNiBiaXQgYWRkcmVzc2luZyBzdXBwb3J0L292ZXJyaWRlIGZvciBzdHJpbmcgb3BlcmF0aW9ucworIC0gcG9sbCgpIGZpeAorCit2ZXJzaW9uIDAuMS4yOgorCisgLSBjb21waWxlIGZpeGVzCisgLSB4bGF0IGluc3RydWN0aW9uCisgLSB4Y2hnIGluc3RydWN0aW9uIG1lbW9yeSBsb2NrCisgLSBhZGRlZCBzaW1wbGUgdm04NiBleGFtcGxlIChub3Qgd29ya2luZyB3aXRoIFFFTVUgeWV0KS4gVGhlIDU0IGJ5dGUKKyAgIERPUyBleGVjdXRhYmxlICdwaV8xMC5jb20nIHByb2dyYW0gd2FzIHJlbGVhc2VkIGJ5IEJlcnRyYW0KKyAgIEZlbGdlbmhhdWVyIChtb3JlIGluZm9ybWF0aW9uIGF0IGh0dHA6Ly93d3cuYm9vLm5ldC9+amFzb25wL3BpcGFnZS5odG1sKS4KKwordmVyc2lvbiAwLjEuMToKKworIC0gZ2xpYmMgMi4yIGNvbXBpbGF0aW9uIGZpeGVzCisgLSBhZGRlZCAtcyBhbmQgLUwgb3B0aW9ucworIC0gYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB4ODYgZ2xpYmMgYW5kIHdpbmUKKyAtIGJpZyBlbmRpYW4gZml4ZXMgaW4gRUxGIGxvYWRlciBhbmQgZ2V0ZGVudHMuCisKK3ZlcnNpb24gMC4xOgorCisgLSBpbml0aWFsIHB1YmxpYyByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9JTlNUQUxMIGIvYW5kcm9pZC9xZW11MS9JTlNUQUxMCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTBmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL0lOU1RBTEwKQEAgLTAsMCArMSwzIEBACitUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIHNvdXJjZXMgdG8gdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvZ3JhbS4KKworU2VlIGRvY3MvREVWRUxPUE1FTlQuVFhUIGZvciBidWlsZGluZyBpbnN0cnVjdGlvbnMuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL01ha2VmaWxlLnFlbXUxLWNvbW1vbi5tayBiL2FuZHJvaWQvcWVtdTEvTWFrZWZpbGUucWVtdTEtY29tbW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZWUwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL01ha2VmaWxlLnFlbXUxLWNvbW1vbi5tawpAQCAtMCwwICsxLDMxMiBAQAorIyBXaGVuIGJ1aWxkaW5nIHRoaXMgcHJvamVjdCwgd2UgYWN0dWFsbHkgZ2VuZXJhdGUgc2V2ZXJhbCBjb21wb25lbnRzIHdoaWNoCisjIGFyZSB0aGUgZm9sbG93aW5nOgorIworIyAgLSB0aGUgZW11bGF0b3ItdWkgcHJvZ3JhbSAod2hpY2ggaXMgdGFyZ2V0LWFnbm9zdGljKQorIyAgLSB0aGUgInN0YW5kYWxvbmUiIGVtdWxhdG9yIHByb2dyYW1zIChlbWJlZCBib3RoIFVJIGFuZCBlbmdpbmUgaW4gYSBzaW5nbGUKKyMgICAgYmluYXJ5IGFuZCBwcm9jZXNzKSwgaS5lLiAiZW11bGF0b3IiIGZvciBBUk0gYW5kICJlbXVsYXRvci14ODYiIGZvciB4ODYuCisjCisjIFRoaXMgZmlsZSBkZWZpbmVzIHN0YXRpYyBob3N0IGxpYnJhcmllcyB0aGF0IHdpbGwgYmUgdXNlZCBieSBhdCBsZWFzdCB0d28KKyMgb2YgdGhlc2UgY29tcG9uZW50cy4KKyMKKworUUVNVTFfT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1FFTVUxX0NPTU1PTl9DRkxBR1MgOj0gXAorICAgICQoRU1VTEFUT1JfQ09NTU9OX0NGTEFHUykgXAorCitRRU1VMV9DT01NT05fSU5DTFVERVMgOj0gXAorICAgICQoRU1VTEFUT1JfQ09NTU9OX0lOQ0xVREVTKSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKKyMgTmVlZCB0byBpbmNsdWRlICJxYXBpLXR5cGVzLmgiIGFuZCBvdGhlciBhdXRvLWdlbmVyYXRlZCBmaWxlcyBmcm9tCisjIGFuZHJvaWQvY29uZmlndXJlLnNoCitRRU1VMV9DT01NT05fSU5DTFVERVMgKz0gJChCVUlMRF9PQkpTX0RJUikvYnVpbGQvcWVtdTEtcWFwaS1hdXRvLWdlbmVyYXRlZAorCisjIFpsaWIgc291cmNlcworUUVNVTFfQ09NTU9OX0lOQ0xVREVTICs9ICQoWkxJQl9JTkNMVURFUykKKworIyBHTGliIHNvdXJjZXMKK1FFTVUxX0NPTU1PTl9JTkNMVURFUyArPSAkKE1JTklHTElCX0lOQ0xVREVTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjCisjIyMgIGVtdWxhdG9yLWxpYnFlbXU6IFRBUkdFVC1JTkRFUEVOREVOVCBRRU1VIEZVTkNUSU9OUworIyMjCisjIyMgIFRIRVNFIEFSRSBVU0VEIEJZIEVWRVJZVEhJTkcgRVhDRVBUICdlbXVsYXRvci11aScKKyMjIworCitjb21tb25fTE9DQUxfQ0ZMQUdTID0KK2NvbW1vbl9MT0NBTF9TUkNfRklMRVMgPQorCisKK0VNVUxBVE9SX0xJQlFFTVVfQ0ZMQUdTIDo9CisKK0FVRElPX1NPVVJDRVMgOj0gbm9hdWRpby5jIHdhdmF1ZGlvLmMgd2F2Y2FwdHVyZS5jIG1peGVuZy5jCitBVURJT19DRkxBR1MgIDo9IC1JJChMT0NBTF9QQVRIKS9hdWRpbyAtREhBU19BVURJTworQVVESU9fTERMSUJTICA6PQorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksZGFyd2luKQorICBDT05GSUdfQ09SRUFVRElPID89IHllcworICBBVURJT19DRkxBR1MgKz0gLURIT1NUX0JTRD0xCitlbmRpZgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgQ09ORklHX1dJTkFVRElPID89IHllcworZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLGxpbnV4KQorICBDT05GSUdfT1NTICA/PSB5ZXMKKyAgQ09ORklHX0FMU0EgPz0geWVzCisgIENPTkZJR19QVUxTRUFVRElPID89IHllcworICBDT05GSUdfRVNEICA/PSB5ZXMKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxmcmVlYnNkKQorICBDT05GSUdfT1NTID89IHllcworZW5kaWYKKworaWZlcSAoJChDT05GSUdfQ09SRUFVRElPKSx5ZXMpCisgIEFVRElPX1NPVVJDRVMgKz0gY29yZWF1ZGlvLmMKKyAgQVVESU9fQ0ZMQUdTICArPSAtRENPTkZJR19DT1JFQVVESU8KKyAgQVVESU9fTERMSUJTICArPSAtV2wsLWZyYW1ld29yayxDb3JlQXVkaW8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1dJTkFVRElPKSx5ZXMpCisgIEFVRElPX1NPVVJDRVMgKz0gd2luYXVkaW8uYworICBBVURJT19DRkxBR1MgICs9IC1EQ09ORklHX1dJTkFVRElPCitlbmRpZgorCitpZmVxICgkKENPTkZJR19QVUxTRUFVRElPKSx5ZXMpCisgIEFVRElPX1NPVVJDRVMgKz0gcGFhdWRpby5jIGF1ZGlvX3B0X2ludC5jCisgIEFVRElPX1NPVVJDRVMgKz0gd3JhcHBlcnMvcHVsc2UtYXVkaW8uYworICBBVURJT19DRkxBR1MgICs9IC1EQ09ORklHX1BVTFNFQVVESU8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0FMU0EpLHllcykKKyAgQVVESU9fU09VUkNFUyArPSBhbHNhYXVkaW8uYyBhdWRpb19wdF9pbnQuYworICBBVURJT19TT1VSQ0VTICs9IHdyYXBwZXJzL2Fsc2EuYworICBBVURJT19DRkxBR1MgICs9IC1EQ09ORklHX0FMU0EKK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX0VTRCkseWVzKQorICBBVURJT19TT1VSQ0VTICs9IGVzZGF1ZGlvLmMKKyAgQVVESU9fU09VUkNFUyArPSB3cmFwcGVycy9lc291bmQuYworICBBVURJT19DRkxBR1MgICs9IC1EQ09ORklHX0VTRAorZW5kaWYKKworaWZlcSAoJChDT05GSUdfT1NTKSx5ZXMpCisgIEFVRElPX1NPVVJDRVMgKz0gb3NzYXVkaW8uYworICBBVURJT19DRkxBR1MgICs9IC1EQ09ORklHX09TUworZW5kaWYKKworQVVESU9fU09VUkNFUyA6PSAkKGNhbGwgc29ydCwkKEFVRElPX1NPVVJDRVM6JT1hdWRpby8lKSkKKworIyBvdGhlciBmbGFncworaWZuZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgIEFVRElPX0xETElCUyArPSAtbGRsCitlbHNlCitlbmRpZgorCisKK0VNVUxBVE9SX0xJQlFFTVVfQ0ZMQUdTICs9ICQoQVVESU9fQ0ZMQUdTKQorRU1VTEFUT1JfTElCUUVNVV9MRExJQlMgKz0gJChBVURJT19MRExJQlMpCisKK2lmZXEgKCQoUUVNVV9UQVJHRVRfWE1MX1NPVVJDRVMpLCkKKyAgICBRRU1VX1RBUkdFVF9YTUxfU09VUkNFUyA6PSBhcm0tY29yZSBhcm0tbmVvbiBhcm0tdmZwIGFybS12ZnAzCisgICAgUUVNVV9UQVJHRVRfWE1MX1NPVVJDRVMgOj0gJChRRU1VX1RBUkdFVF9YTUxfU09VUkNFUzolPSQoTE9DQUxfUEFUSCkvZ2RiLXhtbC8lLnhtbCkKK2VuZGlmCisKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1saWJyYXJ5LCBlbXVsYXRvci1saWJxZW11KQorCisjIGdkYnN0dWIteG1sLmMgY29udGFpbnMgQy1jb21waWxhYmxlIGFycmF5cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250ZW50CisjIG9mICQoTE9DQUxfUEFUSCkvZ2RiLXhtbC8sIGFuZCBpcyBnZW5lcmF0ZWQgd2l0aCB0aGUgJ2ZlYXR1cmVfdG9fYy5zaCcgc2NyaXB0LgorIworaW50ZXJtZWRpYXRlcyA9ICQoY2FsbCBsb2NhbC1pbnRlcm1lZGlhdGVzLWRpcikKK1FFTVVfR0RCU1RVQl9YTUxfQyA9ICQoaW50ZXJtZWRpYXRlcykvZ2Ric3R1Yi14bWwuYworJChRRU1VX0dEQlNUVUJfWE1MX0MpOiBQUklWQVRFX1BBVEggOj0gJChMT0NBTF9QQVRIKQorJChRRU1VX0dEQlNUVUJfWE1MX0MpOiBQUklWQVRFX1NPVVJDRVMgOj0gJChUQVJHRVRfWE1MX1NPVVJDRVMpCiskKFFFTVVfR0RCU1RVQl9YTUxfQyk6IFBSSVZBVEVfQ1VTVE9NX1RPT0wgPSAkKFBSSVZBVEVfUEFUSCkvZmVhdHVyZV90b19jLnNoICRAICQoUUVNVV9UQVJHRVRfWE1MX1NPVVJDRVMpCiskKFFFTVVfR0RCU1RVQl9YTUxfQyk6ICQoUUVNVV9UQVJHRVRfWE1MX1NPVVJDRVMpICQoTE9DQUxfUEFUSCkvZmVhdHVyZV90b19jLnNoCisJJChoaWRlKSBybSAtZiAkQAorCSQodHJhbnNmb3JtLWdlbmVyYXRlZC1zb3VyY2UpCitMT0NBTF9HRU5FUkFURURfU09VUkNFUyArPSAkKFFFTVVfR0RCU1RVQl9YTUxfQykKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChRRU1VMV9DT01NT05fSU5DTFVERVMpIFwKKyAgICAkKEFORFJPSURfRU1VX0lOQ0xVREVTKSBcCisgICAgJChMT0NBTF9QQVRIKS9zbGlycC1hbmRyb2lkIFwKKyAgICAkKGludGVybWVkaWF0ZXMpIFwKKyAgICAkKExJQkpQRUdfSU5DTFVERVMpIFwKKworTE9DQUxfQ0ZMQUdTIDo9IFwKKyAgICAkKFFFTVUxX0NPTU1PTl9DRkxBR1MpIFwKKyAgICAtVyBcCisgICAgLVduby1zaWduLWNvbXBhcmUgXAorICAgIC1mbm8tc3RyaWN0LWFsaWFzaW5nIFwKKyAgICAtV25vLXVudXNlZC1wYXJhbWV0ZXIgXAorICAgIC1EX1hPUEVOX1NPVVJDRT02MDAgXAorICAgIC1EX0JTRF9TT1VSQ0U9MSBcCisgICAgLURDT05GSUdfQkRSVl9XSElURUxJU1Q9XCJcIiBcCisgICAgJChFTVVMQVRPUl9MSUJRRU1VX0NGTEFHUykgXAorICAgICQoQVVESU9fQ0ZMQUdTKSBcCisKKyMgdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCwgb3RoZXJ3aXNlIHRoZSBnZW5lcmF0ZWQgYmluYXJpZXMgbWF5CisjIG5vdCBsaW5rIHByb3Blcmx5IG9uIG91ciBidWlsZCBzZXJ2ZXJzCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksbGludXgpCitMT0NBTF9DRkxBR1MgKz0gLWZuby1zdGFjay1wcm90ZWN0b3IKK2VuZGlmCisKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgJChBVURJT19TT1VSQ0VTKSBcCisgICAgYWlvLWFuZHJvaWQuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL2FuZHJvaWRfcWVtdWQuY3BwIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9hc3luYy9Mb29wZXIuY3BwIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5jcHAgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9kaXNwbGF5LmMgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vY2hhcnBpcGUuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9DaGFyU2VyaWFsTGluZS5jcHAgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vc2VyaWFsX2xpbmUuY3BwIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL1ZtTG9jay5jcHAgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5jcHAgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNlbGx1bGFyLWFnZW50LWltcGwuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtZGlzcGxheS1hZ2VudC1pbXBsLmNwcCBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtZmluZ2VyLWFnZW50LWltcGwuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtbG9jYXRpb24tYWdlbnQtaW1wbC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1uZXQtYWdlbnQtaW1wbC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZW5zb3JzLWFnZW50LWltcGwuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtc2V0dXAuY3BwIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS10ZWxlcGhvbnktYWdlbnQtaW1wbC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS13aW5kb3ctYWdlbnQtaW1wbC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvdGVsZXBob255L21vZGVtX2luaXQuY3BwIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvdXRpbHMvc3RyZWFtLmNwcCBcCisgICAgYXN5bmMuYyBcCisgICAgYXVkaW8vYXVkaW8uYyBcCisgICAgYmxvY2suYyBcCisgICAgYmxvY2tkZXYuYyBcCisgICAgYmxvY2svcWNvdzIuYyBcCisgICAgYmxvY2svcWNvdzItcmVmY291bnQuYyBcCisgICAgYmxvY2svcWNvdzItc25hcHNob3QuYyBcCisgICAgYmxvY2svcWNvdzItY2x1c3Rlci5jIFwKKyAgICBibG9jay9yYXcuYyBcCisgICAgaW9oYW5kbGVyLmMgXAorICAgIGlvcG9ydC5jIFwKKyAgICBtaWdyYXRpb24tZHVtbXktYW5kcm9pZC5jIFwKKyAgICBuZXQvbmV0LWFuZHJvaWQuYyBcCisgICAgcWVtdS1jaGFyLmMgXAorICAgIHFlbXUtbG9nLmMgXAorICAgIHFvYmplY3QvanNvbi1sZXhlci5jIFwKKyAgICBxb2JqZWN0L2pzb24tcGFyc2VyLmMgXAorICAgIHFvYmplY3QvanNvbi1zdHJlYW1lci5jIFwKKyAgICBxb2JqZWN0L3Fqc29uLmMgXAorICAgIHFvYmplY3QvcWJvb2wuYyBcCisgICAgcW9iamVjdC9xZGljdC5jIFwKKyAgICBxb2JqZWN0L3FlcnJvci5jIFwKKyAgICBxb2JqZWN0L3FmbG9hdC5jIFwKKyAgICBxb2JqZWN0L3FpbnQuYyBcCisgICAgcW9iamVjdC9xbGlzdC5jIFwKKyAgICBxb2JqZWN0L3FzdHJpbmcuYyBcCisgICAgc2F2ZXZtLmMgXAorICAgIHNsaXJwLWFuZHJvaWQvYm9vdHAuYyBcCisgICAgc2xpcnAtYW5kcm9pZC9ja3N1bS5jIFwKKyAgICBzbGlycC1hbmRyb2lkL2RlYnVnLmMgXAorICAgIHNsaXJwLWFuZHJvaWQvaWYuYyBcCisgICAgc2xpcnAtYW5kcm9pZC9pcF9pY21wLmMgXAorICAgIHNsaXJwLWFuZHJvaWQvaXBfaW5wdXQuYyBcCisgICAgc2xpcnAtYW5kcm9pZC9pcF9vdXRwdXQuYyBcCisgICAgc2xpcnAtYW5kcm9pZC9tYnVmLmMgXAorICAgIHNsaXJwLWFuZHJvaWQvbWlzYy5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3NidWYuYyBcCisgICAgc2xpcnAtYW5kcm9pZC9zbGlycC5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3NvY2tldC5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3RjcF9pbnB1dC5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3RjcF9vdXRwdXQuYyBcCisgICAgc2xpcnAtYW5kcm9pZC90Y3Bfc3Vici5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3RjcF90aW1lci5jIFwKKyAgICBzbGlycC1hbmRyb2lkL3RmdHAuYyBcCisgICAgc2xpcnAtYW5kcm9pZC91ZHAuYyBcCisgICAgdWkvY29uc29sZS5jIFwKKyAgICB1aS9kM2Rlcy5jIFwKKyAgICB1aS9pbnB1dC5jIFwKKyAgICB1aS92bmMtYW5kcm9pZC5jIFwKKyAgICB1dGlsL2Flcy5jIFwKKyAgICB1dGlsL2N1dGlscy5jIFwKKyAgICB1dGlsL2Vycm9yLmMgXAorICAgIHV0aWwvaGV4ZHVtcC5jIFwKKyAgICB1dGlsL2lvdi5jIFwKKyAgICB1dGlsL21vZHVsZS5jIFwKKyAgICB1dGlsL25vdGlmeS5jIFwKKyAgICB1dGlsL29zZGVwLmMgXAorICAgIHV0aWwvcGF0aC5jIFwKKyAgICB1dGlsL3FlbXUtY29uZmlnLmMgXAorICAgIHV0aWwvcWVtdS1lcnJvci5jIFwKKyAgICB1dGlsL3FlbXUtb3B0aW9uLmMgXAorICAgIHV0aWwvcWVtdS1zb2NrZXRzLWFuZHJvaWQuYyBcCisgICAgdXRpbC91bmljb2RlLmMgXAorICAgIHV0aWwveWllbGQtYW5kcm9pZC5jIFwKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfQVJDSCkseDg2KQorICAgIExPQ0FMX1NSQ19GSUxFUyArPSBkaXNhcy9pMzg2LmMKK2VuZGlmCitpZmVxICgkKEJVSUxEX1RBUkdFVF9BUkNIKSx4ODZfNjQpCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9IGRpc2FzL2kzODYuYworZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICAgICAgYmxvY2svcmF3LXdpbjMyLmMgXAorICAgICAgICB1dGlsL3FlbXUtdGhyZWFkLXdpbjMyLmMgXAorCitlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICAgICAgYmxvY2svcmF3LXBvc2l4LmMgXAorICAgICAgICBwb3NpeC1haW8tY29tcGF0LmMgXAorICAgICAgICB1dGlsL2NvbXBhdGZkLmMgXAorICAgICAgICB1dGlsL3FlbXUtdGhyZWFkLXBvc2l4LmMgXAorCitlbmRpZgorCiskKGNhbGwgZ2VuLWh3LWNvbmZpZy1kZWZzKQorJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMKKyMjIyAgZ2VuLWh4LWhlYWRlcjogR2VuZXJhdGUgaGVhZGVycyBmcm9tIC5oeCBmaWxlIHdpdGggImh4dG9vbCIgc2NyaXB0LgorIyMjCisjIyMgIFRoZSAnaHh0b29sJyBzY3JpcHQgaXMgdXNlZCB0byBnZW5lcmF0ZSBoZWFkZXIgZmlsZXMgZnJvbSBhbiBpbnB1dAorIyMjICBmaWxlIHdpdGggdGhlIC5oeCBzdWZmaXguIEkuZS4gZm9vLmh4IC0tPiBmb28uaAorIyMjCisjIyMgIER1ZSB0byB0aGUgd2F5IHRoZSBBbmRyb2lkIGJ1aWxkIHN5c3RlbSB3b3Jrcywgd2UgbmVlZCB0byByZWdlbmVyYXRlCisjIyMgIGl0IGZvciBlYWNoIG1vZHVsZSAodGhlIG91dHB1dCB3aWxsIGdvIGludG8gYSBtb2R1bGUtc3BlY2lmaWMgZGlyZWN0b3J5KS4KKyMjIworIyMjICBUaGlzIGRlZmluZXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluc2lkZSBhIG1vZHVsZSBkZWZpbml0aW9uCisjIyMKKyMjIyAgJChjYWxsIGdlbi1oeC1oZWFkZXIsPGlucHV0Piw8b3V0cHV0Piw8c291cmNlLWZpbGVzPikKKyMjIworIyMjICBXaGVyZTogPGlucHV0PiBpcyB0aGUgaW5wdXQgZmlsZSwgd2l0aCBhIC5oeCBzdWZmaXggKGUuZy4gZm9vLmh4KQorIyMjICAgICAgICAgPG91dHB1dD4gaXMgdGhlIG91dHB1dCBmaWxlLCB3aXRoIGEgLmggb3IgLmRlZiBzdWZmaXgKKyMjIyAgICAgICAgIDxzb3VyY2UtZmlsZXM+IGlzIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgdGhhdCBpbmNsdWRlIHRoZSBoZWFkZXIKKyMjIworCisKK2dlbi1oeC1oZWFkZXIgPSAkKGV2YWwgJChjYWxsIGdlbi1oeC1oZWFkZXItZXYsJDEsJDIsJDMpKQorCitkZWZpbmUgZ2VuLWh4LWhlYWRlci1ldgoraW50ZXJtZWRpYXRlcyA6PSAkJChjYWxsIGxvY2FsLWludGVybWVkaWF0ZXMtZGlyKQorCitRRU1VX0hFQURFUl9IIDo9ICQkKGludGVybWVkaWF0ZXMpLyQkMgorJCQoUUVNVV9IRUFERVJfSCk6IFBSSVZBVEVfUEFUSCA6PSAkJChMT0NBTF9QQVRIKQorJCQoUUVNVV9IRUFERVJfSCk6IFBSSVZBVEVfQ1VTVE9NX1RPT0wgPSAkJChQUklWQVRFX1BBVEgpL2h4dG9vbCAtaCA8ICQkPCA+ICQkQAorJCQoUUVNVV9IRUFERVJfSCk6ICQkKExPQ0FMX1BBVEgpLyQkMSAkJChMT0NBTF9QQVRIKS9oeHRvb2wKKwkkJCh0cmFuc2Zvcm0tZ2VuZXJhdGVkLXNvdXJjZSkKKworTE9DQUxfR0VORVJBVEVEX1NPVVJDRVMgKz0gJCQoUUVNVV9IRUFERVJfSCkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJCQoaW50ZXJtZWRpYXRlcykKK2VuZGVmCisKK0xPQ0FMX1BBVEggOj0gJChRRU1VMV9PTERfTE9DQUxfUEFUSCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvTWFrZWZpbGUucWVtdTEtdGFyZ2V0Lm1rIGIvYW5kcm9pZC9xZW11MS9NYWtlZmlsZS5xZW11MS10YXJnZXQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvTWFrZWZpbGUucWVtdTEtdGFyZ2V0Lm1rCkBAIC0wLDAgKzEsMjY5IEBACisjIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBzZXZlcmFsIHRpbWVzIHRvIGJ1aWxkIHRhcmdldC1zcGVjaWZpYworIyBtb2R1bGVzIGZvciB0aGUgQW5kcm9pZCBlbXVsYXRvci4gSXQgd2lsbCBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcworIyBmb3IgYXJtLCB4ODYgYW5kIG1pcHMKKyMKKworT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpZm5kZWYgRU1VTEFUT1JfVEFSR0VUX0FSQ0gKKyQoZXJyb3IgRU1VTEFUT1JfVEFSR0VUX0FSQ0ggaXMgbm90IGRlZmluZWQhKQorZW5kaWYKKworRU1VTEFUT1JfVEFSR0VUX0NQVSA6PSAkKEVNVUxBVE9SX1RBUkdFVF9BUkNIKQoraWZlcSAoJChFTVVMQVRPUl9UQVJHRVRfQ1BVKSx4ODYpCisgIEVNVUxBVE9SX1RBUkdFVF9DUFUgOj0gaTM4NgorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIworIyMjICBlbXVsYXRvci10YXJnZXQtJENQVTogdGFyZ2V0LXNwZWNpZmljIGVtdWxhdGlvbiBjb2RlLgorIyMjCisjIyMgIFVzZWQgYnkgYm90aCB0aGUgY29yZSBhbmQgc3RhbmRhbG9uZSBwcm9ncmFtcy4KKyMjIworCitUQ0dfVEFSR0VUIDo9ICQoQlVJTERfVEFSR0VUX0FSQ0gpCitpZmVxICgkKEJVSUxEX1RBUkdFVF9BUkNIKSx4ODYpCisgIFRDR19UQVJHRVQgOj0gaTM4NgorZW5kaWYKK2lmZXEgKCQoQlVJTERfVEFSR0VUX0FSQ0gpLHg4Nl82NCkKKyAgVENHX1RBUkdFVCA6PSBpMzg2CitlbmRpZgorCisjIENvbW1vbiBjb21waWxlciBmbGFncyBmb3IgYWxsIHRhcmdldC1kZXBlbmRlbnQgbGlicmFyaWVzCitFTVVMQVRPUl9UQVJHRVRfSU5DTFVERVMgOj0gXAorICAgICQoQU5EUk9JRF9FTVVfSU5DTFVERVMpIFwKKyAgICAkKExPQ0FMX1BBVEgpL2FuZHJvaWQtcWVtdTEtZ2x1ZS9jb25maWcvdGFyZ2V0LSQoRU1VTEFUT1JfVEFSR0VUX0FSQ0gpIFwKKyAgICAkKExPQ0FMX1BBVEgpL3RhcmdldC0kKEVNVUxBVE9SX1RBUkdFVF9DUFUpIFwKKyAgICAkKExPQ0FMX1BBVEgpL2ZwdSBcCisgICAgJChMT0NBTF9QQVRIKS90Y2cgXAorICAgICQoTE9DQUxfUEFUSCkvdGNnLyQoVENHX1RBUkdFVCkgXAorICAgICQoTE9DQUxfUEFUSCkvc2xpcnAtYW5kcm9pZCBcCisgICAgJChMSUJDVVJMX0lOQ0xVREVTKSBcCisKK0VNVUxBVE9SX1RBUkdFVF9DRkxBR1MgOj0gXAorICAgIC1ETkVFRF9DUFVfSCBcCisgICAgLURUQVJHRVRfQVJDSD1cIiQoRU1VTEFUT1JfVEFSR0VUX0FSQ0gpXCIKKworIyMgb25lIGZvciAzMi1iaXQKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1saWJyYXJ5LCBlbXVsYXRvci10YXJnZXQtJChFTVVMQVRPUl9UQVJHRVRfQ1BVKSkKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgJChRRU1VMV9DT01NT05fQ0ZMQUdTKSBcCisgICAgJChFTVVMQVRPUl9UQVJHRVRfQ0ZMQUdTKSBcCisKKyMgVGhlc2UgYXJlIHJlcXVpcmVkIGJ5IHRoZSBUQ0cgZW5naW5lLgorTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtZm5vLVBJQyBcCisgICAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorICAgIC1Xbm8tc2lnbi1jb21wYXJlCisKKyMgcmVxdWlyZWQgdG8gZW5zdXJlIHdlIHByb3Blcmx5IGluaXRpYWxpemUgdmlydHVhbCBhdWRpbyBoYXJkd2FyZQorTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtREhBU19BVURJTyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoUUVNVTFfQ09NTU9OX0lOQ0xVREVTKSBcCisgICAgJChFTVVMQVRPUl9UQVJHRVRfSU5DTFVERVMpIFwKKworTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvbWFpbi5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1iYXR0ZXJ5LWFnZW50LWltcGwuYyBcCisgICAgYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdXNlci1ldmVudC1hZ2VudC1pbXBsLmMgXAorICAgIGFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXZtLW9wZXJhdGlvbnMtaW1wbC5jIFwKKyAgICBhbmRyb2lkLXFlbXUxLWdsdWUvc2tpbl9xdC5jcHAgXAorICAgIGFyY2hfaW5pdC5jIFwKKyAgICBiYWNrZW5kcy9tc21vdXNlLmMgXAorICAgIGNvZGUtcHJvZmlsZS5jIFwKKyAgICBjcHVzLmMgXAorICAgIGNwdXRsYi5jIFwKKyAgICBjcHUtZXhlYy5jICBcCisgICAgZGlzYXMuYyBcCisgICAgZG1hLWhlbHBlcnMuYyBcCisgICAgZXhlYy5jIFwKKyAgICBmcHUvc29mdGZsb2F0LmMgXAorICAgIGdkYnN0dWIuYyBcCisgICAgaHcvYW5kcm9pZC9nb2xkZmlzaC9hdWRpby5jIFwKKyAgICBody9hbmRyb2lkL2dvbGRmaXNoL2JhdHRlcnkuYyBcCisgICAgaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuYyBcCisgICAgaHcvYW5kcm9pZC9nb2xkZmlzaC9ldmVudHNfZGV2aWNlLmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvZmIuYyBcCisgICAgaHcvYW5kcm9pZC9nb2xkZmlzaC9tbWMuYyAgIFwKKyAgICBody9hbmRyb2lkL2dvbGRmaXNoL25hbmQuYyBcCisgICAgaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvcHJvZmlsZS5jIFwKKyAgICBody9hbmRyb2lkL2dvbGRmaXNoL3RyYWNlLmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5jIFwKKyAgICBody9jb3JlL2RtYS5jIFwKKyAgICBody9jb3JlL2lycS5jIFwKKyAgICBody9jb3JlL2xvYWRlci5jIFwKKyAgICBody9jb3JlL3FkZXYuYyBcCisgICAgaHcvY29yZS9zeXNidXMuYyBcCisgICAgaHcvcGNpL3BjaS5jIFwKKyAgICBody93YXRjaGRvZy93YXRjaGRvZy5jIFwKKyAgICBsb2ctcm90YXRlLWFuZHJvaWQuYyBcCisgICAgbWFpbi1sb29wLmMgXAorICAgIG1lbW9yeS1hbmRyb2lkLmMgXAorICAgIG1vbml0b3ItYW5kcm9pZC5jIFwKKyAgICBxZW11LXRpbWVyLmMgXAorICAgIHRyYW5zbGF0ZS1hbGwuYyBcCisgICAgdGNnL29wdGltaXplLmMgXAorICAgIHRjZy90Y2cuYyBcCisgICAgdGNnLXJ1bnRpbWUuYyBcCisgICAgdWkva2V5bWFwcy5jIFwKKyAgICB1dGlsL2JpdG1hcC5jIFwKKyAgICB1dGlsL2JpdG9wcy5jIFwKKyAgICB1dGlsL2hvc3QtdXRpbHMuYyBcCisgICAgdXRpbC9xZW11LXRpbWVyLWNvbW1vbi5jIFwKKyAgICB2bC1hbmRyb2lkLmMgXAorCitpZmVxICgkKEVNVUxBVE9SX1RBUkdFVF9BUkNIKSxhcm0pCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIGRpc2FzL2FybS5jIFwKKyAgICBody9hbmRyb2lkL2FuZHJvaWRfYXJtLmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvaW50ZXJydXB0LmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvdGltZXIuYyBcCisgICAgaHcvYXJtL2FybXY3bS5jIFwKKyAgICBody9hcm0vYXJtdjdtX252aWMuYyBcCisgICAgaHcvYXJtL2Jvb3QuYyBcCisgICAgaHcvYXJtL3BpYy5jIFwKKyAgICBody9uZXQvc21jOTFjMTExLmMgXAorICAgIHRhcmdldC1hcm0vYXJtLXNlbWkuYyBcCisgICAgdGFyZ2V0LWFybS9oZWxwZXIuYyBcCisgICAgdGFyZ2V0LWFybS9pd21teHRfaGVscGVyLmMgXAorICAgIHRhcmdldC1hcm0vbWFjaGluZS5jIFwKKyAgICB0YXJnZXQtYXJtL29wX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtYXJtL25lb25faGVscGVyLmMgXAorICAgIHRhcmdldC1hcm0vdHJhbnNsYXRlLmMgXAorCitlbmRpZiAgIyBFTVVMQVRPUl9UQVJHRVRfQVJDSCA9PSBhcm0KKworaWZlcSAoJChFTVVMQVRPUl9UQVJHRVRfQVJDSCkseDg2KQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBody9pMzg2L3BjLmMgXAorICAgIGh3L2kzODYvc21iaW9zLmMgXAorICAgIGh3L2lucHV0L3Bja2JkLmMgXAorICAgIGh3L2lucHV0L3BzMi5jIFwKKyAgICBody9pbnRjL2FwaWMuYyBcCisgICAgaHcvaW50Yy9pODI1OS5jIFwKKyAgICBody9pbnRjL2lvYXBpYy5jIFwKKyAgICBody9uZXQvbmUyMDAwLmMgXAorICAgIGh3L252cmFtL2Z3X2NmZy5jIFwKKyAgICBody9wY2ktaG9zdC9waWl4LmMgXAorICAgIGh3L3RpbWVyL2k4MjU0LmMgXAorICAgIGh3L3RpbWVyL21jMTQ2ODE4cnRjLmMgXAorICAgIHRhcmdldC1pMzg2L2NjX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni9leGNwX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni9mcHVfaGVscGVyLmMgXAorICAgIHRhcmdldC1pMzg2L2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni9pbnRfaGVscGVyLmMgXAorICAgIHRhcmdldC1pMzg2L21hY2hpbmUuYyBcCisgICAgdGFyZ2V0LWkzODYvbWVtX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni9taXNjX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni9zZWdfaGVscGVyLmMgXAorICAgIHRhcmdldC1pMzg2L3NtbV9oZWxwZXIuYyBcCisgICAgdGFyZ2V0LWkzODYvc3ZtX2hlbHBlci5jIFwKKyAgICB0YXJnZXQtaTM4Ni90cmFuc2xhdGUuYyBcCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxkYXJ3aW4pCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIHRhcmdldC1pMzg2L2hheC1hbGwuYyBcCisgICAgdGFyZ2V0LWkzODYvaGF4LWRhcndpbi5jIFwKKworZW5kaWYKKworaWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgIHRhcmdldC1pMzg2L2hheC1hbGwuYyBcCisgICAgdGFyZ2V0LWkzODYvaGF4LXdpbmRvd3MuYyBcCisKK2VuZGlmCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSxsaW51eCkKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgdGFyZ2V0LWkzODYva3ZtLmMgXAorICAgIHRhcmdldC1pMzg2L2t2bS1ncy1yZXN0b3JlLmMgXAorICAgIGt2bS1hbGwuYyBcCisgICAga3ZtLWFuZHJvaWQuYyBcCisKK2VuZGlmCisKK2VuZGlmICAjIEVNVUxBVE9SX1RBUkdFVF9BUkNIID09IHg4NgorCitpZmVxICgkKEVNVUxBVE9SX1RBUkdFVF9BUkNIKSxtaXBzKQorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBkaXNhcy9taXBzLmMgXAorICAgIGh3L2FuZHJvaWQvYW5kcm9pZF9taXBzLmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvaW50ZXJydXB0LmMgXAorICAgIGh3L2FuZHJvaWQvZ29sZGZpc2gvdGltZXIuYyBcCisgICAgaHcvbWlwcy9jcHV0aW1lci5jIFwKKyAgICBody9taXBzL21pcHNfaW50LmMgXAorICAgIGh3L21pcHMvbWlwc19waWMuYyBcCisgICAgaHcvbmV0L3NtYzkxYzExMS5jIFwKKyAgICB0YXJnZXQtbWlwcy9oZWxwZXIuYyBcCisgICAgdGFyZ2V0LW1pcHMvb3BfaGVscGVyLmMgXAorICAgIHRhcmdldC1taXBzL2RzcF9oZWxwZXIuYyBcCisgICAgdGFyZ2V0LW1pcHMvdHJhbnNsYXRlLmMgXAorICAgIHRhcmdldC1taXBzL21hY2hpbmUuYyBcCisKK2VuZGlmICAjIEVNVUxBVE9SX1RBUkdFVF9BUkNIID09IG1pcHMKKworIyBXaGF0IGEgbWVzcywgb3MtcG9zaXguYyBkZXBlbmRzIG9uIHRoZSBleGFjdCB2YWx1ZXMgb2Ygb3B0aW9ucworIyB3aGljaCBhcmUgdGFyZ2V0IHNwZWNpZmljLgoraWZlcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICAgICAgb3Mtd2luMzIuYyBcCisgICAgICAgIHRhcC13aW4zMi5jIFwKKyAgICAgICAgdXRpbC9vc2xpYi13aW4zMi5jIFwKKworZWxzZQorICAgIExPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgICAgIG9zLXBvc2l4LmMgXAorICAgICAgICB1dGlsL29zbGliLXBvc2l4LmMgXAorCitlbmRpZgorCiskKGNhbGwgZ2VuLWh3LWNvbmZpZy1kZWZzKQorJChjYWxsIGdlbi1oeC1oZWFkZXIscWVtdS1vcHRpb25zLmh4LHFlbXUtb3B0aW9ucy5kZWYsb3MtcG9zaXguYyBvcy13aW4zMi5jKQorJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjCisjIyMgIGVtdWxhdG9yLSRBUkNIOiBTdGFuZGFsb25lIGVtdWxhdG9yIHByb2dyYW0KKyMjIworIyMjCisKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1wcm9ncmFtLCBlbXVsYXRvciQoQlVJTERfVEFSR0VUX1NVRkZJWCktJChFTVVMQVRPUl9UQVJHRVRfQVJDSCkpCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAorICAgIGVtdWxhdG9yLWxpYnVpIFwKKyAgICAkKEFORFJPSURfRU1VX1NUQVRJQ19MSUJSQVJJRVMpIFwKKyAgICAkKEFORFJPSURfU0tJTl9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChFTVVMQVRPUl9MSUJVSV9TVEFUSUNfTElCUkFSSUVTKSBcCisgICAgJChNSU5JR0xJQl9TVEFUSUNfTElCUkFSSUVTKSBcCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGVtdWxhdG9yLWxpYnFlbXUgXAorICAgIGVtdWxhdG9yLXRhcmdldC0kKEVNVUxBVE9SX1RBUkdFVF9DUFUpIFwKKworTE9DQUxfTERMSUJTIDo9IFwKKyAgICAkKEFORFJPSURfRU1VX0xETElCUykgXAorICAgICQoRU1VTEFUT1JfTElCUUVNVV9MRExJQlMpIFwKKyAgICAkKEVNVUxBVE9SX0xJQlVJX0xETElCUykgXAorICAgICQoQ1hYX1NURF9MSUIpIFwKKworTE9DQUxfTERGTEFHUyA6PSBcCisgICAgJChFTVVMQVRPUl9MSUJVSV9MREZMQUdTKSBcCisKKyQoY2FsbCBnZW4taHgtaGVhZGVyLHFlbXUtb3B0aW9ucy5oeCxxZW11LW9wdGlvbnMuZGVmLHZsLWFuZHJvaWQuYyBxZW11LW9wdGlvbnMuaCkKKyQoY2FsbCBnZW4taHctY29uZmlnLWRlZnMpCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAkKGV2YWwgJChjYWxsIGluc2VydC13aW5kb3dzLWljb24pKQorZW5kaWYKKworJChjYWxsIGVuZC1lbXVsYXRvci1wcm9ncmFtKQorCitMT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2Fpby1hbmRyb2lkLmMgYi9hbmRyb2lkL3FlbXUxL2Fpby1hbmRyb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MDQzMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYWlvLWFuZHJvaWQuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIFFFTVUgYWlvIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOAorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJibG9jay9ibG9jay5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2lvbG9vcGVyLmgiCisKK3R5cGVkZWYgc3RydWN0IEFpb0hhbmRsZXIgQWlvSGFuZGxlcjsKKworLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBBSU8gaGFuZGxlcnMgKi8KK3N0YXRpYyBRTElTVF9IRUFEKCwgQWlvSGFuZGxlcikgYWlvX2hhbmRsZXJzOworCisvKiBUaGlzIGlzIGEgc2ltcGxlIGxvY2sgdXNlZCB0byBwcm90ZWN0IHRoZSBhaW9faGFuZGxlcnMgbGlzdC4gIFNwZWNpZmljYWxseSwKKyAqIGl0J3MgdXNlZCB0byBlbnN1cmUgdGhhdCBubyBjYWxsYmFja3MgYXJlIHJlbW92ZWQgd2hpbGUgd2UncmUgd2Fsa2luZyBhbmQKKyAqIGRpc3BhdGNoaW5nIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIGludCB3YWxraW5nX2hhbmRsZXJzOworCitzdHJ1Y3QgQWlvSGFuZGxlcgoreworICAgIGludCBmZDsKKyAgICBJT0hhbmRsZXIgKmlvX3JlYWQ7CisgICAgSU9IYW5kbGVyICppb193cml0ZTsKKyAgICBBaW9GbHVzaEhhbmRsZXIgKmlvX2ZsdXNoOworICAgIEFpb1Byb2Nlc3NRdWV1ZSAqaW9fcHJvY2Vzc19xdWV1ZTsKKyAgICBpbnQgZGVsZXRlZDsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgUUxJU1RfRU5UUlkoQWlvSGFuZGxlcikgbm9kZTsKK307CisKK3N0YXRpYyBBaW9IYW5kbGVyICpmaW5kX2Fpb19oYW5kbGVyKGludCBmZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworCisgICAgUUxJU1RfRk9SRUFDSChub2RlLCAmYWlvX2hhbmRsZXJzLCBub2RlKSB7CisgICAgICAgIGlmIChub2RlLT5mZCA9PSBmZCkKKyAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IHFlbXVfYWlvX3NldF9mZF9oYW5kbGVyKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmlvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICppb193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaW9GbHVzaEhhbmRsZXIgKmlvX2ZsdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpb1Byb2Nlc3NRdWV1ZSAqaW9fcHJvY2Vzc19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgQWlvSGFuZGxlciAqbm9kZTsKKworICAgIG5vZGUgPSBmaW5kX2Fpb19oYW5kbGVyKGZkKTsKKworICAgIC8qIEFyZSB3ZSBkZWxldGluZyB0aGUgZmQgaGFuZGxlcj8gKi8KKyAgICBpZiAoIWlvX3JlYWQgJiYgIWlvX3dyaXRlKSB7CisgICAgICAgIGlmIChub2RlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGUgbG9jayBpcyBoZWxkLCBqdXN0IG1hcmsgdGhlIG5vZGUgYXMgZGVsZXRlZCAqLworICAgICAgICAgICAgaWYgKHdhbGtpbmdfaGFuZGxlcnMpCisgICAgICAgICAgICAgICAgbm9kZS0+ZGVsZXRlZCA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGRlbGV0ZSBpdCBmb3IgcmVhbC4gIFdlIGNhbid0IGp1c3QgbWFyayBpdCBhcworICAgICAgICAgICAgICAgICAqIGRlbGV0ZWQgYmVjYXVzZSBkZWxldGVkIG5vZGVzIGFyZSBvbmx5IGNsZWFuZWQgdXAgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgKiByZWxlYXNpbmcgdGhlIHdhbGtpbmdfaGFuZGxlcnMgbG9jay4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBRTElTVF9SRU1PVkUobm9kZSwgbm9kZSk7CisgICAgICAgICAgICAgICAgZ19mcmVlKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogQWxsb2MgYW5kIGluc2VydCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlICovCisgICAgICAgICAgICBub2RlID0gZ19tYWxsb2MwKHNpemVvZihBaW9IYW5kbGVyKSk7CisgICAgICAgICAgICBub2RlLT5mZCA9IGZkOworICAgICAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQoJmFpb19oYW5kbGVycywgbm9kZSwgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogVXBkYXRlIGhhbmRsZXIgd2l0aCBsYXRlc3QgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgbm9kZS0+aW9fcmVhZCA9IGlvX3JlYWQ7CisgICAgICAgIG5vZGUtPmlvX3dyaXRlID0gaW9fd3JpdGU7CisgICAgICAgIG5vZGUtPmlvX2ZsdXNoID0gaW9fZmx1c2g7CisgICAgICAgIG5vZGUtPmlvX3Byb2Nlc3NfcXVldWUgPSBpb19wcm9jZXNzX3F1ZXVlOworICAgICAgICBub2RlLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgfQorCisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIoZmQsIE5VTEwsIGlvX3JlYWQsIGlvX3dyaXRlLCBvcGFxdWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcWVtdV9haW9fZmx1c2godm9pZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworICAgIGludCByZXQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IDA7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBwZW5kaW5nIGVtdWxhdGVkIGFpbyBzdGFydCB0aGVtIG5vdyBzbyBmbHVzaAorCSAqIHdpbGwgYmUgYWJsZSB0byByZXR1cm4gMS4KKwkgKi8KKyAgICAgICAgcWVtdV9haW9fd2FpdCgpOworCisgICAgICAgIFFMSVNUX0ZPUkVBQ0gobm9kZSwgJmFpb19oYW5kbGVycywgbm9kZSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlvX2ZsdXNoKSB7CisgICAgICAgICAgICAgICAgcmV0IHw9IG5vZGUtPmlvX2ZsdXNoKG5vZGUtPm9wYXF1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChxZW11X2JoX3BvbGwoKSB8fCByZXQgPiAwKTsKK30KKworaW50IHFlbXVfYWlvX3Byb2Nlc3NfcXVldWUodm9pZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworICAgIGludCByZXQgPSAwOworCisgICAgd2Fsa2luZ19oYW5kbGVycyA9IDE7CisKKyAgICBRTElTVF9GT1JFQUNIKG5vZGUsICZhaW9faGFuZGxlcnMsIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUtPmlvX3Byb2Nlc3NfcXVldWUpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5pb19wcm9jZXNzX3F1ZXVlKG5vZGUtPm9wYXF1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2Fsa2luZ19oYW5kbGVycyA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHFlbXVfYWlvX3dhaXQodm9pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIElvTG9vcGVyKiAgbG9vcGVyOworCisgICAgaWYgKHFlbXVfYmhfcG9sbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGFyZSBjYWxsYmFja3MgbGVmdCB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQsIHdlIG5lZWQgdG8gY2FsbCB0aGVuLgorICAgICAqIFJldHVybiBhZnRlcndhcmRzIHRvIGF2b2lkIHdhaXRpbmcgbmVlZGxlc3NseSBpbiBzZWxlY3QoKS4KKyAgICAgKi8KKyAgICBpZiAocWVtdV9haW9fcHJvY2Vzc19xdWV1ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBsb29wZXIgPSBpb2xvb3Blcl9uZXcoKTsKKworICAgIGRvIHsKKyAgICAgICAgQWlvSGFuZGxlciAqbm9kZTsKKworICAgICAgICBpb2xvb3Blcl9yZXNldChsb29wZXIpOworICAgICAgICB3YWxraW5nX2hhbmRsZXJzID0gMTsKKworICAgICAgICAvKiBmaWxsIGZkIHNldHMgKi8KKyAgICAgICAgUUxJU1RfRk9SRUFDSChub2RlLCAmYWlvX2hhbmRsZXJzLCBub2RlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgcGVuZGluZyBBSU8gb3BlcmF0aW9ucywgZG9uJ3QgaW52b2tlIGNhbGxiYWNrcy4KKyAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIG5vIEFJTyByZXF1ZXN0cywgcWVtdV9haW9fd2FpdCgpIHdvdWxkCisgICAgICAgICAgICAgKiB3YWl0IGluZGVmaW5pdGVseS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG5vZGUtPmlvX2ZsdXNoICYmIG5vZGUtPmlvX2ZsdXNoKG5vZGUtPm9wYXF1ZSkgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCFub2RlLT5kZWxldGVkICYmIG5vZGUtPmlvX3JlYWQpIHsKKyAgICAgICAgICAgICAgICBpb2xvb3Blcl9hZGRfcmVhZChsb29wZXIsIG5vZGUtPmZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCAmJiBub2RlLT5pb193cml0ZSkgeworICAgICAgICAgICAgICAgIGlvbG9vcGVyX2FkZF93cml0ZShsb29wZXIsIG5vZGUtPmZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdhbGtpbmdfaGFuZGxlcnMgPSAwOworCisgICAgICAgIC8qIE5vIEFJTyBvcGVyYXRpb25zPyBHZXQgdXMgb3V0IG9mIGhlcmUgKi8KKyAgICAgICAgaWYgKCFpb2xvb3Blcl9oYXNfb3BlcmF0aW9ucyhsb29wZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdhaXQgdW50aWwgbmV4dCBldmVudCAqLworICAgICAgICByZXQgPSBpb2xvb3Blcl93YWl0KGxvb3BlciwgLTEpOworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgYW55IHJlYWRhYmxlIGZkcywgZGlzcGF0Y2ggZXZlbnQgKi8KKyAgICAgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIHdhbGtpbmdfaGFuZGxlcnMgPSAxOworCisgICAgICAgICAgICAvKiB3ZSBoYXZlIHRvIHdhbGsgdmVyeSBjYXJlZnVsbHkgaW4gY2FzZQorICAgICAgICAgICAgICogcWVtdV9haW9fc2V0X2ZkX2hhbmRsZXIgaXMgY2FsbGVkIHdoaWxlIHdlJ3JlIHdhbGtpbmcgKi8KKyAgICAgICAgICAgIG5vZGUgPSBRTElTVF9GSVJTVCgmYWlvX2hhbmRsZXJzKTsKKyAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICAgICAgQWlvSGFuZGxlciAqdG1wOworCisgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5kZWxldGVkICYmCisgICAgICAgICAgICAgICAgICAgIGlvbG9vcGVyX2lzX3JlYWQobG9vcGVyLCBub2RlLT5mZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+aW9fcmVhZCkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5pb19yZWFkKG5vZGUtPm9wYXF1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCAmJgorICAgICAgICAgICAgICAgICAgICBpb2xvb3Blcl9pc193cml0ZShsb29wZXIsIG5vZGUtPmZkKSAmJgorICAgICAgICAgICAgICAgICAgICBub2RlLT5pb193cml0ZSkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5pb193cml0ZShub2RlLT5vcGFxdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcCA9IG5vZGU7CisgICAgICAgICAgICAgICAgbm9kZSA9IFFMSVNUX05FWFQobm9kZSwgbm9kZSk7CisKKyAgICAgICAgICAgICAgICBpZiAodG1wLT5kZWxldGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFFMSVNUX1JFTU9WRSh0bXAsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICBnX2ZyZWUodG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdhbGtpbmdfaGFuZGxlcnMgPSAwOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0ID09IDApOworCisgICAgaW9sb29wZXJfZnJlZShsb29wZXIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9haW8uYyBiL2FuZHJvaWQvcWVtdTEvYWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzMDMwZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYWlvLmMKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBRRU1VIGFpbyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiYmxvY2svYmxvY2suaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS9zb2NrZXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFpb0hhbmRsZXIgQWlvSGFuZGxlcjsKKworLyogVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBBSU8gaGFuZGxlcnMgKi8KK3N0YXRpYyBRTElTVF9IRUFEKCwgQWlvSGFuZGxlcikgYWlvX2hhbmRsZXJzOworCisvKiBUaGlzIGlzIGEgc2ltcGxlIGxvY2sgdXNlZCB0byBwcm90ZWN0IHRoZSBhaW9faGFuZGxlcnMgbGlzdC4gIFNwZWNpZmljYWxseSwKKyAqIGl0J3MgdXNlZCB0byBlbnN1cmUgdGhhdCBubyBjYWxsYmFja3MgYXJlIHJlbW92ZWQgd2hpbGUgd2UncmUgd2Fsa2luZyBhbmQKKyAqIGRpc3BhdGNoaW5nIGNhbGxiYWNrcy4KKyAqLworc3RhdGljIGludCB3YWxraW5nX2hhbmRsZXJzOworCitzdHJ1Y3QgQWlvSGFuZGxlcgoreworICAgIGludCBmZDsKKyAgICBJT0hhbmRsZXIgKmlvX3JlYWQ7CisgICAgSU9IYW5kbGVyICppb193cml0ZTsKKyAgICBBaW9GbHVzaEhhbmRsZXIgKmlvX2ZsdXNoOworICAgIEFpb1Byb2Nlc3NRdWV1ZSAqaW9fcHJvY2Vzc19xdWV1ZTsKKyAgICBpbnQgZGVsZXRlZDsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgUUxJU1RfRU5UUlkoQWlvSGFuZGxlcikgbm9kZTsKK307CisKK3N0YXRpYyBBaW9IYW5kbGVyICpmaW5kX2Fpb19oYW5kbGVyKGludCBmZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworCisgICAgUUxJU1RfRk9SRUFDSChub2RlLCAmYWlvX2hhbmRsZXJzLCBub2RlKSB7CisgICAgICAgIGlmIChub2RlLT5mZCA9PSBmZCkKKyAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IHFlbXVfYWlvX3NldF9mZF9oYW5kbGVyKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmlvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICppb193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaW9GbHVzaEhhbmRsZXIgKmlvX2ZsdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFpb1Byb2Nlc3NRdWV1ZSAqaW9fcHJvY2Vzc19xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgQWlvSGFuZGxlciAqbm9kZTsKKworICAgIG5vZGUgPSBmaW5kX2Fpb19oYW5kbGVyKGZkKTsKKworICAgIC8qIEFyZSB3ZSBkZWxldGluZyB0aGUgZmQgaGFuZGxlcj8gKi8KKyAgICBpZiAoIWlvX3JlYWQgJiYgIWlvX3dyaXRlKSB7CisgICAgICAgIGlmIChub2RlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGUgbG9jayBpcyBoZWxkLCBqdXN0IG1hcmsgdGhlIG5vZGUgYXMgZGVsZXRlZCAqLworICAgICAgICAgICAgaWYgKHdhbGtpbmdfaGFuZGxlcnMpCisgICAgICAgICAgICAgICAgbm9kZS0+ZGVsZXRlZCA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBPdGhlcndpc2UsIGRlbGV0ZSBpdCBmb3IgcmVhbC4gIFdlIGNhbid0IGp1c3QgbWFyayBpdCBhcworICAgICAgICAgICAgICAgICAqIGRlbGV0ZWQgYmVjYXVzZSBkZWxldGVkIG5vZGVzIGFyZSBvbmx5IGNsZWFuZWQgdXAgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgKiByZWxlYXNpbmcgdGhlIHdhbGtpbmdfaGFuZGxlcnMgbG9jay4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBRTElTVF9SRU1PVkUobm9kZSwgbm9kZSk7CisgICAgICAgICAgICAgICAgZ19mcmVlKG5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogQWxsb2MgYW5kIGluc2VydCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlICovCisgICAgICAgICAgICBub2RlID0gZ19tYWxsb2MwKHNpemVvZihBaW9IYW5kbGVyKSk7CisgICAgICAgICAgICBub2RlLT5mZCA9IGZkOworICAgICAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQoJmFpb19oYW5kbGVycywgbm9kZSwgbm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogVXBkYXRlIGhhbmRsZXIgd2l0aCBsYXRlc3QgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgbm9kZS0+aW9fcmVhZCA9IGlvX3JlYWQ7CisgICAgICAgIG5vZGUtPmlvX3dyaXRlID0gaW9fd3JpdGU7CisgICAgICAgIG5vZGUtPmlvX2ZsdXNoID0gaW9fZmx1c2g7CisgICAgICAgIG5vZGUtPmlvX3Byb2Nlc3NfcXVldWUgPSBpb19wcm9jZXNzX3F1ZXVlOworICAgICAgICBub2RlLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgfQorCisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIoZmQsIE5VTEwsIGlvX3JlYWQsIGlvX3dyaXRlLCBvcGFxdWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcWVtdV9haW9fZmx1c2godm9pZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworICAgIGludCByZXQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IDA7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBwZW5kaW5nIGVtdWxhdGVkIGFpbyBzdGFydCB0aGVtIG5vdyBzbyBmbHVzaAorCSAqIHdpbGwgYmUgYWJsZSB0byByZXR1cm4gMS4KKwkgKi8KKyAgICAgICAgcWVtdV9haW9fd2FpdCgpOworCisgICAgICAgIFFMSVNUX0ZPUkVBQ0gobm9kZSwgJmFpb19oYW5kbGVycywgbm9kZSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlvX2ZsdXNoKSB7CisgICAgICAgICAgICAgICAgcmV0IHw9IG5vZGUtPmlvX2ZsdXNoKG5vZGUtPm9wYXF1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChxZW11X2JoX3BvbGwoKSB8fCByZXQgPiAwKTsKK30KKworaW50IHFlbXVfYWlvX3Byb2Nlc3NfcXVldWUodm9pZCkKK3sKKyAgICBBaW9IYW5kbGVyICpub2RlOworICAgIGludCByZXQgPSAwOworCisgICAgd2Fsa2luZ19oYW5kbGVycyA9IDE7CisKKyAgICBRTElTVF9GT1JFQUNIKG5vZGUsICZhaW9faGFuZGxlcnMsIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUtPmlvX3Byb2Nlc3NfcXVldWUpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5pb19wcm9jZXNzX3F1ZXVlKG5vZGUtPm9wYXF1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgd2Fsa2luZ19oYW5kbGVycyA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHFlbXVfYWlvX3dhaXQodm9pZCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHFlbXVfYmhfcG9sbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvKgorICAgICAqIElmIHRoZXJlIGFyZSBjYWxsYmFja3MgbGVmdCB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQsIHdlIG5lZWQgdG8gY2FsbCB0aGVuLgorICAgICAqIFJldHVybiBhZnRlcndhcmRzIHRvIGF2b2lkIHdhaXRpbmcgbmVlZGxlc3NseSBpbiBzZWxlY3QoKS4KKyAgICAgKi8KKyAgICBpZiAocWVtdV9haW9fcHJvY2Vzc19xdWV1ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBkbyB7CisgICAgICAgIEFpb0hhbmRsZXIgKm5vZGU7CisgICAgICAgIGZkX3NldCByZGZkcywgd3JmZHM7CisgICAgICAgIGludCBtYXhfZmQgPSAtMTsKKworICAgICAgICB3YWxraW5nX2hhbmRsZXJzID0gMTsKKworICAgICAgICBGRF9aRVJPKCZyZGZkcyk7CisgICAgICAgIEZEX1pFUk8oJndyZmRzKTsKKworICAgICAgICAvKiBmaWxsIGZkIHNldHMgKi8KKyAgICAgICAgUUxJU1RfRk9SRUFDSChub2RlLCAmYWlvX2hhbmRsZXJzLCBub2RlKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgcGVuZGluZyBBSU8gb3BlcmF0aW9ucywgZG9uJ3QgaW52b2tlIGNhbGxiYWNrcy4KKyAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaWYgdGhlcmUgYXJlIG5vIEFJTyByZXF1ZXN0cywgcWVtdV9haW9fd2FpdCgpIHdvdWxkCisgICAgICAgICAgICAgKiB3YWl0IGluZGVmaW5pdGVseS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG5vZGUtPmlvX2ZsdXNoICYmIG5vZGUtPmlvX2ZsdXNoKG5vZGUtPm9wYXF1ZSkgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCFub2RlLT5kZWxldGVkICYmIG5vZGUtPmlvX3JlYWQpIHsKKyAgICAgICAgICAgICAgICBGRF9TRVQobm9kZS0+ZmQsICZyZGZkcyk7CisgICAgICAgICAgICAgICAgbWF4X2ZkID0gTUFYKG1heF9mZCwgbm9kZS0+ZmQgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCAmJiBub2RlLT5pb193cml0ZSkgeworICAgICAgICAgICAgICAgIEZEX1NFVChub2RlLT5mZCwgJndyZmRzKTsKKyAgICAgICAgICAgICAgICBtYXhfZmQgPSBNQVgobWF4X2ZkLCBub2RlLT5mZCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2Fsa2luZ19oYW5kbGVycyA9IDA7CisKKyAgICAgICAgLyogTm8gQUlPIG9wZXJhdGlvbnM/ICBHZXQgdXMgb3V0IG9mIGhlcmUgKi8KKyAgICAgICAgaWYgKG1heF9mZCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHdhaXQgdW50aWwgbmV4dCBldmVudCAqLworICAgICAgICByZXQgPSBzZWxlY3QobWF4X2ZkLCAmcmRmZHMsICZ3cmZkcywgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvKiBpZiB3ZSBoYXZlIGFueSByZWFkYWJsZSBmZHMsIGRpc3BhdGNoIGV2ZW50ICovCisgICAgICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICB3YWxraW5nX2hhbmRsZXJzID0gMTsKKworICAgICAgICAgICAgLyogd2UgaGF2ZSB0byB3YWxrIHZlcnkgY2FyZWZ1bGx5IGluIGNhc2UKKyAgICAgICAgICAgICAqIHFlbXVfYWlvX3NldF9mZF9oYW5kbGVyIGlzIGNhbGxlZCB3aGlsZSB3ZSdyZSB3YWxraW5nICovCisgICAgICAgICAgICBub2RlID0gUUxJU1RfRklSU1QoJmFpb19oYW5kbGVycyk7CisgICAgICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgICAgIEFpb0hhbmRsZXIgKnRtcDsKKworICAgICAgICAgICAgICAgIGlmICghbm9kZS0+ZGVsZXRlZCAmJgorICAgICAgICAgICAgICAgICAgICBGRF9JU1NFVChub2RlLT5mZCwgJnJkZmRzKSAmJgorICAgICAgICAgICAgICAgICAgICBub2RlLT5pb19yZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmlvX3JlYWQobm9kZS0+b3BhcXVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLT5kZWxldGVkICYmCisgICAgICAgICAgICAgICAgICAgIEZEX0lTU0VUKG5vZGUtPmZkLCAmd3JmZHMpICYmCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmlvX3dyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmlvX3dyaXRlKG5vZGUtPm9wYXF1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wID0gbm9kZTsKKyAgICAgICAgICAgICAgICBub2RlID0gUUxJU1RfTkVYVChub2RlLCBub2RlKTsKKworICAgICAgICAgICAgICAgIGlmICh0bXAtPmRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUUxJU1RfUkVNT1ZFKHRtcCwgbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGdfZnJlZSh0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2Fsa2luZ19oYW5kbGVycyA9IDA7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChyZXQgPT0gMCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9hbmRyb2lkX3FlbXVkLmNwcCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2FuZHJvaWRfcWVtdWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNDYyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9hbmRyb2lkX3FlbXVkLmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9hbmRyb2lkX3FlbXVkLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9hbmRyb2lkX3FlbXVkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ody1xZW11ZC5oIgorI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS91dGlscy9zdHJlYW0uaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgIm1pZ3JhdGlvbi92bXN0YXRlLmgiCit9CisKKy8qIFZlcnNpb24gbnVtYmVyIG9mIHNuYXBzaG90cyBjb2RlLiBJbmNyZW1lbnQgd2hlbmV2ZXIgdGhlIGRhdGEgc2F2ZWQKKyAqIG9yIHRoZSBsYXlvdXQgaW4gd2hpY2ggaXQgaXMgc2F2ZWQgaXMgY2hhbmdlZC4KKyAqLworI2RlZmluZSBRRU1VRF9TQVZFX1ZFUlNJT04gMgorCitzdGF0aWMgdm9pZCBxZW11ZF9zYXZlKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUpIHsKKyAgICBTdHJlYW0qIHN0cmVhbSA9IHN0cmVhbV9mcm9tX3FlbXVmaWxlKGYpOworICAgIFFlbXVkTXVsdGlwbGV4ZXIqIG0gPSBzdGF0aWNfY2FzdDxRZW11ZE11bHRpcGxleGVyKj4ob3BhcXVlKTsKKyAgICBxZW11ZF9tdWx0aXBsZXhlcl9zYXZlKG0sIHN0cmVhbSk7CisgICAgc3RyZWFtX2ZyZWUoc3RyZWFtKTsKK30KKworc3RhdGljIGludCBxZW11ZF9sb2FkKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUsIGludCB2ZXJzaW9uKSB7CisgICAgU3RyZWFtKiBzdHJlYW0gPSBzdHJlYW1fZnJvbV9xZW11ZmlsZShmKTsKKyAgICBRZW11ZE11bHRpcGxleGVyKiBtID0gc3RhdGljX2Nhc3Q8UWVtdWRNdWx0aXBsZXhlcio+KG9wYXF1ZSk7CisgICAgaW50IHJldCA9IHFlbXVkX211bHRpcGxleGVyX2xvYWQobSwgc3RyZWFtLCB2ZXJzaW9uKTsKKyAgICBzdHJlYW1fZnJlZShzdHJlYW0pOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYW5kcm9pZF9xZW11MV9xZW11ZF9pbml0KHZvaWQpIHsKKyAgICAodm9pZCkgYW5kcm9pZF9xZW11ZF9nZXRfc2VyaWFsX2xpbmUoKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAicWVtdWQiLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICBRRU1VRF9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIHFlbXVkX3NhdmUsCisgICAgICAgICAgICAgICAgICAgIHFlbXVkX2xvYWQsCisgICAgICAgICAgICAgICAgICAgIHFlbXVkX211bHRpcGxleGVyKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2FuZHJvaWRfcWVtdWQuaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2FuZHJvaWRfcWVtdWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE2MDVjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYW5kcm9pZF9xZW11ZC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIEluaXRpYWxpemUgdGhlIHFlbXVkIHNlcnZpY2UgZm9yIHVzZSBpbiBRRU1VMQorICovCitleHRlcm4gdm9pZCBhbmRyb2lkX3FlbXUxX3FlbXVkX2luaXQodm9pZCk7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5jIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OWVjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9hdWRpby10ZXN0LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImF1ZGlvL2F1ZGlvLmgiCisKKy8qIFRoaXMgc291cmNlIGZpbGUgY29udGFpbnMgYSBzbWFsbCB0ZXN0IGF1ZGlvIHZpcnR1YWwgZGV2aWNlIHRoYXQKKyAqIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoYXQgdGhlIGVtdWxhdG9yIHByb3Blcmx5IHBsYXlzIHNvdW5kIG9uCisgKiB0aGUgaG9zdCBzeXN0ZW0gd2l0aG91dCBoYXZpbmcgdG8gYm9vdCBhIGZ1bGwgc3lzdGVtLgorICovCisKKyNkZWZpbmUgU0FNUExFX1NJWkUgIDE2Mzg0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBRRU1VU291bmRDYXJkICBjYXJkOworICAgIFNXVm9pY2VPdXQgICAgKnZvaWNlOworICAgIGludCAgICAgICAgICAgIHBvczsKKyAgICBzaG9ydCAgICAgICAgICBzYW1wbGVbU0FNUExFX1NJWkVdOworfSBUZXN0QXVkaW87CisKK3N0YXRpYyB2b2lkCit0ZXN0QXVkaW9fYXVkaW9fY2FsbGJhY2sodm9pZCogb3BhcXVlLCBpbnQgZnJlZSkKK3sKKyAgICBUZXN0QXVkaW8qIHRhID0gb3BhcXVlOworCisgICAgLy9wcmludGYoIiVzOiBwb3M9JWQgZnJlZT0lZFxuIiwgX19GVU5DVElPTl9fLCB0YS0+cG9zLCBmcmVlKTsKKworICAgIHdoaWxlIChmcmVlID4gMCkgeworICAgICAgICBpbnQgIGF2YWlsID0gU0FNUExFX1NJWkUgLSB0YS0+cG9zOworICAgICAgICBpZiAoYXZhaWwgPiBmcmVlKQorICAgICAgICAgICAgYXZhaWwgPSBmcmVlOworCisgICAgICAgIEFVRF93cml0ZSh0YS0+dm9pY2UsIHRhLT5zYW1wbGUgKyB0YS0+cG9zLCBhdmFpbCk7CisgICAgICAgIHRhLT5wb3MgKz0gYXZhaWw7CisgICAgICAgIGlmICh0YS0+cG9zID49IFNBTVBMRV9TSVpFKQorICAgICAgICAgICAgdGEtPnBvcyA9IDA7CisKKyAgICAgICAgZnJlZSAtPSBhdmFpbDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RBdWRpb19pbml0KCBUZXN0QXVkaW8qIHRhICkKK3sKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3MgYXM7CisKKyAgICBBVURfcmVnaXN0ZXJfY2FyZCgidGVzdF9hdWRpbyIsICZ0YS0+Y2FyZCk7CisKKyAgICBhcy5mcmVxICAgICAgID0gMTYwMDA7CisgICAgYXMubmNoYW5uZWxzICA9IDE7CisgICAgYXMuZm10ICAgICAgICA9IEFVRF9GTVRfUzE2OworICAgIGFzLmVuZGlhbm5lc3MgPSBBVURJT19IT1NUX0VORElBTk5FU1M7CisKKyAgICB0YS0+dm9pY2UgPSBBVURfb3Blbl9vdXQoCisgICAgICAgICZ0YS0+Y2FyZCwKKyAgICAgICAgdGEtPnZvaWNlLAorICAgICAgICAidGVzdF9hdWRpbyIsCisgICAgICAgIHRhLAorICAgICAgICB0ZXN0QXVkaW9fYXVkaW9fY2FsbGJhY2ssCisgICAgICAgICZhcyk7CisKKyAgICBpZiAoIXRhLT52b2ljZSkgeworICAgICAgICBkcHJpbnQoIkNhbm5vdCBvcGVuIHRlc3QgYXVkaW8hIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdGEtPnBvcyA9IDA7CisKKyAgICAvKiBJbml0aWFsaXplIHNhbXBsZXMgKi8KKyAgICBpbnQgbm47CisgICAgZm9yIChubiA9IDA7IG5uIDwgU0FNUExFX1NJWkU7IG5uKyspIHsKKyAgICAgICAgdGEtPnNhbXBsZVtubl0gPSAoc2hvcnQpKCgobm4gJSAoU0FNUExFX1NJWkUvNCkpKjY1NTM2LyhTQU1QTEVfU0laRS80KSkgJiAweGZmZmYpOworICAgIH0KKworICAgIEFVRF9zZXRfYWN0aXZlX291dCh0YS0+dm9pY2UsIDEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgVGVzdEF1ZGlvKiAgdGVzdEF1ZGlvOworCitpbnQKK2FuZHJvaWRfYXVkaW9fdGVzdF9zdGFydF9vdXQodm9pZCkKK3sKKyAgICBpZiAoIXRlc3RBdWRpbykgeworICAgICAgICB0ZXN0QXVkaW8gPSBtYWxsb2Moc2l6ZW9mKCp0ZXN0QXVkaW8pKTsKKyAgICAgICAgaWYgKHRlc3RBdWRpb19pbml0KHRlc3RBdWRpbykgPCAwKSB7CisgICAgICAgICAgICBmcmVlKHRlc3RBdWRpbyk7CisgICAgICAgICAgICB0ZXN0QXVkaW8gPSBOVUxMOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc3RhcnQgYXVkaW8gdGVzdCFcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJBdWRpbyB0ZXN0IHN0YXJ0ZWQhXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2F1ZGlvLXRlc3QuaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2F1ZGlvLXRlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ViNTFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisvKiBTdGFydCB0aGUgYXVkaW8gdGVzdCBvdXRwdXQsIHRoaXMgd2lsbCByZWdpc3RlciBhIHZpcnR1YWwgc291bmQKKyAqIGRldmljZSB0aGF0IHNlbmRzIGEgc2F3IHNpZ25hbCB0byB0aGUgYXVkaW8gc3ViLXN5c3RlbS4gVGhpcyBpcworICogdXNlZCB0byB0ZXN0IHRoYXQgdGhlIGF1ZGlvIGJhY2tlbmQgd29ya3Mgd2l0aG91dCBoYXZpbmcgdG8gYm9vdAorICogYSBmdWxsIHN5c3RlbSBhbmQgbGF1bmNoIGEgbXVzaWMgYXBwbGljYXRpb24uCisgKi8KK2V4dGVybiBpbnQgYW5kcm9pZF9hdWRpb190ZXN0X3N0YXJ0X291dCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2Jhc2UvYXN5bmMvTG9vcGVyLmNwcCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2Jhc2UvYXN5bmMvTG9vcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc1MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9hc3luYy9Mb29wZXIuY3BwCkBAIC0wLDAgKzEsMzQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2FzeW5jL0xvb3Blci5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYmFzZS9jb250YWluZXJzL1RhaWxRdWV1ZUxpc3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvY29udGFpbmVycy9TY29wZWRQb2ludGVyU2V0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL3NvY2tldHMvU29ja2V0VXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCit9ICAvLyBleHRlcm4gIkMiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBxZW11IHsKKworbmFtZXNwYWNlIHsKKworZXh0ZXJuICJDIiB2b2lkIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3Qodm9pZCk7CisKK3R5cGVkZWYgOjphbmRyb2lkOjpiYXNlOjpMb29wZXIgQmFzZUxvb3BlcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpiYXNlOjpMb29wZXI6OlRpbWVyIEJhc2VUaW1lcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpiYXNlOjpMb29wZXI6OkZkV2F0Y2ggQmFzZUZkV2F0Y2g7CisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmJhc2U6Okxvb3BlciBvbiB0b3Agb2YgdGhlIFFFTVUgbWFpbgorLy8gZXZlbnQgbG9vcC4gVGhlcmUgYXJlIGZldyBpbXBvcnRhbnQgdGhpbmdzIGhlcmU6CisvLworLy8gIDEvIFRoZXJlIGlzIGEgc2luZ2xlIGdsb2JhbCBRRU1VIGV2ZW50IGxvb3AsIHNvIGFsbCBpbnN0YW5jZXMgcmV0dXJuZWQKKy8vICAgICBieSBjcmVhdGVMb29wZXIoKSB3aWxsIHJlYWxseSB1c2UgdGhlIHNhbWUgc3RhdGUhCisvLworLy8gICAgIEluIG90aGVyIHdvcmRzLCBkb24ndCBjYWxsIGl0IG1vcmUgdGhhbiBvbmNlIQorLy8KKy8vICAyLyBJdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCB0aGUgcnVuV2l0aERlYWRsaW5lTXMoKSBtZXRob2QsIHNpbmNlCisvLyAgICAgdGhlIGV2ZW50IGxvb3AgaXMgc3RhcnRlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZCBieQorLy8gICAgIHRoZSBleGVjdXRhYmxlLgorLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgYm90dG9tLWhhbGYgaGFuZGxlciB0byBwcm9jZXNzIHBlbmRpbmcKKy8vIEZkV2F0Y2ggaW5zdGFuY2VzLCBzZWUgdGhlIGNvbW1lbnQgaW4gdGhlIGRlY2xhcmF0aW9uIG9mIEZkV2F0Y2gKKy8vIGJlbG93IHRvIHVuZGVyc3RhbmQgd2h5LgorLy8KK2NsYXNzIFFlbXVMb29wZXIgOiBwdWJsaWMgQmFzZUxvb3BlciB7CitwdWJsaWM6CisgICAgUWVtdUxvb3BlcigpIDoKKyAgICAgICAgICAgIExvb3BlcigpLAorICAgICAgICAgICAgbVFlbXVCaChOVUxMKSwKKyAgICAgICAgICAgIG1GZFdhdGNoZXMoKSwKKyAgICAgICAgICAgIG1QZW5kaW5nRmRXYXRjaGVzKCksCisgICAgICAgICAgICBtVGltZXJzKCkgeworICAgICAgICBtUWVtdUJoID0gcWVtdV9iaF9uZXcoaGFuZGxlQm90dG9tSGFsZiwgdGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB+UWVtdUxvb3BlcigpIHsKKyAgICAgICAgcWVtdV9iaF9kZWxldGUobVFlbXVCaCk7CisgICAgfQorCisgICAgc3RhdGljIFFFTVVDbG9ja1R5cGUgdG9RZW11Q2xvY2tUeXBlKENsb2NrVHlwZSBjbG9jaykgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KChpbnQpIFFFTVVfQ0xPQ0tfSE9TVCA9PSAoaW50KSBCYXNlTG9vcGVyOjpDbG9ja1R5cGU6OmtIb3N0ICYmCisgICAgICAgICAgICAgICAgICAgICAgKGludCkgUUVNVV9DTE9DS19WSVJUVUFMID09IChpbnQpIEJhc2VMb29wZXI6OkNsb2NrVHlwZTo6a1ZpcnR1YWwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KSBRRU1VX0NMT0NLX1JFQUxUSU1FID09IChpbnQpIEJhc2VMb29wZXI6OkNsb2NrVHlwZTo6a1JlYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZXMgaW4gdGhlIExvb3Blcjo6Q2xvY2tUeXBlIGVudW1lcmF0aW9uIGFyZSBvdXQgb2Ygc3luYyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRRU1VQ2xvY2tUeXBlIik7CisKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFFFTVVDbG9ja1R5cGU+KGNsb2NrKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEYgRCAgIFcgQSBUIEMgSCBFIFMKKyAgICAvLworCisgICAgLy8gSW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIFFFTVUgdXNlcworICAgIC8vIGRpc3RpbmN0IGNhbGxiYWNrIGZ1bmN0aW9ucyBmb3IgcmVhZC93cml0ZSBldmVudHMsIHNvIHVzZSBhIHBlbmRpbmcKKyAgICAvLyBsaXN0IHRvIGNvbGxlY3QgYWxsIEZkV2F0Y2ggaW5zdGFuY2VzIHRoYXQgaGF2ZSByZWNlaXZlZCBhbnkgb2Ygc3VjaAorICAgIC8vIGNhbGwsIHRoZW4gbGF0ZXIgcHJvY2VzcyBpdC4KKworICAgIGNsYXNzIEZkV2F0Y2ggOiBwdWJsaWMgQmFzZUZkV2F0Y2ggeworICAgIHB1YmxpYzoKKyAgICAgICAgRmRXYXRjaChRZW11TG9vcGVyKiBsb29wZXIsCisgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgIEJhc2VGZFdhdGNoOjpDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VGZFdhdGNoKGxvb3BlciwgZmQsIGNhbGxiYWNrLCBvcGFxdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVdhbnRlZEV2ZW50cygwVSksCisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0V2ZW50cygwVSksCisgICAgICAgICAgICAgICAgICAgICAgICBtTGluaygpIHsKKyAgICAgICAgICAgIGxvb3Blci0+YWRkRmRXYXRjaCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkZkV2F0Y2goKSB7CisgICAgICAgICAgICBjbGVhclBlbmRpbmcoKTsKKyAgICAgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIobUZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGFzUWVtdUxvb3BlcihtTG9vcGVyKS0+ZGVsRmRXYXRjaCh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRFdmVudHModW5zaWduZWQgZXZlbnRzKSB7CisgICAgICAgICAgICBldmVudHMgJj0ga0V2ZW50TWFzazsKKyAgICAgICAgICAgIHVwZGF0ZUV2ZW50cyhtV2FudGVkRXZlbnRzIHwgZXZlbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCByZW1vdmVFdmVudHModW5zaWduZWQgZXZlbnRzKSB7CisgICAgICAgICAgICBldmVudHMgJj0ga0V2ZW50TWFzazsKKyAgICAgICAgICAgIHVwZGF0ZUV2ZW50cyhtV2FudGVkRXZlbnRzICYgfmV2ZW50cyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIHBvbGwoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVBlbmRpbmdFdmVudHM7CisgICAgICAgIH0KKworICAgICAgICBib29sIGlzUGVuZGluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtUGVuZGluZ0V2ZW50cyAhPSAwVTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmlyZSgpIHsKKyAgICAgICAgICAgIERDSEVDSyhtUGVuZGluZ0V2ZW50cyk7CisgICAgICAgICAgICB1bnNpZ25lZCBldmVudHMgPSBtUGVuZGluZ0V2ZW50czsKKyAgICAgICAgICAgIG1QZW5kaW5nRXZlbnRzID0gMFU7CisgICAgICAgICAgICBtQ2FsbGJhY2sobU9wYXF1ZSwgbUZkLCBldmVudHMpOworICAgICAgICB9CisKKyAgICAgICAgVEFJTF9RVUVVRV9MSVNUX1RSQUlUUyhUcmFpdHMsIEZkV2F0Y2gsIG1MaW5rKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdXBkYXRlRXZlbnRzKHVuc2lnbmVkIGV2ZW50cykgeworICAgICAgICAgICAgSU9IYW5kbGVyKiBjYlJlYWQgPSAoZXZlbnRzICYga0V2ZW50UmVhZCkgPyBoYW5kbGVSZWFkIDogTlVMTDsKKyAgICAgICAgICAgIElPSGFuZGxlciogY2JXcml0ZSA9IChldmVudHMgJiBrRXZlbnRXcml0ZSkgPyBoYW5kbGVXcml0ZSA6IE5VTEw7CisgICAgICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyKG1GZCwgY2JSZWFkLCBjYldyaXRlLCB0aGlzKTsKKyAgICAgICAgICAgIG1XYW50ZWRFdmVudHMgPSBldmVudHM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBlbmRpbmcodW5zaWduZWQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmICghbVBlbmRpbmdFdmVudHMpIHsKKyAgICAgICAgICAgICAgICBhc1FlbXVMb29wZXIobUxvb3BlciktPmFkZFBlbmRpbmdGZFdhdGNoKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBlbmRpbmdFdmVudHMgfD0gZXZlbnQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyUGVuZGluZygpIHsKKyAgICAgICAgICAgIGlmIChtUGVuZGluZ0V2ZW50cykgeworICAgICAgICAgICAgICAgIGFzUWVtdUxvb3BlcihtTG9vcGVyKS0+ZGVsUGVuZGluZ0ZkV2F0Y2godGhpcyk7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdFdmVudHMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbGVkIGJ5IFFFTVUgb24gYSByZWFkIGkvbyBldmVudC4gfG9wYXF1ZXwgaXMgYSBGZFdhdGNoIGhhbmRsZS4KKyAgICAgICAgc3RhdGljIHZvaWQgaGFuZGxlUmVhZCh2b2lkKiBvcGFxdWUpIHsKKyAgICAgICAgICAgIEZkV2F0Y2gqIHdhdGNoID0gc3RhdGljX2Nhc3Q8RmRXYXRjaCo+KG9wYXF1ZSk7CisgICAgICAgICAgICB3YXRjaC0+c2V0UGVuZGluZyhrRXZlbnRSZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGxlZCBieSBRRU1VIG9uIGEgd3JpdGUgaS9vIGV2ZW50LiB8b3BhcXVlfCBpcyBhIEZkV2F0Y2ggaGFuZGxlLgorICAgICAgICBzdGF0aWMgdm9pZCBoYW5kbGVXcml0ZSh2b2lkKiBvcGFxdWUpIHsKKyAgICAgICAgICAgIEZkV2F0Y2gqIHdhdGNoID0gc3RhdGljX2Nhc3Q8RmRXYXRjaCo+KG9wYXF1ZSk7CisgICAgICAgICAgICB3YXRjaC0+c2V0UGVuZGluZyhrRXZlbnRXcml0ZSk7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBtV2FudGVkRXZlbnRzOworICAgICAgICB1bnNpZ25lZCBtUGVuZGluZ0V2ZW50czsKKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpUYWlsUXVldWVMaW5rPEZkV2F0Y2g+IG1MaW5rOworICAgIH07CisKKyAgICB2aXJ0dWFsIEJhc2VGZFdhdGNoKiBjcmVhdGVGZFdhdGNoKGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VGZFdhdGNoOjpDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG9wYXF1ZSkgeworICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OnNvY2tldFNldE5vbkJsb2NraW5nKGZkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGZFdhdGNoKHRoaXMsIGZkLCBjYWxsYmFjaywgb3BhcXVlKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFQgSSBNIEUgUiBTCisgICAgLy8KKyAgICBjbGFzcyBUaW1lciA6IHB1YmxpYyBCYXNlVGltZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGltZXIoUWVtdUxvb3BlciogbG9vcGVyLAorICAgICAgICAgICAgICBCYXNlVGltZXI6OkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsIENsb2NrVHlwZSBjbG9jaykgOgorICAgICAgICAgICAgICAgICAgICBCYXNlVGltZXIobG9vcGVyLCBjYWxsYmFjaywgb3BhcXVlLCBjbG9jayksCisgICAgICAgICAgICAgICAgICAgIG1UaW1lcihOVUxMKSB7CisgICAgICAgICAgICBtVGltZXIgPSA6OnRpbWVyX25ldyhRZW11TG9vcGVyOjp0b1FlbXVDbG9ja1R5cGUobUNsb2NrVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRV9NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVUaW1lckNhbGxiYWNrQWRhcHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgflRpbWVyKCkgeworICAgICAgICAgICAgOjp0aW1lcl9mcmVlKG1UaW1lcik7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc3RhcnRSZWxhdGl2ZShEdXJhdGlvbiB0aW1lb3V0X21zKSB7CisgICAgICAgICAgICBpZiAodGltZW91dF9tcyA9PSBrRHVyYXRpb25JbmZpbml0ZSkgeworICAgICAgICAgICAgICAgIHRpbWVyX2RlbChtVGltZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0X21zICs9IHFlbXVfY2xvY2tfZ2V0X21zKAorICAgICAgICAgICAgICAgICAgICAgICAgUWVtdUxvb3Blcjo6dG9RZW11Q2xvY2tUeXBlKG1DbG9ja1R5cGUpKTsKKyAgICAgICAgICAgICAgICB0aW1lcl9tb2QobVRpbWVyLCB0aW1lb3V0X21zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzdGFydEFic29sdXRlKER1cmF0aW9uIGRlYWRsaW5lX21zKSB7CisgICAgICAgICAgICBpZiAoZGVhZGxpbmVfbXMgPT0ga0R1cmF0aW9uSW5maW5pdGUpIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kZWwobVRpbWVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZXJfbW9kKG1UaW1lciwgZGVhZGxpbmVfbXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICA6OnRpbWVyX2RlbChtVGltZXIpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzQWN0aXZlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVyX3BlbmRpbmcobVRpbWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2F2ZShhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgY29uc3QgeworICAgICAgICAgICAgdGltZXJfcHV0KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZDo6cWVtdTo6UWVtdUZpbGVTdHJlYW0qPihzdHJlYW0pLT5maWxlKCksCisgICAgICAgICAgICAgICAgbVRpbWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgbG9hZChhbmRyb2lkOjpiYXNlOjpTdHJlYW0qIHN0cmVhbSkgeworICAgICAgICAgICAgdGltZXJfZ2V0KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8YW5kcm9pZDo6cWVtdTo6UWVtdUZpbGVTdHJlYW0qPihzdHJlYW0pLT5maWxlKCksCisgICAgICAgICAgICAgICAgbVRpbWVyKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIHZvaWQgcWVtdVRpbWVyQ2FsbGJhY2tBZGFwdGVyKHZvaWQqIG9wYXF1ZSkgeworICAgICAgICAgICAgVGltZXIqIHRpbWVyID0gc3RhdGljX2Nhc3Q8VGltZXIqPihvcGFxdWUpOworICAgICAgICAgICAgdGltZXItPm1DYWxsYmFjayh0aW1lci0+bU9wYXF1ZSwgdGltZXIpOworICAgICAgICB9CisKKyAgICAgICAgUUVNVVRpbWVyKiBtVGltZXI7CisgICAgfTsKKworICAgIHZpcnR1YWwgQmFzZVRpbWVyKiBjcmVhdGVUaW1lcihCYXNlVGltZXI6OkNhbGxiYWNrIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsIENsb2NrVHlwZSBjbG9jaykgeworICAgICAgICByZXR1cm4gbmV3IFFlbXVMb29wZXI6OlRpbWVyKHRoaXMsIGNhbGxiYWNrLCBvcGFxdWUsIGNsb2NrKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vICBMIE8gTyBQIEUgUgorICAgIC8vCisKKyAgICB2aXJ0dWFsIER1cmF0aW9uIG5vd01zKENsb2NrVHlwZSBjbG9ja1R5cGUpIHsKKyAgICAgICAgcmV0dXJuIHFlbXVfY2xvY2tfZ2V0X21zKHRvUWVtdUNsb2NrVHlwZShjbG9ja1R5cGUpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIER1cmF0aW9uTnMgbm93TnMoQ2xvY2tUeXBlIGNsb2NrVHlwZSkgeworICAgICAgICByZXR1cm4gcWVtdV9jbG9ja19nZXRfbnModG9RZW11Q2xvY2tUeXBlKGNsb2NrVHlwZSkpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJ1bldpdGhEZWFkbGluZU1zKER1cmF0aW9uIGRlYWRsaW5lX21zKSB7CisgICAgICAgIENIRUNLKGZhbHNlKSA8PCAiVXNlciBjYW5ub3QgY2FsbCBsb29wZXJfcnVuIG9uIGEgUUVNVSBldmVudCBsb29wIjsKKyAgICAgICAgZXJybm8gPSBFTk9TWVM7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZm9yY2VRdWl0KCkgeworICAgICAgICBxZW11X3N5c3RlbV9zaHV0ZG93bl9yZXF1ZXN0KCk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmJhc2U6OlRhaWxRdWV1ZUxpc3Q8UWVtdUxvb3Blcjo6RmRXYXRjaD4gRmRXYXRjaExpc3Q7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmJhc2U6OlNjb3BlZFBvaW50ZXJTZXQ8RmRXYXRjaD4gRmRXYXRjaFNldDsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6YmFzZTo6U2NvcGVkUG9pbnRlclNldDxUaW1lcj4gVGltZXJTZXQ7CisKKyAgICBzdGF0aWMgaW5saW5lIFFlbXVMb29wZXIqIGFzUWVtdUxvb3BlcihCYXNlTG9vcGVyKiBsb29wZXIpIHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UWVtdUxvb3Blcio+KGxvb3Blcik7CisgICAgfQorCisgICAgdm9pZCBhZGRGZFdhdGNoKEZkV2F0Y2gqIHdhdGNoKSB7CisgICAgICAgIG1GZFdhdGNoZXMuYWRkKHdhdGNoKTsKKyAgICB9CisKKyAgICB2b2lkIGRlbEZkV2F0Y2goRmRXYXRjaCogd2F0Y2gpIHsKKyAgICAgICAgbUZkV2F0Y2hlcy5waWNrKHdhdGNoKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFRpbWVyKFRpbWVyKiB0aW1lcikgeworICAgICAgICBtVGltZXJzLmFkZCh0aW1lcik7CisgICAgfQorCisgICAgdm9pZCBkZWxUaW1lcihUaW1lciogdGltZXIpIHsKKyAgICAgICAgbVRpbWVycy5yZW1vdmUodGltZXIpOworICAgIH0KKworICAgIHZvaWQgYWRkUGVuZGluZ0ZkV2F0Y2goRmRXYXRjaCogd2F0Y2gpIHsKKyAgICAgICAgRENIRUNLKHdhdGNoKTsKKyAgICAgICAgRENIRUNLKCF3YXRjaC0+aXNQZW5kaW5nKCkpOworCisgICAgICAgIGlmIChtUGVuZGluZ0ZkV2F0Y2hlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGJvdHRvbS1oYWxmIGlzIHRyaWdnZXJlZCB0byBhY3Qgb24gcGVuZGluZworICAgICAgICAgICAgLy8gd2F0Y2hlcyBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAgICAgICAgcWVtdV9iaF9zY2hlZHVsZShtUWVtdUJoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1QZW5kaW5nRmRXYXRjaGVzLmluc2VydFRhaWwod2F0Y2gpOworICAgIH0KKworICAgIHZvaWQgZGVsUGVuZGluZ0ZkV2F0Y2goRmRXYXRjaCogd2F0Y2gpIHsKKyAgICAgICAgRENIRUNLKHdhdGNoKTsKKyAgICAgICAgRENIRUNLKHdhdGNoLT5pc1BlbmRpbmcoKSk7CisgICAgICAgIG1QZW5kaW5nRmRXYXRjaGVzLnJlbW92ZSh3YXRjaCk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIGJ5IFFFTVUgYXMgc29vbiBhcyB0aGUgbWFpbiBsb29wIGhhcyBmaW5pc2hlZCBwcm9jZXNzZWQKKyAgICAvLyBJL08gZXZlbnRzLiBVc2VkIHRvIGxvb2sgYXQgcGVuZGluZyB3YXRjaGVzIGFuZCBmaXJlIHRoZW0uCisgICAgc3RhdGljIHZvaWQgaGFuZGxlQm90dG9tSGFsZih2b2lkKiBvcGFxdWUpIHsKKyAgICAgICAgUWVtdUxvb3BlciogbG9vcGVyID0gcmVpbnRlcnByZXRfY2FzdDxRZW11TG9vcGVyKj4ob3BhcXVlKTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgRmRXYXRjaCogd2F0Y2ggPSBsb29wZXItPm1QZW5kaW5nRmRXYXRjaGVzLmZyb250KCk7CisgICAgICAgICAgICBpZiAoIXdhdGNoKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb29wZXItPmRlbFBlbmRpbmdGZFdhdGNoKHdhdGNoKTsKKyAgICAgICAgICAgIHdhdGNoLT5maXJlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBRRU1VQkgqIG1RZW11Qmg7CisKKyAgICBGZFdhdGNoU2V0IG1GZFdhdGNoZXM7CisgICAgRmRXYXRjaExpc3QgbVBlbmRpbmdGZFdhdGNoZXM7CisgICAgVGltZXJTZXQgbVRpbWVyczsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitCYXNlTG9vcGVyKiBjcmVhdGVMb29wZXIoKSB7CisgICAgcmV0dXJuIG5ldyBRZW11TG9vcGVyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBxZW11Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2FzeW5jL0xvb3Blci5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9hc3luYy9Mb29wZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzA2MzhiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9hc3luYy9Mb29wZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisKKy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmJhc2U6Okxvb3BlciBiYXNlZCBvbiB0aGUgUUVNVSBldmVudCBsb29wLgorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHFlbXUgeworCisvLyBDcmVhdGUgYSBuZXcgYW5kcm9pZDo6YmFzZTo6TG9vcGVyIGluc3RhbmNlIHRoYXQgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaAorLy8gdGhlIFFFTVUgbWFpbiBldmVudCBsb29wLiBUaGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSwgc28gYW55IGNhbGwgd2lsbAorLy8gcmV0dXJuIGFuIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1lIGdsb2JhbCBzdGF0ZSwgZXZlbiBpZiB0aGV5CisvLyBhcmUgZGlmZmVyZW50IGluc3RhbmNlcyEKK2FuZHJvaWQ6OmJhc2U6Okxvb3BlciogY3JlYXRlTG9vcGVyKCk7CisKK30gIC8vIG5hbWVzcGFjZSBxZW11Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2ZpbGVzL1FlbXVGaWxlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWRiMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5jcHAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0xvZy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtaWdyYXRpb24vcWVtdS1maWxlLmgiCit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBxZW11IHsKKworUWVtdUZpbGVTdHJlYW06OlFlbXVGaWxlU3RyZWFtKFFFTVVGaWxlKiBmaWxlKSA6IG1GaWxlKGZpbGUpIHt9CisKK1FlbXVGaWxlU3RyZWFtOjp+UWVtdUZpbGVTdHJlYW0oKSB7fQorCitzc2l6ZV90IFFlbXVGaWxlU3RyZWFtOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGxlbikgeworICAgIERDSEVDSyhzdGF0aWNfY2FzdDxzc2l6ZV90PihsZW4pID49IDApOworICAgIERDSEVDSyhzdGF0aWNfY2FzdDxzc2l6ZV90PihsZW4pID09IHN0YXRpY19jYXN0PGludD4obGVuKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KAorICAgICAgICAgICAgcWVtdV9nZXRfYnVmZmVyKG1GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obGVuKSkpOworfQorCitzc2l6ZV90IFFlbXVGaWxlU3RyZWFtOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKKyAgICBEQ0hFQ0soc3RhdGljX2Nhc3Q8c3NpemVfdD4obGVuKSA+PSAwKTsKKyAgICBEQ0hFQ0soc3RhdGljX2Nhc3Q8c3NpemVfdD4obGVuKSA9PSBzdGF0aWNfY2FzdDxpbnQ+KGxlbikpOworICAgIHFlbXVfcHV0X2J1ZmZlcihtRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obGVuKSk7CisgICAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgYWxsIGNvdWxkIGJlIHdyaXR0ZW4sIHNvIGFsd2F5cworICAgIC8vIHJldHVybiBzdWNjZXNzIGhlcmUuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KGxlbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBxZW11Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvYmFzZS9maWxlcy9RZW11RmlsZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjgyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2ZpbGVzL1FlbXVGaWxlU3RyZWFtLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorCitzdHJ1Y3QgUUVNVUZpbGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBxZW11IHsKKworLy8gQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgUUVNVUZpbGUqIHRoYXQgaW1wbGVtZW50cyB0aGUgYW5kcm9pZDo6YmFzZTo6U3RyZWFtCisvLyBpbnRlcmZhY2UuIE5vdGUgdGhhdCB0aGUgaW5zdGFuY2UgZG9lc24ndCBvd24gdGhlIFFFTVVGaWxlKiwgaS5lLiB0aGUKKy8vIGRlc3RydWN0b3Igd2lsbCBuZXZlciBjbG9zZSBpdC4KK2NsYXNzIFFlbXVGaWxlU3RyZWFtIDogcHVibGljIGFuZHJvaWQ6OmJhc2U6OlN0cmVhbSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUWVtdUZpbGVTdHJlYW0oUUVNVUZpbGUqIGZpbGUpOworICAgIHZpcnR1YWwgflFlbXVGaWxlU3RyZWFtKCk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgbGVuKTsKKyAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbGVuKTsKKworICAgIFFFTVVGaWxlKiBmaWxlKCkgY29uc3QgeyByZXR1cm4gbUZpbGU7IH0KKworcHJpdmF0ZToKKyAgICBRZW11RmlsZVN0cmVhbSgpOworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihRZW11RmlsZVN0cmVhbSk7CisKKyAgICBRRU1VRmlsZSogbUZpbGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcWVtdQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy9jaGVjay1hbHNhLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9jb25maWcvY2hlY2stYWxzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYjI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9jb25maWcvY2hlY2stYWxzYS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKworI2RlZmluZSAgRCguLi4pICBmcHJpbnRmKHN0ZGVycixfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFNUUklOR0lGWSh4KSAgX1NUUklOR0lGWSh4KQorI2RlZmluZSBfU1RSSU5HSUZZKHgpICAjeAorCisjZGVmaW5lICBEWU5fU1lNQk9MUyAgIFwKKyAgICBEWU5fRlVOQ1RJT04oc2l6ZV90LHNuZF9wY21fc3dfcGFyYW1zX3NpemVvZiwodm9pZCkpICAgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX2N1cnJlbnQsKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpKSBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkLChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpKSAgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9zd19wYXJhbXMsKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpKSAgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCwoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcykpIFwKKyAgICBEWU5fRlVOQ1RJT04oc2l6ZV90LHNuZF9wY21faHdfcGFyYW1zX3NpemVvZiwodm9pZCkpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2h3X3BhcmFtc19hbnksKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpKSAgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2Vzcywoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9hY2Nlc3NfdCBfYWNjZXNzKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQsKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIsKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcikpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhciwoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwpKSAgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIsKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcikpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2h3X3BhcmFtcywoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcykpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUsKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCkpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX3ByZXBhcmUsKHNuZF9wY21fdCAqcGNtKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX2dldF9wZXJpb2Rfc2l6ZSwoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqZnJhbWVzLCBpbnQgKmRpcikpICBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2h3X3BhcmFtc19nZXRfcGVyaW9kX3NpemVfbWluLChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICpmcmFtZXMsIGludCAqZGlyKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZSwoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsLCBpbnQgZGlyKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZV9taW4sKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCkpIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZSwoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oaW50LHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyLChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpKSAgXAorICAgIERZTl9GVU5DVElPTihzbmRfcGNtX3NmcmFtZXNfdCxzbmRfcGNtX2F2YWlsX3VwZGF0ZSwoc25kX3BjbV90ICpwY20pKSBcCisgICAgRFlOX0ZVTkNUSU9OKGludCxzbmRfcGNtX2Ryb3AsKHNuZF9wY21fdCAqcGNtKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oc25kX3BjbV9zZnJhbWVzX3Qsc25kX3BjbV93cml0ZWksKHNuZF9wY21fdCAqcGNtLCBjb25zdCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpKSAgXAorICAgIERZTl9GVU5DVElPTihzbmRfcGNtX3NmcmFtZXNfdCxzbmRfcGNtX3JlYWRpLChzbmRfcGNtX3QgKnBjbSwgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oc25kX3BjbV9zdGF0ZV90LHNuZF9wY21fc3RhdGUsKHNuZF9wY21fdCAqcGNtKSkgIFwKKyAgICBEWU5fRlVOQ1RJT04oY29uc3QgY2hhciosc25kX3N0cmVycm9yLChpbnQgZXJybnVtKSkgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9vcGVuLChzbmRfcGNtX3QgKipwY20sIGNvbnN0IGNoYXIgKm5hbWUsc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKSkgXAorICAgIERZTl9GVU5DVElPTihpbnQsc25kX3BjbV9jbG9zZSwoc25kX3BjbV90ICpwY20pKSAgXAorCisKKworLyogZGVmaW5lIHBvaW50ZXJzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIHdlJ3JlIGdvaW5nIHRvIHVzZSAqLworI2RlZmluZSAgRFlOX0ZVTkNUSU9OKHJldCxuYW1lLHNpZykgICBcCisgICAgc3RhdGljIHJldCAgKCpmdW5jXyAjIyBuYW1lKXNpZzsKKworRFlOX1NZTUJPTFMKKworI3VuZGVmICBEWU5fRlVOQ1RJT04KKworI2RlZmluZSBmdW5jX3NuZF9wY21faHdfcGFyYW1zX2FsbG9jYShwdHIpIFwKKyAgICBkbyB7IGFzc2VydChwdHIpOyAqcHRyID0gKHNuZF9wY21faHdfcGFyYW1zX3QgKikgYWxsb2NhKGZ1bmNfc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mKCkpOyBtZW1zZXQoKnB0ciwgMCwgZnVuY19zbmRfcGNtX2h3X3BhcmFtc19zaXplb2YoKSk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgZnVuY19zbmRfcGNtX3N3X3BhcmFtc19hbGxvY2EocHRyKSBcCisgICAgZG8geyBhc3NlcnQocHRyKTsgKnB0ciA9IChzbmRfcGNtX3N3X3BhcmFtc190ICopIGFsbG9jYShmdW5jX3NuZF9wY21fc3dfcGFyYW1zX3NpemVvZigpKTsgbWVtc2V0KCpwdHIsIDAsIGZ1bmNfc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKCkpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCogIGFsc2FfbGliOworCitpbnQgIG1haW4odm9pZCkKK3sKKyAgICBpbnQgIHJlc3VsdCA9IDE7CisKKyAgICBhbHNhX2xpYiA9IGRsb3BlbiggImxpYmFzb3VuZC5zbyIsIFJUTERfTk9XICk7CisgICAgaWYgKGFsc2FfbGliID09IE5VTEwpCisgICAgICAgIGFsc2FfbGliID0gZGxvcGVuKCAibGliYXNvdW5kLnNvLjIiLCBSVExEX05PVyApOworCisgICAgaWYgKGFsc2FfbGliID09IE5VTEwpIHsKKyAgICAgICAgRCgiY291bGQgbm90IGZpbmQgbGliYXNvdW5kIG9uIHRoaXMgc3lzdGVtXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisjdW5kZWYgIERZTl9GVU5DVElPTgorI2RlZmluZSBEWU5fRlVOQ1RJT04ocmV0LG5hbWUsc2lnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZnVuY18gIyNuYW1lKSA9IGRsc3ltKCBhbHNhX2xpYiwgU1RSSU5HSUZZKG5hbWUpICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGZ1bmNfIyNuYW1lKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRCgiY291bGQgbm90IGZpbmQgJXMgaW4gbGliYXNvdW5kXG4iLCBTVFJJTkdJRlkobmFtZSkpOyBcCisgICAgICAgICAgICBnb3RvIEZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBEWU5fU1lNQk9MUworCisgICAgcmVzdWx0ID0gMDsKKyAgICBnb3RvIEV4aXQ7CisKK0ZhaWw6CisgICAgRCgiZmFpbGVkIHRvIG9wZW4gbGlicmFyeVxuIik7CisKK0V4aXQ6CisgICAgZGxjbG9zZShhbHNhX2xpYik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy9jaGVjay1lc2QuYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy9jaGVjay1lc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ3OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL2NoZWNrLWVzZC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyogdGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGF0IHdlIGNhbiB1c2UgbGliZXNkIHdpdGggbGF6eSBkeW5hbWljIGxpbmtpbmcgKi8KKworI2luY2x1ZGUgPGVzZC5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2RlZmluZSAgRCguLi4pICBmcHJpbnRmKHN0ZGVycixfX1ZBX0FSR1NfXykKKyNkZWZpbmUgIFNUUklOR0lGWSh4KSAgX1NUUklOR0lGWSh4KQorI2RlZmluZSBfU1RSSU5HSUZZKHgpICAjeAorCisjZGVmaW5lICBFU0RfU1lNQk9MUyAgIFwKKyAgICBFU0RfRlVOQ1RJT04oaW50LGVzZF9wbGF5X3N0cmVhbSwoZXNkX2Zvcm1hdF90LGludCxjb25zdCBjaGFyKixjb25zdCBjaGFyKikpICAgXAorICAgIEVTRF9GVU5DVElPTihpbnQsZXNkX3JlY29yZF9zdHJlYW0sKGVzZF9mb3JtYXRfdCxpbnQsY29uc3QgY2hhciosY29uc3QgY2hhciopKSBcCisgICAgRVNEX0ZVTkNUSU9OKGludCxlc2Rfb3Blbl9zb3VuZCwoIGNvbnN0IGNoYXIgKmhvc3QgKSkgXAorICAgIEVTRF9GVU5DVElPTihpbnQsZXNkX2Nsb3NlLChpbnQpKSBcCisKKy8qIGRlZmluZSBwb2ludGVycyB0byBsaWJyYXJ5IGZ1bmN0aW9ucyB3ZSdyZSBnb2luZyB0byB1c2UgKi8KKyNkZWZpbmUgIEVTRF9GVU5DVElPTihyZXQsbmFtZSxzaWcpICAgXAorICAgIHN0YXRpYyByZXQgICgqZnVuY18gIyMgbmFtZSlzaWc7CisKK0VTRF9TWU1CT0xTCisKKyN1bmRlZiAgRVNEX0ZVTkNUSU9OCitzdGF0aWMgdm9pZCogICAgZXNkX2xpYjsKKworaW50IG1haW4oIHZvaWQgKQoreworICAgIGludCAgZmQ7CisKKyAgICBlc2RfbGliID0gZGxvcGVuKCAibGliZXNkLnNvIiwgUlRMRF9OT1cgKTsKKyAgICBpZiAoZXNkX2xpYiA9PSBOVUxMKQorICAgICAgICBlc2RfbGliID0gZGxvcGVuKCAibGliZXNkLnNvLjAiLCBSVExEX05PVyApOworCisgICAgaWYgKGVzZF9saWIgPT0gTlVMTCkgeworICAgICAgICBEKCJjb3VsZCBub3QgZmluZCBsaWJlc2Qgb24gdGhpcyBzeXN0ZW1cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyN1bmRlZiAgRVNEX0ZVTkNUSU9OCisjZGVmaW5lIEVTRF9GVU5DVElPTihyZXQsbmFtZSxzaWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChmdW5jXyAjI25hbWUpID0gZGxzeW0oIGVzZF9saWIsIFNUUklOR0lGWShuYW1lKSApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZnVuY18jI25hbWUpID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBEKCJjb3VsZCBub3QgZmluZCAlcyBpbiBsaWJlc2RcbiIsIFNUUklOR0lGWShuYW1lKSk7ICAgXAorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBFU0RfU1lNQk9MUworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9jb25maWcvY2hlY2stcHVsc2VhdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL2NoZWNrLXB1bHNlYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y4ZTgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL2NoZWNrLXB1bHNlYXVkaW8uYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qIHRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhhdCB3ZSBjYW4gdXNlIGxpYmVzZCB3aXRoIGxhenkgZHluYW1pYyBsaW5raW5nICovCisKKyNpbmNsdWRlIDxlc2QuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgIEQoLi4uKSAgZnByaW50ZihzdGRlcnIsX19WQV9BUkdTX18pCisjZGVmaW5lICBTVFJJTkdJRlkoeCkgIF9TVFJJTkdJRlkoeCkKKyNkZWZpbmUgX1NUUklOR0lGWSh4KSAgI3gKKworI2RlZmluZSAgUFVMU0VBVURJT19TWU1CT0xTIFwKKyAgICBQVUxTRUFVRElPX1NZTUJPTFMocGFfc2ltcGxlKixwYV9zaW1wbGVfbmV3LChjb25zdCBjaGFyKiBzZXJ2ZXIsY29uc3QgY2hhciogbmFtZSwgcGFfc3RyZWFtX2RpcmVjdGlvbl90IGRpciwgY29uc3QgY2hhciogZGV2LCBjb25zdCBjaGFyKiBzdHJlYW1fbmFtZSwgY29uc3QgcGFfc2FtcGxlX3NwZWMqIHNzLCBjb25zdCBwYV9jaGFubmVsX21hcCogbWFwLCBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgaW50ICplcnJvcikpIFwKKyAgICBQVUxTRUFVRElPX1NZTUJPTFModm9pZCxwYStzaW1wbGVfZnJlZSwocGFfc2ltcGxlKiBzKSlcCisgICAgUFVMU0VBVURJT19TWU1CT0xTKGludCxwYV9zaW1wbGVfd3JpdGUsKHBhX3NpbXBsZSogcywgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGJ5dGVzLCBpbnQqIGVycm9yKSlcCisgICAgUFVMU0VBVURJT19TWU1CT0xTKGludCxwYV9zaW1wbGVfcmVhZCwocGFfc2ltcGxlKiBzLHZvaWQqIGRhdGEsIHNpemVfdCBieXRlcywgaW50KiBlcnJvcikpXAorICAgIFBVTFNFQVVESU9fU1lNQk9MUyhjb25zdCBjaGFyKixwYV9zdHJlcnJvciwoaW50IGVycm9yKSkKKworLyogZGVmaW5lIHBvaW50ZXJzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIHdlJ3JlIGdvaW5nIHRvIHVzZSAqLworI2RlZmluZSAgUFVMU0VBVURJT19GVU5DVElPTihyZXQsbmFtZSxzaWcpICAgXAorICAgIHN0YXRpYyByZXQgICgqZnVuY18gIyMgbmFtZSlzaWc7CisKK1BVTFNFQVVESU9fU1lNQk9MUworCisjdW5kZWYgIFBVTFNFQVVESU9fRlVOQ1RJT04KK3N0YXRpYyB2b2lkKiAgICBwYV9saWI7CisKK2ludCBtYWluKCB2b2lkICkKK3sKKyAgICBpbnQgIGZkOworCisgICAgcGFfbGliID0gZGxvcGVuKCAibGlicHVsc2Utc2ltcGxlLnNvIiwgUlRMRF9OT1cgKTsKKyAgICBpZiAocGFfbGliID09IE5VTEwpCisgICAgICAgIHBhX2xpYiA9IGRsb3BlbiggImxpYnB1bHNlLXNpbXBsZS5zby4wIiwgUlRMRF9OT1cgKTsKKworICAgIGlmIChwYV9saWIgPT0gTlVMTCkgeworICAgICAgICBEKCJjb3VsZCBub3QgZmluZCBsaWJwdWxzZSBvbiB0aGlzIHN5c3RlbSIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyN1bmRlZiAgUFVMU0VBVURJT19GVU5DVElPTgorI2RlZmluZSBQVUxTRUFVRElPX0ZVTkNUSU9OKHJldCxuYW1lLHNpZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGZ1bmNfICMjbmFtZSkgPSBkbHN5bSggcGFfbGliLCBTVFJJTkdJRlkobmFtZSkgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGZ1bmNfIyNuYW1lKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRCgiY291bGQgbm90IGZpbmQgJXMgaW4gbGlicHVsc2VcbiIsIFNUUklOR0lGWShuYW1lKSk7ICAgXAorICAgICAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBQVUxTRUFVRElPX1NZTUJPTFMKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL3RhcmdldC1hcm0vY29uZmlnLmggYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9jb25maWcvdGFyZ2V0LWFybS9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmRhMDRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL3RhcmdldC1hcm0vY29uZmlnLmgKQEAgLTAsMCArMSw1IEBACisvKiBBUk0tc3BlY2lmaWMgY29uZmlndXJhdGlvbiAqLworI2luY2x1ZGUgImFuZHJvaWQvY29uZmlnL2NvbmZpZy5oIgorCisjZGVmaW5lIFRBUkdFVF9BUk0gMQorI2RlZmluZSBDT05GSUdfU09GVEZMT0FUIDEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy90YXJnZXQtbWlwcy9jb25maWcuaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy90YXJnZXQtbWlwcy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAyY2RjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL3RhcmdldC1taXBzL2NvbmZpZy5oCkBAIC0wLDAgKzEsNSBAQAorLyogTUlQUy1zcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisjaW5jbHVkZSAiYW5kcm9pZC9jb25maWcvY29uZmlnLmgiCisKKyNkZWZpbmUgVEFSR0VUX01JUFMgMQorI2RlZmluZSBDT05GSUdfU09GVEZMT0FUIDEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy90YXJnZXQteDg2L2NvbmZpZy5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvY29uZmlnL3RhcmdldC14ODYvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1ZGFiYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2NvbmZpZy90YXJnZXQteDg2L2NvbmZpZy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHg4Ni1zcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisjaW5jbHVkZSAiYW5kcm9pZC9jb25maWcvY29uZmlnLmgiCisjZGVmaW5lIFRBUkdFVF9YODZfNjQgMQorI2RlZmluZSBUQVJHRVRfSTM4NiAxCisvKiBGb3Igbm93LCBLVk0gaXMgb25seSBzdXBwb3J0ZWQgb24gTGludXggaG9zdHMgKi8KKyNpZmRlZiBDT05GSUdfTElOVVgKKyNkZWZpbmUgQ09ORklHX0tWTSAgMQorI2VuZGlmCisKKy8qCisgKiBIQVggaXMgc3VwcG9ydGVkIGluIGRhcndpbiBhbmQgd2luZG93cyBob3N0CisgKi8KKyNpZmRlZiBDT05GSUdfREFSV0lOCisjZGVmaW5lIENPTkZJR19IQVggMQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfV0lOMzIKKyNkZWZpbmUgQ09ORklHX0hBWCAxCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2Rpc3BsYXkuYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU1OWYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZGlzcGxheS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgQW5kcm9pZC1zcGVjaWZpYyBEaXNwbGF5U3RhdGUuCisgKiBSZWFkIGRvY3MvRElTUExBWS1TVEFURS5UWFQgdG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMKKyAqIGlzIHN1cHBvc2VkIHRvIGRvLgorICovCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2Rpc3BsYXkuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0b3Itd2luZG93LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zeXN0ZW0uaCIKKworLyoKKworVEVDSE5JQ0FMIE5PVEU6CisKK0Rpc3BsYXlTdGF0ZSA8LS0+IFFGcmFtZUJ1ZmZlciA8LS0+IFFFbXVsYXRvci9TREwKKworKi8KKworLyogUUZyYW1lQnVmZmVyIHByb2R1Y2VyIGNhbGxiYWNrcyAqLworCisvKiB0aGlzIGlzIGNhbGxlZCBwZXJpb2RpY2FsbHkgYnkgdGhlIEdVSSB0aW1lciB0byBjaGVjayBmb3IgdXBkYXRlcworICogYW5kIHBvbGwgdXNlciBldmVudHMuIFVzZSB2Z2FfaHdfdXBkYXRlKCkuCisgKi8KK3N0YXRpYyB2b2lkCithbmRyb2lkX2Rpc3BsYXlfcHJvZHVjZXJfY2hlY2sodm9pZCAqb3BhcXVlKQoreworICAgIC8qIGNvcmU6IGNhbGwgdmdhX2h3X3VwZGF0ZSgpLiB0aGlzIHdpbGwgZXZlbnR1YWxseQorICAgICAqIGxlYWQgdG8gY2FsbHMgdG8gYW5kcm9pZF9kaXNwbGF5X3VwZGF0ZSgpCisgICAgICovCisgICAgKHZvaWQpb3BhcXVlOworICAgIHZnYV9od191cGRhdGUoKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfZGlzcGxheV9wcm9kdWNlcl9pbnZhbGlkYXRlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICAodm9pZClvcGFxdWU7CisgICAgdmdhX2h3X2ludmFsaWRhdGUoKTsKK30KKworc3RhdGljIHZvaWQKK2FuZHJvaWRfZGlzcGxheV9wcm9kdWNlcl9kZXRhY2godm9pZCogb3BhcXVlKQoreworICAgIERpc3BsYXlTdGF0ZSogZHMgPSAoRGlzcGxheVN0YXRlKilvcGFxdWU7CisgICAgaWYgKGRzKSB7CisgICAgICAgIC8vIGNsZWFuIHRoZSBmcmFtZWJ1ZmZlciBwb2ludGVyIG9uIHNodXRkb3duCisgICAgICAgIGRzLT5vcGFxdWUgPSBOVUxMOworICAgIH0KK30KKworLyogUUZyYW1lQnVmZmVyIGNsaWVudCBjYWxsYmFja3MgKi8KKworLyogdGhpcyBpcyBjYWxsZWQgZnJvbSBkcHlfdXBkYXRlKCkgZWFjaCB0aW1lIGEgaGFyZHdhcmUgZnJhbWVidWZmZXIKKyAqIHJlY3Rhbmd1bGFyIHVwZGF0ZSB3YXMgZGV0ZWN0ZWQuIFNlbmQgdGhpcyB0byB0aGUgUUZyYW1lQnVmZmVyLgorICovCitzdGF0aWMgdm9pZAorYW5kcm9pZF9kaXNwbGF5X3VwZGF0ZShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBRRnJhbWVCdWZmZXIqIHFmYnVmZiA9IGRzLT5vcGFxdWU7CisgICAgaWYgKHFmYnVmZikgeworICAgICAgICBxZnJhbWVidWZmZXJfdXBkYXRlKHFmYnVmZiwgeCwgeSwgdywgaCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9kaXNwbGF5X3Jlc2l6ZShEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIFFGcmFtZUJ1ZmZlciogcWZidWZmID0gZHMtPm9wYXF1ZTsKKyAgICBpZiAocWZidWZmKSB7CisgICAgICAgIHFmcmFtZWJ1ZmZlcl9yb3RhdGUocWZidWZmLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX2Rpc3BsYXlfcmVmcmVzaChEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIFFGcmFtZUJ1ZmZlciogcWZidWZmID0gZHMtPm9wYXF1ZTsKKyAgICBpZiAocWZidWZmKSB7CisgICAgICAgIHFmcmFtZWJ1ZmZlcl9wb2xsKHFmYnVmZik7CisgICAgfQorfQorCisKK3ZvaWQgYW5kcm9pZF9kaXNwbGF5X2luaXQoRGlzcGxheVN0YXRlKiBkcywgUUZyYW1lQnVmZmVyKiBxZikKK3sKKyAgICBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIqIGRjbDsKKworICAgIHFmcmFtZWJ1ZmZlcl9zZXRfcHJvZHVjZXIocWYsIGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kaXNwbGF5X3Byb2R1Y2VyX2NoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kaXNwbGF5X3Byb2R1Y2VyX2ludmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Rpc3BsYXlfcHJvZHVjZXJfZGV0YWNoKTsKKworICAgIC8qIFJlcGxhY2UgdGhlIGRpc3BsYXkgc3VyZmFjZSB3aXRoIG9uZSB3aXRoIHRoZSByaWdodCBkaW1lbnNpb25zICovCisgICAgcWVtdV9mcmVlX2Rpc3BsYXlzdXJmYWNlKGRzKTsKKyAgICBkcy0+b3BhcXVlICAgID0gcWY7CisgICAgZHMtPnN1cmZhY2UgICA9IHFlbXVfY3JlYXRlX2Rpc3BsYXlzdXJmYWNlX2Zyb20ocWYtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFmLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWYtPmJpdHNfcGVyX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFmLT5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZi0+cGl4ZWxzKTsKKworICAgIC8qIFJlZ2lzdGVyIGEgY2hhbmdlIGxpc3RlbmVyIGZvciBpdCAqLworICAgIEFORVcwKGRjbCk7CisgICAgZGNsLT5kcHlfdXBkYXRlICAgICAgPSBhbmRyb2lkX2Rpc3BsYXlfdXBkYXRlOworICAgIGRjbC0+ZHB5X3Jlc2l6ZSAgICAgID0gYW5kcm9pZF9kaXNwbGF5X3Jlc2l6ZTsKKyAgICBkY2wtPmRweV9yZWZyZXNoICAgICA9IGFuZHJvaWRfZGlzcGxheV9yZWZyZXNoOworICAgIGRjbC0+ZHB5X3RleHRfY3Vyc29yID0gTlVMTDsKKworICAgIHJlZ2lzdGVyX2Rpc3BsYXljaGFuZ2VsaXN0ZW5lcihkcywgZGNsKTsKK30KKwordm9pZCBzZGxfZGlzcGxheV9pbml0KERpc3BsYXlTdGF0ZSAqZHMsIGludCBmdWxsX3NjcmVlbiwgaW50ICBub19mcmFtZSkKK3sKKyAgICBpbnQgd2lkdGggPSAwOworICAgIGludCBoZWlnaHQgPSAwOworICAgIGNoYXIgYnVmWzEyOF0gPSB7IDAgfTsKKworICAgIEVtdWxhdG9yV2luZG93KiAgICBlbXVsYXRvciA9IGVtdWxhdG9yX3dpbmRvd19nZXQoKTsKKworICAgIFNraW5MYXlvdXQqIHNraW5fbGF5b3V0ID0gZW11bGF0b3Jfd2luZG93X2dldF9sYXlvdXQoZW11bGF0b3IpOworICAgIGlmKHNraW5fbGF5b3V0ID09IE5VTEwpIHsKKyAgICAgICAgLy8gcnVubmluZyBpbiBuby13aW5kb3cgbW9kZQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU2tpbkRpc3BsYXkqIGRpc3AgPSBza2luX2xheW91dF9nZXRfZGlzcGxheShza2luX2xheW91dCk7CisgICAgaWYgKGRpc3AtPnJvdGF0aW9uICYgMSkgeworICAgICAgICB3aWR0aCA9IGRpc3AtPnJlY3Quc2l6ZS5oOworICAgICAgICBoZWlnaHQgPSBkaXNwLT5yZWN0LnNpemUudzsKKyAgICB9IGVsc2UgeworICAgICAgICB3aWR0aCA9IGRpc3AtPnJlY3Quc2l6ZS53OworICAgICAgICBoZWlnaHQgPSBkaXNwLT5yZWN0LnNpemUuaDsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZiBidWYsICJ3aWR0aD0lZCxoZWlnaHQ9JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBhbmRyb2lkX2Rpc3BsYXlfaW5pdChkcywgcWZyYW1lYnVmZmVyX2ZpZm9fZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZGlzcGxheS5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZGlzcGxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjc4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9kaXNwbGF5LmgKQEAgLTAsMCArMSwxOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9mcmFtZWJ1ZmZlci5oIgorCitleHRlcm4gdm9pZCBhbmRyb2lkX2Rpc3BsYXlfaW5pdChEaXNwbGF5U3RhdGUqIGRzLCBRRnJhbWVCdWZmZXIqIHFmYnVmZik7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vQ2hhclNlcmlhbExpbmUuY3BwIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL0NoYXJTZXJpYWxMaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTgyNmJhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL0NoYXJTZXJpYWxMaW5lLmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vQ2hhclNlcmlhbExpbmUuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHFlbXUxIHsKKworQ2hhclNlcmlhbExpbmU6OkNoYXJTZXJpYWxMaW5lKENoYXJEcml2ZXJTdGF0ZSogY3MpIDogbUNzKGNzKSB7IH0KKworQ2hhclNlcmlhbExpbmU6On5DaGFyU2VyaWFsTGluZSgpIHsKKyAgICBpZiAobUNzKSB7CisgICAgICAgIHFlbXVfY2hyX2Nsb3NlKG1Dcyk7CisgICAgfQorfQorCit2b2lkIENoYXJTZXJpYWxMaW5lOjphZGRIYW5kbGVycyh2b2lkKiBvcGFxdWUsIENhblJlYWRGdW5jIGNhblJlYWRGdW5jLCBSZWFkRnVuYyByZWFkRnVuYykgeworICAgIHFlbXVfY2hyX2FkZF9oYW5kbGVycyhtQ3MsIGNhblJlYWRGdW5jLCByZWFkRnVuYywgTlVMTCwgb3BhcXVlKTsKK30KKworaW50IENoYXJTZXJpYWxMaW5lOjp3cml0ZShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CisgICAgcmV0dXJuIHFlbXVfY2hyX3dyaXRlKG1DcywgZGF0YSwgbGVuKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHFlbXUxCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL0NoYXJTZXJpYWxMaW5lLmggYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vQ2hhclNlcmlhbExpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjc4NTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL0NoYXJTZXJpYWxMaW5lLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL0NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vU2VyaWFsTGluZS5oIgorI2luY2x1ZGUgInFlbXUvdHlwZWRlZnMuaCIKKworLy8gUUVNVTEtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdlbmVyaWMgU2VyaWFsTGluZSBpbnRlcmZhY2UsCisvLyBiYXNlZCBvbiBDaGFyRHJpdmVyU3RhdGUKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHFlbXUxIHsKKworY2xhc3MgQ2hhclNlcmlhbExpbmUgOiBwdWJsaWMgYW5kcm9pZDo6U2VyaWFsTGluZSB7CitwdWJsaWM6CisgICAgLy8gdGFrZXMgb3duZXJzaGlwIG9mIHxjc3wsIGRlbGV0ZXMgaXQgaW4gZGVzdHJ1Y3RvcgorICAgIENoYXJTZXJpYWxMaW5lKENoYXJEcml2ZXJTdGF0ZSogY3MpOworCisgICAgfkNoYXJTZXJpYWxMaW5lKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkSGFuZGxlcnModm9pZCogb3BhcXVlLCBDYW5SZWFkRnVuYyBjYW5SZWFkRnVuYywgUmVhZEZ1bmMgcmVhZEZ1bmMpOworCisgICAgdmlydHVhbCBpbnQgd3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgaW50IGxlbik7CisKKyAgICBDaGFyRHJpdmVyU3RhdGUqIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gbUNzOyB9CisKKyAgICBDaGFyRHJpdmVyU3RhdGUqIHJlbGVhc2UoKSB7CisgICAgICAgIENoYXJEcml2ZXJTdGF0ZSogY3MgPSBtQ3M7CisgICAgICAgIG1DcyA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBjczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENoYXJTZXJpYWxMaW5lKTsKKworcHJpdmF0ZToKKyAgICBDaGFyRHJpdmVyU3RhdGUqIG1DczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBxZW11MQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suY3BwIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL1ZtTG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4ODU2NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKK30gIC8vIGV4dGVybiAiQyIKKworbmFtZXNwYWNlIHFlbXUgeworCisvLyBURUNITklDQUwgTk9URToKKy8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IHJlY3Vyc2l2ZSBtdXRleCBsb2NrcyBzaW5jZQorLy8gZXZlcnl0aGluZyBvZiBpbnRlcmVzdCBoYXBwZW5zIGluIHRoZSBtYWluIGxvb3AgdGhyZWFkLgorCit2b2lkIFZtTG9jazo6bG9jaygpIHsgcWVtdV9tdXRleF9sb2NrX2lvdGhyZWFkKCk7IH0KKwordm9pZCBWbUxvY2s6OnVubG9jaygpIHsgcWVtdV9tdXRleF91bmxvY2tfaW90aHJlYWQoKTsgfQorCitib29sIFZtTG9jazo6aXNMb2NrZWRCeVNlbGYoKSBjb25zdCB7IHJldHVybiBxZW11X211dGV4X2NoZWNrX2lvdGhyZWFkKCk7IH0KKworfSAgLy8gbmFtZXNwYWNlIHFlbXUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNjNTYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL1ZtTG9jay5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL1ZtTG9jay5oIgorCituYW1lc3BhY2UgcWVtdSB7CisKKy8vIEEgZGVyaXZlZCBjbGFzcyBvZiBhbmRyb2lkOjpWbUxvY2sgdGFpbG9yZWQgZm9yIHRoZSBRRU1VMSBtYWluLWxvb3AuCitjbGFzcyBWbUxvY2sgOiBwdWJsaWMgYW5kcm9pZDo6Vm1Mb2NrIHsKK3B1YmxpYzoKKyAgICB2b2lkIGxvY2soKSBvdmVycmlkZTsKKworICAgIHZvaWQgdW5sb2NrKCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzTG9ja2VkQnlTZWxmKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgcWVtdQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL2NoYXJwaXBlLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vY2hhcnBpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQyYjZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL2NoYXJwaXBlLmMKQEAgLTAsMCArMSw0NjkgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkL3FlbXUtZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NidWZmZXIuaCIKKyNpbmNsdWRlICJzeXNlbXUvY2hhci5oIgorCisjZGVmaW5lICB4eERFQlVHCisKKyNpZmRlZiBERUJVRworIyAgaW5jbHVkZSA8c3RkaW8uaD4KKyMgIGRlZmluZSAgRCguLi4pICAgKCBmcHJpbnRmKCBzdGRlcnIsIF9fVkFfQVJHU19fICksIGZwcmludGYoc3RkZXJyLCAiXG4iKSApCisjZWxzZQorIyAgZGVmaW5lICBEKC4uLikgICAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiB3ZSB3YW50IHRvIGltcGxlbWVudCBhIGJpLWRpcmVjdGlvbm5hbCBjb21tdW5pY2F0aW9uIGNoYW5uZWwKKyAqIGJldHdlZW4gdHdvIFFFTVUgY2hhcmFjdGVyIGRyaXZlcnMgdGhhdCBtZXJnZSB3ZWxsIGludG8gdGhlCisgKiBRRU1VIGV2ZW50IGxvb3AuCisgKgorICogZWFjaCBoYWxmIG9mIHRoZSBjaGFubmVsIGhhcyBpdHMgb3duIG9iamVjdCBhbmQgYnVmZmVyLCBhbmQKKyAqIHdlIGltcGxlbWVudCBjb21tdW5pY2F0aW9uIHRocm91Z2ggY2hhcnBpcGVfcG9sbCgpIHdoaWNoCisgKiBtdXN0IGJlIGNhbGxlZCBieSB0aGUgbWFpbiBldmVudCBsb29wIGFmdGVyIGl0cyBjYWxsIHRvIHNlbGVjdCgpCisgKgorICovCisKKyNkZWZpbmUgIEJJUF9CVUZGRVJfU0laRSAgNTEyCisKK3R5cGVkZWYgc3RydWN0IEJpcEJ1ZmZlciB7CisgICAgc3RydWN0IEJpcEJ1ZmZlciogIG5leHQ7CisgICAgQ0J1ZmZlciAgICAgICAgICAgIGNiWzFdOworICAgIGNoYXIgICAgICAgICAgICAgICBidWZmWyBCSVBfQlVGRkVSX1NJWkUgXTsKK30gQmlwQnVmZmVyOworCitzdGF0aWMgQmlwQnVmZmVyKiAgX2ZyZWVfYmlwX2J1ZmZlcnM7CisKK3N0YXRpYyBCaXBCdWZmZXIqCitiaXBfYnVmZmVyX2FsbG9jKCB2b2lkICkKK3sKKyAgICBCaXBCdWZmZXIqICBiaXAgPSBfZnJlZV9iaXBfYnVmZmVyczsKKyAgICBpZiAoYmlwICE9IE5VTEwpIHsKKyAgICAgICAgX2ZyZWVfYmlwX2J1ZmZlcnMgPSBiaXAtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmlwID0gbWFsbG9jKCBzaXplb2YoKmJpcCkgKTsKKyAgICAgICAgaWYgKGJpcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZXJyb3IoICIlczogbm90IGVub3VnaCBtZW1vcnkiLCBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYmlwLT5uZXh0ID0gTlVMTDsKKyAgICBjYnVmZmVyX3Jlc2V0KCBiaXAtPmNiLCBiaXAtPmJ1ZmYsIHNpemVvZihiaXAtPmJ1ZmYpICk7CisgICAgcmV0dXJuIGJpcDsKK30KKworc3RhdGljIHZvaWQKK2JpcF9idWZmZXJfZnJlZSggQmlwQnVmZmVyKiAgYmlwICkKK3sKKyAgICBiaXAtPm5leHQgICAgICAgICA9IF9mcmVlX2JpcF9idWZmZXJzOworICAgIF9mcmVlX2JpcF9idWZmZXJzID0gYmlwOworfQorCisvKiB0aGlzIG1vZGVscyBlYWNoIGhhbGYgb2YgdGhlIGNoYXJwaXBlICovCit0eXBlZGVmIHN0cnVjdCBDaGFyUGlwZUhhbGYgeworICAgIENoYXJEcml2ZXJTdGF0ZSAgICAgICBjc1sxXTsKKyAgICBCaXBCdWZmZXIqICAgICAgICAgICAgYmlwX2ZpcnN0OworICAgIEJpcEJ1ZmZlciogICAgICAgICAgICBiaXBfbGFzdDsKKyAgICBzdHJ1Y3QgQ2hhclBpcGVIYWxmKiAgcGVlcjsgICAgICAgICAvKiBOVUxMIGlmIGNsb3NlZCAqLworfSBDaGFyUGlwZUhhbGY7CisKKworCitzdGF0aWMgdm9pZAorY2hhcnBpcGVoYWxmX2Nsb3NlKCBDaGFyRHJpdmVyU3RhdGUqICBjcyApCit7CisgICAgQ2hhclBpcGVIYWxmKiAgcGggPSBjcy0+b3BhcXVlOworCisgICAgd2hpbGUgKHBoLT5iaXBfZmlyc3QpIHsKKyAgICAgICAgQmlwQnVmZmVyKiAgYmlwID0gcGgtPmJpcF9maXJzdDsKKyAgICAgICAgcGgtPmJpcF9maXJzdCA9IGJpcC0+bmV4dDsKKyAgICAgICAgYmlwX2J1ZmZlcl9mcmVlKGJpcCk7CisgICAgfQorICAgIHBoLT5iaXBfbGFzdCAgICA9IE5VTEw7CisgICAgcGgtPnBlZXIgICAgICAgID0gTlVMTDsKK30KKworCitzdGF0aWMgaW50CitjaGFycGlwZWhhbGZfd3JpdGUoIENoYXJEcml2ZXJTdGF0ZSogIGNzLCBjb25zdCB1aW50OF90KiAgYnVmLCBpbnQgIGxlbiApCit7CisgICAgQ2hhclBpcGVIYWxmKiAgcGggICA9IGNzLT5vcGFxdWU7CisgICAgQ2hhclBpcGVIYWxmKiAgcGVlciA9IHBoLT5wZWVyOworICAgIEJpcEJ1ZmZlciogICAgIGJpcCAgPSBwaC0+YmlwX2xhc3Q7CisgICAgaW50ICAgICAgICAgICAgcmV0ICA9IDA7CisKKyAgICBEKCIlczogd3JpdGluZyAlZCBieXRlcyB0byAlcDogJyVzJyIsIF9fRlVOQ1RJT05fXywKKyAgICAgIGxlbiwgcGgsIHF1b3RlX2J5dGVzKCBidWYsIGxlbiApKTsKKworICAgIGlmIChiaXAgPT0gTlVMTCAmJiBwZWVyICE9IE5VTEwgJiYgcGVlci0+Y3MtPmNocl9yZWFkICE9IE5VTEwpIHsKKyAgICAgICAgLyogbm8gYnVmZmVyZWQgZGF0YSwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRvIHRoZSBwZWVyICovCisgICAgICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgICAgICBpbnQgIHNpemU7CisKKyAgICAgICAgICAgIGlmIChwZWVyLT5jcy0+Y2hyX2Nhbl9yZWFkKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHFlbXVfY2hyX2Nhbl9yZWFkKCBwZWVyLT5jcyApOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBsZW4pCisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBsZW47CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzaXplID0gbGVuOworCisgICAgICAgICAgICBxZW11X2Nocl9yZWFkKCBwZWVyLT5jcywgKHVpbnQ4X3QqKWJ1Ziwgc2l6ZSApOworICAgICAgICAgICAgYnVmICs9IHNpemU7CisgICAgICAgICAgICBsZW4gLT0gc2l6ZTsKKyAgICAgICAgICAgIHJldCArPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogYnVmZmVyIHRoZSByZW1haW5pbmcgZGF0YSAqLworICAgIGlmIChiaXAgPT0gTlVMTCkgeworICAgICAgICBiaXAgPSBiaXBfYnVmZmVyX2FsbG9jKCk7CisgICAgICAgIHBoLT5iaXBfZmlyc3QgPSBwaC0+YmlwX2xhc3QgPSBiaXA7CisgICAgfQorCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaW50ICBsZW4yID0gY2J1ZmZlcl93cml0ZSggYmlwLT5jYiwgYnVmLCBsZW4gKTsKKworICAgICAgICBidWYgKz0gbGVuMjsKKyAgICAgICAgcmV0ICs9IGxlbjI7CisgICAgICAgIGxlbiAtPSBsZW4yOworICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBvaywgd2UgbmVlZCBhbm90aGVyIGJ1ZmZlciAqLworICAgICAgICBwaC0+YmlwX2xhc3QgPSBiaXBfYnVmZmVyX2FsbG9jKCk7CisgICAgICAgIGJpcC0+bmV4dCA9IHBoLT5iaXBfbGFzdDsKKyAgICAgICAgYmlwICAgICAgID0gcGgtPmJpcF9sYXN0OworICAgIH0KKyAgICByZXR1cm4gIHJldDsKK30KKworCitzdGF0aWMgdm9pZAorY2hhcnBpcGVoYWxmX3BvbGwoIENoYXJQaXBlSGFsZiogIHBoICkKK3sKKyAgICBDaGFyUGlwZUhhbGYqICAgcGVlciA9IHBoLT5wZWVyOworICAgIGludCAgICAgICAgICAgICBzaXplOworCisgICAgaWYgKHBlZXIgPT0gTlVMTCB8fCBwZWVyLT5jcy0+Y2hyX3JlYWQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgQmlwQnVmZmVyKiAgYmlwID0gcGgtPmJpcF9maXJzdDsKKyAgICAgICAgdWludDhfdCogICAgYmFzZTsKKyAgICAgICAgaW50ICAgICAgICAgYXZhaWw7CisKKyAgICAgICAgaWYgKGJpcCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc2l6ZSA9IGNidWZmZXJfcmVhZF9hdmFpbChiaXAtPmNiKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcGgtPmJpcF9maXJzdCA9IGJpcC0+bmV4dDsKKyAgICAgICAgICAgIGlmIChwaC0+YmlwX2ZpcnN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcGgtPmJpcF9sYXN0ID0gTlVMTDsKKyAgICAgICAgICAgIGJpcF9idWZmZXJfZnJlZShiaXApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGgtPmNzLT5jaHJfY2FuX3JlYWQpIHsKKyAgICAgICAgICAgIGludCAgc2l6ZTIgPSBxZW11X2Nocl9jYW5fcmVhZChwZWVyLT5jcyk7CisKKyAgICAgICAgICAgIGlmIChzaXplMiA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoc2l6ZSA+IHNpemUyKQorICAgICAgICAgICAgICAgIHNpemUgPSBzaXplMjsKKyAgICAgICAgfQorCisgICAgICAgIGF2YWlsID0gY2J1ZmZlcl9yZWFkX3BlZWsoIGJpcC0+Y2IsICZiYXNlICk7CisgICAgICAgIGlmIChhdmFpbCA+IHNpemUpCisgICAgICAgICAgICBhdmFpbCA9IHNpemU7CisgICAgICAgIEQoIiVzOiBzZW5kaW5nICVkIGJ5dGVzIGZyb20gJXA6ICclcyciLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBhdmFpbCwgcGgsIHF1b3RlX2J5dGVzKCBiYXNlLCBhdmFpbCApKTsKKworICAgICAgICBxZW11X2Nocl9yZWFkKCBwZWVyLT5jcywgYmFzZSwgYXZhaWwgKTsKKyAgICAgICAgY2J1ZmZlcl9yZWFkX3N0ZXAoIGJpcC0+Y2IsIGF2YWlsICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjaGFycGlwZWhhbGZfaW5pdCggQ2hhclBpcGVIYWxmKiAgcGgsIENoYXJQaXBlSGFsZiogIHBlZXIgKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSogIGNzID0gcGgtPmNzOworCisgICAgcGgtPmJpcF9maXJzdCAgID0gTlVMTDsKKyAgICBwaC0+YmlwX2xhc3QgICAgPSBOVUxMOworICAgIHBoLT5wZWVyICAgICAgICA9IHBlZXI7CisKKyAgICBjcy0+Y2hyX3dyaXRlICAgICAgICAgICAgPSBjaGFycGlwZWhhbGZfd3JpdGU7CisgICAgY3MtPmNocl9pb2N0bCAgICAgICAgICAgID0gTlVMTDsKKyAgICBjcy0+Y2hyX3NlbmRfZXZlbnQgICAgICAgPSBOVUxMOworICAgIGNzLT5jaHJfY2xvc2UgICAgICAgICAgICA9IGNoYXJwaXBlaGFsZl9jbG9zZTsKKyAgICBjcy0+b3BhcXVlICAgICAgICAgICAgICAgPSBwaDsKK30KKworCit0eXBlZGVmIHN0cnVjdCBDaGFyUGlwZVN0YXRlIHsKKyAgICBDaGFyUGlwZUhhbGYgIGFbMV07CisgICAgQ2hhclBpcGVIYWxmICBiWzFdOworfSBDaGFyUGlwZVN0YXRlOworCisKKworI2RlZmluZSAgIE1BWF9DSEFSX1BJUEVTICAgOAorCitzdGF0aWMgQ2hhclBpcGVTdGF0ZSAgX3NfY2hhcnBpcGVzWyBNQVhfQ0hBUl9QSVBFUyBdOworCitpbnQKK3FlbXVfY2hyX29wZW5fY2hhcnBpcGUoIENoYXJEcml2ZXJTdGF0ZSogICpwZmlyc3QsIENoYXJEcml2ZXJTdGF0ZSogICpwc2Vjb25kICkKK3sKKyAgICBDaGFyUGlwZVN0YXRlKiAgY3AgICAgID0gX3NfY2hhcnBpcGVzOworICAgIENoYXJQaXBlU3RhdGUqICBjcF9lbmQgPSBjcCArIE1BWF9DSEFSX1BJUEVTOworCisgICAgZm9yICggOyBjcCA8IGNwX2VuZDsgY3ArKyApIHsKKyAgICAgICAgaWYgKCBjcC0+YS0+cGVlciA9PSBOVUxMICYmIGNwLT5iLT5wZWVyID09IE5VTEwgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNwID09IGNwX2VuZCkgeyAgLyogY2FuJ3QgYWxsb2NhdGUgb25lICovCisgICAgICAgICpwZmlyc3QgID0gTlVMTDsKKyAgICAgICAgKnBzZWNvbmQgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2hhcnBpcGVoYWxmX2luaXQoIGNwLT5hLCBjcC0+YiApOworICAgIGNoYXJwaXBlaGFsZl9pbml0KCBjcC0+YiwgY3AtPmEgKTsKKworICAgICpwZmlyc3QgID0gY3AtPmEtPmNzOworICAgICpwc2Vjb25kID0gY3AtPmItPmNzOworICAgIHJldHVybiAwOworfQorCisvKiogVGhpcyBtb2RlbHMgYSBjaGFyYnVmZmVyLCBhbiBvYmplY3QgdXNlZCB0byBidWZmZXIKKyAqKiB0aGUgZGF0YSB0aGF0IGlzIHNlbnQgdG8gYSBnaXZlbiBlbmRwb2ludCBDaGFyRHJpdmVyU3RhdGUKKyAqKiBvYmplY3QuCisgKioKKyAqKiBPbiB0aGUgb3RoZXIgaGFuZCwgYW55IGNhbl9yZWFkKCkgLyByZWFkKCkgcmVxdWVzdCBwZXJmb3JtZWQKKyAqKiBieSB0aGUgZW5kcG9pbnQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIENoYXJCdWZmZXIncyBjb3JyZXNwb25kaW5nCisgKiogaGFuZGxlcnMuCisgKiovCisKK3R5cGVkZWYgc3RydWN0IENoYXJCdWZmZXIgeworICAgIENoYXJEcml2ZXJTdGF0ZSAgY3NbMV07CisgICAgQmlwQnVmZmVyKiAgICAgICBiaXBfZmlyc3Q7CisgICAgQmlwQnVmZmVyKiAgICAgICBiaXBfbGFzdDsKKyAgICBDaGFyRHJpdmVyU3RhdGUqIGVuZHBvaW50OyAgLyogTlVMTCBpZiBjbG9zZWQgKi8KKyAgICBjaGFyICAgICAgICAgICAgIGNsb3Npbmc7Cit9IENoYXJCdWZmZXI7CisKKworc3RhdGljIHZvaWQKK2NoYXJidWZmZXJfY2xvc2UoIENoYXJEcml2ZXJTdGF0ZSogIGNzICkKK3sKKyAgICBDaGFyQnVmZmVyKiAgY2J1ZiA9IGNzLT5vcGFxdWU7CisKKyAgICB3aGlsZSAoY2J1Zi0+YmlwX2ZpcnN0KSB7CisgICAgICAgIEJpcEJ1ZmZlciogIGJpcCA9IGNidWYtPmJpcF9maXJzdDsKKyAgICAgICAgY2J1Zi0+YmlwX2ZpcnN0ID0gYmlwLT5uZXh0OworICAgICAgICBiaXBfYnVmZmVyX2ZyZWUoYmlwKTsKKyAgICB9CisgICAgY2J1Zi0+YmlwX2xhc3QgPSBOVUxMOworICAgIGNidWYtPmVuZHBvaW50ID0gTlVMTDsKKworICAgIGlmIChjYnVmLT5lbmRwb2ludCAhPSBOVUxMKSB7CisgICAgICAgIHFlbXVfY2hyX2Nsb3NlKGNidWYtPmVuZHBvaW50KTsKKyAgICAgICAgY2J1Zi0+ZW5kcG9pbnQgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludAorY2hhcmJ1ZmZlcl93cml0ZSggQ2hhckRyaXZlclN0YXRlKiAgY3MsIGNvbnN0IHVpbnQ4X3QqICBidWYsIGludCAgbGVuICkKK3sKKyAgICBDaGFyQnVmZmVyKiAgICAgICBjYnVmID0gY3MtPm9wYXF1ZTsKKyAgICBDaGFyRHJpdmVyU3RhdGUqICBwZWVyID0gY2J1Zi0+ZW5kcG9pbnQ7CisgICAgQmlwQnVmZmVyKiAgICAgICAgYmlwICA9IGNidWYtPmJpcF9sYXN0OworICAgIGludCAgICAgICAgICAgICAgIHJldCAgPSAwOworCisgICAgRCgiJXM6IHdyaXRpbmcgJWQgYnl0ZXMgdG8gJXA6ICclcyciLCBfX0ZVTkNUSU9OX18sCisgICAgICBsZW4sIGNidWYsIHF1b3RlX2J5dGVzKCBidWYsIGxlbiApKTsKKworICAgIGlmIChiaXAgPT0gTlVMTCAmJiBwZWVyICE9IE5VTEwpIHsKKyAgICAgICAgLyogbm8gYnVmZmVyZWQgZGF0YSwgdHJ5IHRvIHdyaXRlIGRpcmVjdGx5IHRvIHRoZSBwZWVyICovCisgICAgICAgIGludCAgc2l6ZSA9IHFlbXVfY2hyX3dyaXRlKHBlZXIsIGJ1ZiwgbGVuKTsKKworICAgICAgICBpZiAoc2l6ZSA8IDApICAvKiBqdXN0IHRvIGJlIHNhZmUgKi8KKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICBlbHNlIGlmIChzaXplID4gbGVuKQorICAgICAgICAgICAgc2l6ZSA9IGxlbjsKKworICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgcmV0ICs9IHNpemU7CisgICAgICAgIGxlbiAtPSBzaXplOworICAgIH0KKworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGJ1ZmZlciB0aGUgcmVtYWluaW5nIGRhdGEgKi8KKyAgICBpZiAoYmlwID09IE5VTEwpIHsKKyAgICAgICAgYmlwID0gYmlwX2J1ZmZlcl9hbGxvYygpOworICAgICAgICBjYnVmLT5iaXBfZmlyc3QgPSBjYnVmLT5iaXBfbGFzdCA9IGJpcDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBpbnQgIGxlbjIgPSBjYnVmZmVyX3dyaXRlKCBiaXAtPmNiLCBidWYsIGxlbiApOworCisgICAgICAgIGJ1ZiArPSBsZW4yOworICAgICAgICByZXQgKz0gbGVuMjsKKyAgICAgICAgbGVuIC09IGxlbjI7CisgICAgICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIG9rLCB3ZSBuZWVkIGFub3RoZXIgYnVmZmVyICovCisgICAgICAgIGNidWYtPmJpcF9sYXN0ID0gYmlwX2J1ZmZlcl9hbGxvYygpOworICAgICAgICBiaXAtPm5leHQgPSBjYnVmLT5iaXBfbGFzdDsKKyAgICAgICAgYmlwICAgICAgID0gY2J1Zi0+YmlwX2xhc3Q7CisgICAgfQorICAgIHJldHVybiAgcmV0OworfQorCisKK3N0YXRpYyB2b2lkCitjaGFyYnVmZmVyX3BvbGwoIENoYXJCdWZmZXIqICBjYnVmICkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUqICBwZWVyID0gY2J1Zi0+ZW5kcG9pbnQ7CisKKyAgICBpZiAocGVlciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBCaXBCdWZmZXIqICBiaXAgPSBjYnVmLT5iaXBfZmlyc3Q7CisgICAgICAgIHVpbnQ4X3QqICAgIGJhc2U7CisgICAgICAgIGludCAgICAgICAgIGF2YWlsOworICAgICAgICBpbnQgICAgICAgICBzaXplOworCisgICAgICAgIGlmIChiaXAgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGF2YWlsID0gY2J1ZmZlcl9yZWFkX3BlZWsoIGJpcC0+Y2IsICZiYXNlICk7CisgICAgICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICAgICAgICBjYnVmLT5iaXBfZmlyc3QgPSBiaXAtPm5leHQ7CisgICAgICAgICAgICBpZiAoY2J1Zi0+YmlwX2ZpcnN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgY2J1Zi0+YmlwX2xhc3QgPSBOVUxMOworICAgICAgICAgICAgYmlwX2J1ZmZlcl9mcmVlKGJpcCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPSBxZW11X2Nocl93cml0ZSggcGVlciwgYmFzZSwgYXZhaWwgKTsKKworICAgICAgICBpZiAoc2l6ZSA8IDApICAvKiBqdXN0IHRvIGJlIHNhZmUgKi8KKyAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICBlbHNlIGlmIChzaXplID4gYXZhaWwpCisgICAgICAgICAgICBzaXplID0gYXZhaWw7CisKKyAgICAgICAgY2J1ZmZlcl9yZWFkX3N0ZXAoIGJpcC0+Y2IsIHNpemUgKTsKKworICAgICAgICBpZiAoc2l6ZSA8IGF2YWlsKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitjaGFyYnVmZmVyX3VwZGF0ZV9oYW5kbGVycyggQ2hhckRyaXZlclN0YXRlKiAgY3MgKQoreworICAgIENoYXJCdWZmZXIqICBjYnVmID0gY3MtPm9wYXF1ZTsKKworICAgIHFlbXVfY2hyX2FkZF9oYW5kbGVycyggY2J1Zi0+ZW5kcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcy0+Y2hyX2Nhbl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmNocl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3MtPmNocl9ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzLT5oYW5kbGVyX29wYXF1ZSApOworfQorCisKK3N0YXRpYyB2b2lkCitjaGFyYnVmZmVyX2luaXQoIENoYXJCdWZmZXIqICBjYnVmLCBDaGFyRHJpdmVyU3RhdGUqICBlbmRwb2ludCApCit7CisgICAgQ2hhckRyaXZlclN0YXRlKiAgY3MgPSBjYnVmLT5jczsKKworICAgIGNidWYtPmJpcF9maXJzdCAgID0gTlVMTDsKKyAgICBjYnVmLT5iaXBfbGFzdCAgICA9IE5VTEw7CisgICAgY2J1Zi0+ZW5kcG9pbnQgICAgPSBlbmRwb2ludDsKKworICAgIGNzLT5jaHJfd3JpdGUgICAgICAgICAgICAgICA9IGNoYXJidWZmZXJfd3JpdGU7CisgICAgY3MtPmNocl9pb2N0bCAgICAgICAgICAgICAgID0gTlVMTDsKKyAgICBjcy0+Y2hyX3NlbmRfZXZlbnQgICAgICAgICAgPSBOVUxMOworICAgIGNzLT5jaHJfY2xvc2UgICAgICAgICAgICAgICA9IGNoYXJidWZmZXJfY2xvc2U7CisgICAgY3MtPmNocl91cGRhdGVfcmVhZF9oYW5kbGVyID0gY2hhcmJ1ZmZlcl91cGRhdGVfaGFuZGxlcnM7CisgICAgY3MtPm9wYXF1ZSAgICAgICAgICAgICAgICAgID0gY2J1ZjsKK30KKworI2RlZmluZSBNQVhfQ0hBUl9CVUZGRVJTICA4CisKK3N0YXRpYyBDaGFyQnVmZmVyICBfc19jaGFyYnVmZmVyc1sgTUFYX0NIQVJfQlVGRkVSUyBdOworCitDaGFyRHJpdmVyU3RhdGUqCitxZW11X2Nocl9vcGVuX2J1ZmZlciggQ2hhckRyaXZlclN0YXRlKiAgZW5kcG9pbnQgKQoreworICAgIENoYXJCdWZmZXIqICBjYnVmICAgICA9IF9zX2NoYXJidWZmZXJzOworICAgIENoYXJCdWZmZXIqICBjYnVmX2VuZCA9IGNidWYgKyBNQVhfQ0hBUl9CVUZGRVJTOworCisgICAgaWYgKGVuZHBvaW50ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yICggOyBjYnVmIDwgY2J1Zl9lbmQ7IGNidWYrKyApIHsKKyAgICAgICAgaWYgKGNidWYtPmVuZHBvaW50ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY2J1ZiA9PSBjYnVmX2VuZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjaGFyYnVmZmVyX2luaXQoY2J1ZiwgZW5kcG9pbnQpOworICAgIHJldHVybiBjYnVmLT5jczsKK30KKworCit2b2lkCitjaGFycGlwZV9wb2xsKCB2b2lkICkKK3sKKyAgICBDaGFyUGlwZVN0YXRlKiAgY3AgICAgID0gX3NfY2hhcnBpcGVzOworICAgIENoYXJQaXBlU3RhdGUqICBjcF9lbmQgPSBjcCArIE1BWF9DSEFSX1BJUEVTOworCisgICAgQ2hhckJ1ZmZlciogICAgIGNiICAgICA9IF9zX2NoYXJidWZmZXJzOworICAgIENoYXJCdWZmZXIqICAgICBjYl9lbmQgPSBjYiArIE1BWF9DSEFSX0JVRkZFUlM7CisKKyAgICAvKiBwb2xsIHRoZSBjaGFycGlwZXMgKi8KKyAgICBmb3IgKCA7IGNwIDwgY3BfZW5kOyBjcCsrICkgeworICAgICAgICBDaGFyUGlwZUhhbGYqICBoYWxmOworCisgICAgICAgIGhhbGYgPSBjcC0+YTsKKyAgICAgICAgaWYgKGhhbGYtPnBlZXIgIT0gTlVMTCkKKyAgICAgICAgICAgIGNoYXJwaXBlaGFsZl9wb2xsKGhhbGYpOworCisgICAgICAgIGhhbGYgPSBjcC0+YjsKKyAgICAgICAgaWYgKGhhbGYtPnBlZXIgIT0gTlVMTCkKKyAgICAgICAgICAgIGNoYXJwaXBlaGFsZl9wb2xsKGhhbGYpOworICAgIH0KKworICAgIC8qIHBvbGwgdGhlIGNoYXJidWZmZXJzICovCisgICAgZm9yICggOyBjYiA8IGNiX2VuZDsgY2IrKyApIHsKKyAgICAgICAgaWYgKGNiLT5lbmRwb2ludCAhPSBOVUxMKQorICAgICAgICAgICAgY2hhcmJ1ZmZlcl9wb2xsKGNiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vY2hhcnBpcGUuaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9jaGFycGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNjI0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vY2hhcnBpcGUuaApAQCAtMCwwICsxLDM1IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisvKiBvcGVuIHR3byBjb25uZWN0ZWQgY2hhcmFjdGVyIGRyaXZlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSBieSBpbnRlcm5hbAorICogUUVNVSBjb21wb25lbnRzLiBGb3IgQW5kcm9pZCwgdGhpcyBpcyB1c2VkIHRvIGNvbm5lY3QgYW4gZW11bGF0ZWQgc2VyaWFsIHBvcnQKKyAqIHdpdGggdGhlIGFuZHJvaWQgbW9kZW0KKyAqLworZXh0ZXJuIGludCAgcWVtdV9jaHJfb3Blbl9jaGFycGlwZSggQ2hhckRyaXZlclN0YXRlKiAqcGZpcnN0LCBDaGFyRHJpdmVyU3RhdGUqICpwc2Vjb25kICk7CisKKy8qIGNyZWF0ZSBhIGJ1ZmZlcmluZyBjaGFyYWN0ZXIgZHJpdmVyIGZvciBhIGdpdmVuIGVuZHBvaW50LiBUaGUgcmVzdWx0IHdpbGwgYnVmZmVyCisgKiBhbnl0aGluZyB0aGF0IGlzIHNlbnQgdG8gaXQgYnV0IGNhbm5vdCBiZSBzZW50IHRvIHRoZSBlbmRwb2ludCBpbW1lZGlhdGVseS4KKyAqIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZW5kcG9pbnQgY2FsbHMgY2FuX3JlYWQoKSBvciByZWFkKCksIHRoZXNlIGNhbGxzCisgKiBhcmUgcGFzc2VkIGltbWVkaWF0ZWx5IHRvIHRoZSBjYW5fcmVhZCgpIG9yIHJlYWQoKSBoYW5kbGVycyBvZiB0aGUgcmVzdWx0LgorICovCitleHRlcm4gQ2hhckRyaXZlclN0YXRlKiAgcWVtdV9jaHJfb3Blbl9idWZmZXIoIENoYXJEcml2ZXJTdGF0ZSogIGVuZHBvaW50ICk7CisKKy8qIG11c3QgYmUgY2FsbGVkIGZyb20gdGhlIG1haW4gZXZlbnQgbG9vcCB0byBwb2xsIGFsbCBjaGFycGlwZXMgKi8KK2V4dGVybiB2b2lkIGNoYXJwaXBlX3BvbGwoIHZvaWQgKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vc2VyaWFsX2xpbmUuY3BwIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL3NlcmlhbF9saW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIzN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL3NlcmlhbF9saW5lLmNwcApAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vc2VyaWFsX2xpbmUuaCIKKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9lbXVsYXRpb24vY2hhcnBpcGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL0NoYXJTZXJpYWxMaW5lLmgiCisKK3VzaW5nIGFuZHJvaWQ6OnFlbXUxOjpDaGFyU2VyaWFsTGluZTsKK3VzaW5nIGFuZHJvaWQ6OlNlcmlhbExpbmU7CisKK0NTZXJpYWxMaW5lKiBhbmRyb2lkX3NlcmlhbGxpbmVfZnJvbV9jcyhDaGFyRHJpdmVyU3RhdGUqIGNzKSB7CisgICAgcmV0dXJuIG5ldyBDaGFyU2VyaWFsTGluZShjcyk7Cit9CisKK0NoYXJEcml2ZXJTdGF0ZSogYW5kcm9pZF9zZXJpYWxsaW5lX2dldF9jcyhDU2VyaWFsTGluZSogc2wpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hhclNlcmlhbExpbmUqPihzbCktPnN0YXRlKCk7Cit9CisKK0NoYXJEcml2ZXJTdGF0ZSogYW5kcm9pZF9zZXJpYWxsaW5lX3JlbGVhc2VfY3MoQ1NlcmlhbExpbmUqIHNsKSB7CisgICAgQ2hhclNlcmlhbExpbmUqIGNzbCA9IHN0YXRpY19jYXN0PENoYXJTZXJpYWxMaW5lKj4oc2wpOworICAgIENoYXJEcml2ZXJTdGF0ZSogcmVzdWx0ID0gY3NsLT5yZWxlYXNlKCk7CisgICAgZGVsZXRlIGNzbDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgU2VyaWFsTGluZSogcWVtdV9zZXJpYWxsaW5lX2J1ZmZlcl9vcGVuKFNlcmlhbExpbmUqIHNsKSB7CisgICAgQ2hhckRyaXZlclN0YXRlKiBjcyA9IHN0YXRpY19jYXN0PENoYXJTZXJpYWxMaW5lKj4oc2wpLT5zdGF0ZSgpOworICAgIHJldHVybiBuZXcgQ2hhclNlcmlhbExpbmUocWVtdV9jaHJfb3Blbl9idWZmZXIoY3MpKTsKK30KKworc3RhdGljIGJvb2wgcWVtdV9zZXJpYWxsaW5lX3BpcGVfb3BlbihTZXJpYWxMaW5lKiogcGZpcnN0LCBTZXJpYWxMaW5lKiogcHNlY29uZCkgeworICAgIENoYXJEcml2ZXJTdGF0ZSogZmlyc3RfY3MgPSBOVUxMOworICAgIENoYXJEcml2ZXJTdGF0ZSogc2Vjb25kX2NzID0gTlVMTDsKKworICAgIGlmIChxZW11X2Nocl9vcGVuX2NoYXJwaXBlKCZmaXJzdF9jcywgJnNlY29uZF9jcykpIHsKKyAgICAgICAgKnBmaXJzdCA9IE5VTEw7CisgICAgICAgICpwc2Vjb25kID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgICpwZmlyc3QgPSBuZXcgQ2hhclNlcmlhbExpbmUoZmlyc3RfY3MpOworICAgICpwc2Vjb25kID0gbmV3IENoYXJTZXJpYWxMaW5lKHNlY29uZF9jcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcWVtdTFfYW5kcm9pZF9zZXJpYWxsaW5lX2luaXQoKSB7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlNlcmlhbExpbmU6OkZ1bmNzIGtRZW11U2VyaWFsTGluZUZ1bmNzID0geworICAgICAgICAub3BlbkJ1ZmZlciA9IHFlbXVfc2VyaWFsbGluZV9idWZmZXJfb3BlbiwKKyAgICAgICAgLm9wZW5QaXBlID0gcWVtdV9zZXJpYWxsaW5lX3BpcGVfb3BlbgorICAgIH07CisKKyAgICBhbmRyb2lkOjpTZXJpYWxMaW5lOjpGdW5jczo6cmVzZXQoJmtRZW11U2VyaWFsTGluZUZ1bmNzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwYjZlZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKworLy8gQ2FsbCB0aGlzIGR1cmluZyBzZXR1cCB0byBpbmplY3QgUUVNVTEtc3BlY2lmaWMgU2VyaWFsTGluZQorLy8gaW1wbGVtZW50YXRpb24gaW50byB0aGUgcHJvY2Vzcy4KK3ZvaWQgcWVtdTFfYW5kcm9pZF9zZXJpYWxsaW5lX2luaXQodm9pZCk7CisKKy8vIENyZWF0ZSBhIG5ldyBDU2VyaWFsTGluZSBpbnN0YW5jZSB0aGF0IHdyYXBzIGEgQ2hhckRyaXZlclN0YXRlIHxjc3wuCitDU2VyaWFsTGluZSogYW5kcm9pZF9zZXJpYWxsaW5lX2Zyb21fY3MoQ2hhckRyaXZlclN0YXRlKiBjcyk7CisKKy8vIEV4dHJhY3QgdGhlIFFFTVUxIENoYXJEcml2ZXJTdGF0ZSBpbnN0YW5jZSB3cmFwcGVkIGJ5IGEgQ1NlcmlhbExpbmUKKy8vIGluc3RhbmNlIHxzbHwuCitDaGFyRHJpdmVyU3RhdGUqIGFuZHJvaWRfc2VyaWFsbGluZV9nZXRfY3MoQ1NlcmlhbExpbmUqIHNsKTsKKworLy8gRXh0cmFjdCB0aGUgQ2hhckRyaXZlclN0YXRlIGluc3RhbmNlIHdyYXBwZWQgYnkgfHNsfCwgYnV0IGFsc28KKy8vIGRlc3Ryb3lzIHRoZSBDU2VyaWFsTGluZSBpbnN0YW5jZS4KK0NoYXJEcml2ZXJTdGF0ZSogYW5kcm9pZF9zZXJpYWxsaW5lX3JlbGVhc2VfY3MoQ1NlcmlhbExpbmUqIHNsKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAzNDVhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2xvb3Blci1xZW11LmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2Jhc2UvYXN5bmMvTG9vcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2FzeW5jL0xvb3Blci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisKK3R5cGVkZWYgOjpMb29wZXIgQ0xvb3BlcjsKKwordm9pZCBxZW11X2xvb3Blcl9zZXRGb3JUaHJlYWQodm9pZCkgeworICAgIGxvb3Blcl9zZXRGb3JUaHJlYWRUb093bigKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0xvb3Blcio+KDo6YW5kcm9pZDo6cWVtdTo6Y3JlYXRlTG9vcGVyKCkpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL2xvb3Blci1xZW11LmggYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZWJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbG9vcGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIENyZWF0ZSBhIG5ldyBsb29wZXIgd2hpY2ggaXMgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSBRRU1VIG1haW4gZXZlbnQKKyAqIGxvb3AuIFlvdSBzaG91bGQgb25seSB1c2UgdGhpcyB3aGVuIGltcGxlbWVudGluZyB0aGUgZW11bGF0b3IgVUkgYW5kIENvcmUKKyAqIGZlYXR1cmVzIGluIGEgc2luZ2xlIHByb2dyYW0gZXhlY3V0YWJsZS4KKyAqLwordm9pZCAgcWVtdV9sb29wZXJfc2V0Rm9yVGhyZWFkKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL21haW4uYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGEzYmIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvbWFpbi5jCkBAIC0wLDAgKzEsMjcwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWttc2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL21haW4tY29tbW9uLXVpLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tYWluLWNvbW1vbi5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1rZXJuZWwtcGFyYW1ldGVycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWFpbi1xZW11LXBhcmFtZXRlcnMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3Byb2Nlc3Nfc2V0dXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9hY29uZmlnLWZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9maWxlbG9jay5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvbGluZWlucHV0LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtY29udHJvbC1pbXBsLmgiCisjaWZkZWYgX19BUFBMRV9fCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3NraW5fcXQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjZGVmaW5lICBEKC4uLikgIGRvIHsgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSBkcHJpbnQoX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCitpbnQgcWVtdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK3ZvaWQgZW50ZXJfcWVtdV9tYWluX2xvb3AoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWZuZGVmIF9XSU4zMgorICAgIHNpZ3NldF90IHNldDsKKyAgICBzaWdlbXB0eXNldCgmc2V0KTsKKyAgICBwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZzZXQsIE5VTEwpOworI2VuZGlmCisKKyAgICBEKCJTdGFydGluZyBRRU1VIG1haW4gbG9vcCIpOworICAgIHFlbXVfbWFpbihhcmdjLCBhcmd2KTsKKyAgICBEKCJEb25lIHdpdGggUUVNVSBtYWluIGxvb3AiKTsKK30KKworI2lmIGRlZmluZWQoX1dJTjMyKQorLy8gT24gV2luZG93cywgbGluayBhZ2FpbnN0IHF0bWFpbi5saWIgd2hpY2ggcHJvdmlkZXMgYSBXaW5NYWluKCkKKy8vIGltcGxlbWVudGF0aW9uLCB0aGF0IGxhdGVyIGNhbGxzIHFNYWluKCkuCisjZGVmaW5lIG1haW4gcXRfbWFpbgorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGNoYXIqIGFyZ3NbMTI4XTsKKyAgICBBbmRyb2lkSHdDb25maWcqIGh3ID0gYW5kcm9pZF9odzsKKyAgICBBdmRJbmZvKiBhdmQ7CisgICAgaW50IGV4aXRTdGF0dXMgPSAxOworCisgICAgQW5kcm9pZE9wdGlvbnMgIG9wdHNbMV0gPSB7fTsKKworICAgIHByb2Nlc3NfZWFybHlfc2V0dXAoYXJnYywgYXJndik7CisKKyAgICBjb25zdCBjaGFyKiBhcmd2MCA9IGFyZ3ZbMF07CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBrVGFyZ2V0QXJjaFtdID0KKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pCisgICAgICAgICJhcm0iCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9JMzg2KQorICAgICAgICAieDg2IgorI2VsaWYgZGVmaW5lZChUQVJHRVRfWDg2XzY0KQorICAgICAgICAieDg2XzY0IgorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyAgICAgICAgIm1pcHMiCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgICJtaXBzNjQiCisjZWxzZQorI2Vycm9yICJVbmtub3duIHRhcmdldCBDUFUgYXJjaGl0ZWN0dXJlIgorI2VuZGlmCisgICAgICAgIDsKKworICAgICAgICBpZiAoIWVtdWxhdG9yX3BhcnNlQ29tbW9uQ29tbWFuZExpbmVPcHRpb25zKCZhcmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUYXJnZXRBcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gaXNfcWVtdTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmRyb2lkX2F2ZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4aXRTdGF0dXMpKSB7CisgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIFFFTVUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgaWYgKGV4aXRTdGF0dXMgPT0gRU1VTEFUT1JfRVhJVF9TVEFUVVNfUE9TSVRJT05BTF9RRU1VX1BBUkFNRVRFUikgeworICAgICAgICAgICAgICAgIC8vIENvcHkgYWxsIFFFTVUgb3B0aW9ucyB0byB8YXJnc3wsIGFuZCBzZXQgfG58IHRvIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgICAvLyBvZiBvcHRpb25zIGluIHxhcmdzfCAofGFyZ2N8IG11c3QgYmUgcG9zaXRpdmUgaGVyZSkuCisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgZm9yIChuID0gMTsgbiA8PSBhcmdjOyArK24pIHsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1tuXSA9IGFyZ3ZbbiAtIDFdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHRyYW5zbGF0aW9uIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBqdW1wCisgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgdG8gcWVtdV9tYWluKCkuCisgICAgICAgICAgICAgICAgZW50ZXJfcWVtdV9tYWluX2xvb3AobiwgYXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE5vcm1hbCBleGl0LgorICAgICAgICAgICAgcmV0dXJuIGV4aXRTdGF0dXM7CisgICAgICAgIH0KKworICAgIC8vIHdlIGtub3cgaXQncyBxZW11MSwgYW5kIGRvbid0IGNhcmUgd2hhdCB1c2VyIHdhbnRlZCB0byB0cmljayB1cyBpbnRvCisgICAgb3B0cy0+cmFuY2h1ID0gMDsKKworICAgIGF2ZCA9IGFuZHJvaWRfYXZkSW5mbzsKKworICAgIGlmICghZW11bGF0b3JfcGFyc2VVaUNvbW1hbmRMaW5lT3B0aW9ucyhvcHRzLCBhdmQsIGh3KSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLyBPdmVyaWRlIGRlZmF1bHQgbnVsbCBTZXJpYWxMaW5lIGltcGxlbWVudGF0aW9uCisgICAgLy8gYmVmb3JlIGFuZHJvaWRfa21zZ19pbml0KCkKKyAgICBxZW11MV9hbmRyb2lkX3NlcmlhbGxpbmVfaW5pdCgpOworCisgICAgaWYgKG9wdHMtPnNob3dfa2VybmVsKSB7CisgICAgICAvLyBFbnN1cmUga2VybmVsIG1lc3NhZ2VzIGFyZSBwcmludGVkIHRvIHN0ZG91dC4KKyAgICAgIGFuZHJvaWRfa21zZ19pbml0KEFORFJPSURfS01TR19QUklOVF9NRVNTQUdFUyk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogc2VyaWFsUHJlZml4ID0gYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbFNlcmlhbFByZWZpeChodyk7CisgICAgQW5kcm9pZEdsZXNFbXVsYXRpb25Nb2RlIGdsZXNNb2RlID0ga0FuZHJvaWRHbGVzRW11bGF0aW9uT2ZmOworCisgICAgaWYgKCFzdHJjbXAoYW5kcm9pZF9ody0+aHdfZ3B1X21vZGUsICJndWVzdCIpKSB7CisgICAgICAgIGdsZXNNb2RlID0ga0FuZHJvaWRHbGVzRW11bGF0aW9uR3Vlc3Q7CisgICAgfSBlbHNlIGlmIChhbmRyb2lkX2h3LT5od19ncHVfZW5hYmxlZCkgeworICAgICAgICBnbGVzTW9kZSA9IGtBbmRyb2lkR2xlc0VtdWxhdGlvbkhvc3Q7CisgICAgfQorCisgICAgaW50IGFwaUxldmVsID0gYXZkSW5mb19nZXRBcGlMZXZlbChhdmQpOworCisgICAgY2hhcioga2VybmVsUGFyYW1ldGVycyA9IGVtdWxhdG9yX2dldEtlcm5lbFBhcmFtZXRlcnMoCisgICAgICAgIG9wdHMsIGtUYXJnZXRBcmNoLCBhcGlMZXZlbCwgc2VyaWFsUHJlZml4LCBody0+a2VybmVsX3BhcmFtZXRlcnMsCisgICAgICAgIGdsZXNNb2RlLCAwVUxMLCBmYWxzZSk7CisKKyAgICBpZiAoaHctPmh3X2NwdV9uY29yZSA+IDEpIHsKKyAgICAgICAgLy8gQXZvaWQgcHJpbnRpbmcgdGhpcyB3YXJuaW5nIGFsbCB0aGUgdGltZSBiZWNhdXNlIHRoZSBkZWZhdWx0CisgICAgICAgIC8vIHZhbHVlIGZvciB0aGlzIGhhcmR3YXJlIHByb3BlcnR5IGlzIG5vdyAyLCBtZWFuaW5nIHRoYXQgYW55CisgICAgICAgIC8vIG5ldyBBVkQgY3JlYXRlZCBieSB0aGUgdXNlciB3aWxsIHRyaWdnZXIgdGhpcyBjb25kaXRpb24sIGV2ZW4KKyAgICAgICAgLy8gdGhvdWdoIHRoZXkgZGlkbid0IHNwZWNpZmljYWxseSBhc2sgZm9yIGl0LiBBcyBhIHJ1bGUgb2YgdGh1bWIsCisgICAgICAgIC8vIGl0J3MgYWx3YXlzIGJldHRlciB0byBwcmludCBhIHdhcm5pbmcgd2hlbiBpdCBjb3JyZXNwb25kcyB0bworICAgICAgICAvLyBhIHVzZXItc2VsZWN0YWJsZSBjb25kaXRpb24sIG5vdCBhIGRlZmF1bHQuCisgICAgICAgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSB7CisgICAgICAgICAgICBkd2FybmluZygiQ2xhc3NpYyBxZW11IGRvZXMgbm90IHN1cHBvcnQgU01QLiAiCisgICAgICAgICAgICAgICAgICAgICAiVGhlIGh3LmNwdS5uY29yZSBvcHRpb24gZnJvbSB5b3VyIGNvbmZpZyBmaWxlIGlzIGlnbm9yZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZW5lcmF0ZSBhIGhhcmR3YXJlLXFlbXUuaW5pIGZvciB0aGlzIEFWRC4gVGhlIHJlYWwgaGFyZHdhcmUKKyAgICAgKiBjb25maWd1cmF0aW9uIGlzIHVzdXNhbGx5IHN0b3JlZCBpbiBzZXZlcmFsIGZpbGVzLCBlLmcuIHRoZSBBVkQncworICAgICAqIGNvbmZpZy5pbmkgcGx1cyB0aGUgc2tpbi1zcGVjaWZpYyBoYXJkd2FyZS5pbmkuCisgICAgICoKKyAgICAgKiBUaGUgbmV3IGZpbGUgd2lsbCBncm91cCBhbGwgZGVmaW5pdGlvbnMgYW5kIHdpbGwgYmUgdXNlZCB0bworICAgICAqIGxhdW5jaCB0aGUgY29yZSB3aXRoIHRoZSAtYW5kcm9pZC1odyA8ZmlsZT4gb3B0aW9uLgorICAgICAqLworICAgIGNvbnN0IGNoYXIqIGNvcmVId0luaVBhdGggPSBhdmRJbmZvX2dldENvcmVId0luaVBhdGgoYXZkKTsKKyAgICB7CisgICAgICAgIENJbmlGaWxlKiBod0luaSA9IGluaUZpbGVfbmV3RW1wdHkoTlVMTCk7CisgICAgICAgIGFuZHJvaWRId0NvbmZpZ193cml0ZShodywgaHdJbmkpOworCisgICAgICAgIGlmIChmaWxlbG9ja19jcmVhdGUoY29yZUh3SW5pUGF0aCkgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gVGhlIEFWRCBpcyBhbHJlYWR5IGluIHVzZQorICAgICAgICAgICAgZGVycm9yKCJUaGVyZSdzIGFub3RoZXIgZW11bGF0b3IgaW5zdGFuY2UgcnVubmluZyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAidGhlIGN1cnJlbnQgQVZEICclcycuIEV4aXRpbmcuLi5cbiIsIGF2ZEluZm9fZ2V0TmFtZShhdmQpKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgLyogV2hpbGUgc2F2aW5nIEhXIGNvbmZpZywgaWdub3JlIHZhbHVlbGVzcyBlbnRyaWVzLiBUaGlzIHdpbGwgbm90IGJyZWFrCisgICAgICAgICAqIGFueXRoaW5nLCBidXQgd2lsbCBzaWduaWZpY2FudGx5IHNpbXBsaWZ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBIVworICAgICAgICAgKiBjb25maWcgd2l0aCB0aGUgb25lIHRoYXQgaGFzIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGEgc25hcHNob3QgKGluIGNhc2UKKyAgICAgICAgICogVk0gc3RhcnRzIGZyb20gYSBzbmFwc2hvdCBmb3IgdGhpcyBpbnN0YW5jZSBvZiBlbXVsYXRvcikuICovCisgICAgICAgIGlmIChpbmlGaWxlX3NhdmVUb0ZpbGVDbGVhbihod0luaSwgY29yZUh3SW5pUGF0aCkgPCAwKSB7CisgICAgICAgICAgICBkZXJyb3IoIkNvdWxkIG5vdCB3cml0ZSBoYXJkd2FyZS5pbmkgdG8gJXM6ICVzIiwgY29yZUh3SW5pUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisKKyAgICAgICAgY3Jhc2hoYW5kbGVyX2NvcHlfYXR0YWNobWVudChDUkFTSF9BVkRfSEFSRFdBUkVfSU5GTywgY29yZUh3SW5pUGF0aCk7CisKKyAgICAgICAgLyogSW4gdmVyYm9zZSBtb2RlLCBkdW1wIHRoZSBmaWxlJ3MgY29udGVudCAqLworICAgICAgICBpZiAoVkVSQk9TRV9DSEVDSyhpbml0KSkgeworICAgICAgICAgICAgRklMRSogZmlsZSA9IGZvcGVuKGNvcmVId0luaVBhdGgsICJydCIpOworICAgICAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGRlcnJvcigiQ291bGQgbm90IG9wZW4gaGFyZHdhcmUgY29uZmlndXJhdGlvbiBmaWxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29yZUh3SW5pUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExpbmVJbnB1dCogaW5wdXQgPSBsaW5lSW5wdXRfbmV3RnJvbVN0ZEZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGluZTsKKyAgICAgICAgICAgICAgICBwcmludGYoIkNvbnRlbnQgb2YgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBmaWxlOlxuIik7CisgICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gbGluZUlucHV0X2dldExpbmUoaW5wdXQpKSAhPSAgTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgJXNcbiIsIGxpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIi5cbiIpOworICAgICAgICAgICAgICAgIGxpbmVJbnB1dF9mcmVlKGlucHV0KTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOT1RFOiB8YXJnY3wgYW5kIHxhcmd2fCBoYXZlIGJlZW4gYWRqdXN0ZWQgYnkgdGhlCisgICAgLy8gZW11bGF0b3JfcGFyc2VDb21tb25Db21tYW5kTGluZU9wdGlvbnMoKSBmdW5jdGlvbiBhbmQgbm93CisgICAgLy8gY29ycmVzcG9uZHMgdG8gdGhlIHBhcmFtZXRlcnMgZm9sbG93aW5nIC1xZW11LCBpZiBhbnkuCisgICAgUWVtdVBhcmFtZXRlcnMqIHFlbXVQYXJhbXMgPSBxZW11X3BhcmFtZXRlcnNfY3JlYXRlKAorICAgICAgICBhcmd2MCwgYXJnYywgKGNvbnN0IGNoYXIqIGNvbnN0Kilhcmd2LCBvcHRzLCBhdmQsIGtlcm5lbFBhcmFtZXRlcnMsCisgICAgICAgIGNvcmVId0luaVBhdGgsIGZhbHNlLCAgLy8gaXNfcWVtdTIKKyAgICAgICAga1RhcmdldEFyY2gpOworICAgIGlmICghcWVtdVBhcmFtcykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0aWMgVWlFbXVBZ2VudCB1aUVtdUFnZW50OworICAgIHVpRW11QWdlbnQuYmF0dGVyeSA9IGdRQW5kcm9pZEJhdHRlcnlBZ2VudDsKKyAgICB1aUVtdUFnZW50LmNlbGx1bGFyID0gZ1FBbmRyb2lkQ2VsbHVsYXJBZ2VudDsKKyAgICB1aUVtdUFnZW50LmZpbmdlciA9IGdRQW5kcm9pZEZpbmdlckFnZW50OworICAgIHVpRW11QWdlbnQubG9jYXRpb24gPSBnUUFuZHJvaWRMb2NhdGlvbkFnZW50OworICAgIHVpRW11QWdlbnQuc2Vuc29ycyA9IGdRQW5kcm9pZFNlbnNvcnNBZ2VudDsKKyAgICB1aUVtdUFnZW50LnRlbGVwaG9ueSA9IGdRQW5kcm9pZFRlbGVwaG9ueUFnZW50OworICAgIHVpRW11QWdlbnQudXNlckV2ZW50cyA9IGdRQW5kcm9pZFVzZXJFdmVudEFnZW50OworICAgIHVpRW11QWdlbnQud2luZG93ID0gZ1FBbmRyb2lkRW11bGF0b3JXaW5kb3dBZ2VudDsKKworICAgIC8vIGZvciBub3cgdGhlcmUncyBubyB1c2VzIG9mIFNldHRpbmdzQWdlbnQsIHNvIHdlIGRvbid0IHNldCBpdAorICAgIHVpRW11QWdlbnQuc2V0dGluZ3MgPSBOVUxMOworCisgICAgLyogU2V0dXAgU0RMIFVJIGp1c3QgYmVmb3JlIGNhbGxpbmcgdGhlIGNvZGUgKi8KKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzaWdzZXRfdCBzZXQ7CisgICAgc2lnZmlsbHNldCgmc2V0KTsKKyAgICBwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZzZXQsIE5VTEwpOworI2VuZGlmCisgICAgc2tpbl93aW5zeXNfaW5pdF9hcmdzKGFyZ2MsIGFyZ3YpOworCisgICAgaWYgKCFlbXVsYXRvcl9pbml0VXNlckludGVyZmFjZShvcHRzLCAmdWlFbXVBZ2VudCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGIuYW5kcm9pZC5jb20vMTk4MjU2CisgICAgLy8gUWVtdTEgUVQgR1VJIG9uIE9TWCBjcmFzaGVzIG9uIGV4aXQgd2hlbiBRVCByZWxlYXNlcyBOU1dpbmRvdy4KKyAgICAvLyBRZW11MiBidWlsZHMgZG8gbm90IHNob3cgdGhpcyBjcmFzaCBiZWhhdmlvci4KKyAgICAvLyBXb3JrYXJvdW5kIGxlYWtzIHRoZSBFbXVsYXRvclF0V2luZG93IGluc3RhbmNlLCB3aGljaCB3YXMgdGhlIHVuZGVzaXJlZAorICAgIC8vIGJlaGF2aW9yIHByaW9yIHRvIGh0dHBzOi8vYW5kcm9pZC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS8jL2MvMTk5MDY4LworICAgIC8vIFJvb3QgY2F1c2UgaGFzIG5vdCBiZWVuIGlkZW50aWZpZWQKKyNpZmRlZiBfX0FQUExFX18KKyAgICBza2luX2FjcXVpcmVfd2luZG93X2luc3QoKTsKKyNlbmRpZgorICAgIHNraW5fd2luc3lzX3NwYXduX3RocmVhZChvcHRzLT5ub193aW5kb3csIGVudGVyX3FlbXVfbWFpbl9sb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X3BhcmFtZXRlcnNfc2l6ZShxZW11UGFyYW1zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9wYXJhbWV0ZXJzX2FycmF5KHFlbXVQYXJhbXMpKTsKKworICAgIHNraW5fd2luc3lzX2VudGVyX21haW5fbG9vcChvcHRzLT5ub193aW5kb3cpOworCisgICAgZW11bGF0b3JfZmluaVVzZXJJbnRlcmZhY2UoKTsKKworICAgIHFlbXVfcGFyYW1ldGVyc19mcmVlKHFlbXVQYXJhbXMpOworCisgICAgcHJvY2Vzc19sYXRlX3RlYXJkb3duKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWJhdHRlcnktYWdlbnQtaW1wbC5jIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1iYXR0ZXJ5LWFnZW50LWltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGZkZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1iYXR0ZXJ5LWFnZW50LWltcGwuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvYmF0dGVyeV9hZ2VudC5oIgorI2luY2x1ZGUgImh3L3Bvd2VyX3N1cHBseS5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisKK3N0YXRpYyB2b2lkIGJhdHRlcnlfc2V0SXNCYXR0ZXJ5UHJlc2VudChib29sIGlzUHJlc2VudCkgeworICAgIGdvbGRmaXNoX2JhdHRlcnlfc2V0X3Byb3AoMCwgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwgaXNQcmVzZW50KTsKK30KKworc3RhdGljIGJvb2wgYmF0dGVyeV9wcmVzZW50KCkgeworICAgIHJldHVybiAoYm9vbClnb2xkZmlzaF9iYXR0ZXJ5X3JlYWRfcHJvcChQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UKTsKK30KKworc3RhdGljIHZvaWQgYmF0dGVyeV9zZXRJc0NoYXJnaW5nKGJvb2wgaXNDaGFyZ2luZykgeworICAgIGdvbGRmaXNoX2JhdHRlcnlfc2V0X3Byb3AoMSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCBpc0NoYXJnaW5nKTsKK30KKworc3RhdGljIGJvb2wgYmF0dGVyeV9jaGFyZ2luZygpIHsKKyAgICByZXR1cm4gKGJvb2wpZ29sZGZpc2hfYmF0dGVyeV9yZWFkX3Byb3AoUE9XRVJfU1VQUExZX1BST1BfT05MSU5FKTsKK30KKworc3RhdGljIHZvaWQgYmF0dGVyeV9zZXRDaGFyZ2VyKGVudW0gQmF0dGVyeUNoYXJnZXIgY2hhcmdlcikgeworICAgIGJhdHRlcnlfc2V0SXNDaGFyZ2luZyggY2hhcmdlciAhPSBCQVRURVJZX0NIQVJHRVJfTk9ORSApOworCisgICAgLy8gVE9ETzogTmVlZCB0byBzYXZlIHRoZSBmdWxsIGVudW0gYW5kIGNvbnZleSBpdCB0byB0aGUgQVZECit9CisKK3N0YXRpYyBlbnVtIEJhdHRlcnlDaGFyZ2VyIGJhdHRlcnlfY2hhcmdlcigpIHsKKyAgICByZXR1cm4gKCBiYXR0ZXJ5X2NoYXJnaW5nKCkgPyBCQVRURVJZX0NIQVJHRVJfQUMgOiBCQVRURVJZX0NIQVJHRVJfTk9ORSApOworICAgIC8vIFRPRE86IE5lZWQgdG8gZ2V0IHRoZSBmdWxsIGVudW0gZnJvbSB0aGUgQVZECit9CisKK3N0YXRpYyB2b2lkIGJhdHRlcnlfc2V0Q2hhcmdlTGV2ZWwoaW50IHBlcmNlbnRGdWxsKSB7CisgICAgZ29sZGZpc2hfYmF0dGVyeV9zZXRfcHJvcCgwLCBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwgcGVyY2VudEZ1bGwpOworfQorCitzdGF0aWMgaW50IGJhdHRlcnlfY2hhcmdlTGV2ZWwoKSB7CisgICAgcmV0dXJuIGdvbGRmaXNoX2JhdHRlcnlfcmVhZF9wcm9wKFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZKTsKK30KKworc3RhdGljIHZvaWQgYmF0dGVyeV9zZXRIZWFsdGgoZW51bSBCYXR0ZXJ5SGVhbHRoIGhlYWx0aCkgeworICAgIGludCB2YWx1ZTsKKworICAgIHN3aXRjaCAoaGVhbHRoKSB7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfR09PRDogICAgICAgICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfRkFJTEVEOiAgICAgICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOyAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfREVBRDogICAgICAgICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfT1ZFUlZPTFRBR0U6ICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfT1ZFUkhFQVRFRDogICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9IRUFMVEhfVU5LTk9XTjogICAgICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047ICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTjsgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnb2xkZmlzaF9iYXR0ZXJ5X3NldF9wcm9wKDAsIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwgdmFsdWUpOworfQorCitzdGF0aWMgZW51bSBCYXR0ZXJ5SGVhbHRoIGJhdHRlcnlfaGVhbHRoKCkgeworICAgIHN3aXRjaCAoIGdvbGRmaXNoX2JhdHRlcnlfcmVhZF9wcm9wKFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCkgKSB7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOiAgICAgICAgICAgcmV0dXJuIEJBVFRFUllfSEVBTFRIX0dPT0Q7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTogcmV0dXJuIEJBVFRFUllfSEVBTFRIX0ZBSUxFRDsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6ICAgICAgICAgICByZXR1cm4gQkFUVEVSWV9IRUFMVEhfREVBRDsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOiAgICByZXR1cm4gQkFUVEVSWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDogICAgICAgcmV0dXJuIEJBVFRFUllfSEVBTFRIX09WRVJIRUFURUQ7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOiAgICAgICAgcmV0dXJuIEJBVFRFUllfSEVBTFRIX1VOS05PV047CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFUVEVSWV9IRUFMVEhfVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJhdHRlcnlfc2V0U3RhdHVzKGVudW0gQmF0dGVyeVN0YXR1cyBzdGF0dXMpIHsKKyAgICBpbnQgdmFsdWU7CisKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIEJBVFRFUllfU1RBVFVTX1VOS05PV046ICAgICAgIHZhbHVlID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOyAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCQVRURVJZX1NUQVRVU19DSEFSR0lORzogICAgICB2YWx1ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkc6ICAgdmFsdWUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOyAgIGJyZWFrOworICAgICAgICBjYXNlIEJBVFRFUllfU1RBVFVTX05PVF9DSEFSR0lORzogIHZhbHVlID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7ICBicmVhazsKKyAgICAgICAgY2FzZSBCQVRURVJZX1NUQVRVU19GVUxMOiAgICAgICAgICB2YWx1ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ29sZGZpc2hfYmF0dGVyeV9zZXRfcHJvcCgwLCBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsIHZhbHVlKTsKK30KKworc3RhdGljIGVudW0gQmF0dGVyeVN0YXR1cyBiYXR0ZXJ5X3N0YXR1cygpIHsKKyAgICBzd2l0Y2ggKCBnb2xkZmlzaF9iYXR0ZXJ5X3JlYWRfcHJvcChQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMpICkgeworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjogICAgICAgcmV0dXJuIEJBVFRFUllfU1RBVFVTX1VOS05PV047CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzogICAgICByZXR1cm4gQkFUVEVSWV9TVEFUVVNfQ0hBUkdJTkc7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzogICByZXR1cm4gQkFUVEVSWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc6ICByZXR1cm4gQkFUVEVSWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDogICAgICAgICAgcmV0dXJuIEJBVFRFUllfU1RBVFVTX0ZVTEw7CisKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQVRURVJZX1NUQVRVU19VTktOT1dOOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IFFBbmRyb2lkQmF0dGVyeUFnZW50IHNRQW5kcm9pZEJhdHRlcnlBZ2VudCA9IHsKKyAgICAgICAgLnNldElzQmF0dGVyeVByZXNlbnQgPSBiYXR0ZXJ5X3NldElzQmF0dGVyeVByZXNlbnQsCisgICAgICAgIC5wcmVzZW50ID0gYmF0dGVyeV9wcmVzZW50LAorICAgICAgICAuc2V0SXNDaGFyZ2luZyA9IGJhdHRlcnlfc2V0SXNDaGFyZ2luZywKKyAgICAgICAgLmNoYXJnaW5nID0gYmF0dGVyeV9jaGFyZ2luZywKKyAgICAgICAgLnNldENoYXJnZXIgPSBiYXR0ZXJ5X3NldENoYXJnZXIsCisgICAgICAgIC5jaGFyZ2VyID0gYmF0dGVyeV9jaGFyZ2VyLAorICAgICAgICAuc2V0Q2hhcmdlTGV2ZWwgPSBiYXR0ZXJ5X3NldENoYXJnZUxldmVsLAorICAgICAgICAuY2hhcmdlTGV2ZWwgPSBiYXR0ZXJ5X2NoYXJnZUxldmVsLAorICAgICAgICAuc2V0SGVhbHRoID0gYmF0dGVyeV9zZXRIZWFsdGgsCisgICAgICAgIC5oZWFsdGggPSBiYXR0ZXJ5X2hlYWx0aCwKKyAgICAgICAgLnNldFN0YXR1cyA9IGJhdHRlcnlfc2V0U3RhdHVzLAorICAgICAgICAuc3RhdHVzID0gYmF0dGVyeV9zdGF0dXMsCisgICAgICAgIC5iYXR0ZXJ5RGlzcGxheSA9IGdvbGRmaXNoX2JhdHRlcnlfZGlzcGxheX07CisKK2NvbnN0IFFBbmRyb2lkQmF0dGVyeUFnZW50KiBjb25zdCBnUUFuZHJvaWRCYXR0ZXJ5QWdlbnQgPQorICAgICAgICAmc1FBbmRyb2lkQmF0dGVyeUFnZW50OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jZWxsdWxhci1hZ2VudC1pbXBsLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNlbGx1bGFyLWFnZW50LWltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDIzODY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jZWxsdWxhci1hZ2VudC1pbXBsLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoqCisgKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtY29udHJvbC1pbXBsLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2NlbGx1bGFyX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2NvbnRyb2wuaCIKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2hhcGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmgiCisKK3N0YXRpYyB2b2lkIGNlbGx1bGFyX3NldFNpZ25hbFN0cmVuZ3RoKGludCB6ZXJvVG8zMSkKK3sKKyAgICAvLyAoU2VlIGRvX2dzbV9zaWduYWwoKSBpbiBhbmRyb2lkLXFlbXUxLWdsdWUvY29uc29sZS5jKQorCisgICAgaWYgKGFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgaWYgKHplcm9UbzMxIDwgIDApIHplcm9UbzMxID0gIDA7CisgICAgICAgIGlmICh6ZXJvVG8zMSA+IDMxKSB6ZXJvVG8zMSA9IDMxOworCisgICAgICAgIGFtb2RlbV9zZXRfc2lnbmFsX3N0cmVuZ3RoKGFuZHJvaWRfbW9kZW0sIHplcm9UbzMxLCA5OSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWxsdWxhcl9zZXRTaWduYWxTdHJlbmd0aFByb2ZpbGUoZW51bSBDZWxsdWxhclNpZ25hbCBzaWduYWwpCit7CisgICAgLy8gKFNlZSBkb19nc21fc2lnbmFsX3Byb2ZpbGUoKSBpbiBhbmRyb2lkLXFlbXUxLWdsdWUvY29uc29sZS5jKQorICAgIGlmIChhbmRyb2lkX21vZGVtKSB7CisgICAgICAgIGludCBzaWduYWxRdWFsaXR5ID0gLTE7CisgICAgICAgIHN3aXRjaCAoc2lnbmFsKSB7CisgICAgICAgICAgICBjYXNlIENlbGx1bGFyX1NpZ25hbF9Ob25lOiBzaWduYWxRdWFsaXR5ID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENlbGx1bGFyX1NpZ25hbF9Qb29yOiBzaWduYWxRdWFsaXR5ID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENlbGx1bGFyX1NpZ25hbF9Nb2RlcmF0ZTogc2lnbmFsUXVhbGl0eSA9IDI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZWxsdWxhcl9TaWduYWxfR29vZDogc2lnbmFsUXVhbGl0eSA9IDM7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZWxsdWxhcl9TaWduYWxfR3JlYXQ6IHNpZ25hbFF1YWxpdHkgPSA0OyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsUXVhbGl0eSA+PSAwKSB7CisgICAgICAgICAgICBhbW9kZW1fc2V0X3NpZ25hbF9zdHJlbmd0aF9wcm9maWxlKGFuZHJvaWRfbW9kZW0sIHNpZ25hbFF1YWxpdHkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWxsdWxhcl9zZXRWb2ljZVN0YXR1cyhlbnVtIENlbGx1bGFyU3RhdHVzIHZvaWNlU3RhdHVzKQoreworICAgIC8vIChTZWUgZG9fZ3NtX3ZvaWNlKCkgaW4gYW5kcm9pZC1xZW11MS1nbHVlL2NvbnNvbGUuYykKKyAgICBBUmVnaXN0cmF0aW9uU3RhdGUgIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fVU5LTk9XTjsKKworICAgIGlmIChhbmRyb2lkX21vZGVtKSB7CisgICAgICAgIHN3aXRjaCAodm9pY2VTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQ2VsbHVsYXJfU3RhdF9Ib21lOiAgICAgICAgICBzdGF0ZSA9IEFfUkVHSVNUUkFUSU9OX0hPTUU7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGF0X1JvYW1pbmc6ICAgICAgIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fUk9BTUlORzsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENlbGx1bGFyX1N0YXRfU2VhcmNoaW5nOiAgICAgc3RhdGUgPSBBX1JFR0lTVFJBVElPTl9TRUFSQ0hJTkc7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ2VsbHVsYXJfU3RhdF9EZW5pZWQ6ICAgICAgICBzdGF0ZSA9IEFfUkVHSVNUUkFUSU9OX0RFTklFRDsgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGF0X1VucmVnaXN0ZXJlZDogIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fVU5SRUdJU1RFUkVEOyAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhbW9kZW1fc2V0X3ZvaWNlX3JlZ2lzdHJhdGlvbihhbmRyb2lkX21vZGVtLCBzdGF0ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWxsdWxhcl9zZXREYXRhU3RhdHVzKGVudW0gQ2VsbHVsYXJTdGF0dXMgZGF0YVN0YXR1cykKK3sKKyAgICAvLyAoU2VlIGRvX2dzbV9kYXRhKCkgaW4gYW5kcm9pZC1xZW11MS1nbHVlL2NvbnNvbGUuYykKKyAgICBBUmVnaXN0cmF0aW9uU3RhdGUgIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fVU5LTk9XTjsKKworICAgIHN3aXRjaCAoZGF0YVN0YXR1cykgeworICAgICAgICBjYXNlIENlbGx1bGFyX1N0YXRfSG9tZTogICAgICAgICAgc3RhdGUgPSBBX1JFR0lTVFJBVElPTl9IT01FOyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGF0X1JvYW1pbmc6ICAgICAgIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fUk9BTUlORzsgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2VsbHVsYXJfU3RhdF9TZWFyY2hpbmc6ICAgICBzdGF0ZSA9IEFfUkVHSVNUUkFUSU9OX1NFQVJDSElORzsgICAgIGJyZWFrOworICAgICAgICBjYXNlIENlbGx1bGFyX1N0YXRfRGVuaWVkOiAgICAgICAgc3RhdGUgPSBBX1JFR0lTVFJBVElPTl9ERU5JRUQ7ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGF0X1VucmVnaXN0ZXJlZDogIHN0YXRlID0gQV9SRUdJU1RSQVRJT05fVU5SRUdJU1RFUkVEOyAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgYW1vZGVtX3NldF9kYXRhX3JlZ2lzdHJhdGlvbihhbmRyb2lkX21vZGVtLCBzdGF0ZSk7CisgICAgfQorCisgICAgYW5kcm9pZF9uZXRfZGlzYWJsZSA9IChzdGF0ZSAhPSBBX1JFR0lTVFJBVElPTl9IT01FICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAhPSBBX1JFR0lTVFJBVElPTl9ST0FNSU5HICk7Cit9CisKK3N0YXRpYyB2b2lkIGNlbGx1bGFyX3NldFN0YW5kYXJkKGVudW0gQ2VsbHVsYXJTdGFuZGFyZCBjU3RhbmRhcmQpCit7CisgICAgLy8gKFNlZSBkb19uZXR3b3JrX3NwZWVkKCkgaW4gYW5kcm9pZC1xZW11MS1nbHVlL2NvbnNvbGUuYykKKyAgICBjaGFyICpzcGVlZE5hbWU7CisKKyAgICBzd2l0Y2ggKGNTdGFuZGFyZCkgeworICAgICAgICBjYXNlIENlbGx1bGFyX1N0ZF9HU006ICAgIHNwZWVkTmFtZSA9ICJnc20iOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGRfSFNDU0Q6ICBzcGVlZE5hbWUgPSAiaHNjc2MiOyAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2VsbHVsYXJfU3RkX0dQUlM6ICAgc3BlZWROYW1lID0gImdwcnMiOyAgIGJyZWFrOworICAgICAgICBjYXNlIENlbGx1bGFyX1N0ZF9FREdFOiAgIHNwZWVkTmFtZSA9ICJlZGdlIjsgICBicmVhazsKKyAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGRfVU1UUzogICBzcGVlZE5hbWUgPSAidW10cyI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2VsbHVsYXJfU3RkX0hTRFBBOiAgc3BlZWROYW1lID0gImhzZHBhIjsgIGJyZWFrOworICAgICAgICBjYXNlIENlbGx1bGFyX1N0ZF9MVEU6ICAgIHNwZWVkTmFtZSA9ICJsdGUiOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDZWxsdWxhcl9TdGRfZnVsbDogICBzcGVlZE5hbWUgPSAiZnVsbCI7ICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybjsgLy8gRXJyb3IKKyAgICB9CisKKyAgICAvLyBGaW5kIHRoaXMgZW50cnkgaW4gdGhlIHNwZWVkIHRhYmxlIGFuZCBzZXQKKyAgICAvLyBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZCBhbmQgYW5kcm9pZF9uZXRfdXBsb2FkX3NwZWVkCisgICAgYW5kcm9pZF9uZXR3b3JrX3NldF9zcGVlZChzcGVlZE5hbWUpOworCisgICAgLy8gVGVsbCB0aGUgbmV0d29yayBzaGFwZXIgdGhlIG5ldyByYXRlcworICAgIG5ldHNoYXBlcl9zZXRfcmF0ZShhbmRyb2lkX25ldF9zaGFwZXJfaW4sICBhbmRyb2lkX25ldF9kb3dubG9hZF9zcGVlZCk7CisgICAgbmV0c2hhcGVyX3NldF9yYXRlKGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQsIGFuZHJvaWRfbmV0X3VwbG9hZF9zcGVlZCk7CisKKyAgICBpZiAoYW5kcm9pZF9tb2RlbSkgeworICAgICAgICBhbW9kZW1fc2V0X2RhdGFfbmV0d29ya190eXBlKGFuZHJvaWRfbW9kZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9wYXJzZV9uZXR3b3JrX3R5cGUoc3BlZWROYW1lKSk7CisgICAgfQorfQorCitzdGF0aWMgY29uc3QgUUFuZHJvaWRDZWxsdWxhckFnZW50IHNRQW5kcm9pZENlbGx1bGFyQWdlbnQgPSB7CisgICAgLnNldFNpZ25hbFN0cmVuZ3RoID0gY2VsbHVsYXJfc2V0U2lnbmFsU3RyZW5ndGgsCisgICAgLnNldFNpZ25hbFN0cmVuZ3RoUHJvZmlsZSA9IGNlbGx1bGFyX3NldFNpZ25hbFN0cmVuZ3RoUHJvZmlsZSwKKyAgICAuc2V0Vm9pY2VTdGF0dXMgPSBjZWxsdWxhcl9zZXRWb2ljZVN0YXR1cywKKyAgICAuc2V0RGF0YVN0YXR1cyA9IGNlbGx1bGFyX3NldERhdGFTdGF0dXMsCisgICAgLnNldFN0YW5kYXJkID0gY2VsbHVsYXJfc2V0U3RhbmRhcmR9OworY29uc3QgUUFuZHJvaWRDZWxsdWxhckFnZW50KiBjb25zdCBnUUFuZHJvaWRDZWxsdWxhckFnZW50ID0KKyAgICAgICAgJnNRQW5kcm9pZENlbGx1bGFyQWdlbnQ7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNvbnRyb2wtaW1wbC5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg0MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2JhdHRlcnlfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2NlbGx1bGFyX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9kaXNwbGF5X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9maW5nZXJfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL2xvY2F0aW9uX2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9uZXRfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3NlbnNvcnNfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3RlbGVwaG9ueV9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdXNlcl9ldmVudF9hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdm1fb3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvd2luZG93X2FnZW50LmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8vIFRoaXMgZmlsZSBjb250YWlucyBoYW5kbGVzIHRvIGdsb2JhbGx5IGFsbG9jYXRlZCBvYmplY3RzIGltcGxlbWVudGluZyB2YXJpb3VzCisvLyBpbnRlcmZhY2VzIHJlcXVpcmVkIGJ5IEFuZHJvaWRFbXUgbGlicmFyeSBpbiBlbXVsYXRpb24vY29udHJvbC8qLgorCisvLyBEZWZpbmVkIGluIC4uLi9lbXVsYXRpb24vY29udHJvbC9iYXR0ZXJfYWdlbnQuaAorZXh0ZXJuIGNvbnN0IFFBbmRyb2lkQmF0dGVyeUFnZW50KiBjb25zdCBnUUFuZHJvaWRCYXR0ZXJ5QWdlbnQ7CisKKy8vIERlZmluZWQgaW4gYW5kcm9pZC9xZW11LWNlbGx1bGFyLWFnZW50LmMKK2V4dGVybiBjb25zdCBRQW5kcm9pZENlbGx1bGFyQWdlbnQqIGNvbnN0IGdRQW5kcm9pZENlbGx1bGFyQWdlbnQ7CisKKy8vIERlZmluZWQgaW4gYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtd2luZG93LWFnZW50LWltcGwuYworZXh0ZXJuIGNvbnN0IFFBbmRyb2lkRW11bGF0b3JXaW5kb3dBZ2VudCogY29uc3QgZ1FBbmRyb2lkRW11bGF0b3JXaW5kb3dBZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkL3FlbXUtZmluZ2VyLWFnZW50LmMKK2V4dGVybiBjb25zdCBRQW5kcm9pZEZpbmdlckFnZW50KiBjb25zdCBnUUFuZHJvaWRGaW5nZXJBZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkL3FlbXUtbG9jYXRpb24tYWdlbnQuYworZXh0ZXJuIGNvbnN0IFFBbmRyb2lkTG9jYXRpb25BZ2VudCogY29uc3QgZ1FBbmRyb2lkTG9jYXRpb25BZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkL3FlbXUtc2Vuc29ycy1hZ2VudC5jCitleHRlcm4gY29uc3QgUUFuZHJvaWRTZW5zb3JzQWdlbnQqIGNvbnN0IGdRQW5kcm9pZFNlbnNvcnNBZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkL3FlbXUtdGVsZXBob255LWFnZW50LmMKK2V4dGVybiBjb25zdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50KiBjb25zdCBnUUFuZHJvaWRUZWxlcGhvbnlBZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS11c2VyLWV2ZW50LWFnZW50LWltcGwuYworZXh0ZXJuIGNvbnN0IFFBbmRyb2lkVXNlckV2ZW50QWdlbnQqIGNvbnN0IGdRQW5kcm9pZFVzZXJFdmVudEFnZW50OworCisvLyBEZWZpbmVkIGluIGFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LW5ldC1hZ2VudC1pbXBsLmMKK2V4dGVybiBjb25zdCBRQW5kcm9pZE5ldEFnZW50KiBjb25zdCBnUUFuZHJvaWROZXRBZ2VudDsKKworLy8gRGVmaW5lZCBpbiBhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1kaXNwbGF5LWFnZW50LWltcGwuY3BwCitleHRlcm4gY29uc3QgUUFuZHJvaWREaXNwbGF5QWdlbnQqIGNvbnN0IGdRQW5kcm9pZERpc3BsYXlBZ2VudDsKKworLy8gQ2FsbGVkIGJ5IGh3L2FuZHJvaWQvZ29sZGZpc2gvZXZlbnRzX2RldmljZS5jIHRvIGluaXRpYWxpemUgZ2VuZXJpYyBldmVudAorLy8gaGFuZGxpbmcuCisvLyBJbiB0aGlzIFFFTVUxIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLCB3ZSBzdGFzaCBhd2F5IGFuIHxvcGFxdWV8IGhhbmRsZSB0aGUKKy8vIGFuZCBjYWxsIGEgZnVuY3Rpb24gb24gdGhlIGRldmljZSBkaXJlY3RseS4KK2V4dGVybiB2b2lkIHFlbXVfY29udHJvbF9zZXRFdmVudERldmljZSh2b2lkKiBvcGFxdWUpOworCisvLyBEZWZpbmVkIGluIGFuZHJvaWQvcWVtdS1hbmRyb2lkLXZtLW9wZXJhdGlvbnMuYworZXh0ZXJuIGNvbnN0IFFBbmRyb2lkVm1PcGVyYXRpb25zKiBjb25zdCBnUUFuZHJvaWRWbU9wZXJhdGlvbnM7CisKK0FORFJPSURfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1kaXNwbGF5LWFnZW50LWltcGwuY3BwIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1kaXNwbGF5LWFnZW50LWltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmM5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWRpc3BsYXktYWdlbnQtaW1wbC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKK30KKworc3RhdGljIHZvaWQgZ2V0RnJhbWVCdWZmZXIoaW50KiB3LCBpbnQqIGgsIGludCogbGluZVNpemUsIGludCogYnl0ZXNQZXJQaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBmcmFtZUJ1ZmZlckRhdGEpIHsKKyAgICBEaXNwbGF5U3RhdGUqIGNvbnN0IGRzID0gZ2V0X2Rpc3BsYXlzdGF0ZSgpOworCisgICAgaWYgKHcpIHsKKyAgICAgICAgKncgPSBkcy0+c3VyZmFjZS0+d2lkdGg7CisgICAgfQorICAgIGlmIChoKSB7CisgICAgICAgICpoID0gZHMtPnN1cmZhY2UtPmhlaWdodDsKKyAgICB9CisgICAgaWYgKGxpbmVTaXplKSB7CisgICAgICAgICpsaW5lU2l6ZSA9IGRzLT5zdXJmYWNlLT5saW5lc2l6ZTsKKyAgICB9CisgICAgaWYgKGJ5dGVzUGVyUGl4ZWwpIHsKKyAgICAgICAgKmJ5dGVzUGVyUGl4ZWwgPSBkcy0+c3VyZmFjZS0+cGYuYnl0ZXNfcGVyX3BpeGVsOworICAgIH0KKyAgICBpZiAoZnJhbWVCdWZmZXJEYXRhKSB7CisgICAgICAgICpmcmFtZUJ1ZmZlckRhdGEgPSBkcy0+c3VyZmFjZS0+ZGF0YTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIoQW5kcm9pZERpc3BsYXlVcGRhdGVDYWxsYmFjayBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlKSB7CisgICAgY29uc3QgYXV0byBsaXN0ZW5lciA9IG5ldyBEaXNwbGF5VXBkYXRlTGlzdGVuZXIoKTsKKyAgICBsaXN0ZW5lci0+ZHB5X3VwZGF0ZSA9IGNhbGxiYWNrOworICAgIGxpc3RlbmVyLT5vcGFxdWUgPSBvcGFxdWU7CisKKyAgICBEaXNwbGF5U3RhdGUqIGNvbnN0IGRzID0gZ2V0X2Rpc3BsYXlzdGF0ZSgpOworICAgIHJlZ2lzdGVyX2Rpc3BsYXl1cGRhdGVsaXN0ZW5lcihkcywgbGlzdGVuZXIpOworfQorCisKK3N0YXRpYyBjb25zdCBRQW5kcm9pZERpc3BsYXlBZ2VudCBkaXNwbGF5QWdlbnQgPSB7CisgICAgICAgIC5nZXRGcmFtZUJ1ZmZlciA9ICZnZXRGcmFtZUJ1ZmZlciwKKyAgICAgICAgLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIgPSAmcmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcgorfTsKKworY29uc3QgUUFuZHJvaWREaXNwbGF5QWdlbnQqIGNvbnN0IGdRQW5kcm9pZERpc3BsYXlBZ2VudCA9ICZkaXNwbGF5QWdlbnQ7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWZpbmdlci1hZ2VudC1pbXBsLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWZpbmdlci1hZ2VudC1pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMzMmU0NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtZmluZ2VyLWFnZW50LWltcGwuYwpAQCAtMCwwICsxLDMwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNvbnRyb2wtaW1wbC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC9maW5nZXJfYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWZpbmdlcnByaW50LmgiCisKK3N0YXRpYyB2b2lkIGZpbmdlcl9zZXRUb3VjaChib29sIGlzVG91Y2hpbmcsIGludCB0b3VjaElkKQoreworICAgIGlmIChpc1RvdWNoaW5nKSB7CisgICAgICAgIGFuZHJvaWRfaHdfZmluZ2VycHJpbnRfdG91Y2godG91Y2hJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYW5kcm9pZF9od19maW5nZXJwcmludF9yZW1vdmUoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBRQW5kcm9pZEZpbmdlckFnZW50IHNRQW5kcm9pZEZpbmdlckFnZW50ID0geworICAgIC5zZXRUb3VjaCA9IGZpbmdlcl9zZXRUb3VjaAorfTsKK2NvbnN0IFFBbmRyb2lkRmluZ2VyQWdlbnQqIGNvbnN0IGdRQW5kcm9pZEZpbmdlckFnZW50ID0gJnNRQW5kcm9pZEZpbmdlckFnZW50OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1sb2NhdGlvbi1hZ2VudC1pbXBsLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWxvY2F0aW9uLWFnZW50LWltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRmMzYwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1sb2NhdGlvbi1hZ2VudC1pbXBsLmMKQEAgLTAsMCArMSwzMCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvbG9jYXRpb25fYWdlbnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dwcy5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitzdGF0aWMgYm9vbCBsb2NhdGlvbl9ncHNJc1N1cHBvcnRlZCgpIHsKKyAgICByZXR1cm4gYW5kcm9pZF9ncHNfc2VyaWFsX2xpbmUgIT0gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IFFBbmRyb2lkTG9jYXRpb25BZ2VudCBzUUFuZHJvaWRMb2NhdGlvbkFnZW50ID0geworICAgICAgICAuZ3BzSXNTdXBwb3J0ZWQgPSBsb2NhdGlvbl9ncHNJc1N1cHBvcnRlZCwKKyAgICAgICAgLmdwc1NlbmRMb2MgPSBhbmRyb2lkX2dwc19zZW5kX2xvY2F0aW9uLAorICAgICAgICAuZ3BzR2V0TG9jID0gYW5kcm9pZF9ncHNfZ2V0X2xvY2F0aW9uLAorICAgICAgICAuZ3BzU2VuZE5tZWEgPSBhbmRyb2lkX2dwc19zZW5kX25tZWF9OworY29uc3QgUUFuZHJvaWRMb2NhdGlvbkFnZW50KiBjb25zdCBnUUFuZHJvaWRMb2NhdGlvbkFnZW50ID0KKyAgICAgICAgJnNRQW5kcm9pZExvY2F0aW9uQWdlbnQ7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LW5ldC1hZ2VudC1pbXBsLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LW5ldC1hZ2VudC1pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2NjJlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtbmV0LWFnZW50LWltcGwuYwpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvbmV0X2FnZW50LmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorCisjaWZkZWYgQ09ORklHX1NMSVJQCisjaW5jbHVkZSAibGlic2xpcnAuaCIKKyNlbmRpZgorCitzdGF0aWMgYm9vbCBpc1NsaXJwSW5pdGVkKCkgeworICAgIHJldHVybiBzbGlycF9pc19pbml0ZWQoKSAhPSAwOworfQorCitzdGF0aWMgYm9vbCBzbGlycFJlZGlyKGJvb2wgaXNVZHAsIGludCBob3N0UG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBndWVzdEFkZHIsIGludCBndWVzdFBvcnQpIHsKKyAgICByZXR1cm4gc2xpcnBfcmVkaXIoaXNVZHAsIGhvc3RQb3J0LCBndWVzdEFkZHIsIGd1ZXN0UG9ydCkgPT0gMDsKK30KKworYm9vbCBzbGlycFVucmVkaXIoYm9vbCBpc1VkcCwgaW50IGhvc3RQb3J0KSB7CisgICAgcmV0dXJuIHNsaXJwX3VucmVkaXIoaXNVZHAsIGhvc3RQb3J0KSA9PSAwOworfQorCisKK3N0YXRpYyBjb25zdCBRQW5kcm9pZE5ldEFnZW50IG5ldEFnZW50ID0geworICAgICAgICAuaXNTbGlycEluaXRlZCA9ICZpc1NsaXJwSW5pdGVkLAorICAgICAgICAuc2xpcnBSZWRpciA9ICZzbGlycFJlZGlyLAorICAgICAgICAuc2xpcnBVbnJlZGlyID0gJnNsaXJwVW5yZWRpcgorfTsKK2NvbnN0IFFBbmRyb2lkTmV0QWdlbnQqIGNvbnN0IGdRQW5kcm9pZE5ldEFnZW50ID0gJm5ldEFnZW50OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZW5zb3JzLWFnZW50LWltcGwuYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtc2Vuc29ycy1hZ2VudC1pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhZWZkZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtc2Vuc29ycy1hZ2VudC1pbXBsLmMKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqKgorICoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKioKKyAqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3NlbnNvcnNfYWdlbnQuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvaHctc2Vuc29ycy5oIgorCitpbnQgc2Vuc29yX3NldChpbnQgc2Vuc29ySWQsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGMpIHsKKyAgICByZXR1cm4gYW5kcm9pZF9zZW5zb3JzX3NldChzZW5zb3JJZCwgYSwgYiwgYyk7Cit9CisKK2ludCBzZW5zb3JfZ2V0KGludCBzZW5zb3JJZCwgZmxvYXQgKmEsIGZsb2F0ICpiLCBmbG9hdCAqYykgeworICAgIHJldHVybiBhbmRyb2lkX3NlbnNvcnNfZ2V0KHNlbnNvcklkLCBhLCBiLCBjKTsKK30KKworc3RhdGljIGNvbnN0IFFBbmRyb2lkU2Vuc29yc0FnZW50IHNRQW5kcm9pZFNlbnNvcnNBZ2VudCA9IHsKKyAgICAuc2V0U2Vuc29yID0gc2Vuc29yX3NldCwKKyAgICAuZ2V0U2Vuc29yID0gc2Vuc29yX2dldH07Citjb25zdCBRQW5kcm9pZFNlbnNvcnNBZ2VudCogY29uc3QgZ1FBbmRyb2lkU2Vuc29yc0FnZW50ID0KKyAgICAmc1FBbmRyb2lkU2Vuc29yc0FnZW50OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZXR1cC5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXNldHVwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzdjMzFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZXR1cC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZXR1cC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9WbUxvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2Jhc2UvTG9nLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jb25zb2xlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vQW5kcm9pZFBpcGUuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKK30gIC8vIGV4dGVybiAiQyIKKwordXNpbmcgYW5kcm9pZDo6Vm1Mb2NrOworCitib29sIHFlbXVfYW5kcm9pZF9lbXVsYXRpb25fc2V0dXAoKSB7CisgIHN0YXRpYyBjb25zdCBBbmRyb2lkQ29uc29sZUFnZW50cyBjb25zb2xlQWdlbnRzID0geworICAgICAgZ1FBbmRyb2lkQmF0dGVyeUFnZW50LCAgIGdRQW5kcm9pZEZpbmdlckFnZW50LCAgICBnUUFuZHJvaWRMb2NhdGlvbkFnZW50LAorICAgICAgZ1FBbmRyb2lkVGVsZXBob255QWdlbnQsIGdRQW5kcm9pZFVzZXJFdmVudEFnZW50LCBnUUFuZHJvaWRWbU9wZXJhdGlvbnMsCisgICAgICBnUUFuZHJvaWROZXRBZ2VudCwKKyAgfTsKKworICBWbUxvY2sqIHZtTG9jayA9IG5ldyBxZW11OjpWbUxvY2soKTsKKyAgVm1Mb2NrKiBwcmV2Vm1Mb2NrID0gYW5kcm9pZDo6Vm1Mb2NrOjpzZXQodm1Mb2NrKTsKKyAgQ0hFQ0socHJldlZtTG9jayA9PSBudWxscHRyKSA8PCAiQW5vdGhlciBWbUxvY2sgd2FzIGFscmVhZHkgaW5zdGFsbGVkISI7CisKKyAgYW5kcm9pZDo6QW5kcm9pZFBpcGU6OmluaXRUaHJlYWRpbmcodm1Mb2NrKTsKKworICByZXR1cm4gYW5kcm9pZF9lbXVsYXRpb25fc2V0dXAoJmNvbnNvbGVBZ2VudHMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZXR1cC5oIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1zZXR1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTg0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXNldHVwLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9jb21waWxlci5oIgorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitBTkRST0lEX0JFR0lOX0hFQURFUgorCitleHRlcm4gYm9vbCBxZW11X2FuZHJvaWRfZW11bGF0aW9uX3NldHVwKHZvaWQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdGVsZXBob255LWFnZW50LWltcGwuYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdGVsZXBob255LWFnZW50LWltcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQzMzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS10ZWxlcGhvbnktYWdlbnQtaW1wbC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoqCisgKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqKgorICoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNvbnRyb2wtaW1wbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvdGVsZXBob255X2FnZW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW0uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvdGVsZXBob255L21vZGVtX2luaXQuaCIKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBnc21fbnVtYmVyX2lzX2JhZChjb25zdCBjaGFyKik7CisKK3N0YXRpYyBUZWxlcGhvbnlSZXNwb25zZSB0ZWxlcGhvbnlfdGVsZXBob255Q21kKFRlbGVwaG9ueU9wZXJhdGlvbiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBob25lTnVtYmVyKQoreworICAgIGludCByZXNwOworICAgIGludCBob2xkQ29tbWFuZDsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBUZWxfT3BfSW5pdF9DYWxsOgorICAgICAgICAgICAgaWYgKGdzbV9udW1iZXJfaXNfYmFkKHBob25lTnVtYmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUZWxfUmVzcF9CYWRfTnVtYmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBEbyBub3QgaGF2ZSBhbiBBbmRyb2lkIG1vZGVtXG4iLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlbF9SZXNwX0FjdGlvbl9GYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFtb2RlbV9hZGRfaW5ib3VuZF9jYWxsKGFuZHJvaWRfbW9kZW0sIHBob25lTnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybiBUZWxfUmVzcF9PSzsKKworICAgICAgICBjYXNlIFRlbF9PcF9BY2NlcHRfQ2FsbDoKKyAgICAgICAgY2FzZSBUZWxfT3BfUmVqZWN0X0NhbGxfRXhwbGljaXQ6CisgICAgICAgIGNhc2UgVGVsX09wX1JlamVjdF9DYWxsX0J1c3k6CisgICAgICAgICAgICBwcmludGYoIj09PT09IHRlbGVwaG9ueS1hZ2VudHMtaW1wbC5jOiBPcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkXG4iKTsgLy8gPz8KKworICAgICAgICBjYXNlIFRlbF9PcF9EaXNjb25uZWN0X0NhbGw6CisgICAgICAgICAgICBpZiAoZ3NtX251bWJlcl9pc19iYWQocGhvbmVOdW1iZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlbF9SZXNwX0JhZF9OdW1iZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYW5kcm9pZF9tb2RlbSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IERvIG5vdCBoYXZlIGFuIEFuZHJvaWQgbW9kZW1cbiIsIF9fRklMRV9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGVsX1Jlc3BfQWN0aW9uX0ZhaWxlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzcCA9IGFtb2RlbV9kaXNjb25uZWN0X2NhbGwoYW5kcm9pZF9tb2RlbSwgcGhvbmVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuIChyZXNwIDwgMCkgPyBUZWxfUmVzcF9JbnZhbGlkX0FjdGlvbiA6IFRlbF9SZXNwX09LOworCisgICAgICAgIGNhc2UgVGVsX09wX1BsYWNlX0NhbGxfT25fSG9sZDoKKyAgICAgICAgY2FzZSBUZWxfT3BfVGFrZV9DYWxsX09mZl9Ib2xkOgorICAgICAgICAgICAgaWYgKGdzbV9udW1iZXJfaXNfYmFkKHBob25lTnVtYmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBUZWxfUmVzcF9CYWRfTnVtYmVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWFuZHJvaWRfbW9kZW0pIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzOiBEbyBub3QgaGF2ZSBhbiBBbmRyb2lkIG1vZGVtXG4iLCBfX0ZJTEVfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlbF9SZXNwX0FjdGlvbl9GYWlsZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhvbGRDb21tYW5kID0gKG9wID09IFRlbF9PcF9QbGFjZV9DYWxsX09uX0hvbGQpID8gQV9DQUxMX0hFTEQgOiBBX0NBTExfQUNUSVZFOworICAgICAgICAgICAgcmVzcCA9IGFtb2RlbV91cGRhdGVfY2FsbChhbmRyb2lkX21vZGVtLCBwaG9uZU51bWJlciwgaG9sZENvbW1hbmQpOworCisgICAgICAgICAgICByZXR1cm4gKHJlc3AgPCAwKSA/IFRlbF9SZXNwX0ludmFsaWRfQWN0aW9uIDogVGVsX1Jlc3BfT0s7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUZWxfUmVzcF9CYWRfT3BlcmF0aW9uOworICAgIH0KK30KKworCisvLyBUT0RPOiBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byAnZ3NtX2NoZWNrX251bWJlcicgaW4gYW5kcm9pZC1xZW11MS1nbHVlL2NvbnNvbGUuYworLy8gICAgICAgSSBzaG91bGQgcHJvYmFibHkgaW5zdGVhZCB1c2Ugc21zX2FkZHJlc3NfZnJvbV9zdHIoKSBpbiB0ZWxlcGhvbnkvc21zLmMKK3N0YXRpYyBpbnQKK2dzbV9udW1iZXJfaXNfYmFkKGNvbnN0IGNoYXIqIG51bVN0cikKK3sKKyAgICBpbnQgIGlkeDsKKyAgICBpbnQgIG5EaWdpdHMgPSAwOworCisgICAgaWYgKCFudW1TdHIpIHJldHVybiAxOworCisgICAgZm9yIChpZHggPSAwOyBudW1TdHJbaWR4XSAhPSAwOyBpZHgrKykgeworICAgICAgICBpbnQgIGMgPSBudW1TdHJbaWR4XTsKKyAgICAgICAgaWYgKCBpc2RpZ2l0KGMpICkgeworICAgICAgICAgICAgbkRpZ2l0cysrOworICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJysnICYmIGMgIT0gJyMnKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAobkRpZ2l0cyA8PSAwKTsKK30KKworc3RhdGljIEFNb2RlbSB0ZWxlcGhvbnlfZ2V0TW9kZW0oKSB7CisgICAgcmV0dXJuIGFuZHJvaWRfbW9kZW07Cit9CisKK3N0YXRpYyBjb25zdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50IHNRQW5kcm9pZFRlbGVwaG9ueUFnZW50ID0geworICAgIC50ZWxlcGhvbnlDbWQgPSAmdGVsZXBob255X3RlbGVwaG9ueUNtZCwKKyAgICAuaW5pdE1vZGVtID0gJnFlbXVfYW5kcm9pZF9tb2RlbV9pbml0LAorICAgIC5nZXRNb2RlbSA9ICZ0ZWxlcGhvbnlfZ2V0TW9kZW0KK307Citjb25zdCBRQW5kcm9pZFRlbGVwaG9ueUFnZW50KiBjb25zdCBnUUFuZHJvaWRUZWxlcGhvbnlBZ2VudCA9CisgICAgICAgICZzUUFuZHJvaWRUZWxlcGhvbnlBZ2VudDsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdXNlci1ldmVudC1hZ2VudC1pbXBsLmMgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXVzZXItZXZlbnQtYWdlbnQtaW1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjI1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXVzZXItZXZlbnQtYWdlbnQtaW1wbC5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMC0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkKiBldmVudERldmljZUhhbmRsZSA9IE5VTEw7Cit2b2lkIHFlbXVfY29udHJvbF9zZXRFdmVudERldmljZSh2b2lkKiBvcGFxdWUpIHsKKyAgICBldmVudERldmljZUhhbmRsZSA9IG9wYXF1ZTsKK30KKworc3RhdGljIHZvaWQgdXNlcl9ldmVudF9rZXljb2RlcyhpbnQqIGtjb2RlcywgaW50IGNvdW50KSB7CisgICAgaW50IG5uOworICAgIGZvciAobm4gPSAwOyBubiA8IGNvdW50OyBubisrKQorICAgICAgICBrYmRfcHV0X2tleWNvZGUoa2NvZGVzW25uXSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZXJfZXZlbnRfa2V5KHVuc2lnbmVkIGNvZGUsIGJvb2wgZG93bikgeworICAgIGlmIChjb2RlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoVkVSQk9TRV9DSEVDSyhrZXlzKSkKKyAgICAgICAgcHJpbnRmKCI+PiBLRVkgWzB4JTAzeCwlc11cbiIsIChjb2RlICYgMHgzZmYpLCBkb3duID8gImRvd24iIDogIiB1cCAiKTsKKworICAgIGtiZF9wdXRfa2V5Y29kZSgoY29kZSAmIDB4M2ZmKSB8IChkb3duID8gMHg0MDAgOiAwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVzZXJfZXZlbnRfZ2VuZXJpYyhpbnQgdHlwZSwgaW50IGNvZGUsIGludCB2YWx1ZSkgeworICAgIGlmIChldmVudERldmljZUhhbmRsZSkgeworICAgICAgICBldmVudHNfcHV0X2dlbmVyaWMoZXZlbnREZXZpY2VIYW5kbGUsIHR5cGUsIGNvZGUsIHZhbHVlKTsKKyAgICB9Cit9CisKK2NvbnN0IHN0YXRpYyBRQW5kcm9pZFVzZXJFdmVudEFnZW50IHNRQW5kcm9pZFVzZXJFdmVudEFnZW50ID0geworICAgICAgICAuc2VuZEtleSA9IHVzZXJfZXZlbnRfa2V5LAorICAgICAgICAuc2VuZEtleUNvZGUgPSBrYmRfcHV0X2tleWNvZGUsCisgICAgICAgIC5zZW5kS2V5Q29kZXMgPSB1c2VyX2V2ZW50X2tleWNvZGVzLAorICAgICAgICAuc2VuZE1vdXNlRXZlbnQgPSBrYmRfbW91c2VfZXZlbnQsCisgICAgICAgIC5zZW5kR2VuZXJpY0V2ZW50ID0gdXNlcl9ldmVudF9nZW5lcmljfTsKK2NvbnN0IFFBbmRyb2lkVXNlckV2ZW50QWdlbnQqIGNvbnN0IGdRQW5kcm9pZFVzZXJFdmVudEFnZW50ID0KKyAgICAgICAgJnNRQW5kcm9pZFVzZXJFdmVudEFnZW50OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS12bS1vcGVyYXRpb25zLWltcGwuYyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdm0tb3BlcmF0aW9ucy1pbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0N2NkYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3FlbXUtdm0tb3BlcmF0aW9ucy1pbXBsLmMKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2NvbnRyb2wvY2FsbGJhY2tzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vY29udHJvbC92bV9vcGVyYXRpb25zLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBib29sIHFlbXVfdm1fc3RvcCgpIHsKKyAgICB2bV9zdG9wKEVYQ1BfSU5URVJSVVBUKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcWVtdV92bV9zdGFydCgpIHsKKyAgICB2bV9zdGFydCgpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBxZW11X3ZtX2lzX3J1bm5pbmcoKSB7CisgICAgcmV0dXJuIHZtX3J1bm5pbmc7Cit9CisKK3N0YXRpYyBib29sIHFlbXVfc25hcHNob3RfbGlzdCh2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUNvbnN1bWVyQ2FsbGJhY2sgb3V0Q29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUNvbnN1bWVyQ2FsbGJhY2sgZXJyQ29uc3VtZXIpIHsKKyAgICBNb25pdG9yKiBvdXQgPSBtb25pdG9yX2Zha2VfbmV3KG9wYXF1ZSwgb3V0Q29uc3VtZXIpOworICAgIE1vbml0b3IqIGVyciA9IG1vbml0b3JfZmFrZV9uZXcob3BhcXVlLCBlcnJDb25zdW1lcik7CisgICAgZG9faW5mb19zbmFwc2hvdHMob3V0LCBlcnIpOworICAgIGludCByZXQgPSBtb25pdG9yX2Zha2VfZ2V0X2J5dGVzKGVycik7CisgICAgbW9uaXRvcl9mYWtlX2ZyZWUoZXJyKTsKKyAgICBtb25pdG9yX2Zha2VfZnJlZShvdXQpOworICAgIHJldHVybiAhcmV0OworfQorCitzdGF0aWMgYm9vbCBxZW11X3NuYXBzaG90X3NhdmUoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZUNvbnN1bWVyQ2FsbGJhY2sgZXJyQ29uc3VtZXIpIHsKKyAgICBNb25pdG9yKiBlcnIgPSBtb25pdG9yX2Zha2VfbmV3KG9wYXF1ZSwgZXJyQ29uc3VtZXIpOworICAgIGRvX3NhdmV2bShlcnIsIG5hbWUpOworICAgIGludCByZXQgPSBtb25pdG9yX2Zha2VfZ2V0X2J5dGVzKGVycik7CisgICAgbW9uaXRvcl9mYWtlX2ZyZWUoZXJyKTsKKyAgICByZXR1cm4gIXJldDsKK30KKworc3RhdGljIGJvb2wgcWVtdV9zbmFwc2hvdF9sb2FkKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVDb25zdW1lckNhbGxiYWNrIGVyckNvbnN1bWVyKSB7CisgICAgTW9uaXRvciogZXJyID0gbW9uaXRvcl9mYWtlX25ldyhvcGFxdWUsIGVyckNvbnN1bWVyKTsKKyAgICBkb19sb2Fkdm0oZXJyLCBuYW1lKTsKKyAgICBpbnQgcmV0ID0gbW9uaXRvcl9mYWtlX2dldF9ieXRlcyhlcnIpOworICAgIG1vbml0b3JfZmFrZV9mcmVlKGVycik7CisgICAgcmV0dXJuICFyZXQ7Cit9CisKK3N0YXRpYyBib29sIHFlbXVfc25hcHNob3RfZGVsZXRlKGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lQ29uc3VtZXJDYWxsYmFjayBlcnJDb25zdW1lcikgeworICAgIE1vbml0b3IqIGVyciA9IG1vbml0b3JfZmFrZV9uZXcob3BhcXVlLCBlcnJDb25zdW1lcik7CisgICAgZG9fZGVsdm0oZXJyLCBuYW1lKTsKKyAgICBpbnQgcmV0ID0gbW9uaXRvcl9mYWtlX2dldF9ieXRlcyhlcnIpOworICAgIG1vbml0b3JfZmFrZV9mcmVlKGVycik7CisgICAgcmV0dXJuICFyZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBRQW5kcm9pZFZtT3BlcmF0aW9ucyBzUUFuZHJvaWRWbU9wZXJhdGlvbnMgPSB7CisgICAgLnZtU3RvcCA9IHFlbXVfdm1fc3RvcCwKKyAgICAudm1TdGFydCA9IHFlbXVfdm1fc3RhcnQsCisgICAgLnZtSXNSdW5uaW5nID0gcWVtdV92bV9pc19ydW5uaW5nLAorICAgIC5zbmFwc2hvdExpc3QgPSBxZW11X3NuYXBzaG90X2xpc3QsCisgICAgLnNuYXBzaG90TG9hZCA9IHFlbXVfc25hcHNob3RfbG9hZCwKKyAgICAuc25hcHNob3RTYXZlID0gcWVtdV9zbmFwc2hvdF9zYXZlLAorICAgIC5zbmFwc2hvdERlbGV0ZSA9IHFlbXVfc25hcHNob3RfZGVsZXRlCit9OworY29uc3QgUUFuZHJvaWRWbU9wZXJhdGlvbnMgKiBjb25zdCBnUUFuZHJvaWRWbU9wZXJhdGlvbnMgPSAmc1FBbmRyb2lkVm1PcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS13aW5kb3ctYWdlbnQtaW1wbC5jIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS13aW5kb3ctYWdlbnQtaW1wbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODc5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXdpbmRvdy1hZ2VudC1pbXBsLmMKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9jb250cm9sL3dpbmRvd19hZ2VudC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi91aS5oIgorCitzdGF0aWMgY29uc3QgUUFuZHJvaWRFbXVsYXRvcldpbmRvd0FnZW50IHNRQW5kcm9pZEVtdWxhdG9yV2luZG93QWdlbnQgPSB7CisgICAgLmdldEVtdWxhdG9yV2luZG93ID0gZW11bGF0b3Jfd2luZG93X2dldAorfTsKKworY29uc3QgUUFuZHJvaWRFbXVsYXRvcldpbmRvd0FnZW50KiBjb25zdCBnUUFuZHJvaWRFbXVsYXRvcldpbmRvd0FnZW50ID0KKyAgICAmc1FBbmRyb2lkRW11bGF0b3JXaW5kb3dBZ2VudDsKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvc2tpbl9xdC5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS9za2luX3F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE2ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvc2tpbl9xdC5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvc2tpbl9xdC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL21lbW9yeS9MYXp5SW5zdGFuY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vcXQvd2luc3lzLXF0LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3N0YXRpYyA6OmFuZHJvaWQ6OmJhc2U6OkxhenlJbnN0YW5jZTxzdGQ6OnNoYXJlZF9wdHI8dm9pZD4+IHNJbnN0YW5jZVdpbmRvdyA9CisgICAgICAgIExBWllfSU5TVEFOQ0VfSU5JVDsKKworZXh0ZXJuIHZvaWQgc2tpbl9hY3F1aXJlX3dpbmRvd19pbnN0KCkgeworICAgIHNJbnN0YW5jZVdpbmRvdy5nZXQoKSA9IHNraW5fd2luc3lzX2dldF9zaGFyZWRfcHRyKCk7Cit9CisKK2V4dGVybiB2b2lkIHNraW5fcmVsZWFzZV93aW5kb3dfaW5zdCgpIHsKKyAgICBzSW5zdGFuY2VXaW5kb3cuZ2V0KCkucmVzZXQoKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3NraW5fcXQuaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3NraW5fcXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjE0ZWExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hbmRyb2lkLXFlbXUxLWdsdWUvc2tpbl9xdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvY29tcGlsZXIuaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gR2V0cyBhIGxvY2FsIGNvcHkgb2YgdGhlIHNraW4gd2luZG93IGluc3RhbmNlCit2b2lkIHNraW5fYWNxdWlyZV93aW5kb3dfaW5zdCh2b2lkKTsKKworLy8gUmVsZWFzZXMgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIHNraW4gd2luZG93IGluc3RhbmNlCit2b2lkIHNraW5fcmVsZWFzZV93aW5kb3dfaW5zdCh2b2lkKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1faW5pdC5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1faW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxNmNjYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3RlbGVwaG9ueS9tb2RlbV9pbml0LmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1faW5pdC5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3V0aWxzL3N0cmVhbS5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSAiaHcvaHcuaCIKK30KKworI2RlZmluZSBNT0RFTV9ERVZfU1RBVEVfU0FWRV9WRVJTSU9OIDEKKworc3RhdGljIHZvaWQgbW9kZW1fc3RhdGVfc2F2ZShRRU1VRmlsZSogZmlsZSwgdm9pZCogb3BhcXVlKQoreworICAgIFN0cmVhbSogY29uc3QgcyA9IHN0cmVhbV9mcm9tX3FlbXVmaWxlKGZpbGUpOworICAgIGFtb2RlbV9zdGF0ZV9zYXZlKChBTW9kZW0pb3BhcXVlLCAoU3lzRmlsZSopcyk7CisgICAgc3RyZWFtX2ZyZWUocyk7Cit9CisKK3N0YXRpYyBpbnQgbW9kZW1fc3RhdGVfbG9hZChRRU1VRmlsZSogZmlsZSwgdm9pZCogb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBNT0RFTV9ERVZfU1RBVEVfU0FWRV9WRVJTSU9OKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTdHJlYW0qIGNvbnN0IHMgPSBzdHJlYW1fZnJvbV9xZW11ZmlsZShmaWxlKTsKKyAgICBjb25zdCBpbnQgcmVzID0gYW1vZGVtX3N0YXRlX2xvYWQoKEFNb2RlbSlvcGFxdWUsIChTeXNGaWxlKilzKTsKKyAgICBzdHJlYW1fZnJlZShzKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKwordm9pZCBxZW11X2FuZHJvaWRfbW9kZW1faW5pdChpbnQgYmFzZV9wb3J0KSB7CisgICAgYW5kcm9pZF9tb2RlbV9pbml0KGJhc2VfcG9ydCk7CisKKyAgICBpZiAoYW5kcm9pZF9tb2RlbV9zZXJpYWxfbGluZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlZ2lzdGVyX3NhdmV2bShudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWRfbW9kZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1PREVNX0RFVl9TVEFURV9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbV9zdGF0ZV9zYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZW1fc3RhdGVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbW9kZW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3RlbGVwaG9ueS9tb2RlbV9pbml0LmggYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1faW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OGM5MTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS90ZWxlcGhvbnkvbW9kZW1faW5pdC5oCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisKK0FORFJPSURfQkVHSU5fSEVBREVSCisKKy8qIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgVk0gcnVucyBpZiB0aGVyZSBpcyBhIG1vZGVtIHRvIGVtdWxhdGUgKi8KK2V4dGVybiB2b2lkIHFlbXVfYW5kcm9pZF9tb2RlbV9pbml0KGludCBiYXNlX3BvcnQpOworCitBTkRST0lEX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3V0aWxzL3N0cmVhbS5jcHAgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS91dGlscy9zdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTRjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS91dGlscy9zdHJlYW0uY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3V0aWxzL3N0cmVhbS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9iYXNlL2ZpbGVzL1N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9iYXNlL2ZpbGVzL1FlbXVGaWxlU3RyZWFtLmgiCisKK3VzaW5nIGFuZHJvaWQ6OnFlbXU6OlFlbXVGaWxlU3RyZWFtOwordHlwZWRlZiA6OlN0cmVhbSBDU3RyZWFtOworCitDU3RyZWFtKiBzdHJlYW1fZnJvbV9xZW11ZmlsZShRRU1VRmlsZSogZmlsZSkgeworICAgIGlmICghZmlsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q1N0cmVhbSo+KG5ldyBRZW11RmlsZVN0cmVhbShmaWxlKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS91dGlscy9zdHJlYW0uaCBiL2FuZHJvaWQvcWVtdTEvYW5kcm9pZC1xZW11MS1nbHVlL3V0aWxzL3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMmNlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2FuZHJvaWQtcWVtdTEtZ2x1ZS91dGlscy9zdHJlYW0uaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2NvbXBpbGVyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zdHJlYW0uaCIKKworQU5EUk9JRF9CRUdJTl9IRUFERVIKKworLy8gdGhpcyBwdXJlIEMgaGVhZGVyIGhhcyB0byBiZSB1bmRlciAnZXh0ZXJuICJDIicgZm9yIGEgQysrIGNvZGUKKyNpbmNsdWRlICJxZW11L3R5cGVkZWZzLmgiCisKKy8vIENyZWF0ZSBhIG5ldyBTdHJlYW0gaW5zdGFuY2UgdGhhdCB3cmFwcyBhIFFFTVVGaWxlIGluc3RhbmNlLgorLy8gVGhpcyBhbGxvd3Mgb25lIHRvIHVzZSBpdCB3aXRoIG90aGVyIHN0cmVhbV94eHgoKSBmdW5jdGlvbnMKKy8vIGRlZmluZWQgaW4gImFuZHJvaWQvdXRpbHMvc3RyZWFtLmgiCisvLyB8ZmlsZXwgaXMgYSBRRU1VRmlsZSBpbnN0YW5jZS4gUmV0dXJucyBhIG5ldyBTdHJlYW0gaW5zdGFuY2UuCitTdHJlYW0qIHN0cmVhbV9mcm9tX3FlbXVmaWxlKFFFTVVGaWxlKiBmaWxlKTsKKworQU5EUk9JRF9FTkRfSEVBREVSCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FyY2hfaW5pdC5jIGIvYW5kcm9pZC9xZW11MS9hcmNoX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmQwZmFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hcmNoX2luaXQuYwpAQCAtMCwwICsxLDczMCBAQAorLyoKKyAqIFFFTVUgU3lzdGVtIEVtdWxhdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAic3lzZW11L2FyY2hfaW5pdC5oIgorI2luY2x1ZGUgImF1ZGlvL2F1ZGlvLmgiCisjaW5jbHVkZSAiaHcvaXJxLmgiCisjaW5jbHVkZSAiaHcvcGNpL3BjaS5oIgorI2luY2x1ZGUgImh3L2F1ZGlvZGV2LmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9taWdyYXRpb24uaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vcWVtdS1maWxlLmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorI2luY2x1ZGUgImV4ZWMvZ2Ric3R1Yi5oIgorI2luY2x1ZGUgImV4ZWMvcmFtX2FkZHIuaCIKKyNpbmNsdWRlICJody9pMzg2L3NtYmlvcy5oIgorCisjaWZkZWYgVEFSR0VUX1NQQVJDCitpbnQgZ3JhcGhpY193aWR0aCA9IDEwMjQ7CitpbnQgZ3JhcGhpY19oZWlnaHQgPSA3Njg7CitpbnQgZ3JhcGhpY19kZXB0aCA9IDg7CisjZWxzZQoraW50IGdyYXBoaWNfd2lkdGggPSA4MDA7CitpbnQgZ3JhcGhpY19oZWlnaHQgPSA2MDA7CitpbnQgZ3JhcGhpY19kZXB0aCA9IDE1OworI2VuZGlmCisKK2NvbnN0IGNoYXIgYXJjaF9jb25maWdfbmFtZVtdID0gQ09ORklHX1FFTVVfU0hBUkVESVIgIi90YXJnZXQtIiBUQVJHRVRfQVJDSCAiLmNvbmYiOworCisjaWYgZGVmaW5lZChUQVJHRVRfQUxQSEEpCisjZGVmaW5lIFFFTVVfQVJDSCBRRU1VX0FSQ0hfQUxQSEEKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0FSTSkKKyNkZWZpbmUgUUVNVV9BUkNIIFFFTVVfQVJDSF9BUk0KKyNlbGlmIGRlZmluZWQoVEFSR0VUX0NSSVMpCisjZGVmaW5lIFFFTVVfQVJDSCBRRU1VX0FSQ0hfQ1JJUworI2VsaWYgZGVmaW5lZChUQVJHRVRfSTM4NikKKyNkZWZpbmUgUUVNVV9BUkNIIFFFTVVfQVJDSF9JMzg2CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NNjhLKQorI2RlZmluZSBRRU1VX0FSQ0ggUUVNVV9BUkNIX002OEsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0xNMzIpCisjZGVmaW5lIFFFTVVfQVJDSCBRRU1VX0FSQ0hfTE0zMgorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlDUk9CTEFaRSkKKyNkZWZpbmUgUUVNVV9BUkNIIFFFTVVfQVJDSF9NSUNST0JMQVpFCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKQorI2RlZmluZSBRRU1VX0FSQ0ggUUVNVV9BUkNIX01JUFMKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykKKyNkZWZpbmUgUUVNVV9BUkNIIFFFTVVfQVJDSF9QUEMKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1MzOTBYKQorI2RlZmluZSBRRU1VX0FSQ0ggUUVNVV9BUkNIX1MzOTBYCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TSDQpCisjZGVmaW5lIFFFTVVfQVJDSCBRRU1VX0FSQ0hfU0g0CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQykKKyNkZWZpbmUgUUVNVV9BUkNIIFFFTVVfQVJDSF9TUEFSQworI2VuZGlmCisKK2NvbnN0IHVpbnQzMl90IGFyY2hfdHlwZSA9IFFFTVVfQVJDSDsKKworI2lmIDEKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJhbSBzYXZlL3Jlc3RvcmUgKi8KKworI2RlZmluZSBSQU1fU0FWRV9GTEFHX0ZVTEwgICAgIDB4MDEgLyogT2Jzb2xldGUsIG5vdCB1c2VkIGFueW1vcmUgKi8KKyNkZWZpbmUgUkFNX1NBVkVfRkxBR19DT01QUkVTUyAweDAyCisjZGVmaW5lIFJBTV9TQVZFX0ZMQUdfTUVNX1NJWkUgMHgwNAorI2RlZmluZSBSQU1fU0FWRV9GTEFHX1BBR0UgICAgIDB4MDgKKyNkZWZpbmUgUkFNX1NBVkVfRkxBR19FT1MgICAgICAweDEwCisjZGVmaW5lIFJBTV9TQVZFX0ZMQUdfQ09OVElOVUUgMHgyMAorCitzdGF0aWMgaW50IGlzX2R1cF9wYWdlKHVpbnQ4X3QgKnBhZ2UsIHVpbnQ4X3QgY2gpCit7CisgICAgdWludDMyX3QgdmFsID0gY2ggPDwgMjQgfCBjaCA8PCAxNiB8IGNoIDw8IDggfCBjaDsKKyAgICB1aW50MzJfdCAqYXJyYXkgPSAodWludDMyX3QgKilwYWdlOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IChUQVJHRVRfUEFHRV9TSVpFIC8gNCk7IGkrKykgeworICAgICAgICBpZiAoYXJyYXlbaV0gIT0gdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgUkFNQmxvY2sgKmxhc3RfYmxvY2s7CitzdGF0aWMgcmFtX2FkZHJfdCBsYXN0X29mZnNldDsKKworc3RhdGljIGludCByYW1fc2F2ZV9ibG9jayhRRU1VRmlsZSAqZikKK3sKKyAgICBSQU1CbG9jayAqYmxvY2sgPSBsYXN0X2Jsb2NrOworICAgIHJhbV9hZGRyX3Qgb2Zmc2V0ID0gbGFzdF9vZmZzZXQ7CisgICAgcmFtX2FkZHJfdCBjdXJyZW50X2FkZHI7CisgICAgaW50IGJ5dGVzX3NlbnQgPSAwOworCisgICAgaWYgKCFibG9jaykKKyAgICAgICAgYmxvY2sgPSBRVEFJTFFfRklSU1QoJnJhbV9saXN0LmJsb2Nrcyk7CisKKyAgICBjdXJyZW50X2FkZHIgPSBibG9jay0+b2Zmc2V0ICsgb2Zmc2V0OworCisgICAgZG8geworICAgICAgICBpZiAoY3B1X3BoeXNpY2FsX21lbW9yeV9nZXRfZGlydHkoY3VycmVudF9hZGRyLCBUQVJHRVRfUEFHRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX01JR1JBVElPTikpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnA7CisgICAgICAgICAgICBpbnQgY29udCA9IChibG9jayA9PSBsYXN0X2Jsb2NrKSA/IFJBTV9TQVZFX0ZMQUdfQ09OVElOVUUgOiAwOworCisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3Jlc2V0X2RpcnR5KGN1cnJlbnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUX1BBR0VfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX01JR1JBVElPTik7CisKKyAgICAgICAgICAgIHAgPSBibG9jay0+aG9zdCArIG9mZnNldDsKKworICAgICAgICAgICAgaWYgKGlzX2R1cF9wYWdlKHAsICpwKSkgeworICAgICAgICAgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgb2Zmc2V0IHwgY29udCB8IFJBTV9TQVZFX0ZMQUdfQ09NUFJFU1MpOworICAgICAgICAgICAgICAgIGlmICghY29udCkgeworICAgICAgICAgICAgICAgICAgICBxZW11X3B1dF9ieXRlKGYsIHN0cmxlbihibG9jay0+aWRzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9wdXRfYnVmZmVyKGYsICh1aW50OF90ICopYmxvY2stPmlkc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJsb2NrLT5pZHN0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxZW11X3B1dF9ieXRlKGYsICpwKTsKKyAgICAgICAgICAgICAgICBieXRlc19zZW50ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcWVtdV9wdXRfYmU2NChmLCBvZmZzZXQgfCBjb250IHwgUkFNX1NBVkVfRkxBR19QQUdFKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBzdHJsZW4oYmxvY2stPmlkc3RyKSk7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfcHV0X2J1ZmZlcihmLCAodWludDhfdCAqKWJsb2NrLT5pZHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihibG9jay0+aWRzdHIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcWVtdV9wdXRfYnVmZmVyKGYsIHAsIFRBUkdFVF9QQUdFX1NJWkUpOworICAgICAgICAgICAgICAgIGJ5dGVzX3NlbnQgPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICBpZiAob2Zmc2V0ID49IGJsb2NrLT5sZW5ndGgpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBibG9jayA9IFFUQUlMUV9ORVhUKGJsb2NrLCBuZXh0KTsKKyAgICAgICAgICAgIGlmICghYmxvY2spCisgICAgICAgICAgICAgICAgYmxvY2sgPSBRVEFJTFFfRklSU1QoJnJhbV9saXN0LmJsb2Nrcyk7CisgICAgICAgIH0KKworICAgICAgICBjdXJyZW50X2FkZHIgPSBibG9jay0+b2Zmc2V0ICsgb2Zmc2V0OworCisgICAgfSB3aGlsZSAoY3VycmVudF9hZGRyICE9IGxhc3RfYmxvY2stPm9mZnNldCArIGxhc3Rfb2Zmc2V0KTsKKworICAgIGxhc3RfYmxvY2sgPSBibG9jazsKKyAgICBsYXN0X29mZnNldCA9IG9mZnNldDsKKworICAgIHJldHVybiBieXRlc19zZW50OworfQorCitzdGF0aWMgdWludDY0X3QgYnl0ZXNfdHJhbnNmZXJyZWQ7CisKK3N0YXRpYyByYW1fYWRkcl90IHJhbV9zYXZlX3JlbWFpbmluZyh2b2lkKQoreworICAgIFJBTUJsb2NrICpibG9jazsKKyAgICByYW1fYWRkcl90IGNvdW50ID0gMDsKKworICAgIFFUQUlMUV9GT1JFQUNIKGJsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgIHJhbV9hZGRyX3QgYWRkcjsKKyAgICAgICAgZm9yIChhZGRyID0gYmxvY2stPm9mZnNldDsgYWRkciA8IGJsb2NrLT5vZmZzZXQgKyBibG9jay0+bGVuZ3RoOworICAgICAgICAgICAgIGFkZHIgKz0gVEFSR0VUX1BBR0VfU0laRSkgeworICAgICAgICAgICAgaWYgKGNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5KGFkZHIsIFRBUkdFVF9QQUdFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX01JR1JBVElPTikpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvdW50OworfQorCit1aW50NjRfdCByYW1fYnl0ZXNfcmVtYWluaW5nKHZvaWQpCit7CisgICAgcmV0dXJuIHJhbV9zYXZlX3JlbWFpbmluZygpICogVEFSR0VUX1BBR0VfU0laRTsKK30KKwordWludDY0X3QgcmFtX2J5dGVzX3RyYW5zZmVycmVkKHZvaWQpCit7CisgICAgcmV0dXJuIGJ5dGVzX3RyYW5zZmVycmVkOworfQorCit1aW50NjRfdCByYW1fYnl0ZXNfdG90YWwodm9pZCkKK3sKKyAgICBSQU1CbG9jayAqYmxvY2s7CisgICAgdWludDY0X3QgdG90YWwgPSAwOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpCisgICAgICAgIHRvdGFsICs9IGJsb2NrLT5sZW5ndGg7CisKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfY29tcGFyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgUkFNQmxvY2sgKiBjb25zdCAqYWJsb2NrID0gYTsKKyAgICBSQU1CbG9jayAqIGNvbnN0ICpiYmxvY2sgPSBiOworICAgIGlmICgoKmFibG9jayktPm9mZnNldCA8ICgqYmJsb2NrKS0+b2Zmc2V0KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCgqYWJsb2NrKS0+b2Zmc2V0ID4gKCpiYmxvY2spLT5vZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3J0X3JhbV9saXN0KHZvaWQpCit7CisgICAgUkFNQmxvY2sgKmJsb2NrLCAqbmJsb2NrLCAqKmJsb2NrczsKKyAgICBpbnQgbjsKKyAgICBuID0gMDsKKyAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkgeworICAgICAgICArK247CisgICAgfQorICAgIGJsb2NrcyA9IGdfbWFsbG9jKG4gKiBzaXplb2YgKmJsb2Nrcyk7CisgICAgbiA9IDA7CisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCwgbmJsb2NrKSB7CisgICAgICAgIGJsb2Nrc1tuKytdID0gYmxvY2s7CisgICAgICAgIFFUQUlMUV9SRU1PVkUoJnJhbV9saXN0LmJsb2NrcywgYmxvY2ssIG5leHQpOworICAgIH0KKyAgICBxc29ydChibG9ja3MsIG4sIHNpemVvZiAqYmxvY2tzLCBibG9ja19jb21wYXIpOworICAgIHdoaWxlICgtLW4gPj0gMCkgeworICAgICAgICBRVEFJTFFfSU5TRVJUX0hFQUQoJnJhbV9saXN0LmJsb2NrcywgYmxvY2tzW25dLCBuZXh0KTsKKyAgICB9CisgICAgZ19mcmVlKGJsb2Nrcyk7Cit9CisKK2ludCByYW1fc2F2ZV9saXZlKFFFTVVGaWxlICpmLCBpbnQgc3RhZ2UsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByYW1fYWRkcl90IGFkZHI7CisgICAgdWludDY0X3QgYnl0ZXNfdHJhbnNmZXJyZWRfbGFzdDsKKyAgICBkb3VibGUgYndpZHRoID0gMDsKKyAgICB1aW50NjRfdCBleHBlY3RlZF90aW1lID0gMDsKKworICAgIGlmIChzdGFnZSA8IDApIHsKKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfdHJhY2tpbmcoMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChjcHVfcGh5c2ljYWxfc3luY19kaXJ0eV9iaXRtYXAoMCwgVUlOVDY0X01BWCkgIT0gMCkgeworICAgICAgICBxZW11X2ZpbGVfc2V0X2Vycm9yKGYsIC1lcnJubyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzdGFnZSA9PSAxKSB7CisgICAgICAgIFJBTUJsb2NrICpibG9jazsKKyAgICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgPSAwOworICAgICAgICBsYXN0X2Jsb2NrID0gTlVMTDsKKyAgICAgICAgbGFzdF9vZmZzZXQgPSAwOworICAgICAgICBzb3J0X3JhbV9saXN0KCk7CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGFsbCBkaXJ0eSBiaXRzIGFyZSBzZXQgKi8KKyAgICAgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgICAgIGZvciAoYWRkciA9IGJsb2NrLT5vZmZzZXQ7IGFkZHIgPCBibG9jay0+b2Zmc2V0ICsgYmxvY2stPmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgYWRkciArPSBUQVJHRVRfUEFHRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjcHVfcGh5c2ljYWxfbWVtb3J5X2dldF9kaXJ0eShhZGRyLCBUQVJHRVRfUEFHRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX01JR1JBVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLCBESVJUWV9NRU1PUllfTUlHUkFUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBFbmFibGUgZGlydHkgbWVtb3J5IHRyYWNraW5nICovCisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X3RyYWNraW5nKDEpOworCisgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgcmFtX2J5dGVzX3RvdGFsKCkgfCBSQU1fU0FWRV9GTEFHX01FTV9TSVpFKTsKKworICAgICAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkgeworICAgICAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBzdHJsZW4oYmxvY2stPmlkc3RyKSk7CisgICAgICAgICAgICBxZW11X3B1dF9idWZmZXIoZiwgKHVpbnQ4X3QgKilibG9jay0+aWRzdHIsIHN0cmxlbihibG9jay0+aWRzdHIpKTsKKyAgICAgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgYmxvY2stPmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc190cmFuc2ZlcnJlZF9sYXN0ID0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisgICAgYndpZHRoID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19SRUFMVElNRSk7CisKKyAgICB3aGlsZSAoIXFlbXVfZmlsZV9yYXRlX2xpbWl0KGYpKSB7CisgICAgICAgIGludCBieXRlc19zZW50OworCisgICAgICAgIGJ5dGVzX3NlbnQgPSByYW1fc2F2ZV9ibG9jayhmKTsKKyAgICAgICAgYnl0ZXNfdHJhbnNmZXJyZWQgKz0gYnl0ZXNfc2VudDsKKyAgICAgICAgaWYgKGJ5dGVzX3NlbnQgPT0gMCkgeyAvKiBubyBtb3JlIGJsb2NrcyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBid2lkdGggPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1JFQUxUSU1FKSAtIGJ3aWR0aDsKKyAgICBid2lkdGggPSAoYnl0ZXNfdHJhbnNmZXJyZWQgLSBieXRlc190cmFuc2ZlcnJlZF9sYXN0KSAvIGJ3aWR0aDsKKworICAgIC8qIGlmIHdlIGhhdmVuJ3QgdHJhbnNmZXJyZWQgYW55dGhpbmcgdGhpcyByb3VuZCwgZm9yY2UgZXhwZWN0ZWRfdGltZSB0byBhCisgICAgICogYSB2ZXJ5IGhpZ2ggdmFsdWUsIGJ1dCB3aXRob3V0IGNyYXNoaW5nICovCisgICAgaWYgKGJ3aWR0aCA9PSAwKSB7CisgICAgICAgIGJ3aWR0aCA9IDAuMDAwMDAxOworICAgIH0KKworICAgIC8qIHRyeSB0cmFuc2ZlcnJpbmcgaXRlcmF0aXZlIGJsb2NrcyBvZiBtZW1vcnkgKi8KKyAgICBpZiAoc3RhZ2UgPT0gMykgeworICAgICAgICBpbnQgYnl0ZXNfc2VudDsKKworICAgICAgICAvKiBmbHVzaCBhbGwgcmVtYWluaW5nIGJsb2NrcyByZWdhcmRsZXNzIG9mIHJhdGUgbGltaXRpbmcgKi8KKyAgICAgICAgd2hpbGUgKChieXRlc19zZW50ID0gcmFtX3NhdmVfYmxvY2soZikpICE9IDApIHsKKyAgICAgICAgICAgIGJ5dGVzX3RyYW5zZmVycmVkICs9IGJ5dGVzX3NlbnQ7CisgICAgICAgIH0KKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfdHJhY2tpbmcoMCk7CisgICAgfQorCisgICAgcWVtdV9wdXRfYmU2NChmLCBSQU1fU0FWRV9GTEFHX0VPUyk7CisKKyAgICBleHBlY3RlZF90aW1lID0gcmFtX3NhdmVfcmVtYWluaW5nKCkgKiBUQVJHRVRfUEFHRV9TSVpFIC8gYndpZHRoOworCisgICAgcmV0dXJuIChzdGFnZSA9PSAyKSAmJiAoZXhwZWN0ZWRfdGltZSA8PSBtaWdyYXRlX21heF9kb3dudGltZSgpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpob3N0X2Zyb21fc3RyZWFtX29mZnNldChRRU1VRmlsZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBzdGF0aWMgUkFNQmxvY2sgKmJsb2NrID0gTlVMTDsKKyAgICBjaGFyIGlkWzI1Nl07CisgICAgdWludDhfdCBsZW47CisKKyAgICBpZiAoZmxhZ3MgJiBSQU1fU0FWRV9GTEFHX0NPTlRJTlVFKSB7CisgICAgICAgIGlmICghYmxvY2spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQWNrLCBiYWQgbWlncmF0aW9uIHN0cmVhbSFcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmxvY2stPmhvc3QgKyBvZmZzZXQ7CisgICAgfQorCisgICAgbGVuID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgKHVpbnQ4X3QgKilpZCwgbGVuKTsKKyAgICBpZFtsZW5dID0gMDsKKworICAgIFFUQUlMUV9GT1JFQUNIKGJsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgIGlmICghc3RybmNtcChpZCwgYmxvY2stPmlkc3RyLCBzaXplb2YoaWQpKSkKKyAgICAgICAgICAgIHJldHVybiBibG9jay0+aG9zdCArIG9mZnNldDsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGZpbmQgYmxvY2sgJXMhXG4iLCBpZCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCByYW1fbG9hZChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICByYW1fYWRkcl90IGFkZHI7CisgICAgaW50IGZsYWdzOworCisgICAgaWYgKHZlcnNpb25faWQgPCAzIHx8IHZlcnNpb25faWQgPiA0KSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgYWRkciA9IHFlbXVfZ2V0X2JlNjQoZik7CisKKyAgICAgICAgZmxhZ3MgPSBhZGRyICYgflRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgIGFkZHIgJj0gVEFSR0VUX1BBR0VfTUFTSzsKKworICAgICAgICBpZiAoZmxhZ3MgJiBSQU1fU0FWRV9GTEFHX01FTV9TSVpFKSB7CisgICAgICAgICAgICBpZiAodmVyc2lvbl9pZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKGFkZHIgIT0gcmFtX2J5dGVzX3RvdGFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBTeW5jaHJvbml6ZSBSQU0gYmxvY2sgbGlzdCAqLworICAgICAgICAgICAgICAgIGNoYXIgaWRbMjU2XTsKKyAgICAgICAgICAgICAgICByYW1fYWRkcl90IGxlbmd0aDsKKyAgICAgICAgICAgICAgICByYW1fYWRkcl90IHRvdGFsX3JhbV9ieXRlcyA9IGFkZHI7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodG90YWxfcmFtX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIFJBTUJsb2NrICpibG9jazsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBsZW47CisKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9nZXRfYnVmZmVyKGYsICh1aW50OF90ICopaWQsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlkW2xlbl0gPSAwOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBxZW11X2dldF9iZTY0KGYpOworCisgICAgICAgICAgICAgICAgICAgIFFUQUlMUV9GT1JFQUNIKGJsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoaWQsIGJsb2NrLT5pZHN0ciwgc2l6ZW9mKGlkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmxlbmd0aCAhPSBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHJhbWJsb2NrIFwiJXNcIiwgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VwdCBtaWdyYXRpb25cbiIsIGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfcmFtX2J5dGVzIC09IGxlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBSQU1fU0FWRV9GTEFHX0NPTVBSRVNTKSB7CisgICAgICAgICAgICB2b2lkICpob3N0OworICAgICAgICAgICAgdWludDhfdCBjaDsKKworICAgICAgICAgICAgaWYgKHZlcnNpb25faWQgIT0gMykKKyAgICAgICAgICAgICAgICBob3N0ID0gcWVtdV9nZXRfcmFtX3B0cihhZGRyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBob3N0ID0gaG9zdF9mcm9tX3N0cmVhbV9vZmZzZXQoZiwgYWRkciwgZmxhZ3MpOworICAgICAgICAgICAgaWYgKCFob3N0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgICAgIG1lbXNldChob3N0LCBjaCwgVEFSR0VUX1BBR0VfU0laRSk7CisjaWZuZGVmIF9XSU4zMgorICAgICAgICAgICAgaWYgKGNoID09IDAgJiYKKyAgICAgICAgICAgICAgICAoIWt2bV9lbmFibGVkKCkgfHwga3ZtX2hhc19zeW5jX21tdSgpKSkgeworICAgICAgICAgICAgICAgIHFlbXVfbWFkdmlzZShob3N0LCBUQVJHRVRfUEFHRV9TSVpFLCBRRU1VX01BRFZfRE9OVE5FRUQpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBSQU1fU0FWRV9GTEFHX1BBR0UpIHsKKyAgICAgICAgICAgIHZvaWQgKmhvc3Q7CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uX2lkICE9IDMpCisgICAgICAgICAgICAgICAgaG9zdCA9IHFlbXVfZ2V0X3JhbV9wdHIoYWRkcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RfZnJvbV9zdHJlYW1fb2Zmc2V0KGYsIGFkZHIsIGZsYWdzKTsKKworICAgICAgICAgICAgcWVtdV9nZXRfYnVmZmVyKGYsIGhvc3QsIFRBUkdFVF9QQUdFX1NJWkUpOworICAgICAgICB9CisgICAgICAgIGlmIChxZW11X2ZpbGVfZ2V0X2Vycm9yKGYpKSB7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBSQU1fU0FWRV9GTEFHX0VPUykpOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBU19BVURJTworc3RydWN0IHNvdW5kaHcgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqZGVzY3I7CisgICAgaW50IGVuYWJsZWQ7CisgICAgaW50IGlzYTsKKyAgICB1bmlvbiB7CisgICAgICAgIGludCAoKmluaXRfaXNhKSAocWVtdV9pcnEgKnBpYyk7CisgICAgICAgIGludCAoKmluaXRfcGNpKSAoUENJQnVzICpidXMpOworICAgIH0gaW5pdDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc291bmRodyBzb3VuZGh3W10gPSB7CisjaWZkZWYgSEFTX0FVRElPX0NIT0lDRQorI2lmIGRlZmluZWQoVEFSR0VUX0kzODYpIHx8IGRlZmluZWQoVEFSR0VUX01JUFMpCisgICAgeworICAgICAgICAicGNzcGsiLAorICAgICAgICAiUEMgc3BlYWtlciIsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIHsgLmluaXRfaXNhID0gcGNzcGtfYXVkaW9faW5pdCB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NCMTYKKyAgICB7CisgICAgICAgICJzYjE2IiwKKyAgICAgICAgIkNyZWF0aXZlIFNvdW5kIEJsYXN0ZXIgMTYiLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICB7IC5pbml0X2lzYSA9IFNCMTZfaW5pdCB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NTNDIzMUEKKyAgICB7CisgICAgICAgICJjczQyMzFhIiwKKyAgICAgICAgIkNTNDIzMUEiLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICB7IC5pbml0X2lzYSA9IGNzNDIzMWFfaW5pdCB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FETElCCisgICAgeworICAgICAgICAiYWRsaWIiLAorI2lmZGVmIEhBU19ZTUYyNjIKKyAgICAgICAgIllhbWFoYSBZTUYyNjIgKE9QTDMpIiwKKyNlbHNlCisgICAgICAgICJZYW1haGEgWU0zODEyIChPUEwyKSIsCisjZW5kaWYKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgeyAuaW5pdF9pc2EgPSBBZGxpYl9pbml0IH0KKyAgICB9LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfR1VTCisgICAgeworICAgICAgICAiZ3VzIiwKKyAgICAgICAgIkdyYXZpcyBVbHRyYXNvdW5kIEdGMSIsCisgICAgICAgIDAsCisgICAgICAgIDEsCisgICAgICAgIHsgLmluaXRfaXNhID0gR1VTX2luaXQgfQorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQzk3CisgICAgeworICAgICAgICAiYWM5NyIsCisgICAgICAgICJJbnRlbCA4MjgwMUFBIEFDOTcgQXVkaW8iLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICB7IC5pbml0X3BjaSA9IGFjOTdfaW5pdCB9CisgICAgfSwKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VTMTM3MAorICAgIHsKKyAgICAgICAgImVzMTM3MCIsCisgICAgICAgICJFTlNPTklRIEF1ZGlvUENJIEVTMTM3MCIsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIHsgLmluaXRfcGNpID0gZXMxMzcwX2luaXQgfQorICAgIH0sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19IREEKKyAgICB7CisgICAgICAgICJoZGEiLAorICAgICAgICAiSW50ZWwgSEQgQXVkaW8iLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICB7IC5pbml0X3BjaSA9IGludGVsX2hkYV9hbmRfY29kZWNfaW5pdCB9CisgICAgfSwKKyNlbmRpZgorCisjZW5kaWYgLyogSEFTX0FVRElPX0NIT0lDRSAqLworCisgICAgeyBOVUxMLCBOVUxMLCAwLCAwLCB7IE5VTEwgfSB9Cit9OworCit2b2lkIHNlbGVjdF9zb3VuZGh3KGNvbnN0IGNoYXIgKm9wdGFyZykKK3sKKyAgICBzdHJ1Y3Qgc291bmRodyAqYzsKKworICAgIGlmICgqb3B0YXJnID09ICc/JykgeworICAgIHNob3dfdmFsaWRfY2FyZHM6CisKKyAgICAgICAgcHJpbnRmKCJWYWxpZCBzb3VuZCBjYXJkIG5hbWVzIChjb21tYSBzZXBhcmF0ZWQpOlxuIik7CisgICAgICAgIGZvciAoYyA9IHNvdW5kaHc7IGMtPm5hbWU7ICsrYykgeworICAgICAgICAgICAgcHJpbnRmICgiJS0xMXMgJXNcbiIsIGMtPm5hbWUsIGMtPmRlc2NyKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuLXNvdW5kaHcgYWxsIHdpbGwgZW5hYmxlIGFsbCBvZiB0aGUgYWJvdmVcbiIpOworICAgICAgICBleGl0KCpvcHRhcmcgIT0gJz8nKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNpemVfdCBsOworICAgICAgICBjb25zdCBjaGFyICpwOworICAgICAgICBjaGFyICplOworICAgICAgICBpbnQgYmFkX2NhcmQgPSAwOworCisgICAgICAgIGlmICghc3RyY21wKG9wdGFyZywgImFsbCIpKSB7CisgICAgICAgICAgICBmb3IgKGMgPSBzb3VuZGh3OyBjLT5uYW1lOyArK2MpIHsKKyAgICAgICAgICAgICAgICBjLT5lbmFibGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBvcHRhcmc7CisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgZSA9IHN0cmNocihwLCAnLCcpOworICAgICAgICAgICAgbCA9ICFlID8gc3RybGVuKHApIDogKHNpemVfdCkgKGUgLSBwKTsKKworICAgICAgICAgICAgZm9yIChjID0gc291bmRodzsgYy0+bmFtZTsgKytjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGMtPm5hbWUsIHAsIGwpICYmICFjLT5uYW1lW2xdKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmVuYWJsZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYy0+bmFtZSkgeworICAgICAgICAgICAgICAgIGlmIChsID4gODApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gc291bmQgY2FyZCBuYW1lICh0b28gYmlnIHRvIHNob3cpXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBzb3VuZCBjYXJkIG5hbWUgYCUuKnMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIGwsIHApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiYWRfY2FyZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwICs9IGwgKyAoZSAhPSBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiYWRfY2FyZCkgeworICAgICAgICAgICAgZ290byBzaG93X3ZhbGlkX2NhcmRzOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGF1ZGlvX2luaXQocWVtdV9pcnEgKmlzYV9waWMsIFBDSUJ1cyAqcGNpX2J1cykKK3sKKyAgICBzdHJ1Y3Qgc291bmRodyAqYzsKKworICAgIGZvciAoYyA9IHNvdW5kaHc7IGMtPm5hbWU7ICsrYykgeworICAgICAgICBpZiAoYy0+ZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKGMtPmlzYSkgeworICAgICAgICAgICAgICAgIGlmIChpc2FfcGljKSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmluaXQuaW5pdF9pc2EoaXNhX3BpYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGNpX2J1cykgeworICAgICAgICAgICAgICAgICAgICBjLT5pbml0LmluaXRfcGNpKHBjaV9idXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbHNlCit2b2lkIHNlbGVjdF9zb3VuZGh3KGNvbnN0IGNoYXIgKm9wdGFyZykKK3sKK30KK3ZvaWQgYXVkaW9faW5pdChxZW11X2lycSAqaXNhX3BpYywgUENJQnVzICpwY2lfYnVzKQoreworfQorI2VuZGlmCisKK2ludCBxZW11X3V1aWRfcGFyc2UoY29uc3QgY2hhciAqc3RyLCB1aW50OF90ICp1dWlkKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3RybGVuKHN0cikgIT0gMzYpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IHNzY2FuZihzdHIsIFVVSURfRk1ULCAmdXVpZFswXSwgJnV1aWRbMV0sICZ1dWlkWzJdLCAmdXVpZFszXSwKKyAgICAgICAgICAgICAgICAgJnV1aWRbNF0sICZ1dWlkWzVdLCAmdXVpZFs2XSwgJnV1aWRbN10sICZ1dWlkWzhdLCAmdXVpZFs5XSwKKyAgICAgICAgICAgICAgICAgJnV1aWRbMTBdLCAmdXVpZFsxMV0sICZ1dWlkWzEyXSwgJnV1aWRbMTNdLCAmdXVpZFsxNF0sCisgICAgICAgICAgICAgICAgICZ1dWlkWzE1XSk7CisKKyAgICBpZiAocmV0ICE9IDE2KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICBzbWJpb3NfYWRkX2ZpZWxkKDEsIG9mZnNldG9mKHN0cnVjdCBzbWJpb3NfdHlwZV8xLCB1dWlkKSwgMTYsIHV1aWQpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAwCit2b2lkIGRvX2FjcGl0YWJsZV9vcHRpb24oY29uc3QgY2hhciAqb3B0YXJnKQoreworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgaWYgKGFjcGlfdGFibGVfYWRkKG9wdGFyZykgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3JvbmcgYWNwaSB0YWJsZSBwcm92aWRlZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorI2VuZGlmCit9CisjZW5kaWYKKwordm9pZCBkb19zbWJpb3Nfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdGFyZykKK3sKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgIGlmIChzbWJpb3NfZW50cnlfYWRkKG9wdGFyZykgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3Jvbmcgc21iaW9zIHByb3ZpZGVkXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBjcHVkZWZfaW5pdCh2b2lkKQoreworI2lmIGRlZmluZWQoY3B1ZGVmX3NldHVwKQorICAgIGNwdWRlZl9zZXR1cCgpOyAvKiBwYXJzZSBjcHUgZGVmaW5pdGlvbnMgaW4gdGFyZ2V0IGNvbmZpZyBmaWxlICovCisjZW5kaWYKK30KKworaW50IGF1ZGlvX2F2YWlsYWJsZSh2b2lkKQoreworI2lmZGVmIEhBU19BVURJTworICAgIHJldHVybiAxOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQga3ZtX2F2YWlsYWJsZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19LVk0KKyAgICByZXR1cm4gMTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHhlbl9hdmFpbGFibGUodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWEVOCisgICAgcmV0dXJuIDE7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2FzeW5jLmMgYi9hbmRyb2lkL3FlbXUxL2FzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNjRlMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXN5bmMuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIFFFTVUgU3lzdGVtIEVtdWxhdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImJsb2NrL2Fpby5oIgorCisvKgorICogQW4gQXN5bmNDb250ZXh0IHByb3RlY3RzIHRoZSBjYWxsYmFja3Mgb2YgQUlPIHJlcXVlc3RzIGFuZCBCb3R0b20gSGFsdmVzCisgKiBhZ2FpbnN0IGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlci4gQSB0eXBpY2FsIGV4YW1wbGUgaXMgcWNvdzIgdGhhdCBhY2NlcHRzCisgKiBhc3luY2hyb25vdXMgcmVxdWVzdHMsIGJ1dCByZWxpZXMgZm9yIG1hbmlwdWxhdGlvbiBvZiBpdHMgbWV0YWRhdGEgb24KKyAqIHN5bmNocm9ub3VzIGJkcnZfcmVhZC93cml0ZSB0aGF0IGRvZXNuJ3QgdHJpZ2dlciBhbnkgY2FsbGJhY2tzLgorICoKKyAqIEhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gZW11bGF0ZWQgdXNpbmcgQUlPIHdoaWNoIG1lYW5zIHRoYXQgQUlPCisgKiBjYWxsYmFja3MgbXVzdCBiZSBydW4gLSBidXQgYXQgdGhlIHNhbWUgdGltZSB3ZSBtdXN0IG5vdCBydW4gY2FsbGJhY2tzIG9mCisgKiBvdGhlciByZXF1ZXN0cyBhcyB0aGV5IG1pZ2h0IHN0YXJ0IHRvIG1vZGlmeSBtZXRhZGF0YSBhbmQgY29ycnVwdCB0aGUKKyAqIGludGVybmFsIHN0YXRlIG9mIHRoZSBjYWxsZXIgb2YgYmRydl9yZWFkL3dyaXRlLgorICoKKyAqIFRvIGFjaGlldmUgdGhlIGRlc2lyZWQgc2VtYW50aWNzIHdlIHN3aXRjaCBpbnRvIGEgbmV3IEFzeW5jQ29udGV4dC4KKyAqIENhbGxiYWNrcyBtdXN0IG9ubHkgYmUgcnVuIGlmIHRoZXkgYmVsb25nIHRvIHRoZSBjdXJyZW50IEFzeW5jQ29udGV4dC4KKyAqIE90aGVyd2lzZSB0aGV5IG5lZWQgdG8gYmUgcXVldWVkIHVudGlsIHRoZWlyIG93biBjb250ZXh0IGlzIGFjdGl2ZSBhZ2Fpbi4KKyAqIFRoaXMgaXMgaG93IHlvdSBjYW4gbWFrZSBxZW11X2Fpb193YWl0KCkgd2FpdCBvbmx5IGZvciB5b3VyIG93biBjYWxsYmFja3MuCisgKgorICogVGhlIEFzeW5jQ29udGV4dHMgZm9ybSBhIHN0YWNrLiBXaGVuIHlvdSBsZWF2ZSBhIEFzeW5jQ29udGV4dHMsIHlvdSBhbHdheXMKKyAqIHJldHVybiB0byB0aGUgb2xkICgicGFyZW50IikgY29udGV4dC4KKyAqLworc3RydWN0IEFzeW5jQ29udGV4dCB7CisgICAgLyogQ29uc2VjdXRpdmUgbnVtYmVyIG9mIHRoZSBBc3luY0NvbnRleHQgKHBvc2l0aW9uIGluIHRoZSBzdGFjaykgKi8KKyAgICBpbnQgaWQ7CisKKyAgICAvKiBBbmNob3Igb2YgdGhlIGxpc3Qgb2YgQm90dG9tIEhhbHZlcyBiZWxvbmdpbmcgdG8gdGhlIGNvbnRleHQgKi8KKyAgICBzdHJ1Y3QgUUVNVUJIICpmaXJzdF9iaDsKKworICAgIC8qIExpbmsgdG8gcGFyZW50IGNvbnRleHQgKi8KKyAgICBzdHJ1Y3QgQXN5bmNDb250ZXh0ICpwYXJlbnQ7Cit9OworCisvKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBBc3luY0NvbnRleHQgKi8KK3N0YXRpYyBzdHJ1Y3QgQXN5bmNDb250ZXh0ICphc3luY19jb250ZXh0ID0gJihzdHJ1Y3QgQXN5bmNDb250ZXh0KSB7IDAgfTsKKworLyoKKyAqIEVudGVyIGEgbmV3IEFzeW5jQ29udGV4dC4gQWxyZWFkeSBzY2hlZHVsZWQgQm90dG9tIEhhbHZlcyBhbmQgQUlPIGNhbGxiYWNrcworICogd29uJ3QgYmUgY2FsbGVkIHVudGlsIHRoaXMgY29udGV4dCBpcyBsZWZ0IGFnYWluLgorICovCit2b2lkIGFzeW5jX2NvbnRleHRfcHVzaCh2b2lkKQoreworICAgIHN0cnVjdCBBc3luY0NvbnRleHQgKm5ldyA9IGdfbWFsbG9jMChzaXplb2YoKm5ldykpOworICAgIG5ldy0+cGFyZW50ID0gYXN5bmNfY29udGV4dDsKKyAgICBuZXctPmlkID0gYXN5bmNfY29udGV4dC0+aWQgKyAxOworICAgIGFzeW5jX2NvbnRleHQgPSBuZXc7Cit9CisKKy8qIFJ1biBxdWV1ZWQgQUlPIGNvbXBsZXRpb25zIGFuZCBkZXN0cm95IEJvdHRvbSBIYWxmICovCitzdGF0aWMgdm9pZCBiaF9ydW5fYWlvX2NvbXBsZXRpb25zKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VQkggKipiaCA9IG9wYXF1ZTsKKyAgICBxZW11X2JoX2RlbGV0ZSgqYmgpOworICAgIGdfZnJlZShiaCk7CisgICAgcWVtdV9haW9fcHJvY2Vzc19xdWV1ZSgpOworfQorLyoKKyAqIExlYXZlIHRoZSBjdXJyZW50bHkgYWN0aXZlIEFzeW5jQ29udGV4dC4gQWxsIEJvdHRvbSBIYWx2ZXMgYmVsb25naW5nIHRvIHRoZQorICogb2xkIGNvbnRleHQgYXJlIGV4ZWN1dGVkIGJlZm9yZSBjaGFuZ2luZyB0aGUgY29udGV4dC4KKyAqLwordm9pZCBhc3luY19jb250ZXh0X3BvcCh2b2lkKQoreworICAgIHN0cnVjdCBBc3luY0NvbnRleHQgKm9sZCA9IGFzeW5jX2NvbnRleHQ7CisgICAgUUVNVUJIICoqYmg7CisKKyAgICAvKiBGbHVzaCB0aGUgYm90dG9tIGhhbHZlcywgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZW0gKi8KKyAgICB3aGlsZSAocWVtdV9iaF9wb2xsKCkpOworCisgICAgLyogU3dpdGNoIGJhY2sgdG8gdGhlIHBhcmVudCBjb250ZXh0ICovCisgICAgYXN5bmNfY29udGV4dCA9IGFzeW5jX2NvbnRleHQtPnBhcmVudDsKKyAgICBnX2ZyZWUob2xkKTsKKworICAgIGlmIChhc3luY19jb250ZXh0ID09IE5VTEwpIHsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICAvKiBTY2hlZHVsZSBCSCB0byBydW4gYW55IHF1ZXVlZCBBSU8gY29tcGxldGlvbnMgYXMgc29vbiBhcyBwb3NzaWJsZSAqLworICAgIGJoID0gZ19tYWxsb2Moc2l6ZW9mKCpiaCkpOworICAgICpiaCA9IHFlbXVfYmhfbmV3KGJoX3J1bl9haW9fY29tcGxldGlvbnMsIGJoKTsKKyAgICBxZW11X2JoX3NjaGVkdWxlKCpiaCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBBc3luY0NvbnRleHQKKyAqLworaW50IGdldF9hc3luY19jb250ZXh0X2lkKHZvaWQpCit7CisgICAgcmV0dXJuIGFzeW5jX2NvbnRleHQtPmlkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBib3R0b20gaGFsdmVzIChjYW4gYmUgc2VlbiBhcyB0aW1lcnMgd2hpY2ggZXhwaXJlIEFTQVApICovCisKK3N0cnVjdCBRRU1VQkggeworICAgIFFFTVVCSEZ1bmMgKmNiOworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBpbnQgc2NoZWR1bGVkOworICAgIGludCBpZGxlOworICAgIGludCBkZWxldGVkOworICAgIFFFTVVCSCAqbmV4dDsKK307CisKK1FFTVVCSCAqcWVtdV9iaF9uZXcoUUVNVUJIRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VQkggKmJoOworICAgIGJoID0gZ19tYWxsb2MwKHNpemVvZihRRU1VQkgpKTsKKyAgICBiaC0+Y2IgPSBjYjsKKyAgICBiaC0+b3BhcXVlID0gb3BhcXVlOworICAgIGJoLT5uZXh0ID0gYXN5bmNfY29udGV4dC0+Zmlyc3RfYmg7CisgICAgYXN5bmNfY29udGV4dC0+Zmlyc3RfYmggPSBiaDsKKyAgICByZXR1cm4gYmg7Cit9CisKK2ludCBxZW11X2JoX3BvbGwodm9pZCkKK3sKKyAgICBRRU1VQkggKmJoLCAqKmJocDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gMDsKKyAgICBmb3IgKGJoID0gYXN5bmNfY29udGV4dC0+Zmlyc3RfYmg7IGJoOyBiaCA9IGJoLT5uZXh0KSB7CisgICAgICAgIGlmICghYmgtPmRlbGV0ZWQgJiYgYmgtPnNjaGVkdWxlZCkgeworICAgICAgICAgICAgYmgtPnNjaGVkdWxlZCA9IDA7CisgICAgICAgICAgICBpZiAoIWJoLT5pZGxlKQorICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBiaC0+aWRsZSA9IDA7CisgICAgICAgICAgICBiaC0+Y2IoYmgtPm9wYXF1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByZW1vdmUgZGVsZXRlZCBiaHMgKi8KKyAgICBiaHAgPSAmYXN5bmNfY29udGV4dC0+Zmlyc3RfYmg7CisgICAgd2hpbGUgKCpiaHApIHsKKyAgICAgICAgYmggPSAqYmhwOworICAgICAgICBpZiAoYmgtPmRlbGV0ZWQpIHsKKyAgICAgICAgICAgICpiaHAgPSBiaC0+bmV4dDsKKyAgICAgICAgICAgIGdfZnJlZShiaCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYmhwID0gJmJoLT5uZXh0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgcWVtdV9iaF9zY2hlZHVsZV9pZGxlKFFFTVVCSCAqYmgpCit7CisgICAgaWYgKGJoLT5zY2hlZHVsZWQpCisgICAgICAgIHJldHVybjsKKyAgICBiaC0+c2NoZWR1bGVkID0gMTsKKyAgICBiaC0+aWRsZSA9IDE7Cit9CisKK3ZvaWQgcWVtdV9iaF9zY2hlZHVsZShRRU1VQkggKmJoKQoreworICAgIGlmIChiaC0+c2NoZWR1bGVkKQorICAgICAgICByZXR1cm47CisgICAgYmgtPnNjaGVkdWxlZCA9IDE7CisgICAgYmgtPmlkbGUgPSAwOworICAgIC8qIHN0b3AgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgQ1BVIHRvIGV4ZWN1dGUgdGhlIEJIIEFTQVAgKi8KKyAgICBxZW11X25vdGlmeV9ldmVudCgpOworfQorCit2b2lkIHFlbXVfYmhfY2FuY2VsKFFFTVVCSCAqYmgpCit7CisgICAgYmgtPnNjaGVkdWxlZCA9IDA7Cit9CisKK3ZvaWQgcWVtdV9iaF9kZWxldGUoUUVNVUJIICpiaCkKK3sKKyAgICBiaC0+c2NoZWR1bGVkID0gMDsKKyAgICBiaC0+ZGVsZXRlZCA9IDE7Cit9CisKK3ZvaWQgcWVtdV9iaF91cGRhdGVfdGltZW91dChpbnQgKnRpbWVvdXQpCit7CisgICAgUUVNVUJIICpiaDsKKworICAgIGZvciAoYmggPSBhc3luY19jb250ZXh0LT5maXJzdF9iaDsgYmg7IGJoID0gYmgtPm5leHQpIHsKKyAgICAgICAgaWYgKCFiaC0+ZGVsZXRlZCAmJiBiaC0+c2NoZWR1bGVkKSB7CisgICAgICAgICAgICBpZiAoYmgtPmlkbGUpIHsKKyAgICAgICAgICAgICAgICAvKiBpZGxlIGJvdHRvbSBoYWx2ZXMgd2lsbCBiZSBwb2xsZWQgYXQgbGVhc3QKKyAgICAgICAgICAgICAgICAgKiBldmVyeSAxMG1zICovCisgICAgICAgICAgICAgICAgKnRpbWVvdXQgPSBNSU4oMTAsICp0aW1lb3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbm9uLWlkbGUgYm90dG9tIGhhbHZlcyB3aWxsIGJlIGV4ZWN1dGVkCisgICAgICAgICAgICAgICAgICogaW1tZWRpYXRlbHkgKi8KKyAgICAgICAgICAgICAgICAqdGltZW91dCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vYWxzYWF1ZGlvLmMgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Fsc2FhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODg0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Fsc2FhdWRpby5jCkBAIC0wLDAgKzEsMTI5NyBAQAorLyoKKyAqIFFFTVUgQUxTQSBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8YWxzYS9hc291bmRsaWIuaD4KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKworI2lmIFFFTVVfR05VQ19QUkVSRVEoNCwgMykKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdhZGRyZXNzIgorI2VuZGlmCisKKyNkZWZpbmUgQVVESU9fQ0FQICJhbHNhIgorI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgImFuZHJvaWQvcWVtdS1kZWJ1Zy5oIgorCisjZGVmaW5lICBERUJVRyAgMQorCisjaWYgREVCVUcKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+CisjICBkZWZpbmUgRCguLi4pICBWRVJCT1NFX1BSSU5UKGF1ZGlvLF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKGF1ZGlvKQorIyAgZGVmaW5lIE8oLi4uKSAgVkVSQk9TRV9QUklOVChhdWRpb291dCxfX1ZBX0FSR1NfXykKKyMgIGRlZmluZSBJKC4uLikgIFZFUkJPU0VfUFJJTlQoYXVkaW9pbixfX1ZBX0FSR1NfXykKKyNlbHNlCisjICBkZWZpbmUgRCguLi4pICAoKHZvaWQpMCkKKyMgIGRlZmluZSBEX0FDVElWRSAgMAorIyAgZGVmaW5lIE8oLi4uKSAgKCh2b2lkKTApCisjICBkZWZpbmUgSSguLi4pICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCogIGFsc2FfbGliOworCitzdHJ1Y3QgcG9sbGhscCB7CisgICAgc25kX3BjbV90ICpoYW5kbGU7CisgICAgc3RydWN0IHBvbGxmZCAqcGZkczsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IG1hc2s7Cit9OworCit0eXBlZGVmIHN0cnVjdCBBTFNBVm9pY2VPdXQgeworICAgIEhXVm9pY2VPdXQgaHc7CisgICAgaW50IHdwb3M7CisgICAgaW50IHBlbmRpbmc7CisgICAgdm9pZCAqcGNtX2J1ZjsKKyAgICBzbmRfcGNtX3QgKmhhbmRsZTsKKyAgICBzdHJ1Y3QgcG9sbGhscCBwb2xsaGxwOworfSBBTFNBVm9pY2VPdXQ7CisKK3R5cGVkZWYgc3RydWN0IEFMU0FWb2ljZUluIHsKKyAgICBIV1ZvaWNlSW4gaHc7CisgICAgc25kX3BjbV90ICpoYW5kbGU7CisgICAgdm9pZCAqcGNtX2J1ZjsKKyAgICBzdHJ1Y3QgcG9sbGhscCBwb2xsaGxwOworfSBBTFNBVm9pY2VJbjsKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IHNpemVfaW5fdXNlY19pbjsKKyAgICBpbnQgc2l6ZV9pbl91c2VjX291dDsKKyAgICBjb25zdCBjaGFyICpwY21fbmFtZV9pbjsKKyAgICBjb25zdCBjaGFyICpwY21fbmFtZV9vdXQ7CisgICAgdW5zaWduZWQgaW50IGJ1ZmZlcl9zaXplX2luOworICAgIHVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZV9pbjsKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemVfb3V0OworICAgIHVuc2lnbmVkIGludCBwZXJpb2Rfc2l6ZV9vdXQ7CisgICAgdW5zaWduZWQgaW50IHRocmVzaG9sZDsKKworICAgIGludCBidWZmZXJfc2l6ZV9pbl9vdmVycmlkZGVuOworICAgIGludCBwZXJpb2Rfc2l6ZV9pbl9vdmVycmlkZGVuOworCisgICAgaW50IGJ1ZmZlcl9zaXplX291dF9vdmVycmlkZGVuOworICAgIGludCBwZXJpb2Rfc2l6ZV9vdXRfb3ZlcnJpZGRlbjsKKyAgICBpbnQgdmVyYm9zZTsKK30gY29uZiA9IHsKKyAgICAuYnVmZmVyX3NpemVfb3V0ID0gNDA5NiwKKyAgICAucGVyaW9kX3NpemVfb3V0ID0gMTAyNCwKKyAgICAucGNtX25hbWVfb3V0ID0gImRlZmF1bHQiLAorICAgIC5wY21fbmFtZV9pbiA9ICJkZWZhdWx0IiwKK307CisKK3N0cnVjdCBhbHNhX3BhcmFtc19yZXEgeworICAgIGludCBmcmVxOworICAgIHNuZF9wY21fZm9ybWF0X3QgZm10OworICAgIGludCBuY2hhbm5lbHM7CisgICAgaW50IHNpemVfaW5fdXNlYzsKKyAgICBpbnQgb3ZlcnJpZGVfbWFzazsKKyAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7CisgICAgdW5zaWduZWQgaW50IHBlcmlvZF9zaXplOworfTsKKworc3RydWN0IGFsc2FfcGFyYW1zX29idCB7CisgICAgaW50IGZyZXE7CisgICAgYXVkZm10X2UgZm10OworICAgIGludCBlbmRpYW5uZXNzOworICAgIGludCBuY2hhbm5lbHM7CisgICAgc25kX3BjbV91ZnJhbWVzX3Qgc2FtcGxlczsKK307CisKK3N0YXRpYyB2b2lkIEdDQ19GTVRfQVRUUiAoMiwgMykgYWxzYV9sb2dlcnIgKGludCBlcnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgQVVEX3Zsb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246ICVzXG4iLCBzbmRfc3RyZXJyb3IgKGVycikpOworfQorCitzdGF0aWMgdm9pZCBHQ0NfRk1UX0FUVFIgKDMsIDQpIGFsc2FfbG9nZXJyMiAoCisgICAgaW50IGVyciwKKyAgICBjb25zdCBjaGFyICp0eXAsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLgorICAgICkKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiQ291bGQgbm90IGluaXRpYWxpemUgJXNcbiIsIHR5cCk7CisKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgQVVEX3Zsb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246ICVzXG4iLCBzbmRfc3RyZXJyb3IgKGVycikpOworfQorCitzdGF0aWMgdm9pZCBhbHNhX2ZpbmlfcG9sbCAoc3RydWN0IHBvbGxobHAgKmhscCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgcG9sbGZkICpwZmRzID0gaGxwLT5wZmRzOworCisgICAgaWYgKHBmZHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhscC0+Y291bnQ7ICsraSkgeworICAgICAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlciAocGZkc1tpXS5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgZ19mcmVlIChwZmRzKTsKKyAgICB9CisgICAgaGxwLT5wZmRzID0gTlVMTDsKKyAgICBobHAtPmNvdW50ID0gMDsKKyAgICBobHAtPmhhbmRsZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFsc2FfYW5hbF9jbG9zZTEgKHNuZF9wY21fdCAqKmhhbmRsZXApCit7CisgICAgaW50IGVyciA9IHNuZF9wY21fY2xvc2UgKCpoYW5kbGVwKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGFsc2FfbG9nZXJyIChlcnIsICJGYWlsZWQgdG8gY2xvc2UgUENNIGhhbmRsZSAlcFxuIiwgKmhhbmRsZXApOworICAgIH0KKyAgICAqaGFuZGxlcCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGFsc2FfYW5hbF9jbG9zZSAoc25kX3BjbV90ICoqaGFuZGxlcCwgc3RydWN0IHBvbGxobHAgKmhscCkKK3sKKyAgICBhbHNhX2ZpbmlfcG9sbCAoaGxwKTsKKyAgICBhbHNhX2FuYWxfY2xvc2UxIChoYW5kbGVwKTsKK30KKworc3RhdGljIGludCBhbHNhX3JlY292ZXIgKHNuZF9wY21fdCAqaGFuZGxlKQoreworICAgIGludCBlcnIgPSBzbmRfcGNtX3ByZXBhcmUgKGhhbmRsZSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYWxzYV9sb2dlcnIgKGVyciwgIkZhaWxlZCB0byBwcmVwYXJlIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHNhX3Jlc3VtZSAoc25kX3BjbV90ICpoYW5kbGUpCit7CisgICAgaW50IGVyciA9IHNuZF9wY21fcmVzdW1lIChoYW5kbGUpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGFsc2FfbG9nZXJyIChlcnIsICJGYWlsZWQgdG8gcmVzdW1lIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxzYV9wb2xsX2hhbmRsZXIgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpbnQgZXJyLCBjb3VudDsKKyAgICBzbmRfcGNtX3N0YXRlX3Qgc3RhdGU7CisgICAgc3RydWN0IHBvbGxobHAgKmhscCA9IG9wYXF1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCByZXZlbnRzOworCisgICAgY291bnQgPSBwb2xsIChobHAtPnBmZHMsIGhscC0+Y291bnQsIDApOworICAgIGlmIChjb3VudCA8IDApIHsKKyAgICAgICAgZG9sb2cgKCJhbHNhX3BvbGxfaGFuZGxlcjogcG9sbCAlc1xuIiwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWNvdW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBYWFg6IEFMU0EgZXhhbXBsZSB1c2VzIGluaXRpYWwgY291bnQsIG5vdCB0aGUgb25lIHJldHVybmVkIGJ5CisgICAgICAgcG9sbCwgY29ycmVjdD8gKi8KKyAgICBlcnIgPSBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyAoaGxwLT5oYW5kbGUsIGhscC0+cGZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwLT5jb3VudCwgJnJldmVudHMpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGFsc2FfbG9nZXJyIChlcnIsICJzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfcmV2ZW50cyIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCEocmV2ZW50cyAmIGhscC0+bWFzaykpIHsKKyAgICAgICAgaWYgKGNvbmYudmVyYm9zZSkgeworICAgICAgICAgICAgZG9sb2cgKCJyZXZlbnRzID0gJWRcbiIsIHJldmVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0ZSA9IHNuZF9wY21fc3RhdGUgKGhscC0+aGFuZGxlKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBTTkRfUENNX1NUQVRFX1NFVFVQOgorICAgICAgICBhbHNhX3JlY292ZXIgKGhscC0+aGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fU1RBVEVfWFJVTjoKKyAgICAgICAgYWxzYV9yZWNvdmVyIChobHAtPmhhbmRsZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTTkRfUENNX1NUQVRFX1NVU1BFTkRFRDoKKyAgICAgICAgYWxzYV9yZXN1bWUgKGhscC0+aGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fU1RBVEVfUFJFUEFSRUQ6CisgICAgICAgIGF1ZGlvX3J1biAoImFsc2EgcnVuIChwcmVwYXJlZCkiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fU1RBVEVfUlVOTklORzoKKyAgICAgICAgYXVkaW9fcnVuICgiYWxzYSBydW4gKHJ1bm5pbmcpIik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZG9sb2cgKCJVbmV4cGVjdGVkIHN0YXRlICVkXG4iLCBzdGF0ZSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGFsc2FfcG9sbF9oZWxwZXIgKHNuZF9wY21fdCAqaGFuZGxlLCBzdHJ1Y3QgcG9sbGhscCAqaGxwLCBpbnQgbWFzaykKK3sKKyAgICBpbnQgaSwgY291bnQsIGVycjsKKyAgICBzdHJ1Y3QgcG9sbGZkICpwZmRzOworCisgICAgY291bnQgPSBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfY291bnQgKGhhbmRsZSk7CisgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBwb2xsIG1vZGVcbiIKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBwb2xsIGRlc2NyaXB0b3JzICVkXG4iLCBjb3VudCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwZmRzID0gYXVkaW9fY2FsbG9jICgiYWxzYV9wb2xsX2hlbHBlciIsIGNvdW50LCBzaXplb2YgKCpwZmRzKSk7CisgICAgaWYgKCFwZmRzKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGluaXRpYWxpemUgcG9sbCBtb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGVyciA9IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9ycyAoaGFuZGxlLCBwZmRzLCBjb3VudCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYWxzYV9sb2dlcnIgKGVyciwgIkNvdWxkIG5vdCBpbml0aWFsaXplIHBvbGwgbW9kZVxuIgorICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvYnRhaW4gcG9sbCBkZXNjcmlwdG9yc1xuIik7CisgICAgICAgIGdfZnJlZSAocGZkcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBpZiAocGZkc1tpXS5ldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgICAgICAgIGVyciA9IHFlbXVfc2V0X2ZkX2hhbmRsZXIgKHBmZHNbaV0uZmQsIGFsc2FfcG9sbF9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaGxwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGZkc1tpXS5ldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICAgICAgICBpZiAoY29uZi52ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgZG9sb2cgKCJQT0xMT1VUICVkICVkXG4iLCBpLCBwZmRzW2ldLmZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IHFlbXVfc2V0X2ZkX2hhbmRsZXIgKHBmZHNbaV0uZmQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHNhX3BvbGxfaGFuZGxlciwgaGxwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uZi52ZXJib3NlKSB7CisgICAgICAgICAgICBkb2xvZyAoIlNldCBoYW5kbGVyIGV2ZW50cz0lI3ggaW5kZXg9JWQgZmQ9JWQgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgIHBmZHNbaV0uZXZlbnRzLCBpLCBwZmRzW2ldLmZkLCBlcnIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgZG9sb2cgKCJGYWlsZWQgdG8gc2V0IGhhbmRsZXIgZXZlbnRzPSUjeCBpbmRleD0lZCBmZD0lZCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgcGZkc1tpXS5ldmVudHMsIGksIHBmZHNbaV0uZmQsIGVycik7CisKKyAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyIChwZmRzW2ldLmZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdfZnJlZSAocGZkcyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaGxwLT5wZmRzID0gcGZkczsKKyAgICBobHAtPmNvdW50ID0gY291bnQ7CisgICAgaGxwLT5oYW5kbGUgPSBoYW5kbGU7CisgICAgaGxwLT5tYXNrID0gbWFzazsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHNhX3BvbGxfb3V0IChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICBBTFNBVm9pY2VPdXQgKmFsc2EgPSAoQUxTQVZvaWNlT3V0ICopIGh3OworCisgICAgcmV0dXJuIGFsc2FfcG9sbF9oZWxwZXIgKGFsc2EtPmhhbmRsZSwgJmFsc2EtPnBvbGxobHAsIFBPTExPVVQpOworfQorCitzdGF0aWMgaW50IGFsc2FfcG9sbF9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBBTFNBVm9pY2VJbiAqYWxzYSA9IChBTFNBVm9pY2VJbiAqKSBodzsKKworICAgIHJldHVybiBhbHNhX3BvbGxfaGVscGVyIChhbHNhLT5oYW5kbGUsICZhbHNhLT5wb2xsaGxwLCBQT0xMSU4pOworfQorCitzdGF0aWMgaW50IGFsc2Ffd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd193cml0ZSAoc3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNuZF9wY21fZm9ybWF0X3QgYXVkX3RvX2Fsc2FmbXQgKGF1ZGZtdF9lIGZtdCkKK3sKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICAgICAgcmV0dXJuIFNORF9QQ01fRk9STUFUX1M4OworCisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTg7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfUzE2X0xFOworCisgICAgY2FzZSBBVURfRk1UX1UxNjoKKyAgICAgICAgcmV0dXJuIFNORF9QQ01fRk9STUFUX1UxNl9MRTsKKworICAgIGNhc2UgQVVEX0ZNVF9TMzI6CisgICAgICAgIHJldHVybiBTTkRfUENNX0ZPUk1BVF9TMzJfTEU7CisKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTMyX0xFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZG9sb2cgKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogQmFkIGF1ZGlvIGZvcm1hdCAlZFxuIiwgZm10KTsKKyNpZmRlZiBERUJVR19BVURJTworICAgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gU05EX1BDTV9GT1JNQVRfVTg7CisgICAgfQorfQorCitzdGF0aWMgaW50IGFsc2FfdG9fYXVkZm10IChzbmRfcGNtX2Zvcm1hdF90IGFsc2FmbXQsIGF1ZGZtdF9lICpmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuZGlhbm5lc3MpCit7CisgICAgc3dpdGNoIChhbHNhZm10KSB7CisgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9TODoKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAwOworICAgICAgICAqZm10ID0gQVVEX0ZNVF9TODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fRk9STUFUX1U4OgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1U4OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzE2X0xFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1MxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fRk9STUFUX1UxNl9MRToKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAwOworICAgICAgICAqZm10ID0gQVVEX0ZNVF9VMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9TMTZfQkU6CisgICAgICAgICplbmRpYW5uZXNzID0gMTsKKyAgICAgICAgKmZtdCA9IEFVRF9GTVRfUzE2OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfVTE2X0JFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDE7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1UxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fRk9STUFUX1MzMl9MRToKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAwOworICAgICAgICAqZm10ID0gQVVEX0ZNVF9TMzI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTTkRfUENNX0ZPUk1BVF9VMzJfTEU6CisgICAgICAgICplbmRpYW5uZXNzID0gMDsKKyAgICAgICAgKmZtdCA9IEFVRF9GTVRfVTMyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU05EX1BDTV9GT1JNQVRfUzMyX0JFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDE7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1MzMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNORF9QQ01fRk9STUFUX1UzMl9CRToKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAxOworICAgICAgICAqZm10ID0gQVVEX0ZNVF9VMzI7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZG9sb2cgKCJVbnJlY29nbml6ZWQgYXVkaW8gZm9ybWF0ICVkXG4iLCBhbHNhZm10KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbHNhX2R1bXBfaW5mbyAoc3RydWN0IGFsc2FfcGFyYW1zX3JlcSAqcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhbHNhX3BhcmFtc19vYnQgKm9idCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmRfcGNtX2Zvcm1hdF90IG9idGZtdCkKK3sKKyAgICBkb2xvZyAoInBhcmFtZXRlciB8IHJlcXVlc3RlZCB2YWx1ZSB8IG9idGFpbmVkIHZhbHVlXG4iKTsKKyAgICBkb2xvZyAoImZvcm1hdCAgICB8ICAgICAgJTEwZCB8ICAgICAlMTBkXG4iLCByZXEtPmZtdCwgb2J0Zm10KTsKKyAgICBkb2xvZyAoImNoYW5uZWxzICB8ICAgICAgJTEwZCB8ICAgICAlMTBkXG4iLAorICAgICAgICAgICByZXEtPm5jaGFubmVscywgb2J0LT5uY2hhbm5lbHMpOworICAgIGRvbG9nICgiZnJlcXVlbmN5IHwgICAgICAlMTBkIHwgICAgICUxMGRcbiIsIHJlcS0+ZnJlcSwgb2J0LT5mcmVxKTsKKyAgICBkb2xvZyAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBkb2xvZyAoInJlcXVlc3RlZDogYnVmZmVyIHNpemUgJWQgcGVyaW9kIHNpemUgJWRcbiIsCisgICAgICAgICAgIHJlcS0+YnVmZmVyX3NpemUsIHJlcS0+cGVyaW9kX3NpemUpOworICAgIGRvbG9nICgib2J0YWluZWQ6IHNhbXBsZXMgJWxkXG4iLCBvYnQtPnNhbXBsZXMpOworfQorCitzdGF0aWMgdm9pZCBhbHNhX3NldF90aHJlc2hvbGQgKHNuZF9wY21fdCAqaGFuZGxlLCBzbmRfcGNtX3VmcmFtZXNfdCB0aHJlc2hvbGQpCit7CisgICAgaW50IGVycjsKKyAgICBzbmRfcGNtX3N3X3BhcmFtc190ICpzd19wYXJhbXM7CisKKyAgICBzbmRfcGNtX3N3X3BhcmFtc19hbGxvY2EgKCZzd19wYXJhbXMpOworCisgICAgZXJyID0gc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCAoaGFuZGxlLCBzd19wYXJhbXMpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGZ1bGx5IGluaXRpYWxpemUgREFDXG4iKTsKKyAgICAgICAgYWxzYV9sb2dlcnIgKGVyciwgIkZhaWxlZCB0byBnZXQgY3VycmVudCBzb2Z0d2FyZSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVyciA9IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQgKGhhbmRsZSwgc3dfcGFyYW1zLCB0aHJlc2hvbGQpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGZ1bGx5IGluaXRpYWxpemUgREFDXG4iKTsKKyAgICAgICAgYWxzYV9sb2dlcnIgKGVyciwgIkZhaWxlZCB0byBzZXQgc29mdHdhcmUgdGhyZXNob2xkIHRvICVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX3N3X3BhcmFtcyAoaGFuZGxlLCBzd19wYXJhbXMpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGZ1bGx5IGluaXRpYWxpemUgREFDXG4iKTsKKyAgICAgICAgYWxzYV9sb2dlcnIgKGVyciwgIkZhaWxlZCB0byBzZXQgc29mdHdhcmUgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYWxzYV9vcGVuIChpbnQgaW4sIHN0cnVjdCBhbHNhX3BhcmFtc19yZXEgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWxzYV9wYXJhbXNfb2J0ICpvYnQsIHNuZF9wY21fdCAqKmhhbmRsZXApCit7CisgICAgc25kX3BjbV90ICpoYW5kbGU7CisgICAgc25kX3BjbV9od19wYXJhbXNfdCAqaHdfcGFyYW1zOworICAgIGludCBlcnI7CisgICAgaW50IHNpemVfaW5fdXNlYzsKKyAgICB1bnNpZ25lZCBpbnQgZnJlcSwgbmNoYW5uZWxzOworICAgIGNvbnN0IGNoYXIgKnBjbV9uYW1lID0gaW4gPyBjb25mLnBjbV9uYW1lX2luIDogY29uZi5wY21fbmFtZV9vdXQ7CisgICAgc25kX3BjbV91ZnJhbWVzX3Qgb2J0X2J1ZmZlcl9zaXplOworICAgIGNvbnN0IGNoYXIgKnR5cCA9IGluID8gIkFEQyIgOiAiREFDIjsKKyAgICBzbmRfcGNtX2Zvcm1hdF90IG9idGZtdDsKKworICAgIGZyZXEgPSByZXEtPmZyZXE7CisgICAgbmNoYW5uZWxzID0gcmVxLT5uY2hhbm5lbHM7CisgICAgc2l6ZV9pbl91c2VjID0gcmVxLT5zaXplX2luX3VzZWM7CisKKyAgICBzbmRfcGNtX2h3X3BhcmFtc19hbGxvY2EgKCZod19wYXJhbXMpOworCisgICAgZXJyID0gc25kX3BjbV9vcGVuICgKKyAgICAgICAgJmhhbmRsZSwKKyAgICAgICAgcGNtX25hbWUsCisgICAgICAgIGluID8gU05EX1BDTV9TVFJFQU1fQ0FQVFVSRSA6IFNORF9QQ01fU1RSRUFNX1BMQVlCQUNLLAorICAgICAgICBTTkRfUENNX05PTkJMT0NLCisgICAgICAgICk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYWxzYV9sb2dlcnIyIChlcnIsIHR5cCwgIkZhaWxlZCB0byBvcGVuIGAlcyc6XG4iLCBwY21fbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19hbnkgKGhhbmRsZSwgaHdfcGFyYW1zKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhbHNhX2xvZ2VycjIgKGVyciwgdHlwLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgaGFyZHdhcmUgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MgKAorICAgICAgICBoYW5kbGUsCisgICAgICAgIGh3X3BhcmFtcywKKyAgICAgICAgU05EX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQKKyAgICAgICAgKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhbHNhX2xvZ2VycjIgKGVyciwgdHlwLCAiRmFpbGVkIHRvIHNldCBhY2Nlc3MgdHlwZVxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQgKGhhbmRsZSwgaHdfcGFyYW1zLCByZXEtPmZtdCk7CisgICAgaWYgKGVyciA8IDAgJiYgY29uZi52ZXJib3NlKSB7CisgICAgICAgIGFsc2FfbG9nZXJyMiAoZXJyLCB0eXAsICJGYWlsZWQgdG8gc2V0IGZvcm1hdCAlZFxuIiwgcmVxLT5mbXQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfcmF0ZV9uZWFyIChoYW5kbGUsIGh3X3BhcmFtcywgJmZyZXEsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGFsc2FfbG9nZXJyMiAoZXJyLCB0eXAsICJGYWlsZWQgdG8gc2V0IGZyZXF1ZW5jeSAlZFxuIiwgcmVxLT5mcmVxKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXIgKAorICAgICAgICBoYW5kbGUsCisgICAgICAgIGh3X3BhcmFtcywKKyAgICAgICAgJm5jaGFubmVscworICAgICAgICApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGFsc2FfbG9nZXJyMiAoZXJyLCB0eXAsICJGYWlsZWQgdG8gc2V0IG51bWJlciBvZiBjaGFubmVscyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXEtPm5jaGFubmVscyk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChuY2hhbm5lbHMgIT0gMSAmJiBuY2hhbm5lbHMgIT0gMikgeworICAgICAgICBhbHNhX2xvZ2VycjIgKGVyciwgdHlwLAorICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IGhhbmRsZSBvYnRhaW5lZCBudW1iZXIgb2YgY2hhbm5lbHMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmNoYW5uZWxzKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKHJlcS0+YnVmZmVyX3NpemUpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBvYnQ7CisKKyAgICAgICAgaWYgKHNpemVfaW5fdXNlYykgeworICAgICAgICAgICAgaW50IGRpciA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnRpbWUgPSByZXEtPmJ1ZmZlcl9zaXplOworCisgICAgICAgICAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhciAoCisgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgIGh3X3BhcmFtcywKKyAgICAgICAgICAgICAgICAmYnRpbWUsCisgICAgICAgICAgICAgICAgJmRpcgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBvYnQgPSBidGltZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNuZF9wY21fdWZyYW1lc190IGJzaXplID0gcmVxLT5idWZmZXJfc2l6ZTsKKworICAgICAgICAgICAgZXJyID0gc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIgKAorICAgICAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgICAgICBod19wYXJhbXMsCisgICAgICAgICAgICAgICAgJmJzaXplCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG9idCA9IGJzaXplOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhbHNhX2xvZ2VycjIgKGVyciwgdHlwLCAiRmFpbGVkIHRvIHNldCBidWZmZXIgJXMgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfaW5fdXNlYyA/ICJ0aW1lIiA6ICJzaXplIiwgcmVxLT5idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmVxLT5vdmVycmlkZV9tYXNrICYgMikgJiYgKG9idCAtIHJlcS0+YnVmZmVyX3NpemUpKQorICAgICAgICAgICAgZG9sb2cgKCJSZXF1ZXN0ZWQgYnVmZmVyICVzICV1IHdhcyByZWplY3RlZCwgdXNpbmcgJWx1XG4iLAorICAgICAgICAgICAgICAgICAgIHNpemVfaW5fdXNlYyA/ICJ0aW1lIiA6ICJzaXplIiwgcmVxLT5idWZmZXJfc2l6ZSwgb2J0KTsKKyAgICB9CisKKyAgICBpZiAocmVxLT5wZXJpb2Rfc2l6ZSkgeworICAgICAgICB1bnNpZ25lZCBsb25nIG9idDsKKworICAgICAgICBpZiAoc2l6ZV9pbl91c2VjKSB7CisgICAgICAgICAgICBpbnQgZGlyID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBwdGltZSA9IHJlcS0+cGVyaW9kX3NpemU7CisKKyAgICAgICAgICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyICgKKyAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgaHdfcGFyYW1zLAorICAgICAgICAgICAgICAgICZwdGltZSwKKyAgICAgICAgICAgICAgICAmZGlyCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG9idCA9IHB0aW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGRpciA9IDA7CisgICAgICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCBwc2l6ZSA9IHJlcS0+cGVyaW9kX3NpemU7CisKKyAgICAgICAgICAgIGVyciA9IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyICgKKyAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgaHdfcGFyYW1zLAorICAgICAgICAgICAgICAgICZwc2l6ZSwKKyAgICAgICAgICAgICAgICAmZGlyCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG9idCA9IHBzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGFsc2FfbG9nZXJyMiAoZXJyLCB0eXAsICJGYWlsZWQgdG8gc2V0IHBlcmlvZCAlcyB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9pbl91c2VjID8gInRpbWUiIDogInNpemUiLCByZXEtPnBlcmlvZF9zaXplKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCgocmVxLT5vdmVycmlkZV9tYXNrICYgMSkgJiYgKG9idCAtIHJlcS0+cGVyaW9kX3NpemUpKSkKKyAgICAgICAgICAgIGRvbG9nICgiUmVxdWVzdGVkIHBlcmlvZCAlcyAldSB3YXMgcmVqZWN0ZWQsIHVzaW5nICVsdVxuIiwKKyAgICAgICAgICAgICAgICAgICBzaXplX2luX3VzZWMgPyAidGltZSIgOiAic2l6ZSIsIHJlcS0+cGVyaW9kX3NpemUsIG9idCk7CisgICAgfQorCisgICAgZXJyID0gc25kX3BjbV9od19wYXJhbXMgKGhhbmRsZSwgaHdfcGFyYW1zKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhbHNhX2xvZ2VycjIgKGVyciwgdHlwLCAiRmFpbGVkIHRvIGFwcGx5IGF1ZGlvIHBhcmFtZXRlcnNcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUgKGh3X3BhcmFtcywgJm9idF9idWZmZXJfc2l6ZSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYWxzYV9sb2dlcnIyIChlcnIsIHR5cCwgIkZhaWxlZCB0byBnZXQgYnVmZmVyIHNpemVcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0IChod19wYXJhbXMsICZvYnRmbXQpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGFsc2FfbG9nZXJyMiAoZXJyLCB0eXAsICJGYWlsZWQgdG8gZ2V0IGZvcm1hdFxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChhbHNhX3RvX2F1ZGZtdCAob2J0Zm10LCAmb2J0LT5mbXQsICZvYnQtPmVuZGlhbm5lc3MpKSB7CisgICAgICAgIGRvbG9nICgiSW52YWxpZCBmb3JtYXQgd2FzIHJldHVybmVkICVkXG4iLCBvYnRmbXQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBzbmRfcGNtX3ByZXBhcmUgKGhhbmRsZSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYWxzYV9sb2dlcnIyIChlcnIsIHR5cCwgIkNvdWxkIG5vdCBwcmVwYXJlIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCFpbiAmJiBjb25mLnRocmVzaG9sZCkgeworICAgICAgICBzbmRfcGNtX3VmcmFtZXNfdCB0aHJlc2hvbGQ7CisgICAgICAgIGludCBieXRlc19wZXJfc2VjOworCisgICAgICAgIGJ5dGVzX3Blcl9zZWMgPSBmcmVxIDw8IChuY2hhbm5lbHMgPT0gMik7CisKKyAgICAgICAgc3dpdGNoIChvYnQtPmZtdCkgeworICAgICAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgICAgIGNhc2UgQVVEX0ZNVF9VODoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVEX0ZNVF9TMTY6CisgICAgICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgICAgICBieXRlc19wZXJfc2VjIDw8PSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICAgICAgY2FzZSBBVURfRk1UX1UzMjoKKyAgICAgICAgICAgIGJ5dGVzX3Blcl9zZWMgPDw9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRocmVzaG9sZCA9IChjb25mLnRocmVzaG9sZCAqIGJ5dGVzX3Blcl9zZWMpIC8gMTAwMDsKKyAgICAgICAgYWxzYV9zZXRfdGhyZXNob2xkIChoYW5kbGUsIHRocmVzaG9sZCk7CisgICAgfQorCisgICAgb2J0LT5uY2hhbm5lbHMgPSBuY2hhbm5lbHM7CisgICAgb2J0LT5mcmVxID0gZnJlcTsKKyAgICBvYnQtPnNhbXBsZXMgPSBvYnRfYnVmZmVyX3NpemU7CisKKyAgICAqaGFuZGxlcCA9IGhhbmRsZTsKKworICAgIGlmIChjb25mLnZlcmJvc2UgJiYKKyAgICAgICAgKG9idGZtdCAhPSByZXEtPmZtdCB8fAorICAgICAgICAgb2J0LT5uY2hhbm5lbHMgIT0gcmVxLT5uY2hhbm5lbHMgfHwKKyAgICAgICAgIG9idC0+ZnJlcSAhPSByZXEtPmZyZXEpKSB7CisgICAgICAgIGRvbG9nICgiQXVkaW8gcGFyYW1ldGVycyBmb3IgJXNcbiIsIHR5cCk7CisgICAgICAgIGFsc2FfZHVtcF9pbmZvIChyZXEsIG9idCwgb2J0Zm10KTsKKyAgICB9CisKKyNpZmRlZiBERUJVRworICAgIGFsc2FfZHVtcF9pbmZvIChyZXEsIG9idCwgb2J0Zm10KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworCisgZXJyOgorICAgIGFsc2FfYW5hbF9jbG9zZTEgKCZoYW5kbGUpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190IGFsc2FfZ2V0X2F2YWlsIChzbmRfcGNtX3QgKmhhbmRsZSkKK3sKKyAgICBzbmRfcGNtX3NmcmFtZXNfdCBhdmFpbDsKKworICAgIGF2YWlsID0gc25kX3BjbV9hdmFpbF91cGRhdGUgKGhhbmRsZSk7CisgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICBpZiAoYXZhaWwgPT0gLUVQSVBFKSB7CisgICAgICAgICAgICBpZiAoIWFsc2FfcmVjb3ZlciAoaGFuZGxlKSkgeworICAgICAgICAgICAgICAgIGF2YWlsID0gc25kX3BjbV9hdmFpbF91cGRhdGUgKGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZhaWwgPCAwKSB7CisgICAgICAgICAgICBhbHNhX2xvZ2VyciAoYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvYnRhaW4gbnVtYmVyIG9mIGF2YWlsYWJsZSBmcmFtZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGF2YWlsOworfQorCitzdGF0aWMgdm9pZCBhbHNhX3dyaXRlX3BlbmRpbmcgKEFMU0FWb2ljZU91dCAqYWxzYSkKK3sKKyAgICBIV1ZvaWNlT3V0ICpodyA9ICZhbHNhLT5odzsKKworICAgIHdoaWxlIChhbHNhLT5wZW5kaW5nKSB7CisgICAgICAgIGludCBsZWZ0X3RpbGxfZW5kX3NhbXBsZXMgPSBody0+c2FtcGxlcyAtIGFsc2EtPndwb3M7CisgICAgICAgIGludCBsZW4gPSBhdWRpb19NSU4gKGFsc2EtPnBlbmRpbmcsIGxlZnRfdGlsbF9lbmRfc2FtcGxlcyk7CisgICAgICAgIGNoYXIgKnNyYyA9IGFkdmFuY2UgKGFsc2EtPnBjbV9idWYsIGFsc2EtPndwb3MgPDwgaHctPmluZm8uc2hpZnQpOworCisgICAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgICAgIHNuZF9wY21fc2ZyYW1lc190IHdyaXR0ZW47CisKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBzbmRfcGNtX3dyaXRlaSAoYWxzYS0+aGFuZGxlLCBzcmMsIGxlbik7CisKKyAgICAgICAgICAgIGlmICh3cml0dGVuIDw9IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHdyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25mLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbG9nICgiRmFpbGVkIHRvIHdyaXRlICVkIGZyYW1lcyAod3JvdGUgemVybylcbiIsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgY2FzZSAtRVBJUEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChhbHNhX3JlY292ZXIgKGFsc2EtPmhhbmRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsc2FfbG9nZXJyICh3cml0dGVuLCAiRmFpbGVkIHRvIHdyaXRlICVkIGZyYW1lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25mLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbG9nICgiUmVjb3ZlcmluZyBmcm9tIHBsYXliYWNrIHhydW5cbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSAtRVNUUlBJUEU6CisgICAgICAgICAgICAgICAgICAgIC8qIHN0cmVhbSBpcyBzdXNwZW5kZWQgYW5kIHdhaXRpbmcgZm9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHJlY292ZXJ5ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhbHNhX3Jlc3VtZSAoYWxzYS0+aGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxzYV9sb2dlcnIgKHdyaXR0ZW4sICJGYWlsZWQgdG8gd3JpdGUgJWQgZnJhbWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmYudmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9sb2cgKCJSZXN1bWluZyBzdXNwZW5kZWQgb3V0cHV0IHN0cmVhbVxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBjYXNlIC1FQUdBSU46CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFsc2FfbG9nZXJyICh3cml0dGVuLCAiRmFpbGVkIHRvIHdyaXRlICVkIGZyYW1lcyBmcm9tICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBzcmMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhbHNhLT53cG9zID0gKGFsc2EtPndwb3MgKyB3cml0dGVuKSAlIGh3LT5zYW1wbGVzOworICAgICAgICAgICAgYWxzYS0+cGVuZGluZyAtPSB3cml0dGVuOworICAgICAgICAgICAgbGVuIC09IHdyaXR0ZW47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYWxzYV9ydW5fb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGxpdmUpCit7CisgICAgQUxTQVZvaWNlT3V0ICphbHNhID0gKEFMU0FWb2ljZU91dCAqKSBodzsKKyAgICBpbnQgZGVjcjsKKyAgICBzbmRfcGNtX3NmcmFtZXNfdCBhdmFpbDsKKworICAgIGF2YWlsID0gYWxzYV9nZXRfYXZhaWwgKGFsc2EtPmhhbmRsZSk7CisgICAgaWYgKGF2YWlsIDwgMCkgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBnZXQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwbGF5YmFjayBmcmFtZXNcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBkZWNyID0gYXVkaW9fTUlOIChsaXZlLCBhdmFpbCk7CisgICAgZGVjciA9IGF1ZGlvX3BjbV9od19jbGlwX291dCAoaHcsIGFsc2EtPnBjbV9idWYsIGRlY3IsIGFsc2EtPnBlbmRpbmcpOworICAgIGFsc2EtPnBlbmRpbmcgKz0gZGVjcjsKKyAgICBhbHNhX3dyaXRlX3BlbmRpbmcgKGFsc2EpOworICAgIHJldHVybiBkZWNyOworfQorCitzdGF0aWMgdm9pZCBhbHNhX2Zpbmlfb3V0IChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICBBTFNBVm9pY2VPdXQgKmFsc2EgPSAoQUxTQVZvaWNlT3V0ICopIGh3OworCisgICAgbGRlYnVnICgiYWxzYV9maW5pXG4iKTsKKyAgICBhbHNhX2FuYWxfY2xvc2UgKCZhbHNhLT5oYW5kbGUsICZhbHNhLT5wb2xsaGxwKTsKKworICAgIGlmIChhbHNhLT5wY21fYnVmKSB7CisgICAgICAgIGdfZnJlZSAoYWxzYS0+cGNtX2J1Zik7CisgICAgICAgIGFsc2EtPnBjbV9idWYgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBhbHNhX2luaXRfb3V0IChIV1ZvaWNlT3V0ICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBBTFNBVm9pY2VPdXQgKmFsc2EgPSAoQUxTQVZvaWNlT3V0ICopIGh3OworICAgIHN0cnVjdCBhbHNhX3BhcmFtc19yZXEgcmVxOworICAgIHN0cnVjdCBhbHNhX3BhcmFtc19vYnQgb2J0OworICAgIHNuZF9wY21fdCAqaGFuZGxlOworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXM7CisgICAgaW50ICByZXN1bHQgPSAtMTsKKworICAgIC8qIHNodXQgYWxzYSBkZWJ1ZyBzcGV3ICovCisgICAgaWYgKCFEX0FDVElWRSkKKyAgICAgICAgc3RkaW9fZGlzYWJsZSgpOworCisgICAgcmVxLmZtdCA9IGF1ZF90b19hbHNhZm10IChhcy0+Zm10KTsKKyAgICByZXEuZnJlcSA9IGFzLT5mcmVxOworICAgIHJlcS5uY2hhbm5lbHMgPSBhcy0+bmNoYW5uZWxzOworICAgIHJlcS5wZXJpb2Rfc2l6ZSA9IGNvbmYucGVyaW9kX3NpemVfb3V0OworICAgIHJlcS5idWZmZXJfc2l6ZSA9IGNvbmYuYnVmZmVyX3NpemVfb3V0OworICAgIHJlcS5zaXplX2luX3VzZWMgPSBjb25mLnNpemVfaW5fdXNlY19vdXQ7CisgICAgcmVxLm92ZXJyaWRlX21hc2sgPQorICAgICAgICAoY29uZi5wZXJpb2Rfc2l6ZV9vdXRfb3ZlcnJpZGRlbiA/IDEgOiAwKSB8CisgICAgICAgIChjb25mLmJ1ZmZlcl9zaXplX291dF9vdmVycmlkZGVuID8gMiA6IDApOworCisgICAgaWYgKGFsc2Ffb3BlbiAoMCwgJnJlcSwgJm9idCwgJmhhbmRsZSkpIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIG9idF9hcy5mcmVxID0gb2J0LmZyZXE7CisgICAgb2J0X2FzLm5jaGFubmVscyA9IG9idC5uY2hhbm5lbHM7CisgICAgb2J0X2FzLmZtdCA9IG9idC5mbXQ7CisgICAgb2J0X2FzLmVuZGlhbm5lc3MgPSBvYnQuZW5kaWFubmVzczsKKworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgJm9idF9hcyk7CisgICAgaHctPnNhbXBsZXMgPSBvYnQuc2FtcGxlczsKKworICAgIGFsc2EtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIG9idC5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICBpZiAoIWFsc2EtPnBjbV9idWYpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgREFDIGJ1ZmZlciAoJWQgc2FtcGxlcywgZWFjaCAlZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGFsc2FfYW5hbF9jbG9zZTEgKCZoYW5kbGUpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgYWxzYS0+aGFuZGxlID0gaGFuZGxlOworICAgIHJlc3VsdCAgICAgICA9IDA7ICAvKiBzdWNjZXNzICovCisKK0V4aXQ6CisgICAgaWYgKCFEX0FDVElWRSkKKyAgICAgICAgc3RkaW9fZW5hYmxlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGFsc2Ffdm9pY2VfY3RsIChzbmRfcGNtX3QgKmhhbmRsZSwgY29uc3QgY2hhciAqdHlwLCBpbnQgcGF1c2UpCit7CisgICAgaW50IGVycjsKKworICAgIGlmIChwYXVzZSkgeworICAgICAgICBlcnIgPSBzbmRfcGNtX2Ryb3AgKGhhbmRsZSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhbHNhX2xvZ2VyciAoZXJyLCAiQ291bGQgbm90IHN0b3AgJXNcbiIsIHR5cCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVyciA9IHNuZF9wY21fcHJlcGFyZSAoaGFuZGxlKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGFsc2FfbG9nZXJyIChlcnIsICJDb3VsZCBub3QgcHJlcGFyZSBoYW5kbGUgZm9yICVzXG4iLCB0eXApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxzYV9jdGxfb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGNtZCwgLi4uKQoreworICAgIEFMU0FWb2ljZU91dCAqYWxzYSA9IChBTFNBVm9pY2VPdXQgKikgaHc7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgVk9JQ0VfRU5BQkxFOgorICAgICAgICB7CisgICAgICAgICAgICB2YV9saXN0IGFwOworICAgICAgICAgICAgaW50IHBvbGxfbW9kZTsKKworICAgICAgICAgICAgdmFfc3RhcnQgKGFwLCBjbWQpOworICAgICAgICAgICAgcG9sbF9tb2RlID0gdmFfYXJnIChhcCwgaW50KTsKKyAgICAgICAgICAgIHZhX2VuZCAoYXApOworCisgICAgICAgICAgICBsZGVidWcgKCJlbmFibGluZyB2b2ljZVxuIik7CisgICAgICAgICAgICBpZiAocG9sbF9tb2RlICYmIGFsc2FfcG9sbF9vdXQgKGh3KSkgeworICAgICAgICAgICAgICAgIHBvbGxfbW9kZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBody0+cG9sbF9tb2RlID0gcG9sbF9tb2RlOworICAgICAgICAgICAgcmV0dXJuIGFsc2Ffdm9pY2VfY3RsIChhbHNhLT5oYW5kbGUsICJwbGF5YmFjayIsIDApOworICAgICAgICB9CisKKyAgICBjYXNlIFZPSUNFX0RJU0FCTEU6CisgICAgICAgIGxkZWJ1ZyAoImRpc2FibGluZyB2b2ljZVxuIik7CisgICAgICAgIHJldHVybiBhbHNhX3ZvaWNlX2N0bCAoYWxzYS0+aGFuZGxlLCAicGxheWJhY2siLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWxzYV9pbml0X2luIChIV1ZvaWNlSW4gKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIEFMU0FWb2ljZUluICphbHNhID0gKEFMU0FWb2ljZUluICopIGh3OworICAgIHN0cnVjdCBhbHNhX3BhcmFtc19yZXEgcmVxOworICAgIHN0cnVjdCBhbHNhX3BhcmFtc19vYnQgb2J0OworICAgIHNuZF9wY21fdCAqaGFuZGxlOworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXM7CisgICAgaW50IHJlc3VsdCA9IC0xOworCisgICAgLyogc2h1dCBhbHNhIGRlYnVnIHNwZXcgKi8KKyAgICBpZiAoIURfQUNUSVZFKQorICAgICAgICBzdGRpb19kaXNhYmxlKCk7CisKKyAgICByZXEuZm10ID0gYXVkX3RvX2Fsc2FmbXQgKGFzLT5mbXQpOworICAgIHJlcS5mcmVxID0gYXMtPmZyZXE7CisgICAgcmVxLm5jaGFubmVscyA9IGFzLT5uY2hhbm5lbHM7CisgICAgcmVxLnBlcmlvZF9zaXplID0gY29uZi5wZXJpb2Rfc2l6ZV9pbjsKKyAgICByZXEuYnVmZmVyX3NpemUgPSBjb25mLmJ1ZmZlcl9zaXplX2luOworICAgIHJlcS5zaXplX2luX3VzZWMgPSBjb25mLnNpemVfaW5fdXNlY19pbjsKKyAgICByZXEub3ZlcnJpZGVfbWFzayA9CisgICAgICAgIChjb25mLnBlcmlvZF9zaXplX2luX292ZXJyaWRkZW4gPyAxIDogMCkgfAorICAgICAgICAoY29uZi5idWZmZXJfc2l6ZV9pbl9vdmVycmlkZGVuID8gMiA6IDApOworCisgICAgaWYgKGFsc2Ffb3BlbiAoMSwgJnJlcSwgJm9idCwgJmhhbmRsZSkpIHsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIG9idF9hcy5mcmVxID0gb2J0LmZyZXE7CisgICAgb2J0X2FzLm5jaGFubmVscyA9IG9idC5uY2hhbm5lbHM7CisgICAgb2J0X2FzLmZtdCA9IG9idC5mbXQ7CisgICAgb2J0X2FzLmVuZGlhbm5lc3MgPSBvYnQuZW5kaWFubmVzczsKKworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgJm9idF9hcyk7CisgICAgaHctPnNhbXBsZXMgPSBvYnQuc2FtcGxlczsKKworICAgIGFsc2EtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICBpZiAoIWFsc2EtPnBjbV9idWYpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgQURDIGJ1ZmZlciAoJWQgc2FtcGxlcywgZWFjaCAlZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGFsc2FfYW5hbF9jbG9zZTEgKCZoYW5kbGUpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgYWxzYS0+aGFuZGxlID0gaGFuZGxlOworICAgIHJlc3VsdCAgICAgICA9IDA7ICAvKiBzdWNjZXNzICovCisKK0V4aXQ6CisgICAgaWYgKCFEX0FDVElWRSkKKyAgICAgICAgc3RkaW9fZW5hYmxlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBhbHNhX2ZpbmlfaW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgQUxTQVZvaWNlSW4gKmFsc2EgPSAoQUxTQVZvaWNlSW4gKikgaHc7CisKKyAgICBhbHNhX2FuYWxfY2xvc2UgKCZhbHNhLT5oYW5kbGUsICZhbHNhLT5wb2xsaGxwKTsKKworICAgIGlmIChhbHNhLT5wY21fYnVmKSB7CisgICAgICAgIGdfZnJlZSAoYWxzYS0+cGNtX2J1Zik7CisgICAgICAgIGFsc2EtPnBjbV9idWYgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBhbHNhX3J1bl9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBBTFNBVm9pY2VJbiAqYWxzYSA9IChBTFNBVm9pY2VJbiAqKSBodzsKKyAgICBpbnQgaHdzaGlmdCA9IGh3LT5pbmZvLnNoaWZ0OworICAgIGludCBpOworICAgIGludCBsaXZlID0gYXVkaW9fcGNtX2h3X2dldF9saXZlX2luIChodyk7CisgICAgaW50IGRlYWQgPSBody0+c2FtcGxlcyAtIGxpdmU7CisgICAgaW50IGRlY3I7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IGFkZDsKKyAgICAgICAgaW50IGxlbjsKKyAgICB9IGJ1ZnNbMl0gPSB7CisgICAgICAgIHsgLmFkZCA9IGh3LT53cG9zLCAubGVuID0gMCB9LAorICAgICAgICB7IC5hZGQgPSAwLCAgICAgICAgLmxlbiA9IDAgfQorICAgIH07CisgICAgc25kX3BjbV9zZnJhbWVzX3QgYXZhaWw7CisgICAgc25kX3BjbV91ZnJhbWVzX3QgcmVhZF9zYW1wbGVzID0gMDsKKworICAgIGlmICghZGVhZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdmFpbCA9IGFsc2FfZ2V0X2F2YWlsIChhbHNhLT5oYW5kbGUpOworICAgIGlmIChhdmFpbCA8IDApIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgZ2V0IG51bWJlciBvZiBjYXB0dXJlZCBmcmFtZXNcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWF2YWlsKSB7CisgICAgICAgIHNuZF9wY21fc3RhdGVfdCBzdGF0ZTsKKworICAgICAgICBzdGF0ZSA9IHNuZF9wY21fc3RhdGUgKGFsc2EtPmhhbmRsZSk7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTTkRfUENNX1NUQVRFX1BSRVBBUkVEOgorICAgICAgICAgICAgYXZhaWwgPSBody0+c2FtcGxlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNORF9QQ01fU1RBVEVfU1VTUEVOREVEOgorICAgICAgICAgICAgLyogc3RyZWFtIGlzIHN1c3BlbmRlZCBhbmQgd2FpdGluZyBmb3IgYW4gYXBwbGljYXRpb24gcmVjb3ZlcnkgKi8KKyAgICAgICAgICAgIGlmIChhbHNhX3Jlc3VtZSAoYWxzYS0+aGFuZGxlKSkgeworICAgICAgICAgICAgICAgIGRvbG9nICgiRmFpbGVkIHRvIHJlc3VtZSBzdXNwZW5kZWQgaW5wdXQgc3RyZWFtXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25mLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBkb2xvZyAoIlJlc3VtaW5nIHN1c3BlbmRlZCBpbnB1dCBzdHJlYW1cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoY29uZi52ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgZG9sb2cgKCJObyBmcmFtZXMgYXZhaWxhYmxlIGFuZCBBTFNBIHN0YXRlIGlzICVkXG4iLCBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRlY3IgPSBhdWRpb19NSU4gKGRlYWQsIGF2YWlsKTsKKyAgICBpZiAoIWRlY3IpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGh3LT53cG9zICsgZGVjciA+IGh3LT5zYW1wbGVzKSB7CisgICAgICAgIGJ1ZnNbMF0ubGVuID0gKGh3LT5zYW1wbGVzIC0gaHctPndwb3MpOworICAgICAgICBidWZzWzFdLmxlbiA9IChkZWNyIC0gKGh3LT5zYW1wbGVzIC0gaHctPndwb3MpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJ1ZnNbMF0ubGVuID0gZGVjcjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHZvaWQgKnNyYzsKKyAgICAgICAgc3RydWN0IHN0X3NhbXBsZSAqZHN0OworICAgICAgICBzbmRfcGNtX3NmcmFtZXNfdCBucmVhZDsKKyAgICAgICAgc25kX3BjbV91ZnJhbWVzX3QgbGVuOworCisgICAgICAgIGxlbiA9IGJ1ZnNbaV0ubGVuOworCisgICAgICAgIHNyYyA9IGFkdmFuY2UgKGFsc2EtPnBjbV9idWYsIGJ1ZnNbaV0uYWRkIDw8IGh3c2hpZnQpOworICAgICAgICBkc3QgPSBody0+Y29udl9idWYgKyBidWZzW2ldLmFkZDsKKworICAgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICBucmVhZCA9IHNuZF9wY21fcmVhZGkgKGFsc2EtPmhhbmRsZSwgc3JjLCBsZW4pOworCisgICAgICAgICAgICBpZiAobnJlYWQgPD0gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnJlYWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25mLnZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbG9nICgiRmFpbGVkIHRvIHJlYWQgJWxkIGZyYW1lcyAocmVhZCB6ZXJvKVxuIiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAgICAgICAgICAgICBjYXNlIC1FUElQRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsc2FfcmVjb3ZlciAoYWxzYS0+aGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxzYV9sb2dlcnIgKG5yZWFkLCAiRmFpbGVkIHRvIHJlYWQgJWxkIGZyYW1lc1xuIiwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZi52ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2xvZyAoIlJlY292ZXJpbmcgZnJvbSBjYXB0dXJlIHhydW5cbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgY2FzZSAtRUFHQUlOOgorICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhbHNhX2xvZ2VyciAoCisgICAgICAgICAgICAgICAgICAgICAgICBucmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCAlbGQgZnJhbWVzIGZyb20gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh3LT5jb252IChkc3QsIHNyYywgbnJlYWQsICZub21pbmFsX3ZvbHVtZSk7CisKKyAgICAgICAgICAgIHNyYyA9IGFkdmFuY2UgKHNyYywgbnJlYWQgPDwgaHdzaGlmdCk7CisgICAgICAgICAgICBkc3QgKz0gbnJlYWQ7CisKKyAgICAgICAgICAgIHJlYWRfc2FtcGxlcyArPSBucmVhZDsKKyAgICAgICAgICAgIGxlbiAtPSBucmVhZDsKKyAgICAgICAgfQorICAgIH0KKworIGV4aXQ6CisgICAgaHctPndwb3MgPSAoaHctPndwb3MgKyByZWFkX3NhbXBsZXMpICUgaHctPnNhbXBsZXM7CisgICAgcmV0dXJuIHJlYWRfc2FtcGxlczsKK30KKworc3RhdGljIGludCBhbHNhX3JlYWQgKFNXVm9pY2VJbiAqc3csIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd19yZWFkIChzdywgYnVmLCBzaXplKTsKK30KKworc3RhdGljIGludCBhbHNhX2N0bF9pbiAoSFdWb2ljZUluICpodywgaW50IGNtZCwgLi4uKQoreworICAgIEFMU0FWb2ljZUluICphbHNhID0gKEFMU0FWb2ljZUluICopIGh3OworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFZPSUNFX0VOQUJMRToKKyAgICAgICAgeworICAgICAgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICAgICAgIGludCBwb2xsX21vZGU7CisKKyAgICAgICAgICAgIHZhX3N0YXJ0IChhcCwgY21kKTsKKyAgICAgICAgICAgIHBvbGxfbW9kZSA9IHZhX2FyZyAoYXAsIGludCk7CisgICAgICAgICAgICB2YV9lbmQgKGFwKTsKKworICAgICAgICAgICAgbGRlYnVnICgiZW5hYmxpbmcgdm9pY2VcbiIpOworICAgICAgICAgICAgaWYgKHBvbGxfbW9kZSAmJiBhbHNhX3BvbGxfaW4gKGh3KSkgeworICAgICAgICAgICAgICAgIHBvbGxfbW9kZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBody0+cG9sbF9tb2RlID0gcG9sbF9tb2RlOworCisgICAgICAgICAgICByZXR1cm4gYWxzYV92b2ljZV9jdGwgKGFsc2EtPmhhbmRsZSwgImNhcHR1cmUiLCAwKTsKKyAgICAgICAgfQorCisgICAgY2FzZSBWT0lDRV9ESVNBQkxFOgorICAgICAgICBsZGVidWcgKCJkaXNhYmxpbmcgdm9pY2VcbiIpOworICAgICAgICBpZiAoaHctPnBvbGxfbW9kZSkgeworICAgICAgICAgICAgaHctPnBvbGxfbW9kZSA9IDA7CisgICAgICAgICAgICBhbHNhX2ZpbmlfcG9sbCAoJmFsc2EtPnBvbGxobHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbHNhX3ZvaWNlX2N0bCAoYWxzYS0+aGFuZGxlLCAiY2FwdHVyZSIsIDEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworZXh0ZXJuIGludCBhbHNhX2R5bmxpbmtfaW5pdCh2b2lkKiBsaWIpOworCitzdGF0aWMgdm9pZCAqYWxzYV9hdWRpb19pbml0ICh2b2lkKQoreworICAgIHZvaWQqICAgIHJlc3VsdCA9IE5VTEw7CisKKyAgICBhbHNhX2xpYiA9IGRsb3BlbiggImxpYmFzb3VuZC5zbyIsIFJUTERfTk9XICk7CisgICAgaWYgKGFsc2FfbGliID09IE5VTEwpCisgICAgICAgIGFsc2FfbGliID0gZGxvcGVuKCAibGliYXNvdW5kLnNvLjIiLCBSVExEX05PVyApOworCisgICAgaWYgKGFsc2FfbGliID09IE5VTEwpIHsKKyAgICAgICAgbGRlYnVnKCJjb3VsZCBub3QgZmluZCBsaWJhc291bmQgb24gdGhpcyBzeXN0ZW1cbiIpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKGFsc2FfZHlubGlua19pbml0KGFsc2FfbGliKSA8IDApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgIHJlc3VsdCA9ICZjb25mOworICAgIGdvdG8gRXhpdDsKKworRmFpbDoKKyAgICBsZGVidWcoIiVzOiBmYWlsZWQgdG8gb3BlbiBsaWJyYXJ5XG4iLCBfX0ZVTkNUSU9OX18pOworICAgIGRsY2xvc2UoYWxzYV9saWIpOworCitFeGl0OgorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFsc2FfYXVkaW9fZmluaSAodm9pZCAqb3BhcXVlKQoreworICAgIGlmIChhbHNhX2xpYiAhPSBOVUxMKSB7CisgICAgICAgIGRsY2xvc2UoYWxzYV9saWIpOworICAgICAgICBhbHNhX2xpYiA9IE5VTEw7CisgICAgfQorICAgICh2b2lkKSBvcGFxdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fb3B0aW9uIGFsc2Ffb3B0aW9uc1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgID0gIkRBQ19TSVpFX0lOX1VTRUMiLAorICAgICAgICAudGFnICAgICAgICAgPSBBVURfT1BUX0JPT0wsCisgICAgICAgIC52YWxwICAgICAgICA9ICZjb25mLnNpemVfaW5fdXNlY19vdXQsCisgICAgICAgIC5kZXNjciAgICAgICA9ICJEQUMgcGVyaW9kL2J1ZmZlciBzaXplIGluIG1pY3Jvc2Vjb25kcyAob3RoZXJ3aXNlIGluIGZyYW1lcykiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICA9ICJEQUNfUEVSSU9EX1NJWkUiLAorICAgICAgICAudGFnICAgICAgICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgICAgICAgID0gJmNvbmYucGVyaW9kX3NpemVfb3V0LAorICAgICAgICAuZGVzY3IgICAgICAgPSAiREFDIHBlcmlvZCBzaXplICgwIHRvIGdvIHdpdGggc3lzdGVtIGRlZmF1bHQpIiwKKyAgICAgICAgLm92ZXJyaWRkZW5wID0gJmNvbmYucGVyaW9kX3NpemVfb3V0X292ZXJyaWRkZW4KKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgID0gIkRBQ19CVUZGRVJfU0laRSIsCisgICAgICAgIC50YWcgICAgICAgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgICAgICAgPSAmY29uZi5idWZmZXJfc2l6ZV9vdXQsCisgICAgICAgIC5kZXNjciAgICAgICA9ICJEQUMgYnVmZmVyIHNpemUgKDAgdG8gZ28gd2l0aCBzeXN0ZW0gZGVmYXVsdCkiLAorICAgICAgICAub3ZlcnJpZGRlbnAgPSAmY29uZi5idWZmZXJfc2l6ZV9vdXRfb3ZlcnJpZGRlbgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiQURDX1NJWkVfSU5fVVNFQyIsCisgICAgICAgIC50YWcgICAgICAgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgICAgICAgID0gJmNvbmYuc2l6ZV9pbl91c2VjX2luLAorICAgICAgICAuZGVzY3IgICAgICAgPQorICAgICAgICAiQURDIHBlcmlvZC9idWZmZXIgc2l6ZSBpbiBtaWNyb3NlY29uZHMgKG90aGVyd2lzZSBpbiBmcmFtZXMpIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiQURDX1BFUklPRF9TSVpFIiwKKyAgICAgICAgLnRhZyAgICAgICAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICAgICAgICA9ICZjb25mLnBlcmlvZF9zaXplX2luLAorICAgICAgICAuZGVzY3IgICAgICAgPSAiQURDIHBlcmlvZCBzaXplICgwIHRvIGdvIHdpdGggc3lzdGVtIGRlZmF1bHQpIiwKKyAgICAgICAgLm92ZXJyaWRkZW5wID0gJmNvbmYucGVyaW9kX3NpemVfaW5fb3ZlcnJpZGRlbgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiQURDX0JVRkZFUl9TSVpFIiwKKyAgICAgICAgLnRhZyAgICAgICAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICAgICAgICA9ICZjb25mLmJ1ZmZlcl9zaXplX2luLAorICAgICAgICAuZGVzY3IgICAgICAgPSAiQURDIGJ1ZmZlciBzaXplICgwIHRvIGdvIHdpdGggc3lzdGVtIGRlZmF1bHQpIiwKKyAgICAgICAgLm92ZXJyaWRkZW5wID0gJmNvbmYuYnVmZmVyX3NpemVfaW5fb3ZlcnJpZGRlbgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiVEhSRVNIT0xEIiwKKyAgICAgICAgLnRhZyAgICAgICAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICAgICAgICA9ICZjb25mLnRocmVzaG9sZCwKKyAgICAgICAgLmRlc2NyICAgICAgID0gIih1bmRvY3VtZW50ZWQpIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgPSAiREFDX0RFViIsCisgICAgICAgIC50YWcgICAgICAgICA9IEFVRF9PUFRfU1RSLAorICAgICAgICAudmFscCAgICAgICAgPSAmY29uZi5wY21fbmFtZV9vdXQsCisgICAgICAgIC5kZXNjciAgICAgICA9ICJEQUMgZGV2aWNlIG5hbWUgKGZvciBpbnN0YW5jZSBkbWl4KSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgID0gIkFEQ19ERVYiLAorICAgICAgICAudGFnICAgICAgICAgPSBBVURfT1BUX1NUUiwKKyAgICAgICAgLnZhbHAgICAgICAgID0gJmNvbmYucGNtX25hbWVfaW4sCisgICAgICAgIC5kZXNjciAgICAgICA9ICJBREMgZGV2aWNlIG5hbWUiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICA9ICJWRVJCT1NFIiwKKyAgICAgICAgLnRhZyAgICAgICAgID0gQVVEX09QVF9CT09MLAorICAgICAgICAudmFscCAgICAgICAgPSAmY29uZi52ZXJib3NlLAorICAgICAgICAuZGVzY3IgICAgICAgPSAiQmVoYXZlIGluIGEgbW9yZSB2ZXJib3NlIHdheSIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wY21fb3BzIGFsc2FfcGNtX29wcyA9IHsKKyAgICAuaW5pdF9vdXQgPSBhbHNhX2luaXRfb3V0LAorICAgIC5maW5pX291dCA9IGFsc2FfZmluaV9vdXQsCisgICAgLnJ1bl9vdXQgID0gYWxzYV9ydW5fb3V0LAorICAgIC53cml0ZSAgICA9IGFsc2Ffd3JpdGUsCisgICAgLmN0bF9vdXQgID0gYWxzYV9jdGxfb3V0LAorCisgICAgLmluaXRfaW4gID0gYWxzYV9pbml0X2luLAorICAgIC5maW5pX2luICA9IGFsc2FfZmluaV9pbiwKKyAgICAucnVuX2luICAgPSBhbHNhX3J1bl9pbiwKKyAgICAucmVhZCAgICAgPSBhbHNhX3JlYWQsCisgICAgLmN0bF9pbiAgID0gYWxzYV9jdGxfaW4sCit9OworCitzdHJ1Y3QgYXVkaW9fZHJpdmVyIGFsc2FfYXVkaW9fZHJpdmVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbHNhIiwKKyAgICAuZGVzY3IgICAgICAgICAgPSAiQUxTQSBodHRwOi8vd3d3LmFsc2EtcHJvamVjdC5vcmciLAorICAgIC5vcHRpb25zICAgICAgICA9IGFsc2Ffb3B0aW9ucywKKyAgICAuaW5pdCAgICAgICAgICAgPSBhbHNhX2F1ZGlvX2luaXQsCisgICAgLmZpbmkgICAgICAgICAgID0gYWxzYV9hdWRpb19maW5pLAorICAgIC5wY21fb3BzICAgICAgICA9ICZhbHNhX3BjbV9vcHMsCisgICAgLmNhbl9iZV9kZWZhdWx0ID0gMSwKKyAgICAubWF4X3ZvaWNlc19vdXQgPSBJTlRfTUFYLAorICAgIC5tYXhfdm9pY2VzX2luICA9IElOVF9NQVgsCisgICAgLnZvaWNlX3NpemVfb3V0ID0gc2l6ZW9mIChBTFNBVm9pY2VPdXQpLAorICAgIC52b2ljZV9zaXplX2luICA9IHNpemVvZiAoQUxTQVZvaWNlSW4pCit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDIzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvLmMKQEAgLTAsMCArMSwyMjEzIEBACisvKgorICogUUVNVSBBdWRpbyBzdWJzeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKworI2RlZmluZSBBVURJT19DQVAgImF1ZGlvIgorI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9xZW11LWRlYnVnLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hbmRyb2lkLmgiCisKKy8qICNkZWZpbmUgREVCVUdfUExJVkUgKi8KKy8qICNkZWZpbmUgREVCVUdfTElWRSAqLworLyogI2RlZmluZSBERUJVR19PVVQgKi8KKy8qICNkZWZpbmUgREVCVUdfQ0FQVFVSRSAqLworCisjZGVmaW5lIFNXX05BTUUoc3cpIChzdyktPm5hbWUgPyAoc3cpLT5uYW1lIDogInVua25vd24iCisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkcnZ0YWJbXSA9IHsKKyNpZmRlZiBDT05GSUdfUFVMU0VBVURJTworICAgICZwYV9hdWRpb19kcml2ZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVNECisgICAgJmVzZF9hdWRpb19kcml2ZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQUxTQQorICAgICZhbHNhX2F1ZGlvX2RyaXZlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DT1JFQVVESU8KKyAgICAmY29yZWF1ZGlvX2F1ZGlvX2RyaXZlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19EU09VTkQKKyAgICAmZHNvdW5kX2F1ZGlvX2RyaXZlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GTU9ECisgICAgJmZtb2RfYXVkaW9fZHJpdmVyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1dJTkFVRElPCisgICAgJndpbl9hdWRpb19kcml2ZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT1NTCisgICAgJm9zc19hdWRpb19kcml2ZXIsCisjZW5kaWYKKyAgICAmbm9fYXVkaW9fZHJpdmVyLAorI2lmIDAgIC8qIGRpc2FibGVkIFdBViBhdWRpbyBmb3Igbm93IC0gdW50aWwgd2UgZmluZCBhIHVzZXItZnJpZW5kbHkgd2F5IHRvIHVzZSBpdCAqLworICAgICZ3YXZfYXVkaW9fZHJpdmVyCisjZW5kaWYKK307CisKKworaW50CithdWRpb19nZXRfYmFja2VuZF9jb3VudCggaW50ICBpc19pbnB1dCApCit7CisgICAgaW50ICBubiwgY291bnQgPSAwOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgc2l6ZW9mKGRydnRhYikvc2l6ZW9mKGRydnRhYlswXSk7IG5uKyspCisgICAgeworICAgICAgICBpZiAoaXNfaW5wdXQpIHsKKyAgICAgICAgICAgIGlmICggZHJ2dGFiW25uXS0+bWF4X3ZvaWNlc19pbiA+IDAgKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIGRydnRhYltubl0tPm1heF92b2ljZXNfb3V0ID4gMCApCisgICAgICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIGNvdW50OworfQorCitjb25zdCBjaGFyKgorYXVkaW9fZ2V0X2JhY2tlbmRfbmFtZSggaW50ICAgaXNfaW5wdXQsIGludCAgaW5kZXgsIGNvbnN0IGNoYXIqICAqcGluZm8gKQoreworICAgIGludCAgbm47CisKKyAgICBpbmRleCArPSAxOworICAgIGZvciAobm4gPSAwOyBubiA8IHNpemVvZihkcnZ0YWIpL3NpemVvZihkcnZ0YWJbMF0pOyBubisrKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2lucHV0KSB7CisgICAgICAgICAgICBpZiAoIGRydnRhYltubl0tPm1heF92b2ljZXNfaW4gPiAwICkgeworICAgICAgICAgICAgICAgIGlmICggLS1pbmRleCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAqcGluZm8gPSBkcnZ0YWJbbm5dLT5kZXNjcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRydnRhYltubl0tPm5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkcnZ0YWJbbm5dLT5tYXhfdm9pY2VzX291dCA+IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAtLWluZGV4ID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICpwaW5mbyA9IGRydnRhYltubl0tPmRlc2NyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHJ2dGFiW25uXS0+bmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKnBpbmZvID0gTlVMTDsKKyAgICByZXR1cm4gIE5VTEw7Cit9CisKKworaW50CithdWRpb19jaGVja19iYWNrZW5kX25hbWUoIGludCAgaXNfaW5wdXQsIGNvbnN0IGNoYXIqICBuYW1lICkKK3sKKyAgICBpbnQgIG5uOworCisgICAgZm9yIChubiA9IDA7IG5uIDwgc2l6ZW9mKGRydnRhYikvc2l6ZW9mKGRydnRhYlswXSk7IG5uKyspCisgICAgeworICAgICAgICBpZiAoICFzdHJjbXAoZHJ2dGFiW25uXS0+bmFtZSwgbmFtZSkgKSB7CisgICAgICAgICAgICBpZiAoaXNfaW5wdXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZHJ2dGFiW25uXS0+bWF4X3ZvaWNlc19pbiA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZHJ2dGFiW25uXS0+bWF4X3ZvaWNlc19vdXQgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK3N0cnVjdCBmaXhlZF9zZXR0aW5ncyB7CisgICAgaW50IGVuYWJsZWQ7CisgICAgaW50IG5iX3ZvaWNlczsKKyAgICBpbnQgZ3JlZWR5OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBzZXR0aW5nczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIHN0cnVjdCBmaXhlZF9zZXR0aW5ncyBmaXhlZF9vdXQ7CisgICAgc3RydWN0IGZpeGVkX3NldHRpbmdzIGZpeGVkX2luOworICAgIHVuaW9uIHsKKyAgICAgICAgaW50IGhlcnR6OworICAgICAgICBpbnQ2NF90IHRpY2tzOworICAgIH0gcGVyaW9kOworICAgIGludCBwbGl2ZTsKKyAgICBpbnQgbG9nX3RvX21vbml0b3I7CisgICAgaW50IHRyeV9wb2xsX2luOworICAgIGludCB0cnlfcG9sbF9vdXQ7Cit9IGNvbmYgPSB7CisgICAgLmZpeGVkX291dCA9IHsgLyogREFDIGZpeGVkIHNldHRpbmdzICovCisgICAgICAgIC5lbmFibGVkID0gMSwKKyAgICAgICAgLm5iX3ZvaWNlcyA9IDEsCisgICAgICAgIC5ncmVlZHkgPSAxLAorICAgICAgICAuc2V0dGluZ3MgPSB7CisgICAgICAgICAgICAuZnJlcSA9IDQ0MTAwLAorICAgICAgICAgICAgLm5jaGFubmVscyA9IDIsCisgICAgICAgICAgICAuZm10ID0gQVVEX0ZNVF9TMTYsCisgICAgICAgICAgICAuZW5kaWFubmVzcyA9ICBBVURJT19IT1NUX0VORElBTk5FU1MsCisgICAgICAgIH0KKyAgICB9LAorCisgICAgLmZpeGVkX2luID0geyAvKiBBREMgZml4ZWQgc2V0dGluZ3MgKi8KKyAgICAgICAgLmVuYWJsZWQgPSAxLAorICAgICAgICAubmJfdm9pY2VzID0gMSwKKyAgICAgICAgLmdyZWVkeSA9IDEsCisgICAgICAgIC5zZXR0aW5ncyA9IHsKKyAgICAgICAgICAgIC5mcmVxID0gNDQxMDAsCisgICAgICAgICAgICAubmNoYW5uZWxzID0gMiwKKyAgICAgICAgICAgIC5mbXQgPSBBVURfRk1UX1MxNiwKKyAgICAgICAgICAgIC5lbmRpYW5uZXNzID0gQVVESU9fSE9TVF9FTkRJQU5ORVNTLAorICAgICAgICB9CisgICAgfSwKKworICAgIC5wZXJpb2QgPSB7IC5oZXJ0eiA9IDI1MCB9LAorICAgIC5wbGl2ZSA9IDAsCisgICAgLmxvZ190b19tb25pdG9yID0gMCwKKyAgICAudHJ5X3BvbGxfaW4gPSAxLAorICAgIC50cnlfcG9sbF9vdXQgPSAxLAorfTsKKworc3RhdGljIEF1ZGlvU3RhdGUgZ2xvYl9hdWRpb19zdGF0ZTsKKworc3RydWN0IG1peGVuZ192b2x1bWUgbm9taW5hbF92b2x1bWUgPSB7CisgICAgLm11dGUgPSAwLAorI2lmZGVmIEZMT0FUX01JWEVORworICAgIC5yID0gMS4wLAorICAgIC5sID0gMS4wLAorI2Vsc2UKKyAgICAuciA9IDFVTEwgPDwgMzIsCisgICAgLmwgPSAxVUxMIDw8IDMyLAorI2VuZGlmCit9OworCisjaWZkZWYgQVVESU9fSVNfRkxBV0xFU1NfQU5EX05PX0NIRUNLU19BUkVfUkVRVVJJRUQKKyNlcnJvciBObyBpdHMgbm90CisjZWxzZQorc3RhdGljIHZvaWQgYXVkaW9fcHJpbnRfb3B0aW9ucyAoY29uc3QgY2hhciAqcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX29wdGlvbiAqb3B0KTsKKworaW50IGF1ZGlvX2J1ZyAoY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBjb25kKQoreworICAgIGlmIChjb25kKSB7CisgICAgICAgIHN0YXRpYyBpbnQgc2hvd247CisKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgIkEgYnVnIHdhcyBqdXN0IHRyaWdnZXJlZCBpbiAlc1xuIiwgZnVuY25hbWUpOworICAgICAgICBpZiAoIXNob3duKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkOworCisgICAgICAgICAgICBzaG93biA9IDE7CisgICAgICAgICAgICBBVURfbG9nIChOVUxMLCAiU2F2ZSBhbGwgeW91ciB3b3JrIGFuZCByZXN0YXJ0IHdpdGhvdXQgYXVkaW9cbiIpOworICAgICAgICAgICAgQVVEX2xvZyAoTlVMTCwgIlBsZWFzZSBzZW5kIGJ1ZyByZXBvcnQgdG8gYXYxNDc0QGNvbXR2LnJ1XG4iKTsKKyAgICAgICAgICAgIEFVRF9sb2cgKE5VTEwsICJJIGFtIHNvcnJ5XG4iKTsKKyAgICAgICAgICAgIGQgPSBnbG9iX2F1ZGlvX3N0YXRlLmRydjsKKyAgICAgICAgICAgIGlmIChkKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fcHJpbnRfb3B0aW9ucyAoZC0+bmFtZSwgZC0+b3B0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgIkNvbnRleHQ6XG4iKTsKKworI2lmIGRlZmluZWQgQVVESU9fQlJFQUtQT0lOVF9PTl9CVUcKKyMgIGlmIGRlZmluZWQgX19pMzg2X18KKyMgICAgaWYgZGVmaW5lZCBfX0dOVUNfXworICAgICAgICBfX2FzbV9fICgiaW50MyIpOworIyAgICBlbGlmIGRlZmluZWQgX01TQ19WRVIKKyAgICAgICAgX2FzbSBfZW1pdCAweGNjOworIyAgICBlbHNlCisgICAgICAgIGFib3J0ICgpOworIyAgICBlbmRpZgorIyAgZWxzZQorICAgICAgICBhYm9ydCAoKTsKKyMgIGVuZGlmCisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gY29uZDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBhdWRpb19iaXRzX3RvX2luZGV4IChpbnQgYml0cykKK3sKKyAgICBzd2l0Y2ggKGJpdHMpIHsKKyAgICBjYXNlIDg6CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSAxNjoKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBjYXNlIDMyOgorICAgICAgICByZXR1cm4gMjsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF1ZGlvX2J1ZyAoImJpdHNfdG9faW5kZXgiLCAxKTsKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgImludmFsaWQgYml0cyAlZFxuIiwgYml0cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCAqYXVkaW9fY2FsbG9jIChjb25zdCBjaGFyICpmdW5jbmFtZSwgaW50IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgY29uZDsKKyAgICBzaXplX3QgbGVuOworCisgICAgbGVuID0gbm1lbWIgKiBzaXplOworICAgIGNvbmQgPSAhbm1lbWIgfHwgIXNpemU7CisgICAgY29uZCB8PSBubWVtYiA8IDA7CisgICAgY29uZCB8PSBsZW4gPCBzaXplOworCisgICAgaWYgKGF1ZGlvX2J1ZyAoImF1ZGlvX2NhbGxvYyIsIGNvbmQpKSB7CisgICAgICAgIEFVRF9sb2cgKE5VTEwsICIlcyBwYXNzZWQgaW52YWxpZCBhcmd1bWVudHMgdG8gYXVkaW9fY2FsbG9jXG4iLAorICAgICAgICAgICAgICAgICBmdW5jbmFtZSk7CisgICAgICAgIEFVRF9sb2cgKE5VTEwsICJubWVtYj0lZCBzaXplPSV6dSAobGVuPSV6dSlcbiIsIG5tZW1iLCBzaXplLCBsZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZ19tYWxsb2MwIChsZW4pOworfQorCitzdGF0aWMgY2hhciAqYXVkaW9fYWxsb2NfcHJlZml4IChjb25zdCBjaGFyICpzKQoreworICAgIGNvbnN0IGNoYXIgcWVtdV9wcmVmaXhbXSA9ICJRRU1VXyI7CisgICAgc2l6ZV90IGxlbiwgaTsKKyAgICBjaGFyICpyLCAqdTsKKworICAgIGlmICghcykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsZW4gPSBzdHJsZW4gKHMpOworICAgIHIgPSBnX21hbGxvYyAobGVuICsgc2l6ZW9mIChxZW11X3ByZWZpeCkpOworCisgICAgdSA9IHIgKyBzaXplb2YgKHFlbXVfcHJlZml4KSAtIDE7CisKKyAgICBwc3RyY3B5IChyLCBsZW4gKyBzaXplb2YgKHFlbXVfcHJlZml4KSwgcWVtdV9wcmVmaXgpOworICAgIHBzdHJjYXQgKHIsIGxlbiArIHNpemVvZiAocWVtdV9wcmVmaXgpLCBzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICB1W2ldID0gcWVtdV90b3VwcGVyKHVbaV0pOworICAgIH0KKworICAgIHJldHVybiByOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fYXVkZm10X3RvX3N0cmluZyAoYXVkZm10X2UgZm10KQoreworICAgIHN3aXRjaCAoZm10KSB7CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICByZXR1cm4gIlU4IjsKKworICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIHJldHVybiAiVTE2IjsKKworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICAgICAgcmV0dXJuICJTOCI7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgICAgICByZXR1cm4gIlMxNiI7CisKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICByZXR1cm4gIlUzMiI7CisKKyAgICBjYXNlIEFVRF9GTVRfUzMyOgorICAgICAgICByZXR1cm4gIlMzMiI7CisgICAgfQorCisgICAgZG9sb2cgKCJCb2d1cyBhdWRmbXQgJWQgcmV0dXJuaW5nIFMxNlxuIiwgZm10KTsKKyAgICByZXR1cm4gIlMxNiI7Cit9CisKK3N0YXRpYyBhdWRmbXRfZSBhdWRpb19zdHJpbmdfdG9fYXVkZm10IChjb25zdCBjaGFyICpzLCBhdWRmbXRfZSBkZWZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkZWZhdWx0cCkKK3sKKyAgICBpZiAoIXN0cmNhc2VjbXAgKHMsICJ1OCIpKSB7CisgICAgICAgICpkZWZhdWx0cCA9IDA7CisgICAgICAgIHJldHVybiBBVURfRk1UX1U4OworICAgIH0KKyAgICBlbHNlIGlmICghc3RyY2FzZWNtcCAocywgInUxNiIpKSB7CisgICAgICAgICpkZWZhdWx0cCA9IDA7CisgICAgICAgIHJldHVybiBBVURfRk1UX1UxNjsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAgKHMsICJ1MzIiKSkgeworICAgICAgICAqZGVmYXVsdHAgPSAwOworICAgICAgICByZXR1cm4gQVVEX0ZNVF9VMzI7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wIChzLCAiczgiKSkgeworICAgICAgICAqZGVmYXVsdHAgPSAwOworICAgICAgICByZXR1cm4gQVVEX0ZNVF9TODsKKyAgICB9CisgICAgZWxzZSBpZiAoIXN0cmNhc2VjbXAgKHMsICJzMTYiKSkgeworICAgICAgICAqZGVmYXVsdHAgPSAwOworICAgICAgICByZXR1cm4gQVVEX0ZNVF9TMTY7CisgICAgfQorICAgIGVsc2UgaWYgKCFzdHJjYXNlY21wIChzLCAiczMyIikpIHsKKyAgICAgICAgKmRlZmF1bHRwID0gMDsKKyAgICAgICAgcmV0dXJuIEFVRF9GTVRfUzMyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZG9sb2cgKCJCb2d1cyBhdWRpbyBmb3JtYXQgYCVzJyB1c2luZyAlc1xuIiwKKyAgICAgICAgICAgICAgIHMsIGF1ZGlvX2F1ZGZtdF90b19zdHJpbmcgKGRlZnZhbCkpOworICAgICAgICAqZGVmYXVsdHAgPSAxOworICAgICAgICByZXR1cm4gZGVmdmFsOworICAgIH0KK30KKworc3RhdGljIGF1ZGZtdF9lIGF1ZGlvX2dldF9jb25mX2ZtdCAoY29uc3QgY2hhciAqZW52bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGZtdF9lIGRlZnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGVmYXVsdHApCit7CisgICAgY29uc3QgY2hhciAqdmFyID0gZ2V0ZW52IChlbnZuYW1lKTsKKyAgICBpZiAoIXZhcikgeworICAgICAgICAqZGVmYXVsdHAgPSAxOworICAgICAgICByZXR1cm4gZGVmdmFsOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9fc3RyaW5nX3RvX2F1ZGZtdCAodmFyLCBkZWZ2YWwsIGRlZmF1bHRwKTsKK30KKworc3RhdGljIGludCBhdWRpb19nZXRfY29uZl9pbnQgKGNvbnN0IGNoYXIgKmtleSwgaW50IGRlZnZhbCwgaW50ICpkZWZhdWx0cCkKK3sKKyAgICBpbnQgdmFsOworICAgIGNoYXIgKnN0cnZhbDsKKworICAgIHN0cnZhbCA9IGdldGVudiAoa2V5KTsKKyAgICBpZiAoc3RydmFsKSB7CisgICAgICAgICpkZWZhdWx0cCA9IDA7CisgICAgICAgIHZhbCA9IGF0b2kgKHN0cnZhbCk7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqZGVmYXVsdHAgPSAxOworICAgICAgICByZXR1cm4gZGVmdmFsOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX2dldF9jb25mX3N0ciAoY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkZWZhdWx0cCkKK3sKKyAgICBjb25zdCBjaGFyICp2YWwgPSBnZXRlbnYgKGtleSk7CisgICAgaWYgKCF2YWwpIHsKKyAgICAgICAgKmRlZmF1bHRwID0gMTsKKyAgICAgICAgcmV0dXJuIGRlZnZhbDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpkZWZhdWx0cCA9IDA7CisgICAgICAgIHJldHVybiB2YWw7CisgICAgfQorfQorCisvKiBkZWZpbmVkIGluIGFuZHJvaWRfc2RsLmMgKi8KK2V4dGVybiB2b2lkICBkcHJpbnRuKGNvbnN0IGNoYXIqICBmbXQsIC4uLik7CitleHRlcm4gdm9pZCAgZHByaW50bnYoY29uc3QgY2hhciogIGZtdCwgdmFfbGlzdCAgYXJncyk7CisKK3ZvaWQgQVVEX3Zsb2cgKGNvbnN0IGNoYXIgKmNhcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworICAgIGlmIChjb25mLmxvZ190b19tb25pdG9yKSB7CisgICAgICAgIGlmIChjYXApIHsKKyAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKGN1cl9tb24sICIlczogIiwgY2FwKTsKKyAgICAgICAgfQorCisgICAgICAgIG1vbml0b3JfdnByaW50ZihjdXJfbW9uLCBmbXQsIGFwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghVkVSQk9TRV9DSEVDSyhhdWRpbykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKGNhcCkgeworICAgICAgICAgICAgZHByaW50bigiJXM6ICIsIGNhcCk7CisgICAgICAgIH0KKworICAgICAgICBkcHJpbnRudihmbXQsIGFwKTsKKyAgICB9Cit9CisKK3ZvaWQgQVVEX2xvZyAoY29uc3QgY2hhciAqY2FwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF92bG9nIChjYXAsIGZtdCwgYXApOworICAgIHZhX2VuZCAoYXApOworfQorCitzdGF0aWMgdm9pZCBhdWRpb19wcmludF9vcHRpb25zIChjb25zdCBjaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fb3B0aW9uICpvcHQpCit7CisgICAgY2hhciAqdXByZWZpeDsKKworICAgIGlmICghcHJlZml4KSB7CisgICAgICAgIGRvbG9nICgiTm8gcHJlZml4IHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW9wdCkgeworICAgICAgICBkb2xvZyAoIk5vIG9wdGlvbnNcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXByZWZpeCA9IGF1ZGlvX2FsbG9jX3ByZWZpeCAocHJlZml4KTsKKworICAgIGZvciAoOyBvcHQtPm5hbWU7IG9wdCsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXRlID0gImRlZmF1bHQiOworICAgICAgICBwcmludGYgKCIgICVzXyVzOiAiLCB1cHJlZml4LCBvcHQtPm5hbWUpOworCisgICAgICAgIGlmIChvcHQtPm92ZXJyaWRkZW5wICYmICpvcHQtPm92ZXJyaWRkZW5wKSB7CisgICAgICAgICAgICBzdGF0ZSA9ICJjdXJyZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAob3B0LT50YWcpIHsKKyAgICAgICAgY2FzZSBBVURfT1BUX0JPT0w6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50ICppbnRwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgIHByaW50ZiAoImJvb2xlYW4sICVzID0gJWRcbiIsIHN0YXRlLCAqaW50cCA/IDEgOiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVEX09QVF9JTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50ICppbnRwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgIHByaW50ZiAoImludGVnZXIsICVzID0gJWRcbiIsIHN0YXRlLCAqaW50cCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRF9PUFRfRk1UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF1ZGZtdF9lICpmbXRwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgIHByaW50ZiAoCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQsICVzID0gJXMsIChvbmUgb2Y6IFU4IFM4IFUxNiBTMTYgVTMyIFMzMilcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19hdWRmbXRfdG9fc3RyaW5nICgqZm10cCkKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVEX09QVF9TVFI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnN0cnAgPSBvcHQtPnZhbHA7CisgICAgICAgICAgICAgICAgcHJpbnRmICgic3RyaW5nLCAlcyA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAqc3RycCA/ICpzdHJwIDogIihub3Qgc2V0KSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZiAoIj8/P1xuIik7CisgICAgICAgICAgICBkb2xvZyAoIkJhZCB2YWx1ZSB0YWcgZm9yIG9wdGlvbiAlc18lcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB1cHJlZml4LCBvcHQtPm5hbWUsIG9wdC0+dGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIiAgICAlc1xuIiwgb3B0LT5kZXNjcik7CisgICAgfQorCisgICAgZ19mcmVlICh1cHJlZml4KTsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fcHJvY2Vzc19vcHRpb25zIChjb25zdCBjaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19vcHRpb24gKm9wdCkKK3sKKyAgICBjaGFyICpvcHRuYW1lOworICAgIGNvbnN0IGNoYXIgcWVtdV9wcmVmaXhbXSA9ICJRRU1VXyI7CisgICAgc2l6ZV90IHByZWZsZW4sIG9wdGxlbjsKKworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsICFwcmVmaXgpKSB7CisgICAgICAgIGRvbG9nICgicHJlZml4ID0gTlVMTFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCAhb3B0KSkgeworICAgICAgICBkb2xvZyAoIm9wdCA9IE5VTExcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJlZmxlbiA9IHN0cmxlbiAocHJlZml4KTsKKworICAgIGZvciAoOyBvcHQtPm5hbWU7IG9wdCsrKSB7CisgICAgICAgIHNpemVfdCBsZW4sIGk7CisgICAgICAgIGludCBkZWY7CisKKyAgICAgICAgaWYgKCFvcHQtPnZhbHApIHsKKyAgICAgICAgICAgIGRvbG9nICgiT3B0aW9uIHZhbHVlIHBvaW50ZXIgZm9yIGAlcycgaXMgbm90IHNldFxuIiwKKyAgICAgICAgICAgICAgICAgICBvcHQtPm5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBzdHJsZW4gKG9wdC0+bmFtZSk7CisgICAgICAgIC8qIGxlbiBvZiBvcHQtPm5hbWUgKyBsZW4gb2YgcHJlZml4ICsgc2l6ZSBvZiBxZW11X3ByZWZpeAorICAgICAgICAgKiAoaW5jbHVkZXMgdHJhaWxpbmcgemVybykgKyB6ZXJvICsgdW5kZXJzY29yZSAob24gYmVoYWxmIG9mCisgICAgICAgICAqIHNpemVvZikgKi8KKyAgICAgICAgb3B0bGVuID0gbGVuICsgcHJlZmxlbiArIHNpemVvZiAocWVtdV9wcmVmaXgpICsgMTsKKyAgICAgICAgb3B0bmFtZSA9IGdfbWFsbG9jIChvcHRsZW4pOworCisgICAgICAgIHBzdHJjcHkgKG9wdG5hbWUsIG9wdGxlbiwgcWVtdV9wcmVmaXgpOworCisgICAgICAgIC8qIGNvcHkgd2hpbGUgdXBwZXItY2FzaW5nLCBpbmNsdWRpbmcgdHJhaWxpbmcgemVybyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHByZWZsZW47ICsraSkgeworICAgICAgICAgICAgb3B0bmFtZVtpICsgc2l6ZW9mIChxZW11X3ByZWZpeCkgLSAxXSA9IHFlbXVfdG91cHBlcihwcmVmaXhbaV0pOworICAgICAgICB9CisgICAgICAgIHBzdHJjYXQgKG9wdG5hbWUsIG9wdGxlbiwgIl8iKTsKKyAgICAgICAgcHN0cmNhdCAob3B0bmFtZSwgb3B0bGVuLCBvcHQtPm5hbWUpOworCisgICAgICAgIGRlZiA9IDE7CisgICAgICAgIHN3aXRjaCAob3B0LT50YWcpIHsKKyAgICAgICAgY2FzZSBBVURfT1BUX0JPT0w6CisgICAgICAgIGNhc2UgQVVEX09QVF9JTlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50ICppbnRwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgICppbnRwID0gYXVkaW9fZ2V0X2NvbmZfaW50IChvcHRuYW1lLCAqaW50cCwgJmRlZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRF9PUFRfRk1UOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF1ZGZtdF9lICpmbXRwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgICpmbXRwID0gYXVkaW9fZ2V0X2NvbmZfZm10IChvcHRuYW1lLCAqZm10cCwgJmRlZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRF9PUFRfU1RSOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzdHJwID0gb3B0LT52YWxwOworICAgICAgICAgICAgICAgICpzdHJwID0gYXVkaW9fZ2V0X2NvbmZfc3RyIChvcHRuYW1lLCAqc3RycCwgJmRlZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZG9sb2cgKCJCYWQgdmFsdWUgdGFnIGZvciBvcHRpb24gYCVzJyAtICVkXG4iLAorICAgICAgICAgICAgICAgICAgIG9wdG5hbWUsIG9wdC0+dGFnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFvcHQtPm92ZXJyaWRkZW5wKSB7CisgICAgICAgICAgICBvcHQtPm92ZXJyaWRkZW5wID0gJm9wdC0+b3ZlcnJpZGRlbjsKKyAgICAgICAgfQorICAgICAgICAqb3B0LT5vdmVycmlkZGVucCA9ICFkZWY7CisgICAgICAgIGdfZnJlZSAob3B0bmFtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhdWRpb19wcmludF9zZXR0aW5ncyAoc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBkb2xvZyAoImZyZXF1ZW5jeT0lZCBuY2hhbm5lbHM9JWQgZm10PSIsIGFzLT5mcmVxLCBhcy0+bmNoYW5uZWxzKTsKKworICAgIHN3aXRjaCAoYXMtPmZtdCkgeworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgIlM4Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVEX0ZNVF9VODoKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgIlU4Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVEX0ZNVF9TMTY6CisgICAgICAgIEFVRF9sb2cgKE5VTEwsICJTMTYiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURfRk1UX1UxNjoKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgIlUxNiIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRF9GTVRfUzMyOgorICAgICAgICBBVURfbG9nIChOVUxMLCAiUzMyIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVEX0ZNVF9VMzI6CisgICAgICAgIEFVRF9sb2cgKE5VTEwsICJVMzIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgImludmFsaWQoJWQpIiwgYXMtPmZtdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFVRF9sb2cgKE5VTEwsICIgZW5kaWFubmVzcz0iKTsKKyAgICBzd2l0Y2ggKGFzLT5lbmRpYW5uZXNzKSB7CisgICAgY2FzZSAwOgorICAgICAgICBBVURfbG9nIChOVUxMLCAibGl0dGxlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgQVVEX2xvZyAoTlVMTCwgImJpZyIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBVURfbG9nIChOVUxMLCAiaW52YWxpZCIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQVVEX2xvZyAoTlVMTCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fdmFsaWRhdGVfc2V0dGluZ3MgKHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgaW50IGludmFsaWQ7CisKKyAgICBpbnZhbGlkID0gYXMtPm5jaGFubmVscyAhPSAxICYmIGFzLT5uY2hhbm5lbHMgIT0gMjsKKyAgICBpbnZhbGlkIHw9IGFzLT5lbmRpYW5uZXNzICE9IDAgJiYgYXMtPmVuZGlhbm5lc3MgIT0gMTsKKworICAgIHN3aXRjaCAoYXMtPmZtdCkgeworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICBjYXNlIEFVRF9GTVRfVTg6CisgICAgY2FzZSBBVURfRk1UX1MxNjoKKyAgICBjYXNlIEFVRF9GTVRfVTE2OgorICAgIGNhc2UgQVVEX0ZNVF9TMzI6CisgICAgY2FzZSBBVURfRk1UX1UzMjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW52YWxpZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGludmFsaWQgfD0gYXMtPmZyZXEgPD0gMDsKKyAgICByZXR1cm4gaW52YWxpZCA/IC0xIDogMDsKK30KKworc3RhdGljIGludCBhdWRpb19wY21faW5mb19lcSAoc3RydWN0IGF1ZGlvX3BjbV9pbmZvICppbmZvLCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIGludCBiaXRzID0gOCwgc2lnbiA9IDA7CisKKyAgICBzd2l0Y2ggKGFzLT5mbXQpIHsKKyAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgICAgIHNpZ24gPSAxOworICAgIGNhc2UgQVVEX0ZNVF9VODoKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgICAgICBzaWduID0gMTsKKyAgICBjYXNlIEFVRF9GTVRfVTE2OgorICAgICAgICBiaXRzID0gMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICAgICAgc2lnbiA9IDE7CisgICAgY2FzZSBBVURfRk1UX1UzMjoKKyAgICAgICAgYml0cyA9IDMyOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGluZm8tPmZyZXEgPT0gYXMtPmZyZXEKKyAgICAgICAgJiYgaW5mby0+bmNoYW5uZWxzID09IGFzLT5uY2hhbm5lbHMKKyAgICAgICAgJiYgaW5mby0+c2lnbiA9PSBzaWduCisgICAgICAgICYmIGluZm8tPmJpdHMgPT0gYml0cworICAgICAgICAmJiBpbmZvLT5zd2FwX2VuZGlhbm5lc3MgPT0gKGFzLT5lbmRpYW5uZXNzICE9IEFVRElPX0hPU1RfRU5ESUFOTkVTUyk7Cit9CisKK3ZvaWQgYXVkaW9fcGNtX2luaXRfaW5mbyAoc3RydWN0IGF1ZGlvX3BjbV9pbmZvICppbmZvLCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIGludCBiaXRzID0gOCwgc2lnbiA9IDAsIHNoaWZ0ID0gMDsKKworICAgIHN3aXRjaCAoYXMtPmZtdCkgeworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICAgICAgc2lnbiA9IDE7CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVEX0ZNVF9TMTY6CisgICAgICAgIHNpZ24gPSAxOworICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIGJpdHMgPSAxNjsKKyAgICAgICAgc2hpZnQgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVEX0ZNVF9TMzI6CisgICAgICAgIHNpZ24gPSAxOworICAgIGNhc2UgQVVEX0ZNVF9VMzI6CisgICAgICAgIGJpdHMgPSAzMjsKKyAgICAgICAgc2hpZnQgPSAyOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpbmZvLT5mcmVxID0gYXMtPmZyZXE7CisgICAgaW5mby0+Yml0cyA9IGJpdHM7CisgICAgaW5mby0+c2lnbiA9IHNpZ247CisgICAgaW5mby0+bmNoYW5uZWxzID0gYXMtPm5jaGFubmVsczsKKyAgICBpbmZvLT5zaGlmdCA9IChhcy0+bmNoYW5uZWxzID09IDIpICsgc2hpZnQ7CisgICAgaW5mby0+YWxpZ24gPSAoMSA8PCBpbmZvLT5zaGlmdCkgLSAxOworICAgIGluZm8tPmJ5dGVzX3Blcl9zZWNvbmQgPSBpbmZvLT5mcmVxIDw8IGluZm8tPnNoaWZ0OworICAgIGluZm8tPnN3YXBfZW5kaWFubmVzcyA9IChhcy0+ZW5kaWFubmVzcyAhPSBBVURJT19IT1NUX0VORElBTk5FU1MpOworfQorCit2b2lkIGF1ZGlvX3BjbV9pbmZvX2NsZWFyX2J1ZiAoc3RydWN0IGF1ZGlvX3BjbV9pbmZvICppbmZvLCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChpbmZvLT5zaWduKSB7CisgICAgICAgIG1lbXNldCAoYnVmLCAweDAwLCBsZW4gPDwgaW5mby0+c2hpZnQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChpbmZvLT5iaXRzKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1lbXNldCAoYnVmLCAweDgwLCBsZW4gPDwgaW5mby0+c2hpZnQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqcCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBpbnQgc2hpZnQgPSBpbmZvLT5uY2hhbm5lbHMgLSAxOworICAgICAgICAgICAgICAgIHNob3J0IHMgPSBJTlQxNl9NQVg7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+c3dhcF9lbmRpYW5uZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBic3dhcDE2IChzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIDw8IHNoaWZ0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcFtpXSA9IHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqcCA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBpbnQgc2hpZnQgPSBpbmZvLT5uY2hhbm5lbHMgLSAxOworICAgICAgICAgICAgICAgIGludDMyX3QgcyA9IElOVDMyX01BWDsKKworICAgICAgICAgICAgICAgIGlmIChpbmZvLT5zd2FwX2VuZGlhbm5lc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGJzd2FwMzIgKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gPDwgc2hpZnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwW2ldID0gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVVEX2xvZyAoTlVMTCwgImF1ZGlvX3BjbV9pbmZvX2NsZWFyX2J1ZjogaW52YWxpZCBiaXRzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5mby0+Yml0cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIENhcHR1cmUKKyAqLworc3RhdGljIHZvaWQgbm9vcF9jb252IChzdHJ1Y3Qgc3Rfc2FtcGxlICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXMsIHN0cnVjdCBtaXhlbmdfdm9sdW1lICp2b2wpCit7CisgICAgKHZvaWQpIHNyYzsKKyAgICAodm9pZCkgZHN0OworICAgICh2b2lkKSBzYW1wbGVzOworICAgICh2b2lkKSB2b2w7Cit9CisKK3N0YXRpYyBDYXB0dXJlVm9pY2VPdXQgKmF1ZGlvX3BjbV9jYXB0dXJlX2ZpbmRfc3BlY2lmaWMgKAorICAgIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMKKyAgICApCit7CisgICAgQ2FwdHVyZVZvaWNlT3V0ICpjYXA7CisgICAgQXVkaW9TdGF0ZSAqcyA9ICZnbG9iX2F1ZGlvX3N0YXRlOworCisgICAgZm9yIChjYXAgPSBzLT5jYXBfaGVhZC5saF9maXJzdDsgY2FwOyBjYXAgPSBjYXAtPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICBpZiAoYXVkaW9fcGNtX2luZm9fZXEgKCZjYXAtPmh3LmluZm8sIGFzKSkgeworICAgICAgICAgICAgcmV0dXJuIGNhcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fbm90aWZ5X2NhcHR1cmUgKENhcHR1cmVWb2ljZU91dCAqY2FwLCBhdWRjbm90aWZpY2F0aW9uX2UgY21kKQoreworICAgIHN0cnVjdCBjYXB0dXJlX2NhbGxiYWNrICpjYjsKKworI2lmZGVmIERFQlVHX0NBUFRVUkUKKyAgICBkb2xvZyAoIm5vdGlmaWNhdGlvbiAlZCBzZW50XG4iLCBjbWQpOworI2VuZGlmCisgICAgZm9yIChjYiA9IGNhcC0+Y2JfaGVhZC5saF9maXJzdDsgY2I7IGNiID0gY2ItPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICBjYi0+b3BzLm5vdGlmeSAoY2ItPm9wYXF1ZSwgY21kKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2NhcHR1cmVfbWF5YmVfY2hhbmdlZCAoQ2FwdHVyZVZvaWNlT3V0ICpjYXAsIGludCBlbmFibGVkKQoreworICAgIGlmIChjYXAtPmh3LmVuYWJsZWQgIT0gZW5hYmxlZCkgeworICAgICAgICBhdWRjbm90aWZpY2F0aW9uX2UgY21kOworICAgICAgICBjYXAtPmh3LmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICBjbWQgPSBlbmFibGVkID8gQVVEX0NOT1RJRllfRU5BQkxFIDogQVVEX0NOT1RJRllfRElTQUJMRTsKKyAgICAgICAgYXVkaW9fbm90aWZ5X2NhcHR1cmUgKGNhcCwgY21kKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3JlY2FsY19hbmRfbm90aWZ5X2NhcHR1cmUgKENhcHR1cmVWb2ljZU91dCAqY2FwKQoreworICAgIEhXVm9pY2VPdXQgKmh3ID0gJmNhcC0+aHc7CisgICAgU1dWb2ljZU91dCAqc3c7CisgICAgaW50IGVuYWJsZWQgPSAwOworCisgICAgZm9yIChzdyA9IGh3LT5zd19oZWFkLmxoX2ZpcnN0OyBzdzsgc3cgPSBzdy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgIGlmIChzdy0+YWN0aXZlKSB7CisgICAgICAgICAgICBlbmFibGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGF1ZGlvX2NhcHR1cmVfbWF5YmVfY2hhbmdlZCAoY2FwLCBlbmFibGVkKTsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fZGV0YWNoX2NhcHR1cmUgKEhXVm9pY2VPdXQgKmh3KQoreworICAgIFNXVm9pY2VDYXAgKnNjID0gaHctPmNhcF9oZWFkLmxoX2ZpcnN0OworCisgICAgd2hpbGUgKHNjKSB7CisgICAgICAgIFNXVm9pY2VDYXAgKnNjMSA9IHNjLT5lbnRyaWVzLmxlX25leHQ7CisgICAgICAgIFNXVm9pY2VPdXQgKnN3ID0gJnNjLT5zdzsKKyAgICAgICAgQ2FwdHVyZVZvaWNlT3V0ICpjYXAgPSBzYy0+Y2FwOworICAgICAgICBpbnQgd2FzX2FjdGl2ZSA9IHN3LT5hY3RpdmU7CisKKyAgICAgICAgaWYgKHN3LT5yYXRlKSB7CisgICAgICAgICAgICBzdF9yYXRlX3N0b3AgKHN3LT5yYXRlKTsKKyAgICAgICAgICAgIHN3LT5yYXRlID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIFFMSVNUX1JFTU9WRSAoc3csIGVudHJpZXMpOworICAgICAgICBRTElTVF9SRU1PVkUgKHNjLCBlbnRyaWVzKTsKKyAgICAgICAgZ19mcmVlIChzYyk7CisgICAgICAgIGlmICh3YXNfYWN0aXZlKSB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIHJlbW92ZWQgc29mdCB2b2ljZSBmcm9tIHRoZSBjYXB0dXJlOgorICAgICAgICAgICAgICAgdGhpcyBtaWdodCBoYXZlIGNoYW5nZWQgdGhlIG92ZXJhbGwgc3RhdHVzIG9mIHRoZSBjYXB0dXJlCisgICAgICAgICAgICAgICBzaW5jZSB0aGlzIG1pZ2h0IGhhdmUgYmVlbiB0aGUgb25seSBhY3RpdmUgdm9pY2UgKi8KKyAgICAgICAgICAgIGF1ZGlvX3JlY2FsY19hbmRfbm90aWZ5X2NhcHR1cmUgKGNhcCk7CisgICAgICAgIH0KKyAgICAgICAgc2MgPSBzYzE7CisgICAgfQorfQorCitzdGF0aWMgaW50IGF1ZGlvX2F0dGFjaF9jYXB0dXJlIChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICBBdWRpb1N0YXRlICpzID0gJmdsb2JfYXVkaW9fc3RhdGU7CisgICAgQ2FwdHVyZVZvaWNlT3V0ICpjYXA7CisKKyAgICBhdWRpb19kZXRhY2hfY2FwdHVyZSAoaHcpOworICAgIGZvciAoY2FwID0gcy0+Y2FwX2hlYWQubGhfZmlyc3Q7IGNhcDsgY2FwID0gY2FwLT5lbnRyaWVzLmxlX25leHQpIHsKKyAgICAgICAgU1dWb2ljZUNhcCAqc2M7CisgICAgICAgIFNXVm9pY2VPdXQgKnN3OworICAgICAgICBIV1ZvaWNlT3V0ICpod19jYXAgPSAmY2FwLT5odzsKKworICAgICAgICBzYyA9IGF1ZGlvX2NhbGxvYyAoQVVESU9fRlVOQywgMSwgc2l6ZW9mICgqc2MpKTsKKyAgICAgICAgaWYgKCFzYykgeworICAgICAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgc29mdCBjYXB0dXJlIHZvaWNlICglenUgYnl0ZXMpXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemVvZiAoKnNjKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzYy0+Y2FwID0gY2FwOworICAgICAgICBzdyA9ICZzYy0+c3c7CisgICAgICAgIHN3LT5odyA9IGh3X2NhcDsKKyAgICAgICAgc3ctPmluZm8gPSBody0+aW5mbzsKKyAgICAgICAgc3ctPmVtcHR5ID0gMTsKKyAgICAgICAgc3ctPmFjdGl2ZSA9IGh3LT5lbmFibGVkOworICAgICAgICBzdy0+Y29udiA9IG5vb3BfY29udjsKKyAgICAgICAgc3ctPnJhdGlvID0gKChpbnQ2NF90KSBod19jYXAtPmluZm8uZnJlcSA8PCAzMikgLyBzdy0+aW5mby5mcmVxOworICAgICAgICBzdy0+cmF0ZSA9IHN0X3JhdGVfc3RhcnQgKHN3LT5pbmZvLmZyZXEsIGh3X2NhcC0+aW5mby5mcmVxKTsKKyAgICAgICAgaWYgKCFzdy0+cmF0ZSkgeworICAgICAgICAgICAgZG9sb2cgKCJDb3VsZCBub3Qgc3RhcnQgcmF0ZSBjb252ZXJzaW9uIGZvciBgJXMnXG4iLCBTV19OQU1FIChzdykpOworICAgICAgICAgICAgZ19mcmVlIChzdyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQgKCZod19jYXAtPnN3X2hlYWQsIHN3LCBlbnRyaWVzKTsKKyAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQgKCZody0+Y2FwX2hlYWQsIHNjLCBlbnRyaWVzKTsKKyNpZmRlZiBERUJVR19DQVBUVVJFCisgICAgICAgIGFzcHJpbnRmICgmc3ctPm5hbWUsICJmb3IgJXAgJWQsJWQsJWQiLAorICAgICAgICAgICAgICAgICAgaHcsIHN3LT5pbmZvLmZyZXEsIHN3LT5pbmZvLmJpdHMsIHN3LT5pbmZvLm5jaGFubmVscyk7CisgICAgICAgIGRvbG9nICgiQWRkZWQgJXMgYWN0aXZlID0gJWRcbiIsIHN3LT5uYW1lLCBzdy0+YWN0aXZlKTsKKyNlbmRpZgorICAgICAgICBpZiAoc3ctPmFjdGl2ZSkgeworICAgICAgICAgICAgYXVkaW9fY2FwdHVyZV9tYXliZV9jaGFuZ2VkIChjYXAsIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogSGFyZCB2b2ljZSAoY2FwdHVyZSkKKyAqLworc3RhdGljIGludCBhdWRpb19wY21faHdfZmluZF9taW5faW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgU1dWb2ljZUluICpzdzsKKyAgICBpbnQgbSA9IGh3LT50b3RhbF9zYW1wbGVzX2NhcHR1cmVkOworCisgICAgZm9yIChzdyA9IGh3LT5zd19oZWFkLmxoX2ZpcnN0OyBzdzsgc3cgPSBzdy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgIGlmIChzdy0+YWN0aXZlKSB7CisgICAgICAgICAgICBtID0gYXVkaW9fTUlOIChtLCBzdy0+dG90YWxfaHdfc2FtcGxlc19hY3F1aXJlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG07Cit9CisKK2ludCBhdWRpb19wY21faHdfZ2V0X2xpdmVfaW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgaW50IGxpdmUgPSBody0+dG90YWxfc2FtcGxlc19jYXB0dXJlZCAtIGF1ZGlvX3BjbV9od19maW5kX21pbl9pbiAoaHcpOworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIGxpdmUgPCAwIHx8IGxpdmUgPiBody0+c2FtcGxlcykpIHsKKyAgICAgICAgZG9sb2cgKCJsaXZlPSVkIGh3LT5zYW1wbGVzPSVkXG4iLCBsaXZlLCBody0+c2FtcGxlcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbGl2ZTsKK30KKworaW50IGF1ZGlvX3BjbV9od19jbGlwX291dCAoSFdWb2ljZU91dCAqaHcsIHZvaWQgKnBjbV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGl2ZSwgaW50IHBlbmRpbmcpCit7CisgICAgaW50IGxlZnQgPSBody0+c2FtcGxlcyAtIHBlbmRpbmc7CisgICAgaW50IGxlbiA9IGF1ZGlvX01JTiAobGVmdCwgbGl2ZSk7CisgICAgaW50IGNsaXBwZWQgPSAwOworCisgICAgd2hpbGUgKGxlbikgeworICAgICAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICpzcmMgPSBody0+bWl4X2J1ZiArIGh3LT5ycG9zOworICAgICAgICB1aW50OF90ICpkc3QgPSBhZHZhbmNlIChwY21fYnVmLCBody0+cnBvcyA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGludCBzYW1wbGVzX3RpbGxfZW5kX29mX2J1ZiA9IGh3LT5zYW1wbGVzIC0gaHctPnJwb3M7CisgICAgICAgIGludCBzYW1wbGVzX3RvX2NsaXAgPSBhdWRpb19NSU4gKGxlbiwgc2FtcGxlc190aWxsX2VuZF9vZl9idWYpOworCisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYywgc2FtcGxlc190b19jbGlwKTsKKworICAgICAgICBody0+cnBvcyA9IChody0+cnBvcyArIHNhbXBsZXNfdG9fY2xpcCkgJSBody0+c2FtcGxlczsKKyAgICAgICAgbGVuIC09IHNhbXBsZXNfdG9fY2xpcDsKKyAgICAgICAgY2xpcHBlZCArPSBzYW1wbGVzX3RvX2NsaXA7CisgICAgfQorICAgIHJldHVybiBjbGlwcGVkOworfQorCisvKgorICogU29mdCB2b2ljZSAoY2FwdHVyZSkKKyAqLworc3RhdGljIGludCBhdWRpb19wY21fc3dfZ2V0X3Jwb3NfaW4gKFNXVm9pY2VJbiAqc3cpCit7CisgICAgSFdWb2ljZUluICpodyA9IHN3LT5odzsKKyAgICBpbnQgbGl2ZSA9IGh3LT50b3RhbF9zYW1wbGVzX2NhcHR1cmVkIC0gc3ctPnRvdGFsX2h3X3NhbXBsZXNfYWNxdWlyZWQ7CisgICAgaW50IHJwb3M7CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCBsaXZlIDwgMCB8fCBsaXZlID4gaHctPnNhbXBsZXMpKSB7CisgICAgICAgIGRvbG9nICgibGl2ZT0lZCBody0+c2FtcGxlcz0lZFxuIiwgbGl2ZSwgaHctPnNhbXBsZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBycG9zID0gaHctPndwb3MgLSBsaXZlOworICAgIGlmIChycG9zID49IDApIHsKKyAgICAgICAgcmV0dXJuIHJwb3M7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gaHctPnNhbXBsZXMgKyBycG9zOworICAgIH0KK30KKworaW50IGF1ZGlvX3BjbV9zd19yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBzaXplKQoreworICAgIEhXVm9pY2VJbiAqaHcgPSBzdy0+aHc7CisgICAgaW50IHNhbXBsZXMsIGxpdmUsIHJldCA9IDAsIHN3bGltLCBpc2FtcCwgb3NhbXAsIHJwb3MsIHRvdGFsID0gMDsKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICpzcmMsICpkc3QgPSBzdy0+YnVmOworCisgICAgcnBvcyA9IGF1ZGlvX3BjbV9zd19nZXRfcnBvc19pbiAoc3cpICUgaHctPnNhbXBsZXM7CisKKyAgICBsaXZlID0gaHctPnRvdGFsX3NhbXBsZXNfY2FwdHVyZWQgLSBzdy0+dG90YWxfaHdfc2FtcGxlc19hY3F1aXJlZDsKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCBsaXZlIDwgMCB8fCBsaXZlID4gaHctPnNhbXBsZXMpKSB7CisgICAgICAgIGRvbG9nICgibGl2ZV9pbj0lZCBody0+c2FtcGxlcz0lZFxuIiwgbGl2ZSwgaHctPnNhbXBsZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzYW1wbGVzID0gc2l6ZSA+PiBzdy0+aW5mby5zaGlmdDsKKyAgICBpZiAoIWxpdmUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dsaW0gPSAobGl2ZSAqIHN3LT5yYXRpbykgPj4gMzI7CisgICAgc3dsaW0gPSBhdWRpb19NSU4gKHN3bGltLCBzYW1wbGVzKTsKKworICAgIHdoaWxlIChzd2xpbSkgeworICAgICAgICBzcmMgPSBody0+Y29udl9idWYgKyBycG9zOworICAgICAgICBpc2FtcCA9IGh3LT53cG9zIC0gcnBvczsKKyAgICAgICAgLyogWFhYOiA8PSA/ICovCisgICAgICAgIGlmIChpc2FtcCA8PSAwKSB7CisgICAgICAgICAgICBpc2FtcCA9IGh3LT5zYW1wbGVzIC0gcnBvczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNhbXApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG9zYW1wID0gc3dsaW07CisKKyAgICAgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgb3NhbXAgPCAwKSkgeworICAgICAgICAgICAgZG9sb2cgKCJvc2FtcD0lZFxuIiwgb3NhbXApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBzdF9yYXRlX2Zsb3cgKHN3LT5yYXRlLCBzcmMsIGRzdCwgJmlzYW1wLCAmb3NhbXApOworICAgICAgICBzd2xpbSAtPSBvc2FtcDsKKyAgICAgICAgcnBvcyA9IChycG9zICsgaXNhbXApICUgaHctPnNhbXBsZXM7CisgICAgICAgIGRzdCArPSBvc2FtcDsKKyAgICAgICAgcmV0ICs9IG9zYW1wOworICAgICAgICB0b3RhbCArPSBpc2FtcDsKKyAgICB9CisKKyAgICBzdy0+Y2xpcCAoYnVmLCBzdy0+YnVmLCByZXQpOworICAgIHN3LT50b3RhbF9od19zYW1wbGVzX2FjcXVpcmVkICs9IHRvdGFsOworICAgIHJldHVybiByZXQgPDwgc3ctPmluZm8uc2hpZnQ7Cit9CisKKy8qCisgKiBIYXJkIHZvaWNlIChwbGF5YmFjaykKKyAqLworc3RhdGljIGludCBhdWRpb19wY21faHdfZmluZF9taW5fb3V0IChIV1ZvaWNlT3V0ICpodywgaW50ICpuYl9saXZlcCkKK3sKKyAgICBTV1ZvaWNlT3V0ICpzdzsKKyAgICBpbnQgbSA9IElOVF9NQVg7CisgICAgaW50IG5iX2xpdmUgPSAwOworCisgICAgZm9yIChzdyA9IGh3LT5zd19oZWFkLmxoX2ZpcnN0OyBzdzsgc3cgPSBzdy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgIGlmIChzdy0+YWN0aXZlICYmICFzdy0+ZW1wdHkpIHsKKyAgICAgICAgICAgIG0gPSBhdWRpb19NSU4gKG0sIHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkKTsKKyAgICAgICAgICAgIG5iX2xpdmUgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpuYl9saXZlcCA9IG5iX2xpdmU7CisgICAgcmV0dXJuIG07Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fcGNtX2h3X2dldF9saXZlX291dCAoSFdWb2ljZU91dCAqaHcsIGludCAqbmJfbGl2ZSkKK3sKKyAgICBpbnQgc21pbjsKKyAgICBpbnQgbmJfbGl2ZTE7CisKKyAgICBzbWluID0gYXVkaW9fcGNtX2h3X2ZpbmRfbWluX291dCAoaHcsICZuYl9saXZlMSk7CisgICAgaWYgKG5iX2xpdmUpIHsKKyAgICAgICAgKm5iX2xpdmUgPSBuYl9saXZlMTsKKyAgICB9CisKKyAgICBpZiAobmJfbGl2ZTEpIHsKKyAgICAgICAgaW50IGxpdmUgPSBzbWluOworCisgICAgICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIGxpdmUgPCAwIHx8IGxpdmUgPiBody0+c2FtcGxlcykpIHsKKyAgICAgICAgICAgIGRvbG9nICgibGl2ZT0lZCBody0+c2FtcGxlcz0lZFxuIiwgbGl2ZSwgaHctPnNhbXBsZXMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpdmU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogU29mdCB2b2ljZSAocGxheWJhY2spCisgKi8KK2ludCBhdWRpb19wY21fc3dfd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpidWYsIGludCBzaXplKQoreworICAgIGludCBod3NhbXBsZXMsIHNhbXBsZXMsIGlzYW1wLCBvc2FtcCwgd3BvcywgbGl2ZSwgZGVhZCwgbGVmdCwgc3dsaW0sIGJsY2s7CisgICAgaW50IHJldCA9IDAsIHBvcyA9IDAsIHRvdGFsID0gMDsKKworICAgIGlmICghc3cpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgaHdzYW1wbGVzID0gc3ctPmh3LT5zYW1wbGVzOworCisgICAgbGl2ZSA9IHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkOworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIGxpdmUgPCAwIHx8IGxpdmUgPiBod3NhbXBsZXMpKXsKKyAgICAgICAgZG9sb2cgKCJsaXZlPSVkIGh3LT5zYW1wbGVzPSVkXG4iLCBsaXZlLCBod3NhbXBsZXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAobGl2ZSA9PSBod3NhbXBsZXMpIHsKKyNpZmRlZiBERUJVR19PVVQKKyAgICAgICAgZG9sb2cgKCIlcyBpcyBmdWxsICVkXG4iLCBzdy0+bmFtZSwgbGl2ZSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3BvcyA9IChzdy0+aHctPnJwb3MgKyBsaXZlKSAlIGh3c2FtcGxlczsKKyAgICBzYW1wbGVzID0gc2l6ZSA+PiBzdy0+aW5mby5zaGlmdDsKKworICAgIGRlYWQgPSBod3NhbXBsZXMgLSBsaXZlOworICAgIHN3bGltID0gKChpbnQ2NF90KSBkZWFkIDw8IDMyKSAvIHN3LT5yYXRpbzsKKyAgICBzd2xpbSA9IGF1ZGlvX01JTiAoc3dsaW0sIHNhbXBsZXMpOworICAgIGlmIChzd2xpbSkgeworICAgICAgICBzdy0+Y29udiAoc3ctPmJ1ZiwgYnVmLCBzd2xpbSwgJnN3LT52b2wpOworICAgIH0KKworICAgIHdoaWxlIChzd2xpbSkgeworICAgICAgICBkZWFkID0gaHdzYW1wbGVzIC0gbGl2ZTsKKyAgICAgICAgbGVmdCA9IGh3c2FtcGxlcyAtIHdwb3M7CisgICAgICAgIGJsY2sgPSBhdWRpb19NSU4gKGRlYWQsIGxlZnQpOworICAgICAgICBpZiAoIWJsY2spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlzYW1wID0gc3dsaW07CisgICAgICAgIG9zYW1wID0gYmxjazsKKyAgICAgICAgc3RfcmF0ZV9mbG93X21peCAoCisgICAgICAgICAgICBzdy0+cmF0ZSwKKyAgICAgICAgICAgIHN3LT5idWYgKyBwb3MsCisgICAgICAgICAgICBzdy0+aHctPm1peF9idWYgKyB3cG9zLAorICAgICAgICAgICAgJmlzYW1wLAorICAgICAgICAgICAgJm9zYW1wCisgICAgICAgICAgICApOworICAgICAgICByZXQgKz0gaXNhbXA7CisgICAgICAgIHN3bGltIC09IGlzYW1wOworICAgICAgICBwb3MgKz0gaXNhbXA7CisgICAgICAgIGxpdmUgKz0gb3NhbXA7CisgICAgICAgIHdwb3MgPSAod3BvcyArIG9zYW1wKSAlIGh3c2FtcGxlczsKKyAgICAgICAgdG90YWwgKz0gb3NhbXA7CisgICAgfQorCisgICAgc3ctPnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQgKz0gdG90YWw7CisgICAgc3ctPmVtcHR5ID0gc3ctPnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQgPT0gMDsKKworI2lmZGVmIERFQlVHX09VVAorICAgIGRvbG9nICgKKyAgICAgICAgIiVzOiB3cml0ZSBzaXplICVkIHJldCAlZCB0b3RhbCBzdyAlZFxuIiwKKyAgICAgICAgU1dfTkFNRSAoc3cpLAorICAgICAgICBzaXplID4+IHN3LT5pbmZvLnNoaWZ0LAorICAgICAgICByZXQsCisgICAgICAgIHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkCisgICAgICAgICk7CisjZW5kaWYKKworICAgIHJldHVybiByZXQgPDwgc3ctPmluZm8uc2hpZnQ7Cit9CisKKyNpZmRlZiBERUJVR19BVURJTworc3RhdGljIHZvaWQgYXVkaW9fcGNtX3ByaW50X2luZm8gKGNvbnN0IGNoYXIgKmNhcCwgc3RydWN0IGF1ZGlvX3BjbV9pbmZvICppbmZvKQoreworICAgIGRvbG9nICgiJXM6IGJpdHMgJWQsIHNpZ24gJWQsIGZyZXEgJWQsIG5jaGFuICVkXG4iLAorICAgICAgICAgICBjYXAsIGluZm8tPmJpdHMsIGluZm8tPnNpZ24sIGluZm8tPmZyZXEsIGluZm8tPm5jaGFubmVscyk7Cit9CisjZW5kaWYKKworI2RlZmluZSBEQUMKKyNpbmNsdWRlICJhdWRpb190ZW1wbGF0ZS5oIgorI3VuZGVmIERBQworI2luY2x1ZGUgImF1ZGlvX3RlbXBsYXRlLmgiCisKKy8qCisgKiBUaW1lcgorICovCitzdGF0aWMgdm9pZCBhdWRpb190aW1lciAodm9pZCAqb3BhcXVlKQoreworICAgIEF1ZGlvU3RhdGUgKnMgPSBvcGFxdWU7CisjaWYgMAorI2RlZmluZSAgTUFYX0RJRkZTICAxMDAKKyAgICBpbnQ2NF90ICAgICAgICAgbm93ICA9IHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgc3RhdGljIGludDY0X3QgIGxhc3QgPSAwOworICAgIHN0YXRpYyBmbG9hdCAgICBkaWZmc1tNQVhfRElGRlNdOworICAgIHN0YXRpYyBpbnQgICAgICBudW1fZGlmZnM7CisKKyAgICBpZiAobGFzdCA9PSAwKQorICAgICAgICBsYXN0ID0gbm93OworICAgIGVsc2UgeworICAgICAgICBkaWZmc1tudW1fZGlmZnNdID0gKGZsb2F0KSgobm93LWxhc3QpLzFlNik7ICAvKiBsYXN0IGRpZmYgaW4gbXMgKi8KKyAgICAgICAgaWYgKCsrbnVtX2RpZmZzID09IE1BWF9ESUZGUykgeworICAgICAgICAgICAgZG91YmxlICBtaW5fZGlmZiA9IDFlNiwgbWF4X2RpZmYgPSAtMWU2OworICAgICAgICAgICAgZG91YmxlICBhbGxfZGlmZiA9IDAuOworICAgICAgICAgICAgaW50ICAgICBubjsKKworICAgICAgICAgICAgZm9yIChubiA9IDA7IG5uIDwgbnVtX2RpZmZzOyBubisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpZmZzW25uXSA8IG1pbl9kaWZmKSBtaW5fZGlmZiA9IGRpZmZzW25uXTsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZnNbbm5dID4gbWF4X2RpZmYpIG1heF9kaWZmID0gZGlmZnNbbm5dOworICAgICAgICAgICAgICAgIGFsbF9kaWZmICs9IGRpZmZzW25uXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFsbF9kaWZmICo9IDEuMC9udW1fZGlmZnM7CisgICAgICAgICAgICBwcmludGYoImF1ZGlvIHRpbWVyOiBtaW5fZGlmZj0lNi4yZyBtYXhfZGlmZj0lNi4yZyBhdmdfZGlmZj0lNi4yZyBzYW1wbGVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kaWZmLCBtYXhfZGlmZiwgYWxsX2RpZmYsIG51bV9kaWZmcyk7CisgICAgICAgICAgICBudW1fZGlmZnMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGxhc3QgPSBub3c7CisjZW5kaWYKKworICAgIGF1ZGlvX3J1biAoInRpbWVyIik7CisgICAgdGltZXJfbW9kKHMtPnRzLCBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgY29uZi5wZXJpb2QudGlja3MpOworfQorCisKK3N0YXRpYyBpbnQgYXVkaW9faXNfdGltZXJfbmVlZGVkICh2b2lkKQoreworICAgIEhXVm9pY2VJbiAqaHdpID0gTlVMTDsKKyAgICBIV1ZvaWNlT3V0ICpod28gPSBOVUxMOworCisgICAgd2hpbGUgKChod28gPSBhdWRpb19wY21faHdfZmluZF9hbnlfZW5hYmxlZF9vdXQgKGh3bykpKSB7CisgICAgICAgIGlmICghaHdvLT5wb2xsX21vZGUpIHJldHVybiAxOworICAgIH0KKyAgICB3aGlsZSAoKGh3aSA9IGF1ZGlvX3BjbV9od19maW5kX2FueV9lbmFibGVkX2luIChod2kpKSkgeworICAgICAgICBpZiAoIWh3aS0+cG9sbF9tb2RlKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3Jlc2V0X3RpbWVyICh2b2lkKQoreworICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKworICAgIGlmIChhdWRpb19pc190aW1lcl9uZWVkZWQgKCkpIHsKKyAgICAgICAgdGltZXJfbW9kKHMtPnRzLCBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lcl9kZWwocy0+dHMpOworICAgIH0KK30KKworLyoKKyAqIFB1YmxpYyBBUEkKKyAqLworaW50IEFVRF93cml0ZSAoU1dWb2ljZU91dCAqc3csIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IGJ5dGVzOworCisgICAgaWYgKCFzdykgeworICAgICAgICAvKiBYWFg6IENvbnNpZGVyIG9wdGlvbnMgKi8KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgaWYgKCFzdy0+aHctPmVuYWJsZWQpIHsKKyAgICAgICAgZG9sb2cgKCJXcml0aW5nIHRvIGRpc2FibGVkIHZvaWNlICVzXG4iLCBTV19OQU1FIChzdykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBieXRlcyA9IHN3LT5ody0+cGNtX29wcy0+d3JpdGUgKHN3LCBidWYsIHNpemUpOworICAgIHJldHVybiBieXRlczsKK30KKworaW50IEFVRF9yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBzaXplKQoreworICAgIGludCBieXRlczsKKworICAgIGlmICghc3cpIHsKKyAgICAgICAgLyogWFhYOiBDb25zaWRlciBvcHRpb25zICovCisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIGlmICghc3ctPmh3LT5lbmFibGVkKSB7CisgICAgICAgIGRvbG9nICgiUmVhZGluZyBmcm9tIGRpc2FibGVkIHZvaWNlICVzXG4iLCBTV19OQU1FIChzdykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBieXRlcyA9IHN3LT5ody0+cGNtX29wcy0+cmVhZCAoc3csIGJ1Ziwgc2l6ZSk7CisgICAgcmV0dXJuIGJ5dGVzOworfQorCitpbnQgQVVEX2dldF9idWZmZXJfc2l6ZV9vdXQgKFNXVm9pY2VPdXQgKnN3KQoreworICAgIHJldHVybiBzdy0+aHctPnNhbXBsZXMgPDwgc3ctPmh3LT5pbmZvLnNoaWZ0OworfQorCit2b2lkIEFVRF9zZXRfYWN0aXZlX291dCAoU1dWb2ljZU91dCAqc3csIGludCBvbikKK3sKKyAgICBIV1ZvaWNlT3V0ICpodzsKKworICAgIGlmICghc3cpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGh3ID0gc3ctPmh3OworICAgIGlmIChzdy0+YWN0aXZlICE9IG9uKSB7CisgICAgICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKyAgICAgICAgU1dWb2ljZU91dCAqdGVtcF9zdzsKKyAgICAgICAgU1dWb2ljZUNhcCAqc2M7CisKKyAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICBody0+cGVuZGluZ19kaXNhYmxlID0gMDsKKyAgICAgICAgICAgIGlmICghaHctPmVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBody0+ZW5hYmxlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHMtPnZtX3J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPnBjbV9vcHMtPmN0bF9vdXQgKGh3LCBWT0lDRV9FTkFCTEUsIGNvbmYudHJ5X3BvbGxfb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fcmVzZXRfdGltZXIgKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGh3LT5lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgaW50IG5iX2FjdGl2ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKHRlbXBfc3cgPSBody0+c3dfaGVhZC5saF9maXJzdDsgdGVtcF9zdzsKKyAgICAgICAgICAgICAgICAgICAgIHRlbXBfc3cgPSB0ZW1wX3N3LT5lbnRyaWVzLmxlX25leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJfYWN0aXZlICs9IHRlbXBfc3ctPmFjdGl2ZSAhPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGh3LT5wZW5kaW5nX2Rpc2FibGUgPSBuYl9hY3RpdmUgPT0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc2MgPSBody0+Y2FwX2hlYWQubGhfZmlyc3Q7IHNjOyBzYyA9IHNjLT5lbnRyaWVzLmxlX25leHQpIHsKKyAgICAgICAgICAgIHNjLT5zdy5hY3RpdmUgPSBody0+ZW5hYmxlZDsKKyAgICAgICAgICAgIGlmIChody0+ZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2NhcHR1cmVfbWF5YmVfY2hhbmdlZCAoc2MtPmNhcCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3ctPmFjdGl2ZSA9IG9uOworICAgIH0KK30KKwordm9pZCBBVURfc2V0X2FjdGl2ZV9pbiAoU1dWb2ljZUluICpzdywgaW50IG9uKQoreworICAgIEhXVm9pY2VJbiAqaHc7CisKKyAgICBpZiAoIXN3KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBodyA9IHN3LT5odzsKKyAgICBpZiAoc3ctPmFjdGl2ZSAhPSBvbikgeworICAgICAgICBBdWRpb1N0YXRlICpzID0gJmdsb2JfYXVkaW9fc3RhdGU7CisgICAgICAgIFNXVm9pY2VJbiAqdGVtcF9zdzsKKworICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgIGlmICghaHctPmVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBody0+ZW5hYmxlZCA9IDE7CisgICAgICAgICAgICAgICAgaWYgKHMtPnZtX3J1bm5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPnBjbV9vcHMtPmN0bF9pbiAoaHcsIFZPSUNFX0VOQUJMRSwgY29uZi50cnlfcG9sbF9pbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3ctPnRvdGFsX2h3X3NhbXBsZXNfYWNxdWlyZWQgPSBody0+dG90YWxfc2FtcGxlc19jYXB0dXJlZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChody0+ZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGludCBuYl9hY3RpdmUgPSAwOworCisgICAgICAgICAgICAgICAgZm9yICh0ZW1wX3N3ID0gaHctPnN3X2hlYWQubGhfZmlyc3Q7IHRlbXBfc3c7CisgICAgICAgICAgICAgICAgICAgICB0ZW1wX3N3ID0gdGVtcF9zdy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIG5iX2FjdGl2ZSArPSB0ZW1wX3N3LT5hY3RpdmUgIT0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobmJfYWN0aXZlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaHctPmVuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBody0+cGNtX29wcy0+Y3RsX2luIChodywgVk9JQ0VfRElTQUJMRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3LT5hY3RpdmUgPSBvbjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZ2V0X2F2YWlsIChTV1ZvaWNlSW4gKnN3KQoreworICAgIGludCBsaXZlOworCisgICAgaWYgKCFzdykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsaXZlID0gc3ctPmh3LT50b3RhbF9zYW1wbGVzX2NhcHR1cmVkIC0gc3ctPnRvdGFsX2h3X3NhbXBsZXNfYWNxdWlyZWQ7CisgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgbGl2ZSA8IDAgfHwgbGl2ZSA+IHN3LT5ody0+c2FtcGxlcykpIHsKKyAgICAgICAgZG9sb2cgKCJsaXZlPSVkIHN3LT5ody0+c2FtcGxlcz0lZFxuIiwgbGl2ZSwgc3ctPmh3LT5zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGRlYnVnICgKKyAgICAgICAgIiVzOiBnZXRfYXZhaWwgbGl2ZSAlZCByZXQgJSIgUFJJZDY0ICJcbiIsCisgICAgICAgIFNXX05BTUUgKHN3KSwKKyAgICAgICAgbGl2ZSwgKCgoaW50NjRfdCkgbGl2ZSA8PCAzMikgLyBzdy0+cmF0aW8pIDw8IHN3LT5pbmZvLnNoaWZ0CisgICAgICAgICk7CisKKyAgICByZXR1cm4gKCgoaW50NjRfdCkgbGl2ZSA8PCAzMikgLyBzdy0+cmF0aW8pIDw8IHN3LT5pbmZvLnNoaWZ0OworfQorCitzdGF0aWMgaW50IGF1ZGlvX2dldF9mcmVlIChTV1ZvaWNlT3V0ICpzdykKK3sKKyAgICBpbnQgbGl2ZSwgZGVhZDsKKworICAgIGlmICghc3cpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGl2ZSA9IHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkOworCisgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgbGl2ZSA8IDAgfHwgbGl2ZSA+IHN3LT5ody0+c2FtcGxlcykpIHsKKyAgICAgICAgZG9sb2cgKCJsaXZlPSVkIHN3LT5ody0+c2FtcGxlcz0lZFxuIiwgbGl2ZSwgc3ctPmh3LT5zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZGVhZCA9IHN3LT5ody0+c2FtcGxlcyAtIGxpdmU7CisKKyNpZmRlZiBERUJVR19PVVQKKyAgICBkb2xvZyAoIiVzOiBnZXRfZnJlZSBsaXZlICVkIGRlYWQgJWQgcmV0ICUiIFBSSWQ2NCAiXG4iLAorICAgICAgICAgICBTV19OQU1FIChzdyksCisgICAgICAgICAgIGxpdmUsIGRlYWQsICgoKGludDY0X3QpIGRlYWQgPDwgMzIpIC8gc3ctPnJhdGlvKSA8PCBzdy0+aW5mby5zaGlmdCk7CisjZW5kaWYKKworICAgIHJldHVybiAoKChpbnQ2NF90KSBkZWFkIDw8IDMyKSAvIHN3LT5yYXRpbykgPDwgc3ctPmluZm8uc2hpZnQ7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX2NhcHR1cmVfbWl4X2FuZF9jbGVhciAoSFdWb2ljZU91dCAqaHcsIGludCBycG9zLCBpbnQgc2FtcGxlcykKK3sKKyAgICBpbnQgbjsKKworICAgIGlmIChody0+ZW5hYmxlZCkgeworICAgICAgICBTV1ZvaWNlQ2FwICpzYzsKKworICAgICAgICBmb3IgKHNjID0gaHctPmNhcF9oZWFkLmxoX2ZpcnN0OyBzYzsgc2MgPSBzYy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgICAgICBTV1ZvaWNlT3V0ICpzdyA9ICZzYy0+c3c7CisgICAgICAgICAgICBpbnQgcnBvczIgPSBycG9zOworCisgICAgICAgICAgICBuID0gc2FtcGxlczsKKyAgICAgICAgICAgIHdoaWxlIChuKSB7CisgICAgICAgICAgICAgICAgaW50IHRpbGxfZW5kX29mX2h3ID0gaHctPnNhbXBsZXMgLSBycG9zMjsKKyAgICAgICAgICAgICAgICBpbnQgdG9fd3JpdGUgPSBhdWRpb19NSU4gKHRpbGxfZW5kX29mX2h3LCBuKTsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXMgPSB0b193cml0ZSA8PCBody0+aW5mby5zaGlmdDsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbjsKKworICAgICAgICAgICAgICAgIHN3LT5idWYgPSBody0+bWl4X2J1ZiArIHJwb3MyOworICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSBhdWRpb19wY21fc3dfd3JpdGUgKHN3LCBOVUxMLCBieXRlcyk7CisgICAgICAgICAgICAgICAgaWYgKHdyaXR0ZW4gLSBieXRlcykgeworICAgICAgICAgICAgICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBtaXggJWQgYnl0ZXMgaW50byBhIGNhcHR1cmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciwgbWl4ZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcywgd3JpdHRlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuIC09IHRvX3dyaXRlOworICAgICAgICAgICAgICAgIHJwb3MyID0gKHJwb3MyICsgdG9fd3JpdGUpICUgaHctPnNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gYXVkaW9fTUlOIChzYW1wbGVzLCBody0+c2FtcGxlcyAtIHJwb3MpOworICAgIG1peGVuZ19jbGVhciAoaHctPm1peF9idWYgKyBycG9zLCBuKTsKKyAgICBtaXhlbmdfY2xlYXIgKGh3LT5taXhfYnVmLCBzYW1wbGVzIC0gbik7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3J1bl9vdXQgKEF1ZGlvU3RhdGUgKnMpCit7CisgICAgSFdWb2ljZU91dCAqaHcgPSBOVUxMOworICAgIFNXVm9pY2VPdXQgKnN3OworCisgICAgd2hpbGUgKChodyA9IGF1ZGlvX3BjbV9od19maW5kX2FueV9lbmFibGVkX291dCAoaHcpKSkgeworICAgICAgICBpbnQgcGxheWVkOworICAgICAgICBpbnQgbGl2ZSwgZnJlZSwgbmJfbGl2ZSwgY2xlYW51cF9yZXF1aXJlZCwgcHJldl9ycG9zOworCisgICAgICAgIGxpdmUgPSBhdWRpb19wY21faHdfZ2V0X2xpdmVfb3V0IChodywgJm5iX2xpdmUpOworICAgICAgICBpZiAoIW5iX2xpdmUpIHsKKyAgICAgICAgICAgIGxpdmUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgbGl2ZSA8IDAgfHwgbGl2ZSA+IGh3LT5zYW1wbGVzKSkgeworICAgICAgICAgICAgZG9sb2cgKCJsaXZlPSVkIGh3LT5zYW1wbGVzPSVkXG4iLCBsaXZlLCBody0+c2FtcGxlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChody0+cGVuZGluZ19kaXNhYmxlICYmICFuYl9saXZlKSB7CisgICAgICAgICAgICBTV1ZvaWNlQ2FwICpzYzsKKyNpZmRlZiBERUJVR19PVVQKKyAgICAgICAgICAgIGRvbG9nICgiRGlzYWJsaW5nIHZvaWNlXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgaHctPmVuYWJsZWQgPSAwOworICAgICAgICAgICAgaHctPnBlbmRpbmdfZGlzYWJsZSA9IDA7CisgICAgICAgICAgICBody0+cGNtX29wcy0+Y3RsX291dCAoaHcsIFZPSUNFX0RJU0FCTEUpOworICAgICAgICAgICAgZm9yIChzYyA9IGh3LT5jYXBfaGVhZC5saF9maXJzdDsgc2M7IHNjID0gc2MtPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgICAgIHNjLT5zdy5hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgIGF1ZGlvX3JlY2FsY19hbmRfbm90aWZ5X2NhcHR1cmUgKHNjLT5jYXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWxpdmUpIHsKKyAgICAgICAgICAgIGZvciAoc3cgPSBody0+c3dfaGVhZC5saF9maXJzdDsgc3c7IHN3ID0gc3ctPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChzdy0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUgPSBhdWRpb19nZXRfZnJlZSAoc3cpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJlZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3LT5jYWxsYmFjay5mbiAoc3ctPmNhbGxiYWNrLm9wYXF1ZSwgZnJlZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByZXZfcnBvcyA9IGh3LT5ycG9zOworICAgICAgICBwbGF5ZWQgPSBody0+cGNtX29wcy0+cnVuX291dCAoaHcsIGxpdmUpOworICAgICAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCBody0+cnBvcyA+PSBody0+c2FtcGxlcykpIHsKKyAgICAgICAgICAgIGRvbG9nICgiaHctPnJwb3M9JWQgaHctPnNhbXBsZXM9JWQgcGxheWVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgIGh3LT5ycG9zLCBody0+c2FtcGxlcywgcGxheWVkKTsKKyAgICAgICAgICAgIGh3LT5ycG9zID0gMDsKKyAgICAgICAgfQorCisjaWZkZWYgREVCVUdfT1VUCisgICAgICAgIGRvbG9nICgicGxheWVkPSVkXG4iLCBwbGF5ZWQpOworI2VuZGlmCisKKyAgICAgICAgaWYgKHBsYXllZCkgeworICAgICAgICAgICAgaHctPnRzX2hlbHBlciArPSBwbGF5ZWQ7CisgICAgICAgICAgICBhdWRpb19jYXB0dXJlX21peF9hbmRfY2xlYXIgKGh3LCBwcmV2X3Jwb3MsIHBsYXllZCk7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX3JlcXVpcmVkID0gMDsKKyAgICAgICAgZm9yIChzdyA9IGh3LT5zd19oZWFkLmxoX2ZpcnN0OyBzdzsgc3cgPSBzdy0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXN3LT5hY3RpdmUgfHwgc3ctPmVtcHR5KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIHBsYXllZCA+IHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkKSkgeworICAgICAgICAgICAgICAgIGRvbG9nICgicGxheWVkPSVkIHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZWQsIHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkKTsKKyAgICAgICAgICAgICAgICBwbGF5ZWQgPSBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ctPnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQgLT0gcGxheWVkOworCisgICAgICAgICAgICBpZiAoIXN3LT50b3RhbF9od19zYW1wbGVzX21peGVkKSB7CisgICAgICAgICAgICAgICAgc3ctPmVtcHR5ID0gMTsKKyAgICAgICAgICAgICAgICBjbGVhbnVwX3JlcXVpcmVkIHw9ICFzdy0+YWN0aXZlICYmICFzdy0+Y2FsbGJhY2suZm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdy0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgZnJlZSA9IGF1ZGlvX2dldF9mcmVlIChzdyk7CisgICAgICAgICAgICAgICAgaWYgKGZyZWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN3LT5jYWxsYmFjay5mbiAoc3ctPmNhbGxiYWNrLm9wYXF1ZSwgZnJlZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsZWFudXBfcmVxdWlyZWQpIHsKKyAgICAgICAgICAgIFNXVm9pY2VPdXQgKnN3MTsKKworICAgICAgICAgICAgc3cgPSBody0+c3dfaGVhZC5saF9maXJzdDsKKyAgICAgICAgICAgIHdoaWxlIChzdykgeworICAgICAgICAgICAgICAgIHN3MSA9IHN3LT5lbnRyaWVzLmxlX25leHQ7CisgICAgICAgICAgICAgICAgaWYgKCFzdy0+YWN0aXZlICYmICFzdy0+Y2FsbGJhY2suZm4pIHsKKyNpZmRlZiBERUJVR19QTElWRQorICAgICAgICAgICAgICAgICAgICBkb2xvZyAoIkZpbmlzaGluZyB3aXRoIG9sZCB2b2ljZVxuIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2xvc2Vfb3V0IChzdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3ID0gc3cxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhdWRpb19ydW5faW4gKEF1ZGlvU3RhdGUgKnMpCit7CisgICAgSFdWb2ljZUluICpodyA9IE5VTEw7CisKKyAgICB3aGlsZSAoKGh3ID0gYXVkaW9fcGNtX2h3X2ZpbmRfYW55X2VuYWJsZWRfaW4gKGh3KSkpIHsKKyAgICAgICAgU1dWb2ljZUluICpzdzsKKyAgICAgICAgaW50IGNhcHR1cmVkLCBtaW47CisKKyAgICAgICAgY2FwdHVyZWQgPSBody0+cGNtX29wcy0+cnVuX2luIChodyk7CisKKyAgICAgICAgbWluID0gYXVkaW9fcGNtX2h3X2ZpbmRfbWluX2luIChodyk7CisgICAgICAgIGh3LT50b3RhbF9zYW1wbGVzX2NhcHR1cmVkICs9IGNhcHR1cmVkIC0gbWluOworICAgICAgICBody0+dHNfaGVscGVyICs9IGNhcHR1cmVkOworCisgICAgICAgIGZvciAoc3cgPSBody0+c3dfaGVhZC5saF9maXJzdDsgc3c7IHN3ID0gc3ctPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgc3ctPnRvdGFsX2h3X3NhbXBsZXNfYWNxdWlyZWQgLT0gbWluOworCisgICAgICAgICAgICBpZiAoc3ctPmFjdGl2ZSkgeworICAgICAgICAgICAgICAgIGludCBhdmFpbDsKKworICAgICAgICAgICAgICAgIGF2YWlsID0gYXVkaW9fZ2V0X2F2YWlsIChzdyk7CisgICAgICAgICAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdy0+Y2FsbGJhY2suZm4gKHN3LT5jYWxsYmFjay5vcGFxdWUsIGF2YWlsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3J1bl9jYXB0dXJlIChBdWRpb1N0YXRlICpzKQoreworICAgIENhcHR1cmVWb2ljZU91dCAqY2FwOworCisgICAgZm9yIChjYXAgPSBzLT5jYXBfaGVhZC5saF9maXJzdDsgY2FwOyBjYXAgPSBjYXAtPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICBpbnQgbGl2ZSwgcnBvcywgY2FwdHVyZWQ7CisgICAgICAgIEhXVm9pY2VPdXQgKmh3ID0gJmNhcC0+aHc7CisgICAgICAgIFNXVm9pY2VPdXQgKnN3OworCisgICAgICAgIGNhcHR1cmVkID0gbGl2ZSA9IGF1ZGlvX3BjbV9od19nZXRfbGl2ZV9vdXQgKGh3LCBOVUxMKTsKKyAgICAgICAgcnBvcyA9IGh3LT5ycG9zOworICAgICAgICB3aGlsZSAobGl2ZSkgeworICAgICAgICAgICAgaW50IGxlZnQgPSBody0+c2FtcGxlcyAtIHJwb3M7CisgICAgICAgICAgICBpbnQgdG9fY2FwdHVyZSA9IGF1ZGlvX01JTiAobGl2ZSwgbGVmdCk7CisgICAgICAgICAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICpzcmM7CisgICAgICAgICAgICBzdHJ1Y3QgY2FwdHVyZV9jYWxsYmFjayAqY2I7CisKKyAgICAgICAgICAgIHNyYyA9IGh3LT5taXhfYnVmICsgcnBvczsKKyAgICAgICAgICAgIGh3LT5jbGlwIChjYXAtPmJ1Ziwgc3JjLCB0b19jYXB0dXJlKTsKKyAgICAgICAgICAgIG1peGVuZ19jbGVhciAoc3JjLCB0b19jYXB0dXJlKTsKKworICAgICAgICAgICAgZm9yIChjYiA9IGNhcC0+Y2JfaGVhZC5saF9maXJzdDsgY2I7IGNiID0gY2ItPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgICAgIGNiLT5vcHMuY2FwdHVyZSAoY2ItPm9wYXF1ZSwgY2FwLT5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19jYXB0dXJlIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJwb3MgPSAocnBvcyArIHRvX2NhcHR1cmUpICUgaHctPnNhbXBsZXM7CisgICAgICAgICAgICBsaXZlIC09IHRvX2NhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgaHctPnJwb3MgPSBycG9zOworCisgICAgICAgIGZvciAoc3cgPSBody0+c3dfaGVhZC5saF9maXJzdDsgc3c7IHN3ID0gc3ctPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgaWYgKCFzdy0+YWN0aXZlICYmIHN3LT5lbXB0eSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCBjYXB0dXJlZCA+IHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkKSkgeworICAgICAgICAgICAgICAgIGRvbG9nICgiY2FwdHVyZWQ9JWQgc3ctPnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVkLCBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZCk7CisgICAgICAgICAgICAgICAgY2FwdHVyZWQgPSBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ctPnRvdGFsX2h3X3NhbXBsZXNfbWl4ZWQgLT0gY2FwdHVyZWQ7CisgICAgICAgICAgICBzdy0+ZW1wdHkgPSBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZCA9PSAwOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGF1ZGlvX3J1biAoY29uc3QgY2hhciAqbXNnKQoreworICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKworICAgIGF1ZGlvX3J1bl9vdXQgKHMpOworICAgIGF1ZGlvX3J1bl9pbiAocyk7CisgICAgYXVkaW9fcnVuX2NhcHR1cmUgKHMpOworI2lmZGVmIERFQlVHX1BPTEwKKyAgICB7CisgICAgICAgIHN0YXRpYyBkb3VibGUgcHJldnRpbWU7CisgICAgICAgIGRvdWJsZSBjdXJydGltZTsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICAgICAgaWYgKGdldHRpbWVvZmRheSAoJnR2LCBOVUxMKSkgeworICAgICAgICAgICAgcGVycm9yICgiYXVkaW9fcnVuOiBnZXR0aW1lb2ZkYXkiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJ0aW1lID0gdHYudHZfc2VjICsgdHYudHZfdXNlYyAqIDFlLTY7CisgICAgICAgIGRvbG9nICgiRWxhcHNlZCBzaW5jZSBsYXN0ICVzOiAlZlxuIiwgbXNnLCBjdXJydGltZSAtIHByZXZ0aW1lKTsKKyAgICAgICAgcHJldnRpbWUgPSBjdXJydGltZTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19vcHRpb24gYXVkaW9fb3B0aW9uc1tdID0geworICAgIC8qIERBQyAqLworICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkRBQ19GSVhFRF9TRVRUSU5HUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZml4ZWRfb3V0LmVuYWJsZWQsCisgICAgICAgIC5kZXNjciA9ICJVc2UgZml4ZWQgc2V0dGluZ3MgZm9yIGhvc3QgREFDIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiREFDX0ZJWEVEX0ZSRVEiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZml4ZWRfb3V0LnNldHRpbmdzLmZyZXEsCisgICAgICAgIC5kZXNjciA9ICJGcmVxdWVuY3kgZm9yIGZpeGVkIGhvc3QgREFDIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiREFDX0ZJWEVEX0ZNVCIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfRk1ULAorICAgICAgICAudmFscCAgPSAmY29uZi5maXhlZF9vdXQuc2V0dGluZ3MuZm10LAorICAgICAgICAuZGVzY3IgPSAiRm9ybWF0IGZvciBmaXhlZCBob3N0IERBQyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkRBQ19GSVhFRF9DSEFOTkVMUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5maXhlZF9vdXQuc2V0dGluZ3MubmNoYW5uZWxzLAorICAgICAgICAuZGVzY3IgPSAiTnVtYmVyIG9mIGNoYW5uZWxzIGZvciBmaXhlZCBEQUMgKDEgLSBtb25vLCAyIC0gc3RlcmVvKSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkRBQ19WT0lDRVMiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZml4ZWRfb3V0Lm5iX3ZvaWNlcywKKyAgICAgICAgLmRlc2NyID0gIk51bWJlciBvZiB2b2ljZXMgZm9yIERBQyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkRBQ19UUllfUE9MTCIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYudHJ5X3BvbGxfb3V0LAorICAgICAgICAuZGVzY3IgPSAiQXR0ZW1wdCB1c2luZyBwb2xsIG1vZGUgZm9yIERBQyIKKyAgICB9LAorICAgIC8qIEFEQyAqLworICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkFEQ19GSVhFRF9TRVRUSU5HUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZml4ZWRfaW4uZW5hYmxlZCwKKyAgICAgICAgLmRlc2NyID0gIlVzZSBmaXhlZCBzZXR0aW5ncyBmb3IgaG9zdCBBREMiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJBRENfRklYRURfRlJFUSIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5maXhlZF9pbi5zZXR0aW5ncy5mcmVxLAorICAgICAgICAuZGVzY3IgPSAiRnJlcXVlbmN5IGZvciBmaXhlZCBob3N0IEFEQyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkFEQ19GSVhFRF9GTVQiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0ZNVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZml4ZWRfaW4uc2V0dGluZ3MuZm10LAorICAgICAgICAuZGVzY3IgPSAiRm9ybWF0IGZvciBmaXhlZCBob3N0IEFEQyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkFEQ19GSVhFRF9DSEFOTkVMUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5maXhlZF9pbi5zZXR0aW5ncy5uY2hhbm5lbHMsCisgICAgICAgIC5kZXNjciA9ICJOdW1iZXIgb2YgY2hhbm5lbHMgZm9yIGZpeGVkIEFEQyAoMSAtIG1vbm8sIDIgLSBzdGVyZW8pIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiQURDX1ZPSUNFUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5maXhlZF9pbi5uYl92b2ljZXMsCisgICAgICAgIC5kZXNjciA9ICJOdW1iZXIgb2Ygdm9pY2VzIGZvciBBREMiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJBRENfVFJZX1BPTEwiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0JPT0wsCisgICAgICAgIC52YWxwICA9ICZjb25mLnRyeV9wb2xsX2luLAorICAgICAgICAuZGVzY3IgPSAiQXR0ZW1wdCB1c2luZyBwb2xsIG1vZGUgZm9yIEFEQyIKKyAgICB9LAorICAgIC8qIE1pc2MgKi8KKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJUSU1FUl9QRVJJT0QiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYucGVyaW9kLmhlcnR6LAorICAgICAgICAuZGVzY3IgPSAiVGltZXIgcGVyaW9kIGluIEhaICgwIC0gdXNlIGxvd2VzdCBwb3NzaWJsZSkiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJQTElWRSIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYucGxpdmUsCisgICAgICAgIC5kZXNjciA9ICIodW5kb2N1bWVudGVkKSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkxPR19UT19NT05JVE9SIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9CT09MLAorICAgICAgICAudmFscCAgPSAmY29uZi5sb2dfdG9fbW9uaXRvciwKKyAgICAgICAgLmRlc2NyID0gIlByaW50IGxvZ2dpbmcgbWVzc2FnZXMgdG8gbW9uaXRvciBpbnN0ZWFkIG9mIHN0ZGVyciIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHZvaWQgYXVkaW9fcHBfbmJfdm9pY2VzIChjb25zdCBjaGFyICp0eXAsIGludCBuYikKK3sKKyAgICBzd2l0Y2ggKG5iKSB7CisgICAgY2FzZSAwOgorICAgICAgICBwcmludGYgKCJEb2VzIG5vdCBzdXBwb3J0ICVzXG4iLCB0eXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHByaW50ZiAoIk9uZSAlcyB2b2ljZVxuIiwgdHlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTlRfTUFYOgorICAgICAgICBwcmludGYgKCJUaGVvcmV0aWNhbGx5IHN1cHBvcnRzIG1hbnkgJXMgdm9pY2VzXG4iLCB0eXApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYgKCJUaGVvcmV0aWNhbGx5IHN1cHBvcnRzIHVwdG8gJWQgJXMgdm9pY2VzXG4iLCBuYiwgdHlwKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCit9CisKK3ZvaWQgQVVEX2hlbHAgKHZvaWQpCit7CisgICAgc2l6ZV90IGk7CisKKyAgICBhdWRpb19wcm9jZXNzX29wdGlvbnMgKCJBVURJTyIsIGF1ZGlvX29wdGlvbnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChkcnZ0YWIpOyBpKyspIHsKKyAgICAgICAgc3RydWN0IGF1ZGlvX2RyaXZlciAqZCA9IGRydnRhYltpXTsKKyAgICAgICAgaWYgKGQtPm9wdGlvbnMpIHsKKyAgICAgICAgICAgIGF1ZGlvX3Byb2Nlc3Nfb3B0aW9ucyAoZC0+bmFtZSwgZC0+b3B0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGYgKCJBdWRpbyBvcHRpb25zOlxuIik7CisgICAgYXVkaW9fcHJpbnRfb3B0aW9ucyAoIkFVRElPIiwgYXVkaW9fb3B0aW9ucyk7CisgICAgcHJpbnRmICgiXG4iKTsKKworICAgIHByaW50ZiAoIkF2YWlsYWJsZSBkcml2ZXJzOlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSAoZHJ2dGFiKTsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBhdWRpb19kcml2ZXIgKmQgPSBkcnZ0YWJbaV07CisKKyAgICAgICAgcHJpbnRmICgiTmFtZTogJXNcbiIsIGQtPm5hbWUpOworICAgICAgICBwcmludGYgKCJEZXNjcmlwdGlvbjogJXNcbiIsIGQtPmRlc2NyKTsKKworICAgICAgICBhdWRpb19wcF9uYl92b2ljZXMgKCJwbGF5YmFjayIsIGQtPm1heF92b2ljZXNfb3V0KTsKKyAgICAgICAgYXVkaW9fcHBfbmJfdm9pY2VzICgiY2FwdHVyZSIsIGQtPm1heF92b2ljZXNfaW4pOworCisgICAgICAgIGlmIChkLT5vcHRpb25zKSB7CisgICAgICAgICAgICBwcmludGYgKCJPcHRpb25zOlxuIik7CisgICAgICAgICAgICBhdWRpb19wcmludF9vcHRpb25zIChkLT5uYW1lLCBkLT5vcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZiAoIk5vIG9wdGlvbnNcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZiAoIlxuIik7CisgICAgfQorCisgICAgcHJpbnRmICgKKyAgICAgICAgIk9wdGlvbnMgYXJlIHNldHRhYmxlIHRocm91Z2ggZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuIgorICAgICAgICAiRXhhbXBsZTpcbiIKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgIiAgc2V0IFFFTVVfQVVESU9fRFJWPXdhdlxuIgorICAgICAgICAiICBzZXQgUUVNVV9XQVZfUEFUSD1jOlxcdHVuZS53YXZcbiIKKyNlbHNlCisgICAgICAgICIgIGV4cG9ydCBRRU1VX0FVRElPX0RSVj13YXZcbiIKKyAgICAgICAgIiAgZXhwb3J0IFFFTVVfV0FWX1BBVEg9JEhPTUUvdHVuZS53YXZcbiIKKyAgICAgICAgIihmb3IgY3NoIHJlcGxhY2UgZXhwb3J0IHdpdGggc2V0ZW52IGluIHRoZSBhYm92ZSlcbiIKKyNlbmRpZgorICAgICAgICAiICBxZW11IC4uLlxuXG4iCisgICAgICAgICk7Cit9CisKK3N0YXRpYyBpbnQgYXVkaW9fZHJpdmVyX2luaXQgKEF1ZGlvU3RhdGUgKnMsIHN0cnVjdCBhdWRpb19kcml2ZXIgKmRydikKK3sKKyAgICBpZiAoZHJ2LT5vcHRpb25zKSB7CisgICAgICAgIGF1ZGlvX3Byb2Nlc3Nfb3B0aW9ucyAoZHJ2LT5uYW1lLCBkcnYtPm9wdGlvbnMpOworICAgIH0KKyAgICBzLT5kcnZfb3BhcXVlID0gZHJ2LT5pbml0ICgpOworCisgICAgaWYgKHMtPmRydl9vcGFxdWUpIHsKKyAgICAgICAgYXVkaW9faW5pdF9uYl92b2ljZXNfb3V0IChkcnYpOworICAgICAgICBhdWRpb19pbml0X25iX3ZvaWNlc19pbiAoZHJ2KTsKKyAgICAgICAgcy0+ZHJ2ID0gZHJ2OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGluaXQgYCVzJyBhdWRpbyBkcml2ZXJcbiIsIGRydi0+bmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3ZtX2NoYW5nZV9zdGF0ZV9oYW5kbGVyICh2b2lkICpvcGFxdWUsIGludCBydW5uaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24pCit7CisgICAgQXVkaW9TdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBIV1ZvaWNlT3V0ICpod28gPSBOVUxMOworICAgIEhXVm9pY2VJbiAqaHdpID0gTlVMTDsKKyAgICBpbnQgb3AgPSBydW5uaW5nID8gVk9JQ0VfRU5BQkxFIDogVk9JQ0VfRElTQUJMRTsKKworICAgIHMtPnZtX3J1bm5pbmcgPSBydW5uaW5nOworICAgIHdoaWxlICgoaHdvID0gYXVkaW9fcGNtX2h3X2ZpbmRfYW55X2VuYWJsZWRfb3V0IChod28pKSkgeworICAgICAgICBod28tPnBjbV9vcHMtPmN0bF9vdXQgKGh3bywgb3AsIGNvbmYudHJ5X3BvbGxfb3V0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoKGh3aSA9IGF1ZGlvX3BjbV9od19maW5kX2FueV9lbmFibGVkX2luIChod2kpKSkgeworICAgICAgICBod2ktPnBjbV9vcHMtPmN0bF9pbiAoaHdpLCBvcCwgY29uZi50cnlfcG9sbF9pbik7CisgICAgfQorICAgIGF1ZGlvX3Jlc2V0X3RpbWVyICgpOworfQorCitzdGF0aWMgaW50IGluaXRpYWxpemVkOworCitzdGF0aWMgdm9pZCBhdWRpb19hdGV4aXQgKHZvaWQpCit7CisgICAgQXVkaW9TdGF0ZSAqcyA9ICZnbG9iX2F1ZGlvX3N0YXRlOworICAgIEhXVm9pY2VPdXQgKmh3byA9IE5VTEw7CisgICAgSFdWb2ljZUluICpod2kgPSBOVUxMOworCisgICAgaWYgKCFpbml0aWFsaXplZCkgcmV0dXJuOworICAgIGluaXRpYWxpemVkID0gMDsKKworICAgIHdoaWxlICgoaHdvID0gYXVkaW9fcGNtX2h3X2ZpbmRfYW55X2VuYWJsZWRfb3V0IChod28pKSkgeworICAgICAgICBTV1ZvaWNlQ2FwICpzYzsKKworICAgICAgICBod28tPnBjbV9vcHMtPmN0bF9vdXQgKGh3bywgVk9JQ0VfRElTQUJMRSk7CisgICAgICAgIGh3by0+cGNtX29wcy0+ZmluaV9vdXQgKGh3byk7CisKKyAgICAgICAgZm9yIChzYyA9IGh3by0+Y2FwX2hlYWQubGhfZmlyc3Q7IHNjOyBzYyA9IHNjLT5lbnRyaWVzLmxlX25leHQpIHsKKyAgICAgICAgICAgIENhcHR1cmVWb2ljZU91dCAqY2FwID0gc2MtPmNhcDsKKyAgICAgICAgICAgIHN0cnVjdCBjYXB0dXJlX2NhbGxiYWNrICpjYjsKKworICAgICAgICAgICAgZm9yIChjYiA9IGNhcC0+Y2JfaGVhZC5saF9maXJzdDsgY2I7IGNiID0gY2ItPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICAgICAgICAgIGNiLT5vcHMuZGVzdHJveSAoY2ItPm9wYXF1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoKGh3aSA9IGF1ZGlvX3BjbV9od19maW5kX2FueV9lbmFibGVkX2luIChod2kpKSkgeworICAgICAgICBod2ktPnBjbV9vcHMtPmN0bF9pbiAoaHdpLCBWT0lDRV9ESVNBQkxFKTsKKyAgICAgICAgaHdpLT5wY21fb3BzLT5maW5pX2luIChod2kpOworICAgIH0KKworICAgIGlmIChzLT5kcnYpIHsKKyAgICAgICAgcy0+ZHJ2LT5maW5pIChzLT5kcnZfb3BhcXVlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvX3NhdmUgKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgKHZvaWQpIGY7CisgICAgKHZvaWQpIG9wYXF1ZTsKK30KKworc3RhdGljIGludCBhdWRpb19sb2FkIChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICAodm9pZCkgZjsKKyAgICAodm9pZCkgb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyB2b2lkIGF1ZGlvX2luaXQgKHZvaWQpCit7CisgICAgc2l6ZV90IGk7CisgICAgaW50IGRvbmUgPSAwOworICAgIGNvbnN0IGNoYXIgKmRydm5hbWU7CisgICAgVk1DaGFuZ2VTdGF0ZUVudHJ5ICplOworICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKworICAgIGlmIChzLT5kcnYpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFMSVNUX0lOSVQgKCZzLT5od19oZWFkX291dCk7CisgICAgUUxJU1RfSU5JVCAoJnMtPmh3X2hlYWRfaW4pOworICAgIFFMSVNUX0lOSVQgKCZzLT5jYXBfaGVhZCk7CisgICAgYXRleGl0IChhdWRpb19hdGV4aXQpOworCisgICAgcy0+dHMgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19WSVJUVUFMLCBTQ0FMRV9OUywgYXVkaW9fdGltZXIsIHMpOworICAgIGlmICghcy0+dHMpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgY3JlYXRlIGF1ZGlvIHRpbWVyXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1ZGlvX3Byb2Nlc3Nfb3B0aW9ucyAoIkFVRElPIiwgYXVkaW9fb3B0aW9ucyk7CisKKyAgICBzLT5uYl9od192b2ljZXNfb3V0ID0gY29uZi5maXhlZF9vdXQubmJfdm9pY2VzOworICAgIHMtPm5iX2h3X3ZvaWNlc19pbiA9IGNvbmYuZml4ZWRfaW4ubmJfdm9pY2VzOworCisgICAgaWYgKHMtPm5iX2h3X3ZvaWNlc19vdXQgPD0gMCkgeworICAgICAgICBkb2xvZyAoIkJvZ3VzIG51bWJlciBvZiBwbGF5YmFjayB2b2ljZXMgJWQsIHNldHRpbmcgdG8gMVxuIiwKKyAgICAgICAgICAgICAgIHMtPm5iX2h3X3ZvaWNlc19vdXQpOworICAgICAgICBzLT5uYl9od192b2ljZXNfb3V0ID0gMTsKKyAgICB9CisKKyAgICBpZiAocy0+bmJfaHdfdm9pY2VzX2luIDw9IDApIHsKKyAgICAgICAgZG9sb2cgKCJCb2d1cyBudW1iZXIgb2YgY2FwdHVyZSB2b2ljZXMgJWQsIHNldHRpbmcgdG8gMFxuIiwKKyAgICAgICAgICAgICAgIHMtPm5iX2h3X3ZvaWNlc19pbik7CisgICAgICAgIHMtPm5iX2h3X3ZvaWNlc19pbiA9IDA7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgZGVmOworICAgICAgICBkcnZuYW1lID0gYXVkaW9fZ2V0X2NvbmZfc3RyICgiUUVNVV9BVURJT19EUlYiLCBOVUxMLCAmZGVmKTsKKyAgICB9CisKKyAgICBpZiAoZHJ2bmFtZSkgeworICAgICAgICBpbnQgZm91bmQgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChkcnZ0YWIpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wIChkcnZuYW1lLCBkcnZ0YWJbaV0tPm5hbWUpKSB7CisgICAgICAgICAgICAgICAgZG9uZSA9ICFhdWRpb19kcml2ZXJfaW5pdCAocywgZHJ2dGFiW2ldKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBkb2xvZyAoIlVua25vd24gYXVkaW8gZHJpdmVyIGAlcydcbiIsIGRydm5hbWUpOworICAgICAgICAgICAgZG9sb2cgKCJSdW4gd2l0aCAtYXVkaW8taGVscCB0byBsaXN0IGF2YWlsYWJsZSBkcml2ZXJzXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZG9uZSkgeworICAgICAgICBmb3IgKGkgPSAwOyAhZG9uZSAmJiBpIDwgQVJSQVlfU0laRSAoZHJ2dGFiKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZHJ2dGFiW2ldLT5jYW5fYmVfZGVmYXVsdCkgeworICAgICAgICAgICAgICAgIGRvbmUgPSAhYXVkaW9fZHJpdmVyX2luaXQgKHMsIGRydnRhYltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRvbmUpIHsKKyAgICAgICAgZG9uZSA9ICFhdWRpb19kcml2ZXJfaW5pdCAocywgJm5vX2F1ZGlvX2RyaXZlcik7CisgICAgICAgIGlmICghZG9uZSkgeworICAgICAgICAgICAgaHdfZXJyb3IoIkNvdWxkIG5vdCBpbml0aWFsaXplIGF1ZGlvIHN1YnN5c3RlbVxuIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkb2xvZyAoIndhcm5pbmc6IFVzaW5nIHRpbWVyIGJhc2VkIGF1ZGlvIGVtdWxhdGlvblxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZi5wZXJpb2QuaGVydHogPD0gMCkgeworICAgICAgICBpZiAoY29uZi5wZXJpb2QuaGVydHogPCAwKSB7CisgICAgICAgICAgICBkb2xvZyAoIndhcm5pbmc6IFRpbWVyIHBlcmlvZCBpcyBuZWdhdGl2ZSAtICVkICIKKyAgICAgICAgICAgICAgICAgICAidHJlYXRpbmcgYXMgemVyb1xuIiwKKyAgICAgICAgICAgICAgICAgICBjb25mLnBlcmlvZC5oZXJ0eik7CisgICAgICAgIH0KKyAgICAgICAgY29uZi5wZXJpb2QudGlja3MgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbmYucGVyaW9kLnRpY2tzID0KKyAgICAgICAgICAgIG11bGRpdjY0ICgxLCBnZXRfdGlja3NfcGVyX3NlYyAoKSwgY29uZi5wZXJpb2QuaGVydHopOworICAgIH0KKworICAgIGUgPSBxZW11X2FkZF92bV9jaGFuZ2Vfc3RhdGVfaGFuZGxlciAoYXVkaW9fdm1fY2hhbmdlX3N0YXRlX2hhbmRsZXIsIHMpOworICAgIGlmICghZSkgeworICAgICAgICBkb2xvZyAoIndhcm5pbmc6IENvdWxkIG5vdCByZWdpc3RlciBjaGFuZ2Ugc3RhdGUgaGFuZGxlclxuIgorICAgICAgICAgICAgICAgIihBdWRpbyBjYW4gY29udGludWUgbG9vcGluZyBldmVuIGFmdGVyIHN0b3BwaW5nIHRoZSBWTSlcbiIpOworICAgIH0KKyAgICBpbml0aWFsaXplZCA9IDE7CisKKyAgICBRTElTVF9JTklUICgmcy0+Y2FyZF9oZWFkKTsKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwgImF1ZGlvIiwgMCwgMSwgYXVkaW9fc2F2ZSwgYXVkaW9fbG9hZCwgcyk7CisgICAgYXVkaW9fcmVzZXRfdGltZXIoKTsKK30KKwordm9pZCBBVURfcmVnaXN0ZXJfY2FyZCAoY29uc3QgY2hhciAqbmFtZSwgUUVNVVNvdW5kQ2FyZCAqY2FyZCkKK3sKKyAgICBhdWRpb19pbml0ICgpOworICAgIGNhcmQtPm5hbWUgPSBnX3N0cmR1cCAobmFtZSk7CisgICAgbWVtc2V0ICgmY2FyZC0+ZW50cmllcywgMCwgc2l6ZW9mIChjYXJkLT5lbnRyaWVzKSk7CisgICAgUUxJU1RfSU5TRVJUX0hFQUQgKCZnbG9iX2F1ZGlvX3N0YXRlLmNhcmRfaGVhZCwgY2FyZCwgZW50cmllcyk7Cit9CisKK3ZvaWQgQVVEX3JlbW92ZV9jYXJkIChRRU1VU291bmRDYXJkICpjYXJkKQoreworICAgIFFMSVNUX1JFTU9WRSAoY2FyZCwgZW50cmllcyk7CisgICAgZ19mcmVlIChjYXJkLT5uYW1lKTsKK30KKworCitDYXB0dXJlVm9pY2VPdXQgKkFVRF9hZGRfY2FwdHVyZSAoCisgICAgc3RydWN0IGF1ZHNldHRpbmdzICphcywKKyAgICBzdHJ1Y3QgYXVkaW9fY2FwdHVyZV9vcHMgKm9wcywKKyAgICB2b2lkICpjYl9vcGFxdWUKKyAgICApCit7CisgICAgQXVkaW9TdGF0ZSAqcyA9ICZnbG9iX2F1ZGlvX3N0YXRlOworICAgIENhcHR1cmVWb2ljZU91dCAqY2FwOworICAgIHN0cnVjdCBjYXB0dXJlX2NhbGxiYWNrICpjYjsKKworICAgIGlmIChhdWRpb192YWxpZGF0ZV9zZXR0aW5ncyAoYXMpKSB7CisgICAgICAgIGRvbG9nICgiSW52YWxpZCBzZXR0aW5ncyB3ZXJlIHBhc3NlZCB3aGVuIHRyeWluZyB0byBhZGQgY2FwdHVyZVxuIik7CisgICAgICAgIGF1ZGlvX3ByaW50X3NldHRpbmdzIChhcyk7CisgICAgICAgIGdvdG8gZXJyMDsKKyAgICB9CisKKyAgICBjYiA9IGF1ZGlvX2NhbGxvYyAoQVVESU9fRlVOQywgMSwgc2l6ZW9mICgqY2IpKTsKKyAgICBpZiAoIWNiKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGFsbG9jYXRlIGNhcHR1cmUgY2FsbGJhY2sgaW5mb3JtYXRpb24sIHNpemUgJXp1XG4iLAorICAgICAgICAgICAgICAgc2l6ZW9mICgqY2IpKTsKKyAgICAgICAgZ290byBlcnIwOworICAgIH0KKyAgICBjYi0+b3BzID0gKm9wczsKKyAgICBjYi0+b3BhcXVlID0gY2Jfb3BhcXVlOworCisgICAgY2FwID0gYXVkaW9fcGNtX2NhcHR1cmVfZmluZF9zcGVjaWZpYyAoYXMpOworICAgIGlmIChjYXApIHsKKyAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQgKCZjYXAtPmNiX2hlYWQsIGNiLCBlbnRyaWVzKTsKKyAgICAgICAgcmV0dXJuIGNhcDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEhXVm9pY2VPdXQgKmh3OworICAgICAgICBDYXB0dXJlVm9pY2VPdXQgKmNhcDsKKworICAgICAgICBjYXAgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIDEsIHNpemVvZiAoKmNhcCkpOworICAgICAgICBpZiAoIWNhcCkgeworICAgICAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgY2FwdHVyZSB2b2ljZSwgc2l6ZSAlenVcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mICgqY2FwKSk7CisgICAgICAgICAgICBnb3RvIGVycjE7CisgICAgICAgIH0KKworICAgICAgICBodyA9ICZjYXAtPmh3OworICAgICAgICBRTElTVF9JTklUICgmaHctPnN3X2hlYWQpOworICAgICAgICBRTElTVF9JTklUICgmY2FwLT5jYl9oZWFkKTsKKworICAgICAgICAvKiBYWFggZmluZCBhIG1vcmUgZWxlZ2FudCB3YXkgKi8KKyAgICAgICAgaHctPnNhbXBsZXMgPSA0MDk2ICogNDsKKyAgICAgICAgaHctPm1peF9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3Rfc2FtcGxlKSk7CisgICAgICAgIGlmICghaHctPm1peF9idWYpIHsKKyAgICAgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGFsbG9jYXRlIGNhcHR1cmUgbWl4IGJ1ZmZlciAoJWQgc2FtcGxlcylcbiIsCisgICAgICAgICAgICAgICAgICAgaHctPnNhbXBsZXMpOworICAgICAgICAgICAgZ290byBlcnIyOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCBhcyk7CisKKyAgICAgICAgY2FwLT5idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgaWYgKCFjYXAtPmJ1ZikgeworICAgICAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgY2FwdHVyZSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICIoJWQgc2FtcGxlcywgZWFjaCAlZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICAgICAgaHctPnNhbXBsZXMsIDEgPDwgaHctPmluZm8uc2hpZnQpOworICAgICAgICAgICAgZ290byBlcnIzOworICAgICAgICB9CisKKyAgICAgICAgaHctPmNsaXAgPSBtaXhlbmdfY2xpcAorICAgICAgICAgICAgW2h3LT5pbmZvLm5jaGFubmVscyA9PSAyXQorICAgICAgICAgICAgW2h3LT5pbmZvLnNpZ25dCisgICAgICAgICAgICBbaHctPmluZm8uc3dhcF9lbmRpYW5uZXNzXQorICAgICAgICAgICAgW2F1ZGlvX2JpdHNfdG9faW5kZXggKGh3LT5pbmZvLmJpdHMpXTsKKworICAgICAgICBRTElTVF9JTlNFUlRfSEVBRCAoJnMtPmNhcF9oZWFkLCBjYXAsIGVudHJpZXMpOworICAgICAgICBRTElTVF9JTlNFUlRfSEVBRCAoJmNhcC0+Y2JfaGVhZCwgY2IsIGVudHJpZXMpOworCisgICAgICAgIGh3ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKChodyA9IGF1ZGlvX3BjbV9od19maW5kX2FueV9vdXQgKGh3KSkpIHsKKyAgICAgICAgICAgIGF1ZGlvX2F0dGFjaF9jYXB0dXJlIChodyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhcDsKKworICAgIGVycjM6CisgICAgICAgIGdfZnJlZSAoY2FwLT5ody5taXhfYnVmKTsKKyAgICBlcnIyOgorICAgICAgICBnX2ZyZWUgKGNhcCk7CisgICAgZXJyMToKKyAgICAgICAgZ19mcmVlIChjYik7CisgICAgZXJyMDoKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCit2b2lkIEFVRF9kZWxfY2FwdHVyZSAoQ2FwdHVyZVZvaWNlT3V0ICpjYXAsIHZvaWQgKmNiX29wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgY2FwdHVyZV9jYWxsYmFjayAqY2I7CisKKyAgICBmb3IgKGNiID0gY2FwLT5jYl9oZWFkLmxoX2ZpcnN0OyBjYjsgY2IgPSBjYi0+ZW50cmllcy5sZV9uZXh0KSB7CisgICAgICAgIGlmIChjYi0+b3BhcXVlID09IGNiX29wYXF1ZSkgeworICAgICAgICAgICAgY2ItPm9wcy5kZXN0cm95IChjYl9vcGFxdWUpOworICAgICAgICAgICAgUUxJU1RfUkVNT1ZFIChjYiwgZW50cmllcyk7CisgICAgICAgICAgICBnX2ZyZWUgKGNiKTsKKworICAgICAgICAgICAgaWYgKCFjYXAtPmNiX2hlYWQubGhfZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBTV1ZvaWNlT3V0ICpzdyA9IGNhcC0+aHcuc3dfaGVhZC5saF9maXJzdCwgKnN3MTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChzdykgeworICAgICAgICAgICAgICAgICAgICBTV1ZvaWNlQ2FwICpzYyA9IChTV1ZvaWNlQ2FwICopIHN3OworI2lmZGVmIERFQlVHX0NBUFRVUkUKKyAgICAgICAgICAgICAgICAgICAgZG9sb2cgKCJmcmVlaW5nICVzXG4iLCBzdy0+bmFtZSk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICBzdzEgPSBzdy0+ZW50cmllcy5sZV9uZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAoc3ctPnJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0X3JhdGVfc3RvcCAoc3ctPnJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3ctPnJhdGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFFMSVNUX1JFTU9WRSAoc3csIGVudHJpZXMpOworICAgICAgICAgICAgICAgICAgICBRTElTVF9SRU1PVkUgKHNjLCBlbnRyaWVzKTsKKyAgICAgICAgICAgICAgICAgICAgZ19mcmVlIChzYyk7CisgICAgICAgICAgICAgICAgICAgIHN3ID0gc3cxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBRTElTVF9SRU1PVkUgKGNhcCwgZW50cmllcyk7CisgICAgICAgICAgICAgICAgZ19mcmVlIChjYXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFVRF9zZXRfdm9sdW1lX291dCAoU1dWb2ljZU91dCAqc3csIGludCBtdXRlLCB1aW50OF90IGx2b2wsIHVpbnQ4X3QgcnZvbCkKK3sKKyAgICBpZiAoc3cpIHsKKyAgICAgICAgc3ctPnZvbC5tdXRlID0gbXV0ZTsKKyAgICAgICAgc3ctPnZvbC5sID0gbm9taW5hbF92b2x1bWUubCAqIGx2b2wgLyAyNTU7CisgICAgICAgIHN3LT52b2wuciA9IG5vbWluYWxfdm9sdW1lLnIgKiBydm9sIC8gMjU1OworICAgIH0KK30KKwordm9pZCBBVURfc2V0X3ZvbHVtZV9pbiAoU1dWb2ljZUluICpzdywgaW50IG11dGUsIHVpbnQ4X3QgbHZvbCwgdWludDhfdCBydm9sKQoreworICAgIGlmIChzdykgeworICAgICAgICBzdy0+dm9sLm11dGUgPSBtdXRlOworICAgICAgICBzdy0+dm9sLmwgPSBub21pbmFsX3ZvbHVtZS5sICogbHZvbCAvIDI1NTsKKyAgICAgICAgc3ctPnZvbC5yID0gbm9taW5hbF92b2x1bWUuciAqIHJ2b2wgLyAyNTU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpby5oIGIvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTdjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBRRU1VIEF1ZGlvIHN1YnN5c3RlbSBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgUUVNVV9BVURJT19ICisjZGVmaW5lIFFFTVVfQVVESU9fSAorCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIgIC8qIEZvciBRRU1VVGltZXIgKi8KKwordHlwZWRlZiB2b2lkICgqYXVkaW9fY2FsbGJhY2tfZm4pICh2b2lkICpvcGFxdWUsIGludCBhdmFpbCk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVVEX0ZNVF9VOCwKKyAgICBBVURfRk1UX1M4LAorICAgIEFVRF9GTVRfVTE2LAorICAgIEFVRF9GTVRfUzE2LAorICAgIEFVRF9GTVRfVTMyLAorICAgIEFVRF9GTVRfUzMyCit9IGF1ZGZtdF9lOworCisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgQVVESU9fSE9TVF9FTkRJQU5ORVNTIDEKKyNlbHNlCisjZGVmaW5lIEFVRElPX0hPU1RfRU5ESUFOTkVTUyAwCisjZW5kaWYKKworc3RydWN0IGF1ZHNldHRpbmdzIHsKKyAgICBpbnQgZnJlcTsKKyAgICBpbnQgbmNoYW5uZWxzOworICAgIGF1ZGZtdF9lIGZtdDsKKyAgICBpbnQgZW5kaWFubmVzczsKK307CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVVEX0NOT1RJRllfRU5BQkxFLAorICAgIEFVRF9DTk9USUZZX0RJU0FCTEUKK30gYXVkY25vdGlmaWNhdGlvbl9lOworCitzdHJ1Y3QgYXVkaW9fY2FwdHVyZV9vcHMgeworICAgIHZvaWQgKCpub3RpZnkpICh2b2lkICpvcGFxdWUsIGF1ZGNub3RpZmljYXRpb25fZSBjbWQpOworICAgIHZvaWQgKCpjYXB0dXJlKSAodm9pZCAqb3BhcXVlLCB2b2lkICpidWYsIGludCBzaXplKTsKKyAgICB2b2lkICgqZGVzdHJveSkgKHZvaWQgKm9wYXF1ZSk7Cit9OworCitzdHJ1Y3QgY2FwdHVyZV9vcHMgeworICAgIHZvaWQgKCppbmZvKSAodm9pZCAqb3BhcXVlKTsKKyAgICB2b2lkICgqZGVzdHJveSkgKHZvaWQgKm9wYXF1ZSk7Cit9OworCit0eXBlZGVmIHN0cnVjdCBDYXB0dXJlU3RhdGUgeworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBzdHJ1Y3QgY2FwdHVyZV9vcHMgb3BzOworICAgIFFMSVNUX0VOVFJZIChDYXB0dXJlU3RhdGUpIGVudHJpZXM7Cit9IENhcHR1cmVTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgU1dWb2ljZU91dCBTV1ZvaWNlT3V0OwordHlwZWRlZiBzdHJ1Y3QgQ2FwdHVyZVZvaWNlT3V0IENhcHR1cmVWb2ljZU91dDsKK3R5cGVkZWYgc3RydWN0IFNXVm9pY2VJbiBTV1ZvaWNlSW47CisKK3R5cGVkZWYgc3RydWN0IFFFTVVTb3VuZENhcmQgeworICAgIGNoYXIgKm5hbWU7CisgICAgUUxJU1RfRU5UUlkgKFFFTVVTb3VuZENhcmQpIGVudHJpZXM7Cit9IFFFTVVTb3VuZENhcmQ7CisKK3R5cGVkZWYgc3RydWN0IFFFTVVBdWRpb1RpbWVTdGFtcCB7CisgICAgdWludDY0X3Qgb2xkX3RzOworfSBRRU1VQXVkaW9UaW1lU3RhbXA7CisKK3ZvaWQgQVVEX3Zsb2cgKGNvbnN0IGNoYXIgKmNhcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKK3ZvaWQgQVVEX2xvZyAoY29uc3QgY2hhciAqY2FwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKyNpZmRlZiBfX0dOVUNfXworICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAyLCAzKSkpCisjZW5kaWYKKyAgICA7CisKK3ZvaWQgQVVEX2hlbHAgKHZvaWQpOwordm9pZCBBVURfcmVnaXN0ZXJfY2FyZCAoY29uc3QgY2hhciAqbmFtZSwgUUVNVVNvdW5kQ2FyZCAqY2FyZCk7Cit2b2lkIEFVRF9yZW1vdmVfY2FyZCAoUUVNVVNvdW5kQ2FyZCAqY2FyZCk7CitDYXB0dXJlVm9pY2VPdXQgKkFVRF9hZGRfY2FwdHVyZSAoCisgICAgc3RydWN0IGF1ZHNldHRpbmdzICphcywKKyAgICBzdHJ1Y3QgYXVkaW9fY2FwdHVyZV9vcHMgKm9wcywKKyAgICB2b2lkICpvcGFxdWUKKyAgICApOwordm9pZCBBVURfZGVsX2NhcHR1cmUgKENhcHR1cmVWb2ljZU91dCAqY2FwLCB2b2lkICpjYl9vcGFxdWUpOworCitTV1ZvaWNlT3V0ICpBVURfb3Blbl9vdXQgKAorICAgIFFFTVVTb3VuZENhcmQgKmNhcmQsCisgICAgU1dWb2ljZU91dCAqc3csCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICB2b2lkICpjYWxsYmFja19vcGFxdWUsCisgICAgYXVkaW9fY2FsbGJhY2tfZm4gY2FsbGJhY2tfZm4sCisgICAgc3RydWN0IGF1ZHNldHRpbmdzICpzZXR0aW5ncworICAgICk7CisKK3ZvaWQgQVVEX2Nsb3NlX291dCAoUUVNVVNvdW5kQ2FyZCAqY2FyZCwgU1dWb2ljZU91dCAqc3cpOworaW50ICBBVURfd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpwY21fYnVmLCBpbnQgc2l6ZSk7CitpbnQgIEFVRF9nZXRfYnVmZmVyX3NpemVfb3V0IChTV1ZvaWNlT3V0ICpzdyk7Cit2b2lkIEFVRF9zZXRfYWN0aXZlX291dCAoU1dWb2ljZU91dCAqc3csIGludCBvbik7CitpbnQgIEFVRF9pc19hY3RpdmVfb3V0IChTV1ZvaWNlT3V0ICpzdyk7CisKK3ZvaWQgICAgIEFVRF9pbml0X3RpbWVfc3RhbXBfb3V0IChTV1ZvaWNlT3V0ICpzdywgUUVNVUF1ZGlvVGltZVN0YW1wICp0cyk7Cit1aW50NjRfdCBBVURfZ2V0X2VsYXBzZWRfdXNlY19vdXQgKFNXVm9pY2VPdXQgKnN3LCBRRU1VQXVkaW9UaW1lU3RhbXAgKnRzKTsKKwordm9pZCBBVURfc2V0X3ZvbHVtZV9vdXQgKFNXVm9pY2VPdXQgKnN3LCBpbnQgbXV0ZSwgdWludDhfdCBsdm9sLCB1aW50OF90IHJ2b2wpOwordm9pZCBBVURfc2V0X3ZvbHVtZV9pbiAoU1dWb2ljZUluICpzdywgaW50IG11dGUsIHVpbnQ4X3QgbHZvbCwgdWludDhfdCBydm9sKTsKKworU1dWb2ljZUluICpBVURfb3Blbl9pbiAoCisgICAgUUVNVVNvdW5kQ2FyZCAqY2FyZCwKKyAgICBTV1ZvaWNlSW4gKnN3LAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdm9pZCAqY2FsbGJhY2tfb3BhcXVlLAorICAgIGF1ZGlvX2NhbGxiYWNrX2ZuIGNhbGxiYWNrX2ZuLAorICAgIHN0cnVjdCBhdWRzZXR0aW5ncyAqc2V0dGluZ3MKKyAgICApOworCit2b2lkIEFVRF9jbG9zZV9pbiAoUUVNVVNvdW5kQ2FyZCAqY2FyZCwgU1dWb2ljZUluICpzdyk7CitpbnQgIEFVRF9yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpwY21fYnVmLCBpbnQgc2l6ZSk7Cit2b2lkIEFVRF9zZXRfYWN0aXZlX2luIChTV1ZvaWNlSW4gKnN3LCBpbnQgb24pOworaW50ICBBVURfaXNfYWN0aXZlX2luIChTV1ZvaWNlSW4gKnN3KTsKKwordm9pZCAgICAgQVVEX2luaXRfdGltZV9zdGFtcF9pbiAoU1dWb2ljZUluICpzdywgUUVNVUF1ZGlvVGltZVN0YW1wICp0cyk7Cit1aW50NjRfdCBBVURfZ2V0X2VsYXBzZWRfdXNlY19pbiAoU1dWb2ljZUluICpzdywgUUVNVUF1ZGlvVGltZVN0YW1wICp0cyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYWR2YW5jZSAodm9pZCAqcCwgaW50IGluY3IpCit7CisgICAgdWludDhfdCAqZCA9IHA7CisgICAgcmV0dXJuIChkICsgaW5jcik7Cit9CisKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBhdWRpb19NSU4oYSwgYikgKCBfX2V4dGVuc2lvbl9fICh7ICAgICAgXAorICAgIF9fdHlwZW9mIChhKSB0YSA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdHlwZW9mIChiKSB0YiA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgodGEpPih0Yik/KHRiKToodGEpKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSkpCisKKyNkZWZpbmUgYXVkaW9fTUFYKGEsIGIpICggX19leHRlbnNpb25fXyAoeyAgICAgIFwKKyAgICBfX3R5cGVvZiAoYSkgdGEgPSBhOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3R5cGVvZiAoYikgdGIgPSBiOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHRhKTwodGIpPyh0Yik6KHRhKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30pKQorI2Vsc2UKKyNkZWZpbmUgYXVkaW9fTUlOKGEsIGIpICgoYSk+KGIpPyhiKTooYSkpCisjZGVmaW5lIGF1ZGlvX01BWChhLCBiKSAoKGEpPChiKT8oYik6KGEpKQorI2VuZGlmCisKK2ludCB3YXZfc3RhcnRfY2FwdHVyZSAoQ2FwdHVyZVN0YXRlICpzLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsIGludCBuY2hhbm5lbHMpOworCitleHRlcm4gaW50CithdWRpb19nZXRfYmFja2VuZF9jb3VudCggaW50ICBpc19pbnB1dCApOworCitleHRlcm4gY29uc3QgY2hhcioKK2F1ZGlvX2dldF9iYWNrZW5kX25hbWUoIGludCAgIGlzX2lucHV0LCBpbnQgIGluZGV4LCBjb25zdCBjaGFyKiAgKnBpbmZvICk7CisKK2V4dGVybiBpbnQKK2F1ZGlvX2NoZWNrX2JhY2tlbmRfbmFtZSggaW50ICBpc19pbnB1dCwgY29uc3QgY2hhciogIG5hbWUgKTsKKworI2VuZGlmICAvKiBhdWRpby5oICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX2ludC5oIGIvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpb19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI3Zjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpb19pbnQuaApAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIFFFTVUgQXVkaW8gc3Vic3lzdGVtIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IFZhc3NpbGkgS2FycG92IChtYWxjKQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBRRU1VX0FVRElPX0lOVF9ICisjZGVmaW5lIFFFTVVfQVVESU9fSU5UX0gKKworI2luY2x1ZGUgImF1ZGlvL2F1ZGlvLmgiCisKKyNpZmRlZiBDT05GSUdfQ09SRUFVRElPCisjZGVmaW5lIEZMT0FUX01JWEVORworLyogI2RlZmluZSBSRUNJUFJPQ0FMICovCisjZW5kaWYKKyNpbmNsdWRlICJtaXhlbmcuaCIKKworc3RydWN0IGF1ZGlvX3BjbV9vcHM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVVEX09QVF9JTlQsCisgICAgQVVEX09QVF9GTVQsCisgICAgQVVEX09QVF9TVFIsCisgICAgQVVEX09QVF9CT09MCit9IGF1ZGlvX29wdGlvbl90YWdfZTsKKworc3RydWN0IGF1ZGlvX29wdGlvbiB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBhdWRpb19vcHRpb25fdGFnX2UgdGFnOworICAgIHZvaWQgKnZhbHA7CisgICAgY29uc3QgY2hhciAqZGVzY3I7CisgICAgaW50ICpvdmVycmlkZGVucDsKKyAgICBpbnQgb3ZlcnJpZGRlbjsKK307CisKK3N0cnVjdCBhdWRpb19jYWxsYmFjayB7CisgICAgdm9pZCAqb3BhcXVlOworICAgIGF1ZGlvX2NhbGxiYWNrX2ZuIGZuOworfTsKKworc3RydWN0IGF1ZGlvX3BjbV9pbmZvIHsKKyAgICBpbnQgYml0czsKKyAgICBpbnQgc2lnbjsKKyAgICBpbnQgZnJlcTsKKyAgICBpbnQgbmNoYW5uZWxzOworICAgIGludCBhbGlnbjsKKyAgICBpbnQgc2hpZnQ7CisgICAgaW50IGJ5dGVzX3Blcl9zZWNvbmQ7CisgICAgaW50IHN3YXBfZW5kaWFubmVzczsKK307CisKK3R5cGVkZWYgc3RydWN0IFNXVm9pY2VDYXAgU1dWb2ljZUNhcDsKKwordHlwZWRlZiBzdHJ1Y3QgSFdWb2ljZU91dCB7CisgICAgaW50IGVuYWJsZWQ7CisgICAgaW50IHBvbGxfbW9kZTsKKyAgICBpbnQgcGVuZGluZ19kaXNhYmxlOworICAgIHN0cnVjdCBhdWRpb19wY21faW5mbyBpbmZvOworCisgICAgZl9zYW1wbGUgKmNsaXA7CisKKyAgICBpbnQgcnBvczsKKyAgICB1aW50NjRfdCB0c19oZWxwZXI7CisKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICptaXhfYnVmOworCisgICAgaW50IHNhbXBsZXM7CisgICAgUUxJU1RfSEVBRCAoc3dfb3V0X2xpc3RoZWFkLCBTV1ZvaWNlT3V0KSBzd19oZWFkOworICAgIFFMSVNUX0hFQUQgKHN3X2NhcF9saXN0aGVhZCwgU1dWb2ljZUNhcCkgY2FwX2hlYWQ7CisgICAgc3RydWN0IGF1ZGlvX3BjbV9vcHMgKnBjbV9vcHM7CisgICAgUUxJU1RfRU5UUlkgKEhXVm9pY2VPdXQpIGVudHJpZXM7Cit9IEhXVm9pY2VPdXQ7CisKK3R5cGVkZWYgc3RydWN0IEhXVm9pY2VJbiB7CisgICAgaW50IGVuYWJsZWQ7CisgICAgaW50IHBvbGxfbW9kZTsKKyAgICBzdHJ1Y3QgYXVkaW9fcGNtX2luZm8gaW5mbzsKKworICAgIHRfc2FtcGxlICpjb252OworCisgICAgaW50IHdwb3M7CisgICAgaW50IHRvdGFsX3NhbXBsZXNfY2FwdHVyZWQ7CisgICAgdWludDY0X3QgdHNfaGVscGVyOworCisgICAgc3RydWN0IHN0X3NhbXBsZSAqY29udl9idWY7CisKKyAgICBpbnQgc2FtcGxlczsKKyAgICBRTElTVF9IRUFEIChzd19pbl9saXN0aGVhZCwgU1dWb2ljZUluKSBzd19oZWFkOworICAgIHN0cnVjdCBhdWRpb19wY21fb3BzICpwY21fb3BzOworICAgIFFMSVNUX0VOVFJZIChIV1ZvaWNlSW4pIGVudHJpZXM7Cit9IEhXVm9pY2VJbjsKKworc3RydWN0IFNXVm9pY2VPdXQgeworICAgIFFFTVVTb3VuZENhcmQgKmNhcmQ7CisgICAgc3RydWN0IGF1ZGlvX3BjbV9pbmZvIGluZm87CisgICAgdF9zYW1wbGUgKmNvbnY7CisgICAgaW50NjRfdCByYXRpbzsKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICpidWY7CisgICAgdm9pZCAqcmF0ZTsKKyAgICBpbnQgdG90YWxfaHdfc2FtcGxlc19taXhlZDsKKyAgICBpbnQgYWN0aXZlOworICAgIGludCBlbXB0eTsKKyAgICBIV1ZvaWNlT3V0ICpodzsKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBtaXhlbmdfdm9sdW1lIHZvbDsKKyAgICBzdHJ1Y3QgYXVkaW9fY2FsbGJhY2sgY2FsbGJhY2s7CisgICAgUUxJU1RfRU5UUlkgKFNXVm9pY2VPdXQpIGVudHJpZXM7Cit9OworCitzdHJ1Y3QgU1dWb2ljZUluIHsKKyAgICBRRU1VU291bmRDYXJkICpjYXJkOworICAgIGludCBhY3RpdmU7CisgICAgc3RydWN0IGF1ZGlvX3BjbV9pbmZvIGluZm87CisgICAgaW50NjRfdCByYXRpbzsKKyAgICB2b2lkICpyYXRlOworICAgIGludCB0b3RhbF9od19zYW1wbGVzX2FjcXVpcmVkOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKmJ1ZjsKKyAgICBmX3NhbXBsZSAqY2xpcDsKKyAgICBIV1ZvaWNlSW4gKmh3OworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IG1peGVuZ192b2x1bWUgdm9sOworICAgIHN0cnVjdCBhdWRpb19jYWxsYmFjayBjYWxsYmFjazsKKyAgICBRTElTVF9FTlRSWSAoU1dWb2ljZUluKSBlbnRyaWVzOworfTsKKworc3RydWN0IGF1ZGlvX2RyaXZlciB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXNjcjsKKyAgICBzdHJ1Y3QgYXVkaW9fb3B0aW9uICpvcHRpb25zOworICAgIHZvaWQgKigqaW5pdCkgKHZvaWQpOworICAgIHZvaWQgKCpmaW5pKSAodm9pZCAqKTsKKyAgICBzdHJ1Y3QgYXVkaW9fcGNtX29wcyAqcGNtX29wczsKKyAgICBpbnQgY2FuX2JlX2RlZmF1bHQ7CisgICAgaW50IG1heF92b2ljZXNfb3V0OworICAgIGludCBtYXhfdm9pY2VzX2luOworICAgIGludCB2b2ljZV9zaXplX291dDsKKyAgICBpbnQgdm9pY2Vfc2l6ZV9pbjsKK307CisKK3N0cnVjdCBhdWRpb19wY21fb3BzIHsKKyAgICBpbnQgICgqaW5pdF9vdXQpKEhXVm9pY2VPdXQgKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKTsKKyAgICB2b2lkICgqZmluaV9vdXQpKEhXVm9pY2VPdXQgKmh3KTsKKyAgICBpbnQgICgqcnVuX291dCkgKEhXVm9pY2VPdXQgKmh3LCBpbnQgbGl2ZSk7CisgICAgaW50ICAoKndyaXRlKSAgIChTV1ZvaWNlT3V0ICpzdywgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CisgICAgaW50ICAoKmN0bF9vdXQpIChIV1ZvaWNlT3V0ICpodywgaW50IGNtZCwgLi4uKTsKKworICAgIGludCAgKCppbml0X2luKSAoSFdWb2ljZUluICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcyk7CisgICAgdm9pZCAoKmZpbmlfaW4pIChIV1ZvaWNlSW4gKmh3KTsKKyAgICBpbnQgICgqcnVuX2luKSAgKEhXVm9pY2VJbiAqaHcpOworICAgIGludCAgKCpyZWFkKSAgICAoU1dWb2ljZUluICpzdywgdm9pZCAqYnVmLCBpbnQgc2l6ZSk7CisgICAgaW50ICAoKmN0bF9pbikgIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pOworfTsKKworc3RydWN0IGNhcHR1cmVfY2FsbGJhY2sgeworICAgIHN0cnVjdCBhdWRpb19jYXB0dXJlX29wcyBvcHM7CisgICAgdm9pZCAqb3BhcXVlOworICAgIFFMSVNUX0VOVFJZIChjYXB0dXJlX2NhbGxiYWNrKSBlbnRyaWVzOworfTsKKworc3RydWN0IENhcHR1cmVWb2ljZU91dCB7CisgICAgSFdWb2ljZU91dCBodzsKKyAgICB2b2lkICpidWY7CisgICAgUUxJU1RfSEVBRCAoY2JfbGlzdGhlYWQsIGNhcHR1cmVfY2FsbGJhY2spIGNiX2hlYWQ7CisgICAgUUxJU1RfRU5UUlkgKENhcHR1cmVWb2ljZU91dCkgZW50cmllczsKK307CisKK3N0cnVjdCBTV1ZvaWNlQ2FwIHsKKyAgICBTV1ZvaWNlT3V0IHN3OworICAgIENhcHR1cmVWb2ljZU91dCAqY2FwOworICAgIFFMSVNUX0VOVFJZIChTV1ZvaWNlQ2FwKSBlbnRyaWVzOworfTsKKworc3RydWN0IEF1ZGlvU3RhdGUgeworICAgIHN0cnVjdCBhdWRpb19kcml2ZXIgKmRydjsKKyAgICB2b2lkICpkcnZfb3BhcXVlOworCisgICAgUUVNVVRpbWVyICp0czsKKyAgICBRTElTVF9IRUFEIChjYXJkX2xpc3RoZWFkLCBRRU1VU291bmRDYXJkKSBjYXJkX2hlYWQ7CisgICAgUUxJU1RfSEVBRCAoaHdfaW5fbGlzdGhlYWQsIEhXVm9pY2VJbikgaHdfaGVhZF9pbjsKKyAgICBRTElTVF9IRUFEIChod19vdXRfbGlzdGhlYWQsIEhXVm9pY2VPdXQpIGh3X2hlYWRfb3V0OworICAgIFFMSVNUX0hFQUQgKGNhcF9saXN0aGVhZCwgQ2FwdHVyZVZvaWNlT3V0KSBjYXBfaGVhZDsKKyAgICBpbnQgbmJfaHdfdm9pY2VzX291dDsKKyAgICBpbnQgbmJfaHdfdm9pY2VzX2luOworICAgIGludCB2bV9ydW5uaW5nOworfTsKKworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgbm9fYXVkaW9fZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgb3NzX2F1ZGlvX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHNkbF9hdWRpb19kcml2ZXI7CitleHRlcm4gc3RydWN0IGF1ZGlvX2RyaXZlciB3aW5fYXVkaW9fZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgd2F2X2F1ZGlvX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgYXVkaW9fZHJpdmVyIGZtb2RfYXVkaW9fZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgYWxzYV9hdWRpb19kcml2ZXI7CitleHRlcm4gc3RydWN0IGF1ZGlvX2RyaXZlciBjb3JlYXVkaW9fYXVkaW9fZHJpdmVyOworZXh0ZXJuIHN0cnVjdCBhdWRpb19kcml2ZXIgZHNvdW5kX2F1ZGlvX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgYXVkaW9fZHJpdmVyIGVzZF9hdWRpb19kcml2ZXI7CitleHRlcm4gc3RydWN0IGF1ZGlvX2RyaXZlciBwYV9hdWRpb19kcml2ZXI7CitleHRlcm4gc3RydWN0IGF1ZGlvX2RyaXZlciB3aW53YXZlX2F1ZGlvX2RyaXZlcjsKK2V4dGVybiBzdHJ1Y3QgbWl4ZW5nX3ZvbHVtZSBub21pbmFsX3ZvbHVtZTsKKwordm9pZCBhdWRpb19wY21faW5pdF9pbmZvIChzdHJ1Y3QgYXVkaW9fcGNtX2luZm8gKmluZm8sIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpOwordm9pZCBhdWRpb19wY21faW5mb19jbGVhcl9idWYgKHN0cnVjdCBhdWRpb19wY21faW5mbyAqaW5mbywgdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworaW50ICBhdWRpb19wY21fc3dfd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpidWYsIGludCBsZW4pOworaW50ICBhdWRpb19wY21faHdfZ2V0X2xpdmVfaW4gKEhXVm9pY2VJbiAqaHcpOworCitpbnQgIGF1ZGlvX3BjbV9zd19yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBsZW4pOworCitpbnQgYXVkaW9fcGNtX2h3X2NsaXBfb3V0IChIV1ZvaWNlT3V0ICpodywgdm9pZCAqcGNtX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXZlLCBpbnQgcGVuZGluZyk7CisKK2ludCBhdWRpb19idWcgKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgY29uZCk7Cit2b2lkICphdWRpb19jYWxsb2MgKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgbm1lbWIsIHNpemVfdCBzaXplKTsKKwordm9pZCBhdWRpb19ydW4gKGNvbnN0IGNoYXIgKm1zZyk7CisKKyNkZWZpbmUgVk9JQ0VfRU5BQkxFIDEKKyNkZWZpbmUgVk9JQ0VfRElTQUJMRSAyCisjZGVmaW5lIFZPSUNFX1ZPTFVNRSAzCisKKyNkZWZpbmUgVk9JQ0VfVk9MVU1FX0NBUCAoMSA8PCBWT0lDRV9WT0xVTUUpCisKK3N0YXRpYyBpbmxpbmUgaW50IGF1ZGlvX3JpbmdfZGlzdCAoaW50IGRzdCwgaW50IHNyYywgaW50IGxlbikKK3sKKyAgICByZXR1cm4gKGRzdCA+PSBzcmMpID8gKGRzdCAtIHNyYykgOiAobGVuIC0gc3JjICsgZHN0KTsKK30KKworI2lmIGRlZmluZWQgX19HTlVDX18KKyNkZWZpbmUgSU5JVF9GSUVMRChmKSAuIGYKKyNlbHNlCisjZGVmaW5lIElOSVRfRklFTEQoZikgLyoqLworI2VuZGlmCisKKyNkZWZpbmUgZG9sb2coZm10LCAuLi4pIEFVRF9sb2coQVVESU9fQ0FQLCBmbXQsICMjIF9fVkFfQVJHU19fKQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgbGRlYnVnKGZtdCwgLi4uKSBBVURfbG9nKEFVRElPX0NBUCwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIGxkZWJ1ZyhmbXQsIC4uLikgKHZvaWQpMAorI2VuZGlmCisKKyNkZWZpbmUgQVVESU9fU1RSSU5HSUZZXyhuKSAjbgorI2RlZmluZSBBVURJT19TVFJJTkdJRlkobikgQVVESU9fU1RSSU5HSUZZXyhuKQorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fR05VQ19fCisjZGVmaW5lIEFVRElPX0ZVTkMgX19GVU5DVElPTl9fCisjZWxzZQorI2RlZmluZSBBVURJT19GVU5DIF9fRklMRV9fICI6IiBBVURJT19TVFJJTkdJRlkgKF9fTElORV9fKQorI2VuZGlmCisKKyNlbmRpZiAvKiBhdWRpb19pbnQuaCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9hdWRpb19wdF9pbnQuYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fcHRfaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1Y2M3MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fcHRfaW50LmMKQEAgLTAsMCArMSwxNzQgQEAKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgQVVESU9fQ0FQICJhdWRpby1wdCIKKworI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorI2luY2x1ZGUgImF1ZGlvX3B0X2ludC5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkIGxvZ2VyciAoc3RydWN0IGF1ZGlvX3B0ICpwdCwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgICBBVURfdmxvZyAocHQtPmRydiwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBBVURfbG9nIChOVUxMLCAiXG4iKTsKKyAgICBBVURfbG9nIChwdC0+ZHJ2LCAiUmVhc29uOiAlc1xuIiwgc3RyZXJyb3IgKGVycikpOworfQorCitpbnQgYXVkaW9fcHRfaW5pdCAoc3RydWN0IGF1ZGlvX3B0ICpwLCB2b2lkICooKmZ1bmMpICh2b2lkICopLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqZHJ2LCBjb25zdCBjaGFyICpjYXApCit7CisgICAgaW50IGVyciwgZXJyMjsKKyAgICBjb25zdCBjaGFyICplZnVuYzsKKyAgICBzaWdzZXRfdCBzZXQsIG9sZF9zZXQ7CisKKyAgICBwLT5kcnYgPSBkcnY7CisKKyAgICBlcnIgPSBzaWdmaWxsc2V0ICgmc2V0KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGxvZ2VyciAocCwgZXJybm8sICIlcyglcyk6IHNpZ2ZpbGxzZXQgZmFpbGVkIiwgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCAoJnAtPm11dGV4LCBOVUxMKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGVmdW5jID0gInB0aHJlYWRfbXV0ZXhfaW5pdCI7CisgICAgICAgIGdvdG8gZXJyMDsKKyAgICB9CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfaW5pdCAoJnAtPmNvbmQsIE5VTEwpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZWZ1bmMgPSAicHRocmVhZF9jb25kX2luaXQiOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorCisgICAgZXJyID0gcHRocmVhZF9zaWdtYXNrIChTSUdfQkxPQ0ssICZzZXQsICZvbGRfc2V0KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGVmdW5jID0gInB0aHJlYWRfc2lnbWFzayI7CisgICAgICAgIGdvdG8gZXJyMjsKKyAgICB9CisKKyAgICBlcnIgPSBwdGhyZWFkX2NyZWF0ZSAoJnAtPnRocmVhZCwgTlVMTCwgZnVuYywgb3BhcXVlKTsKKworICAgIGVycjIgPSBwdGhyZWFkX3NpZ21hc2sgKFNJR19TRVRNQVNLLCAmb2xkX3NldCwgTlVMTCk7CisgICAgaWYgKGVycjIpIHsKKyAgICAgICAgbG9nZXJyIChwLCBlcnIyLCAiJXMoJXMpOiBwdGhyZWFkX3NpZ21hc2sgKHJlc3RvcmUpIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgLyogV2UgaGF2ZSBmYWlsZWQgdG8gcmVzdG9yZSBvcmlnaW5hbCBzaWduYWwgbWFzaywgYWxsIGJldHMgYXJlIG9mZiwKKyAgICAgICAgICAgc28gdGVybWluYXRlIHRoZSBwcm9jZXNzICovCisgICAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgaWYgKGVycikgeworICAgICAgICBlZnVuYyA9ICJwdGhyZWFkX2NyZWF0ZSI7CisgICAgICAgIGdvdG8gZXJyMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworIGVycjI6CisgICAgZXJyMiA9IHB0aHJlYWRfY29uZF9kZXN0cm95ICgmcC0+Y29uZCk7CisgICAgaWYgKGVycjIpIHsKKyAgICAgICAgbG9nZXJyIChwLCBlcnIyLCAiJXMoJXMpOiBwdGhyZWFkX2NvbmRfZGVzdHJveSBmYWlsZWQiLCBjYXAsIEFVRElPX0ZVTkMpOworICAgIH0KKworIGVycjE6CisgICAgZXJyMiA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJnAtPm11dGV4KTsKKyAgICBpZiAoZXJyMikgeworICAgICAgICBsb2dlcnIgKHAsIGVycjIsICIlcyglcyk6IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSBmYWlsZWQiLCBjYXAsIEFVRElPX0ZVTkMpOworICAgIH0KKworIGVycjA6CisgICAgbG9nZXJyIChwLCBlcnIsICIlcyglcyk6ICVzIGZhaWxlZCIsIGNhcCwgQVVESU9fRlVOQywgZWZ1bmMpOworICAgIHJldHVybiAtMTsKK30KKworaW50IGF1ZGlvX3B0X2ZpbmkgKHN0cnVjdCBhdWRpb19wdCAqcCwgY29uc3QgY2hhciAqY2FwKQoreworICAgIGludCBlcnIsIHJldCA9IDA7CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSAoJnAtPmNvbmQpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgbG9nZXJyIChwLCBlcnIsICIlcyglcyk6IHB0aHJlYWRfY29uZF9kZXN0cm95IGZhaWxlZCIsIGNhcCwgQVVESU9fRlVOQyk7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoJnAtPm11dGV4KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGxvZ2VyciAocCwgZXJyLCAiJXMoJXMpOiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgZmFpbGVkIiwgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdWRpb19wdF9sb2NrIChzdHJ1Y3QgYXVkaW9fcHQgKnAsIGNvbnN0IGNoYXIgKmNhcCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9tdXRleF9sb2NrICgmcC0+bXV0ZXgpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgbG9nZXJyIChwLCBlcnIsICIlcyglcyk6IHB0aHJlYWRfbXV0ZXhfbG9jayBmYWlsZWQiLCBjYXAsIEFVRElPX0ZVTkMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXVkaW9fcHRfdW5sb2NrIChzdHJ1Y3QgYXVkaW9fcHQgKnAsIGNvbnN0IGNoYXIgKmNhcCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9tdXRleF91bmxvY2sgKCZwLT5tdXRleCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsb2dlcnIgKHAsIGVyciwgIiVzKCVzKTogcHRocmVhZF9tdXRleF91bmxvY2sgZmFpbGVkIiwgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF1ZGlvX3B0X3dhaXQgKHN0cnVjdCBhdWRpb19wdCAqcCwgY29uc3QgY2hhciAqY2FwKQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfd2FpdCAoJnAtPmNvbmQsICZwLT5tdXRleCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsb2dlcnIgKHAsIGVyciwgIiVzKCVzKTogcHRocmVhZF9jb25kX3dhaXQgZmFpbGVkIiwgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsIChzdHJ1Y3QgYXVkaW9fcHQgKnAsIGNvbnN0IGNoYXIgKmNhcCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9tdXRleF91bmxvY2sgKCZwLT5tdXRleCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsb2dlcnIgKHAsIGVyciwgIiVzKCVzKTogcHRocmVhZF9tdXRleF91bmxvY2sgZmFpbGVkIiwgY2FwLCBBVURJT19GVU5DKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfc2lnbmFsICgmcC0+Y29uZCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsb2dlcnIgKHAsIGVyciwgIiVzKCVzKTogcHRocmVhZF9jb25kX3NpZ25hbCBmYWlsZWQiLCBjYXAsIEFVRElPX0ZVTkMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgYXVkaW9fcHRfam9pbiAoc3RydWN0IGF1ZGlvX3B0ICpwLCB2b2lkICoqYXJnLCBjb25zdCBjaGFyICpjYXApCit7CisgICAgaW50IGVycjsKKyAgICB2b2lkICpyZXQ7CisKKyAgICBlcnIgPSBwdGhyZWFkX2pvaW4gKHAtPnRocmVhZCwgJnJldCk7CisgICAgaWYgKGVycikgeworICAgICAgICBsb2dlcnIgKHAsIGVyciwgIiVzKCVzKTogcHRocmVhZF9qb2luIGZhaWxlZCIsIGNhcCwgQVVESU9fRlVOQyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmFyZyA9IHJldDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fcHRfaW50LmggYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3B0X2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmZmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3B0X2ludC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgUUVNVV9BVURJT19QVF9JTlRfSAorI2RlZmluZSBRRU1VX0FVRElPX1BUX0lOVF9ICisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK3N0cnVjdCBhdWRpb19wdCB7CisgICAgY29uc3QgY2hhciAqZHJ2OworICAgIHB0aHJlYWRfdCB0aHJlYWQ7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7Cit9OworCitpbnQgYXVkaW9fcHRfaW5pdCAoc3RydWN0IGF1ZGlvX3B0ICosIHZvaWQgKigqKSAodm9pZCAqKSwgdm9pZCAqLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2ludCBhdWRpb19wdF9maW5pIChzdHJ1Y3QgYXVkaW9fcHQgKiwgY29uc3QgY2hhciAqKTsKK2ludCBhdWRpb19wdF9sb2NrIChzdHJ1Y3QgYXVkaW9fcHQgKiwgY29uc3QgY2hhciAqKTsKK2ludCBhdWRpb19wdF91bmxvY2sgKHN0cnVjdCBhdWRpb19wdCAqLCBjb25zdCBjaGFyICopOworaW50IGF1ZGlvX3B0X3dhaXQgKHN0cnVjdCBhdWRpb19wdCAqLCBjb25zdCBjaGFyICopOworaW50IGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsIChzdHJ1Y3QgYXVkaW9fcHQgKiwgY29uc3QgY2hhciAqKTsKK2ludCBhdWRpb19wdF9qb2luIChzdHJ1Y3QgYXVkaW9fcHQgKiwgdm9pZCAqKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmIC8qIGF1ZGlvX3B0X2ludC5oICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3RlbXBsYXRlLmggYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNzA0NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fdGVtcGxhdGUuaApAQCAtMCwwICsxLDU3NCBAQAorLyoKKyAqIFFFTVUgQXVkaW8gc3Vic3lzdGVtIGhlYWRlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmZGVmIERBQworI2RlZmluZSBOQU1FICJwbGF5YmFjayIKKyNkZWZpbmUgSFdCVUYgaHctPm1peF9idWYKKyNkZWZpbmUgVFlQRSBvdXQKKyNkZWZpbmUgSFcgSFdWb2ljZU91dAorI2RlZmluZSBTVyBTV1ZvaWNlT3V0CisjZWxzZQorI2RlZmluZSBOQU1FICJjYXB0dXJlIgorI2RlZmluZSBUWVBFIGluCisjZGVmaW5lIEhXIEhXVm9pY2VJbgorI2RlZmluZSBTVyBTV1ZvaWNlSW4KKyNkZWZpbmUgSFdCVUYgaHctPmNvbnZfYnVmCisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2x1ZSAoYXVkaW9faW5pdF9uYl92b2ljZXNfLCBUWVBFKSAoc3RydWN0IGF1ZGlvX2RyaXZlciAqZHJ2KQoreworICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKyAgICBpbnQgbWF4X3ZvaWNlcyA9IGdsdWUgKGRydi0+bWF4X3ZvaWNlc18sIFRZUEUpOworICAgIGludCB2b2ljZV9zaXplID0gZ2x1ZSAoZHJ2LT52b2ljZV9zaXplXywgVFlQRSk7CisKKyAgICBpZiAoZ2x1ZSAocy0+bmJfaHdfdm9pY2VzXywgVFlQRSkgPiBtYXhfdm9pY2VzKSB7CisgICAgICAgIGlmICghbWF4X3ZvaWNlcykgeworI2lmZGVmIERBQworICAgICAgICAgICAgZG9sb2cgKCJEcml2ZXIgYCVzJyBkb2VzIG5vdCBzdXBwb3J0ICIgTkFNRSAiXG4iLCBkcnYtPm5hbWUpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkb2xvZyAoIkRyaXZlciBgJXMnIGRvZXMgbm90IHN1cHBvcnQgJWQgIiBOQU1FICIgdm9pY2VzLCBtYXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZHJ2LT5uYW1lLAorICAgICAgICAgICAgICAgICAgIGdsdWUgKHMtPm5iX2h3X3ZvaWNlc18sIFRZUEUpLAorICAgICAgICAgICAgICAgICAgIG1heF92b2ljZXMpOworICAgICAgICB9CisgICAgICAgIGdsdWUgKHMtPm5iX2h3X3ZvaWNlc18sIFRZUEUpID0gbWF4X3ZvaWNlczsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCAhdm9pY2Vfc2l6ZSAmJiBtYXhfdm9pY2VzKSkgeworICAgICAgICBkb2xvZyAoImRydj1gJXMnIHZvaWNlX3NpemU9MCBtYXhfdm9pY2VzPSVkXG4iLAorICAgICAgICAgICAgICAgZHJ2LT5uYW1lLCBtYXhfdm9pY2VzKTsKKyAgICAgICAgZ2x1ZSAocy0+bmJfaHdfdm9pY2VzXywgVFlQRSkgPSAwOworICAgIH0KKworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIHZvaWNlX3NpemUgJiYgIW1heF92b2ljZXMpKSB7CisgICAgICAgIGRvbG9nICgiZHJ2PWAlcycgdm9pY2Vfc2l6ZT0lZCBtYXhfdm9pY2VzPTBcbiIsCisgICAgICAgICAgICAgICBkcnYtPm5hbWUsIHZvaWNlX3NpemUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2x1ZSAoYXVkaW9fcGNtX2h3X2ZyZWVfcmVzb3VyY2VzXywgVFlQRSkgKEhXICpodykKK3sKKyAgICBpZiAoSFdCVUYpIHsKKyAgICAgICAgZ19mcmVlIChIV0JVRik7CisgICAgfQorCisgICAgSFdCVUYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGdsdWUgKGF1ZGlvX3BjbV9od19hbGxvY19yZXNvdXJjZXNfLCBUWVBFKSAoSFcgKmh3KQoreworICAgIEhXQlVGID0gYXVkaW9fY2FsbG9jIChBVURJT19GVU5DLCBody0+c2FtcGxlcywgc2l6ZW9mIChzdHJ1Y3Qgc3Rfc2FtcGxlKSk7CisgICAgaWYgKCFIV0JVRikgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBhbGxvY2F0ZSAiIE5BTUUgIiBidWZmZXIgKCVkIHNhbXBsZXMpXG4iLAorICAgICAgICAgICAgICAgaHctPnNhbXBsZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdsdWUgKGF1ZGlvX3BjbV9zd19mcmVlX3Jlc291cmNlc18sIFRZUEUpIChTVyAqc3cpCit7CisgICAgaWYgKHN3LT5idWYpIHsKKyAgICAgICAgZ19mcmVlIChzdy0+YnVmKTsKKyAgICB9CisKKyAgICBpZiAoc3ctPnJhdGUpIHsKKyAgICAgICAgc3RfcmF0ZV9zdG9wIChzdy0+cmF0ZSk7CisgICAgfQorCisgICAgc3ctPmJ1ZiA9IE5VTEw7CisgICAgc3ctPnJhdGUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGdsdWUgKGF1ZGlvX3BjbV9zd19hbGxvY19yZXNvdXJjZXNfLCBUWVBFKSAoU1cgKnN3KQoreworICAgIGludCBzYW1wbGVzOworCisjaWZkZWYgREFDCisgICAgc2FtcGxlcyA9IHN3LT5ody0+c2FtcGxlczsKKyNlbHNlCisgICAgc2FtcGxlcyA9ICgoaW50NjRfdCkgc3ctPmh3LT5zYW1wbGVzIDw8IDMyKSAvIHN3LT5yYXRpbzsKKyNlbmRpZgorCisgICAgc3ctPmJ1ZiA9IGF1ZGlvX2NhbGxvYyAoQVVESU9fRlVOQywgc2FtcGxlcywgc2l6ZW9mIChzdHJ1Y3Qgc3Rfc2FtcGxlKSk7CisgICAgaWYgKCFzdy0+YnVmKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBmb3IgYCVzJyAoJWQgc2FtcGxlcylcbiIsCisgICAgICAgICAgICAgICBTV19OQU1FIChzdyksIHNhbXBsZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisjaWZkZWYgREFDCisgICAgc3ctPnJhdGUgPSBzdF9yYXRlX3N0YXJ0IChzdy0+aW5mby5mcmVxLCBzdy0+aHctPmluZm8uZnJlcSk7CisjZWxzZQorICAgIHN3LT5yYXRlID0gc3RfcmF0ZV9zdGFydCAoc3ctPmh3LT5pbmZvLmZyZXEsIHN3LT5pbmZvLmZyZXEpOworI2VuZGlmCisgICAgaWYgKCFzdy0+cmF0ZSkgeworICAgICAgICBnX2ZyZWUgKHN3LT5idWYpOworICAgICAgICBzdy0+YnVmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbHVlIChhdWRpb19wY21fc3dfaW5pdF8sIFRZUEUpICgKKyAgICBTVyAqc3csCisgICAgSFcgKmh3LAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgc3RydWN0IGF1ZHNldHRpbmdzICphcworICAgICkKK3sKKyAgICBpbnQgZXJyOworCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJnN3LT5pbmZvLCBhcyk7CisgICAgc3ctPmh3ID0gaHc7CisgICAgc3ctPmFjdGl2ZSA9IDA7CisjaWZkZWYgREFDCisgICAgc3ctPnJhdGlvID0gKChpbnQ2NF90KSBzdy0+aHctPmluZm8uZnJlcSA8PCAzMikgLyBzdy0+aW5mby5mcmVxOworICAgIHN3LT50b3RhbF9od19zYW1wbGVzX21peGVkID0gMDsKKyAgICBzdy0+ZW1wdHkgPSAxOworI2Vsc2UKKyAgICBzdy0+cmF0aW8gPSAoKGludDY0X3QpIHN3LT5pbmZvLmZyZXEgPDwgMzIpIC8gc3ctPmh3LT5pbmZvLmZyZXE7CisjZW5kaWYKKworI2lmZGVmIERBQworICAgIHN3LT5jb252ID0gbWl4ZW5nX2NvbnYKKyNlbHNlCisgICAgc3ctPmNsaXAgPSBtaXhlbmdfY2xpcAorI2VuZGlmCisgICAgICAgIFtzdy0+aW5mby5uY2hhbm5lbHMgPT0gMl0KKyAgICAgICAgW3N3LT5pbmZvLnNpZ25dCisgICAgICAgIFtzdy0+aW5mby5zd2FwX2VuZGlhbm5lc3NdCisgICAgICAgIFthdWRpb19iaXRzX3RvX2luZGV4IChzdy0+aW5mby5iaXRzKV07CisKKyAgICBzdy0+bmFtZSA9IGdfc3RyZHVwIChuYW1lKTsKKyAgICBlcnIgPSBnbHVlIChhdWRpb19wY21fc3dfYWxsb2NfcmVzb3VyY2VzXywgVFlQRSkgKHN3KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGdfZnJlZSAoc3ctPm5hbWUpOworICAgICAgICBzdy0+bmFtZSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGdsdWUgKGF1ZGlvX3BjbV9zd19maW5pXywgVFlQRSkgKFNXICpzdykKK3sKKyAgICBnbHVlIChhdWRpb19wY21fc3dfZnJlZV9yZXNvdXJjZXNfLCBUWVBFKSAoc3cpOworICAgIGlmIChzdy0+bmFtZSkgeworICAgICAgICBnX2ZyZWUgKHN3LT5uYW1lKTsKKyAgICAgICAgc3ctPm5hbWUgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2x1ZSAoYXVkaW9fcGNtX2h3X2FkZF9zd18sIFRZUEUpIChIVyAqaHcsIFNXICpzdykKK3sKKyAgICBRTElTVF9JTlNFUlRfSEVBRCAoJmh3LT5zd19oZWFkLCBzdywgZW50cmllcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdsdWUgKGF1ZGlvX3BjbV9od19kZWxfc3dfLCBUWVBFKSAoU1cgKnN3KQoreworICAgIFFMSVNUX1JFTU9WRSAoc3csIGVudHJpZXMpOworfQorCitzdGF0aWMgdm9pZCBnbHVlIChhdWRpb19wY21faHdfZ2NfLCBUWVBFKSAoSFcgKipod3ApCit7CisgICAgQXVkaW9TdGF0ZSAqcyA9ICZnbG9iX2F1ZGlvX3N0YXRlOworICAgIEhXICpodyA9ICpod3A7CisKKyAgICBpZiAoIWh3LT5zd19oZWFkLmxoX2ZpcnN0KSB7CisjaWZkZWYgREFDCisgICAgICAgIGF1ZGlvX2RldGFjaF9jYXB0dXJlIChodyk7CisjZW5kaWYKKyAgICAgICAgUUxJU1RfUkVNT1ZFIChodywgZW50cmllcyk7CisgICAgICAgIGdsdWUgKHMtPm5iX2h3X3ZvaWNlc18sIFRZUEUpICs9IDE7CisgICAgICAgIGdsdWUgKGF1ZGlvX3BjbV9od19mcmVlX3Jlc291cmNlc18gLFRZUEUpIChodyk7CisgICAgICAgIEJFR0lOX05PU0lHQUxSTQorICAgICAgICBnbHVlIChody0+cGNtX29wcy0+ZmluaV8sIFRZUEUpIChodyk7CisgICAgICAgIEVORF9OT1NJR0FMUk0KKyAgICAgICAgZ19mcmVlIChodyk7CisgICAgICAgICpod3AgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIEhXICpnbHVlIChhdWRpb19wY21faHdfZmluZF9hbnlfLCBUWVBFKSAoSFcgKmh3KQoreworICAgIEF1ZGlvU3RhdGUgKnMgPSAmZ2xvYl9hdWRpb19zdGF0ZTsKKyAgICByZXR1cm4gaHcgPyBody0+ZW50cmllcy5sZV9uZXh0IDogZ2x1ZSAocy0+aHdfaGVhZF8sIFRZUEUpLmxoX2ZpcnN0OworfQorCitzdGF0aWMgSFcgKmdsdWUgKGF1ZGlvX3BjbV9od19maW5kX2FueV9lbmFibGVkXywgVFlQRSkgKEhXICpodykKK3sKKyAgICB3aGlsZSAoKGh3ID0gZ2x1ZSAoYXVkaW9fcGNtX2h3X2ZpbmRfYW55XywgVFlQRSkgKGh3KSkpIHsKKyAgICAgICAgaWYgKGh3LT5lbmFibGVkKSB7CisgICAgICAgICAgICByZXR1cm4gaHc7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBIVyAqZ2x1ZSAoYXVkaW9fcGNtX2h3X2ZpbmRfc3BlY2lmaWNfLCBUWVBFKSAoCisgICAgSFcgKmh3LAorICAgIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMKKyAgICApCit7CisgICAgd2hpbGUgKChodyA9IGdsdWUgKGF1ZGlvX3BjbV9od19maW5kX2FueV8sIFRZUEUpIChodykpKSB7CisgICAgICAgIGlmIChhdWRpb19wY21faW5mb19lcSAoJmh3LT5pbmZvLCBhcykpIHsKKyAgICAgICAgICAgIHJldHVybiBodzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEhXICpnbHVlIChhdWRpb19wY21faHdfYWRkX25ld18sIFRZUEUpIChzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIEhXICpodzsKKyAgICBBdWRpb1N0YXRlICpzID0gJmdsb2JfYXVkaW9fc3RhdGU7CisgICAgc3RydWN0IGF1ZGlvX2RyaXZlciAqZHJ2ID0gcy0+ZHJ2OworICAgIGludCBlcnI7CisKKyAgICBpZiAoIWdsdWUgKHMtPm5iX2h3X3ZvaWNlc18sIFRZUEUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsICFkcnYpKSB7CisgICAgICAgIGRvbG9nICgiTm8gaG9zdCBhdWRpbyBkcml2ZXJcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCAhZHJ2LT5wY21fb3BzKSkgeworICAgICAgICBkb2xvZyAoIkhvc3QgYXVkaW8gZHJpdmVyIHdpdGhvdXQgcGNtX29wc1xuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGh3ID0gYXVkaW9fY2FsbG9jIChBVURJT19GVU5DLCAxLCBnbHVlIChkcnYtPnZvaWNlX3NpemVfLCBUWVBFKSk7CisgICAgaWYgKCFodykgeworICAgICAgICBkb2xvZyAoIkNhbiBub3QgYWxsb2NhdGUgdm9pY2UgYCVzJyBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgZHJ2LT5uYW1lLCBnbHVlIChkcnYtPnZvaWNlX3NpemVfLCBUWVBFKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGh3LT5wY21fb3BzID0gZHJ2LT5wY21fb3BzOworICAgIFFMSVNUX0lOSVQgKCZody0+c3dfaGVhZCk7CisjaWZkZWYgREFDCisgICAgUUxJU1RfSU5JVCAoJmh3LT5jYXBfaGVhZCk7CisjZW5kaWYKKyAgICBCRUdJTl9OT1NJR0FMUk0KKyAgICBlcnIgPSBnbHVlIChody0+cGNtX29wcy0+aW5pdF8sIFRZUEUpIChodywgYXMpOworICAgIEVORF9OT1NJR0FMUk0KKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGVycjA7CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCBody0+c2FtcGxlcyA8PSAwKSkgeworICAgICAgICBkb2xvZyAoImh3LT5zYW1wbGVzPSVkXG4iLCBody0+c2FtcGxlcyk7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisKKyNpZmRlZiBEQUMKKyAgICBody0+Y2xpcCA9IG1peGVuZ19jbGlwCisjZWxzZQorICAgIGh3LT5jb252ID0gbWl4ZW5nX2NvbnYKKyNlbmRpZgorICAgICAgICBbaHctPmluZm8ubmNoYW5uZWxzID09IDJdCisgICAgICAgIFtody0+aW5mby5zaWduXQorICAgICAgICBbaHctPmluZm8uc3dhcF9lbmRpYW5uZXNzXQorICAgICAgICBbYXVkaW9fYml0c190b19pbmRleCAoaHctPmluZm8uYml0cyldOworCisgICAgaWYgKGdsdWUgKGF1ZGlvX3BjbV9od19hbGxvY19yZXNvdXJjZXNfLCBUWVBFKSAoaHcpKSB7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisKKyAgICBRTElTVF9JTlNFUlRfSEVBRCAoJnMtPmdsdWUgKGh3X2hlYWRfLCBUWVBFKSwgaHcsIGVudHJpZXMpOworICAgIGdsdWUgKHMtPm5iX2h3X3ZvaWNlc18sIFRZUEUpIC09IDE7CisjaWZkZWYgREFDCisgICAgYXVkaW9fYXR0YWNoX2NhcHR1cmUgKGh3KTsKKyNlbmRpZgorICAgIHJldHVybiBodzsKKworIGVycjE6CisgICAgQkVHSU5fTk9TSUdBTFJNCisgICAgZ2x1ZSAoaHctPnBjbV9vcHMtPmZpbmlfLCBUWVBFKSAoaHcpOworICAgIEVORF9OT1NJR0FMUk0KKyBlcnIwOgorICAgIGdfZnJlZSAoaHcpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgSFcgKmdsdWUgKGF1ZGlvX3BjbV9od19hZGRfLCBUWVBFKSAoc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBIVyAqaHc7CisKKyAgICBpZiAoZ2x1ZSAoY29uZi5maXhlZF8sIFRZUEUpLmVuYWJsZWQgJiYgZ2x1ZSAoY29uZi5maXhlZF8sIFRZUEUpLmdyZWVkeSkgeworICAgICAgICBodyA9IGdsdWUgKGF1ZGlvX3BjbV9od19hZGRfbmV3XywgVFlQRSkgKGFzKTsKKyAgICAgICAgaWYgKGh3KSB7CisgICAgICAgICAgICByZXR1cm4gaHc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBodyA9IGdsdWUgKGF1ZGlvX3BjbV9od19maW5kX3NwZWNpZmljXywgVFlQRSkgKE5VTEwsIGFzKTsKKyAgICBpZiAoaHcpIHsKKyAgICAgICAgcmV0dXJuIGh3OworICAgIH0KKworICAgIGh3ID0gZ2x1ZSAoYXVkaW9fcGNtX2h3X2FkZF9uZXdfLCBUWVBFKSAoYXMpOworICAgIGlmIChodykgeworICAgICAgICByZXR1cm4gaHc7CisgICAgfQorCisgICAgcmV0dXJuIGdsdWUgKGF1ZGlvX3BjbV9od19maW5kX2FueV8sIFRZUEUpIChOVUxMKTsKK30KKworc3RhdGljIFNXICpnbHVlIChhdWRpb19wY21fY3JlYXRlX3ZvaWNlX3BhaXJfLCBUWVBFKSAoCisgICAgY29uc3QgY2hhciAqc3dfbmFtZSwKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzCisgICAgKQoreworICAgIFNXICpzdzsKKyAgICBIVyAqaHc7CisgICAgc3RydWN0IGF1ZHNldHRpbmdzIGh3X2FzOworCisgICAgaWYgKGdsdWUgKGNvbmYuZml4ZWRfLCBUWVBFKS5lbmFibGVkKSB7CisgICAgICAgIGh3X2FzID0gZ2x1ZSAoY29uZi5maXhlZF8sIFRZUEUpLnNldHRpbmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaHdfYXMgPSAqYXM7CisgICAgfQorCisgICAgc3cgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIDEsIHNpemVvZiAoKnN3KSk7CisgICAgaWYgKCFzdykgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBzb2Z0IHZvaWNlIGAlcycgKCV6dSBieXRlcylcbiIsCisgICAgICAgICAgICAgICBzd19uYW1lID8gc3dfbmFtZSA6ICJ1bmtub3duIiwgc2l6ZW9mICgqc3cpKTsKKyAgICAgICAgZ290byBlcnIxOworICAgIH0KKworICAgIGh3ID0gZ2x1ZSAoYXVkaW9fcGNtX2h3X2FkZF8sIFRZUEUpICgmaHdfYXMpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgZ290byBlcnIyOworICAgIH0KKworICAgIGdsdWUgKGF1ZGlvX3BjbV9od19hZGRfc3dfLCBUWVBFKSAoaHcsIHN3KTsKKworICAgIGlmIChnbHVlIChhdWRpb19wY21fc3dfaW5pdF8sIFRZUEUpIChzdywgaHcsIHN3X25hbWUsIGFzKSkgeworICAgICAgICBnb3RvIGVycjM7CisgICAgfQorCisgICAgcmV0dXJuIHN3OworCitlcnIzOgorICAgIGdsdWUgKGF1ZGlvX3BjbV9od19kZWxfc3dfLCBUWVBFKSAoc3cpOworICAgIGdsdWUgKGF1ZGlvX3BjbV9od19nY18sIFRZUEUpICgmaHcpOworZXJyMjoKKyAgICBnX2ZyZWUgKHN3KTsKK2VycjE6CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGdsdWUgKGF1ZGlvX2Nsb3NlXywgVFlQRSkgKFNXICpzdykKK3sKKyAgICBnbHVlIChhdWRpb19wY21fc3dfZmluaV8sIFRZUEUpIChzdyk7CisgICAgZ2x1ZSAoYXVkaW9fcGNtX2h3X2RlbF9zd18sIFRZUEUpIChzdyk7CisgICAgZ2x1ZSAoYXVkaW9fcGNtX2h3X2djXywgVFlQRSkgKCZzdy0+aHcpOworICAgIGdfZnJlZSAoc3cpOworfQorCit2b2lkIGdsdWUgKEFVRF9jbG9zZV8sIFRZUEUpIChRRU1VU291bmRDYXJkICpjYXJkLCBTVyAqc3cpCit7CisgICAgaWYgKHN3KSB7CisgICAgICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsICFjYXJkKSkgeworICAgICAgICAgICAgZG9sb2cgKCJjYXJkPSVwXG4iLCBjYXJkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGdsdWUgKGF1ZGlvX2Nsb3NlXywgVFlQRSkgKHN3KTsKKyAgICB9Cit9CisKK1NXICpnbHVlIChBVURfb3Blbl8sIFRZUEUpICgKKyAgICBRRU1VU291bmRDYXJkICpjYXJkLAorICAgIFNXICpzdywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIHZvaWQgKmNhbGxiYWNrX29wYXF1ZSAsCisgICAgYXVkaW9fY2FsbGJhY2tfZm4gY2FsbGJhY2tfZm4sCisgICAgc3RydWN0IGF1ZHNldHRpbmdzICphcworICAgICkKK3sKKyAgICBBdWRpb1N0YXRlICpzID0gJmdsb2JfYXVkaW9fc3RhdGU7CisjaWZkZWYgREFDCisgICAgaW50IGxpdmUgPSAwOworICAgIFNXICpvbGRfc3cgPSBOVUxMOworI2VuZGlmCisKKyAgICBsZGVidWcgKCJvcGVuICVzLCBmcmVxICVkLCBuY2hhbm5lbHMgJWQsIGZtdCAlZFxuIiwKKyAgICAgICAgICAgIG5hbWUsIGFzLT5mcmVxLCBhcy0+bmNoYW5uZWxzLCBhcy0+Zm10KTsKKworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsICFjYXJkIHx8ICFuYW1lIHx8ICFjYWxsYmFja19mbiB8fCAhYXMpKSB7CisgICAgICAgIGRvbG9nICgiY2FyZD0lcCBuYW1lPSVwIGNhbGxiYWNrX2ZuPSVwIGFzPSVwXG4iLAorICAgICAgICAgICAgICAgY2FyZCwgbmFtZSwgY2FsbGJhY2tfZm4sIGFzKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChhdWRpb19idWcgKEFVRElPX0ZVTkMsIGF1ZGlvX3ZhbGlkYXRlX3NldHRpbmdzIChhcykpKSB7CisgICAgICAgIGF1ZGlvX3ByaW50X3NldHRpbmdzIChhcyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9fYnVnIChBVURJT19GVU5DLCAhcy0+ZHJ2KSkgeworICAgICAgICBkb2xvZyAoIkNhbiBub3Qgb3BlbiBgJXMnIChubyBob3N0IGF1ZGlvIGRyaXZlcilcbiIsIG5hbWUpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHN3ICYmIGF1ZGlvX3BjbV9pbmZvX2VxICgmc3ctPmluZm8sIGFzKSkgeworICAgICAgICByZXR1cm4gc3c7CisgICAgfQorCisjaWZkZWYgREFDCisgICAgaWYgKGNvbmYucGxpdmUgJiYgc3cgJiYgKCFzdy0+YWN0aXZlICYmICFzdy0+ZW1wdHkpKSB7CisgICAgICAgIGxpdmUgPSBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZDsKKworI2lmZGVmIERFQlVHX1BMSVZFCisgICAgICAgIGRvbG9nICgiUmVwbGFjaW5nIHZvaWNlICVzIHdpdGggJWQgbGl2ZSBzYW1wbGVzXG4iLCBTV19OQU1FIChzdyksIGxpdmUpOworICAgICAgICBkb2xvZyAoIk9sZCAlcyBmcmVxICVkLCBiaXRzICVkLCBjaGFubmVscyAlZFxuIiwKKyAgICAgICAgICAgICAgIFNXX05BTUUgKHN3KSwgc3ctPmluZm8uZnJlcSwgc3ctPmluZm8uYml0cywgc3ctPmluZm8ubmNoYW5uZWxzKTsKKyAgICAgICAgZG9sb2cgKCJOZXcgJXMgZnJlcSAlZCwgYml0cyAlZCwgY2hhbm5lbHMgJWRcbiIsCisgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgYXMtPmZyZXEsCisgICAgICAgICAgICAgICAoYXMtPmZtdCA9PSBBVURfRk1UX1MxNiB8fCBhcy0+Zm10ID09IEFVRF9GTVRfVTE2KSA/IDE2IDogOCwKKyAgICAgICAgICAgICAgIGFzLT5uY2hhbm5lbHMpOworI2VuZGlmCisKKyAgICAgICAgaWYgKGxpdmUpIHsKKyAgICAgICAgICAgIG9sZF9zdyA9IHN3OworICAgICAgICAgICAgb2xkX3N3LT5jYWxsYmFjay5mbiA9IE5VTEw7CisgICAgICAgICAgICBzdyA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmICghZ2x1ZSAoY29uZi5maXhlZF8sIFRZUEUpLmVuYWJsZWQgJiYgc3cpIHsKKyAgICAgICAgZ2x1ZSAoQVVEX2Nsb3NlXywgVFlQRSkgKGNhcmQsIHN3KTsKKyAgICAgICAgc3cgPSBOVUxMOworICAgIH0KKworICAgIGlmIChzdykgeworICAgICAgICBIVyAqaHcgPSBzdy0+aHc7CisKKyAgICAgICAgaWYgKCFodykgeworICAgICAgICAgICAgZG9sb2cgKCJJbnRlcm5hbCBsb2dpYyBlcnJvciB2b2ljZSBgJXMnIGhhcyBubyBoYXJkd2FyZSBzdG9yZVxuIiwKKyAgICAgICAgICAgICAgICAgICBTV19OQU1FIChzdykpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZ2x1ZSAoYXVkaW9fcGNtX3N3X2ZpbmlfLCBUWVBFKSAoc3cpOworICAgICAgICBpZiAoZ2x1ZSAoYXVkaW9fcGNtX3N3X2luaXRfLCBUWVBFKSAoc3csIGh3LCBuYW1lLCBhcykpIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3cgPSBnbHVlIChhdWRpb19wY21fY3JlYXRlX3ZvaWNlX3BhaXJfLCBUWVBFKSAobmFtZSwgYXMpOworICAgICAgICBpZiAoIXN3KSB7CisgICAgICAgICAgICBkb2xvZyAoIkZhaWxlZCB0byBjcmVhdGUgdm9pY2UgYCVzJ1xuIiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3LT5jYXJkID0gY2FyZDsKKyAgICBzdy0+dm9sID0gbm9taW5hbF92b2x1bWU7CisgICAgc3ctPmNhbGxiYWNrLmZuID0gY2FsbGJhY2tfZm47CisgICAgc3ctPmNhbGxiYWNrLm9wYXF1ZSA9IGNhbGxiYWNrX29wYXF1ZTsKKyNpZmRlZiBEQUMKKyAgICBzdy0+ZW1wdHkgPSAxOworI2VuZGlmCisKKyNpZmRlZiBEQUMKKyAgICBpZiAobGl2ZSkgeworICAgICAgICBpbnQgbWl4ZWQgPQorICAgICAgICAgICAgKGxpdmUgPDwgb2xkX3N3LT5pbmZvLnNoaWZ0KQorICAgICAgICAgICAgKiBvbGRfc3ctPmluZm8uYnl0ZXNfcGVyX3NlY29uZAorICAgICAgICAgICAgLyBzdy0+aW5mby5ieXRlc19wZXJfc2Vjb25kOworCisjaWZkZWYgREVCVUdfUExJVkUKKyAgICAgICAgZG9sb2cgKCJTaWxlbmNlIHdpbGwgYmUgbWl4ZWQgJWRcbiIsIG1peGVkKTsKKyNlbmRpZgorICAgICAgICBzdy0+dG90YWxfaHdfc2FtcGxlc19taXhlZCArPSBtaXhlZDsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0FVRElPCisgICAgZG9sb2cgKCIlc1xuIiwgbmFtZSk7CisgICAgYXVkaW9fcGNtX3ByaW50X2luZm8gKCJodyIsICZzdy0+aHctPmluZm8pOworICAgIGF1ZGlvX3BjbV9wcmludF9pbmZvICgic3ciLCAmc3ctPmluZm8pOworI2VuZGlmCisKKyAgICByZXR1cm4gc3c7CisKKyBmYWlsOgorICAgIGdsdWUgKEFVRF9jbG9zZV8sIFRZUEUpIChjYXJkLCBzdyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnbHVlIChBVURfaXNfYWN0aXZlXywgVFlQRSkgKFNXICpzdykKK3sKKyAgICByZXR1cm4gc3cgPyBzdy0+YWN0aXZlIDogMDsKK30KKwordm9pZCBnbHVlIChBVURfaW5pdF90aW1lX3N0YW1wXywgVFlQRSkgKFNXICpzdywgUUVNVUF1ZGlvVGltZVN0YW1wICp0cykKK3sKKyAgICBpZiAoIXN3KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0cy0+b2xkX3RzID0gc3ctPmh3LT50c19oZWxwZXI7Cit9CisKK3VpbnQ2NF90IGdsdWUgKEFVRF9nZXRfZWxhcHNlZF91c2VjXywgVFlQRSkgKFNXICpzdywgUUVNVUF1ZGlvVGltZVN0YW1wICp0cykKK3sKKyAgICB1aW50NjRfdCBkZWx0YSwgY3VyX3RzLCBvbGRfdHM7CisKKyAgICBpZiAoIXN3KSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGN1cl90cyA9IHN3LT5ody0+dHNfaGVscGVyOworICAgIG9sZF90cyA9IHRzLT5vbGRfdHM7CisgICAgLyogZG9sb2cgKCJjdXIgJSIgUFJJZDY0ICIgb2xkICUiIFBSSWQ2NCAiXG4iLCBjdXJfdHMsIG9sZF90cyk7ICovCisKKyAgICBpZiAoY3VyX3RzID49IG9sZF90cykgeworICAgICAgICBkZWx0YSA9IGN1cl90cyAtIG9sZF90czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRlbHRhID0gVUlOVDY0X01BWCAtIG9sZF90cyArIGN1cl90czsKKyAgICB9CisKKyAgICBpZiAoIWRlbHRhKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBtdWxkaXY2NCAoZGVsdGEsIHN3LT5ody0+aW5mby5mcmVxLCAxMDAwMDAwKTsKK30KKworI3VuZGVmIFRZUEUKKyN1bmRlZiBIVworI3VuZGVmIFNXCisjdW5kZWYgSFdCVUYKKyN1bmRlZiBOQU1FCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3dpbl9pbnQuYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fd2luX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjkwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3dpbl9pbnQuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogcHVibGljIGRvbWFpbiAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJhdWRpby5oIgorCisjZGVmaW5lIEFVRElPX0NBUCAid2luLWludCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisjaW5jbHVkZSAiYXVkaW9fd2luX2ludC5oIgorCitpbnQgd2F2ZWZvcm1hdF9mcm9tX2F1ZGlvX3NldHRpbmdzIChXQVZFRk9STUFURVggKndmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgbWVtc2V0ICh3ZngsIDAsIHNpemVvZiAoKndmeCkpOworCisgICAgd2Z4LT53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworICAgIHdmeC0+bkNoYW5uZWxzID0gYXMtPm5jaGFubmVsczsKKyAgICB3ZngtPm5TYW1wbGVzUGVyU2VjID0gYXMtPmZyZXE7CisgICAgd2Z4LT5uQXZnQnl0ZXNQZXJTZWMgPSBhcy0+ZnJlcSA8PCAoYXMtPm5jaGFubmVscyA9PSAyKTsKKyAgICB3ZngtPm5CbG9ja0FsaWduID0gMSA8PCAoYXMtPm5jaGFubmVscyA9PSAyKTsKKyAgICB3ZngtPmNiU2l6ZSA9IDA7CisKKyAgICBzd2l0Y2ggKGFzLT5mbXQpIHsKKyAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICB3ZngtPndCaXRzUGVyU2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIHdmeC0+d0JpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgd2Z4LT5uQXZnQnl0ZXNQZXJTZWMgPDw9IDE7CisgICAgICAgIHdmeC0+bkJsb2NrQWxpZ24gPDw9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICB3ZngtPndCaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgIHdmeC0+bkF2Z0J5dGVzUGVyU2VjIDw8PSAyOworICAgICAgICB3ZngtPm5CbG9ja0FsaWduIDw8PSAyOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGRvbG9nICgiSW50ZXJuYWwgbG9naWMgZXJyb3I6IEJhZCBhdWRpbyBmb3JtYXQgJWRcbiIsIGFzLT5mcmVxKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgd2F2ZWZvcm1hdF90b19hdWRpb19zZXR0aW5ncyAoV0FWRUZPUk1BVEVYICp3ZngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBpZiAod2Z4LT53Rm9ybWF0VGFnICE9IFdBVkVfRk9STUFUX1BDTSkgeworICAgICAgICBkb2xvZyAoIkludmFsaWQgd2F2ZSBmb3JtYXQsIHRhZyBpcyBub3QgUENNLCBidXQgJWRcbiIsCisgICAgICAgICAgICAgICB3ZngtPndGb3JtYXRUYWcpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCF3ZngtPm5TYW1wbGVzUGVyU2VjKSB7CisgICAgICAgIGRvbG9nICgiSW52YWxpZCB3YXZlIGZvcm1hdCwgZnJlcXVlbmN5IGlzIHplcm9cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzLT5mcmVxID0gd2Z4LT5uU2FtcGxlc1BlclNlYzsKKworICAgIHN3aXRjaCAod2Z4LT5uQ2hhbm5lbHMpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGFzLT5uY2hhbm5lbHMgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMjoKKyAgICAgICAgYXMtPm5jaGFubmVscyA9IDI7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZG9sb2cgKAorICAgICAgICAgICAgIkludmFsaWQgd2F2ZSBmb3JtYXQsIG51bWJlciBvZiBjaGFubmVscyBpcyBub3QgMSBvciAyLCBidXQgJWRcbiIsCisgICAgICAgICAgICB3ZngtPm5DaGFubmVscworICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN3aXRjaCAod2Z4LT53Qml0c1BlclNhbXBsZSkgeworICAgIGNhc2UgODoKKyAgICAgICAgYXMtPmZtdCA9IEFVRF9GTVRfVTg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxNjoKKyAgICAgICAgYXMtPmZtdCA9IEFVRF9GTVRfUzE2OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMzI6CisgICAgICAgIGFzLT5mbXQgPSBBVURfRk1UX1MzMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoIkludmFsaWQgd2F2ZSBmb3JtYXQsIGJpdHMgcGVyIHNhbXBsZSBpcyBub3QgIgorICAgICAgICAgICAgICAgIjgsIDE2IG9yIDMyLCBidXQgJWRcbiIsCisgICAgICAgICAgICAgICB3ZngtPndCaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3dpbl9pbnQuaCBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vYXVkaW9fd2luX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWIzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2F1ZGlvX3dpbl9pbnQuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIEFVRElPX1dJTl9JTlRfSAorI2RlZmluZSBBVURJT19XSU5fSU5UX0gKKworaW50IHdhdmVmb3JtYXRfZnJvbV9hdWRpb19zZXR0aW5ncyAoV0FWRUZPUk1BVEVYICp3ZngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKTsKKworaW50IHdhdmVmb3JtYXRfdG9fYXVkaW9fc2V0dGluZ3MgKFdBVkVGT1JNQVRFWCAqd2Z4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpOworCisjZW5kaWYgLyogQVVESU9fV0lOX0lOVF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2NvcmVhdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby9jb3JlYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTEyZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby9jb3JlYXVkaW8uYwpAQCAtMCwwICsxLDgwNiBAQAorLyoKKyAqIFFFTVUgT1MgWCBDb3JlQXVkaW8gYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwNSBNaWtlIEtyb25lbmJlcmcKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPENvcmVBdWRpby9Db3JlQXVkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgLyogc3RyZXJyb3IgKi8KKyNpbmNsdWRlIDxwdGhyZWFkLmg+ICAgICAgICAgICAgLyogcHRocmVhZF9YICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgQVVESU9fQ0FQICJjb3JlYXVkaW8iCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisKKyNpZiAwCisjICBkZWZpbmUgIEQoLi4uKSAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgIGRlZmluZSAgRCguLi4pICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdHJ1Y3QgeworICAgIGludCBvdXRfYnVmZmVyX2ZyYW1lczsKKyAgICBpbnQgb3V0X25idWZmZXJzOworICAgIGludCBpbl9idWZmZXJfZnJhbWVzOworICAgIGludCBpbl9uYnVmZmVyczsKKyAgICBpbnQgaXNBdGV4aXQ7Cit9IGNvbmYgPSB7CisgICAgLm91dF9idWZmZXJfZnJhbWVzID0gNTEyLAorICAgIC5vdXRfbmJ1ZmZlcnMgPSA0LAorICAgIC5pbl9idWZmZXJfZnJhbWVzID0gNTEyLAorICAgIC5pbl9uYnVmZmVycyA9IDQsCisgICAgLmlzQXRleGl0ID0gMAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICBVIFQgSSBMIEkgVCBZICAgUiBPIFUgVCBJIE4gRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgY29yZWF1ZGlvX2xvZ3N0YXR1cyAoT1NTdGF0dXMgc3RhdHVzKQoreworICAgIGNoYXIgKnN0ciA9ICJCVUciOworCisgICAgc3dpdGNoKHN0YXR1cykgeworICAgIGNhc2Uga0F1ZGlvSGFyZHdhcmVOb0Vycm9yOgorICAgICAgICBzdHIgPSAia0F1ZGlvSGFyZHdhcmVOb0Vycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0hhcmR3YXJlTm90UnVubmluZ0Vycm9yOgorICAgICAgICBzdHIgPSAia0F1ZGlvSGFyZHdhcmVOb3RSdW5uaW5nRXJyb3IiOworICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0F1ZGlvSGFyZHdhcmVVbnNwZWNpZmllZEVycm9yOgorICAgICAgICBzdHIgPSAia0F1ZGlvSGFyZHdhcmVVbnNwZWNpZmllZEVycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0hhcmR3YXJlVW5rbm93blByb3BlcnR5RXJyb3I6CisgICAgICAgIHN0ciA9ICJrQXVkaW9IYXJkd2FyZVVua25vd25Qcm9wZXJ0eUVycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0hhcmR3YXJlQmFkUHJvcGVydHlTaXplRXJyb3I6CisgICAgICAgIHN0ciA9ICJrQXVkaW9IYXJkd2FyZUJhZFByb3BlcnR5U2l6ZUVycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0hhcmR3YXJlSWxsZWdhbE9wZXJhdGlvbkVycm9yOgorICAgICAgICBzdHIgPSAia0F1ZGlvSGFyZHdhcmVJbGxlZ2FsT3BlcmF0aW9uRXJyb3IiOworICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0F1ZGlvSGFyZHdhcmVCYWREZXZpY2VFcnJvcjoKKyAgICAgICAgc3RyID0gImtBdWRpb0hhcmR3YXJlQmFkRGV2aWNlRXJyb3IiOworICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0F1ZGlvSGFyZHdhcmVCYWRTdHJlYW1FcnJvcjoKKyAgICAgICAgc3RyID0gImtBdWRpb0hhcmR3YXJlQmFkU3RyZWFtRXJyb3IiOworICAgICAgICBicmVhazsKKworICAgIGNhc2Uga0F1ZGlvSGFyZHdhcmVVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yOgorICAgICAgICBzdHIgPSAia0F1ZGlvSGFyZHdhcmVVbnN1cHBvcnRlZE9wZXJhdGlvbkVycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0RldmljZVVuc3VwcG9ydGVkRm9ybWF0RXJyb3I6CisgICAgICAgIHN0ciA9ICJrQXVkaW9EZXZpY2VVbnN1cHBvcnRlZEZvcm1hdEVycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdWRpb0RldmljZVBlcm1pc3Npb25zRXJyb3I6CisgICAgICAgIHN0ciA9ICJrQXVkaW9EZXZpY2VQZXJtaXNzaW9uc0Vycm9yIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246IHN0YXR1cyBjb2RlICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiUmVhc29uOiAlc1xuIiwgc3RyKTsKK30KKworc3RhdGljIHZvaWQgR0NDX0ZNVF9BVFRSICgyLCAzKSBjb3JlYXVkaW9fbG9nZXJyICgKKyAgICBPU1N0YXR1cyBzdGF0dXMsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLgorICAgICkKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBjb3JlYXVkaW9fbG9nc3RhdHVzIChzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBHQ0NfRk1UX0FUVFIgKDMsIDQpIGNvcmVhdWRpb19sb2dlcnIyICgKKyAgICBPU1N0YXR1cyBzdGF0dXMsCisgICAgY29uc3QgY2hhciAqdHlwLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4KKyAgICApCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIkNvdWxkIG5vdCBpbml0aWFsaXplICVzXG4iLCB0eXApOworCisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF92bG9nIChBVURJT19DQVAsIGZtdCwgYXApOworICAgIHZhX2VuZCAoYXApOworCisgICAgY29yZWF1ZGlvX2xvZ3N0YXR1cyAoc3RhdHVzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICBTIEggQSBSIEUgRCAgIEkgTiAvIE8gVSBUICAgViBPIEkgQyBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29yZUF1ZGlvVm9pY2UgeworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgICAgICAgICAgbXV0ZXg7CisgICAgQXVkaW9EZXZpY2VJRCAgICAgICAgICAgICAgICBkZXZpY2VJRDsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgIGlzSW5wdXQ7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJGcmFtZVNpemU7CisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uICBzdHJlYW1CYXNpY0Rlc2NyaXB0aW9uOworICAgIEF1ZGlvRGV2aWNlSU9Qcm9jICAgICAgICAgICAgaW9wcm9jOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3I7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M7Cit9IGNvcmVhdWRpb1ZvaWNlOworCitzdGF0aWMgaW5saW5lIFVJbnQzMgorY29yZWF1ZGlvX3ZvaWNlX2lzUGxheWluZyAoY29yZWF1ZGlvVm9pY2UgKmNvcmUpCit7CisgICAgT1NTdGF0dXMgc3RhdHVzOworICAgIFVJbnQzMiByZXN1bHQgPSAwOworICAgIFVJbnQzMiBwcm9wZXJ0eVNpemUgPSBzaXplb2YoY29yZS0+ZGV2aWNlSUQpOworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlR2V0UHJvcGVydHkoCisgICAgICAgIGNvcmUtPmRldmljZUlELCAwLCBjb3JlLT5pc0lucHV0LAorICAgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eURldmljZUlzUnVubmluZywgJnByb3BlcnR5U2l6ZSwgJnJlc3VsdCk7CisgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgY29yZWF1ZGlvX2xvZ2VycihzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlcm1pbmUgd2hldGhlciBEZXZpY2UgaXMgcGxheWluZ1xuIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvcmVhdWRpb19hdGV4aXQgKHZvaWQpCit7CisgICAgY29uZi5pc0F0ZXhpdCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgY29yZWF1ZGlvX3ZvaWNlX2xvY2sgKGNvcmVhdWRpb1ZvaWNlICpjb3JlLCBjb25zdCBjaGFyICpmbl9uYW1lKQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwdGhyZWFkX211dGV4X2xvY2sgKCZjb3JlLT5tdXRleCk7CisgICAgaWYgKGVycikgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBsb2NrIHZvaWNlIGZvciAlc1xuUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGZuX25hbWUsIHN0cmVycm9yIChlcnIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29yZWF1ZGlvX3ZvaWNlX3VubG9jayAoY29yZWF1ZGlvVm9pY2UgKmNvcmUsIGNvbnN0IGNoYXIgKmZuX25hbWUpCit7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrICgmY29yZS0+bXV0ZXgpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgdW5sb2NrIHZvaWNlIGZvciAlc1xuUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGZuX25hbWUsIHN0cmVycm9yIChlcnIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29yZWF1ZGlvX3ZvaWNlX2N0bCAoY29yZWF1ZGlvVm9pY2UqICBjb3JlLCBpbnQgY21kKQoreworICAgIE9TU3RhdHVzIHN0YXR1czsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBWT0lDRV9FTkFCTEU6CisgICAgICAgIC8qIHN0YXJ0IHBsYXliYWNrICovCisgICAgICAgIEQoIiVzOiAlcyBzdGFydGVkXG4iLCBfX0ZVTkNUSU9OX18sIGNvcmUtPmlzSW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOworICAgICAgICBpZiAoIWNvcmVhdWRpb192b2ljZV9pc1BsYXlpbmcoY29yZSkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlU3RhcnQoY29yZS0+ZGV2aWNlSUQsIGNvcmUtPmlvcHJvYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IGtBdWRpb0hhcmR3YXJlTm9FcnJvcikgeworICAgICAgICAgICAgICAgIGNvcmVhdWRpb19sb2dlcnIgKHN0YXR1cywgIkNvdWxkIG5vdCByZXN1bWUgcGxheWJhY2tcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWT0lDRV9ESVNBQkxFOgorICAgICAgICAvKiBzdG9wIHBsYXliYWNrICovCisgICAgICAgIEQoIiVzOiAlcyBzdG9wcGVkXG4iLCBfX0ZVTkNUSU9OX18sIGNvcmUtPmlzSW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOworICAgICAgICBpZiAoIWNvbmYuaXNBdGV4aXQpIHsKKyAgICAgICAgICAgIGlmIChjb3JlYXVkaW9fdm9pY2VfaXNQbGF5aW5nKGNvcmUpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9EZXZpY2VTdG9wKGNvcmUtPmRldmljZUlELCBjb3JlLT5pb3Byb2MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0ga0F1ZGlvSGFyZHdhcmVOb0Vycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcmVhdWRpb19sb2dlcnIgKHN0YXR1cywgIkNvdWxkIG5vdCBwYXVzZSBwbGF5YmFja1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NvcmVhdWRpb192b2ljZV9maW5pIChjb3JlYXVkaW9Wb2ljZSogIGNvcmUpCit7CisgICAgT1NTdGF0dXMgc3RhdHVzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIWNvbmYuaXNBdGV4aXQpIHsKKyAgICAgICAgLyogc3RvcCBwbGF5YmFjayAqLworICAgICAgICBjb3JlYXVkaW9fdm9pY2VfY3RsKGNvcmUsIFZPSUNFX0RJU0FCTEUpOworCisgICAgICAgIC8qIHJlbW92ZSBjYWxsYmFjayAqLworICAgICAgICBzdGF0dXMgPSBBdWRpb0RldmljZVJlbW92ZUlPUHJvYyhjb3JlLT5kZXZpY2VJRCwgY29yZS0+aW9wcm9jKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgICAgIGNvcmVhdWRpb19sb2dlcnIgKHN0YXR1cywgIkNvdWxkIG5vdCByZW1vdmUgSU9Qcm9jXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb3JlLT5kZXZpY2VJRCA9IGtBdWRpb0RldmljZVVua25vd247CisKKyAgICAvKiBkZXN0cm95IG11dGV4ICovCisgICAgZXJyID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZjb3JlLT5tdXRleCk7CisgICAgaWYgKGVycikgeworICAgICAgICBkb2xvZygiQ291bGQgbm90IGRlc3Ryb3kgbXV0ZXhcblJlYXNvbjogJXNcbiIsIHN0cmVycm9yIChlcnIpKTsKKyAgICB9Cit9CisKKworc3RhdGljIGludAorY29yZWF1ZGlvX3ZvaWNlX2luaXQgKGNvcmVhdWRpb1ZvaWNlKiAgICBjb3JlLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRzZXR0aW5ncyogIGFzLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VJT1Byb2MgIGlvcHJvYywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgaHcsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgIGlucHV0KQoreworICAgIE9TU3RhdHVzICBzdGF0dXM7CisgICAgVUludDMyICAgIHByb3BlcnR5U2l6ZTsKKyAgICBpbnQgICAgICAgZXJyOworICAgIGludCAgICAgICBiaXRzID0gODsKKyAgICBBdWRpb1ZhbHVlUmFuZ2UgZnJhbWVSYW5nZTsKKyAgICBjb25zdCBjaGFyKiAgdHlwID0gaW5wdXQgPyAiaW5wdXQiIDogInBsYXliYWNrIjsKKworICAgIGNvcmUtPmlzSW5wdXQgPSBpbnB1dCA/IHRydWUgOiBmYWxzZTsKKworICAgIC8qIGNyZWF0ZSBtdXRleCAqLworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmY29yZS0+bXV0ZXgsIE5VTEwpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZG9sb2coIkNvdWxkIG5vdCBjcmVhdGUgbXV0ZXhcblJlYXNvbjogJXNcbiIsIHN0cmVycm9yIChlcnIpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChhcy0+Zm10ID09IEFVRF9GTVRfUzE2IHx8IGFzLT5mbXQgPT0gQVVEX0ZNVF9VMTYpIHsKKyAgICAgICAgYml0cyA9IDE2OworICAgIH0KKworICAgIC8vIFRPRE86IGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgYXMpOworICAgIC8qIG9wZW4gZGVmYXVsdCBvdXRwdXQgZGV2aWNlICovCisgICAvKiBub3RlOiB3ZSB1c2UgRGVmYXVsdFN5c3RlbU91dHB1dERldmljZSBiZWNhdXNlIERlZmF1bHRPdXRwdXREZXZpY2Ugc2VlbXMgdG8KKyAgICAqIGFsd2F5cyBsaW5rIHRvIHRoZSBpbnRlcm5hbCBzcGVha2VycywgYW5kIG5vdCB0aGUgb25lcyBzZWxlY3RlZCB0aHJvdWdoIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgKiBnbyBmaWd1cmUuLi4KKyAgICAqLworICAgIHByb3BlcnR5U2l6ZSA9IHNpemVvZihjb3JlLT5kZXZpY2VJRCk7CisgICAgc3RhdHVzID0gQXVkaW9IYXJkd2FyZUdldFByb3BlcnR5KAorICAgICAgICBpbnB1dCA/IGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0SW5wdXREZXZpY2UgOgorICAgICAgICAgICAgICAgIGtBdWRpb0hhcmR3YXJlUHJvcGVydHlEZWZhdWx0U3lzdGVtT3V0cHV0RGV2aWNlLAorICAgICAgICAmcHJvcGVydHlTaXplLAorICAgICAgICAmY29yZS0+ZGV2aWNlSUQpOworICAgIGlmIChzdGF0dXMgIT0ga0F1ZGlvSGFyZHdhcmVOb0Vycm9yKSB7CisgICAgICAgIGNvcmVhdWRpb19sb2dlcnIyIChzdGF0dXMsIHR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGRlZmF1bHQgJXMgZGV2aWNlXG4iLCB0eXApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb3JlLT5kZXZpY2VJRCA9PSBrQXVkaW9EZXZpY2VVbmtub3duKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGluaXRpYWxpemUgJXMgLSBVbmtub3duIEF1ZGlvZGV2aWNlXG4iLCB0eXApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogZ2V0IG1pbmltdW0gYW5kIG1heGltdW0gYnVmZmVyIGZyYW1lIHNpemVzICovCisgICAgcHJvcGVydHlTaXplID0gc2l6ZW9mKGZyYW1lUmFuZ2UpOworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlR2V0UHJvcGVydHkoCisgICAgICAgIGNvcmUtPmRldmljZUlELAorICAgICAgICAwLAorICAgICAgICBjb3JlLT5pc0lucHV0LAorICAgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZVJhbmdlLAorICAgICAgICAmcHJvcGVydHlTaXplLAorICAgICAgICAmZnJhbWVSYW5nZSk7CisgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgY29yZWF1ZGlvX2xvZ2VycjIgKHN0YXR1cywgdHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIGJ1ZmZlciBmcmFtZSByYW5nZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVSYW5nZS5tTWluaW11bSA+IGZyYW1lU2l6ZSkgeworICAgICAgICBjb3JlLT5idWZmZXJGcmFtZVNpemUgPSAoVUludDMyKSBmcmFtZVJhbmdlLm1NaW5pbXVtOworICAgICAgICBkb2xvZyAoIndhcm5pbmc6IFVwc2l6aW5nIE91dHB1dCBCdWZmZXIgRnJhbWVzIHRvICVmXG4iLCBmcmFtZVJhbmdlLm1NaW5pbXVtKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZnJhbWVSYW5nZS5tTWF4aW11bSA8IGZyYW1lU2l6ZSkgeworICAgICAgICBjb3JlLT5idWZmZXJGcmFtZVNpemUgPSAoVUludDMyKSBmcmFtZVJhbmdlLm1NYXhpbXVtOworICAgICAgICBkb2xvZyAoIndhcm5pbmc6IERvd25zaXppbmcgT3V0cHV0IEJ1ZmZlciBGcmFtZXMgdG8gJWZcbiIsIGZyYW1lUmFuZ2UubU1heGltdW0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29yZS0+YnVmZmVyRnJhbWVTaXplID0gZnJhbWVTaXplOworICAgIH0KKworICAgIC8qIHNldCBCdWZmZXIgRnJhbWUgU2l6ZSAqLworICAgIHByb3BlcnR5U2l6ZSA9IHNpemVvZihjb3JlLT5idWZmZXJGcmFtZVNpemUpOworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlU2V0UHJvcGVydHkoCisgICAgICAgIGNvcmUtPmRldmljZUlELAorICAgICAgICBOVUxMLAorICAgICAgICAwLAorICAgICAgICBjb3JlLT5pc0lucHV0LAorICAgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSwKKyAgICAgICAgcHJvcGVydHlTaXplLAorICAgICAgICAmY29yZS0+YnVmZmVyRnJhbWVTaXplKTsKKyAgICBpZiAoc3RhdHVzICE9IGtBdWRpb0hhcmR3YXJlTm9FcnJvcikgeworICAgICAgICBjb3JlYXVkaW9fbG9nZXJyMiAoc3RhdHVzLCB0eXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBkZXZpY2UgYnVmZmVyIGZyYW1lIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpY29yZS0+YnVmZmVyRnJhbWVTaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGdldCBCdWZmZXIgRnJhbWUgU2l6ZSAqLworICAgIHByb3BlcnR5U2l6ZSA9IHNpemVvZihjb3JlLT5idWZmZXJGcmFtZVNpemUpOworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlR2V0UHJvcGVydHkoCisgICAgICAgIGNvcmUtPmRldmljZUlELAorICAgICAgICAwLAorICAgICAgICBjb3JlLT5pc0lucHV0LAorICAgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eUJ1ZmZlckZyYW1lU2l6ZSwKKyAgICAgICAgJnByb3BlcnR5U2l6ZSwKKyAgICAgICAgJmNvcmUtPmJ1ZmZlckZyYW1lU2l6ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgY29yZWF1ZGlvX2xvZ2VycjIgKHN0YXR1cywgdHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIGJ1ZmZlciBmcmFtZSBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBUT0RPOiBody0+c2FtcGxlcyA9ICpwTkJ1ZmZlcnMgKiBjb3JlLT5idWZmZXJGcmFtZVNpemU7CisKKyAgICAvKiBnZXQgU3RyZWFtRm9ybWF0ICovCisgICAgcHJvcGVydHlTaXplID0gc2l6ZW9mKGNvcmUtPnN0cmVhbUJhc2ljRGVzY3JpcHRpb24pOworICAgIHN0YXR1cyA9IEF1ZGlvRGV2aWNlR2V0UHJvcGVydHkoCisgICAgICAgIGNvcmUtPmRldmljZUlELAorICAgICAgICAwLAorICAgICAgICBjb3JlLT5pc0lucHV0LAorICAgICAgICBrQXVkaW9EZXZpY2VQcm9wZXJ0eVN0cmVhbUZvcm1hdCwKKyAgICAgICAgJnByb3BlcnR5U2l6ZSwKKyAgICAgICAgJmNvcmUtPnN0cmVhbUJhc2ljRGVzY3JpcHRpb24pOworICAgIGlmIChzdGF0dXMgIT0ga0F1ZGlvSGFyZHdhcmVOb0Vycm9yKSB7CisgICAgICAgIGNvcmVhdWRpb19sb2dlcnIyIChzdGF0dXMsIHR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IERldmljZSBTdHJlYW0gcHJvcGVydGllc1xuIik7CisgICAgICAgIGNvcmUtPmRldmljZUlEID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHNldCBTYW1wbGVyYXRlICovCisgICAgY29yZS0+c3RyZWFtQmFzaWNEZXNjcmlwdGlvbi5tU2FtcGxlUmF0ZSA9IChGbG9hdDY0KSBhcy0+ZnJlcTsKKyAgICBwcm9wZXJ0eVNpemUgPSBzaXplb2YoY29yZS0+c3RyZWFtQmFzaWNEZXNjcmlwdGlvbik7CisgICAgc3RhdHVzID0gQXVkaW9EZXZpY2VTZXRQcm9wZXJ0eSgKKyAgICAgICAgY29yZS0+ZGV2aWNlSUQsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIGNvcmUtPmlzSW5wdXQsCisgICAgICAgIGtBdWRpb0RldmljZVByb3BlcnR5U3RyZWFtRm9ybWF0LAorICAgICAgICBwcm9wZXJ0eVNpemUsCisgICAgICAgICZjb3JlLT5zdHJlYW1CYXNpY0Rlc2NyaXB0aW9uKTsKKyAgICBpZiAoc3RhdHVzICE9IGtBdWRpb0hhcmR3YXJlTm9FcnJvcikgeworICAgICAgICBjb3JlYXVkaW9fbG9nZXJyMiAoc3RhdHVzLCB0eXAsICJDb3VsZCBub3Qgc2V0IHNhbXBsZXJhdGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy0+ZnJlcSk7CisgICAgICAgIGNvcmUtPmRldmljZUlEID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIHNldCBDYWxsYmFjayAqLworICAgIGNvcmUtPmlvcHJvYyA9IGlvcHJvYzsKKyAgICBzdGF0dXMgPSBBdWRpb0RldmljZUFkZElPUHJvYyhjb3JlLT5kZXZpY2VJRCwgaW9wcm9jLCBodyk7CisgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgY29yZWF1ZGlvX2xvZ2VycjIgKHN0YXR1cywgdHlwLCAiQ291bGQgbm90IHNldCBJT1Byb2NcbiIpOworICAgICAgICBjb3JlLT5kZXZpY2VJRCA9IGtBdWRpb0RldmljZVVua25vd247CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzdGFydCBQbGF5YmFjayAqLworICAgIGlmICghaW5wdXQgJiYgIWNvcmVhdWRpb192b2ljZV9pc1BsYXlpbmcoY29yZSkpIHsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9EZXZpY2VTdGFydChjb3JlLT5kZXZpY2VJRCwgY29yZS0+aW9wcm9jKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBrQXVkaW9IYXJkd2FyZU5vRXJyb3IpIHsKKyAgICAgICAgICAgIGNvcmVhdWRpb19sb2dlcnIyIChzdGF0dXMsIHR5cCwgIkNvdWxkIG5vdCBzdGFydCBwbGF5YmFja1xuIik7CisgICAgICAgICAgICBBdWRpb0RldmljZVJlbW92ZUlPUHJvYyhjb3JlLT5kZXZpY2VJRCwgY29yZS0+aW9wcm9jKTsKKyAgICAgICAgICAgIGNvcmUtPmRldmljZUlEID0ga0F1ZGlvRGV2aWNlVW5rbm93bjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgTyBVIFQgUCBVIFQgICBWIE8gSSBDIEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGNvcmVhdWRpb1ZvaWNlT3V0IHsKKyAgICBIV1ZvaWNlT3V0ICAgICAgICAgICAgICAgICAgIGh3OworICAgIGNvcmVhdWRpb1ZvaWNlICAgICAgICAgICAgICAgY29yZVsxXTsKK30gY29yZWF1ZGlvVm9pY2VPdXQ7CisKKyNkZWZpbmUgIENPUkVfT1VUKGh3KSAgKChjb3JlYXVkaW9Wb2ljZU91dCopKGh3KSktPmNvcmUKKworCitzdGF0aWMgaW50IGNvcmVhdWRpb19ydW5fb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGxpdmUpCit7CisgICAgaW50IGRlY3I7CisgICAgY29yZWF1ZGlvVm9pY2UgKmNvcmUgPSBDT1JFX09VVChodyk7CisKKyAgICBpZiAoY29yZWF1ZGlvX3ZvaWNlX2xvY2sgKGNvcmUsICJjb3JlYXVkaW9fcnVuX291dCIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChjb3JlLT5kZWNyID4gbGl2ZSkgeworICAgICAgICBsZGVidWcgKCJjb3JlLT5kZWNyICVkIGxpdmUgJWQgY29yZS0+bGl2ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBjb3JlLT5kZWNyLAorICAgICAgICAgICAgICAgIGxpdmUsCisgICAgICAgICAgICAgICAgY29yZS0+bGl2ZSk7CisgICAgfQorCisgICAgZGVjciA9IGF1ZGlvX01JTiAoY29yZS0+ZGVjciwgbGl2ZSk7CisgICAgY29yZS0+ZGVjciAtPSBkZWNyOworCisgICAgY29yZS0+bGl2ZSA9IGxpdmUgLSBkZWNyOworICAgIGh3LT5ycG9zID0gY29yZS0+cG9zOworCisgICAgY29yZWF1ZGlvX3ZvaWNlX3VubG9jayAoY29yZSwgImNvcmVhdWRpb19ydW5fb3V0Iik7CisgICAgcmV0dXJuIGRlY3I7Cit9CisKKy8qIGNhbGxiYWNrIHRvIGZlZWQgYXVkaW9vdXRwdXQgYnVmZmVyICovCitzdGF0aWMgT1NTdGF0dXMgYXVkaW9PdXREZXZpY2VJT1Byb2MoCisgICAgQXVkaW9EZXZpY2VJRCBpbkRldmljZSwKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogaW5Ob3csCisgICAgY29uc3QgQXVkaW9CdWZmZXJMaXN0KiBpbklucHV0RGF0YSwKKyAgICBjb25zdCBBdWRpb1RpbWVTdGFtcCogaW5JbnB1dFRpbWUsCisgICAgQXVkaW9CdWZmZXJMaXN0KiBvdXRPdXRwdXREYXRhLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBpbk91dHB1dFRpbWUsCisgICAgdm9pZCogaHdwdHIpCit7CisgICAgVUludDMyIGZyYW1lLCBmcmFtZUNvdW50OworICAgIGZsb2F0ICpvdXQgPSBvdXRPdXRwdXREYXRhLT5tQnVmZmVyc1swXS5tRGF0YTsKKyAgICBIV1ZvaWNlT3V0ICpodyA9IGh3cHRyOworICAgIGNvcmVhdWRpb1ZvaWNlICpjb3JlID0gQ09SRV9PVVQoaHcpOworICAgIGludCBycG9zLCBsaXZlOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzsKKyNpZm5kZWYgRkxPQVRfTUlYRU5HCisjaWZkZWYgUkVDSVBST0NBTAorICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMS5mIC8gVUlOVF9NQVg7CisjZWxzZQorICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gVUlOVF9NQVg7CisjZW5kaWYKKyNlbmRpZgorCisgICAgaWYgKGNvcmVhdWRpb192b2ljZV9sb2NrIChjb3JlLCAiYXVkaW9EZXZpY2VJT1Byb2MiKSkgeworICAgICAgICBpbklucHV0VGltZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZyYW1lQ291bnQgPSBjb3JlLT5idWZmZXJGcmFtZVNpemU7CisgICAgbGl2ZSA9IGNvcmUtPmxpdmU7CisKKyAgICAvKiBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBzYW1wbGVzLCBzZXQgc2lnbmFsIGFuZCByZXR1cm4gKi8KKyAgICBpZiAobGl2ZSA8IChpbnQpZnJhbWVDb3VudCkgeworICAgICAgICBpbklucHV0VGltZSA9IDA7CisgICAgICAgIGNvcmVhdWRpb192b2ljZV91bmxvY2sgKGNvcmUsICJhdWRpb0RldmljZUlPUHJvYyhlbXB0eSkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcnBvcyA9IGNvcmUtPnBvczsKKyAgICBzcmMgPSBody0+bWl4X2J1ZiArIHJwb3M7CisKKyAgICAvKiBmaWxsIGJ1ZmZlciAqLworICAgIGZvciAoZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lQ291bnQ7IGZyYW1lKyspIHsKKyNpZmRlZiBGTE9BVF9NSVhFTkcKKyAgICAgICAgKm91dCsrID0gc3JjW2ZyYW1lXS5sOyAvKiBsZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgKm91dCsrID0gc3JjW2ZyYW1lXS5yOyAvKiByaWdodCBjaGFubmVsICovCisjZWxzZQorI2lmZGVmIFJFQ0lQUk9DQUwKKyAgICAgICAgKm91dCsrID0gc3JjW2ZyYW1lXS5sICogc2NhbGU7IC8qIGxlZnQgY2hhbm5lbCAqLworICAgICAgICAqb3V0KysgPSBzcmNbZnJhbWVdLnIgKiBzY2FsZTsgLyogcmlnaHQgY2hhbm5lbCAqLworI2Vsc2UKKyAgICAgICAgKm91dCsrID0gc3JjW2ZyYW1lXS5sIC8gc2NhbGU7IC8qIGxlZnQgY2hhbm5lbCAqLworICAgICAgICAqb3V0KysgPSBzcmNbZnJhbWVdLnIgLyBzY2FsZTsgLyogcmlnaHQgY2hhbm5lbCAqLworI2VuZGlmCisjZW5kaWYKKyAgICB9CisKKyAgICBycG9zID0gKHJwb3MgKyBmcmFtZUNvdW50KSAlIGh3LT5zYW1wbGVzOworICAgIGNvcmUtPmRlY3IgKz0gZnJhbWVDb3VudDsKKyAgICBjb3JlLT5wb3MgPSBycG9zOworCisgICAgY29yZWF1ZGlvX3ZvaWNlX3VubG9jayAoY29yZSwgImF1ZGlvRGV2aWNlSU9Qcm9jIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29yZWF1ZGlvX3dyaXRlIChTV1ZvaWNlT3V0ICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfd3JpdGUgKHN3LCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgY29yZWF1ZGlvX2luaXRfb3V0IChIV1ZvaWNlT3V0ICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBjb3JlYXVkaW9Wb2ljZSogIGNvcmUgPSBDT1JFX09VVChodyk7CisgICAgaW50IGVycjsKKworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgYXMpOworCisgICAgZXJyID0gY29yZWF1ZGlvX3ZvaWNlX2luaXQgKGNvcmUsIGFzLCBjb25mLm91dF9idWZmZXJfZnJhbWVzLCBhdWRpb091dERldmljZUlPUHJvYywgaHcsIDApOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgaHctPnNhbXBsZXMgPSBjb3JlLT5idWZmZXJGcmFtZVNpemUgKiBjb25mLm91dF9uYnVmZmVyczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29yZWF1ZGlvX2Zpbmlfb3V0IChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICBjb3JlYXVkaW9Wb2ljZSAqY29yZSA9IENPUkVfT1VUKGh3KTsKKworICAgIGNvcmVhdWRpb192b2ljZV9maW5pIChjb3JlKTsKK30KKworc3RhdGljIGludAorY29yZWF1ZGlvX2N0bF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgY29yZWF1ZGlvVm9pY2UgKmNvcmUgPSBDT1JFX09VVChodyk7CisKKyAgICByZXR1cm4gY29yZWF1ZGlvX3ZvaWNlX2N0bCAoY29yZSwgY21kKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKiAgICAgICBJIE4gUCBVIFQgICBWIE8gSSBDIEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KKy8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKK3R5cGVkZWYgc3RydWN0IGNvcmVhdWRpb1ZvaWNlSW4geworICAgIEhXVm9pY2VJbiAgICAgICAgaHc7CisgICAgY29yZWF1ZGlvVm9pY2UgICBjb3JlWzFdOworfSBjb3JlYXVkaW9Wb2ljZUluOworCisjZGVmaW5lICBDT1JFX0lOKGh3KSAgKChjb3JlYXVkaW9Wb2ljZUluICopIChodykpLT5jb3JlCisKKworc3RhdGljIGludCBjb3JlYXVkaW9fcnVuX2luIChIV1ZvaWNlSW4gKmh3KQoreworICAgIGludCBkZWNyOworCisgICAgY29yZWF1ZGlvVm9pY2UgKmNvcmUgPSBDT1JFX0lOKGh3KTsKKworICAgIGlmIChjb3JlYXVkaW9fdm9pY2VfbG9jayAoY29yZSwgImNvcmVhdWRpb19ydW5faW4iKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgRCgiJXM6IGNvcmUuZGVjcj0lZCBjb3JlLnBvcz0lZFxuIiwgX19GVU5DVElPTl9fLCBjb3JlLT5kZWNyLCBjb3JlLT5wb3MpOworICAgIGRlY3IgICAgICAgID0gY29yZS0+ZGVjcjsKKyAgICBjb3JlLT5kZWNyIC09IGRlY3I7CisgICAgaHctPndwb3MgICAgPSBjb3JlLT5wb3M7CisKKyAgICBjb3JlYXVkaW9fdm9pY2VfdW5sb2NrIChjb3JlLCAiY29yZWF1ZGlvX3J1bl9pbiIpOworICAgIHJldHVybiBkZWNyOworfQorCisKKy8qIGNhbGxiYWNrIHRvIGZlZWQgYXVkaW9vdXRwdXQgYnVmZmVyICovCitzdGF0aWMgT1NTdGF0dXMgYXVkaW9JbkRldmljZUlPUHJvYygKKyAgICBBdWRpb0RldmljZUlEIGluRGV2aWNlLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBpbk5vdywKKyAgICBjb25zdCBBdWRpb0J1ZmZlckxpc3QqIGluSW5wdXREYXRhLAorICAgIGNvbnN0IEF1ZGlvVGltZVN0YW1wKiBpbklucHV0VGltZSwKKyAgICBBdWRpb0J1ZmZlckxpc3QqIG91dE91dHB1dERhdGEsCisgICAgY29uc3QgQXVkaW9UaW1lU3RhbXAqIGluT3V0cHV0VGltZSwKKyAgICB2b2lkKiBod3B0cikKK3sKKyAgICBVSW50MzIgZnJhbWUsIGZyYW1lQ291bnQ7CisgICAgZmxvYXQgKmluID0gaW5JbnB1dERhdGEtPm1CdWZmZXJzWzBdLm1EYXRhOworICAgIEhXVm9pY2VJbiAqaHcgPSBod3B0cjsKKyAgICBjb3JlYXVkaW9Wb2ljZSAqY29yZSA9IENPUkVfSU4oaHcpOworICAgIGludCB3cG9zLCBhdmFpbDsKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlICpkc3Q7CisjaWZuZGVmIEZMT0FUX01JWEVORworI2lmZGVmIFJFQ0lQUk9DQUwKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDEuZiAvIFVJTlRfTUFYOworI2Vsc2UKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IFVJTlRfTUFYOworI2VuZGlmCisjZW5kaWYKKworICAgIGlmIChjb3JlYXVkaW9fdm9pY2VfbG9jayAoY29yZSwgImF1ZGlvRGV2aWNlSU9Qcm9jIikpIHsKKyAgICAgICAgaW5JbnB1dFRpbWUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmcmFtZUNvdW50ID0gY29yZS0+YnVmZmVyRnJhbWVTaXplOworICAgIGF2YWlsICAgICAgPSBody0+c2FtcGxlcyAtIGh3LT50b3RhbF9zYW1wbGVzX2NhcHR1cmVkIC0gY29yZS0+ZGVjcjsKKworICAgIEQoIiVzOiBlbnRlciBhdmFpbD0lZCBjb3JlLmRlY3I9JWQgY29yZS5wb3M9JWQgaHcuc2FtcGxlcz0lZCBody50b3RhbF9zYW1wbGVzX2NhcHR1cmVkPSVkIGZyYW1lQ291bnQ9JWRcbiIsCisgICAgICBfX0ZVTkNUSU9OX18sIGF2YWlsLCBjb3JlLT5kZWNyLCBjb3JlLT5wb3MsIGh3LT5zYW1wbGVzLCBody0+dG90YWxfc2FtcGxlc19jYXB0dXJlZCwgKGludClmcmFtZUNvdW50KTsKKworICAgIC8qIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHNhbXBsZXMsIHNldCBzaWduYWwgYW5kIHJldHVybiAqLworICAgIGlmIChhdmFpbCA8IChpbnQpZnJhbWVDb3VudCkgeworICAgICAgICBpbklucHV0VGltZSA9IDA7CisgICAgICAgIGNvcmVhdWRpb192b2ljZV91bmxvY2sgKGNvcmUsICJhdWRpb0RldmljZUlPUHJvYyhlbXB0eSkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd3BvcyA9IGNvcmUtPnBvczsKKyAgICBkc3QgID0gaHctPmNvbnZfYnVmICsgd3BvczsKKworICAgIC8qIGZpbGwgYnVmZmVyICovCisgICAgZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgZnJhbWVDb3VudDsgZnJhbWUrKykgeworI2lmZGVmIEZMT0FUX01JWEVORworICAgICAgICBkc3RbZnJhbWVdLmwgPSAqaW4rKzsgLyogbGVmdCBjaGFubmVsICovCisgICAgICAgIGRzdFtmcmFtZV0uciA9ICppbisrOyAvKiByaWdodCBjaGFubmVsICovCisjZWxzZQorI2lmZGVmIFJFQ0lQUk9DQUwKKyAgICAgICAgZHN0W2ZyYW1lXS5sID0gKmluKysgKiBzY2FsZTsgLyogbGVmdCBjaGFubmVsICovCisgICAgICAgIGRzdFtmcmFtZV0uciA9ICppbisrICogc2NhbGU7IC8qIHJpZ2h0IGNoYW5uZWwgKi8KKyNlbHNlCisgICAgICAgIGRzdFtmcmFtZV0ubCA9ICppbisrIC8gc2NhbGU7IC8qIGxlZnQgY2hhbm5lbCAqLworICAgICAgICBkc3RbZnJhbWVdLnIgPSAqaW4rKyAvIHNjYWxlOyAvKiByaWdodCBjaGFubmVsICovCisjZW5kaWYKKyNlbmRpZgorICAgIH0KKworICAgIHdwb3MgPSAod3BvcyArIGZyYW1lQ291bnQpICUgaHctPnNhbXBsZXM7CisgICAgY29yZS0+ZGVjciArPSBmcmFtZUNvdW50OworICAgIGNvcmUtPnBvcyAgID0gd3BvczsKKworICAgIEQoImV4aXQ6IGNvcmUuZGVjcj0lZCBjb3JlLnBvcz0lZFxuIiwgY29yZS0+ZGVjciwgY29yZS0+cG9zKTsKKyAgICBjb3JlYXVkaW9fdm9pY2VfdW5sb2NrIChjb3JlLCAiYXVkaW9EZXZpY2VJT1Byb2MiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY29yZWF1ZGlvX3JlYWQgKFNXVm9pY2VJbiAqc3csIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgIHJlc3VsdCA9IGF1ZGlvX3BjbV9zd19yZWFkIChzdywgYnVmLCBsZW4pOworICAgIEQoIiVzOiBhdWRpb19wY21fc3dfcmVhZCglZCkgcmV0dXJuZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK2NvcmVhdWRpb19pbml0X2luIChIV1ZvaWNlSW4gKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIGNvcmVhdWRpb1ZvaWNlKiAgY29yZSA9IENPUkVfSU4oaHcpOworICAgIGludCAgICAgICAgICAgICAgZXJyOworCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCBhcyk7CisKKyAgICBlcnIgPSBjb3JlYXVkaW9fdm9pY2VfaW5pdCAoY29yZSwgYXMsIGNvbmYuaW5fYnVmZmVyX2ZyYW1lcywgYXVkaW9JbkRldmljZUlPUHJvYywgaHcsIDEpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaHctPnNhbXBsZXMgPSBjb3JlLT5idWZmZXJGcmFtZVNpemUgKiBjb25mLmluX25idWZmZXJzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorY29yZWF1ZGlvX2ZpbmlfaW4gKEhXVm9pY2VJbiAqaHcpCit7CisKKyAgICBjb3JlYXVkaW9Wb2ljZSogIGNvcmUgPSBDT1JFX0lOKGh3KTsKKworICAgIGNvcmVhdWRpb192b2ljZV9maW5pKGNvcmUpOworfQorCitzdGF0aWMgaW50Citjb3JlYXVkaW9fY3RsX2luIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgY29yZWF1ZGlvVm9pY2UqICBjb3JlID0gQ09SRV9JTihodyk7CisKKyAgICByZXR1cm4gY29yZWF1ZGlvX3ZvaWNlX2N0bChjb3JlLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCAqY29yZWF1ZGlvX2F1ZGlvX2luaXQgKHZvaWQpCit7CisgICAgYXRleGl0KGNvcmVhdWRpb19hdGV4aXQpOworICAgIHJldHVybiAmY29yZWF1ZGlvX2F1ZGlvX2luaXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvcmVhdWRpb19hdWRpb19maW5pICh2b2lkICpvcGFxdWUpCit7CisgICAgKHZvaWQpIG9wYXF1ZTsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19vcHRpb24gY29yZWF1ZGlvX29wdGlvbnNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJPVVRfQlVGRkVSX1NJWkUiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYub3V0X2J1ZmZlcl9mcmFtZXMsCisgICAgICAgIC5kZXNjciA9ICJTaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyIGluIGZyYW1lcyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIk9VVF9CVUZGRVJfQ09VTlQiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYub3V0X25idWZmZXJzLAorICAgICAgICAuZGVzY3IgPSAiTnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiSU5fQlVGRkVSX1NJWkUiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuaW5fYnVmZmVyX2ZyYW1lcywKKyAgICAgICAgLmRlc2NyID0gIlNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlciBpbiBmcmFtZXMiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJJTl9CVUZGRVJfQ09VTlQiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuaW5fbmJ1ZmZlcnMsCisgICAgICAgIC5kZXNjciA9ICJOdW1iZXIgb2YgaW5wdXQgYnVmZmVycyIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wY21fb3BzIGNvcmVhdWRpb19wY21fb3BzID0geworICAgIC5pbml0X291dCA9IGNvcmVhdWRpb19pbml0X291dCwKKyAgICAuZmluaV9vdXQgPSBjb3JlYXVkaW9fZmluaV9vdXQsCisgICAgLnJ1bl9vdXQgID0gY29yZWF1ZGlvX3J1bl9vdXQsCisgICAgLndyaXRlICAgID0gY29yZWF1ZGlvX3dyaXRlLAorICAgIC5jdGxfb3V0ICA9IGNvcmVhdWRpb19jdGxfb3V0LAorCisgICAgLmluaXRfaW4gPSBjb3JlYXVkaW9faW5pdF9pbiwKKyAgICAuZmluaV9pbiA9IGNvcmVhdWRpb19maW5pX2luLAorICAgIC5ydW5faW4gID0gY29yZWF1ZGlvX3J1bl9pbiwKKyAgICAucmVhZCAgICA9IGNvcmVhdWRpb19yZWFkLAorICAgIC5jdGxfaW4gID0gY29yZWF1ZGlvX2N0bF9pbgorfTsKKworc3RydWN0IGF1ZGlvX2RyaXZlciBjb3JlYXVkaW9fYXVkaW9fZHJpdmVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb3JlYXVkaW8iLAorICAgIC5kZXNjciAgICAgICAgICA9ICJDb3JlQXVkaW8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vYXVkaW8vY29yZWF1ZGlvLmh0bWwiLAorICAgIC5vcHRpb25zICAgICAgICA9IGNvcmVhdWRpb19vcHRpb25zLAorICAgIC5pbml0ICAgICAgICAgICA9IGNvcmVhdWRpb19hdWRpb19pbml0LAorICAgIC5maW5pICAgICAgICAgICA9IGNvcmVhdWRpb19hdWRpb19maW5pLAorICAgIC5wY21fb3BzICAgICAgICA9ICZjb3JlYXVkaW9fcGNtX29wcywKKyAgICAuY2FuX2JlX2RlZmF1bHQgPSAxLAorICAgIC5tYXhfdm9pY2VzX291dCA9IDEsCisgICAgLm1heF92b2ljZXNfaW4gID0gMSwKKyAgICAudm9pY2Vfc2l6ZV9vdXQgPSBzaXplb2YgKGNvcmVhdWRpb1ZvaWNlT3V0KSwKKyAgICAudm9pY2Vfc2l6ZV9pbiAgPSBzaXplb2YgKGNvcmVhdWRpb1ZvaWNlSW4pLAorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vZHNvdW5kX3RlbXBsYXRlLmggYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Rzb3VuZF90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzdkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Rzb3VuZF90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogUUVNVSBEaXJlY3RTb3VuZCBhdWRpbyBkcml2ZXIgaGVhZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFZhc3NpbGkgS2FycG92IChtYWxjKQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmZGVmIERTQlRZUEVfSU4KKyNkZWZpbmUgTkFNRSAiY2FwdHVyZSBidWZmZXIiCisjZGVmaW5lIE5BTUUyICJEaXJlY3RTb3VuZENhcHR1cmUiCisjZGVmaW5lIFRZUEUgaW4KKyNkZWZpbmUgSUZBQ0UgSURpcmVjdFNvdW5kQ2FwdHVyZUJ1ZmZlcgorI2RlZmluZSBCVUZQVFIgTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIKKyNkZWZpbmUgRklFTEQgZHNvdW5kX2NhcHR1cmVfYnVmZmVyCisjZGVmaW5lIEZJRUxEMiBkc291bmRfY2FwdHVyZQorI2Vsc2UKKyNkZWZpbmUgTkFNRSAicGxheWJhY2sgYnVmZmVyIgorI2RlZmluZSBOQU1FMiAiRGlyZWN0U291bmQiCisjZGVmaW5lIFRZUEUgb3V0CisjZGVmaW5lIElGQUNFIElEaXJlY3RTb3VuZEJ1ZmZlcgorI2RlZmluZSBCVUZQVFIgTFBESVJFQ1RTT1VOREJVRkZFUgorI2RlZmluZSBGSUVMRCBkc291bmRfYnVmZmVyCisjZGVmaW5lIEZJRUxEMiBkc291bmQKKyNlbmRpZgorCitzdGF0aWMgaW50IGdsdWUgKGRzb3VuZF91bmxvY2tfLCBUWVBFKSAoCisgICAgQlVGUFRSIGJ1ZiwKKyAgICBMUFZPSUQgcDEsCisgICAgTFBWT0lEIHAyLAorICAgIERXT1JEIGJsZW4xLAorICAgIERXT1JEIGJsZW4yCisgICAgKQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBociA9IGdsdWUgKElGQUNFLCBfVW5sb2NrKSAoYnVmLCBwMSwgYmxlbjEsIHAyLCBibGVuMik7CisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IHVubG9jayAiIE5BTUUgIlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbHVlIChkc291bmRfbG9ja18sIFRZUEUpICgKKyAgICBCVUZQVFIgYnVmLAorICAgIHN0cnVjdCBhdWRpb19wY21faW5mbyAqaW5mbywKKyAgICBEV09SRCBwb3MsCisgICAgRFdPUkQgbGVuLAorICAgIExQVk9JRCAqcDFwLAorICAgIExQVk9JRCAqcDJwLAorICAgIERXT1JEICpibGVuMXAsCisgICAgRFdPUkQgKmJsZW4ycCwKKyAgICBpbnQgZW50aXJlCisgICAgKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgaW50IGk7CisgICAgTFBWT0lEIHAxID0gTlVMTCwgcDIgPSBOVUxMOworICAgIERXT1JEIGJsZW4xID0gMCwgYmxlbjIgPSAwOworICAgIERXT1JEIGZsYWc7CisKKyNpZmRlZiBEU0JUWVBFX0lOCisgICAgZmxhZyA9IGVudGlyZSA/IERTQ0JMT0NLX0VOVElSRUJVRkZFUiA6IDA7CisjZWxzZQorICAgIGZsYWcgPSBlbnRpcmUgPyBEU0JMT0NLX0VOVElSRUJVRkZFUiA6IDA7CisjZW5kaWYKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi5sb2NrX3JldHJpZXM7ICsraSkgeworICAgICAgICBociA9IGdsdWUgKElGQUNFLCBfTG9jaykgKAorICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgcG9zLAorICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgJnAxLAorICAgICAgICAgICAgJmJsZW4xLAorICAgICAgICAgICAgJnAyLAorICAgICAgICAgICAgJmJsZW4yLAorICAgICAgICAgICAgZmxhZworICAgICAgICAgICAgKTsKKworICAgICAgICBpZiAoRkFJTEVEIChocikpIHsKKyNpZm5kZWYgRFNCVFlQRV9JTgorICAgICAgICAgICAgaWYgKGhyID09IERTRVJSX0JVRkZFUkxPU1QpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2x1ZSAoZHNvdW5kX3Jlc3RvcmVfLCBUWVBFKSAoYnVmKSkgeworICAgICAgICAgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCBsb2NrICIgTkFNRSAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgbG9jayAiIE5BTUUgIlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA9PSBjb25mLmxvY2tfcmV0cmllcykgeworICAgICAgICBkb2xvZyAoIiVkIGF0dGVtcHRzIHRvIGxvY2sgIiBOQU1FICIgZmFpbGVkXG4iLCBpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocDEgJiYgKGJsZW4xICYgaW5mby0+YWxpZ24pKSB8fCAocDIgJiYgKGJsZW4yICYgaW5mby0+YWxpZ24pKSkgeworICAgICAgICBkb2xvZyAoIkRpcmVjdFNvdW5kIHJldHVybmVkIG1pc2FsaWduZWQgYnVmZmVyICVsZCAlbGRcbiIsCisgICAgICAgICAgICAgICBibGVuMSwgYmxlbjIpOworICAgICAgICBnbHVlIChkc291bmRfdW5sb2NrXywgVFlQRSkgKGJ1ZiwgcDEsIHAyLCBibGVuMSwgYmxlbjIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKCFwMSAmJiBibGVuMSkgeworICAgICAgICBkb2xvZyAoIndhcm5pbmc6ICFwMSAmJiBibGVuMT0lbGRcbiIsIGJsZW4xKTsKKyAgICAgICAgYmxlbjEgPSAwOworICAgIH0KKworICAgIGlmICghcDIgJiYgYmxlbjIpIHsKKyAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiAhcDIgJiYgYmxlbjI9JWxkXG4iLCBibGVuMik7CisgICAgICAgIGJsZW4yID0gMDsKKyAgICB9CisKKyAgICAqcDFwID0gcDE7CisgICAgKnAycCA9IHAyOworICAgICpibGVuMXAgPSBibGVuMTsKKyAgICAqYmxlbjJwID0gYmxlbjI7CisgICAgcmV0dXJuIDA7CisKKyBmYWlsOgorICAgICpwMXAgPSBOVUxMIC0gMTsKKyAgICAqcDJwID0gTlVMTCAtIDE7CisgICAgKmJsZW4xcCA9IC0xOworICAgICpibGVuMnAgPSAtMTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNpZmRlZiBEU0JUWVBFX0lOCitzdGF0aWMgdm9pZCBkc291bmRfZmluaV9pbiAoSFdWb2ljZUluICpodykKKyNlbHNlCitzdGF0aWMgdm9pZCBkc291bmRfZmluaV9vdXQgKEhXVm9pY2VPdXQgKmh3KQorI2VuZGlmCit7CisgICAgSFJFU1VMVCBocjsKKyNpZmRlZiBEU0JUWVBFX0lOCisgICAgRFNvdW5kVm9pY2VJbiAqZHMgPSAoRFNvdW5kVm9pY2VJbiAqKSBodzsKKyNlbHNlCisgICAgRFNvdW5kVm9pY2VPdXQgKmRzID0gKERTb3VuZFZvaWNlT3V0ICopIGh3OworI2VuZGlmCisKKyAgICBpZiAoZHMtPkZJRUxEKSB7CisgICAgICAgIGhyID0gZ2x1ZSAoSUZBQ0UsIF9TdG9wKSAoZHMtPkZJRUxEKTsKKyAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCBzdG9wICIgTkFNRSAiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGhyID0gZ2x1ZSAoSUZBQ0UsIF9SZWxlYXNlKSAoZHMtPkZJRUxEKTsKKyAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCByZWxlYXNlICIgTkFNRSAiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBkcy0+RklFTEQgPSBOVUxMOworICAgIH0KK30KKworI2lmZGVmIERTQlRZUEVfSU4KK3N0YXRpYyBpbnQgZHNvdW5kX2luaXRfaW4gKEhXVm9pY2VJbiAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCisjZWxzZQorc3RhdGljIGludCBkc291bmRfaW5pdF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQorI2VuZGlmCit7CisgICAgaW50IGVycjsKKyAgICBIUkVTVUxUIGhyOworICAgIGRzb3VuZCAqcyA9ICZnbG9iX2Rzb3VuZDsKKyAgICBXQVZFRk9STUFURVggd2Z4OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXM7CisjaWZkZWYgRFNCVFlQRV9JTgorICAgIGNvbnN0IGNoYXIgKnR5cCA9ICJBREMiOworICAgIERTb3VuZFZvaWNlSW4gKmRzID0gKERTb3VuZFZvaWNlSW4gKikgaHc7CisgICAgRFNDQlVGRkVSREVTQyBiZDsKKyAgICBEU0NCQ0FQUyBiYzsKKyNlbHNlCisgICAgY29uc3QgY2hhciAqdHlwID0gIkRBQyI7CisgICAgRFNvdW5kVm9pY2VPdXQgKmRzID0gKERTb3VuZFZvaWNlT3V0ICopIGh3OworICAgIERTQlVGRkVSREVTQyBiZDsKKyAgICBEU0JDQVBTIGJjOworI2VuZGlmCisKKyAgICBpZiAoIXMtPkZJRUxEMikgeworICAgICAgICBkb2xvZyAoIkF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB2b2ljZSB3aXRob3V0ICIgTkFNRTIgIiBvYmplY3RcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZXJyID0gd2F2ZWZvcm1hdF9mcm9tX2F1ZGlvX3NldHRpbmdzICgmd2Z4LCBhcyk7CisgICAgaWYgKGVycikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtc2V0ICgmYmQsIDAsIHNpemVvZiAoYmQpKTsKKyAgICBiZC5kd1NpemUgPSBzaXplb2YgKGJkKTsKKyAgICBiZC5scHdmeEZvcm1hdCA9ICZ3Zng7CisjaWZkZWYgRFNCVFlQRV9JTgorICAgIGJkLmR3QnVmZmVyQnl0ZXMgPSBjb25mLmJ1ZnNpemVfaW47CisgICAgaHIgPSBJRGlyZWN0U291bmRDYXB0dXJlX0NyZWF0ZUNhcHR1cmVCdWZmZXIgKAorICAgICAgICBzLT5kc291bmRfY2FwdHVyZSwKKyAgICAgICAgJmJkLAorICAgICAgICAmZHMtPmRzb3VuZF9jYXB0dXJlX2J1ZmZlciwKKyAgICAgICAgTlVMTAorICAgICAgICApOworI2Vsc2UKKyAgICBiZC5kd0ZsYWdzID0gRFNCQ0FQU19TVElDS1lGT0NVUyB8IERTQkNBUFNfR0VUQ1VSUkVOVFBPU0lUSU9OMjsKKyAgICBiZC5kd0J1ZmZlckJ5dGVzID0gY29uZi5idWZzaXplX291dDsKKyAgICBociA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciAoCisgICAgICAgIHMtPmRzb3VuZCwKKyAgICAgICAgJmJkLAorICAgICAgICAmZHMtPmRzb3VuZF9idWZmZXIsCisgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyNlbmRpZgorCisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIyIChociwgdHlwLCAiQ291bGQgbm90IGNyZWF0ZSAiIE5BTUUgIlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBociA9IGdsdWUgKElGQUNFLCBfR2V0Rm9ybWF0KSAoZHMtPkZJRUxELCAmd2Z4LCBzaXplb2YgKHdmeCksIE5VTEwpOworICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICBkc291bmRfbG9nZXJyMiAoaHIsIHR5cCwgIkNvdWxkIG5vdCBnZXQgIiBOQU1FICIgZm9ybWF0XG4iKTsKKyAgICAgICAgZ290byBmYWlsMDsKKyAgICB9CisKKyNpZmRlZiBERUJVR19EU09VTkQKKyAgICBkb2xvZyAoTkFNRSAiXG4iKTsKKyAgICBwcmludF93YXZlX2Zvcm1hdCAoJndmeCk7CisjZW5kaWYKKworICAgIG1lbXNldCAoJmJjLCAwLCBzaXplb2YgKGJjKSk7CisgICAgYmMuZHdTaXplID0gc2l6ZW9mIChiYyk7CisKKyAgICBociA9IGdsdWUgKElGQUNFLCBfR2V0Q2FwcykgKGRzLT5GSUVMRCwgJmJjKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VycjIgKGhyLCB0eXAsICJDb3VsZCBub3QgZ2V0ICIgTkFNRSAiIGZvcm1hdFxuIik7CisgICAgICAgIGdvdG8gZmFpbDA7CisgICAgfQorCisgICAgZXJyID0gd2F2ZWZvcm1hdF90b19hdWRpb19zZXR0aW5ncyAoJndmeCwgJm9idF9hcyk7CisgICAgaWYgKGVycikgeworICAgICAgICBnb3RvIGZhaWwwOworICAgIH0KKworICAgIGRzLT5maXJzdF90aW1lID0gMTsKKyAgICBvYnRfYXMuZW5kaWFubmVzcyA9IDA7CisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCAmb2J0X2FzKTsKKworICAgIGlmIChiYy5kd0J1ZmZlckJ5dGVzICYgaHctPmluZm8uYWxpZ24pIHsKKyAgICAgICAgZG9sb2cgKAorICAgICAgICAgICAgIkdldENhcHMgcmV0dXJuZWQgbWlzYWxpZ25lZCBidWZmZXIgc2l6ZSAlbGQsIGFsaWdubWVudCAlZFxuIiwKKyAgICAgICAgICAgIGJjLmR3QnVmZmVyQnl0ZXMsIGh3LT5pbmZvLmFsaWduICsgMQorICAgICAgICAgICAgKTsKKyAgICB9CisgICAgaHctPnNhbXBsZXMgPSBiYy5kd0J1ZmZlckJ5dGVzID4+IGh3LT5pbmZvLnNoaWZ0OworCisjaWZkZWYgREVCVUdfRFNPVU5ECisgICAgZG9sb2cgKCJjYXBzICVsZCwgZGVzYyAlbGRcbiIsCisgICAgICAgICAgIGJjLmR3QnVmZmVyQnl0ZXMsIGJkLmR3QnVmZmVyQnl0ZXMpOworCisgICAgZG9sb2cgKCJidWZzaXplICVkLCBmcmVxICVkLCBjaGFuICVkLCBmbXQgJWRcbiIsCisgICAgICAgICAgIGh3LT5idWZzaXplLCBzZXR0aW5ncy5mcmVxLCBzZXR0aW5ncy5uY2hhbm5lbHMsIHNldHRpbmdzLmZtdCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKKworIGZhaWwwOgorICAgIGdsdWUgKGRzb3VuZF9maW5pXywgVFlQRSkgKGh3KTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyN1bmRlZiBOQU1FCisjdW5kZWYgTkFNRTIKKyN1bmRlZiBUWVBFCisjdW5kZWYgSUZBQ0UKKyN1bmRlZiBCVUZQVFIKKyN1bmRlZiBGSUVMRAorI3VuZGVmIEZJRUxEMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9kc291bmRhdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby9kc291bmRhdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDc5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Rzb3VuZGF1ZGlvLmMKQEAgLTAsMCArMSwxMDMwIEBACisvKgorICogUUVNVSBEaXJlY3RTb3VuZCBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBTRUFMIDEuMDcgYnkgQ2FybG9zICdwZWwnIEhhc2FuIHdhcyB1c2VkIGFzIGRvY3VtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJhdWRpby5oIgorCisjZGVmaW5lIEFVRElPX0NBUCAiZHNvdW5kIgorI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisjaW5jbHVkZSA8b2JqYmFzZS5oPgorI2luY2x1ZGUgPGRzb3VuZC5oPgorCisjaW5jbHVkZSAiYXVkaW9fd2luX2ludC5oIgorCisvKiAjZGVmaW5lIERFQlVHX0RTT1VORCAqLworCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgbG9ja19yZXRyaWVzOworICAgIGludCByZXN0b3JlX3JldHJpZXM7CisgICAgaW50IGdldHN0YXR1c19yZXRyaWVzOworICAgIGludCBzZXRfcHJpbWFyeTsKKyAgICBpbnQgYnVmc2l6ZV9pbjsKKyAgICBpbnQgYnVmc2l6ZV9vdXQ7CisgICAgc3RydWN0IGF1ZHNldHRpbmdzIHNldHRpbmdzOworICAgIGludCBsYXRlbmN5X21pbGxpczsKK30gY29uZiA9IHsKKyAgICAubG9ja19yZXRyaWVzICAgICAgID0gMSwKKyAgICAucmVzdG9yZV9yZXRyaWVzICAgID0gMSwKKyAgICAuZ2V0c3RhdHVzX3JldHJpZXMgID0gMSwKKyAgICAuc2V0X3ByaW1hcnkgICAgICAgID0gMCwKKyAgICAuYnVmc2l6ZV9pbiAgICAgICAgID0gMTYzODQsCisgICAgLmJ1ZnNpemVfb3V0ICAgICAgICA9IDE2Mzg0LAorICAgIC5zZXR0aW5ncy5mcmVxICAgICAgPSA0NDEwMCwKKyAgICAuc2V0dGluZ3MubmNoYW5uZWxzID0gMiwKKyAgICAuc2V0dGluZ3MuZm10ICAgICAgID0gQVVEX0ZNVF9TMTYsCisgICAgLmxhdGVuY3lfbWlsbGlzICAgICA9IDEwCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTFBESVJFQ1RTT1VORCBkc291bmQ7CisgICAgTFBESVJFQ1RTT1VORENBUFRVUkUgZHNvdW5kX2NhcHR1cmU7CisgICAgTFBESVJFQ1RTT1VOREJVRkZFUiBkc291bmRfcHJpbWFyeV9idWZmZXI7CisgICAgc3RydWN0IGF1ZHNldHRpbmdzIHNldHRpbmdzOworfSBkc291bmQ7CisKK3N0YXRpYyBkc291bmQgZ2xvYl9kc291bmQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBIV1ZvaWNlT3V0IGh3OworICAgIExQRElSRUNUU09VTkRCVUZGRVIgZHNvdW5kX2J1ZmZlcjsKKyAgICBEV09SRCBvbGRfcG9zOworICAgIGludCBmaXJzdF90aW1lOworI2lmZGVmIERFQlVHX0RTT1VORAorICAgIERXT1JEIG9sZF9wcG9zOworICAgIERXT1JEIHBsYXllZDsKKyAgICBEV09SRCBtaXhlZDsKKyNlbmRpZgorfSBEU291bmRWb2ljZU91dDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEhXVm9pY2VJbiBodzsKKyAgICBpbnQgZmlyc3RfdGltZTsKKyAgICBMUERJUkVDVFNPVU5EQ0FQVFVSRUJVRkZFUiBkc291bmRfY2FwdHVyZV9idWZmZXI7Cit9IERTb3VuZFZvaWNlSW47CisKK3N0YXRpYyB2b2lkIGRzb3VuZF9sb2dfaHJlc3VsdCAoSFJFU1VMVCBocikKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSAiQlVHIjsKKworICAgIHN3aXRjaCAoaHIpIHsKKyAgICBjYXNlIERTX09LOgorICAgICAgICBzdHIgPSAiVGhlIG1ldGhvZCBzdWNjZWVkZWQiOworICAgICAgICBicmVhazsKKyNpZmRlZiBEU19OT19WSVJUVUFMSVpBVElPTgorICAgIGNhc2UgRFNfTk9fVklSVFVBTElaQVRJT046CisgICAgICAgIHN0ciA9ICJUaGUgYnVmZmVyIHdhcyBjcmVhdGVkLCBidXQgYW5vdGhlciAzRCBhbGdvcml0aG0gd2FzIHN1YnN0aXR1dGVkIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU19JTkNPTVBMRVRFCisgICAgY2FzZSBEU19JTkNPTVBMRVRFOgorICAgICAgICBzdHIgPSAiVGhlIG1ldGhvZCBzdWNjZWVkZWQsIGJ1dCBub3QgYWxsIHRoZSBvcHRpb25hbCBlZmZlY3RzIHdlcmUgb2J0YWluZWQiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0FDQ0VTU0RFTklFRAorICAgIGNhc2UgRFNFUlJfQUNDRVNTREVOSUVEOgorICAgICAgICBzdHIgPSAiVGhlIHJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgYWNjZXNzIHdhcyBkZW5pZWQiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0FMTE9DQVRFRAorICAgIGNhc2UgRFNFUlJfQUxMT0NBVEVEOgorICAgICAgICBzdHIgPSAiVGhlIHJlcXVlc3QgZmFpbGVkIGJlY2F1c2UgcmVzb3VyY2VzLCBzdWNoIGFzIGEgcHJpb3JpdHkgbGV2ZWwsIHdlcmUgYWxyZWFkeSBpbiB1c2UgYnkgYW5vdGhlciBjYWxsZXIiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0FMUkVBRFlJTklUSUFMSVpFRAorICAgIGNhc2UgRFNFUlJfQUxSRUFEWUlOSVRJQUxJWkVEOgorICAgICAgICBzdHIgPSAiVGhlIG9iamVjdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9CQURGT1JNQVQKKyAgICBjYXNlIERTRVJSX0JBREZPUk1BVDoKKyAgICAgICAgc3RyID0gIlRoZSBzcGVjaWZpZWQgd2F2ZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfQkFEU0VOREJVRkZFUkdVSUQKKyAgICBjYXNlIERTRVJSX0JBRFNFTkRCVUZGRVJHVUlEOgorICAgICAgICBzdHIgPSAiVGhlIEdVSUQgc3BlY2lmaWVkIGluIGFuIGF1ZGlvcGF0aCBmaWxlIGRvZXMgbm90IG1hdGNoIGEgdmFsaWQgbWl4LWluIGJ1ZmZlciI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfQlVGRkVSTE9TVAorICAgIGNhc2UgRFNFUlJfQlVGRkVSTE9TVDoKKyAgICAgICAgc3RyID0gIlRoZSBidWZmZXIgbWVtb3J5IGhhcyBiZWVuIGxvc3QgYW5kIG11c3QgYmUgcmVzdG9yZWQiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0JVRkZFUlRPT1NNQUxMCisgICAgY2FzZSBEU0VSUl9CVUZGRVJUT09TTUFMTDoKKyAgICAgICAgc3RyID0gIlRoZSBidWZmZXIgc2l6ZSBpcyBub3QgZ3JlYXQgZW5vdWdoIHRvIGVuYWJsZSBlZmZlY3RzIHByb2Nlc3NpbmciOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0NPTlRST0xVTkFWQUlMCisgICAgY2FzZSBEU0VSUl9DT05UUk9MVU5BVkFJTDoKKyAgICAgICAgc3RyID0gIlRoZSBidWZmZXIgY29udHJvbCAodm9sdW1lLCBwYW4sIGFuZCBzbyBvbikgcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIgaXMgbm90IGF2YWlsYWJsZS4gQ29udHJvbHMgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGNyZWF0ZWQsIHVzaW5nIHRoZSBkd0ZsYWdzIG1lbWJlciBvZiBEU0JVRkZFUkRFU0MiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0RTOF9SRVFVSVJFRAorICAgIGNhc2UgRFNFUlJfRFM4X1JFUVVJUkVEOgorICAgICAgICBzdHIgPSAiQSBEaXJlY3RTb3VuZCBvYmplY3Qgb2YgY2xhc3MgQ0xTSURfRGlyZWN0U291bmQ4IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uYWxpdHkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgSURpcmVjdFNvdW5kOCBJbnRlcmZhY2UiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX0ZYVU5BVkFJTEFCTEUKKyAgICBjYXNlIERTRVJSX0ZYVU5BVkFJTEFCTEU6CisgICAgICAgIHN0ciA9ICJUaGUgZWZmZWN0cyByZXF1ZXN0ZWQgY291bGQgbm90IGJlIGZvdW5kIG9uIHRoZSBzeXN0ZW0sIG9yIHRoZXkgYXJlIGluIHRoZSB3cm9uZyBvcmRlciBvciBpbiB0aGUgd3JvbmcgbG9jYXRpb247IGZvciBleGFtcGxlLCBhbiBlZmZlY3QgZXhwZWN0ZWQgaW4gaGFyZHdhcmUgd2FzIGZvdW5kIGluIHNvZnR3YXJlIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9HRU5FUklDCisgICAgY2FzZSBEU0VSUl9HRU5FUklDIDoKKyAgICAgICAgc3RyID0gIkFuIHVuZGV0ZXJtaW5lZCBlcnJvciBvY2N1cnJlZCBpbnNpZGUgdGhlIERpcmVjdFNvdW5kIHN1YnN5c3RlbSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfSU5WQUxJRENBTEwKKyAgICBjYXNlIERTRVJSX0lOVkFMSURDQUxMOgorICAgICAgICBzdHIgPSAiVGhpcyBmdW5jdGlvbiBpcyBub3QgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMgb2JqZWN0IjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9JTlZBTElEUEFSQU0KKyAgICBjYXNlIERTRVJSX0lOVkFMSURQQVJBTToKKyAgICAgICAgc3RyID0gIkFuIGludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQgdG8gdGhlIHJldHVybmluZyBmdW5jdGlvbiI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfTk9BR0dSRUdBVElPTgorICAgIGNhc2UgRFNFUlJfTk9BR0dSRUdBVElPTjoKKyAgICAgICAgc3RyID0gIlRoZSBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBhZ2dyZWdhdGlvbiI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfTk9EUklWRVIKKyAgICBjYXNlIERTRVJSX05PRFJJVkVSOgorICAgICAgICBzdHIgPSAiTm8gc291bmQgZHJpdmVyIGlzIGF2YWlsYWJsZSBmb3IgdXNlLCBvciB0aGUgZ2l2ZW4gR1VJRCBpcyBub3QgYSB2YWxpZCBEaXJlY3RTb3VuZCBkZXZpY2UgSUQiOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX05PSU5URVJGQUNFCisgICAgY2FzZSBEU0VSUl9OT0lOVEVSRkFDRToKKyAgICAgICAgc3RyID0gIlRoZSByZXF1ZXN0ZWQgQ09NIGludGVyZmFjZSBpcyBub3QgYXZhaWxhYmxlIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9PQkpFQ1ROT1RGT1VORAorICAgIGNhc2UgRFNFUlJfT0JKRUNUTk9URk9VTkQ6CisgICAgICAgIHN0ciA9ICJUaGUgcmVxdWVzdGVkIG9iamVjdCB3YXMgbm90IGZvdW5kIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9PVEhFUkFQUEhBU1BSSU8KKyAgICBjYXNlIERTRVJSX09USEVSQVBQSEFTUFJJTzoKKyAgICAgICAgc3RyID0gIkFub3RoZXIgYXBwbGljYXRpb24gaGFzIGEgaGlnaGVyIHByaW9yaXR5IGxldmVsLCBwcmV2ZW50aW5nIHRoaXMgY2FsbCBmcm9tIHN1Y2NlZWRpbmciOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERTRVJSX09VVE9GTUVNT1JZCisgICAgY2FzZSBEU0VSUl9PVVRPRk1FTU9SWToKKyAgICAgICAgc3RyID0gIlRoZSBEaXJlY3RTb3VuZCBzdWJzeXN0ZW0gY291bGQgbm90IGFsbG9jYXRlIHN1ZmZpY2llbnQgbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBjYWxsZXIncyByZXF1ZXN0IjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9QUklPTEVWRUxORUVERUQKKyAgICBjYXNlIERTRVJSX1BSSU9MRVZFTE5FRURFRDoKKyAgICAgICAgc3RyID0gIkEgY29vcGVyYXRpdmUgbGV2ZWwgb2YgRFNTQ0xfUFJJT1JJVFkgb3IgaGlnaGVyIGlzIHJlcXVpcmVkIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9TRU5ETE9PUAorICAgIGNhc2UgRFNFUlJfU0VORExPT1A6CisgICAgICAgIHN0ciA9ICJBIGNpcmN1bGFyIGxvb3Agb2Ygc2VuZCBlZmZlY3RzIHdhcyBkZXRlY3RlZCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRFNFUlJfVU5JTklUSUFMSVpFRAorICAgIGNhc2UgRFNFUlJfVU5JTklUSUFMSVpFRDoKKyAgICAgICAgc3RyID0gIlRoZSBJbml0aWFsaXplIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkIG9yIGhhcyBub3QgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5IGJlZm9yZSBvdGhlciBtZXRob2RzIHdlcmUgY2FsbGVkIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEU0VSUl9VTlNVUFBPUlRFRAorICAgIGNhc2UgRFNFUlJfVU5TVVBQT1JURUQ6CisgICAgICAgIHN0ciA9ICJUaGUgZnVuY3Rpb24gY2FsbGVkIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246IFVua25vd24gKEhSRVNVTFQgJSNseClcbiIsIGhyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIlJlYXNvbjogJXNcbiIsIHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIEdDQ19GTVRfQVRUUiAoMiwgMykgZHNvdW5kX2xvZ2VyciAoCisgICAgSFJFU1VMVCBociwKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgLi4uCisgICAgKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgQVVEX3Zsb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBkc291bmRfbG9nX2hyZXN1bHQgKGhyKTsKK30KKworc3RhdGljIHZvaWQgR0NDX0ZNVF9BVFRSICgzLCA0KSBkc291bmRfbG9nZXJyMiAoCisgICAgSFJFU1VMVCBociwKKyAgICBjb25zdCBjaGFyICp0eXAsCisgICAgY29uc3QgY2hhciAqZm10LAorICAgIC4uLgorICAgICkKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiQ291bGQgbm90IGluaXRpYWxpemUgJXNcbiIsIHR5cCk7CisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF92bG9nIChBVURJT19DQVAsIGZtdCwgYXApOworICAgIHZhX2VuZCAoYXApOworCisgICAgZHNvdW5kX2xvZ19ocmVzdWx0IChocik7Cit9CisKK3N0YXRpYyBEV09SRCBtaWxsaXNfdG9fYnl0ZXMgKHN0cnVjdCBhdWRpb19wY21faW5mbyAqaW5mbywgRFdPUkQgbWlsbGlzKQoreworICAgIHJldHVybiAobWlsbGlzICogaW5mby0+Ynl0ZXNfcGVyX3NlY29uZCkgLyAxMDAwOworfQorCisjaWZkZWYgREVCVUdfRFNPVU5ECitzdGF0aWMgdm9pZCBwcmludF93YXZlX2Zvcm1hdCAoV0FWRUZPUk1BVEVYICp3ZngpCit7CisgICAgZG9sb2cgKCJ0YWcgICAgICAgICAgICAgPSAlZFxuIiwgd2Z4LT53Rm9ybWF0VGFnKTsKKyAgICBkb2xvZyAoIm5DaGFubmVscyAgICAgICA9ICVkXG4iLCB3ZngtPm5DaGFubmVscyk7CisgICAgZG9sb2cgKCJuU2FtcGxlc1BlclNlYyAgPSAlbGRcbiIsIHdmeC0+blNhbXBsZXNQZXJTZWMpOworICAgIGRvbG9nICgibkF2Z0J5dGVzUGVyU2VjID0gJWxkXG4iLCB3ZngtPm5BdmdCeXRlc1BlclNlYyk7CisgICAgZG9sb2cgKCJuQmxvY2tBbGlnbiAgICAgPSAlZFxuIiwgd2Z4LT5uQmxvY2tBbGlnbik7CisgICAgZG9sb2cgKCJ3Qml0c1BlclNhbXBsZSAgPSAlZFxuIiwgd2Z4LT53Qml0c1BlclNhbXBsZSk7CisgICAgZG9sb2cgKCJjYlNpemUgICAgICAgICAgPSAlZFxuIiwgd2Z4LT5jYlNpemUpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHNvdW5kX3Jlc3RvcmVfb3V0IChMUERJUkVDVFNPVU5EQlVGRkVSIGRzYikKK3sKKyAgICBIUkVTVUxUIGhyOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNvbmYucmVzdG9yZV9yZXRyaWVzOyArK2kpIHsKKyAgICAgICAgaHIgPSBJRGlyZWN0U291bmRCdWZmZXJfUmVzdG9yZSAoZHNiKTsKKworICAgICAgICBzd2l0Y2ggKGhyKSB7CisgICAgICAgIGNhc2UgRFNfT0s6CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIERTRVJSX0JVRkZFUkxPU1Q6CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgcmVzdG9yZSBwbGF5YmFjayBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgZG9sb2cgKCIlZCBhdHRlbXB0cyB0byByZXN0b3JlIHBsYXliYWNrIGJ1ZmZlciBmYWlsZWRcbiIsIGkpOworICAgIHJldHVybiAtMTsKK30KKworI2luY2x1ZGUgImRzb3VuZF90ZW1wbGF0ZS5oIgorI2RlZmluZSBEU0JUWVBFX0lOCisjaW5jbHVkZSAiZHNvdW5kX3RlbXBsYXRlLmgiCisjdW5kZWYgRFNCVFlQRV9JTgorCitzdGF0aWMgaW50IGRzb3VuZF9nZXRfc3RhdHVzX291dCAoTFBESVJFQ1RTT1VOREJVRkZFUiBkc2IsIERXT1JEICpzdGF0dXNwKQoreworICAgIEhSRVNVTFQgaHI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY29uZi5nZXRzdGF0dXNfcmV0cmllczsgKytpKSB7CisgICAgICAgIGhyID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldFN0YXR1cyAoZHNiLCBzdGF0dXNwKTsKKyAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCBnZXQgcGxheWJhY2sgYnVmZmVyIHN0YXR1c1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKnN0YXR1c3AgJiBEU0VSUl9CVUZGRVJMT1NUKSB7CisgICAgICAgICAgICBpZiAoZHNvdW5kX3Jlc3RvcmVfb3V0IChkc2IpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNvdW5kX2dldF9zdGF0dXNfaW4gKExQRElSRUNUU09VTkRDQVBUVVJFQlVGRkVSIGRzY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCAqc3RhdHVzcCkKK3sKKyAgICBIUkVTVUxUIGhyOworCisgICAgaHIgPSBJRGlyZWN0U291bmRDYXB0dXJlQnVmZmVyX0dldFN0YXR1cyAoZHNjYiwgc3RhdHVzcCk7CisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IGdldCBjYXB0dXJlIGJ1ZmZlciBzdGF0dXNcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRzb3VuZF93cml0ZV9zYW1wbGUgKEhXVm9pY2VPdXQgKmh3LCB1aW50OF90ICpkc3QsIGludCBkc3RfbGVuKQoreworICAgIGludCBzcmNfbGVuMSA9IGRzdF9sZW47CisgICAgaW50IHNyY19sZW4yID0gMDsKKyAgICBpbnQgcG9zID0gaHctPnJwb3MgKyBkc3RfbGVuOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzEgPSBody0+bWl4X2J1ZiArIGh3LT5ycG9zOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzIgPSBOVUxMOworCisgICAgaWYgKHBvcyA+IGh3LT5zYW1wbGVzKSB7CisgICAgICAgIHNyY19sZW4xID0gaHctPnNhbXBsZXMgLSBody0+cnBvczsKKyAgICAgICAgc3JjMiA9IGh3LT5taXhfYnVmOworICAgICAgICBzcmNfbGVuMiA9IGRzdF9sZW4gLSBzcmNfbGVuMTsKKyAgICAgICAgcG9zID0gc3JjX2xlbjI7CisgICAgfQorCisgICAgaWYgKHNyY19sZW4xKSB7CisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYzEsIHNyY19sZW4xKTsKKyAgICB9CisKKyAgICBpZiAoc3JjX2xlbjIpIHsKKyAgICAgICAgZHN0ID0gYWR2YW5jZSAoZHN0LCBzcmNfbGVuMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYzIsIHNyY19sZW4yKTsKKyAgICB9CisKKyAgICBody0+cnBvcyA9IHBvcyAlIGh3LT5zYW1wbGVzOworfQorCitzdGF0aWMgdm9pZCBkc291bmRfY2xlYXJfc2FtcGxlIChIV1ZvaWNlT3V0ICpodywgTFBESVJFQ1RTT1VOREJVRkZFUiBkc2IpCit7CisgICAgaW50IGVycjsKKyAgICBMUFZPSUQgcDEsIHAyOworICAgIERXT1JEIGJsZW4xLCBibGVuMiwgbGVuMSwgbGVuMjsKKworICAgIGVyciA9IGRzb3VuZF9sb2NrX291dCAoCisgICAgICAgIGRzYiwKKyAgICAgICAgJmh3LT5pbmZvLAorICAgICAgICAwLAorICAgICAgICBody0+c2FtcGxlcyA8PCBody0+aW5mby5zaGlmdCwKKyAgICAgICAgJnAxLCAmcDIsCisgICAgICAgICZibGVuMSwgJmJsZW4yLAorICAgICAgICAxCisgICAgICAgICk7CisgICAgaWYgKGVycikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbGVuMSA9IGJsZW4xID4+IGh3LT5pbmZvLnNoaWZ0OworICAgIGxlbjIgPSBibGVuMiA+PiBody0+aW5mby5zaGlmdDsKKworI2lmZGVmIERFQlVHX0RTT1VORAorICAgIGRvbG9nICgiY2xlYXIgJXAsJWxkLCVsZCAlcCwlbGQsJWxkXG4iLAorICAgICAgICAgICBwMSwgYmxlbjEsIGxlbjEsCisgICAgICAgICAgIHAyLCBibGVuMiwgbGVuMik7CisjZW5kaWYKKworICAgIGlmIChwMSAmJiBsZW4xKSB7CisgICAgICAgIGF1ZGlvX3BjbV9pbmZvX2NsZWFyX2J1ZiAoJmh3LT5pbmZvLCBwMSwgbGVuMSk7CisgICAgfQorCisgICAgaWYgKHAyICYmIGxlbjIpIHsKKyAgICAgICAgYXVkaW9fcGNtX2luZm9fY2xlYXJfYnVmICgmaHctPmluZm8sIHAyLCBsZW4yKTsKKyAgICB9CisKKyAgICBkc291bmRfdW5sb2NrX291dCAoZHNiLCBwMSwgcDIsIGJsZW4xLCBibGVuMik7Cit9CisKK3N0YXRpYyB2b2lkIGRzb3VuZF9jbG9zZSAoZHNvdW5kICpzKQoreworICAgIEhSRVNVTFQgaHI7CisKKyAgICBpZiAocy0+ZHNvdW5kX3ByaW1hcnlfYnVmZmVyKSB7CisgICAgICAgIGhyID0gSURpcmVjdFNvdW5kQnVmZmVyX1JlbGVhc2UgKHMtPmRzb3VuZF9wcmltYXJ5X2J1ZmZlcik7CisgICAgICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgcmVsZWFzZSBwcmltYXJ5IGJ1ZmZlclxuIik7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZHNvdW5kX3ByaW1hcnlfYnVmZmVyID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZHNvdW5kX29wZW4gKGRzb3VuZCAqcykKK3sKKyAgICBpbnQgZXJyOworICAgIEhSRVNVTFQgaHI7CisgICAgV0FWRUZPUk1BVEVYIHdmeDsKKyAgICBEU0JVRkZFUkRFU0MgZHNiZDsKKyAgICBIV05EIGh3bmQ7CisKKyAgICBod25kID0gR2V0Rm9yZWdyb3VuZFdpbmRvdyAoKTsKKyAgICBociA9IElEaXJlY3RTb3VuZF9TZXRDb29wZXJhdGl2ZUxldmVsICgKKyAgICAgICAgcy0+ZHNvdW5kLAorICAgICAgICBod25kLAorICAgICAgICBEU1NDTF9QUklPUklUWQorICAgICAgICApOworCisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IHNldCBjb29wZXJhdGl2ZSBsZXZlbCBmb3Igd2luZG93ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBod25kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghY29uZi5zZXRfcHJpbWFyeSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlcnIgPSB3YXZlZm9ybWF0X2Zyb21fYXVkaW9fc2V0dGluZ3MgKCZ3ZngsICZjb25mLnNldHRpbmdzKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQgKCZkc2JkLCAwLCBzaXplb2YgKGRzYmQpKTsKKyAgICBkc2JkLmR3U2l6ZSA9IHNpemVvZiAoZHNiZCk7CisgICAgZHNiZC5kd0ZsYWdzID0gRFNCQ0FQU19QUklNQVJZQlVGRkVSOworICAgIGRzYmQuZHdCdWZmZXJCeXRlcyA9IDA7CisgICAgZHNiZC5scHdmeEZvcm1hdCA9IE5VTEw7CisKKyAgICBociA9IElEaXJlY3RTb3VuZF9DcmVhdGVTb3VuZEJ1ZmZlciAoCisgICAgICAgIHMtPmRzb3VuZCwKKyAgICAgICAgJmRzYmQsCisgICAgICAgICZzLT5kc291bmRfcHJpbWFyeV9idWZmZXIsCisgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgY3JlYXRlIHByaW1hcnkgcGxheWJhY2sgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGhyID0gSURpcmVjdFNvdW5kQnVmZmVyX1NldEZvcm1hdCAocy0+ZHNvdW5kX3ByaW1hcnlfYnVmZmVyLCAmd2Z4KTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3Qgc2V0IHByaW1hcnkgcGxheWJhY2sgYnVmZmVyIGZvcm1hdFxuIik7CisgICAgfQorCisgICAgaHIgPSBJRGlyZWN0U291bmRCdWZmZXJfR2V0Rm9ybWF0ICgKKyAgICAgICAgcy0+ZHNvdW5kX3ByaW1hcnlfYnVmZmVyLAorICAgICAgICAmd2Z4LAorICAgICAgICBzaXplb2YgKHdmeCksCisgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgZ2V0IHByaW1hcnkgcGxheWJhY2sgYnVmZmVyIGZvcm1hdFxuIik7CisgICAgICAgIGdvdG8gZmFpbDA7CisgICAgfQorCisjaWZkZWYgREVCVUdfRFNPVU5ECisgICAgZG9sb2cgKCJQcmltYXJ5XG4iKTsKKyAgICBwcmludF93YXZlX2Zvcm1hdCAoJndmeCk7CisjZW5kaWYKKworICAgIGVyciA9IHdhdmVmb3JtYXRfdG9fYXVkaW9fc2V0dGluZ3MgKCZ3ZngsICZzLT5zZXR0aW5ncyk7CisgICAgaWYgKGVycikgeworICAgICAgICBnb3RvIGZhaWwwOworICAgIH0KKworICAgIHJldHVybiAwOworCisgZmFpbDA6CisgICAgZHNvdW5kX2Nsb3NlIChzKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHNvdW5kX2N0bF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBEV09SRCBzdGF0dXM7CisgICAgRFNvdW5kVm9pY2VPdXQgKmRzID0gKERTb3VuZFZvaWNlT3V0ICopIGh3OworICAgIExQRElSRUNUU09VTkRCVUZGRVIgZHNiID0gZHMtPmRzb3VuZF9idWZmZXI7CisKKyAgICBpZiAoIWRzYikgeworICAgICAgICBkb2xvZyAoIkF0dGVtcHQgdG8gY29udHJvbCB2b2ljZSB3aXRob3V0IGEgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFZPSUNFX0VOQUJMRToKKyAgICAgICAgaWYgKGRzb3VuZF9nZXRfc3RhdHVzX291dCAoZHNiLCAmc3RhdHVzKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIERTQlNUQVRVU19QTEFZSU5HKSB7CisgICAgICAgICAgICBkb2xvZyAoIndhcm5pbmc6IFZvaWNlIGlzIGFscmVhZHkgcGxheWluZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRzb3VuZF9jbGVhcl9zYW1wbGUgKGh3LCBkc2IpOworCisgICAgICAgIGhyID0gSURpcmVjdFNvdW5kQnVmZmVyX1BsYXkgKGRzYiwgMCwgMCwgRFNCUExBWV9MT09QSU5HKTsKKyAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCBzdGFydCBwbGF5aW5nIGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZPSUNFX0RJU0FCTEU6CisgICAgICAgIGlmIChkc291bmRfZ2V0X3N0YXR1c19vdXQgKGRzYiwgJnN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgJiBEU0JTVEFUVVNfUExBWUlORykgeworICAgICAgICAgICAgaHIgPSBJRGlyZWN0U291bmRCdWZmZXJfU3RvcCAoZHNiKTsKKyAgICAgICAgICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICAgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IHN0b3AgcGxheWluZyBidWZmZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvbG9nICgid2FybmluZzogVm9pY2UgaXMgbm90IHBsYXlpbmdcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc291bmRfd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd193cml0ZSAoc3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCBkc291bmRfcnVuX291dCAoSFdWb2ljZU91dCAqaHcsIGludCBsaXZlKQoreworICAgIGludCBlcnI7CisgICAgSFJFU1VMVCBocjsKKyAgICBEU291bmRWb2ljZU91dCAqZHMgPSAoRFNvdW5kVm9pY2VPdXQgKikgaHc7CisgICAgTFBESVJFQ1RTT1VOREJVRkZFUiBkc2IgPSBkcy0+ZHNvdW5kX2J1ZmZlcjsKKyAgICBpbnQgbGVuLCBod3NoaWZ0OworICAgIERXT1JEIGJsZW4xLCBibGVuMjsKKyAgICBEV09SRCBsZW4xLCBsZW4yOworICAgIERXT1JEIGRlY3I7CisgICAgRFdPUkQgd3BvcywgcHBvcywgb2xkX3BvczsKKyAgICBMUFZPSUQgcDEsIHAyOworICAgIGludCBidWZzaXplOworCisgICAgaWYgKCFkc2IpIHsKKyAgICAgICAgZG9sb2cgKCJBdHRlbXB0IHRvIHJ1biBlbXB0eSB3aXRoIHBsYXliYWNrIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGh3c2hpZnQgPSBody0+aW5mby5zaGlmdDsKKyAgICBidWZzaXplID0gaHctPnNhbXBsZXMgPDwgaHdzaGlmdDsKKworICAgIGhyID0gSURpcmVjdFNvdW5kQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbiAoCisgICAgICAgIGRzYiwKKyAgICAgICAgJnBwb3MsCisgICAgICAgIGRzLT5maXJzdF90aW1lID8gJndwb3MgOiBOVUxMCisgICAgICAgICk7CisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IGdldCBwbGF5YmFjayBidWZmZXIgcG9zaXRpb25cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4gPSBsaXZlIDw8IGh3c2hpZnQ7CisKKyAgICBpZiAoZHMtPmZpcnN0X3RpbWUpIHsKKyAgICAgICAgaWYgKGNvbmYubGF0ZW5jeV9taWxsaXMpIHsKKyAgICAgICAgICAgIERXT1JEIGN1cl9ibGF0OworCisgICAgICAgICAgICBjdXJfYmxhdCA9IGF1ZGlvX3JpbmdfZGlzdCAod3BvcywgcHBvcywgYnVmc2l6ZSk7CisgICAgICAgICAgICBkcy0+Zmlyc3RfdGltZSA9IDA7CisgICAgICAgICAgICBvbGRfcG9zID0gd3BvczsKKyAgICAgICAgICAgIG9sZF9wb3MgKz0KKyAgICAgICAgICAgICAgICBtaWxsaXNfdG9fYnl0ZXMgKCZody0+aW5mbywgY29uZi5sYXRlbmN5X21pbGxpcykgLSBjdXJfYmxhdDsKKyAgICAgICAgICAgIG9sZF9wb3MgJT0gYnVmc2l6ZTsKKyAgICAgICAgICAgIG9sZF9wb3MgJj0gfmh3LT5pbmZvLmFsaWduOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb2xkX3BvcyA9IHdwb3M7CisgICAgICAgIH0KKyNpZmRlZiBERUJVR19EU09VTkQKKyAgICAgICAgZHMtPnBsYXllZCA9IDA7CisgICAgICAgIGRzLT5taXhlZCA9IDA7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChkcy0+b2xkX3BvcyA9PSBwcG9zKSB7CisjaWZkZWYgREVCVUdfRFNPVU5ECisgICAgICAgICAgICBkb2xvZyAoIm9sZF9wb3MgPT0gcHBvc1xuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyNpZmRlZiBERUJVR19EU09VTkQKKyAgICAgICAgZHMtPnBsYXllZCArPSBhdWRpb19yaW5nX2Rpc3QgKGRzLT5vbGRfcG9zLCBwcG9zLCBody0+YnVmc2l6ZSk7CisjZW5kaWYKKyAgICAgICAgb2xkX3BvcyA9IGRzLT5vbGRfcG9zOworICAgIH0KKworICAgIGlmICgob2xkX3BvcyA8IHBwb3MpICYmICgob2xkX3BvcyArIGxlbikgPiBwcG9zKSkgeworICAgICAgICBsZW4gPSBwcG9zIC0gb2xkX3BvczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICgob2xkX3BvcyA+IHBwb3MpICYmICgob2xkX3BvcyArIGxlbikgPiAocHBvcyArIGJ1ZnNpemUpKSkgeworICAgICAgICAgICAgbGVuID0gYnVmc2l6ZSAtIG9sZF9wb3MgKyBwcG9zOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgbGVuIDwgMCB8fCBsZW4gPiBidWZzaXplKSkgeworICAgICAgICBkb2xvZyAoImxlbj0lZCBidWZzaXplPSVkIG9sZF9wb3M9JWxkIHBwb3M9JWxkXG4iLAorICAgICAgICAgICAgICAgbGVuLCBidWZzaXplLCBvbGRfcG9zLCBwcG9zKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGVuICY9IH5ody0+aW5mby5hbGlnbjsKKyAgICBpZiAoIWxlbikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyNpZmRlZiBERUJVR19EU09VTkQKKyAgICBkcy0+b2xkX3Bwb3MgPSBwcG9zOworI2VuZGlmCisgICAgZXJyID0gZHNvdW5kX2xvY2tfb3V0ICgKKyAgICAgICAgZHNiLAorICAgICAgICAmaHctPmluZm8sCisgICAgICAgIG9sZF9wb3MsCisgICAgICAgIGxlbiwKKyAgICAgICAgJnAxLCAmcDIsCisgICAgICAgICZibGVuMSwgJmJsZW4yLAorICAgICAgICAwCisgICAgICAgICk7CisgICAgaWYgKGVycikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4xID0gYmxlbjEgPj4gaHdzaGlmdDsKKyAgICBsZW4yID0gYmxlbjIgPj4gaHdzaGlmdDsKKyAgICBkZWNyID0gbGVuMSArIGxlbjI7CisKKyAgICBpZiAocDEgJiYgbGVuMSkgeworICAgICAgICBkc291bmRfd3JpdGVfc2FtcGxlIChodywgcDEsIGxlbjEpOworICAgIH0KKworICAgIGlmIChwMiAmJiBsZW4yKSB7CisgICAgICAgIGRzb3VuZF93cml0ZV9zYW1wbGUgKGh3LCBwMiwgbGVuMik7CisgICAgfQorCisgICAgZHNvdW5kX3VubG9ja19vdXQgKGRzYiwgcDEsIHAyLCBibGVuMSwgYmxlbjIpOworICAgIGRzLT5vbGRfcG9zID0gKG9sZF9wb3MgKyAoZGVjciA8PCBod3NoaWZ0KSkgJSBidWZzaXplOworCisjaWZkZWYgREVCVUdfRFNPVU5ECisgICAgZHMtPm1peGVkICs9IGRlY3IgPDwgaHdzaGlmdDsKKworICAgIGRvbG9nICgicGxheWVkICVsdSBtaXhlZCAlbHUgZGlmZiAlbGQgc2VjICVmXG4iLAorICAgICAgICAgICBkcy0+cGxheWVkLAorICAgICAgICAgICBkcy0+bWl4ZWQsCisgICAgICAgICAgIGRzLT5taXhlZCAtIGRzLT5wbGF5ZWQsCisgICAgICAgICAgIGFicyAoZHMtPm1peGVkIC0gZHMtPnBsYXllZCkgLyAoZG91YmxlKSBody0+aW5mby5ieXRlc19wZXJfc2Vjb25kKTsKKyNlbmRpZgorICAgIHJldHVybiBkZWNyOworfQorCitzdGF0aWMgaW50IGRzb3VuZF9jdGxfaW4gKEhXVm9pY2VJbiAqaHcsIGludCBjbWQsIC4uLikKK3sKKyAgICBIUkVTVUxUIGhyOworICAgIERXT1JEIHN0YXR1czsKKyAgICBEU291bmRWb2ljZUluICpkcyA9IChEU291bmRWb2ljZUluICopIGh3OworICAgIExQRElSRUNUU09VTkRDQVBUVVJFQlVGRkVSIGRzY2IgPSBkcy0+ZHNvdW5kX2NhcHR1cmVfYnVmZmVyOworCisgICAgaWYgKCFkc2NiKSB7CisgICAgICAgIGRvbG9nICgiQXR0ZW1wdCB0byBjb250cm9sIGNhcHR1cmUgdm9pY2Ugd2l0aG91dCBhIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgVk9JQ0VfRU5BQkxFOgorICAgICAgICBpZiAoZHNvdW5kX2dldF9zdGF0dXNfaW4gKGRzY2IsICZzdGF0dXMpKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzICYgRFNDQlNUQVRVU19DQVBUVVJJTkcpIHsKKyAgICAgICAgICAgIGRvbG9nICgid2FybmluZzogVm9pY2UgaXMgYWxyZWFkeSBjYXB0dXJpbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjbGVhciA/PyAqLworCisgICAgICAgIGhyID0gSURpcmVjdFNvdW5kQ2FwdHVyZUJ1ZmZlcl9TdGFydCAoZHNjYiwgRFNDQlNUQVJUX0xPT1BJTkcpOworICAgICAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IHN0YXJ0IGNhcHR1cmluZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZPSUNFX0RJU0FCTEU6CisgICAgICAgIGlmIChkc291bmRfZ2V0X3N0YXR1c19pbiAoZHNjYiwgJnN0YXR1cykpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgJiBEU0NCU1RBVFVTX0NBUFRVUklORykgeworICAgICAgICAgICAgaHIgPSBJRGlyZWN0U291bmRDYXB0dXJlQnVmZmVyX1N0b3AgKGRzY2IpOworICAgICAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3Qgc3RvcCBjYXB0dXJpbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvbG9nICgid2FybmluZzogVm9pY2UgaXMgbm90IGNhcHR1cmluZ1xuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzb3VuZF9yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd19yZWFkIChzdywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IGRzb3VuZF9ydW5faW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgaW50IGVycjsKKyAgICBIUkVTVUxUIGhyOworICAgIERTb3VuZFZvaWNlSW4gKmRzID0gKERTb3VuZFZvaWNlSW4gKikgaHc7CisgICAgTFBESVJFQ1RTT1VORENBUFRVUkVCVUZGRVIgZHNjYiA9IGRzLT5kc291bmRfY2FwdHVyZV9idWZmZXI7CisgICAgaW50IGxpdmUsIGxlbiwgZGVhZDsKKyAgICBEV09SRCBibGVuMSwgYmxlbjI7CisgICAgRFdPUkQgbGVuMSwgbGVuMjsKKyAgICBEV09SRCBkZWNyOworICAgIERXT1JEIGNwb3MsIHJwb3M7CisgICAgTFBWT0lEIHAxLCBwMjsKKyAgICBpbnQgaHdzaGlmdDsKKworICAgIGlmICghZHNjYikgeworICAgICAgICBkb2xvZyAoIkF0dGVtcHQgdG8gcnVuIHdpdGhvdXQgY2FwdHVyZSBidWZmZXJcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBod3NoaWZ0ID0gaHctPmluZm8uc2hpZnQ7CisKKyAgICBsaXZlID0gYXVkaW9fcGNtX2h3X2dldF9saXZlX2luIChodyk7CisgICAgZGVhZCA9IGh3LT5zYW1wbGVzIC0gbGl2ZTsKKyAgICBpZiAoIWRlYWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaHIgPSBJRGlyZWN0U291bmRDYXB0dXJlQnVmZmVyX0dldEN1cnJlbnRQb3NpdGlvbiAoCisgICAgICAgIGRzY2IsCisgICAgICAgICZjcG9zLAorICAgICAgICBkcy0+Zmlyc3RfdGltZSA/ICZycG9zIDogTlVMTAorICAgICAgICApOworICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCBnZXQgY2FwdHVyZSBidWZmZXIgcG9zaXRpb25cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZHMtPmZpcnN0X3RpbWUpIHsKKyAgICAgICAgZHMtPmZpcnN0X3RpbWUgPSAwOworICAgICAgICBpZiAocnBvcyAmIGh3LT5pbmZvLmFsaWduKSB7CisgICAgICAgICAgICBsZGVidWcgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIGNhcHR1cmUgcmVhZCBwb3NpdGlvbiAlbGQoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBycG9zLCBody0+aW5mby5hbGlnbik7CisgICAgICAgIH0KKyAgICAgICAgaHctPndwb3MgPSBycG9zID4+IGh3c2hpZnQ7CisgICAgfQorCisgICAgaWYgKGNwb3MgJiBody0+aW5mby5hbGlnbikgeworICAgICAgICBsZGVidWcgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIGNhcHR1cmUgcG9zaXRpb24gJWxkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICBjcG9zLCBody0+aW5mby5hbGlnbik7CisgICAgfQorICAgIGNwb3MgPj49IGh3c2hpZnQ7CisKKyAgICBsZW4gPSBhdWRpb19yaW5nX2Rpc3QgKGNwb3MsIGh3LT53cG9zLCBody0+c2FtcGxlcyk7CisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxlbiA9IGF1ZGlvX01JTiAobGVuLCBkZWFkKTsKKworICAgIGVyciA9IGRzb3VuZF9sb2NrX2luICgKKyAgICAgICAgZHNjYiwKKyAgICAgICAgJmh3LT5pbmZvLAorICAgICAgICBody0+d3BvcyA8PCBod3NoaWZ0LAorICAgICAgICBsZW4gPDwgaHdzaGlmdCwKKyAgICAgICAgJnAxLAorICAgICAgICAmcDIsCisgICAgICAgICZibGVuMSwKKyAgICAgICAgJmJsZW4yLAorICAgICAgICAwCisgICAgICAgICk7CisgICAgaWYgKGVycikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4xID0gYmxlbjEgPj4gaHdzaGlmdDsKKyAgICBsZW4yID0gYmxlbjIgPj4gaHdzaGlmdDsKKyAgICBkZWNyID0gbGVuMSArIGxlbjI7CisKKyAgICBpZiAocDEgJiYgbGVuMSkgeworICAgICAgICBody0+Y29udiAoaHctPmNvbnZfYnVmICsgaHctPndwb3MsIHAxLCBsZW4xLCAmbm9taW5hbF92b2x1bWUpOworICAgIH0KKworICAgIGlmIChwMiAmJiBsZW4yKSB7CisgICAgICAgIGh3LT5jb252IChody0+Y29udl9idWYsIHAyLCBsZW4yLCAmbm9taW5hbF92b2x1bWUpOworICAgIH0KKworICAgIGRzb3VuZF91bmxvY2tfaW4gKGRzY2IsIHAxLCBwMiwgYmxlbjEsIGJsZW4yKTsKKyAgICBody0+d3BvcyA9IChody0+d3BvcyArIGRlY3IpICUgaHctPnNhbXBsZXM7CisgICAgcmV0dXJuIGRlY3I7Cit9CisKK3N0YXRpYyB2b2lkIGRzb3VuZF9hdWRpb19maW5pICh2b2lkICpvcGFxdWUpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBkc291bmQgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAoIXMtPmRzb3VuZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaHIgPSBJRGlyZWN0U291bmRfUmVsZWFzZSAocy0+ZHNvdW5kKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgcmVsZWFzZSBEaXJlY3RTb3VuZFxuIik7CisgICAgfQorICAgIHMtPmRzb3VuZCA9IE5VTEw7CisKKyAgICBpZiAoIXMtPmRzb3VuZF9jYXB0dXJlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBociA9IElEaXJlY3RTb3VuZENhcHR1cmVfUmVsZWFzZSAocy0+ZHNvdW5kX2NhcHR1cmUpOworICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCByZWxlYXNlIERpcmVjdFNvdW5kQ2FwdHVyZVxuIik7CisgICAgfQorICAgIHMtPmRzb3VuZF9jYXB0dXJlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmRzb3VuZF9hdWRpb19pbml0ICh2b2lkKQoreworICAgIGludCBlcnI7CisgICAgSFJFU1VMVCBocjsKKyAgICBkc291bmQgKnMgPSAmZ2xvYl9kc291bmQ7CisKKyAgICBociA9IENvSW5pdGlhbGl6ZSAoTlVMTCk7CisgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IGluaXRpYWxpemUgQ09NXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlICgKKyAgICAgICAgJkNMU0lEX0RpcmVjdFNvdW5kLAorICAgICAgICBOVUxMLAorICAgICAgICBDTFNDVFhfQUxMLAorICAgICAgICAmSUlEX0lEaXJlY3RTb3VuZCwKKyAgICAgICAgKHZvaWQgKiopICZzLT5kc291bmQKKyAgICAgICAgKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgY3JlYXRlIERpcmVjdFNvdW5kIGluc3RhbmNlXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaHIgPSBJRGlyZWN0U291bmRfSW5pdGlhbGl6ZSAocy0+ZHNvdW5kLCBOVUxMKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBEaXJlY3RTb3VuZFxuIik7CisKKyAgICAgICAgaHIgPSBJRGlyZWN0U291bmRfUmVsZWFzZSAocy0+ZHNvdW5kKTsKKyAgICAgICAgaWYgKEZBSUxFRCAoaHIpKSB7CisgICAgICAgICAgICBkc291bmRfbG9nZXJyIChociwgIkNvdWxkIG5vdCByZWxlYXNlIERpcmVjdFNvdW5kXG4iKTsKKyAgICAgICAgfQorICAgICAgICBzLT5kc291bmQgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBociA9IENvQ3JlYXRlSW5zdGFuY2UgKAorICAgICAgICAmQ0xTSURfRGlyZWN0U291bmRDYXB0dXJlLAorICAgICAgICBOVUxMLAorICAgICAgICBDTFNDVFhfQUxMLAorICAgICAgICAmSUlEX0lEaXJlY3RTb3VuZENhcHR1cmUsCisgICAgICAgICh2b2lkICoqKSAmcy0+ZHNvdW5kX2NhcHR1cmUKKyAgICAgICAgKTsKKyAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgZHNvdW5kX2xvZ2VyciAoaHIsICJDb3VsZCBub3QgY3JlYXRlIERpcmVjdFNvdW5kQ2FwdHVyZSBpbnN0YW5jZVxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBociA9IElEaXJlY3RTb3VuZENhcHR1cmVfSW5pdGlhbGl6ZSAocy0+ZHNvdW5kX2NhcHR1cmUsIE5VTEwpOworICAgICAgICBpZiAoRkFJTEVEIChocikpIHsKKyAgICAgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IGluaXRpYWxpemUgRGlyZWN0U291bmRDYXB0dXJlXG4iKTsKKworICAgICAgICAgICAgaHIgPSBJRGlyZWN0U291bmRDYXB0dXJlX1JlbGVhc2UgKHMtPmRzb3VuZF9jYXB0dXJlKTsKKyAgICAgICAgICAgIGlmIChGQUlMRUQgKGhyKSkgeworICAgICAgICAgICAgICAgIGRzb3VuZF9sb2dlcnIgKGhyLCAiQ291bGQgbm90IHJlbGVhc2UgRGlyZWN0U291bmRDYXB0dXJlXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmRzb3VuZF9jYXB0dXJlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IGRzb3VuZF9vcGVuIChzKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGRzb3VuZF9hdWRpb19maW5pIChzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fb3B0aW9uIGRzb3VuZF9vcHRpb25zW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgPSAiTE9DS19SRVRSSUVTIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLmxvY2tfcmV0cmllcywKKyAgICAgICAgLmRlc2NyID0gIk51bWJlciBvZiB0aW1lcyB0byBhdHRlbXB0IGxvY2tpbmcgdGhlIGJ1ZmZlciIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIlJFU1RPVVJFX1JFVFJJRVMiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYucmVzdG9yZV9yZXRyaWVzLAorICAgICAgICAuZGVzY3IgPSAiTnVtYmVyIG9mIHRpbWVzIHRvIGF0dGVtcHQgcmVzdG9yaW5nIHRoZSBidWZmZXIiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJHRVRTVEFUVVNfUkVUUklFUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5nZXRzdGF0dXNfcmV0cmllcywKKyAgICAgICAgLmRlc2NyID0gIk51bWJlciBvZiB0aW1lcyB0byBhdHRlbXB0IGdldHRpbmcgc3RhdHVzIG9mIHRoZSBidWZmZXIiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJTRVRfUFJJTUFSWSIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuc2V0X3ByaW1hcnksCisgICAgICAgIC5kZXNjciA9ICJTZXQgdGhlIHBhcmFtZXRlcnMgb2YgcHJpbWFyeSBidWZmZXIiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJMQVRFTkNZX01JTExJUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5sYXRlbmN5X21pbGxpcywKKyAgICAgICAgLmRlc2NyID0gIih1bmRvY3VtZW50ZWQpIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiUFJJTUFSWV9GUkVRIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLnNldHRpbmdzLmZyZXEsCisgICAgICAgIC5kZXNjciA9ICJQcmltYXJ5IGJ1ZmZlciBmcmVxdWVuY3kiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJQUklNQVJZX0NIQU5ORUxTIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLnNldHRpbmdzLm5jaGFubmVscywKKyAgICAgICAgLmRlc2NyID0gIlByaW1hcnkgYnVmZmVyIG51bWJlciBvZiBjaGFubmVscyAoMSAtIG1vbm8sIDIgLSBzdGVyZW8pIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiUFJJTUFSWV9GTVQiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0ZNVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuc2V0dGluZ3MuZm10LAorICAgICAgICAuZGVzY3IgPSAiUHJpbWFyeSBidWZmZXIgZm9ybWF0IgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiQlVGU0laRV9PVVQiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuYnVmc2l6ZV9vdXQsCisgICAgICAgIC5kZXNjciA9ICIodW5kb2N1bWVudGVkKSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkJVRlNJWkVfSU4iLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuYnVmc2l6ZV9pbiwKKyAgICAgICAgLmRlc2NyID0gIih1bmRvY3VtZW50ZWQpIgorICAgIH0sCisgICAgeyAvKiBFbmQgb2YgbGlzdCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX3BjbV9vcHMgZHNvdW5kX3BjbV9vcHMgPSB7CisgICAgLmluaXRfb3V0ID0gZHNvdW5kX2luaXRfb3V0LAorICAgIC5maW5pX291dCA9IGRzb3VuZF9maW5pX291dCwKKyAgICAucnVuX291dCAgPSBkc291bmRfcnVuX291dCwKKyAgICAud3JpdGUgICAgPSBkc291bmRfd3JpdGUsCisgICAgLmN0bF9vdXQgID0gZHNvdW5kX2N0bF9vdXQsCisKKyAgICAuaW5pdF9pbiAgPSBkc291bmRfaW5pdF9pbiwKKyAgICAuZmluaV9pbiAgPSBkc291bmRfZmluaV9pbiwKKyAgICAucnVuX2luICAgPSBkc291bmRfcnVuX2luLAorICAgIC5yZWFkICAgICA9IGRzb3VuZF9yZWFkLAorICAgIC5jdGxfaW4gICA9IGRzb3VuZF9jdGxfaW4KK307CisKK3N0cnVjdCBhdWRpb19kcml2ZXIgZHNvdW5kX2F1ZGlvX2RyaXZlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHNvdW5kIiwKKyAgICAuZGVzY3IgICAgICAgICAgPSAiRGlyZWN0U291bmQgaHR0cDovL3dpa2lwZWRpYS5vcmcvd2lraS9EaXJlY3RTb3VuZCIsCisgICAgLm9wdGlvbnMgICAgICAgID0gZHNvdW5kX29wdGlvbnMsCisgICAgLmluaXQgICAgICAgICAgID0gZHNvdW5kX2F1ZGlvX2luaXQsCisgICAgLmZpbmkgICAgICAgICAgID0gZHNvdW5kX2F1ZGlvX2ZpbmksCisgICAgLnBjbV9vcHMgICAgICAgID0gJmRzb3VuZF9wY21fb3BzLAorICAgIC5jYW5fYmVfZGVmYXVsdCA9IDEsCisgICAgLm1heF92b2ljZXNfb3V0ID0gSU5UX01BWCwKKyAgICAubWF4X3ZvaWNlc19pbiAgPSAxLAorICAgIC52b2ljZV9zaXplX291dCA9IHNpemVvZiAoRFNvdW5kVm9pY2VPdXQpLAorICAgIC52b2ljZV9zaXplX2luICA9IHNpemVvZiAoRFNvdW5kVm9pY2VJbikKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2VzZGF1ZGlvLmMgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL2VzZGF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2M2Q0MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vZXNkYXVkaW8uYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIFFFTVUgRVNEIGF1ZGlvIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGcmVkZXJpY2sgUmVldmUgKGJydXNoZWQgdXAgYnkgbWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxlc2QuaD4KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgQVVESU9fQ0FQICJlc2QiCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisjaW5jbHVkZSAiYXVkaW9fcHRfaW50LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3FlbXUtZGVidWcuaCIKKworI2RlZmluZSAgREVCVUcgIDEKKworI2lmIERFQlVHCisjICBpbmNsdWRlIDxzdGRpby5oPgorIyAgZGVmaW5lIEQoLi4uKSAgVkVSQk9TRV9QUklOVChhdWRpbyxfX1ZBX0FSR1NfXykKKyMgIGRlZmluZSBEX0FDVElWRSAgVkVSQk9TRV9DSEVDSyhhdWRpbykKKyMgIGRlZmluZSBPKC4uLikgIFZFUkJPU0VfUFJJTlQoYXVkaW9vdXQsX19WQV9BUkdTX18pCisjICBkZWZpbmUgSSguLi4pICBWRVJCT1NFX1BSSU5UKGF1ZGlvaW4sX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lIEQoLi4uKSAgKCh2b2lkKTApCisjICBkZWZpbmUgRF9BQ1RJVkUgMAorIyAgZGVmaW5lIE8oLi4uKSAgKCh2b2lkKTApCisjICBkZWZpbmUgSSguLi4pICAoKHZvaWQpMCkKKyNlbmRpZgorCisjZGVmaW5lICBTVFJJTkdJRllfKHgpICAjeAorI2RlZmluZSAgU1RSSU5HSUZZKHgpICAgU1RSSU5HSUZZXyh4KQorCisjaW5jbHVkZSA8ZGxmY24uaD4KKy8qIGxpbmsgZHluYW1pY2FsbHkgdG8gdGhlIGxpYmVzZC5zbyAqLworCitzdGF0aWMgdm9pZCogZXNkX2xpYjsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSFdWb2ljZU91dCBodzsKKyAgICBpbnQgZG9uZTsKKyAgICBpbnQgbGl2ZTsKKyAgICBpbnQgZGVjcjsKKyAgICBpbnQgcnBvczsKKyAgICB2b2lkICpwY21fYnVmOworICAgIGludCBmZDsKKyAgICBzdHJ1Y3QgYXVkaW9fcHQgcHQ7Cit9IEVTRFZvaWNlT3V0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSFdWb2ljZUluIGh3OworICAgIGludCBkb25lOworICAgIGludCBkZWFkOworICAgIGludCBpbmNyOworICAgIGludCB3cG9zOworICAgIHZvaWQgKnBjbV9idWY7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBhdWRpb19wdCBwdDsKK30gRVNEVm9pY2VJbjsKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IHNhbXBsZXM7CisgICAgaW50IGRpdmlzb3I7CisgICAgY2hhciAqZGFjX2hvc3Q7CisgICAgY2hhciAqYWRjX2hvc3Q7Cit9IGNvbmYgPSB7CisgICAgLnNhbXBsZXMgPSAxMDI0LAorICAgIC5kaXZpc29yID0gMiwKK307CisKK3N0YXRpYyB2b2lkIEdDQ19GTVRfQVRUUiAoMiwgMykgcWVzZF9sb2dlcnIgKGludCBlcnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgQVVEX3Zsb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246ICVzXG4iLCBzdHJlcnJvciAoZXJyKSk7Cit9CisKKy8qIHBsYXliYWNrICovCitzdGF0aWMgdm9pZCAqcWVzZF90aHJlYWRfb3V0ICh2b2lkICphcmcpCit7CisgICAgRVNEVm9pY2VPdXQgKmVzZCA9IGFyZzsKKyAgICBIV1ZvaWNlT3V0ICpodyA9ICZlc2QtPmh3OworICAgIGludCB0aHJlc2hvbGQ7CisKKyAgICB0aHJlc2hvbGQgPSBjb25mLmRpdmlzb3IgPyBody0+c2FtcGxlcyAvIGNvbmYuZGl2aXNvciA6IDA7CisKKyAgICBpZiAoYXVkaW9fcHRfbG9jayAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGRlY3IsIHRvX21peCwgcnBvczsKKworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAoZXNkLT5kb25lKSB7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZXNkLT5saXZlID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdWRpb19wdF93YWl0ICgmZXNkLT5wdCwgQVVESU9fRlVOQykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZWNyID0gdG9fbWl4ID0gZXNkLT5saXZlOworICAgICAgICBycG9zID0gaHctPnJwb3M7CisKKyAgICAgICAgaWYgKGF1ZGlvX3B0X3VubG9jayAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0b19taXgpIHsKKyAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbjsKKyAgICAgICAgICAgIGludCBjaHVuayA9IGF1ZGlvX01JTiAodG9fbWl4LCBody0+c2FtcGxlcyAtIHJwb3MpOworICAgICAgICAgICAgc3RydWN0IHN0X3NhbXBsZSAqc3JjID0gaHctPm1peF9idWYgKyBycG9zOworCisgICAgICAgICAgICBody0+Y2xpcCAoZXNkLT5wY21fYnVmLCBzcmMsIGNodW5rKTsKKworICAgICAgICBhZ2FpbjoKKyAgICAgICAgICAgIHdyaXR0ZW4gPSB3cml0ZSAoZXNkLT5mZCwgZXNkLT5wY21fYnVmLCBjaHVuayA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgICAgICBpZiAod3JpdHRlbiA9PSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBhZ2FpbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcWVzZF9sb2dlcnIgKGVycm5vLCAid3JpdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHdyaXR0ZW4gIT0gY2h1bmsgPDwgaHctPmluZm8uc2hpZnQpIHsKKyAgICAgICAgICAgICAgICBpbnQgd3NhbXBsZXMgPSB3cml0dGVuID4+IGh3LT5pbmZvLnNoaWZ0OworICAgICAgICAgICAgICAgIGludCB3Ynl0ZXMgPSB3c2FtcGxlcyA8PCBody0+aW5mby5zaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAod2J5dGVzICE9IHdyaXR0ZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIHdyaXRlICVkIChyZXF1ZXN0ZWQgJXpkKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWdubWVudCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdieXRlcywgd3JpdHRlbiwgaHctPmluZm8uYWxpZ24gKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9fbWl4IC09IHdzYW1wbGVzOworICAgICAgICAgICAgICAgIHJwb3MgPSAocnBvcyArIHdzYW1wbGVzKSAlIGh3LT5zYW1wbGVzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBycG9zID0gKHJwb3MgKyBjaHVuaykgJSBody0+c2FtcGxlczsKKyAgICAgICAgICAgIHRvX21peCAtPSBjaHVuazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdWRpb19wdF9sb2NrICgmZXNkLT5wdCwgQVVESU9fRlVOQykpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZXNkLT5ycG9zID0gcnBvczsKKyAgICAgICAgZXNkLT5saXZlIC09IGRlY3I7CisgICAgICAgIGVzZC0+ZGVjciArPSBkZWNyOworICAgIH0KKworIGV4aXQ6CisgICAgYXVkaW9fcHRfdW5sb2NrICgmZXNkLT5wdCwgQVVESU9fRlVOQyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcWVzZF9ydW5fb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGxpdmUpCit7CisgICAgaW50IGRlY3I7CisgICAgRVNEVm9pY2VPdXQgKmVzZCA9IChFU0RWb2ljZU91dCAqKSBodzsKKworICAgIGlmIChhdWRpb19wdF9sb2NrICgmZXNkLT5wdCwgQVVESU9fRlVOQykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZGVjciA9IGF1ZGlvX01JTiAobGl2ZSwgZXNkLT5kZWNyKTsKKyAgICBlc2QtPmRlY3IgLT0gZGVjcjsKKyAgICBlc2QtPmxpdmUgPSBsaXZlIC0gZGVjcjsKKyAgICBody0+cnBvcyA9IGVzZC0+cnBvczsKKyAgICBpZiAoZXNkLT5saXZlID4gMCkgeworICAgICAgICBhdWRpb19wdF91bmxvY2tfYW5kX3NpZ25hbCAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXVkaW9fcHRfdW5sb2NrICgmZXNkLT5wdCwgQVVESU9fRlVOQyk7CisgICAgfQorICAgIHJldHVybiBkZWNyOworfQorCitzdGF0aWMgaW50IHFlc2Rfd3JpdGUgKFNXVm9pY2VPdXQgKnN3LCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd193cml0ZSAoc3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCBxZXNkX2luaXRfb3V0IChIV1ZvaWNlT3V0ICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBFU0RWb2ljZU91dCAqZXNkID0gKEVTRFZvaWNlT3V0ICopIGh3OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXMgPSAqYXM7CisgICAgaW50IGVzZGZtdCA9IEVTRF9TVFJFQU0gfCBFU0RfUExBWTsKKworICAgIGVzZGZtdCB8PSAoYXMtPm5jaGFubmVscyA9PSAyKSA/IEVTRF9TVEVSRU8gOiBFU0RfTU9OTzsKKyAgICBzd2l0Y2ggKGFzLT5mbXQpIHsKKyAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICBlc2RmbXQgfD0gRVNEX0JJVFM4OworICAgICAgICBvYnRfYXMuZm10ID0gQVVEX0ZNVF9VODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzMyOgorICAgIGNhc2UgQVVEX0ZNVF9VMzI6CisgICAgICAgIGRvbG9nICgiV2lsbCB1c2UgMTYgaW5zdGVhZCBvZiAzMiBiaXQgc2FtcGxlc1xuIik7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgZGVmZm10OgorICAgICAgICBlc2RmbXQgfD0gRVNEX0JJVFMxNjsKKyAgICAgICAgb2J0X2FzLmZtdCA9IEFVRF9GTVRfUzE2OworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGRvbG9nICgiSW50ZXJuYWwgbG9naWMgZXJyb3I6IEJhZCBhdWRpbyBmb3JtYXQgJWRcbiIsIGFzLT5mbXQpOworICAgICAgICBnb3RvIGRlZmZtdDsKKworICAgIH0KKyAgICBvYnRfYXMuZW5kaWFubmVzcyA9IEFVRElPX0hPU1RfRU5ESUFOTkVTUzsKKworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgJm9idF9hcyk7CisKKyAgICBody0+c2FtcGxlcyA9IGNvbmYuc2FtcGxlczsKKyAgICBlc2QtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICBpZiAoIWVzZC0+cGNtX2J1ZikgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgKCVkIGJ5dGVzKVxuIiwKKyAgICAgICAgICAgICAgIGh3LT5zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGVzZC0+ZmQgPSBlc2RfcGxheV9zdHJlYW0gKGVzZGZtdCwgYXMtPmZyZXEsIGNvbmYuZGFjX2hvc3QsIE5VTEwpOworICAgIGlmIChlc2QtPmZkIDwgMCkgeworICAgICAgICBxZXNkX2xvZ2VyciAoZXJybm8sICJlc2RfcGxheV9zdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsMTsKKyAgICB9CisKKyAgICBpZiAoYXVkaW9fcHRfaW5pdCAoJmVzZC0+cHQsIHFlc2RfdGhyZWFkX291dCwgZXNkLCBBVURJT19DQVAsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgIGdvdG8gZmFpbDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKKyBmYWlsMjoKKyAgICBpZiAoY2xvc2UgKGVzZC0+ZmQpKSB7CisgICAgICAgIHFlc2RfbG9nZXJyIChlcnJubywgIiVzOiBjbG9zZSBvbiBlc2Qgc29ja2V0KCVkKSBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19GVU5DLCBlc2QtPmZkKTsKKyAgICB9CisgICAgZXNkLT5mZCA9IC0xOworCisgZmFpbDE6CisgICAgZ19mcmVlIChlc2QtPnBjbV9idWYpOworICAgIGVzZC0+cGNtX2J1ZiA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBxZXNkX2Zpbmlfb3V0IChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICB2b2lkICpyZXQ7CisgICAgRVNEVm9pY2VPdXQgKmVzZCA9IChFU0RWb2ljZU91dCAqKSBodzsKKworICAgIGF1ZGlvX3B0X2xvY2sgKCZlc2QtPnB0LCBBVURJT19GVU5DKTsKKyAgICBlc2QtPmRvbmUgPSAxOworICAgIGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsICgmZXNkLT5wdCwgQVVESU9fRlVOQyk7CisgICAgYXVkaW9fcHRfam9pbiAoJmVzZC0+cHQsICZyZXQsIEFVRElPX0ZVTkMpOworCisgICAgaWYgKGVzZC0+ZmQgPj0gMCkgeworICAgICAgICBpZiAoY2xvc2UgKGVzZC0+ZmQpKSB7CisgICAgICAgICAgICBxZXNkX2xvZ2VyciAoZXJybm8sICJmYWlsZWQgdG8gY2xvc2UgZXNkIHNvY2tldFxuIik7CisgICAgICAgIH0KKyAgICAgICAgZXNkLT5mZCA9IC0xOworICAgIH0KKworICAgIGF1ZGlvX3B0X2ZpbmkgKCZlc2QtPnB0LCBBVURJT19GVU5DKTsKKworICAgIGdfZnJlZSAoZXNkLT5wY21fYnVmKTsKKyAgICBlc2QtPnBjbV9idWYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHFlc2RfY3RsX291dCAoSFdWb2ljZU91dCAqaHcsIGludCBjbWQsIC4uLikKK3sKKyAgICAodm9pZCkgaHc7CisgICAgKHZvaWQpIGNtZDsKKyAgICByZXR1cm4gMDsKK30KKworLyogY2FwdHVyZSAqLworc3RhdGljIHZvaWQgKnFlc2RfdGhyZWFkX2luICh2b2lkICphcmcpCit7CisgICAgRVNEVm9pY2VJbiAqZXNkID0gYXJnOworICAgIEhXVm9pY2VJbiAqaHcgPSAmZXNkLT5odzsKKyAgICBpbnQgdGhyZXNob2xkOworCisgICAgdGhyZXNob2xkID0gY29uZi5kaXZpc29yID8gaHctPnNhbXBsZXMgLyBjb25mLmRpdmlzb3IgOiAwOworCisgICAgaWYgKGF1ZGlvX3B0X2xvY2sgKCZlc2QtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBpbmNyLCB0b19ncmFiLCB3cG9zOworCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGlmIChlc2QtPmRvbmUpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlc2QtPmRlYWQgPiB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF1ZGlvX3B0X3dhaXQgKCZlc2QtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluY3IgPSB0b19ncmFiID0gZXNkLT5kZWFkOworICAgICAgICB3cG9zID0gaHctPndwb3M7CisKKyAgICAgICAgaWYgKGF1ZGlvX3B0X3VubG9jayAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0b19ncmFiKSB7CisgICAgICAgICAgICBzc2l6ZV90IG5yZWFkOworICAgICAgICAgICAgaW50IGNodW5rID0gYXVkaW9fTUlOICh0b19ncmFiLCBody0+c2FtcGxlcyAtIHdwb3MpOworICAgICAgICAgICAgdm9pZCAqYnVmID0gYWR2YW5jZSAoZXNkLT5wY21fYnVmLCB3cG9zKTsKKworICAgICAgICBhZ2FpbjoKKyAgICAgICAgICAgIG5yZWFkID0gcmVhZCAoZXNkLT5mZCwgYnVmLCBjaHVuayA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgICAgICBpZiAobnJlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYWdhaW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHFlc2RfbG9nZXJyIChlcnJubywgInJlYWQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5yZWFkICE9IGNodW5rIDw8IGh3LT5pbmZvLnNoaWZ0KSB7CisgICAgICAgICAgICAgICAgaW50IHJzYW1wbGVzID0gbnJlYWQgPj4gaHctPmluZm8uc2hpZnQ7CisgICAgICAgICAgICAgICAgaW50IHJieXRlcyA9IHJzYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0OworICAgICAgICAgICAgICAgIGlmIChyYnl0ZXMgIT0gbnJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIHdyaXRlICVkIChyZXF1ZXN0ZWQgJXpkKSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWdubWVudCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJieXRlcywgbnJlYWQsIGh3LT5pbmZvLmFsaWduICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvX2dyYWIgLT0gcnNhbXBsZXM7CisgICAgICAgICAgICAgICAgd3BvcyA9ICh3cG9zICsgcnNhbXBsZXMpICUgaHctPnNhbXBsZXM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh3LT5jb252IChody0+Y29udl9idWYgKyB3cG9zLCBidWYsIG5yZWFkID4+IGh3LT5pbmZvLnNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICZub21pbmFsX3ZvbHVtZSk7CisgICAgICAgICAgICB3cG9zID0gKHdwb3MgKyBjaHVuaykgJSBody0+c2FtcGxlczsKKyAgICAgICAgICAgIHRvX2dyYWIgLT0gY2h1bms7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXVkaW9fcHRfbG9jayAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGVzZC0+d3BvcyA9IHdwb3M7CisgICAgICAgIGVzZC0+ZGVhZCAtPSBpbmNyOworICAgICAgICBlc2QtPmluY3IgKz0gaW5jcjsKKyAgICB9CisKKyBleGl0OgorICAgIGF1ZGlvX3B0X3VubG9jayAoJmVzZC0+cHQsIEFVRElPX0ZVTkMpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFlc2RfcnVuX2luIChIV1ZvaWNlSW4gKmh3KQoreworICAgIGludCBsaXZlLCBpbmNyLCBkZWFkOworICAgIEVTRFZvaWNlSW4gKmVzZCA9IChFU0RWb2ljZUluICopIGh3OworCisgICAgaWYgKGF1ZGlvX3B0X2xvY2sgKCZlc2QtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsaXZlID0gYXVkaW9fcGNtX2h3X2dldF9saXZlX2luIChodyk7CisgICAgZGVhZCA9IGh3LT5zYW1wbGVzIC0gbGl2ZTsKKyAgICBpbmNyID0gYXVkaW9fTUlOIChkZWFkLCBlc2QtPmluY3IpOworICAgIGVzZC0+aW5jciAtPSBpbmNyOworICAgIGVzZC0+ZGVhZCA9IGRlYWQgLSBpbmNyOworICAgIGh3LT53cG9zID0gZXNkLT53cG9zOworICAgIGlmIChlc2QtPmRlYWQgPiAwKSB7CisgICAgICAgIGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsICgmZXNkLT5wdCwgQVVESU9fRlVOQyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhdWRpb19wdF91bmxvY2sgKCZlc2QtPnB0LCBBVURJT19GVU5DKTsKKyAgICB9CisgICAgcmV0dXJuIGluY3I7Cit9CisKK3N0YXRpYyBpbnQgcWVzZF9yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGF1ZGlvX3BjbV9zd19yZWFkIChzdywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IHFlc2RfaW5pdF9pbiAoSFdWb2ljZUluICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBFU0RWb2ljZUluICplc2QgPSAoRVNEVm9pY2VJbiAqKSBodzsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3Mgb2J0X2FzID0gKmFzOworICAgIGludCBlc2RmbXQgPSBFU0RfU1RSRUFNIHwgRVNEX1JFQ09SRDsKKworICAgIGVzZGZtdCB8PSAoYXMtPm5jaGFubmVscyA9PSAyKSA/IEVTRF9TVEVSRU8gOiBFU0RfTU9OTzsKKyAgICBzd2l0Y2ggKGFzLT5mbXQpIHsKKyAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICBlc2RmbXQgfD0gRVNEX0JJVFM4OworICAgICAgICBvYnRfYXMuZm10ID0gQVVEX0ZNVF9VODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIGVzZGZtdCB8PSBFU0RfQklUUzE2OworICAgICAgICBvYnRfYXMuZm10ID0gQVVEX0ZNVF9TMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICBkb2xvZyAoIldpbGwgdXNlIDE2IGluc3RlYWQgb2YgMzIgYml0IHNhbXBsZXNcbiIpOworICAgICAgICBlc2RmbXQgfD0gRVNEX0JJVFMxNjsKKyAgICAgICAgb2J0X2FzLmZtdCA9IEFVRF9GTVRfUzE2OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgb2J0X2FzLmVuZGlhbm5lc3MgPSBBVURJT19IT1NUX0VORElBTk5FU1M7CisKKyAgICBhdWRpb19wY21faW5pdF9pbmZvICgmaHctPmluZm8sICZvYnRfYXMpOworCisgICAgaHctPnNhbXBsZXMgPSBjb25mLnNhbXBsZXM7CisgICAgZXNkLT5wY21fYnVmID0gYXVkaW9fY2FsbG9jIChBVURJT19GVU5DLCBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgaWYgKCFlc2QtPnBjbV9idWYpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyICglZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICBody0+c2FtcGxlcyA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBlc2QtPmZkID0gZXNkX3JlY29yZF9zdHJlYW0gKGVzZGZtdCwgYXMtPmZyZXEsIGNvbmYuYWRjX2hvc3QsIE5VTEwpOworICAgIGlmIChlc2QtPmZkIDwgMCkgeworICAgICAgICBxZXNkX2xvZ2VyciAoZXJybm8sICJlc2RfcmVjb3JkX3N0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIGZhaWwxOworICAgIH0KKworICAgIGlmIChhdWRpb19wdF9pbml0ICgmZXNkLT5wdCwgcWVzZF90aHJlYWRfaW4sIGVzZCwgQVVESU9fQ0FQLCBBVURJT19GVU5DKSkgeworICAgICAgICBnb3RvIGZhaWwyOworICAgIH0KKworICAgIHJldHVybiAwOworCisgZmFpbDI6CisgICAgaWYgKGNsb3NlIChlc2QtPmZkKSkgeworICAgICAgICBxZXNkX2xvZ2VyciAoZXJybm8sICIlczogY2xvc2Ugb24gZXNkIHNvY2tldCglZCkgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fRlVOQywgZXNkLT5mZCk7CisgICAgfQorICAgIGVzZC0+ZmQgPSAtMTsKKworIGZhaWwxOgorICAgIGdfZnJlZSAoZXNkLT5wY21fYnVmKTsKKyAgICBlc2QtPnBjbV9idWYgPSBOVUxMOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgcWVzZF9maW5pX2luIChIV1ZvaWNlSW4gKmh3KQoreworICAgIHZvaWQgKnJldDsKKyAgICBFU0RWb2ljZUluICplc2QgPSAoRVNEVm9pY2VJbiAqKSBodzsKKworICAgIGF1ZGlvX3B0X2xvY2sgKCZlc2QtPnB0LCBBVURJT19GVU5DKTsKKyAgICBlc2QtPmRvbmUgPSAxOworICAgIGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsICgmZXNkLT5wdCwgQVVESU9fRlVOQyk7CisgICAgYXVkaW9fcHRfam9pbiAoJmVzZC0+cHQsICZyZXQsIEFVRElPX0ZVTkMpOworCisgICAgaWYgKGVzZC0+ZmQgPj0gMCkgeworICAgICAgICBpZiAoY2xvc2UgKGVzZC0+ZmQpKSB7CisgICAgICAgICAgICBxZXNkX2xvZ2VyciAoZXJybm8sICJmYWlsZWQgdG8gY2xvc2UgZXNkIHNvY2tldFxuIik7CisgICAgICAgIH0KKyAgICAgICAgZXNkLT5mZCA9IC0xOworICAgIH0KKworICAgIGF1ZGlvX3B0X2ZpbmkgKCZlc2QtPnB0LCBBVURJT19GVU5DKTsKKworICAgIGdfZnJlZSAoZXNkLT5wY21fYnVmKTsKKyAgICBlc2QtPnBjbV9idWYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHFlc2RfY3RsX2luIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgKHZvaWQpIGh3OworICAgICh2b2lkKSBjbWQ7CisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgZXNvdW5kX2R5bmxpbmtfaW5pdCh2b2lkKiBsaWIpOworCisvKiBjb21tb24gKi8KK3N0YXRpYyB2b2lkICpxZXNkX2F1ZGlvX2luaXQgKHZvaWQpCit7CisgICAgdm9pZCogICAgcmVzdWx0ID0gTlVMTDsKKworICAgIEQoIiVzOiBlbnRlcmluZyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAoZXNkX2xpYiA9PSBOVUxMKSB7CisgICAgICAgIGludCAgZmQ7CisKKyAgICAgICAgZXNkX2xpYiA9IGRsb3BlbiggImxpYmVzZC5zbyIsIFJUTERfTk9XICk7CisgICAgICAgIGlmIChlc2RfbGliID09IE5VTEwpCisgICAgICAgICAgICBlc2RfbGliID0gZGxvcGVuKCAibGliZXNkLnNvLjAiLCBSVExEX05PVyApOworCisgICAgICAgIGlmIChlc2RfbGliID09IE5VTEwpIHsKKyAgICAgICAgICAgIEQoImNvdWxkIG5vdCBmaW5kIGxpYmVzZCBvbiB0aGlzIHN5c3RlbSIpOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVzb3VuZF9keW5saW5rX2luaXQoZXNkX2xpYikgPCAwKQorICAgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIGZkID0gZXNkX29wZW5fc291bmQoY29uZi5kYWNfaG9zdCk7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIEQoIiVzOiBjb3VsZCBub3Qgb3BlbiBkaXJlY3Qgc291bmQgc2VydmVyIGNvbm5lY3Rpb24sIHRyeWluZyBsb2NhbGhvc3QiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgZmQgPSBlc2Rfb3Blbl9zb3VuZCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IGNvdWxkIG5vdCBvcGVuIGxvY2FsaG9zdCBzb3VuZCBzZXJ2ZXIgY29ubmVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRCgiJXM6IEVzb3VuRCBzZXJ2ZXIgY29ubmVjdGlvbiBzdWNjZWVkZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAvKiBlc2RfY2xvc2UoZmQpOyAqLworICAgIH0KKyAgICByZXN1bHQgPSAmY29uZjsKKyAgICBnb3RvIEV4aXQ7CisKK0ZhaWw6CisgICAgRCgiJXM6IGZhaWxlZCB0byBvcGVuIGxpYnJhcnkiLCBfX0ZVTkNUSU9OX18pOworICAgIGRsY2xvc2UoZXNkX2xpYik7CisgICAgZXNkX2xpYiA9IE5VTEw7CisKK0V4aXQ6CisgICAgcmV0dXJuICByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHFlc2RfYXVkaW9fZmluaSAodm9pZCAqb3BhcXVlKQoreworICAgICh2b2lkKSBvcGFxdWU7CisgICAgaWYgKGVzZF9saWIgIT0gTlVMTCkgeworICAgICAgICBkbGNsb3NlKGVzZF9saWIpOworICAgICAgICBlc2RfbGliID0gTlVMTDsKKyAgICB9CisgICAgbGRlYnVnICgiZXNkX2ZpbmkiKTsKK30KKworc3RydWN0IGF1ZGlvX29wdGlvbiBxZXNkX29wdGlvbnNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJTQU1QTEVTIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLnNhbXBsZXMsCisgICAgICAgIC5kZXNjciA9ICJidWZmZXIgc2l6ZSBpbiBzYW1wbGVzIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiRElWSVNPUiIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5kaXZpc29yLAorICAgICAgICAuZGVzY3IgPSAidGhyZXNob2xkIGRpdmlzb3IiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJEQUNfSE9TVCIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfU1RSLAorICAgICAgICAudmFscCAgPSAmY29uZi5kYWNfaG9zdCwKKyAgICAgICAgLmRlc2NyID0gInBsYXliYWNrIGhvc3QiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJBRENfSE9TVCIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfU1RSLAorICAgICAgICAudmFscCAgPSAmY29uZi5hZGNfaG9zdCwKKyAgICAgICAgLmRlc2NyID0gImNhcHR1cmUgaG9zdCIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wY21fb3BzIHFlc2RfcGNtX29wcyA9IHsKKyAgICAuaW5pdF9vdXQgPSBxZXNkX2luaXRfb3V0LAorICAgIC5maW5pX291dCA9IHFlc2RfZmluaV9vdXQsCisgICAgLnJ1bl9vdXQgID0gcWVzZF9ydW5fb3V0LAorICAgIC53cml0ZSAgICA9IHFlc2Rfd3JpdGUsCisgICAgLmN0bF9vdXQgID0gcWVzZF9jdGxfb3V0LAorCisgICAgLmluaXRfaW4gID0gcWVzZF9pbml0X2luLAorICAgIC5maW5pX2luICA9IHFlc2RfZmluaV9pbiwKKyAgICAucnVuX2luICAgPSBxZXNkX3J1bl9pbiwKKyAgICAucmVhZCAgICAgPSBxZXNkX3JlYWQsCisgICAgLmN0bF9pbiAgID0gcWVzZF9jdGxfaW4sCit9OworCitzdHJ1Y3QgYXVkaW9fZHJpdmVyIGVzZF9hdWRpb19kcml2ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImVzZCIsCisgICAgLmRlc2NyICAgICAgICAgID0gImh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRXNvdW5kIiwKKyAgICAub3B0aW9ucyAgICAgICAgPSBxZXNkX29wdGlvbnMsCisgICAgLmluaXQgICAgICAgICAgID0gcWVzZF9hdWRpb19pbml0LAorICAgIC5maW5pICAgICAgICAgICA9IHFlc2RfYXVkaW9fZmluaSwKKyAgICAucGNtX29wcyAgICAgICAgPSAmcWVzZF9wY21fb3BzLAorICAgIC5jYW5fYmVfZGVmYXVsdCA9IDAsCisgICAgLm1heF92b2ljZXNfb3V0ID0gSU5UX01BWCwKKyAgICAubWF4X3ZvaWNlc19pbiAgPSBJTlRfTUFYLAorICAgIC52b2ljZV9zaXplX291dCA9IHNpemVvZiAoRVNEVm9pY2VPdXQpLAorICAgIC52b2ljZV9zaXplX2luICA9IHNpemVvZiAoRVNEVm9pY2VJbikKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL2Ztb2RhdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby9mbW9kYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjA4ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby9mbW9kYXVkaW8uYwpAQCAtMCwwICsxLDY4NyBAQAorLyoKKyAqIFFFTVUgRk1PRCBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxmbW9kLmg+CisjaW5jbHVkZSA8Zm1vZF9lcnJvcnMuaD4KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgQVVESU9fQ0FQICJmbW9kIgorI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorCit0eXBlZGVmIHN0cnVjdCBGTU9EVm9pY2VPdXQgeworICAgIEhXVm9pY2VPdXQgaHc7CisgICAgdW5zaWduZWQgaW50IG9sZF9wb3M7CisgICAgRlNPVU5EX1NBTVBMRSAqZm1vZF9zYW1wbGU7CisgICAgaW50IGNoYW5uZWw7Cit9IEZNT0RWb2ljZU91dDsKKwordHlwZWRlZiBzdHJ1Y3QgRk1PRFZvaWNlSW4geworICAgIEhXVm9pY2VJbiBodzsKKyAgICBGU09VTkRfU0FNUExFICpmbW9kX3NhbXBsZTsKK30gRk1PRFZvaWNlSW47CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmRydm5hbWU7CisgICAgaW50IG5iX3NhbXBsZXM7CisgICAgaW50IGZyZXE7CisgICAgaW50IG5iX2NoYW5uZWxzOworICAgIGludCBidWZzaXplOworICAgIGludCBicm9rZW5fYWRjOworfSBjb25mID0geworICAgIC5uYl9zYW1wbGVzICA9IDIwNDggKiAyLAorICAgIC5mcmVxICAgICAgICA9IDQ0MTAwLAorICAgIC5uYl9jaGFubmVscyA9IDIsCit9OworCitzdGF0aWMgdm9pZCBHQ0NfRk1UX0FUVFIgKDEsIDIpIGZtb2RfbG9nZXJyIChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF92bG9nIChBVURJT19DQVAsIGZtdCwgYXApOworICAgIHZhX2VuZCAoYXApOworCisgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICBGTU9EX0Vycm9yU3RyaW5nIChGU09VTkRfR2V0RXJyb3IgKCkpKTsKK30KKworc3RhdGljIHZvaWQgR0NDX0ZNVF9BVFRSICgyLCAzKSBmbW9kX2xvZ2VycjIgKAorICAgIGNvbnN0IGNoYXIgKnR5cCwKKyAgICBjb25zdCBjaGFyICpmbXQsCisgICAgLi4uCisgICAgKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICBBVURfbG9nIChBVURJT19DQVAsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSAlc1xuIiwgdHlwKTsKKworICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgICBBVURfdmxvZyAoQVVESU9fQ0FQLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQgKGFwKTsKKworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIlJlYXNvbjogJXNcbiIsCisgICAgICAgICAgICAgRk1PRF9FcnJvclN0cmluZyAoRlNPVU5EX0dldEVycm9yICgpKSk7Cit9CisKK3N0YXRpYyBpbnQgZm1vZF93cml0ZSAoU1dWb2ljZU91dCAqc3csIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXVkaW9fcGNtX3N3X3dyaXRlIChzdywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBmbW9kX2NsZWFyX3NhbXBsZSAoRk1PRFZvaWNlT3V0ICpmbWQpCit7CisgICAgSFdWb2ljZU91dCAqaHcgPSAmZm1kLT5odzsKKyAgICBpbnQgc3RhdHVzOworICAgIHZvaWQgKnAxID0gMCwgKnAyID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgbGVuMSA9IDAsIGxlbjIgPSAwOworCisgICAgc3RhdHVzID0gRlNPVU5EX1NhbXBsZV9Mb2NrICgKKyAgICAgICAgZm1kLT5mbW9kX3NhbXBsZSwKKyAgICAgICAgMCwKKyAgICAgICAgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQsCisgICAgICAgICZwMSwKKyAgICAgICAgJnAyLAorICAgICAgICAmbGVuMSwKKyAgICAgICAgJmxlbjIKKyAgICAgICAgKTsKKworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIGZtb2RfbG9nZXJyICgiRmFpbGVkIHRvIGxvY2sgc2FtcGxlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgobGVuMSAmIGh3LT5pbmZvLmFsaWduKSB8fCAobGVuMiAmIGh3LT5pbmZvLmFsaWduKSkgeworICAgICAgICBkb2xvZyAoIkxvY2sgcmV0dXJuZWQgbWlzYWxpZ25lZCBsZW5ndGggJWQsICVkLCBhbGlnbm1lbnQgJWRcbiIsCisgICAgICAgICAgICAgICBsZW4xLCBsZW4yLCBody0+aW5mby5hbGlnbiArIDEpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChsZW4xICsgbGVuMikgLSAoaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQpKSB7CisgICAgICAgIGRvbG9nICgiTG9jayByZXR1cm5lZCBpbmNvbXBsZXRlIGxlbmd0aCAlZCwgJWRcbiIsCisgICAgICAgICAgICAgICBsZW4xICsgbGVuMiwgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXVkaW9fcGNtX2luZm9fY2xlYXJfYnVmICgmaHctPmluZm8sIHAxLCBody0+c2FtcGxlcyk7CisKKyBmYWlsOgorICAgIHN0YXR1cyA9IEZTT1VORF9TYW1wbGVfVW5sb2NrIChmbWQtPmZtb2Rfc2FtcGxlLCBwMSwgcDIsIGxlbjEsIGxlbjIpOworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIGZtb2RfbG9nZXJyICgiRmFpbGVkIHRvIHVubG9jayBzYW1wbGVcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZm1vZF93cml0ZV9zYW1wbGUgKEhXVm9pY2VPdXQgKmh3LCB1aW50OF90ICpkc3QsIGludCBkc3RfbGVuKQoreworICAgIGludCBzcmNfbGVuMSA9IGRzdF9sZW47CisgICAgaW50IHNyY19sZW4yID0gMDsKKyAgICBpbnQgcG9zID0gaHctPnJwb3MgKyBkc3RfbGVuOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzEgPSBody0+bWl4X2J1ZiArIGh3LT5ycG9zOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzIgPSBOVUxMOworCisgICAgaWYgKHBvcyA+IGh3LT5zYW1wbGVzKSB7CisgICAgICAgIHNyY19sZW4xID0gaHctPnNhbXBsZXMgLSBody0+cnBvczsKKyAgICAgICAgc3JjMiA9IGh3LT5taXhfYnVmOworICAgICAgICBzcmNfbGVuMiA9IGRzdF9sZW4gLSBzcmNfbGVuMTsKKyAgICAgICAgcG9zID0gc3JjX2xlbjI7CisgICAgfQorCisgICAgaWYgKHNyY19sZW4xKSB7CisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYzEsIHNyY19sZW4xKTsKKyAgICB9CisKKyAgICBpZiAoc3JjX2xlbjIpIHsKKyAgICAgICAgZHN0ID0gYWR2YW5jZSAoZHN0LCBzcmNfbGVuMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYzIsIHNyY19sZW4yKTsKKyAgICB9CisKKyAgICBody0+cnBvcyA9IHBvcyAlIGh3LT5zYW1wbGVzOworfQorCitzdGF0aWMgaW50IGZtb2RfdW5sb2NrX3NhbXBsZSAoRlNPVU5EX1NBTVBMRSAqc2FtcGxlLCB2b2lkICpwMSwgdm9pZCAqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJsZW4xLCB1bnNpZ25lZCBpbnQgYmxlbjIpCit7CisgICAgaW50IHN0YXR1cyA9IEZTT1VORF9TYW1wbGVfVW5sb2NrIChzYW1wbGUsIHAxLCBwMiwgYmxlbjEsIGJsZW4yKTsKKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICBmbW9kX2xvZ2VyciAoIkZhaWxlZCB0byB1bmxvY2sgc2FtcGxlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbW9kX2xvY2tfc2FtcGxlICgKKyAgICBGU09VTkRfU0FNUExFICpzYW1wbGUsCisgICAgc3RydWN0IGF1ZGlvX3BjbV9pbmZvICppbmZvLAorICAgIGludCBwb3MsCisgICAgaW50IGxlbiwKKyAgICB2b2lkICoqcDEsCisgICAgdm9pZCAqKnAyLAorICAgIHVuc2lnbmVkIGludCAqYmxlbjEsCisgICAgdW5zaWduZWQgaW50ICpibGVuMgorICAgICkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgc3RhdHVzID0gRlNPVU5EX1NhbXBsZV9Mb2NrICgKKyAgICAgICAgc2FtcGxlLAorICAgICAgICBwb3MgPDwgaW5mby0+c2hpZnQsCisgICAgICAgIGxlbiA8PCBpbmZvLT5zaGlmdCwKKyAgICAgICAgcDEsCisgICAgICAgIHAyLAorICAgICAgICBibGVuMSwKKyAgICAgICAgYmxlbjIKKyAgICAgICAgKTsKKworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIGZtb2RfbG9nZXJyICgiRmFpbGVkIHRvIGxvY2sgc2FtcGxlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgoKmJsZW4xICYgaW5mby0+YWxpZ24pIHx8ICgqYmxlbjIgJiBpbmZvLT5hbGlnbikpIHsKKyAgICAgICAgZG9sb2cgKCJMb2NrIHJldHVybmVkIG1pc2FsaWduZWQgbGVuZ3RoICVkLCAlZCwgYWxpZ25tZW50ICVkXG4iLAorICAgICAgICAgICAgICAgKmJsZW4xLCAqYmxlbjIsIGluZm8tPmFsaWduICsgMSk7CisKKyAgICAgICAgZm1vZF91bmxvY2tfc2FtcGxlIChzYW1wbGUsICpwMSwgKnAyLCAqYmxlbjEsICpibGVuMik7CisKKyAgICAgICAgKnAxID0gTlVMTCAtIDE7CisgICAgICAgICpwMiA9IE5VTEwgLSAxOworICAgICAgICAqYmxlbjEgPSB+MFU7CisgICAgICAgICpibGVuMiA9IH4wVTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghKnAxICYmICpibGVuMSkgeworICAgICAgICBkb2xvZyAoIndhcm5pbmc6ICFwMSAmJiBibGVuMT0lZFxuIiwgKmJsZW4xKTsKKyAgICAgICAgKmJsZW4xID0gMDsKKyAgICB9CisKKyAgICBpZiAoIXAyICYmICpibGVuMikgeworICAgICAgICBkb2xvZyAoIndhcm5pbmc6ICFwMiAmJiBibGVuMj0lZFxuIiwgKmJsZW4yKTsKKyAgICAgICAgKmJsZW4yID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbW9kX3J1bl9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgbGl2ZSkKK3sKKyAgICBGTU9EVm9pY2VPdXQgKmZtZCA9IChGTU9EVm9pY2VPdXQgKikgaHc7CisgICAgaW50IGRlY3I7CisgICAgdm9pZCAqcDEgPSAwLCAqcDIgPSAwOworICAgIHVuc2lnbmVkIGludCBibGVuMSA9IDAsIGJsZW4yID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgbGVuMSA9IDAsIGxlbjIgPSAwOworCisgICAgaWYgKCFody0+cGVuZGluZ19kaXNhYmxlKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRlY3IgPSBsaXZlOworCisgICAgaWYgKGZtZC0+Y2hhbm5lbCA+PSAwKSB7CisgICAgICAgIGludCBsZW4gPSBkZWNyOworICAgICAgICBpbnQgb2xkX3BvcyA9IGZtZC0+b2xkX3BvczsKKyAgICAgICAgaW50IHBwb3MgPSBGU09VTkRfR2V0Q3VycmVudFBvc2l0aW9uIChmbWQtPmNoYW5uZWwpOworCisgICAgICAgIGlmIChwcG9zID09IG9sZF9wb3MgfHwgIXBwb3MpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvbGRfcG9zIDwgcHBvcykgJiYgKChvbGRfcG9zICsgbGVuKSA+IHBwb3MpKSB7CisgICAgICAgICAgICBsZW4gPSBwcG9zIC0gb2xkX3BvczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgob2xkX3BvcyA+IHBwb3MpICYmICgob2xkX3BvcyArIGxlbikgPiAocHBvcyArIGh3LT5zYW1wbGVzKSkpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBody0+c2FtcGxlcyAtIG9sZF9wb3MgKyBwcG9zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlY3IgPSBsZW47CisKKyAgICAgICAgaWYgKGF1ZGlvX2J1ZyAoQVVESU9fRlVOQywgZGVjciA8IDApKSB7CisgICAgICAgICAgICBkb2xvZyAoImRlY3I9JWQgbGl2ZT0lZCBwcG9zPSVkIG9sZF9wb3M9JWQgbGVuPSVkXG4iLAorICAgICAgICAgICAgICAgICAgIGRlY3IsIGxpdmUsIHBwb3MsIG9sZF9wb3MsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgaWYgKCFkZWNyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChmbW9kX2xvY2tfc2FtcGxlIChmbWQtPmZtb2Rfc2FtcGxlLCAmZm1kLT5ody5pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbWQtPm9sZF9wb3MsIGRlY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwMSwgJnAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbjEsICZibGVuMikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbGVuMSA9IGJsZW4xID4+IGh3LT5pbmZvLnNoaWZ0OworICAgIGxlbjIgPSBibGVuMiA+PiBody0+aW5mby5zaGlmdDsKKyAgICBsZGVidWcgKCIlcCAlcCAlZCAlZCAlZCAlZFxuIiwgcDEsIHAyLCBsZW4xLCBsZW4yLCBibGVuMSwgYmxlbjIpOworICAgIGRlY3IgPSBsZW4xICsgbGVuMjsKKworICAgIGlmIChwMSAmJiBsZW4xKSB7CisgICAgICAgIGZtb2Rfd3JpdGVfc2FtcGxlIChodywgcDEsIGxlbjEpOworICAgIH0KKworICAgIGlmIChwMiAmJiBsZW4yKSB7CisgICAgICAgIGZtb2Rfd3JpdGVfc2FtcGxlIChodywgcDIsIGxlbjIpOworICAgIH0KKworICAgIGZtb2RfdW5sb2NrX3NhbXBsZSAoZm1kLT5mbW9kX3NhbXBsZSwgcDEsIHAyLCBibGVuMSwgYmxlbjIpOworCisgICAgZm1kLT5vbGRfcG9zID0gKGZtZC0+b2xkX3BvcyArIGRlY3IpICUgaHctPnNhbXBsZXM7CisgICAgcmV0dXJuIGRlY3I7Cit9CisKK3N0YXRpYyBpbnQgYXVkX3RvX2Ztb2RmbXQgKGF1ZGZtdF9lIGZtdCwgaW50IHN0ZXJlbykKK3sKKyAgICBpbnQgbW9kZSA9IEZTT1VORF9MT09QX05PUk1BTDsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgY2FzZSBBVURfRk1UX1M4OgorICAgICAgICBtb2RlIHw9IEZTT1VORF9TSUdORUQgfCBGU09VTkRfOEJJVFM7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICBtb2RlIHw9IEZTT1VORF9VTlNJR05FRCB8IEZTT1VORF84QklUUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgICAgICBtb2RlIHw9IEZTT1VORF9TSUdORUQgfCBGU09VTkRfMTZCSVRTOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIG1vZGUgfD0gRlNPVU5EX1VOU0lHTkVEIHwgRlNPVU5EXzE2QklUUzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoIkludGVybmFsIGxvZ2ljIGVycm9yOiBCYWQgYXVkaW8gZm9ybWF0ICVkXG4iLCBmbXQpOworI2lmZGVmIERFQlVHX0ZNT0QKKyAgICAgICAgYWJvcnQgKCk7CisjZW5kaWYKKyAgICAgICAgbW9kZSB8PSBGU09VTkRfOEJJVFM7CisgICAgfQorICAgIG1vZGUgfD0gc3RlcmVvID8gRlNPVU5EX1NURVJFTyA6IEZTT1VORF9NT05POworICAgIHJldHVybiBtb2RlOworfQorCitzdGF0aWMgdm9pZCBmbW9kX2Zpbmlfb3V0IChIV1ZvaWNlT3V0ICpodykKK3sKKyAgICBGTU9EVm9pY2VPdXQgKmZtZCA9IChGTU9EVm9pY2VPdXQgKikgaHc7CisKKyAgICBpZiAoZm1kLT5mbW9kX3NhbXBsZSkgeworICAgICAgICBGU09VTkRfU2FtcGxlX0ZyZWUgKGZtZC0+Zm1vZF9zYW1wbGUpOworICAgICAgICBmbWQtPmZtb2Rfc2FtcGxlID0gMDsKKworICAgICAgICBpZiAoZm1kLT5jaGFubmVsID49IDApIHsKKyAgICAgICAgICAgIEZTT1VORF9TdG9wU291bmQgKGZtZC0+Y2hhbm5lbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZm1vZF9pbml0X291dCAoSFdWb2ljZU91dCAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgaW50IGJpdHMxNiwgbW9kZSwgY2hhbm5lbDsKKyAgICBGTU9EVm9pY2VPdXQgKmZtZCA9IChGTU9EVm9pY2VPdXQgKikgaHc7CisgICAgc3RydWN0IGF1ZHNldHRpbmdzIG9idF9hcyA9ICphczsKKworICAgIG1vZGUgPSBhdWRfdG9fZm1vZGZtdCAoYXMtPmZtdCwgYXMtPm5jaGFubmVscyA9PSAyID8gMSA6IDApOworICAgIGZtZC0+Zm1vZF9zYW1wbGUgPSBGU09VTkRfU2FtcGxlX0FsbG9jICgKKyAgICAgICAgRlNPVU5EX0ZSRUUsICAgICAgICAgICAgLyogaW5kZXggKi8KKyAgICAgICAgY29uZi5uYl9zYW1wbGVzLCAgICAgICAgLyogbGVuZ3RoICovCisgICAgICAgIG1vZGUsICAgICAgICAgICAgICAgICAgIC8qIG1vZGUgKi8KKyAgICAgICAgYXMtPmZyZXEsICAgICAgICAgICAgICAgLyogZnJlcSAqLworICAgICAgICAyNTUsICAgICAgICAgICAgICAgICAgICAvKiB2b2x1bWUgKi8KKyAgICAgICAgMTI4LCAgICAgICAgICAgICAgICAgICAgLyogcGFuICovCisgICAgICAgIDI1NSAgICAgICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5ICovCisgICAgICAgICk7CisKKyAgICBpZiAoIWZtZC0+Zm1vZF9zYW1wbGUpIHsKKyAgICAgICAgZm1vZF9sb2dlcnIyICgiREFDIiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBGTU9EIHNhbXBsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjaGFubmVsID0gRlNPVU5EX1BsYXlTb3VuZEV4IChGU09VTkRfRlJFRSwgZm1kLT5mbW9kX3NhbXBsZSwgMCwgMSk7CisgICAgaWYgKGNoYW5uZWwgPCAwKSB7CisgICAgICAgIGZtb2RfbG9nZXJyMiAoIkRBQyIsICJGYWlsZWQgdG8gc3RhcnQgcGxheWluZyBzb3VuZFxuIik7CisgICAgICAgIEZTT1VORF9TYW1wbGVfRnJlZSAoZm1kLT5mbW9kX3NhbXBsZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm1kLT5jaGFubmVsID0gY2hhbm5lbDsKKworICAgIC8qIEZNT0QgYWx3YXlzIG9wZXJhdGVzIG9uIGxpdHRsZSBlbmRpYW4gZnJhbWVzPyAqLworICAgIG9idF9hcy5lbmRpYW5uZXNzID0gMDsKKyAgICBhdWRpb19wY21faW5pdF9pbmZvICgmaHctPmluZm8sICZvYnRfYXMpOworICAgIGJpdHMxNiA9IChtb2RlICYgRlNPVU5EXzE2QklUUykgIT0gMDsKKyAgICBody0+c2FtcGxlcyA9IGNvbmYubmJfc2FtcGxlczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbW9kX2N0bF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgaW50IHN0YXR1czsKKyAgICBGTU9EVm9pY2VPdXQgKmZtZCA9IChGTU9EVm9pY2VPdXQgKikgaHc7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgVk9JQ0VfRU5BQkxFOgorICAgICAgICBmbW9kX2NsZWFyX3NhbXBsZSAoZm1kKTsKKyAgICAgICAgc3RhdHVzID0gRlNPVU5EX1NldFBhdXNlZCAoZm1kLT5jaGFubmVsLCAwKTsKKyAgICAgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgICAgICAgIGZtb2RfbG9nZXJyICgiRmFpbGVkIHRvIHJlc3VtZSBjaGFubmVsICVkXG4iLCBmbWQtPmNoYW5uZWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWT0lDRV9ESVNBQkxFOgorICAgICAgICBzdGF0dXMgPSBGU09VTkRfU2V0UGF1c2VkIChmbWQtPmNoYW5uZWwsIDEpOworICAgICAgICBpZiAoIXN0YXR1cykgeworICAgICAgICAgICAgZm1vZF9sb2dlcnIgKCJGYWlsZWQgdG8gcGF1c2UgY2hhbm5lbCAlZFxuIiwgZm1kLT5jaGFubmVsKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm1vZF9pbml0X2luIChIV1ZvaWNlSW4gKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIGludCBiaXRzMTYsIG1vZGU7CisgICAgRk1PRFZvaWNlSW4gKmZtZCA9IChGTU9EVm9pY2VJbiAqKSBodzsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3Mgb2J0X2FzID0gKmFzOworCisgICAgaWYgKGNvbmYuYnJva2VuX2FkYykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbW9kZSA9IGF1ZF90b19mbW9kZm10IChhcy0+Zm10LCBhcy0+bmNoYW5uZWxzID09IDIgPyAxIDogMCk7CisgICAgZm1kLT5mbW9kX3NhbXBsZSA9IEZTT1VORF9TYW1wbGVfQWxsb2MgKAorICAgICAgICBGU09VTkRfRlJFRSwgICAgICAgICAgICAvKiBpbmRleCAqLworICAgICAgICBjb25mLm5iX3NhbXBsZXMsICAgICAgICAvKiBsZW5ndGggKi8KKyAgICAgICAgbW9kZSwgICAgICAgICAgICAgICAgICAgLyogbW9kZSAqLworICAgICAgICBhcy0+ZnJlcSwgICAgICAgICAgICAgICAvKiBmcmVxICovCisgICAgICAgIDI1NSwgICAgICAgICAgICAgICAgICAgIC8qIHZvbHVtZSAqLworICAgICAgICAxMjgsICAgICAgICAgICAgICAgICAgICAvKiBwYW4gKi8KKyAgICAgICAgMjU1ICAgICAgICAgICAgICAgICAgICAgLyogcHJpb3JpdHkgKi8KKyAgICAgICAgKTsKKworICAgIGlmICghZm1kLT5mbW9kX3NhbXBsZSkgeworICAgICAgICBmbW9kX2xvZ2VycjIgKCJBREMiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIEZNT0Qgc2FtcGxlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEZNT0QgYWx3YXlzIG9wZXJhdGVzIG9uIGxpdHRsZSBlbmRpYW4gZnJhbWVzPyAqLworICAgIG9idF9hcy5lbmRpYW5uZXNzID0gMDsKKyAgICBhdWRpb19wY21faW5pdF9pbmZvICgmaHctPmluZm8sICZvYnRfYXMpOworICAgIGJpdHMxNiA9IChtb2RlICYgRlNPVU5EXzE2QklUUykgIT0gMDsKKyAgICBody0+c2FtcGxlcyA9IGNvbmYubmJfc2FtcGxlczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZm1vZF9maW5pX2luIChIV1ZvaWNlSW4gKmh3KQoreworICAgIEZNT0RWb2ljZUluICpmbWQgPSAoRk1PRFZvaWNlSW4gKikgaHc7CisKKyAgICBpZiAoZm1kLT5mbW9kX3NhbXBsZSkgeworICAgICAgICBGU09VTkRfUmVjb3JkX1N0b3AgKCk7CisgICAgICAgIEZTT1VORF9TYW1wbGVfRnJlZSAoZm1kLT5mbW9kX3NhbXBsZSk7CisgICAgICAgIGZtZC0+Zm1vZF9zYW1wbGUgPSAwOworICAgIH0KK30KKworc3RhdGljIGludCBmbW9kX3J1bl9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBGTU9EVm9pY2VJbiAqZm1kID0gKEZNT0RWb2ljZUluICopIGh3OworICAgIGludCBod3NoaWZ0ID0gaHctPmluZm8uc2hpZnQ7CisgICAgaW50IGxpdmUsIGRlYWQsIG5ld19wb3MsIGxlbjsKKyAgICB1bnNpZ25lZCBpbnQgYmxlbjEgPSAwLCBibGVuMiA9IDA7CisgICAgdW5zaWduZWQgaW50IGxlbjEsIGxlbjI7CisgICAgdW5zaWduZWQgaW50IGRlY3I7CisgICAgdm9pZCAqcDEsICpwMjsKKworICAgIGxpdmUgPSBhdWRpb19wY21faHdfZ2V0X2xpdmVfaW4gKGh3KTsKKyAgICBkZWFkID0gaHctPnNhbXBsZXMgLSBsaXZlOworICAgIGlmICghZGVhZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBuZXdfcG9zID0gRlNPVU5EX1JlY29yZF9HZXRQb3NpdGlvbiAoKTsKKyAgICBpZiAobmV3X3BvcyA8IDApIHsKKyAgICAgICAgZm1vZF9sb2dlcnIgKCJDb3VsZCBub3QgZ2V0IHJlY29yZGluZyBwb3NpdGlvblxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbiA9IGF1ZGlvX3JpbmdfZGlzdCAobmV3X3BvcywgIGh3LT53cG9zLCBody0+c2FtcGxlcyk7CisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxlbiA9IGF1ZGlvX01JTiAobGVuLCBkZWFkKTsKKworICAgIGlmIChmbW9kX2xvY2tfc2FtcGxlIChmbWQtPmZtb2Rfc2FtcGxlLCAmZm1kLT5ody5pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBody0+d3BvcywgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcDEsICZwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW4xLCAmYmxlbjIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxlbjEgPSBibGVuMSA+PiBod3NoaWZ0OworICAgIGxlbjIgPSBibGVuMiA+PiBod3NoaWZ0OworICAgIGRlY3IgPSBsZW4xICsgbGVuMjsKKworICAgIGlmIChwMSAmJiBibGVuMSkgeworICAgICAgICBody0+Y29udiAoaHctPmNvbnZfYnVmICsgaHctPndwb3MsIHAxLCBsZW4xLCAmbm9taW5hbF92b2x1bWUpOworICAgIH0KKyAgICBpZiAocDIgJiYgbGVuMikgeworICAgICAgICBody0+Y29udiAoaHctPmNvbnZfYnVmLCBwMiwgbGVuMiwgJm5vbWluYWxfdm9sdW1lKTsKKyAgICB9CisKKyAgICBmbW9kX3VubG9ja19zYW1wbGUgKGZtZC0+Zm1vZF9zYW1wbGUsIHAxLCBwMiwgYmxlbjEsIGJsZW4yKTsKKyAgICBody0+d3BvcyA9IChody0+d3BvcyArIGRlY3IpICUgaHctPnNhbXBsZXM7CisgICAgcmV0dXJuIGRlY3I7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7Cit9IGRydnRhYltdID0geworICAgIHsgLm5hbWUgPSAibm9uZSIsICAgLnR5cGUgPSBGU09VTkRfT1VUUFVUX05PU09VTkQgfSwKKyNpZmRlZiBfV0lOMzIKKyAgICB7IC5uYW1lID0gIndpbm1tIiwgIC50eXBlID0gRlNPVU5EX09VVFBVVF9XSU5NTSAgIH0sCisgICAgeyAubmFtZSA9ICJkc291bmQiLCAudHlwZSA9IEZTT1VORF9PVVRQVVRfRFNPVU5EICB9LAorICAgIHsgLm5hbWUgPSAiYTNkIiwgICAgLnR5cGUgPSBGU09VTkRfT1VUUFVUX0EzRCAgICAgfSwKKyAgICB7IC5uYW1lID0gImFzaW8iLCAgIC50eXBlID0gRlNPVU5EX09VVFBVVF9BU0lPICAgIH0sCisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyAgICB7IC5uYW1lID0gIm9zcyIsICAgIC50eXBlID0gRlNPVU5EX09VVFBVVF9PU1MgICAgIH0sCisgICAgeyAubmFtZSA9ICJhbHNhIiwgICAudHlwZSA9IEZTT1VORF9PVVRQVVRfQUxTQSAgICB9LAorICAgIHsgLm5hbWUgPSAiZXNkIiwgICAgLnR5cGUgPSBGU09VTkRfT1VUUFVUX0VTRCAgICAgfSwKKyNlbmRpZgorI2lmZGVmIF9fQVBQTEVfXworICAgIHsgLm5hbWUgPSAibWFjIiwgICAgLnR5cGUgPSBGU09VTkRfT1VUUFVUX01BQyAgICAgfSwKKyNlbmRpZgorI2lmIDAKKyAgICB7IC5uYW1lID0gInhib3giLCAgIC50eXBlID0gRlNPVU5EX09VVFBVVF9YQk9YICAgIH0sCisgICAgeyAubmFtZSA9ICJwczIiLCAgICAudHlwZSA9IEZTT1VORF9PVVRQVVRfUFMyICAgICB9LAorICAgIHsgLm5hbWUgPSAiZ2N1YmUiLCAgLnR5cGUgPSBGU09VTkRfT1VUUFVUX0dDICAgICAgfSwKKyNlbmRpZgorICAgIHsgLm5hbWUgPSAibm9uZS1yZWFsdGltZSIsIC50eXBlID0gRlNPVU5EX09VVFBVVF9OT1NPVU5EX05PTlJFQUxUSU1FIH0KK307CisKK3N0YXRpYyB2b2lkICpmbW9kX2F1ZGlvX2luaXQgKHZvaWQpCit7CisgICAgc2l6ZV90IGk7CisgICAgZG91YmxlIHZlcjsKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBvdXRwdXRfdHlwZSA9IC0xOworICAgIGNvbnN0IGNoYXIgKmRydiA9IGNvbmYuZHJ2bmFtZTsKKworICAgIHZlciA9IEZTT1VORF9HZXRWZXJzaW9uICgpOworICAgIGlmICh2ZXIgPCBGTU9EX1ZFUlNJT04pIHsKKyAgICAgICAgZG9sb2cgKCJXcm9uZyBGTU9EIHZlcnNpb24gJWYsIG5lZWQgYXQgbGVhc3QgJWZcbiIsIHZlciwgRk1PRF9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgaWYgKHZlciA8IDMuNzUpIHsKKyAgICAgICAgZG9sb2cgKCJGTU9EIGJlZm9yZSAzLjc1IGhhcyBidWcgcHJldmVudGluZyBBREMgZnJvbSB3b3JraW5nXG4iCisgICAgICAgICAgICAgICAiQURDIHdpbGwgYmUgZGlzYWJsZWQuXG4iKTsKKyAgICAgICAgY29uZi5icm9rZW5fYWRjID0gMTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChkcnYpIHsKKyAgICAgICAgaW50IGZvdW5kID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUgKGRydnRhYik7IGkrKykgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAgKGRydiwgZHJ2dGFiW2ldLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0X3R5cGUgPSBkcnZ0YWJbaV0udHlwZTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgZG9sb2cgKCJVbmtub3duIEZNT0QgZHJpdmVyIGAlcydcbiIsIGRydik7CisgICAgICAgICAgICBkb2xvZyAoIlZhbGlkIGRyaXZlcnM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChkcnZ0YWIpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb2xvZyAoIiAgJXNcbiIsIGRydnRhYltpXS5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRwdXRfdHlwZSAhPSAtMSkgeworICAgICAgICBzdGF0dXMgPSBGU09VTkRfU2V0T3V0cHV0IChvdXRwdXRfdHlwZSk7CisgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgICBmbW9kX2xvZ2VyciAoIkZTT1VORF9TZXRPdXRwdXQoJWQpIGZhaWxlZFxuIiwgb3V0cHV0X3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29uZi5idWZzaXplKSB7CisgICAgICAgIHN0YXR1cyA9IEZTT1VORF9TZXRCdWZmZXJTaXplIChjb25mLmJ1ZnNpemUpOworICAgICAgICBpZiAoIXN0YXR1cykgeworICAgICAgICAgICAgZm1vZF9sb2dlcnIgKCJGU09VTkRfU2V0QnVmZmVyU2l6ZSAoJWQpIGZhaWxlZFxuIiwgY29uZi5idWZzaXplKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IEZTT1VORF9Jbml0IChjb25mLmZyZXEsIGNvbmYubmJfY2hhbm5lbHMsIDApOworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIGZtb2RfbG9nZXJyICgiRlNPVU5EX0luaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuICZjb25mOworfQorCitzdGF0aWMgaW50IGZtb2RfcmVhZCAoU1dWb2ljZUluICpzdywgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICByZXR1cm4gYXVkaW9fcGNtX3N3X3JlYWQgKHN3LCBidWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IGZtb2RfY3RsX2luIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgaW50IHN0YXR1czsKKyAgICBGTU9EVm9pY2VJbiAqZm1kID0gKEZNT0RWb2ljZUluICopIGh3OworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFZPSUNFX0VOQUJMRToKKyAgICAgICAgc3RhdHVzID0gRlNPVU5EX1JlY29yZF9TdGFydFNhbXBsZSAoZm1kLT5mbW9kX3NhbXBsZSwgMSk7CisgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgICBmbW9kX2xvZ2VyciAoIkZhaWxlZCB0byBzdGFydCByZWNvcmRpbmdcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWT0lDRV9ESVNBQkxFOgorICAgICAgICBzdGF0dXMgPSBGU09VTkRfUmVjb3JkX1N0b3AgKCk7CisgICAgICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgICAgICBmbW9kX2xvZ2VyciAoIkZhaWxlZCB0byBzdG9wIHJlY29yZGluZ1xuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmbW9kX2F1ZGlvX2ZpbmkgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICAodm9pZCkgb3BhcXVlOworICAgIEZTT1VORF9DbG9zZSAoKTsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19vcHRpb24gZm1vZF9vcHRpb25zW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgPSAiRFJWIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9TVFIsCisgICAgICAgIC52YWxwICA9ICZjb25mLmRydm5hbWUsCisgICAgICAgIC5kZXNjciA9ICJGTU9EIGRyaXZlciIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkZSRVEiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuZnJlcSwKKyAgICAgICAgLmRlc2NyID0gIkRlZmF1bHQgZnJlcXVlbmN5IgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiU0FNUExFUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5uYl9zYW1wbGVzLAorICAgICAgICAuZGVzY3IgPSAiQnVmZmVyIHNpemUgaW4gc2FtcGxlcyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkNIQU5ORUxTIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLm5iX2NoYW5uZWxzLAorICAgICAgICAuZGVzY3IgPSAiTnVtYmVyIG9mIGRlZmF1bHQgY2hhbm5lbHMgKDEgLSBtb25vLCAyIC0gc3RlcmVvKSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkJVRlNJWkUiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYuYnVmc2l6ZSwKKyAgICAgICAgLmRlc2NyID0gIih1bmRvY3VtZW50ZWQpIgorICAgIH0sCisgICAgeyAvKiBFbmQgb2YgbGlzdCAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX3BjbV9vcHMgZm1vZF9wY21fb3BzID0geworICAgIC5pbml0X291dCA9IGZtb2RfaW5pdF9vdXQsCisgICAgLmZpbmlfb3V0ID0gZm1vZF9maW5pX291dCwKKyAgICAucnVuX291dCAgPSBmbW9kX3J1bl9vdXQsCisgICAgLndyaXRlICAgID0gZm1vZF93cml0ZSwKKyAgICAuY3RsX291dCAgPSBmbW9kX2N0bF9vdXQsCisKKyAgICAuaW5pdF9pbiAgPSBmbW9kX2luaXRfaW4sCisgICAgLmZpbmlfaW4gID0gZm1vZF9maW5pX2luLAorICAgIC5ydW5faW4gICA9IGZtb2RfcnVuX2luLAorICAgIC5yZWFkICAgICA9IGZtb2RfcmVhZCwKKyAgICAuY3RsX2luICAgPSBmbW9kX2N0bF9pbgorfTsKKworc3RydWN0IGF1ZGlvX2RyaXZlciBmbW9kX2F1ZGlvX2RyaXZlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZm1vZCIsCisgICAgLmRlc2NyICAgICAgICAgID0gIkZNT0QgMy54eCBodHRwOi8vd3d3LmZtb2Qub3JnIiwKKyAgICAub3B0aW9ucyAgICAgICAgPSBmbW9kX29wdGlvbnMsCisgICAgLmluaXQgICAgICAgICAgID0gZm1vZF9hdWRpb19pbml0LAorICAgIC5maW5pICAgICAgICAgICA9IGZtb2RfYXVkaW9fZmluaSwKKyAgICAucGNtX29wcyAgICAgICAgPSAmZm1vZF9wY21fb3BzLAorICAgIC5jYW5fYmVfZGVmYXVsdCA9IDEsCisgICAgLm1heF92b2ljZXNfb3V0ID0gSU5UX01BWCwKKyAgICAubWF4X3ZvaWNlc19pbiAgPSBJTlRfTUFYLAorICAgIC52b2ljZV9zaXplX291dCA9IHNpemVvZiAoRk1PRFZvaWNlT3V0KSwKKyAgICAudm9pY2Vfc2l6ZV9pbiAgPSBzaXplb2YgKEZNT0RWb2ljZUluKQorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vbWl4ZW5nLmMgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL21peGVuZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzdiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL21peGVuZy5jCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogUUVNVSBNaXhpbmcgZW5naW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJhdWRpby5oIgorCisjZGVmaW5lIEFVRElPX0NBUCAibWl4ZW5nIgorI2luY2x1ZGUgImF1ZGlvX2ludC5oIgorCisvKiA4IGJpdCAqLworI2RlZmluZSBFTkRJQU5fQ09OVkVSU0lPTiBuYXR1cmFsCisjZGVmaW5lIEVORElBTl9DT05WRVJUKHYpICh2KQorCisvKiBTaWduZWQgOCBiaXQgKi8KKyNkZWZpbmUgSU5fVCBpbnQ4X3QKKyNkZWZpbmUgSU5fTUlOIFNDSEFSX01JTgorI2RlZmluZSBJTl9NQVggU0NIQVJfTUFYCisjZGVmaW5lIFNJR05FRAorI2RlZmluZSBTSElGVCA4CisjaW5jbHVkZSAibWl4ZW5nX3RlbXBsYXRlLmgiCisjdW5kZWYgU0lHTkVECisjdW5kZWYgSU5fTUFYCisjdW5kZWYgSU5fTUlOCisjdW5kZWYgSU5fVAorI3VuZGVmIFNISUZUCisKKy8qIFVuc2lnbmVkIDggYml0ICovCisjZGVmaW5lIElOX1QgdWludDhfdAorI2RlZmluZSBJTl9NSU4gMAorI2RlZmluZSBJTl9NQVggVUNIQVJfTUFYCisjZGVmaW5lIFNISUZUIDgKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBJTl9NQVgKKyN1bmRlZiBJTl9NSU4KKyN1bmRlZiBJTl9UCisjdW5kZWYgU0hJRlQKKworI3VuZGVmIEVORElBTl9DT05WRVJUCisjdW5kZWYgRU5ESUFOX0NPTlZFUlNJT04KKworLyogU2lnbmVkIDE2IGJpdCAqLworI2RlZmluZSBJTl9UIGludDE2X3QKKyNkZWZpbmUgSU5fTUlOIFNIUlRfTUlOCisjZGVmaW5lIElOX01BWCBTSFJUX01BWAorI2RlZmluZSBTSUdORUQKKyNkZWZpbmUgU0hJRlQgMTYKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlNJT04gbmF0dXJhbAorI2RlZmluZSBFTkRJQU5fQ09OVkVSVCh2KSAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjZGVmaW5lIEVORElBTl9DT05WRVJTSU9OIHN3YXAKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlQodikgYnN3YXAxNiAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjdW5kZWYgU0lHTkVECisjdW5kZWYgSU5fTUFYCisjdW5kZWYgSU5fTUlOCisjdW5kZWYgSU5fVAorI3VuZGVmIFNISUZUCisKKy8qIFVuc2lnbmVkIDE2IGJpdCAqLworI2RlZmluZSBJTl9UIHVpbnQxNl90CisjZGVmaW5lIElOX01JTiAwCisjZGVmaW5lIElOX01BWCBVU0hSVF9NQVgKKyNkZWZpbmUgU0hJRlQgMTYKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlNJT04gbmF0dXJhbAorI2RlZmluZSBFTkRJQU5fQ09OVkVSVCh2KSAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjZGVmaW5lIEVORElBTl9DT05WRVJTSU9OIHN3YXAKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlQodikgYnN3YXAxNiAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjdW5kZWYgSU5fTUFYCisjdW5kZWYgSU5fTUlOCisjdW5kZWYgSU5fVAorI3VuZGVmIFNISUZUCisKKy8qIFNpZ25lZCAzMiBiaXQgKi8KKyNkZWZpbmUgSU5fVCBpbnQzMl90CisjZGVmaW5lIElOX01JTiBJTlQzMl9NSU4KKyNkZWZpbmUgSU5fTUFYIElOVDMyX01BWAorI2RlZmluZSBTSUdORUQKKyNkZWZpbmUgU0hJRlQgMzIKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlNJT04gbmF0dXJhbAorI2RlZmluZSBFTkRJQU5fQ09OVkVSVCh2KSAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjZGVmaW5lIEVORElBTl9DT05WRVJTSU9OIHN3YXAKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlQodikgYnN3YXAzMiAodikKKyNpbmNsdWRlICJtaXhlbmdfdGVtcGxhdGUuaCIKKyN1bmRlZiBFTkRJQU5fQ09OVkVSVAorI3VuZGVmIEVORElBTl9DT05WRVJTSU9OCisjdW5kZWYgU0lHTkVECisjdW5kZWYgSU5fTUFYCisjdW5kZWYgSU5fTUlOCisjdW5kZWYgSU5fVAorI3VuZGVmIFNISUZUCisKKy8qIFVuc2lnbmVkIDMyIGJpdCAqLworI2RlZmluZSBJTl9UIHVpbnQzMl90CisjZGVmaW5lIElOX01JTiAwCisjZGVmaW5lIElOX01BWCBVSU5UMzJfTUFYCisjZGVmaW5lIFNISUZUIDMyCisjZGVmaW5lIEVORElBTl9DT05WRVJTSU9OIG5hdHVyYWwKKyNkZWZpbmUgRU5ESUFOX0NPTlZFUlQodikgKHYpCisjaW5jbHVkZSAibWl4ZW5nX3RlbXBsYXRlLmgiCisjdW5kZWYgRU5ESUFOX0NPTlZFUlQKKyN1bmRlZiBFTkRJQU5fQ09OVkVSU0lPTgorI2RlZmluZSBFTkRJQU5fQ09OVkVSU0lPTiBzd2FwCisjZGVmaW5lIEVORElBTl9DT05WRVJUKHYpIGJzd2FwMzIgKHYpCisjaW5jbHVkZSAibWl4ZW5nX3RlbXBsYXRlLmgiCisjdW5kZWYgRU5ESUFOX0NPTlZFUlQKKyN1bmRlZiBFTkRJQU5fQ09OVkVSU0lPTgorI3VuZGVmIElOX01BWAorI3VuZGVmIElOX01JTgorI3VuZGVmIElOX1QKKyN1bmRlZiBTSElGVAorCit0X3NhbXBsZSAqbWl4ZW5nX2NvbnZbMl1bMl1bMl1bM10gPSB7CisgICAgeworICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX3VpbnQ4X3RfdG9fbW9ubywKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfdWludDE2X3RfdG9fbW9ubywKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfdWludDMyX3RfdG9fbW9ubworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfdWludDhfdF90b19tb25vLAorICAgICAgICAgICAgICAgIGNvbnZfc3dhcF91aW50MTZfdF90b19tb25vLAorICAgICAgICAgICAgICAgIGNvbnZfc3dhcF91aW50MzJfdF90b19tb25vLAorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX2ludDhfdF90b19tb25vLAorICAgICAgICAgICAgICAgIGNvbnZfbmF0dXJhbF9pbnQxNl90X3RvX21vbm8sCisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX2ludDMyX3RfdG9fbW9ubworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfaW50OF90X3RvX21vbm8sCisgICAgICAgICAgICAgICAgY29udl9zd2FwX2ludDE2X3RfdG9fbW9ubywKKyAgICAgICAgICAgICAgICBjb252X3N3YXBfaW50MzJfdF90b19tb25vCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnZfbmF0dXJhbF91aW50OF90X3RvX3N0ZXJlbywKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfdWludDE2X3RfdG9fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNvbnZfbmF0dXJhbF91aW50MzJfdF90b19zdGVyZW8KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX3VpbnQ4X3RfdG9fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNvbnZfc3dhcF91aW50MTZfdF90b19zdGVyZW8sCisgICAgICAgICAgICAgICAgY29udl9zd2FwX3VpbnQzMl90X3RvX3N0ZXJlbworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX2ludDhfdF90b19zdGVyZW8sCisgICAgICAgICAgICAgICAgY29udl9uYXR1cmFsX2ludDE2X3RfdG9fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNvbnZfbmF0dXJhbF9pbnQzMl90X3RvX3N0ZXJlbworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb252X25hdHVyYWxfaW50OF90X3RvX3N0ZXJlbywKKyAgICAgICAgICAgICAgICBjb252X3N3YXBfaW50MTZfdF90b19zdGVyZW8sCisgICAgICAgICAgICAgICAgY29udl9zd2FwX2ludDMyX3RfdG9fc3RlcmVvLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTsKKworZl9zYW1wbGUgKm1peGVuZ19jbGlwWzJdWzJdWzJdWzNdID0geworICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaXBfbmF0dXJhbF91aW50OF90X2Zyb21fbW9ubywKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfdWludDE2X3RfZnJvbV9tb25vLAorICAgICAgICAgICAgICAgIGNsaXBfbmF0dXJhbF91aW50MzJfdF9mcm9tX21vbm8KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpcF9uYXR1cmFsX3VpbnQ4X3RfZnJvbV9tb25vLAorICAgICAgICAgICAgICAgIGNsaXBfc3dhcF91aW50MTZfdF9mcm9tX21vbm8sCisgICAgICAgICAgICAgICAgY2xpcF9zd2FwX3VpbnQzMl90X2Zyb21fbW9ubworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpcF9uYXR1cmFsX2ludDhfdF9mcm9tX21vbm8sCisgICAgICAgICAgICAgICAgY2xpcF9uYXR1cmFsX2ludDE2X3RfZnJvbV9tb25vLAorICAgICAgICAgICAgICAgIGNsaXBfbmF0dXJhbF9pbnQzMl90X2Zyb21fbW9ubworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfaW50OF90X2Zyb21fbW9ubywKKyAgICAgICAgICAgICAgICBjbGlwX3N3YXBfaW50MTZfdF9mcm9tX21vbm8sCisgICAgICAgICAgICAgICAgY2xpcF9zd2FwX2ludDMyX3RfZnJvbV9tb25vCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaXBfbmF0dXJhbF91aW50OF90X2Zyb21fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNsaXBfbmF0dXJhbF91aW50MTZfdF9mcm9tX3N0ZXJlbywKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfdWludDMyX3RfZnJvbV9zdGVyZW8KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpcF9uYXR1cmFsX3VpbnQ4X3RfZnJvbV9zdGVyZW8sCisgICAgICAgICAgICAgICAgY2xpcF9zd2FwX3VpbnQxNl90X2Zyb21fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNsaXBfc3dhcF91aW50MzJfdF9mcm9tX3N0ZXJlbworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpcF9uYXR1cmFsX2ludDhfdF9mcm9tX3N0ZXJlbywKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfaW50MTZfdF9mcm9tX3N0ZXJlbywKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfaW50MzJfdF9mcm9tX3N0ZXJlbworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGlwX25hdHVyYWxfaW50OF90X2Zyb21fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNsaXBfc3dhcF9pbnQxNl90X2Zyb21fc3RlcmVvLAorICAgICAgICAgICAgICAgIGNsaXBfc3dhcF9pbnQzMl90X2Zyb21fc3RlcmVvCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKgorICogQXVndXN0IDIxLCAxOTk4CisgKiBDb3B5cmlnaHQgMTk5OCBGYWJyaWNlIEJlbGxhcmQuCisgKgorICogW1Jld3JvdGUgY29tcGxldGx5IHRoZSBjb2RlIG9mIExhbmNlIE5vcnNrb2cgQW5kIFN1bmRyeQorICogQ29udHJpYnV0b3JzIHdpdGggYSBtb3JlIGVmZmljaWVudCBhbGdvcml0aG0uXQorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgZnJlZWx5IHJlZGlzdHJpYnV0YWJsZSBhbmQgbWF5IGJlIHVzZWQgZm9yCisgKiBhbnkgcHVycG9zZS4gIFRoaXMgY29weXJpZ2h0IG5vdGljZSBtdXN0IGJlIG1haW50YWluZWQuCisgKiBMYW5jZSBOb3Jza29nIEFuZCBTdW5kcnkgQ29udHJpYnV0b3JzIGFyZSBub3QgcmVzcG9uc2libGUgZm9yCisgKiB0aGUgY29uc2VxdWVuY2VzIG9mIHVzaW5nIHRoaXMgc29mdHdhcmUuCisgKi8KKworLyoKKyAqIFNvdW5kIFRvb2xzIHJhdGUgY2hhbmdlIGVmZmVjdCBmaWxlLgorICovCisvKgorICogTGluZWFyIEludGVycG9sYXRpb24uCisgKgorICogVGhlIHVzZSBvZiBmcmFjdGlvbmFsIGluY3JlbWVudCBhbGxvd3MgdXMgdG8gdXNlIG5vIGJ1ZmZlci4gSXQKKyAqIGF2b2lkIHRoZSBwcm9ibGVtcyBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2UgaGFkIHdpdGggdGhlIG9sZAorICogbWV0aG9kIHdoaWNoIHN0b3JlZCBhIHBvc3NpYmx5IGJpZyBidWZmZXIgb2Ygc2l6ZQorICogbGNtKGluX3JhdGUsb3V0X3JhdGUpLgorICoKKyAqIExpbWl0ZWQgdG8gMTYgYml0IHNhbXBsZXMgYW5kIHNhbXBsaW5nIGZyZXF1ZW5jeSA8PSA2NTUzNSBIei4gSWYKKyAqIHRoZSBpbnB1dCAmIG91dHB1dCBmcmVxdWVuY2llcyBhcmUgZXF1YWwsIGEgZGVsYXkgb2Ygb25lIHNhbXBsZSBpcworICogaW50cm9kdWNlZC4gIExpbWl0ZWQgdG8gcHJvY2Vzc2luZyAzMi1iaXQgY291bnQgd29ydGggb2Ygc2FtcGxlcy4KKyAqCisgKiAxIDw8IEZSQUNfQklUUyBldmFsdWF0aW5nIHRvIHplcm8gaW4gc2V2ZXJhbCBwbGFjZXMuICBDaGFuZ2VkIHdpdGgKKyAqIGFuICh1bnNpZ25lZCBsb25nKSBjYXN0IHRvIG1ha2UgaXQgc2FmZS4gIE1hcmtNTGwgMi8xLzk5CisgKi8KKworLyogUHJpdmF0ZSBkYXRhICovCitzdHJ1Y3QgcmF0ZSB7CisgICAgdWludDY0X3Qgb3BvczsKKyAgICB1aW50NjRfdCBvcG9zX2luYzsKKyAgICB1aW50MzJfdCBpcG9zOyAgICAgICAgICAgICAgLyogcG9zaXRpb24gaW4gdGhlIGlucHV0IHN0cmVhbSAoaW50ZWdlcikgKi8KKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlIGlsYXN0OyAgICAgICAgICAvKiBsYXN0IHNhbXBsZSBpbiB0aGUgaW5wdXQgc3RyZWFtICovCit9OworCisvKgorICogUHJlcGFyZSBwcm9jZXNzaW5nLgorICovCit2b2lkICpzdF9yYXRlX3N0YXJ0IChpbnQgaW5yYXRlLCBpbnQgb3V0cmF0ZSkKK3sKKyAgICBzdHJ1Y3QgcmF0ZSAqcmF0ZSA9IGF1ZGlvX2NhbGxvYyAoQVVESU9fRlVOQywgMSwgc2l6ZW9mICgqcmF0ZSkpOworCisgICAgaWYgKCFyYXRlKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGFsbG9jYXRlIHJlc2FtcGxlciAoJXUgYnl0ZXMpXG4iLCAoaW50KXNpemVvZiAoKnJhdGUpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmF0ZS0+b3BvcyA9IDA7CisKKyAgICAvKiBpbmNyZW1lbnQgKi8KKyAgICByYXRlLT5vcG9zX2luYyA9ICgodWludDY0X3QpIGlucmF0ZSA8PCAzMikgLyBvdXRyYXRlOworCisgICAgcmF0ZS0+aXBvcyA9IDA7CisgICAgcmF0ZS0+aWxhc3QubCA9IDA7CisgICAgcmF0ZS0+aWxhc3QuciA9IDA7CisgICAgcmV0dXJuIHJhdGU7Cit9CisKKyNkZWZpbmUgTkFNRSBzdF9yYXRlX2Zsb3dfbWl4CisjZGVmaW5lIE9QKGEsIGIpIGEgKz0gYgorI2luY2x1ZGUgInJhdGVfdGVtcGxhdGUuaCIKKworI2RlZmluZSBOQU1FIHN0X3JhdGVfZmxvdworI2RlZmluZSBPUChhLCBiKSBhID0gYgorI2luY2x1ZGUgInJhdGVfdGVtcGxhdGUuaCIKKwordm9pZCBzdF9yYXRlX3N0b3AgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBnX2ZyZWUgKG9wYXF1ZSk7Cit9CisKK3ZvaWQgbWl4ZW5nX2NsZWFyIChzdHJ1Y3Qgc3Rfc2FtcGxlICpidWYsIGludCBsZW4pCit7CisgICAgbWVtc2V0IChidWYsIDAsIGxlbiAqIHNpemVvZiAoc3RydWN0IHN0X3NhbXBsZSkpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9taXhlbmcuaCBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vbWl4ZW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmMWRkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vbWl4ZW5nLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFFFTVUgTWl4aW5nIGVuZ2luZSBoZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgUUVNVV9NSVhFTkdfSAorI2RlZmluZSBRRU1VX01JWEVOR19ICisKKyNpZmRlZiBGTE9BVF9NSVhFTkcKK3R5cGVkZWYgZmxvYXQgbWl4ZW5nX3JlYWw7CitzdHJ1Y3QgbWl4ZW5nX3ZvbHVtZSB7IGludCBtdXRlOyBtaXhlbmdfcmVhbCByOyBtaXhlbmdfcmVhbCBsOyB9Oworc3RydWN0IHN0X3NhbXBsZSB7IG1peGVuZ19yZWFsIGw7IG1peGVuZ19yZWFsIHI7IH07CisjZWxzZQorc3RydWN0IG1peGVuZ192b2x1bWUgeyBpbnQgbXV0ZTsgaW50NjRfdCByOyBpbnQ2NF90IGw7IH07CitzdHJ1Y3Qgc3Rfc2FtcGxlIHsgaW50NjRfdCBsOyBpbnQ2NF90IHI7IH07CisjZW5kaWYKKwordHlwZWRlZiB2b2lkICh0X3NhbXBsZSkgKHN0cnVjdCBzdF9zYW1wbGUgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzLCBzdHJ1Y3QgbWl4ZW5nX3ZvbHVtZSAqdm9sKTsKK3R5cGVkZWYgdm9pZCAoZl9zYW1wbGUpICh2b2lkICpkc3QsIGNvbnN0IHN0cnVjdCBzdF9zYW1wbGUgKnNyYywgaW50IHNhbXBsZXMpOworCitleHRlcm4gdF9zYW1wbGUgKm1peGVuZ19jb252WzJdWzJdWzJdWzNdOworZXh0ZXJuIGZfc2FtcGxlICptaXhlbmdfY2xpcFsyXVsyXVsyXVszXTsKKwordm9pZCAqc3RfcmF0ZV9zdGFydCAoaW50IGlucmF0ZSwgaW50IG91dHJhdGUpOwordm9pZCBzdF9yYXRlX2Zsb3cgKHZvaWQgKm9wYXF1ZSwgc3RydWN0IHN0X3NhbXBsZSAqaWJ1Ziwgc3RydWN0IHN0X3NhbXBsZSAqb2J1ZiwKKyAgICAgICAgICAgICAgICAgICBpbnQgKmlzYW1wLCBpbnQgKm9zYW1wKTsKK3ZvaWQgc3RfcmF0ZV9mbG93X21peCAodm9pZCAqb3BhcXVlLCBzdHJ1Y3Qgc3Rfc2FtcGxlICppYnVmLCBzdHJ1Y3Qgc3Rfc2FtcGxlICpvYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlzYW1wLCBpbnQgKm9zYW1wKTsKK3ZvaWQgc3RfcmF0ZV9zdG9wICh2b2lkICpvcGFxdWUpOwordm9pZCBtaXhlbmdfY2xlYXIgKHN0cnVjdCBzdF9zYW1wbGUgKmJ1ZiwgaW50IGxlbik7CisKKyNlbmRpZiAgLyogbWl4ZW5nLmggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vbWl4ZW5nX3RlbXBsYXRlLmggYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL21peGVuZ190ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2U2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL21peGVuZ190ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogUUVNVSBNaXhpbmcgZW5naW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBUdXNlbiB0YWNrIHRpbGwgTWlrZSBOb3JkZWxsCisgKiBkZWMrKydpZmllZCBieSBEc2NobworICovCisKKyNpZm5kZWYgU0lHTkVECisjZGVmaW5lIEhBTEYgKElOX01BWCA+PiAxKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlYRU1VCisjaWZkZWYgRkxPQVRfTUlYRU5HCisjZGVmaW5lIFZPTChhLCBiKSAoKGEpICogKGIpKQorI2Vsc2UKKyNkZWZpbmUgVk9MKGEsIGIpICgoYSkgKiAoYikpID4+IDMyCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIFZPTChhLCBiKSBhCisjZW5kaWYKKworI2RlZmluZSBFVCBnbHVlIChFTkRJQU5fQ09OVkVSU0lPTiwgZ2x1ZSAoXywgSU5fVCkpCisKKyNpZmRlZiBGTE9BVF9NSVhFTkcKK3N0YXRpYyBtaXhlbmdfcmVhbCBpbmxpbmUgZ2x1ZSAoY29udl8sIEVUKSAoSU5fVCB2KQoreworICAgIElOX1QgbnYgPSBFTkRJQU5fQ09OVkVSVCAodik7CisKKyNpZmRlZiBSRUNJUFJPQ0FMCisjaWZkZWYgU0lHTkVECisgICAgcmV0dXJuIG52ICogKDEuZiAvIChtaXhlbmdfcmVhbCkgKElOX01BWCAtIElOX01JTikpOworI2Vsc2UKKyAgICByZXR1cm4gKG52IC0gSEFMRikgKiAoMS5mIC8gKG1peGVuZ19yZWFsKSBJTl9NQVgpOworI2VuZGlmCisjZWxzZSAgLyogIVJFQ0lQUk9DQUwgKi8KKyNpZmRlZiBTSUdORUQKKyAgICByZXR1cm4gbnYgLyAoKG1peGVuZ19yZWFsKUlOX01BWCAtIChtaXhlbmdfcmVhbClJTl9NSU4pOworI2Vsc2UKKyAgICByZXR1cm4gKG52IC0gSEFMRikgLyAobWl4ZW5nX3JlYWwpIElOX01BWDsKKyNlbmRpZgorI2VuZGlmCit9CisKK3N0YXRpYyBJTl9UIGlubGluZSBnbHVlIChjbGlwXywgRVQpIChtaXhlbmdfcmVhbCB2KQoreworICAgIGlmICh2ID49IDAuNSkgeworICAgICAgICByZXR1cm4gSU5fTUFYOworICAgIH0KKyAgICBlbHNlIGlmICh2IDwgLTAuNSkgeworICAgICAgICByZXR1cm4gSU5fTUlOOworICAgIH0KKworI2lmZGVmIFNJR05FRAorICAgIHJldHVybiBFTkRJQU5fQ09OVkVSVCAoKElOX1QpICh2ICogKElOX01BWCAtIElOX01JTikpKTsKKyNlbHNlCisgICAgcmV0dXJuIEVORElBTl9DT05WRVJUICgoSU5fVCkgKCh2ICogSU5fTUFYKSArIEhBTEYpKTsKKyNlbmRpZgorfQorCisjZWxzZSAgLyogIUZMT0FUX01JWEVORyAqLworCitzdGF0aWMgaW5saW5lIGludDY0X3QgZ2x1ZSAoY29udl8sIEVUKSAoSU5fVCB2KQoreworICAgIElOX1QgbnYgPSBFTkRJQU5fQ09OVkVSVCAodik7CisjaWZkZWYgU0lHTkVECisgICAgcmV0dXJuICgoaW50NjRfdCkgbnYpIDw8ICgzMiAtIFNISUZUKTsKKyNlbHNlCisgICAgcmV0dXJuICgoaW50NjRfdCkgbnYgLSBIQUxGKSA8PCAoMzIgLSBTSElGVCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBJTl9UIGdsdWUgKGNsaXBfLCBFVCkgKGludDY0X3QgdikKK3sKKyAgICBpZiAodiA+PSAweDdmMDAwMDAwKSB7CisgICAgICAgIHJldHVybiBJTl9NQVg7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPCAtMjE0NzQ4MzY0OExMKSB7CisgICAgICAgIHJldHVybiBJTl9NSU47CisgICAgfQorCisjaWZkZWYgU0lHTkVECisgICAgcmV0dXJuIEVORElBTl9DT05WRVJUICgoSU5fVCkgKHYgPj4gKDMyIC0gU0hJRlQpKSk7CisjZWxzZQorICAgIHJldHVybiBFTkRJQU5fQ09OVkVSVCAoKElOX1QpICgodiA+PiAoMzIgLSBTSElGVCkpICsgSEFMRikpOworI2VuZGlmCit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2x1ZSAoZ2x1ZSAoY29udl8sIEVUKSwgX3RvX3N0ZXJlbykKKyAgICAoc3RydWN0IHN0X3NhbXBsZSAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGludCBzYW1wbGVzLCBzdHJ1Y3QgbWl4ZW5nX3ZvbHVtZSAqdm9sKQoreworICAgIHN0cnVjdCBzdF9zYW1wbGUgKm91dCA9IGRzdDsKKyAgICBJTl9UICppbiA9IChJTl9UICopIHNyYzsKKyNpZmRlZiBDT05GSUdfTUlYRU1VCisgICAgaWYgKHZvbC0+bXV0ZSkgeworICAgICAgICBtaXhlbmdfY2xlYXIgKGRzdCwgc2FtcGxlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKSB2b2w7CisjZW5kaWYKKyAgICB3aGlsZSAoc2FtcGxlcy0tKSB7CisgICAgICAgIG91dC0+bCA9IFZPTCAoZ2x1ZSAoY29udl8sIEVUKSAoKmluKyspLCB2b2wtPmwpOworICAgICAgICBvdXQtPnIgPSBWT0wgKGdsdWUgKGNvbnZfLCBFVCkgKCppbisrKSwgdm9sLT5yKTsKKyAgICAgICAgb3V0ICs9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnbHVlIChnbHVlIChjb252XywgRVQpLCBfdG9fbW9ubykKKyAgICAoc3RydWN0IHN0X3NhbXBsZSAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGludCBzYW1wbGVzLCBzdHJ1Y3QgbWl4ZW5nX3ZvbHVtZSAqdm9sKQoreworICAgIHN0cnVjdCBzdF9zYW1wbGUgKm91dCA9IGRzdDsKKyAgICBJTl9UICppbiA9IChJTl9UICopIHNyYzsKKyNpZmRlZiBDT05GSUdfTUlYRU1VCisgICAgaWYgKHZvbC0+bXV0ZSkgeworICAgICAgICBtaXhlbmdfY2xlYXIgKGRzdCwgc2FtcGxlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKSB2b2w7CisjZW5kaWYKKyAgICB3aGlsZSAoc2FtcGxlcy0tKSB7CisgICAgICAgIG91dC0+bCA9IFZPTCAoZ2x1ZSAoY29udl8sIEVUKSAoaW5bMF0pLCB2b2wtPmwpOworICAgICAgICBvdXQtPnIgPSBvdXQtPmw7CisgICAgICAgIG91dCArPSAxOworICAgICAgICBpbiArPSAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2x1ZSAoZ2x1ZSAoY2xpcF8sIEVUKSwgX2Zyb21fc3RlcmVvKQorICAgICh2b2lkICpkc3QsIGNvbnN0IHN0cnVjdCBzdF9zYW1wbGUgKnNyYywgaW50IHNhbXBsZXMpCit7CisgICAgY29uc3Qgc3RydWN0IHN0X3NhbXBsZSAqaW4gPSBzcmM7CisgICAgSU5fVCAqb3V0ID0gKElOX1QgKikgZHN0OworICAgIHdoaWxlIChzYW1wbGVzLS0pIHsKKyAgICAgICAgKm91dCsrID0gZ2x1ZSAoY2xpcF8sIEVUKSAoaW4tPmwpOworICAgICAgICAqb3V0KysgPSBnbHVlIChjbGlwXywgRVQpIChpbi0+cik7CisgICAgICAgIGluICs9IDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnbHVlIChnbHVlIChjbGlwXywgRVQpLCBfZnJvbV9tb25vKQorICAgICh2b2lkICpkc3QsIGNvbnN0IHN0cnVjdCBzdF9zYW1wbGUgKnNyYywgaW50IHNhbXBsZXMpCit7CisgICAgY29uc3Qgc3RydWN0IHN0X3NhbXBsZSAqaW4gPSBzcmM7CisgICAgSU5fVCAqb3V0ID0gKElOX1QgKikgZHN0OworICAgIHdoaWxlIChzYW1wbGVzLS0pIHsKKyAgICAgICAgKm91dCsrID0gZ2x1ZSAoY2xpcF8sIEVUKSAoaW4tPmwgKyBpbi0+cik7CisgICAgICAgIGluICs9IDE7CisgICAgfQorfQorCisjdW5kZWYgRVQKKyN1bmRlZiBIQUxGCisjdW5kZWYgVk9MCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL25vYXVkaW8uYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vbm9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjAwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL25vYXVkaW8uYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIFFFTVUgVGltZXIgYmFzZWQgYXVkaW8gZW11bGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKworI2RlZmluZSBBVURJT19DQVAgIm5vYXVkaW8iCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisKK3R5cGVkZWYgc3RydWN0IE5vVm9pY2VPdXQgeworICAgIEhXVm9pY2VPdXQgaHc7CisgICAgaW50NjRfdCBvbGRfdGlja3M7Cit9IE5vVm9pY2VPdXQ7CisKK3R5cGVkZWYgc3RydWN0IE5vVm9pY2VJbiB7CisgICAgSFdWb2ljZUluIGh3OworICAgIGludDY0X3Qgb2xkX3RpY2tzOworfSBOb1ZvaWNlSW47CisKK3N0YXRpYyBpbnQgbm9fcnVuX291dCAoSFdWb2ljZU91dCAqaHcsIGludCBsaXZlKQoreworICAgIE5vVm9pY2VPdXQgKm5vID0gKE5vVm9pY2VPdXQgKikgaHc7CisgICAgaW50IGRlY3IsIHNhbXBsZXM7CisgICAgaW50NjRfdCBub3c7CisgICAgaW50NjRfdCB0aWNrczsKKyAgICBpbnQ2NF90IGJ5dGVzOworCisgICAgbm93ID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKTsKKyAgICB0aWNrcyA9IG5vdyAtIG5vLT5vbGRfdGlja3M7CisgICAgYnl0ZXMgPSBtdWxkaXY2NCAodGlja3MsIGh3LT5pbmZvLmJ5dGVzX3Blcl9zZWNvbmQsIGdldF90aWNrc19wZXJfc2VjICgpKTsKKyAgICBieXRlcyA9IGF1ZGlvX01JTiAoYnl0ZXMsIElOVF9NQVgpOworICAgIHNhbXBsZXMgPSBieXRlcyA+PiBody0+aW5mby5zaGlmdDsKKworICAgIG5vLT5vbGRfdGlja3MgPSBub3c7CisgICAgZGVjciA9IGF1ZGlvX01JTiAobGl2ZSwgc2FtcGxlcyk7CisgICAgaHctPnJwb3MgPSAoaHctPnJwb3MgKyBkZWNyKSAlIGh3LT5zYW1wbGVzOworICAgIHJldHVybiBkZWNyOworfQorCitzdGF0aWMgaW50IG5vX3dyaXRlIChTV1ZvaWNlT3V0ICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfd3JpdGUgKHN3LCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgbm9faW5pdF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgYXMpOworICAgIGh3LT5zYW1wbGVzID0gMTAyNDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm9fZmluaV9vdXQgKEhXVm9pY2VPdXQgKmh3KQoreworICAgICh2b2lkKSBodzsKK30KKworc3RhdGljIGludCBub19jdGxfb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGNtZCwgLi4uKQoreworICAgICh2b2lkKSBodzsKKyAgICAodm9pZCkgY21kOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5vX2luaXRfaW4gKEhXVm9pY2VJbiAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCBhcyk7CisgICAgaHctPnNhbXBsZXMgPSAxMDI0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBub19maW5pX2luIChIV1ZvaWNlSW4gKmh3KQoreworICAgICh2b2lkKSBodzsKK30KKworc3RhdGljIGludCBub19ydW5faW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgTm9Wb2ljZUluICpubyA9IChOb1ZvaWNlSW4gKikgaHc7CisgICAgaW50IGxpdmUgPSBhdWRpb19wY21faHdfZ2V0X2xpdmVfaW4gKGh3KTsKKyAgICBpbnQgZGVhZCA9IGh3LT5zYW1wbGVzIC0gbGl2ZTsKKyAgICBpbnQgc2FtcGxlcyA9IDA7CisKKyAgICBpZiAoZGVhZCkgeworICAgICAgICBpbnQ2NF90IG5vdyA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgICAgIGludDY0X3QgdGlja3MgPSBub3cgLSBuby0+b2xkX3RpY2tzOworICAgICAgICBpbnQ2NF90IGJ5dGVzID0KKyAgICAgICAgICAgIG11bGRpdjY0ICh0aWNrcywgaHctPmluZm8uYnl0ZXNfcGVyX3NlY29uZCwgZ2V0X3RpY2tzX3Blcl9zZWMgKCkpOworCisgICAgICAgIG5vLT5vbGRfdGlja3MgPSBub3c7CisgICAgICAgIGJ5dGVzID0gYXVkaW9fTUlOIChieXRlcywgSU5UX01BWCk7CisgICAgICAgIHNhbXBsZXMgPSBieXRlcyA+PiBody0+aW5mby5zaGlmdDsKKyAgICAgICAgc2FtcGxlcyA9IGF1ZGlvX01JTiAoc2FtcGxlcywgZGVhZCk7CisgICAgfQorICAgIHJldHVybiBzYW1wbGVzOworfQorCitzdGF0aWMgaW50IG5vX3JlYWQgKFNXVm9pY2VJbiAqc3csIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IHNhbXBsZXMgPSBzaXplID4+IHN3LT5pbmZvLnNoaWZ0OworICAgIGludCB0b3RhbCA9IHN3LT5ody0+dG90YWxfc2FtcGxlc19jYXB0dXJlZCAtIHN3LT50b3RhbF9od19zYW1wbGVzX2FjcXVpcmVkOworICAgIGludCB0b19jbGVhciA9IGF1ZGlvX01JTiAoc2FtcGxlcywgdG90YWwpOworICAgIGF1ZGlvX3BjbV9pbmZvX2NsZWFyX2J1ZiAoJnN3LT5pbmZvLCBidWYsIHRvX2NsZWFyKTsKKyAgICByZXR1cm4gdG9fY2xlYXIgPDwgc3ctPmluZm8uc2hpZnQ7Cit9CisKK3N0YXRpYyBpbnQgbm9fY3RsX2luIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgKHZvaWQpIGh3OworICAgICh2b2lkKSBjbWQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICpub19hdWRpb19pbml0ICh2b2lkKQoreworICAgIHJldHVybiAmbm9fYXVkaW9faW5pdDsKK30KKworc3RhdGljIHZvaWQgbm9fYXVkaW9fZmluaSAodm9pZCAqb3BhcXVlKQoreworICAgICh2b2lkKSBvcGFxdWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fcGNtX29wcyBub19wY21fb3BzID0geworICAgIC5pbml0X291dCA9IG5vX2luaXRfb3V0LAorICAgIC5maW5pX291dCA9IG5vX2Zpbmlfb3V0LAorICAgIC5ydW5fb3V0ICA9IG5vX3J1bl9vdXQsCisgICAgLndyaXRlICAgID0gbm9fd3JpdGUsCisgICAgLmN0bF9vdXQgID0gbm9fY3RsX291dCwKKworICAgIC5pbml0X2luICA9IG5vX2luaXRfaW4sCisgICAgLmZpbmlfaW4gID0gbm9fZmluaV9pbiwKKyAgICAucnVuX2luICAgPSBub19ydW5faW4sCisgICAgLnJlYWQgICAgID0gbm9fcmVhZCwKKyAgICAuY3RsX2luICAgPSBub19jdGxfaW4KK307CisKK3N0cnVjdCBhdWRpb19kcml2ZXIgbm9fYXVkaW9fZHJpdmVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJub25lIiwKKyAgICAuZGVzY3IgICAgICAgICAgPSAiVGltZXIgYmFzZWQgYXVkaW8gZW11bGF0aW9uIiwKKyAgICAub3B0aW9ucyAgICAgICAgPSBOVUxMLAorICAgIC5pbml0ICAgICAgICAgICA9IG5vX2F1ZGlvX2luaXQsCisgICAgLmZpbmkgICAgICAgICAgID0gbm9fYXVkaW9fZmluaSwKKyAgICAucGNtX29wcyAgICAgICAgPSAmbm9fcGNtX29wcywKKyAgICAuY2FuX2JlX2RlZmF1bHQgPSAxLAorICAgIC5tYXhfdm9pY2VzX291dCA9IElOVF9NQVgsCisgICAgLm1heF92b2ljZXNfaW4gID0gSU5UX01BWCwKKyAgICAudm9pY2Vfc2l6ZV9vdXQgPSBzaXplb2YgKE5vVm9pY2VPdXQpLAorICAgIC52b2ljZV9zaXplX2luICA9IHNpemVvZiAoTm9Wb2ljZUluKQorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vb3NzYXVkaW8uYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vb3NzYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Q5ODBmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby9vc3NhdWRpby5jCkBAIC0wLDAgKzEsOTM1IEBACisvKgorICogUUVNVSBPU1MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZmRlZiBfX09wZW5CU0RfXworI2luY2x1ZGUgPHNvdW5kY2FyZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZW5kaWYKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKworI2RlZmluZSBBVURJT19DQVAgIm9zcyIKKyNpbmNsdWRlICJhdWRpb19pbnQuaCIKKworI2lmIGRlZmluZWQgT1NTX0dFVFZFUlNJT04gJiYgZGVmaW5lZCBTTkRDVExfRFNQX1BPTElDWQorI2RlZmluZSBVU0VfRFNQX1BPTElDWQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IE9TU1ZvaWNlT3V0IHsKKyAgICBIV1ZvaWNlT3V0IGh3OworICAgIHZvaWQgKnBjbV9idWY7CisgICAgaW50IGZkOworICAgIGludCB3cG9zOworICAgIGludCBuZnJhZ3M7CisgICAgaW50IGZyYWdzaXplOworICAgIGludCBtbWFwcGVkOworICAgIGludCBwZW5kaW5nOworfSBPU1NWb2ljZU91dDsKKwordHlwZWRlZiBzdHJ1Y3QgT1NTVm9pY2VJbiB7CisgICAgSFdWb2ljZUluIGh3OworICAgIHZvaWQgKnBjbV9idWY7CisgICAgaW50IGZkOworICAgIGludCBuZnJhZ3M7CisgICAgaW50IGZyYWdzaXplOworfSBPU1NWb2ljZUluOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgdHJ5X21tYXA7CisgICAgaW50IG5mcmFnczsKKyAgICBpbnQgZnJhZ3NpemU7CisgICAgY29uc3QgY2hhciAqZGV2cGF0aF9vdXQ7CisgICAgY29uc3QgY2hhciAqZGV2cGF0aF9pbjsKKyAgICBpbnQgZGVidWc7CisgICAgaW50IGV4Y2x1c2l2ZTsKKyAgICBpbnQgcG9saWN5OworfSBjb25mID0geworICAgIC50cnlfbW1hcCA9IDAsCisgICAgLm5mcmFncyA9IDQsCisgICAgLmZyYWdzaXplID0gNDA5NiwKKyAgICAuZGV2cGF0aF9vdXQgPSAiL2Rldi9kc3AiLAorICAgIC5kZXZwYXRoX2luID0gIi9kZXYvZHNwIiwKKyAgICAuZGVidWcgPSAwLAorICAgIC5leGNsdXNpdmUgPSAwLAorICAgIC5wb2xpY3kgPSA1Cit9OworCitzdHJ1Y3Qgb3NzX3BhcmFtcyB7CisgICAgaW50IGZyZXE7CisgICAgYXVkZm10X2UgZm10OworICAgIGludCBuY2hhbm5lbHM7CisgICAgaW50IG5mcmFnczsKKyAgICBpbnQgZnJhZ3NpemU7Cit9OworCitzdGF0aWMgdm9pZCBHQ0NfRk1UX0FUVFIgKDIsIDMpIG9zc19sb2dlcnIgKGludCBlcnIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCAoYXAsIGZtdCk7CisgICAgQVVEX3Zsb2cgKEFVRElPX0NBUCwgZm10LCBhcCk7CisgICAgdmFfZW5kIChhcCk7CisKKyAgICBBVURfbG9nIChBVURJT19DQVAsICJSZWFzb246ICVzXG4iLCBzdHJlcnJvciAoZXJyKSk7Cit9CisKK3N0YXRpYyB2b2lkIEdDQ19GTVRfQVRUUiAoMywgNCkgb3NzX2xvZ2VycjIgKAorICAgIGludCBlcnIsCisgICAgY29uc3QgY2hhciAqdHlwLAorICAgIGNvbnN0IGNoYXIgKmZtdCwKKyAgICAuLi4KKyAgICApCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIkNvdWxkIG5vdCBpbml0aWFsaXplICVzXG4iLCB0eXApOworCisgICAgdmFfc3RhcnQgKGFwLCBmbXQpOworICAgIEFVRF92bG9nIChBVURJT19DQVAsIGZtdCwgYXApOworICAgIHZhX2VuZCAoYXApOworCisgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiUmVhc29uOiAlc1xuIiwgc3RyZXJyb3IgKGVycikpOworfQorCitzdGF0aWMgdm9pZCBvc3NfYW5hbF9jbG9zZSAoaW50ICpmZHApCit7CisgICAgaW50IGVycjsKKworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIgKCpmZHAsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGVyciA9IGNsb3NlICgqZmRwKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIG9zc19sb2dlcnIgKGVycm5vLCAiRmFpbGVkIHRvIGNsb3NlIGZpbGUoZmQ9JWQpXG4iLCAqZmRwKTsKKyAgICB9CisgICAgKmZkcCA9IC0xOworfQorCitzdGF0aWMgdm9pZCBvc3NfaGVscGVyX3BvbGxfb3V0ICh2b2lkICpvcGFxdWUpCit7CisgICAgKHZvaWQpIG9wYXF1ZTsKKyAgICBhdWRpb19ydW4gKCJvc3NfcG9sbF9vdXQiKTsKK30KKworc3RhdGljIHZvaWQgb3NzX2hlbHBlcl9wb2xsX2luICh2b2lkICpvcGFxdWUpCit7CisgICAgKHZvaWQpIG9wYXF1ZTsKKyAgICBhdWRpb19ydW4gKCJvc3NfcG9sbF9pbiIpOworfQorCitzdGF0aWMgaW50IG9zc19wb2xsX291dCAoSFdWb2ljZU91dCAqaHcpCit7CisgICAgT1NTVm9pY2VPdXQgKm9zcyA9IChPU1NWb2ljZU91dCAqKSBodzsKKworICAgIHJldHVybiBxZW11X3NldF9mZF9oYW5kbGVyIChvc3MtPmZkLCBOVUxMLCBvc3NfaGVscGVyX3BvbGxfb3V0LCBOVUxMKTsKK30KKworc3RhdGljIGludCBvc3NfcG9sbF9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBPU1NWb2ljZUluICpvc3MgPSAoT1NTVm9pY2VJbiAqKSBodzsKKworICAgIHJldHVybiBxZW11X3NldF9mZF9oYW5kbGVyIChvc3MtPmZkLCBvc3NfaGVscGVyX3BvbGxfaW4sIE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IG9zc193cml0ZSAoU1dWb2ljZU91dCAqc3csIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXVkaW9fcGNtX3N3X3dyaXRlIChzdywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IGF1ZF90b19vc3NmbXQgKGF1ZGZtdF9lIGZtdCkKK3sKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgQVVEX0ZNVF9TODoKKyAgICAgICAgcmV0dXJuIEFGTVRfUzg7CisKKyAgICBjYXNlIEFVRF9GTVRfVTg6CisgICAgICAgIHJldHVybiBBRk1UX1U4OworCisgICAgY2FzZSBBVURfRk1UX1MxNjoKKyAgICAgICAgcmV0dXJuIEFGTVRfUzE2X0xFOworCisgICAgY2FzZSBBVURfRk1UX1UxNjoKKyAgICAgICAgcmV0dXJuIEFGTVRfVTE2X0xFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZG9sb2cgKCJJbnRlcm5hbCBsb2dpYyBlcnJvcjogQmFkIGF1ZGlvIGZvcm1hdCAlZFxuIiwgZm10KTsKKyNpZmRlZiBERUJVR19BVURJTworICAgICAgICBhYm9ydCAoKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQUZNVF9VODsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3NzX3RvX2F1ZGZtdCAoaW50IG9zc2ZtdCwgYXVkZm10X2UgKmZtdCwgaW50ICplbmRpYW5uZXNzKQoreworICAgIHN3aXRjaCAob3NzZm10KSB7CisgICAgY2FzZSBBRk1UX1M4OgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1M4OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQUZNVF9VODoKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAwOworICAgICAgICAqZm10ID0gQVVEX0ZNVF9VODsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFGTVRfUzE2X0xFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1MxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFGTVRfVTE2X0xFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1UxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFGTVRfUzE2X0JFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDE7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1MxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFGTVRfVTE2X0JFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDE7CisgICAgICAgICpmbXQgPSBBVURfRk1UX1UxNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoIlVucmVjb2duaXplZCBhdWRpbyBmb3JtYXQgJWRcbiIsIG9zc2ZtdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQgREVCVUdfTUlTTUFUQ0hFUyB8fCBkZWZpbmVkIERFQlVHCitzdGF0aWMgdm9pZCBvc3NfZHVtcF9pbmZvIChzdHJ1Y3Qgb3NzX3BhcmFtcyAqcmVxLCBzdHJ1Y3Qgb3NzX3BhcmFtcyAqb2J0KQoreworICAgIGRvbG9nICgicGFyYW1ldGVyIHwgcmVxdWVzdGVkIHZhbHVlIHwgb2J0YWluZWQgdmFsdWVcbiIpOworICAgIGRvbG9nICgiZm9ybWF0ICAgIHwgICAgICAlMTBkIHwgICAgICUxMGRcbiIsIHJlcS0+Zm10LCBvYnQtPmZtdCk7CisgICAgZG9sb2cgKCJjaGFubmVscyAgfCAgICAgICUxMGQgfCAgICAgJTEwZFxuIiwKKyAgICAgICAgICAgcmVxLT5uY2hhbm5lbHMsIG9idC0+bmNoYW5uZWxzKTsKKyAgICBkb2xvZyAoImZyZXF1ZW5jeSB8ICAgICAgJTEwZCB8ICAgICAlMTBkXG4iLCByZXEtPmZyZXEsIG9idC0+ZnJlcSk7CisgICAgZG9sb2cgKCJuZnJhZ3MgICAgfCAgICAgICUxMGQgfCAgICAgJTEwZFxuIiwgcmVxLT5uZnJhZ3MsIG9idC0+bmZyYWdzKTsKKyAgICBkb2xvZyAoImZyYWdzaXplICB8ICAgICAgJTEwZCB8ICAgICAlMTBkXG4iLAorICAgICAgICAgICByZXEtPmZyYWdzaXplLCBvYnQtPmZyYWdzaXplKTsKK30KKyNlbmRpZgorCisjaWZkZWYgVVNFX0RTUF9QT0xJQ1kKK3N0YXRpYyBpbnQgb3NzX2dldF92ZXJzaW9uIChpbnQgZmQsIGludCAqdmVyc2lvbiwgY29uc3QgY2hhciAqdHlwKQoreworICAgIGlmIChpb2N0bCAoZmQsIE9TU19HRVRWRVJTSU9OLCAmdmVyc2lvbikpIHsKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgICAgICAgLyoKKyAgICAgICAgICogTG9va3MgbGlrZSBhdG0gKDIwMTAwMTA5KSBGcmVlQlNEIGtub3dzIE9TU19HRVRWRVJTSU9OCisgICAgICAgICAqIHNpbmNlIDcueCwgYnV0IGN1cnJlbnRseSBvbmx5IG9uIHRoZSBtaXhlciBkZXZpY2UgKG9yIGluCisgICAgICAgICAqIHRoZSBMaW51eG9sYXRvciksIGFuZCBpbiB0aGUgbmF0aXZlIHZlcnNpb24gdGhhdCBwYXJ0IG9mCisgICAgICAgICAqIHRoZSBjb2RlIGlzIGluIGZhY3QgbmV2ZXIgcmVhY2hlZCBzbyB0aGUgaW9jdGwgZmFpbHMgYW55d2F5LgorICAgICAgICAgKiBVbnRpbCB0aGlzIGlzIGZpeGVkLCBqdXN0IGNoZWNrIHRoZSBlcnJubyBhbmQgaWYgaXRzIHdoYXQKKyAgICAgICAgICogRnJlZUJTRCdzIHNvdW5kIGRyaXZlcnMgcmV0dXJuIGF0bSBhc3N1bWUgdGhleSBhcmUgbmV3IGVub3VnaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgICAgICp2ZXJzaW9uID0gMHgwNDAwMDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIG9zc19sb2dlcnIyIChlcnJubywgdHlwLCAiRmFpbGVkIHRvIGdldCBPU1MgdmVyc2lvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBvc3Nfb3BlbiAoaW50IGluLCBzdHJ1Y3Qgb3NzX3BhcmFtcyAqcmVxLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9zc19wYXJhbXMgKm9idCwgaW50ICpwZmQpCit7CisgICAgaW50IGZkOworICAgIGludCBvZmxhZ3MgPSBjb25mLmV4Y2x1c2l2ZSA/IE9fRVhDTCA6IDA7CisgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgIGludCBmbXQsIGZyZXEsIG5jaGFubmVsczsKKyAgICBpbnQgc2V0ZnJhZ21lbnQgPSAxOworICAgIGNvbnN0IGNoYXIgKmRzcG5hbWUgPSBpbiA/IGNvbmYuZGV2cGF0aF9pbiA6IGNvbmYuZGV2cGF0aF9vdXQ7CisgICAgY29uc3QgY2hhciAqdHlwID0gaW4gPyAiQURDIiA6ICJEQUMiOworCisgICAgLyogS2x1ZGdlIG5lZWRlZCB0byBoYXZlIHdvcmtpbmcgbW1hcCBvbiBMaW51eCAqLworICAgIG9mbGFncyB8PSBjb25mLnRyeV9tbWFwID8gT19SRFdSIDogKGluID8gT19SRE9OTFkgOiBPX1dST05MWSk7CisKKyAgICBmZCA9IG9wZW4gKGRzcG5hbWUsIG9mbGFncyB8IE9fTk9OQkxPQ0spOworICAgIGlmICgtMSA9PSBmZCkgeworICAgICAgICBvc3NfbG9nZXJyMiAoZXJybm8sIHR5cCwgIkZhaWxlZCB0byBvcGVuIGAlcydcbiIsIGRzcG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZnJlcSA9IHJlcS0+ZnJlcTsKKyAgICBuY2hhbm5lbHMgPSByZXEtPm5jaGFubmVsczsKKyAgICBmbXQgPSByZXEtPmZtdDsKKworICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfU0FNUExFU0laRSwgJmZtdCkpIHsKKyAgICAgICAgb3NzX2xvZ2VycjIgKGVycm5vLCB0eXAsICJGYWlsZWQgdG8gc2V0IHNhbXBsZSBzaXplICVkXG4iLCByZXEtPmZtdCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfQ0hBTk5FTFMsICZuY2hhbm5lbHMpKSB7CisgICAgICAgIG9zc19sb2dlcnIyIChlcnJubywgdHlwLCAiRmFpbGVkIHRvIHNldCBudW1iZXIgb2YgY2hhbm5lbHMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICByZXEtPm5jaGFubmVscyk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfU1BFRUQsICZmcmVxKSkgeworICAgICAgICBvc3NfbG9nZXJyMiAoZXJybm8sIHR5cCwgIkZhaWxlZCB0byBzZXQgZnJlcXVlbmN5ICVkXG4iLCByZXEtPmZyZXEpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX05PTkJMT0NLLCBOVUxMKSkgeworICAgICAgICBvc3NfbG9nZXJyMiAoZXJybm8sIHR5cCwgIkZhaWxlZCB0byBzZXQgbm9uLWJsb2NraW5nIG1vZGVcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyNpZmRlZiBVU0VfRFNQX1BPTElDWQorICAgIGlmIChjb25mLnBvbGljeSA+PSAwKSB7CisgICAgICAgIGludCB2ZXJzaW9uOworCisgICAgICAgIGlmICghb3NzX2dldF92ZXJzaW9uIChmZCwgJnZlcnNpb24sIHR5cCkpIHsKKyAgICAgICAgICAgIGlmIChjb25mLmRlYnVnKSB7CisgICAgICAgICAgICAgICAgZG9sb2cgKCJPU1MgdmVyc2lvbiA9ICUjeFxuIiwgdmVyc2lvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDB4MDQwMDAwKSB7CisgICAgICAgICAgICAgICAgaW50IHBvbGljeSA9IGNvbmYucG9saWN5OworICAgICAgICAgICAgICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfUE9MSUNZLCAmcG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBvc3NfbG9nZXJyMiAoZXJybm8sIHR5cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IHRpbWluZyBwb2xpY3kgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLnBvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRmcmFnbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzZXRmcmFnbWVudCkgeworICAgICAgICBpbnQgbW1tbXNzc3MgPSAocmVxLT5uZnJhZ3MgPDwgMTYpIHwgY3R6MzIgKHJlcS0+ZnJhZ3NpemUpOworICAgICAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX1NFVEZSQUdNRU5ULCAmbW1tbXNzc3MpKSB7CisgICAgICAgICAgICBvc3NfbG9nZXJyMiAoZXJybm8sIHR5cCwgIkZhaWxlZCB0byBzZXQgYnVmZmVyIGxlbmd0aCAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXEtPm5mcmFncywgcmVxLT5mcmFnc2l6ZSk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpb2N0bCAoZmQsIGluID8gU05EQ1RMX0RTUF9HRVRJU1BBQ0UgOiBTTkRDVExfRFNQX0dFVE9TUEFDRSwgJmFiaW5mbykpIHsKKyAgICAgICAgb3NzX2xvZ2VycjIgKGVycm5vLCB0eXAsICJGYWlsZWQgdG8gZ2V0IGJ1ZmZlciBsZW5ndGhcbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoIWFiaW5mby5mcmFnc3RvdGFsIHx8ICFhYmluZm8uZnJhZ3NpemUpIHsKKyAgICAgICAgQVVEX2xvZyAoQVVESU9fQ0FQLCAiUmV0dXJuZWQgYm9ndXMgYnVmZmVyIGluZm9ybWF0aW9uKCVkLCAlZCkgZm9yICVzXG4iLAorICAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCwgYWJpbmZvLmZyYWdzaXplLCB0eXApOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBvYnQtPmZtdCA9IGZtdDsKKyAgICBvYnQtPm5jaGFubmVscyA9IG5jaGFubmVsczsKKyAgICBvYnQtPmZyZXEgPSBmcmVxOworICAgIG9idC0+bmZyYWdzID0gYWJpbmZvLmZyYWdzdG90YWw7CisgICAgb2J0LT5mcmFnc2l6ZSA9IGFiaW5mby5mcmFnc2l6ZTsKKyAgICAqcGZkID0gZmQ7CisKKyNpZmRlZiBERUJVR19NSVNNQVRDSEVTCisgICAgaWYgKChyZXEtPmZtdCAhPSBvYnQtPmZtdCkgfHwKKyAgICAgICAgKHJlcS0+bmNoYW5uZWxzICE9IG9idC0+bmNoYW5uZWxzKSB8fAorICAgICAgICAocmVxLT5mcmVxICE9IG9idC0+ZnJlcSkgfHwKKyAgICAgICAgKHJlcS0+ZnJhZ3NpemUgIT0gb2J0LT5mcmFnc2l6ZSkgfHwKKyAgICAgICAgKHJlcS0+bmZyYWdzICE9IG9idC0+bmZyYWdzKSkgeworICAgICAgICBkb2xvZyAoIkF1ZGlvIHBhcmFtZXRlcnMgbWlzbWF0Y2hcbiIpOworICAgICAgICBvc3NfZHVtcF9pbmZvIChyZXEsIG9idCk7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworICAgIG9zc19kdW1wX2luZm8gKHJlcSwgb2J0KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworCisgZXJyOgorICAgIG9zc19hbmFsX2Nsb3NlICgmZmQpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgb3NzX3dyaXRlX3BlbmRpbmcgKE9TU1ZvaWNlT3V0ICpvc3MpCit7CisgICAgSFdWb2ljZU91dCAqaHcgPSAmb3NzLT5odzsKKworICAgIGlmIChvc3MtPm1tYXBwZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChvc3MtPnBlbmRpbmcpIHsKKyAgICAgICAgaW50IHNhbXBsZXNfd3JpdHRlbjsKKyAgICAgICAgc3NpemVfdCBieXRlc193cml0dGVuOworICAgICAgICBpbnQgc2FtcGxlc190aWxsX2VuZCA9IGh3LT5zYW1wbGVzIC0gb3NzLT53cG9zOworICAgICAgICBpbnQgc2FtcGxlc190b193cml0ZSA9IGF1ZGlvX01JTiAob3NzLT5wZW5kaW5nLCBzYW1wbGVzX3RpbGxfZW5kKTsKKyAgICAgICAgaW50IGJ5dGVzX3RvX3dyaXRlID0gc2FtcGxlc190b193cml0ZSA8PCBody0+aW5mby5zaGlmdDsKKyAgICAgICAgdm9pZCAqcGNtID0gYWR2YW5jZSAob3NzLT5wY21fYnVmLCBvc3MtPndwb3MgPDwgaHctPmluZm8uc2hpZnQpOworCisgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSB3cml0ZSAob3NzLT5mZCwgcGNtLCBieXRlc190b193cml0ZSk7CisgICAgICAgIGlmIChieXRlc193cml0dGVuIDwgMCkgeworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgICAgIG9zc19sb2dlcnIgKGVycm5vLCAiZmFpbGVkIHRvIHdyaXRlICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gJiBody0+aW5mby5hbGlnbikgeworICAgICAgICAgICAgZG9sb2cgKCJtaXNhbGlnbmVkIHdyaXRlIGFza2VkIGZvciAlZCwgYnV0IGdvdCAlemRcbiIsCisgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fd3JpdGUsIGJ5dGVzX3dyaXR0ZW4pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2FtcGxlc193cml0dGVuID0gYnl0ZXNfd3JpdHRlbiA+PiBody0+aW5mby5zaGlmdDsKKyAgICAgICAgb3NzLT5wZW5kaW5nIC09IHNhbXBsZXNfd3JpdHRlbjsKKyAgICAgICAgb3NzLT53cG9zID0gKG9zcy0+d3BvcyArIHNhbXBsZXNfd3JpdHRlbikgJSBody0+c2FtcGxlczsKKyAgICAgICAgaWYgKGJ5dGVzX3dyaXR0ZW4gLSBieXRlc190b193cml0ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3NzX3J1bl9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgbGl2ZSkKK3sKKyAgICBPU1NWb2ljZU91dCAqb3NzID0gKE9TU1ZvaWNlT3V0ICopIGh3OworICAgIGludCBlcnIsIGRlY3I7CisgICAgc3RydWN0IGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICBzdHJ1Y3QgY291bnRfaW5mbyBjbnRpbmZvOworICAgIGludCBidWZzaXplOworCisgICAgYnVmc2l6ZSA9IGh3LT5zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0OworCisgICAgaWYgKG9zcy0+bW1hcHBlZCkgeworICAgICAgICBpbnQgYnl0ZXMsIHBvczsKKworICAgICAgICBlcnIgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPUFRSLCAmY250aW5mbyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBvc3NfbG9nZXJyIChlcnJubywgIlNORENUTF9EU1BfR0VUT1BUUiBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwb3MgPSBody0+cnBvcyA8PCBody0+aW5mby5zaGlmdDsKKyAgICAgICAgYnl0ZXMgPSBhdWRpb19yaW5nX2Rpc3QgKGNudGluZm8ucHRyLCBwb3MsIGJ1ZnNpemUpOworICAgICAgICBkZWNyID0gYXVkaW9fTUlOIChieXRlcyA+PiBody0+aW5mby5zaGlmdCwgbGl2ZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcnIgPSBpb2N0bCAob3NzLT5mZCwgU05EQ1RMX0RTUF9HRVRPU1BBQ0UsICZhYmluZm8pOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgb3NzX2xvZ2VyciAoZXJybm8sICJTTkRDVExfRFNQX0dFVE9QVFIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFiaW5mby5ieXRlcyA+IGJ1ZnNpemUpIHsKKyAgICAgICAgICAgIGlmIChjb25mLmRlYnVnKSB7CisgICAgICAgICAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBJbnZhbGlkIGF2YWlsYWJsZSBzaXplLCBzaXplPSVkIGJ1ZnNpemU9JWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgInBsZWFzZSByZXBvcnQgeW91ciBPUy9hdWRpbyBodyB0byBhdjE0NzRAY29tdHYucnVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcywgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBidWZzaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFiaW5mby5ieXRlcyA8IDApIHsKKyAgICAgICAgICAgIGlmIChjb25mLmRlYnVnKSB7CisgICAgICAgICAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBJbnZhbGlkIGF2YWlsYWJsZSBzaXplLCBzaXplPSVkIGJ1ZnNpemU9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcywgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGRlY3IgPSBhdWRpb19NSU4gKGFiaW5mby5ieXRlcyA+PiBody0+aW5mby5zaGlmdCwgbGl2ZSk7CisgICAgICAgIGlmICghZGVjcikgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWNyID0gYXVkaW9fcGNtX2h3X2NsaXBfb3V0IChodywgb3NzLT5wY21fYnVmLCBkZWNyLCBvc3MtPnBlbmRpbmcpOworICAgIG9zcy0+cGVuZGluZyArPSBkZWNyOworICAgIG9zc193cml0ZV9wZW5kaW5nIChvc3MpOworCisgICAgcmV0dXJuIGRlY3I7Cit9CisKK3N0YXRpYyB2b2lkIG9zc19maW5pX291dCAoSFdWb2ljZU91dCAqaHcpCit7CisgICAgaW50IGVycjsKKyAgICBPU1NWb2ljZU91dCAqb3NzID0gKE9TU1ZvaWNlT3V0ICopIGh3OworCisgICAgbGRlYnVnICgib3NzX2ZpbmlcbiIpOworICAgIG9zc19hbmFsX2Nsb3NlICgmb3NzLT5mZCk7CisKKyAgICBpZiAob3NzLT5wY21fYnVmKSB7CisgICAgICAgIGlmIChvc3MtPm1tYXBwZWQpIHsKKyAgICAgICAgICAgIGVyciA9IG11bm1hcCAob3NzLT5wY21fYnVmLCBody0+c2FtcGxlcyA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgb3NzX2xvZ2VyciAoZXJybm8sICJGYWlsZWQgdG8gdW5tYXAgYnVmZmVyICVwLCBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zcy0+cGNtX2J1ZiwgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZ19mcmVlIChvc3MtPnBjbV9idWYpOworICAgICAgICB9CisgICAgICAgIG9zcy0+cGNtX2J1ZiA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9zc19pbml0X291dCAoSFdWb2ljZU91dCAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgT1NTVm9pY2VPdXQgKm9zcyA9IChPU1NWb2ljZU91dCAqKSBodzsKKyAgICBzdHJ1Y3Qgb3NzX3BhcmFtcyByZXEsIG9idDsKKyAgICBpbnQgZW5kaWFubmVzczsKKyAgICBpbnQgZXJyOworICAgIGludCBmZDsKKyAgICBhdWRmbXRfZSBlZmZlY3RpdmVfZm10OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXM7CisKKyAgICBvc3MtPmZkID0gLTE7CisKKyAgICByZXEuZm10ID0gYXVkX3RvX29zc2ZtdCAoYXMtPmZtdCk7CisgICAgcmVxLmZyZXEgPSBhcy0+ZnJlcTsKKyAgICByZXEubmNoYW5uZWxzID0gYXMtPm5jaGFubmVsczsKKyAgICByZXEuZnJhZ3NpemUgPSBjb25mLmZyYWdzaXplOworICAgIHJlcS5uZnJhZ3MgPSBjb25mLm5mcmFnczsKKworICAgIGlmIChvc3Nfb3BlbiAoMCwgJnJlcSwgJm9idCwgJmZkKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZXJyID0gb3NzX3RvX2F1ZGZtdCAob2J0LmZtdCwgJmVmZmVjdGl2ZV9mbXQsICZlbmRpYW5uZXNzKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIG9zc19hbmFsX2Nsb3NlICgmZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb2J0X2FzLmZyZXEgPSBvYnQuZnJlcTsKKyAgICBvYnRfYXMubmNoYW5uZWxzID0gb2J0Lm5jaGFubmVsczsKKyAgICBvYnRfYXMuZm10ID0gZWZmZWN0aXZlX2ZtdDsKKyAgICBvYnRfYXMuZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7CisKKyAgICBhdWRpb19wY21faW5pdF9pbmZvICgmaHctPmluZm8sICZvYnRfYXMpOworICAgIG9zcy0+bmZyYWdzID0gb2J0Lm5mcmFnczsKKyAgICBvc3MtPmZyYWdzaXplID0gb2J0LmZyYWdzaXplOworCisgICAgaWYgKG9idC5uZnJhZ3MgKiBvYnQuZnJhZ3NpemUgJiBody0+aW5mby5hbGlnbikgeworICAgICAgICBkb2xvZyAoIndhcm5pbmc6IE1pc2FsaWduZWQgREFDIGJ1ZmZlciwgc2l6ZSAlZCwgYWxpZ25tZW50ICVkXG4iLAorICAgICAgICAgICAgICAgb2J0Lm5mcmFncyAqIG9idC5mcmFnc2l6ZSwgaHctPmluZm8uYWxpZ24gKyAxKTsKKyAgICB9CisKKyAgICBody0+c2FtcGxlcyA9IChvYnQubmZyYWdzICogb2J0LmZyYWdzaXplKSA+PiBody0+aW5mby5zaGlmdDsKKworICAgIG9zcy0+bW1hcHBlZCA9IDA7CisgICAgaWYgKGNvbmYudHJ5X21tYXApIHsKKyAgICAgICAgb3NzLT5wY21fYnVmID0gbW1hcCAoCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQsCisgICAgICAgICAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgIGZkLAorICAgICAgICAgICAgMAorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKG9zcy0+cGNtX2J1ZiA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBvc3NfbG9nZXJyIChlcnJubywgIkZhaWxlZCB0byBtYXAgJWQgYnl0ZXMgb2YgREFDXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgIGludCB0cmlnID0gMDsKKyAgICAgICAgICAgIGlmIChpb2N0bCAoZmQsIFNORENUTF9EU1BfU0VUVFJJR0dFUiwgJnRyaWcpIDwgMCkgeworICAgICAgICAgICAgICAgIG9zc19sb2dlcnIgKGVycm5vLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSIDAgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHRyaWcgPSBQQ01fRU5BQkxFX09VVFBVVDsKKyAgICAgICAgICAgICAgICBpZiAoaW9jdGwgKGZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ0cmlnKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3NzX2xvZ2VyciAoCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJubywKKyAgICAgICAgICAgICAgICAgICAgICAgICJTTkRDVExfRFNQX1NFVFRSSUdHRVIgUENNX0VOQUJMRV9PVVRQVVQgZmFpbGVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3NzLT5tbWFwcGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb3NzLT5tbWFwcGVkKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbXVubWFwIChvc3MtPnBjbV9idWYsIGh3LT5zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIG9zc19sb2dlcnIgKGVycm5vLCAiRmFpbGVkIHRvIHVubWFwIGJ1ZmZlciAlcCBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3MtPnBjbV9idWYsIGh3LT5zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW9zcy0+bW1hcHBlZCkgeworICAgICAgICBvc3MtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKAorICAgICAgICAgICAgQVVESU9fRlVOQywKKyAgICAgICAgICAgIGh3LT5zYW1wbGVzLAorICAgICAgICAgICAgMSA8PCBody0+aW5mby5zaGlmdAorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCFvc3MtPnBjbV9idWYpIHsKKyAgICAgICAgICAgIGRvbG9nICgKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIERBQyBidWZmZXIgKCVkIHNhbXBsZXMsIGVhY2ggJWQgYnl0ZXMpXG4iLAorICAgICAgICAgICAgICAgIGh3LT5zYW1wbGVzLAorICAgICAgICAgICAgICAgIDEgPDwgaHctPmluZm8uc2hpZnQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgb3NzX2FuYWxfY2xvc2UgKCZmZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvc3MtPmZkID0gZmQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3NzX2N0bF9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgaW50IHRyaWc7CisgICAgT1NTVm9pY2VPdXQgKm9zcyA9IChPU1NWb2ljZU91dCAqKSBodzsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBWT0lDRV9FTkFCTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgICAgICBpbnQgcG9sbF9tb2RlOworCisgICAgICAgICAgICB2YV9zdGFydCAoYXAsIGNtZCk7CisgICAgICAgICAgICBwb2xsX21vZGUgPSB2YV9hcmcgKGFwLCBpbnQpOworICAgICAgICAgICAgdmFfZW5kIChhcCk7CisKKyAgICAgICAgICAgIGxkZWJ1ZyAoImVuYWJsaW5nIHZvaWNlXG4iKTsKKyAgICAgICAgICAgIGlmIChwb2xsX21vZGUgJiYgb3NzX3BvbGxfb3V0IChodykpIHsKKyAgICAgICAgICAgICAgICBwb2xsX21vZGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHctPnBvbGxfbW9kZSA9IHBvbGxfbW9kZTsKKworICAgICAgICAgICAgaWYgKCFvc3MtPm1tYXBwZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9fcGNtX2luZm9fY2xlYXJfYnVmICgmaHctPmluZm8sIG9zcy0+cGNtX2J1ZiwgaHctPnNhbXBsZXMpOworICAgICAgICAgICAgdHJpZyA9IFBDTV9FTkFCTEVfT1VUUFVUOworICAgICAgICAgICAgaWYgKGlvY3RsIChvc3MtPmZkLCBTTkRDVExfRFNQX1NFVFRSSUdHRVIsICZ0cmlnKSA8IDApIHsKKyAgICAgICAgICAgICAgICBvc3NfbG9nZXJyICgKKyAgICAgICAgICAgICAgICAgICAgZXJybm8sCisgICAgICAgICAgICAgICAgICAgICJTTkRDVExfRFNQX1NFVFRSSUdHRVIgUENNX0VOQUJMRV9PVVRQVVQgZmFpbGVkXG4iCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWT0lDRV9ESVNBQkxFOgorICAgICAgICBpZiAoaHctPnBvbGxfbW9kZSkgeworICAgICAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlciAob3NzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBody0+cG9sbF9tb2RlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghb3NzLT5tbWFwcGVkKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxkZWJ1ZyAoImRpc2FibGluZyB2b2ljZVxuIik7CisgICAgICAgIHRyaWcgPSAwOworICAgICAgICBpZiAoaW9jdGwgKG9zcy0+ZmQsIFNORENUTF9EU1BfU0VUVFJJR0dFUiwgJnRyaWcpIDwgMCkgeworICAgICAgICAgICAgb3NzX2xvZ2VyciAoZXJybm8sICJTTkRDVExfRFNQX1NFVFRSSUdHRVIgMCBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvc3NfaW5pdF9pbiAoSFdWb2ljZUluICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBPU1NWb2ljZUluICpvc3MgPSAoT1NTVm9pY2VJbiAqKSBodzsKKyAgICBzdHJ1Y3Qgb3NzX3BhcmFtcyByZXEsIG9idDsKKyAgICBpbnQgZW5kaWFubmVzczsKKyAgICBpbnQgZXJyOworICAgIGludCBmZDsKKyAgICBhdWRmbXRfZSBlZmZlY3RpdmVfZm10OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBvYnRfYXM7CisKKyAgICBvc3MtPmZkID0gLTE7CisKKyAgICByZXEuZm10ID0gYXVkX3RvX29zc2ZtdCAoYXMtPmZtdCk7CisgICAgcmVxLmZyZXEgPSBhcy0+ZnJlcTsKKyAgICByZXEubmNoYW5uZWxzID0gYXMtPm5jaGFubmVsczsKKyAgICByZXEuZnJhZ3NpemUgPSBjb25mLmZyYWdzaXplOworICAgIHJlcS5uZnJhZ3MgPSBjb25mLm5mcmFnczsKKyAgICBpZiAob3NzX29wZW4gKDEsICZyZXEsICZvYnQsICZmZCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGVyciA9IG9zc190b19hdWRmbXQgKG9idC5mbXQsICZlZmZlY3RpdmVfZm10LCAmZW5kaWFubmVzcyk7CisgICAgaWYgKGVycikgeworICAgICAgICBvc3NfYW5hbF9jbG9zZSAoJmZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG9idF9hcy5mcmVxID0gb2J0LmZyZXE7CisgICAgb2J0X2FzLm5jaGFubmVscyA9IG9idC5uY2hhbm5lbHM7CisgICAgb2J0X2FzLmZtdCA9IGVmZmVjdGl2ZV9mbXQ7CisgICAgb2J0X2FzLmVuZGlhbm5lc3MgPSBlbmRpYW5uZXNzOworCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCAmb2J0X2FzKTsKKyAgICBvc3MtPm5mcmFncyA9IG9idC5uZnJhZ3M7CisgICAgb3NzLT5mcmFnc2l6ZSA9IG9idC5mcmFnc2l6ZTsKKworICAgIGlmIChvYnQubmZyYWdzICogb2J0LmZyYWdzaXplICYgaHctPmluZm8uYWxpZ24pIHsKKyAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIEFEQyBidWZmZXIsIHNpemUgJWQsIGFsaWdubWVudCAlZFxuIiwKKyAgICAgICAgICAgICAgIG9idC5uZnJhZ3MgKiBvYnQuZnJhZ3NpemUsIGh3LT5pbmZvLmFsaWduICsgMSk7CisgICAgfQorCisgICAgaHctPnNhbXBsZXMgPSAob2J0Lm5mcmFncyAqIG9idC5mcmFnc2l6ZSkgPj4gaHctPmluZm8uc2hpZnQ7CisgICAgb3NzLT5wY21fYnVmID0gYXVkaW9fY2FsbG9jIChBVURJT19GVU5DLCBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgaWYgKCFvc3MtPnBjbV9idWYpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgQURDIGJ1ZmZlciAoJWQgc2FtcGxlcywgZWFjaCAlZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIG9zc19hbmFsX2Nsb3NlICgmZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb3NzLT5mZCA9IGZkOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvc3NfZmluaV9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBPU1NWb2ljZUluICpvc3MgPSAoT1NTVm9pY2VJbiAqKSBodzsKKworICAgIG9zc19hbmFsX2Nsb3NlICgmb3NzLT5mZCk7CisKKyAgICBpZiAob3NzLT5wY21fYnVmKSB7CisgICAgICAgIGdfZnJlZSAob3NzLT5wY21fYnVmKTsKKyAgICAgICAgb3NzLT5wY21fYnVmID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3NzX3J1bl9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBPU1NWb2ljZUluICpvc3MgPSAoT1NTVm9pY2VJbiAqKSBodzsKKyAgICBpbnQgaHdzaGlmdCA9IGh3LT5pbmZvLnNoaWZ0OworICAgIGludCBpOworICAgIGludCBsaXZlID0gYXVkaW9fcGNtX2h3X2dldF9saXZlX2luIChodyk7CisgICAgaW50IGRlYWQgPSBody0+c2FtcGxlcyAtIGxpdmU7CisgICAgc2l6ZV90IHJlYWRfc2FtcGxlcyA9IDA7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IGFkZDsKKyAgICAgICAgaW50IGxlbjsKKyAgICB9IGJ1ZnNbMl0gPSB7CisgICAgICAgIHsgLmFkZCA9IGh3LT53cG9zLCAubGVuID0gMCB9LAorICAgICAgICB7IC5hZGQgPSAwLCAgICAgICAgLmxlbiA9IDAgfQorICAgIH07CisKKyAgICBpZiAoIWRlYWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGh3LT53cG9zICsgZGVhZCA+IGh3LT5zYW1wbGVzKSB7CisgICAgICAgIGJ1ZnNbMF0ubGVuID0gKGh3LT5zYW1wbGVzIC0gaHctPndwb3MpIDw8IGh3c2hpZnQ7CisgICAgICAgIGJ1ZnNbMV0ubGVuID0gKGRlYWQgLSAoaHctPnNhbXBsZXMgLSBody0+d3BvcykpIDw8IGh3c2hpZnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBidWZzWzBdLmxlbiA9IGRlYWQgPDwgaHdzaGlmdDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNzaXplX3QgbnJlYWQ7CisKKyAgICAgICAgaWYgKGJ1ZnNbaV0ubGVuKSB7CisgICAgICAgICAgICB2b2lkICpwID0gYWR2YW5jZSAob3NzLT5wY21fYnVmLCBidWZzW2ldLmFkZCA8PCBod3NoaWZ0KTsKKyAgICAgICAgICAgIG5yZWFkID0gcmVhZCAob3NzLT5mZCwgcCwgYnVmc1tpXS5sZW4pOworCisgICAgICAgICAgICBpZiAobnJlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG5yZWFkICYgaHctPmluZm8uYWxpZ24pIHsKKyAgICAgICAgICAgICAgICAgICAgZG9sb2cgKCJ3YXJuaW5nOiBNaXNhbGlnbmVkIHJlYWQgJXpkIChyZXF1ZXN0ZWQgJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpZ25tZW50ICVkXG4iLCBucmVhZCwgYnVmc1tpXS5hZGQgPDwgaHdzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3LT5pbmZvLmFsaWduICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWRfc2FtcGxlcyArPSBucmVhZCA+PiBod3NoaWZ0OworICAgICAgICAgICAgICAgIGh3LT5jb252IChody0+Y29udl9idWYgKyBidWZzW2ldLmFkZCwgcCwgbnJlYWQgPj4gaHdzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vbWluYWxfdm9sdW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1ZnNbaV0ubGVuIC0gbnJlYWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobnJlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnJubykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEVJTlRSOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEVBR0FJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgb3NzX2xvZ2VyciAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkICVkIGJ5dGVzIG9mIGF1ZGlvICh0byAlcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc1tpXS5sZW4sIHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBody0+d3BvcyA9IChody0+d3BvcyArIHJlYWRfc2FtcGxlcykgJSBody0+c2FtcGxlczsKKyAgICByZXR1cm4gcmVhZF9zYW1wbGVzOworfQorCitzdGF0aWMgaW50IG9zc19yZWFkIChTV1ZvaWNlSW4gKnN3LCB2b2lkICpidWYsIGludCBzaXplKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfcmVhZCAoc3csIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgb3NzX2N0bF9pbiAoSFdWb2ljZUluICpodywgaW50IGNtZCwgLi4uKQoreworICAgIE9TU1ZvaWNlSW4gKm9zcyA9IChPU1NWb2ljZUluICopIGh3OworCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFZPSUNFX0VOQUJMRToKKyAgICAgICAgeworICAgICAgICAgICAgdmFfbGlzdCBhcDsKKyAgICAgICAgICAgIGludCBwb2xsX21vZGU7CisKKyAgICAgICAgICAgIHZhX3N0YXJ0IChhcCwgY21kKTsKKyAgICAgICAgICAgIHBvbGxfbW9kZSA9IHZhX2FyZyAoYXAsIGludCk7CisgICAgICAgICAgICB2YV9lbmQgKGFwKTsKKworICAgICAgICAgICAgaWYgKHBvbGxfbW9kZSAmJiBvc3NfcG9sbF9pbiAoaHcpKSB7CisgICAgICAgICAgICAgICAgcG9sbF9tb2RlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh3LT5wb2xsX21vZGUgPSBwb2xsX21vZGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZPSUNFX0RJU0FCTEU6CisgICAgICAgIGlmIChody0+cG9sbF9tb2RlKSB7CisgICAgICAgICAgICBody0+cG9sbF9tb2RlID0gMDsKKyAgICAgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIgKG9zcy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKm9zc19hdWRpb19pbml0ICh2b2lkKQoreworICAgIHJldHVybiAmY29uZjsKK30KKworc3RhdGljIHZvaWQgb3NzX2F1ZGlvX2ZpbmkgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICAodm9pZCkgb3BhcXVlOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX29wdGlvbiBvc3Nfb3B0aW9uc1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgID0gIkZSQUdTSVpFIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZjb25mLmZyYWdzaXplLAorICAgICAgICAuZGVzY3IgPSAiRnJhZ21lbnQgc2l6ZSBpbiBieXRlcyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIk5GUkFHUyIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfSU5ULAorICAgICAgICAudmFscCAgPSAmY29uZi5uZnJhZ3MsCisgICAgICAgIC5kZXNjciA9ICJOdW1iZXIgb2YgZnJhZ21lbnRzIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiTU1BUCIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfQk9PTCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYudHJ5X21tYXAsCisgICAgICAgIC5kZXNjciA9ICJUcnkgdXNpbmcgbWVtb3J5IG1hcHBlZCBhY2Nlc3MiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJEQUNfREVWIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9TVFIsCisgICAgICAgIC52YWxwICA9ICZjb25mLmRldnBhdGhfb3V0LAorICAgICAgICAuZGVzY3IgPSAiUGF0aCB0byBEQUMgZGV2aWNlIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiQURDX0RFViIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfU1RSLAorICAgICAgICAudmFscCAgPSAmY29uZi5kZXZwYXRoX2luLAorICAgICAgICAuZGVzY3IgPSAiUGF0aCB0byBBREMgZGV2aWNlIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgPSAiRVhDTFVTSVZFIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9CT09MLAorICAgICAgICAudmFscCAgPSAmY29uZi5leGNsdXNpdmUsCisgICAgICAgIC5kZXNjciA9ICJPcGVuIGRldmljZSBpbiBleGNsdXNpdmUgbW9kZSAodm1peCB3b250IHdvcmspIgorICAgIH0sCisjaWZkZWYgVVNFX0RTUF9QT0xJQ1kKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJQT0xJQ1kiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0lOVCwKKyAgICAgICAgLnZhbHAgID0gJmNvbmYucG9saWN5LAorICAgICAgICAuZGVzY3IgPSAiU2V0IHRoZSB0aW1pbmcgcG9saWN5IG9mIHRoZSBkZXZpY2UsIC0xIHRvIHVzZSBmcmFnbWVudCBtb2RlIiwKKyAgICB9LAorI2VuZGlmCisgICAgeworICAgICAgICAubmFtZSAgPSAiREVCVUciLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX0JPT0wsCisgICAgICAgIC52YWxwICA9ICZjb25mLmRlYnVnLAorICAgICAgICAuZGVzY3IgPSAiVHVybiBvbiBzb21lIGRlYnVnZ2luZyBtZXNzYWdlcyIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wY21fb3BzIG9zc19wY21fb3BzID0geworICAgIC5pbml0X291dCA9IG9zc19pbml0X291dCwKKyAgICAuZmluaV9vdXQgPSBvc3NfZmluaV9vdXQsCisgICAgLnJ1bl9vdXQgID0gb3NzX3J1bl9vdXQsCisgICAgLndyaXRlICAgID0gb3NzX3dyaXRlLAorICAgIC5jdGxfb3V0ICA9IG9zc19jdGxfb3V0LAorCisgICAgLmluaXRfaW4gID0gb3NzX2luaXRfaW4sCisgICAgLmZpbmlfaW4gID0gb3NzX2ZpbmlfaW4sCisgICAgLnJ1bl9pbiAgID0gb3NzX3J1bl9pbiwKKyAgICAucmVhZCAgICAgPSBvc3NfcmVhZCwKKyAgICAuY3RsX2luICAgPSBvc3NfY3RsX2luCit9OworCitzdHJ1Y3QgYXVkaW9fZHJpdmVyIG9zc19hdWRpb19kcml2ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm9zcyIsCisgICAgLmRlc2NyICAgICAgICAgID0gIk9TUyBodHRwOi8vd3d3Lm9wZW5zb3VuZC5jb20iLAorICAgIC5vcHRpb25zICAgICAgICA9IG9zc19vcHRpb25zLAorICAgIC5pbml0ICAgICAgICAgICA9IG9zc19hdWRpb19pbml0LAorICAgIC5maW5pICAgICAgICAgICA9IG9zc19hdWRpb19maW5pLAorICAgIC5wY21fb3BzICAgICAgICA9ICZvc3NfcGNtX29wcywKKyAgICAuY2FuX2JlX2RlZmF1bHQgPSAxLAorICAgIC5tYXhfdm9pY2VzX291dCA9IElOVF9NQVgsCisgICAgLm1heF92b2ljZXNfaW4gID0gSU5UX01BWCwKKyAgICAudm9pY2Vfc2l6ZV9vdXQgPSBzaXplb2YgKE9TU1ZvaWNlT3V0KSwKKyAgICAudm9pY2Vfc2l6ZV9pbiAgPSBzaXplb2YgKE9TU1ZvaWNlSW4pCit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby9wYWF1ZGlvLmMgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3BhYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI3YzRlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby9wYWF1ZGlvLmMKQEAgLTAsMCArMSw5NjMgQEAKKy8qIHB1YmxpYyBkb21haW4gKi8KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKworI2RlZmluZSBBVURJT19DQVAgInB1bHNlYXVkaW8iCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisjaW5jbHVkZSAiYXVkaW9fcHRfaW50LmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBIV1ZvaWNlT3V0IGh3OworICAgIGludCBkb25lOworICAgIGludCBsaXZlOworICAgIGludCBkZWNyOworICAgIGludCBycG9zOworICAgIHBhX3N0cmVhbSAqc3RyZWFtOworICAgIHZvaWQgKnBjbV9idWY7CisgICAgc3RydWN0IGF1ZGlvX3B0IHB0OworfSBQQVZvaWNlT3V0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSFdWb2ljZUluIGh3OworICAgIGludCBkb25lOworICAgIGludCBkZWFkOworICAgIGludCBpbmNyOworICAgIGludCB3cG9zOworICAgIHBhX3N0cmVhbSAqc3RyZWFtOworICAgIHZvaWQgKnBjbV9idWY7CisgICAgc3RydWN0IGF1ZGlvX3B0IHB0OworICAgIGNvbnN0IHZvaWQgKnJlYWRfZGF0YTsKKyAgICBzaXplX3QgcmVhZF9pbmRleCwgcmVhZF9sZW5ndGg7Cit9IFBBVm9pY2VJbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzYW1wbGVzOworICAgIGNoYXIgKnNlcnZlcjsKKyAgICBjaGFyICpzaW5rOworICAgIGNoYXIgKnNvdXJjZTsKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcCAqbWFpbmxvb3A7CisgICAgcGFfY29udGV4dCAqY29udGV4dDsKK30gcGFhdWRpbzsKKworc3RhdGljIHBhYXVkaW8gZ2xvYl9wYWF1ZGlvID0geworICAgIC5zYW1wbGVzID0gNDA5NiwKK307CisKK3N0YXRpYyB2b2lkIEdDQ19GTVRfQVRUUiAoMiwgMykgcXBhX2xvZ2VyciAoaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0IChhcCwgZm10KTsKKyAgICBBVURfdmxvZyAoQVVESU9fQ0FQLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQgKGFwKTsKKworICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIlJlYXNvbjogJXNcbiIsIHBhX3N0cmVycm9yIChlcnIpKTsKK30KKworI2lmbmRlZiBQQV9DT05URVhUX0lTX0dPT0QKK3N0YXRpYyBpbmxpbmUgaW50IFBBX0NPTlRFWFRfSVNfR09PRChwYV9jb250ZXh0X3N0YXRlX3QgeCkKK3sKKyAgICByZXR1cm4KKyAgICAgICAgeCA9PSBQQV9DT05URVhUX0NPTk5FQ1RJTkcgfHwKKyAgICAgICAgeCA9PSBQQV9DT05URVhUX0FVVEhPUklaSU5HIHx8CisgICAgICAgIHggPT0gUEFfQ09OVEVYVF9TRVRUSU5HX05BTUUgfHwKKyAgICAgICAgeCA9PSBQQV9DT05URVhUX1JFQURZOworfQorI2VuZGlmCisKKyNpZm5kZWYgUEFfU1RSRUFNX0lTX0dPT0QKK3N0YXRpYyBpbmxpbmUgaW50IFBBX1NUUkVBTV9JU19HT09EKHBhX3N0cmVhbV9zdGF0ZV90IHgpCit7CisgICAgcmV0dXJuCisgICAgICAgIHggPT0gUEFfU1RSRUFNX0NSRUFUSU5HIHx8CisgICAgICAgIHggPT0gUEFfU1RSRUFNX1JFQURZOworfQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfU1VDQ0VTU19HT1RPKGMsIHJlcnJvciwgZXhwcmVzc2lvbiwgbGFiZWwpICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShleHByZXNzaW9uKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChyZXJyb3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKihyZXJyb3IpID0gcGFfY29udGV4dF9lcnJubyAoKGMpLT5jb250ZXh0KTsgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIENIRUNLX0RFQURfR09UTyhjLCBzdHJlYW0sIHJlcnJvciwgbGFiZWwpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGMpLT5jb250ZXh0IHx8ICFQQV9DT05URVhUX0lTX0dPT0QgKHBhX2NvbnRleHRfZ2V0X3N0YXRlKChjKS0+Y29udGV4dCkpIHx8IFwKKyAgICAgICAgICAgICEoc3RyZWFtKSB8fCAhUEFfU1RSRUFNX0lTX0dPT0QgKHBhX3N0cmVhbV9nZXRfc3RhdGUgKChzdHJlYW0pKSkpIHsgXAorICAgICAgICAgICAgaWYgKCgoYyktPmNvbnRleHQgJiYgcGFfY29udGV4dF9nZXRfc3RhdGUgKChjKS0+Y29udGV4dCkgPT0gUEFfQ09OVEVYVF9GQUlMRUQpIHx8IFwKKyAgICAgICAgICAgICAgICAoKHN0cmVhbSkgJiYgcGFfc3RyZWFtX2dldF9zdGF0ZSAoKHN0cmVhbSkpID09IFBBX1NUUkVBTV9GQUlMRUQpKSB7IFwKKyAgICAgICAgICAgICAgICBpZiAocmVycm9yKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKihyZXJyb3IpID0gcGFfY29udGV4dF9lcnJubyAoKGMpLT5jb250ZXh0KTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAocmVycm9yKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKihyZXJyb3IpID0gUEFfRVJSX0JBRFNUQVRFOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gbGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworc3RhdGljIGludCBxcGFfc2ltcGxlX3JlYWQgKFBBVm9pY2VJbiAqcCwgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCwgaW50ICpyZXJyb3IpCit7CisgICAgcGFhdWRpbyAqZyA9ICZnbG9iX3BhYXVkaW87CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChnLT5tYWlubG9vcCk7CisKKyAgICBDSEVDS19ERUFEX0dPVE8gKGcsIHAtPnN0cmVhbSwgcmVycm9yLCB1bmxvY2tfYW5kX2ZhaWwpOworCisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgc2l6ZV90IGw7CisKKyAgICAgICAgd2hpbGUgKCFwLT5yZWFkX2RhdGEpIHsKKyAgICAgICAgICAgIGludCByOworCisgICAgICAgICAgICByID0gcGFfc3RyZWFtX3BlZWsgKHAtPnN0cmVhbSwgJnAtPnJlYWRfZGF0YSwgJnAtPnJlYWRfbGVuZ3RoKTsKKyAgICAgICAgICAgIENIRUNLX1NVQ0NFU1NfR09UTyAoZywgcmVycm9yLCByID09IDAsIHVubG9ja19hbmRfZmFpbCk7CisKKyAgICAgICAgICAgIGlmICghcC0+cmVhZF9kYXRhKSB7CisgICAgICAgICAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoZy0+bWFpbmxvb3ApOworICAgICAgICAgICAgICAgIENIRUNLX0RFQURfR09UTyAoZywgcC0+c3RyZWFtLCByZXJyb3IsIHVubG9ja19hbmRfZmFpbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHAtPnJlYWRfaW5kZXggPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbCA9IHAtPnJlYWRfbGVuZ3RoIDwgbGVuZ3RoID8gcC0+cmVhZF9sZW5ndGggOiBsZW5ndGg7CisgICAgICAgIG1lbWNweSAoZGF0YSwgKGNvbnN0IHVpbnQ4X3QgKikgcC0+cmVhZF9kYXRhK3AtPnJlYWRfaW5kZXgsIGwpOworCisgICAgICAgIGRhdGEgPSAodWludDhfdCAqKSBkYXRhICsgbDsKKyAgICAgICAgbGVuZ3RoIC09IGw7CisKKyAgICAgICAgcC0+cmVhZF9pbmRleCArPSBsOworICAgICAgICBwLT5yZWFkX2xlbmd0aCAtPSBsOworCisgICAgICAgIGlmICghcC0+cmVhZF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGludCByOworCisgICAgICAgICAgICByID0gcGFfc3RyZWFtX2Ryb3AgKHAtPnN0cmVhbSk7CisgICAgICAgICAgICBwLT5yZWFkX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgcC0+cmVhZF9sZW5ndGggPSAwOworICAgICAgICAgICAgcC0+cmVhZF9pbmRleCA9IDA7CisKKyAgICAgICAgICAgIENIRUNLX1NVQ0NFU1NfR09UTyAoZywgcmVycm9yLCByID09IDAsIHVubG9ja19hbmRfZmFpbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKGctPm1haW5sb29wKTsKKyAgICByZXR1cm4gMDsKKwordW5sb2NrX2FuZF9mYWlsOgorICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoZy0+bWFpbmxvb3ApOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBxcGFfc2ltcGxlX3dyaXRlIChQQVZvaWNlT3V0ICpwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoLCBpbnQgKnJlcnJvcikKK3sKKyAgICBwYWF1ZGlvICpnID0gJmdsb2JfcGFhdWRpbzsKKworICAgIHBhX3RocmVhZGVkX21haW5sb29wX2xvY2sgKGctPm1haW5sb29wKTsKKworICAgIENIRUNLX0RFQURfR09UTyAoZywgcC0+c3RyZWFtLCByZXJyb3IsIHVubG9ja19hbmRfZmFpbCk7CisKKyAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICBzaXplX3QgbDsKKyAgICAgICAgaW50IHI7CisKKyAgICAgICAgd2hpbGUgKCEobCA9IHBhX3N0cmVhbV93cml0YWJsZV9zaXplIChwLT5zdHJlYW0pKSkgeworICAgICAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCAoZy0+bWFpbmxvb3ApOworICAgICAgICAgICAgQ0hFQ0tfREVBRF9HT1RPIChnLCBwLT5zdHJlYW0sIHJlcnJvciwgdW5sb2NrX2FuZF9mYWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX1NVQ0NFU1NfR09UTyAoZywgcmVycm9yLCBsICE9IChzaXplX3QpIC0xLCB1bmxvY2tfYW5kX2ZhaWwpOworCisgICAgICAgIGlmIChsID4gbGVuZ3RoKSB7CisgICAgICAgICAgICBsID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgciA9IHBhX3N0cmVhbV93cml0ZSAocC0+c3RyZWFtLCBkYXRhLCBsLCBOVUxMLCAwTEwsIFBBX1NFRUtfUkVMQVRJVkUpOworICAgICAgICBDSEVDS19TVUNDRVNTX0dPVE8gKGcsIHJlcnJvciwgciA+PSAwLCB1bmxvY2tfYW5kX2ZhaWwpOworCisgICAgICAgIGRhdGEgPSAoY29uc3QgdWludDhfdCAqKSBkYXRhICsgbDsKKyAgICAgICAgbGVuZ3RoIC09IGw7CisgICAgfQorCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChnLT5tYWlubG9vcCk7CisgICAgcmV0dXJuIDA7CisKK3VubG9ja19hbmRfZmFpbDoKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKGctPm1haW5sb29wKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkICpxcGFfdGhyZWFkX291dCAodm9pZCAqYXJnKQoreworICAgIFBBVm9pY2VPdXQgKnBhID0gYXJnOworICAgIEhXVm9pY2VPdXQgKmh3ID0gJnBhLT5odzsKKworICAgIGlmIChhdWRpb19wdF9sb2NrICgmcGEtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBkZWNyLCB0b19taXgsIHJwb3M7CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKHBhLT5kb25lKSB7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGEtPmxpdmUgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdWRpb19wdF93YWl0ICgmcGEtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRlY3IgPSB0b19taXggPSBhdWRpb19NSU4gKHBhLT5saXZlLCBnbG9iX3BhYXVkaW8uc2FtcGxlcyA+PiAyKTsKKyAgICAgICAgcnBvcyA9IHBhLT5ycG9zOworCisgICAgICAgIGlmIChhdWRpb19wdF91bmxvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0b19taXgpIHsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgIGludCBjaHVuayA9IGF1ZGlvX01JTiAodG9fbWl4LCBody0+c2FtcGxlcyAtIHJwb3MpOworICAgICAgICAgICAgc3RydWN0IHN0X3NhbXBsZSAqc3JjID0gaHctPm1peF9idWYgKyBycG9zOworCisgICAgICAgICAgICBody0+Y2xpcCAocGEtPnBjbV9idWYsIHNyYywgY2h1bmspOworCisgICAgICAgICAgICBpZiAocXBhX3NpbXBsZV93cml0ZSAocGEsIHBhLT5wY21fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rIDw8IGh3LT5pbmZvLnNoaWZ0LCAmZXJyb3IpIDwgMCkgeworICAgICAgICAgICAgICAgIHFwYV9sb2dlcnIgKGVycm9yLCAicGFfc2ltcGxlX3dyaXRlIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJwb3MgPSAocnBvcyArIGNodW5rKSAlIGh3LT5zYW1wbGVzOworICAgICAgICAgICAgdG9fbWl4IC09IGNodW5rOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1ZGlvX3B0X2xvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBhLT5ycG9zID0gcnBvczsKKyAgICAgICAgcGEtPmxpdmUgLT0gZGVjcjsKKyAgICAgICAgcGEtPmRlY3IgKz0gZGVjcjsKKyAgICB9CisKKyBleGl0OgorICAgIGF1ZGlvX3B0X3VubG9jayAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcXBhX3J1bl9vdXQgKEhXVm9pY2VPdXQgKmh3LCBpbnQgbGl2ZSkKK3sKKyAgICBpbnQgZGVjcjsKKyAgICBQQVZvaWNlT3V0ICpwYSA9IChQQVZvaWNlT3V0ICopIGh3OworCisgICAgaWYgKGF1ZGlvX3B0X2xvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRlY3IgPSBhdWRpb19NSU4gKGxpdmUsIHBhLT5kZWNyKTsKKyAgICBwYS0+ZGVjciAtPSBkZWNyOworICAgIHBhLT5saXZlID0gbGl2ZSAtIGRlY3I7CisgICAgaHctPnJwb3MgPSBwYS0+cnBvczsKKyAgICBpZiAocGEtPmxpdmUgPiAwKSB7CisgICAgICAgIGF1ZGlvX3B0X3VubG9ja19hbmRfc2lnbmFsICgmcGEtPnB0LCBBVURJT19GVU5DKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGF1ZGlvX3B0X3VubG9jayAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgfQorICAgIHJldHVybiBkZWNyOworfQorCitzdGF0aWMgaW50IHFwYV93cml0ZSAoU1dWb2ljZU91dCAqc3csIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXVkaW9fcGNtX3N3X3dyaXRlIChzdywgYnVmLCBsZW4pOworfQorCisvKiBjYXB0dXJlICovCitzdGF0aWMgdm9pZCAqcXBhX3RocmVhZF9pbiAodm9pZCAqYXJnKQoreworICAgIFBBVm9pY2VJbiAqcGEgPSBhcmc7CisgICAgSFdWb2ljZUluICpodyA9ICZwYS0+aHc7CisKKyAgICBpZiAoYXVkaW9fcHRfbG9jayAoJnBhLT5wdCwgQVVESU9fRlVOQykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgaW5jciwgdG9fZ3JhYiwgd3BvczsKKworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAocGEtPmRvbmUpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYS0+ZGVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF1ZGlvX3B0X3dhaXQgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5jciA9IHRvX2dyYWIgPSBhdWRpb19NSU4gKHBhLT5kZWFkLCBnbG9iX3BhYXVkaW8uc2FtcGxlcyA+PiAyKTsKKyAgICAgICAgd3BvcyA9IHBhLT53cG9zOworCisgICAgICAgIGlmIChhdWRpb19wdF91bmxvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0b19ncmFiKSB7CisgICAgICAgICAgICBpbnQgZXJyb3I7CisgICAgICAgICAgICBpbnQgY2h1bmsgPSBhdWRpb19NSU4gKHRvX2dyYWIsIGh3LT5zYW1wbGVzIC0gd3Bvcyk7CisgICAgICAgICAgICB2b2lkICpidWYgPSBhZHZhbmNlIChwYS0+cGNtX2J1Ziwgd3Bvcyk7CisKKyAgICAgICAgICAgIGlmIChxcGFfc2ltcGxlX3JlYWQgKHBhLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuayA8PCBody0+aW5mby5zaGlmdCwgJmVycm9yKSA8IDApIHsKKyAgICAgICAgICAgICAgICBxcGFfbG9nZXJyIChlcnJvciwgInBhX3NpbXBsZV9yZWFkIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh3LT5jb252IChody0+Y29udl9idWYgKyB3cG9zLCBidWYsIGNodW5rLCAmbm9taW5hbF92b2x1bWUpOworICAgICAgICAgICAgd3BvcyA9ICh3cG9zICsgY2h1bmspICUgaHctPnNhbXBsZXM7CisgICAgICAgICAgICB0b19ncmFiIC09IGNodW5rOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF1ZGlvX3B0X2xvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHBhLT53cG9zID0gd3BvczsKKyAgICAgICAgcGEtPmRlYWQgLT0gaW5jcjsKKyAgICAgICAgcGEtPmluY3IgKz0gaW5jcjsKKyAgICB9CisKKyBleGl0OgorICAgIGF1ZGlvX3B0X3VubG9jayAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcXBhX3J1bl9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICBpbnQgbGl2ZSwgaW5jciwgZGVhZDsKKyAgICBQQVZvaWNlSW4gKnBhID0gKFBBVm9pY2VJbiAqKSBodzsKKworICAgIGlmIChhdWRpb19wdF9sb2NrICgmcGEtPnB0LCBBVURJT19GVU5DKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsaXZlID0gYXVkaW9fcGNtX2h3X2dldF9saXZlX2luIChodyk7CisgICAgZGVhZCA9IGh3LT5zYW1wbGVzIC0gbGl2ZTsKKyAgICBpbmNyID0gYXVkaW9fTUlOIChkZWFkLCBwYS0+aW5jcik7CisgICAgcGEtPmluY3IgLT0gaW5jcjsKKyAgICBwYS0+ZGVhZCA9IGRlYWQgLSBpbmNyOworICAgIGh3LT53cG9zID0gcGEtPndwb3M7CisgICAgaWYgKHBhLT5kZWFkID4gMCkgeworICAgICAgICBhdWRpb19wdF91bmxvY2tfYW5kX3NpZ25hbCAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhdWRpb19wdF91bmxvY2sgKCZwYS0+cHQsIEFVRElPX0ZVTkMpOworICAgIH0KKyAgICByZXR1cm4gaW5jcjsKK30KKworc3RhdGljIGludCBxcGFfcmVhZCAoU1dWb2ljZUluICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfcmVhZCAoc3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHBhX3NhbXBsZV9mb3JtYXRfdCBhdWRmbXRfdG9fcGEgKGF1ZGZtdF9lIGFmbXQsIGludCBlbmRpYW5uZXNzKQoreworICAgIGludCBmb3JtYXQ7CisKKyAgICBzd2l0Y2ggKGFmbXQpIHsKKyAgICBjYXNlIEFVRF9GTVRfUzg6CisgICAgY2FzZSBBVURfRk1UX1U4OgorICAgICAgICBmb3JtYXQgPSBQQV9TQU1QTEVfVTg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVEX0ZNVF9TMTY6CisgICAgY2FzZSBBVURfRk1UX1UxNjoKKyAgICAgICAgZm9ybWF0ID0gZW5kaWFubmVzcyA/IFBBX1NBTVBMRV9TMTZCRSA6IFBBX1NBTVBMRV9TMTZMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICBmb3JtYXQgPSBlbmRpYW5uZXNzID8gUEFfU0FNUExFX1MzMkJFIDogUEFfU0FNUExFX1MzMkxFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoIkludGVybmFsIGxvZ2ljIGVycm9yOiBCYWQgYXVkaW8gZm9ybWF0ICVkXG4iLCBhZm10KTsKKyAgICAgICAgZm9ybWF0ID0gUEFfU0FNUExFX1U4OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworc3RhdGljIGF1ZGZtdF9lIHBhX3RvX2F1ZGZtdCAocGFfc2FtcGxlX2Zvcm1hdF90IGZtdCwgaW50ICplbmRpYW5uZXNzKQoreworICAgIHN3aXRjaCAoZm10KSB7CisgICAgY2FzZSBQQV9TQU1QTEVfVTg6CisgICAgICAgIHJldHVybiBBVURfRk1UX1U4OworICAgIGNhc2UgUEFfU0FNUExFX1MxNkJFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDE7CisgICAgICAgIHJldHVybiBBVURfRk1UX1MxNjsKKyAgICBjYXNlIFBBX1NBTVBMRV9TMTZMRToKKyAgICAgICAgKmVuZGlhbm5lc3MgPSAwOworICAgICAgICByZXR1cm4gQVVEX0ZNVF9TMTY7CisgICAgY2FzZSBQQV9TQU1QTEVfUzMyQkU6CisgICAgICAgICplbmRpYW5uZXNzID0gMTsKKyAgICAgICAgcmV0dXJuIEFVRF9GTVRfUzMyOworICAgIGNhc2UgUEFfU0FNUExFX1MzMkxFOgorICAgICAgICAqZW5kaWFubmVzcyA9IDA7CisgICAgICAgIHJldHVybiBBVURfRk1UX1MzMjsKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoIkludGVybmFsIGxvZ2ljIGVycm9yOiBCYWQgcGFfc2FtcGxlX2Zvcm1hdCAlZFxuIiwgZm10KTsKKyAgICAgICAgcmV0dXJuIEFVRF9GTVRfVTg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb250ZXh0X3N0YXRlX2NiIChwYV9jb250ZXh0ICpjLCB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBwYWF1ZGlvICpnID0gJmdsb2JfcGFhdWRpbzsKKworICAgIHN3aXRjaCAocGFfY29udGV4dF9nZXRfc3RhdGUoYykpIHsKKyAgICBjYXNlIFBBX0NPTlRFWFRfUkVBRFk6CisgICAgY2FzZSBQQV9DT05URVhUX1RFUk1JTkFURUQ6CisgICAgY2FzZSBQQV9DT05URVhUX0ZBSUxFRDoKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChnLT5tYWlubG9vcCwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9DT05URVhUX1VOQ09OTkVDVEVEOgorICAgIGNhc2UgUEFfQ09OVEVYVF9DT05ORUNUSU5HOgorICAgIGNhc2UgUEFfQ09OVEVYVF9BVVRIT1JJWklORzoKKyAgICBjYXNlIFBBX0NPTlRFWFRfU0VUVElOR19OQU1FOgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN0cmVhbV9zdGF0ZV9jYiAocGFfc3RyZWFtICpzLCB2b2lkICogdXNlcmRhdGEpCit7CisgICAgcGFhdWRpbyAqZyA9ICZnbG9iX3BhYXVkaW87CisKKyAgICBzd2l0Y2ggKHBhX3N0cmVhbV9nZXRfc3RhdGUgKHMpKSB7CisKKyAgICBjYXNlIFBBX1NUUkVBTV9SRUFEWToKKyAgICBjYXNlIFBBX1NUUkVBTV9GQUlMRUQ6CisgICAgY2FzZSBQQV9TVFJFQU1fVEVSTUlOQVRFRDoKKyAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsIChnLT5tYWlubG9vcCwgMCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQQV9TVFJFQU1fVU5DT05ORUNURUQ6CisgICAgY2FzZSBQQV9TVFJFQU1fQ1JFQVRJTkc6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3RyZWFtX3JlcXVlc3RfY2IgKHBhX3N0cmVhbSAqcywgc2l6ZV90IGxlbmd0aCwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgcGFhdWRpbyAqZyA9ICZnbG9iX3BhYXVkaW87CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwgKGctPm1haW5sb29wLCAwKTsKK30KKworc3RhdGljIHBhX3N0cmVhbSAqcXBhX3NpbXBsZV9uZXcgKAorICAgICAgICBjb25zdCBjaGFyICpzZXJ2ZXIsCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIHBhX3N0cmVhbV9kaXJlY3Rpb25fdCBkaXIsCisgICAgICAgIGNvbnN0IGNoYXIgKmRldiwKKyAgICAgICAgY29uc3QgY2hhciAqc3RyZWFtX25hbWUsCisgICAgICAgIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcywKKyAgICAgICAgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCwKKyAgICAgICAgY29uc3QgcGFfYnVmZmVyX2F0dHIgKmF0dHIsCisgICAgICAgIGludCAqcmVycm9yKQoreworICAgIHBhYXVkaW8gKmcgPSAmZ2xvYl9wYWF1ZGlvOworICAgIGludCByOworICAgIHBhX3N0cmVhbSAqc3RyZWFtOworCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAoZy0+bWFpbmxvb3ApOworCisgICAgc3RyZWFtID0gcGFfc3RyZWFtX25ldyAoZy0+Y29udGV4dCwgbmFtZSwgc3MsIG1hcCk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgKHN0cmVhbSwgc3RyZWFtX3N0YXRlX2NiLCBnKTsKKyAgICBwYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2sgKHN0cmVhbSwgc3RyZWFtX3JlcXVlc3RfY2IsIGcpOworICAgIHBhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2sgKHN0cmVhbSwgc3RyZWFtX3JlcXVlc3RfY2IsIGcpOworCisgICAgaWYgKGRpciA9PSBQQV9TVFJFQU1fUExBWUJBQ0spIHsKKyAgICAgICAgciA9IHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrIChzdHJlYW0sIGRldiwgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HCisjaWZkZWYgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFBBX1NUUkVBTV9BREpVU1RfTEFURU5DWQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFBBX1NUUkVBTV9BVVRPX1RJTUlOR19VUERBVEUsIE5VTEwsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHIgPSBwYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQgKHN0cmVhbSwgZGV2LCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9TVFJFQU1fSU5URVJQT0xBVEVfVElNSU5HCisjaWZkZWYgUEFfU1RSRUFNX0FESlVTVF9MQVRFTkNZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxQQV9TVFJFQU1fQURKVVNUX0xBVEVOQ1kKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8UEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSk7CisgICAgfQorCisgICAgaWYgKHIgPCAwKSB7CisgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChnLT5tYWlubG9vcCk7CisKKyAgICByZXR1cm4gc3RyZWFtOworCitmYWlsOgorICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoZy0+bWFpbmxvb3ApOworCisgICAgaWYgKHN0cmVhbSkgeworICAgICAgICBwYV9zdHJlYW1fdW5yZWYgKHN0cmVhbSk7CisgICAgfQorCisgICAgKnJlcnJvciA9IHBhX2NvbnRleHRfZXJybm8gKGctPmNvbnRleHQpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcXBhX2luaXRfb3V0IChIV1ZvaWNlT3V0ICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBpbnQgZXJyb3I7CisgICAgc3RhdGljIHBhX3NhbXBsZV9zcGVjIHNzOworICAgIHN0YXRpYyBwYV9idWZmZXJfYXR0ciBiYTsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3Mgb2J0X2FzID0gKmFzOworICAgIFBBVm9pY2VPdXQgKnBhID0gKFBBVm9pY2VPdXQgKikgaHc7CisKKyAgICBzcy5mb3JtYXQgPSBhdWRmbXRfdG9fcGEgKGFzLT5mbXQsIGFzLT5lbmRpYW5uZXNzKTsKKyAgICBzcy5jaGFubmVscyA9IGFzLT5uY2hhbm5lbHM7CisgICAgc3MucmF0ZSA9IGFzLT5mcmVxOworCisgICAgLyoKKyAgICAgKiBxZW11IGF1ZGlvIHRpY2sgcnVucyBhdCAxMDAgSHogKGJ5IGRlZmF1bHQpLCBzbyBwcm9jZXNzaW5nCisgICAgICogZGF0YSBjaHVua3Mgd29ydGggMTAgbXMgb2Ygc291bmQgc2hvdWxkIGJlIGEgZ29vZCBmaXQuCisgICAgICovCisgICAgYmEudGxlbmd0aCA9IHBhX3VzZWNfdG9fYnl0ZXMgKDEwICogMTAwMCwgJnNzKTsKKyAgICBiYS5taW5yZXEgPSBwYV91c2VjX3RvX2J5dGVzICg1ICogMTAwMCwgJnNzKTsKKyAgICBiYS5tYXhsZW5ndGggPSAtMTsKKyAgICBiYS5wcmVidWYgPSAtMTsKKworICAgIG9idF9hcy5mbXQgPSBwYV90b19hdWRmbXQgKHNzLmZvcm1hdCwgJm9idF9hcy5lbmRpYW5uZXNzKTsKKworICAgIHBhLT5zdHJlYW0gPSBxcGFfc2ltcGxlX25ldyAoCisgICAgICAgIGdsb2JfcGFhdWRpby5zZXJ2ZXIsCisgICAgICAgICJxZW11IiwKKyAgICAgICAgUEFfU1RSRUFNX1BMQVlCQUNLLAorICAgICAgICBnbG9iX3BhYXVkaW8uc2luaywKKyAgICAgICAgInBjbS5wbGF5YmFjayIsCisgICAgICAgICZzcywKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogY2hhbm5lbCBtYXAgKi8KKyAgICAgICAgJmJhLCAgICAgICAgICAgICAgICAgICAgLyogYnVmZmVyaW5nIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgJmVycm9yCisgICAgICAgICk7CisgICAgaWYgKCFwYS0+c3RyZWFtKSB7CisgICAgICAgIHFwYV9sb2dlcnIgKGVycm9yLCAicGFfc2ltcGxlX25ldyBmb3IgcGxheWJhY2sgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBmYWlsMTsKKyAgICB9CisKKyAgICBhdWRpb19wY21faW5pdF9pbmZvICgmaHctPmluZm8sICZvYnRfYXMpOworICAgIGh3LT5zYW1wbGVzID0gZ2xvYl9wYWF1ZGlvLnNhbXBsZXM7CisgICAgcGEtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICBwYS0+cnBvcyA9IGh3LT5ycG9zOworICAgIGlmICghcGEtPnBjbV9idWYpIHsKKyAgICAgICAgZG9sb2cgKCJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyICglZCBieXRlcylcbiIsCisgICAgICAgICAgICAgICBody0+c2FtcGxlcyA8PCBody0+aW5mby5zaGlmdCk7CisgICAgICAgIGdvdG8gZmFpbDI7CisgICAgfQorCisgICAgaWYgKGF1ZGlvX3B0X2luaXQgKCZwYS0+cHQsIHFwYV90aHJlYWRfb3V0LCBodywgQVVESU9fQ0FQLCBBVURJT19GVU5DKSkgeworICAgICAgICBnb3RvIGZhaWwzOworICAgIH0KKworICAgIHJldHVybiAwOworCisgZmFpbDM6CisgICAgZ19mcmVlIChwYS0+cGNtX2J1Zik7CisgICAgcGEtPnBjbV9idWYgPSBOVUxMOworIGZhaWwyOgorICAgIGlmIChwYS0+c3RyZWFtKSB7CisgICAgICAgIHBhX3N0cmVhbV91bnJlZiAocGEtPnN0cmVhbSk7CisgICAgICAgIHBhLT5zdHJlYW0gPSBOVUxMOworICAgIH0KKyBmYWlsMToKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcXBhX2luaXRfaW4gKEhXVm9pY2VJbiAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgaW50IGVycm9yOworICAgIHN0YXRpYyBwYV9zYW1wbGVfc3BlYyBzczsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3Mgb2J0X2FzID0gKmFzOworICAgIFBBVm9pY2VJbiAqcGEgPSAoUEFWb2ljZUluICopIGh3OworCisgICAgc3MuZm9ybWF0ID0gYXVkZm10X3RvX3BhIChhcy0+Zm10LCBhcy0+ZW5kaWFubmVzcyk7CisgICAgc3MuY2hhbm5lbHMgPSBhcy0+bmNoYW5uZWxzOworICAgIHNzLnJhdGUgPSBhcy0+ZnJlcTsKKworICAgIG9idF9hcy5mbXQgPSBwYV90b19hdWRmbXQgKHNzLmZvcm1hdCwgJm9idF9hcy5lbmRpYW5uZXNzKTsKKworICAgIHBhLT5zdHJlYW0gPSBxcGFfc2ltcGxlX25ldyAoCisgICAgICAgIGdsb2JfcGFhdWRpby5zZXJ2ZXIsCisgICAgICAgICJxZW11IiwKKyAgICAgICAgUEFfU1RSRUFNX1JFQ09SRCwKKyAgICAgICAgZ2xvYl9wYWF1ZGlvLnNvdXJjZSwKKyAgICAgICAgInBjbS5jYXB0dXJlIiwKKyAgICAgICAgJnNzLAorICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIG1hcCAqLworICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBidWZmZXJpbmcgYXR0cmlidXRlcyAqLworICAgICAgICAmZXJyb3IKKyAgICAgICAgKTsKKyAgICBpZiAoIXBhLT5zdHJlYW0pIHsKKyAgICAgICAgcXBhX2xvZ2VyciAoZXJyb3IsICJwYV9zaW1wbGVfbmV3IGZvciBjYXB0dXJlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZmFpbDE7CisgICAgfQorCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCAmb2J0X2FzKTsKKyAgICBody0+c2FtcGxlcyA9IGdsb2JfcGFhdWRpby5zYW1wbGVzOworICAgIHBhLT5wY21fYnVmID0gYXVkaW9fY2FsbG9jIChBVURJT19GVU5DLCBody0+c2FtcGxlcywgMSA8PCBody0+aW5mby5zaGlmdCk7CisgICAgcGEtPndwb3MgPSBody0+d3BvczsKKyAgICBpZiAoIXBhLT5wY21fYnVmKSB7CisgICAgICAgIGRvbG9nICgiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciAoJWQgYnl0ZXMpXG4iLAorICAgICAgICAgICAgICAgaHctPnNhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQpOworICAgICAgICBnb3RvIGZhaWwyOworICAgIH0KKworICAgIGlmIChhdWRpb19wdF9pbml0ICgmcGEtPnB0LCBxcGFfdGhyZWFkX2luLCBodywgQVVESU9fQ0FQLCBBVURJT19GVU5DKSkgeworICAgICAgICBnb3RvIGZhaWwzOworICAgIH0KKworICAgIHJldHVybiAwOworCisgZmFpbDM6CisgICAgZ19mcmVlIChwYS0+cGNtX2J1Zik7CisgICAgcGEtPnBjbV9idWYgPSBOVUxMOworIGZhaWwyOgorICAgIGlmIChwYS0+c3RyZWFtKSB7CisgICAgICAgIHBhX3N0cmVhbV91bnJlZiAocGEtPnN0cmVhbSk7CisgICAgICAgIHBhLT5zdHJlYW0gPSBOVUxMOworICAgIH0KKyBmYWlsMToKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHFwYV9maW5pX291dCAoSFdWb2ljZU91dCAqaHcpCit7CisgICAgdm9pZCAqcmV0OworICAgIFBBVm9pY2VPdXQgKnBhID0gKFBBVm9pY2VPdXQgKikgaHc7CisKKyAgICBhdWRpb19wdF9sb2NrICgmcGEtPnB0LCBBVURJT19GVU5DKTsKKyAgICBwYS0+ZG9uZSA9IDE7CisgICAgYXVkaW9fcHRfdW5sb2NrX2FuZF9zaWduYWwgKCZwYS0+cHQsIEFVRElPX0ZVTkMpOworICAgIGF1ZGlvX3B0X2pvaW4gKCZwYS0+cHQsICZyZXQsIEFVRElPX0ZVTkMpOworCisgICAgaWYgKHBhLT5zdHJlYW0pIHsKKyAgICAgICAgcGFfc3RyZWFtX3VucmVmIChwYS0+c3RyZWFtKTsKKyAgICAgICAgcGEtPnN0cmVhbSA9IE5VTEw7CisgICAgfQorCisgICAgYXVkaW9fcHRfZmluaSAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgZ19mcmVlIChwYS0+cGNtX2J1Zik7CisgICAgcGEtPnBjbV9idWYgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBxcGFfZmluaV9pbiAoSFdWb2ljZUluICpodykKK3sKKyAgICB2b2lkICpyZXQ7CisgICAgUEFWb2ljZUluICpwYSA9IChQQVZvaWNlSW4gKikgaHc7CisKKyAgICBhdWRpb19wdF9sb2NrICgmcGEtPnB0LCBBVURJT19GVU5DKTsKKyAgICBwYS0+ZG9uZSA9IDE7CisgICAgYXVkaW9fcHRfdW5sb2NrX2FuZF9zaWduYWwgKCZwYS0+cHQsIEFVRElPX0ZVTkMpOworICAgIGF1ZGlvX3B0X2pvaW4gKCZwYS0+cHQsICZyZXQsIEFVRElPX0ZVTkMpOworCisgICAgaWYgKHBhLT5zdHJlYW0pIHsKKyAgICAgICAgcGFfc3RyZWFtX3VucmVmIChwYS0+c3RyZWFtKTsKKyAgICAgICAgcGEtPnN0cmVhbSA9IE5VTEw7CisgICAgfQorCisgICAgYXVkaW9fcHRfZmluaSAoJnBhLT5wdCwgQVVESU9fRlVOQyk7CisgICAgZ19mcmVlIChwYS0+cGNtX2J1Zik7CisgICAgcGEtPnBjbV9idWYgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHFwYV9jdGxfb3V0IChIV1ZvaWNlT3V0ICpodywgaW50IGNtZCwgLi4uKQoreworICAgIFBBVm9pY2VPdXQgKnBhID0gKFBBVm9pY2VPdXQgKikgaHc7CisgICAgcGFfb3BlcmF0aW9uICpvcDsKKyAgICBwYV9jdm9sdW1lIHY7CisgICAgcGFhdWRpbyAqZyA9ICZnbG9iX3BhYXVkaW87CisKKyNpZmRlZiBQQV9DSEVDS19WRVJTSU9OICAgIC8qIG1hY3JvIGlzIHByZXNlbnQgaW4gMC45LjE2KyAqLworICAgIHBhX2N2b2x1bWVfaW5pdCAoJnYpOyAgLyogZnVuY3Rpb24gaXMgcHJlc2VudCBpbiAwLjkuMTMrICovCisjZW5kaWYKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBWT0lDRV9WT0xVTUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIFNXVm9pY2VPdXQgKnN3OworICAgICAgICAgICAgdmFfbGlzdCBhcDsKKworICAgICAgICAgICAgdmFfc3RhcnQgKGFwLCBjbWQpOworICAgICAgICAgICAgc3cgPSB2YV9hcmcgKGFwLCBTV1ZvaWNlT3V0ICopOworICAgICAgICAgICAgdmFfZW5kIChhcCk7CisKKyAgICAgICAgICAgIHYuY2hhbm5lbHMgPSAyOworICAgICAgICAgICAgdi52YWx1ZXNbMF0gPSAoKFBBX1ZPTFVNRV9OT1JNIC0gUEFfVk9MVU1FX01VVEVEKSAqIHN3LT52b2wubCkgLyBVSU5UMzJfTUFYOworICAgICAgICAgICAgdi52YWx1ZXNbMV0gPSAoKFBBX1ZPTFVNRV9OT1JNIC0gUEFfVk9MVU1FX01VVEVEKSAqIHN3LT52b2wucikgLyBVSU5UMzJfTUFYOworCisgICAgICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChnLT5tYWlubG9vcCk7CisKKyAgICAgICAgICAgIG9wID0gcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUgKGctPmNvbnRleHQsCisgICAgICAgICAgICAgICAgcGFfc3RyZWFtX2dldF9pbmRleCAocGEtPnN0cmVhbSksCisgICAgICAgICAgICAgICAgJnYsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvcCkKKyAgICAgICAgICAgICAgICBxcGFfbG9nZXJyIChwYV9jb250ZXh0X2Vycm5vIChnLT5jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0X3NpbmtfaW5wdXRfdm9sdW1lKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG9wKTsKKworICAgICAgICAgICAgb3AgPSBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X211dGUgKGctPmNvbnRleHQsCisgICAgICAgICAgICAgICAgcGFfc3RyZWFtX2dldF9pbmRleCAocGEtPnN0cmVhbSksCisgICAgICAgICAgICAgICBzdy0+dm9sLm11dGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvcCkgeworICAgICAgICAgICAgICAgIHFwYV9sb2dlcnIgKHBhX2NvbnRleHRfZXJybm8gKGctPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRfc2lua19pbnB1dF9tdXRlKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFfb3BlcmF0aW9uX3VucmVmIChvcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayAoZy0+bWFpbmxvb3ApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFwYV9jdGxfaW4gKEhXVm9pY2VJbiAqaHcsIGludCBjbWQsIC4uLikKK3sKKyAgICBQQVZvaWNlSW4gKnBhID0gKFBBVm9pY2VJbiAqKSBodzsKKyAgICBwYV9vcGVyYXRpb24gKm9wOworICAgIHBhX2N2b2x1bWUgdjsKKyAgICBwYWF1ZGlvICpnID0gJmdsb2JfcGFhdWRpbzsKKworI2lmZGVmIFBBX0NIRUNLX1ZFUlNJT04KKyAgICBwYV9jdm9sdW1lX2luaXQgKCZ2KTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChjbWQpIHsKKyAgICBjYXNlIFZPSUNFX1ZPTFVNRToKKyAgICAgICAgeworICAgICAgICAgICAgU1dWb2ljZUluICpzdzsKKyAgICAgICAgICAgIHZhX2xpc3QgYXA7CisKKyAgICAgICAgICAgIHZhX3N0YXJ0IChhcCwgY21kKTsKKyAgICAgICAgICAgIHN3ID0gdmFfYXJnIChhcCwgU1dWb2ljZUluICopOworICAgICAgICAgICAgdmFfZW5kIChhcCk7CisKKyAgICAgICAgICAgIHYuY2hhbm5lbHMgPSAyOworICAgICAgICAgICAgdi52YWx1ZXNbMF0gPSAoKFBBX1ZPTFVNRV9OT1JNIC0gUEFfVk9MVU1FX01VVEVEKSAqIHN3LT52b2wubCkgLyBVSU5UMzJfTUFYOworICAgICAgICAgICAgdi52YWx1ZXNbMV0gPSAoKFBBX1ZPTFVNRV9OT1JNIC0gUEFfVk9MVU1FX01VVEVEKSAqIHN3LT52b2wucikgLyBVSU5UMzJfTUFYOworCisgICAgICAgICAgICBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrIChnLT5tYWlubG9vcCk7CisKKyAgICAgICAgICAgIC8qIEZJWE1FOiB1c2UgdGhlIHVwY29taW5nICJzZXRfc291cmNlX291dHB1dF97dm9sdW1lLG11dGV9IiAqLworICAgICAgICAgICAgb3AgPSBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4IChnLT5jb250ZXh0LAorICAgICAgICAgICAgICAgIHBhX3N0cmVhbV9nZXRfZGV2aWNlX2luZGV4IChwYS0+c3RyZWFtKSwKKyAgICAgICAgICAgICAgICAmdiwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9wKSB7CisgICAgICAgICAgICAgICAgcXBhX2xvZ2VyciAocGFfY29udGV4dF9lcnJubyAoZy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldF9zb3VyY2Vfdm9sdW1lKCkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFfb3BlcmF0aW9uX3VucmVmKG9wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3AgPSBwYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9pbmRleCAoZy0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICBwYV9zdHJlYW1fZ2V0X2luZGV4IChwYS0+c3RyZWFtKSwKKyAgICAgICAgICAgICAgICBzdy0+dm9sLm11dGUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvcCkgeworICAgICAgICAgICAgICAgIHFwYV9sb2dlcnIgKHBhX2NvbnRleHRfZXJybm8gKGctPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRfc291cmNlX211dGUoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYV9vcGVyYXRpb25fdW5yZWYgKG9wKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChnLT5tYWlubG9vcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgcHVsc2VfYXVkaW9fZHlubGlua19pbml0KHZvaWQqIGxpYik7CisKKy8qIGNvbW1vbiAqLworc3RhdGljIHZvaWQgKnFwYV9hdWRpb19pbml0ICh2b2lkKQoreworICAgIHBhYXVkaW8gKmcgPSAmZ2xvYl9wYWF1ZGlvOworCisjaWYgMSAgLy8gQ09ORklHX0FORFJPSUQKKyAgICB2b2lkKiBwYV9saWIgPSBkbG9wZW4oImxpYnB1bHNlLnNvIiwgUlRMRF9OT1cpOworICAgIGlmICghcGFfbGliKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE9uIHNvbWUgTGludXggc3lzdGVtcyAoZS5nLiB2YW5pbGxhIFVidW50dSAxNC4wNCksIHRoZXJlIGlzIG5vCisgICAgICAgICAqIGxpYnB1bHNlLnNvLCBidXQgb25seSBsaWJwdWxzZS5zby4wIHdoaWNoIGFsc28gd29ya3MuCisgICAgICAgICAqLworICAgICAgICBwYV9saWIgPSBkbG9wZW4oImxpYnB1bHNlLnNvLjAiLCBSVExEX05PVyk7CisgICAgfQorICAgIGlmICghcGFfbGliKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHB1bHNlX2F1ZGlvX2R5bmxpbmtfaW5pdChwYV9saWIpIDwgMCkgeworICAgICAgICBkbGNsb3NlKHBhX2xpYik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisjZW5kaWYgIC8vIENPTkZJR19BTkRST0lECisKKyAgICBnLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldyAoKTsKKyAgICBpZiAoIWctPm1haW5sb29wKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBnLT5jb250ZXh0ID0gcGFfY29udGV4dF9uZXcgKHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkgKGctPm1haW5sb29wKSwgZ2xvYl9wYWF1ZGlvLnNlcnZlcik7CisgICAgaWYgKCFnLT5jb250ZXh0KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayAoZy0+Y29udGV4dCwgY29udGV4dF9zdGF0ZV9jYiwgZyk7CisKKyAgICBpZiAocGFfY29udGV4dF9jb25uZWN0IChnLT5jb250ZXh0LCBnbG9iX3BhYXVkaW8uc2VydmVyLCAwLCBOVUxMKSA8IDApIHsKKyAgICAgICAgcXBhX2xvZ2VyciAocGFfY29udGV4dF9lcnJubyAoZy0+Y29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICJwYV9jb250ZXh0X2Nvbm5lY3QoKSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayAoZy0+bWFpbmxvb3ApOworCisgICAgaWYgKHBhX3RocmVhZGVkX21haW5sb29wX3N0YXJ0IChnLT5tYWlubG9vcCkgPCAwKSB7CisgICAgICAgIGdvdG8gdW5sb2NrX2FuZF9mYWlsOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcGFfY29udGV4dF9zdGF0ZV90IHN0YXRlOworCisgICAgICAgIHN0YXRlID0gcGFfY29udGV4dF9nZXRfc3RhdGUgKGctPmNvbnRleHQpOworCisgICAgICAgIGlmIChzdGF0ZSA9PSBQQV9DT05URVhUX1JFQURZKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghUEFfQ09OVEVYVF9JU19HT09EIChzdGF0ZSkpIHsKKyAgICAgICAgICAgIHFwYV9sb2dlcnIgKHBhX2NvbnRleHRfZXJybm8gKGctPmNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIldyb25nIGNvbnRleHQgc3RhdGVcbiIpOworICAgICAgICAgICAgZ290byB1bmxvY2tfYW5kX2ZhaWw7CisgICAgICAgIH0KKworICAgICAgICAvKiBXYWl0IHVudGlsIHRoZSBjb250ZXh0IGlzIHJlYWR5ICovCisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQgKGctPm1haW5sb29wKTsKKyAgICB9CisKKyAgICBwYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgKGctPm1haW5sb29wKTsKKworICAgIHJldHVybiAmZ2xvYl9wYWF1ZGlvOworCit1bmxvY2tfYW5kX2ZhaWw6CisgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrIChnLT5tYWlubG9vcCk7CitmYWlsOgorICAgIEFVRF9sb2cgKEFVRElPX0NBUCwgIkZhaWxlZCB0byBpbml0aWFsaXplIFBBIGNvbnRleHQiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcXBhX2F1ZGlvX2ZpbmkgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBwYWF1ZGlvICpnID0gb3BhcXVlOworCisgICAgaWYgKGctPm1haW5sb29wKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX3N0b3AgKGctPm1haW5sb29wKTsKKyAgICB9CisKKyAgICBpZiAoZy0+Y29udGV4dCkgeworICAgICAgICBwYV9jb250ZXh0X2Rpc2Nvbm5lY3QgKGctPmNvbnRleHQpOworICAgICAgICBwYV9jb250ZXh0X3VucmVmIChnLT5jb250ZXh0KTsKKyAgICAgICAgZy0+Y29udGV4dCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGctPm1haW5sb29wKSB7CisgICAgICAgIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUgKGctPm1haW5sb29wKTsKKyAgICB9CisKKyAgICBnLT5tYWlubG9vcCA9IE5VTEw7Cit9CisKK3N0cnVjdCBhdWRpb19vcHRpb24gcXBhX29wdGlvbnNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJTQU1QTEVTIiwKKyAgICAgICAgLnRhZyAgID0gQVVEX09QVF9JTlQsCisgICAgICAgIC52YWxwICA9ICZnbG9iX3BhYXVkaW8uc2FtcGxlcywKKyAgICAgICAgLmRlc2NyID0gImJ1ZmZlciBzaXplIGluIHNhbXBsZXMiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICA9ICJTRVJWRVIiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX1NUUiwKKyAgICAgICAgLnZhbHAgID0gJmdsb2JfcGFhdWRpby5zZXJ2ZXIsCisgICAgICAgIC5kZXNjciA9ICJzZXJ2ZXIgYWRkcmVzcyIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIlNJTksiLAorICAgICAgICAudGFnICAgPSBBVURfT1BUX1NUUiwKKyAgICAgICAgLnZhbHAgID0gJmdsb2JfcGFhdWRpby5zaW5rLAorICAgICAgICAuZGVzY3IgPSAic2luayBkZXZpY2UgbmFtZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgID0gIlNPVVJDRSIsCisgICAgICAgIC50YWcgICA9IEFVRF9PUFRfU1RSLAorICAgICAgICAudmFscCAgPSAmZ2xvYl9wYWF1ZGlvLnNvdXJjZSwKKyAgICAgICAgLmRlc2NyID0gInNvdXJjZSBkZXZpY2UgbmFtZSIKKyAgICB9LAorICAgIHsgLyogRW5kIG9mIGxpc3QgKi8gfQorfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19wY21fb3BzIHFwYV9wY21fb3BzID0geworICAgIC5pbml0X291dCA9IHFwYV9pbml0X291dCwKKyAgICAuZmluaV9vdXQgPSBxcGFfZmluaV9vdXQsCisgICAgLnJ1bl9vdXQgID0gcXBhX3J1bl9vdXQsCisgICAgLndyaXRlICAgID0gcXBhX3dyaXRlLAorICAgIC5jdGxfb3V0ICA9IHFwYV9jdGxfb3V0LAorCisgICAgLmluaXRfaW4gID0gcXBhX2luaXRfaW4sCisgICAgLmZpbmlfaW4gID0gcXBhX2ZpbmlfaW4sCisgICAgLnJ1bl9pbiAgID0gcXBhX3J1bl9pbiwKKyAgICAucmVhZCAgICAgPSBxcGFfcmVhZCwKKyAgICAuY3RsX2luICAgPSBxcGFfY3RsX2luCit9OworCitzdHJ1Y3QgYXVkaW9fZHJpdmVyIHBhX2F1ZGlvX2RyaXZlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAicGEiLAorICAgIC5kZXNjciAgICAgICAgICA9ICJodHRwOi8vd3d3LnB1bHNlYXVkaW8ub3JnLyIsCisgICAgLm9wdGlvbnMgICAgICAgID0gcXBhX29wdGlvbnMsCisgICAgLmluaXQgICAgICAgICAgID0gcXBhX2F1ZGlvX2luaXQsCisgICAgLmZpbmkgICAgICAgICAgID0gcXBhX2F1ZGlvX2ZpbmksCisgICAgLnBjbV9vcHMgICAgICAgID0gJnFwYV9wY21fb3BzLAorICAgIC5jYW5fYmVfZGVmYXVsdCA9IDEsCisgICAgLm1heF92b2ljZXNfb3V0ID0gSU5UX01BWCwKKyAgICAubWF4X3ZvaWNlc19pbiAgPSBJTlRfTUFYLAorICAgIC52b2ljZV9zaXplX291dCA9IHNpemVvZiAoUEFWb2ljZU91dCksCisgICAgLnZvaWNlX3NpemVfaW4gID0gc2l6ZW9mIChQQVZvaWNlSW4pLAorLy8gICAgLmN0bF9jYXBzICAgICAgID0gVk9JQ0VfVk9MVU1FX0NBUAorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vcmF0ZV90ZW1wbGF0ZS5oIGIvYW5kcm9pZC9xZW11MS9hdWRpby9yYXRlX3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YjFjNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vcmF0ZV90ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogUUVNVSBNaXhpbmcgZW5naW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgVmFzc2lsaSBLYXJwb3YgKG1hbGMpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKy8qCisgKiBQcm9jZXNzZWQgc2lnbmVkIGxvbmcgc2FtcGxlcyBmcm9tIGlidWYgdG8gb2J1Zi4KKyAqIFJldHVybiBudW1iZXIgb2Ygc2FtcGxlcyBwcm9jZXNzZWQuCisgKi8KK3ZvaWQgTkFNRSAodm9pZCAqb3BhcXVlLCBzdHJ1Y3Qgc3Rfc2FtcGxlICppYnVmLCBzdHJ1Y3Qgc3Rfc2FtcGxlICpvYnVmLAorICAgICAgICAgICBpbnQgKmlzYW1wLCBpbnQgKm9zYW1wKQoreworICAgIHN0cnVjdCByYXRlICpyYXRlID0gb3BhcXVlOworICAgIHN0cnVjdCBzdF9zYW1wbGUgKmlzdGFydCwgKmllbmQ7CisgICAgc3RydWN0IHN0X3NhbXBsZSAqb3N0YXJ0LCAqb2VuZDsKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlIGlsYXN0LCBpY3VyLCBvdXQ7CisjaWZkZWYgRkxPQVRfTUlYRU5HCisgICAgbWl4ZW5nX3JlYWwgdDsKKyNlbHNlCisgICAgaW50NjRfdCB0OworI2VuZGlmCisKKyAgICBpbGFzdCA9IHJhdGUtPmlsYXN0OworCisgICAgaXN0YXJ0ID0gaWJ1ZjsKKyAgICBpZW5kID0gaWJ1ZiArICppc2FtcDsKKworICAgIG9zdGFydCA9IG9idWY7CisgICAgb2VuZCA9IG9idWYgKyAqb3NhbXA7CisKKyAgICBpZiAocmF0ZS0+b3Bvc19pbmMgPT0gKDFVTEwgKyBVSU5UX01BWCkpIHsKKyAgICAgICAgaW50IGksIG4gPSAqaXNhbXAgPiAqb3NhbXAgPyAqb3NhbXAgOiAqaXNhbXA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIE9QIChvYnVmW2ldLmwsIGlidWZbaV0ubCk7CisgICAgICAgICAgICBPUCAob2J1ZltpXS5yLCBpYnVmW2ldLnIpOworICAgICAgICB9CisgICAgICAgICppc2FtcCA9IG47CisgICAgICAgICpvc2FtcCA9IG47CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAob2J1ZiA8IG9lbmQpIHsKKworICAgICAgICAvKiBTYWZldHkgY2F0Y2ggdG8gbWFrZSBzdXJlIHdlIGhhdmUgaW5wdXQgc2FtcGxlcy4gICovCisgICAgICAgIGlmIChpYnVmID49IGllbmQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhZCBhcyBtYW55IGlucHV0IHNhbXBsZXMgc28gdGhhdCBpcG9zID4gb3BvcyAqLworCisgICAgICAgIHdoaWxlIChyYXRlLT5pcG9zIDw9IChyYXRlLT5vcG9zID4+IDMyKSkgeworICAgICAgICAgICAgaWxhc3QgPSAqaWJ1ZisrOworICAgICAgICAgICAgcmF0ZS0+aXBvcysrOworICAgICAgICAgICAgLyogU2VlIGlmIHdlIGZpbmlzaGVkIHRoZSBpbnB1dCBidWZmZXIgeWV0ICovCisgICAgICAgICAgICBpZiAoaWJ1ZiA+PSBpZW5kKSB7CisgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWN1ciA9ICppYnVmOworCisgICAgICAgIC8qIGludGVycG9sYXRlICovCisjaWZkZWYgRkxPQVRfTUlYRU5HCisjaWZkZWYgUkVDSVBST0NBTAorICAgICAgICB0ID0gKHJhdGUtPm9wb3MgJiBVSU5UX01BWCkgKiAoMS5mIC8gVUlOVF9NQVgpOworI2Vsc2UKKyAgICAgICAgdCA9IChyYXRlLT5vcG9zICYgVUlOVF9NQVgpIC8gKG1peGVuZ19yZWFsKSBVSU5UX01BWDsKKyNlbmRpZgorICAgICAgICBvdXQubCA9IChpbGFzdC5sICogKDEuMCAtIHQpKSArIGljdXIubCAqIHQ7CisgICAgICAgIG91dC5yID0gKGlsYXN0LnIgKiAoMS4wIC0gdCkpICsgaWN1ci5yICogdDsKKyNlbHNlCisgICAgICAgIHQgPSByYXRlLT5vcG9zICYgMHhmZmZmZmZmZjsKKyAgICAgICAgb3V0LmwgPSAoaWxhc3QubCAqICgoaW50NjRfdCkgVUlOVF9NQVggLSB0KSArIGljdXIubCAqIHQpID4+IDMyOworICAgICAgICBvdXQuciA9IChpbGFzdC5yICogKChpbnQ2NF90KSBVSU5UX01BWCAtIHQpICsgaWN1ci5yICogdCkgPj4gMzI7CisjZW5kaWYKKworICAgICAgICAvKiBvdXRwdXQgc2FtcGxlICYgaW5jcmVtZW50IHBvc2l0aW9uICovCisgICAgICAgIE9QIChvYnVmLT5sLCBvdXQubCk7CisgICAgICAgIE9QIChvYnVmLT5yLCBvdXQucik7CisgICAgICAgIG9idWYgKz0gMTsKKyAgICAgICAgcmF0ZS0+b3BvcyArPSByYXRlLT5vcG9zX2luYzsKKyAgICB9CisKK3RoZV9lbmQ6CisgICAgKmlzYW1wID0gaWJ1ZiAtIGlzdGFydDsKKyAgICAqb3NhbXAgPSBvYnVmIC0gb3N0YXJ0OworICAgIHJhdGUtPmlsYXN0ID0gaWxhc3Q7Cit9CisKKyN1bmRlZiBOQU1FCisjdW5kZWYgT1AKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vd2F2YXVkaW8uYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd2F2YXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI1ZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby93YXZhdWRpby5jCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogUUVNVSBXQVYgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IFZhc3NpbGkgS2FycG92IChtYWxjKQorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgQVVESU9fQ0FQICJ3YXYiCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisKKyNkZWZpbmUgIFdBVl9BVURJT19JTiAgMQorCisvKiogVk9JQ0UgT1VUICAoU2F2aW5nIHRvIGEgLldBViBmaWxlKQorICoqLwordHlwZWRlZiBzdHJ1Y3QgV0FWVm9pY2VPdXQgeworICAgIEhXVm9pY2VPdXQgaHc7CisgICAgRklMRSAqZjsKKyAgICBpbnQ2NF90IG9sZF90aWNrczsKKyAgICB2b2lkICpwY21fYnVmOworICAgIGludCB0b3RhbF9zYW1wbGVzOworfSBXQVZWb2ljZU91dDsKKworc3RhdGljIHN0cnVjdCB7CisgICAgc3RydWN0IGF1ZHNldHRpbmdzIHNldHRpbmdzOworICAgIGNvbnN0IGNoYXIgKndhdl9wYXRoOworfSBjb25mX291dCA9IHsKKyAgICB7CisgICAgICAgIDQ0MTAwLAorICAgICAgICAyLAorICAgICAgICBBVURfRk1UX1MxNiwKKyAgICAgICAgMAorICAgIH0sCisgICAgInFlbXUud2F2IgorfTsKKworc3RhdGljIGludCB3YXZfb3V0X3J1biAoSFdWb2ljZU91dCAqaHcsIGludCBsaXZlKQoreworICAgIFdBVlZvaWNlT3V0ICp3YXYgPSAoV0FWVm9pY2VPdXQgKikgaHc7CisgICAgaW50IHJwb3MsIGRlY3IsIHNhbXBsZXM7CisgICAgdWludDhfdCAqZHN0OworICAgIHN0cnVjdCBzdF9zYW1wbGUgKnNyYzsKKyAgICBpbnQ2NF90IG5vdyA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgaW50NjRfdCB0aWNrcyA9IG5vdyAtIHdhdi0+b2xkX3RpY2tzOworICAgIGludDY0X3QgYnl0ZXMgPQorICAgICAgICBtdWxkaXY2NCAodGlja3MsIGh3LT5pbmZvLmJ5dGVzX3Blcl9zZWNvbmQsIGdldF90aWNrc19wZXJfc2VjICgpKTsKKworICAgIGlmIChieXRlcyA+IElOVF9NQVgpIHsKKyAgICAgICAgc2FtcGxlcyA9IElOVF9NQVggPj4gaHctPmluZm8uc2hpZnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzYW1wbGVzID0gYnl0ZXMgPj4gaHctPmluZm8uc2hpZnQ7CisgICAgfQorCisgICAgd2F2LT5vbGRfdGlja3MgPSBub3c7CisgICAgZGVjciA9IGF1ZGlvX01JTiAobGl2ZSwgc2FtcGxlcyk7CisgICAgc2FtcGxlcyA9IGRlY3I7CisgICAgcnBvcyA9IGh3LT5ycG9zOworICAgIHdoaWxlIChzYW1wbGVzKSB7CisgICAgICAgIGludCBsZWZ0X3RpbGxfZW5kX3NhbXBsZXMgPSBody0+c2FtcGxlcyAtIHJwb3M7CisgICAgICAgIGludCBjb252ZXJ0X3NhbXBsZXMgPSBhdWRpb19NSU4gKHNhbXBsZXMsIGxlZnRfdGlsbF9lbmRfc2FtcGxlcyk7CisKKyAgICAgICAgc3JjID0gaHctPm1peF9idWYgKyBycG9zOworICAgICAgICBkc3QgPSBhZHZhbmNlICh3YXYtPnBjbV9idWYsIHJwb3MgPDwgaHctPmluZm8uc2hpZnQpOworCisgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYywgY29udmVydF9zYW1wbGVzKTsKKyAgICAgICAgaWYgKGZ3cml0ZSAoZHN0LCBjb252ZXJ0X3NhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQsIDEsIHdhdi0+ZikgIT0gMSkgeworICAgICAgICAgICAgZG9sb2cgKCJ3YXZfcnVuX291dDogZndyaXRlIG9mICVkIGJ5dGVzIGZhaWxlZFxuUmVhb25zOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBjb252ZXJ0X3NhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQsIHN0cmVycm9yIChlcnJubykpOworICAgICAgICB9CisKKyAgICAgICAgcnBvcyA9IChycG9zICsgY29udmVydF9zYW1wbGVzKSAlIGh3LT5zYW1wbGVzOworICAgICAgICBzYW1wbGVzIC09IGNvbnZlcnRfc2FtcGxlczsKKyAgICAgICAgd2F2LT50b3RhbF9zYW1wbGVzICs9IGNvbnZlcnRfc2FtcGxlczsKKyAgICB9CisKKyAgICBody0+cnBvcyA9IHJwb3M7CisgICAgcmV0dXJuIGRlY3I7Cit9CisKK3N0YXRpYyBpbnQgd2F2X291dF93cml0ZSAoU1dWb2ljZU91dCAqc3csIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXVkaW9fcGNtX3N3X3dyaXRlIChzdywgYnVmLCBsZW4pOworfQorCisvKiBWSUNFIGNvZGU6IFN0b3JlIG51bWJlciBhcyBsaXR0bGUgZW5kaWFuLiAqLworc3RhdGljIHZvaWQgbGVfc3RvcmUgKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdmFsLCBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBidWZbaV0gPSAodWludDhfdCkgKHZhbCAmIDB4ZmYpOworICAgICAgICB2YWwgPj49IDg7CisgICAgfQorfQorCitzdGF0aWMgaW50IHdhdl9vdXRfaW5pdCAoSFdWb2ljZU91dCAqaHcsIHN0cnVjdCBhdWRzZXR0aW5ncyAqYXMpCit7CisgICAgV0FWVm9pY2VPdXQgKndhdiA9IChXQVZWb2ljZU91dCAqKSBodzsKKyAgICBpbnQgYml0czE2ID0gMCwgc3RlcmVvID0gMDsKKyAgICB1aW50OF90IGhkcltdID0geworICAgICAgICAweDUyLCAweDQ5LCAweDQ2LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDQxLCAweDU2LAorICAgICAgICAweDQ1LCAweDY2LCAweDZkLCAweDc0LCAweDIwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLAorICAgICAgICAweDAyLCAweDAwLCAweDQ0LCAweGFjLCAweDAwLCAweDAwLCAweDEwLCAweGIxLCAweDAyLCAweDAwLCAweDA0LAorICAgICAgICAweDAwLCAweDEwLCAweDAwLCAweDY0LCAweDYxLCAweDc0LCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgICAgfTsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3Mgd2F2X2FzID0gY29uZl9vdXQuc2V0dGluZ3M7CisKKyAgICAodm9pZCkgYXM7CisKKyAgICBzdGVyZW8gPSB3YXZfYXMubmNoYW5uZWxzID09IDI7CisgICAgc3dpdGNoICh3YXZfYXMuZm10KSB7CisgICAgY2FzZSBBVURfRk1UX1M4OgorICAgIGNhc2UgQVVEX0ZNVF9VODoKKyAgICAgICAgYml0czE2ID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9GTVRfUzE2OgorICAgIGNhc2UgQVVEX0ZNVF9VMTY6CisgICAgICAgIGJpdHMxNiA9IDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURfRk1UX1MzMjoKKyAgICBjYXNlIEFVRF9GTVRfVTMyOgorICAgICAgICBkb2xvZyAoIldBVkUgZmlsZXMgY2FuIG5vdCBoYW5kbGUgMzJiaXQgZm9ybWF0c1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBoZHJbMzRdID0gYml0czE2ID8gMHgxMCA6IDB4MDg7CisKKyAgICB3YXZfYXMuZW5kaWFubmVzcyA9IDA7CisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCAmd2F2X2FzKTsKKworICAgIGh3LT5zYW1wbGVzID0gMTAyNDsKKyAgICB3YXYtPnBjbV9idWYgPSBhdWRpb19jYWxsb2MgKEFVRElPX0ZVTkMsIGh3LT5zYW1wbGVzLCAxIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICBpZiAoIXdhdi0+cGNtX2J1ZikgeworICAgICAgICBkb2xvZyAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXIgKCVkIGJ5dGVzKVxuIiwKKyAgICAgICAgICAgICAgIGh3LT5zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxlX3N0b3JlIChoZHIgKyAyMiwgaHctPmluZm8ubmNoYW5uZWxzLCAyKTsKKyAgICBsZV9zdG9yZSAoaGRyICsgMjQsIGh3LT5pbmZvLmZyZXEsIDQpOworICAgIGxlX3N0b3JlIChoZHIgKyAyOCwgaHctPmluZm8uZnJlcSA8PCAoYml0czE2ICsgc3RlcmVvKSwgNCk7CisgICAgbGVfc3RvcmUgKGhkciArIDMyLCAxIDw8IChiaXRzMTYgKyBzdGVyZW8pLCAyKTsKKworICAgIHdhdi0+ZiA9IGZvcGVuIChjb25mX291dC53YXZfcGF0aCwgIndiIik7CisgICAgaWYgKCF3YXYtPmYpIHsKKyAgICAgICAgZG9sb2cgKCJGYWlsZWQgdG8gb3BlbiB3YXZlIGZpbGUgYCVzJ1xuUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGNvbmZfb3V0Lndhdl9wYXRoLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICAgICAgZ19mcmVlICh3YXYtPnBjbV9idWYpOworICAgICAgICB3YXYtPnBjbV9idWYgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZ3cml0ZSAoaGRyLCBzaXplb2YgKGhkciksIDEsIHdhdi0+ZikgIT0gMSkgeworICAgICAgICBkb2xvZyAoIndhdl9pbml0X291dDogZmFpbGVkIHRvIHdyaXRlIGhlYWRlclxuUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhdl9vdXRfZmluaSAoSFdWb2ljZU91dCAqaHcpCit7CisgICAgV0FWVm9pY2VPdXQgKndhdiA9IChXQVZWb2ljZU91dCAqKSBodzsKKyAgICB1aW50OF90IHJsZW5bNF07CisgICAgdWludDhfdCBkbGVuWzRdOworICAgIHVpbnQzMl90IGRhdGFsZW4gPSB3YXYtPnRvdGFsX3NhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQ7CisgICAgdWludDMyX3QgcmlmZmxlbiA9IGRhdGFsZW4gKyAzNjsKKworICAgIGlmICghd2F2LT5mKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZV9zdG9yZSAocmxlbiwgcmlmZmxlbiwgNCk7CisgICAgbGVfc3RvcmUgKGRsZW4sIGRhdGFsZW4sIDQpOworCisgICAgZnNlZWsgKHdhdi0+ZiwgNCwgU0VFS19TRVQpOworICAgIGZ3cml0ZShybGVuLCA0LCAxLCB3YXYtPmYpOworCisgICAgZnNlZWsgKHdhdi0+ZiwgMzIsIFNFRUtfQ1VSKTsKKyAgICBmd3JpdGUoZGxlbiwgNCwgMSwgd2F2LT5mKTsKKworICAgIGZjbG9zZSAod2F2LT5mKTsKKyAgICB3YXYtPmYgPSBOVUxMOworCisgICAgZ19mcmVlICh3YXYtPnBjbV9idWYpOworICAgIHdhdi0+cGNtX2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd2F2X291dF9jdGwgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgKHZvaWQpIGh3OworICAgICh2b2lkKSBjbWQ7CisgICAgcmV0dXJuIDA7Cit9CisKKworI2lmIFdBVl9BVURJT19JTgorCisvKiogV0FWIElOIChSZWFkaW5nIGZyb20gYSAuV0FWIGZpbGUpCisgKiovCisKKyBzdGF0aWMgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICp3YXZfcGF0aDsKK30gY29uZl9pbiA9IHsKKyAgICAicWVtdS53YXYiCit9OworCit0eXBlZGVmIHN0cnVjdCBXQVZWb2ljZUluIHsKKyAgICBIV1ZvaWNlSW4gIGh3OworICAgIEZJTEUqICAgICAgZjsKKyAgICBpbnQ2NF90ICAgIG9sZF90aWNrczsKKyAgICB2b2lkKiAgICAgIHBjbV9idWY7CisgICAgaW50ICAgICAgICB0b3RhbF9zYW1wbGVzOworICAgIGludCAgICAgICAgdG90YWxfc2l6ZTsKK30gV0FWVm9pY2VJbjsKKworCitzdGF0aWMgaW50CitsZV9yZWFkKCBjb25zdCB1aW50OF90KiAgcCwgaW50ICBzaXplICkgeworICAgIGludCAgc2hpZnQgID0gMDsKKyAgICBpbnQgIHJlc3VsdCA9IDA7CisgICAgZm9yICggOyBzaXplID4gMDsgc2l6ZS0tICkgeworICAgICAgICByZXN1bHQgPSByZXN1bHQgfCAocFswXSA8PCBzaGlmdCk7CisgICAgICAgIHAgICAgICs9IDE7CisgICAgICAgIHNoaWZ0ICs9IDg7CisgICAgfQorICAgIHJldHVybiAgcmVzdWx0OworfQorCitzdGF0aWMgaW50Cit3YXZfaW5faW5pdCAoSFdWb2ljZUluICpodywgc3RydWN0IGF1ZHNldHRpbmdzICphcykKK3sKKyAgICBXQVZWb2ljZUluKiAgd2F2ID0gKFdBVlZvaWNlSW4gKikgaHc7CisgICAgY29uc3QgY2hhciogIHBhdGggPSBjb25mX2luLndhdl9wYXRoOworICAgIHVpbnQ4X3QgICAgICBoZHJbNDRdOworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyB3YXZfYXMgPSAqYXM7CisgICAgaW50ICAgICAgICAgICBuY2hhbm5lbHMsIGZyZXEsIGZvcm1hdCwgYml0czsKKworICAgIHdhdi0+ZiA9IGZvcGVuIChwYXRoLCAicmIiKTsKKyAgICBpZiAod2F2LT5mID09IE5VTEwpIHsKKyAgICAgICAgZG9sb2coIkZhaWxlZCB0byBvcGVuIHdhdmUgZmlsZSAnJXMnXG5SZWFzb246ICVzXG4iLCBwYXRoLAorICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZyZWFkKGhkciwgc2l6ZW9mKGhkciksIDEsIHdhdi0+ZikgIT0gMSkgeworICAgICAgICBkb2xvZygiRmlsZSAnJXMnIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIC53YXYgZmlsZVxuIiwgcGF0aCk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IHRoaXMgaXMgYSB3YXZlIGZpbGUgKi8KKyAgICBpZiAoIGhkclswXSAhPSAnUicgfHwgaGRyWzFdICE9ICdJJyB8fCBoZHJbMl0gIT0gJ0YnIHx8IGhkclszXSAhPSAnRicgfHwKKyAgICAgICAgIGhkcls4XSAhPSAnVycgfHwgaGRyWzldICE9ICdBJyB8fCBoZHJbMTBdIT0gJ1YnIHx8IGhkclsxMV0hPSAnRScgfHwKKyAgICAgICAgIGhkclsxMl0hPSAnZicgfHwgaGRyWzEzXSE9ICdtJyB8fCBoZHJbMTRdIT0gJ3QnIHx8IGhkclsxNV0hPSAnICcgfHwKKyAgICAgICAgIGhkcls0MF0hPSAnZCcgfHwgaGRyWzQxXSE9ICdhJyB8fCBoZHJbNDJdIT0gJ3QnIHx8IGhkcls0M10hPSAnYScpIHsKKyAgICAgICAgIGRvbG9nKCJGaWxlICclcycgaXMgbm90IGEgdmFsaWQgLndhdiBmaWxlXG4iLCBwYXRoKTsKKyAgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICBuY2hhbm5lbHMgICA9IGxlX3JlYWQoIGhkcisyMiwgMiApOworICAgIGZyZXEgICAgICAgID0gbGVfcmVhZCggaGRyKzI0LCA0ICk7CisgICAgZm9ybWF0ICAgICAgPSBsZV9yZWFkKCBoZHIrMzIsIDIgKTsKKyAgICBiaXRzICAgICAgICA9IGxlX3JlYWQoIGhkciszNCwgMiApOworCisgICAgd2F2LT50b3RhbF9zaXplID0gbGVfcmVhZCggaGRyKzQwLCA0ICk7CisKKyAgICAvKiBwZXJmb3JtIHNvbWUgc2FpbnR5IGNoZWNrcyAqLworICAgIHN3aXRjaCAobmNoYW5uZWxzKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOiBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRvbG9nKCJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgKCVkKSBpbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgbmNoYW5uZWxzLCBwYXRoKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OiBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRvbG9nKCJ1bnN1cHBvcnRlZCBieXRlcyBwZXIgc2FtcGxlICglZCkgaW4gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdCwgcGF0aCk7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgaWYgKGZvcm1hdCo4L25jaGFubmVscyAhPSBiaXRzKSB7CisgICAgICAgIGRvbG9nKCJpbnZhbGlkIGJpdHMgcGVyIHNhbXBsZSAoJWQsIGV4cGVjdGVkICVkKSBpbiAnJXMnXG4iLAorICAgICAgICAgICAgICBiaXRzLCBmb3JtYXQqOC9uY2hhbm5lbHMsIHBhdGgpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorCisgICAgd2F2X2FzLm5jaGFubmVscyAgPSBuY2hhbm5lbHM7CisgICAgd2F2X2FzLmZtdCAgICAgICAgPSAoYml0cyA9PSA4KSA/IEFVRF9GTVRfVTggOiBBVURfRk1UX1MxNjsKKyAgICB3YXZfYXMuZnJlcSAgICAgICA9IGZyZXE7CisgICAgd2F2X2FzLmVuZGlhbm5lc3MgPSAwOyAgLyogYWx3YXlzIGxpdHRsZSBlbmRpYW4gKi8KKworICAgIGF1ZGlvX3BjbV9pbml0X2luZm8gKCZody0+aW5mbywgJndhdl9hcyk7CisKKyAgICBody0+c2FtcGxlcyAgPSAxMDI0OworICAgIHdhdi0+cGNtX2J1ZiA9IGF1ZGlvX2NhbGxvYyAoQVVESU9fRlVOQywgaHctPnNhbXBsZXMsIDEgPDwgaHctPmluZm8uc2hpZnQpOworICAgIGlmICghd2F2LT5wY21fYnVmKSB7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKK0ZhaWw6CisgICAgZmNsb3NlICh3YXYtPmYpOworICAgIHdhdi0+ZiA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyB2b2lkIHdhdl9pbl9maW5pIChIV1ZvaWNlSW4gKmh3KQoreworICAgIFdBVlZvaWNlSW4gKndhdiA9IChXQVZWb2ljZUluICopIGh3OworCisgICAgaWYgKCF3YXYtPmYpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZjbG9zZSAod2F2LT5mKTsKKyAgICB3YXYtPmYgPSBOVUxMOworCisgICAgZ19mcmVlICh3YXYtPnBjbV9idWYpOworICAgIHdhdi0+cGNtX2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd2F2X2luX3J1biAoSFdWb2ljZUluICpodykKK3sKKyAgICBXQVZWb2ljZUluKiAgIHdhdiA9IChXQVZWb2ljZUluICopIGh3OworICAgIGludCAgICAgICAgICAgd3BvcywgbGl2ZSwgZGVjciwgc2FtcGxlczsKKyAgICB1aW50OF90KiAgICAgIHNyYzsKKyAgICBzdHJ1Y3Qgc3Rfc2FtcGxlKiAgZHN0OworCisgICAgaW50NjRfdCAgbm93ICAgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgIGludDY0X3QgIHRpY2tzID0gbm93IC0gd2F2LT5vbGRfdGlja3M7CisgICAgaW50NjRfdCAgYnl0ZXMgPSBtdWxkaXY2NCh0aWNrcywgaHctPmluZm8uYnl0ZXNfcGVyX3NlY29uZCwgZ2V0X3RpY2tzX3Blcl9zZWMoKSk7CisKKyAgICBpZiAoYnl0ZXMgPiBJTlRfTUFYKSB7CisgICAgICAgIHNhbXBsZXMgPSBJTlRfTUFYID4+IGh3LT5pbmZvLnNoaWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2FtcGxlcyA9IGJ5dGVzID4+IGh3LT5pbmZvLnNoaWZ0OworICAgIH0KKworICAgIGxpdmUgPSBhdWRpb19wY21faHdfZ2V0X2xpdmVfaW4gKGh3KTsKKyAgICBpZiAoIWxpdmUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2F2LT5vbGRfdGlja3MgPSBub3c7CisKKyAgICBkZWNyICAgID0gYXVkaW9fTUlOIChsaXZlLCBzYW1wbGVzKTsKKyAgICBzYW1wbGVzID0gZGVjcjsKKyAgICB3cG9zICAgID0gaHctPndwb3M7CisgICAgd2hpbGUgKHNhbXBsZXMpIHsKKyAgICAgICAgaW50IGxlZnRfdGlsbF9lbmRfc2FtcGxlcyA9IGh3LT5zYW1wbGVzIC0gd3BvczsKKyAgICAgICAgaW50IGNvbnZlcnRfc2FtcGxlcyAgICAgICA9IGF1ZGlvX01JTiAoc2FtcGxlcywgbGVmdF90aWxsX2VuZF9zYW1wbGVzKTsKKworICAgICAgICBkc3QgPSBody0+Y29udl9idWYgKyB3cG9zOworICAgICAgICBzcmMgPSBhZHZhbmNlICh3YXYtPnBjbV9idWYsIHdwb3MgPDwgaHctPmluZm8uc2hpZnQpOworCisgICAgICAgIGNsZWFyZXJyKHdhdi0+Zik7CisgICAgICAgIHNpemVfdCByZWFkX2J5dGVzID0gZnJlYWQoc3JjLCAxLCBjb252ZXJ0X3NhbXBsZXMgPDwgaHctPmluZm8uc2hpZnQsIHdhdi0+Zik7CisgICAgICAgIGlmIChyZWFkX2J5dGVzID09IDAgJiYgZmVycm9yKHdhdi0+ZikgIT0gRUlOVFIpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBzaXplX3QgcmVhZF9zYW1wbGVzID0gcmVhZF9ieXRlcyA+PiBody0+aW5mby5zaGlmdDsKKyAgICAgICAgbWVtY3B5IChkc3QsIHNyYywgcmVhZF9ieXRlcyk7CisKKyAgICAgICAgd3BvcyAgICAgICAgICAgICAgICA9ICh3cG9zICsgcmVhZF9zYW1wbGVzKSAlIGh3LT5zYW1wbGVzOworICAgICAgICBzYW1wbGVzICAgICAgICAgICAgLT0gcmVhZF9zYW1wbGVzOworICAgICAgICB3YXYtPnRvdGFsX3NhbXBsZXMgKz0gcmVhZF9zYW1wbGVzOworICAgIH0KKworICAgIGh3LT53cG9zID0gd3BvczsKKyAgICByZXR1cm4gZGVjcjsKK30KKworc3RhdGljIGludCB3YXZfaW5fcmVhZCAoU1dWb2ljZUluICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfcmVhZCAoc3csIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIGludCB3YXZfaW5fY3RsIChIV1ZvaWNlSW4gKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgKHZvaWQpIGh3OworICAgICh2b2lkKSBjbWQ7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogV0FWX0FVRElPX0lOICovCisKKy8qKiBDT01NT04gQ09ERQorICoqLworc3RhdGljIHZvaWQgKndhdl9hdWRpb19pbml0ICh2b2lkKQoreworICAgIHJldHVybiAmY29uZl9vdXQ7Cit9CisKK3N0YXRpYyB2b2lkIHdhdl9hdWRpb19maW5pICh2b2lkICpvcGFxdWUpCit7CisgICAgKHZvaWQpIG9wYXF1ZTsKKyAgICBsZGVidWcgKCJ3YXZfZmluaSIpOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX29wdGlvbiB3YXZfb3B0aW9uc1tdID0geworICAgIHsiRlJFUVVFTkNZIiwgQVVEX09QVF9JTlQsICZjb25mX291dC5zZXR0aW5ncy5mcmVxLAorICAgICAiRnJlcXVlbmN5IiwgTlVMTCwgMH0sCisKKyAgICB7IkZPUk1BVCIsIEFVRF9PUFRfRk1ULCAmY29uZl9vdXQuc2V0dGluZ3MuZm10LAorICAgICAiRm9ybWF0IiwgTlVMTCwgMH0sCisKKyAgICB7IkRBQ19GSVhFRF9DSEFOTkVMUyIsIEFVRF9PUFRfSU5ULCAmY29uZl9vdXQuc2V0dGluZ3MubmNoYW5uZWxzLAorICAgICAiTnVtYmVyIG9mIGNoYW5uZWxzICgxIC0gbW9ubywgMiAtIHN0ZXJlbykiLCBOVUxMLCAwfSwKKworICAgIHsiUEFUSCIsIEFVRF9PUFRfU1RSLCAmY29uZl9vdXQud2F2X3BhdGgsCisgICAgICJQYXRoIHRvIG91dHB1dCAud2F2IGZpbGUiLCBOVUxMLCAwfSwKKworI2lmIFdBVl9BVURJT19JTgorICAgIHsiSU5fUEFUSCIsIEFVRF9PUFRfU1RSLCAmY29uZl9pbi53YXZfcGF0aCwKKyAgICAgIlBhdGggdG8gaW5wdXQgLndhdiBmaWxlIiwgTlVMTCwgMH0sCisjZW5kaWYKKyAgICB7TlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgMH0KK307CisKK3N0cnVjdCBhdWRpb19wY21fb3BzIHdhdl9wY21fb3BzID0geworICAgIHdhdl9vdXRfaW5pdCwKKyAgICB3YXZfb3V0X2ZpbmksCisgICAgd2F2X291dF9ydW4sCisgICAgd2F2X291dF93cml0ZSwKKyAgICB3YXZfb3V0X2N0bCwKKworI2lmIFdBVl9BVURJT19JTgorICAgIHdhdl9pbl9pbml0LAorICAgIHdhdl9pbl9maW5pLAorICAgIHdhdl9pbl9ydW4sCisgICAgd2F2X2luX3JlYWQsCisgICAgd2F2X2luX2N0bAorI2Vsc2UKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwKKyNlbmRpZgorfTsKKworc3RydWN0IGF1ZGlvX2RyaXZlciB3YXZfYXVkaW9fZHJpdmVyID0geworICAgIElOSVRfRklFTEQgKG5hbWUgICAgICAgICAgID0gKSAid2F2IiwKKyAgICBJTklUX0ZJRUxEIChkZXNjciAgICAgICAgICA9ICkKKyAgICAiV0FWIGZpbGUgcmVhZC93cml0ZSAod3d3Lndpa2lwZWRpYS5vcmcvd2lraS9XQVYpIiwKKyAgICBJTklUX0ZJRUxEIChvcHRpb25zICAgICAgICA9ICkgd2F2X29wdGlvbnMsCisgICAgSU5JVF9GSUVMRCAoaW5pdCAgICAgICAgICAgPSApIHdhdl9hdWRpb19pbml0LAorICAgIElOSVRfRklFTEQgKGZpbmkgICAgICAgICAgID0gKSB3YXZfYXVkaW9fZmluaSwKKyAgICBJTklUX0ZJRUxEIChwY21fb3BzICAgICAgICA9ICkgJndhdl9wY21fb3BzLAorICAgIElOSVRfRklFTEQgKGNhbl9iZV9kZWZhdWx0ID0gKSAwLAorI2lmIFdBVl9BVURJT19JTgorICAgIElOSVRfRklFTEQgKG1heF92b2ljZXNfaW4gID0gKSAxLAorICAgIElOSVRfRklFTEQgKG1heF92b2ljZXNfb3V0ID0gKSAxLAorICAgIElOSVRfRklFTEQgKHZvaWNlX3NpemVfb3V0ID0gKSBzaXplb2YgKFdBVlZvaWNlT3V0KSwKKyAgICBJTklUX0ZJRUxEICh2b2ljZV9zaXplX2luICA9ICkgc2l6ZW9mIChXQVZWb2ljZUluKQorI2Vsc2UKKyAgICBJTklUX0ZJRUxEIChtYXhfdm9pY2VzX291dCA9ICkgMSwKKyAgICBJTklUX0ZJRUxEIChtYXhfdm9pY2VzX2luICA9ICkgMCwKKyAgICBJTklUX0ZJRUxEICh2b2ljZV9zaXplX291dCA9ICkgc2l6ZW9mIChXQVZWb2ljZU91dCksCisgICAgSU5JVF9GSUVMRCAodm9pY2Vfc2l6ZV9pbiAgPSApIDAKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vd2F2Y2FwdHVyZS5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby93YXZjYXB0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4NmM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd2F2Y2FwdHVyZS5jCkBAIC0wLDAgKzEsMTYxIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRklMRSAqZjsKKyAgICBpbnQgYnl0ZXM7CisgICAgY2hhciAqcGF0aDsKKyAgICBpbnQgZnJlcTsKKyAgICBpbnQgYml0czsKKyAgICBpbnQgbmNoYW5uZWxzOworICAgIENhcHR1cmVWb2ljZU91dCAqY2FwOworfSBXQVZTdGF0ZTsKKworLyogVklDRSBjb2RlOiBTdG9yZSBudW1iZXIgYXMgbGl0dGxlIGVuZGlhbi4gKi8KK3N0YXRpYyB2b2lkIGxlX3N0b3JlICh1aW50OF90ICpidWYsIHVpbnQzMl90IHZhbCwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgYnVmW2ldID0gKHVpbnQ4X3QpICh2YWwgJiAweGZmKTsKKyAgICAgICAgdmFsID4+PSA4OworICAgIH0KK30KKworc3RhdGljIHZvaWQgd2F2X25vdGlmeSAodm9pZCAqb3BhcXVlLCBhdWRjbm90aWZpY2F0aW9uX2UgY21kKQoreworICAgICh2b2lkKSBvcGFxdWU7CisgICAgKHZvaWQpIGNtZDsKK30KKworc3RhdGljIHZvaWQgd2F2X2Rlc3Ryb3kgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBXQVZTdGF0ZSAqd2F2ID0gb3BhcXVlOworICAgIHVpbnQ4X3Qgcmxlbls0XTsKKyAgICB1aW50OF90IGRsZW5bNF07CisgICAgdWludDMyX3QgZGF0YWxlbiA9IHdhdi0+Ynl0ZXM7CisgICAgdWludDMyX3QgcmlmZmxlbiA9IGRhdGFsZW4gKyAzNjsKKworICAgIGlmICh3YXYtPmYpIHsKKyAgICAgICAgbGVfc3RvcmUgKHJsZW4sIHJpZmZsZW4sIDQpOworICAgICAgICBsZV9zdG9yZSAoZGxlbiwgZGF0YWxlbiwgNCk7CisKKyAgICAgICAgZnNlZWsgKHdhdi0+ZiwgNCwgU0VFS19TRVQpOworICAgICAgICBmd3JpdGUocmxlbiwgNCwgMSwgd2F2LT5mKTsKKworICAgICAgICBmc2VlayAod2F2LT5mLCAzMiwgU0VFS19DVVIpOworICAgICAgICBmd3JpdGUoZGxlbiwgNCwgMSwgd2F2LT5mKTsKKyAgICAgICAgZmNsb3NlICh3YXYtPmYpOworICAgIH0KKworICAgIGdfZnJlZSAod2F2LT5wYXRoKTsKK30KKworc3RhdGljIHZvaWQgd2F2X2NhcHR1cmUgKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBXQVZTdGF0ZSAqd2F2ID0gb3BhcXVlOworCisgICAgZndyaXRlKGJ1Ziwgc2l6ZSwgMSwgd2F2LT5mKTsKKyAgICB3YXYtPmJ5dGVzICs9IHNpemU7Cit9CisKK3N0YXRpYyB2b2lkIHdhdl9jYXB0dXJlX2Rlc3Ryb3kgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBXQVZTdGF0ZSAqd2F2ID0gb3BhcXVlOworCisgICAgQVVEX2RlbF9jYXB0dXJlICh3YXYtPmNhcCwgd2F2KTsKK30KKworc3RhdGljIHZvaWQgd2F2X2NhcHR1cmVfaW5mbyAodm9pZCAqb3BhcXVlKQoreworICAgIFdBVlN0YXRlICp3YXYgPSBvcGFxdWU7CisgICAgY2hhciAqcGF0aCA9IHdhdi0+cGF0aDsKKworICAgIG1vbml0b3JfcHJpbnRmKGN1cl9tb24sICJDYXB0dXJpbmcgYXVkaW8oJWQsJWQsJWQpIHRvICVzOiAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICB3YXYtPmZyZXEsIHdhdi0+Yml0cywgd2F2LT5uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgcGF0aCA/IHBhdGggOiAiPG5vdCBhdmFpbGFibGU+Iiwgd2F2LT5ieXRlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2FwdHVyZV9vcHMgd2F2X2NhcHR1cmVfb3BzID0geworICAgIC5kZXN0cm95ID0gd2F2X2NhcHR1cmVfZGVzdHJveSwKKyAgICAuaW5mbyA9IHdhdl9jYXB0dXJlX2luZm8KK307CisKK2ludCB3YXZfc3RhcnRfY2FwdHVyZSAoQ2FwdHVyZVN0YXRlICpzLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsIGludCBuY2hhbm5lbHMpCit7CisgICAgTW9uaXRvciAqbW9uID0gY3VyX21vbjsKKyAgICBXQVZTdGF0ZSAqd2F2OworICAgIHVpbnQ4X3QgaGRyW10gPSB7CisgICAgICAgIDB4NTIsIDB4NDksIDB4NDYsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTcsIDB4NDEsIDB4NTYsCisgICAgICAgIDB4NDUsIDB4NjYsIDB4NmQsIDB4NzQsIDB4MjAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsCisgICAgICAgIDB4MDIsIDB4MDAsIDB4NDQsIDB4YWMsIDB4MDAsIDB4MDAsIDB4MTAsIDB4YjEsIDB4MDIsIDB4MDAsIDB4MDQsCisgICAgICAgIDB4MDAsIDB4MTAsIDB4MDAsIDB4NjQsIDB4NjEsIDB4NzQsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgICB9OworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBhczsKKyAgICBzdHJ1Y3QgYXVkaW9fY2FwdHVyZV9vcHMgb3BzOworICAgIGludCBzdGVyZW8sIGJpdHMxNiwgc2hpZnQ7CisgICAgQ2FwdHVyZVZvaWNlT3V0ICpjYXA7CisKKyAgICBpZiAoYml0cyAhPSA4ICYmIGJpdHMgIT0gMTYpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiaW5jb3JyZWN0IGJpdCBjb3VudCAlZCwgbXVzdCBiZSA4IG9yIDE2XG4iLCBiaXRzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChuY2hhbm5lbHMgIT0gMSAmJiBuY2hhbm5lbHMgIT0gMikgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJpbmNvcnJlY3QgY2hhbm5lbCBjb3VudCAlZCwgbXVzdCBiZSAxIG9yIDJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5jaGFubmVscyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGVyZW8gPSBuY2hhbm5lbHMgPT0gMjsKKyAgICBiaXRzMTYgPSBiaXRzID09IDE2OworCisgICAgYXMuZnJlcSA9IGZyZXE7CisgICAgYXMubmNoYW5uZWxzID0gMSA8PCBzdGVyZW87CisgICAgYXMuZm10ID0gYml0czE2ID8gQVVEX0ZNVF9TMTYgOiBBVURfRk1UX1U4OworICAgIGFzLmVuZGlhbm5lc3MgPSAwOworCisgICAgb3BzLm5vdGlmeSA9IHdhdl9ub3RpZnk7CisgICAgb3BzLmNhcHR1cmUgPSB3YXZfY2FwdHVyZTsKKyAgICBvcHMuZGVzdHJveSA9IHdhdl9kZXN0cm95OworCisgICAgd2F2ID0gZ19tYWxsb2MwIChzaXplb2YgKCp3YXYpKTsKKworICAgIHNoaWZ0ID0gYml0czE2ICsgc3RlcmVvOworICAgIGhkclszNF0gPSBiaXRzMTYgPyAweDEwIDogMHgwODsKKworICAgIGxlX3N0b3JlIChoZHIgKyAyMiwgYXMubmNoYW5uZWxzLCAyKTsKKyAgICBsZV9zdG9yZSAoaGRyICsgMjQsIGZyZXEsIDQpOworICAgIGxlX3N0b3JlIChoZHIgKyAyOCwgZnJlcSA8PCBzaGlmdCwgNCk7CisgICAgbGVfc3RvcmUgKGhkciArIDMyLCAxIDw8IHNoaWZ0LCAyKTsKKworICAgIHdhdi0+ZiA9IGZvcGVuIChwYXRoLCAid2IiKTsKKyAgICBpZiAoIXdhdi0+ZikgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJGYWlsZWQgdG8gb3BlbiB3YXZlIGZpbGUgYCVzJ1xuUmVhc29uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICAgIGdfZnJlZSAod2F2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdhdi0+cGF0aCA9IGdfc3RyZHVwIChwYXRoKTsKKyAgICB3YXYtPmJpdHMgPSBiaXRzOworICAgIHdhdi0+bmNoYW5uZWxzID0gbmNoYW5uZWxzOworICAgIHdhdi0+ZnJlcSA9IGZyZXE7CisKKyAgICBmd3JpdGUoaGRyLCBzaXplb2YoaGRyKSwgMSwgd2F2LT5mKTsKKworICAgIGNhcCA9IEFVRF9hZGRfY2FwdHVyZSAoJmFzLCAmb3BzLCB3YXYpOworICAgIGlmICghY2FwKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIkZhaWxlZCB0byBhZGQgYXVkaW8gY2FwdHVyZVxuIik7CisgICAgICAgIGdfZnJlZSAod2F2LT5wYXRoKTsKKyAgICAgICAgZmNsb3NlICh3YXYtPmYpOworICAgICAgICBnX2ZyZWUgKHdhdik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3YXYtPmNhcCA9IGNhcDsKKyAgICBzLT5vcGFxdWUgPSB3YXY7CisgICAgcy0+b3BzID0gd2F2X2NhcHR1cmVfb3BzOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9hdWRpby93aW5hdWRpby5jIGIvYW5kcm9pZC9xZW11MS9hdWRpby93aW5hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYWZmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dpbmF1ZGlvLmMKQEAgLTAsMCArMSw2NjUgQEAKKy8qCisgKiBRRU1VICJzaW1wbGUiIFdpbmRvd3MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorCisjZGVmaW5lIEFVRElPX0NBUCAid2luYXVkaW8iCisjaW5jbHVkZSAiYXVkaW9faW50LmgiCisKKy8qIGRlZmluZSBERUJVRyB0byAxIHRvIGR1bXAgYXVkaW8gZGVidWdnaW5nIGluZm8gYXQgcnVudGltZSB0byBzdGRlcnIgKi8KKyNkZWZpbmUgIERFQlVHICAwCisKKyNpZiAxCisjICBkZWZpbmUgIERfQUNUSVZFICAgIDEKKyNlbHNlCisjICBkZWZpbmUgIERfQUNUSVZFICBERUJVRworI2VuZGlmCisKKyNpZiBERUJVRworIyAgZGVmaW5lICBEKC4uLikgICBkb3sgaWYgKERfQUNUSVZFKSBwcmludGYoX19WQV9BUkdTX18pOyB9IHdoaWxlKDApCisjZWxzZQorIyAgZGVmaW5lICBEKC4uLikgICAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHsKKyAgICBpbnQgbmJfc2FtcGxlczsKK30gY29uZiA9IHsKKyAgICAxMDI0Cit9OworCisjaWYgREVCVUcKK2ludDY0X3QgIHN0YXJ0X3RpbWU7CitpbnQ2NF90ICBsYXN0X3RpbWU7CisjZW5kaWYKKworI2RlZmluZSAgTlVNX09VVF9CVUZGRVJTICA4ICAvKiBtdXN0IGJlIGF0IGxlYXN0IDIgKi8KKworLyoqIENPTU1PTiBVVElMSVRJRVMKKyAqKi8KKworI2lmIERFQlVHCitzdGF0aWMgdm9pZAorZHVtcF9tbWVycm9yKCBjb25zdCBjaGFyKiAgZnVuYywgTU1SRVNVTFQgIGVycm9yICkKK3sKKyAgICBjb25zdCBjaGFyKiAgcmVhc29uID0gTlVMTDsKKworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgcmV0dXJuZWQgZXJyb3I6ICIsIGZ1bmMpOworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICAgIGNhc2UgTU1TWVNFUlJfQUxMT0NBVEVEOiAgIHJlYXNvbj0ic3BlY2lmaWVkIHJlc291cmNlIGlzIGFscmVhZHkgYWxsb2NhdGVkIjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1NU1lTRVJSX0JBRERFVklDRUlEOiByZWFzb249ImJhZCBkZXZpY2UgaWQiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU1TWVNFUlJfTk9EUklWRVI6ICAgIHJlYXNvbj0ibm8gZHJpdmVyIGlzIHByZXNlbnQiOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU1TWVNFUlJfTk9NRU06ICAgICAgIHJlYXNvbj0idW5hYmxlIHRvIGFsbG9jYXRlIG9yIGxvY2sgbWVtb3J5IjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdBVkVSUl9CQURGT1JNQVQ6ICAgICByZWFzb249InVuc3VwcG9ydGVkIHdhdmVmb3JtLWF1ZGlvIGZvcm1hdCI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBXQVZFUlJfU1lOQzogICAgICAgICAgcmVhc29uPSJkZXZpY2UgaXMgc3luY2hyb25vdXMiOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biglZClcbiIsIGVycm9yKTsKKyAgICB9CisgICAgaWYgKHJlYXNvbikKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHJlYXNvbik7Cit9CisjZWxzZQorIyAgZGVmaW5lICBkdW1wX21tZXJyb3IoZnVuYyxlcnJvcikgICgodm9pZCkwKQorI2VuZGlmCisKKworLyoqIEFVRElPIE9VVAorICoqLworCit0eXBlZGVmIHN0cnVjdCBXaW5BdWRpb091dCB7CisgICAgSFdWb2ljZU91dCAgICAgICAgaHc7CisgICAgSFdBVkVPVVQgICAgICAgICAgd2F2ZW91dDsKKyAgICBpbnQgICAgICAgICAgICAgICBzaWxlbmNlOworICAgIENSSVRJQ0FMX1NFQ1RJT04gIGxvY2s7CisgICAgdW5zaWduZWQgY2hhciogICAgYnVmZmVyX2J5dGVzOworICAgIFdBVkVIRFIgICAgICAgICAgIGJ1ZmZlcnNbIE5VTV9PVVRfQlVGRkVSUyBdOworICAgIGludCAgICAgICAgICAgICAgIHdyaXRlX2luZGV4OyAgIC8qIHN0YXJ0aW5nIGZpcnN0IHdyaXRhYmxlIGJ1ZmZlciAgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgd3JpdGVfY291bnQ7ICAgLyogYXZhaWxhYmxlIHdyaXRhYmxlIGJ1ZmZlcnMgY291bnQgICAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB3cml0ZV9wb3M7ICAgICAvKiBwb3NpdGlvbiBpbiBjdXJyZW50IHdyaXRhYmxlIGJ1ZmZlciAqLworICAgIGludCAgICAgICAgICAgICAgIHdyaXRlX3NpemU7ICAgIC8qIHNpemUgaW4gYnl0ZXMgb2YgZWFjaCBidWZmZXIgICAgICAgICovCit9IFdpbkF1ZGlvT3V0OworCisvKiBUaGUgV2luMzIgY2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIGJ1ZmZlciBoYXMgZmluaXNoZWQgcGxheWluZyAqLworc3RhdGljIHZvaWQgQ0FMTEJBQ0sKK3dpbmF1ZGlvX291dF9idWZmZXJfZG9uZSAoSFdBVkVPVVQgaHdvLCBVSU5UIHVNc2csIERXT1JEX1BUUiBkd0luc3RhbmNlLAorCQkJICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCit7CisgICAgV2luQXVkaW9PdXQqICBzID0gKFdpbkF1ZGlvT3V0KikgZHdJbnN0YW5jZTsKKworICAgIC8qIE9ubHkgc2VydmljZSAiYnVmZmVyIGRvbmUgcGxheWluZyIgbWVzc2FnZXMgKi8KKyAgICBpZiAoIHVNc2cgIT0gV09NX0RPTkUgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgLyogU2lnbmFsIHRoYXQgd2UgYXJlIGRvbmUgcGxheWluZyBhIGJ1ZmZlciAqLworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworICAgIGlmIChzLT53cml0ZV9jb3VudCA8IE5VTV9PVVRfQlVGRkVSUykKKyAgICAgICAgcy0+d3JpdGVfY291bnQgKz0gMTsKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKK30KKworc3RhdGljIGludAord2luYXVkaW9fb3V0X3dyaXRlIChTV1ZvaWNlT3V0ICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIHJldHVybiBhdWRpb19wY21fc3dfd3JpdGUgKHN3LCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCit3aW5hdWRpb19vdXRfZmluaSAoSFdWb2ljZU91dCAqaHcpCit7CisgICAgV2luQXVkaW9PdXQqICBzID0gKFdpbkF1ZGlvT3V0KikgaHc7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgaWYgKHMtPndhdmVvdXQpIHsKKyAgICAgICAgd2F2ZU91dFJlc2V0KHMtPndhdmVvdXQpOworICAgICAgICBzLT53YXZlb3V0ID0gMDsKKyAgICB9CisKKyAgICBmb3IgKCBpPTA7IGk8TlVNX09VVF9CVUZGRVJTOyArK2kgKSB7CisgICAgICAgIGlmICggcy0+YnVmZmVyc1tpXS5kd1VzZXIgIT0gMHhGRkZGICkgeworICAgICAgICAgICAgd2F2ZU91dFVucHJlcGFyZUhlYWRlcigKKyAgICAgICAgICAgICAgICBzLT53YXZlb3V0LCAmcy0+YnVmZmVyc1tpXSwgc2l6ZW9mKHMtPmJ1ZmZlcnNbaV0pICk7CisgICAgICAgICAgICAgICAgcy0+YnVmZmVyc1tpXS5kd1VzZXIgPSAweEZGRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+YnVmZmVyX2J5dGVzICE9IE5VTEwpIHsKKyAgICAgICAgZ19mcmVlKHMtPmJ1ZmZlcl9ieXRlcyk7CisgICAgICAgIHMtPmJ1ZmZlcl9ieXRlcyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPndhdmVvdXQpIHsKKyAgICAgICAgd2F2ZU91dENsb3NlKHMtPndhdmVvdXQpOworICAgICAgICBzLT53YXZlb3V0ID0gTlVMTDsKKyAgICB9Cit9CisKKworc3RhdGljIGludAord2luYXVkaW9fb3V0X2luaXQgKEhXVm9pY2VPdXQgKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIFdpbkF1ZGlvT3V0KiAgIHMgPSAoV2luQXVkaW9PdXQqKSBodzsKKyAgICBNTVJFU1VMVCAgICAgICByZXN1bHQ7CisgICAgV0FWRUZPUk1BVEVYICAgZm9ybWF0OworICAgIGludCAgICAgICAgICAgIHNoaWZ0LCBpLCBzYW1wbGVzX3NpemU7CisKKyAgICBzLT53YXZlb3V0ID0gTlVMTDsKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fT1VUX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgcy0+YnVmZmVyc1tpXS5kd1VzZXIgPSAweEZGRkY7CisgICAgfQorICAgIHMtPmJ1ZmZlcl9ieXRlcyA9IE5VTEw7CisKKyAgICAvKiBjb21wdXRlIGRlc2lyZWQgd2F2ZSBvdXRwdXQgZm9ybWF0ICovCisgICAgZm9ybWF0LndGb3JtYXRUYWcgICAgICA9IFdBVkVfRk9STUFUX1BDTTsKKyAgICBmb3JtYXQubkNoYW5uZWxzICAgICAgID0gYXMtPm5jaGFubmVsczsKKyAgICBmb3JtYXQublNhbXBsZXNQZXJTZWMgID0gYXMtPmZyZXE7CisgICAgZm9ybWF0Lm5BdmdCeXRlc1BlclNlYyA9IGFzLT5mcmVxKmFzLT5uY2hhbm5lbHM7CisKKyAgICBzLT5zaWxlbmNlID0gMDsKKworICAgIHN3aXRjaCAoYXMtPmZtdCkgeworICAgICAgICBjYXNlIEFVRF9GTVRfUzg6ICAgc2hpZnQgPSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBBVURfRk1UX1U4OiAgIHNoaWZ0ID0gMDsgcy0+c2lsZW5jZSA9IDB4ODA7IGJyZWFrOworICAgICAgICBjYXNlIEFVRF9GTVRfUzE2OiAgc2hpZnQgPSAxOyBicmVhazsKKyAgICAgICAgY2FzZSBBVURfRk1UX1UxNjogIHNoaWZ0ID0gMTsgcy0+c2lsZW5jZSA9IDB4ODAwMDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHdpbmF1ZGlvOiBCYWQgb3V0cHV0IGF1ZGlvIGZvcm1hdDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGFzLT5mbXQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3JtYXQubkF2Z0J5dGVzUGVyU2VjID0gKGZvcm1hdC5uU2FtcGxlc1BlclNlYyAmIGZvcm1hdC5uQ2hhbm5lbHMpIDw8IHNoaWZ0OworICAgIGZvcm1hdC5uQmxvY2tBbGlnbiAgICAgPSBmb3JtYXQubkNoYW5uZWxzIDw8IHNoaWZ0OworICAgIGZvcm1hdC53Qml0c1BlclNhbXBsZSAgPSA4IDw8IHNoaWZ0OworICAgIGZvcm1hdC5jYlNpemUgICAgICAgICAgPSAwOworCisgICAgLyogb3BlbiB0aGUgd2F2ZSBvdXQgZGV2aWNlICovCisgICAgcmVzdWx0ID0gd2F2ZU91dE9wZW4oICZzLT53YXZlb3V0LCBXQVZFX01BUFBFUiwgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkRfUFRSKXdpbmF1ZGlvX291dF9idWZmZXJfZG9uZSwgKERXT1JEX1BUUikgaHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRlVOQ1RJT04pOworICAgIGlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7CisgICAgICAgIGR1bXBfbW1lcnJvciggInFlbXU6IHdpbmF1ZGlvOiB3YXZlT3V0T3BlbigpIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzYW1wbGVzX3NpemUgICAgPSBmb3JtYXQubkJsb2NrQWxpZ24gKiBjb25mLm5iX3NhbXBsZXM7CisgICAgcy0+YnVmZmVyX2J5dGVzID0gZ19tYWxsb2MoIE5VTV9PVVRfQlVGRkVSUyAqIHNhbXBsZXNfc2l6ZSApOworICAgIGlmIChzLT5idWZmZXJfYnl0ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgd2F2ZU91dENsb3NlKCBzLT53YXZlb3V0ICk7CisgICAgICAgICAgICBzLT53YXZlb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGVub3VnaCBtZW1vcnkgZm9yIFdpbmRvd3MgYXVkaW8gYnVmZmVyc1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9PVVRfQlVGRkVSUzsgaSsrKSB7CisgICAgICAgIG1lbXNldCggJnMtPmJ1ZmZlcnNbaV0sIDAsIHNpemVvZihzLT5idWZmZXJzW2ldKSApOworICAgICAgICBzLT5idWZmZXJzW2ldLmxwRGF0YSAgICAgICAgID0gKExQU1RSKShzLT5idWZmZXJfYnl0ZXMgKyBpKnNhbXBsZXNfc2l6ZSk7CisgICAgICAgIHMtPmJ1ZmZlcnNbaV0uZHdCdWZmZXJMZW5ndGggPSBzYW1wbGVzX3NpemU7CisgICAgICAgIHMtPmJ1ZmZlcnNbaV0uZHdGbGFncyAgICAgICAgPSBXSERSX0RPTkU7CisKKyAgICAgICAgcmVzdWx0ID0gd2F2ZU91dFByZXBhcmVIZWFkZXIoIHMtPndhdmVvdXQsICZzLT5idWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5idWZmZXJzW2ldKSApOworICAgICAgICBpZiAoIHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkgeworICAgICAgICAgICAgZHVtcF9tbWVycm9yKCJ3YXZlT3V0UHJlcGFyZUhlYWRlcigpIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIERFQlVHCisgICAgLyogQ2hlY2sgdGhlIHNvdW5kIGRldmljZSB3ZSByZXRyaWV2ZWQgKi8KKyAgICB7CisgICAgICAgIFdBVkVPVVRDQVBTIGNhcHM7CisKKyAgICAgICAgcmVzdWx0ID0gd2F2ZU91dEdldERldkNhcHMoKFVJTlQpIHMtPndhdmVvdXQsICZjYXBzLCBzaXplb2YoY2FwcykpOworICAgICAgICBpZiAoIHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkgeworICAgICAgICAgICAgZHVtcF9tbWVycm9yKCJ3YXZlT3V0R2V0RGV2Q2FwcygpIiwgcmVzdWx0KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmludGYoIkF1ZGlvIG91dCBkZXZpY2U6ICVzXG4iLCBjYXBzLnN6UG5hbWUpOworICAgIH0KKyNlbmRpZgorCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCBhcyk7CisgICAgaHctPnNhbXBsZXMgPSBjb25mLm5iX3NhbXBsZXMqMjsKKworICAgIHMtPndyaXRlX2luZGV4ID0gMDsKKyAgICBzLT53cml0ZV9jb3VudCA9IE5VTV9PVVRfQlVGRkVSUzsKKyAgICBzLT53cml0ZV9wb3MgICA9IDA7CisgICAgcy0+d3JpdGVfc2l6ZSAgPSBzYW1wbGVzX3NpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAord2luYXVkaW9fb3V0X3J1biAoSFdWb2ljZU91dCAqaHcsIGludCBsaXZlKQoreworICAgIFdpbkF1ZGlvT3V0KiAgcyAgICAgID0gKFdpbkF1ZGlvT3V0KikgaHc7CisgICAgaW50ICAgICAgICAgICBwbGF5ZWQgPSAwOworICAgIGludCAgICAgICAgICAgaGFzX2J1ZmZlcjsKKworICAgIGlmICghbGl2ZSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKKyAgICBoYXNfYnVmZmVyID0gKHMtPndyaXRlX2NvdW50ID4gMCk7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZzLT5sb2NrICk7CisKKyAgICBpZiAoaGFzX2J1ZmZlcikgeworICAgICAgICB3aGlsZSAobGl2ZSA+IDApIHsKKyAgICAgICAgICAgIFdBVkVIRFIqICAgICAgd2F2X2J1ZmZlciAgPSBzLT5idWZmZXJzICsgcy0+d3JpdGVfaW5kZXg7CisgICAgICAgICAgICBpbnQgICAgICAgICAgIHdhdl9ieXRlcyAgID0gKHMtPndyaXRlX3NpemUgLSBzLT53cml0ZV9wb3MpOworICAgICAgICAgICAgaW50ICAgICAgICAgICB3YXZfc2FtcGxlcyA9IGF1ZGlvX01JTih3YXZfYnl0ZXMgPj4gaHctPmluZm8uc2hpZnQsIGxpdmUpOworICAgICAgICAgICAgaW50ICAgICAgICAgICBod19zYW1wbGVzICA9IGF1ZGlvX01JTihody0+c2FtcGxlcyAtIGh3LT5ycG9zLCBsaXZlKTsKKyAgICAgICAgICAgIHN0cnVjdCBzdF9zYW1wbGUqICBzcmMgICAgICAgICA9IGh3LT5taXhfYnVmICsgaHctPnJwb3M7CisgICAgICAgICAgICB1aW50OF90KiAgICAgIGRzdCAgICAgICAgID0gKHVpbnQ4X3QqKXdhdl9idWZmZXItPmxwRGF0YSArIHMtPndyaXRlX3BvczsKKworICAgICAgICAgICAgaWYgKHdhdl9zYW1wbGVzID4gaHdfc2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICB3YXZfc2FtcGxlcyA9IGh3X3NhbXBsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdhdl9ieXRlcyA9IHdhdl9zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0OworCisgICAgICAgICAgICAvL0QoInJ1bl9vdXQ6IGJ1ZmZlcjolZCBwb3M6JWQgc2l6ZTolZCB3c2FtcGxlczolZCB3Ynl0ZXM6JWQgbGl2ZTolZCBycG9zOiVkIGh3c2FtcGxlczolZFxuIiwgcy0+d3JpdGVfaW5kZXgsCisgICAgICAgICAgICAvLyAgIHMtPndyaXRlX3Bvcywgcy0+d3JpdGVfc2l6ZSwgd2F2X3NhbXBsZXMsIHdhdl9ieXRlcywgbGl2ZSwgaHctPnJwb3MsIGh3LT5zYW1wbGVzKTsKKyAgICAgICAgICAgIGh3LT5jbGlwIChkc3QsIHNyYywgd2F2X3NhbXBsZXMpOworICAgICAgICAgICAgaHctPnJwb3MgKz0gd2F2X3NhbXBsZXM7CisgICAgICAgICAgICBpZiAoaHctPnJwb3MgPj0gaHctPnNhbXBsZXMpCisgICAgICAgICAgICAgICAgICAgIGh3LT5ycG9zIC09IGh3LT5zYW1wbGVzOworCisgICAgICAgICAgICBsaXZlICAgICAgICAgLT0gd2F2X3NhbXBsZXM7CisgICAgICAgICAgICBwbGF5ZWQgICAgICAgKz0gd2F2X3NhbXBsZXM7CisgICAgICAgICAgICBzLT53cml0ZV9wb3MgKz0gd2F2X2J5dGVzOworICAgICAgICAgICAgaWYgKHMtPndyaXRlX3BvcyA9PSBzLT53cml0ZV9zaXplKSB7CisjaWYgeHhERUJVRworICAgICAgICAgICAgICAgIGludDY0X3QgIG5vdyAgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpIC0gc3RhcnRfdGltZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICBkaWZmID0gbm93IC0gbGFzdF90aW1lOworCisgICAgICAgICAgICAgICAgRCgicnVuX291dDogKCU3LjNmOiU3ZCk6d2F2ZU91dFdyaXRlIGJ1ZmZlcjolZFxuIiwKKyAgICAgICAgICAgICAgICAgICBub3cvMWU5LCAobm93LWxhc3RfdGltZSkvMWU5LCBzLT53cml0ZV9pbmRleCk7CisgICAgICAgICAgICAgICAgbGFzdF90aW1lID0gbm93OworI2VuZGlmCisgICAgICAgICAgICAgICAgd2F2ZU91dFdyaXRlKCBzLT53YXZlb3V0LCB3YXZfYnVmZmVyLCBzaXplb2YoKndhdl9idWZmZXIpICk7CisgICAgICAgICAgICAgICAgcy0+d3JpdGVfcG9zICAgID0gMDsKKyAgICAgICAgICAgICAgICBzLT53cml0ZV9pbmRleCArPSAxOworICAgICAgICAgICAgICAgIGlmIChzLT53cml0ZV9pbmRleCA9PSBOVU1fT1VUX0JVRkZFUlMpCisgICAgICAgICAgICAgICAgICAgIHMtPndyaXRlX2luZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworICAgICAgICAgICAgICAgIGlmICgtLXMtPndyaXRlX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpdmUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybiBwbGF5ZWQ7Cit9CisKK3N0YXRpYyBpbnQKK3dpbmF1ZGlvX291dF9jdGwgKEhXVm9pY2VPdXQgKmh3LCBpbnQgY21kLCAuLi4pCit7CisgICAgV2luQXVkaW9PdXQqICBzID0gKFdpbkF1ZGlvT3V0KikgaHc7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgVk9JQ0VfRU5BQkxFOgorICAgICAgICB3YXZlT3V0UmVzdGFydCggcy0+d2F2ZW91dCApOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVk9JQ0VfRElTQUJMRToKKyAgICAgICAgd2F2ZU91dFBhdXNlKCBzLT53YXZlb3V0ICk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqIEFVRElPIElOCisgKiovCisKKyNkZWZpbmUgIE5VTV9JTl9CVUZGRVJTICAyCisKK3R5cGVkZWYgc3RydWN0IFdpbkF1ZGlvSW4geworICAgIEhXVm9pY2VJbiAgICAgICAgIGh3OworICAgIEhXQVZFSU4gICAgICAgICAgIHdhdmVpbjsKKyAgICBDUklUSUNBTF9TRUNUSU9OICBsb2NrOworICAgIHVuc2lnbmVkIGNoYXIqICAgIGJ1ZmZlcl9ieXRlczsKKyAgICBXQVZFSERSICAgICAgICAgICBidWZmZXJzWyBOVU1fSU5fQlVGRkVSUyBdOworICAgIGludCAgICAgICAgICAgICAgIHJlYWRfaW5kZXg7CisgICAgaW50ICAgICAgICAgICAgICAgcmVhZF9jb3VudDsKKyAgICBpbnQgICAgICAgICAgICAgICByZWFkX3BvczsKKyAgICBpbnQgICAgICAgICAgICAgICByZWFkX3NpemU7Cit9IFdpbkF1ZGlvSW47CisKKy8qIFRoZSBXaW4zMiBjYWxsYmFjayB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgYnVmZmVyIGhhcyBmaW5pc2hlZCBwbGF5aW5nICovCitzdGF0aWMgdm9pZCBDQUxMQkFDSword2luYXVkaW9faW5fYnVmZmVyX2RvbmUgKEhXQVZFSU4gaHdpLCBVSU5UIHVNc2csIERXT1JEX1BUUiBkd0luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKK3sKKyAgICBXaW5BdWRpb0luKiAgcyA9IChXaW5BdWRpb0luKikgZHdJbnN0YW5jZTsKKworICAgIC8qIE9ubHkgc2VydmljZSAiYnVmZmVyIGRvbmUgcGxheWluZyIgbWVzc2FnZXMgKi8KKyAgICBpZiAoIHVNc2cgIT0gV0lNX0RBVEEgKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBTaWduYWwgdGhhdCB3ZSBhcmUgZG9uZSBwbGF5aW5nIGEgYnVmZmVyICovCisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZzLT5sb2NrICk7CisgICAgaWYgKHMtPnJlYWRfY291bnQgPCBOVU1fSU5fQlVGRkVSUykKKyAgICAgICAgcy0+cmVhZF9jb3VudCArPSAxOworICAgICAgICAvL0QoIi4lYyIscy0+cmVhZF9jb3VudCArICcwJyk7IGZmbHVzaChzdGRvdXQpOworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworfQorCitzdGF0aWMgdm9pZAord2luYXVkaW9faW5fZmluaSAoSFdWb2ljZUluICpodykKK3sKKyAgICBXaW5BdWRpb0luKiAgcyA9IChXaW5BdWRpb0luKikgaHc7CisgICAgaW50ICAgICAgICAgICBpOworCisgICAgaWYgKHMtPndhdmVpbikgeworICAgICAgICB3YXZlSW5SZXNldChzLT53YXZlaW4pOworICAgICAgICAgICAgcy0+d2F2ZWluID0gMDsKKyAgICB9CisKKyAgICBmb3IgKCBpPTA7IGk8TlVNX0lOX0JVRkZFUlM7ICsraSApIHsKKyAgICAgICAgaWYgKCBzLT5idWZmZXJzW2ldLmR3VXNlciAhPSAweEZGRkYgKSB7CisgICAgICAgICAgICB3YXZlSW5VbnByZXBhcmVIZWFkZXIoCisgICAgICAgICAgICAgICAgcy0+d2F2ZWluLCAmcy0+YnVmZmVyc1tpXSwgc2l6ZW9mKHMtPmJ1ZmZlcnNbaV0pICk7CisgICAgICAgICAgICAgICAgcy0+YnVmZmVyc1tpXS5kd1VzZXIgPSAweEZGRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+YnVmZmVyX2J5dGVzICE9IE5VTEwpIHsKKyAgICAgICAgZ19mcmVlKHMtPmJ1ZmZlcl9ieXRlcyk7CisgICAgICAgIHMtPmJ1ZmZlcl9ieXRlcyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHMtPndhdmVpbikgeworICAgICAgICB3YXZlSW5DbG9zZShzLT53YXZlaW4pOworICAgICAgICBzLT53YXZlaW4gPSBOVUxMOworICAgIH0KK30KKworCitzdGF0aWMgaW50Cit3aW5hdWRpb19pbl9pbml0IChIV1ZvaWNlSW4gKmh3LCBzdHJ1Y3QgYXVkc2V0dGluZ3MgKmFzKQoreworICAgIFdpbkF1ZGlvSW4qICAgcyA9IChXaW5BdWRpb0luKikgaHc7CisgICAgTU1SRVNVTFQgICAgICAgcmVzdWx0OworICAgIFdBVkVGT1JNQVRFWCAgIGZvcm1hdDsKKyAgICBpbnQgICAgICAgICAgICBzaGlmdCwgaSwgc2FtcGxlc19zaXplOworCisgICAgcy0+d2F2ZWluID0gTlVMTDsKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fSU5fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgICAgICBzLT5idWZmZXJzW2ldLmR3VXNlciA9IDB4RkZGRjsKKyAgICB9CisgICAgcy0+YnVmZmVyX2J5dGVzID0gTlVMTDsKKworICAgIC8qIGNvbXB1dGUgZGVzaXJlZCB3YXZlIGlucHV0IGZvcm1hdCAqLworICAgIGZvcm1hdC53Rm9ybWF0VGFnICAgICAgPSBXQVZFX0ZPUk1BVF9QQ007CisgICAgZm9ybWF0Lm5DaGFubmVscyAgICAgICA9IGFzLT5uY2hhbm5lbHM7CisgICAgZm9ybWF0Lm5TYW1wbGVzUGVyU2VjICA9IGFzLT5mcmVxOworICAgIGZvcm1hdC5uQXZnQnl0ZXNQZXJTZWMgPSBhcy0+ZnJlcSphcy0+bmNoYW5uZWxzOworCisgICAgc3dpdGNoIChhcy0+Zm10KSB7CisgICAgICAgIGNhc2UgQVVEX0ZNVF9TODogICBzaGlmdCA9IDA7IGJyZWFrOworICAgICAgICBjYXNlIEFVRF9GTVRfVTg6ICAgc2hpZnQgPSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBBVURfRk1UX1MxNjogIHNoaWZ0ID0gMTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVVEX0ZNVF9VMTY6ICBzaGlmdCA9IDE7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiB3aW5hdWRpbzogQmFkIGlucHV0IGF1ZGlvIGZvcm1hdDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGFzLT5mbXQpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3JtYXQubkF2Z0J5dGVzUGVyU2VjID0gKGZvcm1hdC5uU2FtcGxlc1BlclNlYyAqIGZvcm1hdC5uQ2hhbm5lbHMpIDw8IHNoaWZ0OworICAgIGZvcm1hdC5uQmxvY2tBbGlnbiAgICAgPSBmb3JtYXQubkNoYW5uZWxzIDw8IHNoaWZ0OworICAgIGZvcm1hdC53Qml0c1BlclNhbXBsZSAgPSA4IDw8IHNoaWZ0OworICAgIGZvcm1hdC5jYlNpemUgICAgICAgICAgPSAwOworCisgICAgLyogb3BlbiB0aGUgd2F2ZSBpbiBkZXZpY2UgKi8KKyAgICByZXN1bHQgPSB3YXZlSW5PcGVuKCAmcy0+d2F2ZWluLCBXQVZFX01BUFBFUiwgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkRfUFRSKXdpbmF1ZGlvX2luX2J1ZmZlcl9kb25lLCAoRFdPUkRfUFRSKSBodywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GVU5DVElPTik7CisgICAgaWYgKCByZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApIHsKKyAgICAgICAgZHVtcF9tbWVycm9yKCAicWVtdTogd2luYXVkaW86IHdhdmVJbk9wZW4oKSIsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc2FtcGxlc19zaXplICAgID0gZm9ybWF0Lm5CbG9ja0FsaWduICogY29uZi5uYl9zYW1wbGVzOworICAgIHMtPmJ1ZmZlcl9ieXRlcyA9IGdfbWFsbG9jKCBOVU1fSU5fQlVGRkVSUyAqIHNhbXBsZXNfc2l6ZSApOworICAgIGlmIChzLT5idWZmZXJfYnl0ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgd2F2ZUluQ2xvc2UoIHMtPndhdmVpbiApOworICAgICAgICAgICAgcy0+d2F2ZWluID0gTlVMTDsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGVub3VnaCBtZW1vcnkgZm9yIFdpbmRvd3MgYXVkaW8gYnVmZmVyc1xuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9JTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCAmcy0+YnVmZmVyc1tpXSwgMCwgc2l6ZW9mKHMtPmJ1ZmZlcnNbaV0pICk7CisgICAgICAgIHMtPmJ1ZmZlcnNbaV0ubHBEYXRhICAgICAgICAgPSAoTFBTVFIpKHMtPmJ1ZmZlcl9ieXRlcyArIGkqc2FtcGxlc19zaXplKTsKKyAgICAgICAgcy0+YnVmZmVyc1tpXS5kd0J1ZmZlckxlbmd0aCA9IHNhbXBsZXNfc2l6ZTsKKyAgICAgICAgcy0+YnVmZmVyc1tpXS5kd0ZsYWdzICAgICAgICA9IFdIRFJfRE9ORTsKKworICAgICAgICByZXN1bHQgPSB3YXZlSW5QcmVwYXJlSGVhZGVyKCBzLT53YXZlaW4sICZzLT5idWZmZXJzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzLT5idWZmZXJzW2ldKSApOworICAgICAgICBpZiAoIHJlc3VsdCAhPSBNTVNZU0VSUl9OT0VSUk9SICkgeworICAgICAgICAgICAgICAgIGR1bXBfbW1lcnJvcigid2F2ZUluUHJlcGFyZUhlYWRlcigpIiwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSB3YXZlSW5BZGRCdWZmZXIoIHMtPndhdmVpbiwgJnMtPmJ1ZmZlcnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+YnVmZmVyc1tpXSkgKTsKKyAgICAgICAgaWYgKCByZXN1bHQgIT0gTU1TWVNFUlJfTk9FUlJPUiApIHsKKyAgICAgICAgICAgIGR1bXBfbW1lcnJvcigid2F2ZUluQWRkQnVmZmVyKCkiLCByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisjaWYgREVCVUcKKyAgICAvKiBDaGVjayB0aGUgc291bmQgZGV2aWNlIHdlIHJldHJpZXZlZCAqLworICAgIHsKKyAgICAgICAgV0FWRUlOQ0FQUyBjYXBzOworCisgICAgICAgIHJlc3VsdCA9IHdhdmVJbkdldERldkNhcHMoKFVJTlQpIHMtPndhdmVpbiwgJmNhcHMsIHNpemVvZihjYXBzKSk7CisgICAgICAgIGlmICggcmVzdWx0ICE9IE1NU1lTRVJSX05PRVJST1IgKSB7CisgICAgICAgICAgICBkdW1wX21tZXJyb3IoIndhdmVJbkdldERldkNhcHMoKSIsIHJlc3VsdCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJBdWRpbyBpbiBkZXZpY2U6ICVzXG4iLCBjYXBzLnN6UG5hbWUpOworICAgIH0KKyNlbmRpZgorCisgICAgYXVkaW9fcGNtX2luaXRfaW5mbyAoJmh3LT5pbmZvLCBhcyk7CisgICAgaHctPnNhbXBsZXMgPSBjb25mLm5iX3NhbXBsZXMqMjsKKworICAgIHMtPnJlYWRfaW5kZXggPSAwOworICAgIHMtPnJlYWRfY291bnQgPSAwOworICAgIHMtPnJlYWRfcG9zICAgPSAwOworICAgIHMtPnJlYWRfc2l6ZSAgPSBzYW1wbGVzX3NpemU7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyogcmVwb3J0IHRoZSBudW1iZXIgb2YgY2FwdHVyZWQgc2FtcGxlcyB0byB0aGUgYXVkaW8gc3Vic3lzdGVtICovCitzdGF0aWMgaW50Cit3aW5hdWRpb19pbl9ydW4gKEhXVm9pY2VJbiAqaHcpCit7CisgICAgV2luQXVkaW9JbiogIHMgICAgICAgID0gKFdpbkF1ZGlvSW4qKSBodzsKKyAgICBpbnQgICAgICAgICAgY2FwdHVyZWQgPSAwOworICAgIGludCAgICAgICAgICBoYXNfYnVmZmVyOworICAgIGludCAgICAgICAgICBsaXZlID0gaHctPnNhbXBsZXMgLSBody0+dG90YWxfc2FtcGxlc19jYXB0dXJlZDsKKworICAgIGlmICghbGl2ZSkgeworI2lmIDAKKyAgICAgICAgc3RhdGljIGludCAgY291bnRlcjsKKyAgICAgICAgaWYgKCsrY291bnRlciA9PSAxMDApIHsKKyAgICAgICAgICAgIEQoIjAiKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICBjb3VudGVyID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKKyAgICBoYXNfYnVmZmVyID0gKHMtPnJlYWRfY291bnQgPiAwKTsKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKKworICAgIGlmIChoYXNfYnVmZmVyID4gMCkgeworICAgICAgICB3aGlsZSAobGl2ZSA+IDApIHsKKyAgICAgICAgICAgIFdBVkVIRFIqICAgICAgd2F2X2J1ZmZlciAgPSBzLT5idWZmZXJzICsgcy0+cmVhZF9pbmRleDsKKyAgICAgICAgICAgIGludCAgICAgICAgICAgd2F2X2J5dGVzICAgPSAocy0+cmVhZF9zaXplIC0gcy0+cmVhZF9wb3MpOworICAgICAgICAgICAgaW50ICAgICAgICAgICB3YXZfc2FtcGxlcyA9IGF1ZGlvX01JTih3YXZfYnl0ZXMgPj4gaHctPmluZm8uc2hpZnQsIGxpdmUpOworICAgICAgICAgICAgaW50ICAgICAgICAgICBod19zYW1wbGVzICA9IGF1ZGlvX01JTihody0+c2FtcGxlcyAtIGh3LT53cG9zLCBsaXZlKTsKKyAgICAgICAgICAgIHN0cnVjdCBzdF9zYW1wbGUqICBkc3QgICAgPSBody0+Y29udl9idWYgKyBody0+d3BvczsKKyAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgc3JjICAgICAgICAgPSAodWludDhfdCopd2F2X2J1ZmZlci0+bHBEYXRhICsgcy0+cmVhZF9wb3M7CisKKyAgICAgICAgICAgIGlmICh3YXZfc2FtcGxlcyA+IGh3X3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICB3YXZfc2FtcGxlcyA9IGh3X3NhbXBsZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdhdl9ieXRlcyA9IHdhdl9zYW1wbGVzIDw8IGh3LT5pbmZvLnNoaWZ0OworCisgICAgICAgICAgICBEKCIlczogYnVmZmVyOiVkIHBvczolZCBzaXplOiVkIHdzYW1wbGVzOiVkIHdieXRlczolZCBsaXZlOiVkIHdwb3M6JWQgaHdzYW1wbGVzOiVkXG4iLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzLT5yZWFkX2luZGV4LCBzLT5yZWFkX3Bvcywgcy0+cmVhZF9zaXplLCB3YXZfc2FtcGxlcywgd2F2X2J5dGVzLCBsaXZlLAorICAgICAgICAgICAgICAgaHctPndwb3MsIGh3LT5zYW1wbGVzKTsKKworICAgICAgICAgICAgaHctPmNvbnYoZHN0LCBzcmMsIHdhdl9zYW1wbGVzLCAmbm9taW5hbF92b2x1bWUpOworCisgICAgICAgICAgICBody0+d3BvcyArPSB3YXZfc2FtcGxlczsKKyAgICAgICAgICAgIGlmIChody0+d3BvcyA+PSBody0+c2FtcGxlcykKKyAgICAgICAgICAgICAgICBody0+d3BvcyAtPSBody0+c2FtcGxlczsKKworICAgICAgICAgICAgbGl2ZSAgICAgICAgLT0gd2F2X3NhbXBsZXM7CisgICAgICAgICAgICBjYXB0dXJlZCAgICArPSB3YXZfc2FtcGxlczsKKyAgICAgICAgICAgIHMtPnJlYWRfcG9zICs9IHdhdl9ieXRlczsKKyAgICAgICAgICAgIGlmIChzLT5yZWFkX3BvcyA9PSBzLT5yZWFkX3NpemUpIHsKKyAgICAgICAgICAgICAgICBzLT5yZWFkX3BvcyAgICA9IDA7CisgICAgICAgICAgICAgICAgcy0+cmVhZF9pbmRleCArPSAxOworICAgICAgICAgICAgICAgIGlmIChzLT5yZWFkX2luZGV4ID09IE5VTV9JTl9CVUZGRVJTKQorICAgICAgICAgICAgICAgICAgICBzLT5yZWFkX2luZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIHdhdmVJbkFkZEJ1ZmZlciggcy0+d2F2ZWluLCB3YXZfYnVmZmVyLCBzaXplb2YoKndhdl9idWZmZXIpICk7CisKKyAgICAgICAgICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJnMtPmxvY2sgKTsKKyAgICAgICAgICAgICAgICBpZiAoLS1zLT5yZWFkX2NvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmcy0+bG9jayApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAgY2FwdHVyZWQ7Cit9CisKKworc3RhdGljIGludAord2luYXVkaW9faW5fcmVhZCAoU1dWb2ljZUluICpzdywgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCAgcmV0ID0gYXVkaW9fcGNtX3N3X3JlYWQgKHN3LCBidWYsIGxlbik7CisgICAgaWYgKHJldCA+IDApCisgICAgICAgIEQoIiVzOiAoJWQpIHJldHVybmVkICVkXG4iLCBfX0ZVTkNUSU9OX18sIGxlbiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQKK3dpbmF1ZGlvX2luX2N0bCAoSFdWb2ljZUluICpodywgaW50IGNtZCwgLi4uKQoreworCVdpbkF1ZGlvSW4qICBzID0gKFdpbkF1ZGlvSW4qKSBodzsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBWT0lDRV9FTkFCTEU6CisgICAgICAgIEQoIiVzOiBlbmFibGUgYXVkaW8gaW5cbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHdhdmVJblN0YXJ0KCBzLT53YXZlaW4gKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFZPSUNFX0RJU0FCTEU6CisgICAgICAgIEQoIiVzOiBkaXNhYmxlIGF1ZGlvIGluXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB3YXZlSW5TdG9wKCBzLT53YXZlaW4gKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiogQVVESU8gU1RBVEUKKyAqKi8KKwordHlwZWRlZiBzdHJ1Y3QgV2luQXVkaW9TdGF0ZSB7CisgICAgaW50ICBkdW1teTsKK30gV2luQXVkaW9TdGF0ZTsKKworc3RhdGljIFdpbkF1ZGlvU3RhdGUgIGdfd2luYXVkaW87CisKK3N0YXRpYyB2b2lkKgord2luYXVkaW9faW5pdCh2b2lkKQoreworICAgIFdpbkF1ZGlvU3RhdGUqICBzID0gJmdfd2luYXVkaW87CisKKyNpZiBERUJVRworICAgIHN0YXJ0X3RpbWUgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgIGxhc3RfdGltZSAgPSAwOworI2VuZGlmCisKKyAgICByZXR1cm4gczsKK30KKworCitzdGF0aWMgdm9pZAord2luYXVkaW9fZmluaSAodm9pZCAqb3BhcXVlKQoreworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX29wdGlvbiB3aW5hdWRpb19vcHRpb25zW10gPSB7CisgICAgeyJTQU1QTEVTIiwgQVVEX09QVF9JTlQsICZjb25mLm5iX3NhbXBsZXMsCisgICAgICJTaXplIG9mIFdpbmRvd3MgYXVkaW8gYnVmZmVyIGluIHNhbXBsZXMiLCBOVUxMLCAwfSwKKyAgICB7TlVMTCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgMH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fcGNtX29wcyB3aW5hdWRpb19wY21fb3BzID0geworICAgIHdpbmF1ZGlvX291dF9pbml0LAorICAgIHdpbmF1ZGlvX291dF9maW5pLAorICAgIHdpbmF1ZGlvX291dF9ydW4sCisgICAgd2luYXVkaW9fb3V0X3dyaXRlLAorICAgIHdpbmF1ZGlvX291dF9jdGwsCisKKyAgICB3aW5hdWRpb19pbl9pbml0LAorICAgIHdpbmF1ZGlvX2luX2ZpbmksCisgICAgd2luYXVkaW9faW5fcnVuLAorICAgIHdpbmF1ZGlvX2luX3JlYWQsCisgICAgd2luYXVkaW9faW5fY3RsCit9OworCitzdHJ1Y3QgYXVkaW9fZHJpdmVyIHdpbl9hdWRpb19kcml2ZXIgPSB7CisgICAgSU5JVF9GSUVMRCAobmFtZSAgICAgICAgICAgPSApICJ3aW5hdWRpbyIsCisgICAgSU5JVF9GSUVMRCAoZGVzY3IgICAgICAgICAgPSApICJXaW5kb3dzIHdhdmUgYXVkaW8iLAorICAgIElOSVRfRklFTEQgKG9wdGlvbnMgICAgICAgID0gKSB3aW5hdWRpb19vcHRpb25zLAorICAgIElOSVRfRklFTEQgKGluaXQgICAgICAgICAgID0gKSB3aW5hdWRpb19pbml0LAorICAgIElOSVRfRklFTEQgKGZpbmkgICAgICAgICAgID0gKSB3aW5hdWRpb19maW5pLAorICAgIElOSVRfRklFTEQgKHBjbV9vcHMgICAgICAgID0gKSAmd2luYXVkaW9fcGNtX29wcywKKyAgICBJTklUX0ZJRUxEIChjYW5fYmVfZGVmYXVsdCA9ICkgMSwKKyAgICBJTklUX0ZJRUxEIChtYXhfdm9pY2VzX291dCA9ICkgMSwKKyAgICBJTklUX0ZJRUxEIChtYXhfdm9pY2VzX2luICA9ICkgMSwKKyAgICBJTklUX0ZJRUxEICh2b2ljZV9zaXplX291dCA9ICkgc2l6ZW9mIChXaW5BdWRpb091dCksCisgICAgSU5JVF9GSUVMRCAodm9pY2Vfc2l6ZV9pbiAgPSApIHNpemVvZiAoV2luQXVkaW9JbikKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Fsc2EuYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvYWxzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTgxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Fsc2EuYwpAQCAtMCwwICsxLDIzMyBAQAorLy8gQXV0by1nZW5lcmF0ZWQgd2l0aDogYW5kcm9pZC9zY3JpcHRzL2dlbi1lbnRyaWVzLnB5IC0tbW9kZT13cmFwcGVyIGF1ZGlvL3dyYXBwZXJzL2Fsc2EuZW50cmllcworLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGFsc2EvYXNvdW5kbGliLmg+CisKKy8vLworLy8vICBXIFIgQSBQIFAgRSBSICAgUCBPIEkgTiBUIEUgUiBTCisvLy8KKworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqX19kbGxfc25kX3BjbV9hdmFpbF91cGRhdGUpKHNuZF9wY21fdCAqIHBjbSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21fY2xvc2UpKHNuZF9wY21fdCAqIHBjbSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21fZHJvcCkoc25kX3BjbV90ICogcGNtKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9od19wYXJhbXMpKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcykgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21faHdfcGFyYW1zX2FueSkoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqIHZhbCkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21faHdfcGFyYW1zX2dldF9mb3JtYXQpKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgKiB2YWwpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgX2FjY2VzcykgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICogdmFsKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIpKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgdW5zaWduZWQgaW50ICogdmFsLCBpbnQgKiBkaXIpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhcikoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIpKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKiB2YWwsIGludCAqIGRpcikgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHVuc2lnbmVkIGludCAqIHZhbCwgaW50ICogZGlyKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcikoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwsIGludCAqIGRpcikgPSAwOworc3RhdGljIHNpemVfdCAoKl9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NpemVvZikoKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9vcGVuKShzbmRfcGNtX3QgKiogcGNtLCBjb25zdCBjaGFyICogbmFtZSwgc25kX3BjbV9zdHJlYW1fdCBzdHJlYW0sIGludCBtb2RlKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzKShzbmRfcGNtX3QgKiBwY20sIHN0cnVjdCBwb2xsZmQgKiBwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfY291bnQpKHNuZF9wY21fdCAqIHBjbSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKShzbmRfcGNtX3QgKiBwY20sIHN0cnVjdCBwb2xsZmQgKiBwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKiByZXZlbnRzKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9wcmVwYXJlKShzbmRfcGNtX3QgKiBwY20pID0gMDsKK3N0YXRpYyBzbmRfcGNtX3NmcmFtZXNfdCAoKl9fZGxsX3NuZF9wY21fcmVhZGkpKHNuZF9wY21fdCAqIHBjbSwgdm9pZCAqIGJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3NuZF9wY21fcmVzdW1lKShzbmRfcGNtX3QgKiBwY20pID0gMDsKK3N0YXRpYyBzbmRfcGNtX3N0YXRlX3QgKCpfX2RsbF9zbmRfcGNtX3N0YXRlKShzbmRfcGNtX3QgKiBwY20pID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zbmRfcGNtX3N3X3BhcmFtcykoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICogcGFyYW1zKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCkoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICogcGFyYW1zKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfc25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCkoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpID0gMDsKK3N0YXRpYyBzaXplX3QgKCpfX2RsbF9zbmRfcGNtX3N3X3BhcmFtc19zaXplb2YpKCkgPSAwOworc3RhdGljIHNuZF9wY21fc2ZyYW1lc190ICgqX19kbGxfc25kX3BjbV93cml0ZWkpKHNuZF9wY21fdCAqIHBjbSwgY29uc3Qgdm9pZCAqIGJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkgPSAwOworc3RhdGljIGNvbnN0IGNoYXIgKiAoKl9fZGxsX3NuZF9zdHJlcnJvcikoaW50IGVycm51bSkgPSAwOworCisvLy8KKy8vLyAgVyBSIEEgUCBQIEUgUiAgIEYgVSBOIEMgVCBJIE8gTiBTCisvLy8KKworc25kX3BjbV9zZnJhbWVzX3Qgc25kX3BjbV9hdmFpbF91cGRhdGUoc25kX3BjbV90ICogcGNtKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2F2YWlsX3VwZGF0ZShwY20pOworfQorCitpbnQgc25kX3BjbV9jbG9zZShzbmRfcGNtX3QgKiBwY20pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fY2xvc2UocGNtKTsKK30KKworaW50IHNuZF9wY21fZHJvcChzbmRfcGNtX3QgKiBwY20pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fZHJvcChwY20pOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXMoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtcyhwY20sIHBhcmFtcyk7Cit9CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19hbnkoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19hbnkocGNtLCBwYXJhbXMpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2J1ZmZlcl9zaXplKGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICogdmFsKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUocGFyYW1zLCB2YWwpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdChjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90ICogdmFsKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0KHBhcmFtcywgdmFsKTsKK30KKworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3Moc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX2FjY2Vzc190IF9hY2Nlc3MpIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MocGNtLCBwYXJhbXMsIF9hY2Nlc3MpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqIHZhbCkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIocGNtLCBwYXJhbXMsIHZhbCk7Cit9CisKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHVuc2lnbmVkIGludCAqIHZhbCwgaW50ICogZGlyKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfYnVmZmVyX3RpbWVfbmVhcihwY20sIHBhcmFtcywgdmFsLCBkaXIpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXIoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwpIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyKHBjbSwgcGFyYW1zLCB2YWwpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fZm9ybWF0X3QgdmFsKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KHBjbSwgcGFyYW1zLCB2YWwpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqIHZhbCwgaW50ICogZGlyKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfcGVyaW9kX3NpemVfbmVhcihwY20sIHBhcmFtcywgdmFsLCBkaXIpOworfQorCitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwsIGludCAqIGRpcikgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIocGNtLCBwYXJhbXMsIHZhbCwgZGlyKTsKK30KKworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwsIGludCAqIGRpcikgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcihwY20sIHBhcmFtcywgdmFsLCBkaXIpOworfQorCitzaXplX3Qgc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mKCkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mKCk7Cit9CisKK2ludCBzbmRfcGNtX29wZW4oc25kX3BjbV90ICoqIHBjbSwgY29uc3QgY2hhciAqIG5hbWUsIHNuZF9wY21fc3RyZWFtX3Qgc3RyZWFtLCBpbnQgbW9kZSkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9vcGVuKHBjbSwgbmFtZSwgc3RyZWFtLCBtb2RlKTsKK30KKworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9ycyhzbmRfcGNtX3QgKiBwY20sIHN0cnVjdCBwb2xsZmQgKiBwZmRzLCB1bnNpZ25lZCBpbnQgc3BhY2UpIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fcG9sbF9kZXNjcmlwdG9ycyhwY20sIHBmZHMsIHNwYWNlKTsKK30KKworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19jb3VudChzbmRfcGNtX3QgKiBwY20pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19jb3VudChwY20pOworfQorCitpbnQgc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMoc25kX3BjbV90ICogcGNtLCBzdHJ1Y3QgcG9sbGZkICogcGZkcywgdW5zaWduZWQgaW50IG5mZHMsIHVuc2lnbmVkIHNob3J0ICogcmV2ZW50cykgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMocGNtLCBwZmRzLCBuZmRzLCByZXZlbnRzKTsKK30KKworaW50IHNuZF9wY21fcHJlcGFyZShzbmRfcGNtX3QgKiBwY20pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fcHJlcGFyZShwY20pOworfQorCitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3JlYWRpKHNuZF9wY21fdCAqIHBjbSwgdm9pZCAqIGJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9yZWFkaShwY20sIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK2ludCBzbmRfcGNtX3Jlc3VtZShzbmRfcGNtX3QgKiBwY20pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9wY21fcmVzdW1lKHBjbSk7Cit9CisKK3NuZF9wY21fc3RhdGVfdCBzbmRfcGNtX3N0YXRlKHNuZF9wY21fdCAqIHBjbSkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9zdGF0ZShwY20pOworfQorCitpbnQgc25kX3BjbV9zd19wYXJhbXMoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICogcGFyYW1zKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX3N3X3BhcmFtcyhwY20sIHBhcmFtcyk7Cit9CisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19jdXJyZW50KHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqIHBhcmFtcykgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9zd19wYXJhbXNfY3VycmVudChwY20sIHBhcmFtcyk7Cit9CisKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqIHBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKSB7CisgIHJldHVybiBfX2RsbF9zbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkKHBjbSwgcGFyYW1zLCB2YWwpOworfQorCitzaXplX3Qgc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKCkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mKCk7Cit9CisKK3NuZF9wY21fc2ZyYW1lc190IHNuZF9wY21fd3JpdGVpKHNuZF9wY21fdCAqIHBjbSwgY29uc3Qgdm9pZCAqIGJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkgeworICByZXR1cm4gX19kbGxfc25kX3BjbV93cml0ZWkocGNtLCBidWZmZXIsIHNpemUpOworfQorCitjb25zdCBjaGFyICogc25kX3N0cmVycm9yKGludCBlcnJudW0pIHsKKyAgcmV0dXJuIF9fZGxsX3NuZF9zdHJlcnJvcihlcnJudW0pOworfQorCisKKy8vLworLy8vICBJIE4gSSBUIEkgQSBMIEkgWiBBIFQgSSBPIE4gICBGIFUgTiBDIFQgSSBPIE4KKy8vLworCitpbnQgYWxzYV9keW5saW5rX2luaXQodm9pZCogbGliKSB7CisgIF9fZGxsX3NuZF9wY21fYXZhaWxfdXBkYXRlID0gKHNuZF9wY21fc2ZyYW1lc190KCopKHNuZF9wY21fdCAqIHBjbSkpZGxzeW0obGliLCAic25kX3BjbV9hdmFpbF91cGRhdGUiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX2F2YWlsX3VwZGF0ZSkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX2Nsb3NlID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20pKWRsc3ltKGxpYiwgInNuZF9wY21fY2xvc2UiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX2Nsb3NlKSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21fZHJvcCA9IChpbnQoKikoc25kX3BjbV90ICogcGNtKSlkbHN5bShsaWIsICJzbmRfcGNtX2Ryb3AiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX2Ryb3ApIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXMgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcykpZGxzeW0obGliLCAic25kX3BjbV9od19wYXJhbXMiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX2h3X3BhcmFtcykgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19hbnkgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcykpZGxzeW0obGliLCAic25kX3BjbV9od19wYXJhbXNfYW55Iik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfYW55KSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZSA9IChpbnQoKikoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKiB2YWwpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZSIpOworICBpZiAoIV9fZGxsX3NuZF9wY21faHdfcGFyYW1zX2dldF9idWZmZXJfc2l6ZSkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0ID0gKGludCgqKShjb25zdCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90ICogdmFsKSlkbHN5bShsaWIsICJzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0Iik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfZ2V0X2Zvcm1hdCkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgX2FjY2VzcykpZGxzeW0obGliLCAic25kX3BjbV9od19wYXJhbXNfc2V0X2FjY2VzcyIpOworICBpZiAoIV9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9hY2Nlc3MpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKiB2YWwpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfc2l6ZV9uZWFyIik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgdW5zaWduZWQgaW50ICogdmFsLCBpbnQgKiBkaXIpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NldF9idWZmZXJfdGltZV9uZWFyIik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X2NoYW5uZWxzX25lYXIgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgdW5zaWduZWQgaW50ICogdmFsKSlkbHN5bShsaWIsICJzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhciIpOworICBpZiAoIV9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9jaGFubmVsc19uZWFyKSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCB2YWwpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NldF9mb3JtYXQiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX2h3X3BhcmFtc19zZXRfZm9ybWF0KSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190ICogdmFsLCBpbnQgKiBkaXIpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2Rfc2l6ZV9uZWFyIik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqIHBhcmFtcywgdW5zaWduZWQgaW50ICogdmFsLCBpbnQgKiBkaXIpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyIik7CisgIGlmICghX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF90aW1lX25lYXIpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhciA9IChpbnQoKikoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICogcGFyYW1zLCB1bnNpZ25lZCBpbnQgKiB2YWwsIGludCAqIGRpcikpZGxzeW0obGliLCAic25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhciIpOworICBpZiAoIV9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NldF9yYXRlX25lYXIpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9od19wYXJhbXNfc2l6ZW9mID0gKHNpemVfdCgqKSgpKWRsc3ltKGxpYiwgInNuZF9wY21faHdfcGFyYW1zX3NpemVvZiIpOworICBpZiAoIV9fZGxsX3NuZF9wY21faHdfcGFyYW1zX3NpemVvZikgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX29wZW4gPSAoaW50KCopKHNuZF9wY21fdCAqKiBwY20sIGNvbnN0IGNoYXIgKiBuYW1lLCBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpKWRsc3ltKGxpYiwgInNuZF9wY21fb3BlbiIpOworICBpZiAoIV9fZGxsX3NuZF9wY21fb3BlbikgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnMgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc3RydWN0IHBvbGxmZCAqIHBmZHMsIHVuc2lnbmVkIGludCBzcGFjZSkpZGxzeW0obGliLCAic25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzIik7CisgIGlmICghX19kbGxfc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzKSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19jb3VudCA9IChpbnQoKikoc25kX3BjbV90ICogcGNtKSlkbHN5bShsaWIsICJzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfY291bnQiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfY291bnQpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSwgc3RydWN0IHBvbGxmZCAqIHBmZHMsIHVuc2lnbmVkIGludCBuZmRzLCB1bnNpZ25lZCBzaG9ydCAqIHJldmVudHMpKWRsc3ltKGxpYiwgInNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzIik7CisgIGlmICghX19kbGxfc25kX3BjbV9wb2xsX2Rlc2NyaXB0b3JzX3JldmVudHMpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9wcmVwYXJlID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20pKWRsc3ltKGxpYiwgInNuZF9wY21fcHJlcGFyZSIpOworICBpZiAoIV9fZGxsX3NuZF9wY21fcHJlcGFyZSkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX3JlYWRpID0gKHNuZF9wY21fc2ZyYW1lc190KCopKHNuZF9wY21fdCAqIHBjbSwgdm9pZCAqIGJ1ZmZlciwgc25kX3BjbV91ZnJhbWVzX3Qgc2l6ZSkpZGxzeW0obGliLCAic25kX3BjbV9yZWFkaSIpOworICBpZiAoIV9fZGxsX3NuZF9wY21fcmVhZGkpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9yZXN1bWUgPSAoaW50KCopKHNuZF9wY21fdCAqIHBjbSkpZGxzeW0obGliLCAic25kX3BjbV9yZXN1bWUiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX3Jlc3VtZSkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX3N0YXRlID0gKHNuZF9wY21fc3RhdGVfdCgqKShzbmRfcGNtX3QgKiBwY20pKWRsc3ltKGxpYiwgInNuZF9wY21fc3RhdGUiKTsKKyAgaWYgKCFfX2RsbF9zbmRfcGNtX3N0YXRlKSByZXR1cm4gLTE7CisgIF9fZGxsX3NuZF9wY21fc3dfcGFyYW1zID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKiBwYXJhbXMpKWRsc3ltKGxpYiwgInNuZF9wY21fc3dfcGFyYW1zIik7CisgIGlmICghX19kbGxfc25kX3BjbV9zd19wYXJhbXMpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCA9IChpbnQoKikoc25kX3BjbV90ICogcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICogcGFyYW1zKSlkbHN5bShsaWIsICJzbmRfcGNtX3N3X3BhcmFtc19jdXJyZW50Iik7CisgIGlmICghX19kbGxfc25kX3BjbV9zd19wYXJhbXNfY3VycmVudCkgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX3N3X3BhcmFtc19zZXRfc3RhcnRfdGhyZXNob2xkID0gKGludCgqKShzbmRfcGNtX3QgKiBwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKiBwYXJhbXMsIHNuZF9wY21fdWZyYW1lc190IHZhbCkpZGxzeW0obGliLCAic25kX3BjbV9zd19wYXJhbXNfc2V0X3N0YXJ0X3RocmVzaG9sZCIpOworICBpZiAoIV9fZGxsX3NuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3BjbV9zd19wYXJhbXNfc2l6ZW9mID0gKHNpemVfdCgqKSgpKWRsc3ltKGxpYiwgInNuZF9wY21fc3dfcGFyYW1zX3NpemVvZiIpOworICBpZiAoIV9fZGxsX3NuZF9wY21fc3dfcGFyYW1zX3NpemVvZikgcmV0dXJuIC0xOworICBfX2RsbF9zbmRfcGNtX3dyaXRlaSA9IChzbmRfcGNtX3NmcmFtZXNfdCgqKShzbmRfcGNtX3QgKiBwY20sIGNvbnN0IHZvaWQgKiBidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpKWRsc3ltKGxpYiwgInNuZF9wY21fd3JpdGVpIik7CisgIGlmICghX19kbGxfc25kX3BjbV93cml0ZWkpIHJldHVybiAtMTsKKyAgX19kbGxfc25kX3N0cmVycm9yID0gKGNvbnN0IGNoYXIgKigqKShpbnQgZXJybnVtKSlkbHN5bShsaWIsICJzbmRfc3RyZXJyb3IiKTsKKyAgaWYgKCFfX2RsbF9zbmRfc3RyZXJyb3IpIHJldHVybiAtMTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Fsc2EuZW50cmllcyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvYWxzYS5lbnRyaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2VlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Fsc2EuZW50cmllcwpAQCAtMCwwICsxLDM0IEBACishYWxzYQorJSNpbmNsdWRlIDxhbHNhL2Fzb3VuZGxpYi5oPgorCitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX2F2YWlsX3VwZGF0ZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9jbG9zZShzbmRfcGNtX3QgKnBjbSk7CitpbnQgc25kX3BjbV9kcm9wKHNuZF9wY21fdCAqcGNtKTsKKworaW50IHNuZF9wY21faHdfcGFyYW1zKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21faHdfcGFyYW1zX2FueShzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfYnVmZmVyX3NpemUoY29uc3Qgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX3VmcmFtZXNfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19nZXRfZm9ybWF0KGNvbnN0IHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV9mb3JtYXRfdCAqdmFsKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfYWNjZXNzKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHNuZF9wY21fYWNjZXNzX3QgX2FjY2Vzcyk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2J1ZmZlcl90aW1lX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgdW5zaWduZWQgaW50ICp2YWwsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19zZXRfY2hhbm5lbHNfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X2Zvcm1hdChzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCBzbmRfcGNtX2Zvcm1hdF90IHZhbCk7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3BlcmlvZF9zaXplX25lYXIoc25kX3BjbV90ICpwY20sIHNuZF9wY21faHdfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgKnZhbCwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1zX3NldF9wZXJpb2RfdGltZV9uZWFyKHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX2h3X3BhcmFtc190ICpwYXJhbXMsIHVuc2lnbmVkIGludCAqdmFsLCBpbnQgKmRpcik7CitpbnQgc25kX3BjbV9od19wYXJhbXNfc2V0X3JhdGVfbmVhcihzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9od19wYXJhbXNfdCAqcGFyYW1zLCB1bnNpZ25lZCBpbnQgKnZhbCwgaW50ICpkaXIpOworc2l6ZV90IHNuZF9wY21faHdfcGFyYW1zX3NpemVvZih2b2lkKTsKK2ludCBzbmRfcGNtX29wZW4oc25kX3BjbV90ICoqcGNtLCBjb25zdCBjaGFyICpuYW1lLCBzbmRfcGNtX3N0cmVhbV90IHN0cmVhbSwgaW50IG1vZGUpOworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9ycyhzbmRfcGNtX3QgKnBjbSwgc3RydWN0IHBvbGxmZCAqcGZkcywgdW5zaWduZWQgaW50IHNwYWNlKTsKK2ludCBzbmRfcGNtX3BvbGxfZGVzY3JpcHRvcnNfY291bnQoc25kX3BjbV90ICpwY20pOworaW50IHNuZF9wY21fcG9sbF9kZXNjcmlwdG9yc19yZXZlbnRzKHNuZF9wY21fdCAqcGNtLCBzdHJ1Y3QgcG9sbGZkICpwZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgdW5zaWduZWQgc2hvcnQgKnJldmVudHMpOworaW50IHNuZF9wY21fcHJlcGFyZShzbmRfcGNtX3QgKnBjbSk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3JlYWRpKHNuZF9wY21fdCAqcGNtLCB2b2lkICpidWZmZXIsIHNuZF9wY21fdWZyYW1lc190IHNpemUpOworaW50IHNuZF9wY21fcmVzdW1lKHNuZF9wY21fdCAqcGNtKTsKK3NuZF9wY21fc3RhdGVfdCBzbmRfcGNtX3N0YXRlKHNuZF9wY21fdCAqcGNtKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtcyhzbmRfcGNtX3QgKnBjbSwgc25kX3BjbV9zd19wYXJhbXNfdCAqcGFyYW1zKTsKK2ludCBzbmRfcGNtX3N3X3BhcmFtc19jdXJyZW50KHNuZF9wY21fdCAqcGNtLCBzbmRfcGNtX3N3X3BhcmFtc190ICpwYXJhbXMpOworaW50IHNuZF9wY21fc3dfcGFyYW1zX3NldF9zdGFydF90aHJlc2hvbGQoc25kX3BjbV90ICpwY20sIHNuZF9wY21fc3dfcGFyYW1zX3QgKnBhcmFtcywgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK3NpemVfdCBzbmRfcGNtX3N3X3BhcmFtc19zaXplb2Yodm9pZCk7CitzbmRfcGNtX3NmcmFtZXNfdCBzbmRfcGNtX3dyaXRlaShzbmRfcGNtX3QgKnBjbSwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzbmRfcGNtX3VmcmFtZXNfdCBzaXplKTsKK2NvbnN0IGNoYXIgKnNuZF9zdHJlcnJvcihpbnQgZXJybnVtKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvZXNvdW5kLmMgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Vzb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjMyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Vzb3VuZC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9d3JhcHBlciBhdWRpby93cmFwcGVycy9lc291bmQuZW50cmllcworLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGVzZC5oPgorCisvLy8KKy8vLyAgVyBSIEEgUCBQIEUgUiAgIFAgTyBJIE4gVCBFIFIgUworLy8vCisKK3N0YXRpYyBpbnQgKCpfX2RsbF9lc2Rfb3Blbl9zb3VuZCkoY29uc3QgY2hhciAqIGhvc3QpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9lc2RfcGxheV9zdHJlYW0pKGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCBjb25zdCBjaGFyICogaG9zdCwgY29uc3QgY2hhciAqIG5hbWUpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9lc2RfcmVjb3JkX3N0cmVhbSkoZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIGNvbnN0IGNoYXIgKiBob3N0LCBjb25zdCBjaGFyICogbmFtZSkgPSAwOworCisvLy8KKy8vLyAgVyBSIEEgUCBQIEUgUiAgIEYgVSBOIEMgVCBJIE8gTiBTCisvLy8KKworaW50IGVzZF9vcGVuX3NvdW5kKGNvbnN0IGNoYXIgKiBob3N0KSB7CisgIHJldHVybiBfX2RsbF9lc2Rfb3Blbl9zb3VuZChob3N0KTsKK30KKworaW50IGVzZF9wbGF5X3N0cmVhbShlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgY29uc3QgY2hhciAqIGhvc3QsIGNvbnN0IGNoYXIgKiBuYW1lKSB7CisgIHJldHVybiBfX2RsbF9lc2RfcGxheV9zdHJlYW0oZm9ybWF0LCByYXRlLCBob3N0LCBuYW1lKTsKK30KKworaW50IGVzZF9yZWNvcmRfc3RyZWFtKGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCBjb25zdCBjaGFyICogaG9zdCwgY29uc3QgY2hhciAqIG5hbWUpIHsKKyAgcmV0dXJuIF9fZGxsX2VzZF9yZWNvcmRfc3RyZWFtKGZvcm1hdCwgcmF0ZSwgaG9zdCwgbmFtZSk7Cit9CisKKworLy8vCisvLy8gIEkgTiBJIFQgSSBBIEwgSSBaIEEgVCBJIE8gTiAgIEYgVSBOIEMgVCBJIE8gTgorLy8vCisKK2ludCBlc291bmRfZHlubGlua19pbml0KHZvaWQqIGxpYikgeworICBfX2RsbF9lc2Rfb3Blbl9zb3VuZCA9IChpbnQoKikoY29uc3QgY2hhciAqIGhvc3QpKWRsc3ltKGxpYiwgImVzZF9vcGVuX3NvdW5kIik7CisgIGlmICghX19kbGxfZXNkX29wZW5fc291bmQpIHJldHVybiAtMTsKKyAgX19kbGxfZXNkX3BsYXlfc3RyZWFtID0gKGludCgqKShlc2RfZm9ybWF0X3QgZm9ybWF0LCBpbnQgcmF0ZSwgY29uc3QgY2hhciAqIGhvc3QsIGNvbnN0IGNoYXIgKiBuYW1lKSlkbHN5bShsaWIsICJlc2RfcGxheV9zdHJlYW0iKTsKKyAgaWYgKCFfX2RsbF9lc2RfcGxheV9zdHJlYW0pIHJldHVybiAtMTsKKyAgX19kbGxfZXNkX3JlY29yZF9zdHJlYW0gPSAoaW50KCopKGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCBjb25zdCBjaGFyICogaG9zdCwgY29uc3QgY2hhciAqIG5hbWUpKWRsc3ltKGxpYiwgImVzZF9yZWNvcmRfc3RyZWFtIik7CisgIGlmICghX19kbGxfZXNkX3JlY29yZF9zdHJlYW0pIHJldHVybiAtMTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2F1ZGlvL3dyYXBwZXJzL2Vzb3VuZC5lbnRyaWVzIGIvYW5kcm9pZC9xZW11MS9hdWRpby93cmFwcGVycy9lc291bmQuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQwNzg0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby93cmFwcGVycy9lc291bmQuZW50cmllcwpAQCAtMCwwICsxLDYgQEAKKyFlc291bmQKKyUjaW5jbHVkZSA8ZXNkLmg+CisKK2ludCBlc2Rfb3Blbl9zb3VuZChjb25zdCBjaGFyICpob3N0KTsKK2ludCBlc2RfcGxheV9zdHJlYW0oZXNkX2Zvcm1hdF90IGZvcm1hdCwgaW50IHJhdGUsIGNvbnN0IGNoYXIgKmhvc3QsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGVzZF9yZWNvcmRfc3RyZWFtKGVzZF9mb3JtYXRfdCBmb3JtYXQsIGludCByYXRlLCBjb25zdCBjaGFyICpob3N0LCBjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvcHVsc2UtYXVkaW8uYyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvcHVsc2UtYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU4NTlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby93cmFwcGVycy9wdWxzZS1hdWRpby5jCkBAIC0wLDAgKzEsMjg5IEBACisvLyBBdXRvLWdlbmVyYXRlZCB3aXRoOiBhbmRyb2lkL3NjcmlwdHMvZ2VuLWVudHJpZXMucHkgLS1tb2RlPXdyYXBwZXIgYXVkaW8vd3JhcHBlcnMvcHVsc2UtYXVkaW8uZW50cmllcworLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHB1bHNlL3B1bHNlYXVkaW8uaD4KKworLy8vCisvLy8gIFcgUiBBIFAgUCBFIFIgICBQIE8gSSBOIFQgRSBSIFMKKy8vLworCitzdGF0aWMgaW50ICgqX19kbGxfcGFfY29udGV4dF9jb25uZWN0KShwYV9jb250ZXh0ICogYywgY29uc3QgY2hhciAqIHNlcnZlciwgcGFfY29udGV4dF9mbGFnc190IGZsYWdzLCBjb25zdCBwYV9zcGF3bl9hcGkgKiBhcGkpID0gMDsKK3N0YXRpYyB2b2lkICgqX19kbGxfcGFfY29udGV4dF9kaXNjb25uZWN0KShwYV9jb250ZXh0ICogYykgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3BhX2NvbnRleHRfZXJybm8pKHBhX2NvbnRleHQgKiBjKSA9IDA7CitzdGF0aWMgcGFfY29udGV4dF9zdGF0ZV90ICgqX19kbGxfcGFfY29udGV4dF9nZXRfc3RhdGUpKHBhX2NvbnRleHQgKiBjKSA9IDA7CitzdGF0aWMgcGFfY29udGV4dCAqICgqX19kbGxfcGFfY29udGV4dF9uZXcpKHBhX21haW5sb29wX2FwaSAqIG1haW5sb29wLCBjb25zdCBjaGFyICogbmFtZSkgPSAwOworc3RhdGljIHBhX29wZXJhdGlvbiogKCpfX2RsbF9wYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X211dGUpKHBhX2NvbnRleHQgKiBjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgcGFfb3BlcmF0aW9uKiAoKl9fZGxsX3BhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lKShwYV9jb250ZXh0ICogYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICogdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgcGFfb3BlcmF0aW9uKiAoKl9fZGxsX3BhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X2luZGV4KShwYV9jb250ZXh0ICogYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgPSAwOworc3RhdGljIHBhX29wZXJhdGlvbiogKCpfX2RsbF9wYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KShwYV9jb250ZXh0ICogYywgdWludDMyX3QgaWR4LCBjb25zdCBwYV9jdm9sdW1lICogdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKShwYV9jb250ZXh0ICogYywgcGFfY29udGV4dF9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX2NvbnRleHRfdW5yZWYpKHBhX2NvbnRleHQgKiBjKSA9IDA7CitzdGF0aWMgcGFfY3ZvbHVtZSogKCpfX2RsbF9wYV9jdm9sdW1lX2luaXQpKHBhX2N2b2x1bWUgKiBhKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX29wZXJhdGlvbl91bnJlZikocGFfb3BlcmF0aW9uICogbykgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKShwYV9zdHJlYW0gKiBzLCBjb25zdCBjaGFyICogZGV2LCBjb25zdCBwYV9idWZmZXJfYXR0ciAqIGF0dHIsIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzLCBjb25zdCBwYV9jdm9sdW1lICogdm9sdW1lLCBwYV9zdHJlYW0gKiBzeW5jX3N0cmVhbSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3JlY29yZCkocGFfc3RyZWFtICogcywgY29uc3QgY2hhciAqIGRldiwgY29uc3QgcGFfYnVmZmVyX2F0dHIgKiBhdHRyLCBwYV9zdHJlYW1fZmxhZ3NfdCBmbGFncykgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3BhX3N0cmVhbV9kcm9wKShwYV9zdHJlYW0gKiBwKSA9IDA7CitzdGF0aWMgdWludDMyX3QgKCpfX2RsbF9wYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleCkocGFfc3RyZWFtICogcykgPSAwOworc3RhdGljIHVpbnQzMl90ICgqX19kbGxfcGFfc3RyZWFtX2dldF9pbmRleCkocGFfc3RyZWFtICogcykgPSAwOworc3RhdGljIHBhX3N0cmVhbV9zdGF0ZV90ICgqX19kbGxfcGFfc3RyZWFtX2dldF9zdGF0ZSkocGFfc3RyZWFtICogcCkgPSAwOworc3RhdGljIHBhX3N0cmVhbSogKCpfX2RsbF9wYV9zdHJlYW1fbmV3KShwYV9jb250ZXh0ICogYywgY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICogc3MsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICogbWFwKSA9IDA7CitzdGF0aWMgaW50ICgqX19kbGxfcGFfc3RyZWFtX3BlZWspKHBhX3N0cmVhbSAqIHAsIGNvbnN0IHZvaWQgKiogZGF0YSwgc2l6ZV90ICogbmJ5dGVzKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjaykocGFfc3RyZWFtICogcCwgcGFfc3RyZWFtX3JlcXVlc3RfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2spKHBhX3N0cmVhbSAqIHMsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2spKHBhX3N0cmVhbSAqIHAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9wYV9zdHJlYW1fdW5yZWYpKHBhX3N0cmVhbSAqIHMpID0gMDsKK3N0YXRpYyBzaXplX3QgKCpfX2RsbF9wYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSkocGFfc3RyZWFtICogcCkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX3BhX3N0cmVhbV93cml0ZSkocGFfc3RyZWFtICogcCwgY29uc3Qgdm9pZCAqIGRhdGEsIHNpemVfdCBuYnl0ZXMsIHBhX2ZyZWVfY2JfdCBmcmVlX2NiLCBpbnQ2NF90IG9mZnNldCwgcGFfc2Vla19tb2RlX3Qgc2VlaykgPSAwOworc3RhdGljIGNvbnN0IGNoYXIqICgqX19kbGxfcGFfc3RyZXJyb3IpKGludCBlcnJvcikgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlKShwYV90aHJlYWRlZF9tYWlubG9vcCogbSkgPSAwOworc3RhdGljIHBhX21haW5sb29wX2FwaSogKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpKShwYV90aHJlYWRlZF9tYWlubG9vcCogbSkgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKShwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0pID0gMDsKK3N0YXRpYyBwYV90aHJlYWRlZF9tYWlubG9vcCAqICgqX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3KSgpID0gMDsKK3N0YXRpYyB2b2lkICgqX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsKShwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0sIGludCB3YWl0X2Zvcl9hY2NlcHQpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCkocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtKSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX3N0b3ApKHBhX3RocmVhZGVkX21haW5sb29wICogbSkgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2spKHBhX3RocmVhZGVkX21haW5sb29wICogbSkgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF93YWl0KShwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0pID0gMDsKK3N0YXRpYyBzaXplX3QgKCpfX2RsbF9wYV91c2VjX3RvX2J5dGVzKShwYV91c2VjX3QgdCwgY29uc3QgcGFfc2FtcGxlX3NwZWMgKiBzcGVjKSA9IDA7CisKKy8vLworLy8vICBXIFIgQSBQIFAgRSBSICAgRiBVIE4gQyBUIEkgTyBOIFMKKy8vLworCitpbnQgcGFfY29udGV4dF9jb25uZWN0KHBhX2NvbnRleHQgKiBjLCBjb25zdCBjaGFyICogc2VydmVyLCBwYV9jb250ZXh0X2ZsYWdzX3QgZmxhZ3MsIGNvbnN0IHBhX3NwYXduX2FwaSAqIGFwaSkgeworICByZXR1cm4gX19kbGxfcGFfY29udGV4dF9jb25uZWN0KGMsIHNlcnZlciwgZmxhZ3MsIGFwaSk7Cit9CisKK3ZvaWQgcGFfY29udGV4dF9kaXNjb25uZWN0KHBhX2NvbnRleHQgKiBjKSB7CisgIF9fZGxsX3BhX2NvbnRleHRfZGlzY29ubmVjdChjKTsKK30KKworaW50IHBhX2NvbnRleHRfZXJybm8ocGFfY29udGV4dCAqIGMpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX2NvbnRleHRfZXJybm8oYyk7Cit9CisKK3BhX2NvbnRleHRfc3RhdGVfdCBwYV9jb250ZXh0X2dldF9zdGF0ZShwYV9jb250ZXh0ICogYykgeworICByZXR1cm4gX19kbGxfcGFfY29udGV4dF9nZXRfc3RhdGUoYyk7Cit9CisKK3BhX2NvbnRleHQgKiBwYV9jb250ZXh0X25ldyhwYV9tYWlubG9vcF9hcGkgKiBtYWlubG9vcCwgY29uc3QgY2hhciAqIG5hbWUpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX2NvbnRleHRfbmV3KG1haW5sb29wLCBuYW1lKTsKK30KKworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X211dGUocGFfY29udGV4dCAqIGMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICogdXNlcmRhdGEpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZShjLCBpZHgsIG11dGUsIGNiLCB1c2VyZGF0YSk7Cit9CisKK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUocGFfY29udGV4dCAqIGMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqIHZvbHVtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgeworICByZXR1cm4gX19kbGxfcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUoYywgaWR4LCB2b2x1bWUsIGNiLCB1c2VyZGF0YSk7Cit9CisKK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfaW5kZXgocGFfY29udGV4dCAqIGMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICogdXNlcmRhdGEpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX2NvbnRleHRfc2V0X3NvdXJjZV9tdXRlX2J5X2luZGV4KGMsIGlkeCwgbXV0ZSwgY2IsIHVzZXJkYXRhKTsKK30KKworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KHBhX2NvbnRleHQgKiBjLCB1aW50MzJfdCBpZHgsIGNvbnN0IHBhX2N2b2x1bWUgKiB2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICogdXNlcmRhdGEpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfaW5kZXgoYywgaWR4LCB2b2x1bWUsIGNiLCB1c2VyZGF0YSk7Cit9CisKK3ZvaWQgcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2socGFfY29udGV4dCAqIGMsIHBhX2NvbnRleHRfbm90aWZ5X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgeworICBfX2RsbF9wYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayhjLCBjYiwgdXNlcmRhdGEpOworfQorCit2b2lkIHBhX2NvbnRleHRfdW5yZWYocGFfY29udGV4dCAqIGMpIHsKKyAgX19kbGxfcGFfY29udGV4dF91bnJlZihjKTsKK30KKworcGFfY3ZvbHVtZSogcGFfY3ZvbHVtZV9pbml0KHBhX2N2b2x1bWUgKiBhKSB7CisgIHJldHVybiBfX2RsbF9wYV9jdm9sdW1lX2luaXQoYSk7Cit9CisKK3ZvaWQgcGFfb3BlcmF0aW9uX3VucmVmKHBhX29wZXJhdGlvbiAqIG8pIHsKKyAgX19kbGxfcGFfb3BlcmF0aW9uX3VucmVmKG8pOworfQorCitpbnQgcGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2socGFfc3RyZWFtICogcywgY29uc3QgY2hhciAqIGRldiwgY29uc3QgcGFfYnVmZmVyX2F0dHIgKiBhdHRyLCBwYV9zdHJlYW1fZmxhZ3NfdCBmbGFncywgY29uc3QgcGFfY3ZvbHVtZSAqIHZvbHVtZSwgcGFfc3RyZWFtICogc3luY19zdHJlYW0pIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKHMsIGRldiwgYXR0ciwgZmxhZ3MsIHZvbHVtZSwgc3luY19zdHJlYW0pOworfQorCitpbnQgcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKHBhX3N0cmVhbSAqIHMsIGNvbnN0IGNoYXIgKiBkZXYsIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICogYXR0ciwgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3JlY29yZChzLCBkZXYsIGF0dHIsIGZsYWdzKTsKK30KKworaW50IHBhX3N0cmVhbV9kcm9wKHBhX3N0cmVhbSAqIHApIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3N0cmVhbV9kcm9wKHApOworfQorCit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleChwYV9zdHJlYW0gKiBzKSB7CisgIHJldHVybiBfX2RsbF9wYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleChzKTsKK30KKwordWludDMyX3QgcGFfc3RyZWFtX2dldF9pbmRleChwYV9zdHJlYW0gKiBzKSB7CisgIHJldHVybiBfX2RsbF9wYV9zdHJlYW1fZ2V0X2luZGV4KHMpOworfQorCitwYV9zdHJlYW1fc3RhdGVfdCBwYV9zdHJlYW1fZ2V0X3N0YXRlKHBhX3N0cmVhbSAqIHApIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3N0cmVhbV9nZXRfc3RhdGUocCk7Cit9CisKK3BhX3N0cmVhbSogcGFfc3RyZWFtX25ldyhwYV9jb250ZXh0ICogYywgY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICogc3MsIGNvbnN0IHBhX2NoYW5uZWxfbWFwICogbWFwKSB7CisgIHJldHVybiBfX2RsbF9wYV9zdHJlYW1fbmV3KGMsIG5hbWUsIHNzLCBtYXApOworfQorCitpbnQgcGFfc3RyZWFtX3BlZWsocGFfc3RyZWFtICogcCwgY29uc3Qgdm9pZCAqKiBkYXRhLCBzaXplX3QgKiBuYnl0ZXMpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3N0cmVhbV9wZWVrKHAsIGRhdGEsIG5ieXRlcyk7Cit9CisKK3ZvaWQgcGFfc3RyZWFtX3NldF9yZWFkX2NhbGxiYWNrKHBhX3N0cmVhbSAqIHAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgeworICBfX2RsbF9wYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2socCwgY2IsIHVzZXJkYXRhKTsKK30KKwordm9pZCBwYV9zdHJlYW1fc2V0X3N0YXRlX2NhbGxiYWNrKHBhX3N0cmVhbSAqIHMsIHBhX3N0cmVhbV9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSB7CisgIF9fZGxsX3BhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2socywgY2IsIHVzZXJkYXRhKTsKK30KKwordm9pZCBwYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHBhX3N0cmVhbSAqIHAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkgeworICBfX2RsbF9wYV9zdHJlYW1fc2V0X3dyaXRlX2NhbGxiYWNrKHAsIGNiLCB1c2VyZGF0YSk7Cit9CisKK3ZvaWQgcGFfc3RyZWFtX3VucmVmKHBhX3N0cmVhbSAqIHMpIHsKKyAgX19kbGxfcGFfc3RyZWFtX3VucmVmKHMpOworfQorCitzaXplX3QgcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUocGFfc3RyZWFtICogcCkgeworICByZXR1cm4gX19kbGxfcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUocCk7Cit9CisKK2ludCBwYV9zdHJlYW1fd3JpdGUocGFfc3RyZWFtICogcCwgY29uc3Qgdm9pZCAqIGRhdGEsIHNpemVfdCBuYnl0ZXMsIHBhX2ZyZWVfY2JfdCBmcmVlX2NiLCBpbnQ2NF90IG9mZnNldCwgcGFfc2Vla19tb2RlX3Qgc2VlaykgeworICByZXR1cm4gX19kbGxfcGFfc3RyZWFtX3dyaXRlKHAsIGRhdGEsIG5ieXRlcywgZnJlZV9jYiwgb2Zmc2V0LCBzZWVrKTsKK30KKworY29uc3QgY2hhciogcGFfc3RyZXJyb3IoaW50IGVycm9yKSB7CisgIHJldHVybiBfX2RsbF9wYV9zdHJlcnJvcihlcnJvcik7Cit9CisKK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfZnJlZShwYV90aHJlYWRlZF9tYWlubG9vcCogbSkgeworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlKG0pOworfQorCitwYV9tYWlubG9vcF9hcGkqIHBhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkocGFfdGhyZWFkZWRfbWFpbmxvb3AqIG0pIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkobSk7Cit9CisKK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0pIHsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayhtKTsKK30KKworcGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKSB7CisgIHJldHVybiBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9uZXcoKTsKK30KKwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtLCBpbnQgd2FpdF9mb3JfYWNjZXB0KSB7CisgIF9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChtLCB3YWl0X2Zvcl9hY2NlcHQpOworfQorCitpbnQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtKSB7CisgIHJldHVybiBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydChtKTsKK30KKwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKHBhX3RocmVhZGVkX21haW5sb29wICogbSkgeworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKG0pOworfQorCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayhwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0pIHsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKG0pOworfQorCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3dhaXQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtKSB7CisgIF9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX3dhaXQobSk7Cit9CisKK3NpemVfdCBwYV91c2VjX3RvX2J5dGVzKHBhX3VzZWNfdCB0LCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqIHNwZWMpIHsKKyAgcmV0dXJuIF9fZGxsX3BhX3VzZWNfdG9fYnl0ZXModCwgc3BlYyk7Cit9CisKKworLy8vCisvLy8gIEkgTiBJIFQgSSBBIEwgSSBaIEEgVCBJIE8gTiAgIEYgVSBOIEMgVCBJIE8gTgorLy8vCisKK2ludCBwdWxzZV9hdWRpb19keW5saW5rX2luaXQodm9pZCogbGliKSB7CisgIF9fZGxsX3BhX2NvbnRleHRfY29ubmVjdCA9IChpbnQoKikocGFfY29udGV4dCAqIGMsIGNvbnN0IGNoYXIgKiBzZXJ2ZXIsIHBhX2NvbnRleHRfZmxhZ3NfdCBmbGFncywgY29uc3QgcGFfc3Bhd25fYXBpICogYXBpKSlkbHN5bShsaWIsICJwYV9jb250ZXh0X2Nvbm5lY3QiKTsKKyAgaWYgKCFfX2RsbF9wYV9jb250ZXh0X2Nvbm5lY3QpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY29udGV4dF9kaXNjb25uZWN0ID0gKHZvaWQoKikocGFfY29udGV4dCAqIGMpKWRsc3ltKGxpYiwgInBhX2NvbnRleHRfZGlzY29ubmVjdCIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfZGlzY29ubmVjdCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9jb250ZXh0X2Vycm5vID0gKGludCgqKShwYV9jb250ZXh0ICogYykpZGxzeW0obGliLCAicGFfY29udGV4dF9lcnJubyIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfZXJybm8pIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY29udGV4dF9nZXRfc3RhdGUgPSAocGFfY29udGV4dF9zdGF0ZV90KCopKHBhX2NvbnRleHQgKiBjKSlkbHN5bShsaWIsICJwYV9jb250ZXh0X2dldF9zdGF0ZSIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfZ2V0X3N0YXRlKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX2NvbnRleHRfbmV3ID0gKHBhX2NvbnRleHQgKigqKShwYV9tYWlubG9vcF9hcGkgKiBtYWlubG9vcCwgY29uc3QgY2hhciAqIG5hbWUpKWRsc3ltKGxpYiwgInBhX2NvbnRleHRfbmV3Iik7CisgIGlmICghX19kbGxfcGFfY29udGV4dF9uZXcpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF9tdXRlID0gKHBhX29wZXJhdGlvbiooKikocGFfY29udGV4dCAqIGMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICogdXNlcmRhdGEpKWRsc3ltKGxpYiwgInBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZSIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfbXV0ZSkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9jb250ZXh0X3NldF9zaW5rX2lucHV0X3ZvbHVtZSA9IChwYV9vcGVyYXRpb24qKCopKHBhX2NvbnRleHQgKiBjLCB1aW50MzJfdCBpZHgsIGNvbnN0IHBhX2N2b2x1bWUgKiB2b2x1bWUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICogdXNlcmRhdGEpKWRsc3ltKGxpYiwgInBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lIik7CisgIGlmICghX19kbGxfcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF92b2x1bWUpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfaW5kZXggPSAocGFfb3BlcmF0aW9uKigqKShwYV9jb250ZXh0ICogYywgdWludDMyX3QgaWR4LCBpbnQgbXV0ZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkpZGxzeW0obGliLCAicGFfY29udGV4dF9zZXRfc291cmNlX211dGVfYnlfaW5kZXgiKTsKKyAgaWYgKCFfX2RsbF9wYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9pbmRleCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4ID0gKHBhX29wZXJhdGlvbiooKikocGFfY29udGV4dCAqIGMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqIHZvbHVtZSwgcGFfY29udGV4dF9zdWNjZXNzX2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkpZGxzeW0obGliLCAicGFfY29udGV4dF9zZXRfc291cmNlX3ZvbHVtZV9ieV9pbmRleCIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfc2V0X3NvdXJjZV92b2x1bWVfYnlfaW5kZXgpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY29udGV4dF9zZXRfc3RhdGVfY2FsbGJhY2sgPSAodm9pZCgqKShwYV9jb250ZXh0ICogYywgcGFfY29udGV4dF9ub3RpZnlfY2JfdCBjYiwgdm9pZCAqIHVzZXJkYXRhKSlkbHN5bShsaWIsICJwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfc2V0X3N0YXRlX2NhbGxiYWNrKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX2NvbnRleHRfdW5yZWYgPSAodm9pZCgqKShwYV9jb250ZXh0ICogYykpZGxzeW0obGliLCAicGFfY29udGV4dF91bnJlZiIpOworICBpZiAoIV9fZGxsX3BhX2NvbnRleHRfdW5yZWYpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfY3ZvbHVtZV9pbml0ID0gKHBhX2N2b2x1bWUqKCopKHBhX2N2b2x1bWUgKiBhKSlkbHN5bShsaWIsICJwYV9jdm9sdW1lX2luaXQiKTsKKyAgaWYgKCFfX2RsbF9wYV9jdm9sdW1lX2luaXQpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfb3BlcmF0aW9uX3VucmVmID0gKHZvaWQoKikocGFfb3BlcmF0aW9uICogbykpZGxzeW0obGliLCAicGFfb3BlcmF0aW9uX3VucmVmIik7CisgIGlmICghX19kbGxfcGFfb3BlcmF0aW9uX3VucmVmKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrID0gKGludCgqKShwYV9zdHJlYW0gKiBzLCBjb25zdCBjaGFyICogZGV2LCBjb25zdCBwYV9idWZmZXJfYXR0ciAqIGF0dHIsIHBhX3N0cmVhbV9mbGFnc190IGZsYWdzLCBjb25zdCBwYV9jdm9sdW1lICogdm9sdW1lLCBwYV9zdHJlYW0gKiBzeW5jX3N0cmVhbSkpZGxzeW0obGliLCAicGFfc3RyZWFtX2Nvbm5lY3RfcGxheWJhY2siKTsKKyAgaWYgKCFfX2RsbF9wYV9zdHJlYW1fY29ubmVjdF9wbGF5YmFjaykgcmV0dXJuIC0xOworICBfX2RsbF9wYV9zdHJlYW1fY29ubmVjdF9yZWNvcmQgPSAoaW50KCopKHBhX3N0cmVhbSAqIHMsIGNvbnN0IGNoYXIgKiBkZXYsIGNvbnN0IHBhX2J1ZmZlcl9hdHRyICogYXR0ciwgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MpKWRsc3ltKGxpYiwgInBhX3N0cmVhbV9jb25uZWN0X3JlY29yZCIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9jb25uZWN0X3JlY29yZCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9zdHJlYW1fZHJvcCA9IChpbnQoKikocGFfc3RyZWFtICogcCkpZGxzeW0obGliLCAicGFfc3RyZWFtX2Ryb3AiKTsKKyAgaWYgKCFfX2RsbF9wYV9zdHJlYW1fZHJvcCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleCA9ICh1aW50MzJfdCgqKShwYV9zdHJlYW0gKiBzKSlkbHN5bShsaWIsICJwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleCIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9nZXRfZGV2aWNlX2luZGV4KSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV9nZXRfaW5kZXggPSAodWludDMyX3QoKikocGFfc3RyZWFtICogcykpZGxzeW0obGliLCAicGFfc3RyZWFtX2dldF9pbmRleCIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9nZXRfaW5kZXgpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfc3RyZWFtX2dldF9zdGF0ZSA9IChwYV9zdHJlYW1fc3RhdGVfdCgqKShwYV9zdHJlYW0gKiBwKSlkbHN5bShsaWIsICJwYV9zdHJlYW1fZ2V0X3N0YXRlIik7CisgIGlmICghX19kbGxfcGFfc3RyZWFtX2dldF9zdGF0ZSkgcmV0dXJuIC0xOworICBfX2RsbF9wYV9zdHJlYW1fbmV3ID0gKHBhX3N0cmVhbSooKikocGFfY29udGV4dCAqIGMsIGNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqIHNzLCBjb25zdCBwYV9jaGFubmVsX21hcCAqIG1hcCkpZGxzeW0obGliLCAicGFfc3RyZWFtX25ldyIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9uZXcpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfc3RyZWFtX3BlZWsgPSAoaW50KCopKHBhX3N0cmVhbSAqIHAsIGNvbnN0IHZvaWQgKiogZGF0YSwgc2l6ZV90ICogbmJ5dGVzKSlkbHN5bShsaWIsICJwYV9zdHJlYW1fcGVlayIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9wZWVrKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV9zZXRfcmVhZF9jYWxsYmFjayA9ICh2b2lkKCopKHBhX3N0cmVhbSAqIHAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkpZGxzeW0obGliLCAicGFfc3RyZWFtX3NldF9yZWFkX2NhbGxiYWNrIik7CisgIGlmICghX19kbGxfcGFfc3RyZWFtX3NldF9yZWFkX2NhbGxiYWNrKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2sgPSAodm9pZCgqKShwYV9zdHJlYW0gKiBzLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkpZGxzeW0obGliLCAicGFfc3RyZWFtX3NldF9zdGF0ZV9jYWxsYmFjayIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2spIHJldHVybiAtMTsKKyAgX19kbGxfcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayA9ICh2b2lkKCopKHBhX3N0cmVhbSAqIHAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKiB1c2VyZGF0YSkpZGxzeW0obGliLCAicGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV9zZXRfd3JpdGVfY2FsbGJhY2spIHJldHVybiAtMTsKKyAgX19kbGxfcGFfc3RyZWFtX3VucmVmID0gKHZvaWQoKikocGFfc3RyZWFtICogcykpZGxzeW0obGliLCAicGFfc3RyZWFtX3VucmVmIik7CisgIGlmICghX19kbGxfcGFfc3RyZWFtX3VucmVmKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV93cml0YWJsZV9zaXplID0gKHNpemVfdCgqKShwYV9zdHJlYW0gKiBwKSlkbHN5bShsaWIsICJwYV9zdHJlYW1fd3JpdGFibGVfc2l6ZSIpOworICBpZiAoIV9fZGxsX3BhX3N0cmVhbV93cml0YWJsZV9zaXplKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVhbV93cml0ZSA9IChpbnQoKikocGFfc3RyZWFtICogcCwgY29uc3Qgdm9pZCAqIGRhdGEsIHNpemVfdCBuYnl0ZXMsIHBhX2ZyZWVfY2JfdCBmcmVlX2NiLCBpbnQ2NF90IG9mZnNldCwgcGFfc2Vla19tb2RlX3Qgc2VlaykpZGxzeW0obGliLCAicGFfc3RyZWFtX3dyaXRlIik7CisgIGlmICghX19kbGxfcGFfc3RyZWFtX3dyaXRlKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3N0cmVycm9yID0gKGNvbnN0IGNoYXIqKCopKGludCBlcnJvcikpZGxzeW0obGliLCAicGFfc3RyZXJyb3IiKTsKKyAgaWYgKCFfX2RsbF9wYV9zdHJlcnJvcikgcmV0dXJuIC0xOworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlID0gKHZvaWQoKikocGFfdGhyZWFkZWRfbWFpbmxvb3AqIG0pKWRsc3ltKGxpYiwgInBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUiKTsKKyAgaWYgKCFfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9mcmVlKSByZXR1cm4gLTE7CisgIF9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkgPSAocGFfbWFpbmxvb3BfYXBpKigqKShwYV90aHJlYWRlZF9tYWlubG9vcCogbSkpZGxzeW0obGliLCAicGFfdGhyZWFkZWRfbWFpbmxvb3BfZ2V0X2FwaSIpOworICBpZiAoIV9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX2dldF9hcGkpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayA9ICh2b2lkKCopKHBhX3RocmVhZGVkX21haW5sb29wICogbSkpZGxzeW0obGliLCAicGFfdGhyZWFkZWRfbWFpbmxvb3BfbG9jayIpOworICBpZiAoIV9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX2xvY2spIHJldHVybiAtMTsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3BfbmV3ID0gKHBhX3RocmVhZGVkX21haW5sb29wICooKikoKSlkbHN5bShsaWIsICJwYV90aHJlYWRlZF9tYWlubG9vcF9uZXciKTsKKyAgaWYgKCFfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9uZXcpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc2lnbmFsID0gKHZvaWQoKikocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtLCBpbnQgd2FpdF9mb3JfYWNjZXB0KSlkbHN5bShsaWIsICJwYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwiKTsKKyAgaWYgKCFfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zaWduYWwpIHJldHVybiAtMTsKKyAgX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQgPSAoaW50KCopKHBhX3RocmVhZGVkX21haW5sb29wICogbSkpZGxzeW0obGliLCAicGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQiKTsKKyAgaWYgKCFfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zdGFydCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wID0gKHZvaWQoKikocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtKSlkbHN5bShsaWIsICJwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wIik7CisgIGlmICghX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RvcCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF91bmxvY2sgPSAodm9pZCgqKShwYV90aHJlYWRlZF9tYWlubG9vcCAqIG0pKWRsc3ltKGxpYiwgInBhX3RocmVhZGVkX21haW5sb29wX3VubG9jayIpOworICBpZiAoIV9fZGxsX3BhX3RocmVhZGVkX21haW5sb29wX3VubG9jaykgcmV0dXJuIC0xOworICBfX2RsbF9wYV90aHJlYWRlZF9tYWlubG9vcF93YWl0ID0gKHZvaWQoKikocGFfdGhyZWFkZWRfbWFpbmxvb3AgKiBtKSlkbHN5bShsaWIsICJwYV90aHJlYWRlZF9tYWlubG9vcF93YWl0Iik7CisgIGlmICghX19kbGxfcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdCkgcmV0dXJuIC0xOworICBfX2RsbF9wYV91c2VjX3RvX2J5dGVzID0gKHNpemVfdCgqKShwYV91c2VjX3QgdCwgY29uc3QgcGFfc2FtcGxlX3NwZWMgKiBzcGVjKSlkbHN5bShsaWIsICJwYV91c2VjX3RvX2J5dGVzIik7CisgIGlmICghX19kbGxfcGFfdXNlY190b19ieXRlcykgcmV0dXJuIC0xOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvcHVsc2UtYXVkaW8uZW50cmllcyBiL2FuZHJvaWQvcWVtdTEvYXVkaW8vd3JhcHBlcnMvcHVsc2UtYXVkaW8uZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE3MGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9hdWRpby93cmFwcGVycy9wdWxzZS1hdWRpby5lbnRyaWVzCkBAIC0wLDAgKzEsNDcgQEAKKyFwdWxzZV9hdWRpbworJSNpbmNsdWRlIDxwdWxzZS9wdWxzZWF1ZGlvLmg+CisKK2ludCBwYV9jb250ZXh0X2Nvbm5lY3QocGFfY29udGV4dCAqYywgY29uc3QgY2hhciAqc2VydmVyLCBwYV9jb250ZXh0X2ZsYWdzX3QgZmxhZ3MsIGNvbnN0IHBhX3NwYXduX2FwaSAqYXBpKTsKK3ZvaWQgcGFfY29udGV4dF9kaXNjb25uZWN0KHBhX2NvbnRleHQgKmMpOworaW50IHBhX2NvbnRleHRfZXJybm8ocGFfY29udGV4dCAqYyk7CitwYV9jb250ZXh0X3N0YXRlX3QgcGFfY29udGV4dF9nZXRfc3RhdGUocGFfY29udGV4dCAqYyk7CitwYV9jb250ZXh0ICpwYV9jb250ZXh0X25ldyhwYV9tYWlubG9vcF9hcGkgKm1haW5sb29wLCBjb25zdCBjaGFyICpuYW1lKTsKK3BhX29wZXJhdGlvbiogcGFfY29udGV4dF9zZXRfc2lua19pbnB1dF9tdXRlKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgaW50IG11dGUsIHBhX2NvbnRleHRfc3VjY2Vzc19jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7CitwYV9vcGVyYXRpb24qIHBhX2NvbnRleHRfc2V0X3NpbmtfaW5wdXRfdm9sdW1lKHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2VfbXV0ZV9ieV9pbmRleChwYV9jb250ZXh0ICpjLCB1aW50MzJfdCBpZHgsIGludCBtdXRlLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOworcGFfb3BlcmF0aW9uKiBwYV9jb250ZXh0X3NldF9zb3VyY2Vfdm9sdW1lX2J5X2luZGV4KHBhX2NvbnRleHQgKmMsIHVpbnQzMl90IGlkeCwgY29uc3QgcGFfY3ZvbHVtZSAqdm9sdW1lLCBwYV9jb250ZXh0X3N1Y2Nlc3NfY2JfdCBjYiwgdm9pZCAqdXNlcmRhdGEpOwordm9pZCBwYV9jb250ZXh0X3NldF9zdGF0ZV9jYWxsYmFjayhwYV9jb250ZXh0ICpjLCBwYV9jb250ZXh0X25vdGlmeV9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7Cit2b2lkIHBhX2NvbnRleHRfdW5yZWYocGFfY29udGV4dCAqYyk7CisKK3BhX2N2b2x1bWUqIHBhX2N2b2x1bWVfaW5pdChwYV9jdm9sdW1lICphKTsKKwordm9pZCBwYV9vcGVyYXRpb25fdW5yZWYocGFfb3BlcmF0aW9uICpvKTsKKworaW50IHBhX3N0cmVhbV9jb25uZWN0X3BsYXliYWNrKHBhX3N0cmVhbSAqcywgY29uc3QgY2hhciAqZGV2LCBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MsIGNvbnN0IHBhX2N2b2x1bWUgKnZvbHVtZSwgcGFfc3RyZWFtICpzeW5jX3N0cmVhbSk7CitpbnQgcGFfc3RyZWFtX2Nvbm5lY3RfcmVjb3JkKHBhX3N0cmVhbSAqcywgY29uc3QgY2hhciAqZGV2LCBjb25zdCBwYV9idWZmZXJfYXR0ciAqYXR0ciwgcGFfc3RyZWFtX2ZsYWdzX3QgZmxhZ3MpOworaW50IHBhX3N0cmVhbV9kcm9wKHBhX3N0cmVhbSAqcCk7Cit1aW50MzJfdCBwYV9zdHJlYW1fZ2V0X2RldmljZV9pbmRleChwYV9zdHJlYW0gKnMpOwordWludDMyX3QgcGFfc3RyZWFtX2dldF9pbmRleChwYV9zdHJlYW0gKnMpOworcGFfc3RyZWFtX3N0YXRlX3QgcGFfc3RyZWFtX2dldF9zdGF0ZShwYV9zdHJlYW0gKnApOworcGFfc3RyZWFtKiBwYV9zdHJlYW1fbmV3KHBhX2NvbnRleHQgKmMsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHBhX3NhbXBsZV9zcGVjICpzcywgY29uc3QgcGFfY2hhbm5lbF9tYXAgKm1hcCk7CitpbnQgcGFfc3RyZWFtX3BlZWsocGFfc3RyZWFtICpwLCBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpuYnl0ZXMpOwordm9pZCBwYV9zdHJlYW1fc2V0X3JlYWRfY2FsbGJhY2socGFfc3RyZWFtICpwLCBwYV9zdHJlYW1fcmVxdWVzdF9jYl90IGNiLCB2b2lkICp1c2VyZGF0YSk7Cit2b2lkIHBhX3N0cmVhbV9zZXRfc3RhdGVfY2FsbGJhY2socGFfc3RyZWFtICpzLCBwYV9zdHJlYW1fbm90aWZ5X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKK3ZvaWQgcGFfc3RyZWFtX3NldF93cml0ZV9jYWxsYmFjayhwYV9zdHJlYW0gKnAsIHBhX3N0cmVhbV9yZXF1ZXN0X2NiX3QgY2IsIHZvaWQgKnVzZXJkYXRhKTsKK3ZvaWQgcGFfc3RyZWFtX3VucmVmKHBhX3N0cmVhbSAqcyk7CitzaXplX3QgcGFfc3RyZWFtX3dyaXRhYmxlX3NpemUocGFfc3RyZWFtICpwKTsKK2ludCBwYV9zdHJlYW1fd3JpdGUocGFfc3RyZWFtICpwLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbmJ5dGVzLCBwYV9mcmVlX2NiX3QgZnJlZV9jYiwgaW50NjRfdCBvZmZzZXQsIHBhX3NlZWtfbW9kZV90IHNlZWspOworCitjb25zdCBjaGFyKiBwYV9zdHJlcnJvcihpbnQgZXJyb3IpOworCit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX2ZyZWUocGFfdGhyZWFkZWRfbWFpbmxvb3AqIG0pOworcGFfbWFpbmxvb3BfYXBpKiBwYV90aHJlYWRlZF9tYWlubG9vcF9nZXRfYXBpKHBhX3RocmVhZGVkX21haW5sb29wKm0pOwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9sb2NrKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKK3BhX3RocmVhZGVkX21haW5sb29wICpwYV90aHJlYWRlZF9tYWlubG9vcF9uZXcodm9pZCk7Cit2b2lkIHBhX3RocmVhZGVkX21haW5sb29wX3NpZ25hbChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSwgaW50IHdhaXRfZm9yX2FjY2VwdCk7CitpbnQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfc3RhcnQocGFfdGhyZWFkZWRfbWFpbmxvb3AgKm0pOwordm9pZCBwYV90aHJlYWRlZF9tYWlubG9vcF9zdG9wKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHBhX3RocmVhZGVkX21haW5sb29wICptKTsKK3ZvaWQgcGFfdGhyZWFkZWRfbWFpbmxvb3Bfd2FpdChwYV90aHJlYWRlZF9tYWlubG9vcCAqbSk7CisKK3NpemVfdCBwYV91c2VjX3RvX2J5dGVzKHBhX3VzZWNfdCB0LCBjb25zdCBwYV9zYW1wbGVfc3BlYyAqc3BlYyk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2JhY2tlbmRzL21zbW91c2UuYyBiL2FuZHJvaWQvcWVtdTEvYmFja2VuZHMvbXNtb3VzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWRmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2JhY2tlbmRzL21zbW91c2UuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogUUVNVSBNaWNyb3NvZnQgc2VyaWFsIG1vdXNlIGVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBMdWJvbWlyIFJpbnRlbAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisjaW5jbHVkZSAiaHcvbXNtb3VzZS5oIgorCisjZGVmaW5lIE1TTU9VU0VfTE82KG4pICgobikgJiAweDNmKQorI2RlZmluZSBNU01PVVNFX0hJMihuKSAoKChuKSAmIDB4YzApID4+IDYpCisKK3N0YXRpYyB2b2lkIG1zbW91c2VfZXZlbnQodm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCBkeSwgaW50IGR6LCBpbnQgYnV0dG9uc19zdGF0ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IChDaGFyRHJpdmVyU3RhdGUgKilvcGFxdWU7CisKKyAgICB1bnNpZ25lZCBjaGFyIGJ5dGVzWzRdID0geyAweDQwLCAweDAwLCAweDAwLCAweDAwIH07CisKKyAgICAvKiBNb3ZlbWVudCBkZWx0YXMgKi8KKyAgICBieXRlc1swXSB8PSAoTVNNT1VTRV9ISTIoZHkpIDw8IDIpIHwgTVNNT1VTRV9ISTIoZHgpOworICAgIGJ5dGVzWzFdIHw9IE1TTU9VU0VfTE82KGR4KTsKKyAgICBieXRlc1syXSB8PSBNU01PVVNFX0xPNihkeSk7CisKKyAgICAvKiBCdXR0b25zICovCisgICAgYnl0ZXNbMF0gfD0gKGJ1dHRvbnNfc3RhdGUgJiAweDAxID8gMHgyMCA6IDB4MDApOworICAgIGJ5dGVzWzBdIHw9IChidXR0b25zX3N0YXRlICYgMHgwMiA/IDB4MTAgOiAweDAwKTsKKyAgICBieXRlc1szXSB8PSAoYnV0dG9uc19zdGF0ZSAmIDB4MDQgPyAweDIwIDogMHgwMCk7CisKKyAgICAvKiBXZSBhbHdheXMgc2VuZCB0aGUgcGFja2V0IG9mLCBzbyB0aGF0IHdlIGRvIG5vdCBoYXZlIHRvIGtlZXAgdHJhY2sKKyAgICAgICBvZiBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgbWlkZGxlIGJ1dHRvbi4gVGhpcyBjYW4gcG90ZW50aWFsbHkgY29uZnVzZQorICAgICAgIHNvbWUgdmVyeSBvbGQgZHJpdmVycyBmb3IgdHdvIGJ1dHRvbiBtaWNlIHRob3VnaC4gKi8KKyAgICBxZW11X2Nocl9yZWFkKGNociwgYnl0ZXMsIDQpOworfQorCitzdGF0aWMgaW50IG1zbW91c2VfY2hyX3dyaXRlIChzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgLyogSWdub3JlIHdyaXRlcyB0byBtb3VzZSBwb3J0ICovCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHZvaWQgbXNtb3VzZV9jaHJfY2xvc2UgKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBnX2ZyZWUgKGNocik7Cit9CisKK0NoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl9tc21vdXNlKFFlbXVPcHRzICpvcHRzKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworCisgICAgY2hyID0gZ19tYWxsb2MwKHNpemVvZihDaGFyRHJpdmVyU3RhdGUpKTsKKyAgICBjaHItPmNocl93cml0ZSA9IG1zbW91c2VfY2hyX3dyaXRlOworICAgIGNoci0+Y2hyX2Nsb3NlID0gbXNtb3VzZV9jaHJfY2xvc2U7CisKKyAgICBxZW11X2FkZF9tb3VzZV9ldmVudF9oYW5kbGVyKG1zbW91c2VfZXZlbnQsIGNociwgMCwgIlFFTVUgTWljcm9zb2Z0IE1vdXNlIik7CisKKyAgICByZXR1cm4gY2hyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ibG9jay5jIGIvYW5kcm9pZC9xZW11MS9ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMWI3YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrLmMKQEAgLTAsMCArMSwyNjY0IEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IgYmxvY2sgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJibG9jay9ibG9ja19pbnQuaCIKKyNpbmNsdWRlICJxZW11L2lvdi5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisvLyNpbmNsdWRlICJxYXBpL3FtcC90eXBlcy5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3Fqc29uLmgiCisKKyNpZmRlZiBDT05GSUdfQlNECisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcXVldWUuaD4KKyNpZm5kZWYgX19EcmFnb25GbHlfXworI2luY2x1ZGUgPHN5cy9kaXNrLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK3N0YXRpYyBCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb19yZWFkdl9lbShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKK3N0YXRpYyBCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb193cml0ZXZfZW0oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIGludDY0X3Qgc2VjdG9yX251bSwgUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSk7CitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqYmRydl9haW9fZmx1c2hfZW0oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX25vb3BfZW0oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOworc3RhdGljIGludCBiZHJ2X3JlYWRfZW0oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpOworc3RhdGljIGludCBiZHJ2X3dyaXRlX2VtKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycyk7CisKK3N0YXRpYyBRVEFJTFFfSEVBRCgsIEJsb2NrRHJpdmVyU3RhdGUpIGJkcnZfc3RhdGVzID0KKyAgICBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihiZHJ2X3N0YXRlcyk7CisKK3N0YXRpYyBRTElTVF9IRUFEKCwgQmxvY2tEcml2ZXIpIGJkcnZfZHJpdmVycyA9CisgICAgUUxJU1RfSEVBRF9JTklUSUFMSVpFUihiZHJ2X2RyaXZlcnMpOworCisvKiBUaGUgZGV2aWNlIHRvIHVzZSBmb3IgVk0gc25hcHNob3RzICovCitzdGF0aWMgQmxvY2tEcml2ZXJTdGF0ZSAqYnNfc25hcHNob3RzOworCisvKiBJZiBub24temVybywgdXNlIG9ubHkgd2hpdGVsaXN0ZWQgYmxvY2sgZHJpdmVycyAqLworc3RhdGljIGludCB1c2VfYmRydl93aGl0ZWxpc3Q7CisKK2ludCBfcGF0aF9pc19hYnNvbHV0ZShjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisjaWZkZWYgX1dJTjMyCisgICAgLyogc3BlY2lmaWMgY2FzZSBmb3IgbmFtZXMgbGlrZTogIlxcLlxkOiIgKi8KKyAgICBpZiAoKnBhdGggPT0gJy8nIHx8ICpwYXRoID09ICdcXCcpCisgICAgICAgIHJldHVybiAxOworI2VuZGlmCisgICAgcCA9IHN0cmNocihwYXRoLCAnOicpOworICAgIGlmIChwKQorICAgICAgICBwKys7CisgICAgZWxzZQorICAgICAgICBwID0gcGF0aDsKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gKCpwID09ICcvJyB8fCAqcCA9PSAnXFwnKTsKKyNlbHNlCisgICAgcmV0dXJuICgqcCA9PSAnLycpOworI2VuZGlmCit9CisKKy8qIGlmIGZpbGVuYW1lIGlzIGFic29sdXRlLCBqdXN0IGNvcHkgaXQgdG8gZGVzdC4gT3RoZXJ3aXNlLCBidWlsZCBhCisgICBwYXRoIHRvIGl0IGJ5IGNvbnNpZGVyaW5nIGl0IGlzIHJlbGF0aXZlIHRvIGJhc2VfcGF0aC4gVVJMIGFyZQorICAgc3VwcG9ydGVkLiAqLwordm9pZCBwYXRoX2NvbWJpbmUoY2hhciAqZGVzdCwgaW50IGRlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnAsICpwMTsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKGRlc3Rfc2l6ZSA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKF9wYXRoX2lzX2Fic29sdXRlKGZpbGVuYW1lKSkgeworICAgICAgICBwc3RyY3B5KGRlc3QsIGRlc3Rfc2l6ZSwgZmlsZW5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHAgPSBzdHJjaHIoYmFzZV9wYXRoLCAnOicpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcCA9IGJhc2VfcGF0aDsKKyAgICAgICAgcDEgPSBzdHJyY2hyKGJhc2VfcGF0aCwgJy8nKTsKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcDI7CisgICAgICAgICAgICBwMiA9IHN0cnJjaHIoYmFzZV9wYXRoLCAnXFwnKTsKKyAgICAgICAgICAgIGlmICghcDEgfHwgcDIgPiBwMSkKKyAgICAgICAgICAgICAgICBwMSA9IHAyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKHAxKQorICAgICAgICAgICAgcDErKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcDEgPSBiYXNlX3BhdGg7CisgICAgICAgIGlmIChwMSA+IHApCisgICAgICAgICAgICBwID0gcDE7CisgICAgICAgIGxlbiA9IHAgLSBiYXNlX3BhdGg7CisgICAgICAgIGlmIChsZW4gPiBkZXN0X3NpemUgLSAxKQorICAgICAgICAgICAgbGVuID0gZGVzdF9zaXplIC0gMTsKKyAgICAgICAgbWVtY3B5KGRlc3QsIGJhc2VfcGF0aCwgbGVuKTsKKyAgICAgICAgZGVzdFtsZW5dID0gJ1wwJzsKKyAgICAgICAgcHN0cmNhdChkZXN0LCBkZXN0X3NpemUsIGZpbGVuYW1lKTsKKyAgICB9Cit9CisKK3ZvaWQgYmRydl9yZWdpc3RlcihCbG9ja0RyaXZlciAqYmRydikKK3sKKyAgICBpZiAoIWJkcnYtPmJkcnZfYWlvX3JlYWR2KSB7CisgICAgICAgIC8qIGFkZCBBSU8gZW11bGF0aW9uIGxheWVyICovCisgICAgICAgIGJkcnYtPmJkcnZfYWlvX3JlYWR2ID0gYmRydl9haW9fcmVhZHZfZW07CisgICAgICAgIGJkcnYtPmJkcnZfYWlvX3dyaXRldiA9IGJkcnZfYWlvX3dyaXRldl9lbTsKKyAgICB9IGVsc2UgaWYgKCFiZHJ2LT5iZHJ2X3JlYWQpIHsKKyAgICAgICAgLyogYWRkIHN5bmNocm9ub3VzIElPIGVtdWxhdGlvbiBsYXllciAqLworICAgICAgICBiZHJ2LT5iZHJ2X3JlYWQgPSBiZHJ2X3JlYWRfZW07CisgICAgICAgIGJkcnYtPmJkcnZfd3JpdGUgPSBiZHJ2X3dyaXRlX2VtOworICAgIH0KKworICAgIGlmICghYmRydi0+YmRydl9haW9fZmx1c2gpCisgICAgICAgIGJkcnYtPmJkcnZfYWlvX2ZsdXNoID0gYmRydl9haW9fZmx1c2hfZW07CisKKyAgICBRTElTVF9JTlNFUlRfSEVBRCgmYmRydl9kcml2ZXJzLCBiZHJ2LCBsaXN0KTsKK30KKworLyogY3JlYXRlIGEgbmV3IGJsb2NrIGRldmljZSAoYnkgZGVmYXVsdCBpdCBpcyBlbXB0eSkgKi8KK0Jsb2NrRHJpdmVyU3RhdGUgKmJkcnZfbmV3KGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworCisgICAgYnMgPSBnX21hbGxvYzAoc2l6ZW9mKEJsb2NrRHJpdmVyU3RhdGUpKTsKKyAgICBwc3RyY3B5KGJzLT5kZXZpY2VfbmFtZSwgc2l6ZW9mKGJzLT5kZXZpY2VfbmFtZSksIGRldmljZV9uYW1lKTsKKyAgICBpZiAoZGV2aWNlX25hbWVbMF0gIT0gJ1wwJykgeworICAgICAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJmJkcnZfc3RhdGVzLCBicywgbGlzdCk7CisgICAgfQorICAgIHJldHVybiBiczsKK30KKworQmxvY2tEcml2ZXIgKmJkcnZfZmluZF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0X25hbWUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydjE7CisgICAgUUxJU1RfRk9SRUFDSChkcnYxLCAmYmRydl9kcml2ZXJzLCBsaXN0KSB7CisgICAgICAgIGlmICghc3RyY21wKGRydjEtPmZvcm1hdF9uYW1lLCBmb3JtYXRfbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBkcnYxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGJkcnZfaXNfd2hpdGVsaXN0ZWQoQmxvY2tEcml2ZXIgKmRydikKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqd2hpdGVsaXN0W10gPSB7CisgICAgICAgIENPTkZJR19CRFJWX1dISVRFTElTVAorICAgIH07CisgICAgY29uc3QgY2hhciAqKnA7CisKKyAgICBpZiAoIXdoaXRlbGlzdFswXSkKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgLyogbm8gd2hpdGVsaXN0LCBhbnl0aGluZyBnb2VzICovCisKKyAgICBmb3IgKHAgPSB3aGl0ZWxpc3Q7ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoZHJ2LT5mb3JtYXRfbmFtZSwgKnApKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQmxvY2tEcml2ZXIgKmJkcnZfZmluZF93aGl0ZWxpc3RlZF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0X25hbWUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJkcnZfZmluZF9mb3JtYXQoZm9ybWF0X25hbWUpOworICAgIHJldHVybiBkcnYgJiYgYmRydl9pc193aGl0ZWxpc3RlZChkcnYpID8gZHJ2IDogTlVMTDsKK30KKworaW50IGJkcnZfY3JlYXRlKEJsb2NrRHJpdmVyICpkcnYsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgIFFFTVVPcHRpb25QYXJhbWV0ZXIgKm9wdGlvbnMpCit7CisgICAgaWYgKCFkcnYtPmJkcnZfY3JlYXRlKQorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisKKyAgICByZXR1cm4gZHJ2LT5iZHJ2X2NyZWF0ZShmaWxlbmFtZSwgb3B0aW9ucyk7Cit9CisKK2ludCBiZHJ2X2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBRRU1VT3B0aW9uUGFyYW1ldGVyICpvcHRpb25zKQoreworICAgIEJsb2NrRHJpdmVyICpkcnY7CisKKyAgICBkcnYgPSBiZHJ2X2ZpbmRfcHJvdG9jb2woZmlsZW5hbWUpOworICAgIGlmIChkcnYgPT0gTlVMTCkgeworICAgICAgICBkcnYgPSBiZHJ2X2ZpbmRfZm9ybWF0KCJmaWxlIik7CisgICAgfQorCisgICAgcmV0dXJuIGJkcnZfY3JlYXRlKGRydiwgZmlsZW5hbWUsIG9wdGlvbnMpOworfQorCisjaWZkZWYgX1dJTjMyCit2b2lkIGdldF90bXBfZmlsZW5hbWUoY2hhciAqZmlsZW5hbWUsIGludCBzaXplKQoreworICAgIGNoYXIgdGVtcF9kaXJbTUFYX1BBVEhdOworCisgICAgR2V0VGVtcFBhdGgoTUFYX1BBVEgsIHRlbXBfZGlyKTsKKyAgICBHZXRUZW1wRmlsZU5hbWUodGVtcF9kaXIsICJxZW0iLCAwLCBmaWxlbmFtZSk7Cit9CisjZWxzZQordm9pZCBnZXRfdG1wX2ZpbGVuYW1lKGNoYXIgKmZpbGVuYW1lLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgZmQ7CisgICAgY29uc3QgY2hhciAqdG1wZGlyOworICAgIC8qIFhYWDogcmFjZSBjb25kaXRpb24gcG9zc2libGUgKi8KKyAgICB0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworICAgIGlmICghdG1wZGlyKQorICAgICAgICB0bXBkaXIgPSAiL3RtcCI7CisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemUsICIlcy92bC5YWFhYWFgiLCB0bXBkaXIpOworICAgIGZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisgICAgY2xvc2UoZmQpOworfQorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyBpbnQgaXNfd2luZG93c19kcml2ZV9wcmVmaXgoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgcmV0dXJuICgoKGZpbGVuYW1lWzBdID49ICdhJyAmJiBmaWxlbmFtZVswXSA8PSAneicpIHx8CisgICAgICAgICAgICAgKGZpbGVuYW1lWzBdID49ICdBJyAmJiBmaWxlbmFtZVswXSA8PSAnWicpKSAmJgorICAgICAgICAgICAgZmlsZW5hbWVbMV0gPT0gJzonKTsKK30KKworaW50IGlzX3dpbmRvd3NfZHJpdmUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaWYgKGlzX3dpbmRvd3NfZHJpdmVfcHJlZml4KGZpbGVuYW1lKSAmJgorICAgICAgICBmaWxlbmFtZVsyXSA9PSAnXDAnKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoc3Ryc3RhcnQoZmlsZW5hbWUsICJcXFxcLlxcIiwgTlVMTCkgfHwKKyAgICAgICAgc3Ryc3RhcnQoZmlsZW5hbWUsICIvLy4vIiwgTlVMTCkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBEZXRlY3QgaG9zdCBkZXZpY2VzLiBCeSBjb252ZW50aW9uLCAvZGV2L2Nkcm9tW05dIGlzIGFsd2F5cworICogcmVjb2duaXplZCBhcyBhIGhvc3QgQ0RST00uCisgKi8KK3N0YXRpYyBCbG9ja0RyaXZlciAqZmluZF9oZGV2X2RyaXZlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpbnQgc2NvcmVfbWF4ID0gMCwgc2NvcmU7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IE5VTEwsICpkOworCisgICAgUUxJU1RfRk9SRUFDSChkLCAmYmRydl9kcml2ZXJzLCBsaXN0KSB7CisgICAgICAgIGlmIChkLT5iZHJ2X3Byb2JlX2RldmljZSkgeworICAgICAgICAgICAgc2NvcmUgPSBkLT5iZHJ2X3Byb2JlX2RldmljZShmaWxlbmFtZSk7CisgICAgICAgICAgICBpZiAoc2NvcmUgPiBzY29yZV9tYXgpIHsKKyAgICAgICAgICAgICAgICBzY29yZV9tYXggPSBzY29yZTsKKyAgICAgICAgICAgICAgICBkcnYgPSBkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRydjsKK30KKworQmxvY2tEcml2ZXIgKmJkcnZfZmluZF9wcm90b2NvbChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2MTsKKyAgICBjaGFyIHByb3RvY29sWzEyOF07CisgICAgaW50IGxlbjsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgLyogVE9ETyBEcml2ZXJzIHdpdGhvdXQgYmRydl9maWxlX29wZW4gbXVzdCBiZSBzcGVjaWZpZWQgZXhwbGljaXRseSAqLworCisgICAgLyoKKyAgICAgKiBYWFgoaGNoKTogd2UgcmVhbGx5IHNob3VsZCBub3QgbGV0IGhvc3QgZGV2aWNlIGRldGVjdGlvbgorICAgICAqIG92ZXJyaWRlIGFuIGV4cGxpY2l0IHByb3RvY29sIHNwZWNpZmljYXRpb24sIGJ1dCBtb3ZpbmcgdGhpcworICAgICAqIGxhdGVyIGJyZWFrcyBhY2Nlc3MgdG8gZGV2aWNlIG5hbWVzIHdpdGggY29sb25zIGluIHRoZW0uCisgICAgICogVGhhbmtzIHRvIHRoZSBicmFpbi1kZWFkIHBlcnNpc3RlbnQgbmFtaW5nIHNjaGVtZXMgb24gdWRldi0KKyAgICAgKiBiYXNlZCBMaW51eCBzeXN0ZW1zIHRob3NlIGFjdHVhbGx5IGFyZSBxdWl0ZSBjb21tb24uCisgICAgICovCisgICAgZHJ2MSA9IGZpbmRfaGRldl9kcml2ZXIoZmlsZW5hbWUpOworICAgIGlmIChkcnYxKSB7CisgICAgICAgIHJldHVybiBkcnYxOworICAgIH0KKworI2lmZGVmIF9XSU4zMgorICAgICBpZiAoaXNfd2luZG93c19kcml2ZShmaWxlbmFtZSkgfHwKKyAgICAgICAgIGlzX3dpbmRvd3NfZHJpdmVfcHJlZml4KGZpbGVuYW1lKSkKKyAgICAgICAgIHJldHVybiBiZHJ2X2ZpbmRfZm9ybWF0KCJmaWxlIik7CisjZW5kaWYKKworICAgIHAgPSBzdHJjaHIoZmlsZW5hbWUsICc6Jyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybiBiZHJ2X2ZpbmRfZm9ybWF0KCJmaWxlIik7CisgICAgfQorICAgIGxlbiA9IHAgLSBmaWxlbmFtZTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKHByb3RvY29sKSAtIDEpCisgICAgICAgIGxlbiA9IHNpemVvZihwcm90b2NvbCkgLSAxOworICAgIG1lbWNweShwcm90b2NvbCwgZmlsZW5hbWUsIGxlbik7CisgICAgcHJvdG9jb2xbbGVuXSA9ICdcMCc7CisgICAgUUxJU1RfRk9SRUFDSChkcnYxLCAmYmRydl9kcml2ZXJzLCBsaXN0KSB7CisgICAgICAgIGlmIChkcnYxLT5wcm90b2NvbF9uYW1lICYmCisgICAgICAgICAgICAhc3RyY21wKGRydjEtPnByb3RvY29sX25hbWUsIHByb3RvY29sKSkgeworICAgICAgICAgICAgcmV0dXJuIGRydjE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9pbWFnZV9mb3JtYXQoY29uc3QgY2hhciAqZmlsZW5hbWUsIEJsb2NrRHJpdmVyICoqcGRydikKK3sKKyAgICBpbnQgcmV0LCBzY29yZSwgc2NvcmVfbWF4OworICAgIEJsb2NrRHJpdmVyICpkcnYxLCAqZHJ2OworICAgIHVpbnQ4X3QgYnVmWzIwNDhdOworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworCisgICAgcmV0ID0gYmRydl9maWxlX29wZW4oJmJzLCBmaWxlbmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgKnBkcnYgPSBOVUxMOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIFJldHVybiB0aGUgcmF3IEJsb2NrRHJpdmVyICogdG8gc2NzaS1nZW5lcmljIGRldmljZXMgb3IgZW1wdHkgZHJpdmVzICovCisgICAgaWYgKGJzLT5zZyB8fCAhYmRydl9pc19pbnNlcnRlZChicykpIHsKKyAgICAgICAgYmRydl9kZWxldGUoYnMpOworICAgICAgICBkcnYgPSBiZHJ2X2ZpbmRfZm9ybWF0KCJyYXciKTsKKyAgICAgICAgaWYgKCFkcnYpIHsKKyAgICAgICAgICAgIHJldCA9IC1FTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgKnBkcnYgPSBkcnY7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gYmRydl9wcmVhZChicywgMCwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgYmRydl9kZWxldGUoYnMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICpwZHJ2ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzY29yZV9tYXggPSAwOworICAgIGRydiA9IE5VTEw7CisgICAgUUxJU1RfRk9SRUFDSChkcnYxLCAmYmRydl9kcml2ZXJzLCBsaXN0KSB7CisgICAgICAgIGlmIChkcnYxLT5iZHJ2X3Byb2JlKSB7CisgICAgICAgICAgICBzY29yZSA9IGRydjEtPmJkcnZfcHJvYmUoYnVmLCByZXQsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlmIChzY29yZSA+IHNjb3JlX21heCkgeworICAgICAgICAgICAgICAgIHNjb3JlX21heCA9IHNjb3JlOworICAgICAgICAgICAgICAgIGRydiA9IGRydjE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFkcnYpIHsKKyAgICAgICAgcmV0ID0gLUVOT0VOVDsKKyAgICB9CisgICAgKnBkcnYgPSBkcnY7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBTZXQgdGhlIGN1cnJlbnQgJ3RvdGFsX3NlY3RvcnMnIHZhbHVlCisgKi8KK3N0YXRpYyBpbnQgcmVmcmVzaF90b3RhbF9zZWN0b3JzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IGhpbnQpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisKKyAgICAvKiBEbyBub3QgYXR0ZW1wdCBkcnYtPmJkcnZfZ2V0bGVuZ3RoKCkgb24gc2NzaS1nZW5lcmljIGRldmljZXMgKi8KKyAgICBpZiAoYnMtPnNnKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHF1ZXJ5IGFjdHVhbCBkZXZpY2UgaWYgcG9zc2libGUsIG90aGVyd2lzZSBqdXN0IHRydXN0IHRoZSBoaW50ICovCisgICAgaWYgKGRydi0+YmRydl9nZXRsZW5ndGgpIHsKKyAgICAgICAgaW50NjRfdCBsZW5ndGggPSBkcnYtPmJkcnZfZ2V0bGVuZ3RoKGJzKTsKKyAgICAgICAgaWYgKGxlbmd0aCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaGludCA9IGxlbmd0aCA+PiBCRFJWX1NFQ1RPUl9CSVRTOworICAgIH0KKworICAgIGJzLT50b3RhbF9zZWN0b3JzID0gaGludDsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENvbW1vbiBwYXJ0IGZvciBvcGVuaW5nIGRpc2sgaW1hZ2VzIGFuZCBmaWxlcworICovCitzdGF0aWMgaW50IGJkcnZfb3Blbl9jb21tb24oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgIGludCBmbGFncywgQmxvY2tEcml2ZXIgKmRydikKK3sKKyAgICBpbnQgcmV0LCBvcGVuX2ZsYWdzOworCisgICAgYXNzZXJ0KGRydiAhPSBOVUxMKTsKKworICAgIGJzLT5maWxlID0gTlVMTDsKKyAgICBicy0+dG90YWxfc2VjdG9ycyA9IDA7CisgICAgYnMtPmVuY3J5cHRlZCA9IDA7CisgICAgYnMtPnZhbGlkX2tleSA9IDA7CisgICAgYnMtPm9wZW5fZmxhZ3MgPSBmbGFnczsKKyAgICAvKiBidWZmZXJfYWxpZ25tZW50IGRlZmF1bHRlZCB0byA1MTIsIGRyaXZlcnMgY2FuIGNoYW5nZSB0aGlzIHZhbHVlICovCisgICAgYnMtPmJ1ZmZlcl9hbGlnbm1lbnQgPSA1MTI7CisKKyAgICBwc3RyY3B5KGJzLT5maWxlbmFtZSwgc2l6ZW9mKGJzLT5maWxlbmFtZSksIGZpbGVuYW1lKTsKKworICAgIGlmICh1c2VfYmRydl93aGl0ZWxpc3QgJiYgIWJkcnZfaXNfd2hpdGVsaXN0ZWQoZHJ2KSkgeworICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgfQorCisgICAgYnMtPmRydiA9IGRydjsKKyAgICBicy0+b3BhcXVlID0gZ19tYWxsb2MwKGRydi0+aW5zdGFuY2Vfc2l6ZSk7CisKKyAgICAvKgorICAgICAqIFllcywgQkRSVl9PX05PQ0FDSEUgYWthIE9fRElSRUNUIG1lYW5zIHdlIGhhdmUgdG8gcHJlc2VudCBhCisgICAgICogd3JpdGUgY2FjaGUgdG8gdGhlIGd1ZXN0LiAgV2UgZG8gbmVlZCB0aGUgZmRhdGFzeW5jIHRvIGZsdXNoCisgICAgICogb3V0IHRyYW5zYWN0aW9ucyBmb3IgYmxvY2sgYWxsb2NhdGlvbnMsIGFuZCB3ZSBtYXliZSBoYXZlIGEKKyAgICAgKiB2b2xhdGlsZSB3cml0ZSBjYWNoZSBpbiBvdXIgYmFja2luZyBkZXZpY2UgdG8gZGVhbCB3aXRoLgorICAgICAqLworICAgIGlmIChmbGFncyAmIChCRFJWX09fQ0FDSEVfV0J8QkRSVl9PX05PQ0FDSEUpKQorICAgICAgICBicy0+ZW5hYmxlX3dyaXRlX2NhY2hlID0gMTsKKworICAgIC8qCisgICAgICogQ2xlYXIgZmxhZ3MgdGhhdCBhcmUgaW50ZXJuYWwgdG8gdGhlIGJsb2NrIGxheWVyIGJlZm9yZSBvcGVuaW5nIHRoZQorICAgICAqIGltYWdlLgorICAgICAqLworICAgIG9wZW5fZmxhZ3MgPSBmbGFncyAmIH4oQkRSVl9PX1NOQVBTSE9UIHwgQkRSVl9PX05PX0JBQ0tJTkcpOworCisgICAgLyoKKyAgICAgKiBTbmFwc2hvdHMgc2hvdWxkIGJlIHdyaXRlYWJsZS4KKyAgICAgKi8KKyAgICBpZiAoYnMtPmlzX3RlbXBvcmFyeSkgeworICAgICAgICBvcGVuX2ZsYWdzIHw9IEJEUlZfT19SRFdSOworICAgIH0KKworICAgIC8qIE9wZW4gdGhlIGltYWdlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdXNpbmcgYSBwcm90b2NvbCAqLworICAgIGlmIChkcnYtPmJkcnZfZmlsZV9vcGVuKSB7CisgICAgICAgIHJldCA9IGRydi0+YmRydl9maWxlX29wZW4oYnMsIGZpbGVuYW1lLCBvcGVuX2ZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBiZHJ2X2ZpbGVfb3BlbigmYnMtPmZpbGUsIGZpbGVuYW1lLCBvcGVuX2ZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZXQgPSBkcnYtPmJkcnZfb3Blbihicywgb3Blbl9mbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGZyZWVfYW5kX2ZhaWw7CisgICAgfQorCisgICAgYnMtPmtlZXBfcmVhZF9vbmx5ID0gYnMtPnJlYWRfb25seSA9ICEob3Blbl9mbGFncyAmIEJEUlZfT19SRFdSKTsKKworICAgIHJldCA9IHJlZnJlc2hfdG90YWxfc2VjdG9ycyhicywgYnMtPnRvdGFsX3NlY3RvcnMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfZmFpbDsKKyAgICB9CisKKyNpZm5kZWYgX1dJTjMyCisgICAgaWYgKGJzLT5pc190ZW1wb3JhcnkpIHsKKyAgICAgICAgdW5saW5rKGZpbGVuYW1lKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKKworZnJlZV9hbmRfZmFpbDoKKyAgICBpZiAoYnMtPmZpbGUpIHsKKyAgICAgICAgYmRydl9kZWxldGUoYnMtPmZpbGUpOworICAgICAgICBicy0+ZmlsZSA9IE5VTEw7CisgICAgfQorICAgIGdfZnJlZShicy0+b3BhcXVlKTsKKyAgICBicy0+b3BhcXVlID0gTlVMTDsKKyAgICBicy0+ZHJ2ID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogT3BlbnMgYSBmaWxlIHVzaW5nIGEgcHJvdG9jb2wgKGZpbGUsIGhvc3RfZGV2aWNlLCBuYmQsIC4uLikKKyAqLworaW50IGJkcnZfZmlsZV9vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKipwYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisgICAgQmxvY2tEcml2ZXIgKmRydjsKKyAgICBpbnQgcmV0OworCisgICAgZHJ2ID0gYmRydl9maW5kX3Byb3RvY29sKGZpbGVuYW1lKTsKKyAgICBpZiAoIWRydikgeworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICBicyA9IGJkcnZfbmV3KCIiKTsKKyAgICByZXQgPSBiZHJ2X29wZW5fY29tbW9uKGJzLCBmaWxlbmFtZSwgZmxhZ3MsIGRydik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYmRydl9kZWxldGUoYnMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBicy0+Z3Jvd2FibGUgPSAxOworICAgICpwYnMgPSBiczsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW5zIGEgZGlzayBpbWFnZSAocmF3LCBxY293Miwgdm1kaywgLi4uKQorICovCitpbnQgYmRydl9vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICBCbG9ja0RyaXZlciAqZHJ2KQoreworICAgIGludCByZXQ7CisgICAgaW50IHByb2JlZCA9IDA7CisKKyAgICBpZiAoZmxhZ3MgJiBCRFJWX09fU05BUFNIT1QpIHsKKyAgICAgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnMxOworICAgICAgICBpbnQ2NF90IHRvdGFsX3NpemU7CisgICAgICAgIGludCBpc19wcm90b2NvbCA9IDA7CisgICAgICAgIEJsb2NrRHJpdmVyICpiZHJ2X3Fjb3cyOworICAgICAgICBRRU1VT3B0aW9uUGFyYW1ldGVyICpvcHRpb25zOworICAgICAgICBjaGFyIHRtcF9maWxlbmFtZVtQQVRIX01BWF07CisgICAgICAgIGNoYXIgYmFja2luZ19maWxlbmFtZVtQQVRIX01BWF07CisKKyAgICAgICAgLyogaWYgc25hcHNob3QsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBiYWNraW5nIGZpbGUgYW5kIG9wZW4gaXQKKyAgICAgICAgICAgaW5zdGVhZCBvZiBvcGVuaW5nICdmaWxlbmFtZScgZGlyZWN0bHkgKi8KKworICAgICAgICAvKiBpZiB0aGVyZSBpcyBhIGJhY2tpbmcgZmlsZSwgdXNlIGl0ICovCisgICAgICAgIGJzMSA9IGJkcnZfbmV3KCIiKTsKKyAgICAgICAgcmV0ID0gYmRydl9vcGVuKGJzMSwgZmlsZW5hbWUsIDAsIGRydik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBiZHJ2X2RlbGV0ZShiczEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbF9zaXplID0gYmRydl9nZXRsZW5ndGgoYnMxKSAmIEJEUlZfU0VDVE9SX01BU0s7CisKKyAgICAgICAgaWYgKGJzMS0+ZHJ2ICYmIGJzMS0+ZHJ2LT5wcm90b2NvbF9uYW1lKQorICAgICAgICAgICAgaXNfcHJvdG9jb2wgPSAxOworCisgICAgICAgIGJkcnZfZGVsZXRlKGJzMSk7CisKKyAgICAgICAgZ2V0X3RtcF9maWxlbmFtZSh0bXBfZmlsZW5hbWUsIHNpemVvZih0bXBfZmlsZW5hbWUpKTsKKworICAgICAgICAvKiBSZWFsIHBhdGggaXMgbWVhbmluZ2xlc3MgZm9yIHByb3RvY29scyAqLworICAgICAgICBpZiAoaXNfcHJvdG9jb2wpCisgICAgICAgICAgICBzbnByaW50ZihiYWNraW5nX2ZpbGVuYW1lLCBzaXplb2YoYmFja2luZ19maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAiJXMiLCBmaWxlbmFtZSk7CisgICAgICAgIGVsc2UgaWYgKCFyZWFscGF0aChmaWxlbmFtZSwgYmFja2luZ19maWxlbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgICAgIGJkcnZfcWNvdzIgPSBiZHJ2X2ZpbmRfZm9ybWF0KCJxY293MiIpOworICAgICAgICBvcHRpb25zID0gcGFyc2Vfb3B0aW9uX3BhcmFtZXRlcnMoIiIsIGJkcnZfcWNvdzItPmNyZWF0ZV9vcHRpb25zLCBOVUxMKTsKKworICAgICAgICBzZXRfb3B0aW9uX3BhcmFtZXRlcl9pbnQob3B0aW9ucywgQkxPQ0tfT1BUX1NJWkUsIHRvdGFsX3NpemUpOworICAgICAgICBzZXRfb3B0aW9uX3BhcmFtZXRlcihvcHRpb25zLCBCTE9DS19PUFRfQkFDS0lOR19GSUxFLCBiYWNraW5nX2ZpbGVuYW1lKTsKKyAgICAgICAgaWYgKGRydikgeworICAgICAgICAgICAgc2V0X29wdGlvbl9wYXJhbWV0ZXIob3B0aW9ucywgQkxPQ0tfT1BUX0JBQ0tJTkdfRk1ULAorICAgICAgICAgICAgICAgIGRydi0+Zm9ybWF0X25hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYmRydl9jcmVhdGUoYmRydl9xY293MiwgdG1wX2ZpbGVuYW1lLCBvcHRpb25zKTsKKyAgICAgICAgZnJlZV9vcHRpb25fcGFyYW1ldGVycyhvcHRpb25zKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmaWxlbmFtZSA9IHRtcF9maWxlbmFtZTsKKyAgICAgICAgZHJ2ID0gYmRydl9xY293MjsKKyAgICAgICAgYnMtPmlzX3RlbXBvcmFyeSA9IDE7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgcmlnaHQgaW1hZ2UgZm9ybWF0IGRyaXZlciAqLworICAgIGlmICghZHJ2KSB7CisgICAgICAgIHJldCA9IGZpbmRfaW1hZ2VfZm9ybWF0KGZpbGVuYW1lLCAmZHJ2KTsKKyAgICAgICAgcHJvYmVkID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWRydikgeworICAgICAgICBnb3RvIHVubGlua19hbmRfZmFpbDsKKyAgICB9CisKKyAgICAvKiBPcGVuIHRoZSBpbWFnZSAqLworICAgIHJldCA9IGJkcnZfb3Blbl9jb21tb24oYnMsIGZpbGVuYW1lLCBmbGFncywgZHJ2KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIHVubGlua19hbmRfZmFpbDsKKyAgICB9CisKKyAgICBicy0+cHJvYmVkID0gcHJvYmVkOworCisgICAgLyogSWYgdGhlcmUgaXMgYSBiYWNraW5nIGZpbGUsIHVzZSBpdCAqLworICAgIGlmICgoZmxhZ3MgJiBCRFJWX09fTk9fQkFDS0lORykgPT0gMCAmJiBicy0+YmFja2luZ19maWxlWzBdICE9ICdcMCcpIHsKKyAgICAgICAgY2hhciBiYWNraW5nX2ZpbGVuYW1lW1BBVEhfTUFYXTsKKyAgICAgICAgaW50IGJhY2tfZmxhZ3M7CisgICAgICAgIEJsb2NrRHJpdmVyICpiYWNrX2RydiA9IE5VTEw7CisKKyAgICAgICAgYnMtPmJhY2tpbmdfaGQgPSBiZHJ2X25ldygiIik7CisgICAgICAgIHBhdGhfY29tYmluZShiYWNraW5nX2ZpbGVuYW1lLCBzaXplb2YoYmFja2luZ19maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgYnMtPmJhY2tpbmdfZmlsZSk7CisgICAgICAgIGlmIChicy0+YmFja2luZ19mb3JtYXRbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgIGJhY2tfZHJ2ID0gYmRydl9maW5kX2Zvcm1hdChicy0+YmFja2luZ19mb3JtYXQpOworCisgICAgICAgIC8qIGJhY2tpbmcgZmlsZXMgYWx3YXlzIG9wZW5lZCByZWFkLW9ubHkgKi8KKyAgICAgICAgYmFja19mbGFncyA9CisgICAgICAgICAgICBmbGFncyAmIH4oQkRSVl9PX1JEV1IgfCBCRFJWX09fU05BUFNIT1QgfCBCRFJWX09fTk9fQkFDS0lORyk7CisKKyAgICAgICAgcmV0ID0gYmRydl9vcGVuKGJzLT5iYWNraW5nX2hkLCBiYWNraW5nX2ZpbGVuYW1lLCBiYWNrX2ZsYWdzLCBiYWNrX2Rydik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBiZHJ2X2Nsb3NlKGJzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJzLT5pc190ZW1wb3JhcnkpIHsKKyAgICAgICAgICAgIGJzLT5iYWNraW5nX2hkLT5rZWVwX3JlYWRfb25seSA9ICEoZmxhZ3MgJiBCRFJWX09fUkRXUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBiYXNlIGltYWdlIGluaGVyaXRzIGZyb20gInBhcmVudCIgKi8KKyAgICAgICAgICAgIGJzLT5iYWNraW5nX2hkLT5rZWVwX3JlYWRfb25seSA9IGJzLT5rZWVwX3JlYWRfb25seTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYmRydl9rZXlfcmVxdWlyZWQoYnMpKSB7CisgICAgICAgIC8qIGNhbGwgdGhlIGNoYW5nZSBjYWxsYmFjayAqLworICAgICAgICBicy0+bWVkaWFfY2hhbmdlZCA9IDE7CisgICAgICAgIGlmIChicy0+Y2hhbmdlX2NiKQorICAgICAgICAgICAgYnMtPmNoYW5nZV9jYihicy0+Y2hhbmdlX29wYXF1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK3VubGlua19hbmRfZmFpbDoKKyAgICBpZiAoYnMtPmlzX3RlbXBvcmFyeSkgeworICAgICAgICB1bmxpbmsoZmlsZW5hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGJkcnZfY2xvc2UoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgaWYgKGJzLT5kcnYpIHsKKyAgICAgICAgaWYgKGJzID09IGJzX3NuYXBzaG90cykgeworICAgICAgICAgICAgYnNfc25hcHNob3RzID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnMtPmJhY2tpbmdfaGQpIHsKKyAgICAgICAgICAgIGJkcnZfZGVsZXRlKGJzLT5iYWNraW5nX2hkKTsKKyAgICAgICAgICAgIGJzLT5iYWNraW5nX2hkID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicy0+ZHJ2LT5iZHJ2X2Nsb3NlKGJzKTsKKyAgICAgICAgZ19mcmVlKGJzLT5vcGFxdWUpOworI2lmZGVmIF9XSU4zMgorICAgICAgICBpZiAoYnMtPmlzX3RlbXBvcmFyeSkgeworICAgICAgICAgICAgdW5saW5rKGJzLT5maWxlbmFtZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBicy0+b3BhcXVlID0gTlVMTDsKKyAgICAgICAgYnMtPmRydiA9IE5VTEw7CisKKyAgICAgICAgaWYgKGJzLT5maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJkcnZfY2xvc2UoYnMtPmZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgLyogY2FsbCB0aGUgY2hhbmdlIGNhbGxiYWNrICovCisgICAgICAgIGJzLT5tZWRpYV9jaGFuZ2VkID0gMTsKKyAgICAgICAgaWYgKGJzLT5jaGFuZ2VfY2IpCisgICAgICAgICAgICBicy0+Y2hhbmdlX2NiKGJzLT5jaGFuZ2Vfb3BhcXVlKTsKKyAgICB9Cit9CisKK3ZvaWQgYmRydl9jbG9zZV9hbGwodm9pZCkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKworICAgIFFUQUlMUV9GT1JFQUNIKGJzLCAmYmRydl9zdGF0ZXMsIGxpc3QpIHsKKyAgICAgICAgYmRydl9jbG9zZShicyk7CisgICAgfQorfQorCit2b2lkIGJkcnZfZGVsZXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIGFzc2VydCghYnMtPnBlZXIpOworCisgICAgLyogcmVtb3ZlIGZyb20gbGlzdCwgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKGJzLT5kZXZpY2VfbmFtZVswXSAhPSAnXDAnKSB7CisgICAgICAgIFFUQUlMUV9SRU1PVkUoJmJkcnZfc3RhdGVzLCBicywgbGlzdCk7CisgICAgfQorCisgICAgYmRydl9jbG9zZShicyk7CisgICAgaWYgKGJzLT5maWxlICE9IE5VTEwpIHsKKyAgICAgICAgYmRydl9kZWxldGUoYnMtPmZpbGUpOworICAgIH0KKworICAgIGFzc2VydChicyAhPSBic19zbmFwc2hvdHMpOworICAgIGdfZnJlZShicyk7Cit9CisKK2ludCBiZHJ2X2F0dGFjaChCbG9ja0RyaXZlclN0YXRlICpicywgRGV2aWNlU3RhdGUgKnFkZXYpCit7CisgICAgaWYgKGJzLT5wZWVyKSB7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorICAgIGJzLT5wZWVyID0gcWRldjsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBiZHJ2X2RldGFjaChCbG9ja0RyaXZlclN0YXRlICpicywgRGV2aWNlU3RhdGUgKnFkZXYpCit7CisgICAgYXNzZXJ0KGJzLT5wZWVyID09IHFkZXYpOworICAgIGJzLT5wZWVyID0gTlVMTDsKK30KKworRGV2aWNlU3RhdGUgKmJkcnZfZ2V0X2F0dGFjaGVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+cGVlcjsKK30KKworLyoKKyAqIFJ1biBjb25zaXN0ZW5jeSBjaGVja3Mgb24gYW4gaW1hZ2UKKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIGNoZWNrIGNvdWxkIGJlIGNvbXBsZXRlZCAoaXQgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGltYWdlIGlzCisgKiBmcmVlIG9mIGVycm9ycykgb3IgLWVycm5vIHdoZW4gYW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJlZC4gVGhlIHJlc3VsdHMgb2YgdGhlCisgKiBjaGVjayBhcmUgc3RvcmVkIGluIHJlcy4KKyAqLworaW50IGJkcnZfY2hlY2soQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIEJkcnZDaGVja1Jlc3VsdCAqcmVzKQoreworICAgIGlmIChicy0+ZHJ2LT5iZHJ2X2NoZWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIH0KKworICAgIG1lbXNldChyZXMsIDAsIHNpemVvZigqcmVzKSk7CisgICAgcmV0dXJuIGJzLT5kcnYtPmJkcnZfY2hlY2soYnMsIHJlcyk7Cit9CisKKyNkZWZpbmUgQ09NTUlUX0JVRl9TRUNUT1JTIDIwNDgKKworLyogY29tbWl0IENPVyBmaWxlIGludG8gdGhlIHJhdyBpbWFnZSAqLworaW50IGJkcnZfY29tbWl0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIGludDY0X3Qgc2VjdG9yLCB0b3RhbF9zZWN0b3JzOworICAgIGludCBuLCBybywgb3Blbl9mbGFnczsKKyAgICBpbnQgcmV0ID0gMCwgcndfcmV0ID0gMDsKKyAgICB1aW50OF90ICpidWY7CisgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKyAgICBCbG9ja0RyaXZlclN0YXRlICpic19ydywgKmJzX3JvOworCisgICAgaWYgKCFkcnYpCisgICAgICAgIHJldHVybiAtRU5PTUVESVVNOworCisgICAgaWYgKCFicy0+YmFja2luZ19oZCkgeworICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgfQorCisgICAgaWYgKGJzLT5iYWNraW5nX2hkLT5rZWVwX3JlYWRfb25seSkgeworICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICB9CisKKyAgICBybyA9IGJzLT5iYWNraW5nX2hkLT5yZWFkX29ubHk7CisgICAgc3RybmNweShmaWxlbmFtZSwgYnMtPmJhY2tpbmdfaGQtPmZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpKTsKKyAgICBvcGVuX2ZsYWdzID0gIGJzLT5iYWNraW5nX2hkLT5vcGVuX2ZsYWdzOworCisgICAgaWYgKHJvKSB7CisgICAgICAgIC8qIHJlLW9wZW4gYXMgUlcgKi8KKyAgICAgICAgYmRydl9kZWxldGUoYnMtPmJhY2tpbmdfaGQpOworICAgICAgICBicy0+YmFja2luZ19oZCA9IE5VTEw7CisgICAgICAgIGJzX3J3ID0gYmRydl9uZXcoIiIpOworICAgICAgICByd19yZXQgPSBiZHJ2X29wZW4oYnNfcncsIGZpbGVuYW1lLCBvcGVuX2ZsYWdzIHwgQkRSVl9PX1JEV1IsIGRydik7CisgICAgICAgIGlmIChyd19yZXQgPCAwKSB7CisgICAgICAgICAgICBiZHJ2X2RlbGV0ZShic19ydyk7CisgICAgICAgICAgICAvKiB0cnkgdG8gcmUtb3BlbiByZWFkLW9ubHkgKi8KKyAgICAgICAgICAgIGJzX3JvID0gYmRydl9uZXcoIiIpOworICAgICAgICAgICAgcmV0ID0gYmRydl9vcGVuKGJzX3JvLCBmaWxlbmFtZSwgb3Blbl9mbGFncyAmIH5CRFJWX09fUkRXUiwgZHJ2KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYmRydl9kZWxldGUoYnNfcm8pOworICAgICAgICAgICAgICAgIC8qIGRyaXZlIG5vdCBmdW5jdGlvbmFsIGFueW1vcmUgKi8KKyAgICAgICAgICAgICAgICBicy0+ZHJ2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnMtPmJhY2tpbmdfaGQgPSBic19ybzsKKyAgICAgICAgICAgIHJldHVybiByd19yZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnMtPmJhY2tpbmdfaGQgPSBic19ydzsKKyAgICB9CisKKyAgICB0b3RhbF9zZWN0b3JzID0gYmRydl9nZXRsZW5ndGgoYnMpID4+IEJEUlZfU0VDVE9SX0JJVFM7CisgICAgYnVmID0gZ19tYWxsb2MoQ09NTUlUX0JVRl9TRUNUT1JTICogQkRSVl9TRUNUT1JfU0laRSk7CisKKyAgICBmb3IgKHNlY3RvciA9IDA7IHNlY3RvciA8IHRvdGFsX3NlY3RvcnM7IHNlY3RvciArPSBuKSB7CisgICAgICAgIGlmIChkcnYtPmJkcnZfaXNfYWxsb2NhdGVkKGJzLCBzZWN0b3IsIENPTU1JVF9CVUZfU0VDVE9SUywgJm4pKSB7CisKKyAgICAgICAgICAgIGlmIChiZHJ2X3JlYWQoYnMsIHNlY3RvciwgYnVmLCBuKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLUVJTzsKKyAgICAgICAgICAgICAgICBnb3RvIHJvX2NsZWFudXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiZHJ2X3dyaXRlKGJzLT5iYWNraW5nX2hkLCBzZWN0b3IsIGJ1ZiwgbikgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IC1FSU87CisgICAgICAgICAgICAgICAgZ290byByb19jbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRydi0+YmRydl9tYWtlX2VtcHR5KSB7CisgICAgICAgIHJldCA9IGRydi0+YmRydl9tYWtlX2VtcHR5KGJzKTsKKyAgICAgICAgYmRydl9mbHVzaChicyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgYWxsIGRhdGEgd2Ugd3JvdGUgdG8gdGhlIGJhY2tpbmcgZGV2aWNlIGlzIGFjdHVhbGx5CisgICAgICogc3RhYmxlIG9uIGRpc2suCisgICAgICovCisgICAgaWYgKGJzLT5iYWNraW5nX2hkKQorICAgICAgICBiZHJ2X2ZsdXNoKGJzLT5iYWNraW5nX2hkKTsKKworcm9fY2xlYW51cDoKKyAgICBnX2ZyZWUoYnVmKTsKKworICAgIGlmIChybykgeworICAgICAgICAvKiByZS1vcGVuIGFzIFJPICovCisgICAgICAgIGJkcnZfZGVsZXRlKGJzLT5iYWNraW5nX2hkKTsKKyAgICAgICAgYnMtPmJhY2tpbmdfaGQgPSBOVUxMOworICAgICAgICBic19ybyA9IGJkcnZfbmV3KCIiKTsKKyAgICAgICAgcmV0ID0gYmRydl9vcGVuKGJzX3JvLCBmaWxlbmFtZSwgb3Blbl9mbGFncyAmIH5CRFJWX09fUkRXUiwgZHJ2KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGJkcnZfZGVsZXRlKGJzX3JvKTsKKyAgICAgICAgICAgIC8qIGRyaXZlIG5vdCBmdW5jdGlvbmFsIGFueW1vcmUgKi8KKyAgICAgICAgICAgIGJzLT5kcnYgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBicy0+YmFja2luZ19oZCA9IGJzX3JvOworICAgICAgICBicy0+YmFja2luZ19oZC0+a2VlcF9yZWFkX29ubHkgPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYmRydl9jb21taXRfYWxsKHZvaWQpCit7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisKKyAgICBRVEFJTFFfRk9SRUFDSChicywgJmJkcnZfc3RhdGVzLCBsaXN0KSB7CisgICAgICAgIGJkcnZfY29tbWl0KGJzKTsKKyAgICB9Cit9CisKKy8qCisgKiBSZXR1cm4gdmFsdWVzOgorICogMCAgICAgICAgLSBzdWNjZXNzCisgKiAtRUlOVkFMICAtIGJhY2tpbmcgZm9ybWF0IHNwZWNpZmllZCwgYnV0IG5vIGZpbGUKKyAqIC1FTk9TUEMgIC0gY2FuJ3QgdXBkYXRlIHRoZSBiYWNraW5nIGZpbGUgYmVjYXVzZSBubyBzcGFjZSBpcyBsZWZ0IGluIHRoZQorICogICAgICAgICAgICBpbWFnZSBmaWxlIGhlYWRlcgorICogLUVOT1RTVVAgLSBmb3JtYXQgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUgYmFja2luZyBmaWxlCisgKi8KK2ludCBiZHJ2X2NoYW5nZV9iYWNraW5nX2ZpbGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgY29uc3QgY2hhciAqYmFja2luZ19maWxlLCBjb25zdCBjaGFyICpiYWNraW5nX2ZtdCkKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKworICAgIGlmIChkcnYtPmJkcnZfY2hhbmdlX2JhY2tpbmdfZmlsZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBkcnYtPmJkcnZfY2hhbmdlX2JhY2tpbmdfZmlsZShicywgYmFja2luZ19maWxlLCBiYWNraW5nX2ZtdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIH0KK30KKworc3RhdGljIGludCBiZHJ2X2NoZWNrX2J5dGVfcmVxdWVzdChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIGludDY0X3QgbGVuOworCisgICAgaWYgKCFiZHJ2X2lzX2luc2VydGVkKGJzKSkKKyAgICAgICAgcmV0dXJuIC1FTk9NRURJVU07CisKKyAgICBpZiAoYnMtPmdyb3dhYmxlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGxlbiA9IGJkcnZfZ2V0bGVuZ3RoKGJzKTsKKworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIGlmICgob2Zmc2V0ID4gbGVuKSB8fCAobGVuIC0gb2Zmc2V0IDwgc2l6ZSkpCisgICAgICAgIHJldHVybiAtRUlPOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmRydl9jaGVja19yZXF1ZXN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICByZXR1cm4gYmRydl9jaGVja19ieXRlX3JlcXVlc3QoYnMsIHNlY3Rvcl9udW0gKiBCRFJWX1NFQ1RPUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zZWN0b3JzICogQkRSVl9TRUNUT1JfU0laRSk7Cit9CisKKy8qIHJldHVybiA8IDAgaWYgZXJyb3IuIFNlZSBiZHJ2X3dyaXRlKCkgZm9yIHRoZSByZXR1cm4gY29kZXMgKi8KK2ludCBiZHJ2X3JlYWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoYmRydl9jaGVja19yZXF1ZXN0KGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzKSkKKyAgICAgICAgcmV0dXJuIC1FSU87CisKKyAgICByZXR1cm4gZHJ2LT5iZHJ2X3JlYWQoYnMsIHNlY3Rvcl9udW0sIGJ1ZiwgbmJfc2VjdG9ycyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kaXJ0eV9iaXRtYXAoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NlY3RvcnMsIGludCBkaXJ0eSkKK3sKKyAgICBpbnQ2NF90IHN0YXJ0LCBlbmQ7CisgICAgdW5zaWduZWQgbG9uZyB2YWwsIGlkeCwgYml0OworCisgICAgc3RhcnQgPSBzZWN0b3JfbnVtIC8gQkRSVl9TRUNUT1JTX1BFUl9ESVJUWV9DSFVOSzsKKyAgICBlbmQgPSAoc2VjdG9yX251bSArIG5iX3NlY3RvcnMgLSAxKSAvIEJEUlZfU0VDVE9SU19QRVJfRElSVFlfQ0hVTks7CisKKyAgICBmb3IgKDsgc3RhcnQgPD0gZW5kOyBzdGFydCsrKSB7CisgICAgICAgIGlkeCA9IHN0YXJ0IC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpOworICAgICAgICBiaXQgPSBzdGFydCAlIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KTsKKyAgICAgICAgdmFsID0gYnMtPmRpcnR5X2JpdG1hcFtpZHhdOworICAgICAgICBpZiAoZGlydHkpIHsKKyAgICAgICAgICAgIGlmICghKHZhbCAmICgxIDw8IGJpdCkpKSB7CisgICAgICAgICAgICAgICAgYnMtPmRpcnR5X2NvdW50Kys7CisgICAgICAgICAgICAgICAgdmFsIHw9IDEgPDwgYml0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHZhbCAmICgxIDw8IGJpdCkpIHsKKyAgICAgICAgICAgICAgICBicy0+ZGlydHlfY291bnQtLTsKKyAgICAgICAgICAgICAgICB2YWwgJj0gfigxIDw8IGJpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnMtPmRpcnR5X2JpdG1hcFtpZHhdID0gdmFsOworICAgIH0KK30KKworLyogUmV0dXJuIDwgMCBpZiBlcnJvci4gSW1wb3J0YW50IGVycm9ycyBhcmU6CisgIC1FSU8gICAgICAgICBnZW5lcmljIEkvTyBlcnJvciAobWF5IGhhcHBlbiBmb3IgYWxsIGVycm9ycykKKyAgLUVOT01FRElVTSAgIE5vIG1lZGlhIGluc2VydGVkLgorICAtRUlOVkFMICAgICAgSW52YWxpZCBzZWN0b3IgbnVtYmVyIG9yIG5iX3NlY3RvcnMKKyAgLUVBQ0NFUyAgICAgIFRyeWluZyB0byB3cml0ZSBhIHJlYWQtb25seSBkZXZpY2UKKyovCitpbnQgYmRydl93cml0ZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpZiAoIWJzLT5kcnYpCisgICAgICAgIHJldHVybiAtRU5PTUVESVVNOworICAgIGlmIChicy0+cmVhZF9vbmx5KQorICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICBpZiAoYmRydl9jaGVja19yZXF1ZXN0KGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzKSkKKyAgICAgICAgcmV0dXJuIC1FSU87CisKKyAgICBpZiAoYnMtPmRpcnR5X2JpdG1hcCkgeworICAgICAgICBzZXRfZGlydHlfYml0bWFwKGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzLCAxKTsKKyAgICB9CisKKyAgICBpZiAoYnMtPndyX2hpZ2hlc3Rfc2VjdG9yIDwgc2VjdG9yX251bSArIG5iX3NlY3RvcnMgLSAxKSB7CisgICAgICAgIGJzLT53cl9oaWdoZXN0X3NlY3RvciA9IHNlY3Rvcl9udW0gKyBuYl9zZWN0b3JzIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gZHJ2LT5iZHJ2X3dyaXRlKGJzLCBzZWN0b3JfbnVtLCBidWYsIG5iX3NlY3RvcnMpOworfQorCitpbnQgYmRydl9wcmVhZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICB2b2lkICpidWYsIGludCBjb3VudDEpCit7CisgICAgdWludDhfdCB0bXBfYnVmW0JEUlZfU0VDVE9SX1NJWkVdOworICAgIGludCBsZW4sIG5iX3NlY3RvcnMsIGNvdW50OworICAgIGludDY0X3Qgc2VjdG9yX251bTsKKyAgICBpbnQgcmV0OworCisgICAgY291bnQgPSBjb3VudDE7CisgICAgLyogZmlyc3QgcmVhZCB0byBhbGlnbiB0byBzZWN0b3Igc3RhcnQgKi8KKyAgICBsZW4gPSAoQkRSVl9TRUNUT1JfU0laRSAtIG9mZnNldCkgJiAoQkRSVl9TRUNUT1JfU0laRSAtIDEpOworICAgIGlmIChsZW4gPiBjb3VudCkKKyAgICAgICAgbGVuID0gY291bnQ7CisgICAgc2VjdG9yX251bSA9IG9mZnNldCA+PiBCRFJWX1NFQ1RPUl9CSVRTOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGlmICgocmV0ID0gYmRydl9yZWFkKGJzLCBzZWN0b3JfbnVtLCB0bXBfYnVmLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgdG1wX2J1ZiArIChvZmZzZXQgJiAoQkRSVl9TRUNUT1JfU0laRSAtIDEpKSwgbGVuKTsKKyAgICAgICAgY291bnQgLT0gbGVuOworICAgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjb3VudDE7CisgICAgICAgIHNlY3Rvcl9udW0rKzsKKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICB9CisKKyAgICAvKiByZWFkIHRoZSBzZWN0b3JzICJpbiBwbGFjZSIgKi8KKyAgICBuYl9zZWN0b3JzID0gY291bnQgPj4gQkRSVl9TRUNUT1JfQklUUzsKKyAgICBpZiAobmJfc2VjdG9ycyA+IDApIHsKKyAgICAgICAgaWYgKChyZXQgPSBiZHJ2X3JlYWQoYnMsIHNlY3Rvcl9udW0sIGJ1ZiwgbmJfc2VjdG9ycykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHNlY3Rvcl9udW0gKz0gbmJfc2VjdG9yczsKKyAgICAgICAgbGVuID0gbmJfc2VjdG9ycyA8PCBCRFJWX1NFQ1RPUl9CSVRTOworICAgICAgICBidWYgKz0gbGVuOworICAgICAgICBjb3VudCAtPSBsZW47CisgICAgfQorCisgICAgLyogYWRkIGRhdGEgZnJvbSB0aGUgbGFzdCBzZWN0b3IgKi8KKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICAgIGlmICgocmV0ID0gYmRydl9yZWFkKGJzLCBzZWN0b3JfbnVtLCB0bXBfYnVmLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgdG1wX2J1ZiwgY291bnQpOworICAgIH0KKyAgICByZXR1cm4gY291bnQxOworfQorCitpbnQgYmRydl9wd3JpdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGNvdW50MSkKK3sKKyAgICB1aW50OF90IHRtcF9idWZbQkRSVl9TRUNUT1JfU0laRV07CisgICAgaW50IGxlbiwgbmJfc2VjdG9ycywgY291bnQ7CisgICAgaW50NjRfdCBzZWN0b3JfbnVtOworICAgIGludCByZXQ7CisKKyAgICBjb3VudCA9IGNvdW50MTsKKyAgICAvKiBmaXJzdCB3cml0ZSB0byBhbGlnbiB0byBzZWN0b3Igc3RhcnQgKi8KKyAgICBsZW4gPSAoQkRSVl9TRUNUT1JfU0laRSAtIG9mZnNldCkgJiAoQkRSVl9TRUNUT1JfU0laRSAtIDEpOworICAgIGlmIChsZW4gPiBjb3VudCkKKyAgICAgICAgbGVuID0gY291bnQ7CisgICAgc2VjdG9yX251bSA9IG9mZnNldCA+PiBCRFJWX1NFQ1RPUl9CSVRTOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGlmICgocmV0ID0gYmRydl9yZWFkKGJzLCBzZWN0b3JfbnVtLCB0bXBfYnVmLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgbWVtY3B5KHRtcF9idWYgKyAob2Zmc2V0ICYgKEJEUlZfU0VDVE9SX1NJWkUgLSAxKSksIGJ1ZiwgbGVuKTsKKyAgICAgICAgaWYgKChyZXQgPSBiZHJ2X3dyaXRlKGJzLCBzZWN0b3JfbnVtLCB0bXBfYnVmLCAxKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgY291bnQgLT0gbGVuOworICAgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjb3VudDE7CisgICAgICAgIHNlY3Rvcl9udW0rKzsKKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICB9CisKKyAgICAvKiB3cml0ZSB0aGUgc2VjdG9ycyAiaW4gcGxhY2UiICovCisgICAgbmJfc2VjdG9ycyA9IGNvdW50ID4+IEJEUlZfU0VDVE9SX0JJVFM7CisgICAgaWYgKG5iX3NlY3RvcnMgPiAwKSB7CisgICAgICAgIGlmICgocmV0ID0gYmRydl93cml0ZShicywgc2VjdG9yX251bSwgYnVmLCBuYl9zZWN0b3JzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc2VjdG9yX251bSArPSBuYl9zZWN0b3JzOworICAgICAgICBsZW4gPSBuYl9zZWN0b3JzIDw8IEJEUlZfU0VDVE9SX0JJVFM7CisgICAgICAgIGJ1ZiArPSBsZW47CisgICAgICAgIGNvdW50IC09IGxlbjsKKyAgICB9CisKKyAgICAvKiBhZGQgZGF0YSBmcm9tIHRoZSBsYXN0IHNlY3RvciAqLworICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgaWYgKChyZXQgPSBiZHJ2X3JlYWQoYnMsIHNlY3Rvcl9udW0sIHRtcF9idWYsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBtZW1jcHkodG1wX2J1ZiwgYnVmLCBjb3VudCk7CisgICAgICAgIGlmICgocmV0ID0gYmRydl93cml0ZShicywgc2VjdG9yX251bSwgdG1wX2J1ZiwgMSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBjb3VudDE7Cit9CisKKy8qCisgKiBXcml0ZXMgdG8gdGhlIGZpbGUgYW5kIGVuc3VyZXMgdGhhdCBubyB3cml0ZXMgYXJlIHJlb3JkZXJlZCBhY3Jvc3MgdGhpcworICogcmVxdWVzdCAoYWN0cyBhcyBhIGJhcnJpZXIpCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBpbiBlcnJvciBjYXNlcy4KKyAqLworaW50IGJkcnZfcHdyaXRlX3N5bmMoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0LAorICAgIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGNvdW50KQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBiZHJ2X3B3cml0ZShicywgb2Zmc2V0LCBidWYsIGNvdW50KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIE5vIGZsdXNoIG5lZWRlZCBmb3IgY2FjaGU9d3JpdGV0aHJvdWdoLCBpdCB1c2VzIE9fRFNZTkMgKi8KKyAgICBpZiAoKGJzLT5vcGVuX2ZsYWdzICYgQkRSVl9PX0NBQ0hFX01BU0spICE9IDApIHsKKyAgICAgICAgYmRydl9mbHVzaChicyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZXMgdG8gdGhlIGZpbGUgYW5kIGVuc3VyZXMgdGhhdCBubyB3cml0ZXMgYXJlIHJlb3JkZXJlZCBhY3Jvc3MgdGhpcworICogcmVxdWVzdCAoYWN0cyBhcyBhIGJhcnJpZXIpCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBpbiBlcnJvciBjYXNlcy4KKyAqLworaW50IGJkcnZfd3JpdGVfc3luYyhCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpCit7CisgICAgcmV0dXJuIGJkcnZfcHdyaXRlX3N5bmMoYnMsIEJEUlZfU0VDVE9SX1NJWkUgKiBzZWN0b3JfbnVtLAorICAgICAgICBidWYsIEJEUlZfU0VDVE9SX1NJWkUgKiBuYl9zZWN0b3JzKTsKK30KKworLyoqCisgKiBUcnVuY2F0ZSBmaWxlIHRvICdvZmZzZXQnIGJ5dGVzIChuZWVkZWQgb25seSBmb3IgZmlsZSBwcm90b2NvbHMpCisgKi8KK2ludCBiZHJ2X3RydW5jYXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IG9mZnNldCkKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpbnQgcmV0OworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoIWRydi0+YmRydl90cnVuY2F0ZSkKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIGlmIChicy0+cmVhZF9vbmx5KQorICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICByZXQgPSBkcnYtPmJkcnZfdHJ1bmNhdGUoYnMsIG9mZnNldCk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIHJldCA9IHJlZnJlc2hfdG90YWxfc2VjdG9ycyhicywgb2Zmc2V0ID4+IEJEUlZfU0VDVE9SX0JJVFMpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIExlbmd0aCBvZiBhIGZpbGUgaW4gYnl0ZXMuIFJldHVybiA8IDAgaWYgZXJyb3Igb3IgdW5rbm93bi4KKyAqLworaW50NjRfdCBiZHJ2X2dldGxlbmd0aChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpZiAoIWRydikKKyAgICAgICAgcmV0dXJuIC1FTk9NRURJVU07CisKKyAgICAvKiBGaXhlZCBzaXplIGRldmljZXMgdXNlIHRoZSB0b3RhbF9zZWN0b3JzIHZhbHVlIGZvciBzcGVlZCBpbnN0ZWFkIG9mCisgICAgICAgaXNzdWluZyBhIGxlbmd0aCBxdWVyeSAobGlrZSBsc2Vlaykgb24gZWFjaCBjYWxsLiAgQWxzbywgbGVnYWN5IGJsb2NrCisgICAgICAgZHJpdmVycyBkb24ndCBwcm92aWRlIGEgYmRydl9nZXRsZW5ndGggZnVuY3Rpb24gYW5kIG11c3QgdXNlCisgICAgICAgdG90YWxfc2VjdG9ycy4gKi8KKyAgICBpZiAoIWJzLT5ncm93YWJsZSB8fCAhZHJ2LT5iZHJ2X2dldGxlbmd0aCkgeworICAgICAgICByZXR1cm4gYnMtPnRvdGFsX3NlY3RvcnMgKiBCRFJWX1NFQ1RPUl9TSVpFOworICAgIH0KKyAgICByZXR1cm4gZHJ2LT5iZHJ2X2dldGxlbmd0aChicyk7Cit9CisKKy8qIHJldHVybiAwIGFzIG51bWJlciBvZiBzZWN0b3JzIGlmIG5vIGRldmljZSBwcmVzZW50IG9yIGVycm9yICovCit2b2lkIGJkcnZfZ2V0X2dlb21ldHJ5KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50NjRfdCAqbmJfc2VjdG9yc19wdHIpCit7CisgICAgaW50NjRfdCBsZW5ndGg7CisgICAgbGVuZ3RoID0gYmRydl9nZXRsZW5ndGgoYnMpOworICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICBsZW5ndGggPSAwOworICAgIGVsc2UKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+IEJEUlZfU0VDVE9SX0JJVFM7CisgICAgKm5iX3NlY3RvcnNfcHRyID0gbGVuZ3RoOworfQorCitzdHJ1Y3QgcGFydGl0aW9uIHsKKyAgICAgICAgdWludDhfdCBib290X2luZDsgICAgICAgICAgIC8qIDB4ODAgLSBhY3RpdmUgKi8KKyAgICAgICAgdWludDhfdCBoZWFkOyAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGhlYWQgKi8KKyAgICAgICAgdWludDhfdCBzZWN0b3I7ICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciAqLworICAgICAgICB1aW50OF90IGN5bDsgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY3lsaW5kZXIgKi8KKyAgICAgICAgdWludDhfdCBzeXNfaW5kOyAgICAgICAgICAgIC8qIFdoYXQgcGFydGl0aW9uIHR5cGUgKi8KKyAgICAgICAgdWludDhfdCBlbmRfaGVhZDsgICAgICAgICAgIC8qIGVuZCBoZWFkICovCisgICAgICAgIHVpbnQ4X3QgZW5kX3NlY3RvcjsgICAgICAgICAvKiBlbmQgc2VjdG9yICovCisgICAgICAgIHVpbnQ4X3QgZW5kX2N5bDsgICAgICAgICAgICAvKiBlbmQgY3lsaW5kZXIgKi8KKyAgICAgICAgdWludDMyX3Qgc3RhcnRfc2VjdDsgICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciBjb3VudGluZyBmcm9tIDAgKi8KKyAgICAgICAgdWludDMyX3QgbnJfc2VjdHM7ICAgICAgICAgIC8qIG5yIG9mIHNlY3RvcnMgaW4gcGFydGl0aW9uICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiB0cnkgdG8gZ3Vlc3MgdGhlIGRpc2sgbG9naWNhbCBnZW9tZXRyeSBmcm9tIHRoZSBNU0RPUyBwYXJ0aXRpb24gdGFibGUuIFJldHVybiAwIGlmIE9LLCAtMSBpZiBjb3VsZCBub3QgZ3Vlc3MgKi8KK3N0YXRpYyBpbnQgZ3Vlc3NfZGlza19sY2hzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwY3lsaW5kZXJzLCBpbnQgKnBoZWFkcywgaW50ICpwc2VjdG9ycykKK3sKKyAgICB1aW50OF90IGJ1ZltCRFJWX1NFQ1RPUl9TSVpFXTsKKyAgICBpbnQgcmV0LCBpLCBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworICAgIHN0cnVjdCBwYXJ0aXRpb24gKnA7CisgICAgdWludDMyX3QgbnJfc2VjdHM7CisgICAgdWludDY0X3QgbmJfc2VjdG9yczsKKworICAgIGJkcnZfZ2V0X2dlb21ldHJ5KGJzLCAmbmJfc2VjdG9ycyk7CisKKyAgICByZXQgPSBiZHJ2X3JlYWQoYnMsIDAsIGJ1ZiwgMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiB0ZXN0IG1zZG9zIG1hZ2ljICovCisgICAgaWYgKGJ1Zls1MTBdICE9IDB4NTUgfHwgYnVmWzUxMV0gIT0gMHhhYSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBwID0gKChzdHJ1Y3QgcGFydGl0aW9uICopKGJ1ZiArIDB4MWJlKSkgKyBpOworICAgICAgICBucl9zZWN0cyA9IGxlMzJfdG9fY3B1KHAtPm5yX3NlY3RzKTsKKyAgICAgICAgaWYgKG5yX3NlY3RzICYmIHAtPmVuZF9oZWFkKSB7CisgICAgICAgICAgICAvKiBXZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhcnRpdGlvbiB0ZXJtaW5hdGVzIG9uCisgICAgICAgICAgICAgICBhIGN5bGluZGVyIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBoZWFkcyA9IHAtPmVuZF9oZWFkICsgMTsKKyAgICAgICAgICAgIHNlY3RvcnMgPSBwLT5lbmRfc2VjdG9yICYgNjM7CisgICAgICAgICAgICBpZiAoc2VjdG9ycyA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY3lsaW5kZXJzID0gbmJfc2VjdG9ycyAvIChoZWFkcyAqIHNlY3RvcnMpOworICAgICAgICAgICAgaWYgKGN5bGluZGVycyA8IDEgfHwgY3lsaW5kZXJzID4gMTYzODMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAqcGhlYWRzID0gaGVhZHM7CisgICAgICAgICAgICAqcHNlY3RvcnMgPSBzZWN0b3JzOworICAgICAgICAgICAgKnBjeWxpbmRlcnMgPSBjeWxpbmRlcnM7CisjaWYgMAorICAgICAgICAgICAgcHJpbnRmKCJndWVzc2VkIGdlb21ldHJ5OiBMQ0hTPSVkICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGN5bGluZGVycywgaGVhZHMsIHNlY3RvcnMpOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgYmRydl9ndWVzc19nZW9tZXRyeShCbG9ja0RyaXZlclN0YXRlICpicywgaW50ICpwY3lscywgaW50ICpwaGVhZHMsIGludCAqcHNlY3MpCit7CisgICAgaW50IHRyYW5zbGF0aW9uLCBsYmFfZGV0ZWN0ZWQgPSAwOworICAgIGludCBjeWxpbmRlcnMsIGhlYWRzLCBzZWNzOworICAgIHVpbnQ2NF90IG5iX3NlY3RvcnM7CisKKyAgICAvKiBpZiBhIGdlb21ldHJ5IGhpbnQgaXMgYXZhaWxhYmxlLCB1c2UgaXQgKi8KKyAgICBiZHJ2X2dldF9nZW9tZXRyeShicywgJm5iX3NlY3RvcnMpOworICAgIGJkcnZfZ2V0X2dlb21ldHJ5X2hpbnQoYnMsICZjeWxpbmRlcnMsICZoZWFkcywgJnNlY3MpOworICAgIHRyYW5zbGF0aW9uID0gYmRydl9nZXRfdHJhbnNsYXRpb25faGludChicyk7CisgICAgaWYgKGN5bGluZGVycyAhPSAwKSB7CisgICAgICAgICpwY3lscyA9IGN5bGluZGVyczsKKyAgICAgICAgKnBoZWFkcyA9IGhlYWRzOworICAgICAgICAqcHNlY3MgPSBzZWNzOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChndWVzc19kaXNrX2xjaHMoYnMsICZjeWxpbmRlcnMsICZoZWFkcywgJnNlY3MpID09IDApIHsKKyAgICAgICAgICAgIGlmIChoZWFkcyA+IDE2KSB7CisgICAgICAgICAgICAgICAgLyogaWYgaGVhZHMgPiAxNiwgaXQgbWVhbnMgdGhhdCBhIEJJT1MgTEJBCisgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gd2FzIGFjdGl2ZSwgc28gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBnZW9tZXRyeSBpcyBPSyAqLworICAgICAgICAgICAgICAgIGxiYV9kZXRlY3RlZCA9IDE7CisgICAgICAgICAgICAgICAgZ290byBkZWZhdWx0X2dlb21ldHJ5OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqcGN5bHMgPSBjeWxpbmRlcnM7CisgICAgICAgICAgICAgICAgKnBoZWFkcyA9IGhlYWRzOworICAgICAgICAgICAgICAgICpwc2VjcyA9IHNlY3M7CisgICAgICAgICAgICAgICAgLyogZGlzYWJsZSBhbnkgdHJhbnNsYXRpb24gdG8gYmUgaW4gc3luYyB3aXRoCisgICAgICAgICAgICAgICAgICAgdGhlIGxvZ2ljYWwgZ2VvbWV0cnkgKi8KKyAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24gPT0gQklPU19BVEFfVFJBTlNMQVRJT05fQVVUTykgeworICAgICAgICAgICAgICAgICAgICBiZHJ2X3NldF90cmFuc2xhdGlvbl9oaW50KGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJT1NfQVRBX1RSQU5TTEFUSU9OX05PTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVmYXVsdF9nZW9tZXRyeToKKyAgICAgICAgICAgIC8qIGlmIG5vIGdlb21ldHJ5LCB1c2UgYSBzdGFuZGFyZCBwaHlzaWNhbCBkaXNrIGdlb21ldHJ5ICovCisgICAgICAgICAgICBjeWxpbmRlcnMgPSBuYl9zZWN0b3JzIC8gKDE2ICogNjMpOworCisgICAgICAgICAgICBpZiAoY3lsaW5kZXJzID4gMTYzODMpCisgICAgICAgICAgICAgICAgY3lsaW5kZXJzID0gMTYzODM7CisgICAgICAgICAgICBlbHNlIGlmIChjeWxpbmRlcnMgPCAyKQorICAgICAgICAgICAgICAgIGN5bGluZGVycyA9IDI7CisgICAgICAgICAgICAqcGN5bHMgPSBjeWxpbmRlcnM7CisgICAgICAgICAgICAqcGhlYWRzID0gMTY7CisgICAgICAgICAgICAqcHNlY3MgPSA2MzsKKyAgICAgICAgICAgIGlmICgobGJhX2RldGVjdGVkID09IDEpICYmICh0cmFuc2xhdGlvbiA9PSBCSU9TX0FUQV9UUkFOU0xBVElPTl9BVVRPKSkgeworICAgICAgICAgICAgICAgIGlmICgoKnBjeWxzICogKnBoZWFkcykgPD0gMTMxMDcyKSB7CisgICAgICAgICAgICAgICAgICAgIGJkcnZfc2V0X3RyYW5zbGF0aW9uX2hpbnQoYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklPU19BVEFfVFJBTlNMQVRJT05fTEFSR0UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJkcnZfc2V0X3RyYW5zbGF0aW9uX2hpbnQoYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklPU19BVEFfVFJBTlNMQVRJT05fTEJBKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYmRydl9zZXRfZ2VvbWV0cnlfaGludChicywgKnBjeWxzLCAqcGhlYWRzLCAqcHNlY3MpOworICAgIH0KK30KKwordm9pZCBiZHJ2X3NldF9nZW9tZXRyeV9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjeWxzLCBpbnQgaGVhZHMsIGludCBzZWNzKQoreworICAgIGJzLT5jeWxzID0gY3lsczsKKyAgICBicy0+aGVhZHMgPSBoZWFkczsKKyAgICBicy0+c2VjcyA9IHNlY3M7Cit9CisKK3ZvaWQgYmRydl9zZXRfdHlwZV9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgdHlwZSkKK3sKKyAgICBicy0+dHlwZSA9IHR5cGU7CisgICAgYnMtPnJlbW92YWJsZSA9ICgodHlwZSA9PSBCRFJWX1RZUEVfQ0RST00gfHwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IEJEUlZfVFlQRV9GTE9QUFkpKTsKK30KKwordm9pZCBiZHJ2X3NldF90cmFuc2xhdGlvbl9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgdHJhbnNsYXRpb24pCit7CisgICAgYnMtPnRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb247Cit9CisKK3ZvaWQgYmRydl9nZXRfZ2VvbWV0cnlfaGludChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBjeWxzLCBpbnQgKnBoZWFkcywgaW50ICpwc2VjcykKK3sKKyAgICAqcGN5bHMgPSBicy0+Y3lsczsKKyAgICAqcGhlYWRzID0gYnMtPmhlYWRzOworICAgICpwc2VjcyA9IGJzLT5zZWNzOworfQorCitpbnQgYmRydl9nZXRfdHlwZV9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+dHlwZTsKK30KKworaW50IGJkcnZfZ2V0X3RyYW5zbGF0aW9uX2hpbnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIGJzLT50cmFuc2xhdGlvbjsKK30KKwordm9pZCBiZHJ2X3NldF9vbl9lcnJvcihCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tFcnJvckFjdGlvbiBvbl9yZWFkX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0Vycm9yQWN0aW9uIG9uX3dyaXRlX2Vycm9yKQoreworICAgIGJzLT5vbl9yZWFkX2Vycm9yID0gb25fcmVhZF9lcnJvcjsKKyAgICBicy0+b25fd3JpdGVfZXJyb3IgPSBvbl93cml0ZV9lcnJvcjsKK30KKworQmxvY2tFcnJvckFjdGlvbiBiZHJ2X2dldF9vbl9lcnJvcihCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGlzX3JlYWQpCit7CisgICAgcmV0dXJuIGlzX3JlYWQgPyBicy0+b25fcmVhZF9lcnJvciA6IGJzLT5vbl93cml0ZV9lcnJvcjsKK30KKwordm9pZCBiZHJ2X3NldF9yZW1vdmFibGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCByZW1vdmFibGUpCit7CisgICAgYnMtPnJlbW92YWJsZSA9IHJlbW92YWJsZTsKKyAgICBpZiAocmVtb3ZhYmxlICYmIGJzID09IGJzX3NuYXBzaG90cykgeworICAgICAgICBic19zbmFwc2hvdHMgPSBOVUxMOworICAgIH0KK30KKworaW50IGJkcnZfaXNfcmVtb3ZhYmxlKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+cmVtb3ZhYmxlOworfQorCitpbnQgYmRydl9pc19yZWFkX29ubHkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIGJzLT5yZWFkX29ubHk7Cit9CisKK2ludCBiZHJ2X2lzX3NnKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+c2c7Cit9CisKK2ludCBiZHJ2X2VuYWJsZV93cml0ZV9jYWNoZShCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICByZXR1cm4gYnMtPmVuYWJsZV93cml0ZV9jYWNoZTsKK30KKworLyogWFhYOiBubyBsb25nZXIgdXNlZCAqLwordm9pZCBiZHJ2X3NldF9jaGFuZ2VfY2IoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2hhbmdlX2NiKSh2b2lkICpvcGFxdWUpLCB2b2lkICpvcGFxdWUpCit7CisgICAgYnMtPmNoYW5nZV9jYiA9IGNoYW5nZV9jYjsKKyAgICBicy0+Y2hhbmdlX29wYXF1ZSA9IG9wYXF1ZTsKK30KKworaW50IGJkcnZfaXNfZW5jcnlwdGVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIGlmIChicy0+YmFja2luZ19oZCAmJiBicy0+YmFja2luZ19oZC0+ZW5jcnlwdGVkKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gYnMtPmVuY3J5cHRlZDsKK30KKworaW50IGJkcnZfa2V5X3JlcXVpcmVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJhY2tpbmdfaGQgPSBicy0+YmFja2luZ19oZDsKKworICAgIGlmIChiYWNraW5nX2hkICYmIGJhY2tpbmdfaGQtPmVuY3J5cHRlZCAmJiAhYmFja2luZ19oZC0+dmFsaWRfa2V5KQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gKGJzLT5lbmNyeXB0ZWQgJiYgIWJzLT52YWxpZF9rZXkpOworfQorCitpbnQgYmRydl9zZXRfa2V5KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICprZXkpCit7CisgICAgaW50IHJldDsKKyAgICBpZiAoYnMtPmJhY2tpbmdfaGQgJiYgYnMtPmJhY2tpbmdfaGQtPmVuY3J5cHRlZCkgeworICAgICAgICByZXQgPSBiZHJ2X3NldF9rZXkoYnMtPmJhY2tpbmdfaGQsIGtleSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKCFicy0+ZW5jcnlwdGVkKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghYnMtPmVuY3J5cHRlZCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKCFicy0+ZHJ2IHx8ICFicy0+ZHJ2LT5iZHJ2X3NldF9rZXkpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9NRURJVU07CisgICAgfQorICAgIHJldCA9IGJzLT5kcnYtPmJkcnZfc2V0X2tleShicywga2V5KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBicy0+dmFsaWRfa2V5ID0gMDsKKyAgICB9IGVsc2UgaWYgKCFicy0+dmFsaWRfa2V5KSB7CisgICAgICAgIGJzLT52YWxpZF9rZXkgPSAxOworICAgICAgICAvKiBjYWxsIHRoZSBjaGFuZ2UgY2FsbGJhY2sgbm93LCB3ZSBza2lwcGVkIGl0IG9uIG9wZW4gKi8KKyAgICAgICAgYnMtPm1lZGlhX2NoYW5nZWQgPSAxOworICAgICAgICBpZiAoYnMtPmNoYW5nZV9jYikKKyAgICAgICAgICAgIGJzLT5jaGFuZ2VfY2IoYnMtPmNoYW5nZV9vcGFxdWUpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGJkcnZfZ2V0X2Zvcm1hdChCbG9ja0RyaXZlclN0YXRlICpicywgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaWYgKCFicy0+ZHJ2KSB7CisgICAgICAgIGJ1ZlswXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHN0cmNweShidWYsIGJ1Zl9zaXplLCBicy0+ZHJ2LT5mb3JtYXRfbmFtZSk7CisgICAgfQorfQorCit2b2lkIGJkcnZfaXRlcmF0ZV9mb3JtYXQodm9pZCAoKml0KSh2b2lkICpvcGFxdWUsIGNvbnN0IGNoYXIgKm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2OworCisgICAgUUxJU1RfRk9SRUFDSChkcnYsICZiZHJ2X2RyaXZlcnMsIGxpc3QpIHsKKyAgICAgICAgaXQob3BhcXVlLCBkcnYtPmZvcm1hdF9uYW1lKTsKKyAgICB9Cit9CisKK0Jsb2NrRHJpdmVyU3RhdGUgKmJkcnZfZmluZChjb25zdCBjaGFyICpuYW1lKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYnMsICZiZHJ2X3N0YXRlcywgbGlzdCkgeworICAgICAgICBpZiAoIXN0cmNtcChuYW1lLCBicy0+ZGV2aWNlX25hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gYnM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK0Jsb2NrRHJpdmVyU3RhdGUgKmJkcnZfbmV4dChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBpZiAoIWJzKSB7CisgICAgICAgIHJldHVybiBRVEFJTFFfRklSU1QoJmJkcnZfc3RhdGVzKTsKKyAgICB9CisgICAgcmV0dXJuIFFUQUlMUV9ORVhUKGJzLCBsaXN0KTsKK30KKwordm9pZCBiZHJ2X2l0ZXJhdGUodm9pZCAoKml0KSh2b2lkICpvcGFxdWUsIEJsb2NrRHJpdmVyU3RhdGUgKmJzKSwgdm9pZCAqb3BhcXVlKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYnMsICZiZHJ2X3N0YXRlcywgbGlzdCkgeworICAgICAgICBpdChvcGFxdWUsIGJzKTsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmJkcnZfZ2V0X2RldmljZV9uYW1lKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+ZGV2aWNlX25hbWU7Cit9CisKK3ZvaWQgYmRydl9mbHVzaChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBpZiAoYnMtPm9wZW5fZmxhZ3MgJiBCRFJWX09fTk9fRkxVU0gpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChicy0+ZHJ2ICYmIGJzLT5kcnYtPmJkcnZfZmx1c2gpCisgICAgICAgIGJzLT5kcnYtPmJkcnZfZmx1c2goYnMpOworfQorCit2b2lkIGJkcnZfZmx1c2hfYWxsKHZvaWQpCit7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisKKyAgICBRVEFJTFFfRk9SRUFDSChicywgJmJkcnZfc3RhdGVzLCBsaXN0KSB7CisgICAgICAgIGlmIChicy0+ZHJ2ICYmICFiZHJ2X2lzX3JlYWRfb25seShicykgJiYKKyAgICAgICAgICAgICghYmRydl9pc19yZW1vdmFibGUoYnMpIHx8IGJkcnZfaXNfaW5zZXJ0ZWQoYnMpKSkgeworICAgICAgICAgICAgYmRydl9mbHVzaChicyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBiZHJ2X2hhc196ZXJvX2luaXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgYXNzZXJ0KGJzLT5kcnYpOworCisgICAgaWYgKGJzLT5kcnYtPmJkcnZfaGFzX3plcm9faW5pdCkgeworICAgICAgICByZXR1cm4gYnMtPmRydi0+YmRydl9oYXNfemVyb19pbml0KGJzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCBzZWN0b3IgaXMgcHJlc2VudCBpbiB0aGUgZGlzayBpbWFnZS4gRHJpdmVycworICogbm90IGltcGxlbWVudGluZyB0aGUgZnVuY3Rpb25hbGl0eSBhcmUgYXNzdW1lZCB0byBub3Qgc3VwcG9ydCBiYWNraW5nIGZpbGVzLAorICogaGVuY2UgYWxsIHRoZWlyIHNlY3RvcnMgYXJlIHJlcG9ydGVkIGFzIGFsbG9jYXRlZC4KKyAqCisgKiAncG51bScgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2Ygc2VjdG9ycyAoaW5jbHVkaW5nIGFuZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKKyAqIHRoZSBzcGVjaWZpZWQgc2VjdG9yKSB0aGF0IGFyZSBrbm93biB0byBiZSBpbiB0aGUgc2FtZQorICogYWxsb2NhdGVkL3VuYWxsb2NhdGVkIHN0YXRlLgorICoKKyAqICduYl9zZWN0b3JzJyBpcyB0aGUgbWF4IHZhbHVlICdwbnVtJyBzaG91bGQgYmUgc2V0IHRvLgorICovCitpbnQgYmRydl9pc19hbGxvY2F0ZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwgaW50IG5iX3NlY3RvcnMsCisJaW50ICpwbnVtKQoreworICAgIGludDY0X3QgbjsKKyAgICBpZiAoIWJzLT5kcnYtPmJkcnZfaXNfYWxsb2NhdGVkKSB7CisgICAgICAgIGlmIChzZWN0b3JfbnVtID49IGJzLT50b3RhbF9zZWN0b3JzKSB7CisgICAgICAgICAgICAqcG51bSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBuID0gYnMtPnRvdGFsX3NlY3RvcnMgLSBzZWN0b3JfbnVtOworICAgICAgICAqcG51bSA9IChuIDwgbmJfc2VjdG9ycykgPyAobikgOiAobmJfc2VjdG9ycyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gYnMtPmRydi0+YmRydl9pc19hbGxvY2F0ZWQoYnMsIHNlY3Rvcl9udW0sIG5iX3NlY3RvcnMsIHBudW0pOworfQorCit2b2lkIGJkcnZfbW9uX2V2ZW50KGNvbnN0IEJsb2NrRHJpdmVyU3RhdGUgKmJkcnYsCisgICAgICAgICAgICAgICAgICAgIEJsb2NrTW9uRXZlbnRBY3Rpb24gYWN0aW9uLCBpbnQgaXNfcmVhZCkKK3sKKyAgICBRT2JqZWN0ICpkYXRhOworICAgIGNvbnN0IGNoYXIgKmFjdGlvbl9zdHI7CisKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgQkRSVl9BQ1RJT05fUkVQT1JUOgorICAgICAgICBhY3Rpb25fc3RyID0gInJlcG9ydCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkRSVl9BQ1RJT05fSUdOT1JFOgorICAgICAgICBhY3Rpb25fc3RyID0gImlnbm9yZSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQkRSVl9BQ1RJT05fU1RPUDoKKyAgICAgICAgYWN0aW9uX3N0ciA9ICJzdG9wIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBkYXRhID0gcW9iamVjdF9mcm9tX2pzb25mKCJ7ICdkZXZpY2UnOiAlcywgJ2FjdGlvbic6ICVzLCAnb3BlcmF0aW9uJzogJXMgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHJ2LT5kZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWFkID8gInJlYWQiIDogIndyaXRlIik7CisgICAgbW9uaXRvcl9wcm90b2NvbF9ldmVudChRRVZFTlRfQkxPQ0tfSU9fRVJST1IsIGRhdGEpOworCisgICAgcW9iamVjdF9kZWNyZWYoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJkcnZfcHJpbnRfZGljdChRT2JqZWN0ICpvYmosIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRGljdCAqYnNfZGljdDsKKyAgICBNb25pdG9yICptb24gPSBvcGFxdWU7CisKKyAgICBic19kaWN0ID0gcW9iamVjdF90b19xZGljdChvYmopOworCisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJXM6IHR5cGU9JXMgcmVtb3ZhYmxlPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFkaWN0X2dldF9zdHIoYnNfZGljdCwgImRldmljZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcWRpY3RfZ2V0X3N0cihic19kaWN0LCAidHlwZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcWRpY3RfZ2V0X2Jvb2woYnNfZGljdCwgInJlbW92YWJsZSIpKTsKKworICAgIGlmIChxZGljdF9nZXRfYm9vbChic19kaWN0LCAicmVtb3ZhYmxlIikpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIGxvY2tlZD0lZCIsIHFkaWN0X2dldF9ib29sKGJzX2RpY3QsICJsb2NrZWQiKSk7CisgICAgfQorCisgICAgaWYgKHFkaWN0X2hhc2tleShic19kaWN0LCAiaW5zZXJ0ZWQiKSkgeworICAgICAgICBRRGljdCAqcWRpY3QgPSBxb2JqZWN0X3RvX3FkaWN0KHFkaWN0X2dldChic19kaWN0LCAiaW5zZXJ0ZWQiKSk7CisKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIGZpbGU9Iik7CisgICAgICAgIG1vbml0b3JfcHJpbnRfZmlsZW5hbWUobW9uLCBxZGljdF9nZXRfc3RyKHFkaWN0LCAiZmlsZSIpKTsKKyAgICAgICAgaWYgKHFkaWN0X2hhc2tleShxZGljdCwgImJhY2tpbmdfZmlsZSIpKSB7CisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIgYmFja2luZ19maWxlPSIpOworICAgICAgICAgICAgbW9uaXRvcl9wcmludF9maWxlbmFtZShtb24sIHFkaWN0X2dldF9zdHIocWRpY3QsICJiYWNraW5nX2ZpbGUiKSk7CisgICAgICAgIH0KKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIHJvPSVkIGRydj0lcyBlbmNyeXB0ZWQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFkaWN0X2dldF9ib29sKHFkaWN0LCAicm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZGljdF9nZXRfc3RyKHFkaWN0LCAiZHJ2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWRpY3RfZ2V0X2Jvb2wocWRpY3QsICJlbmNyeXB0ZWQiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIFtub3QgaW5zZXJ0ZWRdIik7CisgICAgfQorCisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiXG4iKTsKK30KKwordm9pZCBiZHJ2X2luZm9fcHJpbnQoTW9uaXRvciAqbW9uLCBjb25zdCBRT2JqZWN0ICpkYXRhKQoreworICAgIHFsaXN0X2l0ZXIocW9iamVjdF90b19xbGlzdChkYXRhKSwgYmRydl9wcmludF9kaWN0LCBtb24pOworfQorCit2b2lkIGJkcnZfaW5mbyhNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSkKK3sKKyAgICBRTGlzdCAqYnNfbGlzdDsKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKworICAgIGJzX2xpc3QgPSBxbGlzdF9uZXcoKTsKKworICAgIFFUQUlMUV9GT1JFQUNIKGJzLCAmYmRydl9zdGF0ZXMsIGxpc3QpIHsKKyAgICAgICAgUU9iamVjdCAqYnNfb2JqOworICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gInVua25vd24iOworCisgICAgICAgIHN3aXRjaChicy0+dHlwZSkgeworICAgICAgICBjYXNlIEJEUlZfVFlQRV9IRDoKKyAgICAgICAgICAgIHR5cGUgPSAiaGQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkRSVl9UWVBFX0NEUk9NOgorICAgICAgICAgICAgdHlwZSA9ICJjZHJvbSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRFJWX1RZUEVfRkxPUFBZOgorICAgICAgICAgICAgdHlwZSA9ICJmbG9wcHkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBic19vYmogPSBxb2JqZWN0X2Zyb21fanNvbmYoInsgJ2RldmljZSc6ICVzLCAndHlwZSc6ICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3JlbW92YWJsZSc6ICVpLCAnbG9ja2VkJzogJWkgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicy0+ZGV2aWNlX25hbWUsIHR5cGUsIGJzLT5yZW1vdmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicy0+bG9ja2VkKTsKKworICAgICAgICBpZiAoYnMtPmRydikgeworICAgICAgICAgICAgUU9iamVjdCAqb2JqOworICAgICAgICAgICAgUURpY3QgKmJzX2RpY3QgPSBxb2JqZWN0X3RvX3FkaWN0KGJzX29iaik7CisKKyAgICAgICAgICAgIG9iaiA9IHFvYmplY3RfZnJvbV9qc29uZigieyAnZmlsZSc6ICVzLCAncm8nOiAlaSwgJ2Rydic6ICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidlbmNyeXB0ZWQnOiAlaSB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicy0+ZmlsZW5hbWUsIGJzLT5yZWFkX29ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMtPmRydi0+Zm9ybWF0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmRydl9pc19lbmNyeXB0ZWQoYnMpKTsKKyAgICAgICAgICAgIGlmIChicy0+YmFja2luZ19maWxlWzBdICE9ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBRRGljdCAqcWRpY3QgPSBxb2JqZWN0X3RvX3FkaWN0KG9iaik7CisgICAgICAgICAgICAgICAgcWRpY3RfcHV0KHFkaWN0LCAiYmFja2luZ19maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXN0cmluZ19mcm9tX3N0cihicy0+YmFja2luZ19maWxlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFkaWN0X3B1dF9vYmooYnNfZGljdCwgImluc2VydGVkIiwgb2JqKTsKKyAgICAgICAgfQorICAgICAgICBxbGlzdF9hcHBlbmRfb2JqKGJzX2xpc3QsIGJzX29iaik7CisgICAgfQorCisgICAgKnJldF9kYXRhID0gUU9CSkVDVChic19saXN0KTsKK30KKworc3RhdGljIHZvaWQgYmRydl9zdGF0c19pdGVyKFFPYmplY3QgKmRhdGEsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRGljdCAqcWRpY3Q7CisgICAgTW9uaXRvciAqbW9uID0gb3BhcXVlOworCisgICAgcWRpY3QgPSBxb2JqZWN0X3RvX3FkaWN0KGRhdGEpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiVzOiIsIHFkaWN0X2dldF9zdHIocWRpY3QsICJkZXZpY2UiKSk7CisKKyAgICBxZGljdCA9IHFvYmplY3RfdG9fcWRpY3QocWRpY3RfZ2V0KHFkaWN0LCAic3RhdHMiKSk7CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIHJkX2J5dGVzPSUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiB3cl9ieXRlcz0lIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgcmRfb3BlcmF0aW9ucz0lIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICIgd3Jfb3BlcmF0aW9ucz0lIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBxZGljdF9nZXRfaW50KHFkaWN0LCAicmRfYnl0ZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFkaWN0X2dldF9pbnQocWRpY3QsICJ3cl9ieXRlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgcWRpY3RfZ2V0X2ludChxZGljdCwgInJkX29wZXJhdGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFkaWN0X2dldF9pbnQocWRpY3QsICJ3cl9vcGVyYXRpb25zIikpOworfQorCit2b2lkIGJkcnZfc3RhdHNfcHJpbnQoTW9uaXRvciAqbW9uLCBjb25zdCBRT2JqZWN0ICpkYXRhKQoreworICAgIHFsaXN0X2l0ZXIocW9iamVjdF90b19xbGlzdChkYXRhKSwgYmRydl9zdGF0c19pdGVyLCBtb24pOworfQorCitzdGF0aWMgUU9iamVjdCogYmRydl9pbmZvX3N0YXRzX2JzKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIFFPYmplY3QgKnJlczsKKyAgICBRRGljdCAqZGljdDsKKworICAgIHJlcyA9IHFvYmplY3RfZnJvbV9qc29uZigieyAnc3RhdHMnOiB7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3JkX2J5dGVzJzogJSIgUFJJZDY0ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3dyX2J5dGVzJzogJSIgUFJJZDY0ICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3JkX29wZXJhdGlvbnMnOiAlIiBQUklkNjQgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInd3Jfb3BlcmF0aW9ucyc6ICUiIFBSSWQ2NCAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIid3cl9oaWdoZXN0X29mZnNldCc6ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMtPnJkX2J5dGVzLCBicy0+d3JfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLT5yZF9vcHMsIGJzLT53cl9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLT53cl9oaWdoZXN0X3NlY3RvciAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClCRFJWX1NFQ1RPUl9TSVpFKTsKKyAgICBkaWN0ICA9IHFvYmplY3RfdG9fcWRpY3QocmVzKTsKKworICAgIGlmICgqYnMtPmRldmljZV9uYW1lKSB7CisgICAgICAgIHFkaWN0X3B1dChkaWN0LCAiZGV2aWNlIiwgcXN0cmluZ19mcm9tX3N0cihicy0+ZGV2aWNlX25hbWUpKTsKKyAgICB9CisKKyAgICBpZiAoYnMtPmZpbGUpIHsKKyAgICAgICAgUU9iamVjdCAqcGFyZW50ID0gYmRydl9pbmZvX3N0YXRzX2JzKGJzLT5maWxlKTsKKyAgICAgICAgcWRpY3RfcHV0X29iaihkaWN0LCAicGFyZW50IiwgcGFyZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIGJkcnZfaW5mb19zdGF0cyhNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSkKK3sKKyAgICBRT2JqZWN0ICpvYmo7CisgICAgUUxpc3QgKmRldmljZXM7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisKKyAgICBkZXZpY2VzID0gcWxpc3RfbmV3KCk7CisKKyAgICBRVEFJTFFfRk9SRUFDSChicywgJmJkcnZfc3RhdGVzLCBsaXN0KSB7CisgICAgICAgIG9iaiA9IGJkcnZfaW5mb19zdGF0c19icyhicyk7CisgICAgICAgIHFsaXN0X2FwcGVuZF9vYmooZGV2aWNlcywgb2JqKTsKKyAgICB9CisKKyAgICAqcmV0X2RhdGEgPSBRT0JKRUNUKGRldmljZXMpOworfQorCitjb25zdCBjaGFyICpiZHJ2X2dldF9lbmNyeXB0ZWRfZmlsZW5hbWUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgaWYgKGJzLT5iYWNraW5nX2hkICYmIGJzLT5iYWNraW5nX2hkLT5lbmNyeXB0ZWQpCisgICAgICAgIHJldHVybiBicy0+YmFja2luZ19maWxlOworICAgIGVsc2UgaWYgKGJzLT5lbmNyeXB0ZWQpCisgICAgICAgIHJldHVybiBicy0+ZmlsZW5hbWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBiZHJ2X2dldF9iYWNraW5nX2ZpbGVuYW1lKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZW5hbWVfc2l6ZSkKK3sKKyAgICBpZiAoIWJzLT5iYWNraW5nX2ZpbGUpIHsKKyAgICAgICAgcHN0cmNweShmaWxlbmFtZSwgZmlsZW5hbWVfc2l6ZSwgIiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzdHJjcHkoZmlsZW5hbWUsIGZpbGVuYW1lX3NpemUsIGJzLT5iYWNraW5nX2ZpbGUpOworICAgIH0KK30KKworaW50IGJkcnZfd3JpdGVfY29tcHJlc3NlZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoIWRydi0+YmRydl93cml0ZV9jb21wcmVzc2VkKQorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgaWYgKGJkcnZfY2hlY2tfcmVxdWVzdChicywgc2VjdG9yX251bSwgbmJfc2VjdG9ycykpCisgICAgICAgIHJldHVybiAtRUlPOworCisgICAgaWYgKGJzLT5kaXJ0eV9iaXRtYXApIHsKKyAgICAgICAgc2V0X2RpcnR5X2JpdG1hcChicywgc2VjdG9yX251bSwgbmJfc2VjdG9ycywgMSk7CisgICAgfQorCisgICAgcmV0dXJuIGRydi0+YmRydl93cml0ZV9jb21wcmVzc2VkKGJzLCBzZWN0b3JfbnVtLCBidWYsIG5iX3NlY3RvcnMpOworfQorCitpbnQgYmRydl9nZXRfaW5mbyhCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tEcml2ZXJJbmZvICpiZGkpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgaWYgKCFkcnYpCisgICAgICAgIHJldHVybiAtRU5PTUVESVVNOworICAgIGlmICghZHJ2LT5iZHJ2X2dldF9pbmZvKQorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgbWVtc2V0KGJkaSwgMCwgc2l6ZW9mKCpiZGkpKTsKKyAgICByZXR1cm4gZHJ2LT5iZHJ2X2dldF9pbmZvKGJzLCBiZGkpOworfQorCitpbnQgYmRydl9zYXZlX3Ztc3RhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IHNpemUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgaWYgKCFkcnYpCisgICAgICAgIHJldHVybiAtRU5PTUVESVVNOworICAgIGlmIChkcnYtPmJkcnZfc2F2ZV92bXN0YXRlKQorICAgICAgICByZXR1cm4gZHJ2LT5iZHJ2X3NhdmVfdm1zdGF0ZShicywgYnVmLCBwb3MsIHNpemUpOworICAgIGlmIChicy0+ZmlsZSkKKyAgICAgICAgcmV0dXJuIGJkcnZfc2F2ZV92bXN0YXRlKGJzLT5maWxlLCBidWYsIHBvcywgc2l6ZSk7CisgICAgcmV0dXJuIC1FTk9UU1VQOworfQorCitpbnQgYmRydl9sb2FkX3Ztc3RhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IHNpemUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgaWYgKCFkcnYpCisgICAgICAgIHJldHVybiAtRU5PTUVESVVNOworICAgIGlmIChkcnYtPmJkcnZfbG9hZF92bXN0YXRlKQorICAgICAgICByZXR1cm4gZHJ2LT5iZHJ2X2xvYWRfdm1zdGF0ZShicywgYnVmLCBwb3MsIHNpemUpOworICAgIGlmIChicy0+ZmlsZSkKKyAgICAgICAgcmV0dXJuIGJkcnZfbG9hZF92bXN0YXRlKGJzLT5maWxlLCBidWYsIHBvcywgc2l6ZSk7CisgICAgcmV0dXJuIC1FTk9UU1VQOworfQorCit2b2lkIGJkcnZfZGVidWdfZXZlbnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIEJsa0RlYnVnRXZlbnQgZXZlbnQpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisKKyAgICBpZiAoIWRydiB8fCAhZHJ2LT5iZHJ2X2RlYnVnX2V2ZW50KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXR1cm4gZHJ2LT5iZHJ2X2RlYnVnX2V2ZW50KGJzLCBldmVudCk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaGFuZGxpbmcgb2Ygc25hcHNob3RzICovCisKK2ludCBiZHJ2X2Nhbl9zbmFwc2hvdChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpZiAoIWRydiB8fCBiZHJ2X2lzX3JlbW92YWJsZShicykgfHwgYmRydl9pc19yZWFkX29ubHkoYnMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghZHJ2LT5iZHJ2X3NuYXBzaG90X2NyZWF0ZSkgeworICAgICAgICBpZiAoYnMtPmZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIGJkcnZfY2FuX3NuYXBzaG90KGJzLT5maWxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IGJkcnZfaXNfc25hcHNob3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuICEhKGJzLT5vcGVuX2ZsYWdzICYgQkRSVl9PX1NOQVBTSE9UKTsKK30KKworQmxvY2tEcml2ZXJTdGF0ZSAqYmRydl9zbmFwc2hvdHModm9pZCkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKworICAgIGlmIChic19zbmFwc2hvdHMpIHsKKyAgICAgICAgcmV0dXJuIGJzX3NuYXBzaG90czsKKyAgICB9CisKKyAgICBicyA9IE5VTEw7CisgICAgd2hpbGUgKChicyA9IGJkcnZfbmV4dChicykpKSB7CisgICAgICAgIGlmIChiZHJ2X2Nhbl9zbmFwc2hvdChicykpIHsKKyAgICAgICAgICAgIGJzX3NuYXBzaG90cyA9IGJzOworICAgICAgICAgICAgcmV0dXJuIGJzOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitpbnQgYmRydl9zbmFwc2hvdF9jcmVhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNuYXBzaG90SW5mbyAqc25faW5mbykKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpZiAoIWRydikKKyAgICAgICAgcmV0dXJuIC1FTk9NRURJVU07CisgICAgaWYgKGRydi0+YmRydl9zbmFwc2hvdF9jcmVhdGUpCisgICAgICAgIHJldHVybiBkcnYtPmJkcnZfc25hcHNob3RfY3JlYXRlKGJzLCBzbl9pbmZvKTsKKyAgICBpZiAoYnMtPmZpbGUpCisgICAgICAgIHJldHVybiBiZHJ2X3NuYXBzaG90X2NyZWF0ZShicy0+ZmlsZSwgc25faW5mbyk7CisgICAgcmV0dXJuIC1FTk9UU1VQOworfQorCitpbnQgYmRydl9zbmFwc2hvdF9nb3RvKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzbmFwc2hvdF9pZCkKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKyAgICBpbnQgcmV0LCBvcGVuX3JldDsKKworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoZHJ2LT5iZHJ2X3NuYXBzaG90X2dvdG8pCisgICAgICAgIHJldHVybiBkcnYtPmJkcnZfc25hcHNob3RfZ290byhicywgc25hcHNob3RfaWQpOworCisgICAgaWYgKGJzLT5maWxlKSB7CisgICAgICAgIGRydi0+YmRydl9jbG9zZShicyk7CisgICAgICAgIHJldCA9IGJkcnZfc25hcHNob3RfZ290byhicy0+ZmlsZSwgc25hcHNob3RfaWQpOworICAgICAgICBvcGVuX3JldCA9IGRydi0+YmRydl9vcGVuKGJzLCBicy0+b3Blbl9mbGFncyk7CisgICAgICAgIGlmIChvcGVuX3JldCA8IDApIHsKKyAgICAgICAgICAgIGJkcnZfZGVsZXRlKGJzLT5maWxlKTsKKyAgICAgICAgICAgIGJzLT5kcnYgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIG9wZW5fcmV0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIC1FTk9UU1VQOworfQorCitpbnQgYmRydl9zbmFwc2hvdF9kZWxldGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoZHJ2LT5iZHJ2X3NuYXBzaG90X2RlbGV0ZSkKKyAgICAgICAgcmV0dXJuIGRydi0+YmRydl9zbmFwc2hvdF9kZWxldGUoYnMsIHNuYXBzaG90X2lkKTsKKyAgICBpZiAoYnMtPmZpbGUpCisgICAgICAgIHJldHVybiBiZHJ2X3NuYXBzaG90X2RlbGV0ZShicy0+ZmlsZSwgc25hcHNob3RfaWQpOworICAgIHJldHVybiAtRU5PVFNVUDsKK30KKworaW50IGJkcnZfc25hcHNob3RfbGlzdChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNuYXBzaG90SW5mbyAqKnBzbl9pbmZvKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gLUVOT01FRElVTTsKKyAgICBpZiAoZHJ2LT5iZHJ2X3NuYXBzaG90X2xpc3QpCisgICAgICAgIHJldHVybiBkcnYtPmJkcnZfc25hcHNob3RfbGlzdChicywgcHNuX2luZm8pOworICAgIGlmIChicy0+ZmlsZSkKKyAgICAgICAgcmV0dXJuIGJkcnZfc25hcHNob3RfbGlzdChicy0+ZmlsZSwgcHNuX2luZm8pOworICAgIHJldHVybiAtRU5PVFNVUDsKK30KKworI2RlZmluZSBOQl9TVUZGSVhFUyA0CisKK2NoYXIgKmdldF9odW1hbl9yZWFkYWJsZV9zaXplKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQ2NF90IHNpemUpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgc3VmZml4ZXNbTkJfU1VGRklYRVNdID0gIktNR1QiOworICAgIGludDY0X3QgYmFzZTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzaXplIDw9IDk5OSkgeworICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJSIgUFJJZDY0LCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiYXNlID0gMTAyNDsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTkJfU1VGRklYRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNpemUgPCAoMTAgKiBiYXNlKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlMC4xZiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKXNpemUgLyBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzW2ldKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA8ICgxMDAwICogYmFzZSkgfHwgaSA9PSAoTkJfU1VGRklYRVMgLSAxKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlIiBQUklkNjQgIiVjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKHNpemUgKyAoYmFzZSA+PiAxKSkgLyBiYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlc1tpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYXNlID0gYmFzZSAqIDEwMjQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqYmRydl9zbmFwc2hvdF9kdW1wKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBRRU1VU25hcHNob3RJbmZvICpzbikKK3sKKyAgICBjaGFyIGJ1ZjFbMTI4XSwgZGF0ZV9idWZbMTI4XSwgY2xvY2tfYnVmWzEyOF07CisjaWZkZWYgX1dJTjMyCisgICAgc3RydWN0IHRtICpwdG07CisjZWxzZQorICAgIHN0cnVjdCB0bSB0bTsKKyNlbmRpZgorICAgIHRpbWVfdCB0aTsKKyAgICBpbnQ2NF90IHNlY3M7CisKKyAgICBpZiAoIXNuKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICIlLTEwcyUtMjBzJTdzJTIwcyUxNXMiLAorICAgICAgICAgICAgICAgICAiSUQiLCAiVEFHIiwgIlZNIFNJWkUiLCAiREFURSIsICJWTSBDTE9DSyIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpID0gc24tPmRhdGVfc2VjOworI2lmZGVmIF9XSU4zMgorICAgICAgICBwdG0gPSBsb2NhbHRpbWUoJnRpKTsKKyAgICAgICAgc3RyZnRpbWUoZGF0ZV9idWYsIHNpemVvZihkYXRlX2J1ZiksCisgICAgICAgICAgICAgICAgICIlWS0lbS0lZCAlSDolTTolUyIsIHB0bSk7CisjZWxzZQorICAgICAgICBsb2NhbHRpbWVfcigmdGksICZ0bSk7CisgICAgICAgIHN0cmZ0aW1lKGRhdGVfYnVmLCBzaXplb2YoZGF0ZV9idWYpLAorICAgICAgICAgICAgICAgICAiJVktJW0tJWQgJUg6JU06JVMiLCAmdG0pOworI2VuZGlmCisgICAgICAgIHNlY3MgPSBzbi0+dm1fY2xvY2tfbnNlYyAvIDEwMDAwMDAwMDA7CisgICAgICAgIHNucHJpbnRmKGNsb2NrX2J1Ziwgc2l6ZW9mKGNsb2NrX2J1ZiksCisgICAgICAgICAgICAgICAgICIlMDJkOiUwMmQ6JTAyZC4lMDNkIiwKKyAgICAgICAgICAgICAgICAgKGludCkoc2VjcyAvIDM2MDApLAorICAgICAgICAgICAgICAgICAoaW50KSgoc2VjcyAvIDYwKSAlIDYwKSwKKyAgICAgICAgICAgICAgICAgKGludCkoc2VjcyAlIDYwKSwKKyAgICAgICAgICAgICAgICAgKGludCkoKHNuLT52bV9jbG9ja19uc2VjIC8gMTAwMDAwMCkgJSAxMDAwKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICIlLTEwcyUtMjBzJTdzJTIwcyUxNXMiLAorICAgICAgICAgICAgICAgICBzbi0+aWRfc3RyLCBzbi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgZ2V0X2h1bWFuX3JlYWRhYmxlX3NpemUoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCBzbi0+dm1fc3RhdGVfc2l6ZSksCisgICAgICAgICAgICAgICAgIGRhdGVfYnVmLAorICAgICAgICAgICAgICAgICBjbG9ja19idWYpOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFzeW5jIEkvT3MgKi8KKworQmxvY2tEcml2ZXJBSU9DQiAqYmRydl9haW9fcmVhZHYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKnJldDsKKworICAgIGlmICghZHJ2KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYmRydl9jaGVja19yZXF1ZXN0KGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXQgPSBkcnYtPmJkcnZfYWlvX3JlYWR2KGJzLCBzZWN0b3JfbnVtLCBxaW92LCBuYl9zZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IsIG9wYXF1ZSk7CisKKyAgICBpZiAocmV0KSB7CisJLyogVXBkYXRlIHN0YXRzIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5IHRyYW5zZmVyIGhhcyBub3QgaGFwcGVuZWQuICovCisJYnMtPnJkX2J5dGVzICs9ICh1bnNpZ25lZCkgbmJfc2VjdG9ycyAqIEJEUlZfU0VDVE9SX1NJWkU7CisJYnMtPnJkX29wcyArKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb193cml0ZXYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgQmxvY2tEcml2ZXJBSU9DQiAqcmV0OworCisgICAgaWYgKCFkcnYpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChicy0+cmVhZF9vbmx5KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYmRydl9jaGVja19yZXF1ZXN0KGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoYnMtPmRpcnR5X2JpdG1hcCkgeworICAgICAgICBzZXRfZGlydHlfYml0bWFwKGJzLCBzZWN0b3JfbnVtLCBuYl9zZWN0b3JzLCAxKTsKKyAgICB9CisKKyAgICByZXQgPSBkcnYtPmJkcnZfYWlvX3dyaXRldihicywgc2VjdG9yX251bSwgcWlvdiwgbmJfc2VjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYiwgb3BhcXVlKTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgICAgLyogVXBkYXRlIHN0YXRzIGV2ZW4gdGhvdWdoIHRlY2huaWNhbGx5IHRyYW5zZmVyIGhhcyBub3QgaGFwcGVuZWQuICovCisgICAgICAgIGJzLT53cl9ieXRlcyArPSAodW5zaWduZWQpIG5iX3NlY3RvcnMgKiBCRFJWX1NFQ1RPUl9TSVpFOworICAgICAgICBicy0+d3Jfb3BzICsrOworICAgICAgICBpZiAoYnMtPndyX2hpZ2hlc3Rfc2VjdG9yIDwgc2VjdG9yX251bSArIG5iX3NlY3RvcnMgLSAxKSB7CisgICAgICAgICAgICBicy0+d3JfaGlnaGVzdF9zZWN0b3IgPSBzZWN0b3JfbnVtICsgbmJfc2VjdG9ycyAtIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKK3R5cGVkZWYgc3RydWN0IE11bHRpd3JpdGVDQiB7CisgICAgaW50IGVycm9yOworICAgIGludCBudW1fcmVxdWVzdHM7CisgICAgaW50IG51bV9jYWxsYmFja3M7CisgICAgc3RydWN0IHsKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2I7CisgICAgICAgIHZvaWQgKm9wYXF1ZTsKKyAgICAgICAgUUVNVUlPVmVjdG9yICpmcmVlX3Fpb3Y7CisgICAgICAgIHZvaWQgKmZyZWVfYnVmOworICAgIH0gY2FsbGJhY2tzW107Cit9IE11bHRpd3JpdGVDQjsKKworc3RhdGljIHZvaWQgbXVsdGl3cml0ZV91c2VyX2NiKE11bHRpd3JpdGVDQiAqbWNiKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1jYi0+bnVtX2NhbGxiYWNrczsgaSsrKSB7CisgICAgICAgIG1jYi0+Y2FsbGJhY2tzW2ldLmNiKG1jYi0+Y2FsbGJhY2tzW2ldLm9wYXF1ZSwgbWNiLT5lcnJvcik7CisgICAgICAgIGlmIChtY2ItPmNhbGxiYWNrc1tpXS5mcmVlX3Fpb3YpIHsKKyAgICAgICAgICAgIHFlbXVfaW92ZWNfZGVzdHJveShtY2ItPmNhbGxiYWNrc1tpXS5mcmVlX3Fpb3YpOworICAgICAgICB9CisgICAgICAgIGdfZnJlZShtY2ItPmNhbGxiYWNrc1tpXS5mcmVlX3Fpb3YpOworICAgICAgICBxZW11X3ZmcmVlKG1jYi0+Y2FsbGJhY2tzW2ldLmZyZWVfYnVmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG11bHRpd3JpdGVfY2Iodm9pZCAqb3BhcXVlLCBpbnQgcmV0KQoreworICAgIE11bHRpd3JpdGVDQiAqbWNiID0gb3BhcXVlOworCisgICAgaWYgKHJldCA8IDAgJiYgIW1jYi0+ZXJyb3IpIHsKKyAgICAgICAgbWNiLT5lcnJvciA9IHJldDsKKyAgICB9CisKKyAgICBtY2ItPm51bV9yZXF1ZXN0cy0tOworICAgIGlmIChtY2ItPm51bV9yZXF1ZXN0cyA9PSAwKSB7CisgICAgICAgIG11bHRpd3JpdGVfdXNlcl9jYihtY2IpOworICAgICAgICBnX2ZyZWUobWNiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXVsdGl3cml0ZV9yZXFfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEJsb2NrUmVxdWVzdCAqcmVxMSA9IGEsICpyZXEyID0gYjsKKworICAgIC8qCisgICAgICogTm90ZSB0aGF0IHdlIGNhbid0IHNpbXBseSBzdWJ0cmFjdCByZXEyLT5zZWN0b3IgZnJvbSByZXExLT5zZWN0b3IKKyAgICAgKiBoZXJlIGFzIHRoYXQgY291bGQgb3ZlcmZsb3cgdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAocmVxMS0+c2VjdG9yID4gcmVxMi0+c2VjdG9yKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAocmVxMS0+c2VjdG9yIDwgcmVxMi0+c2VjdG9yKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qCisgKiBUYWtlcyBhIGJ1bmNoIG9mIHJlcXVlc3RzIGFuZCB0cmllcyB0byBtZXJnZSB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAqIHJlcXVlc3RzIHRoYXQgcmVtYWluIGFmdGVyIG1lcmdpbmcuCisgKi8KK3N0YXRpYyBpbnQgbXVsdGl3cml0ZV9tZXJnZShCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tSZXF1ZXN0ICpyZXFzLAorICAgIGludCBudW1fcmVxcywgTXVsdGl3cml0ZUNCICptY2IpCit7CisgICAgaW50IGksIG91dGlkeDsKKworICAgIC8vIFNvcnQgcmVxdWVzdHMgYnkgc3RhcnQgc2VjdG9yCisgICAgcXNvcnQocmVxcywgbnVtX3JlcXMsIHNpemVvZigqcmVxcyksICZtdWx0aXdyaXRlX3JlcV9jb21wYXJlKTsKKworICAgIC8vIENoZWNrIGlmIGFkamFjZW50IHJlcXVlc3RzIHRvdWNoIHRoZSBzYW1lIGNsdXN0ZXJzLiBJZiBzbywgY29tYmluZSB0aGVtLAorICAgIC8vIGZpbGxpbmcgdXAgZ2FwcyB3aXRoIHplcm8gc2VjdG9ycy4KKyAgICBvdXRpZHggPSAwOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1fcmVxczsgaSsrKSB7CisgICAgICAgIGludCBtZXJnZSA9IDA7CisgICAgICAgIGludDY0X3Qgb2xkcmVxX2xhc3QgPSByZXFzW291dGlkeF0uc2VjdG9yICsgcmVxc1tvdXRpZHhdLm5iX3NlY3RvcnM7CisKKyAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlcyB0aGF0IGFyZSB2YWxpZCBmb3IgYWxsIGJsb2NrIGRyaXZlcnMsIG5hbWVseQorICAgICAgICAvLyBleGFjdGx5IHNlcXVlbnRpYWwgd3JpdGVzIGFuZCBvdmVybGFwcGluZyB3cml0ZXMuCisgICAgICAgIGlmIChyZXFzW2ldLnNlY3RvciA8PSBvbGRyZXFfbGFzdCkgeworICAgICAgICAgICAgbWVyZ2UgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGJsb2NrIGRyaXZlciBtYXkgZGVjaWRlIHRoYXQgaXQgbWFrZXMgc2Vuc2UgdG8gY29tYmluZSByZXF1ZXN0cworICAgICAgICAvLyBldmVuIGlmIHRoZXJlIGlzIGEgZ2FwIG9mIHNvbWUgc2VjdG9ycyBiZXR3ZWVuIHRoZW0uIEluIHRoaXMgY2FzZSwKKyAgICAgICAgLy8gdGhlIGdhcCBpcyBmaWxsZWQgd2l0aCB6ZXJvcyAodGhlcmVmb3JlIG9ubHkgYXBwbGljYWJsZSBmb3IgeWV0CisgICAgICAgIC8vIHVudXNlZCBzcGFjZSBpbiBmb3JtYXQgbGlrZSBxY293MikuCisgICAgICAgIGlmICghbWVyZ2UgJiYgYnMtPmRydi0+YmRydl9tZXJnZV9yZXF1ZXN0cykgeworICAgICAgICAgICAgbWVyZ2UgPSBicy0+ZHJ2LT5iZHJ2X21lcmdlX3JlcXVlc3RzKGJzLCAmcmVxc1tvdXRpZHhdLCAmcmVxc1tpXSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxc1tvdXRpZHhdLnFpb3YtPm5pb3YgKyByZXFzW2ldLnFpb3YtPm5pb3YgKyAxID4gSU9WX01BWCkgeworICAgICAgICAgICAgbWVyZ2UgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lcmdlKSB7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgIFFFTVVJT1ZlY3RvciAqcWlvdiA9IGdfbWFsbG9jMChzaXplb2YoKnFpb3YpKTsKKyAgICAgICAgICAgIHFlbXVfaW92ZWNfaW5pdChxaW92LAorICAgICAgICAgICAgICAgIHJlcXNbb3V0aWR4XS5xaW92LT5uaW92ICsgcmVxc1tpXS5xaW92LT5uaW92ICsgMSk7CisKKyAgICAgICAgICAgIC8vIEFkZCB0aGUgZmlyc3QgcmVxdWVzdCB0byB0aGUgbWVyZ2VkIG9uZS4gSWYgdGhlIHJlcXVlc3RzIGFyZQorICAgICAgICAgICAgLy8gb3ZlcmxhcHBpbmcsIGRyb3AgdGhlIGxhc3Qgc2VjdG9ycyBvZiB0aGUgZmlyc3QgcmVxdWVzdC4KKyAgICAgICAgICAgIHNpemUgPSAocmVxc1tpXS5zZWN0b3IgLSByZXFzW291dGlkeF0uc2VjdG9yKSA8PCA5OworICAgICAgICAgICAgcWVtdV9pb3ZlY19jb25jYXQocWlvdiwgcmVxc1tvdXRpZHhdLnFpb3YsIDAsIHNpemUpOworCisgICAgICAgICAgICAvLyBXZSBtaWdodCBuZWVkIHRvIGFkZCBzb21lIHplcm9zIGJldHdlZW4gdGhlIHR3byByZXF1ZXN0cworICAgICAgICAgICAgaWYgKHJlcXNbaV0uc2VjdG9yID4gb2xkcmVxX2xhc3QpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgemVyb19ieXRlcyA9IChyZXFzW2ldLnNlY3RvciAtIG9sZHJlcV9sYXN0KSA8PCA5OworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IHFlbXVfYmxvY2thbGlnbihicywgemVyb19ieXRlcyk7CisgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgemVyb19ieXRlcyk7CisgICAgICAgICAgICAgICAgcWVtdV9pb3ZlY19hZGQocWlvdiwgYnVmLCB6ZXJvX2J5dGVzKTsKKyAgICAgICAgICAgICAgICBtY2ItPmNhbGxiYWNrc1tpXS5mcmVlX2J1ZiA9IGJ1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIHRoZSBzZWNvbmQgcmVxdWVzdAorICAgICAgICAgICAgcWVtdV9pb3ZlY19jb25jYXQocWlvdiwgcmVxc1tpXS5xaW92LCAwLCByZXFzW2ldLnFpb3YtPnNpemUpOworCisgICAgICAgICAgICByZXFzW291dGlkeF0ubmJfc2VjdG9ycyA9IHFpb3YtPnNpemUgPj4gOTsKKyAgICAgICAgICAgIHJlcXNbb3V0aWR4XS5xaW92ID0gcWlvdjsKKworICAgICAgICAgICAgbWNiLT5jYWxsYmFja3NbaV0uZnJlZV9xaW92ID0gcmVxc1tvdXRpZHhdLnFpb3Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRpZHgrKzsKKyAgICAgICAgICAgIHJlcXNbb3V0aWR4XS5zZWN0b3IgICAgID0gcmVxc1tpXS5zZWN0b3I7CisgICAgICAgICAgICByZXFzW291dGlkeF0ubmJfc2VjdG9ycyA9IHJlcXNbaV0ubmJfc2VjdG9yczsKKyAgICAgICAgICAgIHJlcXNbb3V0aWR4XS5xaW92ICAgICAgID0gcmVxc1tpXS5xaW92OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG91dGlkeCArIDE7Cit9CisKKy8qCisgKiBTdWJtaXQgbXVsdGlwbGUgQUlPIHdyaXRlIHJlcXVlc3RzIGF0IG9uY2UuCisgKgorICogT24gc3VjY2VzcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBhbmQgYWxsIHJlcXVlc3RzIGluIHRoZSByZXFzIGFycmF5IGhhdmUKKyAqIGJlZW4gc3VibWl0dGVkLiBJbiBlcnJvciBjYXNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMSwgYW5kIGFueSBvZiB0aGUKKyAqIHJlcXVlc3RzIG1heSBvciBtYXkgbm90IGJlIHN1Ym1pdHRlZCB5ZXQuIEluIHBhcnRpY3VsYXIsIHRoaXMgbWVhbnMgdGhhdCB0aGUKKyAqIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZvciBzb21lIG9mIHRoZSByZXF1ZXN0cywgZm9yIG90aGVycyBpdCB3b24ndC4gVGhlCisgKiBjYWxsZXIgbXVzdCBjaGVjayB0aGUgZXJyb3IgZmllbGQgb2YgdGhlIEJsb2NrUmVxdWVzdCB0byB3YWl0IGZvciB0aGUgcmlnaHQKKyAqIGNhbGxiYWNrcyAoaWYgZXJyb3IgIT0gMCwgbm8gY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQpLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgcmVxcyBhcnJheSwgZS5nLiB0byBtZXJnZQorICogcmVxdWVzdHMuIEhvd2V2ZXIsIHRoZSBmaWVsZHMgb3BhcXVlIGFuZCBlcnJvciBhcmUgbGVmdCB1bm1vZGlmaWVkIGFzIHRoZXkKKyAqIGFyZSB1c2VkIHRvIHNpZ25hbCBmYWlsdXJlIGZvciBhIHNpbmdsZSByZXF1ZXN0IHRvIHRoZSBjYWxsZXIuCisgKi8KK2ludCBiZHJ2X2Fpb19tdWx0aXdyaXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBCbG9ja1JlcXVlc3QgKnJlcXMsIGludCBudW1fcmVxcykKK3sKKyAgICBCbG9ja0RyaXZlckFJT0NCICphY2I7CisgICAgTXVsdGl3cml0ZUNCICptY2I7CisgICAgaW50IGk7CisKKyAgICBpZiAobnVtX3JlcXMgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTXVsdGl3cml0ZUNCIHN0cnVjdHVyZQorICAgIG1jYiA9IGdfbWFsbG9jMChzaXplb2YoKm1jYikgKyBudW1fcmVxcyAqIHNpemVvZigqbWNiLT5jYWxsYmFja3MpKTsKKyAgICBtY2ItPm51bV9yZXF1ZXN0cyA9IDA7CisgICAgbWNiLT5udW1fY2FsbGJhY2tzID0gbnVtX3JlcXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlcXM7IGkrKykgeworICAgICAgICBtY2ItPmNhbGxiYWNrc1tpXS5jYiA9IHJlcXNbaV0uY2I7CisgICAgICAgIG1jYi0+Y2FsbGJhY2tzW2ldLm9wYXF1ZSA9IHJlcXNbaV0ub3BhcXVlOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBtZXJnYWJsZSByZXF1ZXN0cworICAgIG51bV9yZXFzID0gbXVsdGl3cml0ZV9tZXJnZShicywgcmVxcywgbnVtX3JlcXMsIG1jYik7CisKKyAgICAvKgorICAgICAqIFJ1biB0aGUgYWlvIHJlcXVlc3RzLiBBcyBzb29uIGFzIG9uZSByZXF1ZXN0IGNhbid0IGJlIHN1Ym1pdHRlZAorICAgICAqIHN1Y2Nlc3NmdWxseSwgZmFpbCBhbGwgcmVxdWVzdHMgdGhhdCBhcmUgbm90IHlldCBzdWJtaXR0ZWQgKHdlIG11c3QKKyAgICAgKiByZXR1cm4gZmFpbHVyZSBmb3IgYWxsIHJlcXVlc3RzIGFueXdheSkKKyAgICAgKgorICAgICAqIG51bV9yZXF1ZXN0cyBjYW5ub3QgYmUgc2V0IHRvIHRoZSByaWdodCB2YWx1ZSBpbW1lZGlhdGVseTogSWYKKyAgICAgKiBiZHJ2X2Fpb193cml0ZXYgZmFpbHMgZm9yIHNvbWUgcmVxdWVzdCwgbnVtX3JlcXVlc3RzIHdvdWxkIGJlIHRvbyBoaWdoCisgICAgICogYW5kIHRoZXJlZm9yZSBtdWx0aXdyaXRlX2NiKCkgd291bGQgbmV2ZXIgcmVjb2duaXplIHRoZSBtdWx0aXdyaXRlCisgICAgICogcmVxdWVzdCBhcyBjb21wbGV0ZWQuIFdlIGFsc28gY2Fubm90IHVzZSB0aGUgbG9vcCB2YXJpYWJsZSBpIHRvIHNldCBpdAorICAgICAqIHdoZW4gdGhlIGZpcnN0IHJlcXVlc3QgZmFpbHMgYmVjYXVzZSB0aGUgY2FsbGJhY2sgbWF5IGFscmVhZHkgaGF2ZSBiZWVuCisgICAgICogY2FsbGVkIGZvciBwcmV2aW91c2x5IHN1Ym1pdHRlZCByZXF1ZXN0cy4gVGh1cywgbnVtX3JlcXVlc3RzIG11c3QgYmUKKyAgICAgKiBpbmNyZW1lbnRlZCBmb3IgZWFjaCByZXF1ZXN0IHRoYXQgaXMgc3VibWl0dGVkLgorICAgICAqCisgICAgICogVGhlIHByb2JsZW0gdGhhdCBjYWxsYmFja3MgbWF5IGJlIGNhbGxlZCBlYXJseSBhbHNvIG1lYW5zIHRoYXQgd2UgbmVlZAorICAgICAqIHRvIHRha2UgY2FyZSB0aGF0IG51bV9yZXF1ZXN0cyBkb2Vzbid0IGJlY29tZSAwIGJlZm9yZSBhbGwgcmVxdWVzdHMgYXJlCisgICAgICogc3VibWl0dGVkIC0gbXVsdGl3cml0ZV9jYigpIHdvdWxkIGNvbnNpZGVyIHRoZSBtdWx0aXdyaXRlIHJlcXVlc3QKKyAgICAgKiBjb21wbGV0ZWQuIEEgZHVtbXkgcmVxdWVzdCB0aGF0IGlzICJjb21wbGV0ZWQiIGJ5IGEgbWFudWFsIGNhbGwgdG8KKyAgICAgKiBtdWx0aXdyaXRlX2NiKCkgdGFrZXMgY2FyZSBvZiB0aGlzLgorICAgICAqLworICAgIG1jYi0+bnVtX3JlcXVlc3RzID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcmVxczsgaSsrKSB7CisgICAgICAgIG1jYi0+bnVtX3JlcXVlc3RzKys7CisgICAgICAgIGFjYiA9IGJkcnZfYWlvX3dyaXRldihicywgcmVxc1tpXS5zZWN0b3IsIHJlcXNbaV0ucWlvdiwKKyAgICAgICAgICAgIHJlcXNbaV0ubmJfc2VjdG9ycywgbXVsdGl3cml0ZV9jYiwgbWNiKTsKKworICAgICAgICBpZiAoYWNiID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbiBvbmx5IGZhaWwgdGhlIHdob2xlIHRoaW5nIGlmIG5vIHJlcXVlc3QgaGFzIGJlZW4KKyAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCB5ZXQuIE90aGVyd2lzZSB3ZSdsbCB3YWl0IGZvciB0aGUgc3VibWl0dGVkIEFJT3MgdG8KKyAgICAgICAgICAgIC8vIGNvbXBsZXRlIGFuZCByZXBvcnQgdGhlIGVycm9yIGluIHRoZSBjYWxsYmFjay4KKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG11bHRpd3JpdGVfY2IobWNiLCAtRUlPKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbXBsZXRlIHRoZSBkdW1teSByZXF1ZXN0ICovCisgICAgbXVsdGl3cml0ZV9jYihtY2IsIDApOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IG1jYi0+bnVtX2NhbGxiYWNrczsgaSsrKSB7CisgICAgICAgIHJlcXNbaV0uZXJyb3IgPSAtRUlPOworICAgIH0KKyAgICBnX2ZyZWUobWNiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK0Jsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX2ZsdXNoKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworCisgICAgaWYgKGJzLT5vcGVuX2ZsYWdzICYgQkRSVl9PX05PX0ZMVVNIKSB7CisgICAgICAgIHJldHVybiBiZHJ2X2Fpb19ub29wX2VtKGJzLCBjYiwgb3BhcXVlKTsKKyAgICB9CisKKyAgICBpZiAoIWRydikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGRydi0+YmRydl9haW9fZmx1c2goYnMsIGNiLCBvcGFxdWUpOworfQorCit2b2lkIGJkcnZfYWlvX2NhbmNlbChCbG9ja0RyaXZlckFJT0NCICphY2IpCit7CisgICAgYWNiLT5wb29sLT5jYW5jZWwoYWNiKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhc3luYyBibG9jayBkZXZpY2UgZW11bGF0aW9uICovCisKK3R5cGVkZWYgc3RydWN0IEJsb2NrRHJpdmVyQUlPQ0JTeW5jIHsKKyAgICBCbG9ja0RyaXZlckFJT0NCIGNvbW1vbjsKKyAgICBRRU1VQkggKmJoOworICAgIGludCByZXQ7CisgICAgLyogdmVjdG9yIHRyYW5zbGF0aW9uIHN0YXRlICovCisgICAgUUVNVUlPVmVjdG9yICpxaW92OworICAgIHVpbnQ4X3QgKmJvdW5jZTsKKyAgICBpbnQgaXNfd3JpdGU7Cit9IEJsb2NrRHJpdmVyQUlPQ0JTeW5jOworCitzdGF0aWMgdm9pZCBiZHJ2X2Fpb19jYW5jZWxfZW0oQmxvY2tEcml2ZXJBSU9DQiAqYmxvY2thY2IpCit7CisgICAgQmxvY2tEcml2ZXJBSU9DQlN5bmMgKmFjYiA9CisgICAgICAgIGNvbnRhaW5lcl9vZihibG9ja2FjYiwgQmxvY2tEcml2ZXJBSU9DQlN5bmMsIGNvbW1vbik7CisgICAgcWVtdV9iaF9kZWxldGUoYWNiLT5iaCk7CisgICAgYWNiLT5iaCA9IE5VTEw7CisgICAgcWVtdV9haW9fcmVsZWFzZShhY2IpOworfQorCitzdGF0aWMgQUlPUG9vbCBiZHJ2X2VtX2Fpb19wb29sID0geworICAgIC5haW9jYl9zaXplICAgICAgICAgPSBzaXplb2YoQmxvY2tEcml2ZXJBSU9DQlN5bmMpLAorICAgIC5jYW5jZWwgICAgICAgICAgICAgPSBiZHJ2X2Fpb19jYW5jZWxfZW0sCit9OworCitzdGF0aWMgdm9pZCBiZHJ2X2Fpb19iaF9jYih2b2lkICpvcGFxdWUpCit7CisgICAgQmxvY2tEcml2ZXJBSU9DQlN5bmMgKmFjYiA9IG9wYXF1ZTsKKworICAgIGlmICghYWNiLT5pc193cml0ZSkKKyAgICAgICAgcWVtdV9pb3ZlY19mcm9tX2J1ZihhY2ItPnFpb3YsIDAsIGFjYi0+Ym91bmNlLCBhY2ItPnFpb3YtPnNpemUpOworICAgIHFlbXVfdmZyZWUoYWNiLT5ib3VuY2UpOworICAgIGFjYi0+Y29tbW9uLmNiKGFjYi0+Y29tbW9uLm9wYXF1ZSwgYWNiLT5yZXQpOworICAgIHFlbXVfYmhfZGVsZXRlKGFjYi0+YmgpOworICAgIGFjYi0+YmggPSBOVUxMOworICAgIHFlbXVfYWlvX3JlbGVhc2UoYWNiKTsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX3J3X3ZlY3RvcihCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VSU9WZWN0b3IgKnFpb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfd3JpdGUpCisKK3sKKyAgICBCbG9ja0RyaXZlckFJT0NCU3luYyAqYWNiOworCisgICAgYWNiID0gcWVtdV9haW9fZ2V0KCZiZHJ2X2VtX2Fpb19wb29sLCBicywgY2IsIG9wYXF1ZSk7CisgICAgYWNiLT5pc193cml0ZSA9IGlzX3dyaXRlOworICAgIGFjYi0+cWlvdiA9IHFpb3Y7CisgICAgYWNiLT5ib3VuY2UgPSBxZW11X2Jsb2NrYWxpZ24oYnMsIHFpb3YtPnNpemUpOworCisgICAgaWYgKCFhY2ItPmJoKQorICAgICAgICBhY2ItPmJoID0gcWVtdV9iaF9uZXcoYmRydl9haW9fYmhfY2IsIGFjYik7CisKKyAgICBpZiAoaXNfd3JpdGUpIHsKKyAgICAgICAgcWVtdV9pb3ZlY190b19idWYoYWNiLT5xaW92LCAwLCBhY2ItPmJvdW5jZSwgcWlvdi0+c2l6ZSk7CisgICAgICAgIGFjYi0+cmV0ID0gYmRydl93cml0ZShicywgc2VjdG9yX251bSwgYWNiLT5ib3VuY2UsIG5iX3NlY3RvcnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFjYi0+cmV0ID0gYmRydl9yZWFkKGJzLCBzZWN0b3JfbnVtLCBhY2ItPmJvdW5jZSwgbmJfc2VjdG9ycyk7CisgICAgfQorCisgICAgcWVtdV9iaF9zY2hlZHVsZShhY2ItPmJoKTsKKworICAgIHJldHVybiAmYWNiLT5jb21tb247Cit9CisKK3N0YXRpYyBCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb19yZWFkdl9lbShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiBiZHJ2X2Fpb19yd192ZWN0b3IoYnMsIHNlY3Rvcl9udW0sIHFpb3YsIG5iX3NlY3RvcnMsIGNiLCBvcGFxdWUsIDApOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqYmRydl9haW9fd3JpdGV2X2VtKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBpbnQ2NF90IHNlY3Rvcl9udW0sIFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgcmV0dXJuIGJkcnZfYWlvX3J3X3ZlY3Rvcihicywgc2VjdG9yX251bSwgcWlvdiwgbmJfc2VjdG9ycywgY2IsIG9wYXF1ZSwgMSk7Cit9CisKK3N0YXRpYyBCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb19mbHVzaF9lbShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBCbG9ja0RyaXZlckFJT0NCU3luYyAqYWNiOworCisgICAgYWNiID0gcWVtdV9haW9fZ2V0KCZiZHJ2X2VtX2Fpb19wb29sLCBicywgY2IsIG9wYXF1ZSk7CisgICAgYWNiLT5pc193cml0ZSA9IDE7IC8qIGRvbid0IGJvdW5jZSBpbiB0aGUgY29tcGxldGlvbiBoYWRsZXIgKi8KKyAgICBhY2ItPnFpb3YgPSBOVUxMOworICAgIGFjYi0+Ym91bmNlID0gTlVMTDsKKyAgICBhY2ItPnJldCA9IDA7CisKKyAgICBpZiAoIWFjYi0+YmgpCisgICAgICAgIGFjYi0+YmggPSBxZW11X2JoX25ldyhiZHJ2X2Fpb19iaF9jYiwgYWNiKTsKKworICAgIGJkcnZfZmx1c2goYnMpOworICAgIHFlbXVfYmhfc2NoZWR1bGUoYWNiLT5iaCk7CisgICAgcmV0dXJuICZhY2ItPmNvbW1vbjsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX25vb3BfZW0oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgQmxvY2tEcml2ZXJBSU9DQlN5bmMgKmFjYjsKKworICAgIGFjYiA9IHFlbXVfYWlvX2dldCgmYmRydl9lbV9haW9fcG9vbCwgYnMsIGNiLCBvcGFxdWUpOworICAgIGFjYi0+aXNfd3JpdGUgPSAxOyAvKiBkb24ndCBib3VuY2UgaW4gdGhlIGNvbXBsZXRpb24gaGFuZGxlciAqLworICAgIGFjYi0+cWlvdiA9IE5VTEw7CisgICAgYWNiLT5ib3VuY2UgPSBOVUxMOworICAgIGFjYi0+cmV0ID0gMDsKKworICAgIGlmICghYWNiLT5iaCkgeworICAgICAgICBhY2ItPmJoID0gcWVtdV9iaF9uZXcoYmRydl9haW9fYmhfY2IsIGFjYik7CisgICAgfQorCisgICAgcWVtdV9iaF9zY2hlZHVsZShhY2ItPmJoKTsKKyAgICByZXR1cm4gJmFjYi0+Y29tbW9uOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBzeW5jIGJsb2NrIGRldmljZSBlbXVsYXRpb24gKi8KKworc3RhdGljIHZvaWQgYmRydl9yd19lbV9jYih2b2lkICpvcGFxdWUsIGludCByZXQpCit7CisgICAgKihpbnQgKilvcGFxdWUgPSByZXQ7Cit9CisKKyNkZWZpbmUgTk9UX0RPTkUgMHg3ZmZmZmZmZgorCitzdGF0aWMgaW50IGJkcnZfcmVhZF9lbShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICBpbnQgYXN5bmNfcmV0OworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKmFjYjsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92OworICAgIFFFTVVJT1ZlY3RvciBxaW92OworCisgICAgYXN5bmNfY29udGV4dF9wdXNoKCk7CisKKyAgICBhc3luY19yZXQgPSBOT1RfRE9ORTsKKyAgICBpb3YuaW92X2Jhc2UgPSAodm9pZCAqKWJ1ZjsKKyAgICBpb3YuaW92X2xlbiA9IG5iX3NlY3RvcnMgKiBCRFJWX1NFQ1RPUl9TSVpFOworICAgIHFlbXVfaW92ZWNfaW5pdF9leHRlcm5hbCgmcWlvdiwgJmlvdiwgMSk7CisgICAgYWNiID0gYmRydl9haW9fcmVhZHYoYnMsIHNlY3Rvcl9udW0sICZxaW92LCBuYl9zZWN0b3JzLAorICAgICAgICBiZHJ2X3J3X2VtX2NiLCAmYXN5bmNfcmV0KTsKKyAgICBpZiAoYWNiID09IE5VTEwpIHsKKyAgICAgICAgYXN5bmNfcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICB3aGlsZSAoYXN5bmNfcmV0ID09IE5PVF9ET05FKSB7CisgICAgICAgIHFlbXVfYWlvX3dhaXQoKTsKKyAgICB9CisKKworZmFpbDoKKyAgICBhc3luY19jb250ZXh0X3BvcCgpOworICAgIHJldHVybiBhc3luY19yZXQ7Cit9CisKK3N0YXRpYyBpbnQgYmRydl93cml0ZV9lbShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpCit7CisgICAgaW50IGFzeW5jX3JldDsKKyAgICBCbG9ja0RyaXZlckFJT0NCICphY2I7CisgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICBRRU1VSU9WZWN0b3IgcWlvdjsKKworICAgIGFzeW5jX2NvbnRleHRfcHVzaCgpOworCisgICAgYXN5bmNfcmV0ID0gTk9UX0RPTkU7CisgICAgaW92Lmlvdl9iYXNlID0gKHZvaWQgKilidWY7CisgICAgaW92Lmlvdl9sZW4gPSBuYl9zZWN0b3JzICogQkRSVl9TRUNUT1JfU0laRTsKKyAgICBxZW11X2lvdmVjX2luaXRfZXh0ZXJuYWwoJnFpb3YsICZpb3YsIDEpOworICAgIGFjYiA9IGJkcnZfYWlvX3dyaXRldihicywgc2VjdG9yX251bSwgJnFpb3YsIG5iX3NlY3RvcnMsCisgICAgICAgIGJkcnZfcndfZW1fY2IsICZhc3luY19yZXQpOworICAgIGlmIChhY2IgPT0gTlVMTCkgeworICAgICAgICBhc3luY19yZXQgPSAtMTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICB3aGlsZSAoYXN5bmNfcmV0ID09IE5PVF9ET05FKSB7CisgICAgICAgIHFlbXVfYWlvX3dhaXQoKTsKKyAgICB9CisKK2ZhaWw6CisgICAgYXN5bmNfY29udGV4dF9wb3AoKTsKKyAgICByZXR1cm4gYXN5bmNfcmV0OworfQorCit2b2lkIGJkcnZfaW5pdCh2b2lkKQoreworICAgIG1vZHVsZV9jYWxsX2luaXQoTU9EVUxFX0lOSVRfQkxPQ0spOworfQorCit2b2lkIGJkcnZfaW5pdF93aXRoX3doaXRlbGlzdCh2b2lkKQoreworICAgIHVzZV9iZHJ2X3doaXRlbGlzdCA9IDE7CisgICAgYmRydl9pbml0KCk7Cit9CisKK3ZvaWQgKnFlbXVfYWlvX2dldChBSU9Qb29sICpwb29sLCBCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKmFjYjsKKworICAgIGlmIChwb29sLT5mcmVlX2Fpb2NiKSB7CisgICAgICAgIGFjYiA9IHBvb2wtPmZyZWVfYWlvY2I7CisgICAgICAgIHBvb2wtPmZyZWVfYWlvY2IgPSBhY2ItPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWNiID0gZ19tYWxsb2MwKHBvb2wtPmFpb2NiX3NpemUpOworICAgICAgICBhY2ItPnBvb2wgPSBwb29sOworICAgIH0KKyAgICBhY2ItPmJzID0gYnM7CisgICAgYWNiLT5jYiA9IGNiOworICAgIGFjYi0+b3BhcXVlID0gb3BhcXVlOworICAgIHJldHVybiBhY2I7Cit9CisKK3ZvaWQgcWVtdV9haW9fcmVsZWFzZSh2b2lkICpwKQoreworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKmFjYiA9IChCbG9ja0RyaXZlckFJT0NCICopcDsKKyAgICBBSU9Qb29sICpwb29sID0gYWNiLT5wb29sOworICAgIGFjYi0+bmV4dCA9IHBvb2wtPmZyZWVfYWlvY2I7CisgICAgcG9vbC0+ZnJlZV9haW9jYiA9IGFjYjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcmVtb3ZhYmxlIGRldmljZSBzdXBwb3J0ICovCisKKy8qKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIG1lZGlhIGlzIHByZXNlbnQKKyAqLworaW50IGJkcnZfaXNfaW5zZXJ0ZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgaW50IHJldDsKKyAgICBpZiAoIWRydikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFkcnYtPmJkcnZfaXNfaW5zZXJ0ZWQpCisgICAgICAgIHJldHVybiAhYnMtPnRyYXlfb3BlbjsKKyAgICByZXQgPSBkcnYtPmJkcnZfaXNfaW5zZXJ0ZWQoYnMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogUmV0dXJuIFRSVUUgaWYgdGhlIG1lZGlhIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byB0aGlzCisgKiBmdW5jdGlvbi4gSXQgaXMgY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgZmxvcHB5IGRpc2tzCisgKi8KK2ludCBiZHJ2X21lZGlhX2NoYW5nZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisgICAgaW50IHJldDsKKworICAgIGlmICghZHJ2IHx8ICFkcnYtPmJkcnZfbWVkaWFfY2hhbmdlZCkKKyAgICAgICAgcmV0ID0gLUVOT1RTVVA7CisgICAgZWxzZQorICAgICAgICByZXQgPSBkcnYtPmJkcnZfbWVkaWFfY2hhbmdlZChicyk7CisgICAgaWYgKHJldCA9PSAtRU5PVFNVUCkKKyAgICAgICAgcmV0ID0gYnMtPm1lZGlhX2NoYW5nZWQ7CisgICAgYnMtPm1lZGlhX2NoYW5nZWQgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogSWYgZWplY3RfZmxhZyBpcyBUUlVFLCBlamVjdCB0aGUgbWVkaWEuIE90aGVyd2lzZSwgY2xvc2UgdGhlIHRyYXkKKyAqLworaW50IGJkcnZfZWplY3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBlamVjdF9mbGFnKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoYnMtPmxvY2tlZCkgeworICAgICAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGlmICghZHJ2IHx8ICFkcnYtPmJkcnZfZWplY3QpIHsKKyAgICAgICAgcmV0ID0gLUVOT1RTVVA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZHJ2LT5iZHJ2X2VqZWN0KGJzLCBlamVjdF9mbGFnKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRU5PVFNVUCkgeworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgYnMtPnRyYXlfb3BlbiA9IGVqZWN0X2ZsYWc7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGJkcnZfaXNfbG9ja2VkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBicy0+bG9ja2VkOworfQorCisvKioKKyAqIExvY2sgb3IgdW5sb2NrIHRoZSBtZWRpYSAoaWYgaXQgaXMgbG9ja2VkLCB0aGUgdXNlciB3b24ndCBiZSBhYmxlCisgKiB0byBlamVjdCBpdCBtYW51YWxseSkuCisgKi8KK3ZvaWQgYmRydl9zZXRfbG9ja2VkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgbG9ja2VkKQoreworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBicy0+ZHJ2OworCisgICAgYnMtPmxvY2tlZCA9IGxvY2tlZDsKKyAgICBpZiAoZHJ2ICYmIGRydi0+YmRydl9zZXRfbG9ja2VkKSB7CisgICAgICAgIGRydi0+YmRydl9zZXRfbG9ja2VkKGJzLCBsb2NrZWQpOworICAgIH0KK30KKworLyogbmVlZGVkIGZvciBnZW5lcmljIHNjc2kgaW50ZXJmYWNlICovCisKK2ludCBiZHJ2X2lvY3RsKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1bnNpZ25lZCBsb25nIGludCByZXEsIHZvaWQgKmJ1ZikKK3sKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gYnMtPmRydjsKKworICAgIGlmIChkcnYgJiYgZHJ2LT5iZHJ2X2lvY3RsKQorICAgICAgICByZXR1cm4gZHJ2LT5iZHJ2X2lvY3RsKGJzLCByZXEsIGJ1Zik7CisgICAgcmV0dXJuIC1FTk9UU1VQOworfQorCitCbG9ja0RyaXZlckFJT0NCICpiZHJ2X2Fpb19pb2N0bChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgcmVxLCB2b2lkICpidWYsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IGJzLT5kcnY7CisKKyAgICBpZiAoZHJ2ICYmIGRydi0+YmRydl9haW9faW9jdGwpCisgICAgICAgIHJldHVybiBkcnYtPmJkcnZfYWlvX2lvY3RsKGJzLCByZXEsIGJ1ZiwgY2IsIG9wYXF1ZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworCit2b2lkICpxZW11X2Jsb2NrYWxpZ24oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBxZW11X21lbWFsaWduKChicyAmJiBicy0+YnVmZmVyX2FsaWdubWVudCkgPyBicy0+YnVmZmVyX2FsaWdubWVudCA6IDUxMiwgc2l6ZSk7Cit9CisKK3ZvaWQgYmRydl9zZXRfZGlydHlfdHJhY2tpbmcoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBlbmFibGUpCit7CisgICAgaW50NjRfdCBiaXRtYXBfc2l6ZTsKKworICAgIGJzLT5kaXJ0eV9jb3VudCA9IDA7CisgICAgaWYgKGVuYWJsZSkgeworICAgICAgICBpZiAoIWJzLT5kaXJ0eV9iaXRtYXApIHsKKyAgICAgICAgICAgIGJpdG1hcF9zaXplID0gKGJkcnZfZ2V0bGVuZ3RoKGJzKSA+PiBCRFJWX1NFQ1RPUl9CSVRTKSArCisgICAgICAgICAgICAgICAgICAgIEJEUlZfU0VDVE9SU19QRVJfRElSVFlfQ0hVTksgKiA4IC0gMTsKKyAgICAgICAgICAgIGJpdG1hcF9zaXplIC89IEJEUlZfU0VDVE9SU19QRVJfRElSVFlfQ0hVTksgKiA4OworCisgICAgICAgICAgICBicy0+ZGlydHlfYml0bWFwID0gZ19tYWxsb2MwKGJpdG1hcF9zaXplKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChicy0+ZGlydHlfYml0bWFwKSB7CisgICAgICAgICAgICBnX2ZyZWUoYnMtPmRpcnR5X2JpdG1hcCk7CisgICAgICAgICAgICBicy0+ZGlydHlfYml0bWFwID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGJkcnZfZ2V0X2RpcnR5KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3RvcikKK3sKKyAgICBpbnQ2NF90IGNodW5rID0gc2VjdG9yIC8gKGludDY0X3QpQkRSVl9TRUNUT1JTX1BFUl9ESVJUWV9DSFVOSzsKKworICAgIGlmIChicy0+ZGlydHlfYml0bWFwICYmCisgICAgICAgIChzZWN0b3IgPDwgQkRSVl9TRUNUT1JfQklUUykgPCBiZHJ2X2dldGxlbmd0aChicykpIHsKKyAgICAgICAgcmV0dXJuIGJzLT5kaXJ0eV9iaXRtYXBbY2h1bmsgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCldICYKKyAgICAgICAgICAgICgxIDw8IChjaHVuayAlIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBiZHJ2X3Jlc2V0X2RpcnR5KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IGN1cl9zZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG5yX3NlY3RvcnMpCit7CisgICAgc2V0X2RpcnR5X2JpdG1hcChicywgY3VyX3NlY3RvciwgbnJfc2VjdG9ycywgMCk7Cit9CisKK2ludDY0X3QgYmRydl9nZXRfZGlydHlfY291bnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIGJzLT5kaXJ0eV9jb3VudDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItY2x1c3Rlci5jIGIvYW5kcm9pZC9xZW11MS9ibG9jay9xY293Mi1jbHVzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5NzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItY2x1c3Rlci5jCkBAIC0wLDAgKzEsOTIzIEBACisvKgorICogQmxvY2sgZHJpdmVyIGZvciB0aGUgUUNPVyB2ZXJzaW9uIDIgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrX2ludC5oIgorI2luY2x1ZGUgImJsb2NrL3Fjb3cyLmgiCisKK2ludCBxY293Ml9ncm93X2wxX3RhYmxlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgbWluX3NpemUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IG5ld19sMV9zaXplLCBuZXdfbDFfc2l6ZTIsIHJldCwgaTsKKyAgICB1aW50NjRfdCAqbmV3X2wxX3RhYmxlOworICAgIGludDY0X3QgbmV3X2wxX3RhYmxlX29mZnNldDsKKyAgICB1aW50OF90IGRhdGFbMTJdOworCisgICAgbmV3X2wxX3NpemUgPSBzLT5sMV9zaXplOworICAgIGlmIChtaW5fc2l6ZSA8PSBuZXdfbDFfc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5ld19sMV9zaXplID09IDApIHsKKyAgICAgICAgbmV3X2wxX3NpemUgPSAxOworICAgIH0KKyAgICB3aGlsZSAobWluX3NpemUgPiBuZXdfbDFfc2l6ZSkgeworICAgICAgICBuZXdfbDFfc2l6ZSA9IChuZXdfbDFfc2l6ZSAqIDMgKyAxKSAvIDI7CisgICAgfQorI2lmZGVmIERFQlVHX0FMTE9DMgorICAgIHByaW50ZigiZ3JvdyBsMV90YWJsZSBmcm9tICVkIHRvICVkXG4iLCBzLT5sMV9zaXplLCBuZXdfbDFfc2l6ZSk7CisjZW5kaWYKKworICAgIG5ld19sMV9zaXplMiA9IHNpemVvZih1aW50NjRfdCkgKiBuZXdfbDFfc2l6ZTsKKyAgICBuZXdfbDFfdGFibGUgPSBnX21hbGxvYzAoYWxpZ25fb2Zmc2V0KG5ld19sMV9zaXplMiwgNTEyKSk7CisgICAgbWVtY3B5KG5ld19sMV90YWJsZSwgcy0+bDFfdGFibGUsIHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKworICAgIC8qIHdyaXRlIG5ldyB0YWJsZSAoYWxpZ24gdG8gY2x1c3RlcikgKi8KKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19MMV9HUk9XX0FMTE9DX1RBQkxFKTsKKyAgICBuZXdfbDFfdGFibGVfb2Zmc2V0ID0gcWNvdzJfYWxsb2NfY2x1c3RlcnMoYnMsIG5ld19sMV9zaXplMik7CisgICAgaWYgKG5ld19sMV90YWJsZV9vZmZzZXQgPCAwKSB7CisgICAgICAgIGdfZnJlZShuZXdfbDFfdGFibGUpOworICAgICAgICByZXR1cm4gbmV3X2wxX3RhYmxlX29mZnNldDsKKyAgICB9CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19MMV9HUk9XX1dSSVRFX1RBQkxFKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5sMV9zaXplOyBpKyspCisgICAgICAgIG5ld19sMV90YWJsZVtpXSA9IGNwdV90b19iZTY0KG5ld19sMV90YWJsZVtpXSk7CisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgbmV3X2wxX3RhYmxlX29mZnNldCwgbmV3X2wxX3RhYmxlLCBuZXdfbDFfc2l6ZTIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bDFfc2l6ZTsgaSsrKQorICAgICAgICBuZXdfbDFfdGFibGVbaV0gPSBiZTY0X3RvX2NwdShuZXdfbDFfdGFibGVbaV0pOworCisgICAgLyogc2V0IG5ldyB0YWJsZSAqLworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0wxX0dST1dfQUNUSVZBVEVfVEFCTEUpOworICAgIGNwdV90b19iZTMydygodWludDMyX3QqKWRhdGEsIG5ld19sMV9zaXplKTsKKyAgICBjcHVfdG9fYmU2NHcoKHVpbnQ2NF90KikoZGF0YSArIDQpLCBuZXdfbDFfdGFibGVfb2Zmc2V0KTsKKyAgICByZXQgPSBiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLCBvZmZzZXRvZihRQ293SGVhZGVyLCBsMV9zaXplKSwgZGF0YSxzaXplb2YoZGF0YSkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgZ19mcmVlKHMtPmwxX3RhYmxlKTsKKyAgICBxY293Ml9mcmVlX2NsdXN0ZXJzKGJzLCBzLT5sMV90YWJsZV9vZmZzZXQsIHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBzLT5sMV90YWJsZV9vZmZzZXQgPSBuZXdfbDFfdGFibGVfb2Zmc2V0OworICAgIHMtPmwxX3RhYmxlID0gbmV3X2wxX3RhYmxlOworICAgIHMtPmwxX3NpemUgPSBuZXdfbDFfc2l6ZTsKKyAgICByZXR1cm4gMDsKKyBmYWlsOgorICAgIGdfZnJlZShuZXdfbDFfdGFibGUpOworICAgIHFjb3cyX2ZyZWVfY2x1c3RlcnMoYnMsIG5ld19sMV90YWJsZV9vZmZzZXQsIG5ld19sMV9zaXplMik7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBxY293Ml9sMl9jYWNoZV9yZXNldChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIG1lbXNldChzLT5sMl9jYWNoZSwgMCwgcy0+bDJfc2l6ZSAqIEwyX0NBQ0hFX1NJWkUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBtZW1zZXQocy0+bDJfY2FjaGVfb2Zmc2V0cywgMCwgTDJfQ0FDSEVfU0laRSAqIHNpemVvZih1aW50NjRfdCkpOworICAgIG1lbXNldChzLT5sMl9jYWNoZV9jb3VudHMsIDAsIEwyX0NBQ0hFX1NJWkUgKiBzaXplb2YodWludDMyX3QpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJfY2FjaGVfbmV3X2VudHJ5KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQzMl90IG1pbl9jb3VudDsKKyAgICBpbnQgbWluX2luZGV4LCBpOworCisgICAgLyogZmluZCBhIG5ldyBlbnRyeSBpbiB0aGUgbGVhc3QgdXNlZCBvbmUgKi8KKyAgICBtaW5faW5kZXggPSAwOworICAgIG1pbl9jb3VudCA9IDB4ZmZmZmZmZmY7CisgICAgZm9yKGkgPSAwOyBpIDwgTDJfQ0FDSEVfU0laRTsgaSsrKSB7CisgICAgICAgIGlmIChzLT5sMl9jYWNoZV9jb3VudHNbaV0gPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIG1pbl9jb3VudCA9IHMtPmwyX2NhY2hlX2NvdW50c1tpXTsKKyAgICAgICAgICAgIG1pbl9pbmRleCA9IGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1pbl9pbmRleDsKK30KKworLyoKKyAqIHNlZWtfbDJfdGFibGUKKyAqCisgKiBzZWVrIGwyX29mZnNldCBpbiB0aGUgbDJfY2FjaGUgdGFibGUKKyAqIGlmIG5vdCBmb3VuZCwgcmV0dXJuIE5VTEwsCisgKiBpZiBmb3VuZCwKKyAqICAgaW5jcmVtZW50cyB0aGUgbDIgY2FjaGUgaGl0IGNvdW50IG9mIHRoZSBlbnRyeSwKKyAqICAgaWYgY291bnRlciBvdmVyZmxvdywgZGl2aWRlIGJ5IHR3byBhbGwgY291bnRlcnMKKyAqICAgcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBsMiBjYWNoZSBlbnRyeQorICoKKyAqLworCitzdGF0aWMgdWludDY0X3QgKnNlZWtfbDJfdGFibGUoQkRSVlFjb3dTdGF0ZSAqcywgdWludDY0X3QgbDJfb2Zmc2V0KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yKGkgPSAwOyBpIDwgTDJfQ0FDSEVfU0laRTsgaSsrKSB7CisgICAgICAgIGlmIChsMl9vZmZzZXQgPT0gcy0+bDJfY2FjaGVfb2Zmc2V0c1tpXSkgeworICAgICAgICAgICAgLyogaW5jcmVtZW50IHRoZSBoaXQgY291bnQgKi8KKyAgICAgICAgICAgIGlmICgrK3MtPmwyX2NhY2hlX2NvdW50c1tpXSA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTDJfQ0FDSEVfU0laRTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmwyX2NhY2hlX2NvdW50c1tqXSA+Pj0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcy0+bDJfY2FjaGUgKyAoaSA8PCBzLT5sMl9iaXRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGwyX2xvYWQKKyAqCisgKiBMb2FkcyBhIEwyIHRhYmxlIGludG8gbWVtb3J5LiBJZiB0aGUgdGFibGUgaXMgaW4gdGhlIGNhY2hlLCB0aGUgY2FjaGUKKyAqIGlzIHVzZWQ7IG90aGVyd2lzZSB0aGUgTDIgdGFibGUgaXMgbG9hZGVkIGZyb20gdGhlIGltYWdlIGZpbGUuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEwyIHRhYmxlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgaWYgdGhlIHJlYWQgZnJvbQorICogdGhlIGltYWdlIGZpbGUgZmFpbGVkLgorICovCisKK3N0YXRpYyBpbnQgbDJfbG9hZChCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3QgbDJfb2Zmc2V0LAorICAgIHVpbnQ2NF90ICoqbDJfdGFibGUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IG1pbl9pbmRleDsKKyAgICBpbnQgcmV0OworCisgICAgLyogc2VlayBpZiB0aGUgdGFibGUgZm9yIHRoZSBnaXZlbiBvZmZzZXQgaXMgaW4gdGhlIGNhY2hlICovCisKKyAgICAqbDJfdGFibGUgPSBzZWVrX2wyX3RhYmxlKHMsIGwyX29mZnNldCk7CisgICAgaWYgKCpsMl90YWJsZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIG5vdCBmb3VuZDogbG9hZCBhIG5ldyBlbnRyeSBpbiB0aGUgbGVhc3QgdXNlZCBvbmUgKi8KKworICAgIG1pbl9pbmRleCA9IGwyX2NhY2hlX25ld19lbnRyeShicyk7CisgICAgKmwyX3RhYmxlID0gcy0+bDJfY2FjaGUgKyAobWluX2luZGV4IDw8IHMtPmwyX2JpdHMpOworCisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfTDJfTE9BRCk7CisgICAgcmV0ID0gYmRydl9wcmVhZChicy0+ZmlsZSwgbDJfb2Zmc2V0LCAqbDJfdGFibGUsCisgICAgICAgIHMtPmwyX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHMtPmwyX2NhY2hlX29mZnNldHNbbWluX2luZGV4XSA9IGwyX29mZnNldDsKKyAgICBzLT5sMl9jYWNoZV9jb3VudHNbbWluX2luZGV4XSA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlcyBvbmUgc2VjdG9yIG9mIHRoZSBMMSB0YWJsZSB0byB0aGUgZGlzayAoY2FuJ3QgdXBkYXRlIHNpbmdsZSBlbnRyaWVzCisgKiBhbmQgd2UgcmVhbGx5IGRvbid0IHdhbnQgYmRydl9wcmVhZCB0byBwZXJmb3JtIGEgcmVhZC1tb2RpZnktd3JpdGUpCisgKi8KKyNkZWZpbmUgTDFfRU5UUklFU19QRVJfU0VDVE9SICg1MTIgLyA4KQorc3RhdGljIGludCB3cml0ZV9sMV9lbnRyeShCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGwxX2luZGV4KQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQ2NF90IGJ1ZltMMV9FTlRSSUVTX1BFUl9TRUNUT1JdOworICAgIGludCBsMV9zdGFydF9pbmRleDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgbDFfc3RhcnRfaW5kZXggPSBsMV9pbmRleCAmIH4oTDFfRU5UUklFU19QRVJfU0VDVE9SIC0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IEwxX0VOVFJJRVNfUEVSX1NFQ1RPUjsgaSsrKSB7CisgICAgICAgIGJ1ZltpXSA9IGNwdV90b19iZTY0KHMtPmwxX3RhYmxlW2wxX3N0YXJ0X2luZGV4ICsgaV0pOworICAgIH0KKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0wxX1VQREFURSk7CisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgcy0+bDFfdGFibGVfb2Zmc2V0ICsgOCAqIGwxX3N0YXJ0X2luZGV4LAorICAgICAgICBidWYsIHNpemVvZihidWYpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogbDJfYWxsb2NhdGUKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyBsMiBlbnRyeSBpbiB0aGUgZmlsZS4gSWYgbDFfaW5kZXggcG9pbnRzIHRvIGFuIGFscmVhZHkKKyAqIHVzZWQgZW50cnkgaW4gdGhlIEwyIHRhYmxlIChpLmUuIHdlIGFyZSBkb2luZyBhIGNvcHkgb24gd3JpdGUgZm9yIHRoZSBMMgorICogdGFibGUpIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBvbGQgTDIgdGFibGUgaW50byB0aGUgbmV3bHkgYWxsb2NhdGVkIG9uZS4KKyAqIE90aGVyd2lzZSB0aGUgbmV3IHRhYmxlIGlzIGluaXRpYWxpemVkIHdpdGggemVyb3MuCisgKgorICovCisKK3N0YXRpYyBpbnQgbDJfYWxsb2NhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBsMV9pbmRleCwgdWludDY0X3QgKip0YWJsZSkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgbWluX2luZGV4OworICAgIHVpbnQ2NF90IG9sZF9sMl9vZmZzZXQ7CisgICAgdWludDY0X3QgKmwyX3RhYmxlOworICAgIGludDY0X3QgbDJfb2Zmc2V0OworICAgIGludCByZXQ7CisKKyAgICBvbGRfbDJfb2Zmc2V0ID0gcy0+bDFfdGFibGVbbDFfaW5kZXhdOworCisgICAgLyogYWxsb2NhdGUgYSBuZXcgbDIgZW50cnkgKi8KKworICAgIGwyX29mZnNldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJzKGJzLCBzLT5sMl9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgaWYgKGwyX29mZnNldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGwyX29mZnNldDsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgbDIgY2FjaGUgKi8KKworICAgIG1pbl9pbmRleCA9IGwyX2NhY2hlX25ld19lbnRyeShicyk7CisgICAgbDJfdGFibGUgPSBzLT5sMl9jYWNoZSArIChtaW5faW5kZXggPDwgcy0+bDJfYml0cyk7CisKKyAgICBpZiAob2xkX2wyX29mZnNldCA9PSAwKSB7CisgICAgICAgIC8qIGlmIHRoZXJlIHdhcyBubyBvbGQgbDIgdGFibGUsIGNsZWFyIHRoZSBuZXcgdGFibGUgKi8KKyAgICAgICAgbWVtc2V0KGwyX3RhYmxlLCAwLCBzLT5sMl9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaWYgdGhlcmUgd2FzIGFuIG9sZCBsMiB0YWJsZSwgcmVhZCBpdCBmcm9tIHRoZSBkaXNrICovCisgICAgICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0wyX0FMTE9DX0NPV19SRUFEKTsKKyAgICAgICAgcmV0ID0gYmRydl9wcmVhZChicy0+ZmlsZSwgb2xkX2wyX29mZnNldCwgbDJfdGFibGUsCisgICAgICAgICAgICBzLT5sMl9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogd3JpdGUgdGhlIGwyIHRhYmxlIHRvIHRoZSBmaWxlICovCisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfTDJfQUxMT0NfV1JJVEUpOworICAgIHJldCA9IGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIGwyX29mZnNldCwgbDJfdGFibGUsCisgICAgICAgIHMtPmwyX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogdXBkYXRlIHRoZSBMMSBlbnRyeSAqLworICAgIHMtPmwxX3RhYmxlW2wxX2luZGV4XSA9IGwyX29mZnNldCB8IFFDT1dfT0ZMQUdfQ09QSUVEOworICAgIHJldCA9IHdyaXRlX2wxX2VudHJ5KGJzLCBsMV9pbmRleCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIHVwZGF0ZSB0aGUgbDIgY2FjaGUgZW50cnkgKi8KKworICAgIHMtPmwyX2NhY2hlX29mZnNldHNbbWluX2luZGV4XSA9IGwyX29mZnNldDsKKyAgICBzLT5sMl9jYWNoZV9jb3VudHNbbWluX2luZGV4XSA9IDE7CisKKyAgICAqdGFibGUgPSBsMl90YWJsZTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBzLT5sMV90YWJsZVtsMV9pbmRleF0gPSBvbGRfbDJfb2Zmc2V0OworICAgIHFjb3cyX2wyX2NhY2hlX3Jlc2V0KGJzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvdW50X2NvbnRpZ3VvdXNfY2x1c3RlcnModWludDY0X3QgbmJfY2x1c3RlcnMsIGludCBjbHVzdGVyX3NpemUsCisgICAgICAgIHVpbnQ2NF90ICpsMl90YWJsZSwgdWludDY0X3Qgc3RhcnQsIHVpbnQ2NF90IG1hc2spCit7CisgICAgaW50IGk7CisgICAgdWludDY0X3Qgb2Zmc2V0ID0gYmU2NF90b19jcHUobDJfdGFibGVbMF0pICYgfm1hc2s7CisKKyAgICBpZiAoIW9mZnNldCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbmJfY2x1c3RlcnM7IGkrKykKKyAgICAgICAgaWYgKG9mZnNldCArICh1aW50NjRfdCkgaSAqIGNsdXN0ZXJfc2l6ZSAhPSAoYmU2NF90b19jcHUobDJfdGFibGVbaV0pICYgfm1hc2spKQorICAgICAgICAgICAgYnJlYWs7CisKKwlyZXR1cm4gKGkgLSBzdGFydCk7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfY29udGlndW91c19mcmVlX2NsdXN0ZXJzKHVpbnQ2NF90IG5iX2NsdXN0ZXJzLCB1aW50NjRfdCAqbDJfdGFibGUpCit7CisgICAgaW50IGkgPSAwOworCisgICAgd2hpbGUobmJfY2x1c3RlcnMtLSAmJiBsMl90YWJsZVtpXSA9PSAwKQorICAgICAgICBpKys7CisKKyAgICByZXR1cm4gaTsKK30KKworLyogVGhlIGNyeXB0IGZ1bmN0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgbGludXggY3J5cHRvbG9vcAorICAgYWxnb3JpdGhtIGZvciA8IDQgR0IgaW1hZ2VzLiBOT1RFOiBvdXRfYnVmID09IGluX2J1ZiBpcworICAgc3VwcG9ydGVkICovCit2b2lkIHFjb3cyX2VuY3J5cHRfc2VjdG9ycyhCRFJWUWNvd1N0YXRlICpzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXRfYnVmLCBjb25zdCB1aW50OF90ICppbl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2VjdG9ycywgaW50IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFFU19LRVkgKmtleSkKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGxsWzJdOworICAgICAgICB1aW50OF90IGJbMTZdOworICAgIH0gaXZlYzsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IG5iX3NlY3RvcnM7IGkrKykgeworICAgICAgICBpdmVjLmxsWzBdID0gY3B1X3RvX2xlNjQoc2VjdG9yX251bSk7CisgICAgICAgIGl2ZWMubGxbMV0gPSAwOworICAgICAgICBBRVNfY2JjX2VuY3J5cHQoaW5fYnVmLCBvdXRfYnVmLCA1MTIsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl2ZWMuYiwgZW5jKTsKKyAgICAgICAgc2VjdG9yX251bSsrOworICAgICAgICBpbl9idWYgKz0gNTEyOworICAgICAgICBvdXRfYnVmICs9IDUxMjsKKyAgICB9Cit9CisKKworc3RhdGljIGludCBxY293X3JlYWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHJldCwgaW5kZXhfaW5fY2x1c3RlciwgbiwgbjE7CisgICAgdWludDY0X3QgY2x1c3Rlcl9vZmZzZXQ7CisKKyAgICB3aGlsZSAobmJfc2VjdG9ycyA+IDApIHsKKyAgICAgICAgbiA9IG5iX3NlY3RvcnM7CisKKyAgICAgICAgcmV0ID0gcWNvdzJfZ2V0X2NsdXN0ZXJfb2Zmc2V0KGJzLCBzZWN0b3JfbnVtIDw8IDksICZuLAorICAgICAgICAgICAgJmNsdXN0ZXJfb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpbmRleF9pbl9jbHVzdGVyID0gc2VjdG9yX251bSAmIChzLT5jbHVzdGVyX3NlY3RvcnMgLSAxKTsKKyAgICAgICAgaWYgKCFjbHVzdGVyX29mZnNldCkgeworICAgICAgICAgICAgaWYgKGJzLT5iYWNraW5nX2hkKSB7CisgICAgICAgICAgICAgICAgLyogcmVhZCBmcm9tIHRoZSBiYXNlIGltYWdlICovCisgICAgICAgICAgICAgICAgbjEgPSBxY293Ml9iYWNraW5nX3JlYWQxKGJzLT5iYWNraW5nX2hkLCBzZWN0b3JfbnVtLCBidWYsIG4pOworICAgICAgICAgICAgICAgIGlmIChuMSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVBRF9CQUNLSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYmRydl9yZWFkKGJzLT5iYWNraW5nX2hkLCBzZWN0b3JfbnVtLCBidWYsIG4xKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCA1MTIgKiBuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyX29mZnNldCAmIFFDT1dfT0ZMQUdfQ09NUFJFU1NFRCkgeworICAgICAgICAgICAgaWYgKHFjb3cyX2RlY29tcHJlc3NfY2x1c3RlcihicywgY2x1c3Rlcl9vZmZzZXQpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1jcHkoYnVmLCBzLT5jbHVzdGVyX2NhY2hlICsgaW5kZXhfaW5fY2x1c3RlciAqIDUxMiwgNTEyICogbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUFEKTsKKyAgICAgICAgICAgIHJldCA9IGJkcnZfcHJlYWQoYnMtPmZpbGUsIGNsdXN0ZXJfb2Zmc2V0ICsgaW5kZXhfaW5fY2x1c3RlciAqIDUxMiwgYnVmLCBuICogNTEyKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gbiAqIDUxMikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAocy0+Y3J5cHRfbWV0aG9kKSB7CisgICAgICAgICAgICAgICAgcWNvdzJfZW5jcnlwdF9zZWN0b3JzKHMsIHNlY3Rvcl9udW0sIGJ1ZiwgYnVmLCBuLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+YWVzX2RlY3J5cHRfa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuYl9zZWN0b3JzIC09IG47CisgICAgICAgIHNlY3Rvcl9udW0gKz0gbjsKKyAgICAgICAgYnVmICs9IG4gKiA1MTI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfc2VjdG9ycyhCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3Qgc3RhcnRfc2VjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNsdXN0ZXJfb2Zmc2V0LCBpbnQgbl9zdGFydCwgaW50IG5fZW5kKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBuLCByZXQ7CisKKyAgICBuID0gbl9lbmQgLSBuX3N0YXJ0OworICAgIGlmIChuIDw9IDApCisgICAgICAgIHJldHVybiAwOworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0NPV19SRUFEKTsKKyAgICByZXQgPSBxY293X3JlYWQoYnMsIHN0YXJ0X3NlY3QgKyBuX3N0YXJ0LCBzLT5jbHVzdGVyX2RhdGEsIG4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChzLT5jcnlwdF9tZXRob2QpIHsKKyAgICAgICAgcWNvdzJfZW5jcnlwdF9zZWN0b3JzKHMsIHN0YXJ0X3NlY3QgKyBuX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2x1c3Rlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2x1c3Rlcl9kYXRhLCBuLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmFlc19lbmNyeXB0X2tleSk7CisgICAgfQorICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0NPV19XUklURSk7CisgICAgcmV0ID0gYmRydl93cml0ZV9zeW5jKGJzLT5maWxlLCAoY2x1c3Rlcl9vZmZzZXQgPj4gOSkgKyBuX3N0YXJ0LAorICAgICAgICBzLT5jbHVzdGVyX2RhdGEsIG4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiBnZXRfY2x1c3Rlcl9vZmZzZXQKKyAqCisgKiBGb3IgYSBnaXZlbiBvZmZzZXQgb2YgdGhlIGRpc2sgaW1hZ2UsIGZpbmQgdGhlIGNsdXN0ZXIgb2Zmc2V0IGluCisgKiBxY293MiBmaWxlLiBUaGUgb2Zmc2V0IGlzIHN0b3JlZCBpbiAqY2x1c3Rlcl9vZmZzZXQuCisgKgorICogb24gZW50cnksICpudW0gaXMgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGNsdXN0ZXJzIHdlJ2QgbGlrZSB0bworICogYWNjZXNzIGZvbGxvd2luZyBvZmZzZXQuCisgKgorICogb24gZXhpdCwgKm51bSBpcyB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgY2x1c3RlcnMgd2UgY2FuIHJlYWQuCisgKgorICogUmV0dXJuIDAsIGlmIHRoZSBvZmZzZXQgaXMgZm91bmQKKyAqIFJldHVybiAtZXJybm8sIG90aGVyd2lzZS4KKyAqCisgKi8KKworaW50IHFjb3cyX2dldF9jbHVzdGVyX29mZnNldChCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3Qgb2Zmc2V0LAorICAgIGludCAqbnVtLCB1aW50NjRfdCAqY2x1c3Rlcl9vZmZzZXQpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgdW5zaWduZWQgaW50IGwxX2luZGV4LCBsMl9pbmRleDsKKyAgICB1aW50NjRfdCBsMl9vZmZzZXQsICpsMl90YWJsZTsKKyAgICBpbnQgbDFfYml0cywgYzsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXhfaW5fY2x1c3RlciwgbmJfY2x1c3RlcnM7CisgICAgdWludDY0X3QgbmJfYXZhaWxhYmxlLCBuYl9uZWVkZWQ7CisgICAgaW50IHJldDsKKworICAgIGluZGV4X2luX2NsdXN0ZXIgPSAob2Zmc2V0ID4+IDkpICYgKHMtPmNsdXN0ZXJfc2VjdG9ycyAtIDEpOworICAgIG5iX25lZWRlZCA9ICpudW0gKyBpbmRleF9pbl9jbHVzdGVyOworCisgICAgbDFfYml0cyA9IHMtPmwyX2JpdHMgKyBzLT5jbHVzdGVyX2JpdHM7CisKKyAgICAvKiBjb21wdXRlIGhvdyBtYW55IGJ5dGVzIHRoZXJlIGFyZSBiZXR3ZWVuIHRoZSBvZmZzZXQgYW5kCisgICAgICogdGhlIGVuZCBvZiB0aGUgbDEgZW50cnkKKyAgICAgKi8KKworICAgIG5iX2F2YWlsYWJsZSA9ICgxVUxMIDw8IGwxX2JpdHMpIC0gKG9mZnNldCAmICgoMVVMTCA8PCBsMV9iaXRzKSAtIDEpKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgc2VjdG9ycyAqLworCisgICAgbmJfYXZhaWxhYmxlID0gKG5iX2F2YWlsYWJsZSA+PiA5KSArIGluZGV4X2luX2NsdXN0ZXI7CisKKyAgICBpZiAobmJfbmVlZGVkID4gbmJfYXZhaWxhYmxlKSB7CisgICAgICAgIG5iX25lZWRlZCA9IG5iX2F2YWlsYWJsZTsKKyAgICB9CisKKyAgICAqY2x1c3Rlcl9vZmZzZXQgPSAwOworCisgICAgLyogc2VlayB0aGUgdGhlIGwyIG9mZnNldCBpbiB0aGUgbDEgdGFibGUgKi8KKworICAgIGwxX2luZGV4ID0gb2Zmc2V0ID4+IGwxX2JpdHM7CisgICAgaWYgKGwxX2luZGV4ID49IHMtPmwxX3NpemUpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgbDJfb2Zmc2V0ID0gcy0+bDFfdGFibGVbbDFfaW5kZXhdOworCisgICAgLyogc2VlayB0aGUgbDIgdGFibGUgb2YgdGhlIGdpdmVuIGwyIG9mZnNldCAqLworCisgICAgaWYgKCFsMl9vZmZzZXQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgLyogbG9hZCB0aGUgbDIgdGFibGUgaW4gbWVtb3J5ICovCisKKyAgICBsMl9vZmZzZXQgJj0gflFDT1dfT0ZMQUdfQ09QSUVEOworICAgIHJldCA9IGwyX2xvYWQoYnMsIGwyX29mZnNldCwgJmwyX3RhYmxlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGZpbmQgdGhlIGNsdXN0ZXIgb2Zmc2V0IGZvciB0aGUgZ2l2ZW4gZGlzayBvZmZzZXQgKi8KKworICAgIGwyX2luZGV4ID0gKG9mZnNldCA+PiBzLT5jbHVzdGVyX2JpdHMpICYgKHMtPmwyX3NpemUgLSAxKTsKKyAgICAqY2x1c3Rlcl9vZmZzZXQgPSBiZTY0X3RvX2NwdShsMl90YWJsZVtsMl9pbmRleF0pOworICAgIG5iX2NsdXN0ZXJzID0gc2l6ZV90b19jbHVzdGVycyhzLCBuYl9uZWVkZWQgPDwgOSk7CisKKyAgICBpZiAoISpjbHVzdGVyX29mZnNldCkgeworICAgICAgICAvKiBob3cgbWFueSBlbXB0eSBjbHVzdGVycyA/ICovCisgICAgICAgIGMgPSBjb3VudF9jb250aWd1b3VzX2ZyZWVfY2x1c3RlcnMobmJfY2x1c3RlcnMsICZsMl90YWJsZVtsMl9pbmRleF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGhvdyBtYW55IGFsbG9jYXRlZCBjbHVzdGVycyA/ICovCisgICAgICAgIGMgPSBjb3VudF9jb250aWd1b3VzX2NsdXN0ZXJzKG5iX2NsdXN0ZXJzLCBzLT5jbHVzdGVyX3NpemUsCisgICAgICAgICAgICAgICAgJmwyX3RhYmxlW2wyX2luZGV4XSwgMCwgUUNPV19PRkxBR19DT1BJRUQpOworICAgIH0KKworICAgbmJfYXZhaWxhYmxlID0gKGMgKiBzLT5jbHVzdGVyX3NlY3RvcnMpOworb3V0OgorICAgIGlmIChuYl9hdmFpbGFibGUgPiBuYl9uZWVkZWQpCisgICAgICAgIG5iX2F2YWlsYWJsZSA9IG5iX25lZWRlZDsKKworICAgICpudW0gPSBuYl9hdmFpbGFibGUgLSBpbmRleF9pbl9jbHVzdGVyOworCisgICAgKmNsdXN0ZXJfb2Zmc2V0ICY9flFDT1dfT0ZMQUdfQ09QSUVEOworICAgIHJldHVybiAwOworfQorCisvKgorICogZ2V0X2NsdXN0ZXJfdGFibGUKKyAqCisgKiBmb3IgYSBnaXZlbiBkaXNrIG9mZnNldCwgbG9hZCAoYW5kIGFsbG9jYXRlIGlmIG5lZWRlZCkKKyAqIHRoZSBsMiB0YWJsZS4KKyAqCisgKiB0aGUgbDIgdGFibGUgb2Zmc2V0IGluIHRoZSBxY293MiBmaWxlIGFuZCB0aGUgY2x1c3RlciBpbmRleAorICogaW4gdGhlIGwyIHRhYmxlIGFyZSBnaXZlbiB0byB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gaW4gZmFpbHVyZSBjYXNlCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2NsdXN0ZXJfdGFibGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKipuZXdfbDJfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICpuZXdfbDJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm5ld19sMl9pbmRleCkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICB1bnNpZ25lZCBpbnQgbDFfaW5kZXgsIGwyX2luZGV4OworICAgIHVpbnQ2NF90IGwyX29mZnNldDsKKyAgICB1aW50NjRfdCAqbDJfdGFibGUgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICAvKiBzZWVrIHRoZSB0aGUgbDIgb2Zmc2V0IGluIHRoZSBsMSB0YWJsZSAqLworCisgICAgbDFfaW5kZXggPSBvZmZzZXQgPj4gKHMtPmwyX2JpdHMgKyBzLT5jbHVzdGVyX2JpdHMpOworICAgIGlmIChsMV9pbmRleCA+PSBzLT5sMV9zaXplKSB7CisgICAgICAgIHJldCA9IHFjb3cyX2dyb3dfbDFfdGFibGUoYnMsIGwxX2luZGV4ICsgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIGwyX29mZnNldCA9IHMtPmwxX3RhYmxlW2wxX2luZGV4XTsKKworICAgIC8qIHNlZWsgdGhlIGwyIHRhYmxlIG9mIHRoZSBnaXZlbiBsMiBvZmZzZXQgKi8KKworICAgIGlmIChsMl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPUElFRCkgeworICAgICAgICAvKiBsb2FkIHRoZSBsMiB0YWJsZSBpbiBtZW1vcnkgKi8KKyAgICAgICAgbDJfb2Zmc2V0ICY9IH5RQ09XX09GTEFHX0NPUElFRDsKKyAgICAgICAgcmV0ID0gbDJfbG9hZChicywgbDJfb2Zmc2V0LCAmbDJfdGFibGUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsMl9vZmZzZXQpCisgICAgICAgICAgICBxY293Ml9mcmVlX2NsdXN0ZXJzKGJzLCBsMl9vZmZzZXQsIHMtPmwyX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgcmV0ID0gbDJfYWxsb2NhdGUoYnMsIGwxX2luZGV4LCAmbDJfdGFibGUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBsMl9vZmZzZXQgPSBzLT5sMV90YWJsZVtsMV9pbmRleF0gJiB+UUNPV19PRkxBR19DT1BJRUQ7CisgICAgfQorCisgICAgLyogZmluZCB0aGUgY2x1c3RlciBvZmZzZXQgZm9yIHRoZSBnaXZlbiBkaXNrIG9mZnNldCAqLworCisgICAgbDJfaW5kZXggPSAob2Zmc2V0ID4+IHMtPmNsdXN0ZXJfYml0cykgJiAocy0+bDJfc2l6ZSAtIDEpOworCisgICAgKm5ld19sMl90YWJsZSA9IGwyX3RhYmxlOworICAgICpuZXdfbDJfb2Zmc2V0ID0gbDJfb2Zmc2V0OworICAgICpuZXdfbDJfaW5kZXggPSBsMl9pbmRleDsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogYWxsb2NfY29tcHJlc3NlZF9jbHVzdGVyX29mZnNldAorICoKKyAqIEZvciBhIGdpdmVuIG9mZnNldCBvZiB0aGUgZGlzayBpbWFnZSwgcmV0dXJuIGNsdXN0ZXIgb2Zmc2V0IGluCisgKiBxY293MiBmaWxlLgorICoKKyAqIElmIHRoZSBvZmZzZXQgaXMgbm90IGZvdW5kLCBhbGxvY2F0ZSBhIG5ldyBjb21wcmVzc2VkIGNsdXN0ZXIuCisgKgorICogUmV0dXJuIHRoZSBjbHVzdGVyIG9mZnNldCBpZiBzdWNjZXNzZnVsLAorICogUmV0dXJuIDAsIG90aGVyd2lzZS4KKyAqCisgKi8KKwordWludDY0X3QgcWNvdzJfYWxsb2NfY29tcHJlc3NlZF9jbHVzdGVyX29mZnNldChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3NlZF9zaXplKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBsMl9pbmRleCwgcmV0OworICAgIHVpbnQ2NF90IGwyX29mZnNldCwgKmwyX3RhYmxlOworICAgIGludDY0X3QgY2x1c3Rlcl9vZmZzZXQ7CisgICAgaW50IG5iX2NzZWN0b3JzOworCisgICAgcmV0ID0gZ2V0X2NsdXN0ZXJfdGFibGUoYnMsIG9mZnNldCwgJmwyX3RhYmxlLCAmbDJfb2Zmc2V0LCAmbDJfaW5kZXgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNsdXN0ZXJfb2Zmc2V0ID0gYmU2NF90b19jcHUobDJfdGFibGVbbDJfaW5kZXhdKTsKKyAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPUElFRCkKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJfb2Zmc2V0ICYgflFDT1dfT0ZMQUdfQ09QSUVEOworCisgICAgaWYgKGNsdXN0ZXJfb2Zmc2V0KQorICAgICAgICBxY293Ml9mcmVlX2FueV9jbHVzdGVycyhicywgY2x1c3Rlcl9vZmZzZXQsIDEpOworCisgICAgY2x1c3Rlcl9vZmZzZXQgPSBxY293Ml9hbGxvY19ieXRlcyhicywgY29tcHJlc3NlZF9zaXplKTsKKyAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5iX2NzZWN0b3JzID0gKChjbHVzdGVyX29mZnNldCArIGNvbXByZXNzZWRfc2l6ZSAtIDEpID4+IDkpIC0KKyAgICAgICAgICAgICAgICAgIChjbHVzdGVyX29mZnNldCA+PiA5KTsKKworICAgIGNsdXN0ZXJfb2Zmc2V0IHw9IFFDT1dfT0ZMQUdfQ09NUFJFU1NFRCB8CisgICAgICAgICAgICAgICAgICAgICAgKCh1aW50NjRfdCluYl9jc2VjdG9ycyA8PCBzLT5jc2l6ZV9zaGlmdCk7CisKKyAgICAvKiB1cGRhdGUgTDIgdGFibGUgKi8KKworICAgIC8qIGNvbXByZXNzZWQgY2x1c3RlcnMgbmV2ZXIgaGF2ZSB0aGUgY29waWVkIGZsYWcgKi8KKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0wyX1VQREFURV9DT01QUkVTU0VEKTsKKyAgICBsMl90YWJsZVtsMl9pbmRleF0gPSBjcHVfdG9fYmU2NChjbHVzdGVyX29mZnNldCk7CisgICAgaWYgKGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsCisgICAgICAgICAgICAgICAgICAgIGwyX29mZnNldCArIGwyX2luZGV4ICogc2l6ZW9mKHVpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICAgbDJfdGFibGUgKyBsMl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ2NF90KSkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjbHVzdGVyX29mZnNldDsKK30KKworLyoKKyAqIFdyaXRlIEwyIHRhYmxlIHVwZGF0ZXMgdG8gZGlzaywgd3JpdGluZyB3aG9sZSBzZWN0b3JzIHRvIGF2b2lkIGEKKyAqIHJlYWQtbW9kaWZ5LXdyaXRlIGluIGJkcnZfcHdyaXRlCisgKi8KKyNkZWZpbmUgTDJfRU5UUklFU19QRVJfU0VDVE9SICg1MTIgLyA4KQorc3RhdGljIGludCB3cml0ZV9sMl9lbnRyaWVzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50NjRfdCAqbDJfdGFibGUsCisgICAgdWludDY0X3QgbDJfb2Zmc2V0LCBpbnQgbDJfaW5kZXgsIGludCBudW0pCit7CisgICAgaW50IGwyX3N0YXJ0X2luZGV4ID0gbDJfaW5kZXggJiB+KEwxX0VOVFJJRVNfUEVSX1NFQ1RPUiAtIDEpOworICAgIGludCBzdGFydF9vZmZzZXQgPSAoOCAqIGwyX2luZGV4KSAmIH41MTE7CisgICAgaW50IGVuZF9vZmZzZXQgPSAoOCAqIChsMl9pbmRleCArIG51bSkgKyA1MTEpICYgfjUxMTsKKyAgICBzaXplX3QgbGVuID0gZW5kX29mZnNldCAtIHN0YXJ0X29mZnNldDsKKyAgICBpbnQgcmV0OworCisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfTDJfVVBEQVRFKTsKKyAgICByZXQgPSBiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLCBsMl9vZmZzZXQgKyBzdGFydF9vZmZzZXQsCisgICAgICAgICZsMl90YWJsZVtsMl9zdGFydF9pbmRleF0sIGxlbik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHFjb3cyX2FsbG9jX2NsdXN0ZXJfbGlua19sMihCbG9ja0RyaXZlclN0YXRlICpicywgUUNvd0wyTWV0YSAqbSkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgaSwgaiA9IDAsIGwyX2luZGV4LCByZXQ7CisgICAgdWludDY0X3QgKm9sZF9jbHVzdGVyLCBzdGFydF9zZWN0LCBsMl9vZmZzZXQsICpsMl90YWJsZTsKKyAgICB1aW50NjRfdCBjbHVzdGVyX29mZnNldCA9IG0tPmNsdXN0ZXJfb2Zmc2V0OworCisgICAgaWYgKG0tPm5iX2NsdXN0ZXJzID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgb2xkX2NsdXN0ZXIgPSBnX21hbGxvYyhtLT5uYl9jbHVzdGVycyAqIHNpemVvZih1aW50NjRfdCkpOworCisgICAgLyogY29weSBjb250ZW50IG9mIHVubW9kaWZpZWQgc2VjdG9ycyAqLworICAgIHN0YXJ0X3NlY3QgPSAobS0+b2Zmc2V0ICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gOTsKKyAgICBpZiAobS0+bl9zdGFydCkgeworICAgICAgICByZXQgPSBjb3B5X3NlY3RvcnMoYnMsIHN0YXJ0X3NlY3QsIGNsdXN0ZXJfb2Zmc2V0LCAwLCBtLT5uX3N0YXJ0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAobS0+bmJfYXZhaWxhYmxlICYgKHMtPmNsdXN0ZXJfc2VjdG9ycyAtIDEpKSB7CisgICAgICAgIHVpbnQ2NF90IGVuZCA9IG0tPm5iX2F2YWlsYWJsZSAmIH4odWludDY0X3QpKHMtPmNsdXN0ZXJfc2VjdG9ycyAtIDEpOworICAgICAgICByZXQgPSBjb3B5X3NlY3RvcnMoYnMsIHN0YXJ0X3NlY3QgKyBlbmQsIGNsdXN0ZXJfb2Zmc2V0ICsgKGVuZCA8PCA5KSwKKyAgICAgICAgICAgICAgICBtLT5uYl9hdmFpbGFibGUgLSBlbmQsIHMtPmNsdXN0ZXJfc2VjdG9ycyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogdXBkYXRlIEwyIHRhYmxlICovCisgICAgcmV0ID0gZ2V0X2NsdXN0ZXJfdGFibGUoYnMsIG0tPm9mZnNldCwgJmwyX3RhYmxlLCAmbDJfb2Zmc2V0LCAmbDJfaW5kZXgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtLT5uYl9jbHVzdGVyczsgaSsrKSB7CisgICAgICAgIC8qIGlmIHR3byBjb25jdXJyZW50IHdyaXRlcyBoYXBwZW4gdG8gdGhlIHNhbWUgdW5hbGxvY2F0ZWQgY2x1c3RlcgorCSAqIGVhY2ggd3JpdGUgYWxsb2NhdGVzIHNlcGFyYXRlIGNsdXN0ZXIgYW5kIHdyaXRlcyBkYXRhIGNvbmN1cnJlbnRseS4KKwkgKiBUaGUgZmlyc3Qgb25lIHRvIGNvbXBsZXRlIHVwZGF0ZXMgbDIgdGFibGUgd2l0aCBwb2ludGVyIHRvIGl0cworCSAqIGNsdXN0ZXIgdGhlIHNlY29uZCBvbmUgaGFzIHRvIGRvIFJNVyAod2hpY2ggaXMgZG9uZSBhYm92ZSBieQorCSAqIGNvcHlfc2VjdG9ycygpKSwgdXBkYXRlIGwyIHRhYmxlIHdpdGggaXRzIGNsdXN0ZXIgcG9pbnRlciBhbmQgZnJlZQorCSAqIG9sZCBjbHVzdGVyLiBUaGlzIGlzIHdoYXQgdGhpcyBsb29wIGRvZXMgKi8KKyAgICAgICAgaWYobDJfdGFibGVbbDJfaW5kZXggKyBpXSAhPSAwKQorICAgICAgICAgICAgb2xkX2NsdXN0ZXJbaisrXSA9IGwyX3RhYmxlW2wyX2luZGV4ICsgaV07CisKKyAgICAgICAgbDJfdGFibGVbbDJfaW5kZXggKyBpXSA9IGNwdV90b19iZTY0KChjbHVzdGVyX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgIChpIDw8IHMtPmNsdXN0ZXJfYml0cykpIHwgUUNPV19PRkxBR19DT1BJRUQpOworICAgICB9CisKKyAgICByZXQgPSB3cml0ZV9sMl9lbnRyaWVzKGJzLCBsMl90YWJsZSwgbDJfb2Zmc2V0LCBsMl9pbmRleCwgbS0+bmJfY2x1c3RlcnMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHFjb3cyX2wyX2NhY2hlX3Jlc2V0KGJzKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykKKyAgICAgICAgcWNvdzJfZnJlZV9hbnlfY2x1c3RlcnMoYnMsCisgICAgICAgICAgICBiZTY0X3RvX2NwdShvbGRfY2x1c3RlcltpXSkgJiB+UUNPV19PRkxBR19DT1BJRUQsIDEpOworCisgICAgcmV0ID0gMDsKK2VycjoKKyAgICBnX2ZyZWUob2xkX2NsdXN0ZXIpOworICAgIHJldHVybiByZXQ7CisgfQorCisvKgorICogYWxsb2NfY2x1c3Rlcl9vZmZzZXQKKyAqCisgKiBGb3IgYSBnaXZlbiBvZmZzZXQgb2YgdGhlIGRpc2sgaW1hZ2UsIHJldHVybiBjbHVzdGVyIG9mZnNldCBpbiBxY293MiBmaWxlLgorICogSWYgdGhlIG9mZnNldCBpcyBub3QgZm91bmQsIGFsbG9jYXRlIGEgbmV3IGNsdXN0ZXIuCisgKgorICogSWYgdGhlIGNsdXN0ZXIgd2FzIGFscmVhZHkgYWxsb2NhdGVkLCBtLT5uYl9jbHVzdGVycyBpcyBzZXQgdG8gMCwKKyAqIG0tPmRlcGVuZHNfb24gaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBvdGhlciBmaWVsZHMgaW4gbSBhcmUgbWVhbmluZ2xlc3MuCisgKgorICogSWYgdGhlIGNsdXN0ZXIgaXMgbmV3bHkgYWxsb2NhdGVkLCBtLT5uYl9jbHVzdGVycyBpcyBzZXQgdG8gdGhlIG51bWJlciBvZgorICogY29udGlndW91cyBjbHVzdGVycyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQuIFRoaXMgbWF5IGJlIDAgaWYgdGhlIHJlcXVlc3QKKyAqIGNvbmZsaWN0IHdpdGggYW5vdGhlciB3cml0ZSByZXF1ZXN0IGluIGZsaWdodDsgaW4gdGhpcyBjYXNlLCBtLT5kZXBlbmRzX29uCisgKiBpcyBzZXQgYW5kIHRoZSByZW1haW5pbmcgZmllbGRzIG9mIG0gYXJlIG1lYW5pbmdsZXNzLgorICoKKyAqIElmIG0tPm5iX2NsdXN0ZXJzIGlzIG5vbi16ZXJvLCB0aGUgb3RoZXIgZmllbGRzIG9mIG0gYXJlIHZhbGlkIGFuZCBjb250YWluCisgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlyc3QgYWxsb2NhdGVkIGNsdXN0ZXIuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIGluIGVycm9yIGNhc2VzCisgKi8KK2ludCBxY293Ml9hbGxvY19jbHVzdGVyX29mZnNldChCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3Qgb2Zmc2V0LAorICAgIGludCBuX3N0YXJ0LCBpbnQgbl9lbmQsIGludCAqbnVtLCBRQ293TDJNZXRhICptKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBsMl9pbmRleCwgcmV0OworICAgIHVpbnQ2NF90IGwyX29mZnNldCwgKmwyX3RhYmxlOworICAgIGludDY0X3QgY2x1c3Rlcl9vZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IG5iX2NsdXN0ZXJzLCBpID0gMDsKKyAgICBRQ293TDJNZXRhICpvbGRfYWxsb2M7CisKKyAgICByZXQgPSBnZXRfY2x1c3Rlcl90YWJsZShicywgb2Zmc2V0LCAmbDJfdGFibGUsICZsMl9vZmZzZXQsICZsMl9pbmRleCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBuYl9jbHVzdGVycyA9IHNpemVfdG9fY2x1c3RlcnMocywgbl9lbmQgPDwgOSk7CisKKyAgICBuYl9jbHVzdGVycyA9IE1JTihuYl9jbHVzdGVycywgcy0+bDJfc2l6ZSAtIGwyX2luZGV4KTsKKworICAgIGNsdXN0ZXJfb2Zmc2V0ID0gYmU2NF90b19jcHUobDJfdGFibGVbbDJfaW5kZXhdKTsKKworICAgIC8qIFdlIGtlZXAgYWxsIFFDT1dfT0ZMQUdfQ09QSUVEIGNsdXN0ZXJzICovCisKKyAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPUElFRCkgeworICAgICAgICBuYl9jbHVzdGVycyA9IGNvdW50X2NvbnRpZ3VvdXNfY2x1c3RlcnMobmJfY2x1c3RlcnMsIHMtPmNsdXN0ZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAmbDJfdGFibGVbbDJfaW5kZXhdLCAwLCAwKTsKKworICAgICAgICBjbHVzdGVyX29mZnNldCAmPSB+UUNPV19PRkxBR19DT1BJRUQ7CisgICAgICAgIG0tPm5iX2NsdXN0ZXJzID0gMDsKKyAgICAgICAgbS0+ZGVwZW5kc19vbiA9IE5VTEw7CisKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogZm9yIHRoZSBtb21lbnQsIG11bHRpcGxlIGNvbXByZXNzZWQgY2x1c3RlcnMgYXJlIG5vdCBtYW5hZ2VkICovCisKKyAgICBpZiAoY2x1c3Rlcl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPTVBSRVNTRUQpCisgICAgICAgIG5iX2NsdXN0ZXJzID0gMTsKKworICAgIC8qIGhvdyBtYW55IGF2YWlsYWJsZSBjbHVzdGVycyA/ICovCisKKyAgICB3aGlsZSAoaSA8IG5iX2NsdXN0ZXJzKSB7CisgICAgICAgIGkgKz0gY291bnRfY29udGlndW91c19jbHVzdGVycyhuYl9jbHVzdGVycyAtIGksIHMtPmNsdXN0ZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAmbDJfdGFibGVbbDJfaW5kZXhdLCBpLCAwKTsKKyAgICAgICAgaWYgKChpID49IG5iX2NsdXN0ZXJzKSB8fCBiZTY0X3RvX2NwdShsMl90YWJsZVtsMl9pbmRleCArIGldKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpICs9IGNvdW50X2NvbnRpZ3VvdXNfZnJlZV9jbHVzdGVycyhuYl9jbHVzdGVycyAtIGksCisgICAgICAgICAgICAgICAgJmwyX3RhYmxlW2wyX2luZGV4ICsgaV0pOworICAgICAgICBpZiAoaSA+PSBuYl9jbHVzdGVycykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjbHVzdGVyX29mZnNldCA9IGJlNjRfdG9fY3B1KGwyX3RhYmxlW2wyX2luZGV4ICsgaV0pOworCisgICAgICAgIGlmICgoY2x1c3Rlcl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPUElFRCkgfHwKKyAgICAgICAgICAgICAgICAoY2x1c3Rlcl9vZmZzZXQgJiBRQ09XX09GTEFHX0NPTVBSRVNTRUQpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGFzc2VydChpIDw9IG5iX2NsdXN0ZXJzKTsKKyAgICBuYl9jbHVzdGVycyA9IGk7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZXJlIGFscmVhZHkgaXMgYW4gQUlPIHdyaXRlIHJlcXVlc3QgaW4gZmxpZ2h0IHdoaWNoIGFsbG9jYXRlcworICAgICAqIHRoZSBzYW1lIGNsdXN0ZXIuIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIHByZXZpb3VzCisgICAgICogcmVxdWVzdCBoYXMgY29tcGxldGVkIGFuZCB1cGRhdGVkIHRoZSBMMiB0YWJsZSBhY2NvcmRpbmdseS4KKyAgICAgKi8KKyAgICBRTElTVF9GT1JFQUNIKG9sZF9hbGxvYywgJnMtPmNsdXN0ZXJfYWxsb2NzLCBuZXh0X2luX2ZsaWdodCkgeworCisgICAgICAgIHVpbnQ2NF90IGVuZF9vZmZzZXQgPSBvZmZzZXQgKyBuYl9jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZTsKKyAgICAgICAgdWludDY0X3Qgb2xkX29mZnNldCA9IG9sZF9hbGxvYy0+b2Zmc2V0OworICAgICAgICB1aW50NjRfdCBvbGRfZW5kX29mZnNldCA9IG9sZF9hbGxvYy0+b2Zmc2V0ICsKKyAgICAgICAgICAgIG9sZF9hbGxvYy0+bmJfY2x1c3RlcnMgKiBzLT5jbHVzdGVyX3NpemU7CisKKyAgICAgICAgaWYgKGVuZF9vZmZzZXQgPCBvbGRfb2Zmc2V0IHx8IG9mZnNldCA+IG9sZF9lbmRfb2Zmc2V0KSB7CisgICAgICAgICAgICAvKiBObyBpbnRlcnNlY3Rpb24gKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBvbGRfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgLyogU3RvcCBhdCB0aGUgc3RhcnQgb2YgYSBydW5uaW5nIGFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICBuYl9jbHVzdGVycyA9IChvbGRfb2Zmc2V0IC0gb2Zmc2V0KSA+PiBzLT5jbHVzdGVyX2JpdHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5iX2NsdXN0ZXJzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5iX2NsdXN0ZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBTZXQgZGVwZW5kZW5jeSBhbmQgd2FpdCBmb3IgYSBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgIG0tPmRlcGVuZHNfb24gPSBvbGRfYWxsb2M7CisgICAgICAgICAgICAgICAgbS0+bmJfY2x1c3RlcnMgPSAwOworICAgICAgICAgICAgICAgICpudW0gPSAwOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFuYl9jbHVzdGVycykgeworICAgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIFFMSVNUX0lOU0VSVF9IRUFEKCZzLT5jbHVzdGVyX2FsbG9jcywgbSwgbmV4dF9pbl9mbGlnaHQpOworCisgICAgLyogYWxsb2NhdGUgYSBuZXcgY2x1c3RlciAqLworCisgICAgY2x1c3Rlcl9vZmZzZXQgPSBxY293Ml9hbGxvY19jbHVzdGVycyhicywgbmJfY2x1c3RlcnMgKiBzLT5jbHVzdGVyX3NpemUpOworICAgIGlmIChjbHVzdGVyX29mZnNldCA8IDApIHsKKyAgICAgICAgUUxJU1RfUkVNT1ZFKG0sIG5leHRfaW5fZmxpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJfb2Zmc2V0OworICAgIH0KKworICAgIC8qIHNhdmUgaW5mbyBuZWVkZWQgZm9yIG1ldGEgZGF0YSB1cGRhdGUgKi8KKyAgICBtLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgbS0+bl9zdGFydCA9IG5fc3RhcnQ7CisgICAgbS0+bmJfY2x1c3RlcnMgPSBuYl9jbHVzdGVyczsKKworb3V0OgorICAgIG0tPm5iX2F2YWlsYWJsZSA9IE1JTihuYl9jbHVzdGVycyA8PCAocy0+Y2x1c3Rlcl9iaXRzIC0gOSksIG5fZW5kKTsKKyAgICBtLT5jbHVzdGVyX29mZnNldCA9IGNsdXN0ZXJfb2Zmc2V0OworCisgICAgKm51bSA9IG0tPm5iX2F2YWlsYWJsZSAtIG5fc3RhcnQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvbXByZXNzX2J1ZmZlcih1aW50OF90ICpvdXRfYnVmLCBpbnQgb3V0X2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICB6X3N0cmVhbSBzdHJtMSwgKnN0cm0gPSAmc3RybTE7CisgICAgaW50IHJldCwgb3V0X2xlbjsKKworICAgIG1lbXNldChzdHJtLCAwLCBzaXplb2YoKnN0cm0pKTsKKworICAgIHN0cm0tPm5leHRfaW4gPSAodWludDhfdCAqKWJ1ZjsKKyAgICBzdHJtLT5hdmFpbF9pbiA9IGJ1Zl9zaXplOworICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0X2J1ZjsKKyAgICBzdHJtLT5hdmFpbF9vdXQgPSBvdXRfYnVmX3NpemU7CisKKyAgICByZXQgPSBpbmZsYXRlSW5pdDIoc3RybSwgLTEyKTsKKyAgICBpZiAocmV0ICE9IFpfT0spCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXQgPSBpbmZsYXRlKHN0cm0sIFpfRklOSVNIKTsKKyAgICBvdXRfbGVuID0gc3RybS0+bmV4dF9vdXQgLSBvdXRfYnVmOworICAgIGlmICgocmV0ICE9IFpfU1RSRUFNX0VORCAmJiByZXQgIT0gWl9CVUZfRVJST1IpIHx8CisgICAgICAgIG91dF9sZW4gIT0gb3V0X2J1Zl9zaXplKSB7CisgICAgICAgIGluZmxhdGVFbmQoc3RybSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5mbGF0ZUVuZChzdHJtKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHFjb3cyX2RlY29tcHJlc3NfY2x1c3RlcihCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3QgY2x1c3Rlcl9vZmZzZXQpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHJldCwgY3NpemUsIG5iX2NzZWN0b3JzLCBzZWN0b3Jfb2Zmc2V0OworICAgIHVpbnQ2NF90IGNvZmZzZXQ7CisKKyAgICBjb2Zmc2V0ID0gY2x1c3Rlcl9vZmZzZXQgJiBzLT5jbHVzdGVyX29mZnNldF9tYXNrOworICAgIGlmIChzLT5jbHVzdGVyX2NhY2hlX29mZnNldCAhPSBjb2Zmc2V0KSB7CisgICAgICAgIG5iX2NzZWN0b3JzID0gKChjbHVzdGVyX29mZnNldCA+PiBzLT5jc2l6ZV9zaGlmdCkgJiBzLT5jc2l6ZV9tYXNrKSArIDE7CisgICAgICAgIHNlY3Rvcl9vZmZzZXQgPSBjb2Zmc2V0ICYgNTExOworICAgICAgICBjc2l6ZSA9IG5iX2NzZWN0b3JzICogNTEyIC0gc2VjdG9yX29mZnNldDsKKyAgICAgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVBRF9DT01QUkVTU0VEKTsKKyAgICAgICAgcmV0ID0gYmRydl9yZWFkKGJzLT5maWxlLCBjb2Zmc2V0ID4+IDksIHMtPmNsdXN0ZXJfZGF0YSwgbmJfY3NlY3RvcnMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChkZWNvbXByZXNzX2J1ZmZlcihzLT5jbHVzdGVyX2NhY2hlLCBzLT5jbHVzdGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jbHVzdGVyX2RhdGEgKyBzZWN0b3Jfb2Zmc2V0LCBjc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcy0+Y2x1c3Rlcl9jYWNoZV9vZmZzZXQgPSBjb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItcmVmY291bnQuYyBiL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItcmVmY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzExOTg4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ibG9jay9xY293Mi1yZWZjb3VudC5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyoKKyAqIEJsb2NrIGRyaXZlciBmb3IgdGhlIFFDT1cgdmVyc2lvbiAyIGZvcm1hdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJibG9jay9ibG9ja19pbnQuaCIKKyNpbmNsdWRlICJibG9jay9xY293Mi5oIgorCitzdGF0aWMgaW50NjRfdCBhbGxvY19jbHVzdGVyc19ub3JlZihCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzaXplKTsKK3N0YXRpYyBpbnQgUUVNVV9XQVJOX1VOVVNFRF9SRVNVTFQgdXBkYXRlX3JlZmNvdW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkZW5kKTsKKworCitzdGF0aWMgaW50IGNhY2hlX3JlZmNvdW50X3VwZGF0ZXMgPSAwOworCitzdGF0aWMgaW50IHdyaXRlX3JlZmNvdW50X2Jsb2NrKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHNpemVfdCBzaXplID0gcy0+Y2x1c3Rlcl9zaXplOworCisgICAgaWYgKHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlX29mZnNldCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1JFRkJMT0NLX1VQREFURSk7CisgICAgaWYgKGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlX29mZnNldCwKKyAgICAgICAgICAgIHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlLCBzaXplKSA8IDApCisgICAgeworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZmNvdW50IGhhbmRsaW5nICovCisKK2ludCBxY293Ml9yZWZjb3VudF9pbml0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQsIHJlZmNvdW50X3RhYmxlX3NpemUyLCBpOworCisgICAgcy0+cmVmY291bnRfYmxvY2tfY2FjaGUgPSBnX21hbGxvYyhzLT5jbHVzdGVyX3NpemUpOworICAgIHJlZmNvdW50X3RhYmxlX3NpemUyID0gcy0+cmVmY291bnRfdGFibGVfc2l6ZSAqIHNpemVvZih1aW50NjRfdCk7CisgICAgcy0+cmVmY291bnRfdGFibGUgPSBnX21hbGxvYyhyZWZjb3VudF90YWJsZV9zaXplMik7CisgICAgaWYgKHMtPnJlZmNvdW50X3RhYmxlX3NpemUgPiAwKSB7CisgICAgICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1JFRlRBQkxFX0xPQUQpOworICAgICAgICByZXQgPSBiZHJ2X3ByZWFkKGJzLT5maWxlLCBzLT5yZWZjb3VudF90YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVmY291bnRfdGFibGUsIHJlZmNvdW50X3RhYmxlX3NpemUyKTsKKyAgICAgICAgaWYgKHJldCAhPSByZWZjb3VudF90YWJsZV9zaXplMikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcy0+cmVmY291bnRfdGFibGVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgYmU2NF90b19jcHVzKCZzLT5yZWZjb3VudF90YWJsZVtpXSk7CisgICAgfQorICAgIHJldHVybiAwOworIGZhaWw6CisgICAgcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgcWNvdzJfcmVmY291bnRfY2xvc2UoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgZ19mcmVlKHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlKTsKKyAgICBnX2ZyZWUocy0+cmVmY291bnRfdGFibGUpOworfQorCisKK3N0YXRpYyBpbnQgbG9hZF9yZWZjb3VudF9ibG9jayhCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHJlZmNvdW50X2Jsb2NrX29mZnNldCkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGNhY2hlX3JlZmNvdW50X3VwZGF0ZXMpIHsKKyAgICAgICAgcmV0ID0gd3JpdGVfcmVmY291bnRfYmxvY2soYnMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1JFRkJMT0NLX0xPQUQpOworICAgIHJldCA9IGJkcnZfcHJlYWQoYnMtPmZpbGUsIHJlZmNvdW50X2Jsb2NrX29mZnNldCwgcy0+cmVmY291bnRfYmxvY2tfY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICBzLT5jbHVzdGVyX3NpemUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcy0+cmVmY291bnRfYmxvY2tfY2FjaGVfb2Zmc2V0ID0gcmVmY291bnRfYmxvY2tfb2Zmc2V0OworICAgIHJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyB0aGUgcmVmY291bnQgb2YgdGhlIGNsdXN0ZXIgZ2l2ZW4gYnkgaXRzIGluZGV4LiBBbnkgbm9uLW5lZ2F0aXZlCisgKiByZXR1cm4gdmFsdWUgaXMgdGhlIHJlZmNvdW50IG9mIHRoZSBjbHVzdGVyLCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIC1lcnJubworICogYW5kIGluZGljYXRlIGFuIGVycm9yLgorICovCitzdGF0aWMgaW50IGdldF9yZWZjb3VudChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBjbHVzdGVyX2luZGV4KQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZWZjb3VudF90YWJsZV9pbmRleCwgYmxvY2tfaW5kZXg7CisgICAgaW50NjRfdCByZWZjb3VudF9ibG9ja19vZmZzZXQ7CisgICAgaW50IHJldDsKKworICAgIHJlZmNvdW50X3RhYmxlX2luZGV4ID0gY2x1c3Rlcl9pbmRleCA+PiAocy0+Y2x1c3Rlcl9iaXRzIC0gUkVGQ09VTlRfU0hJRlQpOworICAgIGlmIChyZWZjb3VudF90YWJsZV9pbmRleCA+PSBzLT5yZWZjb3VudF90YWJsZV9zaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZWZjb3VudF9ibG9ja19vZmZzZXQgPSBzLT5yZWZjb3VudF90YWJsZVtyZWZjb3VudF90YWJsZV9pbmRleF07CisgICAgaWYgKCFyZWZjb3VudF9ibG9ja19vZmZzZXQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChyZWZjb3VudF9ibG9ja19vZmZzZXQgIT0gcy0+cmVmY291bnRfYmxvY2tfY2FjaGVfb2Zmc2V0KSB7CisgICAgICAgIC8qIGJldHRlciB0aGFuIG5vdGhpbmc6IHJldHVybiBhbGxvY2F0ZWQgaWYgcmVhZCBlcnJvciAqLworICAgICAgICByZXQgPSBsb2FkX3JlZmNvdW50X2Jsb2NrKGJzLCByZWZjb3VudF9ibG9ja19vZmZzZXQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kZXggJgorICAgICAgICAoKDEgPDwgKHMtPmNsdXN0ZXJfYml0cyAtIFJFRkNPVU5UX1NISUZUKSkgLSAxKTsKKyAgICByZXR1cm4gYmUxNl90b19jcHUocy0+cmVmY291bnRfYmxvY2tfY2FjaGVbYmxvY2tfaW5kZXhdKTsKK30KKworLyoKKyAqIFJvdW5kcyB0aGUgcmVmY291bnQgdGFibGUgc2l6ZSB1cCB0byBhdm9pZCBncm93aW5nIHRoZSB0YWJsZSBmb3IgZWFjaCBzaW5nbGUKKyAqIHJlZmNvdW50IGJsb2NrIHRoYXQgaXMgYWxsb2NhdGVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IG5leHRfcmVmY291bnRfdGFibGVfc2l6ZShCRFJWUWNvd1N0YXRlICpzLAorICAgIHVuc2lnbmVkIGludCBtaW5fc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWluX2NsdXN0ZXJzID0gKG1pbl9zaXplID4+IChzLT5jbHVzdGVyX2JpdHMgLSAzKSkgKyAxOworICAgIHVuc2lnbmVkIGludCByZWZjb3VudF90YWJsZV9jbHVzdGVycyA9CisgICAgICAgIE1BWCgxLCBzLT5yZWZjb3VudF90YWJsZV9zaXplID4+IChzLT5jbHVzdGVyX2JpdHMgLSAzKSk7CisKKyAgICB3aGlsZSAobWluX2NsdXN0ZXJzID4gcmVmY291bnRfdGFibGVfY2x1c3RlcnMpIHsKKyAgICAgICAgcmVmY291bnRfdGFibGVfY2x1c3RlcnMgPSAocmVmY291bnRfdGFibGVfY2x1c3RlcnMgKiAzICsgMSkgLyAyOworICAgIH0KKworICAgIHJldHVybiByZWZjb3VudF90YWJsZV9jbHVzdGVycyA8PCAocy0+Y2x1c3Rlcl9iaXRzIC0gMyk7Cit9CisKKworLyogQ2hlY2tzIGlmIHR3byBvZmZzZXRzIGFyZSBkZXNjcmliZWQgYnkgdGhlIHNhbWUgcmVmY291bnQgYmxvY2sgKi8KK3N0YXRpYyBpbnQgaW5fc2FtZV9yZWZjb3VudF9ibG9jayhCRFJWUWNvd1N0YXRlICpzLCB1aW50NjRfdCBvZmZzZXRfYSwKKyAgICB1aW50NjRfdCBvZmZzZXRfYikKK3sKKyAgICB1aW50NjRfdCBibG9ja19hID0gb2Zmc2V0X2EgPj4gKDIgKiBzLT5jbHVzdGVyX2JpdHMgLSBSRUZDT1VOVF9TSElGVCk7CisgICAgdWludDY0X3QgYmxvY2tfYiA9IG9mZnNldF9iID4+ICgyICogcy0+Y2x1c3Rlcl9iaXRzIC0gUkVGQ09VTlRfU0hJRlQpOworCisgICAgcmV0dXJuIChibG9ja19hID09IGJsb2NrX2IpOworfQorCisvKgorICogTG9hZHMgYSByZWZjb3VudCBibG9jay4gSWYgaXQgZG9lc24ndCBleGlzdCB5ZXQsIGl0IGlzIGFsbG9jYXRlZCBmaXJzdAorICogKGluY2x1ZGluZyBncm93aW5nIHRoZSByZWZjb3VudCB0YWJsZSBpZiBuZWVkZWQpLgorICoKKyAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcmVmY291bnQgYmxvY2sgb24gc3VjY2VzcyBvciAtZXJybm8gaW4gZXJyb3IgY2FzZQorICovCitzdGF0aWMgaW50NjRfdCBhbGxvY19yZWZjb3VudF9ibG9jayhCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBjbHVzdGVyX2luZGV4KQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVuc2lnbmVkIGludCByZWZjb3VudF90YWJsZV9pbmRleDsKKyAgICBpbnQgcmV0OworCisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVGQkxPQ0tfQUxMT0MpOworCisgICAgLyogRmluZCB0aGUgcmVmY291bnQgYmxvY2sgZm9yIHRoZSBnaXZlbiBjbHVzdGVyICovCisgICAgcmVmY291bnRfdGFibGVfaW5kZXggPSBjbHVzdGVyX2luZGV4ID4+IChzLT5jbHVzdGVyX2JpdHMgLSBSRUZDT1VOVF9TSElGVCk7CisKKyAgICBpZiAocmVmY291bnRfdGFibGVfaW5kZXggPCBzLT5yZWZjb3VudF90YWJsZV9zaXplKSB7CisKKyAgICAgICAgdWludDY0X3QgcmVmY291bnRfYmxvY2tfb2Zmc2V0ID0KKyAgICAgICAgICAgIHMtPnJlZmNvdW50X3RhYmxlW3JlZmNvdW50X3RhYmxlX2luZGV4XTsKKworICAgICAgICAvKiBJZiBpdCdzIGFscmVhZHkgdGhlcmUsIHdlJ3JlIGRvbmUgKi8KKyAgICAgICAgaWYgKHJlZmNvdW50X2Jsb2NrX29mZnNldCkgeworICAgICAgICAgICAgaWYgKHJlZmNvdW50X2Jsb2NrX29mZnNldCAhPSBzLT5yZWZjb3VudF9ibG9ja19jYWNoZV9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBsb2FkX3JlZmNvdW50X2Jsb2NrKGJzLCByZWZjb3VudF9ibG9ja19vZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlZmNvdW50X2Jsb2NrX29mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogSWYgd2UgY2FtZSBoZXJlLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNvbWV0aGluZy4gU29tZXRoaW5nIGlzIGF0IGxlYXN0CisgICAgICogYSBjbHVzdGVyIGZvciB0aGUgbmV3IHJlZmNvdW50IGJsb2NrLiBJdCBtYXkgYWxzbyBpbmNsdWRlIGEgbmV3IHJlZmNvdW50CisgICAgICogdGFibGUgaWYgdGhlIG9sZCByZWZjb3VudCB0YWJsZSBpcyB0b28gc21hbGwuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgYWxsb2NhdGluZyBjbHVzdGVycyBoZXJlIG5lZWRzIHNvbWUgc3BlY2lhbCBjYXJlOgorICAgICAqCisgICAgICogLSBXZSBjYW4ndCB1c2UgdGhlIG5vcm1hbCBxY293Ml9hbGxvY19jbHVzdGVycygpLCBpdCB3b3VsZCB0cnkgdG8KKyAgICAgKiAgIGluY3JlYXNlIHRoZSByZWZjb3VudCBhbmQgdmVyeSBsaWtlbHkgd2Ugd291bGQgZW5kIHVwIHdpdGggYW4gZW5kbGVzcworICAgICAqICAgcmVjdXJzaW9uLiBJbnN0ZWFkIHdlIG11c3QgcGxhY2UgdGhlIHJlZmNvdW50IGJsb2NrcyBpbiBhIHdheSB0aGF0CisgICAgICogICB0aGV5IGNhbiBkZXNjcmliZSB0aGVtIHRoZW1zZWx2ZXMuCisgICAgICoKKyAgICAgKiAtIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdCBhdCB0aGlzIHBvaW50IHdlIGFyZSBpbnNpZGUgdXBkYXRlX3JlZmNvdW50cworICAgICAqICAgYW5kIGRvaW5nIHRoZSBpbml0aWFsIHJlZmNvdW50IGluY3JlYXNlLiBUaGlzIG1lYW5zIHRoYXQgc29tZSBjbHVzdGVycworICAgICAqICAgaGF2ZSBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIsIGJ1dCB0aGVpciByZWZjb3VudCBpc24ndAorICAgICAqICAgYWNjdXJhdGUgeWV0LiBmcmVlX2NsdXN0ZXJfaW5kZXggdGVsbHMgdXMgd2hlcmUgdGhpcyBhbGxvY2F0aW9uIGVuZHMKKyAgICAgKiAgIGFzIGxvbmcgYXMgd2UgZG9uJ3Qgb3ZlcndyaXRlIGl0IGJ5IGZyZWVpbmcgY2x1c3RlcnMuCisgICAgICoKKyAgICAgKiAtIGFsbG9jX2NsdXN0ZXJzX25vcmVmIGFuZCBxY293Ml9mcmVlX2NsdXN0ZXJzIG1heSBsb2FkIGEgZGlmZmVyZW50CisgICAgICogICByZWZjb3VudCBibG9jayBpbnRvIHRoZSBjYWNoZQorICAgICAqLworCisgICAgaWYgKGNhY2hlX3JlZmNvdW50X3VwZGF0ZXMpIHsKKyAgICAgICAgcmV0ID0gd3JpdGVfcmVmY291bnRfYmxvY2soYnMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFsbG9jYXRlIHRoZSByZWZjb3VudCBibG9jayBpdHNlbGYgYW5kIG1hcmsgaXQgYXMgdXNlZCAqLworICAgIGludDY0X3QgbmV3X2Jsb2NrID0gYWxsb2NfY2x1c3RlcnNfbm9yZWYoYnMsIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgaWYgKG5ld19ibG9jayA8IDApIHsKKyAgICAgICAgcmV0dXJuIG5ld19ibG9jazsKKyAgICB9CisKKyNpZmRlZiBERUJVR19BTExPQzIKKyAgICBmcHJpbnRmKHN0ZGVyciwgInFjb3cyOiBBbGxvY2F0ZSByZWZjb3VudCBibG9jayAlZCBmb3IgJSIgUFJJeDY0CisgICAgICAgICIgYXQgJSIgUFJJeDY0ICJcbiIsCisgICAgICAgIHJlZmNvdW50X3RhYmxlX2luZGV4LCBjbHVzdGVyX2luZGV4IDw8IHMtPmNsdXN0ZXJfYml0cywgbmV3X2Jsb2NrKTsKKyNlbmRpZgorCisgICAgaWYgKGluX3NhbWVfcmVmY291bnRfYmxvY2socywgbmV3X2Jsb2NrLCBjbHVzdGVyX2luZGV4IDw8IHMtPmNsdXN0ZXJfYml0cykpIHsKKyAgICAgICAgLyogWmVybyB0aGUgbmV3IHJlZmNvdW50IGJsb2NrIGJlZm9yZSB1cGRhdGluZyBpdCAqLworICAgICAgICBtZW1zZXQocy0+cmVmY291bnRfYmxvY2tfY2FjaGUsIDAsIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgICAgIHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlX29mZnNldCA9IG5ld19ibG9jazsKKworICAgICAgICAvKiBUaGUgYmxvY2sgZGVzY3JpYmVzIGl0c2VsZiwgbmVlZCB0byB1cGRhdGUgdGhlIGNhY2hlICovCisgICAgICAgIGludCBibG9ja19pbmRleCA9IChuZXdfYmxvY2sgPj4gcy0+Y2x1c3Rlcl9iaXRzKSAmCisgICAgICAgICAgICAoKDEgPDwgKHMtPmNsdXN0ZXJfYml0cyAtIFJFRkNPVU5UX1NISUZUKSkgLSAxKTsKKyAgICAgICAgcy0+cmVmY291bnRfYmxvY2tfY2FjaGVbYmxvY2tfaW5kZXhdID0gY3B1X3RvX2JlMTYoMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRGVzY3JpYmVkIHNvbWV3aGVyZSBlbHNlLiBUaGlzIGNhbiByZWN1cnNlIGF0IG1vc3QgdHdpY2UgYmVmb3JlIHdlCisgICAgICAgICAqIGFycml2ZSBhdCBhIGJsb2NrIHRoYXQgZGVzY3JpYmVzIGl0c2VsZi4gKi8KKyAgICAgICAgcmV0ID0gdXBkYXRlX3JlZmNvdW50KGJzLCBuZXdfYmxvY2ssIHMtPmNsdXN0ZXJfc2l6ZSwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGZhaWxfYmxvY2s7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBuZXcgcmVmY291bnQgYmxvY2sgb25seSBhZnRlciB1cGRhdGluZyBpdHMgcmVmY291bnQsCisgICAgICAgICAqIHVwZGF0ZV9yZWZjb3VudCB1c2VzIHRoZSByZWZjb3VudCBjYWNoZSBpdHNlbGYgKi8KKyAgICAgICAgbWVtc2V0KHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlLCAwLCBzLT5jbHVzdGVyX3NpemUpOworICAgICAgICBzLT5yZWZjb3VudF9ibG9ja19jYWNoZV9vZmZzZXQgPSBuZXdfYmxvY2s7CisgICAgfQorCisgICAgLyogTm93IHRoZSBuZXcgcmVmY291bnQgYmxvY2sgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byBkaXNrICovCisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVGQkxPQ0tfQUxMT0NfV1JJVEUpOworICAgIHJldCA9IGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG5ld19ibG9jaywgcy0+cmVmY291bnRfYmxvY2tfY2FjaGUsCisgICAgICAgIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsX2Jsb2NrOworICAgIH0KKworICAgIC8qIElmIHRoZSByZWZjb3VudCB0YWJsZSBpcyBiaWcgZW5vdWdoLCBqdXN0IGhvb2sgdGhlIGJsb2NrIHVwIHRoZXJlICovCisgICAgaWYgKHJlZmNvdW50X3RhYmxlX2luZGV4IDwgcy0+cmVmY291bnRfdGFibGVfc2l6ZSkgeworICAgICAgICB1aW50NjRfdCBkYXRhNjQgPSBjcHVfdG9fYmU2NChuZXdfYmxvY2spOworICAgICAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUZCTE9DS19BTExPQ19IT09LVVApOworICAgICAgICByZXQgPSBiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLAorICAgICAgICAgICAgcy0+cmVmY291bnRfdGFibGVfb2Zmc2V0ICsgcmVmY291bnRfdGFibGVfaW5kZXggKiBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgJmRhdGE2NCwgc2l6ZW9mKGRhdGE2NCkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsX2Jsb2NrOworICAgICAgICB9CisKKyAgICAgICAgcy0+cmVmY291bnRfdGFibGVbcmVmY291bnRfdGFibGVfaW5kZXhdID0gbmV3X2Jsb2NrOworICAgICAgICByZXR1cm4gbmV3X2Jsb2NrOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgd2UgY29tZSBoZXJlLCB3ZSBuZWVkIHRvIGdyb3cgdGhlIHJlZmNvdW50IHRhYmxlLiBBZ2FpbiwgYSBuZXcKKyAgICAgKiByZWZjb3VudCB0YWJsZSBuZWVkcyBzb21lIHNwYWNlIGFuZCB3ZSBjYW4ndCBzaW1wbHkgYWxsb2NhdGUgdG8gYXZvaWQKKyAgICAgKiBlbmRsZXNzIHJlY3Vyc2lvbi4KKyAgICAgKgorICAgICAqIFRoZXJlZm9yZSBsZXQncyBncmFiIG5ldyByZWZjb3VudCBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgaW1hZ2UsIHdoaWNoCisgICAgICogd2lsbCBkZXNjcmliZSB0aGVtc2VsdmVzIGFuZCB0aGUgbmV3IHJlZmNvdW50IHRhYmxlLiBUaGlzIHdheSB3ZSBjYW4KKyAgICAgKiByZWZlcmVuY2UgdGhlbSBvbmx5IGluIHRoZSBuZXcgdGFibGUgYW5kIGRvIHRoZSBzd2l0Y2ggdG8gdGhlIG5ldworICAgICAqIHJlZmNvdW50IHRhYmxlIGF0IG9uY2Ugd2l0aG91dCBwcm9kdWNpbmcgYW4gaW5jb25zaXN0ZW50IHN0YXRlIGluCisgICAgICogYmV0d2Vlbi4KKyAgICAgKi8KKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUZUQUJMRV9HUk9XKTsKKworICAgIC8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJlZmNvdW50IGJsb2NrcyBuZWVkZWQgc28gZmFyICovCisgICAgdWludDY0X3QgcmVmY291bnRfYmxvY2tfY2x1c3RlcnMgPSAxIDw8IChzLT5jbHVzdGVyX2JpdHMgLSBSRUZDT1VOVF9TSElGVCk7CisgICAgdWludDY0X3QgYmxvY2tzX3VzZWQgPSAocy0+ZnJlZV9jbHVzdGVyX2luZGV4ICsKKyAgICAgICAgcmVmY291bnRfYmxvY2tfY2x1c3RlcnMgLSAxKSAvIHJlZmNvdW50X2Jsb2NrX2NsdXN0ZXJzOworCisgICAgLyogQW5kIG5vdyB3ZSBuZWVkIGF0IGxlYXN0IG9uZSBibG9jayBtb3JlIGZvciB0aGUgbmV3IG1ldGFkYXRhICovCisgICAgdWludDY0X3QgdGFibGVfc2l6ZSA9IG5leHRfcmVmY291bnRfdGFibGVfc2l6ZShzLCBibG9ja3NfdXNlZCArIDEpOworICAgIHVpbnQ2NF90IGxhc3RfdGFibGVfc2l6ZTsKKyAgICB1aW50NjRfdCBibG9ja3NfY2x1c3RlcnM7CisgICAgZG8geworICAgICAgICB1aW50NjRfdCB0YWJsZV9jbHVzdGVycyA9IHNpemVfdG9fY2x1c3RlcnMocywgdGFibGVfc2l6ZSk7CisgICAgICAgIGJsb2Nrc19jbHVzdGVycyA9IDEgKworICAgICAgICAgICAgKCh0YWJsZV9jbHVzdGVycyArIHJlZmNvdW50X2Jsb2NrX2NsdXN0ZXJzIC0gMSkKKyAgICAgICAgICAgIC8gcmVmY291bnRfYmxvY2tfY2x1c3RlcnMpOworICAgICAgICB1aW50NjRfdCBtZXRhX2NsdXN0ZXJzID0gdGFibGVfY2x1c3RlcnMgKyBibG9ja3NfY2x1c3RlcnM7CisKKyAgICAgICAgbGFzdF90YWJsZV9zaXplID0gdGFibGVfc2l6ZTsKKyAgICAgICAgdGFibGVfc2l6ZSA9IG5leHRfcmVmY291bnRfdGFibGVfc2l6ZShzLCBibG9ja3NfdXNlZCArCisgICAgICAgICAgICAoKG1ldGFfY2x1c3RlcnMgKyByZWZjb3VudF9ibG9ja19jbHVzdGVycyAtIDEpCisgICAgICAgICAgICAvIHJlZmNvdW50X2Jsb2NrX2NsdXN0ZXJzKSk7CisKKyAgICB9IHdoaWxlIChsYXN0X3RhYmxlX3NpemUgIT0gdGFibGVfc2l6ZSk7CisKKyNpZmRlZiBERUJVR19BTExPQzIKKyAgICBmcHJpbnRmKHN0ZGVyciwgInFjb3cyOiBHcm93IHJlZmNvdW50IHRhYmxlICUiIFBSSWQzMiAiID0+ICUiIFBSSWQ2NCAiXG4iLAorICAgICAgICBzLT5yZWZjb3VudF90YWJsZV9zaXplLCB0YWJsZV9zaXplKTsKKyNlbmRpZgorCisgICAgLyogQ3JlYXRlIHRoZSBuZXcgcmVmY291bnQgdGFibGUgYW5kIGJsb2NrcyAqLworICAgIHVpbnQ2NF90IG1ldGFfb2Zmc2V0ID0gKGJsb2Nrc191c2VkICogcmVmY291bnRfYmxvY2tfY2x1c3RlcnMpICoKKyAgICAgICAgcy0+Y2x1c3Rlcl9zaXplOworICAgIHVpbnQ2NF90IHRhYmxlX29mZnNldCA9IG1ldGFfb2Zmc2V0ICsgYmxvY2tzX2NsdXN0ZXJzICogcy0+Y2x1c3Rlcl9zaXplOworICAgIHVpbnQxNl90ICpuZXdfYmxvY2tzID0gZ19tYWxsb2MwKGJsb2Nrc19jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgdWludDY0X3QgKm5ld190YWJsZSA9IGdfbWFsbG9jMCh0YWJsZV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgICBhc3NlcnQobWV0YV9vZmZzZXQgPj0gKHMtPmZyZWVfY2x1c3Rlcl9pbmRleCAqIHMtPmNsdXN0ZXJfc2l6ZSkpOworCisgICAgLyogRmlsbCB0aGUgbmV3IHJlZmNvdW50IHRhYmxlICovCisgICAgbWVtY3B5KG5ld190YWJsZSwgcy0+cmVmY291bnRfdGFibGUsCisgICAgICAgIHMtPnJlZmNvdW50X3RhYmxlX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBuZXdfdGFibGVbcmVmY291bnRfdGFibGVfaW5kZXhdID0gbmV3X2Jsb2NrOworCisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrc19jbHVzdGVyczsgaSsrKSB7CisgICAgICAgIG5ld190YWJsZVtibG9ja3NfdXNlZCArIGldID0gbWV0YV9vZmZzZXQgKyAoaSAqIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgfQorCisgICAgLyogRmlsbCB0aGUgcmVmY291bnQgYmxvY2tzICovCisgICAgdWludDY0X3QgdGFibGVfY2x1c3RlcnMgPSBzaXplX3RvX2NsdXN0ZXJzKHMsIHRhYmxlX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBpbnQgYmxvY2sgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZV9jbHVzdGVycyArIGJsb2Nrc19jbHVzdGVyczsgaSsrKSB7CisgICAgICAgIG5ld19ibG9ja3NbYmxvY2srK10gPSBjcHVfdG9fYmUxNigxKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSByZWZjb3VudCBibG9ja3MgdG8gZGlzayAqLworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1JFRkJMT0NLX0FMTE9DX1dSSVRFX0JMT0NLUyk7CisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgbWV0YV9vZmZzZXQsIG5ld19ibG9ja3MsCisgICAgICAgIGJsb2Nrc19jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgZ19mcmVlKG5ld19ibG9ja3MpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF90YWJsZTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSByZWZjb3VudCB0YWJsZSB0byBkaXNrICovCisgICAgZm9yKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgaSsrKSB7CisgICAgICAgIGNwdV90b19iZTY0cygmbmV3X3RhYmxlW2ldKTsKKyAgICB9CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUZCTE9DS19BTExPQ19XUklURV9UQUJMRSk7CisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgdGFibGVfb2Zmc2V0LCBuZXdfdGFibGUsCisgICAgICAgIHRhYmxlX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGZhaWxfdGFibGU7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgdGFibGVfc2l6ZTsgaSsrKSB7CisgICAgICAgIGNwdV90b19iZTY0cygmbmV3X3RhYmxlW2ldKTsKKyAgICB9CisKKyAgICAvKiBIb29rIHVwIHRoZSBuZXcgcmVmY291bnQgdGFibGUgaW4gdGhlIHFjb3cyIGhlYWRlciAqLworICAgIHVpbnQ4X3QgZGF0YVsxMl07CisgICAgY3B1X3RvX2JlNjR3KCh1aW50NjRfdCopZGF0YSwgdGFibGVfb2Zmc2V0KTsKKyAgICBjcHVfdG9fYmUzMncoKHVpbnQzMl90KikoZGF0YSArIDgpLCB0YWJsZV9jbHVzdGVycyk7CisgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVGQkxPQ0tfQUxMT0NfU1dJVENIX1RBQkxFKTsKKyAgICByZXQgPSBiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLCBvZmZzZXRvZihRQ293SGVhZGVyLCByZWZjb3VudF90YWJsZV9vZmZzZXQpLAorICAgICAgICBkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF90YWJsZTsKKyAgICB9CisKKyAgICAvKiBBbmQgc3dpdGNoIGl0IGluIG1lbW9yeSAqLworICAgIHVpbnQ2NF90IG9sZF90YWJsZV9vZmZzZXQgPSBzLT5yZWZjb3VudF90YWJsZV9vZmZzZXQ7CisgICAgdWludDY0X3Qgb2xkX3RhYmxlX3NpemUgPSBzLT5yZWZjb3VudF90YWJsZV9zaXplOworCisgICAgZ19mcmVlKHMtPnJlZmNvdW50X3RhYmxlKTsKKyAgICBzLT5yZWZjb3VudF90YWJsZSA9IG5ld190YWJsZTsKKyAgICBzLT5yZWZjb3VudF90YWJsZV9zaXplID0gdGFibGVfc2l6ZTsKKyAgICBzLT5yZWZjb3VudF90YWJsZV9vZmZzZXQgPSB0YWJsZV9vZmZzZXQ7CisKKyAgICAvKiBGcmVlIG9sZCB0YWJsZS4gUmVtZW1iZXIsIHdlIG11c3Qgbm90IGNoYW5nZSBmcmVlX2NsdXN0ZXJfaW5kZXggKi8KKyAgICB1aW50NjRfdCBvbGRfZnJlZV9jbHVzdGVyX2luZGV4ID0gcy0+ZnJlZV9jbHVzdGVyX2luZGV4OworICAgIHFjb3cyX2ZyZWVfY2x1c3RlcnMoYnMsIG9sZF90YWJsZV9vZmZzZXQsIG9sZF90YWJsZV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgcy0+ZnJlZV9jbHVzdGVyX2luZGV4ID0gb2xkX2ZyZWVfY2x1c3Rlcl9pbmRleDsKKworICAgIHJldCA9IGxvYWRfcmVmY291bnRfYmxvY2soYnMsIG5ld19ibG9jayk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsX2Jsb2NrOworICAgIH0KKworICAgIHJldHVybiBuZXdfYmxvY2s7CisKK2ZhaWxfdGFibGU6CisgICAgZ19mcmVlKG5ld190YWJsZSk7CitmYWlsX2Jsb2NrOgorICAgIHMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlX29mZnNldCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBSRUZDT1VOVFNfUEVSX1NFQ1RPUiAoNTEyID4+IFJFRkNPVU5UX1NISUZUKQorc3RhdGljIGludCB3cml0ZV9yZWZjb3VudF9ibG9ja19lbnRyaWVzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgIGludDY0X3QgcmVmY291bnRfYmxvY2tfb2Zmc2V0LCBpbnQgZmlyc3RfaW5kZXgsIGludCBsYXN0X2luZGV4KQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHNpemVfdCBzaXplOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY2FjaGVfcmVmY291bnRfdXBkYXRlcykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZmlyc3RfaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZpcnN0X2luZGV4ICY9IH4oUkVGQ09VTlRTX1BFUl9TRUNUT1IgLSAxKTsKKyAgICBsYXN0X2luZGV4ID0gKGxhc3RfaW5kZXggKyBSRUZDT1VOVFNfUEVSX1NFQ1RPUikKKyAgICAgICAgJiB+KFJFRkNPVU5UU19QRVJfU0VDVE9SIC0gMSk7CisKKyAgICBzaXplID0gKGxhc3RfaW5kZXggLSBmaXJzdF9pbmRleCkgPDwgUkVGQ09VTlRfU0hJRlQ7CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUZCTE9DS19VUERBVEVfUEFSVCk7CisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwKKyAgICAgICAgcmVmY291bnRfYmxvY2tfb2Zmc2V0ICsgKGZpcnN0X2luZGV4IDw8IFJFRkNPVU5UX1NISUZUKSwKKyAgICAgICAgJnMtPnJlZmNvdW50X2Jsb2NrX2NhY2hlW2ZpcnN0X2luZGV4XSwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogWFhYOiBjYWNoZSBzZXZlcmFsIHJlZmNvdW50IGJsb2NrIGNsdXN0ZXJzID8gKi8KK3N0YXRpYyBpbnQgUUVNVV9XQVJOX1VOVVNFRF9SRVNVTFQgdXBkYXRlX3JlZmNvdW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgaW50IGFkZGVuZCkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQ2NF90IHN0YXJ0LCBsYXN0LCBjbHVzdGVyX29mZnNldDsKKyAgICBpbnQ2NF90IHJlZmNvdW50X2Jsb2NrX29mZnNldCA9IDA7CisgICAgaW50NjRfdCB0YWJsZV9pbmRleCA9IC0xLCBvbGRfdGFibGVfaW5kZXg7CisgICAgaW50IGZpcnN0X2luZGV4ID0gLTEsIGxhc3RfaW5kZXggPSAtMTsKKyAgICBpbnQgcmV0OworCisjaWZkZWYgREVCVUdfQUxMT0MyCisgICAgcHJpbnRmKCJ1cGRhdGVfcmVmY291bnQ6IG9mZnNldD0lIiBQUklkNjQgIiBzaXplPSUiIFBSSWQ2NCAiIGFkZGVuZD0lZFxuIiwKKyAgICAgICAgICAgb2Zmc2V0LCBsZW5ndGgsIGFkZGVuZCk7CisjZW5kaWYKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN0YXJ0ID0gb2Zmc2V0ICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKTsKKyAgICBsYXN0ID0gKG9mZnNldCArIGxlbmd0aCAtIDEpICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKTsKKyAgICBmb3IoY2x1c3Rlcl9vZmZzZXQgPSBzdGFydDsgY2x1c3Rlcl9vZmZzZXQgPD0gbGFzdDsKKyAgICAgICAgY2x1c3Rlcl9vZmZzZXQgKz0gcy0+Y2x1c3Rlcl9zaXplKQorICAgIHsKKyAgICAgICAgaW50IGJsb2NrX2luZGV4LCByZWZjb3VudDsKKyAgICAgICAgaW50NjRfdCBjbHVzdGVyX2luZGV4ID0gY2x1c3Rlcl9vZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzOworICAgICAgICBpbnQ2NF90IG5ld19ibG9jazsKKworICAgICAgICAvKiBPbmx5IHdyaXRlIHJlZmNvdW50IGJsb2NrIHRvIGRpc2sgd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIGl0ICovCisgICAgICAgIG9sZF90YWJsZV9pbmRleCA9IHRhYmxlX2luZGV4OworICAgICAgICB0YWJsZV9pbmRleCA9IGNsdXN0ZXJfaW5kZXggPj4gKHMtPmNsdXN0ZXJfYml0cyAtIFJFRkNPVU5UX1NISUZUKTsKKyAgICAgICAgaWYgKChvbGRfdGFibGVfaW5kZXggPj0gMCkgJiYgKHRhYmxlX2luZGV4ICE9IG9sZF90YWJsZV9pbmRleCkpIHsKKworICAgICAgICAgICAgcmV0ID0gd3JpdGVfcmVmY291bnRfYmxvY2tfZW50cmllcyhicywgcmVmY291bnRfYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlyc3RfaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGxhc3RfaW5kZXggPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIExvYWQgdGhlIHJlZmNvdW50IGJsb2NrIGFuZCBhbGxvY2F0ZSBpdCBpZiBuZWVkZWQgKi8KKyAgICAgICAgbmV3X2Jsb2NrID0gYWxsb2NfcmVmY291bnRfYmxvY2soYnMsIGNsdXN0ZXJfaW5kZXgpOworICAgICAgICBpZiAobmV3X2Jsb2NrIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gbmV3X2Jsb2NrOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJlZmNvdW50X2Jsb2NrX29mZnNldCA9IG5ld19ibG9jazsKKworICAgICAgICAvKiB3ZSBjYW4gdXBkYXRlIHRoZSBjb3VudCBhbmQgc2F2ZSBpdCAqLworICAgICAgICBibG9ja19pbmRleCA9IGNsdXN0ZXJfaW5kZXggJgorICAgICAgICAgICAgKCgxIDw8IChzLT5jbHVzdGVyX2JpdHMgLSBSRUZDT1VOVF9TSElGVCkpIC0gMSk7CisgICAgICAgIGlmIChmaXJzdF9pbmRleCA9PSAtMSB8fCBibG9ja19pbmRleCA8IGZpcnN0X2luZGV4KSB7CisgICAgICAgICAgICBmaXJzdF9pbmRleCA9IGJsb2NrX2luZGV4OworICAgICAgICB9CisgICAgICAgIGlmIChibG9ja19pbmRleCA+IGxhc3RfaW5kZXgpIHsKKyAgICAgICAgICAgIGxhc3RfaW5kZXggPSBibG9ja19pbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIHJlZmNvdW50ID0gYmUxNl90b19jcHUocy0+cmVmY291bnRfYmxvY2tfY2FjaGVbYmxvY2tfaW5kZXhdKTsKKyAgICAgICAgcmVmY291bnQgKz0gYWRkZW5kOworICAgICAgICBpZiAocmVmY291bnQgPCAwIHx8IHJlZmNvdW50ID4gMHhmZmZmKSB7CisgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChyZWZjb3VudCA9PSAwICYmIGNsdXN0ZXJfaW5kZXggPCBzLT5mcmVlX2NsdXN0ZXJfaW5kZXgpIHsKKyAgICAgICAgICAgIHMtPmZyZWVfY2x1c3Rlcl9pbmRleCA9IGNsdXN0ZXJfaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgcy0+cmVmY291bnRfYmxvY2tfY2FjaGVbYmxvY2tfaW5kZXhdID0gY3B1X3RvX2JlMTYocmVmY291bnQpOworICAgIH0KKworICAgIHJldCA9IDA7CitmYWlsOgorCisgICAgLyogV3JpdGUgbGFzdCBjaGFuZ2VkIGJsb2NrIHRvIGRpc2sgKi8KKyAgICBpZiAocmVmY291bnRfYmxvY2tfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgaW50IHdyZXQ7CisgICAgICAgIHdyZXQgPSB3cml0ZV9yZWZjb3VudF9ibG9ja19lbnRyaWVzKGJzLCByZWZjb3VudF9ibG9ja19vZmZzZXQsCisgICAgICAgICAgICBmaXJzdF9pbmRleCwgbGFzdF9pbmRleCk7CisgICAgICAgIGlmICh3cmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiB3cmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcnkgZG8gdW5kbyBhbnkgdXBkYXRlcyBpZiBhbiBlcnJvciBpcyByZXR1cm5lZCAoVGhpcyBtYXkgc3VjY2VlZCBpbgorICAgICAqIHNvbWUgY2FzZXMgbGlrZSBFTk9TUEMgZm9yIGFsbG9jYXRpbmcgYSBuZXcgcmVmY291bnQgYmxvY2spCisgICAgICovCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGR1bW15OworICAgICAgICBkdW1teSA9IHVwZGF0ZV9yZWZjb3VudChicywgb2Zmc2V0LCBjbHVzdGVyX29mZnNldCAtIG9mZnNldCwgLWFkZGVuZCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEluY3JlYXNlcyBvciBkZWNyZWFzZXMgdGhlIHJlZmNvdW50IG9mIGEgZ2l2ZW4gY2x1c3RlciBieSBvbmUuCisgKiBhZGRlbmQgbXVzdCBiZSAxIG9yIC0xLgorICoKKyAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgbm9uLW5lZ2F0aXZlLCBpdCBpcyB0aGUgbmV3IHJlZmNvdW50IG9mIHRoZSBjbHVzdGVyLgorICogSWYgaXQgaXMgbmVnYXRpdmUsIGl0IGlzIC1lcnJubyBhbmQgaW5kaWNhdGVzIGFuIGVycm9yLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV9jbHVzdGVyX3JlZmNvdW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsdXN0ZXJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRlbmQpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHVwZGF0ZV9yZWZjb3VudChicywgY2x1c3Rlcl9pbmRleCA8PCBzLT5jbHVzdGVyX2JpdHMsIDEsIGFkZGVuZCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0X3JlZmNvdW50KGJzLCBjbHVzdGVyX2luZGV4KTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjbHVzdGVyIGFsbG9jYXRpb24gZnVuY3Rpb25zICovCisKKworCisvKiByZXR1cm4gPCAwIGlmIGVycm9yICovCitzdGF0aWMgaW50NjRfdCBhbGxvY19jbHVzdGVyc19ub3JlZihCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzaXplKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBpLCBuYl9jbHVzdGVycywgcmVmY291bnQ7CisKKyAgICBuYl9jbHVzdGVycyA9IHNpemVfdG9fY2x1c3RlcnMocywgc2l6ZSk7CityZXRyeToKKyAgICBmb3IoaSA9IDA7IGkgPCBuYl9jbHVzdGVyczsgaSsrKSB7CisgICAgICAgIGludDY0X3QgbmV4dF9jbHVzdGVyX2luZGV4ID0gcy0+ZnJlZV9jbHVzdGVyX2luZGV4Kys7CisgICAgICAgIHJlZmNvdW50ID0gZ2V0X3JlZmNvdW50KGJzLCBuZXh0X2NsdXN0ZXJfaW5kZXgpOworCisgICAgICAgIGlmIChyZWZjb3VudCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZWZjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChyZWZjb3VudCAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICB9CisgICAgfQorI2lmZGVmIERFQlVHX0FMTE9DMgorICAgIHByaW50ZigiYWxsb2NfY2x1c3RlcnM6IHNpemU9JSIgUFJJZDY0ICIgLT4gJSIgUFJJZDY0ICJcbiIsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgKHMtPmZyZWVfY2x1c3Rlcl9pbmRleCAtIG5iX2NsdXN0ZXJzKSA8PCBzLT5jbHVzdGVyX2JpdHMpOworI2VuZGlmCisgICAgcmV0dXJuIChzLT5mcmVlX2NsdXN0ZXJfaW5kZXggLSBuYl9jbHVzdGVycykgPDwgcy0+Y2x1c3Rlcl9iaXRzOworfQorCitpbnQ2NF90IHFjb3cyX2FsbG9jX2NsdXN0ZXJzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNpemUpCit7CisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgaW50IHJldDsKKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX0NMVVNURVJfQUxMT0MpOworICAgIG9mZnNldCA9IGFsbG9jX2NsdXN0ZXJzX25vcmVmKGJzLCBzaXplKTsKKyAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIHJldCA9IHVwZGF0ZV9yZWZjb3VudChicywgb2Zmc2V0LCBzaXplLCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gb2Zmc2V0OworfQorCisvKiBvbmx5IHVzZWQgdG8gYWxsb2NhdGUgY29tcHJlc3NlZCBzZWN0b3JzLiBXZSB0cnkgdG8gYWxsb2NhdGUKKyAgIGNvbnRpZ3VvdXMgc2VjdG9ycy4gc2l6ZSBtdXN0IGJlIDw9IGNsdXN0ZXJfc2l6ZSAqLworaW50NjRfdCBxY293Ml9hbGxvY19ieXRlcyhCbG9ja0RyaXZlclN0YXRlICpicywgaW50IHNpemUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50NjRfdCBvZmZzZXQsIGNsdXN0ZXJfb2Zmc2V0OworICAgIGludCBmcmVlX2luX2NsdXN0ZXI7CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19DTFVTVEVSX0FMTE9DX0JZVEVTKTsKKyAgICBhc3NlcnQoc2l6ZSA+IDAgJiYgc2l6ZSA8PSBzLT5jbHVzdGVyX3NpemUpOworICAgIGlmIChzLT5mcmVlX2J5dGVfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgcy0+ZnJlZV9ieXRlX29mZnNldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJzKGJzLCBzLT5jbHVzdGVyX3NpemUpOworICAgICAgICBpZiAocy0+ZnJlZV9ieXRlX29mZnNldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzLT5mcmVlX2J5dGVfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorIHJlZG86CisgICAgZnJlZV9pbl9jbHVzdGVyID0gcy0+Y2x1c3Rlcl9zaXplIC0KKyAgICAgICAgKHMtPmZyZWVfYnl0ZV9vZmZzZXQgJiAocy0+Y2x1c3Rlcl9zaXplIC0gMSkpOworICAgIGlmIChzaXplIDw9IGZyZWVfaW5fY2x1c3RlcikgeworICAgICAgICAvKiBlbm91Z2ggc3BhY2UgaW4gY3VycmVudCBjbHVzdGVyICovCisgICAgICAgIG9mZnNldCA9IHMtPmZyZWVfYnl0ZV9vZmZzZXQ7CisgICAgICAgIHMtPmZyZWVfYnl0ZV9vZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgZnJlZV9pbl9jbHVzdGVyIC09IHNpemU7CisgICAgICAgIGlmIChmcmVlX2luX2NsdXN0ZXIgPT0gMCkKKyAgICAgICAgICAgIHMtPmZyZWVfYnl0ZV9vZmZzZXQgPSAwOworICAgICAgICBpZiAoKG9mZnNldCAmIChzLT5jbHVzdGVyX3NpemUgLSAxKSkgIT0gMCkKKyAgICAgICAgICAgIHVwZGF0ZV9jbHVzdGVyX3JlZmNvdW50KGJzLCBvZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmZzZXQgPSBxY293Ml9hbGxvY19jbHVzdGVycyhicywgcy0+Y2x1c3Rlcl9zaXplKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgY2x1c3Rlcl9vZmZzZXQgPSBzLT5mcmVlX2J5dGVfb2Zmc2V0ICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKTsKKyAgICAgICAgaWYgKChjbHVzdGVyX29mZnNldCArIHMtPmNsdXN0ZXJfc2l6ZSkgPT0gb2Zmc2V0KSB7CisgICAgICAgICAgICAvKiB3ZSBhcmUgbHVja3k6IGNvbnRpZ3VvdXMgZGF0YSAqLworICAgICAgICAgICAgb2Zmc2V0ID0gcy0+ZnJlZV9ieXRlX29mZnNldDsKKyAgICAgICAgICAgIHVwZGF0ZV9jbHVzdGVyX3JlZmNvdW50KGJzLCBvZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzLCAxKTsKKyAgICAgICAgICAgIHMtPmZyZWVfYnl0ZV9vZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmZyZWVfYnl0ZV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBnb3RvIHJlZG87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG9mZnNldDsKK30KKwordm9pZCBxY293Ml9mcmVlX2NsdXN0ZXJzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKQoreworICAgIGludCByZXQ7CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19DTFVTVEVSX0ZSRUUpOworICAgIHJldCA9IHVwZGF0ZV9yZWZjb3VudChicywgb2Zmc2V0LCBzaXplLCAtMSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxY293Ml9mcmVlX2NsdXN0ZXJzIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKC1yZXQpKTsKKyAgICAgICAgLyogVE9ETyBSZW1lbWJlciB0aGUgY2x1c3RlcnMgdG8gZnJlZSB0aGVtIGxhdGVyIGFuZCBhdm9pZCBsZWFraW5nICovCisgICAgfQorfQorCisvKgorICogZnJlZV9hbnlfY2x1c3RlcnMKKyAqCisgKiBmcmVlIGNsdXN0ZXJzIGFjY29yZGluZyB0byBpdHMgdHlwZTogY29tcHJlc3NlZCBvciBub3QKKyAqCisgKi8KKwordm9pZCBxY293Ml9mcmVlX2FueV9jbHVzdGVycyhCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICB1aW50NjRfdCBjbHVzdGVyX29mZnNldCwgaW50IG5iX2NsdXN0ZXJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworCisgICAgLyogZnJlZSB0aGUgY2x1c3RlciAqLworCisgICAgaWYgKGNsdXN0ZXJfb2Zmc2V0ICYgUUNPV19PRkxBR19DT01QUkVTU0VEKSB7CisgICAgICAgIGludCBuYl9jc2VjdG9yczsKKyAgICAgICAgbmJfY3NlY3RvcnMgPSAoKGNsdXN0ZXJfb2Zmc2V0ID4+IHMtPmNzaXplX3NoaWZ0KSAmCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNzaXplX21hc2spICsgMTsKKyAgICAgICAgcWNvdzJfZnJlZV9jbHVzdGVycyhicywKKyAgICAgICAgICAgIChjbHVzdGVyX29mZnNldCAmIHMtPmNsdXN0ZXJfb2Zmc2V0X21hc2spICYgfjUxMSwKKyAgICAgICAgICAgIG5iX2NzZWN0b3JzICogNTEyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHFjb3cyX2ZyZWVfY2x1c3RlcnMoYnMsIGNsdXN0ZXJfb2Zmc2V0LCBuYl9jbHVzdGVycyA8PCBzLT5jbHVzdGVyX2JpdHMpOworCisgICAgcmV0dXJuOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNuYXBzaG90cyBhbmQgaW1hZ2UgY3JlYXRpb24gKi8KKworCisKK3ZvaWQgcWNvdzJfY3JlYXRlX3JlZmNvdW50X3VwZGF0ZShRQ293Q3JlYXRlU3RhdGUgKnMsIGludDY0X3Qgb2Zmc2V0LAorICAgIGludDY0X3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmVmY291bnQ7CisgICAgaW50NjRfdCBzdGFydCwgbGFzdCwgY2x1c3Rlcl9vZmZzZXQ7CisgICAgdWludDE2X3QgKnA7CisKKyAgICBzdGFydCA9IG9mZnNldCAmIH4ocy0+Y2x1c3Rlcl9zaXplIC0gMSk7CisgICAgbGFzdCA9IChvZmZzZXQgKyBzaXplIC0gMSkgICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKTsKKyAgICBmb3IoY2x1c3Rlcl9vZmZzZXQgPSBzdGFydDsgY2x1c3Rlcl9vZmZzZXQgPD0gbGFzdDsKKyAgICAgICAgY2x1c3Rlcl9vZmZzZXQgKz0gcy0+Y2x1c3Rlcl9zaXplKSB7CisgICAgICAgIHAgPSAmcy0+cmVmY291bnRfYmxvY2tbY2x1c3Rlcl9vZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzXTsKKyAgICAgICAgcmVmY291bnQgPSBiZTE2X3RvX2NwdSgqcCk7CisgICAgICAgIHJlZmNvdW50Kys7CisgICAgICAgICpwID0gY3B1X3RvX2JlMTYocmVmY291bnQpOworICAgIH0KK30KKworLyogdXBkYXRlIHRoZSByZWZjb3VudHMgb2Ygc25hcHNob3RzIGFuZCB0aGUgY29waWVkIGZsYWcgKi8KK2ludCBxY293Ml91cGRhdGVfc25hcHNob3RfcmVmY291bnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgaW50NjRfdCBsMV90YWJsZV9vZmZzZXQsIGludCBsMV9zaXplLCBpbnQgYWRkZW5kKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQ2NF90ICpsMV90YWJsZSwgKmwyX3RhYmxlLCBsMl9vZmZzZXQsIG9mZnNldCwgbDFfc2l6ZTIsIGwxX2FsbG9jYXRlZDsKKyAgICBpbnQ2NF90IG9sZF9vZmZzZXQsIG9sZF9sMl9vZmZzZXQ7CisgICAgaW50IGwyX3NpemUsIGksIGosIGwxX21vZGlmaWVkLCBsMl9tb2RpZmllZCwgbmJfY3NlY3RvcnMsIHJlZmNvdW50OworCisgICAgcWNvdzJfbDJfY2FjaGVfcmVzZXQoYnMpOworICAgIGNhY2hlX3JlZmNvdW50X3VwZGF0ZXMgPSAxOworCisgICAgbDJfdGFibGUgPSBOVUxMOworICAgIGwxX3RhYmxlID0gTlVMTDsKKyAgICBsMV9zaXplMiA9IGwxX3NpemUgKiBzaXplb2YodWludDY0X3QpOworICAgIGlmIChsMV90YWJsZV9vZmZzZXQgIT0gcy0+bDFfdGFibGVfb2Zmc2V0KSB7CisgICAgICAgIGlmIChsMV9zaXplMiAhPSAwKSB7CisgICAgICAgICAgICBsMV90YWJsZSA9IGdfbWFsbG9jMChhbGlnbl9vZmZzZXQobDFfc2l6ZTIsIDUxMikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbDFfdGFibGUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGwxX2FsbG9jYXRlZCA9IDE7CisgICAgICAgIGlmIChiZHJ2X3ByZWFkKGJzLT5maWxlLCBsMV90YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGwxX3RhYmxlLCBsMV9zaXplMikgIT0gbDFfc2l6ZTIpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGZvcihpID0gMDtpIDwgbDFfc2l6ZTsgaSsrKQorICAgICAgICAgICAgYmU2NF90b19jcHVzKCZsMV90YWJsZVtpXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KGwxX3NpemUgPT0gcy0+bDFfc2l6ZSk7CisgICAgICAgIGwxX3RhYmxlID0gcy0+bDFfdGFibGU7CisgICAgICAgIGwxX2FsbG9jYXRlZCA9IDA7CisgICAgfQorCisgICAgbDJfc2l6ZSA9IHMtPmwyX3NpemUgKiBzaXplb2YodWludDY0X3QpOworICAgIGwyX3RhYmxlID0gZ19tYWxsb2MobDJfc2l6ZSk7CisgICAgbDFfbW9kaWZpZWQgPSAwOworICAgIGZvcihpID0gMDsgaSA8IGwxX3NpemU7IGkrKykgeworICAgICAgICBsMl9vZmZzZXQgPSBsMV90YWJsZVtpXTsKKyAgICAgICAgaWYgKGwyX29mZnNldCkgeworICAgICAgICAgICAgb2xkX2wyX29mZnNldCA9IGwyX29mZnNldDsKKyAgICAgICAgICAgIGwyX29mZnNldCAmPSB+UUNPV19PRkxBR19DT1BJRUQ7CisgICAgICAgICAgICBsMl9tb2RpZmllZCA9IDA7CisgICAgICAgICAgICBpZiAoYmRydl9wcmVhZChicy0+ZmlsZSwgbDJfb2Zmc2V0LCBsMl90YWJsZSwgbDJfc2l6ZSkgIT0gbDJfc2l6ZSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBzLT5sMl9zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBiZTY0X3RvX2NwdShsMl90YWJsZVtqXSk7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9sZF9vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCAmPSB+UUNPV19PRkxBR19DT1BJRUQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgJiBRQ09XX09GTEFHX0NPTVBSRVNTRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NzZWN0b3JzID0gKChvZmZzZXQgPj4gcy0+Y3NpemVfc2hpZnQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNzaXplX21hc2spICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRlbmQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdXBkYXRlX3JlZmNvdW50KGJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ICYgcy0+Y2x1c3Rlcl9vZmZzZXRfbWFzaykgJiB+NTExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jc2VjdG9ycyAqIDUxMiwgYWRkZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHJlc3NlZCBjbHVzdGVycyBhcmUgbmV2ZXIgbW9kaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRlbmQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gdXBkYXRlX2NsdXN0ZXJfcmVmY291bnQoYnMsIG9mZnNldCA+PiBzLT5jbHVzdGVyX2JpdHMsIGFkZGVuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gZ2V0X3JlZmNvdW50KGJzLCBvZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmNvdW50IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZjb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgfD0gUUNPV19PRkxBR19DT1BJRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBvbGRfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsMl90YWJsZVtqXSA9IGNwdV90b19iZTY0KG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsMl9tb2RpZmllZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobDJfbW9kaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbDJfb2Zmc2V0LCBsMl90YWJsZSwgbDJfc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhZGRlbmQgIT0gMCkgeworICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gdXBkYXRlX2NsdXN0ZXJfcmVmY291bnQoYnMsIGwyX29mZnNldCA+PiBzLT5jbHVzdGVyX2JpdHMsIGFkZGVuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlZmNvdW50ID0gZ2V0X3JlZmNvdW50KGJzLCBsMl9vZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWZjb3VudCA8IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlZmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBsMl9vZmZzZXQgfD0gUUNPV19PRkxBR19DT1BJRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobDJfb2Zmc2V0ICE9IG9sZF9sMl9vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBsMV90YWJsZVtpXSA9IGwyX29mZnNldDsKKyAgICAgICAgICAgICAgICBsMV9tb2RpZmllZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGwxX21vZGlmaWVkKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IGwxX3NpemU7IGkrKykKKyAgICAgICAgICAgIGNwdV90b19iZTY0cygmbDFfdGFibGVbaV0pOworICAgICAgICBpZiAoYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgbDFfdGFibGVfb2Zmc2V0LCBsMV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGwxX3NpemUyKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGZvcihpID0gMDsgaSA8IGwxX3NpemU7IGkrKykKKyAgICAgICAgICAgIGJlNjRfdG9fY3B1cygmbDFfdGFibGVbaV0pOworICAgIH0KKyAgICBpZiAobDFfYWxsb2NhdGVkKQorICAgICAgICBnX2ZyZWUobDFfdGFibGUpOworICAgIGdfZnJlZShsMl90YWJsZSk7CisgICAgY2FjaGVfcmVmY291bnRfdXBkYXRlcyA9IDA7CisgICAgd3JpdGVfcmVmY291bnRfYmxvY2soYnMpOworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgaWYgKGwxX2FsbG9jYXRlZCkKKyAgICAgICAgZ19mcmVlKGwxX3RhYmxlKTsKKyAgICBnX2ZyZWUobDJfdGFibGUpOworICAgIGNhY2hlX3JlZmNvdW50X3VwZGF0ZXMgPSAwOworICAgIHdyaXRlX3JlZmNvdW50X2Jsb2NrKGJzKTsKKyAgICByZXR1cm4gLUVJTzsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZmNvdW50IGNoZWNraW5nIGZ1bmN0aW9ucyAqLworCisKKworLyoKKyAqIEluY3JlYXNlcyB0aGUgcmVmY291bnQgZm9yIGEgcmFuZ2Ugb2YgY2x1c3RlcnMgaW4gYSBnaXZlbiByZWZjb3VudCB0YWJsZS4KKyAqIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgcmVmY291bnQgdGFibGUgb3V0IG9mIEwxIGFuZCBMMiB0YWJsZXMKKyAqIHdoaWNoIGNhbiBiZSBjb21wYXJlZCB0aGUgdGhlIHJlZmNvdW50IHRhYmxlIHNhdmVkIGluIHRoZSBpbWFnZS4KKyAqCisgKiBNb2RpZmllcyB0aGUgbnVtYmVyIG9mIGVycm9ycyBpbiByZXMuCisgKi8KK3N0YXRpYyB2b2lkIGluY19yZWZjb3VudHMoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJkcnZDaGVja1Jlc3VsdCAqcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcmVmY291bnRfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZjb3VudF90YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludDY0X3Qgc3RhcnQsIGxhc3QsIGNsdXN0ZXJfb2Zmc2V0OworICAgIGludCBrOworCisgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RhcnQgPSBvZmZzZXQgJiB+KHMtPmNsdXN0ZXJfc2l6ZSAtIDEpOworICAgIGxhc3QgPSAob2Zmc2V0ICsgc2l6ZSAtIDEpICYgfihzLT5jbHVzdGVyX3NpemUgLSAxKTsKKyAgICBmb3IoY2x1c3Rlcl9vZmZzZXQgPSBzdGFydDsgY2x1c3Rlcl9vZmZzZXQgPD0gbGFzdDsKKyAgICAgICAgY2x1c3Rlcl9vZmZzZXQgKz0gcy0+Y2x1c3Rlcl9zaXplKSB7CisgICAgICAgIGsgPSBjbHVzdGVyX29mZnNldCA+PiBzLT5jbHVzdGVyX2JpdHM7CisgICAgICAgIGlmIChrIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogaW52YWxpZCBjbHVzdGVyIG9mZnNldD0weCUiIFBSSXg2NCAiXG4iLAorICAgICAgICAgICAgICAgIGNsdXN0ZXJfb2Zmc2V0KTsKKyAgICAgICAgICAgIHJlcy0+Y29ycnVwdGlvbnMrKzsKKyAgICAgICAgfSBlbHNlIGlmIChrID49IHJlZmNvdW50X3RhYmxlX3NpemUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY2x1c3RlciBvZmZzZXQ9MHglIiBQUkl4NjQgIiBpcyBhZnRlciAiCisgICAgICAgICAgICAgICAgInRoZSBlbmQgb2YgdGhlIGltYWdlIGZpbGUsIGNhbid0IHByb3Blcmx5IGNoZWNrIHJlZmNvdW50cy5cbiIsCisgICAgICAgICAgICAgICAgY2x1c3Rlcl9vZmZzZXQpOworICAgICAgICAgICAgcmVzLT5jaGVja19lcnJvcnMrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgrK3JlZmNvdW50X3RhYmxlW2tdID09IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBvdmVyZmxvdyBjbHVzdGVyIG9mZnNldD0weCUiIFBSSXg2NAorICAgICAgICAgICAgICAgICAgICAiXG4iLCBjbHVzdGVyX29mZnNldCk7CisgICAgICAgICAgICAgICAgcmVzLT5jb3JydXB0aW9ucysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorICogSW5jcmVhc2VzIHRoZSByZWZjb3VudCBpbiB0aGUgZ2l2ZW4gcmVmY291bnQgdGFibGUgZm9yIHRoZSBhbGwgY2x1c3RlcnMKKyAqIHJlZmVyZW5jZWQgaW4gdGhlIEwyIHRhYmxlLiBXaGlsZSBkb2luZyBzbywgcGVyZm9ybXMgc29tZSBjaGVja3Mgb24gTDIKKyAqIGVudHJpZXMuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9ycyBmb3VuZCBieSB0aGUgY2hlY2tzIG9yIC1lcnJubyBpZiBhbiBpbnRlcm5hbAorICogZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcmVmY291bnRzX2wyKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBCZHJ2Q2hlY2tSZXN1bHQgKnJlcywKKyAgICB1aW50MTZfdCAqcmVmY291bnRfdGFibGUsIGludCByZWZjb3VudF90YWJsZV9zaXplLCBpbnQ2NF90IGwyX29mZnNldCwKKyAgICBpbnQgY2hlY2tfY29waWVkKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQ2NF90ICpsMl90YWJsZSwgb2Zmc2V0OworICAgIGludCBpLCBsMl9zaXplLCBuYl9jc2VjdG9ycywgcmVmY291bnQ7CisKKyAgICAvKiBSZWFkIEwyIHRhYmxlIGZyb20gZGlzayAqLworICAgIGwyX3NpemUgPSBzLT5sMl9zaXplICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICBsMl90YWJsZSA9IGdfbWFsbG9jKGwyX3NpemUpOworCisgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIGwyX29mZnNldCwgbDJfdGFibGUsIGwyX3NpemUpICE9IGwyX3NpemUpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIERvIHRoZSBhY3R1YWwgY2hlY2tzICovCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bDJfc2l6ZTsgaSsrKSB7CisgICAgICAgIG9mZnNldCA9IGJlNjRfdG9fY3B1KGwyX3RhYmxlW2ldKTsKKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICYgUUNPV19PRkxBR19DT01QUkVTU0VEKSB7CisgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NlZCBjbHVzdGVycyBkb24ndCBoYXZlIFFDT1dfT0ZMQUdfQ09QSUVEICovCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAmIFFDT1dfT0ZMQUdfQ09QSUVEKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGNsdXN0ZXIgJSIgUFJJZDY0ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3BpZWQgZmxhZyBtdXN0IG5ldmVyIGJlIHNldCBmb3IgY29tcHJlc3NlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlcnNcbiIsIG9mZnNldCA+PiBzLT5jbHVzdGVyX2JpdHMpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJj0gflFDT1dfT0ZMQUdfQ09QSUVEOworICAgICAgICAgICAgICAgICAgICByZXMtPmNvcnJ1cHRpb25zKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogTWFyayBjbHVzdGVyIGFzIHVzZWQgKi8KKyAgICAgICAgICAgICAgICBuYl9jc2VjdG9ycyA9ICgob2Zmc2V0ID4+IHMtPmNzaXplX3NoaWZ0KSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3NpemVfbWFzaykgKyAxOworICAgICAgICAgICAgICAgIG9mZnNldCAmPSBzLT5jbHVzdGVyX29mZnNldF9tYXNrOworICAgICAgICAgICAgICAgIGluY19yZWZjb3VudHMoYnMsIHJlcywgcmVmY291bnRfdGFibGUsIHJlZmNvdW50X3RhYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCAmIH41MTEsIG5iX2NzZWN0b3JzICogNTEyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogUUNPV19PRkxBR19DT1BJRUQgbXVzdCBiZSBzZXQgaWZmIHJlZmNvdW50ID09IDEgKi8KKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tfY29waWVkKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVudHJ5ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJj0gflFDT1dfT0ZMQUdfQ09QSUVEOworICAgICAgICAgICAgICAgICAgICByZWZjb3VudCA9IGdldF9yZWZjb3VudChicywgb2Zmc2V0ID4+IHMtPmNsdXN0ZXJfYml0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZjb3VudCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgZ2V0IHJlZmNvdW50IGZvciBvZmZzZXQgJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkl4NjQgIjogJXNcbiIsIGVudHJ5LCBzdHJlcnJvcigtcmVmY291bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZmNvdW50ID09IDEpICE9ICgoZW50cnkgJiBRQ09XX09GTEFHX0NPUElFRCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgT0ZMQUdfQ09QSUVEOiBvZmZzZXQ9JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkl4NjQgIiByZWZjb3VudD0lZFxuIiwgZW50cnksIHJlZmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+Y29ycnVwdGlvbnMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE1hcmsgY2x1c3RlciBhcyB1c2VkICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ICY9IH5RQ09XX09GTEFHX0NPUElFRDsKKyAgICAgICAgICAgICAgICBpbmNfcmVmY291bnRzKGJzLCByZXMsIHJlZmNvdW50X3RhYmxlLHJlZmNvdW50X3RhYmxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcy0+Y2x1c3Rlcl9zaXplKTsKKworICAgICAgICAgICAgICAgIC8qIENvcnJlY3Qgb2Zmc2V0cyBhcmUgY2x1c3RlciBhbGlnbmVkICovCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAmIChzLT5jbHVzdGVyX3NpemUgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIG9mZnNldD0lIiBQUkl4NjQgIjogQ2x1c3RlciBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgInByb3Blcmx5IGFsaWduZWQ7IEwyIGVudHJ5IGNvcnJ1cHRlZC5cbiIsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHJlcy0+Y29ycnVwdGlvbnMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUobDJfdGFibGUpOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEkvTyBlcnJvciBpbiBjaGVja19yZWZjb3VudHNfbDJcbiIpOworICAgIGdfZnJlZShsMl90YWJsZSk7CisgICAgcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBJbmNyZWFzZXMgdGhlIHJlZmNvdW50IGZvciB0aGUgTDEgdGFibGUsIGl0cyBMMiB0YWJsZXMgYW5kIGFsbCByZWZlcmVuY2VkCisgKiBjbHVzdGVycyBpbiB0aGUgZ2l2ZW4gcmVmY291bnQgdGFibGUuIFdoaWxlIGRvaW5nIHNvLCBwZXJmb3JtcyBzb21lIGNoZWNrcworICogb24gTDEgYW5kIEwyIGVudHJpZXMuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVycm9ycyBmb3VuZCBieSB0aGUgY2hlY2tzIG9yIC1lcnJubyBpZiBhbiBpbnRlcm5hbAorICogZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcmVmY291bnRzX2wxKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmRydkNoZWNrUmVzdWx0ICpyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcmVmY291bnRfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmY291bnRfdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbDFfdGFibGVfb2Zmc2V0LCBpbnQgbDFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGVja19jb3BpZWQpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgdWludDY0X3QgKmwxX3RhYmxlLCBsMl9vZmZzZXQsIGwxX3NpemUyOworICAgIGludCBpLCByZWZjb3VudCwgcmV0OworCisgICAgbDFfc2l6ZTIgPSBsMV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KTsKKworICAgIC8qIE1hcmsgTDEgdGFibGUgYXMgdXNlZCAqLworICAgIGluY19yZWZjb3VudHMoYnMsIHJlcywgcmVmY291bnRfdGFibGUsIHJlZmNvdW50X3RhYmxlX3NpemUsCisgICAgICAgIGwxX3RhYmxlX29mZnNldCwgbDFfc2l6ZTIpOworCisgICAgLyogUmVhZCBMMSB0YWJsZSBlbnRyaWVzIGZyb20gZGlzayAqLworICAgIGlmIChsMV9zaXplMiA9PSAwKSB7CisgICAgICAgIGwxX3RhYmxlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBsMV90YWJsZSA9IGdfbWFsbG9jKGwxX3NpemUyKTsKKyAgICAgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIGwxX3RhYmxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgbDFfdGFibGUsIGwxX3NpemUyKSAhPSBsMV9zaXplMikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZm9yKGkgPSAwO2kgPCBsMV9zaXplOyBpKyspCisgICAgICAgICAgICBiZTY0X3RvX2NwdXMoJmwxX3RhYmxlW2ldKTsKKyAgICB9CisKKyAgICAvKiBEbyB0aGUgYWN0dWFsIGNoZWNrcyAqLworICAgIGZvcihpID0gMDsgaSA8IGwxX3NpemU7IGkrKykgeworICAgICAgICBsMl9vZmZzZXQgPSBsMV90YWJsZVtpXTsKKyAgICAgICAgaWYgKGwyX29mZnNldCkgeworICAgICAgICAgICAgLyogUUNPV19PRkxBR19DT1BJRUQgbXVzdCBiZSBzZXQgaWZmIHJlZmNvdW50ID09IDEgKi8KKyAgICAgICAgICAgIGlmIChjaGVja19jb3BpZWQpIHsKKyAgICAgICAgICAgICAgICByZWZjb3VudCA9IGdldF9yZWZjb3VudChicywgKGwyX29mZnNldCAmIH5RQ09XX09GTEFHX0NPUElFRCkKKyAgICAgICAgICAgICAgICAgICAgPj4gcy0+Y2x1c3Rlcl9iaXRzKTsKKyAgICAgICAgICAgICAgICBpZiAocmVmY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgZ2V0IHJlZmNvdW50IGZvciBsMl9vZmZzZXQgJSIKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSXg2NCAiOiAlc1xuIiwgbDJfb2Zmc2V0LCBzdHJlcnJvcigtcmVmY291bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHJlZmNvdW50ID09IDEpICE9ICgobDJfb2Zmc2V0ICYgUUNPV19PRkxBR19DT1BJRUQpICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgT0ZMQUdfQ09QSUVEOiBsMl9vZmZzZXQ9JSIgUFJJeDY0CisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlZmNvdW50PSVkXG4iLCBsMl9vZmZzZXQsIHJlZmNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzLT5jb3JydXB0aW9ucysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTWFyayBMMiB0YWJsZSBhcyB1c2VkICovCisgICAgICAgICAgICBsMl9vZmZzZXQgJj0gflFDT1dfT0ZMQUdfQ09QSUVEOworICAgICAgICAgICAgaW5jX3JlZmNvdW50cyhicywgcmVzLCByZWZjb3VudF90YWJsZSwgcmVmY291bnRfdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICBsMl9vZmZzZXQsIHMtPmNsdXN0ZXJfc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEwyIHRhYmxlcyBhcmUgY2x1c3RlciBhbGlnbmVkICovCisgICAgICAgICAgICBpZiAobDJfb2Zmc2V0ICYgKHMtPmNsdXN0ZXJfc2l6ZSAtIDEpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiBsMl9vZmZzZXQ9JSIgUFJJeDY0ICI6IFRhYmxlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyIGFsaWduZWQ7IEwxIGVudHJ5IGNvcnJ1cHRlZFxuIiwgbDJfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICByZXMtPmNvcnJ1cHRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgYW5kIGNoZWNrIEwyIGVudHJpZXMgKi8KKyAgICAgICAgICAgIHJldCA9IGNoZWNrX3JlZmNvdW50c19sMihicywgcmVzLCByZWZjb3VudF90YWJsZSwKKyAgICAgICAgICAgICAgICByZWZjb3VudF90YWJsZV9zaXplLCBsMl9vZmZzZXQsIGNoZWNrX2NvcGllZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUobDFfdGFibGUpOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEkvTyBlcnJvciBpbiBjaGVja19yZWZjb3VudHNfbDFcbiIpOworICAgIHJlcy0+Y2hlY2tfZXJyb3JzKys7CisgICAgZ19mcmVlKGwxX3RhYmxlKTsKKyAgICByZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIENoZWNrcyBhbiBpbWFnZSBmb3IgcmVmY291bnQgY29uc2lzdGVuY3kuCisgKgorICogUmV0dXJucyAwIGlmIG5vIGVycm9ycyBhcmUgZm91bmQsIHRoZSBudW1iZXIgb2YgZXJyb3JzIGluIGNhc2UgdGhlIGltYWdlIGlzCisgKiBkZXRlY3RlZCBhcyBjb3JydXB0ZWQsIGFuZCAtZXJybm8gd2hlbiBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cmVkLgorICovCitpbnQgcWNvdzJfY2hlY2tfcmVmY291bnRzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBCZHJ2Q2hlY2tSZXN1bHQgKnJlcykKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgaW50IG5iX2NsdXN0ZXJzLCByZWZjb3VudDEsIHJlZmNvdW50MiwgaTsKKyAgICBRQ293U25hcHNob3QgKnNuOworICAgIHVpbnQxNl90ICpyZWZjb3VudF90YWJsZTsKKyAgICBpbnQgcmV0OworCisgICAgc2l6ZSA9IGJkcnZfZ2V0bGVuZ3RoKGJzLT5maWxlKTsKKyAgICBuYl9jbHVzdGVycyA9IHNpemVfdG9fY2x1c3RlcnMocywgc2l6ZSk7CisgICAgcmVmY291bnRfdGFibGUgPSBnX21hbGxvYzAobmJfY2x1c3RlcnMgKiBzaXplb2YodWludDE2X3QpKTsKKworICAgIC8qIGhlYWRlciAqLworICAgIGluY19yZWZjb3VudHMoYnMsIHJlcywgcmVmY291bnRfdGFibGUsIG5iX2NsdXN0ZXJzLAorICAgICAgICAwLCBzLT5jbHVzdGVyX3NpemUpOworCisgICAgLyogY3VycmVudCBMMSB0YWJsZSAqLworICAgIHJldCA9IGNoZWNrX3JlZmNvdW50c19sMShicywgcmVzLCByZWZjb3VudF90YWJsZSwgbmJfY2x1c3RlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmwxX3RhYmxlX29mZnNldCwgcy0+bDFfc2l6ZSwgMSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBzbmFwc2hvdHMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBzbiA9IHMtPnNuYXBzaG90cyArIGk7CisgICAgICAgIHJldCA9IGNoZWNrX3JlZmNvdW50c19sMShicywgcmVzLCByZWZjb3VudF90YWJsZSwgbmJfY2x1c3RlcnMsCisgICAgICAgICAgICBzbi0+bDFfdGFibGVfb2Zmc2V0LCBzbi0+bDFfc2l6ZSwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIGluY19yZWZjb3VudHMoYnMsIHJlcywgcmVmY291bnRfdGFibGUsIG5iX2NsdXN0ZXJzLAorICAgICAgICBzLT5zbmFwc2hvdHNfb2Zmc2V0LCBzLT5zbmFwc2hvdHNfc2l6ZSk7CisKKyAgICAvKiByZWZjb3VudCBkYXRhICovCisgICAgaW5jX3JlZmNvdW50cyhicywgcmVzLCByZWZjb3VudF90YWJsZSwgbmJfY2x1c3RlcnMsCisgICAgICAgIHMtPnJlZmNvdW50X3RhYmxlX29mZnNldCwKKyAgICAgICAgcy0+cmVmY291bnRfdGFibGVfc2l6ZSAqIHNpemVvZih1aW50NjRfdCkpOworCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+cmVmY291bnRfdGFibGVfc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQ2NF90IG9mZnNldCwgY2x1c3RlcjsKKyAgICAgICAgb2Zmc2V0ID0gcy0+cmVmY291bnRfdGFibGVbaV07CisgICAgICAgIGNsdXN0ZXIgPSBvZmZzZXQgPj4gcy0+Y2x1c3Rlcl9iaXRzOworCisgICAgICAgIC8qIFJlZmNvdW50IGJsb2NrcyBhcmUgY2x1c3RlciBhbGlnbmVkICovCisgICAgICAgIGlmIChvZmZzZXQgJiAocy0+Y2x1c3Rlcl9zaXplIC0gMSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgcmVmY291bnQgYmxvY2sgJWQgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAiY2x1c3RlciBhbGlnbmVkOyByZWZjb3VudCB0YWJsZSBlbnRyeSBjb3JydXB0ZWRcbiIsIGkpOworICAgICAgICAgICAgcmVzLT5jb3JydXB0aW9ucysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2x1c3RlciA+PSBuYl9jbHVzdGVycykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiByZWZjb3VudCBibG9jayAlZCBpcyBvdXRzaWRlIGltYWdlXG4iLCBpKTsKKyAgICAgICAgICAgIHJlcy0+Y29ycnVwdGlvbnMrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpbmNfcmVmY291bnRzKGJzLCByZXMsIHJlZmNvdW50X3RhYmxlLCBuYl9jbHVzdGVycywKKyAgICAgICAgICAgICAgICBvZmZzZXQsIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmVmY291bnRfdGFibGVbY2x1c3Rlcl0gIT0gMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgcmVmY291bnQgYmxvY2sgJWQgcmVmY291bnQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIHJlZmNvdW50X3RhYmxlW2NsdXN0ZXJdKTsKKyAgICAgICAgICAgICAgICByZXMtPmNvcnJ1cHRpb25zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb21wYXJlIHJlZiBjb3VudHMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBuYl9jbHVzdGVyczsgaSsrKSB7CisgICAgICAgIHJlZmNvdW50MSA9IGdldF9yZWZjb3VudChicywgaSk7CisgICAgICAgIGlmIChyZWZjb3VudDEgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGdldCByZWZjb3VudCBmb3IgY2x1c3RlciAlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgaSwgc3RyZXJyb3IoLXJlZmNvdW50MSkpOworICAgICAgICAgICAgcmVzLT5jaGVja19lcnJvcnMrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmVmY291bnQyID0gcmVmY291bnRfdGFibGVbaV07CisgICAgICAgIGlmIChyZWZjb3VudDEgIT0gcmVmY291bnQyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGNsdXN0ZXIgJWQgcmVmY291bnQ9JWQgcmVmZXJlbmNlPSVkXG4iLAorICAgICAgICAgICAgICAgICAgIHJlZmNvdW50MSA8IHJlZmNvdW50MiA/ICJFUlJPUiIgOiAiTGVha2VkIiwKKyAgICAgICAgICAgICAgICAgICBpLCByZWZjb3VudDEsIHJlZmNvdW50Mik7CisgICAgICAgICAgICBpZiAocmVmY291bnQxIDwgcmVmY291bnQyKSB7CisgICAgICAgICAgICAgICAgcmVzLT5jb3JydXB0aW9ucysrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMtPmxlYWtzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUocmVmY291bnRfdGFibGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItc25hcHNob3QuYyBiL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzItc25hcHNob3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NmYzEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ibG9jay9xY293Mi1zbmFwc2hvdC5jCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogQmxvY2sgZHJpdmVyIGZvciB0aGUgUUNPVyB2ZXJzaW9uIDIgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrX2ludC5oIgorI2luY2x1ZGUgImJsb2NrL3Fjb3cyLmgiCisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIFFDb3dTbmFwc2hvdEhlYWRlciB7CisgICAgLyogaGVhZGVyIGlzIDggYnl0ZSBhbGlnbmVkICovCisgICAgdWludDY0X3QgbDFfdGFibGVfb2Zmc2V0OworCisgICAgdWludDMyX3QgbDFfc2l6ZTsKKyAgICB1aW50MTZfdCBpZF9zdHJfc2l6ZTsKKyAgICB1aW50MTZfdCBuYW1lX3NpemU7CisKKyAgICB1aW50MzJfdCBkYXRlX3NlYzsKKyAgICB1aW50MzJfdCBkYXRlX25zZWM7CisKKyAgICB1aW50NjRfdCB2bV9jbG9ja19uc2VjOworCisgICAgdWludDMyX3Qgdm1fc3RhdGVfc2l6ZTsKKyAgICB1aW50MzJfdCBleHRyYV9kYXRhX3NpemU7IC8qIGZvciBleHRlbnNpb24gKi8KKyAgICAvKiBleHRyYSBkYXRhIGZvbGxvd3MgKi8KKyAgICAvKiBpZF9zdHIgZm9sbG93cyAqLworICAgIC8qIG5hbWUgZm9sbG93cyAgKi8KK30gUUNvd1NuYXBzaG90SGVhZGVyOworCit2b2lkIHFjb3cyX2ZyZWVfc25hcHNob3RzKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bmJfc25hcHNob3RzOyBpKyspIHsKKyAgICAgICAgZ19mcmVlKHMtPnNuYXBzaG90c1tpXS5uYW1lKTsKKyAgICAgICAgZ19mcmVlKHMtPnNuYXBzaG90c1tpXS5pZF9zdHIpOworICAgIH0KKyAgICBnX2ZyZWUocy0+c25hcHNob3RzKTsKKyAgICBzLT5zbmFwc2hvdHMgPSBOVUxMOworICAgIHMtPm5iX3NuYXBzaG90cyA9IDA7Cit9CisKK2ludCBxY293Ml9yZWFkX3NuYXBzaG90cyhCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBRQ293U25hcHNob3RIZWFkZXIgaDsKKyAgICBRQ293U25hcHNob3QgKnNuOworICAgIGludCBpLCBpZF9zdHJfc2l6ZSwgbmFtZV9zaXplOworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IGV4dHJhX2RhdGFfc2l6ZTsKKworICAgIGlmICghcy0+bmJfc25hcHNob3RzKSB7CisgICAgICAgIHMtPnNuYXBzaG90cyA9IE5VTEw7CisgICAgICAgIHMtPnNuYXBzaG90c19zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb2Zmc2V0ID0gcy0+c25hcHNob3RzX29mZnNldDsKKyAgICBzLT5zbmFwc2hvdHMgPSBnX21hbGxvYzAocy0+bmJfc25hcHNob3RzICogc2l6ZW9mKFFDb3dTbmFwc2hvdCkpOworICAgIGZvcihpID0gMDsgaSA8IHMtPm5iX3NuYXBzaG90czsgaSsrKSB7CisgICAgICAgIG9mZnNldCA9IGFsaWduX29mZnNldChvZmZzZXQsIDgpOworICAgICAgICBpZiAoYmRydl9wcmVhZChicy0+ZmlsZSwgb2Zmc2V0LCAmaCwgc2l6ZW9mKGgpKSAhPSBzaXplb2YoaCkpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIG9mZnNldCArPSBzaXplb2YoaCk7CisgICAgICAgIHNuID0gcy0+c25hcHNob3RzICsgaTsKKyAgICAgICAgc24tPmwxX3RhYmxlX29mZnNldCA9IGJlNjRfdG9fY3B1KGgubDFfdGFibGVfb2Zmc2V0KTsKKyAgICAgICAgc24tPmwxX3NpemUgPSBiZTMyX3RvX2NwdShoLmwxX3NpemUpOworICAgICAgICBzbi0+dm1fc3RhdGVfc2l6ZSA9IGJlMzJfdG9fY3B1KGgudm1fc3RhdGVfc2l6ZSk7CisgICAgICAgIHNuLT5kYXRlX3NlYyA9IGJlMzJfdG9fY3B1KGguZGF0ZV9zZWMpOworICAgICAgICBzbi0+ZGF0ZV9uc2VjID0gYmUzMl90b19jcHUoaC5kYXRlX25zZWMpOworICAgICAgICBzbi0+dm1fY2xvY2tfbnNlYyA9IGJlNjRfdG9fY3B1KGgudm1fY2xvY2tfbnNlYyk7CisgICAgICAgIGV4dHJhX2RhdGFfc2l6ZSA9IGJlMzJfdG9fY3B1KGguZXh0cmFfZGF0YV9zaXplKTsKKworICAgICAgICBpZF9zdHJfc2l6ZSA9IGJlMTZfdG9fY3B1KGguaWRfc3RyX3NpemUpOworICAgICAgICBuYW1lX3NpemUgPSBiZTE2X3RvX2NwdShoLm5hbWVfc2l6ZSk7CisKKyAgICAgICAgb2Zmc2V0ICs9IGV4dHJhX2RhdGFfc2l6ZTsKKworICAgICAgICBzbi0+aWRfc3RyID0gZ19tYWxsb2MoaWRfc3RyX3NpemUgKyAxKTsKKyAgICAgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIG9mZnNldCwgc24tPmlkX3N0ciwgaWRfc3RyX3NpemUpICE9IGlkX3N0cl9zaXplKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBvZmZzZXQgKz0gaWRfc3RyX3NpemU7CisgICAgICAgIHNuLT5pZF9zdHJbaWRfc3RyX3NpemVdID0gJ1wwJzsKKworICAgICAgICBzbi0+bmFtZSA9IGdfbWFsbG9jKG5hbWVfc2l6ZSArIDEpOworICAgICAgICBpZiAoYmRydl9wcmVhZChicy0+ZmlsZSwgb2Zmc2V0LCBzbi0+bmFtZSwgbmFtZV9zaXplKSAhPSBuYW1lX3NpemUpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIG9mZnNldCArPSBuYW1lX3NpemU7CisgICAgICAgIHNuLT5uYW1lW25hbWVfc2l6ZV0gPSAnXDAnOworICAgIH0KKyAgICBzLT5zbmFwc2hvdHNfc2l6ZSA9IG9mZnNldCAtIHMtPnNuYXBzaG90c19vZmZzZXQ7CisgICAgcmV0dXJuIDA7CisgZmFpbDoKKyAgICBxY293Ml9mcmVlX3NuYXBzaG90cyhicyk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBhZGQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhIG5ldyBsaXN0IG9mIHNuYXBzaG90cyAqLworc3RhdGljIGludCBxY293X3dyaXRlX3NuYXBzaG90cyhCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBRQ293U25hcHNob3QgKnNuOworICAgIFFDb3dTbmFwc2hvdEhlYWRlciBoOworICAgIGludCBpLCBuYW1lX3NpemUsIGlkX3N0cl9zaXplLCBzbmFwc2hvdHNfc2l6ZTsKKyAgICB1aW50NjRfdCBkYXRhNjQ7CisgICAgdWludDMyX3QgZGF0YTMyOworICAgIGludDY0X3Qgb2Zmc2V0LCBzbmFwc2hvdHNfb2Zmc2V0OworCisgICAgLyogY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgc25hcHNob3RzICovCisgICAgb2Zmc2V0ID0gMDsKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBzbiA9IHMtPnNuYXBzaG90cyArIGk7CisgICAgICAgIG9mZnNldCA9IGFsaWduX29mZnNldChvZmZzZXQsIDgpOworICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKGgpOworICAgICAgICBvZmZzZXQgKz0gc3RybGVuKHNuLT5pZF9zdHIpOworICAgICAgICBvZmZzZXQgKz0gc3RybGVuKHNuLT5uYW1lKTsKKyAgICB9CisgICAgc25hcHNob3RzX3NpemUgPSBvZmZzZXQ7CisKKyAgICBzbmFwc2hvdHNfb2Zmc2V0ID0gcWNvdzJfYWxsb2NfY2x1c3RlcnMoYnMsIHNuYXBzaG90c19zaXplKTsKKyAgICBvZmZzZXQgPSBzbmFwc2hvdHNfb2Zmc2V0OworICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bmJfc25hcHNob3RzOyBpKyspIHsKKyAgICAgICAgc24gPSBzLT5zbmFwc2hvdHMgKyBpOworICAgICAgICBtZW1zZXQoJmgsIDAsIHNpemVvZihoKSk7CisgICAgICAgIGgubDFfdGFibGVfb2Zmc2V0ID0gY3B1X3RvX2JlNjQoc24tPmwxX3RhYmxlX29mZnNldCk7CisgICAgICAgIGgubDFfc2l6ZSA9IGNwdV90b19iZTMyKHNuLT5sMV9zaXplKTsKKyAgICAgICAgaC52bV9zdGF0ZV9zaXplID0gY3B1X3RvX2JlMzIoc24tPnZtX3N0YXRlX3NpemUpOworICAgICAgICBoLmRhdGVfc2VjID0gY3B1X3RvX2JlMzIoc24tPmRhdGVfc2VjKTsKKyAgICAgICAgaC5kYXRlX25zZWMgPSBjcHVfdG9fYmUzMihzbi0+ZGF0ZV9uc2VjKTsKKyAgICAgICAgaC52bV9jbG9ja19uc2VjID0gY3B1X3RvX2JlNjQoc24tPnZtX2Nsb2NrX25zZWMpOworCisgICAgICAgIGlkX3N0cl9zaXplID0gc3RybGVuKHNuLT5pZF9zdHIpOworICAgICAgICBuYW1lX3NpemUgPSBzdHJsZW4oc24tPm5hbWUpOworICAgICAgICBoLmlkX3N0cl9zaXplID0gY3B1X3RvX2JlMTYoaWRfc3RyX3NpemUpOworICAgICAgICBoLm5hbWVfc2l6ZSA9IGNwdV90b19iZTE2KG5hbWVfc2l6ZSk7CisgICAgICAgIG9mZnNldCA9IGFsaWduX29mZnNldChvZmZzZXQsIDgpOworICAgICAgICBpZiAoYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgb2Zmc2V0LCAmaCwgc2l6ZW9mKGgpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIG9mZnNldCArPSBzaXplb2YoaCk7CisgICAgICAgIGlmIChiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLCBvZmZzZXQsIHNuLT5pZF9zdHIsIGlkX3N0cl9zaXplKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIG9mZnNldCArPSBpZF9zdHJfc2l6ZTsKKyAgICAgICAgaWYgKGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG9mZnNldCwgc24tPm5hbWUsIG5hbWVfc2l6ZSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBvZmZzZXQgKz0gbmFtZV9zaXplOworICAgIH0KKworICAgIC8qIHVwZGF0ZSB0aGUgdmFyaW91cyBoZWFkZXIgZmllbGRzICovCisgICAgZGF0YTY0ID0gY3B1X3RvX2JlNjQoc25hcHNob3RzX29mZnNldCk7CisgICAgaWYgKGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG9mZnNldG9mKFFDb3dIZWFkZXIsIHNuYXBzaG90c19vZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAmZGF0YTY0LCBzaXplb2YoZGF0YTY0KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZGF0YTMyID0gY3B1X3RvX2JlMzIocy0+bmJfc25hcHNob3RzKTsKKyAgICBpZiAoYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgb2Zmc2V0b2YoUUNvd0hlYWRlciwgbmJfc25hcHNob3RzKSwKKyAgICAgICAgICAgICAgICAgICAgJmRhdGEzMiwgc2l6ZW9mKGRhdGEzMikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogZnJlZSB0aGUgb2xkIHNuYXBzaG90IHRhYmxlICovCisgICAgcWNvdzJfZnJlZV9jbHVzdGVycyhicywgcy0+c25hcHNob3RzX29mZnNldCwgcy0+c25hcHNob3RzX3NpemUpOworICAgIHMtPnNuYXBzaG90c19vZmZzZXQgPSBzbmFwc2hvdHNfb2Zmc2V0OworICAgIHMtPnNuYXBzaG90c19zaXplID0gc25hcHNob3RzX3NpemU7CisgICAgcmV0dXJuIDA7CisgZmFpbDoKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmRfbmV3X3NuYXBzaG90X2lkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaWRfc3RyLCBpbnQgaWRfc3RyX3NpemUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgUUNvd1NuYXBzaG90ICpzbjsKKyAgICBpbnQgaSwgaWQsIGlkX21heCA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBzbiA9IHMtPnNuYXBzaG90cyArIGk7CisgICAgICAgIGlkID0gc3RydG91bChzbi0+aWRfc3RyLCBOVUxMLCAxMCk7CisgICAgICAgIGlmIChpZCA+IGlkX21heCkKKyAgICAgICAgICAgIGlkX21heCA9IGlkOworICAgIH0KKyAgICBzbnByaW50ZihpZF9zdHIsIGlkX3N0cl9zaXplLCAiJWQiLCBpZF9tYXggKyAxKTsKK30KKworc3RhdGljIGludCBmaW5kX3NuYXBzaG90X2J5X2lkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICppZF9zdHIpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChzLT5zbmFwc2hvdHNbaV0uaWRfc3RyLCBpZF9zdHIpKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBmaW5kX3NuYXBzaG90X2J5X2lkX29yX25hbWUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGksIHJldDsKKworICAgIHJldCA9IGZpbmRfc25hcHNob3RfYnlfaWQoYnMsIG5hbWUpOworICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl9zbmFwc2hvdHM7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChzLT5zbmFwc2hvdHNbaV0ubmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKiBpZiBubyBpZCBpcyBwcm92aWRlZCwgYSBuZXcgb25lIGlzIGNvbnN0cnVjdGVkICovCitpbnQgcWNvdzJfc25hcHNob3RfY3JlYXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBRRU1VU25hcHNob3RJbmZvICpzbl9pbmZvKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIFFDb3dTbmFwc2hvdCAqc25hcHNob3RzMSwgc24xLCAqc24gPSAmc24xOworICAgIGludCBpLCByZXQ7CisgICAgdWludDY0X3QgKmwxX3RhYmxlID0gTlVMTDsKKyAgICBpbnQ2NF90IGwxX3RhYmxlX29mZnNldDsKKworICAgIG1lbXNldChzbiwgMCwgc2l6ZW9mKCpzbikpOworCisgICAgaWYgKHNuX2luZm8tPmlkX3N0clswXSA9PSAnXDAnKSB7CisgICAgICAgIC8qIGNvbXB1dGUgYSBuZXcgaWQgKi8KKyAgICAgICAgZmluZF9uZXdfc25hcHNob3RfaWQoYnMsIHNuX2luZm8tPmlkX3N0ciwgc2l6ZW9mKHNuX2luZm8tPmlkX3N0cikpOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgdGhlIElEIGlzIHVuaXF1ZSAqLworICAgIGlmIChmaW5kX3NuYXBzaG90X2J5X2lkKGJzLCBzbl9pbmZvLT5pZF9zdHIpID49IDApCisgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgc24tPmlkX3N0ciA9IGdfc3RyZHVwKHNuX2luZm8tPmlkX3N0cik7CisgICAgaWYgKCFzbi0+aWRfc3RyKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc24tPm5hbWUgPSBnX3N0cmR1cChzbl9pbmZvLT5uYW1lKTsKKyAgICBpZiAoIXNuLT5uYW1lKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc24tPnZtX3N0YXRlX3NpemUgPSBzbl9pbmZvLT52bV9zdGF0ZV9zaXplOworICAgIHNuLT5kYXRlX3NlYyA9IHNuX2luZm8tPmRhdGVfc2VjOworICAgIHNuLT5kYXRlX25zZWMgPSBzbl9pbmZvLT5kYXRlX25zZWM7CisgICAgc24tPnZtX2Nsb2NrX25zZWMgPSBzbl9pbmZvLT52bV9jbG9ja19uc2VjOworCisgICAgcmV0ID0gcWNvdzJfdXBkYXRlX3NuYXBzaG90X3JlZmNvdW50KGJzLCBzLT5sMV90YWJsZV9vZmZzZXQsIHMtPmwxX3NpemUsIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBjcmVhdGUgdGhlIEwxIHRhYmxlIG9mIHRoZSBzbmFwc2hvdCAqLworICAgIGwxX3RhYmxlX29mZnNldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJzKGJzLCBzLT5sMV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgaWYgKGwxX3RhYmxlX29mZnNldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHNuLT5sMV90YWJsZV9vZmZzZXQgPSBsMV90YWJsZV9vZmZzZXQ7CisgICAgc24tPmwxX3NpemUgPSBzLT5sMV9zaXplOworCisgICAgaWYgKHMtPmwxX3NpemUgIT0gMCkgeworICAgICAgICBsMV90YWJsZSA9IGdfbWFsbG9jKHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsMV90YWJsZSA9IE5VTEw7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bDFfc2l6ZTsgaSsrKSB7CisgICAgICAgIGwxX3RhYmxlW2ldID0gY3B1X3RvX2JlNjQocy0+bDFfdGFibGVbaV0pOworICAgIH0KKyAgICBpZiAoYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgc24tPmwxX3RhYmxlX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgbDFfdGFibGUsIHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBnX2ZyZWUobDFfdGFibGUpOworICAgIGwxX3RhYmxlID0gTlVMTDsKKworICAgIHNuYXBzaG90czEgPSBnX21hbGxvYygocy0+bmJfc25hcHNob3RzICsgMSkgKiBzaXplb2YoUUNvd1NuYXBzaG90KSk7CisgICAgaWYgKHMtPnNuYXBzaG90cykgeworICAgICAgICBtZW1jcHkoc25hcHNob3RzMSwgcy0+c25hcHNob3RzLCBzLT5uYl9zbmFwc2hvdHMgKiBzaXplb2YoUUNvd1NuYXBzaG90KSk7CisgICAgICAgIGdfZnJlZShzLT5zbmFwc2hvdHMpOworICAgIH0KKyAgICBzLT5zbmFwc2hvdHMgPSBzbmFwc2hvdHMxOworICAgIHMtPnNuYXBzaG90c1tzLT5uYl9zbmFwc2hvdHMrK10gPSAqc247CisKKyAgICBpZiAocWNvd193cml0ZV9zbmFwc2hvdHMoYnMpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworI2lmZGVmIERFQlVHX0FMTE9DCisgICAgcWNvdzJfY2hlY2tfcmVmY291bnRzKGJzKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZ19mcmVlKHNuLT5uYW1lKTsKKyAgICBnX2ZyZWUobDFfdGFibGUpOworICAgIHJldHVybiAtMTsKK30KKworLyogY29weSB0aGUgc25hcHNob3QgJ3NuYXBzaG90X25hbWUnIGludG8gdGhlIGN1cnJlbnQgZGlzayBpbWFnZSAqLworaW50IHFjb3cyX3NuYXBzaG90X2dvdG8oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIFFDb3dTbmFwc2hvdCAqc247CisgICAgaW50IGksIHNuYXBzaG90X2luZGV4LCBsMV9zaXplMjsKKworICAgIHNuYXBzaG90X2luZGV4ID0gZmluZF9zbmFwc2hvdF9ieV9pZF9vcl9uYW1lKGJzLCBzbmFwc2hvdF9pZCk7CisgICAgaWYgKHNuYXBzaG90X2luZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgc24gPSAmcy0+c25hcHNob3RzW3NuYXBzaG90X2luZGV4XTsKKworICAgIGlmIChxY293Ml91cGRhdGVfc25hcHNob3RfcmVmY291bnQoYnMsIHMtPmwxX3RhYmxlX29mZnNldCwgcy0+bDFfc2l6ZSwgLTEpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHFjb3cyX2dyb3dfbDFfdGFibGUoYnMsIHNuLT5sMV9zaXplKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmwxX3NpemUgPSBzbi0+bDFfc2l6ZTsKKyAgICBsMV9zaXplMiA9IHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpOworICAgIC8qIGNvcHkgdGhlIHNuYXBzaG90IGwxIHRhYmxlIHRvIHRoZSBjdXJyZW50IGwxIHRhYmxlICovCisgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIHNuLT5sMV90YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgcy0+bDFfdGFibGUsIGwxX3NpemUyKSAhPSBsMV9zaXplMikKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChiZHJ2X3B3cml0ZV9zeW5jKGJzLT5maWxlLCBzLT5sMV90YWJsZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHMtPmwxX3RhYmxlLCBsMV9zaXplMikgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZm9yKGkgPSAwO2kgPCBzLT5sMV9zaXplOyBpKyspIHsKKyAgICAgICAgYmU2NF90b19jcHVzKCZzLT5sMV90YWJsZVtpXSk7CisgICAgfQorCisgICAgaWYgKHFjb3cyX3VwZGF0ZV9zbmFwc2hvdF9yZWZjb3VudChicywgcy0+bDFfdGFibGVfb2Zmc2V0LCBzLT5sMV9zaXplLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworI2lmZGVmIERFQlVHX0FMTE9DCisgICAgcWNvdzJfY2hlY2tfcmVmY291bnRzKGJzKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworIGZhaWw6CisgICAgcmV0dXJuIC1FSU87Cit9CisKK2ludCBxY293Ml9zbmFwc2hvdF9kZWxldGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIFFDb3dTbmFwc2hvdCAqc247CisgICAgaW50IHNuYXBzaG90X2luZGV4LCByZXQ7CisKKyAgICBzbmFwc2hvdF9pbmRleCA9IGZpbmRfc25hcHNob3RfYnlfaWRfb3JfbmFtZShicywgc25hcHNob3RfaWQpOworICAgIGlmIChzbmFwc2hvdF9pbmRleCA8IDApCisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIHNuID0gJnMtPnNuYXBzaG90c1tzbmFwc2hvdF9pbmRleF07CisKKyAgICByZXQgPSBxY293Ml91cGRhdGVfc25hcHNob3RfcmVmY291bnQoYnMsIHNuLT5sMV90YWJsZV9vZmZzZXQsIHNuLT5sMV9zaXplLCAtMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLyogbXVzdCB1cGRhdGUgdGhlIGNvcGllZCBmbGFnIG9uIHRoZSBjdXJyZW50IGNsdXN0ZXIgb2Zmc2V0cyAqLworICAgIHJldCA9IHFjb3cyX3VwZGF0ZV9zbmFwc2hvdF9yZWZjb3VudChicywgcy0+bDFfdGFibGVfb2Zmc2V0LCBzLT5sMV9zaXplLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBxY293Ml9mcmVlX2NsdXN0ZXJzKGJzLCBzbi0+bDFfdGFibGVfb2Zmc2V0LCBzbi0+bDFfc2l6ZSAqIHNpemVvZih1aW50NjRfdCkpOworCisgICAgZ19mcmVlKHNuLT5pZF9zdHIpOworICAgIGdfZnJlZShzbi0+bmFtZSk7CisgICAgbWVtbW92ZShzbiwgc24gKyAxLCAocy0+bmJfc25hcHNob3RzIC0gc25hcHNob3RfaW5kZXggLSAxKSAqIHNpemVvZigqc24pKTsKKyAgICBzLT5uYl9zbmFwc2hvdHMtLTsKKyAgICByZXQgPSBxY293X3dyaXRlX3NuYXBzaG90cyhicyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgLyogWFhYOiByZXN0b3JlIHNuYXBzaG90IGlmIGVycm9yID8gKi8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisjaWZkZWYgREVCVUdfQUxMT0MKKyAgICBxY293Ml9jaGVja19yZWZjb3VudHMoYnMpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBxY293Ml9zbmFwc2hvdF9saXN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBRRU1VU25hcHNob3RJbmZvICoqcHNuX3RhYikKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBRRU1VU25hcHNob3RJbmZvICpzbl90YWIsICpzbl9pbmZvOworICAgIFFDb3dTbmFwc2hvdCAqc247CisgICAgaW50IGk7CisKKyAgICBpZiAoIXMtPm5iX3NuYXBzaG90cykgeworICAgICAgICAqcHNuX3RhYiA9IE5VTEw7CisgICAgICAgIHJldHVybiBzLT5uYl9zbmFwc2hvdHM7CisgICAgfQorCisgICAgc25fdGFiID0gZ19tYWxsb2MwKHMtPm5iX3NuYXBzaG90cyAqIHNpemVvZihRRU1VU25hcHNob3RJbmZvKSk7CisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bmJfc25hcHNob3RzOyBpKyspIHsKKyAgICAgICAgc25faW5mbyA9IHNuX3RhYiArIGk7CisgICAgICAgIHNuID0gcy0+c25hcHNob3RzICsgaTsKKyAgICAgICAgcHN0cmNweShzbl9pbmZvLT5pZF9zdHIsIHNpemVvZihzbl9pbmZvLT5pZF9zdHIpLAorICAgICAgICAgICAgICAgIHNuLT5pZF9zdHIpOworICAgICAgICBwc3RyY3B5KHNuX2luZm8tPm5hbWUsIHNpemVvZihzbl9pbmZvLT5uYW1lKSwKKyAgICAgICAgICAgICAgICBzbi0+bmFtZSk7CisgICAgICAgIHNuX2luZm8tPnZtX3N0YXRlX3NpemUgPSBzbi0+dm1fc3RhdGVfc2l6ZTsKKyAgICAgICAgc25faW5mby0+ZGF0ZV9zZWMgPSBzbi0+ZGF0ZV9zZWM7CisgICAgICAgIHNuX2luZm8tPmRhdGVfbnNlYyA9IHNuLT5kYXRlX25zZWM7CisgICAgICAgIHNuX2luZm8tPnZtX2Nsb2NrX25zZWMgPSBzbi0+dm1fY2xvY2tfbnNlYzsKKyAgICB9CisgICAgKnBzbl90YWIgPSBzbl90YWI7CisgICAgcmV0dXJuIHMtPm5iX3NuYXBzaG90czsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ibG9jay9xY293Mi5jIGIvYW5kcm9pZC9xZW11MS9ibG9jay9xY293Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNjA3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Fjb3cyLmMKQEAgLTAsMCArMSwxMzcxIEBACisvKgorICogQmxvY2sgZHJpdmVyIGZvciB0aGUgUUNPVyB2ZXJzaW9uIDIgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJibG9jay9ibG9ja19pbnQuaCIKKyNpbmNsdWRlICJxZW11L21vZHVsZS5oIgorI2luY2x1ZGUgPHpsaWIuaD4KKyNpbmNsdWRlICJxZW11L2Flcy5oIgorI2luY2x1ZGUgImJsb2NrL3Fjb3cyLmgiCisKKy8qCisgIERpZmZlcmVuY2VzIHdpdGggUUNPVzoKKworICAtIFN1cHBvcnQgZm9yIG11bHRpcGxlIGluY3JlbWVudGFsIHNuYXBzaG90cy4KKyAgLSBNZW1vcnkgbWFuYWdlbWVudCBieSByZWZlcmVuY2UgY291bnRzLgorICAtIENsdXN0ZXJzIHdoaWNoIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2Ygb25lIGhhdmUgdGhlIGJpdAorICAgIFFDT1dfT0ZMQUdfQ09QSUVEIHRvIG9wdGltaXplIHdyaXRlIHBlcmZvcm1hbmNlLgorICAtIFNpemUgb2YgY29tcHJlc3NlZCBjbHVzdGVycyBpcyBzdG9yZWQgaW4gc2VjdG9ycyB0byByZWR1Y2UgYml0IHVzYWdlCisgICAgaW4gdGhlIGNsdXN0ZXIgb2Zmc2V0cy4KKyAgLSBTdXBwb3J0IGZvciBzdG9yaW5nIGFkZGl0aW9uYWwgZGF0YSAoc3VjaCBhcyB0aGUgVk0gc3RhdGUpIGluIHRoZQorICAgIHNuYXBzaG90cy4KKyAgLSBJZiBhIGJhY2tpbmcgc3RvcmUgaXMgdXNlZCwgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBub3QgY29uc3RyYWluZWQKKyAgICAoY291bGQgYmUgYmFja3BvcnRlZCB0byBRQ09XKS4KKyAgLSBMMiB0YWJsZXMgaGF2ZSBhbHdheXMgYSBzaXplIG9mIG9uZSBjbHVzdGVyLgorKi8KKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgbWFnaWM7CisgICAgdWludDMyX3QgbGVuOworfSBRQ293RXh0ZW5zaW9uOworI2RlZmluZSAgUUNPV19FWFRfTUFHSUNfRU5EIDAKKyNkZWZpbmUgIFFDT1dfRVhUX01BR0lDX0JBQ0tJTkdfRk9STUFUIDB4RTI3OTJBQ0EKKworc3RhdGljIGludCBxY293X3Byb2JlKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBjb25zdCBRQ293SGVhZGVyICpjb3dfaGVhZGVyID0gKGNvbnN0IHZvaWQgKilidWY7CisKKyAgICBpZiAoYnVmX3NpemUgPj0gc2l6ZW9mKFFDb3dIZWFkZXIpICYmCisgICAgICAgIGJlMzJfdG9fY3B1KGNvd19oZWFkZXItPm1hZ2ljKSA9PSBRQ09XX01BR0lDICYmCisgICAgICAgIGJlMzJfdG9fY3B1KGNvd19oZWFkZXItPnZlcnNpb24pID09IFFDT1dfVkVSU0lPTikKKyAgICAgICAgcmV0dXJuIDEwMDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qCisgKiByZWFkIHFjb3cyIGV4dGVuc2lvbiBhbmQgZmlsbCBicworICogc3RhcnQgcmVhZGluZyBmcm9tIHN0YXJ0X29mZnNldAorICogZmluaXNoIHJlYWRpbmcgdXBvbiBtYWdpYyBvZiB2YWx1ZSAwIG9yIHdoZW4gZW5kX29mZnNldCByZWFjaGVkCisgKiB1bmtub3duIG1hZ2ljIGlzIHNraXBwZWQgKGZ1dHVyZSBleHRlbnNpb24gdGhpcyB2ZXJzaW9uIGtub3dzIG5vdGhpbmcgYWJvdXQpCisgKiByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MsIG5vbi0wIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHFjb3dfcmVhZF9leHRlbnNpb25zKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50NjRfdCBzdGFydF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGVuZF9vZmZzZXQpCit7CisgICAgUUNvd0V4dGVuc2lvbiBleHQ7CisgICAgdWludDY0X3Qgb2Zmc2V0OworCisjaWZkZWYgREVCVUdfRVhUCisgICAgcHJpbnRmKCJxY293X3JlYWRfZXh0ZW5zaW9uczogc3RhcnQ9JWxkIGVuZD0lbGRcbiIsIHN0YXJ0X29mZnNldCwgZW5kX29mZnNldCk7CisjZW5kaWYKKyAgICBvZmZzZXQgPSBzdGFydF9vZmZzZXQ7CisgICAgd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpIHsKKworI2lmZGVmIERFQlVHX0VYVAorICAgICAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICAgICAgaWYgKG9mZnNldCA+IHMtPmNsdXN0ZXJfc2l6ZSkKKyAgICAgICAgICAgIHByaW50ZigicWNvd19oYW5kbGVfZXh0ZW5zaW9uOiBzdXNwaWNpb3VzIG9mZnNldCAlbHVcbiIsIG9mZnNldCk7CisKKyAgICAgICAgcHJpbnRmKCJhdHRlbXRpbmcgdG8gcmVhZCBleHRlbmRlZCBoZWFkZXIgaW4gb2Zmc2V0ICVsdVxuIiwgb2Zmc2V0KTsKKyNlbmRpZgorCisgICAgICAgIGlmIChiZHJ2X3ByZWFkKGJzLT5maWxlLCBvZmZzZXQsICZleHQsIHNpemVvZihleHQpKSAhPSBzaXplb2YoZXh0KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxY293X2hhbmRsZV9leHRlbnNpb246IEVSUk9SOiAiCisgICAgICAgICAgICAgICAgICAgICJwcmVhZCBmYWlsIGZyb20gb2Zmc2V0ICUiIFBSSXU2NCAiXG4iLAorICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgYmUzMl90b19jcHVzKCZleHQubWFnaWMpOworICAgICAgICBiZTMyX3RvX2NwdXMoJmV4dC5sZW4pOworICAgICAgICBvZmZzZXQgKz0gc2l6ZW9mKGV4dCk7CisjaWZkZWYgREVCVUdfRVhUCisgICAgICAgIHByaW50ZigiZXh0Lm1hZ2ljID0gMHgleFxuIiwgZXh0Lm1hZ2ljKTsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKGV4dC5tYWdpYykgeworICAgICAgICBjYXNlIFFDT1dfRVhUX01BR0lDX0VORDoKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgUUNPV19FWFRfTUFHSUNfQkFDS0lOR19GT1JNQVQ6CisgICAgICAgICAgICBpZiAoZXh0LmxlbiA+PSBzaXplb2YoYnMtPmJhY2tpbmdfZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IGV4dF9iYWNraW5nX2Zvcm1hdDogbGVuPSV1IHRvbyBsYXJnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKD49JXp1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dC5sZW4sIHNpemVvZihicy0+YmFja2luZ19mb3JtYXQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiZHJ2X3ByZWFkKGJzLT5maWxlLCBvZmZzZXQgLCBicy0+YmFja2luZ19mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQubGVuKSAhPSBleHQubGVuKQorICAgICAgICAgICAgICAgIHJldHVybiAzOworICAgICAgICAgICAgYnMtPmJhY2tpbmdfZm9ybWF0W2V4dC5sZW5dID0gJ1wwJzsKKyNpZmRlZiBERUJVR19FWFQKKyAgICAgICAgICAgIHByaW50ZigiUWNvdzI6IEdvdCBmb3JtYXQgZXh0ZW5zaW9uICVzXG4iLCBicy0+YmFja2luZ19mb3JtYXQpOworI2VuZGlmCisgICAgICAgICAgICBvZmZzZXQgPSAoKG9mZnNldCArIGV4dC5sZW4gKyA3KSAmIH43KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiB1bmtub3duIG1hZ2ljIC0tIGp1c3Qgc2tpcCBpdCAqLworICAgICAgICAgICAgb2Zmc2V0ID0gKChvZmZzZXQgKyBleHQubGVuICsgNykgJiB+Nyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcWNvd19vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgZmxhZ3MpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGxlbiwgaTsKKyAgICBRQ293SGVhZGVyIGhlYWRlcjsKKyAgICB1aW50NjRfdCBleHRfZW5kOworCisgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIDAsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIGJlMzJfdG9fY3B1cygmaGVhZGVyLm1hZ2ljKTsKKyAgICBiZTMyX3RvX2NwdXMoJmhlYWRlci52ZXJzaW9uKTsKKyAgICBiZTY0X3RvX2NwdXMoJmhlYWRlci5iYWNraW5nX2ZpbGVfb2Zmc2V0KTsKKyAgICBiZTMyX3RvX2NwdXMoJmhlYWRlci5iYWNraW5nX2ZpbGVfc2l6ZSk7CisgICAgYmU2NF90b19jcHVzKCZoZWFkZXIuc2l6ZSk7CisgICAgYmUzMl90b19jcHVzKCZoZWFkZXIuY2x1c3Rlcl9iaXRzKTsKKyAgICBiZTMyX3RvX2NwdXMoJmhlYWRlci5jcnlwdF9tZXRob2QpOworICAgIGJlNjRfdG9fY3B1cygmaGVhZGVyLmwxX3RhYmxlX29mZnNldCk7CisgICAgYmUzMl90b19jcHVzKCZoZWFkZXIubDFfc2l6ZSk7CisgICAgYmU2NF90b19jcHVzKCZoZWFkZXIucmVmY291bnRfdGFibGVfb2Zmc2V0KTsKKyAgICBiZTMyX3RvX2NwdXMoJmhlYWRlci5yZWZjb3VudF90YWJsZV9jbHVzdGVycyk7CisgICAgYmU2NF90b19jcHVzKCZoZWFkZXIuc25hcHNob3RzX29mZnNldCk7CisgICAgYmUzMl90b19jcHVzKCZoZWFkZXIubmJfc25hcHNob3RzKTsKKworICAgIGlmIChoZWFkZXIubWFnaWMgIT0gUUNPV19NQUdJQyB8fCBoZWFkZXIudmVyc2lvbiAhPSBRQ09XX1ZFUlNJT04pCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoaGVhZGVyLmNsdXN0ZXJfYml0cyA8IE1JTl9DTFVTVEVSX0JJVFMgfHwKKyAgICAgICAgaGVhZGVyLmNsdXN0ZXJfYml0cyA+IE1BWF9DTFVTVEVSX0JJVFMpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoaGVhZGVyLmNyeXB0X21ldGhvZCA+IFFDT1dfQ1JZUFRfQUVTKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcy0+Y3J5cHRfbWV0aG9kX2hlYWRlciA9IGhlYWRlci5jcnlwdF9tZXRob2Q7CisgICAgaWYgKHMtPmNyeXB0X21ldGhvZF9oZWFkZXIpCisgICAgICAgIGJzLT5lbmNyeXB0ZWQgPSAxOworICAgIHMtPmNsdXN0ZXJfYml0cyA9IGhlYWRlci5jbHVzdGVyX2JpdHM7CisgICAgcy0+Y2x1c3Rlcl9zaXplID0gMSA8PCBzLT5jbHVzdGVyX2JpdHM7CisgICAgcy0+Y2x1c3Rlcl9zZWN0b3JzID0gMSA8PCAocy0+Y2x1c3Rlcl9iaXRzIC0gOSk7CisgICAgcy0+bDJfYml0cyA9IHMtPmNsdXN0ZXJfYml0cyAtIDM7IC8qIEwyIGlzIGFsd2F5cyBvbmUgY2x1c3RlciAqLworICAgIHMtPmwyX3NpemUgPSAxIDw8IHMtPmwyX2JpdHM7CisgICAgYnMtPnRvdGFsX3NlY3RvcnMgPSBoZWFkZXIuc2l6ZSAvIDUxMjsKKyAgICBzLT5jc2l6ZV9zaGlmdCA9ICg2MiAtIChzLT5jbHVzdGVyX2JpdHMgLSA4KSk7CisgICAgcy0+Y3NpemVfbWFzayA9ICgxIDw8IChzLT5jbHVzdGVyX2JpdHMgLSA4KSkgLSAxOworICAgIHMtPmNsdXN0ZXJfb2Zmc2V0X21hc2sgPSAoMUxMIDw8IHMtPmNzaXplX3NoaWZ0KSAtIDE7CisgICAgcy0+cmVmY291bnRfdGFibGVfb2Zmc2V0ID0gaGVhZGVyLnJlZmNvdW50X3RhYmxlX29mZnNldDsKKyAgICBzLT5yZWZjb3VudF90YWJsZV9zaXplID0KKyAgICAgICAgaGVhZGVyLnJlZmNvdW50X3RhYmxlX2NsdXN0ZXJzIDw8IChzLT5jbHVzdGVyX2JpdHMgLSAzKTsKKworICAgIHMtPnNuYXBzaG90c19vZmZzZXQgPSBoZWFkZXIuc25hcHNob3RzX29mZnNldDsKKyAgICBzLT5uYl9zbmFwc2hvdHMgPSBoZWFkZXIubmJfc25hcHNob3RzOworCisgICAgLyogcmVhZCB0aGUgbGV2ZWwgMSB0YWJsZSAqLworICAgIHMtPmwxX3NpemUgPSBoZWFkZXIubDFfc2l6ZTsKKyAgICBzLT5sMV92bV9zdGF0ZV9pbmRleCA9IHNpemVfdG9fbDEocywgaGVhZGVyLnNpemUpOworICAgIC8qIHRoZSBMMSB0YWJsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgZW5vdWdoIGVudHJpZXMgdG8gcHV0CisgICAgICAgaGVhZGVyLnNpemUgYnl0ZXMgKi8KKyAgICBpZiAocy0+bDFfc2l6ZSA8IHMtPmwxX3ZtX3N0YXRlX2luZGV4KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcy0+bDFfdGFibGVfb2Zmc2V0ID0gaGVhZGVyLmwxX3RhYmxlX29mZnNldDsKKyAgICBpZiAocy0+bDFfc2l6ZSA+IDApIHsKKyAgICAgICAgcy0+bDFfdGFibGUgPSBnX21hbGxvYzAoCisgICAgICAgICAgICBhbGlnbl9vZmZzZXQocy0+bDFfc2l6ZSAqIHNpemVvZih1aW50NjRfdCksIDUxMikpOworICAgICAgICBpZiAoYmRydl9wcmVhZChicy0+ZmlsZSwgcy0+bDFfdGFibGVfb2Zmc2V0LCBzLT5sMV90YWJsZSwgcy0+bDFfc2l6ZSAqIHNpemVvZih1aW50NjRfdCkpICE9CisgICAgICAgICAgICBzLT5sMV9zaXplICogc2l6ZW9mKHVpbnQ2NF90KSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZm9yKGkgPSAwO2kgPCBzLT5sMV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGJlNjRfdG9fY3B1cygmcy0+bDFfdGFibGVbaV0pOworICAgICAgICB9CisgICAgfQorICAgIC8qIGFsbG9jIEwyIGNhY2hlICovCisgICAgcy0+bDJfY2FjaGUgPSBnX21hbGxvYyhzLT5sMl9zaXplICogTDJfQ0FDSEVfU0laRSAqIHNpemVvZih1aW50NjRfdCkpOworICAgIHMtPmNsdXN0ZXJfY2FjaGUgPSBnX21hbGxvYyhzLT5jbHVzdGVyX3NpemUpOworICAgIC8qIG9uZSBtb3JlIHNlY3RvciBmb3IgZGVjb21wcmVzc2VkIGRhdGEgYWxpZ25tZW50ICovCisgICAgcy0+Y2x1c3Rlcl9kYXRhID0gZ19tYWxsb2MoUUNPV19NQVhfQ1JZUFRfQ0xVU1RFUlMgKiBzLT5jbHVzdGVyX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDUxMik7CisgICAgcy0+Y2x1c3Rlcl9jYWNoZV9vZmZzZXQgPSAtMTsKKworICAgIGlmIChxY293Ml9yZWZjb3VudF9pbml0KGJzKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIFFMSVNUX0lOSVQoJnMtPmNsdXN0ZXJfYWxsb2NzKTsKKworICAgIC8qIHJlYWQgcWNvdzIgZXh0ZW5zaW9ucyAqLworICAgIGlmIChoZWFkZXIuYmFja2luZ19maWxlX29mZnNldCkKKyAgICAgICAgZXh0X2VuZCA9IGhlYWRlci5iYWNraW5nX2ZpbGVfb2Zmc2V0OworICAgIGVsc2UKKyAgICAgICAgZXh0X2VuZCA9IHMtPmNsdXN0ZXJfc2l6ZTsKKyAgICBpZiAocWNvd19yZWFkX2V4dGVuc2lvbnMoYnMsIHNpemVvZihoZWFkZXIpLCBleHRfZW5kKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogcmVhZCB0aGUgYmFja2luZyBmaWxlIG5hbWUgKi8KKyAgICBpZiAoaGVhZGVyLmJhY2tpbmdfZmlsZV9vZmZzZXQgIT0gMCkgeworICAgICAgICBsZW4gPSBoZWFkZXIuYmFja2luZ19maWxlX3NpemU7CisgICAgICAgIGlmIChsZW4gPiAxMDIzKQorICAgICAgICAgICAgbGVuID0gMTAyMzsKKyAgICAgICAgaWYgKGJkcnZfcHJlYWQoYnMtPmZpbGUsIGhlYWRlci5iYWNraW5nX2ZpbGVfb2Zmc2V0LCBicy0+YmFja2luZ19maWxlLCBsZW4pICE9IGxlbikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYnMtPmJhY2tpbmdfZmlsZVtsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgaWYgKHFjb3cyX3JlYWRfc25hcHNob3RzKGJzKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworI2lmZGVmIERFQlVHX0FMTE9DCisgICAgcWNvdzJfY2hlY2tfcmVmY291bnRzKGJzKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworCisgZmFpbDoKKyAgICBxY293Ml9mcmVlX3NuYXBzaG90cyhicyk7CisgICAgcWNvdzJfcmVmY291bnRfY2xvc2UoYnMpOworICAgIGdfZnJlZShzLT5sMV90YWJsZSk7CisgICAgZ19mcmVlKHMtPmwyX2NhY2hlKTsKKyAgICBnX2ZyZWUocy0+Y2x1c3Rlcl9jYWNoZSk7CisgICAgZ19mcmVlKHMtPmNsdXN0ZXJfZGF0YSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHFjb3dfc2V0X2tleShCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqa2V5KQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQ4X3Qga2V5YnVmWzE2XTsKKyAgICBpbnQgbGVuLCBpOworCisgICAgbWVtc2V0KGtleWJ1ZiwgMCwgMTYpOworICAgIGxlbiA9IHN0cmxlbihrZXkpOworICAgIGlmIChsZW4gPiAxNikKKyAgICAgICAgbGVuID0gMTY7CisgICAgLyogWFhYOiB3ZSBjb3VsZCBjb21wcmVzcyB0aGUgY2hhcnMgdG8gNyBiaXRzIHRvIGluY3JlYXNlCisgICAgICAgZW50cm9weSAqLworICAgIGZvcihpID0gMDtpIDwgbGVuO2krKykgeworICAgICAgICBrZXlidWZbaV0gPSBrZXlbaV07CisgICAgfQorICAgIHMtPmNyeXB0X21ldGhvZCA9IHMtPmNyeXB0X21ldGhvZF9oZWFkZXI7CisKKyAgICBpZiAoQUVTX3NldF9lbmNyeXB0X2tleShrZXlidWYsIDEyOCwgJnMtPmFlc19lbmNyeXB0X2tleSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChBRVNfc2V0X2RlY3J5cHRfa2V5KGtleWJ1ZiwgMTI4LCAmcy0+YWVzX2RlY3J5cHRfa2V5KSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisjaWYgMAorICAgIC8qIHRlc3QgKi8KKyAgICB7CisgICAgICAgIHVpbnQ4X3QgaW5bMTZdOworICAgICAgICB1aW50OF90IG91dFsxNl07CisgICAgICAgIHVpbnQ4X3QgdG1wWzE2XTsKKyAgICAgICAgZm9yKGk9MDtpPDE2O2krKykKKyAgICAgICAgICAgIGluW2ldID0gaTsKKyAgICAgICAgQUVTX2VuY3J5cHQoaW4sIHRtcCwgJnMtPmFlc19lbmNyeXB0X2tleSk7CisgICAgICAgIEFFU19kZWNyeXB0KHRtcCwgb3V0LCAmcy0+YWVzX2RlY3J5cHRfa2V5KTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHByaW50ZigiICUwMngiLCB0bXBbaV0pOworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBwcmludGYoIiAlMDJ4Iiwgb3V0W2ldKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjb3dfaXNfYWxsb2NhdGVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zZWN0b3JzLCBpbnQgKnBudW0pCit7CisgICAgdWludDY0X3QgY2x1c3Rlcl9vZmZzZXQ7CisgICAgaW50IHJldDsKKworICAgICpwbnVtID0gbmJfc2VjdG9yczsKKyAgICAvKiBGSVhNRSBXZSBjYW4gZ2V0IGVycm9ycyBoZXJlLCBidXQgdGhlIGJkcnZfaXNfYWxsb2NhdGVkIGludGVyZmFjZSBjYW4ndAorICAgICAqIHBhc3MgdGhlbSBvbiB0b2RheSAqLworICAgIHJldCA9IHFjb3cyX2dldF9jbHVzdGVyX29mZnNldChicywgc2VjdG9yX251bSA8PCA5LCBwbnVtLCAmY2x1c3Rlcl9vZmZzZXQpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICpwbnVtID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gKGNsdXN0ZXJfb2Zmc2V0ICE9IDApOworfQorCisvKiBoYW5kbGUgcmVhZGluZyBhZnRlciB0aGUgZW5kIG9mIHRoZSBiYWNraW5nIGZpbGUgKi8KK2ludCBxY293Ml9iYWNraW5nX3JlYWQxKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKQoreworICAgIGludCBuMTsKKyAgICBpZiAoKHNlY3Rvcl9udW0gKyBuYl9zZWN0b3JzKSA8PSBicy0+dG90YWxfc2VjdG9ycykKKyAgICAgICAgcmV0dXJuIG5iX3NlY3RvcnM7CisgICAgaWYgKHNlY3Rvcl9udW0gPj0gYnMtPnRvdGFsX3NlY3RvcnMpCisgICAgICAgIG4xID0gMDsKKyAgICBlbHNlCisgICAgICAgIG4xID0gYnMtPnRvdGFsX3NlY3RvcnMgLSBzZWN0b3JfbnVtOworICAgIG1lbXNldChidWYgKyBuMSAqIDUxMiwgMCwgNTEyICogKG5iX3NlY3RvcnMgLSBuMSkpOworICAgIHJldHVybiBuMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgUUNvd0FJT0NCIHsKKyAgICBCbG9ja0RyaXZlckFJT0NCIGNvbW1vbjsKKyAgICBpbnQ2NF90IHNlY3Rvcl9udW07CisgICAgUUVNVUlPVmVjdG9yICpxaW92OworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICB2b2lkICpvcmlnX2J1ZjsKKyAgICBpbnQgcmVtYWluaW5nX3NlY3RvcnM7CisgICAgaW50IGN1cl9ucl9zZWN0b3JzOwkvKiBudW1iZXIgb2Ygc2VjdG9ycyBpbiBjdXJyZW50IGl0ZXJhdGlvbiAqLworICAgIHVpbnQ2NF90IGNsdXN0ZXJfb2Zmc2V0OworICAgIHVpbnQ4X3QgKmNsdXN0ZXJfZGF0YTsKKyAgICBCbG9ja0RyaXZlckFJT0NCICpoZF9haW9jYjsKKyAgICBzdHJ1Y3QgaW92ZWMgaGRfaW92OworICAgIFFFTVVJT1ZlY3RvciBoZF9xaW92OworICAgIFFFTVVCSCAqYmg7CisgICAgUUNvd0wyTWV0YSBsMm1ldGE7CisgICAgUUxJU1RfRU5UUlkoUUNvd0FJT0NCKSBuZXh0X2RlcGVuZDsKK30gUUNvd0FJT0NCOworCitzdGF0aWMgdm9pZCBxY293X2Fpb19jYW5jZWwoQmxvY2tEcml2ZXJBSU9DQiAqYmxvY2thY2IpCit7CisgICAgUUNvd0FJT0NCICphY2IgPSBjb250YWluZXJfb2YoYmxvY2thY2IsIFFDb3dBSU9DQiwgY29tbW9uKTsKKyAgICBpZiAoYWNiLT5oZF9haW9jYikKKyAgICAgICAgYmRydl9haW9fY2FuY2VsKGFjYi0+aGRfYWlvY2IpOworICAgIHFlbXVfYWlvX3JlbGVhc2UoYWNiKTsKK30KKworc3RhdGljIEFJT1Bvb2wgcWNvd19haW9fcG9vbCA9IHsKKyAgICAuYWlvY2Jfc2l6ZSAgICAgICAgID0gc2l6ZW9mKFFDb3dBSU9DQiksCisgICAgLmNhbmNlbCAgICAgICAgICAgICA9IHFjb3dfYWlvX2NhbmNlbCwKK307CisKK3N0YXRpYyB2b2lkIHFjb3dfYWlvX3JlYWRfY2Iodm9pZCAqb3BhcXVlLCBpbnQgcmV0KTsKK3N0YXRpYyB2b2lkIHFjb3dfYWlvX3JlYWRfYmgodm9pZCAqb3BhcXVlKQoreworICAgIFFDb3dBSU9DQiAqYWNiID0gb3BhcXVlOworICAgIHFlbXVfYmhfZGVsZXRlKGFjYi0+YmgpOworICAgIGFjYi0+YmggPSBOVUxMOworICAgIHFjb3dfYWlvX3JlYWRfY2Iob3BhcXVlLCAwKTsKK30KKworc3RhdGljIGludCBxY293X3NjaGVkdWxlX2JoKFFFTVVCSEZ1bmMgKmNiLCBRQ293QUlPQ0IgKmFjYikKK3sKKyAgICBpZiAoYWNiLT5iaCkKKyAgICAgICAgcmV0dXJuIC1FSU87CisKKyAgICBhY2ItPmJoID0gcWVtdV9iaF9uZXcoY2IsIGFjYik7CisgICAgaWYgKCFhY2ItPmJoKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIHFlbXVfYmhfc2NoZWR1bGUoYWNiLT5iaCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNvd19haW9fcmVhZF9jYih2b2lkICpvcGFxdWUsIGludCByZXQpCit7CisgICAgUUNvd0FJT0NCICphY2IgPSBvcGFxdWU7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnMgPSBhY2ItPmNvbW1vbi5iczsKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgaW5kZXhfaW5fY2x1c3RlciwgbjE7CisKKyAgICBhY2ItPmhkX2Fpb2NiID0gTlVMTDsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBkb25lOworCisgICAgLyogcG9zdCBwcm9jZXNzIHRoZSByZWFkIGJ1ZmZlciAqLworICAgIGlmICghYWNiLT5jbHVzdGVyX29mZnNldCkgeworICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgfSBlbHNlIGlmIChhY2ItPmNsdXN0ZXJfb2Zmc2V0ICYgUUNPV19PRkxBR19DT01QUkVTU0VEKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+Y3J5cHRfbWV0aG9kKSB7CisgICAgICAgICAgICBxY293Ml9lbmNyeXB0X3NlY3RvcnMocywgYWNiLT5zZWN0b3JfbnVtLCBhY2ItPmJ1ZiwgYWNiLT5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNiLT5jdXJfbnJfc2VjdG9ycywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+YWVzX2RlY3J5cHRfa2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFjYi0+cmVtYWluaW5nX3NlY3RvcnMgLT0gYWNiLT5jdXJfbnJfc2VjdG9yczsKKyAgICBhY2ItPnNlY3Rvcl9udW0gKz0gYWNiLT5jdXJfbnJfc2VjdG9yczsKKyAgICBhY2ItPmJ1ZiArPSBhY2ItPmN1cl9ucl9zZWN0b3JzICogNTEyOworCisgICAgaWYgKGFjYi0+cmVtYWluaW5nX3NlY3RvcnMgPT0gMCkgeworICAgICAgICAvKiByZXF1ZXN0IGNvbXBsZXRlZCAqLworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogcHJlcGFyZSBuZXh0IEFJTyByZXF1ZXN0ICovCisgICAgYWNiLT5jdXJfbnJfc2VjdG9ycyA9IGFjYi0+cmVtYWluaW5nX3NlY3RvcnM7CisgICAgcmV0ID0gcWNvdzJfZ2V0X2NsdXN0ZXJfb2Zmc2V0KGJzLCBhY2ItPnNlY3Rvcl9udW0gPDwgOSwKKyAgICAgICAgJmFjYi0+Y3VyX25yX3NlY3RvcnMsICZhY2ItPmNsdXN0ZXJfb2Zmc2V0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaW5kZXhfaW5fY2x1c3RlciA9IGFjYi0+c2VjdG9yX251bSAmIChzLT5jbHVzdGVyX3NlY3RvcnMgLSAxKTsKKworICAgIGlmICghYWNiLT5jbHVzdGVyX29mZnNldCkgeworICAgICAgICBpZiAoYnMtPmJhY2tpbmdfaGQpIHsKKyAgICAgICAgICAgIC8qIHJlYWQgZnJvbSB0aGUgYmFzZSBpbWFnZSAqLworICAgICAgICAgICAgbjEgPSBxY293Ml9iYWNraW5nX3JlYWQxKGJzLT5iYWNraW5nX2hkLCBhY2ItPnNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNiLT5idWYsIGFjYi0+Y3VyX25yX3NlY3RvcnMpOworICAgICAgICAgICAgaWYgKG4xID4gMCkgeworICAgICAgICAgICAgICAgIGFjYi0+aGRfaW92Lmlvdl9iYXNlID0gKHZvaWQgKilhY2ItPmJ1ZjsKKyAgICAgICAgICAgICAgICBhY2ItPmhkX2lvdi5pb3ZfbGVuID0gYWNiLT5jdXJfbnJfc2VjdG9ycyAqIDUxMjsKKyAgICAgICAgICAgICAgICBxZW11X2lvdmVjX2luaXRfZXh0ZXJuYWwoJmFjYi0+aGRfcWlvdiwgJmFjYi0+aGRfaW92LCAxKTsKKyAgICAgICAgICAgICAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19SRUFEX0JBQ0tJTkdfQUlPKTsKKyAgICAgICAgICAgICAgICBhY2ItPmhkX2Fpb2NiID0gYmRydl9haW9fcmVhZHYoYnMtPmJhY2tpbmdfaGQsIGFjYi0+c2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2ItPmhkX3Fpb3YsIGFjYi0+Y3VyX25yX3NlY3RvcnMsCisJCQkJICAgIHFjb3dfYWlvX3JlYWRfY2IsIGFjYik7CisgICAgICAgICAgICAgICAgaWYgKGFjYi0+aGRfYWlvY2IgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBxY293X3NjaGVkdWxlX2JoKHFjb3dfYWlvX3JlYWRfYmgsIGFjYik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vdGU6IGluIHRoaXMgY2FzZSwgbm8gbmVlZCB0byB3YWl0ICovCisgICAgICAgICAgICBtZW1zZXQoYWNiLT5idWYsIDAsIDUxMiAqIGFjYi0+Y3VyX25yX3NlY3RvcnMpOworICAgICAgICAgICAgcmV0ID0gcWNvd19zY2hlZHVsZV9iaChxY293X2Fpb19yZWFkX2JoLCBhY2IpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhY2ItPmNsdXN0ZXJfb2Zmc2V0ICYgUUNPV19PRkxBR19DT01QUkVTU0VEKSB7CisgICAgICAgIC8qIGFkZCBBSU8gc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBibG9ja3MgPyAqLworICAgICAgICBpZiAocWNvdzJfZGVjb21wcmVzc19jbHVzdGVyKGJzLCBhY2ItPmNsdXN0ZXJfb2Zmc2V0KSA8IDApCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIG1lbWNweShhY2ItPmJ1Ziwgcy0+Y2x1c3Rlcl9jYWNoZSArIGluZGV4X2luX2NsdXN0ZXIgKiA1MTIsCisgICAgICAgICAgICAgICA1MTIgKiBhY2ItPmN1cl9ucl9zZWN0b3JzKTsKKyAgICAgICAgcmV0ID0gcWNvd19zY2hlZHVsZV9iaChxY293X2Fpb19yZWFkX2JoLCBhY2IpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGFjYi0+Y2x1c3Rlcl9vZmZzZXQgJiA1MTEpICE9IDApIHsKKyAgICAgICAgICAgIHJldCA9IC1FSU87CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBhY2ItPmhkX2lvdi5pb3ZfYmFzZSA9ICh2b2lkICopYWNiLT5idWY7CisgICAgICAgIGFjYi0+aGRfaW92Lmlvdl9sZW4gPSBhY2ItPmN1cl9ucl9zZWN0b3JzICogNTEyOworICAgICAgICBxZW11X2lvdmVjX2luaXRfZXh0ZXJuYWwoJmFjYi0+aGRfcWlvdiwgJmFjYi0+aGRfaW92LCAxKTsKKyAgICAgICAgQkxLREJHX0VWRU5UKGJzLT5maWxlLCBCTEtEQkdfUkVBRF9BSU8pOworICAgICAgICBhY2ItPmhkX2Fpb2NiID0gYmRydl9haW9fcmVhZHYoYnMtPmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjYi0+Y2x1c3Rlcl9vZmZzZXQgPj4gOSkgKyBpbmRleF9pbl9jbHVzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2ItPmhkX3Fpb3YsIGFjYi0+Y3VyX25yX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNvd19haW9fcmVhZF9jYiwgYWNiKTsKKyAgICAgICAgaWYgKGFjYi0+aGRfYWlvY2IgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gLUVJTzsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK2RvbmU6CisgICAgaWYgKGFjYi0+cWlvdi0+bmlvdiA+IDEpIHsKKyAgICAgICAgcWVtdV9pb3ZlY19mcm9tX2J1ZihhY2ItPnFpb3YsIDAsIGFjYi0+b3JpZ19idWYsIGFjYi0+cWlvdi0+c2l6ZSk7CisgICAgICAgIHFlbXVfdmZyZWUoYWNiLT5vcmlnX2J1Zik7CisgICAgfQorICAgIGFjYi0+Y29tbW9uLmNiKGFjYi0+Y29tbW9uLm9wYXF1ZSwgcmV0KTsKKyAgICBxZW11X2Fpb19yZWxlYXNlKGFjYik7Cit9CisKK3N0YXRpYyBRQ293QUlPQ0IgKnFjb3dfYWlvX3NldHVwKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBpbnQ2NF90IHNlY3Rvcl9udW0sIFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUsIGludCBpc193cml0ZSkKK3sKKyAgICBRQ293QUlPQ0IgKmFjYjsKKworICAgIGFjYiA9IHFlbXVfYWlvX2dldCgmcWNvd19haW9fcG9vbCwgYnMsIGNiLCBvcGFxdWUpOworICAgIGlmICghYWNiKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhY2ItPmhkX2Fpb2NiID0gTlVMTDsKKyAgICBhY2ItPnNlY3Rvcl9udW0gPSBzZWN0b3JfbnVtOworICAgIGFjYi0+cWlvdiA9IHFpb3Y7CisgICAgaWYgKHFpb3YtPm5pb3YgPiAxKSB7CisgICAgICAgIGFjYi0+YnVmID0gYWNiLT5vcmlnX2J1ZiA9IHFlbXVfYmxvY2thbGlnbihicywgcWlvdi0+c2l6ZSk7CisgICAgICAgIGlmIChpc193cml0ZSkKKyAgICAgICAgICAgIHFlbXVfaW92ZWNfdG9fYnVmKHFpb3YsIDAsIGFjYi0+YnVmLCBxaW92LT5zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhY2ItPmJ1ZiA9ICh1aW50OF90ICopcWlvdi0+aW92LT5pb3ZfYmFzZTsKKyAgICB9CisgICAgYWNiLT5yZW1haW5pbmdfc2VjdG9ycyA9IG5iX3NlY3RvcnM7CisgICAgYWNiLT5jdXJfbnJfc2VjdG9ycyA9IDA7CisgICAgYWNiLT5jbHVzdGVyX29mZnNldCA9IDA7CisgICAgYWNiLT5sMm1ldGEubmJfY2x1c3RlcnMgPSAwOworICAgIFFMSVNUX0lOSVQoJmFjYi0+bDJtZXRhLmRlcGVuZGVudF9yZXF1ZXN0cyk7CisgICAgcmV0dXJuIGFjYjsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKnFjb3dfYWlvX3JlYWR2KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBpbnQ2NF90IHNlY3Rvcl9udW0sIFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgUUNvd0FJT0NCICphY2I7CisKKyAgICBhY2IgPSBxY293X2Fpb19zZXR1cChicywgc2VjdG9yX251bSwgcWlvdiwgbmJfc2VjdG9ycywgY2IsIG9wYXF1ZSwgMCk7CisgICAgaWYgKCFhY2IpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcWNvd19haW9fcmVhZF9jYihhY2IsIDApOworICAgIHJldHVybiAmYWNiLT5jb21tb247Cit9CisKK3N0YXRpYyB2b2lkIHFjb3dfYWlvX3dyaXRlX2NiKHZvaWQgKm9wYXF1ZSwgaW50IHJldCk7CisKK3N0YXRpYyB2b2lkIHJ1bl9kZXBlbmRlbnRfcmVxdWVzdHMoUUNvd0wyTWV0YSAqbSkKK3sKKyAgICBRQ293QUlPQ0IgKnJlcTsKKyAgICBRQ293QUlPQ0IgKm5leHQ7CisKKyAgICAvKiBUYWtlIHRoZSByZXF1ZXN0IG9mZiB0aGUgbGlzdCBvZiBydW5uaW5nIHJlcXVlc3RzICovCisgICAgaWYgKG0tPm5iX2NsdXN0ZXJzICE9IDApIHsKKyAgICAgICAgUUxJU1RfUkVNT1ZFKG0sIG5leHRfaW5fZmxpZ2h0KTsKKyAgICB9CisKKyAgICAvKiBSZXN0YXJ0IGFsbCBkZXBlbmRlbnQgcmVxdWVzdHMgKi8KKyAgICBRTElTVF9GT1JFQUNIX1NBRkUocmVxLCAmbS0+ZGVwZW5kZW50X3JlcXVlc3RzLCBuZXh0X2RlcGVuZCwgbmV4dCkgeworICAgICAgICBxY293X2Fpb193cml0ZV9jYihyZXEsIDApOworICAgIH0KKworICAgIC8qIEVtcHR5IHRoZSBsaXN0IGZvciB0aGUgbmV4dCBwYXJ0IG9mIHRoZSByZXF1ZXN0ICovCisgICAgUUxJU1RfSU5JVCgmbS0+ZGVwZW5kZW50X3JlcXVlc3RzKTsKK30KKworc3RhdGljIHZvaWQgcWNvd19haW9fd3JpdGVfY2Iodm9pZCAqb3BhcXVlLCBpbnQgcmV0KQoreworICAgIFFDb3dBSU9DQiAqYWNiID0gb3BhcXVlOworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzID0gYWNiLT5jb21tb24uYnM7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGluZGV4X2luX2NsdXN0ZXI7CisgICAgY29uc3QgdWludDhfdCAqc3JjX2J1ZjsKKyAgICBpbnQgbl9lbmQ7CisKKyAgICBhY2ItPmhkX2Fpb2NiID0gTlVMTDsKKworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICByZXQgPSBxY293Ml9hbGxvY19jbHVzdGVyX2xpbmtfbDIoYnMsICZhY2ItPmwybWV0YSk7CisgICAgfQorCisgICAgcnVuX2RlcGVuZGVudF9yZXF1ZXN0cygmYWNiLT5sMm1ldGEpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIGFjYi0+cmVtYWluaW5nX3NlY3RvcnMgLT0gYWNiLT5jdXJfbnJfc2VjdG9yczsKKyAgICBhY2ItPnNlY3Rvcl9udW0gKz0gYWNiLT5jdXJfbnJfc2VjdG9yczsKKyAgICBhY2ItPmJ1ZiArPSBhY2ItPmN1cl9ucl9zZWN0b3JzICogNTEyOworCisgICAgaWYgKGFjYi0+cmVtYWluaW5nX3NlY3RvcnMgPT0gMCkgeworICAgICAgICAvKiByZXF1ZXN0IGNvbXBsZXRlZCAqLworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaW5kZXhfaW5fY2x1c3RlciA9IGFjYi0+c2VjdG9yX251bSAmIChzLT5jbHVzdGVyX3NlY3RvcnMgLSAxKTsKKyAgICBuX2VuZCA9IGluZGV4X2luX2NsdXN0ZXIgKyBhY2ItPnJlbWFpbmluZ19zZWN0b3JzOworICAgIGlmIChzLT5jcnlwdF9tZXRob2QgJiYKKyAgICAgICAgbl9lbmQgPiBRQ09XX01BWF9DUllQVF9DTFVTVEVSUyAqIHMtPmNsdXN0ZXJfc2VjdG9ycykKKyAgICAgICAgbl9lbmQgPSBRQ09XX01BWF9DUllQVF9DTFVTVEVSUyAqIHMtPmNsdXN0ZXJfc2VjdG9yczsKKworICAgIHJldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJfb2Zmc2V0KGJzLCBhY2ItPnNlY3Rvcl9udW0gPDwgOSwKKyAgICAgICAgaW5kZXhfaW5fY2x1c3Rlciwgbl9lbmQsICZhY2ItPmN1cl9ucl9zZWN0b3JzLCAmYWNiLT5sMm1ldGEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBhY2ItPmNsdXN0ZXJfb2Zmc2V0ID0gYWNiLT5sMm1ldGEuY2x1c3Rlcl9vZmZzZXQ7CisKKyAgICAvKiBOZWVkIHRvIHdhaXQgZm9yIGFub3RoZXIgcmVxdWVzdD8gSWYgc28sIHdlIGFyZSBkb25lIGZvciBub3cuICovCisgICAgaWYgKGFjYi0+bDJtZXRhLm5iX2NsdXN0ZXJzID09IDAgJiYgYWNiLT5sMm1ldGEuZGVwZW5kc19vbiAhPSBOVUxMKSB7CisgICAgICAgIFFMSVNUX0lOU0VSVF9IRUFEKCZhY2ItPmwybWV0YS5kZXBlbmRzX29uLT5kZXBlbmRlbnRfcmVxdWVzdHMsCisgICAgICAgICAgICBhY2IsIG5leHRfZGVwZW5kKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzc2VydCgoYWNiLT5jbHVzdGVyX29mZnNldCAmIDUxMSkgPT0gMCk7CisKKyAgICBpZiAocy0+Y3J5cHRfbWV0aG9kKSB7CisgICAgICAgIGlmICghYWNiLT5jbHVzdGVyX2RhdGEpIHsKKyAgICAgICAgICAgIGFjYi0+Y2x1c3Rlcl9kYXRhID0gZ19tYWxsb2MwKFFDT1dfTUFYX0NSWVBUX0NMVVNURVJTICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNsdXN0ZXJfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcWNvdzJfZW5jcnlwdF9zZWN0b3JzKHMsIGFjYi0+c2VjdG9yX251bSwgYWNiLT5jbHVzdGVyX2RhdGEsIGFjYi0+YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgYWNiLT5jdXJfbnJfc2VjdG9ycywgMSwgJnMtPmFlc19lbmNyeXB0X2tleSk7CisgICAgICAgIHNyY19idWYgPSBhY2ItPmNsdXN0ZXJfZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcmNfYnVmID0gYWNiLT5idWY7CisgICAgfQorICAgIGFjYi0+aGRfaW92Lmlvdl9iYXNlID0gKHZvaWQgKilzcmNfYnVmOworICAgIGFjYi0+aGRfaW92Lmlvdl9sZW4gPSBhY2ItPmN1cl9ucl9zZWN0b3JzICogNTEyOworICAgIHFlbXVfaW92ZWNfaW5pdF9leHRlcm5hbCgmYWNiLT5oZF9xaW92LCAmYWNiLT5oZF9pb3YsIDEpOworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1dSSVRFX0FJTyk7CisgICAgYWNiLT5oZF9haW9jYiA9IGJkcnZfYWlvX3dyaXRldihicy0+ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY2ItPmNsdXN0ZXJfb2Zmc2V0ID4+IDkpICsgaW5kZXhfaW5fY2x1c3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2ItPmhkX3Fpb3YsIGFjYi0+Y3VyX25yX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY293X2Fpb193cml0ZV9jYiwgYWNiKTsKKyAgICBpZiAoYWNiLT5oZF9haW9jYiA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IC1FSU87CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm47CisKK2ZhaWw6CisgICAgaWYgKGFjYi0+bDJtZXRhLm5iX2NsdXN0ZXJzICE9IDApIHsKKyAgICAgICAgUUxJU1RfUkVNT1ZFKCZhY2ItPmwybWV0YSwgbmV4dF9pbl9mbGlnaHQpOworICAgIH0KK2RvbmU6CisgICAgaWYgKGFjYi0+cWlvdi0+bmlvdiA+IDEpCisgICAgICAgIHFlbXVfdmZyZWUoYWNiLT5vcmlnX2J1Zik7CisgICAgYWNiLT5jb21tb24uY2IoYWNiLT5jb21tb24ub3BhcXVlLCByZXQpOworICAgIHFlbXVfYWlvX3JlbGVhc2UoYWNiKTsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKnFjb3dfYWlvX3dyaXRldihCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIFFDb3dBSU9DQiAqYWNiOworCisgICAgcy0+Y2x1c3Rlcl9jYWNoZV9vZmZzZXQgPSAtMTsgLyogZGlzYWJsZSBjb21wcmVzc2VkIGNhY2hlICovCisKKyAgICBhY2IgPSBxY293X2Fpb19zZXR1cChicywgc2VjdG9yX251bSwgcWlvdiwgbmJfc2VjdG9ycywgY2IsIG9wYXF1ZSwgMSk7CisgICAgaWYgKCFhY2IpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcWNvd19haW9fd3JpdGVfY2IoYWNiLCAwKTsKKyAgICByZXR1cm4gJmFjYi0+Y29tbW9uOworfQorCitzdGF0aWMgdm9pZCBxY293X2Nsb3NlKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGdfZnJlZShzLT5sMV90YWJsZSk7CisgICAgZ19mcmVlKHMtPmwyX2NhY2hlKTsKKyAgICBnX2ZyZWUocy0+Y2x1c3Rlcl9jYWNoZSk7CisgICAgZ19mcmVlKHMtPmNsdXN0ZXJfZGF0YSk7CisgICAgcWNvdzJfcmVmY291bnRfY2xvc2UoYnMpOworfQorCisvKgorICogVXBkYXRlcyB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcnRzIG9mIHRoZSBxY293MiBoZWFkZXIsIGkuZS4gdGhlIGJhY2tpbmcgZmlsZQorICogbmFtZSBhbmQgYWxsIGV4dGVuc2lvbnMuIHFjb3cyIHdhcyBub3QgZGVzaWduZWQgdG8gYWxsb3cgc3VjaCBjaGFuZ2VzLCBzbyBpZgorICogd2UgcnVuIG91dCBvZiBzcGFjZSAod2UgY2FuIG9ubHkgdXNlIHRoZSBmaXJzdCBjbHVzdGVyKSB0aGlzIGZ1bmN0aW9uIG1heQorICogZmFpbC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIGluIGVycm9yIGNhc2VzLgorICovCitzdGF0aWMgaW50IHFjb3cyX3VwZGF0ZV9leHRfaGVhZGVyKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgIGNvbnN0IGNoYXIgKmJhY2tpbmdfZmlsZSwgY29uc3QgY2hhciAqYmFja2luZ19mbXQpCit7CisgICAgc2l6ZV90IGJhY2tpbmdfZmlsZV9sZW4gPSAwOworICAgIHNpemVfdCBiYWNraW5nX2ZtdF9sZW4gPSAwOworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIFFDb3dFeHRlbnNpb24gZXh0X2JhY2tpbmdfZm10ID0gezAsIDB9OworICAgIGludCByZXQ7CisKKyAgICAvKiBCYWNraW5nIGZpbGUgZm9ybWF0IGRvZXNuJ3QgbWFrZSBzZW5zZSB3aXRob3V0IGEgYmFja2luZyBmaWxlICovCisgICAgaWYgKGJhY2tpbmdfZm10ICYmICFiYWNraW5nX2ZpbGUpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogUHJlcGFyZSB0aGUgYmFja2luZyBmaWxlIGZvcm1hdCBleHRlbnNpb24gaWYgbmVlZGVkICovCisgICAgaWYgKGJhY2tpbmdfZm10KSB7CisgICAgICAgIGV4dF9iYWNraW5nX2ZtdC5sZW4gPSBjcHVfdG9fYmUzMihzdHJsZW4oYmFja2luZ19mbXQpKTsKKyAgICAgICAgZXh0X2JhY2tpbmdfZm10Lm1hZ2ljID0gY3B1X3RvX2JlMzIoUUNPV19FWFRfTUFHSUNfQkFDS0lOR19GT1JNQVQpOworICAgICAgICBiYWNraW5nX2ZtdF9sZW4gPSAoKHNpemVvZihleHRfYmFja2luZ19mbXQpCisgICAgICAgICAgICArIHN0cmxlbihiYWNraW5nX2ZtdCkgKyA3KSAmIH43KTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB3ZSBjYW4gZml0IHRoZSBuZXcgaGVhZGVyIGludG8gdGhlIGZpcnN0IGNsdXN0ZXIgKi8KKyAgICBpZiAoYmFja2luZ19maWxlKSB7CisgICAgICAgIGJhY2tpbmdfZmlsZV9sZW4gPSBzdHJsZW4oYmFja2luZ19maWxlKTsKKyAgICB9CisKKyAgICBzaXplX3QgaGVhZGVyX3NpemUgPSBzaXplb2YoUUNvd0hlYWRlcikgKyBiYWNraW5nX2ZpbGVfbGVuCisgICAgICAgICsgYmFja2luZ19mbXRfbGVuOworCisgICAgaWYgKGhlYWRlcl9zaXplID4gcy0+Y2x1c3Rlcl9zaXplKSB7CisgICAgICAgIHJldHVybiAtRU5PU1BDOworICAgIH0KKworICAgIC8qIFJld3JpdGUgYmFja2luZyBmaWxlIG5hbWUgYW5kIHFjb3cyIGV4dGVuc2lvbnMgKi8KKyAgICBzaXplX3QgZXh0X3NpemUgPSBoZWFkZXJfc2l6ZSAtIHNpemVvZihRQ293SGVhZGVyKTsKKyAgICB1aW50OF90IGJ1ZltleHRfc2l6ZV07CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgc2l6ZV90IGJhY2tpbmdfZmlsZV9vZmZzZXQgPSAwOworCisgICAgaWYgKGJhY2tpbmdfZmlsZSkgeworICAgICAgICBpZiAoYmFja2luZ19mbXQpIHsKKyAgICAgICAgICAgIGludCBwYWRkaW5nID0gYmFja2luZ19mbXRfbGVuIC0KKyAgICAgICAgICAgICAgICAoc2l6ZW9mKGV4dF9iYWNraW5nX2ZtdCkgKyBzdHJsZW4oYmFja2luZ19mbXQpKTsKKworICAgICAgICAgICAgbWVtY3B5KGJ1ZiArIG9mZnNldCwgJmV4dF9iYWNraW5nX2ZtdCwgc2l6ZW9mKGV4dF9iYWNraW5nX2ZtdCkpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihleHRfYmFja2luZ19mbXQpOworCisgICAgICAgICAgICBtZW1jcHkoYnVmICsgb2Zmc2V0LCBiYWNraW5nX2ZtdCwgc3RybGVuKGJhY2tpbmdfZm10KSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gc3RybGVuKGJhY2tpbmdfZm10KTsKKworICAgICAgICAgICAgbWVtc2V0KGJ1ZiArIG9mZnNldCwgMCwgcGFkZGluZyk7CisgICAgICAgICAgICBvZmZzZXQgKz0gcGFkZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShidWYgKyBvZmZzZXQsIGJhY2tpbmdfZmlsZSwgYmFja2luZ19maWxlX2xlbik7CisgICAgICAgIGJhY2tpbmdfZmlsZV9vZmZzZXQgPSBzaXplb2YoUUNvd0hlYWRlcikgKyBvZmZzZXQ7CisgICAgfQorCisgICAgcmV0ID0gYmRydl9wd3JpdGVfc3luYyhicy0+ZmlsZSwgc2l6ZW9mKFFDb3dIZWFkZXIpLCBidWYsIGV4dF9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogVXBkYXRlIGhlYWRlciBmaWVsZHMgKi8KKyAgICB1aW50NjRfdCBiZV9iYWNraW5nX2ZpbGVfb2Zmc2V0ID0gY3B1X3RvX2JlNjQoYmFja2luZ19maWxlX29mZnNldCk7CisgICAgdWludDMyX3QgYmVfYmFja2luZ19maWxlX3NpemUgPSBjcHVfdG9fYmUzMihiYWNraW5nX2ZpbGVfbGVuKTsKKworICAgIHJldCA9IGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG9mZnNldG9mKFFDb3dIZWFkZXIsIGJhY2tpbmdfZmlsZV9vZmZzZXQpLAorICAgICAgICAmYmVfYmFja2luZ19maWxlX29mZnNldCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG9mZnNldG9mKFFDb3dIZWFkZXIsIGJhY2tpbmdfZmlsZV9zaXplKSwKKyAgICAgICAgJmJlX2JhY2tpbmdfZmlsZV9zaXplLCBzaXplb2YodWludDMyX3QpKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gMDsKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxY293Ml9jaGFuZ2VfYmFja2luZ19maWxlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgIGNvbnN0IGNoYXIgKmJhY2tpbmdfZmlsZSwgY29uc3QgY2hhciAqYmFja2luZ19mbXQpCit7CisgICAgcmV0dXJuIHFjb3cyX3VwZGF0ZV9leHRfaGVhZGVyKGJzLCBiYWNraW5nX2ZpbGUsIGJhY2tpbmdfZm10KTsKK30KKworc3RhdGljIGludCBnZXRfYml0c19mcm9tX3NpemUoc2l6ZV90IHNpemUpCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSAhPSAxKSB7CisgICAgICAgIC8qIE5vdCBhIHBvd2VyIG9mIHR3byAqLworICAgICAgICBpZiAoc2l6ZSAmIDEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPj49IDE7CisgICAgICAgIHJlcysrOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBwcmVhbGxvY2F0ZShCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICB1aW50NjRfdCBuYl9zZWN0b3JzOworICAgIHVpbnQ2NF90IG9mZnNldDsKKyAgICBpbnQgbnVtOworICAgIGludCByZXQ7CisgICAgUUNvd0wyTWV0YSBtZXRhOworCisgICAgbmJfc2VjdG9ycyA9IGJkcnZfZ2V0bGVuZ3RoKGJzKSA+PiA5OworICAgIG9mZnNldCA9IDA7CisgICAgUUxJU1RfSU5JVCgmbWV0YS5kZXBlbmRlbnRfcmVxdWVzdHMpOworICAgIG1ldGEuY2x1c3Rlcl9vZmZzZXQgPSAwOworCisgICAgd2hpbGUgKG5iX3NlY3RvcnMpIHsKKyAgICAgICAgbnVtID0gTUlOKG5iX3NlY3RvcnMsIElOVF9NQVggPj4gOSk7CisgICAgICAgIHJldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJfb2Zmc2V0KGJzLCBvZmZzZXQsIDAsIG51bSwgJm51bSwgJm1ldGEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHFjb3cyX2FsbG9jX2NsdXN0ZXJfbGlua19sMihicywgJm1ldGEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcWNvdzJfZnJlZV9hbnlfY2x1c3RlcnMoYnMsIG1ldGEuY2x1c3Rlcl9vZmZzZXQsIG1ldGEubmJfY2x1c3RlcnMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRoZXJlIGFyZSBubyBkZXBlbmRlbnQgcmVxdWVzdHMsIGJ1dCB3ZSBuZWVkIHRvIHJlbW92ZSBvdXIgcmVxdWVzdAorICAgICAgICAgKiBmcm9tIHRoZSBsaXN0IG9mIGluLWZsaWdodCByZXF1ZXN0cyAqLworICAgICAgICBydW5fZGVwZW5kZW50X3JlcXVlc3RzKCZtZXRhKTsKKworICAgICAgICAvKiBUT0RPIFByZWFsbG9jYXRlIGRhdGEgaWYgcmVxdWVzdGVkICovCisKKyAgICAgICAgbmJfc2VjdG9ycyAtPSBudW07CisgICAgICAgIG9mZnNldCArPSBudW0gPDwgOTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGltYWdlIGZpbGUgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjdHVhbGx5IGNvbnRhaW4KKyAgICAgKiBhbGwgb2YgdGhlIGFsbG9jYXRlZCBjbHVzdGVycyAob3RoZXJ3aXNlIHdlIGdldCBmYWlsaW5nIHJlYWRzIGFmdGVyCisgICAgICogRU9GKS4gRXh0ZW5kIHRoZSBpbWFnZSB0byB0aGUgbGFzdCBhbGxvY2F0ZWQgc2VjdG9yLgorICAgICAqLworICAgIGlmIChtZXRhLmNsdXN0ZXJfb2Zmc2V0ICE9IDApIHsKKyAgICAgICAgdWludDhfdCBidWZbNTEyXTsKKyAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgNTEyKTsKKyAgICAgICAgcmV0ID0gYmRydl93cml0ZShicy0+ZmlsZSwgKG1ldGEuY2x1c3Rlcl9vZmZzZXQgPj4gOSkgKyBudW0gLSAxLCBidWYsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjb3dfY3JlYXRlMihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50NjRfdCB0b3RhbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYmFja2luZ19maWxlLCBjb25zdCBjaGFyICpiYWNraW5nX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgc2l6ZV90IGNsdXN0ZXJfc2l6ZSwgaW50IHByZWFsbG9jKQoreworCisgICAgaW50IGZkLCBoZWFkZXJfc2l6ZSwgYmFja2luZ19maWxlbmFtZV9sZW4sIGwxX3NpemUsIGksIHNoaWZ0LCBsMl9iaXRzOworICAgIGludCByZWZfY2x1c3RlcnMsIHJlZnRhYmxlX2NsdXN0ZXJzLCBiYWNraW5nX2Zvcm1hdF9sZW4gPSAwOworICAgIGludCByb3VuZGVkX2V4dF9iZl9sZW4gPSAwOworICAgIFFDb3dIZWFkZXIgaGVhZGVyOworICAgIHVpbnQ2NF90IHRtcCwgb2Zmc2V0OworICAgIHVpbnQ2NF90IG9sZF9yZWZfY2x1c3RlcnM7CisgICAgUUNvd0NyZWF0ZVN0YXRlIHMxLCAqcyA9ICZzMTsKKyAgICBRQ293RXh0ZW5zaW9uIGV4dF9iZiA9IHswLCAwfTsKKyAgICBpbnQgcmV0OworCisgICAgbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOworCisgICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NDQpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKyAgICBoZWFkZXIubWFnaWMgPSBjcHVfdG9fYmUzMihRQ09XX01BR0lDKTsKKyAgICBoZWFkZXIudmVyc2lvbiA9IGNwdV90b19iZTMyKFFDT1dfVkVSU0lPTik7CisgICAgaGVhZGVyLnNpemUgPSBjcHVfdG9fYmU2NCh0b3RhbF9zaXplICogNTEyKTsKKyAgICBoZWFkZXJfc2l6ZSA9IHNpemVvZihoZWFkZXIpOworICAgIGJhY2tpbmdfZmlsZW5hbWVfbGVuID0gMDsKKyAgICBpZiAoYmFja2luZ19maWxlKSB7CisgICAgICAgIGlmIChiYWNraW5nX2Zvcm1hdCkgeworICAgICAgICAgICAgZXh0X2JmLm1hZ2ljID0gUUNPV19FWFRfTUFHSUNfQkFDS0lOR19GT1JNQVQ7CisgICAgICAgICAgICBiYWNraW5nX2Zvcm1hdF9sZW4gPSBzdHJsZW4oYmFja2luZ19mb3JtYXQpOworICAgICAgICAgICAgZXh0X2JmLmxlbiA9IGJhY2tpbmdfZm9ybWF0X2xlbjsKKyAgICAgICAgICAgIHJvdW5kZWRfZXh0X2JmX2xlbiA9IChzaXplb2YoZXh0X2JmKSArIGV4dF9iZi5sZW4gKyA3KSAmIH43OworICAgICAgICAgICAgaGVhZGVyX3NpemUgKz0gcm91bmRlZF9leHRfYmZfbGVuOworICAgICAgICB9CisgICAgICAgIGhlYWRlci5iYWNraW5nX2ZpbGVfb2Zmc2V0ID0gY3B1X3RvX2JlNjQoaGVhZGVyX3NpemUpOworICAgICAgICBiYWNraW5nX2ZpbGVuYW1lX2xlbiA9IHN0cmxlbihiYWNraW5nX2ZpbGUpOworICAgICAgICBoZWFkZXIuYmFja2luZ19maWxlX3NpemUgPSBjcHVfdG9fYmUzMihiYWNraW5nX2ZpbGVuYW1lX2xlbik7CisgICAgICAgIGhlYWRlcl9zaXplICs9IGJhY2tpbmdfZmlsZW5hbWVfbGVuOworICAgIH0KKworICAgIC8qIENsdXN0ZXIgc2l6ZSAqLworICAgIHMtPmNsdXN0ZXJfYml0cyA9IGdldF9iaXRzX2Zyb21fc2l6ZShjbHVzdGVyX3NpemUpOworICAgIGlmIChzLT5jbHVzdGVyX2JpdHMgPCBNSU5fQ0xVU1RFUl9CSVRTIHx8CisgICAgICAgIHMtPmNsdXN0ZXJfYml0cyA+IE1BWF9DTFVTVEVSX0JJVFMpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNsdXN0ZXIgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvIGJldHdlZW4gIgorICAgICAgICAgICAgIiVkIGFuZCAlZGtcbiIsCisgICAgICAgICAgICAxIDw8IE1JTl9DTFVTVEVSX0JJVFMsCisgICAgICAgICAgICAxIDw8IChNQVhfQ0xVU1RFUl9CSVRTIC0gMTApKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHMtPmNsdXN0ZXJfc2l6ZSA9IDEgPDwgcy0+Y2x1c3Rlcl9iaXRzOworCisgICAgaGVhZGVyLmNsdXN0ZXJfYml0cyA9IGNwdV90b19iZTMyKHMtPmNsdXN0ZXJfYml0cyk7CisgICAgaGVhZGVyX3NpemUgPSAoaGVhZGVyX3NpemUgKyA3KSAmIH43OworICAgIGlmIChmbGFncyAmIEJMT0NLX0ZMQUdfRU5DUllQVCkgeworICAgICAgICBoZWFkZXIuY3J5cHRfbWV0aG9kID0gY3B1X3RvX2JlMzIoUUNPV19DUllQVF9BRVMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhlYWRlci5jcnlwdF9tZXRob2QgPSBjcHVfdG9fYmUzMihRQ09XX0NSWVBUX05PTkUpOworICAgIH0KKyAgICBsMl9iaXRzID0gcy0+Y2x1c3Rlcl9iaXRzIC0gMzsKKyAgICBzaGlmdCA9IHMtPmNsdXN0ZXJfYml0cyArIGwyX2JpdHM7CisgICAgbDFfc2l6ZSA9ICgoKHRvdGFsX3NpemUgKiA1MTIpICsgKDFMTCA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdCk7CisgICAgb2Zmc2V0ID0gYWxpZ25fb2Zmc2V0KGhlYWRlcl9zaXplLCBzLT5jbHVzdGVyX3NpemUpOworICAgIHMtPmwxX3RhYmxlX29mZnNldCA9IG9mZnNldDsKKyAgICBoZWFkZXIubDFfdGFibGVfb2Zmc2V0ID0gY3B1X3RvX2JlNjQocy0+bDFfdGFibGVfb2Zmc2V0KTsKKyAgICBoZWFkZXIubDFfc2l6ZSA9IGNwdV90b19iZTMyKGwxX3NpemUpOworICAgIG9mZnNldCArPSBhbGlnbl9vZmZzZXQobDFfc2l6ZSAqIHNpemVvZih1aW50NjRfdCksIHMtPmNsdXN0ZXJfc2l6ZSk7CisKKyAgICAvKiBjb3VudCBob3cgbWFueSByZWZjb3VudCBibG9ja3MgbmVlZGVkICovCisKKyNkZWZpbmUgTlVNX0NMVVNURVJTKGJ5dGVzKSBcCisgICAgKCgoYnl0ZXMpICsgKHMtPmNsdXN0ZXJfc2l6ZSkgLSAxKSAvIChzLT5jbHVzdGVyX3NpemUpKQorCisgICAgcmVmX2NsdXN0ZXJzID0gTlVNX0NMVVNURVJTKE5VTV9DTFVTVEVSUyhvZmZzZXQpICogc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBkbyB7CisgICAgICAgIHVpbnQ2NF90IGltYWdlX2NsdXN0ZXJzOworICAgICAgICBvbGRfcmVmX2NsdXN0ZXJzID0gcmVmX2NsdXN0ZXJzOworCisgICAgICAgIC8qIE51bWJlciBvZiBjbHVzdGVycyB1c2VkIGZvciB0aGUgcmVmY291bnQgdGFibGUgKi8KKyAgICAgICAgcmVmdGFibGVfY2x1c3RlcnMgPSBOVU1fQ0xVU1RFUlMocmVmX2NsdXN0ZXJzICogc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgICAgICAgLyogTnVtYmVyIG9mIGNsdXN0ZXJzIHRoYXQgdGhlIHdob2xlIGltYWdlIHdpbGwgaGF2ZSAqLworICAgICAgICBpbWFnZV9jbHVzdGVycyA9IE5VTV9DTFVTVEVSUyhvZmZzZXQpICsgcmVmX2NsdXN0ZXJzCisgICAgICAgICAgICArIHJlZnRhYmxlX2NsdXN0ZXJzOworCisgICAgICAgIC8qIE51bWJlciBvZiByZWZjb3VudCBibG9ja3MgbmVlZGVkIGZvciB0aGUgaW1hZ2UgKi8KKyAgICAgICAgcmVmX2NsdXN0ZXJzID0gTlVNX0NMVVNURVJTKGltYWdlX2NsdXN0ZXJzICogc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICB9IHdoaWxlIChyZWZfY2x1c3RlcnMgIT0gb2xkX3JlZl9jbHVzdGVycyk7CisKKyAgICBzLT5yZWZjb3VudF90YWJsZSA9IGdfbWFsbG9jMChyZWZ0YWJsZV9jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZSk7CisKKyAgICBzLT5yZWZjb3VudF90YWJsZV9vZmZzZXQgPSBvZmZzZXQ7CisgICAgaGVhZGVyLnJlZmNvdW50X3RhYmxlX29mZnNldCA9IGNwdV90b19iZTY0KG9mZnNldCk7CisgICAgaGVhZGVyLnJlZmNvdW50X3RhYmxlX2NsdXN0ZXJzID0gY3B1X3RvX2JlMzIocmVmdGFibGVfY2x1c3RlcnMpOworICAgIG9mZnNldCArPSAocmVmdGFibGVfY2x1c3RlcnMgKiBzLT5jbHVzdGVyX3NpemUpOworICAgIHMtPnJlZmNvdW50X2Jsb2NrX29mZnNldCA9IG9mZnNldDsKKworICAgIGZvciAoaT0wOyBpIDwgcmVmX2NsdXN0ZXJzOyBpKyspIHsKKyAgICAgICAgcy0+cmVmY291bnRfdGFibGVbaV0gPSBjcHVfdG9fYmU2NChvZmZzZXQpOworICAgICAgICBvZmZzZXQgKz0gcy0+Y2x1c3Rlcl9zaXplOworICAgIH0KKworICAgIHMtPnJlZmNvdW50X2Jsb2NrID0gZ19tYWxsb2MwKHJlZl9jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZSk7CisKKyAgICAvKiB1cGRhdGUgcmVmY291bnRzICovCisgICAgcWNvdzJfY3JlYXRlX3JlZmNvdW50X3VwZGF0ZShzLCAwLCBoZWFkZXJfc2l6ZSk7CisgICAgcWNvdzJfY3JlYXRlX3JlZmNvdW50X3VwZGF0ZShzLCBzLT5sMV90YWJsZV9vZmZzZXQsCisgICAgICAgIGwxX3NpemUgKiBzaXplb2YodWludDY0X3QpKTsKKyAgICBxY293Ml9jcmVhdGVfcmVmY291bnRfdXBkYXRlKHMsIHMtPnJlZmNvdW50X3RhYmxlX29mZnNldCwKKyAgICAgICAgcmVmdGFibGVfY2x1c3RlcnMgKiBzLT5jbHVzdGVyX3NpemUpOworICAgIHFjb3cyX2NyZWF0ZV9yZWZjb3VudF91cGRhdGUocywgcy0+cmVmY291bnRfYmxvY2tfb2Zmc2V0LAorICAgICAgICByZWZfY2x1c3RlcnMgKiBzLT5jbHVzdGVyX3NpemUpOworCisgICAgLyogd3JpdGUgYWxsIHRoZSBkYXRhICovCisgICAgcmV0ID0gcWVtdV93cml0ZV9mdWxsKGZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisgICAgaWYgKHJldCAhPSBzaXplb2YoaGVhZGVyKSkgeworICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgaWYgKGJhY2tpbmdfZmlsZSkgeworICAgICAgICBpZiAoYmFja2luZ19mb3JtYXRfbGVuKSB7CisgICAgICAgICAgICBjaGFyIHplcm9bMTZdOworICAgICAgICAgICAgaW50IHBhZGRpbmcgPSByb3VuZGVkX2V4dF9iZl9sZW4gLSAoZXh0X2JmLmxlbiArIHNpemVvZihleHRfYmYpKTsKKworICAgICAgICAgICAgbWVtc2V0KHplcm8sIDAsIHNpemVvZih6ZXJvKSk7CisgICAgICAgICAgICBjcHVfdG9fYmUzMnMoJmV4dF9iZi5tYWdpYyk7CisgICAgICAgICAgICBjcHVfdG9fYmUzMnMoJmV4dF9iZi5sZW4pOworICAgICAgICAgICAgcmV0ID0gcWVtdV93cml0ZV9mdWxsKGZkLCAmZXh0X2JmLCBzaXplb2YoZXh0X2JmKSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IHNpemVvZihleHRfYmYpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHFlbXVfd3JpdGVfZnVsbChmZCwgYmFja2luZ19mb3JtYXQsIGJhY2tpbmdfZm9ybWF0X2xlbik7CisgICAgICAgICAgICBpZiAocmV0ICE9IGJhY2tpbmdfZm9ybWF0X2xlbikgeworICAgICAgICAgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBxZW11X3dyaXRlX2Z1bGwoZmQsIHplcm8sIHBhZGRpbmcpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gcGFkZGluZykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gcWVtdV93cml0ZV9mdWxsKGZkLCBiYWNraW5nX2ZpbGUsIGJhY2tpbmdfZmlsZW5hbWVfbGVuKTsKKyAgICAgICAgaWYgKHJldCAhPSBiYWNraW5nX2ZpbGVuYW1lX2xlbikgeworICAgICAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgfQorICAgIGxzZWVrKGZkLCBzLT5sMV90YWJsZV9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICB0bXAgPSAwOworICAgIGZvcihpID0gMDtpIDwgbDFfc2l6ZTsgaSsrKSB7CisgICAgICAgIHJldCA9IHFlbXVfd3JpdGVfZnVsbChmZCwgJnRtcCwgc2l6ZW9mKHRtcCkpOworICAgICAgICBpZiAocmV0ICE9IHNpemVvZih0bXApKSB7CisgICAgICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbHNlZWsoZmQsIHMtPnJlZmNvdW50X3RhYmxlX29mZnNldCwgU0VFS19TRVQpOworICAgIHJldCA9IHFlbXVfd3JpdGVfZnVsbChmZCwgcy0+cmVmY291bnRfdGFibGUsCisgICAgICAgIHJlZnRhYmxlX2NsdXN0ZXJzICogcy0+Y2x1c3Rlcl9zaXplKTsKKyAgICBpZiAocmV0ICE9IHJlZnRhYmxlX2NsdXN0ZXJzICogcy0+Y2x1c3Rlcl9zaXplKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKworICAgIGxzZWVrKGZkLCBzLT5yZWZjb3VudF9ibG9ja19vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICByZXQgPSBxZW11X3dyaXRlX2Z1bGwoZmQsIHMtPnJlZmNvdW50X2Jsb2NrLAorCQkgICAgcmVmX2NsdXN0ZXJzICogcy0+Y2x1c3Rlcl9zaXplKTsKKyAgICBpZiAocmV0ICE9IHJlZl9jbHVzdGVycyAqIHMtPmNsdXN0ZXJfc2l6ZSkgeworICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisKKyAgICByZXQgPSAwOworZXhpdDoKKyAgICBnX2ZyZWUocy0+cmVmY291bnRfdGFibGUpOworICAgIGdfZnJlZShzLT5yZWZjb3VudF9ibG9jayk7CisgICAgY2xvc2UoZmQpOworCisgICAgLyogUHJlYWxsb2NhdGUgbWV0YWRhdGEgKi8KKyAgICBpZiAocmV0ID09IDAgJiYgcHJlYWxsb2MpIHsKKyAgICAgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisgICAgICAgIEJsb2NrRHJpdmVyICpkcnYgPSBiZHJ2X2ZpbmRfZm9ybWF0KCJxY293MiIpOworICAgICAgICBicyA9IGJkcnZfbmV3KCIiKTsKKyAgICAgICAgYmRydl9vcGVuKGJzLCBmaWxlbmFtZSwgQkRSVl9PX0NBQ0hFX1dCIHwgQkRSVl9PX1JEV1IsIGRydik7CisgICAgICAgIHJldCA9IHByZWFsbG9jYXRlKGJzKTsKKyAgICAgICAgYmRydl9jbG9zZShicyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxY293X2NyZWF0ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgUUVNVU9wdGlvblBhcmFtZXRlciAqb3B0aW9ucykKK3sKKyAgICBjb25zdCBjaGFyICpiYWNraW5nX2ZpbGUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmJhY2tpbmdfZm10ID0gTlVMTDsKKyAgICB1aW50NjRfdCBzZWN0b3JzID0gMDsKKyAgICBpbnQgZmxhZ3MgPSAwOworICAgIHNpemVfdCBjbHVzdGVyX3NpemUgPSA2NTUzNjsKKyAgICBpbnQgcHJlYWxsb2MgPSAwOworCisgICAgLyogUmVhZCBvdXQgb3B0aW9ucyAqLworICAgIHdoaWxlIChvcHRpb25zICYmIG9wdGlvbnMtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0aW9ucy0+bmFtZSwgQkxPQ0tfT1BUX1NJWkUpKSB7CisgICAgICAgICAgICBzZWN0b3JzID0gb3B0aW9ucy0+dmFsdWUubiAvIDUxMjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGlvbnMtPm5hbWUsIEJMT0NLX09QVF9CQUNLSU5HX0ZJTEUpKSB7CisgICAgICAgICAgICBiYWNraW5nX2ZpbGUgPSBvcHRpb25zLT52YWx1ZS5zOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0aW9ucy0+bmFtZSwgQkxPQ0tfT1BUX0JBQ0tJTkdfRk1UKSkgeworICAgICAgICAgICAgYmFja2luZ19mbXQgPSBvcHRpb25zLT52YWx1ZS5zOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0aW9ucy0+bmFtZSwgQkxPQ0tfT1BUX0VOQ1JZUFQpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBvcHRpb25zLT52YWx1ZS5uID8gQkxPQ0tfRkxBR19FTkNSWVBUIDogMDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG9wdGlvbnMtPm5hbWUsIEJMT0NLX09QVF9DTFVTVEVSX1NJWkUpKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucy0+dmFsdWUubikgeworICAgICAgICAgICAgICAgIGNsdXN0ZXJfc2l6ZSA9IG9wdGlvbnMtPnZhbHVlLm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvcHRpb25zLT5uYW1lLCBCTE9DS19PUFRfUFJFQUxMT0MpKSB7CisgICAgICAgICAgICBpZiAoIW9wdGlvbnMtPnZhbHVlLnMgfHwgIXN0cmNtcChvcHRpb25zLT52YWx1ZS5zLCAib2ZmIikpIHsKKyAgICAgICAgICAgICAgICBwcmVhbGxvYyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3B0aW9ucy0+dmFsdWUucywgIm1ldGFkYXRhIikpIHsKKyAgICAgICAgICAgICAgICBwcmVhbGxvYyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwcmVhbGxvY2F0aW9uIG1vZGU6ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPnZhbHVlLnMpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9wdGlvbnMrKzsKKyAgICB9CisKKyAgICBpZiAoYmFja2luZ19maWxlICYmIHByZWFsbG9jKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFja2luZyBmaWxlIGFuZCBwcmVhbGxvY2F0aW9uIGNhbm5vdCBiZSB1c2VkIGF0ICIKKyAgICAgICAgICAgICJ0aGUgc2FtZSB0aW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcmV0dXJuIHFjb3dfY3JlYXRlMihmaWxlbmFtZSwgc2VjdG9ycywgYmFja2luZ19maWxlLCBiYWNraW5nX2ZtdCwgZmxhZ3MsCisgICAgICAgIGNsdXN0ZXJfc2l6ZSwgcHJlYWxsb2MpOworfQorCitzdGF0aWMgaW50IHFjb3dfbWFrZV9lbXB0eShCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyNpZiAwCisgICAgLyogWFhYOiBub3QgY29ycmVjdCAqLworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHVpbnQzMl90IGwxX2xlbmd0aCA9IHMtPmwxX3NpemUgKiBzaXplb2YodWludDY0X3QpOworICAgIGludCByZXQ7CisKKyAgICBtZW1zZXQocy0+bDFfdGFibGUsIDAsIGwxX2xlbmd0aCk7CisgICAgaWYgKGJkcnZfcHdyaXRlKGJzLT5maWxlLCBzLT5sMV90YWJsZV9vZmZzZXQsIHMtPmwxX3RhYmxlLCBsMV9sZW5ndGgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldCA9IGJkcnZfdHJ1bmNhdGUoYnMtPmZpbGUsIHMtPmwxX3RhYmxlX29mZnNldCArIGwxX2xlbmd0aCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBsMl9jYWNoZV9yZXNldChicyk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY293Ml90cnVuY2F0ZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHJldCwgbmV3X2wxX3NpemU7CisKKyAgICBpZiAob2Zmc2V0ICYgNTExKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qIGNhbm5vdCBwcm9jZWVkIGlmIGltYWdlIGhhcyBzbmFwc2hvdHMgKi8KKyAgICBpZiAocy0+bmJfc25hcHNob3RzKSB7CisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKyAgICB9CisKKyAgICAvKiBzaHJpbmtpbmcgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBpZiAob2Zmc2V0IDwgYnMtPnRvdGFsX3NlY3RvcnMgKiA1MTIpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIH0KKworICAgIG5ld19sMV9zaXplID0gc2l6ZV90b19sMShzLCBvZmZzZXQpOworICAgIHJldCA9IHFjb3cyX2dyb3dfbDFfdGFibGUoYnMsIG5ld19sMV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHdyaXRlIHVwZGF0ZWQgaGVhZGVyLnNpemUgKi8KKyAgICBvZmZzZXQgPSBjcHVfdG9fYmU2NChvZmZzZXQpOworICAgIHJldCA9IGJkcnZfcHdyaXRlX3N5bmMoYnMtPmZpbGUsIG9mZnNldG9mKFFDb3dIZWFkZXIsIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzLT5sMV92bV9zdGF0ZV9pbmRleCA9IG5ld19sMV9zaXplOworICAgIHJldHVybiAwOworfQorCisvKiBYWFg6IHB1dCBjb21wcmVzc2VkIHNlY3RvcnMgZmlyc3QsIHRoZW4gYWxsIHRoZSBjbHVzdGVyIGFsaWduZWQKKyAgIHRhYmxlcyB0byBhdm9pZCBsb3NpbmcgYnl0ZXMgaW4gYWxpZ25tZW50ICovCitzdGF0aWMgaW50IHFjb3dfd3JpdGVfY29tcHJlc3NlZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICB6X3N0cmVhbSBzdHJtOworICAgIGludCByZXQsIG91dF9sZW47CisgICAgdWludDhfdCAqb3V0X2J1ZjsKKyAgICB1aW50NjRfdCBjbHVzdGVyX29mZnNldDsKKworICAgIGlmIChuYl9zZWN0b3JzID09IDApIHsKKyAgICAgICAgLyogYWxpZ24gZW5kIG9mIGZpbGUgdG8gYSBzZWN0b3IgYm91bmRhcnkgdG8gZWFzZSByZWFkaW5nIHdpdGgKKyAgICAgICAgICAgc2VjdG9yIGJhc2VkIEkvT3MgKi8KKyAgICAgICAgY2x1c3Rlcl9vZmZzZXQgPSBiZHJ2X2dldGxlbmd0aChicy0+ZmlsZSk7CisgICAgICAgIGNsdXN0ZXJfb2Zmc2V0ID0gKGNsdXN0ZXJfb2Zmc2V0ICsgNTExKSAmIH41MTE7CisgICAgICAgIGJkcnZfdHJ1bmNhdGUoYnMtPmZpbGUsIGNsdXN0ZXJfb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG5iX3NlY3RvcnMgIT0gcy0+Y2x1c3Rlcl9zZWN0b3JzKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIG91dF9idWYgPSBnX21hbGxvYyhzLT5jbHVzdGVyX3NpemUgKyAocy0+Y2x1c3Rlcl9zaXplIC8gMTAwMCkgKyAxMjgpOworCisgICAgLyogYmVzdCBjb21wcmVzc2lvbiwgc21hbGwgd2luZG93LCBubyB6bGliIGhlYWRlciAqLworICAgIG1lbXNldCgmc3RybSwgMCwgc2l6ZW9mKHN0cm0pKTsKKyAgICByZXQgPSBkZWZsYXRlSW5pdDIoJnN0cm0sIFpfREVGQVVMVF9DT01QUkVTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZMQVRFRCwgLTEyLAorICAgICAgICAgICAgICAgICAgICAgICA5LCBaX0RFRkFVTFRfU1RSQVRFR1kpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBnX2ZyZWUob3V0X2J1Zik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdHJtLmF2YWlsX2luID0gcy0+Y2x1c3Rlcl9zaXplOworICAgIHN0cm0ubmV4dF9pbiA9ICh1aW50OF90ICopYnVmOworICAgIHN0cm0uYXZhaWxfb3V0ID0gcy0+Y2x1c3Rlcl9zaXplOworICAgIHN0cm0ubmV4dF9vdXQgPSBvdXRfYnVmOworCisgICAgcmV0ID0gZGVmbGF0ZSgmc3RybSwgWl9GSU5JU0gpOworICAgIGlmIChyZXQgIT0gWl9TVFJFQU1fRU5EICYmIHJldCAhPSBaX09LKSB7CisgICAgICAgIGdfZnJlZShvdXRfYnVmKTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc3RybSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb3V0X2xlbiA9IHN0cm0ubmV4dF9vdXQgLSBvdXRfYnVmOworCisgICAgZGVmbGF0ZUVuZCgmc3RybSk7CisKKyAgICBpZiAocmV0ICE9IFpfU1RSRUFNX0VORCB8fCBvdXRfbGVuID49IHMtPmNsdXN0ZXJfc2l6ZSkgeworICAgICAgICAvKiBjb3VsZCBub3QgY29tcHJlc3M6IHdyaXRlIG5vcm1hbCBjbHVzdGVyICovCisgICAgICAgIGJkcnZfd3JpdGUoYnMsIHNlY3Rvcl9udW0sIGJ1Ziwgcy0+Y2x1c3Rlcl9zZWN0b3JzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbHVzdGVyX29mZnNldCA9IHFjb3cyX2FsbG9jX2NvbXByZXNzZWRfY2x1c3Rlcl9vZmZzZXQoYnMsCisgICAgICAgICAgICBzZWN0b3JfbnVtIDw8IDksIG91dF9sZW4pOworICAgICAgICBpZiAoIWNsdXN0ZXJfb2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjbHVzdGVyX29mZnNldCAmPSBzLT5jbHVzdGVyX29mZnNldF9tYXNrOworICAgICAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19XUklURV9DT01QUkVTU0VEKTsKKyAgICAgICAgaWYgKGJkcnZfcHdyaXRlKGJzLT5maWxlLCBjbHVzdGVyX29mZnNldCwgb3V0X2J1Ziwgb3V0X2xlbikgIT0gb3V0X2xlbikgeworICAgICAgICAgICAgZ19mcmVlKG91dF9idWYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgZ19mcmVlKG91dF9idWYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxY293X2ZsdXNoKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIGJkcnZfZmx1c2goYnMtPmZpbGUpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcWNvd19haW9fZmx1c2goQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiBiZHJ2X2Fpb19mbHVzaChicy0+ZmlsZSwgY2IsIG9wYXF1ZSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHFjb3dfdm1fc3RhdGVfb2Zmc2V0KEJEUlZRY293U3RhdGUgKnMpCit7CisJcmV0dXJuIChpbnQ2NF90KXMtPmwxX3ZtX3N0YXRlX2luZGV4IDw8IChzLT5jbHVzdGVyX2JpdHMgKyBzLT5sMl9iaXRzKTsKK30KKworc3RhdGljIGludCBxY293X2dldF9pbmZvKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBCbG9ja0RyaXZlckluZm8gKmJkaSkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBiZGktPmNsdXN0ZXJfc2l6ZSA9IHMtPmNsdXN0ZXJfc2l6ZTsKKyAgICBiZGktPnZtX3N0YXRlX29mZnNldCA9IHFjb3dfdm1fc3RhdGVfb2Zmc2V0KHMpOworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcWNvd19jaGVjayhCbG9ja0RyaXZlclN0YXRlICpicywgQmRydkNoZWNrUmVzdWx0ICpyZXN1bHQpCit7CisgICAgcmV0dXJuIHFjb3cyX2NoZWNrX3JlZmNvdW50cyhicywgcmVzdWx0KTsKK30KKworI2lmIDAKK3N0YXRpYyB2b2lkIGR1bXBfcmVmY291bnRzKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZRY293U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludDY0X3QgbmJfY2x1c3RlcnMsIGssIGsxLCBzaXplOworICAgIGludCByZWZjb3VudDsKKworICAgIHNpemUgPSBiZHJ2X2dldGxlbmd0aChicy0+ZmlsZSk7CisgICAgbmJfY2x1c3RlcnMgPSBzaXplX3RvX2NsdXN0ZXJzKHMsIHNpemUpOworICAgIGZvcihrID0gMDsgayA8IG5iX2NsdXN0ZXJzOykgeworICAgICAgICBrMSA9IGs7CisgICAgICAgIHJlZmNvdW50ID0gZ2V0X3JlZmNvdW50KGJzLCBrKTsKKyAgICAgICAgaysrOworICAgICAgICB3aGlsZSAoayA8IG5iX2NsdXN0ZXJzICYmIGdldF9yZWZjb3VudChicywgaykgPT0gcmVmY291bnQpCisgICAgICAgICAgICBrKys7CisgICAgICAgIHByaW50ZigiJSIgUFJJZDY0ICI6IHJlZmNvdW50PSVkIG5iPSUiIFBSSWQ2NCAiXG4iLCBrLCByZWZjb3VudCwKKyAgICAgICAgICAgICAgIGsgLSBrMSk7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcWNvd19zYXZlX3Ztc3RhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSkKK3sKKyAgICBCRFJWUWNvd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgZ3Jvd2FibGUgPSBicy0+Z3Jvd2FibGU7CisgICAgaW50IHJldDsKKworICAgIEJMS0RCR19FVkVOVChicy0+ZmlsZSwgQkxLREJHX1ZNU1RBVEVfU0FWRSk7CisgICAgYnMtPmdyb3dhYmxlID0gMTsKKyAgICByZXQgPSBiZHJ2X3B3cml0ZShicywgcWNvd192bV9zdGF0ZV9vZmZzZXQocykgKyBwb3MsIGJ1Ziwgc2l6ZSk7CisgICAgYnMtPmdyb3dhYmxlID0gZ3Jvd2FibGU7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFjb3dfbG9hZF92bXN0YXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IHNpemUpCit7CisgICAgQkRSVlFjb3dTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGdyb3dhYmxlID0gYnMtPmdyb3dhYmxlOworICAgIGludCByZXQ7CisKKyAgICBCTEtEQkdfRVZFTlQoYnMtPmZpbGUsIEJMS0RCR19WTVNUQVRFX0xPQUQpOworICAgIGJzLT5ncm93YWJsZSA9IDE7CisgICAgcmV0ID0gYmRydl9wcmVhZChicywgcWNvd192bV9zdGF0ZV9vZmZzZXQocykgKyBwb3MsIGJ1Ziwgc2l6ZSk7CisgICAgYnMtPmdyb3dhYmxlID0gZ3Jvd2FibGU7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgUUVNVU9wdGlvblBhcmFtZXRlciBxY293X2NyZWF0ZV9vcHRpb25zW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9IEJMT0NLX09QVF9TSVpFLAorICAgICAgICAudHlwZSA9IE9QVF9TSVpFLAorICAgICAgICAuaGVscCA9ICJWaXJ0dWFsIGRpc2sgc2l6ZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSBCTE9DS19PUFRfQkFDS0lOR19GSUxFLAorICAgICAgICAudHlwZSA9IE9QVF9TVFJJTkcsCisgICAgICAgIC5oZWxwID0gIkZpbGUgbmFtZSBvZiBhIGJhc2UgaW1hZ2UiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gQkxPQ0tfT1BUX0JBQ0tJTkdfRk1ULAorICAgICAgICAudHlwZSA9IE9QVF9TVFJJTkcsCisgICAgICAgIC5oZWxwID0gIkltYWdlIGZvcm1hdCBvZiB0aGUgYmFzZSBpbWFnZSIKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSBCTE9DS19PUFRfRU5DUllQVCwKKyAgICAgICAgLnR5cGUgPSBPUFRfRkxBRywKKyAgICAgICAgLmhlbHAgPSAiRW5jcnlwdCB0aGUgaW1hZ2UiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gQkxPQ0tfT1BUX0NMVVNURVJfU0laRSwKKyAgICAgICAgLnR5cGUgPSBPUFRfU0laRSwKKyAgICAgICAgLmhlbHAgPSAicWNvdzIgY2x1c3RlciBzaXplIgorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9IEJMT0NLX09QVF9QUkVBTExPQywKKyAgICAgICAgLnR5cGUgPSBPUFRfU1RSSU5HLAorICAgICAgICAuaGVscCA9ICJQcmVhbGxvY2F0aW9uIG1vZGUgKGFsbG93ZWQgdmFsdWVzOiBvZmYsIG1ldGFkYXRhKSIKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgQmxvY2tEcml2ZXIgYmRydl9xY293MiA9IHsKKyAgICAuZm9ybWF0X25hbWUJPSAicWNvdzIiLAorICAgIC5pbnN0YW5jZV9zaXplCT0gc2l6ZW9mKEJEUlZRY293U3RhdGUpLAorICAgIC5iZHJ2X3Byb2JlCQk9IHFjb3dfcHJvYmUsCisgICAgLmJkcnZfb3BlbgkJPSBxY293X29wZW4sCisgICAgLmJkcnZfY2xvc2UJCT0gcWNvd19jbG9zZSwKKyAgICAuYmRydl9jcmVhdGUJPSBxY293X2NyZWF0ZSwKKyAgICAuYmRydl9mbHVzaAkJPSBxY293X2ZsdXNoLAorICAgIC5iZHJ2X2lzX2FsbG9jYXRlZAk9IHFjb3dfaXNfYWxsb2NhdGVkLAorICAgIC5iZHJ2X3NldF9rZXkJPSBxY293X3NldF9rZXksCisgICAgLmJkcnZfbWFrZV9lbXB0eQk9IHFjb3dfbWFrZV9lbXB0eSwKKworICAgIC5iZHJ2X2Fpb19yZWFkdgk9IHFjb3dfYWlvX3JlYWR2LAorICAgIC5iZHJ2X2Fpb193cml0ZXYJPSBxY293X2Fpb193cml0ZXYsCisgICAgLmJkcnZfYWlvX2ZsdXNoCT0gcWNvd19haW9fZmx1c2gsCisKKyAgICAuYmRydl90cnVuY2F0ZSAgICAgICAgICA9IHFjb3cyX3RydW5jYXRlLAorICAgIC5iZHJ2X3dyaXRlX2NvbXByZXNzZWQgID0gcWNvd193cml0ZV9jb21wcmVzc2VkLAorCisgICAgLmJkcnZfc25hcHNob3RfY3JlYXRlICAgPSBxY293Ml9zbmFwc2hvdF9jcmVhdGUsCisgICAgLmJkcnZfc25hcHNob3RfZ290byAgICAgPSBxY293Ml9zbmFwc2hvdF9nb3RvLAorICAgIC5iZHJ2X3NuYXBzaG90X2RlbGV0ZSAgID0gcWNvdzJfc25hcHNob3RfZGVsZXRlLAorICAgIC5iZHJ2X3NuYXBzaG90X2xpc3QgICAgID0gcWNvdzJfc25hcHNob3RfbGlzdCwKKyAgICAuYmRydl9nZXRfaW5mbwk9IHFjb3dfZ2V0X2luZm8sCisKKyAgICAuYmRydl9zYXZlX3Ztc3RhdGUgICAgPSBxY293X3NhdmVfdm1zdGF0ZSwKKyAgICAuYmRydl9sb2FkX3Ztc3RhdGUgICAgPSBxY293X2xvYWRfdm1zdGF0ZSwKKworICAgIC5iZHJ2X2NoYW5nZV9iYWNraW5nX2ZpbGUgICA9IHFjb3cyX2NoYW5nZV9iYWNraW5nX2ZpbGUsCisKKyAgICAuY3JlYXRlX29wdGlvbnMgPSBxY293X2NyZWF0ZV9vcHRpb25zLAorICAgIC5iZHJ2X2NoZWNrID0gcWNvd19jaGVjaywKK307CisKK3N0YXRpYyB2b2lkIGJkcnZfcWNvdzJfaW5pdCh2b2lkKQoreworICAgIGJkcnZfcmVnaXN0ZXIoJmJkcnZfcWNvdzIpOworfQorCitibG9ja19pbml0KGJkcnZfcWNvdzJfaW5pdCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Fjb3cyLmggYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Fjb3cyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmMzYyNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYmxvY2svcWNvdzIuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIEJsb2NrIGRyaXZlciBmb3IgdGhlIFFDT1cgdmVyc2lvbiAyIGZvcm1hdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEJMT0NLX1FDT1cyX0gKKyNkZWZpbmUgQkxPQ0tfUUNPVzJfSAorCisjaW5jbHVkZSAicWVtdS9hZXMuaCIKKworLy8jZGVmaW5lIERFQlVHX0FMTE9DCisvLyNkZWZpbmUgREVCVUdfQUxMT0MyCisvLyNkZWZpbmUgREVCVUdfRVhUCisKKyNkZWZpbmUgUUNPV19NQUdJQyAoKCdRJyA8PCAyNCkgfCAoJ0YnIDw8IDE2KSB8ICgnSScgPDwgOCkgfCAweGZiKQorI2RlZmluZSBRQ09XX1ZFUlNJT04gMgorCisjZGVmaW5lIFFDT1dfQ1JZUFRfTk9ORSAwCisjZGVmaW5lIFFDT1dfQ1JZUFRfQUVTICAxCisKKyNkZWZpbmUgUUNPV19NQVhfQ1JZUFRfQ0xVU1RFUlMgMzIKKworLyogaW5kaWNhdGUgdGhhdCB0aGUgcmVmY291bnQgb2YgdGhlIHJlZmVyZW5jZWQgY2x1c3RlciBpcyBleGFjdGx5IG9uZS4gKi8KKyNkZWZpbmUgUUNPV19PRkxBR19DT1BJRUQgICAgICgxTEwgPDwgNjMpCisvKiBpbmRpY2F0ZSB0aGF0IHRoZSBjbHVzdGVyIGlzIGNvbXByZXNzZWQgKHRoZXkgbmV2ZXIgaGF2ZSB0aGUgY29waWVkIGZsYWcpICovCisjZGVmaW5lIFFDT1dfT0ZMQUdfQ09NUFJFU1NFRCAoMUxMIDw8IDYyKQorCisjZGVmaW5lIFJFRkNPVU5UX1NISUZUIDEgLyogcmVmY291bnQgc2l6ZSBpcyAyIGJ5dGVzICovCisKKyNkZWZpbmUgTUlOX0NMVVNURVJfQklUUyA5CisjZGVmaW5lIE1BWF9DTFVTVEVSX0JJVFMgMjEKKworI2RlZmluZSBMMl9DQUNIRV9TSVpFIDE2CisKK3R5cGVkZWYgc3RydWN0IFFDb3dIZWFkZXIgeworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgdWludDY0X3QgYmFja2luZ19maWxlX29mZnNldDsKKyAgICB1aW50MzJfdCBiYWNraW5nX2ZpbGVfc2l6ZTsKKyAgICB1aW50MzJfdCBjbHVzdGVyX2JpdHM7CisgICAgdWludDY0X3Qgc2l6ZTsgLyogaW4gYnl0ZXMgKi8KKyAgICB1aW50MzJfdCBjcnlwdF9tZXRob2Q7CisgICAgdWludDMyX3QgbDFfc2l6ZTsgLyogWFhYOiBzYXZlIG51bWJlciBvZiBjbHVzdGVycyBpbnN0ZWFkID8gKi8KKyAgICB1aW50NjRfdCBsMV90YWJsZV9vZmZzZXQ7CisgICAgdWludDY0X3QgcmVmY291bnRfdGFibGVfb2Zmc2V0OworICAgIHVpbnQzMl90IHJlZmNvdW50X3RhYmxlX2NsdXN0ZXJzOworICAgIHVpbnQzMl90IG5iX3NuYXBzaG90czsKKyAgICB1aW50NjRfdCBzbmFwc2hvdHNfb2Zmc2V0OworfSBRQ293SGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBRQ293U25hcHNob3QgeworICAgIHVpbnQ2NF90IGwxX3RhYmxlX29mZnNldDsKKyAgICB1aW50MzJfdCBsMV9zaXplOworICAgIGNoYXIgKmlkX3N0cjsKKyAgICBjaGFyICpuYW1lOworICAgIHVpbnQzMl90IHZtX3N0YXRlX3NpemU7CisgICAgdWludDMyX3QgZGF0ZV9zZWM7CisgICAgdWludDMyX3QgZGF0ZV9uc2VjOworICAgIHVpbnQ2NF90IHZtX2Nsb2NrX25zZWM7Cit9IFFDb3dTbmFwc2hvdDsKKwordHlwZWRlZiBzdHJ1Y3QgQkRSVlFjb3dTdGF0ZSB7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqaGQ7CisgICAgaW50IGNsdXN0ZXJfYml0czsKKyAgICBpbnQgY2x1c3Rlcl9zaXplOworICAgIGludCBjbHVzdGVyX3NlY3RvcnM7CisgICAgaW50IGwyX2JpdHM7CisgICAgaW50IGwyX3NpemU7CisgICAgaW50IGwxX3NpemU7CisgICAgaW50IGwxX3ZtX3N0YXRlX2luZGV4OworICAgIGludCBjc2l6ZV9zaGlmdDsKKyAgICBpbnQgY3NpemVfbWFzazsKKyAgICB1aW50NjRfdCBjbHVzdGVyX29mZnNldF9tYXNrOworICAgIHVpbnQ2NF90IGwxX3RhYmxlX29mZnNldDsKKyAgICB1aW50NjRfdCAqbDFfdGFibGU7CisgICAgdWludDY0X3QgKmwyX2NhY2hlOworICAgIHVpbnQ2NF90IGwyX2NhY2hlX29mZnNldHNbTDJfQ0FDSEVfU0laRV07CisgICAgdWludDMyX3QgbDJfY2FjaGVfY291bnRzW0wyX0NBQ0hFX1NJWkVdOworICAgIHVpbnQ4X3QgKmNsdXN0ZXJfY2FjaGU7CisgICAgdWludDhfdCAqY2x1c3Rlcl9kYXRhOworICAgIHVpbnQ2NF90IGNsdXN0ZXJfY2FjaGVfb2Zmc2V0OworICAgIFFMSVNUX0hFQUQoUUNvd0NsdXN0ZXJBbGxvYywgUUNvd0wyTWV0YSkgY2x1c3Rlcl9hbGxvY3M7CisKKyAgICB1aW50NjRfdCAqcmVmY291bnRfdGFibGU7CisgICAgdWludDY0X3QgcmVmY291bnRfdGFibGVfb2Zmc2V0OworICAgIHVpbnQzMl90IHJlZmNvdW50X3RhYmxlX3NpemU7CisgICAgdWludDY0X3QgcmVmY291bnRfYmxvY2tfY2FjaGVfb2Zmc2V0OworICAgIHVpbnQxNl90ICpyZWZjb3VudF9ibG9ja19jYWNoZTsKKyAgICBpbnQ2NF90IGZyZWVfY2x1c3Rlcl9pbmRleDsKKyAgICBpbnQ2NF90IGZyZWVfYnl0ZV9vZmZzZXQ7CisKKyAgICB1aW50MzJfdCBjcnlwdF9tZXRob2Q7IC8qIGN1cnJlbnQgY3J5cHQgbWV0aG9kLCAwIGlmIG5vIGtleSB5ZXQgKi8KKyAgICB1aW50MzJfdCBjcnlwdF9tZXRob2RfaGVhZGVyOworICAgIEFFU19LRVkgYWVzX2VuY3J5cHRfa2V5OworICAgIEFFU19LRVkgYWVzX2RlY3J5cHRfa2V5OworICAgIHVpbnQ2NF90IHNuYXBzaG90c19vZmZzZXQ7CisgICAgaW50IHNuYXBzaG90c19zaXplOworICAgIGludCBuYl9zbmFwc2hvdHM7CisgICAgUUNvd1NuYXBzaG90ICpzbmFwc2hvdHM7Cit9IEJEUlZRY293U3RhdGU7CisKKy8qIFhYWDogdXNlIHN0ZCBxY293IG9wZW4gZnVuY3Rpb24gPyAqLwordHlwZWRlZiBzdHJ1Y3QgUUNvd0NyZWF0ZVN0YXRlIHsKKyAgICBpbnQgY2x1c3Rlcl9zaXplOworICAgIGludCBjbHVzdGVyX2JpdHM7CisgICAgdWludDE2X3QgKnJlZmNvdW50X2Jsb2NrOworICAgIHVpbnQ2NF90ICpyZWZjb3VudF90YWJsZTsKKyAgICBpbnQ2NF90IGwxX3RhYmxlX29mZnNldDsKKyAgICBpbnQ2NF90IHJlZmNvdW50X3RhYmxlX29mZnNldDsKKyAgICBpbnQ2NF90IHJlZmNvdW50X2Jsb2NrX29mZnNldDsKK30gUUNvd0NyZWF0ZVN0YXRlOworCitzdHJ1Y3QgUUNvd0FJT0NCOworCisvKiBYWFggVGhpcyBjb3VsZCBiZSBwcml2YXRlIGZvciBxY293Mi1jbHVzdGVyLmMgKi8KK3R5cGVkZWYgc3RydWN0IFFDb3dMMk1ldGEKK3sKKyAgICB1aW50NjRfdCBvZmZzZXQ7CisgICAgdWludDY0X3QgY2x1c3Rlcl9vZmZzZXQ7CisgICAgaW50IG5fc3RhcnQ7CisgICAgaW50IG5iX2F2YWlsYWJsZTsKKyAgICBpbnQgbmJfY2x1c3RlcnM7CisgICAgc3RydWN0IFFDb3dMMk1ldGEgKmRlcGVuZHNfb247CisgICAgUUxJU1RfSEVBRChRQ293QWlvRGVwZW5kZW5jaWVzLCBRQ293QUlPQ0IpIGRlcGVuZGVudF9yZXF1ZXN0czsKKworICAgIFFMSVNUX0VOVFJZKFFDb3dMMk1ldGEpIG5leHRfaW5fZmxpZ2h0OworfSBRQ293TDJNZXRhOworCitzdGF0aWMgaW5saW5lIGludCBzaXplX3RvX2NsdXN0ZXJzKEJEUlZRY293U3RhdGUgKnMsIGludDY0X3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gKHNpemUgKyAocy0+Y2x1c3Rlcl9zaXplIC0gMSkpID4+IHMtPmNsdXN0ZXJfYml0czsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2l6ZV90b19sMShCRFJWUWNvd1N0YXRlICpzLCBpbnQ2NF90IHNpemUpCit7CisgICAgaW50IHNoaWZ0ID0gcy0+Y2x1c3Rlcl9iaXRzICsgcy0+bDJfYml0czsKKyAgICByZXR1cm4gKHNpemUgKyAoMVVMTCA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdDsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IGFsaWduX29mZnNldChpbnQ2NF90IG9mZnNldCwgaW50IG4pCit7CisgICAgb2Zmc2V0ID0gKG9mZnNldCArIG4gLSAxKSAmIH4obiAtIDEpOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKKworLy8gRklYTUUgTmVlZCBxY293Ml8gcHJlZml4IHRvIGdsb2JhbCBmdW5jdGlvbnMKKworLyogcWNvdzIuYyBmdW5jdGlvbnMgKi8KK2ludCBxY293Ml9iYWNraW5nX3JlYWQxKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKTsKKworLyogcWNvdzItcmVmY291bnQuYyBmdW5jdGlvbnMgKi8KK2ludCBxY293Ml9yZWZjb3VudF9pbml0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK3ZvaWQgcWNvdzJfcmVmY291bnRfY2xvc2UoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworCitpbnQ2NF90IHFjb3cyX2FsbG9jX2NsdXN0ZXJzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNpemUpOworaW50NjRfdCBxY293Ml9hbGxvY19ieXRlcyhCbG9ja0RyaXZlclN0YXRlICpicywgaW50IHNpemUpOwordm9pZCBxY293Ml9mcmVlX2NsdXN0ZXJzKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IHNpemUpOwordm9pZCBxY293Ml9mcmVlX2FueV9jbHVzdGVycyhCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICB1aW50NjRfdCBjbHVzdGVyX29mZnNldCwgaW50IG5iX2NsdXN0ZXJzKTsKKwordm9pZCBxY293Ml9jcmVhdGVfcmVmY291bnRfdXBkYXRlKFFDb3dDcmVhdGVTdGF0ZSAqcywgaW50NjRfdCBvZmZzZXQsCisgICAgaW50NjRfdCBzaXplKTsKK2ludCBxY293Ml91cGRhdGVfc25hcHNob3RfcmVmY291bnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgaW50NjRfdCBsMV90YWJsZV9vZmZzZXQsIGludCBsMV9zaXplLCBpbnQgYWRkZW5kKTsKKworaW50IHFjb3cyX2NoZWNrX3JlZmNvdW50cyhCbG9ja0RyaXZlclN0YXRlICpicywgQmRydkNoZWNrUmVzdWx0ICpyZXMpOworCisvKiBxY293Mi1jbHVzdGVyLmMgZnVuY3Rpb25zICovCitpbnQgcWNvdzJfZ3Jvd19sMV90YWJsZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50IG1pbl9zaXplKTsKK3ZvaWQgcWNvdzJfbDJfY2FjaGVfcmVzZXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworaW50IHFjb3cyX2RlY29tcHJlc3NfY2x1c3RlcihCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3QgY2x1c3Rlcl9vZmZzZXQpOwordm9pZCBxY293Ml9lbmNyeXB0X3NlY3RvcnMoQkRSVlFjb3dTdGF0ZSAqcywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0X2J1ZiwgY29uc3QgdWludDhfdCAqaW5fYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NlY3RvcnMsIGludCBlbmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBRVNfS0VZICprZXkpOworCitpbnQgcWNvdzJfZ2V0X2NsdXN0ZXJfb2Zmc2V0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50NjRfdCBvZmZzZXQsCisgICAgaW50ICpudW0sIHVpbnQ2NF90ICpjbHVzdGVyX29mZnNldCk7CitpbnQgcWNvdzJfYWxsb2NfY2x1c3Rlcl9vZmZzZXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHVpbnQ2NF90IG9mZnNldCwKKyAgICBpbnQgbl9zdGFydCwgaW50IG5fZW5kLCBpbnQgKm51bSwgUUNvd0wyTWV0YSAqbSk7Cit1aW50NjRfdCBxY293Ml9hbGxvY19jb21wcmVzc2VkX2NsdXN0ZXJfb2Zmc2V0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2VkX3NpemUpOworCitpbnQgcWNvdzJfYWxsb2NfY2x1c3Rlcl9saW5rX2wyKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBRQ293TDJNZXRhICptKTsKKworLyogcWNvdzItc25hcHNob3QuYyBmdW5jdGlvbnMgKi8KK2ludCBxY293Ml9zbmFwc2hvdF9jcmVhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIFFFTVVTbmFwc2hvdEluZm8gKnNuX2luZm8pOworaW50IHFjb3cyX3NuYXBzaG90X2dvdG8oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKTsKK2ludCBxY293Ml9zbmFwc2hvdF9kZWxldGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKTsKK2ludCBxY293Ml9zbmFwc2hvdF9saXN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBRRU1VU25hcHNob3RJbmZvICoqcHNuX3RhYik7CisKK3ZvaWQgcWNvdzJfZnJlZV9zbmFwc2hvdHMoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworaW50IHFjb3cyX3JlYWRfc25hcHNob3RzKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy1wb3NpeC1haW8uaCBiL2FuZHJvaWQvcWVtdTEvYmxvY2svcmF3LXBvc2l4LWFpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzYzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy1wb3NpeC1haW8uaApAQCAtMCwwICsxLDQzIEBACisvKgorICogUUVNVSBQb3NpeCBibG9jayBJL08gYmFja2VuZCBBSU8gc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKyNpZm5kZWYgUUVNVV9SQVdfUE9TSVhfQUlPX0gKKyNkZWZpbmUgUUVNVV9SQVdfUE9TSVhfQUlPX0gKKworLyogQUlPIHJlcXVlc3QgdHlwZXMgKi8KKyNkZWZpbmUgUUVNVV9BSU9fUkVBRCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBRRU1VX0FJT19XUklURSAgICAgICAgMHgwMDAyCisjZGVmaW5lIFFFTVVfQUlPX0lPQ1RMICAgICAgICAweDAwMDQKKyNkZWZpbmUgUUVNVV9BSU9fRkxVU0ggICAgICAgIDB4MDAwOAorI2RlZmluZSBRRU1VX0FJT19UWVBFX01BU0sgXAorCShRRU1VX0FJT19SRUFEfFFFTVVfQUlPX1dSSVRFfFFFTVVfQUlPX0lPQ1RMfFFFTVVfQUlPX0ZMVVNIKQorCisvKiBBSU8gZmxhZ3MgKi8KKyNkZWZpbmUgUUVNVV9BSU9fTUlTQUxJR05FRCAgIDB4MTAwMAorCisKKy8qIHBvc2l4LWFpby1jb21wYXQuYyAtIHRocmVhZCBwb29sIGJhc2VkIGltcGxlbWVudGF0aW9uICovCitpbnQgcGFpb19pbml0KHZvaWQpOworQmxvY2tEcml2ZXJBSU9DQiAqcGFpb19zdWJtaXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBmZCwKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlLCBpbnQgdHlwZSk7CitCbG9ja0RyaXZlckFJT0NCICpwYWlvX2lvY3RsKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgZmQsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlcSwgdm9pZCAqYnVmLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKKworLyogbGludXgtYWlvLmMgLSBMaW51eCBuYXRpdmUgaW1wbGVtZW50YXRpb24gKi8KK3ZvaWQgKmxhaW9faW5pdCh2b2lkKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmxhaW9fc3VibWl0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB2b2lkICphaW9fY3R4LCBpbnQgZmQsCisgICAgICAgIGludDY0X3Qgc2VjdG9yX251bSwgUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSwgaW50IHR5cGUpOworCisjZW5kaWYgLyogUUVNVV9SQVdfUE9TSVhfQUlPX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcmF3LXBvc2l4LmMgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy1wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMGMxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy1wb3NpeC5jCkBAIC0wLDAgKzEsMTM4MyBAQAorLyoKKyAqIEJsb2NrIGRyaXZlciBmb3IgUkFXIGZpbGVzIChwb3NpeCkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJxZW11L2xvZy5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrX2ludC5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisjaW5jbHVkZSAiYmxvY2svcmF3LXBvc2l4LWFpby5oIgorCisjaWZkZWYgQ09ORklHX0NPQ09BCisjaW5jbHVkZSA8cGF0aHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxJT0tpdC9JT0tpdExpYi5oPgorI2luY2x1ZGUgPElPS2l0L0lPQlNELmg+CisjaW5jbHVkZSA8SU9LaXQvc3RvcmFnZS9JT01lZGlhQlNEQ2xpZW50Lmg+CisjaW5jbHVkZSA8SU9LaXQvc3RvcmFnZS9JT01lZGlhLmg+CisjaW5jbHVkZSA8SU9LaXQvc3RvcmFnZS9JT0NETWVkaWEuaD4KKy8vI2luY2x1ZGUgPElPS2l0L3N0b3JhZ2UvSU9DRFR5cGVzLmg+CisjaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KKyNlbmRpZgorCisjaWZkZWYgX19zdW5fXworI2RlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy9ka2lvLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZkLmg+CisjZW5kaWYKKyNpZiBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL2Rpc2suaD4KKyNpbmNsdWRlIDxzeXMvY2Rpby5oPgorI2VuZGlmCisKKyNpZmRlZiBfX09wZW5CU0RfXworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9kaXNrbGFiZWwuaD4KKyNpbmNsdWRlIDxzeXMvZGtpby5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0RyYWdvbkZseV9fCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL2Rpc2tzbGljZS5oPgorI2VuZGlmCisKKy8vI2RlZmluZSBERUJVR19GTE9QUFkKKworLy8jZGVmaW5lIERFQlVHX0JMT0NLCisjaWYgZGVmaW5lZChERUJVR19CTE9DSykKKyNkZWZpbmUgREVCVUdfQkxPQ0tfUFJJTlQoZm9ybWF0Q3N0ciwgLi4uKSBkbyB7IGlmIChxZW11X2xvZ19lbmFibGVkKCkpIFwKKyAgICB7IHFlbXVfbG9nKGZvcm1hdENzdHIsICMjIF9fVkFfQVJHU19fKTsgcWVtdV9sb2dfZmx1c2goKTsgfSB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfQkxPQ0tfUFJJTlQoZm9ybWF0Q3N0ciwgLi4uKQorI2VuZGlmCisKKy8qIE9TIFggZG9lcyBub3QgaGF2ZSBPX0RTWU5DICovCisjaWZuZGVmIE9fRFNZTkMKKyNpZmRlZiBPX1NZTkMKKyNkZWZpbmUgT19EU1lOQyBPX1NZTkMKKyNlbGlmIGRlZmluZWQoT19GU1lOQykKKyNkZWZpbmUgT19EU1lOQyBPX0ZTWU5DCisjZW5kaWYKKyNlbmRpZgorCisvKiBBcHByb3hpbWF0ZSBPX0RJUkVDVCB3aXRoIE9fRFNZTkMgaWYgT19ESVJFQ1QgaXNuJ3QgYXZhaWxhYmxlICovCisjaWZuZGVmIE9fRElSRUNUCisjZGVmaW5lIE9fRElSRUNUIE9fRFNZTkMKKyNlbmRpZgorCisjZGVmaW5lIEZUWVBFX0ZJTEUgICAwCisjZGVmaW5lIEZUWVBFX0NEICAgICAxCisjZGVmaW5lIEZUWVBFX0ZEICAgICAyCisKKyNkZWZpbmUgQUxJR05FRF9CVUZGRVJfU0laRSAoMzIgKiA1MTIpCisKKy8qIGlmIHRoZSBGRCBpcyBub3QgYWNjZXNzZWQgZHVyaW5nIHRoYXQgdGltZSAoaW4gbXMpLCB3ZSB0cnkgdG8KKyAgIHJlb3BlbiBpdCB0byBzZWUgaWYgdGhlIGRpc2sgaGFzIGJlZW4gY2hhbmdlZCAqLworI2RlZmluZSBGRF9PUEVOX1RJTUVPVVQgMTAwMAorCit0eXBlZGVmIHN0cnVjdCBCRFJWUmF3U3RhdGUgeworICAgIGludCBmZDsKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgb3Blbl9mbGFnczsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICAvKiBsaW51eCBmbG9wcHkgc3BlY2lmaWMgKi8KKyAgICBpbnQ2NF90IGZkX29wZW5fdGltZTsKKyAgICBpbnQ2NF90IGZkX2Vycm9yX3RpbWU7CisgICAgaW50IGZkX2dvdF9lcnJvcjsKKyAgICBpbnQgZmRfbWVkaWFfY2hhbmdlZDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19MSU5VWF9BSU8KKyAgICBpbnQgdXNlX2FpbzsKKyAgICB2b2lkICphaW9fY3R4OworI2VuZGlmCisgICAgdWludDhfdCogYWxpZ25lZF9idWY7Cit9IEJEUlZSYXdTdGF0ZTsKKworc3RhdGljIGludCBmZF9vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK3N0YXRpYyBpbnQ2NF90IHJhd19nZXRsZW5ndGgoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCitzdGF0aWMgaW50IGNkcm9tX3Jlb3BlbihCbG9ja0RyaXZlclN0YXRlICpicyk7CisjZW5kaWYKKworc3RhdGljIGludCByYXdfb3Blbl9jb21tb24oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJkcnZfZmxhZ3MsIGludCBvcGVuX2ZsYWdzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGZkLCByZXQ7CisKKyAgICBzLT5vcGVuX2ZsYWdzID0gb3Blbl9mbGFncyB8IE9fQklOQVJZOworICAgIHMtPm9wZW5fZmxhZ3MgJj0gfk9fQUNDTU9ERTsKKyAgICBpZiAoYmRydl9mbGFncyAmIEJEUlZfT19SRFdSKSB7CisgICAgICAgIHMtPm9wZW5fZmxhZ3MgfD0gT19SRFdSOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPm9wZW5fZmxhZ3MgfD0gT19SRE9OTFk7CisgICAgfQorCisgICAgLyogVXNlIE9fRFNZTkMgZm9yIHdyaXRlLXRocm91Z2ggY2FjaGluZywgbm8gZmxhZ3MgZm9yIHdyaXRlLWJhY2sgY2FjaGluZywKKyAgICAgKiBhbmQgT19ESVJFQ1QgZm9yIG5vIGNhY2hpbmcuICovCisgICAgaWYgKChiZHJ2X2ZsYWdzICYgQkRSVl9PX05PQ0FDSEUpKQorICAgICAgICBzLT5vcGVuX2ZsYWdzIHw9IE9fRElSRUNUOworICAgIGVsc2UgaWYgKCEoYmRydl9mbGFncyAmIEJEUlZfT19DQUNIRV9XQikpCisgICAgICAgIHMtPm9wZW5fZmxhZ3MgfD0gT19EU1lOQzsKKworICAgIHMtPmZkID0gLTE7CisgICAgZmQgPSBxZW11X29wZW4oZmlsZW5hbWUsIHMtPm9wZW5fZmxhZ3MsIDA2NDQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICBpZiAocmV0ID09IC1FUk9GUykKKyAgICAgICAgICAgIHJldCA9IC1FQUNDRVM7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHMtPmZkID0gZmQ7CisgICAgcy0+YWxpZ25lZF9idWYgPSBOVUxMOworCisgICAgaWYgKChiZHJ2X2ZsYWdzICYgQkRSVl9PX05PQ0FDSEUpKSB7CisgICAgICAgIHMtPmFsaWduZWRfYnVmID0gcWVtdV9ibG9ja2FsaWduKGJzLCBBTElHTkVEX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgaWYgKHMtPmFsaWduZWRfYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0X2Nsb3NlOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgQ09ORklHX0xJTlVYX0FJTworICAgIGlmICgoYmRydl9mbGFncyAmIChCRFJWX09fTk9DQUNIRXxCRFJWX09fTkFUSVZFX0FJTykpID09CisgICAgICAgICAgICAgICAgICAgICAgKEJEUlZfT19OT0NBQ0hFfEJEUlZfT19OQVRJVkVfQUlPKSkgeworCisgICAgICAgIC8qIFdlJ3JlIGZhbGxpbmcgYmFjayB0byBQT1NJWCBBSU8gaW4gc29tZSBjYXNlcyAqLworICAgICAgICBwYWlvX2luaXQoKTsKKworICAgICAgICBzLT5haW9fY3R4ID0gbGFpb19pbml0KCk7CisgICAgICAgIGlmICghcy0+YWlvX2N0eCkgeworICAgICAgICAgICAgZ290byBvdXRfZnJlZV9idWY7CisgICAgICAgIH0KKyAgICAgICAgcy0+dXNlX2FpbyA9IDE7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGlmIChwYWlvX2luaXQoKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gb3V0X2ZyZWVfYnVmOworICAgICAgICB9CisjaWZkZWYgQ09ORklHX0xJTlVYX0FJTworICAgICAgICBzLT51c2VfYWlvID0gMDsKKyNlbmRpZgorICAgIH0KKworICAgIHJldHVybiAwOworCitvdXRfZnJlZV9idWY6CisgICAgcWVtdV92ZnJlZShzLT5hbGlnbmVkX2J1Zik7CitvdXRfY2xvc2U6CisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiAtZXJybm87Cit9CisKK3N0YXRpYyBpbnQgcmF3X29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIHMtPnR5cGUgPSBGVFlQRV9GSUxFOworICAgIHJldHVybiByYXdfb3Blbl9jb21tb24oYnMsIGZpbGVuYW1lLCBmbGFncywgMCk7Cit9CisKKy8qIFhYWDogdXNlIGhvc3Qgc2VjdG9yIHNpemUgaWYgbmVjZXNzYXJ5IHdpdGg6CisjaWZkZWYgRElPQ0dTRUNUT1JTSVpFCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZWN0b3JzaXplID0gNTEyOworICAgICAgICAgICAgaWYgKCFpb2N0bChmZCwgRElPQ0dTRUNUT1JTSVpFLCAmc2VjdG9yc2l6ZSkgJiYKKyAgICAgICAgICAgICAgICBzZWN0b3JzaXplID4gYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICBidWZzaXplID0gc2VjdG9yc2l6ZTsKKyAgICAgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPQ09BCisgICAgICAgIHVpbnQzMl90IGJsb2NrU2l6ZSA9IDUxMjsKKyAgICAgICAgaWYgKCAhaW9jdGwoIGZkLCBES0lPQ0dFVEJMT0NLU0laRSwgJmJsb2NrU2l6ZSApICYmIGJsb2NrU2l6ZSA+IGJ1ZnNpemUpIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBibG9ja1NpemU7CisgICAgICAgIH0KKyNlbmRpZgorKi8KKworLyoKKyAqIG9mZnNldCBhbmQgY291bnQgYXJlIGluIGJ5dGVzLCBidXQgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNTEyIGZvciBmaWxlcworICogb3BlbmVkIHdpdGggT19ESVJFQ1QuIGJ1ZiBtdXN0IGJlIGFsaWduZWQgdG8gNTEyIGJ5dGVzIHRoZW4uCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgYWxpZ25tZW50IGlmIHRoZSBjYWxsZXIgZW5zdXJlcworICogdGhhdCBPX0RJUkVDVCBpcyBub3QgaW4gZWZmZWN0LgorICovCitzdGF0aWMgaW50IHJhd19wcmVhZF9hbGlnbmVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGNvdW50KQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZkX29wZW4oYnMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gcHJlYWQocy0+ZmQsIGJ1ZiwgY291bnQsIG9mZnNldCk7CisgICAgaWYgKHJldCA9PSBjb3VudCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIEFsbG93IHJlYWRzIGJleW9uZCB0aGUgZW5kIChuZWVkZWQgZm9yIHB3cml0ZSkgKi8KKyAgICBpZiAoKHJldCA9PSAwKSAmJiBicy0+Z3Jvd2FibGUpIHsKKyAgICAgICAgaW50NjRfdCBzaXplID0gcmF3X2dldGxlbmd0aChicyk7CisgICAgICAgIGlmIChvZmZzZXQgPj0gc2l6ZSkgeworICAgICAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgY291bnQpOworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgREVCVUdfQkxPQ0tfUFJJTlQoInJhd19wcmVhZCglZDolcywgJSIgUFJJZDY0ICIsICVwLCAlZCkgWyUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICJdIHJlYWQgZmFpbGVkICVkIDogJWQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzLT5mZCwgYnMtPmZpbGVuYW1lLCBvZmZzZXQsIGJ1ZiwgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgYnMtPnRvdGFsX3NlY3RvcnMsIHJldCwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisKKyAgICAvKiBUcnkgaGFyZGVyIGZvciBDRHJvbS4gKi8KKyAgICBpZiAocy0+dHlwZSAhPSBGVFlQRV9GSUxFKSB7CisgICAgICAgIHJldCA9IHByZWFkKHMtPmZkLCBidWYsIGNvdW50LCBvZmZzZXQpOworICAgICAgICBpZiAocmV0ID09IGNvdW50KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gcHJlYWQocy0+ZmQsIGJ1ZiwgY291bnQsIG9mZnNldCk7CisgICAgICAgIGlmIChyZXQgPT0gY291bnQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIERFQlVHX0JMT0NLX1BSSU5UKCJyYXdfcHJlYWQoJWQ6JXMsICUiIFBSSWQ2NCAiLCAlcCwgJWQpIFslIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIl0gcmV0cnkgcmVhZCBmYWlsZWQgJWQgOiAlZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mZCwgYnMtPmZpbGVuYW1lLCBvZmZzZXQsIGJ1ZiwgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJzLT50b3RhbF9zZWN0b3JzLCByZXQsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIHJldHVybiAgKHJldCA8IDApID8gLWVycm5vIDogcmV0OworfQorCisvKgorICogb2Zmc2V0IGFuZCBjb3VudCBhcmUgaW4gYnl0ZXMsIGJ1dCBtdXN0IGJlIG11bHRpcGxlcyBvZiA1MTIgZm9yIGZpbGVzCisgKiBvcGVuZWQgd2l0aCBPX0RJUkVDVC4gYnVmIG11c3QgYmUgYWxpZ25lZCB0byA1MTIgYnl0ZXMgdGhlbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aG91dCBhbGlnbm1lbnQgaWYgdGhlIGNhbGxlciBlbnN1cmVzCisgKiB0aGF0IE9fRElSRUNUIGlzIG5vdCBpbiBlZmZlY3QuCisgKi8KK3N0YXRpYyBpbnQgcmF3X3B3cml0ZV9hbGlnbmVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBjb3VudCkKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZF9vcGVuKGJzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIHJldCA9IHB3cml0ZShzLT5mZCwgYnVmLCBjb3VudCwgb2Zmc2V0KTsKKyAgICBpZiAocmV0ID09IGNvdW50KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgREVCVUdfQkxPQ0tfUFJJTlQoInJhd19wd3JpdGUoJWQ6JXMsICUiIFBSSWQ2NCAiLCAlcCwgJWQpIFslIiBQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgICAiXSB3cml0ZSBmYWlsZWQgJWQgOiAlZCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHMtPmZkLCBicy0+ZmlsZW5hbWUsIG9mZnNldCwgYnVmLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBicy0+dG90YWxfc2VjdG9ycywgcmV0LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIHJldHVybiAgKHJldCA8IDApID8gLWVycm5vIDogcmV0OworfQorCisKKy8qCisgKiBvZmZzZXQgYW5kIGNvdW50IGFyZSBpbiBieXRlcyBhbmQgcG9zc2libHkgbm90IGFsaWduZWQuIEZvciBmaWxlcyBvcGVuZWQKKyAqIHdpdGggT19ESVJFQ1QsIG5lY2Vzc2FyeSBhbGlnbm1lbnRzIGFyZSBlbnN1cmVkIGJlZm9yZSBjYWxsaW5nCisgKiByYXdfcHJlYWRfYWxpZ25lZCB0byBkbyB0aGUgYWN0dWFsIHJlYWQuCisgKi8KK3N0YXRpYyBpbnQgcmF3X3ByZWFkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGNvdW50KQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IHNpemUsIHJldCwgc2hpZnQsIHN1bTsKKworICAgIHN1bSA9IDA7CisKKyAgICBpZiAocy0+YWxpZ25lZF9idWYgIT0gTlVMTCkgIHsKKworICAgICAgICBpZiAob2Zmc2V0ICYgMHgxZmYpIHsKKyAgICAgICAgICAgIC8qIGFsaWduIG9mZnNldCBvbiBhIDUxMiBieXRlcyBib3VuZGFyeSAqLworCisgICAgICAgICAgICBzaGlmdCA9IG9mZnNldCAmIDB4MWZmOworICAgICAgICAgICAgc2l6ZSA9IChzaGlmdCArIGNvdW50ICsgMHgxZmYpICYgfjB4MWZmOworICAgICAgICAgICAgaWYgKHNpemUgPiBBTElHTkVEX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIHNpemUgPSBBTElHTkVEX0JVRkZFUl9TSVpFOworICAgICAgICAgICAgcmV0ID0gcmF3X3ByZWFkX2FsaWduZWQoYnMsIG9mZnNldCAtIHNoaWZ0LCBzLT5hbGlnbmVkX2J1Ziwgc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBzaXplID0gNTEyIC0gc2hpZnQ7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IGNvdW50KQorICAgICAgICAgICAgICAgIHNpemUgPSBjb3VudDsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHMtPmFsaWduZWRfYnVmICsgc2hpZnQsIHNpemUpOworCisgICAgICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplOworICAgICAgICAgICAgY291bnQgLT0gc2l6ZTsKKyAgICAgICAgICAgIHN1bSArPSBzaXplOworCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCAmIDB4MWZmIHx8ICh1aW50cHRyX3QpIGJ1ZiAmIDB4MWZmKSB7CisKKyAgICAgICAgICAgIC8qIHJlYWQgb24gYWxpZ25lZCBidWZmZXIgKi8KKworICAgICAgICAgICAgd2hpbGUgKGNvdW50KSB7CisKKyAgICAgICAgICAgICAgICBzaXplID0gKGNvdW50ICsgMHgxZmYpICYgfjB4MWZmOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gQUxJR05FRF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEFMSUdORURfQlVGRkVSX1NJWkU7CisKKyAgICAgICAgICAgICAgICByZXQgPSByYXdfcHJlYWRfYWxpZ25lZChicywgb2Zmc2V0LCBzLT5hbGlnbmVkX2J1Ziwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicmF3X3ByZWFkOiByZWFkIGJleW9uZCBlbmQgb2YgZmlsZVxuIik7CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2l6ZSA9IHJldDsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+IGNvdW50KQorICAgICAgICAgICAgICAgICAgICBzaXplID0gY291bnQ7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBzLT5hbGlnbmVkX2J1Ziwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBzaXplOworICAgICAgICAgICAgICAgIHN1bSArPSBzaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJhd19wcmVhZF9hbGlnbmVkKGJzLCBvZmZzZXQsIGJ1ZiwgY291bnQpICsgc3VtOworfQorCitzdGF0aWMgaW50IHJhd19yZWFkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHJhd19wcmVhZChicywgc2VjdG9yX251bSAqIEJEUlZfU0VDVE9SX1NJWkUsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgbmJfc2VjdG9ycyAqIEJEUlZfU0VDVE9SX1NJWkUpOworICAgIGlmIChyZXQgPT0gKG5iX3NlY3RvcnMgKiBCRFJWX1NFQ1RPUl9TSVpFKSkKKyAgICAgICAgcmV0ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogb2Zmc2V0IGFuZCBjb3VudCBhcmUgaW4gYnl0ZXMgYW5kIHBvc3NpYmx5IG5vdCBhbGlnbmVkLiBGb3IgZmlsZXMgb3BlbmVkCisgKiB3aXRoIE9fRElSRUNULCBuZWNlc3NhcnkgYWxpZ25tZW50cyBhcmUgZW5zdXJlZCBiZWZvcmUgY2FsbGluZworICogcmF3X3B3cml0ZV9hbGlnbmVkIHRvIGRvIHRoZSBhY3R1YWwgd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgcmF3X3B3cml0ZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgY291bnQpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgc2l6ZSwgcmV0LCBzaGlmdCwgc3VtOworCisgICAgc3VtID0gMDsKKworICAgIGlmIChzLT5hbGlnbmVkX2J1ZiAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKG9mZnNldCAmIDB4MWZmKSB7CisgICAgICAgICAgICAvKiBhbGlnbiBvZmZzZXQgb24gYSA1MTIgYnl0ZXMgYm91bmRhcnkgKi8KKyAgICAgICAgICAgIHNoaWZ0ID0gb2Zmc2V0ICYgMHgxZmY7CisgICAgICAgICAgICByZXQgPSByYXdfcHJlYWRfYWxpZ25lZChicywgb2Zmc2V0IC0gc2hpZnQsIHMtPmFsaWduZWRfYnVmLCA1MTIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgc2l6ZSA9IDUxMiAtIHNoaWZ0OworICAgICAgICAgICAgaWYgKHNpemUgPiBjb3VudCkKKyAgICAgICAgICAgICAgICBzaXplID0gY291bnQ7CisgICAgICAgICAgICBtZW1jcHkocy0+YWxpZ25lZF9idWYgKyBzaGlmdCwgYnVmLCBzaXplKTsKKworICAgICAgICAgICAgcmV0ID0gcmF3X3B3cml0ZV9hbGlnbmVkKGJzLCBvZmZzZXQgLSBzaGlmdCwgcy0+YWxpZ25lZF9idWYsIDUxMik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgICAgIG9mZnNldCArPSBzaXplOworICAgICAgICAgICAgY291bnQgLT0gc2l6ZTsKKyAgICAgICAgICAgIHN1bSArPSBzaXplOworCisgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICB9CisgICAgICAgIGlmIChjb3VudCAmIDB4MWZmIHx8ICh1aW50cHRyX3QpIGJ1ZiAmIDB4MWZmKSB7CisKKyAgICAgICAgICAgIHdoaWxlICgoc2l6ZSA9IChjb3VudCAmIH4weDFmZikpICE9IDApIHsKKworICAgICAgICAgICAgICAgIGlmIChzaXplID4gQUxJR05FRF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEFMSUdORURfQlVGRkVSX1NJWkU7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+YWxpZ25lZF9idWYsIGJ1Ziwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICByZXQgPSByYXdfcHdyaXRlX2FsaWduZWQoYnMsIG9mZnNldCwgcy0+YWxpZ25lZF9idWYsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcmV0OworICAgICAgICAgICAgICAgIGNvdW50IC09IHJldDsKKyAgICAgICAgICAgICAgICBzdW0gKz0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaGVyZSwgY291bnQgPCA1MTIgYmVjYXVzZSAoY291bnQgJiB+MHgxZmYpID09IDAgKi8KKyAgICAgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgICAgIHJldCA9IHJhd19wcmVhZF9hbGlnbmVkKGJzLCBvZmZzZXQsIHMtPmFsaWduZWRfYnVmLCA1MTIpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICBtZW1jcHkocy0+YWxpZ25lZF9idWYsIGJ1ZiwgY291bnQpOworCisgICAgICAgICAgICAgICAgIHJldCA9IHJhd19wd3JpdGVfYWxpZ25lZChicywgb2Zmc2V0LCBzLT5hbGlnbmVkX2J1ZiwgNTEyKTsKKyAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICBpZiAoY291bnQgPCByZXQpCisgICAgICAgICAgICAgICAgICAgICByZXQgPSBjb3VudDsKKworICAgICAgICAgICAgICAgICBzdW0gKz0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1bTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmF3X3B3cml0ZV9hbGlnbmVkKGJzLCBvZmZzZXQsIGJ1ZiwgY291bnQpICsgc3VtOworfQorCitzdGF0aWMgaW50IHJhd193cml0ZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICBpbnQgcmV0OworICAgIHJldCA9IHJhd19wd3JpdGUoYnMsIHNlY3Rvcl9udW0gKiBCRFJWX1NFQ1RPUl9TSVpFLCBidWYsCisgICAgICAgICAgICAgICAgICAgICBuYl9zZWN0b3JzICogQkRSVl9TRUNUT1JfU0laRSk7CisgICAgaWYgKHJldCA9PSAobmJfc2VjdG9ycyAqIEJEUlZfU0VDVE9SX1NJWkUpKQorICAgICAgICByZXQgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhbGwgbWVtb3J5IGluIHRoaXMgdmVjdG9yIGlzIHNlY3RvciBhbGlnbmVkLgorICovCitzdGF0aWMgaW50IHFpb3ZfaXNfYWxpZ25lZChRRU1VSU9WZWN0b3IgKnFpb3YpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcWlvdi0+bmlvdjsgaSsrKSB7CisgICAgICAgIGlmICgodWludHB0cl90KSBxaW92LT5pb3ZbaV0uaW92X2Jhc2UgJSBCRFJWX1NFQ1RPUl9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcmF3X2Fpb19zdWJtaXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIGludDY0X3Qgc2VjdG9yX251bSwgUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSwgaW50IHR5cGUpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIGlmIChmZF9vcGVuKGJzKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyoKKyAgICAgKiBJZiBPX0RJUkVDVCBpcyB1c2VkIHRoZSBidWZmZXIgbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBhIHNlY3RvcgorICAgICAqIGJvdW5kYXJ5LiAgQ2hlY2sgaWYgdGhpcyBpcyB0aGUgY2FzZSBvciB0ZWxsbCB0aGUgbG93LWxldmVsCisgICAgICogZHJpdmVyIHRoYXQgaXQgbmVlZHMgdG8gY29weSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIGlmIChzLT5hbGlnbmVkX2J1ZikgeworICAgICAgICBpZiAoIXFpb3ZfaXNfYWxpZ25lZChxaW92KSkgeworICAgICAgICAgICAgdHlwZSB8PSBRRU1VX0FJT19NSVNBTElHTkVEOworI2lmZGVmIENPTkZJR19MSU5VWF9BSU8KKyAgICAgICAgfSBlbHNlIGlmIChzLT51c2VfYWlvKSB7CisgICAgICAgICAgICByZXR1cm4gbGFpb19zdWJtaXQoYnMsIHMtPmFpb19jdHgsIHMtPmZkLCBzZWN0b3JfbnVtLCBxaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NlY3RvcnMsIGNiLCBvcGFxdWUsIHR5cGUpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcGFpb19zdWJtaXQoYnMsIHMtPmZkLCBzZWN0b3JfbnVtLCBxaW92LCBuYl9zZWN0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICBjYiwgb3BhcXVlLCB0eXBlKTsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKnJhd19haW9fcmVhZHYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIGludDY0X3Qgc2VjdG9yX251bSwgUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gcmF3X2Fpb19zdWJtaXQoYnMsIHNlY3Rvcl9udW0sIHFpb3YsIG5iX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLCBvcGFxdWUsIFFFTVVfQUlPX1JFQUQpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcmF3X2Fpb193cml0ZXYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIGludDY0X3Qgc2VjdG9yX251bSwgUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gcmF3X2Fpb19zdWJtaXQoYnMsIHNlY3Rvcl9udW0sIHFpb3YsIG5iX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLCBvcGFxdWUsIFFFTVVfQUlPX1dSSVRFKTsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKnJhd19haW9fZmx1c2goQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIGlmIChmZF9vcGVuKGJzKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHBhaW9fc3VibWl0KGJzLCBzLT5mZCwgMCwgTlVMTCwgMCwgY2IsIG9wYXF1ZSwgUUVNVV9BSU9fRkxVU0gpOworfQorCitzdGF0aWMgdm9pZCByYXdfY2xvc2UoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpZiAocy0+ZmQgPj0gMCkgeworICAgICAgICBjbG9zZShzLT5mZCk7CisgICAgICAgIHMtPmZkID0gLTE7CisgICAgICAgIGlmIChzLT5hbGlnbmVkX2J1ZiAhPSBOVUxMKQorICAgICAgICAgICAgcWVtdV92ZnJlZShzLT5hbGlnbmVkX2J1Zik7CisgICAgfQorfQorCitzdGF0aWMgaW50IHJhd190cnVuY2F0ZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpZiAocy0+dHlwZSAhPSBGVFlQRV9GSUxFKQorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgaWYgKGZ0cnVuY2F0ZShzLT5mZCwgb2Zmc2V0KSA8IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX09wZW5CU0RfXworc3RhdGljIGludDY0X3QgcmF3X2dldGxlbmd0aChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBmZCA9IHMtPmZkOworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgaWYgKGZzdGF0KGZkLCAmc3QpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFNfSVNDSFIoc3Quc3RfbW9kZSkgfHwgU19JU0JMSyhzdC5zdF9tb2RlKSkgeworICAgICAgICBzdHJ1Y3QgZGlza2xhYmVsIGRsOworCisgICAgICAgIGlmIChpb2N0bChmZCwgRElPQ0dESU5GTywgJmRsKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuICh1aW50NjRfdClkbC5kX3NlY3NpemUgKgorICAgICAgICAgICAgZGwuZF9wYXJ0aXRpb25zW0RJU0tQQVJUKHN0LnN0X3JkZXYpXS5wX3NpemU7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBzdC5zdF9zaXplOworfQorI2VsaWYgZGVmaW5lZChfX3N1bl9fKQorc3RhdGljIGludDY0X3QgcmF3X2dldGxlbmd0aChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIHN0cnVjdCBka19taW5mbyBtaW5mbzsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmRfb3Blbihicyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVzZSB0aGUgREtJT0NHTUVESUFJTkZPIGlvY3RsIHRvIHJlYWQgdGhlIHNpemUuCisgICAgICovCisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIERLSU9DR01FRElBSU5GTywgJm1pbmZvKTsKKyAgICBpZiAocmV0ICE9IC0xKSB7CisgICAgICAgIHJldHVybiBtaW5mby5ka2lfbGJzaXplICogbWluZm8uZGtpX2NhcGFjaXR5OworICAgIH0KKworICAgIC8qCisgICAgICogVGhlcmUgYXJlIHJlcG9ydHMgdGhhdCBsc2VlayBvbiBzb21lIGRldmljZXMgZmFpbHMsIGJ1dAorICAgICAqIGlyYyBkaXNjdXNzaW9uIHNhaWQgdGhhdCBjb250aW5nZW5jeSBvbiBjb250aW5nZW5jeSB3YXMgb3ZlcmtpbGwuCisgICAgICovCisgICAgcmV0dXJuIGxzZWVrKHMtPmZkLCAwLCBTRUVLX0VORCk7Cit9CisjZWxpZiBkZWZpbmVkKENPTkZJR19CU0QpCitzdGF0aWMgaW50NjRfdCByYXdfZ2V0bGVuZ3RoKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGZkID0gcy0+ZmQ7CisgICAgaW50NjRfdCBzaXplOworICAgIHN0cnVjdCBzdGF0IHNiOworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgICBpbnQgcmVvcGVuZWQgPSAwOworI2VuZGlmCisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZkX29wZW4oYnMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisjaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKQorYWdhaW46CisjZW5kaWYKKyAgICBpZiAoIWZzdGF0KGZkLCAmc2IpICYmIChTX0lGQ0hSICYgc2Iuc3RfbW9kZSkpIHsKKyNpZmRlZiBESU9DR01FRElBU0laRQorCWlmIChpb2N0bChmZCwgRElPQ0dNRURJQVNJWkUsIChvZmZfdCAqKSZzaXplKSkKKyNlbGlmIGRlZmluZWQoRElPQ0dQQVJUKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RydWN0IHBhcnRpbmZvIHBpOworICAgICAgICAgICAgICAgIGlmIChpb2N0bChmZCwgRElPQ0dQQVJULCAmcGkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gcGkubWVkaWFfc2l6ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPQ09BCisgICAgICAgIHNpemUgPSBMT05HX0xPTkdfTUFYOworI2Vsc2UKKyAgICAgICAgc2l6ZSA9IGxzZWVrKGZkLCAwTEwsIFNFRUtfRU5EKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKQorICAgICAgICBzd2l0Y2gocy0+dHlwZSkgeworICAgICAgICBjYXNlIEZUWVBFX0NEOgorICAgICAgICAgICAgLyogWFhYIEZyZWVCU0QgYWNkIHJldHVybnMgVUlOVF9NQVggc2VjdG9ycyBmb3IgYW4gZW1wdHkgZHJpdmUgKi8KKyAgICAgICAgICAgIGlmIChzaXplID09IDIwNDhMTCAqICh1bnNpZ25lZCktMSkKKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIC8qIFhYWCBubyBkaXNjPyAgbWF5YmUgd2UgbmVlZCB0byByZW9wZW4uLi4gKi8KKyAgICAgICAgICAgIGlmIChzaXplIDw9IDAgJiYgIXJlb3BlbmVkICYmIGNkcm9tX3Jlb3BlbihicykgPj0gMCkgeworICAgICAgICAgICAgICAgIHJlb3BlbmVkID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIGFnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemU7Cit9CisjZWxzZQorc3RhdGljIGludDY0X3QgcmF3X2dldGxlbmd0aChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZF9vcGVuKGJzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBsc2VlayhzLT5mZCwgMCwgU0VFS19FTkQpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcmF3X2NyZWF0ZShjb25zdCBjaGFyICpmaWxlbmFtZSwgUUVNVU9wdGlvblBhcmFtZXRlciAqb3B0aW9ucykKK3sKKyAgICBpbnQgZmQ7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50NjRfdCB0b3RhbF9zaXplID0gMDsKKworICAgIC8qIFJlYWQgb3V0IG9wdGlvbnMgKi8KKyAgICB3aGlsZSAob3B0aW9ucyAmJiBvcHRpb25zLT5uYW1lKSB7CisgICAgICAgIGlmICghc3RyY21wKG9wdGlvbnMtPm5hbWUsIEJMT0NLX09QVF9TSVpFKSkgeworICAgICAgICAgICAgdG90YWxfc2l6ZSA9IG9wdGlvbnMtPnZhbHVlLm4gLyBCRFJWX1NFQ1RPUl9TSVpFOworICAgICAgICB9CisgICAgICAgIG9wdGlvbnMrKzsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwKKyAgICAgICAgICAgICAgMDY0NCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXN1bHQgPSAtZXJybm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZ0cnVuY2F0ZShmZCwgdG90YWxfc2l6ZSAqIEJEUlZfU0VDVE9SX1NJWkUpICE9IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xvc2UoZmQpICE9IDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC1lcnJubzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCByYXdfZmx1c2goQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBxZW11X2ZkYXRhc3luYyhzLT5mZCk7Cit9CisKKworc3RhdGljIFFFTVVPcHRpb25QYXJhbWV0ZXIgcmF3X2NyZWF0ZV9vcHRpb25zW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9IEJMT0NLX09QVF9TSVpFLAorICAgICAgICAudHlwZSA9IE9QVF9TSVpFLAorICAgICAgICAuaGVscCA9ICJWaXJ0dWFsIGRpc2sgc2l6ZSIKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgQmxvY2tEcml2ZXIgYmRydl9maWxlID0geworICAgIC5mb3JtYXRfbmFtZSA9ICJmaWxlIiwKKyAgICAucHJvdG9jb2xfbmFtZSA9ICJmaWxlIiwKKyAgICAuaW5zdGFuY2Vfc2l6ZSA9IHNpemVvZihCRFJWUmF3U3RhdGUpLAorICAgIC5iZHJ2X3Byb2JlID0gTlVMTCwgLyogbm8gcHJvYmUgZm9yIHByb3RvY29scyAqLworICAgIC5iZHJ2X2ZpbGVfb3BlbiA9IHJhd19vcGVuLAorICAgIC5iZHJ2X3JlYWQgPSByYXdfcmVhZCwKKyAgICAuYmRydl93cml0ZSA9IHJhd193cml0ZSwKKyAgICAuYmRydl9jbG9zZSA9IHJhd19jbG9zZSwKKyAgICAuYmRydl9jcmVhdGUgPSByYXdfY3JlYXRlLAorICAgIC5iZHJ2X2ZsdXNoID0gcmF3X2ZsdXNoLAorCisgICAgLmJkcnZfYWlvX3JlYWR2ID0gcmF3X2Fpb19yZWFkdiwKKyAgICAuYmRydl9haW9fd3JpdGV2ID0gcmF3X2Fpb193cml0ZXYsCisgICAgLmJkcnZfYWlvX2ZsdXNoID0gcmF3X2Fpb19mbHVzaCwKKworICAgIC5iZHJ2X3RydW5jYXRlID0gcmF3X3RydW5jYXRlLAorICAgIC5iZHJ2X2dldGxlbmd0aCA9IHJhd19nZXRsZW5ndGgsCisKKyAgICAuY3JlYXRlX29wdGlvbnMgPSByYXdfY3JlYXRlX29wdGlvbnMsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBob3N0IGRldmljZSAqLworCisjaWZkZWYgQ09ORklHX0NPQ09BCitzdGF0aWMga2Vybl9yZXR1cm5fdCBGaW5kRWplY3RhYmxlQ0RNZWRpYSggaW9faXRlcmF0b3JfdCAqbWVkaWFJdGVyYXRvciApOworc3RhdGljIGtlcm5fcmV0dXJuX3QgR2V0QlNEUGF0aCggaW9faXRlcmF0b3JfdCBtZWRpYUl0ZXJhdG9yLCBjaGFyICpic2RQYXRoLCBDRkluZGV4IG1heFBhdGhTaXplICk7CisKK2tlcm5fcmV0dXJuX3QgRmluZEVqZWN0YWJsZUNETWVkaWEoIGlvX2l0ZXJhdG9yX3QgKm1lZGlhSXRlcmF0b3IgKQoreworICAgIGtlcm5fcmV0dXJuX3QgICAgICAga2VyblJlc3VsdDsKKyAgICBtYWNoX3BvcnRfdCAgICAgbWFzdGVyUG9ydDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmICBjbGFzc2VzVG9NYXRjaDsKKworICAgIGtlcm5SZXN1bHQgPSBJT01hc3RlclBvcnQoIE1BQ0hfUE9SVF9OVUxMLCAmbWFzdGVyUG9ydCApOworICAgIGlmICggS0VSTl9TVUNDRVNTICE9IGtlcm5SZXN1bHQgKSB7CisgICAgICAgIHByaW50ZiggIklPTWFzdGVyUG9ydCByZXR1cm5lZCAlZFxuIiwga2VyblJlc3VsdCApOworICAgIH0KKworICAgIGNsYXNzZXNUb01hdGNoID0gSU9TZXJ2aWNlTWF0Y2hpbmcoIGtJT0NETWVkaWFDbGFzcyApOworICAgIGlmICggY2xhc3Nlc1RvTWF0Y2ggPT0gTlVMTCApIHsKKyAgICAgICAgcHJpbnRmKCAiSU9TZXJ2aWNlTWF0Y2hpbmcgcmV0dXJuZWQgYSBOVUxMIGRpY3Rpb25hcnkuXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZSggY2xhc3Nlc1RvTWF0Y2gsIENGU1RSKCBrSU9NZWRpYUVqZWN0YWJsZUtleSApLCBrQ0ZCb29sZWFuVHJ1ZSApOworICAgIH0KKyAgICBrZXJuUmVzdWx0ID0gSU9TZXJ2aWNlR2V0TWF0Y2hpbmdTZXJ2aWNlcyggbWFzdGVyUG9ydCwgY2xhc3Nlc1RvTWF0Y2gsIG1lZGlhSXRlcmF0b3IgKTsKKyAgICBpZiAoIEtFUk5fU1VDQ0VTUyAhPSBrZXJuUmVzdWx0ICkKKyAgICB7CisgICAgICAgIHByaW50ZiggIklPU2VydmljZUdldE1hdGNoaW5nU2VydmljZXMgcmV0dXJuZWQgJWRcbiIsIGtlcm5SZXN1bHQgKTsKKyAgICB9CisKKyAgICByZXR1cm4ga2VyblJlc3VsdDsKK30KKwora2Vybl9yZXR1cm5fdCBHZXRCU0RQYXRoKCBpb19pdGVyYXRvcl90IG1lZGlhSXRlcmF0b3IsIGNoYXIgKmJzZFBhdGgsIENGSW5kZXggbWF4UGF0aFNpemUgKQoreworICAgIGlvX29iamVjdF90ICAgICBuZXh0TWVkaWE7CisgICAga2Vybl9yZXR1cm5fdCAgIGtlcm5SZXN1bHQgPSBLRVJOX0ZBSUxVUkU7CisgICAgKmJzZFBhdGggPSAnXDAnOworICAgIG5leHRNZWRpYSA9IElPSXRlcmF0b3JOZXh0KCBtZWRpYUl0ZXJhdG9yICk7CisgICAgaWYgKCBuZXh0TWVkaWEgKQorICAgIHsKKyAgICAgICAgQ0ZUeXBlUmVmICAgYnNkUGF0aEFzQ0ZTdHJpbmc7CisgICAgYnNkUGF0aEFzQ0ZTdHJpbmcgPSBJT1JlZ2lzdHJ5RW50cnlDcmVhdGVDRlByb3BlcnR5KCBuZXh0TWVkaWEsIENGU1RSKCBrSU9CU0ROYW1lS2V5ICksIGtDRkFsbG9jYXRvckRlZmF1bHQsIDAgKTsKKyAgICAgICAgaWYgKCBic2RQYXRoQXNDRlN0cmluZyApIHsKKyAgICAgICAgICAgIHNpemVfdCBkZXZQYXRoTGVuZ3RoOworICAgICAgICAgICAgc3RyY3B5KCBic2RQYXRoLCBfUEFUSF9ERVYgKTsKKyAgICAgICAgICAgIHN0cmNhdCggYnNkUGF0aCwgInIiICk7CisgICAgICAgICAgICBkZXZQYXRoTGVuZ3RoID0gc3RybGVuKCBic2RQYXRoICk7CisgICAgICAgICAgICBpZiAoIENGU3RyaW5nR2V0Q1N0cmluZyggYnNkUGF0aEFzQ0ZTdHJpbmcsIGJzZFBhdGggKyBkZXZQYXRoTGVuZ3RoLCBtYXhQYXRoU2l6ZSAtIGRldlBhdGhMZW5ndGgsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkgKSApIHsKKyAgICAgICAgICAgICAgICBrZXJuUmVzdWx0ID0gS0VSTl9TVUNDRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0ZSZWxlYXNlKCBic2RQYXRoQXNDRlN0cmluZyApOworICAgICAgICB9CisgICAgICAgIElPT2JqZWN0UmVsZWFzZSggbmV4dE1lZGlhICk7CisgICAgfQorCisgICAgcmV0dXJuIGtlcm5SZXN1bHQ7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IGhkZXZfcHJvYmVfZGV2aWNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHN0cnVjdCBzdGF0IHN0OworCisgICAgLyogYWxsb3cgYSBkZWRpY2F0ZWQgQ0QtUk9NIGRyaXZlciB0byBtYXRjaCB3aXRoIGEgaGlnaGVyIHByaW9yaXR5ICovCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi9jZHJvbSIsIE5VTEwpKQorICAgICAgICByZXR1cm4gNTA7CisKKyAgICBpZiAoc3RhdChmaWxlbmFtZSwgJnN0KSA+PSAwICYmCisgICAgICAgICAgICAoU19JU0NIUihzdC5zdF9tb2RlKSB8fCBTX0lTQkxLKHN0LnN0X21vZGUpKSkgeworICAgICAgICByZXR1cm4gMTAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkZXZfb3BlbihCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworCisjaWZkZWYgQ09ORklHX0NPQ09BCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi9jZHJvbSIsIE5VTEwpKSB7CisgICAgICAgIGtlcm5fcmV0dXJuX3Qga2VyblJlc3VsdDsKKyAgICAgICAgaW9faXRlcmF0b3JfdCBtZWRpYUl0ZXJhdG9yOworICAgICAgICBjaGFyIGJzZFBhdGhbIE1BWFBBVEhMRU4gXTsKKyAgICAgICAgaW50IGZkOworCisgICAgICAgIGtlcm5SZXN1bHQgPSBGaW5kRWplY3RhYmxlQ0RNZWRpYSggJm1lZGlhSXRlcmF0b3IgKTsKKyAgICAgICAga2VyblJlc3VsdCA9IEdldEJTRFBhdGgoIG1lZGlhSXRlcmF0b3IsIGJzZFBhdGgsIHNpemVvZiggYnNkUGF0aCApICk7CisKKyAgICAgICAgaWYgKCBic2RQYXRoWyAwIF0gIT0gJ1wwJyApIHsKKyAgICAgICAgICAgIHN0cmNhdChic2RQYXRoLCJzMCIpOworICAgICAgICAgICAgLyogc29tZSBDRHMgZG9uJ3QgaGF2ZSBhIHBhcnRpdGlvbiAwICovCisgICAgICAgICAgICBmZCA9IG9wZW4oYnNkUGF0aCwgT19SRE9OTFkgfCBPX0JJTkFSWSB8IE9fTEFSR0VGSUxFKTsKKyAgICAgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgICAgICBic2RQYXRoW3N0cmxlbihic2RQYXRoKS0xXSA9ICcxJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsZW5hbWUgPSBic2RQYXRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBtZWRpYUl0ZXJhdG9yICkKKyAgICAgICAgICAgIElPT2JqZWN0UmVsZWFzZSggbWVkaWFJdGVyYXRvciApOworICAgIH0KKyNlbmRpZgorCisgICAgcy0+dHlwZSA9IEZUWVBFX0ZJTEU7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi9zZyIsIE5VTEwpKSB7CisgICAgICAgIGJzLT5zZyA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmF3X29wZW5fY29tbW9uKGJzLCBmaWxlbmFtZSwgZmxhZ3MsIDApOworfQorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisvKiBOb3RlOiB3ZSBkbyBub3QgaGF2ZSBhIHJlbGlhYmxlIG1ldGhvZCB0byBkZXRlY3QgaWYgdGhlIGZsb3BweSBpcworICAgcHJlc2VudC4gVGhlIGN1cnJlbnQgbWV0aG9kIGlzIHRvIHRyeSB0byBvcGVuIHRoZSBmbG9wcHkgYXQgZXZlcnkKKyAgIEkvTyBhbmQgdG8ga2VlcCBpdCBvcGVuZWQgZHVyaW5nIGEgZmV3IGh1bmRyZWRzIG9mIG1zLiAqLworc3RhdGljIGludCBmZF9vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGxhc3RfbWVkaWFfcHJlc2VudDsKKworICAgIGlmIChzLT50eXBlICE9IEZUWVBFX0ZEKQorICAgICAgICByZXR1cm4gMDsKKyAgICBsYXN0X21lZGlhX3ByZXNlbnQgPSAocy0+ZmQgPj0gMCk7CisgICAgaWYgKHMtPmZkID49IDAgJiYKKyAgICAgICAgKHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpIC0gcy0+ZmRfb3Blbl90aW1lKSA+PSBGRF9PUEVOX1RJTUVPVVQpIHsKKyAgICAgICAgY2xvc2Uocy0+ZmQpOworICAgICAgICBzLT5mZCA9IC0xOworI2lmZGVmIERFQlVHX0ZMT1BQWQorICAgICAgICBwcmludGYoIkZsb3BweSBjbG9zZWRcbiIpOworI2VuZGlmCisgICAgfQorICAgIGlmIChzLT5mZCA8IDApIHsKKyAgICAgICAgaWYgKHMtPmZkX2dvdF9lcnJvciAmJgorICAgICAgICAgICAgKHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpIC0gcy0+ZmRfZXJyb3JfdGltZSkgPCBGRF9PUEVOX1RJTUVPVVQpIHsKKyNpZmRlZiBERUJVR19GTE9QUFkKKyAgICAgICAgICAgIHByaW50ZigiTm8gZmxvcHB5IChvcGVuIGRlbGF5ZWQpXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIH0KKyAgICAgICAgcy0+ZmQgPSBvcGVuKGJzLT5maWxlbmFtZSwgcy0+b3Blbl9mbGFncyAmIH5PX05PTkJMT0NLKTsKKyAgICAgICAgaWYgKHMtPmZkIDwgMCkgeworICAgICAgICAgICAgcy0+ZmRfZXJyb3JfdGltZSA9IHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpOworICAgICAgICAgICAgcy0+ZmRfZ290X2Vycm9yID0gMTsKKyAgICAgICAgICAgIGlmIChsYXN0X21lZGlhX3ByZXNlbnQpCisgICAgICAgICAgICAgICAgcy0+ZmRfbWVkaWFfY2hhbmdlZCA9IDE7CisjaWZkZWYgREVCVUdfRkxPUFBZCisgICAgICAgICAgICBwcmludGYoIk5vIGZsb3BweVxuIik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisjaWZkZWYgREVCVUdfRkxPUFBZCisgICAgICAgIHByaW50ZigiRmxvcHB5IG9wZW5lZFxuIik7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKCFsYXN0X21lZGlhX3ByZXNlbnQpCisgICAgICAgIHMtPmZkX21lZGlhX2NoYW5nZWQgPSAxOworICAgIHMtPmZkX29wZW5fdGltZSA9IHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpOworICAgIHMtPmZkX2dvdF9lcnJvciA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRldl9pb2N0bChCbG9ja0RyaXZlclN0YXRlICpicywgdW5zaWduZWQgbG9uZyBpbnQgcmVxLCB2b2lkICpidWYpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIHJldHVybiBpb2N0bChzLT5mZCwgcmVxLCBidWYpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqaGRldl9haW9faW9jdGwoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlcSwgdm9pZCAqYnVmLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisKKyAgICBpZiAoZmRfb3BlbihicykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcGFpb19pb2N0bChicywgcy0+ZmQsIHJlcSwgYnVmLCBjYiwgb3BhcXVlKTsKK30KKworI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCitzdGF0aWMgaW50IGZkX29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIC8qIHRoaXMgaXMganVzdCB0byBlbnN1cmUgcy0+ZmQgaXMgc2FuZSAoaXRzIGNhbGxlZCBieSBpbyBvcHMpICovCisgICAgaWYgKHMtPmZkID49IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAtRUlPOworfQorI2Vsc2UgLyogIWxpbnV4ICYmICFGcmVlQlNEICovCisKK3N0YXRpYyBpbnQgZmRfb3BlbihCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICFsaW51eCAmJiAhRnJlZUJTRCAqLworCitzdGF0aWMgaW50IGhkZXZfY3JlYXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBRRU1VT3B0aW9uUGFyYW1ldGVyICpvcHRpb25zKQoreworICAgIGludCBmZDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKyAgICBpbnQ2NF90IHRvdGFsX3NpemUgPSAwOworCisgICAgLyogUmVhZCBvdXQgb3B0aW9ucyAqLworICAgIHdoaWxlIChvcHRpb25zICYmIG9wdGlvbnMtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0aW9ucy0+bmFtZSwgInNpemUiKSkgeworICAgICAgICAgICAgdG90YWxfc2l6ZSA9IG9wdGlvbnMtPnZhbHVlLm4gLyBCRFJWX1NFQ1RPUl9TSVpFOworICAgICAgICB9CisgICAgICAgIG9wdGlvbnMrKzsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19CSU5BUlkpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpZiAoZnN0YXQoZmQsICZzdGF0X2J1ZikgPCAwKQorICAgICAgICByZXQgPSAtZXJybm87CisgICAgZWxzZSBpZiAoIVNfSVNCTEsoc3RhdF9idWYuc3RfbW9kZSkgJiYgIVNfSVNDSFIoc3RhdF9idWYuc3RfbW9kZSkpCisgICAgICAgIHJldCA9IC1FTk9ERVY7CisgICAgZWxzZSBpZiAobHNlZWsoZmQsIDAsIFNFRUtfRU5EKSA8IHRvdGFsX3NpemUgKiBCRFJWX1NFQ1RPUl9TSVpFKQorICAgICAgICByZXQgPSAtRU5PU1BDOworCisgICAgY2xvc2UoZmQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGRldl9oYXNfemVyb19pbml0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXIgYmRydl9ob3N0X2RldmljZSA9IHsKKyAgICAuZm9ybWF0X25hbWUgICAgICAgID0gImhvc3RfZGV2aWNlIiwKKyAgICAucHJvdG9jb2xfbmFtZSAgICAgICAgPSAiaG9zdF9kZXZpY2UiLAorICAgIC5pbnN0YW5jZV9zaXplICAgICAgPSBzaXplb2YoQkRSVlJhd1N0YXRlKSwKKyAgICAuYmRydl9wcm9iZV9kZXZpY2UgID0gaGRldl9wcm9iZV9kZXZpY2UsCisgICAgLmJkcnZfZmlsZV9vcGVuICAgICA9IGhkZXZfb3BlbiwKKyAgICAuYmRydl9jbG9zZSAgICAgICAgID0gcmF3X2Nsb3NlLAorICAgIC5iZHJ2X2NyZWF0ZSAgICAgICAgPSBoZGV2X2NyZWF0ZSwKKyAgICAuY3JlYXRlX29wdGlvbnMgICAgID0gcmF3X2NyZWF0ZV9vcHRpb25zLAorICAgIC5iZHJ2X2hhc196ZXJvX2luaXQgPSBoZGV2X2hhc196ZXJvX2luaXQsCisgICAgLmJkcnZfZmx1c2ggICAgICAgICA9IHJhd19mbHVzaCwKKworICAgIC5iZHJ2X2Fpb19yZWFkdgk9IHJhd19haW9fcmVhZHYsCisgICAgLmJkcnZfYWlvX3dyaXRldgk9IHJhd19haW9fd3JpdGV2LAorICAgIC5iZHJ2X2Fpb19mbHVzaAk9IHJhd19haW9fZmx1c2gsCisKKyAgICAuYmRydl9yZWFkICAgICAgICAgID0gcmF3X3JlYWQsCisgICAgLmJkcnZfd3JpdGUgICAgICAgICA9IHJhd193cml0ZSwKKyAgICAuYmRydl9nZXRsZW5ndGgJPSByYXdfZ2V0bGVuZ3RoLAorCisgICAgLyogZ2VuZXJpYyBzY3NpIGRldmljZSAqLworI2lmZGVmIF9fbGludXhfXworICAgIC5iZHJ2X2lvY3RsICAgICAgICAgPSBoZGV2X2lvY3RsLAorICAgIC5iZHJ2X2Fpb19pb2N0bCAgICAgPSBoZGV2X2Fpb19pb2N0bCwKKyNlbmRpZgorfTsKKworI2lmZGVmIF9fbGludXhfXworc3RhdGljIGludCBmbG9wcHlfb3BlbihCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICBzLT50eXBlID0gRlRZUEVfRkQ7CisKKyAgICAvKiBvcGVuIHdpbGwgbm90IGZhaWwgZXZlbiBpZiBubyBmbG9wcHkgaXMgaW5zZXJ0ZWQsIHNvIGFkZCBPX05PTkJMT0NLICovCisgICAgcmV0ID0gcmF3X29wZW5fY29tbW9uKGJzLCBmaWxlbmFtZSwgZmxhZ3MsIE9fTk9OQkxPQ0spOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBjbG9zZSBmZCBzbyB0aGF0IHdlIGNhbiByZW9wZW4gaXQgYXMgbmVlZGVkICovCisgICAgY2xvc2Uocy0+ZmQpOworICAgIHMtPmZkID0gLTE7CisgICAgcy0+ZmRfbWVkaWFfY2hhbmdlZCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbG9wcHlfcHJvYmVfZGV2aWNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGludCBmZCwgcmV0OworICAgIGludCBwcmlvID0gMDsKKyAgICBzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBmZHBhcmFtOworCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi9mZCIsIE5VTEwpKQorICAgICAgICBwcmlvID0gNTA7CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICAvKiBBdHRlbXB0IHRvIGRldGVjdCB2aWEgYSBmbG9wcHkgc3BlY2lmaWMgaW9jdGwgKi8KKyAgICByZXQgPSBpb2N0bChmZCwgRkRHRVRQUk0sICZmZHBhcmFtKTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIHByaW8gPSAxMDA7CisKKyAgICBjbG9zZShmZCk7CitvdXQ6CisgICAgcmV0dXJuIHByaW87Cit9CisKKworc3RhdGljIGludCBmbG9wcHlfaXNfaW5zZXJ0ZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIGZkX29wZW4oYnMpID49IDA7Cit9CisKK3N0YXRpYyBpbnQgZmxvcHB5X21lZGlhX2NoYW5nZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgcmV0OworCisgICAgLyoKKyAgICAgKiBYWFg6IHdlIGRvIG5vdCBoYXZlIGEgdHJ1ZSBtZWRpYSBjaGFuZ2VkIGluZGljYXRpb24uCisgICAgICogSXQgZG9lcyBub3Qgd29yayBpZiB0aGUgZmxvcHB5IGlzIGNoYW5nZWQgd2l0aG91dCB0cnlpbmcgdG8gcmVhZCBpdC4KKyAgICAgKi8KKyAgICBmZF9vcGVuKGJzKTsKKyAgICByZXQgPSBzLT5mZF9tZWRpYV9jaGFuZ2VkOworICAgIHMtPmZkX21lZGlhX2NoYW5nZWQgPSAwOworI2lmZGVmIERFQlVHX0ZMT1BQWQorICAgIHByaW50ZigiRmxvcHB5IGNoYW5nZWQ9JWRcbiIsIHJldCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsb3BweV9lamVjdChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGVqZWN0X2ZsYWcpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgZmQ7CisKKyAgICBpZiAocy0+ZmQgPj0gMCkgeworICAgICAgICBjbG9zZShzLT5mZCk7CisgICAgICAgIHMtPmZkID0gLTE7CisgICAgfQorICAgIGZkID0gb3Blbihicy0+ZmlsZW5hbWUsIHMtPm9wZW5fZmxhZ3MgfCBPX05PTkJMT0NLKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICBpZiAoaW9jdGwoZmQsIEZERUpFQ1QsIDApIDwgMCkKKyAgICAgICAgICAgIHBlcnJvcigiRkRFSkVDVCIpOworICAgICAgICBjbG9zZShmZCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBCbG9ja0RyaXZlciBiZHJ2X2hvc3RfZmxvcHB5ID0geworICAgIC5mb3JtYXRfbmFtZSAgICAgICAgPSAiaG9zdF9mbG9wcHkiLAorICAgIC5wcm90b2NvbF9uYW1lICAgICAgPSAiaG9zdF9mbG9wcHkiLAorICAgIC5pbnN0YW5jZV9zaXplICAgICAgPSBzaXplb2YoQkRSVlJhd1N0YXRlKSwKKyAgICAuYmRydl9wcm9iZV9kZXZpY2UJPSBmbG9wcHlfcHJvYmVfZGV2aWNlLAorICAgIC5iZHJ2X2ZpbGVfb3BlbiAgICAgPSBmbG9wcHlfb3BlbiwKKyAgICAuYmRydl9jbG9zZSAgICAgICAgID0gcmF3X2Nsb3NlLAorICAgIC5iZHJ2X2NyZWF0ZSAgICAgICAgPSBoZGV2X2NyZWF0ZSwKKyAgICAuY3JlYXRlX29wdGlvbnMgICAgID0gcmF3X2NyZWF0ZV9vcHRpb25zLAorICAgIC5iZHJ2X2hhc196ZXJvX2luaXQgPSBoZGV2X2hhc196ZXJvX2luaXQsCisgICAgLmJkcnZfZmx1c2ggICAgICAgICA9IHJhd19mbHVzaCwKKworICAgIC5iZHJ2X2Fpb19yZWFkdiAgICAgPSByYXdfYWlvX3JlYWR2LAorICAgIC5iZHJ2X2Fpb193cml0ZXYgICAgPSByYXdfYWlvX3dyaXRldiwKKyAgICAuYmRydl9haW9fZmx1c2gJPSByYXdfYWlvX2ZsdXNoLAorCisgICAgLmJkcnZfcmVhZCAgICAgICAgICA9IHJhd19yZWFkLAorICAgIC5iZHJ2X3dyaXRlICAgICAgICAgPSByYXdfd3JpdGUsCisgICAgLmJkcnZfZ2V0bGVuZ3RoCT0gcmF3X2dldGxlbmd0aCwKKworICAgIC8qIHJlbW92YWJsZSBkZXZpY2Ugc3VwcG9ydCAqLworICAgIC5iZHJ2X2lzX2luc2VydGVkICAgPSBmbG9wcHlfaXNfaW5zZXJ0ZWQsCisgICAgLmJkcnZfbWVkaWFfY2hhbmdlZCA9IGZsb3BweV9tZWRpYV9jaGFuZ2VkLAorICAgIC5iZHJ2X2VqZWN0ICAgICAgICAgPSBmbG9wcHlfZWplY3QsCit9OworCitzdGF0aWMgaW50IGNkcm9tX29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIHMtPnR5cGUgPSBGVFlQRV9DRDsKKworICAgIC8qIG9wZW4gd2lsbCBub3QgZmFpbCBldmVuIGlmIG5vIENEIGlzIGluc2VydGVkLCBzbyBhZGQgT19OT05CTE9DSyAqLworICAgIHJldHVybiByYXdfb3Blbl9jb21tb24oYnMsIGZpbGVuYW1lLCBmbGFncywgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fcHJvYmVfZGV2aWNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGludCBmZCwgcmV0OworICAgIGludCBwcmlvID0gMDsKKworICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgIi9kZXYvY2QiLCBOVUxMKSkKKyAgICAgICAgcHJpbyA9IDUwOworCisgICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogQXR0ZW1wdCB0byBkZXRlY3QgdmlhIGEgQ0RST00gc3BlY2lmaWMgaW9jdGwgKi8KKyAgICByZXQgPSBpb2N0bChmZCwgQ0RST01fRFJJVkVfU1RBVFVTLCBDRFNMX0NVUlJFTlQpOworICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgcHJpbyA9IDEwMDsKKworICAgIGNsb3NlKGZkKTsKK291dDoKKyAgICByZXR1cm4gcHJpbzsKK30KKworc3RhdGljIGludCBjZHJvbV9pc19pbnNlcnRlZChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBpb2N0bChzLT5mZCwgQ0RST01fRFJJVkVfU1RBVFVTLCBDRFNMX0NVUlJFTlQpOworICAgIGlmIChyZXQgPT0gQ0RTX0RJU0NfT0spCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkcm9tX2VqZWN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgZWplY3RfZmxhZykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworCisgICAgaWYgKGVqZWN0X2ZsYWcpIHsKKyAgICAgICAgaWYgKGlvY3RsKHMtPmZkLCBDRFJPTUVKRUNULCBOVUxMKSA8IDApCisgICAgICAgICAgICBwZXJyb3IoIkNEUk9NRUpFQ1QiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaW9jdGwocy0+ZmQsIENEUk9NQ0xPU0VUUkFZLCBOVUxMKSA8IDApCisgICAgICAgICAgICBwZXJyb3IoIkNEUk9NRUpFQ1QiKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZHJvbV9zZXRfbG9ja2VkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgbG9ja2VkKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisKKyAgICBpZiAoaW9jdGwocy0+ZmQsIENEUk9NX0xPQ0tET09SLCBsb2NrZWQpIDwgMCkgeworICAgICAgICAvKgorICAgICAgICAgKiBOb3RlOiBhbiBlcnJvciBjYW4gaGFwcGVuIGlmIHRoZSBkaXN0cmlidXRpb24gYXV0b21hdGljYWxseQorICAgICAgICAgKiBtb3VudHMgdGhlIENELVJPTQorICAgICAgICAgKi8KKyAgICAgICAgLyogcGVycm9yKCJDRFJPTV9MT0NLRE9PUiIpOyAqLworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXIgYmRydl9ob3N0X2Nkcm9tID0geworICAgIC5mb3JtYXRfbmFtZSAgICAgICAgPSAiaG9zdF9jZHJvbSIsCisgICAgLnByb3RvY29sX25hbWUgICAgICA9ICJob3N0X2Nkcm9tIiwKKyAgICAuaW5zdGFuY2Vfc2l6ZSAgICAgID0gc2l6ZW9mKEJEUlZSYXdTdGF0ZSksCisgICAgLmJkcnZfcHJvYmVfZGV2aWNlCT0gY2Ryb21fcHJvYmVfZGV2aWNlLAorICAgIC5iZHJ2X2ZpbGVfb3BlbiAgICAgPSBjZHJvbV9vcGVuLAorICAgIC5iZHJ2X2Nsb3NlICAgICAgICAgPSByYXdfY2xvc2UsCisgICAgLmJkcnZfY3JlYXRlICAgICAgICA9IGhkZXZfY3JlYXRlLAorICAgIC5jcmVhdGVfb3B0aW9ucyAgICAgPSByYXdfY3JlYXRlX29wdGlvbnMsCisgICAgLmJkcnZfaGFzX3plcm9faW5pdCA9IGhkZXZfaGFzX3plcm9faW5pdCwKKyAgICAuYmRydl9mbHVzaCAgICAgICAgID0gcmF3X2ZsdXNoLAorCisgICAgLmJkcnZfYWlvX3JlYWR2ICAgICA9IHJhd19haW9fcmVhZHYsCisgICAgLmJkcnZfYWlvX3dyaXRldiAgICA9IHJhd19haW9fd3JpdGV2LAorICAgIC5iZHJ2X2Fpb19mbHVzaAk9IHJhd19haW9fZmx1c2gsCisKKyAgICAuYmRydl9yZWFkICAgICAgICAgID0gcmF3X3JlYWQsCisgICAgLmJkcnZfd3JpdGUgICAgICAgICA9IHJhd193cml0ZSwKKyAgICAuYmRydl9nZXRsZW5ndGggICAgID0gcmF3X2dldGxlbmd0aCwKKworICAgIC8qIHJlbW92YWJsZSBkZXZpY2Ugc3VwcG9ydCAqLworICAgIC5iZHJ2X2lzX2luc2VydGVkICAgPSBjZHJvbV9pc19pbnNlcnRlZCwKKyAgICAuYmRydl9lamVjdCAgICAgICAgID0gY2Ryb21fZWplY3QsCisgICAgLmJkcnZfc2V0X2xvY2tlZCAgICA9IGNkcm9tX3NldF9sb2NrZWQsCisKKyAgICAvKiBnZW5lcmljIHNjc2kgZGV2aWNlICovCisgICAgLmJkcnZfaW9jdGwgICAgICAgICA9IGhkZXZfaW9jdGwsCisgICAgLmJkcnZfYWlvX2lvY3RsICAgICA9IGhkZXZfYWlvX2lvY3RsLAorfTsKKyNlbmRpZiAvKiBfX2xpbnV4X18gKi8KKworI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKK3N0YXRpYyBpbnQgY2Ryb21fb3BlbihCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICBzLT50eXBlID0gRlRZUEVfQ0Q7CisKKyAgICByZXQgPSByYXdfb3Blbl9jb21tb24oYnMsIGZpbGVuYW1lLCBmbGFncywgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgZG9vciBpc250IGxvY2tlZCBhdCB0aGlzIHRpbWUgKi8KKyAgICBpb2N0bChzLT5mZCwgQ0RJT0NBTExPVyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fcHJvYmVfZGV2aWNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgIi9kZXYvY2QiLCBOVUxMKSB8fAorICAgICAgICAgICAgc3Ryc3RhcnQoZmlsZW5hbWUsICIvZGV2L2FjZCIsIE5VTEwpKQorICAgICAgICByZXR1cm4gMTAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkcm9tX3Jlb3BlbihCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIGludCBmZDsKKworICAgIC8qCisgICAgICogRm9yY2UgcmVyZWFkIG9mIHBvc3NpYmx5IGNoYW5nZWQvbmV3bHkgbG9hZGVkIGRpc2MsCisgICAgICogRnJlZUJTRCBzZWVtcyB0byBub3Qgbm90aWNlIHNvbWV0aW1lcy4uLgorICAgICAqLworICAgIGlmIChzLT5mZCA+PSAwKQorICAgICAgICBjbG9zZShzLT5mZCk7CisgICAgZmQgPSBvcGVuKGJzLT5maWxlbmFtZSwgcy0+b3Blbl9mbGFncywgMDY0NCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBzLT5mZCA9IC0xOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisgICAgcy0+ZmQgPSBmZDsKKworICAgIC8qIG1ha2Ugc3VyZSB0aGUgZG9vciBpc250IGxvY2tlZCBhdCB0aGlzIHRpbWUgKi8KKyAgICBpb2N0bChzLT5mZCwgQ0RJT0NBTExPVyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21faXNfaW5zZXJ0ZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIHJhd19nZXRsZW5ndGgoYnMpID4gMDsKK30KKworc3RhdGljIGludCBjZHJvbV9lamVjdChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGVqZWN0X2ZsYWcpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKworICAgIGlmIChzLT5mZCA8IDApCisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKworICAgICh2b2lkKSBpb2N0bChzLT5mZCwgQ0RJT0NBTExPVyk7CisKKyAgICBpZiAoZWplY3RfZmxhZykgeworICAgICAgICBpZiAoaW9jdGwocy0+ZmQsIENESU9DRUpFQ1QpIDwgMCkKKyAgICAgICAgICAgIHBlcnJvcigiQ0RJT0NFSkVDVCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpb2N0bChzLT5mZCwgQ0RJT0NDTE9TRSkgPCAwKQorICAgICAgICAgICAgcGVycm9yKCJDRElPQ0NMT1NFIik7CisgICAgfQorCisgICAgaWYgKGNkcm9tX3Jlb3BlbihicykgPCAwKQorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2Ryb21fc2V0X2xvY2tlZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGxvY2tlZCkKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworCisgICAgaWYgKHMtPmZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIGlmIChpb2N0bChzLT5mZCwgKGxvY2tlZCA/IENESU9DUFJFVkVOVCA6IENESU9DQUxMT1cpKSA8IDApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogTm90ZTogYW4gZXJyb3IgY2FuIGhhcHBlbiBpZiB0aGUgZGlzdHJpYnV0aW9uIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICogbW91bnRzIHRoZSBDRC1ST00KKyAgICAgICAgICovCisgICAgICAgIC8qIHBlcnJvcigiQ0RST01fTE9DS0RPT1IiKTsgKi8KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyIGJkcnZfaG9zdF9jZHJvbSA9IHsKKyAgICAuZm9ybWF0X25hbWUgICAgICAgID0gImhvc3RfY2Ryb20iLAorICAgIC5wcm90b2NvbF9uYW1lICAgICAgPSAiaG9zdF9jZHJvbSIsCisgICAgLmluc3RhbmNlX3NpemUgICAgICA9IHNpemVvZihCRFJWUmF3U3RhdGUpLAorICAgIC5iZHJ2X3Byb2JlX2RldmljZQk9IGNkcm9tX3Byb2JlX2RldmljZSwKKyAgICAuYmRydl9maWxlX29wZW4gICAgID0gY2Ryb21fb3BlbiwKKyAgICAuYmRydl9jbG9zZSAgICAgICAgID0gcmF3X2Nsb3NlLAorICAgIC5iZHJ2X2NyZWF0ZSAgICAgICAgPSBoZGV2X2NyZWF0ZSwKKyAgICAuY3JlYXRlX29wdGlvbnMgICAgID0gcmF3X2NyZWF0ZV9vcHRpb25zLAorICAgIC5iZHJ2X2hhc196ZXJvX2luaXQgPSBoZGV2X2hhc196ZXJvX2luaXQsCisgICAgLmJkcnZfZmx1c2ggICAgICAgICA9IHJhd19mbHVzaCwKKworICAgIC5iZHJ2X2Fpb19yZWFkdiAgICAgPSByYXdfYWlvX3JlYWR2LAorICAgIC5iZHJ2X2Fpb193cml0ZXYgICAgPSByYXdfYWlvX3dyaXRldiwKKyAgICAuYmRydl9haW9fZmx1c2gJPSByYXdfYWlvX2ZsdXNoLAorCisgICAgLmJkcnZfcmVhZCAgICAgICAgICA9IHJhd19yZWFkLAorICAgIC5iZHJ2X3dyaXRlICAgICAgICAgPSByYXdfd3JpdGUsCisgICAgLmJkcnZfZ2V0bGVuZ3RoICAgICA9IHJhd19nZXRsZW5ndGgsCisKKyAgICAvKiByZW1vdmFibGUgZGV2aWNlIHN1cHBvcnQgKi8KKyAgICAuYmRydl9pc19pbnNlcnRlZCAgID0gY2Ryb21faXNfaW5zZXJ0ZWQsCisgICAgLmJkcnZfZWplY3QgICAgICAgICA9IGNkcm9tX2VqZWN0LAorICAgIC5iZHJ2X3NldF9sb2NrZWQgICAgPSBjZHJvbV9zZXRfbG9ja2VkLAorfTsKKyNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLworCitzdGF0aWMgdm9pZCBiZHJ2X2ZpbGVfaW5pdCh2b2lkKQoreworICAgIC8qCisgICAgICogUmVnaXN0ZXIgYWxsIHRoZSBkcml2ZXJzLiAgTm90ZSB0aGF0IG9yZGVyIGlzIGltcG9ydGFudCwgdGhlIGRyaXZlcgorICAgICAqIHJlZ2lzdGVyZWQgbGFzdCB3aWxsIGdldCBwcm9iZWQgZmlyc3QuCisgICAgICovCisgICAgYmRydl9yZWdpc3RlcigmYmRydl9maWxlKTsKKyAgICBiZHJ2X3JlZ2lzdGVyKCZiZHJ2X2hvc3RfZGV2aWNlKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBiZHJ2X3JlZ2lzdGVyKCZiZHJ2X2hvc3RfZmxvcHB5KTsKKyAgICBiZHJ2X3JlZ2lzdGVyKCZiZHJ2X2hvc3RfY2Ryb20pOworI2VuZGlmCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisgICAgYmRydl9yZWdpc3RlcigmYmRydl9ob3N0X2Nkcm9tKTsKKyNlbmRpZgorfQorCitibG9ja19pbml0KGJkcnZfZmlsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcmF3LXdpbjMyLmMgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy13aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNWFkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy13aW4zMi5jCkBAIC0wLDAgKzEsNDMxIEBACisvKgorICogQmxvY2sgZHJpdmVyIGZvciBSQVcgZmlsZXMgKHdpbjMyKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKyNpbmNsdWRlICJibG9jay9ibG9ja19pbnQuaCIKKyNpbmNsdWRlICJxZW11L21vZHVsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvd2luMzJfdW5pY29kZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmlvY3RsLmg+CisKKyNkZWZpbmUgRlRZUEVfRklMRSAwCisjZGVmaW5lIEZUWVBFX0NEICAgICAxCisjZGVmaW5lIEZUWVBFX0hBUkRESVNLIDIKKwordHlwZWRlZiBzdHJ1Y3QgQkRSVlJhd1N0YXRlIHsKKyAgICBIQU5ETEUgaGZpbGU7CisgICAgaW50IHR5cGU7CisgICAgY2hhciBkcml2ZV9wYXRoWzE2XTsgLyogZm9ybWF0OiAiZDpcIiAqLworfSBCRFJWUmF3U3RhdGU7CisKK2ludCBxZW11X2Z0cnVuY2F0ZTY0KGludCBmZCwgaW50NjRfdCBsZW5ndGgpCit7CisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyAgICBMT05HIGhpZ2g7CisgICAgSEFORExFIGg7CisgICAgQk9PTCByZXM7CisKKyAgICBpZiAoKEdldFZlcnNpb24oKSAmIDB4ODAwMDAwMDBVTCkgJiYgKGxlbmd0aCA+PiAzMikgIT0gMCkKKwlyZXR1cm4gLTE7CisKKyAgICBoID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmZCk7CisKKyAgICAvKiBnZXQgY3VycmVudCBwb3NpdGlvbiwgZnRydW5jYXRlIGRvIG5vdCBjaGFuZ2UgcG9zaXRpb24gKi8KKyAgICBsaS5IaWdoUGFydCA9IDA7CisgICAgbGkuTG93UGFydCA9IFNldEZpbGVQb2ludGVyIChoLCAwLCAmbGkuSGlnaFBhcnQsIEZJTEVfQ1VSUkVOVCk7CisgICAgaWYgKGxpLkxvd1BhcnQgPT0gMHhmZmZmZmZmZlVMICYmIEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKQorCXJldHVybiAtMTsKKworICAgIGhpZ2ggPSBsZW5ndGggPj4gMzI7CisgICAgaWYgKCFTZXRGaWxlUG9pbnRlcihoLCAoRFdPUkQpIGxlbmd0aCwgJmhpZ2gsIEZJTEVfQkVHSU4pKQorCXJldHVybiAtMTsKKyAgICByZXMgPSBTZXRFbmRPZkZpbGUoaCk7CisKKyAgICAvKiBiYWNrIHRvIG9sZCBwb3NpdGlvbiAqLworICAgIFNldEZpbGVQb2ludGVyKGgsIGxpLkxvd1BhcnQsICZsaS5IaWdoUGFydCwgRklMRV9CRUdJTik7CisgICAgcmV0dXJuIHJlcyA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBzZXRfc3BhcnNlKGludCBmZCkKK3sKKyAgICBEV09SRCByZXR1cm5lZDsKKyAgICByZXR1cm4gKGludCkgRGV2aWNlSW9Db250cm9sKChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmQpLCBGU0NUTF9TRVRfU1BBUlNFLAorCQkJCSBOVUxMLCAwLCBOVUxMLCAwLCAmcmV0dXJuZWQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHJhd19vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgaW50IGFjY2Vzc19mbGFnczsKKyAgICBEV09SRCBvdmVybGFwcGVkOworCisgICAgcy0+dHlwZSA9IEZUWVBFX0ZJTEU7CisKKyAgICBpZiAoZmxhZ3MgJiBCRFJWX09fUkRXUikgeworICAgICAgICBhY2Nlc3NfZmxhZ3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIGFjY2Vzc19mbGFncyA9IEdFTkVSSUNfUkVBRDsKKyAgICB9CisKKyAgICBvdmVybGFwcGVkID0gRklMRV9BVFRSSUJVVEVfTk9STUFMOworICAgIGlmICgoZmxhZ3MgJiBCRFJWX09fTk9DQUNIRSkpCisgICAgICAgIG92ZXJsYXBwZWQgfD0gRklMRV9GTEFHX05PX0JVRkZFUklORyB8IEZJTEVfRkxBR19XUklURV9USFJPVUdIOworICAgIGVsc2UgaWYgKCEoZmxhZ3MgJiBCRFJWX09fQ0FDSEVfV0IpKQorICAgICAgICBvdmVybGFwcGVkIHw9IEZJTEVfRkxBR19XUklURV9USFJPVUdIOworCisgICAgd2NoYXJfdCogd2lkZV9maWxlbmFtZSA9IHdpbjMyX3V0ZjhfdG9fdXRmMTZfc3RyKGZpbGVuYW1lKTsKKyAgICBpZiAod2lkZV9maWxlbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBzLT5oZmlsZSA9IENyZWF0ZUZpbGVXKHdpZGVfZmlsZW5hbWUsIGFjY2Vzc19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fRVhJU1RJTkcsIG92ZXJsYXBwZWQsIE5VTEwpOworICAgIGZyZWUod2lkZV9maWxlbmFtZSk7CisgICAgaWYgKHMtPmhmaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIGludCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0FDQ0VTU19ERU5JRUQpCisgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXdfcmVhZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgT1ZFUkxBUFBFRCBvdjsKKyAgICBEV09SRCByZXRfY291bnQ7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IG9mZnNldCA9IHNlY3Rvcl9udW0gKiA1MTI7CisgICAgaW50IGNvdW50ID0gbmJfc2VjdG9ycyAqIDUxMjsKKworICAgIG1lbXNldCgmb3YsIDAsIHNpemVvZihvdikpOworICAgIG92Lk9mZnNldCA9IG9mZnNldDsKKyAgICBvdi5PZmZzZXRIaWdoID0gb2Zmc2V0ID4+IDMyOworICAgIHJldCA9IFJlYWRGaWxlKHMtPmhmaWxlLCBidWYsIGNvdW50LCAmcmV0X2NvdW50LCAmb3YpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gcmV0X2NvdW50OworICAgIGlmIChyZXRfY291bnQgPT0gY291bnQpCisgICAgICAgIHJldF9jb3VudCA9IDA7CisgICAgcmV0dXJuIHJldF9jb3VudDsKK30KKworc3RhdGljIGludCByYXdfd3JpdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBPVkVSTEFQUEVEIG92OworICAgIERXT1JEIHJldF9jb3VudDsKKyAgICBpbnQgcmV0OworICAgIGludDY0X3Qgb2Zmc2V0ID0gc2VjdG9yX251bSAqIDUxMjsKKyAgICBpbnQgY291bnQgPSBuYl9zZWN0b3JzICogNTEyOworCisgICAgbWVtc2V0KCZvdiwgMCwgc2l6ZW9mKG92KSk7CisgICAgb3YuT2Zmc2V0ID0gb2Zmc2V0OworICAgIG92Lk9mZnNldEhpZ2ggPSBvZmZzZXQgPj4gMzI7CisgICAgcmV0ID0gV3JpdGVGaWxlKHMtPmhmaWxlLCBidWYsIGNvdW50LCAmcmV0X2NvdW50LCAmb3YpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gcmV0X2NvdW50OworICAgIGlmIChyZXRfY291bnQgPT0gY291bnQpCisgICAgICAgIHJldF9jb3VudCA9IDA7CisgICAgcmV0dXJuIHJldF9jb3VudDsKK30KKworc3RhdGljIHZvaWQgcmF3X2ZsdXNoKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgRmx1c2hGaWxlQnVmZmVycyhzLT5oZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhd19jbG9zZShCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBCRFJWUmF3U3RhdGUgKnMgPSBicy0+b3BhcXVlOworICAgIENsb3NlSGFuZGxlKHMtPmhmaWxlKTsKK30KKworc3RhdGljIGludCByYXdfdHJ1bmNhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0KQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgTE9ORyBsb3csIGhpZ2g7CisKKyAgICBsb3cgPSBvZmZzZXQ7CisgICAgaGlnaCA9IG9mZnNldCA+PiAzMjsKKyAgICBpZiAoIVNldEZpbGVQb2ludGVyKHMtPmhmaWxlLCBsb3csICZoaWdoLCBGSUxFX0JFR0lOKSkKKwlyZXR1cm4gLUVJTzsKKyAgICBpZiAoIVNldEVuZE9mRmlsZShzLT5oZmlsZSkpCisgICAgICAgIHJldHVybiAtRUlPOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCByYXdfZ2V0bGVuZ3RoKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIEJEUlZSYXdTdGF0ZSAqcyA9IGJzLT5vcGFxdWU7CisgICAgTEFSR0VfSU5URUdFUiBsOworICAgIFVMQVJHRV9JTlRFR0VSIGF2YWlsYWJsZSwgdG90YWwsIHRvdGFsX2ZyZWU7CisgICAgRElTS19HRU9NRVRSWV9FWCBkZzsKKyAgICBEV09SRCBjb3VudDsKKyAgICBCT09MIHN0YXR1czsKKworICAgIHN3aXRjaChzLT50eXBlKSB7CisgICAgY2FzZSBGVFlQRV9GSUxFOgorICAgICAgICBsLkxvd1BhcnQgPSBHZXRGaWxlU2l6ZShzLT5oZmlsZSwgKFBEV09SRCkmbC5IaWdoUGFydCk7CisgICAgICAgIGlmIChsLkxvd1BhcnQgPT0gMHhmZmZmZmZmZlVMICYmIEdldExhc3RFcnJvcigpICE9IE5PX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRlRZUEVfQ0Q6CisgICAgICAgIGlmICghR2V0RGlza0ZyZWVTcGFjZUV4KHMtPmRyaXZlX3BhdGgsICZhdmFpbGFibGUsICZ0b3RhbCwgJnRvdGFsX2ZyZWUpKQorICAgICAgICAgICAgcmV0dXJuIC1FSU87CisgICAgICAgIGwuUXVhZFBhcnQgPSB0b3RhbC5RdWFkUGFydDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGVFlQRV9IQVJERElTSzoKKyAgICAgICAgc3RhdHVzID0gRGV2aWNlSW9Db250cm9sKHMtPmhmaWxlLCBJT0NUTF9ESVNLX0dFVF9EUklWRV9HRU9NRVRSWV9FWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZkZywgc2l6ZW9mKGRnKSwgJmNvdW50LCBOVUxMKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBsID0gZGcuRGlza1NpemU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIHJldHVybiBsLlF1YWRQYXJ0OworfQorCitzdGF0aWMgaW50IHJhd19jcmVhdGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIFFFTVVPcHRpb25QYXJhbWV0ZXIgKm9wdGlvbnMpCit7CisgICAgaW50IGZkOworICAgIGludDY0X3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgICAvKiBSZWFkIG91dCBvcHRpb25zICovCisgICAgd2hpbGUgKG9wdGlvbnMgJiYgb3B0aW9ucy0+bmFtZSkgeworICAgICAgICBpZiAoIXN0cmNtcChvcHRpb25zLT5uYW1lLCBCTE9DS19PUFRfU0laRSkpIHsKKyAgICAgICAgICAgIHRvdGFsX3NpemUgPSBvcHRpb25zLT52YWx1ZS5uIC8gNTEyOworICAgICAgICB9CisgICAgICAgIG9wdGlvbnMrKzsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwKKyAgICAgICAgICAgICAgMDY0NCk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgc2V0X3NwYXJzZShmZCk7CisgICAgZnRydW5jYXRlKGZkLCB0b3RhbF9zaXplICogNTEyKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBRRU1VT3B0aW9uUGFyYW1ldGVyIHJhd19jcmVhdGVfb3B0aW9uc1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSBCTE9DS19PUFRfU0laRSwKKyAgICAgICAgLnR5cGUgPSBPUFRfU0laRSwKKyAgICAgICAgLmhlbHAgPSAiVmlydHVhbCBkaXNrIHNpemUiCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIEJsb2NrRHJpdmVyIGJkcnZfZmlsZSA9IHsKKyAgICAuZm9ybWF0X25hbWUJPSAiZmlsZSIsCisgICAgLnByb3RvY29sX25hbWUJPSAiZmlsZSIsCisgICAgLmluc3RhbmNlX3NpemUJPSBzaXplb2YoQkRSVlJhd1N0YXRlKSwKKyAgICAuYmRydl9maWxlX29wZW4JPSByYXdfb3BlbiwKKyAgICAuYmRydl9jbG9zZQkJPSByYXdfY2xvc2UsCisgICAgLmJkcnZfY3JlYXRlCT0gcmF3X2NyZWF0ZSwKKyAgICAuYmRydl9mbHVzaAkJPSByYXdfZmx1c2gsCisgICAgLmJkcnZfcmVhZAkJPSByYXdfcmVhZCwKKyAgICAuYmRydl93cml0ZQkJPSByYXdfd3JpdGUsCisgICAgLmJkcnZfdHJ1bmNhdGUJPSByYXdfdHJ1bmNhdGUsCisgICAgLmJkcnZfZ2V0bGVuZ3RoCT0gcmF3X2dldGxlbmd0aCwKKworICAgIC5jcmVhdGVfb3B0aW9ucyA9IHJhd19jcmVhdGVfb3B0aW9ucywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGhvc3QgZGV2aWNlICovCisKK3N0YXRpYyBpbnQgZmluZF9jZHJvbShjaGFyICpjZHJvbV9uYW1lLCBpbnQgY2Ryb21fbmFtZV9zaXplKQoreworICAgIGNoYXIgZHJpdmVzWzI1Nl0sICpwZHJ2ID0gZHJpdmVzOworICAgIFVJTlQgdHlwZTsKKworICAgIG1lbXNldChkcml2ZXMsIDAsIHNpemVvZihkcml2ZXMpKTsKKyAgICBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzKHNpemVvZihkcml2ZXMpLCBkcml2ZXMpOworICAgIHdoaWxlKHBkcnZbMF0gIT0gJ1wwJykgeworICAgICAgICB0eXBlID0gR2V0RHJpdmVUeXBlKHBkcnYpOworICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIERSSVZFX0NEUk9NOgorICAgICAgICAgICAgc25wcmludGYoY2Ryb21fbmFtZSwgY2Ryb21fbmFtZV9zaXplLCAiXFxcXC5cXCVjOiIsIHBkcnZbMF0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwZHJ2ICs9IGxzdHJsZW4ocGRydikgKyAxOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9kZXZpY2VfdHlwZShCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBVSU5UIHR5cGU7CisgICAgY29uc3QgY2hhciAqcDsKKworICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgIlxcXFwuXFwiLCAmcCkgfHwKKyAgICAgICAgc3Ryc3RhcnQoZmlsZW5hbWUsICIvLy4vIiwgJnApKSB7CisgICAgICAgIGlmIChzdHJpc3RhcnQocCwgIlBoeXNpY2FsRHJpdmUiLCBOVUxMKSkKKyAgICAgICAgICAgIHJldHVybiBGVFlQRV9IQVJERElTSzsKKyAgICAgICAgc25wcmludGYocy0+ZHJpdmVfcGF0aCwgc2l6ZW9mKHMtPmRyaXZlX3BhdGgpLCAiJWM6XFwiLCBwWzBdKTsKKyAgICAgICAgdHlwZSA9IEdldERyaXZlVHlwZShzLT5kcml2ZV9wYXRoKTsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgRFJJVkVfUkVNT1ZBQkxFOgorICAgICAgICBjYXNlIERSSVZFX0ZJWEVEOgorICAgICAgICAgICAgcmV0dXJuIEZUWVBFX0hBUkRESVNLOworICAgICAgICBjYXNlIERSSVZFX0NEUk9NOgorICAgICAgICAgICAgcmV0dXJuIEZUWVBFX0NEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZUWVBFX0ZJTEU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRlRZUEVfRklMRTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGRldl9wcm9iZV9kZXZpY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi9jZHJvbSIsIE5VTEwpKQorICAgICAgICByZXR1cm4gMTAwOworICAgIGlmIChpc193aW5kb3dzX2RyaXZlKGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIDEwMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZGV2X29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgQkRSVlJhd1N0YXRlICpzID0gYnMtPm9wYXF1ZTsKKyAgICBpbnQgYWNjZXNzX2ZsYWdzLCBjcmVhdGVfZmxhZ3M7CisgICAgRFdPUkQgb3ZlcmxhcHBlZDsKKyAgICBjaGFyIGRldmljZV9uYW1lWzY0XTsKKworICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgIi9kZXYvY2Ryb20iLCBOVUxMKSkgeworICAgICAgICBpZiAoZmluZF9jZHJvbShkZXZpY2VfbmFtZSwgc2l6ZW9mKGRldmljZV9uYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIGZpbGVuYW1lID0gZGV2aWNlX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdHJhbnNmb3JtIGRyaXZlIGxldHRlcnMgaW50byBkZXZpY2UgbmFtZSAqLworICAgICAgICBpZiAoKChmaWxlbmFtZVswXSA+PSAnYScgJiYgZmlsZW5hbWVbMF0gPD0gJ3onKSB8fAorICAgICAgICAgICAgIChmaWxlbmFtZVswXSA+PSAnQScgJiYgZmlsZW5hbWVbMF0gPD0gJ1onKSkgJiYKKyAgICAgICAgICAgIGZpbGVuYW1lWzFdID09ICc6JyAmJiBmaWxlbmFtZVsyXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBzbnByaW50ZihkZXZpY2VfbmFtZSwgc2l6ZW9mKGRldmljZV9uYW1lKSwgIlxcXFwuXFwlYzoiLCBmaWxlbmFtZVswXSk7CisgICAgICAgICAgICBmaWxlbmFtZSA9IGRldmljZV9uYW1lOworICAgICAgICB9CisgICAgfQorICAgIHMtPnR5cGUgPSBmaW5kX2RldmljZV90eXBlKGJzLCBmaWxlbmFtZSk7CisKKyAgICBpZiAoZmxhZ3MgJiBCRFJWX09fUkRXUikgeworICAgICAgICBhY2Nlc3NfZmxhZ3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworICAgIH0gZWxzZSB7CisgICAgICAgIGFjY2Vzc19mbGFncyA9IEdFTkVSSUNfUkVBRDsKKyAgICB9CisgICAgY3JlYXRlX2ZsYWdzID0gT1BFTl9FWElTVElORzsKKworICAgIG92ZXJsYXBwZWQgPSBGSUxFX0FUVFJJQlVURV9OT1JNQUw7CisgICAgaWYgKChmbGFncyAmIEJEUlZfT19OT0NBQ0hFKSkKKyAgICAgICAgb3ZlcmxhcHBlZCB8PSBGSUxFX0ZMQUdfTk9fQlVGRkVSSU5HIHwgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0g7CisgICAgZWxzZSBpZiAoIShmbGFncyAmIEJEUlZfT19DQUNIRV9XQikpCisgICAgICAgIG92ZXJsYXBwZWQgfD0gRklMRV9GTEFHX1dSSVRFX1RIUk9VR0g7CisgICAgcy0+aGZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLCBhY2Nlc3NfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX2ZsYWdzLCBvdmVybGFwcGVkLCBOVUxMKTsKKyAgICBpZiAocy0+aGZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgaW50IGVyciA9IEdldExhc3RFcnJvcigpOworCisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkKKyAgICAgICAgICAgIHJldHVybiAtRUFDQ0VTOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcmVtb3ZhYmxlIGRldmljZSBhZGRpdGlvbmFsIGNvbW1hbmRzICovCisKK3N0YXRpYyBpbnQgcmF3X2lzX2luc2VydGVkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJhd19tZWRpYV9jaGFuZ2VkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiAtRU5PVFNVUDsKK30KKworc3RhdGljIGludCByYXdfZWplY3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBlamVjdF9mbGFnKQoreworICAgIERXT1JEIHJldF9jb3VudDsKKworICAgIGlmIChzLT50eXBlID09IEZUWVBFX0ZJTEUpCisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKyAgICBpZiAoZWplY3RfZmxhZykgeworICAgICAgICBEZXZpY2VJb0NvbnRyb2wocy0+aGZpbGUsIElPQ1RMX1NUT1JBR0VfRUpFQ1RfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCAwLCAmbHBCeXRlc1JldHVybmVkLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEZXZpY2VJb0NvbnRyb2wocy0+aGZpbGUsIElPQ1RMX1NUT1JBR0VfTE9BRF9NRURJQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIE5VTEwsIDAsICZscEJ5dGVzUmV0dXJuZWQsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIGludCByYXdfc2V0X2xvY2tlZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGxvY2tlZCkKK3sKKyAgICByZXR1cm4gLUVOT1RTVVA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBoZGV2X2hhc196ZXJvX2luaXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBCbG9ja0RyaXZlciBiZHJ2X2hvc3RfZGV2aWNlID0geworICAgIC5mb3JtYXRfbmFtZQk9ICJob3N0X2RldmljZSIsCisgICAgLnByb3RvY29sX25hbWUJPSAiaG9zdF9kZXZpY2UiLAorICAgIC5pbnN0YW5jZV9zaXplCT0gc2l6ZW9mKEJEUlZSYXdTdGF0ZSksCisgICAgLmJkcnZfcHJvYmVfZGV2aWNlCT0gaGRldl9wcm9iZV9kZXZpY2UsCisgICAgLmJkcnZfZmlsZV9vcGVuCT0gaGRldl9vcGVuLAorICAgIC5iZHJ2X2Nsb3NlCQk9IHJhd19jbG9zZSwKKyAgICAuYmRydl9mbHVzaAkJPSByYXdfZmx1c2gsCisgICAgLmJkcnZfaGFzX3plcm9faW5pdCA9IGhkZXZfaGFzX3plcm9faW5pdCwKKworICAgIC5iZHJ2X3JlYWQJCT0gcmF3X3JlYWQsCisgICAgLmJkcnZfd3JpdGUJICAgICAgICA9IHJhd193cml0ZSwKKyAgICAuYmRydl9nZXRsZW5ndGgJPSByYXdfZ2V0bGVuZ3RoLAorfTsKKworc3RhdGljIHZvaWQgYmRydl9maWxlX2luaXQodm9pZCkKK3sKKyAgICBiZHJ2X3JlZ2lzdGVyKCZiZHJ2X2ZpbGUpOworICAgIGJkcnZfcmVnaXN0ZXIoJmJkcnZfaG9zdF9kZXZpY2UpOworfQorCitibG9ja19pbml0KGJkcnZfZmlsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2svcmF3LmMgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTA5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Jsb2NrL3Jhdy5jCkBAIC0wLDAgKzEsMjgwIEBACisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrX2ludC5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisKK3N0YXRpYyBpbnQgcmF3X29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBmbGFncykKK3sKKyAgICBicy0+c2cgPSBicy0+ZmlsZS0+c2c7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGNoZWNrIGZvciB0aGUgdXNlciBhdHRlbXB0aW5nIHRvIHdyaXRlIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYQorICAgYmxvY2sgZm9ybWF0IGhlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbWFnZSBhbmQgZmFpbCBvdXQuCisqLworc3RhdGljIGludCBjaGVja19mb3JfYmxvY2tfc2lnbmF0dXJlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCB1aW50OF90ICpidWYpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lnbmF0dXJlc1tdWzRdID0geworICAgICAgICB7ICdRJywgJ0YnLCAnSScsIDB4ZmIgfSwgLyogcWNvdy9xY293MiAqLworICAgICAgICB7ICdDJywgJ08nLCAnVycsICdEJyB9LCAvKiBWTURLMyAqLworICAgICAgICB7ICdWJywgJ00nLCAnRCcsICdLJyB9LCAvKiBWTURLNCAqLworICAgICAgICB7ICdPJywgJ08nLCAnTycsICdNJyB9LCAvKiBVTUwgQ09XICovCisgICAgICAgIHt9CisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHNpZ25hdHVyZXNbaV1bMF0gIT0gMDsgaSsrKSB7CisgICAgICAgIGlmIChtZW1jbXAoYnVmLCBzaWduYXR1cmVzW2ldLCA0KSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3dyaXRlX3Vuc2FmZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycykKK3sKKyAgICAvKiBhc3N1bWUgdGhhdCBpZiB0aGUgdXNlciBzcGVjaWZpZXMgdGhlIGZvcm1hdCBleHBsaWNpdGx5LCB0aGVuIGFzc3VtZQorICAgICAgIHRoYXQgdGhleSB3aWxsIGNvbnRpbnVlIHRvIGRvIHNvIGFuZCBwcm92aWRlIG5vIHNhZmV0eSBuZXQgKi8KKyAgICBpZiAoIWJzLT5wcm9iZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNlY3Rvcl9udW0gPT0gMCAmJiBuYl9zZWN0b3JzID4gMCkgeworICAgICAgICByZXR1cm4gY2hlY2tfZm9yX2Jsb2NrX3NpZ25hdHVyZShicywgYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByYXdfcmVhZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKQoreworICAgIHJldHVybiBiZHJ2X3JlYWQoYnMtPmZpbGUsIHNlY3Rvcl9udW0sIGJ1ZiwgbmJfc2VjdG9ycyk7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3dyaXRlX3NjcnViYmVkX2Jvb3RzZWN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmKQoreworICAgIHVpbnQ4X3QgYm9vdHNlY3RbNTEyXTsKKworICAgIC8qIHNjcnViIHRoZSBkYW5nZXJvdXMgc2lnbmF0dXJlICovCisgICAgbWVtY3B5KGJvb3RzZWN0LCBidWYsIDUxMik7CisgICAgbWVtc2V0KGJvb3RzZWN0LCAwLCA0KTsKKworICAgIHJldHVybiBiZHJ2X3dyaXRlKGJzLT5maWxlLCAwLCBib290c2VjdCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3dyaXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKQoreworICAgIGlmIChjaGVja193cml0ZV91bnNhZmUoYnMsIHNlY3Rvcl9udW0sIGJ1ZiwgbmJfc2VjdG9ycykpIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICByZXQgPSByYXdfd3JpdGVfc2NydWJiZWRfYm9vdHNlY3QoYnMsIGJ1Zik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYmRydl93cml0ZShicy0+ZmlsZSwgMSwgYnVmICsgNTEyLCBuYl9zZWN0b3JzIC0gMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldCArIDUxMjsKKyAgICB9CisKKyAgICByZXR1cm4gYmRydl93cml0ZShicy0+ZmlsZSwgc2VjdG9yX251bSwgYnVmLCBuYl9zZWN0b3JzKTsKK30KKworc3RhdGljIEJsb2NrRHJpdmVyQUlPQ0IgKnJhd19haW9fcmVhZHYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgcmV0dXJuIGJkcnZfYWlvX3JlYWR2KGJzLT5maWxlLCBzZWN0b3JfbnVtLCBxaW92LCBuYl9zZWN0b3JzLCBjYiwgb3BhcXVlKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgUmF3U2NydWJiZXJCb3VuY2UKK3sKKyAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYjsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgUUVNVUlPVmVjdG9yIHFpb3Y7Cit9IFJhd1NjcnViYmVyQm91bmNlOworCitzdGF0aWMgdm9pZCByYXdfYWlvX3dyaXRldl9zY3J1YmJlZCh2b2lkICpvcGFxdWUsIGludCByZXQpCit7CisgICAgUmF3U2NydWJiZXJCb3VuY2UgKmIgPSBvcGFxdWU7CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBiLT5jYihiLT5vcGFxdWUsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYi0+Y2IoYi0+b3BhcXVlLCByZXQgKyA1MTIpOworICAgIH0KKworICAgIHFlbXVfaW92ZWNfZGVzdHJveSgmYi0+cWlvdik7CisgICAgZ19mcmVlKGIpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcmF3X2Fpb193cml0ZXYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgY29uc3QgdWludDhfdCAqZmlyc3RfYnVmOworICAgIGludCBmaXJzdF9idWZfaW5kZXggPSAwLCBpOworCisgICAgLyogVGhpcyBpcyBwcm9iYWJseSBiZWluZyBwYXJhbm9pZCwgYnV0IGhhbmRsZSBjYXNlcyBvZiB6ZXJvIHNpemUKKyAgICAgICB2ZWN0b3JzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBxaW92LT5uaW92OyBpKyspIHsKKyAgICAgICAgaWYgKHFpb3YtPmlvdltpXS5pb3ZfbGVuKSB7CisgICAgICAgICAgICBhc3NlcnQocWlvdi0+aW92W2ldLmlvdl9sZW4gPj0gNTEyKTsKKyAgICAgICAgICAgIGZpcnN0X2J1Zl9pbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpcnN0X2J1ZiA9IHFpb3YtPmlvdltmaXJzdF9idWZfaW5kZXhdLmlvdl9iYXNlOworCisgICAgaWYgKGNoZWNrX3dyaXRlX3Vuc2FmZShicywgc2VjdG9yX251bSwgZmlyc3RfYnVmLCBuYl9zZWN0b3JzKSkgeworICAgICAgICBSYXdTY3J1YmJlckJvdW5jZSAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICAvKiB3cml0ZSB0aGUgZmlyc3Qgc2VjdG9yIHVzaW5nIHN5bmMgSS9PICovCisgICAgICAgIHJldCA9IHJhd193cml0ZV9zY3J1YmJlZF9ib290c2VjdChicywgZmlyc3RfYnVmKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyogYWRqdXN0IHJlcXVlc3QgdG8gYmUgZXZlcnl0aGluZyBidXQgZmlyc3Qgc2VjdG9yICovCisKKyAgICAgICAgYiA9IGdfbWFsbG9jKHNpemVvZigqYikpOworICAgICAgICBiLT5jYiA9IGNiOworICAgICAgICBiLT5vcGFxdWUgPSBvcGFxdWU7CisKKyAgICAgICAgcWVtdV9pb3ZlY19pbml0KCZiLT5xaW92LCBxaW92LT5uYWxsb2MpOworICAgICAgICBxZW11X2lvdmVjX2NvbmNhdCgmYi0+cWlvdiwgcWlvdiwgMCwgcWlvdi0+c2l6ZSk7CisKKyAgICAgICAgYi0+cWlvdi5zaXplIC09IDUxMjsKKyAgICAgICAgYi0+cWlvdi5pb3ZbZmlyc3RfYnVmX2luZGV4XS5pb3ZfYmFzZSArPSA1MTI7CisgICAgICAgIGItPnFpb3YuaW92W2ZpcnN0X2J1Zl9pbmRleF0uaW92X2xlbiAtPSA1MTI7CisKKyAgICAgICAgcmV0dXJuIGJkcnZfYWlvX3dyaXRldihicy0+ZmlsZSwgc2VjdG9yX251bSArIDEsICZiLT5xaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NlY3RvcnMgLSAxLCByYXdfYWlvX3dyaXRldl9zY3J1YmJlZCwgYik7CisgICAgfQorCisgICAgcmV0dXJuIGJkcnZfYWlvX3dyaXRldihicy0+ZmlsZSwgc2VjdG9yX251bSwgcWlvdiwgbmJfc2VjdG9ycywgY2IsIG9wYXF1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhd19jbG9zZShCbG9ja0RyaXZlclN0YXRlICpicykKK3sKK30KKworc3RhdGljIHZvaWQgcmF3X2ZsdXNoKEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIGJkcnZfZmx1c2goYnMtPmZpbGUpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcmF3X2Fpb19mbHVzaChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiBiZHJ2X2Fpb19mbHVzaChicy0+ZmlsZSwgY2IsIG9wYXF1ZSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHJhd19nZXRsZW5ndGgoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgcmV0dXJuIGJkcnZfZ2V0bGVuZ3RoKGJzLT5maWxlKTsKK30KKworc3RhdGljIGludCByYXdfdHJ1bmNhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0KQoreworICAgIHJldHVybiBiZHJ2X3RydW5jYXRlKGJzLT5maWxlLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IHJhd19wcm9iZShjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICByZXR1cm4gMTsgLyogZXZlcnl0aGluZyBjYW4gYmUgb3BlbmVkIGFzIHJhdyBpbWFnZSAqLworfQorCitzdGF0aWMgaW50IHJhd19pc19pbnNlcnRlZChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICByZXR1cm4gYmRydl9pc19pbnNlcnRlZChicy0+ZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgcmF3X2VqZWN0KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgZWplY3RfZmxhZykKK3sKKyAgICByZXR1cm4gYmRydl9lamVjdChicy0+ZmlsZSwgZWplY3RfZmxhZyk7Cit9CisKK3N0YXRpYyBpbnQgcmF3X3NldF9sb2NrZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBsb2NrZWQpCit7CisgICAgYmRydl9zZXRfbG9ja2VkKGJzLT5maWxlLCBsb2NrZWQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJhd19pb2N0bChCbG9ja0RyaXZlclN0YXRlICpicywgdW5zaWduZWQgbG9uZyBpbnQgcmVxLCB2b2lkICpidWYpCit7CisgICByZXR1cm4gYmRydl9pb2N0bChicy0+ZmlsZSwgcmVxLCBidWYpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqcmF3X2Fpb19pb2N0bChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpbnQgcmVxLCB2b2lkICpidWYsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICByZXR1cm4gYmRydl9haW9faW9jdGwoYnMtPmZpbGUsIHJlcSwgYnVmLCBjYiwgb3BhcXVlKTsKK30KKworc3RhdGljIGludCByYXdfY3JlYXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBRRU1VT3B0aW9uUGFyYW1ldGVyICpvcHRpb25zKQoreworICAgIHJldHVybiBiZHJ2X2NyZWF0ZV9maWxlKGZpbGVuYW1lLCBvcHRpb25zKTsKK30KKworc3RhdGljIFFFTVVPcHRpb25QYXJhbWV0ZXIgcmF3X2NyZWF0ZV9vcHRpb25zW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9IEJMT0NLX09QVF9TSVpFLAorICAgICAgICAudHlwZSA9IE9QVF9TSVpFLAorICAgICAgICAuaGVscCA9ICJWaXJ0dWFsIGRpc2sgc2l6ZSIKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgaW50IHJhd19oYXNfemVyb19pbml0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKQoreworICAgIHJldHVybiBiZHJ2X2hhc196ZXJvX2luaXQoYnMtPmZpbGUpOworfQorCitzdGF0aWMgQmxvY2tEcml2ZXIgYmRydl9yYXcgPSB7CisgICAgLmZvcm1hdF9uYW1lICAgICAgICA9ICJyYXciLAorCisgICAgLyogSXQncyByZWFsbHkgMCwgYnV0IHdlIG5lZWQgdG8gbWFrZSBnX21hbGxvYygpIGhhcHB5ICovCisgICAgLmluc3RhbmNlX3NpemUgICAgICA9IDEsCisKKyAgICAuYmRydl9vcGVuICAgICAgICAgID0gcmF3X29wZW4sCisgICAgLmJkcnZfY2xvc2UgICAgICAgICA9IHJhd19jbG9zZSwKKyAgICAuYmRydl9yZWFkICAgICAgICAgID0gcmF3X3JlYWQsCisgICAgLmJkcnZfd3JpdGUgICAgICAgICA9IHJhd193cml0ZSwKKyAgICAuYmRydl9mbHVzaCAgICAgICAgID0gcmF3X2ZsdXNoLAorICAgIC5iZHJ2X3Byb2JlICAgICAgICAgPSByYXdfcHJvYmUsCisgICAgLmJkcnZfZ2V0bGVuZ3RoICAgICA9IHJhd19nZXRsZW5ndGgsCisgICAgLmJkcnZfdHJ1bmNhdGUgICAgICA9IHJhd190cnVuY2F0ZSwKKworICAgIC5iZHJ2X2Fpb19yZWFkdiAgICAgPSByYXdfYWlvX3JlYWR2LAorICAgIC5iZHJ2X2Fpb193cml0ZXYgICAgPSByYXdfYWlvX3dyaXRldiwKKyAgICAuYmRydl9haW9fZmx1c2ggICAgID0gcmF3X2Fpb19mbHVzaCwKKworICAgIC5iZHJ2X2lzX2luc2VydGVkICAgPSByYXdfaXNfaW5zZXJ0ZWQsCisgICAgLmJkcnZfZWplY3QgICAgICAgICA9IHJhd19lamVjdCwKKyAgICAuYmRydl9zZXRfbG9ja2VkICAgID0gcmF3X3NldF9sb2NrZWQsCisgICAgLmJkcnZfaW9jdGwgICAgICAgICA9IHJhd19pb2N0bCwKKyAgICAuYmRydl9haW9faW9jdGwgICAgID0gcmF3X2Fpb19pb2N0bCwKKworICAgIC5iZHJ2X2NyZWF0ZSAgICAgICAgPSByYXdfY3JlYXRlLAorICAgIC5jcmVhdGVfb3B0aW9ucyAgICAgPSByYXdfY3JlYXRlX29wdGlvbnMsCisgICAgLmJkcnZfaGFzX3plcm9faW5pdCA9IHJhd19oYXNfemVyb19pbml0LAorfTsKKworc3RhdGljIHZvaWQgYmRydl9yYXdfaW5pdCh2b2lkKQoreworICAgIGJkcnZfcmVnaXN0ZXIoJmJkcnZfcmF3KTsKK30KKworYmxvY2tfaW5pdChiZHJ2X3Jhd19pbml0KTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYmxvY2tkZXYuYyBiL2FuZHJvaWQvcWVtdTEvYmxvY2tkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAyNGM5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ibG9ja2Rldi5jCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogUUVNVSBob3N0IGJsb2NrIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IKKyAqIGxhdGVyLiAgU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2luY2x1ZGUgImJsb2NrL2Jsb2NrLmgiCisjaW5jbHVkZSAic3lzZW11L2Jsb2NrZGV2LmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKyNpbmNsdWRlICJxZW11L2NvbmZpZy1maWxlLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCitzdGF0aWMgUVRBSUxRX0hFQUQoZHJpdmVsaXN0LCBEcml2ZUluZm8pIGRyaXZlcyA9IFFUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKGRyaXZlcyk7CisKKy8qCisgKiBXZSBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGUgZHJpdmUgd2hlbiBhIGRldmljZSB1c2luZyBpdCBnZXRzCisgKiB1bnBsdWdnZWQuICBRdWVzdGlvbmFibGUgZmVhdHVyZSwgYnV0IHdlIGNhbid0IGp1c3QgZHJvcCBpdC4KKyAqIERldmljZSBtb2RlbHMgY2FsbCBibG9ja2Rldl9tYXJrX2F1dG9fZGVsKCkgdG8gc2NoZWR1bGUgdGhlCisgKiBhdXRvbWF0aWMgZGVsZXRpb24sIGFuZCBnZW5lcmljIHFkZXYgY29kZSBjYWxscyBibG9ja2Rldl9hdXRvX2RlbCgpCisgKiB3aGVuIGRlbGV0aW9uIGlzIGFjdHVhbGx5IHNhZmUuCisgKi8KK3ZvaWQgYmxvY2tkZXZfbWFya19hdXRvX2RlbChCbG9ja0RyaXZlclN0YXRlICpicykKK3sKKyAgICBEcml2ZUluZm8gKmRpbmZvID0gZHJpdmVfZ2V0X2J5X2Jsb2NrZGV2KGJzKTsKKworICAgIGRpbmZvLT5hdXRvX2RlbCA9IDE7Cit9CisKK3ZvaWQgYmxvY2tkZXZfYXV0b19kZWwoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgRHJpdmVJbmZvICpkaW5mbyA9IGRyaXZlX2dldF9ieV9ibG9ja2Rldihicyk7CisKKyAgICBpZiAoZGluZm8tPmF1dG9fZGVsKSB7CisgICAgICAgIGRyaXZlX3VuaW5pdChkaW5mbyk7CisgICAgfQorfQorCitRZW11T3B0cyAqZHJpdmVfYWRkKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgY2hhciBvcHRzdHJbMTAyNF07CisgICAgUWVtdU9wdHMgKm9wdHM7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c25wcmludGYob3B0c3RyLCBzaXplb2Yob3B0c3RyKSwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIG9wdHMgPSBxZW11X29wdHNfcGFyc2UocWVtdV9maW5kX29wdHMoImRyaXZlIiksIG9wdHN0ciwgMCk7CisgICAgaWYgKCFvcHRzKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZmlsZSkKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJmaWxlIiwgZmlsZSk7CisgICAgcmV0dXJuIG9wdHM7Cit9CisKK0RyaXZlSW5mbyAqZHJpdmVfZ2V0KEJsb2NrSW50ZXJmYWNlVHlwZSB0eXBlLCBpbnQgYnVzLCBpbnQgdW5pdCkKK3sKKyAgICBEcml2ZUluZm8gKmRpbmZvOworCisgICAgLyogc2VlayBpbnRlcmZhY2UsIGJ1cyBhbmQgdW5pdCAqLworCisgICAgUVRBSUxRX0ZPUkVBQ0goZGluZm8sICZkcml2ZXMsIG5leHQpIHsKKyAgICAgICAgaWYgKGRpbmZvLT50eXBlID09IHR5cGUgJiYKKwkgICAgZGluZm8tPmJ1cyA9PSBidXMgJiYKKwkgICAgZGluZm8tPnVuaXQgPT0gdW5pdCkKKyAgICAgICAgICAgIHJldHVybiBkaW5mbzsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGRyaXZlX2dldF9tYXhfYnVzKEJsb2NrSW50ZXJmYWNlVHlwZSB0eXBlKQoreworICAgIGludCBtYXhfYnVzOworICAgIERyaXZlSW5mbyAqZGluZm87CisKKyAgICBtYXhfYnVzID0gLTE7CisgICAgUVRBSUxRX0ZPUkVBQ0goZGluZm8sICZkcml2ZXMsIG5leHQpIHsKKyAgICAgICAgaWYoZGluZm8tPnR5cGUgPT0gdHlwZSAmJgorICAgICAgICAgICBkaW5mby0+YnVzID4gbWF4X2J1cykKKyAgICAgICAgICAgIG1heF9idXMgPSBkaW5mby0+YnVzOworICAgIH0KKyAgICByZXR1cm4gbWF4X2J1czsKK30KKworRHJpdmVJbmZvICpkcml2ZV9nZXRfYnlfYmxvY2tkZXYoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpCit7CisgICAgRHJpdmVJbmZvICpkaW5mbzsKKworICAgIFFUQUlMUV9GT1JFQUNIKGRpbmZvLCAmZHJpdmVzLCBuZXh0KSB7CisgICAgICAgIGlmIChkaW5mby0+YmRydiA9PSBicykgeworICAgICAgICAgICAgcmV0dXJuIGRpbmZvOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBiZHJ2X2Zvcm1hdF9wcmludCh2b2lkICpvcGFxdWUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIgJXMiLCBuYW1lKTsKK30KKwordm9pZCBkcml2ZV91bmluaXQoRHJpdmVJbmZvICpkaW5mbykKK3sKKyAgICBxZW11X29wdHNfZGVsKGRpbmZvLT5vcHRzKTsKKyAgICBiZHJ2X2RlbGV0ZShkaW5mby0+YmRydik7CisgICAgUVRBSUxRX1JFTU9WRSgmZHJpdmVzLCBkaW5mbywgbmV4dCk7CisgICAgZ19mcmVlKGRpbmZvKTsKK30KKworc3RhdGljIGludCBwYXJzZV9ibG9ja19lcnJvcl9hY3Rpb24oY29uc3QgY2hhciAqYnVmLCBpbnQgaXNfcmVhZCkKK3sKKyAgICBpZiAoIXN0cmNtcChidWYsICJpZ25vcmUiKSkgeworICAgICAgICByZXR1cm4gQkxPQ0tfRVJSX0lHTk9SRTsKKyAgICB9IGVsc2UgaWYgKCFpc19yZWFkICYmICFzdHJjbXAoYnVmLCAiZW5vc3BjIikpIHsKKyAgICAgICAgcmV0dXJuIEJMT0NLX0VSUl9TVE9QX0VOT1NQQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAic3RvcCIpKSB7CisgICAgICAgIHJldHVybiBCTE9DS19FUlJfU1RPUF9BTlk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInJlcG9ydCIpKSB7CisgICAgICAgIHJldHVybiBCTE9DS19FUlJfUkVQT1JUOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkICVzIGVycm9yIGFjdGlvblxuIiwKKyAgICAgICAgICAgIGJ1ZiwgaXNfcmVhZCA/ICJyZWFkIiA6ICJ3cml0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitEcml2ZUluZm8gKmRyaXZlX2luaXQoUWVtdU9wdHMgKm9wdHMsIGludCBkZWZhdWx0X3RvX3Njc2ksIGludCAqZmF0YWxfZXJyb3IpCit7CisgICAgY29uc3QgY2hhciAqYnVmOworICAgIGNvbnN0IGNoYXIgKmZpbGUgPSBOVUxMOworICAgIGNoYXIgZGV2bmFtZVsxMjhdOworICAgIGNvbnN0IGNoYXIgKnNlcmlhbDsKKyAgICBjb25zdCBjaGFyICptZWRpYXN0ciA9ICIiOworICAgIEJsb2NrSW50ZXJmYWNlVHlwZSB0eXBlOworICAgIGVudW0geyBNRURJQV9ESVNLLCBNRURJQV9DRFJPTSB9IG1lZGlhOworICAgIGludCBidXNfaWQsIHVuaXRfaWQ7CisgICAgaW50IGN5bHMsIGhlYWRzLCBzZWNzLCB0cmFuc2xhdGlvbjsKKyAgICBCbG9ja0RyaXZlciAqZHJ2ID0gTlVMTDsKKyAgICBpbnQgbWF4X2RldnM7CisgICAgaW50IGluZGV4OworICAgIGludCBybyA9IDA7CisgICAgaW50IGJkcnZfZmxhZ3MgPSAwOworICAgIGludCBvbl9yZWFkX2Vycm9yLCBvbl93cml0ZV9lcnJvcjsKKyAgICBjb25zdCBjaGFyICpkZXZhZGRyOworICAgIERyaXZlSW5mbyAqZGluZm87CisgICAgaW50IHNuYXBzaG90ID0gMDsKKyAgICBpbnQgcmV0OworCisgICAgKmZhdGFsX2Vycm9yID0gMTsKKworICAgIHRyYW5zbGF0aW9uID0gQklPU19BVEFfVFJBTlNMQVRJT05fQVVUTzsKKworICAgIGlmIChkZWZhdWx0X3RvX3Njc2kpIHsKKyAgICAgICAgdHlwZSA9IElGX1NDU0k7CisgICAgICAgIG1heF9kZXZzID0gTUFYX1NDU0lfREVWUzsKKyAgICAgICAgcHN0cmNweShkZXZuYW1lLCBzaXplb2YoZGV2bmFtZSksICJzY3NpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9IElGX0lERTsKKyAgICAgICAgbWF4X2RldnMgPSBNQVhfSURFX0RFVlM7CisgICAgICAgIHBzdHJjcHkoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCAiaWRlIik7CisgICAgfQorICAgIG1lZGlhID0gTUVESUFfRElTSzsKKworICAgIC8qIGV4dHJhY3QgcGFyYW1ldGVycyAqLworICAgIGJ1c19pZCAgPSBxZW11X29wdF9nZXRfbnVtYmVyKG9wdHMsICJidXMiLCAwKTsKKyAgICB1bml0X2lkID0gcWVtdV9vcHRfZ2V0X251bWJlcihvcHRzLCAidW5pdCIsIC0xKTsKKyAgICBpbmRleCAgID0gcWVtdV9vcHRfZ2V0X251bWJlcihvcHRzLCAiaW5kZXgiLCAtMSk7CisKKyAgICBjeWxzICA9IHFlbXVfb3B0X2dldF9udW1iZXIob3B0cywgImN5bHMiLCAwKTsKKyAgICBoZWFkcyA9IHFlbXVfb3B0X2dldF9udW1iZXIob3B0cywgImhlYWRzIiwgMCk7CisgICAgc2VjcyAgPSBxZW11X29wdF9nZXRfbnVtYmVyKG9wdHMsICJzZWNzIiwgMCk7CisKKyAgICBzbmFwc2hvdCA9IHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJzbmFwc2hvdCIsIDApOworICAgIHJvID0gcWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgInJlYWRvbmx5IiwgMCk7CisKKyAgICBmaWxlID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJmaWxlIik7CisgICAgc2VyaWFsID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJzZXJpYWwiKTsKKworICAgIGlmICgoYnVmID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJpZiIpKSAhPSBOVUxMKSB7CisgICAgICAgIHBzdHJjcHkoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCBidWYpOworICAgICAgICBpZiAoIXN0cmNtcChidWYsICJpZGUiKSkgeworCSAgICB0eXBlID0gSUZfSURFOworICAgICAgICAgICAgbWF4X2RldnMgPSBNQVhfSURFX0RFVlM7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJzY3NpIikpIHsKKwkgICAgdHlwZSA9IElGX1NDU0k7CisgICAgICAgICAgICBtYXhfZGV2cyA9IE1BWF9TQ1NJX0RFVlM7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJmbG9wcHkiKSkgeworCSAgICB0eXBlID0gSUZfRkxPUFBZOworICAgICAgICAgICAgbWF4X2RldnMgPSAwOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAicGZsYXNoIikpIHsKKwkgICAgdHlwZSA9IElGX1BGTEFTSDsKKyAgICAgICAgICAgIG1heF9kZXZzID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAibXRkIikpIHsKKwkgICAgdHlwZSA9IElGX01URDsKKyAgICAgICAgICAgIG1heF9kZXZzID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAic2QiKSkgeworCSAgICB0eXBlID0gSUZfU0Q7CisgICAgICAgICAgICBtYXhfZGV2cyA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJ2aXJ0aW8iKSkgeworICAgICAgICAgICAgdHlwZSA9IElGX1ZJUlRJTzsKKyAgICAgICAgICAgIG1heF9kZXZzID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAieGVuIikpIHsKKwkgICAgdHlwZSA9IElGX1hFTjsKKyAgICAgICAgICAgIG1heF9kZXZzID0gMDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAibm9uZSIpKSB7CisJICAgIHR5cGUgPSBJRl9OT05FOworICAgICAgICAgICAgbWF4X2RldnMgPSAwOworCX0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHVuc3VwcG9ydGVkIGJ1cyB0eXBlICclcydcbiIsIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgaWYgKGN5bHMgfHwgaGVhZHMgfHwgc2VjcykgeworICAgICAgICBpZiAoY3lscyA8IDEgfHwgKHR5cGUgPT0gSUZfSURFICYmIGN5bHMgPiAxNjM4MykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIHBoeXNpY2FsIGN5bHMgbnVtYmVyXG4iLCBidWYpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgICAgIGlmIChoZWFkcyA8IDEgfHwgKHR5cGUgPT0gSUZfSURFICYmIGhlYWRzID4gMTYpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgaW52YWxpZCBwaHlzaWNhbCBoZWFkcyBudW1iZXJcbiIsIGJ1Zik7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICAgICAgaWYgKHNlY3MgPCAxIHx8ICh0eXBlID09IElGX0lERSAmJiBzZWNzID4gNjMpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgaW52YWxpZCBwaHlzaWNhbCBzZWNzIG51bWJlclxuIiwgYnVmKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIGlmICgoYnVmID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJ0cmFucyIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghY3lscykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJxZW11OiAnJXMnIHRyYW5zIG11c3QgYmUgdXNlZCB3aXRoIGN5bHMsaGVhZHMgYW5kIHNlY3NcbiIsCisgICAgICAgICAgICAgICAgICAgIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcChidWYsICJub25lIikpCisgICAgICAgICAgICB0cmFuc2xhdGlvbiA9IEJJT1NfQVRBX1RSQU5TTEFUSU9OX05PTkU7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAibGJhIikpCisgICAgICAgICAgICB0cmFuc2xhdGlvbiA9IEJJT1NfQVRBX1RSQU5TTEFUSU9OX0xCQTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChidWYsICJhdXRvIikpCisgICAgICAgICAgICB0cmFuc2xhdGlvbiA9IEJJT1NfQVRBX1RSQU5TTEFUSU9OX0FVVE87CisJZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgaW52YWxpZCB0cmFuc2xhdGlvbiB0eXBlXG4iLCBidWYpOworCSAgICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgICAgaWYgKChidWYgPSBxZW11X29wdF9nZXQob3B0cywgIm1lZGlhIikpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAiZGlzayIpKSB7CisJICAgIG1lZGlhID0gTUVESUFfRElTSzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiY2Ryb20iKSkgeworICAgICAgICAgICAgaWYgKGN5bHMgfHwgc2VjcyB8fCBoZWFkcykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgInFlbXU6ICclcycgaW52YWxpZCBwaHlzaWNhbCBDSFMgZm9ybWF0XG4iLCBidWYpOworCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisJICAgIG1lZGlhID0gTUVESUFfQ0RST007CisJfSBlbHNlIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgbWVkaWFcbiIsIGJ1Zik7CisJICAgIHJldHVybiBOVUxMOworCX0KKyAgICB9CisKKyAgICBpZiAoKGJ1ZiA9IHFlbXVfb3B0X2dldChvcHRzLCAiY2FjaGUiKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChidWYsICJvZmYiKSB8fCAhc3RyY21wKGJ1ZiwgIm5vbmUiKSkgeworICAgICAgICAgICAgYmRydl9mbGFncyB8PSBCRFJWX09fTk9DQUNIRTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgIndyaXRlYmFjayIpKSB7CisgICAgICAgICAgICBiZHJ2X2ZsYWdzIHw9IEJEUlZfT19DQUNIRV9XQjsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInVuc2FmZSIpKSB7CisgICAgICAgICAgICBiZHJ2X2ZsYWdzIHw9IEJEUlZfT19DQUNIRV9XQjsKKyAgICAgICAgICAgIGJkcnZfZmxhZ3MgfD0gQkRSVl9PX05PX0ZMVVNIOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAid3JpdGV0aHJvdWdoIikpIHsKKyAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGRlZmF1bHQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBpbnZhbGlkIGNhY2hlIG9wdGlvblxuIik7CisgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgQ09ORklHX0xJTlVYX0FJTworICAgIGlmICgoYnVmID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJhaW8iKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChidWYsICJuYXRpdmUiKSkgeworICAgICAgICAgICAgYmRydl9mbGFncyB8PSBCRFJWX09fTkFUSVZFX0FJTzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInRocmVhZHMiKSkgeworICAgICAgICAgICAgLyogdGhpcyBpcyB0aGUgZGVmYXVsdCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGludmFsaWQgYWlvIG9wdGlvblxuIik7CisgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKGJ1ZiA9IHFlbXVfb3B0X2dldChvcHRzLCAiZm9ybWF0IikpICE9IE5VTEwpIHsKKyAgICAgICBpZiAoc3RyY21wKGJ1ZiwgIj8iKSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IFN1cHBvcnRlZCBmb3JtYXRzOiIpOworICAgICAgICAgICAgYmRydl9pdGVyYXRlX2Zvcm1hdChiZHJ2X2Zvcm1hdF9wcmludCwgTlVMTCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRydiA9IGJkcnZfZmluZF93aGl0ZWxpc3RlZF9mb3JtYXQoYnVmKTsKKyAgICAgICAgaWYgKCFkcnYpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIGZvcm1hdFxuIiwgYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgb25fd3JpdGVfZXJyb3IgPSBCTE9DS19FUlJfU1RPUF9FTk9TUEM7CisgICAgaWYgKChidWYgPSBxZW11X29wdF9nZXQob3B0cywgIndlcnJvciIpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmICh0eXBlICE9IElGX0lERSAmJiB0eXBlICE9IElGX1NDU0kgJiYgdHlwZSAhPSBJRl9WSVJUSU8gJiYgdHlwZSAhPSBJRl9OT05FKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndlcnJvciBpcyBubyBzdXBwb3J0ZWQgYnkgdGhpcyBmb3JtYXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvbl93cml0ZV9lcnJvciA9IHBhcnNlX2Jsb2NrX2Vycm9yX2FjdGlvbihidWYsIDApOworICAgICAgICBpZiAob25fd3JpdGVfZXJyb3IgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9uX3JlYWRfZXJyb3IgPSBCTE9DS19FUlJfUkVQT1JUOworICAgIGlmICgoYnVmID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJyZXJyb3IiKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZSAhPSBJRl9JREUgJiYgdHlwZSAhPSBJRl9WSVJUSU8gJiYgdHlwZSAhPSBJRl9OT05FKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJlcnJvciBpcyBubyBzdXBwb3J0ZWQgYnkgdGhpcyBmb3JtYXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvbl9yZWFkX2Vycm9yID0gcGFyc2VfYmxvY2tfZXJyb3JfYWN0aW9uKGJ1ZiwgMSk7CisgICAgICAgIGlmIChvbl9yZWFkX2Vycm9yIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGRldmFkZHIgPSBxZW11X29wdF9nZXQob3B0cywgImFkZHIiKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZSAhPSBJRl9WSVJUSU8pIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWRkciBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY29tcHV0ZSBidXMgYW5kIHVuaXQgYWNjb3JkaW5nIGluZGV4ICovCisKKyAgICBpZiAoaW5kZXggIT0gLTEpIHsKKyAgICAgICAgaWYgKGJ1c19pZCAhPSAwIHx8IHVuaXRfaWQgIT0gLTEpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAicWVtdTogaW5kZXggY2Fubm90IGJlIHVzZWQgd2l0aCBidXMgYW5kIHVuaXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heF9kZXZzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaXRfaWQgPSBpbmRleDsKKyAgICAgICAgICAgIGJ1c19pZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bml0X2lkID0gaW5kZXggJSBtYXhfZGV2czsKKyAgICAgICAgICAgIGJ1c19pZCA9IGluZGV4IC8gbWF4X2RldnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSBhIHVuaXRfaWQsCisgICAgICogdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGZyZWUKKyAgICAgKi8KKworICAgIGlmICh1bml0X2lkID09IC0xKSB7CisgICAgICAgdW5pdF9pZCA9IDA7CisgICAgICAgd2hpbGUgKGRyaXZlX2dldCh0eXBlLCBidXNfaWQsIHVuaXRfaWQpICE9IE5VTEwpIHsKKyAgICAgICAgICAgdW5pdF9pZCsrOworICAgICAgICAgICBpZiAobWF4X2RldnMgJiYgdW5pdF9pZCA+PSBtYXhfZGV2cykgeworICAgICAgICAgICAgICAgdW5pdF9pZCAtPSBtYXhfZGV2czsKKyAgICAgICAgICAgICAgIGJ1c19pZCsrOworICAgICAgICAgICB9CisgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIHVuaXQgaWQgKi8KKworICAgIGlmIChtYXhfZGV2cyAmJiB1bml0X2lkID49IG1heF9kZXZzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogdW5pdCAlZCB0b28gYmlnIChtYXggaXMgJWQpXG4iLAorICAgICAgICAgICAgICAgIHVuaXRfaWQsIG1heF9kZXZzIC0gMSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogaWdub3JlIG11bHRpcGxlIGRlZmluaXRpb25zCisgICAgICovCisKKyAgICBpZiAoZHJpdmVfZ2V0KHR5cGUsIGJ1c19pZCwgdW5pdF9pZCkgIT0gTlVMTCkgeworICAgICAgICAqZmF0YWxfZXJyb3IgPSAwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBpbml0ICovCisKKyAgICBkaW5mbyA9IGdfbWFsbG9jMChzaXplb2YoKmRpbmZvKSk7CisgICAgaWYgKChidWYgPSBxZW11X29wdHNfaWQob3B0cykpICE9IE5VTEwpIHsKKyAgICAgICAgZGluZm8tPmlkID0gZ19zdHJkdXAoYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBubyBpZCBzdXBwbGllZCAtPiBjcmVhdGUgb25lICovCisgICAgICAgIGRpbmZvLT5pZCA9IGdfbWFsbG9jMCgzMik7CisgICAgICAgIGlmICh0eXBlID09IElGX0lERSB8fCB0eXBlID09IElGX1NDU0kpCisgICAgICAgICAgICBtZWRpYXN0ciA9IChtZWRpYSA9PSBNRURJQV9DRFJPTSkgPyAiLWNkIiA6ICItaGQiOworICAgICAgICBpZiAobWF4X2RldnMpCisgICAgICAgICAgICBzbnByaW50ZihkaW5mby0+aWQsIDMyLCAiJXMlaSVzJWkiLAorICAgICAgICAgICAgICAgICAgICAgZGV2bmFtZSwgYnVzX2lkLCBtZWRpYXN0ciwgdW5pdF9pZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNucHJpbnRmKGRpbmZvLT5pZCwgMzIsICIlcyVzJWkiLAorICAgICAgICAgICAgICAgICAgICAgZGV2bmFtZSwgbWVkaWFzdHIsIHVuaXRfaWQpOworICAgIH0KKyAgICBkaW5mby0+YmRydiA9IGJkcnZfbmV3KGRpbmZvLT5pZCk7CisgICAgZGluZm8tPmRldmFkZHIgPSBkZXZhZGRyOworICAgIGRpbmZvLT50eXBlID0gdHlwZTsKKyAgICBkaW5mby0+YnVzID0gYnVzX2lkOworICAgIGRpbmZvLT51bml0ID0gdW5pdF9pZDsKKyAgICBkaW5mby0+b3B0cyA9IG9wdHM7CisgICAgaWYgKHNlcmlhbCkKKyAgICAgICAgc3RybmNweShkaW5mby0+c2VyaWFsLCBzZXJpYWwsIHNpemVvZihkaW5mby0+c2VyaWFsKSAtIDEpOworICAgIFFUQUlMUV9JTlNFUlRfVEFJTCgmZHJpdmVzLCBkaW5mbywgbmV4dCk7CisKKyAgICBiZHJ2X3NldF9vbl9lcnJvcihkaW5mby0+YmRydiwgb25fcmVhZF9lcnJvciwgb25fd3JpdGVfZXJyb3IpOworCisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIElGX0lERToKKyAgICBjYXNlIElGX1NDU0k6CisgICAgY2FzZSBJRl9YRU46CisgICAgY2FzZSBJRl9OT05FOgorICAgICAgICBzd2l0Y2gobWVkaWEpIHsKKwljYXNlIE1FRElBX0RJU0s6CisgICAgICAgICAgICBpZiAoY3lscyAhPSAwKSB7CisgICAgICAgICAgICAgICAgYmRydl9zZXRfZ2VvbWV0cnlfaGludChkaW5mby0+YmRydiwgY3lscywgaGVhZHMsIHNlY3MpOworICAgICAgICAgICAgICAgIGJkcnZfc2V0X3RyYW5zbGF0aW9uX2hpbnQoZGluZm8tPmJkcnYsIHRyYW5zbGF0aW9uKTsKKyAgICAgICAgICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBNRURJQV9DRFJPTToKKyAgICAgICAgICAgIGJkcnZfc2V0X3R5cGVfaGludChkaW5mby0+YmRydiwgQkRSVl9UWVBFX0NEUk9NKTsKKwkgICAgYnJlYWs7CisJfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIElGX1NEOgorICAgICAgICAvKiBGSVhNRTogVGhpcyBpc24ndCByZWFsbHkgYSBmbG9wcHksIGJ1dCBpdCdzIGEgcmVhc29uYWJsZQorICAgICAgICAgICBhcHByb3hpbWF0aW9uLiAgKi8KKyAgICBjYXNlIElGX0ZMT1BQWToKKyAgICAgICAgYmRydl9zZXRfdHlwZV9oaW50KGRpbmZvLT5iZHJ2LCBCRFJWX1RZUEVfRkxPUFBZKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRl9QRkxBU0g6CisgICAgY2FzZSBJRl9NVEQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUZfVklSVElPOgorICAgICAgICAvKiBhZGQgdmlydGlvIGJsb2NrIGRldmljZSAqLworICAgICAgICBvcHRzID0gcWVtdV9vcHRzX2NyZWF0ZShxZW11X2ZpbmRfb3B0cygiZGV2aWNlIiksIE5VTEwsIDApOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImRyaXZlciIsICJ2aXJ0aW8tYmxrLXBjaSIpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImRyaXZlIiwgZGluZm8tPmlkKTsKKyAgICAgICAgaWYgKGRldmFkZHIpCisgICAgICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImFkZHIiLCBkZXZhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRl9DT1VOVDoKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgaWYgKCFmaWxlIHx8ICEqZmlsZSkgeworICAgICAgICAqZmF0YWxfZXJyb3IgPSAwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNuYXBzaG90KSB7CisgICAgICAgIC8qIGFsd2F5cyB1c2UgY2FjaGU9dW5zYWZlIHdpdGggc25hcHNob3QgKi8KKyAgICAgICAgYmRydl9mbGFncyAmPSB+QkRSVl9PX0NBQ0hFX01BU0s7CisgICAgICAgIGJkcnZfZmxhZ3MgfD0gKEJEUlZfT19TTkFQU0hPVHxCRFJWX09fQ0FDSEVfV0J8QkRSVl9PX05PX0ZMVVNIKTsKKyAgICB9CisKKyAgICBpZiAobWVkaWEgPT0gTUVESUFfQ0RST00pIHsKKyAgICAgICAgLyogQ0RST00gaXMgZmluZSBmb3IgYW55IGludGVyZmFjZSwgZG9uJ3QgY2hlY2suICAqLworICAgICAgICBybyA9IDE7CisgICAgfSBlbHNlIGlmIChybyA9PSAxKSB7CisgICAgICAgIGlmICh0eXBlICE9IElGX1NDU0kgJiYgdHlwZSAhPSBJRl9WSVJUSU8gJiYgdHlwZSAhPSBJRl9GTE9QUFkgJiYgdHlwZSAhPSBJRl9OT05FKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHJlYWRvbmx5IGZsYWcgbm90IHN1cHBvcnRlZCBmb3IgZHJpdmUgd2l0aCB0aGlzIGludGVyZmFjZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJkcnZfZmxhZ3MgfD0gcm8gPyAwIDogQkRSVl9PX1JEV1I7CisKKyAgICByZXQgPSBiZHJ2X29wZW4oZGluZm8tPmJkcnYsIGZpbGUsIGJkcnZfZmxhZ3MsIGRydik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3Qgb3BlbiBkaXNrIGltYWdlICVzOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIHN0cmVycm9yKC1yZXQpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGJkcnZfa2V5X3JlcXVpcmVkKGRpbmZvLT5iZHJ2KSkKKyAgICAgICAgYXV0b3N0YXJ0ID0gMDsKKyAgICAqZmF0YWxfZXJyb3IgPSAwOworICAgIHJldHVybiBkaW5mbzsKK30KKwordm9pZCBkb19jb21taXQoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QpCit7CisgICAgY29uc3QgY2hhciAqZGV2aWNlID0gcWRpY3RfZ2V0X3N0cihxZGljdCwgImRldmljZSIpOworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAiYWxsIikpIHsKKyAgICAgICAgYmRydl9jb21taXRfYWxsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnMgPSBiZHJ2X2ZpbmQoZGV2aWNlKTsKKyAgICAgICAgaWYgKCFicykgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0RFVklDRV9OT1RfRk9VTkQsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYmRydl9jb21taXQoYnMpOworICAgIH0KK30KKworc3RhdGljIGludCBlamVjdF9kZXZpY2UoTW9uaXRvciAqbW9uLCBCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGZvcmNlKQoreworICAgIGlmICghZm9yY2UpIHsKKyAgICAgICAgaWYgKCFiZHJ2X2lzX3JlbW92YWJsZShicykpIHsKKyAgICAgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9ERVZJQ0VfTk9UX1JFTU9WQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkcnZfZ2V0X2RldmljZV9uYW1lKGJzKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJkcnZfaXNfbG9ja2VkKGJzKSkgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0RFVklDRV9MT0NLRUQsIGJkcnZfZ2V0X2RldmljZV9uYW1lKGJzKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgYmRydl9jbG9zZShicyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBkb19lamVjdChNb25pdG9yICptb24sIGNvbnN0IFFEaWN0ICpxZGljdCwgUU9iamVjdCAqKnJldF9kYXRhKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworICAgIGludCBmb3JjZSA9IHFkaWN0X2dldF90cnlfYm9vbChxZGljdCwgImZvcmNlIiwgMCk7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBxZGljdF9nZXRfc3RyKHFkaWN0LCAiZGV2aWNlIik7CisKKyAgICBicyA9IGJkcnZfZmluZChmaWxlbmFtZSk7CisgICAgaWYgKCFicykgeworICAgICAgICBxZXJyb3JfcmVwb3J0KFFFUlJfREVWSUNFX05PVF9GT1VORCwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBlamVjdF9kZXZpY2UobW9uLCBicywgZm9yY2UpOworfQorCitpbnQgZG9fYmxvY2tfc2V0X3Bhc3N3ZChNb25pdG9yICptb24sIGNvbnN0IFFEaWN0ICpxZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFFPYmplY3QgKipyZXRfZGF0YSkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKyAgICBpbnQgZXJyOworCisgICAgYnMgPSBiZHJ2X2ZpbmQocWRpY3RfZ2V0X3N0cihxZGljdCwgImRldmljZSIpKTsKKyAgICBpZiAoIWJzKSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9ERVZJQ0VfTk9UX0ZPVU5ELCBxZGljdF9nZXRfc3RyKHFkaWN0LCAiZGV2aWNlIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZXJyID0gYmRydl9zZXRfa2V5KGJzLCBxZGljdF9nZXRfc3RyKHFkaWN0LCAicGFzc3dvcmQiKSk7CisgICAgaWYgKGVyciA9PSAtRUlOVkFMKSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9ERVZJQ0VfTk9UX0VOQ1JZUFRFRCwgYmRydl9nZXRfZGV2aWNlX25hbWUoYnMpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoZXJyIDwgMCkgeworICAgICAgICBxZXJyb3JfcmVwb3J0KFFFUlJfSU5WQUxJRF9QQVNTV09SRCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorLy8gTW9uaXRvciBzdXBwb3J0IGRpc2FibGVkIG9uIEFuZHJvaWQuCitpbnQgZG9fY2hhbmdlX2Jsb2NrKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZm10KQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworICAgIEJsb2NrRHJpdmVyICpkcnYgPSBOVUxMOworICAgIGludCBiZHJ2X2ZsYWdzOworCisgICAgYnMgPSBiZHJ2X2ZpbmQoZGV2aWNlKTsKKyAgICBpZiAoIWJzKSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9ERVZJQ0VfTk9UX0ZPVU5ELCBkZXZpY2UpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChmbXQpIHsKKyAgICAgICAgZHJ2ID0gYmRydl9maW5kX3doaXRlbGlzdGVkX2Zvcm1hdChmbXQpOworICAgICAgICBpZiAoIWRydikgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfQkxPQ0tfRk9STUFULCBmbXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlamVjdF9kZXZpY2UobW9uLCBicywgMCkgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYmRydl9mbGFncyA9IGJkcnZfaXNfcmVhZF9vbmx5KGJzKSA/IDAgOiBCRFJWX09fUkRXUjsKKyAgICBiZHJ2X2ZsYWdzIHw9IGJkcnZfaXNfc25hcHNob3QoYnMpID8gQkRSVl9PX1NOQVBTSE9UIDogMDsKKyAgICBpZiAoYmRydl9vcGVuKGJzLCBmaWxlbmFtZSwgYmRydl9mbGFncywgZHJ2KSA8IDApIHsKKyAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lPX0VSUk9SKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbW9uaXRvcl9yZWFkX2JkcnZfa2V5X3N0YXJ0KG1vbiwgYnMsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2J1ZmZlcmVkX2ZpbGUuYyBiL2FuZHJvaWQvcWVtdTEvYnVmZmVyZWRfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTM4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2J1ZmZlcmVkX2ZpbGUuYwpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIFFFTVUgYnVmZmVyZWQgUUVNVUZpbGUKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAiYnVmZmVyZWRfZmlsZS5oIgorCisvLyNkZWZpbmUgREVCVUdfQlVGRkVSRURfRklMRQorCit0eXBlZGVmIHN0cnVjdCBRRU1VRmlsZUJ1ZmZlcmVkCit7CisgICAgQnVmZmVyZWRQdXRGdW5jICpwdXRfYnVmZmVyOworICAgIEJ1ZmZlcmVkUHV0UmVhZHlGdW5jICpwdXRfcmVhZHk7CisgICAgQnVmZmVyZWRXYWl0Rm9yVW5mcmVlemVGdW5jICp3YWl0X2Zvcl91bmZyZWV6ZTsKKyAgICBCdWZmZXJlZENsb3NlRnVuYyAqY2xvc2U7CisgICAgdm9pZCAqb3BhcXVlOworICAgIFFFTVVGaWxlICpmaWxlOworICAgIGludCBoYXNfZXJyb3I7CisgICAgaW50IGZyZWV6ZV9vdXRwdXQ7CisgICAgc2l6ZV90IGJ5dGVzX3hmZXI7CisgICAgc2l6ZV90IHhmZXJfbGltaXQ7CisgICAgdWludDhfdCAqYnVmZmVyOworICAgIHNpemVfdCBidWZmZXJfc2l6ZTsKKyAgICBzaXplX3QgYnVmZmVyX2NhcGFjaXR5OworICAgIFFFTVVUaW1lciAqdGltZXI7Cit9IFFFTVVGaWxlQnVmZmVyZWQ7CisKKyNpZmRlZiBERUJVR19CVUZGRVJFRF9GSUxFCisjZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIFwKKyAgICBkbyB7IHByaW50ZigiYnVmZmVyZWQtZmlsZTogIiBmbXQsICMjIF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERQUklOVEYoZm10LCAuLi4pIFwKKyAgICBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgYnVmZmVyZWRfYXBwZW5kKFFFTVVGaWxlQnVmZmVyZWQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpZiAoc2l6ZSA+IChzLT5idWZmZXJfY2FwYWNpdHkgLSBzLT5idWZmZXJfc2l6ZSkpIHsKKyAgICAgICAgdm9pZCAqdG1wOworCisgICAgICAgIERQUklOVEYoImluY3JlYXNpbmcgYnVmZmVyIGNhcGFjaXR5IGZyb20gJXp1IGJ5ICV6dVxuIiwKKyAgICAgICAgICAgICAgICBzLT5idWZmZXJfY2FwYWNpdHksIHNpemUgKyAxMDI0KTsKKworICAgICAgICBzLT5idWZmZXJfY2FwYWNpdHkgKz0gc2l6ZSArIDEwMjQ7CisKKyAgICAgICAgdG1wID0gZ19yZWFsbG9jKHMtPmJ1ZmZlciwgcy0+YnVmZmVyX2NhcGFjaXR5KTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXUgZmlsZSBidWZmZXIgZXhwYW5zaW9uIGZhaWxlZFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgcy0+YnVmZmVyID0gdG1wOworICAgIH0KKworICAgIG1lbWNweShzLT5idWZmZXIgKyBzLT5idWZmZXJfc2l6ZSwgYnVmLCBzaXplKTsKKyAgICBzLT5idWZmZXJfc2l6ZSArPSBzaXplOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJlZF9mbHVzaChRRU1VRmlsZUJ1ZmZlcmVkICpzKQoreworICAgIHNpemVfdCBvZmZzZXQgPSAwOworCisgICAgaWYgKHMtPmhhc19lcnJvcikgeworICAgICAgICBEUFJJTlRGKCJmbHVzaCB3aGVuIGVycm9yLCBiYWlsaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERQUklOVEYoImZsdXNoaW5nICV6dSBieXRlKHMpIG9mIGRhdGFcbiIsIHMtPmJ1ZmZlcl9zaXplKTsKKworICAgIHdoaWxlIChvZmZzZXQgPCBzLT5idWZmZXJfc2l6ZSkgeworICAgICAgICBzc2l6ZV90IHJldDsKKworICAgICAgICByZXQgPSBzLT5wdXRfYnVmZmVyKHMtPm9wYXF1ZSwgcy0+YnVmZmVyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplIC0gb2Zmc2V0KTsKKyAgICAgICAgaWYgKHJldCA9PSAtRUFHQUlOKSB7CisgICAgICAgICAgICBEUFJJTlRGKCJiYWNrZW5kIG5vdCByZWFkeSwgZnJlZXppbmdcbiIpOworICAgICAgICAgICAgcy0+ZnJlZXplX291dHB1dCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgRFBSSU5URigiZXJyb3IgZmx1c2hpbmcgZGF0YSwgJXpkXG4iLCByZXQpOworICAgICAgICAgICAgcy0+aGFzX2Vycm9yID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRFBSSU5URigiZmx1c2hlZCAlemQgYnl0ZShzKVxuIiwgcmV0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEUFJJTlRGKCJmbHVzaGVkICV6dSBvZiAlenUgYnl0ZShzKVxuIiwgb2Zmc2V0LCBzLT5idWZmZXJfc2l6ZSk7CisgICAgbWVtbW92ZShzLT5idWZmZXIsIHMtPmJ1ZmZlciArIG9mZnNldCwgcy0+YnVmZmVyX3NpemUgLSBvZmZzZXQpOworICAgIHMtPmJ1ZmZlcl9zaXplIC09IG9mZnNldDsKK30KKworc3RhdGljIGludCBidWZmZXJlZF9wdXRfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQ2NF90IHBvcywgaW50IHNpemUpCit7CisgICAgUUVNVUZpbGVCdWZmZXJlZCAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBzc2l6ZV90IHJldDsKKworICAgIERQUklOVEYoInB1dHRpbmcgJWQgYnl0ZXMgYXQgJSIgUFJJZDY0ICJcbiIsIHNpemUsIHBvcyk7CisKKyAgICBpZiAocy0+aGFzX2Vycm9yKSB7CisgICAgICAgIERQUklOVEYoImZsdXNoIHdoZW4gZXJyb3IsIGJhaWxpbmdcbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEUFJJTlRGKCJ1bmZyZWV6aW5nIG91dHB1dFxuIik7CisgICAgcy0+ZnJlZXplX291dHB1dCA9IDA7CisKKyAgICBidWZmZXJlZF9mbHVzaChzKTsKKworICAgIHdoaWxlICghcy0+ZnJlZXplX291dHB1dCAmJiBvZmZzZXQgPCBzaXplKSB7CisgICAgICAgIGlmIChzLT5ieXRlc194ZmVyID4gcy0+eGZlcl9saW1pdCkgeworICAgICAgICAgICAgRFBSSU5URigidHJhbnNmZXIgbGltaXQgZXhjZWVkZWQgd2hlbiBwdXR0aW5nXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcy0+cHV0X2J1ZmZlcihzLT5vcGFxdWUsIGJ1ZiArIG9mZnNldCwgc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIGlmIChyZXQgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgRFBSSU5URigiYmFja2VuZCBub3QgcmVhZHksIGZyZWV6aW5nXG4iKTsKKyAgICAgICAgICAgIHMtPmZyZWV6ZV9vdXRwdXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0IDw9IDApIHsKKyAgICAgICAgICAgIERQUklOVEYoImVycm9yIHB1dHRpbmdcbiIpOworICAgICAgICAgICAgcy0+aGFzX2Vycm9yID0gMTsKKyAgICAgICAgICAgIG9mZnNldCA9IC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIERQUklOVEYoInB1dCAlemQgYnl0ZShzKVxuIiwgcmV0KTsKKyAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgcy0+Ynl0ZXNfeGZlciArPSByZXQ7CisgICAgfQorCisgICAgaWYgKG9mZnNldCA+PSAwKSB7CisgICAgICAgIERQUklOVEYoImJ1ZmZlcmluZyAlZCBieXRlc1xuIiwgc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIGJ1ZmZlcmVkX2FwcGVuZChzLCBidWYgKyBvZmZzZXQsIHNpemUgLSBvZmZzZXQpOworICAgICAgICBvZmZzZXQgPSBzaXplOworICAgIH0KKworICAgIGlmIChwb3MgPT0gMCAmJiBzaXplID09IDApIHsKKyAgICAgICAgRFBSSU5URigiZmlsZSBpcyByZWFkeVxuIik7CisgICAgICAgIGlmIChzLT5ieXRlc194ZmVyIDw9IHMtPnhmZXJfbGltaXQpIHsKKyAgICAgICAgICAgIERQUklOVEYoIm5vdGlmeWluZyBjbGllbnRcbiIpOworICAgICAgICAgICAgcy0+cHV0X3JlYWR5KHMtPm9wYXF1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IGJ1ZmZlcmVkX2Nsb3NlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VRmlsZUJ1ZmZlcmVkICpzID0gb3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICBEUFJJTlRGKCJjbG9zaW5nXG4iKTsKKworICAgIHdoaWxlICghcy0+aGFzX2Vycm9yICYmIHMtPmJ1ZmZlcl9zaXplKSB7CisgICAgICAgIGJ1ZmZlcmVkX2ZsdXNoKHMpOworICAgICAgICBpZiAocy0+ZnJlZXplX291dHB1dCkKKyAgICAgICAgICAgIHMtPndhaXRfZm9yX3VuZnJlZXplKHMpOworICAgIH0KKworICAgIHJldCA9IHMtPmNsb3NlKHMtPm9wYXF1ZSk7CisKKyAgICB0aW1lcl9kZWwocy0+dGltZXIpOworICAgIHRpbWVyX2ZyZWUocy0+dGltZXIpOworICAgIGdfZnJlZShzLT5idWZmZXIpOworICAgIGdfZnJlZShzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyZWRfcmF0ZV9saW1pdCh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVCdWZmZXJlZCAqcyA9IG9wYXF1ZTsKKworICAgIGlmIChzLT5oYXNfZXJyb3IpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHMtPmZyZWV6ZV9vdXRwdXQpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKHMtPmJ5dGVzX3hmZXIgPiBzLT54ZmVyX2xpbWl0KQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCBidWZmZXJlZF9zZXRfcmF0ZV9saW1pdCh2b2lkICpvcGFxdWUsIGludDY0X3QgbmV3X3JhdGUpCit7CisgICAgUUVNVUZpbGVCdWZmZXJlZCAqcyA9IG9wYXF1ZTsKKyAgICBpZiAocy0+aGFzX2Vycm9yKQorICAgICAgICBnb3RvIG91dDsKKworICAgIGlmIChuZXdfcmF0ZSA+IFNJWkVfTUFYKSB7CisgICAgICAgIG5ld19yYXRlID0gU0laRV9NQVg7CisgICAgfQorCisgICAgcy0+eGZlcl9saW1pdCA9IG5ld19yYXRlIC8gMTA7CisKK291dDoKKyAgICByZXR1cm4gcy0+eGZlcl9saW1pdDsKK30KKworc3RhdGljIGludDY0X3QgYnVmZmVyZWRfZ2V0X3JhdGVfbGltaXQodm9pZCAqb3BhcXVlKQoreworICAgIFFFTVVGaWxlQnVmZmVyZWQgKnMgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gcy0+eGZlcl9saW1pdDsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyZWRfcmF0ZV90aWNrKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VRmlsZUJ1ZmZlcmVkICpzID0gb3BhcXVlOworCisgICAgaWYgKHMtPmhhc19lcnJvcikgeworICAgICAgICBidWZmZXJlZF9jbG9zZShzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRpbWVyX21vZChzLT50aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkgKyAxMDApOworCisgICAgaWYgKHMtPmZyZWV6ZV9vdXRwdXQpCisgICAgICAgIHJldHVybjsKKworICAgIHMtPmJ5dGVzX3hmZXIgPSAwOworCisgICAgYnVmZmVyZWRfZmx1c2gocyk7CisKKyAgICAvKiBBZGQgc29tZSBjaGVja3MgYXJvdW5kIHRoaXMgKi8KKyAgICBzLT5wdXRfcmVhZHkocy0+b3BhcXVlKTsKK30KKworc3RhdGljIGNvbnN0IFFFTVVGaWxlT3BzIGJ1ZmZlcmVkX2ZpbGVfb3BzID0geworICAgIC5wdXRfYnVmZmVyID0gYnVmZmVyZWRfcHV0X2J1ZmZlciwKKyAgICAuY2xvc2UgPSBidWZmZXJlZF9jbG9zZSwKKyAgICAucmF0ZV9saW1pdCA9IGJ1ZmZlcmVkX3JhdGVfbGltaXQsCisgICAgLnNldF9yYXRlX2xpbWl0ID0gYnVmZmVyZWRfc2V0X3JhdGVfbGltaXQsCisgICAgLmdldF9yYXRlX2xpbWl0ID0gYnVmZmVyZWRfZ2V0X3JhdGVfbGltaXQsCit9OworCitRRU1VRmlsZSAqcWVtdV9mb3Blbl9vcHNfYnVmZmVyZWQodm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc19wZXJfc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUHV0RnVuYyAqcHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFB1dFJlYWR5RnVuYyAqcHV0X3JlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV2FpdEZvclVuZnJlZXplRnVuYyAqd2FpdF9mb3JfdW5mcmVlemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRDbG9zZUZ1bmMgKmNsb3NlKQoreworICAgIFFFTVVGaWxlQnVmZmVyZWQgKnM7CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZigqcykpOworCisgICAgcy0+b3BhcXVlID0gb3BhcXVlOworICAgIHMtPnhmZXJfbGltaXQgPSBieXRlc19wZXJfc2VjIC8gMTA7CisgICAgcy0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7CisgICAgcy0+cHV0X3JlYWR5ID0gcHV0X3JlYWR5OworICAgIHMtPndhaXRfZm9yX3VuZnJlZXplID0gd2FpdF9mb3JfdW5mcmVlemU7CisgICAgcy0+Y2xvc2UgPSBjbG9zZTsKKworICAgIHMtPmZpbGUgPSBxZW11X2ZvcGVuX29wcyhzLCAmYnVmZmVyZWRfZmlsZV9vcHMpOworICAgIHMtPnRpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfUkVBTFRJTUUsIFNDQUxFX01TLCBidWZmZXJlZF9yYXRlX3RpY2ssIHMpOworCisgICAgdGltZXJfbW9kKHMtPnRpbWVyLCBxZW11X2Nsb2NrX2dldF9tcyhRRU1VX0NMT0NLX1JFQUxUSU1FKSArIDEwMCk7CisKKyAgICByZXR1cm4gcy0+ZmlsZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvYnVmZmVyZWRfZmlsZS5oIGIvYW5kcm9pZC9xZW11MS9idWZmZXJlZF9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkMzU4YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvYnVmZmVyZWRfZmlsZS5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBRRU1VIGJ1ZmZlcmVkIFFFTVVGaWxlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOAorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFFTVVfQlVGRkVSRURfRklMRV9ICisjZGVmaW5lIFFFTVVfQlVGRkVSRURfRklMRV9ICisKKyNpbmNsdWRlICJody9ody5oIgorCit0eXBlZGVmIHNzaXplX3QgKEJ1ZmZlcmVkUHV0RnVuYykodm9pZCAqb3BhcXVlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKEJ1ZmZlcmVkUHV0UmVhZHlGdW5jKSh2b2lkICpvcGFxdWUpOwordHlwZWRlZiB2b2lkIChCdWZmZXJlZFdhaXRGb3JVbmZyZWV6ZUZ1bmMpKHZvaWQgKm9wYXF1ZSk7Cit0eXBlZGVmIGludCAoQnVmZmVyZWRDbG9zZUZ1bmMpKHZvaWQgKm9wYXF1ZSk7CisKK1FFTVVGaWxlICpxZW11X2ZvcGVuX29wc19idWZmZXJlZCh2b2lkICpvcGFxdWUsIHNpemVfdCB4ZmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUHV0RnVuYyAqcHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFB1dFJlYWR5RnVuYyAqcHV0X3JlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV2FpdEZvclVuZnJlZXplRnVuYyAqd2FpdF9mb3JfdW5mcmVlemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRDbG9zZUZ1bmMgKmNsb3NlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2NvZGUtcHJvZmlsZS5jIGIvYW5kcm9pZC9xZW11MS9jb2RlLXByb2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTc3ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9jb2RlLXByb2ZpbGUuYwpAQCAtMCwwICsxLDIyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJleGVjL2NvZGUtcHJvZmlsZS5oIgorCisvLyBJTVBPUlRBTlQ6IEluaXRpYWxpemVycyBhcmUgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlc2UKKy8vIHZhcmlhYmxlcyBhcmUgcHJvcGVybHkgbGlua2VkIGludG8gdGhlIGZpbmFsIGV4ZWN1dGFibGVzIG9uCisvLyBEYXJ3aW4uIE90aGVyd2lzZSwgdGhlIGJ1aWxkIHdpbGwgc3VjY2VlZCwgYnV0IHRyeWluZyB0byBydW4KKy8vIGEgcHJvZ3JhbSB3aWxsIHJlc3VsdCBpbiBhIGR5bGQgZmFpbHVyZS4KKy8vCitDb2RlUHJvZmlsZVJlY29yZEZ1bmMgY29kZV9wcm9maWxlX3JlY29yZF9mdW5jID0gTlVMTDsKKworY29uc3QgY2hhciAqY29kZV9wcm9maWxlX2Rpcm5hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9jcHUtZXhlYy5jIGIvYW5kcm9pZC9xZW11MS9jcHUtZXhlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTdkODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2NwdS1leGVjLmMKQEAgLTAsMCArMSwxMjY0IEBACisvKgorICogIGkzODYgZW11bGF0b3IgbWFpbiBleGVjdXRpb24gbG9vcAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJkaXNhcy9kaXNhcy5oIgorI2luY2x1ZGUgInRjZy5oIgorI2luY2x1ZGUgInN5c2VtdS9rdm0uaCIKKyNpbmNsdWRlICJleGVjL2hheC5oIgorI2luY2x1ZGUgInFlbXUvYXRvbWljLmgiCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU09GVE1NVSkKKyN1bmRlZiBFQVgKKyN1bmRlZiBFQ1gKKyN1bmRlZiBFRFgKKyN1bmRlZiBFQlgKKyN1bmRlZiBFU1AKKyN1bmRlZiBFQlAKKyN1bmRlZiBFU0kKKyN1bmRlZiBFREkKKyN1bmRlZiBFSVAKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzeXMvdWNvbnRleHQuaD4KKyNlbmRpZgorI2VuZGlmCisKKy8vI2RlZmluZSBDT05GSUdfREVCVUdfRVhFQworLy8jZGVmaW5lIERFQlVHX1NJR05BTAorCitib29sIHFlbXVfY3B1X2hhc193b3JrKENQVVN0YXRlICpjcHUpCit7CisgICAgcmV0dXJuIGNwdV9oYXNfd29yayhjcHUpOworfQorCit2b2lkIGNwdV9sb29wX2V4aXQoQ1BVQXJjaFN0YXRlKiBlbnYpCit7CisgICAgZW52LT5jdXJyZW50X3RiID0gTlVMTDsKKyAgICBsb25nam1wKGVudi0+am1wX2VudiwgMSk7Cit9CisKKy8qIGV4aXQgdGhlIGN1cnJlbnQgVEIgZnJvbSBhIHNpZ25hbCBoYW5kbGVyLiBUaGUgaG9zdCByZWdpc3RlcnMgYXJlCisgICByZXN0b3JlZCBpbiBhIHN0YXRlIGNvbXBhdGlibGUgd2l0aCB0aGUgQ1BVIGVtdWxhdG9yCisgKi8KK3ZvaWQgY3B1X3Jlc3VtZV9mcm9tX3NpZ25hbChDUFVBcmNoU3RhdGUgKmVudiwgdm9pZCAqcHVjKQoreworI2lmICFkZWZpbmVkKENPTkZJR19TT0ZUTU1VKQorI2lmZGVmIF9fbGludXhfXworICAgIHN0cnVjdCB1Y29udGV4dCAqdWMgPSBwdWM7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAgIHN0cnVjdCBzaWdjb250ZXh0ICp1YyA9IHB1YzsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBYWFg6IHJlc3RvcmUgY3B1IHJlZ2lzdGVycyBzYXZlZCBpbiBob3N0IHJlZ2lzdGVycyAqLworCisjaWYgIWRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisgICAgaWYgKHB1YykgeworICAgICAgICAvKiBYWFg6IHVzZSBzaWdsb25nam1wID8gKi8KKyNpZmRlZiBfX2xpbnV4X18KKyNpZmRlZiBfX2lhNjQKKyAgICAgICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIChzaWdzZXRfdCAqKSZ1Yy0+dWNfc2lnbWFzaywgTlVMTCk7CisjZWxzZQorICAgICAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnVjLT51Y19zaWdtYXNrLCBOVUxMKTsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgICAgICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZ1Yy0+c2NfbWFzaywgTlVMTCk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IC0xOworICAgIGxvbmdqbXAoZW52LT5qbXBfZW52LCAxKTsKK30KKworLyogRXhlY3V0ZSB0aGUgY29kZSB3aXRob3V0IGNhY2hpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLiBBbiBpbnRlcnByZXRlcgorICAgY291bGQgYmUgdXNlZCBpZiBhdmFpbGFibGUuICovCitzdGF0aWMgdm9pZCBjcHVfZXhlY19ub2NhY2hlKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgbWF4X2N5Y2xlcywgVHJhbnNsYXRpb25CbG9jayAqb3JpZ190YikKK3sKKyAgICB0Y2dfdGFyZ2V0X3Vsb25nIG5leHRfdGI7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGI7CisKKyAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLgorICAgICAgIFdlIG9ubHkgZW5kIHVwIGhlcmUgd2hlbiBhbiBleGlzdGluZyBUQiBpcyB0b28gbG9uZy4gICovCisgICAgaWYgKG1heF9jeWNsZXMgPiBDRl9DT1VOVF9NQVNLKQorICAgICAgICBtYXhfY3ljbGVzID0gQ0ZfQ09VTlRfTUFTSzsKKworICAgIHRiID0gdGJfZ2VuX2NvZGUoZW52LCBvcmlnX3RiLT5wYywgb3JpZ190Yi0+Y3NfYmFzZSwgb3JpZ190Yi0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBtYXhfY3ljbGVzKTsKKyAgICBlbnYtPmN1cnJlbnRfdGIgPSB0YjsKKyAgICAvKiBleGVjdXRlIHRoZSBnZW5lcmF0ZWQgY29kZSAqLworICAgIG5leHRfdGIgPSB0Y2dfcWVtdV90Yl9leGVjKGVudiwgdGItPnRjX3B0cik7CisgICAgZW52LT5jdXJyZW50X3RiID0gTlVMTDsKKworICAgIGlmICgobmV4dF90YiAmIDMpID09IDIpIHsKKyAgICAgICAgLyogUmVzdG9yZSBQQy4gIFRoaXMgbWF5IGhhcHBlbiBpZiBhc3luYyBldmVudCBvY2N1cnMgYmVmb3JlCisgICAgICAgICAgIHRoZSBUQiBzdGFydHMgZXhlY3V0aW5nLiAgKi8KKyAgICAgICAgY3B1X3BjX2Zyb21fdGIoZW52LCB0Yik7CisgICAgfQorICAgIHRiX3BoeXNfaW52YWxpZGF0ZSh0YiwgLTEpOworICAgIHRiX2ZyZWUodGIpOworfQorCitzdGF0aWMgVHJhbnNsYXRpb25CbG9jayAqdGJfZmluZF9zbG93KENQVUFyY2hTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBjc19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmbGFncykKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YiwgKipwdGIxOworICAgIHVuc2lnbmVkIGludCBoOworICAgIHRhcmdldF91bG9uZyBwaHlzX3BjLCBwaHlzX3BhZ2UxLCBwaHlzX3BhZ2UyLCB2aXJ0X3BhZ2UyOworCisgICAgdGNnX2N0eC50Yl9jdHgudGJfaW52YWxpZGF0ZWRfZmxhZyA9IDA7CisKKyAgICAvKiBmaW5kIHRyYW5zbGF0ZWQgYmxvY2sgdXNpbmcgcGh5c2ljYWwgbWFwcGluZ3MgKi8KKyAgICBwaHlzX3BjID0gZ2V0X3BhZ2VfYWRkcl9jb2RlKGVudiwgcGMpOworICAgIHBoeXNfcGFnZTEgPSBwaHlzX3BjICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICBwaHlzX3BhZ2UyID0gLTE7CisgICAgaCA9IHRiX3BoeXNfaGFzaF9mdW5jKHBoeXNfcGMpOworICAgIHB0YjEgPSAmdGNnX2N0eC50Yl9jdHgudGJfcGh5c19oYXNoW2hdOworICAgIGZvcig7OykgeworICAgICAgICB0YiA9ICpwdGIxOworICAgICAgICBpZiAoIXRiKQorICAgICAgICAgICAgZ290byBub3RfZm91bmQ7CisgICAgICAgIGlmICh0Yi0+cGMgPT0gcGMgJiYKKyAgICAgICAgICAgIHRiLT5wYWdlX2FkZHJbMF0gPT0gcGh5c19wYWdlMSAmJgorICAgICAgICAgICAgdGItPmNzX2Jhc2UgPT0gY3NfYmFzZSAmJgorICAgICAgICAgICAgdGItPmZsYWdzID09IGZsYWdzKSB7CisgICAgICAgICAgICAvKiBjaGVjayBuZXh0IHBhZ2UgaWYgbmVlZGVkICovCisgICAgICAgICAgICBpZiAodGItPnBhZ2VfYWRkclsxXSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHZpcnRfcGFnZTIgPSAocGMgJiBUQVJHRVRfUEFHRV9NQVNLKSArCisgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9QQUdFX1NJWkU7CisgICAgICAgICAgICAgICAgcGh5c19wYWdlMiA9IGdldF9wYWdlX2FkZHJfY29kZShlbnYsIHZpcnRfcGFnZTIpOworICAgICAgICAgICAgICAgIGlmICh0Yi0+cGFnZV9hZGRyWzFdID09IHBoeXNfcGFnZTIpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHRiMSA9ICZ0Yi0+cGh5c19oYXNoX25leHQ7CisgICAgfQorIG5vdF9mb3VuZDoKKyAgIC8qIGlmIG5vIHRyYW5zbGF0ZWQgY29kZSBhdmFpbGFibGUsIHRoZW4gdHJhbnNsYXRlIGl0IG5vdyAqLworICAgIHRiID0gdGJfZ2VuX2NvZGUoZW52LCBwYywgY3NfYmFzZSwgZmxhZ3MsIDApOworCisgZm91bmQ6CisgICAgLyogTW92ZSB0aGUgbGFzdCBmb3VuZCBUQiB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworICAgIGlmIChsaWtlbHkoKnB0YjEpKSB7CisgICAgICAgICpwdGIxID0gdGItPnBoeXNfaGFzaF9uZXh0OworICAgICAgICB0Yi0+cGh5c19oYXNoX25leHQgPSB0Y2dfY3R4LnRiX2N0eC50Yl9waHlzX2hhc2hbaF07CisgICAgICAgIHRjZ19jdHgudGJfY3R4LnRiX3BoeXNfaGFzaFtoXSA9IHRiOworICAgIH0KKyAgICAvKiB3ZSBhZGQgdGhlIFRCIGluIHRoZSB2aXJ0dWFsIHBjIGhhc2ggdGFibGUgKi8KKyAgICBlbnYtPnRiX2ptcF9jYWNoZVt0Yl9qbXBfY2FjaGVfaGFzaF9mdW5jKHBjKV0gPSB0YjsKKyAgICByZXR1cm4gdGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgVHJhbnNsYXRpb25CbG9jayAqdGJfZmluZF9mYXN0KENQVUFyY2hTdGF0ZSAqZW52KQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIHRhcmdldF91bG9uZyBjc19iYXNlLCBwYzsKKyAgICBpbnQgZmxhZ3M7CisKKyAgICAvKiB3ZSByZWNvcmQgYSBzdWJzZXQgb2YgdGhlIENQVSBzdGF0ZS4gSXQgd2lsbAorICAgICAgIGFsd2F5cyBiZSB0aGUgc2FtZSBiZWZvcmUgYSBnaXZlbiB0cmFuc2xhdGVkIGJsb2NrCisgICAgICAgaXMgZXhlY3V0ZWQuICovCisgICAgY3B1X2dldF90Yl9jcHVfc3RhdGUoZW52LCAmcGMsICZjc19iYXNlLCAmZmxhZ3MpOworICAgIHRiID0gZW52LT50Yl9qbXBfY2FjaGVbdGJfam1wX2NhY2hlX2hhc2hfZnVuYyhwYyldOworICAgIGlmICh1bmxpa2VseSghdGIgfHwgdGItPnBjICE9IHBjIHx8IHRiLT5jc19iYXNlICE9IGNzX2Jhc2UgfHwKKyAgICAgICAgICAgICAgICAgdGItPmZsYWdzICE9IGZsYWdzKSkgeworICAgICAgICB0YiA9IHRiX2ZpbmRfc2xvdyhlbnYsIHBjLCBjc19iYXNlLCBmbGFncyk7CisgICAgfQorICAgIHJldHVybiB0YjsKK30KKworc3RhdGljIENQVURlYnVnRXhjcEhhbmRsZXIgKmRlYnVnX2V4Y3BfaGFuZGxlcjsKKwordm9pZCBjcHVfc2V0X2RlYnVnX2V4Y3BfaGFuZGxlcihDUFVEZWJ1Z0V4Y3BIYW5kbGVyICpoYW5kbGVyKQoreworICAgIGRlYnVnX2V4Y3BfaGFuZGxlciA9IGhhbmRsZXI7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9oYW5kbGVfZGVidWdfZXhjZXB0aW9uKENQVU9sZFN0YXRlICplbnYpCit7CisgICAgQ1BVV2F0Y2hwb2ludCAqd3A7CisKKyAgICBpZiAoIWVudi0+d2F0Y2hwb2ludF9oaXQpIHsKKyAgICAgICAgUVRBSUxRX0ZPUkVBQ0god3AsICZlbnYtPndhdGNocG9pbnRzLCBlbnRyeSkgeworICAgICAgICAgICAgd3AtPmZsYWdzICY9IH5CUF9XQVRDSFBPSU5UX0hJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVidWdfZXhjcF9oYW5kbGVyKSB7CisgICAgICAgIGRlYnVnX2V4Y3BfaGFuZGxlcihlbnYpOworICAgIH0KK30KKworLyogbWFpbiBleGVjdXRpb24gbG9vcCAqLworCit2b2xhdGlsZSBzaWdfYXRvbWljX3QgZXhpdF9yZXF1ZXN0OworCisvKgorICogUWVtdSBlbXVsYXRpb24gY2FuIGhhcHBlbiBiZWNhdXNlIG9mIE1NSU8gb3IgZW11bGF0aW9uIG1vZGUsCisgKiBpLmUuIG5vbi1QRyBtb2RlLiAgRm9yIE1NSU8gY2FzZXMsIHRoZSBwZW5kaW5nIGludGVycnVwdCBzaG91bGQgbm90CisgKiBiZSBlbXVsYXRlZCBpbiBxZW11IGJlY2F1c2UgTU1JTyBpcyBlbXVsYXRlZCBmb3Igb25seSBvbmUKKyAqIGluc3RydWN0aW9uIG5vdyBhbmQgdGhlbiBiYWNrIHRvIHRoZSBIQVgga2VybmVsIG1vZHVsZS4KKyAqLworaW50IG5lZWRfaGFuZGxlX2ludHJfcmVxdWVzdChDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworI2lmZGVmIENPTkZJR19IQVgKKyAgICBpZiAoIWhheF9lbmFibGVkKCkgfHwgaGF4X3ZjcHVfZW11bGF0aW9uX21vZGUoY3B1KSkKKyAgICAgICAgcmV0dXJuIGNwdS0+aW50ZXJydXB0X3JlcXVlc3Q7CisgICAgcmV0dXJuIDA7CisjZWxzZQorICAgIHJldHVybiBjcHUtPmludGVycnVwdF9yZXF1ZXN0OworI2VuZGlmCit9CisKK2ludCBjcHVfZXhlYyhDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIGludCByZXQsIGludGVycnVwdF9yZXF1ZXN0OworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIHVpbnQ4X3QgKnRjX3B0cjsKKyAgICB0Y2dfdGFyZ2V0X3Vsb25nIG5leHRfdGI7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICBpZiAoY3B1LT5oYWx0ZWQpIHsKKyAgICAgICAgaWYgKCFjcHVfaGFzX3dvcmsoY3B1KSkgeworICAgICAgICByZXR1cm4gRVhDUF9IQUxURUQ7CisgICAgICAgIH0KKworICAgICAgICBjcHUtPmhhbHRlZCA9IDA7CisgICAgfQorCisgICAgY3VycmVudF9jcHUgPSBjcHU7CisgICAgLy9jcHVfc2luZ2xlX2VudiA9IGVudjsKKworICAgIGlmICh1bmxpa2VseShleGl0X3JlcXVlc3QpKSB7CisgICAgICAgIGNwdS0+ZXhpdF9yZXF1ZXN0ID0gMTsKKyAgICB9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9JMzg2KQorICAgIGlmICgha3ZtX2VuYWJsZWQoKSkgeworICAgICAgICAvKiBwdXQgZWZsYWdzIGluIENQVSB0ZW1wb3JhcnkgZm9ybWF0ICovCisgICAgICAgIENDX1NSQyA9IGVudi0+ZWZsYWdzICYgKENDX08gfCBDQ19TIHwgQ0NfWiB8IENDX0EgfCBDQ19QIHwgQ0NfQyk7CisgICAgICAgIERGID0gMSAtICgyICogKChlbnYtPmVmbGFncyA+PiAxMCkgJiAxKSk7CisgICAgICAgIENDX09QID0gQ0NfT1BfRUZMQUdTOworICAgICAgICBlbnYtPmVmbGFncyAmPSB+KERGX01BU0sgfCBDQ19PIHwgQ0NfUyB8IENDX1ogfCBDQ19BIHwgQ0NfUCB8IENDX0MpOworICAgIH0KKyNlbGlmIGRlZmluZWQoVEFSR0VUX1NQQVJDKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTTY4SykKKyAgICBlbnYtPmNjX29wID0gQ0NfT1BfRkxBR1M7CisgICAgZW52LT5jY19kZXN0ID0gZW52LT5zciAmIDB4ZjsKKyAgICBlbnYtPmNjX3ggPSAoZW52LT5zciA+PiA0KSAmIDE7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9BTFBIQSkKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0FSTSkKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1VOSUNPUkUzMikKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0xNMzIpCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NSUNST0JMQVpFKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1NINCkKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0NSSVMpCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TMzkwWCkKKyAgICAvKiBYWFhYWCAqLworI2Vsc2UKKyNlcnJvciB1bnN1cHBvcnRlZCB0YXJnZXQgQ1BVCisjZW5kaWYKKyAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IC0xOworCisgICAgLyogcHJlcGFyZSBzZXRqbXAgY29udGV4dCBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nICovCisgICAgZm9yKDs7KSB7CisgICAgICAgIGlmIChzZXRqbXAoZW52LT5qbXBfZW52KSA9PSAwKSB7CisgICAgICAgICAgICAvKiBpZiBhbiBleGNlcHRpb24gaXMgcGVuZGluZywgd2UgZXhlY3V0ZSBpdCBoZXJlICovCisgICAgICAgICAgICBpZiAoZW52LT5leGNlcHRpb25faW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChlbnYtPmV4Y2VwdGlvbl9pbmRleCA+PSBFWENQX0lOVEVSUlVQVCkgeworICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHJlcXVlc3QgZnJvbSB0aGUgY3B1IGV4ZWN1dGlvbiBsb29wICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGVudi0+ZXhjZXB0aW9uX2luZGV4OworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEVYQ1BfREVCVUcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9oYW5kbGVfZGVidWdfZXhjZXB0aW9uKGVudik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgICAgICAgICAgICAgICAgIC8qIGlmIHVzZXIgbW9kZSBvbmx5LCB3ZSBzaW11bGF0ZSBhIGZha2UgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBvdXRzaWRlIHRoZSBjcHUgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgICAgICAgIGxvb3AgKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9JMzg2KQorICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICByZXQgPSBlbnYtPmV4Y2VwdGlvbl9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSAtMTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmZGVmIENPTkZJR19IQVgKKyAgICAgICAgICAgIGlmIChoYXhfZW5hYmxlZCgpICYmICFoYXhfdmNwdV9leGVjKGNwdSkpCisgICAgICAgICAgICAgICAgbG9uZ2ptcChlbnYtPmptcF9lbnYsIDEpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChrdm1fZW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAga3ZtX2NwdV9leGVjKGNwdSk7CisgICAgICAgICAgICAgICAgbG9uZ2ptcChlbnYtPmptcF9lbnYsIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0X3RiID0gMDsgLyogZm9yY2UgbG9va3VwIG9mIGZpcnN0IFRCICovCisgICAgICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRfcmVxdWVzdCA9IGNwdS0+aW50ZXJydXB0X3JlcXVlc3Q7CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KG5lZWRfaGFuZGxlX2ludHJfcmVxdWVzdChlbnYpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoY3B1LT5zaW5nbGVzdGVwX2VuYWJsZWQgJiBTU1RFUF9OT0lSUSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hc2sgb3V0IGV4dGVybmFsIGludGVycnVwdHMgZm9yIHRoaXMgc3RlcC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX1NTVEVQX01BU0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9ERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmPSB+Q1BVX0lOVEVSUlVQVF9ERUJVRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9ERUJVRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9sb29wX2V4aXQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2lmIGRlZmluZWQoVEFSR0VUX0FSTSkgfHwgZGVmaW5lZChUQVJHRVRfU1BBUkMpIHx8IGRlZmluZWQoVEFSR0VUX01JUFMpIHx8IFwKKyAgICBkZWZpbmVkKFRBUkdFVF9QUEMpIHx8IGRlZmluZWQoVEFSR0VUX0FMUEhBKSB8fCBkZWZpbmVkKFRBUkdFVF9DUklTKSB8fCBcCisgICAgZGVmaW5lZChUQVJHRVRfTUlDUk9CTEFaRSkgfHwgZGVmaW5lZChUQVJHRVRfTE0zMikgfHwgZGVmaW5lZChUQVJHRVRfVU5JQ09SRTMyKQorICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX0hBTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJj0gfkNQVV9JTlRFUlJVUFRfSEFMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdS0+aGFsdGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9ITFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjcHVfbG9vcF9leGl0KGVudik7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX0kzODYpCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSU5JVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bV9jaGVja19pbnRlcmNlcHQoZW52LCBTVk1fRVhJVF9JTklUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19jcHVfaW5pdChlbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9IQUxURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2xvb3BfZXhpdChlbnYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9TSVBJKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fY3B1X3NpcGkoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbnYtPmhmbGFnczIgJiBIRjJfR0lGX01BU0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX1NNSSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGVudi0+aGZsYWdzICYgSEZfU01NX01BU0spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZtX2NoZWNrX2ludGVyY2VwdChlbnYsIFNWTV9FWElUX1NNSSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmPSB+Q1BVX0lOVEVSUlVQVF9TTUk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fc21tX2VudGVyKGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfTk1JKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGVudi0+aGZsYWdzMiAmIEhGMl9OTUlfTUFTSykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX05NSTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmhmbGFnczIgfD0gSEYyX05NSV9NQVNLOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2ludGVycnVwdF94ODZfaGFyZGlycShlbnYsIEVYQ1AwMl9OTUksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworCQkJfSBlbHNlIGlmIChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfTUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmPSB+Q1BVX0lOVEVSUlVQVF9NQ0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKGVudiwgRVhDUDEyX01DSEssIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX0hBUkQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGVudi0+aGZsYWdzMiAmIEhGMl9WSU5UUl9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnYtPmhmbGFnczIgJiBIRjJfSElGX01BU0spKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoZW52LT5oZmxhZ3MyICYgSEYyX1ZJTlRSX01BU0spICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudi0+ZWZsYWdzICYgSUZfTUFTSyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGVudi0+aGZsYWdzICYgSEZfSU5ISUJJVF9JUlFfTUFTSykpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50bm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZtX2NoZWNrX2ludGVyY2VwdChlbnYsIFNWTV9FWElUX0lOVFIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJj0gfihDUFVfSU5URVJSVVBUX0hBUkQgfCBDUFVfSU5URVJSVVBUX1ZJUlEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG5vID0gY3B1X2dldF9waWNfaW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX1RCX0lOX0FTTSwgIlNlcnZpY2luZyBoYXJkd2FyZSBJTlQ9MHglMDJ4XG4iLCBpbnRubyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKGVudiwgaW50bm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuc3VyZSB0aGF0IG5vIFRCIGp1bXAgd2lsbCBiZSBtb2RpZmllZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGZsb3cgd2FzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX1ZJUlEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnYtPmVmbGFncyAmIElGX01BU0spICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZW52LT5oZmxhZ3MgJiBIRl9JTkhJQklUX0lSUV9NQVNLKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRubzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBzaG91bGQgcmVzcGVjdCBUUFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm1fY2hlY2tfaW50ZXJjZXB0KGVudiwgU1ZNX0VYSVRfVklOVFIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG5vID0gbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50X3ZlY3RvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19UQl9JTl9BU00sICJTZXJ2aWNpbmcgdmlydHVhbCBoYXJkd2FyZSBJTlQ9MHglMDJ4XG4iLCBpbnRubyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKGVudiwgaW50bm8sIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJj0gfkNQVV9JTlRFUlJVUFRfVklSUTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9QUEMpCisjaWYgMAorICAgICAgICAgICAgICAgICAgICBpZiAoKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9SRVNFVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9yZXNldChlbnYpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcGNfaHdfaW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LT5wZW5kaW5nX2ludGVycnVwdHMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX0hBUkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTE0zMikKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbnYtPmllICYgSUVfSUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfSVJROworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlDUk9CTEFaRSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbnYtPnNyZWdzW1NSX01TUl0gJiBNU1JfSUUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGVudi0+c3JlZ3NbU1JfTVNSXSAmIChNU1JfRUlQIHwgTVNSX0JJUCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGVudi0+aWZsYWdzICYgKERfRkxBRyB8IElNTV9GTEFHKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9JUlE7CisgICAgICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKQorICAgICAgICAgICAgICAgICAgICBpZiAoKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY3B1X21pcHNfaHdfaW50ZXJydXB0c19wZW5kaW5nKGVudikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJhaXNlIGl0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfRVhUX0lOVEVSUlVQVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXJyb3JfY29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3B1X2ludGVycnVwdHNfZW5hYmxlZChlbnYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5pbnRlcnJ1cHRfaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpbCA9IGVudi0+aW50ZXJydXB0X2luZGV4ICYgMHhmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlID0gZW52LT5pbnRlcnJ1cHRfaW5kZXggJiAweGYwOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgodHlwZSA9PSBUVF9FWFRJTlQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X3BpbF9hbGxvd2VkKGVudiwgcGlsKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlICE9IFRUX0VYVElOVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IGVudi0+aW50ZXJydXB0X2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfQVJNKQorICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX0ZJUQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX0YpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfRklROworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBBUk12Ny1NIGludGVycnVwdCByZXR1cm4gd29ya3MgYnkgbG9hZGluZyBhIG1hZ2ljIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIFBDLiAgT24gcmVhbCBoYXJkd2FyZSB0aGUgbG9hZCBjYXVzZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0byBvY2N1ci4gIFRoZSBxZW11IGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBqdW1wIG5vcm1hbGx5LCB0aGVuIGRvZXMgdGhlIGV4Y2VwdGlvbiByZXR1cm4gd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BVIHRyaWVzIHRvIGV4ZWN1dGUgY29kZSBhdCB0aGUgbWFnaWMgYWRkcmVzcy4KKyAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGNhdXNlIHRoZSBtYWdpYyBQQyB2YWx1ZSB0byBiZSBwdXNoZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YWNrIGlmIGFuIGludGVycnVwdCBvY2N1cnJlZCBhdCB0aGUgd3JvbmcgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgV2UgYXZvaWQgdGhpcyBieSBkaXNhYmxpbmcgaW50ZXJydXB0cyB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgIHBjIGNvbnRhaW5zIGEgbWFnaWMgYWRkcmVzcy4gICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChJU19NKGVudikgJiYgZW52LT5yZWdzWzE1XSA8IDB4ZmZmZmZmZjApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIShlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX0kpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0lSUTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX2ludGVycnVwdChlbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbGlmIGRlZmluZWQoVEFSR0VUX1VOSUNPUkUzMikKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJECisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKGVudi0+dW5jYWNoZWRfYXNyICYgQVNSX0kpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TSDQpCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfQUxQSEEpCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfQ1JJUykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJECisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZW52LT5wcmVnc1tQUl9DQ1NdICYgSV9GTEFHKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWVudi0+bG9ja2VkX2lycSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0lSUTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX2ludGVycnVwdChlbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9OTUkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChlbnYtPnByZWdzW1BSX0NDU10gJiBNX0ZMQUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfTk1JOworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTTY4SykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJECisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKGVudi0+c3IgJiBTUl9JKSA+PiBTUl9JX1NISUZUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwgZW52LT5wZW5kaW5nX2xldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFsIGhhcmR3YXJlIGdldHMgdGhlIGludGVycnVwdCB2ZWN0b3IgdmlhIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJQUNLIGN5Y2xlIGF0IHRoaXMgcG9pbnQuICBDdXJyZW50IGVtdWxhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBkb2Vzbid0IHJlbHkgb24gdGhpcywgc28gd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUvc2F2ZSB0aGUgdmVjdG9yIHdoZW4gdGhlIGludGVycnVwdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Qgc2lnbmFsbGVkLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gZW52LT5wZW5kaW5nX3ZlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX2ludGVycnVwdF9tNjhrX2hhcmRpcnEoZW52LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TMzkwWCkgJiYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChlbnYtPnBzdy5tYXNrICYgUFNXX01BU0tfRVhUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0KGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgdXNlIHRoZSBjYWNoZWQgaW50ZXJydXB0X3JlcXVlc3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0IG1heSBoYXZlIHVwZGF0ZWQgdGhlIEVYSVRUQiBmbGFnLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfRVhJVFRCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX0VYSVRUQjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuc3VyZSB0aGF0IG5vIFRCIGp1bXAgd2lsbCBiZSBtb2RpZmllZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2dyYW0gZmxvdyB3YXMgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KGNwdS0+ZXhpdF9yZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgICAgICBjcHUtPmV4aXRfcmVxdWVzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9JTlRFUlJVUFQ7CisgICAgICAgICAgICAgICAgICAgIGNwdV9sb29wX2V4aXQoZW52KTsKKyAgICAgICAgICAgICAgICB9CisjaWYgZGVmaW5lZChERUJVR19ESVNBUykgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfRVhFQykKKyAgICAgICAgICAgICAgICBpZiAocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9MT0dfVEJfQ1BVKSkgeworICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGZsYWdzIGluIHN0YW5kYXJkIGZvcm1hdCAqLworI2lmIGRlZmluZWQoVEFSR0VUX0kzODYpCisgICAgICAgICAgICAgICAgICAgIGVudi0+ZWZsYWdzID0gZW52LT5lZmxhZ3MgfCBjcHVfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKERGICYgREZfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgIGxvZ19jcHVfc3RhdGUoY3B1LCBYODZfRFVNUF9DQ09QKTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5lZmxhZ3MgJj0gfihERl9NQVNLIHwgQ0NfTyB8IENDX1MgfCBDQ19aIHwgQ0NfQSB8IENDX1AgfCBDQ19DKTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX002OEspCisgICAgICAgICAgICAgICAgICAgIGNwdV9tNjhrX2ZsdXNoX2ZsYWdzKGVudiwgZW52LT5jY19vcCk7CisgICAgICAgICAgICAgICAgICAgIGVudi0+Y2Nfb3AgPSBDQ19PUF9GTEFHUzsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5zciA9IChlbnYtPnNyICYgMHhmZmUwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbnYtPmNjX2Rlc3QgfCAoZW52LT5jY194IDw8IDQpOworICAgICAgICAgICAgICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgMCk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgMCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLyogREVCVUdfRElTQVMgfHwgQ09ORklHX0RFQlVHX0VYRUMgKi8KKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJnRjZ19jdHgudGJfY3R4LnRiX2xvY2spOworICAgICAgICAgICAgICAgIHRiID0gdGJfZmluZF9mYXN0KGVudik7CisgICAgICAgICAgICAgICAgLyogTm90ZTogd2UgZG8gaXQgaGVyZSB0byBhdm9pZCBhIGdjYyBidWcgb24gTWFjIE9TIFggd2hlbgorICAgICAgICAgICAgICAgICAgIGRvaW5nIGl0IGluIHRiX2ZpbmRfc2xvdyAqLworICAgICAgICAgICAgICAgIGlmICh0Y2dfY3R4LnRiX2N0eC50Yl9pbnZhbGlkYXRlZF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFzIHNvbWUgVEIgY291bGQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgb2YgbWVtb3J5IGV4Y2VwdGlvbnMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgY29kZSwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgbXVzdCByZWNvbXB1dGUgdGhlIGhhc2ggaW5kZXggaGVyZSAqLworICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgudGJfaW52YWxpZGF0ZWRfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19ERUJVR19FWEVDCisgICAgICAgICAgICAgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX0VYRUMsICJUcmFjZSAweCUwOGx4IFsiIFRBUkdFVF9GTVRfbHggIl0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKXRiLT50Y19wdHIsIHRiLT5wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwX3N5bWJvbCh0Yi0+cGMpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIC8qIHNlZSBpZiB3ZSBjYW4gcGF0Y2ggdGhlIGNhbGxpbmcgVEIuIFdoZW4gdGhlIFRCCisgICAgICAgICAgICAgICAgICAgc3BhbnMgdHdvIHBhZ2VzLCB3ZSBjYW5ub3Qgc2FmZWx5IGRvIGEgZGlyZWN0CisgICAgICAgICAgICAgICAgICAganVtcC4gKi8KKyAgICAgICAgICAgICAgICBpZiAobmV4dF90YiAhPSAwICYmIHRiLT5wYWdlX2FkZHJbMV0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGJfYWRkX2p1bXAoKFRyYW5zbGF0aW9uQmxvY2sgKikobmV4dF90YiAmIH4zKSwgbmV4dF90YiAmIDMsIHRiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnRjZ19jdHgudGJfY3R4LnRiX2xvY2spOworCisgICAgICAgICAgICAgICAgLyogY3B1X2ludGVycnVwdCBtaWdodCBiZSBjYWxsZWQgd2hpbGUgdHJhbnNsYXRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgVEIsIGJ1dCBiZWZvcmUgaXQgaXMgbGlua2VkIGludG8gYSBwb3RlbnRpYWxseQorICAgICAgICAgICAgICAgICAgIGluZmluaXRlIGxvb3AgYW5kIGJlY29tZXMgZW52LT5jdXJyZW50X3RiLiBBdm9pZAorICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGV4ZWN1dGlvbiBpZiB0aGVyZSBpcyBhIHBlbmRpbmcgaW50ZXJydXB0LiAqLworICAgICAgICAgICAgICAgIGVudi0+Y3VycmVudF90YiA9IHRiOworICAgICAgICAgICAgICAgIGJhcnJpZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAobGlrZWx5KCFjcHUtPmV4aXRfcmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNfcHRyID0gdGItPnRjX3B0cjsKKyAgICAgICAgICAgICAgICAvKiBleGVjdXRlIHRoZSBnZW5lcmF0ZWQgY29kZSAqLworICAgICAgICAgICAgICAgICAgICBuZXh0X3RiID0gdGNnX3FlbXVfdGJfZXhlYyhlbnYsIHRjX3B0cik7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dF90YiAmIFRCX0VYSVRfTUFTSykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRCX0VYSVRfUkVRVUVTVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZXRoaW5nIGFza2VkIHVzIHRvIHN0b3AgZXhlY3V0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBjaGFpbmVkIFRCczsganVzdCBjb250aW51ZSByb3VuZCB0aGUgbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICogbG9vcC4gV2hhdGV2ZXIgcmVxdWVzdGVkIHRoZSBleGl0IHdpbGwgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICogaGF2ZSBzZXQgc29tZXRoaW5nIGVsc2UgKGVnIGV4aXRfcmVxdWVzdCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJydXB0X3JlcXVlc3QpIHdoaWNoIHdlIHdpbGwgaGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBjcHUtPnRjZ19leGl0X3JlcSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB0YiA9IChUcmFuc2xhdGlvbkJsb2NrICopKGludHB0cl90KShuZXh0X3RiICYgflRCX0VYSVRfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjcHVfcGNfZnJvbV90YihlbnYsIHRiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVEJfRVhJVF9JQ09VTlRfRVhQSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gY291bnRlciBleHBpcmVkLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnNuc19sZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSAoVHJhbnNsYXRpb25CbG9jayAqKShpbnRwdHJfdCkobmV4dF90YiAmIH5UQl9FWElUX01BU0spOworICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBQQy4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBjcHVfcGNfZnJvbV90YihlbnYsIHRiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc25zX2xlZnQgPSBlbnYtPmljb3VudF9kZWNyLnUzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnYtPmljb3VudF9leHRyYSAmJiBpbnNuc19sZWZ0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWZpbGwgZGVjcmVtZW50ZXIgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbi4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5pY291bnRfZXh0cmEgKz0gaW5zbnNfbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW52LT5pY291bnRfZXh0cmEgPiAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zbnNfbGVmdCA9IDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNuc19sZWZ0ID0gZW52LT5pY291bnRfZXh0cmE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+aWNvdW50X2V4dHJhIC09IGluc25zX2xlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5pY291bnRfZGVjci51MTYubG93ID0gaW5zbnNfbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc25zX2xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcmVtYWluaW5nIGluc3RydWN0aW9ucy4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9leGVjX25vY2FjaGUoZW52LCBpbnNuc19sZWZ0LCB0Yik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9JTlRFUlJVUFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF90YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2xvb3BfZXhpdChlbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudi0+Y3VycmVudF90YiA9IE5VTEw7CisjaWZkZWYgQ09ORklHX0hBWAorICAgICAgICAgICAgICAgIGlmIChoYXhfZW5hYmxlZCgpICYmIGhheF9zdG9wX2VtdWxhdGlvbihjcHUpKQorICAgICAgICAgICAgICAgICAgICBjcHVfbG9vcF9leGl0KGVudik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiByZXNldCBzb2Z0IE1NVSBmb3IgbmV4dCBibG9jayAoaXQgY2FuIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgc2V0IGJ5IGEgbWVtb3J5IGZhdWx0KSAqLworICAgICAgICAgICAgfSAvKiBmb3IoOzspICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBSZWxvYWQgZW52IGFmdGVyIGxvbmdqbXAgLSB0aGUgY29tcGlsZXIgbWF5IGhhdmUgc21hc2hlZCBhbGwKKyAgICAgICAgICAgICAqIGxvY2FsIHZhcmlhYmxlcyBhcyBsb25nam1wIGlzIG1hcmtlZCAnbm9yZXR1cm4nLiAqLworICAgICAgICAgICAgZW52ID0gY3B1X3NpbmdsZV9lbnY7CisgICAgICAgIH0KKyAgICB9IC8qIGZvcig7OykgKi8KKworCisjaWYgZGVmaW5lZChUQVJHRVRfSTM4NikKKyAgICAvKiByZXN0b3JlIGZsYWdzIGluIHN0YW5kYXJkIGZvcm1hdCAqLworICAgIGVudi0+ZWZsYWdzID0gZW52LT5lZmxhZ3MgfCBjcHVfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCkKKyAgICAgICAgfCAoREYgJiBERl9NQVNLKTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0FSTSkKKyAgICAvKiBYWFg6IFNhdmUvcmVzdG9yZSBob3N0IGZwdSBleGNlcHRpb24gc3RhdGU/LiAgKi8KKyNlbGlmIGRlZmluZWQoVEFSR0VUX1VOSUNPUkUzMikKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1NQQVJDKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfUFBDKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTE0zMikKKyNlbGlmIGRlZmluZWQoVEFSR0VUX002OEspCisgICAgY3B1X202OGtfZmx1c2hfZmxhZ3MoZW52LCBlbnYtPmNjX29wKTsKKyAgICBlbnYtPmNjX29wID0gQ0NfT1BfRkxBR1M7CisgICAgZW52LT5zciA9IChlbnYtPnNyICYgMHhmZmUwKQorICAgICAgICAgICAgICB8IGVudi0+Y2NfZGVzdCB8IChlbnYtPmNjX3ggPDwgNCk7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NSUNST0JMQVpFKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1NINCkKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0FMUEhBKQorI2VsaWYgZGVmaW5lZChUQVJHRVRfQ1JJUykKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1MzOTBYKQorICAgIC8qIFhYWFhYICovCisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIHRhcmdldCBDUFUKKyNlbmRpZgorCisgICAgLyogZmFpbCBzYWZlIDogbmV2ZXIgdXNlIGNwdV9zaW5nbGVfZW52IG91dHNpZGUgY3B1X2V4ZWMoKSAqLworICAgIGN1cnJlbnRfY3B1ID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfSTM4NikgJiYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorCit2b2lkIGNwdV94ODZfbG9hZF9zZWcoQ1BVWDg2U3RhdGUgKnMsIGludCBzZWdfcmVnLCBpbnQgc2VsZWN0b3IpCit7CisgICAgQ1BVWDg2U3RhdGUgKnNhdmVkX2VudjsKKworICAgIHNhdmVkX2VudiA9IGVudjsKKyAgICBlbnYgPSBzOworICAgIGlmICghKGVudi0+Y3JbMF0gJiBDUjBfUEVfTUFTSykgfHwgKGVudi0+ZWZsYWdzICYgVk1fTUFTSykpIHsKKyAgICAgICAgc2VsZWN0b3IgJj0gMHhmZmZmOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgc2VnX3JlZywgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdG9yIDw8IDQpLCAweGZmZmYsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGhlbHBlcl9sb2FkX3NlZyhzZWdfcmVnLCBzZWxlY3Rvcik7CisgICAgfQorICAgIGVudiA9IHNhdmVkX2VudjsKK30KKwordm9pZCBjcHVfeDg2X2ZzYXZlKENQVVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKQoreworICAgIENQVVg4NlN0YXRlICpzYXZlZF9lbnY7CisKKyAgICBzYXZlZF9lbnYgPSBlbnY7CisgICAgZW52ID0gczsKKworICAgIGhlbHBlcl9mc2F2ZShwdHIsIGRhdGEzMik7CisKKyAgICBlbnYgPSBzYXZlZF9lbnY7Cit9CisKK3ZvaWQgY3B1X3g4Nl9mcnN0b3IoQ1BVWDg2U3RhdGUgKnMsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpCit7CisgICAgQ1BVWDg2U3RhdGUgKnNhdmVkX2VudjsKKworICAgIHNhdmVkX2VudiA9IGVudjsKKyAgICBlbnYgPSBzOworCisgICAgaGVscGVyX2Zyc3RvcihwdHIsIGRhdGEzMik7CisKKyAgICBlbnYgPSBzYXZlZF9lbnY7Cit9CisKKyNlbmRpZiAvKiBUQVJHRVRfSTM4NiAqLworCisjaWYgIWRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9JMzg2KQorI2RlZmluZSBFWENFUFRJT05fQUNUSU9OIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LT5leGNlcHRpb25faW5kZXgsIGVudi0+ZXJyb3JfY29kZSkKKyNlbHNlCisjZGVmaW5lIEVYQ0VQVElPTl9BQ1RJT04gY3B1X2xvb3BfZXhpdChlbnYpCisjZW5kaWYKKworLyogJ3BjJyBpcyB0aGUgaG9zdCBQQyBhdCB3aGljaCB0aGUgZXhjZXB0aW9uIHdhcyByYWlzZWQuICdhZGRyZXNzJyBpcworICAgdGhlIGVmZmVjdGl2ZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgZXhjZXB0aW9uLiAnaXNfd3JpdGUnIGlzIDEgaWYgYQorICAgd3JpdGUgY2F1c2VkIHRoZSBleGNlcHRpb24gYW5kIG90aGVyd2lzZSAwJy4gJ29sZF9zZXQnIGlzIHRoZQorICAgc2lnbmFsIHNldCB3aGljaCBzaG91bGQgYmUgcmVzdG9yZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9jcHVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc193cml0ZSwgc2lnc2V0X3QgKm9sZF9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdWMpCit7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGI7CisgICAgaW50IHJldDsKKworICAgIGlmIChjcHVfc2luZ2xlX2VudikKKyAgICAgICAgZW52ID0gY3B1X3NpbmdsZV9lbnY7IC8qIFhYWDogZmluZCBhIGNvcnJlY3Qgc29sdXRpb24gZm9yIG11bHRpdGhyZWFkICovCisjaWYgZGVmaW5lZChERUJVR19TSUdOQUwpCisgICAgcWVtdV9wcmludGYoInFlbXU6IFNJR1NFR1YgcGM9MHglMDhseCBhZGRyZXNzPSUwOGx4IHc9JWQgb2xkc2V0PTB4JTA4bHhcbiIsCisgICAgICAgICAgICAgICAgcGMsIGFkZHJlc3MsIGlzX3dyaXRlLCAqKHVuc2lnbmVkIGxvbmcgKilvbGRfc2V0KTsKKyNlbmRpZgorICAgIC8qIFhYWDogbG9ja2luZyBpc3N1ZSAqLworICAgIGlmIChpc193cml0ZSAmJiBwYWdlX3VucHJvdGVjdChoMmcoYWRkcmVzcyksIHBjLCBwdWMpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8qIHNlZSBpZiBpdCBpcyBhbiBNTVUgZmF1bHQgKi8KKyAgICByZXQgPSBjcHVfaGFuZGxlX21tdV9mYXVsdChlbnYsIGFkZHJlc3MsIGlzX3dyaXRlLCBNTVVfVVNFUl9JRFgsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gMDsgLyogbm90IGFuIE1NVSBmYXVsdCAqLworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7IC8qIHRoZSBNTVUgZmF1bHQgd2FzIGhhbmRsZWQgd2l0aG91dCBjYXVzaW5nIHJlYWwgQ1BVIGZhdWx0ICovCisgICAgLyogbm93IHdlIGhhdmUgYSByZWFsIGNwdSBmYXVsdCAqLworICAgIHRiID0gdGJfZmluZF9wYyhwYyk7CisgICAgaWYgKHRiKSB7CisgICAgICAgIC8qIHRoZSBQQyBpcyBpbnNpZGUgdGhlIHRyYW5zbGF0ZWQgY29kZS4gSXQgbWVhbnMgdGhhdCB3ZSBoYXZlCisgICAgICAgICAgIGEgdmlydHVhbCBDUFUgZmF1bHQgKi8KKyAgICAgICAgY3B1X3Jlc3RvcmVfc3RhdGUoZW52LCBwYyk7CisgICAgfQorCisgICAgLyogd2UgcmVzdG9yZSB0aGUgcHJvY2VzcyBzaWduYWwgbWFzayBhcyB0aGUgc2lncmV0dXJuIHNob3VsZAorICAgICAgIGRvIGl0IChYWFg6IHVzZSBzaWdzZXRqbXApICovCisgICAgc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIG9sZF9zZXQsIE5VTEwpOworICAgIEVYQ0VQVElPTl9BQ1RJT047CisKKyAgICAvKiBuZXZlciBjb21lcyBoZXJlICovCisgICAgcmV0dXJuIDE7Cit9CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKQorCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjIGluY2x1ZGUgPHN5cy91Y29udGV4dC5oPgorCisjIGRlZmluZSBFSVBfc2lnKGNvbnRleHQpICAoKigodW5zaWduZWQgbG9uZyopJihjb250ZXh0KS0+dWNfbWNvbnRleHQtPnNzLmVpcCkpCisjIGRlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC0+ZXMudHJhcG5vKQorIyBkZWZpbmUgRVJST1Jfc2lnKGNvbnRleHQpICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQtPmVzLmVycikKKyMgZGVmaW5lIE1BU0tfc2lnKGNvbnRleHQpICAgICgoY29udGV4dCktPnVjX3NpZ21hc2spCisjZWxpZiBkZWZpbmVkIChfX05ldEJTRF9fKQorIyBpbmNsdWRlIDx1Y29udGV4dC5oPgorCisjIGRlZmluZSBFSVBfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5fX2dyZWdzW19SRUdfRUlQXSkKKyMgZGVmaW5lIFRSQVBfc2lnKGNvbnRleHQpICAgICgoY29udGV4dCktPnVjX21jb250ZXh0Ll9fZ3JlZ3NbX1JFR19UUkFQTk9dKQorIyBkZWZpbmUgRVJST1Jfc2lnKGNvbnRleHQpICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQuX19ncmVnc1tfUkVHX0VSUl0pCisjIGRlZmluZSBNQVNLX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19zaWdtYXNrKQorI2VsaWYgZGVmaW5lZCAoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyMgaW5jbHVkZSA8dWNvbnRleHQuaD4KKworIyBkZWZpbmUgRUlQX3NpZyhjb250ZXh0KSAgKCooKHVuc2lnbmVkIGxvbmcqKSYoY29udGV4dCktPnVjX21jb250ZXh0Lm1jX2VpcCkpCisjIGRlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY190cmFwbm8pCisjIGRlZmluZSBFUlJPUl9zaWcoY29udGV4dCkgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19lcnIpCisjIGRlZmluZSBNQVNLX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19zaWdtYXNrKQorI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyMgZGVmaW5lIEVJUF9zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPnNjX2VpcCkKKyMgZGVmaW5lIFRSQVBfc2lnKGNvbnRleHQpICAgICgoY29udGV4dCktPnNjX3RyYXBubykKKyMgZGVmaW5lIEVSUk9SX3NpZyhjb250ZXh0KSAgICgoY29udGV4dCktPnNjX2VycikKKyMgZGVmaW5lIE1BU0tfc2lnKGNvbnRleHQpICAgICgoY29udGV4dCktPnNjX21hc2spCisjZWxzZQorIyBkZWZpbmUgRUlQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VJUF0pCisjIGRlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfVFJBUE5PXSkKKyMgZGVmaW5lIEVSUk9SX3NpZyhjb250ZXh0KSAgICgoY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19FUlJdKQorIyBkZWZpbmUgTUFTS19zaWcoY29udGV4dCkgICAgKChjb250ZXh0KS0+dWNfc2lnbWFzaykKKyNlbmRpZgorCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyNpZiBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisgICAgdWNvbnRleHRfdCAqdWMgPSBwdWM7CisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorICAgIHN0cnVjdCBzaWdjb250ZXh0ICp1YyA9IHB1YzsKKyNlbHNlCisgICAgc3RydWN0IHVjb250ZXh0ICp1YyA9IHB1YzsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgcGM7CisgICAgaW50IHRyYXBubzsKKworI2lmbmRlZiBSRUdfRUlQCisvKiBmb3IgZ2xpYmMgMi4xICovCisjZGVmaW5lIFJFR19FSVAgICAgRUlQCisjZGVmaW5lIFJFR19FUlIgICAgRVJSCisjZGVmaW5lIFJFR19UUkFQTk8gVFJBUE5PCisjZW5kaWYKKyAgICBwYyA9IEVJUF9zaWcodWMpOworICAgIHRyYXBubyA9IFRSQVBfc2lnKHVjKTsKKyAgICByZXR1cm4gaGFuZGxlX2NwdV9zaWduYWwocGMsICh1bnNpZ25lZCBsb25nKWluZm8tPnNpX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYXBubyA9PSAweGUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRVJST1Jfc2lnKHVjKSA+PiAxKSAmIDEgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTUFTS19zaWcodWMpLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpZmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIFBDX3NpZyhjb250ZXh0KSAgICAgICBfVUNfTUFDSElORV9QQyhjb250ZXh0KQorI2RlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQuX19ncmVnc1tfUkVHX1RSQVBOT10pCisjZGVmaW5lIEVSUk9SX3NpZyhjb250ZXh0KSAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5fX2dyZWdzW19SRUdfRVJSXSkKKyNkZWZpbmUgTUFTS19zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPnVjX3NpZ21hc2spCisjZWxpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2RlZmluZSBQQ19zaWcoY29udGV4dCkgICAgICAgKChjb250ZXh0KS0+c2NfcmlwKQorI2RlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+c2NfdHJhcG5vKQorI2RlZmluZSBFUlJPUl9zaWcoY29udGV4dCkgICAgKChjb250ZXh0KS0+c2NfZXJyKQorI2RlZmluZSBNQVNLX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+c2NfbWFzaykKKyNlbGlmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjaW5jbHVkZSA8dWNvbnRleHQuaD4KKworI2RlZmluZSBQQ19zaWcoY29udGV4dCkgICgqKCh1bnNpZ25lZCBsb25nKikmKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19yaXApKQorI2RlZmluZSBUUkFQX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfdHJhcG5vKQorI2RlZmluZSBFUlJPUl9zaWcoY29udGV4dCkgICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfZXJyKQorI2RlZmluZSBNQVNLX3NpZyhjb250ZXh0KSAgICAgKChjb250ZXh0KS0+dWNfc2lnbWFzaykKKyNlbHNlCisjZGVmaW5lIFBDX3NpZyhjb250ZXh0KSAgICAgICAoKGNvbnRleHQpLT51Y19tY29udGV4dC5ncmVnc1tSRUdfUklQXSkKKyNkZWZpbmUgVFJBUF9zaWcoY29udGV4dCkgICAgICgoY29udGV4dCktPnVjX21jb250ZXh0LmdyZWdzW1JFR19UUkFQTk9dKQorI2RlZmluZSBFUlJPUl9zaWcoY29udGV4dCkgICAgKChjb250ZXh0KS0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VSUl0pCisjZGVmaW5lIE1BU0tfc2lnKGNvbnRleHQpICAgICAoKGNvbnRleHQpLT51Y19zaWdtYXNrKQorI2VuZGlmCisKK2ludCBjcHVfc2lnbmFsX2hhbmRsZXIoaW50IGhvc3Rfc2lnbnVtLCB2b2lkICpwaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHVjKQoreworICAgIHNpZ2luZm9fdCAqaW5mbyA9IHBpbmZvOworICAgIHVuc2lnbmVkIGxvbmcgcGM7CisjaWYgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKQorICAgIHVjb250ZXh0X3QgKnVjID0gcHVjOworI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgICBzdHJ1Y3Qgc2lnY29udGV4dCAqdWMgPSBwdWM7CisjZWxzZQorICAgIHN0cnVjdCB1Y29udGV4dCAqdWMgPSBwdWM7CisjZW5kaWYKKworICAgIHBjID0gUENfc2lnKHVjKTsKKyAgICByZXR1cm4gaGFuZGxlX2NwdV9zaWduYWwocGMsICh1bnNpZ25lZCBsb25nKWluZm8tPnNpX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVBfc2lnKHVjKSA9PSAweGUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRVJST1Jfc2lnKHVjKSA+PiAxKSAmIDEgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTUFTS19zaWcodWMpLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9BUkNIX1BQQykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzaWduYWwgY29udGV4dCBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZpbml0aW9ucworICogRnJvbSBXaW5lCisgKi8KKyNpZmRlZiBsaW51eAorLyogQWxsIFJlZ2lzdGVycyBhY2Nlc3MgLSBvbmx5IGZvciBsb2NhbCBhY2Nlc3MgKi8KKyMgZGVmaW5lIFJFR19zaWcocmVnX25hbWUsIGNvbnRleHQpCQkoKGNvbnRleHQpLT51Y19tY29udGV4dC5yZWdzLT5yZWdfbmFtZSkKKy8qIEdwciBSZWdpc3RlcnMgYWNjZXNzICAqLworIyBkZWZpbmUgR1BSX3NpZyhyZWdfbnVtLCBjb250ZXh0KQkJUkVHX3NpZyhncHJbcmVnX251bV0sIGNvbnRleHQpCisjIGRlZmluZSBJQVJfc2lnKGNvbnRleHQpCQkJUkVHX3NpZyhuaXAsIGNvbnRleHQpCS8qIFByb2dyYW0gY291bnRlciAqLworIyBkZWZpbmUgTVNSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcobXNyLCBjb250ZXh0KSAgIC8qIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIgKFN1cGVydmlzb3IpICovCisjIGRlZmluZSBDVFJfc2lnKGNvbnRleHQpCQkJUkVHX3NpZyhjdHIsIGNvbnRleHQpICAgLyogQ291bnQgcmVnaXN0ZXIgKi8KKyMgZGVmaW5lIFhFUl9zaWcoY29udGV4dCkJCQlSRUdfc2lnKHhlciwgY29udGV4dCkgLyogVXNlcidzIGludGVnZXIgZXhjZXB0aW9uIHJlZ2lzdGVyICovCisjIGRlZmluZSBMUl9zaWcoY29udGV4dCkJCQlSRUdfc2lnKGxpbmssIGNvbnRleHQpIC8qIExpbmsgcmVnaXN0ZXIgKi8KKyMgZGVmaW5lIENSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcoY2NyLCBjb250ZXh0KSAvKiBDb25kaXRpb24gcmVnaXN0ZXIgKi8KKy8qIEZsb2F0IFJlZ2lzdGVycyBhY2Nlc3MgICovCisjIGRlZmluZSBGTE9BVF9zaWcocmVnX251bSwgY29udGV4dCkJCSgoKGRvdWJsZSopKChjaGFyKikoKGNvbnRleHQpLT51Y19tY29udGV4dC5yZWdzKzQ4KjQpKSlbcmVnX251bV0pCisjIGRlZmluZSBGUFNDUl9zaWcoY29udGV4dCkJCQkoKihpbnQqKSgoY2hhciopKChjb250ZXh0KS0+dWNfbWNvbnRleHQucmVncysoNDgrMzIqMikqNCkpKQorLyogRXhjZXB0aW9uIFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyMgZGVmaW5lIERBUl9zaWcoY29udGV4dCkJCQlSRUdfc2lnKGRhciwgY29udGV4dCkKKyMgZGVmaW5lIERTSVNSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcoZHNpc3IsIGNvbnRleHQpCisjIGRlZmluZSBUUkFQX3NpZyhjb250ZXh0KQkJCVJFR19zaWcodHJhcCwgY29udGV4dCkKKyNlbmRpZiAvKiBsaW51eCAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaW5jbHVkZSA8dWNvbnRleHQuaD4KKyMgZGVmaW5lIElBUl9zaWcoY29udGV4dCkJCSgoY29udGV4dCktPnVjX21jb250ZXh0Lm1jX3NycjApCisjIGRlZmluZSBNU1Jfc2lnKGNvbnRleHQpCQkoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19zcnIxKQorIyBkZWZpbmUgQ1RSX3NpZyhjb250ZXh0KQkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfY3RyKQorIyBkZWZpbmUgWEVSX3NpZyhjb250ZXh0KQkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfeGVyKQorIyBkZWZpbmUgTFJfc2lnKGNvbnRleHQpCQkoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19scikKKyMgZGVmaW5lIENSX3NpZyhjb250ZXh0KQkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfY3IpCisvKiBFeGNlcHRpb24gUmVnaXN0ZXJzIGFjY2VzcyAqLworIyBkZWZpbmUgREFSX3NpZyhjb250ZXh0KQkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQubWNfZGFyKQorIyBkZWZpbmUgRFNJU1Jfc2lnKGNvbnRleHQpCQkoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19kc2lzcikKKyMgZGVmaW5lIFRSQVBfc2lnKGNvbnRleHQpCQkoKGNvbnRleHQpLT51Y19tY29udGV4dC5tY19leGMpCisjZW5kaWYgLyogX19GcmVlQlNEX198fCBfX0ZyZWVCU0Rfa2VybmVsX18gKi8KKworI2lmZGVmIF9fQVBQTEVfXworIyBpbmNsdWRlIDxzeXMvdWNvbnRleHQuaD4KK3R5cGVkZWYgc3RydWN0IHVjb250ZXh0IFNJR0NPTlRFWFQ7CisvKiBBbGwgUmVnaXN0ZXJzIGFjY2VzcyAtIG9ubHkgZm9yIGxvY2FsIGFjY2VzcyAqLworIyBkZWZpbmUgUkVHX3NpZyhyZWdfbmFtZSwgY29udGV4dCkJCSgoY29udGV4dCktPnVjX21jb250ZXh0LT5zcy5yZWdfbmFtZSkKKyMgZGVmaW5lIEZMT0FUUkVHX3NpZyhyZWdfbmFtZSwgY29udGV4dCkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQtPmZzLnJlZ19uYW1lKQorIyBkZWZpbmUgRVhDRVBSRUdfc2lnKHJlZ19uYW1lLCBjb250ZXh0KQkoKGNvbnRleHQpLT51Y19tY29udGV4dC0+ZXMucmVnX25hbWUpCisjIGRlZmluZSBWRUNSRUdfc2lnKHJlZ19uYW1lLCBjb250ZXh0KQkJKChjb250ZXh0KS0+dWNfbWNvbnRleHQtPnZzLnJlZ19uYW1lKQorLyogR3ByIFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyMgZGVmaW5lIEdQUl9zaWcocmVnX251bSwgY29udGV4dCkJCVJFR19zaWcociMjcmVnX251bSwgY29udGV4dCkKKyMgZGVmaW5lIElBUl9zaWcoY29udGV4dCkJCQlSRUdfc2lnKHNycjAsIGNvbnRleHQpCS8qIFByb2dyYW0gY291bnRlciAqLworIyBkZWZpbmUgTVNSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcoc3JyMSwgY29udGV4dCkgIC8qIE1hY2hpbmUgU3RhdGUgUmVnaXN0ZXIgKFN1cGVydmlzb3IpICovCisjIGRlZmluZSBDVFJfc2lnKGNvbnRleHQpCQkJUkVHX3NpZyhjdHIsIGNvbnRleHQpCisjIGRlZmluZSBYRVJfc2lnKGNvbnRleHQpCQkJUkVHX3NpZyh4ZXIsIGNvbnRleHQpIC8qIExpbmsgcmVnaXN0ZXIgKi8KKyMgZGVmaW5lIExSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcobHIsIGNvbnRleHQpICAvKiBVc2VyJ3MgaW50ZWdlciBleGNlcHRpb24gcmVnaXN0ZXIgKi8KKyMgZGVmaW5lIENSX3NpZyhjb250ZXh0KQkJCVJFR19zaWcoY3IsIGNvbnRleHQpICAvKiBDb25kaXRpb24gcmVnaXN0ZXIgKi8KKy8qIEZsb2F0IFJlZ2lzdGVycyBhY2Nlc3MgKi8KKyMgZGVmaW5lIEZMT0FUX3NpZyhyZWdfbnVtLCBjb250ZXh0KQkJRkxPQVRSRUdfc2lnKGZwcmVnc1tyZWdfbnVtXSwgY29udGV4dCkKKyMgZGVmaW5lIEZQU0NSX3NpZyhjb250ZXh0KQkJCSgoZG91YmxlKUZMT0FUUkVHX3NpZyhmcHNjciwgY29udGV4dCkpCisvKiBFeGNlcHRpb24gUmVnaXN0ZXJzIGFjY2VzcyAqLworIyBkZWZpbmUgREFSX3NpZyhjb250ZXh0KQkJCUVYQ0VQUkVHX3NpZyhkYXIsIGNvbnRleHQpICAgICAvKiBGYXVsdCByZWdpc3RlcnMgZm9yIGNvcmVkdW1wICovCisjIGRlZmluZSBEU0lTUl9zaWcoY29udGV4dCkJCQlFWENFUFJFR19zaWcoZHNpc3IsIGNvbnRleHQpCisjIGRlZmluZSBUUkFQX3NpZyhjb250ZXh0KQkJCUVYQ0VQUkVHX3NpZyhleGNlcHRpb24sIGNvbnRleHQpIC8qIG51bWJlciBvZiBwb3dlcnBjIGV4Y2VwdGlvbiB0YWtlbiAqLworI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKyAgICB1Y29udGV4dF90ICp1YyA9IHB1YzsKKyNlbHNlCisgICAgc3RydWN0IHVjb250ZXh0ICp1YyA9IHB1YzsKKyNlbmRpZgorICAgIHVuc2lnbmVkIGxvbmcgcGM7CisgICAgaW50IGlzX3dyaXRlOworCisgICAgcGMgPSBJQVJfc2lnKHVjKTsKKyAgICBpc193cml0ZSA9IDA7CisjaWYgMAorICAgIC8qIHBwYyA0eHggY2FzZSAqLworICAgIGlmIChEU0lTUl9zaWcodWMpICYgMHgwMDgwMDAwMCkKKyAgICAgICAgaXNfd3JpdGUgPSAxOworI2Vsc2UKKyAgICBpZiAoVFJBUF9zaWcodWMpICE9IDB4NDAwICYmIChEU0lTUl9zaWcodWMpICYgMHgwMjAwMDAwMCkpCisgICAgICAgIGlzX3dyaXRlID0gMTsKKyNlbmRpZgorICAgIHJldHVybiBoYW5kbGVfY3B1X3NpZ25hbChwYywgKHVuc2lnbmVkIGxvbmcpaW5mby0+c2lfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfd3JpdGUsICZ1Yy0+dWNfc2lnbWFzaywgcHVjKTsKK30KKworI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisKK2ludCBjcHVfc2lnbmFsX2hhbmRsZXIoaW50IGhvc3Rfc2lnbnVtLCB2b2lkICpwaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcHVjOworICAgIHVpbnQzMl90ICpwYyA9IHVjLT51Y19tY29udGV4dC5zY19wYzsKKyAgICB1aW50MzJfdCBpbnNuID0gKnBjOworICAgIGludCBpc193cml0ZSA9IDA7CisKKyAgICAvKiBYWFg6IG5lZWQga2VybmVsIHBhdGNoIHRvIGdldCB3cml0ZSBmbGFnIGZhc3RlciAqLworICAgIHN3aXRjaCAoaW5zbiA+PiAyNikgeworICAgIGNhc2UgMHgwZDogLy8gc3R3CisgICAgY2FzZSAweDBlOiAvLyBzdGIKKyAgICBjYXNlIDB4MGY6IC8vIHN0cV91CisgICAgY2FzZSAweDI0OiAvLyBzdGYKKyAgICBjYXNlIDB4MjU6IC8vIHN0ZworICAgIGNhc2UgMHgyNjogLy8gc3RzCisgICAgY2FzZSAweDI3OiAvLyBzdHQKKyAgICBjYXNlIDB4MmM6IC8vIHN0bAorICAgIGNhc2UgMHgyZDogLy8gc3RxCisgICAgY2FzZSAweDJlOiAvLyBzdGxfYworICAgIGNhc2UgMHgyZjogLy8gc3RxX2MKKwlpc193cml0ZSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGhhbmRsZV9jcHVfc2lnbmFsKHBjLCAodW5zaWduZWQgbG9uZylpbmZvLT5zaV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc193cml0ZSwgJnVjLT51Y19zaWdtYXNrLCBwdWMpOworfQorI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisKK2ludCBjcHVfc2lnbmFsX2hhbmRsZXIoaW50IGhvc3Rfc2lnbnVtLCB2b2lkICpwaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHVjKQoreworICAgIHNpZ2luZm9fdCAqaW5mbyA9IHBpbmZvOworICAgIGludCBpc193cml0ZTsKKyAgICB1aW50MzJfdCBpbnNuOworI2lmICFkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQoQ09ORklHX1NPTEFSSVMpCisgICAgdWludDMyX3QgKnJlZ3MgPSAodWludDMyX3QgKikoaW5mbyArIDEpOworICAgIHZvaWQgKnNpZ21hc2sgPSAocmVncyArIDIwKTsKKyAgICAvKiBYWFg6IGlzIHRoZXJlIGEgc3RhbmRhcmQgZ2xpYmMgZGVmaW5lID8gKi8KKyAgICB1bnNpZ25lZCBsb25nIHBjID0gcmVnc1sxXTsKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisgICAgc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gcHVjOworICAgIHVuc2lnbmVkIGxvbmcgcGMgPSBzYy0+c2lnY19yZWdzLnRwYzsKKyAgICB2b2lkICpzaWdtYXNrID0gKHZvaWQgKilzYy0+c2lnY19tYXNrOworI2VsaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgICBzdHJ1Y3Qgc2lnY29udGV4dCAqdWMgPSBwdWM7CisgICAgdW5zaWduZWQgbG9uZyBwYyA9IHVjLT5zY19wYzsKKyAgICB2b2lkICpzaWdtYXNrID0gKHZvaWQgKikobG9uZyl1Yy0+c2NfbWFzazsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAvKiBYWFg6IG5lZWQga2VybmVsIHBhdGNoIHRvIGdldCB3cml0ZSBmbGFnIGZhc3RlciAqLworICAgIGlzX3dyaXRlID0gMDsKKyAgICBpbnNuID0gKih1aW50MzJfdCAqKXBjOworICAgIGlmICgoaW5zbiA+PiAzMCkgPT0gMykgeworICAgICAgc3dpdGNoKChpbnNuID4+IDE5KSAmIDB4M2YpIHsKKyAgICAgIGNhc2UgMHgwNTogLy8gc3RiCisgICAgICBjYXNlIDB4MTU6IC8vIHN0YmEKKyAgICAgIGNhc2UgMHgwNjogLy8gc3RoCisgICAgICBjYXNlIDB4MTY6IC8vIHN0aGEKKyAgICAgIGNhc2UgMHgwNDogLy8gc3QKKyAgICAgIGNhc2UgMHgxNDogLy8gc3RhCisgICAgICBjYXNlIDB4MDc6IC8vIHN0ZAorICAgICAgY2FzZSAweDE3OiAvLyBzdGRhCisgICAgICBjYXNlIDB4MGU6IC8vIHN0eAorICAgICAgY2FzZSAweDFlOiAvLyBzdHhhCisgICAgICBjYXNlIDB4MjQ6IC8vIHN0ZgorICAgICAgY2FzZSAweDM0OiAvLyBzdGZhCisgICAgICBjYXNlIDB4Mjc6IC8vIHN0ZGYKKyAgICAgIGNhc2UgMHgzNzogLy8gc3RkZmEKKyAgICAgIGNhc2UgMHgyNjogLy8gc3RxZgorICAgICAgY2FzZSAweDM2OiAvLyBzdHFmYQorICAgICAgY2FzZSAweDI1OiAvLyBzdGZzcgorICAgICAgY2FzZSAweDNjOiAvLyBjYXNhCisgICAgICBjYXNlIDB4M2U6IC8vIGNhc3hhCisJaXNfd3JpdGUgPSAxOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGFuZGxlX2NwdV9zaWduYWwocGMsICh1bnNpZ25lZCBsb25nKWluZm8tPnNpX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3dyaXRlLCBzaWdtYXNrLCBOVUxMKTsKK30KKworI2VsaWYgZGVmaW5lZChfX2FybV9fKQorCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcHVjOworICAgIHVuc2lnbmVkIGxvbmcgcGM7CisgICAgaW50IGlzX3dyaXRlOworCisjaWYgKF9fR0xJQkNfXyA8IDIgfHwgKF9fR0xJQkNfXyA9PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA8PSAzKSkKKyAgICBwYyA9IHVjLT51Y19tY29udGV4dC5ncmVnc1tSMTVdOworI2Vsc2UKKyAgICBwYyA9IHVjLT51Y19tY29udGV4dC5hcm1fcGM7CisjZW5kaWYKKyAgICAvKiBYWFg6IGNvbXB1dGUgaXNfd3JpdGUgKi8KKyAgICBpc193cml0ZSA9IDA7CisgICAgcmV0dXJuIGhhbmRsZV9jcHVfc2lnbmFsKHBjLCAodW5zaWduZWQgbG9uZylpbmZvLT5zaV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjLT51Y19zaWdtYXNrLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9fbWM2ODAwMCkKKworaW50IGNwdV9zaWduYWxfaGFuZGxlcihpbnQgaG9zdF9zaWdudW0sIHZvaWQgKnBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdWMpCit7CisgICAgc2lnaW5mb190ICppbmZvID0gcGluZm87CisgICAgc3RydWN0IHVjb250ZXh0ICp1YyA9IHB1YzsKKyAgICB1bnNpZ25lZCBsb25nIHBjOworICAgIGludCBpc193cml0ZTsKKworICAgIHBjID0gdWMtPnVjX21jb250ZXh0LmdyZWdzWzE2XTsKKyAgICAvKiBYWFg6IGNvbXB1dGUgaXNfd3JpdGUgKi8KKyAgICBpc193cml0ZSA9IDA7CisgICAgcmV0dXJuIGhhbmRsZV9jcHVfc2lnbmFsKHBjLCAodW5zaWduZWQgbG9uZylpbmZvLT5zaV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVjLT51Y19zaWdtYXNrLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9faWE2NCkKKworI2lmbmRlZiBfX0lTUl9WQUxJRAorICAvKiBUaGlzIG91Z2h0IHRvIGJlIGluIDxiaXRzL3NpZ2luZm8uaD4uLi4gKi8KKyMgZGVmaW5lIF9fSVNSX1ZBTElECTEKKyNlbmRpZgorCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcHVjOworICAgIHVuc2lnbmVkIGxvbmcgaXA7CisgICAgaW50IGlzX3dyaXRlID0gMDsKKworICAgIGlwID0gdWMtPnVjX21jb250ZXh0LnNjX2lwOworICAgIHN3aXRjaCAoaG9zdF9zaWdudW0pIHsKKyAgICAgIGNhc2UgU0lHSUxMOgorICAgICAgY2FzZSBTSUdGUEU6CisgICAgICBjYXNlIFNJR1NFR1Y6CisgICAgICBjYXNlIFNJR0JVUzoKKyAgICAgIGNhc2UgU0lHVFJBUDoKKwkgIGlmIChpbmZvLT5zaV9jb2RlICYmIChpbmZvLT5zaV9zZWd2ZmxhZ3MgJiBfX0lTUl9WQUxJRCkpCisJICAgICAgLyogSVNSLlcgKHdyaXRlLWFjY2VzcykgaXMgYml0IDMzOiAgKi8KKwkgICAgICBpc193cml0ZSA9IChpbmZvLT5zaV9pc3IgPj4gMzMpICYgMTsKKwkgIGJyZWFrOworCisgICAgICBkZWZhdWx0OgorCSAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoYW5kbGVfY3B1X3NpZ25hbChpcCwgKHVuc2lnbmVkIGxvbmcpaW5mby0+c2lfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaWdzZXRfdCAqKSZ1Yy0+dWNfc2lnbWFzaywgcHVjKTsKK30KKworI2VsaWYgZGVmaW5lZChfX3MzOTBfXykKKworaW50IGNwdV9zaWduYWxfaGFuZGxlcihpbnQgaG9zdF9zaWdudW0sIHZvaWQgKnBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwdWMpCit7CisgICAgc2lnaW5mb190ICppbmZvID0gcGluZm87CisgICAgc3RydWN0IHVjb250ZXh0ICp1YyA9IHB1YzsKKyAgICB1bnNpZ25lZCBsb25nIHBjOworICAgIHVpbnQxNl90ICpwaW5zbjsKKyAgICBpbnQgaXNfd3JpdGUgPSAwOworCisgICAgcGMgPSB1Yy0+dWNfbWNvbnRleHQucHN3LmFkZHI7CisKKyAgICAvKiA/Pz8gT24gbGludXgsIHRoZSBub24tcnQgc2lnbmFsIGhhbmRsZXIgaGFzIDQgKCEpIGFyZ3VtZW50cyBpbnN0ZWFkCisgICAgICAgb2YgdGhlIG5vcm1hbCAyIGFyZ3VtZW50cy4gIFRoZSAzcmQgYXJndW1lbnQgY29udGFpbnMgdGhlICJpbnRfY29kZSIKKyAgICAgICBmcm9tIHRoZSBoYXJkd2FyZSB3aGljaCBkb2VzIGluIGZhY3QgY29udGFpbiB0aGUgaXNfd3JpdGUgdmFsdWUuCisgICAgICAgVGhlIHJ0IHNpZ25hbCBoYW5kbGVyLCBhcyBmYXIgYXMgSSBjYW4gdGVsbCwgZG9lcyBub3QgZ2l2ZSB0aGlzIHZhbHVlCisgICAgICAgYXQgYWxsLiAgTm90IHRoYXQgd2UgY291bGQgZ2V0IHRvIGl0IGZyb20gaGVyZSBldmVuIGlmIGl0IHdlcmUuICAqLworICAgIC8qID8/PyBUaGlzIGlzIG5vdCBldmVuIGNsb3NlIHRvIGNvbXBsZXRlLCBzaW5jZSBpdCBpZ25vcmVzIGFsbAorICAgICAgIG9mIHRoZSByZWFkLW1vZGlmeS13cml0ZSBpbnN0cnVjdGlvbnMuICAqLworICAgIHBpbnNuID0gKHVpbnQxNl90ICopcGM7CisgICAgc3dpdGNoIChwaW5zblswXSA+PiA4KSB7CisgICAgY2FzZSAweDUwOiAvKiBTVCAqLworICAgIGNhc2UgMHg0MjogLyogU1RDICovCisgICAgY2FzZSAweDQwOiAvKiBTVEggKi8KKyAgICAgICAgaXNfd3JpdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4YzQ6IC8qIFJJTCBmb3JtYXQgaW5zbnMgKi8KKyAgICAgICAgc3dpdGNoIChwaW5zblswXSAmIDB4ZikgeworICAgICAgICBjYXNlIDB4ZjogLyogU1RSTCAqLworICAgICAgICBjYXNlIDB4YjogLyogU1RHUkwgKi8KKyAgICAgICAgY2FzZSAweDc6IC8qIFNUSFJMICovCisgICAgICAgICAgICBpc193cml0ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGUzOiAvKiBSWFkgZm9ybWF0IGluc25zICovCisgICAgICAgIHN3aXRjaCAocGluc25bMl0gJiAweGZmKSB7CisgICAgICAgIGNhc2UgMHg1MDogLyogU1RZICovCisgICAgICAgIGNhc2UgMHgyNDogLyogU1RHICovCisgICAgICAgIGNhc2UgMHg3MjogLyogU1RDWSAqLworICAgICAgICBjYXNlIDB4NzA6IC8qIFNUSFkgKi8KKyAgICAgICAgY2FzZSAweDhlOiAvKiBTVFBRICovCisgICAgICAgIGNhc2UgMHgzZjogLyogU1RSVkggKi8KKyAgICAgICAgY2FzZSAweDNlOiAvKiBTVFJWICovCisgICAgICAgIGNhc2UgMHgyZjogLyogU1RSVkcgKi8KKyAgICAgICAgICAgIGlzX3dyaXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZV9jcHVfc2lnbmFsKHBjLCAodW5zaWduZWQgbG9uZylpbmZvLT5zaV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc193cml0ZSwgJnVjLT51Y19zaWdtYXNrLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzaWdpbmZvX3QgKmluZm8gPSBwaW5mbzsKKyAgICBzdHJ1Y3QgdWNvbnRleHQgKnVjID0gcHVjOworICAgIGdyZWdfdCBwYyA9IHVjLT51Y19tY29udGV4dC5wYzsKKyAgICBpbnQgaXNfd3JpdGU7CisKKyAgICAvKiBYWFg6IGNvbXB1dGUgaXNfd3JpdGUgKi8KKyAgICBpc193cml0ZSA9IDA7CisgICAgcmV0dXJuIGhhbmRsZV9jcHVfc2lnbmFsKHBjLCAodW5zaWduZWQgbG9uZylpbmZvLT5zaV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc193cml0ZSwgJnVjLT51Y19zaWdtYXNrLCBwdWMpOworfQorCisjZWxpZiBkZWZpbmVkKF9faHBwYV9fKQorCitpbnQgY3B1X3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1YykKK3sKKyAgICBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbyA9IHBpbmZvOworICAgIHN0cnVjdCB1Y29udGV4dCAqdWMgPSBwdWM7CisgICAgdW5zaWduZWQgbG9uZyBwYyA9IHVjLT51Y19tY29udGV4dC5zY19pYW9xWzBdOworICAgIHVpbnQzMl90IGluc24gPSAqKHVpbnQzMl90ICopcGM7CisgICAgaW50IGlzX3dyaXRlID0gMDsKKworICAgIC8qIFhYWDogbmVlZCBrZXJuZWwgcGF0Y2ggdG8gZ2V0IHdyaXRlIGZsYWcgZmFzdGVyLiAgKi8KKyAgICBzd2l0Y2ggKGluc24gPj4gMjYpIHsKKyAgICBjYXNlIDB4MWE6IC8qIFNUVyAqLworICAgIGNhc2UgMHgxOTogLyogU1RIICovCisgICAgY2FzZSAweDE4OiAvKiBTVEIgKi8KKyAgICBjYXNlIDB4MWI6IC8qIFNUV00gKi8KKyAgICAgICAgaXNfd3JpdGUgPSAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwOTogLyogQ1NUV1gsIEZTVFdYLCBGU1RXUyAqLworICAgIGNhc2UgMHgwYjogLyogQ1NURFgsIEZTVERYLCBGU1REUyAqLworICAgICAgICAvKiBEaXN0aW5ndWlzaCBmcm9tIGNvcHJvY2Vzc29yIGxvYWQgLi4uICovCisgICAgICAgIGlzX3dyaXRlID0gKGluc24gPj4gOSkgJiAxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwMzoKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiA2KSAmIDE1KSB7CisgICAgICAgIGNhc2UgMHhhOiAvKiBTVFdTICovCisgICAgICAgIGNhc2UgMHg5OiAvKiBTVEhTICovCisgICAgICAgIGNhc2UgMHg4OiAvKiBTVEJTICovCisgICAgICAgIGNhc2UgMHhlOiAvKiBTVFdBUyAqLworICAgICAgICBjYXNlIDB4YzogLyogU1RCWVMgKi8KKyAgICAgICAgICAgIGlzX3dyaXRlID0gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaGFuZGxlX2NwdV9zaWduYWwocGMsICh1bnNpZ25lZCBsb25nKWluZm8tPnNpX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3dyaXRlLCAmdWMtPnVjX3NpZ21hc2ssIHB1Yyk7Cit9CisKKyNlbHNlCisKKyNlcnJvciBob3N0IENQVSBzcGVjaWZpYyBzaWduYWwgaGFuZGxlciBuZWVkZWQKKworI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfU09GVE1NVSkgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvY3B1cy5jIGIvYW5kcm9pZC9xZW11MS9jcHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjNjJhMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvY3B1cy5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNpbmNsdWRlICJleGVjL2dkYnN0dWIuaCIKKyNpbmNsdWRlICJzeXNlbXUvZG1hLmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNpbmNsdWRlICJleGVjL2hheC5oIgorI2luY2x1ZGUgInFlbXUvYXRvbWljLmgiCisKKyNpbmNsdWRlICJzeXNlbXUvY3B1cy5oIgorCitzdGF0aWMgQ1BVU3RhdGUgKmN1cl9jcHU7CitzdGF0aWMgQ1BVU3RhdGUgKm5leHRfY3B1OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGh3X2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgQ1BVU3RhdGUgKmNwdTsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogaGFyZHdhcmUgZXJyb3I6ICIpOworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNQVSAjJWQ6XG4iLCBjcHUtPmNwdV9pbmRleCk7CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICAgICAgY3B1X2R1bXBfc3RhdGUoY3B1LT5lbnZfcHRyLCBzdGRlcnIsIGZwcmludGYsIFg4Nl9EVU1QX0ZQVSk7CisjZWxzZQorICAgICAgICBjcHVfZHVtcF9zdGF0ZShjcHUtPmVudl9wdHIsIHN0ZGVyciwgZnByaW50ZiwgMCk7CisjZW5kaWYKKyAgICB9CisgICAgdmFfZW5kKGFwKTsKKyAgICBhYm9ydCgpOworfQorCitzdGF0aWMgdm9pZCBkb192bV9zdG9wKGludCByZWFzb24pCit7CisgICAgaWYgKHZtX3J1bm5pbmcpIHsKKyAgICAgICAgY3B1X2Rpc2FibGVfdGlja3MoKTsKKyAgICAgICAgdm1fcnVubmluZyA9IDA7CisgICAgICAgIHBhdXNlX2FsbF92Y3B1cygpOworICAgICAgICB2bV9zdGF0ZV9ub3RpZnkoMCwgcmVhc29uKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY3B1X2Nhbl9ydW4oQ1BVQXJjaFN0YXRlICplbnYpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisgICAgaWYgKGNwdS0+c3RvcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGNwdS0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCB0Y2dfaGFzX3dvcmsodm9pZCkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGlmIChjcHUtPnN0b3ApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgaWYgKGNwdS0+c3RvcHBlZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIWNwdS0+aGFsdGVkKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmIChjcHVfaGFzX3dvcmsoY3B1KSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcWVtdV9pbml0X3ZjcHUoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkKKyAgICAgICAga3ZtX2luaXRfdmNwdShjcHUpOworI2lmZGVmIENPTkZJR19IQVgKKyAgICBpZiAoaGF4X2VuYWJsZWQoKSkKKyAgICAgICAgaGF4X2luaXRfdmNwdShjcHUpOworI2VuZGlmCisgICAgcmV0dXJuOworfQorCitib29sIHFlbXVfY3B1X2lzX3NlbGYoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCByZXN1bWVfYWxsX3ZjcHVzKHZvaWQpCit7Cit9CisKK3ZvaWQgcGF1c2VfYWxsX3ZjcHVzKHZvaWQpCit7Cit9CisKK3ZvaWQgcWVtdV9jcHVfa2ljayhDUFVTdGF0ZSAqY3B1KQoreworICAgIHJldHVybjsKK30KKworLy8gSW4gbWFpbi1sb29wLmMKKyNpZmRlZiBfV0lOMzIKK2V4dGVybiBIQU5ETEUgcWVtdV9ldmVudF9oYW5kbGU7CisjZW5kaWYKKwordm9pZCBxZW11X25vdGlmeV9ldmVudCh2b2lkKQoreworICAgIENQVVN0YXRlICpjcHUgPSBjdXJyZW50X2NwdTsKKworICAgIGlmIChjcHUpIHsKKyAgICAgICAgY3B1X2V4aXQoY3B1KTsKKyAgICAvKgorICAgICAqIFRoaXMgaXMgbWFpbmx5IGZvciB0aGUgV2luZG93cyBob3N0LCB3aGVyZSB0aGUgdGltZXIgbWF5IGJlIGluCisgICAgICogYSBkaWZmZXJlbnQgdGhyZWFkIHdpdGggdmNwdS4gVGh1cyB0aGUgdGltZXIgZnVuY3Rpb24gbmVlZHMgdG8KKyAgICAgKiBub3RpZnkgdGhlIHZjcHUgdGhyZWFkIG9mIG1vcmUgdGhhbiBzaW1wbHkgY3B1X2V4aXQuICBJZiBlbnYgaXMKKyAgICAgKiBub3QgTlVMTCwgaXQgbWVhbnMgdGhhdCB0aGUgdmNwdSBpcyBpbiBleGVjdXRlIHN0YXRlLCB3ZSBuZWVkCisgICAgICogb25seSB0byBzZXQgdGhlIGZsYWdzLiAgSWYgdGhlIGd1ZXN0IGlzIGluIGV4ZWN1dGUgc3RhdGUsIHRoZQorICAgICAqIEhBWCBrZXJuZWwgbW9kdWxlIHdpbGwgZXhpdCB0byBxZW11LiAgSWYgZW52IGlzIE5VTEwsIHZjcHUgaXMKKyAgICAgKiBpbiBtYWluX2xvb3Bfd2FpdCwgYW5kIHdlIG5lZWQgYSBldmVudCB0byBub3RpZnkgaXQuCisgICAgICovCisjaWZkZWYgQ09ORklHX0hBWAorICAgICAgICBpZiAoaGF4X2VuYWJsZWQoKSkKKyAgICAgICAgICAgIGhheF9yYWlzZV9ldmVudChjcHUpOworICAgICB9IGVsc2UgeworI2lmZGVmIF9XSU4zMgorICAgICAgICAgaWYoaGF4X2VuYWJsZWQoKSkKKyAgICAgICAgICAgICBTZXRFdmVudChxZW11X2V2ZW50X2hhbmRsZSk7CisjZW5kaWYKKyAgICAgfQorI2Vsc2UKKyAgICAgfQorI2VuZGlmCit9CisKKy8vIEdsb2JhbCBtdXRleCB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgZ2xvYmFsIFZNIHN0YXRlLgorc3RhdGljIFFlbXVNdXRleCBxZW11X2dsb2JhbF9sb2NrOworCisvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgdG8gdHJhY2sgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQKKy8vIGhvbGRzIHRoZSBnbG9iYWwgbG9jay4gVGhpcyBpcyB0aHJlYWQtc3BlY2lmaWMgdG8gYXZvaWQgc3VidGxlCisvLyBtZW1vcnktb3JkZXJpbmcgaXNzdWVzIHRoYXQgYXBwZWFyIGlmIG9uZSB0cmllcyB0byB0cmFjayB0aGlzIHdpdGgKKy8vIGEgc2V0IG9mIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhlbSBiZWluZyB0aGF0IHRoZXJlIGlzIG5vCisvLyB2YWx1ZSBvZiBRZW11VGhyZWFkIHRoYXQgY2FuIGJlIHRlc3RlZCBhdG9taWNhbGx5IGFnYWluc3QgYSBkaWZmZXJlbnQKKy8vIG9yIGludmFsaWQgdmFsdWUuCitzdGF0aWMgX190aHJlYWQgYm9vbCBxZW11X2dsb2JhbF9sb2NrX2hlbGQ7CisKK3ZvaWQgcWVtdV9pbml0X2NwdV9sb29wKHZvaWQpCit7CisgICAgcWVtdV9tdXRleF9pbml0KCZxZW11X2dsb2JhbF9sb2NrKTsKK30KKwordm9pZCBxZW11X211dGV4X2xvY2tfaW90aHJlYWQodm9pZCkKK3sKKyAgICBxZW11X211dGV4X2xvY2soJnFlbXVfZ2xvYmFsX2xvY2spOworICAgIHFlbXVfZ2xvYmFsX2xvY2tfaGVsZCA9IHRydWU7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF91bmxvY2tfaW90aHJlYWQodm9pZCkKK3sKKyAgICBxZW11X2dsb2JhbF9sb2NrX2hlbGQgPSBmYWxzZTsKKyAgICBxZW11X211dGV4X3VubG9jaygmcWVtdV9nbG9iYWxfbG9jayk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB0aHJlYWQgaG9sZHMgdGhlIGdsb2JhbCBtdXRleCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBxZW11X211dGV4X2NoZWNrX2lvdGhyZWFkKHZvaWQpCit7CisgICAgcmV0dXJuIHFlbXVfZ2xvYmFsX2xvY2tfaGVsZDsKK30KKwordm9pZCB2bV9zdG9wKGludCByZWFzb24pCit7CisgICAgZG9fdm1fc3RvcChyZWFzb24pOworfQorCitzdGF0aWMgaW50IHFlbXVfY3B1X2V4ZWMoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBpbnQgcmV0OworCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgaW50NjRfdCB0aSA9IHByb2ZpbGVfZ2V0Y2xvY2soKTsKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgIGludDY0X3QgY291bnQ7CisgICAgICAgIGludCBkZWNyOworICAgICAgICBxZW11X2ljb3VudCAtPSAoZW52LT5pY291bnRfZGVjci51MTYubG93ICsgZW52LT5pY291bnRfZXh0cmEpOworICAgICAgICBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3cgPSAwOworICAgICAgICBlbnYtPmljb3VudF9leHRyYSA9IDA7CisgICAgICAgIGNvdW50ID0gcWVtdV9uZXh0X2ljb3VudF9kZWFkbGluZSgpOworICAgICAgICBjb3VudCA9IChjb3VudCArICgxIDw8IGljb3VudF90aW1lX3NoaWZ0KSAtIDEpCisgICAgICAgICAgICAgICAgPj4gaWNvdW50X3RpbWVfc2hpZnQ7CisgICAgICAgIHFlbXVfaWNvdW50ICs9IGNvdW50OworICAgICAgICBkZWNyID0gKGNvdW50ID4gMHhmZmZmKSA/IDB4ZmZmZiA6IGNvdW50OworICAgICAgICBjb3VudCAtPSBkZWNyOworICAgICAgICBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3cgPSBkZWNyOworICAgICAgICBlbnYtPmljb3VudF9leHRyYSA9IGNvdW50OworICAgIH0KKyNlbmRpZgorICAgIHJldCA9IGNwdV9leGVjKGVudik7CisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgcWVtdV90aW1lICs9IHByb2ZpbGVfZ2V0Y2xvY2soKSAtIHRpOworI2VuZGlmCisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgaWYgKHVzZV9pY291bnQpIHsKKyAgICAgICAgLyogRm9sZCBwZW5kaW5nIGluc3RydWN0aW9ucyBiYWNrIGludG8gdGhlCisgICAgICAgICAgIGluc3RydWN0aW9uIGNvdW50ZXIsIGFuZCBjbGVhciB0aGUgaW50ZXJydXB0IGZsYWcuICAqLworICAgICAgICBxZW11X2ljb3VudCAtPSAoZW52LT5pY291bnRfZGVjci51MTYubG93CisgICAgICAgICAgICAgICAgICAgICAgICArIGVudi0+aWNvdW50X2V4dHJhKTsKKyAgICAgICAgZW52LT5pY291bnRfZGVjci51MzIgPSAwOworICAgICAgICBlbnYtPmljb3VudF9leHRyYSA9IDA7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCB0Y2dfY3B1X2V4ZWModm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChuZXh0X2NwdSA9PSBOVUxMKQorICAgICAgICBuZXh0X2NwdSA9IFFUQUlMUV9GSVJTVCgmY3B1cyk7CisgICAgZm9yICg7IG5leHRfY3B1ICE9IE5VTEw7IG5leHRfY3B1ID0gUVRBSUxRX05FWFQobmV4dF9jcHUsIG5vZGUpKSB7XAorICAgICAgICBjdXJfY3B1ID0gbmV4dF9jcHU7CisgICAgICAgIENQVU9sZFN0YXRlICplbnYgPSBjdXJfY3B1LT5lbnZfcHRyOworCisgICAgICAgIGlmICghdm1fcnVubmluZykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocWVtdV90aW1lcl9hbGFybV9wZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChjcHVfY2FuX3J1bihlbnYpKQorICAgICAgICAgICAgcmV0ID0gcWVtdV9jcHVfZXhlYyhlbnYpOworICAgICAgICBpZiAocmV0ID09IEVYQ1BfREVCVUcpIHsKKyAgICAgICAgICAgIGdkYl9zZXRfc3RvcF9jcHUoY3VyX2NwdSk7CisgICAgICAgICAgICBkZWJ1Z19yZXF1ZXN0ZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGd1ZXN0IGN5Y2xlIGNvdW50ZXIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgVGltZXJzU3RhdGUgeworICAgIGludDY0X3QgY3B1X3RpY2tzX3ByZXY7CisgICAgaW50NjRfdCBjcHVfdGlja3Nfb2Zmc2V0OworICAgIGludDY0X3QgY3B1X2Nsb2NrX29mZnNldDsKKyAgICBpbnQzMl90IGNwdV90aWNrc19lbmFibGVkOworICAgIGludDY0X3QgZHVtbXk7Cit9IFRpbWVyc1N0YXRlOworCitzdGF0aWMgdm9pZCB0aW1lcl9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgVGltZXJzU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAocy0+Y3B1X3RpY2tzX2VuYWJsZWQpIHsKKyAgICAgICAgaHdfZXJyb3IoImNhbm5vdCBzYXZlIHN0YXRlIGlmIHZpcnR1YWwgdGltZXJzIGFyZSBydW5uaW5nIik7CisgICAgfQorICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+Y3B1X3RpY2tzX3ByZXYpOworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+Y3B1X3RpY2tzX29mZnNldCk7CisgICAgcWVtdV9wdXRfYmU2NChmLCBzLT5jcHVfY2xvY2tfb2Zmc2V0KTsKKyB9CisKK3N0YXRpYyBpbnQgdGltZXJfbG9hZChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBUaW1lcnNTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IDEgJiYgdmVyc2lvbl9pZCAhPSAyKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocy0+Y3B1X3RpY2tzX2VuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIHMtPmNwdV90aWNrc19wcmV2ICAgPSBxZW11X2dldF9zYmU2NChmKTsKKyAgICBzLT5jcHVfdGlja3Nfb2Zmc2V0ID0gcWVtdV9nZXRfc2JlNjQoZik7CisgICAgaWYgKHZlcnNpb25faWQgPT0gMikgeworICAgICAgICBzLT5jcHVfY2xvY2tfb2Zmc2V0ID0gcWVtdV9nZXRfc2JlNjQoZik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKK1RpbWVyc1N0YXRlIHRpbWVyc19zdGF0ZTsKKwordm9pZCBxZW11X3RpbWVyX3JlZ2lzdGVyX3NhdmV2bSh2b2lkKSB7CisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJ0aW1lciIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVyX3NhdmUsCisgICAgICAgICAgICAgICAgICAgIHRpbWVyX2xvYWQsCisgICAgICAgICAgICAgICAgICAgICZ0aW1lcnNfc3RhdGUpOworfQorCisvKiBSZXR1cm4gdGhlIHZpcnR1YWwgQ1BVIHRpbWUsIGJhc2VkIG9uIHRoZSBpbnN0cnVjdGlvbiBjb3VudGVyLiAgKi8KK2ludDY0X3QgY3B1X2dldF9pY291bnQodm9pZCkKK3sKKyAgICBpbnQ2NF90IGljb3VudDsKKyAgICBDUFVPbGRTdGF0ZSAqZW52ID0gY3B1X3NpbmdsZV9lbnY7OworCisgICAgaWNvdW50ID0gcWVtdV9pY291bnQ7CisgICAgaWYgKGVudikgeworICAgICAgICBpZiAoIWNhbl9kb19pbyhlbnYpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCBjbG9jayByZWFkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpY291bnQgLT0gKGVudi0+aWNvdW50X2RlY3IudTE2LmxvdyArIGVudi0+aWNvdW50X2V4dHJhKTsKKyAgICB9CisgICAgcmV0dXJuIHFlbXVfaWNvdW50X2JpYXMgKyAoaWNvdW50IDw8IGljb3VudF90aW1lX3NoaWZ0KTsKK30KKworLyogcmV0dXJuIHRoZSBob3N0IENQVSBjeWNsZSBjb3VudGVyIGFuZCBoYW5kbGUgc3RvcC9yZXN0YXJ0ICovCitpbnQ2NF90IGNwdV9nZXRfdGlja3Modm9pZCkKK3sKKyAgICBpZiAodXNlX2ljb3VudCkgeworICAgICAgICByZXR1cm4gY3B1X2dldF9pY291bnQoKTsKKyAgICB9CisgICAgaWYgKCF0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX2VuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVyc19zdGF0ZS5jcHVfdGlja3Nfb2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdGlja3M7CisgICAgICAgIHRpY2tzID0gY3B1X2dldF9yZWFsX3RpY2tzKCk7CisgICAgICAgIGlmICh0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX3ByZXYgPiB0aWNrcykgeworICAgICAgICAgICAgLyogTm90ZTogbm9uIGluY3JlYXNpbmcgdGlja3MgbWF5IGhhcHBlbiBpZiB0aGUgaG9zdCB1c2VzCisgICAgICAgICAgICAgICBzb2Z0d2FyZSBzdXNwZW5kICovCisgICAgICAgICAgICB0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX29mZnNldCArPSB0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX3ByZXYgLSB0aWNrczsKKyAgICAgICAgfQorICAgICAgICB0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX3ByZXYgPSB0aWNrczsKKyAgICAgICAgcmV0dXJuIHRpY2tzICsgdGltZXJzX3N0YXRlLmNwdV90aWNrc19vZmZzZXQ7CisgICAgfQorfQorCisvKiByZXR1cm4gdGhlIGhvc3QgQ1BVIG1vbm90b25pYyB0aW1lciBhbmQgaGFuZGxlIHN0b3AvcmVzdGFydCAqLworaW50NjRfdCBjcHVfZ2V0X2Nsb2NrKHZvaWQpCit7CisgICAgaW50NjRfdCB0aTsKKyAgICBpZiAoIXRpbWVyc19zdGF0ZS5jcHVfdGlja3NfZW5hYmxlZCkgeworICAgICAgICByZXR1cm4gdGltZXJzX3N0YXRlLmNwdV9jbG9ja19vZmZzZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGkgPSBnZXRfY2xvY2soKTsKKyAgICAgICAgcmV0dXJuIHRpICsgdGltZXJzX3N0YXRlLmNwdV9jbG9ja19vZmZzZXQ7CisgICAgfQorfQorCisvKiBlbmFibGUgY3B1X2dldF90aWNrcygpICovCit2b2lkIGNwdV9lbmFibGVfdGlja3Modm9pZCkKK3sKKyAgICBpZiAoIXRpbWVyc19zdGF0ZS5jcHVfdGlja3NfZW5hYmxlZCkgeworICAgICAgICB0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX29mZnNldCAtPSBjcHVfZ2V0X3JlYWxfdGlja3MoKTsKKyAgICAgICAgdGltZXJzX3N0YXRlLmNwdV9jbG9ja19vZmZzZXQgLT0gZ2V0X2Nsb2NrKCk7CisgICAgICAgIHRpbWVyc19zdGF0ZS5jcHVfdGlja3NfZW5hYmxlZCA9IDE7CisgICAgfQorfQorCisvKiBkaXNhYmxlIGNwdV9nZXRfdGlja3MoKSA6IHRoZSBjbG9jayBpcyBzdG9wcGVkLiBZb3UgbXVzdCBub3QgY2FsbAorICAgY3B1X2dldF90aWNrcygpIGFmdGVyIHRoYXQuICAqLwordm9pZCBjcHVfZGlzYWJsZV90aWNrcyh2b2lkKQoreworICAgIGlmICh0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX2VuYWJsZWQpIHsKKyAgICAgICAgdGltZXJzX3N0YXRlLmNwdV90aWNrc19vZmZzZXQgPSBjcHVfZ2V0X3RpY2tzKCk7CisgICAgICAgIHRpbWVyc19zdGF0ZS5jcHVfY2xvY2tfb2Zmc2V0ID0gY3B1X2dldF9jbG9jaygpOworICAgICAgICB0aW1lcnNfc3RhdGUuY3B1X3RpY2tzX2VuYWJsZWQgPSAwOworICAgIH0KK30KKwordm9pZCBxZW11X2Nsb2NrX3dhcnAoUUVNVUNsb2NrVHlwZSBjbG9jaykgeworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9jcHV0bGIuYyBiL2FuZHJvaWQvcWVtdTEvY3B1dGxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5OWQ0OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvY3B1dGxiLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qCisgKiAgQ29tbW9uIENQVSBUTEIgaGFuZGxpbmcKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZXhlYy9leGVjLWFsbC5oIgorI2luY2x1ZGUgImV4ZWMvY3B1dGxiLmgiCisjaW5jbHVkZSAiZXhlYy9yYW1fYWRkci5oIgorCisvKiBzdGF0aXN0aWNzICovCitpbnQgdGxiX2ZsdXNoX2NvdW50OworCitzdGF0aWMgY29uc3QgQ1BVVExCRW50cnkgc19jcHV0bGJfZW1wdHlfZW50cnkgPSB7CisgICAgLmFkZHJfcmVhZCAgPSAtMSwKKyAgICAuYWRkcl93cml0ZSA9IC0xLAorICAgIC5hZGRyX2NvZGUgID0gLTEsCisgICAgLmFkZGVuZCAgICAgPSAtMSwKK307CisKKy8qIE5PVEU6CisgKiBJZiBmbHVzaF9nbG9iYWwgaXMgdHJ1ZSAodGhlIHVzdWFsIGNhc2UpLCBmbHVzaCBhbGwgdGxiIGVudHJpZXMuCisgKiBJZiBmbHVzaF9nbG9iYWwgaXMgZmFsc2UsIGZsdXNoIChhdCBsZWFzdCkgYWxsIHRsYiBlbnRyaWVzIG5vdAorICogbWFya2VkIGdsb2JhbC4KKyAqCisgKiBTaW5jZSBRRU1VIGRvZXNuJ3QgY3VycmVudGx5IGltcGxlbWVudCBhIGdsb2JhbC9ub3QtZ2xvYmFsIGZsYWcKKyAqIGZvciB0bGIgZW50cmllcywgYXQgdGhlIG1vbWVudCB0bGJfZmx1c2goKSB3aWxsIGFsc28gZmx1c2ggYWxsCisgKiB0bGIgZW50cmllcyBpbiB0aGUgZmx1c2hfZ2xvYmFsID09IGZhbHNlIGNhc2UuIFRoaXMgaXMgT0sgYmVjYXVzZQorICogQ1BVIGFyY2hpdGVjdHVyZXMgZ2VuZXJhbGx5IHBlcm1pdCBhbiBpbXBsZW1lbnRhdGlvbiB0byBkcm9wCisgKiBlbnRyaWVzIGZyb20gdGhlIFRMQiBhdCBhbnkgdGltZSwgc28gZmx1c2hpbmcgbW9yZSBlbnRyaWVzIHRoYW4KKyAqIHJlcXVpcmVkIGlzIG9ubHkgYW4gZWZmaWNpZW5jeSBpc3N1ZSwgbm90IGEgY29ycmVjdG5lc3MgaXNzdWUuCisgKi8KK3ZvaWQgdGxiX2ZsdXNoKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgZmx1c2hfZ2xvYmFsKQoreworICAgIGludCBpOworCisjaWYgZGVmaW5lZChERUJVR19UTEIpCisgICAgcHJpbnRmKCJ0bGJfZmx1c2g6XG4iKTsKKyNlbmRpZgorICAgIC8qIG11c3QgcmVzZXQgY3VycmVudCBUQiBzbyB0aGF0IGludGVycnVwdHMgY2Fubm90IG1vZGlmeSB0aGUKKyAgICAgICBsaW5rcyB3aGlsZSB3ZSBhcmUgbW9kaWZ5aW5nIHRoZW0gKi8KKyAgICBlbnYtPmN1cnJlbnRfdGIgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IENQVV9UTEJfU0laRTsgaSsrKSB7CisgICAgICAgIGludCBtbXVfaWR4OworCisgICAgICAgIGZvciAobW11X2lkeCA9IDA7IG1tdV9pZHggPCBOQl9NTVVfTU9ERVM7IG1tdV9pZHgrKykgeworICAgICAgICAgICAgZW52LT50bGJfdGFibGVbbW11X2lkeF1baV0gPSBzX2NwdXRsYl9lbXB0eV9lbnRyeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbXNldChlbnYtPnRiX2ptcF9jYWNoZSwgMCwgVEJfSk1QX0NBQ0hFX1NJWkUgKiBzaXplb2YgKHZvaWQgKikpOworCisgICAgZW52LT50bGJfZmx1c2hfYWRkciA9IC0xOworICAgIGVudi0+dGxiX2ZsdXNoX21hc2sgPSAwOworICAgIHRsYl9mbHVzaF9jb3VudCsrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoX2VudHJ5KENQVVRMQkVudHJ5ICp0bGJfZW50cnksIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIGlmIChhZGRyID09ICh0bGJfZW50cnktPmFkZHJfcmVhZCAmCisgICAgICAgICAgICAgICAgIChUQVJHRVRfUEFHRV9NQVNLIHwgVExCX0lOVkFMSURfTUFTSykpIHx8CisgICAgICAgIGFkZHIgPT0gKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAmCisgICAgICAgICAgICAgICAgIChUQVJHRVRfUEFHRV9NQVNLIHwgVExCX0lOVkFMSURfTUFTSykpIHx8CisgICAgICAgIGFkZHIgPT0gKHRsYl9lbnRyeS0+YWRkcl9jb2RlICYKKyAgICAgICAgICAgICAgICAgKFRBUkdFVF9QQUdFX01BU0sgfCBUTEJfSU5WQUxJRF9NQVNLKSkpIHsKKyAgICAgICAgKnRsYl9lbnRyeSA9IHNfY3B1dGxiX2VtcHR5X2VudHJ5OworICAgIH0KK30KKwordm9pZCB0bGJfZmx1c2hfcGFnZShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIpCit7CisgICAgaW50IGk7CisgICAgaW50IG1tdV9pZHg7CisKKyNpZiBkZWZpbmVkKERFQlVHX1RMQikKKyAgICBwcmludGYoInRsYl9mbHVzaF9wYWdlOiAiIFRBUkdFVF9GTVRfbHggIlxuIiwgYWRkcik7CisjZW5kaWYKKyAgICAvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGZsdXNoIGR1ZSB0byBsYXJnZSBwYWdlcy4gICovCisgICAgaWYgKChhZGRyICYgZW52LT50bGJfZmx1c2hfbWFzaykgPT0gZW52LT50bGJfZmx1c2hfYWRkcikgeworI2lmIGRlZmluZWQoREVCVUdfVExCKQorICAgICAgICBwcmludGYoInRsYl9mbHVzaF9wYWdlOiBmb3JjZWQgZnVsbCBmbHVzaCAoIgorICAgICAgICAgICAgICAgVEFSR0VUX0ZNVF9seCAiLyIgVEFSR0VUX0ZNVF9seCAiKVxuIiwKKyAgICAgICAgICAgICAgIGVudi0+dGxiX2ZsdXNoX2FkZHIsIGVudi0+dGxiX2ZsdXNoX21hc2spOworI2VuZGlmCisgICAgICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIG11c3QgcmVzZXQgY3VycmVudCBUQiBzbyB0aGF0IGludGVycnVwdHMgY2Fubm90IG1vZGlmeSB0aGUKKyAgICAgICBsaW5rcyB3aGlsZSB3ZSBhcmUgbW9kaWZ5aW5nIHRoZW0gKi8KKyAgICBlbnYtPmN1cnJlbnRfdGIgPSBOVUxMOworCisgICAgYWRkciAmPSBUQVJHRVRfUEFHRV9NQVNLOworICAgIGkgPSAoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKKyAgICBmb3IgKG1tdV9pZHggPSAwOyBtbXVfaWR4IDwgTkJfTU1VX01PREVTOyBtbXVfaWR4KyspIHsKKyAgICAgICAgdGxiX2ZsdXNoX2VudHJ5KCZlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpXSwgYWRkcik7CisgICAgfQorCisgICAgdGJfZmx1c2hfam1wX2NhY2hlKGVudiwgYWRkcik7Cit9CisKKy8qIHVwZGF0ZSB0aGUgVExCcyBzbyB0aGF0IHdyaXRlcyB0byBjb2RlIGluIHRoZSB2aXJ0dWFsIHBhZ2UgJ2FkZHInCisgICBjYW4gYmUgZGV0ZWN0ZWQgKi8KK3ZvaWQgdGxiX3Byb3RlY3RfY29kZShyYW1fYWRkcl90IHJhbV9hZGRyKQoreworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVzZXRfZGlydHkocmFtX2FkZHIsIFRBUkdFVF9QQUdFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJUWV9NRU1PUllfQ09ERSk7Cit9CisKKy8qIHVwZGF0ZSB0aGUgVExCIHNvIHRoYXQgd3JpdGVzIGluIHBoeXNpY2FsIHBhZ2UgJ3BoeXNfYWRkcicgYXJlIG5vIGxvbmdlcgorICAgdGVzdGVkIGZvciBzZWxmIG1vZGlmeWluZyBjb2RlICovCit2b2lkIHRsYl91bnByb3RlY3RfY29kZV9waHlzKENQVUFyY2hTdGF0ZSAqZW52LCByYW1fYWRkcl90IHJhbV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgdmFkZHIpCit7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhyYW1fYWRkciwgRElSVFlfTUVNT1JZX0NPREUpOworfQorCitzdGF0aWMgYm9vbCB0bGJfaXNfZGlydHlfcmFtKENQVVRMQkVudHJ5ICp0bGJlKQoreworICAgIHJldHVybiAodGxiZS0+YWRkcl93cml0ZSAmIH5UQVJHRVRfUEFHRV9NQVNLKSA9PSBJT19NRU1fUkFNOworfQorCit2b2lkIHRsYl9yZXNldF9kaXJ0eV9yYW5nZShDUFVUTEJFbnRyeSAqdGxiX2VudHJ5LCB1aW50cHRyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGVuZ3RoKQoreworICAgIHVpbnRwdHJfdCBhZGRyOworCisgICAgaWYgKHRsYl9pc19kaXJ0eV9yYW0odGxiX2VudHJ5KSkgeworICAgICAgICBhZGRyID0gKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAmIFRBUkdFVF9QQUdFX01BU0spICsgdGxiX2VudHJ5LT5hZGRlbmQ7CisgICAgICAgIGlmICgoYWRkciAtIHN0YXJ0KSA8IGxlbmd0aCkgeworICAgICAgICAgICAgdGxiX2VudHJ5LT5hZGRyX3dyaXRlICY9IFRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgICAgICB0bGJfZW50cnktPmFkZHJfd3JpdGUgfD0gVExCX05PVERJUlRZOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNwdV90bGJfcmVzZXRfZGlydHlfYWxsKHJhbV9hZGRyX3Qgc3RhcnQxLCByYW1fYWRkcl90IGxlbmd0aCkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworICAgIENQVUFyY2hTdGF0ZSAqZW52OworCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGludCBtbXVfaWR4OworCisgICAgICAgIGVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICAgICAgZm9yIChtbXVfaWR4ID0gMDsgbW11X2lkeCA8IE5CX01NVV9NT0RFUzsgbW11X2lkeCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IENQVV9UTEJfU0laRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGxiX3Jlc2V0X2RpcnR5X3JhbmdlKCZlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQxLCBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX3NldF9kaXJ0eTEoQ1BVVExCRW50cnkgKnRsYl9lbnRyeSwgdGFyZ2V0X3Vsb25nIHZhZGRyKQoreworICAgIGlmICh0bGJfZW50cnktPmFkZHJfd3JpdGUgPT0gKHZhZGRyIHwgVExCX05PVERJUlRZKSkgeworICAgICAgICB0bGJfZW50cnktPmFkZHJfd3JpdGUgPSB2YWRkcjsKKyAgICB9Cit9CisKKy8qIHVwZGF0ZSB0aGUgVExCIGNvcnJlc3BvbmRpbmcgdG8gdmlydHVhbCBwYWdlIHZhZGRyCisgICBzbyB0aGF0IGl0IGlzIG5vIGxvbmdlciBkaXJ0eSAqLwordm9pZCB0bGJfc2V0X2RpcnR5KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdmFkZHIpCit7CisgICAgaW50IGk7CisgICAgaW50IG1tdV9pZHg7CisKKyAgICB2YWRkciAmPSBUQVJHRVRfUEFHRV9NQVNLOworICAgIGkgPSAodmFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUykgJiAoQ1BVX1RMQl9TSVpFIC0gMSk7CisgICAgZm9yIChtbXVfaWR4ID0gMDsgbW11X2lkeCA8IE5CX01NVV9NT0RFUzsgbW11X2lkeCsrKSB7CisgICAgICAgIHRsYl9zZXRfZGlydHkxKCZlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpXSwgdmFkZHIpOworICAgIH0KK30KKworLyogT3VyIFRMQiBkb2VzIG5vdCBzdXBwb3J0IGxhcmdlIHBhZ2VzLCBzbyByZW1lbWJlciB0aGUgYXJlYSBjb3ZlcmVkIGJ5CisgICBsYXJnZSBwYWdlcyBhbmQgdHJpZ2dlciBhIGZ1bGwgVExCIGZsdXNoIGlmIHRoZXNlIGFyZSBpbnZhbGlkYXRlZC4gICovCitzdGF0aWMgdm9pZCB0bGJfYWRkX2xhcmdlX3BhZ2UoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyB2YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgc2l6ZSkKK3sKKyAgICB0YXJnZXRfdWxvbmcgbWFzayA9IH4oc2l6ZSAtIDEpOworCisgICAgaWYgKGVudi0+dGxiX2ZsdXNoX2FkZHIgPT0gKHRhcmdldF91bG9uZyktMSkgeworICAgICAgICBlbnYtPnRsYl9mbHVzaF9hZGRyID0gdmFkZHIgJiBtYXNrOworICAgICAgICBlbnYtPnRsYl9mbHVzaF9tYXNrID0gbWFzazsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBFeHRlbmQgdGhlIGV4aXN0aW5nIHJlZ2lvbiB0byBpbmNsdWRlIHRoZSBuZXcgcGFnZS4KKyAgICAgICBUaGlzIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHVubmVjZXNzYXJ5IGZsdXNoZXMgYW5kIHRoZSBjb3N0CisgICAgICAgb2YgbWFpbnRhaW5pbmcgYSBmdWxsIHZhcmlhYmxlIHNpemUgVExCLiAgKi8KKyAgICBtYXNrICY9IGVudi0+dGxiX2ZsdXNoX21hc2s7CisgICAgd2hpbGUgKCgoZW52LT50bGJfZmx1c2hfYWRkciBeIHZhZGRyKSAmIG1hc2spICE9IDApIHsKKyAgICAgICAgbWFzayA8PD0gMTsKKyAgICB9CisgICAgZW52LT50bGJfZmx1c2hfYWRkciAmPSBtYXNrOworICAgIGVudi0+dGxiX2ZsdXNoX21hc2sgPSBtYXNrOworfQorCisvKiBBZGQgYSBuZXcgVExCIGVudHJ5LiBBdCBtb3N0IG9uZSBlbnRyeSBmb3IgYSBnaXZlbiB2aXJ0dWFsIGFkZHJlc3MKKyAgIGlzIHBlcm1pdHRlZC4gT25seSBhIHNpbmdsZSBUQVJHRVRfUEFHRV9TSVpFIHJlZ2lvbiBpcyBtYXBwZWQsIHRoZQorICAgc3VwcGxpZWQgc2l6ZSBpcyBvbmx5IHVzZWQgYnkgdGxiX2ZsdXNoX3BhZ2UuICAqLwordm9pZCB0bGJfc2V0X3BhZ2UoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyB2YWRkciwKKyAgICAgICAgICAgICAgICAgIGh3YWRkciBwYWRkciwgaW50IHByb3QsCisgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdGFyZ2V0X3Vsb25nIHNpemUpCit7CisgICAgUGh5c1BhZ2VEZXNjICpwOworICAgIHVuc2lnbmVkIGxvbmcgcGQ7CisgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgIHRhcmdldF91bG9uZyBhZGRyZXNzOworICAgIHRhcmdldF91bG9uZyBjb2RlX2FkZHJlc3M7CisgICAgcHRyZGlmZl90IGFkZGVuZDsKKyAgICBDUFVUTEJFbnRyeSAqdGU7CisgICAgQ1BVV2F0Y2hwb2ludCAqd3A7CisgICAgaHdhZGRyIGlvdGxiOworCisgICAgYXNzZXJ0KHNpemUgPj0gVEFSR0VUX1BBR0VfU0laRSk7CisgICAgaWYgKHNpemUgIT0gVEFSR0VUX1BBR0VfU0laRSkgeworICAgICAgICB0bGJfYWRkX2xhcmdlX3BhZ2UoZW52LCB2YWRkciwgc2l6ZSk7CisgICAgfQorICAgIHAgPSBwaHlzX3BhZ2VfZmluZChwYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICB9IGVsc2UgeworICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgIH0KKyNpZiBkZWZpbmVkKERFQlVHX1RMQikKKyAgICBwcmludGYoInRsYl9zZXRfcGFnZTogdmFkZHI9IiBUQVJHRVRfRk1UX2x4ICIgcGFkZHI9MHgiIFRBUkdFVF9GTVRfcGx4CisgICAgICAgICAgICIgcHJvdD0leCBpZHg9JWQgcGQ9MHglMDhseFxuIiwKKyAgICAgICAgICAgdmFkZHIsIHBhZGRyLCBwcm90LCBtbXVfaWR4LCBwZCk7CisjZW5kaWYKKworICAgIGFkZHJlc3MgPSB2YWRkcjsKKyAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spID4gSU9fTUVNX1JPTSAmJiAhKHBkICYgSU9fTUVNX1JPTUQpKSB7CisgICAgICAgIC8qIElPIG1lbW9yeSBjYXNlIChyb21kIGhhbmRsZWQgbGF0ZXIpICovCisgICAgICAgIGFkZHJlc3MgfD0gVExCX01NSU87CisgICAgfQorICAgIGFkZGVuZCA9IChwdHJkaWZmX3QpcWVtdV9nZXRfcmFtX3B0cihwZCAmIFRBUkdFVF9QQUdFX01BU0spOworICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPD0gSU9fTUVNX1JPTSkgeworICAgICAgICAvKiBOb3JtYWwgUkFNLiAgKi8KKyAgICAgICAgaW90bGIgPSBwZCAmIFRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPT0gSU9fTUVNX1JBTSkKKyAgICAgICAgICAgIGlvdGxiIHw9IElPX01FTV9OT1RESVJUWTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW90bGIgfD0gSU9fTUVNX1JPTTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJTyBoYW5kbGVycyBhcmUgY3VycmVudGx5IHBhc3NlZCBhIHBoeXNpY2FsIGFkZHJlc3MuCisgICAgICAgICAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gcGFzcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBhZGRyZXNzCisgICAgICAgICAgIG9mIHRoYXQgcmVnaW9uLiAgVGhpcyB3b3VsZCBhdm9pZCBoYXZpbmcgdG8gc3BlY2lhbCBjYXNlIFJBTSwKKyAgICAgICAgICAgYW5kIGF2b2lkIGZ1bGwgYWRkcmVzcyBkZWNvZGluZyBpbiBldmVyeSBkZXZpY2UuCisgICAgICAgICAgIFdlIGNhbid0IHVzZSB0aGUgaGlnaCBiaXRzIG9mIHBkIGZvciB0aGlzIGJlY2F1c2UKKyAgICAgICAgICAgSU9fTUVNX1JPTUQgdXNlcyB0aGVzZSBhcyBhIHJhbSBhZGRyZXNzLiAgKi8KKyAgICAgICAgaW90bGIgPSAocGQgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICBpb3RsYiArPSBwLT5yZWdpb25fb2Zmc2V0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW90bGIgKz0gcGFkZHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb2RlX2FkZHJlc3MgPSBhZGRyZXNzOworICAgIC8qIE1ha2UgYWNjZXNzZXMgdG8gcGFnZXMgd2l0aCB3YXRjaHBvaW50cyBnbyB2aWEgdGhlCisgICAgICAgd2F0Y2hwb2ludCB0cmFwIHJvdXRpbmVzLiAgKi8KKyAgICBRVEFJTFFfRk9SRUFDSCh3cCwgJmVudi0+d2F0Y2hwb2ludHMsIGVudHJ5KSB7CisgICAgICAgIGlmICh2YWRkciA9PSAod3AtPnZhZGRyICYgVEFSR0VUX1BBR0VfTUFTSykpIHsKKyAgICAgICAgICAgIGlvdGxiID0gaW9fbWVtX3dhdGNoICsgcGFkZHI7CisgICAgICAgICAgICAvKiBUT0RPOiBUaGUgbWVtb3J5IGNhc2UgY2FuIGJlIG9wdGltaXplZCBieSBub3QgdHJhcHBpbmcKKyAgICAgICAgICAgICAgIHJlYWRzIG9mIHBhZ2VzIHdpdGggYSB3cml0ZSBicmVha3BvaW50LiAgKi8KKyAgICAgICAgICAgIGFkZHJlc3MgfD0gVExCX01NSU87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmRleCA9ICh2YWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKKyAgICBlbnYtPmlvdGxiW21tdV9pZHhdW2luZGV4XSA9IGlvdGxiIC0gdmFkZHI7CisgICAgdGUgPSAmZW52LT50bGJfdGFibGVbbW11X2lkeF1baW5kZXhdOworICAgIHRlLT5hZGRlbmQgPSBhZGRlbmQgLSB2YWRkcjsKKyAgICBpZiAocHJvdCAmIFBBR0VfUkVBRCkgeworICAgICAgICB0ZS0+YWRkcl9yZWFkID0gYWRkcmVzczsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZS0+YWRkcl9yZWFkID0gLTE7CisgICAgfQorCisgICAgaWYgKHByb3QgJiBQQUdFX0VYRUMpIHsKKyAgICAgICAgdGUtPmFkZHJfY29kZSA9IGNvZGVfYWRkcmVzczsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZS0+YWRkcl9jb2RlID0gLTE7CisgICAgfQorICAgIGlmIChwcm90ICYgUEFHRV9XUklURSkgeworICAgICAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spID09IElPX01FTV9ST00gfHwKKyAgICAgICAgICAgIChwZCAmIElPX01FTV9ST01EKSkgeworICAgICAgICAgICAgLyogV3JpdGUgYWNjZXNzIGNhbGxzIHRoZSBJL08gY2FsbGJhY2suICAqLworICAgICAgICAgICAgdGUtPmFkZHJfd3JpdGUgPSBhZGRyZXNzIHwgVExCX01NSU87CisgICAgICAgIH0gZWxzZSBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spID09IElPX01FTV9SQU0gJiYKKyAgICAgICAgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X2lzX2NsZWFuKHBkKSkgeworICAgICAgICAgICAgdGUtPmFkZHJfd3JpdGUgPSBhZGRyZXNzIHwgVExCX05PVERJUlRZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGUtPmFkZHJfd3JpdGUgPSBhZGRyZXNzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGUtPmFkZHJfd3JpdGUgPSAtMTsKKyAgICB9Cit9CisKKy8qIE5PVEU6IHRoaXMgZnVuY3Rpb24gY2FuIHRyaWdnZXIgYW4gZXhjZXB0aW9uICovCisvKiBOT1RFMjogdGhlIHJldHVybmVkIGFkZHJlc3MgaXMgbm90IGV4YWN0bHkgdGhlIHBoeXNpY2FsIGFkZHJlc3M6IGl0CisgICBpcyB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHBoeXNfcmFtX2Jhc2UgKi8KK3RiX3BhZ2VfYWRkcl90IGdldF9wYWdlX2FkZHJfY29kZShDUFVBcmNoU3RhdGUgKmVudjEsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIGludCBtbXVfaWR4LCBwYWdlX2luZGV4LCBwZDsKKyAgICB2b2lkICpwOworCisgICAgcGFnZV9pbmRleCA9IChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpICYgKENQVV9UTEJfU0laRSAtIDEpOworICAgIG1tdV9pZHggPSBjcHVfbW11X2luZGV4KGVudjEpOworICAgIGlmICh1bmxpa2VseShlbnYxLT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uYWRkcl9jb2RlICE9CisgICAgICAgICAgICAgICAgIChhZGRyICYgVEFSR0VUX1BBR0VfTUFTSykpKSB7CisgICAgICAgIGNwdV9sZHViX2NvZGUoZW52MSwgYWRkcik7CisgICAgfQorICAgIHBkID0gZW52MS0+dGxiX3RhYmxlW21tdV9pZHhdW3BhZ2VfaW5kZXhdLmFkZHJfY29kZSAmIH5UQVJHRVRfUEFHRV9NQVNLOworICAgIGlmIChwZCA+IElPX01FTV9ST00gJiYgIShwZCAmIElPX01FTV9ST01EKSkgeworI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKSB8fCBkZWZpbmVkKFRBUkdFVF9NSVBTKQorICAgICAgICBjcHVfdW5hc3NpZ25lZF9hY2Nlc3MoZW52MSwgYWRkciwgMCwgMSwgMCwgNCk7CisjZWxzZQorICAgICAgICBjcHVfYWJvcnQoZW52MSwgIlRyeWluZyB0byBleGVjdXRlIGNvZGUgb3V0c2lkZSBSQU0gb3IgUk9NIGF0IDB4IiBUQVJHRVRfRk1UX2x4ICJcbiIsIGFkZHIpOworI2VuZGlmCisgICAgfQorICAgIHAgPSAodm9pZCAqKSgodWludHB0cl90KWFkZHIgKyBlbnYxLT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uYWRkZW5kKTsKKyAgICByZXR1cm4gcWVtdV9yYW1fYWRkcl9mcm9tX2hvc3Rfbm9mYWlsKHApOworfQorCisjZGVmaW5lIE1NVVNVRkZJWCBfY21tdQorI2RlZmluZSBTT0ZUTU1VX0NPREVfQUNDRVNTCisKKyNkZWZpbmUgU0hJRlQgMAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgorCisjZGVmaW5lIFNISUZUIDEKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTSElGVCAyCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmgiCisKKyNkZWZpbmUgU0hJRlQgMworI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9kaXNhcy5jIGIvYW5kcm9pZC9xZW11MS9kaXNhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZTIxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2Rpc2FzLmMKQEAgLTAsMCArMSw1MTggQEAKKy8qIEdlbmVyYWwgImRpc2Fzc2VtYmxlIHRoaXMgY2h1bmsiIGNvZGUuICBVc2VkIGZvciBkZWJ1Z2dpbmcuICovCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZGlzYXMvYmZkLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImRpc2FzL2Rpc2FzLmgiCisKK3R5cGVkZWYgc3RydWN0IENQVURlYnVnIHsKKyAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyBpbmZvOworICAgIENQVUFyY2hTdGF0ZSAqZW52OworfSBDUFVEZWJ1ZzsKKworLyogRmlsbGVkIGluIGJ5IGVsZmxvYWQuYy4gIFNpbXBsaXN0aWMsIGJ1dCB3aWxsIGRvIGZvciBub3cuICovCitzdHJ1Y3Qgc3ltaW5mbyAqc3ltaW5mb3MgPSBOVUxMOworCisvKiBHZXQgTEVOR1RIIGJ5dGVzIGZyb20gaW5mbydzIGJ1ZmZlciwgYXQgdGFyZ2V0IGFkZHJlc3MgbWVtYWRkci4KKyAgIFRyYW5zZmVyIHRoZW0gdG8gbXlhZGRyLiAgKi8KK2ludAorYnVmZmVyX3JlYWRfbWVtb3J5KGJmZF92bWEgbWVtYWRkciwgYmZkX2J5dGUgKm15YWRkciwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgICBpZiAobWVtYWRkciA8IGluZm8tPmJ1ZmZlcl92bWEKKyAgICAgICAgfHwgbWVtYWRkciArIGxlbmd0aCA+IGluZm8tPmJ1ZmZlcl92bWEgKyBpbmZvLT5idWZmZXJfbGVuZ3RoKQorICAgICAgICAvKiBPdXQgb2YgYm91bmRzLiAgVXNlIEVJTyBiZWNhdXNlIEdEQiB1c2VzIGl0LiAgKi8KKyAgICAgICAgcmV0dXJuIEVJTzsKKyAgICBtZW1jcHkgKG15YWRkciwgaW5mby0+YnVmZmVyICsgKG1lbWFkZHIgLSBpbmZvLT5idWZmZXJfdm1hKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogR2V0IExFTkdUSCBieXRlcyBmcm9tIGluZm8ncyBidWZmZXIsIGF0IHRhcmdldCBhZGRyZXNzIG1lbWFkZHIuCisgICBUcmFuc2ZlciB0aGVtIHRvIG15YWRkci4gICovCitzdGF0aWMgaW50Cit0YXJnZXRfcmVhZF9tZW1vcnkgKGJmZF92bWEgbWVtYWRkciwKKyAgICAgICAgICAgICAgICAgICAgYmZkX2J5dGUgKm15YWRkciwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgICAgQ1BVRGVidWcgKnMgPSBjb250YWluZXJfb2YoaW5mbywgQ1BVRGVidWcsIGluZm8pOworCisgICAgY3B1X21lbW9yeV9yd19kZWJ1ZyhFTlZfR0VUX0NQVShzLT5lbnYpLCBtZW1hZGRyLCBteWFkZHIsIGxlbmd0aCwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhpcyBpcyBpbiByZXNwb25zZSB0bworICAgYW4gZXJyb3IgcmV0dXJuIGZyb20gYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KK3ZvaWQKK3BlcnJvcl9tZW1vcnkgKGludCBzdGF0dXMsIGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIGlmIChzdGF0dXMgIT0gRUlPKQorICAgIC8qIENhbid0IGhhcHBlbi4gICovCisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJVbmtub3duIGVycm9yICVkXG4iLCBzdGF0dXMpOworICBlbHNlCisgICAgLyogQWN0dWFsbHksIGFkZHJlc3MgYmV0d2VlbiBtZW1hZGRyIGFuZCBtZW1hZGRyICsgbGVuIHdhcworICAgICAgIG91dCBvZiBib3VuZHMuICAqLworICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAorCQkJICAgIkFkZHJlc3MgMHglIiBQUkl4NjQgIiBpcyBvdXQgb2YgYm91bmRzLlxuIiwgbWVtYWRkcik7Cit9CisKKy8qIFRoaXMgY291bGQgYmUgaW4gYSBzZXBhcmF0ZSBmaWxlLCB0byBzYXZlIG1pbnVzY3VsZSBhbW91bnRzIG9mIHNwYWNlCisgICBpbiBzdGF0aWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlcy4gICovCisKKy8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaXMgaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KKyAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKKyAgIGFkZHJlc3NlcykuICAqLworCit2b2lkCitnZW5lcmljX3ByaW50X2FkZHJlc3MgKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCUiIFBSSXg2NCwgYWRkcik7Cit9CisKKy8qIFByaW50IGFkZHJlc3MgaW4gaGV4LCB0cnVuY2F0ZWQgdG8gdGhlIHdpZHRoIG9mIGEgdGFyZ2V0IHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyB2b2lkCitnZW5lcmljX3ByaW50X3RhcmdldF9hZGRyZXNzKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgICAgdWludDY0X3QgbWFzayA9IH4wVUxMID4+ICg2NCAtIFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUyk7CisgICAgZ2VuZXJpY19wcmludF9hZGRyZXNzKGFkZHIgJiBtYXNrLCBpbmZvKTsKK30KKworLyogUHJpbnQgYWRkcmVzcyBpbiBoZXgsIHRydW5jYXRlZCB0byB0aGUgd2lkdGggb2YgYSBob3N0IHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyB2b2lkCitnZW5lcmljX3ByaW50X2hvc3RfYWRkcmVzcyhiZmRfdm1hIGFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICAgIHVpbnQ2NF90IG1hc2sgPSB+MFVMTCA+PiAoNjQgLSAoc2l6ZW9mKHZvaWQgKikgKiA4KSk7CisgICAgZ2VuZXJpY19wcmludF9hZGRyZXNzKGFkZHIgJiBtYXNrLCBpbmZvKTsKK30KKworLyogSnVzdCByZXR1cm4gdGhlIGdpdmVuIGFkZHJlc3MuICAqLworCitpbnQKK2dlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MgKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIHJldHVybiAxOworfQorCitiZmRfdm1hIGJmZF9nZXRsNjQgKGNvbnN0IGJmZF9ieXRlICphZGRyKQoreworICB1bnNpZ25lZCBsb25nIGxvbmcgdjsKKworICB2ID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkclswXTsKKyAgdiB8PSAodW5zaWduZWQgbG9uZyBsb25nKSBhZGRyWzFdIDw8IDg7CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkclsyXSA8PCAxNjsKKyAgdiB8PSAodW5zaWduZWQgbG9uZyBsb25nKSBhZGRyWzNdIDw8IDI0OworICB2IHw9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHJbNF0gPDwgMzI7CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcgbG9uZykgYWRkcls1XSA8PCA0MDsKKyAgdiB8PSAodW5zaWduZWQgbG9uZyBsb25nKSBhZGRyWzZdIDw8IDQ4OworICB2IHw9ICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHJbN10gPDwgNTY7CisgIHJldHVybiAoYmZkX3ZtYSkgdjsKK30KKworYmZkX3ZtYSBiZmRfZ2V0bDMyIChjb25zdCBiZmRfYnl0ZSAqYWRkcikKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworCisgIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXTsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCA4OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzJdIDw8IDE2OworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdIDw8IDI0OworICByZXR1cm4gKGJmZF92bWEpIHY7Cit9CisKK2JmZF92bWEgYmZkX2dldGIzMiAoY29uc3QgYmZkX2J5dGUgKmFkZHIpCit7CisgIHVuc2lnbmVkIGxvbmcgdjsKKworICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7CisgIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKKyAgcmV0dXJuIChiZmRfdm1hKSB2OworfQorCitiZmRfdm1hIGJmZF9nZXRsMTYgKGNvbnN0IGJmZF9ieXRlICphZGRyKQoreworICB1bnNpZ25lZCBsb25nIHY7CisKKyAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOworICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7CisgIHJldHVybiAoYmZkX3ZtYSkgdjsKK30KKworYmZkX3ZtYSBiZmRfZ2V0YjE2IChjb25zdCBiZmRfYnl0ZSAqYWRkcikKK3sKKyAgdW5zaWduZWQgbG9uZyB2OworCisgIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKKyAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKKyAgcmV0dXJuIChiZmRfdm1hKSB2OworfQorCisjaWZkZWYgVEFSR0VUX0FSTQorc3RhdGljIGludAorcHJpbnRfaW5zbl90aHVtYjEoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgcmV0dXJuIHByaW50X2luc25fYXJtKHBjIHwgMSwgaW5mbyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwcmludF9pbnNuX29iamR1bXAoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBpbnQgaSwgbiA9IGluZm8tPmJ1ZmZlcl9sZW5ndGg7CisgICAgdWludDhfdCAqYnVmID0gZ19tYWxsb2Mobik7CisKKyAgICBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKHBjLCBidWYsIG4sIGluZm8pOworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpZiAoaSAlIDMyID09IDApIHsKKyAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyhpbmZvLT5zdHJlYW0sICJcbiVzOiAiLCBwcmVmaXgpOworICAgICAgICB9CisgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyhpbmZvLT5zdHJlYW0sICIlMDJ4IiwgYnVmW2ldKTsKKyAgICB9CisKKyAgICBnX2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBwcmludF9pbnNuX29kX2hvc3QoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9vYmpkdW1wKHBjLCBpbmZvLCAiT0JKRC1IIik7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9vZF90YXJnZXQoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgICByZXR1cm4gcHJpbnRfaW5zbl9vYmpkdW1wKHBjLCBpbmZvLCAiT0JKRC1UIik7Cit9CisKKy8qIERpc2Fzc2VtYmxlIHRoaXMgZm9yIG1lIHBsZWFzZS4uLiAoZGVidWdnaW5nKS4gJ2ZsYWdzJyBoYXMgdGhlIGZvbGxvd2luZworICAgdmFsdWVzOgorICAgIGkzODYgLSAxIG1lYW5zIDE2IGJpdCBjb2RlLCAyIG1lYW5zIDY0IGJpdCBjb2RlCisgICAgYXJtICAtIGJpdCAwID0gdGh1bWIsIGJpdCAxID0gcmV2ZXJzZSBlbmRpYW4KKyAgICBwcGMgIC0gbm9uemVybyBtZWFucyBsaXR0bGUgZW5kaWFuCisgICAgb3RoZXIgdGFyZ2V0cyAtIHVudXNlZAorICovCit2b2lkIHRhcmdldF9kaXNhcyhGSUxFICpvdXQsIENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgY29kZSwKKyAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgdGFyZ2V0X3Vsb25nIHBjOworICAgIGludCBjb3VudDsKKyAgICBDUFVEZWJ1ZyBzOworICAgIGludCAoKnByaW50X2luc24pKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pID0gTlVMTDsKKworICAgIElOSVRfRElTQVNTRU1CTEVfSU5GTyhzLmluZm8sIG91dCwgZnByaW50Zik7CisKKyAgICBzLmVudiA9IGVudjsKKyAgICBzLmluZm8ucmVhZF9tZW1vcnlfZnVuYyA9IHRhcmdldF9yZWFkX21lbW9yeTsKKyAgICBzLmluZm8uYnVmZmVyX3ZtYSA9IGNvZGU7CisgICAgcy5pbmZvLmJ1ZmZlcl9sZW5ndGggPSBzaXplOworICAgIHMuaW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3ByaW50X3RhcmdldF9hZGRyZXNzOworCisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHMuaW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKKyNlbHNlCisgICAgcy5pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfSTM4NikKKyAgICBpZiAoZmxhZ3MgPT0gMikgeworICAgICAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3g4Nl82NDsKKyAgICB9IGVsc2UgaWYgKGZsYWdzID09IDEpIHsKKyAgICAgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9pMzg2X2k4MDg2OworICAgIH0gZWxzZSB7CisgICAgICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfaTM4Nl9pMzg2OworICAgIH0KKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9pMzg2OworI2VsaWYgZGVmaW5lZChUQVJHRVRfQVJNKQorICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fdGh1bWIxOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2FybTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgMikgeworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICAgICAgcy5pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOworI2Vsc2UKKyAgICAgICAgcy5pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOworI2VuZGlmCisgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fc3BhcmM7CisjaWZkZWYgVEFSR0VUX1NQQVJDNjQKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YjsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChUQVJHRVRfUFBDKQorICAgIGlmIChmbGFncyA+PiAxNikgeworICAgICAgICBzLmluZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7CisgICAgfQorICAgIGlmIChmbGFncyAmIDB4RkZGRikgeworICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcHJlY2lzZSBkZWZpbml0aW9ucyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHNldCwgdXNlIGl0ICovCisgICAgICAgIHMuaW5mby5tYWNoID0gZmxhZ3MgJiAweEZGRkY7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBUQVJHRVRfUFBDNjQKKyAgICAgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9wcGM2NDsKKyNlbHNlCisgICAgICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfcHBjOworI2VuZGlmCisgICAgfQorICAgIHMuaW5mby5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IChjaGFyICopImFueSI7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fcHBjOworI2VsaWYgZGVmaW5lZChUQVJHRVRfTTY4SykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9tNjhrOworI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fYmlnX21pcHM7CisjZWxzZQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2xpdHRsZV9taXBzOworI2VuZGlmCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TSDQpCisgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9zaDQ7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fc2g7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9BTFBIQSkKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX2FscGhhX2V2NjsKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9hbHBoYTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0NSSVMpCisgICAgaWYgKGZsYWdzICE9IDMyKSB7CisgICAgICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfY3Jpc192MF92MTA7CisgICAgICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2NyaXN2MTA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9jcmlzX3YzMjsKKyAgICAgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fY3Jpc3YzMjsKKyAgICB9CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TMzkwWCkKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3MzOTBfNjQ7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fczM5MDsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX01JQ1JPQkxBWkUpCisgICAgcy5pbmZvLm1hY2ggPSBiZmRfYXJjaF9taWNyb2JsYXplOworICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX21pY3JvYmxhemU7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9NT1hJRSkKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9hcmNoX21veGllOworICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX21veGllOworI2VsaWYgZGVmaW5lZChUQVJHRVRfTE0zMikKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX2xtMzI7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fbG0zMjsKKyNlbmRpZgorICAgIGlmIChwcmludF9pbnNuID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fb2RfdGFyZ2V0OworICAgIH0KKworICAgIGZvciAocGMgPSBjb2RlOyBzaXplID4gMDsgcGMgKz0gY291bnQsIHNpemUgLT0gY291bnQpIHsKKwlmcHJpbnRmKG91dCwgIjB4IiBUQVJHRVRfRk1UX2x4ICI6ICAiLCBwYyk7CisJY291bnQgPSBwcmludF9pbnNuKHBjLCAmcy5pbmZvKTsKKyNpZiAwCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgdWludDhfdCBiOworICAgICAgICAgICAgZnByaW50ZihvdXQsICIgeyIpOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHRhcmdldF9yZWFkX21lbW9yeShwYyArIGksICZiLCAxLCAmcy5pbmZvKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiAlMDJ4IiwgYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiB9Iik7CisgICAgICAgIH0KKyNlbmRpZgorCWZwcmludGYob3V0LCAiXG4iKTsKKwlpZiAoY291bnQgPCAwKQorCSAgICBicmVhazsKKyAgICAgICAgaWYgKHNpemUgPCBjb3VudCkgeworICAgICAgICAgICAgZnByaW50ZihvdXQsCisgICAgICAgICAgICAgICAgICAgICJEaXNhc3NlbWJsZXIgZGlzYWdyZWVzIHdpdGggdHJhbnNsYXRvciBvdmVyIGluc3RydWN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgImRlY29kaW5nXG4iCisgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVwb3J0IHRoaXMgdG8gcWVtdS1kZXZlbEBub25nbnUub3JnXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKiBEaXNhc3NlbWJsZSB0aGlzIGZvciBtZSBwbGVhc2UuLi4gKGRlYnVnZ2luZykuICovCit2b2lkIGRpc2FzKEZJTEUgKm91dCwgdm9pZCAqY29kZSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgIHVpbnRwdHJfdCBwYzsKKyAgICBpbnQgY291bnQ7CisgICAgQ1BVRGVidWcgczsKKyAgICBpbnQgKCpwcmludF9pbnNuKShiZmRfdm1hIHBjLCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSA9IE5VTEw7CisKKyAgICBJTklUX0RJU0FTU0VNQkxFX0lORk8ocy5pbmZvLCBvdXQsIGZwcmludGYpOworICAgIHMuaW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3ByaW50X2hvc3RfYWRkcmVzczsKKworICAgIHMuaW5mby5idWZmZXIgPSBjb2RlOworICAgIHMuaW5mby5idWZmZXJfdm1hID0gKHVpbnRwdHJfdCljb2RlOworICAgIHMuaW5mby5idWZmZXJfbGVuZ3RoID0gc2l6ZTsKKworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisgICAgcy5pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOworI2Vsc2UKKyAgICBzLmluZm8uZW5kaWFuID0gQkZEX0VORElBTl9MSVRUTEU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UQ0dfSU5URVJQUkVURVIpCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fdGNpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX2kzODZfaTM4NjsKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9pMzg2OworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfeDg2XzY0OworICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2kzODY7CisjZWxpZiBkZWZpbmVkKF9BUkNIX1BQQykKKyAgICBzLmluZm8uZGlzYXNzZW1ibGVyX29wdGlvbnMgPSAoY2hhciAqKSJhbnkiOworICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX3BwYzsKKyNlbGlmIGRlZmluZWQoX19hbHBoYV9fKQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2FscGhhOworI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fc3BhcmM7CisgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9zcGFyY192OWI7CisjZWxpZiBkZWZpbmVkKF9fYXJtX18pCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fYXJtOworI2VsaWYgZGVmaW5lZChfX01JUFNFQl9fKQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2JpZ19taXBzOworI2VsaWYgZGVmaW5lZChfX01JUFNFTF9fKQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2xpdHRsZV9taXBzOworI2VsaWYgZGVmaW5lZChfX202OGtfXykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9tNjhrOworI2VsaWYgZGVmaW5lZChfX3MzOTBfXykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9zMzkwOworI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9ocHBhOworI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9pYTY0OworI2VuZGlmCisgICAgaWYgKHByaW50X2luc24gPT0gTlVMTCkgeworICAgICAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9vZF9ob3N0OworICAgIH0KKyAgICBmb3IgKHBjID0gKHVpbnRwdHJfdCljb2RlOyBzaXplID4gMDsgcGMgKz0gY291bnQsIHNpemUgLT0gY291bnQpIHsKKyAgICAgICAgZnByaW50ZihvdXQsICIweCUwOCIgUFJJeFBUUiAiOiAgIiwgcGMpOworICAgICAgICBjb3VudCA9IHByaW50X2luc24ocGMsICZzLmluZm8pOworCWZwcmludGYob3V0LCAiXG4iKTsKKwlpZiAoY291bnQgPCAwKQorCSAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIExvb2sgdXAgc3ltYm9sIGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4gIFJldHVybnMgIiIgaWYgdW5rbm93bi4gKi8KK2NvbnN0IGNoYXIgKmxvb2t1cF9zeW1ib2wodGFyZ2V0X3Vsb25nIG9yaWdfYWRkcikKK3sKKyAgICBjb25zdCBjaGFyICpzeW1ib2wgPSAiIjsKKyAgICBzdHJ1Y3Qgc3ltaW5mbyAqczsKKworICAgIGZvciAocyA9IHN5bWluZm9zOyBzOyBzID0gcy0+bmV4dCkgeworICAgICAgICBzeW1ib2wgPSBzLT5sb29rdXBfc3ltYm9sKHMsIG9yaWdfYWRkcik7CisgICAgICAgIGlmIChzeW1ib2xbMF0gIT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3ltYm9sOworfQorCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKworI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorCitzdGF0aWMgaW50IG1vbml0b3JfZGlzYXNfaXNfcGh5c2ljYWw7CisKK3N0YXRpYyBpbnQKK21vbml0b3JfcmVhZF9tZW1vcnkgKGJmZF92bWEgbWVtYWRkciwgYmZkX2J5dGUgKm15YWRkciwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICAgIENQVURlYnVnICpzID0gY29udGFpbmVyX29mKGluZm8sIENQVURlYnVnLCBpbmZvKTsKKworICAgIGlmIChtb25pdG9yX2Rpc2FzX2lzX3BoeXNpY2FsKSB7CisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChtZW1hZGRyLCBteWFkZHIsIGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3B1X21lbW9yeV9yd19kZWJ1ZyhFTlZfR0VUX0NQVShzLT5lbnYpLCBtZW1hZGRyLG15YWRkciwgbGVuZ3RoLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR0NDX0ZNVF9BVFRSKDIsIDMpCittb25pdG9yX2ZwcmludGYoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIG1vbml0b3JfdnByaW50ZigoTW9uaXRvciAqKXN0cmVhbSwgZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBtb25pdG9yX2Rpc2FzKE1vbml0b3IgKm1vbiwgQ1BVQXJjaFN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHBjLCBpbnQgbmJfaW5zbiwgaW50IGlzX3BoeXNpY2FsLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGNvdW50LCBpOworICAgIENQVURlYnVnIHM7CisgICAgaW50ICgqcHJpbnRfaW5zbikoYmZkX3ZtYSBwYywgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyk7CisKKyAgICBJTklUX0RJU0FTU0VNQkxFX0lORk8ocy5pbmZvLCAoRklMRSAqKW1vbiwgbW9uaXRvcl9mcHJpbnRmKTsKKworICAgIHMuZW52ID0gZW52OworICAgIG1vbml0b3JfZGlzYXNfaXNfcGh5c2ljYWwgPSBpc19waHlzaWNhbDsKKyAgICBzLmluZm8ucmVhZF9tZW1vcnlfZnVuYyA9IG1vbml0b3JfcmVhZF9tZW1vcnk7CisgICAgcy5pbmZvLnByaW50X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfcHJpbnRfdGFyZ2V0X2FkZHJlc3M7CisKKyAgICBzLmluZm8uYnVmZmVyX3ZtYSA9IHBjOworCisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHMuaW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKKyNlbHNlCisgICAgcy5pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfSTM4NikKKyAgICBpZiAoZmxhZ3MgPT0gMikgeworICAgICAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3g4Nl82NDsKKyAgICB9IGVsc2UgaWYgKGZsYWdzID09IDEpIHsKKyAgICAgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9pMzg2X2k4MDg2OworICAgIH0gZWxzZSB7CisgICAgICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfaTM4Nl9pMzg2OworICAgIH0KKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9pMzg2OworI2VsaWYgZGVmaW5lZChUQVJHRVRfQVJNKQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2FybTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX0FMUEhBKQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2FscGhhOworI2VsaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fc3BhcmM7CisjaWZkZWYgVEFSR0VUX1NQQVJDNjQKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YjsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChUQVJHRVRfUFBDKQorI2lmZGVmIFRBUkdFVF9QUEM2NAorICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfcHBjNjQ7CisjZWxzZQorICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfcHBjOworI2VuZGlmCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fcHBjOworI2VsaWYgZGVmaW5lZChUQVJHRVRfTTY4SykKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9tNjhrOworI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fYmlnX21pcHM7CisjZWxzZQorICAgIHByaW50X2luc24gPSBwcmludF9pbnNuX2xpdHRsZV9taXBzOworI2VuZGlmCisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TSDQpCisgICAgcy5pbmZvLm1hY2ggPSBiZmRfbWFjaF9zaDQ7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fc2g7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9TMzkwWCkKKyAgICBzLmluZm8ubWFjaCA9IGJmZF9tYWNoX3MzOTBfNjQ7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fczM5MDsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX01PWElFKQorICAgIHMuaW5mby5tYWNoID0gYmZkX2FyY2hfbW94aWU7CisgICAgcHJpbnRfaW5zbiA9IHByaW50X2luc25fbW94aWU7CisjZWxpZiBkZWZpbmVkKFRBUkdFVF9MTTMyKQorICAgIHMuaW5mby5tYWNoID0gYmZkX21hY2hfbG0zMjsKKyAgICBwcmludF9pbnNuID0gcHJpbnRfaW5zbl9sbTMyOworI2Vsc2UKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIweCIgVEFSR0VUX0ZNVF9seAorICAgICAgICAgICAgICAgICAgICI6IEFzbSBvdXRwdXQgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGFyY2hcbiIsIHBjKTsKKyAgICByZXR1cm47CisjZW5kaWYKKworICAgIGZvcihpID0gMDsgaSA8IG5iX2luc247IGkrKykgeworCW1vbml0b3JfcHJpbnRmKG1vbiwgIjB4IiBUQVJHRVRfRk1UX2x4ICI6ICAiLCBwYyk7CisgICAgICAgIGNvdW50ID0gcHJpbnRfaW5zbihwYywgJnMuaW5mbyk7CisJbW9uaXRvcl9wcmludGYobW9uLCAiXG4iKTsKKwlpZiAoY291bnQgPCAwKQorCSAgICBicmVhazsKKyAgICAgICAgcGMgKz0gY291bnQ7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2Rpc2FzL2FybS5jIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDZkMzJiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9hcm0uYwpAQCAtMCwwICsxLDQxNDEgQEAKKy8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUk0KKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0CisgICAyMDA3LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCisgICBNb2RpZmljYXRpb24gYnkgSmFtZXMgRy4gU21pdGggKGpzbWl0aEBjeWdudXMuY28udWspCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgICBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogU3RhcnQgb2YgcWVtdSBzcGVjaWZpYyBhZGRpdGlvbnMuICBNb3N0bHkgdGhpcyBpcyBzdHViIGRlZmluaXRpb25zCisgICBmb3IgdGhpbmdzIHdlIGRvbid0IGNhcmUgYWJvdXQuICAqLworCisjaW5jbHVkZSAiZGlzYXMvYmZkLmgiCisKKyNkZWZpbmUgQVRUUklCVVRFX1VOVVNFRCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2RlZmluZSBJU1NQQUNFKHgpICgoeCkgPT0gJyAnIHx8ICh4KSA9PSAnXHQnIHx8ICh4KSA9PSAnXG4nKQorCisjZGVmaW5lIEFSTV9FWFRfVjEJIDAKKyNkZWZpbmUgQVJNX0VYVF9WMgkgMAorI2RlZmluZSBBUk1fRVhUX1YyUwkgMAorI2RlZmluZSBBUk1fRVhUX1YzCSAwCisjZGVmaW5lIEFSTV9FWFRfVjNNCSAwCisjZGVmaW5lIEFSTV9FWFRfVjQJIDAKKyNkZWZpbmUgQVJNX0VYVF9WNFQJIDAKKyNkZWZpbmUgQVJNX0VYVF9WNQkgMAorI2RlZmluZSBBUk1fRVhUX1Y1VAkgMAorI2RlZmluZSBBUk1fRVhUX1Y1RXhQCSAwCisjZGVmaW5lIEFSTV9FWFRfVjVFCSAwCisjZGVmaW5lIEFSTV9FWFRfVjVKCSAwCisjZGVmaW5lIEFSTV9FWFRfVjYgICAgICAgMAorI2RlZmluZSBBUk1fRVhUX1Y2SyAgICAgIDAKKyNkZWZpbmUgQVJNX0VYVF9WNlogICAgICAwCisjZGVmaW5lIEFSTV9FWFRfVjZUMgkgMAorI2RlZmluZSBBUk1fRVhUX1Y3CSAwCisjZGVmaW5lIEFSTV9FWFRfRElWCSAwCisKKy8qIENvLXByb2Nlc3NvciBzcGFjZSBleHRlbnNpb25zLiAgKi8KKyNkZWZpbmUgQVJNX0NFWFRfWFNDQUxFICAgMAorI2RlZmluZSBBUk1fQ0VYVF9NQVZFUklDSyAwCisjZGVmaW5lIEFSTV9DRVhUX0lXTU1YVCAgIDAKKworI2RlZmluZSBGUFVfRlBBX0VYVF9WMQkgMAorI2RlZmluZSBGUFVfRlBBX0VYVF9WMgkgMAorI2RlZmluZSBGUFVfVkZQX0VYVF9OT05FIDAKKyNkZWZpbmUgRlBVX1ZGUF9FWFRfVjF4RCAwCisjZGVmaW5lIEZQVV9WRlBfRVhUX1YxCSAwCisjZGVmaW5lIEZQVV9WRlBfRVhUX1YyCSAwCisjZGVmaW5lIEZQVV9NQVZFUklDSwkgMAorI2RlZmluZSBGUFVfVkZQX0VYVF9WMwkgMAorI2RlZmluZSBGUFVfTkVPTl9FWFRfVjEJIDAKKworLyogQXNzdW1lIGhvc3QgdXNlcyBpZWVlIGZsb2F0LiAgKi8KK3N0YXRpYyB2b2lkIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAodW5zaWduZWQgY2hhciAqZGF0YSwgZG91YmxlICpkZXN0KQoreworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgZmxvYXQgZjsKKyAgICB9IHU7CisgICAgdS5pID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpIHwgKGRhdGFbM10gPDwgMjQpOworICAgICpkZXN0ID0gdS5mOworfQorCisvKiBFbmQgb2YgcWVtdSBzcGVjaWZpYyBhZGRpdGlvbnMuICAqLworCisvKiBGSVhNRTogQmVsb25ncyBpbiBnbG9iYWwgaGVhZGVyLiAgKi8KKyNpZm5kZWYgc3RybmVxCisjZGVmaW5lIHN0cm5lcShhLGIsbikJKHN0cm5jbXAgKChhKSwgKGIpLCAobikpID09IDApCisjZW5kaWYKKworI2lmbmRlZiBOVU1fRUxFTQorI2RlZmluZSBOVU1fRUxFTShhKSAgICAgKHNpemVvZiAoYSkgLyBzaXplb2YgKGEpWzBdKQorI2VuZGlmCisKK3N0cnVjdCBvcGNvZGUzMgoreworICB1bnNpZ25lZCBsb25nIGFyY2g7CQkvKiBBcmNoaXRlY3R1cmUgZGVmaW5pbmcgdGhpcyBpbnNuLiAgKi8KKyAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogUmVjb2duaXNlIGluc24gaWYgKG9wJm1hc2spPT12YWx1ZS4gICovCisgIGNvbnN0IGNoYXIgKmFzc2VtYmxlcjsJLyogSG93IHRvIGRpc2Fzc2VtYmxlIHRoaXMgaW5zbi4gICovCit9OworCitzdHJ1Y3Qgb3Bjb2RlMTYKK3sKKyAgdW5zaWduZWQgbG9uZyBhcmNoOwkJLyogQXJjaGl0ZWN0dXJlIGRlZmluaW5nIHRoaXMgaW5zbi4gICovCisgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBtYXNrOwkvKiBSZWNvZ25pc2UgaW5zbiBpZiAob3AmbWFzayk9PXZhbHVlLiAgKi8KKyAgY29uc3QgY2hhciAqYXNzZW1ibGVyOwkvKiBIb3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnNuLiAgKi8KK307CisKKy8qIHByaW50X2luc25fY29wcm9jZXNzb3IgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZvcm1hdCBjb250cm9sIGNvZGVzOgorCisgICAlJQkJCSUKKworICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEgaW4gQVJNIG1vZGUpCisgICAlcQkJCXByaW50IHNoaWZ0ZXIgYXJndW1lbnQKKyAgICV1CQkJcHJpbnQgY29uZGl0aW9uIGNvZGUgKHVuY29uZGl0aW9uYWwgaW4gQVJNIG1vZGUpCisgICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgorICAgJUIJCQlwcmludCB2c3RtL3ZsZG0gcmVnaXN0ZXIgbGlzdAorICAgJUMJCQlwcmludCB2c3RyL3ZsZHIgYWRkcmVzcyBvcGVyYW5kCisgICAlSSAgICAgICAgICAgICAgICAgICBwcmludCBjaXJydXMgc2lnbmVkIHNoaWZ0IGltbWVkaWF0ZTogYml0cyAwLi4zfDQuLjYKKyAgICVGCQkJcHJpbnQgdGhlIENPVU5UIGZpZWxkIG9mIGEgTEZNL1NGTSBpbnN0cnVjdGlvbi4KKyAgICVQCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGFyaXRobWV0aWMgaW5zbgorICAgJVEJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gbGRmL3N0ZiBpbnNuCisgICAlUgkJCXByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKKworICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKKyAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKKyAgICU8Yml0ZmllbGQ+awkJcHJpbnQgaW1tZWRpYXRlIGZvciBWRlB2MyBjb252ZXJzaW9uIGluc3RydWN0aW9uCisgICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKKyAgICU8Yml0ZmllbGQ+WAkJcHJpbnQgdGhlIGJpdGZpZWxkIGFzIDEgaGV4IGRpZ2l0IHdpdGhvdXQgbGVhZGluZyAiMHgiCisgICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCisJCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgorICAgJTxiaXRmaWVsZD53ICAgICAgICAgcHJpbnQgYXMgYW4gaVdNTVh0IHdpZHRoIGZpZWxkIC0gW2Jod2Rdc3MvdXMKKyAgICU8Yml0ZmllbGQ+ZyAgICAgICAgIHByaW50IGFzIGFuIGlXTU1YdCA2NC1iaXQgcmVnaXN0ZXIKKyAgICU8Yml0ZmllbGQ+RyAgICAgICAgIHByaW50IGFzIGFuIGlXTU1YdCBnZW5lcmFsIHB1cnBvc2Ugb3IgY29udHJvbCByZWdpc3RlcgorICAgJTxiaXRmaWVsZD5ECQlwcmludCBhcyBhIE5FT04gRCByZWdpc3RlcgorICAgJTxiaXRmaWVsZD5RCQlwcmludCBhcyBhIE5FT04gUSByZWdpc3RlcgorCisgICAleTxjb2RlPgkJcHJpbnQgYSBzaW5nbGUgcHJlY2lzaW9uIFZGUCByZWcuCisJCQkgIENvZGVzOiAwPT5TbSwgMT0+U2QsIDI9PlNuLCAzPT5tdWx0aS1saXN0LCA0PT5TbSBwYWlyCisgICAlejxjb2RlPgkJcHJpbnQgYSBkb3VibGUgcHJlY2lzaW9uIFZGUCByZWcKKwkJCSAgQ29kZXM6IDA9PkRtLCAxPT5EZCwgMj0+RG4sIDM9Pm11bHRpLWxpc3QKKworICAgJTxiaXRmaWVsZD4nYwlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0ZmllbGQgaXMgYWxsIG9uZXMKKyAgICU8Yml0ZmllbGQ+YGMJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdGZpZWxkIGlzIGFsbCB6ZXJvZXMKKyAgICU8Yml0ZmllbGQ+P2FiLi4uICAgIHNlbGVjdCBmcm9tIGFycmF5IG9mIHZhbHVlcyBpbiBiaWcgZW5kaWFuIG9yZGVyCisKKyAgICVMCQkJcHJpbnQgYXMgYW4gaVdNTVh0IE4vTSB3aWR0aCBmaWVsZC4KKyAgICVaCQkJcHJpbnQgdGhlIEltbWVkaWF0ZSBvZiBhIFdTSFVGSCBpbnN0cnVjdGlvbi4KKyAgICVsCQkJbGlrZSAnQScgZXhjZXB0IHVzZSBieXRlIG9mZnNldHMgZm9yICdCJyAmICdIJworCQkJdmVyc2lvbnMuCisgICAlaQkJCXByaW50IDUtYml0IGltbWVkaWF0ZSBpbiBiaXRzIDgsMy4uMAorCQkJKHByaW50ICIzMiIgd2hlbiAwKQorICAgJXIJCQlwcmludCByZWdpc3RlciBvZmZzZXQgYWRkcmVzcyBmb3Igd2xkdC93c3RyIGluc3RydWN0aW9uCisqLworCisvKiBDb21tb24gY29wcm9jZXNzb3Igb3Bjb2RlcyBzaGFyZWQgYmV0d2VlbiBBcm0gYW5kIFRodW1iLTIuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wY29kZTMyIGNvcHJvY2Vzc29yX29wY29kZXNbXSA9Cit7CisgIC8qIFhTY2FsZSBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMjAwMDEwLCAweDBmZmYwZmYwLCAibWlhJWNcdGFjYzAsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUyODAwMTAsIDB4MGZmZjBmZjAsICJtaWFwaCVjXHRhY2MwLCAlMC0zciwgJTEyLTE1ciJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMmMwMDEwLCAweDBmZmMwZmYwLCAibWlhJTE3J1QlMTdgQiUxNidUJTE2YEIlY1x0YWNjMCwgJTAtM3IsICUxMi0xNXIifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwYzQwMDAwMCwgMHgwZmYwMGZmZiwgIm1hciVjXHRhY2MwLCAlMTItMTVyLCAlMTYtMTlyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGM1MDAwMDAsIDB4MGZmMDBmZmYsICJtcmElY1x0JTEyLTE1ciwgJTE2LTE5ciwgYWNjMCJ9LAorCisgIC8qIEludGVsIFdpcmVsZXNzIE1NWCB0ZWNobm9sb2d5IGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIEZJUlNUX0lXTU1YVF9JTlNOIDB4MGUxMzAxMzAKKyNkZWZpbmUgSVdNTVhUX0lOU05fQ09VTlQgNzMKKyAge0FSTV9DRVhUX0lXTU1YVCwgMHgwZTEzMDEzMCwgMHgwZjNmMGZmZiwgInRhbmRjJTIyLTIzdyVjXHQlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGU0MDAwMTAsIDB4MGZmMDBmM2YsICJ0YmNzdCU2LTd3JWNcdCUxNi0xOWcsICUxMi0xNXIifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTEzMDE3MCwgMHgwZjNmMGZmOCwgInRleHRyYyUyMi0yM3clY1x0JTEyLTE1ciwgIyUwLTJkIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMDAwNzAsIDB4MGYzMDBmZjAsICJ0ZXh0cm0lMz9zdSUyMi0yM3clY1x0JTEyLTE1ciwgJTE2LTE5ZywgIyUwLTJkIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGU2MDAwMTAsIDB4MGZmMDBmMzgsICJ0aW5zciU2LTd3JWNcdCUxNi0xOWcsICUxMi0xNXIsICMlMC0yZCJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMTEwLCAweDBmZjAwZmZmLCAidG1jciVjXHQlMTYtMTlHLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGM0MDAwMDAsIDB4MGZmMDBmZjAsICJ0bWNyciVjXHQlMC0zZywgJTEyLTE1ciwgJTE2LTE5ciJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMmMwMDEwLCAweDBmZmMwZTEwLCAidG1pYSUxNz90YiUxNj90YiVjXHQlNS04ZywgJTAtM3IsICUxMi0xNXIifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTIwMDAxMCwgMHgwZmZmMGUxMCwgInRtaWElY1x0JTUtOGcsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUyODAwMTAsIDB4MGZmZjBlMTAsICJ0bWlhcGglY1x0JTUtOGcsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMDAwMzAsIDB4MGYzMDBmZmYsICJ0bW92bXNrJTIyLTIzdyVjXHQlMTItMTVyLCAlMTYtMTlnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMDAxMTAsIDB4MGZmMDBmZjAsICJ0bXJjJWNcdCUxMi0xNXIsICUxNi0xOUcifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwYzUwMDAwMCwgMHgwZmYwMGZmMCwgInRtcnJjJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMzAxNTAsIDB4MGYzZjBmZmYsICJ0b3JjJTIyLTIzdyVjXHQlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMzAxOTAsIDB4MGYzZjBmZmYsICJ0b3J2c2MlMjItMjN3JWNcdCUxMi0xNXIifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTIwMDFjMCwgMHgwZjMwMGZmZiwgIndhYnMlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTAwMDFjMCwgMHgwZjMwMGZmZiwgIndhY2MlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTAwMDE4MCwgMHgwZjAwMGZmMCwgIndhZGQlMjAtMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUyMDAxYTAsIDB4MGYzMDBmZjAsICJ3YWRkYmh1cyUyMj9tbCVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlYTAwMWEwLCAweDBmZjAwZmYwLCAid2FkZHN1Ymh4JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwMjAsIDB4MGY4MDBmZjAsICJ3YWxpZ25pJWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnLCAjJTIwLTIyZCJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlODAwMDIwLCAweDBmYzAwZmYwLCAid2FsaWduciUyMC0yMWQlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTIwMDAwMCwgMHgwZmUwMGZmMCwgIndhbmQlMjAnbiVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlODAwMDAwLCAweDBmYTAwZmYwLCAid2F2ZzIlMjI/aGIlMjAnciVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlNDAwMDAwLCAweDBmZTAwZmYwLCAid2F2ZzQlMjAnciVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMDYwLCAweDBmMzAwZmYwLCAid2NtcGVxJTIyLTIzdyVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMTAwMDYwLCAweDBmMTAwZmYwLCAid2NtcGd0JTIxP3N1JTIyLTIzdyVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweGZjNTAwMTAwLCAweGZlNTAwZjAwLCAid2xkcmRcdCUxMi0xNWcsICVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4ZmMxMDAxMDAsIDB4ZmU1MDBmMDAsICJ3bGRyd1x0JTEyLTE1RywgJUEifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwYzEwMDAwMCwgMHgwZTEwMGUwMCwgIndsZHIlTCVjXHQlMTItMTVnLCAlbCJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlNDAwMTAwLCAweDBmYzAwZmYwLCAid21hYyUyMT9zdSUyMCd6JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGU4MDAxMDAsIDB4MGZjMDBmZjAsICJ3bWFkZCUyMT9zdSUyMCd4JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGVjMDAxMDAsIDB4MGZkMDBmZjAsICJ3bWFkZCUyMT9zdW4lY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTAwMDE2MCwgMHgwZjEwMGZmMCwgIndtYXglMjE/c3UlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwODAsIDB4MGYxMDBmZTAsICJ3bWVyZ2UlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2csICMlMjEtMjNkIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwYTAsIDB4MGY4MDBmZjAsICJ3bWlhJTIxP3RiJTIwP3RiJTIyJ24lY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTgwMDEyMCwgMHgwZjgwMGZmMCwgIndtaWF3JTIxP3RiJTIwP3RiJTIyJ24lY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTEwMDE2MCwgMHgwZjEwMGZmMCwgIndtaW4lMjE/c3UlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAxMDAsIDB4MGZjMDBmZjAsICJ3bXVsJTIxP3N1JTIwP21sJTIzJ3IlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZWQwMDEwMCwgMHgwZmQwMGZmMCwgIndtdWwlMjE/c3VtciVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlZTAwMGMwLCAweDBmZTAwZmYwLCAid211bHdzbSUyMGByJWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGVjMDAwYzAsIDB4MGZlMDBmZjAsICJ3bXVsd3VtJTIwYHIlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZWIwMDBjMCwgMHgwZmYwMGZmMCwgIndtdWx3bCVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlODAwMGEwLCAweDBmODAwZmYwLCAid3FtaWElMjE/dGIlMjA/dGIlMjInbiVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMTAwMDgwLCAweDBmZDAwZmYwLCAid3FtdWxtJTIxJ3IlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZWMwMDBlMCwgMHgwZmQwMGZmMCwgIndxbXVsd20lMjEnciVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMDAwLCAweDBmZjAwZmYwLCAid29yJWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwODAsIDB4MGYwMDBmZjAsICJ3cGFjayUyMC0yM3clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHhmZTMwMDA0MCwgMHhmZjMwMGVmMCwgIndyb3IlMjItMjN3XHQlMTItMTVnLCAlMTYtMTlnLCAjJWkifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTMwMDA0MCwgMHgwZjMwMGZmMCwgIndyb3IlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUzMDAxNDAsIDB4MGYzMDBmZjAsICJ3cm9yJTIyLTIzd2clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM0cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTAwMDEyMCwgMHgwZmEwMGZmMCwgIndzYWQlMjI/aGIlMjAneiVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMWUwLCAweDBmMDAwZmYwLCAid3NodWZoJWNcdCUxMi0xNWcsICUxNi0xOWcsICMlWiJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweGZlMTAwMDQwLCAweGZmMzAwZWYwLCAid3NsbCUyMi0yM3dcdCUxMi0xNWcsICUxNi0xOWcsICMlaSJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMTAwMDQwLCAweDBmMzAwZmYwLCAid3NsbCUyMi0yM3clOCdnJWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMDAxNDgsIDB4MGYzMDBmZmMsICJ3c2xsJTIyLTIzdyU4J2clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM0cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHhmZTAwMDA0MCwgMHhmZjMwMGVmMCwgIndzcmElMjItMjN3XHQlMTItMTVnLCAlMTYtMTlnLCAjJWkifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTAwMDA0MCwgMHgwZjMwMGZmMCwgIndzcmElMjItMjN3JTgnZyVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMTQ4LCAweDBmMzAwZmZjLCAid3NyYSUyMi0yM3clOCdnJWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNHIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4ZmUyMDAwNDAsIDB4ZmYzMDBlZjAsICJ3c3JsJTIyLTIzd1x0JTEyLTE1ZywgJTE2LTE5ZywgIyVpIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUyMDAwNDAsIDB4MGYzMDBmZjAsICJ3c3JsJTIyLTIzdyU4J2clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTIwMDE0OCwgMHgwZjMwMGZmYywgIndzcmwlMjItMjN3JTgnZyVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zRyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweGZjNDAwMTAwLCAweGZlNTAwZjAwLCAid3N0cmRcdCUxMi0xNWcsICVyIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4ZmMwMDAxMDAsIDB4ZmU1MDBmMDAsICJ3c3Ryd1x0JTEyLTE1RywgJUEifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwYzAwMDAwMCwgMHgwZTEwMGUwMCwgIndzdHIlTCVjXHQlMTItMTVnLCAlbCJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMDAwMWEwLCAweDBmMDAwZmYwLCAid3N1YiUyMC0yM3clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZWQwMDFjMCwgMHgwZmYwMGZmMCwgIndzdWJhZGRoeCVjXHQlMTItMTVnLCAlMTYtMTlnLCAlMC0zZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMTAwMWMwLCAweDBmMzAwZmYwLCAid2Fic2RpZmYlMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwYzAsIDB4MGZkMDBmZmYsICJ3dW5wY2tlaCUyMT9zdWIlY1x0JTEyLTE1ZywgJTE2LTE5ZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlNDAwMGMwLCAweDBmZDAwZmZmLCAid3VucGNrZWglMjE/c3VoJWNcdCUxMi0xNWcsICUxNi0xOWcifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTgwMDBjMCwgMHgwZmQwMGZmZiwgInd1bnBja2VoJTIxP3N1dyVjXHQlMTItMTVnLCAlMTYtMTlnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUwMDAwZTAsIDB4MGYxMDBmZmYsICJ3dW5wY2tlbCUyMT9zdSUyMi0yM3clY1x0JTEyLTE1ZywgJTE2LTE5ZyJ9LAorICB7QVJNX0NFWFRfWFNDQUxFLCAweDBlMTAwMGMwLCAweDBmMzAwZmYwLCAid3VucGNraWglMjItMjN3JWNcdCUxMi0xNWcsICUxNi0xOWcsICUwLTNnIn0sCisgIHtBUk1fQ0VYVF9YU0NBTEUsIDB4MGUxMDAwZTAsIDB4MGYzMDBmZjAsICJ3dW5wY2tpbCUyMi0yM3clY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKyAge0FSTV9DRVhUX1hTQ0FMRSwgMHgwZTEwMDAwMCwgMHgwZmYwMGZmMCwgInd4b3IlY1x0JTEyLTE1ZywgJTE2LTE5ZywgJTAtM2cifSwKKworICAvKiBGbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciAoRlBBKSBpbnN0cnVjdGlvbnMgKi8KKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlMDAwMTAwLCAweDBmZjA4ZjEwLCAiYWRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUxMDAxMDAsIDB4MGZmMDhmMTAsICJtdWYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTIwMDEwMCwgMHgwZmYwOGYxMCwgInN1ZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlMzAwMTAwLCAweDBmZjA4ZjEwLCAicnNmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU0MDAxMDAsIDB4MGZmMDhmMTAsICJkdmYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTUwMDEwMCwgMHgwZmYwOGYxMCwgInJkZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlNjAwMTAwLCAweDBmZjA4ZjEwLCAicG93JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU3MDAxMDAsIDB4MGZmMDhmMTAsICJycHclYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTgwMDEwMCwgMHgwZmYwOGYxMCwgInJtZiVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlOTAwMTAwLCAweDBmZjA4ZjEwLCAiZm1sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGVhMDAxMDAsIDB4MGZmMDhmMTAsICJmZHYlYyVQJVJcdCUxMi0xNGYsICUxNi0xOGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZWIwMDEwMCwgMHgwZmYwOGYxMCwgImZyZCVjJVAlUlx0JTEyLTE0ZiwgJTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlYzAwMTAwLCAweDBmZjA4ZjEwLCAicG9sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUwMDgxMDAsIDB4MGZmMDhmMTAsICJtdmYlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTEwODEwMCwgMHgwZmYwOGYxMCwgIm1uZiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlMjA4MTAwLCAweDBmZjA4ZjEwLCAiYWJzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUzMDgxMDAsIDB4MGZmMDhmMTAsICJybmQlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTQwODEwMCwgMHgwZmYwOGYxMCwgInNxdCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlNTA4MTAwLCAweDBmZjA4ZjEwLCAibG9nJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU2MDgxMDAsIDB4MGZmMDhmMTAsICJsZ24lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTcwODEwMCwgMHgwZmYwOGYxMCwgImV4cCVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlODA4MTAwLCAweDBmZjA4ZjEwLCAic2luJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU5MDgxMDAsIDB4MGZmMDhmMTAsICJjb3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZWEwODEwMCwgMHgwZmYwOGYxMCwgInRhbiVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlYjA4MTAwLCAweDBmZjA4ZjEwLCAiYXNuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGVjMDgxMDAsIDB4MGZmMDhmMTAsICJhY3MlYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZWQwODEwMCwgMHgwZmYwOGYxMCwgImF0biVjJVAlUlx0JTEyLTE0ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlZTA4MTAwLCAweDBmZjA4ZjEwLCAidXJkJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGVmMDgxMDAsIDB4MGZmMDhmMTAsICJucm0lYyVQJVJcdCUxMi0xNGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZTAwMDExMCwgMHgwZmYwMGYxZiwgImZsdCVjJVAlUlx0JTE2LTE4ZiwgJTEyLTE1ciJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUxMDAxMTAsIDB4MGZmZjBmOTgsICJmaXglYyVSXHQlMTItMTVyLCAlMC0yZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUyMDAxMTAsIDB4MGZmZjBmZmYsICJ3ZnMlY1x0JTEyLTE1ciJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGUzMDAxMTAsIDB4MGZmZjBmZmYsICJyZnMlY1x0JTEyLTE1ciJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU0MDAxMTAsIDB4MGZmZjBmZmYsICJ3ZmMlY1x0JTEyLTE1ciJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU1MDAxMTAsIDB4MGZmZjBmZmYsICJyZmMlY1x0JTEyLTE1ciJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGU5MGYxMTAsIDB4MGZmOGZmZjAsICJjbWYlY1x0JTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlYjBmMTEwLCAweDBmZjhmZmYwLCAiY25mJWNcdCUxNi0xOGYsICUwLTNmIn0sCisgIHtGUFVfRlBBX0VYVF9WMSwgMHgwZWQwZjExMCwgMHgwZmY4ZmZmMCwgImNtZmUlY1x0JTE2LTE4ZiwgJTAtM2YifSwKKyAge0ZQVV9GUEFfRVhUX1YxLCAweDBlZjBmMTEwLCAweDBmZjhmZmYwLCAiY25mZSVjXHQlMTYtMThmLCAlMC0zZiJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGMwMDAxMDAsIDB4MGUxMDBmMDAsICJzdGYlYyVRXHQlMTItMTRmLCAlQSJ9LAorICB7RlBVX0ZQQV9FWFRfVjEsIDB4MGMxMDAxMDAsIDB4MGUxMDBmMDAsICJsZGYlYyVRXHQlMTItMTRmLCAlQSJ9LAorICB7RlBVX0ZQQV9FWFRfVjIsIDB4MGMwMDAyMDAsIDB4MGUxMDBmMDAsICJzZm0lY1x0JTEyLTE0ZiwgJUYsICVBIn0sCisgIHtGUFVfRlBBX0VYVF9WMiwgMHgwYzEwMDIwMCwgMHgwZTEwMGYwMCwgImxmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKKworICAvKiBSZWdpc3RlciBsb2FkL3N0b3JlICovCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGQyMDBiMDAsIDB4MGZiMDBmMDEsICJ2c3RtZGIlY1x0JTE2LTE5ciUyMSchLCAlQiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBkMzAwYjAwLCAweDBmYjAwZjAxLCAidmxkbWRiJWNcdCUxNi0xOXIlMjEnISwgJUIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHgwYzgwMGIwMCwgMHgwZjkwMGYwMSwgInZzdG1pYSVjXHQlMTYtMTlyJTIxJyEsICVCIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGM5MDBiMDAsIDB4MGY5MDBmMDEsICJ2bGRtaWElY1x0JTE2LTE5ciUyMSchLCAlQiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBkMDAwYjAwLCAweDBmMzAwZjAwLCAidnN0ciVjXHQlMTItMTUsMjJELCAlQyJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBkMTAwYjAwLCAweDBmMzAwZjAwLCAidmxkciVjXHQlMTItMTUsMjJELCAlQyJ9LAorCisgIC8qIERhdGEgdHJhbnNmZXIgYmV0d2VlbiBBUk0gYW5kIE5FT04gcmVnaXN0ZXJzICovCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGU4MDBiMTAsIDB4MGZmMDBmNzAsICJ2ZHVwJWMuMzJcdCUxNi0xOSw3RCwgJTEyLTE1ciJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlODAwYjMwLCAweDBmZjAwZjcwLCAidmR1cCVjLjE2XHQlMTYtMTksN0QsICUxMi0xNXIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHgwZWEwMGIxMCwgMHgwZmYwMGY3MCwgInZkdXAlYy4zMlx0JTE2LTE5LDdRLCAlMTItMTVyIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGVhMDBiMzAsIDB4MGZmMDBmNzAsICJ2ZHVwJWMuMTZcdCUxNi0xOSw3USwgJTEyLTE1ciJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlYzAwYjEwLCAweDBmZjAwZjcwLCAidmR1cCVjLjhcdCUxNi0xOSw3RCwgJTEyLTE1ciJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlZTAwYjEwLCAweDBmZjAwZjcwLCAidmR1cCVjLjhcdCUxNi0xOSw3USwgJTEyLTE1ciJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBjNDAwYjEwLCAweDBmZjAwZmQwLCAidm1vdiVjXHQlMC0zLDVELCAlMTItMTVyLCAlMTYtMTlyIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGM1MDBiMTAsIDB4MGZmMDBmZDAsICJ2bW92JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHgwZTAwMGIxMCwgMHgwZmQwMGY3MCwgInZtb3YlYy4zMlx0JTE2LTE5LDdEWyUyMWRdLCAlMTItMTVyIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4MGUxMDBiMTAsIDB4MGY1MDBmNzAsICJ2bW92JWMuMzJcdCUxMi0xNXIsICUxNi0xOSw3RFslMjFkXSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlMDAwYjMwLCAweDBmZDAwZjMwLCAidm1vdiVjLjE2XHQlMTYtMTksN0RbJTYsMjFkXSwgJTEyLTE1ciJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlMTAwYjMwLCAweDBmNTAwZjMwLCAidm1vdiVjLiUyMz91czE2XHQlMTItMTVyLCAlMTYtMTksN0RbJTYsMjFkXSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweDBlNDAwYjEwLCAweDBmZDAwZjEwLCAidm1vdiVjLjhcdCUxNi0xOSw3RFslNSw2LDIxZF0sICUxMi0xNXIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHgwZTUwMGIxMCwgMHgwZjUwMGYxMCwgInZtb3YlYy4lMjM/dXM4XHQlMTItMTVyLCAlMTYtMTksN0RbJTUsNiwyMWRdIn0sCisKKyAgLyogRmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgKFZGUCkgaW5zdHJ1Y3Rpb25zICovCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZjFmYTEwLCAweDBmZmZmZmZmLCAiZm1zdGF0JWMifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGVlMDBhMTAsIDB4MGZmZjBmZmYsICJmbXhyJWNcdGZwc2lkLCAlMTItMTVyIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZTEwYTEwLCAweDBmZmYwZmZmLCAiZm14ciVjXHRmcHNjciwgJTEyLTE1ciJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWU2MGExMCwgMHgwZmZmMGZmZiwgImZteHIlY1x0bXZmcjEsICUxMi0xNXIifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGVlNzBhMTAsIDB4MGZmZjBmZmYsICJmbXhyJWNcdG12ZnIwLCAlMTItMTVyIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZTgwYTEwLCAweDBmZmYwZmZmLCAiZm14ciVjXHRmcGV4YywgJTEyLTE1ciJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWU5MGExMCwgMHgwZmZmMGZmZiwgImZteHIlY1x0ZnBpbnN0LCAlMTItMTVyXHRAIEltcGwgZGVmIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZWEwYTEwLCAweDBmZmYwZmZmLCAiZm14ciVjXHRmcGluc3QyLCAlMTItMTVyXHRAIEltcGwgZGVmIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZjAwYTEwLCAweDBmZmYwZmZmLCAiZm1yeCVjXHQlMTItMTVyLCBmcHNpZCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWYxMGExMCwgMHgwZmZmMGZmZiwgImZtcnglY1x0JTEyLTE1ciwgZnBzY3IifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGVmNjBhMTAsIDB4MGZmZjBmZmYsICJmbXJ4JWNcdCUxMi0xNXIsIG12ZnIxIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlZjcwYTEwLCAweDBmZmYwZmZmLCAiZm1yeCVjXHQlMTItMTVyLCBtdmZyMCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWY4MGExMCwgMHgwZmZmMGZmZiwgImZtcnglY1x0JTEyLTE1ciwgZnBleGMifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGVmOTBhMTAsIDB4MGZmZjBmZmYsICJmbXJ4JWNcdCUxMi0xNXIsIGZwaW5zdFx0QCBJbXBsIGRlZiJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWZhMGExMCwgMHgwZmZmMGZmZiwgImZtcnglY1x0JTEyLTE1ciwgZnBpbnN0Mlx0QCBJbXBsIGRlZiJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGUwMDBiMTAsIDB4MGZmMDBmZmYsICJmbWRsciVjXHQlejIsICUxMi0xNXIifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlMTAwYjEwLCAweDBmZjAwZmZmLCAiZm1yZGwlY1x0JTEyLTE1ciwgJXoyIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZTIwMGIxMCwgMHgwZmYwMGZmZiwgImZtZGhyJWNcdCV6MiwgJTEyLTE1ciJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGUzMDBiMTAsIDB4MGZmMDBmZmYsICJmbXJkaCVjXHQlMTItMTVyLCAlejIifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGVlMDBhMTAsIDB4MGZmMDBmZmYsICJmbXhyJWNcdDxpbXBsIGRlZiAlMTYtMTl4PiwgJTEyLTE1ciJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWYwMGExMCwgMHgwZmYwMGZmZiwgImZtcnglY1x0JTEyLTE1ciwgPGltcGwgZGVmICUxNi0xOXg+In0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlMDAwYTEwLCAweDBmZjAwZjdmLCAiZm1zciVjXHQleTIsICUxMi0xNXIifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGUxMDBhMTAsIDB4MGZmMDBmN2YsICJmbXJzJWNcdCUxMi0xNXIsICV5MiJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWI1MGE0MCwgMHgwZmJmMGY3MCwgImZjbXAlNydlenMlY1x0JXkxIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZWI1MGI0MCwgMHgwZmJmMGY3MCwgImZjbXAlNydlemQlY1x0JXoxIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlYjAwYTQwLCAweDBmYmYwZmQwLCAiZmNweXMlY1x0JXkxLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGViMDBhYzAsIDB4MGZiZjBmZDAsICJmYWJzcyVjXHQleTEsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGViMDBiNDAsIDB4MGZiZjBmZDAsICJmY3B5ZCVjXHQlejEsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGViMDBiYzAsIDB4MGZiZjBmZDAsICJmYWJzZCVjXHQlejEsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZWIxMGE0MCwgMHgwZmJmMGZkMCwgImZuZWdzJWNcdCV5MSwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlYjEwYWMwLCAweDBmYmYwZmQwLCAiZnNxcnRzJWNcdCV5MSwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZWIxMGI0MCwgMHgwZmJmMGZkMCwgImZuZWdkJWNcdCV6MSwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZWIxMGJjMCwgMHgwZmJmMGZkMCwgImZzcXJ0ZCVjXHQlejEsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGViNzBhYzAsIDB4MGZiZjBmZDAsICJmY3Z0ZHMlY1x0JXoxLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlYjcwYmMwLCAweDBmYmYwZmQwLCAiZmN2dHNkJWNcdCV5MSwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlYjgwYTQwLCAweDBmYmYwZmQwLCAiZnVpdG9zJWNcdCV5MSwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlYjgwYWMwLCAweDBmYmYwZmQwLCAiZnNpdG9zJWNcdCV5MSwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZWI4MGI0MCwgMHgwZmJmMGZkMCwgImZ1aXRvZCVjXHQlejEsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGViODBiYzAsIDB4MGZiZjBmZDAsICJmc2l0b2QlY1x0JXoxLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGViNDBhNDAsIDB4MGZiZjBmNTAsICJmY21wJTcnZXMlY1x0JXkxLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlYjQwYjQwLCAweDBmYmYwZjUwLCAiZmNtcCU3J2VkJWNcdCV6MSwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMywgMHgwZWJhMGE0MCwgMHgwZmJlMGY1MCwgImYlMTY/dXMlNz9saHRvcyVjXHQleTEsICMlNSwwLTNrIn0sCisgIHtGUFVfVkZQX0VYVF9WMywgMHgwZWJhMGI0MCwgMHgwZmJlMGY1MCwgImYlMTY/dXMlNz9saHRvZCVjXHQlejEsICMlNSwwLTNrIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlYmMwYTQwLCAweDBmYmUwZjUwLCAiZnRvJTE2P3N1aSU3J3pzJWNcdCV5MSwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZWJjMGI0MCwgMHgwZmJlMGY1MCwgImZ0byUxNj9zdWklNyd6ZCVjXHQleTEsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjMsIDB4MGViZTBhNDAsIDB4MGZiZTBmNTAsICJmdG8lMTY/dXMlNz9saHMlY1x0JXkxLCAjJTUsMC0zayJ9LAorICB7RlBVX1ZGUF9FWFRfVjMsIDB4MGViZTBiNDAsIDB4MGZiZTBmNTAsICJmdG8lMTY/dXMlNz9saGQlY1x0JXoxLCAjJTUsMC0zayJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGM1MDBiMTAsIDB4MGZiMDBmZjAsICJmbXJyZCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlejAifSwKKyAge0ZQVV9WRlBfRVhUX1YzLCAweDBlYjAwYTAwLCAweDBmYjAwZmYwLCAiZmNvbnN0cyVjXHQleTEsICMlMC0zLDE2LTE5ZCJ9LAorICB7RlBVX1ZGUF9FWFRfVjMsIDB4MGViMDBiMDAsIDB4MGZiMDBmZjAsICJmY29uc3RkJWNcdCV6MSwgIyUwLTMsMTYtMTlkIn0sCisgIHtGUFVfVkZQX0VYVF9WMiwgMHgwYzQwMGExMCwgMHgwZmYwMGZkMCwgImZtc3JyJWNcdCV5NCwgJTEyLTE1ciwgJTE2LTE5ciJ9LAorICB7RlBVX1ZGUF9FWFRfVjIsIDB4MGM0MDBiMTAsIDB4MGZmMDBmZDAsICJmbWRyciVjXHQlejAsICUxMi0xNXIsICUxNi0xOXIifSwKKyAge0ZQVV9WRlBfRVhUX1YyLCAweDBjNTAwYTEwLCAweDBmZjAwZmQwLCAiZm1ycnMlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJXk0In0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlMDAwYTAwLCAweDBmYjAwZjUwLCAiZm1hY3MlY1x0JXkxLCAleTIsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZTAwMGE0MCwgMHgwZmIwMGY1MCwgImZubWFjcyVjXHQleTEsICV5MiwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZTAwMGIwMCwgMHgwZmIwMGY1MCwgImZtYWNkJWNcdCV6MSwgJXoyLCAlejAifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlMDAwYjQwLCAweDBmYjAwZjUwLCAiZm5tYWNkJWNcdCV6MSwgJXoyLCAlejAifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGUxMDBhMDAsIDB4MGZiMDBmNTAsICJmbXNjcyVjXHQleTEsICV5MiwgJXkwIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlMTAwYTQwLCAweDBmYjAwZjUwLCAiZm5tc2NzJWNcdCV5MSwgJXkyLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlMTAwYjAwLCAweDBmYjAwZjUwLCAiZm1zY2QlY1x0JXoxLCAlejIsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGUxMDBiNDAsIDB4MGZiMDBmNTAsICJmbm1zY2QlY1x0JXoxLCAlejIsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZTIwMGEwMCwgMHgwZmIwMGY1MCwgImZtdWxzJWNcdCV5MSwgJXkyLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGUyMDBhNDAsIDB4MGZiMDBmNTAsICJmbm11bHMlY1x0JXkxLCAleTIsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGUyMDBiMDAsIDB4MGZiMDBmNTAsICJmbXVsZCVjXHQlejEsICV6MiwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZTIwMGI0MCwgMHgwZmIwMGY1MCwgImZubXVsZCVjXHQlejEsICV6MiwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlMzAwYTAwLCAweDBmYjAwZjUwLCAiZmFkZHMlY1x0JXkxLCAleTIsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZTMwMGE0MCwgMHgwZmIwMGY1MCwgImZzdWJzJWNcdCV5MSwgJXkyLCAleTAifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBlMzAwYjAwLCAweDBmYjAwZjUwLCAiZmFkZGQlY1x0JXoxLCAlejIsICV6MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGUzMDBiNDAsIDB4MGZiMDBmNTAsICJmc3ViZCVjXHQlejEsICV6MiwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBlODAwYTAwLCAweDBmYjAwZjUwLCAiZmRpdnMlY1x0JXkxLCAleTIsICV5MCJ9LAorICB7RlBVX1ZGUF9FWFRfVjEsIDB4MGU4MDBiMDAsIDB4MGZiMDBmNTAsICJmZGl2ZCVjXHQlejEsICV6MiwgJXowIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBkMjAwYTAwLCAweDBmYjAwZjAwLCAiZnN0bWRicyVjXHQlMTYtMTlyISwgJXkzIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBkMjAwYjAwLCAweDBmYjAwZjAwLCAiZnN0bWRiJTA/eGQlY1x0JTE2LTE5ciEsICV6MyJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZDMwMGEwMCwgMHgwZmIwMGYwMCwgImZsZG1kYnMlY1x0JTE2LTE5ciEsICV5MyJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwZDMwMGIwMCwgMHgwZmIwMGYwMCwgImZsZG1kYiUwP3hkJWNcdCUxNi0xOXIhLCAlejMifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGQwMDBhMDAsIDB4MGYzMDBmMDAsICJmc3RzJWNcdCV5MSwgJUEifSwKKyAge0ZQVV9WRlBfRVhUX1YxLCAweDBkMDAwYjAwLCAweDBmMzAwZjAwLCAiZnN0ZCVjXHQlejEsICVBIn0sCisgIHtGUFVfVkZQX0VYVF9WMXhELCAweDBkMTAwYTAwLCAweDBmMzAwZjAwLCAiZmxkcyVjXHQleTEsICVBIn0sCisgIHtGUFVfVkZQX0VYVF9WMSwgMHgwZDEwMGIwMCwgMHgwZjMwMGYwMCwgImZsZGQlY1x0JXoxLCAlQSJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwYzgwMGEwMCwgMHgwZjkwMGYwMCwgImZzdG1pYXMlY1x0JTE2LTE5ciUyMSchLCAleTMifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGM4MDBiMDAsIDB4MGY5MDBmMDAsICJmc3RtaWElMD94ZCVjXHQlMTYtMTlyJTIxJyEsICV6MyJ9LAorICB7RlBVX1ZGUF9FWFRfVjF4RCwgMHgwYzkwMGEwMCwgMHgwZjkwMGYwMCwgImZsZG1pYXMlY1x0JTE2LTE5ciUyMSchLCAleTMifSwKKyAge0ZQVV9WRlBfRVhUX1YxeEQsIDB4MGM5MDBiMDAsIDB4MGY5MDBmMDAsICJmbGRtaWElMD94ZCVjXHQlMTYtMTlyJTIxJyEsICV6MyJ9LAorCisgIC8qIENpcnJ1cyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGQxMDA0MDAsIDB4MGY1MDBmMDAsICJjZmxkcnMlY1x0bXZmJTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBjMTAwNDAwLCAweDBmNTAwZjAwLCAiY2ZsZHJzJWNcdG12ZiUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZDUwMDQwMCwgMHgwZjUwMGYwMCwgImNmbGRyZCVjXHRtdmQlMTItMTVkLCAlQSJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGM1MDA0MDAsIDB4MGY1MDBmMDAsICJjZmxkcmQlY1x0bXZkJTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBkMTAwNTAwLCAweDBmNTAwZjAwLCAiY2ZsZHIzMiVjXHRtdmZ4JTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBjMTAwNTAwLCAweDBmNTAwZjAwLCAiY2ZsZHIzMiVjXHRtdmZ4JTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBkNTAwNTAwLCAweDBmNTAwZjAwLCAiY2ZsZHI2NCVjXHRtdmR4JTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBjNTAwNTAwLCAweDBmNTAwZjAwLCAiY2ZsZHI2NCVjXHRtdmR4JTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBkMDAwNDAwLCAweDBmNTAwZjAwLCAiY2ZzdHJzJWNcdG12ZiUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwYzAwMDQwMCwgMHgwZjUwMGYwMCwgImNmc3RycyVjXHRtdmYlMTItMTVkLCAlQSJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGQ0MDA0MDAsIDB4MGY1MDBmMDAsICJjZnN0cmQlY1x0bXZkJTEyLTE1ZCwgJUEifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBjNDAwNDAwLCAweDBmNTAwZjAwLCAiY2ZzdHJkJWNcdG12ZCUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZDAwMDUwMCwgMHgwZjUwMGYwMCwgImNmc3RyMzIlY1x0bXZmeCUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwYzAwMDUwMCwgMHgwZjUwMGYwMCwgImNmc3RyMzIlY1x0bXZmeCUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZDQwMDUwMCwgMHgwZjUwMGYwMCwgImNmc3RyNjQlY1x0bXZkeCUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwYzQwMDUwMCwgMHgwZjUwMGYwMCwgImNmc3RyNjQlY1x0bXZkeCUxMi0xNWQsICVBIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDQ1MCwgMHgwZmYwMGZmMCwgImNmbXZzciVjXHRtdmYlMTYtMTlkLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDQ1MCwgMHgwZmYwMGZmMCwgImNmbXZycyVjXHQlMTItMTVyLCBtdmYlMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDQxMCwgMHgwZmYwMGZmMCwgImNmbXZkbHIlY1x0bXZkJTE2LTE5ZCwgJTEyLTE1ciJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA0MTAsIDB4MGZmMDBmZjAsICJjZm12cmRsJWNcdCUxMi0xNXIsIG12ZCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNDMwLCAweDBmZjAwZmYwLCAiY2ZtdmRociVjXHRtdmQlMTYtMTlkLCAlMTItMTVyIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDQzMCwgMHgwZmYwMGZmZiwgImNmbXZyZGglY1x0JTEyLTE1ciwgbXZkJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUwMDA1MTAsIDB4MGZmMDBmZmYsICJjZm12NjRsciVjXHRtdmR4JTE2LTE5ZCwgJTEyLTE1ciJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA1MTAsIDB4MGZmMDBmZmYsICJjZm12cjY0bCVjXHQlMTItMTVyLCBtdmR4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUwMDA1MzAsIDB4MGZmMDBmZmYsICJjZm12NjRociVjXHRtdmR4JTE2LTE5ZCwgJTEyLTE1ciJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA1MzAsIDB4MGZmMDBmZmYsICJjZm12cjY0aCVjXHQlMTItMTVyLCBtdmR4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUyMDA0NDAsIDB4MGZmMDBmZmYsICJjZm12YWwzMiVjXHRtdmF4JTEyLTE1ZCwgbXZmeCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNDQwLCAweDBmZjAwZmZmLCAiY2ZtdjMyYWwlY1x0bXZmeCUxMi0xNWQsIG12YXglMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTIwMDQ2MCwgMHgwZmYwMGZmZiwgImNmbXZhbTMyJWNcdG12YXglMTItMTVkLCBtdmZ4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA0NjAsIDB4MGZmMDBmZmYsICJjZm12MzJhbSVjXHRtdmZ4JTEyLTE1ZCwgbXZheCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMjAwNDgwLCAweDBmZjAwZmZmLCAiY2ZtdmFoMzIlY1x0bXZheCUxMi0xNWQsIG12ZnglMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDQ4MCwgMHgwZmYwMGZmZiwgImNmbXYzMmFoJWNcdG12ZnglMTItMTVkLCBtdmF4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUyMDA0YTAsIDB4MGZmMDBmZmYsICJjZm12YTMyJWNcdG12YXglMTItMTVkLCBtdmZ4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA0YTAsIDB4MGZmMDBmZmYsICJjZm12MzJhJWNcdG12ZnglMTItMTVkLCBtdmF4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUyMDA0YzAsIDB4MGZmMDBmZmYsICJjZm12YTY0JWNcdG12YXglMTItMTVkLCBtdmR4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA0YzAsIDB4MGZmMDBmZmYsICJjZm12NjRhJWNcdG12ZHglMTItMTVkLCBtdmF4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUyMDA0ZTAsIDB4MGZmZjBmZmYsICJjZm12c2MzMiVjXHRkc3BzYywgbXZkeCUxMi0xNWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNGUwLCAweDBmZmYwZmZmLCAiY2ZtdjMyc2MlY1x0bXZkeCUxMi0xNWQsIGRzcHNjIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDQwMCwgMHgwZmYwMGZmZiwgImNmY3B5cyVjXHRtdmYlMTItMTVkLCBtdmYlMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDQyMCwgMHgwZmYwMGZmZiwgImNmY3B5ZCVjXHRtdmQlMTItMTVkLCBtdmQlMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDQ2MCwgMHgwZmYwMGZmZiwgImNmY3Z0c2QlY1x0bXZkJTEyLTE1ZCwgbXZmJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUwMDA0NDAsIDB4MGZmMDBmZmYsICJjZmN2dGRzJWNcdG12ZiUxMi0xNWQsIG12ZCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNDgwLCAweDBmZjAwZmZmLCAiY2ZjdnQzMnMlY1x0bXZmJTEyLTE1ZCwgbXZmeCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNGEwLCAweDBmZjAwZmZmLCAiY2ZjdnQzMmQlY1x0bXZkJTEyLTE1ZCwgbXZmeCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNGMwLCAweDBmZjAwZmZmLCAiY2ZjdnQ2NHMlY1x0bXZmJTEyLTE1ZCwgbXZkeCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNGUwLCAweDBmZjAwZmZmLCAiY2ZjdnQ2NGQlY1x0bXZkJTEyLTE1ZCwgbXZkeCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNTgwLCAweDBmZjAwZmZmLCAiY2ZjdnRzMzIlY1x0bXZmeCUxMi0xNWQsIG12ZiUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNWEwLCAweDBmZjAwZmZmLCAiY2ZjdnRkMzIlY1x0bXZmeCUxMi0xNWQsIG12ZCUxNi0xOWQifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNWMwLCAweDBmZjAwZmZmLCAiY2Z0cnVuY3MzMiVjXHRtdmZ4JTEyLTE1ZCwgbXZmJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA1ZTAsIDB4MGZmMDBmZmYsICJjZnRydW5jZDMyJWNcdG12ZnglMTItMTVkLCBtdmQlMTYtMTlkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTAwMDU1MCwgMHgwZmYwMGZmMCwgImNmcnNobDMyJWNcdG12ZnglMTYtMTlkLCBtdmZ4JTAtM2QsICUxMi0xNXIifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNTcwLCAweDBmZjAwZmYwLCAiY2Zyc2hsNjQlY1x0bXZkeCUxNi0xOWQsIG12ZHglMC0zZCwgJTEyLTE1ciJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUwMDA1MDAsIDB4MGZmMDBmMTAsICJjZnNoMzIlY1x0bXZmeCUxMi0xNWQsIG12ZnglMTYtMTlkLCAjJUkifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMjAwNTAwLCAweDBmZjAwZjEwLCAiY2ZzaDY0JWNcdG12ZHglMTItMTVkLCBtdmR4JTE2LTE5ZCwgIyVJIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDQ5MCwgMHgwZmYwMGZmMCwgImNmY21wcyVjXHQlMTItMTVyLCBtdmYlMTYtMTlkLCBtdmYlMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA0YjAsIDB4MGZmMDBmZjAsICJjZmNtcGQlY1x0JTEyLTE1ciwgbXZkJTE2LTE5ZCwgbXZkJTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNTkwLCAweDBmZjAwZmYwLCAiY2ZjbXAzMiVjXHQlMTItMTVyLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDViMCwgMHgwZmYwMGZmMCwgImNmY21wNjQlY1x0JTEyLTE1ciwgbXZkeCUxNi0xOWQsIG12ZHglMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0MDAsIDB4MGZmMDBmZmYsICJjZmFic3MlY1x0bXZmJTEyLTE1ZCwgbXZmJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0MjAsIDB4MGZmMDBmZmYsICJjZmFic2QlY1x0bXZkJTEyLTE1ZCwgbXZkJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0NDAsIDB4MGZmMDBmZmYsICJjZm5lZ3MlY1x0bXZmJTEyLTE1ZCwgbXZmJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0NjAsIDB4MGZmMDBmZmYsICJjZm5lZ2QlY1x0bXZkJTEyLTE1ZCwgbXZkJTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0ODAsIDB4MGZmMDBmZjAsICJjZmFkZHMlY1x0bXZmJTEyLTE1ZCwgbXZmJTE2LTE5ZCwgbXZmJTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMzAwNGEwLCAweDBmZjAwZmYwLCAiY2ZhZGRkJWNcdG12ZCUxMi0xNWQsIG12ZCUxNi0xOWQsIG12ZCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTMwMDRjMCwgMHgwZmYwMGZmMCwgImNmc3VicyVjXHRtdmYlMTItMTVkLCBtdmYlMTYtMTlkLCBtdmYlMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA0ZTAsIDB4MGZmMDBmZjAsICJjZnN1YmQlY1x0bXZkJTEyLTE1ZCwgbXZkJTE2LTE5ZCwgbXZkJTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNDAwLCAweDBmZjAwZmYwLCAiY2ZtdWxzJWNcdG12ZiUxMi0xNWQsIG12ZiUxNi0xOWQsIG12ZiUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDQyMCwgMHgwZmYwMGZmMCwgImNmbXVsZCVjXHRtdmQlMTItMTVkLCBtdmQlMTYtMTlkLCBtdmQlMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1MDAsIDB4MGZmMDBmZmYsICJjZmFiczMyJWNcdG12ZnglMTItMTVkLCBtdmZ4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1MjAsIDB4MGZmMDBmZmYsICJjZmFiczY0JWNcdG12ZHglMTItMTVkLCBtdmR4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1NDAsIDB4MGZmMDBmZmYsICJjZm5lZzMyJWNcdG12ZnglMTItMTVkLCBtdmZ4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1NjAsIDB4MGZmMDBmZmYsICJjZm5lZzY0JWNcdG12ZHglMTItMTVkLCBtdmR4JTE2LTE5ZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1ODAsIDB4MGZmMDBmZjAsICJjZmFkZDMyJWNcdG12ZnglMTItMTVkLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTMwMDVhMCwgMHgwZmYwMGZmMCwgImNmYWRkNjQlY1x0bXZkeCUxMi0xNWQsIG12ZHglMTYtMTlkLCBtdmR4JTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMzAwNWMwLCAweDBmZjAwZmYwLCAiY2ZzdWIzMiVjXHRtdmZ4JTEyLTE1ZCwgbXZmeCUxNi0xOWQsIG12ZnglMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUzMDA1ZTAsIDB4MGZmMDBmZjAsICJjZnN1YjY0JWNcdG12ZHglMTItMTVkLCBtdmR4JTE2LTE5ZCwgbXZkeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDUwMCwgMHgwZmYwMGZmMCwgImNmbXVsMzIlY1x0bXZmeCUxMi0xNWQsIG12ZnglMTYtMTlkLCBtdmZ4JTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMTAwNTIwLCAweDBmZjAwZmYwLCAiY2ZtdWw2NCVjXHRtdmR4JTEyLTE1ZCwgbXZkeCUxNi0xOWQsIG12ZHglMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA1NDAsIDB4MGZmMDBmZjAsICJjZm1hYzMyJWNcdG12ZnglMTItMTVkLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTEwMDU2MCwgMHgwZmYwMGZmMCwgImNmbXNjMzIlY1x0bXZmeCUxMi0xNWQsIG12ZnglMTYtMTlkLCBtdmZ4JTAtM2QifSwKKyAge0FSTV9DRVhUX01BVkVSSUNLLCAweDBlMDAwNjAwLCAweDBmZjAwZjEwLCAiY2ZtYWRkMzIlY1x0bXZheCU1LTdkLCBtdmZ4JTEyLTE1ZCwgbXZmeCUxNi0xOWQsIG12ZnglMC0zZCJ9LAorICB7QVJNX0NFWFRfTUFWRVJJQ0ssIDB4MGUxMDA2MDAsIDB4MGZmMDBmMTAsICJjZm1zdWIzMiVjXHRtdmF4JTUtN2QsIG12ZnglMTItMTVkLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTIwMDYwMCwgMHgwZmYwMGYxMCwgImNmbWFkZGEzMiVjXHRtdmF4JTUtN2QsIG12YXglMTItMTVkLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisgIHtBUk1fQ0VYVF9NQVZFUklDSywgMHgwZTMwMDYwMCwgMHgwZmYwMGYxMCwgImNmbXN1YmEzMiVjXHRtdmF4JTUtN2QsIG12YXglMTItMTVkLCBtdmZ4JTE2LTE5ZCwgbXZmeCUwLTNkIn0sCisKKyAgLyogR2VuZXJpYyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KKyAge0FSTV9FWFRfVjIsIDB4MGM0MDAwMDAsIDB4MGZmMDAwMDAsICJtY3JyJWNcdCU4LTExZCwgJTQtN2QsICUxMi0xNXIsICUxNi0xOXIsIGNyJTAtM2QifSwKKyAge0FSTV9FWFRfVjIsIDB4MGM1MDAwMDAsIDB4MGZmMDAwMDAsICJtcnJjJWNcdCU4LTExZCwgJTQtN2QsICUxMi0xNXIsICUxNi0xOXIsIGNyJTAtM2QifSwKKyAge0FSTV9FWFRfVjIsIDB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlY1x0JTgtMTFkLCAlMjAtMjNkLCBjciUxMi0xNWQsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAorICB7QVJNX0VYVF9WMiwgMHgwZTEwMDAxMCwgMHgwZjEwMDAxMCwgIm1yYyVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAorICB7QVJNX0VYVF9WMiwgMHgwZTAwMDAxMCwgMHgwZjEwMDAxMCwgIm1jciVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAorICB7QVJNX0VYVF9WMiwgMHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyUyMidsJWNcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAorICB7QVJNX0VYVF9WMiwgMHgwYzEwMDAwMCwgMHgwZTEwMDAwMCwgImxkYyUyMidsJWNcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAorCisgIC8qIFY2IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLworICB7QVJNX0VYVF9WNiwgMHhmYzUwMDAwMCwgMHhmZmYwMDAwMCwgIm1ycmMyJWNcdCU4LTExZCwgJTQtN2QsICUxMi0xNXIsICUxNi0xOXIsIGNyJTAtM2QifSwKKyAge0FSTV9FWFRfVjYsIDB4ZmM0MDAwMDAsIDB4ZmZmMDAwMDAsICJtY3JyMiVjXHQlOC0xMWQsICU0LTdkLCAlMTItMTVyLCAlMTYtMTlyLCBjciUwLTNkIn0sCisKKyAgLyogVjUgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCisgIHtBUk1fRVhUX1Y1LCAweGZjMTAwMDAwLCAweGZlMTAwMDAwLCAibGRjMiUyMidsJWNcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAorICB7QVJNX0VYVF9WNSwgMHhmYzAwMDAwMCwgMHhmZTEwMDAwMCwgInN0YzIlMjInbCVjXHQlOC0xMWQsIGNyJTEyLTE1ZCwgJUEifSwKKyAge0FSTV9FWFRfVjUsIDB4ZmUwMDAwMDAsIDB4ZmYwMDAwMTAsICJjZHAyJWNcdCU4LTExZCwgJTIwLTIzZCwgY3IlMTItMTVkLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKKyAge0FSTV9FWFRfVjUsIDB4ZmUwMDAwMTAsIDB4ZmYxMDAwMTAsICJtY3IyJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCisgIHtBUk1fRVhUX1Y1LCAweGZlMTAwMDEwLCAweGZmMTAwMDEwLCAibXJjMiVjXHQlOC0xMWQsICUyMS0yM2QsICUxMi0xNXIsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAorCisgIHswLCAwLCAwLCAwfQorfTsKKworLyogTmVvbiBvcGNvZGUgdGFibGU6ICBUaGlzIGRvZXMgbm90IGVuY29kZSB0aGUgdG9wIGJ5dGUgLS0gdGhhdCBpcworICAgY2hlY2tlZCBieSB0aGUgcHJpbnRfaW5zbl9uZW9uIHJvdXRpbmUsIGFzIGl0IGRlcGVuZHMgb24gd2hldGhlciB3ZSBhcmUKKyAgIGRvaW5nIHRodW1iMzIgb3IgYXJtMzIgZGlzYXNzZW1ibHkuICAqLworCisvKiBwcmludF9pbnNuX25lb24gcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZvcm1hdCBjb250cm9sIGNvZGVzOgorCisgICAlJQkJCSUKKworICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZQorICAgJUEJCQlwcmludCB2e3N0LGxkfVsxMjM0XSBvcGVyYW5kcworICAgJUIJCQlwcmludCB2e3N0LGxkfVsxMjM0XSBhbnkgb25lIG9wZXJhbmRzCisgICAlQwkJCXByaW50IHZ7c3QsbGR9WzEyMzRdIHNpbmdsZS0+YWxsIG9wZXJhbmRzCisgICAlRAkJCXByaW50IHNjYWxhcgorICAgJUUJCQlwcmludCB2bW92LCB2bXZuLCB2b3JyLCB2YmljIGVuY29kZWQgY29uc3RhbnQKKyAgICVGCQkJcHJpbnQgdnRibCx2dGJ4IHJlZ2lzdGVyIGxpc3QKKworICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKKyAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKKyAgICU8Yml0ZmllbGQ+ZSAgICAgICAgIHByaW50IHRoZSAyXk4gLSBiaXRmaWVsZCBpbiBkZWNpbWFsCisgICAlPGJpdGZpZWxkPkQJCXByaW50IGFzIGEgTkVPTiBEIHJlZ2lzdGVyCisgICAlPGJpdGZpZWxkPlEJCXByaW50IGFzIGEgTkVPTiBRIHJlZ2lzdGVyCisgICAlPGJpdGZpZWxkPlIJCXByaW50IGFzIGEgTkVPTiBEIG9yIFEgcmVnaXN0ZXIKKyAgICU8Yml0ZmllbGQ+U24JcHJpbnQgYnl0ZSBzY2FsZWQgd2lkdGggbGltaXRlZCBieSBuCisgICAlPGJpdGZpZWxkPlRuCXByaW50IHNob3J0IHNjYWxlZCB3aWR0aCBsaW1pdGVkIGJ5IG4KKyAgICU8Yml0ZmllbGQ+VW4JcHJpbnQgbG9uZyBzY2FsZWQgd2lkdGggbGltaXRlZCBieSBuCisKKyAgICU8Yml0ZmllbGQ+J2MJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdGZpZWxkIGlzIGFsbCBvbmVzCisgICAlPGJpdGZpZWxkPmBjCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXRmaWVsZCBpcyBhbGwgemVyb2VzCisgICAlPGJpdGZpZWxkPj9hYi4uLiAgICBzZWxlY3QgZnJvbSBhcnJheSBvZiB2YWx1ZXMgaW4gYmlnIGVuZGlhbiBvcmRlciAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcGNvZGUzMiBuZW9uX29wY29kZXNbXSA9Cit7CisgIC8qIEV4dHJhY3QgKi8KKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmIwMDg0MCwgMHhmZmIwMDg1MCwgInZleHQlYy44XHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIsICMlOC0xMWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmIwMDAwMCwgMHhmZmIwMDgxMCwgInZleHQlYy44XHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIsICMlOC0xMWQifSwKKworICAvKiBNb3ZlIGRhdGEgZWxlbWVudCB0byBhbGwgbGFuZXMgKi8KKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2I0MGMwMCwgMHhmZmI3MGY5MCwgInZkdXAlYy4zMlx0JTEyLTE1LDIyUiwgJTAtMyw1RFslMTlkXSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjIwYzAwLCAweGZmYjMwZjkwLCAidmR1cCVjLjE2XHQlMTItMTUsMjJSLCAlMC0zLDVEWyUxOC0xOWRdIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTBjMDAsIDB4ZmZiMTBmOTAsICJ2ZHVwJWMuOFx0JTEyLTE1LDIyUiwgJTAtMyw1RFslMTctMTlkXSJ9LAorCisgIC8qIFRhYmxlIGxvb2t1cCAqLworICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwODAwLCAweGZmYjAwYzUwLCAidnRibCVjLjhcdCUxMi0xNSwyMkQsICVGLCAlMC0zLDVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMDA4NDAsIDB4ZmZiMDBjNTAsICJ2dGJ4JWMuOFx0JTEyLTE1LDIyRCwgJUYsICUwLTMsNUQifSwKKworICAvKiBUd28gcmVnaXN0ZXJzLCBtaXNjZWxsYW5lb3VzICovCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODBhMTAsIDB4ZmViZjBmZDAsICJ2bW92bCVjLiUyND91czhcdCUxMi0xNSwyMlEsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjkwMGExMCwgMHhmZWJmMGZkMCwgInZtb3ZsJWMuJTI0P3VzMTZcdCUxMi0xNSwyMlEsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMGExMCwgMHhmZWJmMGZkMCwgInZtb3ZsJWMuJTI0P3VzMzJcdCUxMi0xNSwyMlEsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IwMDUwMCwgMHhmZmJmMGY5MCwgInZjbnQlYy44XHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMDA1ODAsIDB4ZmZiZjBmOTAsICJ2bXZuJWNcdCUxMi0xNSwyMlIsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IyMDAwMCwgMHhmZmJmMGY5MCwgInZzd3AlY1x0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjIwMjAwLCAweGZmYjMwZmQwLCAidm1vdm4lYy5pJTE4LTE5VDJcdCUxMi0xNSwyMkQsICUwLTMsNVEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IyMDI0MCwgMHhmZmIzMGZkMCwgInZxbW92dW4lYy5zJTE4LTE5VDJcdCUxMi0xNSwyMkQsICUwLTMsNVEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IyMDI4MCwgMHhmZmIzMGZkMCwgInZxbW92biVjLnMlMTgtMTlUMlx0JTEyLTE1LDIyRCwgJTAtMyw1USJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjIwMmMwLCAweGZmYjMwZmQwLCAidnFtb3ZuJWMudSUxOC0xOVQyXHQlMTItMTUsMjJELCAlMC0zLDVRIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMjAzMDAsIDB4ZmZiMzBmZDAsICJ2c2hsbCVjLmklMTgtMTlTMlx0JTEyLTE1LDIyUSwgJTAtMyw1RCwgIyUxOC0xOVMyIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiYjA0MDAsIDB4ZmZiZjBlOTAsICJ2cmVjcGUlYy4lOD9mdSUxOC0xOVMyXHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiYjA0ODAsIDB4ZmZiZjBlOTAsICJ2cnNxcnRlJWMuJTg/ZnUlMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwMDAwLCAweGZmYjMwZjkwLCAidnJldjY0JWMuJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IwMDA4MCwgMHhmZmIzMGY5MCwgInZyZXYzMiVjLiUxOC0xOVMyXHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMDAxMDAsIDB4ZmZiMzBmOTAsICJ2cmV2MTYlYy4lMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwNDAwLCAweGZmYjMwZjkwLCAidmNscyVjLnMlMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwNDgwLCAweGZmYjMwZjkwLCAidmNseiVjLmklMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwNzAwLCAweGZmYjMwZjkwLCAidnFhYnMlYy5zJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IwMDc4MCwgMHhmZmIzMGY5MCwgInZxbmVnJWMucyUxOC0xOVMyXHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMjAwODAsIDB4ZmZiMzBmOTAsICJ2dHJuJWMuJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IyMDEwMCwgMHhmZmIzMGY5MCwgInZ1enAlYy4lMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjIwMTgwLCAweGZmYjMwZjkwLCAidnppcCVjLiUxOC0xOVMyXHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAwMDAsIDB4ZmZiMzBiOTAsICJ2Y2d0JWMuJTEwP2ZzJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMwIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAwODAsIDB4ZmZiMzBiOTAsICJ2Y2dlJWMuJTEwP2ZzJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMwIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAxMDAsIDB4ZmZiMzBiOTAsICJ2Y2VxJWMuJTEwP2ZpJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMwIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAxODAsIDB4ZmZiMzBiOTAsICJ2Y2xlJWMuJTEwP2ZzJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMwIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAyMDAsIDB4ZmZiMzBiOTAsICJ2Y2x0JWMuJTEwP2ZzJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMwIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjNiMTAzMDAsIDB4ZmZiMzBiOTAsICJ2YWJzJWMuJTEwP2ZzJTE4LTE5UzJcdCUxMi0xNSwyMlIsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2IxMDM4MCwgMHhmZmIzMGI5MCwgInZuZWclYy4lMTA/ZnMlMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwMjAwLCAweGZmYjMwZjEwLCAidnBhZGRsJWMuJTc/dXMlMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjAwNjAwLCAweGZmYjMwZjEwLCAidnBhZGFsJWMuJTc/dXMlMTgtMTlTMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzYjMwNjAwLCAweGZmYjMwZTEwLCAidmN2dCVjLiU3LTg/dXNmZiUxOC0xOVNhLiU3LTg/ZmZ1cyUxOC0xOVNhXHQlMTItMTUsMjJSLCAlMC0zLDVSIn0sCisKKyAgLyogVGhyZWUgcmVnaXN0ZXJzIG9mIHRoZSBzYW1lIGxlbmd0aCAqLworICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwMTEwLCAweGZmYjAwZjEwLCAidmFuZCVjXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjEwMDExMCwgMHhmZmIwMGYxMCwgInZiaWMlY1x0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIyMDAxMTAsIDB4ZmZiMDBmMTAsICJ2b3JyJWNcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMzAwMTEwLCAweGZmYjAwZjEwLCAidm9ybiVjXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzAwMDExMCwgMHhmZmIwMGYxMCwgInZlb3IlY1x0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjMxMDAxMTAsIDB4ZmZiMDBmMTAsICJ2YnNsJWNcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzMjAwMTEwLCAweGZmYjAwZjEwLCAidmJpdCVjXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzMwMDExMCwgMHhmZmIwMGYxMCwgInZiaWYlY1x0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDBkMDAsIDB4ZmZhMDBmMTAsICJ2YWRkJWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMGQxMCwgMHhmZmEwMGYxMCwgInZtbGElYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwZTAwLCAweGZmYTAwZjEwLCAidmNlcSVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDBmMDAsIDB4ZmZhMDBmMTAsICJ2bWF4JWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMGYxMCwgMHhmZmEwMGYxMCwgInZyZWNwcyVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIyMDBkMDAsIDB4ZmZhMDBmMTAsICJ2c3ViJWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjIwMGQxMCwgMHhmZmEwMGYxMCwgInZtbHMlYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMjAwZjAwLCAweGZmYTAwZjEwLCAidm1pbiVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIyMDBmMTAsIDB4ZmZhMDBmMTAsICJ2cnNxcnRzJWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzAwMGQwMCwgMHhmZmEwMGYxMCwgInZwYWRkJWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzAwMGQxMCwgMHhmZmEwMGYxMCwgInZtdWwlYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzMDAwZTAwLCAweGZmYTAwZjEwLCAidmNnZSVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjMwMDBlMTAsIDB4ZmZhMDBmMTAsICJ2YWNnZSVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjMwMDBmMDAsIDB4ZmZhMDBmMTAsICJ2cG1heCVjLmYlMjBVMFx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjMyMDBkMDAsIDB4ZmZhMDBmMTAsICJ2YWJkJWMuZiUyMFUwXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzIwMGUwMCwgMHhmZmEwMGYxMCwgInZjZ3QlYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzMjAwZTEwLCAweGZmYTAwZjEwLCAidmFjZ3QlYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzMjAwZjAwLCAweGZmYTAwZjEwLCAidnBtaW4lYy5mJTIwVTBcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwODAwLCAweGZmODAwZjEwLCAidmFkZCVjLmklMjAtMjFTM1x0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDA4MTAsIDB4ZmY4MDBmMTAsICJ2dHN0JWMuJTIwLTIxUzJcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwOTAwLCAweGZmODAwZjEwLCAidm1sYSVjLmklMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDBiMDAsIDB4ZmY4MDBmMTAsICJ2cWRtdWxoJWMucyUyMC0yMVM2XHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMGIxMCwgMHhmZjgwMGYxMCwgInZwYWRkJWMuaSUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzAwMDgwMCwgMHhmZjgwMGYxMCwgInZzdWIlYy5pJTIwLTIxUzNcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzMDAwODEwLCAweGZmODAwZjEwLCAidmNlcSVjLmklMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjMwMDA5MDAsIDB4ZmY4MDBmMTAsICJ2bWxzJWMuaSUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzAwMGIwMCwgMHhmZjgwMGYxMCwgInZxcmRtdWxoJWMucyUyMC0yMVM2XHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDAwMCwgMHhmZTgwMGYxMCwgInZoYWRkJWMuJTI0P3VzJTIwLTIxUzJcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwMDEwLCAweGZlODAwZjEwLCAidnFhZGQlYy4lMjQ/dXMlMjAtMjFTM1x0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDAxMDAsIDB4ZmU4MDBmMTAsICJ2cmhhZGQlYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDAyMDAsIDB4ZmU4MDBmMTAsICJ2aHN1YiVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDIxMCwgMHhmZTgwMGYxMCwgInZxc3ViJWMuJTI0P3VzJTIwLTIxUzNcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwMzAwLCAweGZlODAwZjEwLCAidmNndCVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDMxMCwgMHhmZTgwMGYxMCwgInZjZ2UlYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDA0MDAsIDB4ZmU4MDBmMTAsICJ2c2hsJWMuJTI0P3VzJTIwLTIxUzNcdCUxMi0xNSwyMlIsICUwLTMsNVIsICUxNi0xOSw3UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwNDEwLCAweGZlODAwZjEwLCAidnFzaGwlYy4lMjQ/dXMlMjAtMjFTM1x0JTEyLTE1LDIyUiwgJTAtMyw1UiwgJTE2LTE5LDdSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDA1MDAsIDB4ZmU4MDBmMTAsICJ2cnNobCVjLiUyND91cyUyMC0yMVMzXHQlMTItMTUsMjJSLCAlMC0zLDVSLCAlMTYtMTksN1IifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDUxMCwgMHhmZTgwMGYxMCwgInZxcnNobCVjLiUyND91cyUyMC0yMVMzXHQlMTItMTUsMjJSLCAlMC0zLDVSLCAlMTYtMTksN1IifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDYwMCwgMHhmZTgwMGYxMCwgInZtYXglYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDA2MTAsIDB4ZmU4MDBmMTAsICJ2bWluJWMuJTI0P3VzJTIwLTIxUzJcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwNzAwLCAweGZlODAwZjEwLCAidmFiZCVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjAwMDcxMCwgMHhmZTgwMGYxMCwgInZhYmElYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDA5MTAsIDB4ZmU4MDBmMTAsICJ2bXVsJWMuJTI0P3BpJTIwLTIxUzJcdCUxMi0xNSwyMlIsICUxNi0xOSw3UiwgJTAtMyw1UiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyMDAwYTAwLCAweGZlODAwZjEwLCAidnBtYXglYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUiwgJTE2LTE5LDdSLCAlMC0zLDVSIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjIwMDBhMTAsIDB4ZmU4MDBmMTAsICJ2cG1pbiVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJSLCAlMTYtMTksN1IsICUwLTMsNVIifSwKKworICAvKiBPbmUgcmVnaXN0ZXIgYW5kIGFuIGltbWVkaWF0ZSB2YWx1ZSAqLworICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwZTEwLCAweGZlYjgwZmIwLCAidm1vdiVjLmk4XHQlMTItMTUsMjJSLCAlRSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwZTMwLCAweGZlYjgwZmIwLCAidm1vdiVjLmk2NFx0JTEyLTE1LDIyUiwgJUUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMGYxMCwgMHhmZWI4MGZiMCwgInZtb3YlYy5mMzJcdCUxMi0xNSwyMlIsICVFIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA4MTAsIDB4ZmViODBkYjAsICJ2bW92JWMuaTE2XHQlMTItMTUsMjJSLCAlRSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwODMwLCAweGZlYjgwZGIwLCAidm12biVjLmkxNlx0JTEyLTE1LDIyUiwgJUUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDkxMCwgMHhmZWI4MGRiMCwgInZvcnIlYy5pMTZcdCUxMi0xNSwyMlIsICVFIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA5MzAsIDB4ZmViODBkYjAsICJ2YmljJWMuaTE2XHQlMTItMTUsMjJSLCAlRSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwYzEwLCAweGZlYjgwZWIwLCAidm1vdiVjLmkzMlx0JTEyLTE1LDIyUiwgJUUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMGMzMCwgMHhmZWI4MGViMCwgInZtdm4lYy5pMzJcdCUxMi0xNSwyMlIsICVFIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAxMTAsIDB4ZmViODA5YjAsICJ2b3JyJWMuaTMyXHQlMTItMTUsMjJSLCAlRSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwMTMwLCAweGZlYjgwOWIwLCAidmJpYyVjLmkzMlx0JTEyLTE1LDIyUiwgJUUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDAxMCwgMHhmZWI4MDhiMCwgInZtb3YlYy5pMzJcdCUxMi0xNSwyMlIsICVFIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAwMzAsIDB4ZmViODA4YjAsICJ2bXZuJWMuaTMyXHQlMTItMTUsMjJSLCAlRSJ9LAorCisgIC8qIFR3byByZWdpc3RlcnMgYW5kIGEgc2hpZnQgYW1vdW50ICovCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODA4MTAsIDB4ZmZiODBmZDAsICJ2c2hybiVjLmkxNlx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0xOGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjg4MDg1MCwgMHhmZmI4MGZkMCwgInZyc2hybiVjLmkxNlx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0xOGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjg4MDgxMCwgMHhmZWI4MGZkMCwgInZxc2hydW4lYy5zMTZcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMThlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODA4NTAsIDB4ZmViODBmZDAsICJ2cXJzaHJ1biVjLnMxNlx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0xOGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjg4MDkxMCwgMHhmZWI4MGZkMCwgInZxc2hybiVjLiUyND91czE2XHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTE4ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODgwOTUwLCAweGZlYjgwZmQwLCAidnFyc2hybiVjLiUyND91czE2XHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTE4ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODgwYTEwLCAweGZlYjgwZmQwLCAidnNobGwlYy4lMjQ/dXM4XHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTE4ZCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyOTAwODEwLCAweGZmYjAwZmQwLCAidnNocm4lYy5pMzJcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMTllIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI5MDA4NTAsIDB4ZmZiMDBmZDAsICJ2cnNocm4lYy5pMzJcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMTllIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODA1MTAsIDB4ZmZiODBmOTAsICJ2c2hsJWMuJTI0P3VzOFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzg4MDQxMCwgMHhmZmI4MGY5MCwgInZzcmklYy44XHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTE4ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODgwNTEwLCAweGZmYjgwZjkwLCAidnNsaSVjLjhcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMThkIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjM4ODA2MTAsIDB4ZmZiODBmOTAsICJ2cXNobHUlYy5zOFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjkwMDgxMCwgMHhmZWIwMGZkMCwgInZxc2hydW4lYy5zMzJcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMTllIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI5MDA4NTAsIDB4ZmViMDBmZDAsICJ2cXJzaHJ1biVjLnMzMlx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0xOWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjkwMDkxMCwgMHhmZWIwMGZkMCwgInZxc2hybiVjLiUyND91czMyXHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTE5ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyOTAwOTUwLCAweGZlYjAwZmQwLCAidnFyc2hybiVjLiUyND91czMyXHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTE5ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyOTAwYTEwLCAweGZlYjAwZmQwLCAidnNobGwlYy4lMjQ/dXMxNlx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0xOWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjg4MDAxMCwgMHhmZWI4MGY5MCwgInZzaHIlYy4lMjQ/dXM4XHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTE4ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODgwMTEwLCAweGZlYjgwZjkwLCAidnNyYSVjLiUyND91czhcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMThlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODAyMTAsIDB4ZmViODBmOTAsICJ2cnNociVjLiUyND91czhcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMThlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODAzMTAsIDB4ZmViODBmOTAsICJ2cnNyYSVjLiUyND91czhcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMThlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4ODA3MTAsIDB4ZmViODBmOTAsICJ2cXNobCVjLiUyND91czhcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMThkIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjJhMDA4MTAsIDB4ZmZhMDBmZDAsICJ2c2hybiVjLmk2NFx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMDg1MCwgMHhmZmEwMGZkMCwgInZyc2hybiVjLmk2NFx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjkwMDUxMCwgMHhmZmIwMGY5MCwgInZzaGwlYy4lMjQ/dXMxNlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzkwMDQxMCwgMHhmZmIwMGY5MCwgInZzcmklYy4xNlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzkwMDUxMCwgMHhmZmIwMGY5MCwgInZzbGklYy4xNlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzkwMDYxMCwgMHhmZmIwMGY5MCwgInZxc2hsdSVjLnMxNlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMGExMCwgMHhmZWEwMGZkMCwgInZzaGxsJWMuJTI0P3VzMzJcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMjBkIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI5MDAwMTAsIDB4ZmViMDBmOTAsICJ2c2hyJWMuJTI0P3VzMTZcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMTllIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI5MDAxMTAsIDB4ZmViMDBmOTAsICJ2c3JhJWMuJTI0P3VzMTZcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMTllIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI5MDAyMTAsIDB4ZmViMDBmOTAsICJ2cnNociVjLiUyND91czE2XHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTE5ZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyOTAwMzEwLCAweGZlYjAwZjkwLCAidnJzcmElYy4lMjQ/dXMxNlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0xOWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjkwMDcxMCwgMHhmZWIwMGY5MCwgInZxc2hsJWMuJTI0P3VzMTZcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMTlkIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA4MTAsIDB4ZmVjMDBmZDAsICJ2cXNocnVuJWMuczY0XHQlMTItMTUsMjJELCAlMC0zLDVRLCAjJTE2LTIwZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwODUwLCAweGZlYzAwZmQwLCAidnFyc2hydW4lYy5zNjRcdCUxMi0xNSwyMkQsICUwLTMsNVEsICMlMTYtMjBlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA5MTAsIDB4ZmVjMDBmZDAsICJ2cXNocm4lYy4lMjQ/dXM2NFx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDk1MCwgMHhmZWMwMGZkMCwgInZxcnNocm4lYy4lMjQ/dXM2NFx0JTEyLTE1LDIyRCwgJTAtMyw1USwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMDUxMCwgMHhmZmEwMGY5MCwgInZzaGwlYy4lMjQ/dXMzMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2EwMDQxMCwgMHhmZmEwMGY5MCwgInZzcmklYy4zMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2EwMDUxMCwgMHhmZmEwMGY5MCwgInZzbGklYy4zMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmM2EwMDYxMCwgMHhmZmEwMGY5MCwgInZxc2hsdSVjLnMzMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMDAxMCwgMHhmZWEwMGY5MCwgInZzaHIlYy4lMjQ/dXMzMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMDExMCwgMHhmZWEwMGY5MCwgInZzcmElYy4lMjQ/dXMzMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMDIxMCwgMHhmZWEwMGY5MCwgInZyc2hyJWMuJTI0P3VzMzJcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMjBlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjJhMDAzMTAsIDB4ZmVhMDBmOTAsICJ2cnNyYSVjLiUyND91czMyXHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTIwZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyYTAwNzEwLCAweGZlYTAwZjkwLCAidnFzaGwlYy4lMjQ/dXMzMlx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMGQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDU5MCwgMHhmZjgwMGY5MCwgInZzaGwlYy4lMjQ/dXM2NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzgwMDQ5MCwgMHhmZjgwMGY5MCwgInZzcmklYy42NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzgwMDU5MCwgMHhmZjgwMGY5MCwgInZzbGklYy42NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzgwMDY5MCwgMHhmZjgwMGY5MCwgInZxc2hsdSVjLnM2NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDA5MCwgMHhmZTgwMGY5MCwgInZzaHIlYy4lMjQ/dXM2NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDE5MCwgMHhmZTgwMGY5MCwgInZzcmElYy4lMjQ/dXM2NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWUifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDI5MCwgMHhmZTgwMGY5MCwgInZyc2hyJWMuJTI0P3VzNjRcdCUxMi0xNSwyMlIsICUwLTMsNVIsICMlMTYtMjFlIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAzOTAsIDB4ZmU4MDBmOTAsICJ2cnNyYSVjLiUyND91czY0XHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTIxZSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwNzkwLCAweGZlODAwZjkwLCAidnFzaGwlYy4lMjQ/dXM2NFx0JTEyLTE1LDIyUiwgJTAtMyw1UiwgIyUxNi0yMWQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMmEwMGUxMCwgMHhmZWEwMGU5MCwgInZjdnQlYy4lMjQsOD91c2ZmMzIuJTI0LDg/ZmZ1czMyXHQlMTItMTUsMjJSLCAlMC0zLDVSLCAjJTE2LTIwZSJ9LAorCisgIC8qIFRocmVlIHJlZ2lzdGVycyBvZiBkaWZmZXJlbnQgbGVuZ3RocyAqLworICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwZTAwLCAweGZlYTAwZjUwLCAidm11bGwlYy5wJTIwUzBcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJTAtMyw1RCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwNDAwLCAweGZmODAwZjUwLCAidmFkZGhuJWMuaSUyMC0yMVQyXHQlMTItMTUsMjJELCAlMTYtMTksN1EsICUwLTMsNVEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDYwMCwgMHhmZjgwMGY1MCwgInZzdWJobiVjLmklMjAtMjFUMlx0JTEyLTE1LDIyRCwgJTE2LTE5LDdRLCAlMC0zLDVRIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA5MDAsIDB4ZmY4MDBmNTAsICJ2cWRtbGFsJWMucyUyMC0yMVM2XHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMGIwMCwgMHhmZjgwMGY1MCwgInZxZG1sc2wlYy5zJTIwLTIxUzZcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJTAtMyw1RCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwZDAwLCAweGZmODAwZjUwLCAidnFkbXVsbCVjLnMlMjAtMjFTNlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdELCAlMC0zLDVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjM4MDA0MDAsIDB4ZmY4MDBmNTAsICJ2cmFkZGhuJWMuaSUyMC0yMVQyXHQlMTItMTUsMjJELCAlMTYtMTksN1EsICUwLTMsNVEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMzgwMDYwMCwgMHhmZjgwMGY1MCwgInZyc3ViaG4lYy5pJTIwLTIxVDJcdCUxMi0xNSwyMkQsICUxNi0xOSw3USwgJTAtMyw1USJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwMDAwLCAweGZlODAwZjUwLCAidmFkZGwlYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdELCAlMC0zLDVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAxMDAsIDB4ZmU4MDBmNTAsICJ2YWRkdyVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJRLCAlMTYtMTksN1EsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDIwMCwgMHhmZTgwMGY1MCwgInZzdWJsJWMuJTI0P3VzJTIwLTIxUzJcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJTAtMyw1RCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwMzAwLCAweGZlODAwZjUwLCAidnN1YnclYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlMC0zLDVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA1MDAsIDB4ZmU4MDBmNTAsICJ2YWJhbCVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDcwMCwgMHhmZTgwMGY1MCwgInZhYmRsJWMuJTI0P3VzJTIwLTIxUzJcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJTAtMyw1RCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYyODAwODAwLCAweGZlODAwZjUwLCAidm1sYWwlYy4lMjQ/dXMlMjAtMjFTMlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdELCAlMC0zLDVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDBhMDAsIDB4ZmU4MDBmNTAsICJ2bWxzbCVjLiUyND91cyUyMC0yMVMyXHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICUwLTMsNUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMGMwMCwgMHhmZTgwMGY1MCwgInZtdWxsJWMuJTI0P3VzJTIwLTIxUzJcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJTAtMyw1RCJ9LAorCisgIC8qIFR3byByZWdpc3RlcnMgYW5kIGEgc2NhbGFyICovCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAwNDAsIDB4ZmY4MDBmNTAsICJ2bWxhJWMuaSUyMC0yMVM2XHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAxNDAsIDB4ZmY4MDBmNTAsICJ2bWxhJWMuZiUyMC0yMVNhXHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDAzNDAsIDB4ZmY4MDBmNTAsICJ2cWRtbGFsJWMucyUyMC0yMVM2XHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA0NDAsIDB4ZmY4MDBmNTAsICJ2bWxzJWMuaSUyMC0yMVM2XHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA1NDAsIDB4ZmY4MDBmNTAsICJ2bWxzJWMuZiUyMC0yMVM2XHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA3NDAsIDB4ZmY4MDBmNTAsICJ2cWRtbHNsJWMucyUyMC0yMVM2XHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA4NDAsIDB4ZmY4MDBmNTAsICJ2bXVsJWMuaSUyMC0yMVM2XHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDA5NDAsIDB4ZmY4MDBmNTAsICJ2bXVsJWMuZiUyMC0yMVNhXHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDBiNDAsIDB4ZmY4MDBmNTAsICJ2cWRtdWxsJWMucyUyMC0yMVM2XHQlMTItMTUsMjJRLCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDBjNDAsIDB4ZmY4MDBmNTAsICJ2cWRtdWxoJWMucyUyMC0yMVM2XHQlMTItMTUsMjJELCAlMTYtMTksN0QsICVEIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjI4MDBkNDAsIDB4ZmY4MDBmNTAsICJ2cXJkbXVsaCVjLnMlMjAtMjFTNlx0JTEyLTE1LDIyRCwgJTE2LTE5LDdELCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwMDQwLCAweGZmODAwZjUwLCAidm1sYSVjLmklMjAtMjFTNlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwMTQwLCAweGZmODAwZjUwLCAidm1sYSVjLmYlMjAtMjFTYVx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwNDQwLCAweGZmODAwZjUwLCAidm1scyVjLmklMjAtMjFTNlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwNTQwLCAweGZmODAwZjUwLCAidm1scyVjLmYlMjAtMjFTYVx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwODQwLCAweGZmODAwZjUwLCAidm11bCVjLmklMjAtMjFTNlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwOTQwLCAweGZmODAwZjUwLCAidm11bCVjLmYlMjAtMjFTYVx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwYzQwLCAweGZmODAwZjUwLCAidnFkbXVsaCVjLnMlMjAtMjFTNlx0JTEyLTE1LDIyUSwgJTE2LTE5LDdRLCAlRCJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGYzODAwZDQwLCAweGZmODAwZjUwLCAidnFyZG11bGglYy5zJTIwLTIxUzZcdCUxMi0xNSwyMlEsICUxNi0xOSw3USwgJUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDI0MCwgMHhmZTgwMGY1MCwgInZtbGFsJWMuJTI0P3VzJTIwLTIxUzZcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMDY0MCwgMHhmZTgwMGY1MCwgInZtbHNsJWMuJTI0P3VzJTIwLTIxUzZcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJUQifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmMjgwMGE0MCwgMHhmZTgwMGY1MCwgInZtdWxsJWMuJTI0P3VzJTIwLTIxUzZcdCUxMi0xNSwyMlEsICUxNi0xOSw3RCwgJUQifSwKKworICAvKiBFbGVtZW50IGFuZCBzdHJ1Y3R1cmUgbG9hZC9zdG9yZSAqLworICB7RlBVX05FT05fRVhUX1YxLCAweGY0YTAwZmMwLCAweGZmYjAwZmMwLCAidmxkNCVjLjMyXHQlQyJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0YTAwYzAwLCAweGZmYjAwZjAwLCAidmxkMSVjLiU2LTdTMlx0JUMifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNGEwMGQwMCwgMHhmZmIwMGYwMCwgInZsZDIlYy4lNi03UzJcdCVDIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjRhMDBlMDAsIDB4ZmZiMDBmMDAsICJ2bGQzJWMuJTYtN1MyXHQlQyJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0YTAwZjAwLCAweGZmYjAwZjAwLCAidmxkNCVjLiU2LTdTMlx0JUMifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNDAwMDIwMCwgMHhmZjkwMGYwMCwgInYlMjE/bHMlMjE/ZHQxJWMuJTYtN1MzXHQlQSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0MDAwMzAwLCAweGZmOTAwZjAwLCAidiUyMT9scyUyMT9kdDIlYy4lNi03UzJcdCVBIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjQwMDA0MDAsIDB4ZmY5MDBmMDAsICJ2JTIxP2xzJTIxP2R0MyVjLiU2LTdTMlx0JUEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNDAwMDUwMCwgMHhmZjkwMGYwMCwgInYlMjE/bHMlMjE/ZHQzJWMuJTYtN1MyXHQlQSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0MDAwNjAwLCAweGZmOTAwZjAwLCAidiUyMT9scyUyMT9kdDElYy4lNi03UzNcdCVBIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjQwMDA3MDAsIDB4ZmY5MDBmMDAsICJ2JTIxP2xzJTIxP2R0MSVjLiU2LTdTM1x0JUEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNDAwMDgwMCwgMHhmZjkwMGYwMCwgInYlMjE/bHMlMjE/ZHQyJWMuJTYtN1MyXHQlQSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0MDAwOTAwLCAweGZmOTAwZjAwLCAidiUyMT9scyUyMT9kdDIlYy4lNi03UzJcdCVBIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjQwMDBhMDAsIDB4ZmY5MDBmMDAsICJ2JTIxP2xzJTIxP2R0MSVjLiU2LTdTM1x0JUEifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNDAwMDAwMCwgMHhmZjkwMGUwMCwgInYlMjE/bHMlMjE/ZHQ0JWMuJTYtN1MyXHQlQSJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0ODAwMDAwLCAweGZmOTAwMzAwLCAidiUyMT9scyUyMT9kdDElYy4lMTAtMTFTMlx0JUIifSwKKyAge0ZQVV9ORU9OX0VYVF9WMSwgMHhmNDgwMDEwMCwgMHhmZjkwMDMwMCwgInYlMjE/bHMlMjE/ZHQyJWMuJTEwLTExUzJcdCVCIn0sCisgIHtGUFVfTkVPTl9FWFRfVjEsIDB4ZjQ4MDAyMDAsIDB4ZmY5MDAzMDAsICJ2JTIxP2xzJTIxP2R0MyVjLiUxMC0xMVMyXHQlQiJ9LAorICB7RlBVX05FT05fRVhUX1YxLCAweGY0ODAwMzAwLCAweGZmOTAwMzAwLCAidiUyMT9scyUyMT9kdDQlYy4lMTAtMTFTMlx0JUIifSwKKworICB7MCwwICwwLCAwfQorfTsKKworLyogT3Bjb2RlIHRhYmxlczogQVJNLCAxNi1iaXQgVGh1bWIsIDMyLWJpdCBUaHVtYi4gIEFsbCB0aHJlZSBhcmUgcGFydGlhbGx5CisgICBvcmRlcmVkOiB0aGV5IG11c3QgYmUgc2VhcmNoZWQgbGluZWFybHkgZnJvbSB0aGUgdG9wIHRvIG9idGFpbiBhIGNvcnJlY3QKKyAgIG1hdGNoLiAgKi8KKworLyogcHJpbnRfaW5zbl9hcm0gcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZvcm1hdCBjb250cm9sIGNvZGVzOgorCisgICAlJQkJCSUKKworICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCisgICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KKyAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCisgICAlYwkJCXByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKKyAgICVtCQkJcHJpbnQgcmVnaXN0ZXIgbWFzayBmb3IgbGRtL3N0bSBpbnN0cnVjdGlvbgorICAgJW8JCQlwcmludCBvcGVyYW5kMiAoaW1tZWRpYXRlIG9yIHJlZ2lzdGVyICsgc2hpZnQpCisgICAlcAkJCXByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKKyAgICV0CQkJcHJpbnQgJ3QnIGlmZiBiaXQgMjEgc2V0IGFuZCBiaXQgMjQgY2xlYXIKKyAgICVCCQkJcHJpbnQgYXJtIEJMWCgxKSBkZXN0aW5hdGlvbgorICAgJUMJCQlwcmludCB0aGUgUFNSIHN1YiB0eXBlLgorICAgJVUJCQlwcmludCBiYXJyaWVyIHR5cGUuCisgICAlUAkJCXByaW50IGFkZHJlc3MgZm9yIHBsaSBpbnN0cnVjdGlvbi4KKworICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKKyAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKKyAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IHRoZSBiaXRmaWVsZCBwbHVzIG9uZSBpbiBkZWNpbWFsCisgICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKKyAgICU8Yml0ZmllbGQ+WAkJcHJpbnQgdGhlIGJpdGZpZWxkIGFzIDEgaGV4IGRpZ2l0IHdpdGhvdXQgbGVhZGluZyAiMHgiCisKKyAgICU8Yml0ZmllbGQ+J2MJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdGZpZWxkIGlzIGFsbCBvbmVzCisgICAlPGJpdGZpZWxkPmBjCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXRmaWVsZCBpcyBhbGwgemVyb2VzCisgICAlPGJpdGZpZWxkPj9hYi4uLiAgICBzZWxlY3QgZnJvbSBhcnJheSBvZiB2YWx1ZXMgaW4gYmlnIGVuZGlhbiBvcmRlcgorCisgICAlZSAgICAgICAgICAgICAgICAgICBwcmludCBhcm0gU01JIG9wZXJhbmQgKGJpdHMgMC4uNyw4Li4xOSkuCisgICAlRQkJCXByaW50IHRoZSBMU0IgYW5kIFdJRFRIIGZpZWxkcyBvZiBhIEJGSSBvciBCRkMgaW5zdHJ1Y3Rpb24uCisgICAlViAgICAgICAgICAgICAgICAgICBwcmludCB0aGUgMTYtYml0IGltbWVkaWF0ZSBmaWVsZCBvZiBhIE1PVlQgb3IgTU9WVyBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Bjb2RlMzIgYXJtX29wY29kZXNbXSA9Cit7CisgIC8qIEFSTSBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0VYVF9WMSwgMHhlMWEwMDAwMCwgMHhmZmZmZmZmZiwgIm5vcFx0XHRcdChtb3YgcjAscjApIn0sCisgIHtBUk1fRVhUX1Y0VCB8IEFSTV9FWFRfVjUsIDB4MDEyRkZGMTAsIDB4MGZmZmZmZjAsICJieCVjXHQlMC0zciJ9LAorICB7QVJNX0VYVF9WMiwgMHgwMDAwMDA5MCwgMHgwZmUwMDBmMCwgIm11bCUyMCdzJWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjIsIDB4MDAyMDAwOTAsIDB4MGZlMDAwZjAsICJtbGElMjAncyVjXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1YyUywgMHgwMTAwMDA5MCwgMHgwZmIwMGZmMCwgInN3cCUyMidiJWNcdCUxMi0xNXIsICUwLTNyLCBbJTE2LTE5cl0ifSwKKyAge0FSTV9FWFRfVjNNLCAweDAwODAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bXVsbCUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjNNLCAweDAwYTAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bWxhbCUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKworICAvKiBJRElWIGluc3RydWN0aW9ucy4gICovCisgIHtBUk1fRVhUX0RJViwgMHgwNzEwZjAxMCwgMHgwZmYwZjBmMCwgInNkaXYlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICB7QVJNX0VYVF9ESVYsIDB4MDczMGYwMTAsIDB4MGZmMGYwZjAsICJ1ZGl2JWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKworICAvKiBWNyBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0VYVF9WNywgMHhmNDUwZjAwMCwgMHhmZDcwZjAwMCwgInBsaVx0JVAifSwKKyAge0FSTV9FWFRfVjcsIDB4MDMyMGYwZjAsIDB4MGZmZmZmZjAsICJkYmclY1x0IyUwLTNkIn0sCisgIHtBUk1fRVhUX1Y3LCAweGY1N2ZmMDUwLCAweGZmZmZmZmYwLCAiZG1iXHQlVSJ9LAorICB7QVJNX0VYVF9WNywgMHhmNTdmZjA0MCwgMHhmZmZmZmZmMCwgImRzYlx0JVUifSwKKyAge0FSTV9FWFRfVjcsIDB4ZjU3ZmYwNjAsIDB4ZmZmZmZmZjAsICJpc2JcdCVVIn0sCisKKyAgLyogQVJNIFY2VDIgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAge0FSTV9FWFRfVjZUMiwgMHgwN2MwMDAxZiwgMHgwZmUwMDA3ZiwgImJmYyVjXHQlMTItMTVyLCAlRSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweDA3YzAwMDEwLCAweDBmZTAwMDcwLCAiYmZpJWNcdCUxMi0xNXIsICUwLTNyLCAlRSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweDAwNjAwMDkwLCAweDBmZjAwMGYwLCAibWxzJWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHgwMDYwMDBiMCwgMHgwZjcwMDBmMCwgInN0cmh0JWNcdCUxMi0xNXIsICVzIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4MDAzMDAwOTAsIDB4MGYzMDAwOTAsICJsZHIlNidzJTU/aGJ0JWNcdCUxMi0xNXIsICVzIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4MDMwMDAwMDAsIDB4MGZmMDAwMDAsICJtb3Z3JWNcdCUxMi0xNXIsICVWIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4MDM0MDAwMDAsIDB4MGZmMDAwMDAsICJtb3Z0JWNcdCUxMi0xNXIsICVWIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4MDZmZjBmMzAsIDB4MGZmZjBmZjAsICJyYml0JWNcdCUxMi0xNXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4MDdhMDAwNTAsIDB4MGZhMDAwNzAsICIlMjI/dXNiZnglY1x0JTEyLTE1ciwgJTAtM3IsICMlNy0xMWQsICMlMTYtMjBXIn0sCisKKyAgLyogQVJNIFY2WiBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0VYVF9WNlosIDB4MDE2MDAwNzAsIDB4MGZmMDAwZjAsICJzbWMlY1x0JWUifSwKKworICAvKiBBUk0gVjZLIGluc3RydWN0aW9ucy4gICovCisgIHtBUk1fRVhUX1Y2SywgMHhmNTdmZjAxZiwgMHhmZmZmZmZmZiwgImNscmV4In0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMWQwMGY5ZiwgMHgwZmYwMGZmZiwgImxkcmV4YiVjXHQlMTItMTVyLCBbJTE2LTE5cl0ifSwKKyAge0FSTV9FWFRfVjZLLCAweDAxYjAwZjlmLCAweDBmZjAwZmZmLCAibGRyZXhkJWNcdCUxMi0xNXIsIFslMTYtMTlyXSJ9LAorICB7QVJNX0VYVF9WNkssIDB4MDFmMDBmOWYsIDB4MGZmMDBmZmYsICJsZHJleGglY1x0JTEyLTE1ciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMWMwMGY5MCwgMHgwZmYwMGZmMCwgInN0cmV4YiVjXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMWEwMGY5MCwgMHgwZmYwMGZmMCwgInN0cmV4ZCVjXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMWUwMGY5MCwgMHgwZmYwMGZmMCwgInN0cmV4aCVjXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCisKKyAgLyogQVJNIFY2SyBOT1AgaGludHMuICAqLworICB7QVJNX0VYVF9WNkssIDB4MDMyMGYwMDEsIDB4MGZmZmZmZmYsICJ5aWVsZCVjIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMzIwZjAwMiwgMHgwZmZmZmZmZiwgIndmZSVjIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMzIwZjAwMywgMHgwZmZmZmZmZiwgIndmaSVjIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMzIwZjAwNCwgMHgwZmZmZmZmZiwgInNldiVjIn0sCisgIHtBUk1fRVhUX1Y2SywgMHgwMzIwZjAwMCwgMHgwZmZmZmYwMCwgIm5vcCVjXHR7JTAtN2R9In0sCisKKyAgLyogQVJNIFY2IGluc3RydWN0aW9ucy4gKi8KKyAge0FSTV9FWFRfVjYsIDB4ZjEwODAwMDAsIDB4ZmZmZmZlM2YsICJjcHNpZVx0JTgnYSU3J2klNidmIn0sCisgIHtBUk1fRVhUX1Y2LCAweGYxMGEwMDAwLCAweGZmZmZmZTIwLCAiY3BzaWVcdCU4J2ElNydpJTYnZiwjJTAtNGQifSwKKyAge0FSTV9FWFRfVjYsIDB4ZjEwQzAwMDAsIDB4ZmZmZmZlM2YsICJjcHNpZFx0JTgnYSU3J2klNidmIn0sCisgIHtBUk1fRVhUX1Y2LCAweGYxMGUwMDAwLCAweGZmZmZmZTIwLCAiY3BzaWRcdCU4J2ElNydpJTYnZiwjJTAtNGQifSwKKyAge0FSTV9FWFRfVjYsIDB4ZjEwMDAwMDAsIDB4ZmZmMWZlMjAsICJjcHNcdCMlMC00ZCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjgwMDAxMCwgMHgwZmYwMGZmMCwgInBraGJ0JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ODAwMDEwLCAweDBmZjAwMDcwLCAicGtoYnQlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIGxzbCAjJTctMTFkIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ODAwMDUwLCAweDBmZjAwZmYwLCAicGtodGIlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIGFzciAjMzIifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY4MDAwNTAsIDB4MGZmMDAwNzAsICJwa2h0YiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgYXNyICMlNy0xMWQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDE5MDBmOWYsIDB4MGZmMDBmZmYsICJsZHJleCVjXHRyJTEyLTE1ZCwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2MjAwZjEwLCAweDBmZjAwZmYwLCAicWFkZDE2JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2MjAwZjkwLCAweDBmZjAwZmYwLCAicWFkZDglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYyMDBmMzAsIDB4MGZmMDBmZjAsICJxYWRkc3VieCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjIwMGY3MCwgMHgwZmYwMGZmMCwgInFzdWIxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjIwMGZmMCwgMHgwZmYwMGZmMCwgInFzdWI4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2MjAwZjUwLCAweDBmZjAwZmYwLCAicXN1YmFkZHglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYxMDBmMTAsIDB4MGZmMDBmZjAsICJzYWRkMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYxMDBmOTAsIDB4MGZmMDBmZjAsICJzYWRkOCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjEwMGYzMCwgMHgwZmYwMGZmMCwgInNhZGRhZGR4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2MzAwZjEwLCAweDBmZjAwZmYwLCAic2hhZGQxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjMwMGY5MCwgMHgwZmYwMGZmMCwgInNoYWRkOCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjMwMGYzMCwgMHgwZmYwMGZmMCwgInNoYWRkc3VieCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjMwMGY3MCwgMHgwZmYwMGZmMCwgInNoc3ViMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYzMDBmZjAsIDB4MGZmMDBmZjAsICJzaHN1YjglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYzMDBmNTAsIDB4MGZmMDBmZjAsICJzaHN1YmFkZHglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYxMDBmNzAsIDB4MGZmMDBmZjAsICJzc3ViMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDYxMDBmZjAsIDB4MGZmMDBmZjAsICJzc3ViOCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjEwMGY1MCwgMHgwZmYwMGZmMCwgInNzdWJhZGR4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2NTAwZjEwLCAweDBmZjAwZmYwLCAidWFkZDE2JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2NTAwZjkwLCAweDBmZjAwZmYwLCAidWFkZDglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY1MDBmMzAsIDB4MGZmMDBmZjAsICJ1YWRkc3VieCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjcwMGYxMCwgMHgwZmYwMGZmMCwgInVoYWRkMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY3MDBmOTAsIDB4MGZmMDBmZjAsICJ1aGFkZDglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY3MDBmMzAsIDB4MGZmMDBmZjAsICJ1aGFkZHN1YnglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY3MDBmNzAsIDB4MGZmMDBmZjAsICJ1aHN1YjE2JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2NzAwZmYwLCAweDBmZjAwZmYwLCAidWhzdWI4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2NzAwZjUwLCAweDBmZjAwZmYwLCAidWhzdWJhZGR4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2NjAwZjEwLCAweDBmZjAwZmYwLCAidXFhZGQxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjYwMGY5MCwgMHgwZmYwMGZmMCwgInVxYWRkOCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjYwMGYzMCwgMHgwZmYwMGZmMCwgInVxYWRkc3VieCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjYwMGY3MCwgMHgwZmYwMGZmMCwgInVxc3ViMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY2MDBmZjAsIDB4MGZmMDBmZjAsICJ1cXN1YjglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY2MDBmNTAsIDB4MGZmMDBmZjAsICJ1cXN1YmFkZHglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY1MDBmNzAsIDB4MGZmMDBmZjAsICJ1c3ViMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY1MDBmZjAsIDB4MGZmMDBmZjAsICJ1c3ViOCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjUwMGY1MCwgMHgwZmYwMGZmMCwgInVzdWJhZGR4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YmYwZjMwLCAweDBmZmYwZmYwLCAicmV2JWNcdFwlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmJmMGZiMCwgMHgwZmZmMGZmMCwgInJldjE2JWNcdFwlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmZmMGZiMCwgMHgwZmZmMGZmMCwgInJldnNoJWNcdFwlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHhmODEwMGEwMCwgMHhmZTUwZmZmZiwgInJmZSUyMz9pZCUyND9iYVx0XCUxNi0xOXIlMjEnISJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmJmMDA3MCwgMHgwZmZmMGZmMCwgInN4dGglY1x0JTEyLTE1ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZiZjA0NzAsIDB4MGZmZjBmZjAsICJzeHRoJWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzgifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZiZjA4NzAsIDB4MGZmZjBmZjAsICJzeHRoJWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzE2In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YmYwYzcwLCAweDBmZmYwZmYwLCAic3h0aCVjXHQlMTItMTVyLCAlMC0zciwgcm9yICMyNCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjhmMDA3MCwgMHgwZmZmMGZmMCwgInN4dGIxNiVjXHQlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjhmMDQ3MCwgMHgwZmZmMGZmMCwgInN4dGIxNiVjXHQlMTItMTVyLCAlMC0zciwgcm9yICM4In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2OGYwODcwLCAweDBmZmYwZmYwLCAic3h0YjE2JWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzE2In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2OGYwYzcwLCAweDBmZmYwZmYwLCAic3h0YjE2JWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YWYwMDcwLCAweDBmZmYwZmYwLCAic3h0YiVjXHQlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmFmMDQ3MCwgMHgwZmZmMGZmMCwgInN4dGIlY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjOCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmFmMDg3MCwgMHgwZmZmMGZmMCwgInN4dGIlY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjMTYifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZhZjBjNzAsIDB4MGZmZjBmZjAsICJzeHRiJWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZmYwMDcwLCAweDBmZmYwZmYwLCAidXh0aCVjXHQlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmZmMDQ3MCwgMHgwZmZmMGZmMCwgInV4dGglY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjOCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmZmMDg3MCwgMHgwZmZmMGZmMCwgInV4dGglY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjMTYifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZmZjBjNzAsIDB4MGZmZjBmZjAsICJ1eHRoJWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2Y2YwMDcwLCAweDBmZmYwZmYwLCAidXh0YjE2JWNcdCUxMi0xNXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2Y2YwNDcwLCAweDBmZmYwZmYwLCAidXh0YjE2JWNcdCUxMi0xNXIsICUwLTNyLCByb3IgIzgifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZjZjA4NzAsIDB4MGZmZjBmZjAsICJ1eHRiMTYlY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjMTYifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZjZjBjNzAsIDB4MGZmZjBmZjAsICJ1eHRiMTYlY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjMjQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZlZjAwNzAsIDB4MGZmZjBmZjAsICJ1eHRiJWNcdCUxMi0xNXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZWYwNDcwLCAweDBmZmYwZmYwLCAidXh0YiVjXHQlMTItMTVyLCAlMC0zciwgcm9yICM4In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZWYwODcwLCAweDBmZmYwZmYwLCAidXh0YiVjXHQlMTItMTVyLCAlMC0zciwgcm9yICMxNiJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmVmMGM3MCwgMHgwZmZmMGZmMCwgInV4dGIlY1x0JTEyLTE1ciwgJTAtM3IsIHJvciAjMjQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZiMDAwNzAsIDB4MGZmMDBmZjAsICJzeHRhaCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmIwMDQ3MCwgMHgwZmYwMGZmMCwgInN4dGFoJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzgifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZiMDA4NzAsIDB4MGZmMDBmZjAsICJzeHRhaCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICMxNiJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmIwMGM3MCwgMHgwZmYwMGZmMCwgInN4dGFoJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ODAwMDcwLCAweDBmZjAwZmYwLCAic3h0YWIxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjgwMDQ3MCwgMHgwZmYwMGZmMCwgInN4dGFiMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIHJvciAjOCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNjgwMDg3MCwgMHgwZmYwMGZmMCwgInN4dGFiMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIHJvciAjMTYifSwKKyAge0FSTV9FWFRfVjYsIDB4MDY4MDBjNzAsIDB4MGZmMDBmZjAsICJzeHRhYjE2JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YTAwMDcwLCAweDBmZjAwZmYwLCAic3h0YWIlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZhMDA0NzAsIDB4MGZmMDBmZjAsICJzeHRhYiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICM4In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YTAwODcwLCAweDBmZjAwZmYwLCAic3h0YWIlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIHJvciAjMTYifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZhMDBjNzAsIDB4MGZmMDBmZjAsICJzeHRhYiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICMyNCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmYwMDA3MCwgMHgwZmYwMGZmMCwgInV4dGFoJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZjAwNDcwLCAweDBmZjAwZmYwLCAidXh0YWglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIHJvciAjOCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmYwMDg3MCwgMHgwZmYwMGZmMCwgInV4dGFoJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzE2In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZjAwYzcwLCAweDBmZjAwZmYwLCAidXh0YWglY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIHJvciAjMjQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZjMDAwNzAsIDB4MGZmMDBmZjAsICJ1eHRhYjE2JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YzAwNDcwLCAweDBmZjAwZmYwLCAidXh0YWIxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICM4In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2YzAwODcwLCAweDBmZjAwZmYwLCAidXh0YWIxNiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICMxNiJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmMwMGM3MCwgMHgwZmYwMGZmMCwgInV4dGFiMTYlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsIFJPUiAjMjQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZlMDAwNzAsIDB4MGZmMDBmZjAsICJ1eHRhYiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmUwMDQ3MCwgMHgwZmYwMGZmMCwgInV4dGFiJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzgifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZlMDA4NzAsIDB4MGZmMDBmZjAsICJ1eHRhYiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgcm9yICMxNiJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmUwMGM3MCwgMHgwZmYwMGZmMCwgInV4dGFiJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCByb3IgIzI0In0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ODAwZmIwLCAweDBmZjAwZmYwLCAic2VsJWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweGYxMDEwMDAwLCAweGZmZmZmYzAwLCAic2V0ZW5kXHQlOT9ibGUifSwKKyAge0FSTV9FWFRfVjYsIDB4MDcwMGYwMTAsIDB4MGZmMGYwZDAsICJzbXVhZCU1J3glY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNzAwZjA1MCwgMHgwZmYwZjBkMCwgInNtdXNkJTUneCVjXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA3MDAwMDEwLCAweDBmZjAwMGQwLCAic21sYWQlNSd4JWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4MDc0MDAwMTAsIDB4MGZmMDAwZDAsICJzbWxhbGQlNSd4JWNcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjYsIDB4MDcwMDAwNTAsIDB4MGZmMDAwZDAsICJzbWxzZCU1J3glY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNzQwMDA1MCwgMHgwZmYwMDBkMCwgInNtbHNsZCU1J3glY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNzUwZjAxMCwgMHgwZmYwZjBkMCwgInNtbXVsJTUnciVjXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA3NTAwMDEwLCAweDBmZjAwMGQwLCAic21tbGElNSdyJWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4MDc1MDAwZDAsIDB4MGZmMDAwZDAsICJzbW1scyU1J3IlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNiwgMHhmODRkMDUwMCwgMHhmZTVmZmZlMCwgInNycyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAjJTAtNGQifSwKKyAge0FSTV9FWFRfVjYsIDB4MDZhMDAwMTAsIDB4MGZlMDBmZjAsICJzc2F0JWNcdCUxMi0xNXIsICMlMTYtMjBXLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmEwMDAxMCwgMHgwZmUwMDA3MCwgInNzYXQlY1x0JTEyLTE1ciwgIyUxNi0yMFcsICUwLTNyLCBsc2wgIyU3LTExZCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmEwMDA1MCwgMHgwZmUwMDA3MCwgInNzYXQlY1x0JTEyLTE1ciwgIyUxNi0yMFcsICUwLTNyLCBhc3IgIyU3LTExZCJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmEwMGYzMCwgMHgwZmYwMGZmMCwgInNzYXQxNiVjXHQlMTItMTVyLCAjJTE2LTE5VywgJTAtM3IifSwKKyAge0FSTV9FWFRfVjYsIDB4MDE4MDBmOTAsIDB4MGZmMDBmZjAsICJzdHJleCVjXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2LCAweDAwNDAwMDkwLCAweDBmZjAwMGYwLCAidW1hYWwlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNzgwZjAxMCwgMHgwZmYwZjBmMCwgInVzYWQ4JWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjYsIDB4MDc4MDAwMTAsIDB4MGZmMDAwZjAsICJ1c2FkYTglY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNiwgMHgwNmUwMDAxMCwgMHgwZmUwMGZmMCwgInVzYXQlY1x0JTEyLTE1ciwgIyUxNi0yMGQsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZTAwMDEwLCAweDBmZTAwMDcwLCAidXNhdCVjXHQlMTItMTVyLCAjJTE2LTIwZCwgJTAtM3IsIGxzbCAjJTctMTFkIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZTAwMDUwLCAweDBmZTAwMDcwLCAidXNhdCVjXHQlMTItMTVyLCAjJTE2LTIwZCwgJTAtM3IsIGFzciAjJTctMTFkIn0sCisgIHtBUk1fRVhUX1Y2LCAweDA2ZTAwZjMwLCAweDBmZjAwZmYwLCAidXNhdDE2JWNcdCUxMi0xNXIsICMlMTYtMTlkLCAlMC0zciJ9LAorCisgIC8qIFY1SiBpbnN0cnVjdGlvbi4gICovCisgIHtBUk1fRVhUX1Y1SiwgMHgwMTJmZmYyMCwgMHgwZmZmZmZmMCwgImJ4aiVjXHQlMC0zciJ9LAorCisgIC8qIFY1IEluc3RydWN0aW9ucy4gICovCisgIHtBUk1fRVhUX1Y1LCAweGUxMjAwMDcwLCAweGZmZjAwMGYwLCAiYmtwdFx0MHglMTYtMTlYJTEyLTE1WCU4LTExWCUwLTNYIn0sCisgIHtBUk1fRVhUX1Y1LCAweGZhMDAwMDAwLCAweGZlMDAwMDAwLCAiYmx4XHQlQiJ9LAorICB7QVJNX0VYVF9WNSwgMHgwMTJmZmYzMCwgMHgwZmZmZmZmMCwgImJseCVjXHQlMC0zciJ9LAorICB7QVJNX0VYVF9WNSwgMHgwMTZmMGYxMCwgMHgwZmZmMGZmMCwgImNseiVjXHQlMTItMTVyLCAlMC0zciJ9LAorCisgIC8qIFY1RSAiRWwgU2VndW5kbyIgSW5zdHJ1Y3Rpb25zLiAgKi8KKyAge0FSTV9FWFRfVjVFLCAweDAwMDAwMGQwLCAweDBlMTAwMGYwLCAibGRyZCVjXHQlMTItMTVyLCAlcyJ9LAorICB7QVJNX0VYVF9WNUUsIDB4MDAwMDAwZjAsIDB4MGUxMDAwZjAsICJzdHJkJWNcdCUxMi0xNXIsICVzIn0sCisgIHtBUk1fRVhUX1Y1RSwgMHhmNDUwZjAwMCwgMHhmYzcwZjAwMCwgInBsZFx0JWEifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDEwMDAwODAsIDB4MGZmMDAwZjAsICJzbWxhYmIlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNUV4UCwgMHgwMTAwMDBhMCwgMHgwZmYwMDBmMCwgInNtbGF0YiVjXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxMDAwMGMwLCAweDBmZjAwMGYwLCAic21sYWJ0JWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDEwMDAwZTAsIDB4MGZmMDAwZjAsICJzbWxhdHQlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxMjAwMDgwLCAweDBmZjAwMGYwLCAic21sYXdiJWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDEyMDAwYzAsIDB4MGZmMDAwZjAsICJzbWxhd3QlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciwgJTEyLTE1ciJ9LAorCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNDAwMDgwLCAweDBmZjAwMGYwLCAic21sYWxiYiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNDAwMGEwLCAweDBmZjAwMGYwLCAic21sYWx0YiVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNDAwMGMwLCAweDBmZjAwMGYwLCAic21sYWxidCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNDAwMGUwLCAweDBmZjAwMGYwLCAic21sYWx0dCVjXHQlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDE2MDAwODAsIDB4MGZmMGYwZjAsICJzbXVsYmIlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorICB7QVJNX0VYVF9WNUV4UCwgMHgwMTYwMDBhMCwgMHgwZmYwZjBmMCwgInNtdWx0YiVjXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNjAwMGMwLCAweDBmZjBmMGYwLCAic211bGJ0JWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDE2MDAwZTAsIDB4MGZmMGYwZjAsICJzbXVsdHQlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxMjAwMGEwLCAweDBmZjBmMGYwLCAic211bHdiJWNcdCUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDEyMDAwZTAsIDB4MGZmMGYwZjAsICJzbXVsd3QlY1x0JTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAorCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxMDAwMDUwLCAweDBmZjAwZmYwLCAgInFhZGQlY1x0JTEyLTE1ciwgJTAtM3IsICUxNi0xOXIifSwKKyAge0FSTV9FWFRfVjVFeFAsIDB4MDE0MDAwNTAsIDB4MGZmMDBmZjAsICJxZGFkZCVjXHQlMTItMTVyLCAlMC0zciwgJTE2LTE5ciJ9LAorICB7QVJNX0VYVF9WNUV4UCwgMHgwMTIwMDA1MCwgMHgwZmYwMGZmMCwgICJxc3ViJWNcdCUxMi0xNXIsICUwLTNyLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y1RXhQLCAweDAxNjAwMDUwLCAweDBmZjAwZmYwLCAicWRzdWIlY1x0JTEyLTE1ciwgJTAtM3IsICUxNi0xOXIifSwKKworICAvKiBBUk0gSW5zdHJ1Y3Rpb25zLiAgKi8KKyAge0FSTV9FWFRfVjEsIDB4MDAwMDAwOTAsIDB4MGUxMDAwOTAsICJzdHIlNidzJTU/aGIlY1x0JTEyLTE1ciwgJXMifSwKKyAge0FSTV9FWFRfVjEsIDB4MDAxMDAwOTAsIDB4MGUxMDAwOTAsICJsZHIlNidzJTU/aGIlY1x0JTEyLTE1ciwgJXMifSwKKyAge0FSTV9FWFRfVjEsIDB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlMjAncyVjXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMDIwMDAwMCwgMHgwZGUwMDAwMCwgImVvciUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgIHtBUk1fRVhUX1YxLCAweDAwNDAwMDAwLCAweDBkZTAwMDAwLCAic3ViJTIwJ3MlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKKyAge0FSTV9FWFRfVjEsIDB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlMjAncyVjXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMDgwMDAwMCwgMHgwZGUwMDAwMCwgImFkZCUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgIHtBUk1fRVhUX1YxLCAweDAwYTAwMDAwLCAweDBkZTAwMDAwLCAiYWRjJTIwJ3MlY1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKKyAge0FSTV9FWFRfVjEsIDB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlMjAncyVjXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMGUwMDAwMCwgMHgwZGUwMDAwMCwgInJzYyUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgIHtBUk1fRVhUX1YzLCAweDAxMjBmMDAwLCAweDBkYjBmMDAwLCAibXNyJWNcdCUyMj9TQ1BTUiVDLCAlbyJ9LAorICB7QVJNX0VYVF9WMywgMHgwMTBmMDAwMCwgMHgwZmJmMGZmZiwgIm1ycyVjXHQlMTItMTVyLCAlMjI/U0NQU1IifSwKKyAge0FSTV9FWFRfVjEsIDB4MDEwMDAwMDAsIDB4MGRlMDAwMDAsICJ0c3QlcCVjXHQlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMTIwMDAwMCwgMHgwZGUwMDAwMCwgInRlcSVwJWNcdCUxNi0xOXIsICVvIn0sCisgIHtBUk1fRVhUX1YxLCAweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJXAlY1x0JTE2LTE5ciwgJW8ifSwKKyAge0FSTV9FWFRfVjEsIDB4MDE2MDAwMDAsIDB4MGRlMDAwMDAsICJjbW4lcCVjXHQlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMTgwMDAwMCwgMHgwZGUwMDAwMCwgIm9yciUyMCdzJWNcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCisgIHtBUk1fRVhUX1YxLCAweDAzYTAwMDAwLCAweDBmZWYwMDAwLCAibW92JTIwJ3MlY1x0JTEyLTE1ciwgJW8ifSwKKyAge0FSTV9FWFRfVjEsIDB4MDFhMDAwMDAsIDB4MGRlZjBmZjAsICJtb3YlMjAncyVjXHQlMTItMTVyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMWEwMDAwMCwgMHgwZGVmMDA2MCwgImxzbCUyMCdzJWNcdCUxMi0xNXIsICVxIn0sCisgIHtBUk1fRVhUX1YxLCAweDAxYTAwMDIwLCAweDBkZWYwMDYwLCAibHNyJTIwJ3MlY1x0JTEyLTE1ciwgJXEifSwKKyAge0FSTV9FWFRfVjEsIDB4MDFhMDAwNDAsIDB4MGRlZjAwNjAsICJhc3IlMjAncyVjXHQlMTItMTVyLCAlcSJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMWEwMDA2MCwgMHgwZGVmMGZmMCwgInJyeCUyMCdzJWNcdCUxMi0xNXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1YxLCAweDAxYTAwMDYwLCAweDBkZWYwMDYwLCAicm9yJTIwJ3MlY1x0JTEyLTE1ciwgJXEifSwKKyAge0FSTV9FWFRfVjEsIDB4MDFjMDAwMDAsIDB4MGRlMDAwMDAsICJiaWMlMjAncyVjXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAorICB7QVJNX0VYVF9WMSwgMHgwMWUwMDAwMCwgMHgwZGUwMDAwMCwgIm12biUyMCdzJWNcdCUxMi0xNXIsICVvIn0sCisgIHtBUk1fRVhUX1YxLCAweDA1MmQwMDA0LCAweDBmZmYwZmZmLCAicHVzaCVjXHR7JTEyLTE1cn1cdFx0OyAoc3RyJWMgJTEyLTE1ciwgJWEpIn0sCisgIHtBUk1fRVhUX1YxLCAweDA0MDAwMDAwLCAweDBlMTAwMDAwLCAic3RyJTIyJ2IldCVjXHQlMTItMTVyLCAlYSJ9LAorICB7QVJNX0VYVF9WMSwgMHgwNjAwMDAwMCwgMHgwZTEwMGZmMCwgInN0ciUyMidiJXQlY1x0JTEyLTE1ciwgJWEifSwKKyAge0FSTV9FWFRfVjEsIDB4MDQwMDAwMDAsIDB4MGMxMDAwMTAsICJzdHIlMjInYiV0JWNcdCUxMi0xNXIsICVhIn0sCisgIHtBUk1fRVhUX1YxLCAweDA2MDAwMDEwLCAweDBlMDAwMDEwLCAidW5kZWZpbmVkIn0sCisgIHtBUk1fRVhUX1YxLCAweDA0OWQwMDA0LCAweDBmZmYwZmZmLCAicG9wJWNcdHslMTItMTVyfVx0XHQ7IChsZHIlYyAlMTItMTVyLCAlYSkifSwKKyAge0FSTV9FWFRfVjEsIDB4MDQxMDAwMDAsIDB4MGMxMDAwMDAsICJsZHIlMjInYiV0JWNcdCUxMi0xNXIsICVhIn0sCisgIHtBUk1fRVhUX1YxLCAweDA5MmQwMDAwLCAweDBmZmYwMDAwLCAicHVzaCVjXHQlbSJ9LAorICB7QVJNX0VYVF9WMSwgMHgwODgwMDAwMCwgMHgwZmYwMDAwMCwgInN0bSVjXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKKyAge0FSTV9FWFRfVjEsIDB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lMjM/aWQlMjQ/YmElY1x0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCisgIHtBUk1fRVhUX1YxLCAweDA4YmQwMDAwLCAweDBmZmYwMDAwLCAicG9wJWNcdCVtIn0sCisgIHtBUk1fRVhUX1YxLCAweDA4OTAwMDAwLCAweDBmOTAwMDAwLCAibGRtJWNcdCUxNi0xOXIlMjEnISwgJW0lMjInXiJ9LAorICB7QVJNX0VYVF9WMSwgMHgwODEwMDAwMCwgMHgwZTEwMDAwMCwgImxkbSUyMz9pZCUyND9iYSVjXHQlMTYtMTlyJTIxJyEsICVtJTIyJ14ifSwKKyAge0FSTV9FWFRfVjEsIDB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJTI0J2wlY1x0JWIifSwKKyAge0FSTV9FWFRfVjEsIDB4MGYwMDAwMDAsIDB4MGYwMDAwMDAsICJzdmMlY1x0JTAtMjN4In0sCisKKyAgLyogVGhlIHJlc3QuICAqLworICB7QVJNX0VYVF9WMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgifSwKKyAgezAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB9Cit9OworCisvKiBwcmludF9pbnNuX3RodW1iMTYgcmVjb2duaXplcyB0aGUgZm9sbG93aW5nIGZvcm1hdCBjb250cm9sIGNvZGVzOgorCisgICAlUyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciAoYml0cyAzLi41IGFzIGhpZ2ggbnVtYmVyIGlmIGJpdCA2IHNldCkKKyAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQorICAgJTxiaXRmaWVsZD5JICAgICAgICAgcHJpbnQgYml0ZmllbGQgYXMgYSBzaWduZWQgZGVjaW1hbAorICAgCQkJCSh0b3AgYml0IG9mIHJhbmdlIGJlaW5nIHRoZSBzaWduIGJpdCkKKyAgICVOICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggTFIpCisgICAlTyAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiByZWdpc3RlciBtYXNrICh3aXRoIFBDKQorICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzaworICAgJWIJCQlwcmludCBDWkIncyA2LWJpdCB1bnNpZ25lZCBicmFuY2ggZGVzdGluYXRpb24KKyAgICVzCQkJcHJpbnQgVGh1bWIgcmlnaHQtc2hpZnQgaW1tZWRpYXRlICg2Li4xMDsgMCA9PSAzMikuCisgICAlYwkJCXByaW50IHRoZSBjb25kaXRpb24gY29kZQorICAgJUMJCQlwcmludCB0aGUgY29uZGl0aW9uIGNvZGUsIG9yICJzIiBpZiBub3QgY29uZGl0aW9uYWwKKyAgICV4CQkJcHJpbnQgd2FybmluZyBpZiBjb25kaXRpb25hbCBhbiBub3QgYXQgZW5kIG9mIElUIGJsb2NrIgorICAgJVgJCQlwcmludCAiXHQ7IHVucHJlZGljdGFibGUgPElUOmNvZGU+IiBpZiBjb25kaXRpb25hbAorICAgJUkJCQlwcmludCBJVCBpbnN0cnVjdGlvbiBzdWZmaXggYW5kIG9wZXJhbmRzCisgICAlPGJpdGZpZWxkPnIJCXByaW50IGJpdGZpZWxkIGFzIGFuIEFSTSByZWdpc3RlcgorICAgJTxiaXRmaWVsZD5kCQlwcmludCBiaXRmaWVsZCBhcyBhIGRlY2ltYWwKKyAgICU8Yml0ZmllbGQ+SCAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDIpIGFzIGEgZGVjaW1hbAorICAgJTxiaXRmaWVsZD5XICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogNCkgYXMgYSBkZWNpbWFsCisgICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAorICAgJTxiaXRmaWVsZD5CICAgICAgICAgcHJpbnQgVGh1bWIgYnJhbmNoIGRlc3RpbmF0aW9uIChzaWduZWQgZGlzcGxhY2VtZW50KQorICAgJTxiaXRmaWVsZD5jICAgICAgICAgcHJpbnQgYml0ZmllbGQgYXMgYSBjb25kaXRpb24gY29kZQorICAgJTxiaXRudW0+J2MJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgb25lCisgICAlPGJpdG51bT4/YWIJCXByaW50IGEgaWYgYml0IGlzIG9uZSBlbHNlIHByaW50IGIuICAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wY29kZTE2IHRodW1iX29wY29kZXNbXSA9Cit7CisgIC8qIFRodW1iIGluc3RydWN0aW9ucy4gICovCisKKyAgLyogQVJNIFY2SyBuby1hcmd1bWVudCBpbnN0cnVjdGlvbnMuICAqLworICB7QVJNX0VYVF9WNkssIDB4YmYwMCwgMHhmZmZmLCAibm9wJWMifSwKKyAge0FSTV9FWFRfVjZLLCAweGJmMTAsIDB4ZmZmZiwgInlpZWxkJWMifSwKKyAge0FSTV9FWFRfVjZLLCAweGJmMjAsIDB4ZmZmZiwgIndmZSVjIn0sCisgIHtBUk1fRVhUX1Y2SywgMHhiZjMwLCAweGZmZmYsICJ3ZmklYyJ9LAorICB7QVJNX0VYVF9WNkssIDB4YmY0MCwgMHhmZmZmLCAic2V2JWMifSwKKyAge0FSTV9FWFRfVjZLLCAweGJmMDAsIDB4ZmYwZiwgIm5vcCVjXHR7JTQtN2R9In0sCisKKyAgLyogQVJNIFY2VDIgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAge0FSTV9FWFRfVjZUMiwgMHhiOTAwLCAweGZkMDAsICJjYm56XHQlMC0yciwgJWIlWCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGIxMDAsIDB4ZmQwMCwgImNielx0JTAtMnIsICViJVgifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhiZjAwLCAweGZmMDAsICJpdCVJJVgifSwKKworICAvKiBBUk0gVjYuICAqLworICB7QVJNX0VYVF9WNiwgMHhiNjYwLCAweGZmZjgsICJjcHNpZVx0JTInYSUxJ2klMCdmJVgifSwKKyAge0FSTV9FWFRfVjYsIDB4YjY3MCwgMHhmZmY4LCAiY3BzaWRcdCUyJ2ElMSdpJTAnZiVYIn0sCisgIHtBUk1fRVhUX1Y2LCAweDQ2MDAsIDB4ZmZjMCwgIm1vdiVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4YmEwMCwgMHhmZmMwLCAicmV2JWNcdCUwLTJyLCAlMy01ciJ9LAorICB7QVJNX0VYVF9WNiwgMHhiYTQwLCAweGZmYzAsICJyZXYxNiVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4YmFjMCwgMHhmZmMwLCAicmV2c2glY1x0JTAtMnIsICUzLTVyIn0sCisgIHtBUk1fRVhUX1Y2LCAweGI2NTAsIDB4ZmZmNywgInNldGVuZFx0JTM/YmxlJVgifSwKKyAge0FSTV9FWFRfVjYsIDB4YjIwMCwgMHhmZmMwLCAic3h0aCVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4YjI0MCwgMHhmZmMwLCAic3h0YiVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4YjI4MCwgMHhmZmMwLCAidXh0aCVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjYsIDB4YjJjMCwgMHhmZmMwLCAidXh0YiVjXHQlMC0yciwgJTMtNXIifSwKKworICAvKiBBUk0gVjUgSVNBIGV4dGVuZHMgVGh1bWIuICAqLworICB7QVJNX0VYVF9WNVQsIDB4YmUwMCwgMHhmZjAwLCAiYmtwdFx0JTAtN3gifSwgLyogSXMgYWx3YXlzIHVuY29uZGl0aW9uYWwuICAqLworICAvKiBUaGlzIGlzIEJMWCgyKS4gIEJMWCgxKSBpcyBhIDMyLWJpdCBpbnN0cnVjdGlvbi4gICovCisgIHtBUk1fRVhUX1Y1VCwgMHg0NzgwLCAweGZmODcsICJibHglY1x0JTMtNnIleCJ9LAkvKiBub3RlOiA0IGJpdCByZWdpc3RlciBudW1iZXIuICAqLworICAvKiBBUk0gVjRUIElTQSAoVGh1bWIgdjEpLiAgKi8KKyAge0FSTV9FWFRfVjRULCAweDQ2QzAsIDB4RkZGRiwgIm5vcCVjXHRcdFx0KG1vdiByOCwgcjgpIn0sCisgIC8qIEZvcm1hdCA0LiAgKi8KKyAge0FSTV9FWFRfVjRULCAweDQwMDAsIDB4RkZDMCwgImFuZCVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQwNDAsIDB4RkZDMCwgImVvciVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQwODAsIDB4RkZDMCwgImxzbCVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQwQzAsIDB4RkZDMCwgImxzciVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQxMDAsIDB4RkZDMCwgImFzciVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQxNDAsIDB4RkZDMCwgImFkYyVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQxODAsIDB4RkZDMCwgInNiYyVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQxQzAsIDB4RkZDMCwgInJvciVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQyMDAsIDB4RkZDMCwgInRzdCVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQyNDAsIDB4RkZDMCwgIm5lZyVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQyODAsIDB4RkZDMCwgImNtcCVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQyQzAsIDB4RkZDMCwgImNtbiVjXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQzMDAsIDB4RkZDMCwgIm9yciVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQzNDAsIDB4RkZDMCwgIm11bCVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQzODAsIDB4RkZDMCwgImJpYyVDXHQlMC0yciwgJTMtNXIifSwKKyAge0FSTV9FWFRfVjRULCAweDQzQzAsIDB4RkZDMCwgIm12biVDXHQlMC0yciwgJTMtNXIifSwKKyAgLyogZm9ybWF0IDEzICovCisgIHtBUk1fRVhUX1Y0VCwgMHhCMDAwLCAweEZGODAsICJhZGQlY1x0c3AsICMlMC02VyJ9LAorICB7QVJNX0VYVF9WNFQsIDB4QjA4MCwgMHhGRjgwLCAic3ViJWNcdHNwLCAjJTAtNlcifSwKKyAgLyogZm9ybWF0IDUgKi8KKyAge0FSTV9FWFRfVjRULCAweDQ3MDAsIDB4RkY4MCwgImJ4JWNcdCVTJXgifSwKKyAge0FSTV9FWFRfVjRULCAweDQ0MDAsIDB4RkYwMCwgImFkZCVjXHQlRCwgJVMifSwKKyAge0FSTV9FWFRfVjRULCAweDQ1MDAsIDB4RkYwMCwgImNtcCVjXHQlRCwgJVMifSwKKyAge0FSTV9FWFRfVjRULCAweDQ2MDAsIDB4RkYwMCwgIm1vdiVjXHQlRCwgJVMifSwKKyAgLyogZm9ybWF0IDE0ICovCisgIHtBUk1fRVhUX1Y0VCwgMHhCNDAwLCAweEZFMDAsICJwdXNoJWNcdCVOIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHhCQzAwLCAweEZFMDAsICJwb3AlY1x0JU8ifSwKKyAgLyogZm9ybWF0IDIgKi8KKyAge0FSTV9FWFRfVjRULCAweDE4MDAsIDB4RkUwMCwgImFkZCVDXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHgxQTAwLCAweEZFMDAsICJzdWIlQ1x0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAorICB7QVJNX0VYVF9WNFQsIDB4MUMwMCwgMHhGRTAwLCAiYWRkJUNcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHgxRTAwLCAweEZFMDAsICJzdWIlQ1x0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKKyAgLyogZm9ybWF0IDggKi8KKyAge0FSTV9FWFRfVjRULCAweDUyMDAsIDB4RkUwMCwgInN0cmglY1x0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHg1QTAwLCAweEZFMDAsICJsZHJoJWNcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAorICB7QVJNX0VYVF9WNFQsIDB4NTYwMCwgMHhGNjAwLCAibGRycyUxMT9oYiVjXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKKyAgLyogZm9ybWF0IDcgKi8KKyAge0FSTV9FWFRfVjRULCAweDUwMDAsIDB4RkEwMCwgInN0ciUxMCdiJWNcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAorICB7QVJNX0VYVF9WNFQsIDB4NTgwMCwgMHhGQTAwLCAibGRyJTEwJ2IlY1x0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCisgIC8qIGZvcm1hdCAxICovCisgIHtBUk1fRVhUX1Y0VCwgMHgwMDAwLCAweEY4MDAsICJsc2wlQ1x0JTAtMnIsICUzLTVyLCAjJTYtMTBkIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHgwODAwLCAweEY4MDAsICJsc3IlQ1x0JTAtMnIsICUzLTVyLCAlcyJ9LAorICB7QVJNX0VYVF9WNFQsIDB4MTAwMCwgMHhGODAwLCAiYXNyJUNcdCUwLTJyLCAlMy01ciwgJXMifSwKKyAgLyogZm9ybWF0IDMgKi8KKyAge0FSTV9FWFRfVjRULCAweDIwMDAsIDB4RjgwMCwgIm1vdiVDXHQlOC0xMHIsICMlMC03ZCJ9LAorICB7QVJNX0VYVF9WNFQsIDB4MjgwMCwgMHhGODAwLCAiY21wJWNcdCU4LTEwciwgIyUwLTdkIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHgzMDAwLCAweEY4MDAsICJhZGQlQ1x0JTgtMTByLCAjJTAtN2QifSwKKyAge0FSTV9FWFRfVjRULCAweDM4MDAsIDB4RjgwMCwgInN1YiVDXHQlOC0xMHIsICMlMC03ZCJ9LAorICAvKiBmb3JtYXQgNiAqLworICB7QVJNX0VYVF9WNFQsIDB4NDgwMCwgMHhGODAwLCAibGRyJWNcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLworICAvKiBmb3JtYXQgOSAqLworICB7QVJNX0VYVF9WNFQsIDB4NjAwMCwgMHhGODAwLCAic3RyJWNcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHg2ODAwLCAweEY4MDAsICJsZHIlY1x0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKKyAge0FSTV9FWFRfVjRULCAweDcwMDAsIDB4RjgwMCwgInN0cmIlY1x0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKKyAge0FSTV9FWFRfVjRULCAweDc4MDAsIDB4RjgwMCwgImxkcmIlY1x0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKKyAgLyogZm9ybWF0IDEwICovCisgIHtBUk1fRVhUX1Y0VCwgMHg4MDAwLCAweEY4MDAsICJzdHJoJWNcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHg4ODAwLCAweEY4MDAsICJsZHJoJWNcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCisgIC8qIGZvcm1hdCAxMSAqLworICB7QVJNX0VYVF9WNFQsIDB4OTAwMCwgMHhGODAwLCAic3RyJWNcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHg5ODAwLCAweEY4MDAsICJsZHIlY1x0JTgtMTByLCBbc3AsICMlMC03V10ifSwKKyAgLyogZm9ybWF0IDEyICovCisgIHtBUk1fRVhUX1Y0VCwgMHhBMDAwLCAweEY4MDAsICJhZGQlY1x0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwgJTAtN2EpIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHhBODAwLCAweEY4MDAsICJhZGQlY1x0JTgtMTByLCBzcCwgIyUwLTdXIn0sCisgIC8qIGZvcm1hdCAxNSAqLworICB7QVJNX0VYVF9WNFQsIDB4QzAwMCwgMHhGODAwLCAic3RtaWElY1x0JTgtMTByISwgJU0ifSwKKyAge0FSTV9FWFRfVjRULCAweEM4MDAsIDB4RjgwMCwgImxkbWlhJWNcdCU4LTEwciEsICVNIn0sCisgIC8qIGZvcm1hdCAxNyAqLworICB7QVJNX0VYVF9WNFQsIDB4REYwMCwgMHhGRjAwLCAic3ZjJWNcdCUwLTdkIn0sCisgIC8qIGZvcm1hdCAxNiAqLworICB7QVJNX0VYVF9WNFQsIDB4REUwMCwgMHhGRTAwLCAidW5kZWZpbmVkIn0sCisgIHtBUk1fRVhUX1Y0VCwgMHhEMDAwLCAweEYwMDAsICJiJTgtMTFjLm5cdCUwLTdCJVgifSwKKyAgLyogZm9ybWF0IDE4ICovCisgIHtBUk1fRVhUX1Y0VCwgMHhFMDAwLCAweEY4MDAsICJiJWMublx0JTAtMTBCJXgifSwKKworICAvKiBUaGUgRTgwMCAuLiBGRkZGIHJhbmdlIGlzIHVuY29uZGl0aW9uYWxseSByZWRpcmVjdGVkIHRvIHRoZQorICAgICAzMi1iaXQgdGFibGUsIGJlY2F1c2UgZXZlbiBpbiBwcmUtVjZUMiBJU0FzLCBCTCBhbmQgQkxYKDEpIHBhaXJzCisgICAgIGFyZSBwcm9jZXNzZWQgdmlhIHRoYXQgdGFibGUuICBUaHVzLCB3ZSBjYW4gbmV2ZXIgZW5jb3VudGVyIGEKKyAgICAgYmFyZSAic2Vjb25kIGhhbGYgb2YgQkwvQkxYKDEpIiBpbnN0cnVjdGlvbiBoZXJlLiAgKi8KKyAge0FSTV9FWFRfVjEsICAweDAwMDAsIDB4MDAwMCwgInVuZGVmaW5lZCJ9LAorICB7MCwgMCwgMCwgMH0KK307CisKKy8qIFRodW1iMzIgb3Bjb2RlcyB1c2UgdGhlIHNhbWUgdGFibGUgc3RydWN0dXJlIGFzIHRoZSBBUk0gb3Bjb2Rlcy4KKyAgIFdlIGFkb3B0IHRoZSBjb252ZW50aW9uIHRoYXQgaHcxIGlzIHRoZSBoaWdoIDE2IGJpdHMgb2YgLnZhbHVlIGFuZAorICAgLm1hc2ssIGh3MiB0aGUgbG93IDE2IGJpdHMuCisKKyAgIHByaW50X2luc25fdGh1bWIzMiByZWNvZ25pemVzIHRoZSBmb2xsb3dpbmcgZm9ybWF0IGNvbnRyb2wgY29kZXM6CisKKyAgICAgICAlJQkJJQorCisgICAgICAgJUkJCXByaW50IGEgMTItYml0IGltbWVkaWF0ZSBmcm9tIGh3MVsxMF0saHcyWzE0OjEyLDc6MF0KKyAgICAgICAlTQkJcHJpbnQgYSBtb2RpZmllZCAxMi1iaXQgaW1tZWRpYXRlIChzYW1lIGxvY2F0aW9uKQorICAgICAgICVKCQlwcmludCBhIDE2LWJpdCBpbW1lZGlhdGUgZnJvbSBodzFbMzowLDEwXSxodzJbMTQ6MTIsNzowXQorICAgICAgICVLCQlwcmludCBhIDE2LWJpdCBpbW1lZGlhdGUgZnJvbSBodzJbMzowXSxodzFbMzowXSxodzJbMTE6NF0KKyAgICAgICAlUwkJcHJpbnQgYSBwb3NzaWJseS1zaGlmdGVkIFJtCisKKyAgICAgICAlYQkJcHJpbnQgdGhlIGFkZHJlc3Mgb2YgYSBwbGFpbiBsb2FkL3N0b3JlCisgICAgICAgJXcJCXByaW50IHRoZSB3aWR0aCBhbmQgc2lnbmVkbmVzcyBvZiBhIGNvcmUgbG9hZC9zdG9yZQorICAgICAgICVtCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtCisKKyAgICAgICAlRQkJcHJpbnQgdGhlIGxzYiBhbmQgd2lkdGggZmllbGRzIG9mIGEgYmZjL2JmaSBpbnN0cnVjdGlvbgorICAgICAgICVGCQlwcmludCB0aGUgbHNiIGFuZCB3aWR0aCBmaWVsZHMgb2YgYSBzYmZ4L3ViZnggaW5zdHJ1Y3Rpb24KKyAgICAgICAlYgkJcHJpbnQgYSBjb25kaXRpb25hbCBicmFuY2ggb2Zmc2V0CisgICAgICAgJUIJCXByaW50IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIG9mZnNldAorICAgICAgICVzCQlwcmludCB0aGUgc2hpZnQgZmllbGQgb2YgYW4gU1NBVCBpbnN0cnVjdGlvbgorICAgICAgICVSCQlwcmludCB0aGUgcm90YXRpb24gZmllbGQgb2YgYW4gU1hUIGluc3RydWN0aW9uCisgICAgICAgJVUJCXByaW50IGJhcnJpZXIgdHlwZS4KKyAgICAgICAlUAkJcHJpbnQgYWRkcmVzcyBmb3IgcGxpIGluc3RydWN0aW9uLgorICAgICAgICVjCQlwcmludCB0aGUgY29uZGl0aW9uIGNvZGUKKyAgICAgICAleAkJcHJpbnQgd2FybmluZyBpZiBjb25kaXRpb25hbCBhbiBub3QgYXQgZW5kIG9mIElUIGJsb2NrIgorICAgICAgICVYCQlwcmludCAiXHQ7IHVucHJlZGljdGFibGUgPElUOmNvZGU+IiBpZiBjb25kaXRpb25hbAorCisgICAgICAgJTxiaXRmaWVsZD5kCXByaW50IGJpdGZpZWxkIGluIGRlY2ltYWwKKyAgICAgICAlPGJpdGZpZWxkPlcJcHJpbnQgYml0ZmllbGQqNCBpbiBkZWNpbWFsCisgICAgICAgJTxiaXRmaWVsZD5yCXByaW50IGJpdGZpZWxkIGFzIGFuIEFSTSByZWdpc3RlcgorICAgICAgICU8Yml0ZmllbGQ+YwlwcmludCBiaXRmaWVsZCBhcyBhIGNvbmRpdGlvbiBjb2RlCisKKyAgICAgICAlPGJpdGZpZWxkPidjCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXRmaWVsZCBpcyBhbGwgb25lcworICAgICAgICU8Yml0ZmllbGQ+YGMJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdGZpZWxkIGlzIGFsbCB6ZXJvZXMKKyAgICAgICAlPGJpdGZpZWxkPj9hYi4uLiBzZWxlY3QgZnJvbSBhcnJheSBvZiB2YWx1ZXMgaW4gYmlnIGVuZGlhbiBvcmRlcgorCisgICBXaXRoIG9uZSBleGNlcHRpb24gYXQgdGhlIGJvdHRvbSAoZG9uZSBiZWNhdXNlIEJMIGFuZCBCTFgoMSkgbmVlZAorICAgdG8gY29tZSBkZWFkIGxhc3QpLCB0aGlzIHRhYmxlIHdhcyBtYWNoaW5lLXNvcnRlZCBmaXJzdCBpbgorICAgZGVjcmVhc2luZyBvcmRlciBvZiBudW1iZXIgb2YgYml0cyBzZXQgaW4gdGhlIG1hc2ssIHRoZW4gaW4KKyAgIGluY3JlYXNpbmcgbnVtZXJpYyBvcmRlciBvZiBtYXNrLCB0aGVuIGluIGluY3JlYXNpbmcgbnVtZXJpYyBvcmRlcgorICAgb2Ygb3Bjb2RlLiAgVGhpcyBvcmRlciBpcyBub3QgdGhlIGNsZWFyZXN0IGZvciBhIGh1bWFuIHJlYWRlciwgYnV0CisgICBpcyBndWFyYW50ZWVkIG5ldmVyIHRvIGNhdGNoIGEgc3BlY2lhbC1jYXNlIGJpdCBwYXR0ZXJuIHdpdGggYSBtb3JlCisgICBnZW5lcmFsIG1hc2ssIHdoaWNoIGlzIGltcG9ydGFudCwgYmVjYXVzZSB0aGlzIGluc3RydWN0aW9uIGVuY29kaW5nCisgICBtYWtlcyBoZWF2eSB1c2Ugb2Ygc3BlY2lhbC1jYXNlIGJpdCBwYXR0ZXJucy4gICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wY29kZTMyIHRodW1iMzJfb3Bjb2Rlc1tdID0KK3sKKyAgLyogVjcgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAge0FSTV9FWFRfVjcsIDB4ZjkxMGYwMDAsIDB4ZmY3MGYwMDAsICJwbGklY1x0JWEifSwKKyAge0FSTV9FWFRfVjcsIDB4ZjNhZjgwZjAsIDB4ZmZmZmZmZjAsICJkYmclY1x0IyUwLTNkIn0sCisgIHtBUk1fRVhUX1Y3LCAweGYzYmY4ZjUwLCAweGZmZmZmZmYwLCAiZG1iJWNcdCVVIn0sCisgIHtBUk1fRVhUX1Y3LCAweGYzYmY4ZjQwLCAweGZmZmZmZmYwLCAiZHNiJWNcdCVVIn0sCisgIHtBUk1fRVhUX1Y3LCAweGYzYmY4ZjYwLCAweGZmZmZmZmYwLCAiaXNiJWNcdCVVIn0sCisgIHtBUk1fRVhUX0RJViwgMHhmYjkwZjBmMCwgMHhmZmYwZjBmMCwgInNkaXYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9ESVYsIDB4ZmJiMGYwZjAsIDB4ZmZmMGYwZjAsICJ1ZGl2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKworICAvKiBJbnN0cnVjdGlvbnMgZGVmaW5lZCBpbiB0aGUgYmFzaWMgVjZUMiBzZXQuICAqLworICB7QVJNX0VYVF9WNlQyLCAweGYzYWY4MDAwLCAweGZmZmZmZmZmLCAibm9wJWMudyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzYWY4MDAxLCAweGZmZmZmZmZmLCAieWllbGQlYy53In0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjgwMDIsIDB4ZmZmZmZmZmYsICJ3ZmUlYy53In0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjgwMDMsIDB4ZmZmZmZmZmYsICJ3ZmklYy53In0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjkwMDQsIDB4ZmZmZmZmZmYsICJzZXYlYy53In0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjgwMDAsIDB4ZmZmZmZmMDAsICJub3AlYy53XHR7JTAtN2R9In0sCisKKyAge0FSTV9FWFRfVjZUMiwgMHhmM2JmOGYyZiwgMHhmZmZmZmZmZiwgImNscmV4JWMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmM2FmODQwMCwgMHhmZmZmZmYxZiwgImNwc2llLndcdCU3J2ElNidpJTUnZiVYIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjg2MDAsIDB4ZmZmZmZmMWYsICJjcHNpZC53XHQlNydhJTYnaSU1J2YlWCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzYzA4ZjAwLCAweGZmZjBmZmZmLCAiYnhqJWNcdCUxNi0xOXIleCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU4MTBjMDAwLCAweGZmZDBmZmZmLCAicmZlZGIlY1x0JTE2LTE5ciUyMSchIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZTk5MGMwMDAsIDB4ZmZkMGZmZmYsICJyZmVpYSVjXHQlMTYtMTlyJTIxJyEifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmM2VmODAwMCwgMHhmZmVmZjAwMCwgIm1ycyVjXHQlOC0xMXIsICVEIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjgxMDAsIDB4ZmZmZmZmZTAsICJjcHNcdCMlMC00ZCVYIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZThkMGYwMDAsIDB4ZmZmMGZmZjAsICJ0YmIlY1x0WyUxNi0xOXIsICUwLTNyXSV4In0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZThkMGYwMTAsIDB4ZmZmMGZmZjAsICJ0YmglY1x0WyUxNi0xOXIsICUwLTNyLCBsc2wgIzFdJXgifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmM2FmODUwMCwgMHhmZmZmZmYwMCwgImNwc2llXHQlNydhJTYnaSU1J2YsICMlMC00ZCVYIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhZjg3MDAsIDB4ZmZmZmZmMDAsICJjcHNpZFx0JTcnYSU2J2klNSdmLCAjJTAtNGQlWCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzZGU4ZjAwLCAweGZmZmZmZjAwLCAic3VicyVjXHRwYywgbHIsICMlMC03ZCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzODA4MDAwLCAweGZmZTBmMDAwLCAibXNyJWNcdCVDLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZTg1MDBmMDAsIDB4ZmZmMDBmZmYsICJsZHJleCVjXHQlMTItMTVyLCBbJTE2LTE5cl0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlOGQwMGY0ZiwgMHhmZmYwMGZlZiwgImxkcmV4JTQ/aGIlY1x0JTEyLTE1ciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZTgwMGMwMDAsIDB4ZmZkMGZmZTAsICJzcnNkYiVjXHQlMTYtMTlyJTIxJyEsICMlMC00ZCJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5ODBjMDAwLCAweGZmZDBmZmUwLCAic3JzaWElY1x0JTE2LTE5ciUyMSchLCAjJTAtNGQifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTBmZjA4MCwgMHhmZmZmZjBjMCwgInN4dGglYy53XHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTFmZjA4MCwgMHhmZmZmZjBjMCwgInV4dGglYy53XHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTJmZjA4MCwgMHhmZmZmZjBjMCwgInN4dGIxNiVjXHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTNmZjA4MCwgMHhmZmZmZjBjMCwgInV4dGIxNiVjXHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTRmZjA4MCwgMHhmZmZmZjBjMCwgInN4dGIlYy53XHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTVmZjA4MCwgMHhmZmZmZjBjMCwgInV4dGIlYy53XHQlOC0xMXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlODQwMDAwMCwgMHhmZmYwMDBmZiwgInN0cmV4JWNcdCU4LTExciwgJTEyLTE1ciwgWyUxNi0xOXJdIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZThkMDAwN2YsIDB4ZmZmMDAwZmYsICJsZHJleGQlY1x0JTEyLTE1ciwgJTgtMTFyLCBbJTE2LTE5cl0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTgwZjAwMCwgMHhmZmYwZjBmMCwgInNhZGQ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTgwZjAxMCwgMHhmZmYwZjBmMCwgInFhZGQ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTgwZjAyMCwgMHhmZmYwZjBmMCwgInNoYWRkOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE4MGYwNDAsIDB4ZmZmMGYwZjAsICJ1YWRkOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE4MGYwNTAsIDB4ZmZmMGYwZjAsICJ1cWFkZDglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhODBmMDYwLCAweGZmZjBmMGYwLCAidWhhZGQ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTgwZjA4MCwgMHhmZmYwZjBmMCwgInFhZGQlY1x0JTgtMTFyLCAlMC0zciwgJTE2LTE5ciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhODBmMDkwLCAweGZmZjBmMGYwLCAicWRhZGQlY1x0JTgtMTFyLCAlMC0zciwgJTE2LTE5ciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhODBmMGEwLCAweGZmZjBmMGYwLCAicXN1YiVjXHQlOC0xMXIsICUwLTNyLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE4MGYwYjAsIDB4ZmZmMGYwZjAsICJxZHN1YiVjXHQlOC0xMXIsICUwLTNyLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE5MGYwMDAsIDB4ZmZmMGYwZjAsICJzYWRkMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhOTBmMDEwLCAweGZmZjBmMGYwLCAicWFkZDE2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTkwZjAyMCwgMHhmZmYwZjBmMCwgInNoYWRkMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhOTBmMDQwLCAweGZmZjBmMGYwLCAidWFkZDE2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTkwZjA1MCwgMHhmZmYwZjBmMCwgInVxYWRkMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhOTBmMDYwLCAweGZmZjBmMGYwLCAidWhhZGQxNiVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE5MGYwODAsIDB4ZmZmMGYwZjAsICJyZXYlYy53XHQlOC0xMXIsICUxNi0xOXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTkwZjA5MCwgMHhmZmYwZjBmMCwgInJldjE2JWMud1x0JTgtMTFyLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE5MGYwYTAsIDB4ZmZmMGYwZjAsICJyYml0JWNcdCU4LTExciwgJTE2LTE5ciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhOTBmMGIwLCAweGZmZjBmMGYwLCAicmV2c2glYy53XHQlOC0xMXIsICUxNi0xOXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWEwZjAwMCwgMHhmZmYwZjBmMCwgInNhZGRzdWJ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWEwZjAxMCwgMHhmZmYwZjBmMCwgInFhZGRzdWJ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWEwZjAyMCwgMHhmZmYwZjBmMCwgInNoYWRkc3VieCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFhMGYwNDAsIDB4ZmZmMGYwZjAsICJ1YWRkc3VieCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFhMGYwNTAsIDB4ZmZmMGYwZjAsICJ1cWFkZHN1YnglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhYTBmMDYwLCAweGZmZjBmMGYwLCAidWhhZGRzdWJ4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWEwZjA4MCwgMHhmZmYwZjBmMCwgInNlbCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFiMGYwODAsIDB4ZmZmMGYwZjAsICJjbHolY1x0JTgtMTFyLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFjMGYwMDAsIDB4ZmZmMGYwZjAsICJzc3ViOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFjMGYwMTAsIDB4ZmZmMGYwZjAsICJxc3ViOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFjMGYwMjAsIDB4ZmZmMGYwZjAsICJzaHN1YjglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhYzBmMDQwLCAweGZmZjBmMGYwLCAidXN1YjglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhYzBmMDUwLCAweGZmZjBmMGYwLCAidXFzdWI4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWMwZjA2MCwgMHhmZmYwZjBmMCwgInVoc3ViOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFkMGYwMDAsIDB4ZmZmMGYwZjAsICJzc3ViMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhZDBmMDEwLCAweGZmZjBmMGYwLCAicXN1YjE2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWQwZjAyMCwgMHhmZmYwZjBmMCwgInNoc3ViMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhZDBmMDQwLCAweGZmZjBmMGYwLCAidXN1YjE2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWQwZjA1MCwgMHhmZmYwZjBmMCwgInVxc3ViMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhZDBmMDYwLCAweGZmZjBmMGYwLCAidWhzdWIxNiVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFlMGYwMDAsIDB4ZmZmMGYwZjAsICJzc3ViYWRkeCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFlMGYwMTAsIDB4ZmZmMGYwZjAsICJxc3ViYWRkeCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmFlMGYwMjAsIDB4ZmZmMGYwZjAsICJzaHN1YmFkZHglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhZTBmMDQwLCAweGZmZjBmMGYwLCAidXN1YmFkZHglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhZTBmMDUwLCAweGZmZjBmMGYwLCAidXFzdWJhZGR4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYWUwZjA2MCwgMHhmZmYwZjBmMCwgInVoc3ViYWRkeCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmIwMGYwMDAsIDB4ZmZmMGYwZjAsICJtdWwlYy53XHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmI3MGYwMDAsIDB4ZmZmMGYwZjAsICJ1c2FkOCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmEwMGYwMDAsIDB4ZmZlMGYwZjAsICJsc2wlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTIwZjAwMCwgMHhmZmUwZjBmMCwgImxzciUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhNDBmMDAwLCAweGZmZTBmMGYwLCAiYXNyJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE2MGYwMDAsIDB4ZmZlMGYwZjAsICJyb3IlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlOGMwMGY0MCwgMHhmZmYwMGZlMCwgInN0cmV4JTQ/aGIlY1x0JTAtM3IsICUxMi0xNXIsIFslMTYtMTlyXSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzMjAwMDAwLCAweGZmZjBmMGUwLCAic3NhdDE2JWNcdCU4LTExciwgIyUwLTRkLCAlMTYtMTlyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNhMDAwMDAsIDB4ZmZmMGYwZTAsICJ1c2F0MTYlY1x0JTgtMTFyLCAjJTAtNGQsICUxNi0xOXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjIwZjAwMCwgMHhmZmYwZjBlMCwgInNtdWFkJTQneCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmIzMGYwMDAsIDB4ZmZmMGYwZTAsICJzbXVsdyU0P3RiJWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjQwZjAwMCwgMHhmZmYwZjBlMCwgInNtdXNkJTQneCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmI1MGYwMDAsIDB4ZmZmMGYwZTAsICJzbW11bCU0J3IlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhMDBmMDgwLCAweGZmZjBmMGMwLCAic3h0YWglY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciVSIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmExMGYwODAsIDB4ZmZmMGYwYzAsICJ1eHRhaCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYTIwZjA4MCwgMHhmZmYwZjBjMCwgInN4dGFiMTYlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciVSIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmEzMGYwODAsIDB4ZmZmMGYwYzAsICJ1eHRhYjE2JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IlUiJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZhNDBmMDgwLCAweGZmZjBmMGMwLCAic3h0YWIlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciVSIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmE1MGYwODAsIDB4ZmZmMGYwYzAsICJ1eHRhYiVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyJVIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjEwZjAwMCwgMHhmZmYwZjBjMCwgInNtdWwlNT90YiU0P3RiJWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMzZmMDAwMCwgMHhmZmZmODAyMCwgImJmYyVjXHQlOC0xMXIsICVFIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWExMDBmMDAsIDB4ZmZmMDhmMDAsICJ0c3QlYy53XHQlMTYtMTlyLCAlUyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGVhOTAwZjAwLCAweGZmZjA4ZjAwLCAidGVxJWNcdCUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWIxMDBmMDAsIDB4ZmZmMDhmMDAsICJjbW4lYy53XHQlMTYtMTlyLCAlUyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGViYjAwZjAwLCAweGZmZjA4ZjAwLCAiY21wJWMud1x0JTE2LTE5ciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMDEwMGYwMCwgMHhmYmYwOGYwMCwgInRzdCVjLndcdCUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjA5MDBmMDAsIDB4ZmJmMDhmMDAsICJ0ZXElY1x0JTE2LTE5ciwgJU0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMTEwMGYwMCwgMHhmYmYwOGYwMCwgImNtbiVjLndcdCUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjFiMDBmMDAsIDB4ZmJmMDhmMDAsICJjbXAlYy53XHQlMTYtMTlyLCAlTSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGVhNGYwMDAwLCAweGZmZWY4MDAwLCAibW92JTIwJ3MlYy53XHQlOC0xMXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWE2ZjAwMDAsIDB4ZmZlZjgwMDAsICJtdm4lMjAncyVjLndcdCU4LTExciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlOGMwMDA3MCwgMHhmZmYwMDBmMCwgInN0cmV4ZCVjXHQlMC0zciwgJTEyLTE1ciwgJTgtMTFyLCBbJTE2LTE5cl0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjAwMDAwMCwgMHhmZmYwMDBmMCwgIm1sYSVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmIwMDAwMTAsIDB4ZmZmMDAwZjAsICJtbHMlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZiNzAwMDAwLCAweGZmZjAwMGYwLCAidXNhZGE4JWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjgwMDAwMCwgMHhmZmYwMDBmMCwgInNtdWxsJWNcdCUxMi0xNXIsICU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYmEwMDAwMCwgMHhmZmYwMDBmMCwgInVtdWxsJWNcdCUxMi0xNXIsICU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYmMwMDAwMCwgMHhmZmYwMDBmMCwgInNtbGFsJWNcdCUxMi0xNXIsICU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYmUwMDAwMCwgMHhmZmYwMDBmMCwgInVtbGFsJWNcdCUxMi0xNXIsICU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYmUwMDA2MCwgMHhmZmYwMDBmMCwgInVtYWFsJWNcdCUxMi0xNXIsICU4LTExciwgJTE2LTE5ciwgJTAtM3IifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlODUwMGYwMCwgMHhmZmYwMGYwMCwgImxkcmV4JWNcdCUxMi0xNXIsIFslMTYtMTlyLCAjJTAtN1ddIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjdmMDgwMDAsIDB4ZmZmMGYwMDAsICJzbWMlY1x0JUsifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMDRmMDAwMCwgMHhmYmVmODAwMCwgIm1vdiUyMCdzJWMud1x0JTgtMTFyLCAlTSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYwNmYwMDAwLCAweGZiZWY4MDAwLCAibXZuJTIwJ3MlYy53XHQlOC0xMXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjgxMGYwMDAsIDB4ZmY3MGYwMDAsICJwbGQlY1x0JWEifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjIwMDAwMCwgMHhmZmYwMDBlMCwgInNtbGFkJTQneCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmIzMDAwMDAsIDB4ZmZmMDAwZTAsICJzbWxhdyU0P3RiJWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYjQwMDAwMCwgMHhmZmYwMDBlMCwgInNtbHNkJTQneCVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmI1MDAwMDAsIDB4ZmZmMDAwZTAsICJzbW1sYSU0J3IlY1x0JTgtMTFyLCAlMTYtMTlyLCAlMC0zciwgJTEyLTE1ciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZiNjAwMDAwLCAweGZmZjAwMGUwLCAic21tbHMlNCdyJWNcdCU4LTExciwgJTE2LTE5ciwgJTAtM3IsICUxMi0xNXIifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmYmMwMDBjMCwgMHhmZmYwMDBlMCwgInNtbGFsZCU0J3glY1x0JTEyLTE1ciwgJTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGZiZDAwMGMwLCAweGZmZjAwMGUwLCAic21sc2xkJTQneCVjXHQlMTItMTVyLCAlOC0xMXIsICUxNi0xOXIsICUwLTNyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWFjMDAwMDAsIDB4ZmZmMDgwMzAsICJwa2hidCVjXHQlOC0xMXIsICUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWFjMDAwMjAsIDB4ZmZmMDgwMzAsICJwa2h0YiVjXHQlOC0xMXIsICUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjM0MDAwMDAsIDB4ZmZmMDgwMjAsICJzYmZ4JWNcdCU4LTExciwgJTE2LTE5ciwgJUYifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmM2MwMDAwMCwgMHhmZmYwODAyMCwgInViZnglY1x0JTgtMTFyLCAlMTYtMTlyLCAlRiJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGY4MDAwZTAwLCAweGZmOTAwZjAwLCAic3RyJXd0JWNcdCUxMi0xNXIsICVhIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmIxMDAwMDAsIDB4ZmZmMDAwYzAsICJzbWxhJTU/dGIlND90YiVjXHQlOC0xMXIsICUxNi0xOXIsICUwLTNyLCAlMTItMTVyIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZmJjMDAwODAsIDB4ZmZmMDAwYzAsICJzbWxhbCU1P3RiJTQ/dGIlY1x0JTEyLTE1ciwgJTgtMTFyLCAlMTYtMTlyLCAlMC0zciJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzNjAwMDAwLCAweGZmZjA4MDIwLCAiYmZpJWNcdCU4LTExciwgJTE2LTE5ciwgJUUifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmODEwMGUwMCwgMHhmZTkwMGYwMCwgImxkciV3dCVjXHQlMTItMTVyLCAlYSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYzMDAwMDAwLCAweGZmZDA4MDIwLCAic3NhdCVjXHQlOC0xMXIsICMlMC00ZCwgJTE2LTE5ciVzIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjM4MDAwMDAsIDB4ZmZkMDgwMjAsICJ1c2F0JWNcdCU4LTExciwgIyUwLTRkLCAlMTYtMTlyJXMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMjAwMDAwMCwgMHhmYmYwODAwMCwgImFkZHclY1x0JTgtMTFyLCAlMTYtMTlyLCAlSSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYyNDAwMDAwLCAweGZiZjA4MDAwLCAibW92dyVjXHQlOC0xMXIsICVKIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjJhMDAwMDAsIDB4ZmJmMDgwMDAsICJzdWJ3JWNcdCU4LTExciwgJTE2LTE5ciwgJUkifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMmMwMDAwMCwgMHhmYmYwODAwMCwgIm1vdnQlY1x0JTgtMTFyLCAlSiJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGVhMDAwMDAwLCAweGZmZTA4MDAwLCAiYW5kJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWEyMDAwMDAsIDB4ZmZlMDgwMDAsICJiaWMlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlYTQwMDAwMCwgMHhmZmUwODAwMCwgIm9yciUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlUyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGVhNjAwMDAwLCAweGZmZTA4MDAwLCAib3JuJTIwJ3MlY1x0JTgtMTFyLCAlMTYtMTlyLCAlUyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGVhODAwMDAwLCAweGZmZTA4MDAwLCAiZW9yJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWIwMDAwMDAsIDB4ZmZlMDgwMDAsICJhZGQlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlYjQwMDAwMCwgMHhmZmUwODAwMCwgImFkYyUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlUyJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGViNjAwMDAwLCAweGZmZTA4MDAwLCAic2JjJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVTIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZWJhMDAwMDAsIDB4ZmZlMDgwMDAsICJzdWIlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlYmMwMDAwMCwgMHhmZmUwODAwMCwgInJzYiUyMCdzJWNcdCU4LTExciwgJTE2LTE5ciwgJVMifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlODQwMDAwMCwgMHhmZmYwMDAwMCwgInN0cmV4JWNcdCU4LTExciwgJTEyLTE1ciwgWyUxNi0xOXIsICMlMC03V10ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMDAwMDAwMCwgMHhmYmUwODAwMCwgImFuZCUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlTSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYwMjAwMDAwLCAweGZiZTA4MDAwLCAiYmljJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjA0MDAwMDAsIDB4ZmJlMDgwMDAsICJvcnIlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJU0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMDYwMDAwMCwgMHhmYmUwODAwMCwgIm9ybiUyMCdzJWNcdCU4LTExciwgJTE2LTE5ciwgJU0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMDgwMDAwMCwgMHhmYmUwODAwMCwgImVvciUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlTSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYxMDAwMDAwLCAweGZiZTA4MDAwLCAiYWRkJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjE0MDAwMDAsIDB4ZmJlMDgwMDAsICJhZGMlMjAncyVjLndcdCU4LTExciwgJTE2LTE5ciwgJU0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhmMTYwMDAwMCwgMHhmYmUwODAwMCwgInNiYyUyMCdzJWMud1x0JTgtMTFyLCAlMTYtMTlyLCAlTSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGYxYTAwMDAwLCAweGZiZTA4MDAwLCAic3ViJTIwJ3MlYy53XHQlOC0xMXIsICUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjFjMDAwMDAsIDB4ZmJlMDgwMDAsICJyc2IlMjAncyVjXHQlOC0xMXIsICUxNi0xOXIsICVNIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZTg4MDAwMDAsIDB4ZmZkMDAwMDAsICJzdG1pYSVjLndcdCUxNi0xOXIlMjEnISwgJW0ifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlODkwMDAwMCwgMHhmZmQwMDAwMCwgImxkbWlhJWMud1x0JTE2LTE5ciUyMSchLCAlbSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5MDAwMDAwLCAweGZmZDAwMDAwLCAic3RtZGIlY1x0JTE2LTE5ciUyMSchLCAlbSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5MTAwMDAwLCAweGZmZDAwMDAwLCAibGRtZGIlY1x0JTE2LTE5ciUyMSchLCAlbSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5YzAwMDAwLCAweGZmZDAwMGZmLCAic3RyZCVjXHQlMTItMTVyLCAlOC0xMXIsIFslMTYtMTlyXSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5ZDAwMDAwLCAweGZmZDAwMGZmLCAibGRyZCVjXHQlMTItMTVyLCAlOC0xMXIsIFslMTYtMTlyXSJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5NDAwMDAwLCAweGZmNTAwMDAwLCAic3RyZCVjXHQlMTItMTVyLCAlOC0xMXIsIFslMTYtMTlyLCAjJTIzYC0lMC03V10lMjEnISJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU5NTAwMDAwLCAweGZmNTAwMDAwLCAibGRyZCVjXHQlMTItMTVyLCAlOC0xMXIsIFslMTYtMTlyLCAjJTIzYC0lMC03V10lMjEnISJ9LAorICB7QVJNX0VYVF9WNlQyLCAweGU4NjAwMDAwLCAweGZmNzAwMDAwLCAic3RyZCVjXHQlMTItMTVyLCAlOC0xMXIsIFslMTYtMTlyXSwgIyUyM2AtJTAtN1cifSwKKyAge0FSTV9FWFRfVjZUMiwgMHhlODcwMDAwMCwgMHhmZjcwMDAwMCwgImxkcmQlY1x0JTEyLTE1ciwgJTgtMTFyLCBbJTE2LTE5cl0sICMlMjNgLSUwLTdXIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjgwMDAwMDAsIDB4ZmYxMDAwMDAsICJzdHIldyVjLndcdCUxMi0xNXIsICVhIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjgxMDAwMDAsIDB4ZmUxMDAwMDAsICJsZHIldyVjLndcdCUxMi0xNXIsICVhIn0sCisKKyAgLyogRmlsdGVyIG91dCBCY2Mgd2l0aCBjb25kPUUgb3IgRiwgd2hpY2ggYXJlIHVzZWQgZm9yIG90aGVyIGluc3RydWN0aW9ucy4gICovCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjNjMDgwMDAsIDB4ZmJjMGQwMDAsICJ1bmRlZmluZWQgKGJjYywgY29uZD0weEYpIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjM4MDgwMDAsIDB4ZmJjMGQwMDAsICJ1bmRlZmluZWQgKGJjYywgY29uZD0weEUpIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjAwMDgwMDAsIDB4ZjgwMGQwMDAsICJiJTIyLTI1Yy53XHQlYiVYIn0sCisgIHtBUk1fRVhUX1Y2VDIsIDB4ZjAwMDkwMDAsIDB4ZjgwMGQwMDAsICJiJWMud1x0JUIleCJ9LAorCisgIC8qIFRoZXNlIGhhdmUgYmVlbiAzMi1iaXQgc2luY2UgdGhlIGludmVudGlvbiBvZiBUaHVtYi4gICovCisgIHtBUk1fRVhUX1Y0VCwgIDB4ZjAwMGMwMDAsIDB4ZjgwMGQwMDAsICJibHglY1x0JUIleCJ9LAorICB7QVJNX0VYVF9WNFQsICAweGYwMDBkMDAwLCAweGY4MDBkMDAwLCAiYmwlY1x0JUIleCJ9LAorCisgIC8qIEZhbGxiYWNrLiAgKi8KKyAge0FSTV9FWFRfVjEsICAgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCJ9LAorICB7MCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhcm1fY29uZGl0aW9uYWxbXSA9Cit7ImVxIiwgIm5lIiwgImNzIiwgImNjIiwgIm1pIiwgInBsIiwgInZzIiwgInZjIiwKKyAiaGkiLCAibHMiLCAiZ2UiLCAibHQiLCAiZ3QiLCAibGUiLCAiYWwiLCAiPHVuZD4iLCAiIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhcm1fZnBfY29uc3RbXSA9Cit7IjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhcm1fc2hpZnRbXSA9Cit7ImxzbCIsICJsc3IiLCAiYXNyIiwgInJvciJ9OworCit0eXBlZGVmIHN0cnVjdAoreworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKyAgY29uc3QgY2hhciAqcmVnX25hbWVzWzE2XTsKK30KK2FybV9yZWduYW1lOworCitzdGF0aWMgY29uc3QgYXJtX3JlZ25hbWUgcmVnbmFtZXNbXSA9Cit7CisgIHsgInJhdyIgLCAiU2VsZWN0IHJhdyByZWdpc3RlciBuYW1lcyIsCisgICAgeyAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUifX0sCisgIHsgImdjYyIsICAiU2VsZWN0IHJlZ2lzdGVyIG5hbWVzIHVzZWQgYnkgR0NDIiwKKyAgICB7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsICJyOCIsICJyOSIsICJzbCIsICAiZnAiLCAgImlwIiwgICJzcCIsICAibHIiLCAgInBjIiB9fSwKKyAgeyAic3RkIiwgICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiBBUk0ncyBJU0EgZG9jdW1lbnRhdGlvbiIsCisgICAgeyAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLCAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAic3AiLCAgImxyIiwgICJwYyIgfX0sCisgIHsgImFwY3MiLCAiU2VsZWN0IHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gdGhlIEFQQ1MiLAorICAgIHsgImExIiwgImEyIiwgImEzIiwgImE0IiwgInYxIiwgInYyIiwgInYzIiwgInY0IiwgInY1IiwgInY2IiwgInNsIiwgICJmcCIsICAiaXAiLCAgInNwIiwgICJsciIsICAicGMiIH19LAorICB7ICJhdHBjcyIsICJTZWxlY3QgcmVnaXN0ZXIgbmFtZXMgdXNlZCBpbiB0aGUgQVRQQ1MiLAorICAgIHsgImExIiwgImEyIiwgImEzIiwgImE0IiwgInYxIiwgInYyIiwgInYzIiwgInY0IiwgInY1IiwgInY2IiwgInY3IiwgICJ2OCIsICAiSVAiLCAgIlNQIiwgICJMUiIsICAiUEMiIH19LAorICB7ICJzcGVjaWFsLWF0cGNzIiwgIlNlbGVjdCBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIHVzZWQgaW4gdGhlIEFUUENTIiwKKyAgICB7ICJhMSIsICJhMiIsICJhMyIsICJhNCIsICJ2MSIsICJ2MiIsICJ2MyIsICJXUiIsICJ2NSIsICJTQiIsICJTTCIsICAiRlAiLCAgIklQIiwgICJTUCIsICAiTFIiLCAgIlBDIiB9fSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpd21teHRfd3duYW1lc1tdID0KK3siYiIsICJoIiwgInciLCAiZCJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaXdtbXh0X3d3c3NuYW1lc1tdID0KK3siYiIsICJidXMiLCAiYmMiLCAiYnNzIiwKKyAiaCIsICJodXMiLCAiaGMiLCAiaHNzIiwKKyAidyIsICJ3dXMiLCAid2MiLCAid3NzIiwKKyAiZCIsICJkdXMiLCAiZGMiLCAiZHNzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGl3bW14dF9yZWduYW1lc1tdID0KK3sgIndyMCIsICJ3cjEiLCAid3IyIiwgIndyMyIsICJ3cjQiLCAid3I1IiwgIndyNiIsICJ3cjciLAorICAid3I4IiwgIndyOSIsICJ3cjEwIiwgIndyMTEiLCAid3IxMiIsICJ3cjEzIiwgIndyMTQiLCAid3IxNSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBpd21teHRfY3JlZ25hbWVzW10gPQoreyAid2NpZCIsICJ3Y29uIiwgIndjc3NmIiwgIndjYXNmIiwgInJlc2VydmVkIiwgInJlc2VydmVkIiwgInJlc2VydmVkIiwgInJlc2VydmVkIiwKKyAgIndjZ3IwIiwgIndjZ3IxIiwgIndjZ3IyIiwgIndjZ3IzIiwgInJlc2VydmVkIiwgInJlc2VydmVkIiwgInJlc2VydmVkIiwgInJlc2VydmVkIgorfTsKKworLyogRGVmYXVsdCB0byBHQ0MgcmVnaXN0ZXIgbmFtZSBzZXQuICAqLworc3RhdGljIHVuc2lnbmVkIGludCByZWduYW1lX3NlbGVjdGVkID0gMTsKKworI2RlZmluZSBOVU1fQVJNX1JFR05BTUVTICBOVU1fRUxFTSAocmVnbmFtZXMpCisjZGVmaW5lIGFybV9yZWduYW1lcyAgICAgIHJlZ25hbWVzW3JlZ25hbWVfc2VsZWN0ZWRdLnJlZ19uYW1lcworCitzdGF0aWMgYmZkX2Jvb2xlYW4gZm9yY2VfdGh1bWIgPSBmYWxzZTsKKworLyogQ3VycmVudCBJVCBpbnN0cnVjdGlvbiBzdGF0ZS4gIFRoaXMgY29udGFpbnMgdGhlIHNhbWUgc3RhdGUgYXMgdGhlIElUCisgICBiaXRzIGluIHRoZSBDUFNSLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWZ0aGVuX3N0YXRlOworLyogSVQgc3RhdGUgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaWZ0aGVuX25leHRfc3RhdGU7CisvKiBUaGUgYWRkcmVzcyBvZiB0aGUgaW5zbiBmb3Igd2hpY2ggdGhlIElUIHN0YXRlIGlzIHZhbGlkLiAgKi8KK3N0YXRpYyBiZmRfdm1hIGlmdGhlbl9hZGRyZXNzOworI2RlZmluZSBJRlRIRU5fQ09ORCAoKGlmdGhlbl9zdGF0ZSA+PiA0KSAmIDB4ZikKKworLyogQ2FjaGVkIG1hcHBpbmcgc3ltYm9sIHN0YXRlLiAgKi8KK2VudW0gbWFwX3R5cGUgeworICBNQVBfQVJNLAorICBNQVBfVEhVTUIsCisgIE1BUF9EQVRBCit9OworCitlbnVtIG1hcF90eXBlIGxhc3RfdHlwZTsKK2ludCBsYXN0X21hcHBpbmdfc3ltID0gLTE7CitiZmRfdm1hIGxhc3RfbWFwcGluZ19hZGRyID0gMDsKKworLyogRGVjb2RlIGEgYml0ZmllbGQgb2YgdGhlIGZvcm0gbWF0Y2hpbmcgcmVnZXhwIChOKC1OKT8sKSpOKC1OKT8uCisgICBSZXR1cm5zIHBvaW50ZXIgdG8gZm9sbG93aW5nIGNoYXJhY3RlciBvZiB0aGUgZm9ybWF0IHN0cmluZyBhbmQKKyAgIGZpbGxzIGluICpWQUxVRVAgYW5kICpXSURUSFAgd2l0aCB0aGUgZXh0cmFjdGVkIHZhbHVlIGFuZCBudW1iZXIgb2YKKyAgIGJpdHMgZXh0cmFjdGVkLiAgV0lEVEhQIGNhbiBiZSBOVUxMLiAqLworCitzdGF0aWMgY29uc3QgY2hhciAqCithcm1fZGVjb2RlX2JpdGZpZWxkIChjb25zdCBjaGFyICpwdHIsIHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkJICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXAsIGludCAqd2lkdGhwKQoreworICB1bnNpZ25lZCBsb25nIHZhbHVlID0gMDsKKyAgaW50IHdpZHRoID0gMDsKKworICBkbworICAgIHsKKyAgICAgIGludCBzdGFydCwgZW5kOworICAgICAgaW50IGJpdHM7CisKKyAgICAgIGZvciAoc3RhcnQgPSAwOyAqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JzsgcHRyKyspCisJc3RhcnQgPSBzdGFydCAqIDEwICsgKnB0ciAtICcwJzsKKyAgICAgIGlmICgqcHRyID09ICctJykKKwlmb3IgKGVuZCA9IDAsIHB0cisrOyAqcHRyID49ICcwJyAmJiAqcHRyIDw9ICc5JzsgcHRyKyspCisJICBlbmQgPSBlbmQgKiAxMCArICpwdHIgLSAnMCc7CisgICAgICBlbHNlCisJZW5kID0gc3RhcnQ7CisgICAgICBiaXRzID0gZW5kIC0gc3RhcnQ7CisgICAgICBpZiAoYml0cyA8IDApCisJYWJvcnQgKCk7CisgICAgICB2YWx1ZSB8PSAoKGluc24gPj4gc3RhcnQpICYgKCgydWwgPDwgYml0cykgLSAxKSkgPDwgd2lkdGg7CisgICAgICB3aWR0aCArPSBiaXRzICsgMTsKKyAgICB9CisgIHdoaWxlICgqcHRyKysgPT0gJywnKTsKKyAgKnZhbHVlcCA9IHZhbHVlOworICBpZiAod2lkdGhwKQorICAgICp3aWR0aHAgPSB3aWR0aDsKKyAgcmV0dXJuIHB0ciAtIDE7Cit9CisKK3N0YXRpYyB2b2lkCithcm1fZGVjb2RlX3NoaWZ0IChsb25nIGdpdmVuLCBmcHJpbnRmX2Z1bmN0aW9uIGZ1bmMsIHZvaWQgKnN0cmVhbSwKKwkJICBpbnQgcHJpbnRfc2hpZnQpCit7CisgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7CisKKyAgaWYgKChnaXZlbiAmIDB4ZmYwKSAhPSAwKQorICAgIHsKKyAgICAgIGlmICgoZ2l2ZW4gJiAweDEwKSA9PSAwKQorCXsKKwkgIGludCBhbW91bnQgPSAoZ2l2ZW4gJiAweGY4MCkgPj4gNzsKKwkgIGludCBzaGlmdCA9IChnaXZlbiAmIDB4NjApID4+IDU7CisKKwkgIGlmIChhbW91bnQgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChzaGlmdCA9PSAzKQorCQl7CisJCSAgZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKKwkJICByZXR1cm47CisJCX0KKworCSAgICAgIGFtb3VudCA9IDMyOworCSAgICB9CisKKwkgIGlmIChwcmludF9zaGlmdCkKKwkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyAjJWQiLCBhcm1fc2hpZnRbc2hpZnRdLCBhbW91bnQpOworCSAgZWxzZQorCSAgICBmdW5jIChzdHJlYW0sICIsICMlZCIsIGFtb3VudCk7CisJfQorICAgICAgZWxzZSBpZiAocHJpbnRfc2hpZnQpCisJZnVuYyAoc3RyZWFtLCAiLCAlcyAlcyIsIGFybV9zaGlmdFsoZ2l2ZW4gJiAweDYwKSA+PiA1XSwKKwkgICAgICBhcm1fcmVnbmFtZXNbKGdpdmVuICYgMHhmMDApID4+IDhdKTsKKyAgICAgIGVsc2UKKwlmdW5jIChzdHJlYW0sICIsICVzIiwgYXJtX3JlZ25hbWVzWyhnaXZlbiAmIDB4ZjAwKSA+PiA4XSk7CisgICAgfQorfQorCisvKiBQcmludCBvbmUgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gb24gSU5GTy0+U1RSRUFNLgorICAgUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIG1hdGNoZWQsIGZhbHNlIGlmIHRoaXMgaXMgbm90IGEKKyAgIHJlY29nbmlzZWQgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgYmZkX2Jvb2xlYW4KK3ByaW50X2luc25fY29wcm9jZXNzb3IgKGJmZF92bWEgcGMsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBsb25nIGdpdmVuLAorCQkJYmZkX2Jvb2xlYW4gdGh1bWIpCit7CisgIGNvbnN0IHN0cnVjdCBvcGNvZGUzMiAqaW5zbjsKKyAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOworICBmcHJpbnRmX2Z1bmN0aW9uIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisgIHVuc2lnbmVkIGxvbmcgbWFzazsKKyAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgaW50IGNvbmQ7CisKKyAgZm9yIChpbnNuID0gY29wcm9jZXNzb3Jfb3Bjb2RlczsgaW5zbi0+YXNzZW1ibGVyOyBpbnNuKyspCisgICAgeworICAgICAgaWYgKGluc24tPnZhbHVlID09IEZJUlNUX0lXTU1YVF9JTlNOCisJICAmJiBpbmZvLT5tYWNoICE9IGJmZF9tYWNoX2FybV9YU2NhbGUKKwkgICYmIGluZm8tPm1hY2ggIT0gYmZkX21hY2hfYXJtX2lXTU1YdAorCSAgJiYgaW5mby0+bWFjaCAhPSBiZmRfbWFjaF9hcm1faVdNTVh0MikKKwlpbnNuID0gaW5zbiArIElXTU1YVF9JTlNOX0NPVU5UOworCisgICAgICBtYXNrID0gaW5zbi0+bWFzazsKKyAgICAgIHZhbHVlID0gaW5zbi0+dmFsdWU7CisgICAgICBpZiAodGh1bWIpCisJeworCSAgLyogVGhlIGhpZ2ggNCBiaXRzIGFyZSAweGUgZm9yIEFybSBjb25kaXRpb25hbCBpbnN0cnVjdGlvbnMsIGFuZAorCSAgICAgMHhlIGZvciBhcm0gdW5jb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuICBUaGUgcmVzdCBvZiB0aGUKKwkgICAgIGVuY29kaW5nIGlzIHRoZSBzYW1lLiAgKi8KKwkgIG1hc2sgfD0gMHhmMDAwMDAwMDsKKwkgIHZhbHVlIHw9IDB4ZTAwMDAwMDA7CisJICBpZiAoaWZ0aGVuX3N0YXRlKQorCSAgICBjb25kID0gSUZUSEVOX0NPTkQ7CisJICBlbHNlCisJICAgIGNvbmQgPSAxNjsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogT25seSBtYXRjaCB1bmNvbmRpdGlvbmFsIGluc3R1Y3Rpb25zIGFnYWluc3QgdW5jb25kaXRpb25hbAorCSAgICAgcGF0dGVybnMuICAqLworCSAgaWYgKChnaXZlbiAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisJICAgIHsKKwkgICAgICBtYXNrIHw9IDB4ZjAwMDAwMDA7CisJICAgICAgY29uZCA9IDE2OworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBjb25kID0gKGdpdmVuID4+IDI4KSAmIDB4ZjsKKwkgICAgICBpZiAoY29uZCA9PSAweGUpCisJCWNvbmQgPSAxNjsKKwkgICAgfQorCX0KKyAgICAgIGlmICgoZ2l2ZW4gJiBtYXNrKSA9PSB2YWx1ZSkKKwl7CisJICBjb25zdCBjaGFyICpjOworCisJICBmb3IgKGMgPSBpbnNuLT5hc3NlbWJsZXI7ICpjOyBjKyspCisJICAgIHsKKwkgICAgICBpZiAoKmMgPT0gJyUnKQorCQl7CisJCSAgc3dpdGNoICgqKytjKQorCQkgICAgeworCQkgICAgY2FzZSAnJSc6CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiUlIik7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdBJzoKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgYXJtX3JlZ25hbWVzIFsoZ2l2ZW4gPj4gMTYpICYgMHhmXSk7CisKKwkJICAgICAgaWYgKChnaXZlbiAmICgxIDw8IDI0KSkgIT0gMCkKKwkJCXsKKwkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKKworCQkJICBpZiAob2Zmc2V0KQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgIyVzJWRdJXMiLAorCQkJCSAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCisJCQkJICBvZmZzZXQgKiA0LAorCQkJCSAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDAgPyAiISIgOiAiIikpOworCQkJICBlbHNlCisJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOworCQkJfQorCQkgICAgICBlbHNlCisJCQl7CisJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7CisKKwkJCSAgZnVuYyAoc3RyZWFtLCAiXSIpOworCisJCQkgIGlmIChnaXZlbiAmICgxIDw8IDIxKSkKKwkJCSAgICB7CisJCQkgICAgICBpZiAob2Zmc2V0KQorCQkJCWZ1bmMgKHN0cmVhbSwgIiwgIyVzJWQiLAorCQkJCSAgICAgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAorCQkJCSAgICAgIG9mZnNldCAqIDQpOworCQkJICAgIH0KKwkJCSAgZWxzZQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgeyVkfSIsIG9mZnNldCk7CisJCQl9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdCJzoKKwkJICAgICAgeworCQkJaW50IHJlZ25vID0gKChnaXZlbiA+PiAxMikgJiAweGYpIHwgKChnaXZlbiA+PiAoMjIgLSA0KSkgJiAweDEwKTsKKwkJCWludCBvZmZzZXQgPSAoZ2l2ZW4gPj4gMSkgJiAweDNmOworCisJCQlpZiAob2Zmc2V0ID09IDEpCisJCQkgIGZ1bmMgKHN0cmVhbSwgIntkJWR9IiwgcmVnbm8pOworCQkJZWxzZSBpZiAocmVnbm8gKyBvZmZzZXQgPiAzMikKKwkJCSAgZnVuYyAoc3RyZWFtLCAie2QlZC08b3ZlcmZsb3cgcmVnIGQlZD59IiwgcmVnbm8sIHJlZ25vICsgb2Zmc2V0IC0gMSk7CisJCQllbHNlCisJCQkgIGZ1bmMgKHN0cmVhbSwgIntkJWQtZCVkfSIsIHJlZ25vLCByZWdubyArIG9mZnNldCAtIDEpOworCQkgICAgICB9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdDJzoKKwkJICAgICAgeworCQkJaW50IHJuID0gKGdpdmVuID4+IDE2KSAmIDB4ZjsKKwkJCWludCBvZmZzZXQgPSAoZ2l2ZW4gJiAweGZmKSAqIDQ7CisJCQlpbnQgYWRkID0gKGdpdmVuID4+IDIzKSAmIDE7CisKKwkJCWZ1bmMgKHN0cmVhbSwgIlslcyIsIGFybV9yZWduYW1lc1tybl0pOworCisJCQlpZiAob2Zmc2V0KQorCQkJICB7CisJCQkgICAgaWYgKCFhZGQpCisJCQkgICAgICBvZmZzZXQgPSAtb2Zmc2V0OworCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgIyVkIiwgb2Zmc2V0KTsKKwkJCSAgfQorCQkJZnVuYyAoc3RyZWFtLCAiXSIpOworCQkJaWYgKHJuID09IDE1KQorCQkJICB7CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBVbnN1cmUgaWYgaW5mby0+Ynl0ZXNfcGVyX2NodW5rIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IHRoaW5nIHRvIHVzZSBoZXJlLiAgKi8KKwkJCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCArIHBjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGluZm8tPmJ5dGVzX3Blcl9jaHVuayAqIDIsIGluZm8pOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2MnOgorCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9jb25kaXRpb25hbFtjb25kXSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdJJzoKKwkJICAgICAgLyogUHJpbnQgYSBDaXJydXMvRFNQIHNoaWZ0IGltbWVkaWF0ZS4gICovCisJCSAgICAgIC8qIEltbWVkaWF0ZXMgYXJlIDdiaXQgc2lnbmVkIGludHMgd2l0aCBiaXRzIDAuLjMgaW4KKwkJCSBiaXRzIDAuLjMgb2Ygb3Bjb2RlIGFuZCBiaXRzIDQuLjYgaW4gYml0cyA1Li43CisJCQkgb2Ygb3Bjb2RlLiAgKi8KKwkJICAgICAgeworCQkJaW50IGltbTsKKworCQkJaW1tID0gKGdpdmVuICYgMHhmKSB8ICgoZ2l2ZW4gJiAweGUwKSA+PiAxKTsKKworCQkJLyogSXMgYGBpbW0nJyBhIG5lZ2F0aXZlIG51bWJlcj8gICovCisJCQlpZiAoaW1tICYgMHg0MCkKKwkJCSAgaW1tIHw9ICgtMSA8PCA3KTsKKworCQkJZnVuYyAoc3RyZWFtLCAiJWQiLCBpbW0pOworCQkgICAgICB9CisKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ0YnOgorCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDQwODAwMCkKKwkJCXsKKwkJCWNhc2UgMDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAiNCIpOworCQkJICBicmVhazsKKwkJCWNhc2UgMHg4MDAwOgorCQkJICBmdW5jIChzdHJlYW0sICIxIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDAwNDAwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICIyIik7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAiMyIpOworCQkJfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnUCc6CisJCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwMDgwMDgwKQorCQkJeworCQkJY2FzZSAwOgorCQkJICBmdW5jIChzdHJlYW0sICJzIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDgwOgorCQkJICBmdW5jIChzdHJlYW0sICJkIik7CisJCQkgIGJyZWFrOworCQkJY2FzZSAweDAwMDgwMDAwOgorCQkJICBmdW5jIChzdHJlYW0sICJlIik7CisJCQkgIGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCSAgZnVuYyAoc3RyZWFtLCBfKCI8aWxsZWdhbCBwcmVjaXNpb24+IikpOworCQkJICBicmVhazsKKwkJCX0KKwkJICAgICAgYnJlYWs7CisJCSAgICBjYXNlICdRJzoKKwkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCisJCQl7CisJCQljYXNlIDA6CisJCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKKwkJCSAgYnJlYWs7CisJCQljYXNlIDB4ODAwMDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOworCQkJICBicmVhazsKKwkJCWNhc2UgMHgwMDQwMDAwMDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOworCQkJICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIGJyZWFrOworCQkgICAgY2FzZSAnUic6CisJCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDYwKQorCQkJeworCQkJY2FzZSAwOgorCQkJICBicmVhazsKKwkJCWNhc2UgMHgyMDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAicCIpOworCQkJICBicmVhazsKKwkJCWNhc2UgMHg0MDoKKwkJCSAgZnVuYyAoc3RyZWFtLCAibSIpOworCQkJICBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkgIGZ1bmMgKHN0cmVhbSwgInoiKTsKKwkJCSAgYnJlYWs7CisJCQl9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisJCSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCSAgICAgIHsKKwkJCWludCB3aWR0aDsKKwkJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJCWMgPSBhcm1fZGVjb2RlX2JpdGZpZWxkIChjLCBnaXZlbiwgJnZhbHVlLCAmd2lkdGgpOworCisJCQlzd2l0Y2ggKCpjKQorCQkJICB7CisJCQkgIGNhc2UgJ3InOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3ZhbHVlXSk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ0QnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgImQlbGQiLCB2YWx1ZSk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ1EnOgorCQkJICAgIGlmICh2YWx1ZSAmIDEpCisJCQkgICAgICBmdW5jIChzdHJlYW0sICI8aWxsZWdhbCByZWcgcSVsZC41PiIsIHZhbHVlID4+IDEpOworCQkJICAgIGVsc2UKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgInElbGQiLCB2YWx1ZSA+PiAxKTsKKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSAnZCc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiJWxkIiwgdmFsdWUpOworCQkJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbSA9IChnaXZlbiAmICgxIDw8IDcpKSA/IDMyIDogMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlbGQiLCBmcm9tIC0gdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworCQkJICBjYXNlICdmJzoKKwkJCSAgICBpZiAodmFsdWUgPiA3KQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiIyVzIiwgYXJtX2ZwX2NvbnN0W3ZhbHVlICYgN10pOworCQkJICAgIGVsc2UKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgImYlbGQiLCB2YWx1ZSk7CisJCQkgICAgYnJlYWs7CisKKwkJCSAgY2FzZSAndyc6CisJCQkgICAgaWYgKHdpZHRoID09IDIpCisJCQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGl3bW14dF93d25hbWVzW3ZhbHVlXSk7CisJCQkgICAgZWxzZQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBpd21teHRfd3dzc25hbWVzW3ZhbHVlXSk7CisJCQkgICAgYnJlYWs7CisKKwkJCSAgY2FzZSAnZyc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBpd21teHRfcmVnbmFtZXNbdmFsdWVdKTsKKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSAnRyc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBpd21teHRfY3JlZ25hbWVzW3ZhbHVlXSk7CisJCQkgICAgYnJlYWs7CisKKwkJCSAgY2FzZSAneCc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7CisJCQkgICAgYnJlYWs7CisKKwkJCSAgY2FzZSAnYCc6CisJCQkgICAgYysrOworCQkJICAgIGlmICh2YWx1ZSA9PSAwKQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ1wnJzoKKwkJCSAgICBjKys7CisJCQkgICAgaWYgKHZhbHVlID09ICgoMXVsIDw8IHdpZHRoKSAtIDEpKQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJz8nOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgY1soMSA8PCB3aWR0aCkgLSAoaW50KXZhbHVlXSk7CisJCQkgICAgYyArPSAxIDw8IHdpZHRoOworCQkJICAgIGJyZWFrOworCQkJICBkZWZhdWx0OgorCQkJICAgIGFib3J0ICgpOworCQkJICB9CisJCQlicmVhazsKKworCQkgICAgICBjYXNlICd5JzoKKwkJICAgICAgY2FzZSAneic6CisJCQl7CisJCQkgIGludCBzaW5nbGUgPSAqYysrID09ICd5JzsKKwkJCSAgaW50IHJlZ25vOworCisJCQkgIHN3aXRjaCAoKmMpCisJCQkgICAgeworCQkJICAgIGNhc2UgJzQnOiAvKiBTbSBwYWlyICovCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJ7Iik7CisJCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworCQkJICAgIGNhc2UgJzAnOiAvKiBTbSwgRG0gKi8KKwkJCSAgICAgIHJlZ25vID0gZ2l2ZW4gJiAweDAwMDAwMDBmOworCQkJICAgICAgaWYgKHNpbmdsZSkKKwkJCQl7CisJCQkJICByZWdubyA8PD0gMTsKKwkJCQkgIHJlZ25vICs9IChnaXZlbiA+PiA1KSAmIDE7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdubyArPSAoKGdpdmVuID4+IDUpICYgMSkgPDwgNDsKKwkJCSAgICAgIGJyZWFrOworCisJCQkgICAgY2FzZSAnMSc6IC8qIFNkLCBEZCAqLworCQkJICAgICAgcmVnbm8gPSAoZ2l2ZW4gPj4gMTIpICYgMHgwMDAwMDAwZjsKKwkJCSAgICAgIGlmIChzaW5nbGUpCisJCQkJeworCQkJCSAgcmVnbm8gPDw9IDE7CisJCQkJICByZWdubyArPSAoZ2l2ZW4gPj4gMjIpICYgMTsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ25vICs9ICgoZ2l2ZW4gPj4gMjIpICYgMSkgPDwgNDsKKwkJCSAgICAgIGJyZWFrOworCisJCQkgICAgY2FzZSAnMic6IC8qIFNuLCBEbiAqLworCQkJICAgICAgcmVnbm8gPSAoZ2l2ZW4gPj4gMTYpICYgMHgwMDAwMDAwZjsKKwkJCSAgICAgIGlmIChzaW5nbGUpCisJCQkJeworCQkJCSAgcmVnbm8gPDw9IDE7CisJCQkJICByZWdubyArPSAoZ2l2ZW4gPj4gNykgJiAxOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbm8gKz0gKChnaXZlbiA+PiA3KSAmIDEpIDw8IDQ7CisJCQkgICAgICBicmVhazsKKworCQkJICAgIGNhc2UgJzMnOiAvKiBMaXN0ICovCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJ7Iik7CisJCQkgICAgICByZWdubyA9IChnaXZlbiA+PiAxMikgJiAweDAwMDAwMDBmOworCQkJICAgICAgaWYgKHNpbmdsZSkKKwkJCQl7CisJCQkJICByZWdubyA8PD0gMTsKKwkJCQkgIHJlZ25vICs9IChnaXZlbiA+PiAyMikgJiAxOworCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbm8gKz0gKChnaXZlbiA+PiAyMikgJiAxKSA8PCA0OworCQkJICAgICAgYnJlYWs7CisKKwkJCSAgICBkZWZhdWx0OgorCQkJICAgICAgYWJvcnQgKCk7CisJCQkgICAgfQorCisJCQkgIGZ1bmMgKHN0cmVhbSwgIiVjJWQiLCBzaW5nbGUgPyAncycgOiAnZCcsIHJlZ25vKTsKKworCQkJICBpZiAoKmMgPT0gJzMnKQorCQkJICAgIHsKKwkJCSAgICAgIGludCBjb3VudCA9IGdpdmVuICYgMHhmZjsKKworCQkJICAgICAgaWYgKHNpbmdsZSA9PSAwKQorCQkJCWNvdW50ID4+PSAxOworCisJCQkgICAgICBpZiAoLS1jb3VudCkKKwkJCQl7CisJCQkJICBmdW5jIChzdHJlYW0sICItJWMlZCIsCisJCQkJCXNpbmdsZSA/ICdzJyA6ICdkJywKKwkJCQkJcmVnbm8gKyBjb3VudCk7CisJCQkJfQorCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJ9Iik7CisJCQkgICAgfQorCQkJICBlbHNlIGlmICgqYyA9PSAnNCcpCisJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlYyVkfSIsIHNpbmdsZSA/ICdzJyA6ICdkJywKKwkJCQkgIHJlZ25vICsgMSk7CisJCQl9CisJCQlicmVhazsKKworCQkgICAgICBjYXNlICdMJzoKKwkJCXN3aXRjaCAoZ2l2ZW4gJiAweDAwNDAwMTAwKQorCQkJICB7CisJCQkgIGNhc2UgMHgwMDAwMDAwMDogZnVuYyAoc3RyZWFtLCAiYiIpOyBicmVhazsKKwkJCSAgY2FzZSAweDAwNDAwMDAwOiBmdW5jIChzdHJlYW0sICJoIik7IGJyZWFrOworCQkJICBjYXNlIDB4MDAwMDAxMDA6IGZ1bmMgKHN0cmVhbSwgInciKTsgYnJlYWs7CisJCQkgIGNhc2UgMHgwMDQwMDEwMDogZnVuYyAoc3RyZWFtLCAiZCIpOyBicmVhazsKKwkJCSAgZGVmYXVsdDoKKwkJCSAgICBicmVhazsKKwkJCSAgfQorCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSAnWic6CisJCQl7CisJCQkgIGludCB2YWx1ZTsKKwkJCSAgLyogZ2l2ZW4gKDIwLCAyMykgfCBnaXZlbiAoMCwgMykgKi8KKwkJCSAgdmFsdWUgPSAoKGdpdmVuID4+IDE2KSAmIDB4ZjApIHwgKGdpdmVuICYgMHhmKTsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiJWQiLCB2YWx1ZSk7CisJCQl9CisJCQlicmVhazsKKworCQkgICAgICBjYXNlICdsJzoKKwkJCS8qIFRoaXMgaXMgbGlrZSB0aGUgJ0EnIG9wZXJhdG9yLCBleGNlcHQgdGhhdCBpZgorCQkJICAgdGhlIHdpZHRoIGZpZWxkICJNIiBpcyB6ZXJvLCB0aGVuIHRoZSBvZmZzZXQgaXMKKwkJCSAgICpub3QqIG11bHRpcGxpZWQgYnkgZm91ci4gICovCisJCQl7CisJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7CisJCQkgIGludCBtdWx0aXBsaWVyID0gKGdpdmVuICYgMHgwMDAwMDEwMCkgPyA0IDogMTsKKworCQkJICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKKworCQkJICBpZiAob2Zmc2V0KQorCQkJICAgIHsKKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQorCQkJCWZ1bmMgKHN0cmVhbSwgIiwgIyVzJWRdJXMiLAorCQkJCSAgICAgICgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwID8gIi0iIDogIiIpLAorCQkJCSAgICAgIG9mZnNldCAqIG11bHRpcGxpZXIsCisJCQkJICAgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDAgPyAiISIgOiAiIikpOworCQkJICAgICAgZWxzZQorCQkJCWZ1bmMgKHN0cmVhbSwgIl0sICMlcyVkIiwKKwkJCQkgICAgICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKKwkJCQkgICAgICBvZmZzZXQgKiBtdWx0aXBsaWVyKTsKKwkJCSAgICB9CisJCQkgIGVsc2UKKwkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7CisJCQl9CisJCQlicmVhazsKKworCQkgICAgICBjYXNlICdyJzoKKwkJCXsKKwkJCSAgaW50IGltbTQgPSAoZ2l2ZW4gPj4gNCkgJiAweGY7CisJCQkgIGludCBwdXdfYml0cyA9ICgoZ2l2ZW4gPj4gMjIpICYgNikgfCAoKGdpdmVuID4+IDIxKSAmIDEpOworCQkJICBpbnQgdWJpdCA9IChnaXZlbiA+PiAyMykgJiAxOworCQkJICBjb25zdCBjaGFyICpybSA9IGFybV9yZWduYW1lcyBbZ2l2ZW4gJiAweGZdOworCQkJICBjb25zdCBjaGFyICpybiA9IGFybV9yZWduYW1lcyBbKGdpdmVuID4+IDE2KSAmIDB4Zl07CisKKwkJCSAgc3dpdGNoIChwdXdfYml0cykKKwkJCSAgICB7CisJCQkgICAgY2FzZSAxOgorCQkJICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJCQkgICAgY2FzZSAzOgorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiWyVzXSwgJWMlcyIsIHJuLCB1Yml0ID8gJysnIDogJy0nLCBybSk7CisJCQkgICAgICBpZiAoaW1tNCkKKwkJCQlmdW5jIChzdHJlYW0sICIsIGxzbCAjJWQiLCBpbW00KTsKKwkJCSAgICAgIGJyZWFrOworCisJCQkgICAgY2FzZSA0OgorCQkJICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJCQkgICAgY2FzZSA1OgorCQkJICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJCQkgICAgY2FzZSA2OgorCQkJICAgICAgLyogZmFsbCB0aHJvdWdoICovCisJCQkgICAgY2FzZSA3OgorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiWyVzLCAlYyVzIiwgcm4sIHViaXQgPyAnKycgOiAnLScsIHJtKTsKKwkJCSAgICAgIGlmIChpbW00ID4gMCkKKwkJCQlmdW5jIChzdHJlYW0sICIsIGxzbCAjJWQiLCBpbW00KTsKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKKwkJCSAgICAgIGlmIChwdXdfYml0cyA9PSA1IHx8IHB1d19iaXRzID09IDcpCisJCQkJZnVuYyAoc3RyZWFtLCAiISIpOworCQkJICAgICAgYnJlYWs7CisKKwkJCSAgICBkZWZhdWx0OgorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiSU5WQUxJRCIpOworCQkJICAgIH0KKwkJCX0KKwkJCWJyZWFrOworCisJCSAgICAgIGNhc2UgJ2knOgorCQkJeworCQkJICBsb25nIGltbTU7CisJCQkgIGltbTUgPSAoKGdpdmVuICYgMHgxMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiJWxkIiwgKGltbTUgPT0gMCkgPyAzMiA6IGltbTUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJICAgICAgZGVmYXVsdDoKKwkJCWFib3J0ICgpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCSAgICB9CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hcm1fYWRkcmVzcyAoYmZkX3ZtYSBwYywgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGxvbmcgZ2l2ZW4pCit7CisgIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgZnByaW50Zl9mdW5jdGlvbiBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOworCisgIGlmICgoKGdpdmVuICYgMHgwMDBmMDAwMCkgPT0gMHgwMDBmMDAwMCkKKyAgICAgICYmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKSkKKyAgICB7CisgICAgICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKKworICAgICAgZnVuYyAoc3RyZWFtLCAiW3BjIik7CisKKyAgICAgIGlmIChnaXZlbiAmIDB4MDEwMDAwMDApCisJeworCSAgaWYgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJICAgIG9mZnNldCA9IC0gb2Zmc2V0OworCisJICAvKiBQcmUtaW5kZXhlZC4gICovCisJICBmdW5jIChzdHJlYW0sICIsICMlZF0iLCBvZmZzZXQpOworCisJICBvZmZzZXQgKz0gcGMgKyA4OworCisJICAvKiBDb3BlIHdpdGggdGhlIHBvc3NpYmlsaXR5IG9mIHdyaXRlLWJhY2sKKwkgICAgIGJlaW5nIHVzZWQuICBQcm9iYWJseSBhIHZlcnkgZGFuZ2Vyb3VzIHRoaW5nCisJICAgICBmb3IgdGhlIHByb2dyYW1tZXIgdG8gZG8sIGJ1dCB3aG8gYXJlIHdlIHRvCisJICAgICBhcmd1ZSA/ICAqLworCSAgaWYgKGdpdmVuICYgMHgwMDIwMDAwMCkKKwkgICAgZnVuYyAoc3RyZWFtLCAiISIpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBQb3N0IGluZGV4ZWQuICAqLworCSAgZnVuYyAoc3RyZWFtLCAiXSwgIyVkIiwgb2Zmc2V0KTsKKworCSAgLyogaWUgaWdub3JlIHRoZSBvZmZzZXQuICAqLworCSAgb2Zmc2V0ID0gcGMgKyA4OworCX0KKworICAgICAgZnVuYyAoc3RyZWFtLCAiXHQ7ICIpOworICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChvZmZzZXQsIGluZm8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZ1bmMgKHN0cmVhbSwgIlslcyIsCisJICAgIGFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7CisgICAgICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKKwl7CisJICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkKKwkgICAgeworCSAgICAgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOworCSAgICAgIGlmIChvZmZzZXQpCisJCWZ1bmMgKHN0cmVhbSwgIiwgIyVzJWQiLAorCQkgICAgICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCSAgICAgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsCisJCSAgICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCSAgICAgPyAiLSIgOiAiIikpOworCSAgICAgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0sIDEpOworCSAgICB9CisKKwkgIGZ1bmMgKHN0cmVhbSwgIl0lcyIsCisJCSgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApID09IDApCisJICAgIHsKKwkgICAgICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKKwkgICAgICBpZiAob2Zmc2V0KQorCQlmdW5jIChzdHJlYW0sICJdLCAjJXMlZCIsCisJCSAgICAgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKKwkJICAgICAgID8gIi0iIDogIiIpLCBvZmZzZXQpOworCSAgICAgIGVsc2UKKwkJZnVuYyAoc3RyZWFtLCAiXSIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmdW5jIChzdHJlYW0sICJdLCAlcyIsCisJCSAgICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCSAgICAgPyAiLSIgOiAiIikpOworCSAgICAgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0sIDEpOworCSAgICB9CisJfQorICAgIH0KK30KKworLyogUHJpbnQgb25lIG5lb24gaW5zdHJ1Y3Rpb24gb24gSU5GTy0+U1RSRUFNLgorICAgUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIG1hdGNoZWQsIGZhbHNlIGlmIHRoaXMgaXMgbm90IGEKKyAgIHJlY29nbmlzZWQgbmVvbiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBiZmRfYm9vbGVhbgorcHJpbnRfaW5zbl9uZW9uIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgbG9uZyBnaXZlbiwgYmZkX2Jvb2xlYW4gdGh1bWIpCit7CisgIGNvbnN0IHN0cnVjdCBvcGNvZGUzMiAqaW5zbjsKKyAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOworICBmcHJpbnRmX2Z1bmN0aW9uIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisKKyAgaWYgKHRodW1iKQorICAgIHsKKyAgICAgIGlmICgoZ2l2ZW4gJiAweGVmMDAwMDAwKSA9PSAweGVmMDAwMDAwKQorCXsKKwkgIC8qIG1vdmUgYml0IDI4IHRvIGJpdCAyNCB0byB0cmFuc2xhdGUgVGh1bWIyIHRvIEFSTSBlbmNvZGluZy4gICovCisJICB1bnNpZ25lZCBsb25nIGJpdDI4ID0gZ2l2ZW4gJiAoMSA8PCAyOCk7CisKKwkgIGdpdmVuICY9IDB4MDBmZmZmZmY7CisJICBpZiAoYml0MjgpCisgICAgICAgICAgICBnaXZlbiB8PSAweGYzMDAwMDAwOworICAgICAgICAgIGVsc2UKKwkgICAgZ2l2ZW4gfD0gMHhmMjAwMDAwMDsKKwl9CisgICAgICBlbHNlIGlmICgoZ2l2ZW4gJiAweGZmMDAwMDAwKSA9PSAweGY5MDAwMDAwKQorCWdpdmVuIF49IDB4ZjkwMDAwMDAgXiAweGY0MDAwMDAwOworICAgICAgZWxzZQorCXJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgZm9yIChpbnNuID0gbmVvbl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKKyAgICB7CisgICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCisJeworCSAgY29uc3QgY2hhciAqYzsKKworCSAgZm9yIChjID0gaW5zbi0+YXNzZW1ibGVyOyAqYzsgYysrKQorCSAgICB7CisJICAgICAgaWYgKCpjID09ICclJykKKwkJeworCQkgIHN3aXRjaCAoKisrYykKKwkJICAgIHsKKwkJICAgIGNhc2UgJyUnOgorCQkgICAgICBmdW5jIChzdHJlYW0sICIlJSIpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnYyc6CisJCSAgICAgIGlmICh0aHVtYiAmJiBpZnRoZW5fc3RhdGUpCisJCQlmdW5jIChzdHJlYW0sICIlcyIsIGFybV9jb25kaXRpb25hbFtJRlRIRU5fQ09ORF0pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnQSc6CisJCSAgICAgIHsKKwkJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGVuY1sxNl0gPQorCQkJeworCQkJICAweDQsIDB4MTQsIC8qIHN0NCAwLDEgKi8KKwkJCSAgMHg0LCAvKiBzdDEgMiAqLworCQkJICAweDQsIC8qIHN0MiAzICovCisJCQkgIDB4MywgLyogc3QzIDQgKi8KKwkJCSAgMHgxMywgLyogc3QzIDUgKi8KKwkJCSAgMHgzLCAvKiBzdDEgNiAqLworCQkJICAweDEsIC8qIHN0MSA3ICovCisJCQkgIDB4MiwgLyogc3QyIDggKi8KKwkJCSAgMHgxMiwgLyogc3QyIDkgKi8KKwkJCSAgMHgyLCAvKiBzdDEgMTAgKi8KKwkJCSAgMCwgMCwgMCwgMCwgMAorCQkJfTsKKwkJCWludCByZCA9ICgoZ2l2ZW4gPj4gMTIpICYgMHhmKSB8ICgoKGdpdmVuID4+IDIyKSAmIDEpIDw8IDQpOworCQkJaW50IHJuID0gKChnaXZlbiA+PiAxNikgJiAweGYpOworCQkJaW50IHJtID0gKChnaXZlbiA+PiAwKSAmIDB4Zik7CisJCQlpbnQgYWxpZ24gPSAoKGdpdmVuID4+IDQpICYgMHgzKTsKKwkJCWludCB0eXBlID0gKChnaXZlbiA+PiA4KSAmIDB4Zik7CisJCQlpbnQgbiA9IGVuY1t0eXBlXSAmIDB4ZjsKKwkJCWludCBzdHJpZGUgPSAoZW5jW3R5cGVdID4+IDQpICsgMTsKKwkJCWludCBpeDsKKworCQkJZnVuYyAoc3RyZWFtLCAieyIpOworCQkJaWYgKHN0cmlkZSA+IDEpCisJCQkgIGZvciAoaXggPSAwOyBpeCAhPSBuOyBpeCsrKQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVzZCVkIiwgaXggPyAiLCIgOiAiIiwgcmQgKyBpeCAqIHN0cmlkZSk7CisJCQllbHNlIGlmIChuID09IDEpCisJCQkgIGZ1bmMgKHN0cmVhbSwgImQlZCIsIHJkKTsKKwkJCWVsc2UKKwkJCSAgZnVuYyAoc3RyZWFtLCAiZCVkLWQlZCIsIHJkLCByZCArIG4gLSAxKTsKKwkJCWZ1bmMgKHN0cmVhbSwgIn0sIFslcyIsIGFybV9yZWduYW1lc1tybl0pOworCQkJaWYgKGFsaWduKQorCQkJICBmdW5jIChzdHJlYW0sICIsIDolZCIsIDMyIDw8IGFsaWduKTsKKwkJCWZ1bmMgKHN0cmVhbSwgIl0iKTsKKwkJCWlmIChybSA9PSAweGQpCisJCQkgIGZ1bmMgKHN0cmVhbSwgIiEiKTsKKwkJCWVsc2UgaWYgKHJtICE9IDB4ZikKKwkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsIGFybV9yZWduYW1lc1tybV0pOworCQkgICAgICB9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdCJzoKKwkJICAgICAgeworCQkJaW50IHJkID0gKChnaXZlbiA+PiAxMikgJiAweGYpIHwgKCgoZ2l2ZW4gPj4gMjIpICYgMSkgPDwgNCk7CisJCQlpbnQgcm4gPSAoKGdpdmVuID4+IDE2KSAmIDB4Zik7CisJCQlpbnQgcm0gPSAoKGdpdmVuID4+IDApICYgMHhmKTsKKwkJCWludCBpZHhfYWxpZ24gPSAoKGdpdmVuID4+IDQpICYgMHhmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbiA9IDA7CisJCQlpbnQgc2l6ZSA9ICgoZ2l2ZW4gPj4gMTApICYgMHgzKTsKKwkJCWludCBpZHggPSBpZHhfYWxpZ24gPj4gKHNpemUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSAoKGdpdmVuID4+IDgpICYgMykgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgc2l6ZSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSA9IChpZHhfYWxpZ24gJiAoMSA8PCBzaXplKSkgPyAyIDogMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbWFzayA9ICgxIDw8IHNpemUpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWR4X2FsaWduICYgKDEgPDwgc2l6ZSkpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWR4X2FsaWduICYgYW1hc2spID09IGFtYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSA4IDw8IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGlkeF9hbGlnbiAmIGFtYXNrKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDIgJiYgKGlkeF9hbGlnbiAmIDIpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gPSAoaWR4X2FsaWduICYgMSkgPyAxNiA8PCBzaXplIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaXplID09IDIgJiYgKGlkeF9hbGlnbiAmIDMpICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpZHhfYWxpZ24gJiAxKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGlkeF9hbGlnbiAmIDMpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IChpZHhfYWxpZ24gJiAzKSAqIDY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduID0gKGlkeF9hbGlnbiAmIDEpID8gMzIgPDwgc2l6ZSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisJCQlmdW5jIChzdHJlYW0sICJ7Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzZCVkWyVkXSIsIChpID09IDApID8gIiIgOiAiLCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmQgKyBpICogc3RyaWRlLCBpZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAifSwgWyVzIiwgYXJtX3JlZ25hbWVzW3JuXSk7CisJCQlpZiAoYWxpZ24pCisJCQkgIGZ1bmMgKHN0cmVhbSwgIiwgOiVkIiwgYWxpZ24pOworCQkJZnVuYyAoc3RyZWFtLCAiXSIpOworCQkJaWYgKHJtID09IDB4ZCkKKwkJCSAgZnVuYyAoc3RyZWFtLCAiISIpOworCQkJZWxzZSBpZiAocm0gIT0gMHhmKQorCQkJICBmdW5jIChzdHJlYW0sICIsICVzIiwgYXJtX3JlZ25hbWVzW3JtXSk7CisJCSAgICAgIH0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ0MnOgorCQkgICAgICB7CisJCQlpbnQgcmQgPSAoKGdpdmVuID4+IDEyKSAmIDB4ZikgfCAoKChnaXZlbiA+PiAyMikgJiAxKSA8PCA0KTsKKwkJCWludCBybiA9ICgoZ2l2ZW4gPj4gMTYpICYgMHhmKTsKKwkJCWludCBybSA9ICgoZ2l2ZW4gPj4gMCkgJiAweGYpOworCQkJaW50IGFsaWduID0gKChnaXZlbiA+PiA0KSAmIDB4MSk7CisJCQlpbnQgc2l6ZSA9ICgoZ2l2ZW4gPj4gNikgJiAweDMpOworCQkJaW50IHR5cGUgPSAoKGdpdmVuID4+IDgpICYgMHgzKTsKKwkJCWludCBuID0gdHlwZSArIDE7CisJCQlpbnQgc3RyaWRlID0gKChnaXZlbiA+PiA1KSAmIDB4MSk7CisJCQlpbnQgaXg7CisKKwkJCWlmIChzdHJpZGUgJiYgKG4gPT0gMSkpCisJCQkgIG4rKzsKKwkJCWVsc2UKKwkJCSAgc3RyaWRlKys7CisKKwkJCWZ1bmMgKHN0cmVhbSwgInsiKTsKKwkJCWlmIChzdHJpZGUgPiAxKQorCQkJICBmb3IgKGl4ID0gMDsgaXggIT0gbjsgaXgrKykKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlc2QlZFtdIiwgaXggPyAiLCIgOiAiIiwgcmQgKyBpeCAqIHN0cmlkZSk7CisJCQllbHNlIGlmIChuID09IDEpCisJCQkgIGZ1bmMgKHN0cmVhbSwgImQlZFtdIiwgcmQpOworCQkJZWxzZQorCQkJICBmdW5jIChzdHJlYW0sICJkJWRbXS1kJWRbXSIsIHJkLCByZCArIG4gLSAxKTsKKwkJCWZ1bmMgKHN0cmVhbSwgIn0sIFslcyIsIGFybV9yZWduYW1lc1tybl0pOworCQkJaWYgKGFsaWduKQorCQkJICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduID0gKDggKiAodHlwZSArIDEpKSA8PCBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9IChzaXplID4gMSkgPyBhbGlnbiA+PiAxIDogYWxpZ247CisJCQkgICAgaWYgKHR5cGUgPT0gMiB8fCAodHlwZSA9PSAwICYmICFzaXplKSkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgOjxiYWQgYWxpZ24gJWQ+IiwgYWxpZ24pOworCQkJICAgIGVsc2UKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgOiVkIiwgYWxpZ24pOworCQkJICB9CisJCQlmdW5jIChzdHJlYW0sICJdIik7CisJCQlpZiAocm0gPT0gMHhkKQorCQkJICBmdW5jIChzdHJlYW0sICIhIik7CisJCQllbHNlIGlmIChybSAhPSAweGYpCisJCQkgIGZ1bmMgKHN0cmVhbSwgIiwgJXMiLCBhcm1fcmVnbmFtZXNbcm1dKTsKKwkJICAgICAgfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnRCc6CisJCSAgICAgIHsKKwkJCWludCByYXdfcmVnID0gKGdpdmVuICYgMHhmKSB8ICgoZ2l2ZW4gPj4gMSkgJiAweDEwKTsKKwkJCWludCBzaXplID0gKGdpdmVuID4+IDIwKSAmIDM7CisJCQlpbnQgcmVnID0gcmF3X3JlZyAmICgoNCA8PCBzaXplKSAtIDEpOworCQkJaW50IGl4ID0gcmF3X3JlZyA+PiBzaXplID4+IDI7CisKKwkJCWZ1bmMgKHN0cmVhbSwgImQlZFslZF0iLCByZWcsIGl4KTsKKwkJICAgICAgfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnRSc6CisJCSAgICAgIC8qIE5lb24gZW5jb2RlZCBjb25zdGFudCBmb3IgbW92LCBtdm4sIHZvcnIsIHZiaWMgKi8KKwkJICAgICAgeworCQkJaW50IGJpdHMgPSAwOworCQkJaW50IGNtb2RlID0gKGdpdmVuID4+IDgpICYgMHhmOworCQkJaW50IG9wID0gKGdpdmVuID4+IDUpICYgMHgxOworCQkJdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDAsIGhpdmFsID0gMDsKKwkJCXVuc2lnbmVkIHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzZmxvYXQgPSAwOworCisJCQliaXRzIHw9ICgoZ2l2ZW4gPj4gMjQpICYgMSkgPDwgNzsKKwkJCWJpdHMgfD0gKChnaXZlbiA+PiAxNikgJiA3KSA8PCA0OworCQkJYml0cyB8PSAoKGdpdmVuID4+IDApICYgMTUpIDw8IDA7CisKKwkJCWlmIChjbW9kZSA8IDgpCisJCQkgIHsKKwkJCSAgICBzaGlmdCA9IChjbW9kZSA+PiAxKSAmIDM7CisJCQkgICAgdmFsdWUgPSAodW5zaWduZWQgbG9uZyliaXRzIDw8ICg4ICogc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzMjsKKwkJCSAgfQorCQkJZWxzZSBpZiAoY21vZGUgPCAxMikKKwkJCSAgeworCQkJICAgIHNoaWZ0ID0gKGNtb2RlID4+IDEpICYgMTsKKwkJCSAgICB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWJpdHMgPDwgKDggKiBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE2OworCQkJICB9CisJCQllbHNlIGlmIChjbW9kZSA8IDE0KQorCQkJICB7CisJCQkgICAgc2hpZnQgPSAoY21vZGUgJiAxKSArIDE7CisJCQkgICAgdmFsdWUgPSAodW5zaWduZWQgbG9uZyliaXRzIDw8ICg4ICogc2hpZnQpOworCQkJICAgIHZhbHVlIHw9ICgxdWwgPDwgKDggKiBzaGlmdCkpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMzI7CisJCQkgIH0KKwkJCWVsc2UgaWYgKGNtb2RlID09IDE0KQorCQkJICB7CisJCQkgICAgaWYgKG9wKQorCQkJICAgICAgeworCQkJCS8qIGJpdCByZXBsaWNhdGlvbiBpbnRvIGJ5dGVzICovCisJCQkJaW50IGl4OworCQkJCXVuc2lnbmVkIGxvbmcgbWFzazsKKworCQkJCXZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGl2YWwgPSAwOworCQkJCWZvciAoaXggPSA3OyBpeCA+PSAwOyBpeC0tKQorCQkJCSAgeworCQkJCSAgICBtYXNrID0gKChiaXRzID4+IGl4KSAmIDEpID8gMHhmZiA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXggPD0gMykKKwkJCQkgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IG1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdmFsID0gKGhpdmFsIDw8IDgpIHwgbWFzazsKKwkJCQkgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDY0OworCQkJICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYnl0ZSByZXBsaWNhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKWJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJICB9CisJCQllbHNlIGlmICghb3ApCisJCQkgIHsKKwkJCSAgICAvKiBmbG9hdGluZyBwb2ludCBlbmNvZGluZyAqLworCQkJICAgIGludCB0bXA7CisKKwkJCSAgICB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKShiaXRzICYgMHg3ZikgPDwgMTk7CisJCQkgICAgdmFsdWUgfD0gKHVuc2lnbmVkIGxvbmcpKGJpdHMgJiAweDgwKSA8PCAyNDsKKwkJCSAgICB0bXAgPSBiaXRzICYgMHg0MCA/IDB4M2MgOiAweDQwOworCQkJICAgIHZhbHVlIHw9ICh1bnNpZ25lZCBsb25nKXRtcCA8PCAyNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNmbG9hdCA9IDE7CisJCQkgIH0KKwkJCWVsc2UKKwkJCSAgeworCQkJICAgIGZ1bmMgKHN0cmVhbSwgIjxpbGxlZ2FsIGNvbnN0YW50ICUuOHg6JXg6JXg+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCBjbW9kZSwgb3ApOworCQkJICAgIGJyZWFrOworCQkJICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlbGRcdDsgMHglLjJseCIsIHZhbHVlLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIjJWxkXHQ7IDB4JS40bHgiLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsYnl0ZXNbNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG8gdGhpcyBhIGJ5dGUgYXQgYSB0aW1lIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ycnkgYWJvdXQgdGhlIGhvc3QncyBlbmRpYW5uZXNzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsYnl0ZXNbMF0gPSB2YWx1ZSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGJ5dGVzWzFdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsYnl0ZXNbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsYnl0ZXNbM10gPSAodmFsdWUgPj4gMjQpICYgMHhmZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdGZvcm1hdF90b19kb3VibGUgKHZhbGJ5dGVzLCAmZnZhbHVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIjJS43Z1x0OyAweCUuOGx4IiwgZnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiIyVsZFx0OyAweCUuOGx4IiwKKwkJCQkobG9uZykgKCh2YWx1ZSAmIDB4ODAwMDAwMDApCisJCQkJCT8gdmFsdWUgfCB+MHhmZmZmZmZmZmwgOiB2YWx1ZSksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUuOGx4JS44bHgiLCBoaXZhbCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJICAgICAgfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnRic6CisJCSAgICAgIHsKKwkJCWludCByZWdubyA9ICgoZ2l2ZW4gPj4gMTYpICYgMHhmKSB8ICgoZ2l2ZW4gPj4gKDcgLSA0KSkgJiAweDEwKTsKKwkJCWludCBudW0gPSAoZ2l2ZW4gPj4gOCkgJiAweDM7CisKKwkJCWlmICghbnVtKQorCQkJICBmdW5jIChzdHJlYW0sICJ7ZCVkfSIsIHJlZ25vKTsKKwkJCWVsc2UgaWYgKG51bSArIHJlZ25vID49IDMyKQorCQkJICBmdW5jIChzdHJlYW0sICJ7ZCVkLTxvdmVyZmxvdyByZWcgZCVkfSIsIHJlZ25vLCByZWdubyArIG51bSk7CisJCQllbHNlCisJCQkgIGZ1bmMgKHN0cmVhbSwgIntkJWQtZCVkfSIsIHJlZ25vLCByZWdubyArIG51bSk7CisJCSAgICAgIH0KKwkJICAgICAgYnJlYWs7CisKKworCQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQkgICAgICB7CisJCQlpbnQgd2lkdGg7CisJCQl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJCQljID0gYXJtX2RlY29kZV9iaXRmaWVsZCAoYywgZ2l2ZW4sICZ2YWx1ZSwgJndpZHRoKTsKKworCQkJc3dpdGNoICgqYykKKwkJCSAgeworCQkJICBjYXNlICdyJzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1t2YWx1ZV0pOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICdkJzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ2UnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVsZCIsICgxdWwgPDwgd2lkdGgpIC0gdmFsdWUpOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ1MnOgorCQkJICBjYXNlICdUJzoKKwkJCSAgY2FzZSAnVSc6CisJCQkgICAgLyogdmFyaW91cyB3aWR0aCBlbmNvZGluZ3MgKi8KKwkJCSAgICB7CisJCQkgICAgICBpbnQgYmFzZSA9IDggPDwgKCpjIC0gJ1MnKTsgLyogOCwxNiBvciAzMiAqLworCQkJICAgICAgaW50IGxpbWl0OworCQkJICAgICAgdW5zaWduZWQgbG93LCBoaWdoOworCisJCQkgICAgICBjKys7CisJCQkgICAgICBpZiAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKKwkJCQlsaW1pdCA9ICpjIC0gJzAnOworCQkJICAgICAgZWxzZSBpZiAoKmMgPj0gJ2EnICYmICpjIDw9ICdmJykKKwkJCQlsaW1pdCA9ICpjIC0gJ2EnICsgMTA7CisJCQkgICAgICBlbHNlCisJCQkJYWJvcnQgKCk7CisJCQkgICAgICBsb3cgPSBsaW1pdCA+PiAyOworCQkJICAgICAgaGlnaCA9IGxpbWl0ICYgMzsKKworCQkJICAgICAgaWYgKHZhbHVlIDwgbG93IHx8IHZhbHVlID4gaGlnaCkKKwkJCQlmdW5jIChzdHJlYW0sICI8aWxsZWdhbCB3aWR0aCAlZD4iLCBiYXNlIDw8IHZhbHVlKTsKKwkJCSAgICAgIGVsc2UKKwkJCQlmdW5jIChzdHJlYW0sICIlZCIsIGJhc2UgPDwgdmFsdWUpOworCQkJICAgIH0KKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSAnUic6CisJCQkgICAgaWYgKGdpdmVuICYgKDEgPDwgNikpCisJCQkgICAgICBnb3RvIFE7CisJCQkgICAgLyogRkFMTFRIUk9VR0ggKi8KKwkJCSAgY2FzZSAnRCc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiZCVsZCIsIHZhbHVlKTsKKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSAnUSc6CisJCQkgIFE6CisJCQkgICAgaWYgKHZhbHVlICYgMSkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIjxpbGxlZ2FsIHJlZyBxJWxkLjU+IiwgdmFsdWUgPj4gMSk7CisJCQkgICAgZWxzZQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAicSVsZCIsIHZhbHVlID4+IDEpOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ2AnOgorCQkJICAgIGMrKzsKKwkJCSAgICBpZiAodmFsdWUgPT0gMCkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICdcJyc6CisJCQkgICAgYysrOworCQkJICAgIGlmICh2YWx1ZSA9PSAoKDF1bCA8PCB3aWR0aCkgLSAxKSkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICc/JzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlYyIsIGNbKDEgPDwgd2lkdGgpIC0gKGludCl2YWx1ZV0pOworCQkJICAgIGMgKz0gMSA8PCB3aWR0aDsKKwkJCSAgICBicmVhazsKKwkJCSAgZGVmYXVsdDoKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgfQorCQkJYnJlYWs7CisKKwkJICAgICAgZGVmYXVsdDoKKwkJCWFib3J0ICgpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCSAgICB9CisJICByZXR1cm4gdHJ1ZTsKKwl9CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFByaW50IG9uZSBBUk0gaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfaW5zbl9hcm1faW50ZXJuYWwgKGJmZF92bWEgcGMsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBsb25nIGdpdmVuKQoreworICBjb25zdCBzdHJ1Y3Qgb3Bjb2RlMzIgKmluc247CisgIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgZnByaW50Zl9mdW5jdGlvbiBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOworCisgIGlmIChwcmludF9pbnNuX2NvcHJvY2Vzc29yIChwYywgaW5mbywgZ2l2ZW4sIGZhbHNlKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHByaW50X2luc25fbmVvbiAoaW5mbywgZ2l2ZW4sIGZhbHNlKSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpbnNuID0gYXJtX29wY29kZXM7IGluc24tPmFzc2VtYmxlcjsgaW5zbisrKQorICAgIHsKKyAgICAgIGlmIChpbnNuLT52YWx1ZSA9PSBGSVJTVF9JV01NWFRfSU5TTgorCSAgJiYgaW5mby0+bWFjaCAhPSBiZmRfbWFjaF9hcm1fWFNjYWxlCisJICAmJiBpbmZvLT5tYWNoICE9IGJmZF9tYWNoX2FybV9pV01NWHQpCisJaW5zbiA9IGluc24gKyBJV01NWFRfSU5TTl9DT1VOVDsKKworICAgICAgaWYgKChnaXZlbiAmIGluc24tPm1hc2spID09IGluc24tPnZhbHVlCisJICAvKiBTcGVjaWFsIGNhc2U6IGFuIGluc3RydWN0aW9uIHdpdGggYWxsIGJpdHMgc2V0IGluIHRoZSBjb25kaXRpb24gZmllbGQKKwkgICAgICgweEZubm5fbm5ubikgaXMgb25seSBtYXRjaGVkIGlmIGFsbCB0aG9zZSBiaXRzIGFyZSBzZXQgaW4gaW5zbi0+bWFzaywKKwkgICAgIG9yIGJ5IHRoZSBjYXRjaGFsbCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCisJICAmJiAoKGdpdmVuICYgMHhGMDAwMDAwMCkgIT0gMHhGMDAwMDAwMAorCSAgICAgIHx8IChpbnNuLT5tYXNrICYgMHhGMDAwMDAwMCkgPT0gMHhGMDAwMDAwMAorCSAgICAgIHx8IChpbnNuLT5tYXNrID09IDAgJiYgaW5zbi0+dmFsdWUgPT0gMCkpKQorCXsKKwkgIGNvbnN0IGNoYXIgKmM7CisKKwkgIGZvciAoYyA9IGluc24tPmFzc2VtYmxlcjsgKmM7IGMrKykKKwkgICAgeworCSAgICAgIGlmICgqYyA9PSAnJScpCisJCXsKKwkJICBzd2l0Y2ggKCorK2MpCisJCSAgICB7CisJCSAgICBjYXNlICclJzoKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2EnOgorCQkgICAgICBwcmludF9hcm1fYWRkcmVzcyAocGMsIGluZm8sIGdpdmVuKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ1AnOgorCQkgICAgICAvKiBTZXQgUCBhZGRyZXNzIGJpdCBhbmQgdXNlIG5vcm1hbCBhZGRyZXNzCisJCQkgcHJpbnRpbmcgcm91dGluZS4gICovCisJCSAgICAgIHByaW50X2FybV9hZGRyZXNzIChwYywgaW5mbywgZ2l2ZW4gfCAoMSA8PCAyNCkpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmIDB4MDA0ZjAwMDApID09IDB4MDA0ZjAwMDApCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIHJlbGF0aXZlIHdpdGggaW1tZWRpYXRlIG9mZnNldC4gICovCisJCQkgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKKworCQkJICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKKwkJCSAgICBvZmZzZXQgPSAtb2Zmc2V0OworCisJCQkgIGZ1bmMgKHN0cmVhbSwgIltwYywgIyVkXVx0OyAiLCBvZmZzZXQpOworCQkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCArIHBjICsgOCwgaW5mbyk7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiWyVzIiwKKwkJCQlhcm1fcmVnbmFtZXNbKGdpdmVuID4+IDE2KSAmIDB4Zl0pOworCQkJICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKKwkJCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmUtaW5kZXhlZC4gICovCisJCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDQwMDAwMCkgPT0gMHgwMDQwMDAwMCkKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW1tZWRpYXRlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7CisJCQkJICBpZiAob2Zmc2V0KQorCQkJCSAgICBmdW5jIChzdHJlYW0sICIsICMlcyVkIiwKKwkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOworCQkJCX0KKwkJCSAgICAgIGVsc2UKKwkJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaXN0ZXIuICAqLworCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyVzIiwKKwkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCQkgPyAiLSIgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7CisJCQkJfQorCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLAorCQkJCSAgICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCkgPyAiISIgOiAiIik7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdC1pbmRleGVkLiAgKi8KKwkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAwNDAwMDAwKSA9PSAweDAwNDAwMDAwKQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbW1lZGlhdGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKKwkJCQkgIGlmIChvZmZzZXQpCisJCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICMlcyVkIiwKKwkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCisJCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOworCQkJCSAgZWxzZQorCQkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7CisJCQkJfQorCQkJICAgICAgZWxzZQorCQkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpc3Rlci4gICovCisJCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyVzIiwKKwkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQorCQkJCQkgPyAiLSIgOiAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7CisJCQkJfQorCQkJICAgIH0KKwkJCX0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ2InOgorCQkgICAgICB7CisJCQlpbnQgZGlzcCA9ICgoKGdpdmVuICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApOworCQkJaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChkaXNwKjQgKyBwYyArIDgsIGluZm8pOworCQkgICAgICB9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdjJzoKKwkJICAgICAgaWYgKCgoZ2l2ZW4gPj4gMjgpICYgMHhmKSAhPSAweGUpCisJCQlmdW5jIChzdHJlYW0sICIlcyIsCisJCQkgICAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiAyOCkgJiAweGZdKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ20nOgorCQkgICAgICB7CisJCQlpbnQgc3RhcnRlZCA9IDA7CisJCQlpbnQgcmVnOworCisJCQlmdW5jIChzdHJlYW0sICJ7Iik7CisJCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKKwkJCSAgaWYgKChnaXZlbiAmICgxIDw8IHJlZykpICE9IDApCisJCQkgICAgeworCQkJICAgICAgaWYgKHN0YXJ0ZWQpCisJCQkJZnVuYyAoc3RyZWFtLCAiLCAiKTsKKwkJCSAgICAgIHN0YXJ0ZWQgPSAxOworCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7CisJCQkgICAgfQorCQkJZnVuYyAoc3RyZWFtLCAifSIpOworCQkgICAgICB9CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdxJzoKKwkJICAgICAgYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSwgMCk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdvJzoKKwkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApICE9IDApCisJCQl7CisJCQkgIGludCByb3RhdGUgPSAoZ2l2ZW4gJiAweGYwMCkgPj4gNzsKKwkJCSAgaW50IGltbWVkID0gKGdpdmVuICYgMHhmZik7CisJCQkgIGltbWVkID0gKCgoaW1tZWQgPDwgKDMyIC0gcm90YXRlKSkKKwkJCQkgICAgfCAoaW1tZWQgPj4gcm90YXRlKSkgJiAweGZmZmZmZmZmKTsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiIyVkXHQ7IDB4JXgiLCBpbW1lZCwgaW1tZWQpOworCQkJfQorCQkgICAgICBlbHNlCisJCQlhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtLCAxKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ3AnOgorCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDAwZjAwMCkgPT0gMHgwMDAwZjAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgInAiKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ3QnOgorCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMTIwMDAwMCkgPT0gMHgwMDIwMDAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgInQiKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ0EnOgorCQkgICAgICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXMgWyhnaXZlbiA+PiAxNikgJiAweGZdKTsKKworCQkgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgMjQpKSAhPSAwKQorCQkJeworCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmOworCisJCQkgIGlmIChvZmZzZXQpCisJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAjJXMlZF0lcyIsCisJCQkJICAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCA/ICItIiA6ICIiKSwKKwkJCQkgIG9mZnNldCAqIDQsCisJCQkJICAoKGdpdmVuICYgMHgwMDIwMDAwMCkgIT0gMCA/ICIhIiA6ICIiKSk7CisJCQkgIGVsc2UKKwkJCSAgICBmdW5jIChzdHJlYW0sICJdIik7CisJCQl9CisJCSAgICAgIGVsc2UKKwkJCXsKKwkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZjsKKworCQkJICBmdW5jIChzdHJlYW0sICJdIik7CisKKwkJCSAgaWYgKGdpdmVuICYgKDEgPDwgMjEpKQorCQkJICAgIHsKKwkJCSAgICAgIGlmIChvZmZzZXQpCisJCQkJZnVuYyAoc3RyZWFtLCAiLCAjJXMlZCIsCisJCQkJICAgICAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCisJCQkJICAgICAgb2Zmc2V0ICogNCk7CisJCQkgICAgfQorCQkJICBlbHNlCisJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCB7JWR9Iiwgb2Zmc2V0KTsKKwkJCX0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ0InOgorCQkgICAgICAvKiBQcmludCBBUk0gVjUgQkxYKDEpIGFkZHJlc3M6IHBjKzI1IGJpdHMuICAqLworCQkgICAgICB7CisJCQliZmRfdm1hIGFkZHJlc3M7CisJCQliZmRfdm1hIG9mZnNldCA9IDA7CisKKwkJCWlmIChnaXZlbiAmIDB4MDA4MDAwMDApCisJCQkgIC8qIElzIHNpZ25lZCwgaGkgYml0cyBzaG91bGQgYmUgb25lcy4gICovCisJCQkgIG9mZnNldCA9ICgtMSkgXiAweDAwZmZmZmZmOworCisJCQkvKiBPZmZzZXQgaXMgKFNpZ25FeHRlbmQob2Zmc2V0IGZpZWxkKTw8MikuICAqLworCQkJb2Zmc2V0ICs9IGdpdmVuICYgMHgwMGZmZmZmZjsKKwkJCW9mZnNldCA8PD0gMjsKKwkJCWFkZHJlc3MgPSBvZmZzZXQgKyBwYyArIDg7CisKKwkJCWlmIChnaXZlbiAmIDB4MDEwMDAwMDApCisJCQkgIC8qIEggYml0IGFsbG93cyBhZGRyZXNzaW5nIHRvIDItYnl0ZSBib3VuZGFyaWVzLiAgKi8KKwkJCSAgYWRkcmVzcyArPSAyOworCisJCSAgICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChhZGRyZXNzLCBpbmZvKTsKKwkJICAgICAgfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnQyc6CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl8iKTsKKwkJICAgICAgaWYgKGdpdmVuICYgMHg4MDAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgImYiKTsKKwkJICAgICAgaWYgKGdpdmVuICYgMHg0MDAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgInMiKTsKKwkJICAgICAgaWYgKGdpdmVuICYgMHgyMDAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgIngiKTsKKwkJICAgICAgaWYgKGdpdmVuICYgMHgxMDAwMCkKKwkJCWZ1bmMgKHN0cmVhbSwgImMiKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ1UnOgorCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHhmKQorCQkJeworCQkJY2FzZSAweGY6IGZ1bmMoc3RyZWFtLCAic3kiKTsgYnJlYWs7CisJCQljYXNlIDB4NzogZnVuYyhzdHJlYW0sICJ1biIpOyBicmVhazsKKwkJCWNhc2UgMHhlOiBmdW5jKHN0cmVhbSwgInN0Iik7IGJyZWFrOworCQkJY2FzZSAweDY6IGZ1bmMoc3RyZWFtLCAidW5zdCIpOyBicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkgIGZ1bmMoc3RyZWFtLCAiIyVkIiwgKGludClnaXZlbiAmIDB4Zik7CisJCQkgIGJyZWFrOworCQkJfQorCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgorCQkgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQkgICAgICB7CisJCQlpbnQgd2lkdGg7CisJCQl1bnNpZ25lZCBsb25nIHZhbHVlOworCisJCQljID0gYXJtX2RlY29kZV9iaXRmaWVsZCAoYywgZ2l2ZW4sICZ2YWx1ZSwgJndpZHRoKTsKKworCQkJc3dpdGNoICgqYykKKwkJCSAgeworCQkJICBjYXNlICdyJzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1t2YWx1ZV0pOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICdkJzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ2InOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVsZCIsIHZhbHVlICogOCk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ1cnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVsZCIsIHZhbHVlICsgMSk7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ3gnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTA4bHgiLCB2YWx1ZSk7CisKKwkJCSAgICAvKiBTb21lIFNXSSBpbnN0cnVjdGlvbnMgaGF2ZSBzcGVjaWFsCisJCQkgICAgICAgbWVhbmluZ3MuICAqLworCQkJICAgIGlmICgoZ2l2ZW4gJiAweDBmZmZmZmZmKSA9PSAweDBGRjAwMDAwKQorCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQiIpOworCQkJICAgIGVsc2UgaWYgKChnaXZlbiAmIDB4MGZmZmZmZmYpID09IDB4MEZGMDAwMDEpCisJCQkgICAgICBmdW5jIChzdHJlYW0sICJcdDsgSU1CUmFuZ2UiKTsKKwkJCSAgICBicmVhazsKKwkJCSAgY2FzZSAnWCc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiJTAxbHgiLCB2YWx1ZSAmIDB4Zik7CisJCQkgICAgYnJlYWs7CisJCQkgIGNhc2UgJ2AnOgorCQkJICAgIGMrKzsKKwkJCSAgICBpZiAodmFsdWUgPT0gMCkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICdcJyc6CisJCQkgICAgYysrOworCQkJICAgIGlmICh2YWx1ZSA9PSAoKDF1bCA8PCB3aWR0aCkgLSAxKSkKKwkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlICc/JzoKKwkJCSAgICBmdW5jIChzdHJlYW0sICIlYyIsIGNbKDEgPDwgd2lkdGgpIC0gKGludCl2YWx1ZV0pOworCQkJICAgIGMgKz0gMSA8PCB3aWR0aDsKKwkJCSAgICBicmVhazsKKwkJCSAgZGVmYXVsdDoKKwkJCSAgICBhYm9ydCAoKTsKKwkJCSAgfQorCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSAnZSc6CisJCQl7CisJCQkgIGludCBpbW07CisKKwkJCSAgaW1tID0gKGdpdmVuICYgMHhmKSB8ICgoZ2l2ZW4gJiAweGZmZjAwKSA+PiA0KTsKKwkJCSAgZnVuYyAoc3RyZWFtLCAiJWQiLCBpbW0pOworCQkJfQorCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSAnRSc6CisJCQkvKiBMU0IgYW5kIFdJRFRIIGZpZWxkcyBvZiBCRkkgb3IgQkZDLiAgVGhlIG1hY2hpbmUtCisJCQkgICBsYW5ndWFnZSBpbnN0cnVjdGlvbiBlbmNvZGVzIExTQiBhbmQgTVNCLiAgKi8KKwkJCXsKKwkJCSAgbG9uZyBtc2IgPSAoZ2l2ZW4gJiAweDAwMWYwMDAwKSA+PiAxNjsKKwkJCSAgbG9uZyBsc2IgPSAoZ2l2ZW4gJiAweDAwMDAwZjgwKSA+PiA3OworCisJCQkgIGxvbmcgd2lkdGggPSBtc2IgLSBsc2IgKyAxOworCQkJICBpZiAod2lkdGggPiAwKQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiMlbHUsICMlbHUiLCBsc2IsIHdpZHRoKTsKKwkJCSAgZWxzZQorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIihpbnZhbGlkOiAlbHU6JWx1KSIsIGxzYiwgbXNiKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCSAgICAgIGNhc2UgJ1YnOgorCQkJLyogMTYtYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBmcm9tIGEgTU9WVCBvciBNT1ZXCisJCQkgICBpbnN0cnVjdGlvbiwgZW5jb2RlZCBpbiBiaXRzIDA6MTEgYW5kIDE1OjE5LiAgKi8KKwkJCXsKKwkJCSAgbG9uZyBoaSA9IChnaXZlbiAmIDB4MDAwZjAwMDApID4+IDQ7CisJCQkgIGxvbmcgbG8gPSAoZ2l2ZW4gJiAweDAwMDAwZmZmKTsKKwkJCSAgbG9uZyBpbW0xNiA9IGhpIHwgbG87CisJCQkgIGZ1bmMgKHN0cmVhbSwgIiMlbHVcdDsgMHglbHgiLCBpbW0xNiwgaW1tMTYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJICAgICAgZGVmYXVsdDoKKwkJCWFib3J0ICgpOworCQkgICAgICB9CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCSAgICB9CisJICByZXR1cm47CisJfQorICAgIH0KKyAgYWJvcnQgKCk7Cit9CisKKy8qIFByaW50IG9uZSAxNi1iaXQgVGh1bWIgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfaW5zbl90aHVtYjE2IChiZmRfdm1hIHBjLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbywgbG9uZyBnaXZlbikKK3sKKyAgY29uc3Qgc3RydWN0IG9wY29kZTE2ICppbnNuOworICB2b2lkICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07CisgIGZwcmludGZfZnVuY3Rpb24gZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKKworICBmb3IgKGluc24gPSB0aHVtYl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKKyAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCisgICAgICB7CisJY29uc3QgY2hhciAqYyA9IGluc24tPmFzc2VtYmxlcjsKKwlmb3IgKDsgKmM7IGMrKykKKwkgIHsKKwkgICAgaW50IGRvbWFza3BjID0gMDsKKwkgICAgaW50IGRvbWFza2xyID0gMDsKKworCSAgICBpZiAoKmMgIT0gJyUnKQorCSAgICAgIHsKKwkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBzd2l0Y2ggKCorK2MpCisJICAgICAgeworCSAgICAgIGNhc2UgJyUnOgorCQlmdW5jIChzdHJlYW0sICIlJSIpOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ2MnOgorCQlpZiAoaWZ0aGVuX3N0YXRlKQorCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX2NvbmRpdGlvbmFsW0lGVEhFTl9DT05EXSk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnQyc6CisJCWlmIChpZnRoZW5fc3RhdGUpCisJCSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fY29uZGl0aW9uYWxbSUZUSEVOX0NPTkRdKTsKKwkJZWxzZQorCQkgIGZ1bmMgKHN0cmVhbSwgInMiKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdJJzoKKwkJeworCQkgIHVuc2lnbmVkIGludCB0bXA7CisKKwkJICBpZnRoZW5fbmV4dF9zdGF0ZSA9IGdpdmVuICYgMHhmZjsKKwkJICBmb3IgKHRtcCA9IGdpdmVuIDw8IDE7IHRtcCAmIDB4ZjsgdG1wIDw8PSAxKQorCQkgICAgZnVuYyAoc3RyZWFtLCAoKGdpdmVuIF4gdG1wKSAmIDB4MTApID8gImUiIDogInQiKTsKKwkJICBmdW5jIChzdHJlYW0sICJcdCVzIiwgYXJtX2NvbmRpdGlvbmFsWyhnaXZlbiA+PiA0KSAmIDB4Zl0pOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAneCc6CisJCWlmIChpZnRoZW5fbmV4dF9zdGF0ZSkKKwkJICBmdW5jIChzdHJlYW0sICJcdDsgdW5wcmVkaWN0YWJsZSBicmFuY2ggaW4gSVQgYmxvY2tcbiIpOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ1gnOgorCQlpZiAoaWZ0aGVuX3N0YXRlKQorCQkgIGZ1bmMgKHN0cmVhbSwgIlx0OyB1bnByZWRpY3RhYmxlIDxJVDolcz4iLAorCQkJYXJtX2NvbmRpdGlvbmFsW0lGVEhFTl9DT05EXSk7CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnUyc6CisJCXsKKwkJICBsb25nIHJlZzsKKworCQkgIHJlZyA9IChnaXZlbiA+PiAzKSAmIDB4NzsKKwkJICBpZiAoZ2l2ZW4gJiAoMSA8PCA2KSkKKwkJICAgIHJlZyArPSA4OworCisJCSAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdEJzoKKwkJeworCQkgIGxvbmcgcmVnOworCisJCSAgcmVnID0gZ2l2ZW4gJiAweDc7CisJCSAgaWYgKGdpdmVuICYgKDEgPDwgNykpCisJCSAgICByZWcgKz0gODsKKworCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnTic6CisJCWlmIChnaXZlbiAmICgxIDw8IDgpKQorCQkgIGRvbWFza2xyID0gMTsKKwkJLyogRmFsbCB0aHJvdWdoLiAgKi8KKwkgICAgICBjYXNlICdPJzoKKwkJaWYgKCpjID09ICdPJyAmJiAoZ2l2ZW4gJiAoMSA8PCA4KSkpCisJCSAgZG9tYXNrcGMgPSAxOworCQkvKiBGYWxsIHRocm91Z2guICAqLworCSAgICAgIGNhc2UgJ00nOgorCQl7CisJCSAgaW50IHN0YXJ0ZWQgPSAwOworCQkgIGludCByZWc7CisKKwkJICBmdW5jIChzdHJlYW0sICJ7Iik7CisKKwkJICAvKiBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIHNwb3QKKwkJICAgICByYW5nZXMsIGFuZCBnZW5lcmF0ZSB0aGUgclMtckUgZm9ybWF0OiAqLworCQkgIGZvciAocmVnID0gMDsgKHJlZyA8IDgpOyByZWcrKykKKwkJICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCByZWcpKSAhPSAwKQorCQkgICAgICB7CisJCQlpZiAoc3RhcnRlZCkKKwkJCSAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKKwkJCXN0YXJ0ZWQgPSAxOworCQkJZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7CisJCSAgICAgIH0KKworCQkgIGlmIChkb21hc2tscikKKwkJICAgIHsKKwkJICAgICAgaWYgKHN0YXJ0ZWQpCisJCQlmdW5jIChzdHJlYW0sICIsICIpOworCQkgICAgICBzdGFydGVkID0gMTsKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbMTRdIC8qICJsciIgKi8pOworCQkgICAgfQorCisJCSAgaWYgKGRvbWFza3BjKQorCQkgICAgeworCQkgICAgICBpZiAoc3RhcnRlZCkKKwkJCWZ1bmMgKHN0cmVhbSwgIiwgIik7CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzWzE1XSAvKiAicGMiICovKTsKKwkJICAgIH0KKworCQkgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ2InOgorCQkvKiBQcmludCBBUk0gVjZUMiBDWkIgYWRkcmVzczogcGMrNCs2IGJpdHMuICAqLworCQl7CisJCSAgYmZkX3ZtYSBhZGRyZXNzID0gKHBjICsgNAorCQkJCSAgICAgKyAoKGdpdmVuICYgMHgwMGY4KSA+PiAyKQorCQkJCSAgICAgKyAoKGdpdmVuICYgMHgwMjAwKSA+PiAzKSk7CisJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChhZGRyZXNzLCBpbmZvKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ3MnOgorCQkvKiBSaWdodCBzaGlmdCBpbW1lZGlhdGUgLS0gYml0cyA2Li4xMDsgMS0zMSBwcmludAorCQkgICBhcyB0aGVtc2VsdmVzLCAwIHByaW50cyBhcyAzMi4gICovCisJCXsKKwkJICBsb25nIGltbSA9IChnaXZlbiAmIDB4MDdjMCkgPj4gNjsKKwkJICBpZiAoaW1tID09IDApCisJCSAgICBpbW0gPSAzMjsKKwkJICBmdW5jIChzdHJlYW0sICIjJWxkIiwgaW1tKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwkgICAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6CisJCXsKKwkJICBpbnQgYml0c3RhcnQgPSAqYysrIC0gJzAnOworCQkgIGludCBiaXRlbmQgPSAwOworCisJCSAgd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCisJCSAgICBiaXRzdGFydCA9IChiaXRzdGFydCAqIDEwKSArICpjKysgLSAnMCc7CisKKwkJICBzd2l0Y2ggKCpjKQorCQkgICAgeworCQkgICAgY2FzZSAnLSc6CisJCSAgICAgIHsKKwkJCWxvbmcgcmVnOworCisJCQljKys7CisJCQl3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKKwkJCSAgYml0ZW5kID0gKGJpdGVuZCAqIDEwKSArICpjKysgLSAnMCc7CisJCQlpZiAoIWJpdGVuZCkKKwkJCSAgYWJvcnQgKCk7CisJCQlyZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKKwkJCXJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7CisJCQlzd2l0Y2ggKCpjKQorCQkJICB7CisJCQkgIGNhc2UgJ3InOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ2QnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVsZCIsIHJlZyk7CisJCQkgICAgYnJlYWs7CisKKwkJCSAgY2FzZSAnSCc6CisJCQkgICAgZnVuYyAoc3RyZWFtLCAiJWxkIiwgcmVnIDw8IDEpOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ1cnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVsZCIsIHJlZyA8PCAyKTsKKwkJCSAgICBicmVhazsKKworCQkJICBjYXNlICdhJzoKKwkJCSAgICAvKiBQQy1yZWxhdGl2ZSBhZGRyZXNzIC0tIHRoZSBib3R0b20gdHdvCisJCQkgICAgICAgYml0cyBvZiB0aGUgYWRkcmVzcyBhcmUgZHJvcHBlZAorCQkJICAgICAgIGJlZm9yZSB0aGUgY2FsY3VsYXRpb24uICAqLworCQkJICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYworCQkJICAgICAgKCgocGMgKyA0KSAmIH4zKSArIChyZWcgPDwgMiksIGluZm8pOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ3gnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTA0bHgiLCByZWcpOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ0InOgorCQkJICAgIHJlZyA9ICgocmVnIF4gKDEgPDwgYml0ZW5kKSkgLSAoMSA8PCBiaXRlbmQpKTsKKwkJCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHJlZyAqIDIgKyBwYyArIDQsIGluZm8pOworCQkJICAgIGJyZWFrOworCisJCQkgIGNhc2UgJ2MnOgorCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX2NvbmRpdGlvbmFsIFtyZWddKTsKKwkJCSAgICBicmVhazsKKworCQkJICBkZWZhdWx0OgorCQkJICAgIGFib3J0ICgpOworCQkJICB9CisJCSAgICAgIH0KKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgJ1wnJzoKKwkJICAgICAgYysrOworCQkgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQorCQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICc/JzoKKwkJICAgICAgKytjOworCQkgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQorCQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYysrKTsKKwkJICAgICAgZWxzZQorCQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqKytjKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJYWJvcnQgKCk7CisJICAgICAgfQorCSAgfQorCXJldHVybjsKKyAgICAgIH0KKworICAvKiBObyBtYXRjaC4gICovCisgIGFib3J0ICgpOworfQorCisvKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gVjdNIHNwZWNpYWwgcmVnaXN0ZXIuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcHNyX25hbWUgKGludCByZWdubykKK3sKKyAgc3dpdGNoIChyZWdubykKKyAgICB7CisgICAgY2FzZSAwOiByZXR1cm4gIkFQU1IiOworICAgIGNhc2UgMTogcmV0dXJuICJJQVBTUiI7CisgICAgY2FzZSAyOiByZXR1cm4gIkVBUFNSIjsKKyAgICBjYXNlIDM6IHJldHVybiAiUFNSIjsKKyAgICBjYXNlIDU6IHJldHVybiAiSVBTUiI7CisgICAgY2FzZSA2OiByZXR1cm4gIkVQU1IiOworICAgIGNhc2UgNzogcmV0dXJuICJJRVBTUiI7CisgICAgY2FzZSA4OiByZXR1cm4gIk1TUCI7CisgICAgY2FzZSA5OiByZXR1cm4gIlBTUCI7CisgICAgY2FzZSAxNjogcmV0dXJuICJQUklNQVNLIjsKKyAgICBjYXNlIDE3OiByZXR1cm4gIkJBU0VQUkkiOworICAgIGNhc2UgMTg6IHJldHVybiAiQkFTRVBSSV9NQVNLIjsKKyAgICBjYXNlIDE5OiByZXR1cm4gIkZBVUxUTUFTSyI7CisgICAgY2FzZSAyMDogcmV0dXJuICJDT05UUk9MIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIjx1bmtub3duPiI7CisgICAgfQorfQorCisvKiBQcmludCBvbmUgMzItYml0IFRodW1iIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2luc25fdGh1bWIzMiAoYmZkX3ZtYSBwYywgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGxvbmcgZ2l2ZW4pCit7CisgIGNvbnN0IHN0cnVjdCBvcGNvZGUzMiAqaW5zbjsKKyAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOworICBmcHJpbnRmX2Z1bmN0aW9uIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7CisKKyAgaWYgKHByaW50X2luc25fY29wcm9jZXNzb3IgKHBjLCBpbmZvLCBnaXZlbiwgdHJ1ZSkpCisgICAgcmV0dXJuOworCisgIGlmIChwcmludF9pbnNuX25lb24gKGluZm8sIGdpdmVuLCB0cnVlKSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpbnNuID0gdGh1bWIzMl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKKyAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCisgICAgICB7CisJY29uc3QgY2hhciAqYyA9IGluc24tPmFzc2VtYmxlcjsKKwlmb3IgKDsgKmM7IGMrKykKKwkgIHsKKwkgICAgaWYgKCpjICE9ICclJykKKwkgICAgICB7CisJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQljb250aW51ZTsKKwkgICAgICB9CisKKwkgICAgc3dpdGNoICgqKytjKQorCSAgICAgIHsKKwkgICAgICBjYXNlICclJzoKKwkJZnVuYyAoc3RyZWFtLCAiJSUiKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdjJzoKKwkJaWYgKGlmdGhlbl9zdGF0ZSkKKwkJICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9jb25kaXRpb25hbFtJRlRIRU5fQ09ORF0pOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ3gnOgorCQlpZiAoaWZ0aGVuX25leHRfc3RhdGUpCisJCSAgZnVuYyAoc3RyZWFtLCAiXHQ7IHVucHJlZGljdGFibGUgYnJhbmNoIGluIElUIGJsb2NrXG4iKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdYJzoKKwkJaWYgKGlmdGhlbl9zdGF0ZSkKKwkJICBmdW5jIChzdHJlYW0sICJcdDsgdW5wcmVkaWN0YWJsZSA8SVQ6JXM+IiwKKwkJCWFybV9jb25kaXRpb25hbFtJRlRIRU5fQ09ORF0pOworCQlicmVhazsKKworCSAgICAgIGNhc2UgJ0knOgorCQl7CisJCSAgdW5zaWduZWQgaW50IGltbTEyID0gMDsKKwkJICBpbW0xMiB8PSAoZ2l2ZW4gJiAweDAwMDAwMGZmdSk7CisJCSAgaW1tMTIgfD0gKGdpdmVuICYgMHgwMDAwNzAwMHUpID4+IDQ7CisJCSAgaW1tMTIgfD0gKGdpdmVuICYgMHgwNDAwMDAwMHUpID4+IDE1OworCQkgIGZ1bmMgKHN0cmVhbSwgIiMldVx0OyAweCV4IiwgaW1tMTIsIGltbTEyKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ00nOgorCQl7CisJCSAgdW5zaWduZWQgaW50IGJpdHMgPSAwLCBpbW0sIGltbTgsIG1vZDsKKwkJICBiaXRzIHw9IChnaXZlbiAmIDB4MDAwMDAwZmZ1KTsKKwkJICBiaXRzIHw9IChnaXZlbiAmIDB4MDAwMDcwMDB1KSA+PiA0OworCQkgIGJpdHMgfD0gKGdpdmVuICYgMHgwNDAwMDAwMHUpID4+IDE1OworCQkgIGltbTggPSAoYml0cyAmIDB4MGZmKTsKKwkJICBtb2QgPSAoYml0cyAmIDB4ZjAwKSA+PiA4OworCQkgIHN3aXRjaCAobW9kKQorCQkgICAgeworCQkgICAgY2FzZSAwOiBpbW0gPSBpbW04OyBicmVhazsKKwkJICAgIGNhc2UgMTogaW1tID0gKChpbW04PDwxNikgfCBpbW04KTsgYnJlYWs7CisJCSAgICBjYXNlIDI6IGltbSA9ICgoaW1tODw8MjQpIHwgKGltbTggPDwgOCkpOyBicmVhazsKKwkJICAgIGNhc2UgMzogaW1tID0gKChpbW04PDwyNCkgfCAoaW1tOCA8PCAxNikgfCAoaW1tOCA8PCA4KSB8IGltbTgpOyBicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIG1vZCAgPSAoYml0cyAmIDB4ZjgwKSA+PiA3OworCQkgICAgICBpbW04ID0gKGJpdHMgJiAweDA3ZikgfCAweDgwOworCQkgICAgICBpbW0gID0gKCgoaW1tOCA8PCAoMzIgLSBtb2QpKSB8IChpbW04ID4+IG1vZCkpICYgMHhmZmZmZmZmZik7CisJCSAgICB9CisJCSAgZnVuYyAoc3RyZWFtLCAiIyV1XHQ7IDB4JXgiLCBpbW0sIGltbSk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdKJzoKKwkJeworCQkgIHVuc2lnbmVkIGludCBpbW0gPSAwOworCQkgIGltbSB8PSAoZ2l2ZW4gJiAweDAwMDAwMGZmdSk7CisJCSAgaW1tIHw9IChnaXZlbiAmIDB4MDAwMDcwMDB1KSA+PiA0OworCQkgIGltbSB8PSAoZ2l2ZW4gJiAweDA0MDAwMDAwdSkgPj4gMTU7CisJCSAgaW1tIHw9IChnaXZlbiAmIDB4MDAwZjAwMDB1KSA+PiA0OworCQkgIGZ1bmMgKHN0cmVhbSwgIiMldVx0OyAweCV4IiwgaW1tLCBpbW0pOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnSyc6CisJCXsKKwkJICB1bnNpZ25lZCBpbnQgaW1tID0gMDsKKwkJICBpbW0gfD0gKGdpdmVuICYgMHgwMDBmMDAwMHUpID4+IDE2OworCQkgIGltbSB8PSAoZ2l2ZW4gJiAweDAwMDAwZmYwdSkgPj4gMDsKKwkJICBpbW0gfD0gKGdpdmVuICYgMHgwMDAwMDAwZnUpIDw8IDEyOworCQkgIGZ1bmMgKHN0cmVhbSwgIiMldVx0OyAweCV4IiwgaW1tLCBpbW0pOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnUyc6CisJCXsKKwkJICB1bnNpZ25lZCBpbnQgcmVnID0gKGdpdmVuICYgMHgwMDAwMDAwZnUpOworCQkgIHVuc2lnbmVkIGludCBzdHAgPSAoZ2l2ZW4gJiAweDAwMDAwMDMwdSkgPj4gNDsKKwkJICB1bnNpZ25lZCBpbnQgaW1tID0gMDsKKwkJICBpbW0gfD0gKGdpdmVuICYgMHgwMDAwMDBjMHUpID4+IDY7CisJCSAgaW1tIHw9IChnaXZlbiAmIDB4MDAwMDcwMDB1KSA+PiAxMDsKKworCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOworCQkgIHN3aXRjaCAoc3RwKQorCQkgICAgeworCQkgICAgY2FzZSAwOgorCQkgICAgICBpZiAoaW1tID4gMCkKKwkJCWZ1bmMgKHN0cmVhbSwgIiwgbHNsICMldSIsIGltbSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIDE6CisJCSAgICAgIGlmIChpbW0gPT0gMCkKKwkJCWltbSA9IDMyOworCQkgICAgICBmdW5jIChzdHJlYW0sICIsIGxzciAjJXUiLCBpbW0pOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAyOgorCQkgICAgICBpZiAoaW1tID09IDApCisJCQlpbW0gPSAzMjsKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiLCBhc3IgIyV1IiwgaW1tKTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgMzoKKwkJICAgICAgaWYgKGltbSA9PSAwKQorCQkJZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKKwkJICAgICAgZWxzZQorCQkJZnVuYyAoc3RyZWFtLCAiLCByb3IgIyV1IiwgaW1tKTsKKwkJICAgIH0KKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ2EnOgorCQl7CisJCSAgdW5zaWduZWQgaW50IFJuICA9IChnaXZlbiAmIDB4MDAwZjAwMDApID4+IDE2OworCQkgIHVuc2lnbmVkIGludCBVICAgPSAoZ2l2ZW4gJiAweDAwODAwMDAwKSA+PiAyMzsKKwkJICB1bnNpZ25lZCBpbnQgb3AgID0gKGdpdmVuICYgMHgwMDAwMGYwMCkgPj4gODsKKwkJICB1bnNpZ25lZCBpbnQgaTEyID0gKGdpdmVuICYgMHgwMDAwMGZmZik7CisJCSAgdW5zaWduZWQgaW50IGk4ICA9IChnaXZlbiAmIDB4MDAwMDAwZmYpOworCQkgIGJmZF9ib29sZWFuIHdyaXRlYmFjayA9IGZhbHNlLCBwb3N0aW5kID0gZmFsc2U7CisJCSAgaW50IG9mZnNldCA9IDA7CisKKwkJICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXNbUm5dKTsKKwkJICBpZiAoVSkgLyogMTItYml0IHBvc2l0aXZlIGltbWVkaWF0ZSBvZmZzZXQgKi8KKwkJICAgIG9mZnNldCA9IGkxMjsKKwkJICBlbHNlIGlmIChSbiA9PSAxNSkgLyogMTItYml0IG5lZ2F0aXZlIGltbWVkaWF0ZSBvZmZzZXQgKi8KKwkJICAgIG9mZnNldCA9IC0oaW50KWkxMjsKKwkJICBlbHNlIGlmIChvcCA9PSAweDApIC8qIHNoaWZ0ZWQgcmVnaXN0ZXIgb2Zmc2V0ICovCisJCSAgICB7CisJCSAgICAgIHVuc2lnbmVkIGludCBSbSA9IChpOCAmIDB4MGYpOworCQkgICAgICB1bnNpZ25lZCBpbnQgc2ggPSAoaTggJiAweDMwKSA+PiA0OworCQkgICAgICBmdW5jIChzdHJlYW0sICIsICVzIiwgYXJtX3JlZ25hbWVzW1JtXSk7CisJCSAgICAgIGlmIChzaCkKKwkJCWZ1bmMgKHN0cmVhbSwgIiwgbHNsICMldSIsIHNoKTsKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSIpOworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICBlbHNlIHN3aXRjaCAob3ApCisJCSAgICB7CisJCSAgICBjYXNlIDB4RTogIC8qIDgtYml0IHBvc2l0aXZlIGltbWVkaWF0ZSBvZmZzZXQgKi8KKwkJICAgICAgb2Zmc2V0ID0gaTg7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIDB4QzogIC8qIDgtYml0IG5lZ2F0aXZlIGltbWVkaWF0ZSBvZmZzZXQgKi8KKwkJICAgICAgb2Zmc2V0ID0gLWk4OworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAweEY6ICAvKiA4LWJpdCArIHByZWluZGV4IHdpdGggd2IgKi8KKwkJICAgICAgb2Zmc2V0ID0gaTg7CisJCSAgICAgIHdyaXRlYmFjayA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIDB4RDogIC8qIDgtYml0IC0gcHJlaW5kZXggd2l0aCB3YiAqLworCQkgICAgICBvZmZzZXQgPSAtaTg7CisJCSAgICAgIHdyaXRlYmFjayA9IHRydWU7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlIDB4QjogIC8qIDgtYml0ICsgcG9zdGluZGV4ICovCisJCSAgICAgIG9mZnNldCA9IGk4OworCQkgICAgICBwb3N0aW5kID0gdHJ1ZTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgMHg5OiAgLyogOC1iaXQgLSBwb3N0aW5kZXggKi8KKwkJICAgICAgb2Zmc2V0ID0gLWk4OworCQkgICAgICBwb3N0aW5kID0gdHJ1ZTsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgPHVuZGVmaW5lZD5dIik7CisJCSAgICAgIGdvdG8gc2tpcDsKKwkJICAgIH0KKworCQkgIGlmIChwb3N0aW5kKQorCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgIyVkIiwgb2Zmc2V0KTsKKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGlmIChvZmZzZXQpCisJCQlmdW5jIChzdHJlYW0sICIsICMlZCIsIG9mZnNldCk7CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgd3JpdGViYWNrID8gIl0hIiA6ICJdIik7CisJCSAgICB9CisKKwkJICBpZiAoUm4gPT0gMTUpCisJCSAgICB7CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIlx0OyAiKTsKKwkJICAgICAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICgoKHBjICsgNCkgJiB+MykgKyBvZmZzZXQsIGluZm8pOworCQkgICAgfQorCQl9CisJICAgICAgc2tpcDoKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdBJzoKKwkJeworCQkgIHVuc2lnbmVkIGludCBQICAgPSAoZ2l2ZW4gJiAweDAxMDAwMDAwKSA+PiAyNDsKKwkJICB1bnNpZ25lZCBpbnQgVSAgID0gKGdpdmVuICYgMHgwMDgwMDAwMCkgPj4gMjM7CisJCSAgdW5zaWduZWQgaW50IFcgICA9IChnaXZlbiAmIDB4MDA0MDAwMDApID4+IDIxOworCQkgIHVuc2lnbmVkIGludCBSbiAgPSAoZ2l2ZW4gJiAweDAwMGYwMDAwKSA+PiAxNjsKKwkJICB1bnNpZ25lZCBpbnQgb2ZmID0gKGdpdmVuICYgMHgwMDAwMDBmZik7CisKKwkJICBmdW5jIChzdHJlYW0sICJbJXMiLCBhcm1fcmVnbmFtZXNbUm5dKTsKKwkJICBpZiAoUCkKKwkJICAgIHsKKwkJICAgICAgaWYgKG9mZiB8fCAhVSkKKwkJCWZ1bmMgKHN0cmVhbSwgIiwgIyVjJXUiLCBVID8gJysnIDogJy0nLCBvZmYgKiA0KTsKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSIpOworCQkgICAgICBpZiAoVykKKwkJCWZ1bmMgKHN0cmVhbSwgIiEiKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIl0sICIpOworCQkgICAgICBpZiAoVykKKwkJCWZ1bmMgKHN0cmVhbSwgIiMlYyV1IiwgVSA/ICcrJyA6ICctJywgb2ZmICogNCk7CisJCSAgICAgIGVsc2UKKwkJCWZ1bmMgKHN0cmVhbSwgInsldX0iLCBvZmYpOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAndyc6CisJCXsKKwkJICB1bnNpZ25lZCBpbnQgU2JpdCA9IChnaXZlbiAmIDB4MDEwMDAwMDApID4+IDI0OworCQkgIHVuc2lnbmVkIGludCB0eXBlID0gKGdpdmVuICYgMHgwMDYwMDAwMCkgPj4gMjE7CisJCSAgc3dpdGNoICh0eXBlKQorCQkgICAgeworCQkgICAgY2FzZSAwOiBmdW5jIChzdHJlYW0sIFNiaXQgPyAic2IiIDogImIiKTsgYnJlYWs7CisJCSAgICBjYXNlIDE6IGZ1bmMgKHN0cmVhbSwgU2JpdCA/ICJzaCIgOiAiaCIpOyBicmVhazsKKwkJICAgIGNhc2UgMjoKKwkJICAgICAgaWYgKFNiaXQpCisJCQlmdW5jIChzdHJlYW0sICI/PyIpOworCQkgICAgICBicmVhazsKKwkJICAgIGNhc2UgMzoKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiPz8iKTsKKwkJICAgICAgYnJlYWs7CisJCSAgICB9CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdtJzoKKwkJeworCQkgIGludCBzdGFydGVkID0gMDsKKwkJICBpbnQgcmVnOworCisJCSAgZnVuYyAoc3RyZWFtLCAieyIpOworCQkgIGZvciAocmVnID0gMDsgcmVnIDwgMTY7IHJlZysrKQorCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IHJlZykpICE9IDApCisJCSAgICAgIHsKKwkJCWlmIChzdGFydGVkKQorCQkJICBmdW5jIChzdHJlYW0sICIsICIpOworCQkJc3RhcnRlZCA9IDE7CisJCQlmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tyZWddKTsKKwkJICAgICAgfQorCQkgIGZ1bmMgKHN0cmVhbSwgIn0iKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ0UnOgorCQl7CisJCSAgdW5zaWduZWQgaW50IG1zYiA9IChnaXZlbiAmIDB4MDAwMDAwMWYpOworCQkgIHVuc2lnbmVkIGludCBsc2IgPSAwOworCQkgIGxzYiB8PSAoZ2l2ZW4gJiAweDAwMDAwMGMwdSkgPj4gNjsKKwkJICBsc2IgfD0gKGdpdmVuICYgMHgwMDAwNzAwMHUpID4+IDEwOworCQkgIGZ1bmMgKHN0cmVhbSwgIiMldSwgIyV1IiwgbHNiLCBtc2IgLSBsc2IgKyAxKTsKKwkJfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ0YnOgorCQl7CisJCSAgdW5zaWduZWQgaW50IHdpZHRoID0gKGdpdmVuICYgMHgwMDAwMDAxZikgKyAxOworCQkgIHVuc2lnbmVkIGludCBsc2IgPSAwOworCQkgIGxzYiB8PSAoZ2l2ZW4gJiAweDAwMDAwMGMwdSkgPj4gNjsKKwkJICBsc2IgfD0gKGdpdmVuICYgMHgwMDAwNzAwMHUpID4+IDEwOworCQkgIGZ1bmMgKHN0cmVhbSwgIiMldSwgIyV1IiwgbHNiLCB3aWR0aCk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdiJzoKKwkJeworCQkgIHVuc2lnbmVkIGludCBTID0gKGdpdmVuICYgMHgwNDAwMDAwMHUpID4+IDI2OworCQkgIHVuc2lnbmVkIGludCBKMSA9IChnaXZlbiAmIDB4MDAwMDIwMDB1KSA+PiAxMzsKKwkJICB1bnNpZ25lZCBpbnQgSjIgPSAoZ2l2ZW4gJiAweDAwMDAwODAwdSkgPj4gMTE7CisJCSAgaW50IG9mZnNldCA9IDA7CisKKwkJICBvZmZzZXQgfD0gIVMgPDwgMjA7CisJCSAgb2Zmc2V0IHw9IEoyIDw8IDE5OworCQkgIG9mZnNldCB8PSBKMSA8PCAxODsKKwkJICBvZmZzZXQgfD0gKGdpdmVuICYgMHgwMDNmMDAwMCkgPj4gNDsKKwkJICBvZmZzZXQgfD0gKGdpdmVuICYgMHgwMDAwMDdmZikgPDwgMTsKKwkJICBvZmZzZXQgLT0gKDEgPDwgMjApOworCisJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChwYyArIDQgKyBvZmZzZXQsIGluZm8pOworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnQic6CisJCXsKKwkJICB1bnNpZ25lZCBpbnQgUyA9IChnaXZlbiAmIDB4MDQwMDAwMDB1KSA+PiAyNjsKKwkJICB1bnNpZ25lZCBpbnQgSTEgPSAoZ2l2ZW4gJiAweDAwMDAyMDAwdSkgPj4gMTM7CisJCSAgdW5zaWduZWQgaW50IEkyID0gKGdpdmVuICYgMHgwMDAwMDgwMHUpID4+IDExOworCQkgIGludCBvZmZzZXQgPSAwOworCisJCSAgb2Zmc2V0IHw9ICFTIDw8IDI0OworCQkgIG9mZnNldCB8PSAhKEkxIF4gUykgPDwgMjM7CisJCSAgb2Zmc2V0IHw9ICEoSTIgXiBTKSA8PCAyMjsKKwkJICBvZmZzZXQgfD0gKGdpdmVuICYgMHgwM2ZmMDAwMHUpID4+IDQ7CisJCSAgb2Zmc2V0IHw9IChnaXZlbiAmIDB4MDAwMDA3ZmZ1KSA8PCAxOworCQkgIG9mZnNldCAtPSAoMSA8PCAyNCk7CisJCSAgb2Zmc2V0ICs9IHBjICsgNDsKKworCQkgIC8qIEJMWCB0YXJnZXQgYWRkcmVzc2VzIGFyZSBhbHdheXMgd29yZCBhbGlnbmVkLiAgKi8KKwkJICBpZiAoKGdpdmVuICYgMHgwMDAwMTAwMHUpID09IDApCisJCSAgICAgIG9mZnNldCAmPSB+MnU7CisKKwkJICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKG9mZnNldCwgaW5mbyk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdzJzoKKwkJeworCQkgIHVuc2lnbmVkIGludCBzaGlmdCA9IDA7CisJCSAgc2hpZnQgfD0gKGdpdmVuICYgMHgwMDAwMDBjMHUpID4+IDY7CisJCSAgc2hpZnQgfD0gKGdpdmVuICYgMHgwMDAwNzAwMHUpID4+IDEwOworCQkgIGlmIChnaXZlbiAmIDB4MDAyMDAwMDB1KQorCQkgICAgZnVuYyAoc3RyZWFtLCAiLCBhc3IgIyV1Iiwgc2hpZnQpOworCQkgIGVsc2UgaWYgKHNoaWZ0KQorCQkgICAgZnVuYyAoc3RyZWFtLCAiLCBsc2wgIyV1Iiwgc2hpZnQpOworCQkgIC8qIGVsc2UgcHJpbnQgbm90aGluZyAtIGxzbCAjMCAqLworCQl9CisJCWJyZWFrOworCisJICAgICAgY2FzZSAnUic6CisJCXsKKwkJICB1bnNpZ25lZCBpbnQgcm90ID0gKGdpdmVuICYgMHgwMDAwMDAzMCkgPj4gNDsKKwkJICBpZiAocm90KQorCQkgICAgZnVuYyAoc3RyZWFtLCAiLCByb3IgIyV1Iiwgcm90ICogOCk7CisJCX0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdVJzoKKwkJc3dpdGNoIChnaXZlbiAmIDB4ZikKKwkJICB7CisJCSAgY2FzZSAweGY6IGZ1bmMoc3RyZWFtLCAic3kiKTsgYnJlYWs7CisJCSAgY2FzZSAweDc6IGZ1bmMoc3RyZWFtLCAidW4iKTsgYnJlYWs7CisJCSAgY2FzZSAweGU6IGZ1bmMoc3RyZWFtLCAic3QiKTsgYnJlYWs7CisJCSAgY2FzZSAweDY6IGZ1bmMoc3RyZWFtLCAidW5zdCIpOyBicmVhazsKKwkJICBkZWZhdWx0OgorCQkgICAgZnVuYyhzdHJlYW0sICIjJWQiLCAoaW50KWdpdmVuICYgMHhmKTsKKwkJICAgIGJyZWFrOworCQkgIH0KKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICdDJzoKKwkJaWYgKChnaXZlbiAmIDB4ZmYpID09IDApCisJCSAgeworCQkgICAgZnVuYyAoc3RyZWFtLCAiJWNQU1JfIiwgKGdpdmVuICYgMHgxMDAwMDApID8gJ1MnIDogJ0MnKTsKKwkJICAgIGlmIChnaXZlbiAmIDB4ODAwKQorCQkgICAgICBmdW5jIChzdHJlYW0sICJmIik7CisJCSAgICBpZiAoZ2l2ZW4gJiAweDQwMCkKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAicyIpOworCQkgICAgaWYgKGdpdmVuICYgMHgyMDApCisJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIngiKTsKKwkJICAgIGlmIChnaXZlbiAmIDB4MTAwKQorCQkgICAgICBmdW5jIChzdHJlYW0sICJjIik7CisJCSAgfQorCQllbHNlCisJCSAgeworCQkgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBwc3JfbmFtZSAoZ2l2ZW4gJiAweGZmKSk7CisJCSAgfQorCQlicmVhazsKKworCSAgICAgIGNhc2UgJ0QnOgorCQlpZiAoKGdpdmVuICYgMHhmZikgPT0gMCkKKwkJICBmdW5jIChzdHJlYW0sICIlY1BTUiIsIChnaXZlbiAmIDB4MTAwMDAwKSA/ICdTJyA6ICdDJyk7CisJCWVsc2UKKwkJICBmdW5jIChzdHJlYW0sICIlcyIsIHBzcl9uYW1lIChnaXZlbiAmIDB4ZmYpKTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6CisJICAgICAgY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgorCQl7CisJCSAgaW50IHdpZHRoOworCQkgIHVuc2lnbmVkIGxvbmcgdmFsOworCisJCSAgYyA9IGFybV9kZWNvZGVfYml0ZmllbGQgKGMsIGdpdmVuLCAmdmFsLCAmd2lkdGgpOworCisJCSAgc3dpdGNoICgqYykKKwkJICAgIHsKKwkJICAgIGNhc2UgJ2QnOiBmdW5jIChzdHJlYW0sICIlbHUiLCB2YWwpOyBicmVhazsKKwkJICAgIGNhc2UgJ1cnOiBmdW5jIChzdHJlYW0sICIlbHUiLCB2YWwgKiA0KTsgYnJlYWs7CisJCSAgICBjYXNlICdyJzogZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbdmFsXSk7IGJyZWFrOworCisJCSAgICBjYXNlICdjJzoKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fY29uZGl0aW9uYWxbdmFsXSk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICdcJyc6CisJCSAgICAgIGMrKzsKKwkJICAgICAgaWYgKHZhbCA9PSAoKDF1bCA8PCB3aWR0aCkgLSAxKSkKKwkJCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOworCQkgICAgICBicmVhazsKKworCQkgICAgY2FzZSAnYCc6CisJCSAgICAgIGMrKzsKKwkJICAgICAgaWYgKHZhbCA9PSAwKQorCQkJZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7CisJCSAgICAgIGJyZWFrOworCisJCSAgICBjYXNlICc/JzoKKwkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCBjWygxIDw8IHdpZHRoKSAtIChpbnQpdmFsXSk7CisJCSAgICAgIGMgKz0gMSA8PCB3aWR0aDsKKwkJICAgICAgYnJlYWs7CisKKwkJICAgIGRlZmF1bHQ6CisJCSAgICAgIGFib3J0ICgpOworCQkgICAgfQorCQl9CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJYWJvcnQgKCk7CisJICAgICAgfQorCSAgfQorCXJldHVybjsKKyAgICAgIH0KKworICAvKiBObyBtYXRjaC4gICovCisgIGFib3J0ICgpOworfQorCisvKiBQcmludCBkYXRhIGJ5dGVzIG9uIElORk8tPlNUUkVBTS4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9pbnNuX2RhdGEgKGJmZF92bWEgcGMgQVRUUklCVVRFX1VOVVNFRCwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sCisJCSBsb25nIGdpdmVuKQoreworICBzd2l0Y2ggKGluZm8tPmJ5dGVzX3Blcl9jaHVuaykKKyAgICB7CisgICAgY2FzZSAxOgorICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIuYnl0ZVx0MHglMDJseCIsIGdpdmVuKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLnNob3J0XHQweCUwNGx4IiwgZ2l2ZW4pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIud29yZFx0MHglMDhseCIsIGdpdmVuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKKy8qIFNlYXJjaCBiYWNrIHRocm91Z2ggdGhlIGluc24gc3RyZWFtIHRvIGRldGVybWluZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzCisgICBjb25kaXRpb25hbGx5IGV4ZWN1dGVkLiAgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2lmdGhlbl9zdGF0ZSAoYmZkX3ZtYSBwYywgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sCisJCSAgIGJmZF9ib29sZWFuIGxpdHRsZSkKK3sKKyAgdW5zaWduZWQgY2hhciBiWzJdOworICB1bnNpZ25lZCBpbnQgaW5zbjsKKyAgaW50IHN0YXR1czsKKyAgLyogQ09VTlQgaXMgdHdpY2UgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2Vlbi4gIEl0IHdpbGwgYmUgb2RkIGlmIHdlCisgICAgIGp1c3QgY3Jvc3NlZCBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeS4gICovCisgIGludCBjb3VudDsKKyAgaW50IGl0X2NvdW50OworICB1bnNpZ25lZCBpbnQgc2Vlbl9pdDsKKyAgYmZkX3ZtYSBhZGRyOworCisgIGlmdGhlbl9hZGRyZXNzID0gcGM7CisgIGlmdGhlbl9zdGF0ZSA9IDA7CisKKyAgYWRkciA9IHBjOworICBjb3VudCA9IDE7CisgIGl0X2NvdW50ID0gMDsKKyAgc2Vlbl9pdCA9IDA7CisgIC8qIFNjYW4gYmFja3dhcmRzIGxvb2tpbmcgZm9yIElUIGluc3RydWN0aW9ucywga2VlcGluZyB0cmFjayBvZiB3aGVyZQorICAgICBpbnN0cnVjdGlvbiBib3VuZGFyaWVzIGFyZS4gIFdlIGRvbid0IGtub3cgaWYgc29tZXRoaW5nIGlzIGFjdHVhbGx5IGFuCisgICAgIElUIGluc3RydWN0aW9uIHVudGlsIHdlIGZpbmQgYSBkZWZpbml0ZSBpbnN0cnVjdGlvbiBib3VuZGFyeS4gICovCisgIGZvciAoOzspCisgICAgeworICAgICAgaWYgKGFkZHIgPT0gMCB8fCBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jKGFkZHIsIGluZm8pKQorCXsKKwkgIC8qIEEgc3ltYm9sIG11c3QgYmUgb24gYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnksIGFuZCB3aWxsIG5vdAorCSAgICAgYmUgd2l0aGluIGFuIElUIGJsb2NrLiAgKi8KKwkgIGlmIChzZWVuX2l0ICYmIChjb3VudCAmIDEpKQorCSAgICBicmVhazsKKworCSAgcmV0dXJuOworCX0KKyAgICAgIGFkZHIgLT0gMjsKKyAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGFkZHIsIChiZmRfYnl0ZSAqKWIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cykKKwlyZXR1cm47CisKKyAgICAgIGlmIChsaXR0bGUpCisJaW5zbiA9IChiWzBdKSB8IChiWzFdIDw8IDgpOworICAgICAgZWxzZQorCWluc24gPSAoYlsxXSkgfCAoYlswXSA8PCA4KTsKKyAgICAgIGlmIChzZWVuX2l0KQorCXsKKwkgIGlmICgoaW5zbiAmIDB4ZjgwMCkgPCAweGU4MDApCisJICAgIHsKKwkgICAgICAvKiBBZGRyICsgMiBpcyBhbiBpbnN0cnVjdGlvbiBib3VuZGFyeS4gIFNlZSBpZiB0aGlzIG1hdGNoZXMKKwkgICAgICAgICB0aGUgZXhwZWN0ZWQgYm91bmRhcnkgYmFzZWQgb24gdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0CisJCSBJVCBjYW5kaWRhdGUuICAqLworCSAgICAgIGlmIChjb3VudCAmIDEpCisJCWJyZWFrOworCSAgICAgIHNlZW5faXQgPSAwOworCSAgICB9CisJfQorICAgICAgaWYgKChpbnNuICYgMHhmZjAwKSA9PSAweGJmMDAgJiYgKGluc24gJiAweGYpICE9IDApCisJeworCSAgLyogVGhpcyBjb3VsZCBiZSBhbiBJVCBpbnN0cnVjdGlvbi4gICovCisJICBzZWVuX2l0ID0gaW5zbjsKKwkgIGl0X2NvdW50ID0gY291bnQgPj4gMTsKKwl9CisgICAgICBpZiAoKGluc24gJiAweGY4MDApID49IDB4ZTgwMCkKKwljb3VudCsrOworICAgICAgZWxzZQorCWNvdW50ID0gKGNvdW50ICsgMikgfCAxOworICAgICAgLyogSVQgYmxvY2tzIGNvbnRhaW4gYXQgbW9zdCA0IGluc3RydWN0aW9ucy4gICovCisgICAgICBpZiAoY291bnQgPj0gOCAmJiAhc2Vlbl9pdCkKKwlyZXR1cm47CisgICAgfQorICAvKiBXZSBmb3VuZCBhbiBJVCBpbnN0cnVjdGlvbi4gICovCisgIGlmdGhlbl9zdGF0ZSA9IChzZWVuX2l0ICYgMHhlMCkgfCAoKHNlZW5faXQgPDwgaXRfY291bnQpICYgMHgxZik7CisgIGlmICgoaWZ0aGVuX3N0YXRlICYgMHhmKSA9PSAwKQorICAgIGlmdGhlbl9zdGF0ZSA9IDA7Cit9CisKKy8qIE5PVEU6IFRoZXJlIGFyZSBubyBjaGVja3MgaW4gdGhlc2Ugcm91dGluZXMgdGhhdAorICAgdGhlIHJlbGV2YW50IG51bWJlciBvZiBkYXRhIGJ5dGVzIGV4aXN0LiAgKi8KKworaW50CitwcmludF9pbnNuX2FybSAoYmZkX3ZtYSBwYywgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIHVuc2lnbmVkIGNoYXIgYls0XTsKKyAgbG9uZwkJZ2l2ZW47CisgIGludCAgICAgICAgICAgc3RhdHVzOworICBpbnQgICAgICAgICAgIGlzX3RodW1iID0gZmFsc2U7CisgIGludCAgICAgICAgICAgaXNfZGF0YSA9IGZhbHNlOworICB1bnNpZ25lZCBpbnQJc2l6ZSA9IDQ7CisgIHZvaWQJIAkoKnByaW50ZXIpIChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKTsKKyNpZiAwCisgIGJmZF9ib29sZWFuICAgZm91bmQgPSBmYWxzZTsKKworICBpZiAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpCisgICAgeworICAgICAgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKTsKKworICAgICAgLyogVG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZyBvZiB0aGVzZSBvcHRpb25zLCB3ZSByZW1vdmUgdGhlbSBoZXJlLiAgKi8KKyAgICAgIGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zID0gTlVMTDsKKyAgICB9CisKKyAgLyogRmlyc3QgY2hlY2sgdGhlIGZ1bGwgc3ltdGFiIGZvciBhIG1hcHBpbmcgc3ltYm9sLCBldmVuIGlmIHRoZXJlCisgICAgIGFyZSBubyB1c2FibGUgbm9uLW1hcHBpbmcgc3ltYm9scyBmb3IgdGhpcyBhZGRyZXNzLiAgKi8KKyAgaWYgKGluZm8tPnN5bXRhYiAhPSBOVUxMCisgICAgICAmJiBiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltdGFiKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQorICAgIHsKKyAgICAgIGJmZF92bWEgYWRkcjsKKyAgICAgIGludCBuOworICAgICAgaW50IGxhc3Rfc3ltID0gLTE7CisgICAgICBlbnVtIG1hcF90eXBlIHR5cGUgPSBNQVBfQVJNOworCisgICAgICBpZiAocGMgPD0gbGFzdF9tYXBwaW5nX2FkZHIpCisJbGFzdF9tYXBwaW5nX3N5bSA9IC0xOworICAgICAgaXNfdGh1bWIgPSAobGFzdF90eXBlID09IE1BUF9USFVNQik7CisgICAgICBmb3VuZCA9IGZhbHNlOworICAgICAgLyogU3RhcnQgc2Nhbm5pbmcgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgb3Igd2hlcmV2ZXIKKwkgd2UgZmluaXNoZWQgbGFzdCB0aW1lLiAgKi8KKyAgICAgIG4gPSBpbmZvLT5zeW10YWJfcG9zICsgMTsKKyAgICAgIGlmIChuIDwgbGFzdF9tYXBwaW5nX3N5bSkKKwluID0gbGFzdF9tYXBwaW5nX3N5bTsKKworICAgICAgLyogU2NhbiB1cCB0byB0aGUgbG9jYXRpb24gYmVpbmcgZGlzYXNzZW1ibGVkLiAgKi8KKyAgICAgIGZvciAoOyBuIDwgaW5mby0+c3ltdGFiX3NpemU7IG4rKykKKwl7CisJICBhZGRyID0gYmZkX2FzeW1ib2xfdmFsdWUgKGluZm8tPnN5bXRhYltuXSk7CisJICBpZiAoYWRkciA+IHBjKQorCSAgICBicmVhazsKKwkgIGlmICgoaW5mby0+c2VjdGlvbiA9PSBOVUxMCisJICAgICAgIHx8IGluZm8tPnNlY3Rpb24gPT0gaW5mby0+c3ltdGFiW25dLT5zZWN0aW9uKQorCSAgICAgICYmIGdldF9zeW1fY29kZV90eXBlIChpbmZvLCBuLCAmdHlwZSkpCisJICAgIHsKKwkgICAgICBsYXN0X3N5bSA9IG47CisJICAgICAgZm91bmQgPSB0cnVlOworCSAgICB9CisJfQorCisgICAgICBpZiAoIWZvdW5kKQorCXsKKwkgIG4gPSBpbmZvLT5zeW10YWJfcG9zOworCSAgaWYgKG4gPCBsYXN0X21hcHBpbmdfc3ltIC0gMSkKKwkgICAgbiA9IGxhc3RfbWFwcGluZ19zeW0gLSAxOworCisJICAvKiBObyBtYXBwaW5nIHN5bWJvbCBmb3VuZCBhdCB0aGlzIGFkZHJlc3MuICBMb29rIGJhY2t3YXJkcworCSAgICAgZm9yIGEgcHJlY2VkaW5nIG9uZS4gICovCisJICBmb3IgKDsgbiA+PSAwOyBuLS0pCisJICAgIHsKKwkgICAgICBpZiAoZ2V0X3N5bV9jb2RlX3R5cGUgKGluZm8sIG4sICZ0eXBlKSkKKwkJeworCQkgIGxhc3Rfc3ltID0gbjsKKwkJICBmb3VuZCA9IHRydWU7CisJCSAgYnJlYWs7CisJCX0KKwkgICAgfQorCX0KKworICAgICAgbGFzdF9tYXBwaW5nX3N5bSA9IGxhc3Rfc3ltOworICAgICAgbGFzdF90eXBlID0gdHlwZTsKKyAgICAgIGlzX3RodW1iID0gKGxhc3RfdHlwZSA9PSBNQVBfVEhVTUIpOworICAgICAgaXNfZGF0YSA9IChsYXN0X3R5cGUgPT0gTUFQX0RBVEEpOworCisgICAgICAvKiBMb29rIGEgbGl0dGxlIGJpdCBhaGVhZCB0byBzZWUgaWYgd2Ugc2hvdWxkIHByaW50IG91dAorCSB0d28gb3IgZm91ciBieXRlcyBvZiBkYXRhLiAgSWYgdGhlcmUncyBhIHN5bWJvbCwKKwkgbWFwcGluZyBvciBvdGhlcndpc2UsIGFmdGVyIHR3byBieXRlcyB0aGVuIGRvbid0CisJIHByaW50IG1vcmUuICAqLworICAgICAgaWYgKGlzX2RhdGEpCisJeworCSAgc2l6ZSA9IDQgLSAocGMgJiAzKTsKKwkgIGZvciAobiA9IGxhc3Rfc3ltICsgMTsgbiA8IGluZm8tPnN5bXRhYl9zaXplOyBuKyspCisJICAgIHsKKwkgICAgICBhZGRyID0gYmZkX2FzeW1ib2xfdmFsdWUgKGluZm8tPnN5bXRhYltuXSk7CisJICAgICAgaWYgKGFkZHIgPiBwYykKKwkJeworCQkgIGlmIChhZGRyIC0gcGMgPCBzaXplKQorCQkgICAgc2l6ZSA9IGFkZHIgLSBwYzsKKwkJICBicmVhazsKKwkJfQorCSAgICB9CisJICAvKiBJZiB0aGUgbmV4dCBzeW1ib2wgaXMgYWZ0ZXIgdGhyZWUgYnl0ZXMsIHdlIG5lZWQgdG8KKwkgICAgIHByaW50IG9ubHkgcGFydCBvZiB0aGUgZGF0YSwgc28gdGhhdCB3ZSBjYW4gdXNlIGVpdGhlcgorCSAgICAgLmJ5dGUgb3IgLnNob3J0LiAgKi8KKwkgIGlmIChzaXplID09IDMpCisJICAgIHNpemUgPSAocGMgJiAxKSA/IDEgOiAyOworCX0KKyAgICB9CisKKyAgaWYgKGluZm8tPnN5bWJvbHMgIT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQorCXsKKwkgIGNvZmZfc3ltYm9sX3R5cGUgKiBjczsKKworCSAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7CisJICBpc190aHVtYiA9ICggICBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCisJCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCisJCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAorCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQworCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOworCX0KKyAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisJICAgICAgICYmICFmb3VuZCkKKwl7CisJICAvKiBJZiBubyBtYXBwaW5nIHN5bWJvbCBoYXMgYmVlbiBmb3VuZCB0aGVuIGZhbGwgYmFjayB0byB0aGUgdHlwZQorCSAgICAgb2YgdGhlIGZ1bmN0aW9uIHN5bWJvbC4gICovCisJICBlbGZfc3ltYm9sX3R5cGUgKiAgZXM7CisJICB1bnNpZ25lZCBpbnQgICAgICAgdHlwZTsKKworCSAgZXMgPSAqKGVsZl9zeW1ib2xfdHlwZSAqKikoaW5mby0+c3ltYm9scyk7CisJICB0eXBlID0gRUxGX1NUX1RZUEUgKGVzLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pOworCisJICBpc190aHVtYiA9ICh0eXBlID09IFNUVF9BUk1fVEZVTkMpIHx8ICh0eXBlID09IFNUVF9BUk1fMTZCSVQpOworCX0KKyAgICB9CisjZWxzZQorICBpbnQgbGl0dGxlOworCisgIGxpdHRsZSA9IChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpOworICBpc190aHVtYiB8PSAocGMgJiAxKTsKKyAgcGMgJj0gfihiZmRfdm1hKTE7CisjZW5kaWYKKworICBpZiAoZm9yY2VfdGh1bWIpCisgICAgaXNfdGh1bWIgPSB0cnVlOworCisgIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gNDsKKworICBpZiAoaXNfZGF0YSkKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgLyogc2l6ZSB3YXMgYWxyZWFkeSBzZXQgYWJvdmUuICAqLworICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gc2l6ZTsKKyAgICAgIHByaW50ZXIgPSBwcmludF9pbnNuX2RhdGE7CisKKyAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHBjLCAoYmZkX2J5dGUgKiliLCBzaXplLCBpbmZvKTsKKyAgICAgIGdpdmVuID0gMDsKKyAgICAgIGlmIChsaXR0bGUpCisJZm9yIChpID0gc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKQorCSAgZ2l2ZW4gPSBiW2ldIHwgKGdpdmVuIDw8IDgpOworICAgICAgZWxzZQorCWZvciAoaSA9IDA7IGkgPCAoaW50KSBzaXplOyBpKyspCisJICBnaXZlbiA9IGJbaV0gfCAoZ2l2ZW4gPDwgOCk7CisgICAgfQorICBlbHNlIGlmICghaXNfdGh1bWIpCisgICAgeworICAgICAgLyogSW4gQVJNIG1vZGUgZW5kaWFubmVzcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpc3N1ZTogdGhlIGluc3RydWN0aW9uCisJIGlzIGZvdXIgYnl0ZXMgbG9uZyBhbmQgaXMgZWl0aGVyIG9yZGVyZWQgMDEyMyBvciAzMjEwLiAgKi8KKyAgICAgIHByaW50ZXIgPSBwcmludF9pbnNuX2FybV9pbnRlcm5hbDsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7CisgICAgICBzaXplID0gNDsKKworICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAocGMsIChiZmRfYnl0ZSAqKWIsIDQsIGluZm8pOworICAgICAgaWYgKGxpdHRsZSkKKwlnaXZlbiA9IChiWzBdKSB8IChiWzFdIDw8IDgpIHwgKGJbMl0gPDwgMTYpIHwgKGJbM10gPDwgMjQpOworICAgICAgZWxzZQorCWdpdmVuID0gKGJbM10pIHwgKGJbMl0gPDwgOCkgfCAoYlsxXSA8PCAxNikgfCAoYlswXSA8PCAyNCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyogSW4gVGh1bWIgbW9kZSB3ZSBoYXZlIHRoZSBhZGRpdGlvbmFsIHdyaW5rbGUgb2YgdHdvCisJIGluc3RydWN0aW9uIGxlbmd0aHMuICBGb3J0dW5hdGVseSwgdGhlIGJpdHMgdGhhdCBkZXRlcm1pbmUKKwkgdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhcmUgYWx3YXlzIHRvIGJlIGZvdW5kCisJIGluIHRoZSBmaXJzdCB0d28gYnl0ZXMuICAqLworICAgICAgcHJpbnRlciA9IHByaW50X2luc25fdGh1bWIxNjsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7CisgICAgICBzaXplID0gMjsKKworICAgICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAocGMsIChiZmRfYnl0ZSAqKWIsIDIsIGluZm8pOworICAgICAgaWYgKGxpdHRsZSkKKwlnaXZlbiA9IChiWzBdKSB8IChiWzFdIDw8IDgpOworICAgICAgZWxzZQorCWdpdmVuID0gKGJbMV0pIHwgKGJbMF0gPDwgOCk7CisKKyAgICAgIGlmICghc3RhdHVzKQorCXsKKwkgIC8qIFRoZXNlIGJpdCBwYXR0ZXJucyBzaWduYWwgYSBmb3VyLWJ5dGUgVGh1bWIKKwkgICAgIGluc3RydWN0aW9uLiAgKi8KKwkgIGlmICgoZ2l2ZW4gJiAweEY4MDApID09IDB4RjgwMAorCSAgICAgIHx8IChnaXZlbiAmIDB4RjgwMCkgPT0gMHhGMDAwCisJICAgICAgfHwgKGdpdmVuICYgMHhGODAwKSA9PSAweEU4MDApCisJICAgIHsKKwkgICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChwYyArIDIsIChiZmRfYnl0ZSAqKWIsIDIsIGluZm8pOworCSAgICAgIGlmIChsaXR0bGUpCisJCWdpdmVuID0gKGJbMF0pIHwgKGJbMV0gPDwgOCkgfCAoZ2l2ZW4gPDwgMTYpOworCSAgICAgIGVsc2UKKwkJZ2l2ZW4gPSAoYlsxXSkgfCAoYlswXSA8PCA4KSB8IChnaXZlbiA8PCAxNik7CisKKwkgICAgICBwcmludGVyID0gcHJpbnRfaW5zbl90aHVtYjMyOworCSAgICAgIHNpemUgPSA0OworCSAgICB9CisJfQorCisgICAgICBpZiAoaWZ0aGVuX2FkZHJlc3MgIT0gcGMpCisJZmluZF9pZnRoZW5fc3RhdGUocGMsIGluZm8sIGxpdHRsZSk7CisKKyAgICAgIGlmIChpZnRoZW5fc3RhdGUpCisJeworCSAgaWYgKChpZnRoZW5fc3RhdGUgJiAweGYpID09IDB4OCkKKwkgICAgaWZ0aGVuX25leHRfc3RhdGUgPSAwOworCSAgZWxzZQorCSAgICBpZnRoZW5fbmV4dF9zdGF0ZSA9IChpZnRoZW5fc3RhdGUgJiAweGUwKQorCQkJCXwgKChpZnRoZW5fc3RhdGUgJiAweGYpIDw8IDEpOworCX0KKyAgICB9CisKKyAgaWYgKHN0YXR1cykKKyAgICB7CisgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBwYywgaW5mbyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICBpZiAoaW5mby0+ZmxhZ3MgJiBJTlNOX0hBU19SRUxPQykKKyAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGEgcmVsb2MgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuCisgICAgICAgdGhlIG9mZnNldCBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBhY3R1YWxseSBiZSB0aGUKKyAgICAgICBhZGRlbmQgZm9yIHRoZSByZWxvYy4gIChXZSBhcmUgdXNpbmcgUkVMIHR5cGUgcmVsb2NzKS4KKyAgICAgICBJbiBzdWNoIGNhc2VzLCB3ZSBjYW4gaWdub3JlIHRoZSBwYyB3aGVuIGNvbXB1dGluZworICAgICAgIGFkZHJlc3Nlcywgc2luY2UgdGhlIGFkZGVuZCBpcyBub3QgY3VycmVudGx5IHBjLXJlbGF0aXZlLiAgKi8KKyAgICBwYyA9IDA7CisKKyAgLyogV2UgaW5jbHVkZSB0aGUgaGV4ZHVtcCBvZiB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBmb3JtYXQgaGVyZQorICAgICBtYXRjaGVzIHRoYXQgdXNlZCBieSBvYmpkdW1wIGFuZCB0aGUgQVJNIEFSTSAoaW4gcGFydGljdWxhciwKKyAgICAgMzIgYml0IFRodW1iIGluc3RydWN0aW9ucyBhcmUgZGlzcGxheWVkIGFzIHBhaXJzIG9mIGhhbGZ3b3JkcywKKyAgICAgbm90IGFzIGEgc2luZ2xlIHdvcmQuKSAgKi8KKyAgaWYgKGlzX3RodW1iKQorICAgIHsKKyAgICAgIGlmIChzaXplID09IDIpCisJeworCSAgaW5mby0+ZnByaW50Zl9mdW5jKGluZm8tPnN0cmVhbSwgIiUwNGx4ICAgICAgICIsCisJCQkgICAgICgodW5zaWduZWQgbG9uZylnaXZlbikgJiAweGZmZmYpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBpbmZvLT5mcHJpbnRmX2Z1bmMoaW5mby0+c3RyZWFtLCAiJTA0bHggJTA0bHggICIsCisJCQkgICAgICgoKHVuc2lnbmVkIGxvbmcpZ2l2ZW4pID4+IDE2KSAmIDB4ZmZmZiwKKwkJCSAgICAgKCh1bnNpZ25lZCBsb25nKWdpdmVuKSAmIDB4ZmZmZik7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGluZm8tPmZwcmludGZfZnVuYyhpbmZvLT5zdHJlYW0sICIlMDhseCAgICAgICIsCisJCQkgKCh1bnNpZ25lZCBsb25nKWdpdmVuKSAmIDB4ZmZmZmZmZmYpOworICAgIH0KKworICBwcmludGVyIChwYywgaW5mbywgZ2l2ZW4pOworCisgIGlmIChpc190aHVtYikKKyAgICB7CisgICAgICBpZnRoZW5fc3RhdGUgPSBpZnRoZW5fbmV4dF9zdGF0ZTsKKyAgICAgIGlmdGhlbl9hZGRyZXNzICs9IHNpemU7CisgICAgfQorICByZXR1cm4gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZGlzYXMvaTM4Ni5jIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9pMzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvZGlzYXMvaTM4Ni5jCkBAIC0wLDAgKzEsNjYzMiBAQAorLyogb3Bjb2Rlcy9pMzg2LWRpcy5jIHIxLjEyNiAqLworLyogUHJpbnQgaTM4NiBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTg4LCAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LAorICAgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gKi8KKworLyogODAzODYgaW5zdHJ1Y3Rpb24gcHJpbnRlciBieSBQYWNlIFdpbGxpc3NvbiAocGFjZUBwcmVwLmFpLm1pdC5lZHUpCisgICBKdWx5IDE5ODgKKyAgICBtb2RpZmllZCBieSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pCisgICAgeDg2LTY0IHN1cHBvcnQgYWRkZWQgYnkgSmFuIEh1Ymlja2EgKGpoQHN1c2UuY3opCisgICAgVklBIFBhZExvY2sgc3VwcG9ydCBieSBNaWNoYWwgTHVkdmlnIChtbHVkdmlnQHN1c2UuY3opLiAgKi8KKworLyogVGhlIG1haW4gdGFibGVzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9ucyBpcyBlc3NlbnRpYWxseSBhIGNvcHkKKyAgIG9mIHRoZSAiT3Bjb2RlIE1hcCIgY2hhcHRlciAoQXBwZW5kaXggQSkgb2YgdGhlIEludGVsIDgwMzg2CisgICBQcm9ncmFtbWVycyBNYW51YWwuICBVc3VhbGx5LCB0aGVyZSBpcyBhIGNhcGl0YWwgbGV0dGVyLCBmb2xsb3dlZAorICAgYnkgYSBzbWFsbCBsZXR0ZXIuICBUaGUgY2FwaXRhbCBsZXR0ZXIgdGVsbCB0aGUgYWRkcmVzc2luZyBtb2RlLAorICAgYW5kIHRoZSBzbWFsbCBsZXR0ZXIgdGVsbHMgYWJvdXQgdGhlIG9wZXJhbmQgc2l6ZS4gIFJlZmVyIHRvCisgICB0aGUgSW50ZWwgbWFudWFsIGZvciBkZXRhaWxzLiAgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImRpc2FzL2JmZC5oIgorLyogaW5jbHVkZS9vcGNvZGUvaTM4Ni5oIHIxLjc4ICovCisKKy8qIG9wY29kZS9pMzg2LmggLS0gSW50ZWwgODAzODYgb3Bjb2RlIG1hY3JvcworICAgQ29weXJpZ2h0IDE5ODksIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksCisgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3CisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGUgU3lzdGVtVi8zODYgU1ZSMy4yIGFzc2VtYmxlciwgYW5kIHByb2JhYmx5IGFsbCBBVCZUIGRlcml2ZWQKKyAgIGl4ODYgVW5peCBhc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aAorICAgcmV2ZXJzZWQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4KKyAgIFVuZm9ydHVuYXRlbHksIGdjYyBhbmQgcG9zc2libHkgbWFueSBvdGhlciBwcm9ncmFtcyB1c2UgdGhpcworICAgcmV2ZXJzZWQgc3ludGF4LCBzbyB3ZSdyZSBzdHVjayB3aXRoIGl0LgorCisgICBlZy4gYGZzdWIgJXN0KDMpLCVzdCcgcmVzdWx0cyBpbiBzdCA9IHN0IC0gc3QoMykgYXMgZXhwZWN0ZWQsIGJ1dAorICAgYGZzdWIgJXN0LCVzdCgzKScgcmVzdWx0cyBpbiBzdCgzKSA9IHN0IC0gc3QoMyksIHJhdGhlciB0aGFuCisgICB0aGUgZXhwZWN0ZWQgc3QoMykgPSBzdCgzKSAtIHN0CisKKyAgIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUgbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQKKyAgIG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMsIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMKKyAgICVzdCwgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzICVzdChpKS4KKworICAgVGhlIGFmZmVjdGVkIG9wY29kZSBtYXAgaXMgZGNlWCwgZGNmWCwgZGVlWCwgZGVmWC4gICovCisKKyNpZm5kZWYgU1lTVjM4Nl9DT01QQVQKKy8qIFNldCBub24temVybyBmb3IgYnJva2VuLCBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gIFNldCB0byB6ZXJvIGZvcgorICAgbm9uLWJyb2tlbiBvcGNvZGVzIGF0IHlvdXIgcGVyaWwuICBnY2MgZ2VuZXJhdGVzIFN5c3RlbVYvMzg2CisgICBjb21wYXRpYmxlIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIFNZU1YzODZfQ09NUEFUIDEKKyNlbmRpZgorI2lmbmRlZiBPTERHQ0NfQ09NUEFUCisvKiBTZXQgbm9uLXplcm8gdG8gY2F0ZXIgZm9yIG9sZCAoPD0gMi44LjEpIHZlcnNpb25zIG9mIGdjYyB0aGF0IGNvdWxkCisgICBnZW5lcmF0ZSBub25zZW5zZSBmc3VicCwgZnN1YnJwLCBmZGl2cCBhbmQgZmRpdnJwIHdpdGggb3BlcmFuZHMKKyAgIHJldmVyc2VkLiAgKi8KKyNkZWZpbmUgT0xER0NDX0NPTVBBVCBTWVNWMzg2X0NPTVBBVAorI2VuZGlmCisKKyNkZWZpbmUgTU9WX0FYX0RJU1AzMiAweGEwCisjZGVmaW5lIFBPUF9TRUdfU0hPUlQgMHgwNworI2RlZmluZSBKVU1QX1BDX1JFTEFUSVZFIDB4ZWIKKyNkZWZpbmUgSU5UX09QQ09ERSAgMHhjZAorI2RlZmluZSBJTlQzX09QQ09ERSAweGNjCisvKiBUaGUgb3Bjb2RlIGZvciB0aGUgZndhaXQgaW5zdHJ1Y3Rpb24sIHdoaWNoIGRpc2Fzc2VtYmxlciB0cmVhdHMgYXMgYQorICAgcHJlZml4IHdoZW4gaXQgY2FuLiAgKi8KKyNkZWZpbmUgRldBSVRfT1BDT0RFIDB4OWIKKyNkZWZpbmUgQUREUl9QUkVGSVhfT1BDT0RFIDB4NjcKKyNkZWZpbmUgREFUQV9QUkVGSVhfT1BDT0RFIDB4NjYKKyNkZWZpbmUgTE9DS19QUkVGSVhfT1BDT0RFIDB4ZjAKKyNkZWZpbmUgQ1NfUFJFRklYX09QQ09ERSAweDJlCisjZGVmaW5lIERTX1BSRUZJWF9PUENPREUgMHgzZQorI2RlZmluZSBFU19QUkVGSVhfT1BDT0RFIDB4MjYKKyNkZWZpbmUgRlNfUFJFRklYX09QQ09ERSAweDY0CisjZGVmaW5lIEdTX1BSRUZJWF9PUENPREUgMHg2NQorI2RlZmluZSBTU19QUkVGSVhfT1BDT0RFIDB4MzYKKyNkZWZpbmUgUkVQTkVfUFJFRklYX09QQ09ERSAweGYyCisjZGVmaW5lIFJFUEVfUFJFRklYX09QQ09ERSAgMHhmMworCisjZGVmaW5lIFRXT19CWVRFX09QQ09ERV9FU0NBUEUgMHgwZgorI2RlZmluZSBOT1BfT1BDT0RFIChjaGFyKSAweDkwCisKKy8qIHJlZ2lzdGVyIG51bWJlcnMgKi8KKyNkZWZpbmUgRUJQX1JFR19OVU0gNQorI2RlZmluZSBFU1BfUkVHX05VTSA0CisKKy8qIG1vZHJtX2J5dGUucmVnbWVtIGZvciB0d29ieXRlIGVzY2FwZSAqLworI2RlZmluZSBFU0NBUEVfVE9fVFdPX0JZVEVfQUREUkVTU0lORyBFU1BfUkVHX05VTQorLyogaW5kZXhfYmFzZV9ieXRlLmluZGV4IGZvciBubyBpbmRleCByZWdpc3RlciBhZGRyZXNzaW5nICovCisjZGVmaW5lIE5PX0lOREVYX1JFR0lTVEVSIEVTUF9SRUdfTlVNCisvKiBpbmRleF9iYXNlX2J5dGUuYmFzZSBmb3Igbm8gYmFzZSByZWdpc3RlciBhZGRyZXNzaW5nICovCisjZGVmaW5lIE5PX0JBU0VfUkVHSVNURVIgRUJQX1JFR19OVU0KKyNkZWZpbmUgTk9fQkFTRV9SRUdJU1RFUl8xNiA2CisKKy8qIG1vZHJtLm1vZGUgPSBSRUdNRU1fRklFTERfSEFTX1JFRyB3aGVuIGEgcmVnaXN0ZXIgaXMgaW4gdGhlcmUgKi8KKyNkZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19SRUcgMHgzLyogYWx3YXlzID0gMHgzICovCisjZGVmaW5lIFJFR01FTV9GSUVMRF9IQVNfTUVNICh+UkVHTUVNX0ZJRUxEX0hBU19SRUcpCisKKy8qIHg4Ni02NCBleHRlbnNpb24gcHJlZml4LiAgKi8KKyNkZWZpbmUgUkVYX09QQ09ERQkweDQwCisKKy8qIEluZGljYXRlcyA2NCBiaXQgb3BlcmFuZCBzaXplLiAgKi8KKyNkZWZpbmUgUkVYX1cJOAorLyogSGlnaCBleHRlbnNpb24gdG8gcmVnIGZpZWxkIG9mIG1vZHJtIGJ5dGUuICAqLworI2RlZmluZSBSRVhfUgk0CisvKiBIaWdoIGV4dGVuc2lvbiB0byBTSUIgaW5kZXggZmllbGQuICAqLworI2RlZmluZSBSRVhfWAkyCisvKiBIaWdoIGV4dGVuc2lvbiB0byBiYXNlIGZpZWxkIG9mIG1vZHJtIG9yIFNJQiwgb3IgcmVnIGZpZWxkIG9mIG9wY29kZS4gICovCisjZGVmaW5lIFJFWF9CCTEKKworLyogbWF4IG9wZXJhbmRzIHBlciBpbnNuICovCisjZGVmaW5lIE1BWF9PUEVSQU5EUyA0CisKKy8qIG1heCBpbW1lZGlhdGVzIHBlciBpbnNuIChsY2FsbCwgbGptcCwgaW5zZXJ0cSwgZXh0cnEpICovCisjZGVmaW5lIE1BWF9JTU1FRElBVEVfT1BFUkFORFMgMgorCisvKiBtYXggbWVtb3J5IHJlZnMgcGVyIGluc24gKHN0cmluZyBvcHMpICovCisjZGVmaW5lIE1BWF9NRU1PUllfT1BFUkFORFMgMgorCisvKiBtYXggc2l6ZSBvZiBpbnNuIG1uZW1vbmljcy4gICovCisjZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYKKworLyogbWF4IHNpemUgb2YgcmVnaXN0ZXIgbmFtZSBpbiBpbnNuIG1uZW1vbmljcy4gICovCisjZGVmaW5lIE1BWF9SRUdfTkFNRV9TSVpFIDgKKworLyogb3Bjb2Rlcy9pMzg2LWRpcy5jIHIxLjEyNiAqLworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworc3RhdGljIGludCBmZXRjaF9kYXRhMihzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKTsKK3N0YXRpYyBpbnQgZmV0Y2hfZGF0YShzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKTsKK3N0YXRpYyB2b2lkIGNrcHJlZml4ICh2b2lkKTsKK3N0YXRpYyBjb25zdCBjaGFyICpwcmVmaXhfbmFtZSAoaW50LCBpbnQpOworc3RhdGljIGludCBwcmludF9pbnNuIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopOworc3RhdGljIHZvaWQgZG9mbG9hdCAoaW50KTsKK3N0YXRpYyB2b2lkIE9QX1NUIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9TVGkgKGludCwgaW50KTsKK3N0YXRpYyBpbnQgcHV0b3AgKGNvbnN0IGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG9hcHBlbmQgKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCBhcHBlbmRfc2VnICh2b2lkKTsKK3N0YXRpYyB2b2lkIE9QX2luZGlyRSAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgcHJpbnRfb3BlcmFuZF92YWx1ZSAoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IGhleCwgYmZkX3ZtYSBkaXNwKTsKK3N0YXRpYyB2b2lkIHByaW50X2Rpc3BsYWNlbWVudCAoY2hhciAqLCBiZmRfdm1hKTsKK3N0YXRpYyB2b2lkIE9QX0UgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX0cgKGludCwgaW50KTsKK3N0YXRpYyBiZmRfdm1hIGdldDY0ICh2b2lkKTsKK3N0YXRpYyBiZmRfc2lnbmVkX3ZtYSBnZXQzMiAodm9pZCk7CitzdGF0aWMgYmZkX3NpZ25lZF92bWEgZ2V0MzJzICh2b2lkKTsKK3N0YXRpYyBpbnQgZ2V0MTYgKHZvaWQpOworc3RhdGljIHZvaWQgc2V0X29wIChiZmRfdm1hLCBpbnQpOworc3RhdGljIHZvaWQgT1BfUkVHIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9JTVJFRyAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfSSAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfSTY0IChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9zSSAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfSiAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfU0VHIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9ESVIgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX09GRiAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfT0ZGNjQgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIHB0cl9yZWcgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX0VTcmVnIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9EU3JlZyAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfQyAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfRCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfVCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfUiAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfTU1YIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9YTU0gKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX0VNIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBPUF9FWCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfRU1DIChpbnQsaW50KTsKK3N0YXRpYyB2b2lkIE9QX01YQyAoaW50LGludCk7CitzdGF0aWMgdm9pZCBPUF9NUyAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfWFMgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX00gKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX1ZNWCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfMGZhZSAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfMGYwNyAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgTk9QX0ZpeHVwMSAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgTk9QX0ZpeHVwMiAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgT1BfM0ROb3dTdWZmaXggKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIE9QX1NJTURfU3VmZml4IChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBTSU1EX0ZpeHVwIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBQTklfRml4dXAgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIFNWTUVfRml4dXAgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIElOVkxQR19GaXh1cCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgQmFkT3AgKHZvaWQpOworc3RhdGljIHZvaWQgVk1YX0ZpeHVwIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBSRVBfRml4dXAgKGludCwgaW50KTsKK3N0YXRpYyB2b2lkIENNUFhDSEc4Ql9GaXh1cCAoaW50LCBpbnQpOworc3RhdGljIHZvaWQgWE1NX0ZpeHVwIChpbnQsIGludCk7CitzdGF0aWMgdm9pZCBDUkMzMl9GaXh1cCAoaW50LCBpbnQpOworCitzdHJ1Y3QgZGlzX3ByaXZhdGUgeworICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCisgIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKKyAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhfTU5FTV9TSVpFXTsKKyAgYmZkX3ZtYSBpbnNuX3N0YXJ0OworICBpbnQgb3JpZ19zaXplZmxhZzsKKyAgc2lnam1wX2J1ZiBiYWlsb3V0OworfTsKKworZW51bSBhZGRyZXNzX21vZGUKK3sKKyAgbW9kZV8xNmJpdCwKKyAgbW9kZV8zMmJpdCwKKyAgbW9kZV82NGJpdAorfTsKKworc3RhdGljIGVudW0gYWRkcmVzc19tb2RlIGFkZHJlc3NfbW9kZTsKKworLyogSGVscGVyIG1hY3JvIHVzZWQgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiB1c2luZworICogY29uc3RhbnQgc3RyaW5ncy4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHx4ICsgaW50ZWxfc3ludGF4fAorICogb3RoZXJ3aXNlLiAqLworI2RlZmluZSBJTlRFTF9TWU5UQVgoeCkgICZ4WyhpbnQpKGludGVsX3N5bnRheCldCisKKy8qIEZsYWdzIGZvciB0aGUgcHJlZml4ZXMgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgU2VlIGJlbG93LiAgKi8KK3N0YXRpYyBpbnQgcHJlZml4ZXM7CisKKy8qIFJFWCBwcmVmaXggdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICBTZWUgYmVsb3cuICAqLworc3RhdGljIGludCByZXg7CisvKiBCaXRzIG9mIFJFWCB3ZSd2ZSBhbHJlYWR5IHVzZWQuICAqLworc3RhdGljIGludCByZXhfdXNlZDsKKy8qIE1hcmsgcGFydHMgdXNlZCBpbiB0aGUgUkVYIHByZWZpeC4gIFdoZW4gd2UgYXJlIHRlc3RpbmcgZm9yCisgICBlbXB0eSBwcmVmaXggKGZvciA4Yml0IHJlZ2lzdGVyIFJFWCBleHRlbnNpb24pLCBqdXN0IG1hc2sgaXQKKyAgIG91dC4gIE90aGVyd2lzZSB0ZXN0IGZvciBSRVggYml0IGlzIGV4Y3VzZSBmb3IgZXhpc3RlbmNlIG9mIFJFWAorICAgb25seSBpbiBjYXNlIHZhbHVlIGlzIG5vbnplcm8uICAqLworI2RlZmluZSBVU0VEX1JFWCh2YWx1ZSkJCQkJCVwKKyAgewkJCQkJCQlcCisgICAgaWYgKHZhbHVlKQkJCQkJCVwKKyAgICAgIHsJCQkJCQkJXAorCWlmICgocmV4ICYgdmFsdWUpKQkJCQlcCisJICByZXhfdXNlZCB8PSAodmFsdWUpIHwgUkVYX09QQ09ERTsJCVwKKyAgICAgIH0JCQkJCQkJXAorICAgIGVsc2UJCQkJCQlcCisgICAgICByZXhfdXNlZCB8PSBSRVhfT1BDT0RFOwkJCQlcCisgIH0KKworLyogRmxhZ3MgZm9yIHByZWZpeGVzIHdoaWNoIHdlIHNvbWVob3cgaGFuZGxlZCB3aGVuIHByaW50aW5nIHRoZQorICAgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCitzdGF0aWMgaW50IHVzZWRfcHJlZml4ZXM7CisKKy8qIEZsYWdzIHN0b3JlZCBpbiBQUkVGSVhFUy4gICovCisjZGVmaW5lIFBSRUZJWF9SRVBaIDEKKyNkZWZpbmUgUFJFRklYX1JFUE5aIDIKKyNkZWZpbmUgUFJFRklYX0xPQ0sgNAorI2RlZmluZSBQUkVGSVhfQ1MgOAorI2RlZmluZSBQUkVGSVhfU1MgMHgxMAorI2RlZmluZSBQUkVGSVhfRFMgMHgyMAorI2RlZmluZSBQUkVGSVhfRVMgMHg0MAorI2RlZmluZSBQUkVGSVhfRlMgMHg4MAorI2RlZmluZSBQUkVGSVhfR1MgMHgxMDAKKyNkZWZpbmUgUFJFRklYX0RBVEEgMHgyMDAKKyNkZWZpbmUgUFJFRklYX0FERFIgMHg0MDAKKyNkZWZpbmUgUFJFRklYX0ZXQUlUIDB4ODAwCisKKy8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKKyAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcworICAgb24gZXJyb3IuICAqLworc3RhdGljIGludAorZmV0Y2hfZGF0YTIoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGJmZF9ieXRlICphZGRyKQoreworICBpbnQgc3RhdHVzOworICBzdHJ1Y3QgZGlzX3ByaXZhdGUgKnByaXYgPSAoc3RydWN0IGRpc19wcml2YXRlICopIGluZm8tPnByaXZhdGVfZGF0YTsKKyAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKKworICBpZiAoYWRkciA8PSBwcml2LT50aGVfYnVmZmVyICsgTUFYX01ORU1fU0laRSkKKyAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKKwkJCQkJcHJpdi0+bWF4X2ZldGNoZWQsCisJCQkJCWFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKKwkJCQkJaW5mbyk7CisgIGVsc2UKKyAgICBzdGF0dXMgPSAtMTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgIC8qIElmIHdlIGRpZCBtYW5hZ2UgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgdGhlbgorCSBwcmludF9pbnNuX2kzODYgd2lsbCBkbyBzb21ldGhpbmcgc2Vuc2libGUuICBPdGhlcndpc2UsIHByaW50CisJIGFuIGVycm9yLiAgV2UgZG8gdGhhdCBoZXJlIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB3ZSBrbm93CisJIFNUQVRVUy4gICovCisgICAgICBpZiAocHJpdi0+bWF4X2ZldGNoZWQgPT0gcHJpdi0+dGhlX2J1ZmZlcikKKwkoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBzdGFydCwgaW5mbyk7CisgICAgICBzaWdsb25nam1wKHByaXYtPmJhaWxvdXQsIDEpOworICAgIH0KKyAgZWxzZQorICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2ZldGNoX2RhdGEoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGJmZF9ieXRlICphZGRyKQoreworICAgIGlmIChhZGRyIDw9ICgoc3RydWN0IGRpc19wcml2YXRlICopIChpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZldGNoX2RhdGEyKGluZm8sIGFkZHIpOworICAgIH0KK30KKworCisjZGVmaW5lIFhYIHsgTlVMTCwgMCB9CisKKyNkZWZpbmUgRWIgeyBPUF9FLCBiX21vZGUgfQorI2RlZmluZSBFdiB7IE9QX0UsIHZfbW9kZSB9CisjZGVmaW5lIEVkIHsgT1BfRSwgZF9tb2RlIH0KKyNkZWZpbmUgRWRxIHsgT1BfRSwgZHFfbW9kZSB9CisjZGVmaW5lIEVkcXcgeyBPUF9FLCBkcXdfbW9kZSB9CisjZGVmaW5lIEVkcWIgeyBPUF9FLCBkcWJfbW9kZSB9CisjZGVmaW5lIEVkcWQgeyBPUF9FLCBkcWRfbW9kZSB9CisjZGVmaW5lIGluZGlyRXYgeyBPUF9pbmRpckUsIHN0YWNrX3ZfbW9kZSB9CisjZGVmaW5lIGluZGlyRXAgeyBPUF9pbmRpckUsIGZfbW9kZSB9CisjZGVmaW5lIHN0YWNrRXYgeyBPUF9FLCBzdGFja192X21vZGUgfQorI2RlZmluZSBFbSB7IE9QX0UsIG1fbW9kZSB9CisjZGVmaW5lIEV3IHsgT1BfRSwgd19tb2RlIH0KKyNkZWZpbmUgTSB7IE9QX00sIDAgfQkJLyogbGVhLCBsZ2R0LCBldGMuICovCisjZGVmaW5lIE1hIHsgT1BfTSwgdl9tb2RlIH0KKyNkZWZpbmUgTXAgeyBPUF9NLCBmX21vZGUgfQkJLyogMzIgb3IgNDggYml0IG1lbW9yeSBvcGVyYW5kIGZvciBMRFMsIExFUyBldGMgKi8KKyNkZWZpbmUgTXEgeyBPUF9NLCBxX21vZGUgfQorI2RlZmluZSBHYiB7IE9QX0csIGJfbW9kZSB9CisjZGVmaW5lIEd2IHsgT1BfRywgdl9tb2RlIH0KKyNkZWZpbmUgR2QgeyBPUF9HLCBkX21vZGUgfQorI2RlZmluZSBHZHEgeyBPUF9HLCBkcV9tb2RlIH0KKyNkZWZpbmUgR20geyBPUF9HLCBtX21vZGUgfQorI2RlZmluZSBHdyB7IE9QX0csIHdfbW9kZSB9CisjZGVmaW5lIFJkIHsgT1BfUiwgZF9tb2RlIH0KKyNkZWZpbmUgUm0geyBPUF9SLCBtX21vZGUgfQorI2RlZmluZSBJYiB7IE9QX0ksIGJfbW9kZSB9CisjZGVmaW5lIHNJYiB7IE9QX3NJLCBiX21vZGUgfQkvKiBzaWduIGV4dGVuZWQgYnl0ZSAqLworI2RlZmluZSBJdiB7IE9QX0ksIHZfbW9kZSB9CisjZGVmaW5lIElxIHsgT1BfSSwgcV9tb2RlIH0KKyNkZWZpbmUgSXY2NCB7IE9QX0k2NCwgdl9tb2RlIH0KKyNkZWZpbmUgSXcgeyBPUF9JLCB3X21vZGUgfQorI2RlZmluZSBJMSB7IE9QX0ksIGNvbnN0XzFfbW9kZSB9CisjZGVmaW5lIEpiIHsgT1BfSiwgYl9tb2RlIH0KKyNkZWZpbmUgSnYgeyBPUF9KLCB2X21vZGUgfQorI2RlZmluZSBDbSB7IE9QX0MsIG1fbW9kZSB9CisjZGVmaW5lIERtIHsgT1BfRCwgbV9tb2RlIH0KKyNkZWZpbmUgVGQgeyBPUF9ULCBkX21vZGUgfQorCisjZGVmaW5lIFJNZUFYIHsgT1BfUkVHLCBlQVhfcmVnIH0KKyNkZWZpbmUgUk1lQlggeyBPUF9SRUcsIGVCWF9yZWcgfQorI2RlZmluZSBSTWVDWCB7IE9QX1JFRywgZUNYX3JlZyB9CisjZGVmaW5lIFJNZURYIHsgT1BfUkVHLCBlRFhfcmVnIH0KKyNkZWZpbmUgUk1lU1AgeyBPUF9SRUcsIGVTUF9yZWcgfQorI2RlZmluZSBSTWVCUCB7IE9QX1JFRywgZUJQX3JlZyB9CisjZGVmaW5lIFJNZVNJIHsgT1BfUkVHLCBlU0lfcmVnIH0KKyNkZWZpbmUgUk1lREkgeyBPUF9SRUcsIGVESV9yZWcgfQorI2RlZmluZSBSTXJBWCB7IE9QX1JFRywgckFYX3JlZyB9CisjZGVmaW5lIFJNckJYIHsgT1BfUkVHLCByQlhfcmVnIH0KKyNkZWZpbmUgUk1yQ1ggeyBPUF9SRUcsIHJDWF9yZWcgfQorI2RlZmluZSBSTXJEWCB7IE9QX1JFRywgckRYX3JlZyB9CisjZGVmaW5lIFJNclNQIHsgT1BfUkVHLCByU1BfcmVnIH0KKyNkZWZpbmUgUk1yQlAgeyBPUF9SRUcsIHJCUF9yZWcgfQorI2RlZmluZSBSTXJTSSB7IE9QX1JFRywgclNJX3JlZyB9CisjZGVmaW5lIFJNckRJIHsgT1BfUkVHLCByRElfcmVnIH0KKyNkZWZpbmUgUk1BTCB7IE9QX1JFRywgYWxfcmVnIH0KKyNkZWZpbmUgUk1BTCB7IE9QX1JFRywgYWxfcmVnIH0KKyNkZWZpbmUgUk1DTCB7IE9QX1JFRywgY2xfcmVnIH0KKyNkZWZpbmUgUk1ETCB7IE9QX1JFRywgZGxfcmVnIH0KKyNkZWZpbmUgUk1CTCB7IE9QX1JFRywgYmxfcmVnIH0KKyNkZWZpbmUgUk1BSCB7IE9QX1JFRywgYWhfcmVnIH0KKyNkZWZpbmUgUk1DSCB7IE9QX1JFRywgY2hfcmVnIH0KKyNkZWZpbmUgUk1ESCB7IE9QX1JFRywgZGhfcmVnIH0KKyNkZWZpbmUgUk1CSCB7IE9QX1JFRywgYmhfcmVnIH0KKyNkZWZpbmUgUk1BWCB7IE9QX1JFRywgYXhfcmVnIH0KKyNkZWZpbmUgUk1EWCB7IE9QX1JFRywgZHhfcmVnIH0KKworI2RlZmluZSBlQVggeyBPUF9JTVJFRywgZUFYX3JlZyB9CisjZGVmaW5lIGVCWCB7IE9QX0lNUkVHLCBlQlhfcmVnIH0KKyNkZWZpbmUgZUNYIHsgT1BfSU1SRUcsIGVDWF9yZWcgfQorI2RlZmluZSBlRFggeyBPUF9JTVJFRywgZURYX3JlZyB9CisjZGVmaW5lIGVTUCB7IE9QX0lNUkVHLCBlU1BfcmVnIH0KKyNkZWZpbmUgZUJQIHsgT1BfSU1SRUcsIGVCUF9yZWcgfQorI2RlZmluZSBlU0kgeyBPUF9JTVJFRywgZVNJX3JlZyB9CisjZGVmaW5lIGVESSB7IE9QX0lNUkVHLCBlRElfcmVnIH0KKyNkZWZpbmUgQUwgeyBPUF9JTVJFRywgYWxfcmVnIH0KKyNkZWZpbmUgQ0wgeyBPUF9JTVJFRywgY2xfcmVnIH0KKyNkZWZpbmUgREwgeyBPUF9JTVJFRywgZGxfcmVnIH0KKyNkZWZpbmUgQkwgeyBPUF9JTVJFRywgYmxfcmVnIH0KKyNkZWZpbmUgQUggeyBPUF9JTVJFRywgYWhfcmVnIH0KKyNkZWZpbmUgQ0ggeyBPUF9JTVJFRywgY2hfcmVnIH0KKyNkZWZpbmUgREggeyBPUF9JTVJFRywgZGhfcmVnIH0KKyNkZWZpbmUgQkggeyBPUF9JTVJFRywgYmhfcmVnIH0KKyNkZWZpbmUgQVggeyBPUF9JTVJFRywgYXhfcmVnIH0KKyNkZWZpbmUgRFggeyBPUF9JTVJFRywgZHhfcmVnIH0KKyNkZWZpbmUgekFYIHsgT1BfSU1SRUcsIHpfbW9kZV9heF9yZWcgfQorI2RlZmluZSBpbmRpckRYIHsgT1BfSU1SRUcsIGluZGlyX2R4X3JlZyB9CisKKyNkZWZpbmUgU3cgeyBPUF9TRUcsIHdfbW9kZSB9CisjZGVmaW5lIFN2IHsgT1BfU0VHLCB2X21vZGUgfQorI2RlZmluZSBBcCB7IE9QX0RJUiwgMCB9CisjZGVmaW5lIE9iIHsgT1BfT0ZGNjQsIGJfbW9kZSB9CisjZGVmaW5lIE92IHsgT1BfT0ZGNjQsIHZfbW9kZSB9CisjZGVmaW5lIFhiIHsgT1BfRFNyZWcsIGVTSV9yZWcgfQorI2RlZmluZSBYdiB7IE9QX0RTcmVnLCBlU0lfcmVnIH0KKyNkZWZpbmUgWHogeyBPUF9EU3JlZywgZVNJX3JlZyB9CisjZGVmaW5lIFliIHsgT1BfRVNyZWcsIGVESV9yZWcgfQorI2RlZmluZSBZdiB7IE9QX0VTcmVnLCBlRElfcmVnIH0KKyNkZWZpbmUgRFNCWCB7IE9QX0RTcmVnLCBlQlhfcmVnIH0KKworI2RlZmluZSBlcyB7IE9QX1JFRywgZXNfcmVnIH0KKyNkZWZpbmUgc3MgeyBPUF9SRUcsIHNzX3JlZyB9CisjZGVmaW5lIGNzIHsgT1BfUkVHLCBjc19yZWcgfQorI2RlZmluZSBkcyB7IE9QX1JFRywgZHNfcmVnIH0KKyNkZWZpbmUgZnMgeyBPUF9SRUcsIGZzX3JlZyB9CisjZGVmaW5lIGdzIHsgT1BfUkVHLCBnc19yZWcgfQorCisjZGVmaW5lIE1YIHsgT1BfTU1YLCAwIH0KKyNkZWZpbmUgWE0geyBPUF9YTU0sIDAgfQorI2RlZmluZSBFTSB7IE9QX0VNLCB2X21vZGUgfQorI2RlZmluZSBFTWQgeyBPUF9FTSwgZF9tb2RlIH0KKyNkZWZpbmUgRU1xIHsgT1BfRU0sIHFfbW9kZSB9CisjZGVmaW5lIEVYZCB7IE9QX0VYLCBkX21vZGUgfQorI2RlZmluZSBFWHEgeyBPUF9FWCwgcV9tb2RlIH0KKyNkZWZpbmUgRVh4IHsgT1BfRVgsIHhfbW9kZSB9CisjZGVmaW5lIE1TIHsgT1BfTVMsIHZfbW9kZSB9CisjZGVmaW5lIFhTIHsgT1BfWFMsIHZfbW9kZSB9CisjZGVmaW5lIEVNQyB7IE9QX0VNQywgdl9tb2RlIH0KKyNkZWZpbmUgTVhDIHsgT1BfTVhDLCAwIH0KKyNkZWZpbmUgVk0geyBPUF9WTVgsIHFfbW9kZSB9CisjZGVmaW5lIE9QU1VGIHsgT1BfM0ROb3dTdWZmaXgsIDAgfQorI2RlZmluZSBPUFNJTUQgeyBPUF9TSU1EX1N1ZmZpeCwgMCB9CisjZGVmaW5lIFhNTTAgeyBYTU1fRml4dXAsIDAgfQorCisvKiBVc2VkIGhhbmRsZSAicmVwIiBwcmVmaXggZm9yIHN0cmluZyBpbnN0cnVjdGlvbnMuICAqLworI2RlZmluZSBYYnIgeyBSRVBfRml4dXAsIGVTSV9yZWcgfQorI2RlZmluZSBYdnIgeyBSRVBfRml4dXAsIGVTSV9yZWcgfQorI2RlZmluZSBZYnIgeyBSRVBfRml4dXAsIGVESV9yZWcgfQorI2RlZmluZSBZdnIgeyBSRVBfRml4dXAsIGVESV9yZWcgfQorI2RlZmluZSBZenIgeyBSRVBfRml4dXAsIGVESV9yZWcgfQorI2RlZmluZSBpbmRpckRYciB7IFJFUF9GaXh1cCwgaW5kaXJfZHhfcmVnIH0KKyNkZWZpbmUgQUxyIHsgUkVQX0ZpeHVwLCBhbF9yZWcgfQorI2RlZmluZSBlQVhyIHsgUkVQX0ZpeHVwLCBlQVhfcmVnIH0KKworI2RlZmluZSBjb25kX2p1bXBfZmxhZyB7IE5VTEwsIGNvbmRfanVtcF9tb2RlIH0KKyNkZWZpbmUgbG9vcF9qY3h6X2ZsYWcgeyBOVUxMLCBsb29wX2pjeHpfbW9kZSB9CisKKy8qIGJpdHMgaW4gc2l6ZWZsYWcgKi8KKyNkZWZpbmUgU1VGRklYX0FMV0FZUyA0CisjZGVmaW5lIEFGTEFHIDIKKyNkZWZpbmUgREZMQUcgMQorCisjZGVmaW5lIGJfbW9kZSAxICAvKiBieXRlIG9wZXJhbmQgKi8KKyNkZWZpbmUgdl9tb2RlIDIgIC8qIG9wZXJhbmQgc2l6ZSBkZXBlbmRzIG9uIHByZWZpeGVzICovCisjZGVmaW5lIHdfbW9kZSAzICAvKiB3b3JkIG9wZXJhbmQgKi8KKyNkZWZpbmUgZF9tb2RlIDQgIC8qIGRvdWJsZSB3b3JkIG9wZXJhbmQgICovCisjZGVmaW5lIHFfbW9kZSA1ICAvKiBxdWFkIHdvcmQgb3BlcmFuZCAqLworI2RlZmluZSB0X21vZGUgNiAgLyogdGVuLWJ5dGUgb3BlcmFuZCAqLworI2RlZmluZSB4X21vZGUgNyAgLyogMTYtYnl0ZSBYTU0gb3BlcmFuZCAqLworI2RlZmluZSBtX21vZGUgOCAgLyogZF9tb2RlIGluIDMyYml0LCBxX21vZGUgaW4gNjRiaXQgbW9kZS4gICovCisjZGVmaW5lIGNvbmRfanVtcF9tb2RlIDkKKyNkZWZpbmUgbG9vcF9qY3h6X21vZGUgMTAKKyNkZWZpbmUgZHFfbW9kZSAxMSAvKiBvcGVyYW5kIHNpemUgZGVwZW5kcyBvbiBSRVggcHJlZml4ZXMuICAqLworI2RlZmluZSBkcXdfbW9kZSAxMiAvKiByZWdpc3RlcnMgbGlrZSBkcV9tb2RlLCBtZW1vcnkgbGlrZSB3X21vZGUuICAqLworI2RlZmluZSBmX21vZGUgMTMgLyogNC0gb3IgNi1ieXRlIHBvaW50ZXIgb3BlcmFuZCAqLworI2RlZmluZSBjb25zdF8xX21vZGUgMTQKKyNkZWZpbmUgc3RhY2tfdl9tb2RlIDE1IC8qIHZfbW9kZSBmb3Igc3RhY2stcmVsYXRlZCBvcGNvZGVzLiAgKi8KKyNkZWZpbmUgel9tb2RlIDE2IC8qIG5vbi1xdWFkIG9wZXJhbmQgc2l6ZSBkZXBlbmRzIG9uIHByZWZpeGVzICovCisjZGVmaW5lIG9fbW9kZSAxNyAgLyogMTYtYnl0ZSBvcGVyYW5kICovCisjZGVmaW5lIGRxYl9tb2RlIDE4IC8qIHJlZ2lzdGVycyBsaWtlIGRxX21vZGUsIG1lbW9yeSBsaWtlIGJfbW9kZS4gICovCisjZGVmaW5lIGRxZF9tb2RlIDE5IC8qIHJlZ2lzdGVycyBsaWtlIGRxX21vZGUsIG1lbW9yeSBsaWtlIGRfbW9kZS4gICovCisKKyNkZWZpbmUgZXNfcmVnIDEwMAorI2RlZmluZSBjc19yZWcgMTAxCisjZGVmaW5lIHNzX3JlZyAxMDIKKyNkZWZpbmUgZHNfcmVnIDEwMworI2RlZmluZSBmc19yZWcgMTA0CisjZGVmaW5lIGdzX3JlZyAxMDUKKworI2RlZmluZSBlQVhfcmVnIDEwOAorI2RlZmluZSBlQ1hfcmVnIDEwOQorI2RlZmluZSBlRFhfcmVnIDExMAorI2RlZmluZSBlQlhfcmVnIDExMQorI2RlZmluZSBlU1BfcmVnIDExMgorI2RlZmluZSBlQlBfcmVnIDExMworI2RlZmluZSBlU0lfcmVnIDExNAorI2RlZmluZSBlRElfcmVnIDExNQorCisjZGVmaW5lIGFsX3JlZyAxMTYKKyNkZWZpbmUgY2xfcmVnIDExNworI2RlZmluZSBkbF9yZWcgMTE4CisjZGVmaW5lIGJsX3JlZyAxMTkKKyNkZWZpbmUgYWhfcmVnIDEyMAorI2RlZmluZSBjaF9yZWcgMTIxCisjZGVmaW5lIGRoX3JlZyAxMjIKKyNkZWZpbmUgYmhfcmVnIDEyMworCisjZGVmaW5lIGF4X3JlZyAxMjQKKyNkZWZpbmUgY3hfcmVnIDEyNQorI2RlZmluZSBkeF9yZWcgMTI2CisjZGVmaW5lIGJ4X3JlZyAxMjcKKyNkZWZpbmUgc3BfcmVnIDEyOAorI2RlZmluZSBicF9yZWcgMTI5CisjZGVmaW5lIHNpX3JlZyAxMzAKKyNkZWZpbmUgZGlfcmVnIDEzMQorCisjZGVmaW5lIHJBWF9yZWcgMTMyCisjZGVmaW5lIHJDWF9yZWcgMTMzCisjZGVmaW5lIHJEWF9yZWcgMTM0CisjZGVmaW5lIHJCWF9yZWcgMTM1CisjZGVmaW5lIHJTUF9yZWcgMTM2CisjZGVmaW5lIHJCUF9yZWcgMTM3CisjZGVmaW5lIHJTSV9yZWcgMTM4CisjZGVmaW5lIHJESV9yZWcgMTM5CisKKyNkZWZpbmUgel9tb2RlX2F4X3JlZyAxNDkKKyNkZWZpbmUgaW5kaXJfZHhfcmVnIDE1MAorCisjZGVmaW5lIEZMT0FUQ09ERSAxCisjZGVmaW5lIFVTRV9HUk9VUFMgMgorI2RlZmluZSBVU0VfUFJFRklYX1VTRVJfVEFCTEUgMworI2RlZmluZSBYODZfNjRfU1BFQ0lBTCA0CisjZGVmaW5lIElTXzNCWVRFX09QQ09ERSA1CisKKyNkZWZpbmUgRkxPQVQJICBOVUxMLCB7IHsgTlVMTCwgRkxPQVRDT0RFIH0gfQorCisjZGVmaW5lIEdSUDFhCSAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAgMCB9IH0KKyNkZWZpbmUgR1JQMWIJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsICAxIH0gfQorI2RlZmluZSBHUlAxUwkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgIDIgfSB9CisjZGVmaW5lIEdSUDFTcwkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgIDMgfSB9CisjZGVmaW5lIEdSUDJiCSAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAgNCB9IH0KKyNkZWZpbmUgR1JQMlMJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsICA1IH0gfQorI2RlZmluZSBHUlAyYl9vbmUgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAgNiB9IH0KKyNkZWZpbmUgR1JQMlNfb25lIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgIDcgfSB9CisjZGVmaW5lIEdSUDJiX2NsICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsICA4IH0gfQorI2RlZmluZSBHUlAyU19jbCAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAgOSB9IH0KKyNkZWZpbmUgR1JQM2IJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDEwIH0gfQorI2RlZmluZSBHUlAzUwkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMTEgfSB9CisjZGVmaW5lIEdSUDQJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDEyIH0gfQorI2RlZmluZSBHUlA1CSAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAxMyB9IH0KKyNkZWZpbmUgR1JQNgkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMTQgfSB9CisjZGVmaW5lIEdSUDcJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDE1IH0gfQorI2RlZmluZSBHUlA4CSAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAxNiB9IH0KKyNkZWZpbmUgR1JQOQkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMTcgfSB9CisjZGVmaW5lIEdSUDExX0M2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDE4IH0gfQorI2RlZmluZSBHUlAxMV9DNyAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAxOSB9IH0KKyNkZWZpbmUgR1JQMTIJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDIwIH0gfQorI2RlZmluZSBHUlAxMwkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMjEgfSB9CisjZGVmaW5lIEdSUDE0CSAgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAyMiB9IH0KKyNkZWZpbmUgR1JQMTUJICBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDIzIH0gfQorI2RlZmluZSBHUlAxNgkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMjQgfSB9CisjZGVmaW5lIEdSUEFNRAkgIE5VTEwsIHsgeyBOVUxMLCBVU0VfR1JPVVBTIH0sIHsgTlVMTCwgMjUgfSB9CisjZGVmaW5lIEdSUFBBRExDSzEgTlVMTCwgeyB7IE5VTEwsIFVTRV9HUk9VUFMgfSwgeyBOVUxMLCAyNiB9IH0KKyNkZWZpbmUgR1JQUEFETENLMiBOVUxMLCB7IHsgTlVMTCwgVVNFX0dST1VQUyB9LCB7IE5VTEwsIDI3IH0gfQorCisjZGVmaW5lIFBSRUdSUDAgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDAgfSB9CisjZGVmaW5lIFBSRUdSUDEgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDEgfSB9CisjZGVmaW5lIFBSRUdSUDIgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDIgfSB9CisjZGVmaW5lIFBSRUdSUDMgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDMgfSB9CisjZGVmaW5lIFBSRUdSUDQgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDQgfSB9CisjZGVmaW5lIFBSRUdSUDUgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDUgfSB9CisjZGVmaW5lIFBSRUdSUDYgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDYgfSB9CisjZGVmaW5lIFBSRUdSUDcgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDcgfSB9CisjZGVmaW5lIFBSRUdSUDggICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDggfSB9CisjZGVmaW5lIFBSRUdSUDkgICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgIDkgfSB9CisjZGVmaW5lIFBSRUdSUDEwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTAgfSB9CisjZGVmaW5lIFBSRUdSUDExICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTEgfSB9CisjZGVmaW5lIFBSRUdSUDEyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTIgfSB9CisjZGVmaW5lIFBSRUdSUDEzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTMgfSB9CisjZGVmaW5lIFBSRUdSUDE0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTQgfSB9CisjZGVmaW5lIFBSRUdSUDE1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTUgfSB9CisjZGVmaW5lIFBSRUdSUDE2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTYgfSB9CisjZGVmaW5lIFBSRUdSUDE3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTcgfSB9CisjZGVmaW5lIFBSRUdSUDE4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTggfSB9CisjZGVmaW5lIFBSRUdSUDE5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTkgfSB9CisjZGVmaW5lIFBSRUdSUDIwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjAgfSB9CisjZGVmaW5lIFBSRUdSUDIxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjEgfSB9CisjZGVmaW5lIFBSRUdSUDIyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjIgfSB9CisjZGVmaW5lIFBSRUdSUDIzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjMgfSB9CisjZGVmaW5lIFBSRUdSUDI0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjQgfSB9CisjZGVmaW5lIFBSRUdSUDI1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjUgfSB9CisjZGVmaW5lIFBSRUdSUDI2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjYgfSB9CisjZGVmaW5lIFBSRUdSUDI3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjcgfSB9CisjZGVmaW5lIFBSRUdSUDI4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjggfSB9CisjZGVmaW5lIFBSRUdSUDI5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMjkgfSB9CisjZGVmaW5lIFBSRUdSUDMwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzAgfSB9CisjZGVmaW5lIFBSRUdSUDMxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzEgfSB9CisjZGVmaW5lIFBSRUdSUDMyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzIgfSB9CisjZGVmaW5lIFBSRUdSUDMzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzMgfSB9CisjZGVmaW5lIFBSRUdSUDM0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzQgfSB9CisjZGVmaW5lIFBSRUdSUDM1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzUgfSB9CisjZGVmaW5lIFBSRUdSUDM2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzYgfSB9CisjZGVmaW5lIFBSRUdSUDM3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzcgfSB9CisjZGVmaW5lIFBSRUdSUDM4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzggfSB9CisjZGVmaW5lIFBSRUdSUDM5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMzkgfSB9CisjZGVmaW5lIFBSRUdSUDQwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDAgfSB9CisjZGVmaW5lIFBSRUdSUDQxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDEgfSB9CisjZGVmaW5lIFBSRUdSUDQyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDIgfSB9CisjZGVmaW5lIFBSRUdSUDQzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDMgfSB9CisjZGVmaW5lIFBSRUdSUDQ0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDQgfSB9CisjZGVmaW5lIFBSRUdSUDQ1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDUgfSB9CisjZGVmaW5lIFBSRUdSUDQ2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDYgfSB9CisjZGVmaW5lIFBSRUdSUDQ3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDcgfSB9CisjZGVmaW5lIFBSRUdSUDQ4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDggfSB9CisjZGVmaW5lIFBSRUdSUDQ5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNDkgfSB9CisjZGVmaW5lIFBSRUdSUDUwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTAgfSB9CisjZGVmaW5lIFBSRUdSUDUxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTEgfSB9CisjZGVmaW5lIFBSRUdSUDUyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTIgfSB9CisjZGVmaW5lIFBSRUdSUDUzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTMgfSB9CisjZGVmaW5lIFBSRUdSUDU0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTQgfSB9CisjZGVmaW5lIFBSRUdSUDU1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTUgfSB9CisjZGVmaW5lIFBSRUdSUDU2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTYgfSB9CisjZGVmaW5lIFBSRUdSUDU3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTcgfSB9CisjZGVmaW5lIFBSRUdSUDU4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTggfSB9CisjZGVmaW5lIFBSRUdSUDU5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNTkgfSB9CisjZGVmaW5lIFBSRUdSUDYwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjAgfSB9CisjZGVmaW5lIFBSRUdSUDYxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjEgfSB9CisjZGVmaW5lIFBSRUdSUDYyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjIgfSB9CisjZGVmaW5lIFBSRUdSUDYzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjMgfSB9CisjZGVmaW5lIFBSRUdSUDY0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjQgfSB9CisjZGVmaW5lIFBSRUdSUDY1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjUgfSB9CisjZGVmaW5lIFBSRUdSUDY2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjYgfSB9CisjZGVmaW5lIFBSRUdSUDY3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjcgfSB9CisjZGVmaW5lIFBSRUdSUDY4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjggfSB9CisjZGVmaW5lIFBSRUdSUDY5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNjkgfSB9CisjZGVmaW5lIFBSRUdSUDcwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzAgfSB9CisjZGVmaW5lIFBSRUdSUDcxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzEgfSB9CisjZGVmaW5lIFBSRUdSUDcyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzIgfSB9CisjZGVmaW5lIFBSRUdSUDczICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzMgfSB9CisjZGVmaW5lIFBSRUdSUDc0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzQgfSB9CisjZGVmaW5lIFBSRUdSUDc1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzUgfSB9CisjZGVmaW5lIFBSRUdSUDc2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzYgfSB9CisjZGVmaW5lIFBSRUdSUDc3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzcgfSB9CisjZGVmaW5lIFBSRUdSUDc4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzggfSB9CisjZGVmaW5lIFBSRUdSUDc5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgNzkgfSB9CisjZGVmaW5lIFBSRUdSUDgwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODAgfSB9CisjZGVmaW5lIFBSRUdSUDgxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODEgfSB9CisjZGVmaW5lIFBSRUdSUDgyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODIgfSB9CisjZGVmaW5lIFBSRUdSUDgzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODMgfSB9CisjZGVmaW5lIFBSRUdSUDg0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODQgfSB9CisjZGVmaW5lIFBSRUdSUDg1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODUgfSB9CisjZGVmaW5lIFBSRUdSUDg2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODYgfSB9CisjZGVmaW5lIFBSRUdSUDg3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODcgfSB9CisjZGVmaW5lIFBSRUdSUDg4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODggfSB9CisjZGVmaW5lIFBSRUdSUDg5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgODkgfSB9CisjZGVmaW5lIFBSRUdSUDkwICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTAgfSB9CisjZGVmaW5lIFBSRUdSUDkxICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTEgfSB9CisjZGVmaW5lIFBSRUdSUDkyICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTIgfSB9CisjZGVmaW5lIFBSRUdSUDkzICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTMgfSB9CisjZGVmaW5lIFBSRUdSUDk0ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTQgfSB9CisjZGVmaW5lIFBSRUdSUDk1ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTUgfSB9CisjZGVmaW5lIFBSRUdSUDk2ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTYgfSB9CisjZGVmaW5lIFBSRUdSUDk3ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTcgfSB9CisjZGVmaW5lIFBSRUdSUDk4ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTggfSB9CisjZGVmaW5lIFBSRUdSUDk5ICBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgOTkgfSB9CisjZGVmaW5lIFBSRUdSUDEwMCBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTAwIH0gfQorI2RlZmluZSBQUkVHUlAxMDEgTlVMTCwgeyB7IE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSB9LCB7IE5VTEwsIDEwMSB9IH0KKyNkZWZpbmUgUFJFR1JQMTAyIE5VTEwsIHsgeyBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUgfSwgeyBOVUxMLCAxMDIgfSB9CisjZGVmaW5lIFBSRUdSUDEwMyBOVUxMLCB7IHsgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIH0sIHsgTlVMTCwgMTAzIH0gfQorI2RlZmluZSBQUkVHUlAxMDQgTlVMTCwgeyB7IE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRSB9LCB7IE5VTEwsIDEwNCB9IH0KKworCisjZGVmaW5lIFg4Nl82NF8wICBOVUxMLCB7IHsgTlVMTCwgWDg2XzY0X1NQRUNJQUwgfSwgeyBOVUxMLCAwIH0gfQorI2RlZmluZSBYODZfNjRfMSAgTlVMTCwgeyB7IE5VTEwsIFg4Nl82NF9TUEVDSUFMIH0sIHsgTlVMTCwgMSB9IH0KKyNkZWZpbmUgWDg2XzY0XzIgIE5VTEwsIHsgeyBOVUxMLCBYODZfNjRfU1BFQ0lBTCB9LCB7IE5VTEwsIDIgfSB9CisjZGVmaW5lIFg4Nl82NF8zICBOVUxMLCB7IHsgTlVMTCwgWDg2XzY0X1NQRUNJQUwgfSwgeyBOVUxMLCAzIH0gfQorCisjZGVmaW5lIFRIUkVFX0JZVEVfMCBOVUxMLCB7IHsgTlVMTCwgSVNfM0JZVEVfT1BDT0RFIH0sIHsgTlVMTCwgMCB9IH0KKyNkZWZpbmUgVEhSRUVfQllURV8xIE5VTEwsIHsgeyBOVUxMLCBJU18zQllURV9PUENPREUgfSwgeyBOVUxMLCAxIH0gfQorCit0eXBlZGVmIHZvaWQgKCpvcF9ydG4pIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZyk7CisKK3N0cnVjdCBkaXMzODYgeworICBjb25zdCBjaGFyICpuYW1lOworICBzdHJ1Y3QKKyAgICB7CisgICAgICBvcF9ydG4gcnRuOworICAgICAgaW50IGJ5dGVtb2RlOworICAgIH0gb3BbTUFYX09QRVJBTkRTXTsKK307CisKKy8qIFVwcGVyIGNhc2UgbGV0dGVycyBpbiB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaGVyZSBhcmUgbWFjcm9zLgorICAgJ0EnID0+IHByaW50ICdiJyBpZiBubyByZWdpc3RlciBvcGVyYW5kcyBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKKyAgICdCJyA9PiBwcmludCAnYicgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnQycgPT4gcHJpbnQgJ3MnIG9yICdsJyAoJ3cnIG9yICdkJyBpbiBJbnRlbCBtb2RlKSBkZXBlbmRpbmcgb24gb3BlcmFuZAorICAgLiAgICAgIHNpemUgcHJlZml4CisgICAnRCcgPT4gcHJpbnQgJ3cnIGlmIG5vIHJlZ2lzdGVyIG9wZXJhbmRzIG9yICd3JywgJ2wnIG9yICdxJywgaWYKKyAgIC4gICAgICBzdWZmaXhfYWx3YXlzIGlzIHRydWUKKyAgICdFJyA9PiBwcmludCAnZScgaWYgMzItYml0IGZvcm0gb2YgamN4egorICAgJ0YnID0+IHByaW50ICd3JyBvciAnbCcgZGVwZW5kaW5nIG9uIGFkZHJlc3Mgc2l6ZSBwcmVmaXggKGxvb3AgaW5zbnMpCisgICAnRycgPT4gcHJpbnQgJ3cnIG9yICdsJyBkZXBlbmRpbmcgb24gb3BlcmFuZCBzaXplIHByZWZpeCAoaS9vIGluc25zKQorICAgJ0gnID0+IHByaW50ICIscHQiIG9yICIscG4iIGJyYW5jaCBoaW50CisgICAnSScgPT4gaG9ub3IgZm9sbG93aW5nIG1hY3JvIGxldHRlciBldmVuIGluIEludGVsIG1vZGUgKGltcGxlbWVudGVkIG9ubHkKKyAgIC4gICAgICBmb3Igc29tZSBvZiB0aGUgbWFjcm8gbGV0dGVycykKKyAgICdKJyA9PiBwcmludCAnbCcKKyAgICdLJyA9PiBwcmludCAnZCcgb3IgJ3EnIGlmIHJleCBwcmVmaXggaXMgcHJlc2VudC4KKyAgICdMJyA9PiBwcmludCAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCisgICAnTicgPT4gcHJpbnQgJ24nIGlmIGluc3RydWN0aW9uIGhhcyBubyB3YWl0ICJwcmVmaXgiCisgICAnTycgPT4gcHJpbnQgJ2QnIG9yICdvJyAob3IgJ3EnIGluIEludGVsIG1vZGUpCisgICAnUCcgPT4gcHJpbnQgJ3cnLCAnbCcgb3IgJ3EnIGlmIGluc3RydWN0aW9uIGhhcyBhbiBvcGVyYW5kIHNpemUgcHJlZml4LAorICAgLiAgICAgIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZS4gIHByaW50ICdxJyBpZiByZXggcHJlZml4IGlzIHByZXNlbnQuCisgICAnUScgPT4gcHJpbnQgJ3cnLCAnbCcgb3IgJ3EnIGlmIG5vIHJlZ2lzdGVyIG9wZXJhbmRzIG9yIHN1ZmZpeF9hbHdheXMKKyAgIC4gICAgICBpcyB0cnVlCisgICAnUicgPT4gcHJpbnQgJ3cnLCAnbCcgb3IgJ3EnICgnZCcgZm9yICdsJyBhbmQgJ2UnIGluIEludGVsIG1vZGUpCisgICAnUycgPT4gcHJpbnQgJ3cnLCAnbCcgb3IgJ3EnIGlmIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQorICAgJ1QnID0+IHByaW50ICdxJyBpbiA2NGJpdCBtb2RlIGFuZCBiZWhhdmUgYXMgJ1AnIG90aGVyd2lzZQorICAgJ1UnID0+IHByaW50ICdxJyBpbiA2NGJpdCBtb2RlIGFuZCBiZWhhdmUgYXMgJ1EnIG90aGVyd2lzZQorICAgJ1YnID0+IHByaW50ICdxJyBpbiA2NGJpdCBtb2RlIGFuZCBiZWhhdmUgYXMgJ1MnIG90aGVyd2lzZQorICAgJ1cnID0+IHByaW50ICdiJywgJ3cnIG9yICdsJyAoJ2QnIGluIEludGVsIG1vZGUpCisgICAnWCcgPT4gcHJpbnQgJ3MnLCAnZCcgZGVwZW5kaW5nIG9uIGRhdGExNiBwcmVmaXggKGZvciBYTU0pCisgICAnWScgPT4gJ3EnIGlmIGluc3RydWN0aW9uIGhhcyBhbiBSRVggNjRiaXQgb3ZlcndyaXRlIHByZWZpeAorICAgJ1onID0+IHByaW50ICdxJyBpbiA2NGJpdCBtb2RlIGFuZCBiZWhhdmUgYXMgJ0wnIG90aGVyd2lzZQorCisgICBNYW55IG9mIHRoZSBhYm92ZSBsZXR0ZXJzIHByaW50IG5vdGhpbmcgaW4gSW50ZWwgbW9kZS4gIFNlZSAicHV0b3AiCisgICBmb3IgdGhlIGRldGFpbHMuCisKKyAgIEJyYWNlcyAneycgYW5kICd9JywgYW5kIHZlcnRpY2FsIGJhcnMgJ3wnLCBpbmRpY2F0ZSBhbHRlcm5hdGl2ZQorICAgbW5lbW9uaWMgc3RyaW5ncyBmb3IgQVQmVCwgSW50ZWwsIFg4Nl82NCBBVCZULCBhbmQgWDg2XzY0IEludGVsCisgICBtb2Rlcy4gIEluIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHR3byBhbHRlcm5hdGl2ZXMsIHRoZSBYODZfNjQKKyAgIGluc3RydWN0aW9uIGlzIHJlc2VydmVkLCBhbmQgIihiYWQpIiBpcyBwcmludGVkLgorKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2W10gPSB7CisgIC8qIDAwICovCisgIHsgImFkZEIiLAkJeyBFYiwgR2IgfSB9LAorICB7ICJhZGRTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAiYWRkQiIsCQl7IEdiLCBFYiB9IH0sCisgIHsgImFkZFMiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJhZGRCIiwJCXsgQUwsIEliIH0gfSwKKyAgeyAiYWRkUyIsCQl7IGVBWCwgSXYgfSB9LAorICB7ICJwdXNoe1R8fSIsCQl7IGVzIH0gfSwKKyAgeyAicG9we1R8fSIsCQl7IGVzIH0gfSwKKyAgLyogMDggKi8KKyAgeyAib3JCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAib3JTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAib3JCIiwJCXsgR2IsIEViIH0gfSwKKyAgeyAib3JTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAib3JCIiwJCXsgQUwsIEliIH0gfSwKKyAgeyAib3JTIiwJCXsgZUFYLCBJdiB9IH0sCisgIHsgInB1c2h7VHx9IiwJCXsgY3MgfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwJLyogMHgwZiBleHRlbmRlZCBvcGNvZGUgZXNjYXBlICovCisgIC8qIDEwICovCisgIHsgImFkY0IiLAkJeyBFYiwgR2IgfSB9LAorICB7ICJhZGNTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAiYWRjQiIsCQl7IEdiLCBFYiB9IH0sCisgIHsgImFkY1MiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJhZGNCIiwJCXsgQUwsIEliIH0gfSwKKyAgeyAiYWRjUyIsCQl7IGVBWCwgSXYgfSB9LAorICB7ICJwdXNoe1R8fSIsCQl7IHNzIH0gfSwKKyAgeyAicG9we1R8fSIsCQl7IHNzIH0gfSwKKyAgLyogMTggKi8KKyAgeyAic2JiQiIsCQl7IEViLCBHYiB9IH0sCisgIHsgInNiYlMiLAkJeyBFdiwgR3YgfSB9LAorICB7ICJzYmJCIiwJCXsgR2IsIEViIH0gfSwKKyAgeyAic2JiUyIsCQl7IEd2LCBFdiB9IH0sCisgIHsgInNiYkIiLAkJeyBBTCwgSWIgfSB9LAorICB7ICJzYmJTIiwJCXsgZUFYLCBJdiB9IH0sCisgIHsgInB1c2h7VHx9IiwJCXsgZHMgfSB9LAorICB7ICJwb3B7VHx9IiwJCXsgZHMgfSB9LAorICAvKiAyMCAqLworICB7ICJhbmRCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAiYW5kUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgImFuZEIiLAkJeyBHYiwgRWIgfSB9LAorICB7ICJhbmRTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiYW5kQiIsCQl7IEFMLCBJYiB9IH0sCisgIHsgImFuZFMiLAkJeyBlQVgsIEl2IH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIFNFRyBFUyBwcmVmaXggKi8KKyAgeyAiZGFhe3x9IiwJCXsgWFggfSB9LAorICAvKiAyOCAqLworICB7ICJzdWJCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAic3ViUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgInN1YkIiLAkJeyBHYiwgRWIgfSB9LAorICB7ICJzdWJTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAic3ViQiIsCQl7IEFMLCBJYiB9IH0sCisgIHsgInN1YlMiLAkJeyBlQVgsIEl2IH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIFNFRyBDUyBwcmVmaXggKi8KKyAgeyAiZGFze3x9IiwJCXsgWFggfSB9LAorICAvKiAzMCAqLworICB7ICJ4b3JCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAieG9yUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgInhvckIiLAkJeyBHYiwgRWIgfSB9LAorICB7ICJ4b3JTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAieG9yQiIsCQl7IEFMLCBJYiB9IH0sCisgIHsgInhvclMiLAkJeyBlQVgsIEl2IH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIFNFRyBTUyBwcmVmaXggKi8KKyAgeyAiYWFhe3x9IiwJCXsgWFggfSB9LAorICAvKiAzOCAqLworICB7ICJjbXBCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAiY21wUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgImNtcEIiLAkJeyBHYiwgRWIgfSB9LAorICB7ICJjbXBTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21wQiIsCQl7IEFMLCBJYiB9IH0sCisgIHsgImNtcFMiLAkJeyBlQVgsIEl2IH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIFNFRyBEUyBwcmVmaXggKi8KKyAgeyAiYWFze3x9IiwJCXsgWFggfSB9LAorICAvKiA0MCAqLworICB7ICJpbmN7U3x9IiwJCXsgUk1lQVggfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lQ1ggfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lRFggfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lQlggfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lU1AgfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lQlAgfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lU0kgfSB9LAorICB7ICJpbmN7U3x9IiwJCXsgUk1lREkgfSB9LAorICAvKiA0OCAqLworICB7ICJkZWN7U3x9IiwJCXsgUk1lQVggfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lQ1ggfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lRFggfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lQlggfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lU1AgfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lQlAgfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lU0kgfSB9LAorICB7ICJkZWN7U3x9IiwJCXsgUk1lREkgfSB9LAorICAvKiA1MCAqLworICB7ICJwdXNoViIsCQl7IFJNckFYIH0gfSwKKyAgeyAicHVzaFYiLAkJeyBSTXJDWCB9IH0sCisgIHsgInB1c2hWIiwJCXsgUk1yRFggfSB9LAorICB7ICJwdXNoViIsCQl7IFJNckJYIH0gfSwKKyAgeyAicHVzaFYiLAkJeyBSTXJTUCB9IH0sCisgIHsgInB1c2hWIiwJCXsgUk1yQlAgfSB9LAorICB7ICJwdXNoViIsCQl7IFJNclNJIH0gfSwKKyAgeyAicHVzaFYiLAkJeyBSTXJESSB9IH0sCisgIC8qIDU4ICovCisgIHsgInBvcFYiLAkJeyBSTXJBWCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJDWCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJEWCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJCWCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJTUCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJCUCB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJTSSB9IH0sCisgIHsgInBvcFYiLAkJeyBSTXJESSB9IH0sCisgIC8qIDYwICovCisgIHsgWDg2XzY0XzAgfSwKKyAgeyBYODZfNjRfMSB9LAorICB7IFg4Nl82NF8yIH0sCisgIHsgWDg2XzY0XzMgfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIHNlZyBmcyAqLworICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwJLyogc2VnIGdzICovCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAkvKiBvcCBzaXplIHByZWZpeCAqLworICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwJLyogYWRyIHNpemUgcHJlZml4ICovCisgIC8qIDY4ICovCisgIHsgInB1c2hUIiwJCXsgSXEgfSB9LAorICB7ICJpbXVsUyIsCQl7IEd2LCBFdiwgSXYgfSB9LAorICB7ICJwdXNoVCIsCQl7IHNJYiB9IH0sCisgIHsgImltdWxTIiwJCXsgR3YsIEV2LCBzSWIgfSB9LAorICB7ICJpbnN7Ynx8Ynx9IiwJeyBZYnIsIGluZGlyRFggfSB9LAorICB7ICJpbnN7Unx8R3x9IiwJeyBZenIsIGluZGlyRFggfSB9LAorICB7ICJvdXRze2J8fGJ8fSIsCXsgaW5kaXJEWHIsIFhiIH0gfSwKKyAgeyAib3V0c3tSfHxHfH0iLAl7IGluZGlyRFhyLCBYeiB9IH0sCisgIC8qIDcwICovCisgIHsgImpvSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbm9IIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpiSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqYWVIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImplSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbmVIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpiZUgiLAkJeyBKYiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiamFIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIC8qIDc4ICovCisgIHsgImpzSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbnNIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpwSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbnBIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpsSCIsCQl7IEpiLCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqZ2VIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpsZUgiLAkJeyBKYiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiamdIIiwJCXsgSmIsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIC8qIDgwICovCisgIHsgR1JQMWIgfSwKKyAgeyBHUlAxUyB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyBHUlAxU3MgfSwKKyAgeyAidGVzdEIiLAkJeyBFYiwgR2IgfSB9LAorICB7ICJ0ZXN0UyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgInhjaGdCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBFdiwgR3YgfSB9LAorICAvKiA4OCAqLworICB7ICJtb3ZCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAibW92UyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgIm1vdkIiLAkJeyBHYiwgRWIgfSB9LAorICB7ICJtb3ZTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAibW92RCIsCQl7IFN2LCBTdyB9IH0sCisgIHsgImxlYVMiLAkJeyBHdiwgTSB9IH0sCisgIHsgIm1vdkQiLAkJeyBTdywgU3YgfSB9LAorICB7IEdSUDFhIH0sCisgIC8qIDkwICovCisgIHsgUFJFR1JQMzggfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVDWCwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVEWCwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVCWCwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVTUCwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVCUCwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVTSSwgZUFYIH0gfSwKKyAgeyAieGNoZ1MiLAkJeyBSTWVESSwgZUFYIH0gfSwKKyAgLyogOTggKi8KKyAgeyAiY1d7dHx8dHx9UiIsCXsgWFggfSB9LAorICB7ICJjUnt0fHx0fH1PIiwJeyBYWCB9IH0sCisgIHsgIkpjYWxse1R8fSIsCXsgQXAgfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwJLyogZndhaXQgKi8KKyAgeyAicHVzaGZUIiwJCXsgWFggfSB9LAorICB7ICJwb3BmVCIsCQl7IFhYIH0gfSwKKyAgeyAic2FoZnt8fSIsCQl7IFhYIH0gfSwKKyAgeyAibGFoZnt8fSIsCQl7IFhYIH0gfSwKKyAgLyogYTAgKi8KKyAgeyAibW92QiIsCQl7IEFMLCBPYiB9IH0sCisgIHsgIm1vdlMiLAkJeyBlQVgsIE92IH0gfSwKKyAgeyAibW92QiIsCQl7IE9iLCBBTCB9IH0sCisgIHsgIm1vdlMiLAkJeyBPdiwgZUFYIH0gfSwKKyAgeyAibW92c3tifHxifH0iLAl7IFliciwgWGIgfSB9LAorICB7ICJtb3Zze1J8fFJ8fSIsCXsgWXZyLCBYdiB9IH0sCisgIHsgImNtcHN7Ynx8Ynx9IiwJeyBYYiwgWWIgfSB9LAorICB7ICJjbXBze1J8fFJ8fSIsCXsgWHYsIFl2IH0gfSwKKyAgLyogYTggKi8KKyAgeyAidGVzdEIiLAkJeyBBTCwgSWIgfSB9LAorICB7ICJ0ZXN0UyIsCQl7IGVBWCwgSXYgfSB9LAorICB7ICJzdG9zQiIsCQl7IFliciwgQUwgfSB9LAorICB7ICJzdG9zUyIsCQl7IFl2ciwgZUFYIH0gfSwKKyAgeyAibG9kc0IiLAkJeyBBTHIsIFhiIH0gfSwKKyAgeyAibG9kc1MiLAkJeyBlQVhyLCBYdiB9IH0sCisgIHsgInNjYXNCIiwJCXsgQUwsIFliIH0gfSwKKyAgeyAic2Nhc1MiLAkJeyBlQVgsIFl2IH0gfSwKKyAgLyogYjAgKi8KKyAgeyAibW92QiIsCQl7IFJNQUwsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNQ0wsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNREwsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNQkwsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNQUgsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNQ0gsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNREgsIEliIH0gfSwKKyAgeyAibW92QiIsCQl7IFJNQkgsIEliIH0gfSwKKyAgLyogYjggKi8KKyAgeyAibW92UyIsCQl7IFJNZUFYLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZUNYLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZURYLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZUJYLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZVNQLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZUJQLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZVNJLCBJdjY0IH0gfSwKKyAgeyAibW92UyIsCQl7IFJNZURJLCBJdjY0IH0gfSwKKyAgLyogYzAgKi8KKyAgeyBHUlAyYiB9LAorICB7IEdSUDJTIH0sCisgIHsgInJldFQiLAkJeyBJdyB9IH0sCisgIHsgInJldFQiLAkJeyBYWCB9IH0sCisgIHsgImxlc3tTfH0iLAkJeyBHdiwgTXAgfSB9LAorICB7ICJsZHNTIiwJCXsgR3YsIE1wIH0gfSwKKyAgeyBHUlAxMV9DNiB9LAorICB7IEdSUDExX0M3IH0sCisgIC8qIGM4ICovCisgIHsgImVudGVyVCIsCQl7IEl3LCBJYiB9IH0sCisgIHsgImxlYXZlVCIsCQl7IFhYIH0gfSwKKyAgeyAibHJldFAiLAkJeyBJdyB9IH0sCisgIHsgImxyZXRQIiwJCXsgWFggfSB9LAorICB7ICJpbnQzIiwJCXsgWFggfSB9LAorICB7ICJpbnQiLAkJeyBJYiB9IH0sCisgIHsgImludG97fH0iLAkJeyBYWCB9IH0sCisgIHsgImlyZXRQIiwJCXsgWFggfSB9LAorICAvKiBkMCAqLworICB7IEdSUDJiX29uZSB9LAorICB7IEdSUDJTX29uZSB9LAorICB7IEdSUDJiX2NsIH0sCisgIHsgR1JQMlNfY2wgfSwKKyAgeyAiYWFte3x9IiwJCXsgc0liIH0gfSwKKyAgeyAiYWFke3x9IiwJCXsgc0liIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIHsgInhsYXQiLAkJeyBEU0JYIH0gfSwKKyAgLyogZDggKi8KKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIHsgRkxPQVQgfSwKKyAgeyBGTE9BVCB9LAorICB7IEZMT0FUIH0sCisgIC8qIGUwICovCisgIHsgImxvb3BuZUZIIiwJCXsgSmIsIFhYLCBsb29wX2pjeHpfZmxhZyB9IH0sCisgIHsgImxvb3BlRkgiLAkJeyBKYiwgWFgsIGxvb3BfamN4el9mbGFnIH0gfSwKKyAgeyAibG9vcEZIIiwJCXsgSmIsIFhYLCBsb29wX2pjeHpfZmxhZyB9IH0sCisgIHsgImpFY3h6SCIsCQl7IEpiLCBYWCwgbG9vcF9qY3h6X2ZsYWcgfSB9LAorICB7ICJpbkIiLAkJeyBBTCwgSWIgfSB9LAorICB7ICJpbkciLAkJeyB6QVgsIEliIH0gfSwKKyAgeyAib3V0QiIsCQl7IEliLCBBTCB9IH0sCisgIHsgIm91dEciLAkJeyBJYiwgekFYIH0gfSwKKyAgLyogZTggKi8KKyAgeyAiY2FsbFQiLAkJeyBKdiB9IH0sCisgIHsgImptcFQiLAkJeyBKdiB9IH0sCisgIHsgIkpqbXB7VHx9IiwJCXsgQXAgfSB9LAorICB7ICJqbXAiLAkJeyBKYiB9IH0sCisgIHsgImluQiIsCQl7IEFMLCBpbmRpckRYIH0gfSwKKyAgeyAiaW5HIiwJCXsgekFYLCBpbmRpckRYIH0gfSwKKyAgeyAib3V0QiIsCQl7IGluZGlyRFgsIEFMIH0gfSwKKyAgeyAib3V0RyIsCQl7IGluZGlyRFgsIHpBWCB9IH0sCisgIC8qIGYwICovCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAkvKiBsb2NrIHByZWZpeCAqLworICB7ICJpY2VicCIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCS8qIHJlcG5lICovCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAkvKiByZXB6ICovCisgIHsgImhsdCIsCQl7IFhYIH0gfSwKKyAgeyAiY21jIiwJCXsgWFggfSB9LAorICB7IEdSUDNiIH0sCisgIHsgR1JQM1MgfSwKKyAgLyogZjggKi8KKyAgeyAiY2xjIiwJCXsgWFggfSB9LAorICB7ICJzdGMiLAkJeyBYWCB9IH0sCisgIHsgImNsaSIsCQl7IFhYIH0gfSwKKyAgeyAic3RpIiwJCXsgWFggfSB9LAorICB7ICJjbGQiLAkJeyBYWCB9IH0sCisgIHsgInN0ZCIsCQl7IFhYIH0gfSwKKyAgeyBHUlA0IH0sCisgIHsgR1JQNSB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVbXSA9IHsKKyAgLyogMDAgKi8KKyAgeyBHUlA2IH0sCisgIHsgR1JQNyB9LAorICB7ICJsYXJTIiwJCXsgR3YsIEV3IH0gfSwKKyAgeyAibHNsUyIsCQl7IEd2LCBFdyB9IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICJzeXNjYWxsIiwJCXsgWFggfSB9LAorICB7ICJjbHRzIiwJCXsgWFggfSB9LAorICB7ICJzeXNyZXRQIiwJCXsgWFggfSB9LAorICAvKiAwOCAqLworICB7ICJpbnZkIiwJCXsgWFggfSB9LAorICB7ICJ3YmludmQiLAkJeyBYWCB9IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICJ1ZDJhIiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyBHUlBBTUQgfSwKKyAgeyAiZmVtbXMiLAkJeyBYWCB9IH0sCisgIHsgIiIsCQkJeyBNWCwgRU0sIE9QU1VGIH0gfSwgLyogU2VlIE9QXzNETm93U3VmZml4LiAgKi8KKyAgLyogMTAgKi8KKyAgeyBQUkVHUlA4IH0sCisgIHsgUFJFR1JQOSB9LAorICB7IFBSRUdSUDMwIH0sCisgIHsgIm1vdmxwWCIsCQl7IEVYcSwgWE0sIHsgU0lNRF9GaXh1cCwgJ2gnIH0gfSB9LAorICB7ICJ1bnBja2xwWCIsCQl7IFhNLCBFWHEgfSB9LAorICB7ICJ1bnBja2hwWCIsCQl7IFhNLCBFWHEgfSB9LAorICB7IFBSRUdSUDMxIH0sCisgIHsgIm1vdmhwWCIsCQl7IEVYcSwgWE0sIHsgU0lNRF9GaXh1cCwgJ2wnIH0gfSB9LAorICAvKiAxOCAqLworICB7IEdSUDE2IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIHsgIm5vcFEiLAkJeyBFdiB9IH0sCisgIC8qIDIwICovCisgIHsgIm1vdloiLAkJeyBSbSwgQ20gfSB9LAorICB7ICJtb3ZaIiwJCXsgUm0sIERtIH0gfSwKKyAgeyAibW92WiIsCQl7IENtLCBSbSB9IH0sCisgIHsgIm1vdloiLAkJeyBEbSwgUm0gfSB9LAorICB7ICJtb3ZMIiwJCXsgUmQsIFRkIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIHsgIm1vdkwiLAkJeyBUZCwgUmQgfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgLyogMjggKi8KKyAgeyAibW92YXBYIiwJCXsgWE0sIEVYeCB9IH0sCisgIHsgIm1vdmFwWCIsCQl7IEVYeCwgIFhNIH0gfSwKKyAgeyBQUkVHUlAyIH0sCisgIHsgUFJFR1JQMzMgfSwKKyAgeyBQUkVHUlA0IH0sCisgIHsgUFJFR1JQMyB9LAorICB7IFBSRUdSUDkzIH0sCisgIHsgUFJFR1JQOTQgfSwKKyAgLyogMzAgKi8KKyAgeyAid3Jtc3IiLAkJeyBYWCB9IH0sCisgIHsgInJkdHNjIiwJCXsgWFggfSB9LAorICB7ICJyZG1zciIsCQl7IFhYIH0gfSwKKyAgeyAicmRwbWMiLAkJeyBYWCB9IH0sCisgIHsgInN5c2VudGVyIiwJCXsgWFggfSB9LAorICB7ICJzeXNleGl0IiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIC8qIDM4ICovCisgIHsgVEhSRUVfQllURV8wIH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7IFRIUkVFX0JZVEVfMSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIC8qIDQwICovCisgIHsgImNtb3ZvIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21vdm5vIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21vdmIiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJjbW92YWUiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJjbW92ZSIsCQl7IEd2LCBFdiB9IH0sCisgIHsgImNtb3ZuZSIsCQl7IEd2LCBFdiB9IH0sCisgIHsgImNtb3ZiZSIsCQl7IEd2LCBFdiB9IH0sCisgIHsgImNtb3ZhIiwJCXsgR3YsIEV2IH0gfSwKKyAgLyogNDggKi8KKyAgeyAiY21vdnMiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJjbW92bnMiLAkJeyBHdiwgRXYgfSB9LAorICB7ICJjbW92cCIsCQl7IEd2LCBFdiB9IH0sCisgIHsgImNtb3ZucCIsCQl7IEd2LCBFdiB9IH0sCisgIHsgImNtb3ZsIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21vdmdlIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21vdmxlIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyAiY21vdmciLAkJeyBHdiwgRXYgfSB9LAorICAvKiA1MCAqLworICB7ICJtb3Ztc2twWCIsCQl7IEdkcSwgWFMgfSB9LAorICB7IFBSRUdSUDEzIH0sCisgIHsgUFJFR1JQMTIgfSwKKyAgeyBQUkVHUlAxMSB9LAorICB7ICJhbmRwWCIsCQl7IFhNLCBFWHggfSB9LAorICB7ICJhbmRucFgiLAkJeyBYTSwgRVh4IH0gfSwKKyAgeyAib3JwWCIsCQl7IFhNLCBFWHggfSB9LAorICB7ICJ4b3JwWCIsCQl7IFhNLCBFWHggfSB9LAorICAvKiA1OCAqLworICB7IFBSRUdSUDAgfSwKKyAgeyBQUkVHUlAxMCB9LAorICB7IFBSRUdSUDE3IH0sCisgIHsgUFJFR1JQMTYgfSwKKyAgeyBQUkVHUlAxNCB9LAorICB7IFBSRUdSUDcgfSwKKyAgeyBQUkVHUlA1IH0sCisgIHsgUFJFR1JQNiB9LAorICAvKiA2MCAqLworICB7IFBSRUdSUDk1IH0sCisgIHsgUFJFR1JQOTYgfSwKKyAgeyBQUkVHUlA5NyB9LAorICB7ICJwYWNrc3N3YiIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBjbXBndGIiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwY21wZ3R3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGNtcGd0ZCIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBhY2t1c3diIiwJCXsgTVgsIEVNIH0gfSwKKyAgLyogNjggKi8KKyAgeyAicHVucGNraGJ3IiwJeyBNWCwgRU0gfSB9LAorICB7ICJwdW5wY2tod2QiLAl7IE1YLCBFTSB9IH0sCisgIHsgInB1bnBja2hkcSIsCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFja3NzZHciLAkJeyBNWCwgRU0gfSB9LAorICB7IFBSRUdSUDI2IH0sCisgIHsgUFJFR1JQMjQgfSwKKyAgeyAibW92ZCIsCQl7IE1YLCBFZHEgfSB9LAorICB7IFBSRUdSUDE5IH0sCisgIC8qIDcwICovCisgIHsgUFJFR1JQMjIgfSwKKyAgeyBHUlAxMiB9LAorICB7IEdSUDEzIH0sCisgIHsgR1JQMTQgfSwKKyAgeyAicGNtcGVxYiIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBjbXBlcXciLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwY21wZXFkIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAiZW1tcyIsCQl7IFhYIH0gfSwKKyAgLyogNzggKi8KKyAgeyBQUkVHUlAzNCB9LAorICB7IFBSRUdSUDM1IH0sCisgIHsgIihiYWQpIiwJCXsgWFggfSB9LAorICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgeyBQUkVHUlAyOCB9LAorICB7IFBSRUdSUDI5IH0sCisgIHsgUFJFR1JQMjMgfSwKKyAgeyBQUkVHUlAyMCB9LAorICAvKiA4MCAqLworICB7ICJqb0giLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiam5vSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqYkgiLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiamFlSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqZUgiLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiam5lSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqYmVIIiwJCXsgSnYsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImphSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICAvKiA4OCAqLworICB7ICJqc0giLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiam5zSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqcEgiLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiam5wSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbEgiLAkJeyBKdiwgWFgsIGNvbmRfanVtcF9mbGFnIH0gfSwKKyAgeyAiamdlSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICB7ICJqbGVIIiwJCXsgSnYsIFhYLCBjb25kX2p1bXBfZmxhZyB9IH0sCisgIHsgImpnSCIsCQl7IEp2LCBYWCwgY29uZF9qdW1wX2ZsYWcgfSB9LAorICAvKiA5MCAqLworICB7ICJzZXRvIiwJCXsgRWIgfSB9LAorICB7ICJzZXRubyIsCQl7IEViIH0gfSwKKyAgeyAic2V0YiIsCQl7IEViIH0gfSwKKyAgeyAic2V0YWUiLAkJeyBFYiB9IH0sCisgIHsgInNldGUiLAkJeyBFYiB9IH0sCisgIHsgInNldG5lIiwJCXsgRWIgfSB9LAorICB7ICJzZXRiZSIsCQl7IEViIH0gfSwKKyAgeyAic2V0YSIsCQl7IEViIH0gfSwKKyAgLyogOTggKi8KKyAgeyAic2V0cyIsCQl7IEViIH0gfSwKKyAgeyAic2V0bnMiLAkJeyBFYiB9IH0sCisgIHsgInNldHAiLAkJeyBFYiB9IH0sCisgIHsgInNldG5wIiwJCXsgRWIgfSB9LAorICB7ICJzZXRsIiwJCXsgRWIgfSB9LAorICB7ICJzZXRnZSIsCQl7IEViIH0gfSwKKyAgeyAic2V0bGUiLAkJeyBFYiB9IH0sCisgIHsgInNldGciLAkJeyBFYiB9IH0sCisgIC8qIGEwICovCisgIHsgInB1c2hUIiwJCXsgZnMgfSB9LAorICB7ICJwb3BUIiwJCXsgZnMgfSB9LAorICB7ICJjcHVpZCIsCQl7IFhYIH0gfSwKKyAgeyAiYnRTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAic2hsZFMiLAkJeyBFdiwgR3YsIEliIH0gfSwKKyAgeyAic2hsZFMiLAkJeyBFdiwgR3YsIENMIH0gfSwKKyAgeyBHUlBQQURMQ0syIH0sCisgIHsgR1JQUEFETENLMSB9LAorICAvKiBhOCAqLworICB7ICJwdXNoVCIsCQl7IGdzIH0gfSwKKyAgeyAicG9wVCIsCQl7IGdzIH0gfSwKKyAgeyAicnNtIiwJCXsgWFggfSB9LAorICB7ICJidHNTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAic2hyZFMiLAkJeyBFdiwgR3YsIEliIH0gfSwKKyAgeyAic2hyZFMiLAkJeyBFdiwgR3YsIENMIH0gfSwKKyAgeyBHUlAxNSB9LAorICB7ICJpbXVsUyIsCQl7IEd2LCBFdiB9IH0sCisgIC8qIGIwICovCisgIHsgImNtcHhjaGdCIiwJCXsgRWIsIEdiIH0gfSwKKyAgeyAiY21weGNoZ1MiLAkJeyBFdiwgR3YgfSB9LAorICB7ICJsc3NTIiwJCXsgR3YsIE1wIH0gfSwKKyAgeyAiYnRyUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgImxmc1MiLAkJeyBHdiwgTXAgfSB9LAorICB7ICJsZ3NTIiwJCXsgR3YsIE1wIH0gfSwKKyAgeyAibW92entiUnx4fGJSfHh9IiwJeyBHdiwgRWIgfSB9LAorICB7ICJtb3Z6e3dSfHh8d1J8eH0iLAl7IEd2LCBFdyB9IH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnp3dyAhICovCisgIC8qIGI4ICovCisgIHsgUFJFR1JQMzcgfSwKKyAgeyAidWQyYiIsCQl7IFhYIH0gfSwKKyAgeyBHUlA4IH0sCisgIHsgImJ0Y1MiLAkJeyBFdiwgR3YgfSB9LAorICB7ICJic2ZTIiwJCXsgR3YsIEV2IH0gfSwKKyAgeyBQUkVHUlAzNiB9LAorICB7ICJtb3Zze2JSfHh8YlJ8eH0iLAl7IEd2LCBFYiB9IH0sCisgIHsgIm1vdnN7d1J8eHx3Unx4fSIsCXsgR3YsIEV3IH0gfSwgLyogeWVzLCB0aGVyZSByZWFsbHkgaXMgbW92c3d3ICEgKi8KKyAgLyogYzAgKi8KKyAgeyAieGFkZEIiLAkJeyBFYiwgR2IgfSB9LAorICB7ICJ4YWRkUyIsCQl7IEV2LCBHdiB9IH0sCisgIHsgUFJFR1JQMSB9LAorICB7ICJtb3ZudGlTIiwJCXsgRXYsIEd2IH0gfSwKKyAgeyAicGluc3J3IiwJCXsgTVgsIEVkcXcsIEliIH0gfSwKKyAgeyAicGV4dHJ3IiwJCXsgR2RxLCBNUywgSWIgfSB9LAorICB7ICJzaHVmcFgiLAkJeyBYTSwgRVh4LCBJYiB9IH0sCisgIHsgR1JQOSB9LAorICAvKiBjOCAqLworICB7ICJic3dhcCIsCQl7IFJNZUFYIH0gfSwKKyAgeyAiYnN3YXAiLAkJeyBSTWVDWCB9IH0sCisgIHsgImJzd2FwIiwJCXsgUk1lRFggfSB9LAorICB7ICJic3dhcCIsCQl7IFJNZUJYIH0gfSwKKyAgeyAiYnN3YXAiLAkJeyBSTWVTUCB9IH0sCisgIHsgImJzd2FwIiwJCXsgUk1lQlAgfSB9LAorICB7ICJic3dhcCIsCQl7IFJNZVNJIH0gfSwKKyAgeyAiYnN3YXAiLAkJeyBSTWVESSB9IH0sCisgIC8qIGQwICovCisgIHsgUFJFR1JQMjcgfSwKKyAgeyAicHNybHciLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwc3JsZCIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBzcmxxIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFkZHEiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwbXVsbHciLAkJeyBNWCwgRU0gfSB9LAorICB7IFBSRUdSUDIxIH0sCisgIHsgInBtb3Ztc2tiIiwJCXsgR2RxLCBNUyB9IH0sCisgIC8qIGQ4ICovCisgIHsgInBzdWJ1c2IiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwc3VidXN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG1pbnViIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFuZCIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBhZGR1c2IiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwYWRkdXN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG1heHViIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFuZG4iLAkJeyBNWCwgRU0gfSB9LAorICAvKiBlMCAqLworICB7ICJwYXZnYiIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBzcmF3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicHNyYWQiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwYXZndyIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBtdWxodXciLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwbXVsaHciLAkJeyBNWCwgRU0gfSB9LAorICB7IFBSRUdSUDE1IH0sCisgIHsgUFJFR1JQMjUgfSwKKyAgLyogZTggKi8KKyAgeyAicHN1YnNiIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicHN1YnN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG1pbnN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG9yIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFkZHNiIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFkZHN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG1heHN3IiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicHhvciIsCQl7IE1YLCBFTSB9IH0sCisgIC8qIGYwICovCisgIHsgUFJFR1JQMzIgfSwKKyAgeyAicHNsbHciLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwc2xsZCIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBzbGxxIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicG11bHVkcSIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBtYWRkd2QiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwc2FkYnciLAkJeyBNWCwgRU0gfSB9LAorICB7IFBSRUdSUDE4IH0sCisgIC8qIGY4ICovCisgIHsgInBzdWJiIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicHN1YnciLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwc3ViZCIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBzdWJxIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAicGFkZGIiLAkJeyBNWCwgRU0gfSB9LAorICB7ICJwYWRkdyIsCQl7IE1YLCBFTSB9IH0sCisgIHsgInBhZGRkIiwJCXsgTVgsIEVNIH0gfSwKKyAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvbmVieXRlX2hhc19tb2RybVsyNTZdID0geworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAwMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAwMCAqLworICAvKiAxMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAxMCAqLworICAvKiAyMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAyMCAqLworICAvKiAzMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLCAvKiAzMCAqLworICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0MCAqLworICAvKiA1MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA1MCAqLworICAvKiA2MCAqLyAwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLCAvKiA2MCAqLworICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3MCAqLworICAvKiA4MCAqLyAxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLCAvKiA4MCAqLworICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5MCAqLworICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhMCAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiMCAqLworICAvKiBjMCAqLyAxLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLCAvKiBjMCAqLworICAvKiBkMCAqLyAxLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLCAvKiBkMCAqLworICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlMCAqLworICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMSwxICAvKiBmMCAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwgLyogMGYgKi8KKyAgLyogMTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMSwgLyogMWYgKi8KKyAgLyogMjAgKi8gMSwxLDEsMSwxLDAsMSwwLDEsMSwxLDEsMSwxLDEsMSwgLyogMmYgKi8KKyAgLyogMzAgKi8gMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwgLyogM2YgKi8KKyAgLyogNDAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogNGYgKi8KKyAgLyogNTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogNWYgKi8KKyAgLyogNjAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogNmYgKi8KKyAgLyogNzAgKi8gMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDAsMSwxLDEsMSwgLyogN2YgKi8KKyAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KKyAgLyogOTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogOWYgKi8KKyAgLyogYTAgKi8gMCwwLDAsMSwxLDEsMSwxLDAsMCwwLDEsMSwxLDEsMSwgLyogYWYgKi8KKyAgLyogYjAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwgLyogYmYgKi8KKyAgLyogYzAgKi8gMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KKyAgLyogZDAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogZGYgKi8KKyAgLyogZTAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogZWYgKi8KKyAgLyogZjAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCAgLyogZmYgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfdXNlc19EQVRBX3ByZWZpeFsyNTZdID0geworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAwZiAqLworICAvKiAxMCAqLyAxLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLworICAvKiAyMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMCwwLCAvKiAyZiAqLworICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLCAvKiAzZiAqLworICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLworICAvKiA1MCAqLyAwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLCAvKiA1ZiAqLworICAvKiA2MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLCAvKiA2ZiAqLworICAvKiA3MCAqLyAxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsMSwxLCAvKiA3ZiAqLworICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLworICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLworICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLworICAvKiBjMCAqLyAwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLworICAvKiBkMCAqLyAxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBkZiAqLworICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLworICAvKiBmMCAqLyAxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwICAvKiBmZiAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV91c2VzX1JFUE5aX3ByZWZpeFsyNTZdID0geworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAwZiAqLworICAvKiAxMCAqLyAxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLworICAvKiAyMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMCwwLCAvKiAyZiAqLworICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLworICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLworICAvKiA1MCAqLyAwLDEsMCwwLDAsMCwwLDAsMSwxLDEsMCwxLDEsMSwxLCAvKiA1ZiAqLworICAvKiA2MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA2ZiAqLworICAvKiA3MCAqLyAxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwxLDEsMCwwLCAvKiA3ZiAqLworICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLworICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLworICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLworICAvKiBjMCAqLyAwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLworICAvKiBkMCAqLyAxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBkZiAqLworICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLworICAvKiBmMCAqLyAxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBmZiAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHdvYnl0ZV91c2VzX1JFUFpfcHJlZml4WzI1Nl0gPSB7CisgIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCisgIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCisgIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCisgIC8qIDEwICovIDEsMSwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCisgIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwwLDAsIC8qIDJmICovCisgIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCisgIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCisgIC8qIDUwICovIDAsMSwxLDEsMCwwLDAsMCwxLDEsMSwxLDEsMSwxLDEsIC8qIDVmICovCisgIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsIC8qIDZmICovCisgIC8qIDcwICovIDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCisgIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCisgIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCisgIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCisgIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsIC8qIGJmICovCisgIC8qIGMwICovIDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCisgIC8qIGQwICovIDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCisgIC8qIGUwICovIDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCisgIC8qIGYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGZmICovCisgIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCisgIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCit9OworCisvKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9wY29kZSAwZiAzOCBYWCB1c2VzIERBVEEgcHJlZml4LiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRocmVlYnl0ZV8weDM4X3VzZXNfREFUQV9wcmVmaXhbMjU2XSA9IHsKKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogMDAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwgLyogMGYgKi8KKyAgLyogMTAgKi8gMSwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMSwxLDEsMCwgLyogMWYgKi8KKyAgLyogMjAgKi8gMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMmYgKi8KKyAgLyogMzAgKi8gMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwgLyogM2YgKi8KKyAgLyogNDAgKi8gMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNGYgKi8KKyAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNWYgKi8KKyAgLyogNjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNmYgKi8KKyAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogN2YgKi8KKyAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KKyAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOWYgKi8KKyAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYWYgKi8KKyAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYmYgKi8KKyAgLyogYzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KKyAgLyogZDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDEsMSwgLyogZGYgKi8KKyAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZWYgKi8KKyAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZmYgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgb3Bjb2RlIDBmIDM4IFhYIHVzZXMgUkVQTlogcHJlZml4LiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRocmVlYnl0ZV8weDM4X3VzZXNfUkVQTlpfcHJlZml4WzI1Nl0gPSB7CisgIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCisgIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCisgIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCisgIC8qIDEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCisgIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDJmICovCisgIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCisgIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCisgIC8qIDUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDVmICovCisgIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDZmICovCisgIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDdmICovCisgIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCisgIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCisgIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCisgIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGJmICovCisgIC8qIGMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCisgIC8qIGQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCisgIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCisgIC8qIGYwICovIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGZmICovCisgIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCisgIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCit9OworCisvKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9wY29kZSAwZiAzOCBYWCB1c2VzIFJFUFogcHJlZml4LiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRocmVlYnl0ZV8weDM4X3VzZXNfUkVQWl9wcmVmaXhbMjU2XSA9IHsKKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogMDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMGYgKi8KKyAgLyogMTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMWYgKi8KKyAgLyogMjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMmYgKi8KKyAgLyogMzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogM2YgKi8KKyAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNGYgKi8KKyAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNWYgKi8KKyAgLyogNjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNmYgKi8KKyAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogN2YgKi8KKyAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KKyAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOWYgKi8KKyAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYWYgKi8KKyAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYmYgKi8KKyAgLyogYzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KKyAgLyogZDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZGYgKi8KKyAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZWYgKi8KKyAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZmYgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgb3Bjb2RlIDBmIDNhIFhYIHVzZXMgREFUQSBwcmVmaXguICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGhyZWVieXRlXzB4M2FfdXNlc19EQVRBX3ByZWZpeFsyNTZdID0geworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwxLDEsMSwxLCAvKiAwZiAqLworICAvKiAxMCAqLyAwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLworICAvKiAyMCAqLyAxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAyZiAqLworICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLworICAvKiA0MCAqLyAxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLworICAvKiA1MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA1ZiAqLworICAvKiA2MCAqLyAxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA2ZiAqLworICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3ZiAqLworICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLworICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLworICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLworICAvKiBjMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLworICAvKiBkMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLCAvKiBkZiAqLworICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLworICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBmZiAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworfTsKKworLyogVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBvcGNvZGUgMGYgM2EgWFggdXNlcyBSRVBOWiBwcmVmaXguICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGhyZWVieXRlXzB4M2FfdXNlc19SRVBOWl9wcmVmaXhbMjU2XSA9IHsKKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogMDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMGYgKi8KKyAgLyogMTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMWYgKi8KKyAgLyogMjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogMmYgKi8KKyAgLyogMzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogM2YgKi8KKyAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNGYgKi8KKyAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNWYgKi8KKyAgLyogNjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNmYgKi8KKyAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogN2YgKi8KKyAgLyogODAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOGYgKi8KKyAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOWYgKi8KKyAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYWYgKi8KKyAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYmYgKi8KKyAgLyogYzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogY2YgKi8KKyAgLyogZDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZGYgKi8KKyAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZWYgKi8KKyAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZmYgKi8KKyAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KKyAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KK307CisKKy8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgb3Bjb2RlIDBmIDNhIFhYIHVzZXMgUkVQWiBwcmVmaXguICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGhyZWVieXRlXzB4M2FfdXNlc19SRVBaX3ByZWZpeFsyNTZdID0geworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAwMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAwZiAqLworICAvKiAxMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAxZiAqLworICAvKiAyMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAyZiAqLworICAvKiAzMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiAzZiAqLworICAvKiA0MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA0ZiAqLworICAvKiA1MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA1ZiAqLworICAvKiA2MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA2ZiAqLworICAvKiA3MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA3ZiAqLworICAvKiA4MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA4ZiAqLworICAvKiA5MCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiA5ZiAqLworICAvKiBhMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBhZiAqLworICAvKiBiMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBiZiAqLworICAvKiBjMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBjZiAqLworICAvKiBkMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBkZiAqLworICAvKiBlMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBlZiAqLworICAvKiBmMCAqLyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLCAvKiBmZiAqLworICAvKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAqLworICAvKiAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmICAgICAgICAqLworfTsKKworc3RhdGljIGNoYXIgb2J1ZlsxMDBdOworc3RhdGljIGNoYXIgKm9idWZwOworc3RhdGljIGNoYXIgc2NyYXRjaGJ1ZlsxMDBdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnN0YXJ0X2NvZGVwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmluc25fY29kZXA7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqY29kZXA7CitzdGF0aWMgZGlzYXNzZW1ibGVfaW5mbyAqdGhlX2luZm87CitzdGF0aWMgc3RydWN0CisgIHsKKyAgICBpbnQgbW9kOworICAgIGludCByZWc7CisgICAgaW50IHJtOworICB9Cittb2RybTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5lZWRfbW9kcm07CisKKy8qIElmIHdlIGFyZSBhY2Nlc3NpbmcgbW9kL3JtL3JlZyB3aXRob3V0IG5lZWRfbW9kcm0gc2V0LCB0aGVuIHRoZQorICAgdmFsdWVzIGFyZSBzdGFsZS4gIEhpdHRpbmcgdGhpcyBhYm9ydCBsaWtlbHkgaW5kaWNhdGVzIHRoYXQgeW91CisgICBuZWVkIHRvIHVwZGF0ZSBvbmVieXRlX2hhc19tb2RybSBvciB0d29ieXRlX2hhc19tb2RybS4gICovCisjZGVmaW5lIE1PRFJNX0NIRUNLICBpZiAoIW5lZWRfbW9kcm0pIGFib3J0ICgpCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzNjQ7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lczMyOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXMxNjsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzODsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzOHJleDsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzX3NlZzsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKmluZGV4MTY7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW50ZWxfbmFtZXM2NFtdID0geworICAicmF4IiwgInJjeCIsICJyZHgiLCAicmJ4IiwgInJzcCIsICJyYnAiLCAicnNpIiwgInJkaSIsCisgICJyOCIsICJyOSIsICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGVsX25hbWVzMzJbXSA9IHsKKyAgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsICJlc3AiLCAiZWJwIiwgImVzaSIsICJlZGkiLAorICAicjhkIiwgInI5ZCIsICJyMTBkIiwgInIxMWQiLCAicjEyZCIsICJyMTNkIiwgInIxNGQiLCAicjE1ZCIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGVsX25hbWVzMTZbXSA9IHsKKyAgImF4IiwgImN4IiwgImR4IiwgImJ4IiwgInNwIiwgImJwIiwgInNpIiwgImRpIiwKKyAgInI4dyIsICJyOXciLCAicjEwdyIsICJyMTF3IiwgInIxMnciLCAicjEzdyIsICJyMTR3IiwgInIxNXciCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnRlbF9uYW1lczhbXSA9IHsKKyAgImFsIiwgImNsIiwgImRsIiwgImJsIiwgImFoIiwgImNoIiwgImRoIiwgImJoIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGludGVsX25hbWVzOHJleFtdID0geworICAiYWwiLCAiY2wiLCAiZGwiLCAiYmwiLCAic3BsIiwgImJwbCIsICJzaWwiLCAiZGlsIiwKKyAgInI4YiIsICJyOWIiLCAicjEwYiIsICJyMTFiIiwgInIxMmIiLCAicjEzYiIsICJyMTRiIiwgInIxNWIiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnRlbF9uYW1lc19zZWdbXSA9IHsKKyAgImVzIiwgImNzIiwgInNzIiwgImRzIiwgImZzIiwgImdzIiwgIj8iLCAiPyIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbnRlbF9pbmRleDE2W10gPSB7CisgICJieCtzaSIsICJieCtkaSIsICJicCtzaSIsICJicCtkaSIsICJzaSIsICJkaSIsICJicCIsICJieCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXR0X25hbWVzNjRbXSA9IHsKKyAgIiVyYXgiLCAiJXJjeCIsICIlcmR4IiwgIiVyYngiLCAiJXJzcCIsICIlcmJwIiwgIiVyc2kiLCAiJXJkaSIsCisgICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1IgorfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYXR0X25hbWVzMzJbXSA9IHsKKyAgIiVlYXgiLCAiJWVjeCIsICIlZWR4IiwgIiVlYngiLCAiJWVzcCIsICIlZWJwIiwgIiVlc2kiLCAiJWVkaSIsCisgICIlcjhkIiwgIiVyOWQiLCAiJXIxMGQiLCAiJXIxMWQiLCAiJXIxMmQiLCAiJXIxM2QiLCAiJXIxNGQiLCAiJXIxNWQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRfbmFtZXMxNltdID0geworICAiJWF4IiwgIiVjeCIsICIlZHgiLCAiJWJ4IiwgIiVzcCIsICIlYnAiLCAiJXNpIiwgIiVkaSIsCisgICIlcjh3IiwgIiVyOXciLCAiJXIxMHciLCAiJXIxMXciLCAiJXIxMnciLCAiJXIxM3ciLCAiJXIxNHciLCAiJXIxNXciCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRfbmFtZXM4W10gPSB7CisgICIlYWwiLCAiJWNsIiwgIiVkbCIsICIlYmwiLCAiJWFoIiwgIiVjaCIsICIlZGgiLCAiJWJoIiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dF9uYW1lczhyZXhbXSA9IHsKKyAgIiVhbCIsICIlY2wiLCAiJWRsIiwgIiVibCIsICIlc3BsIiwgIiVicGwiLCAiJXNpbCIsICIlZGlsIiwKKyAgIiVyOGIiLCAiJXI5YiIsICIlcjEwYiIsICIlcjExYiIsICIlcjEyYiIsICIlcjEzYiIsICIlcjE0YiIsICIlcjE1YiIKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dF9uYW1lc19zZWdbXSA9IHsKKyAgIiVlcyIsICIlY3MiLCAiJXNzIiwgIiVkcyIsICIlZnMiLCAiJWdzIiwgIiU/IiwgIiU/IiwKK307CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF0dF9pbmRleDE2W10gPSB7CisgICIlYngsJXNpIiwgIiVieCwlZGkiLCAiJWJwLCVzaSIsICIlYnAsJWRpIiwgIiVzaSIsICIlZGkiLCAiJWJwIiwgIiVieCIKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGdycHNbXVs4XSA9IHsKKyAgLyogR1JQMWEgKi8KKyAgeworICAgIHsgInBvcFUiLAl7IHN0YWNrRXYgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisgIC8qIEdSUDFiICovCisgIHsKKyAgICB7ICJhZGRBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgIm9yQSIsCXsgRWIsIEliIH0gfSwKKyAgICB7ICJhZGNBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgInNiYkEiLAl7IEViLCBJYiB9IH0sCisgICAgeyAiYW5kQSIsCXsgRWIsIEliIH0gfSwKKyAgICB7ICJzdWJBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgInhvckEiLAl7IEViLCBJYiB9IH0sCisgICAgeyAiY21wQSIsCXsgRWIsIEliIH0gfSwKKyAgfSwKKyAgLyogR1JQMVMgKi8KKyAgeworICAgIHsgImFkZFEiLAl7IEV2LCBJdiB9IH0sCisgICAgeyAib3JRIiwJeyBFdiwgSXYgfSB9LAorICAgIHsgImFkY1EiLAl7IEV2LCBJdiB9IH0sCisgICAgeyAic2JiUSIsCXsgRXYsIEl2IH0gfSwKKyAgICB7ICJhbmRRIiwJeyBFdiwgSXYgfSB9LAorICAgIHsgInN1YlEiLAl7IEV2LCBJdiB9IH0sCisgICAgeyAieG9yUSIsCXsgRXYsIEl2IH0gfSwKKyAgICB7ICJjbXBRIiwJeyBFdiwgSXYgfSB9LAorICB9LAorICAvKiBHUlAxU3MgKi8KKyAgeworICAgIHsgImFkZFEiLAl7IEV2LCBzSWIgfSB9LAorICAgIHsgIm9yUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAiYWRjUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAic2JiUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAiYW5kUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAic3ViUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAieG9yUSIsCXsgRXYsIHNJYiB9IH0sCisgICAgeyAiY21wUSIsCXsgRXYsIHNJYiB9IH0sCisgIH0sCisgIC8qIEdSUDJiICovCisgIHsKKyAgICB7ICJyb2xBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgInJvckEiLAl7IEViLCBJYiB9IH0sCisgICAgeyAicmNsQSIsCXsgRWIsIEliIH0gfSwKKyAgICB7ICJyY3JBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgInNobEEiLAl7IEViLCBJYiB9IH0sCisgICAgeyAic2hyQSIsCXsgRWIsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInNhckEiLAl7IEViLCBJYiB9IH0sCisgIH0sCisgIC8qIEdSUDJTICovCisgIHsKKyAgICB7ICJyb2xRIiwJeyBFdiwgSWIgfSB9LAorICAgIHsgInJvclEiLAl7IEV2LCBJYiB9IH0sCisgICAgeyAicmNsUSIsCXsgRXYsIEliIH0gfSwKKyAgICB7ICJyY3JRIiwJeyBFdiwgSWIgfSB9LAorICAgIHsgInNobFEiLAl7IEV2LCBJYiB9IH0sCisgICAgeyAic2hyUSIsCXsgRXYsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInNhclEiLAl7IEV2LCBJYiB9IH0sCisgIH0sCisgIC8qIEdSUDJiX29uZSAqLworICB7CisgICAgeyAicm9sQSIsCXsgRWIsIEkxIH0gfSwKKyAgICB7ICJyb3JBIiwJeyBFYiwgSTEgfSB9LAorICAgIHsgInJjbEEiLAl7IEViLCBJMSB9IH0sCisgICAgeyAicmNyQSIsCXsgRWIsIEkxIH0gfSwKKyAgICB7ICJzaGxBIiwJeyBFYiwgSTEgfSB9LAorICAgIHsgInNockEiLAl7IEViLCBJMSB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJzYXJBIiwJeyBFYiwgSTEgfSB9LAorICB9LAorICAvKiBHUlAyU19vbmUgKi8KKyAgeworICAgIHsgInJvbFEiLAl7IEV2LCBJMSB9IH0sCisgICAgeyAicm9yUSIsCXsgRXYsIEkxIH0gfSwKKyAgICB7ICJyY2xRIiwJeyBFdiwgSTEgfSB9LAorICAgIHsgInJjclEiLAl7IEV2LCBJMSB9IH0sCisgICAgeyAic2hsUSIsCXsgRXYsIEkxIH0gfSwKKyAgICB7ICJzaHJRIiwJeyBFdiwgSTEgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAic2FyUSIsCXsgRXYsIEkxIH0gfSwKKyAgfSwKKyAgLyogR1JQMmJfY2wgKi8KKyAgeworICAgIHsgInJvbEEiLAl7IEViLCBDTCB9IH0sCisgICAgeyAicm9yQSIsCXsgRWIsIENMIH0gfSwKKyAgICB7ICJyY2xBIiwJeyBFYiwgQ0wgfSB9LAorICAgIHsgInJjckEiLAl7IEViLCBDTCB9IH0sCisgICAgeyAic2hsQSIsCXsgRWIsIENMIH0gfSwKKyAgICB7ICJzaHJBIiwJeyBFYiwgQ0wgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAic2FyQSIsCXsgRWIsIENMIH0gfSwKKyAgfSwKKyAgLyogR1JQMlNfY2wgKi8KKyAgeworICAgIHsgInJvbFEiLAl7IEV2LCBDTCB9IH0sCisgICAgeyAicm9yUSIsCXsgRXYsIENMIH0gfSwKKyAgICB7ICJyY2xRIiwJeyBFdiwgQ0wgfSB9LAorICAgIHsgInJjclEiLAl7IEV2LCBDTCB9IH0sCisgICAgeyAic2hsUSIsCXsgRXYsIENMIH0gfSwKKyAgICB7ICJzaHJRIiwJeyBFdiwgQ0wgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAic2FyUSIsCXsgRXYsIENMIH0gfSwKKyAgfSwKKyAgLyogR1JQM2IgKi8KKyAgeworICAgIHsgInRlc3RBIiwJeyBFYiwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBFYiB9IH0sCisgICAgeyAibm90QSIsCXsgRWIgfSB9LAorICAgIHsgIm5lZ0EiLAl7IEViIH0gfSwKKyAgICB7ICJtdWxBIiwJeyBFYiB9IH0sCS8qIERvbid0IHByaW50IHRoZSBpbXBsaWNpdCAlYWwgcmVnaXN0ZXIsICAqLworICAgIHsgImltdWxBIiwJeyBFYiB9IH0sCS8qIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIG9wY29kZXMgZnJvbSBvdGhlciAqLworICAgIHsgImRpdkEiLAl7IEViIH0gfSwJLyogbXVsL2ltdWwgb3Bjb2Rlcy4gIERvIHRoZSBzYW1lIGZvciBkaXYgICovCisgICAgeyAiaWRpdkEiLAl7IEViIH0gfSwJLyogYW5kIGlkaXYgZm9yIGNvbnNpc3RlbmN5LgkJICAgKi8KKyAgfSwKKyAgLyogR1JQM1MgKi8KKyAgeworICAgIHsgInRlc3RRIiwJeyBFdiwgSXYgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAibm90USIsCXsgRXYgfSB9LAorICAgIHsgIm5lZ1EiLAl7IEV2IH0gfSwKKyAgICB7ICJtdWxRIiwJeyBFdiB9IH0sCS8qIERvbid0IHByaW50IHRoZSBpbXBsaWNpdCByZWdpc3Rlci4gICovCisgICAgeyAiaW11bFEiLAl7IEV2IH0gfSwKKyAgICB7ICJkaXZRIiwJeyBFdiB9IH0sCisgICAgeyAiaWRpdlEiLAl7IEV2IH0gfSwKKyAgfSwKKyAgLyogR1JQNCAqLworICB7CisgICAgeyAiaW5jQSIsCXsgRWIgfSB9LAorICAgIHsgImRlY0EiLAl7IEViIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQNSAqLworICB7CisgICAgeyAiaW5jUSIsCXsgRXYgfSB9LAorICAgIHsgImRlY1EiLAl7IEV2IH0gfSwKKyAgICB7ICJjYWxsVCIsCXsgaW5kaXJFdiB9IH0sCisgICAgeyAiSmNhbGxUIiwJeyBpbmRpckVwIH0gfSwKKyAgICB7ICJqbXBUIiwJeyBpbmRpckV2IH0gfSwKKyAgICB7ICJKam1wVCIsCXsgaW5kaXJFcCB9IH0sCisgICAgeyAicHVzaFUiLAl7IHN0YWNrRXYgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisgIC8qIEdSUDYgKi8KKyAgeworICAgIHsgInNsZHREIiwJeyBTdiB9IH0sCisgICAgeyAic3RyRCIsCXsgU3YgfSB9LAorICAgIHsgImxsZHQiLAl7IEV3IH0gfSwKKyAgICB7ICJsdHIiLAl7IEV3IH0gfSwKKyAgICB7ICJ2ZXJyIiwJeyBFdyB9IH0sCisgICAgeyAidmVydyIsCXsgRXcgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQNyAqLworICB7CisgICAgeyAic2dkdHtRfElRfHx9IiwgeyB7IFZNWF9GaXh1cCwgMCB9IH0gfSwKKyAgICB7ICJzaWR0e1F8SVF8fH0iLCB7IHsgUE5JX0ZpeHVwLCAwIH0gfSB9LAorICAgIHsgImxnZHR7UXxRfHx9IiwJIHsgTSB9IH0sCisgICAgeyAibGlkdHtRfFF8fH0iLAkgeyB7IFNWTUVfRml4dXAsIDAgfSB9IH0sCisgICAgeyAic21zd0QiLAl7IFN2IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImxtc3ciLAl7IEV3IH0gfSwKKyAgICB7ICJpbnZscGciLAl7IHsgSU5WTFBHX0ZpeHVwLCB3X21vZGUgfSB9IH0sCisgIH0sCisgIC8qIEdSUDggKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiYnRRIiwJeyBFdiwgSWIgfSB9LAorICAgIHsgImJ0c1EiLAl7IEV2LCBJYiB9IH0sCisgICAgeyAiYnRyUSIsCXsgRXYsIEliIH0gfSwKKyAgICB7ICJidGNRIiwJeyBFdiwgSWIgfSB9LAorICB9LAorICAvKiBHUlA5ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImNtcHhjaGc4YiIsIHsgeyBDTVBYQ0hHOEJfRml4dXAsIHFfbW9kZSB9IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIiIsCXsgVk0gfSB9LAkJLyogU2VlIE9QX1ZNWC4gICovCisgICAgeyAidm1wdHJzdCIsIHsgTXEgfSB9LAorICB9LAorICAvKiBHUlAxMV9DNiAqLworICB7CisgICAgeyAibW92QSIsCXsgRWIsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorICAvKiBHUlAxMV9DNyAqLworICB7CisgICAgeyAibW92USIsCXsgRXYsIEl2IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsICB7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQMTIgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwc3JsdyIsCXsgTVMsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBzcmF3IiwJeyBNUywgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicHNsbHciLAl7IE1TLCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQMTMgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwc3JsZCIsCXsgTVMsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBzcmFkIiwJeyBNUywgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicHNsbGQiLAl7IE1TLCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQMTQgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwc3JscSIsCXsgTVMsIEliIH0gfSwKKyAgICB7ICJwc3JsZHEiLAl7IE1TLCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBzbGxxIiwJeyBNUywgSWIgfSB9LAorICAgIHsgInBzbGxkcSIsCXsgTVMsIEliIH0gfSwKKyAgfSwKKyAgLyogR1JQMTUgKi8KKyAgeworICAgIHsgImZ4c2F2ZSIsCQl7IEV2IH0gfSwKKyAgICB7ICJmeHJzdG9yIiwJeyBFdiB9IH0sCisgICAgeyAibGRteGNzciIsCXsgRXYgfSB9LAorICAgIHsgInN0bXhjc3IiLAl7IEV2IH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICJsZmVuY2UiLAkJeyB7IE9QXzBmYWUsIDAgfSB9IH0sCisgICAgeyAibWZlbmNlIiwJCXsgeyBPUF8wZmFlLCAwIH0gfSB9LAorICAgIHsgImNsZmx1c2giLAl7IHsgT1BfMGZhZSwgMCB9IH0gfSwKKyAgfSwKKyAgLyogR1JQMTYgKi8KKyAgeworICAgIHsgInByZWZldGNobnRhIiwJeyBFdiB9IH0sCisgICAgeyAicHJlZmV0Y2h0MCIsCXsgRXYgfSB9LAorICAgIHsgInByZWZldGNodDEiLAl7IEV2IH0gfSwKKyAgICB7ICJwcmVmZXRjaHQyIiwJeyBFdiB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyBYWCB9IH0sCisgIH0sCisgIC8qIEdSUEFNRCAqLworICB7CisgICAgeyAicHJlZmV0Y2giLAl7IEViIH0gfSwKKyAgICB7ICJwcmVmZXRjaHciLAl7IEViIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCQl7IFhYIH0gfSwKKyAgfSwKKyAgLyogR1JQUEFETENLMSAqLworICB7CisgICAgeyAieHN0b3JlLXJuZyIsCXsgeyBPUF8wZjA3LCAwIH0gfSB9LAorICAgIHsgInhjcnlwdC1lY2IiLAl7IHsgT1BfMGYwNywgMCB9IH0gfSwKKyAgICB7ICJ4Y3J5cHQtY2JjIiwJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAieGNyeXB0LWN0ciIsCXsgeyBPUF8wZjA3LCAwIH0gfSB9LAorICAgIHsgInhjcnlwdC1jZmIiLAl7IHsgT1BfMGYwNywgMCB9IH0gfSwKKyAgICB7ICJ4Y3J5cHQtb2ZiIiwJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgIH0sCisgIC8qIEdSUFBBRExDSzIgKi8KKyAgeworICAgIHsgIm1vbnRtdWwiLAl7IHsgT1BfMGYwNywgMCB9IH0gfSwKKyAgICB7ICJ4c2hhMSIsCQl7IHsgT1BfMGYwNywgMCB9IH0gfSwKKyAgICB7ICJ4c2hhMjU2IiwJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgICAgeyAiKGJhZCkiLAkJeyB7IE9QXzBmMDcsIDAgfSB9IH0sCisgIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHByZWZpeF91c2VyX3RhYmxlW11bNF0gPSB7CisgIC8qIFBSRUdSUDAgKi8KKyAgeworICAgIHsgImFkZHBzIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJhZGRzcyIsIHsgWE0sIEVYZCB9IH0sCisgICAgeyAiYWRkcGQiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgImFkZHNkIiwgeyBYTSwgRVhxIH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQMSAqLworICB7CisgICAgeyAiIiwgeyBYTSwgRVh4LCBPUFNJTUQgfSB9LAkvKiBTZWUgT1BfU0lNRF9TVUZGSVguICAqLworICAgIHsgIiIsIHsgWE0sIEVYeCwgT1BTSU1EIH0gfSwKKyAgICB7ICIiLCB7IFhNLCBFWHgsIE9QU0lNRCB9IH0sCisgICAgeyAiIiwgeyBYTSwgRVh4LCBPUFNJTUQgfSB9LAorICB9LAorICAvKiBQUkVHUlAyICovCisgIHsKKyAgICB7ICJjdnRwaTJwcyIsIHsgWE0sIEVNQyB9IH0sCisgICAgeyAiY3Z0c2kyc3NZIiwgeyBYTSwgRXYgfSB9LAorICAgIHsgImN2dHBpMnBkIiwgeyBYTSwgRU1DIH0gfSwKKyAgICB7ICJjdnRzaTJzZFkiLCB7IFhNLCBFdiB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDMgKi8KKyAgeworICAgIHsgImN2dHBzMnBpIiwgeyBNWEMsIEVYeCB9IH0sCisgICAgeyAiY3Z0c3Myc2lZIiwgeyBHdiwgRVh4IH0gfSwKKyAgICB7ICJjdnRwZDJwaSIsIHsgTVhDLCBFWHggfSB9LAorICAgIHsgImN2dHNkMnNpWSIsIHsgR3YsIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDQgKi8KKyAgeworICAgIHsgImN2dHRwczJwaSIsIHsgTVhDLCBFWHggfSB9LAorICAgIHsgImN2dHRzczJzaVkiLCB7IEd2LCBFWHggfSB9LAorICAgIHsgImN2dHRwZDJwaSIsIHsgTVhDLCBFWHggfSB9LAorICAgIHsgImN2dHRzZDJzaVkiLCB7IEd2LCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlA1ICovCisgIHsKKyAgICB7ICJkaXZwcyIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiZGl2c3MiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgImRpdnBkIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJkaXZzZCIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDYgKi8KKyAgeworICAgIHsgIm1heHBzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJtYXhzcyIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAibWF4cGQiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm1heHNkIiwJeyBYTSwgRVh4IH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQNyAqLworICB7CisgICAgeyAibWlucHMiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm1pbnNzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJtaW5wZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAibWluc2QiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlA4ICovCisgIHsKKyAgICB7ICJtb3Z1cHMiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm1vdnNzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJtb3Z1cGQiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm1vdnNkIiwJeyBYTSwgRVh4IH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQOSAqLworICB7CisgICAgeyAibW92dXBzIiwJeyBFWHgsICBYTSB9IH0sCisgICAgeyAibW92c3MiLAl7IEVYeCwgIFhNIH0gfSwKKyAgICB7ICJtb3Z1cGQiLAl7IEVYeCwgIFhNIH0gfSwKKyAgICB7ICJtb3ZzZCIsCXsgRVh4LCAgWE0gfSB9LAorICB9LAorICAvKiBQUkVHUlAxMCAqLworICB7CisgICAgeyAibXVscHMiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm11bHNzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJtdWxwZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAibXVsc2QiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlAxMSAqLworICB7CisgICAgeyAicmNwcHMiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgInJjcHNzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlAxMiAqLworICB7CisgICAgeyAicnNxcnRwcyIseyBYTSwgRVh4IH0gfSwKKyAgICB7ICJyc3FydHNzIix7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDEzICovCisgIHsKKyAgICB7ICJzcXJ0cHMiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgInNxcnRzcyIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAic3FydHBkIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJzcXJ0c2QiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlAxNCAqLworICB7CisgICAgeyAic3VicHMiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgInN1YnNzIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJzdWJwZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAic3Vic2QiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlAxNSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgImN2dGRxMnBkIiwgeyBYTSwgRVhxIH0gfSwKKyAgICB7ICJjdnR0cGQyZHEiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgImN2dHBkMmRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQMTYgKi8KKyAgeworICAgIHsgImN2dGRxMnBzIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJjdnR0cHMyZHEiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgImN2dHBzMmRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDE3ICovCisgIHsKKyAgICB7ICJjdnRwczJwZCIsIHsgWE0sIEVYcSB9IH0sCisgICAgeyAiY3Z0c3Myc2QiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgImN2dHBkMnBzIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJjdnRzZDJzcyIsIHsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDE4ICovCisgIHsKKyAgICB7ICJtYXNrbW92cSIsIHsgTVgsIE1TIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAibWFza21vdmRxdSIsIHsgWE0sIFhTIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDE5ICovCisgIHsKKyAgICB7ICJtb3ZxIiwJeyBNWCwgRU0gfSB9LAorICAgIHsgIm1vdmRxdSIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAibW92ZHFhIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDIwICovCisgIHsKKyAgICB7ICJtb3ZxIiwJeyBFTSwgTVggfSB9LAorICAgIHsgIm1vdmRxdSIsCXsgRVh4LCAgWE0gfSB9LAorICAgIHsgIm1vdmRxYSIsCXsgRVh4LCAgWE0gfSB9LAorICAgIHsgIihiYWQpIiwJeyBFWHgsICBYTSB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDIxICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgRVh4LCAgWE0gfSB9LAorICAgIHsgIm1vdnEyZHEiLHsgWE0sIE1TIH0gfSwKKyAgICB7ICJtb3ZxIiwJeyBFWHgsICBYTSB9IH0sCisgICAgeyAibW92ZHEycSIseyBNWCwgWFMgfSB9LAorICB9LAorICAvKiBQUkVHUlAyMiAqLworICB7CisgICAgeyAicHNodWZ3IiwJeyBNWCwgRU0sIEliIH0gfSwKKyAgICB7ICJwc2h1Zmh3Iix7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICJwc2h1ZmQiLAl7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICJwc2h1Zmx3Iix7IFhNLCBFWHgsIEliIH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQMjMgKi8KKyAgeworICAgIHsgIm1vdmQiLAl7IEVkcSwgTVggfSB9LAorICAgIHsgIm1vdnEiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIm1vdmQiLAl7IEVkcSwgWE0gfSB9LAorICAgIHsgIihiYWQpIiwJeyBFZCwgWE0gfSB9LAorICB9LAorICAvKiBQUkVHUlAyNCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IE1YLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJwdW5wY2tocWRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDI1ICovCisgIHsKKyAgICB7ICJtb3ZudHEiLAl7IEVNLCBNWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IEVNLCBYTSB9IH0sCisgICAgeyAibW92bnRkcSIseyBFTSwgWE0gfSB9LAorICAgIHsgIihiYWQpIiwJeyBFTSwgWE0gfSB9LAorICB9LAorICAvKiBQUkVHUlAyNiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IE1YLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJwdW5wY2tscWRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDI3ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgTVgsIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgImFkZHN1YnBkIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJhZGRzdWJwcyIsIHsgWE0sIEVYeCB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDI4ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgTVgsIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgImhhZGRwZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiaGFkZHBzIiwJeyBYTSwgRVh4IH0gfSwKKyAgfSwKKyAgLyogUFJFR1JQMjkgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBNWCwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiaHN1YnBkIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJoc3VicHMiLAl7IFhNLCBFWHggfSB9LAorICB9LAorICAvKiBQUkVHUlAzMCAqLworICB7CisgICAgeyAibW92bHBYIiwJeyBYTSwgRVhxLCB7IFNJTURfRml4dXAsICdoJyB9IH0gfSwgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLworICAgIHsgIm1vdnNsZHVwIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJtb3ZscGQiLAl7IFhNLCBFWHEgfSB9LAorICAgIHsgIm1vdmRkdXAiLCB7IFhNLCBFWHEgfSB9LAorICB9LAorICAvKiBQUkVHUlAzMSAqLworICB7CisgICAgeyAibW92aHBYIiwJeyBYTSwgRVhxLCB7IFNJTURfRml4dXAsICdsJyB9IH0gfSwKKyAgICB7ICJtb3ZzaGR1cCIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAibW92aHBkIiwJeyBYTSwgRVhxIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYcSB9IH0sCisgIH0sCisgIC8qIFBSRUdSUDMyICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYTSwgRVh4IH0gfSwKKyAgICB7ICJsZGRxdSIsCXsgWE0sIE0gfSB9LAorICB9LAorICAvKiBQUkVHUlAzMyAqLworICB7CisgICAgeyJtb3ZudHBzIiwgeyBFdiwgWE0gfSB9LAorICAgIHsibW92bnRzcyIsIHsgRXYsIFhNIH0gfSwKKyAgICB7Im1vdm50cGQiLCB7IEV2LCBYTSB9IH0sCisgICAgeyJtb3ZudHNkIiwgeyBFdiwgWE0gfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDM0ICovCisgIHsKKyAgICB7InZtcmVhZCIsCXsgRW0sIEdtIH0gfSwKKyAgICB7IihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyJleHRycSIsCXsgWFMsIEliLCBJYiB9IH0sCisgICAgeyJpbnNlcnRxIiwJeyBYTSwgWFMsIEliLCBJYiB9IH0sCisgIH0sCisKKyAvKiBQUkVHUlAzNSAqLworICB7CisgICAgeyJ2bXdyaXRlIiwJeyBHbSwgRW0gfSB9LAorICAgIHsiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ImV4dHJxIiwJeyBYTSwgWFMgfSB9LAorICAgIHsiaW5zZXJ0cSIsCXsgWE0sIFhTIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlAzNiAqLworICB7CisgICAgeyAiYnNyUyIsCXsgR3YsIEV2IH0gfSwKKyAgICB7ICJsemNudFMiLAl7IEd2LCBFdiB9IH0sCisgICAgeyAiYnNyUyIsCXsgR3YsIEV2IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDM3ICovCisgIHsKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgInBvcGNudFMiLCB7IEd2LCBFdiB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDM4ICovCisgIHsKKyAgICB7ICJ4Y2hnUyIsIHsgeyBOT1BfRml4dXAxLCBlQVhfcmVnIH0sIHsgTk9QX0ZpeHVwMiwgZUFYX3JlZyB9IH0gfSwKKyAgICB7ICJwYXVzZSIsIHsgWFggfSB9LAorICAgIHsgInhjaGdTIiwgeyB7IE5PUF9GaXh1cDEsIGVBWF9yZWcgfSwgeyBOT1BfRml4dXAyLCBlQVhfcmVnIH0gfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQMzkgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwYmxlbmR2YiIsIHtYTSwgRVh4LCBYTU0wIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDQwICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiYmxlbmR2cHMiLCB7WE0sIEVYeCwgWE1NMCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA0MSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImJsZW5kdnBkIiwgeyBYTSwgRVh4LCBYTU0wIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDQyICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicHRlc3QiLCAgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDQzICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicG1vdnN4YnciLCB7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNDQgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwbW92c3hiZCIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA0NSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtb3ZzeGJxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDQ2ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicG1vdnN4d2QiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNDcgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwbW92c3h3cSIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA0OCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtb3ZzeGRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDQ5ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicG11bGRxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDUwICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicGNtcGVxcSIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA1MSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIm1vdm50ZHFhIiwgeyBYTSwgRU0gfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNTIgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwYWNrdXNkdyIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA1MyAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtb3Z6eGJ3IiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDU0ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicG1vdnp4YmQiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNTUgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwbW92enhicSIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA1NiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtb3Z6eHdkIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDU3ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicG1vdnp4d3EiLCB7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNTggKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwbW92enhkcSIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA1OSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtaW5zYiIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2MCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtaW5zZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2MSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtaW51dyIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2MiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtaW51ZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2MyAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtYXhzYiIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2NCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtYXhzZCIsCXsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2NSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtYXh1dyIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2NiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtYXh1ZCIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2NyAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBtdWxsZCIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA2OCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBobWlucG9zdXciLCB7IFhNLCBFWHggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNjkgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJyb3VuZHBzIiwgeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA3MCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInJvdW5kcGQiLCB7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDcxICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicm91bmRzcyIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNzIgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJyb3VuZHNkIiwgeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA3MyAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImJsZW5kcHMiLCB7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDc0ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiYmxlbmRwZCIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNzUgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwYmxlbmR3IiwgeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA3NiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBleHRyYiIsCXsgRWRxYiwgWE0sIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDc3ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicGV4dHJ3IiwJeyBFZHF3LCBYTSwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQNzggKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwZXh0cksiLAl7IEVkcSwgWE0sIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDc5ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiZXh0cmFjdHBzIiwgeyBFZHFkLCBYTSwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQODAgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwaW5zcmIiLAl7IFhNLCBFZHFiLCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA4MSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImluc2VydHBzIiwgeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA4MiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBpbnNySyIsCXsgWE0sIEVkcSwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQODMgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJkcHBzIiwJeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA4NCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImRwcGQiLAl7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDg1ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAibXBzYWRidyIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQODYgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwY21wZ3RxIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDg3ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJjcmMzMiIsCXsgR2RxLCB7IENSQzMyX0ZpeHVwLCBiX21vZGUgfSB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQODggKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImNyYzMyIiwJeyBHZHEsIHsgQ1JDMzJfRml4dXAsIHZfbW9kZSB9IH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA4OSAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBjbXBlc3RybSIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQOTAgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwY21wZXN0cmkiLCB7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDkxICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicGNtcGlzdHJtIiwgeyBYTSwgRVh4LCBJYiB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA5MiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInBjbXBpc3RyaSIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQOTMgKi8KKyAgeworICAgIHsgInVjb21pc3MiLHsgWE0sIEVYZCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJ1Y29taXNkIix7IFhNLCBFWHEgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQOTQgKi8KKyAgeworICAgIHsgImNvbWlzcyIsCXsgWE0sIEVYZCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJjb21pc2QiLAl7IFhNLCBFWHEgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQOTUgKi8KKyAgeworICAgIHsgInB1bnBja2xidyIseyBNWCwgRU1kIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgInB1bnBja2xidyIseyBNWCwgRU1xIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDk2ICovCisgIHsKKyAgICB7ICJwdW5wY2tsd2QiLHsgTVgsIEVNZCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwdW5wY2tsd2QiLHsgTVgsIEVNcSB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlA5NyAqLworICB7CisgICAgeyAicHVucGNrbGRxIix7IE1YLCBFTWQgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAicHVucGNrbGRxIix7IE1YLCBFTXEgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKKyAgLyogUFJFR1JQOTggKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJwY2xtdWxxZHEiLCB7IFhNLCBFWHgsIEliIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDk5ICovCisgIHsKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiYWVzaW1jIiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDEwMCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImFlc2VuYyIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlAxMDEgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJhZXNlbmNsYXN0IiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDEwMiAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImFlc2RlYyIsIHsgWE0sIEVYeCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKworICAvKiBQUkVHUlAxMDMgKi8KKyAgeworICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJhZXNkZWNsYXN0IiwgeyBYTSwgRVh4IH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorCisgIC8qIFBSRUdSUDEwNCAqLworICB7CisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgImFlc2tleWdlbmFzc2lzdCIsIHsgWE0sIEVYeCwgSWIgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCisKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHg4Nl82NF90YWJsZVtdWzJdID0geworICB7CisgICAgeyAicHVzaGF7UHx9IiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgfSwKKyAgeworICAgIHsgInBvcGF7UHx9IiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgfSwKKyAgeworICAgIHsgImJvdW5ke1N8fSIsIHsgR3YsIE1hIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICB9LAorICB7CisgICAgeyAiYXJwbCIsIHsgRXcsIEd3IH0gfSwKKyAgICB7ICJtb3Zze3x8bHF8eGR9IiwgeyBHdiwgRWQgfSB9LAorICB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgdGhyZWVfYnl0ZV90YWJsZVtdWzI1Nl0gPSB7CisgIC8qIFRIUkVFX0JZVEVfMCAqLworICB7CisgICAgLyogMDAgKi8KKyAgICB7ICJwc2h1ZmIiLCB7IE1YLCBFTSB9IH0sCisgICAgeyAicGhhZGR3IiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBoYWRkZCIsCXsgTVgsIEVNIH0gfSwKKyAgICB7ICJwaGFkZHN3IiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBtYWRkdWJzdyIsIHsgTVgsIEVNIH0gfSwKKyAgICB7ICJwaHN1YnciLCB7IE1YLCBFTSB9IH0sCisgICAgeyAicGhzdWJkIiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBoc3Vic3ciLCB7IE1YLCBFTSB9IH0sCisgICAgLyogMDggKi8KKyAgICB7ICJwc2lnbmIiLCB7IE1YLCBFTSB9IH0sCisgICAgeyAicHNpZ253IiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBzaWduZCIsIHsgTVgsIEVNIH0gfSwKKyAgICB7ICJwbXVsaHJzdyIsIHsgTVgsIEVNIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIC8qIDEwICovCisgICAgeyBQUkVHUlAzOSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgUFJFR1JQNDAgfSwKKyAgICB7IFBSRUdSUDQxIH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7IFBSRUdSUDQyIH0sCisgICAgLyogMTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgInBhYnNiIiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBhYnN3IiwgeyBNWCwgRU0gfSB9LAorICAgIHsgInBhYnNkIiwgeyBNWCwgRU0gfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogMjAgKi8KKyAgICB7IFBSRUdSUDQzIH0sCisgICAgeyBQUkVHUlA0NCB9LAorICAgIHsgUFJFR1JQNDUgfSwKKyAgICB7IFBSRUdSUDQ2IH0sCisgICAgeyBQUkVHUlA0NyB9LAorICAgIHsgUFJFR1JQNDggfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogMjggKi8KKyAgICB7IFBSRUdSUDQ5IH0sCisgICAgeyBQUkVHUlA1MCB9LAorICAgIHsgUFJFR1JQNTEgfSwKKyAgICB7IFBSRUdSUDUyIH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiAzMCAqLworICAgIHsgUFJFR1JQNTMgfSwKKyAgICB7IFBSRUdSUDU0IH0sCisgICAgeyBQUkVHUlA1NSB9LAorICAgIHsgUFJFR1JQNTYgfSwKKyAgICB7IFBSRUdSUDU3IH0sCisgICAgeyBQUkVHUlA1OCB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyBQUkVHUlA4NiB9LAorICAgIC8qIDM4ICovCisgICAgeyBQUkVHUlA1OSB9LAorICAgIHsgUFJFR1JQNjAgfSwKKyAgICB7IFBSRUdSUDYxIH0sCisgICAgeyBQUkVHUlA2MiB9LAorICAgIHsgUFJFR1JQNjMgfSwKKyAgICB7IFBSRUdSUDY0IH0sCisgICAgeyBQUkVHUlA2NSB9LAorICAgIHsgUFJFR1JQNjYgfSwKKyAgICAvKiA0MCAqLworICAgIHsgUFJFR1JQNjcgfSwKKyAgICB7IFBSRUdSUDY4IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNDggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNjAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNzAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNzggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogODAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogODggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogOTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogOTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYjAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYzAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYzggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZDAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZDggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7IFBSRUdSUDk5IH0sCisgICAgeyBQUkVHUlAxMDAgfSwKKyAgICB7IFBSRUdSUDEwMSB9LAorICAgIHsgUFJFR1JQMTAyIH0sCisgICAgeyBQUkVHUlAxMDMgfSwKKyAgICAvKiBlMCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiBlOCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiBmMCAqLworICAgIHsgUFJFR1JQODcgfSwKKyAgICB7IFBSRUdSUDg4IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgIH0sCisgIC8qIFRIUkVFX0JZVEVfMSAqLworICB7CisgICAgLyogMDAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogMDggKi8KKyAgICB7IFBSRUdSUDY5IH0sCisgICAgeyBQUkVHUlA3MCB9LAorICAgIHsgUFJFR1JQNzEgfSwKKyAgICB7IFBSRUdSUDcyIH0sCisgICAgeyBQUkVHUlA3MyB9LAorICAgIHsgUFJFR1JQNzQgfSwKKyAgICB7IFBSRUdSUDc1IH0sCisgICAgeyAicGFsaWduciIsIHsgTVgsIEVNLCBJYiB9IH0sCisgICAgLyogMTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgUFJFR1JQNzYgfSwKKyAgICB7IFBSRUdSUDc3IH0sCisgICAgeyBQUkVHUlA3OCB9LAorICAgIHsgUFJFR1JQNzkgfSwKKyAgICAvKiAxOCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiAyMCAqLworICAgIHsgUFJFR1JQODAgfSwKKyAgICB7IFBSRUdSUDgxIH0sCisgICAgeyBQUkVHUlA4MiB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiAyOCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiAzMCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiAzOCAqLworICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICAvKiA0MCAqLworICAgIHsgUFJFR1JQODMgfSwKKyAgICB7IFBSRUdSUDg0IH0sCisgICAgeyBQUkVHUlA4NSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyBQUkVHUlA5OCB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIC8qIDQ4ICovCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIC8qIDUwICovCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIC8qIDU4ICovCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIC8qIDYwICovCisgICAgeyBQUkVHUlA4OSB9LAorICAgIHsgUFJFR1JQOTAgfSwKKyAgICB7IFBSRUdSUDkxIH0sCisgICAgeyBQUkVHUlA5MiB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNzAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogNzggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogODAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogODggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogOTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogOTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYjAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYzAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogYzggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZDAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZDggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgUFJFR1JQMTA0IH0sCisgICAgLyogZTAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZTggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZjAgKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgLyogZjggKi8KKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLCB7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsIHsgWFggfSB9LAorICAgIHsgIihiYWQpIiwgeyBYWCB9IH0sCisgIH0KK307CisKKyNkZWZpbmUgSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SIF8oIjxpbnRlcm5hbCBkaXNhc3NlbWJsZXIgZXJyb3I+IikKKworc3RhdGljIHZvaWQKK2NrcHJlZml4ICh2b2lkKQoreworICBpbnQgbmV3cmV4OworICByZXggPSAwOworICBwcmVmaXhlcyA9IDA7CisgIHVzZWRfcHJlZml4ZXMgPSAwOworICByZXhfdXNlZCA9IDA7CisgIHdoaWxlICgxKQorICAgIHsKKyAgICAgIGZldGNoX2RhdGEodGhlX2luZm8sIGNvZGVwICsgMSk7CisgICAgICBuZXdyZXggPSAwOworICAgICAgc3dpdGNoICgqY29kZXApCisJeworCS8qIFJFWCBwcmVmaXhlcyBmYW1pbHkuICAqLworCWNhc2UgMHg0MDoKKwljYXNlIDB4NDE6CisJY2FzZSAweDQyOgorCWNhc2UgMHg0MzoKKwljYXNlIDB4NDQ6CisJY2FzZSAweDQ1OgorCWNhc2UgMHg0NjoKKwljYXNlIDB4NDc6CisJY2FzZSAweDQ4OgorCWNhc2UgMHg0OToKKwljYXNlIDB4NGE6CisJY2FzZSAweDRiOgorCWNhc2UgMHg0YzoKKwljYXNlIDB4NGQ6CisJY2FzZSAweDRlOgorCWNhc2UgMHg0ZjoKKwkgICAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCSAgICAgIG5ld3JleCA9ICpjb2RlcDsKKwkgICAgZWxzZQorCSAgICAgIHJldHVybjsKKwkgIGJyZWFrOworCWNhc2UgMHhmMzoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOworCSAgYnJlYWs7CisJY2FzZSAweGYyOgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX1JFUE5aOworCSAgYnJlYWs7CisJY2FzZSAweGYwOgorCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7CisJICBicmVhazsKKwljYXNlIDB4MmU6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfQ1M7CisJICBicmVhazsKKwljYXNlIDB4MzY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfU1M7CisJICBicmVhazsKKwljYXNlIDB4M2U6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7CisJICBicmVhazsKKwljYXNlIDB4MjY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRVM7CisJICBicmVhazsKKwljYXNlIDB4NjQ6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfRlM7CisJICBicmVhazsKKwljYXNlIDB4NjU6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfR1M7CisJICBicmVhazsKKwljYXNlIDB4NjY6CisJICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKKwkgIGJyZWFrOworCWNhc2UgMHg2NzoKKwkgIHByZWZpeGVzIHw9IFBSRUZJWF9BRERSOworCSAgYnJlYWs7CisJY2FzZSBGV0FJVF9PUENPREU6CisJICAvKiBmd2FpdCBpcyByZWFsbHkgYW4gaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBhcmUgcHJlZml4ZXMKKwkgICAgIGJlZm9yZSB0aGUgZndhaXQsIHRoZXkgYmVsb25nIHRvIHRoZSBmd2FpdCwgKm5vdCogdG8gdGhlCisJICAgICBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICAqLworCSAgaWYgKHByZWZpeGVzIHx8IHJleCkKKwkgICAgeworCSAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKKwkgICAgICBjb2RlcCsrOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCSAgcHJlZml4ZXMgPSBQUkVGSVhfRldBSVQ7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgcmV0dXJuOworCX0KKyAgICAgIC8qIFJleCBpcyBpZ25vcmVkIHdoZW4gZm9sbG93ZWQgYnkgYW5vdGhlciBwcmVmaXguICAqLworICAgICAgaWYgKHJleCkKKwl7CisJICByZXhfdXNlZCA9IHJleDsKKwkgIHJldHVybjsKKwl9CisgICAgICByZXggPSBuZXdyZXg7CisgICAgICBjb2RlcCsrOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmVmaXggYnl0ZSBQUkVGLCBvciBOVUxMIGlmIFBSRUYgaXMgbm90IGEKKyAgIHByZWZpeCBieXRlLiAgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKgorcHJlZml4X25hbWUgKGludCBwcmVmLCBpbnQgc2l6ZWZsYWcpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmV4ZXMgWzE2XSA9CisgICAgeworICAgICAgInJleCIsCQkvKiAweDQwICovCisgICAgICAicmV4LkIiLAkJLyogMHg0MSAqLworICAgICAgInJleC5YIiwJCS8qIDB4NDIgKi8KKyAgICAgICJyZXguWEIiLAkJLyogMHg0MyAqLworICAgICAgInJleC5SIiwJCS8qIDB4NDQgKi8KKyAgICAgICJyZXguUkIiLAkJLyogMHg0NSAqLworICAgICAgInJleC5SWCIsCQkvKiAweDQ2ICovCisgICAgICAicmV4LlJYQiIsCS8qIDB4NDcgKi8KKyAgICAgICJyZXguVyIsCQkvKiAweDQ4ICovCisgICAgICAicmV4LldCIiwJCS8qIDB4NDkgKi8KKyAgICAgICJyZXguV1giLAkJLyogMHg0YSAqLworICAgICAgInJleC5XWEIiLAkvKiAweDRiICovCisgICAgICAicmV4LldSIiwJCS8qIDB4NGMgKi8KKyAgICAgICJyZXguV1JCIiwJLyogMHg0ZCAqLworICAgICAgInJleC5XUlgiLAkvKiAweDRlICovCisgICAgICAicmV4LldSWEIiLAkvKiAweDRmICovCisgICAgfTsKKworICBzd2l0Y2ggKHByZWYpCisgICAgeworICAgIC8qIFJFWCBwcmVmaXhlcyBmYW1pbHkuICAqLworICAgIGNhc2UgMHg0MDoKKyAgICBjYXNlIDB4NDE6CisgICAgY2FzZSAweDQyOgorICAgIGNhc2UgMHg0MzoKKyAgICBjYXNlIDB4NDQ6CisgICAgY2FzZSAweDQ1OgorICAgIGNhc2UgMHg0NjoKKyAgICBjYXNlIDB4NDc6CisgICAgY2FzZSAweDQ4OgorICAgIGNhc2UgMHg0OToKKyAgICBjYXNlIDB4NGE6CisgICAgY2FzZSAweDRiOgorICAgIGNhc2UgMHg0YzoKKyAgICBjYXNlIDB4NGQ6CisgICAgY2FzZSAweDRlOgorICAgIGNhc2UgMHg0ZjoKKyAgICAgIHJldHVybiByZXhlcyBbcHJlZiAtIDB4NDBdOworICAgIGNhc2UgMHhmMzoKKyAgICAgIHJldHVybiAicmVweiI7CisgICAgY2FzZSAweGYyOgorICAgICAgcmV0dXJuICJyZXBueiI7CisgICAgY2FzZSAweGYwOgorICAgICAgcmV0dXJuICJsb2NrIjsKKyAgICBjYXNlIDB4MmU6CisgICAgICByZXR1cm4gImNzIjsKKyAgICBjYXNlIDB4MzY6CisgICAgICByZXR1cm4gInNzIjsKKyAgICBjYXNlIDB4M2U6CisgICAgICByZXR1cm4gImRzIjsKKyAgICBjYXNlIDB4MjY6CisgICAgICByZXR1cm4gImVzIjsKKyAgICBjYXNlIDB4NjQ6CisgICAgICByZXR1cm4gImZzIjsKKyAgICBjYXNlIDB4NjU6CisgICAgICByZXR1cm4gImdzIjsKKyAgICBjYXNlIDB4NjY6CisgICAgICByZXR1cm4gKHNpemVmbGFnICYgREZMQUcpID8gImRhdGExNiIgOiAiZGF0YTMyIjsKKyAgICBjYXNlIDB4Njc6CisgICAgICBpZiAoYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQpCisJcmV0dXJuIChzaXplZmxhZyAmIEFGTEFHKSA/ICJhZGRyMzIiIDogImFkZHI2NCI7CisgICAgICBlbHNlCisJcmV0dXJuIChzaXplZmxhZyAmIEFGTEFHKSA/ICJhZGRyMTYiIDogImFkZHIzMiI7CisgICAgY2FzZSBGV0FJVF9PUENPREU6CisgICAgICByZXR1cm4gImZ3YWl0IjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgY2hhciBvcF9vdXRbTUFYX09QRVJBTkRTXVsxMDBdOworc3RhdGljIGludCBvcF9hZCwgb3BfaW5kZXhbTUFYX09QRVJBTkRTXTsKK3N0YXRpYyBpbnQgdHdvX3NvdXJjZV9vcHM7CitzdGF0aWMgYmZkX3ZtYSBvcF9hZGRyZXNzW01BWF9PUEVSQU5EU107CitzdGF0aWMgYmZkX3ZtYSBvcF9yaXByZWxbTUFYX09QRVJBTkRTXTsKK3N0YXRpYyBiZmRfdm1hIHN0YXJ0X3BjOworCisvKgorICogICBPbiB0aGUgMzg2J3Mgb2YgMTk4OCwgdGhlIG1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uIGlzIDE1IGJ5dGVzLgorICogICAoc2VlIHRvcGljICJSZWR1bmRhbnQgcHJlZml4ZXMiIGluIHRoZSAiRGlmZmVyZW5jZXMgZnJvbSA4MDg2IgorICogICBzZWN0aW9uIG9mIHRoZSAiVmlydHVhbCA4MDg2IE1vZGUiIGNoYXB0ZXIuKQorICogJ3BjJyBzaG91bGQgYmUgdGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnN0cnVjdGlvbiwgaXQgd2lsbAorICogICBiZSB1c2VkIHRvIHByaW50IHRoZSB0YXJnZXQgYWRkcmVzcyBpZiB0aGlzIGlzIGEgcmVsYXRpdmUganVtcCBvciBjYWxsCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuCisgKi8KKworc3RhdGljIGNoYXIgaW50ZWxfc3ludGF4Oworc3RhdGljIGNoYXIgb3Blbl9jaGFyOworc3RhdGljIGNoYXIgY2xvc2VfY2hhcjsKK3N0YXRpYyBjaGFyIHNlcGFyYXRvcl9jaGFyOworc3RhdGljIGNoYXIgc2NhbGVfY2hhcjsKKworaW50CitwcmludF9pbnNuX2kzODYgKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIGludGVsX3N5bnRheCA9IC0xOworCisgIHJldHVybiBwcmludF9pbnNuIChwYywgaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQKK3ByaW50X2luc24gKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOworICBpbnQgaTsKKyAgY2hhciAqb3BfdHh0W01BWF9PUEVSQU5EU107CisgIGludCBuZWVkY29tbWE7CisgIHVuc2lnbmVkIGNoYXIgdXNlc19EQVRBX3ByZWZpeCwgdXNlc19MT0NLX3ByZWZpeDsKKyAgdW5zaWduZWQgY2hhciB1c2VzX1JFUE5aX3ByZWZpeCwgdXNlc19SRVBaX3ByZWZpeDsKKyAgaW50IHNpemVmbGFnOworICBjb25zdCBjaGFyICpwOworICBzdHJ1Y3QgZGlzX3ByaXZhdGUgcHJpdjsKKyAgdW5zaWduZWQgY2hhciBvcDsKKworICBpZiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF94ODZfNjRfaW50ZWxfc3ludGF4CisgICAgICB8fCBpbmZvLT5tYWNoID09IGJmZF9tYWNoX3g4Nl82NCkKKyAgICBhZGRyZXNzX21vZGUgPSBtb2RlXzY0Yml0OworICBlbHNlCisgICAgYWRkcmVzc19tb2RlID0gbW9kZV8zMmJpdDsKKworICBpZiAoaW50ZWxfc3ludGF4ID09IChjaGFyKSAtMSkKKyAgICBpbnRlbF9zeW50YXggPSAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4CisJCSAgICB8fCBpbmZvLT5tYWNoID09IGJmZF9tYWNoX3g4Nl82NF9pbnRlbF9zeW50YXgpOworCisgIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTM4NgorICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF94ODZfNjQKKyAgICAgIHx8IGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheAorICAgICAgfHwgaW5mby0+bWFjaCA9PSBiZmRfbWFjaF94ODZfNjRfaW50ZWxfc3ludGF4KQorICAgIHByaXYub3JpZ19zaXplZmxhZyA9IEFGTEFHIHwgREZMQUc7CisgIGVsc2UgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pODA4NikKKyAgICBwcml2Lm9yaWdfc2l6ZWZsYWcgPSAwOworICBlbHNlCisgICAgYWJvcnQgKCk7CisKKyAgZm9yIChwID0gaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnM7IHAgIT0gTlVMTDsgKQorICAgIHsKKyAgICAgIGlmIChzdHJuY21wIChwLCAieDg2LTY0IiwgNikgPT0gMCkKKwl7CisJICBhZGRyZXNzX21vZGUgPSBtb2RlXzY0Yml0OworCSAgcHJpdi5vcmlnX3NpemVmbGFnID0gQUZMQUcgfCBERkxBRzsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChwLCAiaTM4NiIsIDQpID09IDApCisJeworCSAgYWRkcmVzc19tb2RlID0gbW9kZV8zMmJpdDsKKwkgIHByaXYub3JpZ19zaXplZmxhZyA9IEFGTEFHIHwgREZMQUc7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAocCwgImk4MDg2IiwgNSkgPT0gMCkKKwl7CisJICBhZGRyZXNzX21vZGUgPSBtb2RlXzE2Yml0OworCSAgcHJpdi5vcmlnX3NpemVmbGFnID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChwLCAiaW50ZWwiLCA1KSA9PSAwKQorCXsKKwkgIGludGVsX3N5bnRheCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAocCwgImF0dCIsIDMpID09IDApCisJeworCSAgaW50ZWxfc3ludGF4ID0gMDsKKwl9CisgICAgICBlbHNlIGlmIChzdHJuY21wIChwLCAiYWRkciIsIDQpID09IDApCisJeworCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCSAgICB7CisJICAgICAgaWYgKHBbNF0gPT0gJzMnICYmIHBbNV0gPT0gJzInKQorCQlwcml2Lm9yaWdfc2l6ZWZsYWcgJj0gfkFGTEFHOworCSAgICAgIGVsc2UgaWYgKHBbNF0gPT0gJzYnICYmIHBbNV0gPT0gJzQnKQorCQlwcml2Lm9yaWdfc2l6ZWZsYWcgfD0gQUZMQUc7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGlmIChwWzRdID09ICcxJyAmJiBwWzVdID09ICc2JykKKwkJcHJpdi5vcmlnX3NpemVmbGFnICY9IH5BRkxBRzsKKwkgICAgICBlbHNlIGlmIChwWzRdID09ICczJyAmJiBwWzVdID09ICcyJykKKwkJcHJpdi5vcmlnX3NpemVmbGFnIHw9IEFGTEFHOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAocCwgImRhdGEiLCA0KSA9PSAwKQorCXsKKwkgIGlmIChwWzRdID09ICcxJyAmJiBwWzVdID09ICc2JykKKwkgICAgcHJpdi5vcmlnX3NpemVmbGFnICY9IH5ERkxBRzsKKwkgIGVsc2UgaWYgKHBbNF0gPT0gJzMnICYmIHBbNV0gPT0gJzInKQorCSAgICBwcml2Lm9yaWdfc2l6ZWZsYWcgfD0gREZMQUc7CisJfQorICAgICAgZWxzZSBpZiAoc3RybmNtcCAocCwgInN1ZmZpeCIsIDYpID09IDApCisJcHJpdi5vcmlnX3NpemVmbGFnIHw9IFNVRkZJWF9BTFdBWVM7CisKKyAgICAgIHAgPSBzdHJjaHIgKHAsICcsJyk7CisgICAgICBpZiAocCAhPSBOVUxMKQorCXArKzsKKyAgICB9CisKKyAgaWYgKGludGVsX3N5bnRheCkKKyAgICB7CisgICAgICBuYW1lczY0ID0gaW50ZWxfbmFtZXM2NDsKKyAgICAgIG5hbWVzMzIgPSBpbnRlbF9uYW1lczMyOworICAgICAgbmFtZXMxNiA9IGludGVsX25hbWVzMTY7CisgICAgICBuYW1lczggPSBpbnRlbF9uYW1lczg7CisgICAgICBuYW1lczhyZXggPSBpbnRlbF9uYW1lczhyZXg7CisgICAgICBuYW1lc19zZWcgPSBpbnRlbF9uYW1lc19zZWc7CisgICAgICBpbmRleDE2ID0gaW50ZWxfaW5kZXgxNjsKKyAgICAgIG9wZW5fY2hhciA9ICdbJzsKKyAgICAgIGNsb3NlX2NoYXIgPSAnXSc7CisgICAgICBzZXBhcmF0b3JfY2hhciA9ICcrJzsKKyAgICAgIHNjYWxlX2NoYXIgPSAnKic7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgbmFtZXM2NCA9IGF0dF9uYW1lczY0OworICAgICAgbmFtZXMzMiA9IGF0dF9uYW1lczMyOworICAgICAgbmFtZXMxNiA9IGF0dF9uYW1lczE2OworICAgICAgbmFtZXM4ID0gYXR0X25hbWVzODsKKyAgICAgIG5hbWVzOHJleCA9IGF0dF9uYW1lczhyZXg7CisgICAgICBuYW1lc19zZWcgPSBhdHRfbmFtZXNfc2VnOworICAgICAgaW5kZXgxNiA9IGF0dF9pbmRleDE2OworICAgICAgb3Blbl9jaGFyID0gJygnOworICAgICAgY2xvc2VfY2hhciA9ICAnKSc7CisgICAgICBzZXBhcmF0b3JfY2hhciA9ICcsJzsKKyAgICAgIHNjYWxlX2NoYXIgPSAnLCc7CisgICAgfQorCisgIC8qIFRoZSBvdXRwdXQgbG9va3MgYmV0dGVyIGlmIHdlIHB1dCA3IGJ5dGVzIG9uIGEgbGluZSwgc2luY2UgdGhhdAorICAgICBwdXRzIG1vc3QgbG9uZyB3b3JkIGluc3RydWN0aW9ucyBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KKyAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA3OworCisgIGluZm8tPnByaXZhdGVfZGF0YSA9ICZwcml2OworICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOworICBwcml2Lmluc25fc3RhcnQgPSBwYzsKKworICBvYnVmWzBdID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVSQU5EUzsgKytpKQorICAgIHsKKyAgICAgIG9wX291dFtpXVswXSA9IDA7CisgICAgICBvcF9pbmRleFtpXSA9IC0xOworICAgIH0KKworICB0aGVfaW5mbyA9IGluZm87CisgIHN0YXJ0X3BjID0gcGM7CisgIHN0YXJ0X2NvZGVwID0gcHJpdi50aGVfYnVmZmVyOworICBjb2RlcCA9IHByaXYudGhlX2J1ZmZlcjsKKworICBpZiAoc2lnc2V0am1wKHByaXYuYmFpbG91dCwgMCkgIT0gMCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICAvKiBHZXR0aW5nIGhlcmUgbWVhbnMgd2UgdHJpZWQgZm9yIGRhdGEgYnV0IGRpZG4ndCBnZXQgaXQuICBUaGF0CisJIG1lYW5zIHdlIGhhdmUgYW4gaW5jb21wbGV0ZSBpbnN0cnVjdGlvbiBvZiBzb21lIHNvcnQuICBKdXN0CisJIHByaW50IHRoZSBmaXJzdCBieXRlIGFzIGEgcHJlZml4IG9yIGEgLmJ5dGUgcHNldWRvLW9wLiAgKi8KKyAgICAgIGlmIChjb2RlcCA+IHByaXYudGhlX2J1ZmZlcikKKwl7CisJICBuYW1lID0gcHJlZml4X25hbWUgKHByaXYudGhlX2J1ZmZlclswXSwgcHJpdi5vcmlnX3NpemVmbGFnKTsKKwkgIGlmIChuYW1lICE9IE5VTEwpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qIEp1c3QgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSAuYnl0ZSBpbnN0cnVjdGlvbi4gICovCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIuYnl0ZSAweCV4IiwKKwkJCQkgICAgICh1bnNpZ25lZCBpbnQpIHByaXYudGhlX2J1ZmZlclswXSk7CisJICAgIH0KKworCSAgcmV0dXJuIDE7CisJfQorCisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIG9idWZwID0gb2J1ZjsKKyAgY2twcmVmaXggKCk7CisKKyAgaW5zbl9jb2RlcCA9IGNvZGVwOworICBzaXplZmxhZyA9IHByaXYub3JpZ19zaXplZmxhZzsKKworICBmZXRjaF9kYXRhKGluZm8sIGNvZGVwICsgMSk7CisgIHR3b19zb3VyY2Vfb3BzID0gKCpjb2RlcCA9PSAweDYyKSB8fCAoKmNvZGVwID09IDB4YzgpOworCisgIGlmICgoKHByZWZpeGVzICYgUFJFRklYX0ZXQUlUKQorICAgICAgICYmICgoKmNvZGVwIDwgMHhkOCkgfHwgKCpjb2RlcCA+IDB4ZGYpKSkKKyAgICAgIHx8IChyZXggJiYgcmV4X3VzZWQpKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIC8qIGZ3YWl0IG5vdCBmb2xsb3dlZCBieSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbiwgb3IgcmV4IGZvbGxvd2VkCisJIGJ5IG90aGVyIHByZWZpeGVzLiAgUHJpbnQgdGhlIGZpcnN0IHByZWZpeC4gICovCisgICAgICBuYW1lID0gcHJlZml4X25hbWUgKHByaXYudGhlX2J1ZmZlclswXSwgcHJpdi5vcmlnX3NpemVmbGFnKTsKKyAgICAgIGlmIChuYW1lID09IE5VTEwpCisJbmFtZSA9IElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUjsKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBvcCA9IDA7CisgIGlmICgqY29kZXAgPT0gMHgwZikKKyAgICB7CisgICAgICB1bnNpZ25lZCBjaGFyIHRocmVlYnl0ZTsKKyAgICAgIGZldGNoX2RhdGEoaW5mbywgY29kZXAgKyAyKTsKKyAgICAgIHRocmVlYnl0ZSA9ICorK2NvZGVwOworICAgICAgZHAgPSAmZGlzMzg2X3R3b2J5dGVbdGhyZWVieXRlXTsKKyAgICAgIG5lZWRfbW9kcm0gPSB0d29ieXRlX2hhc19tb2RybVsqY29kZXBdOworICAgICAgdXNlc19EQVRBX3ByZWZpeCA9IHR3b2J5dGVfdXNlc19EQVRBX3ByZWZpeFsqY29kZXBdOworICAgICAgdXNlc19SRVBOWl9wcmVmaXggPSB0d29ieXRlX3VzZXNfUkVQTlpfcHJlZml4Wypjb2RlcF07CisgICAgICB1c2VzX1JFUFpfcHJlZml4ID0gdHdvYnl0ZV91c2VzX1JFUFpfcHJlZml4Wypjb2RlcF07CisgICAgICB1c2VzX0xPQ0tfcHJlZml4ID0gKCpjb2RlcCAmIH4weDAyKSA9PSAweDIwOworICAgICAgY29kZXArKzsKKyAgICAgIGlmIChkcC0+bmFtZSA9PSBOVUxMICYmIGRwLT5vcFswXS5ieXRlbW9kZSA9PSBJU18zQllURV9PUENPREUpCisJeworICAgICAgICAgIGZldGNoX2RhdGEoaW5mbywgY29kZXAgKyAyKTsKKwkgIG9wID0gKmNvZGVwKys7CisJICBzd2l0Y2ggKHRocmVlYnl0ZSkKKwkgICAgeworCSAgICBjYXNlIDB4Mzg6CisJICAgICAgdXNlc19EQVRBX3ByZWZpeCA9IHRocmVlYnl0ZV8weDM4X3VzZXNfREFUQV9wcmVmaXhbb3BdOworCSAgICAgIHVzZXNfUkVQTlpfcHJlZml4ID0gdGhyZWVieXRlXzB4MzhfdXNlc19SRVBOWl9wcmVmaXhbb3BdOworCSAgICAgIHVzZXNfUkVQWl9wcmVmaXggPSB0aHJlZWJ5dGVfMHgzOF91c2VzX1JFUFpfcHJlZml4W29wXTsKKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAweDNhOgorCSAgICAgIHVzZXNfREFUQV9wcmVmaXggPSB0aHJlZWJ5dGVfMHgzYV91c2VzX0RBVEFfcHJlZml4W29wXTsKKwkgICAgICB1c2VzX1JFUE5aX3ByZWZpeCA9IHRocmVlYnl0ZV8weDNhX3VzZXNfUkVQTlpfcHJlZml4W29wXTsKKwkgICAgICB1c2VzX1JFUFpfcHJlZml4ID0gdGhyZWVieXRlXzB4M2FfdXNlc19SRVBaX3ByZWZpeFtvcF07CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgYnJlYWs7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZHAgPSAmZGlzMzg2Wypjb2RlcF07CisgICAgICBuZWVkX21vZHJtID0gb25lYnl0ZV9oYXNfbW9kcm1bKmNvZGVwXTsKKyAgICAgIHVzZXNfREFUQV9wcmVmaXggPSAwOworICAgICAgdXNlc19SRVBOWl9wcmVmaXggPSAwOworICAgICAgLyogcGF1c2UgaXMgMHhmMyAweDkwLiAgKi8KKyAgICAgIHVzZXNfUkVQWl9wcmVmaXggPSAqY29kZXAgPT0gMHg5MDsKKyAgICAgIHVzZXNfTE9DS19wcmVmaXggPSAwOworICAgICAgY29kZXArKzsKKyAgICB9CisKKyAgaWYgKCF1c2VzX1JFUFpfcHJlZml4ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKSkKKyAgICB7CisgICAgICBvYXBwZW5kICgicmVweiAiKTsKKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX1JFUFo7CisgICAgfQorICBpZiAoIXVzZXNfUkVQTlpfcHJlZml4ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWikpCisgICAgeworICAgICAgb2FwcGVuZCAoInJlcG56ICIpOworICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7CisgICAgfQorCisgIGlmICghdXNlc19MT0NLX3ByZWZpeCAmJiAocHJlZml4ZXMgJiBQUkVGSVhfTE9DSykpCisgICAgeworICAgICAgb2FwcGVuZCAoImxvY2sgIik7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOworICAgIH0KKworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikKKyAgICB7CisgICAgICBzaXplZmxhZyBePSBBRkxBRzsKKyAgICAgIGlmIChkcC0+b3BbMl0uYnl0ZW1vZGUgIT0gbG9vcF9qY3h6X21vZGUgfHwgaW50ZWxfc3ludGF4KQorCXsKKwkgIGlmICgoc2l6ZWZsYWcgJiBBRkxBRykgfHwgYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQpCisJICAgIG9hcHBlbmQgKCJhZGRyMzIgIik7CisJICBlbHNlCisJICAgIG9hcHBlbmQgKCJhZGRyMTYgIik7CisJICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOworCX0KKyAgICB9CisKKyAgaWYgKCF1c2VzX0RBVEFfcHJlZml4ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKSkKKyAgICB7CisgICAgICBzaXplZmxhZyBePSBERkxBRzsKKyAgICAgIGlmIChkcC0+b3BbMl0uYnl0ZW1vZGUgPT0gY29uZF9qdW1wX21vZGUKKwkgICYmIGRwLT5vcFswXS5ieXRlbW9kZSA9PSB2X21vZGUKKwkgICYmICFpbnRlbF9zeW50YXgpCisJeworCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJICAgIG9hcHBlbmQgKCJkYXRhMzIgIik7CisJICBlbHNlCisJICAgIG9hcHBlbmQgKCJkYXRhMTYgIik7CisJICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EQVRBOworCX0KKyAgICB9CisKKyAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPm9wWzBdLmJ5dGVtb2RlID09IElTXzNCWVRFX09QQ09ERSkKKyAgICB7CisgICAgICBkcCA9ICZ0aHJlZV9ieXRlX3RhYmxlW2RwLT5vcFsxXS5ieXRlbW9kZV1bb3BdOworICAgICAgbW9kcm0ubW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7CisgICAgICBtb2RybS5yZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKKyAgICAgIG1vZHJtLnJtID0gKmNvZGVwICYgNzsKKyAgICB9CisgIGVsc2UgaWYgKG5lZWRfbW9kcm0pCisgICAgeworICAgICAgZmV0Y2hfZGF0YShpbmZvLCBjb2RlcCArIDEpOworICAgICAgbW9kcm0ubW9kID0gKCpjb2RlcCA+PiA2KSAmIDM7CisgICAgICBtb2RybS5yZWcgPSAoKmNvZGVwID4+IDMpICYgNzsKKyAgICAgIG1vZHJtLnJtID0gKmNvZGVwICYgNzsKKyAgICB9CisKKyAgaWYgKGRwLT5uYW1lID09IE5VTEwgJiYgZHAtPm9wWzBdLmJ5dGVtb2RlID09IEZMT0FUQ09ERSkKKyAgICB7CisgICAgICBkb2Zsb2F0IChzaXplZmxhZyk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaW50IGluZGV4OworICAgICAgaWYgKGRwLT5uYW1lID09IE5VTEwpCisJeworCSAgc3dpdGNoIChkcC0+b3BbMF0uYnl0ZW1vZGUpCisJICAgIHsKKwkgICAgY2FzZSBVU0VfR1JPVVBTOgorCSAgICAgIGRwID0gJmdycHNbZHAtPm9wWzFdLmJ5dGVtb2RlXVttb2RybS5yZWddOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgVVNFX1BSRUZJWF9VU0VSX1RBQkxFOgorCSAgICAgIGluZGV4ID0gMDsKKwkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKTsKKwkgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikKKwkJaW5kZXggPSAxOworCSAgICAgIGVsc2UKKwkJeworCQkgIC8qIFdlIHNob3VsZCBjaGVjayBQUkVGSVhfUkVQTlogYW5kIFBSRUZJWF9SRVBaCisJCSAgICAgYmVmb3JlIFBSRUZJWF9EQVRBLiAgKi8KKwkJICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWik7CisJCSAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUE5aKQorCQkgICAgaW5kZXggPSAzOworCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJCSAgICAgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQorCQkJaW5kZXggPSAyOworCQkgICAgfQorCQl9CisJICAgICAgZHAgPSAmcHJlZml4X3VzZXJfdGFibGVbZHAtPm9wWzFdLmJ5dGVtb2RlXVtpbmRleF07CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSBYODZfNjRfU1BFQ0lBTDoKKwkgICAgICBpbmRleCA9IGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ID8gMSA6IDA7CisJICAgICAgZHAgPSAmeDg2XzY0X3RhYmxlW2RwLT5vcFsxXS5ieXRlbW9kZV1baW5kZXhdOworCSAgICAgIGJyZWFrOworCisJICAgIGRlZmF1bHQ6CisJICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKworICAgICAgaWYgKHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpID09IDApCisgICAgICAgIHsKKwkgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1BFUkFORFM7ICsraSkKKwkgICAgeworCSAgICAgIG9idWZwID0gb3Bfb3V0W2ldOworCSAgICAgIG9wX2FkID0gTUFYX09QRVJBTkRTIC0gMSAtIGk7CisJICAgICAgaWYgKGRwLT5vcFtpXS5ydG4pCisJCSgqZHAtPm9wW2ldLnJ0bikgKGRwLT5vcFtpXS5ieXRlbW9kZSwgc2l6ZWZsYWcpOworCSAgICB9CisJfQorICAgIH0KKworICAvKiBTZWUgaWYgYW55IHByZWZpeGVzIHdlcmUgbm90IHVzZWQuICBJZiBzbywgcHJpbnQgdGhlIGZpcnN0IG9uZQorICAgICBzZXBhcmF0ZWx5LiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UnbGwgd2luZCB1cCBwcmludGluZyBhbgorICAgICBpbnN0cnVjdGlvbiBzdHJlYW0gd2hpY2ggZG9lcyBub3QgcHJlY2lzZWx5IGNvcnJlc3BvbmQgdG8gdGhlCisgICAgIGJ5dGVzIHdlIGFyZSBkaXNhc3NlbWJsaW5nLiAgKi8KKyAgaWYgKChwcmVmaXhlcyAmIH51c2VkX3ByZWZpeGVzKSAhPSAwKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgIG5hbWUgPSBwcmVmaXhfbmFtZSAocHJpdi50aGVfYnVmZmVyWzBdLCBwcml2Lm9yaWdfc2l6ZWZsYWcpOworICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKwluYW1lID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOworICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBpZiAocmV4ICYgfnJleF91c2VkKQorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICBuYW1lID0gcHJlZml4X25hbWUgKHJleCB8IDB4NDAsIHByaXYub3JpZ19zaXplZmxhZyk7CisgICAgICBpZiAobmFtZSA9PSBOVUxMKQorCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsIG5hbWUpOworICAgIH0KKworICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOworICBmb3IgKGkgPSBzdHJsZW4gKG9idWYpOyBpIDwgNjsgaSsrKQorICAgIG9hcHBlbmQgKCIgIik7CisgIG9hcHBlbmQgKCIgIik7CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvYnVmKTsKKworICAvKiBUaGUgZW50ZXIgYW5kIGJvdW5kIGluc3RydWN0aW9ucyBhcmUgcHJpbnRlZCB3aXRoIG9wZXJhbmRzIGluIHRoZSBzYW1lCisgICAgIG9yZGVyIGFzIHRoZSBpbnRlbCBib29rOyBldmVyeXRoaW5nIGVsc2UgaXMgcHJpbnRlZCBpbiByZXZlcnNlIG9yZGVyLiAgKi8KKyAgaWYgKGludGVsX3N5bnRheCB8fCB0d29fc291cmNlX29wcykKKyAgICB7CisgICAgICBiZmRfdm1hIHJpcHJlbDsKKworICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVSQU5EUzsgKytpKQorICAgICAgICBvcF90eHRbaV0gPSBvcF9vdXRbaV07CisKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoTUFYX09QRVJBTkRTID4+IDEpOyArK2kpCisJeworICAgICAgICAgIG9wX2FkID0gb3BfaW5kZXhbaV07CisgICAgICAgICAgb3BfaW5kZXhbaV0gPSBvcF9pbmRleFtNQVhfT1BFUkFORFMgLSAxIC0gaV07CisgICAgICAgICAgb3BfaW5kZXhbTUFYX09QRVJBTkRTIC0gMSAtIGldID0gb3BfYWQ7CisJICByaXByZWwgPSBvcF9yaXByZWxbaV07CisJICBvcF9yaXByZWxbaV0gPSBvcF9yaXByZWwgW01BWF9PUEVSQU5EUyAtIDEgLSBpXTsKKwkgIG9wX3JpcHJlbFtNQVhfT1BFUkFORFMgLSAxIC0gaV0gPSByaXByZWw7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1BFUkFORFM7ICsraSkKKyAgICAgICAgb3BfdHh0W01BWF9PUEVSQU5EUyAtIDEgLSBpXSA9IG9wX291dFtpXTsKKyAgICB9CisKKyAgbmVlZGNvbW1hID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVSQU5EUzsgKytpKQorICAgIGlmICgqb3BfdHh0W2ldKQorICAgICAgeworCWlmIChuZWVkY29tbWEpCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKwlpZiAob3BfaW5kZXhbaV0gIT0gLTEgJiYgIW9wX3JpcHJlbFtpXSkKKwkgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbaV1dLCBpbmZvKTsKKwllbHNlCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3BfdHh0W2ldKTsKKwluZWVkY29tbWEgPSAxOworICAgICAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBNQVhfT1BFUkFORFM7IGkrKykKKyAgICBpZiAob3BfaW5kZXhbaV0gIT0gLTEgJiYgb3BfcmlwcmVsW2ldKQorICAgICAgeworCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICAgICAgICAjICIpOworCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIChzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXAKKwkJCQkJCSsgb3BfYWRkcmVzc1tvcF9pbmRleFtpXV0pLCBpbmZvKTsKKwlicmVhazsKKyAgICAgIH0KKyAgcmV0dXJuIGNvZGVwIC0gcHJpdi50aGVfYnVmZmVyOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmxvYXRfbWVtW10gPSB7CisgIC8qIGQ4ICovCisgICJmYWRke3N8fHN8fSIsCisgICJmbXVse3N8fHN8fSIsCisgICJmY29te3N8fHN8fSIsCisgICJmY29tcHtzfHxzfH0iLAorICAiZnN1YntzfHxzfH0iLAorICAiZnN1YnJ7c3x8c3x9IiwKKyAgImZkaXZ7c3x8c3x9IiwKKyAgImZkaXZye3N8fHN8fSIsCisgIC8qIGQ5ICovCisgICJmbGR7c3x8c3x9IiwKKyAgIihiYWQpIiwKKyAgImZzdHtzfHxzfH0iLAorICAiZnN0cHtzfHxzfH0iLAorICAiZmxkZW52SUMiLAorICAiZmxkY3ciLAorICAiZk5zdGVudklDIiwKKyAgImZOc3RjdyIsCisgIC8qIGRhICovCisgICJmaWFkZHtsfHxsfH0iLAorICAiZmltdWx7bHx8bHx9IiwKKyAgImZpY29te2x8fGx8fSIsCisgICJmaWNvbXB7bHx8bHx9IiwKKyAgImZpc3Vie2x8fGx8fSIsCisgICJmaXN1YnJ7bHx8bHx9IiwKKyAgImZpZGl2e2x8fGx8fSIsCisgICJmaWRpdnJ7bHx8bHx9IiwKKyAgLyogZGIgKi8KKyAgImZpbGR7bHx8bHx9IiwKKyAgImZpc3R0cHtsfHxsfH0iLAorICAiZmlzdHtsfHxsfH0iLAorICAiZmlzdHB7bHx8bHx9IiwKKyAgIihiYWQpIiwKKyAgImZsZHt0fHx0fH0iLAorICAiKGJhZCkiLAorICAiZnN0cHt0fHx0fH0iLAorICAvKiBkYyAqLworICAiZmFkZHtsfHxsfH0iLAorICAiZm11bHtsfHxsfH0iLAorICAiZmNvbXtsfHxsfH0iLAorICAiZmNvbXB7bHx8bHx9IiwKKyAgImZzdWJ7bHx8bHx9IiwKKyAgImZzdWJye2x8fGx8fSIsCisgICJmZGl2e2x8fGx8fSIsCisgICJmZGl2cntsfHxsfH0iLAorICAvKiBkZCAqLworICAiZmxke2x8fGx8fSIsCisgICJmaXN0dHB7bGx8fGxsfH0iLAorICAiZnN0e2x8fGx8fSIsCisgICJmc3Rwe2x8fGx8fSIsCisgICJmcnN0b3JJQyIsCisgICIoYmFkKSIsCisgICJmTnNhdmVJQyIsCisgICJmTnN0c3ciLAorICAvKiBkZSAqLworICAiZmlhZGQiLAorICAiZmltdWwiLAorICAiZmljb20iLAorICAiZmljb21wIiwKKyAgImZpc3ViIiwKKyAgImZpc3ViciIsCisgICJmaWRpdiIsCisgICJmaWRpdnIiLAorICAvKiBkZiAqLworICAiZmlsZCIsCisgICJmaXN0dHAiLAorICAiZmlzdCIsCisgICJmaXN0cCIsCisgICJmYmxkIiwKKyAgImZpbGR7bGx8fGxsfH0iLAorICAiZmJzdHAiLAorICAiZmlzdHB7bGx8fGxsfH0iLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmxvYXRfbWVtX21vZGVbXSA9IHsKKyAgLyogZDggKi8KKyAgZF9tb2RlLAorICBkX21vZGUsCisgIGRfbW9kZSwKKyAgZF9tb2RlLAorICBkX21vZGUsCisgIGRfbW9kZSwKKyAgZF9tb2RlLAorICBkX21vZGUsCisgIC8qIGQ5ICovCisgIGRfbW9kZSwKKyAgMCwKKyAgZF9tb2RlLAorICBkX21vZGUsCisgIDAsCisgIHdfbW9kZSwKKyAgMCwKKyAgd19tb2RlLAorICAvKiBkYSAqLworICBkX21vZGUsCisgIGRfbW9kZSwKKyAgZF9tb2RlLAorICBkX21vZGUsCisgIGRfbW9kZSwKKyAgZF9tb2RlLAorICBkX21vZGUsCisgIGRfbW9kZSwKKyAgLyogZGIgKi8KKyAgZF9tb2RlLAorICBkX21vZGUsCisgIGRfbW9kZSwKKyAgZF9tb2RlLAorICAwLAorICB0X21vZGUsCisgIDAsCisgIHRfbW9kZSwKKyAgLyogZGMgKi8KKyAgcV9tb2RlLAorICBxX21vZGUsCisgIHFfbW9kZSwKKyAgcV9tb2RlLAorICBxX21vZGUsCisgIHFfbW9kZSwKKyAgcV9tb2RlLAorICBxX21vZGUsCisgIC8qIGRkICovCisgIHFfbW9kZSwKKyAgcV9tb2RlLAorICBxX21vZGUsCisgIHFfbW9kZSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgd19tb2RlLAorICAvKiBkZSAqLworICB3X21vZGUsCisgIHdfbW9kZSwKKyAgd19tb2RlLAorICB3X21vZGUsCisgIHdfbW9kZSwKKyAgd19tb2RlLAorICB3X21vZGUsCisgIHdfbW9kZSwKKyAgLyogZGYgKi8KKyAgd19tb2RlLAorICB3X21vZGUsCisgIHdfbW9kZSwKKyAgd19tb2RlLAorICB0X21vZGUsCisgIHFfbW9kZSwKKyAgdF9tb2RlLAorICBxX21vZGUKK307CisKKyNkZWZpbmUgU1QgeyBPUF9TVCwgMCB9CisjZGVmaW5lIFNUaSB7IE9QX1NUaSwgMCB9CisKKyNkZWZpbmUgRkdSUGQ5XzIgTlVMTCwgeyB7IE5VTEwsIDAgfSB9CisjZGVmaW5lIEZHUlBkOV80IE5VTEwsIHsgeyBOVUxMLCAxIH0gfQorI2RlZmluZSBGR1JQZDlfNSBOVUxMLCB7IHsgTlVMTCwgMiB9IH0KKyNkZWZpbmUgRkdSUGQ5XzYgTlVMTCwgeyB7IE5VTEwsIDMgfSB9CisjZGVmaW5lIEZHUlBkOV83IE5VTEwsIHsgeyBOVUxMLCA0IH0gfQorI2RlZmluZSBGR1JQZGFfNSBOVUxMLCB7IHsgTlVMTCwgNSB9IH0KKyNkZWZpbmUgRkdSUGRiXzQgTlVMTCwgeyB7IE5VTEwsIDYgfSB9CisjZGVmaW5lIEZHUlBkZV8zIE5VTEwsIHsgeyBOVUxMLCA3IH0gfQorI2RlZmluZSBGR1JQZGZfNCBOVUxMLCB7IHsgTlVMTCwgOCB9IH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZmxvYXRfcmVnW11bOF0gPSB7CisgIC8qIGQ4ICovCisgIHsKKyAgICB7ICJmYWRkIiwJeyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmbXVsIiwJeyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmY29tIiwJeyBTVGkgfSB9LAorICAgIHsgImZjb21wIiwJeyBTVGkgfSB9LAorICAgIHsgImZzdWIiLAl7IFNULCBTVGkgfSB9LAorICAgIHsgImZzdWJyIiwJeyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmZGl2IiwJeyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmZGl2ciIsCXsgU1QsIFNUaSB9IH0sCisgIH0sCisgIC8qIGQ5ICovCisgIHsKKyAgICB7ICJmbGQiLAl7IFNUaSB9IH0sCisgICAgeyAiZnhjaCIsCXsgU1RpIH0gfSwKKyAgICB7IEZHUlBkOV8yIH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7IEZHUlBkOV80IH0sCisgICAgeyBGR1JQZDlfNSB9LAorICAgIHsgRkdSUGQ5XzYgfSwKKyAgICB7IEZHUlBkOV83IH0sCisgIH0sCisgIC8qIGRhICovCisgIHsKKyAgICB7ICJmY21vdmIiLAl7IFNULCBTVGkgfSB9LAorICAgIHsgImZjbW92ZSIsCXsgU1QsIFNUaSB9IH0sCisgICAgeyAiZmNtb3ZiZSIseyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmY21vdnUiLAl7IFNULCBTVGkgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyBGR1JQZGFfNSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgfSwKKyAgLyogZGIgKi8KKyAgeworICAgIHsgImZjbW92bmIiLHsgU1QsIFNUaSB9IH0sCisgICAgeyAiZmNtb3ZuZSIseyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmY21vdm5iZSIseyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmY21vdm51Iix7IFNULCBTVGkgfSB9LAorICAgIHsgRkdSUGRiXzQgfSwKKyAgICB7ICJmdWNvbWkiLAl7IFNULCBTVGkgfSB9LAorICAgIHsgImZjb21pIiwJeyBTVCwgU1RpIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorICAvKiBkYyAqLworICB7CisgICAgeyAiZmFkZCIsCXsgU1RpLCBTVCB9IH0sCisgICAgeyAiZm11bCIsCXsgU1RpLCBTVCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorI2lmIFNZU1YzODZfQ09NUEFUCisgICAgeyAiZnN1YiIsCXsgU1RpLCBTVCB9IH0sCisgICAgeyAiZnN1YnIiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZkaXYiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZkaXZyIiwJeyBTVGksIFNUIH0gfSwKKyNlbHNlCisgICAgeyAiZnN1YnIiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZzdWIiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZkaXZyIiwJeyBTVGksIFNUIH0gfSwKKyAgICB7ICJmZGl2IiwJeyBTVGksIFNUIH0gfSwKKyNlbmRpZgorICB9LAorICAvKiBkZCAqLworICB7CisgICAgeyAiZmZyZWUiLAl7IFNUaSB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICJmc3QiLAl7IFNUaSB9IH0sCisgICAgeyAiZnN0cCIsCXsgU1RpIH0gfSwKKyAgICB7ICJmdWNvbSIsCXsgU1RpIH0gfSwKKyAgICB7ICJmdWNvbXAiLAl7IFNUaSB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICB9LAorICAvKiBkZSAqLworICB7CisgICAgeyAiZmFkZHAiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZtdWxwIiwJeyBTVGksIFNUIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgRkdSUGRlXzMgfSwKKyNpZiBTWVNWMzg2X0NPTVBBVAorICAgIHsgImZzdWJwIiwJeyBTVGksIFNUIH0gfSwKKyAgICB7ICJmc3VicnAiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZkaXZwIiwJeyBTVGksIFNUIH0gfSwKKyAgICB7ICJmZGl2cnAiLAl7IFNUaSwgU1QgfSB9LAorI2Vsc2UKKyAgICB7ICJmc3VicnAiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZzdWJwIiwJeyBTVGksIFNUIH0gfSwKKyAgICB7ICJmZGl2cnAiLAl7IFNUaSwgU1QgfSB9LAorICAgIHsgImZkaXZwIiwJeyBTVGksIFNUIH0gfSwKKyNlbmRpZgorICB9LAorICAvKiBkZiAqLworICB7CisgICAgeyAiZmZyZWVwIiwJeyBTVGkgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgICAgeyAiKGJhZCkiLAl7IFhYIH0gfSwKKyAgICB7ICIoYmFkKSIsCXsgWFggfSB9LAorICAgIHsgRkdSUGRmXzQgfSwKKyAgICB7ICJmdWNvbWlwIiwgeyBTVCwgU1RpIH0gfSwKKyAgICB7ICJmY29taXAiLCB7IFNULCBTVGkgfSB9LAorICAgIHsgIihiYWQpIiwJeyBYWCB9IH0sCisgIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZmdycHNbXVs4XSA9IHsKKyAgLyogZDlfMiAgMCAqLworICB7CisgICAgImZub3AiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZDlfNCAgMSAqLworICB7CisgICAgImZjaHMiLCJmYWJzIiwiKGJhZCkiLCIoYmFkKSIsImZ0c3QiLCJmeGFtIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZDlfNSAgMiAqLworICB7CisgICAgImZsZDEiLCJmbGRsMnQiLCJmbGRsMmUiLCJmbGRwaSIsImZsZGxnMiIsImZsZGxuMiIsImZsZHoiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZDlfNiAgMyAqLworICB7CisgICAgImYyeG0xIiwiZnlsMngiLCJmcHRhbiIsImZwYXRhbiIsImZ4dHJhY3QiLCJmcHJlbTEiLCJmZGVjc3RwIiwiZmluY3N0cCIsCisgIH0sCisKKyAgLyogZDlfNyAgNCAqLworICB7CisgICAgImZwcmVtIiwiZnlsMnhwMSIsImZzcXJ0IiwiZnNpbmNvcyIsImZybmRpbnQiLCJmc2NhbGUiLCJmc2luIiwiZmNvcyIsCisgIH0sCisKKyAgLyogZGFfNSAgNSAqLworICB7CisgICAgIihiYWQpIiwiZnVjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZGJfNCAgNiAqLworICB7CisgICAgImZlbmkoMjg3IG9ubHkpIiwiZmRpc2koMjg3IG9ubHkpIiwiZk5jbGV4IiwiZk5pbml0IiwKKyAgICAiZk5zZXRwbSgyODcgb25seSkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAorICB9LAorCisgIC8qIGRlXzMgIDcgKi8KKyAgeworICAgICIoYmFkKSIsImZjb21wcCIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCisgIH0sCisKKyAgLyogZGZfNCAgOCAqLworICB7CisgICAgImZOc3RzdyIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKKyAgfSwKK307CisKK3N0YXRpYyB2b2lkCitkb2Zsb2F0IChpbnQgc2l6ZWZsYWcpCit7CisgIGNvbnN0IHN0cnVjdCBkaXMzODYgKmRwOworICB1bnNpZ25lZCBjaGFyIGZsb2F0b3A7CisKKyAgZmxvYXRvcCA9IGNvZGVwWy0xXTsKKworICBpZiAobW9kcm0ubW9kICE9IDMpCisgICAgeworICAgICAgaW50IGZwX2luZHggPSAoZmxvYXRvcCAtIDB4ZDgpICogOCArIG1vZHJtLnJlZzsKKworICAgICAgcHV0b3AgKGZsb2F0X21lbVtmcF9pbmR4XSwgc2l6ZWZsYWcpOworICAgICAgb2J1ZnAgPSBvcF9vdXRbMF07CisgICAgICBvcF9hZCA9IDI7CisgICAgICBPUF9FIChmbG9hdF9tZW1fbW9kZVtmcF9pbmR4XSwgc2l6ZWZsYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgLyogU2tpcCBtb2Qvcm0gYnl0ZS4gICovCisgIE1PRFJNX0NIRUNLOworICBjb2RlcCsrOworCisgIGRwID0gJmZsb2F0X3JlZ1tmbG9hdG9wIC0gMHhkOF1bbW9kcm0ucmVnXTsKKyAgaWYgKGRwLT5uYW1lID09IE5VTEwpCisgICAgeworICAgICAgcHV0b3AgKGZncnBzW2RwLT5vcFswXS5ieXRlbW9kZV1bbW9kcm0ucm1dLCBzaXplZmxhZyk7CisKKyAgICAgIC8qIEluc3RydWN0aW9uIGZuc3RzdyBpcyBvbmx5IG9uZSB3aXRoIHN0cmFuZ2UgYXJnLiAgKi8KKyAgICAgIGlmIChmbG9hdG9wID09IDB4ZGYgJiYgY29kZXBbLTFdID09IDB4ZTApCisgICAgICAgIHBzdHJjcHkgKG9wX291dFswXSwgc2l6ZW9mKG9wX291dFswXSksIG5hbWVzMTZbMF0pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpOworCisgICAgICBvYnVmcCA9IG9wX291dFswXTsKKyAgICAgIG9wX2FkID0gMjsKKyAgICAgIGlmIChkcC0+b3BbMF0ucnRuKQorCSgqZHAtPm9wWzBdLnJ0bikgKGRwLT5vcFswXS5ieXRlbW9kZSwgc2l6ZWZsYWcpOworCisgICAgICBvYnVmcCA9IG9wX291dFsxXTsKKyAgICAgIG9wX2FkID0gMTsKKyAgICAgIGlmIChkcC0+b3BbMV0ucnRuKQorCSgqZHAtPm9wWzFdLnJ0bikgKGRwLT5vcFsxXS5ieXRlbW9kZSwgc2l6ZWZsYWcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK09QX1NUIChpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRCwgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIG9hcHBlbmQgKCYiJXN0IlsoaW50KWludGVsX3N5bnRheF0pOworfQorCitzdGF0aWMgdm9pZAorT1BfU1RpIChpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRCwgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJXN0KCVkKSIsIG1vZHJtLnJtKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKKy8qIENhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zLiAgKi8KK3N0YXRpYyBpbnQKK3B1dG9wIChjb25zdCBjaGFyICp0ZW1wbGF0ZSwgaW50IHNpemVmbGFnKQoreworICBjb25zdCBjaGFyICpwOworICBpbnQgYWx0ID0gMDsKKworICBmb3IgKHAgPSB0ZW1wbGF0ZTsgKnA7IHArKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpwKQorCXsKKwlkZWZhdWx0OgorCSAgKm9idWZwKysgPSAqcDsKKwkgIGJyZWFrOworCWNhc2UgJ3snOgorCSAgYWx0ID0gMDsKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGFsdCArPSAxOworCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCSAgICBhbHQgKz0gMjsKKwkgIHdoaWxlIChhbHQgIT0gMCkKKwkgICAgeworCSAgICAgIHdoaWxlICgqKytwICE9ICd8JykKKwkJeworCQkgIGlmICgqcCA9PSAnfScpCisJCSAgICB7CisJCSAgICAgIC8qIEFsdGVybmF0aXZlIG5vdCB2YWxpZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgcHN0cmNweSAob2J1Ziwgc2l6ZW9mKG9idWYpLCAiKGJhZCkiKTsKKwkJICAgICAgb2J1ZnAgPSBvYnVmICsgNTsKKwkJICAgICAgcmV0dXJuIDE7CisJCSAgICB9CisJCSAgZWxzZSBpZiAoKnAgPT0gJ1wwJykKKwkJICAgIGFib3J0ICgpOworCQl9CisJICAgICAgYWx0LS07CisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSAnSSc6CisJICBhbHQgPSAxOworCSAgY29udGludWU7CisJY2FzZSAnfCc6CisJICB3aGlsZSAoKisrcCAhPSAnfScpCisJICAgIHsKKwkgICAgICBpZiAoKnAgPT0gJ1wwJykKKwkJYWJvcnQgKCk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ30nOgorCSAgYnJlYWs7CisJY2FzZSAnQSc6CisJICBpZiAoaW50ZWxfc3ludGF4KQorCSAgICBicmVhazsKKwkgIGlmIChtb2RybS5tb2QgIT0gMyB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkgICAgKm9idWZwKysgPSAnYic7CisJICBicmVhazsKKwljYXNlICdCJzoKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGJyZWFrOworCSAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKKwkgICAgKm9idWZwKysgPSAnYic7CisJICBicmVhazsKKwljYXNlICdDJzoKKwkgIGlmIChpbnRlbF9zeW50YXggJiYgIWFsdCkKKwkgICAgYnJlYWs7CisJICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0RBVEEpIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpKQorCSAgICB7CisJICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJCSpvYnVmcCsrID0gaW50ZWxfc3ludGF4ID8gJ2QnIDogJ2wnOworCSAgICAgIGVsc2UKKwkJKm9idWZwKysgPSBpbnRlbF9zeW50YXggPyAndycgOiAncyc7CisJICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ0QnOgorCSAgaWYgKGludGVsX3N5bnRheCB8fCAhKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykpCisJICAgIGJyZWFrOworCSAgVVNFRF9SRVggKFJFWF9XKTsKKwkgIGlmIChtb2RybS5tb2QgPT0gMykKKwkgICAgeworCSAgICAgIGlmIChyZXggJiBSRVhfVykKKwkJKm9idWZwKysgPSAncSc7CisJICAgICAgZWxzZSBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwkJKm9idWZwKysgPSBpbnRlbF9zeW50YXggPyAnZCcgOiAnbCc7CisJICAgICAgZWxzZQorCQkqb2J1ZnArKyA9ICd3JzsKKwkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICAqb2J1ZnArKyA9ICd3JzsKKwkgIGJyZWFrOworCWNhc2UgJ0UnOgkJLyogRm9yIGpjeHovamVjeHogKi8KKwkgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkKKwkgICAgeworCSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQorCQkqb2J1ZnArKyA9ICdyJzsKKwkgICAgICBlbHNlCisJCSpvYnVmcCsrID0gJ2UnOworCSAgICB9CisJICBlbHNlCisJICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQorCSAgICAgICpvYnVmcCsrID0gJ2UnOworCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfQUREUik7CisJICBicmVhazsKKwljYXNlICdGJzoKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGJyZWFrOworCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKSB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkgICAgeworCSAgICAgIGlmIChzaXplZmxhZyAmIEFGTEFHKQorCQkqb2J1ZnArKyA9IGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ID8gJ3EnIDogJ2wnOworCSAgICAgIGVsc2UKKwkJKm9idWZwKysgPSBhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCA/ICdsJyA6ICd3JzsKKwkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnRyc6CisJICBpZiAoaW50ZWxfc3ludGF4IHx8IChvYnVmcFstMV0gIT0gJ3MnICYmICEoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkpCisJICAgIGJyZWFrOworCSAgaWYgKChyZXggJiBSRVhfVykgfHwgKHNpemVmbGFnICYgREZMQUcpKQorCSAgICAqb2J1ZnArKyA9ICdsJzsKKwkgIGVsc2UKKwkgICAgKm9idWZwKysgPSAndyc7CisJICBpZiAoIShyZXggJiBSRVhfVykpCisJICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworCSAgYnJlYWs7CisJY2FzZSAnSCc6CisJICBpZiAoaW50ZWxfc3ludGF4KQorCSAgICBicmVhazsKKwkgIGlmICgocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX0RTKSkgPT0gUFJFRklYX0NTCisJICAgICAgfHwgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9EUykpID09IFBSRUZJWF9EUykKKwkgICAgeworCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gcHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX0RTKTsKKwkgICAgICAqb2J1ZnArKyA9ICcsJzsKKwkgICAgICAqb2J1ZnArKyA9ICdwJzsKKwkgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRFMpCisJCSpvYnVmcCsrID0gJ3QnOworCSAgICAgIGVsc2UKKwkJKm9idWZwKysgPSAnbic7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgJ0onOgorCSAgaWYgKGludGVsX3N5bnRheCkKKwkgICAgYnJlYWs7CisJICAqb2J1ZnArKyA9ICdsJzsKKwkgIGJyZWFrOworCWNhc2UgJ0snOgorCSAgVVNFRF9SRVggKFJFWF9XKTsKKwkgIGlmIChyZXggJiBSRVhfVykKKwkgICAgKm9idWZwKysgPSAncSc7CisJICBlbHNlCisJICAgICpvYnVmcCsrID0gJ2QnOworCSAgYnJlYWs7CisJY2FzZSAnWic6CisJICBpZiAoaW50ZWxfc3ludGF4KQorCSAgICBicmVhazsKKwkgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCAmJiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkgICAgeworCSAgICAgICpvYnVmcCsrID0gJ3EnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgJ0wnOgorCSAgaWYgKGludGVsX3N5bnRheCkKKwkgICAgYnJlYWs7CisJICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQorCSAgICAqb2J1ZnArKyA9ICdsJzsKKwkgIGJyZWFrOworCWNhc2UgJ04nOgorCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkgPT0gMCkKKwkgICAgKm9idWZwKysgPSAnbic7CisJICBlbHNlCisJICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0ZXQUlUOworCSAgYnJlYWs7CisJY2FzZSAnTyc6CisJICBVU0VEX1JFWCAoUkVYX1cpOworCSAgaWYgKHJleCAmIFJFWF9XKQorCSAgICAqb2J1ZnArKyA9ICdvJzsKKwkgIGVsc2UgaWYgKGludGVsX3N5bnRheCAmJiAoc2l6ZWZsYWcgJiBERkxBRykpCisJICAgICpvYnVmcCsrID0gJ3EnOworCSAgZWxzZQorCSAgICAqb2J1ZnArKyA9ICdkJzsKKwkgIGlmICghKHJleCAmIFJFWF9XKSkKKwkgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJICBicmVhazsKKwljYXNlICdUJzoKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGJyZWFrOworCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ICYmIChzaXplZmxhZyAmIERGTEFHKSkKKwkgICAgeworCSAgICAgICpvYnVmcCsrID0gJ3EnOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAvKiBGYWxsIHRocm91Z2guICAqLworCWNhc2UgJ1AnOgorCSAgaWYgKGludGVsX3N5bnRheCkKKwkgICAgYnJlYWs7CisJICBpZiAoKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCisJICAgICAgfHwgKHJleCAmIFJFWF9XKQorCSAgICAgIHx8IChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpKQorCSAgICB7CisJICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKwkgICAgICBpZiAocmV4ICYgUkVYX1cpCisJCSpvYnVmcCsrID0gJ3EnOworCSAgICAgIGVsc2UKKwkJeworCQkgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwkJICAgICAgKm9idWZwKysgPSAnbCc7CisJCSAgIGVsc2UKKwkJICAgICAqb2J1ZnArKyA9ICd3JzsKKwkJfQorCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdVJzoKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGJyZWFrOworCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ICYmIChzaXplZmxhZyAmIERGTEFHKSkKKwkgICAgeworCSAgICAgIGlmIChtb2RybS5tb2QgIT0gMyB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkJKm9idWZwKysgPSAncSc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSAnUSc6CisJICBpZiAoaW50ZWxfc3ludGF4ICYmICFhbHQpCisJICAgIGJyZWFrOworCSAgVVNFRF9SRVggKFJFWF9XKTsKKwkgIGlmIChtb2RybS5tb2QgIT0gMyB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkgICAgeworCSAgICAgIGlmIChyZXggJiBSRVhfVykKKwkJKm9idWZwKysgPSAncSc7CisJICAgICAgZWxzZQorCQl7CisJCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCisJCSAgICAqb2J1ZnArKyA9IGludGVsX3N5bnRheCA/ICdkJyA6ICdsJzsKKwkJICBlbHNlCisJCSAgICAqb2J1ZnArKyA9ICd3JzsKKwkJfQorCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworCSAgICB9CisJICBicmVhazsKKwljYXNlICdSJzoKKwkgIFVTRURfUkVYIChSRVhfVyk7CisJICBpZiAocmV4ICYgUkVYX1cpCisJICAgICpvYnVmcCsrID0gJ3EnOworCSAgZWxzZSBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwkgICAgeworCSAgICAgIGlmIChpbnRlbF9zeW50YXgpCisJCSAgKm9idWZwKysgPSAnZCc7CisJICAgICAgZWxzZQorCQkgICpvYnVmcCsrID0gJ2wnOworCSAgICB9CisJICBlbHNlCisJICAgICpvYnVmcCsrID0gJ3cnOworCSAgaWYgKGludGVsX3N5bnRheCAmJiAhcFsxXQorCSAgICAgICYmICgocmV4ICYgUkVYX1cpIHx8IChzaXplZmxhZyAmIERGTEFHKSkpCisJICAgICpvYnVmcCsrID0gJ2UnOworCSAgaWYgKCEocmV4ICYgUkVYX1cpKQorCSAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKwkgIGJyZWFrOworCWNhc2UgJ1YnOgorCSAgaWYgKGludGVsX3N5bnRheCkKKwkgICAgYnJlYWs7CisJICBpZiAoYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQgJiYgKHNpemVmbGFnICYgREZMQUcpKQorCSAgICB7CisJICAgICAgaWYgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKKwkJKm9idWZwKysgPSAncSc7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIC8qIEZhbGwgdGhyb3VnaC4gICovCisJY2FzZSAnUyc6CisJICBpZiAoaW50ZWxfc3ludGF4KQorCSAgICBicmVhazsKKwkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCisJICAgIHsKKwkgICAgICBpZiAocmV4ICYgUkVYX1cpCisJCSpvYnVmcCsrID0gJ3EnOworCSAgICAgIGVsc2UKKwkJeworCQkgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCQkgICAgKm9idWZwKysgPSAnbCc7CisJCSAgZWxzZQorCQkgICAgKm9idWZwKysgPSAndyc7CisJCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJCX0KKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnWCc6CisJICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKKwkgICAgKm9idWZwKysgPSAnZCc7CisJICBlbHNlCisJICAgICpvYnVmcCsrID0gJ3MnOworCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJICBicmVhazsKKwljYXNlICdZJzoKKwkgIGlmIChpbnRlbF9zeW50YXgpCisJICAgIGJyZWFrOworCSAgaWYgKHJleCAmIFJFWF9XKQorCSAgICB7CisJICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKwkgICAgICAqb2J1ZnArKyA9ICdxJzsKKwkgICAgfQorCSAgYnJlYWs7CisJICAvKiBpbXBsaWNpdCBvcGVyYW5kIHNpemUgJ2wnIGZvciBpMzg2IG9yICdxJyBmb3IgeDg2LTY0ICovCisJY2FzZSAnVyc6CisJICAvKiBvcGVyYW5kIHNpemUgZmxhZyBmb3IgY3d0bCwgY2J0dyAqLworCSAgVVNFRF9SRVggKFJFWF9XKTsKKwkgIGlmIChyZXggJiBSRVhfVykKKwkgICAgeworCSAgICAgIGlmIChpbnRlbF9zeW50YXgpCisJCSpvYnVmcCsrID0gJ2QnOworCSAgICAgIGVsc2UKKwkJKm9idWZwKysgPSAnbCc7CisJICAgIH0KKwkgIGVsc2UgaWYgKHNpemVmbGFnICYgREZMQUcpCisJICAgICpvYnVmcCsrID0gJ3cnOworCSAgZWxzZQorCSAgICAqb2J1ZnArKyA9ICdiJzsKKwkgIGlmICghKHJleCAmIFJFWF9XKSkKKwkgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJICBicmVhazsKKwl9CisgICAgICBhbHQgPSAwOworICAgIH0KKyAgKm9idWZwID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitvYXBwZW5kIChjb25zdCBjaGFyICpzKQoreworICBzdHJjcHkgKG9idWZwLCBzKTsKKyAgb2J1ZnAgKz0gc3RybGVuIChzKTsKK30KKworc3RhdGljIHZvaWQKK2FwcGVuZF9zZWcgKHZvaWQpCit7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9DUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9DUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJWNzOiIpKTsKKyAgICB9CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJWRzOiIpKTsKKyAgICB9CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9TUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJXNzOiIpKTsKKyAgICB9CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9FUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9FUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJWVzOiIpKTsKKyAgICB9CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9GUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJWZzOiIpKTsKKyAgICB9CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9HUzsKKyAgICAgIG9hcHBlbmQgKElOVEVMX1NZTlRBWCgiJWdzOiIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitPUF9pbmRpckUgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAoIWludGVsX3N5bnRheCkKKyAgICBvYXBwZW5kICgiKiIpOworICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfb3BlcmFuZF92YWx1ZSAoY2hhciAqYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IGhleCwgYmZkX3ZtYSBkaXNwKQoreworICBpZiAoYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQpCisgICAgeworICAgICAgaWYgKGhleCkKKwl7CisJICBjaGFyIHRtcFszMF07CisJICBpbnQgaTsKKwkgIGJ1ZlswXSA9ICcwJzsKKwkgIGJ1ZlsxXSA9ICd4JzsKKyAgICAgICAgICBzbnByaW50Zl92bWEgKHRtcCwgc2l6ZW9mKHRtcCksIGRpc3ApOworICAgICAgICAgIGZvciAoaSA9IDA7IHRtcFtpXSA9PSAnMCcgJiYgdG1wW2kgKyAxXTsgaSsrKSB7CisgICAgICAgICAgfQorICAgICAgICAgIHBzdHJjcHkgKGJ1ZiArIDIsIGJ1ZnNpemUgLSAyLCB0bXAgKyBpKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgYmZkX3NpZ25lZF92bWEgdiA9IGRpc3A7CisJICBjaGFyIHRtcFszMF07CisJICBpbnQgaTsKKwkgIGlmICh2IDwgMCkKKwkgICAgeworCSAgICAgICooYnVmKyspID0gJy0nOworCSAgICAgIHYgPSAtZGlzcDsKKwkgICAgICAvKiBDaGVjayBmb3IgcG9zc2libGUgb3ZlcmZsb3cgb24gMHg4MDAwMDAwMDAwMDAwMDAwLiAgKi8KKwkgICAgICBpZiAodiA8IDApCisJCXsKKyAgICAgICAgICAgICAgICAgIHBzdHJjcHkgKGJ1ZiwgYnVmc2l6ZSwgIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKTsKKwkJICByZXR1cm47CisJCX0KKwkgICAgfQorCSAgaWYgKCF2KQorCSAgICB7CisgICAgICAgICAgICAgICAgcHN0cmNweSAoYnVmLCBidWZzaXplLCAiMCIpOworCSAgICAgIHJldHVybjsKKwkgICAgfQorCisJICBpID0gMDsKKwkgIHRtcFsyOV0gPSAwOworCSAgd2hpbGUgKHYpCisJICAgIHsKKwkgICAgICB0bXBbMjggLSBpXSA9ICh2ICUgMTApICsgJzAnOworCSAgICAgIHYgLz0gMTA7CisJICAgICAgaSsrOworCSAgICB9CisgICAgICAgICAgcHN0cmNweSAoYnVmLCBidWZzaXplLCB0bXAgKyAyOSAtIGkpOworCX0KKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoaGV4KQorICAgICAgICBzbnByaW50ZiAoYnVmLCBidWZzaXplLCAiMHgleCIsICh1bnNpZ25lZCBpbnQpIGRpc3ApOworICAgICAgZWxzZQorICAgICAgICBzbnByaW50ZiAoYnVmLCBidWZzaXplLCAiJWQiLCAoaW50KSBkaXNwKTsKKyAgICB9Cit9CisKKy8qIFB1dCBESVNQIGluIEJVRiBhcyBzaWduZWQgaGV4IG51bWJlci4gICovCisKK3N0YXRpYyB2b2lkCitwcmludF9kaXNwbGFjZW1lbnQgKGNoYXIgKmJ1ZiwgYmZkX3ZtYSBkaXNwKQoreworICBiZmRfc2lnbmVkX3ZtYSB2YWwgPSBkaXNwOworICBjaGFyIHRtcFszMF07CisgIGludCBpLCBqID0gMDsKKworICBpZiAodmFsIDwgMCkKKyAgICB7CisgICAgICBidWZbaisrXSA9ICctJzsKKyAgICAgIHZhbCA9IC1kaXNwOworCisgICAgICAvKiBDaGVjayBmb3IgcG9zc2libGUgb3ZlcmZsb3cuICAqLworICAgICAgaWYgKHZhbCA8IDApCisJeworCSAgc3dpdGNoIChhZGRyZXNzX21vZGUpCisJICAgIHsKKwkgICAgY2FzZSBtb2RlXzY0Yml0OgorCSAgICAgIHN0cmNweSAoYnVmICsgaiwgIjB4ODAwMDAwMDAwMDAwMDAwMCIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIG1vZGVfMzJiaXQ6CisJICAgICAgc3RyY3B5IChidWYgKyBqLCAiMHg4MDAwMDAwMCIpOworCSAgICAgIGJyZWFrOworCSAgICBjYXNlIG1vZGVfMTZiaXQ6CisJICAgICAgc3RyY3B5IChidWYgKyBqLCAiMHg4MDAwIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIHJldHVybjsKKwl9CisgICAgfQorCisgIGJ1ZltqKytdID0gJzAnOworICBidWZbaisrXSA9ICd4JzsKKworICBzbnByaW50Zl92bWEgKHRtcCwgc2l6ZW9mKHRtcCksIHZhbCk7CisgIGZvciAoaSA9IDA7IHRtcFtpXSA9PSAnMCc7IGkrKykKKyAgICBjb250aW51ZTsKKyAgaWYgKHRtcFtpXSA9PSAnXDAnKQorICAgIGktLTsKKyAgc3RyY3B5IChidWYgKyBqLCB0bXAgKyBpKTsKK30KKworc3RhdGljIHZvaWQKK2ludGVsX29wZXJhbmRfc2l6ZSAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIHN3aXRjaCAoYnl0ZW1vZGUpCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgIGNhc2UgZHFiX21vZGU6CisgICAgICBvYXBwZW5kICgiQllURSBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICBjYXNlIGRxd19tb2RlOgorICAgICAgb2FwcGVuZCAoIldPUkQgUFRSICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBzdGFja192X21vZGU6CisgICAgICBpZiAoYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQgJiYgKHNpemVmbGFnICYgREZMQUcpKQorCXsKKwkgIG9hcHBlbmQgKCJRV09SRCBQVFIgIik7CisJICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIEZBTExUSFJVICovCisgICAgY2FzZSB2X21vZGU6CisgICAgY2FzZSBkcV9tb2RlOgorICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKyAgICAgIGlmIChyZXggJiBSRVhfVykKKwlvYXBwZW5kICgiUVdPUkQgUFRSICIpOworICAgICAgZWxzZSBpZiAoKHNpemVmbGFnICYgREZMQUcpIHx8IGJ5dGVtb2RlID09IGRxX21vZGUpCisJb2FwcGVuZCAoIkRXT1JEIFBUUiAiKTsKKyAgICAgIGVsc2UKKwlvYXBwZW5kICgiV09SRCBQVFIgIik7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugel9tb2RlOgorICAgICAgaWYgKChyZXggJiBSRVhfVykgfHwgKHNpemVmbGFnICYgREZMQUcpKQorCSpvYnVmcCsrID0gJ0QnOworICAgICAgb2FwcGVuZCAoIldPUkQgUFRSICIpOworICAgICAgaWYgKCEocmV4ICYgUkVYX1cpKQorCXVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBkX21vZGU6CisgICAgY2FzZSBkcWRfbW9kZToKKyAgICAgIG9hcHBlbmQgKCJEV09SRCBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHFfbW9kZToKKyAgICAgIG9hcHBlbmQgKCJRV09SRCBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIG1fbW9kZToKKyAgICAgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkKKwlvYXBwZW5kICgiUVdPUkQgUFRSICIpOworICAgICAgZWxzZQorCW9hcHBlbmQgKCJEV09SRCBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIGZfbW9kZToKKyAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQorCW9hcHBlbmQgKCJGV09SRCBQVFIgIik7CisgICAgICBlbHNlCisJb2FwcGVuZCAoIkRXT1JEIFBUUiAiKTsKKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X21vZGU6CisgICAgICBvYXBwZW5kICgiVEJZVEUgUFRSICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB4X21vZGU6CisgICAgICBvYXBwZW5kICgiWE1NV09SRCBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIG9fbW9kZToKKyAgICAgIG9hcHBlbmQgKCJPV09SRCBQVFIgIik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorT1BfRSAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGJmZF92bWEgZGlzcDsKKyAgaW50IGFkZCA9IDA7CisgIGludCByaXByZWwgPSAwOworICBVU0VEX1JFWCAoUkVYX0IpOworICBpZiAocmV4ICYgUkVYX0IpCisgICAgYWRkICs9IDg7CisKKyAgLyogU2tpcCBtb2Qvcm0gYnl0ZS4gICovCisgIE1PRFJNX0NIRUNLOworICBjb2RlcCsrOworCisgIGlmIChtb2RybS5tb2QgPT0gMykKKyAgICB7CisgICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQorCXsKKwljYXNlIGJfbW9kZToKKwkgIFVTRURfUkVYICgwKTsKKwkgIGlmIChyZXgpCisJICAgIG9hcHBlbmQgKG5hbWVzOHJleFttb2RybS5ybSArIGFkZF0pOworCSAgZWxzZQorCSAgICBvYXBwZW5kIChuYW1lczhbbW9kcm0ucm0gKyBhZGRdKTsKKwkgIGJyZWFrOworCWNhc2Ugd19tb2RlOgorCSAgb2FwcGVuZCAobmFtZXMxNlttb2RybS5ybSArIGFkZF0pOworCSAgYnJlYWs7CisJY2FzZSBkX21vZGU6CisJICBvYXBwZW5kIChuYW1lczMyW21vZHJtLnJtICsgYWRkXSk7CisJICBicmVhazsKKwljYXNlIHFfbW9kZToKKwkgIG9hcHBlbmQgKG5hbWVzNjRbbW9kcm0ucm0gKyBhZGRdKTsKKwkgIGJyZWFrOworCWNhc2UgbV9tb2RlOgorCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCSAgICBvYXBwZW5kIChuYW1lczY0W21vZHJtLnJtICsgYWRkXSk7CisJICBlbHNlCisJICAgIG9hcHBlbmQgKG5hbWVzMzJbbW9kcm0ucm0gKyBhZGRdKTsKKwkgIGJyZWFrOworCWNhc2Ugc3RhY2tfdl9tb2RlOgorCSAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ICYmIChzaXplZmxhZyAmIERGTEFHKSkKKwkgICAgeworCSAgICAgIG9hcHBlbmQgKG5hbWVzNjRbbW9kcm0ucm0gKyBhZGRdKTsKKwkgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgYnl0ZW1vZGUgPSB2X21vZGU7CisJICAvKiBGQUxMVEhSVSAqLworCWNhc2Ugdl9tb2RlOgorCWNhc2UgZHFfbW9kZToKKwljYXNlIGRxYl9tb2RlOgorCWNhc2UgZHFkX21vZGU6CisJY2FzZSBkcXdfbW9kZToKKwkgIFVTRURfUkVYIChSRVhfVyk7CisJICBpZiAocmV4ICYgUkVYX1cpCisJICAgIG9hcHBlbmQgKG5hbWVzNjRbbW9kcm0ucm0gKyBhZGRdKTsKKwkgIGVsc2UgaWYgKChzaXplZmxhZyAmIERGTEFHKSB8fCBieXRlbW9kZSAhPSB2X21vZGUpCisJICAgIG9hcHBlbmQgKG5hbWVzMzJbbW9kcm0ucm0gKyBhZGRdKTsKKwkgIGVsc2UKKwkgICAgb2FwcGVuZCAobmFtZXMxNlttb2RybS5ybSArIGFkZF0pOworCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisJICBicmVhazsKKwljYXNlIDA6CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZGlzcCA9IDA7CisgIGlmIChpbnRlbF9zeW50YXgpCisgICAgaW50ZWxfb3BlcmFuZF9zaXplIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICBhcHBlbmRfc2VnICgpOworCisgIGlmICgoc2l6ZWZsYWcgJiBBRkxBRykgfHwgYWRkcmVzc19tb2RlID09IG1vZGVfNjRiaXQpCisgICAgeworICAgICAgLyogMzIvNjQgYml0IGFkZHJlc3MgbW9kZSAqLworICAgICAgaW50IGhhdmVkaXNwOworICAgICAgaW50IGhhdmVzaWI7CisgICAgICBpbnQgaGF2ZWJhc2U7CisgICAgICBpbnQgYmFzZTsKKyAgICAgIGludCBpbmRleCA9IDA7CisgICAgICBpbnQgc2NhbGUgPSAwOworCisgICAgICBoYXZlc2liID0gMDsKKyAgICAgIGhhdmViYXNlID0gMTsKKyAgICAgIGJhc2UgPSBtb2RybS5ybTsKKworICAgICAgaWYgKGJhc2UgPT0gNCkKKwl7CisJICBoYXZlc2liID0gMTsKKyAgICAgICAgICBmZXRjaF9kYXRhKHRoZV9pbmZvLCBjb2RlcCArIDEpOworCSAgaW5kZXggPSAoKmNvZGVwID4+IDMpICYgNzsKKwkgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCB8fCBpbmRleCAhPSAweDQpCisJICAgIC8qIFdoZW4gSU5ERVggPT0gMHg0IGluIDMyIGJpdCBtb2RlLCBTQ0FMRSBpcyBpZ25vcmVkLiAgKi8KKwkgICAgc2NhbGUgPSAoKmNvZGVwID4+IDYpICYgMzsKKwkgIGJhc2UgPSAqY29kZXAgJiA3OworCSAgVVNFRF9SRVggKFJFWF9YKTsKKwkgIGlmIChyZXggJiBSRVhfWCkKKwkgICAgaW5kZXggKz0gODsKKwkgIGNvZGVwKys7CisJfQorICAgICAgYmFzZSArPSBhZGQ7CisKKyAgICAgIHN3aXRjaCAobW9kcm0ubW9kKQorCXsKKwljYXNlIDA6CisJICBpZiAoKGJhc2UgJiA3KSA9PSA1KQorCSAgICB7CisJICAgICAgaGF2ZWJhc2UgPSAwOworCSAgICAgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCAmJiAhaGF2ZXNpYikKKwkJcmlwcmVsID0gMTsKKwkgICAgICBkaXNwID0gZ2V0MzJzICgpOworCSAgICB9CisJICBicmVhazsKKwljYXNlIDE6CisgICAgICAgICAgZmV0Y2hfZGF0YSAodGhlX2luZm8sIGNvZGVwICsgMSk7CisJICBkaXNwID0gKmNvZGVwKys7CisJICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQorCSAgICBkaXNwIC09IDB4MTAwOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgZGlzcCA9IGdldDMycyAoKTsKKwkgIGJyZWFrOworCX0KKworICAgICAgaGF2ZWRpc3AgPSBoYXZlYmFzZSB8fCAoaGF2ZXNpYiAmJiAoaW5kZXggIT0gNCB8fCBzY2FsZSAhPSAwKSk7CisKKyAgICAgIGlmICghaW50ZWxfc3ludGF4KQorCWlmIChtb2RybS5tb2QgIT0gMCB8fCAoYmFzZSAmIDcpID09IDUpCisJICB7CisJICAgIGlmIChoYXZlZGlzcCB8fCByaXByZWwpCisJICAgICAgcHJpbnRfZGlzcGxhY2VtZW50IChzY3JhdGNoYnVmLCBkaXNwKTsKKwkgICAgZWxzZQorICAgICAgICAgICAgICBwcmludF9vcGVyYW5kX3ZhbHVlIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksIDEsIGRpc3ApOworCSAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwkgICAgaWYgKHJpcHJlbCkKKwkgICAgICB7CisJCXNldF9vcCAoZGlzcCwgMSk7CisJCW9hcHBlbmQgKCIoJXJpcCkiKTsKKwkgICAgICB9CisJICB9CisKKyAgICAgIGlmIChoYXZlZGlzcCB8fCAoaW50ZWxfc3ludGF4ICYmIHJpcHJlbCkpCisJeworCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7CisJICBpZiAoaW50ZWxfc3ludGF4ICYmIHJpcHJlbCkKKwkgICAgeworCSAgICAgIHNldF9vcCAoZGlzcCwgMSk7CisJICAgICAgb2FwcGVuZCAoInJpcCIpOworCSAgICB9CisJICAqb2J1ZnAgPSAnXDAnOworCSAgaWYgKGhhdmViYXNlKQorCSAgICBvYXBwZW5kIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCAmJiAoc2l6ZWZsYWcgJiBBRkxBRykKKwkJICAgICA/IG5hbWVzNjRbYmFzZV0gOiBuYW1lczMyW2Jhc2VdKTsKKwkgIGlmIChoYXZlc2liKQorCSAgICB7CisJICAgICAgaWYgKGluZGV4ICE9IDQpCisJCXsKKwkJICBpZiAoIWludGVsX3N5bnRheCB8fCBoYXZlYmFzZSkKKwkJICAgIHsKKwkJICAgICAgKm9idWZwKysgPSBzZXBhcmF0b3JfY2hhcjsKKwkJICAgICAgKm9idWZwID0gJ1wwJzsKKwkJICAgIH0KKwkJICBvYXBwZW5kIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCAmJiAoc2l6ZWZsYWcgJiBBRkxBRykKKwkJCSAgID8gbmFtZXM2NFtpbmRleF0gOiBuYW1lczMyW2luZGV4XSk7CisJCX0KKwkgICAgICBpZiAoc2NhbGUgIT0gMCB8fCAoIWludGVsX3N5bnRheCAmJiBpbmRleCAhPSA0KSkKKwkJeworCQkgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKKwkJICAqb2J1ZnAgPSAnXDAnOworCQkgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlZCIsIDEgPDwgc2NhbGUpOworCQkgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworCQl9CisJICAgIH0KKwkgIGlmIChpbnRlbF9zeW50YXgKKwkgICAgICAmJiAoZGlzcCB8fCBtb2RybS5tb2QgIT0gMCB8fCAoYmFzZSAmIDcpID09IDUpKQorCSAgICB7CisJICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgZGlzcCA+PSAwKQorCQl7CisJCSAgKm9idWZwKysgPSAnKyc7CisJCSAgKm9idWZwID0gJ1wwJzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKG1vZHJtLm1vZCAhPSAxKQorCQl7CisJCSAgKm9idWZwKysgPSAnLSc7CisJCSAgKm9idWZwID0gJ1wwJzsKKwkJICBkaXNwID0gLSAoYmZkX3NpZ25lZF92bWEpIGRpc3A7CisJCX0KKworCSAgICAgIHByaW50X2Rpc3BsYWNlbWVudCAoc2NyYXRjaGJ1ZiwgZGlzcCk7CisJICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisJICAgIH0KKworCSAgKm9idWZwKysgPSBjbG9zZV9jaGFyOworCSAgKm9idWZwID0gJ1wwJzsKKwl9CisgICAgICBlbHNlIGlmIChpbnRlbF9zeW50YXgpCisJeworCSAgaWYgKG1vZHJtLm1vZCAhPSAwIHx8IChiYXNlICYgNykgPT0gNSkKKwkgICAgeworCSAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfQ1MgfCBQUkVGSVhfU1MgfCBQUkVGSVhfRFMKKwkJCSAgICAgIHwgUFJFRklYX0VTIHwgUFJFRklYX0ZTIHwgUFJFRklYX0dTKSkKKwkJOworCSAgICAgIGVsc2UKKwkJeworCQkgIG9hcHBlbmQgKG5hbWVzX3NlZ1tkc19yZWcgLSBlc19yZWddKTsKKwkJICBvYXBwZW5kICgiOiIpOworCQl9CisJICAgICAgcHJpbnRfb3BlcmFuZF92YWx1ZSAoc2NyYXRjaGJ1Ziwgc2l6ZW9mKHNjcmF0Y2hidWYpLCAxLCBkaXNwKTsKKwkgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwkgICAgfQorCX0KKyAgICB9CisgIGVsc2UKKyAgICB7IC8qIDE2IGJpdCBhZGRyZXNzIG1vZGUgKi8KKyAgICAgIHN3aXRjaCAobW9kcm0ubW9kKQorCXsKKwljYXNlIDA6CisJICBpZiAobW9kcm0ucm0gPT0gNikKKwkgICAgeworCSAgICAgIGRpc3AgPSBnZXQxNiAoKTsKKwkgICAgICBpZiAoKGRpc3AgJiAweDgwMDApICE9IDApCisJCWRpc3AgLT0gMHgxMDAwMDsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAxOgorICAgICAgICAgIGZldGNoX2RhdGEodGhlX2luZm8sIGNvZGVwICsgMSk7CisJICBkaXNwID0gKmNvZGVwKys7CisJICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQorCSAgICBkaXNwIC09IDB4MTAwOworCSAgYnJlYWs7CisJY2FzZSAyOgorCSAgZGlzcCA9IGdldDE2ICgpOworCSAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQorCSAgICBkaXNwIC09IDB4MTAwMDA7CisJICBicmVhazsKKwl9CisKKyAgICAgIGlmICghaW50ZWxfc3ludGF4KQorCWlmIChtb2RybS5tb2QgIT0gMCB8fCBtb2RybS5ybSA9PSA2KQorCSAgeworCSAgICBwcmludF9kaXNwbGFjZW1lbnQgKHNjcmF0Y2hidWYsIGRpc3ApOworCSAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwkgIH0KKworICAgICAgaWYgKG1vZHJtLm1vZCAhPSAwIHx8IG1vZHJtLnJtICE9IDYpCisJeworCSAgKm9idWZwKysgPSBvcGVuX2NoYXI7CisJICAqb2J1ZnAgPSAnXDAnOworCSAgb2FwcGVuZCAoaW5kZXgxNlttb2RybS5ybV0pOworCSAgaWYgKGludGVsX3N5bnRheAorCSAgICAgICYmIChkaXNwIHx8IG1vZHJtLm1vZCAhPSAwIHx8IG1vZHJtLnJtID09IDYpKQorCSAgICB7CisJICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgZGlzcCA+PSAwKQorCQl7CisJCSAgKm9idWZwKysgPSAnKyc7CisJCSAgKm9idWZwID0gJ1wwJzsKKwkJfQorCSAgICAgIGVsc2UgaWYgKG1vZHJtLm1vZCAhPSAxKQorCQl7CisJCSAgKm9idWZwKysgPSAnLSc7CisJCSAgKm9idWZwID0gJ1wwJzsKKwkJICBkaXNwID0gLSAoYmZkX3NpZ25lZF92bWEpIGRpc3A7CisJCX0KKworCSAgICAgIHByaW50X2Rpc3BsYWNlbWVudCAoc2NyYXRjaGJ1ZiwgZGlzcCk7CisJICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7CisJICAgIH0KKworCSAgKm9idWZwKysgPSBjbG9zZV9jaGFyOworCSAgKm9idWZwID0gJ1wwJzsKKwl9CisgICAgICBlbHNlIGlmIChpbnRlbF9zeW50YXgpCisJeworCSAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUworCQkJICB8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpCisJICAgIDsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG9hcHBlbmQgKG5hbWVzX3NlZ1tkc19yZWcgLSBlc19yZWddKTsKKwkgICAgICBvYXBwZW5kICgiOiIpOworCSAgICB9CisJICBwcmludF9vcGVyYW5kX3ZhbHVlIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcCAmIDB4ZmZmZik7CisJICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKKwl9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorT1BfRyAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGludCBhZGQgPSAwOworICBVU0VEX1JFWCAoUkVYX1IpOworICBpZiAocmV4ICYgUkVYX1IpCisgICAgYWRkICs9IDg7CisgIHN3aXRjaCAoYnl0ZW1vZGUpCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgVVNFRF9SRVggKDApOworICAgICAgaWYgKHJleCkKKwlvYXBwZW5kIChuYW1lczhyZXhbbW9kcm0ucmVnICsgYWRkXSk7CisgICAgICBlbHNlCisJb2FwcGVuZCAobmFtZXM4W21vZHJtLnJlZyArIGFkZF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSB3X21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczE2W21vZHJtLnJlZyArIGFkZF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBkX21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczMyW21vZHJtLnJlZyArIGFkZF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBxX21vZGU6CisgICAgICBvYXBwZW5kIChuYW1lczY0W21vZHJtLnJlZyArIGFkZF0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgY2FzZSBkcV9tb2RlOgorICAgIGNhc2UgZHFiX21vZGU6CisgICAgY2FzZSBkcWRfbW9kZToKKyAgICBjYXNlIGRxd19tb2RlOgorICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKyAgICAgIGlmIChyZXggJiBSRVhfVykKKwlvYXBwZW5kIChuYW1lczY0W21vZHJtLnJlZyArIGFkZF0pOworICAgICAgZWxzZSBpZiAoKHNpemVmbGFnICYgREZMQUcpIHx8IGJ5dGVtb2RlICE9IHZfbW9kZSkKKwlvYXBwZW5kIChuYW1lczMyW21vZHJtLnJlZyArIGFkZF0pOworICAgICAgZWxzZQorCW9hcHBlbmQgKG5hbWVzMTZbbW9kcm0ucmVnICsgYWRkXSk7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgbV9tb2RlOgorICAgICAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCW9hcHBlbmQgKG5hbWVzNjRbbW9kcm0ucmVnICsgYWRkXSk7CisgICAgICBlbHNlCisJb2FwcGVuZCAobmFtZXMzMlttb2RybS5yZWcgKyBhZGRdKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgYmZkX3ZtYQorZ2V0NjQgKHZvaWQpCit7CisgIGJmZF92bWEgeDsKKyNpZmRlZiBCRkQ2NAorICB1bnNpZ25lZCBpbnQgYTsKKyAgdW5zaWduZWQgaW50IGI7CisKKyAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyA4KTsKKyAgYSA9ICpjb2RlcCsrICYgMHhmZjsKKyAgYSB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OworICBhIHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDE2OworICBhIHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDI0OworICBiID0gKmNvZGVwKysgJiAweGZmOworICBiIHw9ICgqY29kZXArKyAmIDB4ZmYpIDw8IDg7CisgIGIgfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgMTY7CisgIGIgfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgMjQ7CisgIHggPSBhICsgKChiZmRfdm1hKSBiIDw8IDMyKTsKKyNlbHNlCisgIGFib3J0ICgpOworICB4ID0gMDsKKyNlbmRpZgorICByZXR1cm4geDsKK30KKworc3RhdGljIGJmZF9zaWduZWRfdm1hCitnZXQzMiAodm9pZCkKK3sKKyAgYmZkX3NpZ25lZF92bWEgeCA9IDA7CisKKyAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyA0KTsKKyAgeCA9ICpjb2RlcCsrICYgKGJmZF9zaWduZWRfdm1hKSAweGZmOworICB4IHw9ICgqY29kZXArKyAmIChiZmRfc2lnbmVkX3ZtYSkgMHhmZikgPDwgODsKKyAgeCB8PSAoKmNvZGVwKysgJiAoYmZkX3NpZ25lZF92bWEpIDB4ZmYpIDw8IDE2OworICB4IHw9ICgqY29kZXArKyAmIChiZmRfc2lnbmVkX3ZtYSkgMHhmZikgPDwgMjQ7CisgIHJldHVybiB4OworfQorCitzdGF0aWMgYmZkX3NpZ25lZF92bWEKK2dldDMycyAodm9pZCkKK3sKKyAgYmZkX3NpZ25lZF92bWEgeCA9IDA7CisKKyAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyA0KTsKKyAgeCA9ICpjb2RlcCsrICYgKGJmZF9zaWduZWRfdm1hKSAweGZmOworICB4IHw9ICgqY29kZXArKyAmIChiZmRfc2lnbmVkX3ZtYSkgMHhmZikgPDwgODsKKyAgeCB8PSAoKmNvZGVwKysgJiAoYmZkX3NpZ25lZF92bWEpIDB4ZmYpIDw8IDE2OworICB4IHw9ICgqY29kZXArKyAmIChiZmRfc2lnbmVkX3ZtYSkgMHhmZikgPDwgMjQ7CisKKyAgeCA9ICh4IF4gKChiZmRfc2lnbmVkX3ZtYSkgMSA8PCAzMSkpIC0gKChiZmRfc2lnbmVkX3ZtYSkgMSA8PCAzMSk7CisKKyAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQKK2dldDE2ICh2b2lkKQoreworICBpbnQgeCA9IDA7CisKKyAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyAyKTsKKyAgeCA9ICpjb2RlcCsrICYgMHhmZjsKKyAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OworICByZXR1cm4geDsKK30KKworc3RhdGljIHZvaWQKK3NldF9vcCAoYmZkX3ZtYSBvcCwgaW50IHJpcHJlbCkKK3sKKyAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7CisgIGlmIChhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkKKyAgICB7CisgICAgICBvcF9hZGRyZXNzW29wX2FkXSA9IG9wOworICAgICAgb3BfcmlwcmVsW29wX2FkXSA9IHJpcHJlbDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBNYXNrIHRvIGdldCBhIDMyLWJpdCBhZGRyZXNzLiAgKi8KKyAgICAgIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3AgJiAweGZmZmZmZmZmOworICAgICAgb3BfcmlwcmVsW29wX2FkXSA9IHJpcHJlbCAmIDB4ZmZmZmZmZmY7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorT1BfUkVHIChpbnQgY29kZSwgaW50IHNpemVmbGFnKQoreworICBjb25zdCBjaGFyICpzOworICBpbnQgYWRkID0gMDsKKyAgVVNFRF9SRVggKFJFWF9CKTsKKyAgaWYgKHJleCAmIFJFWF9CKQorICAgIGFkZCA9IDg7CisKKyAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICBjYXNlIGF4X3JlZzogY2FzZSBjeF9yZWc6IGNhc2UgZHhfcmVnOiBjYXNlIGJ4X3JlZzoKKyAgICBjYXNlIHNwX3JlZzogY2FzZSBicF9yZWc6IGNhc2Ugc2lfcmVnOiBjYXNlIGRpX3JlZzoKKyAgICAgIHMgPSBuYW1lczE2W2NvZGUgLSBheF9yZWcgKyBhZGRdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBlc19yZWc6IGNhc2Ugc3NfcmVnOiBjYXNlIGNzX3JlZzoKKyAgICBjYXNlIGRzX3JlZzogY2FzZSBmc19yZWc6IGNhc2UgZ3NfcmVnOgorICAgICAgcyA9IG5hbWVzX3NlZ1tjb2RlIC0gZXNfcmVnICsgYWRkXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgYWxfcmVnOiBjYXNlIGFoX3JlZzogY2FzZSBjbF9yZWc6IGNhc2UgY2hfcmVnOgorICAgIGNhc2UgZGxfcmVnOiBjYXNlIGRoX3JlZzogY2FzZSBibF9yZWc6IGNhc2UgYmhfcmVnOgorICAgICAgVVNFRF9SRVggKDApOworICAgICAgaWYgKHJleCkKKwlzID0gbmFtZXM4cmV4W2NvZGUgLSBhbF9yZWcgKyBhZGRdOworICAgICAgZWxzZQorCXMgPSBuYW1lczhbY29kZSAtIGFsX3JlZ107CisgICAgICBicmVhazsKKyAgICBjYXNlIHJBWF9yZWc6IGNhc2UgckNYX3JlZzogY2FzZSByRFhfcmVnOiBjYXNlIHJCWF9yZWc6CisgICAgY2FzZSByU1BfcmVnOiBjYXNlIHJCUF9yZWc6IGNhc2UgclNJX3JlZzogY2FzZSByRElfcmVnOgorICAgICAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0ICYmIChzaXplZmxhZyAmIERGTEFHKSkKKwl7CisJICBzID0gbmFtZXM2NFtjb2RlIC0gckFYX3JlZyArIGFkZF07CisJICBicmVhazsKKwl9CisgICAgICBjb2RlICs9IGVBWF9yZWcgLSByQVhfcmVnOworICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIGVBWF9yZWc6IGNhc2UgZUNYX3JlZzogY2FzZSBlRFhfcmVnOiBjYXNlIGVCWF9yZWc6CisgICAgY2FzZSBlU1BfcmVnOiBjYXNlIGVCUF9yZWc6IGNhc2UgZVNJX3JlZzogY2FzZSBlRElfcmVnOgorICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKyAgICAgIGlmIChyZXggJiBSRVhfVykKKwlzID0gbmFtZXM2NFtjb2RlIC0gZUFYX3JlZyArIGFkZF07CisgICAgICBlbHNlIGlmIChzaXplZmxhZyAmIERGTEFHKQorCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnICsgYWRkXTsKKyAgICAgIGVsc2UKKwlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZyArIGFkZF07CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICBvYXBwZW5kIChzKTsKK30KKworc3RhdGljIHZvaWQKK09QX0lNUkVHIChpbnQgY29kZSwgaW50IHNpemVmbGFnKQoreworICBjb25zdCBjaGFyICpzOworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgY2FzZSBpbmRpcl9keF9yZWc6CisgICAgICBpZiAoaW50ZWxfc3ludGF4KQorCXMgPSAiZHgiOworICAgICAgZWxzZQorCXMgPSAiKCVkeCkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBheF9yZWc6IGNhc2UgY3hfcmVnOiBjYXNlIGR4X3JlZzogY2FzZSBieF9yZWc6CisgICAgY2FzZSBzcF9yZWc6IGNhc2UgYnBfcmVnOiBjYXNlIHNpX3JlZzogY2FzZSBkaV9yZWc6CisgICAgICBzID0gbmFtZXMxNltjb2RlIC0gYXhfcmVnXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZXNfcmVnOiBjYXNlIHNzX3JlZzogY2FzZSBjc19yZWc6CisgICAgY2FzZSBkc19yZWc6IGNhc2UgZnNfcmVnOiBjYXNlIGdzX3JlZzoKKyAgICAgIHMgPSBuYW1lc19zZWdbY29kZSAtIGVzX3JlZ107CisgICAgICBicmVhazsKKyAgICBjYXNlIGFsX3JlZzogY2FzZSBhaF9yZWc6IGNhc2UgY2xfcmVnOiBjYXNlIGNoX3JlZzoKKyAgICBjYXNlIGRsX3JlZzogY2FzZSBkaF9yZWc6IGNhc2UgYmxfcmVnOiBjYXNlIGJoX3JlZzoKKyAgICAgIFVTRURfUkVYICgwKTsKKyAgICAgIGlmIChyZXgpCisJcyA9IG5hbWVzOHJleFtjb2RlIC0gYWxfcmVnXTsKKyAgICAgIGVsc2UKKwlzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOworICAgICAgYnJlYWs7CisgICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgorICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKKyAgICAgIFVTRURfUkVYIChSRVhfVyk7CisgICAgICBpZiAocmV4ICYgUkVYX1cpCisJcyA9IG5hbWVzNjRbY29kZSAtIGVBWF9yZWddOworICAgICAgZWxzZSBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwlzID0gbmFtZXMzMltjb2RlIC0gZUFYX3JlZ107CisgICAgICBlbHNlCisJcyA9IG5hbWVzMTZbY29kZSAtIGVBWF9yZWddOworICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHpfbW9kZV9heF9yZWc6CisgICAgICBpZiAoKHJleCAmIFJFWF9XKSB8fCAoc2l6ZWZsYWcgJiBERkxBRykpCisJcyA9ICpuYW1lczMyOworICAgICAgZWxzZQorCXMgPSAqbmFtZXMxNjsKKyAgICAgIGlmICghKHJleCAmIFJFWF9XKSkKKwl1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICBvYXBwZW5kIChzKTsKK30KKworc3RhdGljIHZvaWQKK09QX0kgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBiZmRfc2lnbmVkX3ZtYSBvcDsKKyAgYmZkX3NpZ25lZF92bWEgbWFzayA9IC0xOworCisgIHN3aXRjaCAoYnl0ZW1vZGUpCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyAxKTsKKyAgICAgIG9wID0gKmNvZGVwKys7CisgICAgICBtYXNrID0gMHhmZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgcV9tb2RlOgorICAgICAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorCXsKKwkgIG9wID0gZ2V0MzJzICgpOworCSAgYnJlYWs7CisJfQorICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIFVTRURfUkVYIChSRVhfVyk7CisgICAgICBpZiAocmV4ICYgUkVYX1cpCisJb3AgPSBnZXQzMnMgKCk7CisgICAgICBlbHNlIGlmIChzaXplZmxhZyAmIERGTEFHKQorCXsKKwkgIG9wID0gZ2V0MzIgKCk7CisJICBtYXNrID0gMHhmZmZmZmZmZjsKKwl9CisgICAgICBlbHNlCisJeworCSAgb3AgPSBnZXQxNiAoKTsKKwkgIG1hc2sgPSAweGZmZmZmOworCX0KKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB3X21vZGU6CisgICAgICBtYXNrID0gMHhmZmZmZjsKKyAgICAgIG9wID0gZ2V0MTYgKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvbnN0XzFfbW9kZToKKyAgICAgIGlmIChpbnRlbF9zeW50YXgpCisgICAgICAgIG9hcHBlbmQgKCIxIik7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG9wICY9IG1hc2s7CisgIHNjcmF0Y2hidWZbMF0gPSAnJCc7CisgIHByaW50X29wZXJhbmRfdmFsdWUgKHNjcmF0Y2hidWYgKyAxLCBzaXplb2Yoc2NyYXRjaGJ1ZikgLSAxLCAxLCBvcCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYgKyBpbnRlbF9zeW50YXgpOworICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQKK09QX0k2NCAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGJmZF9zaWduZWRfdm1hIG9wOworICBiZmRfc2lnbmVkX3ZtYSBtYXNrID0gLTE7CisKKyAgaWYgKGFkZHJlc3NfbW9kZSAhPSBtb2RlXzY0Yml0KQorICAgIHsKKyAgICAgIE9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHN3aXRjaCAoYnl0ZW1vZGUpCisgICAgeworICAgIGNhc2UgYl9tb2RlOgorICAgICAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyAxKTsKKyAgICAgIG9wID0gKmNvZGVwKys7CisgICAgICBtYXNrID0gMHhmZjsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugdl9tb2RlOgorICAgICAgVVNFRF9SRVggKFJFWF9XKTsKKyAgICAgIGlmIChyZXggJiBSRVhfVykKKwlvcCA9IGdldDY0ICgpOworICAgICAgZWxzZSBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwl7CisJICBvcCA9IGdldDMyICgpOworCSAgbWFzayA9IDB4ZmZmZmZmZmY7CisJfQorICAgICAgZWxzZQorCXsKKwkgIG9wID0gZ2V0MTYgKCk7CisJICBtYXNrID0gMHhmZmZmZjsKKwl9CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Ugd19tb2RlOgorICAgICAgbWFzayA9IDB4ZmZmZmY7CisgICAgICBvcCA9IGdldDE2ICgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIG9wICY9IG1hc2s7CisgIHNjcmF0Y2hidWZbMF0gPSAnJCc7CisgIHByaW50X29wZXJhbmRfdmFsdWUgKHNjcmF0Y2hidWYgKyAxLCBzaXplb2Yoc2NyYXRjaGJ1ZikgLSAxLCAxLCBvcCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYgKyBpbnRlbF9zeW50YXgpOworICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQKK09QX3NJIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgYmZkX3NpZ25lZF92bWEgb3A7CisKKyAgc3dpdGNoIChieXRlbW9kZSkKKyAgICB7CisgICAgY2FzZSBiX21vZGU6CisgICAgICBmZXRjaF9kYXRhKHRoZV9pbmZvLCBjb2RlcCArIDEpOworICAgICAgb3AgPSAqY29kZXArKzsKKyAgICAgIGlmICgob3AgJiAweDgwKSAhPSAwKQorCW9wIC09IDB4MTAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBVU0VEX1JFWCAoUkVYX1cpOworICAgICAgaWYgKHJleCAmIFJFWF9XKQorCW9wID0gZ2V0MzJzICgpOworICAgICAgZWxzZSBpZiAoc2l6ZWZsYWcgJiBERkxBRykKKwl7CisJICBvcCA9IGdldDMycyAoKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgb3AgPSBnZXQxNiAoKTsKKwkgIGlmICgob3AgJiAweDgwMDApICE9IDApCisJICAgIG9wIC09IDB4MTAwMDA7CisJfQorICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHdfbW9kZToKKyAgICAgIG9wID0gZ2V0MTYgKCk7CisgICAgICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQorCW9wIC09IDB4MTAwMDA7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgb2FwcGVuZCAoSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgc2NyYXRjaGJ1ZlswXSA9ICckJzsKKyAgcHJpbnRfb3BlcmFuZF92YWx1ZSAoc2NyYXRjaGJ1ZiArIDEsIHNpemVvZihzY3JhdGNoYnVmKSAtIDEsIDEsIG9wKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9KIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgYmZkX3ZtYSBkaXNwOworICBiZmRfdm1hIG1hc2sgPSAtMTsKKyAgYmZkX3ZtYSBzZWdtZW50ID0gMDsKKworICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgIHsKKyAgICBjYXNlIGJfbW9kZToKKyAgICAgIGZldGNoX2RhdGEodGhlX2luZm8sIGNvZGVwICsgMSk7CisgICAgICBkaXNwID0gKmNvZGVwKys7CisgICAgICBpZiAoKGRpc3AgJiAweDgwKSAhPSAwKQorCWRpc3AgLT0gMHgxMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIHZfbW9kZToKKyAgICAgIGlmICgoc2l6ZWZsYWcgJiBERkxBRykgfHwgKHJleCAmIFJFWF9XKSkKKwlkaXNwID0gZ2V0MzJzICgpOworICAgICAgZWxzZQorCXsKKwkgIGRpc3AgPSBnZXQxNiAoKTsKKwkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKKwkgICAgZGlzcCAtPSAweDEwMDAwOworCSAgLyogSW4gMTZiaXQgbW9kZSwgYWRkcmVzcyBpcyB3cmFwcGVkIGFyb3VuZCBhdCA2NGsgd2l0aGluCisJICAgICB0aGUgc2FtZSBzZWdtZW50LiAgT3RoZXJ3aXNlLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wCisJICAgICBpbnN0cnVjdGlvbiBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlcgorCSAgICAgdGhlIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCisJICBtYXNrID0gMHhmZmZmOworCSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKSA9PSAwKQorCSAgICBzZWdtZW50ID0gKChzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXApCisJCSAgICAgICAmIH4oKGJmZF92bWEpIDB4ZmZmZikpOworCX0KKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7CisgICAgICByZXR1cm47CisgICAgfQorICBkaXNwID0gKChzdGFydF9wYyArIGNvZGVwIC0gc3RhcnRfY29kZXAgKyBkaXNwKSAmIG1hc2spIHwgc2VnbWVudDsKKyAgc2V0X29wIChkaXNwLCAwKTsKKyAgcHJpbnRfb3BlcmFuZF92YWx1ZSAoc2NyYXRjaGJ1Ziwgc2l6ZW9mKHNjcmF0Y2hidWYpLCAxLCBkaXNwKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9TRUcgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAoYnl0ZW1vZGUgPT0gd19tb2RlKQorICAgIG9hcHBlbmQgKG5hbWVzX3NlZ1ttb2RybS5yZWddKTsKKyAgZWxzZQorICAgIE9QX0UgKG1vZHJtLm1vZCA9PSAzID8gYnl0ZW1vZGUgOiB3X21vZGUsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK09QX0RJUiAoaW50IGR1bW15IEFUVFJJQlVURV9VTlVTRUQsIGludCBzaXplZmxhZykKK3sKKyAgaW50IHNlZywgb2Zmc2V0OworCisgIGlmIChzaXplZmxhZyAmIERGTEFHKQorICAgIHsKKyAgICAgIG9mZnNldCA9IGdldDMyICgpOworICAgICAgc2VnID0gZ2V0MTYgKCk7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7CisgICAgICBzZWcgPSBnZXQxNiAoKTsKKyAgICB9CisgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIweCV4OjB4JXgiLCBzZWcsIG9mZnNldCk7CisgIGVsc2UKKyAgICBzbnByaW50ZiAoc2NyYXRjaGJ1Ziwgc2l6ZW9mKHNjcmF0Y2hidWYpLCAiJDB4JXgsJDB4JXgiLCBzZWcsIG9mZnNldCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworfQorCitzdGF0aWMgdm9pZAorT1BfT0ZGIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgYmZkX3ZtYSBvZmY7CisKKyAgaWYgKGludGVsX3N5bnRheCAmJiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKyAgICBpbnRlbF9vcGVyYW5kX3NpemUgKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgIGFwcGVuZF9zZWcgKCk7CisKKyAgaWYgKChzaXplZmxhZyAmIEFGTEFHKSB8fCBhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkKKyAgICBvZmYgPSBnZXQzMiAoKTsKKyAgZWxzZQorICAgIG9mZiA9IGdldDE2ICgpOworCisgIGlmIChpbnRlbF9zeW50YXgpCisgICAgeworICAgICAgaWYgKCEocHJlZml4ZXMgJiAoUFJFRklYX0NTIHwgUFJFRklYX1NTIHwgUFJFRklYX0RTCisJCQl8IFBSRUZJWF9FUyB8IFBSRUZJWF9GUyB8IFBSRUZJWF9HUykpKQorCXsKKwkgIG9hcHBlbmQgKG5hbWVzX3NlZ1tkc19yZWcgLSBlc19yZWddKTsKKwkgIG9hcHBlbmQgKCI6Iik7CisJfQorICAgIH0KKyAgcHJpbnRfb3BlcmFuZF92YWx1ZSAoc2NyYXRjaGJ1Ziwgc2l6ZW9mKHNjcmF0Y2hidWYpLCAxLCBvZmYpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK09QX09GRjY0IChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgYmZkX3ZtYSBvZmY7CisKKyAgaWYgKGFkZHJlc3NfbW9kZSAhPSBtb2RlXzY0Yml0CisgICAgICB8fCAocHJlZml4ZXMgJiBQUkVGSVhfQUREUikpCisgICAgeworICAgICAgT1BfT0ZGIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICBpZiAoaW50ZWxfc3ludGF4ICYmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpKQorICAgIGludGVsX29wZXJhbmRfc2l6ZSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKKyAgYXBwZW5kX3NlZyAoKTsKKworICBvZmYgPSBnZXQ2NCAoKTsKKworICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHsKKyAgICAgIGlmICghKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUworCQkJfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKSkKKwl7CisJICBvYXBwZW5kIChuYW1lc19zZWdbZHNfcmVnIC0gZXNfcmVnXSk7CisJICBvYXBwZW5kICgiOiIpOworCX0KKyAgICB9CisgIHByaW50X29wZXJhbmRfdmFsdWUgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgMSwgb2ZmKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitwdHJfcmVnIChpbnQgY29kZSwgaW50IHNpemVmbGFnKQoreworICBjb25zdCBjaGFyICpzOworCisgICpvYnVmcCsrID0gb3Blbl9jaGFyOworICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKTsKKyAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0KQorICAgIHsKKyAgICAgIGlmICghKHNpemVmbGFnICYgQUZMQUcpKQorCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKKyAgICAgIGVsc2UKKwlzID0gbmFtZXM2NFtjb2RlIC0gZUFYX3JlZ107CisgICAgfQorICBlbHNlIGlmIChzaXplZmxhZyAmIEFGTEFHKQorICAgIHMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKKyAgZWxzZQorICAgIHMgPSBuYW1lczE2W2NvZGUgLSBlQVhfcmVnXTsKKyAgb2FwcGVuZCAocyk7CisgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKKyAgKm9idWZwID0gMDsKK30KKworc3RhdGljIHZvaWQKK09QX0VTcmVnIChpbnQgY29kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHsKKyAgICAgIHN3aXRjaCAoY29kZXBbLTFdKQorCXsKKwljYXNlIDB4NmQ6CS8qIGluc3cvaW5zbCAqLworCSAgaW50ZWxfb3BlcmFuZF9zaXplICh6X21vZGUsIHNpemVmbGFnKTsKKwkgIGJyZWFrOworCWNhc2UgMHhhNToJLyogbW92c3cvbW92c2wvbW92c3EgKi8KKwljYXNlIDB4YTc6CS8qIGNtcHN3L2NtcHNsL2NtcHNxICovCisJY2FzZSAweGFiOgkvKiBzdG9zdy9zdG9zbCAqLworCWNhc2UgMHhhZjoJLyogc2Nhc3cvc2Nhc2wgKi8KKwkgIGludGVsX29wZXJhbmRfc2l6ZSAodl9tb2RlLCBzaXplZmxhZyk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgaW50ZWxfb3BlcmFuZF9zaXplIChiX21vZGUsIHNpemVmbGFnKTsKKwl9CisgICAgfQorICBvYXBwZW5kIChJTlRFTF9TWU5UQVgoIiVlczoiKSk7CisgIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK09QX0RTcmVnIChpbnQgY29kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHsKKyAgICAgIHN3aXRjaCAoY29kZXBbLTFdKQorCXsKKwljYXNlIDB4NmY6CS8qIG91dHN3L291dHNsICovCisJICBpbnRlbF9vcGVyYW5kX3NpemUgKHpfbW9kZSwgc2l6ZWZsYWcpOworCSAgYnJlYWs7CisJY2FzZSAweGE1OgkvKiBtb3Zzdy9tb3ZzbC9tb3ZzcSAqLworCWNhc2UgMHhhNzoJLyogY21wc3cvY21wc2wvY21wc3EgKi8KKwljYXNlIDB4YWQ6CS8qIGxvZHN3L2xvZHNsL2xvZHNxICovCisJICBpbnRlbF9vcGVyYW5kX3NpemUgKHZfbW9kZSwgc2l6ZWZsYWcpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGludGVsX29wZXJhbmRfc2l6ZSAoYl9tb2RlLCBzaXplZmxhZyk7CisJfQorICAgIH0KKyAgaWYgKChwcmVmaXhlcworICAgICAgICYgKFBSRUZJWF9DUworCSAgfCBQUkVGSVhfRFMKKwkgIHwgUFJFRklYX1NTCisJICB8IFBSRUZJWF9FUworCSAgfCBQUkVGSVhfRlMKKwkgIHwgUFJFRklYX0dTKSkgPT0gMCkKKyAgICBwcmVmaXhlcyB8PSBQUkVGSVhfRFM7CisgIGFwcGVuZF9zZWcgKCk7CisgIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK09QX0MgKGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgaW50IGFkZCA9IDA7CisgIGlmIChyZXggJiBSRVhfUikKKyAgICB7CisgICAgICBVU0VEX1JFWCAoUkVYX1IpOworICAgICAgYWRkID0gODsKKyAgICB9CisgIGVsc2UgaWYgKGFkZHJlc3NfbW9kZSAhPSBtb2RlXzY0Yml0ICYmIChwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKSkKKyAgICB7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOworICAgICAgYWRkID0gODsKKyAgICB9CisgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJWNyJWQiLCBtb2RybS5yZWcgKyBhZGQpOworICBvYXBwZW5kIChzY3JhdGNoYnVmICsgaW50ZWxfc3ludGF4KTsKK30KKworc3RhdGljIHZvaWQKK09QX0QgKGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgaW50IGFkZCA9IDA7CisgIFVTRURfUkVYIChSRVhfUik7CisgIGlmIChyZXggJiBSRVhfUikKKyAgICBhZGQgPSA4OworICBpZiAoaW50ZWxfc3ludGF4KQorICAgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICJkYiVkIiwgbW9kcm0ucmVnICsgYWRkKTsKKyAgZWxzZQorICAgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJWRiJWQiLCBtb2RybS5yZWcgKyBhZGQpOworICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKK30KKworc3RhdGljIHZvaWQKK09QX1QgKGludCBkdW1teSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgc25wcmludGYgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgIiUldHIlZCIsIG1vZHJtLnJlZyk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYgKyBpbnRlbF9zeW50YXgpOworfQorCitzdGF0aWMgdm9pZAorT1BfUiAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGlmIChtb2RybS5tb2QgPT0gMykKKyAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICBlbHNlCisgICAgQmFkT3AgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9NTVggKGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQorICAgIHsKKyAgICAgIGludCBhZGQgPSAwOworICAgICAgVVNFRF9SRVggKFJFWF9SKTsKKyAgICAgIGlmIChyZXggJiBSRVhfUikKKwlhZGQgPSA4OworICAgICAgc25wcmludGYgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgIiUleG1tJWQiLCBtb2RybS5yZWcgKyBhZGQpOworICAgIH0KKyAgZWxzZQorICAgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJW1tJWQiLCBtb2RybS5yZWcpOworICBvYXBwZW5kIChzY3JhdGNoYnVmICsgaW50ZWxfc3ludGF4KTsKK30KKworc3RhdGljIHZvaWQKK09QX1hNTSAoaW50IGJ5dGVtb2RlIEFUVFJJQlVURV9VTlVTRUQsIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEKQoreworICBpbnQgYWRkID0gMDsKKyAgVVNFRF9SRVggKFJFWF9SKTsKKyAgaWYgKHJleCAmIFJFWF9SKQorICAgIGFkZCA9IDg7CisgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJXhtbSVkIiwgbW9kcm0ucmVnICsgYWRkKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9FTSAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGlmIChtb2RybS5tb2QgIT0gMykKKyAgICB7CisgICAgICBpZiAoaW50ZWxfc3ludGF4ICYmIGJ5dGVtb2RlID09IHZfbW9kZSkKKwl7CisJICBieXRlbW9kZSA9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKSA/IHhfbW9kZSA6IHFfbW9kZTsKKwkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworIAl9CisgICAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBTa2lwIG1vZC9ybSBieXRlLiAgKi8KKyAgTU9EUk1fQ0hFQ0s7CisgIGNvZGVwKys7CisgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKKyAgICB7CisgICAgICBpbnQgYWRkID0gMDsKKworICAgICAgVVNFRF9SRVggKFJFWF9CKTsKKyAgICAgIGlmIChyZXggJiBSRVhfQikKKwlhZGQgPSA4OworICAgICAgc25wcmludGYgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgIiUleG1tJWQiLCBtb2RybS5ybSArIGFkZCk7CisgICAgfQorICBlbHNlCisgICAgc25wcmludGYgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgIiUlbW0lZCIsIG1vZHJtLnJtKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKKy8qIGN2dCogYXJlIHRoZSBvbmx5IGluc3RydWN0aW9ucyBpbiBzc2UyIHdoaWNoIGhhdmUKKyAgIGJvdGggU1NFIGFuZCBNTVggb3BlcmFuZHMgYW5kIGFsc28gaGF2ZSAweDY2IHByZWZpeAorICAgaW4gdGhlaXIgb3Bjb2RlLiAweDY2IHdhcyBvcmlnaW5hbGx5IHVzZWQgdG8gZGlmZmVyZW50aWF0ZQorICAgYmV0d2VlbiBTU0UgYW5kIE1NWCBpbnN0cnVjdGlvbihvcGVyYW5kcykuIFNvIHdlIGhhdmUgdG8gaGFuZGxlIHRoZQorICAgY3Z0KiBzZXBhcmF0ZWx5IHVzaW5nIE9QX0VNQyBhbmQgT1BfTVhDICovCitzdGF0aWMgdm9pZAorT1BfRU1DIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKG1vZHJtLm1vZCAhPSAzKQorICAgIHsKKyAgICAgIGlmIChpbnRlbF9zeW50YXggJiYgYnl0ZW1vZGUgPT0gdl9tb2RlKQorCXsKKwkgIGJ5dGVtb2RlID0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpID8geF9tb2RlIDogcV9tb2RlOworCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisgCX0KKyAgICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qIFNraXAgbW9kL3JtIGJ5dGUuICAqLworICBNT0RSTV9DSEVDSzsKKyAgY29kZXArKzsKKyAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7CisgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJW1tJWQiLCBtb2RybS5ybSk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYgKyBpbnRlbF9zeW50YXgpOworfQorCitzdGF0aWMgdm9pZAorT1BfTVhDIChpbnQgYnl0ZW1vZGUgQVRUUklCVVRFX1VOVVNFRCwgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICBzbnByaW50ZiAoc2NyYXRjaGJ1Ziwgc2l6ZW9mKHNjcmF0Y2hidWYpLCAiJSVtbSVkIiwgbW9kcm0ucmVnKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9FWCAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIGludCBhZGQgPSAwOworICBpZiAobW9kcm0ubW9kICE9IDMpCisgICAgeworICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIFVTRURfUkVYIChSRVhfQik7CisgIGlmIChyZXggJiBSRVhfQikKKyAgICBhZGQgPSA4OworCisgIC8qIFNraXAgbW9kL3JtIGJ5dGUuICAqLworICBNT0RSTV9DSEVDSzsKKyAgY29kZXArKzsKKyAgc25wcmludGYgKHNjcmF0Y2hidWYsIHNpemVvZihzY3JhdGNoYnVmKSwgIiUleG1tJWQiLCBtb2RybS5ybSArIGFkZCk7CisgIG9hcHBlbmQgKHNjcmF0Y2hidWYgKyBpbnRlbF9zeW50YXgpOworfQorCitzdGF0aWMgdm9pZAorT1BfTVMgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAobW9kcm0ubW9kID09IDMpCisgICAgT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgIGVsc2UKKyAgICBCYWRPcCAoKTsKK30KKworc3RhdGljIHZvaWQKK09QX1hTIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKG1vZHJtLm1vZCA9PSAzKQorICAgIE9QX0VYIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICBlbHNlCisgICAgQmFkT3AgKCk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF9NIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKG1vZHJtLm1vZCA9PSAzKQorICAgIC8qIGJhZCBib3VuZCxsZWEsbGRzLGxlcyxsZnMsbGdzLGxzcyxjbXB4Y2hnOGIsdm1wdHJzdCBtb2RybSAqLworICAgIEJhZE9wICgpOworICBlbHNlCisgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK09QXzBmMDcgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBpZiAobW9kcm0ubW9kICE9IDMgfHwgbW9kcm0ucm0gIT0gMCkKKyAgICBCYWRPcCAoKTsKKyAgZWxzZQorICAgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitPUF8wZmFlIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKG1vZHJtLm1vZCA9PSAzKQorICAgIHsKKyAgICAgIGlmIChtb2RybS5yZWcgPT0gNykKKwlzdHJjcHkgKG9idWYgKyBzdHJsZW4gKG9idWYpIC0gc2l6ZW9mICgiY2xmbHVzaCIpICsgMSwgInNmZW5jZSIpOworCisgICAgICBpZiAobW9kcm0ucmVnIDwgNSB8fCBtb2RybS5ybSAhPSAwKQorCXsKKwkgIEJhZE9wICgpOwkvKiBiYWQgc2ZlbmNlLCBtZmVuY2UsIG9yIGxmZW5jZSAqLworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIGVsc2UgaWYgKG1vZHJtLnJlZyAhPSA3KQorICAgIHsKKyAgICAgIEJhZE9wICgpOwkJLyogYmFkIGNsZmx1c2ggKi8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKK30KKworLyogTk9QIGlzIGFuIGFsaWFzIG9mICJ4Y2hnICVheCwlYXgiIGluIDE2Yml0IG1vZGUsICJ4Y2hnICVlYXgsJWVheCIgaW4KKyAgIDMyYml0IG1vZGUgYW5kICJ4Y2hnICVyYXgsJXJheCIgaW4gNjRiaXQgbW9kZS4gICovCisKK3N0YXRpYyB2b2lkCitOT1BfRml4dXAxIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKSAhPSAwCisgICAgICB8fCAocmV4ICE9IDAKKwkgICYmIHJleCAhPSAweDQ4CisJICAmJiBhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkpCisgICAgT1BfUkVHIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICBlbHNlCisgICAgc3RyY3B5IChvYnVmLCAibm9wIik7Cit9CisKK3N0YXRpYyB2b2lkCitOT1BfRml4dXAyIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKSAhPSAwCisgICAgICB8fCAocmV4ICE9IDAKKwkgICYmIHJleCAhPSAweDQ4CisJICAmJiBhZGRyZXNzX21vZGUgPT0gbW9kZV82NGJpdCkpCisgICAgT1BfSU1SRUcgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpTdWZmaXgzRE5vd1tdID0geworLyogMDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDA0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAwOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMEMgKi8JInBpMmZ3IiwJInBpMmZkIiwJTlVMTCwJCU5VTEwsCisvKiAxMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMTQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDE4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAxQyAqLwkicGYyaXciLAkicGYyaWQiLAlOVUxMLAkJTlVMTCwKKy8qIDIwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAyNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAzMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogMzQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDM4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiAzQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDQ0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA0OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNEMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDUwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA1NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNTggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDVDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA2MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDY4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA2QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogNzAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDc0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA3OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogN0MgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIDgwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA4NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogODggKi8JTlVMTCwJCU5VTEwsCQkicGZuYWNjIiwJTlVMTCwKKy8qIDhDICovCU5VTEwsCQlOVUxMLAkJInBmcG5hY2MiLAlOVUxMLAorLyogOTAgKi8JInBmY21wZ2UiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiA5NCAqLwkicGZtaW4iLAlOVUxMLAkJInBmcmNwIiwJInBmcnNxcnQiLAorLyogOTggKi8JTlVMTCwJCU5VTEwsCQkicGZzdWIiLAlOVUxMLAorLyogOUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhZGQiLAlOVUxMLAorLyogQTAgKi8JInBmY21wZ3QiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBBNCAqLwkicGZtYXgiLAlOVUxMLAkJInBmcmNwaXQxIiwJInBmcnNxaXQxIiwKKy8qIEE4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViciIsCU5VTEwsCisvKiBBQyAqLwlOVUxMLAkJTlVMTCwJCSJwZmFjYyIsCU5VTEwsCisvKiBCMCAqLwkicGZjbXBlcSIsCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEI0ICovCSJwZm11bCIsCU5VTEwsCQkicGZyY3BpdDIiLAkicG11bGhydyIsCisvKiBCOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQkicHN3YXBkIiwKKy8qIEJDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCSJwYXZndXNiIiwKKy8qIEMwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBDNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogQzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIENDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBEMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEQ4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBEQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEU0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBFOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRUMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEYwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCisvKiBGNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAorLyogRjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKKy8qIEZDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCit9OworCitzdGF0aWMgdm9pZAorT1BfM0ROb3dTdWZmaXggKGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgY29uc3QgY2hhciAqbW5lbW9uaWM7CisKKyAgZmV0Y2hfZGF0YSh0aGVfaW5mbywgY29kZXAgKyAxKTsKKyAgLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHNwZWNpZmllZCBieSBhbiBvcGNvZGUgc3VmZml4IGluIHRoZQorICAgICBwbGFjZSB3aGVyZSBhbiA4LWJpdCBpbW1lZGlhdGUgd291bGQgbm9ybWFsbHkgZ28uICBpZS4gdGhlIGxhc3QKKyAgICAgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLworICBvYnVmcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOworICBtbmVtb25pYyA9IFN1ZmZpeDNETm93Wypjb2RlcCsrICYgMHhmZl07CisgIGlmIChtbmVtb25pYykKKyAgICBvYXBwZW5kIChtbmVtb25pYyk7CisgIGVsc2UKKyAgICB7CisgICAgICAvKiBTaW5jZSBhIHZhcmlhYmxlIHNpemVkIG1vZHJtL3NpYiBjaHVuayBpcyBiZXR3ZWVuIHRoZSBzdGFydAorCSBvZiB0aGUgb3Bjb2RlICgweDBmMGYpIGFuZCB0aGUgb3Bjb2RlIHN1ZmZpeCwgd2UgbmVlZCB0byBkbworCSBhbGwgdGhlIG1vZHJtIHByb2Nlc3NpbmcgZmlyc3QsIGFuZCBkb24ndCBrbm93IHVudGlsIG5vdyB0aGF0CisJIHdlIGhhdmUgYSBiYWQgb3Bjb2RlLiAgVGhpcyBuZWNlc3NpdGF0ZXMgc29tZSBjbGVhbmluZyB1cC4gICovCisgICAgICBvcF9vdXRbMF1bMF0gPSAnXDAnOworICAgICAgb3Bfb3V0WzFdWzBdID0gJ1wwJzsKKyAgICAgIEJhZE9wICgpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNpbWRfY21wX29wW10gPSB7CisgICJlcSIsCisgICJsdCIsCisgICJsZSIsCisgICJ1bm9yZCIsCisgICJuZXEiLAorICAibmx0IiwKKyAgIm5sZSIsCisgICJvcmQiCit9OworCitzdGF0aWMgdm9pZAorT1BfU0lNRF9TdWZmaXggKGludCBieXRlbW9kZSBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgdW5zaWduZWQgaW50IGNtcF90eXBlOworCisgIGZldGNoX2RhdGEodGhlX2luZm8sIGNvZGVwICsgMSk7CisgIG9idWZwID0gb2J1ZiArIHN0cmxlbiAob2J1Zik7CisgIGNtcF90eXBlID0gKmNvZGVwKysgJiAweGZmOworICBpZiAoY21wX3R5cGUgPCA4KQorICAgIHsKKyAgICAgIGNoYXIgc3VmZml4MSA9ICdwJywgc3VmZml4MiA9ICdzJzsKKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOworICAgICAgaWYgKHByZWZpeGVzICYgUFJFRklYX1JFUFopCisJc3VmZml4MSA9ICdzJzsKKyAgICAgIGVsc2UKKwl7CisJICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKKwkgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQorCSAgICBzdWZmaXgyID0gJ2QnOworCSAgZWxzZQorCSAgICB7CisJICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfUkVQTlopOworCSAgICAgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWikKKwkJc3VmZml4MSA9ICdzJywgc3VmZml4MiA9ICdkJzsKKwkgICAgfQorCX0KKyAgICAgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICJjbXAlcyVjJWMiLAorICAgICAgICAgICAgICAgIHNpbWRfY21wX29wW2NtcF90eXBlXSwgc3VmZml4MSwgc3VmZml4Mik7CisgICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKTsKKyAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIC8qIFdlIGhhdmUgYSBiYWQgZXh0ZW5zaW9uIGJ5dGUuICBDbGVhbiB1cC4gICovCisgICAgICBvcF9vdXRbMF1bMF0gPSAnXDAnOworICAgICAgb3Bfb3V0WzFdWzBdID0gJ1wwJzsKKyAgICAgIEJhZE9wICgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK1NJTURfRml4dXAgKGludCBleHRyYWNoYXIsIGludCBzaXplZmxhZyBBVFRSSUJVVEVfVU5VU0VEKQoreworICAvKiBDaGFuZ2UgbW92bHBzL21vdmhwcyB0byBtb3ZobHBzL21vdmxocHMgZm9yIDIgcmVnaXN0ZXIgb3BlcmFuZAorICAgICBmb3JtcyBvZiB0aGVzZSBpbnN0cnVjdGlvbnMuICAqLworICBpZiAobW9kcm0ubW9kID09IDMpCisgICAgeworICAgICAgY2hhciAqcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpOworICAgICAgKihwICsgMSkgPSAnXDAnOworICAgICAgKnAgICAgICAgPSAqKHAgLSAxKTsKKyAgICAgICoocCAtIDEpID0gKihwIC0gMik7CisgICAgICAqKHAgLSAyKSA9ICoocCAtIDMpOworICAgICAgKihwIC0gMykgPSBleHRyYWNoYXI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorUE5JX0ZpeHVwIChpbnQgZXh0cmFjaGFyIEFUVFJJQlVURV9VTlVTRUQsIGludCBzaXplZmxhZykKK3sKKyAgaWYgKG1vZHJtLm1vZCA9PSAzICYmIG1vZHJtLnJlZyA9PSAxICYmIG1vZHJtLnJtIDw9IDEpCisgICAgeworICAgICAgLyogT3ZlcnJpZGUgInNpZHQiLiAgKi8KKyAgICAgIHNpemVfdCBvbGVuID0gc3RybGVuIChvYnVmKTsKKyAgICAgIGNoYXIgKnAgPSBvYnVmICsgb2xlbiAtIDQ7CisgICAgICBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzID0gKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0CisJCQkgICAgPyBuYW1lczY0IDogbmFtZXMzMik7CisKKyAgICAgIC8qIFdlIG1pZ2h0IGhhdmUgYSBzdWZmaXggd2hlbiBkaXNhc3NlbWJsaW5nIHdpdGggLU1zdWZmaXguICAqLworICAgICAgaWYgKCpwID09ICdpJykKKwktLXA7CisKKyAgICAgIC8qIFJlbW92ZSAiYWRkcjE2L2FkZHIzMiIgaWYgd2UgYXJlbid0IGluIEludGVsIG1vZGUuICAqLworICAgICAgaWYgKCFpbnRlbF9zeW50YXgKKwkgICYmIChwcmVmaXhlcyAmIFBSRUZJWF9BRERSKQorCSAgJiYgb2xlbiA+PSAoNCArIDcpCisJICAmJiAqKHAgLSAxKSA9PSAnICcKKwkgICYmIHN0cm5jbXAgKHAgLSA3LCAiYWRkciIsIDQpID09IDAKKwkgICYmIChzdHJuY21wIChwIC0gMywgIjE2IiwgMikgPT0gMAorCSAgICAgIHx8IHN0cm5jbXAgKHAgLSAzLCAiMzIiLCAyKSA9PSAwKSkKKwlwIC09IDc7CisKKyAgICAgIGlmIChtb2RybS5ybSkKKwl7CisJICAvKiBtd2FpdCAlZWF4LCVlY3ggICovCisJICBzdHJjcHkgKHAsICJtd2FpdCIpOworCSAgaWYgKCFpbnRlbF9zeW50YXgpCisJICAgIHN0cmNweSAob3Bfb3V0WzBdLCBuYW1lc1swXSk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIC8qIG1vbml0b3IgJWVheCwlZWN4LCVlZHgiICAqLworCSAgc3RyY3B5IChwLCAibW9uaXRvciIpOworCSAgaWYgKCFpbnRlbF9zeW50YXgpCisJICAgIHsKKwkgICAgICBjb25zdCBjaGFyICogY29uc3QgKm9wMV9uYW1lczsKKwkgICAgICBpZiAoIShwcmVmaXhlcyAmIFBSRUZJWF9BRERSKSkKKwkJb3AxX25hbWVzID0gKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzE2Yml0CisJCQkgICAgID8gbmFtZXMxNiA6IG5hbWVzKTsKKwkgICAgICBlbHNlCisJCXsKKwkJICBvcDFfbmFtZXMgPSAoYWRkcmVzc19tb2RlICE9IG1vZGVfMzJiaXQKKwkJCSAgICAgICA/IG5hbWVzMzIgOiBuYW1lczE2KTsKKwkJICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9BRERSOworCQl9CisJICAgICAgc3RyY3B5IChvcF9vdXRbMF0sIG9wMV9uYW1lc1swXSk7CisJICAgICAgc3RyY3B5IChvcF9vdXRbMl0sIG5hbWVzWzJdKTsKKwkgICAgfQorCX0KKyAgICAgIGlmICghaW50ZWxfc3ludGF4KQorCXsKKwkgIHN0cmNweSAob3Bfb3V0WzFdLCBuYW1lc1sxXSk7CisJICB0d29fc291cmNlX29wcyA9IDE7CisJfQorCisgICAgICBjb2RlcCsrOworICAgIH0KKyAgZWxzZQorICAgIE9QX00gKDAsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK1NWTUVfRml4dXAgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBjb25zdCBjaGFyICphbHQ7CisgIGNoYXIgKnA7CisKKyAgc3dpdGNoICgqY29kZXApCisgICAgeworICAgIGNhc2UgMHhkODoKKyAgICAgIGFsdCA9ICJ2bXJ1biI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZDk6CisgICAgICBhbHQgPSAidm1tY2FsbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZGE6CisgICAgICBhbHQgPSAidm1sb2FkIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhkYjoKKyAgICAgIGFsdCA9ICJ2bXNhdmUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGRjOgorICAgICAgYWx0ID0gInN0Z2kiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGRkOgorICAgICAgYWx0ID0gImNsZ2kiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAweGRlOgorICAgICAgYWx0ID0gInNraW5pdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZGY6CisgICAgICBhbHQgPSAiaW52bHBnYSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgT1BfTSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIC8qIE92ZXJyaWRlICJsaWR0Ii4gICovCisgIHAgPSBvYnVmICsgc3RybGVuIChvYnVmKSAtIDQ7CisgIC8qIFdlIG1pZ2h0IGhhdmUgYSBzdWZmaXguICAqLworICBpZiAoKnAgPT0gJ2knKQorICAgIC0tcDsKKyAgc3RyY3B5IChwLCBhbHQpOworICBpZiAoIShwcmVmaXhlcyAmIFBSRUZJWF9BRERSKSkKKyAgICB7CisgICAgICArK2NvZGVwOworICAgICAgcmV0dXJuOworICAgIH0KKyAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfQUREUjsKKyAgc3dpdGNoICgqY29kZXArKykKKyAgICB7CisgICAgY2FzZSAweGRmOgorICAgICAgc3RyY3B5IChvcF9vdXRbMV0sIG5hbWVzMzJbMV0pOworICAgICAgdHdvX3NvdXJjZV9vcHMgPSAxOworCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICBjYXNlIDB4ZDg6CisgICAgY2FzZSAweGRhOgorICAgIGNhc2UgMHhkYjoKKyAgICAgICpvYnVmcCsrID0gb3Blbl9jaGFyOworICAgICAgaWYgKGFkZHJlc3NfbW9kZSA9PSBtb2RlXzY0Yml0IHx8IChzaXplZmxhZyAmIEFGTEFHKSkKKyAgICAgICAgYWx0ID0gbmFtZXMzMlswXTsKKyAgICAgIGVsc2UKKyAgICAgICAgYWx0ID0gbmFtZXMxNlswXTsKKyAgICAgIHN0cmNweSAob2J1ZnAsIGFsdCk7CisgICAgICBvYnVmcCArPSBzdHJsZW4gKGFsdCk7CisgICAgICAqb2J1ZnArKyA9IGNsb3NlX2NoYXI7CisgICAgICAqb2J1ZnAgPSAnXDAnOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorSU5WTFBHX0ZpeHVwIChpbnQgYnl0ZW1vZGUsIGludCBzaXplZmxhZykKK3sKKyAgY29uc3QgY2hhciAqYWx0OworCisgIHN3aXRjaCAoKmNvZGVwKQorICAgIHsKKyAgICBjYXNlIDB4Zjg6CisgICAgICBhbHQgPSAic3dhcGdzIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHhmOToKKyAgICAgIGFsdCA9ICJyZHRzY3AiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIE9QX00gKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgICAgICByZXR1cm47CisgICAgfQorICAvKiBPdmVycmlkZSAiaW52bHBnIi4gICovCisgIHN0cmNweSAob2J1ZiArIHN0cmxlbiAob2J1ZikgLSA2LCBhbHQpOworICBjb2RlcCsrOworfQorCitzdGF0aWMgdm9pZAorQmFkT3AgKHZvaWQpCit7CisgIC8qIFRocm93IGF3YXkgcHJlZml4ZXMgYW5kIDFzdC4gb3Bjb2RlIGJ5dGUuICAqLworICBjb2RlcCA9IGluc25fY29kZXAgKyAxOworICBvYXBwZW5kICgiKGJhZCkiKTsKK30KKworc3RhdGljIHZvaWQKK1ZNWF9GaXh1cCAoaW50IGV4dHJhY2hhciBBVFRSSUJVVEVfVU5VU0VELCBpbnQgc2l6ZWZsYWcpCit7CisgIGlmIChtb2RybS5tb2QgPT0gMworICAgICAgJiYgbW9kcm0ucmVnID09IDAKKyAgICAgICYmIG1vZHJtLnJtID49MQorICAgICAgJiYgbW9kcm0ucm0gPD0gNCkKKyAgICB7CisgICAgICAvKiBPdmVycmlkZSAic2dkdCIuICAqLworICAgICAgY2hhciAqcCA9IG9idWYgKyBzdHJsZW4gKG9idWYpIC0gNDsKKworICAgICAgLyogV2UgbWlnaHQgaGF2ZSBhIHN1ZmZpeCB3aGVuIGRpc2Fzc2VtYmxpbmcgd2l0aCAtTXN1ZmZpeC4gICovCisgICAgICBpZiAoKnAgPT0gJ2cnKQorCS0tcDsKKworICAgICAgc3dpdGNoIChtb2RybS5ybSkKKwl7CisJY2FzZSAxOgorCSAgc3RyY3B5IChwLCAidm1jYWxsIik7CisJICBicmVhazsKKwljYXNlIDI6CisJICBzdHJjcHkgKHAsICJ2bWxhdW5jaCIpOworCSAgYnJlYWs7CisJY2FzZSAzOgorCSAgc3RyY3B5IChwLCAidm1yZXN1bWUiKTsKKwkgIGJyZWFrOworCWNhc2UgNDoKKwkgIHN0cmNweSAocCwgInZteG9mZiIpOworCSAgYnJlYWs7CisJfQorCisgICAgICBjb2RlcCsrOworICAgIH0KKyAgZWxzZQorICAgIE9QX0UgKDAsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK09QX1ZNWCAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgKFBSRUZJWF9EQVRBIHwgUFJFRklYX1JFUFopKTsKKyAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCisgICAgc3RyY3B5IChvYnVmLCAidm1jbGVhciIpOworICBlbHNlIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKQorICAgIHN0cmNweSAob2J1ZiwgInZteG9uIik7CisgIGVsc2UKKyAgICBzdHJjcHkgKG9idWYsICJ2bXB0cmxkIik7CisgIE9QX0UgKGJ5dGVtb2RlLCBzaXplZmxhZyk7Cit9CisKK3N0YXRpYyB2b2lkCitSRVBfRml4dXAgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICAvKiBUaGUgMHhmMyBwcmVmaXggc2hvdWxkIGJlIGRpc3BsYXllZCBhcyAicmVwIiBmb3IgaW5zLCBvdXRzLCBtb3ZzLAorICAgICBsb2RzIGFuZCBzdG9zLiAgKi8KKyAgc2l6ZV90IGlsZW4gPSAwOworCisgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKQorICAgIHN3aXRjaCAoKmluc25fY29kZXApCisgICAgICB7CisgICAgICBjYXNlIDB4NmU6CS8qIG91dHNiICovCisgICAgICBjYXNlIDB4NmY6CS8qIG91dHN3L291dHNsICovCisgICAgICBjYXNlIDB4YTQ6CS8qIG1vdnNiICovCisgICAgICBjYXNlIDB4YTU6CS8qIG1vdnN3L21vdnNsL21vdnNxICovCisJaWYgKCFpbnRlbF9zeW50YXgpCisJICBpbGVuID0gNTsKKwllbHNlCisJICBpbGVuID0gNDsKKwlicmVhazsKKyAgICAgIGNhc2UgMHhhYToJLyogc3Rvc2IgKi8KKyAgICAgIGNhc2UgMHhhYjoJLyogc3Rvc3cvc3Rvc2wvc3Rvc3EgKi8KKyAgICAgIGNhc2UgMHhhYzoJLyogbG9kc2IgKi8KKyAgICAgIGNhc2UgMHhhZDoJLyogbG9kc3cvbG9kc2wvbG9kc3EgKi8KKwlpZiAoIWludGVsX3N5bnRheCAmJiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKSkKKwkgIGlsZW4gPSA1OworCWVsc2UKKwkgIGlsZW4gPSA0OworCWJyZWFrOworICAgICAgY2FzZSAweDZjOgkvKiBpbnNiICovCisgICAgICBjYXNlIDB4NmQ6CS8qIGluc2wvaW5zdyAqLworCWlmICghaW50ZWxfc3ludGF4KQorCSAgaWxlbiA9IDQ7CisJZWxzZQorCSAgaWxlbiA9IDM7CisJYnJlYWs7CisgICAgICBkZWZhdWx0OgorCWFib3J0ICgpOworCWJyZWFrOworICAgICAgfQorCisgIGlmIChpbGVuICE9IDApCisgICAgeworICAgICAgc2l6ZV90IG9sZW47CisgICAgICBjaGFyICpwOworCisgICAgICBvbGVuID0gc3RybGVuIChvYnVmKTsKKyAgICAgIHAgPSBvYnVmICsgb2xlbiAtIGlsZW4gLSAxIC0gNDsKKyAgICAgIC8qIEhhbmRsZSAicmVweiBbYWRkcjE2fGFkZHIzMl0iLiAgKi8KKyAgICAgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfQUREUikpCisJcCAtPSAxICsgNjsKKworICAgICAgbWVtbW92ZSAocCArIDMsIHAgKyA0LCBvbGVuIC0gKHAgKyAzIC0gb2J1ZikpOworICAgIH0KKworICBzd2l0Y2ggKGJ5dGVtb2RlKQorICAgIHsKKyAgICBjYXNlIGFsX3JlZzoKKyAgICBjYXNlIGVBWF9yZWc6CisgICAgY2FzZSBpbmRpcl9keF9yZWc6CisgICAgICBPUF9JTVJFRyAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgZURJX3JlZzoKKyAgICAgIE9QX0VTcmVnIChieXRlbW9kZSwgc2l6ZWZsYWcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBlU0lfcmVnOgorICAgICAgT1BfRFNyZWcgKGJ5dGVtb2RlLCBzaXplZmxhZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYWJvcnQgKCk7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitDTVBYQ0hHOEJfRml4dXAgKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKQoreworICBVU0VEX1JFWCAoUkVYX1cpOworICBpZiAocmV4ICYgUkVYX1cpCisgICAgeworICAgICAgLyogQ2hhbmdlIGNtcHhjaGc4YiB0byBjbXB4Y2hnMTZiLiAgKi8KKyAgICAgIGNoYXIgKnAgPSBvYnVmICsgc3RybGVuIChvYnVmKSAtIDI7CisgICAgICBzdHJjcHkgKHAsICIxNmIiKTsKKyAgICAgIGJ5dGVtb2RlID0gb19tb2RlOworICAgIH0KKyAgT1BfTSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKK30KKworc3RhdGljIHZvaWQKK1hNTV9GaXh1cCAoaW50IHJlZywgaW50IHNpemVmbGFnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHNucHJpbnRmIChzY3JhdGNoYnVmLCBzaXplb2Yoc2NyYXRjaGJ1ZiksICIlJXhtbSVkIiwgcmVnKTsKKyAgb2FwcGVuZCAoc2NyYXRjaGJ1ZiArIGludGVsX3N5bnRheCk7Cit9CisKK3N0YXRpYyB2b2lkCitDUkMzMl9GaXh1cCAoaW50IGJ5dGVtb2RlLCBpbnQgc2l6ZWZsYWcpCit7CisgIC8qIEFkZCBwcm9wZXIgc3VmZml4IHRvICJjcmMzMiIuICAqLworICBjaGFyICpwID0gb2J1ZiArIHN0cmxlbiAob2J1Zik7CisKKyAgc3dpdGNoIChieXRlbW9kZSkKKyAgICB7CisgICAgY2FzZSBiX21vZGU6CisgICAgICBpZiAoaW50ZWxfc3ludGF4KQorCWJyZWFrOworCisgICAgICAqcCsrID0gJ2InOworICAgICAgYnJlYWs7CisgICAgY2FzZSB2X21vZGU6CisgICAgICBpZiAoaW50ZWxfc3ludGF4KQorCWJyZWFrOworCisgICAgICBVU0VEX1JFWCAoUkVYX1cpOworICAgICAgaWYgKHJleCAmIFJFWF9XKQorCSpwKysgPSAncSc7CisgICAgICBlbHNlIGlmIChzaXplZmxhZyAmIERGTEFHKQorCSpwKysgPSAnbCc7CisgICAgICBlbHNlCisJKnArKyA9ICd3JzsKKyAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7CisgICAgICBicmVhazsKKyAgICB9CisgICpwID0gJ1wwJzsKKworICBpZiAobW9kcm0ubW9kID09IDMpCisgICAgeworICAgICAgaW50IGFkZDsKKworICAgICAgLyogU2tpcCBtb2Qvcm0gYnl0ZS4gICovCisgICAgICBNT0RSTV9DSEVDSzsKKyAgICAgIGNvZGVwKys7CisKKyAgICAgIFVTRURfUkVYIChSRVhfQik7CisgICAgICBhZGQgPSAocmV4ICYgUkVYX0IpID8gOCA6IDA7CisgICAgICBpZiAoYnl0ZW1vZGUgPT0gYl9tb2RlKQorCXsKKwkgIFVTRURfUkVYICgwKTsKKwkgIGlmIChyZXgpCisJICAgIG9hcHBlbmQgKG5hbWVzOHJleFttb2RybS5ybSArIGFkZF0pOworCSAgZWxzZQorCSAgICBvYXBwZW5kIChuYW1lczhbbW9kcm0ucm0gKyBhZGRdKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgVVNFRF9SRVggKFJFWF9XKTsKKwkgIGlmIChyZXggJiBSRVhfVykKKwkgICAgb2FwcGVuZCAobmFtZXM2NFttb2RybS5ybSArIGFkZF0pOworCSAgZWxzZSBpZiAoKHByZWZpeGVzICYgUFJFRklYX0RBVEEpKQorCSAgICBvYXBwZW5kIChuYW1lczE2W21vZHJtLnJtICsgYWRkXSk7CisJICBlbHNlCisJICAgIG9hcHBlbmQgKG5hbWVzMzJbbW9kcm0ucm0gKyBhZGRdKTsKKwl9CisgICAgfQorICBlbHNlCisgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZGlzYXMvbWlwcy5jIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1ZTQxMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvZGlzYXMvbWlwcy5jCkBAIC0wLDAgKzEsNDg3OSBAQAorLyogUHJpbnQgbWlwcyBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgb3IgZm9yIG9iamR1bXAuCisgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyAgIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgQ29udHJpYnV0ZWQgYnkgTm9idXl1a2kgSGlraWNoaShoaWtpY2hpQHNyYS5jby5qcCkuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisjaW5jbHVkZSAiZGlzYXMvYmZkLmgiCisKKy8qIG1pcHMuaC4gIE1pcHMgb3Bjb2RlIGxpc3QgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KKyAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKKyAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsCitzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogVGhlc2UgYXJlIGJpdCBtYXNrcyBhbmQgc2hpZnQgY291bnRzIHRvIHVzZSB0byBhY2Nlc3MgdGhlIHZhcmlvdXMKKyAgIGZpZWxkcyBvZiBhbiBpbnN0cnVjdGlvbi4gIFRvIHJldHJpZXZlIHRoZSBYIGZpZWxkIG9mIGFuCisgICBpbnN0cnVjdGlvbiwgdXNlIHRoZSBleHByZXNzaW9uCisJKGkgPj4gT1BfU0hfWCkgJiBPUF9NQVNLX1gKKyAgIFRvIHNldCB0aGUgc2FtZSBmaWVsZCAodG8gaiksIHVzZQorCWkgPSAoaSAmfiAoT1BfTUFTS19YIDw8IE9QX1NIX1gpKSB8IChqIDw8IE9QX1NIX1gpCisKKyAgIE1ha2Ugc3VyZSB5b3UgdXNlIGZpZWxkcyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGluc3RydWN0aW9uLAorICAgb2YgY291cnNlLgorCisgICBUaGUgJ2knIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQgYW5kIElNTUVESUFURS4KKworICAgVGhlICdqJyBmb3JtYXQgdXNlcyBPUCBhbmQgVEFSR0VULgorCisgICBUaGUgJ3InIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQsIFJELCBTSEFNVCBhbmQgRlVOQ1QuCisKKyAgIFRoZSAnYicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgREVMVEEuCisKKyAgIFRoZSBmbG9hdGluZyBwb2ludCAnaScgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgSU1NRURJQVRFLgorCisgICBUaGUgZmxvYXRpbmcgcG9pbnQgJ3InIGZvcm1hdCB1c2VzIE9QLCBGTVQsIEZULCBGUywgRkQgYW5kIEZVTkNULgorCisgICBBIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gdXNlcyBPUCwgQ09ERSBhbmQgU1BFQyAoMTAgYml0cyBvZiB0aGUKKyAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBkZWZpbmVkOyBLYW5lIHNheXMgdGhlIGJyZWFrcG9pbnQKKyAgIGNvZGUgZmllbGQgaW4gQlJFQUsgaXMgMjAgYml0czsgeWV0IE1JUFMgYXNzZW1ibGVycyBhbmQgZGVidWdnZXJzCisgICBvbmx5IHVzZSB0ZW4gYml0cykuICBBbiBvcHRpb25hbCB0d28tb3BlcmFuZCBmb3JtIG9mIGJyZWFrL3NkYmJwCisgICBhbGxvd3MgdGhlIGxvd2VyIHRlbiBiaXRzIHRvIGJlIHNldCB0b28sIGFuZCBNSVBTMzIgYW5kIGxhdGVyCisgICBhcmNoaXRlY3R1cmVzIGFsbG93IDIwIGJpdHMgdG8gYmUgc2V0IHdpdGggYSBzaWduYWwgb3BlcmFuZAorICAgKHVzaW5nIENPREUyMCkuCisKKyAgIFRoZSBzeXNjYWxsIGluc3RydWN0aW9uIHVzZXMgQ09ERTIwLgorCisgICBUaGUgZ2VuZXJhbCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdXNlIENPUFouICAqLworCisjZGVmaW5lIE9QX01BU0tfT1AJCTB4M2YKKyNkZWZpbmUgT1BfU0hfT1AJCTI2CisjZGVmaW5lIE9QX01BU0tfUlMJCTB4MWYKKyNkZWZpbmUgT1BfU0hfUlMJCTIxCisjZGVmaW5lIE9QX01BU0tfRlIJCTB4MWYKKyNkZWZpbmUgT1BfU0hfRlIJCTIxCisjZGVmaW5lIE9QX01BU0tfRk1UCQkweDFmCisjZGVmaW5lIE9QX1NIX0ZNVAkJMjEKKyNkZWZpbmUgT1BfTUFTS19CQ0MJCTB4NworI2RlZmluZSBPUF9TSF9CQ0MJCTE4CisjZGVmaW5lIE9QX01BU0tfQ09ERQkJMHgzZmYKKyNkZWZpbmUgT1BfU0hfQ09ERQkJMTYKKyNkZWZpbmUgT1BfTUFTS19DT0RFMgkJMHgzZmYKKyNkZWZpbmUgT1BfU0hfQ09ERTIJCTYKKyNkZWZpbmUgT1BfTUFTS19SVAkJMHgxZgorI2RlZmluZSBPUF9TSF9SVAkJMTYKKyNkZWZpbmUgT1BfTUFTS19GVAkJMHgxZgorI2RlZmluZSBPUF9TSF9GVAkJMTYKKyNkZWZpbmUgT1BfTUFTS19DQUNIRQkJMHgxZgorI2RlZmluZSBPUF9TSF9DQUNIRQkJMTYKKyNkZWZpbmUgT1BfTUFTS19SRAkJMHgxZgorI2RlZmluZSBPUF9TSF9SRAkJMTEKKyNkZWZpbmUgT1BfTUFTS19GUwkJMHgxZgorI2RlZmluZSBPUF9TSF9GUwkJMTEKKyNkZWZpbmUgT1BfTUFTS19QUkVGWAkJMHgxZgorI2RlZmluZSBPUF9TSF9QUkVGWAkJMTEKKyNkZWZpbmUgT1BfTUFTS19DQ0MJCTB4NworI2RlZmluZSBPUF9TSF9DQ0MJCTgKKyNkZWZpbmUgT1BfTUFTS19DT0RFMjAJCTB4ZmZmZmYgLyogMjAgYml0IHN5c2NhbGwvYnJlYWtwb2ludCBjb2RlLiAgKi8KKyNkZWZpbmUgT1BfU0hfQ09ERTIwCQk2CisjZGVmaW5lIE9QX01BU0tfU0hBTVQJCTB4MWYKKyNkZWZpbmUgT1BfU0hfU0hBTVQJCTYKKyNkZWZpbmUgT1BfTUFTS19GRAkJMHgxZgorI2RlZmluZSBPUF9TSF9GRAkJNgorI2RlZmluZSBPUF9NQVNLX1RBUkdFVAkJMHgzZmZmZmZmCisjZGVmaW5lIE9QX1NIX1RBUkdFVAkJMAorI2RlZmluZSBPUF9NQVNLX0NPUFoJCTB4MWZmZmZmZgorI2RlZmluZSBPUF9TSF9DT1BaCQkwCisjZGVmaW5lIE9QX01BU0tfSU1NRURJQVRFCTB4ZmZmZgorI2RlZmluZSBPUF9TSF9JTU1FRElBVEUJCTAKKyNkZWZpbmUgT1BfTUFTS19ERUxUQQkJMHhmZmZmCisjZGVmaW5lIE9QX1NIX0RFTFRBCQkwCisjZGVmaW5lIE9QX01BU0tfRlVOQ1QJCTB4M2YKKyNkZWZpbmUgT1BfU0hfRlVOQ1QJCTAKKyNkZWZpbmUgT1BfTUFTS19TUEVDCQkweDNmCisjZGVmaW5lIE9QX1NIX1NQRUMJCTAKKyNkZWZpbmUgT1BfU0hfTE9DQyAgICAgICAgICAgICAgOCAgICAgICAvKiBGUCBjb25kaXRpb24gY29kZS4gICovCisjZGVmaW5lIE9QX1NIX0hJQ0MgICAgICAgICAgICAgIDE4ICAgICAgLyogRlAgY29uZGl0aW9uIGNvZGUuICAqLworI2RlZmluZSBPUF9NQVNLX0NDICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgT1BfU0hfQ09QMU5PUk0gICAgICAgICAgMjUgICAgICAvKiBOb3JtYWwgQ09QMSBlbmNvZGluZy4gICovCisjZGVmaW5lIE9QX01BU0tfQ09QMU5PUk0gICAgICAgIDB4MSAgICAgLyogYSBzaW5nbGUgYml0LiAgKi8KKyNkZWZpbmUgT1BfU0hfQ09QMVNQRUMgICAgICAgICAgMjEgICAgICAvKiBDT1AxIGVuY29kaW5ncy4gICovCisjZGVmaW5lIE9QX01BU0tfQ09QMVNQRUMgICAgICAgIDB4ZgorI2RlZmluZSBPUF9NQVNLX0NPUDFTQ0xSICAgICAgICAweDQKKyNkZWZpbmUgT1BfTUFTS19DT1AxQ01QICAgICAgICAgMHgzCisjZGVmaW5lIE9QX1NIX0NPUDFDTVAgICAgICAgICAgIDQKKyNkZWZpbmUgT1BfU0hfRk9STUFUICAgICAgICAgICAgMjEgICAgICAvKiBGUCBzaG9ydCBmb3JtYXQgZmllbGQuICAqLworI2RlZmluZSBPUF9NQVNLX0ZPUk1BVCAgICAgICAgICAweDcKKyNkZWZpbmUgT1BfU0hfVFJVRSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgT1BfTUFTS19UUlVFICAgICAgICAgICAgMHgxCisjZGVmaW5lIE9QX1NIX0dFICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIE9QX01BU0tfR0UgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgT1BfU0hfVU5TSUdORUQgICAgICAgICAgMTYKKyNkZWZpbmUgT1BfTUFTS19VTlNJR05FRCAgICAgICAgMHgxCisjZGVmaW5lIE9QX1NIX0hJTlQgICAgICAgICAgICAgIDE2CisjZGVmaW5lIE9QX01BU0tfSElOVCAgICAgICAgICAgIDB4MWYKKyNkZWZpbmUgT1BfU0hfTU1JICAgICAgICAgICAgICAgMCAgICAgICAvKiBNdWx0aW1lZGlhIChwYXJhbGxlbCkgb3AuICAqLworI2RlZmluZSBPUF9NQVNLX01NSSAgICAgICAgICAgICAweDNmCisjZGVmaW5lIE9QX1NIX01NSVNVQiAgICAgICAgICAgIDYKKyNkZWZpbmUgT1BfTUFTS19NTUlTVUIgICAgICAgICAgMHgxZgorI2RlZmluZSBPUF9NQVNLX1BFUkZSRUcJCTB4MWYJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZy4gICovCisjZGVmaW5lIE9QX1NIX1BFUkZSRUcJCTEKKyNkZWZpbmUgT1BfU0hfU0VMCQkwCS8qIENvcHJvY2Vzc29yIHNlbGVjdCBmaWVsZC4gICovCisjZGVmaW5lIE9QX01BU0tfU0VMCQkweDcJLyogVGhlIHNlbCBmaWVsZCBvZiBtZmNaIGFuZCBtdGNaLiAgKi8KKyNkZWZpbmUgT1BfU0hfQ09ERTE5CQk2ICAgICAgIC8qIDE5IGJpdCB3YWl0IGNvZGUuICAqLworI2RlZmluZSBPUF9NQVNLX0NPREUxOQkJMHg3ZmZmZgorI2RlZmluZSBPUF9TSF9BTE4JCTIxCisjZGVmaW5lIE9QX01BU0tfQUxOCQkweDcKKyNkZWZpbmUgT1BfU0hfVlNFTAkJMjEKKyNkZWZpbmUgT1BfTUFTS19WU0VMCQkweDFmCisjZGVmaW5lIE9QX01BU0tfVkVDQllURQkJMHg3CS8qIFNlbGVjdG9yIGZpZWxkIGlzIHJlYWxseSA0IGJpdHMsCisJCQkJCSAgIGJ1dCAweDgtMHhmIGRvbid0IHNlbGVjdCBieXRlcy4gICovCisjZGVmaW5lIE9QX1NIX1ZFQ0JZVEUJCTIyCisjZGVmaW5lIE9QX01BU0tfVkVDQUxJR04JMHg3CS8qIFZlY3RvciBieXRlLWFsaWduIChhbG5pLm9iKSBvcC4gICovCisjZGVmaW5lIE9QX1NIX1ZFQ0FMSUdOCQkyMQorI2RlZmluZSBPUF9NQVNLX0lOU01TQgkJMHgxZgkvKiAiaW5zIiBNU0IuICAqLworI2RlZmluZSBPUF9TSF9JTlNNU0IJCTExCisjZGVmaW5lIE9QX01BU0tfRVhUTVNCRAkJMHgxZgkvKiAiZXh0IiBNU0JELiAgKi8KKyNkZWZpbmUgT1BfU0hfRVhUTVNCRAkJMTEKKworI2RlZmluZQlPUF9PUF9DT1AwCQkweDEwCisjZGVmaW5lCU9QX09QX0NPUDEJCTB4MTEKKyNkZWZpbmUJT1BfT1BfQ09QMgkJMHgxMgorI2RlZmluZQlPUF9PUF9DT1AzCQkweDEzCisjZGVmaW5lCU9QX09QX0xXQzEJCTB4MzEKKyNkZWZpbmUJT1BfT1BfTFdDMgkJMHgzMgorI2RlZmluZQlPUF9PUF9MV0MzCQkweDMzCS8qIGEuay5hLiBwcmVmICovCisjZGVmaW5lCU9QX09QX0xEQzEJCTB4MzUKKyNkZWZpbmUJT1BfT1BfTERDMgkJMHgzNgorI2RlZmluZQlPUF9PUF9MREMzCQkweDM3CS8qIGEuay5hLiBsZCAqLworI2RlZmluZQlPUF9PUF9TV0MxCQkweDM5CisjZGVmaW5lCU9QX09QX1NXQzIJCTB4M2EKKyNkZWZpbmUJT1BfT1BfU1dDMwkJMHgzYgorI2RlZmluZQlPUF9PUF9TREMxCQkweDNkCisjZGVmaW5lCU9QX09QX1NEQzIJCTB4M2UKKyNkZWZpbmUJT1BfT1BfU0RDMwkJMHgzZgkvKiBhLmsuYS4gc2QgKi8KKworLyogTUlQUyBEU1AgQVNFICovCisjZGVmaW5lIE9QX1NIX0RTUEFDQwkJMTEKKyNkZWZpbmUgT1BfTUFTS19EU1BBQ0MgIAkweDMKKyNkZWZpbmUgT1BfU0hfRFNQQUNDX1MgIAkyMQorI2RlZmluZSBPUF9NQVNLX0RTUEFDQ19TCTB4MworI2RlZmluZSBPUF9TSF9EU1BTRlQJCTIwCisjZGVmaW5lIE9QX01BU0tfRFNQU0ZUICAJMHgzZgorI2RlZmluZSBPUF9TSF9EU1BTRlRfNyAgCTE5CisjZGVmaW5lIE9QX01BU0tfRFNQU0ZUXzcJMHg3ZgorI2RlZmluZSBPUF9TSF9TQTMJCTIxCisjZGVmaW5lIE9QX01BU0tfU0EzCQkweDcKKyNkZWZpbmUgT1BfU0hfU0E0CQkyMQorI2RlZmluZSBPUF9NQVNLX1NBNAkJMHhmCisjZGVmaW5lIE9QX1NIX0lNTTgJCTE2CisjZGVmaW5lIE9QX01BU0tfSU1NOAkJMHhmZgorI2RlZmluZSBPUF9TSF9JTU0xMAkJMTYKKyNkZWZpbmUgT1BfTUFTS19JTU0xMAkJMHgzZmYKKyNkZWZpbmUgT1BfU0hfV1JEU1AJCTExCisjZGVmaW5lIE9QX01BU0tfV1JEU1AJCTB4M2YKKyNkZWZpbmUgT1BfU0hfUkREU1AJCTE2CisjZGVmaW5lIE9QX01BU0tfUkREU1AJCTB4M2YKKyNkZWZpbmUgT1BfU0hfQlAJCTExCisjZGVmaW5lIE9QX01BU0tfQlAJCTB4MworCisvKiBNSVBTIE1UIEFTRSAqLworI2RlZmluZSBPUF9TSF9NVF9VCQk1CisjZGVmaW5lIE9QX01BU0tfTVRfVQkJMHgxCisjZGVmaW5lIE9QX1NIX01UX0gJCTQKKyNkZWZpbmUgT1BfTUFTS19NVF9ICQkweDEKKyNkZWZpbmUgT1BfU0hfTVRBQ0NfVAkJMTgKKyNkZWZpbmUgT1BfTUFTS19NVEFDQ19UCQkweDMKKyNkZWZpbmUgT1BfU0hfTVRBQ0NfRAkJMTMKKyNkZWZpbmUgT1BfTUFTS19NVEFDQ19ECQkweDMKKworI2RlZmluZQlPUF9PUF9DT1AwCQkweDEwCisjZGVmaW5lCU9QX09QX0NPUDEJCTB4MTEKKyNkZWZpbmUJT1BfT1BfQ09QMgkJMHgxMgorI2RlZmluZQlPUF9PUF9DT1AzCQkweDEzCisjZGVmaW5lCU9QX09QX0xXQzEJCTB4MzEKKyNkZWZpbmUJT1BfT1BfTFdDMgkJMHgzMgorI2RlZmluZQlPUF9PUF9MV0MzCQkweDMzCS8qIGEuay5hLiBwcmVmICovCisjZGVmaW5lCU9QX09QX0xEQzEJCTB4MzUKKyNkZWZpbmUJT1BfT1BfTERDMgkJMHgzNgorI2RlZmluZQlPUF9PUF9MREMzCQkweDM3CS8qIGEuay5hLiBsZCAqLworI2RlZmluZQlPUF9PUF9TV0MxCQkweDM5CisjZGVmaW5lCU9QX09QX1NXQzIJCTB4M2EKKyNkZWZpbmUJT1BfT1BfU1dDMwkJMHgzYgorI2RlZmluZQlPUF9PUF9TREMxCQkweDNkCisjZGVmaW5lCU9QX09QX1NEQzIJCTB4M2UKKyNkZWZpbmUJT1BfT1BfU0RDMwkJMHgzZgkvKiBhLmsuYS4gc2QgKi8KKworLyogVmFsdWVzIGluIHRoZSAnVlNFTCcgZmllbGQuICAqLworI2RlZmluZSBNRE1YX0ZNVFNFTF9JTU1fUUgJMHgxZAorI2RlZmluZSBNRE1YX0ZNVFNFTF9JTU1fT0IJMHgxZQorI2RlZmluZSBNRE1YX0ZNVFNFTF9WRUNfUUgJMHgxNQorI2RlZmluZSBNRE1YX0ZNVFNFTF9WRUNfT0IJMHgxNgorCisvKiBVREkgKi8KKyNkZWZpbmUgT1BfU0hfVURJMQkJNgorI2RlZmluZSBPUF9NQVNLX1VESTEJCTB4MWYKKyNkZWZpbmUgT1BfU0hfVURJMgkJNgorI2RlZmluZSBPUF9NQVNLX1VESTIJCTB4M2ZmCisjZGVmaW5lIE9QX1NIX1VESTMJCTYKKyNkZWZpbmUgT1BfTUFTS19VREkzCQkweDdmZmYKKyNkZWZpbmUgT1BfU0hfVURJNAkJNgorI2RlZmluZSBPUF9NQVNLX1VESTQJCTB4ZmZmZmYKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICAqLworCitzdHJ1Y3QgbWlwc19vcGNvZGUKK3sKKyAgLyogVGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgLyogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KKyAgY29uc3QgY2hhciAqYXJnczsKKyAgLyogVGhlIGJhc2ljIG9wY29kZSBmb3IgdGhlIGluc3RydWN0aW9uLiAgV2hlbiBhc3NlbWJsaW5nLCB0aGlzCisgICAgIG9wY29kZSBpcyBtb2RpZmllZCBieSB0aGUgYXJndW1lbnRzIHRvIHByb2R1Y2UgdGhlIGFjdHVhbCBvcGNvZGUKKyAgICAgdGhhdCBpcyB1c2VkLiAgSWYgcGluZm8gaXMgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGlzIDAuICAqLworICB1bnNpZ25lZCBsb25nIG1hdGNoOworICAvKiBJZiBwaW5mbyBpcyBub3QgSU5TTl9NQUNSTywgdGhlbiB0aGlzIGlzIGEgYml0IG1hc2sgZm9yIHRoZQorICAgICByZWxldmFudCBwb3J0aW9ucyBvZiB0aGUgb3Bjb2RlIHdoZW4gZGlzYXNzZW1ibGluZy4gIElmIHRoZQorICAgICBhY3R1YWwgb3Bjb2RlIGFuZGVkIHdpdGggdGhlIG1hdGNoIGZpZWxkIGVxdWFscyB0aGUgb3Bjb2RlIGZpZWxkLAorICAgICB0aGVuIHdlIGhhdmUgZm91bmQgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb24uICBJZiBwaW5mbyBpcworICAgICBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgZmllbGQgaXMgdGhlIG1hY3JvIGlkZW50aWZpZXIuICAqLworICB1bnNpZ25lZCBsb25nIG1hc2s7CisgIC8qIEZvciBhIG1hY3JvLCB0aGlzIGlzIElOU05fTUFDUk8uICBPdGhlcndpc2UsIGl0IGlzIGEgY29sbGVjdGlvbgorICAgICBvZiBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uLCBub3RhYmx5IGFueSByZWxldmFudCBoYXphcmQKKyAgICAgaW5mb3JtYXRpb24uICAqLworICB1bnNpZ25lZCBsb25nIHBpbmZvOworICAvKiBBIGNvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uLiAqLworICB1bnNpZ25lZCBsb25nIHBpbmZvMjsKKyAgLyogQSBjb2xsZWN0aW9uIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24gc2V0cyBvZiB3aGljaCB0aGlzCisgICAgIGluc3RydWN0aW9uIG9yIG1hY3JvIGlzIGEgbWVtYmVyLiAqLworICB1bnNpZ25lZCBsb25nIG1lbWJlcnNoaXA7Cit9OworCisvKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgYXJncyBmaWVsZCBvZiBhbgorICAgaW5zdHJ1Y3Rpb24uICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGZpZWxkcyBhcHBlYXIKKyAgIHdoZW4gdGhlIGluc3RydWN0aW9uIGlzIHVzZWQuICBDb21tYXMgYW5kIHBhcmVudGhlc2VzIGluIHRoZSBhcmdzCisgICBzdHJpbmcgYXJlIGlnbm9yZWQgd2hlbiBhc3NlbWJsaW5nLCBhbmQgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQKKyAgIHdoZW4gZGlzYXNzZW1ibGluZy4KKworICAgRWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIGNvcnJlc3BvbmRzIHRvIGEgbWFzayBmaWVsZCBkZWZpbmVkIGFib3ZlLgorCisgICAiPCIgNSBiaXQgc2hpZnQgYW1vdW50IChPUF8qX1NIQU1UKQorICAgIj4iIHNoaWZ0IGFtb3VudCBiZXR3ZWVuIDMyIGFuZCA2Mywgc3RvcmVkIGFmdGVyIHN1YnRyYWN0aW5nIDMyIChPUF8qX1NIQU1UKQorICAgImEiIDI2IGJpdCB0YXJnZXQgYWRkcmVzcyAoT1BfKl9UQVJHRVQpCisgICAiYiIgNSBiaXQgYmFzZSByZWdpc3RlciAoT1BfKl9SUykKKyAgICJjIiAxMCBiaXQgYnJlYWtwb2ludCBjb2RlIChPUF8qX0NPREUpCisgICAiZCIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JEKQorICAgImgiIDUgYml0IHByZWZ4IGhpbnQgKE9QXypfUFJFRlgpCisgICAiaSIgMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9JTU1FRElBVEUpCisgICAiaiIgMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKE9QXypfREVMVEEpCisgICAiayIgNSBiaXQgY2FjaGUgb3Bjb2RlIGluIHRhcmdldCByZWdpc3RlciBwb3NpdGlvbiAoT1BfKl9DQUNIRSkKKyAgICAgICBBbHNvIHVzZWQgZm9yIGltbWVkaWF0ZSBvcGVyYW5kcyBpbiB2cjU0MDAgdmVjdG9yIGluc25zLgorICAgIm8iIDE2IGJpdCBzaWduZWQgb2Zmc2V0IChPUF8qX0RFTFRBKQorICAgInAiIDE2IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggdGFyZ2V0IGFkZHJlc3MgKE9QXypfREVMVEEpCisgICAicSIgMTAgYml0IGV4dHJhIGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFMikKKyAgICJyIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIHRhcmdldCAoT1BfKl9SUykKKyAgICJzIiA1IGJpdCBzb3VyY2UgcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JTKQorICAgInQiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKKyAgICJ1IiAxNiBiaXQgdXBwZXIgMTYgYml0cyBvZiBhZGRyZXNzIChPUF8qX0lNTUVESUFURSkKKyAgICJ2IiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChPUF8qX1JTKQorICAgInciIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfUlQpCisgICAiVSIgNSBiaXQgc2FtZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpbiBib3RoIE9QXypfUkQgYW5kIE9QXypfUlQKKyAgICAgICAodXNlZCBieSBjbG8gYW5kIGNseikKKyAgICJDIiAyNSBiaXQgY29wcm9jZXNzb3IgZnVuY3Rpb24gY29kZSAoT1BfKl9DT1BaKQorICAgIkIiIDIwIGJpdCBzeXNjYWxsL2JyZWFrcG9pbnQgZnVuY3Rpb24gY29kZSAoT1BfKl9DT0RFMjApCisgICAiSiIgMTkgYml0IHdhaXQgZnVuY3Rpb24gY29kZSAoT1BfKl9DT0RFMTkpCisgICAieCIgYWNjZXB0IGFuZCBpZ25vcmUgcmVnaXN0ZXIgbmFtZQorICAgInoiIG11c3QgYmUgemVybyByZWdpc3RlcgorICAgIksiIDUgYml0IEhhcmR3YXJlIFJlZ2lzdGVyIChyZGh3ciBpbnN0cnVjdGlvbikgKE9QXypfUkQpCisgICAiK0EiIDUgYml0IGlucy9leHQvZGlucy9kZXh0L2RpbnNtL2RleHRtIHBvc2l0aW9uLCB3aGljaCBiZWNvbWVzCisgICAgICAgIExTQiAoT1BfKl9TSEFNVCkuCisJRW5mb3JjZXM6IDAgPD0gcG9zIDwgMzIuCisgICAiK0IiIDUgYml0IGlucy9kaW5zIHNpemUsIHdoaWNoIGJlY29tZXMgTVNCIChPUF8qX0lOU01TQikuCisJUmVxdWlyZXMgdGhhdCAiK0EiIG9yICIrRSIgb2NjdXIgZmlyc3QgdG8gc2V0IHBvc2l0aW9uLgorCUVuZm9yY2VzOiAwIDwgKHBvcytzaXplKSA8PSAzMi4KKyAgICIrQyIgNSBiaXQgZXh0L2RleHQgc2l6ZSwgd2hpY2ggYmVjb21lcyBNU0JEIChPUF8qX0VYVE1TQkQpLgorCVJlcXVpcmVzIHRoYXQgIitBIiBvciAiK0UiIG9jY3VyIGZpcnN0IHRvIHNldCBwb3NpdGlvbi4KKwlFbmZvcmNlczogMCA8IChwb3Mrc2l6ZSkgPD0gMzIuCisJKEFsc28gdXNlZCBieSAiZGV4dCIgdy8gZGlmZmVyZW50IGxpbWl0cywgYnV0IGxpbWl0cyBmb3IKKwl0aGF0IGFyZSBjaGVja2VkIGJ5IHRoZSBNX0RFWFQgbWFjcm8uKQorICAgIitFIiA1IGJpdCBkaW5zdS9kZXh0dSBwb3NpdGlvbiwgd2hpY2ggYmVjb21lcyBMU0ItMzIgKE9QXypfU0hBTVQpLgorCUVuZm9yY2VzOiAzMiA8PSBwb3MgPCA2NC4KKyAgICIrRiIgNSBiaXQgImRpbnNtL2RpbnN1IiBzaXplLCB3aGljaCBiZWNvbWVzIE1TQi0zMiAoT1BfKl9JTlNNU0IpLgorCVJlcXVpcmVzIHRoYXQgIitBIiBvciAiK0UiIG9jY3VyIGZpcnN0IHRvIHNldCBwb3NpdGlvbi4KKwlFbmZvcmNlczogMzIgPCAocG9zK3NpemUpIDw9IDY0LgorICAgIitHIiA1IGJpdCAiZGV4dG0iIHNpemUsIHdoaWNoIGJlY29tZXMgTVNCRC0zMiAoT1BfKl9FWFRNU0JEKS4KKwlSZXF1aXJlcyB0aGF0ICIrQSIgb3IgIitFIiBvY2N1ciBmaXJzdCB0byBzZXQgcG9zaXRpb24uCisJRW5mb3JjZXM6IDMyIDwgKHBvcytzaXplKSA8PSA2NC4KKyAgICIrSCIgNSBiaXQgImRleHR1IiBzaXplLCB3aGljaCBiZWNvbWVzIE1TQkQgKE9QXypfRVhUTVNCRCkuCisJUmVxdWlyZXMgdGhhdCAiK0EiIG9yICIrRSIgb2NjdXIgZmlyc3QgdG8gc2V0IHBvc2l0aW9uLgorCUVuZm9yY2VzOiAzMiA8IChwb3Mrc2l6ZSkgPD0gNjQuCisKKyAgIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uczoKKyAgICJEIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9GRCkKKyAgICJNIiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlIChPUF8qX0NDQykgKG9ubHkgdXNlZCBmb3IgbWlwczQgYW5kIHVwKQorICAgIk4iIDMgYml0IGJyYW5jaCBjb25kaXRpb24gY29kZSAoT1BfKl9CQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKKyAgICJTIiA1IGJpdCBmcyBzb3VyY2UgMSByZWdpc3RlciAoT1BfKl9GUykKKyAgICJUIiA1IGJpdCBmdCBzb3VyY2UgMiByZWdpc3RlciAoT1BfKl9GVCkKKyAgICJSIiA1IGJpdCBmciBzb3VyY2UgMyByZWdpc3RlciAoT1BfKl9GUikKKyAgICJWIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GUykKKyAgICJXIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgZmxvYXRpbmcgdGFyZ2V0IGFuZCBkZXN0aW5hdGlvbiAoT1BfKl9GVCkKKworICAgQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgorICAgIkUiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKKyAgICJHIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKKyAgICJIIiAzIGJpdCBzZWwgZmllbGQgZm9yIChkKW10YyogYW5kIChkKW1mYyogKE9QXypfU0VMKQorICAgIlAiIDUgYml0IHBlcmZvcm1hbmNlLW1vbml0b3IgcmVnaXN0ZXIgKE9QXypfUEVSRlJFRykKKyAgICJlIiA1IGJpdCB2ZWN0b3IgcmVnaXN0ZXIgYnl0ZSBzcGVjaWZpZXIgKE9QXypfVkVDQllURSkKKyAgICIlIiAzIGJpdCBpbW1lZGlhdGUgdnI1NDAwIHZlY3RvciBhbGlnbm1lbnQgb3BlcmFuZCAoT1BfKl9WRUNBTElHTikKKyAgIHNlZSBhbHNvICJrIiBhYm92ZQorICAgIitEIiBDb21iaW5lZCBkZXN0aW5hdGlvbiByZWdpc3RlciAoIkciKSBhbmQgc2VsICgiSCIpIGZvciBDUDAgb3BzLAorCWZvciBwcmV0dHktcHJpbnRpbmcgaW4gZGlzYXNzZW1ibHkgb25seS4KKworICAgTWFjcm8gaW5zdHJ1Y3Rpb25zOgorICAgIkEiIEdlbmVyYWwgMzIgYml0IGV4cHJlc3Npb24KKyAgICJJIiAzMiBiaXQgaW1tZWRpYXRlICh2YWx1ZSBwbGFjZWQgaW4gaW1tX2V4cHIpLgorICAgIitJIiAzMiBiaXQgaW1tZWRpYXRlICh2YWx1ZSBwbGFjZWQgaW4gaW1tMl9leHByKS4KKyAgICJGIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLnJkYXRhCisgICAiTCIgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ4CisgICAiZiIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICAibCIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ0CisKKyAgIE1ETVggaW5zdHJ1Y3Rpb24gb3BlcmFuZHMgKG5vdGUgdGhhdCB3aGlsZSB0aGVzZSB1c2UgdGhlIEZQIHJlZ2lzdGVyCisgICBmaWVsZHMsIHRoZXkgYWNjZXB0IGJvdGggJGZOIGFuZCAkdk4gbmFtZXMgZm9yIHRoZSByZWdpc3RlcnMpOgorICAgIk8iCU1ETVggYWxpZ25tZW50IG9mZnNldCAoT1BfKl9BTE4pCisgICAiUSIJTURNWCB2ZWN0b3Ivc2NhbGFyL2ltbWVkaWF0ZSBzb3VyY2UgKE9QXypfVlNFTCBhbmQgT1BfKl9GVCkKKyAgICJYIglNRE1YIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChPUF8qX0ZEKQorICAgIlkiCU1ETVggc291cmNlIHJlZ2lzdGVyIChPUF8qX0ZTKQorICAgIloiCU1ETVggc291cmNlIHJlZ2lzdGVyIChPUF8qX0ZUKQorCisgICBEU1AgQVNFIHVzYWdlOgorICAgIjIiIDIgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSBmb3IgYnl0ZSBhbGlnbiAoT1BfKl9CUCkKKyAgICIzIiAzIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKE9QXypfU0EzKQorICAgIjQiIDQgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9TQTQpCisgICAiNSIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX0lNTTgpCisgICAiNiIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX1JTKQorICAgIjciIDIgYml0IGRzcCBhY2N1bXVsYXRvciByZWdpc3RlciAoT1BfKl9EU1BBQ0MpCisgICAiOCIgNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX1dSRFNQKQorICAgIjkiIDIgYml0IGRzcCBhY2N1bXVsYXRvciByZWdpc3RlciAoT1BfKl9EU1BBQ0NfUykKKyAgICIwIiA2IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RTUFNGVCkKKyAgICI6IiA3IGJpdCBzaWduZWQgaW1tZWRpYXRlIChPUF8qX0RTUFNGVF83KQorICAgIiciIDYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9SRERTUCkKKyAgICJAIiAxMCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9JTU0xMCkKKworICAgTVQgQVNFIHVzYWdlOgorICAgIiEiIDEgYml0IHVzZXJtb2RlIGZsYWcgKE9QXypfTVRfVSkKKyAgICIkIiAxIGJpdCBsb2FkIGhpZ2ggZmxhZyAoT1BfKl9NVF9IKQorICAgIioiIDIgYml0IGRzcC9zbWFydG1pcHMgYWNjdW11bGF0b3IgcmVnaXN0ZXIgKE9QXypfTVRBQ0NfVCkKKyAgICImIiAyIGJpdCBkc3Avc21hcnRtaXBzIGFjY3VtdWxhdG9yIHJlZ2lzdGVyIChPUF8qX01UQUNDX0QpCisgICAiZyIgNSBiaXQgY29wcm9jZXNzb3IgMSBhbmQgMiBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SRCkKKyAgICIrdCIgNSBiaXQgY29wcm9jZXNzb3IgMCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SVCkKKyAgICIrVCIgNSBiaXQgY29wcm9jZXNzb3IgMCBkZXN0aW5hdGlvbiByZWdpc3RlciAoT1BfKl9SVCkgLSBkaXNhc3NlbWJseSBvbmx5CisKKyAgIFVESSBpbW1lZGlhdGVzOgorICAgIisxIiBVREkgaW1tZWRpYXRlIGJpdHMgNi0xMAorICAgIisyIiBVREkgaW1tZWRpYXRlIGJpdHMgNi0xNQorICAgIiszIiBVREkgaW1tZWRpYXRlIGJpdHMgNi0yMAorICAgIis0IiBVREkgaW1tZWRpYXRlIGJpdHMgNi0yNQorCisgICBPdGhlcjoKKyAgICIoKSIgcGFyZW5zIHN1cnJvdW5kaW5nIG9wdGlvbmFsIHZhbHVlCisgICAiLCIgIHNlcGFyYXRlcyBvcGVyYW5kcworICAgIltdIiBicmFja2V0cyBhcm91bmQgaW5kZXggZm9yIHZlY3Rvci1vcCBzY2FsYXIgb3BlcmFuZCBzcGVjaWZpZXIgKHZyNTQwMCkKKyAgICIrIiAgU3RhcnQgb2YgZXh0ZW5zaW9uIHNlcXVlbmNlLgorCisgICBDaGFyYWN0ZXJzIHVzZWQgc28gZmFyLCBmb3IgcXVpY2sgcmVmZXJlbmNlIHdoZW4gYWRkaW5nIG1vcmU6CisgICAiMjM0NTY3ODkwIgorICAgIiVbXTw+KCksKzonQCEkKiYiCisgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAiYWJjZGVmZ2hpamtsb3BxcnN0dXZ3eHoiCisKKyAgIEV4dGVuc2lvbiBjaGFyYWN0ZXIgc2VxdWVuY2VzIHVzZWQgc28gZmFyICgiKyIgZm9sbG93ZWQgYnkgdGhlCisgICBmb2xsb3dpbmcpLCBmb3IgcXVpY2sgcmVmZXJlbmNlIHdoZW4gYWRkaW5nIG1vcmU6CisgICAiMTIzNCIKKyAgICJBQkNERUZHSElUIgorICAgInQiCisqLworCisvKiBUaGVzZSBhcmUgdGhlIGJpdHMgd2hpY2ggbWF5IGJlIHNldCBpbiB0aGUgcGluZm8gZmllbGQgb2YgYW4KKyAgIGluc3RydWN0aW9ucywgaWYgaXQgaXMgbm90IGVxdWFsIHRvIElOU05fTUFDUk8uICAqLworCisvKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUkQuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0dQUl9EICAgICAgICAgICAgMHgwMDAwMDAwMQorLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JULiAgKi8KKyNkZWZpbmUgSU5TTl9XUklURV9HUFJfVCAgICAgICAgICAgIDB4MDAwMDAwMDIKKy8qIE1vZGlmaWVzIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAzMS4gICovCisjZGVmaW5lIElOU05fV1JJVEVfR1BSXzMxICAgICAgICAgICAweDAwMDAwMDA0CisvKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GRC4gICovCisjZGVmaW5lIElOU05fV1JJVEVfRlBSX0QgICAgICAgICAgICAweDAwMDAwMDA4CisvKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GUy4gICovCisjZGVmaW5lIElOU05fV1JJVEVfRlBSX1MgICAgICAgICAgICAweDAwMDAwMDEwCisvKiBNb2RpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gT1BfKl9GVC4gICovCisjZGVmaW5lIElOU05fV1JJVEVfRlBSX1QgICAgICAgICAgICAweDAwMDAwMDIwCisvKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlMuICAqLworI2RlZmluZSBJTlNOX1JFQURfR1BSX1MgICAgICAgICAgICAgMHgwMDAwMDA0MAorLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBPUF8qX1JULiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0dQUl9UICAgICAgICAgICAgIDB4MDAwMDAwODAKKy8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZTLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9TICAgICAgICAgICAgIDB4MDAwMDAxMDAKKy8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZULiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9UICAgICAgICAgICAgIDB4MDAwMDAyMDAKKy8qIFJlYWRzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZSLiAgKi8KKyNkZWZpbmUgSU5TTl9SRUFEX0ZQUl9SCQkgICAgMHgwMDAwMDQwMAorLyogTW9kaWZpZXMgY29wcm9jZXNzb3IgY29uZGl0aW9uIGNvZGUuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0NPTkRfQ09ERSAgICAgICAgMHgwMDAwMDgwMAorLyogUmVhZHMgY29wcm9jZXNzb3IgY29uZGl0aW9uIGNvZGUuICAqLworI2RlZmluZSBJTlNOX1JFQURfQ09ORF9DT0RFICAgICAgICAgMHgwMDAwMTAwMAorLyogVExCIG9wZXJhdGlvbi4gICovCisjZGVmaW5lIElOU05fVExCICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisvKiBSZWFkcyBjb3Byb2Nlc3NvciByZWdpc3RlciBvdGhlciB0aGFuIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgSU5TTl9DT1AgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKy8qIEluc3RydWN0aW9uIGxvYWRzIHZhbHVlIGZyb20gbWVtb3J5LCByZXF1aXJpbmcgZGVsYXkuICAqLworI2RlZmluZSBJTlNOX0xPQURfTUVNT1JZX0RFTEFZICAgICAgMHgwMDAwODAwMAorLyogSW5zdHJ1Y3Rpb24gbG9hZHMgdmFsdWUgZnJvbSBjb3Byb2Nlc3NvciwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KKyNkZWZpbmUgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQkgICAgMHgwMDAxMDAwMAorLyogSW5zdHJ1Y3Rpb24gaGFzIHVuY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5IHNsb3QuICAqLworI2RlZmluZSBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkgICAgMHgwMDAyMDAwMAorLyogSW5zdHJ1Y3Rpb24gaGFzIGNvbmRpdGlvbmFsIGJyYW5jaCBkZWxheSBzbG90LiAgKi8KKyNkZWZpbmUgSU5TTl9DT05EX0JSQU5DSF9ERUxBWSAgICAgIDB4MDAwNDAwMDAKKy8qIENvbmRpdGlvbmFsIGJyYW5jaCBsaWtlbHk6IGlmIGJyYW5jaCBub3QgdGFrZW4sIGluc24gbnVsbGlmaWVkLiAgKi8KKyNkZWZpbmUgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkJICAgIDB4MDAwODAwMDAKKy8qIE1vdmVzIHRvIGNvcHJvY2Vzc29yIHJlZ2lzdGVyLCByZXF1aXJpbmcgZGVsYXkuICAqLworI2RlZmluZSBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZICAgICAgMHgwMDEwMDAwMAorLyogTG9hZHMgY29wcm9jZXNzb3IgcmVnaXN0ZXIgZnJvbSBtZW1vcnksIHJlcXVpcmluZyBkZWxheS4gICovCisjZGVmaW5lIElOU05fQ09QUk9DX01FTU9SWV9ERUxBWSAgICAweDAwMjAwMDAwCisvKiBSZWFkcyB0aGUgSEkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBJTlNOX1JFQURfSEkJCSAgICAweDAwNDAwMDAwCisvKiBSZWFkcyB0aGUgTE8gcmVnaXN0ZXIuICAqLworI2RlZmluZSBJTlNOX1JFQURfTE8JCSAgICAweDAwODAwMDAwCisvKiBNb2RpZmllcyB0aGUgSEkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBJTlNOX1dSSVRFX0hJCQkgICAgMHgwMTAwMDAwMAorLyogTW9kaWZpZXMgdGhlIExPIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgSU5TTl9XUklURV9MTwkJICAgIDB4MDIwMDAwMDAKKy8qIFRha2VzIGEgdHJhcCAoZWFzaWVyIHRvIGtlZXAgb3V0IG9mIGRlbGF5IHNsb3QpLiAgKi8KKyNkZWZpbmUgSU5TTl9UUkFQICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKy8qIEluc3RydWN0aW9uIHN0b3JlcyB2YWx1ZSBpbnRvIG1lbW9yeS4gICovCisjZGVmaW5lIElOU05fU1RPUkVfTUVNT1JZCSAgICAweDA4MDAwMDAwCisvKiBJbnN0cnVjdGlvbiB1c2VzIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQuICAqLworI2RlZmluZSBGUF9TCQkJICAgIDB4MTAwMDAwMDAKKy8qIEluc3RydWN0aW9uIHVzZXMgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCisjZGVmaW5lIEZQX0QJCQkgICAgMHgyMDAwMDAwMAorLyogSW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiB0aGUgdHgzOSdzIGludGVnZXIgbXVsdGlwbHkgZmFtaWx5LiAgICAqLworI2RlZmluZSBJTlNOX01VTFQgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorLyogSW5zdHJ1Y3Rpb24gc3luY2hyb25pemUgc2hhcmVkIG1lbW9yeS4gICovCisjZGVmaW5lIElOU05fU1lOQwkJICAgIDB4ODAwMDAwMDAKKworLyogVGhlc2UgYXJlIHRoZSBiaXRzIHdoaWNoIG1heSBiZSBzZXQgaW4gdGhlIHBpbmZvMiBmaWVsZCBvZiBhbgorICAgaW5zdHJ1Y3Rpb24uICovCisKKy8qIEluc3RydWN0aW9uIGlzIGEgc2ltcGxlIGFsaWFzIChJLkUuICJtb3ZlIiBmb3IgZGFkZHUvYWRkdS9vcikgKi8KKyNkZWZpbmUJSU5TTjJfQUxJQVMJCSAgICAweDAwMDAwMDAxCisvKiBJbnN0cnVjdGlvbiByZWFkcyBNRE1YIGFjY3VtdWxhdG9yLiAqLworI2RlZmluZSBJTlNOMl9SRUFEX01ETVhfQUNDCSAgICAweDAwMDAwMDAyCisvKiBJbnN0cnVjdGlvbiB3cml0ZXMgTURNWCBhY2N1bXVsYXRvci4gKi8KKyNkZWZpbmUgSU5TTjJfV1JJVEVfTURNWF9BQ0MJICAgIDB4MDAwMDAwMDQKKworLyogSW5zdHJ1Y3Rpb24gaXMgYWN0dWFsbHkgYSBtYWNyby4gIEl0IHNob3VsZCBiZSBpZ25vcmVkIGJ5IHRoZQorICAgZGlzYXNzZW1ibGVyLCBhbmQgcmVxdWlyZXMgc3BlY2lhbCB0cmVhdG1lbnQgYnkgdGhlIGFzc2VtYmxlci4gICovCisjZGVmaW5lIElOU05fTUFDUk8gICAgICAgICAgICAgICAgICAweGZmZmZmZmZmCisKKy8qIE1hc2tzIHVzZWQgdG8gbWFyayBpbnN0cnVjdGlvbnMgdG8gaW5kaWNhdGUgd2hpY2ggTUlQUyBJU0EgbGV2ZWwKKyAgIHRoZXkgd2VyZSBpbnRyb2R1Y2VkIGluLiAgSVNBcywgYXMgZGVmaW5lZCBiZWxvdywgYXJlIGxvZ2ljYWwKKyAgIE9ScyBvZiB0aGVzZSBiaXRzLCBpbmRpY2F0aW5nIHRoYXQgdGhleSBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMKKyAgIGRlZmluZWQgYXQgdGhlIGdpdmVuIGxldmVsLiAgKi8KKworI2RlZmluZSBJTlNOX0lTQV9NQVNLCQkgIDB4MDAwMDBmZmYKKyNkZWZpbmUgSU5TTl9JU0ExICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElOU05fSVNBMiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBJTlNOX0lTQTMgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgSU5TTl9JU0E0ICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIElOU05fSVNBNSAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBJTlNOX0lTQTMyICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgSU5TTl9JU0E2NCAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIElOU05fSVNBMzJSMiAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBJTlNOX0lTQTY0UjIgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKworLyogTWFza3MgdXNlZCBmb3IgTUlQUy1kZWZpbmVkIEFTRXMuICAqLworI2RlZmluZSBJTlNOX0FTRV9NQVNLCQkgIDB4MDAwMGYwMDAKKworLyogRFNQIEFTRSAqLworI2RlZmluZSBJTlNOX0RTUCAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgSU5TTl9EU1A2NCAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisvKiBNSVBTIDE2IEFTRSAqLworI2RlZmluZSBJTlNOX01JUFMxNiAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKy8qIE1JUFMtM0QgQVNFICovCisjZGVmaW5lIElOU05fTUlQUzNEICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKiBDaGlwIHNwZWNpZmljIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCisKKy8qIE1JUFMgUjQ2NTAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOXzQ2NTAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKy8qIExTSSBSNDAxMCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElOU05fNDAxMCAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorLyogTkVDIFZSNDEwMCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElOU05fNDEwMCAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAorLyogVG9zaGliYSBSMzkwMCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIElOU05fMzkwMCAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorLyogTUlQUyBSMTAwMDAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOXzEwMDAwICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKy8qIEJyb2FkY29tIFNCLTEgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOX1NCMSAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKy8qIE5FQyBWUjQxMTEvVlI0MTgxIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgSU5TTl80MTExICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisvKiBORUMgVlI0MTIwIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgSU5TTl80MTIwICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisvKiBORUMgVlI1NDAwIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgSU5TTl81NDAwCQkgIDB4MDEwMDAwMDAKKy8qIE5FQyBWUjU1MDAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBJTlNOXzU1MDAJCSAgMHgwMjAwMDAwMAorCisvKiBNRE1YIEFTRSAqLworI2RlZmluZSBJTlNOX01ETVggICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKy8qIE1UIEFTRSAqLworI2RlZmluZSBJTlNOX01UICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKy8qIFNtYXJ0TUlQUyBBU0UgICovCisjZGVmaW5lIElOU05fU01BUlRNSVBTICAgICAgICAgICAgMHgxMDAwMDAwMAorLyogRFNQIFIyIEFTRSAgKi8KKyNkZWZpbmUgSU5TTl9EU1BSMiAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisKKy8qIFNUIE1pY3JvZWxlY3Ryb25pY3MgTG9vbmdzb24gMkUuICAqLworI2RlZmluZSBJTlNOX0xPT05HU09OXzJFICAgICAgICAgIDB4NDAwMDAwMDAKKy8qIFNUIE1pY3JvZWxlY3Ryb25pY3MgTG9vbmdzb24gMkYuICAqLworI2RlZmluZSBJTlNOX0xPT05HU09OXzJGICAgICAgICAgIDB4ODAwMDAwMDAKKworLyogTUlQUyBJU0EgZGVmaW5lcywgdXNlIGluc3RlYWQgb2YgaGFyZGNvZGluZyBJU0EgbGV2ZWwuICAqLworCisjaWZuZGVmIElTQV9NSVBTMQorI2RlZmluZSAgICAgICBJU0FfVU5LTk9XTiAgICAgMCAgICAgICAgICAgICAgIC8qIEdhcyBpbnRlcm5hbCB1c2UuICAqLworI2RlZmluZSAgICAgICBJU0FfTUlQUzEgICAgICAgKElOU05fSVNBMSkKKyNkZWZpbmUgICAgICAgSVNBX01JUFMyICAgICAgIChJU0FfTUlQUzEgfCBJTlNOX0lTQTIpCisjZGVmaW5lICAgICAgIElTQV9NSVBTMyAgICAgICAoSVNBX01JUFMyIHwgSU5TTl9JU0EzKQorI2RlZmluZSAgICAgICBJU0FfTUlQUzQgICAgICAgKElTQV9NSVBTMyB8IElOU05fSVNBNCkKKyNkZWZpbmUgICAgICAgSVNBX01JUFM1ICAgICAgIChJU0FfTUlQUzQgfCBJTlNOX0lTQTUpCisKKyNkZWZpbmUgICAgICAgSVNBX01JUFMzMiAgICAgIChJU0FfTUlQUzIgfCBJTlNOX0lTQTMyKQorI2RlZmluZSAgICAgICBJU0FfTUlQUzY0ICAgICAgKElTQV9NSVBTNSB8IElOU05fSVNBMzIgfCBJTlNOX0lTQTY0KQorCisjZGVmaW5lICAgICAgIElTQV9NSVBTMzJSMiAgICAoSVNBX01JUFMzMiB8IElOU05fSVNBMzJSMikKKyNkZWZpbmUgICAgICAgSVNBX01JUFM2NFIyICAgIChJU0FfTUlQUzY0IHwgSU5TTl9JU0EzMlIyIHwgSU5TTl9JU0E2NFIyKQorI2VuZGlmICAvLyBJU0FfTUlQUzEKKworLyogQ1BVIGRlZmluZXMsIHVzZSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgcHJvY2Vzc29yIG51bWJlci4gS2VlcCB0aGlzCisgICBpbiBzeW5jIHdpdGggYmZkL2FyY2h1cmVzLmMgaW4gb3JkZXIgZm9yIG1hY2hpbmUgc2VsZWN0aW9uIHRvIHdvcmsuICAqLworI2RlZmluZSBDUFVfVU5LTk9XTgkwICAgICAgICAgICAgICAgLyogR2FzIGludGVybmFsIHVzZS4gICovCisjZGVmaW5lIENQVV9SMzAwMAkzMDAwCisjZGVmaW5lIENQVV9SMzkwMAkzOTAwCisjZGVmaW5lIENQVV9SNDAwMAk0MDAwCisjZGVmaW5lIENQVV9SNDAxMAk0MDEwCisjZGVmaW5lIENQVV9WUjQxMDAJNDEwMAorI2RlZmluZSBDUFVfUjQxMTEJNDExMQorI2RlZmluZSBDUFVfVlI0MTIwCTQxMjAKKyNkZWZpbmUgQ1BVX1I0MzAwCTQzMDAKKyNkZWZpbmUgQ1BVX1I0NDAwCTQ0MDAKKyNkZWZpbmUgQ1BVX1I0NjAwCTQ2MDAKKyNkZWZpbmUgQ1BVX1I0NjUwCTQ2NTAKKyNkZWZpbmUgQ1BVX1I1MDAwCTUwMDAKKyNkZWZpbmUgQ1BVX1ZSNTQwMAk1NDAwCisjZGVmaW5lIENQVV9WUjU1MDAJNTUwMAorI2RlZmluZSBDUFVfUjYwMDAJNjAwMAorI2RlZmluZSBDUFVfUk03MDAwCTcwMDAKKyNkZWZpbmUgQ1BVX1I4MDAwCTgwMDAKKyNkZWZpbmUgQ1BVX1IxMDAwMAkxMDAwMAorI2RlZmluZSBDUFVfUjEyMDAwCTEyMDAwCisKKyNkZWZpbmUgQ1BVX01JUFMxNgkxNgorI2RlZmluZSBDUFVfU0IxICAgICAgICAgMTIzMTAyMDEgICAgICAgIC8qIG9jdGFsICdTQicsIDAxLiAgKi8KKworI2lmbmRlZiBDUFVfTUlQUzMyCisjZGVmaW5lIENQVV9NSVBTMzIJMzIKKyNkZWZpbmUgQ1BVX01JUFMzMlIyCTMzCisjZGVmaW5lIENQVV9NSVBTNSAgICAgICA1CisjZGVmaW5lIENQVV9NSVBTNjQgICAgICA2NAorI2RlZmluZSBDUFVfTUlQUzY0UjIJNjUKKyNlbmRpZiAgLy8gIUNQVV9NSVBTMzIKKworLyogVGVzdCBmb3IgbWVtYmVyc2hpcCBpbiBhbiBJU0EgaW5jbHVkaW5nIGNoaXAgc3BlY2lmaWMgSVNBcy4gIElOU04KKyAgIGlzIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBvZiB0aGUgb3Bjb2RlIHRhYmxlOyBJU0EgaXMgdGhlIHNwZWNpZmllZAorICAgSVNBL0FTRSBiaXRtYXNrIHRvIHRlc3QgYWdhaW5zdDsgYW5kIENQVSBpcyB0aGUgQ1BVIHNwZWNpZmljIElTQSB0bworICAgdGVzdCwgb3IgemVybyBpZiBubyBDUFUgc3BlY2lmaWMgSVNBIHRlc3QgaXMgZGVzaXJlZC4gICovCisKKyNpZiAwCisjZGVmaW5lIE9QQ09ERV9JU19NRU1CRVIoaW5zbiwgaXNhLCBjcHUpCQkJCVwKKyAgICAoKChpbnNuKS0+bWVtYmVyc2hpcCAmIGlzYSkgIT0gMAkJCQkJXAorICAgICB8fCAoY3B1ID09IENQVV9SNDY1MCAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQlcCisgICAgIHx8IChjcHUgPT0gQ1BVX1JNNzAwMCAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQlcCisgICAgIHx8IChjcHUgPT0gQ1BVX1JNOTAwMCAmJiAoKGluc24pLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQlcCisgICAgIHx8IChjcHUgPT0gQ1BVX1I0MDEwICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApICE9IDApCVwKKyAgICAgfHwgKGNwdSA9PSBDUFVfVlI0MTAwICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQxMDApICE9IDApCVwKKyAgICAgfHwgKGNwdSA9PSBDUFVfUjM5MDAgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fMzkwMCkgIT0gMCkJXAorICAgICB8fCAoKGNwdSA9PSBDUFVfUjEwMDAwIHx8IGNwdSA9PSBDUFVfUjEyMDAwKQkJCVwKKwkgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fMTAwMDApICE9IDApCQkJXAorICAgICB8fCAoY3B1ID09IENQVV9TQjEgJiYgKChpbnNuKS0+bWVtYmVyc2hpcCAmIElOU05fU0IxKSAhPSAwKQlcCisgICAgIHx8IChjcHUgPT0gQ1BVX1I0MTExICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQxMTEpICE9IDApCVwKKyAgICAgfHwgKGNwdSA9PSBDUFVfVlI0MTIwICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzQxMjApICE9IDApCVwKKyAgICAgfHwgKGNwdSA9PSBDUFVfVlI1NDAwICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzU0MDApICE9IDApCVwKKyAgICAgfHwgKGNwdSA9PSBDUFVfVlI1NTAwICYmICgoaW5zbiktPm1lbWJlcnNoaXAgJiBJTlNOXzU1MDApICE9IDApCVwKKyAgICAgfHwgMCkJLyogUGxlYXNlIGtlZXAgdGhpcyB0ZXJtIGZvciBlYXNpZXIgc291cmNlIG1lcmdpbmcuICAqLworI2Vsc2UKKyNkZWZpbmUgT1BDT0RFX0lTX01FTUJFUihpbnNuLCBpc2EsIGNwdSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgxICE9IDApCisjZW5kaWYKKworLyogVGhpcyBpcyBhIGxpc3Qgb2YgbWFjcm8gZXhwYW5kZWQgaW5zdHJ1Y3Rpb25zLgorCisgICBfSSBhcHBlbmRlZCBtZWFucyBpbW1lZGlhdGUKKyAgIF9BIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3MKKyAgIF9BQiBhcHBlbmRlZCBtZWFucyBhZGRyZXNzIHdpdGggYmFzZSByZWdpc3RlcgorICAgX0QgYXBwZW5kZWQgbWVhbnMgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50CisgICBfUyBhcHBlbmRlZCBtZWFucyAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLworCitlbnVtCit7CisgIE1fQUJTLAorICBNX0FERF9JLAorICBNX0FERFVfSSwKKyAgTV9BTkRfSSwKKyAgTV9CQUxJR04sCisgIE1fQkVRLAorICBNX0JFUV9JLAorICBNX0JFUUxfSSwKKyAgTV9CR0UsCisgIE1fQkdFTCwKKyAgTV9CR0VfSSwKKyAgTV9CR0VMX0ksCisgIE1fQkdFVSwKKyAgTV9CR0VVTCwKKyAgTV9CR0VVX0ksCisgIE1fQkdFVUxfSSwKKyAgTV9CR1QsCisgIE1fQkdUTCwKKyAgTV9CR1RfSSwKKyAgTV9CR1RMX0ksCisgIE1fQkdUVSwKKyAgTV9CR1RVTCwKKyAgTV9CR1RVX0ksCisgIE1fQkdUVUxfSSwKKyAgTV9CTEUsCisgIE1fQkxFTCwKKyAgTV9CTEVfSSwKKyAgTV9CTEVMX0ksCisgIE1fQkxFVSwKKyAgTV9CTEVVTCwKKyAgTV9CTEVVX0ksCisgIE1fQkxFVUxfSSwKKyAgTV9CTFQsCisgIE1fQkxUTCwKKyAgTV9CTFRfSSwKKyAgTV9CTFRMX0ksCisgIE1fQkxUVSwKKyAgTV9CTFRVTCwKKyAgTV9CTFRVX0ksCisgIE1fQkxUVUxfSSwKKyAgTV9CTkUsCisgIE1fQk5FX0ksCisgIE1fQk5FTF9JLAorICBNX0NBQ0hFX0FCLAorICBNX0RBQlMsCisgIE1fREFERF9JLAorICBNX0RBRERVX0ksCisgIE1fRERJVl8zLAorICBNX0RESVZfM0ksCisgIE1fRERJVlVfMywKKyAgTV9ERElWVV8zSSwKKyAgTV9ERVhULAorICBNX0RJTlMsCisgIE1fRElWXzMsCisgIE1fRElWXzNJLAorICBNX0RJVlVfMywKKyAgTV9ESVZVXzNJLAorICBNX0RMQV9BQiwKKyAgTV9ETENBX0FCLAorICBNX0RMSSwKKyAgTV9ETVVMLAorICBNX0RNVUxfSSwKKyAgTV9ETVVMTywKKyAgTV9ETVVMT19JLAorICBNX0RNVUxPVSwKKyAgTV9ETVVMT1VfSSwKKyAgTV9EUkVNXzMsCisgIE1fRFJFTV8zSSwKKyAgTV9EUkVNVV8zLAorICBNX0RSRU1VXzNJLAorICBNX0RTVUJfSSwKKyAgTV9EU1VCVV9JLAorICBNX0RTVUJVX0lfMiwKKyAgTV9KX0EsCisgIE1fSkFMXzEsCisgIE1fSkFMXzIsCisgIE1fSkFMX0EsCisgIE1fTF9ET0IsCisgIE1fTF9EQUIsCisgIE1fTEFfQUIsCisgIE1fTEJfQSwKKyAgTV9MQl9BQiwKKyAgTV9MQlVfQSwKKyAgTV9MQlVfQUIsCisgIE1fTENBX0FCLAorICBNX0xEX0EsCisgIE1fTERfT0IsCisgIE1fTERfQUIsCisgIE1fTERDMV9BQiwKKyAgTV9MREMyX0FCLAorICBNX0xEQzNfQUIsCisgIE1fTERMX0FCLAorICBNX0xEUl9BQiwKKyAgTV9MSF9BLAorICBNX0xIX0FCLAorICBNX0xIVV9BLAorICBNX0xIVV9BQiwKKyAgTV9MSSwKKyAgTV9MSV9ELAorICBNX0xJX0RELAorICBNX0xJX1MsCisgIE1fTElfU1MsCisgIE1fTExfQUIsCisgIE1fTExEX0FCLAorICBNX0xTX0EsCisgIE1fTFdfQSwKKyAgTV9MV19BQiwKKyAgTV9MV0MwX0EsCisgIE1fTFdDMF9BQiwKKyAgTV9MV0MxX0EsCisgIE1fTFdDMV9BQiwKKyAgTV9MV0MyX0EsCisgIE1fTFdDMl9BQiwKKyAgTV9MV0MzX0EsCisgIE1fTFdDM19BQiwKKyAgTV9MV0xfQSwKKyAgTV9MV0xfQUIsCisgIE1fTFdSX0EsCisgIE1fTFdSX0FCLAorICBNX0xXVV9BQiwKKyAgTV9NT1ZFLAorICBNX01VTCwKKyAgTV9NVUxfSSwKKyAgTV9NVUxPLAorICBNX01VTE9fSSwKKyAgTV9NVUxPVSwKKyAgTV9NVUxPVV9JLAorICBNX05PUl9JLAorICBNX09SX0ksCisgIE1fUkVNXzMsCisgIE1fUkVNXzNJLAorICBNX1JFTVVfMywKKyAgTV9SRU1VXzNJLAorICBNX0RST0wsCisgIE1fUk9MLAorICBNX0RST0xfSSwKKyAgTV9ST0xfSSwKKyAgTV9EUk9SLAorICBNX1JPUiwKKyAgTV9EUk9SX0ksCisgIE1fUk9SX0ksCisgIE1fU19EQSwKKyAgTV9TX0RPQiwKKyAgTV9TX0RBQiwKKyAgTV9TX1MsCisgIE1fU0NfQUIsCisgIE1fU0NEX0FCLAorICBNX1NEX0EsCisgIE1fU0RfT0IsCisgIE1fU0RfQUIsCisgIE1fU0RDMV9BQiwKKyAgTV9TREMyX0FCLAorICBNX1NEQzNfQUIsCisgIE1fU0RMX0FCLAorICBNX1NEUl9BQiwKKyAgTV9TRVEsCisgIE1fU0VRX0ksCisgIE1fU0dFLAorICBNX1NHRV9JLAorICBNX1NHRVUsCisgIE1fU0dFVV9JLAorICBNX1NHVCwKKyAgTV9TR1RfSSwKKyAgTV9TR1RVLAorICBNX1NHVFVfSSwKKyAgTV9TTEUsCisgIE1fU0xFX0ksCisgIE1fU0xFVSwKKyAgTV9TTEVVX0ksCisgIE1fU0xUX0ksCisgIE1fU0xUVV9JLAorICBNX1NORSwKKyAgTV9TTkVfSSwKKyAgTV9TQl9BLAorICBNX1NCX0FCLAorICBNX1NIX0EsCisgIE1fU0hfQUIsCisgIE1fU1dfQSwKKyAgTV9TV19BQiwKKyAgTV9TV0MwX0EsCisgIE1fU1dDMF9BQiwKKyAgTV9TV0MxX0EsCisgIE1fU1dDMV9BQiwKKyAgTV9TV0MyX0EsCisgIE1fU1dDMl9BQiwKKyAgTV9TV0MzX0EsCisgIE1fU1dDM19BQiwKKyAgTV9TV0xfQSwKKyAgTV9TV0xfQUIsCisgIE1fU1dSX0EsCisgIE1fU1dSX0FCLAorICBNX1NVQl9JLAorICBNX1NVQlVfSSwKKyAgTV9TVUJVX0lfMiwKKyAgTV9URVFfSSwKKyAgTV9UR0VfSSwKKyAgTV9UR0VVX0ksCisgIE1fVExUX0ksCisgIE1fVExUVV9JLAorICBNX1RORV9JLAorICBNX1RSVU5DV0QsCisgIE1fVFJVTkNXUywKKyAgTV9VTEQsCisgIE1fVUxEX0EsCisgIE1fVUxILAorICBNX1VMSF9BLAorICBNX1VMSFUsCisgIE1fVUxIVV9BLAorICBNX1VMVywKKyAgTV9VTFdfQSwKKyAgTV9VU0gsCisgIE1fVVNIX0EsCisgIE1fVVNXLAorICBNX1VTV19BLAorICBNX1VTRCwKKyAgTV9VU0RfQSwKKyAgTV9YT1JfSSwKKyAgTV9DT1AwLAorICBNX0NPUDEsCisgIE1fQ09QMiwKKyAgTV9DT1AzLAorICBNX05VTV9NQUNST1MKK307CisKKworLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCisgICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCisgICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCisgICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCisgICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCisgICByZWdpc3RlcnMuCisKKyAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQorICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHNfYnVpbHRpbl9vcGNvZGVzW107CitleHRlcm4gY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7CitleHRlcm4gc3RydWN0IG1pcHNfb3Bjb2RlICptaXBzX29wY29kZXM7CitleHRlcm4gaW50IGJmZF9taXBzX251bV9vcGNvZGVzOworI2RlZmluZSBOVU1PUENPREVTIGJmZF9taXBzX251bV9vcGNvZGVzCisKKwwKKy8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBhZGRzIGRlZmluaXRpb25zIGZvciB0aGUgbWlwczE2IFRpbnlSSVNDCisgICBwcm9jZXNzb3IuICAqLworCisvKiBUaGVzZSBhcmUgdGhlIGJpdG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdXNlZCBmb3IgdGhlIGRpZmZlcmVudAorICAgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgT3RoZXIgdGhhbiBPUCwgbm8gbWFza3MgYXJlCisgICBwcm92aWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb25zIG9mIGFuIGluc3RydWN0aW9uLCBzaW5jZSB0aGV5IGFyZQorICAgbm90IG5lZWRlZC4KKworICAgVGhlIEkgZm9ybWF0IHVzZXMgSU1NMTEuCisKKyAgIFRoZSBSSSBmb3JtYXQgdXNlcyBSWCBhbmQgSU1NOC4KKworICAgVGhlIFJSIGZvcm1hdCB1c2VzIFJYLCBhbmQgUlkuCisKKyAgIFRoZSBSUkkgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgSU1NNS4KKworICAgVGhlIFJSUiBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBSWi4KKworICAgVGhlIFJSSV9BIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTQuCisKKyAgIFRoZSBTSElGVCBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBTSEFNVC4KKworICAgVGhlIEk4IGZvcm1hdCB1c2VzIElNTTguCisKKyAgIFRoZSBJOF9NT1ZSMzIgZm9ybWF0IHVzZXMgUlkgYW5kIFJFR1IzMi4KKworICAgVGhlIElSX01PVjMyUiBmb3JtYXQgdXNlcyBSRUczMlIgYW5kIE1PVjMyWi4KKworICAgVGhlIEk2NCBmb3JtYXQgdXNlcyBJTU04LgorCisgICBUaGUgUkk2NCBmb3JtYXQgdXNlcyBSWSBhbmQgSU1NNS4KKyAgICovCisKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19PUAkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX09QCQkxMQorI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTExCTB4N2ZmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTExCTAKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWAkweDcKKyNkZWZpbmUgTUlQUzE2T1BfU0hfUlgJCTgKKyNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU04CTB4ZmYKKyNkZWZpbmUgTUlQUzE2T1BfU0hfSU1NOAkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfUlkJMHg3CisjZGVmaW5lIE1JUFMxNk9QX1NIX1JZCQk1CisjZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNQkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTUJMAorI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JaCTB4NworI2RlZmluZSBNSVBTMTZPUF9TSF9SWgkJMgorI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTQJMHhmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTQJMAorI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFR1IzMgkweDFmCisjZGVmaW5lIE1JUFMxNk9QX1NIX1JFR1IzMgkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfUkVHMzJSCTB4MWYKKyNkZWZpbmUgTUlQUzE2T1BfU0hfUkVHMzJSCTMKKyNkZWZpbmUgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIoaSkgKCgoKGkpID4+IDUpICYgNykgfCAoKGkpICYgMHgxOCkpCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfTU9WRTMyWgkweDcKKyNkZWZpbmUgTUlQUzE2T1BfU0hfTU9WRTMyWgkwCisjZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NNgkweDNmCisjZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTYJNQorCisvKiBUaGVzZSBhcmUgdGhlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGFwcGVhcnMgaW4gdGhlIGFyZ3MgZmllbGQgb2YgYW4KKyAgIGluc3RydWN0aW9uLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmaWVsZHMgYXBwZWFyCisgICB3aGVuIHRoZSBpbnN0cnVjdGlvbiBpcyB1c2VkLiAgQ29tbWFzIGFuZCBwYXJlbnRoZXNlcyBpbiB0aGUgYXJncworICAgc3RyaW5nIGFyZSBpZ25vcmVkIHdoZW4gYXNzZW1ibGluZywgYW5kIHdyaXR0ZW4gaW50byB0aGUgb3V0cHV0CisgICB3aGVuIGRpc2Fzc2VtYmxpbmcuCisKKyAgICJ5IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWSkKKyAgICJ4IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWCkKKyAgICJ6IiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9SWikKKyAgICJaIiAzIGJpdCByZWdpc3RlciAoTUlQUzE2T1BfKl9NT1ZFMzJaKQorICAgInYiIDMgYml0IHNhbWUgcmVnaXN0ZXIgYXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiAoTUlQUzE2T1BfKl9SWCkKKyAgICJ3IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlkpCisgICAiMCIgemVybyByZWdpc3RlciAoJDApCisgICAiUyIgc3RhY2sgcG9pbnRlciAoJHNwIG9yICQyOSkKKyAgICJQIiBwcm9ncmFtIGNvdW50ZXIKKyAgICJSIiByZXR1cm4gYWRkcmVzcyByZWdpc3RlciAoJHJhIG9yICQzMSkKKyAgICJYIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFR1IzMikKKyAgICJZIiA1IGJpdCBNSVBTIHJlZ2lzdGVyIChNSVBTMTZPUF8qX1JFRzMyUikKKyAgICI2IiA2IGJpdCB1bnNpZ25lZCBicmVhayBjb2RlIChNSVBTMTZPUF8qX0lNTTYpCisgICAiYSIgMjYgYml0IGp1bXAgYWRkcmVzcworICAgImUiIDExIGJpdCBleHRlbnNpb24gdmFsdWUKKyAgICJsIiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBpbnN0cnVjdGlvbgorICAgIkwiIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgaW5zdHJ1Y3Rpb24KKworICAgVGhlIHJlbWFpbmluZyBjb2RlcyBtYXkgYmUgZXh0ZW5kZWQuICBFeGNlcHQgYXMgb3RoZXJ3aXNlIG5vdGVkLAorICAgdGhlIGZ1bGwgZXh0ZW5kZWQgb3BlcmFuZCBpcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUuCisgICAiPCIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JaKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKKyAgICI+IiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlgpIChmdWxsIDUgYml0IHVuc2lnbmVkKQorICAgIlsiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCisgICAiXSIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA2IGJpdCB1bnNpZ25lZCkKKyAgICI0IiA0IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU00KSAoZnVsbCAxNSBiaXQgc2lnbmVkKQorICAgIjUiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKKyAgICJIIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAyIChNSVBTMTZPUF8qX0lNTTUpCisgICAiVyIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU01KQorICAgIkQiIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NNSkKKyAgICJqIiA1IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU01KQorICAgIjgiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkKKyAgICJWIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA0IChNSVBTMTZPUF8qX0lNTTgpCisgICAiQyIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogOCAoTUlQUzE2T1BfKl9JTU04KQorICAgIlUiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NOCkgKGZ1bGwgMTYgYml0IHVuc2lnbmVkKQorICAgImsiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCisgICAiSyIgOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKKyAgICJwIiA4IGJpdCBjb25kaXRpb25hbCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU04KQorICAgInEiIDExIGJpdCBicmFuY2ggYWRkcmVzcyAoTUlQUzE2T1BfKl9JTU0xMSkKKyAgICJBIiA4IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogNCAoTUlQUzE2T1BfKl9JTU04KQorICAgIkIiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA4IChNSVBTMTZPUF8qX0lNTTUpCisgICAiRSIgNSBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NNSkKKyAgICovCisKKy8qIFNhdmUvcmVzdG9yZSBlbmNvZGluZyBmb3IgdGhlIGFyZ3MgZmllbGQgd2hlbiBhbGwgNCByZWdpc3RlcnMgYXJlCisgICBlaXRoZXIgc2F2ZWQgYXMgYXJndW1lbnRzIG9yIHNhdmVkL3Jlc3RvcmVkIGFzIHN0YXRpY3MuICAqLworI2RlZmluZSBNSVBTMTZfQUxMX0FSR1MgICAgMHhlCisjZGVmaW5lIE1JUFMxNl9BTExfU1RBVElDUyAweGIKKworLyogRm9yIHRoZSBtaXBzMTYsIHdlIHVzZSB0aGUgc2FtZSBvcGNvZGUgdGFibGUgZm9ybWF0IGFuZCBhIGZldyBvZgorICAgdGhlIHNhbWUgZmxhZ3MuICBIb3dldmVyLCBtb3N0IG9mIHRoZSBmbGFncyBhcmUgZGlmZmVyZW50LiAgKi8KKworLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlguICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9YCQkgICAgMHgwMDAwMDAwMQorLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlkuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9ZCQkgICAgMHgwMDAwMDAwMgorLyogTW9kaWZpZXMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlouICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9aCQkgICAgMHgwMDAwMDAwNAorLyogTW9kaWZpZXMgdGhlIFQgKCQyNCkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9UCQkgICAgMHgwMDAwMDAwOAorLyogTW9kaWZpZXMgdGhlIFNQICgkMjkpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fV1JJVEVfU1AJCSAgICAweDAwMDAwMDEwCisvKiBNb2RpZmllcyB0aGUgUkEgKCQzMSkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV8zMQkJICAgIDB4MDAwMDAwMjAKKy8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SRUczMlIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9HUFJfWQkJICAgIDB4MDAwMDAwNDAKKy8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JYLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9YCQkgICAgMHgwMDAwMDA4MAorLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlkuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1kJCSAgICAweDAwMDAwMTAwCisvKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9NT1ZFMzJaLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9aCQkgICAgMHgwMDAwMDIwMAorLyogUmVhZHMgdGhlIFQgKCQyNCkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1QJCSAgICAweDAwMDAwNDAwCisvKiBSZWFkcyB0aGUgU1AgKCQyOSkgcmVnaXN0ZXIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1NQCQkgICAgMHgwMDAwMDgwMAorLyogUmVhZHMgdGhlIFJBICgkMzEpIHJlZ2lzdGVyLiAgKi8KKyNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF8zMQkJICAgIDB4MDAwMDEwMDAKKy8qIFJlYWRzIHRoZSBwcm9ncmFtIGNvdW50ZXIuICAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1BDCQkgICAgMHgwMDAwMjAwMAorLyogUmVhZHMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JFR1IzMi4gICovCisjZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfR1BSX1gJCSAgICAweDAwMDA0MDAwCisvKiBJcyBhIGJyYW5jaCBpbnNuLiAqLworI2RlZmluZSBNSVBTMTZfSU5TTl9CUkFOQ0ggICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisKKy8qIFRoZSBmb2xsb3dpbmcgZmxhZ3MgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIG1pcHMxNiBvcGNvZGUKKyAgIHRhYmxlOgorICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCisgICBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCisgICBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSAobmV2ZXIgdXNlZCkKKyAgIElOU05fUkVBRF9ISQorICAgSU5TTl9SRUFEX0xPCisgICBJTlNOX1dSSVRFX0hJCisgICBJTlNOX1dSSVRFX0xPCisgICBJTlNOX1RSQVAKKyAgIElOU05fSVNBMworICAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzMTZfb3Bjb2Rlc1tdOworZXh0ZXJuIGNvbnN0IGludCBiZmRfbWlwczE2X251bV9vcGNvZGVzOworCisvKiBTaG9ydCBoYW5kIHNvIHRoZSBsaW5lcyBhcmVuJ3QgdG9vIGxvbmcuICAqLworCisjZGVmaW5lIExERCAgICAgSU5TTl9MT0FEX01FTU9SWV9ERUxBWQorI2RlZmluZSBMQ0QJSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQorI2RlZmluZSBVQkQgICAgIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQorI2RlZmluZSBDQkQJSU5TTl9DT05EX0JSQU5DSF9ERUxBWQorI2RlZmluZSBDT0QgICAgIElOU05fQ09QUk9DX01PVkVfREVMQVkKKyNkZWZpbmUgQ0xECUlOU05fQ09QUk9DX01FTU9SWV9ERUxBWQorI2RlZmluZSBDQkwJSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkKKyNkZWZpbmUgVFJBUAlJTlNOX1RSQVAKKyNkZWZpbmUgU00JSU5TTl9TVE9SRV9NRU1PUlkKKworI2RlZmluZSBXUl9kICAgIElOU05fV1JJVEVfR1BSX0QKKyNkZWZpbmUgV1JfdCAgICBJTlNOX1dSSVRFX0dQUl9UCisjZGVmaW5lIFdSXzMxICAgSU5TTl9XUklURV9HUFJfMzEKKyNkZWZpbmUgV1JfRCAgICBJTlNOX1dSSVRFX0ZQUl9ECisjZGVmaW5lIFdSX1QJSU5TTl9XUklURV9GUFJfVAorI2RlZmluZSBXUl9TCUlOU05fV1JJVEVfRlBSX1MKKyNkZWZpbmUgUkRfcyAgICBJTlNOX1JFQURfR1BSX1MKKyNkZWZpbmUgUkRfYiAgICBJTlNOX1JFQURfR1BSX1MKKyNkZWZpbmUgUkRfdCAgICBJTlNOX1JFQURfR1BSX1QKKyNkZWZpbmUgUkRfUyAgICBJTlNOX1JFQURfRlBSX1MKKyNkZWZpbmUgUkRfVCAgICBJTlNOX1JFQURfRlBSX1QKKyNkZWZpbmUgUkRfUglJTlNOX1JFQURfRlBSX1IKKyNkZWZpbmUgV1JfQ0MJSU5TTl9XUklURV9DT05EX0NPREUKKyNkZWZpbmUgUkRfQ0MJSU5TTl9SRUFEX0NPTkRfQ09ERQorI2RlZmluZSBSRF9DMCAgIElOU05fQ09QCisjZGVmaW5lIFJEX0MxCUlOU05fQ09QCisjZGVmaW5lIFJEX0MyICAgSU5TTl9DT1AKKyNkZWZpbmUgUkRfQzMgICBJTlNOX0NPUAorI2RlZmluZSBXUl9DMCAgIElOU05fQ09QCisjZGVmaW5lIFdSX0MxCUlOU05fQ09QCisjZGVmaW5lIFdSX0MyICAgSU5TTl9DT1AKKyNkZWZpbmUgV1JfQzMgICBJTlNOX0NPUAorCisjZGVmaW5lIFdSX0hJCUlOU05fV1JJVEVfSEkKKyNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCisjZGVmaW5lIE1PRF9ISSAgV1JfSEl8UkRfSEkKKworI2RlZmluZSBXUl9MTwlJTlNOX1dSSVRFX0xPCisjZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTworI2RlZmluZSBNT0RfTE8gIFdSX0xPfFJEX0xPCisKKyNkZWZpbmUgV1JfSElMTyBXUl9ISXxXUl9MTworI2RlZmluZSBSRF9ISUxPIFJEX0hJfFJEX0xPCisjZGVmaW5lIE1PRF9ISUxPIFdSX0hJTE98UkRfSElMTworCisjZGVmaW5lIElTX00gICAgSU5TTl9NVUxUCisKKyNkZWZpbmUgV1JfTUFDQyBJTlNOMl9XUklURV9NRE1YX0FDQworI2RlZmluZSBSRF9NQUNDIElOU04yX1JFQURfTURNWF9BQ0MKKworI2RlZmluZSBJMQlJTlNOX0lTQTEKKyNkZWZpbmUgSTIJSU5TTl9JU0EyCisjZGVmaW5lIEkzCUlOU05fSVNBMworI2RlZmluZSBJNAlJTlNOX0lTQTQKKyNkZWZpbmUgSTUJSU5TTl9JU0E1CisjZGVmaW5lIEkzMglJTlNOX0lTQTMyCisjZGVmaW5lIEk2NCAgICAgSU5TTl9JU0E2NAorI2RlZmluZSBJMzMJSU5TTl9JU0EzMlIyCisjZGVmaW5lIEk2NQlJTlNOX0lTQTY0UjIKKworLyogTUlQUzY0IE1JUFMtM0QgQVNFIHN1cHBvcnQuICAqLworI2RlZmluZSBJMTYgICAgIElOU05fTUlQUzE2CisKKy8qIE1JUFMzMiBTbWFydE1JUFMgQVNFIHN1cHBvcnQuICAqLworI2RlZmluZSBTTVQJSU5TTl9TTUFSVE1JUFMKKworLyogTUlQUzY0IE1JUFMtM0QgQVNFIHN1cHBvcnQuICAqLworI2RlZmluZSBNM0QgICAgIElOU05fTUlQUzNECisKKy8qIE1JUFM2NCBNRE1YIEFTRSBzdXBwb3J0LiAgKi8KKyNkZWZpbmUgTVggICAgICBJTlNOX01ETVgKKworI2RlZmluZSBJTDJFCShJTlNOX0xPT05HU09OXzJFKQorI2RlZmluZSBJTDJGCShJTlNOX0xPT05HU09OXzJGKQorCisjZGVmaW5lIFAzCUlOU05fNDY1MAorI2RlZmluZSBMMQlJTlNOXzQwMTAKKyNkZWZpbmUgVjEJKElOU05fNDEwMCB8IElOU05fNDExMSB8IElOU05fNDEyMCkKKyNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKKyNkZWZpbmUgTTEJSU5TTl8xMDAwMAorI2RlZmluZSBTQjEgICAgIElOU05fU0IxCisjZGVmaW5lIE40MTEJSU5TTl80MTExCisjZGVmaW5lIE40MTIJSU5TTl80MTIwCisjZGVmaW5lIE41CShJTlNOXzU0MDAgfCBJTlNOXzU1MDApCisjZGVmaW5lIE41NAlJTlNOXzU0MDAKKyNkZWZpbmUgTjU1CUlOU05fNTUwMAorCisjZGVmaW5lIEcxICAgICAgKFQzICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIEcyICAgICAgKFQzICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKQorCisjZGVmaW5lIEczICAgICAgKEk0ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKQorCisvKiBNSVBTIERTUCBBU0Ugc3VwcG9ydC4KKyAgIE5PVEU6CisgICAxLiBNSVBTIERTUCBBU0UgaW5jbHVkZXMgNCBhY2N1bXVsYXRvcnMgKCRhYzAgLSAkYWMzKS4gICRhYzAgaXMgdGhlIHBhaXIKKyAgIG9mIG9yaWdpbmFsIEhJIGFuZCBMTy4gICRhYzEsICRhYzIgYW5kICRhYzMgYXJlIG5ldyByZWdpc3RlcnMsIGFuZCBoYXZlCisgICB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgJGFjMCAoSEkgKyBMTykuICBGb3IgRFNQIGluc3RydWN0aW9ucyB0aGF0IHdyaXRlIG9yCisgICByZWFkIGFjY3VtdWxhdG9ycyAodGhhdCBtYXkgYmUgJGFjMCksIHdlIGFkZCBXUl9hIChXUl9ISUxPKSBvciBSRF9hCisgICAoUkRfSElMTykgYXR0cmlidXRlcywgc3VjaCB0aGF0IEhJTE8gZGVwZW5kZW5jaWVzIGFyZSBtYWludGFpbmVkCisgICBjb25zZXJ2YXRpdmVseS4KKworICAgMi4gRm9yIHNvbWUgbXVsLiBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgaW50ZWdlciByZWdpc3RlcnMgYXMgZGVzdGluYXRpb25zCisgICBidXQgZGVzdHJveSBISStMTyBhcyBzaWRlLWVmZmVjdCwgd2UgYWRkIFdSX0hJTE8gdG8gdGhlaXIgYXR0cmlidXRlcy4KKworICAgMy4gTUlQUyBEU1AgQVNFIGluY2x1ZGVzIGEgbmV3IERTUCBjb250cm9sIHJlZ2lzdGVyLCB3aGljaCBoYXMgNiBmaWVsZHMKKyAgIChjY29uZCwgb3V0ZmxhZywgRUZJLCBjLCBzY291bnQsIHBvcykuICBNYW55IERTUCBpbnN0cnVjdGlvbnMgcmVhZCBvciB3cml0ZQorICAgY2VydGFpbiBmaWVsZHMgb2YgdGhlIERTUCBjb250cm9sIHJlZ2lzdGVyLiAgRm9yIHNpbXBsaWNpdHksIHdlIGRlY2lkZSBub3QKKyAgIHRvIHRyYWNrIGRlcGVuZGVuY2llcyBvZiB0aGVzZSBmaWVsZHMuCisgICBIb3dldmVyLCAiYnBvc2dlMzIiIGlzIGEgYnJhbmNoIGluc3RydWN0aW9uIHRoYXQgZGVwZW5kcyBvbiB0aGUgInBvcyIKKyAgIGZpZWxkLiAgSW4gb3JkZXIgdG8gbWFrZSBzdXJlIHRoYXQgR0FTIGRvZXMgbm90IHJlb3JkZXIgRFNQIGluc3RydWN0aW9ucworICAgdGhhdCB3cml0ZXMgdGhlICJwb3MiIGZpZWxkIGFuZCAiYnBvc2dlMzIiLCB3ZSBhZGQgRFNQX1ZPTEEgKElOU05fVFJBUCkKKyAgIGF0dHJpYnV0ZSB0byB0aG9zZSBpbnN0cnVjdGlvbnMgdGhhdCB3cml0ZSB0aGUgInBvcyIgZmllbGQuICAqLworCisjZGVmaW5lIFdSX2EJV1JfSElMTwkvKiBXcml0ZSBkc3AgYWNjdW11bGF0b3JzIChyZXVzZSBXUl9ISUxPKSAgKi8KKyNkZWZpbmUgUkRfYQlSRF9ISUxPCS8qIFJlYWQgZHNwIGFjY3VtdWxhdG9ycyAocmV1c2UgUkRfSElMTykgICovCisjZGVmaW5lIE1PRF9hCVdSX2F8UkRfYQorI2RlZmluZSBEU1BfVk9MQQlJTlNOX1RSQVAKKyNkZWZpbmUgRDMyCUlOU05fRFNQCisjZGVmaW5lIEQzMwlJTlNOX0RTUFIyCisjZGVmaW5lIEQ2NAlJTlNOX0RTUDY0CisKKy8qIE1JUFMgTVQgQVNFIHN1cHBvcnQuICAqLworI2RlZmluZSBNVDMyCUlOU05fTVQKKworLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCisgICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCisgICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCisgICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCisgICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCisgICByZWdpc3RlcnMuCisKKyAgIEJlY2F1c2Ugb2YgdGhlIGxvb2t1cCBhbGdvcml0aG0gdXNlZCwgZW50cmllcyB3aXRoIHRoZSBzYW1lIG9wY29kZQorICAgbmFtZSBtdXN0IGJlIGNvbnRpZ3VvdXMuCisKKyAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQorICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLworCitjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwc19idWlsdGluX29wY29kZXNbXSA9Cit7CisvKiBUaGVzZSBpbnN0cnVjdGlvbnMgYXBwZWFyIGZpcnN0IHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGZpbmQKKyAgIHRoZW0gZmlyc3QuICBUaGUgYXNzZW1ibGVycyB1c2VzIGEgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUKKyAgIGluc3RydWN0aW9uIG5hbWUgYW55aG93LiAgKi8KKy8qIG5hbWUsICAgIGFyZ3MsCW1hdGNoLAkgICAgbWFzaywJcGluZm8sICAgICAgICAgIAltZW1iZXJzaGlwICovCit7InByZWYiLCAgICAiayxvKGIpIiwgICAweGNjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLCAgICAgICAgICAgCTAsCQlJNHxJMzJ8RzMJfSwKK3sicHJlZngiLCAgICJoLHQoYikiLAkweDRjMDAwMDBmLCAweGZjMDAwN2ZmLCBSRF9ifFJEX3QsCQkwLAkJSTR8STMzCX0sCit7Im5vcCIsICAgICAiIiwgICAgICAgICAweDAwMDAwMDAwLCAweGZmZmZmZmZmLCAwLCAgICAgICAgICAgICAgCUlOU04yX0FMSUFTLAlJMSAgICAgIH0sIC8qIHNsbCAqLworeyJzc25vcCIsICAgIiIsICAgICAgICAgMHgwMDAwMDA0MCwgMHhmZmZmZmZmZiwgMCwgICAgICAgICAgICAgIAlJTlNOMl9BTElBUywJSTMyfE41NQl9LCAvKiBzbGwgKi8KK3siZWhiIiwgICAgICIiLCAgICAgICAgIDB4MDAwMDAwYzAsIDB4ZmZmZmZmZmYsIDAsICAgICAgICAgICAgICAJSU5TTjJfQUxJQVMsCUkzMwl9LCAvKiBzbGwgKi8KK3sibGkiLCAgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQkJSU5TTjJfQUxJQVMsCUkxCX0sIC8qIGFkZGl1ICovCit7ImxpIiwJICAgICJ0LGkiLAkweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAkJCUlOU04yX0FMSUFTLAlJMQl9LCAvKiBvcmkgKi8KK3sibGkiLCAgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0xJLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Im1vdmUiLCAgICAiZCxzIiwJMCwgICAgKGludCkgTV9NT1ZFLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyZCwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAkJSU5TTjJfQUxJQVMsCUkzCX0sLyogZGFkZHUgKi8KK3sibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDIxLCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCQlJTlNOMl9BTElBUywJSTEJfSwvKiBhZGR1ICovCit7Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyNSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLAkJSU5TTjJfQUxJQVMsCUkxCX0sLyogb3IgKi8KK3siYiIsICAgICAgICJwIiwJMHgxMDAwMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJCUlOU04yX0FMSUFTLAlJMQl9LC8qIGJlcSAwLDAgKi8KK3siYiIsICAgICAgICJwIiwJMHgwNDAxMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJCUlOU04yX0FMSUFTLAlJMQl9LC8qIGJnZXogMCAqLworeyJiYWwiLCAgICAgInAiLAkweDA0MTEwMDAwLCAweGZmZmYwMDAwLAlVQkR8V1JfMzEsCQlJTlNOMl9BTElBUywJSTEJfSwvKiBiZ2V6YWwgMCovCisKK3siYWJzIiwgICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0FCUywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJhYnMucyIsICAgIkQsViIsCTB4NDYwMDAwMDUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAkJMCwJCUkxCX0sCit7ImFicy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTEJfSwKK3siYWJzLnBzIiwgICJELFYiLAkweDQ2YzAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJCTAsCQlJNXxJMzMJfSwKK3siYWRkIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjAsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkxCX0sCit7ImFkZCIsICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0FERF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImFkZC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAkwLAkJSTEJfSwKK3siYWRkLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJMQl9LAoreyJhZGQub2IiLCAgIlgsWSxRIiwJMHg3ODAwMDAwYiwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJhZGQub2IiLCAgIkQsUyxUIiwJMHg0YWMwMDAwYiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7ImFkZC5vYiIsICAiRCxTLFRbZV0iLAkweDQ4MDAwMDBiLCAweGZlMjAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3siYWRkLm9iIiwgICJELFMsayIsCTB4NGJjMDAwMGIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJhZGQucHMiLCAgIkQsVixUIiwJMHg0NmMwMDAwMCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJhZGQucWgiLCAgIlgsWSxRIiwJMHg3ODIwMDAwYiwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7ImFkZGEub2IiLCAiWSxRIiwJMHg3ODAwMDAzNywgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsCQlXUl9NQUNDLAlNWHxTQjEJfSwKK3siYWRkYS5xaCIsICJZLFEiLAkweDc4MjAwMDM3LCAweGZjMjAwN2ZmLAlSRF9TfFJEX1R8RlBfRCwJCVdSX01BQ0MsCU1YCX0sCit7ImFkZGkiLCAgICAidCxyLGoiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCQkwLAkJSTEJfSwKK3siYWRkaXUiLCAgICJ0LHIsaiIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJCTAsCQlJMQl9LAoreyJhZGRsLm9iIiwgIlksUSIsCTB4NzgwMDA0MzcsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7ImFkZGwucWgiLCAiWSxRIiwJMHg3ODIwMDQzNywgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsCQlXUl9NQUNDLAlNWAl9LAoreyJhZGRyLnBzIiwgIkQsUyxUIiwJMHg0NmMwMDAxOCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU0zRAl9LAoreyJhZGR1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3siYWRkdSIsICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQUREVV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImFsbmkub2IiLCAiWCxZLFosTyIsCTB4NzgwMDAwMTgsIDB4ZmYwMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3siYWxuaS5vYiIsICJELFMsVCwlIiwJMHg0ODAwMDAxOCwgMHhmZjAwMDAzZiwJV1JfRHxSRF9TfFJEX1QsIAkwLAkJTjU0CX0sCit7ImFsbmkucWgiLCAiWCxZLFosTyIsCTB4NzgwMDAwMWEsIDB4ZmYwMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJhbG52LnBzIiwgIkQsVixULHMiLAkweDRjMDAwMDFlLCAweGZjMDAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJSTV8STMzCX0sCit7ImFsbnYub2IiLCAiWCxZLFoscyIsCTB4NzgwMDAwMTksIDB4ZmMwMDAwM2YsCVdSX0R8UkRfU3xSRF9UfFJEX3N8RlBfRCwgMCwJCU1YfFNCMQl9LAoreyJhbG52LnFoIiwgIlgsWSxaLHMiLAkweDc4MDAwMDFiLCAweGZjMDAwMDNmLAlXUl9EfFJEX1N8UkRfVHxSRF9zfEZQX0QsIDAsCQlNWAl9LAoreyJhbmQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3siYW5kIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQU5EX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYW5kLm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMGMsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3siYW5kLm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMGMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJhbmQub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAwYywgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7ImFuZC5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDBjLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3siYW5kLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMGMsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJhbmRpIiwgICAgInQscixpIiwJMHgzMDAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAkJMCwJCUkxCX0sCisvKiBiIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KKy8qIGJhbCBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCisvKiBiYzBbdGZdbD8gYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KK3siYmMxYW55MmYiLCAiTixwIiwJMHg0NTIwMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCQkwLAkJTTNECX0sCit7ImJjMWFueTJ0IiwgIk4scCIsCTB4NDUyMTAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAkJMCwJCU0zRAl9LAoreyJiYzFhbnk0ZiIsICJOLHAiLAkweDQ1NDAwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJCTAsCQlNM0QJfSwKK3siYmMxYW55NHQiLCAiTixwIiwJMHg0NTQxMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDfEZQX1MsCQkwLAkJTTNECX0sCit7ImJjMWYiLCAgICAicCIsCTB4NDUwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAkJMCwJCUkxCX0sCit7ImJjMWYiLCAgICAiTixwIiwgICAgICAweDQ1MDAwMDAwLCAweGZmZTMwMDAwLCBDQkR8UkRfQ0N8RlBfUywgCTAsCQlJNHxJMzIJfSwKK3siYmMxZmwiLCAgICJwIiwJMHg0NTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCQkwLAkJSTJ8VDMJfSwKK3siYmMxZmwiLCAgICJOLHAiLCAgICAgIDB4NDUwMjAwMDAsIDB4ZmZlMzAwMDAsIENCTHxSRF9DQ3xGUF9TLCAJMCwJCUk0fEkzMgl9LAoreyJiYzF0IiwgICAgInAiLAkweDQ1MDEwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJCTAsCQlJMQl9LAoreyJiYzF0IiwgICAgIk4scCIsICAgICAgMHg0NTAxMDAwMCwgMHhmZmUzMDAwMCwgQ0JEfFJEX0NDfEZQX1MsIAkwLAkJSTR8STMyCX0sCit7ImJjMXRsIiwgICAicCIsCTB4NDUwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQ3xGUF9TLAkJMCwJCUkyfFQzCX0sCit7ImJjMXRsIiwgICAiTixwIiwgICAgICAweDQ1MDMwMDAwLCAweGZmZTMwMDAwLCBDQkx8UkRfQ0N8RlBfUywgCTAsCQlJNHxJMzIJfSwKKy8qIGJjMiogYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KKy8qIGJjMyogYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KK3siYmVxeiIsICAgICJzLHAiLAkweDEwMDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJCTAsCQlJMQl9LAoreyJiZXF6bCIsICAgInMscCIsCTB4NTAwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAkJMCwJCUkyfFQzCX0sCit7ImJlcSIsICAgICAicyx0LHAiLAkweDEwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkR8UkRfc3xSRF90LAkJMCwJCUkxCX0sCit7ImJlcSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImJlcWwiLCAgICAicyx0LHAiLAkweDUwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkx8UkRfc3xSRF90LAkJMCwJCUkyfFQzCX0sCit7ImJlcWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JFUUxfSSwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJiZ2UiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0UsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmdlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmdlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFTCwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJiZ2VsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VMX0ksCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmdldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJiZ2V1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR0VVX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmdldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVUwsCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmdldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFVUxfSSwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJiZ2V6IiwgICAgInMscCIsCTB4MDQwMTAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAkJMCwJCUkxCX0sCit7ImJnZXpsIiwgICAicyxwIiwJMHgwNDAzMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCQkwLAkJSTJ8VDMJfSwKK3siYmdlemFsIiwgICJzLHAiLAkweDA0MTEwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfc3xXUl8zMSwJCTAsCQlJMQl9LAoreyJiZ2V6YWxsIiwgInMscCIsCTB4MDQxMzAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zfFdSXzMxLAkJMCwJCUkyfFQzCX0sCit7ImJndCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVCwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJiZ3QiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJiZ3RsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RMLAlJTlNOX01BQ1JPLAkJMCwJCUkyfFQzCX0sCit7ImJndGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVExfSSwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJiZ3R1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImJndHUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHVFVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJiZ3R1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVTCwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJiZ3R1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RVTF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkyfFQzCX0sCit7ImJndHoiLCAgICAicyxwIiwJMHgxYzAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCQkwLAkJSTEJfSwKK3siYmd0emwiLCAgICJzLHAiLAkweDVjMDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJCTAsCQlJMnxUMwl9LAoreyJibGUiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEUsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmxlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmxlbCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFTCwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJibGVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVMX0ksCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmxldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJibGV1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVVX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmxldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVUwsCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmxldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxFVUxfSSwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJibGV6IiwgICAgInMscCIsCTB4MTgwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAkJMCwJCUkxCX0sCit7ImJsZXpsIiwgICAicyxwIiwJMHg1ODAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCQkwLAkJSTJ8VDMJfSwKK3siYmx0IiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxULAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImJsdCIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImJsdGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVEwsCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmx0bCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUTF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkyfFQzCX0sCit7ImJsdHUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFUsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYmx0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUVV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImJsdHVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVFVMLAlJTlNOX01BQ1JPLAkJMCwJCUkyfFQzCX0sCit7ImJsdHVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVFVMX0ksCUlOU05fTUFDUk8sCQkwLAkJSTJ8VDMJfSwKK3siYmx0eiIsICAgICJzLHAiLAkweDA0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJCTAsCQlJMQl9LAoreyJibHR6bCIsICAgInMscCIsCTB4MDQwMjAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAkJMCwJCUkyfFQzCX0sCit7ImJsdHphbCIsICAicyxwIiwJMHgwNDEwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3N8V1JfMzEsCQkwLAkJSTEJfSwKK3siYmx0emFsbCIsICJzLHAiLAkweDA0MTIwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfc3xXUl8zMSwJCTAsCQlJMnxUMwl9LAoreyJibmV6IiwgICAgInMscCIsCTB4MTQwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAkJMCwJCUkxCX0sCit7ImJuZXpsIiwgICAicyxwIiwJMHg1NDAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCQkwLAkJSTJ8VDMJfSwKK3siYm5lIiwgICAgICJzLHQscCIsCTB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3siYm5lIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQk5FX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siYm5lbCIsICAgICJzLHQscCIsCTB4NTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCTHxSRF9zfFJEX3QsIAkJMCwJCUkyfFQzCX0sCit7ImJuZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JORUxfSSwJSU5TTl9NQUNSTywJCTAsCQlJMnxUMwl9LAoreyJicmVhayIsICAgIiIsCQkweDAwMDAwMDBkLCAweGZmZmZmZmZmLAlUUkFQLAkJCTAsCQlJMQl9LAoreyJicmVhayIsICAgImMiLAkweDAwMDAwMDBkLCAweGZjMDBmZmZmLAlUUkFQLAkJCTAsCQlJMQl9LAoreyJicmVhayIsICAgImMscSIsCTB4MDAwMDAwMGQsIDB4ZmMwMDAwM2YsCVRSQVAsCQkJMCwJCUkxCX0sCit7ImMuZi5kIiwgICAiUyxUIiwJMHg0NjIwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJMQl9LAoreyJjLmYuZCIsICAgIk0sUyxUIiwgICAgMHg0NjIwMDAzMCwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLmYucyIsICAgIlMsVCIsICAgICAgMHg0NjAwMDAzMCwgMHhmZmUwMDdmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUkxICAgICAgfSwKK3siYy5mLnMiLCAgICJNLFMsVCIsICAgIDB4NDYwMDAwMzAsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy5mLnBzIiwgICJTLFQiLAkweDQ2YzAwMDMwLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLmYucHMiLCAgIk0sUyxUIiwJMHg0NmMwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy51bi5kIiwgICJTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUkxCX0sCit7ImMudW4uZCIsICAiTSxTLFQiLCAgICAweDQ2MjAwMDMxLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7ImMudW4ucyIsICAiUyxUIiwgICAgICAweDQ2MDAwMDMxLCAweGZmZTAwN2ZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTEgICAgICB9LAoreyJjLnVuLnMiLCAgIk0sUyxUIiwgICAgMHg0NjAwMDAzMSwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUk0fEkzMgl9LAoreyJjLnVuLnBzIiwgIlMsVCIsCTB4NDZjMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMudW4ucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDMxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLmVxLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzIsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTEJfSwKK3siYy5lcS5kIiwgICJNLFMsVCIsICAgIDB4NDYyMDAwMzIsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3siYy5lcS5zIiwgICJTLFQiLCAgICAgIDB4NDYwMDAwMzIsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJMSAgICAgIH0sCit7ImMuZXEucyIsICAiTSxTLFQiLCAgICAweDQ2MDAwMDMyLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTR8STMyCX0sCit7ImMuZXEub2IiLCAiWSxRIiwJMHg3ODAwMDAwMSwgMHhmYzIwMDdmZiwJV1JfQ0N8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3siYy5lcS5vYiIsICJTLFQiLAkweDRhYzAwMDAxLCAweGZmZTAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3siYy5lcS5vYiIsICJTLFRbZV0iLAkweDQ4MDAwMDAxLCAweGZlMjAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3siYy5lcS5vYiIsICJTLGsiLAkweDRiYzAwMDAxLCAweGZmZTAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3siYy5lcS5wcyIsICJTLFQiLAkweDQ2YzAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLmVxLnBzIiwgIk0sUyxUIiwJMHg0NmMwMDAzMiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5lcS5xaCIsICJZLFEiLAkweDc4MjAwMDAxLCAweGZjMjAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7ImMudWVxLmQiLCAiUyxUIiwJMHg0NjIwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJMQl9LAoreyJjLnVlcS5kIiwgIk0sUyxUIiwgICAgMHg0NjIwMDAzMywgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLnVlcS5zIiwgIlMsVCIsICAgICAgMHg0NjAwMDAzMywgMHhmZmUwMDdmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUkxICAgICAgfSwKK3siYy51ZXEucyIsICJNLFMsVCIsICAgIDB4NDYwMDAwMzMsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy51ZXEucHMiLCJTLFQiLAkweDQ2YzAwMDMzLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLnVlcS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5vbHQuZCIsICJTLFQiLCAgICAgIDB4NDYyMDAwMzQsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJMSAgICAgIH0sCit7ImMub2x0LmQiLCAiTSxTLFQiLCAgICAweDQ2MjAwMDM0LCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7ImMub2x0LnMiLCAiUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCTAsCQlJMQl9LAoreyJjLm9sdC5zIiwgIk0sUyxUIiwgICAgMHg0NjAwMDAzNCwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUk0fEkzMgl9LAoreyJjLm9sdC5wcyIsIlMsVCIsCTB4NDZjMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMub2x0LnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLnVsdC5kIiwgIlMsVCIsCTB4NDYyMDAwMzUsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTEJfSwKK3siYy51bHQuZCIsICJNLFMsVCIsICAgIDB4NDYyMDAwMzUsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3siYy51bHQucyIsICJTLFQiLCAgICAgIDB4NDYwMDAwMzUsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJMSAgICAgIH0sCit7ImMudWx0LnMiLCAiTSxTLFQiLCAgICAweDQ2MDAwMDM1LCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTR8STMyCX0sCit7ImMudWx0LnBzIiwiUyxUIiwJMHg0NmMwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy51bHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMub2xlLmQiLCAiUyxUIiwgICAgICAweDQ2MjAwMDM2LCAweGZmZTAwN2ZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTEgICAgICB9LAoreyJjLm9sZS5kIiwgIk0sUyxUIiwgICAgMHg0NjIwMDAzNiwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLm9sZS5zIiwgIlMsVCIsICAgICAgMHg0NjAwMDAzNiwgMHhmZmUwMDdmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUkxICAgICAgfSwKK3siYy5vbGUucyIsICJNLFMsVCIsICAgIDB4NDYwMDAwMzYsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy5vbGUucHMiLCJTLFQiLAkweDQ2YzAwMDM2LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLm9sZS5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy51bGUuZCIsICJTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUkxCX0sCit7ImMudWxlLmQiLCAiTSxTLFQiLCAgICAweDQ2MjAwMDM3LCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7ImMudWxlLnMiLCAiUyxUIiwgICAgICAweDQ2MDAwMDM3LCAweGZmZTAwN2ZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTEgICAgICB9LAoreyJjLnVsZS5zIiwgIk0sUyxUIiwgICAgMHg0NjAwMDAzNywgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUk0fEkzMgl9LAoreyJjLnVsZS5wcyIsIlMsVCIsCTB4NDZjMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMudWxlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLnNmLmQiLCAgIlMsVCIsCTB4NDYyMDAwMzgsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTEJfSwKK3siYy5zZi5kIiwgICJNLFMsVCIsICAgIDB4NDYyMDAwMzgsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3siYy5zZi5zIiwgICJTLFQiLCAgICAgIDB4NDYwMDAwMzgsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJMSAgICAgIH0sCit7ImMuc2YucyIsICAiTSxTLFQiLCAgICAweDQ2MDAwMDM4LCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTR8STMyCX0sCit7ImMuc2YucHMiLCAiUyxUIiwJMHg0NmMwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5zZi5wcyIsICJNLFMsVCIsCTB4NDZjMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubmdsZS5kIiwiUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJMQl9LAoreyJjLm5nbGUuZCIsIk0sUyxUIiwgICAgMHg0NjIwMDAzOSwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLm5nbGUucyIsIlMsVCIsICAgICAgMHg0NjAwMDAzOSwgMHhmZmUwMDdmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUkxICAgICAgfSwKK3siYy5uZ2xlLnMiLCJNLFMsVCIsICAgIDB4NDYwMDAwMzksIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy5uZ2xlLnBzIiwiUyxUIiwJMHg0NmMwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5uZ2xlLnBzIiwiTSxTLFQiLAkweDQ2YzAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLnNlcS5kIiwgIlMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTEJfSwKK3siYy5zZXEuZCIsICJNLFMsVCIsICAgIDB4NDYyMDAwM2EsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3siYy5zZXEucyIsICJTLFQiLCAgICAgIDB4NDYwMDAwM2EsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJMSAgICAgIH0sCit7ImMuc2VxLnMiLCAiTSxTLFQiLCAgICAweDQ2MDAwMDNhLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTR8STMyCX0sCit7ImMuc2VxLnBzIiwiUyxUIiwJMHg0NmMwMDAzYSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5zZXEucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubmdsLmQiLCAiUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJMQl9LAoreyJjLm5nbC5kIiwgIk0sUyxUIiwgICAgMHg0NjIwMDAzYiwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLm5nbC5zIiwgIlMsVCIsICAgICAgMHg0NjAwMDAzYiwgMHhmZmUwMDdmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUkxICAgICAgfSwKK3siYy5uZ2wucyIsICJNLFMsVCIsICAgIDB4NDYwMDAwM2IsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy5uZ2wucHMiLCJTLFQiLAkweDQ2YzAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLm5nbC5wcyIsIk0sUyxUIiwJMHg0NmMwMDAzYiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5sdC5kIiwgICJTLFQiLAkweDQ2MjAwMDNjLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUkxCX0sCit7ImMubHQuZCIsICAiTSxTLFQiLCAgICAweDQ2MjAwMDNjLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7ImMubHQucyIsICAiUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCTAsCQlJMQl9LAoreyJjLmx0LnMiLCAgIk0sUyxUIiwgICAgMHg0NjAwMDAzYywgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUk0fEkzMgl9LAoreyJjLmx0Lm9iIiwgIlksUSIsCTB4NzgwMDAwMDQsIDB4ZmMyMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVh8U0IxCX0sCit7ImMubHQub2IiLCAiUyxUIiwJMHg0YWMwMDAwNCwgMHhmZmUwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7ImMubHQub2IiLCAiUyxUW2VdIiwJMHg0ODAwMDAwNCwgMHhmZTIwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7ImMubHQub2IiLCAiUyxrIiwJMHg0YmMwMDAwNCwgMHhmZmUwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7ImMubHQucHMiLCAiUyxUIiwJMHg0NmMwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5sdC5wcyIsICJNLFMsVCIsCTB4NDZjMDAwM2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubHQucWgiLCAiWSxRIiwJMHg3ODIwMDAwNCwgMHhmYzIwMDdmZiwJV1JfQ0N8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJjLm5nZS5kIiwgIlMsVCIsCTB4NDYyMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTEJfSwKK3siYy5uZ2UuZCIsICJNLFMsVCIsICAgIDB4NDYyMDAwM2QsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3siYy5uZ2UucyIsICJTLFQiLCAgICAgIDB4NDYwMDAwM2QsIDB4ZmZlMDA3ZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJMSAgICAgIH0sCit7ImMubmdlLnMiLCAiTSxTLFQiLCAgICAweDQ2MDAwMDNkLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTR8STMyCX0sCit7ImMubmdlLnBzIiwiUyxUIiwJMHg0NmMwMDAzZCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siYy5uZ2UucHMiLCJNLFMsVCIsCTB4NDZjMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubGUuZCIsICAiUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlJMQl9LAoreyJjLmxlLmQiLCAgIk0sUyxUIiwgICAgMHg0NjIwMDAzZSwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX0QsICAgMCwJCUk0fEkzMgl9LAoreyJjLmxlLnMiLCAgIlMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAkwLAkJSTEJfSwKK3siYy5sZS5zIiwgICJNLFMsVCIsICAgIDB4NDYwMDAwM2UsIDB4ZmZlMDAwZmYsIFJEX1N8UkRfVHxXUl9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3siYy5sZS5vYiIsICJZLFEiLAkweDc4MDAwMDA1LCAweGZjMjAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJjLmxlLm9iIiwgIlMsVCIsCTB4NGFjMDAwMDUsIDB4ZmZlMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJjLmxlLm9iIiwgIlMsVFtlXSIsCTB4NDgwMDAwMDUsIDB4ZmUyMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJjLmxlLm9iIiwgIlMsayIsCTB4NGJjMDAwMDUsIDB4ZmZlMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJjLmxlLnBzIiwgIlMsVCIsCTB4NDZjMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubGUucHMiLCAiTSxTLFQiLAkweDQ2YzAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjLmxlLnFoIiwgIlksUSIsCTB4NzgyMDAwMDUsIDB4ZmMyMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVgJfSwKK3siYy5uZ3QuZCIsICJTLFQiLAkweDQ2MjAwMDNmLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUkxCX0sCit7ImMubmd0LmQiLCAiTSxTLFQiLCAgICAweDQ2MjAwMDNmLCAweGZmZTAwMGZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7ImMubmd0LnMiLCAiUyxUIiwgICAgICAweDQ2MDAwMDNmLCAweGZmZTAwN2ZmLCBSRF9TfFJEX1R8V1JfQ0N8RlBfUywgICAwLAkJSTEgICAgICB9LAoreyJjLm5ndC5zIiwgIk0sUyxUIiwgICAgMHg0NjAwMDAzZiwgMHhmZmUwMDBmZiwgUkRfU3xSRF9UfFdSX0NDfEZQX1MsICAgMCwJCUk0fEkzMgl9LAoreyJjLm5ndC5wcyIsIlMsVCIsCTB4NDZjMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7ImMubmd0LnBzIiwiTSxTLFQiLAkweDQ2YzAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjYWJzLmVxLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDA3MiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5lcS5wcyIsICJNLFMsVCIsCTB4NDZjMDAwNzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMuZXEucyIsICAiTSxTLFQiLAkweDQ2MDAwMDcyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLmYuZCIsICAgIk0sUyxUIiwJMHg0NjIwMDA3MCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5mLnBzIiwgICJNLFMsVCIsCTB4NDZjMDAwNzAsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMuZi5zIiwgICAiTSxTLFQiLAkweDQ2MDAwMDcwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLmxlLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDA3ZSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5sZS5wcyIsICJNLFMsVCIsCTB4NDZjMDAwN2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubGUucyIsICAiTSxTLFQiLAkweDQ2MDAwMDdlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLmx0LmQiLCAgIk0sUyxUIiwJMHg0NjIwMDA3YywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5sdC5wcyIsICJNLFMsVCIsCTB4NDZjMDAwN2MsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubHQucyIsICAiTSxTLFQiLAkweDQ2MDAwMDdjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm5nZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3ZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5uZ2UucHMiLCJNLFMsVCIsCTB4NDZjMDAwN2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubmdlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDdkLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm5nbC5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3YiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5uZ2wucHMiLCJNLFMsVCIsCTB4NDZjMDAwN2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubmdsLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDdiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm5nbGUuZCIsIk0sUyxUIiwJMHg0NjIwMDA3OSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5uZ2xlLnBzIiwiTSxTLFQiLDB4NDZjMDAwNzksIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubmdsZS5zIiwiTSxTLFQiLAkweDQ2MDAwMDc5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm5ndC5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3ZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5uZ3QucHMiLCJNLFMsVCIsCTB4NDZjMDAwN2YsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMubmd0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDdmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm9sZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3NiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5vbGUucHMiLCJNLFMsVCIsCTB4NDZjMDAwNzYsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMub2xlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDc2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLm9sdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3NCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5vbHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwNzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMub2x0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDc0LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnNlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3YSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5zZXEucHMiLCJNLFMsVCIsCTB4NDZjMDAwN2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMuc2VxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDdhLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnNmLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDA3OCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy5zZi5wcyIsICJNLFMsVCIsCTB4NDZjMDAwNzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMuc2YucyIsICAiTSxTLFQiLAkweDQ2MDAwMDc4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnVlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3MywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy51ZXEucHMiLCJNLFMsVCIsCTB4NDZjMDAwNzMsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMudWVxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDczLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnVsZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3NywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy51bGUucHMiLCJNLFMsVCIsCTB4NDZjMDAwNzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMudWxlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDc3LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnVsdC5kIiwgIk0sUyxUIiwJMHg0NjIwMDA3NSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy51bHQucHMiLCJNLFMsVCIsCTB4NDZjMDAwNzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMudWx0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDc1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAoreyJjYWJzLnVuLmQiLCAgIk0sUyxUIiwJMHg0NjIwMDA3MSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCTAsCQlNM0QJfSwKK3siY2Ficy51bi5wcyIsICJNLFMsVCIsCTB4NDZjMDAwNzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAkwLAkJTTNECX0sCit7ImNhYnMudW4ucyIsICAiTSxTLFQiLAkweDQ2MDAwMDcxLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJMCwJCU0zRAl9LAorLyogQ1c0MDEwIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYWxpYXNlcyBmb3IgdGhlIGNhY2hlIGluc3RydWN0aW9uLiAgKi8KK3siZmx1c2hpIiwgICIiLAkJMHhiYzAxMDAwMCwgMHhmZmZmZmZmZiwgMCwJCQkwLAkJTDEJfSwKK3siZmx1c2hkIiwgICIiLAkJMHhiYzAyMDAwMCwgMHhmZmZmZmZmZiwgMCwgCQkJMCwJCUwxCX0sCit7ImZsdXNoaWQiLCAiIiwJCTB4YmMwMzAwMDAsIDB4ZmZmZmZmZmYsIDAsIAkJCTAsCQlMMQl9LAoreyJ3YiIsIAkgICAgIm8oYikiLAkweGJjMDQwMDAwLCAweGZjMWYwMDAwLCBTTXxSRF9iLAkJMCwJCUwxCX0sCit7ImNhY2hlIiwgICAiayxvKGIpIiwgICAweGJjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLCAgICAgICAgICAgCTAsCQlJM3xJMzJ8VDN9LAoreyJjYWNoZSIsICAgImssQShiKSIsCTAsICAgIChpbnQpIE1fQ0FDSEVfQUIsIElOU05fTUFDUk8sCQkwLAkJSTN8STMyfFQzfSwKK3siY2VpbC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTN8STMzCX0sCit7ImNlaWwubC5zIiwgIkQsUyIsCTB4NDYwMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TfEZQX0QsCTAsCQlJM3xJMzMJfSwKK3siY2VpbC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1N8RlBfRCwJMCwJCUkyCX0sCit7ImNlaWwudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGUsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAkJMCwJCUkyCX0sCit7ImNmYzAiLCAgICAidCxHIiwJMHg0MDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzAsCQkwLAkJSTEJfSwKK3siY2ZjMSIsICAgICJ0LEciLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAkwLAkJSTEJfSwKK3siY2ZjMSIsICAgICJ0LFMiLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAkwLAkJSTEJfSwKKy8qIGNmYzIgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuICAqLworLyogY2ZjMyBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCit7ImNmdGMxIiwgICAiZCxFIiwJMHg0MTAwMDAyMywgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9DMXxGUF9TLCAwLAkJTVQzMgl9LAoreyJjZnRjMSIsICAgImQsVCIsCTB4NDEwMDAwMjMsIDB4ZmZlMDA3ZmYsIFRSQVB8TENEfFdSX2R8UkRfQzF8RlBfUywgMCwJCU1UMzIJfSwKK3siY2Z0YzIiLCAgICJkLEUiLAkweDQxMDAwMDI1LCAweGZmZTAwN2ZmLCBUUkFQfExDRHxXUl9kfFJEX0MyLAkwLAkJTVQzMgl9LAoreyJjbG8iLCAgICAgIlUscyIsICAgICAgMHg3MDAwMDAyMSwgMHhmYzAwMDdmZiwgV1JfZHxXUl90fFJEX3MsIAkwLAkJSTMyfE41NSB9LAoreyJjbHoiLCAgICAgIlUscyIsICAgICAgMHg3MDAwMDAyMCwgMHhmYzAwMDdmZiwgV1JfZHxXUl90fFJEX3MsIAkwLAkJSTMyfE41NSB9LAoreyJjdGMwIiwgICAgInQsRyIsCTB4NDBjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAkJMCwJCUkxCX0sCit7ImN0YzEiLCAgICAidCxHIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJMCwJCUkxCX0sCit7ImN0YzEiLCAgICAidCxTIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJMCwJCUkxCX0sCisvKiBjdGMyIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KKy8qIGN0YzMgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdGFibGUuICAqLworeyJjdHRjMSIsICAgInQsZyIsCTB4NDE4MDAwMjMsIDB4ZmZlMDA3ZmYsIFRSQVB8Q09EfFJEX3R8V1JfQ0N8RlBfUywgMCwJCU1UMzIJfSwKK3siY3R0YzEiLCAgICJ0LFMiLAkweDQxODAwMDIzLCAweGZmZTAwN2ZmLCBUUkFQfENPRHxSRF90fFdSX0NDfEZQX1MsIDAsCQlNVDMyCX0sCit7ImN0dGMyIiwgICAidCxnIiwJMHg0MTgwMDAyNSwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9DQywJMCwJCU1UMzIJfSwKK3siY3Z0LmQubCIsICJELFMiLAkweDQ2YTAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJCTAsCQlJM3xJMzMJfSwKK3siY3Z0LmQucyIsICJELFMiLAkweDQ2MDAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTEJfSwKK3siY3Z0LmQudyIsICJELFMiLAkweDQ2ODAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTEJfSwKK3siY3Z0LmwuZCIsICJELFMiLAkweDQ2MjAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJCTAsCQlJM3xJMzMJfSwKK3siY3Z0LmwucyIsICJELFMiLAkweDQ2MDAwMDI1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTN8STMzCX0sCit7ImN2dC5zLmwiLCAiRCxTIiwJMHg0NmEwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJMCwJCUkzfEkzMwl9LAoreyJjdnQucy5kIiwgIkQsUyIsCTB4NDYyMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCTAsCQlJMQl9LAoreyJjdnQucy53IiwgIkQsUyIsCTB4NDY4MDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAkJMCwJCUkxCX0sCit7ImN2dC5zLnBsIiwiRCxTIiwJMHg0NmMwMDAyOCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJMCwJCUk1fEkzMwl9LAoreyJjdnQucy5wdSIsIkQsUyIsCTB4NDZjMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3siY3Z0LncuZCIsICJELFMiLAkweDQ2MjAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTEJfSwKK3siY3Z0LncucyIsICJELFMiLAkweDQ2MDAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJCTAsCQlJMQl9LAoreyJjdnQucHMucHciLCAiRCxTIiwJMHg0NjgwMDAyNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1N8RlBfRCwJMCwJCU0zRAl9LAoreyJjdnQucHMucyIsIkQsVixUIiwJMHg0NjAwMDAyNiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfU3xGUF9ELCAwLAkJSTV8STMzCX0sCit7ImN2dC5wdy5wcyIsICJELFMiLAkweDQ2YzAwMDI0LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJTTNECX0sCit7ImRhYnMiLCAgICAiZCx2IiwJMCwgICAgKGludCkgTV9EQUJTLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRhZGQiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJjLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMwl9LAoreyJkYWRkIiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREX0ksCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZGFkZGkiLCAgICJ0LHIsaiIsCTB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJCTAsCQlJMwl9LAoreyJkYWRkaXUiLCAgInQscixqIiwJMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9zLAkJMCwJCUkzCX0sCit7ImRhZGR1IiwgICAiZCx2LHQiLAkweDAwMDAwMDJkLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMwl9LAoreyJkYWRkdSIsICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREVV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRicmVhayIsICAiIiwJCTB4NzAwMDAwM2YsIDB4ZmZmZmZmZmYsCTAsCQkJMCwJCU41CX0sCit7ImRjbG8iLCAgICAiVSxzIiwgICAgICAweDcwMDAwMDI1LCAweGZjMDAwN2ZmLCBSRF9zfFdSX2R8V1JfdCwgCTAsCQlJNjR8TjU1IH0sCit7ImRjbHoiLCAgICAiVSxzIiwgICAgICAweDcwMDAwMDI0LCAweGZjMDAwN2ZmLCBSRF9zfFdSX2R8V1JfdCwgCTAsCQlJNjR8TjU1IH0sCisvKiBkY3RyIGFuZCBkY3R3IGFyZSB1c2VkIG9uIHRoZSByNTAwMC4gICovCit7ImRjdHIiLCAgICAibyhiKSIsCTB4YmMwNTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCQkJMCwJCUkzCX0sCit7ImRjdHciLCAgICAibyhiKSIsCTB4YmMwOTAwMDAsIDB4ZmMxZjAwMDAsIFJEX2IsCQkJMCwJCUkzCX0sCit7ImRlcmV0IiwgICAiIiwgICAgICAgICAweDQyMDAwMDFmLCAweGZmZmZmZmZmLCAwLCAJCQkwLAkJSTMyfEcyCX0sCit7ImRleHQiLCAgICAidCxyLEksK0kiLAkwLCAgICAoaW50KSBNX0RFWFQsCUlOU05fTUFDUk8sCQkwLAkJSTY1CX0sCit7ImRleHQiLCAgICAidCxyLCtBLCtDIiwgMHg3YzAwMDAwMywgMHhmYzAwMDAzZiwgV1JfdHxSRF9zLCAgICAJCTAsCQlJNjUJfSwKK3siZGV4dG0iLCAgICJ0LHIsK0EsK0ciLCAweDdjMDAwMDAxLCAweGZjMDAwMDNmLCBXUl90fFJEX3MsICAgIAkJMCwJCUk2NQl9LAoreyJkZXh0dSIsICAgInQsciwrRSwrSCIsIDB4N2MwMDAwMDIsIDB4ZmMwMDAwM2YsIFdSX3R8UkRfcywgICAgCQkwLAkJSTY1CX0sCisvKiBGb3IgZGRpdiwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLworeyJkZGl2IiwgICAgInoscyx0IiwgICAgMHgwMDAwMDAxZSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sICAgICAgMCwJCUkzICAgICAgfSwKK3siZGRpdiIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVl8zLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRkaXYiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RESVZfM0ksCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKKy8qIEZvciBkZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLworeyJkZGl2dSIsICAgInoscyx0IiwgICAgMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sICAgICAgMCwJCUkzICAgICAgfSwKK3siZGRpdnUiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRERJVlVfMywJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkZGl2dSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWVV8zSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkaSIsICAgICAgIiIsCQkweDQxNjA2MDAwLCAweGZmZmZmZmZmLAlXUl90fFdSX0MwLAkJMCwJCUkzMwl9LAoreyJkaSIsICAgICAgInQiLAkweDQxNjA2MDAwLCAweGZmZTBmZmZmLAlXUl90fFdSX0MwLAkJMCwJCUkzMwl9LAoreyJkaW5zIiwgICAgInQscixJLCtJIiwJMCwgICAgKGludCkgTV9ESU5TLAlJTlNOX01BQ1JPLAkJMCwJCUk2NQl9LAoreyJkaW5zIiwgICAgInQsciwrQSwrQiIsIDB4N2MwMDAwMDcsIDB4ZmMwMDAwM2YsIFdSX3R8UkRfcywgICAgCQkwLAkJSTY1CX0sCit7ImRpbnNtIiwgICAidCxyLCtBLCtGIiwgMHg3YzAwMDAwNSwgMHhmYzAwMDAzZiwgV1JfdHxSRF9zLCAgICAJCTAsCQlJNjUJfSwKK3siZGluc3UiLCAgICJ0LHIsK0UsK0YiLCAweDdjMDAwMDA2LCAweGZjMDAwMDNmLCBXUl90fFJEX3MsICAgIAkJMCwJCUk2NQl9LAorLyogVGhlIE1JUFMgYXNzZW1ibGVyIHRyZWF0cyB0aGUgZGl2IG9wY29kZSB3aXRoIHR3byBvcGVyYW5kcyBhcworICAgdGhvdWdoIHRoZSBmaXJzdCBvcGVyYW5kIGFwcGVhcmVkIHR3aWNlICh0aGUgZmlyc3Qgb3BlcmFuZCBpcyBib3RoCisgICBhIHNvdXJjZSBhbmQgYSBkZXN0aW5hdGlvbikuICBUbyBnZXQgdGhlIGRpdiBtYWNoaW5lIGluc3RydWN0aW9uLAorICAgeW91IG11c3QgdXNlIGFuIGV4cGxpY2l0IGRlc3RpbmF0aW9uIG9mICQwLiAgKi8KK3siZGl2IiwgICAgICJ6LHMsdCIsICAgIDB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgIDAsCQlJMSAgICAgIH0sCit7ImRpdiIsICAgICAieix0IiwgICAgICAweDAwMDAwMDFhLCAweGZmZTBmZmZmLCBSRF9zfFJEX3R8V1JfSElMTywgICAgICAwLAkJSTEgICAgICB9LAoreyJkaXYiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZfMywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJkaXYiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZfM0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siZGl2LmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJMQl9LAoreyJkaXYucyIsICAgIkQsVixUIiwJMHg0NjAwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJMCwJCUkxCX0sCit7ImRpdi5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDAzLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJU0IxCX0sCisvKiBGb3IgZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLworeyJkaXZ1IiwgICAgInoscyx0IiwgICAgMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sICAgICAgMCwJCUkxICAgICAgfSwKK3siZGl2dSIsICAgICJ6LHQiLCAgICAgIDB4MDAwMDAwMWIsIDB4ZmZlMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgIDAsCQlJMSAgICAgIH0sCit7ImRpdnUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RJVlVfMywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJkaXZ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZVXzNJLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImRsYSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9ETEFfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZGxjYSIsICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0RMQ0FfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZGxpIiwgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQkJMCwJCUkzCX0sIC8qIGFkZGl1ICovCit7ImRsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCQkwLAkJSTMJfSwgLyogb3JpICovCit7ImRsaSIsICAgICAidCxJIiwJMCwgICAgKGludCkgTV9ETEksCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZG1hY2MiLCAgICJkLHMsdCIsCTB4MDAwMDAwMjksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9MT3xXUl9kLAkwLAkJTjQxMgl9LAoreyJkbWFjY2hpIiwgImQscyx0IiwJMHgwMDAwMDIyOSwgMHhmYzAwMDdmZiwgUkRfc3xSRF90fFdSX0xPfFdSX2QsCTAsCQlONDEyCX0sCit7ImRtYWNjaGlzIiwgImQscyx0IiwJMHgwMDAwMDYyOSwgMHhmYzAwMDdmZiwgUkRfc3xSRF90fFdSX0xPfFdSX2QsCTAsCQlONDEyCX0sCit7ImRtYWNjaGl1IiwgImQscyx0IiwJMHgwMDAwMDI2OSwgMHhmYzAwMDdmZiwgUkRfc3xSRF90fFdSX0xPfFdSX2QsCTAsCQlONDEyCX0sCit7ImRtYWNjaGl1cyIsICJkLHMsdCIsCTB4MDAwMDA2NjksIDB4ZmMwMDA3ZmYsIFJEX3N8UkRfdHxXUl9MT3xXUl9kLAkwLAkJTjQxMgl9LAoreyJkbWFjY3MiLCAgImQscyx0IiwJMHgwMDAwMDQyOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0xPfFdSX2QsCTAsCQlONDEyCX0sCit7ImRtYWNjdSIsICAiZCxzLHQiLAkweDAwMDAwMDY5LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfTE98V1JfZCwJMCwJCU40MTIJfSwKK3siZG1hY2N1cyIsICJkLHMsdCIsCTB4MDAwMDA0NjksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9MT3xXUl9kLAkwLAkJTjQxMgl9LAoreyJkbWFkZDE2IiwgInMsdCIsICAgICAgMHgwMDAwMDAyOSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fE1PRF9MTywgICAgICAgMCwJCU40MTEgICAgfSwKK3siZG1mYzAiLCAgICJ0LEciLAkweDQwMjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9DMCwJCTAsCQlJMwl9LAoreyJkbWZjMCIsICAgInQsK0QiLCAgICAgMHg0MDIwMDAwMCwgMHhmZmUwMDdmOCwgTENEfFdSX3R8UkRfQzAsIAkwLAkJSTY0ICAgICB9LAoreyJkbWZjMCIsICAgInQsRyxIIiwgICAgMHg0MDIwMDAwMCwgMHhmZmUwMDdmOCwgTENEfFdSX3R8UkRfQzAsIAkwLAkJSTY0ICAgICB9LAoreyJkbXQiLCAgICAgIiIsCQkweDQxNjAwYmMxLCAweGZmZmZmZmZmLCBUUkFQLAkJCTAsCQlNVDMyCX0sCit7ImRtdCIsICAgICAidCIsCTB4NDE2MDBiYzEsIDB4ZmZlMGZmZmYsIFRSQVB8V1JfdCwJCTAsCQlNVDMyCX0sCit7ImRtdGMwIiwgICAidCxHIiwJMHg0MGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCTAsCQlJMwl9LAoreyJkbXRjMCIsICAgInQsK0QiLCAgICAgMHg0MGEwMDAwMCwgMHhmZmUwMDdmOCwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsICAgMCwJCUk2NCAgICAgfSwKK3siZG10YzAiLCAgICJ0LEcsSCIsICAgIDB4NDBhMDAwMDAsIDB4ZmZlMDA3ZjgsIENPRHxSRF90fFdSX0MwfFdSX0NDLCAgIDAsCQlJNjQgICAgIH0sCit7ImRtZmMxIiwgICAidCxTIiwJMHg0NDIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9ELAkwLAkJSTMJfSwKK3siZG1mYzEiLCAgICJ0LEciLCAgICAgIDB4NDQyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfRCwgICAgIDAsCQlJMyAgICAgIH0sCit7ImRtdGMxIiwgICAidCxTIiwJMHg0NGEwMDAwMCwgMHhmZmUwMDdmZiwgQ09EfFJEX3R8V1JfU3xGUF9ELAkwLAkJSTMJfSwKK3siZG10YzEiLCAgICJ0LEciLCAgICAgIDB4NDRhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfRCwgICAgIDAsCQlJMyAgICAgIH0sCisvKiBkbWZjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBkbXRjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBkbWZjMyBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBkbXRjMyBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCit7ImRtdWwiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUwsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZG11bCIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRtdWxvIiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RNVUxPLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRtdWxvIiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPX0ksCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZG11bG91IiwgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE9VLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRtdWxvdSIsICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RNVUxPVV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRtdWx0IiwgICAicyx0IiwgICAgICAweDAwMDAwMDFjLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSElMTywgICAgICAwLAkJSTMJfSwKK3siZG11bHR1IiwgICJzLHQiLCAgICAgIDB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgIDAsCQlJMwl9LAoreyJkbmVnIiwgICAgImQsdyIsCTB4MDAwMDAwMmUsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJCTAsCQlJMwl9LCAvKiBkc3ViIDAgKi8KK3siZG5lZ3UiLCAgICJkLHciLAkweDAwMDAwMDJmLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCQkwLAkJSTMJfSwgLyogZHN1YnUgMCovCit7ImRyZW0iLCAgICAieixzLHQiLCAgICAweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSElMTywgICAgICAwLAkJSTMgICAgICB9LAoreyJkcmVtIiwgICAgImQsdix0IiwJMywgICAgKGludCkgTV9EUkVNXzMsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3siZHJlbSIsICAgICJkLHYsSSIsCTMsICAgIChpbnQpIE1fRFJFTV8zSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkcmVtdSIsICAgInoscyx0IiwgICAgMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sICAgICAgMCwJCUkzICAgICAgfSwKK3siZHJlbXUiLCAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTVVfMywJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkcmVtdSIsICAgImQsdixJIiwJMywgICAgKGludCkgTV9EUkVNVV8zSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkcmV0IiwgICAgIiIsCQkweDcwMDAwMDNlLCAweGZmZmZmZmZmLAkwLAkJCTAsCQlONQl9LAoreyJkcm9sIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9EUk9MLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRyb2wiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RST0xfSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkcm9yIiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9EUk9SLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7ImRyb3IiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RST1JfSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkcm9yIiwgICAgImQsdyw8IiwJMHgwMDIwMDAzYSwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAkJMCwJCU41fEk2NQl9LAoreyJkcm9ydiIsICAgImQsdCxzIiwJMHgwMDAwMDA1NiwgMHhmYzAwMDdmZiwJUkRfdHxSRF9zfFdSX2QsCQkwLAkJTjV8STY1CX0sCit7ImRyb3IzMiIsICAiZCx3LDwiLAkweDAwMjAwMDNlLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCQkwLAkJTjV8STY1CX0sCit7ImRyb3RsIiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RST0wsCUlOU05fTUFDUk8sCQkwLAkJSTY1CX0sCit7ImRyb3RsIiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RST0xfSSwJSU5TTl9NQUNSTywJCTAsCQlJNjUJfSwKK3siZHJvdHIiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRFJPUiwJSU5TTl9NQUNSTywJCTAsCQlJNjUJfSwKK3siZHJvdHIiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFJPUl9JLAlJTlNOX01BQ1JPLAkJMCwJCUk2NQl9LAoreyJkcm90cnYiLCAgImQsdCxzIiwJMHgwMDAwMDA1NiwgMHhmYzAwMDdmZiwJUkRfdHxSRF9zfFdSX2QsCQkwLAkJSTY1CX0sCit7ImRyb3RyMzIiLCAiZCx3LDwiLAkweDAwMjAwMDNlLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCQkwLAkJSTY1CX0sCit7ImRzYmgiLCAgICAiZCx3IiwJMHg3YzAwMDBhNCwgMHhmZmUwMDdmZiwJV1JfZHxSRF90LAkJMCwJCUk2NQl9LAoreyJkc2hkIiwgICAgImQsdyIsCTB4N2MwMDAxNjQsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJCTAsCQlJNjUJfSwKK3siZHNsbHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sCit7ImRzbGwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHNsbCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sIC8qIGRzbGx2ICovCit7ImRzbGwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNjLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwgLyogZHNsbDMyICovCit7ImRzbGwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDM4LCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHNyYXYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sCit7ImRzcmEzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHNyYSIsICAgICJkLHcscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sIC8qIGRzcmF2ICovCit7ImRzcmEiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwgLyogZHNyYTMyICovCit7ImRzcmEiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNiLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHNybHYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sCit7ImRzcmwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHNybCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkzCX0sIC8qIGRzcmx2ICovCit7ImRzcmwiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCQkwLAkJSTMJfSwgLyogZHNybDMyICovCit7ImRzcmwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNhLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCQkwLAkJSTMJfSwKK3siZHN1YiIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmUsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzCX0sCit7ImRzdWIiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJfSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkc3VidSIsICAgImQsdix0IiwJMHgwMDAwMDAyZiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMJfSwKK3siZHN1YnUiLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQlVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJkdnBlIiwgICAgIiIsCQkweDQxNjAwMDAxLCAweGZmZmZmZmZmLCBUUkFQLAkJCTAsCQlNVDMyCX0sCit7ImR2cGUiLCAgICAidCIsCTB4NDE2MDAwMDEsIDB4ZmZlMGZmZmYsIFRSQVB8V1JfdCwJCTAsCQlNVDMyCX0sCit7ImVpIiwgICAgICAiIiwJCTB4NDE2MDYwMjAsIDB4ZmZmZmZmZmYsCVdSX3R8V1JfQzAsCQkwLAkJSTMzCX0sCit7ImVpIiwgICAgICAidCIsCTB4NDE2MDYwMjAsIDB4ZmZlMGZmZmYsCVdSX3R8V1JfQzAsCQkwLAkJSTMzCX0sCit7ImVtdCIsICAgICAiIiwJCTB4NDE2MDBiZTEsIDB4ZmZmZmZmZmYsIFRSQVAsCQkJMCwJCU1UMzIJfSwKK3siZW10IiwgICAgICJ0IiwJMHg0MTYwMGJlMSwgMHhmZmUwZmZmZiwgVFJBUHxXUl90LAkJMCwJCU1UMzIJfSwKK3siZXJldCIsICAgICIiLCAgICAgICAgIDB4NDIwMDAwMTgsIDB4ZmZmZmZmZmYsIDAsICAgICAgCQkwLAkJSTN8STMyCX0sCit7ImV2cGUiLCAgICAiIiwJCTB4NDE2MDAwMjEsIDB4ZmZmZmZmZmYsIFRSQVAsCQkJMCwJCU1UMzIJfSwKK3siZXZwZSIsICAgICJ0IiwJMHg0MTYwMDAyMSwgMHhmZmUwZmZmZiwgVFJBUHxXUl90LAkJMCwJCU1UMzIJfSwKK3siZXh0IiwgICAgICJ0LHIsK0EsK0MiLCAweDdjMDAwMDAwLCAweGZjMDAwMDNmLCBXUl90fFJEX3MsICAgIAkJMCwJCUkzMwl9LAoreyJmbG9vci5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTN8STMzCX0sCit7ImZsb29yLmwucyIsICJELFMiLAkweDQ2MDAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTN8STMzCX0sCit7ImZsb29yLncuZCIsICJELFMiLAkweDQ2MjAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTIJfSwKK3siZmxvb3Iudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGYsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAkJMCwJCUkyCX0sCit7ImhpYmVybmF0ZSIsIiIsICAgICAgICAweDQyMDAwMDIzLCAweGZmZmZmZmZmLAkwLCAJCQkwLAkJVjEJfSwKK3siaW5zIiwgICAgICJ0LHIsK0EsK0IiLCAweDdjMDAwMDA0LCAweGZjMDAwMDNmLCBXUl90fFJEX3MsICAgIAkJMCwJCUkzMwl9LAoreyJqciIsICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJCTAsCQlJMQl9LAorLyoganIuaGIgaXMgb2ZmaWNpYWxseSBNSVBTezMyLDY0fVIyLCBidXQgaXQgd29ya3Mgb24gUjEgYXMganIgd2l0aAorICAgdGhlIHNhbWUgaGF6YXJkIGJhcnJpZXIgZWZmZWN0LiAgKi8KK3sianIuaGIiLCAgICJzIiwJMHgwMDAwMDQwOCwgMHhmYzFmZmZmZiwJVUJEfFJEX3MsCQkwLAkJSTMyCX0sCit7ImoiLCAgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAkJMCwJCUkxCX0sIC8qIGpyICovCisvKiBTVlI0IFBJQyBjb2RlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGosIHNvIGl0IG11c3QgYmUgYQorICAgbWFjcm8uICAqLworeyJqIiwJICAgICJhIiwJMCwgICAgIChpbnQpIE1fSl9BLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCisvKiBUaGlzIGZvcm0gb2YgaiBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCisgICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKKyAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KK3siaiIsICAgICAgICJhIiwJMHgwODAwMDAwMCwgMHhmYzAwMDAwMCwJVUJELAkJCTAsCQlJMQl9LAoreyJqYWxyIiwgICAgInMiLAkweDAwMDBmODA5LCAweGZjMWZmZmZmLAlVQkR8UkRfc3xXUl9kLAkJMCwJCUkxCX0sCit7ImphbHIiLCAgICAiZCxzIiwJMHgwMDAwMDAwOSwgMHhmYzFmMDdmZiwJVUJEfFJEX3N8V1JfZCwJCTAsCQlJMQl9LAorLyogamFsci5oYiBpcyBvZmZpY2lhbGx5IE1JUFN7MzIsNjR9UjIsIGJ1dCBpdCB3b3JrcyBvbiBSMSBhcyBqYWxyCisgICB3aXRoIHRoZSBzYW1lIGhhemFyZCBiYXJyaWVyIGVmZmVjdC4gICovCit7ImphbHIuaGIiLCAicyIsCTB4MDAwMGZjMDksIDB4ZmMxZmZmZmYsCVVCRHxSRF9zfFdSX2QsCQkwLAkJSTMyCX0sCit7ImphbHIuaGIiLCAiZCxzIiwJMHgwMDAwMDQwOSwgMHhmYzFmMDdmZiwJVUJEfFJEX3N8V1JfZCwJCTAsCQlJMzIJfSwKKy8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3IgamFsLCBzbyBpdCBtdXN0IGJlIGEKKyAgIG1hY3JvLiAgKi8KK3siamFsIiwgICAgICJkLHMiLAkwLCAgICAgKGludCkgTV9KQUxfMiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJqYWwiLCAgICAgInMiLAkwLCAgICAgKGludCkgTV9KQUxfMSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJqYWwiLCAgICAgImEiLAkwLCAgICAgKGludCkgTV9KQUxfQSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAorLyogVGhpcyBmb3JtIG9mIGphbCBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCisgICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKKyAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KK3siamFsIiwgICAgICJhIiwJMHgwYzAwMDAwMCwgMHhmYzAwMDAwMCwJVUJEfFdSXzMxLAkJMCwJCUkxCX0sCit7ImphbHgiLCAgICAiYSIsCTB4NzQwMDAwMDAsIDB4ZmMwMDAwMDAsIFVCRHxXUl8zMSwJCTAsCQlJMTYgICAgIH0sCit7ImxhIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQV9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJsYiIsICAgICAgInQsbyhiKSIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCQkwLAkJSTEJfSwKK3sibGIiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xCX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImxidSIsICAgICAidCxvKGIpIiwJMHg5MDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJCTAsCQlJMQl9LAoreyJsYnUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJVX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImxjYSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQ0FfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGQiLAkgICAgInQsbyhiKSIsICAgMHhkYzAwMDAwMCwgMHhmYzAwMDAwMCwgV1JfdHxSRF9iLAkJMCwJCUkzCX0sCit7ImxkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9MRF9PQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJsZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGRjMSIsICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCTAsCQlJMgl9LAoreyJsZGMxIiwgICAgIkUsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJMCwJCUkyCX0sCit7ImxkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkyCX0sCit7ImxkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkyCX0sCit7ImwuZCIsICAgICAiVCxvKGIpIiwJMHhkNDAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfVHxGUF9ELAkwLAkJSTIJfSwgLyogbGRjMSAqLworeyJsLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fTF9ET0IsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibC5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xfREFCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImxkYzIiLCAgICAiRSxvKGIpIiwJMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCQkwLAkJSTIJfSwKK3sibGRjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xEQzJfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sibGRjMyIsICAgICJFLG8oYikiLAkweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9DQywJCTAsCQlJMgl9LAoreyJsZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDM19BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJsZGwiLAkgICAgInQsbyhiKSIsCTB4NjgwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCQkwLAkJSTMJfSwKK3sibGRsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xETF9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJsZHIiLAkgICAgInQsbyhiKSIsCTB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCQkwLAkJSTMJfSwKK3sibGRyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEUl9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJsZHhjMSIsICAgIkQsdChiKSIsCTB4NGMwMDAwMDEsIDB4ZmMwMGY4M2YsIExERHxXUl9EfFJEX3R8UkRfYnxGUF9ELCAwLAkJSTR8STMzCX0sCit7ImxoIiwgICAgICAidCxvKGIpIiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJCTAsCQlJMQl9LAoreyJsaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGh1IiwgICAgICJ0LG8oYikiLAkweDk0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAkJMCwJCUkxCX0sCit7ImxodSIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSFVfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKKy8qIGxpIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLworeyJsaS5kIiwgICAgInQsRiIsCTAsICAgIChpbnQpIE1fTElfRCwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJsaS5kIiwgICAgIlQsTCIsCTAsICAgIChpbnQpIE1fTElfREQsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGkucyIsICAgICJ0LGYiLAkwLCAgICAoaW50KSBNX0xJX1MsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGkucyIsICAgICJULGwiLAkwLCAgICAoaW50KSBNX0xJX1NTLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImxsIiwJICAgICJ0LG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAkJMCwJCUkyCX0sCit7ImxsIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xMX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkyCX0sCit7ImxsZCIsCSAgICAidCxvKGIpIiwJMHhkMDAwMDAwMCwgMHhmYzAwMDAwMCwgTEREfFJEX2J8V1JfdCwJCTAsCQlJMwl9LAoreyJsbGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExEX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7Imx1aSIsICAgICAidCx1IiwJMHgzYzAwMDAwMCwgMHhmZmUwMDAwMCwJV1JfdCwJCQkwLAkJSTEJfSwKK3sibHV4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDA1LCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2J8RlBfRCwgMCwJCUk1fEkzM3xONTV9LAoreyJsdyIsICAgICAgInQsbyhiKSIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCQkwLAkJSTEJfSwKK3sibHciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Imx3YzAiLCAgICAiRSxvKGIpIiwJMHhjMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCQkwLAkJSTEJfSwKK3sibHdjMCIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzBfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibHdjMSIsICAgICJULG8oYikiLAkweGM0MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9UfEZQX1MsCTAsCQlJMQl9LAoreyJsd2MxIiwgICAgIkUsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJMCwJCUkxCX0sCit7Imx3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Imx3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImwucyIsICAgICAiVCxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAkwLAkJSTEJfSwgLyogbHdjMSAqLworeyJsLnMiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJsd2MyIiwgICAgIkUsbyhiKSIsCTB4YzgwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX0NDLAkJMCwJCUkxCX0sCit7Imx3YzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MyX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Imx3YzMiLCAgICAiRSxvKGIpIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCQkwLAkJSTEJfSwKK3sibHdjMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzNfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibHdsIiwgICAgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAkJMCwJCUkxCX0sCit7Imx3bCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0xfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibGNhY2hlIiwgICJ0LG8oYikiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAkJMCwJCUkyCX0sIC8qIHNhbWUgKi8KK3sibGNhY2hlIiwgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXTF9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LCAvKiBhcyBsd2wgKi8KK3sibHdyIiwgICAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAkJMCwJCUkxCX0sCit7Imx3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV1JfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siZmx1c2giLCAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAkJMCwJCUkyCX0sIC8qIHNhbWUgKi8KK3siZmx1c2giLCAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LCAvKiBhcyBsd3IgKi8KK3siZm9yayIsICAgICJkLHMsdCIsCTB4N2MwMDAwMDgsIDB4ZmMwMDA3ZmYsIFRSQVB8V1JfZHxSRF9zfFJEX3QsCTAsCQlNVDMyCX0sCit7Imx3dSIsICAgICAidCxvKGIpIiwJMHg5YzAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJCTAsCQlJMwl9LAoreyJsd3UiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdVX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7Imx3eGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMCwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9ifEZQX0QsIDAsCQlJNHxJMzMJfSwKK3sibHd4cyIsICAgICJkLHQoYikiLAkweDcwMDAwMDg4LCAweGZjMDAwN2ZmLAlMRER8UkRfYnxSRF90fFdSX2QsCTAsCQlTTVQJfSwKK3sibWFjYyIsICAgICJkLHMsdCIsCTB4MDAwMDAwMjgsIDB4ZmMwMDA3ZmYsIFJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsIDAsCQlONDEyICAgIH0sCit7Im1hY2MiLCAgICAiZCxzLHQiLAkweDAwMDAwMTU4LCAweGZjMDAwN2ZmLCBSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUgICAgICB9LAoreyJtYWNjcyIsICAgImQscyx0IiwJMHgwMDAwMDQyOCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwgMCwJCU40MTIgICAgfSwKK3sibWFjY2hpIiwgICJkLHMsdCIsCTB4MDAwMDAyMjgsIDB4ZmMwMDA3ZmYsIFJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsIDAsCQlONDEyICAgIH0sCit7Im1hY2NoaSIsICAiZCxzLHQiLAkweDAwMDAwMzU4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUgICAgICB9LAoreyJtYWNjaGlzIiwgImQscyx0IiwJMHgwMDAwMDYyOCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwgMCwJCU40MTIgICAgfSwKK3sibWFjY2hpdSIsICJkLHMsdCIsCTB4MDAwMDAyNjgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsIDAsCQlONDEyICAgIH0sCit7Im1hY2NoaXUiLCAiZCxzLHQiLAkweDAwMDAwMzU5LCAweGZjMDAwN2ZmLCBSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUgICAgICB9LAoreyJtYWNjaGl1cyIsImQscyx0IiwJMHgwMDAwMDY2OCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwgMCwJCU40MTIgICAgfSwKK3sibWFjY3UiLCAgICJkLHMsdCIsCTB4MDAwMDAwNjgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsIDAsCQlONDEyICAgIH0sCit7Im1hY2N1IiwgICAiZCxzLHQiLAkweDAwMDAwMTU5LCAweGZjMDAwN2ZmLCBSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUgICAgICB9LAoreyJtYWNjdXMiLCAgImQscyx0IiwJMHgwMDAwMDQ2OCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwgMCwJCU40MTIgICAgfSwKK3sibWFkIiwgICAgICJzLHQiLCAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxNT0RfSElMTywgICAgIDAsCQlQMyAgICAgIH0sCit7Im1hZHUiLCAgICAicyx0IiwgICAgICAweDcwMDAwMDAxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8TU9EX0hJTE8sICAgICAwLAkJUDMgICAgICB9LAoreyJtYWRkLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDIxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsICAgIDAsCQlJNHxJMzMJfSwKK3sibWFkZC5zIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLCAgICAwLAkJSTR8STMzCX0sCit7Im1hZGQucHMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMjYsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwgICAgMCwJCUk1fEkzMwl9LAoreyJtYWRkIiwgICAgInMsdCIsICAgICAgMHgwMDAwMDAxYywgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sICAgICAgICAgICAwLAkJTDEJfSwKK3sibWFkZCIsICAgICJzLHQiLCAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxNT0RfSElMTywgICAgICAgICAgMCwJCUkzMnxONTUJfSwKK3sibWFkZCIsICAgICJzLHQiLCAgICAgIDB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPfElTX00sICAgICAgMCwJCUcxCX0sCit7Im1hZGQiLCAgICAiNyxzLHQiLAkweDcwMDAwMDAwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsICAgICAgICAgICAgIDAsICAgICAgICAgRDMzCX0sCit7Im1hZGQiLCAgICAiZCxzLHQiLCAgICAweDcwMDAwMDAwLCAweGZjMDAwN2ZmLCBSRF9zfFJEX3R8V1JfSElMT3xXUl9kfElTX00sIDAsCQlHMQl9LAoreyJtYWRkcCIsICAgInMsdCIsICAgICAgMHg3MDAwMDQ0MSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fE1PRF9ISUxPLAkgICAgIDAsCQlTTVQJfSwKK3sibWFkZHUiLCAgICJzLHQiLCAgICAgIDB4MDAwMDAwMWQsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgICAgICAgMCwJCUwxCX0sCit7Im1hZGR1IiwgICAicyx0IiwgICAgICAweDcwMDAwMDAxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8TU9EX0hJTE8sICAgICAgICAgIDAsCQlJMzJ8TjU1CX0sCit7Im1hZGR1IiwgICAicyx0IiwgICAgICAweDcwMDAwMDAxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSElMT3xJU19NLCAgICAgIDAsCQlHMQl9LAoreyJtYWRkdSIsICAgIjcscyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LCAgICAgICAgICAgICAwLCAgICAgICAgIEQzMwl9LAoreyJtYWRkdSIsICAgImQscyx0IiwgICAgMHg3MDAwMDAwMSwgMHhmYzAwMDdmZiwgUkRfc3xSRF90fFdSX0hJTE98V1JfZHxJU19NLCAwLAkJRzEJfSwKK3sibWFkZDE2IiwgICJzLHQiLCAgICAgIDB4MDAwMDAwMjgsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxNT0RfSElMTywJMCwJCU40MTEgICAgfSwKK3sibWF4Lm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMDcsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sibWF4Lm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMDcsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJtYXgub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAwNywgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Im1heC5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDA3LCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sibWF4LnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMDcsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJtZnBjIiwgICAgInQsUCIsCTB4NDAwMGM4MDEsIDB4ZmZlMGZmYzEsCUxDRHxXUl90fFJEX0MwLAkJMCwJCU0xfE41CX0sCit7Im1mcHMiLCAgICAidCxQIiwJMHg0MDAwYzgwMCwgMHhmZmUwZmZjMSwJTENEfFdSX3R8UkRfQzAsCQkwLAkJTTF8TjUJfSwKK3sibWZ0YWN4IiwgICJkIiwJMHg0MTAyMDAyMSwgMHhmZmZmMDdmZiwgVFJBUHxXUl9kfFJEX2EsCQkwLAkJTVQzMgl9LAoreyJtZnRhY3giLCAgImQsKiIsCTB4NDEwMjAwMjEsIDB4ZmZmMzA3ZmYsIFRSQVB8V1JfZHxSRF9hLAkJMCwJCU1UMzIJfSwKK3sibWZ0YzAiLCAgICJkLCt0IiwJMHg0MTAwMDAwMCwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9DMCwJMCwJCU1UMzIJfSwKK3sibWZ0YzAiLCAgICJkLCtUIiwJMHg0MTAwMDAwMCwgMHhmZmUwMDdmOCwgVFJBUHxMQ0R8V1JfZHxSRF9DMCwJMCwJCU1UMzIJfSwKK3sibWZ0YzAiLCAgICJkLEUsSCIsCTB4NDEwMDAwMDAsIDB4ZmZlMDA3ZjgsIFRSQVB8TENEfFdSX2R8UkRfQzAsCTAsCQlNVDMyCX0sCit7Im1mdGMxIiwgICAiZCxUIiwJMHg0MTAwMDAyMiwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9UfEZQX1MsIDAsCQlNVDMyCX0sCit7Im1mdGMxIiwgICAiZCxFIiwJMHg0MTAwMDAyMiwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9UfEZQX1MsIDAsCQlNVDMyCX0sCit7Im1mdGMyIiwgICAiZCxFIiwJMHg0MTAwMDAyNCwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9DMiwJMCwJCU1UMzIJfSwKK3sibWZ0ZHNwIiwgICJkIiwJMHg0MTEwMDAyMSwgMHhmZmZmMDdmZiwgVFJBUHxXUl9kLAkJMCwJCU1UMzIJfSwKK3sibWZ0Z3ByIiwgICJkLHQiLAkweDQxMDAwMDIwLCAweGZmZTAwN2ZmLCBUUkFQfFdSX2R8UkRfdCwJCTAsCQlNVDMyCX0sCit7Im1mdGhjMSIsICAiZCxUIiwJMHg0MTAwMDAzMiwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9UfEZQX0QsIDAsCQlNVDMyCX0sCit7Im1mdGhjMSIsICAiZCxFIiwJMHg0MTAwMDAzMiwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9UfEZQX0QsIDAsCQlNVDMyCX0sCit7Im1mdGhjMiIsICAiZCxFIiwJMHg0MTAwMDAzNCwgMHhmZmUwMDdmZiwgVFJBUHxMQ0R8V1JfZHxSRF9DMiwJMCwJCU1UMzIJfSwKK3sibWZ0aGkiLCAgICJkIiwJMHg0MTAxMDAyMSwgMHhmZmZmMDdmZiwgVFJBUHxXUl9kfFJEX2EsCQkwLAkJTVQzMgl9LAoreyJtZnRoaSIsICAgImQsKiIsCTB4NDEwMTAwMjEsIDB4ZmZmMzA3ZmYsIFRSQVB8V1JfZHxSRF9hLAkJMCwJCU1UMzIJfSwKK3sibWZ0bG8iLCAgICJkIiwJMHg0MTAwMDAyMSwgMHhmZmZmMDdmZiwgVFJBUHxXUl9kfFJEX2EsCQkwLAkJTVQzMgl9LAoreyJtZnRsbyIsICAgImQsKiIsCTB4NDEwMDAwMjEsIDB4ZmZmMzA3ZmYsIFRSQVB8V1JfZHxSRF9hLAkJMCwJCU1UMzIJfSwKK3sibWZ0ciIsICAgICJkLHQsISxILCQiLCAweDQxMDAwMDAwLCAweGZmZTAwN2M4LCBUUkFQfFdSX2QsCQkwLAkJTVQzMgl9LAoreyJtZmMwIiwgICAgInQsRyIsCTB4NDAwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAkJMCwJCUkxCX0sCit7Im1mYzAiLCAgICAidCwrRCIsICAgICAweDQwMDAwMDAwLCAweGZmZTAwN2Y4LCBMQ0R8V1JfdHxSRF9DMCwgCTAsCQlJMzIgICAgIH0sCit7Im1mYzAiLCAgICAidCxHLEgiLCAgICAweDQwMDAwMDAwLCAweGZmZTAwN2Y4LCBMQ0R8V1JfdHxSRF9DMCwgCTAsCQlJMzIgICAgIH0sCit7Im1mYzEiLCAgICAidCxTIiwJMHg0NDAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfU3xGUF9TLAkwLAkJSTEJfSwKK3sibWZjMSIsICAgICJ0LEciLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCTAsCQlJMQl9LAoreyJtZmhjMSIsICAgInQsUyIsCTB4NDQ2MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfRCwJMCwJCUkzMwl9LAoreyJtZmhjMSIsICAgInQsRyIsCTB4NDQ2MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfRCwJMCwJCUkzMwl9LAorLyogbWZjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBtZmhjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBtZmMzIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KK3sibWZkciIsICAgICJ0LEciLAkweDcwMDAwMDNkLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMCwJCTAsCQlONSAgICAgIH0sCit7Im1maGkiLCAgICAiZCIsCTB4MDAwMDAwMTAsIDB4ZmZmZjA3ZmYsCVdSX2R8UkRfSEksCQkwLAkJSTEJfSwKK3sibWZoaSIsICAgICJkLDkiLAkweDAwMDAwMDEwLCAweGZmOWYwN2ZmLCBXUl9kfFJEX0hJLAkJMCwJCUQzMgl9LAoreyJtZmxvIiwgICAgImQiLAkweDAwMDAwMDEyLCAweGZmZmYwN2ZmLAlXUl9kfFJEX0xPLAkJMCwJCUkxCX0sCit7Im1mbG8iLCAgICAiZCw5IiwJMHgwMDAwMDAxMiwgMHhmZjlmMDdmZiwgV1JfZHxSRF9MTywJCTAsCQlEMzIJfSwKK3sibWZsaHh1IiwgICJkIiwJMHgwMDAwMDA1MiwgMHhmZmZmMDdmZiwJV1JfZHxNT0RfSElMTywJCTAsCQlTTVQJfSwKK3sibWluLm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMDYsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sibWluLm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMDYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJtaW4ub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAwNiwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Im1pbi5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDA2LCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sibWluLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMDYsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJtb3YuZCIsICAgIkQsUyIsCTB4NDYyMDAwMDYsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAkJMCwJCUkxCX0sCit7Im1vdi5zIiwgICAiRCxTIiwJMHg0NjAwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCQkwLAkJSTEJfSwKK3sibW92LnBzIiwgICJELFMiLAkweDQ2YzAwMDA2LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJCTAsCQlJNXxJMzMJfSwKK3sibW92ZiIsICAgICJkLHMsTiIsICAgIDB4MDAwMDAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQ3xGUF9TfEZQX0QsIDAsCQlJNHxJMzIgIH0sCit7Im1vdmYuZCIsICAiRCxTLE4iLCAgICAweDQ2MjAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwgICAwLAkJSTR8STMyCX0sCit7Im1vdmYubCIsICAiRCxTLE4iLAkweDQ2YTAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJtb3ZmLmwiLCAgIlgsWSxOIiwJMHg0NmEwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sibW92Zi5zIiwgICJELFMsTiIsICAgIDB4NDYwMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3sibW92Zi5wcyIsICJELFMsTiIsCTB4NDZjMDAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7Im1vdm4iLCAgICAiZCx2LHQiLCAgICAweDAwMDAwMDBiLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwgCTAsCQlJNHxJMzIJfSwKK3siZmZjIiwgICAgICJkLHYiLAkweDAwMDAwMDBiLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsCQkwLAkJTDEJfSwKK3sibW92bi5kIiwgICJELFMsdCIsICAgIDB4NDYyMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlJNHxJMzIJfSwKK3sibW92bi5sIiwgICJELFMsdCIsICAgIDB4NDZhMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlNWHxTQjEJfSwKK3sibW92bi5sIiwgICJYLFksdCIsICAgIDB4NDZhMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlNWHxTQjEJfSwKK3sibW92bi5zIiwgICJELFMsdCIsICAgIDB4NDYwMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsICAgIDAsCQlJNHxJMzIJfSwKK3sibW92bi5wcyIsICJELFMsdCIsICAgIDB4NDZjMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlJNXxJMzMJfSwKK3sibW92dCIsICAgICJkLHMsTiIsICAgIDB4MDAwMTAwMDEsIDB4ZmMwMzA3ZmYsIFdSX2R8UkRfc3xSRF9DQ3xGUF9TfEZQX0QsIDAsCQlJNHxJMzIJfSwKK3sibW92dC5kIiwgICJELFMsTiIsICAgIDB4NDYyMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELCAgIDAsCQlJNHxJMzIJfSwKK3sibW92dC5sIiwgICJELFMsTiIsICAgIDB4NDZhMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELCAgIDAsCQlNWHxTQjEJfSwKK3sibW92dC5sIiwgICJYLFksTiIsICAgIDB4NDZhMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELCAgIDAsCQlNWHxTQjEJfSwKK3sibW92dC5zIiwgICJELFMsTiIsICAgIDB4NDYwMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLCAgIDAsCQlJNHxJMzIJfSwKK3sibW92dC5wcyIsICJELFMsTiIsCTB4NDZjMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9ELAkwLAkJSTV8STMzCX0sCit7Im1vdnoiLCAgICAiZCx2LHQiLCAgICAweDAwMDAwMDBhLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwgCTAsCQlJNHxJMzIJfSwKK3siZmZzIiwgICAgICJkLHYiLAkweDAwMDAwMDBhLCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsCQkwLAkJTDEJfSwKK3sibW92ei5kIiwgICJELFMsdCIsICAgIDB4NDYyMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlJNHxJMzIJfSwKK3sibW92ei5sIiwgICJELFMsdCIsICAgIDB4NDZhMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlNWHxTQjEJfSwKK3sibW92ei5sIiwgICJYLFksdCIsICAgIDB4NDZhMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlNWHxTQjEJfSwKK3sibW92ei5zIiwgICJELFMsdCIsICAgIDB4NDYwMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsICAgIDAsCQlJNHxJMzIJfSwKK3sibW92ei5wcyIsICJELFMsdCIsICAgIDB4NDZjMDAwMTIsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX0QsICAgIDAsCQlJNXxJMzMJfSwKK3sibXNhYyIsICAgICJkLHMsdCIsCTB4MDAwMDAxZDgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsCTAsCQlONQl9LAoreyJtc2FjdSIsICAgImQscyx0IiwJMHgwMDAwMDFkOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwJMCwJCU41CX0sCit7Im1zYWNoaSIsICAiZCxzLHQiLAkweDAwMDAwM2Q4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUJfSwKK3sibXNhY2hpdSIsICJkLHMsdCIsCTB4MDAwMDAzZDksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsCTAsCQlONQl9LAorLyogbW92ZSBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCit7Im1zZ24ucWgiLCAiWCxZLFEiLAkweDc4MjAwMDAwLCAweGZjMjAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVgJfSwKK3sibXN1Yi5kIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELCAwLAkJSTR8STMzCX0sCit7Im1zdWIucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywgMCwJCUk0fEkzMwl9LAoreyJtc3ViLnBzIiwgIkQsUixTLFQiLAkweDRjMDAwMDJlLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsIDAsCQlJNXxJMzMJfSwKK3sibXN1YiIsICAgICJzLHQiLCAgICAgIDB4MDAwMDAwMWUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLAkwLAkJTDEgICAgCX0sCit7Im1zdWIiLCAgICAicyx0IiwgICAgICAweDcwMDAwMDA0LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8TU9EX0hJTE8sICAgICAwLAkJSTMyfE41NSB9LAoreyJtc3ViIiwgICAgIjcscyx0IiwJMHg3MDAwMDAwNCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LCAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJtc3VidSIsICAgInMsdCIsICAgICAgMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJTE8sCTAsCQlMMQl9LAoreyJtc3VidSIsICAgInMsdCIsICAgICAgMHg3MDAwMDAwNSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fE1PRF9ISUxPLCAgICAgMCwJCUkzMnxONTUJfSwKK3sibXN1YnUiLCAgICI3LHMsdCIsCTB4NzAwMDAwMDUsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sibXRwYyIsICAgICJ0LFAiLAkweDQwODBjODAxLCAweGZmZTBmZmMxLAlDT0R8UkRfdHxXUl9DMCwJCTAsCQlNMXxONQl9LAoreyJtdHBzIiwgICAgInQsUCIsCTB4NDA4MGM4MDAsIDB4ZmZlMGZmYzEsCUNPRHxSRF90fFdSX0MwLAkJMCwJCU0xfE41CX0sCit7Im10YzAiLCAgICAidCxHIiwJMHg0MDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzB8V1JfQ0MsCTAsCQlJMQl9LAoreyJtdGMwIiwgICAgInQsK0QiLCAgICAgMHg0MDgwMDAwMCwgMHhmZmUwMDdmOCwgQ09EfFJEX3R8V1JfQzB8V1JfQ0MsICAgMCwJCUkzMiAgICAgfSwKK3sibXRjMCIsICAgICJ0LEcsSCIsICAgIDB4NDA4MDAwMDAsIDB4ZmZlMDA3ZjgsIENPRHxSRF90fFdSX0MwfFdSX0NDLCAgIDAsCQlJMzIgICAgIH0sCit7Im10YzEiLCAgICAidCxTIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAkwLAkJSTEJfSwKK3sibXRjMSIsICAgICJ0LEciLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCTAsCQlJMQl9LAoreyJtdGhjMSIsICAgInQsUyIsCTB4NDRlMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfRCwJMCwJCUkzMwl9LAoreyJtdGhjMSIsICAgInQsRyIsCTB4NDRlMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX1N8RlBfRCwJMCwJCUkzMwl9LAorLyogbXRjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBtdGhjMiBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSB0YWJsZS4gICovCisvKiBtdGMzIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHRhYmxlLiAgKi8KK3sibXRkciIsICAgICJ0LEciLAkweDcwODAwMDNkLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMCwJCTAsCQlONQl9LAoreyJtdGhpIiwgICAgInMiLAkweDAwMDAwMDExLCAweGZjMWZmZmZmLAlSRF9zfFdSX0hJLAkJMCwJCUkxCX0sCit7Im10aGkiLCAgICAicyw3IiwJMHgwMDAwMDAxMSwgMHhmYzFmZTdmZiwgUkRfc3xXUl9ISSwJCTAsCQlEMzIJfSwKK3sibXRsbyIsICAgICJzIiwJMHgwMDAwMDAxMywgMHhmYzFmZmZmZiwJUkRfc3xXUl9MTywJCTAsCQlJMQl9LAoreyJtdGxvIiwgICAgInMsNyIsCTB4MDAwMDAwMTMsIDB4ZmMxZmU3ZmYsIFJEX3N8V1JfTE8sCQkwLAkJRDMyCX0sCit7Im10bGh4IiwgICAicyIsCTB4MDAwMDAwNTMsIDB4ZmMxZmZmZmYsCVJEX3N8TU9EX0hJTE8sCQkwLAkJU01UCX0sCit7Im10dGMwIiwgICAidCxHIiwJMHg0MTgwMDAwMCwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9DMHxXUl9DQywgMCwJCU1UMzIJfSwKK3sibXR0YzAiLCAgICJ0LCtEIiwJMHg0MTgwMDAwMCwgMHhmZmUwMDdmOCwgVFJBUHxDT0R8UkRfdHxXUl9DMHxXUl9DQywgMCwJCU1UMzIJfSwKK3sibXR0YzAiLCAgICJ0LEcsSCIsCTB4NDE4MDAwMDAsIDB4ZmZlMDA3ZjgsIFRSQVB8Q09EfFJEX3R8V1JfQzB8V1JfQ0MsIDAsCQlNVDMyCX0sCit7Im10dGMxIiwgICAidCxTIiwJMHg0MTgwMDAyMiwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9TfEZQX1MsIDAsCQlNVDMyCX0sCit7Im10dGMxIiwgICAidCxHIiwJMHg0MTgwMDAyMiwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9TfEZQX1MsIDAsCQlNVDMyCX0sCit7Im10dGMyIiwgICAidCxnIiwJMHg0MTgwMDAyNCwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9DMnxXUl9DQywgMCwJCU1UMzIJfSwKK3sibXR0YWN4IiwgICJ0IiwJMHg0MTgwMTAyMSwgMHhmZmUwZmZmZiwgVFJBUHxXUl9hfFJEX3QsCQkwLAkJTVQzMgl9LAoreyJtdHRhY3giLCAgInQsJiIsCTB4NDE4MDEwMjEsIDB4ZmZlMDlmZmYsIFRSQVB8V1JfYXxSRF90LAkJMCwJCU1UMzIJfSwKK3sibXR0ZHNwIiwgICJ0IiwJMHg0MTgwODAyMSwgMHhmZmUwZmZmZiwgVFJBUHxSRF90LAkJMCwJCU1UMzIJfSwKK3sibXR0Z3ByIiwgICJ0LGQiLAkweDQxODAwMDIwLCAweGZmZTAwN2ZmLCBUUkFQfFdSX2R8UkRfdCwJCTAsCQlNVDMyCX0sCit7Im10dGhjMSIsICAidCxTIiwJMHg0MTgwMDAzMiwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9TfEZQX0QsIDAsCQlNVDMyCX0sCit7Im10dGhjMSIsICAidCxHIiwJMHg0MTgwMDAzMiwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9TfEZQX0QsIDAsCQlNVDMyCX0sCit7Im10dGhjMiIsICAidCxnIiwJMHg0MTgwMDAzNCwgMHhmZmUwMDdmZiwgVFJBUHxDT0R8UkRfdHxXUl9DMnxXUl9DQywgMCwJCU1UMzIJfSwKK3sibXR0aGkiLCAgICJ0IiwJMHg0MTgwMDgyMSwgMHhmZmUwZmZmZiwgVFJBUHxXUl9hfFJEX3QsCQkwLAkJTVQzMgl9LAoreyJtdHRoaSIsICAgInQsJiIsCTB4NDE4MDA4MjEsIDB4ZmZlMDlmZmYsIFRSQVB8V1JfYXxSRF90LAkJMCwJCU1UMzIJfSwKK3sibXR0bG8iLCAgICJ0IiwJMHg0MTgwMDAyMSwgMHhmZmUwZmZmZiwgVFJBUHxXUl9hfFJEX3QsCQkwLAkJTVQzMgl9LAoreyJtdHRsbyIsICAgInQsJiIsCTB4NDE4MDAwMjEsIDB4ZmZlMDlmZmYsIFRSQVB8V1JfYXxSRF90LAkJMCwJCU1UMzIJfSwKK3sibXR0ciIsICAgICJ0LGQsISxILCQiLCAweDQxODAwMDAwLCAweGZmZTAwN2M4LCBUUkFQfFJEX3QsCQkwLAkJTVQzMgl9LAoreyJtdWwuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCUkxCX0sCit7Im11bC5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAyLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAkwLAkJSTEJfSwKK3sibXVsLm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMzAsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sibXVsLm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMzAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJtdWwub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAzMCwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Im11bC5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDMwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sibXVsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3sibXVsLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMzAsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJtdWwiLCAgICAgImQsdix0IiwgICAgMHg3MDAwMDAwMiwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwJCUkzMnxQM3xONTV9LAoreyJtdWwiLCAgICAgImQscyx0IiwJMHgwMDAwMDA1OCwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwJMCwJCU41NAl9LAoreyJtdWwiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9NVUwsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibXVsIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibXVsYS5vYiIsICJZLFEiLAkweDc4MDAwMDMzLCAweGZjMjAwN2ZmLAlSRF9TfFJEX1R8RlBfRCwJCVdSX01BQ0MsCU1YfFNCMQl9LAoreyJtdWxhLm9iIiwgIlMsVCIsCTB4NGFjMDAwMzMsIDB4ZmZlMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJtdWxhLm9iIiwgIlMsVFtlXSIsCTB4NDgwMDAwMzMsIDB4ZmUyMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJtdWxhLm9iIiwgIlMsayIsCTB4NGJjMDAwMzMsIDB4ZmZlMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJtdWxhLnFoIiwgIlksUSIsCTB4NzgyMDAwMzMsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVgJfSwKK3sibXVsaGkiLCAgICJkLHMsdCIsCTB4MDAwMDAyNTgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsCTAsCQlONQl9LAoreyJtdWxoaXUiLCAgImQscyx0IiwJMHgwMDAwMDI1OSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwJMCwJCU41CX0sCit7Im11bGwub2IiLCAiWSxRIiwJMHg3ODAwMDQzMywgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsIAlXUl9NQUNDLAlNWHxTQjEJfSwKK3sibXVsbC5vYiIsICJTLFQiLAkweDRhYzAwNDMzLCAweGZmZTAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3sibXVsbC5vYiIsICJTLFRbZV0iLAkweDQ4MDAwNDMzLCAweGZlMjAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3sibXVsbC5vYiIsICJTLGsiLAkweDRiYzAwNDMzLCAweGZmZTAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3sibXVsbC5xaCIsICJZLFEiLAkweDc4MjAwNDMzLCAweGZjMjAwN2ZmLAlSRF9TfFJEX1R8RlBfRCwJCVdSX01BQ0MsCU1YCX0sCit7Im11bG8iLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE8sCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibXVsbyIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMT19JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Im11bG91IiwgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE9VLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7Im11bG91IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9VX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibXVsci5wcyIsICJELFMsVCIsCTB4NDZjMDAwMWEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNM0QJfSwKK3sibXVscyIsICAgICJkLHMsdCIsCTB4MDAwMDAwZDgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsCTAsCQlONQl9LAoreyJtdWxzdSIsICAgImQscyx0IiwJMHgwMDAwMDBkOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJTE98V1JfZCwJMCwJCU41CX0sCit7Im11bHNoaSIsICAiZCxzLHQiLAkweDAwMDAwMmQ4LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUJfSwKK3sibXVsc2hpdSIsICJkLHMsdCIsCTB4MDAwMDAyZDksIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISUxPfFdSX2QsCTAsCQlONQl9LAoreyJtdWxzLm9iIiwgIlksUSIsCTB4NzgwMDAwMzIsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7Im11bHMub2IiLCAiUyxUIiwJMHg0YWMwMDAzMiwgMHhmZmUwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7Im11bHMub2IiLCAiUyxUW2VdIiwJMHg0ODAwMDAzMiwgMHhmZTIwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7Im11bHMub2IiLCAiUyxrIiwJMHg0YmMwMDAzMiwgMHhmZmUwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7Im11bHMucWgiLCAiWSxRIiwJMHg3ODIwMDAzMiwgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsCQlXUl9NQUNDLAlNWAl9LAoreyJtdWxzbC5vYiIsICJZLFEiLAkweDc4MDAwNDMyLCAweGZjMjAwN2ZmLAlSRF9TfFJEX1R8RlBfRCwJCVdSX01BQ0MsCU1YfFNCMQl9LAoreyJtdWxzbC5vYiIsICJTLFQiLAkweDRhYzAwNDMyLCAweGZmZTAwN2ZmLAlXUl9DQ3xSRF9TfFJEX1QsCTAsCQlONTQJfSwKK3sibXVsc2wub2IiLCAiUyxUW2VdIiwJMHg0ODAwMDQzMiwgMHhmZTIwMDdmZiwJV1JfQ0N8UkRfU3xSRF9ULAkwLAkJTjU0CX0sCit7Im11bHNsLm9iIiwgIlMsayIsCTB4NGJjMDA0MzIsIDB4ZmZlMDA3ZmYsCVdSX0NDfFJEX1N8UkRfVCwJMCwJCU41NAl9LAoreyJtdWxzbC5xaCIsICJZLFEiLAkweDc4MjAwNDMyLCAweGZjMjAwN2ZmLAlSRF9TfFJEX1R8RlBfRCwJCVdSX01BQ0MsCU1YCX0sCit7Im11bHQiLCAgICAicyx0IiwgICAgICAweDAwMDAwMDE4LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSElMT3xJU19NLCAwLAkJSTEJfSwKK3sibXVsdCIsICAgICI3LHMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMGU3ZmYsIFdSX2F8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sibXVsdCIsICAgICJkLHMsdCIsICAgIDB4MDAwMDAwMTgsIDB4ZmMwMDA3ZmYsIFJEX3N8UkRfdHxXUl9ISUxPfFdSX2R8SVNfTSwgMCwJCUcxCX0sCit7Im11bHRwIiwgICAicyx0IiwJMHgwMDAwMDQ1OSwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fE1PRF9ISUxPLAkwLAkJU01UCX0sCit7Im11bHR1IiwgICAicyx0IiwgICAgICAweDAwMDAwMDE5LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSElMT3xJU19NLCAwLAkJSTEJfSwKK3sibXVsdHUiLCAgICI3LHMsdCIsCTB4MDAwMDAwMTksIDB4ZmMwMGU3ZmYsIFdSX2F8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sibXVsdHUiLCAgICJkLHMsdCIsICAgIDB4MDAwMDAwMTksIDB4ZmMwMDA3ZmYsIFJEX3N8UkRfdHxXUl9ISUxPfFdSX2R8SVNfTSwgMCwJCUcxCX0sCit7Im11bHUiLCAgICAiZCxzLHQiLAkweDAwMDAwMDU5LCAweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfSElMT3xXUl9kLAkwLAkJTjUJfSwKK3sibmVnIiwgICAgICJkLHciLAkweDAwMDAwMDIyLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCQkwLAkJSTEJfSwgLyogc3ViIDAgKi8KK3sibmVndSIsICAgICJkLHciLAkweDAwMDAwMDIzLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCQkwLAkJSTEJfSwgLyogc3VidSAwICovCit7Im5lZy5kIiwgICAiRCxWIiwJMHg0NjIwMDAwNywgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTEJfSwKK3sibmVnLnMiLCAgICJELFYiLAkweDQ2MDAwMDA3LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJCTAsCQlJMQl9LAoreyJuZWcucHMiLCAgIkQsViIsCTB4NDZjMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAkJMCwJCUk1fEkzMwl9LAoreyJubWFkZC5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDMxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsIDAsCQlJNHxJMzMJfSwKK3sibm1hZGQucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLCAwLAkJSTR8STMzCX0sCit7Im5tYWRkLnBzIiwiRCxSLFMsVCIsCTB4NGMwMDAwMzYsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwgMCwJCUk1fEkzMwl9LAoreyJubXN1Yi5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDM5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsIDAsCQlJNHxJMzMJfSwKK3sibm1zdWIucyIsICJELFIsUyxUIiwJMHg0YzAwMDAzOCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLCAwLAkJSTR8STMzCX0sCit7Im5tc3ViLnBzIiwiRCxSLFMsVCIsCTB4NGMwMDAwM2UsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwgMCwJCUk1fEkzMwl9LAorLyogbm9wIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgdGFibGUuICAqLworeyJub3IiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyNywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3sibm9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fTk9SX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sibm9yLm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMGYsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sibm9yLm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMGYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJub3Iub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAwZiwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Im5vci5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDBmLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sibm9yLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMGYsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJub3QiLCAgICAgImQsdiIsCTB4MDAwMDAwMjcsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkxCX0sLypub3IgZCxzLDAqLworeyJvciIsICAgICAgImQsdix0IiwJMHgwMDAwMDAyNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3sib3IiLCAgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fT1JfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJvci5vYiIsICAgIlgsWSxRIiwJMHg3ODAwMDAwZSwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJvci5vYiIsICAgIkQsUyxUIiwJMHg0YWMwMDAwZSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Im9yLm9iIiwgICAiRCxTLFRbZV0iLAkweDQ4MDAwMDBlLCAweGZlMjAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sib3Iub2IiLCAgICJELFMsayIsCTB4NGJjMDAwMGUsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJvci5xaCIsICAgIlgsWSxRIiwJMHg3ODIwMDAwZSwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7Im9yaSIsICAgICAidCxyLGkiLAkweDM0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCQkwLAkJSTEJfSwKK3sicGFic2RpZmYub2IiLCAiWCxZLFEiLDB4NzgwMDAwMDksIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlTQjEJfSwKK3sicGFic2RpZmZjLm9iIiwgIlksUSIsCTB4NzgwMDAwMzUsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJU0IxCX0sCit7InBhdmcub2IiLCAiWCxZLFEiLAkweDc4MDAwMDA4LCAweGZjMjAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJU0IxCX0sCit7InBpY2tmLm9iIiwgIlgsWSxRIiwJMHg3ODAwMDAwMiwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJwaWNrZi5vYiIsICJELFMsVCIsCTB4NGFjMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJwaWNrZi5vYiIsICJELFMsVFtlXSIsMHg0ODAwMDAwMiwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InBpY2tmLm9iIiwgIkQsUyxrIiwJMHg0YmMwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InBpY2tmLnFoIiwgIlgsWSxRIiwJMHg3ODIwMDAwMiwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InBpY2t0Lm9iIiwgIlgsWSxRIiwJMHg3ODAwMDAwMywgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJwaWNrdC5vYiIsICJELFMsVCIsCTB4NGFjMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJwaWNrdC5vYiIsICJELFMsVFtlXSIsMHg0ODAwMDAwMywgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InBpY2t0Lm9iIiwgIkQsUyxrIiwJMHg0YmMwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InBpY2t0LnFoIiwgIlgsWSxRIiwJMHg3ODIwMDAwMywgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InBsbC5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJjLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJSTV8STMzCX0sCit7InBsdS5wcyIsICAiRCxWLFQiLAkweDQ2YzAwMDJkLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJSTV8STMzCX0sCisgIC8qIHByZWYgYW5kIHByZWZ4IGFyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KK3sicHVsLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmUsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3sicHV1LnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMmYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3sicHBlcm0iLCAgICJzLHQiLAkweDcwMDAwNDgxLCAweGZjMDBmZmZmLAlNT0RfSElMT3xSRF9zfFJEX3QsCTAsCQlTTVQJfSwKK3sicmFjaC5vYiIsICJYIiwJMHg3YTAwMDAzZiwgMHhmZmZmZjgzZiwJV1JfRHxGUF9ELAkJUkRfTUFDQywJTVh8U0IxCX0sCit7InJhY2gub2IiLCAiRCIsCTB4NGEwMDAwM2YsIDB4ZmZmZmY4M2YsCVdSX0QsCQkJMCwJCU41NAl9LAoreyJyYWNoLnFoIiwgIlgiLAkweDdhMjAwMDNmLCAweGZmZmZmODNmLAlXUl9EfEZQX0QsCQlSRF9NQUNDLAlNWAl9LAoreyJyYWNsLm9iIiwgIlgiLAkweDc4MDAwMDNmLCAweGZmZmZmODNmLAlXUl9EfEZQX0QsCQlSRF9NQUNDLAlNWHxTQjEJfSwKK3sicmFjbC5vYiIsICJEIiwJMHg0ODAwMDAzZiwgMHhmZmZmZjgzZiwJV1JfRCwJCQkwLAkJTjU0CX0sCit7InJhY2wucWgiLCAiWCIsCTB4NzgyMDAwM2YsIDB4ZmZmZmY4M2YsCVdSX0R8RlBfRCwJCVJEX01BQ0MsCU1YCX0sCit7InJhY20ub2IiLCAiWCIsCTB4NzkwMDAwM2YsIDB4ZmZmZmY4M2YsCVdSX0R8RlBfRCwJCVJEX01BQ0MsCU1YfFNCMQl9LAoreyJyYWNtLm9iIiwgIkQiLAkweDQ5MDAwMDNmLCAweGZmZmZmODNmLAlXUl9ELAkJCTAsCQlONTQJfSwKK3sicmFjbS5xaCIsICJYIiwJMHg3OTIwMDAzZiwgMHhmZmZmZjgzZiwJV1JfRHxGUF9ELAkJUkRfTUFDQywJTVgJfSwKK3sicmVjaXAuZCIsICJELFMiLAkweDQ2MjAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJCTAsCQlJNHxJMzMJfSwKK3sicmVjaXAucHMiLCJELFMiLAkweDQ2YzAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJCTAsCQlTQjEJfSwKK3sicmVjaXAucyIsICJELFMiLAkweDQ2MDAwMDE1LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJCTAsCQlJNHxJMzMJfSwKK3sicmVjaXAxLmQiLCAgIkQsUyIsCTB4NDYyMDAwMWQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAkJMCwJCU0zRAl9LAoreyJyZWNpcDEucHMiLCAiRCxTIiwJMHg0NmMwMDAxZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCQkwLAkJTTNECX0sCit7InJlY2lwMS5zIiwgICJELFMiLAkweDQ2MDAwMDFkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJCTAsCQlNM0QJfSwKK3sicmVjaXAyLmQiLCAgIkQsUyxUIiwJMHg0NjIwMDAxYywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU0zRAl9LAoreyJyZWNpcDIucHMiLCAiRCxTLFQiLAkweDQ2YzAwMDFjLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAkwLAkJTTNECX0sCit7InJlY2lwMi5zIiwgICJELFMsVCIsCTB4NDYwMDAwMWMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCTAsCQlNM0QJfSwKK3sicmVtIiwgICAgICJ6LHMsdCIsICAgIDB4MDAwMDAwMWEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgIDAsCQlJMQl9LAoreyJyZW0iLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1fMywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJyZW0iLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1fM0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sicmVtdSIsICAgICJ6LHMsdCIsICAgIDB4MDAwMDAwMWIsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISUxPLCAgICAgIDAsCQlJMQl9LAoreyJyZW11IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9SRU1VXzMsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sicmVtdSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNVV8zSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJyZGh3ciIsICAgInQsSyIsCTB4N2MwMDAwM2IsIDB4ZmZlMDA3ZmYsIFdSX3QsCQkJMCwJCUkzMwl9LAoreyJyZHBncHIiLCAgImQsdyIsCTB4NDE0MDAwMDAsIDB4ZmZlMDA3ZmYsIFdSX2QsCQkJMCwJCUkzMwl9LAoreyJyZmUiLCAgICAgIiIsCQkweDQyMDAwMDEwLCAweGZmZmZmZmZmLAkwLAkJCTAsCQlJMXxUMwl9LAoreyJybmFzLnFoIiwgIlgsUSIsCTB4NzgyMDAwMjUsIDB4ZmMyMGY4M2YsCVdSX0R8UkRfVHxGUF9ELAkJUkRfTUFDQywJTVgJfSwKK3sicm5hdS5vYiIsICJYLFEiLAkweDc4MDAwMDIxLCAweGZjMjBmODNmLAlXUl9EfFJEX1R8RlBfRCwJCVJEX01BQ0MsCU1YfFNCMQl9LAoreyJybmF1LnFoIiwgIlgsUSIsCTB4NzgyMDAwMjEsIDB4ZmMyMGY4M2YsCVdSX0R8UkRfVHxGUF9ELAkJUkRfTUFDQywJTVgJfSwKK3sicm5lcy5xaCIsICJYLFEiLAkweDc4MjAwMDI2LCAweGZjMjBmODNmLAlXUl9EfFJEX1R8RlBfRCwJCVJEX01BQ0MsCU1YCX0sCit7InJuZXUub2IiLCAiWCxRIiwJMHg3ODAwMDAyMiwgMHhmYzIwZjgzZiwJV1JfRHxSRF9UfEZQX0QsCQlSRF9NQUNDLAlNWHxTQjEJfSwKK3sicm5ldS5xaCIsICJYLFEiLAkweDc4MjAwMDIyLCAweGZjMjBmODNmLAlXUl9EfFJEX1R8RlBfRCwJCVJEX01BQ0MsCU1YCX0sCit7InJvbCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPTCwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJyb2wiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ST0xfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJyb3IiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ST1IsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sicm9yIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9SX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sicm9yIiwJICAgICJkLHcsPCIsCTB4MDAyMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJCTAsCQlONXxJMzN8U01UIH0sCit7InJvcnYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDQ2LCAweGZjMDAwN2ZmLAlSRF90fFJEX3N8V1JfZCwJCTAsCQlONXxJMzN8U01UIH0sCit7InJvdGwiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPTCwJSU5TTl9NQUNSTywJCTAsCQlJMzN8U01UCX0sCit7InJvdGwiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1JPTF9JLAlJTlNOX01BQ1JPLAkJMCwJCUkzM3xTTVQJfSwKK3sicm90ciIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fUk9SLAlJTlNOX01BQ1JPLAkJMCwJCUkzM3xTTVQJfSwKK3sicm90ciIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9SX0ksCUlOU05fTUFDUk8sCQkwLAkJSTMzfFNNVAl9LAoreyJyb3RydiIsICAgImQsdCxzIiwJMHgwMDAwMDA0NiwgMHhmYzAwMDdmZiwJUkRfdHxSRF9zfFdSX2QsCQkwLAkJSTMzfFNNVAl9LAoreyJyb3VuZC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTN8STMzCX0sCit7InJvdW5kLmwucyIsICJELFMiLAkweDQ2MDAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTN8STMzCX0sCit7InJvdW5kLncuZCIsICJELFMiLAkweDQ2MjAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTIJfSwKK3sicm91bmQudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGMsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAkJMCwJCUkyCX0sCit7InJzcXJ0LmQiLCAiRCxTIiwJMHg0NjIwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTR8STMzCX0sCit7InJzcXJ0LnBzIiwiRCxTIiwJMHg0NmMwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJU0IxCX0sCit7InJzcXJ0LnMiLCAiRCxTIiwJMHg0NjAwMDAxNiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCQkwLAkJSTR8STMzCX0sCit7InJzcXJ0MS5kIiwgICJELFMiLAkweDQ2MjAwMDFlLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJCTAsCQlNM0QJfSwKK3sicnNxcnQxLnBzIiwgIkQsUyIsCTB4NDZjMDAwMWUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAkJMCwJCU0zRAl9LAoreyJyc3FydDEucyIsICAiRCxTIiwJMHg0NjAwMDAxZSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCQkwLAkJTTNECX0sCit7InJzcXJ0Mi5kIiwgICJELFMsVCIsCTB4NDYyMDAwMWYsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNM0QJfSwKK3sicnNxcnQyLnBzIiwgIkQsUyxUIiwJMHg0NmMwMDAxZiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfUywJMCwJCU0zRAl9LAoreyJyc3FydDIucyIsICAiRCxTLFQiLAkweDQ2MDAwMDFmLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAkwLAkJTTNECX0sCit7InJ6cy5xaCIsICAiWCxRIiwJMHg3ODIwMDAyNCwgMHhmYzIwZjgzZiwJV1JfRHxSRF9UfEZQX0QsCQlSRF9NQUNDLAlNWAl9LAoreyJyenUub2IiLCAgIlgsUSIsCTB4NzgwMDAwMjAsIDB4ZmMyMGY4M2YsCVdSX0R8UkRfVHxGUF9ELAkJUkRfTUFDQywJTVh8U0IxCX0sCit7InJ6dS5vYiIsICAiRCxrIiwJMHg0YmMwMDAyMCwgMHhmZmUwZjgzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InJ6dS5xaCIsICAiWCxRIiwJMHg3ODIwMDAyMCwgMHhmYzIwZjgzZiwJV1JfRHxSRF9UfEZQX0QsCQlSRF9NQUNDLAlNWAl9LAoreyJzYiIsICAgICAgInQsbyhiKSIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJCTAsCQlJMQl9LAoreyJzYiIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0JfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2MiLAkgICAgInQsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAkwLAkJSTIJfSwKK3sic2MiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0NfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sic2NkIiwJICAgICJ0LG8oYikiLAkweGYwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJMCwJCUkzCX0sCit7InNjZCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ0RfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3sic2QiLAkgICAgInQsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJCTAsCQlJMwl9LAoreyJzZCIsICAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fU0RfT0IsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2QiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNkYmJwIiwgICAiIiwJCTB4MDAwMDAwMGUsIDB4ZmZmZmZmZmYsCVRSQVAsICAgICAgICAgICAJMCwJCUcyCX0sCit7InNkYmJwIiwgICAiYyIsCTB4MDAwMDAwMGUsIDB4ZmMwMGZmZmYsCVRSQVAsCQkJMCwJCUcyCX0sCit7InNkYmJwIiwgICAiYyxxIiwJMHgwMDAwMDAwZSwgMHhmYzAwMDAzZiwJVFJBUCwJCQkwLAkJRzIJfSwKK3sic2RiYnAiLCAgICIiLCAgICAgICAgIDB4NzAwMDAwM2YsIDB4ZmZmZmZmZmYsIFRSQVAsICAgICAgICAgICAJMCwJCUkzMiAgICAgfSwKK3sic2RiYnAiLCAgICJCIiwgICAgICAgIDB4NzAwMDAwM2YsIDB4ZmMwMDAwM2YsIFRSQVAsICAgICAgICAgICAJMCwJCUkzMiAgICAgfSwKK3sic2RjMSIsICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJMCwJCUkyCX0sCit7InNkYzEiLCAgICAiRSxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCTAsCQlJMgl9LAoreyJzZGMxIiwgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJzZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU0RDMV9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJzZGMyIiwgICAgIkUsbyhiKSIsCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MyfFJEX2IsCQkwLAkJSTIJfSwKK3sic2RjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzJfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sic2RjMyIsICAgICJFLG8oYikiLAkweGZjMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9DM3xSRF9iLAkJMCwJCUkyCX0sCit7InNkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMzX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkyCX0sCit7InMuZCIsICAgICAiVCxvKGIpIiwJMHhmNDAwMDAwMCwgMHhmYzAwMDAwMCwgU018UkRfVHxSRF9ifEZQX0QsCTAsCQlJMgl9LAoreyJzLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fU19ET0IsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sicy5kIiwgICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NfREFCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNkbCIsICAgICAidCxvKGIpIiwJMHhiMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAkJMCwJCUkzCX0sCit7InNkbCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRExfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3sic2RyIiwgICAgICJ0LG8oYikiLAkweGI0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCQkwLAkJSTMJfSwKK3sic2RyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NEUl9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJzZHhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOSwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2J8RlBfRCwJMCwJCUk0fEkzMwl9LAoreyJzZWIiLCAgICAgImQsdyIsCTB4N2MwMDA0MjAsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJCTAsCQlJMzMJfSwKK3sic2VoIiwgICAgICJkLHciLAkweDdjMDAwNjIwLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCQkwLAkJSTMzCX0sCit7InNlbHNsIiwgICAiZCx2LHQiLAkweDAwMDAwMDA1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlMMQl9LAoreyJzZWxzciIsICAgImQsdix0IiwJMHgwMDAwMDAwMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJTDEJfSwKK3sic2VxIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0VRLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNlcSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NFUV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNnZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NHRSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzZ2UiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzZ2V1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR0VVLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNnZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHRVVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzZ3QiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1QsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2d0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dUX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2d0dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dUVSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzZ3R1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RVX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2giLCAgICAgICJ0LG8oYikiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCQkwLAkJSTEJfSwKK3sic2giLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NIX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNoZmwuYmZsYS5xaCIsICJYLFksWiIsIDB4N2EyMDAwMWYsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJzaGZsLm1peGgub2IiLCAiWCxZLFoiLCAweDc5ODAwMDFmLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVh8U0IxCX0sCit7InNoZmwubWl4aC5vYiIsICJELFMsVCIsIDB4NDk4MDAwMWYsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF9ULCAJMCwJCU41NAl9LAoreyJzaGZsLm1peGgucWgiLCAiWCxZLFoiLCAweDc4MjAwMDFmLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVgJfSwKK3sic2hmbC5taXhsLm9iIiwgIlgsWSxaIiwgMHg3OWMwMDAxZiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJzaGZsLm1peGwub2IiLCAiRCxTLFQiLCAweDQ5YzAwMDFmLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfVCwgCTAsCQlONTQJfSwKK3sic2hmbC5taXhsLnFoIiwgIlgsWSxaIiwgMHg3OGEwMDAxZiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InNoZmwucGFjaC5vYiIsICJYLFksWiIsIDB4NzkwMDAwMWYsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sic2hmbC5wYWNoLm9iIiwgIkQsUyxUIiwgMHg0OTAwMDAxZiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX1QsIAkwLAkJTjU0CX0sCit7InNoZmwucGFjaC5xaCIsICJYLFksWiIsIDB4NzkyMDAwMWYsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJzaGZsLnBhY2wub2IiLCAiRCxTLFQiLCAweDQ5NDAwMDFmLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfVCwgCTAsCQlONTQJfSwKK3sic2hmbC5yZXBhLnFoIiwgIlgsWSxaIiwgMHg3YjIwMDAxZiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InNoZmwucmVwYi5xaCIsICJYLFksWiIsIDB4N2JhMDAwMWYsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJzaGZsLnVwc2wub2IiLCAiWCxZLFoiLCAweDc4YzAwMDFmLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVh8U0IxCX0sCit7InNsZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzbGUiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTEVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzbGV1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TTEVVLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNsZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRVVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzbGx2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCQkwLAkJSTEJfSwKK3sic2xsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkxCX0sIC8qIHNsbHYgKi8KK3sic2xsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJCTAsCQlJMQl9LAoreyJzbGwub2IiLCAgIlgsWSxRIiwJMHg3ODAwMDAxMCwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJzbGwub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAxMCwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InNsbC5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDEwLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sic2xsLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMTAsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJzbHQiLCAgICAgImQsdix0IiwJMHgwMDAwMDAyYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3sic2x0IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xUX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic2x0aSIsICAgICJ0LHIsaiIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJCTAsCQlJMQl9LAoreyJzbHRpdSIsICAgInQscixqIiwJMHgyYzAwMDAwMCwgMHhmYzAwMDAwMCwJV1JfdHxSRF9zLAkJMCwJCUkxCX0sCit7InNsdHUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJiLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMQl9LAoreyJzbHR1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRVX0ksCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic25lIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU05FLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNuZSIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NORV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InNxcnQuZCIsICAiRCxTIiwJMHg0NjIwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTIJfSwKK3sic3FydC5zIiwgICJELFMiLAkweDQ2MDAwMDA0LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJCTAsCQlJMgl9LAoreyJzcXJ0LnBzIiwgIkQsUyIsCTB4NDZjMDAwMDQsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAkJMCwJCVNCMQl9LAoreyJzcmF2IiwgICAgImQsdCxzIiwJMHgwMDAwMDAwNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCQkwLAkJSTEJfSwKK3sic3JhIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAkJMCwJCUkxCX0sIC8qIHNyYXYgKi8KK3sic3JhIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJCTAsCQlJMQl9LAoreyJzcmEucWgiLCAgIlgsWSxRIiwJMHg3ODIwMDAxMywgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InNybHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJCTAsCQlJMQl9LAoreyJzcmwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCQkwLAkJSTEJfSwgLyogc3JsdiAqLworeyJzcmwiLCAgICAgImQsdyw8IiwJMHgwMDAwMDAwMiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAkJMCwJCUkxCX0sCit7InNybC5vYiIsICAiWCxZLFEiLAkweDc4MDAwMDEyLCAweGZjMjAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9ELAkwLAkJTVh8U0IxCX0sCit7InNybC5vYiIsICAiRCxTLFRbZV0iLAkweDQ4MDAwMDEyLCAweGZlMjAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sic3JsLm9iIiwgICJELFMsayIsCTB4NGJjMDAwMTIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJzcmwucWgiLCAgIlgsWSxRIiwJMHg3ODIwMDAxMiwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCisvKiBzc25vcCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlLiAgKi8KK3sic3RhbmRieSIsICIiLCAgICAgICAgIDB4NDIwMDAwMjEsIDB4ZmZmZmZmZmYsCTAsCQkJMCwJCVYxCX0sCit7InN1YiIsICAgICAiZCx2LHQiLAkweDAwMDAwMDIyLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMQl9LAoreyJzdWIiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TVUJfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzdWIuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMSwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCUkxCX0sCit7InN1Yi5zIiwgICAiRCxWLFQiLAkweDQ2MDAwMDAxLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVHxGUF9TLAkwLAkJSTEJfSwKK3sic3ViLm9iIiwgICJYLFksUSIsCTB4NzgwMDAwMGEsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWHxTQjEJfSwKK3sic3ViLm9iIiwgICJELFMsVCIsCTB4NGFjMDAwMGEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJzdWIub2IiLCAgIkQsUyxUW2VdIiwJMHg0ODAwMDAwYSwgMHhmZTIwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7InN1Yi5vYiIsICAiRCxTLGsiLAkweDRiYzAwMDBhLCAweGZmZTAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sic3ViLnBzIiwgICJELFYsVCIsCTB4NDZjMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlJNXxJMzMJfSwKK3sic3ViLnFoIiwgICJYLFksUSIsCTB4NzgyMDAwMGEsIDB4ZmMyMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCTAsCQlNWAl9LAoreyJzdWJhLm9iIiwgIlksUSIsCTB4NzgwMDAwMzYsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7InN1YmEucWgiLCAiWSxRIiwJMHg3ODIwMDAzNiwgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsCQlXUl9NQUNDLAlNWAl9LAoreyJzdWJsLm9iIiwgIlksUSIsCTB4NzgwMDA0MzYsIDB4ZmMyMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7InN1YmwucWgiLCAiWSxRIiwJMHg3ODIwMDQzNiwgMHhmYzIwMDdmZiwJUkRfU3xSRF9UfEZQX0QsCQlXUl9NQUNDLAlNWAl9LAoreyJzdWJ1IiwgICAgImQsdix0IiwJMHgwMDAwMDAyMywgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTEJfSwKK3sic3VidSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCVV9JLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InN1c3BlbmQiLCAiIiwgICAgICAgICAweDQyMDAwMDIyLCAweGZmZmZmZmZmLAkwLAkJCTAsCQlWMQl9LAoreyJzdXhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwZCwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCTAsCQlJNXxJMzN8TjU1fSwKK3sic3ciLCAgICAgICJ0LG8oYikiLAkweGFjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCQkwLAkJSTEJfSwKK3sic3ciLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InN3YzAiLCAgICAiRSxvKGIpIiwJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzB8UkRfYiwJCTAsCQlJMQl9LAoreyJzd2MwIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMF9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzd2MxIiwgICAgIlQsbyhiKSIsCTB4ZTQwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX1R8UkRfYnxGUF9TLAkwLAkJSTEJfSwKK3sic3djMSIsICAgICJFLG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJMCwJCUkxCX0sCit7InN3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InN3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InMucyIsICAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCTAsCQlJMQl9LCAvKiBzd2MxICovCit7InMucyIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InN3YzIiLCAgICAiRSxvKGIpIiwJMHhlODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzJ8UkRfYiwJCTAsCQlJMQl9LAoreyJzd2MyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMl9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzd2MzIiwgICAgIkUsbyhiKSIsCTB4ZWMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX0MzfFJEX2IsCQkwLAkJSTEJfSwKK3sic3djMyIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzNfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sic3dsIiwgICAgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCQkwLAkJSTEJfSwKK3sic3dsIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXTF9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJzY2FjaGUiLCAgInQsbyhiKSIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJCTAsCQlJMgl9LCAvKiBzYW1lICovCit7InNjYWNoZSIsICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0xfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwgLyogYXMgc3dsICovCit7InN3ciIsICAgICAidCxvKGIpIiwJMHhiODAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAkJMCwJCUkxCX0sCit7InN3ciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siaW52YWxpZGF0ZSIsICJ0LG8oYikiLDB4YjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJCTAsCQlJMgl9LCAvKiBzYW1lICovCit7ImludmFsaWRhdGUiLCAidCxBKGIpIiwwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LCAvKiBhcyBzd3IgKi8KK3sic3d4YzEiLCAgICJTLHQoYikiLCAgIDB4NGMwMDAwMDgsIDB4ZmMwMDA3ZmYsIFNNfFJEX1N8UkRfdHxSRF9ifEZQX1MsCTAsCQlJNHxJMzMJfSwKK3sic3luYyIsICAgICIiLAkJMHgwMDAwMDAwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAkJMCwJCUkyfEcxCX0sCit7InN5bmMucCIsICAiIiwJCTB4MDAwMDA0MGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJCTAsCQlJMgl9LAoreyJzeW5jLmwiLCAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCQkwLAkJSTIJfSwKK3sic3luY2kiLCAgICJvKGIpIiwJMHgwNDFmMDAwMCwgMHhmYzFmMDAwMCwJU018UkRfYiwJCTAsCQlJMzMJfSwKK3sic3lzY2FsbCIsICIiLAkJMHgwMDAwMDAwYywgMHhmZmZmZmZmZiwJVFJBUCwJCQkwLAkJSTEJfSwKK3sic3lzY2FsbCIsICJCIiwJMHgwMDAwMDAwYywgMHhmYzAwMDAzZiwJVFJBUCwJCQkwLAkJSTEJfSwKK3sidGVxaSIsICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwKK3sidGVxIiwJICAgICJzLHQiLAkweDAwMDAwMDM0LCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0ZXEiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzNCwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCQkwLAkJSTIJfSwKK3sidGVxIiwgICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwgLyogdGVxaSAqLworeyJ0ZXEiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEVRX0ksCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sidGdlaSIsICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwKK3sidGdlIiwJICAgICJzLHQiLAkweDAwMDAwMDMwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0Z2UiLAkgICAgInMsdCxxIiwJMHgwMDAwMDAzMCwgMHhmYzAwMDAzZiwJUkRfc3xSRF90fFRSQVAsCQkwLAkJSTIJfSwKK3sidGdlIiwgICAgICJzLGoiLAkweDA0MDgwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwgLyogdGdlaSAqLworeyJ0Z2UiLAkgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFX0ksICAgIElOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sidGdlaXUiLCAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwKK3sidGdldSIsICAgICJzLHQiLAkweDAwMDAwMDMxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0Z2V1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMSwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCQkwLAkJSTIJfSwKK3sidGdldSIsICAgICJzLGoiLAkweDA0MDkwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwgLyogdGdlaXUgKi8KK3sidGdldSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRVVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJ0bGJwIiwgICAgIiIsICAgICAgICAgMHg0MjAwMDAwOCwgMHhmZmZmZmZmZiwgSU5TTl9UTEIsICAgICAgIAkwLAkJSTEgICAJfSwKK3sidGxiciIsICAgICIiLCAgICAgICAgIDB4NDIwMDAwMDEsIDB4ZmZmZmZmZmYsIElOU05fVExCLCAgICAgICAJMCwJCUkxICAgCX0sCit7InRsYndpIiwgICAiIiwgICAgICAgICAweDQyMDAwMDAyLCAweGZmZmZmZmZmLCBJTlNOX1RMQiwgICAgICAgCTAsCQlJMSAgIAl9LAoreyJ0bGJ3ciIsICAgIiIsICAgICAgICAgMHg0MjAwMDAwNiwgMHhmZmZmZmZmZiwgSU5TTl9UTEIsICAgICAgIAkwLAkJSTEgICAJfSwKK3sidGx0aSIsICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCQkwLAkJSTIJfSwKK3sidGx0IiwgICAgICJzLHQiLAkweDAwMDAwMDMyLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0bHQiLCAgICAgInMsdCxxIiwJMHgwMDAwMDAzMiwgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCQkwLAkJSTIJfSwKK3sidGx0IiwgICAgICJzLGoiLAkweDA0MGEwMDAwLCAweGZjMWYwMDAwLAlSRF9zfFRSQVAsCQkwLAkJSTIJfSwgLyogdGx0aSAqLworeyJ0bHQiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUX0ksCUlOU05fTUFDUk8sCQkwLAkJSTIJfSwKK3sidGx0aXUiLCAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwKK3sidGx0dSIsICAgICJzLHQiLAkweDAwMDAwMDMzLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0bHR1IiwgICAgInMsdCxxIiwJMHgwMDAwMDAzMywgMHhmYzAwMDAzZiwgUkRfc3xSRF90fFRSQVAsCQkwLAkJSTIJfSwKK3sidGx0dSIsICAgICJzLGoiLAkweDA0MGIwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCQkwLAkJSTIJfSwgLyogdGx0aXUgKi8KK3sidGx0dSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVFVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJ0bmVpIiwgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJCTAsCQlJMgl9LAoreyJ0bmUiLCAgICAgInMsdCIsCTB4MDAwMDAwMzYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAkJMCwJCUkyCX0sCit7InRuZSIsICAgICAicyx0LHEiLAkweDAwMDAwMDM2LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJCTAsCQlJMgl9LAoreyJ0bmUiLCAgICAgInMsaiIsCTB4MDQwZTAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJCTAsCQlJMgl9LCAvKiB0bmVpICovCit7InRuZSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTkVfSSwJSU5TTl9NQUNSTywJCTAsCQlJMgl9LAoreyJ0cnVuYy5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwOSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCQkwLAkJSTN8STMzCX0sCit7InRydW5jLmwucyIsICJELFMiLAkweDQ2MDAwMDA5LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTN8STMzCX0sCit7InRydW5jLncuZCIsICJELFMiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfU3xGUF9ELAkwLAkJSTIJfSwKK3sidHJ1bmMudy5kIiwgIkQsUyx4IiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1N8RlBfRCwJMCwJCUkyCX0sCit7InRydW5jLncuZCIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXRCwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJ0cnVuYy53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCQkwLAkJSTIJfSwKK3sidHJ1bmMudy5zIiwgIkQsUyx4IiwJMHg0NjAwMDAwZCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCQkwLAkJSTIJfSwKK3sidHJ1bmMudy5zIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dTLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InVsZCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEQsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3sidWxkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMRF9BLAlJTlNOX01BQ1JPLAkJMCwJCUkzCX0sCit7InVsaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEgsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sidWxoIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VMSF9BLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InVsaHUiLCAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEhVLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7InVsaHUiLCAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTEhVX0EsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sidWx3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMVywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJ1bHciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxXX0EsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sidXNkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTRCwJSU5TTl9NQUNSTywJCTAsCQlJMwl9LAoreyJ1c2QiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNEX0EsCUlOU05fTUFDUk8sCQkwLAkJSTMJfSwKK3sidXNoIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTSCwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJ1c2giLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNIX0EsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sidXN3IiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTVywJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJ1c3ciLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNXX0EsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3sid2FjaC5vYiIsICJZIiwJMHg3YTAwMDAzZSwgMHhmZmZmMDdmZiwJUkRfU3xGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7IndhY2gub2IiLCAiUyIsCTB4NGEwMDAwM2UsIDB4ZmZmZjA3ZmYsCVJEX1MsCQkJMCwJCU41NAl9LAoreyJ3YWNoLnFoIiwgIlkiLAkweDdhMjAwMDNlLCAweGZmZmYwN2ZmLAlSRF9TfEZQX0QsCQlXUl9NQUNDLAlNWAl9LAoreyJ3YWNsLm9iIiwgIlksWiIsCTB4NzgwMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVh8U0IxCX0sCit7IndhY2wub2IiLCAiUyxUIiwJMHg0ODAwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJ3YWNsLnFoIiwgIlksWiIsCTB4NzgyMDAwM2UsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxGUF9ELAkJV1JfTUFDQywJTVgJfSwKK3sid2FpdCIsICAgICIiLCAgICAgICAgIDB4NDIwMDAwMjAsIDB4ZmZmZmZmZmYsIFRSQVAsICAgCQkwLAkJSTN8STMyCX0sCit7IndhaXQiLCAgICAiSiIsICAgICAgICAweDQyMDAwMDIwLCAweGZlMDAwMDNmLCBUUkFQLCAgIAkJMCwJCUkzMnxONTUJfSwKK3sid2FpdGkiLCAgICIiLAkJMHg0MjAwMDAyMCwgMHhmZmZmZmZmZiwJVFJBUCwJCQkwLAkJTDEJfSwKK3sid3JwZ3ByIiwgICJkLHciLAkweDQxYzAwMDAwLCAweGZmZTAwN2ZmLCBSRF90LAkJCTAsCQlJMzMJfSwKK3sid3NiaCIsICAgICJkLHciLAkweDdjMDAwMGEwLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCQkwLAkJSTMzCX0sCit7InhvciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMQl9LAoreyJ4b3IiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9YT1JfSSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJ4b3Iub2IiLCAgIlgsWSxRIiwJMHg3ODAwMDAwZCwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YfFNCMQl9LAoreyJ4b3Iub2IiLCAgIkQsUyxUIiwJMHg0YWMwMDAwZCwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1QsCQkwLAkJTjU0CX0sCit7Inhvci5vYiIsICAiRCxTLFRbZV0iLAkweDQ4MDAwMDBkLCAweGZlMjAwMDNmLAlXUl9EfFJEX1N8UkRfVCwJCTAsCQlONTQJfSwKK3sieG9yLm9iIiwgICJELFMsayIsCTB4NGJjMDAwMGQsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9ULAkJMCwJCU41NAl9LAoreyJ4b3IucWgiLCAgIlgsWSxRIiwJMHg3ODIwMDAwZCwgMHhmYzIwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJMCwJCU1YCX0sCit7InhvcmkiLCAgICAidCxyLGkiLAkweDM4MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCQkwLAkJSTEJfSwKK3sieWllbGQiLCAgICJzIiwJMHg3YzAwMDAwOSwgMHhmYzFmZmZmZiwgVFJBUHxSRF9zLAkJMCwJCU1UMzIJfSwKK3sieWllbGQiLCAgICJkLHMiLAkweDdjMDAwMDA5LCAweGZjMWYwN2ZmLCBUUkFQfFdSX2R8UkRfcywJCTAsCQlNVDMyCX0sCisKKy8qIFVzZXIgRGVmaW5lZCBJbnN0cnVjdGlvbi4gICovCit7InVkaTAiLCAgICAgInMsdCxkLCsxIiwweDcwMDAwMDEwLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMCIsICAgICAicyx0LCsyIiwJMHg3MDAwMDAxMCwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTAiLCAgICAgInMsKzMiLAkweDcwMDAwMDEwLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMCIsICAgICAiKzQiLAkweDcwMDAwMDEwLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMSIsICAgICAicyx0LGQsKzEiLDB4NzAwMDAwMTEsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxIiwgICAgICJzLHQsKzIiLAkweDcwMDAwMDExLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMSIsICAgICAicywrMyIsCTB4NzAwMDAwMTEsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxIiwgICAgICIrNCIsCTB4NzAwMDAwMTEsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkyIiwgICAgICJzLHQsZCwrMSIsMHg3MDAwMDAxMiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTIiLCAgICAgInMsdCwrMiIsCTB4NzAwMDAwMTIsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkyIiwgICAgICJzLCszIiwJMHg3MDAwMDAxMiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTIiLCAgICAgIis0IiwJMHg3MDAwMDAxMiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTMiLCAgICAgInMsdCxkLCsxIiwweDcwMDAwMDEzLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMyIsICAgICAicyx0LCsyIiwJMHg3MDAwMDAxMywgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTMiLCAgICAgInMsKzMiLAkweDcwMDAwMDEzLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMyIsICAgICAiKzQiLAkweDcwMDAwMDEzLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNCIsICAgICAicyx0LGQsKzEiLDB4NzAwMDAwMTQsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk0IiwgICAgICJzLHQsKzIiLAkweDcwMDAwMDE0LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNCIsICAgICAicywrMyIsCTB4NzAwMDAwMTQsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk0IiwgICAgICIrNCIsCTB4NzAwMDAwMTQsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk1IiwgICAgICJzLHQsZCwrMSIsMHg3MDAwMDAxNSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTUiLCAgICAgInMsdCwrMiIsCTB4NzAwMDAwMTUsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk1IiwgICAgICJzLCszIiwJMHg3MDAwMDAxNSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTUiLCAgICAgIis0IiwJMHg3MDAwMDAxNSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTYiLCAgICAgInMsdCxkLCsxIiwweDcwMDAwMDE2LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNiIsICAgICAicyx0LCsyIiwJMHg3MDAwMDAxNiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTYiLCAgICAgInMsKzMiLAkweDcwMDAwMDE2LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNiIsICAgICAiKzQiLAkweDcwMDAwMDE2LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNyIsICAgICAicyx0LGQsKzEiLDB4NzAwMDAwMTcsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk3IiwgICAgICJzLHQsKzIiLAkweDcwMDAwMDE3LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpNyIsICAgICAicywrMyIsCTB4NzAwMDAwMTcsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk3IiwgICAgICIrNCIsCTB4NzAwMDAwMTcsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk4IiwgICAgICJzLHQsZCwrMSIsMHg3MDAwMDAxOCwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTgiLCAgICAgInMsdCwrMiIsCTB4NzAwMDAwMTgsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk4IiwgICAgICJzLCszIiwJMHg3MDAwMDAxOCwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTgiLCAgICAgIis0IiwJMHg3MDAwMDAxOCwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTkiLCAgICAgInMsdCxkLCsxIiwweDcwMDAwMDE5LCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpOSIsICAgICAgInMsdCwrMiIsCTB4NzAwMDAwMTksIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGk5IiwgICAgICJzLCszIiwJMHg3MDAwMDAxOSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTkiLCAgICAgIis0IiwJMHg3MDAwMDAxOSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEwIiwgICAgInMsdCxkLCsxIiwweDcwMDAwMDFhLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTAiLCAgICAicyx0LCsyIiwJMHg3MDAwMDAxYSwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEwIiwgICAgInMsKzMiLAkweDcwMDAwMDFhLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTAiLCAgICAiKzQiLAkweDcwMDAwMDFhLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTEiLCAgICAicyx0LGQsKzEiLDB4NzAwMDAwMWIsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxMSIsICAgICJzLHQsKzIiLAkweDcwMDAwMDFiLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTEiLCAgICAicywrMyIsCTB4NzAwMDAwMWIsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxMSIsICAgICIrNCIsCTB4NzAwMDAwMWIsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxMiIsICAgICJzLHQsZCwrMSIsMHg3MDAwMDAxYywgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEyIiwgICAgInMsdCwrMiIsCTB4NzAwMDAwMWMsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxMiIsICAgICJzLCszIiwJMHg3MDAwMDAxYywgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEyIiwgICAgIis0IiwJMHg3MDAwMDAxYywgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEzIiwgICAgInMsdCxkLCsxIiwweDcwMDAwMDFkLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTMiLCAgICAicyx0LCsyIiwJMHg3MDAwMDAxZCwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTEzIiwgICAgInMsKzMiLAkweDcwMDAwMDFkLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTMiLCAgICAiKzQiLAkweDcwMDAwMDFkLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTQiLCAgICAicyx0LGQsKzEiLDB4NzAwMDAwMWUsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxNCIsICAgICJzLHQsKzIiLAkweDcwMDAwMDFlLCAweGZjMDAwMDNmLAlXUl9kfFJEX3N8UkRfdCwJCTAsCQlJMzMJfSwKK3sidWRpMTQiLCAgICAicywrMyIsCTB4NzAwMDAwMWUsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxNCIsICAgICIrNCIsCTB4NzAwMDAwMWUsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxNSIsICAgICJzLHQsZCwrMSIsMHg3MDAwMDAxZiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTE1IiwgICAgInMsdCwrMiIsCTB4NzAwMDAwMWYsIDB4ZmMwMDAwM2YsCVdSX2R8UkRfc3xSRF90LAkJMCwJCUkzMwl9LAoreyJ1ZGkxNSIsICAgICJzLCszIiwJMHg3MDAwMDAxZiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCit7InVkaTE1IiwgICAgIis0IiwJMHg3MDAwMDAxZiwgMHhmYzAwMDAzZiwJV1JfZHxSRF9zfFJEX3QsCQkwLAkJSTMzCX0sCisKKy8qIENvcHJvY2Vzc29yIDIgbW92ZS9icmFuY2ggb3BlcmF0aW9ucyBvdmVybGFwIHdpdGggVlI1NDAwIC5vYiBmb3JtYXQKKyAgIGluc3RydWN0aW9ucyBzbyB0aGV5IGFyZSBoZXJlIGZvciB0aGUgbGF0dGVycyB0byB0YWtlIHByZWNlZGVuY2UuICAqLworeyJiYzJmIiwgICAgInAiLAkweDQ5MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCQkwLAkJSTEJfSwKK3siYmMyZiIsICAgICJOLHAiLAkweDQ5MDAwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0MsCQkwLAkJSTMyCX0sCit7ImJjMmZsIiwgICAicCIsCTB4NDkwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJCTAsCQlJMnxUMwl9LAoreyJiYzJmbCIsICAgIk4scCIsCTB4NDkwMjAwMDAsIDB4ZmZlMzAwMDAsCUNCTHxSRF9DQywJCTAsCQlJMzIJfSwKK3siYmMydCIsICAgICJwIiwJMHg0OTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAkJMCwJCUkxCX0sCit7ImJjMnQiLCAgICAiTixwIiwJMHg0OTAxMDAwMCwgMHhmZmUzMDAwMCwJQ0JEfFJEX0NDLAkJMCwJCUkzMgl9LAoreyJiYzJ0bCIsICAgInAiLAkweDQ5MDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCQkwLAkJSTJ8VDMJfSwKK3siYmMydGwiLCAgICJOLHAiLAkweDQ5MDMwMDAwLCAweGZmZTMwMDAwLAlDQkx8UkRfQ0MsCQkwLAkJSTMyCX0sCit7ImNmYzIiLCAgICAidCxHIiwJMHg0ODQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCQkwLAkJSTEJfSwKK3siY3RjMiIsICAgICJ0LEciLAkweDQ4YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJCTAsCQlJMQl9LAoreyJkbWZjMiIsICAgInQsRyIsCTB4NDgyMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAkJMCwJCUkzCX0sCit7ImRtZmMyIiwgICAidCxHLEgiLAkweDQ4MjAwMDAwLCAweGZmZTAwN2Y4LAlMQ0R8V1JfdHxSRF9DMiwJCTAsCQlJNjQJfSwKK3siZG10YzIiLCAgICJ0LEciLAkweDQ4YTAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMnxXUl9DQywJMCwJCUkzCX0sCit7ImRtdGMyIiwgICAidCxHLEgiLAkweDQ4YTAwMDAwLCAweGZmZTAwN2Y4LAlDT0R8UkRfdHxXUl9DMnxXUl9DQywJMCwJCUk2NAl9LAoreyJtZmMyIiwgICAgInQsRyIsCTB4NDgwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAkJMCwJCUkxCX0sCit7Im1mYzIiLCAgICAidCxHLEgiLAkweDQ4MDAwMDAwLCAweGZmZTAwN2Y4LAlMQ0R8V1JfdHxSRF9DMiwJCTAsCQlJMzIJfSwKK3sibWZoYzIiLCAgICJ0LEciLAkweDQ4NjAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMiwJCTAsCQlJMzMJfSwKK3sibWZoYzIiLCAgICJ0LEcsSCIsCTB4NDg2MDAwMDAsIDB4ZmZlMDA3ZjgsCUxDRHxXUl90fFJEX0MyLAkJMCwJCUkzMwl9LAoreyJtZmhjMiIsICAgInQsaSIsCTB4NDg2MDAwMDAsIDB4ZmZlMDAwMDAsCUxDRHxXUl90fFJEX0MyLAkJMCwJCUkzMwl9LAoreyJtdGMyIiwgICAgInQsRyIsCTB4NDg4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MyfFdSX0NDLAkwLAkJSTEJfSwKK3sibXRjMiIsICAgICJ0LEcsSCIsCTB4NDg4MDAwMDAsIDB4ZmZlMDA3ZjgsCUNPRHxSRF90fFdSX0MyfFdSX0NDLAkwLAkJSTMyCX0sCit7Im10aGMyIiwgICAidCxHIiwJMHg0OGUwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQzJ8V1JfQ0MsCTAsCQlJMzMJfSwKK3sibXRoYzIiLCAgICJ0LEcsSCIsCTB4NDhlMDAwMDAsIDB4ZmZlMDA3ZjgsCUNPRHxSRF90fFdSX0MyfFdSX0NDLAkwLAkJSTMzCX0sCit7Im10aGMyIiwgICAidCxpIiwJMHg0OGUwMDAwMCwgMHhmZmUwMDAwMCwJQ09EfFJEX3R8V1JfQzJ8V1JfQ0MsCTAsCQlJMzMJfSwKKworLyogQ29wcm9jZXNzb3IgMyBtb3ZlL2JyYW5jaCBvcGVyYXRpb25zIG92ZXJsYXAgd2l0aCBNSVBTIElWIENPUDFYCisgICBpbnN0cnVjdGlvbnMsIHNvIHRoZXkgYXJlIGhlcmUgZm9yIHRoZSBsYXR0ZXJzIHRvIHRha2UgcHJlY2VkZW5jZS4gICovCit7ImJjM2YiLCAgICAicCIsCTB4NGQwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJCTAsCQlJMQl9LAoreyJiYzNmbCIsICAgInAiLAkweDRkMDIwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCQkwLAkJSTJ8VDMJfSwKK3siYmMzdCIsICAgICJwIiwJMHg0ZDAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAkJMCwJCUkxCX0sCit7ImJjM3RsIiwgICAicCIsCTB4NGQwMzAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJCTAsCQlJMnxUMwl9LAoreyJjZmMzIiwgICAgInQsRyIsCTB4NGM0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAkJMCwJCUkxCX0sCit7ImN0YzMiLCAgICAidCxHIiwJMHg0Y2MwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0MsCQkwLAkJSTEJfSwKK3siZG1mYzMiLCAgICJ0LEciLAkweDRjMjAwMDAwLCAweGZmZTAwN2ZmLCBMQ0R8V1JfdHxSRF9DMywgCTAsCQlJMwl9LAoreyJkbXRjMyIsICAgInQsRyIsCTB4NGNhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX0MzfFdSX0NDLAkwLAkJSTMJfSwKK3sibWZjMyIsICAgICJ0LEciLAkweDRjMDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMywJCTAsCQlJMQl9LAoreyJtZmMzIiwgICAgInQsRyxIIiwgICAgMHg0YzAwMDAwMCwgMHhmZmUwMDdmOCwgTENEfFdSX3R8UkRfQzMsIAkwLAkJSTMyICAgICB9LAoreyJtdGMzIiwgICAgInQsRyIsCTB4NGM4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MzfFdSX0NDLAkwLAkJSTEJfSwKK3sibXRjMyIsICAgICJ0LEcsSCIsICAgIDB4NGM4MDAwMDAsIDB4ZmZlMDA3ZjgsIENPRHxSRF90fFdSX0MzfFdSX0NDLCAgIDAsCQlJMzIgICAgIH0sCisKKy8qIE5vIGhhemFyZCBwcm90ZWN0aW9uIG9uIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy0tdGhleSBzaG91bGRuJ3QKKyAgIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciBhbmQgaWYgdGhleSBkbyBpdCdzIHVwIHRvIHRoZQorICAgdXNlciB0byBwdXQgaW4gbm9wcyBhcyBuZWNlc3NhcnkuICBUaGVzZSBhcmUgYXQgdGhlIGVuZCBzbyB0aGF0IHRoZQorICAgZGlzYXNzZW1ibGVyIHJlY29nbml6ZXMgbW9yZSBzcGVjaWZpYyB2ZXJzaW9ucyBmaXJzdC4gICovCit7ImMwIiwgICAgICAiQyIsCTB4NDIwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCQkJMCwJCUkxCX0sCit7ImMxIiwgICAgICAiQyIsCTB4NDYwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCQkJMCwJCUkxCX0sCit7ImMyIiwgICAgICAiQyIsCTB4NGEwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCQkJMCwJCUkxCX0sCit7ImMzIiwgICAgICAiQyIsCTB4NGUwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCQkJMCwJCUkxCX0sCit7ImNvcDAiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDAsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKK3siY29wMSIsICAgICAiQyIsCTAsICAgIChpbnQpIE1fQ09QMSwJSU5TTl9NQUNSTywJCTAsCQlJMQl9LAoreyJjb3AyIiwgICAgICJDIiwJMCwgICAgKGludCkgTV9DT1AyLAlJTlNOX01BQ1JPLAkJMCwJCUkxCX0sCit7ImNvcDMiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDMsCUlOU05fTUFDUk8sCQkwLAkJSTEJfSwKKyAgLyogQ29uZmxpY3RzIHdpdGggdGhlIDQ2NTAncyAibXVsIiBpbnN0cnVjdGlvbi4gIE5vYm9keSdzIHVzaW5nIHRoZQorICAgICA0MDEwIGFueSBtb3JlLCBzbyBtb3ZlIHRoaXMgaW5zbiBvdXQgb2YgdGhlIHdheS4gIElmIHRoZSBvYmplY3QKKyAgICAgZm9ybWF0IGdhdmUgdXMgbW9yZSBpbmZvLCB3ZSBjb3VsZCBkbyB0aGlzIHJpZ2h0LiAgKi8KK3siYWRkY2l1IiwgICJ0LHIsaiIsCTB4NzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJCTAsCQlMMQl9LAorLyogTUlQUyBEU1AgQVNFICovCit7ImFic3Ffcy5waCIsICJkLHQiLAkweDdjMDAwMjUyLCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7ImFic3Ffcy5wdyIsICJkLHQiLAkweDdjMDAwNDU2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7ImFic3Ffcy5xaCIsICJkLHQiLAkweDdjMDAwMjU2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7ImFic3Ffcy53IiwgImQsdCIsCTB4N2MwMDA0NTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3siYWRkcS5waCIsICJkLHMsdCIsCTB4N2MwMDAyOTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJhZGRxLnB3IiwgImQscyx0IiwJMHg3YzAwMDQ5NCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImFkZHEucWgiLCAiZCxzLHQiLAkweDdjMDAwMjk0LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3siYWRkcV9zLnBoIiwgImQscyx0IiwJMHg3YzAwMDM5MCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImFkZHFfcy5wdyIsICJkLHMsdCIsCTB4N2MwMDA1OTQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJhZGRxX3MucWgiLCAiZCxzLHQiLAkweDdjMDAwMzk0LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3siYWRkcV9zLnciLCAiZCxzLHQiLAkweDdjMDAwNTkwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3siYWRkc2MiLCAgICJkLHMsdCIsCTB4N2MwMDA0MTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJhZGR1Lm9iIiwgImQscyx0IiwJMHg3YzAwMDAxNCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImFkZHUucWIiLCAiZCxzLHQiLAkweDdjMDAwMDEwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3siYWRkdV9zLm9iIiwgImQscyx0IiwJMHg3YzAwMDExNCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImFkZHVfcy5xYiIsICJkLHMsdCIsCTB4N2MwMDAxMTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJhZGR3YyIsICAgImQscyx0IiwJMHg3YzAwMDQ1MCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImJpdHJldiIsICAiZCx0IiwJMHg3YzAwMDZkMiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJicG9zZ2UzMiIsICJwIiwJMHgwNDFjMDAwMCwgMHhmZmZmMDAwMCwgQ0JELAkJCTAsCQlEMzIJfSwKK3siYnBvc2dlNjQiLCAicCIsCTB4MDQxZDAwMDAsIDB4ZmZmZjAwMDAsIENCRCwJCQkwLAkJRDY0CX0sCit7ImNtcC5lcS5waCIsICJzLHQiLAkweDdjMDAwMjExLCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImNtcC5lcS5wdyIsICJzLHQiLAkweDdjMDAwNDE1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcC5lcS5xaCIsICJzLHQiLAkweDdjMDAwMjE1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcGd1LmVxLm9iIiwgImQscyx0IiwgMHg3YzAwMDExNSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3siY21wZ3UuZXEucWIiLCAiZCxzLHQiLCAweDdjMDAwMTExLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJMCwJCUQzMgl9LAoreyJjbXBndS5sZS5vYiIsICJkLHMsdCIsIDB4N2MwMDAxOTUsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImNtcGd1LmxlLnFiIiwgImQscyx0IiwgMHg3YzAwMDE5MSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3siY21wZ3UubHQub2IiLCAiZCxzLHQiLCAweDdjMDAwMTU1LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJjbXBndS5sdC5xYiIsICJkLHMsdCIsIDB4N2MwMDAxNTEsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImNtcC5sZS5waCIsICJzLHQiLAkweDdjMDAwMjkxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImNtcC5sZS5wdyIsICJzLHQiLAkweDdjMDAwNDk1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcC5sZS5xaCIsICJzLHQiLAkweDdjMDAwMjk1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcC5sdC5waCIsICJzLHQiLAkweDdjMDAwMjUxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImNtcC5sdC5wdyIsICJzLHQiLAkweDdjMDAwNDU1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcC5sdC5xaCIsICJzLHQiLAkweDdjMDAwMjU1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcHUuZXEub2IiLCAicyx0IiwJMHg3YzAwMDAxNSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJjbXB1LmVxLnFiIiwgInMsdCIsCTB4N2MwMDAwMTEsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3siY21wdS5sZS5vYiIsICJzLHQiLAkweDdjMDAwMDk1LCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7ImNtcHUubGUucWIiLCAicyx0IiwJMHg3YzAwMDA5MSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJjbXB1Lmx0Lm9iIiwgInMsdCIsCTB4N2MwMDAwNTUsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3siY21wdS5sdC5xYiIsICJzLHQiLAkweDdjMDAwMDUxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7ImRleHRwZHAiLCAidCw3LDYiLAkweDdjMDAwMmJjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8RFNQX1ZPTEEsCTAsCQlENjQJfSwKK3siZGV4dHBkcHYiLCAidCw3LHMiLAkweDdjMDAwMmZjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfc3xEU1BfVk9MQSwgMCwJCUQ2NAl9LAoreyJkZXh0cCIsICAgInQsNyw2IiwJMHg3YzAwMDBiYywgMHhmYzAwZTdmZiwgV1JfdHxSRF9hLAkJMCwJCUQ2NAl9LAoreyJkZXh0cHYiLCAgInQsNyxzIiwJMHg3YzAwMDBmYywgMHhmYzAwZTdmZiwgV1JfdHxSRF9hfFJEX3MsCQkwLAkJRDY0CX0sCit7ImRleHRyLmwiLCAidCw3LDYiLAkweDdjMDAwNDNjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2EsCQkwLAkJRDY0CX0sCit7ImRleHRyX3IubCIsICJ0LDcsNiIsCTB4N2MwMDA1M2MsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlENjQJfSwKK3siZGV4dHJfcnMubCIsICJ0LDcsNiIsCTB4N2MwMDA1YmMsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlENjQJfSwKK3siZGV4dHJfcnMudyIsICJ0LDcsNiIsCTB4N2MwMDAxYmMsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlENjQJfSwKK3siZGV4dHJfci53IiwgInQsNyw2IiwJMHg3YzAwMDEzYywgMHhmYzAwZTdmZiwgV1JfdHxSRF9hLAkJMCwJCUQ2NAl9LAoreyJkZXh0cl9zLmgiLCAidCw3LDYiLAkweDdjMDAwM2JjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2EsCQkwLAkJRDY0CX0sCit7ImRleHRydi5sIiwgInQsNyxzIiwJMHg3YzAwMDQ3YywgMHhmYzAwZTdmZiwgV1JfdHxSRF9hfFJEX3MsCQkwLAkJRDY0CX0sCit7ImRleHRydl9yLmwiLCAidCw3LHMiLAkweDdjMDAwNTdjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfcywJCTAsCQlENjQJfSwKK3siZGV4dHJ2X3JzLmwiLCAidCw3LHMiLCAweDdjMDAwNWZjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfcywJMCwJCUQ2NAl9LAoreyJkZXh0cnZfcnMudyIsICJ0LDcscyIsIDB4N2MwMDAxZmMsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxSRF9zLAkwLAkJRDY0CX0sCit7ImRleHRydl9yLnciLCAidCw3LHMiLAkweDdjMDAwMTdjLCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfcywJCTAsCQlENjQJfSwKK3siZGV4dHJ2X3MuaCIsICJ0LDcscyIsCTB4N2MwMDAzZmMsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxSRF9zLAkJMCwJCUQ2NAl9LAoreyJkZXh0cnYudyIsICJ0LDcscyIsCTB4N2MwMDAwN2MsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxSRF9zLAkJMCwJCUQ2NAl9LAoreyJkZXh0ci53IiwgInQsNyw2IiwJMHg3YzAwMDAzYywgMHhmYzAwZTdmZiwgV1JfdHxSRF9hLAkJMCwJCUQ2NAl9LAoreyJkaW5zdiIsICAgInQscyIsCTB4N2MwMDAwMGQsIDB4ZmMwMGZmZmYsIFdSX3R8UkRfcywJCTAsCQlENjQJfSwKK3siZG1hZGQiLCAgICI3LHMsdCIsCTB4N2MwMDA2NzQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJkbWFkZHUiLCAgIjcscyx0IiwJMHg3YzAwMDc3NCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImRtc3ViIiwgICAiNyxzLHQiLAkweDdjMDAwNmY0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3siZG1zdWJ1IiwgICI3LHMsdCIsCTB4N2MwMDA3ZjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJkbXRobGlwIiwgInMsNyIsCTB4N2MwMDA3ZmMsIDB4ZmMxZmU3ZmYsIFJEX3N8TU9EX2F8RFNQX1ZPTEEsCTAsCQlENjQJfSwKK3siZHBhcV9zYS5sLnB3IiwgIjcscyx0IiwgMHg3YzAwMDMzNCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImRwYXFfc2EubC53IiwgIjcscyx0IiwgMHg3YzAwMDMzMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwYXFfcy53LnBoIiwgIjcscyx0IiwgMHg3YzAwMDEzMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwYXFfcy53LnFoIiwgIjcscyx0IiwgMHg3YzAwMDEzNCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImRwYXUuaC5vYmwiLCAiNyxzLHQiLAkweDdjMDAwMGY0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3siZHBhdS5oLm9iciIsICI3LHMsdCIsCTB4N2MwMDAxZjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJkcGF1LmgucWJsIiwgIjcscyx0IiwJMHg3YzAwMDBmMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwYXUuaC5xYnIiLCAiNyxzLHQiLAkweDdjMDAwMWYwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3siZHBzcV9zYS5sLnB3IiwgIjcscyx0IiwgMHg3YzAwMDM3NCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImRwc3Ffc2EubC53IiwgIjcscyx0IiwgMHg3YzAwMDM3MCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwc3Ffcy53LnBoIiwgIjcscyx0IiwgMHg3YzAwMDE3MCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwc3Ffcy53LnFoIiwgIjcscyx0IiwgMHg3YzAwMDE3NCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7ImRwc3UuaC5vYmwiLCAiNyxzLHQiLAkweDdjMDAwMmY0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3siZHBzdS5oLm9iciIsICI3LHMsdCIsCTB4N2MwMDAzZjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJkcHN1LmgucWJsIiwgIjcscyx0IiwJMHg3YzAwMDJmMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7ImRwc3UuaC5xYnIiLCAiNyxzLHQiLAkweDdjMDAwM2YwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3siZHNoaWxvIiwgICI3LDoiLAkweDdjMDAwNmJjLCAweGZjMDdlN2ZmLCBNT0RfYSwJCQkwLAkJRDY0CX0sCit7ImRzaGlsb3YiLCAiNyxzIiwJMHg3YzAwMDZmYywgMHhmYzFmZTdmZiwgTU9EX2F8UkRfcywJCTAsCQlENjQJfSwKK3siZXh0cGRwIiwgICJ0LDcsNiIsCTB4N2MwMDAyYjgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxEU1BfVk9MQSwJMCwJCUQzMgl9LAoreyJleHRwZHB2IiwgInQsNyxzIiwJMHg3YzAwMDJmOCwgMHhmYzAwZTdmZiwgV1JfdHxSRF9hfFJEX3N8RFNQX1ZPTEEsIDAsCQlEMzIJfSwKK3siZXh0cCIsICAgICJ0LDcsNiIsCTB4N2MwMDAwYjgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlEMzIJfSwKK3siZXh0cHYiLCAgICJ0LDcscyIsCTB4N2MwMDAwZjgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxSRF9zLAkJMCwJCUQzMgl9LAoreyJleHRyX3JzLnciLCAidCw3LDYiLAkweDdjMDAwMWI4LCAweGZjMDBlN2ZmLCBXUl90fFJEX2EsCQkwLAkJRDMyCX0sCit7ImV4dHJfci53IiwgInQsNyw2IiwJMHg3YzAwMDEzOCwgMHhmYzAwZTdmZiwgV1JfdHxSRF9hLAkJMCwJCUQzMgl9LAoreyJleHRyX3MuaCIsICJ0LDcsNiIsCTB4N2MwMDAzYjgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlEMzIJfSwKK3siZXh0cnZfcnMudyIsICJ0LDcscyIsCTB4N2MwMDAxZjgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYXxSRF9zLAkJMCwJCUQzMgl9LAoreyJleHRydl9yLnciLCAidCw3LHMiLAkweDdjMDAwMTc4LCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfcywJCTAsCQlEMzIJfSwKK3siZXh0cnZfcy5oIiwgInQsNyxzIiwJMHg3YzAwMDNmOCwgMHhmYzAwZTdmZiwgV1JfdHxSRF9hfFJEX3MsCQkwLAkJRDMyCX0sCit7ImV4dHJ2LnciLCAidCw3LHMiLAkweDdjMDAwMDc4LCAweGZjMDBlN2ZmLCBXUl90fFJEX2F8UkRfcywJCTAsCQlEMzIJfSwKK3siZXh0ci53IiwgICJ0LDcsNiIsCTB4N2MwMDAwMzgsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfYSwJCTAsCQlEMzIJfSwKK3siaW5zdiIsICAgICJ0LHMiLAkweDdjMDAwMDBjLCAweGZjMDBmZmZmLCBXUl90fFJEX3MsCQkwLAkJRDMyCX0sCit7ImxidXgiLCAgICAiZCx0KGIpIiwJMHg3YzAwMDE4YSwgMHhmYzAwMDdmZiwgTEREfFdSX2R8UkRfdHxSRF9iLAkwLAkJRDMyCX0sCit7ImxkeCIsICAgICAiZCx0KGIpIiwJMHg3YzAwMDIwYSwgMHhmYzAwMDdmZiwgTEREfFdSX2R8UkRfdHxSRF9iLAkwLAkJRDY0CX0sCit7ImxoeCIsICAgICAiZCx0KGIpIiwJMHg3YzAwMDEwYSwgMHhmYzAwMDdmZiwgTEREfFdSX2R8UkRfdHxSRF9iLAkwLAkJRDMyCX0sCit7Imx3eCIsICAgICAiZCx0KGIpIiwJMHg3YzAwMDAwYSwgMHhmYzAwMDdmZiwgTEREfFdSX2R8UkRfdHxSRF9iLAkwLAkJRDMyCX0sCit7Im1hcV9zYS53LnBobCIsICI3LHMsdCIsIDB4N2MwMDA0MzAsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQzMgl9LAoreyJtYXFfc2Eudy5waHIiLCAiNyxzLHQiLCAweDdjMDAwNGIwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3sibWFxX3NhLncucWhsbCIsICI3LHMsdCIsIDB4N2MwMDA0MzQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtYXFfc2Eudy5xaGxyIiwgIjcscyx0IiwgMHg3YzAwMDQ3NCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7Im1hcV9zYS53LnFocmwiLCAiNyxzLHQiLCAweDdjMDAwNGI0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sibWFxX3NhLncucWhyciIsICI3LHMsdCIsIDB4N2MwMDA0ZjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtYXFfcy5sLnB3bCIsICI3LHMsdCIsIDB4N2MwMDA3MzQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtYXFfcy5sLnB3ciIsICI3LHMsdCIsIDB4N2MwMDA3YjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtYXFfcy53LnBobCIsICI3LHMsdCIsIDB4N2MwMDA1MzAsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQzMgl9LAoreyJtYXFfcy53LnBociIsICI3LHMsdCIsIDB4N2MwMDA1YjAsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQzMgl9LAoreyJtYXFfcy53LnFobGwiLCAiNyxzLHQiLCAweDdjMDAwNTM0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sibWFxX3Mudy5xaGxyIiwgIjcscyx0IiwgMHg3YzAwMDU3NCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7Im1hcV9zLncucWhybCIsICI3LHMsdCIsIDB4N2MwMDA1YjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtYXFfcy53LnFocnIiLCAiNyxzLHQiLCAweDdjMDAwNWY0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sibW9kc3ViIiwgICJkLHMsdCIsCTB4N2MwMDA0OTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJtdGhsaXAiLCAgInMsNyIsCTB4N2MwMDA3ZjgsIDB4ZmMxZmU3ZmYsIFJEX3N8TU9EX2F8RFNQX1ZPTEEsCTAsCQlEMzIJfSwKK3sibXVsZXFfcy5wdy5xaGwiLCAiZCxzLHQiLCAweDdjMDAwNzE0LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISUxPLCAwLAkJRDY0CX0sCit7Im11bGVxX3MucHcucWhyIiwgImQscyx0IiwgMHg3YzAwMDc1NCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwJCUQ2NAl9LAoreyJtdWxlcV9zLncucGhsIiwgImQscyx0IiwgMHg3YzAwMDcxMCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwJCUQzMgl9LAoreyJtdWxlcV9zLncucGhyIiwgImQscyx0IiwgMHg3YzAwMDc1MCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwJCUQzMgl9LAoreyJtdWxldV9zLnBoLnFibCIsICJkLHMsdCIsIDB4N2MwMDAxOTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJTE8sIDAsCQlEMzIJfSwKK3sibXVsZXVfcy5waC5xYnIiLCAiZCxzLHQiLCAweDdjMDAwMWQwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISUxPLCAwLAkJRDMyCX0sCit7Im11bGV1X3MucWgub2JsIiwgImQscyx0IiwgMHg3YzAwMDE5NCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwJCUQ2NAl9LAoreyJtdWxldV9zLnFoLm9iciIsICJkLHMsdCIsIDB4N2MwMDAxZDQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJTE8sIDAsCQlENjQJfSwKK3sibXVscV9ycy5waCIsICJkLHMsdCIsCTB4N2MwMDA3ZDAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJTE8sCTAsCQlEMzIJfSwKK3sibXVscV9ycy5xaCIsICJkLHMsdCIsCTB4N2MwMDA3ZDQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJTE8sCTAsCQlENjQJfSwKK3sibXVsc2FxX3MubC5wdyIsICI3LHMsdCIsIDB4N2MwMDAzYjQsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwJCUQ2NAl9LAoreyJtdWxzYXFfcy53LnBoIiwgIjcscyx0IiwgMHg3YzAwMDFiMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7Im11bHNhcV9zLncucWgiLCAiNyxzLHQiLCAweDdjMDAwMWI0LCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sicGFja3JsLnBoIiwgImQscyx0IiwJMHg3YzAwMDM5MSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7InBhY2tybC5wdyIsICJkLHMsdCIsCTB4N2MwMDAzOTUsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJwaWNrLm9iIiwgImQscyx0IiwJMHg3YzAwMDBkNSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InBpY2sucGgiLCAiZCxzLHQiLAkweDdjMDAwMmQxLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3sicGljay5wdyIsICJkLHMsdCIsCTB4N2MwMDA0ZDUsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJwaWNrLnFiIiwgImQscyx0IiwJMHg3YzAwMDBkMSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7InBpY2sucWgiLCAiZCxzLHQiLAkweDdjMDAwMmQ1LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY2VxLnB3LnFobGEiLCAiZCx0IiwgMHg3YzAwMDM5NiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXEucHcucWhsIiwgImQsdCIsIDB4N2MwMDAzMTYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY2VxLnB3LnFocmEiLCAiZCx0IiwgMHg3YzAwMDNkNiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXEucHcucWhyIiwgImQsdCIsIDB4N2MwMDAzNTYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY2VxLnMubC5wd2wiLCAiZCx0IiwgMHg3YzAwMDUxNiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXEucy5sLnB3ciIsICJkLHQiLCAweDdjMDAwNTU2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InByZWNlcXUucGgucWJsYSIsICJkLHQiLCAweDdjMDAwMTkyLCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7InByZWNlcXUucGgucWJsIiwgImQsdCIsIDB4N2MwMDAxMTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2VxdS5waC5xYnJhIiwgImQsdCIsIDB4N2MwMDAxZDIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2VxdS5waC5xYnIiLCAiZCx0IiwgMHg3YzAwMDE1MiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJwcmVjZXF1LnB3LnFobGEiLCAiZCx0IiwgMHg3YzAwMDE5NiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXF1LnB3LnFobCIsICJkLHQiLCAweDdjMDAwMTE2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InByZWNlcXUucHcucWhyYSIsICJkLHQiLCAweDdjMDAwMWQ2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InByZWNlcXUucHcucWhyIiwgImQsdCIsIDB4N2MwMDAxNTYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY2VxLncucGhsIiwgImQsdCIsCTB4N2MwMDAzMTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2VxLncucGhyIiwgImQsdCIsCTB4N2MwMDAzNTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2V1LnBoLnFibGEiLCAiZCx0IiwgMHg3YzAwMDc5MiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJwcmVjZXUucGgucWJsIiwgImQsdCIsIDB4N2MwMDA3MTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2V1LnBoLnFicmEiLCAiZCx0IiwgMHg3YzAwMDdkMiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJwcmVjZXUucGgucWJyIiwgImQsdCIsIDB4N2MwMDA3NTIsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sicHJlY2V1LnFoLm9ibGEiLCAiZCx0IiwgMHg3YzAwMDc5NiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXUucWgub2JsIiwgImQsdCIsIDB4N2MwMDA3MTYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY2V1LnFoLm9icmEiLCAiZCx0IiwgMHg3YzAwMDdkNiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJwcmVjZXUucWgub2JyIiwgImQsdCIsIDB4N2MwMDA3NTYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicHJlY3JxLm9iLnFoIiwgImQscyx0IiwgMHg3YzAwMDMxNSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sicHJlY3JxLnBoLnciLCAiZCxzLHQiLCAweDdjMDAwNTExLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJMCwJCUQzMgl9LAoreyJwcmVjcnEucHcubCIsICJkLHMsdCIsIDB4N2MwMDA3MTUsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7InByZWNycS5xYi5waCIsICJkLHMsdCIsIDB4N2MwMDAzMTEsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkwLAkJRDMyCX0sCit7InByZWNycS5xaC5wdyIsICJkLHMsdCIsIDB4N2MwMDA1MTUsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkwLAkJRDY0CX0sCit7InByZWNycV9ycy5waC53IiwgImQscyx0IiwgMHg3YzAwMDU1MSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3sicHJlY3JxX3JzLnFoLnB3IiwgImQscyx0IiwgMHg3YzAwMDU1NSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sicHJlY3JxdV9zLm9iLnFoIiwgImQscyx0IiwgMHg3YzAwMDNkNSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlENjQJfSwKK3sicHJlY3JxdV9zLnFiLnBoIiwgImQscyx0IiwgMHg3YzAwMDNkMSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCTAsCQlEMzIJfSwKK3sicmFkZHUubC5vYiIsICJkLHMiLAkweDdjMDAwNTE0LCAweGZjMWYwN2ZmLCBXUl9kfFJEX3MsCQkwLAkJRDY0CX0sCit7InJhZGR1LncucWIiLCAiZCxzIiwJMHg3YzAwMDUxMCwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAkJMCwJCUQzMgl9LAoreyJyZGRzcCIsICAgImQiLAkweDdmZmYwNGI4LCAweGZmZmYwN2ZmLCBXUl9kLAkJCTAsCQlEMzIJfSwKK3sicmRkc3AiLCAgICJkLCciLAkweDdjMDAwNGI4LCAweGZmYzAwN2ZmLCBXUl9kLAkJCTAsCQlEMzIJfSwKK3sicmVwbC5vYiIsICJkLDUiLAkweDdjMDAwMDk2LCAweGZmMDAwN2ZmLCBXUl9kLAkJCTAsCQlENjQJfSwKK3sicmVwbC5waCIsICJkLEAiLAkweDdjMDAwMjkyLCAweGZjMDAwN2ZmLCBXUl9kLAkJCTAsCQlEMzIJfSwKK3sicmVwbC5wdyIsICJkLEAiLAkweDdjMDAwNDk2LCAweGZjMDAwN2ZmLCBXUl9kLAkJCTAsCQlENjQJfSwKK3sicmVwbC5xYiIsICJkLDUiLAkweDdjMDAwMDkyLCAweGZmMDAwN2ZmLCBXUl9kLAkJCTAsCQlEMzIJfSwKK3sicmVwbC5xaCIsICJkLEAiLAkweDdjMDAwMjk2LCAweGZjMDAwN2ZmLCBXUl9kLAkJCTAsCQlENjQJfSwKK3sicmVwbHYub2IiLCAiZCx0IiwJMHg3YzAwMDBkNiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJyZXBsdi5waCIsICJkLHQiLAkweDdjMDAwMmQyLCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7InJlcGx2LnB3IiwgImQsdCIsCTB4N2MwMDA0ZDYsIDB4ZmZlMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sicmVwbHYucWIiLCAiZCx0IiwJMHg3YzAwMDBkMiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJyZXBsdi5xaCIsICJkLHQiLAkweDdjMDAwMmQ2LCAweGZmZTAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNoaWxvIiwgICAiNywwIiwJMHg3YzAwMDZiOCwgMHhmYzBmZTdmZiwgTU9EX2EsCQkJMCwJCUQzMgl9LAoreyJzaGlsb3YiLCAgIjcscyIsCTB4N2MwMDA2ZjgsIDB4ZmMxZmU3ZmYsIE1PRF9hfFJEX3MsCQkwLAkJRDMyCX0sCit7InNobGwub2IiLCAiZCx0LDMiLAkweDdjMDAwMDE3LCAweGZmMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNobGwucGgiLCAiZCx0LDQiLAkweDdjMDAwMjEzLCAweGZlMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7InNobGwucHciLCAiZCx0LDYiLAkweDdjMDAwNDE3LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNobGwucWIiLCAiZCx0LDMiLAkweDdjMDAwMDEzLCAweGZmMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7InNobGwucWgiLCAiZCx0LDQiLAkweDdjMDAwMjE3LCAweGZlMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNobGxfcy5waCIsICJkLHQsNCIsCTB4N2MwMDAzMTMsIDB4ZmUwMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sic2hsbF9zLnB3IiwgImQsdCw2IiwJMHg3YzAwMDUxNywgMHhmYzAwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJzaGxsX3MucWgiLCAiZCx0LDQiLAkweDdjMDAwMzE3LCAweGZlMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNobGxfcy53IiwgImQsdCw2IiwJMHg3YzAwMDUxMywgMHhmYzAwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJzaGxsdi5vYiIsICJkLHQscyIsCTB4N2MwMDAwOTcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaGxsdi5waCIsICJkLHQscyIsCTB4N2MwMDAyOTMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJzaGxsdi5wdyIsICJkLHQscyIsCTB4N2MwMDA0OTcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaGxsdi5xYiIsICJkLHQscyIsCTB4N2MwMDAwOTMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJzaGxsdi5xaCIsICJkLHQscyIsCTB4N2MwMDAyOTcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaGxsdl9zLnBoIiwgImQsdCxzIiwJMHg3YzAwMDM5MywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7InNobGx2X3MucHciLCAiZCx0LHMiLAkweDdjMDAwNTk3LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3sic2hsbHZfcy5xaCIsICJkLHQscyIsCTB4N2MwMDAzOTcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaGxsdl9zLnciLCAiZCx0LHMiLAkweDdjMDAwNTkzLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3sic2hyYS5waCIsICJkLHQsNCIsCTB4N2MwMDAyNTMsIDB4ZmUwMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlEMzIJfSwKK3sic2hyYS5wdyIsICJkLHQsNiIsCTB4N2MwMDA0NTcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sic2hyYS5xaCIsICJkLHQsNCIsCTB4N2MwMDAyNTcsIDB4ZmUwMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sic2hyYV9yLnBoIiwgImQsdCw0IiwJMHg3YzAwMDM1MywgMHhmZTAwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJzaHJhX3IucHciLCAiZCx0LDYiLAkweDdjMDAwNTU3LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDY0CX0sCit7InNocmFfci5xaCIsICJkLHQsNCIsCTB4N2MwMDAzNTcsIDB4ZmUwMDA3ZmYsIFdSX2R8UkRfdCwJCTAsCQlENjQJfSwKK3sic2hyYV9yLnciLCAiZCx0LDYiLAkweDdjMDAwNTUzLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3QsCQkwLAkJRDMyCX0sCit7InNocmF2LnBoIiwgImQsdCxzIiwJMHg3YzAwMDJkMywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7InNocmF2LnB3IiwgImQsdCxzIiwJMHg3YzAwMDRkNywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InNocmF2LnFoIiwgImQsdCxzIiwJMHg3YzAwMDJkNywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InNocmF2X3IucGgiLCAiZCx0LHMiLAkweDdjMDAwM2QzLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3sic2hyYXZfci5wdyIsICJkLHQscyIsCTB4N2MwMDA1ZDcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaHJhdl9yLnFoIiwgImQsdCxzIiwJMHg3YzAwMDNkNywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InNocmF2X3IudyIsICJkLHQscyIsCTB4N2MwMDA1ZDMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJzaHJsLm9iIiwgImQsdCwzIiwJMHg3YzAwMDA1NywgMHhmZjAwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQ2NAl9LAoreyJzaHJsLnFiIiwgImQsdCwzIiwJMHg3YzAwMDA1MywgMHhmZjAwMDdmZiwgV1JfZHxSRF90LAkJMCwJCUQzMgl9LAoreyJzaHJsdi5vYiIsICJkLHQscyIsCTB4N2MwMDAwZDcsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzaHJsdi5xYiIsICJkLHQscyIsCTB4N2MwMDAwZDMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJzdWJxLnBoIiwgImQscyx0IiwJMHg3YzAwMDJkMCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDMyCX0sCit7InN1YnEucHciLCAiZCxzLHQiLAkweDdjMDAwNGQ0LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlENjQJfSwKK3sic3VicS5xaCIsICJkLHMsdCIsCTB4N2MwMDAyZDQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzdWJxX3MucGgiLCAiZCxzLHQiLAkweDdjMDAwM2QwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3sic3VicV9zLnB3IiwgImQscyx0IiwJMHg3YzAwMDVkNCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InN1YnFfcy5xaCIsICJkLHMsdCIsCTB4N2MwMDAzZDQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQ2NAl9LAoreyJzdWJxX3MudyIsICJkLHMsdCIsCTB4N2MwMDA1ZDAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJzdWJ1Lm9iIiwgImQscyx0IiwJMHg3YzAwMDA1NCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InN1YnUucWIiLCAiZCxzLHQiLAkweDdjMDAwMDUwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsCQlEMzIJfSwKK3sic3VidV9zLm9iIiwgImQscyx0IiwJMHg3YzAwMDE1NCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLAkJRDY0CX0sCit7InN1YnVfcy5xYiIsICJkLHMsdCIsCTB4N2MwMDAxNTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwJCUQzMgl9LAoreyJ3cmRzcCIsICAgInMiLAkweDdjMWZmY2Y4LCAweGZjMWZmZmZmLCBSRF9zfERTUF9WT0xBLAkJMCwJCUQzMgl9LAoreyJ3cmRzcCIsICAgInMsOCIsCTB4N2MwMDA0ZjgsIDB4ZmMxZTA3ZmYsIFJEX3N8RFNQX1ZPTEEsCQkwLAkJRDMyCX0sCisvKiBNSVBTIERTUCBBU0UgUmV2MiAqLworeyJhYnNxX3MucWIiLCAiZCx0IiwJMHg3YzAwMDA1MiwgMHhmZmUwMDdmZiwgV1JfZHxSRF90LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJhZGR1LnBoIiwgImQscyx0IiwJMHg3YzAwMDIxMCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJhZGR1X3MucGgiLCAiZCxzLHQiLAkweDdjMDAwMzEwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwgICAgICAgICAwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImFkZHVoLnFiIiwgImQscyx0IiwJMHg3YzAwMDAxOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJhZGR1aF9yLnFiIiwgImQscyx0IiwJMHg3YzAwMDA5OCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJhcHBlbmQiLCAgInQscyxoIiwJMHg3YzAwMDAzMSwgMHhmYzAwMDdmZiwgV1JfdHxSRF90fFJEX3MsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJiYWxpZ24iLCAgInQscyxJIiwJMCwgICAgKGludCkgTV9CQUxJR04sCUlOU05fTUFDUk8sICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siYmFsaWduIiwgICJ0LHMsMiIsCTB4N2MwMDA0MzEsIDB4ZmMwMGU3ZmYsIFdSX3R8UkRfdHxSRF9zLCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siY21wZ2R1LmVxLnFiIiwgImQscyx0IiwgMHg3YzAwMDYxMSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siY21wZ2R1Lmx0LnFiIiwgImQscyx0IiwgMHg3YzAwMDY1MSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siY21wZ2R1LmxlLnFiIiwgImQscyx0IiwgMHg3YzAwMDY5MSwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siZHBhLncucGgiLCAiNyxzLHQiLAkweDdjMDAwMDMwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsICAgICAgICAwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImRwcy53LnBoIiwgIjcscyx0IiwJMHg3YzAwMDA3MCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LCAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJtdWwucGgiLCAgImQscyx0IiwJMHg3YzAwMDMxOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJtdWxfcy5waCIsICJkLHMsdCIsCTB4N2MwMDAzOTgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90fFdSX0hJTE8sIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sibXVscV9ycy53IiwgImQscyx0IiwJMHg3YzAwMDVkOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJtdWxxX3MucGgiLCAiZCxzLHQiLAkweDdjMDAwNzkwLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISUxPLCAwLCAgICAgICAgICAgICAgRDMzCX0sCit7Im11bHFfcy53IiwgImQscyx0IiwJMHg3YzAwMDU5OCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3R8V1JfSElMTywgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJtdWxzYS53LnBoIiwgIjcscyx0IiwJMHg3YzAwMDBiMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LCAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJwcmVjci5xYi5waCIsICJkLHMsdCIsIDB4N2MwMDAzNTEsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LCAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJwcmVjcl9zcmEucGgudyIsICJ0LHMsaCIsIDB4N2MwMDA3OTEsIDB4ZmMwMDA3ZmYsIFdSX3R8UkRfdHxSRF9zLCAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJwcmVjcl9zcmFfci5waC53IiwgInQscyxoIiwgMHg3YzAwMDdkMSwgMHhmYzAwMDdmZiwgV1JfdHxSRF90fFJEX3MsICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJwcmVwZW5kIiwgInQscyxoIiwJMHg3YzAwMDA3MSwgMHhmYzAwMDdmZiwgV1JfdHxSRF90fFJEX3MsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzaHJhLnFiIiwgImQsdCwzIiwJMHg3YzAwMDExMywgMHhmZjAwMDdmZiwgV1JfZHxSRF90LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzaHJhX3IucWIiLCAiZCx0LDMiLAkweDdjMDAwMTUzLCAweGZmMDAwN2ZmLCBXUl9kfFJEX3QsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgRDMzCX0sCit7InNocmF2LnFiIiwgImQsdCxzIiwJMHg3YzAwMDE5MywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzaHJhdl9yLnFiIiwgImQsdCxzIiwJMHg3YzAwMDFkMywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzaHJsLnBoIiwgImQsdCw0IiwJMHg3YzAwMDY1MywgMHhmZTAwMDdmZiwgV1JfZHxSRF90LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzaHJsdi5waCIsICJkLHQscyIsCTB4N2MwMDA2ZDMsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sic3VidS5waCIsICJkLHMsdCIsCTB4N2MwMDAyNTAsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sic3VidV9zLnBoIiwgImQscyx0IiwJMHg3YzAwMDM1MCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsICAgICAgICAgMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzdWJ1aC5xYiIsICJkLHMsdCIsCTB4N2MwMDAwNTgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3sic3VidWhfci5xYiIsICJkLHMsdCIsCTB4N2MwMDAwZDgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LCAgICAgICAgIDAsICAgICAgICAgICAgICBEMzMJfSwKK3siYWRkcWgucGgiLCAiZCxzLHQiLAkweDdjMDAwMjE4LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsICAgICAgICAgICAgICBEMzMJfSwKK3siYWRkcWhfci5waCIsICJkLHMsdCIsCTB4N2MwMDAyOTgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJhZGRxaC53IiwgImQscyx0IiwJMHg3YzAwMDQxOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImFkZHFoX3IudyIsICJkLHMsdCIsCTB4N2MwMDA0OTgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzdWJxaC5waCIsICJkLHMsdCIsCTB4N2MwMDAyNTgsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAkJMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJzdWJxaF9yLnBoIiwgImQscyx0IiwJMHg3YzAwMDJkOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLCAgICAgICAgICAgICAgRDMzCX0sCit7InN1YnFoLnciLCAiZCxzLHQiLAkweDdjMDAwNDU4LCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdCwJCTAsICAgICAgICAgICAgICBEMzMJfSwKK3sic3VicWhfci53IiwgImQscyx0IiwJMHg3YzAwMDRkOCwgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCQkwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImRwYXgudy5waCIsICI3LHMsdCIsCTB4N2MwMDAyMzAsIDB4ZmMwMGU3ZmYsIE1PRF9hfFJEX3N8UkRfdCwJMCwgICAgICAgICAgICAgIEQzMwl9LAoreyJkcHN4LncucGgiLCAiNyxzLHQiLAkweDdjMDAwMjcwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsICAgICAgICAgICAgICBEMzMJfSwKK3siZHBhcXhfcy53LnBoIiwgIjcscyx0IiwgMHg3YzAwMDYzMCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImRwYXF4X3NhLncucGgiLCAiNyxzLHQiLCAweDdjMDAwNmIwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsICAgICAgICAgICAgICBEMzMJfSwKK3siZHBzcXhfcy53LnBoIiwgIjcscyx0IiwgMHg3YzAwMDY3MCwgMHhmYzAwZTdmZiwgTU9EX2F8UkRfc3xSRF90LAkwLCAgICAgICAgICAgICAgRDMzCX0sCit7ImRwc3F4X3NhLncucGgiLCAiNyxzLHQiLCAweDdjMDAwNmYwLCAweGZjMDBlN2ZmLCBNT0RfYXxSRF9zfFJEX3QsCTAsICAgICAgICAgICAgICBEMzMJfSwKKy8qIE1vdmUgYmMwKiBhZnRlciBtZnRyIGFuZCBtdHRyIHRvIGF2b2lkIG9wY29kZSBjb2xsaXNpb24uICAqLworeyJiYzBmIiwgICAgInAiLAkweDQxMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCQkwLAkJSTEJfSwKK3siYmMwZmwiLCAgICJwIiwJMHg0MTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAkJMCwJCUkyfFQzCX0sCit7ImJjMHQiLCAgICAicCIsCTB4NDEwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJCTAsCQlJMQl9LAoreyJiYzB0bCIsICAgInAiLAkweDQxMDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCQkwLAkJSTJ8VDMJfSwKKy8qIFNUIE1pY3JvZWxlY3Ryb25pY3MgTG9vbmdzb24tMkUgYW5kIC0yRi4gICovCit7Im11bHQuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMTgsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7Im11bHQuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMTAsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7Im11bHR1LmciLAkiZCxzLHQiLAkweDdjMDAwMDE5LAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRQl9LAoreyJtdWx0dS5nIiwJImQscyx0IiwJMHg3MDAwMDAxMiwJMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX2QsCTAsCUlMMkYJfSwKK3siZG11bHQuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMWMsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7ImRtdWx0LmciLAkiZCxzLHQiLAkweDcwMDAwMDExLAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRgl9LAoreyJkbXVsdHUuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMWQsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7ImRtdWx0dS5nIiwJImQscyx0IiwJMHg3MDAwMDAxMywJMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX2QsCTAsCUlMMkYJfSwKK3siZGl2LmciLAkiZCxzLHQiLAkweDdjMDAwMDFhLAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRQl9LAoreyJkaXYuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMTQsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7ImRpdnUuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMWIsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7ImRpdnUuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMTYsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7ImRkaXYuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMWUsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7ImRkaXYuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMTUsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7ImRkaXZ1LmciLAkiZCxzLHQiLAkweDdjMDAwMDFmLAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRQl9LAoreyJkZGl2dS5nIiwJImQscyx0IiwJMHg3MDAwMDAxNywJMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX2QsCTAsCUlMMkYJfSwKK3sibW9kLmciLAkiZCxzLHQiLAkweDdjMDAwMDIyLAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRQl9LAoreyJtb2QuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMWMsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7Im1vZHUuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMjMsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7Im1vZHUuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMWUsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7ImRtb2QuZyIsCSJkLHMsdCIsCTB4N2MwMDAwMjYsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJFCX0sCit7ImRtb2QuZyIsCSJkLHMsdCIsCTB4NzAwMDAwMWQsCTB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9kLAkwLAlJTDJGCX0sCit7ImRtb2R1LmciLAkiZCxzLHQiLAkweDdjMDAwMDI3LAkweGZjMDAwN2ZmLAlSRF9zfFJEX3R8V1JfZCwJMCwJSUwyRQl9LAoreyJkbW9kdS5nIiwJImQscyx0IiwJMHg3MDAwMDAxZiwJMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX2QsCTAsCUlMMkYJfSwKK307CisKKyNkZWZpbmUgTUlQU19OVU1fT1BDT0RFUyBcCisJKChzaXplb2YgbWlwc19idWlsdGluX29wY29kZXMpIC8gKHNpemVvZiAobWlwc19idWlsdGluX29wY29kZXNbMF0pKSkKK2NvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzID0gTUlQU19OVU1fT1BDT0RFUzsKKworLyogY29uc3QgcmVtb3ZlZCBmcm9tIHRoZSBmb2xsb3dpbmcgdG8gYWxsb3cgZm9yIGR5bmFtaWMgZXh0ZW5zaW9ucyB0byB0aGUKKyAqIGJ1aWx0LWluIGluc3RydWN0aW9uIHNldC4gKi8KK3N0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzID0KKyAgKHN0cnVjdCBtaXBzX29wY29kZSAqKSBtaXBzX2J1aWx0aW5fb3Bjb2RlczsKK2ludCBiZmRfbWlwc19udW1fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7CisjdW5kZWYgTUlQU19OVU1fT1BDT0RFUworCisvKiBNaXBzIGluc3RydWN0aW9ucyBhcmUgYXQgbWF4aW11bSB0aGlzIG1hbnkgYnl0ZXMgbG9uZy4gICovCisjZGVmaW5lIElOU05MRU4gNAorCisMCisvKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIHNoYXJlZCB3aXRoIGdkYiBzb21laG93LiAgKi8KKworc3RydWN0IG1pcHNfY3Awc2VsX25hbWUKK3sKKyAgdW5zaWduZWQgaW50IGNwMHJlZzsKKyAgdW5zaWduZWQgaW50IHNlbDsKKyAgY29uc3QgY2hhciAqIGNvbnN0IG5hbWU7Cit9OworCisjaWYgMAorLyogVGhlIG1pcHMxNiByZWdpc3RlcnMuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtaXBzMTZfdG9fMzJfcmVnX21hcFtdID0KK3sKKyAgMTYsIDE3LCAyLCAzLCA0LCA1LCA2LCA3Cit9OworCisjZGVmaW5lIG1pcHMxNl9yZWdfbmFtZXMocm4pCW1pcHNfZ3ByX25hbWVzW21pcHMxNl90b18zMl9yZWdfbWFwW3JuXV0KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZ3ByX25hbWVzX251bWVyaWNbMzJdID0KK3sKKyAgIiQwIiwgICAiJDEiLCAgICIkMiIsICAgIiQzIiwgICAiJDQiLCAgICIkNSIsICAgIiQ2IiwgICAiJDciLAorICAiJDgiLCAgICIkOSIsICAgIiQxMCIsICAiJDExIiwgICIkMTIiLCAgIiQxMyIsICAiJDE0IiwgICIkMTUiLAorICAiJDE2IiwgICIkMTciLCAgIiQxOCIsICAiJDE5IiwgICIkMjAiLCAgIiQyMSIsICAiJDIyIiwgICIkMjMiLAorICAiJDI0IiwgICIkMjUiLCAgIiQyNiIsICAiJDI3IiwgICIkMjgiLCAgIiQyOSIsICAiJDMwIiwgICIkMzEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZ3ByX25hbWVzX29sZGFiaVszMl0gPQoreworICAiemVybyIsICJhdCIsICAgInYwIiwgICAidjEiLCAgICJhMCIsICAgImExIiwgICAiYTIiLCAgICJhMyIsCisgICJ0MCIsICAgInQxIiwgICAidDIiLCAgICJ0MyIsICAgInQ0IiwgICAidDUiLCAgICJ0NiIsICAgInQ3IiwKKyAgInMwIiwgICAiczEiLCAgICJzMiIsICAgInMzIiwgICAiczQiLCAgICJzNSIsICAgInM2IiwgICAiczciLAorICAidDgiLCAgICJ0OSIsICAgImswIiwgICAiazEiLCAgICJncCIsICAgInNwIiwgICAiczgiLCAgICJyYSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19ncHJfbmFtZXNfbmV3YWJpWzMyXSA9Cit7CisgICJ6ZXJvIiwgImF0IiwgICAidjAiLCAgICJ2MSIsICAgImEwIiwgICAiYTEiLCAgICJhMiIsICAgImEzIiwKKyAgImE0IiwgICAiYTUiLCAgICJhNiIsICAgImE3IiwgICAidDAiLCAgICJ0MSIsICAgInQyIiwgICAidDMiLAorICAiczAiLCAgICJzMSIsICAgInMyIiwgICAiczMiLCAgICJzNCIsICAgInM1IiwgICAiczYiLCAgICJzNyIsCisgICJ0OCIsICAgInQ5IiwgICAiazAiLCAgICJrMSIsICAgImdwIiwgICAic3AiLCAgICJzOCIsICAgInJhIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2Zwcl9uYW1lc19udW1lcmljWzMyXSA9Cit7CisgICIkZjAiLCAgIiRmMSIsICAiJGYyIiwgICIkZjMiLCAgIiRmNCIsICAiJGY1IiwgICIkZjYiLCAgIiRmNyIsCisgICIkZjgiLCAgIiRmOSIsICAiJGYxMCIsICIkZjExIiwgIiRmMTIiLCAiJGYxMyIsICIkZjE0IiwgIiRmMTUiLAorICAiJGYxNiIsICIkZjE3IiwgIiRmMTgiLCAiJGYxOSIsICIkZjIwIiwgIiRmMjEiLCAiJGYyMiIsICIkZjIzIiwKKyAgIiRmMjQiLCAiJGYyNSIsICIkZjI2IiwgIiRmMjciLCAiJGYyOCIsICIkZjI5IiwgIiRmMzAiLCAiJGYzMSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19mcHJfbmFtZXNfMzJbMzJdID0KK3sKKyAgImZ2MCIsICAiZnYwZiIsICJmdjEiLCAgImZ2MWYiLCAiZnQwIiwgICJmdDBmIiwgImZ0MSIsICAiZnQxZiIsCisgICJmdDIiLCAgImZ0MmYiLCAiZnQzIiwgICJmdDNmIiwgImZhMCIsICAiZmEwZiIsICJmYTEiLCAgImZhMWYiLAorICAiZnQ0IiwgICJmdDRmIiwgImZ0NSIsICAiZnQ1ZiIsICJmczAiLCAgImZzMGYiLCAiZnMxIiwgICJmczFmIiwKKyAgImZzMiIsICAiZnMyZiIsICJmczMiLCAgImZzM2YiLCAiZnM0IiwgICJmczRmIiwgImZzNSIsICAiZnM1ZiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19mcHJfbmFtZXNfbjMyWzMyXSA9Cit7CisgICJmdjAiLCAgImZ0MTQiLCAiZnYxIiwgICJmdDE1IiwgImZ0MCIsICAiZnQxIiwgICJmdDIiLCAgImZ0MyIsCisgICJmdDQiLCAgImZ0NSIsICAiZnQ2IiwgICJmdDciLCAgImZhMCIsICAiZmExIiwgICJmYTIiLCAgImZhMyIsCisgICJmYTQiLCAgImZhNSIsICAiZmE2IiwgICJmYTciLCAgImZzMCIsICAiZnQ4IiwgICJmczEiLCAgImZ0OSIsCisgICJmczIiLCAgImZ0MTAiLCAiZnMzIiwgICJmdDExIiwgImZzNCIsICAiZnQxMiIsICJmczUiLCAgImZ0MTMiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZnByX25hbWVzXzY0WzMyXSA9Cit7CisgICJmdjAiLCAgImZ0MTIiLCAiZnYxIiwgICJmdDEzIiwgImZ0MCIsICAiZnQxIiwgICJmdDIiLCAgImZ0MyIsCisgICJmdDQiLCAgImZ0NSIsICAiZnQ2IiwgICJmdDciLCAgImZhMCIsICAiZmExIiwgICJmYTIiLCAgImZhMyIsCisgICJmYTQiLCAgImZhNSIsICAiZmE2IiwgICJmYTciLCAgImZ0OCIsICAiZnQ5IiwgICJmdDEwIiwgImZ0MTEiLAorICAiZnMwIiwgICJmczEiLCAgImZzMiIsICAiZnMzIiwgICJmczQiLCAgImZzNSIsICAiZnM2IiwgICJmczciCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfY3AwX25hbWVzX251bWVyaWNbMzJdID0KK3sKKyAgIiQwIiwgICAiJDEiLCAgICIkMiIsICAgIiQzIiwgICAiJDQiLCAgICIkNSIsICAgIiQ2IiwgICAiJDciLAorICAiJDgiLCAgICIkOSIsICAgIiQxMCIsICAiJDExIiwgICIkMTIiLCAgIiQxMyIsICAiJDE0IiwgICIkMTUiLAorICAiJDE2IiwgICIkMTciLCAgIiQxOCIsICAiJDE5IiwgICIkMjAiLCAgIiQyMSIsICAiJDIyIiwgICIkMjMiLAorICAiJDI0IiwgICIkMjUiLCAgIiQyNiIsICAiJDI3IiwgICIkMjgiLCAgIiQyOSIsICAiJDMwIiwgICIkMzEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfY3AwX25hbWVzX21pcHMzMjY0WzMyXSA9Cit7CisgICJjMF9pbmRleCIsICAgICAiYzBfcmFuZG9tIiwgICAgImMwX2VudHJ5bG8wIiwgICJjMF9lbnRyeWxvMSIsCisgICJjMF9jb250ZXh0IiwgICAiYzBfcGFnZW1hc2siLCAgImMwX3dpcmVkIiwgICAgICIkNyIsCisgICJjMF9iYWR2YWRkciIsICAiYzBfY291bnQiLCAgICAgImMwX2VudHJ5aGkiLCAgICJjMF9jb21wYXJlIiwKKyAgImMwX3N0YXR1cyIsICAgICJjMF9jYXVzZSIsICAgICAiYzBfZXBjIiwgICAgICAgImMwX3ByaWQiLAorICAiYzBfY29uZmlnIiwgICAgImMwX2xsYWRkciIsICAgICJjMF93YXRjaGxvIiwgICAiYzBfd2F0Y2hoaSIsCisgICJjMF94Y29udGV4dCIsICAiJDIxIiwgICAgICAgICAgIiQyMiIsICAgICAgICAgICJjMF9kZWJ1ZyIsCisgICJjMF9kZXBjIiwgICAgICAiYzBfcGVyZmNudCIsICAgImMwX2VycmN0bCIsICAgICJjMF9jYWNoZWVyciIsCisgICJjMF90YWdsbyIsICAgICAiYzBfdGFnaGkiLCAgICAgImMwX2Vycm9yZXBjIiwgICJjMF9kZXNhdmUiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX2NwMHNlbF9uYW1lIG1pcHNfY3Awc2VsX25hbWVzX21pcHMzMjY0W10gPQoreworICB7ICA0LCAxLCAiYzBfY29udGV4dGNvbmZpZyIJfSwKKyAgeyAgMCwgMSwgImMwX212cGNvbnRyb2wiCX0sCisgIHsgIDAsIDIsICJjMF9tdnBjb25mMCIJfSwKKyAgeyAgMCwgMywgImMwX212cGNvbmYxIgl9LAorICB7ICAxLCAxLCAiYzBfdnBlY29udHJvbCIJfSwKKyAgeyAgMSwgMiwgImMwX3ZwZWNvbmYwIgl9LAorICB7ICAxLCAzLCAiYzBfdnBlY29uZjEiCX0sCisgIHsgIDEsIDQsICJjMF95cW1hc2siCQl9LAorICB7ICAxLCA1LCAiYzBfdnBlc2NoZWR1bGUiCX0sCisgIHsgIDEsIDYsICJjMF92cGVzY2hlZmJhY2siCX0sCisgIHsgIDIsIDEsICJjMF90Y3N0YXR1cyIJfSwKKyAgeyAgMiwgMiwgImMwX3RjYmluZCIJCX0sCisgIHsgIDIsIDMsICJjMF90Y3Jlc3RhcnQiCX0sCisgIHsgIDIsIDQsICJjMF90Y2hhbHQiCQl9LAorICB7ICAyLCA1LCAiYzBfdGNjb250ZXh0Igl9LAorICB7ICAyLCA2LCAiYzBfdGNzY2hlZHVsZSIJfSwKKyAgeyAgMiwgNywgImMwX3Rjc2NoZWZiYWNrIgl9LAorICB7ICA1LCAxLCAiYzBfcGFnZWdyYWluIgl9LAorICB7ICA2LCAxLCAiYzBfc3JzY29uZjAiCX0sCisgIHsgIDYsIDIsICJjMF9zcnNjb25mMSIJfSwKKyAgeyAgNiwgMywgImMwX3Nyc2NvbmYyIgl9LAorICB7ICA2LCA0LCAiYzBfc3JzY29uZjMiCX0sCisgIHsgIDYsIDUsICJjMF9zcnNjb25mNCIJfSwKKyAgeyAxMiwgMSwgImMwX2ludGN0bCIJCX0sCisgIHsgMTIsIDIsICJjMF9zcnNjdGwiCQl9LAorICB7IDEyLCAzLCAiYzBfc3JzbWFwIgkJfSwKKyAgeyAxNSwgMSwgImMwX2ViYXNlIgkJfSwKKyAgeyAxNiwgMSwgImMwX2NvbmZpZzEiCQl9LAorICB7IDE2LCAyLCAiYzBfY29uZmlnMiIJCX0sCisgIHsgMTYsIDMsICJjMF9jb25maWczIgkJfSwKKyAgeyAxOCwgMSwgImMwX3dhdGNobG8sMSIJfSwKKyAgeyAxOCwgMiwgImMwX3dhdGNobG8sMiIJfSwKKyAgeyAxOCwgMywgImMwX3dhdGNobG8sMyIJfSwKKyAgeyAxOCwgNCwgImMwX3dhdGNobG8sNCIJfSwKKyAgeyAxOCwgNSwgImMwX3dhdGNobG8sNSIJfSwKKyAgeyAxOCwgNiwgImMwX3dhdGNobG8sNiIJfSwKKyAgeyAxOCwgNywgImMwX3dhdGNobG8sNyIJfSwKKyAgeyAxOSwgMSwgImMwX3dhdGNoaGksMSIJfSwKKyAgeyAxOSwgMiwgImMwX3dhdGNoaGksMiIJfSwKKyAgeyAxOSwgMywgImMwX3dhdGNoaGksMyIJfSwKKyAgeyAxOSwgNCwgImMwX3dhdGNoaGksNCIJfSwKKyAgeyAxOSwgNSwgImMwX3dhdGNoaGksNSIJfSwKKyAgeyAxOSwgNiwgImMwX3dhdGNoaGksNiIJfSwKKyAgeyAxOSwgNywgImMwX3dhdGNoaGksNyIJfSwKKyAgeyAyMywgMSwgImMwX3RyYWNlY29udHJvbCIJfSwKKyAgeyAyMywgMiwgImMwX3RyYWNlY29udHJvbDIiCX0sCisgIHsgMjMsIDMsICJjMF91c2VydHJhY2VkYXRhIgl9LAorICB7IDIzLCA0LCAiYzBfdHJhY2VicGMiCX0sCisgIHsgMjUsIDEsICJjMF9wZXJmY250LDEiCX0sCisgIHsgMjUsIDIsICJjMF9wZXJmY250LDIiCX0sCisgIHsgMjUsIDMsICJjMF9wZXJmY250LDMiCX0sCisgIHsgMjUsIDQsICJjMF9wZXJmY250LDQiCX0sCisgIHsgMjUsIDUsICJjMF9wZXJmY250LDUiCX0sCisgIHsgMjUsIDYsICJjMF9wZXJmY250LDYiCX0sCisgIHsgMjUsIDcsICJjMF9wZXJmY250LDciCX0sCisgIHsgMjcsIDEsICJjMF9jYWNoZWVyciwxIgl9LAorICB7IDI3LCAyLCAiYzBfY2FjaGVlcnIsMiIJfSwKKyAgeyAyNywgMywgImMwX2NhY2hlZXJyLDMiCX0sCisgIHsgMjgsIDEsICJjMF9kYXRhbG8iCQl9LAorICB7IDI4LCAyLCAiYzBfdGFnbG8xIgkJfSwKKyAgeyAyOCwgMywgImMwX2RhdGFsbzEiCQl9LAorICB7IDI4LCA0LCAiYzBfdGFnbG8yIgkJfSwKKyAgeyAyOCwgNSwgImMwX2RhdGFsbzIiCQl9LAorICB7IDI4LCA2LCAiYzBfdGFnbG8zIgkJfSwKKyAgeyAyOCwgNywgImMwX2RhdGFsbzMiCQl9LAorICB7IDI5LCAxLCAiYzBfZGF0YWhpIgkJfSwKKyAgeyAyOSwgMiwgImMwX3RhZ2hpMSIJCX0sCisgIHsgMjksIDMsICJjMF9kYXRhaGkxIgkJfSwKKyAgeyAyOSwgNCwgImMwX3RhZ2hpMiIJCX0sCisgIHsgMjksIDUsICJjMF9kYXRhaGkyIgkJfSwKKyAgeyAyOSwgNiwgImMwX3RhZ2hpMyIJCX0sCisgIHsgMjksIDcsICJjMF9kYXRhaGkzIgkJfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19jcDBfbmFtZXNfbWlwczMyNjRyMlszMl0gPQoreworICAiYzBfaW5kZXgiLCAgICAgImMwX3JhbmRvbSIsICAgICJjMF9lbnRyeWxvMCIsICAiYzBfZW50cnlsbzEiLAorICAiYzBfY29udGV4dCIsICAgImMwX3BhZ2VtYXNrIiwgICJjMF93aXJlZCIsICAgICAiYzBfaHdyZW5hIiwKKyAgImMwX2JhZHZhZGRyIiwgICJjMF9jb3VudCIsICAgICAiYzBfZW50cnloaSIsICAgImMwX2NvbXBhcmUiLAorICAiYzBfc3RhdHVzIiwgICAgImMwX2NhdXNlIiwgICAgICJjMF9lcGMiLCAgICAgICAiYzBfcHJpZCIsCisgICJjMF9jb25maWciLCAgICAiYzBfbGxhZGRyIiwgICAgImMwX3dhdGNobG8iLCAgICJjMF93YXRjaGhpIiwKKyAgImMwX3hjb250ZXh0IiwgICIkMjEiLCAgICAgICAgICAiJDIyIiwgICAgICAgICAgImMwX2RlYnVnIiwKKyAgImMwX2RlcGMiLCAgICAgICJjMF9wZXJmY250IiwgICAiYzBfZXJyY3RsIiwgICAgImMwX2NhY2hlZXJyIiwKKyAgImMwX3RhZ2xvIiwgICAgICJjMF90YWdoaSIsICAgICAiYzBfZXJyb3JlcGMiLCAgImMwX2Rlc2F2ZSIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfY3Awc2VsX25hbWUgbWlwc19jcDBzZWxfbmFtZXNfbWlwczMyNjRyMltdID0KK3sKKyAgeyAgNCwgMSwgImMwX2NvbnRleHRjb25maWciCX0sCisgIHsgIDUsIDEsICJjMF9wYWdlZ3JhaW4iCX0sCisgIHsgMTIsIDEsICJjMF9pbnRjdGwiCQl9LAorICB7IDEyLCAyLCAiYzBfc3JzY3RsIgkJfSwKKyAgeyAxMiwgMywgImMwX3Nyc21hcCIJCX0sCisgIHsgMTUsIDEsICJjMF9lYmFzZSIJCX0sCisgIHsgMTYsIDEsICJjMF9jb25maWcxIgkJfSwKKyAgeyAxNiwgMiwgImMwX2NvbmZpZzIiCQl9LAorICB7IDE2LCAzLCAiYzBfY29uZmlnMyIJCX0sCisgIHsgMTgsIDEsICJjMF93YXRjaGxvLDEiCX0sCisgIHsgMTgsIDIsICJjMF93YXRjaGxvLDIiCX0sCisgIHsgMTgsIDMsICJjMF93YXRjaGxvLDMiCX0sCisgIHsgMTgsIDQsICJjMF93YXRjaGxvLDQiCX0sCisgIHsgMTgsIDUsICJjMF93YXRjaGxvLDUiCX0sCisgIHsgMTgsIDYsICJjMF93YXRjaGxvLDYiCX0sCisgIHsgMTgsIDcsICJjMF93YXRjaGxvLDciCX0sCisgIHsgMTksIDEsICJjMF93YXRjaGhpLDEiCX0sCisgIHsgMTksIDIsICJjMF93YXRjaGhpLDIiCX0sCisgIHsgMTksIDMsICJjMF93YXRjaGhpLDMiCX0sCisgIHsgMTksIDQsICJjMF93YXRjaGhpLDQiCX0sCisgIHsgMTksIDUsICJjMF93YXRjaGhpLDUiCX0sCisgIHsgMTksIDYsICJjMF93YXRjaGhpLDYiCX0sCisgIHsgMTksIDcsICJjMF93YXRjaGhpLDciCX0sCisgIHsgMjMsIDEsICJjMF90cmFjZWNvbnRyb2wiCX0sCisgIHsgMjMsIDIsICJjMF90cmFjZWNvbnRyb2wyIgl9LAorICB7IDIzLCAzLCAiYzBfdXNlcnRyYWNlZGF0YSIJfSwKKyAgeyAyMywgNCwgImMwX3RyYWNlYnBjIgl9LAorICB7IDI1LCAxLCAiYzBfcGVyZmNudCwxIgl9LAorICB7IDI1LCAyLCAiYzBfcGVyZmNudCwyIgl9LAorICB7IDI1LCAzLCAiYzBfcGVyZmNudCwzIgl9LAorICB7IDI1LCA0LCAiYzBfcGVyZmNudCw0Igl9LAorICB7IDI1LCA1LCAiYzBfcGVyZmNudCw1Igl9LAorICB7IDI1LCA2LCAiYzBfcGVyZmNudCw2Igl9LAorICB7IDI1LCA3LCAiYzBfcGVyZmNudCw3Igl9LAorICB7IDI3LCAxLCAiYzBfY2FjaGVlcnIsMSIJfSwKKyAgeyAyNywgMiwgImMwX2NhY2hlZXJyLDIiCX0sCisgIHsgMjcsIDMsICJjMF9jYWNoZWVyciwzIgl9LAorICB7IDI4LCAxLCAiYzBfZGF0YWxvIgkJfSwKKyAgeyAyOCwgMiwgImMwX3RhZ2xvMSIJCX0sCisgIHsgMjgsIDMsICJjMF9kYXRhbG8xIgkJfSwKKyAgeyAyOCwgNCwgImMwX3RhZ2xvMiIJCX0sCisgIHsgMjgsIDUsICJjMF9kYXRhbG8yIgkJfSwKKyAgeyAyOCwgNiwgImMwX3RhZ2xvMyIJCX0sCisgIHsgMjgsIDcsICJjMF9kYXRhbG8zIgkJfSwKKyAgeyAyOSwgMSwgImMwX2RhdGFoaSIJCX0sCisgIHsgMjksIDIsICJjMF90YWdoaTEiCQl9LAorICB7IDI5LCAzLCAiYzBfZGF0YWhpMSIJCX0sCisgIHsgMjksIDQsICJjMF90YWdoaTIiCQl9LAorICB7IDI5LCA1LCAiYzBfZGF0YWhpMiIJCX0sCisgIHsgMjksIDYsICJjMF90YWdoaTMiCQl9LAorICB7IDI5LCA3LCAiYzBfZGF0YWhpMyIJCX0sCit9OworCisvKiBTQi0xOiBNSVBTNjQgKG1pcHNfY3AwX25hbWVzX21pcHMzMjY0KSB3aXRoIG1pbm9yIG1vZHMuICAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2NwMF9uYW1lc19zYjFbMzJdID0KK3sKKyAgImMwX2luZGV4IiwgICAgICJjMF9yYW5kb20iLCAgICAiYzBfZW50cnlsbzAiLCAgImMwX2VudHJ5bG8xIiwKKyAgImMwX2NvbnRleHQiLCAgICJjMF9wYWdlbWFzayIsICAiYzBfd2lyZWQiLCAgICAgIiQ3IiwKKyAgImMwX2JhZHZhZGRyIiwgICJjMF9jb3VudCIsICAgICAiYzBfZW50cnloaSIsICAgImMwX2NvbXBhcmUiLAorICAiYzBfc3RhdHVzIiwgICAgImMwX2NhdXNlIiwgICAgICJjMF9lcGMiLCAgICAgICAiYzBfcHJpZCIsCisgICJjMF9jb25maWciLCAgICAiYzBfbGxhZGRyIiwgICAgImMwX3dhdGNobG8iLCAgICJjMF93YXRjaGhpIiwKKyAgImMwX3hjb250ZXh0IiwgICIkMjEiLCAgICAgICAgICAiJDIyIiwgICAgICAgICAgImMwX2RlYnVnIiwKKyAgImMwX2RlcGMiLCAgICAgICJjMF9wZXJmY250IiwgICAiYzBfZXJyY3RsIiwgICAgImMwX2NhY2hlZXJyX2kiLAorICAiYzBfdGFnbG9faSIsICAgImMwX3RhZ2hpX2kiLCAgICJjMF9lcnJvcmVwYyIsICAiYzBfZGVzYXZlIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19jcDBzZWxfbmFtZSBtaXBzX2NwMHNlbF9uYW1lc19zYjFbXSA9Cit7CisgIHsgMTYsIDEsICJjMF9jb25maWcxIgkJfSwKKyAgeyAxOCwgMSwgImMwX3dhdGNobG8sMSIJfSwKKyAgeyAxOSwgMSwgImMwX3dhdGNoaGksMSIJfSwKKyAgeyAyMiwgMCwgImMwX3BlcmZ0cmFjZSIJfSwKKyAgeyAyMywgMywgImMwX2VkZWJ1ZyIJCX0sCisgIHsgMjUsIDEsICJjMF9wZXJmY250LDEiCX0sCisgIHsgMjUsIDIsICJjMF9wZXJmY250LDIiCX0sCisgIHsgMjUsIDMsICJjMF9wZXJmY250LDMiCX0sCisgIHsgMjUsIDQsICJjMF9wZXJmY250LDQiCX0sCisgIHsgMjUsIDUsICJjMF9wZXJmY250LDUiCX0sCisgIHsgMjUsIDYsICJjMF9wZXJmY250LDYiCX0sCisgIHsgMjUsIDcsICJjMF9wZXJmY250LDciCX0sCisgIHsgMjYsIDEsICJjMF9idXNlcnJfcGEiCX0sCisgIHsgMjcsIDEsICJjMF9jYWNoZWVycl9kIgl9LAorICB7IDI3LCAzLCAiYzBfY2FjaGVlcnJfZF9wYSIJfSwKKyAgeyAyOCwgMSwgImMwX2RhdGFsb19pIgl9LAorICB7IDI4LCAyLCAiYzBfdGFnbG9fZCIJCX0sCisgIHsgMjgsIDMsICJjMF9kYXRhbG9fZCIJfSwKKyAgeyAyOSwgMSwgImMwX2RhdGFoaV9pIgl9LAorICB7IDI5LCAyLCAiYzBfdGFnaGlfZCIJCX0sCisgIHsgMjksIDMsICJjMF9kYXRhaGlfZCIJfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19od3JfbmFtZXNfbnVtZXJpY1szMl0gPQoreworICAiJDAiLCAgICIkMSIsICAgIiQyIiwgICAiJDMiLCAgICIkNCIsICAgIiQ1IiwgICAiJDYiLCAgICIkNyIsCisgICIkOCIsICAgIiQ5IiwgICAiJDEwIiwgICIkMTEiLCAgIiQxMiIsICAiJDEzIiwgICIkMTQiLCAgIiQxNSIsCisgICIkMTYiLCAgIiQxNyIsICAiJDE4IiwgICIkMTkiLCAgIiQyMCIsICAiJDIxIiwgICIkMjIiLCAgIiQyMyIsCisgICIkMjQiLCAgIiQyNSIsICAiJDI2IiwgICIkMjciLCAgIiQyOCIsICAiJDI5IiwgICIkMzAiLCAgIiQzMSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWlwc19od3JfbmFtZXNfbWlwczMyNjRyMlszMl0gPQoreworICAiaHdyX2NwdW51bSIsICAgImh3cl9zeW5jaV9zdGVwIiwgImh3cl9jYyIsICAgICAiaHdyX2NjcmVzIiwKKyAgIiQ0IiwgICAgICAgICAgIiQ1IiwgICAgICAgICAgICAiJDYiLCAgICAgICAgICAgIiQ3IiwKKyAgIiQ4IiwgICAiJDkiLCAgICIkMTAiLCAgIiQxMSIsICAiJDEyIiwgICIkMTMiLCAgIiQxNCIsICAiJDE1IiwKKyAgIiQxNiIsICAiJDE3IiwgICIkMTgiLCAgIiQxOSIsICAiJDIwIiwgICIkMjEiLCAgIiQyMiIsICAiJDIzIiwKKyAgIiQyNCIsICAiJDI1IiwgICIkMjYiLCAgIiQyNyIsICAiJDI4IiwgICIkMjkiLCAgIiQzMCIsICAiJDMxIgorfTsKKworc3RydWN0IG1pcHNfYWJpX2Nob2ljZQoreworICBjb25zdCBjaGFyICpuYW1lOworICBjb25zdCBjaGFyICogY29uc3QgKmdwcl9uYW1lczsKKyAgY29uc3QgY2hhciAqIGNvbnN0ICpmcHJfbmFtZXM7Cit9OworCitzdGF0aWMgc3RydWN0IG1pcHNfYWJpX2Nob2ljZSBtaXBzX2FiaV9jaG9pY2VzW10gPQoreworICB7ICJudW1lcmljIiwgbWlwc19ncHJfbmFtZXNfbnVtZXJpYywgbWlwc19mcHJfbmFtZXNfbnVtZXJpYyB9LAorICB7ICIzMiIsIG1pcHNfZ3ByX25hbWVzX29sZGFiaSwgbWlwc19mcHJfbmFtZXNfMzIgfSwKKyAgeyAibjMyIiwgbWlwc19ncHJfbmFtZXNfbmV3YWJpLCBtaXBzX2Zwcl9uYW1lc19uMzIgfSwKKyAgeyAiNjQiLCBtaXBzX2dwcl9uYW1lc19uZXdhYmksIG1pcHNfZnByX25hbWVzXzY0IH0sCit9OworCitzdHJ1Y3QgbWlwc19hcmNoX2Nob2ljZQoreworICBjb25zdCBjaGFyICpuYW1lOworICBpbnQgYmZkX21hY2hfdmFsaWQ7CisgIHVuc2lnbmVkIGxvbmcgYmZkX21hY2g7CisgIGludCBwcm9jZXNzb3I7CisgIGludCBpc2E7CisgIGNvbnN0IGNoYXIgKiBjb25zdCAqY3AwX25hbWVzOworICBjb25zdCBzdHJ1Y3QgbWlwc19jcDBzZWxfbmFtZSAqY3Awc2VsX25hbWVzOworICB1bnNpZ25lZCBpbnQgY3Awc2VsX25hbWVzX2xlbjsKKyAgY29uc3QgY2hhciAqIGNvbnN0ICpod3JfbmFtZXM7Cit9OworCisjZGVmaW5lIGJmZF9tYWNoX21pcHMzMDAwICAgICAgICAgICAgICAzMDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHMzOTAwICAgICAgICAgICAgICAzOTAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MDAwICAgICAgICAgICAgICA0MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MDEwICAgICAgICAgICAgICA0MDEwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MTAwICAgICAgICAgICAgICA0MTAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MTExICAgICAgICAgICAgICA0MTExCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MTIwICAgICAgICAgICAgICA0MTIwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MzAwICAgICAgICAgICAgICA0MzAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NDAwICAgICAgICAgICAgICA0NDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NjAwICAgICAgICAgICAgICA0NjAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NjUwICAgICAgICAgICAgICA0NjUwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM1MDAwICAgICAgICAgICAgICA1MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM1NDAwICAgICAgICAgICAgICA1NDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM1NTAwICAgICAgICAgICAgICA1NTAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM2MDAwICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM3MDAwICAgICAgICAgICAgICA3MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM4MDAwICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM5MDAwICAgICAgICAgICAgICA5MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHMxMDAwMCAgICAgICAgICAgICAxMDAwMAorI2RlZmluZSBiZmRfbWFjaF9taXBzMTIwMDAgICAgICAgICAgICAgMTIwMDAKKyNkZWZpbmUgYmZkX21hY2hfbWlwczE2ICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIGJmZF9tYWNoX21pcHM1ICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIGJmZF9tYWNoX21pcHNfc2IxICAgICAgICAgICAgICAxMjMxMDIwMSAvKiBvY3RhbCAnU0InLCAwMSAqLworI2RlZmluZSBiZmRfbWFjaF9taXBzaXNhMzIgICAgICAgICAgICAgMzIKKyNkZWZpbmUgYmZkX21hY2hfbWlwc2lzYTMycjIgICAgICAgICAgIDMzCisjZGVmaW5lIGJmZF9tYWNoX21pcHNpc2E2NCAgICAgICAgICAgICA2NAorI2RlZmluZSBiZmRfbWFjaF9taXBzaXNhNjRyMiAgICAgICAgICAgNjUKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX2FyY2hfY2hvaWNlIG1pcHNfYXJjaF9jaG9pY2VzW10gPQoreworICB7ICJudW1lcmljIiwJMCwgMCwgMCwgMCwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisKKyAgeyAicjMwMDAiLAkxLCBiZmRfbWFjaF9taXBzMzAwMCwgQ1BVX1IzMDAwLCBJU0FfTUlQUzEsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJyMzkwMCIsCTEsIGJmZF9tYWNoX21pcHMzOTAwLCBDUFVfUjM5MDAsIElTQV9NSVBTMSwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInI0MDAwIiwJMSwgYmZkX21hY2hfbWlwczQwMDAsIENQVV9SNDAwMCwgSVNBX01JUFMzLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAicjQwMTAiLAkxLCBiZmRfbWFjaF9taXBzNDAxMCwgQ1BVX1I0MDEwLCBJU0FfTUlQUzIsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJ2cjQxMDAiLAkxLCBiZmRfbWFjaF9taXBzNDEwMCwgQ1BVX1ZSNDEwMCwgSVNBX01JUFMzLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAidnI0MTExIiwJMSwgYmZkX21hY2hfbWlwczQxMTEsIENQVV9SNDExMSwgSVNBX01JUFMzLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAidnI0MTIwIiwJMSwgYmZkX21hY2hfbWlwczQxMjAsIENQVV9WUjQxMjAsIElTQV9NSVBTMywKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInI0MzAwIiwJMSwgYmZkX21hY2hfbWlwczQzMDAsIENQVV9SNDMwMCwgSVNBX01JUFMzLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAicjQ0MDAiLAkxLCBiZmRfbWFjaF9taXBzNDQwMCwgQ1BVX1I0NDAwLCBJU0FfTUlQUzMsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJyNDYwMCIsCTEsIGJmZF9tYWNoX21pcHM0NjAwLCBDUFVfUjQ2MDAsIElTQV9NSVBTMywKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInI0NjUwIiwJMSwgYmZkX21hY2hfbWlwczQ2NTAsIENQVV9SNDY1MCwgSVNBX01JUFMzLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAicjUwMDAiLAkxLCBiZmRfbWFjaF9taXBzNTAwMCwgQ1BVX1I1MDAwLCBJU0FfTUlQUzQsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJ2cjU0MDAiLAkxLCBiZmRfbWFjaF9taXBzNTQwMCwgQ1BVX1ZSNTQwMCwgSVNBX01JUFM0LAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAidnI1NTAwIiwJMSwgYmZkX21hY2hfbWlwczU1MDAsIENQVV9WUjU1MDAsIElTQV9NSVBTNCwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInI2MDAwIiwJMSwgYmZkX21hY2hfbWlwczYwMDAsIENQVV9SNjAwMCwgSVNBX01JUFMyLAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAicm03MDAwIiwJMSwgYmZkX21hY2hfbWlwczcwMDAsIENQVV9STTcwMDAsIElTQV9NSVBTNCwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInJtOTAwMCIsCTEsIGJmZF9tYWNoX21pcHM3MDAwLCBDUFVfUk03MDAwLCBJU0FfTUlQUzQsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJyODAwMCIsCTEsIGJmZF9tYWNoX21pcHM4MDAwLCBDUFVfUjgwMDAsIElTQV9NSVBTNCwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisgIHsgInIxMDAwMCIsCTEsIGJmZF9tYWNoX21pcHMxMDAwMCwgQ1BVX1IxMDAwMCwgSVNBX01JUFM0LAorICAgIG1pcHNfY3AwX25hbWVzX251bWVyaWMsIE5VTEwsIDAsIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKyAgeyAicjEyMDAwIiwJMSwgYmZkX21hY2hfbWlwczEyMDAwLCBDUFVfUjEyMDAwLCBJU0FfTUlQUzQsCisgICAgbWlwc19jcDBfbmFtZXNfbnVtZXJpYywgTlVMTCwgMCwgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorICB7ICJtaXBzNSIsCTEsIGJmZF9tYWNoX21pcHM1LCBDUFVfTUlQUzUsIElTQV9NSVBTNSwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisKKyAgLyogRm9yIHN0b2NrIE1JUFMzMiwgZGlzYXNzZW1ibGUgYWxsIGFwcGxpY2FibGUgTUlQUy1zcGVjaWZpZWQgQVNFcy4KKyAgICAgTm90ZSB0aGF0IE1JUFMtM0QgYW5kIE1ETVggYXJlIG5vdCBhcHBsaWNhYmxlIHRvIE1JUFMzMi4gIChTZWUKKyAgICAgX01JUFMzMiBBcmNoaXRlY3R1cmUgRm9yIFByb2dyYW1tZXJzIFZvbHVtZSBJOiBJbnRyb2R1Y3Rpb24gdG8gdGhlCisgICAgIE1JUFMzMiBBcmNoaXRlY3R1cmVfIChNSVBTIERvY3VtZW50IE51bWJlciBNRDAwMDgyLCBSZXZpc2lvbiAwLjk1KSwKKyAgICAgcGFnZSAxLiAgKi8KKyAgeyAibWlwczMyIiwJMSwgYmZkX21hY2hfbWlwc2lzYTMyLCBDUFVfTUlQUzMyLAorICAgIElTQV9NSVBTMzIgfCBJTlNOX01JUFMxNiB8IElOU05fU01BUlRNSVBTLAorICAgIG1pcHNfY3AwX25hbWVzX21pcHMzMjY0LAorICAgIG1pcHNfY3Awc2VsX25hbWVzX21pcHMzMjY0LCBBUlJBWV9TSVpFIChtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NCksCisgICAgbWlwc19od3JfbmFtZXNfbnVtZXJpYyB9LAorCisgIHsgIm1pcHMzMnIyIiwJMSwgYmZkX21hY2hfbWlwc2lzYTMycjIsIENQVV9NSVBTMzJSMiwKKyAgICAoSVNBX01JUFMzMlIyIHwgSU5TTl9NSVBTMTYgfCBJTlNOX1NNQVJUTUlQUyB8IElOU05fRFNQIHwgSU5TTl9EU1BSMgorICAgICB8IElOU05fTUlQUzNEIHwgSU5TTl9NVCksCisgICAgbWlwc19jcDBfbmFtZXNfbWlwczMyNjRyMiwKKyAgICBtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NHIyLCBBUlJBWV9TSVpFIChtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NHIyKSwKKyAgICBtaXBzX2h3cl9uYW1lc19taXBzMzI2NHIyIH0sCisKKyAgLyogRm9yIHN0b2NrIE1JUFM2NCwgZGlzYXNzZW1ibGUgYWxsIGFwcGxpY2FibGUgTUlQUy1zcGVjaWZpZWQgQVNFcy4gICovCisgIHsgIm1pcHM2NCIsCTEsIGJmZF9tYWNoX21pcHNpc2E2NCwgQ1BVX01JUFM2NCwKKyAgICBJU0FfTUlQUzY0IHwgSU5TTl9NSVBTMTYgfCBJTlNOX01JUFMzRCB8IElOU05fTURNWCwKKyAgICBtaXBzX2NwMF9uYW1lc19taXBzMzI2NCwKKyAgICBtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NCwgQVJSQVlfU0laRSAobWlwc19jcDBzZWxfbmFtZXNfbWlwczMyNjQpLAorICAgIG1pcHNfaHdyX25hbWVzX251bWVyaWMgfSwKKworICB7ICJtaXBzNjRyMiIsCTEsIGJmZF9tYWNoX21pcHNpc2E2NHIyLCBDUFVfTUlQUzY0UjIsCisgICAgKElTQV9NSVBTNjRSMiB8IElOU05fTUlQUzE2IHwgSU5TTl9NSVBTM0QgfCBJTlNOX0RTUCB8IElOU05fRFNQUjIKKyAgICAgfCBJTlNOX0RTUDY0IHwgSU5TTl9NVCB8IElOU05fTURNWCksCisgICAgbWlwc19jcDBfbmFtZXNfbWlwczMyNjRyMiwKKyAgICBtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NHIyLCBBUlJBWV9TSVpFIChtaXBzX2NwMHNlbF9uYW1lc19taXBzMzI2NHIyKSwKKyAgICBtaXBzX2h3cl9uYW1lc19taXBzMzI2NHIyIH0sCisKKyAgeyAic2IxIiwJMSwgYmZkX21hY2hfbWlwc19zYjEsIENQVV9TQjEsCisgICAgSVNBX01JUFM2NCB8IElOU05fTUlQUzNEIHwgSU5TTl9TQjEsCisgICAgbWlwc19jcDBfbmFtZXNfc2IxLAorICAgIG1pcHNfY3Awc2VsX25hbWVzX3NiMSwgQVJSQVlfU0laRSAobWlwc19jcDBzZWxfbmFtZXNfc2IxKSwKKyAgICBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCisKKyAgLyogVGhpcyBlbnRyeSwgbWlwczE2LCBpcyBoZXJlIG9ubHkgZm9yIElTQS9wcm9jZXNzb3Igc2VsZWN0aW9uOyBkbworICAgICBub3QgcHJpbnQgaXRzIG5hbWUuICAqLworICB7ICIiLAkJMSwgYmZkX21hY2hfbWlwczE2LCBDUFVfTUlQUzE2LCBJU0FfTUlQUzMgfCBJTlNOX01JUFMxNiwKKyAgICBtaXBzX2NwMF9uYW1lc19udW1lcmljLCBOVUxMLCAwLCBtaXBzX2h3cl9uYW1lc19udW1lcmljIH0sCit9OworCisvKiBJU0EgYW5kIHByb2Nlc3NvciB0eXBlIHRvIGRpc2Fzc2VtYmxlIGZvciwgYW5kIHJlZ2lzdGVyIG5hbWVzIHRvIHVzZS4KKyAgIHNldF9kZWZhdWx0X21pcHNfZGlzX29wdGlvbnMgYW5kIHBhcnNlX21pcHNfZGlzX29wdGlvbnMgZmlsbCBpbiB0aGVzZQorICAgdmFsdWVzLiAgKi8KK3N0YXRpYyBpbnQgbWlwc19wcm9jZXNzb3I7CitzdGF0aWMgaW50IG1pcHNfaXNhOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqbWlwc19ncHJfbmFtZXM7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0ICptaXBzX2Zwcl9uYW1lczsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgKm1pcHNfY3AwX25hbWVzOworc3RhdGljIGNvbnN0IHN0cnVjdCBtaXBzX2NwMHNlbF9uYW1lICptaXBzX2NwMHNlbF9uYW1lczsKK3N0YXRpYyBpbnQgbWlwc19jcDBzZWxfbmFtZXNfbGVuOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqbWlwc19od3JfbmFtZXM7CisKKy8qIE90aGVyIG9wdGlvbnMgKi8KK3N0YXRpYyBpbnQgbm9fYWxpYXNlczsJLyogSWYgc2V0IGRpc2Fzc2VtYmxlIGFzIG1vc3QgZ2VuZXJhbCBpbnN0LiAgKi8KKwwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19hYmlfY2hvaWNlICoKK2Nob29zZV9hYmlfYnlfbmFtZSAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG5hbWVsZW4pCit7CisgIGNvbnN0IHN0cnVjdCBtaXBzX2FiaV9jaG9pY2UgKmM7CisgIHVuc2lnbmVkIGludCBpOworCisgIGZvciAoaSA9IDAsIGMgPSBOVUxMOyBpIDwgQVJSQVlfU0laRSAobWlwc19hYmlfY2hvaWNlcykgJiYgYyA9PSBOVUxMOyBpKyspCisgICAgaWYgKHN0cm5jbXAgKG1pcHNfYWJpX2Nob2ljZXNbaV0ubmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMAorCSYmIHN0cmxlbiAobWlwc19hYmlfY2hvaWNlc1tpXS5uYW1lKSA9PSBuYW1lbGVuKQorICAgICAgYyA9ICZtaXBzX2FiaV9jaG9pY2VzW2ldOworCisgIHJldHVybiBjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfYXJjaF9jaG9pY2UgKgorY2hvb3NlX2FyY2hfYnlfbmFtZSAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IG5hbWVsZW4pCit7CisgIGNvbnN0IHN0cnVjdCBtaXBzX2FyY2hfY2hvaWNlICpjID0gTlVMTDsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9yIChpID0gMCwgYyA9IE5VTEw7IGkgPCBBUlJBWV9TSVpFIChtaXBzX2FyY2hfY2hvaWNlcykgJiYgYyA9PSBOVUxMOyBpKyspCisgICAgaWYgKHN0cm5jbXAgKG1pcHNfYXJjaF9jaG9pY2VzW2ldLm5hbWUsIG5hbWUsIG5hbWVsZW4pID09IDAKKwkmJiBzdHJsZW4gKG1pcHNfYXJjaF9jaG9pY2VzW2ldLm5hbWUpID09IG5hbWVsZW4pCisgICAgICBjID0gJm1pcHNfYXJjaF9jaG9pY2VzW2ldOworCisgIHJldHVybiBjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pcHNfYXJjaF9jaG9pY2UgKgorY2hvb3NlX2FyY2hfYnlfbnVtYmVyICh1bnNpZ25lZCBsb25nIG1hY2gpCit7CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIGhpbnRfYmZkX21hY2g7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19hcmNoX2Nob2ljZSAqaGludF9hcmNoX2Nob2ljZTsKKyAgY29uc3Qgc3RydWN0IG1pcHNfYXJjaF9jaG9pY2UgKmM7CisgIHVuc2lnbmVkIGludCBpOworCisgIC8qIFdlIG9wdGltaXplIHRoaXMgYmVjYXVzZSBldmVuIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBubworICAgICBmbGFncywgdGhpcyB3aWxsIGJlIGRvbmUgZm9yIGV2ZXJ5IGluc3RydWN0aW9uISAgKi8KKyAgaWYgKGhpbnRfYmZkX21hY2ggPT0gbWFjaAorICAgICAgJiYgaGludF9hcmNoX2Nob2ljZSAhPSBOVUxMCisgICAgICAmJiBoaW50X2FyY2hfY2hvaWNlLT5iZmRfbWFjaCA9PSBoaW50X2JmZF9tYWNoKQorICAgIHJldHVybiBoaW50X2FyY2hfY2hvaWNlOworCisgIGZvciAoaSA9IDAsIGMgPSBOVUxMOyBpIDwgQVJSQVlfU0laRSAobWlwc19hcmNoX2Nob2ljZXMpICYmIGMgPT0gTlVMTDsgaSsrKQorICAgIHsKKyAgICAgIGlmIChtaXBzX2FyY2hfY2hvaWNlc1tpXS5iZmRfbWFjaF92YWxpZAorCSAgJiYgbWlwc19hcmNoX2Nob2ljZXNbaV0uYmZkX21hY2ggPT0gbWFjaCkKKwl7CisJICBjID0gJm1pcHNfYXJjaF9jaG9pY2VzW2ldOworCSAgaGludF9iZmRfbWFjaCA9IG1hY2g7CisJICBoaW50X2FyY2hfY2hvaWNlID0gYzsKKwl9CisgICAgfQorICByZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQKK3NldF9kZWZhdWx0X21pcHNfZGlzX29wdGlvbnMgKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBjb25zdCBzdHJ1Y3QgbWlwc19hcmNoX2Nob2ljZSAqY2hvc2VuX2FyY2g7CisKKyAgLyogRGVmYXVsdHM6IG1pcHNJSUkvcjMwMDAgKD8hKSwgKG8pMzItc3R5bGUgKCJvbGRhYmkiKSBHUFIgbmFtZXMsCisgICAgIGFuZCBudW1lcmljIEZQUiwgQ1AwIHJlZ2lzdGVyLCBhbmQgSFdSIG5hbWVzLiAgKi8KKyAgbWlwc19pc2EgPSBJU0FfTUlQUzM7CisgIG1pcHNfcHJvY2Vzc29yID0gIENQVV9SMzAwMDsKKyAgbWlwc19ncHJfbmFtZXMgPSBtaXBzX2dwcl9uYW1lc19vbGRhYmk7CisgIG1pcHNfZnByX25hbWVzID0gbWlwc19mcHJfbmFtZXNfbnVtZXJpYzsKKyAgbWlwc19jcDBfbmFtZXMgPSBtaXBzX2NwMF9uYW1lc19udW1lcmljOworICBtaXBzX2NwMHNlbF9uYW1lcyA9IE5VTEw7CisgIG1pcHNfY3Awc2VsX25hbWVzX2xlbiA9IDA7CisgIG1pcHNfaHdyX25hbWVzID0gbWlwc19od3JfbmFtZXNfbnVtZXJpYzsKKyAgbm9fYWxpYXNlcyA9IDA7CisKKyAgLyogSWYgYW4gRUxGICJuZXdhYmkiIGJpbmFyeSwgdXNlIHRoZSBuMzIvKG4pNjQgR1BSIG5hbWVzLiAgKi8KKyNpZiAwCisgIGlmIChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgJiYgaW5mby0+c2VjdGlvbiAhPSBOVUxMKQorICAgIHsKKyAgICAgIEVsZl9JbnRlcm5hbF9FaGRyICpoZWFkZXI7CisKKyAgICAgIGhlYWRlciA9IGVsZl9lbGZoZWFkZXIgKGluZm8tPnNlY3Rpb24tPm93bmVyKTsKKyAgICAgIGlmIChpc19uZXdhYmkgKGhlYWRlcikpCisJbWlwc19ncHJfbmFtZXMgPSBtaXBzX2dwcl9uYW1lc19uZXdhYmk7CisgICAgfQorI2VuZGlmCisKKyAgLyogU2V0IElTQSwgYXJjaGl0ZWN0dXJlLCBhbmQgY3AwIHJlZ2lzdGVyIG5hbWVzIGFzIGJlc3Qgd2UgY2FuLiAgKi8KKyNpZiAhZGVmaW5lZChTWU1UQUJfQVZBSUxBQkxFKSAmJiAwCisgIC8qIFRoaXMgaXMgcnVubmluZyBvdXQgb24gYSB0YXJnZXQgbWFjaGluZSwgbm90IGluIGEgaG9zdCB0b29sLgorICAgICBGSVhNRTogV2hlcmUgZG9lcyBtaXBzX3RhcmdldF9pbmZvIGNvbWUgZnJvbT8gICovCisgIHRhcmdldF9wcm9jZXNzb3IgPSBtaXBzX3RhcmdldF9pbmZvLnByb2Nlc3NvcjsKKyAgbWlwc19pc2EgPSBtaXBzX3RhcmdldF9pbmZvLmlzYTsKKyNlbHNlCisgIGNob3Nlbl9hcmNoID0gY2hvb3NlX2FyY2hfYnlfbnVtYmVyIChpbmZvLT5tYWNoKTsKKyAgaWYgKGNob3Nlbl9hcmNoICE9IE5VTEwpCisgICAgeworICAgICAgbWlwc19wcm9jZXNzb3IgPSBjaG9zZW5fYXJjaC0+cHJvY2Vzc29yOworICAgICAgbWlwc19pc2EgPSBjaG9zZW5fYXJjaC0+aXNhOworICAgICAgbWlwc19jcDBfbmFtZXMgPSBjaG9zZW5fYXJjaC0+Y3AwX25hbWVzOworICAgICAgbWlwc19jcDBzZWxfbmFtZXMgPSBjaG9zZW5fYXJjaC0+Y3Awc2VsX25hbWVzOworICAgICAgbWlwc19jcDBzZWxfbmFtZXNfbGVuID0gY2hvc2VuX2FyY2gtPmNwMHNlbF9uYW1lc19sZW47CisgICAgICBtaXBzX2h3cl9uYW1lcyA9IGNob3Nlbl9hcmNoLT5od3JfbmFtZXM7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9taXBzX2Rpc19vcHRpb24gKGNvbnN0IGNoYXIgKm9wdGlvbiwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgdW5zaWduZWQgaW50IGksIG9wdGlvbmxlbiwgdmFsbGVuOworICBjb25zdCBjaGFyICp2YWw7CisgIGNvbnN0IHN0cnVjdCBtaXBzX2FiaV9jaG9pY2UgKmNob3Nlbl9hYmk7CisgIGNvbnN0IHN0cnVjdCBtaXBzX2FyY2hfY2hvaWNlICpjaG9zZW5fYXJjaDsKKworICAvKiBMb29rIGZvciB0aGUgPSB0aGF0IGRlbGltaXRzIHRoZSBlbmQgb2YgdGhlIG9wdGlvbiBuYW1lLiAgKi8KKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgIHsKKyAgICAgIGlmIChvcHRpb25baV0gPT0gJz0nKQorCWJyZWFrOworICAgIH0KKyAgaWYgKGkgPT0gMCkJCS8qIEludmFsaWQgb3B0aW9uOiBubyBuYW1lIGJlZm9yZSAnPScuICAqLworICAgIHJldHVybjsKKyAgaWYgKGkgPT0gbGVuKQkJLyogSW52YWxpZCBvcHRpb246IG5vICc9Jy4gICovCisgICAgcmV0dXJuOworICBpZiAoaSA9PSAobGVuIC0gMSkpCS8qIEludmFsaWQgb3B0aW9uOiBubyB2YWx1ZSBhZnRlciAnPScuICAqLworICAgIHJldHVybjsKKworICBvcHRpb25sZW4gPSBpOworICB2YWwgPSBvcHRpb24gKyAob3B0aW9ubGVuICsgMSk7CisgIHZhbGxlbiA9IGxlbiAtIChvcHRpb25sZW4gKyAxKTsKKworICBpZiAoc3RybmNtcCgiZ3ByLW5hbWVzIiwgb3B0aW9uLCBvcHRpb25sZW4pID09IDAKKyAgICAgICYmIHN0cmxlbigiZ3ByLW5hbWVzIikgPT0gb3B0aW9ubGVuKQorICAgIHsKKyAgICAgIGNob3Nlbl9hYmkgPSBjaG9vc2VfYWJpX2J5X25hbWUgKHZhbCwgdmFsbGVuKTsKKyAgICAgIGlmIChjaG9zZW5fYWJpICE9IE5VTEwpCisJbWlwc19ncHJfbmFtZXMgPSBjaG9zZW5fYWJpLT5ncHJfbmFtZXM7CisgICAgICByZXR1cm47CisgICAgfQorCisgIGlmIChzdHJuY21wKCJmcHItbmFtZXMiLCBvcHRpb24sIG9wdGlvbmxlbikgPT0gMAorICAgICAgJiYgc3RybGVuKCJmcHItbmFtZXMiKSA9PSBvcHRpb25sZW4pCisgICAgeworICAgICAgY2hvc2VuX2FiaSA9IGNob29zZV9hYmlfYnlfbmFtZSAodmFsLCB2YWxsZW4pOworICAgICAgaWYgKGNob3Nlbl9hYmkgIT0gTlVMTCkKKwltaXBzX2Zwcl9uYW1lcyA9IGNob3Nlbl9hYmktPmZwcl9uYW1lczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAoImNwMC1uYW1lcyIsIG9wdGlvbiwgb3B0aW9ubGVuKSA9PSAwCisgICAgICAmJiBzdHJsZW4oImNwMC1uYW1lcyIpID09IG9wdGlvbmxlbikKKyAgICB7CisgICAgICBjaG9zZW5fYXJjaCA9IGNob29zZV9hcmNoX2J5X25hbWUgKHZhbCwgdmFsbGVuKTsKKyAgICAgIGlmIChjaG9zZW5fYXJjaCAhPSBOVUxMKQorCXsKKwkgIG1pcHNfY3AwX25hbWVzID0gY2hvc2VuX2FyY2gtPmNwMF9uYW1lczsKKwkgIG1pcHNfY3Awc2VsX25hbWVzID0gY2hvc2VuX2FyY2gtPmNwMHNlbF9uYW1lczsKKwkgIG1pcHNfY3Awc2VsX25hbWVzX2xlbiA9IGNob3Nlbl9hcmNoLT5jcDBzZWxfbmFtZXNfbGVuOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAoImh3ci1uYW1lcyIsIG9wdGlvbiwgb3B0aW9ubGVuKSA9PSAwCisgICAgICAmJiBzdHJsZW4oImh3ci1uYW1lcyIpID09IG9wdGlvbmxlbikKKyAgICB7CisgICAgICBjaG9zZW5fYXJjaCA9IGNob29zZV9hcmNoX2J5X25hbWUgKHZhbCwgdmFsbGVuKTsKKyAgICAgIGlmIChjaG9zZW5fYXJjaCAhPSBOVUxMKQorCW1pcHNfaHdyX25hbWVzID0gY2hvc2VuX2FyY2gtPmh3cl9uYW1lczsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKHN0cm5jbXAoInJlZy1uYW1lcyIsIG9wdGlvbiwgb3B0aW9ubGVuKSA9PSAwCisgICAgICAmJiBzdHJsZW4oInJlZy1uYW1lcyIpID09IG9wdGlvbmxlbikKKyAgICB7CisgICAgICAvKiBXZSBjaGVjayBib3RoIEFCSSBhbmQgQVJDSCBoZXJlIHVuY29uZGl0aW9uYWxseSwgc28KKwkgdGhhdCAibnVtZXJpYyIgd2lsbCBkbyB0aGUgZGVzaXJhYmxlIHRoaW5nOiBzZWxlY3QKKwkgbnVtZXJpYyByZWdpc3RlciBuYW1lcyBmb3IgYWxsIHJlZ2lzdGVycy4gIE90aGVyIHRoYW4KKwkgdGhhdCwgYSBnaXZlbiBuYW1lIHByb2JhYmx5IHdvbid0IG1hdGNoIGJvdGguICAqLworICAgICAgY2hvc2VuX2FiaSA9IGNob29zZV9hYmlfYnlfbmFtZSAodmFsLCB2YWxsZW4pOworICAgICAgaWYgKGNob3Nlbl9hYmkgIT0gTlVMTCkKKwl7CisJICBtaXBzX2dwcl9uYW1lcyA9IGNob3Nlbl9hYmktPmdwcl9uYW1lczsKKwkgIG1pcHNfZnByX25hbWVzID0gY2hvc2VuX2FiaS0+ZnByX25hbWVzOworCX0KKyAgICAgIGNob3Nlbl9hcmNoID0gY2hvb3NlX2FyY2hfYnlfbmFtZSAodmFsLCB2YWxsZW4pOworICAgICAgaWYgKGNob3Nlbl9hcmNoICE9IE5VTEwpCisJeworCSAgbWlwc19jcDBfbmFtZXMgPSBjaG9zZW5fYXJjaC0+Y3AwX25hbWVzOworCSAgbWlwc19jcDBzZWxfbmFtZXMgPSBjaG9zZW5fYXJjaC0+Y3Awc2VsX25hbWVzOworCSAgbWlwc19jcDBzZWxfbmFtZXNfbGVuID0gY2hvc2VuX2FyY2gtPmNwMHNlbF9uYW1lc19sZW47CisJICBtaXBzX2h3cl9uYW1lcyA9IGNob3Nlbl9hcmNoLT5od3JfbmFtZXM7CisJfQorICAgICAgcmV0dXJuOworICAgIH0KKworICAvKiBJbnZhbGlkIG9wdGlvbi4gICovCit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9taXBzX2Rpc19vcHRpb25zIChjb25zdCBjaGFyICpvcHRpb25zKQoreworICBjb25zdCBjaGFyICpvcHRpb25fZW5kOworCisgIGlmIChvcHRpb25zID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIHdoaWxlICgqb3B0aW9ucyAhPSAnXDAnKQorICAgIHsKKyAgICAgIC8qIFNraXAgZW1wdHkgb3B0aW9ucy4gICovCisgICAgICBpZiAoKm9wdGlvbnMgPT0gJywnKQorCXsKKwkgIG9wdGlvbnMrKzsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgLyogV2Uga25vdyB0aGF0ICpvcHRpb25zIGlzIG5laXRoZXIgTlVMIG9yIGEgY29tbWEuICAqLworICAgICAgb3B0aW9uX2VuZCA9IG9wdGlvbnMgKyAxOworICAgICAgd2hpbGUgKCpvcHRpb25fZW5kICE9ICcsJyAmJiAqb3B0aW9uX2VuZCAhPSAnXDAnKQorCW9wdGlvbl9lbmQrKzsKKworICAgICAgcGFyc2VfbWlwc19kaXNfb3B0aW9uIChvcHRpb25zLCBvcHRpb25fZW5kIC0gb3B0aW9ucyk7CisKKyAgICAgIC8qIEdvIG9uIHRvIHRoZSBuZXh0IG9uZS4gIElmIG9wdGlvbl9lbmQgcG9pbnRzIHRvIGEgY29tbWEsIGl0CisJIHdpbGwgYmUgc2tpcHBlZCBhYm92ZS4gICovCisgICAgICBvcHRpb25zID0gb3B0aW9uX2VuZDsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19jcDBzZWxfbmFtZSAqCitsb29rdXBfbWlwc19jcDBzZWxfbmFtZSAoY29uc3Qgc3RydWN0IG1pcHNfY3Awc2VsX25hbWUgKm5hbWVzLAorCQkJIHVuc2lnbmVkIGludCBsZW4sCisJCQkgdW5zaWduZWQgaW50IGNwMHJlZywKKwkJCSB1bnNpZ25lZCBpbnQgc2VsKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgaWYgKG5hbWVzW2ldLmNwMHJlZyA9PSBjcDByZWcgJiYgbmFtZXNbaV0uc2VsID09IHNlbCkKKyAgICAgIHJldHVybiAmbmFtZXNbaV07CisgIHJldHVybiBOVUxMOworfQorDAorLyogUHJpbnQgaW5zbiBhcmd1bWVudHMgZm9yIDMyLzY0LWJpdCBjb2RlLiAgKi8KKworc3RhdGljIHZvaWQKK3ByaW50X2luc25fYXJncyAoY29uc3QgY2hhciAqZCwKKwkJIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaW50IGwsCisJCSBiZmRfdm1hIHBjLAorCQkgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sCisJCSBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wcCkKK3sKKyAgaW50IG9wLCBkZWx0YTsKKyAgdW5zaWduZWQgaW50IGxzYiwgbXNiLCBtc2JkOworCisgIGxzYiA9IDA7CisKKyAgZm9yICg7ICpkICE9ICdcMCc7IGQrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKCpkKQorCXsKKwljYXNlICcsJzoKKwljYXNlICcoJzoKKwljYXNlICcpJzoKKwljYXNlICdbJzoKKwljYXNlICddJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqZCk7CisJICBicmVhazsKKworCWNhc2UgJysnOgorCSAgLyogRXh0ZW5zaW9uIGNoYXJhY3Rlcjsgc3dpdGNoIGZvciBzZWNvbmQgY2hhci4gICovCisJICBkKys7CisJICBzd2l0Y2ggKCpkKQorCSAgICB7CisJICAgIGNhc2UgJ1wwJzoKKwkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAorCQkJCSAgICAgXygiIyBpbnRlcm5hbCBlcnJvciwgaW5jb21wbGV0ZSBleHRlbnNpb24gc2VxdWVuY2UgKCspIikpOworCSAgICAgIHJldHVybjsKKworCSAgICBjYXNlICdBJzoKKwkgICAgICBsc2IgPSAobCA+PiBPUF9TSF9TSEFNVCkgJiBPUF9NQVNLX1NIQU1UOworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIGxzYik7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnQic6CisJICAgICAgbXNiID0gKGwgPj4gT1BfU0hfSU5TTVNCKSAmIE9QX01BU0tfSU5TTVNCOworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIG1zYiAtIGxzYiArIDEpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzEnOgorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAgICAgKGwgPj4gT1BfU0hfVURJMSkgJiBPUF9NQVNLX1VESTEpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzInOgorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAgICAgKGwgPj4gT1BfU0hfVURJMikgJiBPUF9NQVNLX1VESTIpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzMnOgorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAgICAgKGwgPj4gT1BfU0hfVURJMykgJiBPUF9NQVNLX1VESTMpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJzQnOgorCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAgICAgKGwgPj4gT1BfU0hfVURJNCkgJiBPUF9NQVNLX1VESTQpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0MnOgorCSAgICBjYXNlICdIJzoKKwkgICAgICBtc2JkID0gKGwgPj4gT1BfU0hfRVhUTVNCRCkgJiBPUF9NQVNLX0VYVE1TQkQ7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgbXNiZCArIDEpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0QnOgorCSAgICAgIHsKKwkJY29uc3Qgc3RydWN0IG1pcHNfY3Awc2VsX25hbWUgKm47CisJCXVuc2lnbmVkIGludCBjcDByZWcsIHNlbDsKKworCQljcDByZWcgPSAobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEOworCQlzZWwgPSAobCA+PiBPUF9TSF9TRUwpICYgT1BfTUFTS19TRUw7CisKKwkJLyogQ1AwIHJlZ2lzdGVyIGluY2x1ZGluZyAnc2VsJyBjb2RlIGZvciBtdGNOIChldCBhbC4pLCB0byBiZQorCQkgICBwcmludGVkIHRleHR1YWxseSBpZiBrbm93bi4gIElmIG5vdCBrbm93biwgcHJpbnQgYm90aAorCQkgICBDUDAgcmVnaXN0ZXIgbmFtZSBhbmQgc2VsIG51bWVyaWNhbGx5IHNpbmNlIENQMCByZWdpc3RlcgorCQkgICB3aXRoIHNlbCAwIG1heSBoYXZlIGEgbmFtZSB1bnJlbGF0ZWQgdG8gcmVnaXN0ZXIgYmVpbmcKKwkJICAgcHJpbnRlZC4gICovCisJCW4gPSBsb29rdXBfbWlwc19jcDBzZWxfbmFtZShtaXBzX2NwMHNlbF9uYW1lcywKKwkJCQkJICAgIG1pcHNfY3Awc2VsX25hbWVzX2xlbiwgY3AwcmVnLCBzZWwpOworCQlpZiAobiAhPSBOVUxMKQorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuLT5uYW1lKTsKKwkJZWxzZQorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVkLCVkIiwgY3AwcmVnLCBzZWwpOworCQlicmVhazsKKwkgICAgICB9CisKKwkgICAgY2FzZSAnRSc6CisJICAgICAgbHNiID0gKChsID4+IE9QX1NIX1NIQU1UKSAmIE9QX01BU0tfU0hBTVQpICsgMzI7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgbHNiKTsKKwkgICAgICBicmVhazsKKworCSAgICBjYXNlICdGJzoKKwkgICAgICBtc2IgPSAoKGwgPj4gT1BfU0hfSU5TTVNCKSAmIE9QX01BU0tfSU5TTVNCKSArIDMyOworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsIG1zYiAtIGxzYiArIDEpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ0cnOgorCSAgICAgIG1zYmQgPSAoKGwgPj4gT1BfU0hfRVhUTVNCRCkgJiBPUF9NQVNLX0VYVE1TQkQpICsgMzI7CisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgbXNiZCArIDEpOworCSAgICAgIGJyZWFrOworCisJICAgIGNhc2UgJ3QnOiAvKiBDb3Byb2Nlc3NvciAwIHJlZyBuYW1lICovCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkJICAgICBtaXBzX2NwMF9uYW1lc1sobCA+PiBPUF9TSF9SVCkgJgorCQkJCQkJICAgICBPUF9NQVNLX1JUXSk7CisJICAgICAgYnJlYWs7CisKKwkgICAgY2FzZSAnVCc6IC8qIENvcHJvY2Vzc29yIDAgcmVnIG5hbWUgKi8KKwkgICAgICB7CisJCWNvbnN0IHN0cnVjdCBtaXBzX2NwMHNlbF9uYW1lICpuOworCQl1bnNpZ25lZCBpbnQgY3AwcmVnLCBzZWw7CisKKwkJY3AwcmVnID0gKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVDsKKwkJc2VsID0gKGwgPj4gT1BfU0hfU0VMKSAmIE9QX01BU0tfU0VMOworCisJCS8qIENQMCByZWdpc3RlciBpbmNsdWRpbmcgJ3NlbCcgY29kZSBmb3IgbWZ0YzAsIHRvIGJlCisJCSAgIHByaW50ZWQgdGV4dHVhbGx5IGlmIGtub3duLiAgSWYgbm90IGtub3duLCBwcmludCBib3RoCisJCSAgIENQMCByZWdpc3RlciBuYW1lIGFuZCBzZWwgbnVtZXJpY2FsbHkgc2luY2UgQ1AwIHJlZ2lzdGVyCisJCSAgIHdpdGggc2VsIDAgbWF5IGhhdmUgYSBuYW1lIHVucmVsYXRlZCB0byByZWdpc3RlciBiZWluZworCQkgICBwcmludGVkLiAgKi8KKwkJbiA9IGxvb2t1cF9taXBzX2NwMHNlbF9uYW1lKG1pcHNfY3Awc2VsX25hbWVzLAorCQkJCQkgICAgbWlwc19jcDBzZWxfbmFtZXNfbGVuLCBjcDByZWcsIHNlbCk7CisJCWlmIChuICE9IE5VTEwpCisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG4tPm5hbWUpOworCQllbHNlCisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJWQsJWQiLCBjcDByZWcsIHNlbCk7CisJCWJyZWFrOworCSAgICAgIH0KKworCSAgICBkZWZhdWx0OgorCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCisJCQkJICAgICBfKCIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgZXh0ZW5zaW9uIHNlcXVlbmNlICgrJWMpIiksCisJCQkJICAgICAqZCk7CisJICAgICAgcmV0dXJuOworCSAgICB9CisJICBicmVhazsKKworCWNhc2UgJzInOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsCisJCQkJIChsID4+IE9QX1NIX0JQKSAmIE9QX01BU0tfQlApOworCSAgYnJlYWs7CisKKwljYXNlICczJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAobCA+PiBPUF9TSF9TQTMpICYgT1BfTUFTS19TQTMpOworCSAgYnJlYWs7CisKKwljYXNlICc0JzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAobCA+PiBPUF9TSF9TQTQpICYgT1BfTUFTS19TQTQpOworCSAgYnJlYWs7CisKKwljYXNlICc1JzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAobCA+PiBPUF9TSF9JTU04KSAmIE9QX01BU0tfSU1NOCk7CisJICBicmVhazsKKworCWNhc2UgJzYnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsCisJCQkJIChsID4+IE9QX1NIX1JTKSAmIE9QX01BU0tfUlMpOworCSAgYnJlYWs7CisKKwljYXNlICc3JzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGFjJWxkIiwKKwkJCQkgKGwgPj4gT1BfU0hfRFNQQUNDKSAmIE9QX01BU0tfRFNQQUNDKTsKKwkgIGJyZWFrOworCisJY2FzZSAnOCc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKwkJCQkgKGwgPj4gT1BfU0hfV1JEU1ApICYgT1BfTUFTS19XUkRTUCk7CisJICBicmVhazsKKworCWNhc2UgJzknOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkYWMlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9EU1BBQ0NfUykgJiBPUF9NQVNLX0RTUEFDQ19TKTsKKwkgIGJyZWFrOworCisJY2FzZSAnMCc6IC8qIGRzcCA2LWJpdCBzaWduZWQgaW1tZWRpYXRlIGluIGJpdCAyMCAqLworCSAgZGVsdGEgPSAoKGwgPj4gT1BfU0hfRFNQU0ZUKSAmIE9QX01BU0tfRFNQU0ZUKTsKKwkgIGlmIChkZWx0YSAmIDB4MjApIC8qIHRlc3Qgc2lnbiBiaXQgKi8KKwkgICAgZGVsdGEgfD0gfk9QX01BU0tfRFNQU0ZUOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGRlbHRhKTsKKwkgIGJyZWFrOworCisJY2FzZSAnOic6IC8qIGRzcCA3LWJpdCBzaWduZWQgaW1tZWRpYXRlIGluIGJpdCAxOSAqLworCSAgZGVsdGEgPSAoKGwgPj4gT1BfU0hfRFNQU0ZUXzcpICYgT1BfTUFTS19EU1BTRlRfNyk7CisJICBpZiAoZGVsdGEgJiAweDQwKSAvKiB0ZXN0IHNpZ24gYml0ICovCisJICAgIGRlbHRhIHw9IH5PUF9NQVNLX0RTUFNGVF83OworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGRlbHRhKTsKKwkgIGJyZWFrOworCisJY2FzZSAnXCcnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsCisJCQkJIChsID4+IE9QX1NIX1JERFNQKSAmIE9QX01BU0tfUkREU1ApOworCSAgYnJlYWs7CisKKwljYXNlICdAJzogLyogZHNwIDEwLWJpdCBzaWduZWQgaW1tZWRpYXRlIGluIGJpdCAxNiAqLworCSAgZGVsdGEgPSAoKGwgPj4gT1BfU0hfSU1NMTApICYgT1BfTUFTS19JTU0xMCk7CisJICBpZiAoZGVsdGEgJiAweDIwMCkgLyogdGVzdCBzaWduIGJpdCAqLworCSAgICBkZWx0YSB8PSB+T1BfTUFTS19JTU0xMDsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBkZWx0YSk7CisJICBicmVhazsKKworCWNhc2UgJyEnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9NVF9VKSAmIE9QX01BU0tfTVRfVSk7CisJICBicmVhazsKKworCWNhc2UgJyQnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9NVF9IKSAmIE9QX01BU0tfTVRfSCk7CisJICBicmVhazsKKworCWNhc2UgJyonOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkYWMlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9NVEFDQ19UKSAmIE9QX01BU0tfTVRBQ0NfVCk7CisJICBicmVhazsKKworCWNhc2UgJyYnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkYWMlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9NVEFDQ19EKSAmIE9QX01BU0tfTVRBQ0NfRCk7CisJICBicmVhazsKKworCWNhc2UgJ2cnOgorCSAgLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXIgZm9yIENUVEMxLCBNVFRDMiwgTVRIQzIsIENUVEMyLiAgKi8KKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVsZCIsCisJCQkJIChsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpOworCSAgYnJlYWs7CisKKwljYXNlICdzJzoKKwljYXNlICdiJzoKKwljYXNlICdyJzoKKwljYXNlICd2JzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJCSBtaXBzX2dwcl9uYW1lc1sobCA+PiBPUF9TSF9SUykgJiBPUF9NQVNLX1JTXSk7CisJICBicmVhazsKKworCWNhc2UgJ3QnOgorCWNhc2UgJ3cnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkJIG1pcHNfZ3ByX25hbWVzWyhsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlRdKTsKKwkgIGJyZWFrOworCisJY2FzZSAnaSc6CisJY2FzZSAndSc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKwkJCQkgKGwgPj4gT1BfU0hfSU1NRURJQVRFKSAmIE9QX01BU0tfSU1NRURJQVRFKTsKKwkgIGJyZWFrOworCisJY2FzZSAnaic6IC8qIFNhbWUgYXMgaSwgYnV0IHNpZ24tZXh0ZW5kZWQuICAqLworCWNhc2UgJ28nOgorCSAgZGVsdGEgPSAobCA+PiBPUF9TSF9ERUxUQSkgJiBPUF9NQVNLX0RFTFRBOworCSAgaWYgKGRlbHRhICYgMHg4MDAwKQorCSAgICBkZWx0YSB8PSB+MHhmZmZmOworCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCisJCQkJIGRlbHRhKTsKKwkgIGJyZWFrOworCisJY2FzZSAnaCc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAorCQkJCSAodW5zaWduZWQgaW50KSAoKGwgPj4gT1BfU0hfUFJFRlgpCisJCQkJCQkgJiBPUF9NQVNLX1BSRUZYKSk7CisJICBicmVhazsKKworCWNhc2UgJ2snOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKKwkJCQkgKHVuc2lnbmVkIGludCkgKChsID4+IE9QX1NIX0NBQ0hFKQorCQkJCQkJICYgT1BfTUFTS19DQUNIRSkpOworCSAgYnJlYWs7CisKKwljYXNlICdhJzoKKwkgIGluZm8tPnRhcmdldCA9ICgoKHBjICsgNCkgJiB+KGJmZF92bWEpIDB4MGZmZmZmZmYpCisJCQkgIHwgKCgobCA+PiBPUF9TSF9UQVJHRVQpICYgT1BfTUFTS19UQVJHRVQpIDw8IDIpKTsKKwkgIC8qIEZvciBnZGIgZGlzYXNzZW1ibGVyLCBmb3JjZSBvZGQgYWRkcmVzcyBvbiBqYWx4LiAgKi8KKwkgIGlmIChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyCisJICAgICAgJiYgc3RyY21wIChvcHAtPm5hbWUsICJqYWx4IikgPT0gMCkKKwkgICAgaW5mby0+dGFyZ2V0IHw9IDE7CisJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJICBicmVhazsKKworCWNhc2UgJ3AnOgorCSAgLyogU2lnbiBleHRlbmQgdGhlIGRpc3BsYWNlbWVudC4gICovCisJICBkZWx0YSA9IChsID4+IE9QX1NIX0RFTFRBKSAmIE9QX01BU0tfREVMVEE7CisJICBpZiAoZGVsdGEgJiAweDgwMDApCisJICAgIGRlbHRhIHw9IH4weGZmZmY7CisJICBpbmZvLT50YXJnZXQgPSAoZGVsdGEgPDwgMikgKyBwYyArIElOU05MRU47CisJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJICBicmVhazsKKworCWNhc2UgJ2QnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkJIG1pcHNfZ3ByX25hbWVzWyhsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkRdKTsKKwkgIGJyZWFrOworCisJY2FzZSAnVSc6CisJICB7CisJICAgIC8qIEZpcnN0IGNoZWNrIGZvciBib3RoIHJkIGFuZCBydCBiZWluZyBlcXVhbC4gICovCisJICAgIHVuc2lnbmVkIGludCByZWcgPSAobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEOworCSAgICBpZiAocmVnID09ICgobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKSkKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCQkgICAgIG1pcHNfZ3ByX25hbWVzW3JlZ10pOworCSAgICBlbHNlCisJICAgICAgeworCQkvKiBJZiBvbmUgaXMgemVybyB1c2UgdGhlIG90aGVyLiAgKi8KKwkJaWYgKHJlZyA9PSAwKQorCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJCQkgbWlwc19ncHJfbmFtZXNbKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVF0pOworCQllbHNlIGlmICgoKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVCkgPT0gMCkKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCQkJIG1pcHNfZ3ByX25hbWVzW3JlZ10pOworCQllbHNlIC8qIEJvZ3VzLCByZXN1bHQgZGVwZW5kcyBvbiBwcm9jZXNzb3IuICAqLworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgb3IgJXMiLAorCQkJCQkgbWlwc19ncHJfbmFtZXNbcmVnXSwKKwkJCQkJIG1pcHNfZ3ByX25hbWVzWyhsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlRdKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKworCWNhc2UgJ3onOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG1pcHNfZ3ByX25hbWVzWzBdKTsKKwkgIGJyZWFrOworCisJY2FzZSAnPCc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKwkJCQkgKGwgPj4gT1BfU0hfU0hBTVQpICYgT1BfTUFTS19TSEFNVCk7CisJICBicmVhazsKKworCWNhc2UgJ2MnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsCisJCQkJIChsID4+IE9QX1NIX0NPREUpICYgT1BfTUFTS19DT0RFKTsKKwkgIGJyZWFrOworCisJY2FzZSAncSc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKwkJCQkgKGwgPj4gT1BfU0hfQ09ERTIpICYgT1BfTUFTS19DT0RFMik7CisJICBicmVhazsKKworCWNhc2UgJ0MnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsCisJCQkJIChsID4+IE9QX1NIX0NPUFopICYgT1BfTUFTS19DT1BaKTsKKwkgIGJyZWFrOworCisJY2FzZSAnQic6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKworCQkJCSAobCA+PiBPUF9TSF9DT0RFMjApICYgT1BfTUFTS19DT0RFMjApOworCSAgYnJlYWs7CisKKwljYXNlICdKJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLAorCQkJCSAobCA+PiBPUF9TSF9DT0RFMTkpICYgT1BfTUFTS19DT0RFMTkpOworCSAgYnJlYWs7CisKKwljYXNlICdTJzoKKwljYXNlICdWJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJCSBtaXBzX2Zwcl9uYW1lc1sobCA+PiBPUF9TSF9GUykgJiBPUF9NQVNLX0ZTXSk7CisJICBicmVhazsKKworCWNhc2UgJ1QnOgorCWNhc2UgJ1cnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkJIG1pcHNfZnByX25hbWVzWyhsID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlRdKTsKKwkgIGJyZWFrOworCisJY2FzZSAnRCc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCQkgbWlwc19mcHJfbmFtZXNbKGwgPj4gT1BfU0hfRkQpICYgT1BfTUFTS19GRF0pOworCSAgYnJlYWs7CisKKwljYXNlICdSJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJCSBtaXBzX2Zwcl9uYW1lc1sobCA+PiBPUF9TSF9GUikgJiBPUF9NQVNLX0ZSXSk7CisJICBicmVhazsKKworCWNhc2UgJ0UnOgorCSAgLyogQ29wcm9jZXNzb3IgcmVnaXN0ZXIgZm9yIGx3Y04gaW5zdHJ1Y3Rpb25zLCBldCBhbC4KKworCSAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGxvYWQvc3RvcmUgY3AwIGluc3RydWN0aW9ucywgYW5kCisJICAgICB0aGF0IEZQVSAoY3AxKSBpbnN0cnVjdGlvbnMgZGlzYXNzZW1ibGUgdGhpcyBmaWVsZCB1c2luZworCSAgICAgJ1QnIGZvcm1hdC4gIFRoZXJlZm9yZSwgdW50aWwgd2UgZ2FpbiB1bmRlcnN0YW5kaW5nIG9mCisJICAgICBjcDIgcmVnaXN0ZXIgbmFtZXMsIHdlIGNhbiBzaW1wbHkgcHJpbnQgdGhlIHJlZ2lzdGVyCisJICAgICBudW1iZXJzLiAgKi8KKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVsZCIsCisJCQkJIChsID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpOworCSAgYnJlYWs7CisKKwljYXNlICdHJzoKKwkgIC8qIENvcHJvY2Vzc29yIHJlZ2lzdGVyIGZvciBtdGNOIGluc3RydWN0aW9ucywgZXQgYWwuICBOb3RlCisJICAgICB0aGF0IEZQVSAoY3AxKSBpbnN0cnVjdGlvbnMgZGlzYXNzZW1ibGUgdGhpcyBmaWVsZCB1c2luZworCSAgICAgJ1MnIGZvcm1hdC4gIFRoZXJlZm9yZSwgd2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IGNwMCwKKwkgICAgIGNwMiwgYW5kIGNwMy4gICovCisJICBvcCA9IChsID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1A7CisJICBpZiAob3AgPT0gT1BfT1BfQ09QMCkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkJICAgbWlwc19jcDBfbmFtZXNbKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRF0pOworCSAgZWxzZQorCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlbGQiLAorCQkJCSAgIChsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpOworCSAgYnJlYWs7CisKKwljYXNlICdLJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJCSBtaXBzX2h3cl9uYW1lc1sobCA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEXSk7CisJICBicmVhazsKKworCWNhc2UgJ04nOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sCisJCQkJICgob3BwLT5waW5mbyAmIChGUF9EIHwgRlBfUykpICE9IDAKKwkJCQkgID8gIiRmY2MlbGQiIDogIiRjYyVsZCIpLAorCQkJCSAobCA+PiBPUF9TSF9CQ0MpICYgT1BfTUFTS19CQ0MpOworCSAgYnJlYWs7CisKKwljYXNlICdNJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVsZCIsCisJCQkJIChsID4+IE9QX1NIX0NDQykgJiBPUF9NQVNLX0NDQyk7CisJICBicmVhazsKKworCWNhc2UgJ1AnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9QRVJGUkVHKSAmIE9QX01BU0tfUEVSRlJFRyk7CisJICBicmVhazsKKworCWNhc2UgJ2UnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9WRUNCWVRFKSAmIE9QX01BU0tfVkVDQllURSk7CisJICBicmVhazsKKworCWNhc2UgJyUnOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9WRUNBTElHTikgJiBPUF9NQVNLX1ZFQ0FMSUdOKTsKKwkgIGJyZWFrOworCisJY2FzZSAnSCc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsCisJCQkJIChsID4+IE9QX1NIX1NFTCkgJiBPUF9NQVNLX1NFTCk7CisJICBicmVhazsKKworCWNhc2UgJ08nOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9BTE4pICYgT1BfTUFTS19BTE4pOworCSAgYnJlYWs7CisKKwljYXNlICdRJzoKKwkgIHsKKwkgICAgdW5zaWduZWQgaW50IHZzZWwgPSAobCA+PiBPUF9TSF9WU0VMKSAmIE9QX01BU0tfVlNFTDsKKworCSAgICBpZiAoKHZzZWwgJiAweDEwKSA9PSAwKQorCSAgICAgIHsKKwkJaW50IGZtdDsKKworCQl2c2VsICY9IDB4MGY7CisJCWZvciAoZm10ID0gMDsgZm10IDwgMzsgZm10KyssIHZzZWwgPj49IDEpCisJCSAgaWYgKCh2c2VsICYgMSkgPT0gMCkKKwkJICAgIGJyZWFrOworCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiR2JWxkWyVkXSIsCisJCQkJICAgICAgIChsID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQsCisJCQkJICAgICAgIHZzZWwgPj4gMSk7CisJICAgICAgfQorCSAgICBlbHNlIGlmICgodnNlbCAmIDB4MDgpID09IDApCisJICAgICAgeworCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiR2JWxkIiwKKwkJCQkgICAgICAgKGwgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwKKwkJCQkgICAgICAgKGwgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlICdYJzoKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJHYlbGQiLAorCQkJCSAobCA+PiBPUF9TSF9GRCkgJiBPUF9NQVNLX0ZEKTsKKwkgIGJyZWFrOworCisJY2FzZSAnWSc6CisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiR2JWxkIiwKKwkJCQkgKGwgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUyk7CisJICBicmVhazsKKworCWNhc2UgJ1onOgorCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkdiVsZCIsCisJCQkJIChsID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpOworCSAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAorCQkJCSBfKCIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIiksCisJCQkJICpkKTsKKwkgIHJldHVybjsKKwl9CisgICAgfQorfQorDAorLyogQ2hlY2sgaWYgdGhlIG9iamVjdCB1c2VzIE5ld0FCSSBjb252ZW50aW9ucy4gICovCisjaWYgMAorc3RhdGljIGludAoraXNfbmV3YWJpIChoZWFkZXIpCisgICAgIEVsZl9JbnRlcm5hbF9FaGRyICpoZWFkZXI7Cit7CisgIC8qIFRoZXJlIGFyZSBubyBvbGQtc3R5bGUgQUJJcyB3aGljaCB1c2UgNjQtYml0IEVMRi4gICovCisgIGlmIChoZWFkZXItPmVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpCisgICAgcmV0dXJuIDE7CisKKyAgLyogSWYgYSAzMi1iaXQgRUxGIGZpbGUsIG4zMiBpcyBhIG5ldy1zdHlsZSBBQkkuICAqLworICBpZiAoKGhlYWRlci0+ZV9mbGFncyAmIEVGX01JUFNfQUJJMikgIT0gMCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorDAorLyogUHJpbnQgdGhlIG1pcHMgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKKyAgIG9uIHVzaW5nIElORk8uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLCB3aGljaCBpcworICAgYWx3YXlzIElOU05MRU4uICBCSUdFTkRJQU4gbXVzdCBiZSAxIGlmIHRoaXMgaXMgYmlnLWVuZGlhbiBjb2RlLCAwIGlmCisgICB0aGlzIGlzIGxpdHRsZS1lbmRpYW4gY29kZS4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fbWlwcyAoYmZkX3ZtYSBtZW1hZGRyLAorCQkgdW5zaWduZWQgbG9uZyBpbnQgd29yZCwKKwkJIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wOworICBzdGF0aWMgYmZkX2Jvb2xlYW4gaW5pdCA9IDA7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfaGFzaFtPUF9NQVNLX09QICsgMV07CisKKyAgLyogQnVpbGQgYSBoYXNoIHRhYmxlIHRvIHNob3J0ZW4gdGhlIHNlYXJjaCB0aW1lLiAgKi8KKyAgaWYgKCEgaW5pdCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgZm9yIChpID0gMDsgaSA8PSBPUF9NQVNLX09QOyBpKyspCisJeworCSAgZm9yIChvcCA9IG1pcHNfb3Bjb2Rlczsgb3AgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdOyBvcCsrKQorCSAgICB7CisJICAgICAgaWYgKG9wLT5waW5mbyA9PSBJTlNOX01BQ1JPCisJCSAgfHwgKG5vX2FsaWFzZXMgJiYgKG9wLT5waW5mbzIgJiBJTlNOMl9BTElBUykpKQorCQljb250aW51ZTsKKwkgICAgICBpZiAoaSA9PSAoKG9wLT5tYXRjaCA+PiBPUF9TSF9PUCkgJiBPUF9NQVNLX09QKSkKKwkJeworCQkgIG1pcHNfaGFzaFtpXSA9IG9wOworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwl9CisKKyAgICAgIGluaXQgPSAxOworICAgIH0KKworICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSBJTlNOTEVOOworICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKKyAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsKKyAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsKKyAgaW5mby0+ZGF0YV9zaXplID0gMDsKKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsKKyAgaW5mby0+dGFyZ2V0ID0gMDsKKyAgaW5mby0+dGFyZ2V0MiA9IDA7CisKKyAgb3AgPSBtaXBzX2hhc2hbKHdvcmQgPj4gT1BfU0hfT1ApICYgT1BfTUFTS19PUF07CisgIGlmIChvcCAhPSBOVUxMKQorICAgIHsKKyAgICAgIGZvciAoOyBvcCA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU107IG9wKyspCisJeworCSAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPCisJICAgICAgJiYgIShub19hbGlhc2VzICYmIChvcC0+cGluZm8yICYgSU5TTjJfQUxJQVMpKQorCSAgICAgICYmICh3b3JkICYgb3AtPm1hc2spID09IG9wLT5tYXRjaCkKKwkgICAgeworCSAgICAgIGNvbnN0IGNoYXIgKmQ7CisKKwkgICAgICAvKiBXZSBhbHdheXMgYWxsb3cgdG8gZGlzYXNzZW1ibGUgdGhlIGphbHggaW5zdHJ1Y3Rpb24uICAqLworCSAgICAgIGlmICghIE9QQ09ERV9JU19NRU1CRVIgKG9wLCBtaXBzX2lzYSwgbWlwc19wcm9jZXNzb3IpCisJCSAgJiYgc3RyY21wIChvcC0+bmFtZSwgImphbHgiKSkKKwkJY29udGludWU7CisKKwkgICAgICAvKiBGaWd1cmUgb3V0IGluc3RydWN0aW9uIHR5cGUgYW5kIGJyYW5jaCBkZWxheSBpbmZvcm1hdGlvbi4gICovCisJICAgICAgaWYgKChvcC0+cGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpICE9IDApCisJICAgICAgICB7CisJCSAgaWYgKChpbmZvLT5pbnNuX3R5cGUgJiBJTlNOX1dSSVRFX0dQUl8zMSkgIT0gMCkKKwkJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19qc3I7CisJCSAgZWxzZQorCQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKKwkJICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOworCQl9CisJICAgICAgZWxzZSBpZiAoKG9wLT5waW5mbyAmIChJTlNOX0NPTkRfQlJBTkNIX0RFTEFZCisJCQkJICAgICB8IElOU05fQ09ORF9CUkFOQ0hfTElLRUxZKSkgIT0gMCkKKwkJeworCQkgIGlmICgoaW5mby0+aW5zbl90eXBlICYgSU5TTl9XUklURV9HUFJfMzEpICE9IDApCisJCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGpzcjsKKwkJICBlbHNlCisJCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKKwkJICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOworCQl9CisJICAgICAgZWxzZSBpZiAoKG9wLT5waW5mbyAmIChJTlNOX1NUT1JFX01FTU9SWQorCQkJCSAgICAgfCBJTlNOX0xPQURfTUVNT1JZX0RFTEFZKSkgIT0gMCkKKwkJaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7CisKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOworCisJICAgICAgZCA9IG9wLT5hcmdzOworCSAgICAgIGlmIChkICE9IE5VTEwgJiYgKmQgIT0gJ1wwJykKKwkJeworCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKKwkJICBwcmludF9pbnNuX2FyZ3MgKGQsIHdvcmQsIG1lbWFkZHIsIGluZm8sIG9wKTsKKwkJfQorCisJICAgICAgcmV0dXJuIElOU05MRU47CisJICAgIH0KKwl9CisgICAgfQorCisgIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247CisgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB3b3JkKTsKKyAgcmV0dXJuIElOU05MRU47Cit9CisMCisvKiBJbiBhbiBlbnZpcm9ubWVudCB3aGVyZSB3ZSBkbyBub3Qga25vdyB0aGUgc3ltYm9sIHR5cGUgb2YgdGhlCisgICBpbnN0cnVjdGlvbiB3ZSBhcmUgZm9yY2VkIHRvIGFzc3VtZSB0aGF0IHRoZSBsb3cgb3JkZXIgYml0IG9mIHRoZQorICAgaW5zdHJ1Y3Rpb25zJyBhZGRyZXNzIG1heSBtYXJrIGl0IGFzIGEgbWlwczE2IGluc3RydWN0aW9uLiAgSWYgd2UKKyAgIGFyZSBzaW5nbGUgc3RlcHBpbmcsIG9yIHRoZSBwYyBpcyB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlZCBmdW5jdGlvbiwKKyAgIHRoaXMgd29ya3MuICBPdGhlcndpc2UsIHdlIG5lZWQgYSBjbHVlLiAgU29tZXRpbWVzLiAgKi8KKworc3RhdGljIGludAorX3ByaW50X2luc25fbWlwcyAoYmZkX3ZtYSBtZW1hZGRyLAorCQkgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLAorCQkgIGVudW0gYmZkX2VuZGlhbiBlbmRpYW5uZXNzKQoreworICBiZmRfYnl0ZSBidWZmZXJbSU5TTkxFTl07CisgIGludCBzdGF0dXM7CisKKyAgc2V0X2RlZmF1bHRfbWlwc19kaXNfb3B0aW9ucyAoaW5mbyk7CisgIHBhcnNlX21pcHNfZGlzX29wdGlvbnMgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKTsKKworI2lmIDAKKyNpZiAxCisgIC8qIEZJWE1FOiBJZiBvZGQgYWRkcmVzcywgdGhpcyBpcyBDTEVBUkxZIGEgbWlwcyAxNiBpbnN0cnVjdGlvbi4gICovCisgIC8qIE9ubHkgYSBmZXcgdG9vbHMgd2lsbCB3b3JrIHRoaXMgd2F5LiAgKi8KKyAgaWYgKG1lbWFkZHIgJiAweDAxKQorICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7CisjZW5kaWYKKworI2lmIFNZTVRBQl9BVkFJTEFCTEUKKyAgaWYgKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfbWlwczE2CisgICAgICB8fCAoaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCisJICAmJiBpbmZvLT5zeW1ib2xzICE9IE5VTEwKKwkgICYmICgoKihlbGZfc3ltYm9sX3R5cGUgKiopIGluZm8tPnN5bWJvbHMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyCisJICAgICAgPT0gU1RPX01JUFMxNikpKQorICAgIHJldHVybiBwcmludF9pbnNuX21pcHMxNiAobWVtYWRkciwgaW5mbyk7CisjZW5kaWYKKyNlbmRpZgorCisgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgSU5TTkxFTiwgaW5mbyk7CisgIGlmIChzdGF0dXMgPT0gMCkKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIGluc247CisKKyAgICAgIGlmIChlbmRpYW5uZXNzID09IEJGRF9FTkRJQU5fQklHKQorCWluc24gPSAodW5zaWduZWQgbG9uZykgYmZkX2dldGIzMiAoYnVmZmVyKTsKKyAgICAgIGVsc2UKKwlpbnNuID0gKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKyAgICAgIHJldHVybiBwcmludF9pbnNuX21pcHMgKG1lbWFkZHIsIGluc24sIGluZm8pOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworaW50CitwcmludF9pbnNuX2JpZ19taXBzIChiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICByZXR1cm4gX3ByaW50X2luc25fbWlwcyAobWVtYWRkciwgaW5mbywgQkZEX0VORElBTl9CSUcpOworfQorCitpbnQKK3ByaW50X2luc25fbGl0dGxlX21pcHMgKGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pCit7CisgIHJldHVybiBfcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCBpbmZvLCBCRkRfRU5ESUFOX0xJVFRMRSk7Cit9CisMCisvKiBEaXNhc3NlbWJsZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zLiAgKi8KKyNpZiAwCitzdGF0aWMgaW50CitwcmludF9pbnNuX21pcHMxNiAoYmZkX3ZtYSBtZW1hZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgaW50IHN0YXR1czsKKyAgYmZkX2J5dGUgYnVmZmVyWzJdOworICBpbnQgbGVuZ3RoOworICBpbnQgaW5zbjsKKyAgYmZkX2Jvb2xlYW4gdXNlX2V4dGVuZDsKKyAgaW50IGV4dGVuZCA9IDA7CisgIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3AsICpvcGVuZDsKKworICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOworICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKKyAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsKKyAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMDsKKyAgaW5mby0+ZGF0YV9zaXplID0gMDsKKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmJyYW5jaDsKKyAgaW5mby0+dGFyZ2V0ID0gMDsKKyAgaW5mby0+dGFyZ2V0MiA9IDA7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBsZW5ndGggPSAyOworCisgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCisgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7CisgIGVsc2UKKyAgICBpbnNuID0gYmZkX2dldGwxNiAoYnVmZmVyKTsKKworICAvKiBIYW5kbGUgdGhlIGV4dGVuZCBvcGNvZGUgc3BlY2lhbGx5LiAgKi8KKyAgdXNlX2V4dGVuZCA9IEZBTFNFOworICBpZiAoKGluc24gJiAweGY4MDApID09IDB4ZjAwMCkKKyAgICB7CisgICAgICB1c2VfZXh0ZW5kID0gVFJVRTsKKyAgICAgIGV4dGVuZCA9IGluc24gJiAweDdmZjsKKworICAgICAgbWVtYWRkciArPSAyOworCisgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOworICAgICAgaWYgKHN0YXR1cyAhPSAwKQorCXsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAorCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOworCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7CisJICByZXR1cm4gLTE7CisJfQorCisgICAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQorCWluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOworICAgICAgZWxzZQorCWluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOworCisgICAgICAvKiBDaGVjayBmb3IgYW4gZXh0ZW5kIG9wY29kZSBmb2xsb3dlZCBieSBhbiBleHRlbmQgb3Bjb2RlLiAgKi8KKyAgICAgIGlmICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKQorCXsKKwkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAorCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOworCSAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247CisJICByZXR1cm4gbGVuZ3RoOworCX0KKworICAgICAgbGVuZ3RoICs9IDI7CisgICAgfQorCisgIC8qIEZJWE1FOiBTaG91bGQgcHJvYmFibHkgdXNlIGEgaGFzaCB0YWJsZSBvbiB0aGUgbWFqb3Igb3Bjb2RlIGhlcmUuICAqLworCisgIG9wZW5kID0gbWlwczE2X29wY29kZXMgKyBiZmRfbWlwczE2X251bV9vcGNvZGVzOworICBmb3IgKG9wID0gbWlwczE2X29wY29kZXM7IG9wIDwgb3BlbmQ7IG9wKyspCisgICAgeworICAgICAgaWYgKG9wLT5waW5mbyAhPSBJTlNOX01BQ1JPCisJICAmJiAhKG5vX2FsaWFzZXMgJiYgKG9wLT5waW5mbzIgJiBJTlNOMl9BTElBUykpCisJICAmJiAoaW5zbiAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCisJeworCSAgY29uc3QgY2hhciAqczsKKworCSAgaWYgKHN0cmNociAob3AtPmFyZ3MsICdhJykgIT0gTlVMTCkKKwkgICAgeworCSAgICAgIGlmICh1c2VfZXh0ZW5kKQorCQl7CisJCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCisJCQkJCSAodW5zaWduZWQgaW50KSBleHRlbmQpOworCQkgIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOworCQkgIHJldHVybiBsZW5ndGggLSAyOworCQl9CisKKwkgICAgICB1c2VfZXh0ZW5kID0gRkFMU0U7CisKKwkgICAgICBtZW1hZGRyICs9IDI7CisKKwkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsCisJCQkJCQkgIGluZm8pOworCSAgICAgIGlmIChzdGF0dXMgPT0gMCkKKwkJeworCQkgIHVzZV9leHRlbmQgPSBUUlVFOworCQkgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCisJCSAgICBleHRlbmQgPSBiZmRfZ2V0YjE2IChidWZmZXIpOworCQkgIGVsc2UKKwkJICAgIGV4dGVuZCA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7CisJCSAgbGVuZ3RoICs9IDI7CisJCX0KKwkgICAgfQorCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOworCSAgaWYgKG9wLT5hcmdzWzBdICE9ICdcMCcpCisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKKworCSAgZm9yIChzID0gb3AtPmFyZ3M7ICpzICE9ICdcMCc7IHMrKykKKwkgICAgeworCSAgICAgIGlmICgqcyA9PSAnLCcKKwkJICAmJiBzWzFdID09ICd3JworCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlgpICYgTUlQUzE2T1BfTUFTS19SWCkKKwkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlkpKSkKKwkJeworCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLworCQkgICsrczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIGlmICgqcyA9PSAnLCcKKwkJICAmJiBzWzFdID09ICd2JworCQkgICYmICgoKGluc24gPj4gTUlQUzE2T1BfU0hfUlopICYgTUlQUzE2T1BfTUFTS19SWikKKwkJICAgICAgPT0gKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpKSkKKwkJeworCQkgIC8qIFNraXAgdGhlIHJlZ2lzdGVyIGFuZCB0aGUgY29tbWEuICAqLworCQkgICsrczsKKwkJICBjb250aW51ZTsKKwkJfQorCSAgICAgIHByaW50X21pcHMxNl9pbnNuX2FyZyAoKnMsIG9wLCBpbnNuLCB1c2VfZXh0ZW5kLCBleHRlbmQsIG1lbWFkZHIsCisJCQkJICAgICBpbmZvKTsKKwkgICAgfQorCisJICBpZiAoKG9wLT5waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKKwkgICAgeworCSAgICAgIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDE7CisJICAgICAgaWYgKGluZm8tPmluc25fdHlwZSAhPSBkaXNfanNyKQorCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfYnJhbmNoOworCSAgICB9CisKKwkgIHJldHVybiBsZW5ndGg7CisJfQorICAgIH0KKworICBpZiAodXNlX2V4dGVuZCkKKyAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBleHRlbmQgfCAweGYwMDApOworICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuKTsKKyAgaW5mby0+aW5zbl90eXBlID0gZGlzX25vbmluc247CisKKyAgcmV0dXJuIGxlbmd0aDsKK30KKworLyogRGlzYXNzZW1ibGUgYW4gb3BlcmFuZCBmb3IgYSBtaXBzMTYgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfbWlwczE2X2luc25fYXJnIChjaGFyIHR5cGUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm9wLAorCQkgICAgICAgaW50IGwsCisJCSAgICAgICBiZmRfYm9vbGVhbiB1c2VfZXh0ZW5kLAorCQkgICAgICAgaW50IGV4dGVuZCwKKwkJICAgICAgIGJmZF92bWEgbWVtYWRkciwKKwkJICAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgIGNhc2UgJywnOgorICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyknOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsIHR5cGUpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd5JzoKKyAgICBjYXNlICd3JzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJICAgICBtaXBzMTZfcmVnX25hbWVzKCgobCA+PiBNSVBTMTZPUF9TSF9SWSkKKwkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWSkpKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAneCc6CisgICAgY2FzZSAndic6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCSAgICAgbWlwczE2X3JlZ19uYW1lcygoKGwgPj4gTUlQUzE2T1BfU0hfUlgpCisJCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3onOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCisJCQkgICAgIG1pcHMxNl9yZWdfbmFtZXMoKChsID4+IE1JUFMxNk9QX1NIX1JaKQorCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JaKSkpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdaJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJICAgICBtaXBzMTZfcmVnX25hbWVzKCgobCA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQorCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzAnOgorICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG1pcHNfZ3ByX25hbWVzWzBdKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUyc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbWlwc19ncHJfbmFtZXNbMjldKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnUCc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRwYyIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdSJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBtaXBzX2dwcl9uYW1lc1szMV0pOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdYJzoKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAorCQkJICAgICBtaXBzX2dwcl9uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQorCQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JFR1IzMildKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnWSc6CisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwKKwkJCSAgICAgbWlwc19ncHJfbmFtZXNbTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKGwpXSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgJzwnOgorICAgIGNhc2UgJz4nOgorICAgIGNhc2UgJ1snOgorICAgIGNhc2UgJ10nOgorICAgIGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOgorICAgIGNhc2UgJ0gnOgorICAgIGNhc2UgJ1cnOgorICAgIGNhc2UgJ0QnOgorICAgIGNhc2UgJ2onOgorICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzgnOgorICAgIGNhc2UgJ1YnOgorICAgIGNhc2UgJ0MnOgorICAgIGNhc2UgJ1UnOgorICAgIGNhc2UgJ2snOgorICAgIGNhc2UgJ0snOgorICAgIGNhc2UgJ3AnOgorICAgIGNhc2UgJ3EnOgorICAgIGNhc2UgJ0EnOgorICAgIGNhc2UgJ0InOgorICAgIGNhc2UgJ0UnOgorICAgICAgeworCWludCBpbW1lZCwgbmJpdHMsIHNoaWZ0LCBzaWduZWRwLCBleHRiaXRzLCBwY3JlbCwgZXh0dSwgYnJhbmNoOworCisJc2hpZnQgPSAwOworCXNpZ25lZHAgPSAwOworCWV4dGJpdHMgPSAxNjsKKwlwY3JlbCA9IDA7CisJZXh0dSA9IDA7CisJYnJhbmNoID0gMDsKKwlzd2l0Y2ggKHR5cGUpCisJICB7CisJICBjYXNlICc8JzoKKwkgICAgbmJpdHMgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7CisJICAgIGV4dGJpdHMgPSA1OworCSAgICBleHR1ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICc+JzoKKwkgICAgbmJpdHMgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7CisJICAgIGV4dGJpdHMgPSA1OworCSAgICBleHR1ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdbJzoKKwkgICAgbmJpdHMgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7CisJICAgIGV4dGJpdHMgPSA2OworCSAgICBleHR1ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICddJzoKKwkgICAgbmJpdHMgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7CisJICAgIGV4dGJpdHMgPSA2OworCSAgICBleHR1ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICc0JzoKKwkgICAgbmJpdHMgPSA0OworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTQpICYgTUlQUzE2T1BfTUFTS19JTU00OworCSAgICBzaWduZWRwID0gMTsKKwkgICAgZXh0Yml0cyA9IDE1OworCSAgICBicmVhazsKKwkgIGNhc2UgJzUnOgorCSAgICBuYml0cyA9IDU7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCSAgICBpbmZvLT5kYXRhX3NpemUgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ0gnOgorCSAgICBuYml0cyA9IDU7CisJICAgIHNoaWZ0ID0gMTsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7CisJICAgIGluZm8tPmRhdGFfc2l6ZSA9IDI7CisJICAgIGJyZWFrOworCSAgY2FzZSAnVyc6CisJICAgIG5iaXRzID0gNTsKKwkgICAgc2hpZnQgPSAyOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OworCSAgICBpZiAoKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfUEMpID09IDAKKwkJJiYgKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApID09IDApCisJICAgICAgeworCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkJaW5mby0+ZGF0YV9zaXplID0gNDsKKwkgICAgICB9CisJICAgIGJyZWFrOworCSAgY2FzZSAnRCc6CisJICAgIG5iaXRzID0gNTsKKwkgICAgc2hpZnQgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OworCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKKwkgICAgYnJlYWs7CisJICBjYXNlICdqJzoKKwkgICAgbmJpdHMgPSA1OworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OworCSAgICBzaWduZWRwID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICc2JzoKKwkgICAgbmJpdHMgPSA2OworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OworCSAgICBicmVhazsKKwkgIGNhc2UgJzgnOgorCSAgICBuYml0cyA9IDg7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIGJyZWFrOworCSAgY2FzZSAnVic6CisJICAgIG5iaXRzID0gODsKKwkgICAgc2hpZnQgPSAyOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OworCSAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBiZSBsdywgb3IgaXQgbWlnaHQgYmUgYWRkaXUgdG8gJHNwIG9yCisgICAgICAgICAgICAgICAkcGMuICBXZSBhc3N1bWUgaXQncyBsb2FkLiAgKi8KKwkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7CisJICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7CisJICAgIGJyZWFrOworCSAgY2FzZSAnQyc6CisJICAgIG5iaXRzID0gODsKKwkgICAgc2hpZnQgPSAzOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OworCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKKwkgICAgYnJlYWs7CisJICBjYXNlICdVJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OworCSAgICBleHR1ID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdrJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OworCSAgICBzaWduZWRwID0gMTsKKwkgICAgYnJlYWs7CisJICBjYXNlICdLJzoKKwkgICAgbmJpdHMgPSA4OworCSAgICBzaGlmdCA9IDM7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3AnOgorCSAgICBuYml0cyA9IDg7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBwY3JlbCA9IDE7CisJICAgIGJyYW5jaCA9IDE7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOworCSAgICBicmVhazsKKwkgIGNhc2UgJ3EnOgorCSAgICBuYml0cyA9IDExOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTExKSAmIE1JUFMxNk9QX01BU0tfSU1NMTE7CisJICAgIHNpZ25lZHAgPSAxOworCSAgICBwY3JlbCA9IDE7CisJICAgIGJyYW5jaCA9IDE7CisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7CisJICAgIGJyZWFrOworCSAgY2FzZSAnQSc6CisJICAgIG5iaXRzID0gODsKKwkgICAgc2hpZnQgPSAyOworCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OworCSAgICBwY3JlbCA9IDE7CisJICAgIC8qIEZJWE1FOiBUaGlzIGNhbiBiZSBsdyBvciBsYS4gIFdlIGFzc3VtZSBpdCBpcyBsdy4gICovCisJICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOworCSAgICBpbmZvLT5kYXRhX3NpemUgPSA0OworCSAgICBicmVhazsKKwkgIGNhc2UgJ0InOgorCSAgICBuYml0cyA9IDU7CisJICAgIHNoaWZ0ID0gMzsKKwkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKKwkgICAgcGNyZWwgPSAxOworCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKKwkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKKwkgICAgYnJlYWs7CisJICBjYXNlICdFJzoKKwkgICAgbmJpdHMgPSA1OworCSAgICBzaGlmdCA9IDI7CisJICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7CisJICAgIHBjcmVsID0gMTsKKwkgICAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgICBhYm9ydCAoKTsKKwkgIH0KKworCWlmICghIHVzZV9leHRlbmQpCisJICB7CisJICAgIGlmIChzaWduZWRwICYmIGltbWVkID49ICgxIDw8IChuYml0cyAtIDEpKSkKKwkgICAgICBpbW1lZCAtPSAxIDw8IG5iaXRzOworCSAgICBpbW1lZCA8PD0gc2hpZnQ7CisJICAgIGlmICgodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCisJCSYmIGltbWVkID09IDApCisJICAgICAgaW1tZWQgPSA4OworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgaWYgKGV4dGJpdHMgPT0gMTYpCisJICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweDFmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZTApOworCSAgICBlbHNlIGlmIChleHRiaXRzID09IDE1KQorCSAgICAgIGltbWVkIHw9ICgoZXh0ZW5kICYgMHhmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZjApOworCSAgICBlbHNlCisJICAgICAgaW1tZWQgPSAoKGV4dGVuZCA+PiA2KSAmIDB4MWYpIHwgKGV4dGVuZCAmIDB4MjApOworCSAgICBpbW1lZCAmPSAoMSA8PCBleHRiaXRzKSAtIDE7CisJICAgIGlmICghIGV4dHUgJiYgaW1tZWQgPj0gKDEgPDwgKGV4dGJpdHMgLSAxKSkpCisJICAgICAgaW1tZWQgLT0gMSA8PCBleHRiaXRzOworCSAgfQorCisJaWYgKCEgcGNyZWwpCisJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW1tZWQpOworCWVsc2UKKwkgIHsKKwkgICAgYmZkX3ZtYSBiYXNlYWRkcjsKKworCSAgICBpZiAoYnJhbmNoKQorCSAgICAgIHsKKwkJaW1tZWQgKj0gMjsKKwkJYmFzZWFkZHIgPSBtZW1hZGRyICsgMjsKKwkgICAgICB9CisJICAgIGVsc2UgaWYgKHVzZV9leHRlbmQpCisJICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKKwkgICAgZWxzZQorCSAgICAgIHsKKwkJaW50IHN0YXR1czsKKwkJYmZkX2J5dGUgYnVmZmVyWzJdOworCisJCWJhc2VhZGRyID0gbWVtYWRkcjsKKworCQkvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGEganIKKyAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICBqciBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGluIHRoZSBkZWxheSBzbG90IG9mIGphbHIKKyAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIGJhc2UgYWRkcmVzcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICBqYWxyIGluc3RydWN0aW9uLiAgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGU6IHdlIGhhdmUKKyAgICAgICAgICAgICAgICAgICBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB3b3JkIGlzCisgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gb3IgZGF0YS4gICovCisJCXN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LCBidWZmZXIsIDIsCisJCQkJCQkgICAgaW5mbyk7CisJCWlmIChzdGF0dXMgPT0gMAorCQkgICAgJiYgKCgoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCisJCQkgID8gYmZkX2dldGIxNiAoYnVmZmVyKQorCQkJICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCisJCQkgJiAweGY4MDApID09IDB4MTgwMCkpCisJCSAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gNDsKKwkJZWxzZQorCQkgIHsKKwkJICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSAyLCBidWZmZXIsCisJCQkJCQkJMiwgaW5mbyk7CisJCSAgICBpZiAoc3RhdHVzID09IDAKKwkJCSYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRworCQkJICAgICAgPyBiZmRfZ2V0YjE2IChidWZmZXIpCisJCQkgICAgICA6IGJmZF9nZXRsMTYgKGJ1ZmZlcikpCisJCQkgICAgICYgMHhmODFmKSA9PSAweGU4MDApKQorCQkgICAgICBiYXNlYWRkciA9IG1lbWFkZHIgLSAyOworCQkgIH0KKwkgICAgICB9CisJICAgIGluZm8tPnRhcmdldCA9IChiYXNlYWRkciAmIH4oKDEgPDwgc2hpZnQpIC0gMSkpICsgaW1tZWQ7CisJICAgIGlmIChwY3JlbCAmJiBicmFuY2gKKwkJJiYgaW5mby0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91cikKKwkgICAgICAvKiBGb3IgZ2RiIGRpc2Fzc2VtYmxlciwgbWFpbnRhaW4gb2RkIGFkZHJlc3MuICAqLworCSAgICAgIGluZm8tPnRhcmdldCB8PSAxOworCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisJICB9CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgJ2EnOgorICAgICAgeworCWludCBqYWx4ID0gbCAmIDB4NDAwOworCisJaWYgKCEgdXNlX2V4dGVuZCkKKwkgIGV4dGVuZCA9IDA7CisJbCA9ICgobCAmIDB4MWYpIDw8IDIzKSB8ICgobCAmIDB4M2UwKSA8PCAxMykgfCAoZXh0ZW5kIDw8IDIpOworCWlmICghamFseCAmJiBpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyKQorCSAgLyogRm9yIGdkYiBkaXNhc3NlbWJsZXIsIG1haW50YWluIG9kZCBhZGRyZXNzLiAgKi8KKwkgIGwgfD0gMTsKKyAgICAgIH0KKyAgICAgIGluZm8tPnRhcmdldCA9ICgobWVtYWRkciArIDQpICYgfihiZmRfdm1hKSAweDBmZmZmZmZmKSB8IGw7CisgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7CisgICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOworICAgICAgaW5mby0+YnJhbmNoX2RlbGF5X2luc25zID0gMTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbCc6CisgICAgY2FzZSAnTCc6CisgICAgICB7CisJaW50IG5lZWRfY29tbWEsIGFtYXNrLCBzbWFzazsKKworCW5lZWRfY29tbWEgPSAwOworCisJbCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OworCisJYW1hc2sgPSAobCA+PiAzKSAmIDc7CisKKwlpZiAoYW1hc2sgPiAwICYmIGFtYXNrIDwgNSkKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG1pcHNfZ3ByX25hbWVzWzRdKTsKKwkgICAgaWYgKGFtYXNrID4gMSkKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0lcyIsCisJCQkJICAgICBtaXBzX2dwcl9uYW1lc1thbWFzayArIDNdKTsKKwkgICAgbmVlZF9jb21tYSA9IDE7CisJICB9CisKKwlzbWFzayA9IChsID4+IDEpICYgMzsKKwlpZiAoc21hc2sgPT0gMykKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcz8/IiwKKwkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOworCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIH0KKwllbHNlIGlmIChzbWFzayA+IDApCisJICB7CisJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMlcyIsCisJCQkJICAgbmVlZF9jb21tYSA/ICIsIiA6ICIiLAorCQkJCSAgIG1pcHNfZ3ByX25hbWVzWzE2XSk7CisJICAgIGlmIChzbWFzayA+IDEpCisJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJXMiLAorCQkJCSAgICAgbWlwc19ncHJfbmFtZXNbc21hc2sgKyAxNV0pOworCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIH0KKworCWlmIChsICYgMSkKKwkgIHsKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyVzIiwKKwkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIsCisJCQkJICAgbWlwc19ncHJfbmFtZXNbMzFdKTsKKwkgICAgbmVlZF9jb21tYSA9IDE7CisJICB9CisKKwlpZiAoYW1hc2sgPT0gNSB8fCBhbWFzayA9PSA2KQorCSAgeworCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJGYwIiwKKwkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOworCSAgICBpZiAoYW1hc2sgPT0gNikKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kZjEiKTsKKwkgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAnbSc6CisgICAgY2FzZSAnTSc6CisgICAgICAvKiBNSVBTMTZlIHNhdmUvcmVzdG9yZS4gICovCisgICAgICB7CisgICAgICBpbnQgbmVlZF9jb21tYSA9IDA7CisgICAgICBpbnQgYW1hc2ssIGFyZ3MsIHN0YXRpY3M7CisgICAgICBpbnQgbnNyZWcsIHNtYXNrOworICAgICAgaW50IGZyYW1lc3o7CisgICAgICBpbnQgaSwgajsKKworICAgICAgbCA9IGwgJiAweDdmOworICAgICAgaWYgKHVzZV9leHRlbmQpCisgICAgICAgIGwgfD0gZXh0ZW5kIDw8IDE2OworCisgICAgICBhbWFzayA9IChsID4+IDE2KSAmIDB4ZjsKKyAgICAgIGlmIChhbWFzayA9PSBNSVBTMTZfQUxMX0FSR1MpCisgICAgICAgIHsKKyAgICAgICAgICBhcmdzID0gNDsKKyAgICAgICAgICBzdGF0aWNzID0gMDsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAoYW1hc2sgPT0gTUlQUzE2X0FMTF9TVEFUSUNTKQorICAgICAgICB7CisgICAgICAgICAgYXJncyA9IDA7CisgICAgICAgICAgc3RhdGljcyA9IDQ7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIGFyZ3MgPSBhbWFzayA+PiAyOworICAgICAgICAgIHN0YXRpY3MgPSBhbWFzayAmIDM7CisgICAgICAgIH0KKworICAgICAgaWYgKGFyZ3MgPiAwKSB7CisgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG1pcHNfZ3ByX25hbWVzWzRdKTsKKyAgICAgICAgICBpZiAoYXJncyA+IDEpCisgICAgICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfZ3ByX25hbWVzWzQgKyBhcmdzIC0gMV0pOworICAgICAgICAgIG5lZWRfY29tbWEgPSAxOworICAgICAgfQorCisgICAgICBmcmFtZXN6ID0gKCgobCA+PiAxNikgJiAweGYwKSB8IChsICYgMHgwZikpICogODsKKyAgICAgIGlmIChmcmFtZXN6ID09IDAgJiYgIXVzZV9leHRlbmQpCisgICAgICAgIGZyYW1lc3ogPSAxMjg7CisKKyAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzeik7CisKKyAgICAgIGlmIChsICYgMHg0MCkgICAgICAgICAgICAgICAgICAgLyogJHJhICovCisgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgbWlwc19ncHJfbmFtZXNbMzFdKTsKKworICAgICAgbnNyZWcgPSAobCA+PiAyNCkgJiAweDc7CisgICAgICBzbWFzayA9IDA7CisgICAgICBpZiAobCAmIDB4MjApICAgICAgICAgICAgICAgICAgIC8qICRzMCAqLworICAgICAgICBzbWFzayB8PSAxIDw8IDA7CisgICAgICBpZiAobCAmIDB4MTApICAgICAgICAgICAgICAgICAgIC8qICRzMSAqLworICAgICAgICBzbWFzayB8PSAxIDw8IDE7CisgICAgICBpZiAobnNyZWcgPiAwKSAgICAgICAgICAgICAgICAgIC8qICRzMi0kczggKi8KKyAgICAgICAgc21hc2sgfD0gKCgxIDw8IG5zcmVnKSAtIDEpIDw8IDI7CisKKyAgICAgIC8qIEZpbmQgZmlyc3Qgc2V0IHN0YXRpYyByZWcgYml0LiAgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoc21hc2sgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfZ3ByX25hbWVzW2kgPT0gOCA/IDMwIDogKDE2ICsgaSldKTsKKyAgICAgICAgICAgICAgLyogU2tpcCBvdmVyIHN0cmluZyBvZiBzZXQgYml0cy4gICovCisgICAgICAgICAgICAgIGZvciAoaiA9IGk7IHNtYXNrICYgKDIgPDwgaik7IGorKykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgaWYgKGogPiBpKQorICAgICAgICAgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfZ3ByX25hbWVzW2ogPT0gOCA/IDMwIDogKDE2ICsgaildKTsKKyAgICAgICAgICAgICAgaSA9IGogKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIC8qIFN0YXRpY3MgJGF4IC0gJGEzLiAgKi8KKyAgICAgIGlmIChzdGF0aWNzID09IDEpCisgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzIiwgbWlwc19ncHJfbmFtZXNbN10pOworICAgICAgZWxzZSBpZiAoc3RhdGljcyA+IDApCisgICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVzLSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzX2dwcl9uYW1lc1s3IC0gc3RhdGljcyArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfZ3ByX25hbWVzWzddKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCisgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKKwkoaW5mby0+c3RyZWFtLAorCSBfKCIjIGludGVybmFsIGRpc2Fzc2VtYmxlciBlcnJvciwgdW5yZWNvZ25pc2VkIG1vZGlmaWVyICglYykiKSwKKwkgdHlwZSk7CisgICAgICBhYm9ydCAoKTsKKyAgICB9Cit9CisKK3ZvaWQKK3ByaW50X21pcHNfZGlzYXNzZW1ibGVyX29wdGlvbnMgKEZJTEUgKnN0cmVhbSkKK3sKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKK1RoZSBmb2xsb3dpbmcgTUlQUyBzcGVjaWZpYyBkaXNhc3NlbWJsZXIgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGZvciB1c2VcblwKK3dpdGggdGhlIC1NIHN3aXRjaCAobXVsdGlwbGUgb3B0aW9ucyBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyk6XG4iKSk7CisKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKKyAgZ3ByLW5hbWVzPUFCSSAgICAgICAgICAgIFByaW50IEdQUiBuYW1lcyBhY2NvcmRpbmcgdG8gIHNwZWNpZmllZCBBQkkuXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiBiYXNlZCBvbiBiaW5hcnkgYmVpbmcgZGlzYXNzZW1ibGVkLlxuIikpOworCisgIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCisgIGZwci1uYW1lcz1BQkkgICAgICAgICAgICBQcmludCBGUFIgbmFtZXMgYWNjb3JkaW5nIHRvIHNwZWNpZmllZCBBQkkuXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiBudW1lcmljLlxuIikpOworCisgIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCisgIGNwMC1uYW1lcz1BUkNIICAgICAgICAgICBQcmludCBDUDAgcmVnaXN0ZXIgbmFtZXMgYWNjb3JkaW5nIHRvXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLlxuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogYmFzZWQgb24gYmluYXJ5IGJlaW5nIGRpc2Fzc2VtYmxlZC5cbiIpKTsKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuXAorICBod3ItbmFtZXM9QVJDSCAgICAgICAgICAgUHJpbnQgSFdSIG5hbWVzIGFjY29yZGluZyB0byBzcGVjaWZpZWRcblwKKwkJCSAgIGFyY2hpdGVjdHVyZS5cblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IGJhc2VkIG9uIGJpbmFyeSBiZWluZyBkaXNhc3NlbWJsZWQuXG4iKSk7CisKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKKyAgcmVnLW5hbWVzPUFCSSAgICAgICAgICAgIFByaW50IEdQUiBhbmQgRlBSIG5hbWVzIGFjY29yZGluZyB0b1xuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIEFCSS5cbiIpKTsKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuXAorICByZWctbmFtZXM9QVJDSCAgICAgICAgICAgUHJpbnQgQ1AwIHJlZ2lzdGVyIGFuZCBIV1IgbmFtZXMgYWNjb3JkaW5nIHRvXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXJjaGl0ZWN0dXJlLlxuIikpOworCisgIGZwcmludGYgKHN0cmVhbSwgXygiXG5cCisgIEZvciB0aGUgb3B0aW9ucyBhYm92ZSwgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBmb3IgXCJBQklcIjpcblwKKyAgICIpKTsKKyAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUgKG1pcHNfYWJpX2Nob2ljZXMpOyBpKyspCisgICAgZnByaW50ZiAoc3RyZWFtLCAiICVzIiwgbWlwc19hYmlfY2hvaWNlc1tpXS5uYW1lKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbiIpKTsKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuXAorICBGb3IgdGhlIG9wdGlvbnMgYWJvdmUsIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBzdXBwb3J0ZWQgZm9yIFwiQVJDSFwiOlxuXAorICAgIikpOworICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSAobWlwc19hcmNoX2Nob2ljZXMpOyBpKyspCisgICAgaWYgKCptaXBzX2FyY2hfY2hvaWNlc1tpXS5uYW1lICE9ICdcMCcpCisgICAgICBmcHJpbnRmIChzdHJlYW0sICIgJXMiLCBtaXBzX2FyY2hfY2hvaWNlc1tpXS5uYW1lKTsKKyAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbiIpKTsKKworICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuIikpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2Rpc2FzL3BwYy5jIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9wcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWM0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9kaXNhcy9wcGMuYwpAQCAtMCwwICsxLDU0MTMgQEAKKy8qIHBwYy1kaXMuYyAtLSBEaXNhc3NlbWJsZSBQb3dlclBDIGluc3RydWN0aW9ucworICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAorCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKK3RoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKK3dpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAord2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwKK3NlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworI2luY2x1ZGUgImRpc2FzL2JmZC5oIgorI2RlZmluZSBCRkRfREVGQVVMVF9UQVJHRVRfU0laRSA2NAorCisvKiBwcGMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgUG93ZXJQQyBvcGNvZGUgdGFibGUKKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LAorICAgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCitHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCit0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKzEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Cit3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKK3dhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsCitzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgKi8KKworLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUuICAqLworCitzdHJ1Y3QgcG93ZXJwY19vcGNvZGUKK3sKKyAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAorICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBvcGNvZGU7CisKKyAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKKyAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCisgICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKKyAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBtYXNrOworCisgIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaAorICAgICBzcGVjaWZpYyBwcm9jZXNzb3JzIHN1cHBvcnQgdGhlIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcworICAgICBhcmUgbGlzdGVkIGJlbG93LiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCisgICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKKyAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLworICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzhdOworfTsKKworLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQorICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCisgICBpbnN0cnVjdGlvbnMuICAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wY29kZSBwb3dlcnBjX29wY29kZXNbXTsKK2V4dGVybiBjb25zdCBpbnQgcG93ZXJwY19udW1fb3Bjb2RlczsKKworLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wY29kZS4gICovCisKKy8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUG93ZXJQQyBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BQQwkJCSAxCisKKy8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIgKFJTLzYwMDApIGFyY2hpdGVjdHVyZS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfUE9XRVIJCSAyCisKKy8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIyIChSaW9zIDIpIGFyY2hpdGVjdHVyZS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfUE9XRVIyCQkgNAorCisvKiBPcGNvZGUgaXMgb25seSBkZWZpbmVkIG9uIDMyIGJpdCBhcmNoaXRlY3R1cmVzLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV8zMgkJCSA4CisKKy8qIE9wY29kZSBpcyBvbmx5IGRlZmluZWQgb24gNjQgYml0IGFyY2hpdGVjdHVyZXMuICAqLworI2RlZmluZSBQUENfT1BDT0RFXzY0CQkgICAgICAweDEwCisKKy8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIE1vdG9yb2xhIFBvd2VyUEMgNjAxIHByb2Nlc3Nvci4gIFRoZSA2MDEKKyAgIGlzIGFzc3VtZWQgdG8gc3VwcG9ydCBhbGwgUG93ZXJQQyAoUFBDX09QQ09ERV9QUEMpIGluc3RydWN0aW9ucywKKyAgIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIG1hbnkgYWRkaXRpb25hbCBQT1dFUiBpbnN0cnVjdGlvbnMuICAqLworI2RlZmluZSBQUENfT1BDT0RFXzYwMQkJICAgICAgMHgyMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGluIGJvdGggdGhlIFBvd2VyIGFuZCBQb3dlclBDIGFyY2hpdGVjdHVyZXMKKyAgIChpZSwgY29tcGlsZXIncyAtbWNwdT1jb21tb24gb3IgYXNzZW1ibGVyJ3MgLW1jb20pLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9DT01NT04JICAgICAgMHg0MAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGZvciBhbnkgUG93ZXIgb3IgUG93ZXJQQyBwbGF0Zm9ybSAodGhpcyBpcworICAgZm9yIHRoZSBhc3NlbWJsZXIncyAtbWFueSBvcHRpb24sIGFuZCBpdCBlbGltaW5hdGVzIGR1cGxpY2F0ZXMpLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9BTlkJCSAgICAgIDB4ODAKKworLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSA2NC1iaXQgYnJpZGdlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV82NF9CUklER0UJICAgICAweDEwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IEFsdGl2ZWMgVmVjdG9yIFVuaXQgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9BTFRJVkVDCSAgICAgMHgyMDAKKworLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBieSBQb3dlclBDIDQwMyBwcm9jZXNzb3IuICAqLworI2RlZmluZSBQUENfT1BDT0RFXzQwMwkJICAgICAweDQwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IFBvd2VyUEMgQm9va0UgcHJvY2Vzc29yLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9CT09LRQkgICAgIDB4ODAwCisKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSA2NC1iaXQgUG93ZXJQQyBCb29rRSBwcm9jZXNzb3IuICAqLworI2RlZmluZSBQUENfT1BDT0RFX0JPT0tFNjQJICAgIDB4MTAwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IFBvd2VyUEMgNDQwIHByb2Nlc3Nvci4gICovCisjZGVmaW5lIFBQQ19PUENPREVfNDQwCQkgICAgMHgyMDAwCisKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb3dlcjQgYXJjaGl0ZWN0dXJlLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUjQJICAgIDB4NDAwMAorCisvKiBPcGNvZGUgaXNuJ3Qgc3VwcG9ydGVkIGJ5IFBvd2VyNCBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX05PUE9XRVI0CSAgICAweDgwMDAKKworLyogT3Bjb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFBPV0VSUEMgQ2xhc3NpYyBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX0NMQVNTSUMJICAgMHgxMDAwMAorCisvKiBPcGNvZGUgaXMgb25seSBzdXBwb3J0ZWQgYnkgZTUwMHgyIENvcmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1NQRQkJICAgMHgyMDAwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IGU1MDB4MiBJbnRlZ2VyIHNlbGVjdCBBUFUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX0lTRUwJCSAgIDB4NDAwMDAKKworLyogT3Bjb2RlIGlzIGFuIGU1MDAgU1BFIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9FRlMJCSAgIDB4ODAwMDAKKworLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBieSBicmFuY2ggbG9ja2luZyBBUFUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX0JSTE9DSwkgIDB4MTAwMDAwCisKKy8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgcGVyZm9ybWFuY2UgbW9uaXRvciBBUFUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BNUgkJICAweDIwMDAwMAorCisvKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGJ5IGNhY2hlIGxvY2tpbmcgQVBVLiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9DQUNIRUxDSwkgIDB4NDAwMDAwCisKKy8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgbWFjaGluZSBjaGVjayBBUFUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1JGTUNJCSAgMHg4MDAwMDAKKworLyogT3Bjb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFBvd2VyNSBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSNQkgMHgxMDAwMDAwCisKKy8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgYnkgUG93ZXJQQyBlMzAwIGZhbWlseS4gICovCisjZGVmaW5lIFBQQ19PUENPREVfRTMwMCAgICAgICAgICAweDIwMDAwMDAKKworLyogT3Bjb2RlIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFBvd2VyNiBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBQUENfT1BDT0RFX1BPV0VSNgkgMHg0MDAwMDAwCisKKy8qIE9wY29kZSBpcyBvbmx5IHN1cHBvcnRlZCBieSBQb3dlclBDIENlbGwgZmFtaWx5LiAgKi8KKyNkZWZpbmUgUFBDX09QQ09ERV9DRUxMCQkgMHg4MDAwMDAwCisKKy8qIEEgbWFjcm8gdG8gZXh0cmFjdCB0aGUgbWFqb3Igb3Bjb2RlIGZyb20gYW4gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBQUENfT1AoaSkgKCgoaSkgPj4gMjYpICYgMHgzZikKKwwKKy8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kLiAgKi8KKworc3RydWN0IHBvd2VycGNfb3BlcmFuZAoreworICAvKiBBIGJpdG1hc2sgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCisgIHVuc2lnbmVkIGludCBiaXRtOworCisgIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgLTEgdG8gaW5kaWNhdGUgdGhhdCBCSVRNIGFuZCBTSElGVCBjYW5ub3QgYmUgdXNlZCB0byBkZXRlcm1pbmUKKyAgICAgd2hlcmUgdGhlIG9wZXJhbmQgZ29lcyBpbiB0aGUgaW5zbi4gICovCisgIGludCBzaGlmdDsKKworICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgorICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCisKKyAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQorCSBpIHw9IChvcCAmIG8tPmJpdG0pIDw8IG8tPnNoaWZ0OworICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgYXJlIGZpbGxpbmcgaW4sIG8gaXMgYSBwb2ludGVyIHRvCisgICAgIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AgaXMgdGhlIG9wZXJhbmQgdmFsdWUpLgorCisgICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKKyAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQorICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCisgICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCisgICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKKyAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcworICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLworICB1bnNpZ25lZCBsb25nICgqaW5zZXJ0KQorICAgICh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLCBpbnQgZGlhbGVjdCwgY29uc3QgY2hhciAqKmVycm1zZyk7CisKKyAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KKyAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgorCisgICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKKwkgb3AgPSAoaSA+PiBvLT5zaGlmdCkgJiBvLT5iaXRtOworCSBpZiAoKG8tPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQorCSAgIHNpZ25fZXh0ZW5kIChvcCk7CisgICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAorICAgICBpcyB0aGUgcmVzdWx0KS4KKworICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCisgICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKKyAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCisgICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KKyAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCisgICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLworICBsb25nICgqZXh0cmFjdCkgKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCBkaWFsZWN0LCBpbnQgKmludmFsaWQpOworCisgIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KKyAgdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKKy8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KKyAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgcG93ZXJwY19vcGNvZGVzIHRhYmxlLiAgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgcG93ZXJwY19vcGVyYW5kc1tdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBudW1fcG93ZXJwY19vcGVyYW5kczsKKworLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLworCisvKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05FRCAoMHgxKQorCisvKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcywgYnV0IGFsc28gYWNjZXB0cyBhIGZ1bGwgcG9zaXRpdmUKKyAgIHJhbmdlIG9mIHZhbHVlcyB3aGVuIHJ1bm5pbmcgaW4gMzIgYml0IG1vZGUuICBUaGF0IGlzLCBpZiBiaXRzIGlzCisgICAxNiwgaXQgdGFrZXMgYW55IHZhbHVlIGZyb20gLTB4ODAwMCB0byAweGZmZmYuICBJbiA2NCBiaXQgbW9kZSwKKyAgIHRoaXMgZmxhZyBpcyBpZ25vcmVkLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfU0lHTk9QVCAoMHgyKQorCisvKiBUaGlzIG9wZXJhbmQgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGFzc2VtYmxlciBpbnB1dC4gIFRoaXMKKyAgIGlzIHVzZWQgdG8gc3VwcG9ydCBleHRlbmRlZCBtbmVtb25pY3Mgc3VjaCBhcyBtciwgZm9yIHdoaWNoIHR3bworICAgb3BlcmFuZHMgZmllbGRzIGFyZSBpZGVudGljYWwuICBUaGUgYXNzZW1ibGVyIHNob3VsZCBjYWxsIHRoZQorICAgaW5zZXJ0IGZ1bmN0aW9uIHdpdGggYW55IG9wIHZhbHVlLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY2FsbAorICAgdGhlIGV4dHJhY3QgZnVuY3Rpb24sIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLCBhbmQgY2hlY2sgdGhlIHZhbHVlCisgICBwbGFjZWQgaW4gdGhlIHZhbGlkIGFyZ3VtZW50LiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfRkFLRSAoMHg0KQorCisvKiBUaGUgbmV4dCBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCisgICBzZXBhcmF0ZWQgZnJvbSB0aGlzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQKKyAgIHN0b3JlIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZQorICAgICAgIHJlZyxkaXNwbGFjZW1lbnQocmVnKQorICAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfUEFSRU5TICgweDgpCisKKy8qIFRoaXMgb3BlcmFuZCBtYXkgdXNlIHRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIENSIGZpZWxkcywgd2hpY2gKKyAgIGFyZQorICAgICAgIGx0ICAwCWd0ICAxCWVxICAyCXNvICAzCXVuICAzCisgICAgICAgY3IwIDAJY3IxIDEJY3IyIDIJY3IzIDMKKyAgICAgICBjcjQgNAljcjUgNQljcjYgNgljcjcgNworICAgVGhlc2UgbWF5IGJlIGNvbWJpbmVkIGFyaXRobWV0aWNhbGx5LCBhcyBpbiBjcjIqNCtndC4gIFRoZXNlIGFyZQorICAgb25seSBzdXBwb3J0ZWQgb24gdGhlIFBvd2VyUEMsIG5vdCB0aGUgUE9XRVIuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9DUiAoMHgxMCkKKworLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyIHVzZXMgdGhpcyB0byBwcmludAorICAgcmVnaXN0ZXIgbmFtZXMgd2l0aCBhIGxlYWRpbmcgJ3InLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfR1BSICgweDIwKQorCisvKiBMaWtlIFBQQ19PUEVSQU5EX0dQUiwgYnV0IGRvbid0IHByaW50IGEgbGVhZGluZyAncicgZm9yIHIwLiAgKi8KKyNkZWZpbmUgUFBDX09QRVJBTkRfR1BSXzAgKDB4NDApCisKKy8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlcgorICAgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdmJy4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0ZQUiAoMHg4MCkKKworLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9SRUxBVElWRSAoMHgxMDApCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzcy4gIFRoZSBkaXNhc3NlbWJsZXIKKyAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9BQlNPTFVURSAoMHgyMDApCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKKyAgIGV4YW1wbGUsIGluIHRoZSBvcHRpb25hbCBCRiBmaWVsZCBpbiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICBUaGUKKyAgIGFzc2VtYmxlciBtdXN0IGNvdW50IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIG9uIHRoZSBsaW5lLAorICAgYW5kIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVtYWluaW5nIGZvciB0aGUgb3Bjb2RlLCBhbmQgZGVjaWRlCisgICB3aGV0aGVyIHRoaXMgb3BlcmFuZCBpcyBwcmVzZW50IG9yIG5vdC4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkCisgICBwcmludCB0aGlzIG9wZXJhbmQgb3V0IG9ubHkgaWYgaXQgaXMgbm90IHplcm8uICAqLworI2RlZmluZSBQUENfT1BFUkFORF9PUFRJT05BTCAoMHg0MDApCisKKy8qIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgd2l0aCBQUENfT1BFUkFORF9PUFRJT05BTC4gIElmIHRoaXMgb3BlcmFuZAorICAgaXMgb21pdHRlZCwgdGhlbiBmb3IgdGhlIG5leHQgb3BlcmFuZCB1c2UgdGhpcyBvcGVyYW5kIHZhbHVlIHBsdXMKKyAgIDEsIGlnbm9yaW5nIHRoZSBuZXh0IG9wZXJhbmQgZmllbGQgZm9yIHRoZSBvcGNvZGUuICBUaGlzIHdyZXRjaGVkCisgICBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBQb3dlciByb3RhdGUgaW5zdHJ1Y3Rpb25zIGNhbiB0YWtlCisgICBlaXRoZXIgNCBvciA1IG9wZXJhbmRzLiAgVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgcHJpbnQgdGhpcyBvcGVyYW5kCisgICBvdXQgcmVnYXJkbGVzcyBvZiB0aGUgUFBDX09QRVJBTkRfT1BUSU9OQUwgZmllbGQuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9ORVhUICgweDgwMCkKKworLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgdGhlCisgICBwdXJwb3NlcyBvZiBvdmVyZmxvdyBjaGVja2luZyAoaS5lLiwgdGhlIG5vcm1hbCBtb3N0IG5lZ2F0aXZlCisgICBudW1iZXIgaXMgZGlzYWxsb3dlZCBhbmQgb25lIG1vcmUgdGhhbiB0aGUgbm9ybWFsIG1vc3QgcG9zaXRpdmUKKyAgIG51bWJlciBpcyBhbGxvd2VkKS4gIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGZvciBhIHNpZ25lZAorICAgb3BlcmFuZC4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX05FR0FUSVZFICgweDEwMDApCisKKy8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIHZlY3RvciB1bml0IHJlZ2lzdGVyLiAgVGhlIGRpc2Fzc2VtYmxlcgorICAgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICd2Jy4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX1ZSICgweDIwMDApCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBmb3IgdGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0RTICgweDQwMDApCisKKy8qIFRoaXMgb3BlcmFuZCBpcyBmb3IgdGhlIERRIGZpZWxkIGluIGEgRFEgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFBQQ19PUEVSQU5EX0RRICgweDgwMDApCisKKy8qIFZhbGlkIHJhbmdlIG9mIG9wZXJhbmQgaXMgMC4ubiByYXRoZXIgdGhhbiAwLi5uLTEuICAqLworI2RlZmluZSBQUENfT1BFUkFORF9QTFVTMSAoMHgxMDAwMCkKKwwKKy8qIFRoZSBQT1dFUiBhbmQgUG93ZXJQQyBhc3NlbWJsZXJzIHVzZSBhIGZldyBtYWNyb3MuICBXZSBrZWVwIHRoZW0KKyAgIHdpdGggdGhlIG9wZXJhbmRzIHRhYmxlIGZvciBzaW1wbGljaXR5LiAgVGhlIG1hY3JvIHRhYmxlIGlzIGFuCisgICBhcnJheSBvZiBzdHJ1Y3QgcG93ZXJwY19tYWNyby4gICovCisKK3N0cnVjdCBwb3dlcnBjX21hY3JvCit7CisgIC8qIFRoZSBtYWNybyBuYW1lLiAgKi8KKyAgY29uc3QgY2hhciAqbmFtZTsKKworICAvKiBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIHRoZSBtYWNybyB0YWtlcy4gICovCisgIHVuc2lnbmVkIGludCBvcGVyYW5kczsKKworICAvKiBPbmUgYml0IGZsYWdzIGZvciB0aGUgb3Bjb2RlLiAgVGhlc2UgYXJlIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2gKKyAgICAgc3BlY2lmaWMgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbnMuICBUaGUgdmFsdWVzIGFyZSB0aGUKKyAgICAgc2FtZSBhcyB0aG9zZSBmb3IgdGhlIHN0cnVjdCBwb3dlcnBjX29wY29kZSBmbGFncyBmaWVsZC4gICovCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgLyogQSBmb3JtYXQgc3RyaW5nIHRvIHR1cm4gdGhlIG1hY3JvIGludG8gYSBub3JtYWwgaW5zdHJ1Y3Rpb24uCisgICAgIEVhY2ggJU4gaW4gdGhlIHN0cmluZyBpcyByZXBsYWNlZCB3aXRoIG9wZXJhbmQgbnVtYmVyIE4gKHplcm8KKyAgICAgYmFzZWQpLiAgKi8KKyAgY29uc3QgY2hhciAqZm9ybWF0OworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvIHBvd2VycGNfbWFjcm9zW107CitleHRlcm4gY29uc3QgaW50IHBvd2VycGNfbnVtX21hY3JvczsKKworLyogcHBjLW9wYy5jIC0tIFBvd2VyUEMgb3Bjb2RlIGxpc3QKKyAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LAorICAgMjAwNSwgMjAwNiwgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgorCisgICBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCisgICB0aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAgIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5CisgICB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLworCisvKiBUaGlzIGZpbGUgaG9sZHMgdGhlIFBvd2VyUEMgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZQorICAgaW5jbHVkZXMgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcworICAgcGVybWl0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyCisgICBsb2dpYywgYXQgdGhlIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcworICAgc3RyaWN0bHkgY29uc3RhbnQgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbgorICAgdGhlIC50ZXh0IHNlY3Rpb24uCisKKyAgIFRoaXMgZmlsZSBhbHNvIGhvbGRzIHRoZSBvcGVyYW5kIHRhYmxlLiAgQWxsIGtub3dsZWRnZSBhYm91dAorICAgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zdHJ1Y3Rpb25zIGFuZCB2aWNlLXZlcnNhIGlzIGtlcHQgaW4gdGhpcworICAgZmlsZS4gICovCisMCisvKiBMb2NhbCBpbnNlcnRpb24gYW5kIGV4dHJhY3Rpb24gZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JhdCAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYmF0ICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iYmEgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgbG9uZyBleHRyYWN0X2JiYSAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmRtICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGxvbmcgZXh0cmFjdF9iZG0gKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JkcCAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYmRwICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ibyAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYm8gKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2JvZSAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfYm9lICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9meG0gKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgbG9uZyBleHRyYWN0X2Z4bSAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbWJlICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGxvbmcgZXh0cmFjdF9tYmUgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X21iNiAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfbWI2ICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfbmIgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X25zaSAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3RfbnNpICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYWwgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFtICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhcSAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYXMgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmJzICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGxvbmcgZXh0cmFjdF9yYnMgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3NoNiAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3Rfc2g2ICh1bnNpZ25lZCBsb25nLCBpbnQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9zcHIgKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGludCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgbG9uZyBleHRyYWN0X3NwciAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc3ByZyAodW5zaWduZWQgbG9uZywgbG9uZywgaW50LCBjb25zdCBjaGFyICoqKTsKK3N0YXRpYyBsb25nIGV4dHJhY3Rfc3ByZyAodW5zaWduZWQgbG9uZywgaW50LCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfdGJyICh1bnNpZ25lZCBsb25nLCBsb25nLCBpbnQsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGxvbmcgZXh0cmFjdF90YnIgKHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopOworDAorLyogVGhlIG9wZXJhbmRzIHRhYmxlLgorCisgICBUaGUgZmllbGRzIGFyZSBiaXRtLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncy4KKworICAgV2UgdXNlZCB0byBwdXQgcGFyZW5zIGFyb3VuZCB0aGUgdmFyaW91cyBhZGRpdGlvbnMsIGxpa2UgdGhlIG9uZQorICAgZm9yIEJBIGp1c3QgYmVsb3cuICBIb3dldmVyLCB0aGF0IGNhdXNlZCB0cm91YmxlIHdpdGggZmVlYmxlCisgICBjb21waWxlcnMgd2l0aCBhIGxpbWl0IG9uIGRlcHRoIG9mIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLCBsaWtlCisgICAocmVwb3J0ZWRseSkgdGhlIGNvbXBpbGVyIGluIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIDUuICBTbyB3ZQorICAgb21pdCB0aGUgcGFyZW5zLCBzaW5jZSB0aGUgbWFjcm9zIGFyZSBuZXZlciB1c2VkIGluIGEgY29udGV4dCB3aGVyZQorICAgdGhlIGFkZGl0aW9uIHdpbGwgYmUgYW1iaWd1b3VzLiAgKi8KKworY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCBwb3dlcnBjX29wZXJhbmRzW10gPQoreworICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YKKyAgICAgb3BlcmFuZHMuICAqLworI2RlZmluZSBVTlVTRUQgMAorICB7IDAsIDAsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgQkEgZmllbGQgaW4gYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJBIFVOVVNFRCArIDEKKyAgLyogVGhlIEJJIGZpZWxkIGluIGEgQiBmb3JtIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCSSBCQQorI2RlZmluZSBCSV9NQVNLICgweDFmIDw8IDE2KQorICB7IDB4MWYsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9DUiB9LAorCisgIC8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZQorICAgICBhcyB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCQVQgQkEgKyAxCisgIHsgMHgxZiwgMTYsIGluc2VydF9iYXQsIGV4dHJhY3RfYmF0LCBQUENfT1BFUkFORF9GQUtFIH0sCisKKyAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBCQiBCQVQgKyAxCisjZGVmaW5lIEJCX01BU0sgKDB4MWYgPDwgMTEpCisgIHsgMHgxZiwgMTEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIH0sCisKKyAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCisgICAgIGFzIHRoZSBCQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJCQSBCQiArIDEKKyAgeyAweDFmLCAxMSwgaW5zZXJ0X2JiYSwgZXh0cmFjdF9iYmEsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKKworICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCisgICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KKyNkZWZpbmUgQkQgQkJBICsgMQorICB7IDB4ZmZmYywgMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzCisgICAgIHVzZWQuICAqLworI2RlZmluZSBCREEgQkQgKyAxCisgIHsgMHhmZmZjLCAwLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQuCisgICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLworI2RlZmluZSBCRE0gQkRBICsgMQorICB7IDB4ZmZmYywgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCisgICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSAtIG1vZGlmaWVyIGlzIHVzZWQKKyAgICAgYW5kIGFic29sdXRlIGFkZHJlc3MgaXMgdXNlZC4gICovCisjZGVmaW5lIEJETUEgQkRNICsgMQorICB7IDB4ZmZmYywgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCisgICAgICBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQuCisgICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLworI2RlZmluZSBCRFAgQkRNQSArIDEKKyAgeyAweGZmZmMsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAorICAgICAgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBtb2RpZmllciBpcyB1c2VkCisgICAgIGFuZCBhYnNvbHV0ZSBhZGRyZXNzaW5nIGlzIHVzZWQuICAqLworI2RlZmluZSBCRFBBIEJEUCArIDEKKyAgeyAweGZmZmMsIDAsIGluc2VydF9iZHAsIGV4dHJhY3RfYmRwLAorICAgICAgUFBDX09QRVJBTkRfQUJTT0xVVEUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKKworICAvKiBUaGUgQkYgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQkYgQkRQQSArIDEKKyAgLyogVGhlIENSRkQgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQ1JGRCBCRgorICB7IDB4NywgMjMsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIH0sCisKKyAgLyogVGhlIEJGIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJGRiBCRiArIDEKKyAgeyAweDcsIDIzLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogQW4gb3B0aW9uYWwgQkYgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLAorICAgICBpbiB3aGljaCBhbiBvbWl0dGVkIEJGIGZpZWxkIGlzIHRha2VuIGFzIHplcm8uICAqLworI2RlZmluZSBPQkYgQkZGICsgMQorICB7IDB4NywgMjMsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgQkZBIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEJGQSBPQkYgKyAxCisgIHsgMHg3LCAxOCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBDZXJ0YWluIHZhbHVlcyBhcmUKKyAgICAgaWxsZWdhbC4gICovCisjZGVmaW5lIEJPIEJGQSArIDEKKyNkZWZpbmUgQk9fTUFTSyAoMHgxZiA8PCAyMSkKKyAgeyAweDFmLCAyMSwgaW5zZXJ0X2JvLCBleHRyYWN0X2JvLCAwIH0sCisKKyAgLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcworICAgICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gICovCisjZGVmaW5lIEJPRSBCTyArIDEKKyAgeyAweDFlLCAyMSwgaW5zZXJ0X2JvZSwgZXh0cmFjdF9ib2UsIDAgfSwKKworI2RlZmluZSBCSCBCT0UgKyAxCisgIHsgMHgzLCAxMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgQlQgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQlQgQkggKyAxCisgIHsgMHgxZiwgMjEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIH0sCisKKyAgLyogVGhlIGNvbmRpdGlvbiByZWdpc3RlciBudW1iZXIgcG9ydGlvbiBvZiB0aGUgQkkgZmllbGQgaW4gYSBCIGZvcm0KKyAgICAgb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGV4dGVuZGVkCisgICAgIGNvbmRpdGlvbmFsIGJyYW5jaCBtbmVtb25pY3MsIHdoaWNoIHNldCB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlCisgICAgIEJJIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIENSIEJUICsgMQorICB7IDB4NywgMTgsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgQ1JCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIENSQiBDUiArIDEKKyAgLyogVGhlIE1CIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIE1CIENSQgorI2RlZmluZSBNQl9NQVNLICgweDFmIDw8IDYpCisgIHsgMHgxZiwgNiwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBDUkZTIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIENSRlMgQ1JCICsgMQorICB7IDB4NywgMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfQ1IgfSwKKworICAvKiBUaGUgQ1QgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQ1QgQ1JGUyArIDEKKyAgLyogVGhlIE1PIGZpZWxkIGluIGFuIG1iYXIgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNTyBDVAorICB7IDB4MWYsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBEIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBhIGRpc3BsYWNlbWVudCBvZmYKKyAgICAgYSByZWdpc3RlciwgYW5kIGltcGxpZXMgdGhhdCB0aGUgbmV4dCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgaW4KKyAgICAgcGFyZW50aGVzZXMuICAqLworI2RlZmluZSBEIENUICsgMQorICB7IDB4ZmZmZiwgMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIERFIGZpZWxkIGluIGEgREUgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgaXMgMTIKKyAgICAgYml0cyBvbmx5LiAgKi8KKyNkZWZpbmUgREUgRCArIDEKKyAgeyAweGZmZiwgNCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIERFUyBmaWVsZCBpbiBhIERFUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIERTLCBidXQgaXMgMTQKKyAgICAgYml0cyBvbmx5ICgxMiBzdG9yZWQuKSAgKi8KKyNkZWZpbmUgREVTIERFICsgMQorICB7IDB4M2ZmYywgMiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIERRIGZpZWxkIGluIGEgRFEgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCisgICAgIGxvd2VyIGZvdXIgYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICovCisjZGVmaW5lIERRIERFUyArIDEKKyAgeyAweGZmZjAsIDAsIE5VTEwsIE5VTEwsCisgICAgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIHwgUFBDX09QRVJBTkRfRFEgfSwKKworICAvKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKKyAgICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KKyN1bmRlZiBEUworI2RlZmluZSBEUyBEUSArIDEKKyAgeyAweGZmZmMsIDAsIE5VTEwsIE5VTEwsCisgICAgUFBDX09QRVJBTkRfUEFSRU5TIHwgUFBDX09QRVJBTkRfU0lHTkVEIHwgUFBDX09QRVJBTkRfRFMgfSwKKworICAvKiBUaGUgRSBmaWVsZCBpbiBhIHdydGVlaSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEUgRFMgKyAxCisgIHsgMHgxLCAxNSwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBGTDEgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRkwxIEUgKyAxCisgIC8qIFRoZSBVIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFUgRkwxCisgIHsgMHhmLCAxMiwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBGTDIgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRkwyIEZMMSArIDEKKyAgeyAweDcsIDIsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgRkxNIGZpZWxkIGluIGFuIFhGTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRkxNIEZMMiArIDEKKyAgeyAweGZmLCAxNywgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBGUkEgZmllbGQgaW4gYW4gWCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBGUkEgRkxNICsgMQorI2RlZmluZSBGUkFfTUFTSyAoMHgxZiA8PCAxNikKKyAgeyAweDFmLCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfRlBSIH0sCisKKyAgLyogVGhlIEZSQiBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEZSQiBGUkEgKyAxCisjZGVmaW5lIEZSQl9NQVNLICgweDFmIDw8IDExKQorICB7IDB4MWYsIDExLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9GUFIgfSwKKworICAvKiBUaGUgRlJDIGZpZWxkIGluIGFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEZSQyBGUkIgKyAxCisjZGVmaW5lIEZSQ19NQVNLICgweDFmIDw8IDYpCisgIHsgMHgxZiwgNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfRlBSIH0sCisKKyAgLyogVGhlIEZSUyBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gb3IgdGhlIEZSVCBmaWVsZCBpbiBhIEQsIFgKKyAgICAgb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRlJTIEZSQyArIDEKKyNkZWZpbmUgRlJUIEZSUworICB7IDB4MWYsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9GUFIgfSwKKworICAvKiBUaGUgRlhNIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEZYTSBGUlMgKyAxCisgIHsgMHhmZiwgMTIsIGluc2VydF9meG0sIGV4dHJhY3RfZnhtLCAwIH0sCisKKyAgLyogUG93ZXI0IHZlcnNpb24gZm9yIG1mY3IuICAqLworI2RlZmluZSBGWE00IEZYTSArIDEKKyAgeyAweGZmLCAxMiwgaW5zZXJ0X2Z4bSwgZXh0cmFjdF9meG0sIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKKyAgLyogVGhlIEwgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEwgRlhNNCArIDEKKyAgeyAweDEsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBMRVYgZmllbGQgaW4gYSBQT1dFUiBTVkMgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNWQ19MRVYgTCArIDEKKyAgeyAweDdmLCA1LCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIExFViBmaWVsZCBpbiBhbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTEVWIFNWQ19MRVYgKyAxCisgIHsgMHg3ZiwgNSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgTEkgZmllbGQgaW4gYW4gSSBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGxvd2VyIHR3byBiaXRzIGFyZQorICAgICBmb3JjZWQgdG8gemVyby4gICovCisjZGVmaW5lIExJIExFViArIDEKKyAgeyAweDNmZmZmZmMsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHVzZWQgYXMgYW4gYWJzb2x1dGUKKyAgICAgYWRkcmVzcy4gICovCisjZGVmaW5lIExJQSBMSSArIDEKKyAgeyAweDNmZmZmZmMsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCisKKyAgLyogVGhlIExTIGZpZWxkIGluIGFuIFggKHN5bmMpIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBMUyBMSUEgKyAxCisgIHsgMHgzLCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgTUUgZmllbGQgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTUUgTFMgKyAxCisjZGVmaW5lIE1FX01BU0sgKDB4MWYgPDwgMSkKKyAgeyAweDFmLCAxLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhIHNpbmdsZQorICAgICBvcGVyYW5kIHdoaWNoIGlzIGEgYml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGJpdHMgdG8gc2VsZWN0LiAgVGhpcworICAgICBpcyBhIHR3byBvcGVyYW5kIGZvcm0gdXNpbmcgUFBDX09QRVJBTkRfTkVYVC4gIFNlZSB0aGUKKyAgICAgZGVzY3JpcHRpb24gaW4gb3Bjb2RlL3BwYy5oIGZvciB3aGF0IHRoaXMgbWVhbnMuICAqLworI2RlZmluZSBNQkUgTUUgKyAxCisgIHsgMHgxZiwgNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfCBQUENfT1BFUkFORF9ORVhUIH0sCisgIHsgLTEsIDAsIGluc2VydF9tYmUsIGV4dHJhY3RfbWJlLCAwIH0sCisKKyAgLyogVGhlIE1CIG9yIE1FIGZpZWxkIGluIGFuIE1EIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgVGhlIGhpZ2gKKyAgICAgYml0IGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLworI2RlZmluZSBNQjYgTUJFICsgMgorI2RlZmluZSBNRTYgTUI2CisjZGVmaW5lIE1CNl9NQVNLICgweDNmIDw8IDUpCisgIHsgMHgzZiwgNSwgaW5zZXJ0X21iNiwgZXh0cmFjdF9tYjYsIDAgfSwKKworICAvKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcworICAgICAwLiAgKi8KKyNkZWZpbmUgTkIgTUI2ICsgMQorICB7IDB4MWYsIDExLCBOVUxMLCBleHRyYWN0X25iLCBQUENfT1BFUkFORF9QTFVTMSB9LAorCisgIC8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZQorICAgICBTSSBmaWVsZCwgb25seSBuZWdhdGVkLiAgKi8KKyNkZWZpbmUgTlNJIE5CICsgMQorICB7IDB4ZmZmZiwgMCwgaW5zZXJ0X25zaSwgZXh0cmFjdF9uc2ksCisgICAgICBQUENfT1BFUkFORF9ORUdBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBELCBEUywgRFEsIFgsIFhPLCBNLCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFJBIE5TSSArIDEKKyNkZWZpbmUgUkFfTUFTSyAoMHgxZiA8PCAxNikKKyAgeyAweDFmLCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIH0sCisKKyAgLyogQXMgYWJvdmUsIGJ1dCAwIGluIHRoZSBSQSBmaWVsZCBtZWFucyB6ZXJvLCBub3QgcjAuICAqLworI2RlZmluZSBSQTAgUkEgKyAxCisgIHsgMHgxZiwgMTYsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUl8wIH0sCisKKyAgLyogVGhlIFJBIGZpZWxkIGluIHRoZSBEUSBmb3JtIGxxIGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbAorICAgICB2YWx1ZSByZXN0cmljdGlvbnMuICAqLworI2RlZmluZSBSQVEgUkEwICsgMQorICB7IDB4MWYsIDE2LCBpbnNlcnRfcmFxLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAorCisgIC8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCisgICAgIGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBIGZpZWxkIG1heSBub3QgYmUgemVybyBhbmQgbWF5IG5vdAorICAgICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLworI2RlZmluZSBSQUwgUkFRICsgMQorICB7IDB4MWYsIDE2LCBpbnNlcnRfcmFsLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAorCisgIC8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCisgICAgIHJlc3RyaWN0aW9ucy4gICovCisjZGVmaW5lIFJBTSBSQUwgKyAxCisgIHsgMHgxZiwgMTYsIGluc2VydF9yYW0sIE5VTEwsIFBQQ19PUEVSQU5EX0dQUl8wIH0sCisKKyAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKKyAgICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKKyAgICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KKyNkZWZpbmUgUkFTIFJBTSArIDEKKyAgeyAweDFmLCAxNiwgaW5zZXJ0X3JhcywgTlVMTCwgUFBDX09QRVJBTkRfR1BSXzAgfSwKKworICAvKiBUaGUgUkEgZmllbGQgb2YgdGhlIHRsYndlIGluc3RydWN0aW9uLCB3aGljaCBpcyBvcHRpb25hbC4gICovCisjZGVmaW5lIFJBT1BUIFJBUyArIDEKKyAgeyAweDFmLCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfR1BSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKKworICAvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCwgWE8sIE0sIG9yIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgUkIgUkFPUFQgKyAxCisjZGVmaW5lIFJCX01BU0sgKDB4MWYgPDwgMTEpCisgIHsgMHgxZiwgMTEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorCisgIC8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCisgICAgIHRoZSBSUyBmaWVsZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGV4dGVuZGVkCisgICAgIG1uZW1vbmljcyBsaWtlIG1yLiAgKi8KKyNkZWZpbmUgUkJTIFJCICsgMQorICB7IDB4MWYsIDExLCBpbnNlcnRfcmJzLCBleHRyYWN0X3JicywgUFBDX09QRVJBTkRfRkFLRSB9LAorCisgIC8qIFRoZSBSUyBmaWVsZCBpbiBhIEQsIERTLCBYLCBYRlgsIFhTLCBNLCBNRCBvciBNRFMgZm9ybQorICAgICBpbnN0cnVjdGlvbiBvciB0aGUgUlQgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYIG9yIFhPIGZvcm0KKyAgICAgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBSUyBSQlMgKyAxCisjZGVmaW5lIFJUIFJTCisjZGVmaW5lIFJUX01BU0sgKDB4MWYgPDwgMjEpCisgIHsgMHgxZiwgMjEsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX0dQUiB9LAorCisgIC8qIFRoZSBSUyBhbmQgUlQgZmllbGRzIG9mIHRoZSBEUyBmb3JtIHN0cSBpbnN0cnVjdGlvbiwgd2hpY2ggaGF2ZQorICAgICBzcGVjaWFsIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCisjZGVmaW5lIFJTUSBSUyArIDEKKyNkZWZpbmUgUlRRIFJTUQorICB7IDB4MWUsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFJfMCB9LAorCisgIC8qIFRoZSBSUyBmaWVsZCBvZiB0aGUgdGxid2UgaW5zdHJ1Y3Rpb24sIHdoaWNoIGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgUlNPIFJTUSArIDEKKyNkZWZpbmUgUlRPIFJTTworICB7IDB4MWYsIDIxLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9HUFIgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBYIG9yIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNIIFJTTyArIDEKKyNkZWZpbmUgU0hfTUFTSyAoMHgxZiA8PCAxMSkKKyAgLyogVGhlIG90aGVyIFVJTU0gZmllbGQgaW4gYSBFVlggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEVWVUlNTSBTSAorICB7IDB4MWYsIDExLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIFNIIGZpZWxkIGluIGFuIE1EIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHNwbGl0LiAgKi8KKyNkZWZpbmUgU0g2IFNIICsgMQorI2RlZmluZSBTSDZfTUFTSyAoKDB4MWYgPDwgMTEpIHwgKDEgPDwgMSkpCisgIHsgMHgzZiwgLTEsIGluc2VydF9zaDYsIGV4dHJhY3Rfc2g2LCAwIH0sCisKKyAgLyogVGhlIFNIIGZpZWxkIG9mIHRoZSB0bGJ3ZSBpbnN0cnVjdGlvbiwgd2hpY2ggaXMgb3B0aW9uYWwuICAqLworI2RlZmluZSBTSE8gU0g2ICsgMQorICB7IDB4MWYsIDExLCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisgIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNJIFNITyArIDEKKyAgeyAweGZmZmYsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX1NJR05FRCB9LAorCisgIC8qIFRoZSBTSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHdlIGFjY2VwdCBhIHdpZGUgcmFuZ2UKKyAgICAgb2YgcG9zaXRpdmUgdmFsdWVzLiAgKi8KKyNkZWZpbmUgU0lTSUdOT1BUIFNJICsgMQorICB7IDB4ZmZmZiwgMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfU0lHTkVEIHwgUFBDX09QRVJBTkRfU0lHTk9QVCB9LAorCisgIC8qIFRoZSBTUFIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZsaXBwZWQtLXRoZQorICAgICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLworI2RlZmluZSBTUFIgU0lTSUdOT1BUICsgMQorI2RlZmluZSBQTVIgU1BSCisjZGVmaW5lIFNQUl9NQVNLICgweDNmZiA8PCAxMSkKKyAgeyAweDNmZiwgMTEsIGluc2VydF9zcHIsIGV4dHJhY3Rfc3ByLCAwIH0sCisKKyAgLyogVGhlIEJBVCBpbmRleCBudW1iZXIgaW4gYW4gWEZYIGZvcm0gbVtmdF1pYmF0W2x1XSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNQUkJBVCBTUFIgKyAxCisjZGVmaW5lIFNQUkJBVF9NQVNLICgweDMgPDwgMTcpCisgIHsgMHgzLCAxNywgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBTUFJHIHJlZ2lzdGVyIG51bWJlciBpbiBhbiBYRlggZm9ybSBtW2Z0XXNwcmcgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTUFJHIFNQUkJBVCArIDEKKyAgeyAweDFmLCAxNiwgaW5zZXJ0X3NwcmcsIGV4dHJhY3Rfc3ByZywgMCB9LAorCisgIC8qIFRoZSBTUiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTUiBTUFJHICsgMQorICB7IDB4ZiwgMTYsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgU1RSTSBmaWVsZCBpbiBhbiBYIEFsdGlWZWMgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFNUUk0gU1IgKyAxCisgIHsgMHgzLCAyMSwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBTViBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTViBTVFJNICsgMQorICB7IDB4M2ZmZiwgMiwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGxpa2UgdGhlIFNQUgorICAgICBmaWVsZCwgYnV0IGl0IGlzIG9wdGlvbmFsLiAgKi8KKyNkZWZpbmUgVEJSIFNWICsgMQorICB7IDB4M2ZmLCAxMSwgaW5zZXJ0X3RiciwgZXh0cmFjdF90YnIsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKKyAgLyogVGhlIFRPIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBUTyBUQlIgKyAxCisjZGVmaW5lIFRPX01BU0sgKDB4MWYgPDwgMjEpCisgIHsgMHgxZiwgMjEsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgVUkgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBVSSBUTyArIDEKKyAgeyAweGZmZmYsIDAsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgVkEgZmllbGQgaW4gYSBWQSwgVlggb3IgVlhSIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBWQSBVSSArIDEKKyAgeyAweDFmLCAxNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfVlIgfSwKKworICAvKiBUaGUgVkIgZmllbGQgaW4gYSBWQSwgVlggb3IgVlhSIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBWQiBWQSArIDEKKyAgeyAweDFmLCAxMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfVlIgfSwKKworICAvKiBUaGUgVkMgZmllbGQgaW4gYSBWQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVkMgVkIgKyAxCisgIHsgMHgxZiwgNiwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfVlIgfSwKKworICAvKiBUaGUgVkQgb3IgVlMgZmllbGQgaW4gYSBWQSwgVlgsIFZYUiBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBWRCBWQyArIDEKKyNkZWZpbmUgVlMgVkQKKyAgeyAweDFmLCAyMSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfVlIgfSwKKworICAvKiBUaGUgU0lNTSBmaWVsZCBpbiBhIFZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTSU1NIFZEICsgMQorICB7IDB4MWYsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9TSUdORUR9LAorCisgIC8qIFRoZSBVSU1NIGZpZWxkIGluIGEgVlggZm9ybSBpbnN0cnVjdGlvbiwgYW5kIFRFIGluIFogZm9ybS4gICovCisjZGVmaW5lIFVJTU0gU0lNTSArIDEKKyNkZWZpbmUgVEUgVUlNTQorICB7IDB4MWYsIDE2LCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIFNIQiBmaWVsZCBpbiBhIFZBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBTSEIgVUlNTSArIDEKKyAgeyAweGYsIDYsIE5VTEwsIE5VTEwsIDAgfSwKKworICAvKiBUaGUgb3RoZXIgVUlNTSBmaWVsZCBpbiBhIGhhbGYgd29yZCBFVlggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEVWVUlNTV8yIFNIQiArIDEKKyAgeyAweDNlLCAxMCwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUEFSRU5TIH0sCisKKyAgLyogVGhlIG90aGVyIFVJTU0gZmllbGQgaW4gYSB3b3JkIEVWWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRVZVSU1NXzQgRVZVSU1NXzIgKyAxCisgIHsgMHg3YywgOSwgTlVMTCwgTlVMTCwgUFBDX09QRVJBTkRfUEFSRU5TIH0sCisKKyAgLyogVGhlIG90aGVyIFVJTU0gZmllbGQgaW4gYSBkb3VibGUgRVZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBFVlVJTU1fOCBFVlVJTU1fNCArIDEKKyAgeyAweGY4LCA4LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9QQVJFTlMgfSwKKworICAvKiBUaGUgV1MgZmllbGQuICAqLworI2RlZmluZSBXUyBFVlVJTU1fOCArIDEKKyAgeyAweDcsIDExLCBOVUxMLCBOVUxMLCAwIH0sCisKKyAgLyogVGhlIEwgZmllbGQgaW4gYW4gbXRtc3JkIG9yIEEgZm9ybSBpbnN0cnVjdGlvbiBvciBXIGluIGFuIFggZm9ybS4gICovCisjZGVmaW5lIEFfTCBXUyArIDEKKyNkZWZpbmUgVyBBX0wKKyAgeyAweDEsIDE2LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAorCisjZGVmaW5lIFJNQyBBX0wgKyAxCisgIHsgMHgzLCA5LCBOVUxMLCBOVUxMLCAwIH0sCisKKyNkZWZpbmUgUiBSTUMgKyAxCisgIHsgMHgxLCAxNiwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFNQIFIgKyAxCisgIHsgMHgzLCAxOSwgTlVMTCwgTlVMTCwgMCB9LAorCisjZGVmaW5lIFMgU1AgKyAxCisgIHsgMHgxLCAyMCwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFNIIGZpZWxkIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiAxNi4gICovCisjZGVmaW5lIFNIMTYgUyArIDEKKyAgLyogVGhlIERDTSBhbmQgREdNIGZpZWxkcyBpbiBhIFogZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIERDTSBTSDE2CisjZGVmaW5lIERHTSBEQ00KKyAgeyAweDNmLCAxMCwgTlVMTCwgTlVMTCwgMCB9LAorCisgIC8qIFRoZSBFSCBmaWVsZCBpbiBsYXJ4IGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRUggU0gxNiArIDEKKyAgeyAweDEsIDAsIE5VTEwsIE5VTEwsIFBQQ19PUEVSQU5EX09QVElPTkFMIH0sCisKKyAgLyogVGhlIEwgZmllbGQgaW4gYW4gbXRmc2Ygb3IgWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYRkxfTCBFSCArIDEKKyAgeyAweDEsIDI1LCBOVUxMLCBOVUxMLCBQUENfT1BFUkFORF9PUFRJT05BTH0sCit9OworCitjb25zdCB1bnNpZ25lZCBpbnQgbnVtX3Bvd2VycGNfb3BlcmFuZHMgPSAoc2l6ZW9mIChwb3dlcnBjX29wZXJhbmRzKQorCQkJCQkgICAvIHNpemVvZiAocG93ZXJwY19vcGVyYW5kc1swXSkpOworCisvKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KKworLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCisgICB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCisgICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwKKyAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQorICAgc2FtZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfYmF0ICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgY29uc3QgY2hhciAqKmVycm1zZyBBVFRSSUJVVEVfVU5VU0VEKQoreworICByZXR1cm4gaW5zbiB8ICgoKGluc24gPj4gMjEpICYgMHgxZikgPDwgMTYpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9iYXQgKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgICBpbnQgKmludmFsaWQpCit7CisgIGlmICgoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcworICAgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLgorICAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQkEgZmllbGQgaW50byB0aGUgQkIgZmllbGQsCisgICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKKyAgIHNhbWUuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JiYSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDE2KSAmIDB4MWYpIDw8IDExKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfYmJhICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICAgaW50ICppbnZhbGlkKQoreworICBpZiAoKChpbnNuID4+IDE2KSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiAwOworfQorCisvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkLgorICAgVGhpcyBtb2RpZmllciBtZWFucyB0aGF0IHRoZSBicmFuY2ggaXMgbm90IGV4cGVjdGVkIHRvIGJlIHRha2VuLgorICAgRm9yIGNoaXBzIGJ1aWx0IHRvIHZlcnNpb25zIG9mIHRoZSBhcmNoaXRlY3R1cmUgcHJpb3IgdG8gdmVyc2lvbiAyCisgICAoaWUuIG5vdCBQb3dlcjQgY29tcGF0aWJsZSksIHdlIHNldCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHRvIDEKKyAgIGlmIHRoZSBvZmZzZXQgaXMgbmVnYXRpdmUuICBXaGVuIGV4dHJhY3RpbmcsIHdlIHJlcXVpcmUgdGhhdCB0aGUgeQorICAgYml0IGJlIDEgYW5kIHRoYXQgdGhlIG9mZnNldCBiZSBwb3NpdGl2ZSwgc2luY2UgaWYgdGhlIHkgYml0IGlzIDAKKyAgIHdlIGp1c3Qgd2FudCB0byBwcmludCB0aGUgbm9ybWFsIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uLgorICAgUG93ZXI0IGNvbXBhdGlibGUgdGFyZ2V0cyB1c2UgdHdvIGJpdHMsICJhIiwgYW5kICJ0IiwgaW5zdGVhZCBvZgorICAgdGhlICJ5IiBiaXQuICAiYXQiID09IDAwID0+IG5vIGhpbnQsICJhdCIgPT0gMDEgPT4gdW5wcmVkaWN0YWJsZSwKKyAgICJhdCIgPT0gMTAgPT4gbm90IHRha2VuLCAiYXQiID09IDExID0+IHRha2VuLiAgVGhlICJ0IiBiaXQgaXMgMDAwMDEKKyAgIGluIEJPIGZpZWxkLCB0aGUgImEiIGJpdCBpcyAwMDAxMCBmb3IgYnJhbmNoIG9uIENSKEJJKSBhbmQgMDEwMDAKKyAgIGZvciBicmFuY2ggb24gQ1RSLiAgV2Ugb25seSBoYW5kbGUgdGhlIHRha2VuL25vdC10YWtlbiBoaW50IGhlcmUuCisgICBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVsYXggdGhlIGNvbmRpdGlvbnMgdGVzdGVkIGhlcmUgd2hlbgorICAgZGlzYXNzZW1ibGluZyB3aXRoIC1NYW55IGJlY2F1c2UgaW5zbnMgdXNpbmcgZXh0cmFjdF9iZG0gYW5kCisgICBleHRyYWN0X2JkcCBhbHdheXMgb2NjdXIgaW4gcGFpcnMuICBPbmUgb3IgdGhlIG90aGVyIHdpbGwgYWx3YXlzCisgICBiZSB2YWxpZC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfYmRtICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0LAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGlmICgoZGlhbGVjdCAmIFBQQ19PUENPREVfUE9XRVI0KSA9PSAwKQorICAgIHsKKyAgICAgIGlmICgodmFsdWUgJiAweDgwMDApICE9IDApCisJaW5zbiB8PSAxIDw8IDIxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaW5zbiAmICgweDE0IDw8IDIxKSkgPT0gKDB4MDQgPDwgMjEpKQorCWluc24gfD0gMHgwMiA8PCAyMTsKKyAgICAgIGVsc2UgaWYgKChpbnNuICYgKDB4MTQgPDwgMjEpKSA9PSAoMHgxMCA8PCAyMSkpCisJaW5zbiB8PSAweDA4IDw8IDIxOworICAgIH0KKyAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9iZG0gKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgIGludCBkaWFsZWN0LAorCSAgICAgaW50ICppbnZhbGlkKQoreworICBpZiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwKSAhPSAoKGluc24gJiAoMSA8PCAxNSkpID09IDApKQorCSppbnZhbGlkID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGluc24gJiAoMHgxNyA8PCAyMSkpICE9ICgweDA2IDw8IDIxKQorCSAgJiYgKGluc24gJiAoMHgxZCA8PCAyMSkpICE9ICgweDE4IDw8IDIxKSkKKwkqaW52YWxpZCA9IDE7CisgICAgfQorCisgIHJldHVybiAoKGluc24gJiAweGZmZmMpIF4gMHg4MDAwKSAtIDB4ODAwMDsKK30KKworLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KKyAgIFRoaXMgaXMgbGlrZSBCRE0sIGFib3ZlLCBleGNlcHQgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlCisgICB0YWtlbi4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfYmRwICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0LAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGlmICgoZGlhbGVjdCAmIFBQQ19PUENPREVfUE9XRVI0KSA9PSAwKQorICAgIHsKKyAgICAgIGlmICgodmFsdWUgJiAweDgwMDApID09IDApCisJaW5zbiB8PSAxIDw8IDIxOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmICgoaW5zbiAmICgweDE0IDw8IDIxKSkgPT0gKDB4MDQgPDwgMjEpKQorCWluc24gfD0gMHgwMyA8PCAyMTsKKyAgICAgIGVsc2UgaWYgKChpbnNuICYgKDB4MTQgPDwgMjEpKSA9PSAoMHgxMCA8PCAyMSkpCisJaW5zbiB8PSAweDA5IDw8IDIxOworICAgIH0KKyAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9iZHAgKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgIGludCBkaWFsZWN0LAorCSAgICAgaW50ICppbnZhbGlkKQoreworICBpZiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgPT0gMCkKKyAgICB7CisgICAgICBpZiAoKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwKSA9PSAoKGluc24gJiAoMSA8PCAxNSkpID09IDApKQorCSppbnZhbGlkID0gMTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBpZiAoKGluc24gJiAoMHgxNyA8PCAyMSkpICE9ICgweDA3IDw8IDIxKQorCSAgJiYgKGluc24gJiAoMHgxZCA8PCAyMSkpICE9ICgweDE5IDw8IDIxKSkKKwkqaW52YWxpZCA9IDE7CisgICAgfQorCisgIHJldHVybiAoKGluc24gJiAweGZmZmMpIF4gMHg4MDAwKSAtIDB4ODAwMDsKK30KKworLyogQ2hlY2sgZm9yIGxlZ2FsIHZhbHVlcyBvZiBhIEJPIGZpZWxkLiAgKi8KKworc3RhdGljIGludAordmFsaWRfYm8gKGxvbmcgdmFsdWUsIGludCBkaWFsZWN0LCBpbnQgZXh0cmFjdCkKK3sKKyAgaWYgKChkaWFsZWN0ICYgUFBDX09QQ09ERV9QT1dFUjQpID09IDApCisgICAgeworICAgICAgaW50IHZhbGlkOworICAgICAgLyogQ2VydGFpbiBlbmNvZGluZ3MgaGF2ZSBiaXRzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIHplcm8uCisJIFRoZXNlIGFyZSAoeiBtdXN0IGJlIHplcm8sIHkgbWF5IGJlIGFueXRoaW5nKToKKwkgICAgIDAwMXp5CisJICAgICAwMTF6eQorCSAgICAgMXowMHkKKwkgICAgIDF6MDF5CisJICAgICAxejF6egorICAgICAgKi8KKyAgICAgIHN3aXRjaCAodmFsdWUgJiAweDE0KQorCXsKKwlkZWZhdWx0OgorCWNhc2UgMDoKKwkgIHZhbGlkID0gMTsKKwkgIGJyZWFrOworCWNhc2UgMHg0OgorCSAgdmFsaWQgPSAodmFsdWUgJiAweDIpID09IDA7CisJICBicmVhazsKKwljYXNlIDB4MTA6CisJICB2YWxpZCA9ICh2YWx1ZSAmIDB4OCkgPT0gMDsKKwkgIGJyZWFrOworCWNhc2UgMHgxNDoKKwkgIHZhbGlkID0gdmFsdWUgPT0gMHgxNDsKKwkgIGJyZWFrOworCX0KKyAgICAgIC8qIFdoZW4gZGlzYXNzZW1ibGluZyB3aXRoIC1NYW55LCBhY2NlcHQgcG93ZXI0IGVuY29kaW5ncyB0b28uICAqLworICAgICAgaWYgKHZhbGlkCisJICB8fCAoZGlhbGVjdCAmIFBQQ19PUENPREVfQU5ZKSA9PSAwCisJICB8fCAhZXh0cmFjdCkKKwlyZXR1cm4gdmFsaWQ7CisgICAgfQorCisgIC8qIENlcnRhaW4gZW5jb2RpbmdzIGhhdmUgYml0cyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSB6ZXJvLgorICAgICBUaGVzZSBhcmUgKHogbXVzdCBiZSB6ZXJvLCBhICYgdCBtYXkgYmUgYW55dGhpbmcpOgorCSAwMDAwegorCSAwMDAxegorCSAwMTAwegorCSAwMTAxegorCSAwMDFhdAorCSAwMTFhdAorCSAxYTAwdAorCSAxYTAxdAorCSAxejF6egorICAqLworICBpZiAoKHZhbHVlICYgMHgxNCkgPT0gMCkKKyAgICByZXR1cm4gKHZhbHVlICYgMHgxKSA9PSAwOworICBlbHNlIGlmICgodmFsdWUgJiAweDE0KSA9PSAweDE0KQorICAgIHJldHVybiB2YWx1ZSA9PSAweDE0OworICBlbHNlCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBCTyBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbi4gIFdhcm4gYWJvdXQgYXR0ZW1wdHMgdG8gc2V0CisgICB0aGUgZmllbGQgdG8gYW4gaWxsZWdhbCB2YWx1ZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfYm8gKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICBsb25nIHZhbHVlLAorCSAgIGludCBkaWFsZWN0LAorCSAgIGNvbnN0IGNoYXIgKiplcnJtc2cpCit7CisgIGlmICghdmFsaWRfYm8gKHZhbHVlLCBkaWFsZWN0LCAwKSkKKyAgICAqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOworfQorCitzdGF0aWMgbG9uZworZXh0cmFjdF9ibyAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBpbnQgZGlhbGVjdCwKKwkgICAgaW50ICppbnZhbGlkKQoreworICBsb25nIHZhbHVlOworCisgIHZhbHVlID0gKGluc24gPj4gMjEpICYgMHgxZjsKKyAgaWYgKCF2YWxpZF9ibyAodmFsdWUsIGRpYWxlY3QsIDEpKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgKyBvciAtIG1vZGlmaWVyIGlzCisgICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gIFdoZW4KKyAgIGV4dHJhY3RpbmcgaXQsIHdlIGZvcmNlIGl0IHRvIGJlIGV2ZW4uICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X2JvZSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCwKKwkgICAgY29uc3QgY2hhciAqKmVycm1zZykKK3sKKyAgaWYgKCF2YWxpZF9ibyAodmFsdWUsIGRpYWxlY3QsIDApKQorICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOworICBlbHNlIGlmICgodmFsdWUgJiAxKSAhPSAwKQorICAgICplcnJtc2cgPSBfKCJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIpOworCisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfYm9lICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBpbnQgZGlhbGVjdCwKKwkgICAgIGludCAqaW52YWxpZCkKK3sKKyAgbG9uZyB2YWx1ZTsKKworICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7CisgIGlmICghdmFsaWRfYm8gKHZhbHVlLCBkaWFsZWN0LCAxKSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiB2YWx1ZSAmIDB4MWU7Cit9CisKKy8qIEZYTSBtYXNrIGluIG1mY3IgYW5kIG10Y3JmIGluc3RydWN0aW9ucy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfZnhtICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0LAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnKQoreworICAvKiBJZiB3ZSdyZSBoYW5kbGluZyB0aGUgbWZvY3JmIGFuZCBtdG9jcmYgaW5zbnMgZW5zdXJlIHRoYXQgZXhhY3RseQorICAgICBvbmUgYml0IG9mIHRoZSBtYXNrIGZpZWxkIGlzIHNldC4gICovCisgIGlmICgoaW5zbiAmICgxIDw8IDIwKSkgIT0gMCkKKyAgICB7CisgICAgICBpZiAodmFsdWUgPT0gMCB8fCAodmFsdWUgJiAtdmFsdWUpICE9IHZhbHVlKQorCXsKKwkgICplcnJtc2cgPSBfKCJpbnZhbGlkIG1hc2sgZmllbGQiKTsKKwkgIHZhbHVlID0gMDsKKwl9CisgICAgfQorCisgIC8qIElmIHRoZSBvcHRpb25hbCBmaWVsZCBvbiBtZmNyIGlzIG1pc3NpbmcgdGhhdCBtZWFucyB3ZSB3YW50IHRvIHVzZQorICAgICB0aGUgb2xkIGZvcm0gb2YgdGhlIGluc3RydWN0aW9uIHRoYXQgbW92ZXMgdGhlIHdob2xlIGNyLiAgSW4gdGhhdAorICAgICBjYXNlIHdlJ2xsIGhhdmUgVkFMVUUgemVyby4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0bworICAgICBkaXN0aW5ndWlzaCB0aGlzIGZyb20gdGhlIGNhc2Ugd2hlcmUgc29tZW9uZSB3cml0ZXMgbWZjciAlcjMsMC4gICovCisgIGVsc2UgaWYgKHZhbHVlID09IDApCisgICAgOworCisgIC8qIElmIG9ubHkgb25lIGJpdCBvZiB0aGUgRlhNIGZpZWxkIGlzIHNldCwgd2UgY2FuIHVzZSB0aGUgbmV3IGZvcm0KKyAgICAgb2YgdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBmYXN0ZXIuICBVbmxpa2UgdGhlIFBvd2VyNCBicmFuY2ggaGludAorICAgICBlbmNvZGluZywgdGhpcyBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIERvIG5vdCBnZW5lcmF0ZSB0aGUKKyAgICAgbmV3IGZvcm0gdW5sZXNzIC1tcG93ZXI0IGhhcyBiZWVuIGdpdmVuLCBvciAtbWFueSBhbmQgdGhlIHR3bworICAgICBvcGVyYW5kIGZvcm0gb2YgbWZjciB3YXMgdXNlZC4gICovCisgIGVsc2UgaWYgKCh2YWx1ZSAmIC12YWx1ZSkgPT0gdmFsdWUKKwkgICAmJiAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BPV0VSNCkgIT0gMAorCSAgICAgICB8fCAoKGRpYWxlY3QgJiBQUENfT1BDT0RFX0FOWSkgIT0gMAorCQkgICAmJiAoaW5zbiAmICgweDNmZiA8PCAxKSkgPT0gMTkgPDwgMSkpKQorICAgIGluc24gfD0gMSA8PCAyMDsKKworICAvKiBBbnkgb3RoZXIgdmFsdWUgb24gbWZjciBpcyBhbiBlcnJvci4gICovCisgIGVsc2UgaWYgKChpbnNuICYgKDB4M2ZmIDw8IDEpKSA9PSAxOSA8PCAxKQorICAgIHsKKyAgICAgICplcnJtc2cgPSBfKCJpZ25vcmluZyBpbnZhbGlkIG1mY3IgbWFzayIpOworICAgICAgdmFsdWUgPSAwOworICAgIH0KKworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweGZmKSA8PCAxMik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X2Z4bSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCkKK3sKKyAgbG9uZyBtYXNrID0gKGluc24gPj4gMTIpICYgMHhmZjsKKworICAvKiBJcyB0aGlzIGEgUG93ZXI0IGluc24/ICAqLworICBpZiAoKGluc24gJiAoMSA8PCAyMCkpICE9IDApCisgICAgeworICAgICAgLyogRXhhY3RseSBvbmUgYml0IG9mIE1BU0sgc2hvdWxkIGJlIHNldC4gICovCisgICAgICBpZiAobWFzayA9PSAwIHx8IChtYXNrICYgLW1hc2spICE9IG1hc2spCisJKmludmFsaWQgPSAxOworICAgIH0KKworICAvKiBDaGVjayB0aGF0IG5vbi1wb3dlcjQgZm9ybSBvZiBtZmNyIGhhcyBhIHplcm8gTUFTSy4gICovCisgIGVsc2UgaWYgKChpbnNuICYgKDB4M2ZmIDw8IDEpKSA9PSAxOSA8PCAxKQorICAgIHsKKyAgICAgIGlmIChtYXNrICE9IDApCisJKmludmFsaWQgPSAxOworICAgIH0KKworICByZXR1cm4gbWFzazsKK30KKworLyogVGhlIE1CIGFuZCBNRSBmaWVsZHMgaW4gYW4gTSBmb3JtIGluc3RydWN0aW9uIGV4cHJlc3NlZCBhcyBhIHNpbmdsZQorICAgb3BlcmFuZCB3aGljaCBpcyBpdHNlbGYgYSBiaXRtYXNrLiAgVGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24gYWx3YXlzCisgICBtYXJrcyBpdCBhcyBpbnZhbGlkLCBzaW5jZSB3ZSBuZXZlciB3YW50IHRvIHJlY29nbml6ZSBhbgorICAgaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG9mIHRoaXMgdHlwZS4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfbWJlICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpCit7CisgIHVuc2lnbmVkIGxvbmcgdXZhbCwgbWFzazsKKyAgaW50IG1iLCBtZSwgbXgsIGNvdW50LCBsYXN0OworCisgIHV2YWwgPSB2YWx1ZTsKKworICBpZiAodXZhbCA9PSAwKQorICAgIHsKKyAgICAgICplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKKyAgICAgIHJldHVybiBpbnNuOworICAgIH0KKworICBtYiA9IDA7CisgIG1lID0gMzI7CisgIGlmICgodXZhbCAmIDEpICE9IDApCisgICAgbGFzdCA9IDE7CisgIGVsc2UKKyAgICBsYXN0ID0gMDsKKyAgY291bnQgPSAwOworCisgIC8qIG1iOiBsb2NhdGlvbiBvZiBsYXN0IDAtPjEgdHJhbnNpdGlvbiAqLworICAvKiBtZTogbG9jYXRpb24gb2YgbGFzdCAxLT4wIHRyYW5zaXRpb24gKi8KKyAgLyogY291bnQ6ICMgdHJhbnNpdGlvbnMgKi8KKworICBmb3IgKG14ID0gMCwgbWFzayA9IDFMIDw8IDMxOyBteCA8IDMyOyArK214LCBtYXNrID4+PSAxKQorICAgIHsKKyAgICAgIGlmICgodXZhbCAmIG1hc2spICYmICFsYXN0KQorCXsKKwkgICsrY291bnQ7CisJICBtYiA9IG14OworCSAgbGFzdCA9IDE7CisJfQorICAgICAgZWxzZSBpZiAoISh1dmFsICYgbWFzaykgJiYgbGFzdCkKKwl7CisJICArK2NvdW50OworCSAgbWUgPSBteDsKKwkgIGxhc3QgPSAwOworCX0KKyAgICB9CisgIGlmIChtZSA9PSAwKQorICAgIG1lID0gMzI7CisKKyAgaWYgKGNvdW50ICE9IDIgJiYgKGNvdW50ICE9IDAgfHwgISBsYXN0KSkKKyAgICAqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7CisKKyAgcmV0dXJuIGluc24gfCAobWIgPDwgNikgfCAoKG1lIC0gMSkgPDwgMSk7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X21iZSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCkKK3sKKyAgbG9uZyByZXQ7CisgIGludCBtYiwgbWU7CisgIGludCBpOworCisgICppbnZhbGlkID0gMTsKKworICBtYiA9IChpbnNuID4+IDYpICYgMHgxZjsKKyAgbWUgPSAoaW5zbiA+PiAxKSAmIDB4MWY7CisgIGlmIChtYiA8IG1lICsgMSkKKyAgICB7CisgICAgICByZXQgPSAwOworICAgICAgZm9yIChpID0gbWI7IGkgPD0gbWU7IGkrKykKKwlyZXQgfD0gMUwgPDwgKDMxIC0gaSk7CisgICAgfQorICBlbHNlIGlmIChtYiA9PSBtZSArIDEpCisgICAgcmV0ID0gfjA7CisgIGVsc2UgLyogKG1iID4gbWUgKyAxKSAqLworICAgIHsKKyAgICAgIHJldCA9IH4wOworICAgICAgZm9yIChpID0gbWUgKyAxOyBpIDwgbWI7IGkrKykKKwlyZXQgJj0gfigxTCA8PCAoMzEgLSBpKSk7CisgICAgfQorICByZXR1cm4gcmV0OworfQorCisvKiBUaGUgTUIgb3IgTUUgZmllbGQgaW4gYW4gTUQgb3IgTURTIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCBiaXQKKyAgIGlzIHdyYXBwZWQgdG8gdGhlIGxvdyBlbmQuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X21iNiAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDYpIHwgKHZhbHVlICYgMHgyMCk7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X21iNiAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEKQoreworICByZXR1cm4gKChpbnNuID4+IDYpICYgMHgxZikgfCAoaW5zbiAmIDB4MjApOworfQorCisvKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcworICAgMC4gICovCisKK3N0YXRpYyBsb25nCitleHRyYWN0X25iICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEKQoreworICBsb25nIHJldDsKKworICByZXQgPSAoaW5zbiA+PiAxMSkgJiAweDFmOworICBpZiAocmV0ID09IDApCisgICAgcmV0ID0gMzI7CisgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoZSBOU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBTSQorICAgZmllbGQsIG9ubHkgbmVnYXRlZC4gIFRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGFsd2F5cyBtYXJrcyBpdCBhcworICAgaW52YWxpZCwgc2luY2Ugd2UgbmV2ZXIgd2FudCB0byByZWNvZ25pemUgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcworICAgYSBmaWVsZCBvZiB0aGlzIHR5cGUuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X25zaSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiBpbnNuIHwgKC12YWx1ZSAmIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X25zaSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCkKK3sKKyAgKmludmFsaWQgPSAxOworICByZXR1cm4gLSgoKGluc24gJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMCk7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiBhIEQgb3IgWCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIGlzIGFuIHVwZGF0aW5nCisgICBsb2FkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBSQSBmaWVsZCBtYXkgbm90IGJlIHplcm8gYW5kIG1heSBub3QKKyAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfcmFsICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpCit7CisgIGlmICh2YWx1ZSA9PSAwCisgICAgICB8fCAodW5zaWduZWQgbG9uZykgdmFsdWUgPT0gKChpbnNuID4+IDIxKSAmIDB4MWYpKQorICAgICplcnJtc2cgPSAiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiBhbiBsbXcgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcyBzcGVjaWFsIHZhbHVlCisgICByZXN0cmljdGlvbnMuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3JhbSAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnKQoreworICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID49ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKKyAgICAqZXJybXNnID0gXygiaW5kZXggcmVnaXN0ZXIgaW4gbG9hZCByYW5nZSIpOworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Cit9CisKKy8qIFRoZSBSQSBmaWVsZCBpbiB0aGUgRFEgZm9ybSBscSBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwKKyAgIHZhbHVlIHJlc3RyaWN0aW9ucy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitpbnNlcnRfcmFxICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgIGxvbmcgdmFsdWUsCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpCit7CisgIGxvbmcgcnR2YWx1ZSA9IChpbnNuICYgUlRfTUFTSykgPj4gMjE7CisKKyAgaWYgKHZhbHVlID09IHJ0dmFsdWUpCisgICAgKmVycm1zZyA9IF8oInNvdXJjZSBhbmQgdGFyZ2V0IHJlZ2lzdGVyIG9wZXJhbmRzIG11c3QgYmUgZGlmZmVyZW50Iik7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KTsKK30KKworLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKKyAgIHN0b3JlIG9yIGFuIHVwZGF0aW5nIGZsb2F0aW5nIHBvaW50IGxvYWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIFJBCisgICBmaWVsZCBtYXkgbm90IGJlIHplcm8uICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3JhcyAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnKQoreworICBpZiAodmFsdWUgPT0gMCkKKyAgICAqZXJybXNnID0gXygiaW52YWxpZCByZWdpc3RlciBvcGVyYW5kIHdoZW4gdXBkYXRpbmciKTsKKyAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOworfQorCisvKiBUaGUgUkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcworICAgdGhlIFJTIGZpZWxkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZXh0ZW5kZWQKKyAgIG1uZW1vbmljcyBsaWtlIG1yLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLiAgVGhlIGluc2VydGlvbgorICAgZnVuY3Rpb24ganVzdCBjb3BpZXMgdGhlIEJUIGZpZWxkIGludG8gdGhlIEJBIGZpZWxkLCBhbmQgdGhlCisgICBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QgY2hlY2tzIHRoYXQgdGhlIGZpZWxkcyBhcmUgdGhlIHNhbWUuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3JicyAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlIEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGludCBkaWFsZWN0IEFUVFJJQlVURV9VTlVTRUQsCisJICAgIGNvbnN0IGNoYXIgKiplcnJtc2cgQVRUUklCVVRFX1VOVVNFRCkKK3sKKyAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDExKTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3RfcmJzICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICAgaW50ICppbnZhbGlkKQoreworICBpZiAoKChpbnNuID4+IDIxKSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKKyAgICAqaW52YWxpZCA9IDE7CisgIHJldHVybiAwOworfQorCisvKiBUaGUgU0ggZmllbGQgaW4gYW4gTUQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgc3BsaXQuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3NoNiAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDExKSB8ICgodmFsdWUgJiAweDIwKSA+PiA0KTsKK30KKworc3RhdGljIGxvbmcKK2V4dHJhY3Rfc2g2ICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICAgaW50ICppbnZhbGlkIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiAoKGluc24gPj4gMTEpICYgMHgxZikgfCAoKGluc24gPDwgNCkgJiAweDIwKTsKK30KKworLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCisgICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3NwciAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X3NwciAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEKQoreworICByZXR1cm4gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOworfQorCisvKiBTb21lIGRpYWxlY3RzIGhhdmUgOCBTUFJHIHJlZ2lzdGVycyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCA0LiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2luc2VydF9zcHJnICh1bnNpZ25lZCBsb25nIGluc24sCisJICAgICBsb25nIHZhbHVlLAorCSAgICAgaW50IGRpYWxlY3QsCisJICAgICBjb25zdCBjaGFyICoqZXJybXNnKQoreworICAvKiBUaGlzIGNoZWNrIHVzZXMgUFBDX09QQ09ERV80MDMgYmVjYXVzZSBQUEM0MDUgaXMgbGF0ZXIgZGVmaW5lZAorICAgICBhcyBhIHN5bm9ueW0uICBJZiBldmVyIGEgNDA1IHNwZWNpZmljIGRpYWxlY3QgaXMgYWRkZWQgdGhpcworICAgICBjaGVjayBzaG91bGQgdXNlIHRoYXQgaW5zdGVhZC4gICovCisgIGlmICh2YWx1ZSA+IDcKKyAgICAgIHx8ICh2YWx1ZSA+IDMKKwkgICYmIChkaWFsZWN0ICYgKFBQQ19PUENPREVfQk9PS0UgfCBQUENfT1BDT0RFXzQwMykpID09IDApKQorICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIHNwcmcgbnVtYmVyIik7CisKKyAgLyogSWYgdGhpcyBpcyBtZnNwcmc0Li43IHRoZW4gdXNlIHNwciAyNjAuLjI2MyB3aGljaCBjYW4gYmUgcmVhZCBpbgorICAgICB1c2VyIG1vZGUuICBBbnl0aGluZyBlbHNlIG11c3QgdXNlIHNwciAyNzIuLjI3OS4gICovCisgIGlmICh2YWx1ZSA8PSAzIHx8IChpbnNuICYgMHgxMDApICE9IDApCisgICAgdmFsdWUgfD0gMHgxMDsKKworICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDE3KSA8PCAxNik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X3NwcmcgKHVuc2lnbmVkIGxvbmcgaW5zbiwKKwkgICAgICBpbnQgZGlhbGVjdCwKKwkgICAgICBpbnQgKmludmFsaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgdmFsID0gKGluc24gPj4gMTYpICYgMHgxZjsKKworICAvKiBtZnNwcmcgY2FuIHVzZSAyNjAuLjI2MyBhbmQgMjcyLi4yNzkuICBtdHNwcmcgb25seSB1c2VzIHNwciAyNzIuLjI3OQorICAgICBJZiBub3QgQk9PS0Ugb3IgNDA1LCB0aGVuIGJvdGggdXNlIG9ubHkgMjcyLi4yNzUuICAqLworICBpZiAodmFsIDw9IDMKKyAgICAgIHx8ICh2YWwgPCAweDEwICYmIChpbnNuICYgMHgxMDApICE9IDApCisgICAgICB8fCAodmFsIC0gMHgxMCA+IDMKKwkgICYmIChkaWFsZWN0ICYgKFBQQ19PUENPREVfQk9PS0UgfCBQUENfT1BDT0RFXzQwMykpID09IDApKQorICAgICppbnZhbGlkID0gMTsKKyAgcmV0dXJuIHZhbCAmIDc7Cit9CisKKy8qIFRoZSBUQlIgZmllbGQgaW4gYW4gWEZYIGluc3RydWN0aW9uLiAgVGhpcyBpcyBqdXN0IGxpa2UgU1BSLCBidXQgaXQKKyAgIGlzIG9wdGlvbmFsLiAgV2hlbiBUQlIgaXMgb21pdHRlZCwgaXQgbXVzdCBiZSBpbnNlcnRlZCBhcyAyNjggKHRoZQorICAgbWFnaWMgbnVtYmVyIG9mIHRoZSBUQiByZWdpc3RlcikuICBUaGVzZSBmdW5jdGlvbnMgdHJlYXQgMAorICAgKGluZGljYXRpbmcgYW4gb21pdHRlZCBvcHRpb25hbCBvcGVyYW5kKSBhcyAyNjguICBUaGlzIG1lYW5zIHRoYXQKKyAgIGBgbWZ0YiA0LDAnJyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGlzIGRvZXMgbm90IG1hdHRlciB2ZXJ5CisgICBtdWNoLCBzaW5jZSB0aGUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBkb2VzIG5vdCBkZWZpbmUgbWZ0YiBhcworICAgYWNjZXB0aW5nIGFueSB2YWx1ZXMgb3RoZXIgdGhhbiAyNjggb3IgMjY5LiAgKi8KKworI2RlZmluZSBUQiAoMjY4KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworaW5zZXJ0X3RiciAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICBsb25nIHZhbHVlLAorCSAgICBpbnQgZGlhbGVjdCBBVFRSSUJVVEVfVU5VU0VELAorCSAgICBjb25zdCBjaGFyICoqZXJybXNnIEFUVFJJQlVURV9VTlVTRUQpCit7CisgIGlmICh2YWx1ZSA9PSAwKQorICAgIHZhbHVlID0gVEI7CisgIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNlMCkgPDwgNik7Cit9CisKK3N0YXRpYyBsb25nCitleHRyYWN0X3RiciAodW5zaWduZWQgbG9uZyBpbnNuLAorCSAgICAgaW50IGRpYWxlY3QgQVRUUklCVVRFX1VOVVNFRCwKKwkgICAgIGludCAqaW52YWxpZCBBVFRSSUJVVEVfVU5VU0VEKQoreworICBsb25nIHJldDsKKworICByZXQgPSAoKGluc24gPj4gMTYpICYgMHgxZikgfCAoKGluc24gPj4gNikgJiAweDNlMCk7CisgIGlmIChyZXQgPT0gVEIpCisgICAgcmV0ID0gMDsKKyAgcmV0dXJuIHJldDsKK30KKwwKKy8qIE1hY3JvcyB1c2VkIHRvIGZvcm0gb3Bjb2Rlcy4gICovCisKKy8qIFRoZSBtYWluIG9wY29kZS4gICovCisjZGVmaW5lIE9QKHgpICgoKCh1bnNpZ25lZCBsb25nKSh4KSkgJiAweDNmKSA8PCAyNikKKyNkZWZpbmUgT1BfTUFTSyBPUCAoMHgzZikKKworLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSB0cmFwIGNvZGUgaW4gdGhlIFRPIGZpZWxkIG9mIGEgRAorICAgZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IgdGhlIHRyYXAKKyAgIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIE9QVE8oeCx0bykgKE9QICh4KSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQorI2RlZmluZSBPUFRPX01BU0sgKE9QX01BU0sgfCBUT19NQVNLKQorCisvKiBUaGUgbWFpbiBvcGNvZGUgY29tYmluZWQgd2l0aCBhIGNvbXBhcmlzb24gc2l6ZSBiaXQgaW4gdGhlIEwgZmllbGQKKyAgIG9mIGEgRCBmb3JtIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gIFVzZWQgZm9yIGV4dGVuZGVkIG1uZW1vbmljcyBmb3IKKyAgIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9ucy4gICovCisjZGVmaW5lIE9QTCh4LGwpIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykobCkpICYgMSkgPDwgMjEpKQorI2RlZmluZSBPUExfTUFTSyBPUEwgKDB4M2YsMSkKKworLyogQW4gQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQShvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmKSA8PCAxKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKKyNkZWZpbmUgQV9NQVNLIEEgKDB4M2YsIDB4MWYsIDEpCisKKy8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkIgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBBRlJCX01BU0sgKEFfTUFTSyB8IEZSQl9NQVNLKQorCisvKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJDIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgQUZSQ19NQVNLIChBX01BU0sgfCBGUkNfTUFTSykKKworLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQSBhbmQgRlJDIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIEFGUkFGUkNfTUFTSyAoQV9NQVNLIHwgRlJBX01BU0sgfCBGUkNfTUFTSykKKworLyogQW4gQUZSQUZSQ19NQVNLLCBidXQgd2l0aCBMIGJpdCBjbGVhci4gICovCisjZGVmaW5lIEFGUkFMRlJDX01BU0sgKEFGUkFGUkNfTUFTSyAmIH4oKHVuc2lnbmVkIGxvbmcpIDEgPDwgMTYpKQorCisvKiBBIEIgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIEIob3AsIGFhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoYWEpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKKyNkZWZpbmUgQl9NQVNLIEIgKDB4M2YsIDEsIDEpCisKKy8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkLiAgKi8KKyNkZWZpbmUgQkJPKG9wLCBibywgYWEsIGxrKSAoQiAoKG9wKSwgKGFhKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYm8pKSAmIDB4MWYpIDw8IDIxKSkKKyNkZWZpbmUgQkJPX01BU0sgQkJPICgweDNmLCAweDFmLCAxLCAxKQorCisvKiBBIEJCT19NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgVGhpcyBwZXJtaXRzCisgICBtYXRjaGluZyBhIGNvbmRpdGlvbmFsIGJyYW5jaCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSB5CisgICBiaXQuICBTaW1pbGFybHkgZm9yIHRoZSAnYXQnIGJpdHMgdXNlZCBmb3IgcG93ZXI0IGJyYW5jaCBoaW50cy4gICovCisjZGVmaW5lIFlfTUFTSyAgICgoKHVuc2lnbmVkIGxvbmcpIDEpIDw8IDIxKQorI2RlZmluZSBBVDFfTUFTSyAoKCh1bnNpZ25lZCBsb25nKSAzKSA8PCAyMSkKKyNkZWZpbmUgQVQyX01BU0sgKCgodW5zaWduZWQgbG9uZykgOSkgPDwgMjEpCisjZGVmaW5lIEJCT1lfTUFTSyAgKEJCT19NQVNLICZ+IFlfTUFTSykKKyNkZWZpbmUgQkJPQVRfTUFTSyAoQkJPX01BU0sgJn4gQVQxX01BU0spCisKKy8qIEEgQiBmb3JtIGluc3RydWN0aW9uIHNldHRpbmcgdGhlIEJPIGZpZWxkIGFuZCB0aGUgY29uZGl0aW9uIGJpdHMgb2YKKyAgIHRoZSBCSSBmaWVsZC4gICovCisjZGVmaW5lIEJCT0NCKG9wLCBibywgY2IsIGFhLCBsaykgXAorICAoQkJPICgob3ApLCAoYm8pLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShjYikpICYgMHgzKSA8PCAxNikpCisjZGVmaW5lIEJCT0NCX01BU0sgQkJPQ0IgKDB4M2YsIDB4MWYsIDB4MywgMSwgMSkKKworLyogQSBCQk9DQl9NQVNLIHdpdGggdGhlIHkgYml0IG9mIHRoZSBCTyBmaWVsZCByZW1vdmVkLiAgKi8KKyNkZWZpbmUgQkJPWUNCX01BU0sgKEJCT0NCX01BU0sgJn4gWV9NQVNLKQorI2RlZmluZSBCQk9BVENCX01BU0sgKEJCT0NCX01BU0sgJn4gQVQxX01BU0spCisjZGVmaW5lIEJCT0FUMkNCX01BU0sgKEJCT0NCX01BU0sgJn4gQVQyX01BU0spCisKKy8qIEEgQkJPWUNCX01BU0sgaW4gd2hpY2ggdGhlIEJJIGZpZWxkIGlzIGZpeGVkLiAgKi8KKyNkZWZpbmUgQkJPWUJJX01BU0sgKEJCT1lDQl9NQVNLIHwgQklfTUFTSykKKyNkZWZpbmUgQkJPQVRCSV9NQVNLIChCQk9BVDJDQl9NQVNLIHwgQklfTUFTSykKKworLyogQW4gQ29udGV4dCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgQ1RYKG9wLCB4b3ApICAgKE9QIChvcCkgfCAoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4NykpCisjZGVmaW5lIENUWF9NQVNLIENUWCgweDNmLCAweDcpCisKKy8qIEFuIFVzZXIgQ29udGV4dCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVUNUWChvcCwgeG9wKSAgKE9QIChvcCkgfCAoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWYpKQorI2RlZmluZSBVQ1RYX01BU0sgVUNUWCgweDNmLCAweDFmKQorCisvKiBUaGUgbWFpbiBvcGNvZGUgbWFzayB3aXRoIHRoZSBSQSBmaWVsZCBjbGVhci4gICovCisjZGVmaW5lIERSQV9NQVNLIChPUF9NQVNLIHwgUkFfTUFTSykKKworLyogQSBEUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgRFNPKG9wLCB4b3ApIChPUCAob3ApIHwgKCh4b3ApICYgMHgzKSkKKyNkZWZpbmUgRFNfTUFTSyBEU08gKDB4M2YsIDMpCisKKy8qIEEgREUgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIERFTyhvcCwgeG9wKSAoT1AgKG9wKSB8ICgoeG9wKSAmIDB4ZikpCisjZGVmaW5lIERFX01BU0sgREVPICgweDNlLCAweGYpCisKKy8qIEFuIEVWU0VMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBFVlNFTChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHhmZikgPDwgMykKKyNkZWZpbmUgRVZTRUxfTUFTSyBFVlNFTCgweDNmLCAweGZmKQorCisvKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBNKG9wLCByYykgKE9QIChvcCkgfCAoKHJjKSAmIDEpKQorI2RlZmluZSBNX01BU0sgTSAoMHgzZiwgMSkKKworLyogQW4gTSBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIE1FIGZpZWxkIHNwZWNpZmllZC4gICovCisjZGVmaW5lIE1NRShvcCwgbWUsIHJjKSAoTSAoKG9wKSwgKHJjKSkgfCAoKCgodW5zaWduZWQgbG9uZykobWUpKSAmIDB4MWYpIDw8IDEpKQorCisvKiBBbiBNX01BU0sgd2l0aCB0aGUgTUIgYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIE1NQk1FX01BU0sgKE1fTUFTSyB8IE1CX01BU0sgfCBNRV9NQVNLKQorCisvKiBBbiBNX01BU0sgd2l0aCB0aGUgU0ggYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCisjZGVmaW5lIE1TSE1FX01BU0sgKE1fTUFTSyB8IFNIX01BU0sgfCBNRV9NQVNLKQorCisvKiBBbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTUQob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHg3KSA8PCAyKSB8ICgocmMpICYgMSkpCisjZGVmaW5lIE1EX01BU0sgTUQgKDB4M2YsIDB4NywgMSkKKworLyogQW4gTURfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIE1ETUJfTUFTSyAoTURfTUFTSyB8IE1CNl9NQVNLKQorCisvKiBBbiBNRF9NQVNLIHdpdGggdGhlIFNIIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgTURTSF9NQVNLIChNRF9NQVNLIHwgU0g2X01BU0spCisKKy8qIEFuIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgTURTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4ZikgPDwgMSkgfCAoKHJjKSAmIDEpKQorI2RlZmluZSBNRFNfTUFTSyBNRFMgKDB4M2YsIDB4ZiwgMSkKKworLyogQW4gTURTX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBNRFNNQl9NQVNLIChNRFNfTUFTSyB8IE1CNl9NQVNLKQorCisvKiBBbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgU0Mob3AsIHNhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoc2EpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKKyNkZWZpbmUgU0NfTUFTSyAoT1BfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMHgzZmYpIDw8IDE2KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMSkgfCAxKQorCisvKiBBbiBWWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVlgob3AsIHhvcCkgKE9QIChvcCkgfCAoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4N2ZmKSkKKworLyogVGhlIG1hc2sgZm9yIGFuIFZYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBWWF9NQVNLCVZYKDB4M2YsIDB4N2ZmKQorCisvKiBBbiBWQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVlhBKG9wLCB4b3ApIChPUCAob3ApIHwgKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDAzZikpCisKKy8qIFRoZSBtYXNrIGZvciBhbiBWQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVlhBX01BU0sgVlhBKDB4M2YsIDB4M2YpCisKKy8qIEFuIFZYUiBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgVlhSKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKHJjKSAmIDEpIDw8IDEwKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpKQorCisvKiBUaGUgbWFzayBmb3IgYSBWWFIgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFZYUl9NQVNLIFZYUigweDNmLCAweDNmZiwgMSkKKworLyogQW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWChvcCwgeG9wKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4M2ZmKSA8PCAxKSkKKworLyogQSBaIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBaKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDEpKQorCisvKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUkMgYml0IHNwZWNpZmllZC4gICovCisjZGVmaW5lIFhSQyhvcCwgeG9wLCByYykgKFggKChvcCksICh4b3ApKSB8ICgocmMpICYgMSkpCisKKy8qIEEgWiBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFJDIGJpdCBzcGVjaWZpZWQuICAqLworI2RlZmluZSBaUkMob3AsIHhvcCwgcmMpIChaICgob3ApLCAoeG9wKSkgfCAoKHJjKSAmIDEpKQorCisvKiBUaGUgbWFzayBmb3IgYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWF9NQVNLIFhSQyAoMHgzZiwgMHgzZmYsIDEpCisKKy8qIFRoZSBtYXNrIGZvciBhIFogZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFpfTUFTSyBaUkMgKDB4M2YsIDB4MWZmLCAxKQorI2RlZmluZSBaMl9NQVNLIFpSQyAoMHgzZiwgMHhmZiwgMSkKKworLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgWFJBX01BU0sgKFhfTUFTSyB8IFJBX01BU0spCisKKy8qIEFuIFhSQV9NQVNLIHdpdGggdGhlIFcgZmllbGQgY2xlYXIuICAqLworI2RlZmluZSBYV1JBX01BU0sgKFhSQV9NQVNLICYgfigodW5zaWduZWQgbG9uZykgMSA8PCAxNikpCisKKy8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIFhSQl9NQVNLIChYX01BU0sgfCBSQl9NQVNLKQorCisvKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQuICAqLworI2RlZmluZSBYUlRfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSykKKworLyogQW4gWFJUX01BU0sgbWFzayB3aXRoIHRoZSBMIGJpdHMgY2xlYXIuICAqLworI2RlZmluZSBYTFJUX01BU0sgKFhSVF9NQVNLICYgfigodW5zaWduZWQgbG9uZykgMHgzIDw8IDIxKSkKKworLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGFuZCBSQiBmaWVsZHMgZml4ZWQuICAqLworI2RlZmluZSBYUkFSQl9NQVNLIChYX01BU0sgfCBSQV9NQVNLIHwgUkJfTUFTSykKKworLyogQW4gWFJBUkJfTUFTSywgYnV0IHdpdGggdGhlIEwgYml0IGNsZWFyLiAgKi8KKyNkZWZpbmUgWFJMQVJCX01BU0sgKFhSQVJCX01BU0sgJiB+KCh1bnNpZ25lZCBsb25nKSAxIDw8IDE2KSkKKworLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGFuZCBSQSBmaWVsZHMgZml4ZWQuICAqLworI2RlZmluZSBYUlRSQV9NQVNLIChYX01BU0sgfCBSVF9NQVNLIHwgUkFfTUFTSykKKworLyogQW4gWFJUUkFfTUFTSywgYnV0IHdpdGggTCBiaXQgY2xlYXIuICAqLworI2RlZmluZSBYUlRMUkFfTUFTSyAoWFJUUkFfTUFTSyAmIH4oKHVuc2lnbmVkIGxvbmcpIDEgPDwgMjEpKQorCisvKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgTCBiaXQgc3BlY2lmaWVkLiAgKi8KKyNkZWZpbmUgWE9QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKKworLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KKyNkZWZpbmUgWENNUF9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIyKSkKKworLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uIHdpdGggdGhlIEwgZmllbGQKKyAgIGZpeGVkLiAgKi8KKyNkZWZpbmUgWENNUExfTUFTSyAoWENNUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkpCisKKy8qIEFuIFggZm9ybSB0cmFwIGluc3RydWN0aW9uIHdpdGggdGhlIFRPIGZpZWxkIHNwZWNpZmllZC4gICovCisjZGVmaW5lIFhUTyhvcCwgeG9wLCB0bykgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQorI2RlZmluZSBYVE9fTUFTSyAoWF9NQVNLIHwgVE9fTUFTSykKKworLyogQW4gWCBmb3JtIHRsYiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTSCBmaWVsZCBzcGVjaWZpZWQuICAqLworI2RlZmluZSBYVExCKG9wLCB4b3AsIHNoKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHNoKSkgJiAweDFmKSA8PCAxMSkpCisjZGVmaW5lIFhUTEJfTUFTSyAoWF9NQVNLIHwgU0hfTUFTSykKKworLyogQW4gWCBmb3JtIHN5bmMgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYU1lOQyhvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDMpIDw8IDIxKSkKKworLyogQW4gWCBmb3JtIHN5bmMgaW5zdHJ1Y3Rpb24gd2l0aCBldmVyeXRoaW5nIGZpbGxlZCBpbiBleGNlcHQgdGhlIExTIGZpZWxkLiAgKi8KKyNkZWZpbmUgWFNZTkNfTUFTSyAoMHhmZjlmZmZmZikKKworLyogQW4gWF9NQVNLLCBidXQgd2l0aCB0aGUgRUggYml0IGNsZWFyLiAgKi8KKyNkZWZpbmUgWEVIX01BU0sgKFhfTUFTSyAmIH4oKHVuc2lnbmVkIGxvbmcgKTEpKQorCisvKiBBbiBYIGZvcm0gQWx0aVZlYyBkc3MgaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYRFNTKG9wLCB4b3AsIGEpIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoYSkpICYgMSkgPDwgMjUpKQorI2RlZmluZSBYRFNTX01BU0sgWERTUygweDNmLCAweDNmZiwgMSkKKworLyogQW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYRkwob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQorI2RlZmluZSBYRkxfTUFTSyBYRkwgKDB4M2YsIDB4M2ZmLCAxKQorCisvKiBBbiBYIGZvcm0gaXNlbCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhJU0VMKG9wLCB4b3ApICAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWYpIDw8IDEpKQorI2RlZmluZSBYSVNFTF9NQVNLICAgICAgWElTRUwoMHgzZiwgMHgxZikKKworLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBMSyBmaWVsZCBzZXQgdG8gMC4gICovCisjZGVmaW5lIFhMKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQorCisvKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIHVzZXMgdGhlIExLIGZpZWxkLiAgKi8KKyNkZWZpbmUgWExMSyhvcCwgeG9wLCBsaykgKFhMICgob3ApLCAoeG9wKSkgfCAoKGxrKSAmIDEpKQorCisvKiBUaGUgbWFzayBmb3IgYW4gWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhMX01BU0sgWExMSyAoMHgzZiwgMHgzZmYsIDEpCisKKy8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggZXhwbGljaXRseSBzZXRzIHRoZSBCTyBmaWVsZC4gICovCisjZGVmaW5lIFhMTyhvcCwgYm8sIHhvcCwgbGspIFwKKyAgKFhMTEsgKChvcCksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShibykpICYgMHgxZikgPDwgMjEpKQorI2RlZmluZSBYTE9fTUFTSyAoWExfTUFTSyB8IEJPX01BU0spCisKKy8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggZXhwbGljaXRseSBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8KKyAgIGZpZWxkLiAgKi8KKyNkZWZpbmUgWExZTEsob3AsIHhvcCwgeSwgbGspIChYTExLICgob3ApLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoeSkpICYgMSkgPDwgMjEpKQorI2RlZmluZSBYTFlMS19NQVNLIChYTF9NQVNLIHwgWV9NQVNLKQorCisvKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoaWNoIHNldHMgdGhlIEJPIGZpZWxkIGFuZCB0aGUgY29uZGl0aW9uCisgICBiaXRzIG9mIHRoZSBCSSBmaWVsZC4gICovCisjZGVmaW5lIFhMT0NCKG9wLCBibywgY2IsIHhvcCwgbGspIFwKKyAgKFhMTyAoKG9wKSwgKGJvKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGNiKSkgJiAzKSA8PCAxNikpCisjZGVmaW5lIFhMT0NCX01BU0sgWExPQ0IgKDB4M2YsIDB4MWYsIDB4MywgMHgzZmYsIDEpCisKKy8qIEFuIFhMX01BU0sgb3IgWExZTEtfTUFTSyBvciBYTE9DQl9NQVNLIHdpdGggdGhlIEJCIGZpZWxkIGZpeGVkLiAgKi8KKyNkZWZpbmUgWExCQl9NQVNLIChYTF9NQVNLIHwgQkJfTUFTSykKKyNkZWZpbmUgWExZQkJfTUFTSyAoWExZTEtfTUFTSyB8IEJCX01BU0spCisjZGVmaW5lIFhMQk9DQkJCX01BU0sgKFhMT0NCX01BU0sgfCBCQl9NQVNLKQorCisvKiBBIG1hc2sgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMgdXNpbmcgdGhlIEJIIGZpZWxkLiAgKi8KKyNkZWZpbmUgWExCSF9NQVNLIChYTF9NQVNLIHwgKDB4MWMgPDwgMTEpKQorCisvKiBBbiBYTF9NQVNLIHdpdGggdGhlIEJPIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLworI2RlZmluZSBYTEJPQkJfTUFTSyAoWExfTUFTSyB8IEJPX01BU0sgfCBCQl9NQVNLKQorCisvKiBBbiBYTF9NQVNLIHdpdGggdGhlIEJPLCBCSSBhbmQgQkIgZmllbGRzIGZpeGVkLiAgKi8KKyNkZWZpbmUgWExCT0JJQkJfTUFTSyAoWExfTUFTSyB8IEJPX01BU0sgfCBCSV9NQVNLIHwgQkJfTUFTSykKKworLyogQW4gWE8gZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhPKG9wLCB4b3AsIG9lLCByYykgXAorICAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAxKSB8ICgoKCh1bnNpZ25lZCBsb25nKShvZSkpICYgMSkgPDwgMTApIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQorI2RlZmluZSBYT19NQVNLIFhPICgweDNmLCAweDFmZiwgMSwgMSkKKworLyogQW4gWE9fTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCisjZGVmaW5lIFhPUkJfTUFTSyAoWE9fTUFTSyB8IFJCX01BU0spCisKKy8qIEFuIFhTIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLworI2RlZmluZSBYUyhvcCwgeG9wLCByYykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDFmZikgPDwgMikgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCisjZGVmaW5lIFhTX01BU0sgWFMgKDB4M2YsIDB4MWZmLCAxKQorCisvKiBBIG1hc2sgZm9yIHRoZSBGWE0gdmVyc2lvbiBvZiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhGWEZYTV9NQVNLIChYX01BU0sgfCAoMSA8PCAxMSkgfCAoMSA8PCAyMCkpCisKKy8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIEZYTSBmaWVsZCBmaWxsZWQgaW4uICAqLworI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSwgcDQpIFwKKyAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShmeG0pKSAmIDB4ZmYpIDw8IDEyKSBcCisgICB8ICgodW5zaWduZWQgbG9uZykocDQpIDw8IDIwKSkKKworLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbi4gICovCisjZGVmaW5lIFhTUFIob3AsIHhvcCwgc3ByKSBcCisgIChYICgob3ApLCAoeG9wKSkgfCAoKCgodW5zaWduZWQgbG9uZykoc3ByKSkgJiAweDFmKSA8PCAxNikgfCAoKCgodW5zaWduZWQgbG9uZykoc3ByKSkgJiAweDNlMCkgPDwgNikpCisjZGVmaW5lIFhTUFJfTUFTSyAoWF9NQVNLIHwgU1BSX01BU0spCisKKy8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKKyAgIFNQUkJBVCBmaWVsZC4gICovCisjZGVmaW5lIFhTUFJCQVRfTUFTSyAoWFNQUl9NQVNLICZ+IFNQUkJBVF9NQVNLKQorCisvKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluIGV4Y2VwdCBmb3IgdGhlCisgICBTUFJHIGZpZWxkLiAgKi8KKyNkZWZpbmUgWFNQUkdfTUFTSyAoWFNQUl9NQVNLICYgfigweDFmIDw8IDE2KSkKKworLyogQW4gWCBmb3JtIGluc3RydWN0aW9uIHdpdGggZXZlcnl0aGluZyBmaWxsZWQgaW4gZXhjZXB0IHRoZSBFIGZpZWxkLiAgKi8KKyNkZWZpbmUgWEVfTUFTSyAoMHhmZmZmN2ZmZikKKworLyogQW4gWCBmb3JtIHVzZXIgY29udGV4dCBpbnN0cnVjdGlvbi4gICovCisjZGVmaW5lIFhVQyhvcCwgeG9wKSAgKE9QIChvcCkgfCAoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWYpKQorI2RlZmluZSBYVUNfTUFTSyAgICAgIFhVQygweDNmLCAweDFmKQorCisvKiBUaGUgQk8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcy4gICovCisjZGVmaW5lIEJPRE5aRgkoMHgwKQorI2RlZmluZSBCT0ROWkZQCSgweDEpCisjZGVmaW5lIEJPRFpGCSgweDIpCisjZGVmaW5lIEJPRFpGUAkoMHgzKQorI2RlZmluZSBCT0ROWlQJKDB4OCkKKyNkZWZpbmUgQk9ETlpUUAkoMHg5KQorI2RlZmluZSBCT0RaVAkoMHhhKQorI2RlZmluZSBCT0RaVFAJKDB4YikKKworI2RlZmluZSBCT0YJKDB4NCkKKyNkZWZpbmUgQk9GUAkoMHg1KQorI2RlZmluZSBCT0ZNNAkoMHg2KQorI2RlZmluZSBCT0ZQNAkoMHg3KQorI2RlZmluZSBCT1QJKDB4YykKKyNkZWZpbmUgQk9UUAkoMHhkKQorI2RlZmluZSBCT1RNNAkoMHhlKQorI2RlZmluZSBCT1RQNAkoMHhmKQorCisjZGVmaW5lIEJPRE5aCSgweDEwKQorI2RlZmluZSBCT0ROWlAJKDB4MTEpCisjZGVmaW5lIEJPRFoJKDB4MTIpCisjZGVmaW5lIEJPRFpQCSgweDEzKQorI2RlZmluZSBCT0ROWk00ICgweDE4KQorI2RlZmluZSBCT0ROWlA0ICgweDE5KQorI2RlZmluZSBCT0RaTTQJKDB4MWEpCisjZGVmaW5lIEJPRFpQNAkoMHgxYikKKworI2RlZmluZSBCT1UJKDB4MTQpCisKKy8qIFRoZSBCSSBjb25kaXRpb24gYml0IGVuY29kaW5ncyB1c2VkIGluIGV4dGVuZGVkIGNvbmRpdGlvbmFsIGJyYW5jaAorICAgbW5lbW9uaWNzLiAgKi8KKyNkZWZpbmUgQ0JMVAkoMCkKKyNkZWZpbmUgQ0JHVAkoMSkKKyNkZWZpbmUgQ0JFUQkoMikKKyNkZWZpbmUgQ0JTTwkoMykKKworLyogVGhlIFRPIGVuY29kaW5ncyB1c2VkIGluIGV4dGVuZGVkIHRyYXAgbW5lbW9uaWNzLiAgKi8KKyNkZWZpbmUgVE9MR1QJKDB4MSkKKyNkZWZpbmUgVE9MTFQJKDB4MikKKyNkZWZpbmUgVE9FUQkoMHg0KQorI2RlZmluZSBUT0xHRQkoMHg1KQorI2RlZmluZSBUT0xOTAkoMHg1KQorI2RlZmluZSBUT0xMRQkoMHg2KQorI2RlZmluZSBUT0xORwkoMHg2KQorI2RlZmluZSBUT0dUCSgweDgpCisjZGVmaW5lIFRPR0UJKDB4YykKKyNkZWZpbmUgVE9OTAkoMHhjKQorI2RlZmluZSBUT0xUCSgweDEwKQorI2RlZmluZSBUT0xFCSgweDE0KQorI2RlZmluZSBUT05HCSgweDE0KQorI2RlZmluZSBUT05FCSgweDE4KQorI2RlZmluZSBUT1UJKDB4MWYpCisMCisvKiBTbWFsbGVyIG5hbWVzIGZvciB0aGUgZmxhZ3Mgc28gZWFjaCBlbnRyeSBpbiB0aGUgb3Bjb2RlcyB0YWJsZSB3aWxsCisgICBmaXQgb24gYSBzaW5nbGUgbGluZS4gICovCisjdW5kZWYJUFBDCisjZGVmaW5lIFBQQyAgICAgUFBDX09QQ09ERV9QUEMKKyNkZWZpbmUgUFBDQ09NCVBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04KKyNkZWZpbmUgTk9QT1dFUjQgUFBDX09QQ09ERV9OT1BPV0VSNCB8IFBQQ0NPTQorI2RlZmluZSBQT1dFUjQJUFBDX09QQ09ERV9QT1dFUjQKKyNkZWZpbmUgUE9XRVI1CVBQQ19PUENPREVfUE9XRVI1CisjZGVmaW5lIFBPV0VSNglQUENfT1BDT0RFX1BPV0VSNgorI2RlZmluZSBDRUxMCVBQQ19PUENPREVfQ0VMTAorI2RlZmluZSBQUEMzMiAgIFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFX1BQQworI2RlZmluZSBQUEM2NCAgIFBQQ19PUENPREVfNjQgfCBQUENfT1BDT0RFX1BQQworI2RlZmluZSBQUEM0MDMJUFBDX09QQ09ERV80MDMKKyNkZWZpbmUgUFBDNDA1CVBQQzQwMworI2RlZmluZSBQUEM0NDAJUFBDX09QQ09ERV80NDAKKyNkZWZpbmUgUFBDNzUwCVBQQworI2RlZmluZSBQUEM4NjAJUFBDCisjZGVmaW5lIFBQQ1ZFQwlQUENfT1BDT0RFX0FMVElWRUMKKyNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSCisjZGVmaW5lCVBPV0VSMglQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIKKyNkZWZpbmUgUFBDUFdSMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMgorI2RlZmluZQlQT1dFUjMyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFXzMyCisjZGVmaW5lCUNPTSAgICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04KKyNkZWZpbmUJQ09NMzIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfMzIKKyNkZWZpbmUJTTYwMSAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEKKyNkZWZpbmUgUFdSQ09NCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFXzYwMSB8IFBQQ19PUENPREVfQ09NTU9OCisjZGVmaW5lCU1GREVDMQlQUENfT1BDT0RFX1BPV0VSCisjZGVmaW5lCU1GREVDMglQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9CT09LRQorI2RlZmluZSBCT09LRQlQUENfT1BDT0RFX0JPT0tFCisjZGVmaW5lIEJPT0tFNjQJUFBDX09QQ09ERV9CT09LRTY0CisjZGVmaW5lIENMQVNTSUMJUFBDX09QQ09ERV9DTEFTU0lDCisjZGVmaW5lIFBQQ0UzMDAgUFBDX09QQ09ERV9FMzAwCisjZGVmaW5lIFBQQ1NQRQlQUENfT1BDT0RFX1NQRQorI2RlZmluZSBQUENJU0VMCVBQQ19PUENPREVfSVNFTAorI2RlZmluZSBQUENFRlMJUFBDX09QQ09ERV9FRlMKKyNkZWZpbmUgUFBDQlJMSwlQUENfT1BDT0RFX0JSTE9DSworI2RlZmluZSBQUENQTVIJUFBDX09QQ09ERV9QTVIKKyNkZWZpbmUgUFBDQ0hMSwlQUENfT1BDT0RFX0NBQ0hFTENLCisjZGVmaW5lIFBQQ0NITEs2NAlQUENfT1BDT0RFX0NBQ0hFTENLIHwgUFBDX09QQ09ERV9CT09LRTY0CisjZGVmaW5lIFBQQ1JGTUNJCVBQQ19PUENPREVfUkZNQ0kKKwwKKy8qIFRoZSBvcGNvZGUgdGFibGUuCisKKyAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKKworICAgTkFNRQkgICAgIE9QQ09ERQlNQVNLCQlGTEFHUwkJeyBPUEVSQU5EUyB9CisKKyAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgorICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCisgICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgorICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgorICAgRkxBR1MgYXJlIGZsYWdzIGluZGljYXRlZCB3aGF0IHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb24uCisgICBPUEVSQU5EUyBpcyB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KKworICAgVGhlIGRpc2Fzc2VtYmxlciByZWFkcyB0aGUgdGFibGUgaW4gb3JkZXIgYW5kIHByaW50cyB0aGUgZmlyc3QKKyAgIGluc3RydWN0aW9uIHdoaWNoIG1hdGNoZXMsIHNvIHRoaXMgdGFibGUgaXMgc29ydGVkIHRvIHB1dCBtb3JlCisgICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYmVmb3JlIG1vcmUgZ2VuZXJhbCBpbnN0cnVjdGlvbnMuICBJdCBpcyBhbHNvCisgICBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlLiAgKi8KKworY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlIHBvd2VycGNfb3Bjb2Rlc1tdID0geworeyAiYXR0biIsICAgIFgoMCwyNTYpLCBYX01BU0ssCQlQT1dFUjQsCQl7IDAgfSB9LAoreyAidGRsZ3RpIiwgIE9QVE8oMixUT0xHVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGxsdGkiLCAgT1BUTygyLFRPTExUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkZXFpIiwgICBPUFRPKDIsVE9FUSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGxnZWkiLCAgT1BUTygyLFRPTEdFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbG5saSIsICBPUFRPKDIsVE9MTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRsbGVpIiwgIE9QVE8oMixUT0xMRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGxuZ2kiLCAgT1BUTygyLFRPTE5HKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkZ3RpIiwgICBPUFRPKDIsVE9HVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGdlaSIsICAgT1BUTygyLFRPR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRubGkiLCAgIE9QVE8oMixUT05MKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbHRpIiwgICBPUFRPKDIsVE9MVCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGxlaSIsICAgT1BUTygyLFRPTEUpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoreyAidGRuZ2kiLCAgIE9QVE8oMixUT05HKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKK3sgInRkbmVpIiwgICBPUFRPKDIsVE9ORSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZGkiLCAgICAgT1AoMiksCU9QX01BU0ssCVBQQzY0LAkJeyBUTywgUkEsIFNJIH0gfSwKKworeyAidHdsZ3RpIiwgIE9QVE8oMyxUT0xHVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidGxndGkiLCAgIE9QVE8oMyxUT0xHVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdsbHRpIiwgIE9QVE8oMyxUT0xMVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidGxsdGkiLCAgIE9QVE8oMyxUT0xMVCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdlcWkiLCAgIE9QVE8oMyxUT0VRKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0ZXFpIiwgICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bGdlaSIsICBPUFRPKDMsVE9MR0UpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsZ2VpIiwgICBPUFRPKDMsVE9MR0UpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bG5saSIsICBPUFRPKDMsVE9MTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsbmxpIiwgICBPUFRPKDMsVE9MTkwpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bGxlaSIsICBPUFRPKDMsVE9MTEUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsbGVpIiwgICBPUFRPKDMsVE9MTEUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bG5naSIsICBPUFRPKDMsVE9MTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsbmdpIiwgICBPUFRPKDMsVE9MTkcpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3Z3RpIiwgICBPUFRPKDMsVE9HVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidGd0aSIsICAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2dlaSIsICAgT1BUTygzLFRPR0UpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRnZWkiLCAgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHdubGkiLCAgIE9QVE8oMyxUT05MKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bmxpIiwgICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bHRpIiwgICBPUFRPKDMsVE9MVCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidGx0aSIsICAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2xlaSIsICAgT1BUTygzLFRPTEUpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInRsZWkiLCAgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidHduZ2kiLCAgIE9QVE8oMyxUT05HKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0bmdpIiwgICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKK3sgInR3bmVpIiwgICBPUFRPKDMsVE9ORSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoreyAidG5laSIsICAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCit7ICJ0d2kiLCAgICAgT1AoMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgVE8sIFJBLCBTSSB9IH0sCit7ICJ0aSIsICAgICAgT1AoMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgVE8sIFJBLCBTSSB9IH0sCisKK3sgIm1hY2NodyIsCVhPKDQsMTcyLDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNjaHcuIiwJWE8oNCwxNzIsMCwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2Nod28iLAlYTyg0LDE3MiwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3by4iLAlYTyg0LDE3MiwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3cyIsCVhPKDQsMjM2LDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNjaHdzLiIsCVhPKDQsMjM2LDAsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNjaHdzbyIsCVhPKDQsMjM2LDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNjaHdzby4iLAlYTyg0LDIzNiwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3c3UiLAlYTyg0LDIwNCwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3c3UuIiwJWE8oNCwyMDQsMCwxKSwgWE9fTUFTSywgUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2Nod3N1byIsCVhPKDQsMjA0LDEsMCksIFhPX01BU0ssIFBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNjaHdzdW8uIiwJWE8oNCwyMDQsMSwxKSwgWE9fTUFTSywgUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2Nod3UiLAlYTyg0LDE0MCwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3dS4iLAlYTyg0LDE0MCwwLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3dW8iLAlYTyg0LDE0MCwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjY2h3dW8uIiwJWE8oNCwxNDAsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2hodyIsCVhPKDQsNDQsMCwwKSwgIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNoaHcuIiwJWE8oNCw0NCwwLDEpLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2hod28iLAlYTyg0LDQ0LDEsMCksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3by4iLAlYTyg0LDQ0LDEsMSksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3cyIsCVhPKDQsMTA4LDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNoaHdzLiIsCVhPKDQsMTA4LDAsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNoaHdzbyIsCVhPKDQsMTA4LDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNoaHdzby4iLAlYTyg0LDEwOCwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3c3UiLAlYTyg0LDc2LDAsMCksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3c3UuIiwJWE8oNCw3NiwwLDEpLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2hod3N1byIsCVhPKDQsNzYsMSwwKSwgIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNoaHdzdW8uIiwJWE8oNCw3NiwxLDEpLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2hod3UiLAlYTyg0LDEyLDAsMCksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3dS4iLAlYTyg0LDEyLDAsMSksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3dW8iLAlYTyg0LDEyLDEsMCksICBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjaGh3dW8uIiwJWE8oNCwxMiwxLDEpLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2xodyIsCVhPKDQsNDI4LDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNsaHcuIiwJWE8oNCw0MjgsMCwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2xod28iLAlYTyg0LDQyOCwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3by4iLAlYTyg0LDQyOCwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3cyIsCVhPKDQsNDkyLDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNsaHdzLiIsCVhPKDQsNDkyLDAsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNsaHdzbyIsCVhPKDQsNDkyLDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNsaHdzby4iLAlYTyg0LDQ5MiwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3c3UiLAlYTyg0LDQ2MCwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3c3UuIiwJWE8oNCw0NjAsMCwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2xod3N1byIsCVhPKDQsNDYwLDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtYWNsaHdzdW8uIiwJWE8oNCw0NjAsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1hY2xod3UiLAlYTyg0LDM5NiwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3dS4iLAlYTyg0LDM5NiwwLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3dW8iLAlYTyg0LDM5NiwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibWFjbGh3dW8uIiwJWE8oNCwzOTYsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGNodyIsCVhSQyg0LDE2OCwwKSwgIFhfTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGNody4iLAlYUkMoNCwxNjgsMSksICBYX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxjaHd1IiwJWFJDKDQsMTM2LDApLCAgWF9NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsY2h3dS4iLAlYUkMoNCwxMzYsMSksICBYX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxoaHciLAlYUkMoNCw0MCwwKSwgICBYX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxoaHcuIiwJWFJDKDQsNDAsMSksICAgWF9NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsaGh3dSIsCVhSQyg0LDgsMCksICAgIFhfTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGhod3UuIiwJWFJDKDQsOCwxKSwgICAgWF9NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbGh3IiwJWFJDKDQsNDI0LDApLCAgWF9NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbGh3LiIsCVhSQyg0LDQyNCwxKSwgIFhfTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGxod3UiLAlYUkMoNCwzOTIsMCksICBYX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsaHd1LiIsCVhSQyg0LDM5MiwxKSwgIFhfTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNjaHciLAlYTyg0LDE3NCwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2Nody4iLAlYTyg0LDE3NCwwLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2Nod28iLAlYTyg0LDE3NCwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2Nod28uIiwJWE8oNCwxNzQsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNjaHdzIiwJWE8oNCwyMzgsMCwwKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNjaHdzLiIsCVhPKDQsMjM4LDAsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjY2h3c28iLAlYTyg0LDIzOCwxLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2Nod3NvLiIsCVhPKDQsMjM4LDEsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjaGh3IiwJWE8oNCw0NiwwLDApLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNoaHcuIiwJWE8oNCw0NiwwLDEpLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNoaHdvIiwJWE8oNCw0NiwxLDApLCAgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNoaHdvLiIsCVhPKDQsNDYsMSwxKSwgIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjaGh3cyIsCVhPKDQsMTEwLDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjaGh3cy4iLAlYTyg0LDExMCwwLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2hod3NvIiwJWE8oNCwxMTAsMSwwKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNoaHdzby4iLAlYTyg0LDExMCwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2xodyIsCVhPKDQsNDMwLDAsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjbGh3LiIsCVhPKDQsNDMwLDAsMSksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjbGh3byIsCVhPKDQsNDMwLDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjbGh3by4iLAlYTyg0LDQzMCwxLDEpLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2xod3MiLAlYTyg0LDQ5NCwwLDApLCBYT19NQVNLLAlQUEM0MDV8UFBDNDQwLAl7IFJULCBSQSwgUkIgfSB9LAoreyAibm1hY2xod3MuIiwJWE8oNCw0OTQsMCwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm5tYWNsaHdzbyIsCVhPKDQsNDk0LDEsMCksIFhPX01BU0ssCVBQQzQwNXxQUEM0NDAsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJubWFjbGh3c28uIiwJWE8oNCw0OTQsMSwxKSwgWE9fTUFTSywJUFBDNDA1fFBQQzQ0MCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm1mdnNjciIsICBWWCg0LCAxNTQwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCB9IH0sCit7ICJtdHZzY3IiLCAgVlgoNCwgMTYwNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkIgfSB9LAorCisgIC8qIERvdWJsZS1wcmVjaXNpb24gb3Bjb2Rlcy4gICovCisgIC8qIFNvbWUgb2YgdGhlc2UgY29uZmxpY3Qgd2l0aCBBbHRpVmVjLCBzbyBtb3ZlIHRoZW0gYmVmb3JlLCBzaW5jZQorICAgICBQUENWRUMgaW5jbHVkZXMgdGhlIFBQQ19PUENPREVfUFBDIHNldC4gICovCit7ICJlZnNjZmQiLCAgIFZYKDQsIDcxOSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGFicyIsICAgVlgoNCwgNzQwKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEgfSB9LAoreyAiZWZkbmFicyIsICBWWCg0LCA3NDEpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSB9IH0sCit7ICJlZmRuZWciLCAgIFZYKDQsIDc0MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBIH0gfSwKK3sgImVmZGFkZCIsICAgVlgoNCwgNzM2KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZHN1YiIsICAgVlgoNCwgNzM3KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZG11bCIsICAgVlgoNCwgNzQ0KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZGRpdiIsICAgVlgoNCwgNzQ1KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImVmZGNtcGd0IiwgVlgoNCwgNzQ4KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkY21wbHQiLCBWWCg0LCA3NDkpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmRjbXBlcSIsIFZYKDQsIDc1MCksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZHRzdGd0IiwgVlgoNCwgNzY0KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZkdHN0bHQiLCBWWCg0LCA3NjUpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZmR0c3RlcSIsIFZYKDQsIDc2NiksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmZGNmc2kiLCAgVlgoNCwgNzUzKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY2ZzaWQiLCBWWCg0LCA3MzkpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnVpIiwgIFZYKDQsIDc1MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGNmdWlkIiwgVlgoNCwgNzM4KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY2ZzZiIsICBWWCg0LCA3NTUpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnVmIiwgIFZYKDQsIDc1NCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0c2kiLCAgVlgoNCwgNzU3KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3RzaWR6IixWWCg0LCA3NDcpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHNpeiIsIFZYKDQsIDc2MiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0dWkiLCAgVlgoNCwgNzU2KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3R1aWR6IixWWCg0LCA3NDYpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjdHVpeiIsIFZYKDQsIDc2MCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmZGN0c2YiLCAgVlgoNCwgNzU5KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZkY3R1ZiIsICBWWCg0LCA3NTgpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZmRjZnMiLCAgIFZYKDQsIDc1MSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKKyAgLyogRW5kIG9mIGRvdWJsZS1wcmVjaXNpb24gb3Bjb2Rlcy4gICovCisKK3sgInZhZGRjdXciLCBWWCg0LCAgMzg0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZhZGRmcCIsICBWWCg0LCAgIDEwKSwgVlhfTUFTSywgCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2YWRkc2JzIiwgVlgoNCwgIDc2OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2YWRkc2hzIiwgVlgoNCwgIDgzMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2YWRkc3dzIiwgVlgoNCwgIDg5NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2YWRkdWJtIiwgVlgoNCwgICAgMCksIFZYX01BU0ssIAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFkZHVicyIsIFZYKDQsICA1MTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFkZHVobSIsIFZYKDQsICAgNjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFkZHVocyIsIFZYKDQsICA1NzYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFkZHV3bSIsIFZYKDQsICAxMjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFkZHV3cyIsIFZYKDQsICA2NDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFuZCIsICAgIFZYKDQsIDEwMjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmFuZGMiLCAgIFZYKDQsIDEwOTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3NiIiwgIFZYKDQsIDEyODIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3NoIiwgIFZYKDQsIDEzNDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3N3IiwgIFZYKDQsIDE0MTApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3ViIiwgIFZYKDQsIDEwMjYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3VoIiwgIFZYKDQsIDEwOTApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmF2Z3V3IiwgIFZYKDQsIDExNTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNmc3giLCAgIFZYKDQsICA4NDIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiwgVUlNTSB9IH0sCit7ICJ2Y2Z1eCIsICAgVlgoNCwgIDc3OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKK3sgInZjbXBiZnAiLCAgIFZYUig0LCA5NjYsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGJmcC4iLCAgVlhSKDQsIDk2NiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZXFmcCIsICBWWFIoNCwgMTk4LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBlcWZwLiIsIFZYUig0LCAxOTgsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGVxdWIiLCAgVlhSKDQsICAgNiwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZXF1Yi4iLCBWWFIoNCwgICA2LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBlcXVoIiwgIFZYUig0LCAgNzAsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGVxdWguIiwgVlhSKDQsICA3MCwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZXF1dyIsICBWWFIoNCwgMTM0LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBlcXV3LiIsIFZYUig0LCAxMzQsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGdlZnAiLCAgVlhSKDQsIDQ1NCwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZ2VmcC4iLCBWWFIoNCwgNDU0LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBndGZwIiwgIFZYUig0LCA3MTAsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGd0ZnAuIiwgVlhSKDQsIDcxMCwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZ3RzYiIsICBWWFIoNCwgNzc0LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBndHNiLiIsIFZYUig0LCA3NzQsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGd0c2giLCAgVlhSKDQsIDgzOCwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZ3RzaC4iLCBWWFIoNCwgODM4LCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBndHN3IiwgIFZYUig0LCA5MDIsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGd0c3cuIiwgVlhSKDQsIDkwMiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZ3R1YiIsICBWWFIoNCwgNTE4LCAwKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBndHViLiIsIFZYUig0LCA1MTgsIDEpLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGd0dWgiLCAgVlhSKDQsIDU4MiwgMCksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y21wZ3R1aC4iLCBWWFIoNCwgNTgyLCAxKSwgVlhSX01BU0ssIFBQQ1ZFQywJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZjbXBndHV3IiwgIFZYUig0LCA2NDYsIDApLCBWWFJfTUFTSywgUFBDVkVDLAl7IFZELCBWQSwgVkIgfSB9LAoreyAidmNtcGd0dXcuIiwgVlhSKDQsIDY0NiwgMSksIFZYUl9NQVNLLCBQUENWRUMsCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2Y3RzeHMiLCAgICBWWCg0LCAgOTcwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIsIFVJTU0gfSB9LAoreyAidmN0dXhzIiwgICAgVlgoNCwgIDkwNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKK3sgInZleHB0ZWZwIiwgIFZYKDQsICAzOTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCit7ICJ2bG9nZWZwIiwgICBWWCg0LCAgNDU4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoreyAidm1hZGRmcCIsICAgVlhBKDQsICA0NiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkMsIFZCIH0gfSwKK3sgInZtYXhmcCIsICAgIFZYKDQsIDEwMzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1heHNiIiwgICAgVlgoNCwgIDI1OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bWF4c2giLCAgICBWWCg0LCAgMzIyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtYXhzdyIsICAgIFZYKDQsICAzODYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1heHViIiwgICAgVlgoNCwgICAgMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bWF4dWgiLCAgICBWWCg0LCAgIDY2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtYXh1dyIsICAgIFZYKDQsICAxMzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1oYWRkc2hzIiwgVlhBKDQsICAzMiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKK3sgInZtaHJhZGRzaHMiLCBWWEEoNCwgMzMpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bWluZnAiLCAgICBWWCg0LCAxMDk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtaW5zYiIsICAgIFZYKDQsICA3NzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1pbnNoIiwgICAgVlgoNCwgIDgzNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bWluc3ciLCAgICBWWCg0LCAgODk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtaW51YiIsICAgIFZYKDQsICA1MTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1pbnVoIiwgICAgVlgoNCwgIDU3OCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bWludXciLCAgICBWWCg0LCAgNjQyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtbGFkZHVobSIsIFZYQSg0LCAgMzQpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bXJnaGIiLCAgICBWWCg0LCAgIDEyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtcmdoaCIsICAgIFZYKDQsICAgNzYpLCBWWF9NQVNLLCAgICBQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1yZ2h3IiwgICAgVlgoNCwgIDE0MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bXJnbGIiLCAgICBWWCg0LCAgMjY4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtcmdsaCIsICAgIFZYKDQsICAzMzIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm1yZ2x3IiwgICAgVlgoNCwgIDM5NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bXN1bW1ibSIsICBWWEEoNCwgIDM3KSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgVkMgfSB9LAoreyAidm1zdW1zaG0iLCAgVlhBKDQsICA0MCksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKK3sgInZtc3Vtc2hzIiwgIFZYQSg0LCAgNDEpLCBWWEFfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bXN1bXVibSIsICBWWEEoNCwgIDM2KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bXN1bXVobSIsICBWWEEoNCwgIDM4KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bXN1bXVocyIsICBWWEEoNCwgIDM5KSwgVlhBX01BU0ssICAgUFBDVkVDLAkJeyBWRCwgVkEsIFZCLCBWQyB9IH0sCit7ICJ2bXVsZXNiIiwgICBWWCg0LCAgNzc2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtdWxlc2giLCAgIFZYKDQsICA4NDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm11bGV1YiIsICAgVlgoNCwgIDUyMCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bXVsZXVoIiwgICBWWCg0LCAgNTg0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtdWxvc2IiLCAgIFZYKDQsICAyNjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm11bG9zaCIsICAgVlgoNCwgIDMyOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2bXVsb3ViIiwgICBWWCg0LCAgICA4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZtdWxvdWgiLCAgIFZYKDQsICAgNzIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm5tc3ViZnAiLCAgVlhBKDQsICA0NyksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkMsIFZCIH0gfSwKK3sgInZub3IiLCAgICAgIFZYKDQsIDEyODQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidm9yIiwgICAgICAgVlgoNCwgMTE1NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2cGVybSIsICAgICBWWEEoNCwgIDQzKSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgVkMgfSB9LAoreyAidnBrcHgiLCAgICAgVlgoNCwgIDc4MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2cGtzaHNzIiwgICBWWCg0LCAgMzk4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZwa3NodXMiLCAgIFZYKDQsICAyNzApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnBrc3dzcyIsICAgVlgoNCwgIDQ2MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2cGtzd3VzIiwgICBWWCg0LCAgMzM0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZwa3VodW0iLCAgIFZYKDQsICAgMTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnBrdWh1cyIsICAgVlgoNCwgIDE0MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2cGt1d3VtIiwgICBWWCg0LCAgIDc4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZwa3V3dXMiLCAgIFZYKDQsICAyMDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnJlZnAiLCAgICAgVlgoNCwgIDI2NiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKK3sgInZyZmltIiwgICAgIFZYKDQsICA3MTQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCit7ICJ2cmZpbiIsICAgICBWWCg0LCAgNTIyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoreyAidnJmaXAiLCAgICAgVlgoNCwgIDY1MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKK3sgInZyZml6IiwgICAgIFZYKDQsICA1ODYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCit7ICJ2cmxiIiwgICAgICBWWCg0LCAgICA0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZybGgiLCAgICAgIFZYKDQsICAgNjgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnJsdyIsICAgICAgVlgoNCwgIDEzMiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2cnNxcnRlZnAiLCBWWCg0LCAgMzMwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoreyAidnNlbCIsICAgICAgVlhBKDQsICA0MiksIFZYQV9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIsIFZDIH0gfSwKK3sgInZzbCIsICAgICAgIFZYKDQsICA0NTIpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnNsYiIsICAgICAgVlgoNCwgIDI2MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c2xkb2kiLCAgICBWWEEoNCwgIDQ0KSwgVlhBX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiwgU0hCIH0gfSwKK3sgInZzbGgiLCAgICAgIFZYKDQsICAzMjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnNsbyIsICAgICAgVlgoNCwgMTAzNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c2x3IiwgICAgICBWWCg0LCAgMzg4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzcGx0YiIsICAgIFZYKDQsICA1MjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiwgVUlNTSB9IH0sCit7ICJ2c3BsdGgiLCAgICBWWCg0LCAgNTg4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIsIFVJTU0gfSB9LAoreyAidnNwbHRpc2IiLCAgVlgoNCwgIDc4MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoreyAidnNwbHRpc2giLCAgVlgoNCwgIDg0NCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoreyAidnNwbHRpc3ciLCAgVlgoNCwgIDkwOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFNJTU0gfSB9LAoreyAidnNwbHR3IiwgICAgVlgoNCwgIDY1MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCLCBVSU1NIH0gfSwKK3sgInZzciIsICAgICAgIFZYKDQsICA3MDgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnNyYWIiLCAgICAgVlgoNCwgIDc3MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3JhaCIsICAgICBWWCg0LCAgODM2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzcmF3IiwgICAgIFZYKDQsICA5MDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnNyYiIsICAgICAgVlgoNCwgIDUxNiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3JoIiwgICAgICBWWCg0LCAgNTgwKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzcm8iLCAgICAgIFZYKDQsIDExMDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnNydyIsICAgICAgVlgoNCwgIDY0NCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3ViY3V3IiwgICBWWCg0LCAxNDA4KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzdWJmcCIsICAgIFZYKDQsICAgNzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnN1YnNicyIsICAgVlgoNCwgMTc5MiksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3Vic2hzIiwgICBWWCg0LCAxODU2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzdWJzd3MiLCAgIFZYKDQsIDE5MjApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnN1YnVibSIsICAgVlgoNCwgMTAyNCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3VidWJzIiwgICBWWCg0LCAxNTM2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzdWJ1aG0iLCAgIFZYKDQsIDEwODgpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnN1YnVocyIsICAgVlgoNCwgMTYwMCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3VidXdtIiwgICBWWCg0LCAxMTUyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzdWJ1d3MiLCAgIFZYKDQsIDE2NjQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnN1bXN3cyIsICAgVlgoNCwgMTkyOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3VtMnN3cyIsICBWWCg0LCAxNjcyKSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZzdW00c2JzIiwgIFZYKDQsIDE4MDApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAoreyAidnN1bTRzaHMiLCAgVlgoNCwgMTYwOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZBLCBWQiB9IH0sCit7ICJ2c3VtNHVicyIsICBWWCg0LCAxNTQ0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkEsIFZCIH0gfSwKK3sgInZ1cGtocHgiLCAgIFZYKDQsICA4NDYpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCit7ICJ2dXBraHNiIiwgICBWWCg0LCAgNTI2KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoreyAidnVwa2hzaCIsICAgVlgoNCwgIDU5MCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKK3sgInZ1cGtscHgiLCAgIFZYKDQsICA5NzQpLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQiB9IH0sCit7ICJ2dXBrbHNiIiwgICBWWCg0LCAgNjU0KSwgVlhfTUFTSywJUFBDVkVDLAkJeyBWRCwgVkIgfSB9LAoreyAidnVwa2xzaCIsICAgVlgoNCwgIDcxOCksIFZYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFZCIH0gfSwKK3sgInZ4b3IiLCAgICAgIFZYKDQsIDEyMjApLCBWWF9NQVNLLAlQUENWRUMsCQl7IFZELCBWQSwgVkIgfSB9LAorCit7ICJldmFkZHciLCAgICBWWCg0LCA1MTIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZhZGRpdyIsICAgVlgoNCwgNTE0KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIsIFVJTU0gfSB9LAoreyAiZXZzdWJmdyIsICAgVlgoNCwgNTE2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2c3VidyIsICAgIFZYKDQsIDUxNiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJCLCBSQSB9IH0sCit7ICJldnN1YmlmdyIsICBWWCg0LCA1MTgpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBVSU1NLCBSQiB9IH0sCit7ICJldnN1Yml3IiwgICBWWCg0LCA1MTgpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQiwgVUlNTSB9IH0sCit7ICJldmFicyIsICAgICBWWCg0LCA1MjApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldm5lZyIsICAgICBWWCg0LCA1MjEpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmV4dHNiIiwgICBWWCg0LCA1MjIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmV4dHNoIiwgICBWWCg0LCA1MjMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldnJuZHciLCAgICBWWCg0LCA1MjQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmNudGx6dyIsICBWWCg0LCA1MjUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmNudGxzdyIsICBWWCg0LCA1MjYpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCisKK3sgImJyaW5jIiwgICAgIFZYKDQsIDUyNyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2YW5kIiwgICAgIFZYKDQsIDUyOSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldmFuZGMiLCAgICBWWCg0LCA1MzApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtciIsICAgICAgVlgoNCwgNTM1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIEJCQSB9IH0sCit7ICJldm9yIiwgICAgICBWWCg0LCA1MzUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZvcmMiLCAgICAgVlgoNCwgNTM5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2eG9yIiwgICAgIFZYKDQsIDUzNCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldmVxdiIsICAgICBWWCg0LCA1MzcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZuYW5kIiwgICAgVlgoNCwgNTQyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bm90IiwgICAgIFZYKDQsIDUzNiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBCQkEgfSB9LAoreyAiZXZub3IiLCAgICAgVlgoNCwgNTM2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZybHciLCAgICAgVlgoNCwgNTUyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2cmx3aSIsICAgIFZYKDQsIDU1NCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBFVlVJTU0gfSB9LAoreyAiZXZzbHciLCAgICAgVlgoNCwgNTQ4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2c2x3aSIsICAgIFZYKDQsIDU1MCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBFVlVJTU0gfSB9LAoreyAiZXZzcndzIiwgICAgVlgoNCwgNTQ1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2c3J3dSIsICAgIFZYKDQsIDU0NCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldnNyd2lzIiwgICBWWCg0LCA1NDcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgRVZVSU1NIH0gfSwKK3sgImV2c3J3aXUiLCAgIFZYKDQsIDU0NiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBFVlVJTU0gfSB9LAoreyAiZXZzcGxhdGkiLCAgVlgoNCwgNTUzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgU0lNTSB9IH0sCit7ICJldnNwbGF0ZmkiLCBWWCg0LCA1NTUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBTSU1NIH0gfSwKK3sgImV2bWVyZ2VoaSIsIFZYKDQsIDU1NiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1lcmdlbG8iLCBWWCg0LCA1NTcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtZXJnZWhpbG8iLFZYKDQsNTU4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWVyZ2Vsb2hpIixWWCg0LDU1OSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2Y21wZ3RzIiwgIFZYKDQsIDU2MSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImV2Y21wZ3R1IiwgIFZYKDQsIDU2MCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImV2Y21wbHRzIiwgIFZYKDQsIDU2MyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImV2Y21wbHR1IiwgIFZYKDQsIDU2MiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImV2Y21wZXEiLCAgIFZYKDQsIDU2NCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImV2c2VsIiwgICAgIEVWU0VMKDQsNzkpLEVWU0VMX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiwgQ1JGUyB9IH0sCisKK3sgImV2bGRkIiwgICAgIFZYKDQsIDc2OSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV84LCBSQSB9IH0sCit7ICJldmxkZHgiLCAgICBWWCg0LCA3NjgpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZsZHciLCAgICAgVlgoNCwgNzcxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgRVZVSU1NXzgsIFJBIH0gfSwKK3sgImV2bGR3eCIsICAgIFZYKDQsIDc3MCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldmxkaCIsICAgICBWWCg0LCA3NzMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fOCwgUkEgfSB9LAoreyAiZXZsZGh4IiwgICAgVlgoNCwgNzcyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bHdoZSIsICAgIFZYKDQsIDc4NSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV80LCBSQSB9IH0sCit7ICJldmx3aGV4IiwgICBWWCg0LCA3ODQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZsd2hvdSIsICAgVlgoNCwgNzg5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgRVZVSU1NXzQsIFJBIH0gfSwKK3sgImV2bHdob3V4IiwgIFZYKDQsIDc4OCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldmx3aG9zIiwgICBWWCg0LCA3OTEpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fNCwgUkEgfSB9LAoreyAiZXZsd2hvc3giLCAgVlgoNCwgNzkwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bHd3c3BsYXQiLFZYKDQsIDc5MyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV80LCBSQSB9IH0sCit7ICJldmx3d3NwbGF0eCIsVlgoNCwgNzkyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bHdoc3BsYXQiLFZYKDQsIDc5NyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV80LCBSQSB9IH0sCit7ICJldmx3aHNwbGF0eCIsVlgoNCwgNzk2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bGhoZXNwbGF0IixWWCg0LCA3NzcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fMiwgUkEgfSB9LAoreyAiZXZsaGhlc3BsYXR4IixWWCg0LCA3NzYpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZsaGhvdXNwbGF0IixWWCg0LCA3ODEpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fMiwgUkEgfSB9LAoreyAiZXZsaGhvdXNwbGF0eCIsVlgoNCwgNzgwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bGhob3NzcGxhdCIsVlgoNCwgNzgzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgRVZVSU1NXzIsIFJBIH0gfSwKK3sgImV2bGhob3NzcGxhdHgiLFZYKDQsIDc4MiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2c3RkZCIsICAgIFZYKDQsIDgwMSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV84LCBSQSB9IH0sCit7ICJldnN0ZGR4IiwgICBWWCg0LCA4MDApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZzdGR3IiwgICAgVlgoNCwgODAzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgRVZVSU1NXzgsIFJBIH0gfSwKK3sgImV2c3Rkd3giLCAgIFZYKDQsIDgwMiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldnN0ZGgiLCAgICBWWCg0LCA4MDUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fOCwgUkEgfSB9LAoreyAiZXZzdGRoeCIsICAgVlgoNCwgODA0KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2c3R3d2UiLCAgIFZYKDQsIDgyNSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV80LCBSQSB9IH0sCit7ICJldnN0d3dleCIsICBWWCg0LCA4MjQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZzdHd3byIsICAgVlgoNCwgODI5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgRVZVSU1NXzQsIFJBIH0gfSwKK3sgImV2c3R3d294IiwgIFZYKDQsIDgyOCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldnN0d2hlIiwgICBWWCg0LCA4MTcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBFVlVJTU1fNCwgUkEgfSB9LAoreyAiZXZzdHdoZXgiLCAgVlgoNCwgODE2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2c3R3aG8iLCAgIFZYKDQsIDgyMSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIEVWVUlNTV80LCBSQSB9IH0sCit7ICJldnN0d2hveCIsICBWWCg0LCA4MjApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJldmZzYWJzIiwgICBWWCg0LCA2NDQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmZzbmFicyIsICBWWCg0LCA2NDUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmZzbmVnIiwgICBWWCg0LCA2NDYpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmZzYWRkIiwgICBWWCg0LCA2NDApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZmc3N1YiIsICAgVlgoNCwgNjQxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2ZnNtdWwiLCAgIFZYKDQsIDY0OCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldmZzZGl2IiwgICBWWCg0LCA2NDkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZmc2NtcGd0IiwgVlgoNCwgNjUyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc2NtcGx0IiwgVlgoNCwgNjUzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc2NtcGVxIiwgVlgoNCwgNjU0KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc3RzdGd0IiwgVlgoNCwgNjY4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc3RzdGx0IiwgVlgoNCwgNjY5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc3RzdGVxIiwgVlgoNCwgNjcwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZXZmc2NmdWkiLCAgVlgoNCwgNjU2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0dWl6IiwgVlgoNCwgNjY0KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2Nmc2kiLCAgVlgoNCwgNjU3KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2NmdWYiLCAgVlgoNCwgNjU4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2Nmc2YiLCAgVlgoNCwgNjU5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0dWkiLCAgVlgoNCwgNjYwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0c2kiLCAgVlgoNCwgNjYxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0c2l6IiwgVlgoNCwgNjY2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0dWYiLCAgVlgoNCwgNjYyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAoreyAiZXZmc2N0c2YiLCAgVlgoNCwgNjYzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkIgfSB9LAorCit7ICJlZnNhYnMiLCAgIFZYKDQsIDcwOCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBIH0gfSwKK3sgImVmc25hYnMiLCAgVlgoNCwgNzA5KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkEgfSB9LAoreyAiZWZzbmVnIiwgICBWWCg0LCA3MTApLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQSB9IH0sCit7ICJlZnNhZGQiLCAgIFZYKDQsIDcwNCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJlZnNzdWIiLCAgIFZYKDQsIDcwNSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJlZnNtdWwiLCAgIFZYKDQsIDcxMiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJlZnNkaXYiLCAgIFZYKDQsIDcxMyksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJlZnNjbXBndCIsIFZYKDQsIDcxNiksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmc2NtcGx0IiwgVlgoNCwgNzE3KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZzY21wZXEiLCBWWCg0LCA3MTgpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZnN0c3RndCIsIFZYKDQsIDczMiksIFZYX01BU0ssCVBQQ0VGUywJCXsgQ1JGRCwgUkEsIFJCIH0gfSwKK3sgImVmc3RzdGx0IiwgVlgoNCwgNzMzKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBDUkZELCBSQSwgUkIgfSB9LAoreyAiZWZzdHN0ZXEiLCBWWCg0LCA3MzQpLCBWWF9NQVNLLAlQUENFRlMsCQl7IENSRkQsIFJBLCBSQiB9IH0sCit7ICJlZnNjZnVpIiwgIFZYKDQsIDcyMCksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmc2N0dWl6IiwgVlgoNCwgNzI4KSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZzY2ZzaSIsICBWWCg0LCA3MjEpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZnNjZnVmIiwgIFZYKDQsIDcyMiksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmc2Nmc2YiLCAgVlgoNCwgNzIzKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZzY3R1aSIsICBWWCg0LCA3MjQpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZnNjdHNpIiwgIFZYKDQsIDcyNSksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKK3sgImVmc2N0c2l6IiwgVlgoNCwgNzMwKSwgVlhfTUFTSywJUFBDRUZTLAkJeyBSUywgUkIgfSB9LAoreyAiZWZzY3R1ZiIsICBWWCg0LCA3MjYpLCBWWF9NQVNLLAlQUENFRlMsCQl7IFJTLCBSQiB9IH0sCit7ICJlZnNjdHNmIiwgIFZYKDQsIDcyNyksIFZYX01BU0ssCVBQQ0VGUywJCXsgUlMsIFJCIH0gfSwKKworeyAiZXZtaG9zc2YiLCAgVlgoNCwgMTAzMSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1ob3NzZmEiLCBWWCg0LCAxMDYzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvc21mIiwgIFZYKDQsIDEwMzkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG9zbWZhIiwgVlgoNCwgMTA3MSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1ob3NtaSIsICBWWCg0LCAxMDM3KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvc21pYSIsIFZYKDQsIDEwNjkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG91bWkiLCAgVlgoNCwgMTAzNiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1ob3VtaWEiLCBWWCg0LCAxMDY4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc3NmIiwgIFZYKDQsIDEwMjcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzc2ZhIiwgVlgoNCwgMTA1OSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1oZXNtZiIsICBWWCg0LCAxMDM1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc21mYSIsIFZYKDQsIDEwNjcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzbWkiLCAgVlgoNCwgMTAzMyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1oZXNtaWEiLCBWWCg0LCAxMDY1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhldW1pIiwgIFZYKDQsIDEwMzIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGV1bWlhIiwgVlgoNCwgMTA2NCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2bWhvc3NmYWF3IixWWCg0LCAxMjg3KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvc3NpYWF3IixWWCg0LCAxMjg1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvc21mYWF3IixWWCg0LCAxMjk1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvc21pYWF3IixWWCg0LCAxMjkzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvdXNpYWF3IixWWCg0LCAxMjg0KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvdW1pYWF3IixWWCg0LCAxMjkyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc3NmYWF3IixWWCg0LCAxMjgzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc3NpYWF3IixWWCg0LCAxMjgxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc21mYWF3IixWWCg0LCAxMjkxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlc21pYWF3IixWWCg0LCAxMjg5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhldXNpYWF3IixWWCg0LCAxMjgwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhldW1pYWF3IixWWCg0LCAxMjg4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZtaG9zc2ZhbnciLFZYKDQsIDE0MTUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG9zc2lhbnciLFZYKDQsIDE0MTMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG9zbWZhbnciLFZYKDQsIDE0MjMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG9zbWlhbnciLFZYKDQsIDE0MjEpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG91c2lhbnciLFZYKDQsIDE0MTIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaG91bWlhbnciLFZYKDQsIDE0MjApLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzc2ZhbnciLFZYKDQsIDE0MTEpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzc2lhbnciLFZYKDQsIDE0MDkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzbWZhbnciLFZYKDQsIDE0MTkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGVzbWlhbnciLFZYKDQsIDE0MTcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGV1c2lhbnciLFZYKDQsIDE0MDgpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtaGV1bWlhbnciLFZYKDQsIDE0MTYpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJldm1ob2dzbWZhYSIsVlgoNCwgMTMyNyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1ob2dzbWlhYSIsVlgoNCwgMTMyNSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1ob2d1bWlhYSIsVlgoNCwgMTMyNCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1oZWdzbWZhYSIsVlgoNCwgMTMyMyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1oZWdzbWlhYSIsVlgoNCwgMTMyMSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm1oZWd1bWlhYSIsVlgoNCwgMTMyMCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2bWhvZ3NtZmFuIixWWCg0LCAxNDU1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvZ3NtaWFuIixWWCg0LCAxNDUzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhvZ3VtaWFuIixWWCg0LCAxNDUyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlZ3NtZmFuIixWWCg0LCAxNDUxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlZ3NtaWFuIixWWCg0LCAxNDQ5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bWhlZ3VtaWFuIixWWCg0LCAxNDQ4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZtd2hzc2YiLCAgVlgoNCwgMTA5NSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13aHNzZmEiLCBWWCg0LCAxMTI3KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXdoc21mIiwgIFZYKDQsIDExMDMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd2hzbWZhIiwgVlgoNCwgMTEzNSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13aHNtaSIsICBWWCg0LCAxMTAxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXdoc21pYSIsIFZYKDQsIDExMzMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd2h1bWkiLCAgVlgoNCwgMTEwMCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13aHVtaWEiLCBWWCg0LCAxMTMyKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZtd2x1bWkiLCAgVlgoNCwgMTA5NiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13bHVtaWEiLCBWWCg0LCAxMTI4KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZtd2xzc2lhYXciLFZYKDQsIDEzNDUpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd2xzbWlhYXciLFZYKDQsIDEzNTMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd2x1c2lhYXciLFZYKDQsIDEzNDQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd2x1bWlhYXciLFZYKDQsIDEzNTIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJldm13bHNzaWFudyIsVlgoNCwgMTQ3MyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13bHNtaWFudyIsVlgoNCwgMTQ4MSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13bHVzaWFudyIsVlgoNCwgMTQ3MiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13bHVtaWFudyIsVlgoNCwgMTQ4MCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2bXdzc2YiLCAgIFZYKDQsIDExMDcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd3NzZmEiLCAgVlgoNCwgMTEzOSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13c21mIiwgICBWWCg0LCAxMTE1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXdzbWZhIiwgIFZYKDQsIDExNDcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd3NtaSIsICAgVlgoNCwgMTExMyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13c21pYSIsICBWWCg0LCAxMTQ1KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXd1bWkiLCAgIFZYKDQsIDExMTIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd3VtaWEiLCAgVlgoNCwgMTE0NCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCisKK3sgImV2bXdzc2ZhYSIsIFZYKDQsIDEzNjMpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd3NtZmFhIiwgVlgoNCwgMTM3MSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13c21pYWEiLCBWWCg0LCAxMzY5KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXd1bWlhYSIsIFZYKDQsIDEzNjgpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAorCit7ICJldm13c3NmYW4iLCBWWCg0LCAxNDkxKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKK3sgImV2bXdzbWZhbiIsIFZYKDQsIDE0OTkpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZtd3NtaWFuIiwgVlgoNCwgMTQ5NyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBLCBSQiB9IH0sCit7ICJldm13dW1pYW4iLCBWWCg0LCAxNDk2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAiZXZhZGRzc2lhYXciLFZYKDQsIDEyMTcpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCit7ICJldmFkZHNtaWFhdyIsVlgoNCwgMTIyNSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBIH0gfSwKK3sgImV2YWRkdXNpYWF3IixWWCg0LCAxMjE2KSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEgfSB9LAoreyAiZXZhZGR1bWlhYXciLFZYKDQsIDEyMjQpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSB9IH0sCisKK3sgImV2c3ViZnNzaWFhdyIsVlgoNCwgMTIxOSksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBIH0gfSwKK3sgImV2c3ViZnNtaWFhdyIsVlgoNCwgMTIyNyksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBIH0gfSwKK3sgImV2c3ViZnVzaWFhdyIsVlgoNCwgMTIxOCksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBIH0gfSwKK3sgImV2c3ViZnVtaWFhdyIsVlgoNCwgMTIyNiksIFZYX01BU0ssCVBQQ1NQRSwJCXsgUlMsIFJBIH0gfSwKKworeyAiZXZtcmEiLCAgICBWWCg0LCAxMjIwKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEgfSB9LAorCit7ICJldmRpdndzIiwgIFZYKDQsIDEyMjIpLCBWWF9NQVNLLAlQUENTUEUsCQl7IFJTLCBSQSwgUkIgfSB9LAoreyAiZXZkaXZ3dSIsICBWWCg0LCAxMjIzKSwgVlhfTUFTSywJUFBDU1BFLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAibXVsbGkiLCAgIE9QKDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoreyAibXVsaSIsICAgIE9QKDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAorCit7ICJzdWJmaWMiLCAgT1AoOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCit7ICJzZmkiLCAgICAgT1AoOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCisKK3sgImRvemkiLCAgICBPUCg5KSwJT1BfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBTSSB9IH0sCisKK3sgImJjZSIsICAgICBCKDksMCwwKSwJQl9NQVNLLAkJQk9PS0U2NCwJeyBCTywgQkksIEJEIH0gfSwKK3sgImJjZWwiLCAgICBCKDksMCwxKSwJQl9NQVNLLAkJQk9PS0U2NCwJeyBCTywgQkksIEJEIH0gfSwKK3sgImJjZWEiLCAgICBCKDksMSwwKSwJQl9NQVNLLAkJQk9PS0U2NCwJeyBCTywgQkksIEJEQSB9IH0sCit7ICJiY2VsYSIsICAgQig5LDEsMSksCUJfTUFTSywJCUJPT0tFNjQsCXsgQk8sIEJJLCBCREEgfSB9LAorCit7ICJjbXBsd2kiLCAgT1BMKDEwLDApLAlPUExfTUFTSywJUFBDQ09NLAkJeyBPQkYsIFJBLCBVSSB9IH0sCit7ICJjbXBsZGkiLCAgT1BMKDEwLDEpLCBPUExfTUFTSywJUFBDNjQsCQl7IE9CRiwgUkEsIFVJIH0gfSwKK3sgImNtcGxpIiwgICBPUCgxMCksCU9QX01BU0ssCVBQQywJCXsgQkYsIEwsIFJBLCBVSSB9IH0sCit7ICJjbXBsaSIsICAgT1AoMTApLAlPUF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgVUkgfSB9LAorCit7ICJjbXB3aSIsICAgT1BMKDExLDApLAlPUExfTUFTSywJUFBDQ09NLAkJeyBPQkYsIFJBLCBTSSB9IH0sCit7ICJjbXBkaSIsICAgT1BMKDExLDEpLAlPUExfTUFTSywJUFBDNjQsCQl7IE9CRiwgUkEsIFNJIH0gfSwKK3sgImNtcGkiLCAgICBPUCgxMSksCU9QX01BU0ssCVBQQywJCXsgQkYsIEwsIFJBLCBTSSB9IH0sCit7ICJjbXBpIiwgICAgT1AoMTEpLAlPUF9NQVNLLAlQV1JDT00sCQl7IEJGLCBSQSwgU0kgfSB9LAorCit7ICJhZGRpYyIsICAgT1AoMTIpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoreyAiYWkiLAkgICAgIE9QKDEyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKK3sgInN1YmljIiwgICBPUCgxMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAorCit7ICJhZGRpYy4iLCAgT1AoMTMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoreyAiYWkuIiwgICAgIE9QKDEzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKK3sgInN1YmljLiIsICBPUCgxMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAorCit7ICJsaSIsCSAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0kgfSB9LAoreyAibGlsIiwgICAgIE9QKDE0KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJIH0gfSwKK3sgImFkZGkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBMCwgU0kgfSB9LAoreyAiY2FsIiwgICAgIE9QKDE0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKK3sgInN1YmkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBMCwgTlNJIH0gfSwKK3sgImxhIiwJICAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCisKK3sgImxpcyIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoreyAibGl1IiwgICAgIE9QKDE1KSwJRFJBX01BU0ssCVBXUkNPTSwJCXsgUlQsIFNJU0lHTk9QVCB9IH0sCit7ICJhZGRpcyIsICAgT1AoMTUpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULFJBMCxTSVNJR05PUFQgfSB9LAoreyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQTAsU0lTSUdOT1BUIH0gfSwKK3sgInN1YmlzIiwgICBPUCgxNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBMCwgTlNJIH0gfSwKKworeyAiYmRuei0iLCAgIEJCTygxNixCT0ROWiwwLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJETSB9IH0sCit7ICJiZG56KyIsICAgQkJPKDE2LEJPRE5aLDAsMCksICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRQIH0gfSwKK3sgImJkbnoiLCAgICBCQk8oMTYsQk9ETlosMCwwKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCit7ICJiZG4iLCAgICAgQkJPKDE2LEJPRE5aLDAsMCksICAgICAgQkJPQVRCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoreyAiYmRuemwtIiwgIEJCTygxNixCT0ROWiwwLDEpLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJETSB9IH0sCit7ICJiZG56bCsiLCAgQkJPKDE2LEJPRE5aLDAsMSksICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRQIH0gfSwKK3sgImJkbnpsIiwgICBCQk8oMTYsQk9ETlosMCwxKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRCB9IH0sCit7ICJiZG5sIiwgICAgQkJPKDE2LEJPRE5aLDAsMSksICAgICAgQkJPQVRCSV9NQVNLLCBQV1JDT00sCXsgQkQgfSB9LAoreyAiYmRuemEtIiwgIEJCTygxNixCT0ROWiwxLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJETUEgfSB9LAoreyAiYmRuemErIiwgIEJCTygxNixCT0ROWiwxLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJEUEEgfSB9LAoreyAiYmRuemEiLCAgIEJCTygxNixCT0ROWiwxLDApLCAgICAgIEJCT0FUQklfTUFTSywgUFBDQ09NLAl7IEJEQSB9IH0sCit7ICJiZG5hIiwgICAgQkJPKDE2LEJPRE5aLDEsMCksICAgICAgQkJPQVRCSV9NQVNLLCBQV1JDT00sCXsgQkRBIH0gfSwKK3sgImJkbnpsYS0iLCBCQk8oMTYsQk9ETlosMSwxKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRE1BIH0gfSwKK3sgImJkbnpsYSsiLCBCQk8oMTYsQk9ETlosMSwxKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRFBBIH0gfSwKK3sgImJkbnpsYSIsICBCQk8oMTYsQk9ETlosMSwxKSwgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoreyAiYmRubGEiLCAgIEJCTygxNixCT0ROWiwxLDEpLCAgICAgIEJCT0FUQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCit7ICJiZHotIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRNIH0gfSwKK3sgImJkeisiLCAgICBCQk8oMTYsQk9EWiwwLDApLCAgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRFAgfSB9LAoreyAiYmR6IiwgICAgIEJCTygxNixCT0RaLDAsMCksICAgICAgIEJCT0FUQklfTUFTSywgQ09NLAkJeyBCRCB9IH0sCit7ICJiZHpsLSIsICAgQkJPKDE2LEJPRFosMCwxKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRNIH0gfSwKK3sgImJkemwrIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgICAgICBCQk9BVEJJX01BU0ssIFBQQ0NPTSwJeyBCRFAgfSB9LAoreyAiYmR6bCIsICAgIEJCTygxNixCT0RaLDAsMSksICAgICAgIEJCT0FUQklfTUFTSywgQ09NLAkJeyBCRCB9IH0sCit7ICJiZHphLSIsICAgQkJPKDE2LEJPRFosMSwwKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRNQSB9IH0sCit7ICJiZHphKyIsICAgQkJPKDE2LEJPRFosMSwwKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRQQSB9IH0sCit7ICJiZHphIiwgICAgQkJPKDE2LEJPRFosMSwwKSwgICAgICAgQkJPQVRCSV9NQVNLLCBDT00sCQl7IEJEQSB9IH0sCit7ICJiZHpsYS0iLCAgQkJPKDE2LEJPRFosMSwxKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRNQSB9IH0sCit7ICJiZHpsYSsiLCAgQkJPKDE2LEJPRFosMSwxKSwgICAgICAgQkJPQVRCSV9NQVNLLCBQUENDT00sCXsgQkRQQSB9IH0sCit7ICJiZHpsYSIsICAgQkJPKDE2LEJPRFosMSwxKSwgICAgICAgQkJPQVRCSV9NQVNLLCBDT00sCQl7IEJEQSB9IH0sCit7ICJibHQtIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJibHQrIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJibHQiLCAgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJibHRsLSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJibHRsKyIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJibHRsIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJibHRhLSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmx0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJsdGEiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwxLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJibHRsYS0iLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmx0bGErIiwgIEJCT0NCKDE2LEJPVCxDQkxULDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJsdGxhIiwgICBCQk9DQigxNixCT1QsQ0JMVCwxLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJiZ3QtIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJiZ3QrIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJiZ3QiLCAgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJiZ3RsLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJiZ3RsKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJiZ3RsIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJiZ3RhLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmd0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkdULDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJndGEiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwxLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJiZ3RsYS0iLCAgQkJPQ0IoMTYsQk9ULENCR1QsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmd0bGErIiwgIEJCT0NCKDE2LEJPVCxDQkdULDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJndGxhIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJiZXEtIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJiZXErIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJiZXEiLCAgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJiZXFsLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJiZXFsKyIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJiZXFsIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJiZXFhLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmVxYSsiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJlcWEiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJiZXFsYS0iLCAgQkJPQ0IoMTYsQk9ULENCRVEsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYmVxbGErIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJlcWxhIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJic28tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJic28rIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJic28iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJic29sLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJic29sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJic29sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPQVRDQl9NQVNLLCBDT00sCQl7IENSLCBCRCB9IH0sCit7ICJic29hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYnNvYSsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJzb2EiLCAgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJic29sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYnNvbGErIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJzb2xhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEQSB9IH0sCit7ICJidW4tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETSB9IH0sCit7ICJidW4rIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUCB9IH0sCit7ICJidW4iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEIH0gfSwKK3sgImJ1bmwtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJ1bmwrIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJ1bmwiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkQgfSB9LAoreyAiYnVuYS0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE1BIH0gfSwKK3sgImJ1bmErIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQQSB9IH0sCit7ICJidW5hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEQSB9IH0sCit7ICJidW5sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYnVubGErIiwgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJ1bmxhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJnZS0iLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJnZSsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJnZSIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJnZWwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJnZWwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJnZWwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJnZWEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJiZ2VhKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmdlYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJnZWxhLSIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJiZ2VsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmdlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJubC0iLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJubCsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJubCIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJubGwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJubGwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJubGwiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJubGEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmxhKyIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5sYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJubGxhLSIsICBCQk9DQigxNixCT0YsQ0JMVCwxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmxsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5sbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJsZS0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJsZSsiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJsZSIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJsZWwtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJsZWwrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJsZWwiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJsZWEtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibGVhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmxlYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJsZWxhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibGVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYmxlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJuZy0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJuZysiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJuZyIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuZ2wtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJuZ2wrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJuZ2wiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuZ2EtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmdhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5nYSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJuZ2xhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmdsYSsiLCAgQkJPQ0IoMTYsQk9GLENCR1QsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5nbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJuZS0iLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJuZSsiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJuZSIsICAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuZWwtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJuZWwrIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJuZWwiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuZWEtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmVhKyIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5lYSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJuZWxhLSIsICBCQk9DQigxNixCT0YsQ0JFUSwxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibmVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5lbGEiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJucy0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJucysiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJucyIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuc2wtIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJuc2wrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJuc2wiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9BVENCX01BU0ssIENPTSwJCXsgQ1IsIEJEIH0gfSwKK3sgImJuc2EtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibnNhKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5zYSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJuc2xhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibnNsYSsiLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm5zbGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT0FUQ0JfTUFTSywgQ09NLAkJeyBDUiwgQkRBIH0gfSwKK3sgImJudS0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNIH0gfSwKK3sgImJudSsiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRQIH0gfSwKK3sgImJudSIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkQgfSB9LAoreyAiYm51bC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRE0gfSB9LAoreyAiYm51bCsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFAgfSB9LAoreyAiYm51bCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRCB9IH0sCit7ICJibnVhLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJETUEgfSB9LAoreyAiYm51YSsiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMCksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCRFBBIH0gfSwKK3sgImJudWEiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRBIH0gfSwKK3sgImJudWxhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9BVENCX01BU0ssIFBQQ0NPTSwJeyBDUiwgQkRNQSB9IH0sCit7ICJibnVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCU08sMSwxKSwgQkJPQVRDQl9NQVNLLCBQUENDT00sCXsgQ1IsIEJEUEEgfSB9LAoreyAiYm51bGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT0FUQ0JfTUFTSywgUFBDQ09NLAl7IENSLCBCREEgfSB9LAoreyAiYmRuenQtIiwgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNIH0gfSwKK3sgImJkbnp0KyIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgTk9QT1dFUjQsCXsgQkksIEJEUCB9IH0sCit7ICJiZG56dCIsICAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmRuenRsLSIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNIH0gfSwKK3sgImJkbnp0bCsiLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgTk9QT1dFUjQsCXsgQkksIEJEUCB9IH0sCit7ICJiZG56dGwiLCAgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmRuenRhLSIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNQSB9IH0sCit7ICJiZG56dGErIiwgQkJPKDE2LEJPRE5aVCwxLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnp0YSIsICBCQk8oMTYsQk9ETlpULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmRuenRsYS0iLEJCTygxNixCT0ROWlQsMSwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNQSB9IH0sCit7ICJiZG56dGxhKyIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnp0bGEiLCBCQk8oMTYsQk9ETlpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmRuemYtIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNIH0gfSwKK3sgImJkbnpmKyIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgTk9QT1dFUjQsCXsgQkksIEJEUCB9IH0sCit7ICJiZG56ZiIsICAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmRuemZsLSIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNIH0gfSwKK3sgImJkbnpmbCsiLCBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgTk9QT1dFUjQsCXsgQkksIEJEUCB9IH0sCit7ICJiZG56ZmwiLCAgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmRuemZhLSIsIEJCTygxNixCT0ROWkYsMSwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNQSB9IH0sCit7ICJiZG56ZmErIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnpmYSIsICBCQk8oMTYsQk9ETlpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmRuemZsYS0iLEJCTygxNixCT0ROWkYsMSwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRNQSB9IH0sCit7ICJiZG56ZmxhKyIsQkJPKDE2LEJPRE5aRiwxLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFBBIH0gfSwKK3sgImJkbnpmbGEiLCBCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYnQtIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE0gfSB9LAoreyAiYnQrIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoreyAiYnQiLAkgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiYnQiLCAgICAgQkJPKDE2LEJPVCwwLDApLCBCQk9BVF9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKK3sgImJ0bC0iLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKK3sgImJ0bCsiLCAgICBCQk8oMTYsQk9ULDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKK3sgImJ0bCIsICAgICBCQk8oMTYsQk9ULDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmJ0bCIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPQVRfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJidGEtIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9BVF9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoreyAiYnRhKyIsICAgIEJCTygxNixCT1QsMSwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFBBIH0gfSwKK3sgImJ0YSIsICAgICBCQk8oMTYsQk9ULDEsMCksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJidGEiLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT0FUX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJ0bGEtIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCit7ICJidGxhKyIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9BVF9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoreyAiYnRsYSIsICAgIEJCTygxNixCT1QsMSwxKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmJ0bGEiLCAgIEJCTygxNixCT1QsMSwxKSwgQkJPQVRfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmYtIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRE0gfSB9LAoreyAiYmYrIiwgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFAgfSB9LAoreyAiYmYiLAkgICAgIEJCTygxNixCT0YsMCwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiYmYiLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9BVF9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKK3sgImJmbC0iLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNIH0gfSwKK3sgImJmbCsiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRQIH0gfSwKK3sgImJmbCIsICAgICBCQk8oMTYsQk9GLDAsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmJmbCIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPQVRfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCit7ICJiZmEtIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9BVF9NQVNLLCBQUENDT00sCXsgQkksIEJETUEgfSB9LAoreyAiYmZhKyIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCRFBBIH0gfSwKK3sgImJmYSIsICAgICBCQk8oMTYsQk9GLDEsMCksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJiZmEiLCAgICBCQk8oMTYsQk9GLDEsMCksIEJCT0FUX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKK3sgImJmbGEtIiwgICBCQk8oMTYsQk9GLDEsMSksIEJCT0FUX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRNQSB9IH0sCit7ICJiZmxhKyIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9BVF9NQVNLLCBQUENDT00sCXsgQkksIEJEUEEgfSB9LAoreyAiYmZsYSIsICAgIEJCTygxNixCT0YsMSwxKSwgQkJPQVRfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmJmbGEiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPQVRfTUFTSywgUFdSQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmR6dC0iLCAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE0gfSB9LAoreyAiYmR6dCsiLCAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFAgfSB9LAoreyAiYmR6dCIsICAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6dGwtIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE0gfSB9LAoreyAiYmR6dGwrIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFAgfSB9LAoreyAiYmR6dGwiLCAgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6dGEtIiwgIEJCTygxNixCT0RaVCwxLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkenRhKyIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRQQSB9IH0sCit7ICJiZHp0YSIsICAgQkJPKDE2LEJPRFpULDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmR6dGxhLSIsIEJCTygxNixCT0RaVCwxLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkenRsYSsiLCBCQk8oMTYsQk9EWlQsMSwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRQQSB9IH0sCit7ICJiZHp0bGEiLCAgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmR6Zi0iLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE0gfSB9LAoreyAiYmR6ZisiLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFAgfSB9LAoreyAiYmR6ZiIsICAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6ZmwtIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE0gfSB9LAoreyAiYmR6ZmwrIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRFAgfSB9LAoreyAiYmR6ZmwiLCAgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoreyAiYmR6ZmEtIiwgIEJCTygxNixCT0RaRiwxLDApLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkemZhKyIsICBCQk8oMTYsQk9EWkYsMSwwKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRQQSB9IH0sCit7ICJiZHpmYSIsICAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmR6ZmxhLSIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIE5PUE9XRVI0LAl7IEJJLCBCRE1BIH0gfSwKK3sgImJkemZsYSsiLCBCQk8oMTYsQk9EWkYsMSwxKSwgQkJPWV9NQVNLLCBOT1BPV0VSNCwJeyBCSSwgQkRQQSB9IH0sCit7ICJiZHpmbGEiLCAgQkJPKDE2LEJPRFpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoreyAiYmMtIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRE0gfSB9LAoreyAiYmMrIiwgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRFAgfSB9LAoreyAiYmMiLAkgICAgIEIoMTYsMCwwKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEIH0gfSwKK3sgImJjbC0iLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQ0NPTSwJCXsgQk9FLCBCSSwgQkRNIH0gfSwKK3sgImJjbCsiLCAgICBCKDE2LDAsMSksCUJfTUFTSywJCVBQQ0NPTSwJCXsgQk9FLCBCSSwgQkRQIH0gfSwKK3sgImJjbCIsICAgICBCKDE2LDAsMSksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCit7ICJiY2EtIiwgICAgQigxNiwxLDApLAlCX01BU0ssCQlQUENDT00sCQl7IEJPRSwgQkksIEJETUEgfSB9LAoreyAiYmNhKyIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRFBBIH0gfSwKK3sgImJjYSIsICAgICBCKDE2LDEsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCREEgfSB9LAoreyAiYmNsYS0iLCAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJUFBDQ09NLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKK3sgImJjbGErIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQ0NPTSwJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCit7ICJiY2xhIiwgICAgQigxNiwxLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKKworeyAic2MiLCAgICAgIFNDKDE3LDEsMCksIFNDX01BU0ssCVBQQywJCXsgTEVWIH0gfSwKK3sgInN2YyIsICAgICBTQygxNywwLDApLCBTQ19NQVNLLAlQT1dFUiwJCXsgU1ZDX0xFViwgRkwxLCBGTDIgfSB9LAoreyAic3ZjbCIsICAgIFNDKDE3LDAsMSksIFNDX01BU0ssCVBPV0VSLAkJeyBTVkNfTEVWLCBGTDEsIEZMMiB9IH0sCit7ICJzdmNhIiwgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFdSQ09NLAkJeyBTViB9IH0sCit7ICJzdmNsYSIsICAgU0MoMTcsMSwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWIH0gfSwKKworeyAiYiIsCSAgICAgQigxOCwwLDApLAlCX01BU0ssCQlDT00sCQl7IExJIH0gfSwKK3sgImJsIiwgICAgICBCKDE4LDAsMSksCUJfTUFTSywJCUNPTSwJCXsgTEkgfSB9LAoreyAiYmEiLCAgICAgIEIoMTgsMSwwKSwJQl9NQVNLLAkJQ09NLAkJeyBMSUEgfSB9LAoreyAiYmxhIiwgICAgIEIoMTgsMSwxKSwJQl9NQVNLLAkJQ09NLAkJeyBMSUEgfSB9LAorCit7ICJtY3JmIiwgICAgWEwoMTksMCksCVhMQkJfTUFTS3woMyA8PCAyMSl8KDMgPDwgMTYpLCBDT00sCXsgQkYsIEJGQSB9IH0sCisKK3sgImJsciIsICAgICBYTE8oMTksQk9VLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiciIsICAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoreyAiYmxybCIsICAgIFhMTygxOSxCT1UsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKK3sgImJybCIsICAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQV1JDT00sCXsgMCB9IH0sCit7ICJiZG56bHIiLCAgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiZG56bHItIiwgWExPKDE5LEJPRE5aLDE2LDApLCBYTEJPQklCQl9NQVNLLCBOT1BPV0VSNCwJeyAwIH0gfSwKK3sgImJkbnpsci0iLCBYTE8oMTksQk9ETlpNNCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUE9XRVI0LAl7IDAgfSB9LAoreyAiYmRuemxyKyIsIFhMTygxOSxCT0ROWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIE5PUE9XRVI0LAl7IDAgfSB9LAoreyAiYmRuemxyKyIsIFhMTygxOSxCT0ROWlA0LDE2LDApLCBYTEJPQklCQl9NQVNLLCBQT1dFUjQsCXsgMCB9IH0sCit7ICJiZG56bHJsIiwgWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiZG56bHJsLSIsWExPKDE5LEJPRE5aLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBOT1BPV0VSNCwJeyAwIH0gfSwKK3sgImJkbnpscmwtIixYTE8oMTksQk9ETlpNNCwxNiwxKSwgWExCT0JJQkJfTUFTSywgUE9XRVI0LAl7IDAgfSB9LAoreyAiYmRuemxybCsiLFhMTygxOSxCT0ROWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIE5PUE9XRVI0LAl7IDAgfSB9LAoreyAiYmRuemxybCsiLFhMTygxOSxCT0ROWlA0LDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQT1dFUjQsCXsgMCB9IH0sCit7ICJiZHpsciIsICAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKK3sgImJkemxyLSIsICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgTk9QT1dFUjQsCXsgMCB9IH0sCit7ICJiZHpsci0iLCAgWExPKDE5LEJPRFpNNCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUE9XRVI0LAl7IDAgfSB9LAoreyAiYmR6bHIrIiwgIFhMTygxOSxCT0RaUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgTk9QT1dFUjQsCXsgMCB9IH0sCit7ICJiZHpscisiLCAgWExPKDE5LEJPRFpQNCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUE9XRVI0LAl7IDAgfSB9LAoreyAiYmR6bHJsIiwgIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCit7ICJiZHpscmwtIiwgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIE5PUE9XRVI0LAl7IDAgfSB9LAoreyAiYmR6bHJsLSIsIFhMTygxOSxCT0RaTTQsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBPV0VSNCwJeyAwIH0gfSwKK3sgImJkemxybCsiLCBYTE8oMTksQk9EWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIE5PUE9XRVI0LAl7IDAgfSB9LAoreyAiYmR6bHJsKyIsIFhMTygxOSxCT0RaUDQsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBPV0VSNCwJeyAwIH0gfSwKK3sgImJsdGxyIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJsdGxyLSIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0bHItIiwgIFhMT0NCKDE5LEJPVE00LENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRscisiLCAgWExPQ0IoMTksQk9UUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRscisiLCAgWExPQ0IoMTksQk9UUDQsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsdHIiLCAgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJsdGxybCIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJsdGxybC0iLCBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0bHJsLSIsIFhMT0NCKDE5LEJPVE00LENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRscmwrIiwgWExPQ0IoMTksQk9UUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRscmwrIiwgWExPQ0IoMTksQk9UUDQsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsdHJsIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJndGxyIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJndGxyLSIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmd0bHItIiwgIFhMT0NCKDE5LEJPVE00LENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RscisiLCAgWExPQ0IoMTksQk9UUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RscisiLCAgWExPQ0IoMTksQk9UUDQsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJndHIiLCAgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJndGxybCIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJndGxybC0iLCBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmd0bHJsLSIsIFhMT0NCKDE5LEJPVE00LENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RscmwrIiwgWExPQ0IoMTksQk9UUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RscmwrIiwgWExPQ0IoMTksQk9UUDQsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJndHJsIiwgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJlcWxyIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJlcWxyLSIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmVxbHItIiwgIFhMT0NCKDE5LEJPVE00LENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZXFscisiLCAgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZXFscisiLCAgWExPQ0IoMTksQk9UUDQsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcXIiLCAgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJlcWxybCIsICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJlcWxybC0iLCBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmVxbHJsLSIsIFhMT0NCKDE5LEJPVE00LENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZXFscmwrIiwgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZXFscmwrIiwgWExPQ0IoMTksQk9UUDQsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcXJsIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJzb2xyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJzb2xyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvbHItIiwgIFhMT0NCKDE5LEJPVE00LENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJic29scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJic29scisiLCAgWExPQ0IoMTksQk9UUDQsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJzb3IiLCAgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJzb2xybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJzb2xybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvbHJsLSIsIFhMT0NCKDE5LEJPVE00LENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJic29scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJic29scmwrIiwgWExPQ0IoMTksQk9UUDQsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJzb3JsIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJ1bmxyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJ1bmxyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnVubHItIiwgIFhMT0NCKDE5LEJPVE00LENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5scisiLCAgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5scisiLCAgWExPQ0IoMTksQk9UUDQsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJ1bmxybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJ1bmxybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnVubHJsLSIsIFhMT0NCKDE5LEJPVE00LENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5scmwrIiwgWExPQ0IoMTksQk9UUDQsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJnZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmdlbHItIiwgIFhMT0NCKDE5LEJPRk00LENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ2VscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ2VscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJnZWxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJnZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmdlbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ2VscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ2VscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJubGxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJubGxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sbHItIiwgIFhMT0NCKDE5LEJPRk00LENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJubHIiLCAgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJubGxybCIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJubGxybC0iLCBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJubHJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJsZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJsZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmxlbHItIiwgIFhMT0NCKDE5LEJPRk00LENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJsZWxybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJsZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmxlbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xyIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xyLSIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5nbHItIiwgIFhMT0NCKDE5LEJPRk00LENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmdscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmdscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ3IiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZ2xybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5nbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmdscmwrIiwgWExPQ0IoMTksQk9GUCxDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmdscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ3JsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lbHItIiwgIFhMT0NCKDE5LEJPRk00LENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVscisiLCAgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuZWxybCIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuc2xyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuc2xyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5zbHItIiwgIFhMT0NCKDE5LEJPRk00LENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuc3IiLCAgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJuc2xybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJuc2xybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5zbHJsLSIsIFhMT0NCKDE5LEJPRk00LENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuc3JsIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKK3sgImJudWxyIiwgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJudWxyLSIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm51bHItIiwgIFhMT0NCKDE5LEJPRk00LENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnVscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnVscisiLCAgWExPQ0IoMTksQk9GUDQsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJudWxybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKK3sgImJudWxybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm51bHJsLSIsIFhMT0NCKDE5LEJPRk00LENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnVscmwrIiwgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnVscmwrIiwgWExPQ0IoMTksQk9GUDQsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJ0bHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJ0bHItIiwgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYnRsci0iLCAgIFhMTygxOSxCT1RNNCwxNiwwKSwgWExCT0JCX01BU0ssIFBPV0VSNCwJeyBCSSB9IH0sCit7ICJidGxyKyIsICAgWExPKDE5LEJPVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJidGxyKyIsICAgWExPKDE5LEJPVFA0LDE2LDApLCBYTEJPQkJfTUFTSywgUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJidHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJ0bHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJ0bHJsLSIsICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYnRscmwtIiwgIFhMTygxOSxCT1RNNCwxNiwxKSwgWExCT0JCX01BU0ssIFBPV0VSNCwJeyBCSSB9IH0sCit7ICJidGxybCsiLCAgWExPKDE5LEJPVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJidGxybCsiLCAgWExPKDE5LEJPVFA0LDE2LDEpLCBYTEJPQkJfTUFTSywgUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJidHJsIiwgICBYTE8oMTksQk9ULDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJmbHIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJmbHItIiwgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYmZsci0iLCAgIFhMTygxOSxCT0ZNNCwxNiwwKSwgWExCT0JCX01BU0ssIFBPV0VSNCwJeyBCSSB9IH0sCit7ICJiZmxyKyIsICAgWExPKDE5LEJPRlAsMTYsMCksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJiZmxyKyIsICAgWExPKDE5LEJPRlA0LDE2LDApLCBYTEJPQkJfTUFTSywgUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJiZnIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJmbHJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJmbHJsLSIsICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYmZscmwtIiwgIFhMTygxOSxCT0ZNNCwxNiwxKSwgWExCT0JCX01BU0ssIFBPV0VSNCwJeyBCSSB9IH0sCit7ICJiZmxybCsiLCAgWExPKDE5LEJPRlAsMTYsMSksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJiZmxybCsiLCAgWExPKDE5LEJPRlA0LDE2LDEpLCBYTEJPQkJfTUFTSywgUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJiZnJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKK3sgImJkbnp0bHIiLCBYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJkbnp0bHItIixYTE8oMTksQk9ETlpULDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuenRscisiLFhMTygxOSxCT0ROWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuenRscmwiLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmRuenRscmwtIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuenRscmwrIixYTE8oMTksQk9ETlpUUCwxNiwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJkbnpmbHIiLCBYTE8oMTksQk9ETlpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJkbnpmbHItIixYTE8oMTksQk9ETlpGLDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuemZscisiLFhMTygxOSxCT0ROWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuemZscmwiLFhMTygxOSxCT0ROWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmRuemZscmwtIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmRuemZscmwrIixYTE8oMTksQk9ETlpGUCwxNiwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJkenRsciIsICBYTE8oMTksQk9EWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmR6dGxyLSIsIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJkenRscisiLCBYTE8oMTksQk9EWlRQLDE2LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmR6dGxybCIsIFhMTygxOSxCT0RaVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJiZHp0bHJsLSIsWExPKDE5LEJPRFpULDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYmR6dGxybCsiLFhMTygxOSxCT0RaVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwgeyBCSSB9IH0sCit7ICJiZHpmbHIiLCAgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJkemZsci0iLCBYTE8oMTksQk9EWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJiZHpmbHIrIiwgWExPKDE5LEJPRFpGUCwxNiwwKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJkemZscmwiLCBYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmR6ZmxybC0iLFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJkemZscmwrIixYTE8oMTksQk9EWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmNscisiLCAgIFhMWUxLKDE5LDE2LDEsMCksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjbHJsKyIsICBYTFlMSygxOSwxNiwxLDEpLCBYTFlCQl9NQVNLLCBQUENDT00sCXsgQk9FLCBCSSB9IH0sCit7ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAoreyAiYmNscmwtIiwgIFhMWUxLKDE5LDE2LDAsMSksIFhMWUJCX01BU0ssIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjbHIiLCAgICBYTExLKDE5LDE2LDApLCBYTEJIX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJLCBCSCB9IH0sCit7ICJiY2xybCIsICAgWExMSygxOSwxNiwxKSwgWExCSF9NQVNLLAlQUENDT00sCQl7IEJPLCBCSSwgQkggfSB9LAoreyAiYmNyIiwgICAgIFhMTEsoMTksMTYsMCksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAoreyAiYmNybCIsICAgIFhMTEsoMTksMTYsMSksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAoreyAiYmNscmUiLCAgIFhMTEsoMTksMTcsMCksIFhMQkJfTUFTSywJQk9PS0U2NCwJeyBCTywgQkkgfSB9LAoreyAiYmNscmVsIiwgIFhMTEsoMTksMTcsMSksIFhMQkJfTUFTSywJQk9PS0U2NCwJeyBCTywgQkkgfSB9LAorCit7ICJyZmlkIiwgICAgWEwoMTksMTgpLAkweGZmZmZmZmZmLAlQUEM2NCwJCXsgMCB9IH0sCisKK3sgImNybm90IiwgICBYTCgxOSwzMyksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoreyAiY3Jub3IiLCAgIFhMKDE5LDMzKSwJWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKK3sgInJmbWNpIiwgICAgWCgxOSwzOCksIDB4ZmZmZmZmZmYsCVBQQ1JGTUNJLAl7IDAgfSB9LAorCit7ICJyZmkiLCAgICAgWEwoMTksNTApLAkweGZmZmZmZmZmLAlDT00sCQl7IDAgfSB9LAoreyAicmZjaSIsICAgIFhMKDE5LDUxKSwJMHhmZmZmZmZmZiwJUFBDNDAzIHwgQk9PS0UsCXsgMCB9IH0sCisKK3sgInJmc3ZjIiwgICBYTCgxOSw4MiksCTB4ZmZmZmZmZmYsCVBPV0VSLAkJeyAwIH0gfSwKKworeyAiY3JhbmRjIiwgIFhMKDE5LDEyOSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgImlzeW5jIiwgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoreyAiaWNzIiwgICAgIFhMKDE5LDE1MCksIDB4ZmZmZmZmZmYsCVBXUkNPTSwJCXsgMCB9IH0sCisKK3sgImNyY2xyIiwgICBYTCgxOSwxOTMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQVQsIEJCQSB9IH0sCit7ICJjcnhvciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKKworeyAiY3JuYW5kIiwgIFhMKDE5LDIyNSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgImNyYW5kIiwgICBYTCgxOSwyNTcpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAorCit7ICJocmZpZCIsICAgWEwoMTksMjc0KSwgMHhmZmZmZmZmZiwJUE9XRVI1IHwgQ0VMTCwJeyAwIH0gfSwKKworeyAiY3JzZXQiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKK3sgImNyZXF2IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAorCit7ICJkb3plIiwgICAgWEwoMTksNDAyKSwgMHhmZmZmZmZmZiwJUE9XRVI2LAkJeyAwIH0gfSwKKworeyAiY3JvcmMiLCAgIFhMKDE5LDQxNyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCisKK3sgIm5hcCIsICAgICBYTCgxOSw0MzQpLCAweGZmZmZmZmZmLAlQT1dFUjYsCQl7IDAgfSB9LAorCit7ICJjcm1vdmUiLCAgWEwoMTksNDQ5KSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkEsIEJCQSB9IH0sCit7ICJjcm9yIiwgICAgWEwoMTksNDQ5KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKKworeyAic2xlZXAiLCAgIFhMKDE5LDQ2NiksIDB4ZmZmZmZmZmYsCVBPV0VSNiwJCXsgMCB9IH0sCit7ICJydndpbmtsZSIsIFhMKDE5LDQ5OCksIDB4ZmZmZmZmZmYsCVBPV0VSNiwJCXsgMCB9IH0sCisKK3sgImJjdHIiLCAgICBYTE8oMTksQk9VLDUyOCwwKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoreyAiYmN0cmwiLCAgIFhMTygxOSxCT1UsNTI4LDEpLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCit7ICJibHRjdHIiLCAgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJsdGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRjdHItIiwgWExPQ0IoMTksQk9UTTQsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibHRjdHIrIiwgWExPQ0IoMTksQk9UUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0Y3RyKyIsIFhMT0NCKDE5LEJPVFA0LENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0Y3RybCIsIFhMT0NCKDE5LEJPVCxDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJibHRjdHJsLSIsWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0Y3RybC0iLFhMT0NCKDE5LEJPVE00LENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmx0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsdGN0cmwrIixYTE9DQigxOSxCT1RQNCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJndGN0ciIsICBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmd0Y3RyLSIsIFhMT0NCKDE5LEJPVCxDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJndGN0ci0iLCBYTE9DQigxOSxCT1RNNCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJndGN0cisiLCBYTE9DQigxOSxCT1RQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RjdHIrIiwgWExPQ0IoMTksQk9UUDQsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RjdHJsIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJndGN0cmwtIixYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RjdHJsLSIsWExPQ0IoMTksQk9UTTQsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ3RjdHJsKyIsWExPQ0IoMTksQk9UUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmd0Y3RybCsiLFhMT0NCKDE5LEJPVFA0LENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmVxY3RyIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJiZXFjdHItIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmVxY3RyLSIsIFhMT0NCKDE5LEJPVE00LENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmVxY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcWN0cisiLCBYTE9DQigxOSxCT1RQNCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcWN0cmwiLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmVxY3RybC0iLFhMT0NCKDE5LEJPVCxDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcWN0cmwtIixYTE9DQigxOSxCT1RNNCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJlcWN0cmwrIixYTE9DQigxOSxCT1RQLENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZXFjdHJsKyIsWExPQ0IoMTksQk9UUDQsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJic29jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJzb2N0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJic29jdHItIiwgWExPQ0IoMTksQk9UTTQsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJic29jdHIrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvY3RyKyIsIFhMT0NCKDE5LEJPVFA0LENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvY3RybCIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJic29jdHJsLSIsWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvY3RybC0iLFhMT0NCKDE5LEJPVE00LENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnNvY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJzb2N0cmwrIixYTE9DQigxOSxCT1RQNCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJ1bmN0ciIsICBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYnVuY3RyLSIsIFhMT0NCKDE5LEJPVCxDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJ1bmN0ci0iLCBYTE9DQigxOSxCT1RNNCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJ1bmN0cisiLCBYTE9DQigxOSxCT1RQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5jdHIrIiwgWExPQ0IoMTksQk9UUDQsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJ1bmN0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5jdHJsLSIsWExPQ0IoMTksQk9UTTQsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJidW5jdHJsKyIsWExPQ0IoMTksQk9UUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYnVuY3RybCsiLFhMT0NCKDE5LEJPVFA0LENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmdlY3RyIiwgIFhMT0NCKDE5LEJPRixDQkxULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJiZ2VjdHItIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmdlY3RyLSIsIFhMT0NCKDE5LEJPRk00LENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmdlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZWN0cisiLCBYTE9DQigxOSxCT0ZQNCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmdlY3RybC0iLFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZWN0cmwtIixYTE9DQigxOSxCT0ZNNCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJnZWN0cmwrIixYTE9DQigxOSxCT0ZQLENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJiZ2VjdHJsKyIsWExPQ0IoMTksQk9GUDQsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJubGN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxjdHItIiwgWExPQ0IoMTksQk9GTTQsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmxjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkxULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sY3RyKyIsIFhMT0NCKDE5LEJPRlA0LENCTFQsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sY3RybCIsIFhMT0NCKDE5LEJPRixDQkxULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJibmxjdHJsLSIsWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sY3RybC0iLFhMT0NCKDE5LEJPRk00LENCTFQsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5sY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJubGN0cmwrIixYTE9DQigxOSxCT0ZQNCxDQkxULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsZWN0ciIsICBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYmxlY3RyLSIsIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsZWN0ci0iLCBYTE9DQigxOSxCT0ZNNCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJsZWN0cisiLCBYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVjdHIrIiwgWExPQ0IoMTksQk9GUDQsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJsZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVjdHJsLSIsWExPQ0IoMTksQk9GTTQsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibGVjdHJsKyIsWExPQ0IoMTksQk9GUCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYmxlY3RybCsiLFhMT0NCKDE5LEJPRlA0LENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5nY3RyIiwgIFhMT0NCKDE5LEJPRixDQkdULDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJibmdjdHItIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5nY3RyLSIsIFhMT0NCKDE5LEJPRk00LENCR1QsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5nY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ2N0cisiLCBYTE9DQigxOSxCT0ZQNCxDQkdULDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ2N0cmwiLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5nY3RybC0iLFhMT0NCKDE5LEJPRixDQkdULDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ2N0cmwtIixYTE9DQigxOSxCT0ZNNCxDQkdULDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZ2N0cmwrIixYTE9DQigxOSxCT0ZQLENCR1QsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmdjdHJsKyIsWExPQ0IoMTksQk9GUDQsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVjdHIiLCAgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJuZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVjdHItIiwgWExPQ0IoMTksQk9GTTQsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibmVjdHIrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lY3RyKyIsIFhMT0NCKDE5LEJPRlA0LENCRVEsNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lY3RybCIsIFhMT0NCKDE5LEJPRixDQkVRLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJibmVjdHJsLSIsWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lY3RybC0iLFhMT0NCKDE5LEJPRk00LENCRVEsNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5lY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuZWN0cmwrIixYTE9DQigxOSxCT0ZQNCxDQkVRLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuc2N0ciIsICBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm5zY3RyLSIsIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuc2N0ci0iLCBYTE9DQigxOSxCT0ZNNCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJuc2N0cisiLCBYTE9DQigxOSxCT0ZQLENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNjdHIrIiwgWExPQ0IoMTksQk9GUDQsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKK3sgImJuc2N0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNjdHJsLSIsWExPQ0IoMTksQk9GTTQsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJibnNjdHJsKyIsWExPQ0IoMTksQk9GUCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm5zY3RybCsiLFhMT0NCKDE5LEJPRlA0LENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm51Y3RyIiwgIFhMT0NCKDE5LEJPRixDQlNPLDUyOCwwKSwgIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwJeyBDUiB9IH0sCit7ICJibnVjdHItIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgTk9QT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm51Y3RyLSIsIFhMT0NCKDE5LEJPRk00LENCU08sNTI4LDApLCBYTEJPQ0JCQl9NQVNLLCBQT1dFUjQsIHsgQ1IgfSB9LAoreyAiYm51Y3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJudWN0cisiLCBYTE9DQigxOSxCT0ZQNCxDQlNPLDUyOCwwKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJudWN0cmwiLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUENDT00sCXsgQ1IgfSB9LAoreyAiYm51Y3RybC0iLFhMT0NCKDE5LEJPRixDQlNPLDUyOCwxKSwgIFhMQk9DQkJCX01BU0ssIE5PUE9XRVI0LCB7IENSIH0gfSwKK3sgImJudWN0cmwtIixYTE9DQigxOSxCT0ZNNCxDQlNPLDUyOCwxKSwgWExCT0NCQkJfTUFTSywgUE9XRVI0LCB7IENSIH0gfSwKK3sgImJudWN0cmwrIixYTE9DQigxOSxCT0ZQLENCU08sNTI4LDEpLCBYTEJPQ0JCQl9NQVNLLCBOT1BPV0VSNCwgeyBDUiB9IH0sCit7ICJibnVjdHJsKyIsWExPQ0IoMTksQk9GUDQsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBPV0VSNCwgeyBDUiB9IH0sCit7ICJidGN0ciIsICAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJ0Y3RyLSIsICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwJeyBCSSB9IH0sCit7ICJidGN0ci0iLCAgWExPKDE5LEJPVE00LDUyOCwwKSwgWExCT0JCX01BU0ssIFBPV0VSNCwgeyBCSSB9IH0sCit7ICJidGN0cisiLCAgWExPKDE5LEJPVFAsNTI4LDApLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYnRjdHIrIiwgIFhMTygxOSxCT1RQNCw1MjgsMCksIFhMQk9CQl9NQVNLLCBQT1dFUjQsIHsgQkkgfSB9LAoreyAiYnRjdHJsIiwgIFhMTygxOSxCT1QsNTI4LDEpLCAgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCit7ICJidGN0cmwtIiwgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgTk9QT1dFUjQsCXsgQkkgfSB9LAoreyAiYnRjdHJsLSIsIFhMTygxOSxCT1RNNCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQT1dFUjQsIHsgQkkgfSB9LAoreyAiYnRjdHJsKyIsIFhMTygxOSxCT1RQLDUyOCwxKSwgWExCT0JCX01BU0ssIE5PUE9XRVI0LAl7IEJJIH0gfSwKK3sgImJ0Y3RybCsiLCBYTE8oMTksQk9UUDQsNTI4LDEpLCBYTEJPQkJfTUFTSywgUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJmY3RyIiwgICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoreyAiYmZjdHItIiwgIFhMTygxOSxCT0YsNTI4LDApLCAgWExCT0JCX01BU0ssIE5PUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJmY3RyLSIsICBYTE8oMTksQk9GTTQsNTI4LDApLCBYTEJPQkJfTUFTSywgUE9XRVI0LCB7IEJJIH0gfSwKK3sgImJmY3RyKyIsICBYTE8oMTksQk9GUCw1MjgsMCksIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwgeyBCSSB9IH0sCit7ICJiZmN0cisiLCAgWExPKDE5LEJPRlA0LDUyOCwwKSwgWExCT0JCX01BU0ssIFBPV0VSNCwgeyBCSSB9IH0sCit7ICJiZmN0cmwiLCAgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKK3sgImJmY3RybC0iLCBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBOT1BPV0VSNCwgeyBCSSB9IH0sCit7ICJiZmN0cmwtIiwgWExPKDE5LEJPRk00LDUyOCwxKSwgWExCT0JCX01BU0ssIFBPV0VSNCwgeyBCSSB9IH0sCit7ICJiZmN0cmwrIiwgWExPKDE5LEJPRlAsNTI4LDEpLCBYTEJPQkJfTUFTSywgTk9QT1dFUjQsIHsgQkkgfSB9LAoreyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQNCw1MjgsMSksIFhMQk9CQl9NQVNLLCBQT1dFUjQsIHsgQkkgfSB9LAoreyAiYmNjdHItIiwgIFhMWUxLKDE5LDUyOCwwLDApLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjY3RyKyIsICBYTFlMSygxOSw1MjgsMSwwKSwgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk9FLCBCSSB9IH0sCit7ICJiY2N0cmwtIiwgWExZTEsoMTksNTI4LDAsMSksICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPRSwgQkkgfSB9LAoreyAiYmNjdHJsKyIsIFhMWUxLKDE5LDUyOCwxLDEpLCAgWExZQkJfTUFTSywgIFBQQ0NPTSwJeyBCT0UsIEJJIH0gfSwKK3sgImJjY3RyIiwgICBYTExLKDE5LDUyOCwwKSwgICAgIFhMQkhfTUFTSywgICBQUENDT00sCXsgQk8sIEJJLCBCSCB9IH0sCit7ICJiY2N0cmwiLCAgWExMSygxOSw1MjgsMSksICAgICBYTEJIX01BU0ssICAgUFBDQ09NLAl7IEJPLCBCSSwgQkggfSB9LAoreyAiYmNjIiwgICAgIFhMTEsoMTksNTI4LDApLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAoreyAiYmNjbCIsICAgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAoreyAiYmNjdHJlIiwgIFhMTEsoMTksNTI5LDApLCAgICAgWExCQl9NQVNLLCAgIEJPT0tFNjQsCXsgQk8sIEJJIH0gfSwKK3sgImJjY3RyZWwiLCBYTExLKDE5LDUyOSwxKSwgICAgIFhMQkJfTUFTSywgICBCT09LRTY0LAl7IEJPLCBCSSB9IH0sCisKK3sgInJsd2ltaSIsICBNKDIwLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCit7ICJybGltaSIsICAgTSgyMCwwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAorCit7ICJybHdpbWkuIiwgTSgyMCwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoreyAicmxpbWkuIiwgIE0oMjAsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKKworeyAicm90bHdpIiwgIE1NRSgyMSwzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgImNscmx3aSIsICBNTUUoMjEsMzEsMCksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCit7ICJybHdpbm0iLCAgTSgyMSwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoreyAicmxpbm0iLCAgIE0oMjEsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKK3sgInJvdGx3aS4iLCBNTUUoMjEsMzEsMSksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsUlMsU0ggfSB9LAoreyAiY2xybHdpLiIsIE1NRSgyMSwzMSwxKSwgTVNITUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIE1CIH0gfSwKK3sgInJsd2lubS4iLCBNKDIxLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCit7ICJybGlubS4iLCAgTSgyMSwxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAorCit7ICJybG1pIiwgICAgTSgyMiwwKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbWkuIiwgICBNKDIyLDEpLAlNX01BU0ssCQlNNjAxLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAorCit7ICJiZSIsCSAgICAgQigyMiwwLDApLAlCX01BU0ssCQlCT09LRTY0LAl7IExJIH0gfSwKK3sgImJlbCIsICAgICBCKDIyLDAsMSksCUJfTUFTSywJCUJPT0tFNjQsCXsgTEkgfSB9LAoreyAiYmVhIiwgICAgIEIoMjIsMSwwKSwJQl9NQVNLLAkJQk9PS0U2NCwJeyBMSUEgfSB9LAoreyAiYmVsYSIsICAgIEIoMjIsMSwxKSwJQl9NQVNLLAkJQk9PS0U2NCwJeyBMSUEgfSB9LAorCit7ICJyb3RsdyIsICAgTU1FKDIzLDMxLDApLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmx3bm0iLCAgIE0oMjMsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbm0iLCAgICBNKDIzLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCit7ICJyb3Rsdy4iLCAgTU1FKDIzLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmx3bm0uIiwgIE0oMjMsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKK3sgInJsbm0uIiwgICBNKDIzLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCisKK3sgIm5vcCIsICAgICBPUCgyNCksCTB4ZmZmZmZmZmYsCVBQQ0NPTSwJCXsgMCB9IH0sCit7ICJvcmkiLCAgICAgT1AoMjQpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoreyAib3JpbCIsICAgIE9QKDI0KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKKworeyAib3JpcyIsICAgIE9QKDI1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKK3sgIm9yaXUiLCAgICBPUCgyNSksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCisKK3sgInhvcmkiLCAgICBPUCgyNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCit7ICJ4b3JpbCIsICAgT1AoMjYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAorCit7ICJ4b3JpcyIsICAgT1AoMjcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoreyAieG9yaXUiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKKworeyAiYW5kaS4iLCAgIE9QKDI4KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKK3sgImFuZGlsLiIsICBPUCgyOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCisKK3sgImFuZGlzLiIsICBPUCgyOSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCit7ICJhbmRpdS4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAorCit7ICJyb3RsZGkiLCAgTUQoMzAsMCwwKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoreyAiY2xybGRpIiwgIE1EKDMwLDAsMCksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKK3sgInJsZGljbCIsICBNRCgzMCwwLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCit7ICJyb3RsZGkuIiwgTUQoMzAsMCwxKSwgTURNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAoreyAiY2xybGRpLiIsIE1EKDMwLDAsMSksIE1EU0hfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgTUI2IH0gfSwKK3sgInJsZGljbC4iLCBNRCgzMCwwLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCisKK3sgInJsZGljciIsICBNRCgzMCwxLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1FNiB9IH0sCit7ICJybGRpY3IuIiwgTUQoMzAsMSwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAorCit7ICJybGRpYyIsICAgTUQoMzAsMiwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoreyAicmxkaWMuIiwgIE1EKDMwLDIsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKKworeyAicmxkaW1pIiwgIE1EKDMwLDMsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKK3sgInJsZGltaS4iLCBNRCgzMCwzLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCisKK3sgInJvdGxkIiwgICBNRFMoMzAsOCwwKSwgTURTTUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAicmxkY2wiLCAgIE1EUygzMCw4LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1CNiB9IH0sCit7ICJyb3RsZC4iLCAgTURTKDMwLDgsMSksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInJsZGNsLiIsICBNRFMoMzAsOCwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAorCit7ICJybGRjciIsICAgTURTKDMwLDksMCksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKK3sgInJsZGNyLiIsICBNRFMoMzAsOSwxKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNRTYgfSB9LAorCit7ICJjbXB3IiwgICAgWE9QTCgzMSwwLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCQl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcGQiLCAgICBYT1BMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUF9NQVNLLAlQUEMsCQl7IEJGLCBMLCBSQSwgUkIgfSB9LAoreyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBMX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBSQiB9IH0sCisKK3sgInR3bGd0IiwgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0bGd0IiwgICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdsbHQiLCAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsbHQiLCAgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0d2VxIiwgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZXEiLCAgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0d2xnZSIsICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGxnZSIsICAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bG5sIiwgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0bG5sIiwgICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidHdsbGUiLCAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsbGUiLCAgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCit7ICJ0d2xuZyIsICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoreyAidGxuZyIsICAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3Z3QiLCAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRndCIsICAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3Z2UiLCAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRnZSIsICAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bmwiLCAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRubCIsICAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bHQiLCAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsdCIsICAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bGUiLCAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsZSIsICAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bmciLCAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRuZyIsICAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInR3bmUiLCAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRuZSIsICAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKK3sgInRyYXAiLCAgICBYVE8oMzEsNCxUT1UpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoreyAidHciLCAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCit7ICJ0IiwgICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKKworeyAic3ViZmMiLCAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmIiwgICAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJjIiwgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoreyAic3ViZmMuIiwgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmLiIsICAgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJjLiIsICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQiwgUkEgfSB9LAoreyAic3ViZmNvIiwgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmbyIsICAgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJjbyIsICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoreyAic3ViZmNvLiIsIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInNmby4iLCAgICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJjby4iLCAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAorCit7ICJtdWxoZHUiLCAgWE8oMzEsOSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxoZHUuIiwgWE8oMzEsOSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImFkZGMiLCAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYSIsICAgICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhZGRjLiIsICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImEuIiwgICAgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkY28iLCAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhbyIsICAgICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFkZGNvLiIsICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYW8uIiwgICAgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgIm11bGh3dSIsICBYTygzMSwxMSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsaHd1LiIsIFhPKDMxLDExLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImlzZWxsdCIsICBYKDMxLDE1KSwgICAgICBYX01BU0ssCVBQQ0lTRUwsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJpc2VsZ3QiLCAgWCgzMSw0NyksICAgICAgWF9NQVNLLAlQUENJU0VMLAl7IFJULCBSQSwgUkIgfSB9LAoreyAiaXNlbGVxIiwgIFgoMzEsNzkpLCAgICAgIFhfTUFTSywJUFBDSVNFTCwJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImlzZWwiLCAgICBYSVNFTCgzMSwxNSksICBYSVNFTF9NQVNLLAlQUENJU0VMLAl7IFJULCBSQSwgUkIsIENSQiB9IH0sCisKK3sgIm1mb2NyZiIsICBYRlhNKDMxLDE5LDAsMSksIFhGWEZYTV9NQVNLLCBDT00sCQl7IFJULCBGWE0gfSB9LAoreyAibWZjciIsICAgIFgoMzEsMTkpLAlYUkFSQl9NQVNLLAlOT1BPV0VSNCB8IENPTSwJeyBSVCB9IH0sCit7ICJtZmNyIiwgICAgWCgzMSwxOSksCVhGWEZYTV9NQVNLLAlQT1dFUjQsCQl7IFJULCBGWE00IH0gfSwKKworeyAibHdhcngiLCAgIFgoMzEsMjApLAlYRUhfTUFTSywJUFBDLAkJeyBSVCwgUkEwLCBSQiwgRUggfSB9LAorCit7ICJsZHgiLCAgICAgWCgzMSwyMSksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgImljYnQiLCAgICBYKDMxLDIyKSwJWF9NQVNLLAkJQk9PS0V8UFBDRTMwMCwJeyBDVCwgUkEsIFJCIH0gfSwKK3sgImljYnQiLCAgICBYKDMxLDI2MiksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCisKK3sgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCit7ICJseCIsICAgICAgWCgzMSwyMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInNsdyIsICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsIiwgICAgICBYUkMoMzEsMjQsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsdy4iLCAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsLiIsICAgICBYUkMoMzEsMjQsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAiY250bHp3IiwgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKK3sgImNudGx6IiwgICBYUkMoMzEsMjYsMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCit7ICJjbnRsencuIiwgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoreyAiY250bHouIiwgIFhSQygzMSwyNiwxKSwgWFJCX01BU0ssIAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCisKK3sgInNsZCIsICAgICBYUkMoMzEsMjcsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic2xkLiIsICAgIFhSQygzMSwyNywxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImFuZCIsICAgICBYUkMoMzEsMjgsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgImFuZC4iLCAgICBYUkMoMzEsMjgsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAibWFza2ciLCAgIFhSQygzMSwyOSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgIm1hc2tnLiIsICBYUkMoMzEsMjksMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImljYnRlIiwgICBYKDMxLDMwKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBDVCwgUkEsIFJCIH0gfSwKKworeyAibHd6eGUiLCAgIFgoMzEsMzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAiY21wbHciLCAgIFhPUEwoMzEsMzIsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJeyBPQkYsIFJBLCBSQiB9IH0sCit7ICJjbXBsZCIsICAgWE9QTCgzMSwzMiwxKSwgWENNUExfTUFTSywgUFBDNjQsCQl7IE9CRiwgUkEsIFJCIH0gfSwKK3sgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUF9NQVNLLAkgUFBDLAkJeyBCRiwgTCwgUkEsIFJCIH0gfSwKK3sgImNtcGwiLCAgICBYKDMxLDMyKSwJWENNUExfTUFTSywJIFBXUkNPTSwJeyBCRiwgUkEsIFJCIH0gfSwKKworeyAic3ViZiIsICAgIFhPKDMxLDQwLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWIiLCAgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKK3sgInN1YmYuIiwgICBYTygzMSw0MCwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAic3ViLiIsICAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCit7ICJzdWJmbyIsICAgWE8oMzEsNDAsMSwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgInN1Ym8iLCAgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoreyAic3ViZm8uIiwgIFhPKDMxLDQwLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJvLiIsICAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKKworeyAibGR1eCIsICAgIFgoMzEsNTMpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBTCwgUkIgfSB9LAorCit7ICJkY2JzdCIsICAgWCgzMSw1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCisKK3sgImx3enV4IiwgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkFMLCBSQiB9IH0sCit7ICJsdXgiLCAgICAgWCgzMSw1NSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImRjYnN0ZSIsICBYKDMxLDYyKSwJWFJUX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKKworeyAibHd6dXhlIiwgIFgoMzEsNjMpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAiY250bHpkIiwgIFhSQygzMSw1OCwwKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAoreyAiY250bHpkLiIsIFhSQygzMSw1OCwxKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAorCit7ICJhbmRjIiwgICAgWFJDKDMxLDYwLDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJhbmRjLiIsICAgWFJDKDMxLDYwLDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInRkbGd0IiwgICBYVE8oMzEsNjgsVE9MR1QpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGxsdCIsICAgWFRPKDMxLDY4LFRPTExUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRlcSIsICAgIFhUTygzMSw2OCxUT0VRKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbGdlIiwgICBYVE8oMzEsNjgsVE9MR0UpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGxubCIsICAgWFRPKDMxLDY4LFRPTE5MKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRsbGUiLCAgIFhUTygzMSw2OCxUT0xMRSksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbG5nIiwgICBYVE8oMzEsNjgsVE9MTkcpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGd0IiwgICAgWFRPKDMxLDY4LFRPR1QpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRnZSIsICAgIFhUTygzMSw2OCxUT0dFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbmwiLCAgICBYVE8oMzEsNjgsVE9OTCksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZGx0IiwgICAgWFRPKDMxLDY4LFRPTFQpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGRsZSIsICAgIFhUTygzMSw2OCxUT0xFKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKK3sgInRkbmciLCAgICBYVE8oMzEsNjgsVE9ORyksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCit7ICJ0ZG5lIiwgICAgWFRPKDMxLDY4LFRPTkUpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoreyAidGQiLAkgICAgIFgoMzEsNjgpLAlYX01BU0ssCQkgUFBDNjQsCQl7IFRPLCBSQSwgUkIgfSB9LAorCit7ICJtdWxoZCIsICAgWE8oMzEsNzMsMCwwKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGhkLiIsICBYTygzMSw3MywwLDEpLCBYT19NQVNLLAkgUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtdWxodyIsICAgWE8oMzEsNzUsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGh3LiIsICBYTygzMSw3NSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJkbG16YiIsICAgWFJDKDMxLDc4LDApLCAgWF9NQVNLLAlQUEM0MDN8UFBDNDQwLAl7IFJBLCBSUywgUkIgfSB9LAoreyAiZGxtemIuIiwgIFhSQygzMSw3OCwxKSwgIFhfTUFTSywJUFBDNDAzfFBQQzQ0MCwJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAibXRzcmQiLCAgIFgoMzEsODIpLAlYUkJfTUFTS3woMTw8MjApLCBQUEM2NCwJeyBTUiwgUlMgfSB9LAorCit7ICJtZm1zciIsICAgWCgzMSw4MyksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlQgfSB9LAorCit7ICJsZGFyeCIsICAgWCgzMSw4NCksCVhFSF9NQVNLLAlQUEM2NCwJCXsgUlQsIFJBMCwgUkIsIEVIIH0gfSwKKworeyAiZGNiZmwiLCAgIFhPUEwoMzEsODYsMSksIFhSVF9NQVNLLAlQT1dFUjUsCQl7IFJBLCBSQiB9IH0sCit7ICJkY2JmIiwgICAgWCgzMSw4NiksCVhMUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIsIEwgfSB9LAorCit7ICJsYnp4IiwgICAgWCgzMSw4NyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJkY2JmZSIsICAgWCgzMSw5NCksCVhSVF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCisKK3sgImxienhlIiwgICBYKDMxLDk1KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgIm5lZyIsICAgICBYTygzMSwxMDQsMCwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCit7ICJuZWcuIiwgICAgWE8oMzEsMTA0LDAsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAibmVnbyIsICAgIFhPKDMxLDEwNCwxLDApLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgIm5lZ28uIiwgICBYTygzMSwxMDQsMSwxKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCisKK3sgIm11bCIsICAgICBYTygzMSwxMDcsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWwuIiwgICAgWE8oMzEsMTA3LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbyIsICAgIFhPKDMxLDEwNywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bG8uIiwgICBYTygzMSwxMDcsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgIm10c3JkaW4iLCBYKDMxLDExNCksCVhSQV9NQVNLLAlQUEM2NCwJCXsgUlMsIFJCIH0gfSwKKworeyAiY2xmIiwgICAgIFgoMzEsMTE4KSwgWFRPX01BU0ssCVBPV0VSLAkJeyBSQSwgUkIgfSB9LAorCit7ICJsYnp1eCIsICAgWCgzMSwxMTkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAicG9wY250YiIsIFgoMzEsMTIyKSwgWFJCX01BU0ssCVBPV0VSNSwJCXsgUkEsIFJTIH0gfSwKKworeyAibm90IiwgICAgIFhSQygzMSwxMjQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCit7ICJub3IiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAibm90LiIsICAgIFhSQygzMSwxMjQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCit7ICJub3IuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJsd2FyeGUiLCAgWCgzMSwxMjYpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAibGJ6dXhlIiwgIFgoMzEsMTI3KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkFMLCBSQiB9IH0sCisKK3sgIndydGVlIiwgICBYKDMxLDEzMSksCVhSQVJCX01BU0ssCVBQQzQwMyB8IEJPT0tFLAl7IFJTIH0gfSwKKworeyAiZGNidHN0bHMiLFgoMzEsMTM0KSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LAorCit7ICJzdWJmZSIsICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzZmUiLCAgICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJmZS4iLCAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzZmUuIiwgICAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJmZW8iLCAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzZmVvIiwgICAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzdWJmZW8uIiwgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJzZmVvLiIsICAgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImFkZGUiLCAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFlIiwgICAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFkZGUuIiwgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFlLiIsICAgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFkZGVvIiwgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFlbyIsICAgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFkZGVvLiIsICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImFlby4iLCAgICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiZGNidHN0bHNlIixYKDMxLDE0MiksWF9NQVNLLAkJUFBDQ0hMSzY0LAl7IENULCBSQSwgUkIgfX0sCisKK3sgIm10b2NyZiIsICBYRlhNKDMxLDE0NCwwLDEpLCBYRlhGWE1fTUFTSywgQ09NLAl7IEZYTSwgUlMgfSB9LAoreyAibXRjciIsICAgIFhGWE0oMzEsMTQ0LDB4ZmYsMCksIFhSQVJCX01BU0ssIENPTSwJeyBSUyB9fSwKK3sgIm10Y3JmIiwgICBYKDMxLDE0NCksCVhGWEZYTV9NQVNLLAlDT00sCQl7IEZYTSwgUlMgfSB9LAorCit7ICJtdG1zciIsICAgWCgzMSwxNDYpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJTIH0gfSwKKworeyAic3RkeCIsICAgIFgoMzEsMTQ5KSwgWF9NQVNLLAkJUFBDNjQsCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAic3R3Y3guIiwgIFhSQygzMSwxNTAsMSksIFhfTUFTSywJUFBDLAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInN0d3giLCAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAoreyAic3R4IiwgICAgIFgoMzEsMTUxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKKworeyAic3R3Y3hlLiIsIFhSQygzMSwxNTgsMSksIFhfTUFTSywJQk9PS0U2NCwJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInN0d3hlIiwgICBYKDMxLDE1OSksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzbHEiLCAgICAgWFJDKDMxLDE1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNscS4iLCAgICBYUkMoMzEsMTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzbGUiLCAgICAgWFJDKDMxLDE1MywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsZS4iLCAgICBYUkMoMzEsMTUzLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJwcnR5dyIsICAgWCgzMSwxNTQpLAlYUkJfTUFTSywJUE9XRVI2LAkJeyBSQSwgUlMgfSB9LAorCit7ICJ3cnRlZWkiLCAgWCgzMSwxNjMpLAlYRV9NQVNLLAlQUEM0MDMgfCBCT09LRSwJeyBFIH0gfSwKKworeyAiZGNidGxzIiwgIFgoMzEsMTY2KSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LAoreyAiZGNidGxzZSIsIFgoMzEsMTc0KSwJWF9NQVNLLAkJUFBDQ0hMSzY0LAl7IENULCBSQSwgUkIgfX0sCisKK3sgIm10bXNyZCIsICBYKDMxLDE3OCksCVhSTEFSQl9NQVNLLAlQUEM2NCwJCXsgUlMsIEFfTCB9IH0sCisKK3sgInN0ZHV4IiwgICBYKDMxLDE4MSksCVhfTUFTSywJCVBQQzY0LAkJeyBSUywgUkFTLCBSQiB9IH0sCisKK3sgInN0d3V4IiwgICBYKDMxLDE4MyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBUywgUkIgfSB9LAoreyAic3R1eCIsICAgIFgoMzEsMTgzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInNsaXEiLCAgICBYUkMoMzEsMTg0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoreyAic2xpcS4iLCAgIFhSQygzMSwxODQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCisKK3sgInBydHlkIiwgICBYKDMxLDE4NiksCVhSQl9NQVNLLAlQT1dFUjYsCQl7IFJBLCBSUyB9IH0sCisKK3sgInN0d3V4ZSIsICBYKDMxLDE5MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBUywgUkIgfSB9LAorCit7ICJzdWJmemUiLCAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2Z6ZSIsICAgIFhPKDMxLDIwMCwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInN1YmZ6ZS4iLCBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzZnplLiIsICAgWE8oMzEsMjAwLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic3ViZnplbyIsIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmemVvIiwgICBYTygzMSwyMDAsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzdWJmemVvLiIsWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2Z6ZW8uIiwgIFhPKDMxLDIwMCwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKKworeyAiYWRkemUiLCAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImF6ZSIsICAgICBYTygzMSwyMDIsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhZGR6ZS4iLCAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYXplLiIsICAgIFhPKDMxLDIwMiwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFkZHplbyIsICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhemVvIiwgICAgWE8oMzEsMjAyLDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYWRkemVvLiIsIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImF6ZW8uIiwgICBYTygzMSwyMDIsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCisKK3sgIm10c3IiLCAgICBYKDMxLDIxMCksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFNSLCBSUyB9IH0sCisKK3sgInN0ZGN4LiIsICBYUkMoMzEsMjE0LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInN0YngiLCAgICBYKDMxLDIxNSksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzbGxxIiwgICAgWFJDKDMxLDIxNiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsbHEuIiwgICBYUkMoMzEsMjE2LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzbGVxIiwgICAgWFJDKDMxLDIxNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNsZXEuIiwgICBYUkMoMzEsMjE3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzdGJ4ZSIsICAgWCgzMSwyMjMpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAiaWNibGMiLCAgIFgoMzEsMjMwKSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LAorCit7ICJzdWJmbWUiLCAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2ZtZSIsICAgIFhPKDMxLDIzMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInN1YmZtZS4iLCBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzZm1lLiIsICAgWE8oMzEsMjMyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic3ViZm1lbyIsIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgInNmbWVvIiwgICBYTygzMSwyMzIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJzdWJmbWVvLiIsWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAic2ZtZW8uIiwgIFhPKDMxLDIzMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKKworeyAibXVsbGQiLCAgIFhPKDMxLDIzMywwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsZC4iLCAgWE8oMzEsMjMzLDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgIm11bGxkbyIsICBYTygzMSwyMzMsMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAibXVsbGRvLiIsIFhPKDMxLDIzMywxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImFkZG1lIiwgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhbWUiLCAgICAgWE8oMzEsMjM0LDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYWRkbWUuIiwgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFtZS4iLCAgICBYTygzMSwyMzQsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhZGRtZW8iLCAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoreyAiYW1lbyIsICAgIFhPKDMxLDIzNCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKK3sgImFkZG1lby4iLCBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCit7ICJhbWVvLiIsICAgWE8oMzEsMjM0LDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAorCit7ICJtdWxsdyIsICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxzIiwgICAgWE8oMzEsMjM1LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsdy4iLCAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxzLiIsICAgWE8oMzEsMjM1LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsd28iLCAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxzbyIsICAgWE8oMzEsMjM1LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxsd28uIiwgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJtdWxzby4iLCAgWE8oMzEsMjM1LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImljYmxjZSIsICBYKDMxLDIzOCksCVhfTUFTSywJCVBQQ0NITEs2NCwJeyBDVCwgUkEsIFJCIH19LAoreyAibXRzcmluIiwgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBQQzMyLAkJeyBSUywgUkIgfSB9LAoreyAibXRzcmkiLCAgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBPV0VSMzIsCXsgUlMsIFJCIH0gfSwKKworeyAiZGNidHN0IiwgIFgoMzEsMjQ2KSwJWF9NQVNLLAlQUEMsCQkJeyBDVCwgUkEsIFJCIH0gfSwKKworeyAic3RidXgiLCAgIFgoMzEsMjQ3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCisKK3sgInNsbGlxIiwgICBYUkMoMzEsMjQ4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoreyAic2xsaXEuIiwgIFhSQygzMSwyNDgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCisKK3sgImRjYnRzdGUiLCBYKDMxLDI1MyksCVhfTUFTSywJCUJPT0tFNjQsCXsgQ1QsIFJBLCBSQiB9IH0sCisKK3sgInN0YnV4ZSIsICBYKDMxLDI1NSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBUywgUkIgfSB9LAorCit7ICJtZmRjcngiLCAgWCgzMSwyNTkpLAlYX01BU0ssCQlCT09LRSwJCXsgUlMsIFJBIH0gfSwKKworeyAiZG96IiwgICAgIFhPKDMxLDI2NCwwLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRvei4iLCAgICBYTygzMSwyNjQsMCwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkb3pvIiwgICAgWE8oMzEsMjY0LDEsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZG96by4iLCAgIFhPKDMxLDI2NCwxLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiYWRkIiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4IiwgICAgIFhPKDMxLDI2NiwwLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkLiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4LiIsICAgIFhPKDMxLDI2NiwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkbyIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4byIsICAgIFhPKDMxLDI2NiwxLDApLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiYWRkby4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiY2F4by4iLCAgIFhPKDMxLDI2NiwxLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJ0bGJpZWwiLCAgWCgzMSwyNzQpLCBYUlRMUkFfTUFTSywJUE9XRVI0LAkJeyBSQiwgTCB9IH0sCisKK3sgIm1mYXBpZGkiLCBYKDMxLDI3NSksIFhfTUFTSywJCUJPT0tFLAkJeyBSVCwgUkEgfSB9LAorCit7ICJsc2NieCIsICAgWFJDKDMxLDI3NywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImxzY2J4LiIsICBYUkMoMzEsMjc3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJkY2J0IiwgICAgWCgzMSwyNzgpLAlYX01BU0ssCQlQUEMsCQl7IENULCBSQSwgUkIgfSB9LAorCit7ICJsaHp4IiwgICAgWCgzMSwyNzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAiZXF2IiwgICAgIFhSQygzMSwyODQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgImVxdi4iLCAgICBYUkMoMzEsMjg0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImRjYnRlIiwgICBYKDMxLDI4NiksCVhfTUFTSywJCUJPT0tFNjQsCXsgQ1QsIFJBLCBSQiB9IH0sCisKK3sgImxoenhlIiwgICBYKDMxLDI4NyksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJ0bGJpZSIsICAgWCgzMSwzMDYpLAlYUlRMUkFfTUFTSywJUFBDLAkJeyBSQiwgTCB9IH0sCit7ICJ0bGJpIiwgICAgWCgzMSwzMDYpLAlYUlRfTUFTSywJUE9XRVIsCQl7IFJBMCwgUkIgfSB9LAorCit7ICJlY2l3eCIsICAgWCgzMSwzMTApLCBYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJsaHp1eCIsICAgWCgzMSwzMTEpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAieG9yIiwgICAgIFhSQygzMSwzMTYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInhvci4iLCAgICBYUkMoMzEsMzE2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImxoenV4ZSIsICBYKDMxLDMxOSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBTCwgUkIgfSB9LAorCit7ICJtZmV4aXNyIiwgIFhTUFIoMzEsMzIzLDY0KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZXhpZXIiLCAgWFNQUigzMSwzMjMsNjYpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjAiLCAgICBYU1BSKDMxLDMyMywxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJyMSIsICAgIFhTUFIoMzEsMzIzLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYnIyIiwgICAgWFNQUigzMSwzMjMsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjMiLCAgICBYU1BSKDMxLDMyMywxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJyNCIsICAgIFhTUFIoMzEsMzIzLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYnI1IiwgICAgWFNQUigzMSwzMjMsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZicjYiLCAgICBYU1BSKDMxLDMyMywxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmJyNyIsICAgIFhTUFIoMzEsMzIzLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mYmVhciIsICAgWFNQUigzMSwzMjMsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZiZXNyIiwgICBYU1BSKDMxLDMyMywxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmlvY3IiLCAgIFhTUFIoMzEsMzIzLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3IwIiwgWFNQUigzMSwzMjMsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjdDAiLCBYU1BSKDMxLDMyMywxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWRhMCIsIFhTUFIoMzEsMzIzLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hc2EwIiwgWFNQUigzMSwzMjMsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjYzAiLCBYU1BSKDMxLDMyMywxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWNyMSIsIFhTUFIoMzEsMzIzLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3QxIiwgWFNQUigzMSwzMjMsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFkYTEiLCBYU1BSKDMxLDMyMywyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYXNhMSIsIFhTUFIoMzEsMzIzLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY2MxIiwgWFNQUigzMSwzMjMsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjcjIiLCBYU1BSKDMxLDMyMywyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWN0MiIsIFhTUFIoMzEsMzIzLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hZGEyIiwgWFNQUigzMSwzMjMsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFzYTIiLCBYU1BSKDMxLDMyMywyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWNjMiIsIFhTUFIoMzEsMzIzLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hY3IzIiwgWFNQUigzMSwzMjMsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjdDMiLCBYU1BSKDMxLDMyMywyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYWRhMyIsIFhTUFIoMzEsMzIzLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZG1hc2EzIiwgWFNQUigzMSwzMjMsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZkbWFjYzMiLCBYU1BSKDMxLDMyMywyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRtYXNyIiwgIFhTUFIoMzEsMzIzLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZGNyIiwgICAgWCgzMSwzMjMpLAlYX01BU0ssCVBQQzQwMyB8IEJPT0tFLAl7IFJULCBTUFIgfSB9LAorCit7ICJkaXYiLCAgICAgWE8oMzEsMzMxLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2LiIsICAgIFhPKDMxLDMzMSwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdm8iLCAgICBYTygzMSwzMzEsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZvLiIsICAgWE8oMzEsMzMxLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtZnBtciIsICAgWCgzMSwzMzQpLAlYX01BU0ssCQlQUENQTVIsCQl7IFJULCBQTVIgfX0sCisKK3sgIm1mbXEiLCAgICAgICBYU1BSKDMxLDMzOSwwKSwgICAgWFNQUl9NQVNLLCBNNjAxLAl7IFJUIH0gfSwKK3sgIm1meGVyIiwgICAgICBYU1BSKDMxLDMzOSwxKSwgICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAoreyAibWZydGN1IiwgICAgIFhTUFIoMzEsMzM5LDQpLCAgICBYU1BSX01BU0ssIENPTSwJeyBSVCB9IH0sCit7ICJtZnJ0Y2wiLCAgICAgWFNQUigzMSwzMzksNSksICAgIFhTUFJfTUFTSywgQ09NLAl7IFJUIH0gfSwKK3sgIm1mZGVjIiwgICAgICBYU1BSKDMxLDMzOSw2KSwgICAgWFNQUl9NQVNLLCBNRkRFQzEsCXsgUlQgfSB9LAoreyAibWZkZWMiLCAgICAgIFhTUFIoMzEsMzM5LDIyKSwgICBYU1BSX01BU0ssIE1GREVDMiwJeyBSVCB9IH0sCit7ICJtZmxyIiwgICAgICAgWFNQUigzMSwzMzksOCksICAgIFhTUFJfTUFTSywgQ09NLAl7IFJUIH0gfSwKK3sgIm1mY3RyIiwgICAgICBYU1BSKDMxLDMzOSw5KSwgICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAoreyAibWZ0aWQiLCAgICAgIFhTUFIoMzEsMzM5LDE3KSwgICBYU1BSX01BU0ssIFBPV0VSLAl7IFJUIH0gfSwKK3sgIm1mZHNpc3IiLCAgICBYU1BSKDMxLDMzOSwxOCksICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAoreyAibWZkYXIiLCAgICAgIFhTUFIoMzEsMzM5LDE5KSwgICBYU1BSX01BU0ssIENPTSwJeyBSVCB9IH0sCit7ICJtZnNkcjAiLCAgICAgWFNQUigzMSwzMzksMjQpLCAgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlQgfSB9LAoreyAibWZzZHIxIiwgICAgIFhTUFIoMzEsMzM5LDI1KSwgICBYU1BSX01BU0ssIENPTSwJeyBSVCB9IH0sCit7ICJtZnNycjAiLCAgICAgWFNQUigzMSwzMzksMjYpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJUIH0gfSwKK3sgIm1mc3JyMSIsICAgICBYU1BSKDMxLDMzOSwyNyksICAgWFNQUl9NQVNLLCBDT00sCXsgUlQgfSB9LAoreyAibWZjZmFyIiwgICAgIFhTUFIoMzEsMzM5LDI4KSwgICBYU1BSX01BU0ssIFBPV0VSNiwJeyBSVCB9IH0sCit7ICJtZnBpZCIsICAgICAgWFNQUigzMSwzMzksNDgpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZwaWQiLCAgICAgIFhTUFIoMzEsMzM5LDk0NSksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmNzcnIwIiwgICAgWFNQUigzMSwzMzksNTgpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZjc3JyMSIsICAgIFhTUFIoMzEsMzM5LDU5KSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1mZGVhciIsICAgICBYU1BSKDMxLDMzOSw2MSksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmRlYXIiLCAgICAgWFNQUigzMSwzMzksOTgxKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZXNyIiwgICAgICBYU1BSKDMxLDMzOSw2MiksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmVzciIsICAgICAgWFNQUigzMSwzMzksOTgwKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1maXZwciIsICAgICBYU1BSKDMxLDMzOSw2MyksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmNtcGEiLCAgICAgWFNQUigzMSwzMzksMTQ0KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY21wYiIsICAgICBYU1BSKDMxLDMzOSwxNDUpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjbXBjIiwgICAgIFhTUFIoMzEsMzM5LDE0NiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNtcGQiLCAgICAgWFNQUigzMSwzMzksMTQ3KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1maWNyIiwgICAgICBYU1BSKDMxLDMzOSwxNDgpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZkZXIiLCAgICAgIFhTUFIoMzEsMzM5LDE0OSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNvdW50YSIsICAgWFNQUigzMSwzMzksMTUwKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY291bnRiIiwgICBYU1BSKDMxLDMzOSwxNTEpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjbXBlIiwgICAgIFhTUFIoMzEsMzM5LDE1MiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmNtcGYiLCAgICAgWFNQUigzMSwzMzksMTUzKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mY21wZyIsICAgICBYU1BSKDMxLDMzOSwxNTQpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZjbXBoIiwgICAgIFhTUFIoMzEsMzM5LDE1NSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmxjdHJsMSIsICAgWFNQUigzMSwzMzksMTU2KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbGN0cmwyIiwgICBYU1BSKDMxLDMzOSwxNTcpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpY3RybCIsICAgIFhTUFIoMzEsMzM5LDE1OCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmJhciIsICAgICAgWFNQUigzMSwzMzksMTU5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mdnJzYXZlIiwgICBYU1BSKDMxLDMzOSwyNTYpLCAgWFNQUl9NQVNLLCBQUENWRUMsCXsgUlQgfSB9LAoreyAibWZ1c3ByZzAiLCAgIFhTUFIoMzEsMzM5LDI1NiksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1mdGIiLCAgICAgICBYKDMxLDM3MSksCSAgIFhfTUFTSywgICAgQ0xBU1NJQywJeyBSVCwgVEJSIH0gfSwKK3sgIm1mdGIiLCAgICAgICBYU1BSKDMxLDMzOSwyNjgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZnRibCIsICAgICAgWFNQUigzMSwzNzEsMjY4KSwgIFhTUFJfTUFTSywgQ0xBU1NJQywJeyBSVCB9IH0sCit7ICJtZnRibCIsICAgICAgWFNQUigzMSwzMzksMjY4KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZ0YnUiLCAgICAgIFhTUFIoMzEsMzcxLDI2OSksICBYU1BSX01BU0ssIENMQVNTSUMsCXsgUlQgfSB9LAoreyAibWZ0YnUiLCAgICAgIFhTUFIoMzEsMzM5LDI2OSksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1mc3ByZyIsICAgICBYU1BSKDMxLDMzOSwyNTYpLCAgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKK3sgIm1mc3ByZzAiLCAgICBYU1BSKDMxLDMzOSwyNzIpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAoreyAibWZzcHJnMSIsICAgIFhTUFIoMzEsMzM5LDI3MyksICBYU1BSX01BU0ssIFBQQywJeyBSVCB9IH0sCit7ICJtZnNwcmcyIiwgICAgWFNQUigzMSwzMzksMjc0KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKK3sgIm1mc3ByZzMiLCAgICBYU1BSKDMxLDMzOSwyNzUpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlQgfSB9LAoreyAibWZzcHJnNCIsICAgIFhTUFIoMzEsMzM5LDI2MCksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLAl7IFJUIH0gfSwKK3sgIm1mc3ByZzUiLCAgICBYU1BSKDMxLDMzOSwyNjEpLCAgWFNQUl9NQVNLLCBQUEM0MDUgfCBCT09LRSwJeyBSVCB9IH0sCit7ICJtZnNwcmc2IiwgICAgWFNQUigzMSwzMzksMjYyKSwgIFhTUFJfTUFTSywgUFBDNDA1IHwgQk9PS0UsCXsgUlQgfSB9LAoreyAibWZzcHJnNyIsICAgIFhTUFIoMzEsMzM5LDI2MyksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLAl7IFJUIH0gfSwKK3sgIm1mYXNyIiwgICAgICBYU1BSKDMxLDMzOSwyODApLCAgWFNQUl9NQVNLLCBQUEM2NCwJeyBSVCB9IH0sCit7ICJtZmVhciIsICAgICAgWFNQUigzMSwzMzksMjgyKSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKK3sgIm1mcGlyIiwgICAgICBYU1BSKDMxLDMzOSwyODYpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZnB2ciIsICAgICAgWFNQUigzMSwzMzksMjg3KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJUIH0gfSwKK3sgIm1mZGJzciIsICAgICBYU1BSKDMxLDMzOSwzMDQpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmRic3IiLCAgICAgWFNQUigzMSwzMzksMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mZGJjcjAiLCAgICBYU1BSKDMxLDMzOSwzMDgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmRiY3IwIiwgICAgWFNQUigzMSwzMzksMTAxMCksIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJUIH0gfSwKK3sgIm1mZGJjcjEiLCAgICBYU1BSKDMxLDMzOSwzMDkpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmRiY3IxIiwgICAgWFNQUigzMSwzMzksOTU3KSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJUIH0gfSwKK3sgIm1mZGJjcjIiLCAgICBYU1BSKDMxLDMzOSwzMTApLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZmlhYzEiLCAgICAgWFNQUigzMSwzMzksMzEyKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpYWMxIiwgICAgIFhTUFIoMzEsMzM5LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmlhYzIiLCAgICAgWFNQUigzMSwzMzksMzEzKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpYWMyIiwgICAgIFhTUFIoMzEsMzM5LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmlhYzMiLCAgICAgWFNQUigzMSwzMzksMzE0KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpYWMzIiwgICAgIFhTUFIoMzEsMzM5LDk0OCksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCit7ICJtZmlhYzQiLCAgICAgWFNQUigzMSwzMzksMzE1KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpYWM0IiwgICAgIFhTUFIoMzEsMzM5LDk0OSksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCit7ICJtZmRhYzEiLCAgICAgWFNQUigzMSwzMzksMzE2KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZkYWMxIiwgICAgIFhTUFIoMzEsMzM5LDEwMTQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmRhYzIiLCAgICAgWFNQUigzMSwzMzksMzE3KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZkYWMyIiwgICAgIFhTUFIoMzEsMzM5LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmR2YzEiLCAgICAgWFNQUigzMSwzMzksMzE4KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZkdmMxIiwgICAgIFhTUFIoMzEsMzM5LDk1MCksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCit7ICJtZmR2YzIiLCAgICAgWFNQUigzMSwzMzksMzE5KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZkdmMyIiwgICAgIFhTUFIoMzEsMzM5LDk1MSksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCit7ICJtZnRzciIsICAgICAgWFNQUigzMSwzMzksMzM2KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZ0c3IiLCAgICAgIFhTUFIoMzEsMzM5LDk4NCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnRjciIsICAgICAgWFNQUigzMSwzMzksMzQwKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZ0Y3IiLCAgICAgIFhTUFIoMzEsMzM5LDk4NiksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZml2b3IwIiwgICAgWFNQUigzMSwzMzksNDAwKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpdm9yMSIsICAgIFhTUFIoMzEsMzM5LDQwMSksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1maXZvcjIiLCAgICBYU1BSKDMxLDMzOSw0MDIpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZml2b3IzIiwgICAgWFNQUigzMSwzMzksNDAzKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpdm9yNCIsICAgIFhTUFIoMzEsMzM5LDQwNCksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1maXZvcjUiLCAgICBYU1BSKDMxLDMzOSw0MDUpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZml2b3I2IiwgICAgWFNQUigzMSwzMzksNDA2KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpdm9yNyIsICAgIFhTUFIoMzEsMzM5LDQwNyksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1maXZvcjgiLCAgICBYU1BSKDMxLDMzOSw0MDgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZml2b3I5IiwgICAgWFNQUigzMSwzMzksNDA5KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpdm9yMTAiLCAgIFhTUFIoMzEsMzM5LDQxMCksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1maXZvcjExIiwgICBYU1BSKDMxLDMzOSw0MTEpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZml2b3IxMiIsICAgWFNQUigzMSwzMzksNDEyKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZpdm9yMTMiLCAgIFhTUFIoMzEsMzM5LDQxMyksICBYU1BSX01BU0ssIEJPT0tFLCAgICB7IFJUIH0gfSwKK3sgIm1maXZvcjE0IiwgICBYU1BSKDMxLDMzOSw0MTQpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgeyBSVCB9IH0sCit7ICJtZml2b3IxNSIsICAgWFNQUigzMSwzMzksNDE1KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgIHsgUlQgfSB9LAoreyAibWZzcGVmc2NyIiwgIFhTUFIoMzEsMzM5LDUxMiksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSVCB9IH0sCit7ICJtZmJiZWFyIiwgICAgWFNQUigzMSwzMzksNTEzKSwgIFhTUFJfTUFTSywgUFBDQlJMSywgIHsgUlQgfSB9LAoreyAibWZiYnRhciIsICAgIFhTUFIoMzEsMzM5LDUxNCksICBYU1BSX01BU0ssIFBQQ0JSTEssICB7IFJUIH0gfSwKK3sgIm1maXZvcjMyIiwgICBYU1BSKDMxLDMzOSw1MjgpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlQgfSB9LAoreyAibWZpdm9yMzMiLCAgIFhTUFIoMzEsMzM5LDUyOSksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSVCB9IH0sCit7ICJtZml2b3IzNCIsICAgWFNQUigzMSwzMzksNTMwKSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJUIH0gfSwKK3sgIm1maXZvcjM1IiwgICBYU1BSKDMxLDMzOSw1MzEpLCAgWFNQUl9NQVNLLCBQUENQTVIsCXsgUlQgfSB9LAoreyAibWZpYmF0dSIsICAgIFhTUFIoMzEsMzM5LDUyOCksICBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKK3sgIm1maWJhdGwiLCAgICBYU1BSKDMxLDMzOSw1MjkpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCit7ICJtZmRiYXR1IiwgICAgWFNQUigzMSwzMzksNTM2KSwgIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoreyAibWZkYmF0bCIsICAgIFhTUFIoMzEsMzM5LDUzNyksICBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKK3sgIm1maWNfY3N0IiwgICBYU1BSKDMxLDMzOSw1NjApLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpY19hZHIiLCAgIFhTUFIoMzEsMzM5LDU2MSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZmljX2RhdCIsICAgWFNQUigzMSwzMzksNTYyKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mZGNfY3N0IiwgICBYU1BSKDMxLDMzOSw1NjgpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZkY19hZHIiLCAgIFhTUFIoMzEsMzM5LDU2OSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1jc3JyMCIsICAgWFNQUigzMSwzMzksNTcwKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksIHsgUlQgfSB9LAoreyAibWZkY19kYXQiLCAgIFhTUFIoMzEsMzM5LDU3MCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1jc3JyMSIsICAgWFNQUigzMSwzMzksNTcxKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksIHsgUlQgfSB9LAoreyAibWZtY3NyIiwgICAgIFhTUFIoMzEsMzM5LDU3MiksICBYU1BSX01BU0ssIFBQQ1JGTUNJLCB7IFJUIH0gfSwKK3sgIm1mbWNhciIsICAgICBYU1BSKDMxLDMzOSw1NzMpLCAgWFNQUl9NQVNLLCBQUENSRk1DSSwgeyBSVCB9IH0sCit7ICJtZmRwZHIiLCAgICAgWFNQUigzMSwzMzksNjMwKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mZHBpciIsICAgICBYU1BSKDMxLDMzOSw2MzEpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZpbW1yIiwgICAgIFhTUFIoMzEsMzM5LDYzOCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX2N0ciIsICAgWFNQUigzMSwzMzksNzg0KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfYXAiLCAgICBYU1BSKDMxLDMzOSw3ODYpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtaV9lcG4iLCAgIFhTUFIoMzEsMzM5LDc4NyksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX3R3YyIsICAgWFNQUigzMSwzMzksNzg5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfcnBuIiwgICBYU1BSKDMxLDMzOSw3OTApLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9jdHIiLCAgIFhTUFIoMzEsMzM5LDc5MiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1fY2FzaWQiLCAgWFNQUigzMSwzMzksNzkzKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfYXAiLCAgICBYU1BSKDMxLDMzOSw3OTQpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9lcG4iLCAgIFhTUFIoMzEsMzM5LDc5NSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1kX3R3YiIsICAgWFNQUigzMSwzMzksNzk2KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfdHdjIiwgICBYU1BSKDMxLDMzOSw3OTcpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9ycG4iLCAgIFhTUFIoMzEsMzM5LDc5OCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1fdHciLCAgICAgWFNQUigzMSwzMzksNzk5KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWlfZGJjYW0iLCBYU1BSKDMxLDMzOSw4MTYpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtaV9kYnJhbTAiLFhTUFIoMzEsMzM5LDgxNyksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1pX2RicmFtMSIsWFNQUigzMSwzMzksODE4KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mbWRfZGJjYW0iLCBYU1BSKDMxLDMzOSw4MjQpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoreyAibWZtZF9kYnJhbTAiLFhTUFIoMzEsMzM5LDgyNSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCit7ICJtZm1kX2RicmFtMSIsWFNQUigzMSwzMzksODI2KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKK3sgIm1mdW1tY3IwIiwgICBYU1BSKDMxLDMzOSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnVwbWMxIiwgICAgWFNQUigzMSwzMzksOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgIHsgUlQgfSB9LAoreyAibWZ1cG1jMiIsICAgIFhTUFIoMzEsMzM5LDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwgICB7IFJUIH0gfSwKK3sgIm1mdXNpYSIsICAgICBYU1BSKDMxLDMzOSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnVtbWNyMSIsICAgWFNQUigzMSwzMzksOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgIHsgUlQgfSB9LAoreyAibWZ1cG1jMyIsICAgIFhTUFIoMzEsMzM5LDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwgICB7IFJUIH0gfSwKK3sgIm1mdXBtYzQiLCAgICBYU1BSKDMxLDMzOSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnpwciIsICAgCVhTUFIoMzEsMzM5LDk0NCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmNjcjAiLCAgCVhTUFIoMzEsMzM5LDk0NyksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSVCB9IH0sCit7ICJtZm1tY3IwIiwJWFNQUigzMSwzMzksOTUyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mcG1jMSIsCVhTUFIoMzEsMzM5LDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnNnciIsCVhTUFIoMzEsMzM5LDk1MyksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnBtYzIiLAlYU1BSKDMxLDMzOSw5NTQpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoreyAibWZkY3dyIiwgCVhTUFIoMzEsMzM5LDk1NCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnNpYSIsCVhTUFIoMzEsMzM5LDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnNsZXIiLAlYU1BSKDMxLDMzOSw5NTUpLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlQgfSB9LAoreyAibWZtbWNyMSIsCVhTUFIoMzEsMzM5LDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZnN1MHIiLAlYU1BSKDMxLDMzOSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlQgfSB9LAoreyAibWZwbWMzIiwJWFNQUigzMSwzMzksOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKK3sgIm1mcG1jNCIsCVhTUFIoMzEsMzM5LDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCit7ICJtZmljZGJkciIsICAgWFNQUigzMSwzMzksOTc5KSwgIFhTUFJfTUFTSywgUFBDNDAzLCAgIHsgUlQgfSB9LAoreyAibWZldnByIiwgICAgIFhTUFIoMzEsMzM5LDk4MiksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmNkYmNyIiwgICAgWFNQUigzMSwzMzksOTgzKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mcGl0IiwgICAgICBYU1BSKDMxLDMzOSw5ODcpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZ0YmhpIiwgICAgIFhTUFIoMzEsMzM5LDk4OCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZnRibG8iLCAgICAgWFNQUigzMSwzMzksOTg5KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mc3JyMiIsICAgICBYU1BSKDMxLDMzOSw5OTApLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoreyAibWZzcnIzIiwgICAgIFhTUFIoMzEsMzM5LDk5MSksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmwyY3IiLCAgICAgWFNQUigzMSwzMzksMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLCAgIHsgUlQgfSB9LAoreyAibWZkY2NyIiwgICAgIFhTUFIoMzEsMzM5LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCit7ICJtZmljY3IiLCAgICAgWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1maWN0YyIsICAgICBYU1BSKDMxLDMzOSwxMDE5KSwgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnBibDEiLCAgICAgWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mdGhybTEiLCAgICBYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnBidTEiLCAgICAgWFNQUigzMSwzMzksMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mdGhybTIiLCAgICBYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnBibDIiLCAgICAgWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mdGhybTMiLCAgICBYU1BSKDMxLDMzOSwxMDIyKSwgWFNQUl9NQVNLLCBQUEM3NTAsICAgeyBSVCB9IH0sCit7ICJtZnBidTIiLCAgICAgWFNQUigzMSwzMzksMTAyMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKK3sgIm1mc3ByIiwgICAgICBYKDMxLDMzOSksCSAgIFhfTUFTSywgICAgQ09NLAl7IFJULCBTUFIgfSB9LAorCit7ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJkc3QiLCAgICAgWERTUygzMSwzNDIsMCksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBSQSwgUkIsIFNUUk0gfSB9LAoreyAiZHN0dCIsICAgIFhEU1MoMzEsMzQyLDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgUkEsIFJCLCBTVFJNIH0gfSwKKworeyAibGhheCIsICAgIFgoMzEsMzQzKSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgImxoYXhlIiwgICBYKDMxLDM1MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJkc3RzdCIsICAgWERTUygzMSwzNzQsMCksIFhEU1NfTUFTSywJUFBDVkVDLAkJeyBSQSwgUkIsIFNUUk0gfSB9LAoreyAiZHN0c3R0IiwgIFhEU1MoMzEsMzc0LDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgUkEsIFJCLCBTVFJNIH0gfSwKKworeyAiZGNjY2kiLCAgIFgoMzEsNDU0KSwJWFJUX01BU0ssCVBQQzQwM3xQUEM0NDAsCXsgUkEsIFJCIH0gfSwKKworeyAiYWJzIiwgICAgIFhPKDMxLDM2MCwwLDApLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCit7ICJhYnMuIiwgICAgWE8oMzEsMzYwLDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKK3sgImFic28iLCAgICBYTygzMSwzNjAsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoreyAiYWJzby4iLCAgIFhPKDMxLDM2MCwxLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCisKK3sgImRpdnMiLCAgICBYTygzMSwzNjMsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZzLiIsICAgWE8oMzEsMzYzLDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2c28iLCAgIFhPKDMxLDM2MywxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdnNvLiIsICBYTygzMSwzNjMsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgInRsYmlhIiwgICBYKDMxLDM3MCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCisKK3sgImx3YXV4IiwgICBYKDMxLDM3MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCisKK3sgImxoYXV4IiwgICBYKDMxLDM3NSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAorCit7ICJsaGF1eGUiLCAgWCgzMSwzODMpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQUwsIFJCIH0gfSwKKworeyAibXRkY3J4IiwgIFgoMzEsMzg3KSwJWF9NQVNLLAkJQk9PS0UsCQl7IFJBLCBSUyB9IH0sCisKK3sgImRjYmxjIiwgICBYKDMxLDM5MCksCVhfTUFTSywJCVBQQ0NITEssCXsgQ1QsIFJBLCBSQiB9fSwKKworeyAic3ViZmU2NCIsIFhPKDMxLDM5MiwwLDApLCBYT19NQVNLLAlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAoreyAic3ViZmU2NG8iLFhPKDMxLDM5MiwxLDApLCBYT19NQVNLLAlCT09LRTY0LAl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJhZGRlNjQiLCAgWE8oMzEsMzk0LDAsMCksIFhPX01BU0ssCUJPT0tFNjQsCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJhZGRlNjRvIiwgWE8oMzEsMzk0LDEsMCksIFhPX01BU0ssCUJPT0tFNjQsCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImRjYmxjZSIsICBYKDMxLDM5OCksCVhfTUFTSywJCVBQQ0NITEs2NCwJeyBDVCwgUkEsIFJCIH19LAorCit7ICJzbGJtdGUiLCAgWCgzMSw0MDIpLCBYUkFfTUFTSywJUFBDNjQsCQl7IFJTLCBSQiB9IH0sCisKK3sgInN0aHgiLCAgICBYKDMxLDQwNyksCVhfTUFTSywJCUNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJjbXBiIiwgICAgWCgzMSw1MDgpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJsZnF4IiwgICAgWCgzMSw3OTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKKworeyAibGZkcHgiLCAgIFgoMzEsNzkxKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBGUlQsIFJBLCBSQiB9IH0sCisKK3sgImxmcXV4IiwgICBYKDMxLDgyMyksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJULCBSQSwgUkIgfSB9LAorCit7ICJzdGZxeCIsICAgWCgzMSw5MTkpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKKworeyAic3RmZHB4IiwgIFgoMzEsOTE5KSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBGUlMsIFJBLCBSQiB9IH0sCisKK3sgInN0ZnF1eCIsICBYKDMxLDk1MSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAorCit7ICJvcmMiLCAgICAgWFJDKDMxLDQxMiwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAib3JjLiIsICAgIFhSQygzMSw0MTIsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAic3JhZGkiLCAgIFhTKDMxLDQxMywwKSwgWFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKK3sgInNyYWRpLiIsICBYUygzMSw0MTMsMSksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCisKK3sgInN0aHhlIiwgICBYKDMxLDQxNSksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzbGJpZSIsICAgWCgzMSw0MzQpLAlYUlRSQV9NQVNLLAlQUEM2NCwJCXsgUkIgfSB9LAorCit7ICJlY293eCIsICAgWCgzMSw0MzgpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJzdGh1eCIsICAgWCgzMSw0MzkpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKKworeyAic3RodXhlIiwgIFgoMzEsNDQ3KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkFTLCBSQiB9IH0sCisKK3sgImNjdHBsIiwgICAweDdjMjEwYjc4LCAgICAweGZmZmZmZmZmLAlDRUxMLAkJeyAwIH19LAoreyAiY2N0cG0iLCAgIDB4N2M0MjEzNzgsICAgIDB4ZmZmZmZmZmYsCUNFTEwsCQl7IDAgfX0sCit7ICJjY3RwaCIsICAgMHg3YzYzMWI3OCwgICAgMHhmZmZmZmZmZiwJQ0VMTCwJCXsgMCB9fSwKK3sgImRiOGN5YyIsICAweDdmOWNlMzc4LCAgICAweGZmZmZmZmZmLAlDRUxMLAkJeyAwIH19LAoreyAiZGIxMGN5YyIsIDB4N2ZiZGViNzgsICAgIDB4ZmZmZmZmZmYsCUNFTEwsCQl7IDAgfX0sCit7ICJkYjEyY3ljIiwgMHg3ZmRlZjM3OCwgICAgMHhmZmZmZmZmZiwJQ0VMTCwJCXsgMCB9fSwKK3sgImRiMTZjeWMiLCAweDdmZmZmYjc4LCAgICAweGZmZmZmZmZmLAlDRUxMLAkJeyAwIH19LAoreyAibXIiLAkgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCit7ICJvciIsICAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAibXIuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCit7ICJvci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJtdGV4aXNyIiwgIFhTUFIoMzEsNDUxLDY0KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZXhpZXIiLCAgWFNQUigzMSw0NTEsNjYpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRicjAiLCAgICBYU1BSKDMxLDQ1MSwxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGJyMSIsICAgIFhTUFIoMzEsNDUxLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10YnIyIiwgICAgWFNQUigzMSw0NTEsMTMwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRicjMiLCAgICBYU1BSKDMxLDQ1MSwxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGJyNCIsICAgIFhTUFIoMzEsNDUxLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10YnI1IiwgICAgWFNQUigzMSw0NTEsMTMzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRicjYiLCAgICBYU1BSKDMxLDQ1MSwxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGJyNyIsICAgIFhTUFIoMzEsNDUxLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10YmVhciIsICAgWFNQUigzMSw0NTEsMTQ0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRiZXNyIiwgICBYU1BSKDMxLDQ1MSwxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGlvY3IiLCAgIFhTUFIoMzEsNDUxLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hY3IwIiwgWFNQUigzMSw0NTEsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFjdDAiLCBYU1BSKDMxLDQ1MSwxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYWRhMCIsIFhTUFIoMzEsNDUxLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hc2EwIiwgWFNQUigzMSw0NTEsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFjYzAiLCBYU1BSKDMxLDQ1MSwxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYWNyMSIsIFhTUFIoMzEsNDUxLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hY3QxIiwgWFNQUigzMSw0NTEsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFkYTEiLCBYU1BSKDMxLDQ1MSwyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYXNhMSIsIFhTUFIoMzEsNDUxLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hY2MxIiwgWFNQUigzMSw0NTEsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFjcjIiLCBYU1BSKDMxLDQ1MSwyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYWN0MiIsIFhTUFIoMzEsNDUxLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hZGEyIiwgWFNQUigzMSw0NTEsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFzYTIiLCBYU1BSKDMxLDQ1MSwyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYWNjMiIsIFhTUFIoMzEsNDUxLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hY3IzIiwgWFNQUigzMSw0NTEsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFjdDMiLCBYU1BSKDMxLDQ1MSwyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYWRhMyIsIFhTUFIoMzEsNDUxLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZG1hc2EzIiwgWFNQUigzMSw0NTEsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkbWFjYzMiLCBYU1BSKDMxLDQ1MSwyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGRtYXNyIiwgIFhTUFIoMzEsNDUxLDIyNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10ZGNyIiwgICAgWCgzMSw0NTEpLAlYX01BU0ssCVBQQzQwMyB8IEJPT0tFLAl7IFNQUiwgUlMgfSB9LAorCit7ICJzdWJmemU2NCIsWE8oMzEsNDU2LDAsMCksIFhPUkJfTUFTSywgQk9PS0U2NCwJeyBSVCwgUkEgfSB9LAoreyAic3ViZnplNjRvIixYTygzMSw0NTYsMSwwKSwgWE9SQl9NQVNLLCBCT09LRTY0LAl7IFJULCBSQSB9IH0sCisKK3sgImRpdmR1IiwgICBYTygzMSw0NTcsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2ZHUuIiwgIFhPKDMxLDQ1NywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZkdW8iLCAgWE8oMzEsNDU3LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdmR1by4iLCBYTygzMSw0NTcsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJhZGR6ZTY0IiwgWE8oMzEsNDU4LDAsMCksIFhPUkJfTUFTSywgQk9PS0U2NCwJeyBSVCwgUkEgfSB9LAoreyAiYWRkemU2NG8iLFhPKDMxLDQ1OCwxLDApLCBYT1JCX01BU0ssIEJPT0tFNjQsCXsgUlQsIFJBIH0gfSwKKworeyAiZGl2d3UiLCAgIFhPKDMxLDQ1OSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2d3UuIiwgIFhPKDMxLDQ1OSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2d3VvIiwgIFhPKDMxLDQ1OSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2d3VvLiIsIFhPKDMxLDQ1OSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAorCit7ICJtdG1xIiwgICAgICBYU1BSKDMxLDQ2NywwKSwgICAgWFNQUl9NQVNLLCBNNjAxLAl7IFJTIH0gfSwKK3sgIm10eGVyIiwgICAgIFhTUFIoMzEsNDY3LDEpLCAgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCit7ICJtdGxyIiwgICAgICBYU1BSKDMxLDQ2Nyw4KSwgICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAoreyAibXRjdHIiLCAgICAgWFNQUigzMSw0NjcsOSksICAgIFhTUFJfTUFTSywgQ09NLAl7IFJTIH0gfSwKK3sgIm10dGlkIiwgICAgIFhTUFIoMzEsNDY3LDE3KSwgICBYU1BSX01BU0ssIFBPV0VSLAl7IFJTIH0gfSwKK3sgIm10ZHNpc3IiLCAgIFhTUFIoMzEsNDY3LDE4KSwgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCit7ICJtdGRhciIsICAgICBYU1BSKDMxLDQ2NywxOSksICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAoreyAibXRydGN1IiwgICAgWFNQUigzMSw0NjcsMjApLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJTIH0gfSwKK3sgIm10cnRjbCIsICAgIFhTUFIoMzEsNDY3LDIxKSwgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCit7ICJtdGRlYyIsICAgICBYU1BSKDMxLDQ2NywyMiksICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAoreyAibXRzZHIwIiwgICAgWFNQUigzMSw0NjcsMjQpLCAgIFhTUFJfTUFTSywgUE9XRVIsCXsgUlMgfSB9LAoreyAibXRzZHIxIiwgICAgWFNQUigzMSw0NjcsMjUpLCAgIFhTUFJfTUFTSywgQ09NLAl7IFJTIH0gfSwKK3sgIm10c3JyMCIsICAgIFhTUFIoMzEsNDY3LDI2KSwgICBYU1BSX01BU0ssIENPTSwJeyBSUyB9IH0sCit7ICJtdHNycjEiLCAgICBYU1BSKDMxLDQ2NywyNyksICAgWFNQUl9NQVNLLCBDT00sCXsgUlMgfSB9LAoreyAibXRjZmFyIiwgICAgWFNQUigzMSw0NjcsMjgpLCAgIFhTUFJfTUFTSywgUE9XRVI2LAl7IFJTIH0gfSwKK3sgIm10cGlkIiwgICAgIFhTUFIoMzEsNDY3LDQ4KSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdHBpZCIsICAgICBYU1BSKDMxLDQ2Nyw5NDUpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkZWNhciIsICAgWFNQUigzMSw0NjcsNTQpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10Y3NycjAiLCAgIFhTUFIoMzEsNDY3LDU4KSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGNzcnIxIiwgICBYU1BSKDMxLDQ2Nyw1OSksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRkZWFyIiwgICAgWFNQUigzMSw0NjcsNjEpLCAgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10ZGVhciIsICAgIFhTUFIoMzEsNDY3LDk4MSksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGVzciIsICAgICBYU1BSKDMxLDQ2Nyw2MiksICAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRlc3IiLCAgICAgWFNQUigzMSw0NjcsOTgwKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10aXZwciIsICAgIFhTUFIoMzEsNDY3LDYzKSwgICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGNtcGEiLCAgICBYU1BSKDMxLDQ2NywxNDQpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXRjbXBiIiwgICAgWFNQUigzMSw0NjcsMTQ1KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKK3sgIm10Y21wYyIsICAgIFhTUFIoMzEsNDY3LDE0NiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSUyB9IH0sCit7ICJtdGNtcGQiLCAgICBYU1BSKDMxLDQ2NywxNDcpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXRpY3IiLCAgICAgWFNQUigzMSw0NjcsMTQ4KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKK3sgIm10ZGVyIiwgICAgIFhTUFIoMzEsNDY3LDE0OSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSUyB9IH0sCit7ICJtdGNvdW50YSIsICBYU1BSKDMxLDQ2NywxNTApLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXRjb3VudGIiLCAgWFNQUigzMSw0NjcsMTUxKSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKK3sgIm10Y21wZSIsICAgIFhTUFIoMzEsNDY3LDE1MiksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSUyB9IH0sCit7ICJtdGNtcGYiLCAgICBYU1BSKDMxLDQ2NywxNTMpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXRjbXBnIiwgICAgWFNQUigzMSw0NjcsMTU0KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKK3sgIm10Y21waCIsICAgIFhTUFIoMzEsNDY3LDE1NSksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSUyB9IH0sCit7ICJtdGxjdHJsMSIsICBYU1BSKDMxLDQ2NywxNTYpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXRsY3RybDIiLCAgWFNQUigzMSw0NjcsMTU3KSwgIFhTUFJfTUFTSywgUFBDODYwLAl7IFJTIH0gfSwKK3sgIm10aWN0cmwiLCAgIFhTUFIoMzEsNDY3LDE1OCksICBYU1BSX01BU0ssIFBQQzg2MCwJeyBSUyB9IH0sCit7ICJtdGJhciIsICAgICBYU1BSKDMxLDQ2NywxNTkpLCAgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlMgfSB9LAoreyAibXR2cnNhdmUiLCAgWFNQUigzMSw0NjcsMjU2KSwgIFhTUFJfTUFTSywgUFBDVkVDLAl7IFJTIH0gfSwKK3sgIm10dXNwcmcwIiwgIFhTUFIoMzEsNDY3LDI1NiksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdHNwcmciLCAgICBYU1BSKDMxLDQ2NywyNTYpLCAgWFNQUkdfTUFTSyxQUEMsCXsgU1BSRywgUlMgfSB9LAoreyAibXRzcHJnMCIsICAgWFNQUigzMSw0NjcsMjcyKSwgIFhTUFJfTUFTSywgUFBDLAl7IFJTIH0gfSwKK3sgIm10c3ByZzEiLCAgIFhTUFIoMzEsNDY3LDI3MyksICBYU1BSX01BU0ssIFBQQywJeyBSUyB9IH0sCit7ICJtdHNwcmcyIiwgICBYU1BSKDMxLDQ2NywyNzQpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlMgfSB9LAoreyAibXRzcHJnMyIsICAgWFNQUigzMSw0NjcsMjc1KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJTIH0gfSwKK3sgIm10c3ByZzQiLCAgIFhTUFIoMzEsNDY3LDI3NiksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLCB7IFJTIH0gfSwKK3sgIm10c3ByZzUiLCAgIFhTUFIoMzEsNDY3LDI3NyksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLCB7IFJTIH0gfSwKK3sgIm10c3ByZzYiLCAgIFhTUFIoMzEsNDY3LDI3OCksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLCB7IFJTIH0gfSwKK3sgIm10c3ByZzciLCAgIFhTUFIoMzEsNDY3LDI3OSksICBYU1BSX01BU0ssIFBQQzQwNSB8IEJPT0tFLCB7IFJTIH0gfSwKK3sgIm10YXNyIiwgICAgIFhTUFIoMzEsNDY3LDI4MCksICBYU1BSX01BU0ssIFBQQzY0LAl7IFJTIH0gfSwKK3sgIm10ZWFyIiwgICAgIFhTUFIoMzEsNDY3LDI4MiksICBYU1BSX01BU0ssIFBQQywJeyBSUyB9IH0sCit7ICJtdHRibCIsICAgICBYU1BSKDMxLDQ2NywyODQpLCAgWFNQUl9NQVNLLCBQUEMsCXsgUlMgfSB9LAoreyAibXR0YnUiLCAgICAgWFNQUigzMSw0NjcsMjg1KSwgIFhTUFJfTUFTSywgUFBDLAl7IFJTIH0gfSwKK3sgIm10ZGJzciIsICAgIFhTUFIoMzEsNDY3LDMwNCksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGRic3IiLCAgICBYU1BSKDMxLDQ2NywxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkYmNyMCIsICAgWFNQUigzMSw0NjcsMzA4KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10ZGJjcjAiLCAgIFhTUFIoMzEsNDY3LDEwMTApLCBYU1BSX01BU0ssIFBQQzQwNSwJeyBSUyB9IH0sCit7ICJtdGRiY3IxIiwgICBYU1BSKDMxLDQ2NywzMDkpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRkYmNyMSIsICAgWFNQUigzMSw0NjcsOTU3KSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJTIH0gfSwKK3sgIm10ZGJjcjIiLCAgIFhTUFIoMzEsNDY3LDMxMCksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGlhYzEiLCAgICBYU1BSKDMxLDQ2NywzMTIpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpYWMxIiwgICAgWFNQUigzMSw0NjcsMTAxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10aWFjMiIsICAgIFhTUFIoMzEsNDY3LDMxMyksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGlhYzIiLCAgICBYU1BSKDMxLDQ2NywxMDEzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRpYWMzIiwgICAgWFNQUigzMSw0NjcsMzE0KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aWFjMyIsICAgIFhTUFIoMzEsNDY3LDk0OCksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSUyB9IH0sCit7ICJtdGlhYzQiLCAgICBYU1BSKDMxLDQ2NywzMTUpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpYWM0IiwgICAgWFNQUigzMSw0NjcsOTQ5KSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJTIH0gfSwKK3sgIm10ZGFjMSIsICAgIFhTUFIoMzEsNDY3LDMxNiksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGRhYzEiLCAgICBYU1BSKDMxLDQ2NywxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRkYWMyIiwgICAgWFNQUigzMSw0NjcsMzE3KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10ZGFjMiIsICAgIFhTUFIoMzEsNDY3LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGR2YzEiLCAgICBYU1BSKDMxLDQ2NywzMTgpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRkdmMxIiwgICAgWFNQUigzMSw0NjcsOTUwKSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJTIH0gfSwKK3sgIm10ZHZjMiIsICAgIFhTUFIoMzEsNDY3LDMxOSksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGR2YzIiLCAgICBYU1BSKDMxLDQ2Nyw5NTEpLCAgWFNQUl9NQVNLLCBQUEM0MDUsCXsgUlMgfSB9LAoreyAibXR0c3IiLCAgICAgWFNQUigzMSw0NjcsMzM2KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10dHNyIiwgICAgIFhTUFIoMzEsNDY3LDk4NCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdHRjciIsICAgICBYU1BSKDMxLDQ2NywzNDApLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXR0Y3IiLCAgICAgWFNQUigzMSw0NjcsOTg2KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10aXZvcjAiLCAgIFhTUFIoMzEsNDY3LDQwMCksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGl2b3IxIiwgICBYU1BSKDMxLDQ2Nyw0MDEpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpdm9yMiIsICAgWFNQUigzMSw0NjcsNDAyKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aXZvcjMiLCAgIFhTUFIoMzEsNDY3LDQwMyksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGl2b3I0IiwgICBYU1BSKDMxLDQ2Nyw0MDQpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpdm9yNSIsICAgWFNQUigzMSw0NjcsNDA1KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aXZvcjYiLCAgIFhTUFIoMzEsNDY3LDQwNiksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGl2b3I3IiwgICBYU1BSKDMxLDQ2Nyw0MDcpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpdm9yOCIsICAgWFNQUigzMSw0NjcsNDA4KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aXZvcjkiLCAgIFhTUFIoMzEsNDY3LDQwOSksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGl2b3IxMCIsICBYU1BSKDMxLDQ2Nyw0MTApLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpdm9yMTEiLCAgWFNQUigzMSw0NjcsNDExKSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aXZvcjEyIiwgIFhTUFIoMzEsNDY3LDQxMiksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdGl2b3IxMyIsICBYU1BSKDMxLDQ2Nyw0MTMpLCAgWFNQUl9NQVNLLCBCT09LRSwgICAgIHsgUlMgfSB9LAoreyAibXRpdm9yMTQiLCAgWFNQUigzMSw0NjcsNDE0KSwgIFhTUFJfTUFTSywgQk9PS0UsICAgICB7IFJTIH0gfSwKK3sgIm10aXZvcjE1IiwgIFhTUFIoMzEsNDY3LDQxNSksICBYU1BSX01BU0ssIEJPT0tFLCAgICAgeyBSUyB9IH0sCit7ICJtdHNwZWZzY3IiLCAgWFNQUigzMSw0NjcsNTEyKSwgIFhTUFJfTUFTSywgUFBDU1BFLCAgIHsgUlMgfSB9LAoreyAibXRiYmVhciIsICAgWFNQUigzMSw0NjcsNTEzKSwgIFhTUFJfTUFTSywgUFBDQlJMSywgICB7IFJTIH0gfSwKK3sgIm10YmJ0YXIiLCAgIFhTUFIoMzEsNDY3LDUxNCksICBYU1BSX01BU0ssIFBQQ0JSTEssICB7IFJTIH0gfSwKK3sgIm10aXZvcjMyIiwgIFhTUFIoMzEsNDY3LDUyOCksICBYU1BSX01BU0ssIFBQQ1NQRSwJeyBSUyB9IH0sCit7ICJtdGl2b3IzMyIsICBYU1BSKDMxLDQ2Nyw1MjkpLCAgWFNQUl9NQVNLLCBQUENTUEUsCXsgUlMgfSB9LAoreyAibXRpdm9yMzQiLCAgWFNQUigzMSw0NjcsNTMwKSwgIFhTUFJfTUFTSywgUFBDU1BFLAl7IFJTIH0gfSwKK3sgIm10aXZvcjM1IiwgIFhTUFIoMzEsNDY3LDUzMSksICBYU1BSX01BU0ssIFBQQ1BNUiwJeyBSUyB9IH0sCit7ICJtdGliYXR1IiwgICBYU1BSKDMxLDQ2Nyw1MjgpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGliYXRsIiwgICBYU1BSKDMxLDQ2Nyw1MjkpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGRiYXR1IiwgICBYU1BSKDMxLDQ2Nyw1MzYpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdGRiYXRsIiwgICBYU1BSKDMxLDQ2Nyw1MzcpLCAgWFNQUkJBVF9NQVNLLCBQUEMsCXsgU1BSQkFULCBSUyB9IH0sCit7ICJtdG1jc3JyMCIsICBYU1BSKDMxLDQ2Nyw1NzApLCAgWFNQUl9NQVNLLCBQUENSRk1DSSwgIHsgUlMgfSB9LAoreyAibXRtY3NycjEiLCAgWFNQUigzMSw0NjcsNTcxKSwgIFhTUFJfTUFTSywgUFBDUkZNQ0ksICB7IFJTIH0gfSwKK3sgIm10bWNzciIsICAgIFhTUFIoMzEsNDY3LDU3MiksICBYU1BSX01BU0ssIFBQQ1JGTUNJLCAgeyBSUyB9IH0sCit7ICJtdHVtbWNyMCIsICBYU1BSKDMxLDQ2Nyw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXR1cG1jMSIsICAgWFNQUigzMSw0NjcsOTM3KSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10dXBtYzIiLCAgIFhTUFIoMzEsNDY3LDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwgICAgeyBSUyB9IH0sCit7ICJtdHVzaWEiLCAgICBYU1BSKDMxLDQ2Nyw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXR1bW1jcjEiLCAgWFNQUigzMSw0NjcsOTQwKSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10dXBtYzMiLCAgIFhTUFIoMzEsNDY3LDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwgICAgeyBSUyB9IH0sCit7ICJtdHVwbWM0IiwgICBYU1BSKDMxLDQ2Nyw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXR6cHIiLCAgICAgWFNQUigzMSw0NjcsOTQ0KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10Y2NyMCIsICAgIFhTUFIoMzEsNDY3LDk0NyksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSUyB9IH0sCit7ICJtdG1tY3IwIiwgICBYU1BSKDMxLDQ2Nyw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXRzZ3IiLCAgICAgWFNQUigzMSw0NjcsOTUzKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10cG1jMSIsICAgIFhTUFIoMzEsNDY3LDk1MyksICBYU1BSX01BU0ssIFBQQzc1MCwgICAgeyBSUyB9IH0sCit7ICJtdGRjd3IiLCAgICBYU1BSKDMxLDQ2Nyw5NTQpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRwbWMyIiwgICAgWFNQUigzMSw0NjcsOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10c2xlciIsICAgIFhTUFIoMzEsNDY3LDk1NSksICBYU1BSX01BU0ssIFBQQzQwNSwJeyBSUyB9IH0sCit7ICJtdHNpYSIsICAgICBYU1BSKDMxLDQ2Nyw5NTUpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXRzdTByIiwgICAgWFNQUigzMSw0NjcsOTU2KSwgIFhTUFJfTUFTSywgUFBDNDA1LAl7IFJTIH0gfSwKK3sgIm10bW1jcjEiLCAgIFhTUFIoMzEsNDY3LDk1NiksICBYU1BSX01BU0ssIFBQQzc1MCwgICAgeyBSUyB9IH0sCit7ICJtdHBtYzMiLCAgICBYU1BSKDMxLDQ2Nyw5NTcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXRwbWM0IiwgICAgWFNQUigzMSw0NjcsOTU4KSwgIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10aWNkYmRyIiwgIFhTUFIoMzEsNDY3LDk3OSksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGV2cHIiLCAgICBYU1BSKDMxLDQ2Nyw5ODIpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRjZGJjciIsICAgWFNQUigzMSw0NjcsOTgzKSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10cGl0IiwgICAgIFhTUFIoMzEsNDY3LDk4NyksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdHRiaGkiLCAgICBYU1BSKDMxLDQ2Nyw5ODgpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXR0YmxvIiwgICAgWFNQUigzMSw0NjcsOTg5KSwgIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10c3JyMiIsICAgIFhTUFIoMzEsNDY3LDk5MCksICBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdHNycjMiLCAgICBYU1BSKDMxLDQ2Nyw5OTEpLCAgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRsMmNyIiwgICAgWFNQUigzMSw0NjcsMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10ZGNjciIsICAgIFhTUFIoMzEsNDY3LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdGljY3IiLCAgICBYU1BSKDMxLDQ2NywxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXRpY3RjIiwgICAgWFNQUigzMSw0NjcsMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10cGJsMSIsICAgIFhTUFIoMzEsNDY3LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdHRocm0xIiwgICBYU1BSKDMxLDQ2NywxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsICAgIHsgUlMgfSB9LAoreyAibXRwYnUxIiwgICAgWFNQUigzMSw0NjcsMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJTIH0gfSwKK3sgIm10dGhybTIiLCAgIFhTUFIoMzEsNDY3LDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwgICAgeyBSUyB9IH0sCit7ICJtdHBibDIiLCAgICBYU1BSKDMxLDQ2NywxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlMgfSB9LAoreyAibXR0aHJtMyIsICAgWFNQUigzMSw0NjcsMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLCAgICB7IFJTIH0gfSwKK3sgIm10cGJ1MiIsICAgIFhTUFIoMzEsNDY3LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSUyB9IH0sCit7ICJtdHNwciIsICAgICBYKDMxLDQ2NyksCSAgWF9NQVNLLCAgICBDT00sCXsgU1BSLCBSUyB9IH0sCisKK3sgImRjYmkiLCAgICBYKDMxLDQ3MCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCisKK3sgIm5hbmQiLCAgICBYUkMoMzEsNDc2LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJuYW5kLiIsICAgWFJDKDMxLDQ3NiwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJkY2JpZSIsICAgWCgzMSw0NzgpLAlYUlRfTUFTSywJQk9PS0U2NCwJeyBSQSwgUkIgfSB9LAorCit7ICJkY3JlYWQiLCAgWCgzMSw0ODYpLAlYX01BU0ssCQlQUEM0MDN8UFBDNDQwLAl7IFJULCBSQSwgUkIgfX0sCisKK3sgIm10cG1yIiwgICBYKDMxLDQ2MiksCVhfTUFTSywJCVBQQ1BNUiwJCXsgUE1SLCBSUyB9fSwKKworeyAiaWNidGxzIiwgIFgoMzEsNDg2KSwJWF9NQVNLLAkJUFBDQ0hMSywJeyBDVCwgUkEsIFJCIH19LAorCit7ICJuYWJzIiwgICAgWE8oMzEsNDg4LDAsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKK3sgInN1YmZtZTY0IixYTygzMSw0ODgsMCwwKSwgWE9SQl9NQVNLLCBCT09LRTY0LAl7IFJULCBSQSB9IH0sCit7ICJuYWJzLiIsICAgWE8oMzEsNDg4LDAsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKK3sgIm5hYnNvIiwgICBYTygzMSw0ODgsMSwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoreyAic3ViZm1lNjRvIixYTygzMSw0ODgsMSwwKSwgWE9SQl9NQVNLLCBCT09LRTY0LAl7IFJULCBSQSB9IH0sCit7ICJuYWJzby4iLCAgWE8oMzEsNDg4LDEsMSksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKKworeyAiZGl2ZCIsICAgIFhPKDMxLDQ4OSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZkLiIsICAgWE8oMzEsNDg5LDAsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKK3sgImRpdmRvIiwgICBYTygzMSw0ODksMSwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoreyAiZGl2ZG8uIiwgIFhPKDMxLDQ4OSwxLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImFkZG1lNjQiLCBYTygzMSw0OTAsMCwwKSwgWE9SQl9NQVNLLCBCT09LRTY0LAl7IFJULCBSQSB9IH0sCit7ICJhZGRtZTY0byIsWE8oMzEsNDkwLDEsMCksIFhPUkJfTUFTSywgQk9PS0U2NCwJeyBSVCwgUkEgfSB9LAorCit7ICJkaXZ3IiwgICAgWE8oMzEsNDkxLDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3LiIsICAgWE8oMzEsNDkxLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3byIsICAgWE8oMzEsNDkxLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCit7ICJkaXZ3by4iLCAgWE8oMzEsNDkxLDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImljYnRsc2UiLCBYKDMxLDQ5NCksCVhfTUFTSywJCVBQQ0NITEs2NCwJeyBDVCwgUkEsIFJCIH19LAorCit7ICJzbGJpYSIsICAgWCgzMSw0OTgpLAkweGZmZmZmZmZmLAlQUEM2NCwJCXsgMCB9IH0sCisKK3sgImNsaSIsICAgICBYKDMxLDUwMiksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKKworeyAic3RkY3hlLiIsIFhSQygzMSw1MTEsMSksIFhfTUFTSywJQk9PS0U2NCwJeyBSUywgUkEsIFJCIH0gfSwKKworeyAibWNyeHIiLCAgIFgoMzEsNTEyKSwJWFJBUkJfTUFTS3woMzw8MjEpLCBDT00sCXsgQkYgfSB9LAorCit7ICJiYmxlbHMiLCAgWCgzMSw1MTgpLAlYX01BU0ssCQlQUENCUkxLLAl7IDAgfX0sCit7ICJtY3J4cjY0IiwgWCgzMSw1NDQpLAlYUkFSQl9NQVNLfCgzPDwyMSksIEJPT0tFNjQsCXsgQkYgfSB9LAorCit7ICJjbGNzIiwgICAgWCgzMSw1MzEpLCBYUkJfTUFTSywJTTYwMSwJCXsgUlQsIFJBIH0gfSwKKworeyAibGRicngiLCAgIFgoMzEsNTMyKSwJWF9NQVNLLAkJQ0VMTCwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJsc3d4IiwgICAgWCgzMSw1MzMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQTAsIFJCIH0gfSwKK3sgImxzeCIsICAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCisKK3sgImx3YnJ4IiwgICBYKDMxLDUzNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgUkIgfSB9LAoreyAibGJyeCIsICAgIFgoMzEsNTM0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibGZzeCIsICAgIFgoMzEsNTM1KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBMCwgUkIgfSB9LAorCit7ICJzcnciLCAgICAgWFJDKDMxLDUzNiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3IiLCAgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNydy4iLCAgICBYUkMoMzEsNTM2LDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzci4iLCAgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJycmliIiwgICAgWFJDKDMxLDUzNywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInJyaWIuIiwgICBYUkMoMzEsNTM3LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJzcmQiLCAgICAgWFJDKDMxLDUzOSwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzcmQuIiwgICAgWFJDKDMxLDUzOSwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgIm1hc2tpciIsICBYUkMoMzEsNTQxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAibWFza2lyLiIsIFhSQygzMSw1NDEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImx3YnJ4ZSIsICBYKDMxLDU0MiksCVhfTUFTSywJCUJPT0tFNjQsCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJsZnN4ZSIsICAgWCgzMSw1NDMpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkEwLCBSQiB9IH0sCisKK3sgImJiZWxyIiwgICBYKDMxLDU1MCksCVhfTUFTSywJCVBQQ0JSTEssCXsgMCB9fSwKKworeyAidGxic3luYyIsIFgoMzEsNTY2KSwJMHhmZmZmZmZmZiwJUFBDLAkJeyAwIH0gfSwKKworeyAibGZzdXgiLCAgIFgoMzEsNTY3KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAorCit7ICJsZnN1eGUiLCAgWCgzMSw1NzUpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkFTLCBSQiB9IH0sCisKK3sgIm1mc3IiLCAgICBYKDMxLDU5NSksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFJULCBTUiB9IH0sCisKK3sgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBMCwgTkIgfSB9LAoreyAibHNpIiwgICAgIFgoMzEsNTk3KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEwLCBOQiB9IH0sCisKK3sgImx3c3luYyIsICBYU1lOQygzMSw1OTgsMSksIDB4ZmZmZmZmZmYsIFBQQywJCXsgMCB9IH0sCit7ICJwdGVzeW5jIiwgWFNZTkMoMzEsNTk4LDIpLCAweGZmZmZmZmZmLCBQUEM2NCwJeyAwIH0gfSwKK3sgIm1zeW5jIiwgICBYKDMxLDU5OCksIDB4ZmZmZmZmZmYsCUJPT0tFLAkJeyAwIH0gfSwKK3sgInN5bmMiLCAgICBYKDMxLDU5OCksIFhTWU5DX01BU0ssCVBQQ0NPTSwJCXsgTFMgfSB9LAoreyAiZGNzIiwgICAgIFgoMzEsNTk4KSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKKworeyAibGZkeCIsICAgIFgoMzEsNTk5KSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBMCwgUkIgfSB9LAorCit7ICJsZmR4ZSIsICAgWCgzMSw2MDcpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkEwLCBSQiB9IH0sCisKK3sgIm1mZmdwciIsICBYUkMoMzEsNjA3LDApLCBYUkFfTUFTSywJUE9XRVI2LAkJeyBGUlQsIFJCIH0gfSwKKworeyAibWZzcmkiLCAgIFgoMzEsNjI3KSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAiZGNsc3QiLCAgIFgoMzEsNjMwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUlMsIFJBIH0gfSwKKworeyAibGZkdXgiLCAgIFgoMzEsNjMxKSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBUywgUkIgfSB9LAorCit7ICJsZmR1eGUiLCAgWCgzMSw2MzkpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSVCwgUkFTLCBSQiB9IH0sCisKK3sgIm1mc3JpbiIsICBYKDMxLDY1OSksIFhSQV9NQVNLLAlQUEMzMiwJCXsgUlQsIFJCIH0gfSwKKworeyAic3RkYnJ4IiwgIFgoMzEsNjYwKSwgWF9NQVNLLAkJQ0VMTCwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdHN3eCIsICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKK3sgInN0c3giLCAgICBYKDMxLDY2MSksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdHdicngiLCAgWCgzMSw2NjIpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIFJCIH0gfSwKK3sgInN0YnJ4IiwgICBYKDMxLDY2MiksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdGZzeCIsICAgWCgzMSw2NjMpLCBYX01BU0ssCQlDT00sCQl7IEZSUywgUkEwLCBSQiB9IH0sCisKK3sgInNycSIsICAgICBYUkMoMzEsNjY0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JxLiIsICAgIFhSQygzMSw2NjQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNyZSIsICAgICBYUkMoMzEsNjY1LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JlLiIsICAgIFhSQygzMSw2NjUsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInN0d2JyeGUiLCBYKDMxLDY3MCksIFhfTUFTSywJCUJPT0tFNjQsCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzdGZzeGUiLCAgWCgzMSw2NzEpLCBYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkEwLCBSQiB9IH0sCisKK3sgInN0ZnN1eCIsICBYKDMxLDY5NSksCVhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQVMsIFJCIH0gfSwKKworeyAic3JpcSIsICAgIFhSQygzMSw2OTYsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzcmlxLiIsICAgWFJDKDMxLDY5NiwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKKworeyAic3Rmc3V4ZSIsIFgoMzEsNzAzKSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBGUlMsIFJBUywgUkIgfSB9LAorCit7ICJzdHN3aSIsICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQTAsIE5CIH0gfSwKK3sgInN0c2kiLCAgICBYKDMxLDcyNSksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBMCwgTkIgfSB9LAorCit7ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEwLCBSQiB9IH0sCisKK3sgInNybHEiLCAgICBYUkMoMzEsNzI4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JscS4iLCAgIFhSQygzMSw3MjgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNyZXEiLCAgICBYUkMoMzEsNzI5LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JlcS4iLCAgIFhSQygzMSw3MjksMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInN0ZmR4ZSIsICBYKDMxLDczNSksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQTAsIFJCIH0gfSwKKworeyAibWZ0Z3ByIiwgIFhSQygzMSw3MzUsMCksIFhSQV9NQVNLLAlQT1dFUjYsCQl7IFJULCBGUkIgfSB9LAorCit7ICJkY2JhIiwgICAgWCgzMSw3NTgpLAlYUlRfTUFTSywJUFBDNDA1IHwgQk9PS0UsCXsgUkEsIFJCIH0gfSwKKworeyAic3RmZHV4IiwgIFgoMzEsNzU5KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAorCit7ICJzcmxpcSIsICAgWFJDKDMxLDc2MCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgInNybGlxLiIsICBYUkMoMzEsNzYwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAorCit7ICJkY2JhZSIsICAgWCgzMSw3NjYpLAlYUlRfTUFTSywJQk9PS0U2NCwJeyBSQSwgUkIgfSB9LAorCit7ICJzdGZkdXhlIiwgWCgzMSw3NjcpLAlYX01BU0ssCQlCT09LRTY0LAl7IEZSUywgUkFTLCBSQiB9IH0sCisKK3sgInRsYml2YXgiLCBYKDMxLDc4NiksCVhSVF9NQVNLLAlCT09LRSwJCXsgUkEsIFJCIH0gfSwKK3sgInRsYml2YXhlIixYKDMxLDc4NyksCVhSVF9NQVNLLAlCT09LRTY0LAl7IFJBLCBSQiB9IH0sCisKK3sgImx3emNpeCIsICBYKDMxLDc4OSksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJsaGJyeCIsICAgWCgzMSw3OTApLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAic3JhdyIsICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKK3sgInNyYSIsICAgICBYUkMoMzEsNzkyLDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCit7ICJzcmF3LiIsICAgWFJDKDMxLDc5MiwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JhLiIsICAgIFhSQygzMSw3OTIsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKKworeyAic3JhZCIsICAgIFhSQygzMSw3OTQsMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JhZC4iLCAgIFhSQygzMSw3OTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAorCit7ICJsaGJyeGUiLCAgWCgzMSw3OTgpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAibGR4ZSIsICAgIFgoMzEsNzk5KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSVCwgUkEwLCBSQiB9IH0sCit7ICJsZHV4ZSIsICAgWCgzMSw4MzEpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJULCBSQTAsIFJCIH0gfSwKKworeyAicmFjIiwgICAgIFgoMzEsODE4KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKKworeyAibGh6Y2l4IiwgIFgoMzEsODIxKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgImRzcyIsICAgICBYRFNTKDMxLDgyMiwwKSwgWERTU19NQVNLLAlQUENWRUMsCQl7IFNUUk0gfSB9LAoreyAiZHNzYWxsIiwgIFhEU1MoMzEsODIyLDEpLCBYRFNTX01BU0ssCVBQQ1ZFQywJCXsgMCB9IH0sCisKK3sgInNyYXdpIiwgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCit7ICJzcmFpIiwgICAgWFJDKDMxLDgyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoreyAic3Jhd2kuIiwgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgInNyYWkuIiwgICBYUkMoMzEsODI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCisKK3sgInNsYm1mZXYiLCBYKDMxLDg1MSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgUlQsIFJCIH0gfSwKKworeyAibGJ6Y2l4IiwgIFgoMzEsODUzKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSVCwgUkEwLCBSQiB9IH0sCisKK3sgIm1iYXIiLCAgICBYKDMxLDg1NCksCVhfTUFTSywJCUJPT0tFLAkJeyBNTyB9IH0sCit7ICJlaWVpbyIsICAgWCgzMSw4NTQpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAorCit7ICJsZml3YXgiLCAgWCgzMSw4NTUpLAlYX01BU0ssCQlQT1dFUjYsCQl7IEZSVCwgUkEwLCBSQiB9IH0sCisKK3sgImxkY2l4IiwgICBYKDMxLDg4NSksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlQsIFJBMCwgUkIgfSB9LAorCit7ICJ0bGJzeCIsICAgWFJDKDMxLDkxNCwwKSwgWF9NQVNLLCAJUFBDNDAzfEJPT0tFLAl7IFJUTywgUkEsIFJCIH0gfSwKK3sgInRsYnN4LiIsICBYUkMoMzEsOTE0LDEpLCBYX01BU0ssIAlQUEM0MDN8Qk9PS0UsCXsgUlRPLCBSQSwgUkIgfSB9LAoreyAidGxic3hlIiwgIFhSQygzMSw5MTUsMCksIFhfTUFTSywJQk9PS0U2NCwJeyBSVE8sIFJBLCBSQiB9IH0sCit7ICJ0bGJzeGUuIiwgWFJDKDMxLDkxNSwxKSwgWF9NQVNLLAlCT09LRTY0LAl7IFJUTywgUkEsIFJCIH0gfSwKKworeyAic2xibWZlZSIsIFgoMzEsOTE1KSwgWFJBX01BU0ssCVBQQzY0LAkJeyBSVCwgUkIgfSB9LAorCit7ICJzdHdjaXgiLCAgWCgzMSw5MTcpLAlYX01BU0ssCQlQT1dFUjYsCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAic3RoYnJ4IiwgIFgoMzEsOTE4KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInNyYXEiLCAgICBYUkMoMzEsOTIwLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JhcS4iLCAgIFhSQygzMSw5MjAsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgInNyZWEiLCAgICBYUkMoMzEsOTIxLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoreyAic3JlYS4iLCAgIFhSQygzMSw5MjEsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCisKK3sgImV4dHNoIiwgICBYUkMoMzEsOTIyLDApLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoreyAiZXh0cyIsICAgIFhSQygzMSw5MjIsMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCit7ICJleHRzaC4iLCAgWFJDKDMxLDkyMiwxKSwgWFJCX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTIH0gfSwKK3sgImV4dHMuIiwgICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMgfSB9LAorCit7ICJzdGhicnhlIiwgWCgzMSw5MjYpLAlYX01BU0ssCQlCT09LRTY0LAl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAic3RkeGUiLCAgIFgoMzEsOTI3KSwgWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgInRsYnJlaGkiLCBYVExCKDMxLDk0NiwwKSwgWFRMQl9NQVNLLAlQUEM0MDMsCQl7IFJULCBSQSB9IH0sCit7ICJ0bGJyZWxvIiwgWFRMQigzMSw5NDYsMSksIFhUTEJfTUFTSywJUFBDNDAzLAkJeyBSVCwgUkEgfSB9LAoreyAidGxicmUiLCAgIFgoMzEsOTQ2KSwJWF9NQVNLLAkJUFBDNDAzfEJPT0tFLAl7IFJTTywgUkFPUFQsIFNITyB9IH0sCisKK3sgInN0aGNpeCIsICBYKDMxLDk0OSksCVhfTUFTSywJCVBPV0VSNiwJCXsgUlMsIFJBMCwgUkIgfSB9LAorCit7ICJzcmFpcSIsICAgWFJDKDMxLDk1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKK3sgInNyYWlxLiIsICBYUkMoMzEsOTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAorCit7ICJleHRzYiIsICAgWFJDKDMxLDk1NCwwKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTfSB9LAoreyAiZXh0c2IuIiwgIFhSQygzMSw5NTQsMSksIFhSQl9NQVNLLAlQUEMsCQl7IFJBLCBSU30gfSwKKworeyAic3RkdXhlIiwgIFgoMzEsOTU5KSwJWF9NQVNLLAkJQk9PS0U2NCwJeyBSUywgUkFTLCBSQiB9IH0sCisKK3sgImljY2NpIiwgICBYKDMxLDk2NiksCVhSVF9NQVNLLAlQUEM0MDN8UFBDNDQwLAl7IFJBLCBSQiB9IH0sCisKK3sgInRsYndlaGkiLCBYVExCKDMxLDk3OCwwKSwgWFRMQl9NQVNLLAlQUEM0MDMsCQl7IFJULCBSQSB9IH0sCit7ICJ0bGJ3ZWxvIiwgWFRMQigzMSw5NzgsMSksIFhUTEJfTUFTSywJUFBDNDAzLAkJeyBSVCwgUkEgfSB9LAoreyAidGxid2UiLCAgIFgoMzEsOTc4KSwJWF9NQVNLLAkJUFBDNDAzfEJPT0tFLAl7IFJTTywgUkFPUFQsIFNITyB9IH0sCit7ICJ0bGJsZCIsICAgWCgzMSw5NzgpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKKworeyAic3RiY2l4IiwgIFgoMzEsOTgxKSwJWF9NQVNLLAkJUE9XRVI2LAkJeyBSUywgUkEwLCBSQiB9IH0sCisKK3sgImljYmkiLCAgICBYKDMxLDk4MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCisKK3sgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQTAsIFJCIH0gfSwKKworeyAiZXh0c3ciLCAgIFhSQygzMSw5ODYsMCksIFhSQl9NQVNLLAlQUEM2NCB8IEJPT0tFNjQseyBSQSwgUlMgfSB9LAoreyAiZXh0c3cuIiwgIFhSQygzMSw5ODYsMSksIFhSQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTIH0gfSwKKworeyAiaWNyZWFkIiwgIFgoMzEsOTk4KSwJWFJUX01BU0ssCVBQQzQwM3xQUEM0NDAsCXsgUkEsIFJCIH0gfSwKKworeyAiaWNiaWUiLCAgIFgoMzEsOTkwKSwJWFJUX01BU0ssCUJPT0tFNjQsCXsgUkEsIFJCIH0gfSwKK3sgInN0Zml3eGUiLCBYKDMxLDk5MSksCVhfTUFTSywJCUJPT0tFNjQsCXsgRlJTLCBSQTAsIFJCIH0gfSwKKworeyAidGxibGkiLCAgIFgoMzEsMTAxMCksIFhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAorCit7ICJzdGRjaXgiLCAgWCgzMSwxMDEzKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFJTLCBSQTAsIFJCIH0gfSwKKworeyAiZGNiemwiLCAgIFhPUEwoMzEsMTAxNCwxKSwgWFJUX01BU0ssUE9XRVI0LCAgICAgICAgICAgIHsgUkEsIFJCIH0gfSwKK3sgImRjYnoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAoreyAiZGNseiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCisKK3sgImRjYnplIiwgICBYKDMxLDEwMjIpLCBYUlRfTUFTSywJQk9PS0U2NCwJeyBSQSwgUkIgfSB9LAorCit7ICJsdmVieCIsICAgWCgzMSwgICA3KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZELCBSQSwgUkIgfSB9LAoreyAibHZlaHgiLCAgIFgoMzEsICAzOSksIFhfTUFTSywJUFBDVkVDLAkJeyBWRCwgUkEsIFJCIH0gfSwKK3sgImx2ZXd4IiwgICBYKDMxLCAgNzEpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFJBLCBSQiB9IH0sCit7ICJsdnNsIiwgICAgWCgzMSwgICA2KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZELCBSQSwgUkIgfSB9LAoreyAibHZzciIsICAgIFgoMzEsICAzOCksIFhfTUFTSywJUFBDVkVDLAkJeyBWRCwgUkEsIFJCIH0gfSwKK3sgImx2eCIsICAgICBYKDMxLCAxMDMpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVkQsIFJBLCBSQiB9IH0sCit7ICJsdnhsIiwgICAgWCgzMSwgMzU5KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZELCBSQSwgUkIgfSB9LAoreyAic3R2ZWJ4IiwgIFgoMzEsIDEzNSksIFhfTUFTSywJUFBDVkVDLAkJeyBWUywgUkEsIFJCIH0gfSwKK3sgInN0dmVoeCIsICBYKDMxLCAxNjcpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVlMsIFJBLCBSQiB9IH0sCit7ICJzdHZld3giLCAgWCgzMSwgMTk5KSwgWF9NQVNLLAlQUENWRUMsCQl7IFZTLCBSQSwgUkIgfSB9LAoreyAic3R2eCIsICAgIFgoMzEsIDIzMSksIFhfTUFTSywJUFBDVkVDLAkJeyBWUywgUkEsIFJCIH0gfSwKK3sgInN0dnhsIiwgICBYKDMxLCA0ODcpLCBYX01BU0ssCVBQQ1ZFQywJCXsgVlMsIFJBLCBSQiB9IH0sCisKKy8qIE5ldyBsb2FkL3N0b3JlIGxlZnQvcmlnaHQgaW5kZXggdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGFyZSBpbiB0aGUgQ2VsbCBvbmx5LiAgKi8KK3sgImx2bHgiLCAgICBYKDMxLCA1MTkpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2bHhsIiwgICBYKDMxLCA3NzUpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2cngiLCAgICBYKDMxLCA1NTEpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgImx2cnhsIiwgICBYKDMxLCA4MDcpLCBYX01BU0ssCUNFTEwsCQl7IFZELCBSQTAsIFJCIH0gfSwKK3sgInN0dmx4IiwgICBYKDMxLCA2NDcpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dmx4bCIsICBYKDMxLCA5MDMpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dnJ4IiwgICBYKDMxLCA2NzkpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKK3sgInN0dnJ4bCIsICBYKDMxLCA5MzUpLCBYX01BU0ssCUNFTEwsCQl7IFZTLCBSQTAsIFJCIH0gfSwKKworeyAibHd6IiwgICAgIE9QKDMyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKK3sgImwiLAkgICAgIE9QKDMyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKKworeyAibHd6dSIsICAgIE9QKDMzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKK3sgImx1IiwgICAgICBPUCgzMyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCisKK3sgImxieiIsICAgICBPUCgzNCksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCisKK3sgImxienUiLCAgICBPUCgzNSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCisKK3sgInN0dyIsICAgICBPUCgzNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCit7ICJzdCIsICAgICAgT1AoMzYpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQTAgfSB9LAorCit7ICJzdHd1IiwgICAgT1AoMzcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQVMgfSB9LAoreyAic3R1IiwgICAgIE9QKDM3KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKKworeyAic3RiIiwgICAgIE9QKDM4KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKKworeyAic3RidSIsICAgIE9QKDM5KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKKworeyAibGh6IiwgICAgIE9QKDQwKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKKworeyAibGh6dSIsICAgIE9QKDQxKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKKworeyAibGhhIiwgICAgIE9QKDQyKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkEwIH0gfSwKKworeyAibGhhdSIsICAgIE9QKDQzKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKKworeyAic3RoIiwgICAgIE9QKDQ0KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEwIH0gfSwKKworeyAic3RodSIsICAgIE9QKDQ1KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKKworeyAibG13IiwgICAgIE9QKDQ2KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkFNIH0gfSwKK3sgImxtIiwgICAgICBPUCg0NiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBMCB9IH0sCisKK3sgInN0bXciLCAgICBPUCg0NyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBMCB9IH0sCit7ICJzdG0iLCAgICAgT1AoNDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQTAgfSB9LAorCit7ICJsZnMiLCAgICAgT1AoNDgpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEwIH0gfSwKKworeyAibGZzdSIsICAgIE9QKDQ5KSwJT1BfTUFTSywJQ09NLAkJeyBGUlQsIEQsIFJBUyB9IH0sCisKK3sgImxmZCIsICAgICBPUCg1MCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQTAgfSB9LAorCit7ICJsZmR1IiwgICAgT1AoNTEpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKKworeyAic3RmcyIsICAgIE9QKDUyKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBMCB9IH0sCisKK3sgInN0ZnN1IiwgICBPUCg1MyksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAorCit7ICJzdGZkIiwgICAgT1AoNTQpLAlPUF9NQVNLLAlDT00sCQl7IEZSUywgRCwgUkEwIH0gfSwKKworeyAic3RmZHUiLCAgIE9QKDU1KSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCisKK3sgImxxIiwgICAgICBPUCg1NiksCU9QX01BU0ssCVBPV0VSNCwJCXsgUlRRLCBEUSwgUkFRIH0gfSwKKworeyAibGZxIiwgICAgIE9QKDU2KSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEQsIFJBMCB9IH0sCisKK3sgImxmcXUiLCAgICBPUCg1NyksCU9QX01BU0ssCVBPV0VSMiwJCXsgRlJULCBELCBSQTAgfSB9LAorCit7ICJsZmRwIiwgICAgT1AoNTcpLAlPUF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRCwgUkEwIH0gfSwKKworeyAibGJ6ZSIsICAgIERFTyg1OCwwKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBMCB9IH0sCit7ICJsYnp1ZSIsICAgREVPKDU4LDEpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkFMIH0gfSwKK3sgImxoemUiLCAgICBERU8oNTgsMiksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQTAgfSB9LAoreyAibGh6dWUiLCAgIERFTyg1OCwzKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBTCB9IH0sCit7ICJsaGFlIiwgICAgREVPKDU4LDQpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkEwIH0gfSwKK3sgImxoYXVlIiwgICBERU8oNTgsNSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFLCBSQUwgfSB9LAoreyAibHd6ZSIsICAgIERFTyg1OCw2KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSVCwgREUsIFJBMCB9IH0sCit7ICJsd3p1ZSIsICAgREVPKDU4LDcpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJULCBERSwgUkFMIH0gfSwKK3sgInN0YmUiLCAgICBERU8oNTgsOCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlMsIERFLCBSQTAgfSB9LAoreyAic3RidWUiLCAgIERFTyg1OCw5KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBUyB9IH0sCit7ICJzdGhlIiwgICAgREVPKDU4LDEwKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBMCB9IH0sCit7ICJzdGh1ZSIsICAgREVPKDU4LDExKSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBUyB9IH0sCit7ICJzdHdlIiwgICAgREVPKDU4LDE0KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBMCB9IH0sCit7ICJzdHd1ZSIsICAgREVPKDU4LDE1KSwgREVfTUFTSywJQk9PS0U2NCwJeyBSUywgREUsIFJBUyB9IH0sCisKK3sgImxkIiwgICAgICBEU08oNTgsMCksCURTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBMCB9IH0sCisKK3sgImxkdSIsICAgICBEU08oNTgsMSksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBTCB9IH0sCisKK3sgImx3YSIsICAgICBEU08oNTgsMiksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBMCB9IH0sCisKK3sgImRhZGQiLCAgICBYUkMoNTksMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGFkZC4iLCAgIFhSQyg1OSwyLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRxdWEiLCAgICBaUkMoNTksMywwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHF1YS4iLCAgIFpSQyg1OSwzLDEpLCBaMl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCisKK3sgImZkaXZzIiwgICBBKDU5LDE4LDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmZGl2cy4iLCAgQSg1OSwxOCwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJmc3VicyIsICAgQSg1OSwyMCwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZnN1YnMuIiwgIEEoNTksMjAsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZmFkZHMiLCAgIEEoNTksMjEsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZhZGRzLiIsICBBKDU5LDIxLDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImZzcXJ0cyIsICBBKDU5LDIyLDApLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAoreyAiZnNxcnRzLiIsIEEoNTksMjIsMSksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImZyZXMiLCAgICBBKDU5LDI0LDApLCBBRlJBTEZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAoreyAiZnJlcy4iLCAgIEEoNTksMjQsMSksIEFGUkFMRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIsIEFfTCB9IH0sCisKK3sgImZtdWxzIiwgICBBKDU5LDI1LDApLCBBRlJCX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQyB9IH0sCit7ICJmbXVscy4iLCAgQSg1OSwyNSwxKSwgQUZSQl9NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAorCit7ICJmcnNxcnRlcyIsIEEoNTksMjYsMCksIEFGUkFMRlJDX01BU0ssUE9XRVI1LAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyc3FydGVzLiIsQSg1OSwyNiwxKSwgQUZSQUxGUkNfTUFTSyxQT1dFUjUsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAorCit7ICJmbXN1YnMiLCAgQSg1OSwyOCwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbXN1YnMuIiwgQSg1OSwyOCwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZtYWRkcyIsICBBKDU5LDI5LDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtYWRkcy4iLCBBKDU5LDI5LDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKKworeyAiZm5tc3VicyIsIEEoNTksMzAsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm5tc3Vicy4iLEEoNTksMzAsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJmbm1hZGRzIiwgQSg1OSwzMSwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1hZGRzLiIsQSg1OSwzMSwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImRtdWwiLCAgICBYUkMoNTksMzQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRtdWwuIiwgICBYUkMoNTksMzQsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZHJybmQiLCAgIFpSQyg1OSwzNSwwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAoreyAiZHJybmQuIiwgIFpSQyg1OSwzNSwxKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCLCBSTUMgfSB9LAorCit7ICJkc2NsaSIsICAgWlJDKDU5LDY2LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjbGkuIiwgIFpSQyg1OSw2NiwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHF1YWkiLCAgIFpSQyg1OSw2NywwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBURSwgIEZSVCwgRlJCLCBSTUMgfSB9LAoreyAiZHF1YWkuIiwgIFpSQyg1OSw2NywxKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBURSwgIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkc2NyaSIsICAgWlJDKDU5LDk4LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjcmkuIiwgIFpSQyg1OSw5OCwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHJpbnR4IiwgIFpSQyg1OSw5OSwwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50eC4iLCBaUkMoNTksOTksMSksIFoyX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCisKK3sgImRjbXBvIiwgICBYKDU5LDEzMCksCSAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAiZHRzdGV4IiwgIFgoNTksMTYyKSwJICAgWF9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBGUkIgfSB9LAoreyAiZHRzdGRjIiwgIFooNTksMTk0KSwJICAgWl9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBEQ00gfSB9LAoreyAiZHRzdGRnIiwgIFooNTksMjI2KSwJICAgWl9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBER00gfSB9LAorCit7ICJkcmludG4iLCAgWlJDKDU5LDIyNywwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50bi4iLCBaUkMoNTksMjI3LDEpLCBaMl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY3RkcCIsICAgWFJDKDU5LDI1OCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdGRwLiIsICBYUkMoNTksMjU4LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkY3RmaXgiLCAgWFJDKDU5LDI5MCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdGZpeC4iLCBYUkMoNTksMjkwLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkZGVkcGQiLCAgWFJDKDU5LDMyMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFNQLCBGUlQsIEZSQiB9IH0sCit7ICJkZGVkcGQuIiwgWFJDKDU5LDMyMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFNQLCBGUlQsIEZSQiB9IH0sCisKK3sgImR4ZXgiLCAgICBYUkMoNTksMzU0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAoreyAiZHhleC4iLCAgIFhSQyg1OSwzNTQsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRzdWIiLCAgICBYUkMoNTksNTE0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkc3ViLiIsICAgWFJDKDU5LDUxNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkZGl2IiwgICAgWFJDKDU5LDU0NiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGRpdi4iLCAgIFhSQyg1OSw1NDYsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZGNtcHUiLCAgIFgoNTksNjQyKSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAiZHRzdHNmIiwgIFgoNTksNjc0KSwJICAgWF9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBGUkIgfSB9LAorCit7ICJkcnNwIiwgICAgWFJDKDU5LDc3MCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRyc3AuIiwgICBYUkMoNTksNzcwLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkY2ZmaXgiLCAgWFJDKDU5LDgwMiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjZmZpeC4iLCBYUkMoNTksODAyLDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkZW5iY2QiLCAgWFJDKDU5LDgzNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IFMsIEZSVCwgRlJCIH0gfSwKK3sgImRlbmJjZC4iLCBYUkMoNTksODM0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgUywgRlJULCBGUkIgfSB9LAorCit7ICJkaWV4IiwgICAgWFJDKDU5LDg2NiwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZGlleC4iLCAgIFhSQyg1OSw4NjYsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAic3RmcSIsICAgIE9QKDYwKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKKworeyAic3RmcXUiLCAgIE9QKDYxKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKKworeyAic3RmZHAiLCAgIE9QKDYxKSwJT1BfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEQsIFJBMCB9IH0sCisKK3sgImxkZSIsICAgICBERU8oNjIsMCksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEwIH0gfSwKK3sgImxkdWUiLCAgICBERU8oNjIsMSksIERFX01BU0ssCUJPT0tFNjQsCXsgUlQsIERFUywgUkEwIH0gfSwKK3sgImxmc2UiLCAgICBERU8oNjIsNCksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJULCBERVMsIFJBMCB9IH0sCit7ICJsZnN1ZSIsICAgREVPKDYyLDUpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSVCwgREVTLCBSQVMgfSB9LAoreyAibGZkZSIsICAgIERFTyg2Miw2KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlQsIERFUywgUkEwIH0gfSwKK3sgImxmZHVlIiwgICBERU8oNjIsNyksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJULCBERVMsIFJBUyB9IH0sCit7ICJzdGRlIiwgICAgREVPKDYyLDgpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERVMsIFJBMCB9IH0sCit7ICJzdGR1ZSIsICAgREVPKDYyLDkpLCBERV9NQVNLLAlCT09LRTY0LAl7IFJTLCBERVMsIFJBUyB9IH0sCit7ICJzdGZzZSIsICAgREVPKDYyLDEyKSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlMsIERFUywgUkEwIH0gfSwKK3sgInN0ZnN1ZSIsICBERU8oNjIsMTMpLCBERV9NQVNLLAlCT09LRTY0LAl7IEZSUywgREVTLCBSQVMgfSB9LAoreyAic3RmZGUiLCAgIERFTyg2MiwxNCksIERFX01BU0ssCUJPT0tFNjQsCXsgRlJTLCBERVMsIFJBMCB9IH0sCit7ICJzdGZkdWUiLCAgREVPKDYyLDE1KSwgREVfTUFTSywJQk9PS0U2NCwJeyBGUlMsIERFUywgUkFTIH0gfSwKKworeyAic3RkIiwgICAgIERTTyg2MiwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkEwIH0gfSwKKworeyAic3RkdSIsICAgIERTTyg2MiwxKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkFTIH0gfSwKKworeyAic3RxIiwgICAgIERTTyg2MiwyKSwJRFNfTUFTSywJUE9XRVI0LAkJeyBSU1EsIERTLCBSQTAgfSB9LAorCit7ICJmY21wdSIsICAgWCg2MywwKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKKworeyAiZGFkZHEiLCAgIFhSQyg2MywyLDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkYWRkcS4iLCAgWFJDKDYzLDIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZHF1YXEiLCAgIFpSQyg2MywzLDApLCBaMl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCit7ICJkcXVhcS4iLCAgWlJDKDYzLDMsMSksIFoyX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKKworeyAiZmNwc2duIiwgIFhSQyg2Myw4LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmY3BzZ24uIiwgWFJDKDYzLDgsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZnJzcCIsICAgIFhSQyg2MywxMiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJzcC4iLCAgIFhSQyg2MywxMiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmY3RpdyIsICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmY2lyIiwgICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmY3Rpdy4iLCAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmY2lyLiIsICAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImZjdGl3eiIsICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjaXJ6IiwgICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjdGl3ei4iLCBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjaXJ6LiIsICBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZmRpdiIsICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZkIiwgICAgICBBKDYzLDE4LDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmZGl2LiIsICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmQuIiwgICAgIEEoNjMsMTgsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZnN1YiIsICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZzIiwgICAgICBBKDYzLDIwLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmc3ViLiIsICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZnMuIiwgICAgIEEoNjMsMjAsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZmFkZCIsICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImZhIiwgICAgICBBKDYzLDIxLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJmYWRkLiIsICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZmEuIiwgICAgIEEoNjMsMjEsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKKworeyAiZnNxcnQiLCAgIEEoNjMsMjIsMCksIEFGUkFGUkNfTUFTSywJUFBDUFdSMiwJeyBGUlQsIEZSQiB9IH0sCit7ICJmc3FydC4iLCAgQSg2MywyMiwxKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKKworeyAiZnNlbCIsICAgIEEoNjMsMjMsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZnNlbC4iLCAgIEEoNjMsMjMsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJmcmUiLCAgICAgQSg2MywyNCwwKSwgQUZSQUxGUkNfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyZS4iLCAgICBBKDYzLDI0LDEpLCBBRlJBTEZSQ19NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAorCit7ICJmbXVsIiwgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoreyAiZm0iLCAgICAgIEEoNjMsMjUsMCksIEFGUkJfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKK3sgImZtdWwuIiwgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCit7ICJmbS4iLCAgICAgQSg2MywyNSwxKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAorCit7ICJmcnNxcnRlIiwgQSg2MywyNiwwKSwgQUZSQUxGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiwgQV9MIH0gfSwKK3sgImZyc3FydGUuIixBKDYzLDI2LDEpLCBBRlJBTEZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCLCBBX0wgfSB9LAorCit7ICJmbXN1YiIsICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbXMiLCAgICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbXN1Yi4iLCAgQSg2MywyOCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbXMuIiwgICAgQSg2MywyOCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZtYWRkIiwgICBBKDYzLDI5LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtYSIsICAgICBBKDYzLDI5LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtYWRkLiIsICBBKDYzLDI5LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKK3sgImZtYS4iLCAgICBBKDYzLDI5LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKKworeyAiZm5tc3ViIiwgIEEoNjMsMzAsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm5tcyIsICAgIEEoNjMsMzAsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm5tc3ViLiIsIEEoNjMsMzAsMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoreyAiZm5tcy4iLCAgIEEoNjMsMzAsMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAorCit7ICJmbm1hZGQiLCAgQSg2MywzMSwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1hIiwgICAgQSg2MywzMSwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1hZGQuIiwgQSg2MywzMSwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCit7ICJmbm1hLiIsICAgQSg2MywzMSwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCisKK3sgImZjbXBvIiwgICBYKDYzLDMyKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKKworeyAiZG11bHEiLCAgIFhSQyg2MywzNCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoreyAiZG11bHEuIiwgIFhSQyg2MywzNCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJkcnJuZHEiLCAgWlJDKDYzLDM1LDApLCBaMl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCit7ICJkcnJuZHEuIiwgWlJDKDYzLDM1LDEpLCBaMl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIsIFJNQyB9IH0sCisKK3sgIm10ZnNiMSIsICBYUkMoNjMsMzgsMCksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAoreyAibXRmc2IxLiIsIFhSQyg2MywzOCwxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCisKK3sgImZuZWciLCAgICBYUkMoNjMsNDAsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZuZWcuIiwgICBYUkMoNjMsNDAsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKKworeyAibWNyZnMiLCAgIFgoNjMsNjQpLAlYUkJfTUFTS3woMzw8MjEpfCgzPDwxNiksIENPTSwJeyBCRiwgQkZBIH0gfSwKKworeyAiZHNjbGlxIiwgIFpSQyg2Myw2NiwwKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKK3sgImRzY2xpcS4iLCBaUkMoNjMsNjYsMSksIFpfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgU0gxNiB9IH0sCisKK3sgImRxdWFpcSIsICBaUkMoNjMsNjcsMCksIFoyX01BU0ssCVBPV0VSNiwJCXsgVEUsICBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRxdWFpcS4iLCBaUkMoNjMsNjcsMSksIFoyX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiwgUk1DIH0gfSwKKworeyAibXRmc2IwIiwgIFhSQyg2Myw3MCwwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCit7ICJtdGZzYjAuIiwgWFJDKDYzLDcwLDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKKworeyAiZm1yIiwgICAgIFhSQyg2Myw3MiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZm1yLiIsICAgIFhSQyg2Myw3MiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJkc2NyaXEiLCAgWlJDKDYzLDk4LDApLCBaX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIFNIMTYgfSB9LAoreyAiZHNjcmlxLiIsIFpSQyg2Myw5OCwxKSwgWl9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBTSDE2IH0gfSwKKworeyAiZHJpbnR4cSIsIFpSQyg2Myw5OSwwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50eHEuIixaUkMoNjMsOTksMSksIFoyX01BU0ssCVBPV0VSNiwJCXsgUiwgRlJULCBGUkIsIFJNQyB9IH0sCisKK3sgImRjbXBvcSIsICBYKDYzLDEzMCksCSAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAibXRmc2ZpIiwgIFhSQyg2MywxMzQsMCksIFhXUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRkYsIFUsIFcgfSB9LAoreyAibXRmc2ZpLiIsIFhSQyg2MywxMzQsMSksIFhXUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRkYsIFUsIFcgfSB9LAorCit7ICJmbmFicyIsICAgWFJDKDYzLDEzNiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZm5hYnMuIiwgIFhSQyg2MywxMzYsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZHRzdGV4cSIsIFgoNjMsMTYyKSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKK3sgImR0c3RkY3EiLCBaKDYzLDE5NCksCSAgICBaX01BU0ssCVBPV0VSNiwJCXsgQkYsICBGUkEsIERDTSB9IH0sCit7ICJkdHN0ZGdxIiwgWig2MywyMjYpLAkgICAgWl9NQVNLLAlQT1dFUjYsCQl7IEJGLCAgRlJBLCBER00gfSB9LAorCit7ICJkcmludG5xIiwgWlJDKDYzLDIyNywwKSwgWjJfTUFTSywJUE9XRVI2LAkJeyBSLCBGUlQsIEZSQiwgUk1DIH0gfSwKK3sgImRyaW50bnEuIixaUkMoNjMsMjI3LDEpLCBaMl9NQVNLLAlQT1dFUjYsCQl7IFIsIEZSVCwgRlJCLCBSTUMgfSB9LAorCit7ICJkY3RxcHEiLCAgWFJDKDYzLDI1OCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImRjdHFwcS4iLCBYUkMoNjMsMjU4LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmYWJzIiwgICAgWFJDKDYzLDI2NCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmFicy4iLCAgIFhSQyg2MywyNjQsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGN0Zml4cSIsIFhSQyg2MywyOTAsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkY3RmaXhxLiIsWFJDKDYzLDI5MCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGRlZHBkcSIsIFhSQyg2MywzMjIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBTUCwgRlJULCBGUkIgfSB9LAoreyAiZGRlZHBkcS4iLFhSQyg2MywzMjIsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBTUCwgRlJULCBGUkIgfSB9LAorCit7ICJkeGV4cSIsICAgWFJDKDYzLDM1NCwwKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImR4ZXhxLiIsICBYUkMoNjMsMzU0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmcmluIiwgICAgWFJDKDYzLDM5MiwwKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpbi4iLCAgIFhSQyg2MywzOTIsMSksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaXoiLCAgICBYUkMoNjMsNDI0LDApLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcml6LiIsICAgWFJDKDYzLDQyNCwxKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpcCIsICAgIFhSQyg2Myw0NTYsMCksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZyaXAuIiwgICBYUkMoNjMsNDU2LDEpLCBYUkFfTUFTSywJUE9XRVI1LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmcmltIiwgICAgWFJDKDYzLDQ4OCwwKSwgWFJBX01BU0ssCVBPV0VSNSwJCXsgRlJULCBGUkIgfSB9LAoreyAiZnJpbS4iLCAgIFhSQyg2Myw0ODgsMSksIFhSQV9NQVNLLAlQT1dFUjUsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZHN1YnEiLCAgIFhSQyg2Myw1MTQsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRzdWJxLiIsICBYUkMoNjMsNTE0LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK3sgImRkaXZxIiwgICBYUkMoNjMsNTQ2LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCit7ICJkZGl2cS4iLCAgWFJDKDYzLDU0NiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAorCit7ICJtZmZzIiwgICAgWFJDKDYzLDU4MywwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBGUlQgfSB9LAoreyAibWZmcy4iLCAgIFhSQyg2Myw1ODMsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgRlJUIH0gfSwKKworeyAiZGNtcHVxIiwgIFgoNjMsNjQyKSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAiZHRzdHNmcSIsIFgoNjMsNjc0KSwJICAgIFhfTUFTSywJUE9XRVI2LAkJeyBCRiwgIEZSQSwgRlJCIH0gfSwKKworeyAibXRmc2YiLCAgIFhGTCg2Myw3MTEsMCksIFhGTF9NQVNLLAlDT00sCQl7IEZMTSwgRlJCLCBYRkxfTCwgVyB9IH0sCit7ICJtdGZzZi4iLCAgWEZMKDYzLDcxMSwxKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIsIFhGTF9MLCBXIH0gfSwKKworeyAiZHJkcHEiLCAgIFhSQyg2Myw3NzAsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkcmRwcS4iLCAgWFJDKDYzLDc3MCwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGNmZml4cSIsIFhSQyg2Myw4MDIsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJkY2ZmaXhxLiIsWFJDKDYzLDgwMiwxKSwgWF9NQVNLLAlQT1dFUjYsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZmN0aWQiLCAgIFhSQyg2Myw4MTQsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoreyAiZmN0aWQuIiwgIFhSQyg2Myw4MTQsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAorCit7ICJmY3RpZHoiLCAgWFJDKDYzLDgxNSwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCit7ICJmY3RpZHouIiwgWFJDKDYzLDgxNSwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCisKK3sgImRlbmJjZHEiLCBYUkMoNjMsODM0LDApLCBYX01BU0ssCVBPV0VSNiwJCXsgUywgRlJULCBGUkIgfSB9LAoreyAiZGVuYmNkcS4iLFhSQyg2Myw4MzQsMSksIFhfTUFTSywJUE9XRVI2LAkJeyBTLCBGUlQsIEZSQiB9IH0sCisKK3sgImZjZmlkIiwgICBYUkMoNjMsODQ2LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKK3sgImZjZmlkLiIsICBYUkMoNjMsODQ2LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKKworeyAiZGlleHEiLCAgIFhSQyg2Myw4NjYsMCksIFhfTUFTSywJUE9XRVI2LAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKK3sgImRpZXhxLiIsICBYUkMoNjMsODY2LDEpLCBYX01BU0ssCVBPV0VSNiwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCisKK307CisKK2NvbnN0IGludCBwb3dlcnBjX251bV9vcGNvZGVzID0KKyAgc2l6ZW9mIChwb3dlcnBjX29wY29kZXMpIC8gc2l6ZW9mIChwb3dlcnBjX29wY29kZXNbMF0pOworDAorLyogVGhlIG1hY3JvIHRhYmxlLiAgVGhpcyBpcyBvbmx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gICovCisKKy8qIFRoZSBleHByZXNzaW9ucyBvZiB0aGUgZm9ybSAoLXggISAzMSkgJiAoeCB8IDMxKSBoYXZlIHRoZSB2YWx1ZSAwCisgICB3aGVuIHg9MDsgMzIteCB3aGVuIHggaXMgYmV0d2VlbiAxIGFuZCAzMTsgYXJlIG5lZ2F0aXZlIGlmIHggaXMKKyAgIG5lZ2F0aXZlOyBhbmQgYXJlIDMyIG9yIG1vcmUgb3RoZXJ3aXNlLiAgVGhpcyBpcyB3aGF0IHlvdSB3YW50CisgICB3aGVuLCBmb3IgaW5zdGFuY2UsIHlvdSBhcmUgZW11bGF0aW5nIGEgcmlnaHQgc2hpZnQgYnkgYQorICAgcm90YXRlLWxlZnQtYW5kLW1hc2ssIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb25zIHN1cHBvcnQKKyAgIHNoaWZ0cyBvZiBzaXplIDAgYnV0IG5vdCBzaGlmdHMgb2Ygc2l6ZSAzMi4gIEJ5IGNvbXBhcmlzb24sIHdoZW4KKyAgIGV4dHJhY3RpbmcgeCBiaXRzIGZyb20gc29tZSB3b3JkIHlvdSB3YW50IHRvIHVzZSBqdXN0IDMyLXgsIGJlY2F1c2UKKyAgIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9ucyBkb24ndCBzdXBwb3J0IGV4dHJhY3RpbmcgMCBiaXRzIGJ1dCBkbworICAgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSB3aG9sZSB3b3JkICgzMiBiaXRzIGluIHRoaXMgY2FzZSkuICAqLworCitjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdID0geworeyAiZXh0bGRpIiwgIDQsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsJTMsKCUyKS0xIiB9LAoreyAiZXh0bGRpLiIsIDQsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLCUzLCglMiktMSIgfSwKK3sgImV4dHJkaSIsICA0LCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCglMikrKCUzKSw2NC0oJTIpIiB9LAoreyAiZXh0cmRpLiIsIDQsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCglMikrKCUzKSw2NC0oJTIpIiB9LAoreyAiaW5zcmRpIiwgIDQsICAgUFBDNjQsCSJybGRpbWkgJTAsJTEsNjQtKCglMikrKCUzKSksJTMiIH0sCit7ICJpbnNyZGkuIiwgNCwgICBQUEM2NCwJInJsZGltaS4gJTAsJTEsNjQtKCglMikrKCUzKSksJTMiIH0sCit7ICJyb3RyZGkiLCAgMywgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwwIiB9LAoreyAicm90cmRpLiIsIDMsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLDAiIH0sCit7ICJzbGRpIiwgICAgMywgICBQUEM2NCwJInJsZGljciAlMCwlMSwlMiw2My0oJTIpIiB9LAoreyAic2xkaS4iLCAgIDMsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLCUyLDYzLSglMikiIH0sCit7ICJzcmRpIiwgICAgMywgICBQUEM2NCwJInJsZGljbCAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwlMiIgfSwKK3sgInNyZGkuIiwgICAzLCAgIFBQQzY0LAkicmxkaWNsLiAlMCwlMSwoLSglMikhNjMpJigoJTIpfDYzKSwlMiIgfSwKK3sgImNscnJkaSIsICAzLCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLDAsNjMtKCUyKSIgfSwKK3sgImNscnJkaS4iLCAzLCAgIFBQQzY0LAkicmxkaWNyLiAlMCwlMSwwLDYzLSglMikiIH0sCit7ICJjbHJsc2xkaSIsNCwgICBQUEM2NCwJInJsZGljICUwLCUxLCUzLCglMiktKCUzKSIgfSwKK3sgImNscmxzbGRpLiIsNCwgIFBQQzY0LAkicmxkaWMuICUwLCUxLCUzLCglMiktKCUzKSIgfSwKKworeyAiZXh0bHdpIiwgIDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUzLDAsKCUyKS0xIiB9LAoreyAiZXh0bHdpLiIsIDQsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMywwLCglMiktMSIgfSwKK3sgImV4dHJ3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoKCUyKSsoJTMpKSYoKCUyKSsoJTMpPD4zMiksMzItKCUyKSwzMSIgfSwKK3sgImV4dHJ3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKCglMikrKCUzKSkmKCglMikrKCUzKTw+MzIpLDMyLSglMiksMzEiIH0sCit7ICJpbnNsd2kiLCAgNCwgICBQUENDT00sCSJybHdpbWkgJTAsJTEsKC0oJTMpITMxKSYoKCUzKXwzMSksJTMsKCUyKSsoJTMpLTEiIH0sCit7ICJpbnNsd2kuIiwgNCwgICBQUENDT00sCSJybHdpbWkuICUwLCUxLCgtKCUzKSEzMSkmKCglMyl8MzEpLCUzLCglMikrKCUzKS0xIn0sCit7ICJpbnNyd2kiLCAgNCwgICBQUENDT00sCSJybHdpbWkgJTAsJTEsMzItKCglMikrKCUzKSksJTMsKCUyKSsoJTMpLTEiIH0sCit7ICJpbnNyd2kuIiwgNCwgICBQUENDT00sCSJybHdpbWkuICUwLCUxLDMyLSgoJTIpKyglMykpLCUzLCglMikrKCUzKS0xIn0sCit7ICJyb3Ryd2kiLCAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksMCwzMSIgfSwKK3sgInJvdHJ3aS4iLCAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksMCwzMSIgfSwKK3sgInNsd2kiLCAgICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwlMiwwLDMxLSglMikiIH0sCit7ICJzbGkiLCAgICAgMywgICBQV1JDT00sCSJybGlubSAlMCwlMSwlMiwwLDMxLSglMikiIH0sCit7ICJzbHdpLiIsICAgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKK3sgInNsaS4iLCAgICAzLCAgIFBXUkNPTSwJInJsaW5tLiAlMCwlMSwlMiwwLDMxLSglMikiIH0sCit7ICJzcndpIiwgICAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCit7ICJzcmkiLCAgICAgMywgICBQV1JDT00sCSJybGlubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKK3sgInNyd2kuIiwgICAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCit7ICJzcmkuIiwgICAgMywgICBQV1JDT00sCSJybGlubS4gJTAsJTEsKC0oJTIpITMxKSYoKCUyKXwzMSksJTIsMzEiIH0sCit7ICJjbHJyd2kiLCAgMywgICBQUENDT00sCSJybHdpbm0gJTAsJTEsMCwwLDMxLSglMikiIH0sCit7ICJjbHJyd2kuIiwgMywgICBQUENDT00sCSJybHdpbm0uICUwLCUxLDAsMCwzMS0oJTIpIiB9LAoreyAiY2xybHNsd2kiLDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUzLCglMiktKCUzKSwzMS0oJTMpIiB9LAoreyAiY2xybHNsd2kuIiw0LCAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwlMywoJTIpLSglMyksMzEtKCUzKSIgfSwKK307CisKK2NvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3MgPQorICBzaXplb2YgKHBvd2VycGNfbWFjcm9zKSAvIHNpemVvZiAocG93ZXJwY19tYWNyb3NbMF0pOworCisKKy8qIFRoaXMgZmlsZSBwcm92aWRlcyBzZXZlcmFsIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMsIGFsbCBvZiB3aGljaCB1c2UKKyAgIHRoZSBkaXNhc3NlbWJsZXIgaW50ZXJmYWNlIGRlZmluZWQgaW4gZGlzLWFzbS5oLiAgU2V2ZXJhbCBmdW5jdGlvbnMKKyAgIGFyZSBwcm92aWRlZCBiZWNhdXNlIHRoaXMgZmlsZSBoYW5kbGVzIGRpc2Fzc2VtYmx5IGZvciB0aGUgUG93ZXJQQworICAgaW4gYm90aCBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gbW9kZSBhbmQgYWxzbyBmb3IgdGhlIFBPV0VSIChSUy82MDAwKQorICAgY2hpcC4gICovCisKK3N0YXRpYyBpbnQgcHJpbnRfaW5zbl9wb3dlcnBjIChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBpbnQsIGludCk7CisKKy8qIERldGVybWluZSB3aGljaCBzZXQgb2YgbWFjaGluZXMgdG8gZGlzYXNzZW1ibGUgZm9yLiAgUFBDNDAzLzYwMSBvcgorICAgQm9va0UuICBGb3IgY29udmVuaWVuY2UsIGFsc28gZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZAorICAgYnkgdGhlIEFsdGlWZWMgdmVjdG9yIHVuaXQuICAqLworCitzdGF0aWMgaW50Citwb3dlcnBjX2RpYWxlY3QgKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBpbnQgZGlhbGVjdCA9IFBQQ19PUENPREVfUFBDOworCisgIGlmIChCRkRfREVGQVVMVF9UQVJHRVRfU0laRSA9PSA2NCkKKyAgICBkaWFsZWN0IHw9IFBQQ19PUENPREVfNjQ7CisKKyAgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zCisgICAgICAmJiBzdHJzdHIgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zLCAiYm9va2UiKSAhPSBOVUxMKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9CT09LRSB8IFBQQ19PUENPREVfQk9PS0U2NDsKKyAgZWxzZSBpZiAoKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfcHBjX2U1MDApCisJICAgfHwgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zCisJICAgICAgICYmIHN0cnN0ciAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMsICJlNTAwIikgIT0gTlVMTCkpCisgICAgZGlhbGVjdCB8PSAoUFBDX09QQ09ERV9CT09LRQorCQl8IFBQQ19PUENPREVfU1BFIHwgUFBDX09QQ09ERV9JU0VMCisJCXwgUFBDX09QQ09ERV9FRlMgfCBQUENfT1BDT0RFX0JSTE9DSworCQl8IFBQQ19PUENPREVfUE1SIHwgUFBDX09QQ09ERV9DQUNIRUxDSworCQl8IFBQQ19PUENPREVfUkZNQ0kpOworICBlbHNlIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucworCSAgICYmIHN0cnN0ciAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMsICJlZnMiKSAhPSBOVUxMKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9FRlM7CisgIGVsc2UgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zCisJICAgJiYgc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgImUzMDAiKSAhPSBOVUxMKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9FMzAwIHwgUFBDX09QQ09ERV9DTEFTU0lDIHwgUFBDX09QQ09ERV9DT01NT047CisgIGVsc2UgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zCisJICAgJiYgc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgIjQ0MCIpICE9IE5VTEwpCisgICAgZGlhbGVjdCB8PSBQUENfT1BDT0RFX0JPT0tFIHwgUFBDX09QQ09ERV8zMgorICAgICAgfCBQUENfT1BDT0RFXzQ0MCB8IFBQQ19PUENPREVfSVNFTCB8IFBQQ19PUENPREVfUkZNQ0k7CisgIGVsc2UKKyAgICBkaWFsZWN0IHw9IChQUENfT1BDT0RFXzQwMyB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9DTEFTU0lDCisJCXwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FMVElWRUMpOworCisgIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucworICAgICAgJiYgc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgInBvd2VyNCIpICE9IE5VTEwpCisgICAgZGlhbGVjdCB8PSBQUENfT1BDT0RFX1BPV0VSNDsKKworICBpZiAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMKKyAgICAgICYmIHN0cnN0ciAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMsICJwb3dlcjUiKSAhPSBOVUxMKQorICAgIGRpYWxlY3QgfD0gUFBDX09QQ09ERV9QT1dFUjQgfCBQUENfT1BDT0RFX1BPV0VSNTsKKworICBpZiAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMKKyAgICAgICYmIHN0cnN0ciAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMsICJjZWxsIikgIT0gTlVMTCkKKyAgICBkaWFsZWN0IHw9IFBQQ19PUENPREVfUE9XRVI0IHwgUFBDX09QQ09ERV9DRUxMIHwgUFBDX09QQ09ERV9BTFRJVkVDOworCisgIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucworICAgICAgJiYgc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgInBvd2VyNiIpICE9IE5VTEwpCisgICAgZGlhbGVjdCB8PSBQUENfT1BDT0RFX1BPV0VSNCB8IFBQQ19PUENPREVfUE9XRVI1IHwgUFBDX09QQ09ERV9QT1dFUjYgfCBQUENfT1BDT0RFX0FMVElWRUM7CisKKyAgaWYgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zCisgICAgICAmJiBzdHJzdHIgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zLCAiYW55IikgIT0gTlVMTCkKKyAgICBkaWFsZWN0IHw9IFBQQ19PUENPREVfQU5ZOworCisgIGlmIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucykKKyAgICB7CisgICAgICBpZiAoc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgIjMyIikgIT0gTlVMTCkKKwlkaWFsZWN0ICY9IH5QUENfT1BDT0RFXzY0OworICAgICAgZWxzZSBpZiAoc3Ryc3RyIChpbmZvLT5kaXNhc3NlbWJsZXJfb3B0aW9ucywgIjY0IikgIT0gTlVMTCkKKwlkaWFsZWN0IHw9IFBQQ19PUENPREVfNjQ7CisgICAgfQorCisgIGluZm8tPnByaXZhdGVfZGF0YSA9IChjaGFyICopIDAgKyBkaWFsZWN0OworICByZXR1cm4gZGlhbGVjdDsKK30KKworLyogUUVNVSBkZWZhdWx0ICovCitpbnQKK3ByaW50X2luc25fcHBjIChiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBpbnQgZGlhbGVjdCA9IChjaGFyICopIGluZm8tPnByaXZhdGVfZGF0YSAtIChjaGFyICopIDA7CisgIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdCk7Cit9CisKKy8qIFByaW50IGEgYmlnIGVuZGlhbiBQb3dlclBDIGluc3RydWN0aW9uLiAgKi8KKworaW50CitwcmludF9pbnNuX2JpZ19wb3dlcnBjIChiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICBpbnQgZGlhbGVjdCA9IChjaGFyICopIGluZm8tPnByaXZhdGVfZGF0YSAtIChjaGFyICopIDA7CisgIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIGRpYWxlY3QpOworfQorCisvKiBQcmludCBhIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gICovCisKK2ludAorcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYyAoYmZkX3ZtYSBtZW1hZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbykKK3sKKyAgaW50IGRpYWxlY3QgPSAoY2hhciAqKSBpbmZvLT5wcml2YXRlX2RhdGEgLSAoY2hhciAqKSAwOworICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAwLCBkaWFsZWN0KTsKK30KKworLyogUHJpbnQgYSBQT1dFUiAoUlMvNjAwMCkgaW5zdHJ1Y3Rpb24uICAqLworCitpbnQKK3ByaW50X2luc25fcnM2MDAwIChiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKQoreworICByZXR1cm4gcHJpbnRfaW5zbl9wb3dlcnBjIChtZW1hZGRyLCBpbmZvLCAxLCBQUENfT1BDT0RFX1BPV0VSKTsKK30KKworLyogRXh0cmFjdCB0aGUgb3BlcmFuZCB2YWx1ZSBmcm9tIHRoZSBQb3dlclBDIG9yIFBPV0VSIGluc3RydWN0aW9uLiAgKi8KKworc3RhdGljIGxvbmcKK29wZXJhbmRfdmFsdWVfcG93ZXJwYyAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW50IGRpYWxlY3QpCit7CisgIGxvbmcgdmFsdWU7CisgIGludCBpbnZhbGlkOworICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCisgIGlmIChvcGVyYW5kLT5leHRyYWN0KQorICAgIHZhbHVlID0gKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgZGlhbGVjdCwgJmludmFsaWQpOworICBlbHNlCisgICAgeworICAgICAgdmFsdWUgPSAoaW5zbiA+PiBvcGVyYW5kLT5zaGlmdCkgJiBvcGVyYW5kLT5iaXRtOworICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgIT0gMCkKKwl7CisJICAvKiBCSVRNIGlzIGFsd2F5cyBzb21lIG51bWJlciBvZiB6ZXJvcyBmb2xsb3dlZCBieSBzb21lCisJICAgICBudW1iZXIgb2Ygb25lcywgZm9sbG93ZWQgYnkgc29tZSBudW1lciBvZiB6ZXJvcy4gICovCisJICB1bnNpZ25lZCBsb25nIHRvcCA9IG9wZXJhbmQtPmJpdG07CisJICAvKiB0b3AgJiAtdG9wIGdpdmVzIHRoZSByaWdodG1vc3QgMSBiaXQsIHNvIHRoaXMKKwkgICAgIGZpbGxzIGluIGFueSB0cmFpbGluZyB6ZXJvcy4gICovCisJICB0b3AgfD0gKHRvcCAmIC10b3ApIC0gMTsKKwkgIHRvcCAmPSB+KHRvcCA+PiAxKTsKKwkgIHZhbHVlID0gKHZhbHVlIF4gdG9wKSAtIHRvcDsKKwl9CisgICAgfQorCisgIHJldHVybiB2YWx1ZTsKK30KKworLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG9wdGlvbmFsIG9wZXJhbmQocykgc2hvdWxkIGJlIHByaW50ZWQuICAqLworCitzdGF0aWMgaW50Citza2lwX29wdGlvbmFsX29wZXJhbmRzIChjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4LAorCQkJdW5zaWduZWQgbG9uZyBpbnNuLCBpbnQgZGlhbGVjdCkKK3sKKyAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKKworICBmb3IgKDsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQorICAgIHsKKyAgICAgIG9wZXJhbmQgPSAmcG93ZXJwY19vcGVyYW5kc1sqb3BpbmRleF07CisgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVYVCkgIT0gMAorCSAgfHwgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX09QVElPTkFMKSAhPSAwCisJICAgICAgJiYgb3BlcmFuZF92YWx1ZV9wb3dlcnBjIChvcGVyYW5kLCBpbnNuLCBkaWFsZWN0KSAhPSAwKSkKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFByaW50IGEgUG93ZXJQQyBvciBQT1dFUiBpbnN0cnVjdGlvbi4gICovCisKK3N0YXRpYyBpbnQKK3ByaW50X2luc25fcG93ZXJwYyAoYmZkX3ZtYSBtZW1hZGRyLAorCQkgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sCisJCSAgICBpbnQgYmlnZW5kaWFuLAorCQkgICAgaW50IGRpYWxlY3QpCit7CisgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKKyAgaW50IHN0YXR1czsKKyAgdW5zaWduZWQgbG9uZyBpbnNuOworICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKKyAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOworICB1bnNpZ25lZCBsb25nIG9wOworCisgIGlmIChkaWFsZWN0ID09IDApCisgICAgZGlhbGVjdCA9IHBvd2VycGNfZGlhbGVjdCAoaW5mbyk7CisKKyAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKKyAgaWYgKHN0YXR1cyAhPSAwKQorICAgIHsKKyAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICBpZiAoYmlnZW5kaWFuKQorICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOworICBlbHNlCisgICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7CisKKyAgLyogR2V0IHRoZSBtYWpvciBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KKyAgb3AgPSBQUENfT1AgKGluc24pOworCisgIC8qIEZpbmQgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBvcGNvZGUgdGFibGUuICBXZSBjb3VsZCBzcGVlZCB0aGlzIHVwCisgICAgIGEgYml0IGJ5IGRvaW5nIGEgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbWFqb3Igb3Bjb2RlLiAgKi8KKyAgb3Bjb2RlX2VuZCA9IHBvd2VycGNfb3Bjb2RlcyArIHBvd2VycGNfbnVtX29wY29kZXM7CisgYWdhaW46CisgIGZvciAob3Bjb2RlID0gcG93ZXJwY19vcGNvZGVzOyBvcGNvZGUgPCBvcGNvZGVfZW5kOyBvcGNvZGUrKykKKyAgICB7CisgICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX29wOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKKyAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7CisgICAgICBpbnQgaW52YWxpZDsKKyAgICAgIGludCBuZWVkX2NvbW1hOworICAgICAgaW50IG5lZWRfcGFyZW47CisgICAgICBpbnQgc2tpcF9vcHRpb25hbDsKKworICAgICAgdGFibGVfb3AgPSBQUENfT1AgKG9wY29kZS0+b3Bjb2RlKTsKKyAgICAgIGlmIChvcCA8IHRhYmxlX29wKQorCWJyZWFrOworICAgICAgaWYgKG9wID4gdGFibGVfb3ApCisJY29udGludWU7CisKKyAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgIT0gb3Bjb2RlLT5vcGNvZGUKKwkgIHx8IChvcGNvZGUtPmZsYWdzICYgZGlhbGVjdCkgPT0gMCkKKwljb250aW51ZTsKKworICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCisJIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQorCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCisgICAgICBpbnZhbGlkID0gMDsKKyAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKKwl7CisJICBvcGVyYW5kID0gcG93ZXJwY19vcGVyYW5kcyArICpvcGluZGV4OworCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCisJICAgICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIGRpYWxlY3QsICZpbnZhbGlkKTsKKwl9CisgICAgICBpZiAoaW52YWxpZCkKKwljb250aW51ZTsKKworICAgICAgLyogVGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KKyAgICAgIGlmIChvcGNvZGUtPm9wZXJhbmRzWzBdICE9IDApCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlLTdzICIsIG9wY29kZS0+bmFtZSk7CisgICAgICBlbHNlCisJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7CisKKyAgICAgIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLworICAgICAgbmVlZF9jb21tYSA9IDA7CisgICAgICBuZWVkX3BhcmVuID0gMDsKKyAgICAgIHNraXBfb3B0aW9uYWwgPSAtMTsKKyAgICAgIGZvciAob3BpbmRleCA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4ICE9IDA7IG9waW5kZXgrKykKKwl7CisJICBsb25nIHZhbHVlOworCisJICBvcGVyYW5kID0gcG93ZXJwY19vcGVyYW5kcyArICpvcGluZGV4OworCisJICAvKiBPcGVyYW5kcyB0aGF0IGFyZSBtYXJrZWQgRkFLRSBhcmUgc2ltcGx5IGlnbm9yZWQuICBXZQorCSAgICAgYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCB0aGUgZXh0cmFjdCBmdW5jdGlvbiBjb25zaWRlcmVkCisJICAgICB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmFsaWQuICAqLworCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZBS0UpICE9IDApCisJICAgIGNvbnRpbnVlOworCisJICAvKiBJZiBhbGwgb2YgdGhlIG9wdGlvbmFsIG9wZXJhbmRzIGhhdmUgdGhlIHZhbHVlIHplcm8sCisJICAgICB0aGVuIGRvbid0IHByaW50IGFueSBvZiB0aGVtLiAgKi8KKwkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMCkKKwkgICAgeworCSAgICAgIGlmIChza2lwX29wdGlvbmFsIDwgMCkKKwkJc2tpcF9vcHRpb25hbCA9IHNraXBfb3B0aW9uYWxfb3BlcmFuZHMgKG9waW5kZXgsIGluc24sCisJCQkJCQkJZGlhbGVjdCk7CisJICAgICAgaWYgKHNraXBfb3B0aW9uYWwpCisJCWNvbnRpbnVlOworCSAgICB9CisKKwkgIHZhbHVlID0gb3BlcmFuZF92YWx1ZV9wb3dlcnBjIChvcGVyYW5kLCBpbnNuLCBkaWFsZWN0KTsKKworCSAgaWYgKG5lZWRfY29tbWEpCisJICAgIHsKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKKwkgICAgICBuZWVkX2NvbW1hID0gMDsKKwkgICAgfQorCisJICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLworCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0dQUikgIT0gMAorCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFJfMCkgIT0gMCAmJiB2YWx1ZSAhPSAwKSkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJyJWxkIiwgdmFsdWUpOworCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRlBSKSAhPSAwKQorCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImYlbGQiLCB2YWx1ZSk7CisJICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9WUikgIT0gMCkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ2JWxkIiwgdmFsdWUpOworCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCisJICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIHZhbHVlLCBpbmZvKTsKKwkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQorCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOworCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpID09IDAKKwkJICAgfHwgKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BQQykgPT0gMCkKKwkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7CisJICBlbHNlCisJICAgIHsKKwkgICAgICBpZiAob3BlcmFuZC0+Yml0bSA9PSA3KQorCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWxkIiwgdmFsdWUpOworCSAgICAgIGVsc2UKKwkJeworCQkgIHN0YXRpYyBjb25zdCBjaGFyICpjYm5hbWVzWzRdID0geyAibHQiLCAiZ3QiLCAiZXEiLCAic28iIH07CisJCSAgaW50IGNyOworCQkgIGludCBjYzsKKworCQkgIGNyID0gdmFsdWUgPj4gMjsKKwkJICBpZiAoY3IgIT0gMCkKKwkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiNCpjciVkKyIsIGNyKTsKKwkJICBjYyA9IHZhbHVlICYgMzsKKwkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgY2JuYW1lc1tjY10pOworCQl9CisJICAgIH0KKworCSAgaWYgKG5lZWRfcGFyZW4pCisJICAgIHsKKwkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKKwkgICAgICBuZWVkX3BhcmVuID0gMDsKKwkgICAgfQorCisJICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUEFSRU5TKSA9PSAwKQorCSAgICBuZWVkX2NvbW1hID0gMTsKKwkgIGVsc2UKKwkgICAgeworCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOworCSAgICAgIG5lZWRfcGFyZW4gPSAxOworCSAgICB9CisJfQorCisgICAgICAvKiBXZSBoYXZlIGZvdW5kIGFuZCBwcmludGVkIGFuIGluc3RydWN0aW9uOyByZXR1cm4uICAqLworICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgIGlmICgoZGlhbGVjdCAmIFBQQ19PUENPREVfQU5ZKSAhPSAwKQorICAgIHsKKyAgICAgIGRpYWxlY3QgPSB+UFBDX09QQ09ERV9BTlk7CisgICAgICBnb3RvIGFnYWluOworICAgIH0KKworICAvKiBXZSBjb3VsZCBub3QgZmluZCBhIG1hdGNoLiAgKi8KKyAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZyAweCVseCIsIGluc24pOworCisgIHJldHVybiA0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9kbWEtaGVscGVycy5jIGIvYW5kcm9pZC9xZW11MS9kbWEtaGVscGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDIxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2RtYS1oZWxwZXJzLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBETUEgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHTlUgR1BMKSwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlICJzeXNlbXUvZG1hLmgiCisjaW5jbHVkZSAiYmxvY2svYmxvY2tfaW50LmgiCisKK3ZvaWQgcWVtdV9zZ2xpc3RfaW5pdChRRU1VU0dMaXN0ICpxc2csIGludCBhbGxvY19oaW50KQoreworICAgIHFzZy0+c2cgPSBnX21hbGxvYyhhbGxvY19oaW50ICogc2l6ZW9mKFNjYXR0ZXJHYXRoZXJFbnRyeSkpOworICAgIHFzZy0+bnNnID0gMDsKKyAgICBxc2ctPm5hbGxvYyA9IGFsbG9jX2hpbnQ7CisgICAgcXNnLT5zaXplID0gMDsKK30KKwordm9pZCBxZW11X3NnbGlzdF9hZGQoUUVNVVNHTGlzdCAqcXNnLCBod2FkZHIgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBsZW4pCit7CisgICAgaWYgKHFzZy0+bnNnID09IHFzZy0+bmFsbG9jKSB7CisgICAgICAgIHFzZy0+bmFsbG9jID0gMiAqIHFzZy0+bmFsbG9jICsgMTsKKyAgICAgICAgcXNnLT5zZyA9IGdfcmVhbGxvYyhxc2ctPnNnLCBxc2ctPm5hbGxvYyAqIHNpemVvZihTY2F0dGVyR2F0aGVyRW50cnkpKTsKKyAgICB9CisgICAgcXNnLT5zZ1txc2ctPm5zZ10uYmFzZSA9IGJhc2U7CisgICAgcXNnLT5zZ1txc2ctPm5zZ10ubGVuID0gbGVuOworICAgIHFzZy0+c2l6ZSArPSBsZW47CisgICAgKytxc2ctPm5zZzsKK30KKwordm9pZCBxZW11X3NnbGlzdF9kZXN0cm95KFFFTVVTR0xpc3QgKnFzZykKK3sKKyAgICBnX2ZyZWUocXNnLT5zZyk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBCbG9ja0RyaXZlckFJT0NCIGNvbW1vbjsKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiczsKKyAgICBCbG9ja0RyaXZlckFJT0NCICphY2I7CisgICAgUUVNVVNHTGlzdCAqc2c7CisgICAgdWludDY0X3Qgc2VjdG9yX251bTsKKyAgICBpbnQgaXNfd3JpdGU7CisgICAgaW50IHNnX2N1cl9pbmRleDsKKyAgICBod2FkZHIgc2dfY3VyX2J5dGU7CisgICAgUUVNVUlPVmVjdG9yIGlvdjsKKyAgICBRRU1VQkggKmJoOworfSBETUFBSU9DQjsKKworc3RhdGljIHZvaWQgZG1hX2JkcnZfY2Iodm9pZCAqb3BhcXVlLCBpbnQgcmV0KTsKKworc3RhdGljIHZvaWQgcmVzY2hlZHVsZV9kbWEodm9pZCAqb3BhcXVlKQoreworICAgIERNQUFJT0NCICpkYnMgPSAoRE1BQUlPQ0IgKilvcGFxdWU7CisKKyAgICBxZW11X2JoX2RlbGV0ZShkYnMtPmJoKTsKKyAgICBkYnMtPmJoID0gTlVMTDsKKyAgICBkbWFfYmRydl9jYihvcGFxdWUsIDApOworfQorCitzdGF0aWMgdm9pZCBjb250aW51ZV9hZnRlcl9tYXBfZmFpbHVyZSh2b2lkICpvcGFxdWUpCit7CisgICAgRE1BQUlPQ0IgKmRicyA9IChETUFBSU9DQiAqKW9wYXF1ZTsKKworICAgIGRicy0+YmggPSBxZW11X2JoX25ldyhyZXNjaGVkdWxlX2RtYSwgZGJzKTsKKyAgICBxZW11X2JoX3NjaGVkdWxlKGRicy0+YmgpOworfQorCitzdGF0aWMgdm9pZCBkbWFfYmRydl91bm1hcChETUFBSU9DQiAqZGJzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGRicy0+aW92Lm5pb3Y7ICsraSkgeworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3VubWFwKGRicy0+aW92LmlvdltpXS5pb3ZfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYnMtPmlvdi5pb3ZbaV0uaW92X2xlbiwgIWRicy0+aXNfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJzLT5pb3YuaW92W2ldLmlvdl9sZW4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZG1hX2JkcnZfY2Iodm9pZCAqb3BhcXVlLCBpbnQgcmV0KQoreworICAgIERNQUFJT0NCICpkYnMgPSAoRE1BQUlPQ0IgKilvcGFxdWU7CisgICAgaHdhZGRyIGN1cl9hZGRyLCBjdXJfbGVuOworICAgIHZvaWQgKm1lbTsKKworICAgIGRicy0+YWNiID0gTlVMTDsKKyAgICBkYnMtPnNlY3Rvcl9udW0gKz0gZGJzLT5pb3Yuc2l6ZSAvIDUxMjsKKyAgICBkbWFfYmRydl91bm1hcChkYnMpOworICAgIHFlbXVfaW92ZWNfcmVzZXQoJmRicy0+aW92KTsKKworICAgIGlmIChkYnMtPnNnX2N1cl9pbmRleCA9PSBkYnMtPnNnLT5uc2cgfHwgcmV0IDwgMCkgeworICAgICAgICBkYnMtPmNvbW1vbi5jYihkYnMtPmNvbW1vbi5vcGFxdWUsIHJldCk7CisgICAgICAgIHFlbXVfaW92ZWNfZGVzdHJveSgmZGJzLT5pb3YpOworICAgICAgICBxZW11X2Fpb19yZWxlYXNlKGRicyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoZGJzLT5zZ19jdXJfaW5kZXggPCBkYnMtPnNnLT5uc2cpIHsKKyAgICAgICAgY3VyX2FkZHIgPSBkYnMtPnNnLT5zZ1tkYnMtPnNnX2N1cl9pbmRleF0uYmFzZSArIGRicy0+c2dfY3VyX2J5dGU7CisgICAgICAgIGN1cl9sZW4gPSBkYnMtPnNnLT5zZ1tkYnMtPnNnX2N1cl9pbmRleF0ubGVuIC0gZGJzLT5zZ19jdXJfYnl0ZTsKKyAgICAgICAgbWVtID0gY3B1X3BoeXNpY2FsX21lbW9yeV9tYXAoY3VyX2FkZHIsICZjdXJfbGVuLCAhZGJzLT5pc193cml0ZSk7CisgICAgICAgIGlmICghbWVtKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHFlbXVfaW92ZWNfYWRkKCZkYnMtPmlvdiwgbWVtLCBjdXJfbGVuKTsKKyAgICAgICAgZGJzLT5zZ19jdXJfYnl0ZSArPSBjdXJfbGVuOworICAgICAgICBpZiAoZGJzLT5zZ19jdXJfYnl0ZSA9PSBkYnMtPnNnLT5zZ1tkYnMtPnNnX2N1cl9pbmRleF0ubGVuKSB7CisgICAgICAgICAgICBkYnMtPnNnX2N1cl9ieXRlID0gMDsKKyAgICAgICAgICAgICsrZGJzLT5zZ19jdXJfaW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGJzLT5pb3Yuc2l6ZSA9PSAwKSB7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9tYXBfY2xpZW50KGRicywgY29udGludWVfYWZ0ZXJfbWFwX2ZhaWx1cmUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRicy0+aXNfd3JpdGUpIHsKKyAgICAgICAgZGJzLT5hY2IgPSBiZHJ2X2Fpb193cml0ZXYoZGJzLT5icywgZGJzLT5zZWN0b3JfbnVtLCAmZGJzLT5pb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRicy0+aW92LnNpemUgLyA1MTIsIGRtYV9iZHJ2X2NiLCBkYnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRicy0+YWNiID0gYmRydl9haW9fcmVhZHYoZGJzLT5icywgZGJzLT5zZWN0b3JfbnVtLCAmZGJzLT5pb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJzLT5pb3Yuc2l6ZSAvIDUxMiwgZG1hX2JkcnZfY2IsIGRicyk7CisgICAgfQorICAgIGlmICghZGJzLT5hY2IpIHsKKyAgICAgICAgZG1hX2JkcnZfdW5tYXAoZGJzKTsKKyAgICAgICAgcWVtdV9pb3ZlY19kZXN0cm95KCZkYnMtPmlvdik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9haW9fY2FuY2VsKEJsb2NrRHJpdmVyQUlPQ0IgKmFjYikKK3sKKyAgICBETUFBSU9DQiAqZGJzID0gY29udGFpbmVyX29mKGFjYiwgRE1BQUlPQ0IsIGNvbW1vbik7CisKKyAgICBpZiAoZGJzLT5hY2IpIHsKKyAgICAgICAgYmRydl9haW9fY2FuY2VsKGRicy0+YWNiKTsKKyAgICB9Cit9CisKK3N0YXRpYyBBSU9Qb29sIGRtYV9haW9fcG9vbCA9IHsKKyAgICAuYWlvY2Jfc2l6ZSAgICAgICAgID0gc2l6ZW9mKERNQUFJT0NCKSwKKyAgICAuY2FuY2VsICAgICAgICAgICAgID0gZG1hX2Fpb19jYW5jZWwsCit9OworCitzdGF0aWMgQmxvY2tEcml2ZXJBSU9DQiAqZG1hX2JkcnZfaW8oCisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIFFFTVVTR0xpc3QgKnNnLCB1aW50NjRfdCBzZWN0b3JfbnVtLAorICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUsCisgICAgaW50IGlzX3dyaXRlKQoreworICAgIERNQUFJT0NCICpkYnMgPSAgcWVtdV9haW9fZ2V0KCZkbWFfYWlvX3Bvb2wsIGJzLCBjYiwgb3BhcXVlKTsKKworICAgIGRicy0+YWNiID0gTlVMTDsKKyAgICBkYnMtPmJzID0gYnM7CisgICAgZGJzLT5zZyA9IHNnOworICAgIGRicy0+c2VjdG9yX251bSA9IHNlY3Rvcl9udW07CisgICAgZGJzLT5zZ19jdXJfaW5kZXggPSAwOworICAgIGRicy0+c2dfY3VyX2J5dGUgPSAwOworICAgIGRicy0+aXNfd3JpdGUgPSBpc193cml0ZTsKKyAgICBkYnMtPmJoID0gTlVMTDsKKyAgICBxZW11X2lvdmVjX2luaXQoJmRicy0+aW92LCBzZy0+bnNnKTsKKyAgICBkbWFfYmRydl9jYihkYnMsIDApOworICAgIGlmICghZGJzLT5hY2IpIHsKKyAgICAgICAgcWVtdV9haW9fcmVsZWFzZShkYnMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICZkYnMtPmNvbW1vbjsKK30KKworCitCbG9ja0RyaXZlckFJT0NCICpkbWFfYmRydl9yZWFkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VU0dMaXN0ICpzZywgdWludDY0X3Qgc2VjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2IpKHZvaWQgKm9wYXF1ZSwgaW50IHJldCksIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gZG1hX2JkcnZfaW8oYnMsIHNnLCBzZWN0b3IsIGNiLCBvcGFxdWUsIDApOworfQorCitCbG9ja0RyaXZlckFJT0NCICpkbWFfYmRydl93cml0ZShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVTR0xpc3QgKnNnLCB1aW50NjRfdCBzZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2IpKHZvaWQgKm9wYXF1ZSwgaW50IHJldCksIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gZG1hX2JkcnZfaW8oYnMsIHNnLCBzZWN0b3IsIGNiLCBvcGFxdWUsIDEpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9leGVjLmMgYi9hbmRyb2lkL3FlbXUxL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBlNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9leGVjLmMKQEAgLTAsMCArMSwyNjM5IEBACisvKgorICogIHZpcnR1YWwgcGFnZSBtYXBwaW5nIGFuZCB0cmFuc2xhdGVkIGJsb2NrIGhhbmRsaW5nCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZXhlYy9leGVjLWFsbC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAidGNnLmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9xZGV2LmgiCisjaW5jbHVkZSAiaHcveGVuL3hlbi5oIgorI2luY2x1ZGUgInFlbXUvYml0bWFwLmgiCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgorI2luY2x1ZGUgInFlbXUvdGxzLmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2luY2x1ZGUgImV4ZWMvY3B1dGxiLmgiCisjaW5jbHVkZSAiZXhlYy9oYXguaCIKKyNpbmNsdWRlICJleGVjL3JhbV9hZGRyLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNpbmNsdWRlIDxxZW11Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJ0cmFuc2xhdGUtYWxsLmgiCisKKy8vI2RlZmluZSBERUJVR19TVUJQQUdFCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQoraW50IHBoeXNfcmFtX2ZkOworc3RhdGljIGludCBpbl9taWdyYXRpb247CisKK1JBTUxpc3QgcmFtX2xpc3QgPSB7IC5ibG9ja3MgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihyYW1fbGlzdC5ibG9ja3MpIH07CisjZW5kaWYKKworc3RydWN0IENQVVRhaWxRIGNwdXMgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihjcHVzKTsKK0RFRklORV9UTFMoQ1BVU3RhdGUgKiwgY3VycmVudF9jcHUpOworCisvKiAwID0gRG8gbm90IGNvdW50IGV4ZWN1dGVkIGluc3RydWN0aW9ucy4KKyAgIDEgPSBQcmVjaXNlIGluc3RydWN0aW9uIGNvdW50aW5nLgorICAgMiA9IEFkYXB0aXZlIHJhdGUgaW5zdHJ1Y3Rpb24gY291bnRpbmcuICAqLworaW50IHVzZV9pY291bnQgPSAwOworLyogQ3VycmVudCBpbnN0cnVjdGlvbiBjb3VudGVyLiAgV2hpbGUgZXhlY3V0aW5nIHRyYW5zbGF0ZWQgY29kZSB0aGlzIG1heQorICAgaW5jbHVkZSBzb21lIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGV4ZWN1dGVkLiAgKi8KK2ludDY0X3QgcWVtdV9pY291bnQ7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorc3RhdGljIHZvaWQgaW9fbWVtX2luaXQodm9pZCk7CisKKy8qIGlvIG1lbW9yeSBzdXBwb3J0ICovCitDUFVXcml0ZU1lbW9yeUZ1bmMgKl9pb19tZW1fd3JpdGVbSU9fTUVNX05CX0VOVFJJRVNdWzRdOworQ1BVUmVhZE1lbW9yeUZ1bmMgKl9pb19tZW1fcmVhZFtJT19NRU1fTkJfRU5UUklFU11bNF07Cit2b2lkICppb19tZW1fb3BhcXVlW0lPX01FTV9OQl9FTlRSSUVTXTsKK3N0YXRpYyBjaGFyIGlvX21lbV91c2VkW0lPX01FTV9OQl9FTlRSSUVTXTsKK2ludCBpb19tZW1fd2F0Y2g7CisjZW5kaWYKKworLyogbG9nIHN1cHBvcnQgKi8KKyNpZmRlZiBXSU4zMgorc3RhdGljIGNvbnN0IGNoYXIgKmxvZ2ZpbGVuYW1lID0gInFlbXUubG9nIjsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciAqbG9nZmlsZW5hbWUgPSAiL3RtcC9xZW11LmxvZyI7CisjZW5kaWYKK0ZJTEUgKmxvZ2ZpbGU7CitpbnQgbG9nbGV2ZWw7CitzdGF0aWMgaW50IGxvZ19hcHBlbmQgPSAwOworCisjZGVmaW5lIFNVQlBBR0VfSURYKGFkZHIpICgoYWRkcikgJiB+VEFSR0VUX1BBR0VfTUFTSykKK3R5cGVkZWYgc3RydWN0IHN1YnBhZ2VfdCB7CisgICAgaHdhZGRyIGJhc2U7CisgICAgQ1BVUmVhZE1lbW9yeUZ1bmMgKiptZW1fcmVhZFtUQVJHRVRfUEFHRV9TSVpFXVs0XTsKKyAgICBDUFVXcml0ZU1lbW9yeUZ1bmMgKiptZW1fd3JpdGVbVEFSR0VUX1BBR0VfU0laRV1bNF07CisgICAgdm9pZCAqb3BhcXVlW1RBUkdFVF9QQUdFX1NJWkVdWzJdWzRdOworICAgIHJhbV9hZGRyX3QgcmVnaW9uX29mZnNldFtUQVJHRVRfUEFHRV9TSVpFXVsyXVs0XTsKK30gc3VicGFnZV90OworCisvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgdGhlIFFFTVUgY3B1cy4gJ3RiX3NpemUnIGlzIHRoZSBzaXplCisgICAoaW4gYnl0ZXMpIGFsbG9jYXRlZCB0byB0aGUgdHJhbnNsYXRpb24gYnVmZmVyLiBaZXJvIG1lYW5zIGRlZmF1bHQKKyAgIHNpemUuICovCit2b2lkIGNwdV9leGVjX2luaXRfYWxsKHVuc2lnbmVkIGxvbmcgdGJfc2l6ZSkKK3sKKyAgICAvL2NwdV9nZW5faW5pdCgpOworICAgIC8vY29kZV9nZW5fYWxsb2ModGJfc2l6ZSk7CisgICAgLy9jb2RlX2dlbl9wdHIgPSBjb2RlX2dlbl9idWZmZXI7CisgICAgLy9wYWdlX2luaXQoKTsKKyAgICB0Y2dfZXhlY19pbml0KHRiX3NpemUpOworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgcWVtdV9tdXRleF9pbml0KCZyYW1fbGlzdC5tdXRleCk7CisgICAgaW9fbWVtX2luaXQoKTsKKyNlbmRpZgorfQorCisjaWYgZGVmaW5lZChDUFVfU0FWRV9WRVJTSU9OKSAmJiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorCisjZGVmaW5lIENQVV9DT01NT05fU0FWRV9WRVJTSU9OIDEKKworc3RhdGljIHZvaWQgY3B1X2NvbW1vbl9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgQ1BVT2xkU3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICBDUFVTdGF0ZSAqY3B1ID0gRU5WX0dFVF9DUFUoZW52KTsKKworICAgIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZShjcHUsIDApOworCisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJmNwdS0+aGFsdGVkKTsKKyAgICBxZW11X3B1dF9iZTMycyhmLCAmY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCk7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2NvbW1vbl9sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIENQVU9sZFN0YXRlICplbnYgPSBvcGFxdWU7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBDUFVfQ09NTU9OX1NBVkVfVkVSU0lPTikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBxZW11X2dldF9iZTMycyhmLCAmY3B1LT5oYWx0ZWQpOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZjcHUtPmludGVycnVwdF9yZXF1ZXN0KTsKKyAgICAvKiAweDAxIHdhcyBDUFVfSU5URVJSVVBUX0VYSVQuIFRoaXMgbGluZSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZQorICAgICAgIHZlcnNpb25faWQgaXMgaW5jcmVhc2VkLiAqLworICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJj0gfjB4MDE7CisgICAgdGxiX2ZsdXNoKGVudiwgMSk7CisgICAgY3B1X3N5bmNocm9uaXplX3N0YXRlKGNwdSwgMSk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitDUFVTdGF0ZSAqcWVtdV9nZXRfY3B1KGludCBjcHVfaW5kZXgpCit7CisgICAgQ1BVU3RhdGUgKmNwdTsKKworICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICBpZiAoY3B1LT5jcHVfaW5kZXggPT0gY3B1X2luZGV4KQorICAgICAgICAgICAgcmV0dXJuIGNwdTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgY3B1X2V4ZWNfaW5pdChDUFVBcmNoU3RhdGUgKmVudikKK3sKKyAgICBDUFVTdGF0ZSAqY3B1ID0gRU5WX0dFVF9DUFUoZW52KTsKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICBjcHVfbGlzdF9sb2NrKCk7CisjZW5kaWYKKyAgICAvLyBDb21wdXRlIENQVSBpbmRleCBmcm9tIGxpc3QgcG9zaXRpb24uCisgICAgaW50IGNwdV9pbmRleCA9IDA7CisgICAgQ1BVU3RhdGUgKmNwdTE7CisgICAgQ1BVX0ZPUkVBQ0goY3B1MSkgeworICAgICAgICBjcHVfaW5kZXgrKzsKKyAgICB9CisgICAgY3B1LT5jcHVfaW5kZXggPSBjcHVfaW5kZXg7CisgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZjcHVzLCBjcHUsIG5vZGUpOworCisgICAgY3B1LT5udW1hX25vZGUgPSAwOworICAgIFFUQUlMUV9JTklUKCZlbnYtPmJyZWFrcG9pbnRzKTsKKyAgICBRVEFJTFFfSU5JVCgmZW52LT53YXRjaHBvaW50cyk7CisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIGNwdV9saXN0X3VubG9jaygpOworI2VuZGlmCisjaWYgZGVmaW5lZChDUFVfU0FWRV9WRVJTSU9OKSAmJiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiY3B1X2NvbW1vbiIsCisgICAgICAgICAgICAgICAgICAgIGNwdV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgQ1BVX0NPTU1PTl9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIGNwdV9jb21tb25fc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgY3B1X2NvbW1vbl9sb2FkLAorICAgICAgICAgICAgICAgICAgICBlbnYpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiY3B1IiwKKyAgICAgICAgICAgICAgICAgICAgY3B1X2luZGV4LAorICAgICAgICAgICAgICAgICAgICBDUFVfU0FWRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBjcHVfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgY3B1X2xvYWQsCisgICAgICAgICAgICAgICAgICAgIGVudik7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQoVEFSR0VUX0hBU19JQ0UpCitzdGF0aWMgdm9pZCBicmVha3BvaW50X2ludmFsaWRhdGUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwYykKK3sKKyAgICBod2FkZHIgYWRkcjsKKyAgICB0YXJnZXRfdWxvbmcgcGQ7CisgICAgcmFtX2FkZHJfdCByYW1fYWRkcjsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBhZGRyID0gY3B1X2dldF9waHlzX3BhZ2VfZGVidWcoZW52LCBwYyk7CisgICAgcCA9IHBoeXNfcGFnZV9maW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICB9CisgICAgcmFtX2FkZHIgPSAocGQgJiBUQVJHRVRfUEFHRV9NQVNLKSB8IChwYyAmIH5UQVJHRVRfUEFHRV9NQVNLKTsKKyAgICB0Yl9pbnZhbGlkYXRlX3BoeXNfcGFnZV9yYW5nZShyYW1fYWRkciwgcmFtX2FkZHIgKyAxLCAwKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQordm9pZCBjcHVfd2F0Y2hwb2ludF9yZW1vdmVfYWxsKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgbWFzaykKKworeworfQorCitpbnQgY3B1X3dhdGNocG9pbnRfaW5zZXJ0KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgdGFyZ2V0X3Vsb25nIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBDUFVXYXRjaHBvaW50ICoqd2F0Y2hwb2ludCkKK3sKKyAgICByZXR1cm4gLUVOT1NZUzsKK30KKyNlbHNlCisvKiBBZGQgYSB3YXRjaHBvaW50LiAgKi8KK2ludCBjcHVfd2F0Y2hwb2ludF9pbnNlcnQoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCB0YXJnZXRfdWxvbmcgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIENQVVdhdGNocG9pbnQgKip3YXRjaHBvaW50KQoreworICAgIHRhcmdldF91bG9uZyBsZW5fbWFzayA9IH4obGVuIC0gMSk7CisgICAgQ1BVV2F0Y2hwb2ludCAqd3A7CisKKyAgICAvKiBzYW5pdHkgY2hlY2tzOiBhbGxvdyBwb3dlci1vZi0yIGxlbmd0aHMsIGRlbnkgdW5hbGlnbmVkIHdhdGNocG9pbnRzICovCisgICAgaWYgKChsZW4gJiAobGVuIC0gMSkpIHx8IChhZGRyICYgfmxlbl9tYXNrKSB8fAorICAgICAgICAgICAgbGVuID09IDAgfHwgbGVuID4gVEFSR0VUX1BBR0VfU0laRSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHRyaWVkIHRvIHNldCBpbnZhbGlkIHdhdGNocG9pbnQgYXQgIgorICAgICAgICAgICAgICAgIFRBUkdFVF9GTVRfbHggIiwgbGVuPSIgVEFSR0VUX0ZNVF9sdSAiXG4iLCBhZGRyLCBsZW4pOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgd3AgPSBnX21hbGxvYyhzaXplb2YoKndwKSk7CisKKyAgICB3cC0+dmFkZHIgPSBhZGRyOworICAgIHdwLT5sZW5fbWFzayA9IGxlbl9tYXNrOworICAgIHdwLT5mbGFncyA9IGZsYWdzOworCisgICAgLyoga2VlcCBhbGwgR0RCLWluamVjdGVkIHdhdGNocG9pbnRzIGluIGZyb250ICovCisgICAgaWYgKGZsYWdzICYgQlBfR0RCKQorICAgICAgICBRVEFJTFFfSU5TRVJUX0hFQUQoJmVudi0+d2F0Y2hwb2ludHMsIHdwLCBlbnRyeSk7CisgICAgZWxzZQorICAgICAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJmVudi0+d2F0Y2hwb2ludHMsIHdwLCBlbnRyeSk7CisKKyAgICB0bGJfZmx1c2hfcGFnZShlbnYsIGFkZHIpOworCisgICAgaWYgKHdhdGNocG9pbnQpCisgICAgICAgICp3YXRjaHBvaW50ID0gd3A7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlbW92ZSBhIHNwZWNpZmljIHdhdGNocG9pbnQuICAqLworaW50IGNwdV93YXRjaHBvaW50X3JlbW92ZShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIHRhcmdldF91bG9uZyBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICB0YXJnZXRfdWxvbmcgbGVuX21hc2sgPSB+KGxlbiAtIDEpOworICAgIENQVVdhdGNocG9pbnQgKndwOworCisgICAgUVRBSUxRX0ZPUkVBQ0god3AsICZlbnYtPndhdGNocG9pbnRzLCBlbnRyeSkgeworICAgICAgICBpZiAoYWRkciA9PSB3cC0+dmFkZHIgJiYgbGVuX21hc2sgPT0gd3AtPmxlbl9tYXNrCisgICAgICAgICAgICAgICAgJiYgZmxhZ3MgPT0gKHdwLT5mbGFncyAmIH5CUF9XQVRDSFBPSU5UX0hJVCkpIHsKKyAgICAgICAgICAgIGNwdV93YXRjaHBvaW50X3JlbW92ZV9ieV9yZWYoZW52LCB3cCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVOT0VOVDsKK30KKworLyogUmVtb3ZlIGEgc3BlY2lmaWMgd2F0Y2hwb2ludCBieSByZWZlcmVuY2UuICAqLwordm9pZCBjcHVfd2F0Y2hwb2ludF9yZW1vdmVfYnlfcmVmKENQVUFyY2hTdGF0ZSAqZW52LCBDUFVXYXRjaHBvaW50ICp3YXRjaHBvaW50KQoreworICAgIFFUQUlMUV9SRU1PVkUoJmVudi0+d2F0Y2hwb2ludHMsIHdhdGNocG9pbnQsIGVudHJ5KTsKKworICAgIHRsYl9mbHVzaF9wYWdlKGVudiwgd2F0Y2hwb2ludC0+dmFkZHIpOworCisgICAgZ19mcmVlKHdhdGNocG9pbnQpOworfQorCisvKiBSZW1vdmUgYWxsIG1hdGNoaW5nIHdhdGNocG9pbnRzLiAgKi8KK3ZvaWQgY3B1X3dhdGNocG9pbnRfcmVtb3ZlX2FsbChDUFVBcmNoU3RhdGUgKmVudiwgaW50IG1hc2spCit7CisgICAgQ1BVV2F0Y2hwb2ludCAqd3AsICpuZXh0OworCisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRSh3cCwgJmVudi0+d2F0Y2hwb2ludHMsIGVudHJ5LCBuZXh0KSB7CisgICAgICAgIGlmICh3cC0+ZmxhZ3MgJiBtYXNrKQorICAgICAgICAgICAgY3B1X3dhdGNocG9pbnRfcmVtb3ZlX2J5X3JlZihlbnYsIHdwKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyogQWRkIGEgYnJlYWtwb2ludC4gICovCitpbnQgY3B1X2JyZWFrcG9pbnRfaW5zZXJ0KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcGMsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVQnJlYWtwb2ludCAqKmJyZWFrcG9pbnQpCit7CisjaWYgZGVmaW5lZChUQVJHRVRfSEFTX0lDRSkKKyAgICBDUFVCcmVha3BvaW50ICpicDsKKworICAgIGJwID0gZ19tYWxsb2Moc2l6ZW9mKCpicCkpOworCisgICAgYnAtPnBjID0gcGM7CisgICAgYnAtPmZsYWdzID0gZmxhZ3M7CisKKyAgICAvKiBrZWVwIGFsbCBHREItaW5qZWN0ZWQgYnJlYWtwb2ludHMgaW4gZnJvbnQgKi8KKyAgICBpZiAoZmxhZ3MgJiBCUF9HREIpIHsKKyAgICAgICAgUVRBSUxRX0lOU0VSVF9IRUFEKCZlbnYtPmJyZWFrcG9pbnRzLCBicCwgZW50cnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIFFUQUlMUV9JTlNFUlRfVEFJTCgmZW52LT5icmVha3BvaW50cywgYnAsIGVudHJ5KTsKKyAgICB9CisKKyAgICBicmVha3BvaW50X2ludmFsaWRhdGUoZW52LCBwYyk7CisKKyAgICBpZiAoYnJlYWtwb2ludCkgeworICAgICAgICAqYnJlYWtwb2ludCA9IGJwOworICAgIH0KKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIC1FTk9TWVM7CisjZW5kaWYKK30KKworLyogUmVtb3ZlIGEgc3BlY2lmaWMgYnJlYWtwb2ludC4gICovCitpbnQgY3B1X2JyZWFrcG9pbnRfcmVtb3ZlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcGMsIGludCBmbGFncykKK3sKKyNpZiBkZWZpbmVkKFRBUkdFVF9IQVNfSUNFKQorICAgIENQVUJyZWFrcG9pbnQgKmJwOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYnAsICZlbnYtPmJyZWFrcG9pbnRzLCBlbnRyeSkgeworICAgICAgICBpZiAoYnAtPnBjID09IHBjICYmIGJwLT5mbGFncyA9PSBmbGFncykgeworICAgICAgICAgICAgY3B1X2JyZWFrcG9pbnRfcmVtb3ZlX2J5X3JlZihlbnYsIGJwKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRU5PRU5UOworI2Vsc2UKKyAgICByZXR1cm4gLUVOT1NZUzsKKyNlbmRpZgorfQorCisvKiBSZW1vdmUgYSBzcGVjaWZpYyBicmVha3BvaW50IGJ5IHJlZmVyZW5jZS4gICovCit2b2lkIGNwdV9icmVha3BvaW50X3JlbW92ZV9ieV9yZWYoQ1BVQXJjaFN0YXRlICplbnYsIENQVUJyZWFrcG9pbnQgKmJyZWFrcG9pbnQpCit7CisjaWYgZGVmaW5lZChUQVJHRVRfSEFTX0lDRSkKKyAgICBRVEFJTFFfUkVNT1ZFKCZlbnYtPmJyZWFrcG9pbnRzLCBicmVha3BvaW50LCBlbnRyeSk7CisKKyAgICBicmVha3BvaW50X2ludmFsaWRhdGUoZW52LCBicmVha3BvaW50LT5wYyk7CisKKyAgICBnX2ZyZWUoYnJlYWtwb2ludCk7CisjZW5kaWYKK30KKworLyogUmVtb3ZlIGFsbCBtYXRjaGluZyBicmVha3BvaW50cy4gKi8KK3ZvaWQgY3B1X2JyZWFrcG9pbnRfcmVtb3ZlX2FsbChDUFVBcmNoU3RhdGUgKmVudiwgaW50IG1hc2spCit7CisjaWYgZGVmaW5lZChUQVJHRVRfSEFTX0lDRSkKKyAgICBDUFVCcmVha3BvaW50ICpicCwgKm5leHQ7CisKKyAgICBRVEFJTFFfRk9SRUFDSF9TQUZFKGJwLCAmZW52LT5icmVha3BvaW50cywgZW50cnksIG5leHQpIHsKKyAgICAgICAgaWYgKGJwLT5mbGFncyAmIG1hc2spCisgICAgICAgICAgICBjcHVfYnJlYWtwb2ludF9yZW1vdmVfYnlfcmVmKGVudiwgYnApOworICAgIH0KKyNlbmRpZgorfQorCisvKiBlbmFibGUgb3IgZGlzYWJsZSBzaW5nbGUgc3RlcCBtb2RlLiBFWENQX0RFQlVHIGlzIHJldHVybmVkIGJ5IHRoZQorICAgQ1BVIGxvb3AgYWZ0ZXIgZWFjaCBpbnN0cnVjdGlvbiAqLwordm9pZCBjcHVfc2luZ2xlX3N0ZXAoQ1BVU3RhdGUgKmNwdSwgaW50IGVuYWJsZWQpCit7CisjaWYgZGVmaW5lZChUQVJHRVRfSEFTX0lDRSkKKyAgICBpZiAoY3B1LT5zaW5nbGVzdGVwX2VuYWJsZWQgIT0gZW5hYmxlZCkgeworICAgICAgICBjcHUtPnNpbmdsZXN0ZXBfZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIGlmIChrdm1fZW5hYmxlZCgpKSB7CisgICAgICAgICAgICBrdm1fdXBkYXRlX2d1ZXN0X2RlYnVnKGNwdS0+ZW52X3B0ciwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBtdXN0IGZsdXNoIGFsbCB0aGUgdHJhbnNsYXRlZCBjb2RlIHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyAqLworICAgICAgICAgICAgLyogWFhYOiBvbmx5IGZsdXNoIHdoYXQgaXMgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICB0Yl9mbHVzaChjcHUtPmVudl9wdHIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKKy8qIGVuYWJsZSBvciBkaXNhYmxlIGxvdyBsZXZlbHMgbG9nICovCit2b2lkIGNwdV9zZXRfbG9nKGludCBsb2dfZmxhZ3MpCit7CisgICAgbG9nbGV2ZWwgPSBsb2dfZmxhZ3M7CisgICAgaWYgKGxvZ2xldmVsICYmICFsb2dmaWxlKSB7CisgICAgICAgIGxvZ2ZpbGUgPSBmb3Blbihsb2dmaWxlbmFtZSwgbG9nX2FwcGVuZCA/ICJhIiA6ICJ3Iik7CisgICAgICAgIGlmICghbG9nZmlsZSkgeworICAgICAgICAgICAgcGVycm9yKGxvZ2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyNpZiAhZGVmaW5lZChDT05GSUdfU09GVE1NVSkKKyAgICAgICAgLyogbXVzdCBhdm9pZCBtbWFwKCkgdXNhZ2Ugb2YgZ2xpYmMgYnkgc2V0dGluZyBhIGJ1ZmZlciAiYnkgaGFuZCIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNoYXIgbG9nZmlsZV9idWZbNDA5Nl07CisgICAgICAgICAgICBzZXR2YnVmKGxvZ2ZpbGUsIGxvZ2ZpbGVfYnVmLCBfSU9MQkYsIHNpemVvZihsb2dmaWxlX2J1ZikpOworICAgICAgICB9CisjZWxpZiAhZGVmaW5lZChfV0lOMzIpCisgICAgICAgIC8qIFdpbjMyIGRvZXNuJ3Qgc3VwcG9ydCBsaW5lLWJ1ZmZlcmluZyBhbmQgcmVxdWlyZXMgc2l6ZSA+PSAyICovCisgICAgICAgIHNldHZidWYobG9nZmlsZSwgTlVMTCwgX0lPTEJGLCAwKTsKKyNlbmRpZgorICAgICAgICBsb2dfYXBwZW5kID0gMTsKKyAgICB9CisgICAgaWYgKCFsb2dsZXZlbCAmJiBsb2dmaWxlKSB7CisgICAgICAgIGZjbG9zZShsb2dmaWxlKTsKKyAgICAgICAgbG9nZmlsZSA9IE5VTEw7CisgICAgfQorfQorCit2b2lkIGNwdV9zZXRfbG9nX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGxvZ2ZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKyAgICBpZiAobG9nZmlsZSkgeworICAgICAgICBmY2xvc2UobG9nZmlsZSk7CisgICAgICAgIGxvZ2ZpbGUgPSBOVUxMOworICAgIH0KKyAgICBjcHVfc2V0X2xvZyhsb2dsZXZlbCk7Cit9CisKK3ZvaWQgY3B1X3Jlc2V0X2ludGVycnVwdChDUFVTdGF0ZSAqY3B1LCBpbnQgbWFzaykKK3sKKyAgICBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICY9IH5tYXNrOworfQorCit2b2lkIGNwdV9leGl0KENQVVN0YXRlICpjcHUpCit7CisgICAgY3B1LT5leGl0X3JlcXVlc3QgPSAxOworICAgIGNwdS0+dGNnX2V4aXRfcmVxID0gMTsKK30KKwordm9pZCBjcHVfYWJvcnQoQ1BVQXJjaFN0YXRlICplbnYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworCisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9saXN0IGFwMjsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZhX2NvcHkoYXAyLCBhcCk7CisgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBmYXRhbDogIik7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICBjcHVfZHVtcF9zdGF0ZShjcHUsIHN0ZGVyciwgZnByaW50ZiwgWDg2X0RVTVBfRlBVIHwgWDg2X0RVTVBfQ0NPUCk7CisjZWxzZQorICAgIGNwdV9kdW1wX3N0YXRlKGNwdSwgc3RkZXJyLCBmcHJpbnRmLCAwKTsKKyNlbmRpZgorICAgIGlmIChxZW11X2xvZ19lbmFibGVkKCkpIHsKKyAgICAgICAgcWVtdV9sb2coInFlbXU6IGZhdGFsOiAiKTsKKyAgICAgICAgcWVtdV9sb2dfdnByaW50ZihmbXQsIGFwMik7CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgIGxvZ19jcHVfc3RhdGUoY3B1LCBYODZfRFVNUF9GUFUgfCBYODZfRFVNUF9DQ09QKTsKKyNlbHNlCisgICAgICAgIGxvZ19jcHVfc3RhdGUoY3B1LCAwKTsKKyNlbmRpZgorICAgICAgICBxZW11X2xvZ19mbHVzaCgpOworICAgICAgICBxZW11X2xvZ19jbG9zZSgpOworICAgIH0KKyAgICB2YV9lbmQoYXAyKTsKKyAgICB2YV9lbmQoYXApOworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICAgICAgICBzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisgICAgICAgIGFjdC5zYV9oYW5kbGVyID0gU0lHX0RGTDsKKyAgICAgICAgc2lnYWN0aW9uKFNJR0FCUlQsICZhY3QsIE5VTEwpOworICAgIH0KKyNlbmRpZgorICAgIGFib3J0KCk7Cit9CisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorc3RhdGljIFJBTUJsb2NrICpxZW11X2dldF9yYW1fYmxvY2socmFtX2FkZHJfdCBhZGRyKQoreworICAgIFJBTUJsb2NrICpibG9jazsKKworICAgIC8qIFRoZSBsaXN0IGlzIHByb3RlY3RlZCBieSB0aGUgaW90aHJlYWQgbG9jayBoZXJlLiAgKi8KKyAgICBibG9jayA9IHJhbV9saXN0Lm1ydV9ibG9jazsKKyAgICBpZiAoYmxvY2sgJiYgYWRkciAtIGJsb2NrLT5vZmZzZXQgPCBibG9jay0+bGVuZ3RoKSB7CisgICAgICAgIGdvdG8gZm91bmQ7CisgICAgfQorICAgIFFUQUlMUV9GT1JFQUNIKGJsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgIGlmIChhZGRyIC0gYmxvY2stPm9mZnNldCA8IGJsb2NrLT5sZW5ndGgpIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCByYW0gb2Zmc2V0ICUiIFBSSXg2NCAiXG4iLCAodWludDY0X3QpYWRkcik7CisgICAgYWJvcnQoKTsKKworZm91bmQ6CisgICAgcmFtX2xpc3QubXJ1X2Jsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIGJsb2NrOworfQorCitzdGF0aWMgdm9pZCB0bGJfcmVzZXRfZGlydHlfcmFuZ2VfYWxsKHJhbV9hZGRyX3Qgc3RhcnQsIHJhbV9hZGRyX3QgbGVuZ3RoKQoreworICAgIHJhbV9hZGRyX3QgZW5kID0gVEFSR0VUX1BBR0VfQUxJR04oc3RhcnQgKyBsZW5ndGgpOworCisgICAgc3RhcnQgJj0gVEFSR0VUX1BBR0VfTUFTSzsKKworICAgIFJBTUJsb2NrKiBibG9jayA9IHFlbXVfZ2V0X3JhbV9ibG9jayhzdGFydCk7CisgICAgYXNzZXJ0KGJsb2NrID09IHFlbXVfZ2V0X3JhbV9ibG9jayhlbmQgLSAxKSk7CisgICAgKHZvaWQpZW5kOworICAgIHVpbnRwdHJfdCBzdGFydDEgPSAodWludHB0cl90KWJsb2NrLT5ob3N0ICsgKHN0YXJ0IC0gYmxvY2stPm9mZnNldCk7CisgICAgY3B1X3RsYl9yZXNldF9kaXJ0eV9hbGwoc3RhcnQxLCBsZW5ndGgpOworfQorCisvKiBOb3RlOiBzdGFydCBhbmQgZW5kIG11c3QgYmUgd2l0aGluIHRoZSBzYW1lIHJhbSBibG9jay4gICovCit2b2lkIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVzZXRfZGlydHkocmFtX2FkZHJfdCBzdGFydCwgcmFtX2FkZHJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2xpZW50KQoreworICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfY2xlYXJfZGlydHlfcmFuZ2Uoc3RhcnQsIGxlbmd0aCwgY2xpZW50KTsKKworICAgIGlmICh0Y2dfZW5hYmxlZCgpKSB7CisgICAgICAgIHRsYl9yZXNldF9kaXJ0eV9yYW5nZV9hbGwoc3RhcnQsIGxlbmd0aCk7CisgICAgfQorfQorCitpbnQgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfdHJhY2tpbmcoaW50IGVuYWJsZSkKK3sKKyAgICBpbl9taWdyYXRpb24gPSBlbmFibGU7CisgICAgaWYgKGt2bV9lbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIGt2bV9zZXRfbWlncmF0aW9uX2xvZyhlbmFibGUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5X3RyYWNraW5nKHZvaWQpCit7CisgICAgcmV0dXJuIGluX21pZ3JhdGlvbjsKK30KKworaW50IGNwdV9waHlzaWNhbF9zeW5jX2RpcnR5X2JpdG1hcChod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIGVuZF9hZGRyKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgIHJldCA9IGt2bV9waHlzaWNhbF9zeW5jX2RpcnR5X2JpdG1hcChzdGFydF9hZGRyLCBlbmRfYWRkcik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRsYl91cGRhdGVfZGlydHkoQ1BVVExCRW50cnkgKnRsYl9lbnRyeSkKK3sKKyAgICByYW1fYWRkcl90IHJhbV9hZGRyOworICAgIHZvaWQgKnA7CisKKyAgICBpZiAoKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAmIH5UQVJHRVRfUEFHRV9NQVNLKSA9PSBJT19NRU1fUkFNKSB7CisgICAgICAgIHAgPSAodm9pZCAqKSh1aW50cHRyX3QpKCh0bGJfZW50cnktPmFkZHJfd3JpdGUgJiBUQVJHRVRfUEFHRV9NQVNLKQorICAgICAgICAgICAgKyB0bGJfZW50cnktPmFkZGVuZCk7CisgICAgICAgIHJhbV9hZGRyID0gcWVtdV9yYW1fYWRkcl9mcm9tX2hvc3Rfbm9mYWlsKHApOworICAgICAgICBpZiAoY3B1X3BoeXNpY2FsX21lbW9yeV9pc19jbGVhbihyYW1fYWRkcikpIHsKKyAgICAgICAgICAgIHRsYl9lbnRyeS0+YWRkcl93cml0ZSB8PSBUTEJfTk9URElSVFk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIHVwZGF0ZSB0aGUgVExCIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGlydHkgYml0cyAqLwordm9pZCBjcHVfdGxiX3VwZGF0ZV9kaXJ0eShDUFVBcmNoU3RhdGUgKmVudikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbW11X2lkeDsKKyAgICBmb3IgKG1tdV9pZHggPSAwOyBtbXVfaWR4IDwgTkJfTU1VX01PREVTOyBtbXVfaWR4KyspIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQ1BVX1RMQl9TSVpFOyBpKyspCisgICAgICAgICAgICB0bGJfdXBkYXRlX2RpcnR5KCZlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpXSk7CisgICAgfQorfQorCisKKyNlbHNlCisKK3ZvaWQgdGxiX2ZsdXNoKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgZmx1c2hfZ2xvYmFsKQoreworfQorCit2b2lkIHRsYl9mbHVzaF9wYWdlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcikKK3sKK30KKworaW50IHRsYl9zZXRfcGFnZV9leGVjKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIHBhZGRyLCBpbnQgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgaW50IGlzX3NvZnRtbXUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bGJfc2V0X2RpcnR5KENQVU9sZFN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHRhcmdldF91bG9uZyB2YWRkcikKK3sKK30KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorCitzdGF0aWMgaW50IHN1YnBhZ2VfcmVnaXN0ZXIgKHN1YnBhZ2VfdCAqbW1pbywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBtZW1vcnksIHJhbV9hZGRyX3QgcmVnaW9uX29mZnNldCk7CitzdGF0aWMgdm9pZCAqc3VicGFnZV9pbml0IChod2FkZHIgYmFzZSwgcmFtX2FkZHJfdCAqcGh5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgb3JpZ19tZW1vcnksIHJhbV9hZGRyX3QgcmVnaW9uX29mZnNldCk7CisKK3N0YXRpYyB2b2lkICooKnBoeXNfbWVtX2FsbG9jKShzaXplX3Qgc2l6ZSkgPSBxZW11X2Fub25fcmFtX2FsbG9jOworCisvKgorICogU2V0IGEgY3VzdG9tIHBoeXNpY2FsIGd1ZXN0IG1lbW9yeSBhbGxvYXRvci4KKyAqIEFjY2VsZXJhdG9ycyB3aXRoIHVudXN1YWwgbmVlZHMgbWF5IG5lZWQgdGhpcy4gIEhvcGVmdWxseSwgd2UgY2FuCisgKiBnZXQgcmlkIG9mIGl0IGV2ZW50dWFsbHkuCisgKi8KK3ZvaWQgcGh5c19tZW1fc2V0X2FsbG9jKHZvaWQgKigqYWxsb2MpKHNpemVfdCkpCit7CisgICAgcGh5c19tZW1fYWxsb2MgPSBhbGxvYzsKK30KKworI2RlZmluZSBDSEVDS19TVUJQQUdFKGFkZHIsIHN0YXJ0X2FkZHIsIHN0YXJ0X2FkZHIyLCBlbmRfYWRkciwgZW5kX2FkZHIyLCBcCisgICAgICAgICAgICAgICAgICAgICAgbmVlZF9zdWJwYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChhZGRyID4gc3RhcnRfYWRkcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGFydF9hZGRyMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGFydF9hZGRyMiA9IHN0YXJ0X2FkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSzsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhcnRfYWRkcjIgPiAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbmVlZF9zdWJwYWdlID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoc3RhcnRfYWRkciArIG9yaWdfc2l6ZSkgLSBhZGRyID49IFRBUkdFVF9QQUdFX1NJWkUpICAgICAgICBcCisgICAgICAgICAgICBlbmRfYWRkcjIgPSBUQVJHRVRfUEFHRV9TSVpFIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbmRfYWRkcjIgPSAoc3RhcnRfYWRkciArIG9yaWdfc2l6ZSAtIDEpICYgflRBUkdFVF9QQUdFX01BU0s7IFwKKyAgICAgICAgICAgIGlmIChlbmRfYWRkcjIgPCBUQVJHRVRfUEFHRV9TSVpFIC0gMSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBuZWVkX3N1YnBhZ2UgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKiByZWdpc3RlciBwaHlzaWNhbCBtZW1vcnkuCisgICBGb3IgUkFNLCAnc2l6ZScgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSB0YXJnZXQgcGFnZSBzaXplLgorICAgSWYgKHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0spICE9IDAsIHRoZW4gaXQgaXMgYW4KKyAgIGlvIG1lbW9yeSBwYWdlLiAgVGhlIGFkZHJlc3MgdXNlZCB3aGVuIGNhbGxpbmcgdGhlIElPIGZ1bmN0aW9uIGlzCisgICB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24sIHBsdXMgcmVnaW9uX29mZnNldC4gIEJvdGgKKyAgIHN0YXJ0X2FkZHIgYW5kIHJlZ2lvbl9vZmZzZXQgYXJlIHJvdW5kZWQgZG93biB0byBhIHBhZ2UgYm91bmRhcnkKKyAgIGJlZm9yZSBjYWxjdWxhdGluZyB0aGlzIG9mZnNldC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0gdW5sZXNzCisgICB0aGUgbG93IGJpdHMgb2Ygc3RhcnRfYWRkciBhbmQgcmVnaW9uX29mZnNldCBkaWZmZXIuICAqLwordm9pZCBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5X2xvZyhod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IHBoeXNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IHJlZ2lvbl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9nX2RpcnR5KQoreworICAgIGh3YWRkciBhZGRyLCBlbmRfYWRkcjsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisgICAgQ1BVU3RhdGUgKmNwdTsKKyAgICByYW1fYWRkcl90IG9yaWdfc2l6ZSA9IHNpemU7CisgICAgc3VicGFnZV90ICpzdWJwYWdlOworCisgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgIGt2bV9zZXRfcGh5c19tZW0oc3RhcnRfYWRkciwgc2l6ZSwgcGh5c19vZmZzZXQpOworI2lmZGVmIENPTkZJR19IQVgKKyAgICBpZiAoaGF4X2VuYWJsZWQoKSkKKyAgICAgICAgaGF4X3NldF9waHlzX21lbShzdGFydF9hZGRyLCBzaXplLCBwaHlzX29mZnNldCk7CisjZW5kaWYKKworICAgIGlmIChwaHlzX29mZnNldCA9PSBJT19NRU1fVU5BU1NJR05FRCkgeworICAgICAgICByZWdpb25fb2Zmc2V0ID0gc3RhcnRfYWRkcjsKKyAgICB9CisgICAgcmVnaW9uX29mZnNldCAmPSBUQVJHRVRfUEFHRV9NQVNLOworICAgIHNpemUgPSAoc2l6ZSArIFRBUkdFVF9QQUdFX1NJWkUgLSAxKSAmIFRBUkdFVF9QQUdFX01BU0s7CisgICAgZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgKGh3YWRkcilzaXplOworCisgICAgYWRkciA9IHN0YXJ0X2FkZHI7CisgICAgZG8geworICAgICAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgaWYgKHAgJiYgcC0+cGh5c19vZmZzZXQgIT0gSU9fTUVNX1VOQVNTSUdORUQpIHsKKyAgICAgICAgICAgIHJhbV9hZGRyX3Qgb3JpZ19tZW1vcnkgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgICAgIGh3YWRkciBzdGFydF9hZGRyMiwgZW5kX2FkZHIyOworICAgICAgICAgICAgaW50IG5lZWRfc3VicGFnZSA9IDA7CisKKyAgICAgICAgICAgIENIRUNLX1NVQlBBR0UoYWRkciwgc3RhcnRfYWRkciwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyLCBlbmRfYWRkcjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfc3VicGFnZSk7CisgICAgICAgICAgICBpZiAobmVlZF9zdWJwYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKCEob3JpZ19tZW1vcnkgJiBJT19NRU1fU1VCUEFHRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VicGFnZSA9IHN1YnBhZ2VfaW5pdCgoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5waHlzX29mZnNldCwgb3JpZ19tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+cmVnaW9uX29mZnNldCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3VicGFnZSA9IGlvX21lbV9vcGFxdWVbKG9yaWdfbWVtb3J5ICYgflRBUkdFVF9QQUdFX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IElPX01FTV9TSElGVF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1YnBhZ2VfcmVnaXN0ZXIoc3VicGFnZSwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyMiwgcGh5c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBwLT5yZWdpb25fb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcC0+cGh5c19vZmZzZXQgPSBwaHlzX29mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAoKHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0spIDw9IElPX01FTV9ST00gfHwKKyAgICAgICAgICAgICAgICAgICAgKHBoeXNfb2Zmc2V0ICYgSU9fTUVNX1JPTUQpKQorICAgICAgICAgICAgICAgICAgICBwaHlzX29mZnNldCArPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcCA9IHBoeXNfcGFnZV9maW5kX2FsbG9jKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUywgMSk7CisgICAgICAgICAgICBwLT5waHlzX29mZnNldCA9IHBoeXNfb2Zmc2V0OworICAgICAgICAgICAgcC0+cmVnaW9uX29mZnNldCA9IHJlZ2lvbl9vZmZzZXQ7CisgICAgICAgICAgICBpZiAoKHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0spIDw9IElPX01FTV9ST00gfHwKKyAgICAgICAgICAgICAgICAocGh5c19vZmZzZXQgJiBJT19NRU1fUk9NRCkpIHsKKyAgICAgICAgICAgICAgICBwaHlzX29mZnNldCArPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBod2FkZHIgc3RhcnRfYWRkcjIsIGVuZF9hZGRyMjsKKyAgICAgICAgICAgICAgICBpbnQgbmVlZF9zdWJwYWdlID0gMDsKKworICAgICAgICAgICAgICAgIENIRUNLX1NVQlBBR0UoYWRkciwgc3RhcnRfYWRkciwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2FkZHIyLCBuZWVkX3N1YnBhZ2UpOworCisgICAgICAgICAgICAgICAgaWYgKG5lZWRfc3VicGFnZSkgeworICAgICAgICAgICAgICAgICAgICBzdWJwYWdlID0gc3VicGFnZV9pbml0KChhZGRyICYgVEFSR0VUX1BBR0VfTUFTSyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnBoeXNfb2Zmc2V0LCBJT19NRU1fVU5BU1NJR05FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICYgVEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgICAgICAgICAgICAgIHN1YnBhZ2VfcmVnaXN0ZXIoc3VicGFnZSwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX29mZnNldCwgcmVnaW9uX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHAtPnJlZ2lvbl9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWdpb25fb2Zmc2V0ICs9IFRBUkdFVF9QQUdFX1NJWkU7CisgICAgICAgIGFkZHIgKz0gVEFSR0VUX1BBR0VfU0laRTsKKyAgICB9IHdoaWxlIChhZGRyICE9IGVuZF9hZGRyKTsKKworICAgIC8qIHNpbmNlIGVhY2ggQ1BVIHN0b3JlcyByYW0gYWRkcmVzc2VzIGluIGl0cyBUTEIgY2FjaGUsIHdlIG11c3QKKyAgICAgICByZXNldCB0aGUgbW9kaWZpZWQgZW50cmllcyAqLworICAgIC8qIFhYWDogc2xvdyAhICovCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIHRsYl9mbHVzaChjcHUtPmVudl9wdHIsIDEpOworICAgIH0KK30KKworLyogWFhYOiB0ZW1wb3JhcnkgdW50aWwgbmV3IG1lbW9yeSBtYXBwaW5nIEFQSSAqLworcmFtX2FkZHJfdCBjcHVfZ2V0X3BoeXNpY2FsX3BhZ2VfZGVzYyhod2FkZHIgYWRkcikKK3sKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBJT19NRU1fVU5BU1NJR05FRDsKKyAgICByZXR1cm4gcC0+cGh5c19vZmZzZXQ7Cit9CisKK3ZvaWQgcWVtdV9yZWdpc3Rlcl9jb2FsZXNjZWRfbW1pbyhod2FkZHIgYWRkciwgcmFtX2FkZHJfdCBzaXplKQoreworICAgIGlmIChrdm1fZW5hYmxlZCgpKQorICAgICAgICBrdm1fY29hbGVzY2VfbW1pb19yZWdpb24oYWRkciwgc2l6ZSk7Cit9CisKK3ZvaWQgcWVtdV91bnJlZ2lzdGVyX2NvYWxlc2NlZF9tbWlvKGh3YWRkciBhZGRyLCByYW1fYWRkcl90IHNpemUpCit7CisgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgIGt2bV91bmNvYWxlc2NlX21taW9fcmVnaW9uKGFkZHIsIHNpemUpOworfQorCit2b2lkIHFlbXVfbXV0ZXhfbG9ja19yYW1saXN0KHZvaWQpCit7CisgICAgcWVtdV9tdXRleF9sb2NrKCZyYW1fbGlzdC5tdXRleCk7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF91bmxvY2tfcmFtbGlzdCh2b2lkKQoreworICAgIHFlbXVfbXV0ZXhfdW5sb2NrKCZyYW1fbGlzdC5tdXRleCk7Cit9CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoQ09ORklHX0FORFJPSUQpCisKKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisKKyNkZWZpbmUgSFVHRVRMQkZTX01BR0lDICAgICAgIDB4OTU4NDU4ZjYKKworc3RhdGljIGxvbmcgZ2V0aHVnZXBhZ2VzaXplKGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgc3RydWN0IHN0YXRmcyBmczsKKyAgICBpbnQgcmV0OworCisgICAgZG8geworICAgICAgICByZXQgPSBzdGF0ZnMocGF0aCwgJmZzKTsKKyAgICB9IHdoaWxlIChyZXQgIT0gMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcGVycm9yKHBhdGgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZnMuZl90eXBlICE9IEhVR0VUTEJGU19NQUdJQykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBwYXRoIG5vdCBvbiBIdWdlVExCRlM6ICVzXG4iLCBwYXRoKTsKKworICAgIHJldHVybiBmcy5mX2JzaXplOworfQorCitzdGF0aWMgc2lnam1wX2J1ZiBzaWdqdW1wOworCitzdGF0aWMgdm9pZCBzaWdidXNfaGFuZGxlcihpbnQgc2lnbmFsKQoreworICAgIHNpZ2xvbmdqbXAoc2lnanVtcCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkICpmaWxlX3JhbV9hbGxvYyhSQU1CbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpzYW5pdGl6ZWRfbmFtZTsKKyAgICBjaGFyICpjOworICAgIHZvaWQgKmFyZWE7CisgICAgaW50IGZkOworICAgIHVuc2lnbmVkIGxvbmcgaHBhZ2VzaXplOworCisgICAgaHBhZ2VzaXplID0gZ2V0aHVnZXBhZ2VzaXplKHBhdGgpOworICAgIGlmICghaHBhZ2VzaXplKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtZW1vcnkgPCBocGFnZXNpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGt2bV9lbmFibGVkKCkgJiYgIWt2bV9oYXNfc3luY19tbXUoKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImhvc3QgbGFja3Mga3ZtIG1tdSBub3RpZmllcnMsIC1tZW0tcGF0aCB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIE1ha2UgbmFtZSBzYWZlIHRvIHVzZSB3aXRoIG1rc3RlbXAgYnkgcmVwbGFjaW5nICcvJyB3aXRoICdfJy4gKi8KKyAgICBzYW5pdGl6ZWRfbmFtZSA9IGdfc3RyZHVwKGJsb2NrLT5tci0+bmFtZSk7CisgICAgZm9yIChjID0gc2FuaXRpemVkX25hbWU7ICpjICE9ICdcMCc7IGMrKykgeworICAgICAgICBpZiAoKmMgPT0gJy8nKQorICAgICAgICAgICAgKmMgPSAnXyc7CisgICAgfQorCisgICAgZmlsZW5hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzL3FlbXVfYmFja19tZW0uJXMuWFhYWFhYIiwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZWRfbmFtZSk7CisgICAgZ19mcmVlKHNhbml0aXplZF9uYW1lKTsKKworICAgIGZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoInVuYWJsZSB0byBjcmVhdGUgYmFja2luZyBzdG9yZSBmb3IgaHVnZXBhZ2VzIik7CisgICAgICAgIGdfZnJlZShmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB1bmxpbmsoZmlsZW5hbWUpOworICAgIGdfZnJlZShmaWxlbmFtZSk7CisKKyAgICBtZW1vcnkgPSAobWVtb3J5K2hwYWdlc2l6ZS0xKSAmIH4oaHBhZ2VzaXplLTEpOworCisgICAgLyoKKyAgICAgKiBmdHJ1bmNhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBodWdldGxiZnMgaW4gb2xkZXIKKyAgICAgKiBob3N0cywgc28gZG9uJ3QgYm90aGVyIGJhaWxpbmcgb3V0IG9uIGVycm9ycy4KKyAgICAgKiBJZiBhbnl0aGluZyBnb2VzIHdyb25nIHdpdGggaXQgdW5kZXIgb3RoZXIgZmlsZXN5c3RlbXMsCisgICAgICogbW1hcCB3aWxsIGZhaWwuCisgICAgICovCisgICAgaWYgKGZ0cnVuY2F0ZShmZCwgbWVtb3J5KSkKKyAgICAgICAgcGVycm9yKCJmdHJ1bmNhdGUiKTsKKworICAgIGFyZWEgPSBtbWFwKDAsIG1lbW9yeSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKyAgICBpZiAoYXJlYSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIHBlcnJvcigiZmlsZV9yYW1fYWxsb2M6IGNhbid0IG1tYXAgUkFNIHBhZ2VzIik7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICBpZiAobWVtX3ByZWFsbG9jKSB7CisgICAgICAgIGludCByZXQsIGk7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0LCBvbGRhY3Q7CisgICAgICAgIHNpZ3NldF90IHNldCwgb2xkc2V0OworCisgICAgICAgIG1lbXNldCgmYWN0LCAwLCBzaXplb2YoYWN0KSk7CisgICAgICAgIGFjdC5zYV9oYW5kbGVyID0gJnNpZ2J1c19oYW5kbGVyOworICAgICAgICBhY3Quc2FfZmxhZ3MgPSAwOworCisgICAgICAgIHJldCA9IHNpZ2FjdGlvbihTSUdCVVMsICZhY3QsICZvbGRhY3QpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBwZXJyb3IoImZpbGVfcmFtX2FsbG9jOiBmYWlsZWQgdG8gaW5zdGFsbCBzaWduYWwgaGFuZGxlciIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVuYmxvY2sgU0lHQlVTICovCisgICAgICAgIHNpZ2VtcHR5c2V0KCZzZXQpOworICAgICAgICBzaWdhZGRzZXQoJnNldCwgU0lHQlVTKTsKKyAgICAgICAgcHRocmVhZF9zaWdtYXNrKFNJR19VTkJMT0NLLCAmc2V0LCAmb2xkc2V0KTsKKworICAgICAgICBpZiAoc2lnc2V0am1wKHNpZ2p1bXAsIDEpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZpbGVfcmFtX2FsbG9jOiBmYWlsZWQgdG8gcHJlYWxsb2NhdGUgcGFnZXNcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE1BUF9QT1BVTEFURSBzaWxlbnRseSBpZ25vcmVzIGZhaWx1cmVzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAobWVtb3J5L2hwYWdlc2l6ZSktMTsgaSsrKSB7CisgICAgICAgICAgICBtZW1zZXQoYXJlYSArIChocGFnZXNpemUqaSksIDAsIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gc2lnYWN0aW9uKFNJR0JVUywgJm9sZGFjdCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIHBlcnJvcigiZmlsZV9yYW1fYWxsb2M6IGZhaWxlZCB0byByZWluc3RhbGwgc2lnbmFsIGhhbmRsZXIiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworICAgIH0KKworICAgIGJsb2NrLT5mZCA9IGZkOworICAgIHJldHVybiBhcmVhOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkICpmaWxlX3JhbV9hbGxvYyhSQU1CbG9jayAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIi1tZW0tcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgaG9zdFxuIik7CisgICAgZXhpdCgxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgcmFtX2FkZHJfdCBmaW5kX3JhbV9vZmZzZXQocmFtX2FkZHJfdCBzaXplKQoreworICAgIFJBTUJsb2NrICpibG9jaywgKm5leHRfYmxvY2s7CisgICAgcmFtX2FkZHJfdCBvZmZzZXQgPSBSQU1fQUREUl9NQVgsIG1pbmdhcCA9IFJBTV9BRERSX01BWDsKKworICAgIGFzc2VydChzaXplICE9IDApOyAvKiBpdCB3b3VsZCBoYW5kIG91dCBzYW1lIG9mZnNldCBtdWx0aXBsZSB0aW1lcyAqLworCisgICAgaWYgKFFUQUlMUV9FTVBUWSgmcmFtX2xpc3QuYmxvY2tzKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkgeworICAgICAgICByYW1fYWRkcl90IGVuZCwgbmV4dCA9IFJBTV9BRERSX01BWDsKKworICAgICAgICBlbmQgPSBibG9jay0+b2Zmc2V0ICsgYmxvY2stPmxlbmd0aDsKKworICAgICAgICBRVEFJTFFfRk9SRUFDSChuZXh0X2Jsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgICAgICBpZiAobmV4dF9ibG9jay0+b2Zmc2V0ID49IGVuZCkgeworICAgICAgICAgICAgICAgIG5leHQgPSBNSU4obmV4dCwgbmV4dF9ibG9jay0+b2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmV4dCAtIGVuZCA+PSBzaXplICYmIG5leHQgLSBlbmQgPCBtaW5nYXApIHsKKyAgICAgICAgICAgIG9mZnNldCA9IGVuZDsKKyAgICAgICAgICAgIG1pbmdhcCA9IG5leHQgLSBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IFJBTV9BRERSX01BWCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kIGdhcCBvZiByZXF1ZXN0ZWQgc2l6ZTogJSIgUFJJdTY0ICJcbiIsCisgICAgICAgICAgICAgICAgKHVpbnQ2NF90KXNpemUpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3JhbV9hZGRyX3QgbGFzdF9yYW1fb2Zmc2V0KHZvaWQpCit7CisgICAgUkFNQmxvY2sgKmJsb2NrOworICAgIHJhbV9hZGRyX3QgbGFzdCA9IDA7CisKKyAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkKKyAgICAgICAgbGFzdCA9IE1BWChsYXN0LCBibG9jay0+b2Zmc2V0ICsgYmxvY2stPmxlbmd0aCk7CisKKyAgICByZXR1cm4gbGFzdDsKK30KKworc3RhdGljIHZvaWQgcWVtdV9yYW1fc2V0dXBfZHVtcCh2b2lkICphZGRyLCByYW1fYWRkcl90IHNpemUpCit7CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgaW50IHJldDsKKworICAgIC8qIFVzZSBNQURWX0RPTlREVU1QLCBpZiB1c2VyIGRvZXNuJ3Qgd2FudCB0aGUgZ3Vlc3QgbWVtb3J5IGluIHRoZSBjb3JlICovCisgICAgaWYgKCFxZW11X29wdF9nZXRfYm9vbChxZW11X2dldF9tYWNoaW5lX29wdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdW1wLWd1ZXN0LWNvcmUiLCB0cnVlKSkgeworICAgICAgICByZXQgPSBxZW11X21hZHZpc2UoYWRkciwgc2l6ZSwgUUVNVV9NQURWX0RPTlREVU1QKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgcGVycm9yKCJxZW11X21hZHZpc2UiKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFkdmlzZSBkb2Vzbid0IHN1cHBvcnQgTUFEVl9ET05URFVNUCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZHVtcF9ndWVzdF9jb3JlPW9mZiBzcGVjaWZpZWRcbiIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmICAvLyAhQ09ORklHX0FORFJPSUQKK30KKwordm9pZCBxZW11X3JhbV9zZXRfaWRzdHIocmFtX2FkZHJfdCBhZGRyLCBjb25zdCBjaGFyICpuYW1lLCBEZXZpY2VTdGF0ZSAqZGV2KQoreworICAgIFJBTUJsb2NrICpuZXdfYmxvY2ssICpibG9jazsKKworICAgIG5ld19ibG9jayA9IE5VTEw7CisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgaWYgKGJsb2NrLT5vZmZzZXQgPT0gYWRkcikgeworICAgICAgICAgICAgbmV3X2Jsb2NrID0gYmxvY2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQobmV3X2Jsb2NrKTsKKyAgICBhc3NlcnQoIW5ld19ibG9jay0+aWRzdHJbMF0pOworCisgICAgaWYgKGRldikgeworICAgICAgICBjaGFyICppZCA9IHFkZXZfZ2V0X2Rldl9wYXRoKGRldik7CisgICAgICAgIGlmIChpZCkgeworICAgICAgICAgICAgc25wcmludGYobmV3X2Jsb2NrLT5pZHN0ciwgc2l6ZW9mKG5ld19ibG9jay0+aWRzdHIpLCAiJXMvIiwgaWQpOworICAgICAgICAgICAgZ19mcmVlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwc3RyY2F0KG5ld19ibG9jay0+aWRzdHIsIHNpemVvZihuZXdfYmxvY2stPmlkc3RyKSwgbmFtZSk7CisKKyAgICAvKiBUaGlzIGFzc3VtZXMgdGhlIGlvdGhyZWFkIGxvY2sgaXMgdGFrZW4gaGVyZSB0b28uICAqLworICAgIHFlbXVfbXV0ZXhfbG9ja19yYW1saXN0KCk7CisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgaWYgKGJsb2NrICE9IG5ld19ibG9jayAmJiAhc3RyY21wKGJsb2NrLT5pZHN0ciwgbmV3X2Jsb2NrLT5pZHN0cikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUkFNQmxvY2sgXCIlc1wiIGFscmVhZHkgcmVnaXN0ZXJlZCwgYWJvcnQhXG4iLAorICAgICAgICAgICAgICAgICAgICBuZXdfYmxvY2stPmlkc3RyKTsKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcWVtdV9tdXRleF91bmxvY2tfcmFtbGlzdCgpOworfQorCitzdGF0aWMgaW50IG1lbW9yeV90cnlfZW5hYmxlX21lcmdpbmcodm9pZCAqYWRkciwgc2l6ZV90IGxlbikKK3sKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBpZiAoIXFlbXVfb3B0X2dldF9ib29sKHFlbXVfZ2V0X21hY2hpbmVfb3B0cygpLCAibWVtLW1lcmdlIiwgdHJ1ZSkpIHsKKyAgICAgICAgLyogZGlzYWJsZWQgYnkgdGhlIHVzZXIgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHFlbXVfbWFkdmlzZShhZGRyLCBsZW4sIFFFTVVfTUFEVl9NRVJHRUFCTEUpOworI2Vsc2UgIC8vIENPTkZJR19BTkRST0lECisgICAgcmV0dXJuIHFlbXVfbWFkdmlzZShhZGRyLCBsZW4sIFFFTVVfTUFEVl9NRVJHRUFCTEUpOworI2VuZGlmICAvLyBDT05GSUdfQU5EUk9JRAorfQorCityYW1fYWRkcl90IHFlbXVfcmFtX2FsbG9jX2Zyb21fcHRyKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSwgdm9pZCAqaG9zdCkKK3sKKyAgICBSQU1CbG9jayAqYmxvY2ssICpuZXdfYmxvY2s7CisgICAgcmFtX2FkZHJfdCBvbGRfcmFtX3NpemUsIG5ld19yYW1fc2l6ZTsKKworICAgIG9sZF9yYW1fc2l6ZSA9IGxhc3RfcmFtX29mZnNldCgpID4+IFRBUkdFVF9QQUdFX0JJVFM7CisKKyAgICBzaXplID0gVEFSR0VUX1BBR0VfQUxJR04oc2l6ZSk7CisgICAgbmV3X2Jsb2NrID0gZ19tYWxsb2MwKHNpemVvZigqbmV3X2Jsb2NrKSk7CisgICAgbmV3X2Jsb2NrLT5mZCA9IC0xOworCisgICAgLyogVGhpcyBhc3N1bWVzIHRoZSBpb3RocmVhZCBsb2NrIGlzIHRha2VuIGhlcmUgdG9vLiAgKi8KKyAgICBxZW11X211dGV4X2xvY2tfcmFtbGlzdCgpOworICAgIC8vbmV3X2Jsb2NrLT5tciA9IG1yOworICAgIG5ld19ibG9jay0+b2Zmc2V0ID0gZmluZF9yYW1fb2Zmc2V0KHNpemUpOworICAgIGlmIChob3N0KSB7CisgICAgICAgIG5ld19ibG9jay0+aG9zdCA9IGhvc3Q7CisgICAgICAgIG5ld19ibG9jay0+ZmxhZ3MgfD0gUkFNX1BSRUFMTE9DX01BU0s7CisgICAgfSBlbHNlIGlmICh4ZW5fZW5hYmxlZCgpKSB7CisgICAgICAgIGlmIChtZW1fcGF0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbWVtLXBhdGggbm90IHN1cHBvcnRlZCB3aXRoIFhlblxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIC8veGVuX3JhbV9hbGxvYyhuZXdfYmxvY2stPm9mZnNldCwgc2l6ZSwgbXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZW1fcGF0aCkgeworICAgICAgICAgICAgaWYgKHBoeXNfbWVtX2FsbG9jICE9IHFlbXVfYW5vbl9yYW1fYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZpbGVfcmFtX2FsbG9jKCkgbmVlZHMgdG8gYWxsb2NhdGUganVzdCBsaWtlCisgICAgICAgICAgICAgICAgICogcGh5c19tZW1fYWxsb2MsIGJ1dCB3ZSBoYXZlbid0IGJvdGhlcmVkIHRvIHByb3ZpZGUKKyAgICAgICAgICAgICAgICAgKiBhIGhvb2sgdGhlcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiLW1lbS1wYXRoIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGFjY2VsZXJhdG9yXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X2Jsb2NrLT5ob3N0ID0gZmlsZV9yYW1fYWxsb2MobmV3X2Jsb2NrLCBzaXplLCBtZW1fcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuZXdfYmxvY2stPmhvc3QpIHsKKyAgICAgICAgICAgIG5ld19ibG9jay0+aG9zdCA9IHBoeXNfbWVtX2FsbG9jKHNpemUpOworICAgICAgICAgICAgaWYgKCFuZXdfYmxvY2stPmhvc3QpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzZXQgdXAgZ3Vlc3QgbWVtb3J5ICclcyc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorI2lmZGVmIENPTkZJR19IQVgKKyAgICAgICAgICAgIGlmIChoYXhfZW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJbiBIQVgsIHFlbXUgYWxsb2NhdGVzIHRoZSB2aXJ0dWFsIGFkZHJlc3MsIGFuZCBIQVgga2VybmVsCisgICAgICAgICAgICAgICAgICogbW9kdWxlIHBvcHVsYXRlcyB0aGUgcmVnaW9uIHdpdGggcGh5c2ljYWwgbWVtb3J5LiBDdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgKiB3ZSBkb27igJl0IHBvcHVsYXRlIGd1ZXN0IG1lbW9yeSBvbiBkZW1hbmQsIHRodXMgd2Ugc2hvdWxkCisgICAgICAgICAgICAgICAgICogbWFrZSBzdXJlIHRoYXQgc3VmZmljaWVudCBhbW91bnQgb2YgbWVtb3J5IGlzIGF2YWlsYWJsZSBpbgorICAgICAgICAgICAgICAgICAqIGFkdmFuY2UuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IHJldCA9IGhheF9wb3B1bGF0ZV9yYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKHVpbnRwdHJfdCluZXdfYmxvY2stPmhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJIYXggZmFpbGVkIHRvIHBvcHVsYXRlIHJhbVxuIik7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoLTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAgLy8gQ09ORklHX0hBWAorICAgICAgICAgICAgbWVtb3J5X3RyeV9lbmFibGVfbWVyZ2luZyhuZXdfYmxvY2stPmhvc3QsIHNpemUpOworICAgICAgICB9CisgICAgfQorICAgIG5ld19ibG9jay0+bGVuZ3RoID0gc2l6ZTsKKworICAgIGlmIChkZXYpIHsKKyAgICAgICAgY2hhciAqaWQgPSBxZGV2X2dldF9kZXZfcGF0aChkZXYpOworICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKG5ld19ibG9jay0+aWRzdHIsIHNpemVvZihuZXdfYmxvY2stPmlkc3RyKSwgIiVzLyIsIGlkKTsKKyAgICAgICAgICAgIGdfZnJlZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHN0cmNhdChuZXdfYmxvY2stPmlkc3RyLCBzaXplb2YobmV3X2Jsb2NrLT5pZHN0ciksIG5hbWUpOworCisgICAgLyogS2VlcCB0aGUgbGlzdCBzb3J0ZWQgZnJvbSBiaWdnZXN0IHRvIHNtYWxsZXN0IGJsb2NrLiAgKi8KKyAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkgeworICAgICAgICBpZiAoYmxvY2stPmxlbmd0aCA8IG5ld19ibG9jay0+bGVuZ3RoKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgUVRBSUxRX0lOU0VSVF9CRUZPUkUoYmxvY2ssIG5ld19ibG9jaywgbmV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZyYW1fbGlzdC5ibG9ja3MsIG5ld19ibG9jaywgbmV4dCk7CisgICAgfQorICAgIHJhbV9saXN0Lm1ydV9ibG9jayA9IE5VTEw7CisKKyAgICByYW1fbGlzdC52ZXJzaW9uKys7CisgICAgcWVtdV9tdXRleF91bmxvY2tfcmFtbGlzdCgpOworCisgICAgbmV3X3JhbV9zaXplID0gbGFzdF9yYW1fb2Zmc2V0KCkgPj4gVEFSR0VUX1BBR0VfQklUUzsKKworICAgIGlmIChuZXdfcmFtX3NpemUgPiBvbGRfcmFtX3NpemUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBESVJUWV9NRU1PUllfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIHJhbV9saXN0LmRpcnR5X21lbW9yeVtpXSA9CisgICAgICAgICAgICAgICAgYml0bWFwX3plcm9fZXh0ZW5kKHJhbV9saXN0LmRpcnR5X21lbW9yeVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3JhbV9zaXplLCBuZXdfcmFtX3NpemUpOworICAgICAgIH0KKyAgICB9CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfcmFuZ2UobmV3X2Jsb2NrLT5vZmZzZXQsIHNpemUpOworCisgICAgcWVtdV9yYW1fc2V0dXBfZHVtcChuZXdfYmxvY2stPmhvc3QsIHNpemUpOworICAgIC8vcWVtdV9tYWR2aXNlKG5ld19ibG9jay0+aG9zdCwgc2l6ZSwgUUVNVV9NQURWX0hVR0VQQUdFKTsKKyAgICAvL3FlbXVfbWFkdmlzZShuZXdfYmxvY2stPmhvc3QsIHNpemUsIFFFTVVfTUFEVl9ET05URk9SSyk7CisKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkKKyAgICAgICAga3ZtX3NldHVwX2d1ZXN0X21lbW9yeShuZXdfYmxvY2stPmhvc3QsIHNpemUpOworCisgICAgcmV0dXJuIG5ld19ibG9jay0+b2Zmc2V0OworfQorCityYW1fYWRkcl90IHFlbXVfcmFtX2FsbG9jKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gcWVtdV9yYW1fYWxsb2NfZnJvbV9wdHIoZGV2LCBuYW1lLCBzaXplLCBOVUxMKTsKK30KKwordm9pZCBxZW11X3JhbV9mcmVlX2Zyb21fcHRyKHJhbV9hZGRyX3QgYWRkcikKK3sKKyAgICBSQU1CbG9jayAqYmxvY2s7CisKKyAgICAvKiBUaGlzIGFzc3VtZXMgdGhlIGlvdGhyZWFkIGxvY2sgaXMgdGFrZW4gaGVyZSB0b28uICAqLworICAgIHFlbXVfbXV0ZXhfbG9ja19yYW1saXN0KCk7CisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgaWYgKGFkZHIgPT0gYmxvY2stPm9mZnNldCkgeworICAgICAgICAgICAgUVRBSUxRX1JFTU9WRSgmcmFtX2xpc3QuYmxvY2tzLCBibG9jaywgbmV4dCk7CisgICAgICAgICAgICByYW1fbGlzdC5tcnVfYmxvY2sgPSBOVUxMOworICAgICAgICAgICAgcmFtX2xpc3QudmVyc2lvbisrOworICAgICAgICAgICAgZ19mcmVlKGJsb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHFlbXVfbXV0ZXhfdW5sb2NrX3JhbWxpc3QoKTsKK30KKwordm9pZCBxZW11X3JhbV9mcmVlKHJhbV9hZGRyX3QgYWRkcikKK3sKKyAgICBSQU1CbG9jayAqYmxvY2s7CisKKyAgICAvKiBUaGlzIGFzc3VtZXMgdGhlIGlvdGhyZWFkIGxvY2sgaXMgdGFrZW4gaGVyZSB0b28uICAqLworICAgIHFlbXVfbXV0ZXhfbG9ja19yYW1saXN0KCk7CisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgaWYgKGFkZHIgPT0gYmxvY2stPm9mZnNldCkgeworICAgICAgICAgICAgUVRBSUxRX1JFTU9WRSgmcmFtX2xpc3QuYmxvY2tzLCBibG9jaywgbmV4dCk7CisgICAgICAgICAgICByYW1fbGlzdC5tcnVfYmxvY2sgPSBOVUxMOworICAgICAgICAgICAgcmFtX2xpc3QudmVyc2lvbisrOworICAgICAgICAgICAgaWYgKGJsb2NrLT5mbGFncyAmIFJBTV9QUkVBTExPQ19NQVNLKSB7CisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgfSBlbHNlIGlmICh4ZW5fZW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLy94ZW5faW52YWxpZGF0ZV9tYXBfY2FjaGVfZW50cnkoYmxvY2stPmhvc3QpOworI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmxvY2stPmZkID49IDApIHsKKyAgICAgICAgICAgICAgICBtdW5tYXAoYmxvY2stPmhvc3QsIGJsb2NrLT5sZW5ndGgpOworICAgICAgICAgICAgICAgIGNsb3NlKGJsb2NrLT5mZCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcWVtdV9hbm9uX3JhbV9mcmVlKGJsb2NrLT5ob3N0LCBibG9jay0+bGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdfZnJlZShibG9jayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBxZW11X211dGV4X3VubG9ja19yYW1saXN0KCk7CisKK30KKworI2lmbmRlZiBfV0lOMzIKK3ZvaWQgcWVtdV9yYW1fcmVtYXAocmFtX2FkZHJfdCBhZGRyLCByYW1fYWRkcl90IGxlbmd0aCkKK3sKKyAgICBSQU1CbG9jayAqYmxvY2s7CisgICAgcmFtX2FkZHJfdCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworICAgIHZvaWQgKmFyZWEsICp2YWRkcjsKKworICAgIFFUQUlMUV9GT1JFQUNIKGJsb2NrLCAmcmFtX2xpc3QuYmxvY2tzLCBuZXh0KSB7CisgICAgICAgIG9mZnNldCA9IGFkZHIgLSBibG9jay0+b2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0IDwgYmxvY2stPmxlbmd0aCkgeworICAgICAgICAgICAgdmFkZHIgPSBibG9jay0+aG9zdCArIG9mZnNldDsKKyAgICAgICAgICAgIGlmIChibG9jay0+ZmxhZ3MgJiBSQU1fUFJFQUxMT0NfTUFTSykgeworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeGVuX2VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsYWdzID0gTUFQX0ZJWEVEOworICAgICAgICAgICAgICAgIG11bm1hcCh2YWRkciwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmZkID49IDApIHsKKyNpZmRlZiBNQVBfUE9QVUxBVEUKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gbWVtX3ByZWFsbG9jID8gTUFQX1BPUFVMQVRFIHwgTUFQX1NIQVJFRCA6CisgICAgICAgICAgICAgICAgICAgICAgICBNQVBfUFJJVkFURTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1BUF9QUklWQVRFOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGFyZWEgPSBtbWFwKHZhZGRyLCBsZW5ndGgsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBibG9jay0+ZmQsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogUmVtYXAgbmVlZHMgdG8gbWF0Y2ggYWxsb2MuICBBY2NlbGVyYXRvcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgKiBzZXQgcGh5c19tZW1fYWxsb2MgbmV2ZXIgcmVtYXAuICBJZiB0aGV5IGRpZCwKKyAgICAgICAgICAgICAgICAgICAgICogd2UnZCBuZWVkIGEgcmVtYXAgaG9vayBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBoeXNfbWVtX2FsbG9jID09IHFlbXVfYW5vbl9yYW1fYWxsb2MpOworCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUzsKKyAgICAgICAgICAgICAgICAgICAgYXJlYSA9IG1tYXAodmFkZHIsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIC0xLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGFyZWEgIT0gdmFkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVtYXAgYWRkcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBTV9BRERSX0ZNVCAiQCIgUkFNX0FERFJfRk1UICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtb3J5X3RyeV9lbmFibGVfbWVyZ2luZyh2YWRkciwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBxZW11X3JhbV9zZXR1cF9kdW1wKHZhZGRyLCBsZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmIC8qICFfV0lOMzIgKi8KKworLyogUmV0dXJuIGEgaG9zdCBwb2ludGVyIHRvIHJhbSBhbGxvY2F0ZWQgd2l0aCBxZW11X3JhbV9hbGxvYy4KKyAgIFdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgc29mdG1tdSBjb2RlIGluIHRoaXMgZmlsZSwgdGhpcyBzaG91bGQKKyAgIG9ubHkgYmUgdXNlZCBmb3IgbG9jYWwgbWVtb3J5IChlLmcuIHZpZGVvIHJhbSkgdGhhdCB0aGUgZGV2aWNlIG93bnMsCisgICBhbmQga25vd3MgaXQgaXNuJ3QgZ29pbmcgdG8gYWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKworICAgSXQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBnZW5lcmFsIHB1cnBvc2UgRE1BLgorICAgVXNlIGNwdV9waHlzaWNhbF9tZW1vcnlfbWFwL2NwdV9waHlzaWNhbF9tZW1vcnlfcncgaW5zdGVhZC4KKyAqLwordm9pZCAqcWVtdV9nZXRfcmFtX3B0cihyYW1fYWRkcl90IGFkZHIpCit7CisgICAgUkFNQmxvY2sgKmJsb2NrID0gcWVtdV9nZXRfcmFtX2Jsb2NrKGFkZHIpOworI2lmIDAKKyAgICBpZiAoeGVuX2VuYWJsZWQoKSkgeworICAgICAgICAvKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgYWRkcmVzcyBpcyBpbiB0aGUgUkFNCisgICAgICAgICAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBtYXAgdGhlIGVudGlyZSBtZW1vcnkgaW4gUUVNVS4KKyAgICAgICAgICogSW4gdGhhdCBjYXNlIGp1c3QgbWFwIHVudGlsIHRoZSBlbmQgb2YgdGhlIHBhZ2UuCisgICAgICAgICAqLworICAgICAgICBpZiAoYmxvY2stPm9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4geGVuX21hcF9jYWNoZShhZGRyLCAwLCAwKTsKKyAgICAgICAgfSBlbHNlIGlmIChibG9jay0+aG9zdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBibG9jay0+aG9zdCA9CisgICAgICAgICAgICAgICAgeGVuX21hcF9jYWNoZShibG9jay0+b2Zmc2V0LCBibG9jay0+bGVuZ3RoLCAxKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBibG9jay0+aG9zdCArIChhZGRyIC0gYmxvY2stPm9mZnNldCk7Cit9CisKKy8qIFJldHVybiBhIGhvc3QgcG9pbnRlciB0byByYW0gYWxsb2NhdGVkIHdpdGggcWVtdV9yYW1fYWxsb2MuCisgKiBTYW1lIGFzIHFlbXVfZ2V0X3JhbV9wdHIgYnV0IGF2b2lkIHJlb3JkZXJpbmcgcmFtYmxvY2tzLgorICovCit2b2lkICpxZW11X3NhZmVfcmFtX3B0cihyYW1fYWRkcl90IGFkZHIpCit7CisgICAgUkFNQmxvY2sgKmJsb2NrOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYmxvY2ssICZyYW1fbGlzdC5ibG9ja3MsIG5leHQpIHsKKyAgICAgICAgaWYgKGFkZHIgLSBibG9jay0+b2Zmc2V0IDwgYmxvY2stPmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLT5ob3N0ICsgKGFkZHIgLSBibG9jay0+b2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIHJhbSBvZmZzZXQgJSIgUFJJeDY0ICJcbiIsICh1aW50NjRfdClhZGRyKTsKKyAgICBhYm9ydCgpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFNvbWUgb2YgdGhlIHNvZnRtbXUgcm91dGluZXMgbmVlZCB0byB0cmFuc2xhdGUgZnJvbSBhIGhvc3QgcG9pbnRlcgorICAgKHR5cGljYWxseSBhIFRMQiBlbnRyeSkgYmFjayB0byBhIHJhbSBvZmZzZXQuICAqLworaW50IHFlbXVfcmFtX2FkZHJfZnJvbV9ob3N0KHZvaWQgKnB0ciwgcmFtX2FkZHJfdCAqcmFtX2FkZHIpCit7CisgICAgUkFNQmxvY2sgKmJsb2NrOworICAgIHVpbnQ4X3QgKmhvc3QgPSBwdHI7CisjaWYgMAorICAgIGlmICh4ZW5fZW5hYmxlZCgpKSB7CisgICAgICAgICpyYW1fYWRkciA9IHhlbl9yYW1fYWRkcl9mcm9tX21hcGNhY2hlKHB0cik7CisgICAgICAgIHJldHVybiBxZW11X2dldF9yYW1fYmxvY2soKnJhbV9hZGRyKS0+bXI7CisgICAgfQorI2VuZGlmCisgICAgYmxvY2sgPSByYW1fbGlzdC5tcnVfYmxvY2s7CisgICAgaWYgKGJsb2NrICYmIGJsb2NrLT5ob3N0ICYmIGhvc3QgLSBibG9jay0+aG9zdCA8IGJsb2NrLT5sZW5ndGgpIHsKKyAgICAgICAgZ290byBmb3VuZDsKKyAgICB9CisKKyAgICBRVEFJTFFfRk9SRUFDSChibG9jaywgJnJhbV9saXN0LmJsb2NrcywgbmV4dCkgeworICAgICAgICAvKiBUaGlzIGNhc2UgYXBwZW5kIHdoZW4gdGhlIGJsb2NrIGlzIG5vdCBtYXBwZWQuICovCisgICAgICAgIGlmIChibG9jay0+aG9zdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaG9zdCAtIGJsb2NrLT5ob3N0IDwgYmxvY2stPmxlbmd0aCkgeworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKKworZm91bmQ6CisgICAgKnJhbV9hZGRyID0gYmxvY2stPm9mZnNldCArIChob3N0IC0gYmxvY2stPmhvc3QpOworICAgIHJldHVybiAwOworfQorCisvKiBTb21lIG9mIHRoZSBzb2Z0bW11IHJvdXRpbmVzIG5lZWQgdG8gdHJhbnNsYXRlIGZyb20gYSBob3N0IHBvaW50ZXIKKyAgICh0eXBpY2FsbHkgYSBUTEIgZW50cnkpIGJhY2sgdG8gYSByYW0gb2Zmc2V0LiAgKi8KK3JhbV9hZGRyX3QgcWVtdV9yYW1fYWRkcl9mcm9tX2hvc3Rfbm9mYWlsKHZvaWQgKnB0cikKK3sKKyAgICByYW1fYWRkcl90IHJhbV9hZGRyOworCisgICAgaWYgKHFlbXVfcmFtX2FkZHJfZnJvbV9ob3N0KHB0ciwgJnJhbV9hZGRyKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJhZCByYW0gcG9pbnRlciAlcFxuIiwgcHRyKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJhbV9hZGRyOworfQorCitzdGF0aWMgdWludDMyX3QgdW5hc3NpZ25lZF9tZW1fcmVhZGIodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcikKK3sKKyNpZmRlZiBERUJVR19VTkFTU0lHTkVECisgICAgcHJpbnRmKCJVbmFzc2lnbmVkIG1lbSByZWFkICIgVEFSR0VUX0ZNVF9wbHggIlxuIiwgYWRkcik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQykgfHwgZGVmaW5lZChUQVJHRVRfTUlDUk9CTEFaRSkKKyAgICBjcHVfdW5hc3NpZ25lZF9hY2Nlc3MoY3B1X3NpbmdsZV9lbnYsIGFkZHIsIDAsIDAsIDAsIDEpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB1bmFzc2lnbmVkX21lbV9yZWFkdyh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyKQoreworI2lmZGVmIERFQlVHX1VOQVNTSUdORUQKKyAgICBwcmludGYoIlVuYXNzaWduZWQgbWVtIHJlYWQgIiBUQVJHRVRfRk1UX3BseCAiXG4iLCBhZGRyKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKSB8fCBkZWZpbmVkKFRBUkdFVF9NSUNST0JMQVpFKQorICAgIGNwdV91bmFzc2lnbmVkX2FjY2VzcyhjcHVfc2luZ2xlX2VudiwgYWRkciwgMCwgMCwgMCwgMik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IHVuYXNzaWduZWRfbWVtX3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisjaWZkZWYgREVCVUdfVU5BU1NJR05FRAorICAgIHByaW50ZigiVW5hc3NpZ25lZCBtZW0gcmVhZCAiIFRBUkdFVF9GTVRfcGx4ICJcbiIsIGFkZHIpOworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpIHx8IGRlZmluZWQoVEFSR0VUX01JQ1JPQkxBWkUpCisgICAgY3B1X3VuYXNzaWduZWRfYWNjZXNzKGNwdV9zaW5nbGVfZW52LCBhZGRyLCAwLCAwLCAwLCA0KTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bmFzc2lnbmVkX21lbV93cml0ZWIodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKQoreworI2lmZGVmIERFQlVHX1VOQVNTSUdORUQKKyAgICBwcmludGYoIlVuYXNzaWduZWQgbWVtIHdyaXRlICIgVEFSR0VUX0ZNVF9wbHggIiA9IDB4JXhcbiIsIGFkZHIsIHZhbCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQykgfHwgZGVmaW5lZChUQVJHRVRfTUlDUk9CTEFaRSkKKyAgICBjcHVfdW5hc3NpZ25lZF9hY2Nlc3MoY3B1X3NpbmdsZV9lbnYsIGFkZHIsIDEsIDAsIDAsIDEpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHVuYXNzaWduZWRfbWVtX3dyaXRldyh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisjaWZkZWYgREVCVUdfVU5BU1NJR05FRAorICAgIHByaW50ZigiVW5hc3NpZ25lZCBtZW0gd3JpdGUgIiBUQVJHRVRfRk1UX3BseCAiID0gMHgleFxuIiwgYWRkciwgdmFsKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKSB8fCBkZWZpbmVkKFRBUkdFVF9NSUNST0JMQVpFKQorICAgIGNwdV91bmFzc2lnbmVkX2FjY2VzcyhjcHVfc2luZ2xlX2VudiwgYWRkciwgMSwgMCwgMCwgMik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdW5hc3NpZ25lZF9tZW1fd3JpdGVsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyNpZmRlZiBERUJVR19VTkFTU0lHTkVECisgICAgcHJpbnRmKCJVbmFzc2lnbmVkIG1lbSB3cml0ZSAiIFRBUkdFVF9GTVRfcGx4ICIgPSAweCV4XG4iLCBhZGRyLCB2YWwpOworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpIHx8IGRlZmluZWQoVEFSR0VUX01JQ1JPQkxBWkUpCisgICAgY3B1X3VuYXNzaWduZWRfYWNjZXNzKGNwdV9zaW5nbGVfZW52LCBhZGRyLCAxLCAwLCAwLCA0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKiBjb25zdCB1bmFzc2lnbmVkX21lbV9yZWFkWzNdID0geworICAgIHVuYXNzaWduZWRfbWVtX3JlYWRiLAorICAgIHVuYXNzaWduZWRfbWVtX3JlYWR3LAorICAgIHVuYXNzaWduZWRfbWVtX3JlYWRsLAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqIGNvbnN0IHVuYXNzaWduZWRfbWVtX3dyaXRlWzNdID0geworICAgIHVuYXNzaWduZWRfbWVtX3dyaXRlYiwKKyAgICB1bmFzc2lnbmVkX21lbV93cml0ZXcsCisgICAgdW5hc3NpZ25lZF9tZW1fd3JpdGVsLAorfTsKKworc3RhdGljIHZvaWQgbm90ZGlydHlfbWVtX3dyaXRlYih2b2lkICpvcGFxdWUsIGh3YWRkciByYW1fYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsKQoreworICAgIGlmICghY3B1X3BoeXNpY2FsX21lbW9yeV9nZXRfZGlydHlfZmxhZyhyYW1fYWRkciwgRElSVFlfTUVNT1JZX0NPREUpKSB7CisgICAgICAgIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX2Zhc3QwKHJhbV9hZGRyLCAxKTsKKyAgICB9CisgICAgc3RiX3AocWVtdV9nZXRfcmFtX3B0cihyYW1fYWRkciksIHZhbCk7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhyYW1fYWRkciwgRElSVFlfTUVNT1JZX01JR1JBVElPTik7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhyYW1fYWRkciwgRElSVFlfTUVNT1JZX1ZHQSk7CisgICAgLyogd2UgcmVtb3ZlIHRoZSBub3RkaXJ0eSBjYWxsYmFjayBvbmx5IGlmIHRoZSBjb2RlIGhhcyBiZWVuCisgICAgICAgZmx1c2hlZCAqLworICAgIGlmICghY3B1X3BoeXNpY2FsX21lbW9yeV9pc19jbGVhbihyYW1fYWRkcikpIHsKKyAgICAgICAgQ1BVQXJjaFN0YXRlICplbnYgPSBjdXJyZW50X2NwdS0+ZW52X3B0cjsKKyAgICAgICAgdGxiX3NldF9kaXJ0eShlbnYsIGVudi0+bWVtX2lvX3ZhZGRyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5vdGRpcnR5X21lbV93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgcmFtX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbCkKK3sKKyAgICBpZiAoIWNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5X2ZsYWcocmFtX2FkZHIsIERJUlRZX01FTU9SWV9DT0RFKSkgeworICAgICAgICB0Yl9pbnZhbGlkYXRlX3BoeXNfcGFnZV9mYXN0MChyYW1fYWRkciwgMSk7CisgICAgfQorICAgIHN0d19wKHFlbXVfZ2V0X3JhbV9wdHIocmFtX2FkZHIpLCB2YWwpOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X2ZsYWcocmFtX2FkZHIsIERJUlRZX01FTU9SWV9NSUdSQVRJT04pOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X2ZsYWcocmFtX2FkZHIsIERJUlRZX01FTU9SWV9WR0EpOworICAgIC8qIHdlIHJlbW92ZSB0aGUgbm90ZGlydHkgY2FsbGJhY2sgb25seSBpZiB0aGUgY29kZSBoYXMgYmVlbgorICAgICAgIGZsdXNoZWQgKi8KKyAgICBpZiAoIWNwdV9waHlzaWNhbF9tZW1vcnlfaXNfY2xlYW4ocmFtX2FkZHIpKSB7CisgICAgICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3VycmVudF9jcHUtPmVudl9wdHI7CisgICAgICAgIHRsYl9zZXRfZGlydHkoZW52LCBlbnYtPm1lbV9pb192YWRkcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBub3RkaXJ0eV9tZW1fd3JpdGVsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIHJhbV9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwpCit7CisgICAgaWYgKCFjcHVfcGh5c2ljYWxfbWVtb3J5X2dldF9kaXJ0eV9mbGFnKHJhbV9hZGRyLCBESVJUWV9NRU1PUllfQ09ERSkpIHsKKyAgICAgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfZmFzdDAocmFtX2FkZHIsIDEpOworICAgIH0KKyAgICBzdGxfcChxZW11X2dldF9yYW1fcHRyKHJhbV9hZGRyKSwgdmFsKTsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3NldF9kaXJ0eV9mbGFnKHJhbV9hZGRyLCBESVJUWV9NRU1PUllfTUlHUkFUSU9OKTsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3NldF9kaXJ0eV9mbGFnKHJhbV9hZGRyLCBESVJUWV9NRU1PUllfVkdBKTsKKyAgICAvKiB3ZSByZW1vdmUgdGhlIG5vdGRpcnR5IGNhbGxiYWNrIG9ubHkgaWYgdGhlIGNvZGUgaGFzIGJlZW4KKyAgICAgICBmbHVzaGVkICovCisgICAgaWYgKCFjcHVfcGh5c2ljYWxfbWVtb3J5X2lzX2NsZWFuKHJhbV9hZGRyKSkgeworICAgICAgICBDUFVBcmNoU3RhdGUgKmVudiA9IGN1cnJlbnRfY3B1LT5lbnZfcHRyOworICAgICAgICB0bGJfc2V0X2RpcnR5KGVudiwgZW52LT5tZW1faW9fdmFkZHIpOworICAgIH0KK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICogY29uc3QgZXJyb3JfbWVtX3JlYWRbM10gPSB7CisgICAgTlVMTCwgLyogbmV2ZXIgdXNlZCAqLworICAgIE5VTEwsIC8qIG5ldmVyIHVzZWQgKi8KKyAgICBOVUxMLCAvKiBuZXZlciB1c2VkICovCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICogY29uc3Qgbm90ZGlydHlfbWVtX3dyaXRlWzNdID0geworICAgIG5vdGRpcnR5X21lbV93cml0ZWIsCisgICAgbm90ZGlydHlfbWVtX3dyaXRldywKKyAgICBub3RkaXJ0eV9tZW1fd3JpdGVsLAorfTsKKworCisvKiBHZW5lcmF0ZSBhIGRlYnVnIGV4Y2VwdGlvbiBpZiBhIHdhdGNocG9pbnQgaGFzIGJlZW4gaGl0LiAgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3dhdGNocG9pbnQoaW50IG9mZnNldCwgaW50IGxlbl9tYXNrLCBpbnQgZmxhZ3MpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IGN1cnJlbnRfY3B1OworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIHRhcmdldF91bG9uZyBwYywgY3NfYmFzZTsKKyAgICB0YXJnZXRfdWxvbmcgdmFkZHI7CisgICAgQ1BVV2F0Y2hwb2ludCAqd3A7CisgICAgaW50IGNwdV9mbGFnczsKKworICAgIGlmIChlbnYtPndhdGNocG9pbnRfaGl0KSB7CisgICAgICAgIC8qIFdlIHJlLWVudGVyZWQgdGhlIGNoZWNrIGFmdGVyIHJlcGxhY2luZyB0aGUgVEIuIE5vdyByYWlzZQorICAgICAgICAgKiB0aGUgZGVidWcgaW50ZXJydXB0IHNvIHRoYXQgaXMgd2lsbCB0cmlnZ2VyIGFmdGVyIHRoZQorICAgICAgICAgKiBjdXJyZW50IGluc3RydWN0aW9uLiAqLworICAgICAgICBjcHVfaW50ZXJydXB0KGNwdSwgQ1BVX0lOVEVSUlVQVF9ERUJVRyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFkZHIgPSAoZW52LT5tZW1faW9fdmFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLKSArIG9mZnNldDsKKyAgICBRVEFJTFFfRk9SRUFDSCh3cCwgJmVudi0+d2F0Y2hwb2ludHMsIGVudHJ5KSB7CisgICAgICAgIGlmICgodmFkZHIgPT0gKHdwLT52YWRkciAmIGxlbl9tYXNrKSB8fAorICAgICAgICAgICAgICh2YWRkciAmIHdwLT5sZW5fbWFzaykgPT0gd3AtPnZhZGRyKSAmJiAod3AtPmZsYWdzICYgZmxhZ3MpKSB7CisgICAgICAgICAgICB3cC0+ZmxhZ3MgfD0gQlBfV0FUQ0hQT0lOVF9ISVQ7CisgICAgICAgICAgICBpZiAoIWVudi0+d2F0Y2hwb2ludF9oaXQpIHsKKyAgICAgICAgICAgICAgICBlbnYtPndhdGNocG9pbnRfaGl0ID0gd3A7CisgICAgICAgICAgICAgICAgdGJfY2hlY2tfd2F0Y2hwb2ludChlbnYpOworICAgICAgICAgICAgICAgIGlmICh3cC0+ZmxhZ3MgJiBCUF9TVE9QX0JFRk9SRV9BQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0RFQlVHOworICAgICAgICAgICAgICAgICAgICBjcHVfbG9vcF9leGl0KGVudik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3B1X2dldF90Yl9jcHVfc3RhdGUoZW52LCAmcGMsICZjc19iYXNlLCAmY3B1X2ZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgdGJfZ2VuX2NvZGUoZW52LCBwYywgY3NfYmFzZSwgY3B1X2ZsYWdzLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3B1X3Jlc3VtZV9mcm9tX3NpZ25hbChlbnYsIE5VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdwLT5mbGFncyAmPSB+QlBfV0FUQ0hQT0lOVF9ISVQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFdhdGNocG9pbnQgYWNjZXNzIHJvdXRpbmVzLiAgV2F0Y2hwb2ludHMgYXJlIGluc2VydGVkIHVzaW5nIFRMQiB0cmlja3MsCisgICBzbyB0aGVzZSBjaGVjayBmb3IgYSBoaXQgdGhlbiBwYXNzIHRocm91Z2ggdG8gdGhlIG5vcm1hbCBvdXQtb2YtbGluZQorICAgcGh5cyByb3V0aW5lcy4gICovCitzdGF0aWMgdWludDMyX3Qgd2F0Y2hfbWVtX3JlYWRiKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgY2hlY2tfd2F0Y2hwb2ludChhZGRyICYgflRBUkdFVF9QQUdFX01BU0ssIH4weDAsIEJQX01FTV9SRUFEKTsKKyAgICByZXR1cm4gbGR1Yl9waHlzKGFkZHIpOworfQorCitzdGF0aWMgdWludDMyX3Qgd2F0Y2hfbWVtX3JlYWR3KHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgY2hlY2tfd2F0Y2hwb2ludChhZGRyICYgflRBUkdFVF9QQUdFX01BU0ssIH4weDEsIEJQX01FTV9SRUFEKTsKKyAgICByZXR1cm4gbGR1d19waHlzKGFkZHIpOworfQorCitzdGF0aWMgdWludDMyX3Qgd2F0Y2hfbWVtX3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgY2hlY2tfd2F0Y2hwb2ludChhZGRyICYgflRBUkdFVF9QQUdFX01BU0ssIH4weDMsIEJQX01FTV9SRUFEKTsKKyAgICByZXR1cm4gbGRsX3BoeXMoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX21lbV93cml0ZWIodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsKQoreworICAgIGNoZWNrX3dhdGNocG9pbnQoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLLCB+MHgwLCBCUF9NRU1fV1JJVEUpOworICAgIHN0Yl9waHlzKGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX21lbV93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsKQoreworICAgIGNoZWNrX3dhdGNocG9pbnQoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLLCB+MHgxLCBCUF9NRU1fV1JJVEUpOworICAgIHN0d19waHlzKGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHdhdGNoX21lbV93cml0ZWwodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsKQoreworICAgIGNoZWNrX3dhdGNocG9pbnQoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLLCB+MHgzLCBCUF9NRU1fV1JJVEUpOworICAgIHN0bF9waHlzKGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqIGNvbnN0IHdhdGNoX21lbV9yZWFkWzNdID0geworICAgIHdhdGNoX21lbV9yZWFkYiwKKyAgICB3YXRjaF9tZW1fcmVhZHcsCisgICAgd2F0Y2hfbWVtX3JlYWRsLAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqIGNvbnN0IHdhdGNoX21lbV93cml0ZVszXSA9IHsKKyAgICB3YXRjaF9tZW1fd3JpdGViLAorICAgIHdhdGNoX21lbV93cml0ZXcsCisgICAgd2F0Y2hfbWVtX3dyaXRlbCwKK307CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc3VicGFnZV9yZWFkbGVuIChzdWJwYWdlX3QgKm1taW8sIGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1aW50MzJfdCByZXQ7CisgICAgdW5zaWduZWQgaW50IGlkeDsKKworICAgIGlkeCA9IFNVQlBBR0VfSURYKGFkZHIpOworI2lmIGRlZmluZWQoREVCVUdfU1VCUEFHRSkKKyAgICBwcmludGYoIiVzOiBzdWJwYWdlICVwIGxlbiAlZCBhZGRyICIgVEFSR0VUX0ZNVF9wbHggIiBpZHggJWRcbiIsIF9fZnVuY19fLAorICAgICAgICAgICBtbWlvLCBsZW4sIGFkZHIsIGlkeCk7CisjZW5kaWYKKyAgICByZXQgPSAoKiptbWlvLT5tZW1fcmVhZFtpZHhdW2xlbl0pKG1taW8tPm9wYXF1ZVtpZHhdWzBdW2xlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICsgbW1pby0+cmVnaW9uX29mZnNldFtpZHhdWzBdW2xlbl0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN1YnBhZ2Vfd3JpdGVsZW4gKHN1YnBhZ2VfdCAqbW1pbywgaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaWR4OworCisgICAgaWR4ID0gU1VCUEFHRV9JRFgoYWRkcik7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IHN1YnBhZ2UgJXAgbGVuICVkIGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIGlkeCAlZCB2YWx1ZSAlMDh4XG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgbW1pbywgbGVuLCBhZGRyLCBpZHgsIHZhbHVlKTsKKyNlbmRpZgorICAgICgqKm1taW8tPm1lbV93cml0ZVtpZHhdW2xlbl0pKG1taW8tPm9wYXF1ZVtpZHhdWzFdW2xlbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkciArIG1taW8tPnJlZ2lvbl9vZmZzZXRbaWR4XVsxXVtsZW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKK30KKworc3RhdGljIHVpbnQzMl90IHN1YnBhZ2VfcmVhZGIgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiXG4iLCBfX2Z1bmNfXywgYWRkcik7CisjZW5kaWYKKworICAgIHJldHVybiBzdWJwYWdlX3JlYWRsZW4ob3BhcXVlLCBhZGRyLCAwKTsKK30KKworc3RhdGljIHZvaWQgc3VicGFnZV93cml0ZWIgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAlMDh4XG4iLCBfX2Z1bmNfXywgYWRkciwgdmFsdWUpOworI2VuZGlmCisgICAgc3VicGFnZV93cml0ZWxlbihvcGFxdWUsIGFkZHIsIHZhbHVlLCAwKTsKK30KKworc3RhdGljIHVpbnQzMl90IHN1YnBhZ2VfcmVhZHcgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiXG4iLCBfX2Z1bmNfXywgYWRkcik7CisjZW5kaWYKKworICAgIHJldHVybiBzdWJwYWdlX3JlYWRsZW4ob3BhcXVlLCBhZGRyLCAxKTsKK30KKworc3RhdGljIHZvaWQgc3VicGFnZV93cml0ZXcgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAlMDh4XG4iLCBfX2Z1bmNfXywgYWRkciwgdmFsdWUpOworI2VuZGlmCisgICAgc3VicGFnZV93cml0ZWxlbihvcGFxdWUsIGFkZHIsIHZhbHVlLCAxKTsKK30KKworc3RhdGljIHVpbnQzMl90IHN1YnBhZ2VfcmVhZGwgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiXG4iLCBfX2Z1bmNfXywgYWRkcik7CisjZW5kaWYKKworICAgIHJldHVybiBzdWJwYWdlX3JlYWRsZW4ob3BhcXVlLCBhZGRyLCAyKTsKK30KKworc3RhdGljIHZvaWQgc3VicGFnZV93cml0ZWwgKHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgYWRkciwgdWludDMyX3QgdmFsdWUpCit7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAlMDh4XG4iLCBfX2Z1bmNfXywgYWRkciwgdmFsdWUpOworI2VuZGlmCisgICAgc3VicGFnZV93cml0ZWxlbihvcGFxdWUsIGFkZHIsIHZhbHVlLCAyKTsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICogY29uc3Qgc3VicGFnZV9yZWFkW10gPSB7CisgICAgJnN1YnBhZ2VfcmVhZGIsCisgICAgJnN1YnBhZ2VfcmVhZHcsCisgICAgJnN1YnBhZ2VfcmVhZGwsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICogY29uc3Qgc3VicGFnZV93cml0ZVtdID0geworICAgICZzdWJwYWdlX3dyaXRlYiwKKyAgICAmc3VicGFnZV93cml0ZXcsCisgICAgJnN1YnBhZ2Vfd3JpdGVsLAorfTsKKworc3RhdGljIGludCBzdWJwYWdlX3JlZ2lzdGVyIChzdWJwYWdlX3QgKm1taW8sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3QgbWVtb3J5LCByYW1fYWRkcl90IHJlZ2lvbl9vZmZzZXQpCit7CisgICAgaW50IGlkeCwgZWlkeDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIGlmIChzdGFydCA+PSBUQVJHRVRfUEFHRV9TSVpFIHx8IGVuZCA+PSBUQVJHRVRfUEFHRV9TSVpFKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWR4ID0gU1VCUEFHRV9JRFgoc3RhcnQpOworICAgIGVpZHggPSBTVUJQQUdFX0lEWChlbmQpOworI2lmIGRlZmluZWQoREVCVUdfU1VCUEFHRSkKKyAgICBwcmludGYoIiVzOiAlcCBzdGFydCAlMDh4IGVuZCAlMDh4IGlkeCAlMDh4IGVpZHggJTA4eCBtZW0gJWxkXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgbW1pbywgc3RhcnQsIGVuZCwgaWR4LCBlaWR4LCBtZW1vcnkpOworI2VuZGlmCisgICAgbWVtb3J5ID4+PSBJT19NRU1fU0hJRlQ7CisgICAgZm9yICg7IGlkeCA8PSBlaWR4OyBpZHgrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoX2lvX21lbV9yZWFkW21lbW9yeV1baV0pIHsKKyAgICAgICAgICAgICAgICBtbWlvLT5tZW1fcmVhZFtpZHhdW2ldID0gJl9pb19tZW1fcmVhZFttZW1vcnldW2ldOworICAgICAgICAgICAgICAgIG1taW8tPm9wYXF1ZVtpZHhdWzBdW2ldID0gaW9fbWVtX29wYXF1ZVttZW1vcnldOworICAgICAgICAgICAgICAgIG1taW8tPnJlZ2lvbl9vZmZzZXRbaWR4XVswXVtpXSA9IHJlZ2lvbl9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2lvX21lbV93cml0ZVttZW1vcnldW2ldKSB7CisgICAgICAgICAgICAgICAgbW1pby0+bWVtX3dyaXRlW2lkeF1baV0gPSAmX2lvX21lbV93cml0ZVttZW1vcnldW2ldOworICAgICAgICAgICAgICAgIG1taW8tPm9wYXF1ZVtpZHhdWzFdW2ldID0gaW9fbWVtX29wYXF1ZVttZW1vcnldOworICAgICAgICAgICAgICAgIG1taW8tPnJlZ2lvbl9vZmZzZXRbaWR4XVsxXVtpXSA9IHJlZ2lvbl9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKnN1YnBhZ2VfaW5pdCAoaHdhZGRyIGJhc2UsIHJhbV9hZGRyX3QgKnBoeXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IG9yaWdfbWVtb3J5LCByYW1fYWRkcl90IHJlZ2lvbl9vZmZzZXQpCit7CisgICAgc3VicGFnZV90ICptbWlvOworICAgIGludCBzdWJwYWdlX21lbW9yeTsKKworICAgIG1taW8gPSBnX21hbGxvYzAoc2l6ZW9mKHN1YnBhZ2VfdCkpOworCisgICAgbW1pby0+YmFzZSA9IGJhc2U7CisgICAgc3VicGFnZV9tZW1vcnkgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KHN1YnBhZ2VfcmVhZCwgc3VicGFnZV93cml0ZSwgbW1pbyk7CisjaWYgZGVmaW5lZChERUJVR19TVUJQQUdFKQorICAgIHByaW50ZigiJXM6ICVwIGJhc2UgIiBUQVJHRVRfRk1UX3BseCAiIGxlbiAlMDh4ICVkXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgbW1pbywgYmFzZSwgVEFSR0VUX1BBR0VfU0laRSwgc3VicGFnZV9tZW1vcnkpOworI2VuZGlmCisgICAgKnBoeXMgPSBzdWJwYWdlX21lbW9yeSB8IElPX01FTV9TVUJQQUdFOworICAgIHN1YnBhZ2VfcmVnaXN0ZXIobW1pbywgMCwgVEFSR0VUX1BBR0VfU0laRSAtIDEsIG9yaWdfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbl9vZmZzZXQpOworCisgICAgcmV0dXJuIG1taW87Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZWVfaW9fbWVtX2lkeCh2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaTxJT19NRU1fTkJfRU5UUklFUzsgaSsrKQorICAgICAgICBpZiAoIWlvX21lbV91c2VkW2ldKSB7CisgICAgICAgICAgICBpb19tZW1fdXNlZFtpXSA9IDE7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiUkFOIG91dCBvdXQgaW9fbWVtX2lkeCwgbWF4ICVkICFcbiIsIElPX01FTV9OQl9FTlRSSUVTKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIG1lbV9yZWFkIGFuZCBtZW1fd3JpdGUgYXJlIGFycmF5cyBvZiBmdW5jdGlvbnMgY29udGFpbmluZyB0aGUKKyAgIGZ1bmN0aW9uIHRvIGFjY2VzcyBieXRlIChpbmRleCAwKSwgd29yZCAoaW5kZXggMSkgYW5kIGR3b3JkIChpbmRleAorICAgMikuIEZ1bmN0aW9ucyBjYW4gYmUgb21pdHRlZCB3aXRoIGEgTlVMTCBmdW5jdGlvbiBwb2ludGVyLgorICAgSWYgaW9faW5kZXggaXMgbm9uIHplcm8sIHRoZSBjb3JyZXNwb25kaW5nIGlvIHpvbmUgaXMKKyAgIG1vZGlmaWVkLiBJZiBpdCBpcyB6ZXJvLCBhIG5ldyBpbyB6b25lIGlzIGFsbG9jYXRlZC4gVGhlIHJldHVybgorICAgdmFsdWUgY2FuIGJlIHVzZWQgd2l0aCBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KCkuICgtMSkgaXMKKyAgIHJldHVybmVkIGlmIGVycm9yLiAqLworc3RhdGljIGludCBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5X2ZpeGVkKGludCBpb19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVSZWFkTWVtb3J5RnVuYyAqIGNvbnN0ICptZW1fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVXcml0ZU1lbW9yeUZ1bmMgKiBjb25zdCAqbWVtX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpbnQgaSwgc3Vid2lkdGggPSAwOworCisgICAgaWYgKGlvX2luZGV4IDw9IDApIHsKKyAgICAgICAgaW9faW5kZXggPSBnZXRfZnJlZV9pb19tZW1faWR4KCk7CisgICAgICAgIGlmIChpb19pbmRleCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBpb19pbmRleDsKKyAgICB9IGVsc2UgeworICAgICAgICBpb19pbmRleCA+Pj0gSU9fTUVNX1NISUZUOworICAgICAgICBpZiAoaW9faW5kZXggPj0gSU9fTUVNX05CX0VOVFJJRVMpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yKGkgPSAwO2kgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKCFtZW1fcmVhZFtpXSB8fCAhbWVtX3dyaXRlW2ldKQorICAgICAgICAgICAgc3Vid2lkdGggPSBJT19NRU1fU1VCV0lEVEg7CisgICAgICAgIF9pb19tZW1fcmVhZFtpb19pbmRleF1baV0gPSBtZW1fcmVhZFtpXTsKKyAgICAgICAgX2lvX21lbV93cml0ZVtpb19pbmRleF1baV0gPSBtZW1fd3JpdGVbaV07CisgICAgfQorICAgIGlvX21lbV9vcGFxdWVbaW9faW5kZXhdID0gb3BhcXVlOworICAgIHJldHVybiAoaW9faW5kZXggPDwgSU9fTUVNX1NISUZUKSB8IHN1YndpZHRoOworfQorCitpbnQgY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShDUFVSZWFkTWVtb3J5RnVuYyAqIGNvbnN0ICptZW1fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVVdyaXRlTWVtb3J5RnVuYyAqIGNvbnN0ICptZW1fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgcmV0dXJuIGNwdV9yZWdpc3Rlcl9pb19tZW1vcnlfZml4ZWQoMCwgbWVtX3JlYWQsIG1lbV93cml0ZSwgb3BhcXVlKTsKK30KKwordm9pZCBjcHVfdW5yZWdpc3Rlcl9pb19tZW1vcnkoaW50IGlvX3RhYmxlX2FkZHJlc3MpCit7CisgICAgaW50IGk7CisgICAgaW50IGlvX2luZGV4ID0gaW9fdGFibGVfYWRkcmVzcyA+PiBJT19NRU1fU0hJRlQ7CisKKyAgICBmb3IgKGk9MDtpIDwgMzsgaSsrKSB7CisgICAgICAgIF9pb19tZW1fcmVhZFtpb19pbmRleF1baV0gPSB1bmFzc2lnbmVkX21lbV9yZWFkW2ldOworICAgICAgICBfaW9fbWVtX3dyaXRlW2lvX2luZGV4XVtpXSA9IHVuYXNzaWduZWRfbWVtX3dyaXRlW2ldOworICAgIH0KKyAgICBpb19tZW1fb3BhcXVlW2lvX2luZGV4XSA9IE5VTEw7CisgICAgaW9fbWVtX3VzZWRbaW9faW5kZXhdID0gMDsKK30KKworc3RhdGljIHZvaWQgaW9fbWVtX2luaXQodm9pZCkKK3sKKyAgICBpbnQgaTsKKworICAgIGNwdV9yZWdpc3Rlcl9pb19tZW1vcnlfZml4ZWQoSU9fTUVNX1JPTSwgZXJyb3JfbWVtX3JlYWQsIHVuYXNzaWduZWRfbWVtX3dyaXRlLCBOVUxMKTsKKyAgICBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5X2ZpeGVkKElPX01FTV9VTkFTU0lHTkVELCB1bmFzc2lnbmVkX21lbV9yZWFkLCB1bmFzc2lnbmVkX21lbV93cml0ZSwgTlVMTCk7CisgICAgY3B1X3JlZ2lzdGVyX2lvX21lbW9yeV9maXhlZChJT19NRU1fTk9URElSVFksIGVycm9yX21lbV9yZWFkLCBub3RkaXJ0eV9tZW1fd3JpdGUsIE5VTEwpOworICAgIGZvciAoaT0wOyBpPDU7IGkrKykKKyAgICAgICAgaW9fbWVtX3VzZWRbaV0gPSAxOworCisgICAgaW9fbWVtX3dhdGNoID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeSh3YXRjaF9tZW1fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoX21lbV93cml0ZSwgTlVMTCk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKSAqLworCisvKiBwaHlzaWNhbCBtZW1vcnkgYWNjZXNzIChzbG93IHZlcnNpb24sIG1haW5seSBmb3IgZGVidWcpICovCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQordm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KGh3YWRkciBhZGRyLCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGlzX3dyaXRlKQoreworICAgIGludCBsLCBmbGFnczsKKyAgICB0YXJnZXRfdWxvbmcgcGFnZTsKKyAgICB2b2lkICogcDsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHBhZ2UgPSBhZGRyICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgbCA9IChwYWdlICsgVEFSR0VUX1BBR0VfU0laRSkgLSBhZGRyOworICAgICAgICBpZiAobCA+IGxlbikKKyAgICAgICAgICAgIGwgPSBsZW47CisgICAgICAgIGZsYWdzID0gcGFnZV9nZXRfZmxhZ3MocGFnZSk7CisgICAgICAgIGlmICghKGZsYWdzICYgUEFHRV9WQUxJRCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChpc193cml0ZSkgeworICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBQQUdFX1dSSVRFKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAvKiBYWFg6IHRoaXMgY29kZSBzaG91bGQgbm90IGRlcGVuZCBvbiBsb2NrX3VzZXIgKi8KKyAgICAgICAgICAgIGlmICghKHAgPSBsb2NrX3VzZXIoVkVSSUZZX1dSSVRFLCBhZGRyLCBsLCAwKSkpCisgICAgICAgICAgICAgICAgLyogRklYTUUgLSBzaG91bGQgdGhpcyByZXR1cm4gYW4gZXJyb3IgcmF0aGVyIHRoYW4ganVzdCBmYWlsPyAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1lbWNweShwLCBidWYsIGwpOworICAgICAgICAgICAgdW5sb2NrX3VzZXIocCwgYWRkciwgbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShmbGFncyAmIFBBR0VfUkVBRCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLyogWFhYOiB0aGlzIGNvZGUgc2hvdWxkIG5vdCBkZXBlbmQgb24gbG9ja191c2VyICovCisgICAgICAgICAgICBpZiAoIShwID0gbG9ja191c2VyKFZFUklGWV9SRUFELCBhZGRyLCBsLCAxKSkpCisgICAgICAgICAgICAgICAgLyogRklYTUUgLSBzaG91bGQgdGhpcyByZXR1cm4gYW4gZXJyb3IgcmF0aGVyIHRoYW4ganVzdCBmYWlsPyAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1lbWNweShidWYsIHAsIGwpOworICAgICAgICAgICAgdW5sb2NrX3VzZXIocCwgYWRkciwgMCk7CisgICAgICAgIH0KKyAgICAgICAgbGVuIC09IGw7CisgICAgICAgIGJ1ZiArPSBsOworICAgICAgICBhZGRyICs9IGw7CisgICAgfQorfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2FuZF9zZXRfZGlydHkoaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIGxlbmd0aCkKK3sKKyAgICBpZiAoY3B1X3BoeXNpY2FsX21lbW9yeV9pc19jbGVhbihhZGRyKSkgeworICAgICAgICAvKiBpbnZhbGlkYXRlIGNvZGUgKi8KKyAgICAgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfcmFuZ2UoYWRkciwgYWRkciArIGxlbmd0aCwgMCk7CisgICAgICAgIC8qIHNldCBkaXJ0eSBiaXQgKi8KKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhhZGRyLCBESVJUWV9NRU1PUllfVkdBKTsKKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhhZGRyLCBESVJUWV9NRU1PUllfTUlHUkFUSU9OKTsKKyAgICB9Cit9CisKK3ZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV9ydyhod2FkZHIgYWRkciwgdm9pZCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBpc193cml0ZSkKK3sKKyAgICBpbnQgbCwgaW9faW5kZXg7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQzMl90IHZhbDsKKyAgICBod2FkZHIgcGFnZTsKKyAgICByYW1fYWRkcl90IHBkOworICAgIHVpbnQ4X3QqIGJ1ZjggPSAodWludDhfdCopYnVmOworICAgIFBoeXNQYWdlRGVzYyAqcDsKKworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHBhZ2UgPSBhZGRyICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgbCA9IChwYWdlICsgVEFSR0VUX1BBR0VfU0laRSkgLSBhZGRyOworICAgICAgICBpZiAobCA+IGxlbikKKyAgICAgICAgICAgIGwgPSBsZW47CisgICAgICAgIHAgPSBwaHlzX3BhZ2VfZmluZChwYWdlID4+IFRBUkdFVF9QQUdFX0JJVFMpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzX3dyaXRlKSB7CisgICAgICAgICAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spICE9IElPX01FTV9SQU0pIHsKKyAgICAgICAgICAgICAgICBod2FkZHIgYWRkcjEgPSBhZGRyOworICAgICAgICAgICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkgJiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgICAgICAgYWRkcjEgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgLyogWFhYOiBjb3VsZCBmb3JjZSBjcHVfc2luZ2xlX2VudiB0byBOVUxMIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsIGJ1Z3MgKi8KKyAgICAgICAgICAgICAgICBpZiAobCA+PSA0ICYmICgoYWRkcjEgJiAzKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgd3JpdGUgYWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGxkbF9wKGJ1ZjgpOworICAgICAgICAgICAgICAgICAgICBpb19tZW1fd3JpdGUoaW9faW5kZXgsIGFkZHIxLCB2YWwsIDQpOworICAgICAgICAgICAgICAgICAgICBsID0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGwgPj0gMiAmJiAoKGFkZHIxICYgMSkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogMTYgYml0IHdyaXRlIGFjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICB2YWwgPSBsZHV3X3AoYnVmOCk7CisgICAgICAgICAgICAgICAgICAgIGlvX21lbV93cml0ZShpb19pbmRleCwgYWRkcjEsIHZhbCwgMik7CisgICAgICAgICAgICAgICAgICAgIGwgPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIDggYml0IHdyaXRlIGFjY2VzcyAqLworICAgICAgICAgICAgICAgICAgICB2YWwgPSBsZHViX3AoYnVmOCk7CisgICAgICAgICAgICAgICAgICAgIGlvX21lbV93cml0ZShpb19pbmRleCwgYWRkcjEsIHZhbCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGwgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBhZGRyMTsKKyAgICAgICAgICAgICAgICBhZGRyMSA9IChwZCAmIFRBUkdFVF9QQUdFX01BU0spICsgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgICAgICAgICAgLyogUkFNIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKGFkZHIxKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocHRyLCBidWY4LCBsKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX2FuZF9zZXRfZGlydHkoYWRkcjEsIGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSA+IElPX01FTV9ST00gJiYKKyAgICAgICAgICAgICAgICAhKHBkICYgSU9fTUVNX1JPTUQpKSB7CisgICAgICAgICAgICAgICAgaHdhZGRyIGFkZHIxID0gYWRkcjsKKyAgICAgICAgICAgICAgICAvKiBJL08gY2FzZSAqLworICAgICAgICAgICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkgJiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgICAgICAgYWRkcjEgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGwgPj0gNCAmJiAoKGFkZHIxICYgMykgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogMzIgYml0IHJlYWQgYWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGlvX21lbV9yZWFkKGlvX2luZGV4LCBhZGRyMSwgNCk7CisgICAgICAgICAgICAgICAgICAgIHN0bF9wKGJ1ZjgsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGwgPSA0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobCA+PSAyICYmICgoYWRkcjEgJiAxKSA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiAxNiBiaXQgcmVhZCBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gaW9fbWVtX3JlYWQoaW9faW5kZXgsIGFkZHIxLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgc3R3X3AoYnVmOCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgbCA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogOCBiaXQgcmVhZCBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgdmFsID0gaW9fbWVtX3JlYWQoaW9faW5kZXgsIGFkZHIxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc3RiX3AoYnVmOCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgbCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBSQU0gY2FzZSAqLworICAgICAgICAgICAgICAgIHB0ciA9IHFlbXVfZ2V0X3JhbV9wdHIocGQgJiBUQVJHRVRfUEFHRV9NQVNLKSArCisgICAgICAgICAgICAgICAgICAgIChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spOworICAgICAgICAgICAgICAgIG1lbWNweShidWY4LCBwdHIsIGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxlbiAtPSBsOworICAgICAgICBidWY4ICs9IGw7CisgICAgICAgIGFkZHIgKz0gbDsKKyAgICB9Cit9CisKKy8qIHVzZWQgZm9yIFJPTSBsb2FkaW5nIDogY2FuIHdyaXRlIGluIFJBTSBhbmQgUk9NICovCit2b2lkIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisgICAgaW50IGw7CisgICAgdWludDhfdCAqcHRyOworICAgIGh3YWRkciBwYWdlOworICAgIHVuc2lnbmVkIGxvbmcgcGQ7CisgICAgY29uc3QgdWludDhfdCogYnVmOCA9IChjb25zdCB1aW50OF90KilidWY7CisgICAgUGh5c1BhZ2VEZXNjICpwOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgcGFnZSA9IGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLOworICAgICAgICBsID0gKHBhZ2UgKyBUQVJHRVRfUEFHRV9TSVpFKSAtIGFkZHI7CisgICAgICAgIGlmIChsID4gbGVuKQorICAgICAgICAgICAgbCA9IGxlbjsKKyAgICAgICAgcCA9IHBoeXNfcGFnZV9maW5kKHBhZ2UgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBkID0gcC0+cGh5c19vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spICE9IElPX01FTV9SQU0gJiYKKyAgICAgICAgICAgIChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSAhPSBJT19NRU1fUk9NICYmCisgICAgICAgICAgICAhKHBkICYgSU9fTUVNX1JPTUQpKSB7CisgICAgICAgICAgICAvKiBkbyBub3RoaW5nICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIxOworICAgICAgICAgICAgYWRkcjEgPSAocGQgJiBUQVJHRVRfUEFHRV9NQVNLKSArIChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spOworICAgICAgICAgICAgLyogUk9NL1JBTSBjYXNlICovCisgICAgICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKGFkZHIxKTsKKyAgICAgICAgICAgIG1lbWNweShwdHIsIGJ1ZjgsIGwpOworICAgICAgICAgICAgaW52YWxpZGF0ZV9hbmRfc2V0X2RpcnR5KGFkZHIxLCBsKTsKKyAgICAgICAgfQorICAgICAgICBsZW4gLT0gbDsKKyAgICAgICAgYnVmOCArPSBsOworICAgICAgICBhZGRyICs9IGw7CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqYnVmZmVyOworICAgIGh3YWRkciBhZGRyOworICAgIGh3YWRkciBsZW47Cit9IEJvdW5jZUJ1ZmZlcjsKKworc3RhdGljIEJvdW5jZUJ1ZmZlciBib3VuY2U7CisKK3R5cGVkZWYgc3RydWN0IE1hcENsaWVudCB7CisgICAgdm9pZCAqb3BhcXVlOworICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqb3BhcXVlKTsKKyAgICBRTElTVF9FTlRSWShNYXBDbGllbnQpIGxpbms7Cit9IE1hcENsaWVudDsKKworc3RhdGljIFFMSVNUX0hFQUQobWFwX2NsaWVudF9saXN0LCBNYXBDbGllbnQpIG1hcF9jbGllbnRfbGlzdAorICAgID0gUUxJU1RfSEVBRF9JTklUSUFMSVpFUihtYXBfY2xpZW50X2xpc3QpOworCit2b2lkICpjcHVfcmVnaXN0ZXJfbWFwX2NsaWVudCh2b2lkICpvcGFxdWUsIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqb3BhcXVlKSkKK3sKKyAgICBNYXBDbGllbnQgKmNsaWVudCA9IGdfbWFsbG9jKHNpemVvZigqY2xpZW50KSk7CisKKyAgICBjbGllbnQtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICBjbGllbnQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgUUxJU1RfSU5TRVJUX0hFQUQoJm1hcF9jbGllbnRfbGlzdCwgY2xpZW50LCBsaW5rKTsKKyAgICByZXR1cm4gY2xpZW50OworfQorCitzdGF0aWMgdm9pZCBjcHVfdW5yZWdpc3Rlcl9tYXBfY2xpZW50KHZvaWQgKl9jbGllbnQpCit7CisgICAgTWFwQ2xpZW50ICpjbGllbnQgPSAoTWFwQ2xpZW50ICopX2NsaWVudDsKKworICAgIFFMSVNUX1JFTU9WRShjbGllbnQsIGxpbmspOworICAgIGdfZnJlZShjbGllbnQpOworfQorCitzdGF0aWMgdm9pZCBjcHVfbm90aWZ5X21hcF9jbGllbnRzKHZvaWQpCit7CisgICAgTWFwQ2xpZW50ICpjbGllbnQ7CisKKyAgICB3aGlsZSAoIVFMSVNUX0VNUFRZKCZtYXBfY2xpZW50X2xpc3QpKSB7CisgICAgICAgIGNsaWVudCA9IFFMSVNUX0ZJUlNUKCZtYXBfY2xpZW50X2xpc3QpOworICAgICAgICBjbGllbnQtPmNhbGxiYWNrKGNsaWVudC0+b3BhcXVlKTsKKyAgICAgICAgY3B1X3VucmVnaXN0ZXJfbWFwX2NsaWVudChjbGllbnQpOworICAgIH0KK30KKworLyogTWFwIGEgcGh5c2ljYWwgbWVtb3J5IHJlZ2lvbiBpbnRvIGEgaG9zdCB2aXJ0dWFsIGFkZHJlc3MuCisgKiBNYXkgbWFwIGEgc3Vic2V0IG9mIHRoZSByZXF1ZXN0ZWQgcmFuZ2UsIGdpdmVuIGJ5IGFuZCByZXR1cm5lZCBpbiAqcGxlbi4KKyAqIE1heSByZXR1cm4gTlVMTCBpZiByZXNvdXJjZXMgbmVlZGVkIHRvIHBlcmZvcm0gdGhlIG1hcHBpbmcgYXJlIGV4aGF1c3RlZC4KKyAqIFVzZSBvbmx5IGZvciByZWFkcyBPUiB3cml0ZXMgLSBub3QgZm9yIHJlYWQtbW9kaWZ5LXdyaXRlIG9wZXJhdGlvbnMuCisgKiBVc2UgY3B1X3JlZ2lzdGVyX21hcF9jbGllbnQoKSB0byBrbm93IHdoZW4gcmV0cnlpbmcgdGhlIG1hcCBvcGVyYXRpb24gaXMKKyAqIGxpa2VseSB0byBzdWNjZWVkLgorICovCit2b2lkICpjcHVfcGh5c2ljYWxfbWVtb3J5X21hcChod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciAqcGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc193cml0ZSkKK3sKKyAgICBod2FkZHIgbGVuID0gKnBsZW47CisgICAgaHdhZGRyIGRvbmUgPSAwOworICAgIGludCBsOworICAgIHVpbnQ4X3QgKnJldCA9IE5VTEw7CisgICAgdWludDhfdCAqcHRyOworICAgIGh3YWRkciBwYWdlOworICAgIHVuc2lnbmVkIGxvbmcgcGQ7CisgICAgUGh5c1BhZ2VEZXNjICpwOworICAgIHVuc2lnbmVkIGxvbmcgYWRkcjE7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBwYWdlID0gYWRkciAmIFRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgIGwgPSAocGFnZSArIFRBUkdFVF9QQUdFX1NJWkUpIC0gYWRkcjsKKyAgICAgICAgaWYgKGwgPiBsZW4pCisgICAgICAgICAgICBsID0gbGVuOworICAgICAgICBwID0gcGh5c19wYWdlX2ZpbmQocGFnZSA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICBwZCA9IElPX01FTV9VTkFTU0lHTkVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgIT0gSU9fTUVNX1JBTSkgeworICAgICAgICAgICAgaWYgKGRvbmUgfHwgYm91bmNlLmJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm91bmNlLmJ1ZmZlciA9IHFlbXVfbWVtYWxpZ24oVEFSR0VUX1BBR0VfU0laRSwgVEFSR0VUX1BBR0VfU0laRSk7CisgICAgICAgICAgICBib3VuY2UuYWRkciA9IGFkZHI7CisgICAgICAgICAgICBib3VuY2UubGVuID0gbDsKKyAgICAgICAgICAgIGlmICghaXNfd3JpdGUpIHsKKyAgICAgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoYWRkciwgYm91bmNlLmJ1ZmZlciwgbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHIgPSBib3VuY2UuYnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcjEgPSAocGQgJiBUQVJHRVRfUEFHRV9NQVNLKSArIChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spOworICAgICAgICAgICAgcHRyID0gcWVtdV9nZXRfcmFtX3B0cihhZGRyMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkb25lKSB7CisgICAgICAgICAgICByZXQgPSBwdHI7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ICsgZG9uZSAhPSBwdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbGVuIC09IGw7CisgICAgICAgIGFkZHIgKz0gbDsKKyAgICAgICAgZG9uZSArPSBsOworICAgIH0KKyAgICAqcGxlbiA9IGRvbmU7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogVW5tYXBzIGEgbWVtb3J5IHJlZ2lvbiBwcmV2aW91c2x5IG1hcHBlZCBieSBjcHVfcGh5c2ljYWxfbWVtb3J5X21hcCgpLgorICogV2lsbCBhbHNvIG1hcmsgdGhlIG1lbW9yeSBhcyBkaXJ0eSBpZiBpc193cml0ZSA9PSAxLiAgYWNjZXNzX2xlbiBnaXZlcworICogdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCB3YXMgYWN0dWFsbHkgcmVhZCBvciB3cml0dGVuIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3ZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV91bm1hcCh2b2lkICpidWZmZXIsIGh3YWRkciBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3dyaXRlLCBod2FkZHIgYWNjZXNzX2xlbikKK3sKKyAgICBpZiAoYnVmZmVyICE9IGJvdW5jZS5idWZmZXIpIHsKKyAgICAgICAgaWYgKGlzX3dyaXRlKSB7CisgICAgICAgICAgICByYW1fYWRkcl90IGFkZHIxID0gcWVtdV9yYW1fYWRkcl9mcm9tX2hvc3Rfbm9mYWlsKGJ1ZmZlcik7CisgICAgICAgICAgICB3aGlsZSAoYWNjZXNzX2xlbikgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGw7CisgICAgICAgICAgICAgICAgbCA9IFRBUkdFVF9QQUdFX1NJWkU7CisgICAgICAgICAgICAgICAgaWYgKGwgPiBhY2Nlc3NfbGVuKQorICAgICAgICAgICAgICAgICAgICBsID0gYWNjZXNzX2xlbjsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlX2FuZF9zZXRfZGlydHkoYWRkcjEsIGwpOworICAgICAgICAgICAgICAgIGFkZHIxICs9IGw7CisgICAgICAgICAgICAgICAgYWNjZXNzX2xlbiAtPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzX3dyaXRlKSB7CisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUoYm91bmNlLmFkZHIsIGJvdW5jZS5idWZmZXIsIGFjY2Vzc19sZW4pOworICAgIH0KKyAgICBxZW11X3ZmcmVlKGJvdW5jZS5idWZmZXIpOworICAgIGJvdW5jZS5idWZmZXIgPSBOVUxMOworICAgIGNwdV9ub3RpZnlfbWFwX2NsaWVudHMoKTsKK30KKworLyogd2FybmluZzogYWRkciBtdXN0IGJlIGFsaWduZWQgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbGRsX3BoeXNfaW50ZXJuYWwoaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZGV2aWNlX2VuZGlhbiBlbmRpYW4pCit7CisgICAgaW50IGlvX2luZGV4OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBwZDsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICB9IGVsc2UgeworICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgIH0KKworICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPiBJT19NRU1fUk9NICYmCisgICAgICAgICEocGQgJiBJT19NRU1fUk9NRCkpIHsKKyAgICAgICAgLyogSS9PIGNhc2UgKi8KKyAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGFkZHIgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisgICAgICAgIHZhbCA9IGlvX21lbV9yZWFkKGlvX2luZGV4LCBhZGRyLCA0KTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCisgICAgICAgIGlmIChlbmRpYW4gPT0gREVWSUNFX0xJVFRMRV9FTkRJQU4pIHsKKyAgICAgICAgICAgIHZhbCA9IGJzd2FwMzIodmFsKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKGVuZGlhbiA9PSBERVZJQ0VfQklHX0VORElBTikgeworICAgICAgICAgICAgdmFsID0gYnN3YXAzMih2YWwpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSQU0gY2FzZSAqLworICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKHBkICYgVEFSR0VUX1BBR0VfTUFTSykgKworICAgICAgICAgICAgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIHN3aXRjaCAoZW5kaWFuKSB7CisgICAgICAgICAgICBjYXNlIERFVklDRV9MSVRUTEVfRU5ESUFOOgorICAgICAgICAgICAgICAgIHZhbCA9IGxkbF9sZV9wKHB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERFVklDRV9CSUdfRU5ESUFOOgorICAgICAgICAgICAgICAgIHZhbCA9IGxkbF9iZV9wKHB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHZhbCA9IGxkbF9wKHB0cik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDMyX3QgbGRsX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkbF9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9OQVRJVkVfRU5ESUFOKTsKK30KKwordWludDMyX3QgbGRsX2xlX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkbF9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9MSVRUTEVfRU5ESUFOKTsKK30KKwordWludDMyX3QgbGRsX2JlX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkbF9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9CSUdfRU5ESUFOKTsKK30KKworLyogd2FybmluZzogYWRkciBtdXN0IGJlIGFsaWduZWQgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgbGRxX3BoeXNfaW50ZXJuYWwoaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZGV2aWNlX2VuZGlhbiBlbmRpYW4pCit7CisgICAgaW50IGlvX2luZGV4OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50NjRfdCB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBwZDsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICB9IGVsc2UgeworICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgIH0KKworICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPiBJT19NRU1fUk9NICYmCisgICAgICAgICEocGQgJiBJT19NRU1fUk9NRCkpIHsKKyAgICAgICAgLyogSS9PIGNhc2UgKi8KKyAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGFkZHIgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisKKyAgICAgICAgLyogWFhYIFRoaXMgaXMgYnJva2VuIHdoZW4gZGV2aWNlIGVuZGlhbiAhPSBjcHUgZW5kaWFuLgorICAgICAgICAgICAgICAgRml4IGFuZCBhZGQgImVuZGlhbiIgdmFyaWFibGUgY2hlY2sgKi8KKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgICAgIHZhbCA9ICh1aW50NjRfdClpb19tZW1fcmVhZChpb19pbmRleCwgYWRkciwgNCkgPDwgMzI7CisgICAgICAgIHZhbCB8PSBpb19tZW1fcmVhZChpb19pbmRleCwgYWRkciArIDQsIDQpOworI2Vsc2UKKyAgICAgICAgdmFsID0gaW9fbWVtX3JlYWQoaW9faW5kZXgsIGFkZHIsIDQpOworICAgICAgICB2YWwgfD0gKHVpbnQ2NF90KWlvX21lbV9yZWFkKGlvX2luZGV4LCBhZGRyICsgNCwgNCkgPDwgMzI7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSQU0gY2FzZSAqLworICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKHBkICYgVEFSR0VUX1BBR0VfTUFTSykgKworICAgICAgICAgICAgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIHN3aXRjaCAoZW5kaWFuKSB7CisgICAgICAgIGNhc2UgREVWSUNFX0xJVFRMRV9FTkRJQU46CisgICAgICAgICAgICB2YWwgPSBsZHFfbGVfcChwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREVWSUNFX0JJR19FTkRJQU46CisgICAgICAgICAgICB2YWwgPSBsZHFfYmVfcChwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YWwgPSBsZHFfcChwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDY0X3QgbGRxX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkcV9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9OQVRJVkVfRU5ESUFOKTsKK30KKwordWludDY0X3QgbGRxX2xlX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkcV9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9MSVRUTEVfRU5ESUFOKTsKK30KKwordWludDY0X3QgbGRxX2JlX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkcV9waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9CSUdfRU5ESUFOKTsKK30KKworLyogWFhYOiBvcHRpbWl6ZSAqLwordWludDMyX3QgbGR1Yl9waHlzKGh3YWRkciBhZGRyKQoreworICAgIHVpbnQ4X3QgdmFsOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChhZGRyLCAmdmFsLCAxKTsKKyAgICByZXR1cm4gdmFsOworfQorCisvKiBYWFg6IG9wdGltaXplICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGxkdXdfcGh5c19pbnRlcm5hbChod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZGV2aWNlX2VuZGlhbiBlbmRpYW4pCit7CisgICAgaW50IGlvX2luZGV4OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50NjRfdCB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBwZDsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICB9IGVsc2UgeworICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgIH0KKworICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPiBJT19NRU1fUk9NICYmCisgICAgICAgICEocGQgJiBJT19NRU1fUk9NRCkpIHsKKyAgICAgICAgLyogSS9PIGNhc2UgKi8KKyAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGFkZHIgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisgICAgICAgIHZhbCA9IGlvX21lbV9yZWFkKGlvX2luZGV4LCBhZGRyLCAyKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCisgICAgICAgIGlmIChlbmRpYW4gPT0gREVWSUNFX0xJVFRMRV9FTkRJQU4pIHsKKyAgICAgICAgICAgIHZhbCA9IGJzd2FwMTYodmFsKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKGVuZGlhbiA9PSBERVZJQ0VfQklHX0VORElBTikgeworICAgICAgICAgICAgdmFsID0gYnN3YXAxNih2YWwpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSQU0gY2FzZSAqLworICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKHBkICYgVEFSR0VUX1BBR0VfTUFTSykgKworICAgICAgICAgICAgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIHN3aXRjaCAoZW5kaWFuKSB7CisgICAgICAgIGNhc2UgREVWSUNFX0xJVFRMRV9FTkRJQU46CisgICAgICAgICAgICB2YWwgPSBsZHV3X2xlX3AocHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFVklDRV9CSUdfRU5ESUFOOgorICAgICAgICAgICAgdmFsID0gbGR1d19iZV9wKHB0cik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbCA9IGxkdXdfcChwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDMyX3QgbGR1d19waHlzKGh3YWRkciBhZGRyKQoreworICAgIHJldHVybiBsZHV3X3BoeXNfaW50ZXJuYWwoYWRkciwgREVWSUNFX05BVElWRV9FTkRJQU4pOworfQorCit1aW50MzJfdCBsZHV3X2xlX3BoeXMoaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIGxkdXdfcGh5c19pbnRlcm5hbChhZGRyLCBERVZJQ0VfTElUVExFX0VORElBTik7Cit9CisKK3VpbnQzMl90IGxkdXdfYmVfcGh5cyhod2FkZHIgYWRkcikKK3sKKyAgICByZXR1cm4gbGR1d19waHlzX2ludGVybmFsKGFkZHIsIERFVklDRV9CSUdfRU5ESUFOKTsKK30KKworLyogd2FybmluZzogYWRkciBtdXN0IGJlIGFsaWduZWQuIFRoZSByYW0gcGFnZSBpcyBub3QgbWFza2VkIGFzIGRpcnR5CisgICBhbmQgdGhlIGNvZGUgaW5zaWRlIGlzIG5vdCBpbnZhbGlkYXRlZC4gSXQgaXMgdXNlZnVsIGlmIHRoZSBkaXJ0eQorICAgYml0cyBhcmUgdXNlZCB0byB0cmFjayBtb2RpZmllZCBQVEVzICovCit2b2lkIHN0bF9waHlzX25vdGRpcnR5KGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IGlvX2luZGV4OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1bnNpZ25lZCBsb25nIHBkOworICAgIFBoeXNQYWdlRGVzYyAqcDsKKworICAgIHAgPSBwaHlzX3BhZ2VfZmluZChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpOworICAgIGlmICghcCkgeworICAgICAgICBwZCA9IElPX01FTV9VTkFTU0lHTkVEOworICAgIH0gZWxzZSB7CisgICAgICAgIHBkID0gcC0+cGh5c19vZmZzZXQ7CisgICAgfQorCisgICAgaWYgKChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSAhPSBJT19NRU1fUkFNKSB7CisgICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkgJiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBhZGRyID0gKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykgKyBwLT5yZWdpb25fb2Zmc2V0OworICAgICAgICBpb19tZW1fd3JpdGUoaW9faW5kZXgsIGFkZHIsIHZhbCwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyMSA9IChwZCAmIFRBUkdFVF9QQUdFX01BU0spICsgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIHB0ciA9IHFlbXVfZ2V0X3JhbV9wdHIoYWRkcjEpOworICAgICAgICBzdGxfcChwdHIsIHZhbCk7CisKKyAgICAgICAgaWYgKHVubGlrZWx5KGluX21pZ3JhdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChjcHVfcGh5c2ljYWxfbWVtb3J5X2lzX2NsZWFuKGFkZHIxKSkgeworICAgICAgICAgICAgICAgIC8qIGludmFsaWRhdGUgY29kZSAqLworICAgICAgICAgICAgICAgIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX3JhbmdlKGFkZHIxLCBhZGRyMSArIDQsIDApOworICAgICAgICAgICAgICAgIC8qIHNldCBkaXJ0eSBiaXQgKi8KKyAgICAgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3NldF9kaXJ0eV9mbGFnKGFkZHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX01JR1JBVElPTik7CisgICAgICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfZmxhZyhhZGRyMSwgRElSVFlfTUVNT1JZX1ZHQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgc3RxX3BoeXNfbm90ZGlydHkoaHdhZGRyIGFkZHIsIHVpbnQ2NF90IHZhbCkKK3sKKyAgICBpbnQgaW9faW5kZXg7CisgICAgdWludDhfdCAqcHRyOworICAgIHVuc2lnbmVkIGxvbmcgcGQ7CisgICAgUGh5c1BhZ2VEZXNjICpwOworCisgICAgcCA9IHBoeXNfcGFnZV9maW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICB9CisKKyAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spICE9IElPX01FTV9SQU0pIHsKKyAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGFkZHIgPSAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIHAtPnJlZ2lvbl9vZmZzZXQ7CisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgICAgICBpb19tZW1fd3JpdGUoaW9faW5kZXgsIGFkZHIsIHZhbCA+PiAzMiwgNCk7CisgICAgICAgIGlvX21lbV93cml0ZShpb19pbmRleCwgYWRkciArIDQsIHZhbCwgNCk7CisjZWxzZQorICAgICAgICBpb19tZW1fd3JpdGUoaW9faW5kZXgsIGFkZHIsIHZhbCwgNCk7CisgICAgICAgIGlvX21lbV93cml0ZShpb19pbmRleCwgYWRkciArIDQsIHZhbCA+PiAzMiwgNCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKHBkICYgVEFSR0VUX1BBR0VfTUFTSykgKworICAgICAgICAgICAgKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIHN0cV9wKHB0ciwgdmFsKTsKKyAgICB9Cit9CisKKy8qIHdhcm5pbmc6IGFkZHIgbXVzdCBiZSBhbGlnbmVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RsX3BoeXNfaW50ZXJuYWwoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGRldmljZV9lbmRpYW4gZW5kaWFuKQoreworICAgIGludCBpb19pbmRleDsKKyAgICB1aW50OF90ICpwdHI7CisgICAgdW5zaWduZWQgbG9uZyBwZDsKKyAgICBQaHlzUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICB9IGVsc2UgeworICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgIH0KKworICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgIT0gSU9fTUVNX1JBTSkgeworICAgICAgICBpb19pbmRleCA9IChwZCA+PiBJT19NRU1fU0hJRlQpICYgKElPX01FTV9OQl9FTlRSSUVTIC0gMSk7CisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgYWRkciA9IChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsgcC0+cmVnaW9uX29mZnNldDsKKyNpZiBkZWZpbmVkKFRBUkdFVF9XT1JEU19CSUdFTkRJQU4pCisgICAgICAgIGlmIChlbmRpYW4gPT0gREVWSUNFX0xJVFRMRV9FTkRJQU4pIHsKKyAgICAgICAgICAgIHZhbCA9IGJzd2FwMzIodmFsKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKGVuZGlhbiA9PSBERVZJQ0VfQklHX0VORElBTikgeworICAgICAgICAgICAgdmFsID0gYnN3YXAzMih2YWwpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaW9fbWVtX3dyaXRlKGlvX2luZGV4LCBhZGRyLCB2YWwsIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcjE7CisgICAgICAgIGFkZHIxID0gKHBkICYgVEFSR0VUX1BBR0VfTUFTSykgKyAoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKTsKKyAgICAgICAgLyogUkFNIGNhc2UgKi8KKyAgICAgICAgcHRyID0gcWVtdV9nZXRfcmFtX3B0cihhZGRyMSk7CisgICAgICAgIHN3aXRjaCAoZW5kaWFuKSB7CisgICAgICAgIGNhc2UgREVWSUNFX0xJVFRMRV9FTkRJQU46CisgICAgICAgICAgICBzdGxfbGVfcChwdHIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBERVZJQ0VfQklHX0VORElBTjoKKyAgICAgICAgICAgIHN0bF9iZV9wKHB0ciwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RsX3AocHRyLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW52YWxpZGF0ZV9hbmRfc2V0X2RpcnR5KGFkZHIxLCA0KTsKKyAgICB9Cit9CisKK3ZvaWQgc3RsX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzdGxfcGh5c19pbnRlcm5hbChhZGRyLCB2YWwsIERFVklDRV9OQVRJVkVfRU5ESUFOKTsKK30KKwordm9pZCBzdGxfbGVfcGh5cyhod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIHN0bF9waHlzX2ludGVybmFsKGFkZHIsIHZhbCwgREVWSUNFX0xJVFRMRV9FTkRJQU4pOworfQorCit2b2lkIHN0bF9iZV9waHlzKGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgc3RsX3BoeXNfaW50ZXJuYWwoYWRkciwgdmFsLCBERVZJQ0VfQklHX0VORElBTik7Cit9CisKKy8qIFhYWDogb3B0aW1pemUgKi8KK3ZvaWQgc3RiX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICB1aW50OF90IHYgPSB2YWw7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShhZGRyLCAmdiwgMSk7Cit9CisKKy8qIFhYWDogb3B0aW1pemUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHdfcGh5c19pbnRlcm5hbChod2FkZHIgYWRkciwgdWludDMyX3QgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gZGV2aWNlX2VuZGlhbiBlbmRpYW4pCit7CisgICAgaW50IGlvX2luZGV4OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1bnNpZ25lZCBsb25nIHBkOworICAgIFBoeXNQYWdlRGVzYyAqcDsKKworICAgIHAgPSBwaHlzX3BhZ2VfZmluZChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpOworICAgIGlmICghcCkgeworICAgICAgICBwZCA9IElPX01FTV9VTkFTU0lHTkVEOworICAgIH0gZWxzZSB7CisgICAgICAgIHBkID0gcC0+cGh5c19vZmZzZXQ7CisgICAgfQorCisgICAgaWYgKChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSAhPSBJT19NRU1fUkFNKSB7CisgICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkgJiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICBhZGRyID0gKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykgKyBwLT5yZWdpb25fb2Zmc2V0OworI2lmIGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyAgICAgICAgaWYgKGVuZGlhbiA9PSBERVZJQ0VfTElUVExFX0VORElBTikgeworICAgICAgICAgICAgdmFsID0gYnN3YXAxNih2YWwpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAoZW5kaWFuID09IERFVklDRV9CSUdfRU5ESUFOKSB7CisgICAgICAgICAgICB2YWwgPSBic3dhcDE2KHZhbCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpb19tZW1fd3JpdGUoaW9faW5kZXgsIGFkZHIsIHZhbCwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyMTsKKyAgICAgICAgYWRkcjEgPSAocGQgJiBUQVJHRVRfUEFHRV9NQVNLKSArIChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spOworICAgICAgICAvKiBSQU0gY2FzZSAqLworICAgICAgICBwdHIgPSBxZW11X2dldF9yYW1fcHRyKGFkZHIxKTsKKyAgICAgICAgc3dpdGNoIChlbmRpYW4pIHsKKyAgICAgICAgY2FzZSBERVZJQ0VfTElUVExFX0VORElBTjoKKyAgICAgICAgICAgIHN0d19sZV9wKHB0ciwgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFVklDRV9CSUdfRU5ESUFOOgorICAgICAgICAgICAgc3R3X2JlX3AocHRyLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdHdfcChwdHIsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3B1X3BoeXNpY2FsX21lbW9yeV9pc19jbGVhbihhZGRyMSkpIHsKKyAgICAgICAgICAgIC8qIGludmFsaWRhdGUgY29kZSAqLworICAgICAgICAgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfcmFuZ2UoYWRkcjEsIGFkZHIxICsgMiwgMCk7CisgICAgICAgICAgICAvKiBzZXQgZGlydHkgYml0ICovCisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3NldF9kaXJ0eV9mbGFnKGFkZHIxLCBESVJUWV9NRU1PUllfTUlHUkFUSU9OKTsKKyAgICAgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X2ZsYWcoYWRkcjEsIERJUlRZX01FTU9SWV9WR0EpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHN0d19waHlzKGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgc3R3X3BoeXNfaW50ZXJuYWwoYWRkciwgdmFsLCBERVZJQ0VfTkFUSVZFX0VORElBTik7Cit9CisKK3ZvaWQgc3R3X2xlX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzdHdfcGh5c19pbnRlcm5hbChhZGRyLCB2YWwsIERFVklDRV9MSVRUTEVfRU5ESUFOKTsKK30KKwordm9pZCBzdHdfYmVfcGh5cyhod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIHN0d19waHlzX2ludGVybmFsKGFkZHIsIHZhbCwgREVWSUNFX0JJR19FTkRJQU4pOworfQorCisvKiBYWFg6IG9wdGltaXplICovCit2b2lkIHN0cV9waHlzKGh3YWRkciBhZGRyLCB1aW50NjRfdCB2YWwpCit7CisgICAgdmFsID0gdHN3YXA2NCh2YWwpOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUoYWRkciwgJnZhbCwgOCk7Cit9CisKKwordm9pZCBzdHFfbGVfcGh5cyhod2FkZHIgYWRkciwgdWludDY0X3QgdmFsKQoreworICAgIHZhbCA9IGNwdV90b19sZTY0KHZhbCk7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShhZGRyLCAmdmFsLCA4KTsKK30KKwordm9pZCBzdHFfYmVfcGh5cyhod2FkZHIgYWRkciwgdWludDY0X3QgdmFsKQoreworICAgIHZhbCA9IGNwdV90b19iZTY0KHZhbCk7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShhZGRyLCAmdmFsLCA4KTsKK30KKworI2VuZGlmCisKKy8qIHZpcnR1YWwgbWVtb3J5IGFjY2VzcyBmb3IgZGVidWcgKGluY2x1ZGVzIHdyaXRpbmcgdG8gUk9NKSAqLworaW50IGNwdV9tZW1vcnlfcndfZGVidWcoQ1BVU3RhdGUgKmNwdSwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYsIGludCBsZW4sIGludCBpc193cml0ZSkKK3sKKyAgICBpbnQgbDsKKyAgICBod2FkZHIgcGh5c19hZGRyOworICAgIHRhcmdldF91bG9uZyBwYWdlOworICAgIHVpbnQ4X3QqIGJ1ZjggPSAodWludDhfdCopYnVmOworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgcGFnZSA9IGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLOworICAgICAgICBwaHlzX2FkZHIgPSBjcHVfZ2V0X3BoeXNfcGFnZV9kZWJ1ZyhlbnYsIHBhZ2UpOworICAgICAgICAvKiBpZiBubyBwaHlzaWNhbCBwYWdlIG1hcHBlZCwgcmV0dXJuIGFuIGVycm9yICovCisgICAgICAgIGlmIChwaHlzX2FkZHIgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGwgPSAocGFnZSArIFRBUkdFVF9QQUdFX1NJWkUpIC0gYWRkcjsKKyAgICAgICAgaWYgKGwgPiBsZW4pCisgICAgICAgICAgICBsID0gbGVuOworICAgICAgICBwaHlzX2FkZHIgKz0gKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAgICAgaWYgKGlzX3dyaXRlKQorICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZV9yb20ocGh5c19hZGRyLCBidWY4LCBsKTsKKyAgICAgICAgZWxzZQorI2VuZGlmCisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KHBoeXNfYWRkciwgYnVmOCwgbCwgaXNfd3JpdGUpOworICAgICAgICBsZW4gLT0gbDsKKyAgICAgICAgYnVmOCArPSBsOworICAgICAgICBhZGRyICs9IGw7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9mZWF0dXJlX3RvX2Muc2ggYi9hbmRyb2lkL3FlbXUxL2ZlYXR1cmVfdG9fYy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmY5ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9mZWF0dXJlX3RvX2Muc2gKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisKKyMgQ29udmVydCB0ZXh0IGZpbGVzIHRvIGNvbXBpbGFibGUgQyBhcnJheXMuCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitvdXRwdXQ9JDEKK3NoaWZ0CisKK2lmIHRlc3QgLXogIiRvdXRwdXQiIHx8IHRlc3QgLXogIiQxIjsgdGhlbgorICBlY2hvICJVc2FnZTogJDAgT1VUUFVURklMRSBJTlBVVEZJTEUuLi4iCisgIGV4aXQgMQorZmkKKworaWYgdGVzdCAtZSAiJG91dHB1dCI7IHRoZW4KKyAgZWNobyAiT3V0cHV0IGZpbGUgXCIkb3V0cHV0XCIgYWxyZWFkeSBleGlzdHM7IHJlZnVzaW5nIHRvIG92ZXJ3cml0ZS4iCisgIGV4aXQgMQorZmkKKworZm9yIGlucHV0OyBkbworICBhcnJheW5hbWU9eG1sX2ZlYXR1cmVfYGVjaG8gJGlucHV0IHwgc2VkICdzLC4qLywsOyBzL1stLl0vXy9nJ2AKKworICAke0FXSzotYXdrfSAnQkVHSU4geyBuID0gMAorICAgICAgcHJpbnQgInN0YXRpYyBjb25zdCBjaGFyICckYXJyYXluYW1lJ1tdID0geyIKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykKKyAgICAgICAgX29yZF9bc3ByaW50ZigiJWMiLCBpKV0gPSBpCisgICAgfSB7CisgICAgICBzcGxpdCgkMCwgbGluZSwgIiIpOworICAgICAgcHJpbnRmICIgICIKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoKCQwKTsgaSsrKSB7CisgICAgICAgIGMgPSBsaW5lW2ldCisgICAgICAgIGlmIChjID09ICInXCcnIikgeworICAgICAgICAgIHByaW50ZiAiJ1wnJ1xcJ1wnJydcJycsICIKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICJcXCIpIHsKKyAgICAgICAgICBwcmludGYgIidcJydcXFxcJ1wnJywgIgorICAgICAgICB9IGVsc2UgaWYgKF9vcmRfW2NdID49IDMyICYmIF9vcmRfW2NdIDwgMTI3KSB7CisJICBwcmludGYgIidcJyclcydcJycsICIsIGMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYgIidcJydcXCUwM28nXCcnLCAiLCBfb3JkX1tjXQorICAgICAgICB9CisgICAgICAgIGlmIChpICUgMTAgPT0gMCkKKyAgICAgICAgICBwcmludGYgIlxuICAgIgorICAgICAgfQorICAgICAgcHJpbnRmICInXCcnXFxuJ1wnJywgXG4iCisgICAgfSBFTkQgeworICAgICAgcHJpbnQgIiAgMCB9OyIKKyAgICB9JyA8ICRpbnB1dCA+PiAkb3V0cHV0Citkb25lCisKK2VjaG8gPj4gJG91dHB1dAorZWNobyAiZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHhtbF9idWlsdGluW11bMl07IiA+PiAkb3V0cHV0CitlY2hvICJjb25zdCBjaGFyICpjb25zdCB4bWxfYnVpbHRpbltdWzJdID0geyIgPj4gJG91dHB1dAorCitmb3IgaW5wdXQ7IGRvCisgIGJhc2VuYW1lPWBlY2hvICRpbnB1dCB8IHNlZCAncywuKi8sLCdgCisgIGFycmF5bmFtZT14bWxfZmVhdHVyZV9gZWNobyAkaW5wdXQgfCBzZWQgJ3MsLiovLCw7IHMvWy0uXS9fL2cnYAorICBlY2hvICIgIHsgXCIkYmFzZW5hbWVcIiwgJGFycmF5bmFtZSB9LCIgPj4gJG91dHB1dAorZG9uZQorCitlY2hvICIgIHsgKGNoYXIgKikwLCAoY2hhciAqKTAgfSIgPj4gJG91dHB1dAorZWNobyAifTsiID4+ICRvdXRwdXQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZnB1L3NvZnRmbG9hdC1tYWNyb3MuaCBiL2FuZHJvaWQvcWVtdTEvZnB1L3NvZnRmbG9hdC1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA5NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9mcHUvc29mdGZsb2F0LW1hY3Jvcy5oCkBAIC0wLDAgKzEsNzQ5IEBACisvKgorICogUUVNVSBmbG9hdCBzdXBwb3J0IG1hY3JvcworICoKKyAqIERlcml2ZWQgZnJvbSBTb2Z0RmxvYXQuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgQyBzb3VyY2UgZnJhZ21lbnQgaXMgcGFydCBvZiB0aGUgU29mdEZsb2F0IElFQy9JRUVFIEZsb2F0aW5nLXBvaW50CitBcml0aG1ldGljIFBhY2thZ2UsIFJlbGVhc2UgMmIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL3d3dy5jcy5iZXJrZWxleS5lZHUvfmpoYXVzZXIvCithcml0aG1ldGljL1NvZnRGbG9hdC5odG1sJy4KKworVEhJUyBTT0ZUV0FSRSBJUyBESVNUUklCVVRFRCBBUyBJUywgRk9SIEZSRUUuICBBbHRob3VnaCByZWFzb25hYmxlIGVmZm9ydCBoYXMKK2JlZW4gbWFkZSB0byBhdm9pZCBpdCwgVEhJUyBTT0ZUV0FSRSBNQVkgQ09OVEFJTiBGQVVMVFMgVEhBVCBXSUxMIEFUIFRJTUVTCitSRVNVTFQgSU4gSU5DT1JSRUNUIEJFSEFWSU9SLiAgVVNFIE9GIFRISVMgU09GVFdBUkUgSVMgUkVTVFJJQ1RFRCBUTyBQRVJTT05TCitBTkQgT1JHQU5JWkFUSU9OUyBXSE8gQ0FOIEFORCBXSUxMIFRBS0UgRlVMTCBSRVNQT05TSUJJTElUWSBGT1IgQUxMIExPU1NFUywKK0NPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBUSEVZIElOQ1VSIERVRSBUTyBUSEUgU09GVFdBUkUsIEFORCBXSE8gRlVSVEhFUk1PUkUKK0VGRkVDVElWRUxZIElOREVNTklGWSBKT0hOIEhBVVNFUiBBTkQgVEhFIElOVEVSTkFUSU9OQUwgQ09NUFVURVIgU0NJRU5DRQorSU5TVElUVVRFIChwb3NzaWJseSB2aWEgc2ltaWxhciBsZWdhbCBub3RpY2UpIEFHQUlOU1QgQUxMIExPU1NFUywgQ09TVFMsIE9SCitPVEhFUiBQUk9CTEVNUyBJTkNVUlJFRCBCWSBUSEVJUiBDVVNUT01FUlMgQU5EIENMSUVOVFMgRFVFIFRPIFRIRSBTT0ZUV0FSRS4KKworRGVyaXZhdGl2ZSB3b3JrcyBhcmUgYWNjZXB0YWJsZSwgZXZlbiBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgc28gbG9uZyBhcworKDEpIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGRlcml2YXRpdmUgd29yayBpbmNsdWRlcyBwcm9taW5lbnQgbm90aWNlIHRoYXQKK3RoZSB3b3JrIGlzIGRlcml2YXRpdmUsIGFuZCAoMikgdGhlIHNvdXJjZSBjb2RlIGluY2x1ZGVzIHByb21pbmVudCBub3RpY2Ugd2l0aAordGhlc2UgZm91ciBwYXJhZ3JhcGhzIGZvciB0aG9zZSBwYXJ0cyBvZiB0aGlzIGNvZGUgdGhhdCBhcmUgcmV0YWluZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoaXMgbWFjcm8gdGVzdHMgZm9yIG1pbmltdW0gdmVyc2lvbiBvZiB0aGUgR05VIEMgY29tcGlsZXIuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykKKyMgZGVmaW5lIFNPRlRGTE9BVF9HTlVDX1BSRVJFUShtYWosIG1pbikgXAorICAgICAgICAgKChfX0dOVUNfXyA8PCAxNikgKyBfX0dOVUNfTUlOT1JfXyA+PSAoKG1haikgPDwgMTYpICsgKG1pbikpCisjZWxzZQorIyBkZWZpbmUgU09GVEZMT0FUX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU2hpZnRzIGBhJyByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIElmIGFueSBub256ZXJvCit8IGJpdHMgYXJlIHNoaWZ0ZWQgb2ZmLCB0aGV5IGFyZSBgYGphbW1lZCcnIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgorfCB0aGUgcmVzdWx0IGJ5IHNldHRpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byAxLiAgVGhlIHZhbHVlIG9mIGBjb3VudCcKK3wgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlOyBpbiBwYXJ0aWN1bGFyLCBpZiBgY291bnQnIGlzIGdyZWF0ZXIgdGhhbiAzMiwgdGhlCit8IHJlc3VsdCB3aWxsIGJlIGVpdGhlciAwIG9yIDEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIGBhJyBpcyB6ZXJvIG9yIG5vbnplcm8uCit8IFRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGB6UHRyJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIHZvaWQgc2hpZnQzMlJpZ2h0SmFtbWluZyh1aW50MzJfdCBhLCBpbnRfZmFzdDE2X3QgY291bnQsIHVpbnQzMl90ICp6UHRyKQoreworICAgIHVpbnQzMl90IHo7CisKKyAgICBpZiAoIGNvdW50ID09IDAgKSB7CisgICAgICAgIHogPSBhOworICAgIH0KKyAgICBlbHNlIGlmICggY291bnQgPCAzMiApIHsKKyAgICAgICAgeiA9ICggYT4+Y291bnQgKSB8ICggKCBhPDwoICggLSBjb3VudCApICYgMzEgKSApICE9IDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSAoIGEgIT0gMCApOworICAgIH0KKyAgICAqelB0ciA9IHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNoaWZ0cyBgYScgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcuICBJZiBhbnkgbm9uemVybworfCBiaXRzIGFyZSBzaGlmdGVkIG9mZiwgdGhleSBhcmUgYGBqYW1tZWQnJyBpbnRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YKK3wgdGhlIHJlc3VsdCBieSBzZXR0aW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gMS4gIFRoZSB2YWx1ZSBvZiBgY291bnQnCit8IGNhbiBiZSBhcmJpdHJhcmlseSBsYXJnZTsgaW4gcGFydGljdWxhciwgaWYgYGNvdW50JyBpcyBncmVhdGVyIHRoYW4gNjQsIHRoZQorfCByZXN1bHQgd2lsbCBiZSBlaXRoZXIgMCBvciAxLCBkZXBlbmRpbmcgb24gd2hldGhlciBgYScgaXMgemVybyBvciBub256ZXJvLgorfCBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBgelB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkIHNoaWZ0NjRSaWdodEphbW1pbmcodWludDY0X3QgYSwgaW50X2Zhc3QxNl90IGNvdW50LCB1aW50NjRfdCAqelB0cikKK3sKKyAgICB1aW50NjRfdCB6OworCisgICAgaWYgKCBjb3VudCA9PSAwICkgeworICAgICAgICB6ID0gYTsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgIHogPSAoIGE+PmNvdW50ICkgfCAoICggYTw8KCAoIC0gY291bnQgKSAmIDYzICkgKSAhPSAwICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB6ID0gKCBhICE9IDAgKTsKKyAgICB9CisgICAgKnpQdHIgPSB6OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTaGlmdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyByaWdodCBieSA2NAorfCBfcGx1c18gdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcuICBUaGUgc2hpZnRlZCByZXN1bHQgaXMgYXQgbW9zdAorfCA2NCBub256ZXJvIGJpdHM7IHRoaXMgaXMgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGB6MFB0cicuICBUaGUKK3wgYml0cyBzaGlmdGVkIG9mZiBmb3JtIGEgc2Vjb25kIDY0LWJpdCByZXN1bHQgYXMgZm9sbG93czogIFRoZSBfbGFzdF8gYml0Cit8IHNoaWZ0ZWQgb2ZmIGlzIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZXh0cmEgcmVzdWx0LCBhbmQgdGhlIG90aGVyCit8IDYzIGJpdHMgb2YgdGhlIGV4dHJhIHJlc3VsdCBhcmUgYWxsIHplcm8gaWYgYW5kIG9ubHkgaWYgX2FsbF9idXRfdGhlX2xhc3RfCit8IGJpdHMgc2hpZnRlZCBvZmYgd2VyZSBhbGwgemVyby4gIFRoaXMgZXh0cmEgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24KK3wgcG9pbnRlZCB0byBieSBgejFQdHInLiAgVGhlIHZhbHVlIG9mIGBjb3VudCcgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlLgorfCAgICAgKFRoaXMgcm91dGluZSBtYWtlcyBtb3JlIHNlbnNlIGlmIGBhMCcgYW5kIGBhMScgYXJlIGNvbnNpZGVyZWQgdG8gZm9ybQorfCBhIGZpeGVkLXBvaW50IHZhbHVlIHdpdGggYmluYXJ5IHBvaW50IGJldHdlZW4gYGEwJyBhbmQgYGExJy4gIFRoaXMgZml4ZWQtCit8IHBvaW50IHZhbHVlIGlzIHNoaWZ0ZWQgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcsIGFuZAorfCB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkKK3wgYHowUHRyJy4gIFRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIHJlc3VsdCBtYXkgYmUgc2xpZ2h0bHkgY29ycnVwdGVkIGFzCit8IGRlc2NyaWJlZCBhYm92ZSwgYW5kIGlzIHJldHVybmVkIGF0IHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IGB6MVB0cicuKQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgdm9pZAorIHNoaWZ0NjRFeHRyYVJpZ2h0SmFtbWluZygKKyAgICAgdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCBpbnRfZmFzdDE2X3QgY291bnQsIHVpbnQ2NF90ICp6MFB0ciwgdWludDY0X3QgKnoxUHRyKQoreworICAgIHVpbnQ2NF90IHowLCB6MTsKKyAgICBpbnQ4IG5lZ0NvdW50ID0gKCAtIGNvdW50ICkgJiA2MzsKKworICAgIGlmICggY291bnQgPT0gMCApIHsKKyAgICAgICAgejEgPSBhMTsKKyAgICAgICAgejAgPSBhMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgIHoxID0gKCBhMDw8bmVnQ291bnQgKSB8ICggYTEgIT0gMCApOworICAgICAgICB6MCA9IGEwPj5jb3VudDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggY291bnQgPT0gNjQgKSB7CisgICAgICAgICAgICB6MSA9IGEwIHwgKCBhMSAhPSAwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB6MSA9ICggKCBhMCB8IGExICkgIT0gMCApOworICAgICAgICB9CisgICAgICAgIHowID0gMDsKKyAgICB9CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNoaWZ0cyB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnIHJpZ2h0IGJ5IHRoZQorfCBudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLiAgQW55IGJpdHMgc2hpZnRlZCBvZmYgYXJlIGxvc3QuICBUaGUgdmFsdWUKK3wgb2YgYGNvdW50JyBjYW4gYmUgYXJiaXRyYXJpbHkgbGFyZ2U7IGluIHBhcnRpY3VsYXIsIGlmIGBjb3VudCcgaXMgZ3JlYXRlcgorfCB0aGFuIDEyOCwgdGhlIHJlc3VsdCB3aWxsIGJlIDAuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHR3byA2NC1iaXQgcGllY2VzCit8IHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgc2hpZnQxMjhSaWdodCgKKyAgICAgdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCBpbnRfZmFzdDE2X3QgY291bnQsIHVpbnQ2NF90ICp6MFB0ciwgdWludDY0X3QgKnoxUHRyKQoreworICAgIHVpbnQ2NF90IHowLCB6MTsKKyAgICBpbnQ4IG5lZ0NvdW50ID0gKCAtIGNvdW50ICkgJiA2MzsKKworICAgIGlmICggY291bnQgPT0gMCApIHsKKyAgICAgICAgejEgPSBhMTsKKyAgICAgICAgejAgPSBhMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgIHoxID0gKCBhMDw8bmVnQ291bnQgKSB8ICggYTE+PmNvdW50ICk7CisgICAgICAgIHowID0gYTA+PmNvdW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgejEgPSAoY291bnQgPCAxMjgpID8gKGEwID4+IChjb3VudCAmIDYzKSkgOiAwOworICAgICAgICB6MCA9IDA7CisgICAgfQorICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTaGlmdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyByaWdodCBieSB0aGUKK3wgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIElmIGFueSBub256ZXJvIGJpdHMgYXJlIHNoaWZ0ZWQgb2ZmLCB0aGV5Cit8IGFyZSBgYGphbW1lZCcnIGludG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcmVzdWx0IGJ5IHNldHRpbmcgdGhlCit8IGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byAxLiAgVGhlIHZhbHVlIG9mIGBjb3VudCcgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlOworfCBpbiBwYXJ0aWN1bGFyLCBpZiBgY291bnQnIGlzIGdyZWF0ZXIgdGhhbiAxMjgsIHRoZSByZXN1bHQgd2lsbCBiZSBlaXRoZXIKK3wgMCBvciAxLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgYTAnIGFuZCBgYTEnIGlzIHplcm8gb3IKK3wgbm9uemVyby4gIFRoZSByZXN1bHQgaXMgYnJva2VuIGludG8gdHdvIDY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdAorfCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJyBhbmQgYHoxUHRyJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIHZvaWQKKyBzaGlmdDEyOFJpZ2h0SmFtbWluZygKKyAgICAgdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCBpbnRfZmFzdDE2X3QgY291bnQsIHVpbnQ2NF90ICp6MFB0ciwgdWludDY0X3QgKnoxUHRyKQoreworICAgIHVpbnQ2NF90IHowLCB6MTsKKyAgICBpbnQ4IG5lZ0NvdW50ID0gKCAtIGNvdW50ICkgJiA2MzsKKworICAgIGlmICggY291bnQgPT0gMCApIHsKKyAgICAgICAgejEgPSBhMTsKKyAgICAgICAgejAgPSBhMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGNvdW50IDwgNjQgKSB7CisgICAgICAgIHoxID0gKCBhMDw8bmVnQ291bnQgKSB8ICggYTE+PmNvdW50ICkgfCAoICggYTE8PG5lZ0NvdW50ICkgIT0gMCApOworICAgICAgICB6MCA9IGEwPj5jb3VudDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggY291bnQgPT0gNjQgKSB7CisgICAgICAgICAgICB6MSA9IGEwIHwgKCBhMSAhPSAwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGNvdW50IDwgMTI4ICkgeworICAgICAgICAgICAgejEgPSAoIGEwPj4oIGNvdW50ICYgNjMgKSApIHwgKCAoICggYTA8PG5lZ0NvdW50ICkgfCBhMSApICE9IDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHoxID0gKCAoIGEwIHwgYTEgKSAhPSAwICk7CisgICAgICAgIH0KKyAgICAgICAgejAgPSAwOworICAgIH0KKyAgICAqejFQdHIgPSB6MTsKKyAgICAqejBQdHIgPSB6MDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU2hpZnRzIHRoZSAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcsIGBhMScsIGFuZCBgYTInIHJpZ2h0Cit8IGJ5IDY0IF9wbHVzXyB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIFRoZSBzaGlmdGVkIHJlc3VsdCBpcworfCBhdCBtb3N0IDEyOCBub256ZXJvIGJpdHM7IHRoZXNlIGFyZSBicm9rZW4gaW50byB0d28gNjQtYml0IHBpZWNlcyB3aGljaCBhcmUKK3wgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInIGFuZCBgejFQdHInLiAgVGhlIGJpdHMgc2hpZnRlZAorfCBvZmYgZm9ybSBhIHRoaXJkIDY0LWJpdCByZXN1bHQgYXMgZm9sbG93czogIFRoZSBfbGFzdF8gYml0IHNoaWZ0ZWQgb2ZmIGlzCit8IHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBvZiB0aGUgZXh0cmEgcmVzdWx0LCBhbmQgdGhlIG90aGVyIDYzIGJpdHMgb2YgdGhlCit8IGV4dHJhIHJlc3VsdCBhcmUgYWxsIHplcm8gaWYgYW5kIG9ubHkgaWYgX2FsbF9idXRfdGhlX2xhc3RfIGJpdHMgc2hpZnRlZCBvZmYKK3wgd2VyZSBhbGwgemVyby4gIFRoaXMgZXh0cmEgcmVzdWx0IGlzIHN0b3JlZCBpbiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorfCBgejJQdHInLiAgVGhlIHZhbHVlIG9mIGBjb3VudCcgY2FuIGJlIGFyYml0cmFyaWx5IGxhcmdlLgorfCAgICAgKFRoaXMgcm91dGluZSBtYWtlcyBtb3JlIHNlbnNlIGlmIGBhMCcsIGBhMScsIGFuZCBgYTInIGFyZSBjb25zaWRlcmVkCit8IHRvIGZvcm0gYSBmaXhlZC1wb2ludCB2YWx1ZSB3aXRoIGJpbmFyeSBwb2ludCBiZXR3ZWVuIGBhMScgYW5kIGBhMicuICBUaGlzCit8IGZpeGVkLXBvaW50IHZhbHVlIGlzIHNoaWZ0ZWQgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGluIGBjb3VudCcsCit8IGFuZCB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvCit8IGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuICBUaGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSByZXN1bHQgbWF5IGJlIHNsaWdodGx5Cit8IGNvcnJ1cHRlZCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCBpcyByZXR1cm5lZCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieQorfCBgejJQdHInLikKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIHZvaWQKKyBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKAorICAgICB1aW50NjRfdCBhMCwKKyAgICAgdWludDY0X3QgYTEsCisgICAgIHVpbnQ2NF90IGEyLAorICAgICBpbnRfZmFzdDE2X3QgY291bnQsCisgICAgIHVpbnQ2NF90ICp6MFB0ciwKKyAgICAgdWludDY0X3QgKnoxUHRyLAorICAgICB1aW50NjRfdCAqejJQdHIKKyApCit7CisgICAgdWludDY0X3QgejAsIHoxLCB6MjsKKyAgICBpbnQ4IG5lZ0NvdW50ID0gKCAtIGNvdW50ICkgJiA2MzsKKworICAgIGlmICggY291bnQgPT0gMCApIHsKKyAgICAgICAgejIgPSBhMjsKKyAgICAgICAgejEgPSBhMTsKKyAgICAgICAgejAgPSBhMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggY291bnQgPCA2NCApIHsKKyAgICAgICAgICAgIHoyID0gYTE8PG5lZ0NvdW50OworICAgICAgICAgICAgejEgPSAoIGEwPDxuZWdDb3VudCApIHwgKCBhMT4+Y291bnQgKTsKKyAgICAgICAgICAgIHowID0gYTA+PmNvdW50OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCBjb3VudCA9PSA2NCApIHsKKyAgICAgICAgICAgICAgICB6MiA9IGExOworICAgICAgICAgICAgICAgIHoxID0gYTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhMiB8PSBhMTsKKyAgICAgICAgICAgICAgICBpZiAoIGNvdW50IDwgMTI4ICkgeworICAgICAgICAgICAgICAgICAgICB6MiA9IGEwPDxuZWdDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgejEgPSBhMD4+KCBjb3VudCAmIDYzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB6MiA9ICggY291bnQgPT0gMTI4ICkgPyBhMCA6ICggYTAgIT0gMCApOworICAgICAgICAgICAgICAgICAgICB6MSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgejAgPSAwOworICAgICAgICB9CisgICAgICAgIHoyIHw9ICggYTIgIT0gMCApOworICAgIH0KKyAgICAqejJQdHIgPSB6MjsKKyAgICAqejFQdHIgPSB6MTsKKyAgICAqejBQdHIgPSB6MDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU2hpZnRzIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScgbGVmdCBieSB0aGUKK3wgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gaW4gYGNvdW50Jy4gIEFueSBiaXRzIHNoaWZ0ZWQgb2ZmIGFyZSBsb3N0LiAgVGhlIHZhbHVlCit8IG9mIGBjb3VudCcgbXVzdCBiZSBsZXNzIHRoYW4gNjQuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHR3byA2NC1iaXQKK3wgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kIGB6MVB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgc2hvcnRTaGlmdDEyOExlZnQoCisgICAgIHVpbnQ2NF90IGEwLCB1aW50NjRfdCBhMSwgaW50X2Zhc3QxNl90IGNvdW50LCB1aW50NjRfdCAqejBQdHIsIHVpbnQ2NF90ICp6MVB0cikKK3sKKworICAgICp6MVB0ciA9IGExPDxjb3VudDsKKyAgICAqejBQdHIgPQorICAgICAgICAoIGNvdW50ID09IDAgKSA/IGEwIDogKCBhMDw8Y291bnQgKSB8ICggYTE+PiggKCAtIGNvdW50ICkgJiA2MyApICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNoaWZ0cyB0aGUgMTkyLWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnLCBgYTEnLCBhbmQgYGEyJyBsZWZ0Cit8IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBpbiBgY291bnQnLiAgQW55IGJpdHMgc2hpZnRlZCBvZmYgYXJlIGxvc3QuCit8IFRoZSB2YWx1ZSBvZiBgY291bnQnIG11c3QgYmUgbGVzcyB0aGFuIDY0LiAgVGhlIHJlc3VsdCBpcyBicm9rZW4gaW50byB0aHJlZQorfCA2NC1iaXQgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicsCit8IGB6MVB0cicsIGFuZCBgejJQdHInLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgdm9pZAorIHNob3J0U2hpZnQxOTJMZWZ0KAorICAgICB1aW50NjRfdCBhMCwKKyAgICAgdWludDY0X3QgYTEsCisgICAgIHVpbnQ2NF90IGEyLAorICAgICBpbnRfZmFzdDE2X3QgY291bnQsCisgICAgIHVpbnQ2NF90ICp6MFB0ciwKKyAgICAgdWludDY0X3QgKnoxUHRyLAorICAgICB1aW50NjRfdCAqejJQdHIKKyApCit7CisgICAgdWludDY0X3QgejAsIHoxLCB6MjsKKyAgICBpbnQ4IG5lZ0NvdW50OworCisgICAgejIgPSBhMjw8Y291bnQ7CisgICAgejEgPSBhMTw8Y291bnQ7CisgICAgejAgPSBhMDw8Y291bnQ7CisgICAgaWYgKCAwIDwgY291bnQgKSB7CisgICAgICAgIG5lZ0NvdW50ID0gKCAoIC0gY291bnQgKSAmIDYzICk7CisgICAgICAgIHoxIHw9IGEyPj5uZWdDb3VudDsKKyAgICAgICAgejAgfD0gYTE+Pm5lZ0NvdW50OworICAgIH0KKyAgICAqejJQdHIgPSB6MjsKKyAgICAqejFQdHIgPSB6MTsKKyAgICAqejBQdHIgPSB6MDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgQWRkcyB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnIHRvIHRoZSAxMjgtYml0Cit8IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBiMCcgYW5kIGBiMScuICBBZGRpdGlvbiBpcyBtb2R1bG8gMl4xMjgsIHNvCit8IGFueSBjYXJyeSBvdXQgaXMgbG9zdC4gIFRoZSByZXN1bHQgaXMgYnJva2VuIGludG8gdHdvIDY0LWJpdCBwaWVjZXMgd2hpY2gKK3wgYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJyBhbmQgYHoxUHRyJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIHZvaWQKKyBhZGQxMjgoCisgICAgIHVpbnQ2NF90IGEwLCB1aW50NjRfdCBhMSwgdWludDY0X3QgYjAsIHVpbnQ2NF90IGIxLCB1aW50NjRfdCAqejBQdHIsIHVpbnQ2NF90ICp6MVB0ciApCit7CisgICAgdWludDY0X3QgejE7CisKKyAgICB6MSA9IGExICsgYjE7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gYTAgKyBiMCArICggejEgPCBhMSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBBZGRzIHRoZSAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcsIGBhMScsIGFuZCBgYTInIHRvIHRoZQorfCAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBiMCcsIGBiMScsIGFuZCBgYjInLiAgQWRkaXRpb24gaXMKK3wgbW9kdWxvIDJeMTkyLCBzbyBhbnkgY2Fycnkgb3V0IGlzIGxvc3QuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHRocmVlCit8IDY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJywKK3wgYHoxUHRyJywgYW5kIGB6MlB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgYWRkMTkyKAorICAgICB1aW50NjRfdCBhMCwKKyAgICAgdWludDY0X3QgYTEsCisgICAgIHVpbnQ2NF90IGEyLAorICAgICB1aW50NjRfdCBiMCwKKyAgICAgdWludDY0X3QgYjEsCisgICAgIHVpbnQ2NF90IGIyLAorICAgICB1aW50NjRfdCAqejBQdHIsCisgICAgIHVpbnQ2NF90ICp6MVB0ciwKKyAgICAgdWludDY0X3QgKnoyUHRyCisgKQoreworICAgIHVpbnQ2NF90IHowLCB6MSwgejI7CisgICAgaW50OCBjYXJyeTAsIGNhcnJ5MTsKKworICAgIHoyID0gYTIgKyBiMjsKKyAgICBjYXJyeTEgPSAoIHoyIDwgYTIgKTsKKyAgICB6MSA9IGExICsgYjE7CisgICAgY2FycnkwID0gKCB6MSA8IGExICk7CisgICAgejAgPSBhMCArIGIwOworICAgIHoxICs9IGNhcnJ5MTsKKyAgICB6MCArPSAoIHoxIDwgY2FycnkxICk7CisgICAgejAgKz0gY2FycnkwOworICAgICp6MlB0ciA9IHoyOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTdWJ0cmFjdHMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJyBmcm9tIHRoZQorfCAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScuICBTdWJ0cmFjdGlvbiBpcyBtb2R1bG8KK3wgMl4xMjgsIHNvIGFueSBib3Jyb3cgb3V0IChjYXJyeSBvdXQpIGlzIGxvc3QuICBUaGUgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHR3bworfCA2NC1iaXQgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5IGB6MFB0cicgYW5kCit8IGB6MVB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgc3ViMTI4KAorICAgICB1aW50NjRfdCBhMCwgdWludDY0X3QgYTEsIHVpbnQ2NF90IGIwLCB1aW50NjRfdCBiMSwgdWludDY0X3QgKnowUHRyLCB1aW50NjRfdCAqejFQdHIgKQoreworCisgICAgKnoxUHRyID0gYTEgLSBiMTsKKyAgICAqejBQdHIgPSBhMCAtIGIwIC0gKCBhMSA8IGIxICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFN1YnRyYWN0cyB0aGUgMTkyLWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYjAnLCBgYjEnLCBhbmQgYGIyJworfCBmcm9tIHRoZSAxOTItYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcsIGBhMScsIGFuZCBgYTInLgorfCBTdWJ0cmFjdGlvbiBpcyBtb2R1bG8gMl4xOTIsIHNvIGFueSBib3Jyb3cgb3V0IChjYXJyeSBvdXQpIGlzIGxvc3QuICBUaGUKK3wgcmVzdWx0IGlzIGJyb2tlbiBpbnRvIHRocmVlIDY0LWJpdCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zCit8IHBvaW50ZWQgdG8gYnkgYHowUHRyJywgYHoxUHRyJywgYW5kIGB6MlB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgc3ViMTkyKAorICAgICB1aW50NjRfdCBhMCwKKyAgICAgdWludDY0X3QgYTEsCisgICAgIHVpbnQ2NF90IGEyLAorICAgICB1aW50NjRfdCBiMCwKKyAgICAgdWludDY0X3QgYjEsCisgICAgIHVpbnQ2NF90IGIyLAorICAgICB1aW50NjRfdCAqejBQdHIsCisgICAgIHVpbnQ2NF90ICp6MVB0ciwKKyAgICAgdWludDY0X3QgKnoyUHRyCisgKQoreworICAgIHVpbnQ2NF90IHowLCB6MSwgejI7CisgICAgaW50OCBib3Jyb3cwLCBib3Jyb3cxOworCisgICAgejIgPSBhMiAtIGIyOworICAgIGJvcnJvdzEgPSAoIGEyIDwgYjIgKTsKKyAgICB6MSA9IGExIC0gYjE7CisgICAgYm9ycm93MCA9ICggYTEgPCBiMSApOworICAgIHowID0gYTAgLSBiMDsKKyAgICB6MCAtPSAoIHoxIDwgYm9ycm93MSApOworICAgIHoxIC09IGJvcnJvdzE7CisgICAgejAgLT0gYm9ycm93MDsKKyAgICAqejJQdHIgPSB6MjsKKyAgICAqejFQdHIgPSB6MTsKKyAgICAqejBQdHIgPSB6MDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgTXVsdGlwbGllcyBgYScgYnkgYGInIHRvIG9idGFpbiBhIDEyOC1iaXQgcHJvZHVjdC4gIFRoZSBwcm9kdWN0IGlzIGJyb2tlbgorfCBpbnRvIHR3byA2NC1iaXQgcGllY2VzIHdoaWNoIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9ucyBwb2ludGVkIHRvIGJ5Cit8IGB6MFB0cicgYW5kIGB6MVB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkIG11bDY0VG8xMjgoIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIsIHVpbnQ2NF90ICp6MFB0ciwgdWludDY0X3QgKnoxUHRyICkKK3sKKyAgICB1aW50MzJfdCBhSGlnaCwgYUxvdywgYkhpZ2gsIGJMb3c7CisgICAgdWludDY0X3QgejAsIHpNaWRkbGVBLCB6TWlkZGxlQiwgejE7CisKKyAgICBhTG93ID0gYTsKKyAgICBhSGlnaCA9IGE+PjMyOworICAgIGJMb3cgPSBiOworICAgIGJIaWdoID0gYj4+MzI7CisgICAgejEgPSAoICh1aW50NjRfdCkgYUxvdyApICogYkxvdzsKKyAgICB6TWlkZGxlQSA9ICggKHVpbnQ2NF90KSBhTG93ICkgKiBiSGlnaDsKKyAgICB6TWlkZGxlQiA9ICggKHVpbnQ2NF90KSBhSGlnaCApICogYkxvdzsKKyAgICB6MCA9ICggKHVpbnQ2NF90KSBhSGlnaCApICogYkhpZ2g7CisgICAgek1pZGRsZUEgKz0gek1pZGRsZUI7CisgICAgejAgKz0gKCAoICh1aW50NjRfdCkgKCB6TWlkZGxlQSA8IHpNaWRkbGVCICkgKTw8MzIgKSArICggek1pZGRsZUE+PjMyICk7CisgICAgek1pZGRsZUEgPDw9IDMyOworICAgIHoxICs9IHpNaWRkbGVBOworICAgIHowICs9ICggejEgPCB6TWlkZGxlQSApOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBNdWx0aXBsaWVzIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScgYnkKK3wgYGInIHRvIG9idGFpbiBhIDE5Mi1iaXQgcHJvZHVjdC4gIFRoZSBwcm9kdWN0IGlzIGJyb2tlbiBpbnRvIHRocmVlIDY0LWJpdAorfCBwaWVjZXMgd2hpY2ggYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHowUHRyJywgYHoxUHRyJywgYW5kCit8IGB6MlB0cicuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB2b2lkCisgbXVsMTI4Qnk2NFRvMTkyKAorICAgICB1aW50NjRfdCBhMCwKKyAgICAgdWludDY0X3QgYTEsCisgICAgIHVpbnQ2NF90IGIsCisgICAgIHVpbnQ2NF90ICp6MFB0ciwKKyAgICAgdWludDY0X3QgKnoxUHRyLAorICAgICB1aW50NjRfdCAqejJQdHIKKyApCit7CisgICAgdWludDY0X3QgejAsIHoxLCB6MiwgbW9yZTE7CisKKyAgICBtdWw2NFRvMTI4KCBhMSwgYiwgJnoxLCAmejIgKTsKKyAgICBtdWw2NFRvMTI4KCBhMCwgYiwgJnowLCAmbW9yZTEgKTsKKyAgICBhZGQxMjgoIHowLCBtb3JlMSwgMCwgejEsICZ6MCwgJnoxICk7CisgICAgKnoyUHRyID0gejI7CisgICAgKnoxUHRyID0gejE7CisgICAgKnowUHRyID0gejA7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IE11bHRpcGxpZXMgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyB0byB0aGUKK3wgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYjAnIGFuZCBgYjEnIHRvIG9idGFpbiBhIDI1Ni1iaXQKK3wgcHJvZHVjdC4gIFRoZSBwcm9kdWN0IGlzIGJyb2tlbiBpbnRvIGZvdXIgNjQtYml0IHBpZWNlcyB3aGljaCBhcmUgc3RvcmVkIGF0Cit8IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgejBQdHInLCBgejFQdHInLCBgejJQdHInLCBhbmQgYHozUHRyJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIHZvaWQKKyBtdWwxMjhUbzI1NigKKyAgICAgdWludDY0X3QgYTAsCisgICAgIHVpbnQ2NF90IGExLAorICAgICB1aW50NjRfdCBiMCwKKyAgICAgdWludDY0X3QgYjEsCisgICAgIHVpbnQ2NF90ICp6MFB0ciwKKyAgICAgdWludDY0X3QgKnoxUHRyLAorICAgICB1aW50NjRfdCAqejJQdHIsCisgICAgIHVpbnQ2NF90ICp6M1B0cgorICkKK3sKKyAgICB1aW50NjRfdCB6MCwgejEsIHoyLCB6MzsKKyAgICB1aW50NjRfdCBtb3JlMSwgbW9yZTI7CisKKyAgICBtdWw2NFRvMTI4KCBhMSwgYjEsICZ6MiwgJnozICk7CisgICAgbXVsNjRUbzEyOCggYTEsIGIwLCAmejEsICZtb3JlMiApOworICAgIGFkZDEyOCggejEsIG1vcmUyLCAwLCB6MiwgJnoxLCAmejIgKTsKKyAgICBtdWw2NFRvMTI4KCBhMCwgYjAsICZ6MCwgJm1vcmUxICk7CisgICAgYWRkMTI4KCB6MCwgbW9yZTEsIDAsIHoxLCAmejAsICZ6MSApOworICAgIG11bDY0VG8xMjgoIGEwLCBiMSwgJm1vcmUxLCAmbW9yZTIgKTsKKyAgICBhZGQxMjgoIG1vcmUxLCBtb3JlMiwgMCwgejIsICZtb3JlMSwgJnoyICk7CisgICAgYWRkMTI4KCB6MCwgejEsIDAsIG1vcmUxLCAmejAsICZ6MSApOworICAgICp6M1B0ciA9IHozOworICAgICp6MlB0ciA9IHoyOworICAgICp6MVB0ciA9IHoxOworICAgICp6MFB0ciA9IHowOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIGFuIGFwcHJveGltYXRpb24gdG8gdGhlIDY0LWJpdCBpbnRlZ2VyIHF1b3RpZW50IG9idGFpbmVkIGJ5IGRpdmlkaW5nCit8IGBiJyBpbnRvIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScuICBUaGUKK3wgZGl2aXNvciBgYicgbXVzdCBiZSBhdCBsZWFzdCAyXjYzLiAgSWYgcSBpcyB0aGUgZXhhY3QgcXVvdGllbnQgdHJ1bmNhdGVkCit8IHRvd2FyZCB6ZXJvLCB0aGUgYXBwcm94aW1hdGlvbiByZXR1cm5lZCBsaWVzIGJldHdlZW4gcSBhbmQgcSArIDIgaW5jbHVzaXZlLgorfCBJZiB0aGUgZXhhY3QgcXVvdGllbnQgcSBpcyBsYXJnZXIgdGhhbiA2NCBiaXRzLCB0aGUgbWF4aW11bSBwb3NpdGl2ZSA2NC1iaXQKK3wgdW5zaWduZWQgaW50ZWdlciBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHVpbnQ2NF90IGVzdGltYXRlRGl2MTI4VG82NCggdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCB1aW50NjRfdCBiICkKK3sKKyAgICB1aW50NjRfdCBiMCwgYjE7CisgICAgdWludDY0X3QgcmVtMCwgcmVtMSwgdGVybTAsIHRlcm0xOworICAgIHVpbnQ2NF90IHo7CisKKyAgICBpZiAoIGIgPD0gYTAgKSByZXR1cm4gTElUNjQoIDB4RkZGRkZGRkZGRkZGRkZGRiApOworICAgIGIwID0gYj4+MzI7CisgICAgeiA9ICggYjA8PDMyIDw9IGEwICkgPyBMSVQ2NCggMHhGRkZGRkZGRjAwMDAwMDAwICkgOiAoIGEwIC8gYjAgKTw8MzI7CisgICAgbXVsNjRUbzEyOCggYiwgeiwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICBzdWIxMjgoIGEwLCBhMSwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB3aGlsZSAoICggKGludDY0X3QpIHJlbTAgKSA8IDAgKSB7CisgICAgICAgIHogLT0gTElUNjQoIDB4MTAwMDAwMDAwICk7CisgICAgICAgIGIxID0gYjw8MzI7CisgICAgICAgIGFkZDEyOCggcmVtMCwgcmVtMSwgYjAsIGIxLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB9CisgICAgcmVtMCA9ICggcmVtMDw8MzIgKSB8ICggcmVtMT4+MzIgKTsKKyAgICB6IHw9ICggYjA8PDMyIDw9IHJlbTAgKSA/IDB4RkZGRkZGRkYgOiByZW0wIC8gYjA7CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIDMyLWJpdCBzaWduaWZpY2FuZCBnaXZlbgorfCBieSBgYScuICBDb25zaWRlcmVkIGFzIGFuIGludGVnZXIsIGBhJyBtdXN0IGJlIGF0IGxlYXN0IDJeMzEuICBJZiBiaXQgMCBvZgorfCBgYUV4cCcgKHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQpIGlzIDEsIHRoZSBpbnRlZ2VyIHJldHVybmVkIGFwcHJveGltYXRlcworfCAyXjMxKnNxcnQoYGEnLzJeMzEpLCB3aGVyZSBgYScgaXMgY29uc2lkZXJlZCBhbiBpbnRlZ2VyLiAgSWYgYml0IDAgb2YgYGFFeHAnCit8IGlzIDAsIHRoZSBpbnRlZ2VyIHJldHVybmVkIGFwcHJveGltYXRlcyAyXjMxKnNxcnQoYGEnLzJeMzApLiAgSW4gZWl0aGVyCit8IGNhc2UsIHRoZSBhcHByb3hpbWF0aW9uIHJldHVybmVkIGxpZXMgc3RyaWN0bHkgd2l0aGluICsvLTIgb2YgdGhlIGV4YWN0Cit8IHZhbHVlLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdWludDMyX3QgZXN0aW1hdGVTcXJ0MzIoaW50X2Zhc3QxNl90IGFFeHAsIHVpbnQzMl90IGEpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHNxcnRPZGRBZGp1c3RtZW50c1tdID0geworICAgICAgICAweDAwMDQsIDB4MDAyMiwgMHgwMDVELCAweDAwQjEsIDB4MDExRCwgMHgwMTlGLCAweDAyMzYsIDB4MDJFMCwKKyAgICAgICAgMHgwMzlDLCAweDA0NjgsIDB4MDU0NSwgMHgwNjMxLCAweDA3MkIsIDB4MDgzMiwgMHgwOTQ2LCAweDBBNjcKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBzcXJ0RXZlbkFkanVzdG1lbnRzW10gPSB7CisgICAgICAgIDB4MEEyRCwgMHgwOEFGLCAweDA3NUEsIDB4MDYyOSwgMHgwNTFBLCAweDA0MjksIDB4MDM1NiwgMHgwMjlFLAorICAgICAgICAweDAyMDAsIDB4MDE3OSwgMHgwMTA5LCAweDAwQUYsIDB4MDA2OCwgMHgwMDM0LCAweDAwMTIsIDB4MDAwMgorICAgIH07CisgICAgaW50OCBpbmRleDsKKyAgICB1aW50MzJfdCB6OworCisgICAgaW5kZXggPSAoIGE+PjI3ICkgJiAxNTsKKyAgICBpZiAoIGFFeHAgJiAxICkgeworICAgICAgICB6ID0gMHg0MDAwICsgKCBhPj4xNyApIC0gc3FydE9kZEFkanVzdG1lbnRzWyAoaW50KWluZGV4IF07CisgICAgICAgIHogPSAoICggYSAvIHogKTw8MTQgKSArICggejw8MTUgKTsKKyAgICAgICAgYSA+Pj0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHogPSAweDgwMDAgKyAoIGE+PjE3ICkgLSBzcXJ0RXZlbkFkanVzdG1lbnRzWyAoaW50KWluZGV4IF07CisgICAgICAgIHogPSBhIC8geiArIHo7CisgICAgICAgIHogPSAoIDB4MjAwMDAgPD0geiApID8gMHhGRkZGODAwMCA6ICggejw8MTUgKTsKKyAgICAgICAgaWYgKCB6IDw9IGEgKSByZXR1cm4gKHVpbnQzMl90KSAoICggKGludDMyX3QpIGEgKT4+MSApOworICAgIH0KKyAgICByZXR1cm4gKCAodWludDMyX3QpICggKCAoICh1aW50NjRfdCkgYSApPDwzMSApIC8geiApICkgKyAoIHo+PjEgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgMCBiaXRzIGJlZm9yZSB0aGUgbW9zdC1zaWduaWZpY2FudCAxIGJpdCBvZgorfCBgYScuICBJZiBgYScgaXMgemVybywgMzIgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQ4IGNvdW50TGVhZGluZ1plcm9zMzIoIHVpbnQzMl90IGEgKQoreworI2lmIFNPRlRGTE9BVF9HTlVDX1BSRVJFUSgzLCA0KQorICAgIGlmIChhKSB7CisgICAgICAgIHJldHVybiBfX2J1aWx0aW5fY2x6KGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAzMjsKKyAgICB9CisjZWxzZQorICAgIHN0YXRpYyBjb25zdCBpbnQ4IGNvdW50TGVhZGluZ1plcm9zSGlnaFtdID0geworICAgICAgICA4LCA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgICAgICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAgICAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgICAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICBzaGlmdENvdW50ID0gMDsKKyAgICBpZiAoIGEgPCAweDEwMDAwICkgeworICAgICAgICBzaGlmdENvdW50ICs9IDE2OworICAgICAgICBhIDw8PSAxNjsKKyAgICB9CisgICAgaWYgKCBhIDwgMHgxMDAwMDAwICkgeworICAgICAgICBzaGlmdENvdW50ICs9IDg7CisgICAgICAgIGEgPDw9IDg7CisgICAgfQorICAgIHNoaWZ0Q291bnQgKz0gY291bnRMZWFkaW5nWmVyb3NIaWdoWyBhPj4yNCBdOworICAgIHJldHVybiBzaGlmdENvdW50OworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGVhZGluZyAwIGJpdHMgYmVmb3JlIHRoZSBtb3N0LXNpZ25pZmljYW50IDEgYml0IG9mCit8IGBhJy4gIElmIGBhJyBpcyB6ZXJvLCA2NCBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludDggY291bnRMZWFkaW5nWmVyb3M2NCggdWludDY0X3QgYSApCit7CisjaWYgU09GVEZMT0FUX0dOVUNfUFJFUkVRKDMsIDQpCisgICAgaWYgKGEpIHsKKyAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9jbHpsbChhKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gNjQ7CisgICAgfQorI2Vsc2UKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICBzaGlmdENvdW50ID0gMDsKKyAgICBpZiAoIGEgPCAoICh1aW50NjRfdCkgMSApPDwzMiApIHsKKyAgICAgICAgc2hpZnRDb3VudCArPSAzMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGEgPj49IDMyOworICAgIH0KKyAgICBzaGlmdENvdW50ICs9IGNvdW50TGVhZGluZ1plcm9zMzIoIGEgKTsKKyAgICByZXR1cm4gc2hpZnRDb3VudDsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScKK3wgaXMgZXF1YWwgdG8gdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJy4KK3wgT3RoZXJ3aXNlLCByZXR1cm5zIDAuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBmbGFnIGVxMTI4KCB1aW50NjRfdCBhMCwgdWludDY0X3QgYTEsIHVpbnQ2NF90IGIwLCB1aW50NjRfdCBiMSApCit7CisKKyAgICByZXR1cm4gKCBhMCA9PSBiMCApICYmICggYTEgPT0gYjEgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBhMCcgYW5kIGBhMScgaXMgbGVzcworfCB0aGFuIG9yIGVxdWFsIHRvIHRoZSAxMjgtYml0IHZhbHVlIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIGBiMCcgYW5kIGBiMScuCit8IE90aGVyd2lzZSwgcmV0dXJucyAwLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxhZyBsZTEyOCggdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCB1aW50NjRfdCBiMCwgdWludDY0X3QgYjEgKQoreworCisgICAgcmV0dXJuICggYTAgPCBiMCApIHx8ICggKCBhMCA9PSBiMCApICYmICggYTEgPD0gYjEgKSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGEwJyBhbmQgYGExJyBpcyBsZXNzCit8IHRoYW4gdGhlIDEyOC1iaXQgdmFsdWUgZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgYGIwJyBhbmQgYGIxJy4gIE90aGVyd2lzZSwKK3wgcmV0dXJucyAwLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxhZyBsdDEyOCggdWludDY0X3QgYTAsIHVpbnQ2NF90IGExLCB1aW50NjRfdCBiMCwgdWludDY0X3QgYjEgKQoreworCisgICAgcmV0dXJuICggYTAgPCBiMCApIHx8ICggKCBhMCA9PSBiMCApICYmICggYTEgPCBiMSApICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYTAnIGFuZCBgYTEnIGlzCit8IG5vdCBlcXVhbCB0byB0aGUgMTI4LWJpdCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYjAnIGFuZCBgYjEnLgorfCBPdGhlcndpc2UsIHJldHVybnMgMC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIGZsYWcgbmUxMjgoIHVpbnQ2NF90IGEwLCB1aW50NjRfdCBhMSwgdWludDY0X3QgYjAsIHVpbnQ2NF90IGIxICkKK3sKKworICAgIHJldHVybiAoIGEwICE9IGIwICkgfHwgKCBhMSAhPSBiMSApOworCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2ZwdS9zb2Z0ZmxvYXQtc3BlY2lhbGl6ZS5oIGIvYW5kcm9pZC9xZW11MS9mcHUvc29mdGZsb2F0LXNwZWNpYWxpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThmNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9mcHUvc29mdGZsb2F0LXNwZWNpYWxpemUuaApAQCAtMCwwICsxLDExNjEgQEAKKy8qCisgKiBRRU1VIGZsb2F0IHN1cHBvcnQKKyAqCisgKiBEZXJpdmVkIGZyb20gU29mdEZsb2F0LgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIEMgc291cmNlIGZyYWdtZW50IGlzIHBhcnQgb2YgdGhlIFNvZnRGbG9hdCBJRUMvSUVFRSBGbG9hdGluZy1wb2ludAorQXJpdGhtZXRpYyBQYWNrYWdlLCBSZWxlYXNlIDJiLgorCitXcml0dGVuIGJ5IEpvaG4gUi4gSGF1c2VyLiAgVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGluIHBhcnQgYnkgdGhlCitJbnRlcm5hdGlvbmFsIENvbXB1dGVyIFNjaWVuY2UgSW5zdGl0dXRlLCBsb2NhdGVkIGF0IFN1aXRlIDYwMCwgMTk0NyBDZW50ZXIKK1N0cmVldCwgQmVya2VsZXksIENhbGlmb3JuaWEgOTQ3MDQuICBGdW5kaW5nIHdhcyBwYXJ0aWFsbHkgcHJvdmlkZWQgYnkgdGhlCitOYXRpb25hbCBTY2llbmNlIEZvdW5kYXRpb24gdW5kZXIgZ3JhbnQgTUlQLTkzMTE5ODAuICBUaGUgb3JpZ2luYWwgdmVyc2lvbgorb2YgdGhpcyBjb2RlIHdhcyB3cml0dGVuIGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvIGJ1aWxkIGEgZml4ZWQtcG9pbnQgdmVjdG9yCitwcm9jZXNzb3IgaW4gY29sbGFib3JhdGlvbiB3aXRoIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXksCitvdmVyc2VlbiBieSBQcm9mcy4gTmVsc29uIE1vcmdhbiBhbmQgSm9obiBXYXdyenluZWsuICBNb3JlIGluZm9ybWF0aW9uCitpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgV2ViIHBhZ2UgYGh0dHA6Ly93d3cuY3MuYmVya2VsZXkuZWR1L35qaGF1c2VyLworYXJpdGhtZXRpYy9Tb2Z0RmxvYXQuaHRtbCcuCisKK1RISVMgU09GVFdBUkUgSVMgRElTVFJJQlVURUQgQVMgSVMsIEZPUiBGUkVFLiAgQWx0aG91Z2ggcmVhc29uYWJsZSBlZmZvcnQgaGFzCitiZWVuIG1hZGUgdG8gYXZvaWQgaXQsIFRISVMgU09GVFdBUkUgTUFZIENPTlRBSU4gRkFVTFRTIFRIQVQgV0lMTCBBVCBUSU1FUworUkVTVUxUIElOIElOQ09SUkVDVCBCRUhBVklPUi4gIFVTRSBPRiBUSElTIFNPRlRXQVJFIElTIFJFU1RSSUNURUQgVE8gUEVSU09OUworQU5EIE9SR0FOSVpBVElPTlMgV0hPIENBTiBBTkQgV0lMTCBUQUtFIEZVTEwgUkVTUE9OU0lCSUxJVFkgRk9SIEFMTCBMT1NTRVMsCitDT1NUUywgT1IgT1RIRVIgUFJPQkxFTVMgVEhFWSBJTkNVUiBEVUUgVE8gVEhFIFNPRlRXQVJFLCBBTkQgV0hPIEZVUlRIRVJNT1JFCitFRkZFQ1RJVkVMWSBJTkRFTU5JRlkgSk9ITiBIQVVTRVIgQU5EIFRIRSBJTlRFUk5BVElPTkFMIENPTVBVVEVSIFNDSUVOQ0UKK0lOU1RJVFVURSAocG9zc2libHkgdmlhIHNpbWlsYXIgbGVnYWwgd2FybmluZykgQUdBSU5TVCBBTEwgTE9TU0VTLCBDT1NUUywgT1IKK09USEVSIFBST0JMRU1TIElOQ1VSUkVEIEJZIFRIRUlSIENVU1RPTUVSUyBBTkQgQ0xJRU5UUyBEVUUgVE8gVEhFIFNPRlRXQVJFLgorCitEZXJpdmF0aXZlIHdvcmtzIGFyZSBhY2NlcHRhYmxlLCBldmVuIGZvciBjb21tZXJjaWFsIHB1cnBvc2VzLCBzbyBsb25nIGFzCisoMSkgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZGVyaXZhdGl2ZSB3b3JrIGluY2x1ZGVzIHByb21pbmVudCBub3RpY2UgdGhhdAordGhlIHdvcmsgaXMgZGVyaXZhdGl2ZSwgYW5kICgyKSB0aGUgc291cmNlIGNvZGUgaW5jbHVkZXMgcHJvbWluZW50IG5vdGljZSB3aXRoCit0aGVzZSBmb3VyIHBhcmFncmFwaHMgZm9yIHRob3NlIHBhcnRzIG9mIHRoaXMgY29kZSB0aGF0IGFyZSByZXRhaW5lZC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUykgfHwgZGVmaW5lZChUQVJHRVRfU0g0KSB8fCBkZWZpbmVkKFRBUkdFVF9VTklDT1JFMzIpCisjZGVmaW5lIFNOQU5fQklUX0lTX09ORQkJMQorI2Vsc2UKKyNkZWZpbmUgU05BTl9CSVRfSVNfT05FCQkwCisjZW5kaWYKKworI2lmIGRlZmluZWQoVEFSR0VUX1hURU5TQSkKKy8qIERlZmluZSBmb3IgYXJjaGl0ZWN0dXJlcyB3aGljaCBkZXZpYXRlIGZyb20gSUVFRSBpbiBub3Qgc3VwcG9ydGluZworICogc2lnbmFsaW5nIE5hTnMgKHNvIGFsbCBOYU5zIGFyZSB0cmVhdGVkIGFzIHF1aWV0KS4KKyAqLworI2RlZmluZSBOT19TSUdOQUxJTkdfTkFOUyAxCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBwYXR0ZXJuIGZvciBhIGRlZmF1bHQgZ2VuZXJhdGVkIGhhbGYtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pCitjb25zdCBmbG9hdDE2IGZsb2F0MTZfZGVmYXVsdF9uYW4gPSBjb25zdF9mbG9hdDE2KDB4N0UwMCk7CisjZWxpZiBTTkFOX0JJVF9JU19PTkUKK2NvbnN0IGZsb2F0MTYgZmxvYXQxNl9kZWZhdWx0X25hbiA9IGNvbnN0X2Zsb2F0MTYoMHg3REZGKTsKKyNlbHNlCitjb25zdCBmbG9hdDE2IGZsb2F0MTZfZGVmYXVsdF9uYW4gPSBjb25zdF9mbG9hdDE2KDB4RkUwMCk7CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBwYXR0ZXJuIGZvciBhIGRlZmF1bHQgZ2VuZXJhdGVkIHNpbmdsZS1wcmVjaXNpb24gTmFOLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKQorY29uc3QgZmxvYXQzMiBmbG9hdDMyX2RlZmF1bHRfbmFuID0gY29uc3RfZmxvYXQzMigweDdGRkZGRkZGKTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykgfHwgZGVmaW5lZChUQVJHRVRfQVJNKSB8fCBkZWZpbmVkKFRBUkdFVF9BTFBIQSkgfHwgXAorICAgICAgZGVmaW5lZChUQVJHRVRfWFRFTlNBKQorY29uc3QgZmxvYXQzMiBmbG9hdDMyX2RlZmF1bHRfbmFuID0gY29uc3RfZmxvYXQzMigweDdGQzAwMDAwKTsKKyNlbGlmIFNOQU5fQklUX0lTX09ORQorY29uc3QgZmxvYXQzMiBmbG9hdDMyX2RlZmF1bHRfbmFuID0gY29uc3RfZmxvYXQzMigweDdGQkZGRkZGKTsKKyNlbHNlCitjb25zdCBmbG9hdDMyIGZsb2F0MzJfZGVmYXVsdF9uYW4gPSBjb25zdF9mbG9hdDMyKDB4RkZDMDAwMDApOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUaGUgcGF0dGVybiBmb3IgYSBkZWZhdWx0IGdlbmVyYXRlZCBkb3VibGUtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQykKK2NvbnN0IGZsb2F0NjQgZmxvYXQ2NF9kZWZhdWx0X25hbiA9IGNvbnN0X2Zsb2F0NjQoTElUNjQoIDB4N0ZGRkZGRkZGRkZGRkZGRiApKTsKKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykgfHwgZGVmaW5lZChUQVJHRVRfQVJNKSB8fCBkZWZpbmVkKFRBUkdFVF9BTFBIQSkKK2NvbnN0IGZsb2F0NjQgZmxvYXQ2NF9kZWZhdWx0X25hbiA9IGNvbnN0X2Zsb2F0NjQoTElUNjQoIDB4N0ZGODAwMDAwMDAwMDAwMCApKTsKKyNlbGlmIFNOQU5fQklUX0lTX09ORQorY29uc3QgZmxvYXQ2NCBmbG9hdDY0X2RlZmF1bHRfbmFuID0gY29uc3RfZmxvYXQ2NChMSVQ2NCggMHg3RkY3RkZGRkZGRkZGRkZGICkpOworI2Vsc2UKK2NvbnN0IGZsb2F0NjQgZmxvYXQ2NF9kZWZhdWx0X25hbiA9IGNvbnN0X2Zsb2F0NjQoTElUNjQoIDB4RkZGODAwMDAwMDAwMDAwMCApKTsKKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGhlIHBhdHRlcm4gZm9yIGEgZGVmYXVsdCBnZW5lcmF0ZWQgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBOYU4uCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgU05BTl9CSVRfSVNfT05FCisjZGVmaW5lIGZsb2F0eDgwX2RlZmF1bHRfbmFuX2hpZ2ggMHg3RkZGCisjZGVmaW5lIGZsb2F0eDgwX2RlZmF1bHRfbmFuX2xvdyAgTElUNjQoIDB4QkZGRkZGRkZGRkZGRkZGRiApCisjZWxzZQorI2RlZmluZSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoIDB4RkZGRgorI2RlZmluZSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3cgIExJVDY0KCAweEMwMDAwMDAwMDAwMDAwMDAgKQorI2VuZGlmCisKK2NvbnN0IGZsb2F0eDgwIGZsb2F0eDgwX2RlZmF1bHRfbmFuCisgICAgPSBtYWtlX2Zsb2F0eDgwX2luaXQoZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaCwgZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBwYXR0ZXJuIGZvciBhIGRlZmF1bHQgZ2VuZXJhdGVkIHF1YWRydXBsZS1wcmVjaXNpb24gTmFOLiAgVGhlIGBoaWdoJyBhbmQKK3wgYGxvdycgdmFsdWVzIGhvbGQgdGhlIG1vc3QtIGFuZCBsZWFzdC1zaWduaWZpY2FudCBiaXRzLCByZXNwZWN0aXZlbHkuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWYgU05BTl9CSVRfSVNfT05FCisjZGVmaW5lIGZsb2F0MTI4X2RlZmF1bHRfbmFuX2hpZ2ggTElUNjQoIDB4N0ZGRjdGRkZGRkZGRkZGRiApCisjZGVmaW5lIGZsb2F0MTI4X2RlZmF1bHRfbmFuX2xvdyAgTElUNjQoIDB4RkZGRkZGRkZGRkZGRkZGRiApCisjZWxzZQorI2RlZmluZSBmbG9hdDEyOF9kZWZhdWx0X25hbl9oaWdoIExJVDY0KCAweEZGRkY4MDAwMDAwMDAwMDAgKQorI2RlZmluZSBmbG9hdDEyOF9kZWZhdWx0X25hbl9sb3cgIExJVDY0KCAweDAwMDAwMDAwMDAwMDAwMDAgKQorI2VuZGlmCisKK2NvbnN0IGZsb2F0MTI4IGZsb2F0MTI4X2RlZmF1bHRfbmFuCisgICAgPSBtYWtlX2Zsb2F0MTI4X2luaXQoZmxvYXQxMjhfZGVmYXVsdF9uYW5faGlnaCwgZmxvYXQxMjhfZGVmYXVsdF9uYW5fbG93KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJhaXNlcyB0aGUgZXhjZXB0aW9ucyBzcGVjaWZpZWQgYnkgYGZsYWdzJy4gIEZsb2F0aW5nLXBvaW50IHRyYXBzIGNhbiBiZQorfCBkZWZpbmVkIGhlcmUgaWYgZGVzaXJlZC4gIEl0IGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUgZm9yIHN1Y2ggYSB0cmFwCit8IHRvIHN1YnN0aXR1dGUgYSByZXN1bHQgdmFsdWUuICBJZiB0cmFwcyBhcmUgbm90IGltcGxlbWVudGVkLCB0aGlzIHJvdXRpbmUKK3wgc2hvdWxkIGJlIHNpbXBseSBgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzIHw9IGZsYWdzOycuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgZmxvYXRfcmFpc2UoIGludDggZmxhZ3MgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbGFnczsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IEludGVybmFsIGNhbm9uaWNhbCBOYU4gZm9ybWF0LgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsYWcgc2lnbjsKKyAgICB1aW50NjRfdCBoaWdoLCBsb3c7Cit9IGNvbW1vbk5hTlQ7CisKKyNpZmRlZiBOT19TSUdOQUxJTkdfTkFOUworaW50IGZsb2F0MTZfaXNfcXVpZXRfbmFuKGZsb2F0MTYgYV8pCit7CisgICAgcmV0dXJuIGZsb2F0MTZfaXNfYW55X25hbihhXyk7Cit9CisKK2ludCBmbG9hdDE2X2lzX3NpZ25hbGluZ19uYW4oZmxvYXQxNiBhXykKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBoYWxmLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgYSBxdWlldAorfCBOYU47IG90aGVyd2lzZSByZXR1cm5zIDAuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDE2X2lzX3F1aWV0X25hbihmbG9hdDE2IGFfKQoreworICAgIHVpbnQxNl90IGEgPSBmbG9hdDE2X3ZhbChhXyk7CisjaWYgU05BTl9CSVRfSVNfT05FCisgICAgcmV0dXJuICgoKGEgPj4gOSkgJiAweDNGKSA9PSAweDNFKSAmJiAoYSAmIDB4MUZGKTsKKyNlbHNlCisgICAgcmV0dXJuICgoYSAmIH4weDgwMDApID49IDB4N2M4MCk7CisjZW5kaWYKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEgc2lnbmFsaW5nCit8IE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTZfaXNfc2lnbmFsaW5nX25hbihmbG9hdDE2IGFfKQoreworICAgIHVpbnQxNl90IGEgPSBmbG9hdDE2X3ZhbChhXyk7CisjaWYgU05BTl9CSVRfSVNfT05FCisgICAgcmV0dXJuICgoYSAmIH4weDgwMDApID49IDB4N2M4MCk7CisjZWxzZQorICAgIHJldHVybiAoKChhID4+IDkpICYgMHgzRikgPT0gMHgzRSkgJiYgKGEgJiAweDFGRik7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyBhIHF1aWV0IE5hTiBpZiB0aGUgaGFsZi1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgYGEnIGlzIGEKK3wgc2lnbmFsaW5nIE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZmxvYXQxNiBmbG9hdDE2X21heWJlX3NpbGVuY2VfbmFuKGZsb2F0MTYgYV8pCit7CisgICAgaWYgKGZsb2F0MTZfaXNfc2lnbmFsaW5nX25hbihhXykpIHsKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyMgIGlmIGRlZmluZWQoVEFSR0VUX01JUFMpIHx8IGRlZmluZWQoVEFSR0VUX1NINCkgfHwgZGVmaW5lZChUQVJHRVRfVU5JQ09SRTMyKQorICAgICAgICByZXR1cm4gZmxvYXQxNl9kZWZhdWx0X25hbjsKKyMgIGVsc2UKKyMgICAgZXJyb3IgUnVsZXMgZm9yIHNpbGVuY2luZyBhIHNpZ25hbGluZyBOYU4gYXJlIHRhcmdldC1zcGVjaWZpYworIyAgZW5kaWYKKyNlbHNlCisgICAgICAgIHVpbnQxNl90IGEgPSBmbG9hdDE2X3ZhbChhXyk7CisgICAgICAgIGEgfD0gKDEgPDwgOSk7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MTYoYSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGFfOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IE5hTgorfCBgYScgdG8gdGhlIGNhbm9uaWNhbCBOYU4gZm9ybWF0LiAgSWYgYGEnIGlzIGEgc2lnbmFsaW5nIE5hTiwgdGhlIGludmFsaWQKK3wgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbW1vbk5hTlQgZmxvYXQxNlRvQ29tbW9uTmFOKCBmbG9hdDE2IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBjb21tb25OYU5UIHo7CisKKyAgICBpZiAoIGZsb2F0MTZfaXNfc2lnbmFsaW5nX25hbiggYSApICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSICk7CisgICAgei5zaWduID0gZmxvYXQxNl92YWwoYSkgPj4gMTU7CisgICAgei5sb3cgPSAwOworICAgIHouaGlnaCA9ICgodWludDY0X3QpIGZsb2F0MTZfdmFsKGEpKTw8NTQ7CisgICAgcmV0dXJuIHo7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgY2Fub25pY2FsIE5hTiBgYScgdG8gdGhlIGhhbGYtCit8IHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDE2IGNvbW1vbk5hTlRvRmxvYXQxNihjb21tb25OYU5UIGEgU1RBVFVTX1BBUkFNKQoreworICAgIHVpbnQxNl90IG1hbnRpc3NhID0gYS5oaWdoPj41NDsKKworICAgIGlmIChTVEFUVVMoZGVmYXVsdF9uYW5fbW9kZSkpIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0MTZfZGVmYXVsdF9uYW47CisgICAgfQorCisgICAgaWYgKG1hbnRpc3NhKSB7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MTYoKCgoKHVpbnQxNl90KSBhLnNpZ24pIDw8IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgweDFGIDw8IDEwKSB8IG1hbnRpc3NhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0MTZfZGVmYXVsdF9uYW47CisgICAgfQorfQorCisjaWZkZWYgTk9fU0lHTkFMSU5HX05BTlMKK2ludCBmbG9hdDMyX2lzX3F1aWV0X25hbihmbG9hdDMyIGFfKQoreworICAgIHJldHVybiBmbG9hdDMyX2lzX2FueV9uYW4oYV8pOworfQorCitpbnQgZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKGZsb2F0MzIgYV8pCit7CisgICAgcmV0dXJuIDA7Cit9CisjZWxzZQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgYSBxdWlldAorfCBOYU47IG90aGVyd2lzZSByZXR1cm5zIDAuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDMyX2lzX3F1aWV0X25hbiggZmxvYXQzMiBhXyApCit7CisgICAgdWludDMyX3QgYSA9IGZsb2F0MzJfdmFsKGFfKTsKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4gKCAoICggYT4+MjIgKSAmIDB4MUZGICkgPT0gMHgxRkUgKSAmJiAoIGEgJiAweDAwM0ZGRkZGICk7CisjZWxzZQorICAgIHJldHVybiAoIDB4RkY4MDAwMDAgPD0gKHVpbnQzMl90KSAoIGE8PDEgKSApOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEgc2lnbmFsaW5nCit8IE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggZmxvYXQzMiBhXyApCit7CisgICAgdWludDMyX3QgYSA9IGZsb2F0MzJfdmFsKGFfKTsKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4gKCAweEZGODAwMDAwIDw9ICh1aW50MzJfdCkgKCBhPDwxICkgKTsKKyNlbHNlCisgICAgcmV0dXJuICggKCAoIGE+PjIyICkgJiAweDFGRiApID09IDB4MUZFICkgJiYgKCBhICYgMHgwMDNGRkZGRiApOworI2VuZGlmCit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgYSBxdWlldCBOYU4gaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgdmFsdWUgYGEnIGlzIGEKK3wgc2lnbmFsaW5nIE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDMyIGZsb2F0MzJfbWF5YmVfc2lsZW5jZV9uYW4oIGZsb2F0MzIgYV8gKQoreworICAgIGlmIChmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oYV8pKSB7CisjaWYgU05BTl9CSVRfSVNfT05FCisjICBpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKSB8fCBkZWZpbmVkKFRBUkdFVF9TSDQpIHx8IGRlZmluZWQoVEFSR0VUX1VOSUNPUkUzMikKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisjICBlbHNlCisjICAgIGVycm9yIFJ1bGVzIGZvciBzaWxlbmNpbmcgYSBzaWduYWxpbmcgTmFOIGFyZSB0YXJnZXQtc3BlY2lmaWMKKyMgIGVuZGlmCisjZWxzZQorICAgICAgICB1aW50MzJfdCBhID0gZmxvYXQzMl92YWwoYV8pOworICAgICAgICBhIHw9ICgxIDw8IDIyKTsKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQzMihhKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gYV87Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBOYU4KK3wgYGEnIHRvIHRoZSBjYW5vbmljYWwgTmFOIGZvcm1hdC4gIElmIGBhJyBpcyBhIHNpZ25hbGluZyBOYU4sIHRoZSBpbnZhbGlkCit8IGV4Y2VwdGlvbiBpcyByYWlzZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb21tb25OYU5UIGZsb2F0MzJUb0NvbW1vbk5hTiggZmxvYXQzMiBhIFNUQVRVU19QQVJBTSApCit7CisgICAgY29tbW9uTmFOVCB6OworCisgICAgaWYgKCBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGEgKSApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUiApOworICAgIHouc2lnbiA9IGZsb2F0MzJfdmFsKGEpPj4zMTsKKyAgICB6LmxvdyA9IDA7CisgICAgei5oaWdoID0gKCAodWludDY0X3QpIGZsb2F0MzJfdmFsKGEpICk8PDQxOworICAgIHJldHVybiB6OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGNhbm9uaWNhbCBOYU4gYGEnIHRvIHRoZSBzaW5nbGUtCit8IHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDMyIGNvbW1vbk5hTlRvRmxvYXQzMiggY29tbW9uTmFOVCBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICB1aW50MzJfdCBtYW50aXNzYSA9IGEuaGlnaD4+NDE7CisKKyAgICBpZiAoIFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSApIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorCisgICAgaWYgKCBtYW50aXNzYSApCisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MzIoCisgICAgICAgICAgICAoICggKHVpbnQzMl90KSBhLnNpZ24gKTw8MzEgKSB8IDB4N0Y4MDAwMDAgfCAoIGEuaGlnaD4+NDEgKSApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTZWxlY3Qgd2hpY2ggTmFOIHRvIHByb3BhZ2F0ZSBmb3IgYSB0d28taW5wdXQgb3BlcmF0aW9uLgorfCBJRUVFNzU0IGRvZXNuJ3Qgc3BlY2lmeSBhbGwgdGhlIGRldGFpbHMgb2YgdGhpcywgc28gdGhlCit8IGFsZ29yaXRobSBpcyB0YXJnZXQtc3BlY2lmaWMuCit8IFRoZSByb3V0aW5lIGlzIHBhc3NlZCB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlCit8IHR3byBOYU5zIGFuZCBzaG91bGQgcmV0dXJuIDAgdG8gc2VsZWN0IE5hTiBhIGFuZCAxIGZvciBOYU4gYi4KK3wgTm90ZSB0aGF0IHNpZ25hbGxpbmcgTmFOcyBhcmUgYWx3YXlzIHNxdWFzaGVkIHRvIHF1aWV0IE5hTnMKK3wgYnkgdGhlIGNhbGxlciwgYnkgY2FsbGluZyBmbG9hdFhYX21heWJlX3NpbGVuY2VfbmFuKCkgYmVmb3JlCit8IHJldHVybmluZyB0aGVtLgorfAorfCBhSXNMYXJnZXJTaWduaWZpY2FuZCBpcyBvbmx5IHZhbGlkIGlmIGJvdGggYSBhbmQgYiBhcmUgTmFOcworfCBvZiBzb21lIGtpbmQsIGFuZCBpcyB0cnVlIGlmIGEgaGFzIHRoZSBsYXJnZXIgc2lnbmlmaWNhbmQsCit8IG9yIGlmIGJvdGggYSBhbmQgYiBoYXZlIHRoZSBzYW1lIHNpZ25pZmljYW5kIGJ1dCBhIGlzCit8IHBvc2l0aXZlIGJ1dCBiIGlzIG5lZ2F0aXZlLiBJdCBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlIHg4NworfCB0aWUtYnJlYWsgcnVsZS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQoVEFSR0VUX0FSTSkKK3N0YXRpYyBpbnQgcGlja05hTihmbGFnIGFJc1FOYU4sIGZsYWcgYUlzU05hTiwgZmxhZyBiSXNRTmFOLCBmbGFnIGJJc1NOYU4sCisgICAgICAgICAgICAgICAgICAgIGZsYWcgYUlzTGFyZ2VyU2lnbmlmaWNhbmQpCit7CisgICAgLyogQVJNIG1hbmRhdGVkIE5hTiBwcm9wYWdhdGlvbiBydWxlczogdGFrZSB0aGUgZmlyc3Qgb2Y6CisgICAgICogIDEuIEEgaWYgaXQgaXMgc2lnbmFsaW5nCisgICAgICogIDIuIEIgaWYgaXQgaXMgc2lnbmFsaW5nCisgICAgICogIDMuIEEgKHF1aWV0KQorICAgICAqICA0LiBCIChxdWlldCkKKyAgICAgKiBBIHNpZ25hbGluZyBOYU4gaXMgYWx3YXlzIHF1aWV0ZW5lZCBiZWZvcmUgcmV0dXJuaW5nIGl0LgorICAgICAqLworICAgIGlmIChhSXNTTmFOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoYklzU05hTikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGFJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKK3N0YXRpYyBpbnQgcGlja05hTihmbGFnIGFJc1FOYU4sIGZsYWcgYUlzU05hTiwgZmxhZyBiSXNRTmFOLCBmbGFnIGJJc1NOYU4sCisgICAgICAgICAgICAgICAgICAgIGZsYWcgYUlzTGFyZ2VyU2lnbmlmaWNhbmQpCit7CisgICAgLyogQWNjb3JkaW5nIHRvIE1JUFMgc3BlY2lmaWNhdGlvbnMsIGlmIG9uZSBvZiB0aGUgdHdvIG9wZXJhbmRzIGlzCisgICAgICogYSBzTmFOLCBhIG5ldyBxTmFOIGhhcyB0byBiZSBnZW5lcmF0ZWQuIFRoaXMgaXMgZG9uZSBpbgorICAgICAqIGZsb2F0WFhfbWF5YmVfc2lsZW5jZV9uYW4oKS4gRm9yIHFOYU4gaW5wdXRzIHRoZSBzcGVjaWZpY2F0aW9ucworICAgICAqIHNheXM6ICJXaGVuIHBvc3NpYmxlLCB0aGlzIFFOYU4gcmVzdWx0IGlzIG9uZSBvZiB0aGUgb3BlcmFuZCBRTmFOCisgICAgICogdmFsdWVzLiIgSW4gcHJhY3RpY2UgaXQgc2VlbXMgdGhhdCBtb3N0IGltcGxlbWVudGF0aW9ucyBjaG9vc2UKKyAgICAgKiB0aGUgZmlyc3Qgb3BlcmFuZCBpZiBib3RoIG9wZXJhbmRzIGFyZSBxTmFOLiBJbiBzaG9ydCB0aGlzIGdpdmVzCisgICAgICogdGhlIGZvbGxvd2luZyBydWxlczoKKyAgICAgKiAgMS4gQSBpZiBpdCBpcyBzaWduYWxpbmcKKyAgICAgKiAgMi4gQiBpZiBpdCBpcyBzaWduYWxpbmcKKyAgICAgKiAgMy4gQSAocXVpZXQpCisgICAgICogIDQuIEIgKHF1aWV0KQorICAgICAqIEEgc2lnbmFsaW5nIE5hTiBpcyBhbHdheXMgc2lsZW5jZWQgYmVmb3JlIHJldHVybmluZyBpdC4KKyAgICAgKi8KKyAgICBpZiAoYUlzU05hTikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGJJc1NOYU4pIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChhSXNRTmFOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykgfHwgZGVmaW5lZChUQVJHRVRfWFRFTlNBKQorc3RhdGljIGludCBwaWNrTmFOKGZsYWcgYUlzUU5hTiwgZmxhZyBhSXNTTmFOLCBmbGFnIGJJc1FOYU4sIGZsYWcgYklzU05hTiwKKyAgICAgICAgICAgICAgICAgICBmbGFnIGFJc0xhcmdlclNpZ25pZmljYW5kKQoreworICAgIC8qIFBvd2VyUEMgcHJvcGFnYXRpb24gcnVsZXM6CisgICAgICogIDEuIEEgaWYgaXQgc05hTiBvciBxTmFOCisgICAgICogIDIuIEIgaWYgaXQgc05hTiBvciBxTmFOCisgICAgICogQSBzaWduYWxpbmcgTmFOIGlzIGFsd2F5cyBzaWxlbmNlZCBiZWZvcmUgcmV0dXJuaW5nIGl0LgorICAgICAqLworICAgIGlmIChhSXNTTmFOIHx8IGFJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2Vsc2UKK3N0YXRpYyBpbnQgcGlja05hTihmbGFnIGFJc1FOYU4sIGZsYWcgYUlzU05hTiwgZmxhZyBiSXNRTmFOLCBmbGFnIGJJc1NOYU4sCisgICAgICAgICAgICAgICAgICAgIGZsYWcgYUlzTGFyZ2VyU2lnbmlmaWNhbmQpCit7CisgICAgLyogVGhpcyBpbXBsZW1lbnRzIHg4NyBOYU4gcHJvcGFnYXRpb24gcnVsZXM6CisgICAgICogU05hTiArIFFOYU4gPT4gcmV0dXJuIHRoZSBRTmFOCisgICAgICogdHdvIFNOYU5zID0+IHJldHVybiB0aGUgb25lIHdpdGggdGhlIGxhcmdlciBzaWduaWZpY2FuZCwgc2lsZW5jZWQKKyAgICAgKiB0d28gUU5hTnMgPT4gcmV0dXJuIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VyIHNpZ25pZmljYW5kCisgICAgICogU05hTiBhbmQgYSBub24tTmFOID0+IHJldHVybiB0aGUgU05hTiwgc2lsZW5jZWQKKyAgICAgKiBRTmFOIGFuZCBhIG5vbi1OYU4gPT4gcmV0dXJuIHRoZSBRTmFOCisgICAgICoKKyAgICAgKiBJZiB3ZSBnZXQgZG93biB0byBjb21wYXJpbmcgc2lnbmlmaWNhbmRzIGFuZCB0aGV5IGFyZSB0aGUgc2FtZSwKKyAgICAgKiByZXR1cm4gdGhlIE5hTiB3aXRoIHRoZSBwb3NpdGl2ZSBzaWduIGJpdCAoaWYgYW55KS4KKyAgICAgKi8KKyAgICBpZiAoYUlzU05hTikgeworICAgICAgICBpZiAoYklzU05hTikgeworICAgICAgICAgICAgcmV0dXJuIGFJc0xhcmdlclNpZ25pZmljYW5kID8gMCA6IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJJc1FOYU4gPyAxIDogMDsKKyAgICB9CisgICAgZWxzZSBpZiAoYUlzUU5hTikgeworICAgICAgICBpZiAoYklzU05hTiB8fCAhYklzUU5hTikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhSXNMYXJnZXJTaWduaWZpY2FuZCA/IDAgOiAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTZWxlY3Qgd2hpY2ggTmFOIHRvIHByb3BhZ2F0ZSBmb3IgYSB0aHJlZS1pbnB1dCBvcGVyYXRpb24uCit8IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSB0aGF0IG5vIENQVSBuZWVkcyB0aGUgJ2xhcmdlciBzaWduaWZpY2FuZCcKK3wgaW5mb3JtYXRpb24uCit8IFJldHVybiB2YWx1ZXMgOiAwIDogYTsgMSA6IGI7IDIgOiBjOyAzIDogZGVmYXVsdC1OYU4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pCitzdGF0aWMgaW50IHBpY2tOYU5NdWxBZGQoZmxhZyBhSXNRTmFOLCBmbGFnIGFJc1NOYU4sIGZsYWcgYklzUU5hTiwgZmxhZyBiSXNTTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgY0lzUU5hTiwgZmxhZyBjSXNTTmFOLCBmbGFnIGluZnplcm8gU1RBVFVTX1BBUkFNKQoreworICAgIC8qIEZvciBBUk0sIHRoZSAoaW5mLHplcm8scW5hbikgY2FzZSBzZXRzIEludmFsaWRPcCBhbmQgcmV0dXJucworICAgICAqIHRoZSBkZWZhdWx0IE5hTgorICAgICAqLworICAgIGlmIChpbmZ6ZXJvICYmIGNJc1FOYU4pIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisKKyAgICAvKiBUaGlzIGxvb2tzIGRpZmZlcmVudCBmcm9tIHRoZSBBUk0gQVJNIHBzZXVkb2NvZGUsIGJlY2F1c2UgdGhlIEFSTSBBUk0KKyAgICAgKiBwdXRzIHRoZSBvcGVyYW5kcyB0byBhIGZ1c2VkIG1hYyBvcGVyYXRpb24gKGEqYikrYyBpbiB0aGUgb3JkZXIgYyxhLGIuCisgICAgICovCisgICAgaWYgKGNJc1NOYU4pIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIGlmIChhSXNTTmFOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoYklzU05hTikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGNJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIGlmIChhSXNRTmFOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKyNlbGlmIGRlZmluZWQoVEFSR0VUX01JUFMpCitzdGF0aWMgaW50IHBpY2tOYU5NdWxBZGQoZmxhZyBhSXNRTmFOLCBmbGFnIGFJc1NOYU4sIGZsYWcgYklzUU5hTiwgZmxhZyBiSXNTTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgY0lzUU5hTiwgZmxhZyBjSXNTTmFOLCBmbGFnIGluZnplcm8gU1RBVFVTX1BBUkFNKQoreworICAgIC8qIEZvciBNSVBTLCB0aGUgKGluZix6ZXJvLHFuYW4pIGNhc2Ugc2V0cyBJbnZhbGlkT3AgYW5kIHJldHVybnMKKyAgICAgKiB0aGUgZGVmYXVsdCBOYU4KKyAgICAgKi8KKyAgICBpZiAoaW5memVybykgeworICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKworICAgIC8qIFByZWZlciBzTmFOIG92ZXIgcU5hTiwgaW4gdGhlIGEsIGIsIGMgb3JkZXIuICovCisgICAgaWYgKGFJc1NOYU4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChiSXNTTmFOKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoY0lzU05hTikgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9IGVsc2UgaWYgKGFJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChiSXNRTmFOKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KKyNlbGlmIGRlZmluZWQoVEFSR0VUX1BQQykKK3N0YXRpYyBpbnQgcGlja05hTk11bEFkZChmbGFnIGFJc1FOYU4sIGZsYWcgYUlzU05hTiwgZmxhZyBiSXNRTmFOLCBmbGFnIGJJc1NOYU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyBjSXNRTmFOLCBmbGFnIGNJc1NOYU4sIGZsYWcgaW5memVybyBTVEFUVVNfUEFSQU0pCit7CisgICAgLyogRm9yIFBQQywgdGhlIChpbmYsemVybyxxbmFuKSBjYXNlIHNldHMgSW52YWxpZE9wLCBidXQgd2UgcHJlZmVyCisgICAgICogdG8gcmV0dXJuIGFuIGlucHV0IE5hTiBpZiB3ZSBoYXZlIG9uZSAoaWUgYykgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZworICAgICAqIGEgZGVmYXVsdCBOYU4KKyAgICAgKi8KKyAgICBpZiAoaW5memVybykgeworICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIC8qIElmIGZSQSBpcyBhIE5hTiByZXR1cm4gaXQ7IG90aGVyd2lzZSBpZiBmUkIgaXMgYSBOYU4gcmV0dXJuIGl0OworICAgICAqIG90aGVyd2lzZSByZXR1cm4gZlJDLiBOb3RlIHRoYXQgbXVsYWRkIG9uIFBQQyBpcyAoZlJBICogZlJDKSArIGZyQgorICAgICAqLworICAgIGlmIChhSXNTTmFOIHx8IGFJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChjSXNTTmFOIHx8IGNJc1FOYU4pIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2Vsc2UKKy8qIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogcHJlZmVyIGEgdG8gYiB0byBjLgorICogVGhpcyBpcyB1bmxpa2VseSB0byBhY3R1YWxseSBtYXRjaCBhbnkgcmVhbCBpbXBsZW1lbnRhdGlvbi4KKyAqLworc3RhdGljIGludCBwaWNrTmFOTXVsQWRkKGZsYWcgYUlzUU5hTiwgZmxhZyBhSXNTTmFOLCBmbGFnIGJJc1FOYU4sIGZsYWcgYklzU05hTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnIGNJc1FOYU4sIGZsYWcgY0lzU05hTiwgZmxhZyBpbmZ6ZXJvIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpZiAoYUlzU05hTiB8fCBhSXNRTmFOKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoYklzU05hTiB8fCBiSXNRTmFOKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAyOworICAgIH0KK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGFrZXMgdHdvIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLCBvbmUgb2Ygd2hpY2gKK3wgaXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgZWl0aGVyIGBhJyBvciBgYicgaXMgYQorfCBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQzMiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0pCit7CisgICAgZmxhZyBhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLCBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOOworICAgIGZsYWcgYUlzTGFyZ2VyU2lnbmlmaWNhbmQ7CisgICAgdWludDMyX3QgYXYsIGJ2OworCisgICAgYUlzUXVpZXROYU4gPSBmbG9hdDMyX2lzX3F1aWV0X25hbiggYSApOworICAgIGFJc1NpZ25hbGluZ05hTiA9IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYSApOworICAgIGJJc1F1aWV0TmFOID0gZmxvYXQzMl9pc19xdWlldF9uYW4oIGIgKTsKKyAgICBiSXNTaWduYWxpbmdOYU4gPSBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGIgKTsKKyAgICBhdiA9IGZsb2F0MzJfdmFsKGEpOworICAgIGJ2ID0gZmxvYXQzMl92YWwoYik7CisKKyAgICBpZiAoIGFJc1NpZ25hbGluZ05hTiB8IGJJc1NpZ25hbGluZ05hTiApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoIFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSApCisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworCisgICAgaWYgKCh1aW50MzJfdCkoYXY8PDEpIDwgKHVpbnQzMl90KShidjw8MSkpIHsKKyAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQgPSAwOworICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KShidjw8MSkgPCAodWludDMyX3QpKGF2PDwxKSkgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQgPSAoYXYgPCBidikgPyAxIDogMDsKKyAgICB9CisKKyAgICBpZiAocGlja05hTihhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLCBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgIGFJc0xhcmdlclNpZ25pZmljYW5kKSkgeworICAgICAgICByZXR1cm4gZmxvYXQzMl9tYXliZV9zaWxlbmNlX25hbihiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmxvYXQzMl9tYXliZV9zaWxlbmNlX25hbihhKTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyB0aHJlZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScsIGBiJyBhbmQgYGMnLCBvbmUgb2YKK3wgd2hpY2ggaXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgYW55IG9mICBgYScsCit8IGBiJyBvciBgYycgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorfCBUaGUgaW5wdXQgaW5memVybyBpbmRpY2F0ZXMgd2hldGhlciBhKmIgd2FzIDAqaW5mIG9yIGluZiowIChpbiB3aGljaCBjYXNlCit8IG9idmlvdXNseSBjIGlzIGEgTmFOLCBhbmQgd2hldGhlciB0byBwcm9wYWdhdGUgYyBvciBzb21lIG90aGVyIE5hTiBpcworfCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0MzIgcHJvcGFnYXRlRmxvYXQzMk11bEFkZE5hTihmbG9hdDMyIGEsIGZsb2F0MzIgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQzMiBjLCBmbGFnIGluZnplcm8gU1RBVFVTX1BBUkFNKQoreworICAgIGZsYWcgYUlzUXVpZXROYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzUXVpZXROYU4sIGJJc1NpZ25hbGluZ05hTiwKKyAgICAgICAgY0lzUXVpZXROYU4sIGNJc1NpZ25hbGluZ05hTjsKKyAgICBpbnQgd2hpY2g7CisKKyAgICBhSXNRdWlldE5hTiA9IGZsb2F0MzJfaXNfcXVpZXRfbmFuKGEpOworICAgIGFJc1NpZ25hbGluZ05hTiA9IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbihhKTsKKyAgICBiSXNRdWlldE5hTiA9IGZsb2F0MzJfaXNfcXVpZXRfbmFuKGIpOworICAgIGJJc1NpZ25hbGluZ05hTiA9IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbihiKTsKKyAgICBjSXNRdWlldE5hTiA9IGZsb2F0MzJfaXNfcXVpZXRfbmFuKGMpOworICAgIGNJc1NpZ25hbGluZ05hTiA9IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbihjKTsKKworICAgIGlmIChhSXNTaWduYWxpbmdOYU4gfCBiSXNTaWduYWxpbmdOYU4gfCBjSXNTaWduYWxpbmdOYU4pIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgIH0KKworICAgIHdoaWNoID0gcGlja05hTk11bEFkZChhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjSXNRdWlldE5hTiwgY0lzU2lnbmFsaW5nTmFOLCBpbmZ6ZXJvIFNUQVRVU19WQVIpOworCisgICAgaWYgKFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBjaGVjayBpcyBhZnRlciBwaWNrTmFOTXVsQWRkIHNvIHRoYXQgZnVuY3Rpb24KKyAgICAgICAgICogaGFzIGFuIG9wcG9ydHVuaXR5IHRvIHNldCB0aGUgSW52YWxpZCBmbGFnLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorCisgICAgc3dpdGNoICh3aGljaCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfbWF5YmVfc2lsZW5jZV9uYW4oYSk7CisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZmxvYXQzMl9tYXliZV9zaWxlbmNlX25hbihiKTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBmbG9hdDMyX21heWJlX3NpbGVuY2VfbmFuKGMpOworICAgIGNhc2UgMzoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmxvYXQzMl9kZWZhdWx0X25hbjsKKyAgICB9Cit9CisKKyNpZmRlZiBOT19TSUdOQUxJTkdfTkFOUworaW50IGZsb2F0NjRfaXNfcXVpZXRfbmFuKGZsb2F0NjQgYV8pCit7CisgICAgcmV0dXJuIGZsb2F0NjRfaXNfYW55X25hbihhXyk7Cit9CisKK2ludCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oZmxvYXQ2NCBhXykKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbHNlCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBhIHF1aWV0Cit8IE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0NjRfaXNfcXVpZXRfbmFuKCBmbG9hdDY0IGFfICkKK3sKKyAgICB1aW50NjRfdCBhID0gZmxvYXQ2NF92YWwoYV8pOworI2lmIFNOQU5fQklUX0lTX09ORQorICAgIHJldHVybgorICAgICAgICAgICAoICggKCBhPj41MSApICYgMHhGRkYgKSA9PSAweEZGRSApCisgICAgICAgICYmICggYSAmIExJVDY0KCAweDAwMDdGRkZGRkZGRkZGRkYgKSApOworI2Vsc2UKKyAgICByZXR1cm4gKCBMSVQ2NCggMHhGRkYwMDAwMDAwMDAwMDAwICkgPD0gKHVpbnQ2NF90KSAoIGE8PDEgKSApOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEgc2lnbmFsaW5nCit8IE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggZmxvYXQ2NCBhXyApCit7CisgICAgdWludDY0X3QgYSA9IGZsb2F0NjRfdmFsKGFfKTsKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4gKCBMSVQ2NCggMHhGRkYwMDAwMDAwMDAwMDAwICkgPD0gKHVpbnQ2NF90KSAoIGE8PDEgKSApOworI2Vsc2UKKyAgICByZXR1cm4KKyAgICAgICAgICAgKCAoICggYT4+NTEgKSAmIDB4RkZGICkgPT0gMHhGRkUgKQorICAgICAgICAmJiAoIGEgJiBMSVQ2NCggMHgwMDA3RkZGRkZGRkZGRkZGICkgKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIGEgcXVpZXQgTmFOIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIGBhJyBpcyBhCit8IHNpZ25hbGluZyBOYU47IG90aGVyd2lzZSByZXR1cm5zIGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQ2NCBmbG9hdDY0X21heWJlX3NpbGVuY2VfbmFuKCBmbG9hdDY0IGFfICkKK3sKKyAgICBpZiAoZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKGFfKSkgeworI2lmIFNOQU5fQklUX0lTX09ORQorIyAgaWYgZGVmaW5lZChUQVJHRVRfTUlQUykgfHwgZGVmaW5lZChUQVJHRVRfU0g0KSB8fCBkZWZpbmVkKFRBUkdFVF9VTklDT1JFMzIpCisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworIyAgZWxzZQorIyAgICBlcnJvciBSdWxlcyBmb3Igc2lsZW5jaW5nIGEgc2lnbmFsaW5nIE5hTiBhcmUgdGFyZ2V0LXNwZWNpZmljCisjICBlbmRpZgorI2Vsc2UKKyAgICAgICAgdWludDY0X3QgYSA9IGZsb2F0NjRfdmFsKGFfKTsKKyAgICAgICAgYSB8PSBMSVQ2NCggMHgwMDA4MDAwMDAwMDAwMDAwICk7CisgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0NjQoYSk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGFfOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgTmFOCit8IGBhJyB0byB0aGUgY2Fub25pY2FsIE5hTiBmb3JtYXQuICBJZiBgYScgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZAorfCBleGNlcHRpb24gaXMgcmFpc2VkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29tbW9uTmFOVCBmbG9hdDY0VG9Db21tb25OYU4oIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0pCit7CisgICAgY29tbW9uTmFOVCB6OworCisgICAgaWYgKCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKSApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgei5zaWduID0gZmxvYXQ2NF92YWwoYSk+PjYzOworICAgIHoubG93ID0gMDsKKyAgICB6LmhpZ2ggPSBmbG9hdDY0X3ZhbChhKTw8MTI7CisgICAgcmV0dXJuIHo7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgY2Fub25pY2FsIE5hTiBgYScgdG8gdGhlIGRvdWJsZS0KK3wgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0NjQgY29tbW9uTmFOVG9GbG9hdDY0KCBjb21tb25OYU5UIGEgU1RBVFVTX1BBUkFNKQoreworICAgIHVpbnQ2NF90IG1hbnRpc3NhID0gYS5oaWdoPj4xMjsKKworICAgIGlmICggU1RBVFVTKGRlZmF1bHRfbmFuX21vZGUpICkgeworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisKKyAgICBpZiAoIG1hbnRpc3NhICkKKyAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NCgKKyAgICAgICAgICAgICAgKCAoICh1aW50NjRfdCkgYS5zaWduICk8PDYzICkKKyAgICAgICAgICAgIHwgTElUNjQoIDB4N0ZGMDAwMDAwMDAwMDAwMCApCisgICAgICAgICAgICB8ICggYS5oaWdoPj4xMiApKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGFrZXMgdHdvIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLCBvbmUgb2Ygd2hpY2gKK3wgaXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgZWl0aGVyIGBhJyBvciBgYicgaXMgYQorfCBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQ2NCBwcm9wYWdhdGVGbG9hdDY0TmFOKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiBTVEFUVVNfUEFSQU0pCit7CisgICAgZmxhZyBhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLCBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOOworICAgIGZsYWcgYUlzTGFyZ2VyU2lnbmlmaWNhbmQ7CisgICAgdWludDY0X3QgYXYsIGJ2OworCisgICAgYUlzUXVpZXROYU4gPSBmbG9hdDY0X2lzX3F1aWV0X25hbiggYSApOworICAgIGFJc1NpZ25hbGluZ05hTiA9IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggYSApOworICAgIGJJc1F1aWV0TmFOID0gZmxvYXQ2NF9pc19xdWlldF9uYW4oIGIgKTsKKyAgICBiSXNTaWduYWxpbmdOYU4gPSBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGIgKTsKKyAgICBhdiA9IGZsb2F0NjRfdmFsKGEpOworICAgIGJ2ID0gZmxvYXQ2NF92YWwoYik7CisKKyAgICBpZiAoIGFJc1NpZ25hbGluZ05hTiB8IGJJc1NpZ25hbGluZ05hTiApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoIFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSApCisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworCisgICAgaWYgKCh1aW50NjRfdCkoYXY8PDEpIDwgKHVpbnQ2NF90KShidjw8MSkpIHsKKyAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQgPSAwOworICAgIH0gZWxzZSBpZiAoKHVpbnQ2NF90KShidjw8MSkgPCAodWludDY0X3QpKGF2PDwxKSkgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQgPSAoYXYgPCBidikgPyAxIDogMDsKKyAgICB9CisKKyAgICBpZiAocGlja05hTihhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLCBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgIGFJc0xhcmdlclNpZ25pZmljYW5kKSkgeworICAgICAgICByZXR1cm4gZmxvYXQ2NF9tYXliZV9zaWxlbmNlX25hbihiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmxvYXQ2NF9tYXliZV9zaWxlbmNlX25hbihhKTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyB0aHJlZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScsIGBiJyBhbmQgYGMnLCBvbmUgb2YKK3wgd2hpY2ggaXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgYW55IG9mICBgYScsCit8IGBiJyBvciBgYycgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorfCBUaGUgaW5wdXQgaW5memVybyBpbmRpY2F0ZXMgd2hldGhlciBhKmIgd2FzIDAqaW5mIG9yIGluZiowIChpbiB3aGljaCBjYXNlCit8IG9idmlvdXNseSBjIGlzIGEgTmFOLCBhbmQgd2hldGhlciB0byBwcm9wYWdhdGUgYyBvciBzb21lIG90aGVyIE5hTiBpcworfCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0NjQgcHJvcGFnYXRlRmxvYXQ2NE11bEFkZE5hTihmbG9hdDY0IGEsIGZsb2F0NjQgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQ2NCBjLCBmbGFnIGluZnplcm8gU1RBVFVTX1BBUkFNKQoreworICAgIGZsYWcgYUlzUXVpZXROYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzUXVpZXROYU4sIGJJc1NpZ25hbGluZ05hTiwKKyAgICAgICAgY0lzUXVpZXROYU4sIGNJc1NpZ25hbGluZ05hTjsKKyAgICBpbnQgd2hpY2g7CisKKyAgICBhSXNRdWlldE5hTiA9IGZsb2F0NjRfaXNfcXVpZXRfbmFuKGEpOworICAgIGFJc1NpZ25hbGluZ05hTiA9IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbihhKTsKKyAgICBiSXNRdWlldE5hTiA9IGZsb2F0NjRfaXNfcXVpZXRfbmFuKGIpOworICAgIGJJc1NpZ25hbGluZ05hTiA9IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbihiKTsKKyAgICBjSXNRdWlldE5hTiA9IGZsb2F0NjRfaXNfcXVpZXRfbmFuKGMpOworICAgIGNJc1NpZ25hbGluZ05hTiA9IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbihjKTsKKworICAgIGlmIChhSXNTaWduYWxpbmdOYU4gfCBiSXNTaWduYWxpbmdOYU4gfCBjSXNTaWduYWxpbmdOYU4pIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgIH0KKworICAgIHdoaWNoID0gcGlja05hTk11bEFkZChhSXNRdWlldE5hTiwgYUlzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNRdWlldE5hTiwgYklzU2lnbmFsaW5nTmFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjSXNRdWlldE5hTiwgY0lzU2lnbmFsaW5nTmFOLCBpbmZ6ZXJvIFNUQVRVU19WQVIpOworCisgICAgaWYgKFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgdGhpcyBjaGVjayBpcyBhZnRlciBwaWNrTmFOTXVsQWRkIHNvIHRoYXQgZnVuY3Rpb24KKyAgICAgICAgICogaGFzIGFuIG9wcG9ydHVuaXR5IHRvIHNldCB0aGUgSW52YWxpZCBmbGFnLgorICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgfQorCisgICAgc3dpdGNoICh3aGljaCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIGZsb2F0NjRfbWF5YmVfc2lsZW5jZV9uYW4oYSk7CisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gZmxvYXQ2NF9tYXliZV9zaWxlbmNlX25hbihiKTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBmbG9hdDY0X21heWJlX3NpbGVuY2VfbmFuKGMpOworICAgIGNhc2UgMzoKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9Cit9CisKKyNpZmRlZiBOT19TSUdOQUxJTkdfTkFOUworaW50IGZsb2F0eDgwX2lzX3F1aWV0X25hbihmbG9hdHg4MCBhXykKK3sKKyAgICByZXR1cm4gZmxvYXR4ODBfaXNfYW55X25hbihhXyk7Cit9CisKK2ludCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKGZsb2F0eDgwIGFfKQoreworICAgIHJldHVybiAwOworfQorI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEKK3wgcXVpZXQgTmFOOyBvdGhlcndpc2UgcmV0dXJucyAwLiBUaGlzIHNsaWdodGx5IGRpZmZlcnMgZnJvbSB0aGUgc2FtZQorfCBmdW5jdGlvbiBmb3Igb3RoZXIgdHlwZXMgYXMgZmxvYXR4ODAgaGFzIGFuIGV4cGxpY2l0IGJpdC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0eDgwX2lzX3F1aWV0X25hbiggZmxvYXR4ODAgYSApCit7CisjaWYgU05BTl9CSVRfSVNfT05FCisgICAgdWludDY0X3QgYUxvdzsKKworICAgIGFMb3cgPSBhLmxvdyAmIH4gTElUNjQoIDB4NDAwMDAwMDAwMDAwMDAwMCApOworICAgIHJldHVybgorICAgICAgICAgICAoICggYS5oaWdoICYgMHg3RkZGICkgPT0gMHg3RkZGICkKKyAgICAgICAgJiYgKHVpbnQ2NF90KSAoIGFMb3c8PDEgKQorICAgICAgICAmJiAoIGEubG93ID09IGFMb3cgKTsKKyNlbHNlCisgICAgcmV0dXJuICggKCBhLmhpZ2ggJiAweDdGRkYgKSA9PSAweDdGRkYgKQorICAgICAgICAmJiAoTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApIDw9ICgodWludDY0X3QpICggYS5sb3c8PDEgKSkpOworI2VuZGlmCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEKK3wgc2lnbmFsaW5nIE5hTjsgb3RoZXJ3aXNlIHJldHVybnMgMC4gVGhpcyBzbGlnaHRseSBkaWZmZXJzIGZyb20gdGhlIHNhbWUKK3wgZnVuY3Rpb24gZm9yIG90aGVyIHR5cGVzIGFzIGZsb2F0eDgwIGhhcyBhbiBleHBsaWNpdCBiaXQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBmbG9hdHg4MCBhICkKK3sKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4gKCAoIGEuaGlnaCAmIDB4N0ZGRiApID09IDB4N0ZGRiApCisgICAgICAgICYmIChMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgPD0gKCh1aW50NjRfdCkgKCBhLmxvdzw8MSApKSk7CisjZWxzZQorICAgIHVpbnQ2NF90IGFMb3c7CisKKyAgICBhTG93ID0gYS5sb3cgJiB+IExJVDY0KCAweDQwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgKCAoIGEuaGlnaCAmIDB4N0ZGRiApID09IDB4N0ZGRiApCisgICAgICAgICYmICh1aW50NjRfdCkgKCBhTG93PDwxICkKKyAgICAgICAgJiYgKCBhLmxvdyA9PSBhTG93ICk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyBhIHF1aWV0IE5hTiBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZQorfCBgYScgaXMgYSBzaWduYWxpbmcgTmFOOyBvdGhlcndpc2UgcmV0dXJucyBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0eDgwIGZsb2F0eDgwX21heWJlX3NpbGVuY2VfbmFuKCBmbG9hdHg4MCBhICkKK3sKKyAgICBpZiAoZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbihhKSkgeworI2lmIFNOQU5fQklUX0lTX09ORQorIyAgaWYgZGVmaW5lZChUQVJHRVRfTUlQUykgfHwgZGVmaW5lZChUQVJHRVRfU0g0KSB8fCBkZWZpbmVkKFRBUkdFVF9VTklDT1JFMzIpCisgICAgICAgIGEubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICBhLmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworIyAgZWxzZQorIyAgICBlcnJvciBSdWxlcyBmb3Igc2lsZW5jaW5nIGEgc2lnbmFsaW5nIE5hTiBhcmUgdGFyZ2V0LXNwZWNpZmljCisjICBlbmRpZgorI2Vsc2UKKyAgICAgICAgYS5sb3cgfD0gTElUNjQoIDB4QzAwMDAwMDAwMDAwMDAwMCApOworICAgICAgICByZXR1cm4gYTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorfCBwb2ludCBOYU4gYGEnIHRvIHRoZSBjYW5vbmljYWwgTmFOIGZvcm1hdC4gIElmIGBhJyBpcyBhIHNpZ25hbGluZyBOYU4sIHRoZQorfCBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBjb21tb25OYU5UIGZsb2F0eDgwVG9Db21tb25OYU4oIGZsb2F0eDgwIGEgU1RBVFVTX1BBUkFNKQoreworICAgIGNvbW1vbk5hTlQgejsKKworICAgIGlmICggZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYSApICkgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICBpZiAoIGEubG93ID4+IDYzICkgeworICAgICAgICB6LnNpZ24gPSBhLmhpZ2ggPj4gMTU7CisgICAgICAgIHoubG93ID0gMDsKKyAgICAgICAgei5oaWdoID0gYS5sb3cgPDwgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB6LnNpZ24gPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoID4+IDE1OworICAgICAgICB6LmxvdyA9IDA7CisgICAgICAgIHouaGlnaCA9IGZsb2F0eDgwX2RlZmF1bHRfbmFuX2xvdyA8PCAxOworICAgIH0KKyAgICByZXR1cm4gejsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBjYW5vbmljYWwgTmFOIGBhJyB0byB0aGUgZXh0ZW5kZWQKK3wgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdHg4MCBjb21tb25OYU5Ub0Zsb2F0eDgwKCBjb21tb25OYU5UIGEgU1RBVFVTX1BBUkFNKQoreworICAgIGZsb2F0eDgwIHo7CisKKyAgICBpZiAoIFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSApIHsKKyAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIHouaGlnaCA9IGZsb2F0eDgwX2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgIHJldHVybiB6OworICAgIH0KKworICAgIGlmIChhLmhpZ2ggPj4gMSkgeworICAgICAgICB6LmxvdyA9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSB8IGEuaGlnaCA+PiAxOworICAgICAgICB6LmhpZ2ggPSAoICggKHVpbnQxNl90KSBhLnNpZ24gKTw8MTUgKSB8IDB4N0ZGRjsKKyAgICB9IGVsc2UgeworICAgICAgICB6LmxvdyA9IGZsb2F0eDgwX2RlZmF1bHRfbmFuX2xvdzsKKyAgICAgICAgei5oaWdoID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaDsKKyAgICB9CisKKyAgICByZXR1cm4gejsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRha2VzIHR3byBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJywgb25lCit8IG9mIHdoaWNoIGlzIGEgTmFOLCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgTmFOIHJlc3VsdC4gIElmIGVpdGhlciBgYScgb3IKK3wgYGInIGlzIGEgc2lnbmFsaW5nIE5hTiwgdGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0eDgwIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbGFnIGFJc1F1aWV0TmFOLCBhSXNTaWduYWxpbmdOYU4sIGJJc1F1aWV0TmFOLCBiSXNTaWduYWxpbmdOYU47CisgICAgZmxhZyBhSXNMYXJnZXJTaWduaWZpY2FuZDsKKworICAgIGFJc1F1aWV0TmFOID0gZmxvYXR4ODBfaXNfcXVpZXRfbmFuKCBhICk7CisgICAgYUlzU2lnbmFsaW5nTmFOID0gZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYSApOworICAgIGJJc1F1aWV0TmFOID0gZmxvYXR4ODBfaXNfcXVpZXRfbmFuKCBiICk7CisgICAgYklzU2lnbmFsaW5nTmFOID0gZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApOworCisgICAgaWYgKCBhSXNTaWduYWxpbmdOYU4gfCBiSXNTaWduYWxpbmdOYU4gKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworCisgICAgaWYgKCBTVEFUVVMoZGVmYXVsdF9uYW5fbW9kZSkgKSB7CisgICAgICAgIGEubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICBhLmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBpZiAoYS5sb3cgPCBiLmxvdykgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IDA7CisgICAgfSBlbHNlIGlmIChiLmxvdyA8IGEubG93KSB7CisgICAgICAgIGFJc0xhcmdlclNpZ25pZmljYW5kID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IChhLmhpZ2ggPCBiLmhpZ2gpID8gMSA6IDA7CisgICAgfQorCisgICAgaWYgKHBpY2tOYU4oYUlzUXVpZXROYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzUXVpZXROYU4sIGJJc1NpZ25hbGluZ05hTiwKKyAgICAgICAgICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCkpIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0eDgwX21heWJlX3NpbGVuY2VfbmFuKGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmbG9hdHg4MF9tYXliZV9zaWxlbmNlX25hbihhKTsKKyAgICB9Cit9CisKKyNpZmRlZiBOT19TSUdOQUxJTkdfTkFOUworaW50IGZsb2F0MTI4X2lzX3F1aWV0X25hbihmbG9hdDEyOCBhXykKK3sKKyAgICByZXR1cm4gZmxvYXQxMjhfaXNfYW55X25hbihhXyk7Cit9CisKK2ludCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKGZsb2F0MTI4IGFfKQoreworICAgIHJldHVybiAwOworfQorI2Vsc2UKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGEgcXVpZXQKK3wgTmFOOyBvdGhlcndpc2UgcmV0dXJucyAwLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQxMjhfaXNfcXVpZXRfbmFuKCBmbG9hdDEyOCBhICkKK3sKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4KKyAgICAgICAgICAgKCAoICggYS5oaWdoPj40NyApICYgMHhGRkZGICkgPT0gMHhGRkZFICkKKyAgICAgICAgJiYgKCBhLmxvdyB8fCAoIGEuaGlnaCAmIExJVDY0KCAweDAwMDA3RkZGRkZGRkZGRkYgKSApICk7CisjZWxzZQorICAgIHJldHVybgorICAgICAgICAgICAoIExJVDY0KCAweEZGRkUwMDAwMDAwMDAwMDAgKSA8PSAodWludDY0X3QpICggYS5oaWdoPDwxICkgKQorICAgICAgICAmJiAoIGEubG93IHx8ICggYS5oaWdoICYgTElUNjQoIDB4MDAwMEZGRkZGRkZGRkZGRiApICkgKTsKKyNlbmRpZgorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBhCit8IHNpZ25hbGluZyBOYU47IG90aGVyd2lzZSByZXR1cm5zIDAuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBmbG9hdDEyOCBhICkKK3sKKyNpZiBTTkFOX0JJVF9JU19PTkUKKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBMSVQ2NCggMHhGRkZFMDAwMDAwMDAwMDAwICkgPD0gKHVpbnQ2NF90KSAoIGEuaGlnaDw8MSApICkKKyAgICAgICAgJiYgKCBhLmxvdyB8fCAoIGEuaGlnaCAmIExJVDY0KCAweDAwMDBGRkZGRkZGRkZGRkYgKSApICk7CisjZWxzZQorICAgIHJldHVybgorICAgICAgICAgICAoICggKCBhLmhpZ2g+PjQ3ICkgJiAweEZGRkYgKSA9PSAweEZGRkUgKQorICAgICAgICAmJiAoIGEubG93IHx8ICggYS5oaWdoICYgTElUNjQoIDB4MDAwMDdGRkZGRkZGRkZGRiApICkgKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIGEgcXVpZXQgTmFOIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIGBhJyBpcworfCBhIHNpZ25hbGluZyBOYU47IG90aGVyd2lzZSByZXR1cm5zIGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQxMjggZmxvYXQxMjhfbWF5YmVfc2lsZW5jZV9uYW4oIGZsb2F0MTI4IGEgKQoreworICAgIGlmIChmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKGEpKSB7CisjaWYgU05BTl9CSVRfSVNfT05FCisjICBpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKSB8fCBkZWZpbmVkKFRBUkdFVF9TSDQpIHx8IGRlZmluZWQoVEFSR0VUX1VOSUNPUkUzMikKKyAgICAgICAgYS5sb3cgPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIGEuaGlnaCA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2hpZ2g7CisjICBlbHNlCisjICAgIGVycm9yIFJ1bGVzIGZvciBzaWxlbmNpbmcgYSBzaWduYWxpbmcgTmFOIGFyZSB0YXJnZXQtc3BlY2lmaWMKKyMgIGVuZGlmCisjZWxzZQorICAgICAgICBhLmhpZ2ggfD0gTElUNjQoIDB4MDAwMDgwMDAwMDAwMDAwMCApOworICAgICAgICByZXR1cm4gYTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IE5hTgorfCBgYScgdG8gdGhlIGNhbm9uaWNhbCBOYU4gZm9ybWF0LiAgSWYgYGEnIGlzIGEgc2lnbmFsaW5nIE5hTiwgdGhlIGludmFsaWQKK3wgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbW1vbk5hTlQgZmxvYXQxMjhUb0NvbW1vbk5hTiggZmxvYXQxMjggYSBTVEFUVVNfUEFSQU0pCit7CisgICAgY29tbW9uTmFOVCB6OworCisgICAgaWYgKCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBhICkgKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgIHouc2lnbiA9IGEuaGlnaD4+NjM7CisgICAgc2hvcnRTaGlmdDEyOExlZnQoIGEuaGlnaCwgYS5sb3csIDE2LCAmei5oaWdoLCAmei5sb3cgKTsKKyAgICByZXR1cm4gejsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBjYW5vbmljYWwgTmFOIGBhJyB0byB0aGUgcXVhZHJ1cGxlLQorfCBwcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQxMjggY29tbW9uTmFOVG9GbG9hdDEyOCggY29tbW9uTmFOVCBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbG9hdDEyOCB6OworCisgICAgaWYgKCBTVEFUVVMoZGVmYXVsdF9uYW5fbW9kZSkgKSB7CisgICAgICAgIHoubG93ID0gZmxvYXQxMjhfZGVmYXVsdF9uYW5fbG93OworICAgICAgICB6LmhpZ2ggPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICByZXR1cm4gejsKKyAgICB9CisKKyAgICBzaGlmdDEyOFJpZ2h0KCBhLmhpZ2gsIGEubG93LCAxNiwgJnouaGlnaCwgJnoubG93ICk7CisgICAgei5oaWdoIHw9ICggKCAodWludDY0X3QpIGEuc2lnbiApPDw2MyApIHwgTElUNjQoIDB4N0ZGRjAwMDAwMDAwMDAwMCApOworICAgIHJldHVybiB6OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGFrZXMgdHdvIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLCBvbmUgb2YKK3wgd2hpY2ggaXMgYSBOYU4sIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBOYU4gcmVzdWx0LiAgSWYgZWl0aGVyIGBhJyBvcgorfCBgYicgaXMgYSBzaWduYWxpbmcgTmFOLCB0aGUgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQxMjggcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGZsb2F0MTI4IGEsIGZsb2F0MTI4IGIgU1RBVFVTX1BBUkFNKQoreworICAgIGZsYWcgYUlzUXVpZXROYU4sIGFJc1NpZ25hbGluZ05hTiwgYklzUXVpZXROYU4sIGJJc1NpZ25hbGluZ05hTjsKKyAgICBmbGFnIGFJc0xhcmdlclNpZ25pZmljYW5kOworCisgICAgYUlzUXVpZXROYU4gPSBmbG9hdDEyOF9pc19xdWlldF9uYW4oIGEgKTsKKyAgICBhSXNTaWduYWxpbmdOYU4gPSBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBhICk7CisgICAgYklzUXVpZXROYU4gPSBmbG9hdDEyOF9pc19xdWlldF9uYW4oIGIgKTsKKyAgICBiSXNTaWduYWxpbmdOYU4gPSBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBiICk7CisKKyAgICBpZiAoIGFJc1NpZ25hbGluZ05hTiB8IGJJc1NpZ25hbGluZ05hTiApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoIFNUQVRVUyhkZWZhdWx0X25hbl9tb2RlKSApIHsKKyAgICAgICAgYS5sb3cgPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIGEuaGlnaCA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIGlmIChsdDEyOChhLmhpZ2g8PDEsIGEubG93LCBiLmhpZ2g8PDEsIGIubG93KSkgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IDA7CisgICAgfSBlbHNlIGlmIChsdDEyOChiLmhpZ2g8PDEsIGIubG93LCBhLmhpZ2g8PDEsIGEubG93KSkgeworICAgICAgICBhSXNMYXJnZXJTaWduaWZpY2FuZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQgPSAoYS5oaWdoIDwgYi5oaWdoKSA/IDEgOiAwOworICAgIH0KKworICAgIGlmIChwaWNrTmFOKGFJc1F1aWV0TmFOLCBhSXNTaWduYWxpbmdOYU4sIGJJc1F1aWV0TmFOLCBiSXNTaWduYWxpbmdOYU4sCisgICAgICAgICAgICAgICAgYUlzTGFyZ2VyU2lnbmlmaWNhbmQpKSB7CisgICAgICAgIHJldHVybiBmbG9hdDEyOF9tYXliZV9zaWxlbmNlX25hbihiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmxvYXQxMjhfbWF5YmVfc2lsZW5jZV9uYW4oYSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2ZwdS9zb2Z0ZmxvYXQuYyBiL2FuZHJvaWQvcWVtdTEvZnB1L3NvZnRmbG9hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZGE2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2ZwdS9zb2Z0ZmxvYXQuYwpAQCAtMCwwICsxLDY5MDkgQEAKKy8qCisgKiBRRU1VIGZsb2F0IHN1cHBvcnQKKyAqCisgKiBEZXJpdmVkIGZyb20gU29mdEZsb2F0LgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIEMgc291cmNlIGZpbGUgaXMgcGFydCBvZiB0aGUgU29mdEZsb2F0IElFQy9JRUVFIEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMKK1BhY2thZ2UsIFJlbGVhc2UgMmIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL3d3dy5jcy5iZXJrZWxleS5lZHUvfmpoYXVzZXIvCithcml0aG1ldGljL1NvZnRGbG9hdC5odG1sJy4KKworVEhJUyBTT0ZUV0FSRSBJUyBESVNUUklCVVRFRCBBUyBJUywgRk9SIEZSRUUuICBBbHRob3VnaCByZWFzb25hYmxlIGVmZm9ydCBoYXMKK2JlZW4gbWFkZSB0byBhdm9pZCBpdCwgVEhJUyBTT0ZUV0FSRSBNQVkgQ09OVEFJTiBGQVVMVFMgVEhBVCBXSUxMIEFUIFRJTUVTCitSRVNVTFQgSU4gSU5DT1JSRUNUIEJFSEFWSU9SLiAgVVNFIE9GIFRISVMgU09GVFdBUkUgSVMgUkVTVFJJQ1RFRCBUTyBQRVJTT05TCitBTkQgT1JHQU5JWkFUSU9OUyBXSE8gQ0FOIEFORCBXSUxMIFRBS0UgRlVMTCBSRVNQT05TSUJJTElUWSBGT1IgQUxMIExPU1NFUywKK0NPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBUSEVZIElOQ1VSIERVRSBUTyBUSEUgU09GVFdBUkUsIEFORCBXSE8gRlVSVEhFUk1PUkUKK0VGRkVDVElWRUxZIElOREVNTklGWSBKT0hOIEhBVVNFUiBBTkQgVEhFIElOVEVSTkFUSU9OQUwgQ09NUFVURVIgU0NJRU5DRQorSU5TVElUVVRFIChwb3NzaWJseSB2aWEgc2ltaWxhciBsZWdhbCB3YXJuaW5nKSBBR0FJTlNUIEFMTCBMT1NTRVMsIENPU1RTLCBPUgorT1RIRVIgUFJPQkxFTVMgSU5DVVJSRUQgQlkgVEhFSVIgQ1VTVE9NRVJTIEFORCBDTElFTlRTIERVRSBUTyBUSEUgU09GVFdBUkUuCisKK0Rlcml2YXRpdmUgd29ya3MgYXJlIGFjY2VwdGFibGUsIGV2ZW4gZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMsIHNvIGxvbmcgYXMKKygxKSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBkZXJpdmF0aXZlIHdvcmsgaW5jbHVkZXMgcHJvbWluZW50IG5vdGljZSB0aGF0Cit0aGUgd29yayBpcyBkZXJpdmF0aXZlLCBhbmQgKDIpIHRoZSBzb3VyY2UgY29kZSBpbmNsdWRlcyBwcm9taW5lbnQgbm90aWNlIHdpdGgKK3RoZXNlIGZvdXIgcGFyYWdyYXBocyBmb3IgdGhvc2UgcGFydHMgb2YgdGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIHNvZnRmbG9hdCAoYW5kIGluIHBhcnRpY3VsYXIgdGhlIGNvZGUgaW4gc29mdGZsb2F0LXNwZWNpYWxpemUuaCkgaXMKKyAqIHRhcmdldC1kZXBlbmRlbnQgYW5kIG5lZWRzIHRoZSBUQVJHRVRfKiBtYWNyb3MuCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImZwdS9zb2Z0ZmxvYXQuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFByaW1pdGl2ZSBhcml0aG1ldGljIGZ1bmN0aW9ucywgaW5jbHVkaW5nIG11bHRpLXdvcmQgYXJpdGhtZXRpYywgYW5kCit8IGRpdmlzaW9uIGFuZCBzcXVhcmUgcm9vdCBhcHByb3hpbWF0aW9ucy4gIChDYW4gYmUgc3BlY2lhbGl6ZWQgdG8gdGFyZ2V0IGlmCit8IGRlc2lyZWQuKQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgInNvZnRmbG9hdC1tYWNyb3MuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IEZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgdG8gZGV0ZXJtaW5lOiAgKDEpIHdoZXRoZXIgdGluaW5lc3MgZm9yIHVuZGVyZmxvdworfCBpcyBkZXRlY3RlZCBiZWZvcmUgb3IgYWZ0ZXIgcm91bmRpbmcgYnkgZGVmYXVsdCwgKDIpIHdoYXQgKGlmIGFueXRoaW5nKQorfCBoYXBwZW5zIHdoZW4gZXhjZXB0aW9ucyBhcmUgcmFpc2VkLCAoMykgaG93IHNpZ25hbGluZyBOYU5zIGFyZSBkaXN0aW5ndWlzaGVkCit8IGZyb20gcXVpZXQgTmFOcywgKDQpIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCBxdWlldCBOYU5zLCBhbmQgKDUpIGhvdyBOYU5zCit8IGFyZSBwcm9wYWdhdGVkIGZyb20gZnVuY3Rpb24gaW5wdXRzIHRvIG91dHB1dC4gIFRoZXNlIGRldGFpbHMgYXJlIHRhcmdldC0KK3wgc3BlY2lmaWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAic29mdGZsb2F0LXNwZWNpYWxpemUuaCIKKwordm9pZCBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShpbnQgdmFsIFNUQVRVU19QQVJBTSkKK3sKKyAgICBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPSB2YWw7Cit9CisKK3ZvaWQgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncyhpbnQgdmFsIFNUQVRVU19QQVJBTSkKK3sKKyAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSA9IHZhbDsKK30KKwordm9pZCBzZXRfZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uKGludCB2YWwgU1RBVFVTX1BBUkFNKQoreworICAgIFNUQVRVUyhmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24pID0gdmFsOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGUgaGFsZi1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgdWludDMyX3QgZXh0cmFjdEZsb2F0MTZGcmFjKGZsb2F0MTYgYSkKK3sKKyAgICByZXR1cm4gZmxvYXQxNl92YWwoYSkgJiAweDNmZjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhlIGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIGludF9mYXN0MTZfdCBleHRyYWN0RmxvYXQxNkV4cChmbG9hdDE2IGEpCit7CisgICAgcmV0dXJuIChmbG9hdDE2X3ZhbChhKSA+PiAxMCkgJiAweDFmOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgc2lnbiBiaXQgb2YgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxhZyBleHRyYWN0RmxvYXQxNlNpZ24oZmxvYXQxNiBhKQoreworICAgIHJldHVybiBmbG9hdDE2X3ZhbChhKT4+MTU7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyBhIDY0LWJpdCBmaXhlZC1wb2ludCB2YWx1ZSBgYWJzWicgd2l0aCBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRzIDYKK3wgYW5kIDcsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXJseSByb3VuZGVkIDMyLWJpdCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlCit8IGlucHV0LiAgSWYgYHpTaWduJyBpcyAxLCB0aGUgaW5wdXQgaXMgbmVnYXRlZCBiZWZvcmUgYmVpbmcgY29udmVydGVkIHRvIGFuCit8IGludGVnZXIuICBCaXQgNjMgb2YgYGFic1onIG11c3QgYmUgemVyby4gIE9yZGluYXJpbHksIHRoZSBmaXhlZC1wb2ludCBpbnB1dAorfCBpcyBzaW1wbHkgcm91bmRlZCB0byBhbiBpbnRlZ2VyLCB3aXRoIHRoZSBpbmV4YWN0IGV4Y2VwdGlvbiByYWlzZWQgaWYgdGhlCit8IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGFuIGludGVnZXIuICBIb3dldmVyLCBpZiB0aGUgZml4ZWQtCit8IHBvaW50IGlucHV0IGlzIHRvbyBsYXJnZSwgdGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlIGxhcmdlc3QKK3wgcG9zaXRpdmUgb3IgbmVnYXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludDMyIHJvdW5kQW5kUGFja0ludDMyKCBmbGFnIHpTaWduLCB1aW50NjRfdCBhYnNaIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ4IHJvdW5kaW5nTW9kZTsKKyAgICBmbGFnIHJvdW5kTmVhcmVzdEV2ZW47CisgICAgaW50OCByb3VuZEluY3JlbWVudCwgcm91bmRCaXRzOworICAgIGludDMyX3QgejsKKworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgcm91bmRJbmNyZW1lbnQgPSAweDQwOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAweDdGOworICAgICAgICAgICAgaWYgKCB6U2lnbiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcm91bmRCaXRzID0gYWJzWiAmIDB4N0Y7CisgICAgYWJzWiA9ICggYWJzWiArIHJvdW5kSW5jcmVtZW50ICk+Pjc7CisgICAgYWJzWiAmPSB+ICggKCAoIHJvdW5kQml0cyBeIDB4NDAgKSA9PSAwICkgJiByb3VuZE5lYXJlc3RFdmVuICk7CisgICAgeiA9IGFic1o7CisgICAgaWYgKCB6U2lnbiApIHogPSAtIHo7CisgICAgaWYgKCAoIGFic1o+PjMyICkgfHwgKCB6ICYmICggKCB6IDwgMCApIF4gelNpZ24gKSApICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gelNpZ24gPyAoaW50MzJfdCkgMHg4MDAwMDAwMCA6IDB4N0ZGRkZGRkY7CisgICAgfQorICAgIGlmICggcm91bmRCaXRzICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHJldHVybiB6OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyB0aGUgMTI4LWJpdCBmaXhlZC1wb2ludCB2YWx1ZSBmb3JtZWQgYnkgY29uY2F0ZW5hdGluZyBgYWJzWjAnIGFuZAorfCBgYWJzWjEnLCB3aXRoIGJpbmFyeSBwb2ludCBiZXR3ZWVuIGJpdHMgNjMgYW5kIDY0IChiZXR3ZWVuIHRoZSBpbnB1dCB3b3JkcyksCit8IGFuZCByZXR1cm5zIHRoZSBwcm9wZXJseSByb3VuZGVkIDY0LWJpdCBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0LgorfCBJZiBgelNpZ24nIGlzIDEsIHRoZSBpbnB1dCBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlci4KK3wgT3JkaW5hcmlseSwgdGhlIGZpeGVkLXBvaW50IGlucHV0IGlzIHNpbXBseSByb3VuZGVkIHRvIGFuIGludGVnZXIsIHdpdGgKK3wgdGhlIGluZXhhY3QgZXhjZXB0aW9uIHJhaXNlZCBpZiB0aGUgaW5wdXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMKK3wgYW4gaW50ZWdlci4gIEhvd2V2ZXIsIGlmIHRoZSBmaXhlZC1wb2ludCBpbnB1dCBpcyB0b28gbGFyZ2UsIHRoZSBpbnZhbGlkCit8IGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZSBsYXJnZXN0IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXIgaXMKK3wgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQ2NCByb3VuZEFuZFBhY2tJbnQ2NCggZmxhZyB6U2lnbiwgdWludDY0X3QgYWJzWjAsIHVpbnQ2NF90IGFic1oxIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ4IHJvdW5kaW5nTW9kZTsKKyAgICBmbGFnIHJvdW5kTmVhcmVzdEV2ZW4sIGluY3JlbWVudDsKKyAgICBpbnQ2NF90IHo7CisKKyAgICByb3VuZGluZ01vZGUgPSBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSk7CisgICAgcm91bmROZWFyZXN0RXZlbiA9ICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiApOworICAgIGluY3JlbWVudCA9ICggKGludDY0X3QpIGFic1oxIDwgMCApOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApICYmIGFic1oxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSAmJiBhYnNaMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGluY3JlbWVudCApIHsKKyAgICAgICAgKythYnNaMDsKKyAgICAgICAgaWYgKCBhYnNaMCA9PSAwICkgZ290byBvdmVyZmxvdzsKKyAgICAgICAgYWJzWjAgJj0gfiAoICggKHVpbnQ2NF90KSAoIGFic1oxPDwxICkgPT0gMCApICYgcm91bmROZWFyZXN0RXZlbiApOworICAgIH0KKyAgICB6ID0gYWJzWjA7CisgICAgaWYgKCB6U2lnbiApIHogPSAtIHo7CisgICAgaWYgKCB6ICYmICggKCB6IDwgMCApIF4gelNpZ24gKSApIHsKKyBvdmVyZmxvdzoKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgIHpTaWduID8gKGludDY0X3QpIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKQorICAgICAgICAgICAgOiBMSVQ2NCggMHg3RkZGRkZGRkZGRkZGRkZGICk7CisgICAgfQorICAgIGlmICggYWJzWjEgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIGZyYWN0aW9uIGJpdHMgb2YgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgdWludDMyX3QgZXh0cmFjdEZsb2F0MzJGcmFjKCBmbG9hdDMyIGEgKQoreworCisgICAgcmV0dXJuIGZsb2F0MzJfdmFsKGEpICYgMHgwMDdGRkZGRjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBpbnRfZmFzdDE2X3QgZXh0cmFjdEZsb2F0MzJFeHAoZmxvYXQzMiBhKQoreworCisgICAgcmV0dXJuICggZmxvYXQzMl92YWwoYSk+PjIzICkgJiAweEZGOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSBzaWduIGJpdCBvZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBmbGFnIGV4dHJhY3RGbG9hdDMyU2lnbiggZmxvYXQzMiBhICkKK3sKKworICAgIHJldHVybiBmbG9hdDMyX3ZhbChhKT4+MzE7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IElmIGBhJyBpcyBkZW5vcm1hbCBhbmQgd2UgYXJlIGluIGZsdXNoLXRvLXplcm8gbW9kZSB0aGVuIHNldCB0aGUKK3wgaW5wdXQtZGVub3JtYWwgZXhjZXB0aW9uIGFuZCByZXR1cm4gemVyby4gT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHRoZSB2YWx1ZS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBmbG9hdDMyIGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0pCit7CisgICAgaWYgKFNUQVRVUyhmbHVzaF9pbnB1dHNfdG9femVybykpIHsKKyAgICAgICAgaWYgKGV4dHJhY3RGbG9hdDMyRXhwKGEpID09IDAgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKGEpICE9IDApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW5wdXRfZGVub3JtYWwgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gbWFrZV9mbG9hdDMyKGZsb2F0MzJfdmFsKGEpICYgMHg4MDAwMDAwMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBOb3JtYWxpemVzIHRoZSBzdWJub3JtYWwgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSByZXByZXNlbnRlZAorfCBieSB0aGUgZGVub3JtYWxpemVkIHNpZ25pZmljYW5kIGBhU2lnJy4gIFRoZSBub3JtYWxpemVkIGV4cG9uZW50IGFuZAorfCBzaWduaWZpY2FuZCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgekV4cFB0cicgYW5kCit8IGB6U2lnUHRyJywgcmVzcGVjdGl2ZWx5LgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwodWludDMyX3QgYVNpZywgaW50X2Zhc3QxNl90ICp6RXhwUHRyLCB1aW50MzJfdCAqelNpZ1B0cikKK3sKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICBzaGlmdENvdW50ID0gY291bnRMZWFkaW5nWmVyb3MzMiggYVNpZyApIC0gODsKKyAgICAqelNpZ1B0ciA9IGFTaWc8PHNoaWZ0Q291bnQ7CisgICAgKnpFeHBQdHIgPSAxIC0gc2hpZnRDb3VudDsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUGFja3MgdGhlIHNpZ24gYHpTaWduJywgZXhwb25lbnQgYHpFeHAnLCBhbmQgc2lnbmlmaWNhbmQgYHpTaWcnIGludG8gYQorfCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLCByZXR1cm5pbmcgdGhlIHJlc3VsdC4gIEFmdGVyIGJlaW5nCit8IHNoaWZ0ZWQgaW50byB0aGUgcHJvcGVyIHBvc2l0aW9ucywgdGhlIHRocmVlIGZpZWxkcyBhcmUgc2ltcGx5IGFkZGVkCit8IHRvZ2V0aGVyIHRvIGZvcm0gdGhlIHJlc3VsdC4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgaW50ZWdlciBwb3J0aW9uIG9mIGB6U2lnJworfCB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGV4cG9uZW50LiAgU2luY2UgYSBwcm9wZXJseSBub3JtYWxpemVkIHNpZ25pZmljYW5kCit8IHdpbGwgaGF2ZSBhbiBpbnRlZ2VyIHBvcnRpb24gZXF1YWwgdG8gMSwgdGhlIGB6RXhwJyBpbnB1dCBzaG91bGQgYmUgMSBsZXNzCit8IHRoYW4gdGhlIGRlc2lyZWQgcmVzdWx0IGV4cG9uZW50IHdoZW5ldmVyIGB6U2lnJyBpcyBhIGNvbXBsZXRlLCBub3JtYWxpemVkCit8IHNpZ25pZmljYW5kLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxvYXQzMiBwYWNrRmxvYXQzMihmbGFnIHpTaWduLCBpbnRfZmFzdDE2X3QgekV4cCwgdWludDMyX3QgelNpZykKK3sKKworICAgIHJldHVybiBtYWtlX2Zsb2F0MzIoCisgICAgICAgICAgKCAoICh1aW50MzJfdCkgelNpZ24gKTw8MzEgKSArICggKCAodWludDMyX3QpIHpFeHAgKTw8MjMgKSArIHpTaWcpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyBhbiBhYnN0cmFjdCBmbG9hdGluZy1wb2ludCB2YWx1ZSBoYXZpbmcgc2lnbiBgelNpZ24nLCBleHBvbmVudCBgekV4cCcsCit8IGFuZCBzaWduaWZpY2FuZCBgelNpZycsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXIgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy0KK3wgcG9pbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBPcmRpbmFyaWx5LCB0aGUgYWJzdHJhY3QKK3wgdmFsdWUgaXMgc2ltcGx5IHJvdW5kZWQgYW5kIHBhY2tlZCBpbnRvIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZvcm1hdCwgd2l0aAorfCB0aGUgaW5leGFjdCBleGNlcHRpb24gcmFpc2VkIGlmIHRoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKK3wgZXhhY3RseS4gIEhvd2V2ZXIsIGlmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gbGFyZ2UsIHRoZSBvdmVyZmxvdyBhbmQKK3wgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgYW5kIGFuIGluZmluaXR5IG9yIG1heGltYWwgZmluaXRlIHZhbHVlIGlzCit8IHJldHVybmVkLiAgSWYgdGhlIGFic3RyYWN0IHZhbHVlIGlzIHRvbyBzbWFsbCwgdGhlIGlucHV0IHZhbHVlIGlzIHJvdW5kZWQgdG8KK3wgYSBzdWJub3JtYWwgbnVtYmVyLCBhbmQgdGhlIHVuZGVyZmxvdyBhbmQgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgaWYKK3wgdGhlIGFic3RyYWN0IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgc3Vibm9ybWFsIHNpbmdsZS0KK3wgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4KK3wgICAgIFRoZSBpbnB1dCBzaWduaWZpY2FuZCBgelNpZycgaGFzIGl0cyBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRzIDMwCit8IGFuZCAyOSwgd2hpY2ggaXMgNyBiaXRzIHRvIHRoZSBsZWZ0IG9mIHRoZSB1c3VhbCBsb2NhdGlvbi4gIFRoaXMgc2hpZnRlZAorfCBzaWduaWZpY2FuZCBtdXN0IGJlIG5vcm1hbGl6ZWQgb3Igc21hbGxlci4gIElmIGB6U2lnJyBpcyBub3Qgbm9ybWFsaXplZCwKK3wgYHpFeHAnIG11c3QgYmUgMDsgaW4gdGhhdCBjYXNlLCB0aGUgcmVzdWx0IHJldHVybmVkIGlzIGEgc3Vibm9ybWFsIG51bWJlciwKK3wgYW5kIGl0IG11c3Qgbm90IHJlcXVpcmUgcm91bmRpbmcuICBJbiB0aGUgdXN1YWwgY2FzZSB0aGF0IGB6U2lnJyBpcworfCBub3JtYWxpemVkLCBgekV4cCcgbXVzdCBiZSAxIGxlc3MgdGhhbiB0aGUgYGB0cnVlJycgZmxvYXRpbmctcG9pbnQgZXhwb25lbnQuCit8IFRoZSBoYW5kbGluZyBvZiB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGZvbGxvd3MgdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvcgorfCBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0MzIgcm91bmRBbmRQYWNrRmxvYXQzMihmbGFnIHpTaWduLCBpbnRfZmFzdDE2X3QgekV4cCwgdWludDMyX3QgelNpZyBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxhZyByb3VuZE5lYXJlc3RFdmVuOworICAgIGludDggcm91bmRJbmNyZW1lbnQsIHJvdW5kQml0czsKKyAgICBmbGFnIGlzVGlueTsKKworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgcm91bmRJbmNyZW1lbnQgPSAweDQwOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcm91bmRJbmNyZW1lbnQgPSAweDdGOworICAgICAgICAgICAgaWYgKCB6U2lnbiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcm91bmRCaXRzID0gelNpZyAmIDB4N0Y7CisgICAgaWYgKCAweEZEIDw9ICh1aW50MTZfdCkgekV4cCApIHsKKyAgICAgICAgaWYgKCAgICAoIDB4RkQgPCB6RXhwICkKKyAgICAgICAgICAgICB8fCAoICAgICggekV4cCA9PSAweEZEICkKKyAgICAgICAgICAgICAgICAgICYmICggKGludDMyX3QpICggelNpZyArIHJvdW5kSW5jcmVtZW50ICkgPCAwICkgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX292ZXJmbG93IHwgZmxvYXRfZmxhZ19pbmV4YWN0IFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMHhGRiwgLSAoIHJvdW5kSW5jcmVtZW50ID09IDAgKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB6RXhwIDwgMCApIHsKKyAgICAgICAgICAgIGlmIChTVEFUVVMoZmx1c2hfdG9femVybykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoelNpZ24sIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNUaW55ID0KKyAgICAgICAgICAgICAgICAgICAoIFNUQVRVUyhmbG9hdF9kZXRlY3RfdGluaW5lc3MpID09IGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZyApCisgICAgICAgICAgICAgICAgfHwgKCB6RXhwIDwgLTEgKQorICAgICAgICAgICAgICAgIHx8ICggelNpZyArIHJvdW5kSW5jcmVtZW50IDwgMHg4MDAwMDAwMCApOworICAgICAgICAgICAgc2hpZnQzMlJpZ2h0SmFtbWluZyggelNpZywgLSB6RXhwLCAmelNpZyApOworICAgICAgICAgICAgekV4cCA9IDA7CisgICAgICAgICAgICByb3VuZEJpdHMgPSB6U2lnICYgMHg3RjsKKyAgICAgICAgICAgIGlmICggaXNUaW55ICYmIHJvdW5kQml0cyApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX3VuZGVyZmxvdyBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHJvdW5kQml0cyApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICB6U2lnID0gKCB6U2lnICsgcm91bmRJbmNyZW1lbnQgKT4+NzsKKyAgICB6U2lnICY9IH4gKCAoICggcm91bmRCaXRzIF4gMHg0MCApID09IDAgKSAmIHJvdW5kTmVhcmVzdEV2ZW4gKTsKKyAgICBpZiAoIHpTaWcgPT0gMCApIHpFeHAgPSAwOworICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGFrZXMgYW4gYWJzdHJhY3QgZmxvYXRpbmctcG9pbnQgdmFsdWUgaGF2aW5nIHNpZ24gYHpTaWduJywgZXhwb25lbnQgYHpFeHAnLAorfCBhbmQgc2lnbmlmaWNhbmQgYHpTaWcnLCBhbmQgcmV0dXJucyB0aGUgcHJvcGVyIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZQorfCBgcm91bmRBbmRQYWNrRmxvYXQzMicgZXhjZXB0IHRoYXQgYHpTaWcnIGRvZXMgbm90IGhhdmUgdG8gYmUgbm9ybWFsaXplZC4KK3wgQml0IDMxIG9mIGB6U2lnJyBtdXN0IGJlIHplcm8sIGFuZCBgekV4cCcgbXVzdCBiZSAxIGxlc3MgdGhhbiB0aGUgYGB0cnVlJycKK3wgZmxvYXRpbmctcG9pbnQgZXhwb25lbnQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDMyCisgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQzMihmbGFnIHpTaWduLCBpbnRfZmFzdDE2X3QgekV4cCwgdWludDMyX3QgelNpZyBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zMzIoIHpTaWcgKSAtIDE7CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCB6RXhwIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCBTVEFUVVNfVkFSKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB1aW50NjRfdCBleHRyYWN0RmxvYXQ2NEZyYWMoIGZsb2F0NjQgYSApCit7CisKKyAgICByZXR1cm4gZmxvYXQ2NF92YWwoYSkgJiBMSVQ2NCggMHgwMDBGRkZGRkZGRkZGRkZGICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIGV4cG9uZW50IGJpdHMgb2YgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgaW50X2Zhc3QxNl90IGV4dHJhY3RGbG9hdDY0RXhwKGZsb2F0NjQgYSkKK3sKKworICAgIHJldHVybiAoIGZsb2F0NjRfdmFsKGEpPj41MiApICYgMHg3RkY7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIGZsYWcgZXh0cmFjdEZsb2F0NjRTaWduKCBmbG9hdDY0IGEgKQoreworCisgICAgcmV0dXJuIGZsb2F0NjRfdmFsKGEpPj42MzsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgSWYgYGEnIGlzIGRlbm9ybWFsIGFuZCB3ZSBhcmUgaW4gZmx1c2gtdG8temVybyBtb2RlIHRoZW4gc2V0IHRoZQorfCBpbnB1dC1kZW5vcm1hbCBleGNlcHRpb24gYW5kIHJldHVybiB6ZXJvLiBPdGhlcndpc2UganVzdCByZXR1cm4gdGhlIHZhbHVlLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGZsb2F0NjQgZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoZmxvYXQ2NCBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpZiAoU1RBVFVTKGZsdXNoX2lucHV0c190b196ZXJvKSkgeworICAgICAgICBpZiAoZXh0cmFjdEZsb2F0NjRFeHAoYSkgPT0gMCAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoYSkgIT0gMCkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0NjQoZmxvYXQ2NF92YWwoYSkgJiAoMVVMTCA8PCA2MykpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgTm9ybWFsaXplcyB0aGUgc3Vibm9ybWFsIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgcmVwcmVzZW50ZWQKK3wgYnkgdGhlIGRlbm9ybWFsaXplZCBzaWduaWZpY2FuZCBgYVNpZycuICBUaGUgbm9ybWFsaXplZCBleHBvbmVudCBhbmQKK3wgc2lnbmlmaWNhbmQgYXJlIHN0b3JlZCBhdCB0aGUgbG9jYXRpb25zIHBvaW50ZWQgdG8gYnkgYHpFeHBQdHInIGFuZAorfCBgelNpZ1B0cicsIHJlc3BlY3RpdmVseS4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKKyBub3JtYWxpemVGbG9hdDY0U3Vibm9ybWFsKHVpbnQ2NF90IGFTaWcsIGludF9mYXN0MTZfdCAqekV4cFB0ciwgdWludDY0X3QgKnpTaWdQdHIpCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoIGFTaWcgKSAtIDExOworICAgICp6U2lnUHRyID0gYVNpZzw8c2hpZnRDb3VudDsKKyAgICAqekV4cFB0ciA9IDEgLSBzaGlmdENvdW50OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBQYWNrcyB0aGUgc2lnbiBgelNpZ24nLCBleHBvbmVudCBgekV4cCcsIGFuZCBzaWduaWZpY2FuZCBgelNpZycgaW50byBhCit8IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUsIHJldHVybmluZyB0aGUgcmVzdWx0LiAgQWZ0ZXIgYmVpbmcKK3wgc2hpZnRlZCBpbnRvIHRoZSBwcm9wZXIgcG9zaXRpb25zLCB0aGUgdGhyZWUgZmllbGRzIGFyZSBzaW1wbHkgYWRkZWQKK3wgdG9nZXRoZXIgdG8gZm9ybSB0aGUgcmVzdWx0LiAgVGhpcyBtZWFucyB0aGF0IGFueSBpbnRlZ2VyIHBvcnRpb24gb2YgYHpTaWcnCit8IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgZXhwb25lbnQuICBTaW5jZSBhIHByb3Blcmx5IG5vcm1hbGl6ZWQgc2lnbmlmaWNhbmQKK3wgd2lsbCBoYXZlIGFuIGludGVnZXIgcG9ydGlvbiBlcXVhbCB0byAxLCB0aGUgYHpFeHAnIGlucHV0IHNob3VsZCBiZSAxIGxlc3MKK3wgdGhhbiB0aGUgZGVzaXJlZCByZXN1bHQgZXhwb25lbnQgd2hlbmV2ZXIgYHpTaWcnIGlzIGEgY29tcGxldGUsIG5vcm1hbGl6ZWQKK3wgc2lnbmlmaWNhbmQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBmbG9hdDY0IHBhY2tGbG9hdDY0KGZsYWcgelNpZ24sIGludF9mYXN0MTZfdCB6RXhwLCB1aW50NjRfdCB6U2lnKQoreworCisgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NCgKKyAgICAgICAgKCAoICh1aW50NjRfdCkgelNpZ24gKTw8NjMgKSArICggKCAodWludDY0X3QpIHpFeHAgKTw8NTIgKSArIHpTaWcpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyBhbiBhYnN0cmFjdCBmbG9hdGluZy1wb2ludCB2YWx1ZSBoYXZpbmcgc2lnbiBgelNpZ24nLCBleHBvbmVudCBgekV4cCcsCit8IGFuZCBzaWduaWZpY2FuZCBgelNpZycsIGFuZCByZXR1cm5zIHRoZSBwcm9wZXIgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3wgcG9pbnQgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBPcmRpbmFyaWx5LCB0aGUgYWJzdHJhY3QKK3wgdmFsdWUgaXMgc2ltcGx5IHJvdW5kZWQgYW5kIHBhY2tlZCBpbnRvIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZvcm1hdCwgd2l0aAorfCB0aGUgaW5leGFjdCBleGNlcHRpb24gcmFpc2VkIGlmIHRoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKK3wgZXhhY3RseS4gIEhvd2V2ZXIsIGlmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gbGFyZ2UsIHRoZSBvdmVyZmxvdyBhbmQKK3wgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgYW5kIGFuIGluZmluaXR5IG9yIG1heGltYWwgZmluaXRlIHZhbHVlIGlzCit8IHJldHVybmVkLiAgSWYgdGhlIGFic3RyYWN0IHZhbHVlIGlzIHRvbyBzbWFsbCwgdGhlIGlucHV0IHZhbHVlIGlzIHJvdW5kZWQKK3wgdG8gYSBzdWJub3JtYWwgbnVtYmVyLCBhbmQgdGhlIHVuZGVyZmxvdyBhbmQgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQKK3wgaWYgdGhlIGFic3RyYWN0IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgc3Vibm9ybWFsIGRvdWJsZS0KK3wgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlci4KK3wgICAgIFRoZSBpbnB1dCBzaWduaWZpY2FuZCBgelNpZycgaGFzIGl0cyBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRzIDYyCit8IGFuZCA2MSwgd2hpY2ggaXMgMTAgYml0cyB0byB0aGUgbGVmdCBvZiB0aGUgdXN1YWwgbG9jYXRpb24uICBUaGlzIHNoaWZ0ZWQKK3wgc2lnbmlmaWNhbmQgbXVzdCBiZSBub3JtYWxpemVkIG9yIHNtYWxsZXIuICBJZiBgelNpZycgaXMgbm90IG5vcm1hbGl6ZWQsCit8IGB6RXhwJyBtdXN0IGJlIDA7IGluIHRoYXQgY2FzZSwgdGhlIHJlc3VsdCByZXR1cm5lZCBpcyBhIHN1Ym5vcm1hbCBudW1iZXIsCit8IGFuZCBpdCBtdXN0IG5vdCByZXF1aXJlIHJvdW5kaW5nLiAgSW4gdGhlIHVzdWFsIGNhc2UgdGhhdCBgelNpZycgaXMKK3wgbm9ybWFsaXplZCwgYHpFeHAnIG11c3QgYmUgMSBsZXNzIHRoYW4gdGhlIGBgdHJ1ZScnIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50LgorfCBUaGUgaGFuZGxpbmcgb2YgdW5kZXJmbG93IGFuZCBvdmVyZmxvdyBmb2xsb3dzIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IKK3wgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDY0IHJvdW5kQW5kUGFja0Zsb2F0NjQoZmxhZyB6U2lnbiwgaW50X2Zhc3QxNl90IHpFeHAsIHVpbnQ2NF90IHpTaWcgU1RBVFVTX1BBUkFNKQoreworICAgIGludDggcm91bmRpbmdNb2RlOworICAgIGZsYWcgcm91bmROZWFyZXN0RXZlbjsKKyAgICBpbnRfZmFzdDE2X3Qgcm91bmRJbmNyZW1lbnQsIHJvdW5kQml0czsKKyAgICBmbGFnIGlzVGlueTsKKworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgcm91bmRJbmNyZW1lbnQgPSAweDIwMDsKKyAgICBpZiAoICEgcm91bmROZWFyZXN0RXZlbiApIHsKKyAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgICAgIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJvdW5kSW5jcmVtZW50ID0gMHgzRkY7CisgICAgICAgICAgICBpZiAoIHpTaWduICkgeworICAgICAgICAgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApIHJvdW5kSW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByb3VuZEJpdHMgPSB6U2lnICYgMHgzRkY7CisgICAgaWYgKCAweDdGRCA8PSAodWludDE2X3QpIHpFeHAgKSB7CisgICAgICAgIGlmICggICAgKCAweDdGRCA8IHpFeHAgKQorICAgICAgICAgICAgIHx8ICggICAgKCB6RXhwID09IDB4N0ZEICkKKyAgICAgICAgICAgICAgICAgICYmICggKGludDY0X3QpICggelNpZyArIHJvdW5kSW5jcmVtZW50ICkgPCAwICkgKQorICAgICAgICAgICApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX292ZXJmbG93IHwgZmxvYXRfZmxhZ19pbmV4YWN0IFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCB6U2lnbiwgMHg3RkYsIC0gKCByb3VuZEluY3JlbWVudCA9PSAwICkpOworICAgICAgICB9CisgICAgICAgIGlmICggekV4cCA8IDAgKSB7CisgICAgICAgICAgICBpZiAoU1RBVFVTKGZsdXNoX3RvX3plcm8pKSB7CisgICAgICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19vdXRwdXRfZGVub3JtYWwgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KHpTaWduLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzVGlueSA9CisgICAgICAgICAgICAgICAgICAgKCBTVEFUVVMoZmxvYXRfZGV0ZWN0X3RpbmluZXNzKSA9PSBmbG9hdF90aW5pbmVzc19iZWZvcmVfcm91bmRpbmcgKQorICAgICAgICAgICAgICAgIHx8ICggekV4cCA8IC0xICkKKyAgICAgICAgICAgICAgICB8fCAoIHpTaWcgKyByb3VuZEluY3JlbWVudCA8IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgICAgICAgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggelNpZywgLSB6RXhwLCAmelNpZyApOworICAgICAgICAgICAgekV4cCA9IDA7CisgICAgICAgICAgICByb3VuZEJpdHMgPSB6U2lnICYgMHgzRkY7CisgICAgICAgICAgICBpZiAoIGlzVGlueSAmJiByb3VuZEJpdHMgKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ191bmRlcmZsb3cgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCByb3VuZEJpdHMgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgelNpZyA9ICggelNpZyArIHJvdW5kSW5jcmVtZW50ICk+PjEwOworICAgIHpTaWcgJj0gfiAoICggKCByb3VuZEJpdHMgXiAweDIwMCApID09IDAgKSAmIHJvdW5kTmVhcmVzdEV2ZW4gKTsKKyAgICBpZiAoIHpTaWcgPT0gMCApIHpFeHAgPSAwOworICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgVGFrZXMgYW4gYWJzdHJhY3QgZmxvYXRpbmctcG9pbnQgdmFsdWUgaGF2aW5nIHNpZ24gYHpTaWduJywgZXhwb25lbnQgYHpFeHAnLAorfCBhbmQgc2lnbmlmaWNhbmQgYHpTaWcnLCBhbmQgcmV0dXJucyB0aGUgcHJvcGVyIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgVGhpcyByb3V0aW5lIGlzIGp1c3QgbGlrZQorfCBgcm91bmRBbmRQYWNrRmxvYXQ2NCcgZXhjZXB0IHRoYXQgYHpTaWcnIGRvZXMgbm90IGhhdmUgdG8gYmUgbm9ybWFsaXplZC4KK3wgQml0IDYzIG9mIGB6U2lnJyBtdXN0IGJlIHplcm8sIGFuZCBgekV4cCcgbXVzdCBiZSAxIGxlc3MgdGhhbiB0aGUgYGB0cnVlJycKK3wgZmxvYXRpbmctcG9pbnQgZXhwb25lbnQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDY0Cisgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NChmbGFnIHpTaWduLCBpbnRfZmFzdDE2X3QgekV4cCwgdWludDY0X3QgelNpZyBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoIHpTaWcgKSAtIDE7CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0NjQoIHpTaWduLCB6RXhwIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCBTVEFUVVNfVkFSKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgZnJhY3Rpb24gYml0cyBvZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAorfCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB1aW50NjRfdCBleHRyYWN0RmxvYXR4ODBGcmFjKCBmbG9hdHg4MCBhICkKK3sKKworICAgIHJldHVybiBhLmxvdzsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgZXhwb25lbnQgYml0cyBvZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAorfCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBpbnQzMiBleHRyYWN0RmxvYXR4ODBFeHAoIGZsb2F0eDgwIGEgKQoreworCisgICAgcmV0dXJuIGEuaGlnaCAmIDB4N0ZGRjsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgc2lnbiBiaXQgb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgYGEnLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxhZyBleHRyYWN0RmxvYXR4ODBTaWduKCBmbG9hdHg4MCBhICkKK3sKKworICAgIHJldHVybiBhLmhpZ2g+PjE1OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBOb3JtYWxpemVzIHRoZSBzdWJub3JtYWwgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCByZXByZXNlbnRlZCBieSB0aGUgZGVub3JtYWxpemVkIHNpZ25pZmljYW5kIGBhU2lnJy4gIFRoZSBub3JtYWxpemVkIGV4cG9uZW50Cit8IGFuZCBzaWduaWZpY2FuZCBhcmUgc3RvcmVkIGF0IHRoZSBsb2NhdGlvbnMgcG9pbnRlZCB0byBieSBgekV4cFB0cicgYW5kCit8IGB6U2lnUHRyJywgcmVzcGVjdGl2ZWx5LgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZAorIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCB1aW50NjRfdCBhU2lnLCBpbnQzMiAqekV4cFB0ciwgdWludDY0X3QgKnpTaWdQdHIgKQoreworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhU2lnICk7CisgICAgKnpTaWdQdHIgPSBhU2lnPDxzaGlmdENvdW50OworICAgICp6RXhwUHRyID0gMSAtIHNoaWZ0Q291bnQ7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFBhY2tzIHRoZSBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywgYW5kIHNpZ25pZmljYW5kIGB6U2lnJyBpbnRvIGFuCit8IGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUsIHJldHVybmluZyB0aGUgcmVzdWx0LgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitJTkxJTkUgZmxvYXR4ODAgcGFja0Zsb2F0eDgwKCBmbGFnIHpTaWduLCBpbnQzMiB6RXhwLCB1aW50NjRfdCB6U2lnICkKK3sKKyAgICBmbG9hdHg4MCB6OworCisgICAgei5sb3cgPSB6U2lnOworICAgIHouaGlnaCA9ICggKCAodWludDE2X3QpIHpTaWduICk8PDE1ICkgKyB6RXhwOworICAgIHJldHVybiB6OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUYWtlcyBhbiBhYnN0cmFjdCBmbG9hdGluZy1wb2ludCB2YWx1ZSBoYXZpbmcgc2lnbiBgelNpZ24nLCBleHBvbmVudCBgekV4cCcsCit8IGFuZCBleHRlbmRlZCBzaWduaWZpY2FuZCBmb3JtZWQgYnkgdGhlIGNvbmNhdGVuYXRpb24gb2YgYHpTaWcwJyBhbmQgYHpTaWcxJywKK3wgYW5kIHJldHVybnMgdGhlIHByb3BlciBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgT3JkaW5hcmlseSwgdGhlIGFic3RyYWN0IHZhbHVlIGlzCit8IHJvdW5kZWQgYW5kIHBhY2tlZCBpbnRvIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZvcm1hdCwgd2l0aCB0aGUKK3wgaW5leGFjdCBleGNlcHRpb24gcmFpc2VkIGlmIHRoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKK3wgZXhhY3RseS4gIEhvd2V2ZXIsIGlmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gbGFyZ2UsIHRoZSBvdmVyZmxvdyBhbmQKK3wgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgYW5kIGFuIGluZmluaXR5IG9yIG1heGltYWwgZmluaXRlIHZhbHVlIGlzCit8IHJldHVybmVkLiAgSWYgdGhlIGFic3RyYWN0IHZhbHVlIGlzIHRvbyBzbWFsbCwgdGhlIGlucHV0IHZhbHVlIGlzIHJvdW5kZWQgdG8KK3wgYSBzdWJub3JtYWwgbnVtYmVyLCBhbmQgdGhlIHVuZGVyZmxvdyBhbmQgaW5leGFjdCBleGNlcHRpb25zIGFyZSByYWlzZWQgaWYKK3wgdGhlIGFic3RyYWN0IGlucHV0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgc3Vibm9ybWFsIGV4dGVuZGVkCit8IGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorfCAgICAgSWYgYHJvdW5kaW5nUHJlY2lzaW9uJyBpcyAzMiBvciA2NCwgdGhlIHJlc3VsdCBpcyByb3VuZGVkIHRvIHRoZSBzYW1lCit8IG51bWJlciBvZiBiaXRzIGFzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uLCByZXNwZWN0aXZlbHkuICBPdGhlcndpc2UsIHRoZQorfCByZXN1bHQgaXMgcm91bmRlZCB0byB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24KK3wgZm9ybWF0LgorfCAgICAgVGhlIGlucHV0IHNpZ25pZmljYW5kIG11c3QgYmUgbm9ybWFsaXplZCBvciBzbWFsbGVyLiAgSWYgdGhlIGlucHV0Cit8IHNpZ25pZmljYW5kIGlzIG5vdCBub3JtYWxpemVkLCBgekV4cCcgbXVzdCBiZSAwOyBpbiB0aGF0IGNhc2UsIHRoZSByZXN1bHQKK3wgcmV0dXJuZWQgaXMgYSBzdWJub3JtYWwgbnVtYmVyLCBhbmQgaXQgbXVzdCBub3QgcmVxdWlyZSByb3VuZGluZy4gIFRoZQorfCBoYW5kbGluZyBvZiB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGZvbGxvd3MgdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0eDgwCisgcm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgIGludDggcm91bmRpbmdQcmVjaXNpb24sIGZsYWcgelNpZ24sIGludDMyIHpFeHAsIHVpbnQ2NF90IHpTaWcwLCB1aW50NjRfdCB6U2lnMQorIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ4IHJvdW5kaW5nTW9kZTsKKyAgICBmbGFnIHJvdW5kTmVhcmVzdEV2ZW4sIGluY3JlbWVudCwgaXNUaW55OworICAgIGludDY0IHJvdW5kSW5jcmVtZW50LCByb3VuZE1hc2ssIHJvdW5kQml0czsKKworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgaWYgKCByb3VuZGluZ1ByZWNpc2lvbiA9PSA4MCApIGdvdG8gcHJlY2lzaW9uODA7CisgICAgaWYgKCByb3VuZGluZ1ByZWNpc2lvbiA9PSA2NCApIHsKKyAgICAgICAgcm91bmRJbmNyZW1lbnQgPSBMSVQ2NCggMHgwMDAwMDAwMDAwMDAwNDAwICk7CisgICAgICAgIHJvdW5kTWFzayA9IExJVDY0KCAweDAwMDAwMDAwMDAwMDA3RkYgKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHJvdW5kaW5nUHJlY2lzaW9uID09IDMyICkgeworICAgICAgICByb3VuZEluY3JlbWVudCA9IExJVDY0KCAweDAwMDAwMDgwMDAwMDAwMDAgKTsKKyAgICAgICAgcm91bmRNYXNrID0gTElUNjQoIDB4MDAwMDAwRkZGRkZGRkZGRiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZ290byBwcmVjaXNpb244MDsKKyAgICB9CisgICAgelNpZzAgfD0gKCB6U2lnMSAhPSAwICk7CisgICAgaWYgKCAhIHJvdW5kTmVhcmVzdEV2ZW4gKSB7CisgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IHJvdW5kTWFzazsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSByb3VuZEluY3JlbWVudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9kb3duICkgcm91bmRJbmNyZW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJvdW5kQml0cyA9IHpTaWcwICYgcm91bmRNYXNrOworICAgIGlmICggMHg3RkZEIDw9ICh1aW50MzJfdCkgKCB6RXhwIC0gMSApICkgeworICAgICAgICBpZiAoICAgICggMHg3RkZFIDwgekV4cCApCisgICAgICAgICAgICAgfHwgKCAoIHpFeHAgPT0gMHg3RkZFICkgJiYgKCB6U2lnMCArIHJvdW5kSW5jcmVtZW50IDwgelNpZzAgKSApCisgICAgICAgICAgICkgeworICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHpFeHAgPD0gMCApIHsKKyAgICAgICAgICAgIGlmIChTVEFUVVMoZmx1c2hfdG9femVybykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKHpTaWduLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzVGlueSA9CisgICAgICAgICAgICAgICAgICAgKCBTVEFUVVMoZmxvYXRfZGV0ZWN0X3RpbmluZXNzKSA9PSBmbG9hdF90aW5pbmVzc19iZWZvcmVfcm91bmRpbmcgKQorICAgICAgICAgICAgICAgIHx8ICggekV4cCA8IDAgKQorICAgICAgICAgICAgICAgIHx8ICggelNpZzAgPD0gelNpZzAgKyByb3VuZEluY3JlbWVudCApOworICAgICAgICAgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggelNpZzAsIDEgLSB6RXhwLCAmelNpZzAgKTsKKyAgICAgICAgICAgIHpFeHAgPSAwOworICAgICAgICAgICAgcm91bmRCaXRzID0gelNpZzAgJiByb3VuZE1hc2s7CisgICAgICAgICAgICBpZiAoIGlzVGlueSAmJiByb3VuZEJpdHMgKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ191bmRlcmZsb3cgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICBpZiAoIHJvdW5kQml0cyApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgICAgIHpTaWcwICs9IHJvdW5kSW5jcmVtZW50OworICAgICAgICAgICAgaWYgKCAoaW50NjRfdCkgelNpZzAgPCAwICkgekV4cCA9IDE7CisgICAgICAgICAgICByb3VuZEluY3JlbWVudCA9IHJvdW5kTWFzayArIDE7CisgICAgICAgICAgICBpZiAoIHJvdW5kTmVhcmVzdEV2ZW4gJiYgKCByb3VuZEJpdHM8PDEgPT0gcm91bmRJbmNyZW1lbnQgKSApIHsKKyAgICAgICAgICAgICAgICByb3VuZE1hc2sgfD0gcm91bmRJbmNyZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6U2lnMCAmPSB+IHJvdW5kTWFzazsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCB6RXhwLCB6U2lnMCApOworICAgICAgICB9CisgICAgfQorICAgIGlmICggcm91bmRCaXRzICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHpTaWcwICs9IHJvdW5kSW5jcmVtZW50OworICAgIGlmICggelNpZzAgPCByb3VuZEluY3JlbWVudCApIHsKKyAgICAgICAgKyt6RXhwOworICAgICAgICB6U2lnMCA9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB9CisgICAgcm91bmRJbmNyZW1lbnQgPSByb3VuZE1hc2sgKyAxOworICAgIGlmICggcm91bmROZWFyZXN0RXZlbiAmJiAoIHJvdW5kQml0czw8MSA9PSByb3VuZEluY3JlbWVudCApICkgeworICAgICAgICByb3VuZE1hc2sgfD0gcm91bmRJbmNyZW1lbnQ7CisgICAgfQorICAgIHpTaWcwICY9IH4gcm91bmRNYXNrOworICAgIGlmICggelNpZzAgPT0gMCApIHpFeHAgPSAwOworICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCB6RXhwLCB6U2lnMCApOworIHByZWNpc2lvbjgwOgorICAgIGluY3JlbWVudCA9ICggKGludDY0X3QpIHpTaWcxIDwgMCApOworICAgIGlmICggISByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkgeworICAgICAgICAgICAgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApICYmIHpTaWcxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSAmJiB6U2lnMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIDB4N0ZGRCA8PSAodWludDMyX3QpICggekV4cCAtIDEgKSApIHsKKyAgICAgICAgaWYgKCAgICAoIDB4N0ZGRSA8IHpFeHAgKQorICAgICAgICAgICAgIHx8ICggICAgKCB6RXhwID09IDB4N0ZGRSApCisgICAgICAgICAgICAgICAgICAmJiAoIHpTaWcwID09IExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKSApCisgICAgICAgICAgICAgICAgICAmJiBpbmNyZW1lbnQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICkgeworICAgICAgICAgICAgcm91bmRNYXNrID0gMDsKKyBvdmVyZmxvdzoKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX292ZXJmbG93IHwgZmxvYXRfZmxhZ19pbmV4YWN0IFNUQVRVU19WQVIpOworICAgICAgICAgICAgaWYgKCAgICAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF90b196ZXJvICkKKyAgICAgICAgICAgICAgICAgfHwgKCB6U2lnbiAmJiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApICkKKyAgICAgICAgICAgICAgICAgfHwgKCAhIHpTaWduICYmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSApCisgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg3RkZFLCB+IHJvdW5kTWFzayApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB6RXhwIDw9IDAgKSB7CisgICAgICAgICAgICBpc1RpbnkgPQorICAgICAgICAgICAgICAgICAgICggU1RBVFVTKGZsb2F0X2RldGVjdF90aW5pbmVzcykgPT0gZmxvYXRfdGluaW5lc3NfYmVmb3JlX3JvdW5kaW5nICkKKyAgICAgICAgICAgICAgICB8fCAoIHpFeHAgPCAwICkKKyAgICAgICAgICAgICAgICB8fCAhIGluY3JlbWVudAorICAgICAgICAgICAgICAgIHx8ICggelNpZzAgPCBMSVQ2NCggMHhGRkZGRkZGRkZGRkZGRkZGICkgKTsKKyAgICAgICAgICAgIHNoaWZ0NjRFeHRyYVJpZ2h0SmFtbWluZyggelNpZzAsIHpTaWcxLCAxIC0gekV4cCwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICAgICAgICAgIHpFeHAgPSAwOworICAgICAgICAgICAgaWYgKCBpc1RpbnkgJiYgelNpZzEgKSBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ191bmRlcmZsb3cgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICBpZiAoIHpTaWcxICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICAgICAgaWYgKCByb3VuZE5lYXJlc3RFdmVuICkgeworICAgICAgICAgICAgICAgIGluY3JlbWVudCA9ICggKGludDY0X3QpIHpTaWcxIDwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCB6U2lnbiApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApICYmIHpTaWcxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSAmJiB6U2lnMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGluY3JlbWVudCApIHsKKyAgICAgICAgICAgICAgICArK3pTaWcwOworICAgICAgICAgICAgICAgIHpTaWcwICY9CisgICAgICAgICAgICAgICAgICAgIH4gKCAoICh1aW50NjRfdCkgKCB6U2lnMTw8MSApID09IDAgKSAmIHJvdW5kTmVhcmVzdEV2ZW4gKTsKKyAgICAgICAgICAgICAgICBpZiAoIChpbnQ2NF90KSB6U2lnMCA8IDAgKSB6RXhwID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCB6RXhwLCB6U2lnMCApOworICAgICAgICB9CisgICAgfQorICAgIGlmICggelNpZzEgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgaWYgKCBpbmNyZW1lbnQgKSB7CisgICAgICAgICsrelNpZzA7CisgICAgICAgIGlmICggelNpZzAgPT0gMCApIHsKKyAgICAgICAgICAgICsrekV4cDsKKyAgICAgICAgICAgIHpTaWcwID0gTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgelNpZzAgJj0gfiAoICggKHVpbnQ2NF90KSAoIHpTaWcxPDwxICkgPT0gMCApICYgcm91bmROZWFyZXN0RXZlbiApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIHpTaWcwID09IDAgKSB6RXhwID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIHpFeHAsIHpTaWcwICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50Cit8IGB6RXhwJywgYW5kIHNpZ25pZmljYW5kIGZvcm1lZCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgelNpZzAnIGFuZCBgelNpZzEnLAorfCBhbmQgcmV0dXJucyB0aGUgcHJvcGVyIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgY29ycmVzcG9uZGluZyB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBUaGlzIHJvdXRpbmUgaXMganVzdCBsaWtlCit8IGByb3VuZEFuZFBhY2tGbG9hdHg4MCcgZXhjZXB0IHRoYXQgdGhlIGlucHV0IHNpZ25pZmljYW5kIGRvZXMgbm90IGhhdmUgdG8gYmUKK3wgbm9ybWFsaXplZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0eDgwCisgbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgIGludDggcm91bmRpbmdQcmVjaXNpb24sIGZsYWcgelNpZ24sIGludDMyIHpFeHAsIHVpbnQ2NF90IHpTaWcwLCB1aW50NjRfdCB6U2lnMQorIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICBpZiAoIHpTaWcwID09IDAgKSB7CisgICAgICAgIHpTaWcwID0gelNpZzE7CisgICAgICAgIHpTaWcxID0gMDsKKyAgICAgICAgekV4cCAtPSA2NDsKKyAgICB9CisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoIHpTaWcwICk7CisgICAgc2hvcnRTaGlmdDEyOExlZnQoIHpTaWcwLCB6U2lnMSwgc2hpZnRDb3VudCwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICB6RXhwIC09IHNoaWZ0Q291bnQ7CisgICAgcmV0dXJuCisgICAgICAgIHJvdW5kQW5kUGFja0Zsb2F0eDgwKCByb3VuZGluZ1ByZWNpc2lvbiwgelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSBTVEFUVVNfVkFSKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgNjQgZnJhY3Rpb24gYml0cyBvZiB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbgorfCBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB1aW50NjRfdCBleHRyYWN0RmxvYXQxMjhGcmFjMSggZmxvYXQxMjggYSApCit7CisKKyAgICByZXR1cm4gYS5sb3c7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgNDggZnJhY3Rpb24gYml0cyBvZiB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbgorfCBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSB1aW50NjRfdCBleHRyYWN0RmxvYXQxMjhGcmFjMCggZmxvYXQxMjggYSApCit7CisKKyAgICByZXR1cm4gYS5oaWdoICYgTElUNjQoIDB4MDAwMEZGRkZGRkZGRkZGRiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSBleHBvbmVudCBiaXRzIG9mIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIGludDMyIGV4dHJhY3RGbG9hdDEyOEV4cCggZmxvYXQxMjggYSApCit7CisKKyAgICByZXR1cm4gKCBhLmhpZ2g+PjQ4ICkgJiAweDdGRkY7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNpZ24gYml0IG9mIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworSU5MSU5FIGZsYWcgZXh0cmFjdEZsb2F0MTI4U2lnbiggZmxvYXQxMjggYSApCit7CisKKyAgICByZXR1cm4gYS5oaWdoPj42MzsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgTm9ybWFsaXplcyB0aGUgc3Vibm9ybWFsIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgcmVwcmVzZW50ZWQgYnkgdGhlIGRlbm9ybWFsaXplZCBzaWduaWZpY2FuZCBmb3JtZWQgYnkgdGhlIGNvbmNhdGVuYXRpb24gb2YKK3wgYGFTaWcwJyBhbmQgYGFTaWcxJy4gIFRoZSBub3JtYWxpemVkIGV4cG9uZW50IGlzIHN0b3JlZCBhdCB0aGUgbG9jYXRpb24KK3wgcG9pbnRlZCB0byBieSBgekV4cFB0cicuICBUaGUgbW9zdCBzaWduaWZpY2FudCA0OSBiaXRzIG9mIHRoZSBub3JtYWxpemVkCit8IHNpZ25pZmljYW5kIGFyZSBzdG9yZWQgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgYHpTaWcwUHRyJywgYW5kIHRoZQorfCBsZWFzdCBzaWduaWZpY2FudCA2NCBiaXRzIG9mIHRoZSBub3JtYWxpemVkIHNpZ25pZmljYW5kIGFyZSBzdG9yZWQgYXQgdGhlCit8IGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgYHpTaWcxUHRyJy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQKKyBub3JtYWxpemVGbG9hdDEyOFN1Ym5vcm1hbCgKKyAgICAgdWludDY0X3QgYVNpZzAsCisgICAgIHVpbnQ2NF90IGFTaWcxLAorICAgICBpbnQzMiAqekV4cFB0ciwKKyAgICAgdWludDY0X3QgKnpTaWcwUHRyLAorICAgICB1aW50NjRfdCAqelNpZzFQdHIKKyApCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgaWYgKCBhU2lnMCA9PSAwICkgeworICAgICAgICBzaGlmdENvdW50ID0gY291bnRMZWFkaW5nWmVyb3M2NCggYVNpZzEgKSAtIDE1OworICAgICAgICBpZiAoIHNoaWZ0Q291bnQgPCAwICkgeworICAgICAgICAgICAgKnpTaWcwUHRyID0gYVNpZzE+PiggLSBzaGlmdENvdW50ICk7CisgICAgICAgICAgICAqelNpZzFQdHIgPSBhU2lnMTw8KCBzaGlmdENvdW50ICYgNjMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICp6U2lnMFB0ciA9IGFTaWcxPDxzaGlmdENvdW50OworICAgICAgICAgICAgKnpTaWcxUHRyID0gMDsKKyAgICAgICAgfQorICAgICAgICAqekV4cFB0ciA9IC0gc2hpZnRDb3VudCAtIDYzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoIGFTaWcwICkgLSAxNTsKKyAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIGFTaWcwLCBhU2lnMSwgc2hpZnRDb3VudCwgelNpZzBQdHIsIHpTaWcxUHRyICk7CisgICAgICAgICp6RXhwUHRyID0gMSAtIHNoaWZ0Q291bnQ7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBQYWNrcyB0aGUgc2lnbiBgelNpZ24nLCB0aGUgZXhwb25lbnQgYHpFeHAnLCBhbmQgdGhlIHNpZ25pZmljYW5kIGZvcm1lZAorfCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgelNpZzAnIGFuZCBgelNpZzEnIGludG8gYSBxdWFkcnVwbGUtcHJlY2lzaW9uCit8IGZsb2F0aW5nLXBvaW50IHZhbHVlLCByZXR1cm5pbmcgdGhlIHJlc3VsdC4gIEFmdGVyIGJlaW5nIHNoaWZ0ZWQgaW50byB0aGUKK3wgcHJvcGVyIHBvc2l0aW9ucywgdGhlIHRocmVlIGZpZWxkcyBgelNpZ24nLCBgekV4cCcsIGFuZCBgelNpZzAnIGFyZSBzaW1wbHkKK3wgYWRkZWQgdG9nZXRoZXIgdG8gZm9ybSB0aGUgbW9zdCBzaWduaWZpY2FudCAzMiBiaXRzIG9mIHRoZSByZXN1bHQuICBUaGlzCit8IG1lYW5zIHRoYXQgYW55IGludGVnZXIgcG9ydGlvbiBvZiBgelNpZzAnIHdpbGwgYmUgYWRkZWQgaW50byB0aGUgZXhwb25lbnQuCit8IFNpbmNlIGEgcHJvcGVybHkgbm9ybWFsaXplZCBzaWduaWZpY2FuZCB3aWxsIGhhdmUgYW4gaW50ZWdlciBwb3J0aW9uIGVxdWFsCit8IHRvIDEsIHRoZSBgekV4cCcgaW5wdXQgc2hvdWxkIGJlIDEgbGVzcyB0aGFuIHRoZSBkZXNpcmVkIHJlc3VsdCBleHBvbmVudAorfCB3aGVuZXZlciBgelNpZzAnIGFuZCBgelNpZzEnIGNvbmNhdGVuYXRlZCBmb3JtIGEgY29tcGxldGUsIG5vcm1hbGl6ZWQKK3wgc2lnbmlmaWNhbmQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0lOTElORSBmbG9hdDEyOAorIHBhY2tGbG9hdDEyOCggZmxhZyB6U2lnbiwgaW50MzIgekV4cCwgdWludDY0X3QgelNpZzAsIHVpbnQ2NF90IHpTaWcxICkKK3sKKyAgICBmbG9hdDEyOCB6OworCisgICAgei5sb3cgPSB6U2lnMTsKKyAgICB6LmhpZ2ggPSAoICggKHVpbnQ2NF90KSB6U2lnbiApPDw2MyApICsgKCAoICh1aW50NjRfdCkgekV4cCApPDw0OCApICsgelNpZzA7CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK3wgYW5kIGV4dGVuZGVkIHNpZ25pZmljYW5kIGZvcm1lZCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgelNpZzAnLCBgelNpZzEnLAorfCBhbmQgYHpTaWcyJywgYW5kIHJldHVybnMgdGhlIHByb3BlciBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFic3RyYWN0IGlucHV0LiAgT3JkaW5hcmlseSwgdGhlIGFic3RyYWN0IHZhbHVlIGlzCit8IHNpbXBseSByb3VuZGVkIGFuZCBwYWNrZWQgaW50byB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbiBmb3JtYXQsIHdpdGggdGhlCit8IGluZXhhY3QgZXhjZXB0aW9uIHJhaXNlZCBpZiB0aGUgYWJzdHJhY3QgaW5wdXQgY2Fubm90IGJlIHJlcHJlc2VudGVkCit8IGV4YWN0bHkuICBIb3dldmVyLCBpZiB0aGUgYWJzdHJhY3QgdmFsdWUgaXMgdG9vIGxhcmdlLCB0aGUgb3ZlcmZsb3cgYW5kCit8IGluZXhhY3QgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGFuZCBhbiBpbmZpbml0eSBvciBtYXhpbWFsIGZpbml0ZSB2YWx1ZSBpcworfCByZXR1cm5lZC4gIElmIHRoZSBhYnN0cmFjdCB2YWx1ZSBpcyB0b28gc21hbGwsIHRoZSBpbnB1dCB2YWx1ZSBpcyByb3VuZGVkIHRvCit8IGEgc3Vibm9ybWFsIG51bWJlciwgYW5kIHRoZSB1bmRlcmZsb3cgYW5kIGluZXhhY3QgZXhjZXB0aW9ucyBhcmUgcmFpc2VkIGlmCit8IHRoZSBhYnN0cmFjdCBpbnB1dCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIHN1Ym5vcm1hbCBxdWFkcnVwbGUtCit8IHByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBudW1iZXIuCit8ICAgICBUaGUgaW5wdXQgc2lnbmlmaWNhbmQgbXVzdCBiZSBub3JtYWxpemVkIG9yIHNtYWxsZXIuICBJZiB0aGUgaW5wdXQKK3wgc2lnbmlmaWNhbmQgaXMgbm90IG5vcm1hbGl6ZWQsIGB6RXhwJyBtdXN0IGJlIDA7IGluIHRoYXQgY2FzZSwgdGhlIHJlc3VsdAorfCByZXR1cm5lZCBpcyBhIHN1Ym5vcm1hbCBudW1iZXIsIGFuZCBpdCBtdXN0IG5vdCByZXF1aXJlIHJvdW5kaW5nLiAgSW4gdGhlCit8IHVzdWFsIGNhc2UgdGhhdCB0aGUgaW5wdXQgc2lnbmlmaWNhbmQgaXMgbm9ybWFsaXplZCwgYHpFeHAnIG11c3QgYmUgMSBsZXNzCit8IHRoYW4gdGhlIGBgdHJ1ZScnIGZsb2F0aW5nLXBvaW50IGV4cG9uZW50LiAgVGhlIGhhbmRsaW5nIG9mIHVuZGVyZmxvdyBhbmQKK3wgb3ZlcmZsb3cgZm9sbG93cyB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQxMjgKKyByb3VuZEFuZFBhY2tGbG9hdDEyOCgKKyAgICAgZmxhZyB6U2lnbiwgaW50MzIgekV4cCwgdWludDY0X3QgelNpZzAsIHVpbnQ2NF90IHpTaWcxLCB1aW50NjRfdCB6U2lnMiBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxhZyByb3VuZE5lYXJlc3RFdmVuLCBpbmNyZW1lbnQsIGlzVGlueTsKKworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICByb3VuZE5lYXJlc3RFdmVuID0gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICk7CisgICAgaW5jcmVtZW50ID0gKCAoaW50NjRfdCkgelNpZzIgPCAwICk7CisgICAgaWYgKCAhIHJvdW5kTmVhcmVzdEV2ZW4gKSB7CisgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgICAgICBpbmNyZW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCB6U2lnbiApIHsKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9kb3duICkgJiYgelNpZzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApICYmIHpTaWcyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggMHg3RkZEIDw9ICh1aW50MzJfdCkgekV4cCApIHsKKyAgICAgICAgaWYgKCAgICAoIDB4N0ZGRCA8IHpFeHAgKQorICAgICAgICAgICAgIHx8ICggICAgKCB6RXhwID09IDB4N0ZGRCApCisgICAgICAgICAgICAgICAgICAmJiBlcTEyOCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBMSVQ2NCggMHgwMDAxRkZGRkZGRkZGRkZGICksCisgICAgICAgICAgICAgICAgICAgICAgICAgTElUNjQoIDB4RkZGRkZGRkZGRkZGRkZGRiApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpTaWcwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpTaWcxCisgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAmJiBpbmNyZW1lbnQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfb3ZlcmZsb3cgfCBmbG9hdF9mbGFnX2luZXhhY3QgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICBpZiAoICAgICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3RvX3plcm8gKQorICAgICAgICAgICAgICAgICB8fCAoIHpTaWduICYmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgKQorICAgICAgICAgICAgICAgICB8fCAoICEgelNpZ24gJiYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfZG93biApICkKKyAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBwYWNrRmxvYXQxMjgoCisgICAgICAgICAgICAgICAgICAgICAgICB6U2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZGRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExJVDY0KCAweDAwMDBGRkZGRkZGRkZGRkYgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggelNpZ24sIDB4N0ZGRiwgMCwgMCApOworICAgICAgICB9CisgICAgICAgIGlmICggekV4cCA8IDAgKSB7CisgICAgICAgICAgICBpZiAoU1RBVFVTKGZsdXNoX3RvX3plcm8pKSB7CisgICAgICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19vdXRwdXRfZGVub3JtYWwgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCh6U2lnbiwgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc1RpbnkgPQorICAgICAgICAgICAgICAgICAgICggU1RBVFVTKGZsb2F0X2RldGVjdF90aW5pbmVzcykgPT0gZmxvYXRfdGluaW5lc3NfYmVmb3JlX3JvdW5kaW5nICkKKyAgICAgICAgICAgICAgICB8fCAoIHpFeHAgPCAtMSApCisgICAgICAgICAgICAgICAgfHwgISBpbmNyZW1lbnQKKyAgICAgICAgICAgICAgICB8fCBsdDEyOCgKKyAgICAgICAgICAgICAgICAgICAgICAgelNpZzAsCisgICAgICAgICAgICAgICAgICAgICAgIHpTaWcxLAorICAgICAgICAgICAgICAgICAgICAgICBMSVQ2NCggMHgwMDAxRkZGRkZGRkZGRkZGICksCisgICAgICAgICAgICAgICAgICAgICAgIExJVDY0KCAweEZGRkZGRkZGRkZGRkZGRkYgKQorICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKAorICAgICAgICAgICAgICAgIHpTaWcwLCB6U2lnMSwgelNpZzIsIC0gekV4cCwgJnpTaWcwLCAmelNpZzEsICZ6U2lnMiApOworICAgICAgICAgICAgekV4cCA9IDA7CisgICAgICAgICAgICBpZiAoIGlzVGlueSAmJiB6U2lnMiApIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX3VuZGVyZmxvdyBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIGlmICggcm91bmROZWFyZXN0RXZlbiApIHsKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnQgPSAoIChpbnQ2NF90KSB6U2lnMiA8IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggelNpZ24gKSB7CisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCA9ICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX2Rvd24gKSAmJiB6U2lnMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCA9ICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX3VwICkgJiYgelNpZzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggelNpZzIgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgaWYgKCBpbmNyZW1lbnQgKSB7CisgICAgICAgIGFkZDEyOCggelNpZzAsIHpTaWcxLCAwLCAxLCAmelNpZzAsICZ6U2lnMSApOworICAgICAgICB6U2lnMSAmPSB+ICggKCB6U2lnMiArIHpTaWcyID09IDAgKSAmIHJvdW5kTmVhcmVzdEV2ZW4gKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggKCB6U2lnMCB8IHpTaWcxICkgPT0gMCApIHpFeHAgPSAwOworICAgIH0KKyAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgekV4cCwgelNpZzAsIHpTaWcxICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRha2VzIGFuIGFic3RyYWN0IGZsb2F0aW5nLXBvaW50IHZhbHVlIGhhdmluZyBzaWduIGB6U2lnbicsIGV4cG9uZW50IGB6RXhwJywKK3wgYW5kIHNpZ25pZmljYW5kIGZvcm1lZCBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgelNpZzAnIGFuZCBgelNpZzEnLCBhbmQKK3wgcmV0dXJucyB0aGUgcHJvcGVyIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgY29ycmVzcG9uZGluZworfCB0byB0aGUgYWJzdHJhY3QgaW5wdXQuICBUaGlzIHJvdXRpbmUgaXMganVzdCBsaWtlIGByb3VuZEFuZFBhY2tGbG9hdDEyOCcKK3wgZXhjZXB0IHRoYXQgdGhlIGlucHV0IHNpZ25pZmljYW5kIGhhcyBmZXdlciBiaXRzIGFuZCBkb2VzIG5vdCBoYXZlIHRvIGJlCit8IG5vcm1hbGl6ZWQuICBJbiBhbGwgY2FzZXMsIGB6RXhwJyBtdXN0IGJlIDEgbGVzcyB0aGFuIHRoZSBgYHRydWUnJyBmbG9hdGluZy0KK3wgcG9pbnQgZXhwb25lbnQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDEyOAorIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MTI4KAorICAgICBmbGFnIHpTaWduLCBpbnQzMiB6RXhwLCB1aW50NjRfdCB6U2lnMCwgdWludDY0X3QgelNpZzEgU1RBVFVTX1BBUkFNKQoreworICAgIGludDggc2hpZnRDb3VudDsKKyAgICB1aW50NjRfdCB6U2lnMjsKKworICAgIGlmICggelNpZzAgPT0gMCApIHsKKyAgICAgICAgelNpZzAgPSB6U2lnMTsKKyAgICAgICAgelNpZzEgPSAwOworICAgICAgICB6RXhwIC09IDY0OworICAgIH0KKyAgICBzaGlmdENvdW50ID0gY291bnRMZWFkaW5nWmVyb3M2NCggelNpZzAgKSAtIDE1OworICAgIGlmICggMCA8PSBzaGlmdENvdW50ICkgeworICAgICAgICB6U2lnMiA9IDA7CisgICAgICAgIHNob3J0U2hpZnQxMjhMZWZ0KCB6U2lnMCwgelNpZzEsIHNoaWZ0Q291bnQsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKAorICAgICAgICAgICAgelNpZzAsIHpTaWcxLCAwLCAtIHNoaWZ0Q291bnQsICZ6U2lnMCwgJnpTaWcxLCAmelNpZzIgKTsKKyAgICB9CisgICAgekV4cCAtPSBzaGlmdENvdW50OworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDEyOCggelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSwgelNpZzIgU1RBVFVTX1ZBUik7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGBhJworfCB0byB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQKK3wgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgaW50MzJfdG9fZmxvYXQzMiggaW50MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgelNpZ247CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiBmbG9hdDMyX3plcm87CisgICAgaWYgKCBhID09IChpbnQzMl90KSAweDgwMDAwMDAwICkgcmV0dXJuIHBhY2tGbG9hdDMyKCAxLCAweDlFLCAwICk7CisgICAgelNpZ24gPSAoIGEgPCAwICk7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCAweDlDLCB6U2lnbiA/IC0gYSA6IGEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBgYScKK3wgdG8gdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDY0IGludDMyX3RvX2Zsb2F0NjQoIGludDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIHpTaWduOworICAgIHVpbnQzMiBhYnNBOworICAgIGludDggc2hpZnRDb3VudDsKKyAgICB1aW50NjRfdCB6U2lnOworCisgICAgaWYgKCBhID09IDAgKSByZXR1cm4gZmxvYXQ2NF96ZXJvOworICAgIHpTaWduID0gKCBhIDwgMCApOworICAgIGFic0EgPSB6U2lnbiA/IC0gYSA6IGE7CisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zMzIoIGFic0EgKSArIDIxOworICAgIHpTaWcgPSBhYnNBOworICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDB4NDMyIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBgYScKK3wgdG8gdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24KK3wgaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdHg4MCBpbnQzMl90b19mbG9hdHg4MCggaW50MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgelNpZ247CisgICAgdWludDMyIGFic0E7CisgICAgaW50OCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IHpTaWc7CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICB6U2lnbiA9ICggYSA8IDAgKTsKKyAgICBhYnNBID0gelNpZ24gPyAtIGEgOiBhOworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczMyKCBhYnNBICkgKyAzMjsKKyAgICB6U2lnID0gYWJzQTsKKyAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg0MDNFIC0gc2hpZnRDb3VudCwgelNpZzw8c2hpZnRDb3VudCApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBgYScgdG8KK3wgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDEyOCBpbnQzMl90b19mbG9hdDEyOCggaW50MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgelNpZ247CisgICAgdWludDMyIGFic0E7CisgICAgaW50OCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IHpTaWcwOworCisgICAgaWYgKCBhID09IDAgKSByZXR1cm4gcGFja0Zsb2F0MTI4KCAwLCAwLCAwLCAwICk7CisgICAgelNpZ24gPSAoIGEgPCAwICk7CisgICAgYWJzQSA9IHpTaWduID8gLSBhIDogYTsKKyAgICBzaGlmdENvdW50ID0gY291bnRMZWFkaW5nWmVyb3MzMiggYWJzQSApICsgMTc7CisgICAgelNpZzAgPSBhYnNBOworICAgIHJldHVybiBwYWNrRmxvYXQxMjgoIHpTaWduLCAweDQwMkUgLSBzaGlmdENvdW50LCB6U2lnMDw8c2hpZnRDb3VudCwgMCApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBgYScKK3wgdG8gdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDMyIGludDY0X3RvX2Zsb2F0MzIoIGludDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIHpTaWduOworICAgIHVpbnQ2NCBhYnNBOworICAgIGludDggc2hpZnRDb3VudDsKKworICAgIGlmICggYSA9PSAwICkgcmV0dXJuIGZsb2F0MzJfemVybzsKKyAgICB6U2lnbiA9ICggYSA8IDAgKTsKKyAgICBhYnNBID0gelNpZ24gPyAtIGEgOiBhOworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhYnNBICkgLSA0MDsKKyAgICBpZiAoIDAgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMHg5NSAtIHNoaWZ0Q291bnQsIGFic0E8PHNoaWZ0Q291bnQgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNoaWZ0Q291bnQgKz0gNzsKKyAgICAgICAgaWYgKCBzaGlmdENvdW50IDwgMCApIHsKKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGFic0EsIC0gc2hpZnRDb3VudCwgJmFic0EgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFic0EgPDw9IHNoaWZ0Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCAweDlDIC0gc2hpZnRDb3VudCwgYWJzQSBTVEFUVVNfVkFSICk7CisgICAgfQorCit9CisKK2Zsb2F0MzIgdWludDY0X3RvX2Zsb2F0MzIoIHVpbnQ2NCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgaW50OCBzaGlmdENvdW50OworCisgICAgaWYgKCBhID09IDAgKSByZXR1cm4gZmxvYXQzMl96ZXJvOworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhICkgLSA0MDsKKyAgICBpZiAoIDAgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKDAsIDB4OTUgLSBzaGlmdENvdW50LCBhPDxzaGlmdENvdW50KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNoaWZ0Q291bnQgKz0gNzsKKyAgICAgICAgaWYgKCBzaGlmdENvdW50IDwgMCApIHsKKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGEsIC0gc2hpZnRDb3VudCwgJmEgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGEgPDw9IHNoaWZ0Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoMCwgMHg5QyAtIHNoaWZ0Q291bnQsIGEgU1RBVFVTX1ZBUik7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgYGEnCit8IHRvIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQ2NCBpbnQ2NF90b19mbG9hdDY0KCBpbnQ2NCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyB6U2lnbjsKKworICAgIGlmICggYSA9PSAwICkgcmV0dXJuIGZsb2F0NjRfemVybzsKKyAgICBpZiAoIGEgPT0gKGludDY0X3QpIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApIHsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCAxLCAweDQzRSwgMCApOworICAgIH0KKyAgICB6U2lnbiA9ICggYSA8IDAgKTsKKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIDB4NDNDLCB6U2lnbiA/IC0gYSA6IGEgU1RBVFVTX1ZBUiApOworCit9CisKK2Zsb2F0NjQgdWludDY0X3RvX2Zsb2F0NjQodWludDY0IGEgU1RBVFVTX1BBUkFNKQoreworICAgIGludCBleHAgPSAgMHg0M0M7CisKKyAgICBpZiAoYSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmbG9hdDY0X3plcm87CisgICAgfQorICAgIGlmICgoaW50NjRfdClhIDwgMCkgeworICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKGEsIDEsICZhKTsKKyAgICAgICAgZXhwICs9IDE7CisgICAgfQorICAgIHJldHVybiBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdDY0KDAsIGV4cCwgYSBTVEFUVVNfVkFSKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGBhJworfCB0byB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbgorfCBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0eDgwIGludDY0X3RvX2Zsb2F0eDgwKCBpbnQ2NCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyB6U2lnbjsKKyAgICB1aW50NjQgYWJzQTsKKyAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICBpZiAoIGEgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICB6U2lnbiA9ICggYSA8IDAgKTsKKyAgICBhYnNBID0gelNpZ24gPyAtIGEgOiBhOworICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KCBhYnNBICk7CisgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDB4NDAzRSAtIHNoaWZ0Q291bnQsIGFic0E8PHNoaWZ0Q291bnQgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgYGEnIHRvCit8IHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQxMjggaW50NjRfdG9fZmxvYXQxMjgoIGludDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIHpTaWduOworICAgIHVpbnQ2NCBhYnNBOworICAgIGludDggc2hpZnRDb3VudDsKKyAgICBpbnQzMiB6RXhwOworICAgIHVpbnQ2NF90IHpTaWcwLCB6U2lnMTsKKworICAgIGlmICggYSA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDEyOCggMCwgMCwgMCwgMCApOworICAgIHpTaWduID0gKCBhIDwgMCApOworICAgIGFic0EgPSB6U2lnbiA/IC0gYSA6IGE7CisgICAgc2hpZnRDb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoIGFic0EgKSArIDQ5OworICAgIHpFeHAgPSAweDQwNkUgLSBzaGlmdENvdW50OworICAgIGlmICggNjQgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgelNpZzEgPSAwOworICAgICAgICB6U2lnMCA9IGFic0E7CisgICAgICAgIHNoaWZ0Q291bnQgLT0gNjQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB6U2lnMSA9IGFic0E7CisgICAgICAgIHpTaWcwID0gMDsKKyAgICB9CisgICAgc2hvcnRTaGlmdDEyOExlZnQoIHpTaWcwLCB6U2lnMSwgc2hpZnRDb3VudCwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgekV4cCwgelNpZzAsIHpTaWcxICk7CisKK30KKworZmxvYXQxMjggdWludDY0X3RvX2Zsb2F0MTI4KHVpbnQ2NCBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpZiAoYSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmbG9hdDEyOF96ZXJvOworICAgIH0KKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQxMjgoMCwgMHg0MDZFLCBhLCAwIFNUQVRVU19WQVIpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgYGEnIHRvIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uIGlzCit8IHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYy0tLXdoaWNoIG1lYW5zIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgY29udmVyc2lvbiBpcyByb3VuZGVkCit8IGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLiAgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdAorfCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZQorfCBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50MzIgZmxvYXQzMl90b19pbnQzMiggZmxvYXQzMiBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cCwgc2hpZnRDb3VudDsKKyAgICB1aW50MzJfdCBhU2lnOworICAgIHVpbnQ2NF90IGFTaWc2NDsKKworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGlmICggKCBhRXhwID09IDB4RkYgKSAmJiBhU2lnICkgYVNpZ24gPSAwOworICAgIGlmICggYUV4cCApIGFTaWcgfD0gMHgwMDgwMDAwMDsKKyAgICBzaGlmdENvdW50ID0gMHhBRiAtIGFFeHA7CisgICAgYVNpZzY0ID0gYVNpZzsKKyAgICBhU2lnNjQgPDw9IDMyOworICAgIGlmICggMCA8IHNoaWZ0Q291bnQgKSBzaGlmdDY0UmlnaHRKYW1taW5nKCBhU2lnNjQsIHNoaWZ0Q291bnQsICZhU2lnNjQgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50MzIoIGFTaWduLCBhU2lnNjQgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCBgYScgdG8gdGhlIDMyLWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3wgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLCBleGNlcHQgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhbHdheXMgcm91bmRlZCB0b3dhcmQgemVyby4KK3wgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZgorfCB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZSBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcworfCByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50MzIgZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQzMl90IGFTaWc7CisgICAgaW50MzJfdCB6OworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgc2hpZnRDb3VudCA9IGFFeHAgLSAweDlFOworICAgIGlmICggMCA8PSBzaGlmdENvdW50ICkgeworICAgICAgICBpZiAoIGZsb2F0MzJfdmFsKGEpICE9IDB4Q0YwMDAwMDAgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgaWYgKCAhIGFTaWduIHx8ICggKCBhRXhwID09IDB4RkYgKSAmJiBhU2lnICkgKSByZXR1cm4gMHg3RkZGRkZGRjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKGludDMyX3QpIDB4ODAwMDAwMDA7CisgICAgfQorICAgIGVsc2UgaWYgKCBhRXhwIDw9IDB4N0UgKSB7CisgICAgICAgIGlmICggYUV4cCB8IGFTaWcgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnID0gKCBhU2lnIHwgMHgwMDgwMDAwMCApPDw4OworICAgIHogPSBhU2lnPj4oIC0gc2hpZnRDb3VudCApOworICAgIGlmICggKHVpbnQzMl90KSAoIGFTaWc8PCggc2hpZnRDb3VudCAmIDMxICkgKSApIHsKKyAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIH0KKyAgICBpZiAoIGFTaWduICkgeiA9IC0gejsKKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgYGEnIHRvIHRoZSAxNi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uIGlzCit8IHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYywgZXhjZXB0IHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG93YXJkIHplcm8uCit8IElmIGBhJyBpcyBhIE5hTiwgdGhlIGxhcmdlc3QgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYKK3wgdGhlIGNvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMKK3wgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludF9mYXN0MTZfdCBmbG9hdDMyX3RvX2ludDE2X3JvdW5kX3RvX3plcm8oZmxvYXQzMiBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQzMl90IGFTaWc7CisgICAgaW50MzIgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSBhRXhwIC0gMHg4RTsKKyAgICBpZiAoIDAgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgaWYgKCBmbG9hdDMyX3ZhbChhKSAhPSAweEM3MDAwMDAwICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIGlmICggISBhU2lnbiB8fCAoICggYUV4cCA9PSAweEZGICkgJiYgYVNpZyApICkgeworICAgICAgICAgICAgICAgIHJldHVybiAweDdGRkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpbnQzMl90KSAweGZmZmY4MDAwOworICAgIH0KKyAgICBlbHNlIGlmICggYUV4cCA8PSAweDdFICkgeworICAgICAgICBpZiAoIGFFeHAgfCBhU2lnICkgeworICAgICAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaGlmdENvdW50IC09IDB4MTA7CisgICAgYVNpZyA9ICggYVNpZyB8IDB4MDA4MDAwMDAgKTw8ODsKKyAgICB6ID0gYVNpZz4+KCAtIHNoaWZ0Q291bnQgKTsKKyAgICBpZiAoICh1aW50MzJfdCkgKCBhU2lnPDwoIHNoaWZ0Q291bnQgJiAzMSApICkgKSB7CisgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgeiA9IC0gejsKKyAgICB9CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgcm91bmRlZAorfCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gIElmIGBhJyBpcyBhIE5hTiwgdGhlIGxhcmdlc3QKK3wgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUKK3wgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludDY0IGZsb2F0MzJfdG9faW50NjQoIGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgdWludDMyX3QgYVNpZzsKKyAgICB1aW50NjRfdCBhU2lnNjQsIGFTaWdFeHRyYTsKKyAgICBhID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSAweEJFIC0gYUV4cDsKKyAgICBpZiAoIHNoaWZ0Q291bnQgPCAwICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICBpZiAoICEgYVNpZ24gfHwgKCAoIGFFeHAgPT0gMHhGRiApICYmIGFTaWcgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBMSVQ2NCggMHg3RkZGRkZGRkZGRkZGRkZGICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChpbnQ2NF90KSBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICk7CisgICAgfQorICAgIGlmICggYUV4cCApIGFTaWcgfD0gMHgwMDgwMDAwMDsKKyAgICBhU2lnNjQgPSBhU2lnOworICAgIGFTaWc2NCA8PD0gNDA7CisgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCBhU2lnNjQsIDAsIHNoaWZ0Q291bnQsICZhU2lnNjQsICZhU2lnRXh0cmEgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50NjQoIGFTaWduLCBhU2lnNjQsIGFTaWdFeHRyYSBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZCB6ZXJvLiAgSWYKK3wgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUKK3wgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZSBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcworfCByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50NjQgZmxvYXQzMl90b19pbnQ2NF9yb3VuZF90b196ZXJvKCBmbG9hdDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQzMl90IGFTaWc7CisgICAgdWludDY0X3QgYVNpZzY0OworICAgIGludDY0IHo7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBzaGlmdENvdW50ID0gYUV4cCAtIDB4QkU7CisgICAgaWYgKCAwIDw9IHNoaWZ0Q291bnQgKSB7CisgICAgICAgIGlmICggZmxvYXQzMl92YWwoYSkgIT0gMHhERjAwMDAwMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICBpZiAoICEgYVNpZ24gfHwgKCAoIGFFeHAgPT0gMHhGRiApICYmIGFTaWcgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTElUNjQoIDB4N0ZGRkZGRkZGRkZGRkZGRiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoaW50NjRfdCkgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgIH0KKyAgICBlbHNlIGlmICggYUV4cCA8PSAweDdFICkgeworICAgICAgICBpZiAoIGFFeHAgfCBhU2lnICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZzY0ID0gYVNpZyB8IDB4MDA4MDAwMDA7CisgICAgYVNpZzY0IDw8PSA0MDsKKyAgICB6ID0gYVNpZzY0Pj4oIC0gc2hpZnRDb3VudCApOworICAgIGlmICggKHVpbnQ2NF90KSAoIGFTaWc2NDw8KCBzaGlmdENvdW50ICYgNjMgKSApICkgeworICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgfQorICAgIGlmICggYVNpZ24gKSB6ID0gLSB6OworICAgIHJldHVybiB6OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCBgYScgdG8gdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3wgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDY0IGZsb2F0MzJfdG9fZmxvYXQ2NCggZmxvYXQzMiBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cDsKKyAgICB1aW50MzJfdCBhU2lnOworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0NjQoIGZsb2F0MzJUb0NvbW1vbk5hTiggYSBTVEFUVVNfVkFSICkgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIGFTaWduLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0NjQoIGFTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgICAgICAtLWFFeHA7CisgICAgfQorICAgIHJldHVybiBwYWNrRmxvYXQ2NCggYVNpZ24sIGFFeHAgKyAweDM4MCwgKCAodWludDY0X3QpIGFTaWcgKTw8MjkgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgYGEnIHRvIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCit8IGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXR4ODAgZmxvYXQzMl90b19mbG9hdHg4MCggZmxvYXQzMiBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cDsKKyAgICB1aW50MzJfdCBhU2lnOworCisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0eDgwKCBmbG9hdDMyVG9Db21tb25OYU4oIGEgU1RBVFVTX1ZBUiApIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggYVNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggYVNpZ24sIGFFeHAgKyAweDNGODAsICggKHVpbnQ2NF90KSBhU2lnICk8PDQwICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MTI4IGZsb2F0MzJfdG9fZmxvYXQxMjgoIGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHA7CisgICAgdWludDMyX3QgYVNpZzsKKworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGlmICggYUV4cCA9PSAweEZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gY29tbW9uTmFOVG9GbG9hdDEyOCggZmxvYXQzMlRvQ29tbW9uTmFOKCBhIFNUQVRVU19WQVIgKSBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQxMjgoIGFTaWduLCAweDdGRkYsIDAsIDAgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZyA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDEyOCggYVNpZ24sIDAsIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgICAgIC0tYUV4cDsKKyAgICB9CisgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggYVNpZ24sIGFFeHAgKyAweDNGODAsICggKHVpbnQ2NF90KSBhU2lnICk8PDI1LCAwICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJvdW5kcyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgdG8gYW4gaW50ZWdlciwgYW5kCit8IHJldHVybnMgdGhlIHJlc3VsdCBhcyBhIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUuICBUaGUKK3wgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQzMiBmbG9hdDMyX3JvdW5kX3RvX2ludCggZmxvYXQzMiBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwOworICAgIHVpbnQzMl90IGxhc3RCaXRNYXNrLCByb3VuZEJpdHNNYXNrOworICAgIGludDggcm91bmRpbmdNb2RlOworICAgIHVpbnQzMl90IHo7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBpZiAoIDB4OTYgPD0gYUV4cCApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYSApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgPD0gMHg3RSApIHsKKyAgICAgICAgaWYgKCAodWludDMyX3QpICggZmxvYXQzMl92YWwoYSk8PDEgKSA9PSAwICkgcmV0dXJuIGE7CisgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICAgICAgc3dpdGNoICggU1RBVFVTKGZsb2F0X3JvdW5kaW5nX21vZGUpICkgeworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW46CisgICAgICAgICAgICBpZiAoICggYUV4cCA9PSAweDdFICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCBhU2lnbiwgMHg3RiwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX2Rvd246CisgICAgICAgICAgICByZXR1cm4gbWFrZV9mbG9hdDMyKGFTaWduID8gMHhCRjgwMDAwMCA6IDApOworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF91cDoKKyAgICAgICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MzIoYVNpZ24gPyAweDgwMDAwMDAwIDogMHgzRjgwMDAwMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCBhU2lnbiwgMCwgMCApOworICAgIH0KKyAgICBsYXN0Qml0TWFzayA9IDE7CisgICAgbGFzdEJpdE1hc2sgPDw9IDB4OTYgLSBhRXhwOworICAgIHJvdW5kQml0c01hc2sgPSBsYXN0Qml0TWFzayAtIDE7CisgICAgeiA9IGZsb2F0MzJfdmFsKGEpOworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKSB7CisgICAgICAgIHogKz0gbGFzdEJpdE1hc2s+PjE7CisgICAgICAgIGlmICggKCB6ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6ICY9IH4gbGFzdEJpdE1hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKCByb3VuZGluZ01vZGUgIT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgaWYgKCBleHRyYWN0RmxvYXQzMlNpZ24oIG1ha2VfZmxvYXQzMih6KSApIF4gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSApIHsKKyAgICAgICAgICAgIHogKz0gcm91bmRCaXRzTWFzazsKKyAgICAgICAgfQorICAgIH0KKyAgICB6ICY9IH4gcm91bmRCaXRzTWFzazsKKyAgICBpZiAoIHogIT0gZmxvYXQzMl92YWwoYSkgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgcmV0dXJuIG1ha2VfZmxvYXQzMih6KTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uCit8IGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgMSwgdGhlIHN1bSBpcyBuZWdhdGVkCit8IGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IGlzIGEgTmFOLgorfCBUaGUgYWRkaXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQzMiBhZGRGbG9hdDMyU2lncyggZmxvYXQzMiBhLCBmbG9hdDMyIGIsIGZsYWcgelNpZ24gU1RBVFVTX1BBUkFNKQoreworICAgIGludF9mYXN0MTZfdCBhRXhwLCBiRXhwLCB6RXhwOworICAgIHVpbnQzMl90IGFTaWcsIGJTaWcsIHpTaWc7CisgICAgaW50X2Zhc3QxNl90IGV4cERpZmY7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYiApOworICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBhU2lnIDw8PSA2OworICAgIGJTaWcgPDw9IDY7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIC0tZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJTaWcgfD0gMHgyMDAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDMyUmlnaHRKYW1taW5nKCBiU2lnLCBleHBEaWZmLCAmYlNpZyApOworICAgICAgICB6RXhwID0gYUV4cDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDB4RkYsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgICAgICsrZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFTaWcgfD0gMHgyMDAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDMyUmlnaHRKYW1taW5nKCBhU2lnLCAtIGV4cERpZmYsICZhU2lnICk7CisgICAgICAgIHpFeHAgPSBiRXhwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcgfCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgICAgICBpZiAoU1RBVFVTKGZsdXNoX3RvX3plcm8pKSB7CisgICAgICAgICAgICAgICAgaWYgKGFTaWcgfCBiU2lnKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfb3V0cHV0X2Rlbm9ybWFsIFNUQVRVU19WQVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoelNpZ24sIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMCwgKCBhU2lnICsgYlNpZyApPj42ICk7CisgICAgICAgIH0KKyAgICAgICAgelNpZyA9IDB4NDAwMDAwMDAgKyBhU2lnICsgYlNpZzsKKyAgICAgICAgekV4cCA9IGFFeHA7CisgICAgICAgIGdvdG8gcm91bmRBbmRQYWNrOworICAgIH0KKyAgICBhU2lnIHw9IDB4MjAwMDAwMDA7CisgICAgelNpZyA9ICggYVNpZyArIGJTaWcgKTw8MTsKKyAgICAtLXpFeHA7CisgICAgaWYgKCAoaW50MzJfdCkgelNpZyA8IDAgKSB7CisgICAgICAgIHpTaWcgPSBhU2lnICsgYlNpZzsKKyAgICAgICAgKyt6RXhwOworICAgIH0KKyByb3VuZEFuZFBhY2s6CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCB6RXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIHNpbmdsZS0KK3wgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgMSwgdGhlCit8IGRpZmZlcmVuY2UgaXMgbmVnYXRlZCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuICBgelNpZ24nIGlzIGlnbm9yZWQgaWYgdGhlCit8IHJlc3VsdCBpcyBhIE5hTi4gIFRoZSBzdWJ0cmFjdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorfCBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBmbG9hdDMyIHN1YkZsb2F0MzJTaWdzKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxhZyB6U2lnbiBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDMyX3QgYVNpZywgYlNpZywgelNpZzsKKyAgICBpbnRfZmFzdDE2X3QgZXhwRGlmZjsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MzJFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPDw9IDc7CisgICAgYlNpZyA8PD0gNzsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgZ290byBhRXhwQmlnZ2VyOworICAgIGlmICggZXhwRGlmZiA8IDAgKSBnb3RvIGJFeHBCaWdnZXI7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8IGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgYUV4cCA9IDE7CisgICAgICAgIGJFeHAgPSAxOworICAgIH0KKyAgICBpZiAoIGJTaWcgPCBhU2lnICkgZ290byBhQmlnZ2VyOworICAgIGlmICggYVNpZyA8IGJTaWcgKSBnb3RvIGJCaWdnZXI7CisgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPT0gZmxvYXRfcm91bmRfZG93biwgMCwgMCApOworIGJFeHBCaWdnZXI6CisgICAgaWYgKCBiRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiBeIDEsIDB4RkYsIDAgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgICsrZXhwRGlmZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFTaWcgfD0gMHg0MDAwMDAwMDsKKyAgICB9CisgICAgc2hpZnQzMlJpZ2h0SmFtbWluZyggYVNpZywgLSBleHBEaWZmLCAmYVNpZyApOworICAgIGJTaWcgfD0gMHg0MDAwMDAwMDsKKyBiQmlnZ2VyOgorICAgIHpTaWcgPSBiU2lnIC0gYVNpZzsKKyAgICB6RXhwID0gYkV4cDsKKyAgICB6U2lnbiBePSAxOworICAgIGdvdG8gbm9ybWFsaXplUm91bmRBbmRQYWNrOworIGFFeHBCaWdnZXI6CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICAtLWV4cERpZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBiU2lnIHw9IDB4NDAwMDAwMDA7CisgICAgfQorICAgIHNoaWZ0MzJSaWdodEphbW1pbmcoIGJTaWcsIGV4cERpZmYsICZiU2lnICk7CisgICAgYVNpZyB8PSAweDQwMDAwMDAwOworIGFCaWdnZXI6CisgICAgelNpZyA9IGFTaWcgLSBiU2lnOworICAgIHpFeHAgPSBhRXhwOworIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazoKKyAgICAtLXpFeHA7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCB6RXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnCit8IGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvcgorfCBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQzMiBmbG9hdDMyX2FkZCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICBhID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduID09IGJTaWduICkgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQzMlNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0MzJTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzCit8IGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZAorfCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXQzMl9zdWIoIGZsb2F0MzIgYSwgZmxvYXQzMiBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiA9PSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0MzJTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQzMlNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMKK3wgYGEnIGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkCit8IGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQzMiBmbG9hdDMyX211bCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbiwgelNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDMyX3QgYVNpZywgYlNpZzsKKyAgICB1aW50NjRfdCB6U2lnNjQ7CisgICAgdWludDMyX3QgelNpZzsKKworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgelNpZ24gPSBhU2lnbiBeIGJTaWduOworICAgIGlmICggYUV4cCA9PSAweEZGICkgeworICAgICAgICBpZiAoIGFTaWcgfHwgKCAoIGJFeHAgPT0gMHhGRiApICYmIGJTaWcgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggYkV4cCB8IGJTaWcgKSA9PSAwICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gZmxvYXQzMl9kZWZhdWx0X25hbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCAweEZGLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYlNpZywgJmJFeHAsICZiU2lnICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwICsgYkV4cCAtIDB4N0Y7CisgICAgYVNpZyA9ICggYVNpZyB8IDB4MDA4MDAwMDAgKTw8NzsKKyAgICBiU2lnID0gKCBiU2lnIHwgMHgwMDgwMDAwMCApPDw4OworICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoICggKHVpbnQ2NF90KSBhU2lnICkgKiBiU2lnLCAzMiwgJnpTaWc2NCApOworICAgIHpTaWcgPSB6U2lnNjQ7CisgICAgaWYgKCAwIDw9IChpbnQzMl90KSAoIHpTaWc8PDEgKSApIHsKKyAgICAgICAgelNpZyA8PD0gMTsKKyAgICAgICAgLS16RXhwOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIHpFeHAsIHpTaWcgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnCit8IGJ5IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUKK3wgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDMyIGZsb2F0MzJfZGl2KCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduLCB6U2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cCwgYkV4cCwgekV4cDsKKyAgICB1aW50MzJfdCBhU2lnLCBiU2lnLCB6U2lnOworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgelNpZ24gPSBhU2lnbiBeIGJTaWduOworICAgIGlmICggYUV4cCA9PSAweEZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIGlmICggYkV4cCA9PSAweEZGICkgeworICAgICAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKCB6U2lnbiwgMCwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBiU2lnID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19kaXZieXplcm8gU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoIHpTaWduLCAweEZGLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYlNpZywgJmJFeHAsICZiU2lnICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQzMiggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwIC0gYkV4cCArIDB4N0Q7CisgICAgYVNpZyA9ICggYVNpZyB8IDB4MDA4MDAwMDAgKTw8NzsKKyAgICBiU2lnID0gKCBiU2lnIHwgMHgwMDgwMDAwMCApPDw4OworICAgIGlmICggYlNpZyA8PSAoIGFTaWcgKyBhU2lnICkgKSB7CisgICAgICAgIGFTaWcgPj49IDE7CisgICAgICAgICsrekV4cDsKKyAgICB9CisgICAgelNpZyA9ICggKCAodWludDY0X3QpIGFTaWcgKTw8MzIgKSAvIGJTaWc7CisgICAgaWYgKCAoIHpTaWcgJiAweDNGICkgPT0gMCApIHsKKyAgICAgICAgelNpZyB8PSAoICh1aW50NjRfdCkgYlNpZyAqIHpTaWcgIT0gKCAodWludDY0X3QpIGFTaWcgKTw8MzIgKTsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIHpTaWduLCB6RXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJworfCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQKK3wgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXQzMl9yZW0oIGZsb2F0MzIgYSwgZmxvYXQzMiBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgelNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgdWludDMyX3QgYVNpZywgYlNpZzsKKyAgICB1aW50MzJfdCBxOworICAgIHVpbnQ2NF90IGFTaWc2NCwgYlNpZzY0LCBxNjQ7CisgICAgdWludDMyX3QgYWx0ZXJuYXRlQVNpZzsKKyAgICBpbnQzMl90IHNpZ01lYW47CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBiICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8fCAoICggYkV4cCA9PSAweEZGICkgJiYgYlNpZyApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBiU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYlNpZyA9PSAwICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgYlNpZyB8PSAweDAwODAwMDAwOworICAgIGlmICggZXhwRGlmZiA8IDMyICkgeworICAgICAgICBhU2lnIDw8PSA4OworICAgICAgICBiU2lnIDw8PSA4OworICAgICAgICBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICAgICAgaWYgKCBleHBEaWZmIDwgLTEgKSByZXR1cm4gYTsKKyAgICAgICAgICAgIGFTaWcgPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgcSA9ICggYlNpZyA8PSBhU2lnICk7CisgICAgICAgIGlmICggcSApIGFTaWcgLT0gYlNpZzsKKyAgICAgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgICAgIHEgPSAoICggKHVpbnQ2NF90KSBhU2lnICk8PDMyICkgLyBiU2lnOworICAgICAgICAgICAgcSA+Pj0gMzIgLSBleHBEaWZmOworICAgICAgICAgICAgYlNpZyA+Pj0gMjsKKyAgICAgICAgICAgIGFTaWcgPSAoICggYVNpZz4+MSApPDwoIGV4cERpZmYgLSAxICkgKSAtIGJTaWcgKiBxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYVNpZyA+Pj0gMjsKKyAgICAgICAgICAgIGJTaWcgPj49IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYlNpZyA8PSBhU2lnICkgYVNpZyAtPSBiU2lnOworICAgICAgICBhU2lnNjQgPSAoICh1aW50NjRfdCkgYVNpZyApPDw0MDsKKyAgICAgICAgYlNpZzY0ID0gKCAodWludDY0X3QpIGJTaWcgKTw8NDA7CisgICAgICAgIGV4cERpZmYgLT0gNjQ7CisgICAgICAgIHdoaWxlICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgICAgICBxNjQgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWc2NCwgMCwgYlNpZzY0ICk7CisgICAgICAgICAgICBxNjQgPSAoIDIgPCBxNjQgKSA/IHE2NCAtIDIgOiAwOworICAgICAgICAgICAgYVNpZzY0ID0gLSAoICggYlNpZyAqIHE2NCApPDwzOCApOworICAgICAgICAgICAgZXhwRGlmZiAtPSA2MjsKKyAgICAgICAgfQorICAgICAgICBleHBEaWZmICs9IDY0OworICAgICAgICBxNjQgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWc2NCwgMCwgYlNpZzY0ICk7CisgICAgICAgIHE2NCA9ICggMiA8IHE2NCApID8gcTY0IC0gMiA6IDA7CisgICAgICAgIHEgPSBxNjQ+PiggNjQgLSBleHBEaWZmICk7CisgICAgICAgIGJTaWcgPDw9IDY7CisgICAgICAgIGFTaWcgPSAoICggYVNpZzY0Pj4zMyApPDwoIGV4cERpZmYgLSAxICkgKSAtIGJTaWcgKiBxOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGFsdGVybmF0ZUFTaWcgPSBhU2lnOworICAgICAgICArK3E7CisgICAgICAgIGFTaWcgLT0gYlNpZzsKKyAgICB9IHdoaWxlICggMCA8PSAoaW50MzJfdCkgYVNpZyApOworICAgIHNpZ01lYW4gPSBhU2lnICsgYWx0ZXJuYXRlQVNpZzsKKyAgICBpZiAoICggc2lnTWVhbiA8IDAgKSB8fCAoICggc2lnTWVhbiA9PSAwICkgJiYgKCBxICYgMSApICkgKSB7CisgICAgICAgIGFTaWcgPSBhbHRlcm5hdGVBU2lnOworICAgIH0KKyAgICB6U2lnbiA9ICggKGludDMyX3QpIGFTaWcgPCAwICk7CisgICAgaWYgKCB6U2lnbiApIGFTaWcgPSAtIGFTaWc7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIGFTaWduIF4gelNpZ24sIGJFeHAsIGFTaWcgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzCit8IGBhJyBhbmQgYGInIHRoZW4gYWRkaW5nICdjJywgd2l0aCBubyBpbnRlcm1lZGlhdGUgcm91bmRpbmcgc3RlcCBhZnRlciB0aGUKK3wgbXVsdGlwbGljYXRpb24uICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyA3NTQtMjAwOC4KK3wgVGhlIGZsYWdzIGFyZ3VtZW50IGFsbG93cyB0aGUgY2FsbGVyIHRvIHNlbGVjdCBuZWdhdGlvbiBvZiB0aGUKK3wgYWRkZW5kLCB0aGUgaW50ZXJtZWRpYXRlIHByb2R1Y3QsIG9yIHRoZSBmaW5hbCByZXN1bHQuIChUaGUgZGlmZmVyZW5jZQorfCBiZXR3ZWVuIHRoaXMgYW5kIGhhdmluZyB0aGUgY2FsbGVyIGRvIGEgc2VwYXJhdGUgbmVnYXRpb24gaXMgdGhhdCBuZWdhdGluZworfCBleHRlcm5hbGx5IHdpbGwgZmxpcCB0aGUgc2lnbiBiaXQgb24gTmFOcy4pCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXQzMl9tdWxhZGQoZmxvYXQzMiBhLCBmbG9hdDMyIGIsIGZsb2F0MzIgYywgaW50IGZsYWdzIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbiwgY1NpZ24sIHpTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBiRXhwLCBjRXhwLCBwRXhwLCB6RXhwLCBleHBEaWZmOworICAgIHVpbnQzMl90IGFTaWcsIGJTaWcsIGNTaWc7CisgICAgZmxhZyBwSW5mLCBwWmVybywgcFNpZ247CisgICAgdWludDY0X3QgcFNpZzY0LCBjU2lnNjQsIHpTaWc2NDsKKyAgICB1aW50MzJfdCBwU2lnOworICAgIGludCBzaGlmdGNvdW50OworICAgIGZsYWcgc2lnbmZsaXAsIGluZnplcm87CisKKyAgICBhID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKyAgICBjID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYyBTVEFUVVNfVkFSKTsKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKGEpOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cChhKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbihhKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKGIpOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQzMkV4cChiKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbihiKTsKKyAgICBjU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKGMpOworICAgIGNFeHAgPSBleHRyYWN0RmxvYXQzMkV4cChjKTsKKyAgICBjU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbihjKTsKKworICAgIGluZnplcm8gPSAoKGFFeHAgPT0gMCAmJiBhU2lnID09IDAgJiYgYkV4cCA9PSAweGZmICYmIGJTaWcgPT0gMCkgfHwKKyAgICAgICAgICAgICAgIChhRXhwID09IDB4ZmYgJiYgYVNpZyA9PSAwICYmIGJFeHAgPT0gMCAmJiBiU2lnID09IDApKTsKKworICAgIC8qIEl0IGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQgd2hldGhlciB0aGUgY2FzZXMgb2YgKDAsaW5mLHFuYW4pCisgICAgICogYW5kIChpbmYsMCxxbmFuKSByYWlzZSBJbnZhbGlkT3BlcmF0aW9uIG9yIG5vdCAoYW5kIHdoYXQgUU5hTgorICAgICAqIHRoZXkgcmV0dXJuIGlmIHRoZXkgZG8pLCBzbyB3ZSBoYXZlIHRvIGhhbmQgdGhpcyBpbmZvcm1hdGlvbgorICAgICAqIG9mZiB0byB0aGUgdGFyZ2V0LXNwZWNpZmljIHBpY2stYS1OYU4gcm91dGluZS4KKyAgICAgKi8KKyAgICBpZiAoKChhRXhwID09IDB4ZmYpICYmIGFTaWcpIHx8CisgICAgICAgICgoYkV4cCA9PSAweGZmKSAmJiBiU2lnKSB8fAorICAgICAgICAoKGNFeHAgPT0gMHhmZikgJiYgY1NpZykpIHsKKyAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJNdWxBZGROYU4oYSwgYiwgYywgaW5memVybyBTVEFUVVNfVkFSKTsKKyAgICB9CisKKyAgICBpZiAoaW5memVybykgeworICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKworICAgIGlmIChmbGFncyAmIGZsb2F0X211bGFkZF9uZWdhdGVfYykgeworICAgICAgICBjU2lnbiBePSAxOworICAgIH0KKworICAgIHNpZ25mbGlwID0gKGZsYWdzICYgZmxvYXRfbXVsYWRkX25lZ2F0ZV9yZXN1bHQpID8gMSA6IDA7CisKKyAgICAvKiBXb3JrIG91dCB0aGUgc2lnbiBhbmQgdHlwZSBvZiB0aGUgcHJvZHVjdCAqLworICAgIHBTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoZmxhZ3MgJiBmbG9hdF9tdWxhZGRfbmVnYXRlX3Byb2R1Y3QpIHsKKyAgICAgICAgcFNpZ24gXj0gMTsKKyAgICB9CisgICAgcEluZiA9IChhRXhwID09IDB4ZmYpIHx8IChiRXhwID09IDB4ZmYpOworICAgIHBaZXJvID0gKChhRXhwIHwgYVNpZykgPT0gMCkgfHwgKChiRXhwIHwgYlNpZykgPT0gMCk7CisKKyAgICBpZiAoY0V4cCA9PSAweGZmKSB7CisgICAgICAgIGlmIChwSW5mICYmIChwU2lnbiBeIGNTaWduKSkgeworICAgICAgICAgICAgLyogYWRkaXRpb24gb2Ygb3Bwb3NpdGUtc2lnbmVkIGluZmluaXRpZXMgPT4gSW52YWxpZE9wZXJhdGlvbiAqLworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgICAgIH0KKyAgICAgICAgLyogT3RoZXJ3aXNlIGdlbmVyYXRlIGFuIGluZmluaXR5IG9mIHRoZSBzYW1lIHNpZ24gKi8KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKGNTaWduIF4gc2lnbmZsaXAsIDB4ZmYsIDApOworICAgIH0KKworICAgIGlmIChwSW5mKSB7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMihwU2lnbiBeIHNpZ25mbGlwLCAweGZmLCAwKTsKKyAgICB9CisKKyAgICBpZiAocFplcm8pIHsKKyAgICAgICAgaWYgKGNFeHAgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNTaWcgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIEFkZGluZyB0d28gZXhhY3QgemVyb2VzICovCisgICAgICAgICAgICAgICAgaWYgKHBTaWduID09IGNTaWduKSB7CisgICAgICAgICAgICAgICAgICAgIHpTaWduID0gcFNpZ247CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPT0gZmxvYXRfcm91bmRfZG93bikgeworICAgICAgICAgICAgICAgICAgICB6U2lnbiA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgelNpZ24gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoelNpZ24gXiBzaWduZmxpcCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFeGFjdCB6ZXJvIHBsdXMgYSBkZW5vcm0gKi8KKyAgICAgICAgICAgIGlmIChTVEFUVVMoZmx1c2hfdG9femVybykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MzIoY1NpZ24gXiBzaWduZmxpcCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogWmVybyBwbHVzIHNvbWV0aGluZyBub24temVybyA6IGp1c3QgcmV0dXJuIHRoZSBzb21ldGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKGNTaWduIF4gc2lnbmZsaXAsIGNFeHAsIGNTaWcpOworICAgIH0KKworICAgIGlmIChhRXhwID09IDApIHsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbChhU2lnLCAmYUV4cCwgJmFTaWcpOworICAgIH0KKyAgICBpZiAoYkV4cCA9PSAwKSB7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoYlNpZywgJmJFeHAsICZiU2lnKTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCByZXN1bHQgYSAqIGIgKyBjICovCisKKyAgICAvKiBNdWx0aXBseSBmaXJzdDsgdGhpcyBpcyBlYXN5LiAqLworICAgIC8qIE5COiB3ZSBzdWJ0cmFjdCAweDdlIHdoZXJlIGZsb2F0MzJfbXVsKCkgc3VidHJhY3RzIDB4N2YKKyAgICAgKiBiZWNhdXNlIHdlIHdhbnQgdGhlIHRydWUgZXhwb25lbnQsIG5vdCB0aGUgIm9uZS1sZXNzLXRoYW4iCisgICAgICogZmxhdm91ciB0aGF0IHJvdW5kQW5kUGFja0Zsb2F0MzIoKSB0YWtlcy4KKyAgICAgKi8KKyAgICBwRXhwID0gYUV4cCArIGJFeHAgLSAweDdlOworICAgIGFTaWcgPSAoYVNpZyB8IDB4MDA4MDAwMDApIDw8IDc7CisgICAgYlNpZyA9IChiU2lnIHwgMHgwMDgwMDAwMCkgPDwgODsKKyAgICBwU2lnNjQgPSAodWludDY0X3QpYVNpZyAqIGJTaWc7CisgICAgaWYgKChpbnQ2NF90KShwU2lnNjQgPDwgMSkgPj0gMCkgeworICAgICAgICBwU2lnNjQgPDw9IDE7CisgICAgICAgIHBFeHAtLTsKKyAgICB9CisKKyAgICB6U2lnbiA9IHBTaWduIF4gc2lnbmZsaXA7CisKKyAgICAvKiBOb3cgcFNpZzY0IGlzIHRoZSBzaWduaWZpY2FuZCBvZiB0aGUgbXVsdGlwbHksIHdpdGggdGhlIGV4cGxpY2l0IGJpdCBpbgorICAgICAqIHBvc2l0aW9uIDYyLgorICAgICAqLworICAgIGlmIChjRXhwID09IDApIHsKKyAgICAgICAgaWYgKCFjU2lnKSB7CisgICAgICAgICAgICAvKiBUaHJvdyBvdXQgdGhlIHNwZWNpYWwgY2FzZSBvZiBjIGJlaW5nIGFuIGV4YWN0IHplcm8gbm93ICovCisgICAgICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKHBTaWc2NCwgMzIsICZwU2lnNjQpOworICAgICAgICAgICAgcFNpZyA9IHBTaWc2NDsKKyAgICAgICAgICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKHpTaWduLCBwRXhwIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaWcgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbChjU2lnLCAmY0V4cCwgJmNTaWcpOworICAgIH0KKworICAgIGNTaWc2NCA9ICh1aW50NjRfdCljU2lnIDw8ICg2MiAtIDIzKTsKKyAgICBjU2lnNjQgfD0gTElUNjQoMHg0MDAwMDAwMDAwMDAwMDAwKTsKKyAgICBleHBEaWZmID0gcEV4cCAtIGNFeHA7CisKKyAgICBpZiAocFNpZ24gPT0gY1NpZ24pIHsKKyAgICAgICAgLyogQWRkaXRpb24gKi8KKyAgICAgICAgaWYgKGV4cERpZmYgPiAwKSB7CisgICAgICAgICAgICAvKiBzY2FsZSBjIHRvIG1hdGNoIHAgKi8KKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoY1NpZzY0LCBleHBEaWZmLCAmY1NpZzY0KTsKKyAgICAgICAgICAgIHpFeHAgPSBwRXhwOworICAgICAgICB9IGVsc2UgaWYgKGV4cERpZmYgPCAwKSB7CisgICAgICAgICAgICAvKiBzY2FsZSBwIHRvIG1hdGNoIGMgKi8KKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcocFNpZzY0LCAtZXhwRGlmZiwgJnBTaWc2NCk7CisgICAgICAgICAgICB6RXhwID0gY0V4cDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vIHNjYWxpbmcgbmVlZGVkICovCisgICAgICAgICAgICB6RXhwID0gY0V4cDsKKyAgICAgICAgfQorICAgICAgICAvKiBBZGQgc2lnbmlmaWNhbmRzIGFuZCBtYWtlIHN1cmUgZXhwbGljaXQgYml0IGVuZHMgdXAgaW4gcG9zbiA2MiAqLworICAgICAgICB6U2lnNjQgPSBwU2lnNjQgKyBjU2lnNjQ7CisgICAgICAgIGlmICgoaW50NjRfdCl6U2lnNjQgPCAwKSB7CisgICAgICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKHpTaWc2NCwgMSwgJnpTaWc2NCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6RXhwLS07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTdWJ0cmFjdGlvbiAqLworICAgICAgICBpZiAoZXhwRGlmZiA+IDApIHsKKyAgICAgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoY1NpZzY0LCBleHBEaWZmLCAmY1NpZzY0KTsKKyAgICAgICAgICAgIHpTaWc2NCA9IHBTaWc2NCAtIGNTaWc2NDsKKyAgICAgICAgICAgIHpFeHAgPSBwRXhwOworICAgICAgICB9IGVsc2UgaWYgKGV4cERpZmYgPCAwKSB7CisgICAgICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKHBTaWc2NCwgLWV4cERpZmYsICZwU2lnNjQpOworICAgICAgICAgICAgelNpZzY0ID0gY1NpZzY0IC0gcFNpZzY0OworICAgICAgICAgICAgekV4cCA9IGNFeHA7CisgICAgICAgICAgICB6U2lnbiBePSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgekV4cCA9IHBFeHA7CisgICAgICAgICAgICBpZiAoY1NpZzY0IDwgcFNpZzY0KSB7CisgICAgICAgICAgICAgICAgelNpZzY0ID0gcFNpZzY0IC0gY1NpZzY0OworICAgICAgICAgICAgfSBlbHNlIGlmIChwU2lnNjQgPCBjU2lnNjQpIHsKKyAgICAgICAgICAgICAgICB6U2lnNjQgPSBjU2lnNjQgLSBwU2lnNjQ7CisgICAgICAgICAgICAgICAgelNpZ24gXj0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRXhhY3QgemVybyAqLworICAgICAgICAgICAgICAgIHpTaWduID0gc2lnbmZsaXA7CisgICAgICAgICAgICAgICAgaWYgKFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSA9PSBmbG9hdF9yb3VuZF9kb3duKSB7CisgICAgICAgICAgICAgICAgICAgIHpTaWduIF49IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMih6U2lnbiwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLS16RXhwOworICAgICAgICAvKiBOb3JtYWxpemUgdG8gcHV0IHRoZSBleHBsaWNpdCBiaXQgYmFjayBpbnRvIGJpdCA2Mi4gKi8KKyAgICAgICAgc2hpZnRjb3VudCA9IGNvdW50TGVhZGluZ1plcm9zNjQoelNpZzY0KSAtIDE7CisgICAgICAgIHpTaWc2NCA8PD0gc2hpZnRjb3VudDsKKyAgICAgICAgekV4cCAtPSBzaGlmdGNvdW50OworICAgIH0KKyAgICBzaGlmdDY0UmlnaHRKYW1taW5nKHpTaWc2NCwgMzIsICZ6U2lnNjQpOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKHpTaWduLCB6RXhwLCB6U2lnNjQgU1RBVFVTX1ZBUik7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KK3wgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXQzMl9zcXJ0KCBmbG9hdDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCB6RXhwOworICAgIHVpbnQzMl90IGFTaWcsIHpTaWc7CisgICAgdWludDY0X3QgcmVtLCB0ZXJtOworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDMyTmFOKCBhLCBmbG9hdDMyX3plcm8gU1RBVFVTX1ZBUiApOworICAgICAgICBpZiAoICEgYVNpZ24gKSByZXR1cm4gYTsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYVNpZ24gKSB7CisgICAgICAgIGlmICggKCBhRXhwIHwgYVNpZyApID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBmbG9hdDMyX3plcm87CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MzJTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICB6RXhwID0gKCAoIGFFeHAgLSAweDdGICk+PjEgKSArIDB4N0U7CisgICAgYVNpZyA9ICggYVNpZyB8IDB4MDA4MDAwMDAgKTw8ODsKKyAgICB6U2lnID0gZXN0aW1hdGVTcXJ0MzIoIGFFeHAsIGFTaWcgKSArIDI7CisgICAgaWYgKCAoIHpTaWcgJiAweDdGICkgPD0gNSApIHsKKyAgICAgICAgaWYgKCB6U2lnIDwgMiApIHsKKyAgICAgICAgICAgIHpTaWcgPSAweDdGRkZGRkZGOworICAgICAgICAgICAgZ290byByb3VuZEFuZFBhY2s7CisgICAgICAgIH0KKyAgICAgICAgYVNpZyA+Pj0gYUV4cCAmIDE7CisgICAgICAgIHRlcm0gPSAoICh1aW50NjRfdCkgelNpZyApICogelNpZzsKKyAgICAgICAgcmVtID0gKCAoICh1aW50NjRfdCkgYVNpZyApPDwzMiApIC0gdGVybTsKKyAgICAgICAgd2hpbGUgKCAoaW50NjRfdCkgcmVtIDwgMCApIHsKKyAgICAgICAgICAgIC0telNpZzsKKyAgICAgICAgICAgIHJlbSArPSAoICggKHVpbnQ2NF90KSB6U2lnICk8PDEgKSB8IDE7CisgICAgICAgIH0KKyAgICAgICAgelNpZyB8PSAoIHJlbSAhPSAwICk7CisgICAgfQorICAgIHNoaWZ0MzJSaWdodEphbW1pbmcoIHpTaWcsIDEsICZ6U2lnICk7Cisgcm91bmRBbmRQYWNrOgorICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKCAwLCB6RXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgYmluYXJ5IGV4cG9uZW50aWFsIG9mIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJy4gVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IKK3wgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCit8Cit8IFVzZXMgdGhlIGZvbGxvd2luZyBpZGVudGl0aWVzOgorfAorfCAxLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8ICAgICAgeCAgICB4KmxuKDIpCit8ICAgICAyICA9IGUKK3wKK3wgMi4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCAgICAgICAgICAgICAgICAgICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICAgICAgICBuCit8ICAgICAgeCAgICAgICAgeCAgICAgeCAgICAgeCAgICAgeCAgICAgeCAgICAgICAgICAgeAorfCAgICAgZSAgPSAxICsgLS0tICsgLS0tICsgLS0tICsgLS0tICsgLS0tICsgLi4uICsgLS0tICsgLi4uCit8ICAgICAgICAgICAgICAgMSEgICAgMiEgICAgMyEgICAgNCEgICAgNSEgICAgICAgICAgbiEKKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGNvbnN0IGZsb2F0NjQgZmxvYXQzMl9leHAyX2NvZWZmaWNpZW50c1sxNV0gPQoreworICAgIGNvbnN0X2Zsb2F0NjQoIDB4M2ZmMDAwMDAwMDAwMDAwMGxsICksIC8qICAxICovCisgICAgY29uc3RfZmxvYXQ2NCggMHgzZmUwMDAwMDAwMDAwMDAwbGwgKSwgLyogIDIgKi8KKyAgICBjb25zdF9mbG9hdDY0KCAweDNmYzU1NTU1NTU1NTU1NTVsbCApLCAvKiAgMyAqLworICAgIGNvbnN0X2Zsb2F0NjQoIDB4M2ZhNTU1NTU1NTU1NTU1NWxsICksIC8qICA0ICovCisgICAgY29uc3RfZmxvYXQ2NCggMHgzZjgxMTExMTExMTExMTExbGwgKSwgLyogIDUgKi8KKyAgICBjb25zdF9mbG9hdDY0KCAweDNmNTZjMTZjMTZjMTZjMTdsbCApLCAvKiAgNiAqLworICAgIGNvbnN0X2Zsb2F0NjQoIDB4M2YyYTAxYTAxYTAxYTAxYWxsICksIC8qICA3ICovCisgICAgY29uc3RfZmxvYXQ2NCggMHgzZWZhMDFhMDFhMDFhMDFhbGwgKSwgLyogIDggKi8KKyAgICBjb25zdF9mbG9hdDY0KCAweDNlYzcxZGUzYTU1NmM3MzRsbCApLCAvKiAgOSAqLworICAgIGNvbnN0X2Zsb2F0NjQoIDB4M2U5MjdlNGZiNzc4OWY1Y2xsICksIC8qIDEwICovCisgICAgY29uc3RfZmxvYXQ2NCggMHgzZTVhZTY0NTY3ZjU0NGU0bGwgKSwgLyogMTEgKi8KKyAgICBjb25zdF9mbG9hdDY0KCAweDNlMjFlZWQ4ZWZmOGQ4OThsbCApLCAvKiAxMiAqLworICAgIGNvbnN0X2Zsb2F0NjQoIDB4M2RlNjEyNDYxM2E4NmQwOWxsICksIC8qIDEzICovCisgICAgY29uc3RfZmxvYXQ2NCggMHgzZGE5Mzk3NGE4YzA3YzlkbGwgKSwgLyogMTQgKi8KKyAgICBjb25zdF9mbG9hdDY0KCAweDNkNmFlN2YzZTczM2I4MWZsbCApLCAvKiAxNSAqLworfTsKKworZmxvYXQzMiBmbG9hdDMyX2V4cDIoIGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHA7CisgICAgdWludDMyX3QgYVNpZzsKKyAgICBmbG9hdDY0IHIsIHgsIHhuOworICAgIGludCBpOworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisKKyAgICBpZiAoIGFFeHAgPT0gMHhGRikgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQzMk5hTiggYSwgZmxvYXQzMl96ZXJvIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIChhU2lnbikgPyBmbG9hdDMyX3plcm8gOiBhOworICAgIH0KKyAgICBpZiAoYUV4cCA9PSAwKSB7CisgICAgICAgIGlmIChhU2lnID09IDApIHJldHVybiBmbG9hdDMyX29uZTsKKyAgICB9CisKKyAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbmV4YWN0IFNUQVRVU19WQVIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworICAgIC8qIHVzaW5nIGZsb2F0NjQgZm9yIGFwcHJveGltYXRpb24gKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisgICAgeCA9IGZsb2F0MzJfdG9fZmxvYXQ2NChhIFNUQVRVU19WQVIpOworICAgIHggPSBmbG9hdDY0X211bCh4LCBmbG9hdDY0X2xuMiBTVEFUVVNfVkFSKTsKKworICAgIHhuID0geDsKKyAgICByID0gZmxvYXQ2NF9vbmU7CisgICAgZm9yIChpID0gMCA7IGkgPCAxNSA7IGkrKykgeworICAgICAgICBmbG9hdDY0IGY7CisKKyAgICAgICAgZiA9IGZsb2F0NjRfbXVsKHhuLCBmbG9hdDMyX2V4cDJfY29lZmZpY2llbnRzW2ldIFNUQVRVU19WQVIpOworICAgICAgICByID0gZmxvYXQ2NF9hZGQociwgZiBTVEFUVVNfVkFSKTsKKworICAgICAgICB4biA9IGZsb2F0NjRfbXVsKHhuLCB4IFNUQVRVU19WQVIpOworICAgIH0KKworICAgIHJldHVybiBmbG9hdDY0X3RvX2Zsb2F0MzIociwgc3RhdHVzKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIGJpbmFyeSBsb2cgb2YgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorfCBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Zsb2F0MzIgZmxvYXQzMl9sb2cyKCBmbG9hdDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCB6U2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cDsKKyAgICB1aW50MzJfdCBhU2lnLCB6U2lnLCBpOworCisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisKKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0MzIoIDEsIDB4RkYsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQzMlN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYVNpZ24gKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDMyX2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGZsb2F0MzJfemVybyBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIGFFeHAgLT0gMHg3RjsKKyAgICBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgelNpZ24gPSBhRXhwIDwgMDsKKyAgICB6U2lnID0gYUV4cCA8PCAyMzsKKworICAgIGZvciAoaSA9IDEgPDwgMjI7IGkgPiAwOyBpID4+PSAxKSB7CisgICAgICAgIGFTaWcgPSAoICh1aW50NjRfdClhU2lnICogYVNpZyApID4+IDIzOworICAgICAgICBpZiAoIGFTaWcgJiAweDAxMDAwMDAwICkgeworICAgICAgICAgICAgYVNpZyA+Pj0gMTsKKyAgICAgICAgICAgIHpTaWcgfD0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggelNpZ24gKQorICAgICAgICB6U2lnID0gLXpTaWc7CisKKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQzMiggelNpZ24sIDB4ODUsIHpTaWcgU1RBVFVTX1ZBUiApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbCB0bworfCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcworfCByYWlzZWQgaWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfZXEoIGZsb2F0MzIgYSwgZmxvYXQzMiBiIFNUQVRVU19QQVJBTSApCit7CisgICAgdWludDMyX3QgYXYsIGJ2OworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2ID0gZmxvYXQzMl92YWwoYSk7CisgICAgYnYgPSBmbG9hdDMyX3ZhbChiKTsKKyAgICByZXR1cm4gKCBhdiA9PSBidiApIHx8ICggKHVpbnQzMl90KSAoICggYXYgfCBidiApPDwxICkgPT0gMCApOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUgaW52YWxpZAorfCBleGNlcHRpb24gaXMgcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQzMl9sZSggZmxvYXQzMiBhLCBmbG9hdDMyIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICB1aW50MzJfdCBhdiwgYnY7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQzMkV4cCggYSApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGIgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYiApOworICAgIGF2ID0gZmxvYXQzMl92YWwoYSk7CisgICAgYnYgPSBmbG9hdDMyX3ZhbChiKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgcmV0dXJuIGFTaWduIHx8ICggKHVpbnQzMl90KSAoICggYXYgfCBidiApPDwxICkgPT0gMCApOworICAgIHJldHVybiAoIGF2ID09IGJ2ICkgfHwgKCBhU2lnbiBeICggYXYgPCBidiApICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuCit8IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzCit8IHJhaXNlZCBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcKK3wgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfbHQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisgICAgdWludDMyX3QgYXYsIGJ2OworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGIgKTsKKyAgICBhdiA9IGZsb2F0MzJfdmFsKGEpOworICAgIGJ2ID0gZmxvYXQzMl92YWwoYik7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHJldHVybiBhU2lnbiAmJiAoICh1aW50MzJfdCkgKCAoIGF2IHwgYnYgKTw8MSApICE9IDAgKTsKKyAgICByZXR1cm4gKCBhdiAhPSBidiApICYmICggYVNpZ24gXiAoIGF2IDwgYnYgKSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInIGNhbm5vdAorfCBiZSBjb21wYXJlZCwgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBlaXRoZXIKK3wgb3BlcmFuZCBpcyBhIE5hTi4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfdW5vcmRlcmVkKCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbCB0bworfCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuCit8IGV4Y2VwdGlvbi4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkCit8IGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfZXFfcXVpZXQoIGZsb2F0MzIgYSwgZmxvYXQzMiBiIFNUQVRVU19QQVJBTSApCit7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQzMkV4cCggYSApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGIgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBpZiAoIGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYSApIHx8IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuICggZmxvYXQzMl92YWwoYSkgPT0gZmxvYXQzMl92YWwoYikgKSB8fAorICAgICAgICAgICAgKCAodWludDMyX3QpICggKCBmbG9hdDMyX3ZhbChhKSB8IGZsb2F0MzJfdmFsKGIpICk8PDEgKSA9PSAwICk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MgdGhhbiBvcgorfCBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90Cit8IGNhdXNlIGFuIGV4Y2VwdGlvbi4gIE90aGVyd2lzZSwgdGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUKK3wgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQzMl9sZV9xdWlldCggZmxvYXQzMiBhLCBmbG9hdDMyIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICB1aW50MzJfdCBhdiwgYnY7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQzMkV4cCggYSApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGIgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBpZiAoIGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYSApIHx8IGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYiApOworICAgIGF2ID0gZmxvYXQzMl92YWwoYSk7CisgICAgYnYgPSBmbG9hdDMyX3ZhbChiKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgcmV0dXJuIGFTaWduIHx8ICggKHVpbnQzMl90KSAoICggYXYgfCBidiApPDwxICkgPT0gMCApOworICAgIHJldHVybiAoIGF2ID09IGJ2ICkgfHwgKCBhU2lnbiBeICggYXYgPCBidiApICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuCit8IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgUXVpZXQgTmFOcyBkbyBub3QgY2F1c2UgYW4KK3wgZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCB0aGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorfCBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDMyX2x0X3F1aWV0KCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworICAgIHVpbnQzMl90IGF2LCBidjsKKyAgICBhID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQzMl9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBhICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQzMkV4cCggYiApID09IDB4RkYgKSAmJiBleHRyYWN0RmxvYXQzMkZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDMyU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBiICk7CisgICAgYXYgPSBmbG9hdDMyX3ZhbChhKTsKKyAgICBidiA9IGZsb2F0MzJfdmFsKGIpOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gJiYgKCAodWludDMyX3QpICggKCBhdiB8IGJ2ICk8PDEgKSAhPSAwICk7CisgICAgcmV0dXJuICggYXYgIT0gYnYgKSAmJiAoIGFTaWduIF4gKCBhdiA8IGJ2ICkgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJyBjYW5ub3QKK3wgYmUgY29tcGFyZWQsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4gIFRoZQorfCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MzJfdW5vcmRlcmVkX3F1aWV0KCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGEgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDMyX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0MzJFeHAoIGEgKSA9PSAweEZGICkgJiYgZXh0cmFjdEZsb2F0MzJGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDMyRXhwKCBiICkgPT0gMHhGRiApICYmIGV4dHJhY3RGbG9hdDMyRnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fCBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUKK3wgYGEnIHRvIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uIGlzCit8IHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYy0tLXdoaWNoIG1lYW5zIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgY29udmVyc2lvbiBpcyByb3VuZGVkCit8IGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLiAgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdAorfCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZQorfCBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50MzIgZmxvYXQ2NF90b19pbnQzMiggZmxvYXQ2NCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cCwgc2hpZnRDb3VudDsKKyAgICB1aW50NjRfdCBhU2lnOworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgaWYgKCAoIGFFeHAgPT0gMHg3RkYgKSAmJiBhU2lnICkgYVNpZ24gPSAwOworICAgIGlmICggYUV4cCApIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHNoaWZ0Q291bnQgPSAweDQyQyAtIGFFeHA7CisgICAgaWYgKCAwIDwgc2hpZnRDb3VudCApIHNoaWZ0NjRSaWdodEphbW1pbmcoIGFTaWcsIHNoaWZ0Q291bnQsICZhU2lnICk7CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0ludDMyKCBhU2lnbiwgYVNpZyBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZCB6ZXJvLgorfCBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmCit8IHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzCit8IHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQzMiBmbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgdWludDY0X3QgYVNpZywgc2F2ZWRBU2lnOworICAgIGludDMyX3QgejsKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGlmICggMHg0MUUgPCBhRXhwICkgeworICAgICAgICBpZiAoICggYUV4cCA9PSAweDdGRiApICYmIGFTaWcgKSBhU2lnbiA9IDA7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFFeHAgPCAweDNGRiApIHsKKyAgICAgICAgaWYgKCBhRXhwIHx8IGFTaWcgKSBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnIHw9IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKTsKKyAgICBzaGlmdENvdW50ID0gMHg0MzMgLSBhRXhwOworICAgIHNhdmVkQVNpZyA9IGFTaWc7CisgICAgYVNpZyA+Pj0gc2hpZnRDb3VudDsKKyAgICB6ID0gYVNpZzsKKyAgICBpZiAoIGFTaWduICkgeiA9IC0gejsKKyAgICBpZiAoICggeiA8IDAgKSBeIGFTaWduICkgeworIGludmFsaWQ6CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBhU2lnbiA/IChpbnQzMl90KSAweDgwMDAwMDAwIDogMHg3RkZGRkZGRjsKKyAgICB9CisgICAgaWYgKCAoIGFTaWc8PHNoaWZ0Q291bnQgKSAhPSBzYXZlZEFTaWcgKSB7CisgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICB9CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgMTYtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZCB6ZXJvLgorfCBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmCit8IHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzCit8IHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnRfZmFzdDE2X3QgZmxvYXQ2NF90b19pbnQxNl9yb3VuZF90b196ZXJvKGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0pCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cCwgc2hpZnRDb3VudDsKKyAgICB1aW50NjRfdCBhU2lnLCBzYXZlZEFTaWc7CisgICAgaW50MzIgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGlmICggMHg0MEUgPCBhRXhwICkgeworICAgICAgICBpZiAoICggYUV4cCA9PSAweDdGRiApICYmIGFTaWcgKSB7CisgICAgICAgICAgICBhU2lnbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKyAgICBlbHNlIGlmICggYUV4cCA8IDB4M0ZGICkgeworICAgICAgICBpZiAoIGFFeHAgfHwgYVNpZyApIHsKKyAgICAgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZyB8PSBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICk7CisgICAgc2hpZnRDb3VudCA9IDB4NDMzIC0gYUV4cDsKKyAgICBzYXZlZEFTaWcgPSBhU2lnOworICAgIGFTaWcgPj49IHNoaWZ0Q291bnQ7CisgICAgeiA9IGFTaWc7CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgeiA9IC0gejsKKyAgICB9CisgICAgaWYgKCAoIChpbnQxNl90KXogPCAwICkgXiBhU2lnbiApIHsKKyBpbnZhbGlkOgorICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gYVNpZ24gPyAoaW50MzJfdCkgMHhmZmZmODAwMCA6IDB4N0ZGRjsKKyAgICB9CisgICAgaWYgKCAoIGFTaWc8PHNoaWZ0Q291bnQgKSAhPSBzYXZlZEFTaWcgKSB7CisgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICB9CisgICAgcmV0dXJuIHo7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCBgYScgdG8gdGhlIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3wgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLS0td2hpY2ggbWVhbnMgaW4gcGFydGljdWxhciB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIHJvdW5kZWQKK3wgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuICBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0Cit8IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmIHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlCit8IGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzIHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQ2NCBmbG9hdDY0X3RvX2ludDY0KCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWcsIGFTaWdFeHRyYTsKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGlmICggYUV4cCApIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHNoaWZ0Q291bnQgPSAweDQzMyAtIGFFeHA7CisgICAgaWYgKCBzaGlmdENvdW50IDw9IDAgKSB7CisgICAgICAgIGlmICggMHg0M0UgPCBhRXhwICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIGlmICggICAgISBhU2lnbgorICAgICAgICAgICAgICAgICB8fCAoICAgICggYUV4cCA9PSAweDdGRiApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBhU2lnICE9IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApICkKKyAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHJldHVybiBMSVQ2NCggMHg3RkZGRkZGRkZGRkZGRkZGICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGludDY0X3QpIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBhU2lnRXh0cmEgPSAwOworICAgICAgICBhU2lnIDw8PSAtIHNoaWZ0Q291bnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzaGlmdDY0RXh0cmFSaWdodEphbW1pbmcoIGFTaWcsIDAsIHNoaWZ0Q291bnQsICZhU2lnLCAmYVNpZ0V4dHJhICk7CisgICAgfQorICAgIHJldHVybiByb3VuZEFuZFBhY2tJbnQ2NCggYVNpZ24sIGFTaWcsIGFTaWdFeHRyYSBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkIHRvd2FyZCB6ZXJvLgorfCBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmCit8IHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzCit8IHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQ2NCBmbG9hdDY0X3RvX2ludDY0X3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgdWludDY0X3QgYVNpZzsKKyAgICBpbnQ2NCB6OworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgaWYgKCBhRXhwICkgYVNpZyB8PSBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICk7CisgICAgc2hpZnRDb3VudCA9IGFFeHAgLSAweDQzMzsKKyAgICBpZiAoIDAgPD0gc2hpZnRDb3VudCApIHsKKyAgICAgICAgaWYgKCAweDQzRSA8PSBhRXhwICkgeworICAgICAgICAgICAgaWYgKCBmbG9hdDY0X3ZhbChhKSAhPSBMSVQ2NCggMHhDM0UwMDAwMDAwMDAwMDAwICkgKSB7CisgICAgICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICBpZiAoICAgICEgYVNpZ24KKyAgICAgICAgICAgICAgICAgICAgIHx8ICggICAgKCBhRXhwID09IDB4N0ZGICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCBhU2lnICE9IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApICkKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExJVDY0KCAweDdGRkZGRkZGRkZGRkZGRkYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGludDY0X3QpIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICB6ID0gYVNpZzw8c2hpZnRDb3VudDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYUV4cCA8IDB4M0ZFICkgeworICAgICAgICAgICAgaWYgKCBhRXhwIHwgYVNpZyApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHogPSBhU2lnPj4oIC0gc2hpZnRDb3VudCApOworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBhU2lnPDwoIHNoaWZ0Q291bnQgJiA2MyApICkgKSB7CisgICAgICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHogPSAtIHo7CisgICAgcmV0dXJuIHo7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB0byB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbiBpcworfCBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXQ2NF90b19mbG9hdDMyKCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwOworICAgIHVpbnQ2NF90IGFTaWc7CisgICAgdWludDMyX3QgelNpZzsKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGlmICggYUV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQzMiggZmxvYXQ2NFRvQ29tbW9uTmFOKCBhIFNUQVRVU19WQVIgKSBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMjIsICZhU2lnICk7CisgICAgelNpZyA9IGFTaWc7CisgICAgaWYgKCBhRXhwIHx8IHpTaWcgKSB7CisgICAgICAgIHpTaWcgfD0gMHg0MDAwMDAwMDsKKyAgICAgICAgYUV4cCAtPSAweDM4MTsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MzIoIGFTaWduLCBhRXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBQYWNrcyB0aGUgc2lnbiBgelNpZ24nLCBleHBvbmVudCBgekV4cCcsIGFuZCBzaWduaWZpY2FuZCBgelNpZycgaW50byBhCit8IGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLCByZXR1cm5pbmcgdGhlIHJlc3VsdC4gIEFmdGVyIGJlaW5nCit8IHNoaWZ0ZWQgaW50byB0aGUgcHJvcGVyIHBvc2l0aW9ucywgdGhlIHRocmVlIGZpZWxkcyBhcmUgc2ltcGx5IGFkZGVkCit8IHRvZ2V0aGVyIHRvIGZvcm0gdGhlIHJlc3VsdC4gIFRoaXMgbWVhbnMgdGhhdCBhbnkgaW50ZWdlciBwb3J0aW9uIG9mIGB6U2lnJworfCB3aWxsIGJlIGFkZGVkIGludG8gdGhlIGV4cG9uZW50LiAgU2luY2UgYSBwcm9wZXJseSBub3JtYWxpemVkIHNpZ25pZmljYW5kCit8IHdpbGwgaGF2ZSBhbiBpbnRlZ2VyIHBvcnRpb24gZXF1YWwgdG8gMSwgdGhlIGB6RXhwJyBpbnB1dCBzaG91bGQgYmUgMSBsZXNzCit8IHRoYW4gdGhlIGRlc2lyZWQgcmVzdWx0IGV4cG9uZW50IHdoZW5ldmVyIGB6U2lnJyBpcyBhIGNvbXBsZXRlLCBub3JtYWxpemVkCit8IHNpZ25pZmljYW5kLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGZsb2F0MTYgcGFja0Zsb2F0MTYoZmxhZyB6U2lnbiwgaW50X2Zhc3QxNl90IHpFeHAsIHVpbnQxNl90IHpTaWcpCit7CisgICAgcmV0dXJuIG1ha2VfZmxvYXQxNigKKyAgICAgICAgKCgodWludDMyX3QpelNpZ24pIDw8IDE1KSArICgoKHVpbnQzMl90KXpFeHApIDw8IDEwKSArIHpTaWcpOworfQorCisvKiBIYWxmIHByZWNpc2lvbiBmbG9hdHMgY29tZSBpbiB0d28gZm9ybWF0czogc3RhbmRhcmQgSUVFRSBhbmQgIkFSTSIgZm9ybWF0LgorICAgVGhlIGxhdHRlciBnYWlucyBleHRyYSBleHBvbmVudCByYW5nZSBieSBvbWl0dGluZyB0aGUgTmFOL0luZiBlbmNvZGluZ3MuICAqLworCitmbG9hdDMyIGZsb2F0MTZfdG9fZmxvYXQzMihmbG9hdDE2IGEsIGZsYWcgaWVlZSBTVEFUVVNfUEFSQU0pCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cDsKKyAgICB1aW50MzJfdCBhU2lnOworCisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxNlNpZ24oYSk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDE2RXhwKGEpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQxNkZyYWMoYSk7CisKKyAgICBpZiAoYUV4cCA9PSAweDFmICYmIGllZWUpIHsKKyAgICAgICAgaWYgKGFTaWcpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0MzIoZmxvYXQxNlRvQ29tbW9uTmFOKGEgU1RBVFVTX1ZBUikgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKGFTaWduLCAweGZmLCAwKTsKKyAgICB9CisgICAgaWYgKGFFeHAgPT0gMCkgeworICAgICAgICBpbnQ4IHNoaWZ0Q291bnQ7CisKKyAgICAgICAgaWYgKGFTaWcgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDMyKGFTaWduLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHNoaWZ0Q291bnQgPSBjb3VudExlYWRpbmdaZXJvczMyKCBhU2lnICkgLSAyMTsKKyAgICAgICAgYVNpZyA9IGFTaWcgPDwgc2hpZnRDb3VudDsKKyAgICAgICAgYUV4cCA9IC1zaGlmdENvdW50OworICAgIH0KKyAgICByZXR1cm4gcGFja0Zsb2F0MzIoIGFTaWduLCBhRXhwICsgMHg3MCwgYVNpZyA8PCAxMyk7Cit9CisKK2Zsb2F0MTYgZmxvYXQzMl90b19mbG9hdDE2KGZsb2F0MzIgYSwgZmxhZyBpZWVlIFNUQVRVU19QQVJBTSkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwOworICAgIHVpbnQzMl90IGFTaWc7CisgICAgdWludDMyX3QgbWFzazsKKyAgICB1aW50MzJfdCBpbmNyZW1lbnQ7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0MzJGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDMyRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQzMlNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKGFTaWcpIHsKKyAgICAgICAgICAgIC8qIElucHV0IGlzIGEgTmFOICovCisgICAgICAgICAgICBmbG9hdDE2IHIgPSBjb21tb25OYU5Ub0Zsb2F0MTYoIGZsb2F0MzJUb0NvbW1vbk5hTiggYSBTVEFUVVNfVkFSICkgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgaWYgKCFpZWVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDE2KGFTaWduLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgICAgIC8qIEluZmluaXR5ICovCisgICAgICAgIGlmICghaWVlZSkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDE2KGFTaWduLCAweDFmLCAweDNmZik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDE2KGFTaWduLCAweDFmLCAwKTsKKyAgICB9CisgICAgaWYgKGFFeHAgPT0gMCAmJiBhU2lnID09IDApIHsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDE2KGFTaWduLCAwLCAwKTsKKyAgICB9CisgICAgLyogRGVjaW1hbCBwb2ludCBiZXR3ZWVuIGJpdHMgMjIgYW5kIDIzLiAgKi8KKyAgICBhU2lnIHw9IDB4MDA4MDAwMDA7CisgICAgYUV4cCAtPSAweDdmOworICAgIGlmIChhRXhwIDwgLTE0KSB7CisgICAgICAgIG1hc2sgPSAweDAwZmZmZmZmOworICAgICAgICBpZiAoYUV4cCA+PSAtMjQpIHsKKyAgICAgICAgICAgIG1hc2sgPj49IDI1ICsgYUV4cDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1hc2sgPSAweDAwMDAxZmZmOworICAgIH0KKyAgICBpZiAoYVNpZyAmIG1hc2spIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfdW5kZXJmbG93IFNUQVRVU19WQVIgKTsKKyAgICAgICAgcm91bmRpbmdNb2RlID0gU1RBVFVTKGZsb2F0X3JvdW5kaW5nX21vZGUpOworICAgICAgICBzd2l0Y2ggKHJvdW5kaW5nTW9kZSkgeworICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbjoKKyAgICAgICAgICAgIGluY3JlbWVudCA9IChtYXNrICsgMSkgPj4gMTsKKyAgICAgICAgICAgIGlmICgoYVNpZyAmIG1hc2spID09IGluY3JlbWVudCkgeworICAgICAgICAgICAgICAgIGluY3JlbWVudCA9IGFTaWcgJiAoaW5jcmVtZW50IDw8IDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6CisgICAgICAgICAgICBpbmNyZW1lbnQgPSBhU2lnbiA/IDAgOiBtYXNrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfZG93bjoKKyAgICAgICAgICAgIGluY3JlbWVudCA9IGFTaWduID8gbWFzayA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogcm91bmRfdG9femVybyAqLworICAgICAgICAgICAgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGFTaWcgKz0gaW5jcmVtZW50OworICAgICAgICBpZiAoYVNpZyA+PSAweDAxMDAwMDAwKSB7CisgICAgICAgICAgICBhU2lnID4+PSAxOworICAgICAgICAgICAgYUV4cCsrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhRXhwIDwgLTE0CisgICAgICAgICAgJiYgU1RBVFVTKGZsb2F0X2RldGVjdF90aW5pbmVzcykgPT0gZmxvYXRfdGluaW5lc3NfYmVmb3JlX3JvdW5kaW5nKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX3VuZGVyZmxvdyBTVEFUVVNfVkFSKTsKKyAgICB9CisKKyAgICBpZiAoaWVlZSkgeworICAgICAgICBpZiAoYUV4cCA+IDE1KSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19vdmVyZmxvdyB8IGZsb2F0X2ZsYWdfaW5leGFjdCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQxNihhU2lnbiwgMHgxZiwgMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYUV4cCA+IDE2KSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQgfCBmbG9hdF9mbGFnX2luZXhhY3QgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTYoYVNpZ24sIDB4MWYsIDB4M2ZmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYUV4cCA8IC0yNCkgeworICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTYoYVNpZ24sIDAsIDApOworICAgIH0KKyAgICBpZiAoYUV4cCA8IC0xNCkgeworICAgICAgICBhU2lnID4+PSAtMTQgLSBhRXhwOworICAgICAgICBhRXhwID0gLTE0OworICAgIH0KKyAgICByZXR1cm4gcGFja0Zsb2F0MTYoYVNpZ24sIGFFeHAgKyAxNCwgYVNpZyA+PiAxMyk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCBgYScgdG8gdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24KK3wgaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdHg4MCBmbG9hdDY0X3RvX2Zsb2F0eDgwKCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwOworICAgIHVpbnQ2NF90IGFTaWc7CisKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBjb21tb25OYU5Ub0Zsb2F0eDgwKCBmbG9hdDY0VG9Db21tb25OYU4oIGEgU1RBVFVTX1ZBUiApIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggYVNpZ24sIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgcGFja0Zsb2F0eDgwKAorICAgICAgICAgICAgYVNpZ24sIGFFeHAgKyAweDNDMDAsICggYVNpZyB8IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApPDwxMSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZQorfCBgYScgdG8gdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24gaXMKK3wgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDEyOCBmbG9hdDY0X3RvX2Zsb2F0MTI4KCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwOworICAgIHVpbnQ2NF90IGFTaWcsIHpTaWcwLCB6U2lnMTsKKworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGlmICggYUV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQxMjgoIGZsb2F0NjRUb0NvbW1vbk5hTiggYSBTVEFUVVNfVkFSICkgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCBhU2lnbiwgMHg3RkZGLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQxMjgoIGFTaWduLCAwLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgICAgICAtLWFFeHA7CisgICAgfQorICAgIHNoaWZ0MTI4UmlnaHQoIGFTaWcsIDAsIDQsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggYVNpZ24sIGFFeHAgKyAweDNDMDAsIHpTaWcwLCB6U2lnMSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSb3VuZHMgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIHRvIGFuIGludGVnZXIsIGFuZAorfCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlLiAgVGhlCit8IG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQ2NF9yb3VuZF90b19pbnQoIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHA7CisgICAgdWludDY0X3QgbGFzdEJpdE1hc2ssIHJvdW5kQml0c01hc2s7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgdWludDY0X3QgejsKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGlmICggMHg0MzMgPD0gYUV4cCApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBhIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBhRXhwIDwgMHgzRkYgKSB7CisgICAgICAgIGlmICggKHVpbnQ2NF90KSAoIGZsb2F0NjRfdmFsKGEpPDwxICkgPT0gMCApIHJldHVybiBhOworICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgICAgIHN3aXRjaCAoIFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSApIHsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOgorICAgICAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHgzRkUgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIGFTaWduLCAweDNGRiwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX2Rvd246CisgICAgICAgICAgICByZXR1cm4gbWFrZV9mbG9hdDY0KGFTaWduID8gTElUNjQoIDB4QkZGMDAwMDAwMDAwMDAwMCApIDogMCk7CisgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX3VwOgorICAgICAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NCgKKyAgICAgICAgICAgIGFTaWduID8gTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApIDogTElUNjQoIDB4M0ZGMDAwMDAwMDAwMDAwMCApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIGFTaWduLCAwLCAwICk7CisgICAgfQorICAgIGxhc3RCaXRNYXNrID0gMTsKKyAgICBsYXN0Qml0TWFzayA8PD0gMHg0MzMgLSBhRXhwOworICAgIHJvdW5kQml0c01hc2sgPSBsYXN0Qml0TWFzayAtIDE7CisgICAgeiA9IGZsb2F0NjRfdmFsKGEpOworICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICBpZiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4gKSB7CisgICAgICAgIHogKz0gbGFzdEJpdE1hc2s+PjE7CisgICAgICAgIGlmICggKCB6ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6ICY9IH4gbGFzdEJpdE1hc2s7CisgICAgfQorICAgIGVsc2UgaWYgKCByb3VuZGluZ01vZGUgIT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgaWYgKCBleHRyYWN0RmxvYXQ2NFNpZ24oIG1ha2VfZmxvYXQ2NCh6KSApIF4gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSApIHsKKyAgICAgICAgICAgIHogKz0gcm91bmRCaXRzTWFzazsKKyAgICAgICAgfQorICAgIH0KKyAgICB6ICY9IH4gcm91bmRCaXRzTWFzazsKKyAgICBpZiAoIHogIT0gZmxvYXQ2NF92YWwoYSkgKQorICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NCh6KTsKKworfQorCitmbG9hdDY0IGZsb2F0NjRfdHJ1bmNfdG9faW50KCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNKQoreworICAgIGludCBvbGRtb2RlOworICAgIGZsb2F0NjQgcmVzOworICAgIG9sZG1vZGUgPSBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSk7CisgICAgU1RBVFVTKGZsb2F0X3JvdW5kaW5nX21vZGUpID0gZmxvYXRfcm91bmRfdG9femVybzsKKyAgICByZXMgPSBmbG9hdDY0X3JvdW5kX3RvX2ludChhIFNUQVRVU19WQVIpOworICAgIFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSA9IG9sZG1vZGU7CisgICAgcmV0dXJuIHJlczsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBhZGRpbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgZG91YmxlLXByZWNpc2lvbgorfCBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBJZiBgelNpZ24nIGlzIDEsIHRoZSBzdW0gaXMgbmVnYXRlZAorfCBiZWZvcmUgYmVpbmcgcmV0dXJuZWQuICBgelNpZ24nIGlzIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCBpcyBhIE5hTi4KK3wgVGhlIGFkZGl0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0NjQgYWRkRmxvYXQ2NFNpZ3MoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiLCBmbGFnIHpTaWduIFNUQVRVU19QQVJBTSApCit7CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZywgYlNpZywgelNpZzsKKyAgICBpbnRfZmFzdDE2X3QgZXhwRGlmZjsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPDw9IDk7CisgICAgYlNpZyA8PD0gOTsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIC0tZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJTaWcgfD0gTElUNjQoIDB4MjAwMDAwMDAwMDAwMDAwMCApOworICAgICAgICB9CisgICAgICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGJTaWcsIGV4cERpZmYsICZiU2lnICk7CisgICAgICAgIHpFeHAgPSBhRXhwOworICAgIH0KKyAgICBlbHNlIGlmICggZXhwRGlmZiA8IDAgKSB7CisgICAgICAgIGlmICggYkV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDB4N0ZGLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgICAgICArK2V4cERpZmY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhU2lnIHw9IExJVDY0KCAweDIwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDY0UmlnaHRKYW1taW5nKCBhU2lnLCAtIGV4cERpZmYsICZhU2lnICk7CisgICAgICAgIHpFeHAgPSBiRXhwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICAgICAgaWYgKCBhU2lnIHwgYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICAgICAgaWYgKFNUQVRVUyhmbHVzaF90b196ZXJvKSkgeworICAgICAgICAgICAgICAgIGlmIChhU2lnIHwgYlNpZykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KHpTaWduLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24sIDAsICggYVNpZyArIGJTaWcgKT4+OSApOworICAgICAgICB9CisgICAgICAgIHpTaWcgPSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICkgKyBhU2lnICsgYlNpZzsKKyAgICAgICAgekV4cCA9IGFFeHA7CisgICAgICAgIGdvdG8gcm91bmRBbmRQYWNrOworICAgIH0KKyAgICBhU2lnIHw9IExJVDY0KCAweDIwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB6U2lnID0gKCBhU2lnICsgYlNpZyApPDwxOworICAgIC0tekV4cDsKKyAgICBpZiAoIChpbnQ2NF90KSB6U2lnIDwgMCApIHsKKyAgICAgICAgelNpZyA9IGFTaWcgKyBiU2lnOworICAgICAgICArK3pFeHA7CisgICAgfQorIHJvdW5kQW5kUGFjazoKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgZG91YmxlLQorfCBwcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLiAgSWYgYHpTaWduJyBpcyAxLCB0aGUKK3wgZGlmZmVyZW5jZSBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUKK3wgcmVzdWx0IGlzIGEgTmFOLiAgVGhlIHN1YnRyYWN0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0NjQgc3ViRmxvYXQ2NFNpZ3MoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiLCBmbGFnIHpTaWduIFNUQVRVU19QQVJBTSApCit7CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZywgYlNpZywgelNpZzsKKyAgICBpbnRfZmFzdDE2X3QgZXhwRGlmZjsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPDw9IDEwOworICAgIGJTaWcgPDw9IDEwOworICAgIGlmICggMCA8IGV4cERpZmYgKSBnb3RvIGFFeHBCaWdnZXI7CisgICAgaWYgKCBleHBEaWZmIDwgMCApIGdvdG8gYkV4cEJpZ2dlcjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8IGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgYUV4cCA9IDE7CisgICAgICAgIGJFeHAgPSAxOworICAgIH0KKyAgICBpZiAoIGJTaWcgPCBhU2lnICkgZ290byBhQmlnZ2VyOworICAgIGlmICggYVNpZyA8IGJTaWcgKSBnb3RvIGJCaWdnZXI7CisgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPT0gZmxvYXRfcm91bmRfZG93biwgMCwgMCApOworIGJFeHBCaWdnZXI6CisgICAgaWYgKCBiRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NCggelNpZ24gXiAxLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgKytleHBEaWZmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYVNpZyB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgICAgfQorICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGFTaWcsIC0gZXhwRGlmZiwgJmFTaWcgKTsKKyAgICBiU2lnIHw9IExJVDY0KCAweDQwMDAwMDAwMDAwMDAwMDAgKTsKKyBiQmlnZ2VyOgorICAgIHpTaWcgPSBiU2lnIC0gYVNpZzsKKyAgICB6RXhwID0gYkV4cDsKKyAgICB6U2lnbiBePSAxOworICAgIGdvdG8gbm9ybWFsaXplUm91bmRBbmRQYWNrOworIGFFeHBCaWdnZXI6CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgLS1leHBEaWZmOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYlNpZyB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgICAgfQorICAgIHNoaWZ0NjRSaWdodEphbW1pbmcoIGJTaWcsIGV4cERpZmYsICZiU2lnICk7CisgICAgYVNpZyB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgYUJpZ2dlcjoKKyAgICB6U2lnID0gYVNpZyAtIGJTaWc7CisgICAgekV4cCA9IGFFeHA7Cisgbm9ybWFsaXplUm91bmRBbmRQYWNrOgorICAgIC0tekV4cDsKKyAgICByZXR1cm4gbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NCggelNpZ24sIHpFeHAsIHpTaWcgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScKK3wgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yCit8IEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDY0IGZsb2F0NjRfYWRkKCBmbG9hdDY0IGEsIGZsb2F0NjQgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIGlmICggYVNpZ24gPT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybiBhZGRGbG9hdDY0U2lncyggYSwgYiwgYVNpZ24gU1RBVFVTX1ZBUiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0NjRTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzCit8IGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZAorfCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQ2NF9zdWIoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiA9PSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0NjRTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQ2NFNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMKK3wgYGEnIGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkCit8IGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQ2NCBmbG9hdDY0X211bCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbiwgelNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZywgYlNpZywgelNpZzAsIHpTaWcxOworCisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBiICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGIgKTsKKyAgICB6U2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgfHwgKCAoIGJFeHAgPT0gMHg3RkYgKSAmJiBiU2lnICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoIGJFeHAgfCBiU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBiU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICB6RXhwID0gYUV4cCArIGJFeHAgLSAweDNGRjsKKyAgICBhU2lnID0gKCBhU2lnIHwgTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApICk8PDEwOworICAgIGJTaWcgPSAoIGJTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTE7CisgICAgbXVsNjRUbzEyOCggYVNpZywgYlNpZywgJnpTaWcwLCAmelNpZzEgKTsKKyAgICB6U2lnMCB8PSAoIHpTaWcxICE9IDAgKTsKKyAgICBpZiAoIDAgPD0gKGludDY0X3QpICggelNpZzA8PDEgKSApIHsKKyAgICAgICAgelNpZzAgPDw9IDE7CisgICAgICAgIC0tekV4cDsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0NjQoIHpTaWduLCB6RXhwLCB6U2lnMCBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScKK3wgYnkgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvCit8IHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQ2NF9kaXYoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCBiRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcsIGJTaWcsIHpTaWc7CisgICAgdWludDY0X3QgcmVtMCwgcmVtMTsKKyAgICB1aW50NjRfdCB0ZXJtMCwgdGVybTE7CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBiICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGIgKTsKKyAgICB6U2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIGlmICggYkV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYlNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCB6U2lnbiwgMCwgMCApOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBiU2lnID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19kaXZieXplcm8gU1RBVFVTX1ZBUik7CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAweDdGRiwgMCApOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0NjQoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICB6RXhwID0gYUV4cCAtIGJFeHAgKyAweDNGRDsKKyAgICBhU2lnID0gKCBhU2lnIHwgTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApICk8PDEwOworICAgIGJTaWcgPSAoIGJTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTE7CisgICAgaWYgKCBiU2lnIDw9ICggYVNpZyArIGFTaWcgKSApIHsKKyAgICAgICAgYVNpZyA+Pj0gMTsKKyAgICAgICAgKyt6RXhwOworICAgIH0KKyAgICB6U2lnID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnLCAwLCBiU2lnICk7CisgICAgaWYgKCAoIHpTaWcgJiAweDFGRiApIDw9IDIgKSB7CisgICAgICAgIG11bDY0VG8xMjgoIGJTaWcsIHpTaWcsICZ0ZXJtMCwgJnRlcm0xICk7CisgICAgICAgIHN1YjEyOCggYVNpZywgMCwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKKyAgICAgICAgd2hpbGUgKCAoaW50NjRfdCkgcmVtMCA8IDAgKSB7CisgICAgICAgICAgICAtLXpTaWc7CisgICAgICAgICAgICBhZGQxMjgoIHJlbTAsIHJlbTEsIDAsIGJTaWcsICZyZW0wLCAmcmVtMSApOworICAgICAgICB9CisgICAgICAgIHpTaWcgfD0gKCByZW0xICE9IDAgKTsKKyAgICB9CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0NjQoIHpTaWduLCB6RXhwLCB6U2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJworfCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQKK3wgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQ2NF9yZW0oIGZsb2F0NjQgYSwgZmxvYXQ2NCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgelNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgdWludDY0X3QgYVNpZywgYlNpZzsKKyAgICB1aW50NjRfdCBxLCBhbHRlcm5hdGVBU2lnOworICAgIGludDY0X3Qgc2lnTWVhbjsKKworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0NjRFeHAoIGIgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyB8fCAoICggYkV4cCA9PSAweDdGRiApICYmIGJTaWcgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGJTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBiU2lnID09IDAgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIGZsb2F0NjRfZGVmYXVsdF9uYW47CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYlNpZywgJmJFeHAsICZiU2lnICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBhOworICAgICAgICBub3JtYWxpemVGbG9hdDY0U3Vibm9ybWFsKCBhU2lnLCAmYUV4cCwgJmFTaWcgKTsKKyAgICB9CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGFTaWcgPSAoIGFTaWcgfCBMSVQ2NCggMHgwMDEwMDAwMDAwMDAwMDAwICkgKTw8MTE7CisgICAgYlNpZyA9ICggYlNpZyB8IExJVDY0KCAweDAwMTAwMDAwMDAwMDAwMDAgKSApPDwxMTsKKyAgICBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICBpZiAoIGV4cERpZmYgPCAtMSApIHJldHVybiBhOworICAgICAgICBhU2lnID4+PSAxOworICAgIH0KKyAgICBxID0gKCBiU2lnIDw9IGFTaWcgKTsKKyAgICBpZiAoIHEgKSBhU2lnIC09IGJTaWc7CisgICAgZXhwRGlmZiAtPSA2NDsKKyAgICB3aGlsZSAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnLCAwLCBiU2lnICk7CisgICAgICAgIHEgPSAoIDIgPCBxICkgPyBxIC0gMiA6IDA7CisgICAgICAgIGFTaWcgPSAtICggKCBiU2lnPj4yICkgKiBxICk7CisgICAgICAgIGV4cERpZmYgLT0gNjI7CisgICAgfQorICAgIGV4cERpZmYgKz0gNjQ7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgcSA9IGVzdGltYXRlRGl2MTI4VG82NCggYVNpZywgMCwgYlNpZyApOworICAgICAgICBxID0gKCAyIDwgcSApID8gcSAtIDIgOiAwOworICAgICAgICBxID4+PSA2NCAtIGV4cERpZmY7CisgICAgICAgIGJTaWcgPj49IDI7CisgICAgICAgIGFTaWcgPSAoICggYVNpZz4+MSApPDwoIGV4cERpZmYgLSAxICkgKSAtIGJTaWcgKiBxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYVNpZyA+Pj0gMjsKKyAgICAgICAgYlNpZyA+Pj0gMjsKKyAgICB9CisgICAgZG8geworICAgICAgICBhbHRlcm5hdGVBU2lnID0gYVNpZzsKKyAgICAgICAgKytxOworICAgICAgICBhU2lnIC09IGJTaWc7CisgICAgfSB3aGlsZSAoIDAgPD0gKGludDY0X3QpIGFTaWcgKTsKKyAgICBzaWdNZWFuID0gYVNpZyArIGFsdGVybmF0ZUFTaWc7CisgICAgaWYgKCAoIHNpZ01lYW4gPCAwICkgfHwgKCAoIHNpZ01lYW4gPT0gMCApICYmICggcSAmIDEgKSApICkgeworICAgICAgICBhU2lnID0gYWx0ZXJuYXRlQVNpZzsKKyAgICB9CisgICAgelNpZ24gPSAoIChpbnQ2NF90KSBhU2lnIDwgMCApOworICAgIGlmICggelNpZ24gKSBhU2lnID0gLSBhU2lnOworICAgIHJldHVybiBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdDY0KCBhU2lnbiBeIHpTaWduLCBiRXhwLCBhU2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcworfCBgYScgYW5kIGBiJyB0aGVuIGFkZGluZyAnYycsIHdpdGggbm8gaW50ZXJtZWRpYXRlIHJvdW5kaW5nIHN0ZXAgYWZ0ZXIgdGhlCit8IG11bHRpcGxpY2F0aW9uLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorfCBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMgNzU0LTIwMDguCit8IFRoZSBmbGFncyBhcmd1bWVudCBhbGxvd3MgdGhlIGNhbGxlciB0byBzZWxlY3QgbmVnYXRpb24gb2YgdGhlCit8IGFkZGVuZCwgdGhlIGludGVybWVkaWF0ZSBwcm9kdWN0LCBvciB0aGUgZmluYWwgcmVzdWx0LiAoVGhlIGRpZmZlcmVuY2UKK3wgYmV0d2VlbiB0aGlzIGFuZCBoYXZpbmcgdGhlIGNhbGxlciBkbyBhIHNlcGFyYXRlIG5lZ2F0aW9uIGlzIHRoYXQgbmVnYXRpbmcKK3wgZXh0ZXJuYWxseSB3aWxsIGZsaXAgdGhlIHNpZ24gYml0IG9uIE5hTnMuKQorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDY0IGZsb2F0NjRfbXVsYWRkKGZsb2F0NjQgYSwgZmxvYXQ2NCBiLCBmbG9hdDY0IGMsIGludCBmbGFncyBTVEFUVVNfUEFSQU0pCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIGNTaWduLCB6U2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cCwgYkV4cCwgY0V4cCwgcEV4cCwgekV4cCwgZXhwRGlmZjsKKyAgICB1aW50NjRfdCBhU2lnLCBiU2lnLCBjU2lnOworICAgIGZsYWcgcEluZiwgcFplcm8sIHBTaWduOworICAgIHVpbnQ2NF90IHBTaWcwLCBwU2lnMSwgY1NpZzAsIGNTaWcxLCB6U2lnMCwgelNpZzE7CisgICAgaW50IHNoaWZ0Y291bnQ7CisgICAgZmxhZyBzaWduZmxpcCwgaW5memVybzsKKworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworICAgIGMgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChjIFNUQVRVU19WQVIpOworICAgIGFTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoYSk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKGEpOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKGEpOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoYik7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKGIpOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKGIpOworICAgIGNTaWcgPSBleHRyYWN0RmxvYXQ2NEZyYWMoYyk7CisgICAgY0V4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKGMpOworICAgIGNTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKGMpOworCisgICAgaW5memVybyA9ICgoYUV4cCA9PSAwICYmIGFTaWcgPT0gMCAmJiBiRXhwID09IDB4N2ZmICYmIGJTaWcgPT0gMCkgfHwKKyAgICAgICAgICAgICAgIChhRXhwID09IDB4N2ZmICYmIGFTaWcgPT0gMCAmJiBiRXhwID09IDAgJiYgYlNpZyA9PSAwKSk7CisKKyAgICAvKiBJdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgdGhlIGNhc2VzIG9mICgwLGluZixxbmFuKQorICAgICAqIGFuZCAoaW5mLDAscW5hbikgcmFpc2UgSW52YWxpZE9wZXJhdGlvbiBvciBub3QgKGFuZCB3aGF0IFFOYU4KKyAgICAgKiB0aGV5IHJldHVybiBpZiB0aGV5IGRvKSwgc28gd2UgaGF2ZSB0byBoYW5kIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgKiBvZmYgdG8gdGhlIHRhcmdldC1zcGVjaWZpYyBwaWNrLWEtTmFOIHJvdXRpbmUuCisgICAgICovCisgICAgaWYgKCgoYUV4cCA9PSAweDdmZikgJiYgYVNpZykgfHwKKyAgICAgICAgKChiRXhwID09IDB4N2ZmKSAmJiBiU2lnKSB8fAorICAgICAgICAoKGNFeHAgPT0gMHg3ZmYpICYmIGNTaWcpKSB7CisgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TXVsQWRkTmFOKGEsIGIsIGMsIGluZnplcm8gU1RBVFVTX1ZBUik7CisgICAgfQorCisgICAgaWYgKGluZnplcm8pIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiBmbG9hdF9tdWxhZGRfbmVnYXRlX2MpIHsKKyAgICAgICAgY1NpZ24gXj0gMTsKKyAgICB9CisKKyAgICBzaWduZmxpcCA9IChmbGFncyAmIGZsb2F0X211bGFkZF9uZWdhdGVfcmVzdWx0KSA/IDEgOiAwOworCisgICAgLyogV29yayBvdXQgdGhlIHNpZ24gYW5kIHR5cGUgb2YgdGhlIHByb2R1Y3QgKi8KKyAgICBwU2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKGZsYWdzICYgZmxvYXRfbXVsYWRkX25lZ2F0ZV9wcm9kdWN0KSB7CisgICAgICAgIHBTaWduIF49IDE7CisgICAgfQorICAgIHBJbmYgPSAoYUV4cCA9PSAweDdmZikgfHwgKGJFeHAgPT0gMHg3ZmYpOworICAgIHBaZXJvID0gKChhRXhwIHwgYVNpZykgPT0gMCkgfHwgKChiRXhwIHwgYlNpZykgPT0gMCk7CisKKyAgICBpZiAoY0V4cCA9PSAweDdmZikgeworICAgICAgICBpZiAocEluZiAmJiAocFNpZ24gXiBjU2lnbikpIHsKKyAgICAgICAgICAgIC8qIGFkZGl0aW9uIG9mIG9wcG9zaXRlLXNpZ25lZCBpbmZpbml0aWVzID0+IEludmFsaWRPcGVyYXRpb24gKi8KKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgICAgICB9CisgICAgICAgIC8qIE90aGVyd2lzZSBnZW5lcmF0ZSBhbiBpbmZpbml0eSBvZiB0aGUgc2FtZSBzaWduICovCisgICAgICAgIHJldHVybiBwYWNrRmxvYXQ2NChjU2lnbiBeIHNpZ25mbGlwLCAweDdmZiwgMCk7CisgICAgfQorCisgICAgaWYgKHBJbmYpIHsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KHBTaWduIF4gc2lnbmZsaXAsIDB4N2ZmLCAwKTsKKyAgICB9CisKKyAgICBpZiAocFplcm8pIHsKKyAgICAgICAgaWYgKGNFeHAgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNTaWcgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIEFkZGluZyB0d28gZXhhY3QgemVyb2VzICovCisgICAgICAgICAgICAgICAgaWYgKHBTaWduID09IGNTaWduKSB7CisgICAgICAgICAgICAgICAgICAgIHpTaWduID0gcFNpZ247CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPT0gZmxvYXRfcm91bmRfZG93bikgeworICAgICAgICAgICAgICAgICAgICB6U2lnbiA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgelNpZ24gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoelNpZ24gXiBzaWduZmxpcCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFeGFjdCB6ZXJvIHBsdXMgYSBkZW5vcm0gKi8KKyAgICAgICAgICAgIGlmIChTVEFUVVMoZmx1c2hfdG9femVybykpIHsKKyAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoY1NpZ24gXiBzaWduZmxpcCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogWmVybyBwbHVzIHNvbWV0aGluZyBub24temVybyA6IGp1c3QgcmV0dXJuIHRoZSBzb21ldGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KGNTaWduIF4gc2lnbmZsaXAsIGNFeHAsIGNTaWcpOworICAgIH0KKworICAgIGlmIChhRXhwID09IDApIHsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbChhU2lnLCAmYUV4cCwgJmFTaWcpOworICAgIH0KKyAgICBpZiAoYkV4cCA9PSAwKSB7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0NjRTdWJub3JtYWwoYlNpZywgJmJFeHAsICZiU2lnKTsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCByZXN1bHQgYSAqIGIgKyBjICovCisKKyAgICAvKiBNdWx0aXBseSBmaXJzdDsgdGhpcyBpcyBlYXN5LiAqLworICAgIC8qIE5COiB3ZSBzdWJ0cmFjdCAweDNmZSB3aGVyZSBmbG9hdDY0X211bCgpIHN1YnRyYWN0cyAweDNmZgorICAgICAqIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdHJ1ZSBleHBvbmVudCwgbm90IHRoZSAib25lLWxlc3MtdGhhbiIKKyAgICAgKiBmbGF2b3VyIHRoYXQgcm91bmRBbmRQYWNrRmxvYXQ2NCgpIHRha2VzLgorICAgICAqLworICAgIHBFeHAgPSBhRXhwICsgYkV4cCAtIDB4M2ZlOworICAgIGFTaWcgPSAoYVNpZyB8IExJVDY0KDB4MDAxMDAwMDAwMDAwMDAwMCkpPDwxMDsKKyAgICBiU2lnID0gKGJTaWcgfCBMSVQ2NCgweDAwMTAwMDAwMDAwMDAwMDApKTw8MTE7CisgICAgbXVsNjRUbzEyOChhU2lnLCBiU2lnLCAmcFNpZzAsICZwU2lnMSk7CisgICAgaWYgKChpbnQ2NF90KShwU2lnMCA8PCAxKSA+PSAwKSB7CisgICAgICAgIHNob3J0U2hpZnQxMjhMZWZ0KHBTaWcwLCBwU2lnMSwgMSwgJnBTaWcwLCAmcFNpZzEpOworICAgICAgICBwRXhwLS07CisgICAgfQorCisgICAgelNpZ24gPSBwU2lnbiBeIHNpZ25mbGlwOworCisgICAgLyogTm93IFtwU2lnMDpwU2lnMV0gaXMgdGhlIHNpZ25pZmljYW5kIG9mIHRoZSBtdWx0aXBseSwgd2l0aCB0aGUgZXhwbGljaXQKKyAgICAgKiBiaXQgaW4gcG9zaXRpb24gMTI2LgorICAgICAqLworICAgIGlmIChjRXhwID09IDApIHsKKyAgICAgICAgaWYgKCFjU2lnKSB7CisgICAgICAgICAgICAvKiBUaHJvdyBvdXQgdGhlIHNwZWNpYWwgY2FzZSBvZiBjIGJlaW5nIGFuIGV4YWN0IHplcm8gbm93ICovCisgICAgICAgICAgICBzaGlmdDEyOFJpZ2h0SmFtbWluZyhwU2lnMCwgcFNpZzEsIDY0LCAmcFNpZzAsICZwU2lnMSk7CisgICAgICAgICAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCh6U2lnbiwgcEV4cCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2lnMSBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICBub3JtYWxpemVGbG9hdDY0U3Vibm9ybWFsKGNTaWcsICZjRXhwLCAmY1NpZyk7CisgICAgfQorCisgICAgLyogU2hpZnQgY1NpZyBhbmQgYWRkIHRoZSBleHBsaWNpdCBiaXQgc28gW2NTaWcwOmNTaWcxXSBpcyB0aGUKKyAgICAgKiBzaWduaWZpY2FuZCBvZiB0aGUgYWRkZW5kLCB3aXRoIHRoZSBleHBsaWNpdCBiaXQgaW4gcG9zaXRpb24gMTI2LgorICAgICAqLworICAgIGNTaWcwID0gY1NpZyA8PCAoMTI2IC0gNjQgLSA1Mik7CisgICAgY1NpZzEgPSAwOworICAgIGNTaWcwIHw9IExJVDY0KDB4NDAwMDAwMDAwMDAwMDAwMCk7CisgICAgZXhwRGlmZiA9IHBFeHAgLSBjRXhwOworCisgICAgaWYgKHBTaWduID09IGNTaWduKSB7CisgICAgICAgIC8qIEFkZGl0aW9uICovCisgICAgICAgIGlmIChleHBEaWZmID4gMCkgeworICAgICAgICAgICAgLyogc2NhbGUgYyB0byBtYXRjaCBwICovCisgICAgICAgICAgICBzaGlmdDEyOFJpZ2h0SmFtbWluZyhjU2lnMCwgY1NpZzEsIGV4cERpZmYsICZjU2lnMCwgJmNTaWcxKTsKKyAgICAgICAgICAgIHpFeHAgPSBwRXhwOworICAgICAgICB9IGVsc2UgaWYgKGV4cERpZmYgPCAwKSB7CisgICAgICAgICAgICAvKiBzY2FsZSBwIHRvIG1hdGNoIGMgKi8KKyAgICAgICAgICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKHBTaWcwLCBwU2lnMSwgLWV4cERpZmYsICZwU2lnMCwgJnBTaWcxKTsKKyAgICAgICAgICAgIHpFeHAgPSBjRXhwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbm8gc2NhbGluZyBuZWVkZWQgKi8KKyAgICAgICAgICAgIHpFeHAgPSBjRXhwOworICAgICAgICB9CisgICAgICAgIC8qIEFkZCBzaWduaWZpY2FuZHMgYW5kIG1ha2Ugc3VyZSBleHBsaWNpdCBiaXQgZW5kcyB1cCBpbiBwb3NuIDEyNiAqLworICAgICAgICBhZGQxMjgocFNpZzAsIHBTaWcxLCBjU2lnMCwgY1NpZzEsICZ6U2lnMCwgJnpTaWcxKTsKKyAgICAgICAgaWYgKChpbnQ2NF90KXpTaWcwIDwgMCkgeworICAgICAgICAgICAgc2hpZnQxMjhSaWdodEphbW1pbmcoelNpZzAsIHpTaWcxLCAxLCAmelNpZzAsICZ6U2lnMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6RXhwLS07CisgICAgICAgIH0KKyAgICAgICAgc2hpZnQxMjhSaWdodEphbW1pbmcoelNpZzAsIHpTaWcxLCA2NCwgJnpTaWcwLCAmelNpZzEpOworICAgICAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCh6U2lnbiwgekV4cCwgelNpZzEgU1RBVFVTX1ZBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogU3VidHJhY3Rpb24gKi8KKyAgICAgICAgaWYgKGV4cERpZmYgPiAwKSB7CisgICAgICAgICAgICBzaGlmdDEyOFJpZ2h0SmFtbWluZyhjU2lnMCwgY1NpZzEsIGV4cERpZmYsICZjU2lnMCwgJmNTaWcxKTsKKyAgICAgICAgICAgIHN1YjEyOChwU2lnMCwgcFNpZzEsIGNTaWcwLCBjU2lnMSwgJnpTaWcwLCAmelNpZzEpOworICAgICAgICAgICAgekV4cCA9IHBFeHA7CisgICAgICAgIH0gZWxzZSBpZiAoZXhwRGlmZiA8IDApIHsKKyAgICAgICAgICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKHBTaWcwLCBwU2lnMSwgLWV4cERpZmYsICZwU2lnMCwgJnBTaWcxKTsKKyAgICAgICAgICAgIHN1YjEyOChjU2lnMCwgY1NpZzEsIHBTaWcwLCBwU2lnMSwgJnpTaWcwLCAmelNpZzEpOworICAgICAgICAgICAgekV4cCA9IGNFeHA7CisgICAgICAgICAgICB6U2lnbiBePSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgekV4cCA9IHBFeHA7CisgICAgICAgICAgICBpZiAobHQxMjgoY1NpZzAsIGNTaWcxLCBwU2lnMCwgcFNpZzEpKSB7CisgICAgICAgICAgICAgICAgc3ViMTI4KHBTaWcwLCBwU2lnMSwgY1NpZzAsIGNTaWcxLCAmelNpZzAsICZ6U2lnMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGx0MTI4KHBTaWcwLCBwU2lnMSwgY1NpZzAsIGNTaWcxKSkgeworICAgICAgICAgICAgICAgIHN1YjEyOChjU2lnMCwgY1NpZzEsIHBTaWcwLCBwU2lnMSwgJnpTaWcwLCAmelNpZzEpOworICAgICAgICAgICAgICAgIHpTaWduIF49IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEV4YWN0IHplcm8gKi8KKyAgICAgICAgICAgICAgICB6U2lnbiA9IHNpZ25mbGlwOworICAgICAgICAgICAgICAgIGlmIChTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSkgPT0gZmxvYXRfcm91bmRfZG93bikgeworICAgICAgICAgICAgICAgICAgICB6U2lnbiBePSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0NjQoelNpZ24sIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC0tekV4cDsKKyAgICAgICAgLyogRG8gdGhlIGVxdWl2YWxlbnQgb2Ygbm9ybWFsaXplUm91bmRBbmRQYWNrRmxvYXQ2NCgpIGJ1dAorICAgICAgICAgKiBzdGFydGluZyB3aXRoIHRoZSBzaWduaWZpY2FuZCBpbiBhIHBhaXIgb2YgdWludDY0X3QuCisgICAgICAgICAqLworICAgICAgICBpZiAoelNpZzApIHsKKyAgICAgICAgICAgIHNoaWZ0Y291bnQgPSBjb3VudExlYWRpbmdaZXJvczY0KHpTaWcwKSAtIDE7CisgICAgICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCh6U2lnMCwgelNpZzEsIHNoaWZ0Y291bnQsICZ6U2lnMCwgJnpTaWcxKTsKKyAgICAgICAgICAgIGlmICh6U2lnMSkgeworICAgICAgICAgICAgICAgIHpTaWcwIHw9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6RXhwIC09IHNoaWZ0Y291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaGlmdGNvdW50ID0gY291bnRMZWFkaW5nWmVyb3M2NCh6U2lnMSk7CisgICAgICAgICAgICBpZiAoc2hpZnRjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgelNpZzAgPSAoelNpZzEgPj4gMSkgfCAoelNpZzEgJiAxKTsKKyAgICAgICAgICAgICAgICB6RXhwIC09IDYzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaGlmdGNvdW50LS07CisgICAgICAgICAgICAgICAgelNpZzAgPSB6U2lnMSA8PCBzaGlmdGNvdW50OworICAgICAgICAgICAgICAgIHpFeHAgLT0gKHNoaWZ0Y291bnQgKyA2NCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0NjQoelNpZ24sIHpFeHAsIHpTaWcwIFNUQVRVU19WQVIpOworICAgIH0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KK3wgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQ2NF9zcXJ0KCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludF9mYXN0MTZfdCBhRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcsIHpTaWcsIGRvdWJsZVpTaWc7CisgICAgdWludDY0X3QgcmVtMCwgcmVtMSwgdGVybTAsIHRlcm0xOworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDY0RnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQ2NEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGICkgeworICAgICAgICBpZiAoIGFTaWcgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQ2NE5hTiggYSwgYSBTVEFUVVNfVkFSICk7CisgICAgICAgIGlmICggISBhU2lnbiApIHJldHVybiBhOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHJldHVybiBhOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gZmxvYXQ2NF9kZWZhdWx0X25hbjsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZyA9PSAwICkgcmV0dXJuIGZsb2F0NjRfemVybzsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIHpFeHAgPSAoICggYUV4cCAtIDB4M0ZGICk+PjEgKSArIDB4M0ZFOworICAgIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHpTaWcgPSBlc3RpbWF0ZVNxcnQzMiggYUV4cCwgYVNpZz4+MjEgKTsKKyAgICBhU2lnIDw8PSA5IC0gKCBhRXhwICYgMSApOworICAgIHpTaWcgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcsIDAsIHpTaWc8PDMyICkgKyAoIHpTaWc8PDMwICk7CisgICAgaWYgKCAoIHpTaWcgJiAweDFGRiApIDw9IDUgKSB7CisgICAgICAgIGRvdWJsZVpTaWcgPSB6U2lnPDwxOworICAgICAgICBtdWw2NFRvMTI4KCB6U2lnLCB6U2lnLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICBzdWIxMjgoIGFTaWcsIDAsIHRlcm0wLCB0ZXJtMSwgJnJlbTAsICZyZW0xICk7CisgICAgICAgIHdoaWxlICggKGludDY0X3QpIHJlbTAgPCAwICkgeworICAgICAgICAgICAgLS16U2lnOworICAgICAgICAgICAgZG91YmxlWlNpZyAtPSAyOworICAgICAgICAgICAgYWRkMTI4KCByZW0wLCByZW0xLCB6U2lnPj42MywgZG91YmxlWlNpZyB8IDEsICZyZW0wLCAmcmVtMSApOworICAgICAgICB9CisgICAgICAgIHpTaWcgfD0gKCAoIHJlbTAgfCByZW0xICkgIT0gMCApOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggMCwgekV4cCwgelNpZyBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIGJpbmFyeSBsb2cgb2YgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnLgorfCBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Zsb2F0NjQgZmxvYXQ2NF9sb2cyKCBmbG9hdDY0IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCB6U2lnbjsKKyAgICBpbnRfZmFzdDE2X3QgYUV4cDsKKyAgICB1aW50NjRfdCBhU2lnLCBhU2lnMCwgYVNpZzEsIHpTaWcsIGk7CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKworICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGFTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXQ2NCggMSwgMHg3RkYsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQ2NFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYVNpZ24gKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiBmbG9hdDY0X2RlZmF1bHRfbmFuOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMHg3RkYgKSB7CisgICAgICAgIGlmICggYVNpZyApIHJldHVybiBwcm9wYWdhdGVGbG9hdDY0TmFOKCBhLCBmbG9hdDY0X3plcm8gU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBhRXhwIC09IDB4M0ZGOworICAgIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIHpTaWduID0gYUV4cCA8IDA7CisgICAgelNpZyA9ICh1aW50NjRfdClhRXhwIDw8IDUyOworICAgIGZvciAoaSA9IDFMTCA8PCA1MTsgaSA+IDA7IGkgPj49IDEpIHsKKyAgICAgICAgbXVsNjRUbzEyOCggYVNpZywgYVNpZywgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgYVNpZyA9ICggYVNpZzAgPDwgMTIgKSB8ICggYVNpZzEgPj4gNTIgKTsKKyAgICAgICAgaWYgKCBhU2lnICYgTElUNjQoIDB4MDAyMDAwMDAwMDAwMDAwMCApICkgeworICAgICAgICAgICAgYVNpZyA+Pj0gMTsKKyAgICAgICAgICAgIHpTaWcgfD0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggelNpZ24gKQorICAgICAgICB6U2lnID0gLXpTaWc7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0NjQoIHpTaWduLCAweDQwOCwgelNpZyBTVEFUVVNfVkFSICk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGVxdWFsIHRvIHRoZQorfCBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZAorfCBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gIE90aGVyd2lzZSwgdGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQ2NF9lcSggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICB1aW50NjRfdCBhdiwgYnY7CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdiA9IGZsb2F0NjRfdmFsKGEpOworICAgIGJ2ID0gZmxvYXQ2NF92YWwoYik7CisgICAgcmV0dXJuICggYXYgPT0gYnYgKSB8fCAoICh1aW50NjRfdCkgKCAoIGF2IHwgYnYgKTw8MSApID09IDAgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4gb3IKK3wgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUgaW52YWxpZAorfCBleGNlcHRpb24gaXMgcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQ2NF9sZSggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICB1aW50NjRfdCBhdiwgYnY7CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgYXYgPSBmbG9hdDY0X3ZhbChhKTsKKyAgICBidiA9IGZsb2F0NjRfdmFsKGIpOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gfHwgKCAodWludDY0X3QpICggKCBhdiB8IGJ2ICk8PDEgKSA9PSAwICk7CisgICAgcmV0dXJuICggYXYgPT0gYnYgKSB8fCAoIGFTaWduIF4gKCBhdiA8IGJ2ICkgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUgaW52YWxpZCBleGNlcHRpb24gaXMKK3wgcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZworfCB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQ2NF9sdCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICB1aW50NjRfdCBhdiwgYnY7CisKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgYXYgPSBmbG9hdDY0X3ZhbChhKTsKKyAgICBidiA9IGZsb2F0NjRfdmFsKGIpOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gJiYgKCAodWludDY0X3QpICggKCBhdiB8IGJ2ICk8PDEgKSAhPSAwICk7CisgICAgcmV0dXJuICggYXYgIT0gYnYgKSAmJiAoIGFTaWduIF4gKCBhdiA8IGJ2ICkgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJyBjYW5ub3QKK3wgYmUgY29tcGFyZWQsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgZWl0aGVyCit8IG9wZXJhbmQgaXMgYSBOYU4uICBUaGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorfCBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDY0X3Vub3JkZXJlZCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBhICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGIgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbCB0byB0aGUKK3wgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuCit8IGV4Y2VwdGlvbi5UaGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZAorfCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDY0X2VxX3F1aWV0KCBmbG9hdDY0IGEsIGZsb2F0NjQgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIHVpbnQ2NF90IGF2LCBidjsKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBhICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGIgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2ID0gZmxvYXQ2NF92YWwoYSk7CisgICAgYnYgPSBmbG9hdDY0X3ZhbChiKTsKKyAgICByZXR1cm4gKCBhdiA9PSBidiApIHx8ICggKHVpbnQ2NF90KSAoICggYXYgfCBidiApPDwxICkgPT0gMCApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGxlc3MgdGhhbiBvcgorfCBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90Cit8IGNhdXNlIGFuIGV4Y2VwdGlvbi4gIE90aGVyd2lzZSwgdGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUKK3wgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQ2NF9sZV9xdWlldCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKyAgICB1aW50NjRfdCBhdiwgYnY7CisgICAgYSA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYiA9IGZsb2F0NjRfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7CisKKyAgICBpZiAoICAgICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYSApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBhICkgKQorICAgICAgICAgfHwgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBiICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGIgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwgZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0NjRTaWduKCBiICk7CisgICAgYXYgPSBmbG9hdDY0X3ZhbChhKTsKKyAgICBidiA9IGZsb2F0NjRfdmFsKGIpOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSByZXR1cm4gYVNpZ24gfHwgKCAodWludDY0X3QpICggKCBhdiB8IGJ2ICk8PDEgKSA9PSAwICk7CisgICAgcmV0dXJuICggYXYgPT0gYnYgKSB8fCAoIGFTaWduIF4gKCBhdiA8IGJ2ICkgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZSBhbgorfCBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0NjRfbHRfcXVpZXQoIGZsb2F0NjQgYSwgZmxvYXQ2NCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisgICAgdWludDY0X3QgYXYsIGJ2OworICAgIGEgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOworICAgIGIgPSBmbG9hdDY0X3NxdWFzaF9pbnB1dF9kZW5vcm1hbChiIFNUQVRVU19WQVIpOworCisgICAgaWYgKCAgICAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGEgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYSApICkKKyAgICAgICAgIHx8ICggKCBleHRyYWN0RmxvYXQ2NEV4cCggYiApID09IDB4N0ZGICkgJiYgZXh0cmFjdEZsb2F0NjRGcmFjKCBiICkgKQorICAgICAgICkgeworICAgICAgICBpZiAoIGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggYSApIHx8IGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDY0U2lnbiggYiApOworICAgIGF2ID0gZmxvYXQ2NF92YWwoYSk7CisgICAgYnYgPSBmbG9hdDY0X3ZhbChiKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgcmV0dXJuIGFTaWduICYmICggKHVpbnQ2NF90KSAoICggYXYgfCBidiApPDwxICkgIT0gMCApOworICAgIHJldHVybiAoIGF2ICE9IGJ2ICkgJiYgKCBhU2lnbiBeICggYXYgPCBidiApICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicgY2Fubm90Cit8IGJlIGNvbXBhcmVkLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZSBhbiBleGNlcHRpb24uICBUaGUKK3wgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBmbG9hdDY0X3Vub3JkZXJlZF9xdWlldCggZmxvYXQ2NCBhLCBmbG9hdDY0IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBiID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYiBTVEFUVVNfVkFSKTsKKworICAgIGlmICggICAgKCAoIGV4dHJhY3RGbG9hdDY0RXhwKCBhICkgPT0gMHg3RkYgKSAmJiBleHRyYWN0RmxvYXQ2NEZyYWMoIGEgKSApCisgICAgICAgICB8fCAoICggZXh0cmFjdEZsb2F0NjRFeHAoIGIgKSA9PSAweDdGRiApICYmIGV4dHJhY3RGbG9hdDY0RnJhYyggYiApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGBhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUKK3wgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24KK3wgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gIElmIGBhJyBpcyBhIE5hTiwgdGhlCit8IGxhcmdlc3QgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24KK3wgb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludDMyIGZsb2F0eDgwX3RvX2ludDMyKCBmbG9hdHg4MCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBpZiAoICggYUV4cCA9PSAweDdGRkYgKSAmJiAodWludDY0X3QpICggYVNpZzw8MSApICkgYVNpZ24gPSAwOworICAgIHNoaWZ0Q291bnQgPSAweDQwMzcgLSBhRXhwOworICAgIGlmICggc2hpZnRDb3VudCA8PSAwICkgc2hpZnRDb3VudCA9IDE7CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgc2hpZnRDb3VudCwgJmFTaWcgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50MzIoIGFTaWduLCBhU2lnIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGBhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUKK3wgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMsIGV4Y2VwdCB0aGF0IHRoZSBjb252ZXJzaW9uIGlzIGFsd2F5cyByb3VuZGVkCit8IHRvd2FyZCB6ZXJvLiAgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLgorfCBPdGhlcndpc2UsIGlmIHRoZSBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lCit8IHNpZ24gYXMgYGEnIGlzIHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQzMiBmbG9hdHg4MF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdHg4MCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWcsIHNhdmVkQVNpZzsKKyAgICBpbnQzMl90IHo7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBpZiAoIDB4NDAxRSA8IGFFeHAgKSB7CisgICAgICAgIGlmICggKCBhRXhwID09IDB4N0ZGRiApICYmICh1aW50NjRfdCkgKCBhU2lnPDwxICkgKSBhU2lnbiA9IDA7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFFeHAgPCAweDNGRkYgKSB7CisgICAgICAgIGlmICggYUV4cCB8fCBhU2lnICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2hpZnRDb3VudCA9IDB4NDAzRSAtIGFFeHA7CisgICAgc2F2ZWRBU2lnID0gYVNpZzsKKyAgICBhU2lnID4+PSBzaGlmdENvdW50OworICAgIHogPSBhU2lnOworICAgIGlmICggYVNpZ24gKSB6ID0gLSB6OworICAgIGlmICggKCB6IDwgMCApIF4gYVNpZ24gKSB7CisgaW52YWxpZDoKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIGFTaWduID8gKGludDMyX3QpIDB4ODAwMDAwMDAgOiAweDdGRkZGRkZGOworICAgIH0KKyAgICBpZiAoICggYVNpZzw8c2hpZnRDb3VudCApICE9IHNhdmVkQVNpZyApIHsKKyAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIH0KKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGBhJyB0byB0aGUgNjQtYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUKK3wgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24KK3wgaXMgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gIElmIGBhJyBpcyBhIE5hTiwKK3wgdGhlIGxhcmdlc3QgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24KK3wgb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludDY0IGZsb2F0eDgwX3RvX2ludDY0KCBmbG9hdHg4MCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWcsIGFTaWdFeHRyYTsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIHNoaWZ0Q291bnQgPSAweDQwM0UgLSBhRXhwOworICAgIGlmICggc2hpZnRDb3VudCA8PSAwICkgeworICAgICAgICBpZiAoIHNoaWZ0Q291bnQgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgaWYgKCAgICAhIGFTaWduCisgICAgICAgICAgICAgICAgIHx8ICggICAgKCBhRXhwID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBhU2lnICE9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApICkKKyAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHJldHVybiBMSVQ2NCggMHg3RkZGRkZGRkZGRkZGRkZGICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKGludDY0X3QpIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBhU2lnRXh0cmEgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCBhU2lnLCAwLCBzaGlmdENvdW50LCAmYVNpZywgJmFTaWdFeHRyYSApOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50NjQoIGFTaWduLCBhU2lnLCBhU2lnRXh0cmEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3wgcG9pbnQgdmFsdWUgYGEnIHRvIHRoZSA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZQorfCBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYywgZXhjZXB0IHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgYWx3YXlzIHJvdW5kZWQKK3wgdG93YXJkIHplcm8uICBJZiBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuCit8IE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUKK3wgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludDY0IGZsb2F0eDgwX3RvX2ludDY0X3JvdW5kX3RvX3plcm8oIGZsb2F0eDgwIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgdWludDY0X3QgYVNpZzsKKyAgICBpbnQ2NCB6OworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgc2hpZnRDb3VudCA9IGFFeHAgLSAweDQwM0U7CisgICAgaWYgKCAwIDw9IHNoaWZ0Q291bnQgKSB7CisgICAgICAgIGFTaWcgJj0gTElUNjQoIDB4N0ZGRkZGRkZGRkZGRkZGRiApOworICAgICAgICBpZiAoICggYS5oaWdoICE9IDB4QzAzRSApIHx8IGFTaWcgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgaWYgKCAhIGFTaWduIHx8ICggKCBhRXhwID09IDB4N0ZGRiApICYmIGFTaWcgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTElUNjQoIDB4N0ZGRkZGRkZGRkZGRkZGRiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoaW50NjRfdCkgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgIH0KKyAgICBlbHNlIGlmICggYUV4cCA8IDB4M0ZGRiApIHsKKyAgICAgICAgaWYgKCBhRXhwIHwgYVNpZyApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHogPSBhU2lnPj4oIC0gc2hpZnRDb3VudCApOworICAgIGlmICggKHVpbnQ2NF90KSAoIGFTaWc8PCggc2hpZnRDb3VudCAmIDYzICkgKSApIHsKKyAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIH0KKyAgICBpZiAoIGFTaWduICkgeiA9IC0gejsKKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctCit8IHBvaW50IHZhbHVlIGBhJyB0byB0aGUgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUKK3wgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MzIgZmxvYXR4ODBfdG9fZmxvYXQzMiggZmxvYXR4ODAgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MzIgYUV4cDsKKyAgICB1aW50NjRfdCBhU2lnOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAodWludDY0X3QpICggYVNpZzw8MSApICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQzMiggZmxvYXR4ODBUb0NvbW1vbk5hTiggYSBTVEFUVVNfVkFSICkgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMzMsICZhU2lnICk7CisgICAgaWYgKCBhRXhwIHx8IGFTaWcgKSBhRXhwIC09IDB4M0Y4MTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQzMiggYVNpZ24sIGFFeHAsIGFTaWcgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3wgcG9pbnQgdmFsdWUgYGEnIHRvIHRoZSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZQorfCBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQ2NCBmbG9hdHg4MF90b19mbG9hdDY0KCBmbG9hdHg4MCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwOworICAgIHVpbnQ2NF90IGFTaWcsIHpTaWc7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBhU2lnPDwxICkgKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uTmFOVG9GbG9hdDY0KCBmbG9hdHg4MFRvQ29tbW9uTmFOKCBhIFNUQVRVU19WQVIgKSBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCBhU2lnbiwgMHg3RkYsIDAgKTsKKyAgICB9CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZywgMSwgJnpTaWcgKTsKKyAgICBpZiAoIGFFeHAgfHwgYVNpZyApIGFFeHAgLT0gMHgzQzAxOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDY0KCBhU2lnbiwgYUV4cCwgelNpZyBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorfCBwb2ludCB2YWx1ZSBgYScgdG8gdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAgVGhlCit8IGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDEyOCBmbG9hdHg4MF90b19mbG9hdDEyOCggZmxvYXR4ODAgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50X2Zhc3QxNl90IGFFeHA7CisgICAgdWludDY0X3QgYVNpZywgelNpZzAsIHpTaWcxOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgaWYgKCAoIGFFeHAgPT0gMHg3RkZGICkgJiYgKHVpbnQ2NF90KSAoIGFTaWc8PDEgKSApIHsKKyAgICAgICAgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQxMjgoIGZsb2F0eDgwVG9Db21tb25OYU4oIGEgU1RBVFVTX1ZBUiApIFNUQVRVU19WQVIgKTsKKyAgICB9CisgICAgc2hpZnQxMjhSaWdodCggYVNpZzw8MSwgMCwgMTYsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggYVNpZ24sIGFFeHAsIHpTaWcwLCB6U2lnMSApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSb3VuZHMgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIHRvIGFuIGludGVnZXIsCit8IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gZXh0ZW5kZWQgcXVhZHJ1cGxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAorfCB2YWx1ZS4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yCit8IEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdHg4MCBmbG9hdHg4MF9yb3VuZF90b19pbnQoIGZsb2F0eDgwIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHA7CisgICAgdWludDY0X3QgbGFzdEJpdE1hc2ssIHJvdW5kQml0c01hc2s7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxvYXR4ODAgejsKKworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBpZiAoIDB4NDAzRSA8PSBhRXhwICkgeworICAgICAgICBpZiAoICggYUV4cCA9PSAweDdGRkYgKSAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgPCAweDNGRkYgKSB7CisgICAgICAgIGlmICggICAgKCBhRXhwID09IDAgKQorICAgICAgICAgICAgICYmICggKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApID09IDAgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgICAgIHN3aXRjaCAoIFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSApIHsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOgorICAgICAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHgzRkZFICkgJiYgKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApCisgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcGFja0Zsb2F0eDgwKCBhU2lnbiwgMHgzRkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICBhU2lnbiA/CisgICAgICAgICAgICAgICAgICAgICAgcGFja0Zsb2F0eDgwKCAxLCAweDNGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApCisgICAgICAgICAgICAgICAgOiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgIGFTaWduID8gcGFja0Zsb2F0eDgwKCAxLCAwLCAwICkKKyAgICAgICAgICAgICAgICA6IHBhY2tGbG9hdHg4MCggMCwgMHgzRkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCBhU2lnbiwgMCwgMCApOworICAgIH0KKyAgICBsYXN0Qml0TWFzayA9IDE7CisgICAgbGFzdEJpdE1hc2sgPDw9IDB4NDAzRSAtIGFFeHA7CisgICAgcm91bmRCaXRzTWFzayA9IGxhc3RCaXRNYXNrIC0gMTsKKyAgICB6ID0gYTsKKyAgICByb3VuZGluZ01vZGUgPSBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSk7CisgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICkgeworICAgICAgICB6LmxvdyArPSBsYXN0Qml0TWFzaz4+MTsKKyAgICAgICAgaWYgKCAoIHoubG93ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6LmxvdyAmPSB+IGxhc3RCaXRNYXNrOworICAgIH0KKyAgICBlbHNlIGlmICggcm91bmRpbmdNb2RlICE9IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgIGlmICggZXh0cmFjdEZsb2F0eDgwU2lnbiggeiApIF4gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSApIHsKKyAgICAgICAgICAgIHoubG93ICs9IHJvdW5kQml0c01hc2s7CisgICAgICAgIH0KKyAgICB9CisgICAgei5sb3cgJj0gfiByb3VuZEJpdHNNYXNrOworICAgIGlmICggei5sb3cgPT0gMCApIHsKKyAgICAgICAgKyt6LmhpZ2g7CisgICAgICAgIHoubG93ID0gTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgIH0KKyAgICBpZiAoIHoubG93ICE9IGEubG93ICkgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIHJldHVybiB6OworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIGV4dGVuZGVkIGRvdWJsZS0KK3wgcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgMSwgdGhlIHN1bSBpcworfCBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IGlzIGEgTmFOLgorfCBUaGUgYWRkaXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXR4ODAgYWRkRmxvYXR4ODBTaWdzKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiLCBmbGFnIHpTaWduIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQzMiBhRXhwLCBiRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcsIGJTaWcsIHpTaWcwLCB6U2lnMTsKKyAgICBpbnQzMiBleHBEaWZmOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGlmICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBhU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBiRXhwID09IDAgKSAtLWV4cERpZmY7CisgICAgICAgIHNoaWZ0NjRFeHRyYVJpZ2h0SmFtbWluZyggYlNpZywgMCwgZXhwRGlmZiwgJmJTaWcsICZ6U2lnMSApOworICAgICAgICB6RXhwID0gYUV4cDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGV4cERpZmYgPCAwICkgeworICAgICAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICAgICAgaWYgKCAodWludDY0X3QpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggYUV4cCA9PSAwICkgKytleHBEaWZmOworICAgICAgICBzaGlmdDY0RXh0cmFSaWdodEphbW1pbmcoIGFTaWcsIDAsIC0gZXhwRGlmZiwgJmFTaWcsICZ6U2lnMSApOworICAgICAgICB6RXhwID0gYkV4cDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoICh1aW50NjRfdCkgKCAoIGFTaWcgfCBiU2lnICk8PDEgKSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgelNpZzEgPSAwOworICAgICAgICB6U2lnMCA9IGFTaWcgKyBiU2lnOworICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCB6U2lnMCwgJnpFeHAsICZ6U2lnMCApOworICAgICAgICAgICAgZ290byByb3VuZEFuZFBhY2s7CisgICAgICAgIH0KKyAgICAgICAgekV4cCA9IGFFeHA7CisgICAgICAgIGdvdG8gc2hpZnRSaWdodDE7CisgICAgfQorICAgIHpTaWcwID0gYVNpZyArIGJTaWc7CisgICAgaWYgKCAoaW50NjRfdCkgelNpZzAgPCAwICkgZ290byByb3VuZEFuZFBhY2s7Cisgc2hpZnRSaWdodDE6CisgICAgc2hpZnQ2NEV4dHJhUmlnaHRKYW1taW5nKCB6U2lnMCwgelNpZzEsIDEsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgelNpZzAgfD0gTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgICsrekV4cDsKKyByb3VuZEFuZFBhY2s6CisgICAgcmV0dXJuCisgICAgICAgIHJvdW5kQW5kUGFja0Zsb2F0eDgwKAorICAgICAgICAgICAgU1RBVFVTKGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiksIHpTaWduLCB6RXhwLCB6U2lnMCwgelNpZzEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgZXh0ZW5kZWQKK3wgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBJZiBgelNpZ24nIGlzIDEsIHRoZQorfCBkaWZmZXJlbmNlIGlzIG5lZ2F0ZWQgYmVmb3JlIGJlaW5nIHJldHVybmVkLiAgYHpTaWduJyBpcyBpZ25vcmVkIGlmIHRoZQorfCByZXN1bHQgaXMgYSBOYU4uICBUaGUgc3VidHJhY3Rpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUKK3wgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXR4ODAgc3ViRmxvYXR4ODBTaWdzKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiLCBmbGFnIHpTaWduIFNUQVRVU19QQVJBTSApCit7CisgICAgaW50MzIgYUV4cCwgYkV4cCwgekV4cDsKKyAgICB1aW50NjRfdCBhU2lnLCBiU2lnLCB6U2lnMCwgelNpZzE7CisgICAgaW50MzIgZXhwRGlmZjsKKyAgICBmbG9hdHg4MCB6OworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBiICk7CisgICAgZXhwRGlmZiA9IGFFeHAgLSBiRXhwOworICAgIGlmICggMCA8IGV4cERpZmYgKSBnb3RvIGFFeHBCaWdnZXI7CisgICAgaWYgKCBleHBEaWZmIDwgMCApIGdvdG8gYkV4cEJpZ2dlcjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCAoIGFTaWcgfCBiU2lnICk8PDEgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIHouaGlnaCA9IGZsb2F0eDgwX2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgIHJldHVybiB6OworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgYUV4cCA9IDE7CisgICAgICAgIGJFeHAgPSAxOworICAgIH0KKyAgICB6U2lnMSA9IDA7CisgICAgaWYgKCBiU2lnIDwgYVNpZyApIGdvdG8gYUJpZ2dlcjsKKyAgICBpZiAoIGFTaWcgPCBiU2lnICkgZ290byBiQmlnZ2VyOworICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSA9PSBmbG9hdF9yb3VuZF9kb3duLCAwLCAwICk7CisgYkV4cEJpZ2dlcjoKKyAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBiU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiBeIDEsIDB4N0ZGRiwgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgKytleHBEaWZmOworICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKCBhU2lnLCAwLCAtIGV4cERpZmYsICZhU2lnLCAmelNpZzEgKTsKKyBiQmlnZ2VyOgorICAgIHN1YjEyOCggYlNpZywgMCwgYVNpZywgelNpZzEsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgekV4cCA9IGJFeHA7CisgICAgelNpZ24gXj0gMTsKKyAgICBnb3RvIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazsKKyBhRXhwQmlnZ2VyOgorICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggKHVpbnQ2NF90KSAoIGFTaWc8PDEgKSApIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIC0tZXhwRGlmZjsKKyAgICBzaGlmdDEyOFJpZ2h0SmFtbWluZyggYlNpZywgMCwgZXhwRGlmZiwgJmJTaWcsICZ6U2lnMSApOworIGFCaWdnZXI6CisgICAgc3ViMTI4KCBhU2lnLCAwLCBiU2lnLCB6U2lnMSwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICB6RXhwID0gYUV4cDsKKyBub3JtYWxpemVSb3VuZEFuZFBhY2s6CisgICAgcmV0dXJuCisgICAgICAgIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0eDgwKAorICAgICAgICAgICAgU1RBVFVTKGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiksIHpTaWduLCB6RXhwLCB6U2lnMCwgelNpZzEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit8IHZhbHVlcyBgYScgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUKK3wgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdHg4MCBmbG9hdHg4MF9hZGQoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIGlmICggYVNpZ24gPT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybiBhZGRGbG9hdHg4MFNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBzdWJGbG9hdHg4MFNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy0KK3wgcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorfCBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0eDgwIGZsb2F0eDgwX3N1YiggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduOworCisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiA9PSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuIHN1YkZsb2F0eDgwU2lncyggYSwgYiwgYVNpZ24gU1RBVFVTX1ZBUiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGFkZEZsb2F0eDgwU2lncyggYSwgYiwgYVNpZ24gU1RBVFVTX1ZBUiApOworICAgIH0KKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLQorfCBwb2ludCB2YWx1ZXMgYGEnIGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlCit8IElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXR4ODAgZmxvYXR4ODBfbXVsKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDMyIGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZywgYlNpZywgelNpZzAsIHpTaWcxOworICAgIGZsb2F0eDgwIHo7CisKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnID0gZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICB6U2lnbiA9IGFTaWduIF4gYlNpZ247CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAgICAodWludDY0X3QpICggYVNpZzw8MSApCisgICAgICAgICAgICAgfHwgKCAoIGJFeHAgPT0gMHg3RkZGICkgJiYgKHVpbnQ2NF90KSAoIGJTaWc8PDEgKSApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggYkV4cCB8IGJTaWcgKSA9PSAwICkgZ290byBpbnZhbGlkOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg3RkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAodWludDY0X3QpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyBpbnZhbGlkOgorICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHoubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICAgICAgei5oaWdoID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaDsKKyAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCBhU2lnID09IDAgKSByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdHg4MFN1Ym5vcm1hbCggYVNpZywgJmFFeHAsICZhU2lnICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoIGJTaWcgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCBiU2lnLCAmYkV4cCwgJmJTaWcgKTsKKyAgICB9CisgICAgekV4cCA9IGFFeHAgKyBiRXhwIC0gMHgzRkZFOworICAgIG11bDY0VG8xMjgoIGFTaWcsIGJTaWcsICZ6U2lnMCwgJnpTaWcxICk7CisgICAgaWYgKCAwIDwgKGludDY0X3QpIHpTaWcwICkgeworICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCggelNpZzAsIHpTaWcxLCAxLCAmelNpZzAsICZ6U2lnMSApOworICAgICAgICAtLXpFeHA7CisgICAgfQorICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIFNUQVRVUyhmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24pLCB6U2lnbiwgekV4cCwgelNpZzAsIHpTaWcxIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit8IHZhbHVlIGBhJyBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXR4ODAgZmxvYXR4ODBfZGl2KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDMyIGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZywgYlNpZywgelNpZzAsIHpTaWcxOworICAgIHVpbnQ2NF90IHJlbTAsIHJlbTEsIHJlbTIsIHRlcm0wLCB0ZXJtMSwgdGVybTI7CisgICAgZmxvYXR4ODAgejsKKworICAgIGFTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWcgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBhU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICAgICAgaWYgKCAodWludDY0X3QpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCB6U2lnbiwgMHg3RkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAodWludDY0X3QpICggYlNpZzw8MSApICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0eDgwTmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDAsIDAgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYlNpZyA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnICkgPT0gMCApIHsKKyBpbnZhbGlkOgorICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgICAgICAgICAgei5oaWdoID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5faGlnaDsKKyAgICAgICAgICAgICAgICByZXR1cm4gejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2RpdmJ5emVybyBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXR4ODAoIHpTaWduLCAweDdGRkYsIExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKSApOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCBiU2lnLCAmYkV4cCwgJmJTaWcgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZyA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdHg4MCggelNpZ24sIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGFTaWcsICZhRXhwLCAmYVNpZyApOworICAgIH0KKyAgICB6RXhwID0gYUV4cCAtIGJFeHAgKyAweDNGRkU7CisgICAgcmVtMSA9IDA7CisgICAgaWYgKCBiU2lnIDw9IGFTaWcgKSB7CisgICAgICAgIHNoaWZ0MTI4UmlnaHQoIGFTaWcsIDAsIDEsICZhU2lnLCAmcmVtMSApOworICAgICAgICArK3pFeHA7CisgICAgfQorICAgIHpTaWcwID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnLCByZW0xLCBiU2lnICk7CisgICAgbXVsNjRUbzEyOCggYlNpZywgelNpZzAsICZ0ZXJtMCwgJnRlcm0xICk7CisgICAgc3ViMTI4KCBhU2lnLCByZW0xLCB0ZXJtMCwgdGVybTEsICZyZW0wLCAmcmVtMSApOworICAgIHdoaWxlICggKGludDY0X3QpIHJlbTAgPCAwICkgeworICAgICAgICAtLXpTaWcwOworICAgICAgICBhZGQxMjgoIHJlbTAsIHJlbTEsIDAsIGJTaWcsICZyZW0wLCAmcmVtMSApOworICAgIH0KKyAgICB6U2lnMSA9IGVzdGltYXRlRGl2MTI4VG82NCggcmVtMSwgMCwgYlNpZyApOworICAgIGlmICggKHVpbnQ2NF90KSAoIHpTaWcxPDwxICkgPD0gOCApIHsKKyAgICAgICAgbXVsNjRUbzEyOCggYlNpZywgelNpZzEsICZ0ZXJtMSwgJnRlcm0yICk7CisgICAgICAgIHN1YjEyOCggcmVtMSwgMCwgdGVybTEsIHRlcm0yLCAmcmVtMSwgJnJlbTIgKTsKKyAgICAgICAgd2hpbGUgKCAoaW50NjRfdCkgcmVtMSA8IDAgKSB7CisgICAgICAgICAgICAtLXpTaWcxOworICAgICAgICAgICAgYWRkMTI4KCByZW0xLCByZW0yLCAwLCBiU2lnLCAmcmVtMSwgJnJlbTIgKTsKKyAgICAgICAgfQorICAgICAgICB6U2lnMSB8PSAoICggcmVtMSB8IHJlbTIgKSAhPSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICByb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIFNUQVRVUyhmbG9hdHg4MF9yb3VuZGluZ19wcmVjaXNpb24pLCB6U2lnbiwgekV4cCwgelNpZzAsIHpTaWcxIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQKK3wgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0eDgwIGZsb2F0eDgwX3JlbSggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIHpTaWduOworICAgIGludDMyIGFFeHAsIGJFeHAsIGV4cERpZmY7CisgICAgdWludDY0X3QgYVNpZzAsIGFTaWcxLCBiU2lnOworICAgIHVpbnQ2NF90IHEsIHRlcm0wLCB0ZXJtMSwgYWx0ZXJuYXRlQVNpZzAsIGFsdGVybmF0ZUFTaWcxOworICAgIGZsb2F0eDgwIHo7CisKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBiICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCAgICAodWludDY0X3QpICggYVNpZzA8PDEgKQorICAgICAgICAgICAgIHx8ICggKCBiRXhwID09IDB4N0ZGRiApICYmICh1aW50NjRfdCkgKCBiU2lnPDwxICkgKSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdHg4ME5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoICh1aW50NjRfdCkgKCBiU2lnPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYlNpZyA9PSAwICkgeworIGludmFsaWQ6CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgei5sb3cgPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgICAgICB6LmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGJTaWcsICZiRXhwLCAmYlNpZyApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCAodWludDY0X3QpICggYVNpZzA8PDEgKSA9PSAwICkgcmV0dXJuIGE7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0eDgwU3Vibm9ybWFsKCBhU2lnMCwgJmFFeHAsICZhU2lnMCApOworICAgIH0KKyAgICBiU2lnIHw9IExJVDY0KCAweDgwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB6U2lnbiA9IGFTaWduOworICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBhU2lnMSA9IDA7CisgICAgaWYgKCBleHBEaWZmIDwgMCApIHsKKyAgICAgICAgaWYgKCBleHBEaWZmIDwgLTEgKSByZXR1cm4gYTsKKyAgICAgICAgc2hpZnQxMjhSaWdodCggYVNpZzAsIDAsIDEsICZhU2lnMCwgJmFTaWcxICk7CisgICAgICAgIGV4cERpZmYgPSAwOworICAgIH0KKyAgICBxID0gKCBiU2lnIDw9IGFTaWcwICk7CisgICAgaWYgKCBxICkgYVNpZzAgLT0gYlNpZzsKKyAgICBleHBEaWZmIC09IDY0OworICAgIHdoaWxlICggMCA8IGV4cERpZmYgKSB7CisgICAgICAgIHEgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcwLCBhU2lnMSwgYlNpZyApOworICAgICAgICBxID0gKCAyIDwgcSApID8gcSAtIDIgOiAwOworICAgICAgICBtdWw2NFRvMTI4KCBiU2lnLCBxLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgdGVybTAsIHRlcm0xLCAmYVNpZzAsICZhU2lnMSApOworICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCggYVNpZzAsIGFTaWcxLCA2MiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgZXhwRGlmZiAtPSA2MjsKKyAgICB9CisgICAgZXhwRGlmZiArPSA2NDsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnMCwgYVNpZzEsIGJTaWcgKTsKKyAgICAgICAgcSA9ICggMiA8IHEgKSA/IHEgLSAyIDogMDsKKyAgICAgICAgcSA+Pj0gNjQgLSBleHBEaWZmOworICAgICAgICBtdWw2NFRvMTI4KCBiU2lnLCBxPDwoIDY0IC0gZXhwRGlmZiApLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgdGVybTAsIHRlcm0xLCAmYVNpZzAsICZhU2lnMSApOworICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCggMCwgYlNpZywgNjQgLSBleHBEaWZmLCAmdGVybTAsICZ0ZXJtMSApOworICAgICAgICB3aGlsZSAoIGxlMTI4KCB0ZXJtMCwgdGVybTEsIGFTaWcwLCBhU2lnMSApICkgeworICAgICAgICAgICAgKytxOworICAgICAgICAgICAgc3ViMTI4KCBhU2lnMCwgYVNpZzEsIHRlcm0wLCB0ZXJtMSwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGVybTEgPSAwOworICAgICAgICB0ZXJtMCA9IGJTaWc7CisgICAgfQorICAgIHN1YjEyOCggdGVybTAsIHRlcm0xLCBhU2lnMCwgYVNpZzEsICZhbHRlcm5hdGVBU2lnMCwgJmFsdGVybmF0ZUFTaWcxICk7CisgICAgaWYgKCAgICBsdDEyOCggYWx0ZXJuYXRlQVNpZzAsIGFsdGVybmF0ZUFTaWcxLCBhU2lnMCwgYVNpZzEgKQorICAgICAgICAgfHwgKCAgICBlcTEyOCggYWx0ZXJuYXRlQVNpZzAsIGFsdGVybmF0ZUFTaWcxLCBhU2lnMCwgYVNpZzEgKQorICAgICAgICAgICAgICAmJiAoIHEgJiAxICkgKQorICAgICAgICkgeworICAgICAgICBhU2lnMCA9IGFsdGVybmF0ZUFTaWcwOworICAgICAgICBhU2lnMSA9IGFsdGVybmF0ZUFTaWcxOworICAgICAgICB6U2lnbiA9ICEgelNpZ247CisgICAgfQorICAgIHJldHVybgorICAgICAgICBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdHg4MCgKKyAgICAgICAgICAgIDgwLCB6U2lnbiwgYkV4cCArIGV4cERpZmYsIGFTaWcwLCBhU2lnMSBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit8IHZhbHVlIGBhJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK3wgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdHg4MCBmbG9hdHg4MF9zcXJ0KCBmbG9hdHg4MCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMSwgelNpZzAsIHpTaWcxLCBkb3VibGVaU2lnMDsKKyAgICB1aW50NjRfdCByZW0wLCByZW0xLCByZW0yLCByZW0zLCB0ZXJtMCwgdGVybTEsIHRlcm0yLCB0ZXJtMzsKKyAgICBmbG9hdHg4MCB6OworCisgICAgYVNpZzAgPSBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdHg4MEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggKHVpbnQ2NF90KSAoIGFTaWcwPDwxICkgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICBpZiAoICEgYVNpZ24gKSByZXR1cm4gYTsKKyAgICAgICAgZ290byBpbnZhbGlkOworICAgIH0KKyAgICBpZiAoIGFTaWduICkgeworICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcwICkgPT0gMCApIHJldHVybiBhOworIGludmFsaWQ6CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHoubG93ID0gZmxvYXR4ODBfZGVmYXVsdF9uYW5fbG93OworICAgICAgICB6LmhpZ2ggPSBmbG9hdHg4MF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICByZXR1cm4gejsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggYVNpZzAgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIDAsIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXR4ODBTdWJub3JtYWwoIGFTaWcwLCAmYUV4cCwgJmFTaWcwICk7CisgICAgfQorICAgIHpFeHAgPSAoICggYUV4cCAtIDB4M0ZGRiApPj4xICkgKyAweDNGRkY7CisgICAgelNpZzAgPSBlc3RpbWF0ZVNxcnQzMiggYUV4cCwgYVNpZzA+PjMyICk7CisgICAgc2hpZnQxMjhSaWdodCggYVNpZzAsIDAsIDIgKyAoIGFFeHAgJiAxICksICZhU2lnMCwgJmFTaWcxICk7CisgICAgelNpZzAgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcwLCBhU2lnMSwgelNpZzA8PDMyICkgKyAoIHpTaWcwPDwzMCApOworICAgIGRvdWJsZVpTaWcwID0gelNpZzA8PDE7CisgICAgbXVsNjRUbzEyOCggelNpZzAsIHpTaWcwLCAmdGVybTAsICZ0ZXJtMSApOworICAgIHN1YjEyOCggYVNpZzAsIGFTaWcxLCB0ZXJtMCwgdGVybTEsICZyZW0wLCAmcmVtMSApOworICAgIHdoaWxlICggKGludDY0X3QpIHJlbTAgPCAwICkgeworICAgICAgICAtLXpTaWcwOworICAgICAgICBkb3VibGVaU2lnMCAtPSAyOworICAgICAgICBhZGQxMjgoIHJlbTAsIHJlbTEsIHpTaWcwPj42MywgZG91YmxlWlNpZzAgfCAxLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB9CisgICAgelNpZzEgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIHJlbTEsIDAsIGRvdWJsZVpTaWcwICk7CisgICAgaWYgKCAoIHpTaWcxICYgTElUNjQoIDB4M0ZGRkZGRkZGRkZGRkZGRiApICkgPD0gNSApIHsKKyAgICAgICAgaWYgKCB6U2lnMSA9PSAwICkgelNpZzEgPSAxOworICAgICAgICBtdWw2NFRvMTI4KCBkb3VibGVaU2lnMCwgelNpZzEsICZ0ZXJtMSwgJnRlcm0yICk7CisgICAgICAgIHN1YjEyOCggcmVtMSwgMCwgdGVybTEsIHRlcm0yLCAmcmVtMSwgJnJlbTIgKTsKKyAgICAgICAgbXVsNjRUbzEyOCggelNpZzEsIHpTaWcxLCAmdGVybTIsICZ0ZXJtMyApOworICAgICAgICBzdWIxOTIoIHJlbTEsIHJlbTIsIDAsIDAsIHRlcm0yLCB0ZXJtMywgJnJlbTEsICZyZW0yLCAmcmVtMyApOworICAgICAgICB3aGlsZSAoIChpbnQ2NF90KSByZW0xIDwgMCApIHsKKyAgICAgICAgICAgIC0telNpZzE7CisgICAgICAgICAgICBzaG9ydFNoaWZ0MTI4TGVmdCggMCwgelNpZzEsIDEsICZ0ZXJtMiwgJnRlcm0zICk7CisgICAgICAgICAgICB0ZXJtMyB8PSAxOworICAgICAgICAgICAgdGVybTIgfD0gZG91YmxlWlNpZzA7CisgICAgICAgICAgICBhZGQxOTIoIHJlbTEsIHJlbTIsIHJlbTMsIDAsIHRlcm0yLCB0ZXJtMywgJnJlbTEsICZyZW0yLCAmcmVtMyApOworICAgICAgICB9CisgICAgICAgIHpTaWcxIHw9ICggKCByZW0xIHwgcmVtMiB8IHJlbTMgKSAhPSAwICk7CisgICAgfQorICAgIHNob3J0U2hpZnQxMjhMZWZ0KCAwLCB6U2lnMSwgMSwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICB6U2lnMCB8PSBkb3VibGVaU2lnMDsKKyAgICByZXR1cm4KKyAgICAgICAgcm91bmRBbmRQYWNrRmxvYXR4ODAoCisgICAgICAgICAgICBTVEFUVVMoZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uKSwgMCwgekV4cCwgelNpZzAsIHpTaWcxIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbAorfCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcworfCByYWlzZWQgaWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0eDgwX2VxKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBhLmxvdyA9PSBiLmxvdyApCisgICAgICAgICYmICggICAgKCBhLmhpZ2ggPT0gYi5oaWdoICkKKyAgICAgICAgICAgICB8fCAoICAgICggYS5sb3cgPT0gMCApCisgICAgICAgICAgICAgICAgICAmJiAoICh1aW50MTZfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgPT0gMCApICkKKyAgICAgICAgICAgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcworfCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUKK3wgaW52YWxpZCBleGNlcHRpb24gaXMgcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgVGhlIGNvbXBhcmlzb24gaXMKK3wgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXR4ODBfbGUoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk8PDEgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0eDgwU2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgYVNpZ24KKyAgICAgICAgICAgIHx8ICggICAgKCAoICh1aW50MTZfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgKSB8IGEubG93IHwgYi5sb3cgKQorICAgICAgICAgICAgICAgICA9PSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICAgIGFTaWduID8gbGUxMjgoIGIuaGlnaCwgYi5sb3csIGEuaGlnaCwgYS5sb3cgKQorICAgICAgICA6IGxlMTI4KCBhLmhpZ2gsIGEubG93LCBiLmhpZ2gsIGIubG93ICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgZXh0ZW5kZWQgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMKK3wgbGVzcyB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQKK3wgZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0eDgwX2x0KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgIGFTaWduCisgICAgICAgICAgICAmJiAoICAgICggKCAodWludDE2X3QpICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApICkgfCBhLmxvdyB8IGIubG93ICkKKyAgICAgICAgICAgICAgICAgIT0gMCApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICBhU2lnbiA/IGx0MTI4KCBiLmhpZ2gsIGIubG93LCBhLmhpZ2gsIGEubG93ICkKKyAgICAgICAgOiBsdDEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInCit8IGNhbm5vdCBiZSBjb21wYXJlZCwgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBpZgorfCBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gICBUaGUgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZQorfCBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgZmxvYXR4ODBfdW5vcmRlcmVkKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgaWYgKCAgICAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBhICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApICkKKyAgICAgICAgIHx8ICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGIgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYiApPDwxICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzCit8IGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgUXVpZXQgTmFOcyBkbyBub3QKK3wgY2F1c2UgYW4gZXhjZXB0aW9uLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUKK3wgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXR4ODBfZXFfcXVpZXQoIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIgU1RBVFVTX1BBUkFNICkKK3sKKworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk8PDEgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBhLmxvdyA9PSBiLmxvdyApCisgICAgICAgICYmICggICAgKCBhLmhpZ2ggPT0gYi5oaWdoICkKKyAgICAgICAgICAgICB8fCAoICAgICggYS5sb3cgPT0gMCApCisgICAgICAgICAgICAgICAgICAmJiAoICh1aW50MTZfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgPT0gMCApICkKKyAgICAgICAgICAgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzCit8IHRoYW4gb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zCit8IGRvIG5vdCBjYXVzZSBhbiBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcKK3wgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0eDgwX2xlX3F1aWV0KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggICAgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYSApCisgICAgICAgICAgICAgfHwgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICBhU2lnbgorICAgICAgICAgICAgfHwgKCAgICAoICggKHVpbnQxNl90KSAoICggYS5oaWdoIHwgYi5oaWdoICk8PDEgKSApIHwgYS5sb3cgfCBiLmxvdyApCisgICAgICAgICAgICAgICAgID09IDAgKTsKKyAgICB9CisgICAgcmV0dXJuCisgICAgICAgICAgYVNpZ24gPyBsZTEyOCggYi5oaWdoLCBiLmxvdywgYS5oaWdoLCBhLmxvdyApCisgICAgICAgIDogbGUxMjgoIGEuaGlnaCwgYS5sb3csIGIuaGlnaCwgYi5sb3cgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzCit8IHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZQorfCBhbiBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlCit8IElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0eDgwX2x0X3F1aWV0KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXR4ODBFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAodWludDY0X3QpICggZXh0cmFjdEZsb2F0eDgwRnJhYyggYSApPDwxICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggICAgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYSApCisgICAgICAgICAgICAgfHwgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICBhU2lnbgorICAgICAgICAgICAgJiYgKCAgICAoICggKHVpbnQxNl90KSAoICggYS5oaWdoIHwgYi5oaWdoICk8PDEgKSApIHwgYS5sb3cgfCBiLmxvdyApCisgICAgICAgICAgICAgICAgICE9IDAgKTsKKyAgICB9CisgICAgcmV0dXJuCisgICAgICAgICAgYVNpZ24gPyBsdDEyOCggYi5oaWdoLCBiLmxvdywgYS5oaWdoLCBhLmxvdyApCisgICAgICAgIDogbHQxMjgoIGEuaGlnaCwgYS5sb3csIGIuaGlnaCwgYi5sb3cgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJworfCBjYW5ub3QgYmUgY29tcGFyZWQsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4KK3wgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IGZsb2F0eDgwX3Vub3JkZXJlZF9xdWlldCggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICh1aW50NjRfdCkgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBhICk8PDEgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0eDgwRXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKHVpbnQ2NF90KSAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGIgKTw8MSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdHg4MF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit8IHZhbHVlIGBhJyB0byB0aGUgMzItYml0IHR3bydzIGNvbXBsZW1lbnQgaW50ZWdlciBmb3JtYXQuICBUaGUgY29udmVyc2lvbgorfCBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMtLS13aGljaCBtZWFucyBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgcm91bmRlZAorfCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcm91bmRpbmcgbW9kZS4gIElmIGBhJyBpcyBhIE5hTiwgdGhlIGxhcmdlc3QKK3wgcG9zaXRpdmUgaW50ZWdlciBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgaWYgdGhlIGNvbnZlcnNpb24gb3ZlcmZsb3dzLCB0aGUKK3wgbGFyZ2VzdCBpbnRlZ2VyIHdpdGggdGhlIHNhbWUgc2lnbiBhcyBgYScgaXMgcmV0dXJuZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludDMyIGZsb2F0MTI4X3RvX2ludDMyKCBmbG9hdDEyOCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMTsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGlmICggKCBhRXhwID09IDB4N0ZGRiApICYmICggYVNpZzAgfCBhU2lnMSApICkgYVNpZ24gPSAwOworICAgIGlmICggYUV4cCApIGFTaWcwIHw9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKTsKKyAgICBhU2lnMCB8PSAoIGFTaWcxICE9IDAgKTsKKyAgICBzaGlmdENvdW50ID0gMHg0MDI4IC0gYUV4cDsKKyAgICBpZiAoIDAgPCBzaGlmdENvdW50ICkgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZzAsIHNoaWZ0Q291bnQsICZhU2lnMCApOworICAgIHJldHVybiByb3VuZEFuZFBhY2tJbnQzMiggYVNpZ24sIGFTaWcwIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3wgdmFsdWUgYGEnIHRvIHRoZSAzMi1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCit8IGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYywgZXhjZXB0IHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG93YXJkIHplcm8uICBJZgorfCBgYScgaXMgYSBOYU4sIHRoZSBsYXJnZXN0IHBvc2l0aXZlIGludGVnZXIgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsIGlmIHRoZQorfCBjb252ZXJzaW9uIG92ZXJmbG93cywgdGhlIGxhcmdlc3QgaW50ZWdlciB3aXRoIHRoZSBzYW1lIHNpZ24gYXMgYGEnIGlzCit8IHJldHVybmVkLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQzMiBmbG9hdDEyOF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDEyOCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwLCBzaGlmdENvdW50OworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMSwgc2F2ZWRBU2lnOworICAgIGludDMyX3QgejsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGFTaWcwIHw9ICggYVNpZzEgIT0gMCApOworICAgIGlmICggMHg0MDFFIDwgYUV4cCApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgPT0gMHg3RkZGICkgJiYgYVNpZzAgKSBhU2lnbiA9IDA7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFFeHAgPCAweDNGRkYgKSB7CisgICAgICAgIGlmICggYUV4cCB8fCBhU2lnMCApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWcwIHw9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKTsKKyAgICBzaGlmdENvdW50ID0gMHg0MDJGIC0gYUV4cDsKKyAgICBzYXZlZEFTaWcgPSBhU2lnMDsKKyAgICBhU2lnMCA+Pj0gc2hpZnRDb3VudDsKKyAgICB6ID0gYVNpZzA7CisgICAgaWYgKCBhU2lnbiApIHogPSAtIHo7CisgICAgaWYgKCAoIHogPCAwICkgXiBhU2lnbiApIHsKKyBpbnZhbGlkOgorICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gYVNpZ24gPyAoaW50MzJfdCkgMHg4MDAwMDAwMCA6IDB4N0ZGRkZGRkY7CisgICAgfQorICAgIGlmICggKCBhU2lnMDw8c2hpZnRDb3VudCApICE9IHNhdmVkQVNpZyApIHsKKyAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIH0KKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3wgdmFsdWUgYGEnIHRvIHRoZSA2NC1iaXQgdHdvJ3MgY29tcGxlbWVudCBpbnRlZ2VyIGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCit8IGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYy0tLXdoaWNoIG1lYW5zIGluIHBhcnRpY3VsYXIgdGhhdCB0aGUgY29udmVyc2lvbiBpcyByb3VuZGVkCit8IGFjY29yZGluZyB0byB0aGUgY3VycmVudCByb3VuZGluZyBtb2RlLiAgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdAorfCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZiB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZQorfCBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcyByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50NjQgZmxvYXQxMjhfdG9faW50NjQoIGZsb2F0MTI4IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHAsIHNoaWZ0Q291bnQ7CisgICAgdWludDY0X3QgYVNpZzAsIGFTaWcxOworCisgICAgYVNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApOworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgaWYgKCBhRXhwICkgYVNpZzAgfD0gTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApOworICAgIHNoaWZ0Q291bnQgPSAweDQwMkYgLSBhRXhwOworICAgIGlmICggc2hpZnRDb3VudCA8PSAwICkgeworICAgICAgICBpZiAoIDB4NDAzRSA8IGFFeHAgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgaWYgKCAgICAhIGFTaWduCisgICAgICAgICAgICAgICAgIHx8ICggICAgKCBhRXhwID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBhU2lnMSB8fCAoIGFTaWcwICE9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKSApICkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExJVDY0KCAweDdGRkZGRkZGRkZGRkZGRkYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoaW50NjRfdCkgTElUNjQoIDB4ODAwMDAwMDAwMDAwMDAwMCApOworICAgICAgICB9CisgICAgICAgIHNob3J0U2hpZnQxMjhMZWZ0KCBhU2lnMCwgYVNpZzEsIC0gc2hpZnRDb3VudCwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNoaWZ0NjRFeHRyYVJpZ2h0SmFtbWluZyggYVNpZzAsIGFTaWcxLCBzaGlmdENvdW50LCAmYVNpZzAsICZhU2lnMSApOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrSW50NjQoIGFTaWduLCBhU2lnMCwgYVNpZzEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAorfCB2YWx1ZSBgYScgdG8gdGhlIDY0LWJpdCB0d28ncyBjb21wbGVtZW50IGludGVnZXIgZm9ybWF0LiAgVGhlIGNvbnZlcnNpb24KK3wgaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludAorfCBBcml0aG1ldGljLCBleGNlcHQgdGhhdCB0aGUgY29udmVyc2lvbiBpcyBhbHdheXMgcm91bmRlZCB0b3dhcmQgemVyby4KK3wgSWYgYGEnIGlzIGEgTmFOLCB0aGUgbGFyZ2VzdCBwb3NpdGl2ZSBpbnRlZ2VyIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBpZgorfCB0aGUgY29udmVyc2lvbiBvdmVyZmxvd3MsIHRoZSBsYXJnZXN0IGludGVnZXIgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGBhJyBpcworfCByZXR1cm5lZC4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50NjQgZmxvYXQxMjhfdG9faW50NjRfcm91bmRfdG9femVybyggZmxvYXQxMjggYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MzIgYUV4cCwgc2hpZnRDb3VudDsKKyAgICB1aW50NjRfdCBhU2lnMCwgYVNpZzE7CisgICAgaW50NjQgejsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGlmICggYUV4cCApIGFTaWcwIHw9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKTsKKyAgICBzaGlmdENvdW50ID0gYUV4cCAtIDB4NDAyRjsKKyAgICBpZiAoIDAgPCBzaGlmdENvdW50ICkgeworICAgICAgICBpZiAoIDB4NDAzRSA8PSBhRXhwICkgeworICAgICAgICAgICAgYVNpZzAgJj0gTElUNjQoIDB4MDAwMEZGRkZGRkZGRkZGRiApOworICAgICAgICAgICAgaWYgKCAgICAoIGEuaGlnaCA9PSBMSVQ2NCggMHhDMDNFMDAwMDAwMDAwMDAwICkgKQorICAgICAgICAgICAgICAgICAmJiAoIGFTaWcxIDwgTElUNjQoIDB4MDAwMjAwMDAwMDAwMDAwMCApICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhU2lnMSApIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICAgICAgaWYgKCAhIGFTaWduIHx8ICggKCBhRXhwID09IDB4N0ZGRiApICYmICggYVNpZzAgfCBhU2lnMSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMSVQ2NCggMHg3RkZGRkZGRkZGRkZGRkZGICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChpbnQ2NF90KSBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICk7CisgICAgICAgIH0KKyAgICAgICAgeiA9ICggYVNpZzA8PHNoaWZ0Q291bnQgKSB8ICggYVNpZzE+PiggKCAtIHNoaWZ0Q291bnQgKSAmIDYzICkgKTsKKyAgICAgICAgaWYgKCAodWludDY0X3QpICggYVNpZzE8PHNoaWZ0Q291bnQgKSApIHsKKyAgICAgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCBhRXhwIDwgMHgzRkZGICkgeworICAgICAgICAgICAgaWYgKCBhRXhwIHwgYVNpZzAgfCBhU2lnMSApIHsKKyAgICAgICAgICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICB6ID0gYVNpZzA+PiggLSBzaGlmdENvdW50ICk7CisgICAgICAgIGlmICggICAgYVNpZzEKKyAgICAgICAgICAgICB8fCAoIHNoaWZ0Q291bnQgJiYgKHVpbnQ2NF90KSAoIGFTaWcwPDwoIHNoaWZ0Q291bnQgJiA2MyApICkgKSApIHsKKyAgICAgICAgICAgIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpIHw9IGZsb2F0X2ZsYWdfaW5leGFjdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGFTaWduICkgeiA9IC0gejsKKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3wgdmFsdWUgYGEnIHRvIHRoZSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZSBjb252ZXJzaW9uCit8IGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQKK3wgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQzMiBmbG9hdDEyOF90b19mbG9hdDMyKCBmbG9hdDEyOCBhIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbjsKKyAgICBpbnQzMiBhRXhwOworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMTsKKyAgICB1aW50MzJfdCB6U2lnOworCisgICAgYVNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApOworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnMCB8IGFTaWcxICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXQzMiggZmxvYXQxMjhUb0NvbW1vbk5hTiggYSBTVEFUVVNfVkFSICkgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQzMiggYVNpZ24sIDB4RkYsIDAgKTsKKyAgICB9CisgICAgYVNpZzAgfD0gKCBhU2lnMSAhPSAwICk7CisgICAgc2hpZnQ2NFJpZ2h0SmFtbWluZyggYVNpZzAsIDE4LCAmYVNpZzAgKTsKKyAgICB6U2lnID0gYVNpZzA7CisgICAgaWYgKCBhRXhwIHx8IHpTaWcgKSB7CisgICAgICAgIHpTaWcgfD0gMHg0MDAwMDAwMDsKKyAgICAgICAgYUV4cCAtPSAweDNGODE7CisgICAgfQorICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDMyKCBhU2lnbiwgYUV4cCwgelNpZyBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50Cit8IHZhbHVlIGBhJyB0byB0aGUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCBmb3JtYXQuICBUaGUgY29udmVyc2lvbgorfCBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50Cit8IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0NjQgZmxvYXQxMjhfdG9fZmxvYXQ2NCggZmxvYXQxMjggYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MzIgYUV4cDsKKyAgICB1aW50NjRfdCBhU2lnMCwgYVNpZzE7CisKKyAgICBhU2lnMSA9IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICk7CisgICAgYVNpZzAgPSBleHRyYWN0RmxvYXQxMjhGcmFjMCggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIGFTaWcwIHwgYVNpZzEgKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uTmFOVG9GbG9hdDY0KCBmbG9hdDEyOFRvQ29tbW9uTmFOKCBhIFNUQVRVU19WQVIgKSBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDY0KCBhU2lnbiwgMHg3RkYsIDAgKTsKKyAgICB9CisgICAgc2hvcnRTaGlmdDEyOExlZnQoIGFTaWcwLCBhU2lnMSwgMTQsICZhU2lnMCwgJmFTaWcxICk7CisgICAgYVNpZzAgfD0gKCBhU2lnMSAhPSAwICk7CisgICAgaWYgKCBhRXhwIHx8IGFTaWcwICkgeworICAgICAgICBhU2lnMCB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgICAgICAgIGFFeHAgLT0gMHgzQzAxOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQ2NCggYVNpZ24sIGFFeHAsIGFTaWcwIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3wgdmFsdWUgYGEnIHRvIHRoZSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IGZvcm1hdC4gIFRoZQorfCBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXR4ODAgZmxvYXQxMjhfdG9fZmxvYXR4ODAoIGZsb2F0MTI4IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHA7CisgICAgdWludDY0X3QgYVNpZzAsIGFTaWcxOworCisgICAgYVNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApOworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnMCB8IGFTaWcxICkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbk5hTlRvRmxvYXR4ODAoIGZsb2F0MTI4VG9Db21tb25OYU4oIGEgU1RBVFVTX1ZBUiApIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0eDgwKCBhU2lnbiwgMHg3RkZGLCBMSVQ2NCggMHg4MDAwMDAwMDAwMDAwMDAwICkgKTsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggKCBhU2lnMCB8IGFTaWcxICkgPT0gMCApIHJldHVybiBwYWNrRmxvYXR4ODAoIGFTaWduLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MTI4U3Vibm9ybWFsKCBhU2lnMCwgYVNpZzEsICZhRXhwLCAmYVNpZzAsICZhU2lnMSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYVNpZzAgfD0gTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApOworICAgIH0KKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCggYVNpZzAsIGFTaWcxLCAxNSwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXR4ODAoIDgwLCBhU2lnbiwgYUV4cCwgYVNpZzAsIGFTaWcxIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUm91bmRzIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyB0byBhbiBpbnRlZ2VyLCBhbmQKK3wgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEgcXVhZHJ1cGxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZS4gIFRoZQorfCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDEyOCBmbG9hdDEyOF9yb3VuZF90b19pbnQoIGZsb2F0MTI4IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHA7CisgICAgdWludDY0X3QgbGFzdEJpdE1hc2ssIHJvdW5kQml0c01hc2s7CisgICAgaW50OCByb3VuZGluZ01vZGU7CisgICAgZmxvYXQxMjggejsKKworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKTsKKyAgICBpZiAoIDB4NDAyRiA8PSBhRXhwICkgeworICAgICAgICBpZiAoIDB4NDA2RiA8PSBhRXhwICkgeworICAgICAgICAgICAgaWYgKCAgICAoIGFFeHAgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgICAgJiYgKCBleHRyYWN0RmxvYXQxMjhGcmFjMCggYSApIHwgZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKSApCisgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEJpdE1hc2sgPSAxOworICAgICAgICBsYXN0Qml0TWFzayA9ICggbGFzdEJpdE1hc2s8PCggMHg0MDZFIC0gYUV4cCApICk8PDE7CisgICAgICAgIHJvdW5kQml0c01hc2sgPSBsYXN0Qml0TWFzayAtIDE7CisgICAgICAgIHogPSBhOworICAgICAgICByb3VuZGluZ01vZGUgPSBTVEFUVVMoZmxvYXRfcm91bmRpbmdfbW9kZSk7CisgICAgICAgIGlmICggcm91bmRpbmdNb2RlID09IGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiApIHsKKyAgICAgICAgICAgIGlmICggbGFzdEJpdE1hc2sgKSB7CisgICAgICAgICAgICAgICAgYWRkMTI4KCB6LmhpZ2gsIHoubG93LCAwLCBsYXN0Qml0TWFzaz4+MSwgJnouaGlnaCwgJnoubG93ICk7CisgICAgICAgICAgICAgICAgaWYgKCAoIHoubG93ICYgcm91bmRCaXRzTWFzayApID09IDAgKSB6LmxvdyAmPSB+IGxhc3RCaXRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCAoaW50NjRfdCkgei5sb3cgPCAwICkgeworICAgICAgICAgICAgICAgICAgICArK3ouaGlnaDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAodWludDY0X3QpICggei5sb3c8PDEgKSA9PSAwICkgei5oaWdoICY9IH4xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggcm91bmRpbmdNb2RlICE9IGZsb2F0X3JvdW5kX3RvX3plcm8gKSB7CisgICAgICAgICAgICBpZiAoICAgZXh0cmFjdEZsb2F0MTI4U2lnbiggeiApCisgICAgICAgICAgICAgICAgIF4gKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfdXAgKSApIHsKKyAgICAgICAgICAgICAgICBhZGQxMjgoIHouaGlnaCwgei5sb3csIDAsIHJvdW5kQml0c01hc2ssICZ6LmhpZ2gsICZ6LmxvdyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHoubG93ICY9IH4gcm91bmRCaXRzTWFzazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYUV4cCA8IDB4M0ZGRiApIHsKKyAgICAgICAgICAgIGlmICggKCAoICh1aW50NjRfdCkgKCBhLmhpZ2g8PDEgKSApIHwgYS5sb3cgKSA9PSAwICkgcmV0dXJuIGE7CisgICAgICAgICAgICBTVEFUVVMoZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKSB8PSBmbG9hdF9mbGFnX2luZXhhY3Q7CisgICAgICAgICAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGEgKTsKKyAgICAgICAgICAgIHN3aXRjaCAoIFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKSApIHsKKyAgICAgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbjoKKyAgICAgICAgICAgICAgICBpZiAoICAgICggYUV4cCA9PSAweDNGRkUgKQorICAgICAgICAgICAgICAgICAgICAgJiYgKCAgIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkKKyAgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggYVNpZ24sIDB4M0ZGRiwgMCwgMCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX2Rvd246CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgYVNpZ24gPyBwYWNrRmxvYXQxMjgoIDEsIDB4M0ZGRiwgMCwgMCApCisgICAgICAgICAgICAgICAgICAgIDogcGFja0Zsb2F0MTI4KCAwLCAwLCAwLCAwICk7CisgICAgICAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF91cDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICBhU2lnbiA/IHBhY2tGbG9hdDEyOCggMSwgMCwgMCwgMCApCisgICAgICAgICAgICAgICAgICAgIDogcGFja0Zsb2F0MTI4KCAwLCAweDNGRkYsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYWNrRmxvYXQxMjgoIGFTaWduLCAwLCAwLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEJpdE1hc2sgPSAxOworICAgICAgICBsYXN0Qml0TWFzayA8PD0gMHg0MDJGIC0gYUV4cDsKKyAgICAgICAgcm91bmRCaXRzTWFzayA9IGxhc3RCaXRNYXNrIC0gMTsKKyAgICAgICAgei5sb3cgPSAwOworICAgICAgICB6LmhpZ2ggPSBhLmhpZ2g7CisgICAgICAgIHJvdW5kaW5nTW9kZSA9IFNUQVRVUyhmbG9hdF9yb3VuZGluZ19tb2RlKTsKKyAgICAgICAgaWYgKCByb3VuZGluZ01vZGUgPT0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuICkgeworICAgICAgICAgICAgei5oaWdoICs9IGxhc3RCaXRNYXNrPj4xOworICAgICAgICAgICAgaWYgKCAoICggei5oaWdoICYgcm91bmRCaXRzTWFzayApIHwgYS5sb3cgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHouaGlnaCAmPSB+IGxhc3RCaXRNYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCByb3VuZGluZ01vZGUgIT0gZmxvYXRfcm91bmRfdG9femVybyApIHsKKyAgICAgICAgICAgIGlmICggICBleHRyYWN0RmxvYXQxMjhTaWduKCB6ICkKKyAgICAgICAgICAgICAgICAgXiAoIHJvdW5kaW5nTW9kZSA9PSBmbG9hdF9yb3VuZF91cCApICkgeworICAgICAgICAgICAgICAgIHouaGlnaCB8PSAoIGEubG93ICE9IDAgKTsKKyAgICAgICAgICAgICAgICB6LmhpZ2ggKz0gcm91bmRCaXRzTWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB6LmhpZ2ggJj0gfiByb3VuZEJpdHNNYXNrOworICAgIH0KKyAgICBpZiAoICggei5sb3cgIT0gYS5sb3cgKSB8fCAoIHouaGlnaCAhPSBhLmhpZ2ggKSApIHsKKyAgICAgICAgU1RBVFVTKGZsb2F0X2V4Y2VwdGlvbl9mbGFncykgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIH0KKyAgICByZXR1cm4gejsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uCit8IGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJy4gIElmIGB6U2lnbicgaXMgMSwgdGhlIHN1bSBpcyBuZWdhdGVkCit8IGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IGlzIGEgTmFOLgorfCBUaGUgYWRkaXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeQorfCBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZmxvYXQxMjggYWRkRmxvYXQxMjhTaWdzKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiLCBmbGFnIHpTaWduIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQzMiBhRXhwLCBiRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMSwgYlNpZzAsIGJTaWcxLCB6U2lnMCwgelNpZzEsIHpTaWcyOworICAgIGludDMyIGV4cERpZmY7CisKKyAgICBhU2lnMSA9IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICk7CisgICAgYVNpZzAgPSBleHRyYWN0RmxvYXQxMjhGcmFjMCggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKTsKKyAgICBiU2lnMSA9IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBiICk7CisgICAgYlNpZzAgPSBleHRyYWN0RmxvYXQxMjhGcmFjMCggYiApOworICAgIGJFeHAgPSBleHRyYWN0RmxvYXQxMjhFeHAoIGIgKTsKKyAgICBleHBEaWZmID0gYUV4cCAtIGJFeHA7CisgICAgaWYgKCAwIDwgZXhwRGlmZiApIHsKKyAgICAgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgICAgIGlmICggYVNpZzAgfCBhU2lnMSApIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIC0tZXhwRGlmZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGJTaWcwIHw9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKTsKKyAgICAgICAgfQorICAgICAgICBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKAorICAgICAgICAgICAgYlNpZzAsIGJTaWcxLCAwLCBleHBEaWZmLCAmYlNpZzAsICZiU2lnMSwgJnpTaWcyICk7CisgICAgICAgIHpFeHAgPSBhRXhwOworICAgIH0KKyAgICBlbHNlIGlmICggZXhwRGlmZiA8IDAgKSB7CisgICAgICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoIGJTaWcwIHwgYlNpZzEgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggelNpZ24sIDB4N0ZGRiwgMCwgMCApOworICAgICAgICB9CisgICAgICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICAgICAgKytleHBEaWZmOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYVNpZzAgfD0gTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApOworICAgICAgICB9CisgICAgICAgIHNoaWZ0MTI4RXh0cmFSaWdodEphbW1pbmcoCisgICAgICAgICAgICBhU2lnMCwgYVNpZzEsIDAsIC0gZXhwRGlmZiwgJmFTaWcwLCAmYVNpZzEsICZ6U2lnMiApOworICAgICAgICB6RXhwID0gYkV4cDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgICAgICBpZiAoIGFTaWcwIHwgYVNpZzEgfCBiU2lnMCB8IGJTaWcxICkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgICAgICBhZGQxMjgoIGFTaWcwLCBhU2lnMSwgYlNpZzAsIGJTaWcxLCAmelNpZzAsICZ6U2lnMSApOworICAgICAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgICAgIGlmIChTVEFUVVMoZmx1c2hfdG9femVybykpIHsKKyAgICAgICAgICAgICAgICBpZiAoelNpZzAgfCB6U2lnMSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX291dHB1dF9kZW5vcm1hbCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCh6U2lnbiwgMCwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgMCwgelNpZzAsIHpTaWcxICk7CisgICAgICAgIH0KKyAgICAgICAgelNpZzIgPSAwOworICAgICAgICB6U2lnMCB8PSBMSVQ2NCggMHgwMDAyMDAwMDAwMDAwMDAwICk7CisgICAgICAgIHpFeHAgPSBhRXhwOworICAgICAgICBnb3RvIHNoaWZ0UmlnaHQxOworICAgIH0KKyAgICBhU2lnMCB8PSBMSVQ2NCggMHgwMDAxMDAwMDAwMDAwMDAwICk7CisgICAgYWRkMTI4KCBhU2lnMCwgYVNpZzEsIGJTaWcwLCBiU2lnMSwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICAtLXpFeHA7CisgICAgaWYgKCB6U2lnMCA8IExJVDY0KCAweDAwMDIwMDAwMDAwMDAwMDAgKSApIGdvdG8gcm91bmRBbmRQYWNrOworICAgICsrekV4cDsKKyBzaGlmdFJpZ2h0MToKKyAgICBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKAorICAgICAgICB6U2lnMCwgelNpZzEsIHpTaWcyLCAxLCAmelNpZzAsICZ6U2lnMSwgJnpTaWcyICk7Cisgcm91bmRBbmRQYWNrOgorICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDEyOCggelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSwgelNpZzIgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIGFic29sdXRlIHZhbHVlcyBvZiB0aGUgcXVhZHJ1cGxlLQorfCBwcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInLiAgSWYgYHpTaWduJyBpcyAxLCB0aGUKK3wgZGlmZmVyZW5jZSBpcyBuZWdhdGVkIGJlZm9yZSBiZWluZyByZXR1cm5lZC4gIGB6U2lnbicgaXMgaWdub3JlZCBpZiB0aGUKK3wgcmVzdWx0IGlzIGEgTmFOLiAgVGhlIHN1YnRyYWN0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGZsb2F0MTI4IHN1YkZsb2F0MTI4U2lncyggZmxvYXQxMjggYSwgZmxvYXQxMjggYiwgZmxhZyB6U2lnbiBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50MzIgYUV4cCwgYkV4cCwgekV4cDsKKyAgICB1aW50NjRfdCBhU2lnMCwgYVNpZzEsIGJTaWcwLCBiU2lnMSwgelNpZzAsIHpTaWcxOworICAgIGludDMyIGV4cERpZmY7CisgICAgZmxvYXQxMjggejsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGJTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKTsKKyAgICBiU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYiApOworICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCggYVNpZzAsIGFTaWcxLCAxNCwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCggYlNpZzAsIGJTaWcxLCAxNCwgJmJTaWcwLCAmYlNpZzEgKTsKKyAgICBpZiAoIDAgPCBleHBEaWZmICkgZ290byBhRXhwQmlnZ2VyOworICAgIGlmICggZXhwRGlmZiA8IDAgKSBnb3RvIGJFeHBCaWdnZXI7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnMCB8IGFTaWcxIHwgYlNpZzAgfCBiU2lnMSApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgei5sb3cgPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgIHouaGlnaCA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgIHJldHVybiB6OworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgYUV4cCA9IDE7CisgICAgICAgIGJFeHAgPSAxOworICAgIH0KKyAgICBpZiAoIGJTaWcwIDwgYVNpZzAgKSBnb3RvIGFCaWdnZXI7CisgICAgaWYgKCBhU2lnMCA8IGJTaWcwICkgZ290byBiQmlnZ2VyOworICAgIGlmICggYlNpZzEgPCBhU2lnMSApIGdvdG8gYUJpZ2dlcjsKKyAgICBpZiAoIGFTaWcxIDwgYlNpZzEgKSBnb3RvIGJCaWdnZXI7CisgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggU1RBVFVTKGZsb2F0X3JvdW5kaW5nX21vZGUpID09IGZsb2F0X3JvdW5kX2Rvd24sIDAsIDAsIDAgKTsKKyBiRXhwQmlnZ2VyOgorICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggYlNpZzAgfCBiU2lnMSApIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQxMjgoIHpTaWduIF4gMSwgMHg3RkZGLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICArK2V4cERpZmY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhU2lnMCB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgICAgfQorICAgIHNoaWZ0MTI4UmlnaHRKYW1taW5nKCBhU2lnMCwgYVNpZzEsIC0gZXhwRGlmZiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICBiU2lnMCB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgYkJpZ2dlcjoKKyAgICBzdWIxMjgoIGJTaWcwLCBiU2lnMSwgYVNpZzAsIGFTaWcxLCAmelNpZzAsICZ6U2lnMSApOworICAgIHpFeHAgPSBiRXhwOworICAgIHpTaWduIF49IDE7CisgICAgZ290byBub3JtYWxpemVSb3VuZEFuZFBhY2s7CisgYUV4cEJpZ2dlcjoKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIGFTaWcwIHwgYVNpZzEgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIC0tZXhwRGlmZjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJTaWcwIHw9IExJVDY0KCAweDQwMDAwMDAwMDAwMDAwMDAgKTsKKyAgICB9CisgICAgc2hpZnQxMjhSaWdodEphbW1pbmcoIGJTaWcwLCBiU2lnMSwgZXhwRGlmZiwgJmJTaWcwLCAmYlNpZzEgKTsKKyAgICBhU2lnMCB8PSBMSVQ2NCggMHg0MDAwMDAwMDAwMDAwMDAwICk7CisgYUJpZ2dlcjoKKyAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgYlNpZzAsIGJTaWcxLCAmelNpZzAsICZ6U2lnMSApOworICAgIHpFeHAgPSBhRXhwOworIG5vcm1hbGl6ZVJvdW5kQW5kUGFjazoKKyAgICAtLXpFeHA7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MTI4KCB6U2lnbiwgekV4cCAtIDE0LCB6U2lnMCwgelNpZzEgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcworfCBgYScgYW5kIGBiJy4gIFRoZSBvcGVyYXRpb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK3wgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitmbG9hdDEyOCBmbG9hdDEyOF9hZGQoIGZsb2F0MTI4IGEsIGZsb2F0MTI4IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYiApOworICAgIGlmICggYVNpZ24gPT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybiBhZGRGbG9hdDEyOFNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBzdWJGbG9hdDEyOFNpZ3MoIGEsIGIsIGFTaWduIFNUQVRVU19WQVIgKTsKKyAgICB9CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludAorfCB2YWx1ZXMgYGEnIGFuZCBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQxMjggZmxvYXQxMjhfc3ViKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduID09IGJTaWduICkgeworICAgICAgICByZXR1cm4gc3ViRmxvYXQxMjhTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gYWRkRmxvYXQxMjhTaWdzKCBhLCBiLCBhU2lnbiBTVEFUVVNfVkFSICk7CisgICAgfQorCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK3wgdmFsdWVzIGBhJyBhbmQgYGInLiAgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRQorfCBTdGFuZGFyZCBmb3IgQmluYXJ5IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MTI4IGZsb2F0MTI4X211bCggZmxvYXQxMjggYSwgZmxvYXQxMjggYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ24sIGJTaWduLCB6U2lnbjsKKyAgICBpbnQzMiBhRXhwLCBiRXhwLCB6RXhwOworICAgIHVpbnQ2NF90IGFTaWcwLCBhU2lnMSwgYlNpZzAsIGJTaWcxLCB6U2lnMCwgelNpZzEsIHpTaWcyLCB6U2lnMzsKKyAgICBmbG9hdDEyOCB6OworCisgICAgYVNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApOworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgYlNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYiApOworICAgIGJTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGIgKTsKKyAgICBiRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBiICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBiICk7CisgICAgelNpZ24gPSBhU2lnbiBeIGJTaWduOworICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggICAgKCBhU2lnMCB8IGFTaWcxICkKKyAgICAgICAgICAgICB8fCAoICggYkV4cCA9PSAweDdGRkYgKSAmJiAoIGJTaWcwIHwgYlNpZzEgKSApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MTI4TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICggYkV4cCB8IGJTaWcwIHwgYlNpZzEgKSA9PSAwICkgZ290byBpbnZhbGlkOworICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgMHg3RkZGLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggYlNpZzAgfCBiU2lnMSApIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIGlmICggKCBhRXhwIHwgYVNpZzAgfCBhU2lnMSApID09IDAgKSB7CisgaW52YWxpZDoKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgICAgICB6LmxvdyA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2xvdzsKKyAgICAgICAgICAgIHouaGlnaCA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2hpZ2g7CisgICAgICAgICAgICByZXR1cm4gejsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgMHg3RkZGLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoICggYVNpZzAgfCBhU2lnMSApID09IDAgKSByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgMCwgMCwgMCApOworICAgICAgICBub3JtYWxpemVGbG9hdDEyOFN1Ym5vcm1hbCggYVNpZzAsIGFTaWcxLCAmYUV4cCwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICB9CisgICAgaWYgKCBiRXhwID09IDAgKSB7CisgICAgICAgIGlmICggKCBiU2lnMCB8IGJTaWcxICkgPT0gMCApIHJldHVybiBwYWNrRmxvYXQxMjgoIHpTaWduLCAwLCAwLCAwICk7CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MTI4U3Vibm9ybWFsKCBiU2lnMCwgYlNpZzEsICZiRXhwLCAmYlNpZzAsICZiU2lnMSApOworICAgIH0KKyAgICB6RXhwID0gYUV4cCArIGJFeHAgLSAweDQwMDA7CisgICAgYVNpZzAgfD0gTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApOworICAgIHNob3J0U2hpZnQxMjhMZWZ0KCBiU2lnMCwgYlNpZzEsIDE2LCAmYlNpZzAsICZiU2lnMSApOworICAgIG11bDEyOFRvMjU2KCBhU2lnMCwgYVNpZzEsIGJTaWcwLCBiU2lnMSwgJnpTaWcwLCAmelNpZzEsICZ6U2lnMiwgJnpTaWczICk7CisgICAgYWRkMTI4KCB6U2lnMCwgelNpZzEsIGFTaWcwLCBhU2lnMSwgJnpTaWcwLCAmelNpZzEgKTsKKyAgICB6U2lnMiB8PSAoIHpTaWczICE9IDAgKTsKKyAgICBpZiAoIExJVDY0KCAweDAwMDIwMDAwMDAwMDAwMDAgKSA8PSB6U2lnMCApIHsKKyAgICAgICAgc2hpZnQxMjhFeHRyYVJpZ2h0SmFtbWluZygKKyAgICAgICAgICAgIHpTaWcwLCB6U2lnMSwgelNpZzIsIDEsICZ6U2lnMCwgJnpTaWcxLCAmelNpZzIgKTsKKyAgICAgICAgKyt6RXhwOworICAgIH0KKyAgICByZXR1cm4gcm91bmRBbmRQYWNrRmxvYXQxMjgoIHpTaWduLCB6RXhwLCB6U2lnMCwgelNpZzEsIHpTaWcyIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlCit8IGBhJyBieSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8KK3wgdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQxMjggZmxvYXQxMjhfZGl2KCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ24sIHpTaWduOworICAgIGludDMyIGFFeHAsIGJFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZzAsIGFTaWcxLCBiU2lnMCwgYlNpZzEsIHpTaWcwLCB6U2lnMSwgelNpZzI7CisgICAgdWludDY0X3QgcmVtMCwgcmVtMSwgcmVtMiwgcmVtMywgdGVybTAsIHRlcm0xLCB0ZXJtMiwgdGVybTM7CisgICAgZmxvYXQxMjggejsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGJTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKTsKKyAgICBiU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYiApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYiApOworICAgIHpTaWduID0gYVNpZ24gXiBiU2lnbjsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIGFTaWcwIHwgYVNpZzEgKSByZXR1cm4gcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGEsIGIgU1RBVFVTX1ZBUiApOworICAgICAgICBpZiAoIGJFeHAgPT0gMHg3RkZGICkgeworICAgICAgICAgICAgaWYgKCBiU2lnMCB8IGJTaWcxICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MTI4TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFja0Zsb2F0MTI4KCB6U2lnbiwgMHg3RkZGLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggYlNpZzAgfCBiU2lnMSApIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBwYWNrRmxvYXQxMjgoIHpTaWduLCAwLCAwLCAwICk7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAwICkgeworICAgICAgICBpZiAoICggYlNpZzAgfCBiU2lnMSApID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICggYUV4cCB8IGFTaWcwIHwgYVNpZzEgKSA9PSAwICkgeworIGludmFsaWQ6CisgICAgICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgICAgICAgICB6LmxvdyA9IGZsb2F0MTI4X2RlZmF1bHRfbmFuX2xvdzsKKyAgICAgICAgICAgICAgICB6LmhpZ2ggPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICAgICAgICAgIHJldHVybiB6OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfZGl2Ynl6ZXJvIFNUQVRVU19WQVIpOworICAgICAgICAgICAgcmV0dXJuIHBhY2tGbG9hdDEyOCggelNpZ24sIDB4N0ZGRiwgMCwgMCApOworICAgICAgICB9CisgICAgICAgIG5vcm1hbGl6ZUZsb2F0MTI4U3Vibm9ybWFsKCBiU2lnMCwgYlNpZzEsICZiRXhwLCAmYlNpZzAsICZiU2lnMSApOworICAgIH0KKyAgICBpZiAoIGFFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCAoIGFTaWcwIHwgYVNpZzEgKSA9PSAwICkgcmV0dXJuIHBhY2tGbG9hdDEyOCggelNpZ24sIDAsIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQxMjhTdWJub3JtYWwoIGFTaWcwLCBhU2lnMSwgJmFFeHAsICZhU2lnMCwgJmFTaWcxICk7CisgICAgfQorICAgIHpFeHAgPSBhRXhwIC0gYkV4cCArIDB4M0ZGRDsKKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCgKKyAgICAgICAgYVNpZzAgfCBMSVQ2NCggMHgwMDAxMDAwMDAwMDAwMDAwICksIGFTaWcxLCAxNSwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICBzaG9ydFNoaWZ0MTI4TGVmdCgKKyAgICAgICAgYlNpZzAgfCBMSVQ2NCggMHgwMDAxMDAwMDAwMDAwMDAwICksIGJTaWcxLCAxNSwgJmJTaWcwLCAmYlNpZzEgKTsKKyAgICBpZiAoIGxlMTI4KCBiU2lnMCwgYlNpZzEsIGFTaWcwLCBhU2lnMSApICkgeworICAgICAgICBzaGlmdDEyOFJpZ2h0KCBhU2lnMCwgYVNpZzEsIDEsICZhU2lnMCwgJmFTaWcxICk7CisgICAgICAgICsrekV4cDsKKyAgICB9CisgICAgelNpZzAgPSBlc3RpbWF0ZURpdjEyOFRvNjQoIGFTaWcwLCBhU2lnMSwgYlNpZzAgKTsKKyAgICBtdWwxMjhCeTY0VG8xOTIoIGJTaWcwLCBiU2lnMSwgelNpZzAsICZ0ZXJtMCwgJnRlcm0xLCAmdGVybTIgKTsKKyAgICBzdWIxOTIoIGFTaWcwLCBhU2lnMSwgMCwgdGVybTAsIHRlcm0xLCB0ZXJtMiwgJnJlbTAsICZyZW0xLCAmcmVtMiApOworICAgIHdoaWxlICggKGludDY0X3QpIHJlbTAgPCAwICkgeworICAgICAgICAtLXpTaWcwOworICAgICAgICBhZGQxOTIoIHJlbTAsIHJlbTEsIHJlbTIsIDAsIGJTaWcwLCBiU2lnMSwgJnJlbTAsICZyZW0xLCAmcmVtMiApOworICAgIH0KKyAgICB6U2lnMSA9IGVzdGltYXRlRGl2MTI4VG82NCggcmVtMSwgcmVtMiwgYlNpZzAgKTsKKyAgICBpZiAoICggelNpZzEgJiAweDNGRkYgKSA8PSA0ICkgeworICAgICAgICBtdWwxMjhCeTY0VG8xOTIoIGJTaWcwLCBiU2lnMSwgelNpZzEsICZ0ZXJtMSwgJnRlcm0yLCAmdGVybTMgKTsKKyAgICAgICAgc3ViMTkyKCByZW0xLCByZW0yLCAwLCB0ZXJtMSwgdGVybTIsIHRlcm0zLCAmcmVtMSwgJnJlbTIsICZyZW0zICk7CisgICAgICAgIHdoaWxlICggKGludDY0X3QpIHJlbTEgPCAwICkgeworICAgICAgICAgICAgLS16U2lnMTsKKyAgICAgICAgICAgIGFkZDE5MiggcmVtMSwgcmVtMiwgcmVtMywgMCwgYlNpZzAsIGJTaWcxLCAmcmVtMSwgJnJlbTIsICZyZW0zICk7CisgICAgICAgIH0KKyAgICAgICAgelNpZzEgfD0gKCAoIHJlbTEgfCByZW0yIHwgcmVtMyApICE9IDAgKTsKKyAgICB9CisgICAgc2hpZnQxMjhFeHRyYVJpZ2h0SmFtbWluZyggelNpZzAsIHpTaWcxLCAwLCAxNSwgJnpTaWcwLCAmelNpZzEsICZ6U2lnMiApOworICAgIHJldHVybiByb3VuZEFuZFBhY2tGbG9hdDEyOCggelNpZ24sIHpFeHAsIHpTaWcwLCB6U2lnMSwgelNpZzIgU1RBVFVTX1ZBUiApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnCit8IHdpdGggcmVzcGVjdCB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicuICBUaGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworZmxvYXQxMjggZmxvYXQxMjhfcmVtKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgelNpZ247CisgICAgaW50MzIgYUV4cCwgYkV4cCwgZXhwRGlmZjsKKyAgICB1aW50NjRfdCBhU2lnMCwgYVNpZzEsIGJTaWcwLCBiU2lnMSwgcSwgdGVybTAsIHRlcm0xLCB0ZXJtMjsKKyAgICB1aW50NjRfdCBhbGxaZXJvLCBhbHRlcm5hdGVBU2lnMCwgYWx0ZXJuYXRlQVNpZzEsIHNpZ01lYW4xOworICAgIGludDY0X3Qgc2lnTWVhbjA7CisgICAgZmxvYXQxMjggejsKKworICAgIGFTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKTsKKyAgICBhU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGJTaWcxID0gZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKTsKKyAgICBiU2lnMCA9IGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBiICk7CisgICAgYkV4cCA9IGV4dHJhY3RGbG9hdDEyOEV4cCggYiApOworICAgIGlmICggYUV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggICAgKCBhU2lnMCB8IGFTaWcxICkKKyAgICAgICAgICAgICB8fCAoICggYkV4cCA9PSAweDdGRkYgKSAmJiAoIGJTaWcwIHwgYlNpZzEgKSApICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MTI4TmFOKCBhLCBiIFNUQVRVU19WQVIgKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgfQorICAgIGlmICggYkV4cCA9PSAweDdGRkYgKSB7CisgICAgICAgIGlmICggYlNpZzAgfCBiU2lnMSApIHJldHVybiBwcm9wYWdhdGVGbG9hdDEyOE5hTiggYSwgYiBTVEFUVVNfVkFSICk7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGJFeHAgPT0gMCApIHsKKyAgICAgICAgaWYgKCAoIGJTaWcwIHwgYlNpZzEgKSA9PSAwICkgeworIGludmFsaWQ6CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICAgICAgei5sb3cgPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9sb3c7CisgICAgICAgICAgICB6LmhpZ2ggPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICAgICAgcmV0dXJuIHo7CisgICAgICAgIH0KKyAgICAgICAgbm9ybWFsaXplRmxvYXQxMjhTdWJub3JtYWwoIGJTaWcwLCBiU2lnMSwgJmJFeHAsICZiU2lnMCwgJmJTaWcxICk7CisgICAgfQorICAgIGlmICggYUV4cCA9PSAwICkgeworICAgICAgICBpZiAoICggYVNpZzAgfCBhU2lnMSApID09IDAgKSByZXR1cm4gYTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQxMjhTdWJub3JtYWwoIGFTaWcwLCBhU2lnMSwgJmFFeHAsICZhU2lnMCwgJmFTaWcxICk7CisgICAgfQorICAgIGV4cERpZmYgPSBhRXhwIC0gYkV4cDsKKyAgICBpZiAoIGV4cERpZmYgPCAtMSApIHJldHVybiBhOworICAgIHNob3J0U2hpZnQxMjhMZWZ0KAorICAgICAgICBhU2lnMCB8IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKSwKKyAgICAgICAgYVNpZzEsCisgICAgICAgIDE1IC0gKCBleHBEaWZmIDwgMCApLAorICAgICAgICAmYVNpZzAsCisgICAgICAgICZhU2lnMQorICAgICk7CisgICAgc2hvcnRTaGlmdDEyOExlZnQoCisgICAgICAgIGJTaWcwIHwgTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApLCBiU2lnMSwgMTUsICZiU2lnMCwgJmJTaWcxICk7CisgICAgcSA9IGxlMTI4KCBiU2lnMCwgYlNpZzEsIGFTaWcwLCBhU2lnMSApOworICAgIGlmICggcSApIHN1YjEyOCggYVNpZzAsIGFTaWcxLCBiU2lnMCwgYlNpZzEsICZhU2lnMCwgJmFTaWcxICk7CisgICAgZXhwRGlmZiAtPSA2NDsKKyAgICB3aGlsZSAoIDAgPCBleHBEaWZmICkgeworICAgICAgICBxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnMCwgYVNpZzEsIGJTaWcwICk7CisgICAgICAgIHEgPSAoIDQgPCBxICkgPyBxIC0gNCA6IDA7CisgICAgICAgIG11bDEyOEJ5NjRUbzE5MiggYlNpZzAsIGJTaWcxLCBxLCAmdGVybTAsICZ0ZXJtMSwgJnRlcm0yICk7CisgICAgICAgIHNob3J0U2hpZnQxOTJMZWZ0KCB0ZXJtMCwgdGVybTEsIHRlcm0yLCA2MSwgJnRlcm0xLCAmdGVybTIsICZhbGxaZXJvICk7CisgICAgICAgIHNob3J0U2hpZnQxMjhMZWZ0KCBhU2lnMCwgYVNpZzEsIDYxLCAmYVNpZzAsICZhbGxaZXJvICk7CisgICAgICAgIHN1YjEyOCggYVNpZzAsIDAsIHRlcm0xLCB0ZXJtMiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgZXhwRGlmZiAtPSA2MTsKKyAgICB9CisgICAgaWYgKCAtNjQgPCBleHBEaWZmICkgeworICAgICAgICBxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnMCwgYVNpZzEsIGJTaWcwICk7CisgICAgICAgIHEgPSAoIDQgPCBxICkgPyBxIC0gNCA6IDA7CisgICAgICAgIHEgPj49IC0gZXhwRGlmZjsKKyAgICAgICAgc2hpZnQxMjhSaWdodCggYlNpZzAsIGJTaWcxLCAxMiwgJmJTaWcwLCAmYlNpZzEgKTsKKyAgICAgICAgZXhwRGlmZiArPSA1MjsKKyAgICAgICAgaWYgKCBleHBEaWZmIDwgMCApIHsKKyAgICAgICAgICAgIHNoaWZ0MTI4UmlnaHQoIGFTaWcwLCBhU2lnMSwgLSBleHBEaWZmLCAmYVNpZzAsICZhU2lnMSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIGFTaWcwLCBhU2lnMSwgZXhwRGlmZiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgfQorICAgICAgICBtdWwxMjhCeTY0VG8xOTIoIGJTaWcwLCBiU2lnMSwgcSwgJnRlcm0wLCAmdGVybTEsICZ0ZXJtMiApOworICAgICAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgdGVybTEsIHRlcm0yLCAmYVNpZzAsICZhU2lnMSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2hpZnQxMjhSaWdodCggYVNpZzAsIGFTaWcxLCAxMiwgJmFTaWcwLCAmYVNpZzEgKTsKKyAgICAgICAgc2hpZnQxMjhSaWdodCggYlNpZzAsIGJTaWcxLCAxMiwgJmJTaWcwLCAmYlNpZzEgKTsKKyAgICB9CisgICAgZG8geworICAgICAgICBhbHRlcm5hdGVBU2lnMCA9IGFTaWcwOworICAgICAgICBhbHRlcm5hdGVBU2lnMSA9IGFTaWcxOworICAgICAgICArK3E7CisgICAgICAgIHN1YjEyOCggYVNpZzAsIGFTaWcxLCBiU2lnMCwgYlNpZzEsICZhU2lnMCwgJmFTaWcxICk7CisgICAgfSB3aGlsZSAoIDAgPD0gKGludDY0X3QpIGFTaWcwICk7CisgICAgYWRkMTI4KAorICAgICAgICBhU2lnMCwgYVNpZzEsIGFsdGVybmF0ZUFTaWcwLCBhbHRlcm5hdGVBU2lnMSwgKHVpbnQ2NF90ICopJnNpZ01lYW4wLCAmc2lnTWVhbjEgKTsKKyAgICBpZiAoICAgICggc2lnTWVhbjAgPCAwICkKKyAgICAgICAgIHx8ICggKCAoIHNpZ01lYW4wIHwgc2lnTWVhbjEgKSA9PSAwICkgJiYgKCBxICYgMSApICkgKSB7CisgICAgICAgIGFTaWcwID0gYWx0ZXJuYXRlQVNpZzA7CisgICAgICAgIGFTaWcxID0gYWx0ZXJuYXRlQVNpZzE7CisgICAgfQorICAgIHpTaWduID0gKCAoaW50NjRfdCkgYVNpZzAgPCAwICk7CisgICAgaWYgKCB6U2lnbiApIHN1YjEyOCggMCwgMCwgYVNpZzAsIGFTaWcxLCAmYVNpZzAsICZhU2lnMSApOworICAgIHJldHVybgorICAgICAgICBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdDEyOCggYVNpZ24gXiB6U2lnbiwgYkV4cCAtIDQsIGFTaWcwLCBhU2lnMSBTVEFUVVNfVkFSICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJy4KK3wgVGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgYWNjb3JkaW5nIHRvIHRoZSBJRUMvSUVFRSBTdGFuZGFyZCBmb3IgQmluYXJ5Cit8IEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2Zsb2F0MTI4IGZsb2F0MTI4X3NxcnQoIGZsb2F0MTI4IGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyIGFFeHAsIHpFeHA7CisgICAgdWludDY0X3QgYVNpZzAsIGFTaWcxLCB6U2lnMCwgelNpZzEsIHpTaWcyLCBkb3VibGVaU2lnMDsKKyAgICB1aW50NjRfdCByZW0wLCByZW0xLCByZW0yLCByZW0zLCB0ZXJtMCwgdGVybTEsIHRlcm0yLCB0ZXJtMzsKKyAgICBmbG9hdDEyOCB6OworCisgICAgYVNpZzEgPSBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApOworICAgIGFTaWcwID0gZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0MTI4RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgaWYgKCBhRXhwID09IDB4N0ZGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnMCB8IGFTaWcxICkgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MTI4TmFOKCBhLCBhIFNUQVRVU19WQVIgKTsKKyAgICAgICAgaWYgKCAhIGFTaWduICkgcmV0dXJuIGE7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisgICAgaWYgKCBhU2lnbiApIHsKKyAgICAgICAgaWYgKCAoIGFFeHAgfCBhU2lnMCB8IGFTaWcxICkgPT0gMCApIHJldHVybiBhOworIGludmFsaWQ6CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHoubG93ID0gZmxvYXQxMjhfZGVmYXVsdF9uYW5fbG93OworICAgICAgICB6LmhpZ2ggPSBmbG9hdDEyOF9kZWZhdWx0X25hbl9oaWdoOworICAgICAgICByZXR1cm4gejsKKyAgICB9CisgICAgaWYgKCBhRXhwID09IDAgKSB7CisgICAgICAgIGlmICggKCBhU2lnMCB8IGFTaWcxICkgPT0gMCApIHJldHVybiBwYWNrRmxvYXQxMjgoIDAsIDAsIDAsIDAgKTsKKyAgICAgICAgbm9ybWFsaXplRmxvYXQxMjhTdWJub3JtYWwoIGFTaWcwLCBhU2lnMSwgJmFFeHAsICZhU2lnMCwgJmFTaWcxICk7CisgICAgfQorICAgIHpFeHAgPSAoICggYUV4cCAtIDB4M0ZGRiApPj4xICkgKyAweDNGRkU7CisgICAgYVNpZzAgfD0gTElUNjQoIDB4MDAwMTAwMDAwMDAwMDAwMCApOworICAgIHpTaWcwID0gZXN0aW1hdGVTcXJ0MzIoIGFFeHAsIGFTaWcwPj4xNyApOworICAgIHNob3J0U2hpZnQxMjhMZWZ0KCBhU2lnMCwgYVNpZzEsIDEzIC0gKCBhRXhwICYgMSApLCAmYVNpZzAsICZhU2lnMSApOworICAgIHpTaWcwID0gZXN0aW1hdGVEaXYxMjhUbzY0KCBhU2lnMCwgYVNpZzEsIHpTaWcwPDwzMiApICsgKCB6U2lnMDw8MzAgKTsKKyAgICBkb3VibGVaU2lnMCA9IHpTaWcwPDwxOworICAgIG11bDY0VG8xMjgoIHpTaWcwLCB6U2lnMCwgJnRlcm0wLCAmdGVybTEgKTsKKyAgICBzdWIxMjgoIGFTaWcwLCBhU2lnMSwgdGVybTAsIHRlcm0xLCAmcmVtMCwgJnJlbTEgKTsKKyAgICB3aGlsZSAoIChpbnQ2NF90KSByZW0wIDwgMCApIHsKKyAgICAgICAgLS16U2lnMDsKKyAgICAgICAgZG91YmxlWlNpZzAgLT0gMjsKKyAgICAgICAgYWRkMTI4KCByZW0wLCByZW0xLCB6U2lnMD4+NjMsIGRvdWJsZVpTaWcwIHwgMSwgJnJlbTAsICZyZW0xICk7CisgICAgfQorICAgIHpTaWcxID0gZXN0aW1hdGVEaXYxMjhUbzY0KCByZW0xLCAwLCBkb3VibGVaU2lnMCApOworICAgIGlmICggKCB6U2lnMSAmIDB4MUZGRiApIDw9IDUgKSB7CisgICAgICAgIGlmICggelNpZzEgPT0gMCApIHpTaWcxID0gMTsKKyAgICAgICAgbXVsNjRUbzEyOCggZG91YmxlWlNpZzAsIHpTaWcxLCAmdGVybTEsICZ0ZXJtMiApOworICAgICAgICBzdWIxMjgoIHJlbTEsIDAsIHRlcm0xLCB0ZXJtMiwgJnJlbTEsICZyZW0yICk7CisgICAgICAgIG11bDY0VG8xMjgoIHpTaWcxLCB6U2lnMSwgJnRlcm0yLCAmdGVybTMgKTsKKyAgICAgICAgc3ViMTkyKCByZW0xLCByZW0yLCAwLCAwLCB0ZXJtMiwgdGVybTMsICZyZW0xLCAmcmVtMiwgJnJlbTMgKTsKKyAgICAgICAgd2hpbGUgKCAoaW50NjRfdCkgcmVtMSA8IDAgKSB7CisgICAgICAgICAgICAtLXpTaWcxOworICAgICAgICAgICAgc2hvcnRTaGlmdDEyOExlZnQoIDAsIHpTaWcxLCAxLCAmdGVybTIsICZ0ZXJtMyApOworICAgICAgICAgICAgdGVybTMgfD0gMTsKKyAgICAgICAgICAgIHRlcm0yIHw9IGRvdWJsZVpTaWcwOworICAgICAgICAgICAgYWRkMTkyKCByZW0xLCByZW0yLCByZW0zLCAwLCB0ZXJtMiwgdGVybTMsICZyZW0xLCAmcmVtMiwgJnJlbTMgKTsKKyAgICAgICAgfQorICAgICAgICB6U2lnMSB8PSAoICggcmVtMSB8IHJlbTIgfCByZW0zICkgIT0gMCApOworICAgIH0KKyAgICBzaGlmdDEyOEV4dHJhUmlnaHRKYW1taW5nKCB6U2lnMCwgelNpZzEsIDAsIDE0LCAmelNpZzAsICZ6U2lnMSwgJnpTaWcyICk7CisgICAgcmV0dXJuIHJvdW5kQW5kUGFja0Zsb2F0MTI4KCAwLCB6RXhwLCB6U2lnMCwgelNpZzEsIHpTaWcyIFNUQVRVU19WQVIgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBlcXVhbCB0bworfCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBgYicsIGFuZCAwIG90aGVyd2lzZS4gIFRoZSBpbnZhbGlkIGV4Y2VwdGlvbiBpcworfCByYWlzZWQgaWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZAorfCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTI4X2VxKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGIgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBiICkgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBhLmxvdyA9PSBiLmxvdyApCisgICAgICAgICYmICggICAgKCBhLmhpZ2ggPT0gYi5oaWdoICkKKyAgICAgICAgICAgICB8fCAoICAgICggYS5sb3cgPT0gMCApCisgICAgICAgICAgICAgICAgICAmJiAoICh1aW50NjRfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgPT0gMCApICkKKyAgICAgICAgICAgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBUaGUgaW52YWxpZAorfCBleGNlcHRpb24gaXMgcmFpc2VkIGlmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkCit8IGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQxMjhfbGUoIGZsb2F0MTI4IGEsIGZsb2F0MTI4IGIgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICkgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0MTI4RXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKCBleHRyYWN0RmxvYXQxMjhGcmFjMCggYiApIHwgZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKSApICkKKyAgICAgICApIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYSApOworICAgIGJTaWduID0gZXh0cmFjdEZsb2F0MTI4U2lnbiggYiApOworICAgIGlmICggYVNpZ24gIT0gYlNpZ24gKSB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgYVNpZ24KKyAgICAgICAgICAgIHx8ICggICAgKCAoICh1aW50NjRfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgKSB8IGEubG93IHwgYi5sb3cgKQorICAgICAgICAgICAgICAgICA9PSAwICk7CisgICAgfQorICAgIHJldHVybgorICAgICAgICAgIGFTaWduID8gbGUxMjgoIGIuaGlnaCwgYi5sb3csIGEuaGlnaCwgYS5sb3cgKQorICAgICAgICA6IGxlMTI4KCBhLmhpZ2gsIGEubG93LCBiLmhpZ2gsIGIubG93ICk7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJldHVybnMgMSBpZiB0aGUgcXVhZHJ1cGxlLXByZWNpc2lvbiBmbG9hdGluZy1wb2ludCB2YWx1ZSBgYScgaXMgbGVzcyB0aGFuCit8IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzCit8IHJhaXNlZCBpZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTi4gIFRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcKK3wgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTI4X2x0KCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGIgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBiICkgKSApCisgICAgICAgKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgIGFTaWduCisgICAgICAgICAgICAmJiAoICAgICggKCAodWludDY0X3QpICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApICkgfCBhLmxvdyB8IGIubG93ICkKKyAgICAgICAgICAgICAgICAgIT0gMCApOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICBhU2lnbiA/IGx0MTI4KCBiLmhpZ2gsIGIubG93LCBhLmhpZ2gsIGEubG93ICkKKyAgICAgICAgOiBsdDEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWVzIGBhJyBhbmQgYGInIGNhbm5vdAorfCBiZSBjb21wYXJlZCwgYW5kIDAgb3RoZXJ3aXNlLiAgVGhlIGludmFsaWQgZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiBlaXRoZXIKK3wgb3BlcmFuZCBpcyBhIE5hTi4gVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUKK3wgU3RhbmRhcmQgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQxMjhfdW5vcmRlcmVkKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgaWYgKCAgICAoICAgICggZXh0cmFjdEZsb2F0MTI4RXhwKCBhICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKCBleHRyYWN0RmxvYXQxMjhGcmFjMCggYSApIHwgZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGEgKSApICkKKyAgICAgICAgIHx8ICggICAgKCBleHRyYWN0RmxvYXQxMjhFeHAoIGIgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBiICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYiApICkgKQorICAgICAgICkgeworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBSZXR1cm5zIDEgaWYgdGhlIHF1YWRydXBsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgdmFsdWUgYGEnIGlzIGVxdWFsIHRvCit8IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGBiJywgYW5kIDAgb3RoZXJ3aXNlLiAgUXVpZXQgTmFOcyBkbyBub3QgY2F1c2UgYW4KK3wgZXhjZXB0aW9uLiAgVGhlIGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIGFjY29yZGluZyB0byB0aGUgSUVDL0lFRUUgU3RhbmRhcmQKK3wgZm9yIEJpbmFyeSBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgZmxvYXQxMjhfZXFfcXVpZXQoIGZsb2F0MTI4IGEsIGZsb2F0MTI4IGIgU1RBVFVTX1BBUkFNICkKK3sKKworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICkgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0MTI4RXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKCBleHRyYWN0RmxvYXQxMjhGcmFjMCggYiApIHwgZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4KKyAgICAgICAgICAgKCBhLmxvdyA9PSBiLmxvdyApCisgICAgICAgICYmICggICAgKCBhLmhpZ2ggPT0gYi5oaWdoICkKKyAgICAgICAgICAgICB8fCAoICAgICggYS5sb3cgPT0gMCApCisgICAgICAgICAgICAgICAgICAmJiAoICh1aW50NjRfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApPDwxICkgPT0gMCApICkKKyAgICAgICAgICAgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgb3IgZXF1YWwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdAorfCBjYXVzZSBhbiBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlCit8IElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTI4X2xlX3F1aWV0KCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGIgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBiICkgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggICAgZmxvYXQxMjhfaXNfc2lnbmFsaW5nX25hbiggYSApCisgICAgICAgICAgICAgfHwgZmxvYXQxMjhfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICBhU2lnbgorICAgICAgICAgICAgfHwgKCAgICAoICggKHVpbnQ2NF90KSAoICggYS5oaWdoIHwgYi5oaWdoICk8PDEgKSApIHwgYS5sb3cgfCBiLmxvdyApCisgICAgICAgICAgICAgICAgID09IDAgKTsKKyAgICB9CisgICAgcmV0dXJuCisgICAgICAgICAgYVNpZ24gPyBsZTEyOCggYi5oaWdoLCBiLmxvdywgYS5oaWdoLCBhLmxvdyApCisgICAgICAgIDogbGUxMjgoIGEuaGlnaCwgYS5sb3csIGIuaGlnaCwgYi5sb3cgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlIGBhJyBpcyBsZXNzIHRoYW4KK3wgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgYGInLCBhbmQgMCBvdGhlcndpc2UuICBRdWlldCBOYU5zIGRvIG5vdCBjYXVzZSBhbgorfCBleGNlcHRpb24uICBPdGhlcndpc2UsIHRoZSBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFCit8IFN0YW5kYXJkIGZvciBCaW5hcnkgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTI4X2x0X3F1aWV0KCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgZmxhZyBhU2lnbiwgYlNpZ247CisKKyAgICBpZiAoICAgICggICAgKCBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKSA9PSAweDdGRkYgKQorICAgICAgICAgICAgICAmJiAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkgKQorICAgICAgICAgfHwgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYiApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGIgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBiICkgKSApCisgICAgICAgKSB7CisgICAgICAgIGlmICggICAgZmxvYXQxMjhfaXNfc2lnbmFsaW5nX25hbiggYSApCisgICAgICAgICAgICAgfHwgZmxvYXQxMjhfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICBhU2lnbgorICAgICAgICAgICAgJiYgKCAgICAoICggKHVpbnQ2NF90KSAoICggYS5oaWdoIHwgYi5oaWdoICk8PDEgKSApIHwgYS5sb3cgfCBiLmxvdyApCisgICAgICAgICAgICAgICAgICE9IDAgKTsKKyAgICB9CisgICAgcmV0dXJuCisgICAgICAgICAgYVNpZ24gPyBsdDEyOCggYi5oaWdoLCBiLmxvdywgYS5oaWdoLCBhLmxvdyApCisgICAgICAgIDogbHQxMjgoIGEuaGlnaCwgYS5sb3csIGIuaGlnaCwgYi5sb3cgKTsKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgUmV0dXJucyAxIGlmIHRoZSBxdWFkcnVwbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBgYScgYW5kIGBiJyBjYW5ub3QKK3wgYmUgY29tcGFyZWQsIGFuZCAwIG90aGVyd2lzZS4gIFF1aWV0IE5hTnMgZG8gbm90IGNhdXNlIGFuIGV4Y2VwdGlvbi4gIFRoZQorfCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBhY2NvcmRpbmcgdG8gdGhlIElFQy9JRUVFIFN0YW5kYXJkIGZvciBCaW5hcnkKK3wgRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGZsb2F0MTI4X3Vub3JkZXJlZF9xdWlldCggZmxvYXQxMjggYSwgZmxvYXQxMjggYiBTVEFUVVNfUEFSQU0gKQoreworICAgIGlmICggICAgKCAgICAoIGV4dHJhY3RGbG9hdDEyOEV4cCggYSApID09IDB4N0ZGRiApCisgICAgICAgICAgICAgICYmICggZXh0cmFjdEZsb2F0MTI4RnJhYzAoIGEgKSB8IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICkgKSApCisgICAgICAgICB8fCAoICAgICggZXh0cmFjdEZsb2F0MTI4RXhwKCBiICkgPT0gMHg3RkZGICkKKyAgICAgICAgICAgICAgJiYgKCBleHRyYWN0RmxvYXQxMjhGcmFjMCggYiApIHwgZXh0cmFjdEZsb2F0MTI4RnJhYzEoIGIgKSApICkKKyAgICAgICApIHsKKyAgICAgICAgaWYgKCAgICBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBhICkKKyAgICAgICAgICAgICB8fCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogbWlzYyBmdW5jdGlvbnMgKi8KK2Zsb2F0MzIgdWludDMyX3RvX2Zsb2F0MzIoIHVpbnQzMiBhIFNUQVRVU19QQVJBTSApCit7CisgICAgcmV0dXJuIGludDY0X3RvX2Zsb2F0MzIoYSBTVEFUVVNfVkFSKTsKK30KKworZmxvYXQ2NCB1aW50MzJfdG9fZmxvYXQ2NCggdWludDMyIGEgU1RBVFVTX1BBUkFNICkKK3sKKyAgICByZXR1cm4gaW50NjRfdG9fZmxvYXQ2NChhIFNUQVRVU19WQVIpOworfQorCit1aW50MzIgZmxvYXQzMl90b191aW50MzIoIGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGludDY0X3QgdjsKKyAgICB1aW50MzIgcmVzOworCisgICAgdiA9IGZsb2F0MzJfdG9faW50NjQoYSBTVEFUVVNfVkFSKTsKKyAgICBpZiAodiA8IDApIHsKKyAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgaWYgKHYgPiAweGZmZmZmZmZmKSB7CisgICAgICAgIHJlcyA9IDB4ZmZmZmZmZmY7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gdjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyIGZsb2F0MzJfdG9fdWludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0MzIgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGludDY0X3QgdjsKKyAgICB1aW50MzIgcmVzOworCisgICAgdiA9IGZsb2F0MzJfdG9faW50NjRfcm91bmRfdG9femVybyhhIFNUQVRVU19WQVIpOworICAgIGlmICh2IDwgMCkgeworICAgICAgICByZXMgPSAwOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgIH0gZWxzZSBpZiAodiA+IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgcmVzID0gMHhmZmZmZmZmZjsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSB2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50X2Zhc3QxNl90IGZsb2F0MzJfdG9fdWludDE2X3JvdW5kX3RvX3plcm8oZmxvYXQzMiBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ2NF90IHY7CisgICAgdWludF9mYXN0MTZfdCByZXM7CisKKyAgICB2ID0gZmxvYXQzMl90b19pbnQ2NF9yb3VuZF90b196ZXJvKGEgU1RBVFVTX1ZBUik7CisgICAgaWYgKHYgPCAwKSB7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgfSBlbHNlIGlmICh2ID4gMHhmZmZmKSB7CisgICAgICAgIHJlcyA9IDB4ZmZmZjsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSB2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzIgZmxvYXQ2NF90b191aW50MzIoIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGludDY0X3QgdjsKKyAgICB1aW50MzIgcmVzOworCisgICAgdiA9IGZsb2F0NjRfdG9faW50NjQoYSBTVEFUVVNfVkFSKTsKKyAgICBpZiAodiA8IDApIHsKKyAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgaWYgKHYgPiAweGZmZmZmZmZmKSB7CisgICAgICAgIHJlcyA9IDB4ZmZmZmZmZmY7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gdjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyIGZsb2F0NjRfdG9fdWludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0gKQoreworICAgIGludDY0X3QgdjsKKyAgICB1aW50MzIgcmVzOworCisgICAgdiA9IGZsb2F0NjRfdG9faW50NjRfcm91bmRfdG9femVybyhhIFNUQVRVU19WQVIpOworICAgIGlmICh2IDwgMCkgeworICAgICAgICByZXMgPSAwOworICAgICAgICBmbG9hdF9yYWlzZSggZmxvYXRfZmxhZ19pbnZhbGlkIFNUQVRVU19WQVIpOworICAgIH0gZWxzZSBpZiAodiA+IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgcmVzID0gMHhmZmZmZmZmZjsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSB2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50X2Zhc3QxNl90IGZsb2F0NjRfdG9fdWludDE2X3JvdW5kX3RvX3plcm8oZmxvYXQ2NCBhIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpbnQ2NF90IHY7CisgICAgdWludF9mYXN0MTZfdCByZXM7CisKKyAgICB2ID0gZmxvYXQ2NF90b19pbnQ2NF9yb3VuZF90b196ZXJvKGEgU1RBVFVTX1ZBUik7CisgICAgaWYgKHYgPCAwKSB7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgfSBlbHNlIGlmICh2ID4gMHhmZmZmKSB7CisgICAgICAgIHJlcyA9IDB4ZmZmZjsKKyAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSB2OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKiBGSVhNRTogVGhpcyBsb29rcyBicm9rZW4uICAqLwordWludDY0X3QgZmxvYXQ2NF90b191aW50NjQgKGZsb2F0NjQgYSBTVEFUVVNfUEFSQU0pCit7CisgICAgaW50NjRfdCB2OworCisgICAgdiA9IGZsb2F0NjRfdmFsKGludDY0X3RvX2Zsb2F0NjQoSU5UNjRfTUlOIFNUQVRVU19WQVIpKTsKKyAgICB2ICs9IGZsb2F0NjRfdmFsKGEpOworICAgIHYgPSBmbG9hdDY0X3RvX2ludDY0KG1ha2VfZmxvYXQ2NCh2KSBTVEFUVVNfVkFSKTsKKworICAgIHJldHVybiB2IC0gSU5UNjRfTUlOOworfQorCit1aW50NjRfdCBmbG9hdDY0X3RvX3VpbnQ2NF9yb3VuZF90b196ZXJvIChmbG9hdDY0IGEgU1RBVFVTX1BBUkFNKQoreworICAgIGludDY0X3QgdjsKKworICAgIHYgPSBmbG9hdDY0X3ZhbChpbnQ2NF90b19mbG9hdDY0KElOVDY0X01JTiBTVEFUVVNfVkFSKSk7CisgICAgdiArPSBmbG9hdDY0X3ZhbChhKTsKKyAgICB2ID0gZmxvYXQ2NF90b19pbnQ2NF9yb3VuZF90b196ZXJvKG1ha2VfZmxvYXQ2NCh2KSBTVEFUVVNfVkFSKTsKKworICAgIHJldHVybiB2IC0gSU5UNjRfTUlOOworfQorCisjZGVmaW5lIENPTVBBUkUocywgbmFuX2V4cCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lOTElORSBpbnQgZmxvYXQgIyMgcyAjIyBfY29tcGFyZV9pbnRlcm5hbCggZmxvYXQgIyMgcyBhLCBmbG9hdCAjIyBzIGIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcXVpZXQgU1RBVFVTX1BBUkFNICkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQgIyMgcyAjIyBfdCBhdiwgYnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IGZsb2F0ICMjIHMgIyMgX3NxdWFzaF9pbnB1dF9kZW5vcm1hbChhIFNUQVRVU19WQVIpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gZmxvYXQgIyMgcyAjIyBfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggKCBleHRyYWN0RmxvYXQgIyMgcyAjIyBFeHAoIGEgKSA9PSBuYW5fZXhwICkgJiYgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGV4dHJhY3RGbG9hdCAjIyBzICMjIEZyYWMoIGEgKSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggZXh0cmFjdEZsb2F0ICMjIHMgIyMgRXhwKCBiICkgPT0gbmFuX2V4cCApICYmICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZXh0cmFjdEZsb2F0ICMjIHMgIyMgRnJhYyggYiApICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFpc19xdWlldCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmxvYXQgIyMgcyAjIyBfaXNfc2lnbmFsaW5nX25hbiggYSApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCAjIyBzICMjIF9pc19zaWduYWxpbmdfbmFuKCBiICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBmbG9hdF9yZWxhdGlvbl91bm9yZGVyZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFTaWduID0gZXh0cmFjdEZsb2F0ICMjIHMgIyMgU2lnbiggYSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQgIyMgcyAjIyBTaWduKCBiICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdiA9IGZsb2F0ICMjIHMgIyMgX3ZhbChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJ2ID0gZmxvYXQgIyMgcyAjIyBfdmFsKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCAodWludCAjIyBzICMjIF90KSAoICggYXYgfCBidiApPDwxICkgPT0gMCApIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLyogemVybyBjYXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gZmxvYXRfcmVsYXRpb25fZXF1YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIDEgLSAoMiAqIGFTaWduKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYXYgPT0gYnYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gZmxvYXRfcmVsYXRpb25fZXF1YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIDEgLSAyICogKGFTaWduIF4gKCBhdiA8IGJ2ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludCBmbG9hdCAjIyBzICMjIF9jb21wYXJlKCBmbG9hdCAjIyBzIGEsIGZsb2F0ICMjIHMgYiBTVEFUVVNfUEFSQU0gKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZsb2F0ICMjIHMgIyMgX2NvbXBhcmVfaW50ZXJuYWwoYSwgYiwgMCBTVEFUVVNfVkFSKTsgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgZmxvYXQgIyMgcyAjIyBfY29tcGFyZV9xdWlldCggZmxvYXQgIyMgcyBhLCBmbG9hdCAjIyBzIGIgU1RBVFVTX1BBUkFNICkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmbG9hdCAjIyBzICMjIF9jb21wYXJlX2ludGVybmFsKGEsIGIsIDEgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgICBcCit9CisKK0NPTVBBUkUoMzIsIDB4ZmYpCitDT01QQVJFKDY0LCAweDdmZikKKworSU5MSU5FIGludCBmbG9hdHg4MF9jb21wYXJlX2ludGVybmFsKCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcXVpZXQgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGlmICgoICggZXh0cmFjdEZsb2F0eDgwRXhwKCBhICkgPT0gMHg3ZmZmICkgJiYKKyAgICAgICAgICAoIGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTw8MSApICkgfHwKKyAgICAgICAgKCAoIGV4dHJhY3RGbG9hdHg4MEV4cCggYiApID09IDB4N2ZmZiApICYmCisgICAgICAgICAgKCBleHRyYWN0RmxvYXR4ODBGcmFjKCBiICk8PDEgKSApKSB7CisgICAgICAgIGlmICghaXNfcXVpZXQgfHwKKyAgICAgICAgICAgIGZsb2F0eDgwX2lzX3NpZ25hbGluZ19uYW4oIGEgKSB8fAorICAgICAgICAgICAgZmxvYXR4ODBfaXNfc2lnbmFsaW5nX25hbiggYiApICkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoIGZsb2F0X2ZsYWdfaW52YWxpZCBTVEFUVVNfVkFSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxvYXRfcmVsYXRpb25fdW5vcmRlcmVkOworICAgIH0KKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGEgKTsKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdHg4MFNpZ24oIGIgKTsKKyAgICBpZiAoIGFTaWduICE9IGJTaWduICkgeworCisgICAgICAgIGlmICggKCAoICh1aW50MTZfdCkgKCAoIGEuaGlnaCB8IGIuaGlnaCApIDw8IDEgKSApID09IDApICYmCisgICAgICAgICAgICAgKCAoIGEubG93IHwgYi5sb3cgKSA9PSAwICkgKSB7CisgICAgICAgICAgICAvKiB6ZXJvIGNhc2UgKi8KKyAgICAgICAgICAgIHJldHVybiBmbG9hdF9yZWxhdGlvbl9lcXVhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAxIC0gKDIgKiBhU2lnbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYS5sb3cgPT0gYi5sb3cgJiYgYS5oaWdoID09IGIuaGlnaCkgeworICAgICAgICAgICAgcmV0dXJuIGZsb2F0X3JlbGF0aW9uX2VxdWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDEgLSAyICogKGFTaWduIF4gKCBsdDEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApICkpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgZmxvYXR4ODBfY29tcGFyZSggZmxvYXR4ODAgYSwgZmxvYXR4ODAgYiBTVEFUVVNfUEFSQU0gKQoreworICAgIHJldHVybiBmbG9hdHg4MF9jb21wYXJlX2ludGVybmFsKGEsIGIsIDAgU1RBVFVTX1ZBUik7Cit9CisKK2ludCBmbG9hdHg4MF9jb21wYXJlX3F1aWV0KCBmbG9hdHg4MCBhLCBmbG9hdHg4MCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgcmV0dXJuIGZsb2F0eDgwX2NvbXBhcmVfaW50ZXJuYWwoYSwgYiwgMSBTVEFUVVNfVkFSKTsKK30KKworSU5MSU5FIGludCBmbG9hdDEyOF9jb21wYXJlX2ludGVybmFsKCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcXVpZXQgU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsKKworICAgIGlmICgoICggZXh0cmFjdEZsb2F0MTI4RXhwKCBhICkgPT0gMHg3ZmZmICkgJiYKKyAgICAgICAgICAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBhICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYSApICkgKSB8fAorICAgICAgICAoICggZXh0cmFjdEZsb2F0MTI4RXhwKCBiICkgPT0gMHg3ZmZmICkgJiYKKyAgICAgICAgICAoIGV4dHJhY3RGbG9hdDEyOEZyYWMwKCBiICkgfCBleHRyYWN0RmxvYXQxMjhGcmFjMSggYiApICkgKSkgeworICAgICAgICBpZiAoIWlzX3F1aWV0IHx8CisgICAgICAgICAgICBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBhICkgfHwKKyAgICAgICAgICAgIGZsb2F0MTI4X2lzX3NpZ25hbGluZ19uYW4oIGIgKSApIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKCBmbG9hdF9mbGFnX2ludmFsaWQgU1RBVFVTX1ZBUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZsb2F0X3JlbGF0aW9uX3Vub3JkZXJlZDsKKyAgICB9CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBhICk7CisgICAgYlNpZ24gPSBleHRyYWN0RmxvYXQxMjhTaWduKCBiICk7CisgICAgaWYgKCBhU2lnbiAhPSBiU2lnbiApIHsKKyAgICAgICAgaWYgKCAoICggKCBhLmhpZ2ggfCBiLmhpZ2ggKTw8MSApIHwgYS5sb3cgfCBiLmxvdyApID09IDAgKSB7CisgICAgICAgICAgICAvKiB6ZXJvIGNhc2UgKi8KKyAgICAgICAgICAgIHJldHVybiBmbG9hdF9yZWxhdGlvbl9lcXVhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAxIC0gKDIgKiBhU2lnbik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYS5sb3cgPT0gYi5sb3cgJiYgYS5oaWdoID09IGIuaGlnaCkgeworICAgICAgICAgICAgcmV0dXJuIGZsb2F0X3JlbGF0aW9uX2VxdWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDEgLSAyICogKGFTaWduIF4gKCBsdDEyOCggYS5oaWdoLCBhLmxvdywgYi5oaWdoLCBiLmxvdyApICkpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgZmxvYXQxMjhfY29tcGFyZSggZmxvYXQxMjggYSwgZmxvYXQxMjggYiBTVEFUVVNfUEFSQU0gKQoreworICAgIHJldHVybiBmbG9hdDEyOF9jb21wYXJlX2ludGVybmFsKGEsIGIsIDAgU1RBVFVTX1ZBUik7Cit9CisKK2ludCBmbG9hdDEyOF9jb21wYXJlX3F1aWV0KCBmbG9hdDEyOCBhLCBmbG9hdDEyOCBiIFNUQVRVU19QQVJBTSApCit7CisgICAgcmV0dXJuIGZsb2F0MTI4X2NvbXBhcmVfaW50ZXJuYWwoYSwgYiwgMSBTVEFUVVNfVkFSKTsKK30KKworLyogbWluKCkgYW5kIG1heCgpIGZ1bmN0aW9ucy4gVGhlc2UgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgYXMKKyAqICdjb21wYXJlIGFuZCBwaWNrIG9uZSBpbnB1dCcgYmVjYXVzZSB0aGF0IHdvdWxkIG1pc2hhbmRsZQorICogTmFOcyBhbmQgKzAgdnMgLTAuCisgKgorICogbWlubnVtKCkgYW5kIG1heG51bSgpIGZ1bmN0aW9ucy4gVGhlc2UgYXJlIHNpbWlsYXIgdG8gdGhlIG1pbigpCisgKiBhbmQgbWF4KCkgZnVuY3Rpb25zIGJ1dCBpZiBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIFFOYU4gYW5kCisgKiB0aGUgb3RoZXIgaXMgbnVtZXJpY2FsIHRoZW4gdGhlIG51bWVyaWNhbCBhcmd1bWVudCBpcyByZXR1cm5lZC4KKyAqIG1pbm51bSgpIGFuZCBtYXhudW0gY29ycmVzcG9uZCB0byB0aGUgSUVFRSA3NTQtMjAwOCBtaW5OdW0oKQorICogYW5kIG1heE51bSgpIG9wZXJhdGlvbnMuIG1pbigpIGFuZCBtYXgoKSBhcmUgdGhlIHR5cGljYWwgbWluL21heAorICogc2VtYW50aWNzIHByb3ZpZGVkIGJ5IG1hbnkgQ1BVcyB3aGljaCBwcmVkYXRlIHRoYXQgc3BlY2lmaWNhdGlvbi4KKyAqLworI2RlZmluZSBNSU5NQVgocykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSU5MSU5FIGZsb2F0ICMjIHMgZmxvYXQgIyMgcyAjIyBfbWlubWF4KGZsb2F0ICMjIHMgYSwgZmxvYXQgIyMgcyBiLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc21pbiwgaW50IGlzaWVlZSBTVEFUVVNfUEFSQU0pIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbGFnIGFTaWduLCBiU2lnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50ICMjIHMgIyMgX3QgYXYsIGJ2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gZmxvYXQgIyMgcyAjIyBfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgIFwKKyAgICBiID0gZmxvYXQgIyMgcyAjIyBfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGIgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgIFwKKyAgICBpZiAoZmxvYXQgIyMgcyAjIyBfaXNfYW55X25hbihhKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgIyMgcyAjIyBfaXNfYW55X25hbihiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzaWVlZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChmbG9hdCAjIyBzICMjIF9pc19xdWlldF9uYW4oYSkgJiYgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAhZmxvYXQgIyMgcyAjI19pc19hbnlfbmFuKGIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxvYXQgIyMgcyAjIyBfaXNfcXVpZXRfbmFuKGIpICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIWZsb2F0ICMjIHMgIyMgX2lzX2FueV9uYW4oYSkpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0ICMjIHMgIyMgTmFOKGEsIGIgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdCAjIyBzICMjIFNpZ24oYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiU2lnbiA9IGV4dHJhY3RGbG9hdCAjIyBzICMjIFNpZ24oYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdiA9IGZsb2F0ICMjIHMgIyMgX3ZhbChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBidiA9IGZsb2F0ICMjIHMgIyMgX3ZhbChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYVNpZ24gIT0gYlNpZ24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzbWluKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBhU2lnbiA/IGEgOiBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBhU2lnbiA/IGIgOiBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzbWluKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAoYVNpZ24gXiAoYXYgPCBidikpID8gYSA6IGI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAoYVNpZ24gXiAoYXYgPCBidikpID8gYiA6IGE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Zsb2F0ICMjIHMgZmxvYXQgIyMgcyAjIyBfbWluKGZsb2F0ICMjIHMgYSwgZmxvYXQgIyMgcyBiIFNUQVRVU19QQVJBTSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZmxvYXQgIyMgcyAjIyBfbWlubWF4KGEsIGIsIDEsIDAgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Zsb2F0ICMjIHMgZmxvYXQgIyMgcyAjIyBfbWF4KGZsb2F0ICMjIHMgYSwgZmxvYXQgIyMgcyBiIFNUQVRVU19QQVJBTSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZmxvYXQgIyMgcyAjIyBfbWlubWF4KGEsIGIsIDAsIDAgU1RBVFVTX1ZBUik7ICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Zsb2F0ICMjIHMgZmxvYXQgIyMgcyAjIyBfbWlubnVtKGZsb2F0ICMjIHMgYSwgZmxvYXQgIyMgcyBiIFNUQVRVU19QQVJBTSkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBmbG9hdCAjIyBzICMjIF9taW5tYXgoYSwgYiwgMSwgMSBTVEFUVVNfVkFSKTsgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZmxvYXQgIyMgcyBmbG9hdCAjIyBzICMjIF9tYXhudW0oZmxvYXQgIyMgcyBhLCBmbG9hdCAjIyBzIGIgU1RBVFVTX1BBUkFNKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZsb2F0ICMjIHMgIyMgX21pbm1heChhLCBiLCAwLCAxIFNUQVRVU19WQVIpOyAgICAgICAgICAgICAgICBcCit9CisKK01JTk1BWCgzMikKK01JTk1BWCg2NCkKKworCisvKiBNdWx0aXBseSBBIGJ5IDIgcmFpc2VkIHRvIHRoZSBwb3dlciBOLiAgKi8KK2Zsb2F0MzIgZmxvYXQzMl9zY2FsYm4oIGZsb2F0MzIgYSwgaW50IG4gU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDE2X3QgYUV4cDsKKyAgICB1aW50MzJfdCBhU2lnOworCisgICAgYSA9IGZsb2F0MzJfc3F1YXNoX2lucHV0X2Rlbm9ybWFsKGEgU1RBVFVTX1ZBUik7CisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdDMyRnJhYyggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQzMkV4cCggYSApOworICAgIGFTaWduID0gZXh0cmFjdEZsb2F0MzJTaWduKCBhICk7CisKKyAgICBpZiAoIGFFeHAgPT0gMHhGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0MzJOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgIT0gMCApCisgICAgICAgIGFTaWcgfD0gMHgwMDgwMDAwMDsKKyAgICBlbHNlIGlmICggYVNpZyA9PSAwICkKKyAgICAgICAgcmV0dXJuIGE7CisKKyAgICBpZiAobiA+IDB4MjAwKSB7CisgICAgICAgIG4gPSAweDIwMDsKKyAgICB9IGVsc2UgaWYgKG4gPCAtMHgyMDApIHsKKyAgICAgICAgbiA9IC0weDIwMDsKKyAgICB9CisKKyAgICBhRXhwICs9IG4gLSAxOworICAgIGFTaWcgPDw9IDc7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MzIoIGFTaWduLCBhRXhwLCBhU2lnIFNUQVRVU19WQVIgKTsKK30KKworZmxvYXQ2NCBmbG9hdDY0X3NjYWxibiggZmxvYXQ2NCBhLCBpbnQgbiBTVEFUVVNfUEFSQU0gKQoreworICAgIGZsYWcgYVNpZ247CisgICAgaW50MTZfdCBhRXhwOworICAgIHVpbnQ2NF90IGFTaWc7CisKKyAgICBhID0gZmxvYXQ2NF9zcXVhc2hfaW5wdXRfZGVub3JtYWwoYSBTVEFUVVNfVkFSKTsKKyAgICBhU2lnID0gZXh0cmFjdEZsb2F0NjRGcmFjKCBhICk7CisgICAgYUV4cCA9IGV4dHJhY3RGbG9hdDY0RXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXQ2NFNpZ24oIGEgKTsKKworICAgIGlmICggYUV4cCA9PSAweDdGRiApIHsKKyAgICAgICAgaWYgKCBhU2lnICkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BhZ2F0ZUZsb2F0NjROYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgIT0gMCApCisgICAgICAgIGFTaWcgfD0gTElUNjQoIDB4MDAxMDAwMDAwMDAwMDAwMCApOworICAgIGVsc2UgaWYgKCBhU2lnID09IDAgKQorICAgICAgICByZXR1cm4gYTsKKworICAgIGlmIChuID4gMHgxMDAwKSB7CisgICAgICAgIG4gPSAweDEwMDA7CisgICAgfSBlbHNlIGlmIChuIDwgLTB4MTAwMCkgeworICAgICAgICBuID0gLTB4MTAwMDsKKyAgICB9CisKKyAgICBhRXhwICs9IG4gLSAxOworICAgIGFTaWcgPDw9IDEwOworICAgIHJldHVybiBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdDY0KCBhU2lnbiwgYUV4cCwgYVNpZyBTVEFUVVNfVkFSICk7Cit9CisKK2Zsb2F0eDgwIGZsb2F0eDgwX3NjYWxibiggZmxvYXR4ODAgYSwgaW50IG4gU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyX3QgYUV4cDsKKyAgICB1aW50NjRfdCBhU2lnOworCisgICAgYVNpZyA9IGV4dHJhY3RGbG9hdHg4MEZyYWMoIGEgKTsKKyAgICBhRXhwID0gZXh0cmFjdEZsb2F0eDgwRXhwKCBhICk7CisgICAgYVNpZ24gPSBleHRyYWN0RmxvYXR4ODBTaWduKCBhICk7CisKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIGFTaWc8PDEgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXR4ODBOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIGlmIChhRXhwID09IDAgJiYgYVNpZyA9PSAwKQorICAgICAgICByZXR1cm4gYTsKKworICAgIGlmIChuID4gMHgxMDAwMCkgeworICAgICAgICBuID0gMHgxMDAwMDsKKyAgICB9IGVsc2UgaWYgKG4gPCAtMHgxMDAwMCkgeworICAgICAgICBuID0gLTB4MTAwMDA7CisgICAgfQorCisgICAgYUV4cCArPSBuOworICAgIHJldHVybiBub3JtYWxpemVSb3VuZEFuZFBhY2tGbG9hdHg4MCggU1RBVFVTKGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU2lnbiwgYUV4cCwgYVNpZywgMCBTVEFUVVNfVkFSICk7Cit9CisKK2Zsb2F0MTI4IGZsb2F0MTI4X3NjYWxibiggZmxvYXQxMjggYSwgaW50IG4gU1RBVFVTX1BBUkFNICkKK3sKKyAgICBmbGFnIGFTaWduOworICAgIGludDMyX3QgYUV4cDsKKyAgICB1aW50NjRfdCBhU2lnMCwgYVNpZzE7CisKKyAgICBhU2lnMSA9IGV4dHJhY3RGbG9hdDEyOEZyYWMxKCBhICk7CisgICAgYVNpZzAgPSBleHRyYWN0RmxvYXQxMjhGcmFjMCggYSApOworICAgIGFFeHAgPSBleHRyYWN0RmxvYXQxMjhFeHAoIGEgKTsKKyAgICBhU2lnbiA9IGV4dHJhY3RGbG9hdDEyOFNpZ24oIGEgKTsKKyAgICBpZiAoIGFFeHAgPT0gMHg3RkZGICkgeworICAgICAgICBpZiAoIGFTaWcwIHwgYVNpZzEgKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRlRmxvYXQxMjhOYU4oIGEsIGEgU1RBVFVTX1ZBUiApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBpZiAoIGFFeHAgIT0gMCApCisgICAgICAgIGFTaWcwIHw9IExJVDY0KCAweDAwMDEwMDAwMDAwMDAwMDAgKTsKKyAgICBlbHNlIGlmICggYVNpZzAgPT0gMCAmJiBhU2lnMSA9PSAwICkKKyAgICAgICAgcmV0dXJuIGE7CisKKyAgICBpZiAobiA+IDB4MTAwMDApIHsKKyAgICAgICAgbiA9IDB4MTAwMDA7CisgICAgfSBlbHNlIGlmIChuIDwgLTB4MTAwMDApIHsKKyAgICAgICAgbiA9IC0weDEwMDAwOworICAgIH0KKworICAgIGFFeHAgKz0gbiAtIDE7CisgICAgcmV0dXJuIG5vcm1hbGl6ZVJvdW5kQW5kUGFja0Zsb2F0MTI4KCBhU2lnbiwgYUV4cCwgYVNpZzAsIGFTaWcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUVVNfVkFSICk7CisKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9hcm0tY29yZS54bWwgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLWNvcmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTJmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLWNvcmUueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorCis8IURPQ1RZUEUgZmVhdHVyZSBTWVNURU0gImdkYi10YXJnZXQuZHRkIj4KKzxmZWF0dXJlIG5hbWU9Im9yZy5nbnUuZ2RiLmFybS5jb3JlIj4KKyAgPHJlZyBuYW1lPSJyMCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyMSIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyMiIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyMyIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyNCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyNSIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyNiIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyNyIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyOCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyOSIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJyMTAiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0icjExIiBiaXRzaXplPSIzMiIvPgorICA8cmVnIG5hbWU9InIxMiIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJzcCIgYml0c2l6ZT0iMzIiIHR5cGU9ImRhdGFfcHRyIi8+CisgIDxyZWcgbmFtZT0ibHIiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0icGMiIGJpdHNpemU9IjMyIiB0eXBlPSJjb2RlX3B0ciIvPgorCisgIDwhLS0gVGhlIENQU1IgaXMgcmVnaXN0ZXIgMjUsIHJhdGhlciB0aGFuIHJlZ2lzdGVyIDE2LCBiZWNhdXNlCisgICAgICAgdGhlIEZQQSByZWdpc3RlcnMgaGlzdG9yaWNhbGx5IHdlcmUgcGxhY2VkIGJldHdlZW4gdGhlIFBDCisgICAgICAgYW5kIHRoZSBDUFNSIGluIHRoZSAiZyIgcGFja2V0LiAgLS0+CisgIDxyZWcgbmFtZT0iY3BzciIgYml0c2l6ZT0iMzIiIHJlZ251bT0iMjUiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9hcm0tbmVvbi54bWwgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLW5lb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2VlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLW5lb24ueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorPCFET0NUWVBFIGZlYXR1cmUgU1lTVEVNICJnZGItdGFyZ2V0LmR0ZCI+Cis8ZmVhdHVyZSBuYW1lPSJvcmcuZ251LmdkYi5hcm0udmZwIj4KKyAgPHZlY3RvciBpZD0ibmVvbl91aW50OHg4IiB0eXBlPSJ1aW50OCIgY291bnQ9IjgiLz4KKyAgPHZlY3RvciBpZD0ibmVvbl91aW50MTZ4NCIgdHlwZT0idWludDE2IiBjb3VudD0iNCIvPgorICA8dmVjdG9yIGlkPSJuZW9uX3VpbnQzMngyIiB0eXBlPSJ1aW50MzIiIGNvdW50PSIyIi8+CisgIDx2ZWN0b3IgaWQ9Im5lb25fZmxvYXQzMngyIiB0eXBlPSJpZWVlX3NpbmdsZSIgY291bnQ9IjIiLz4KKyAgPHVuaW9uIGlkPSJuZW9uX2QiPgorICAgIDxmaWVsZCBuYW1lPSJ1OCIgdHlwZT0ibmVvbl91aW50OHg4Ii8+CisgICAgPGZpZWxkIG5hbWU9InUxNiIgdHlwZT0ibmVvbl91aW50MTZ4NCIvPgorICAgIDxmaWVsZCBuYW1lPSJ1MzIiIHR5cGU9Im5lb25fdWludDMyeDIiLz4KKyAgICA8ZmllbGQgbmFtZT0idTY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgICA8ZmllbGQgbmFtZT0iZjMyIiB0eXBlPSJuZW9uX2Zsb2F0MzJ4MiIvPgorICAgIDxmaWVsZCBuYW1lPSJmNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDwvdW5pb24+CisgIDx2ZWN0b3IgaWQ9Im5lb25fdWludDh4MTYiIHR5cGU9InVpbnQ4IiBjb3VudD0iMTYiLz4KKyAgPHZlY3RvciBpZD0ibmVvbl91aW50MTZ4OCIgdHlwZT0idWludDE2IiBjb3VudD0iOCIvPgorICA8dmVjdG9yIGlkPSJuZW9uX3VpbnQzMng0IiB0eXBlPSJ1aW50MzIiIGNvdW50PSI0Ii8+CisgIDx2ZWN0b3IgaWQ9Im5lb25fdWludDY0eDIiIHR5cGU9InVpbnQ2NCIgY291bnQ9IjIiLz4KKyAgPHZlY3RvciBpZD0ibmVvbl9mbG9hdDMyeDQiIHR5cGU9ImllZWVfc2luZ2xlIiBjb3VudD0iNCIvPgorICA8dmVjdG9yIGlkPSJuZW9uX2Zsb2F0NjR4MiIgdHlwZT0iaWVlZV9kb3VibGUiIGNvdW50PSIyIi8+CisgIDx1bmlvbiBpZD0ibmVvbl9xIj4KKyAgICA8ZmllbGQgbmFtZT0idTgiIHR5cGU9Im5lb25fdWludDh4MTYiLz4KKyAgICA8ZmllbGQgbmFtZT0idTE2IiB0eXBlPSJuZW9uX3VpbnQxNng4Ii8+CisgICAgPGZpZWxkIG5hbWU9InUzMiIgdHlwZT0ibmVvbl91aW50MzJ4NCIvPgorICAgIDxmaWVsZCBuYW1lPSJ1NjQiIHR5cGU9Im5lb25fdWludDY0eDIiLz4KKyAgICA8ZmllbGQgbmFtZT0iZjMyIiB0eXBlPSJuZW9uX2Zsb2F0MzJ4NCIvPgorICAgIDxmaWVsZCBuYW1lPSJmNjQiIHR5cGU9Im5lb25fZmxvYXQ2NHgyIi8+CisgIDwvdW5pb24+CisgIDxyZWcgbmFtZT0iZDAiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMSIgYml0c2l6ZT0iNjQiIHR5cGU9Im5lb25fZCIvPgorICA8cmVnIG5hbWU9ImQyIiBiaXRzaXplPSI2NCIgdHlwZT0ibmVvbl9kIi8+CisgIDxyZWcgbmFtZT0iZDMiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkNCIgYml0c2l6ZT0iNjQiIHR5cGU9Im5lb25fZCIvPgorICA8cmVnIG5hbWU9ImQ1IiBiaXRzaXplPSI2NCIgdHlwZT0ibmVvbl9kIi8+CisgIDxyZWcgbmFtZT0iZDYiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkNyIgYml0c2l6ZT0iNjQiIHR5cGU9Im5lb25fZCIvPgorICA8cmVnIG5hbWU9ImQ4IiBiaXRzaXplPSI2NCIgdHlwZT0ibmVvbl9kIi8+CisgIDxyZWcgbmFtZT0iZDkiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTAiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTEiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTIiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTMiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTQiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTUiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTYiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTciIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTgiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMTkiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjAiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjEiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjIiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjMiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjQiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjUiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjYiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjciIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjgiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMjkiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMzAiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKyAgPHJlZyBuYW1lPSJkMzEiIGJpdHNpemU9IjY0IiB0eXBlPSJuZW9uX2QiLz4KKworICA8cmVnIG5hbWU9InEwIiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InExIiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InEyIiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InEzIiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE0IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE1IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE2IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE3IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE4IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InE5IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InExMCIgYml0c2l6ZT0iMTI4IiB0eXBlPSJuZW9uX3EiLz4KKyAgPHJlZyBuYW1lPSJxMTAiIGJpdHNpemU9IjEyOCIgdHlwZT0ibmVvbl9xIi8+CisgIDxyZWcgbmFtZT0icTEyIiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorICA8cmVnIG5hbWU9InExMyIgYml0c2l6ZT0iMTI4IiB0eXBlPSJuZW9uX3EiLz4KKyAgPHJlZyBuYW1lPSJxMTQiIGJpdHNpemU9IjEyOCIgdHlwZT0ibmVvbl9xIi8+CisgIDxyZWcgbmFtZT0icTE1IiBiaXRzaXplPSIxMjgiIHR5cGU9Im5lb25fcSIvPgorCisgIDxyZWcgbmFtZT0iZnBzaWQiIGJpdHNpemU9IjMyIiB0eXBlPSJpbnQiIGdyb3VwPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImZwc2NyIiBiaXRzaXplPSIzMiIgdHlwZT0iaW50IiBncm91cD0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJmcGV4YyIgYml0c2l6ZT0iMzIiIHR5cGU9ImludCIgZ3JvdXA9ImZsb2F0Ii8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLXZmcC54bWwgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLXZmcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwODgxZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9hcm0tdmZwLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICAgIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorICAgICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICAtLT4KKzwhRE9DVFlQRSBmZWF0dXJlIFNZU1RFTSAiZ2RiLXRhcmdldC5kdGQiPgorPGZlYXR1cmUgbmFtZT0ib3JnLmdudS5nZGIuYXJtLnZmcCI+CisgIDxyZWcgbmFtZT0iZDAiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMiIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDMiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQ0IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkNSIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDYiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQ3IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkOCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDkiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxMCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDExIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMTIiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxMyIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDE0IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMTUiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorCisgIDxyZWcgbmFtZT0iZnBzaWQiIGJpdHNpemU9IjMyIiB0eXBlPSJpbnQiIGdyb3VwPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImZwc2NyIiBiaXRzaXplPSIzMiIgdHlwZT0iaW50IiBncm91cD0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJmcGV4YyIgYml0c2l6ZT0iMzIiIHR5cGU9ImludCIgZ3JvdXA9ImZsb2F0Ii8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2dkYi14bWwvYXJtLXZmcDMueG1sIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL2FybS12ZnAzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdhZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL2FybS12ZnAzLnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICAgIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorICAgICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICAtLT4KKzwhRE9DVFlQRSBmZWF0dXJlIFNZU1RFTSAiZ2RiLXRhcmdldC5kdGQiPgorPGZlYXR1cmUgbmFtZT0ib3JnLmdudS5nZGIuYXJtLnZmcCI+CisgIDxyZWcgbmFtZT0iZDAiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMiIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDMiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQ0IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkNSIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDYiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQ3IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkOCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDkiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxMCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDExIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMTIiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxMyIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDE0IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMTUiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxNiIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDE3IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMTgiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQxOSIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDIwIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMjEiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQyMiIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDIzIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMjQiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQyNSIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDI2IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMjciIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQyOCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZDI5IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJkMzAiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImQzMSIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0Ii8+CisKKyAgPHJlZyBuYW1lPSJmcHNpZCIgYml0c2l6ZT0iMzIiIHR5cGU9ImludCIgZ3JvdXA9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZnBzY3IiIGJpdHNpemU9IjMyIiB0eXBlPSJpbnQiIGdyb3VwPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImZwZXhjIiBiaXRzaXplPSIzMiIgdHlwZT0iaW50IiBncm91cD0iZmxvYXQiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9jZi1jb3JlLnhtbCBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9jZi1jb3JlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTBhZjMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL2NmLWNvcmUueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorPCFET0NUWVBFIGZlYXR1cmUgU1lTVEVNICJnZGItdGFyZ2V0LmR0ZCI+Cis8ZmVhdHVyZSBuYW1lPSJvcmcuZ251LmdkYi5jb2xkZmlyZS5jb3JlIj4KKyAgPHJlZyBuYW1lPSJkMCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkMSIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkMiIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkMyIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkNCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkNSIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkNiIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJkNyIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJhMCIgYml0c2l6ZT0iMzIiIHR5cGU9ImRhdGFfcHRyIi8+CisgIDxyZWcgbmFtZT0iYTEiIGJpdHNpemU9IjMyIiB0eXBlPSJkYXRhX3B0ciIvPgorICA8cmVnIG5hbWU9ImEyIiBiaXRzaXplPSIzMiIgdHlwZT0iZGF0YV9wdHIiLz4KKyAgPHJlZyBuYW1lPSJhMyIgYml0c2l6ZT0iMzIiIHR5cGU9ImRhdGFfcHRyIi8+CisgIDxyZWcgbmFtZT0iYTQiIGJpdHNpemU9IjMyIiB0eXBlPSJkYXRhX3B0ciIvPgorICA8cmVnIG5hbWU9ImE1IiBiaXRzaXplPSIzMiIgdHlwZT0iZGF0YV9wdHIiLz4KKyAgPHJlZyBuYW1lPSJmcCIgYml0c2l6ZT0iMzIiIHR5cGU9ImRhdGFfcHRyIi8+CisgIDxyZWcgbmFtZT0ic3AiIGJpdHNpemU9IjMyIiB0eXBlPSJkYXRhX3B0ciIvPgorCisgIDxyZWcgbmFtZT0icHMiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0icGMiIGJpdHNpemU9IjMyIiB0eXBlPSJjb2RlX3B0ciIvPgorCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2dkYi14bWwvY2YtZnAueG1sIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL2NmLWZwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjcxYzMyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL2NmLWZwLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICAgIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorICAgICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICAtLT4KKzwhRE9DVFlQRSBmZWF0dXJlIFNZU1RFTSAiZ2RiLXRhcmdldC5kdGQiPgorPGZlYXR1cmUgbmFtZT0ib3JnLmdudS5nZGIuY29sZGZpcmUuZnAiPgorICA8cmVnIG5hbWU9ImZwMCIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0IiBncm91cD0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJmcDEiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIgZ3JvdXA9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZnAyIiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiIGdyb3VwPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImZwMyIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0IiBncm91cD0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJmcDQiIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIgZ3JvdXA9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZnA1IiBiaXRzaXplPSI2NCIgdHlwZT0iZmxvYXQiIGdyb3VwPSJmbG9hdCIvPgorICA8cmVnIG5hbWU9ImZwNiIgYml0c2l6ZT0iNjQiIHR5cGU9ImZsb2F0IiBncm91cD0iZmxvYXQiLz4KKyAgPHJlZyBuYW1lPSJmcDciIGJpdHNpemU9IjY0IiB0eXBlPSJmbG9hdCIgZ3JvdXA9ImZsb2F0Ii8+CisKKyAgCisgIDxyZWcgbmFtZT0iZnBjb250cm9sIiBiaXRzaXplPSIzMiIgZ3JvdXA9ImZsb2F0Ii8+CisgIDxyZWcgbmFtZT0iZnBzdGF0dXMiIGJpdHNpemU9IjMyIiBncm91cD0iZmxvYXQiLz4sCisgIDxyZWcgbmFtZT0iZnBpYWRkciIgYml0c2l6ZT0iMzIiIHR5cGU9ImNvZGVfcHRyIiBncm91cD0iZmxvYXQiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1hbHRpdmVjLnhtbCBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1hbHRpdmVjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY0ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL3Bvd2VyLWFsdGl2ZWMueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorCis8IURPQ1RZUEUgZmVhdHVyZSBTWVNURU0gImdkYi10YXJnZXQuZHRkIj4KKzxmZWF0dXJlIG5hbWU9Im9yZy5nbnUuZ2RiLnBvd2VyLmFsdGl2ZWMiPgorICA8dmVjdG9yIGlkPSJ2NGYiIHR5cGU9ImllZWVfc2luZ2xlIiBjb3VudD0iNCIvPgorICA8dmVjdG9yIGlkPSJ2NGkzMiIgdHlwZT0iaW50MzIiIGNvdW50PSI0Ii8+CisgIDx2ZWN0b3IgaWQ9InY4aTE2IiB0eXBlPSJpbnQxNiIgY291bnQ9IjgiLz4KKyAgPHZlY3RvciBpZD0idjE2aTgiIHR5cGU9ImludDgiIGNvdW50PSIxNiIvPgorICA8dW5pb24gaWQ9InZlYzEyOCI+CisgICAgPGZpZWxkIG5hbWU9InVpbnQxMjgiIHR5cGU9InVpbnQxMjgiLz4KKyAgICA8ZmllbGQgbmFtZT0idjRfZmxvYXQiIHR5cGU9InY0ZiIvPgorICAgIDxmaWVsZCBuYW1lPSJ2NF9pbnQzMiIgdHlwZT0idjRpMzIiLz4KKyAgICA8ZmllbGQgbmFtZT0idjhfaW50MTYiIHR5cGU9InY4aTE2Ii8+CisgICAgPGZpZWxkIG5hbWU9InYxNl9pbnQ4IiB0eXBlPSJ2MTZpOCIvPgorICA8L3VuaW9uPgorCisgIDxyZWcgbmFtZT0idnIwIiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMSIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjIiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIzIiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyNCIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjUiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnI2IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyNyIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjgiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnI5IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMTAiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIxMSIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjEyIiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMTMiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIxNCIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjE1IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMTYiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIxNyIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjE4IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMTkiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIyMCIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjIxIiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMjIiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIyMyIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjI0IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMjUiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIyNiIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjI3IiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMjgiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisgIDxyZWcgbmFtZT0idnIyOSIgYml0c2l6ZT0iMTI4IiB0eXBlPSJ2ZWMxMjgiLz4KKyAgPHJlZyBuYW1lPSJ2cjMwIiBiaXRzaXplPSIxMjgiIHR5cGU9InZlYzEyOCIvPgorICA8cmVnIG5hbWU9InZyMzEiIGJpdHNpemU9IjEyOCIgdHlwZT0idmVjMTI4Ii8+CisKKyAgPHJlZyBuYW1lPSJ2c2NyIiBiaXRzaXplPSIzMiIgZ3JvdXA9InZlY3RvciIvPgorICA8cmVnIG5hbWU9InZyc2F2ZSIgYml0c2l6ZT0iMzIiIGdyb3VwPSJ2ZWN0b3IiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1jb3JlLnhtbCBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1jb3JlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzY5ZThjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL3Bvd2VyLWNvcmUueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorCis8IURPQ1RZUEUgZmVhdHVyZSBTWVNURU0gImdkYi10YXJnZXQuZHRkIj4KKzxmZWF0dXJlIG5hbWU9Im9yZy5nbnUuZ2RiLnBvd2VyLmNvcmUiPgorICA8cmVnIG5hbWU9InIwIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjEiIGJpdHNpemU9IjMyIiB0eXBlPSJ1aW50MzIiLz4KKyAgPHJlZyBuYW1lPSJyMiIgYml0c2l6ZT0iMzIiIHR5cGU9InVpbnQzMiIvPgorICA8cmVnIG5hbWU9InIzIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjQiIGJpdHNpemU9IjMyIiB0eXBlPSJ1aW50MzIiLz4KKyAgPHJlZyBuYW1lPSJyNSIgYml0c2l6ZT0iMzIiIHR5cGU9InVpbnQzMiIvPgorICA8cmVnIG5hbWU9InI2IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjciIGJpdHNpemU9IjMyIiB0eXBlPSJ1aW50MzIiLz4KKyAgPHJlZyBuYW1lPSJyOCIgYml0c2l6ZT0iMzIiIHR5cGU9InVpbnQzMiIvPgorICA8cmVnIG5hbWU9InI5IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjEwIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjExIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjEyIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjEzIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE0IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE1IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE2IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE3IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE4IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjE5IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjIwIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjIxIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjIyIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjIzIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI0IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI1IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI2IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI3IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI4IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjI5IiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjMwIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0icjMxIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisKKyAgPHJlZyBuYW1lPSJwYyIgYml0c2l6ZT0iMzIiIHR5cGU9ImNvZGVfcHRyIiByZWdudW09IjY0Ii8+CisgIDxyZWcgbmFtZT0ibXNyIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0iY3IiIGJpdHNpemU9IjMyIiB0eXBlPSJ1aW50MzIiLz4KKyAgPHJlZyBuYW1lPSJsciIgYml0c2l6ZT0iMzIiIHR5cGU9ImNvZGVfcHRyIi8+CisgIDxyZWcgbmFtZT0iY3RyIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+CisgIDxyZWcgbmFtZT0ieGVyIiBiaXRzaXplPSIzMiIgdHlwZT0idWludDMyIi8+Cis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2dkYi14bWwvcG93ZXItZnB1LnhtbCBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1mcHUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NzA1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvcG93ZXItZnB1LnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisgICAgIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAorICAgICBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICAtLT4KKworPCFET0NUWVBFIGZlYXR1cmUgU1lTVEVNICJnZGItdGFyZ2V0LmR0ZCI+Cis8ZmVhdHVyZSBuYW1lPSJvcmcuZ251LmdkYi5wb3dlci5mcHUiPgorICA8cmVnIG5hbWU9ImYwIiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiIHJlZ251bT0iNzEiLz4KKyAgPHJlZyBuYW1lPSJmMSIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjIiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYzIiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmNCIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjUiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImY2IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmNyIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjgiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImY5IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMTAiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYxMSIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjEyIiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMTMiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYxNCIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjE1IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMTYiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYxNyIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjE4IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMTkiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYyMCIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjIxIiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMjIiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYyMyIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjI0IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMjUiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYyNiIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjI3IiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMjgiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorICA8cmVnIG5hbWU9ImYyOSIgYml0c2l6ZT0iNjQiIHR5cGU9ImllZWVfZG91YmxlIi8+CisgIDxyZWcgbmFtZT0iZjMwIiBiaXRzaXplPSI2NCIgdHlwZT0iaWVlZV9kb3VibGUiLz4KKyAgPHJlZyBuYW1lPSJmMzEiIGJpdHNpemU9IjY0IiB0eXBlPSJpZWVlX2RvdWJsZSIvPgorCisgIDxyZWcgbmFtZT0iZnBzY3IiIGJpdHNpemU9IjMyIiBncm91cD0iZmxvYXQiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1zcGUueG1sIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL3Bvd2VyLXNwZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3NDBjYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvZ2RiLXhtbC9wb3dlci1zcGUueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAgICAgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CisgICAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gIC0tPgorCis8IURPQ1RZUEUgZmVhdHVyZSBTWVNURU0gImdkYi10YXJnZXQuZHRkIj4KKzxmZWF0dXJlIG5hbWU9Im9yZy5nbnUuZ2RiLnBvd2VyLnNwZSI+CisgIDxyZWcgbmFtZT0iZXYwaCIgYml0c2l6ZT0iMzIiIHJlZ251bT0iNzEiLz4KKyAgPHJlZyBuYW1lPSJldjFoIiBiaXRzaXplPSIzMiIvPgorICA8cmVnIG5hbWU9ImV2MmgiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0iZXYzaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjRoIiBiaXRzaXplPSIzMiIvPgorICA8cmVnIG5hbWU9ImV2NWgiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0iZXY2aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjdoIiBiaXRzaXplPSIzMiIvPgorICA8cmVnIG5hbWU9ImV2OGgiIGJpdHNpemU9IjMyIi8+CisgIDxyZWcgbmFtZT0iZXY5aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjEwaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjExaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjEyaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjEzaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE0aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE1aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE2aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE3aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE4aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjE5aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjIwaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjIxaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjIyaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjIzaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI0aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI1aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI2aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI3aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI4aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjI5aCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjMwaCIgYml0c2l6ZT0iMzIiLz4KKyAgPHJlZyBuYW1lPSJldjMxaCIgYml0c2l6ZT0iMzIiLz4KKworICA8cmVnIG5hbWU9ImFjYyIgYml0c2l6ZT0iNjQiLz4KKyAgPHJlZyBuYW1lPSJzcGVmc2NyIiBiaXRzaXplPSIzMiIvPgorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9nZGIteG1sL3Bvd2VyNjQtY29yZS54bWwgYi9hbmRyb2lkL3FlbXUxL2dkYi14bWwvcG93ZXI2NC1jb3JlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2MxNTMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9nZGIteG1sL3Bvd2VyNjQtY29yZS54bWwKQEAgLTAsMCArMSw0OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorICAgICBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgLS0+CisKKzwhRE9DVFlQRSBmZWF0dXJlIFNZU1RFTSAiZ2RiLXRhcmdldC5kdGQiPgorPGZlYXR1cmUgbmFtZT0ib3JnLmdudS5nZGIucG93ZXIuY29yZSI+CisgIDxyZWcgbmFtZT0icjAiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMSIgYml0c2l6ZT0iNjQiIHR5cGU9InVpbnQ2NCIvPgorICA8cmVnIG5hbWU9InIyIiBiaXRzaXplPSI2NCIgdHlwZT0idWludDY0Ii8+CisgIDxyZWcgbmFtZT0icjMiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyNCIgYml0c2l6ZT0iNjQiIHR5cGU9InVpbnQ2NCIvPgorICA8cmVnIG5hbWU9InI1IiBiaXRzaXplPSI2NCIgdHlwZT0idWludDY0Ii8+CisgIDxyZWcgbmFtZT0icjYiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyNyIgYml0c2l6ZT0iNjQiIHR5cGU9InVpbnQ2NCIvPgorICA8cmVnIG5hbWU9InI4IiBiaXRzaXplPSI2NCIgdHlwZT0idWludDY0Ii8+CisgIDxyZWcgbmFtZT0icjkiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTAiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTEiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTIiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTMiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTQiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTUiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTYiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTciIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTgiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMTkiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjAiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjEiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjIiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjMiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjQiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjUiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjYiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjciIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjgiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMjkiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMzAiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJyMzEiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKworICA8cmVnIG5hbWU9InBjIiBiaXRzaXplPSI2NCIgdHlwZT0iY29kZV9wdHIiIHJlZ251bT0iNjQiLz4KKyAgPHJlZyBuYW1lPSJtc3IiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJjciIgYml0c2l6ZT0iMzIiIHR5cGU9InVpbnQzMiIvPgorICA8cmVnIG5hbWU9ImxyIiBiaXRzaXplPSI2NCIgdHlwZT0iY29kZV9wdHIiLz4KKyAgPHJlZyBuYW1lPSJjdHIiIGJpdHNpemU9IjY0IiB0eXBlPSJ1aW50NjQiLz4KKyAgPHJlZyBuYW1lPSJ4ZXIiIGJpdHNpemU9IjMyIiB0eXBlPSJ1aW50MzIiLz4KKzwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvZ2Ric3R1Yi5jIGIvYW5kcm9pZC9xZW11MS9nZGJzdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4NGQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvZ2Ric3R1Yi5jCkBAIC0wLDAgKzEsMjQ0OCBAQAorLyoKKyAqIGdkYiBzZXJ2ZXIgc3R1YgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaWZkZWYgQ09ORklHX1VTRVJfT05MWQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAicWVtdS5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisjZWxzZQorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImV4ZWMvZ2Ric3R1Yi5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9QQUNLRVRfTEVOR1RIIDQwOTYKKworI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgorI2luY2x1ZGUgInN5c2VtdS9rdm0uaCIKKworCitlbnVtIHsKKyAgICBHREJfU0lHTkFMXzAgPSAwLAorICAgIEdEQl9TSUdOQUxfSU5UID0gMiwKKyAgICBHREJfU0lHTkFMX1RSQVAgPSA1LAorICAgIEdEQl9TSUdOQUxfVU5LTk9XTiA9IDE0MworfTsKKworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKworLyogTWFwIHRhcmdldCBzaWduYWwgbnVtYmVycyB0byBHREIgcHJvdG9jb2wgc2lnbmFsIG51bWJlcnMgYW5kIHZpY2UKKyAqIHZlcnNhLiAgRm9yIHVzZXIgZW11bGF0aW9uJ3MgY3VycmVudGx5IHN1cHBvcnRlZCBzeXN0ZW1zLCB3ZSBjYW4KKyAqIGFzc3VtZSBtb3N0IHNpZ25hbHMgYXJlIGRlZmluZWQuCisgKi8KKworc3RhdGljIGludCBnZGJfc2lnbmFsX3RhYmxlW10gPSB7CisgICAgMCwKKyAgICBUQVJHRVRfU0lHSFVQLAorICAgIFRBUkdFVF9TSUdJTlQsCisgICAgVEFSR0VUX1NJR1FVSVQsCisgICAgVEFSR0VUX1NJR0lMTCwKKyAgICBUQVJHRVRfU0lHVFJBUCwKKyAgICBUQVJHRVRfU0lHQUJSVCwKKyAgICAtMSwgLyogU0lHRU1UICovCisgICAgVEFSR0VUX1NJR0ZQRSwKKyAgICBUQVJHRVRfU0lHS0lMTCwKKyAgICBUQVJHRVRfU0lHQlVTLAorICAgIFRBUkdFVF9TSUdTRUdWLAorICAgIFRBUkdFVF9TSUdTWVMsCisgICAgVEFSR0VUX1NJR1BJUEUsCisgICAgVEFSR0VUX1NJR0FMUk0sCisgICAgVEFSR0VUX1NJR1RFUk0sCisgICAgVEFSR0VUX1NJR1VSRywKKyAgICBUQVJHRVRfU0lHU1RPUCwKKyAgICBUQVJHRVRfU0lHVFNUUCwKKyAgICBUQVJHRVRfU0lHQ09OVCwKKyAgICBUQVJHRVRfU0lHQ0hMRCwKKyAgICBUQVJHRVRfU0lHVFRJTiwKKyAgICBUQVJHRVRfU0lHVFRPVSwKKyAgICBUQVJHRVRfU0lHSU8sCisgICAgVEFSR0VUX1NJR1hDUFUsCisgICAgVEFSR0VUX1NJR1hGU1osCisgICAgVEFSR0VUX1NJR1ZUQUxSTSwKKyAgICBUQVJHRVRfU0lHUFJPRiwKKyAgICBUQVJHRVRfU0lHV0lOQ0gsCisgICAgLTEsIC8qIFNJR0xPU1QgKi8KKyAgICBUQVJHRVRfU0lHVVNSMSwKKyAgICBUQVJHRVRfU0lHVVNSMiwKKyNpZmRlZiBUQVJHRVRfU0lHUFdSCisgICAgVEFSR0VUX1NJR1BXUiwKKyNlbHNlCisgICAgLTEsCisjZW5kaWYKKyAgICAtMSwgLyogU0lHUE9MTCAqLworICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorI2lmZGVmIF9fU0lHUlRNSU4KKyAgICBfX1NJR1JUTUlOICsgMSwKKyAgICBfX1NJR1JUTUlOICsgMiwKKyAgICBfX1NJR1JUTUlOICsgMywKKyAgICBfX1NJR1JUTUlOICsgNCwKKyAgICBfX1NJR1JUTUlOICsgNSwKKyAgICBfX1NJR1JUTUlOICsgNiwKKyAgICBfX1NJR1JUTUlOICsgNywKKyAgICBfX1NJR1JUTUlOICsgOCwKKyAgICBfX1NJR1JUTUlOICsgOSwKKyAgICBfX1NJR1JUTUlOICsgMTAsCisgICAgX19TSUdSVE1JTiArIDExLAorICAgIF9fU0lHUlRNSU4gKyAxMiwKKyAgICBfX1NJR1JUTUlOICsgMTMsCisgICAgX19TSUdSVE1JTiArIDE0LAorICAgIF9fU0lHUlRNSU4gKyAxNSwKKyAgICBfX1NJR1JUTUlOICsgMTYsCisgICAgX19TSUdSVE1JTiArIDE3LAorICAgIF9fU0lHUlRNSU4gKyAxOCwKKyAgICBfX1NJR1JUTUlOICsgMTksCisgICAgX19TSUdSVE1JTiArIDIwLAorICAgIF9fU0lHUlRNSU4gKyAyMSwKKyAgICBfX1NJR1JUTUlOICsgMjIsCisgICAgX19TSUdSVE1JTiArIDIzLAorICAgIF9fU0lHUlRNSU4gKyAyNCwKKyAgICBfX1NJR1JUTUlOICsgMjUsCisgICAgX19TSUdSVE1JTiArIDI2LAorICAgIF9fU0lHUlRNSU4gKyAyNywKKyAgICBfX1NJR1JUTUlOICsgMjgsCisgICAgX19TSUdSVE1JTiArIDI5LAorICAgIF9fU0lHUlRNSU4gKyAzMCwKKyAgICBfX1NJR1JUTUlOICsgMzEsCisgICAgLTEsIC8qIFNJR0NBTkNFTCAqLworICAgIF9fU0lHUlRNSU4sCisgICAgX19TSUdSVE1JTiArIDMyLAorICAgIF9fU0lHUlRNSU4gKyAzMywKKyAgICBfX1NJR1JUTUlOICsgMzQsCisgICAgX19TSUdSVE1JTiArIDM1LAorICAgIF9fU0lHUlRNSU4gKyAzNiwKKyAgICBfX1NJR1JUTUlOICsgMzcsCisgICAgX19TSUdSVE1JTiArIDM4LAorICAgIF9fU0lHUlRNSU4gKyAzOSwKKyAgICBfX1NJR1JUTUlOICsgNDAsCisgICAgX19TSUdSVE1JTiArIDQxLAorICAgIF9fU0lHUlRNSU4gKyA0MiwKKyAgICBfX1NJR1JUTUlOICsgNDMsCisgICAgX19TSUdSVE1JTiArIDQ0LAorICAgIF9fU0lHUlRNSU4gKyA0NSwKKyAgICBfX1NJR1JUTUlOICsgNDYsCisgICAgX19TSUdSVE1JTiArIDQ3LAorICAgIF9fU0lHUlRNSU4gKyA0OCwKKyAgICBfX1NJR1JUTUlOICsgNDksCisgICAgX19TSUdSVE1JTiArIDUwLAorICAgIF9fU0lHUlRNSU4gKyA1MSwKKyAgICBfX1NJR1JUTUlOICsgNTIsCisgICAgX19TSUdSVE1JTiArIDUzLAorICAgIF9fU0lHUlRNSU4gKyA1NCwKKyAgICBfX1NJR1JUTUlOICsgNTUsCisgICAgX19TSUdSVE1JTiArIDU2LAorICAgIF9fU0lHUlRNSU4gKyA1NywKKyAgICBfX1NJR1JUTUlOICsgNTgsCisgICAgX19TSUdSVE1JTiArIDU5LAorICAgIF9fU0lHUlRNSU4gKyA2MCwKKyAgICBfX1NJR1JUTUlOICsgNjEsCisgICAgX19TSUdSVE1JTiArIDYyLAorICAgIF9fU0lHUlRNSU4gKyA2MywKKyAgICBfX1NJR1JUTUlOICsgNjQsCisgICAgX19TSUdSVE1JTiArIDY1LAorICAgIF9fU0lHUlRNSU4gKyA2NiwKKyAgICBfX1NJR1JUTUlOICsgNjcsCisgICAgX19TSUdSVE1JTiArIDY4LAorICAgIF9fU0lHUlRNSU4gKyA2OSwKKyAgICBfX1NJR1JUTUlOICsgNzAsCisgICAgX19TSUdSVE1JTiArIDcxLAorICAgIF9fU0lHUlRNSU4gKyA3MiwKKyAgICBfX1NJR1JUTUlOICsgNzMsCisgICAgX19TSUdSVE1JTiArIDc0LAorICAgIF9fU0lHUlRNSU4gKyA3NSwKKyAgICBfX1NJR1JUTUlOICsgNzYsCisgICAgX19TSUdSVE1JTiArIDc3LAorICAgIF9fU0lHUlRNSU4gKyA3OCwKKyAgICBfX1NJR1JUTUlOICsgNzksCisgICAgX19TSUdSVE1JTiArIDgwLAorICAgIF9fU0lHUlRNSU4gKyA4MSwKKyAgICBfX1NJR1JUTUlOICsgODIsCisgICAgX19TSUdSVE1JTiArIDgzLAorICAgIF9fU0lHUlRNSU4gKyA4NCwKKyAgICBfX1NJR1JUTUlOICsgODUsCisgICAgX19TSUdSVE1JTiArIDg2LAorICAgIF9fU0lHUlRNSU4gKyA4NywKKyAgICBfX1NJR1JUTUlOICsgODgsCisgICAgX19TSUdSVE1JTiArIDg5LAorICAgIF9fU0lHUlRNSU4gKyA5MCwKKyAgICBfX1NJR1JUTUlOICsgOTEsCisgICAgX19TSUdSVE1JTiArIDkyLAorICAgIF9fU0lHUlRNSU4gKyA5MywKKyAgICBfX1NJR1JUTUlOICsgOTQsCisgICAgX19TSUdSVE1JTiArIDk1LAorICAgIC0xLCAvKiBTSUdJTkZPICovCisgICAgLTEsIC8qIFVOS05PV04gKi8KKyAgICAtMSwgLyogREVGQVVMVCAqLworICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xLAorICAgIC0xCisjZW5kaWYKK307CisjZWxzZQorLyogSW4gc3lzdGVtIG1vZGUgd2Ugb25seSBuZWVkIFNJR0lOVCBhbmQgU0lHVFJBUDsgb3RoZXIgc2lnbmFscworICAgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiAgKi8KKworZW51bSB7CisgICAgVEFSR0VUX1NJR0lOVCA9IDIsCisgICAgVEFSR0VUX1NJR1RSQVAgPSA1Cit9OworCitzdGF0aWMgaW50IGdkYl9zaWduYWxfdGFibGVbXSA9IHsKKyAgICAtMSwKKyAgICAtMSwKKyAgICBUQVJHRVRfU0lHSU5ULAorICAgIC0xLAorICAgIC0xLAorICAgIFRBUkdFVF9TSUdUUkFQCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCitzdGF0aWMgaW50IHRhcmdldF9zaWduYWxfdG9fZ2RiIChpbnQgc2lnKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChnZGJfc2lnbmFsX3RhYmxlKTsgaSsrKQorICAgICAgICBpZiAoZ2RiX3NpZ25hbF90YWJsZVtpXSA9PSBzaWcpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gR0RCX1NJR05BTF9VTktOT1dOOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2RiX3NpZ25hbF90b190YXJnZXQgKGludCBzaWcpCit7CisgICAgaWYgKHNpZyA8IEFSUkFZX1NJWkUgKGdkYl9zaWduYWxfdGFibGUpKQorICAgICAgICByZXR1cm4gZ2RiX3NpZ25hbF90YWJsZVtzaWddOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCisvLyNkZWZpbmUgREVCVUdfR0RCCisKK3R5cGVkZWYgc3RydWN0IEdEQlJlZ2lzdGVyU3RhdGUgeworICAgIGludCBiYXNlX3JlZzsKKyAgICBpbnQgbnVtX3JlZ3M7CisgICAgZ2RiX3JlZ19jYiBnZXRfcmVnOworICAgIGdkYl9yZWdfY2Igc2V0X3JlZzsKKyAgICBjb25zdCBjaGFyICp4bWw7CisgICAgc3RydWN0IEdEQlJlZ2lzdGVyU3RhdGUgKm5leHQ7Cit9IEdEQlJlZ2lzdGVyU3RhdGU7CisKK2VudW0gUlNTdGF0ZSB7CisgICAgUlNfSU5BQ1RJVkUsCisgICAgUlNfSURMRSwKKyAgICBSU19HRVRMSU5FLAorICAgIFJTX0NIS1NVTTEsCisgICAgUlNfQ0hLU1VNMiwKKyAgICBSU19TWVNDQUxMLAorfTsKK3R5cGVkZWYgc3RydWN0IEdEQlN0YXRlIHsKKyAgICBDUFVBcmNoU3RhdGUgKmNfY3B1OyAvKiBjdXJyZW50IENQVSBmb3Igc3RlcC9jb250aW51ZSBvcHMgKi8KKyAgICBDUFVBcmNoU3RhdGUgKmdfY3B1OyAvKiBjdXJyZW50IENQVSBmb3Igb3RoZXIgb3BzICovCisgICAgQ1BVQXJjaFN0YXRlICpxdWVyeV9jcHU7IC8qIGZvciBxe2Z8c31UaHJlYWRJbmZvICovCisgICAgZW51bSBSU1N0YXRlIHN0YXRlOyAvKiBwYXJzaW5nIHN0YXRlICovCisgICAgY2hhciBsaW5lX2J1ZltNQVhfUEFDS0VUX0xFTkdUSF07CisgICAgaW50IGxpbmVfYnVmX2luZGV4OworICAgIGludCBsaW5lX2NzdW07CisgICAgdWludDhfdCBsYXN0X3BhY2tldFtNQVhfUEFDS0VUX0xFTkdUSCArIDRdOworICAgIGludCBsYXN0X3BhY2tldF9sZW47CisgICAgaW50IHNpZ25hbDsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgaW50IGZkOworICAgIGludCBydW5uaW5nX3N0YXRlOworI2Vsc2UKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKm1vbl9jaHI7CisjZW5kaWYKK30gR0RCU3RhdGU7CisKKy8qIEJ5IGRlZmF1bHQgdXNlIG5vIElSUXMgYW5kIG5vIHRpbWVycyB3aGlsZSBzaW5nbGUgc3RlcHBpbmcgc28gYXMgdG8KKyAqIG1ha2Ugc2luZ2xlIHN0ZXBwaW5nIGxpa2UgYW4gSUNFIEhXIHN0ZXAuCisgKi8KK3N0YXRpYyBpbnQgc3N0ZXBfZmxhZ3MgPSBTU1RFUF9FTkFCTEV8U1NURVBfTk9JUlF8U1NURVBfTk9USU1FUjsKKworc3RhdGljIEdEQlN0YXRlICpnZGJzZXJ2ZXJfc3RhdGU7CisKKy8qIFRoaXMgaXMgYW4gdWdseSBoYWNrIHRvIGNvcGUgd2l0aCBib3RoIG5ldyBhbmQgb2xkIGdkYi4KKyAgIElmIGdkYiBzZW5kcyBxWGZlcjpmZWF0dXJlczpyZWFkIHRoZW4gYXNzdW1lIHdlJ3JlIHRhbGtpbmcgdG8gYSBuZXdpc2gKKyAgIGdkYiB0aGF0IHVuZGVyc3RhbmRzIHRhcmdldCBkZXNjcmlwdGlvbnMuICAqLworc3RhdGljIGludCBnZGJfaGFzX3htbDsKKworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKy8qIFhYWDogVGhpcyBpcyBub3QgdGhyZWFkIHNhZmUuICBEbyB3ZSBjYXJlPyAgKi8KK3N0YXRpYyBpbnQgZ2Ric2VydmVyX2ZkID0gLTE7CisKK3N0YXRpYyBpbnQgZ2V0X2NoYXIoR0RCU3RhdGUgKnMpCit7CisgICAgdWludDhfdCBjaDsKKyAgICBpbnQgcmV0OworCisgICAgZm9yKDs7KSB7CisgICAgICAgIHJldCA9IHJlY3Yocy0+ZmQsICZjaCwgMSwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUNPTk5SRVNFVCkKKyAgICAgICAgICAgICAgICBzLT5mZCA9IC0xOworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGNsb3NlKHMtPmZkKTsKKyAgICAgICAgICAgIHMtPmZkID0gLTE7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2g7Cit9CisjZW5kaWYKKworc3RhdGljIGdkYl9zeXNjYWxsX2NvbXBsZXRlX2NiIGdkYl9jdXJyZW50X3N5c2NhbGxfY2I7CisKK3N0YXRpYyBlbnVtIHsKKyAgICBHREJfU1lTX1VOS05PV04sCisgICAgR0RCX1NZU19FTkFCTEVELAorICAgIEdEQl9TWVNfRElTQUJMRUQsCit9IGdkYl9zeXNjYWxsX21vZGU7CisKKy8qIElmIGdkYiBpcyBjb25uZWN0ZWQgd2hlbiB0aGUgZmlyc3Qgc2VtaWhvc3Rpbmcgc3lzY2FsbCBvY2N1cnMgdGhlbiB1c2UKKyAgIHJlbW90ZSBnZGIgc3lzY2FsbHMuICBPdGhlcndpc2UgdXNlIG5hdGl2ZSBmaWxlIElPLiAgKi8KK2ludCB1c2VfZ2RiX3N5c2NhbGxzKHZvaWQpCit7CisgICAgaWYgKGdkYl9zeXNjYWxsX21vZGUgPT0gR0RCX1NZU19VTktOT1dOKSB7CisgICAgICAgIGdkYl9zeXNjYWxsX21vZGUgPSAoZ2Ric2VydmVyX3N0YXRlID8gR0RCX1NZU19FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR0RCX1NZU19ESVNBQkxFRCk7CisgICAgfQorICAgIHJldHVybiBnZGJfc3lzY2FsbF9tb2RlID09IEdEQl9TWVNfRU5BQkxFRDsKK30KKworLyogUmVzdW1lIGV4ZWN1dGlvbi4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2RiX2NvbnRpbnVlKEdEQlN0YXRlICpzKQoreworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICBzLT5ydW5uaW5nX3N0YXRlID0gMTsKKyNlbHNlCisgICAgdm1fc3RhcnQoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwdXRfYnVmZmVyKEdEQlN0YXRlICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisjaWZkZWYgQ09ORklHX1VTRVJfT05MWQorICAgIGludCByZXQ7CisKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICByZXQgPSBzZW5kKHMtPmZkLCBidWYsIGxlbiwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgICAgICBsZW4gLT0gcmV0OworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBxZW11X2Nocl93cml0ZShzLT5jaHIsIGJ1ZiwgbGVuKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBmcm9taGV4KGludCB2KQoreworICAgIGlmICh2ID49ICcwJyAmJiB2IDw9ICc5JykKKyAgICAgICAgcmV0dXJuIHYgLSAnMCc7CisgICAgZWxzZSBpZiAodiA+PSAnQScgJiYgdiA8PSAnRicpCisgICAgICAgIHJldHVybiB2IC0gJ0EnICsgMTA7CisgICAgZWxzZSBpZiAodiA+PSAnYScgJiYgdiA8PSAnZicpCisgICAgICAgIHJldHVybiB2IC0gJ2EnICsgMTA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdG9oZXgoaW50IHYpCit7CisgICAgaWYgKHYgPCAxMCkKKyAgICAgICAgcmV0dXJuIHYgKyAnMCc7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gdiAtIDEwICsgJ2EnOworfQorCitzdGF0aWMgdm9pZCBtZW10b2hleChjaGFyICpidWYsIGNvbnN0IHVpbnQ4X3QgKm1lbSwgaW50IGxlbikKK3sKKyAgICBpbnQgaSwgYzsKKyAgICBjaGFyICpxOworICAgIHEgPSBidWY7CisgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgYyA9IG1lbVtpXTsKKyAgICAgICAgKnErKyA9IHRvaGV4KGMgPj4gNCk7CisgICAgICAgICpxKysgPSB0b2hleChjICYgMHhmKTsKKyAgICB9CisgICAgKnEgPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBoZXh0b21lbSh1aW50OF90ICptZW0sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIG1lbVtpXSA9IChmcm9taGV4KGJ1ZlswXSkgPDwgNCkgfCBmcm9taGV4KGJ1ZlsxXSk7CisgICAgICAgIGJ1ZiArPSAyOworICAgIH0KK30KKworLyogcmV0dXJuIC0xIGlmIGVycm9yLCAwIGlmIE9LICovCitzdGF0aWMgaW50IHB1dF9wYWNrZXRfYmluYXJ5KEdEQlN0YXRlICpzLCBjb25zdCBjaGFyICpidWYsIGludCBsZW4pCit7CisgICAgaW50IGNzdW0sIGk7CisgICAgdWludDhfdCAqcDsKKworICAgIGZvcig7OykgeworICAgICAgICBwID0gcy0+bGFzdF9wYWNrZXQ7CisgICAgICAgICoocCsrKSA9ICckJzsKKyAgICAgICAgbWVtY3B5KHAsIGJ1ZiwgbGVuKTsKKyAgICAgICAgcCArPSBsZW47CisgICAgICAgIGNzdW0gPSAwOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgY3N1bSArPSBidWZbaV07CisgICAgICAgIH0KKyAgICAgICAgKihwKyspID0gJyMnOworICAgICAgICAqKHArKykgPSB0b2hleCgoY3N1bSA+PiA0KSAmIDB4Zik7CisgICAgICAgICoocCsrKSA9IHRvaGV4KChjc3VtKSAmIDB4Zik7CisKKyAgICAgICAgcy0+bGFzdF9wYWNrZXRfbGVuID0gcCAtIHMtPmxhc3RfcGFja2V0OworICAgICAgICBwdXRfYnVmZmVyKHMsICh1aW50OF90ICopcy0+bGFzdF9wYWNrZXQsIHMtPmxhc3RfcGFja2V0X2xlbik7CisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIGkgPSBnZXRfY2hhcihzKTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA9PSAnKycpCisgICAgICAgICAgICBicmVhazsKKyNlbHNlCisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiByZXR1cm4gLTEgaWYgZXJyb3IsIDAgaWYgT0sgKi8KK3N0YXRpYyBpbnQgcHV0X3BhY2tldChHREJTdGF0ZSAqcywgY29uc3QgY2hhciAqYnVmKQoreworI2lmZGVmIERFQlVHX0dEQgorICAgIHByaW50ZigicmVwbHk9JyVzJ1xuIiwgYnVmKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHB1dF9wYWNrZXRfYmluYXJ5KHMsIGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCisvKiBUaGUgR0RCIHJlbW90ZSBwcm90b2NvbCB0cmFuc2ZlcnMgdmFsdWVzIGluIHRhcmdldCBieXRlIG9yZGVyLiAgVGhpcyBtZWFucworICAgd2UgY2FuIHVzZSB0aGUgcmF3IG1lbW9yeSBhY2Nlc3Mgcm91dGluZXMgdG8gYWNjZXNzIHRoZSB2YWx1ZSBidWZmZXIuCisgICBDb252ZW5pZW50bHksIHRoZXNlIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgaXMgbWlzLWFsaWduZWQuCisgKi8KKyNkZWZpbmUgR0VUX1JFRzgodmFsKSBkbyB7IFwKKyAgICBzdGJfcChtZW1fYnVmLCB2YWwpOyBcCisgICAgcmV0dXJuIDE7IFwKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIEdFVF9SRUcxNih2YWwpIGRvIHsgXAorICAgIHN0d19wKG1lbV9idWYsIHZhbCk7IFwKKyAgICByZXR1cm4gMjsgXAorICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgR0VUX1JFRzMyKHZhbCkgZG8geyBcCisgICAgc3RsX3AobWVtX2J1ZiwgdmFsKTsgXAorICAgIHJldHVybiA0OyBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBHRVRfUkVHNjQodmFsKSBkbyB7IFwKKyAgICBzdHFfcChtZW1fYnVmLCB2YWwpOyBcCisgICAgcmV0dXJuIDg7IFwKKyAgICB9IHdoaWxlKDApCisKKyNpZiBUQVJHRVRfTE9OR19CSVRTID09IDY0CisjZGVmaW5lIEdFVF9SRUdMKHZhbCkgR0VUX1JFRzY0KHZhbCkKKyNkZWZpbmUgbGR0dWxfcChhZGRyKSBsZHFfcChhZGRyKQorI2Vsc2UKKyNkZWZpbmUgR0VUX1JFR0wodmFsKSBHRVRfUkVHMzIodmFsKQorI2RlZmluZSBsZHR1bF9wKGFkZHIpIGxkbF9wKGFkZHIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoVEFSR0VUX0kzODYpCisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgY29uc3QgaW50IGdwcl9tYXBbMTZdID0geworICAgIFJfRUFYLCBSX0VCWCwgUl9FQ1gsIFJfRURYLCBSX0VTSSwgUl9FREksIFJfRUJQLCBSX0VTUCwKKyAgICA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Cit9OworI2Vsc2UKK3N0YXRpYyBjb25zdCBpbnQgZ3ByX21hcFs4XSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3fTsKKyNlbmRpZgorCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgKENQVV9OQl9SRUdTICogMiArIDI1KQorCitzdGF0aWMgaW50IGNwdV9nZGJfcmVhZF9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgaWYgKG4gPCBDUFVfTkJfUkVHUykgeworICAgICAgICBHRVRfUkVHTChlbnYtPnJlZ3NbZ3ByX21hcFtuXV0pOworICAgIH0gZWxzZSBpZiAobiA+PSBDUFVfTkJfUkVHUyArIDggJiYgbiA8IENQVV9OQl9SRUdTICsgMTYpIHsKKyAgICAgICAgLyogRklYTUU6IGJ5dGVzd2FwIGZsb2F0IHZhbHVlcy4gICovCisjaWZkZWYgVVNFX1g4NkxET1VCTEUKKyAgICAgICAgbWVtY3B5KG1lbV9idWYsICZlbnYtPmZwcmVnc1tuIC0gKENQVV9OQl9SRUdTICsgOCldLCAxMCk7CisjZWxzZQorICAgICAgICBtZW1zZXQobWVtX2J1ZiwgMCwgMTApOworI2VuZGlmCisgICAgICAgIHJldHVybiAxMDsKKyAgICB9IGVsc2UgaWYgKG4gPj0gQ1BVX05CX1JFR1MgKyAyNCkgeworICAgICAgICBuIC09IENQVV9OQl9SRUdTICsgMjQ7CisgICAgICAgIGlmIChuIDwgQ1BVX05CX1JFR1MpIHsKKyAgICAgICAgICAgIHN0cV9wKG1lbV9idWYsIGVudi0+eG1tX3JlZ3Nbbl0uWE1NX1EoMCkpOworICAgICAgICAgICAgc3RxX3AobWVtX2J1ZiArIDgsIGVudi0+eG1tX3JlZ3Nbbl0uWE1NX1EoMSkpOworICAgICAgICAgICAgcmV0dXJuIDE2OworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gQ1BVX05CX1JFR1MpIHsKKyAgICAgICAgICAgIEdFVF9SRUczMihlbnYtPm14Y3NyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG4gLT0gQ1BVX05CX1JFR1M7CisgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICBjYXNlIDA6IEdFVF9SRUdMKGVudi0+ZWlwKTsKKyAgICAgICAgY2FzZSAxOiBHRVRfUkVHMzIoZW52LT5lZmxhZ3MpOworICAgICAgICBjYXNlIDI6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICBjYXNlIDM6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9TU10uc2VsZWN0b3IpOworICAgICAgICBjYXNlIDQ6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9EU10uc2VsZWN0b3IpOworICAgICAgICBjYXNlIDU6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9FU10uc2VsZWN0b3IpOworICAgICAgICBjYXNlIDY6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9GU10uc2VsZWN0b3IpOworICAgICAgICBjYXNlIDc6IEdFVF9SRUczMihlbnYtPnNlZ3NbUl9HU10uc2VsZWN0b3IpOworICAgICAgICAvKiA4Li4uMTUgeDg3IHJlZ3MuICAqLworICAgICAgICBjYXNlIDE2OiBHRVRfUkVHMzIoZW52LT5mcHVjKTsKKyAgICAgICAgY2FzZSAxNzogR0VUX1JFRzMyKChlbnYtPmZwdXMgJiB+MHgzODAwKSB8IChlbnYtPmZwc3R0ICYgMHg3KSA8PCAxMSk7CisgICAgICAgIGNhc2UgMTg6IEdFVF9SRUczMigwKTsgLyogZnRhZyAqLworICAgICAgICBjYXNlIDE5OiBHRVRfUkVHMzIoMCk7IC8qIGZpc2VnICovCisgICAgICAgIGNhc2UgMjA6IEdFVF9SRUczMigwKTsgLyogZmlvZmYgKi8KKyAgICAgICAgY2FzZSAyMTogR0VUX1JFRzMyKDApOyAvKiBmb3NlZyAqLworICAgICAgICBjYXNlIDIyOiBHRVRfUkVHMzIoMCk7IC8qIGZvb2ZmICovCisgICAgICAgIGNhc2UgMjM6IEdFVF9SRUczMigwKTsgLyogZm9wICovCisgICAgICAgIC8qIDI0KyB4bW0gcmVncy4gICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IGkpCit7CisgICAgdWludDMyX3QgdG1wOworCisgICAgaWYgKGkgPCBDUFVfTkJfUkVHUykgeworICAgICAgICBlbnYtPnJlZ3NbZ3ByX21hcFtpXV0gPSBsZHR1bF9wKG1lbV9idWYpOworICAgICAgICByZXR1cm4gc2l6ZW9mKHRhcmdldF91bG9uZyk7CisgICAgfSBlbHNlIGlmIChpID49IENQVV9OQl9SRUdTICsgOCAmJiBpIDwgQ1BVX05CX1JFR1MgKyAxNikgeworICAgICAgICBpIC09IENQVV9OQl9SRUdTICsgODsKKyNpZmRlZiBVU0VfWDg2TERPVUJMRQorICAgICAgICBtZW1jcHkoJmVudi0+ZnByZWdzW2ldLCBtZW1fYnVmLCAxMCk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDEwOworICAgIH0gZWxzZSBpZiAoaSA+PSBDUFVfTkJfUkVHUyArIDI0KSB7CisgICAgICAgIGkgLT0gQ1BVX05CX1JFR1MgKyAyNDsKKyAgICAgICAgaWYgKGkgPCBDUFVfTkJfUkVHUykgeworICAgICAgICAgICAgZW52LT54bW1fcmVnc1tpXS5YTU1fUSgwKSA9IGxkcV9wKG1lbV9idWYpOworICAgICAgICAgICAgZW52LT54bW1fcmVnc1tpXS5YTU1fUSgxKSA9IGxkcV9wKG1lbV9idWYgKyA4KTsKKyAgICAgICAgICAgIHJldHVybiAxNjsKKyAgICAgICAgfSBlbHNlIGlmIChpID09IENQVV9OQl9SRUdTKSB7CisgICAgICAgICAgICBlbnYtPm14Y3NyID0gbGRsX3AobWVtX2J1Zik7CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGkgLT0gQ1BVX05CX1JFR1M7CisgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIDA6IGVudi0+ZWlwID0gbGR0dWxfcChtZW1fYnVmKTsgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgICAgICBjYXNlIDE6IGVudi0+ZWZsYWdzID0gbGRsX3AobWVtX2J1Zik7IHJldHVybiA0OworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNkZWZpbmUgTE9BRF9TRUcoaW5kZXgsIHNyZWcpXAorICAgICAgICAgICAgdG1wID0gbGRsX3AobWVtX2J1Zik7XAorICAgICAgICAgICAgaWYgKHRtcCAhPSBlbnYtPnNlZ3Nbc3JlZ10uc2VsZWN0b3IpXAorICAgICAgICAgICAgICAgIGNwdV94ODZfbG9hZF9zZWcoZW52LCBzcmVnLCB0bXApOworI2Vsc2UKKy8qIEZJWE1FOiBIb25vciBzZWdtZW50IHJlZ2lzdGVycy4gIE5lZWRzIHRvIGF2b2lkIHJhaXNpbmcgYW4gZXhjZXB0aW9uCisgICB3aGVuIHRoZSBzZWxlY3RvciBpcyBpbnZhbGlkLiAgKi8KKyNkZWZpbmUgTE9BRF9TRUcoaW5kZXgsIHNyZWcpIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKyAgICAgICAgY2FzZSAyOiBMT0FEX1NFRygxMCwgUl9DUyk7IHJldHVybiA0OworICAgICAgICBjYXNlIDM6IExPQURfU0VHKDExLCBSX1NTKTsgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgNDogTE9BRF9TRUcoMTIsIFJfRFMpOyByZXR1cm4gNDsKKyAgICAgICAgY2FzZSA1OiBMT0FEX1NFRygxMywgUl9FUyk7IHJldHVybiA0OworICAgICAgICBjYXNlIDY6IExPQURfU0VHKDE0LCBSX0ZTKTsgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgNzogTE9BRF9TRUcoMTUsIFJfR1MpOyByZXR1cm4gNDsKKyAgICAgICAgLyogOC4uLjE1IHg4NyByZWdzLiAgKi8KKyAgICAgICAgY2FzZSAxNjogZW52LT5mcHVjID0gbGRsX3AobWVtX2J1Zik7IHJldHVybiA0OworICAgICAgICBjYXNlIDE3OgorICAgICAgICAgICAgICAgICB0bXAgPSBsZGxfcChtZW1fYnVmKTsKKyAgICAgICAgICAgICAgICAgZW52LT5mcHN0dCA9ICh0bXAgPj4gMTEpICYgNzsKKyAgICAgICAgICAgICAgICAgZW52LT5mcHVzID0gdG1wICYgfjB4MzgwMDsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgMTg6IC8qIGZ0YWcgKi8gcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgMTk6IC8qIGZpc2VnICovIHJldHVybiA0OworICAgICAgICBjYXNlIDIwOiAvKiBmaW9mZiAqLyByZXR1cm4gNDsKKyAgICAgICAgY2FzZSAyMTogLyogZm9zZWcgKi8gcmV0dXJuIDQ7CisgICAgICAgIGNhc2UgMjI6IC8qIGZvb2ZmICovIHJldHVybiA0OworICAgICAgICBjYXNlIDIzOiAvKiBmb3AgKi8gcmV0dXJuIDQ7CisgICAgICAgIC8qIDI0KyB4bW0gcmVncy4gICovCisgICAgICAgIH0KKyAgICB9CisgICAgLyogVW5yZWNvZ25pc2VkIHJlZ2lzdGVyLiAgKi8KKyAgICByZXR1cm4gMDsKK30KKworI2VsaWYgZGVmaW5lZCAoVEFSR0VUX1BQQykKKworLyogT2xkIGdkYiBhbHdheXMgZXhwZWN0cyBGUCByZWdpc3RlcnMuICBOZXdlciAoeG1sLWF3YXJlKSBnZGIgb25seQorICAgZXhwZWN0cyB3aGF0ZXZlciB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uIGNvbnRhaW5zLiAgRHVlIHRvIGEKKyAgIGhpc3RvcmljYWwgbWlzaGFwIHRoZSBGUCByZWdpc3RlcnMgYXBwZWFyIGluIGJldHdlZW4gY29yZSBpbnRlZ2VyCisgICByZWdzIGFuZCBQQywgTVNSLCBDUiwgYW5kIHNvIGZvcnRoLiAgV2UgaGFjayByb3VuZCB0aGlzIGJ5IGdpdmluZyB0aGUKKyAgIEZQIHJlZ3MgemVybyBzaXplIHdoZW4gdGFsa2luZyB0byBhIG5ld2VyIGdkYi4gICovCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgNzEKKyNpZiBkZWZpbmVkIChUQVJHRVRfUFBDNjQpCisjZGVmaW5lIEdEQl9DT1JFX1hNTCAicG93ZXI2NC1jb3JlLnhtbCIKKyNlbHNlCisjZGVmaW5lIEdEQl9DT1JFX1hNTCAicG93ZXItY29yZS54bWwiCisjZW5kaWYKKworc3RhdGljIGludCBjcHVfZ2RiX3JlYWRfcmVnaXN0ZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQ4X3QgKm1lbV9idWYsIGludCBuKQoreworICAgIGlmIChuIDwgMzIpIHsKKyAgICAgICAgLyogZ3BycyAqLworICAgICAgICBHRVRfUkVHTChlbnYtPmdwcltuXSk7CisgICAgfSBlbHNlIGlmIChuIDwgNjQpIHsKKyAgICAgICAgLyogZnBycyAqLworICAgICAgICBpZiAoZ2RiX2hhc194bWwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RmcV9wKG1lbV9idWYsIGVudi0+ZnByW24tMzJdKTsKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgIGNhc2UgNjQ6IEdFVF9SRUdMKGVudi0+bmlwKTsKKyAgICAgICAgY2FzZSA2NTogR0VUX1JFR0woZW52LT5tc3IpOworICAgICAgICBjYXNlIDY2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNyID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBjciB8PSBlbnYtPmNyZltpXSA8PCAoMzIgLSAoKGkgKyAxKSAqIDQpKTsKKyAgICAgICAgICAgICAgICBHRVRfUkVHMzIoY3IpOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDY3OiBHRVRfUkVHTChlbnYtPmxyKTsKKyAgICAgICAgY2FzZSA2ODogR0VUX1JFR0woZW52LT5jdHIpOworICAgICAgICBjYXNlIDY5OiBHRVRfUkVHTChlbnYtPnhlcik7CisgICAgICAgIGNhc2UgNzA6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGdkYl9oYXNfeG1sKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBHRVRfUkVHMzIoMCk7IC8qIGZwc2NyICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgaWYgKG4gPCAzMikgeworICAgICAgICAvKiBncHJzICovCisgICAgICAgIGVudi0+Z3ByW25dID0gbGR0dWxfcChtZW1fYnVmKTsKKyAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgIH0gZWxzZSBpZiAobiA8IDY0KSB7CisgICAgICAgIC8qIGZwcnMgKi8KKyAgICAgICAgaWYgKGdkYl9oYXNfeG1sKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVudi0+ZnByW24tMzJdID0gbGRmcV9wKG1lbV9idWYpOworICAgICAgICByZXR1cm4gODsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG4pIHsKKyAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgIGVudi0+bmlwID0gbGR0dWxfcChtZW1fYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YodGFyZ2V0X3Vsb25nKTsKKyAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgIHBwY19zdG9yZV9tc3IoZW52LCBsZHR1bF9wKG1lbV9idWYpKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YodGFyZ2V0X3Vsb25nKTsKKyAgICAgICAgY2FzZSA2NjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjciA9IGxkbF9wKG1lbV9idWYpOworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGVudi0+Y3JmW2ldID0gKGNyID4+ICgzMiAtICgoaSArIDEpICogNCkpKSAmIDB4RjsKKyAgICAgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSA2NzoKKyAgICAgICAgICAgIGVudi0+bHIgPSBsZHR1bF9wKG1lbV9idWYpOworICAgICAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgICAgICBjYXNlIDY4OgorICAgICAgICAgICAgZW52LT5jdHIgPSBsZHR1bF9wKG1lbV9idWYpOworICAgICAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgICAgICBjYXNlIDY5OgorICAgICAgICAgICAgZW52LT54ZXIgPSBsZHR1bF9wKG1lbV9idWYpOworICAgICAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgICAgICBjYXNlIDcwOgorICAgICAgICAgICAgLyogZnBzY3IgKi8KKyAgICAgICAgICAgIGlmIChnZGJfaGFzX3htbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZWxpZiBkZWZpbmVkIChUQVJHRVRfU1BBUkMpCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9TUEFSQzY0KSAmJiAhZGVmaW5lZChUQVJHRVRfQUJJMzIpCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgODYKKyNlbHNlCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgNzIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX0FCSTMyCisjZGVmaW5lIEdFVF9SRUdBKHZhbCkgR0VUX1JFRzMyKHZhbCkKKyNlbHNlCisjZGVmaW5lIEdFVF9SRUdBKHZhbCkgR0VUX1JFR0wodmFsKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY3B1X2dkYl9yZWFkX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgbikKK3sKKyAgICBpZiAobiA8IDgpIHsKKyAgICAgICAgLyogZzAuLmc3ICovCisgICAgICAgIEdFVF9SRUdBKGVudi0+Z3JlZ3Nbbl0pOworICAgIH0KKyAgICBpZiAobiA8IDMyKSB7CisgICAgICAgIC8qIHJlZ2lzdGVyIHdpbmRvdyAqLworICAgICAgICBHRVRfUkVHQShlbnYtPnJlZ3dwdHJbbiAtIDhdKTsKKyAgICB9CisjaWYgZGVmaW5lZChUQVJHRVRfQUJJMzIpIHx8ICFkZWZpbmVkKFRBUkdFVF9TUEFSQzY0KQorICAgIGlmIChuIDwgNjQpIHsKKyAgICAgICAgLyogZnBycyAqLworICAgICAgICBHRVRfUkVHMzIoKigodWludDMyX3QgKikmZW52LT5mcHJbbiAtIDMyXSkpOworICAgIH0KKyAgICAvKiBZLCBQU1IsIFdJTSwgVEJSLCBQQywgTlBDLCBGUFNSLCBDUFNSICovCisgICAgc3dpdGNoIChuKSB7CisgICAgY2FzZSA2NDogR0VUX1JFR0EoZW52LT55KTsKKyAgICBjYXNlIDY1OiBHRVRfUkVHQShHRVRfUFNSKGVudikpOworICAgIGNhc2UgNjY6IEdFVF9SRUdBKGVudi0+d2ltKTsKKyAgICBjYXNlIDY3OiBHRVRfUkVHQShlbnYtPnRicik7CisgICAgY2FzZSA2ODogR0VUX1JFR0EoZW52LT5wYyk7CisgICAgY2FzZSA2OTogR0VUX1JFR0EoZW52LT5ucGMpOworICAgIGNhc2UgNzA6IEdFVF9SRUdBKGVudi0+ZnNyKTsKKyAgICBjYXNlIDcxOiBHRVRfUkVHQSgwKTsgLyogY3NyICovCisgICAgZGVmYXVsdDogR0VUX1JFR0EoMCk7CisgICAgfQorI2Vsc2UKKyAgICBpZiAobiA8IDY0KSB7CisgICAgICAgIC8qIGYwLWYzMSAqLworICAgICAgICBHRVRfUkVHMzIoKigodWludDMyX3QgKikmZW52LT5mcHJbbiAtIDMyXSkpOworICAgIH0KKyAgICBpZiAobiA8IDgwKSB7CisgICAgICAgIC8qIGYzMi1mNjIgKGRvdWJsZSB3aWR0aCwgZXZlbiBudW1iZXJzIG9ubHkpICovCisgICAgICAgIHVpbnQ2NF90IHZhbDsKKworICAgICAgICB2YWwgPSAodWludDY0X3QpKigodWludDMyX3QgKikmZW52LT5mcHJbKG4gLSA2NCkgKiAyICsgMzJdKSA8PCAzMjsKKyAgICAgICAgdmFsIHw9ICooKHVpbnQzMl90ICopJmVudi0+ZnByWyhuIC0gNjQpICogMiArIDMzXSk7CisgICAgICAgIEdFVF9SRUc2NCh2YWwpOworICAgIH0KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDgwOiBHRVRfUkVHTChlbnYtPnBjKTsKKyAgICBjYXNlIDgxOiBHRVRfUkVHTChlbnYtPm5wYyk7CisgICAgY2FzZSA4MjogR0VUX1JFR0woKCh1aW50NjRfdClHRVRfQ0NSKGVudikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZW52LT5hc2kgJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlbnYtPnBzdGF0ZSAmIDB4ZmZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfQ1dQNjQoZW52KSk7CisgICAgY2FzZSA4MzogR0VUX1JFR0woZW52LT5mc3IpOworICAgIGNhc2UgODQ6IEdFVF9SRUdMKGVudi0+ZnBycyk7CisgICAgY2FzZSA4NTogR0VUX1JFR0woZW52LT55KTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVfZ2RiX3dyaXRlX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgbikKK3sKKyNpZiBkZWZpbmVkKFRBUkdFVF9BQkkzMikKKyAgICBhYmlfdWxvbmcgdG1wOworCisgICAgdG1wID0gbGRsX3AobWVtX2J1Zik7CisjZWxzZQorICAgIHRhcmdldF91bG9uZyB0bXA7CisKKyAgICB0bXAgPSBsZHR1bF9wKG1lbV9idWYpOworI2VuZGlmCisKKyAgICBpZiAobiA8IDgpIHsKKyAgICAgICAgLyogZzAuLmc3ICovCisgICAgICAgIGVudi0+Z3JlZ3Nbbl0gPSB0bXA7CisgICAgfSBlbHNlIGlmIChuIDwgMzIpIHsKKyAgICAgICAgLyogcmVnaXN0ZXIgd2luZG93ICovCisgICAgICAgIGVudi0+cmVnd3B0cltuIC0gOF0gPSB0bXA7CisgICAgfQorI2lmIGRlZmluZWQoVEFSR0VUX0FCSTMyKSB8fCAhZGVmaW5lZChUQVJHRVRfU1BBUkM2NCkKKyAgICBlbHNlIGlmIChuIDwgNjQpIHsKKyAgICAgICAgLyogZnBycyAqLworICAgICAgICAqKCh1aW50MzJfdCAqKSZlbnYtPmZwcltuIC0gMzJdKSA9IHRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBZLCBQU1IsIFdJTSwgVEJSLCBQQywgTlBDLCBGUFNSLCBDUFNSICovCisgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICBjYXNlIDY0OiBlbnYtPnkgPSB0bXA7IGJyZWFrOworICAgICAgICBjYXNlIDY1OiBQVVRfUFNSKGVudiwgdG1wKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNjY6IGVudi0+d2ltID0gdG1wOyBicmVhazsKKyAgICAgICAgY2FzZSA2NzogZW52LT50YnIgPSB0bXA7IGJyZWFrOworICAgICAgICBjYXNlIDY4OiBlbnYtPnBjID0gdG1wOyBicmVhazsKKyAgICAgICAgY2FzZSA2OTogZW52LT5ucGMgPSB0bXA7IGJyZWFrOworICAgICAgICBjYXNlIDcwOiBlbnYtPmZzciA9IHRtcDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA0OworI2Vsc2UKKyAgICBlbHNlIGlmIChuIDwgNjQpIHsKKyAgICAgICAgLyogZjAtZjMxICovCisgICAgICAgIGVudi0+ZnByW25dID0gbGRmbF9wKG1lbV9idWYpOworICAgICAgICByZXR1cm4gNDsKKyAgICB9IGVsc2UgaWYgKG4gPCA4MCkgeworICAgICAgICAvKiBmMzItZjYyIChkb3VibGUgd2lkdGgsIGV2ZW4gbnVtYmVycyBvbmx5KSAqLworICAgICAgICAqKCh1aW50MzJfdCAqKSZlbnYtPmZwclsobiAtIDY0KSAqIDIgKyAzMl0pID0gdG1wID4+IDMyOworICAgICAgICAqKCh1aW50MzJfdCAqKSZlbnYtPmZwclsobiAtIDY0KSAqIDIgKyAzM10pID0gdG1wOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICBjYXNlIDgwOiBlbnYtPnBjID0gdG1wOyBicmVhazsKKyAgICAgICAgY2FzZSA4MTogZW52LT5ucGMgPSB0bXA7IGJyZWFrOworICAgICAgICBjYXNlIDgyOgorCSAgICBQVVRfQ0NSKGVudiwgdG1wID4+IDMyKTsKKwkgICAgZW52LT5hc2kgPSAodG1wID4+IDI0KSAmIDB4ZmY7CisJICAgIGVudi0+cHN0YXRlID0gKHRtcCA+PiA4KSAmIDB4ZmZmOworCSAgICBQVVRfQ1dQNjQoZW52LCB0bXAgJiAweGZmKTsKKwkgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODM6IGVudi0+ZnNyID0gdG1wOyBicmVhazsKKyAgICAgICAgY2FzZSA4NDogZW52LT5mcHJzID0gdG1wOyBicmVhazsKKyAgICAgICAgY2FzZSA4NTogZW52LT55ID0gdG1wOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDg7CisjZW5kaWYKK30KKyNlbGlmIGRlZmluZWQgKFRBUkdFVF9BUk0pCisKKy8qIE9sZCBnZGIgYWx3YXlzIGV4cGVjdCBGUEEgcmVnaXN0ZXJzLiAgTmV3ZXIgKHhtbC1hd2FyZSkgZ2RiIG9ubHkgZXhwZWN0CisgICB3aGF0ZXZlciB0aGUgdGFyZ2V0IGRlc2NyaXB0aW9uIGNvbnRhaW5zLiAgRHVlIHRvIGEgaGlzdG9yaWNhbCBtaXNoYXAKKyAgIHRoZSBGUEEgcmVnaXN0ZXJzIGFwcGVhciBpbiBiZXR3ZWVuIGNvcmUgaW50ZWdlciByZWdzIGFuZCB0aGUgQ1BTUi4KKyAgIFdlIGhhY2sgcm91bmQgdGhpcyBieSBnaXZpbmcgdGhlIEZQQSByZWdzIHplcm8gc2l6ZSB3aGVuIHRhbGtpbmcgdG8gYQorICAgbmV3ZXIgZ2RiLiAgKi8KKyNkZWZpbmUgTlVNX0NPUkVfUkVHUyAyNgorI2RlZmluZSBHREJfQ09SRV9YTUwgImFybS1jb3JlLnhtbCIKKworc3RhdGljIGludCBjcHVfZ2RiX3JlYWRfcmVnaXN0ZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQ4X3QgKm1lbV9idWYsIGludCBuKQoreworICAgIGlmIChuIDwgMTYpIHsKKyAgICAgICAgLyogQ29yZSBpbnRlZ2VyIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgR0VUX1JFRzMyKGVudi0+cmVnc1tuXSk7CisgICAgfQorICAgIGlmIChuIDwgMjQpIHsKKyAgICAgICAgLyogRlBBIHJlZ2lzdGVycy4gICovCisgICAgICAgIGlmIChnZGJfaGFzX3htbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtZW1zZXQobWVtX2J1ZiwgMCwgMTIpOworICAgICAgICByZXR1cm4gMTI7CisgICAgfQorICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMjQ6CisgICAgICAgIC8qIEZQQSBzdGF0dXMgcmVnaXN0ZXIuICAqLworICAgICAgICBpZiAoZ2RiX2hhc194bWwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgR0VUX1JFRzMyKDApOworICAgIGNhc2UgMjU6CisgICAgICAgIC8qIENQU1IgKi8KKyAgICAgICAgR0VUX1JFRzMyKGNwc3JfcmVhZChlbnYpKTsKKyAgICB9CisgICAgLyogVW5rbm93biByZWdpc3Rlci4gICovCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgdWludDMyX3QgdG1wOworCisgICAgdG1wID0gbGRsX3AobWVtX2J1Zik7CisKKyAgICAvKiBNYXNrIG91dCBsb3cgYml0IG9mIFBDIHRvIHdvcmthcm91bmQgZ2RiIGJ1Z3MuICBUaGlzIHdpbGwgcHJvYmFibHkKKyAgICAgICBjYXVzZSBwcm9ibGVtcyBpZiB3ZSBldmVyIGltcGxlbWVudCB0aGUgSmF6ZWxsZSBEQlggZXh0ZW5zaW9ucy4gICovCisgICAgaWYgKG4gPT0gMTUpCisgICAgICAgIHRtcCAmPSB+MTsKKworICAgIGlmIChuIDwgMTYpIHsKKyAgICAgICAgLyogQ29yZSBpbnRlZ2VyIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgZW52LT5yZWdzW25dID0gdG1wOworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAgaWYgKG4gPCAyNCkgeyAvKiAxNi0yMyAqLworICAgICAgICAvKiBGUEEgcmVnaXN0ZXJzIChpZ25vcmVkKS4gICovCisgICAgICAgIGlmIChnZGJfaGFzX3htbCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTI7CisgICAgfQorICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMjQ6CisgICAgICAgIC8qIEZQQSBzdGF0dXMgcmVnaXN0ZXIgKGlnbm9yZWQpLiAgKi8KKyAgICAgICAgaWYgKGdkYl9oYXNfeG1sKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiA0OworICAgIGNhc2UgMjU6CisgICAgICAgIC8qIENQU1IgKi8KKyAgICAgICAgY3Bzcl93cml0ZSAoZW52LCB0bXAsIDB4ZmZmZmZmZmYpOworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisgICAgLyogVW5rbm93biByZWdpc3Rlci4gICovCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQgKFRBUkdFVF9NNjhLKQorCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgMTgKKworI2RlZmluZSBHREJfQ09SRV9YTUwgImNmLWNvcmUueG1sIgorCitzdGF0aWMgaW50IGNwdV9nZGJfcmVhZF9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgaWYgKG4gPCA4KSB7CisgICAgICAgIC8qIEQwLUQ3ICovCisgICAgICAgIEdFVF9SRUczMihlbnYtPmRyZWdzW25dKTsKKyAgICB9IGVsc2UgaWYgKG4gPCAxNikgeworICAgICAgICAvKiBBMC1BNyAqLworICAgICAgICBHRVRfUkVHMzIoZW52LT5hcmVnc1tuIC0gOF0pOworICAgIH0gZWxzZSB7CisJc3dpdGNoIChuKSB7CisgICAgICAgIGNhc2UgMTY6IEdFVF9SRUczMihlbnYtPnNyKTsKKyAgICAgICAgY2FzZSAxNzogR0VUX1JFRzMyKGVudi0+cGMpOworICAgICAgICB9CisgICAgfQorICAgIC8qIEZQIHJlZ2lzdGVycyBub3QgaW5jbHVkZWQgaGVyZSBiZWNhdXNlIHRoZXkgdmFyeSBiZXR3ZWVuCisgICAgICAgQ29sZEZpcmUgYW5kIG02OGsuICBVc2UgWE1MIGJpdHMgZm9yIHRoZXNlLiAgKi8KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVfZ2RiX3dyaXRlX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgbikKK3sKKyAgICB1aW50MzJfdCB0bXA7CisKKyAgICB0bXAgPSBsZGxfcChtZW1fYnVmKTsKKworICAgIGlmIChuIDwgOCkgeworICAgICAgICAvKiBEMC1ENyAqLworICAgICAgICBlbnYtPmRyZWdzW25dID0gdG1wOworICAgIH0gZWxzZSBpZiAobiA8IDgpIHsKKyAgICAgICAgLyogQTAtQTcgKi8KKyAgICAgICAgZW52LT5hcmVnc1tuIC0gOF0gPSB0bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgIGNhc2UgMTY6IGVudi0+c3IgPSB0bXA7IGJyZWFrOworICAgICAgICBjYXNlIDE3OiBlbnYtPnBjID0gdG1wOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDQ7Cit9CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfTUlQUykKKworI2RlZmluZSBOVU1fQ09SRV9SRUdTIDczCisKK3N0YXRpYyBpbnQgY3B1X2dkYl9yZWFkX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgbikKK3sKKyAgICBpZiAobiA8IDMyKSB7CisgICAgICAgIEdFVF9SRUdMKGVudi0+YWN0aXZlX3RjLmdwcltuXSk7CisgICAgfQorICAgIGlmIChlbnYtPkNQMF9Db25maWcxICYgKDEgPDwgQ1AwQzFfRlApKSB7CisgICAgICAgIGlmIChuID49IDM4ICYmIG4gPCA3MCkgeworICAgICAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0ZSKSkKKwkJR0VUX1JFR0woZW52LT5hY3RpdmVfZnB1LmZwcltuIC0gMzhdLmQpOworICAgICAgICAgICAgZWxzZQorCQlHRVRfUkVHTChlbnYtPmFjdGl2ZV9mcHUuZnByW24gLSAzOF0ud1tGUF9FTkRJQU5fSURYXSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChuKSB7CisgICAgICAgIGNhc2UgNzA6IEdFVF9SRUdMKChpbnQzMl90KWVudi0+YWN0aXZlX2ZwdS5mY3IzMSk7CisgICAgICAgIGNhc2UgNzE6IEdFVF9SRUdMKChpbnQzMl90KWVudi0+YWN0aXZlX2ZwdS5mY3IwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDMyOiBHRVRfUkVHTCgoaW50MzJfdCllbnYtPkNQMF9TdGF0dXMpOworICAgIGNhc2UgMzM6IEdFVF9SRUdMKGVudi0+YWN0aXZlX3RjLkxPWzBdKTsKKyAgICBjYXNlIDM0OiBHRVRfUkVHTChlbnYtPmFjdGl2ZV90Yy5ISVswXSk7CisgICAgY2FzZSAzNTogR0VUX1JFR0woZW52LT5DUDBfQmFkVkFkZHIpOworICAgIGNhc2UgMzY6IEdFVF9SRUdMKChpbnQzMl90KWVudi0+Q1AwX0NhdXNlKTsKKyAgICBjYXNlIDM3OiBHRVRfUkVHTChlbnYtPmFjdGl2ZV90Yy5QQyk7CisgICAgY2FzZSA3MjogR0VUX1JFR0woMCk7IC8qIGZwICovCisgICAgY2FzZSA4OTogR0VUX1JFR0woKGludDMyX3QpZW52LT5DUDBfUFJpZCk7CisgICAgfQorICAgIGlmIChuID49IDczICYmIG4gPD0gODgpIHsKKwkvKiAxNiBlbWJlZGRlZCByZWdzLiAgKi8KKwlHRVRfUkVHTCgwKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogY29udmVydCBNSVBTIHJvdW5kaW5nIG1vZGUgaW4gRkNSMzEgdG8gSUVFRSBsaWJyYXJ5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcm1bXSA9CisgIHsKKyAgICBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4sCisgICAgZmxvYXRfcm91bmRfdG9femVybywKKyAgICBmbG9hdF9yb3VuZF91cCwKKyAgICBmbG9hdF9yb3VuZF9kb3duCisgIH07CisjZGVmaW5lIFJFU1RPUkVfUk9VTkRJTkdfTU9ERSBcCisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoaWVlZV9ybVtlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgJiAzXSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpCisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgdGFyZ2V0X3Vsb25nIHRtcDsKKworICAgIHRtcCA9IGxkdHVsX3AobWVtX2J1Zik7CisKKyAgICBpZiAobiA8IDMyKSB7CisgICAgICAgIGVudi0+YWN0aXZlX3RjLmdwcltuXSA9IHRtcDsKKyAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgIH0KKyAgICBpZiAoZW52LT5DUDBfQ29uZmlnMSAmICgxIDw8IENQMEMxX0ZQKQorICAgICAgICAgICAgJiYgbiA+PSAzOCAmJiBuIDwgNzMpIHsKKyAgICAgICAgaWYgKG4gPCA3MCkgeworICAgICAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0ZSKSkKKyAgICAgICAgICAgICAgZW52LT5hY3RpdmVfZnB1LmZwcltuIC0gMzhdLmQgPSB0bXA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVudi0+YWN0aXZlX2ZwdS5mcHJbbiAtIDM4XS53W0ZQX0VORElBTl9JRFhdID0gdG1wOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAobikgeworICAgICAgICBjYXNlIDcwOgorICAgICAgICAgICAgZW52LT5hY3RpdmVfZnB1LmZjcjMxID0gdG1wICYgMHhGRjgzRkZGRjsKKyAgICAgICAgICAgIC8qIHNldCByb3VuZGluZyBtb2RlICovCisgICAgICAgICAgICBSRVNUT1JFX1JPVU5ESU5HX01PREU7CisjaWZuZGVmIENPTkZJR19TT0ZURkxPQVQKKyAgICAgICAgICAgIC8qIG5vIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiBmb3IgbmF0aXZlIGZsb2F0ICovCisgICAgICAgICAgICBTRVRfRlBfRU5BQkxFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSwgMCk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDcxOiBlbnYtPmFjdGl2ZV9mcHUuZmNyMCA9IHRtcDsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworICAgIH0KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDMyOiBlbnYtPkNQMF9TdGF0dXMgPSB0bXA7IGJyZWFrOworICAgIGNhc2UgMzM6IGVudi0+YWN0aXZlX3RjLkxPWzBdID0gdG1wOyBicmVhazsKKyAgICBjYXNlIDM0OiBlbnYtPmFjdGl2ZV90Yy5ISVswXSA9IHRtcDsgYnJlYWs7CisgICAgY2FzZSAzNTogZW52LT5DUDBfQmFkVkFkZHIgPSB0bXA7IGJyZWFrOworICAgIGNhc2UgMzY6IGVudi0+Q1AwX0NhdXNlID0gdG1wOyBicmVhazsKKyAgICBjYXNlIDM3OiBlbnYtPmFjdGl2ZV90Yy5QQyA9IHRtcDsgYnJlYWs7CisgICAgY2FzZSA3MjogLyogZnAsIGlnbm9yZWQgKi8gYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZiAobiA+IDg5KQorCSAgICByZXR1cm4gMDsKKwkvKiBPdGhlciByZWdpc3RlcnMgYXJlIHJlYWRvbmx5LiAgSWdub3JlIHdyaXRlcy4gICovCisJYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHNpemVvZih0YXJnZXRfdWxvbmcpOworfQorI2VsaWYgZGVmaW5lZCAoVEFSR0VUX1NINCkKKworLyogSGludDogVXNlICJzZXQgYXJjaGl0ZWN0dXJlIHNoNCIgaW4gR0RCIHRvIHNlZSBmcHUgcmVnaXN0ZXJzICovCisvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSBYTUwgZm9yIHRoaXMuICAqLworCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgNTkKKworc3RhdGljIGludCBjcHVfZ2RiX3JlYWRfcmVnaXN0ZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQ4X3QgKm1lbV9idWYsIGludCBuKQoreworICAgIGlmIChuIDwgOCkgeworICAgICAgICBpZiAoKGVudi0+c3IgJiAoU1JfTUQgfCBTUl9SQikpID09IChTUl9NRCB8IFNSX1JCKSkgeworICAgICAgICAgICAgR0VUX1JFR0woZW52LT5ncmVnc1tuICsgMTZdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEdFVF9SRUdMKGVudi0+Z3JlZ3Nbbl0pOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChuIDwgMTYpIHsKKyAgICAgICAgR0VUX1JFR0woZW52LT5ncmVnc1tuIC0gOF0pOworICAgIH0gZWxzZSBpZiAobiA+PSAyNSAmJiBuIDwgNDEpIHsKKwlHRVRfUkVHTChlbnYtPmZyZWdzWyhuIC0gMjUpICsgKChlbnYtPmZwc2NyICYgRlBTQ1JfRlIpID8gMTYgOiAwKV0pOworICAgIH0gZWxzZSBpZiAobiA+PSA0MyAmJiBuIDwgNTEpIHsKKwlHRVRfUkVHTChlbnYtPmdyZWdzW24gLSA0M10pOworICAgIH0gZWxzZSBpZiAobiA+PSA1MSAmJiBuIDwgNTkpIHsKKwlHRVRfUkVHTChlbnYtPmdyZWdzW24gLSAoNTEgLSAxNildKTsKKyAgICB9CisgICAgc3dpdGNoIChuKSB7CisgICAgY2FzZSAxNjogR0VUX1JFR0woZW52LT5wYyk7CisgICAgY2FzZSAxNzogR0VUX1JFR0woZW52LT5wcik7CisgICAgY2FzZSAxODogR0VUX1JFR0woZW52LT5nYnIpOworICAgIGNhc2UgMTk6IEdFVF9SRUdMKGVudi0+dmJyKTsKKyAgICBjYXNlIDIwOiBHRVRfUkVHTChlbnYtPm1hY2gpOworICAgIGNhc2UgMjE6IEdFVF9SRUdMKGVudi0+bWFjbCk7CisgICAgY2FzZSAyMjogR0VUX1JFR0woZW52LT5zcik7CisgICAgY2FzZSAyMzogR0VUX1JFR0woZW52LT5mcHVsKTsKKyAgICBjYXNlIDI0OiBHRVRfUkVHTChlbnYtPmZwc2NyKTsKKyAgICBjYXNlIDQxOiBHRVRfUkVHTChlbnYtPnNzcik7CisgICAgY2FzZSA0MjogR0VUX1JFR0woZW52LT5zcGMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwdV9nZGJfd3JpdGVfcmVnaXN0ZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQ4X3QgKm1lbV9idWYsIGludCBuKQoreworICAgIHVpbnQzMl90IHRtcDsKKworICAgIHRtcCA9IGxkbF9wKG1lbV9idWYpOworCisgICAgaWYgKG4gPCA4KSB7CisgICAgICAgIGlmICgoZW52LT5zciAmIChTUl9NRCB8IFNSX1JCKSkgPT0gKFNSX01EIHwgU1JfUkIpKSB7CisgICAgICAgICAgICBlbnYtPmdyZWdzW24gKyAxNl0gPSB0bXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnYtPmdyZWdzW25dID0gdG1wOworICAgICAgICB9CisJcmV0dXJuIDQ7CisgICAgfSBlbHNlIGlmIChuIDwgMTYpIHsKKyAgICAgICAgZW52LT5ncmVnc1tuIC0gOF0gPSB0bXA7CisJcmV0dXJuIDQ7CisgICAgfSBlbHNlIGlmIChuID49IDI1ICYmIG4gPCA0MSkgeworCWVudi0+ZnJlZ3NbKG4gLSAyNSkgKyAoKGVudi0+ZnBzY3IgJiBGUFNDUl9GUikgPyAxNiA6IDApXSA9IHRtcDsKKyAgICB9IGVsc2UgaWYgKG4gPj0gNDMgJiYgbiA8IDUxKSB7CisJZW52LT5ncmVnc1tuIC0gNDNdID0gdG1wOworCXJldHVybiA0OworICAgIH0gZWxzZSBpZiAobiA+PSA1MSAmJiBuIDwgNTkpIHsKKwllbnYtPmdyZWdzW24gLSAoNTEgLSAxNildID0gdG1wOworCXJldHVybiA0OworICAgIH0KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDE2OiBlbnYtPnBjID0gdG1wOworICAgIGNhc2UgMTc6IGVudi0+cHIgPSB0bXA7CisgICAgY2FzZSAxODogZW52LT5nYnIgPSB0bXA7CisgICAgY2FzZSAxOTogZW52LT52YnIgPSB0bXA7CisgICAgY2FzZSAyMDogZW52LT5tYWNoID0gdG1wOworICAgIGNhc2UgMjE6IGVudi0+bWFjbCA9IHRtcDsKKyAgICBjYXNlIDIyOiBlbnYtPnNyID0gdG1wOworICAgIGNhc2UgMjM6IGVudi0+ZnB1bCA9IHRtcDsKKyAgICBjYXNlIDI0OiBlbnYtPmZwc2NyID0gdG1wOworICAgIGNhc2UgNDE6IGVudi0+c3NyID0gdG1wOworICAgIGNhc2UgNDI6IGVudi0+c3BjID0gdG1wOworICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiA0OworfQorI2VsaWYgZGVmaW5lZCAoVEFSR0VUX01JQ1JPQkxBWkUpCisKKyNkZWZpbmUgTlVNX0NPUkVfUkVHUyAoMzIgKyA1KQorCitzdGF0aWMgaW50IGNwdV9nZGJfcmVhZF9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgaWYgKG4gPCAzMikgeworCUdFVF9SRUczMihlbnYtPnJlZ3Nbbl0pOworICAgIH0gZWxzZSB7CisJR0VUX1JFRzMyKGVudi0+c3JlZ3NbbiAtIDMyXSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwdV9nZGJfd3JpdGVfcmVnaXN0ZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQ4X3QgKm1lbV9idWYsIGludCBuKQoreworICAgIHVpbnQzMl90IHRtcDsKKworICAgIGlmIChuID4gTlVNX0NPUkVfUkVHUykKKwlyZXR1cm4gMDsKKworICAgIHRtcCA9IGxkbF9wKG1lbV9idWYpOworCisgICAgaWYgKG4gPCAzMikgeworCWVudi0+cmVnc1tuXSA9IHRtcDsKKyAgICB9IGVsc2UgeworCWVudi0+c3JlZ3NbbiAtIDMyXSA9IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIDQ7Cit9CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfQ1JJUykKKworI2RlZmluZSBOVU1fQ09SRV9SRUdTIDQ5CisKK3N0YXRpYyBpbnQgY3B1X2dkYl9yZWFkX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgbikKK3sKKyAgICB1aW50OF90IHNyczsKKworICAgIHNycyA9IGVudi0+cHJlZ3NbUFJfU1JTXTsKKyAgICBpZiAobiA8IDE2KSB7CisJR0VUX1JFRzMyKGVudi0+cmVnc1tuXSk7CisgICAgfQorCisgICAgaWYgKG4gPj0gMjEgJiYgbiA8IDMyKSB7CisJR0VUX1JFRzMyKGVudi0+cHJlZ3NbbiAtIDE2XSk7CisgICAgfQorICAgIGlmIChuID49IDMzICYmIG4gPCA0OSkgeworCUdFVF9SRUczMihlbnYtPnNyZWdzW3Nyc11bbiAtIDMzXSk7CisgICAgfQorICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMTY6IEdFVF9SRUc4KGVudi0+cHJlZ3NbMF0pOworICAgIGNhc2UgMTc6IEdFVF9SRUc4KGVudi0+cHJlZ3NbMV0pOworICAgIGNhc2UgMTg6IEdFVF9SRUczMihlbnYtPnByZWdzWzJdKTsKKyAgICBjYXNlIDE5OiBHRVRfUkVHOChzcnMpOworICAgIGNhc2UgMjA6IEdFVF9SRUcxNihlbnYtPnByZWdzWzRdKTsKKyAgICBjYXNlIDMyOiBHRVRfUkVHMzIoZW52LT5wYyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgdWludDMyX3QgdG1wOworCisgICAgaWYgKG4gPiA0OSkKKwlyZXR1cm4gMDsKKworICAgIHRtcCA9IGxkbF9wKG1lbV9idWYpOworCisgICAgaWYgKG4gPCAxNikgeworCWVudi0+cmVnc1tuXSA9IHRtcDsKKyAgICB9CisKKyAgICBpZiAobiA+PSAyMSAmJiBuIDwgMzIpIHsKKwllbnYtPnByZWdzW24gLSAxNl0gPSB0bXA7CisgICAgfQorCisgICAgLyogRklYTUU6IFNob3VsZCBzdXBwb3J0IGZ1bmN0aW9uIHJlZ3MgYmUgd3JpdGFibGU/ICAqLworICAgIHN3aXRjaCAobikgeworICAgIGNhc2UgMTY6IHJldHVybiAxOworICAgIGNhc2UgMTc6IHJldHVybiAxOworICAgIGNhc2UgMTg6IGVudi0+cHJlZ3NbUFJfUElEXSA9IHRtcDsgYnJlYWs7CisgICAgY2FzZSAxOTogcmV0dXJuIDE7CisgICAgY2FzZSAyMDogcmV0dXJuIDI7CisgICAgY2FzZSAzMjogZW52LT5wYyA9IHRtcDsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDQ7Cit9CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfQUxQSEEpCisKKyNkZWZpbmUgTlVNX0NPUkVfUkVHUyA2NQorCitzdGF0aWMgaW50IGNwdV9nZGJfcmVhZF9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgaWYgKG4gPCAzMSkgeworICAgICAgIEdFVF9SRUdMKGVudi0+aXJbbl0pOworICAgIH0KKyAgICBlbHNlIGlmIChuID09IDMxKSB7CisgICAgICAgR0VUX1JFR0woMCk7CisgICAgfQorICAgIGVsc2UgaWYgKG48NjMpIHsKKyAgICAgICB1aW50NjRfdCB2YWw7CisKKyAgICAgICB2YWw9KigodWludDY0X3QgKikmZW52LT5maXJbbi0zMl0pOworICAgICAgIEdFVF9SRUdMKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKG49PTYzKSB7CisgICAgICAgR0VUX1JFR0woZW52LT5mcGNyKTsKKyAgICB9CisgICAgZWxzZSBpZiAobj09NjQpIHsKKyAgICAgICBHRVRfUkVHTChlbnYtPnBjKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgR0VUX1JFR0woMCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgdGFyZ2V0X3Vsb25nIHRtcDsKKyAgICB0bXAgPSBsZHR1bF9wKG1lbV9idWYpOworCisgICAgaWYgKG4gPCAzMSkgeworICAgICAgICBlbnYtPmlyW25dID0gdG1wOworICAgIH0KKworICAgIGlmIChuID4gMzEgJiYgbiA8IDYzKSB7CisgICAgICAgIGVudi0+ZmlyW24gLSAzMl0gPSBsZGZsX3AobWVtX2J1Zik7CisgICAgfQorCisgICAgaWYgKG4gPT0gNjQgKSB7CisgICAgICAgZW52LT5wYz10bXA7CisgICAgfQorCisgICAgcmV0dXJuIDg7Cit9CisjZWxzZQorCisjZGVmaW5lIE5VTV9DT1JFX1JFR1MgMAorCitzdGF0aWMgaW50IGNwdV9nZGJfcmVhZF9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2dkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IG4pCit7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IG51bV9nX3JlZ3MgPSBOVU1fQ09SRV9SRUdTOworCisjaWZkZWYgR0RCX0NPUkVfWE1MCisvKiBFbmNvZGUgZGF0YSB1c2luZyB0aGUgZW5jb2RpbmcgZm9yICd4JyBwYWNrZXRzLiAgKi8KK3N0YXRpYyBpbnQgbWVtdG94KGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqbWVtLCBpbnQgbGVuKQoreworICAgIGNoYXIgKnAgPSBidWY7CisgICAgY2hhciBjOworCisgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgIGMgPSAqKG1lbSsrKTsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJyMnOiBjYXNlICckJzogY2FzZSAnKic6IGNhc2UgJ30nOgorICAgICAgICAgICAgKihwKyspID0gJ30nOworICAgICAgICAgICAgKihwKyspID0gYyBeIDB4MjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICoocCsrKSA9IGM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9mZWF0dXJlX3htbChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICoqbmV3cCkKK3sKKyAgICBleHRlcm4gY29uc3QgY2hhciAqY29uc3QgeG1sX2J1aWx0aW5bXVsyXTsKKyAgICBzaXplX3QgbGVuOworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgc3RhdGljIGNoYXIgdGFyZ2V0X3htbFsxMDI0XTsKKworICAgIGxlbiA9IDA7CisgICAgd2hpbGUgKHBbbGVuXSAmJiBwW2xlbl0gIT0gJzonKQorICAgICAgICBsZW4rKzsKKyAgICAqbmV3cCA9IHAgKyBsZW47CisKKyAgICBuYW1lID0gTlVMTDsKKyAgICBpZiAoc3RybmNtcChwLCAidGFyZ2V0LnhtbCIsIGxlbikgPT0gMCkgeworICAgICAgICAvKiBHZW5lcmF0ZSB0aGUgWE1MIGRlc2NyaXB0aW9uIGZvciB0aGlzIENQVS4gICovCisgICAgICAgIGlmICghdGFyZ2V0X3htbFswXSkgeworICAgICAgICAgICAgR0RCUmVnaXN0ZXJTdGF0ZSAqcjsKKworICAgICAgICAgICAgc25wcmludGYodGFyZ2V0X3htbCwgc2l6ZW9mKHRhcmdldF94bWwpLAorICAgICAgICAgICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IgorICAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSB0YXJnZXQgU1lTVEVNIFwiZ2RiLXRhcmdldC5kdGRcIj4iCisgICAgICAgICAgICAgICAgICAgICAiPHRhcmdldD4iCisgICAgICAgICAgICAgICAgICAgICAiPHhpOmluY2x1ZGUgaHJlZj1cIiVzXCIvPiIsCisgICAgICAgICAgICAgICAgICAgICBHREJfQ09SRV9YTUwpOworCisgICAgICAgICAgICBmb3IgKHIgPSBRVEFJTFFfRklSU1QoJmNwdXMpLT5nZGJfcmVnczsgcjsgciA9IHItPm5leHQpIHsKKyAgICAgICAgICAgICAgICBwc3RyY2F0KHRhcmdldF94bWwsIHNpemVvZih0YXJnZXRfeG1sKSwgIjx4aTppbmNsdWRlIGhyZWY9XCIiKTsKKyAgICAgICAgICAgICAgICBwc3RyY2F0KHRhcmdldF94bWwsIHNpemVvZih0YXJnZXRfeG1sKSwgci0+eG1sKTsKKyAgICAgICAgICAgICAgICBwc3RyY2F0KHRhcmdldF94bWwsIHNpemVvZih0YXJnZXRfeG1sKSwgIlwiLz4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzdHJjYXQodGFyZ2V0X3htbCwgc2l6ZW9mKHRhcmdldF94bWwpLCAiPC90YXJnZXQ+Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRhcmdldF94bWw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisgICAgICAgIG5hbWUgPSB4bWxfYnVpbHRpbltpXVswXTsKKyAgICAgICAgaWYgKCFuYW1lIHx8IChzdHJuY21wKG5hbWUsIHAsIGxlbikgPT0gMCAmJiBzdHJsZW4obmFtZSkgPT0gbGVuKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbmFtZSA/IHhtbF9idWlsdGluW2ldWzFdIDogTlVMTDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdkYl9yZWFkX3JlZ2lzdGVyKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50OF90ICptZW1fYnVmLCBpbnQgcmVnKQoreworICAgIEdEQlJlZ2lzdGVyU3RhdGUgKnI7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICBpZiAocmVnIDwgTlVNX0NPUkVfUkVHUykKKyAgICAgICAgcmV0dXJuIGNwdV9nZGJfcmVhZF9yZWdpc3RlcihlbnYsIG1lbV9idWYsIHJlZyk7CisKKyAgICBmb3IgKHIgPSBjcHUtPmdkYl9yZWdzOyByOyByID0gci0+bmV4dCkgeworICAgICAgICBpZiAoci0+YmFzZV9yZWcgPD0gcmVnICYmIHJlZyA8IHItPmJhc2VfcmVnICsgci0+bnVtX3JlZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiByLT5nZXRfcmVnKGVudiwgbWVtX2J1ZiwgcmVnIC0gci0+YmFzZV9yZWcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdkYl93cml0ZV9yZWdpc3RlcihDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqbWVtX2J1ZiwgaW50IHJlZykKK3sKKyAgICBHREJSZWdpc3RlclN0YXRlICpyOworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworCisgICAgaWYgKHJlZyA8IE5VTV9DT1JFX1JFR1MpCisgICAgICAgIHJldHVybiBjcHVfZ2RiX3dyaXRlX3JlZ2lzdGVyKGVudiwgbWVtX2J1ZiwgcmVnKTsKKworICAgIGZvciAociA9IGNwdS0+Z2RiX3JlZ3M7IHI7IHIgPSByLT5uZXh0KSB7CisgICAgICAgIGlmIChyLT5iYXNlX3JlZyA8PSByZWcgJiYgcmVnIDwgci0+YmFzZV9yZWcgKyByLT5udW1fcmVncykgeworICAgICAgICAgICAgcmV0dXJuIHItPnNldF9yZWcoZW52LCBtZW1fYnVmLCByZWcgLSByLT5iYXNlX3JlZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlZ2lzdGVyIGEgc3VwcGxlbWVudGFsIHNldCBvZiBDUFUgcmVnaXN0ZXJzLiAgSWYgZ19wb3MgaXMgbm9uemVybyBpdAorICAgc3BlY2lmaWVzIHRoZSBmaXJzdCByZWdpc3RlciBudW1iZXIgYW5kIHRoZXNlIHJlZ2lzdGVycyBhcmUgaW5jbHVkZWQgaW4KKyAgIGEgc3RhbmRhcmQgImciIHBhY2tldC4gIERpcmVjdGlvbiBpcyByZWxhdGl2ZSB0byBnZGIsIGkuZS4gZ2V0X3JlZyBpcworICAgZ2RiIHJlYWRpbmcgYSBDUFUgcmVnaXN0ZXIsIGFuZCBzZXRfcmVnIGlzIGdkYiBtb2RpZnlpbmcgYSBDUFUgcmVnaXN0ZXIuCisgKi8KKwordm9pZCBnZGJfcmVnaXN0ZXJfY29wcm9jZXNzb3IoQ1BVU3RhdGUgKmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlZ19jYiBnZXRfcmVnLCBnZGJfcmVnX2NiIHNldF9yZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcmVncywgY29uc3QgY2hhciAqeG1sLCBpbnQgZ19wb3MpCit7CisgICAgR0RCUmVnaXN0ZXJTdGF0ZSAqczsKKyAgICBHREJSZWdpc3RlclN0YXRlICoqcDsKKyAgICBzdGF0aWMgaW50IGxhc3RfcmVnID0gTlVNX0NPUkVfUkVHUzsKKworICAgIHMgPSAoR0RCUmVnaXN0ZXJTdGF0ZSAqKWdfbWFsbG9jMChzaXplb2YoR0RCUmVnaXN0ZXJTdGF0ZSkpOworICAgIHMtPmJhc2VfcmVnID0gbGFzdF9yZWc7CisgICAgcy0+bnVtX3JlZ3MgPSBudW1fcmVnczsKKyAgICBzLT5nZXRfcmVnID0gZ2V0X3JlZzsKKyAgICBzLT5zZXRfcmVnID0gc2V0X3JlZzsKKyAgICBzLT54bWwgPSB4bWw7CisgICAgcCA9ICZjcHUtPmdkYl9yZWdzOworICAgIHdoaWxlICgqcCkgeworICAgICAgICAvKiBDaGVjayBmb3IgZHVwbGljYXRlcy4gICovCisgICAgICAgIGlmIChzdHJjbXAoKCpwKS0+eG1sLCB4bWwpID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHAgPSAmKCpwKS0+bmV4dDsKKyAgICB9CisgICAgLyogQWRkIHRvIGVuZCBvZiBsaXN0LiAgKi8KKyAgICBsYXN0X3JlZyArPSBudW1fcmVnczsKKyAgICAqcCA9IHM7CisgICAgaWYgKGdfcG9zKSB7CisgICAgICAgIGlmIChnX3BvcyAhPSBzLT5iYXNlX3JlZykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogQmFkIGdkYiByZWdpc3RlciBudW1iZXJpbmcgZm9yICclcydcbiIKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkICVkIGdvdCAlZFxuIiwgeG1sLCBnX3Bvcywgcy0+YmFzZV9yZWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX2dfcmVncyA9IGxhc3RfcmVnOworICAgICAgICB9CisgICAgfQorfQorCisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKK3N0YXRpYyBjb25zdCBpbnQgeGxhdF9nZGJfdHlwZVtdID0geworICAgIFtHREJfV0FUQ0hQT0lOVF9XUklURV0gID0gQlBfR0RCIHwgQlBfTUVNX1dSSVRFLAorICAgIFtHREJfV0FUQ0hQT0lOVF9SRUFEXSAgID0gQlBfR0RCIHwgQlBfTUVNX1JFQUQsCisgICAgW0dEQl9XQVRDSFBPSU5UX0FDQ0VTU10gPSBCUF9HREIgfCBCUF9NRU1fQUNDRVNTLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGdkYl9icmVha3BvaW50X2luc2VydCh0YXJnZXRfdWxvbmcgYWRkciwgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IHR5cGUpCit7CisgICAgQ1BVU3RhdGUgKmNwdTsKKyAgICBpbnQgZXJyID0gMDsKKworICAgIGlmIChrdm1fZW5hYmxlZCgpKQorICAgICAgICByZXR1cm4ga3ZtX2luc2VydF9icmVha3BvaW50KEVOVl9HRVRfQ1BVKGdkYnNlcnZlcl9zdGF0ZS0+Y19jcHUpLCBhZGRyLCBsZW4sIHR5cGUpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBHREJfQlJFQUtQT0lOVF9TVzoKKyAgICBjYXNlIEdEQl9CUkVBS1BPSU5UX0hXOgorICAgICAgICBDUFVfRk9SRUFDSChjcHUpIHsKKyAgICAgICAgICAgIGVyciA9IGNwdV9icmVha3BvaW50X2luc2VydChjcHUtPmVudl9wdHIsIGFkZHIsIEJQX0dEQiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICBjYXNlIEdEQl9XQVRDSFBPSU5UX1dSSVRFOgorICAgIGNhc2UgR0RCX1dBVENIUE9JTlRfUkVBRDoKKyAgICBjYXNlIEdEQl9XQVRDSFBPSU5UX0FDQ0VTUzoKKyAgICAgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgICAgICBlcnIgPSBjcHVfd2F0Y2hwb2ludF9pbnNlcnQoY3B1LT5lbnZfcHRyLCBhZGRyLCBsZW4sIHhsYXRfZ2RiX3R5cGVbdHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2RiX2JyZWFrcG9pbnRfcmVtb3ZlKHRhcmdldF91bG9uZyBhZGRyLCB0YXJnZXRfdWxvbmcgbGVuLCBpbnQgdHlwZSkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworICAgIGludCBlcnIgPSAwOworCisgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgIHJldHVybiBrdm1fcmVtb3ZlX2JyZWFrcG9pbnQoRU5WX0dFVF9DUFUoZ2Ric2VydmVyX3N0YXRlLT5jX2NwdSksIGFkZHIsIGxlbiwgdHlwZSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEdEQl9CUkVBS1BPSU5UX1NXOgorICAgIGNhc2UgR0RCX0JSRUFLUE9JTlRfSFc6CisgICAgICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICAgICAgZXJyID0gY3B1X2JyZWFrcG9pbnRfcmVtb3ZlKGNwdS0+ZW52X3B0ciwgYWRkciwgQlBfR0RCKTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgIGNhc2UgR0RCX1dBVENIUE9JTlRfV1JJVEU6CisgICAgY2FzZSBHREJfV0FUQ0hQT0lOVF9SRUFEOgorICAgIGNhc2UgR0RCX1dBVENIUE9JTlRfQUNDRVNTOgorICAgICAgICBDUFVfRk9SRUFDSChjcHUpIHsKKyAgICAgICAgICAgIGVyciA9IGNwdV93YXRjaHBvaW50X3JlbW92ZShjcHUtPmVudl9wdHIsIGFkZHIsIGxlbiwgeGxhdF9nZGJfdHlwZVt0eXBlXSk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkYl9icmVha3BvaW50X3JlbW92ZV9hbGwodm9pZCkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworCisgICAgaWYgKGt2bV9lbmFibGVkKCkpIHsKKyAgICAgICAga3ZtX3JlbW92ZV9hbGxfYnJlYWtwb2ludHMoRU5WX0dFVF9DUFUoZ2Ric2VydmVyX3N0YXRlLT5jX2NwdSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGNwdV9icmVha3BvaW50X3JlbW92ZV9hbGwoY3B1LT5lbnZfcHRyLCBCUF9HREIpOworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIGNwdV93YXRjaHBvaW50X3JlbW92ZV9hbGwoY3B1LT5lbnZfcHRyLCBCUF9HREIpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZGJfc2V0X2NwdV9wYyhHREJTdGF0ZSAqcywgdGFyZ2V0X3Vsb25nIHBjKQoreworI2lmIGRlZmluZWQoVEFSR0VUX0kzODYpCisgICAgcy0+Y19jcHUtPmVpcCA9IHBjOworICAgIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZShFTlZfR0VUX0NQVShzLT5jX2NwdSksIDEpOworI2VsaWYgZGVmaW5lZCAoVEFSR0VUX1BQQykKKyAgICBzLT5jX2NwdS0+bmlwID0gcGM7CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfU1BBUkMpCisgICAgcy0+Y19jcHUtPnBjID0gcGM7CisgICAgcy0+Y19jcHUtPm5wYyA9IHBjICsgNDsKKyNlbGlmIGRlZmluZWQgKFRBUkdFVF9BUk0pCisgICAgcy0+Y19jcHUtPnJlZ3NbMTVdID0gcGM7CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfU0g0KQorICAgIHMtPmNfY3B1LT5wYyA9IHBjOworI2VsaWYgZGVmaW5lZCAoVEFSR0VUX01JUFMpCisgICAgcy0+Y19jcHUtPmFjdGl2ZV90Yy5QQyA9IHBjOworI2VsaWYgZGVmaW5lZCAoVEFSR0VUX01JQ1JPQkxBWkUpCisgICAgcy0+Y19jcHUtPnNyZWdzW1NSX1BDXSA9IHBjOworI2VsaWYgZGVmaW5lZCAoVEFSR0VUX0NSSVMpCisgICAgcy0+Y19jcHUtPnBjID0gcGM7CisjZWxpZiBkZWZpbmVkIChUQVJHRVRfQUxQSEEpCisgICAgcy0+Y19jcHUtPnBjID0gcGM7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2RiX2lkKENQVVN0YXRlICpjcHUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKSAmJiBkZWZpbmVkKFVTRV9OUFRMKQorICAgIHJldHVybiBjcHUtPmhvc3RfdGlkOworI2Vsc2UKKyAgICByZXR1cm4gY3B1LT5jcHVfaW5kZXggKyAxOworI2VuZGlmCit9CisKK3N0YXRpYyBDUFVBcmNoU3RhdGUgKmZpbmRfY3B1KHVpbnQzMl90IHRocmVhZF9pZCkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGlmIChnZGJfaWQoY3B1KSA9PSB0aHJlYWRfaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBjcHUtPmVudl9wdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnZGJfaGFuZGxlX3BhY2tldChHREJTdGF0ZSAqcywgY29uc3QgY2hhciAqbGluZV9idWYpCit7CisgICAgQ1BVQXJjaFN0YXRlICplbnY7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICB1aW50MzJfdCB0aHJlYWQ7CisgICAgaW50IGNoLCByZWdfc2l6ZSwgdHlwZSwgcmVzOworICAgIGNoYXIgYnVmW01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICB1aW50OF90IG1lbV9idWZbTUFYX1BBQ0tFVF9MRU5HVEhdOworICAgIHVpbnQ4X3QgKnJlZ2lzdGVyczsKKyAgICB0YXJnZXRfdWxvbmcgYWRkciwgbGVuOworCisjaWZkZWYgREVCVUdfR0RCCisgICAgcHJpbnRmKCJjb21tYW5kPSclcydcbiIsIGxpbmVfYnVmKTsKKyNlbmRpZgorICAgIHAgPSBsaW5lX2J1ZjsKKyAgICBjaCA9ICpwKys7CisgICAgc3dpdGNoKGNoKSB7CisgICAgY2FzZSAnPyc6CisgICAgICAgIC8qIFRPRE86IE1ha2UgdGhpcyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHVzZXItbW9kZS4gICovCisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUJTAyeHRocmVhZDolMDJ4OyIsIEdEQl9TSUdOQUxfVFJBUCwKKyAgICAgICAgICAgICAgICAgZ2RiX2lkKEVOVl9HRVRfQ1BVKHMtPmNfY3B1KSkpOworICAgICAgICBwdXRfcGFja2V0KHMsIGJ1Zik7CisgICAgICAgIC8qIFJlbW92ZSBhbGwgdGhlIGJyZWFrcG9pbnRzIHdoZW4gdGhpcyBxdWVyeSBpcyBpc3N1ZWQsCisgICAgICAgICAqIGJlY2F1c2UgZ2RiIGlzIGRvaW5nIGFuZCBpbml0aWFsIGNvbm5lY3QgYW5kIHRoZSBzdGF0ZQorICAgICAgICAgKiBzaG91bGQgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICovCisgICAgICAgIGdkYl9icmVha3BvaW50X3JlbW92ZV9hbGwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgICAgIGlmICgqcCAhPSAnXDAnKSB7CisgICAgICAgICAgICBhZGRyID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgICAgIGdkYl9zZXRfY3B1X3BjKHMsIGFkZHIpOworICAgICAgICB9CisgICAgICAgIHMtPnNpZ25hbCA9IDA7CisgICAgICAgIGdkYl9jb250aW51ZShzKTsKKwlyZXR1cm4gUlNfSURMRTsKKyAgICBjYXNlICdDJzoKKyAgICAgICAgcy0+c2lnbmFsID0gZ2RiX3NpZ25hbF90b190YXJnZXQgKHN0cnRvdWwocCwgKGNoYXIgKiopJnAsIDE2KSk7CisgICAgICAgIGlmIChzLT5zaWduYWwgPT0gLTEpCisgICAgICAgICAgICBzLT5zaWduYWwgPSAwOworICAgICAgICBnZGJfY29udGludWUocyk7CisgICAgICAgIHJldHVybiBSU19JRExFOworICAgIGNhc2UgJ2snOgorICAgICAgICAvKiBLaWxsIHRoZSB0YXJnZXQgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblFFTVU6IFRlcm1pbmF0ZWQgdmlhIEdEQnN0dWJcbiIpOworICAgICAgICBleGl0KDApOworICAgIGNhc2UgJ0QnOgorICAgICAgICAvKiBEZXRhY2ggcGFja2V0ICovCisgICAgICAgIGdkYl9icmVha3BvaW50X3JlbW92ZV9hbGwoKTsKKyAgICAgICAgZ2RiX2NvbnRpbnVlKHMpOworICAgICAgICBwdXRfcGFja2V0KHMsICJPSyIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKCpwICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGFkZHIgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICAgICAgZ2RiX3NldF9jcHVfcGMocywgYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgY3B1X3NpbmdsZV9zdGVwKEVOVl9HRVRfQ1BVKHMtPmNfY3B1KSwgc3N0ZXBfZmxhZ3MpOworICAgICAgICBnZGJfY29udGludWUocyk7CisJcmV0dXJuIFJTX0lETEU7CisgICAgY2FzZSAnRic6CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldF91bG9uZyByZXQ7CisgICAgICAgICAgICB0YXJnZXRfdWxvbmcgZXJyOworCisgICAgICAgICAgICByZXQgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICAgICAgaWYgKCpwID09ICcsJykgeworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB0eXBlID0gKnA7CisgICAgICAgICAgICBpZiAoZ2RiX2N1cnJlbnRfc3lzY2FsbF9jYikKKyAgICAgICAgICAgICAgICBnZGJfY3VycmVudF9zeXNjYWxsX2NiKEVOVl9HRVRfQ1BVKHMtPmNfY3B1KSwgcmV0LCBlcnIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gJ0MnKSB7CisgICAgICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiVDAyIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdkYl9jb250aW51ZShzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdnJzoKKyAgICAgICAgY3B1X3N5bmNocm9uaXplX3N0YXRlKEVOVl9HRVRfQ1BVKHMtPmdfY3B1KSwgMCk7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBudW1fZ19yZWdzOyBhZGRyKyspIHsKKyAgICAgICAgICAgIHJlZ19zaXplID0gZ2RiX3JlYWRfcmVnaXN0ZXIocy0+Z19jcHUsIG1lbV9idWYgKyBsZW4sIGFkZHIpOworICAgICAgICAgICAgbGVuICs9IHJlZ19zaXplOworICAgICAgICB9CisgICAgICAgIG1lbXRvaGV4KGJ1ZiwgbWVtX2J1ZiwgbGVuKTsKKyAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdHJzoKKyAgICAgICAgcmVnaXN0ZXJzID0gbWVtX2J1ZjsKKyAgICAgICAgbGVuID0gc3RybGVuKHApIC8gMjsKKyAgICAgICAgaGV4dG9tZW0oKHVpbnQ4X3QgKilyZWdpc3RlcnMsIHAsIGxlbik7CisgICAgICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBudW1fZ19yZWdzICYmIGxlbiA+IDA7IGFkZHIrKykgeworICAgICAgICAgICAgcmVnX3NpemUgPSBnZGJfd3JpdGVfcmVnaXN0ZXIocy0+Z19jcHUsIHJlZ2lzdGVycywgYWRkcik7CisgICAgICAgICAgICBsZW4gLT0gcmVnX3NpemU7CisgICAgICAgICAgICByZWdpc3RlcnMgKz0gcmVnX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgY3B1X3N5bmNocm9uaXplX3N0YXRlKEVOVl9HRVRfQ1BVKHMtPmdfY3B1KSwgMSk7CisgICAgICAgIHB1dF9wYWNrZXQocywgIk9LIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOgorICAgICAgICBhZGRyID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgbGVuID0gc3RydG91bGwocCwgTlVMTCwgMTYpOworICAgICAgICBpZiAoY3B1X21lbW9yeV9yd19kZWJ1ZyhFTlZfR0VUX0NQVShzLT5nX2NwdSksIGFkZHIsIG1lbV9idWYsIGxlbiwgMCkgIT0gMCkgeworICAgICAgICAgICAgcHV0X3BhY2tldCAocywgIkUxNCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtdG9oZXgoYnVmLCBtZW1fYnVmLCBsZW4pOworICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgICAgICBhZGRyID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgbGVuID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgaWYgKCpwID09ICc6JykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaGV4dG9tZW0obWVtX2J1ZiwgcCwgbGVuKTsKKyAgICAgICAgaWYgKGNwdV9tZW1vcnlfcndfZGVidWcoRU5WX0dFVF9DUFUocy0+Z19jcHUpLCBhZGRyLCBtZW1fYnVmLCBsZW4sIDEpICE9IDApCisgICAgICAgICAgICBwdXRfcGFja2V0KHMsICJFMTQiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiT0siKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAncCc6CisgICAgICAgIC8qIE9sZGVyIGdkYiBhcmUgcmVhbGx5IGR1bWIsIGFuZCBkb24ndCB1c2UgJ2cnIGlmICdwJyBpcyBhdmFpYWxhYmxlLgorICAgICAgICAgICBUaGlzIHdvcmtzLCBidXQgY2FuIGJlIHZlcnkgc2xvdy4gIEFueXRoaW5nIG5ldyBlbm91Z2ggdG8KKyAgICAgICAgICAgdW5kZXJzdGFuZCBYTUwgYWxzbyBrbm93cyBob3cgdG8gdXNlIHRoaXMgcHJvcGVybHkuICAqLworICAgICAgICBpZiAoIWdkYl9oYXNfeG1sKQorICAgICAgICAgICAgZ290byB1bmtub3duX2NvbW1hbmQ7CisgICAgICAgIGFkZHIgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICByZWdfc2l6ZSA9IGdkYl9yZWFkX3JlZ2lzdGVyKHMtPmdfY3B1LCBtZW1fYnVmLCBhZGRyKTsKKyAgICAgICAgaWYgKHJlZ19zaXplKSB7CisgICAgICAgICAgICBtZW10b2hleChidWYsIG1lbV9idWYsIHJlZ19zaXplKTsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIkUxNCIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1AnOgorICAgICAgICBpZiAoIWdkYl9oYXNfeG1sKQorICAgICAgICAgICAgZ290byB1bmtub3duX2NvbW1hbmQ7CisgICAgICAgIGFkZHIgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICBpZiAoKnAgPT0gJz0nKQorICAgICAgICAgICAgcCsrOworICAgICAgICByZWdfc2l6ZSA9IHN0cmxlbihwKSAvIDI7CisgICAgICAgIGhleHRvbWVtKG1lbV9idWYsIHAsIHJlZ19zaXplKTsKKyAgICAgICAgZ2RiX3dyaXRlX3JlZ2lzdGVyKHMtPmdfY3B1LCBtZW1fYnVmLCBhZGRyKTsKKyAgICAgICAgcHV0X3BhY2tldChzLCAiT0siKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnWic6CisgICAgY2FzZSAneic6CisgICAgICAgIHR5cGUgPSBzdHJ0b3VsKHAsIChjaGFyICoqKSZwLCAxNik7CisgICAgICAgIGlmICgqcCA9PSAnLCcpCisgICAgICAgICAgICBwKys7CisgICAgICAgIGFkZHIgPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICAgICAgcCsrOworICAgICAgICBsZW4gPSBzdHJ0b3VsbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICBpZiAoY2ggPT0gJ1onKQorICAgICAgICAgICAgcmVzID0gZ2RiX2JyZWFrcG9pbnRfaW5zZXJ0KGFkZHIsIGxlbiwgdHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IGdkYl9icmVha3BvaW50X3JlbW92ZShhZGRyLCBsZW4sIHR5cGUpOworICAgICAgICBpZiAocmVzID49IDApCisgICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiT0siKTsKKyAgICAgICAgZWxzZSBpZiAocmVzID09IC1FTk9TWVMpCisgICAgICAgICAgICBwdXRfcGFja2V0KHMsICIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiRTIyIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0gnOgorICAgICAgICB0eXBlID0gKnArKzsKKyAgICAgICAgdGhyZWFkID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgaWYgKHRocmVhZCA9PSAtMSB8fCB0aHJlYWQgPT0gMCkgeworICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiT0siKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVudiA9IGZpbmRfY3B1KHRocmVhZCk7CisgICAgICAgIGlmIChlbnYgPT0gTlVMTCkgeworICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiRTIyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICBzLT5jX2NwdSA9IGVudjsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIk9LIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICBzLT5nX2NwdSA9IGVudjsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIk9LIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICBwdXRfcGFja2V0KHMsICJFMjIiKTsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdUJzoKKyAgICAgICAgdGhyZWFkID0gc3RydG91bGwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgZW52ID0gZmluZF9jcHUodGhyZWFkKTsKKworICAgICAgICBpZiAoZW52ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIk9LIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRfcGFja2V0KHMsICJFMjIiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdxJzoKKyAgICBjYXNlICdRJzoKKyAgICAgICAgLyogcGFyc2UgYW55ICdxJyBwYWNrZXRzIGhlcmUgKi8KKyAgICAgICAgaWYgKCFzdHJjbXAocCwicWVtdS5zc3RlcGJpdHMiKSkgeworICAgICAgICAgICAgLyogUXVlcnkgQnJlYWtwb2ludCBiaXQgZGVmaW5pdGlvbnMgKi8KKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJFTkFCTEU9JXgsTk9JUlE9JXgsTk9USU1FUj0leCIsCisgICAgICAgICAgICAgICAgICAgICBTU1RFUF9FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICBTU1RFUF9OT0lSUSwKKyAgICAgICAgICAgICAgICAgICAgIFNTVEVQX05PVElNRVIpOworICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChwLCJxZW11LnNzdGVwIiwxMCkgPT0gMCkgeworICAgICAgICAgICAgLyogRGlzcGxheSBvciBjaGFuZ2UgdGhlIHNzdGVwX2ZsYWdzICovCisgICAgICAgICAgICBwICs9IDEwOworICAgICAgICAgICAgaWYgKCpwICE9ICc9JykgeworICAgICAgICAgICAgICAgIC8qIERpc3BsYXkgY3VycmVudCBzZXR0aW5nICovCisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JXgiLCBzc3RlcF9mbGFncyk7CisgICAgICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgdHlwZSA9IHN0cnRvdWwocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgICAgIHNzdGVwX2ZsYWdzID0gdHlwZTsKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIk9LIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocCwiQyIpID09IDApIHsKKyAgICAgICAgICAgIC8qICJDdXJyZW50IHRocmVhZCIgcmVtYWlucyB2YWd1ZSBpbiB0aGUgc3BlYywgc28gYWx3YXlzIHJldHVybgorICAgICAgICAgICAgICogIHRoZSBmaXJzdCBDUFUgKGdkYiByZXR1cm5zIHRoZSBmaXJzdCB0aHJlYWQpLiAqLworICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiUUMxIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocCwiZlRocmVhZEluZm8iKSA9PSAwKSB7CisgICAgICAgICAgICBzLT5xdWVyeV9jcHUgPSBRVEFJTFFfRklSU1QoJmNwdXMpLT5lbnZfcHRyOworICAgICAgICAgICAgZ290byByZXBvcnRfY3B1aW5mbzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAocCwic1RocmVhZEluZm8iKSA9PSAwKSB7CisgICAgICAgIHJlcG9ydF9jcHVpbmZvOgorICAgICAgICAgICAgaWYgKHMtPnF1ZXJ5X2NwdSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtJXgiLCBnZGJfaWQoRU5WX0dFVF9DUFUocy0+cXVlcnlfY3B1KSkpOworICAgICAgICAgICAgICAgIHB1dF9wYWNrZXQocywgYnVmKTsKKyAgICAgICAgICAgICAgICBzLT5xdWVyeV9jcHUgPSBRVEFJTFFfTkVYVChFTlZfR0VUX0NQVShzLT5xdWVyeV9jcHUpLCBub2RlKS0+ZW52X3B0cjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHB1dF9wYWNrZXQocywgImwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAocCwiVGhyZWFkRXh0cmFJbmZvLCIsIDE2KSA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWQgPSBzdHJ0b3VsbChwKzE2LCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICAgICAgZW52ID0gZmluZF9jcHUodGhyZWFkKTsKKyAgICAgICAgICAgIGlmIChlbnYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZShFTlZfR0VUX0NQVShlbnYpLCAwKTsKKyAgICAgICAgICAgICAgICBsZW4gPSBzbnByaW50ZigoY2hhciAqKW1lbV9idWYsIHNpemVvZihtZW1fYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1BVIyVkIFslc10iLCBFTlZfR0VUX0NQVShlbnYpLT5jcHVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0dFVF9DUFUoZW52KS0+aGFsdGVkID8gImhhbHRlZCAiIDogInJ1bm5pbmciKTsKKyAgICAgICAgICAgICAgICBtZW10b2hleChidWYsIG1lbV9idWYsIGxlbik7CisgICAgICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAocCwgIk9mZnNldHMiLCA3KSA9PSAwKSB7CisgICAgICAgICAgICBUYXNrU3RhdGUgKnRzID0gcy0+Y19jcHUtPm9wYXF1ZTsKKworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICJUZXh0PSIgVEFSR0VUX0FCSV9GTVRfbHggIjtEYXRhPSIgVEFSR0VUX0FCSV9GTVRfbHgKKyAgICAgICAgICAgICAgICAgICAgICI7QnNzPSIgVEFSR0VUX0FCSV9GTVRfbHgsCisgICAgICAgICAgICAgICAgICAgICB0cy0+aW5mby0+Y29kZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB0cy0+aW5mby0+ZGF0YV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB0cy0+aW5mby0+ZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlIC8qICFDT05GSUdfVVNFUl9PTkxZICovCisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAocCwgIlJjbWQsIiwgNSkgPT0gMCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbihwICsgNSk7CisKKyAgICAgICAgICAgIGlmICgobGVuICUgMikgIT0gMCkgeworICAgICAgICAgICAgICAgIHB1dF9wYWNrZXQocywgIkUwMSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGV4dG9tZW0obWVtX2J1ZiwgcCArIDUsIGxlbik7CisgICAgICAgICAgICBsZW4gPSBsZW4gLyAyOworICAgICAgICAgICAgbWVtX2J1ZltsZW4rK10gPSAwOworICAgICAgICAgICAgcWVtdV9jaHJfcmVhZChzLT5tb25fY2hyLCBtZW1fYnVmLCBsZW4pOworICAgICAgICAgICAgcHV0X3BhY2tldChzLCAiT0siKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KKyAgICAgICAgaWYgKHN0cm5jbXAocCwgIlN1cHBvcnRlZCIsIDkpID09IDApIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJQYWNrZXRTaXplPSV4IiwgTUFYX1BBQ0tFVF9MRU5HVEgpOworI2lmZGVmIEdEQl9DT1JFX1hNTAorICAgICAgICAgICAgcHN0cmNhdChidWYsIHNpemVvZihidWYpLCAiO3FYZmVyOmZlYXR1cmVzOnJlYWQrIik7CisjZW5kaWYKKyAgICAgICAgICAgIHB1dF9wYWNrZXQocywgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWZkZWYgR0RCX0NPUkVfWE1MCisgICAgICAgIGlmIChzdHJuY21wKHAsICJYZmVyOmZlYXR1cmVzOnJlYWQ6IiwgMTkpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnhtbDsKKyAgICAgICAgICAgIHRhcmdldF91bG9uZyB0b3RhbF9sZW47CisKKyAgICAgICAgICAgIGdkYl9oYXNfeG1sID0gMTsKKyAgICAgICAgICAgIHAgKz0gMTk7CisgICAgICAgICAgICB4bWwgPSBnZXRfZmVhdHVyZV94bWwocCwgJnApOworICAgICAgICAgICAgaWYgKCF4bWwpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRTAwIik7CisgICAgICAgICAgICAgICAgcHV0X3BhY2tldChzLCBidWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKnAgPT0gJzonKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGFkZHIgPSBzdHJ0b3VsKHAsIChjaGFyICoqKSZwLCAxNik7CisgICAgICAgICAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGxlbiA9IHN0cnRvdWwocCwgKGNoYXIgKiopJnAsIDE2KTsKKworICAgICAgICAgICAgdG90YWxfbGVuID0gc3RybGVuKHhtbCk7CisgICAgICAgICAgICBpZiAoYWRkciA+IHRvdGFsX2xlbikgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJFMDAiKTsKKyAgICAgICAgICAgICAgICBwdXRfcGFja2V0KHMsIGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gKE1BWF9QQUNLRVRfTEVOR1RIIC0gNSkgLyAyKQorICAgICAgICAgICAgICAgIGxlbiA9IChNQVhfUEFDS0VUX0xFTkdUSCAtIDUpIC8gMjsKKyAgICAgICAgICAgIGlmIChsZW4gPCB0b3RhbF9sZW4gLSBhZGRyKSB7CisgICAgICAgICAgICAgICAgYnVmWzBdID0gJ20nOworICAgICAgICAgICAgICAgIGxlbiA9IG1lbXRveChidWYgKyAxLCB4bWwgKyBhZGRyLCBsZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnbCc7CisgICAgICAgICAgICAgICAgbGVuID0gbWVtdG94KGJ1ZiArIDEsIHhtbCArIGFkZHIsIHRvdGFsX2xlbiAtIGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHV0X3BhY2tldF9iaW5hcnkocywgYnVmLCBsZW4gKyAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogVW5yZWNvZ25pc2VkICdxJyBjb21tYW5kLiAgKi8KKyAgICAgICAgZ290byB1bmtub3duX2NvbW1hbmQ7CisKKyAgICBkZWZhdWx0OgorICAgIHVua25vd25fY29tbWFuZDoKKyAgICAgICAgLyogcHV0IGVtcHR5IHBhY2tldCAqLworICAgICAgICBidWZbMF0gPSAnXDAnOworICAgICAgICBwdXRfcGFja2V0KHMsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUlNfSURMRTsKK30KKwordm9pZCBnZGJfc2V0X3N0b3BfY3B1KENQVVN0YXRlICpjcHUpCit7CisgICAgZ2Ric2VydmVyX3N0YXRlLT5jX2NwdSA9IGNwdS0+ZW52X3B0cjsKKyAgICBnZGJzZXJ2ZXJfc3RhdGUtPmdfY3B1ID0gY3B1LT5lbnZfcHRyOworfQorCisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKK3N0YXRpYyB2b2lkIGdkYl92bV9zdGF0ZV9jaGFuZ2Uodm9pZCAqb3BhcXVlLCBpbnQgcnVubmluZywgaW50IHJlYXNvbikKK3sKKyAgICBHREJTdGF0ZSAqcyA9IGdkYnNlcnZlcl9zdGF0ZTsKKyAgICBDUFVBcmNoU3RhdGUgKmVudiA9IHMtPmNfY3B1OworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgY29uc3QgY2hhciAqdHlwZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJ1bm5pbmcgfHwgKHJlYXNvbiAhPSBFWENQX0RFQlVHICYmIHJlYXNvbiAhPSBFWENQX0lOVEVSUlVQVCkgfHwKKyAgICAgICAgcy0+c3RhdGUgPT0gUlNfSU5BQ1RJVkUgfHwgcy0+c3RhdGUgPT0gUlNfU1lTQ0FMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZGlzYWJsZSBzaW5nbGUgc3RlcCBpZiBpdCB3YXMgZW5hYmxlICovCisgICAgY3B1X3NpbmdsZV9zdGVwKGNwdSwgMCk7CisKKyAgICBpZiAocmVhc29uID09IEVYQ1BfREVCVUcpIHsKKyAgICAgICAgaWYgKGVudi0+d2F0Y2hwb2ludF9oaXQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZW52LT53YXRjaHBvaW50X2hpdC0+ZmxhZ3MgJiBCUF9NRU1fQUNDRVNTKSB7CisgICAgICAgICAgICBjYXNlIEJQX01FTV9SRUFEOgorICAgICAgICAgICAgICAgIHR5cGUgPSAiciI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJQX01FTV9BQ0NFU1M6CisgICAgICAgICAgICAgICAgdHlwZSA9ICJhIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdHlwZSA9ICIiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICJUJTAyeHRocmVhZDolMDJ4OyVzd2F0Y2g6IiBUQVJHRVRfRk1UX2x4ICI7IiwKKyAgICAgICAgICAgICAgICAgICAgIEdEQl9TSUdOQUxfVFJBUCwgZ2RiX2lkKGNwdSksIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBlbnYtPndhdGNocG9pbnRfaGl0LT52YWRkcik7CisgICAgICAgICAgICBwdXRfcGFja2V0KHMsIGJ1Zik7CisgICAgICAgICAgICBlbnYtPndhdGNocG9pbnRfaGl0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0Yl9mbHVzaChlbnYpOworICAgICAgICByZXQgPSBHREJfU0lHTkFMX1RSQVA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gR0RCX1NJR05BTF9JTlQ7CisgICAgfQorICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJUJTAyeHRocmVhZDolMDJ4OyIsIHJldCwgZ2RiX2lkKGNwdSkpOworICAgIHB1dF9wYWNrZXQocywgYnVmKTsKK30KKyNlbmRpZgorCisvKiBTZW5kIGEgZ2RiIHN5c2NhbGwgcmVxdWVzdC4KKyAgIFRoaXMgYWNjZXB0cyBsaW1pdGVkIHByaW50Zi1zdHlsZSBmb3JtYXQgc3BlY2lmaWVycywgc3BlY2lmaWNhbGx5OgorICAgICV4ICAtIHRhcmdldF91bG9uZyBhcmd1bWVudCBwcmludGVkIGluIGhleC4KKyAgICAlbHggLSA2NC1iaXQgYXJndW1lbnQgcHJpbnRlZCBpbiBoZXguCisgICAgJXMgIC0gc3RyaW5nIHBvaW50ZXIgKHRhcmdldF91bG9uZykgYW5kIGxlbmd0aCAoaW50KSBwYWlyLiAgKi8KK3ZvaWQgZ2RiX2RvX3N5c2NhbGwoZ2RiX3N5c2NhbGxfY29tcGxldGVfY2IgY2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgdmE7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBjaGFyICpwOworICAgIHRhcmdldF91bG9uZyBhZGRyOworICAgIHVpbnQ2NF90IGk2NDsKKyAgICBHREJTdGF0ZSAqczsKKworICAgIHMgPSBnZGJzZXJ2ZXJfc3RhdGU7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgZ2RiX2N1cnJlbnRfc3lzY2FsbF9jYiA9IGNiOworICAgIHMtPnN0YXRlID0gUlNfU1lTQ0FMTDsKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgIHZtX3N0b3AoRVhDUF9ERUJVRyk7CisjZW5kaWYKKyAgICBzLT5zdGF0ZSA9IFJTX0lETEU7CisgICAgdmFfc3RhcnQodmEsIGZtdCk7CisgICAgcCA9IGJ1ZjsKKyAgICAqKHArKykgPSAnRic7CisgICAgd2hpbGUgKCpmbXQpIHsKKyAgICAgICAgaWYgKCpmbXQgPT0gJyUnKSB7CisgICAgICAgICAgICBmbXQrKzsKKyAgICAgICAgICAgIHN3aXRjaCAoKmZtdCsrKSB7CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICBhZGRyID0gdmFfYXJnKHZhLCB0YXJnZXRfdWxvbmcpOworICAgICAgICAgICAgICAgIHAgKz0gc25wcmludGYocCwgJmJ1ZltzaXplb2YoYnVmKV0gLSBwLCBUQVJHRVRfRk1UX2x4LCBhZGRyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgIGlmICgqKGZtdCsrKSAhPSAneCcpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2Zvcm1hdDsKKyAgICAgICAgICAgICAgICBpNjQgPSB2YV9hcmcodmEsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICBwICs9IHNucHJpbnRmKHAsICZidWZbc2l6ZW9mKGJ1ZildIC0gcCwgIiUiIFBSSXg2NCwgaTY0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIGFkZHIgPSB2YV9hcmcodmEsIHRhcmdldF91bG9uZyk7CisgICAgICAgICAgICAgICAgcCArPSBzbnByaW50ZihwLCAmYnVmW3NpemVvZihidWYpXSAtIHAsIFRBUkdFVF9GTVRfbHggIi8leCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLCB2YV9hcmcodmEsIGludCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJhZF9mb3JtYXQ6CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZGJzdHViOiBCYWQgc3lzY2FsbCBmb3JtYXQgc3RyaW5nICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbXQgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICoocCsrKSA9ICooZm10KyspOworICAgICAgICB9CisgICAgfQorICAgICpwID0gMDsKKyAgICB2YV9lbmQodmEpOworICAgIHB1dF9wYWNrZXQocywgYnVmKTsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgZ2RiX2hhbmRsZXNpZyhzLT5jX2NwdSwgMCk7CisjZWxzZQorICAgIGNwdV9leGl0KEVOVl9HRVRfQ1BVKHMtPmNfY3B1KSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgZ2RiX3JlYWRfYnl0ZShHREJTdGF0ZSAqcywgaW50IGNoKQoreworICAgIGludCBpLCBjc3VtOworICAgIHVpbnQ4X3QgcmVwbHk7CisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgIGlmIChzLT5sYXN0X3BhY2tldF9sZW4pIHsKKyAgICAgICAgLyogV2FpdGluZyBmb3IgYSByZXNwb25zZSB0byB0aGUgbGFzdCBwYWNrZXQuICBJZiB3ZSBzZWUgdGhlIHN0YXJ0CisgICAgICAgICAgIG9mIGEgbmV3IGNvbW1hbmQgdGhlbiBhYmFuZG9uIHRoZSBwcmV2aW91cyByZXNwb25zZS4gICovCisgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyNpZmRlZiBERUJVR19HREIKKyAgICAgICAgICAgIHByaW50ZigiR290IE5BQ0ssIHJldHJhbnNtaXR0aW5nXG4iKTsKKyNlbmRpZgorICAgICAgICAgICAgcHV0X2J1ZmZlcihzLCAodWludDhfdCAqKXMtPmxhc3RfcGFja2V0LCBzLT5sYXN0X3BhY2tldF9sZW4pOworICAgICAgICB9CisjaWZkZWYgREVCVUdfR0RCCisgICAgICAgIGVsc2UgaWYgKGNoID09ICcrJykKKyAgICAgICAgICAgIHByaW50ZigiR290IEFDS1xuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiR290ICclYycgd2hlbiBleHBlY3RpbmcgQUNLL05BQ0tcbiIsIGNoKTsKKyNlbmRpZgorICAgICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICckJykKKyAgICAgICAgICAgIHMtPmxhc3RfcGFja2V0X2xlbiA9IDA7CisgICAgICAgIGlmIChjaCAhPSAnJCcpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh2bV9ydW5uaW5nKSB7CisgICAgICAgIC8qIHdoZW4gdGhlIENQVSBpcyBydW5uaW5nLCB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgZXhjZXB0IHN0b3AKKyAgICAgICAgICAgaXQgd2hlbiByZWNlaXZpbmcgYSBjaGFyICovCisgICAgICAgIHZtX3N0b3AoRVhDUF9JTlRFUlJVUFQpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBzd2l0Y2gocy0+c3RhdGUpIHsKKyAgICAgICAgY2FzZSBSU19JRExFOgorICAgICAgICAgICAgaWYgKGNoID09ICckJykgeworICAgICAgICAgICAgICAgIHMtPmxpbmVfYnVmX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IFJTX0dFVExJTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSU19HRVRMSU5FOgorICAgICAgICAgICAgaWYgKGNoID09ICcjJykgeworICAgICAgICAgICAgcy0+c3RhdGUgPSBSU19DSEtTVU0xOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5saW5lX2J1Zl9pbmRleCA+PSBzaXplb2Yocy0+bGluZV9idWYpIC0gMSkgeworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gUlNfSURMRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5saW5lX2J1ZltzLT5saW5lX2J1Zl9pbmRleCsrXSA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ0hLU1VNMToKKyAgICAgICAgICAgIHMtPmxpbmVfYnVmW3MtPmxpbmVfYnVmX2luZGV4XSA9ICdcMCc7CisgICAgICAgICAgICBzLT5saW5lX2NzdW0gPSBmcm9taGV4KGNoKSA8PCA0OworICAgICAgICAgICAgcy0+c3RhdGUgPSBSU19DSEtTVU0yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlNfQ0hLU1VNMjoKKyAgICAgICAgICAgIHMtPmxpbmVfY3N1bSB8PSBmcm9taGV4KGNoKTsKKyAgICAgICAgICAgIGNzdW0gPSAwOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcy0+bGluZV9idWZfaW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgIGNzdW0gKz0gcy0+bGluZV9idWZbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bGluZV9jc3VtICE9IChjc3VtICYgMHhmZikpIHsKKyAgICAgICAgICAgICAgICByZXBseSA9ICctJzsKKyAgICAgICAgICAgICAgICBwdXRfYnVmZmVyKHMsICZyZXBseSwgMSk7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBSU19JRExFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXBseSA9ICcrJzsKKyAgICAgICAgICAgICAgICBwdXRfYnVmZmVyKHMsICZyZXBseSwgMSk7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSBnZGJfaGFuZGxlX3BhY2tldChzLCBzLT5saW5lX2J1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCitpbnQKK2dkYl9xdWV1ZXNpZyAodm9pZCkKK3sKKyAgICBHREJTdGF0ZSAqczsKKworICAgIHMgPSBnZGJzZXJ2ZXJfc3RhdGU7CisKKyAgICBpZiAoZ2Ric2VydmVyX2ZkIDwgMCB8fCBzLT5mZCA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK2ludAorZ2RiX2hhbmRsZXNpZyAoQ1BVU3RhdGUgKmNwdSwgaW50IHNpZykKK3sKKyAgR0RCU3RhdGUgKnM7CisgIGNoYXIgYnVmWzI1Nl07CisgIGludCBuOworCisgIHMgPSBnZGJzZXJ2ZXJfc3RhdGU7CisgIGlmIChnZGJzZXJ2ZXJfZmQgPCAwIHx8IHMtPmZkIDwgMCkKKyAgICByZXR1cm4gc2lnOworCisgIC8qIGRpc2FibGUgc2luZ2xlIHN0ZXAgaWYgaXQgd2FzIGVuYWJsZWQgKi8KKyAgY3B1X3NpbmdsZV9zdGVwKGNwdSwgMCk7CisgIHRiX2ZsdXNoKGNwdS0+ZW52X3B0cik7CisKKyAgaWYgKHNpZyAhPSAwKQorICAgIHsKKyAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJTJTAyeCIsIHRhcmdldF9zaWduYWxfdG9fZ2RiIChzaWcpKTsKKyAgICAgIHB1dF9wYWNrZXQocywgYnVmKTsKKyAgICB9CisgIC8qIHB1dF9wYWNrZXQoKSBtaWdodCBoYXZlIGRldGVjdGVkIHRoYXQgdGhlIHBlZXIgdGVybWluYXRlZCB0aGUKKyAgICAgY29ubmVjdGlvbi4gICovCisgIGlmIChzLT5mZCA8IDApCisgICAgICByZXR1cm4gc2lnOworCisgIHNpZyA9IDA7CisgIHMtPnN0YXRlID0gUlNfSURMRTsKKyAgcy0+cnVubmluZ19zdGF0ZSA9IDA7CisgIHdoaWxlIChzLT5ydW5uaW5nX3N0YXRlID09IDApIHsKKyAgICAgIG4gPSByZWFkIChzLT5mZCwgYnVmLCAyNTYpOworICAgICAgaWYgKG4gPiAwKQorICAgICAgICB7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgZ2RiX3JlYWRfYnl0ZSAocywgYnVmW2ldKTsKKyAgICAgICAgfQorICAgICAgZWxzZSBpZiAobiA9PSAwIHx8IGVycm5vICE9IEVBR0FJTikKKyAgICAgICAgeworICAgICAgICAgIC8qIFhYWDogQ29ubmVjdGlvbiBjbG9zZWQuICBTaG91bGQgcHJvYmFibHkgd2FpdCBmb3IgYW5ub3RoZXIKKyAgICAgICAgICAgICBjb25uZWN0aW9uIGJlZm9yZSBjb250aW51aW5nLiAgKi8KKyAgICAgICAgICByZXR1cm4gc2lnOworICAgICAgICB9CisgIH0KKyAgc2lnID0gcy0+c2lnbmFsOworICBzLT5zaWduYWwgPSAwOworICByZXR1cm4gc2lnOworfQorCisvKiBUZWxsIHRoZSByZW1vdGUgZ2RiIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZC4gICovCit2b2lkIGdkYl9leGl0KENQVVN0YXRlICpjcHUsIGludCBjb2RlKQoreworICBHREJTdGF0ZSAqczsKKyAgY2hhciBidWZbNF07CisKKyAgcyA9IGdkYnNlcnZlcl9zdGF0ZTsKKyAgaWYgKGdkYnNlcnZlcl9mZCA8IDAgfHwgcy0+ZmQgPCAwKQorICAgIHJldHVybjsKKworICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiVyUwMngiLCBjb2RlKTsKKyAgcHV0X3BhY2tldChzLCBidWYpOworfQorCisvKiBUZWxsIHRoZSByZW1vdGUgZ2RiIHRoYXQgdGhlIHByb2Nlc3MgaGFzIGV4aXRlZCBkdWUgdG8gU0lHLiAgKi8KK3ZvaWQgZ2RiX3NpZ25hbGxlZChDUFVTdGF0ZSAqY3B1LCBpbnQgc2lnKQoreworICBHREJTdGF0ZSAqczsKKyAgY2hhciBidWZbNF07CisKKyAgcyA9IGdkYnNlcnZlcl9zdGF0ZTsKKyAgaWYgKGdkYnNlcnZlcl9mZCA8IDAgfHwgcy0+ZmQgPCAwKQorICAgIHJldHVybjsKKworICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiWCUwMngiLCB0YXJnZXRfc2lnbmFsX3RvX2dkYiAoc2lnKSk7CisgIHB1dF9wYWNrZXQocywgYnVmKTsKK30KKworc3RhdGljIHZvaWQgZ2RiX2FjY2VwdCh2b2lkKQoreworICAgIEdEQlN0YXRlICpzOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKKyAgICBzb2NrbGVuX3QgbGVuOworICAgIGludCB2YWwsIGZkOworCisgICAgZm9yKDs7KSB7CisgICAgICAgIGxlbiA9IHNpemVvZihzb2NrYWRkcik7CisgICAgICAgIGZkID0gYWNjZXB0KGdkYnNlcnZlcl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrYWRkciwgJmxlbik7CisgICAgICAgIGlmIChmZCA8IDAgJiYgZXJybm8gIT0gRUlOVFIpIHsKKyAgICAgICAgICAgIHBlcnJvcigiYWNjZXB0Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgc2hvcnQgbGF0ZW5jeSAqLworICAgIHZhbCA9IDE7CisgICAgcWVtdV9zZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIChjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoR0RCU3RhdGUpKTsKKyAgICBzLT5jX2NwdSA9IFFUQUlMUV9GSVJTVCgmY3B1cyk7CisgICAgcy0+Z19jcHUgPSBRVEFJTFFfRklSU1QoJmNwdXMpOworICAgIHMtPmZkID0gZmQ7CisgICAgZ2RiX2hhc194bWwgPSAwOworCisgICAgZ2Ric2VydmVyX3N0YXRlID0gczsKKworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCBnZGJzZXJ2ZXJfb3BlbihpbnQgcG9ydCkKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja2FkZHI7CisgICAgaW50IGZkLCB2YWwsIHJldDsKKworICAgIGZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigic29ja2V0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBhbGxvdyBmYXN0IHJldXNlICovCisgICAgdmFsID0gMTsKKyAgICBxZW11X3NldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CisKKyAgICBzb2NrYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBzb2NrYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIHNvY2thZGRyLnNpbl9hZGRyLnNfYWRkciA9IDA7CisgICAgcmV0ID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrYWRkciwgc2l6ZW9mKHNvY2thZGRyKSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gbGlzdGVuKGZkLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBwZXJyb3IoImxpc3RlbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBmZDsKK30KKworaW50IGdkYnNlcnZlcl9zdGFydChpbnQgcG9ydCkKK3sKKyAgICBnZGJzZXJ2ZXJfZmQgPSBnZGJzZXJ2ZXJfb3Blbihwb3J0KTsKKyAgICBpZiAoZ2Ric2VydmVyX2ZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIGFjY2VwdCBjb25uZWN0aW9ucyAqLworICAgIGdkYl9hY2NlcHQoKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogRGlzYWJsZSBnZGIgc3R1YiBmb3IgY2hpbGQgcHJvY2Vzc2VzLiAgKi8KK3ZvaWQgZ2Ric2VydmVyX2ZvcmsoQ1BVQXJjaFN0YXRlICplbnYpCit7CisgICAgR0RCU3RhdGUgKnMgPSBnZGJzZXJ2ZXJfc3RhdGU7CisgICAgaWYgKGdkYnNlcnZlcl9mZCA8IDAgfHwgcy0+ZmQgPCAwKQorICAgICAgcmV0dXJuOworICAgIGNsb3NlKHMtPmZkKTsKKyAgICBzLT5mZCA9IC0xOworICAgIGNwdV9icmVha3BvaW50X3JlbW92ZV9hbGwoZW52LCBCUF9HREIpOworICAgIGNwdV93YXRjaHBvaW50X3JlbW92ZV9hbGwoZW52LCBCUF9HREIpOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgZ2RiX2Nocl9jYW5fcmVjZWl2ZSh2b2lkICpvcGFxdWUpCit7CisgIC8qIFdlIGNhbiBoYW5kbGUgYW4gYXJiaXRyYXJpbHkgbGFyZ2UgYW1vdW50IG9mIGRhdGEuCisgICBQaWNrIHRoZSBtYXhpbXVtIHBhY2tldCBzaXplLCB3aGljaCBpcyBhcyBnb29kIGFzIGFueXRoaW5nLiAgKi8KKyAgcmV0dXJuIE1BWF9QQUNLRVRfTEVOR1RIOworfQorCitzdGF0aWMgdm9pZCBnZGJfY2hyX3JlY2VpdmUodm9pZCAqb3BhcXVlLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBnZGJfcmVhZF9ieXRlKGdkYnNlcnZlcl9zdGF0ZSwgYnVmW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdkYl9jaHJfZXZlbnQodm9pZCAqb3BhcXVlLCBpbnQgZXZlbnQpCit7CisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgQ0hSX0VWRU5UX09QRU5FRDoKKyAgICAgICAgdm1fc3RvcChFWENQX0lOVEVSUlVQVCk7CisgICAgICAgIGdkYl9oYXNfeG1sID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZGJfbW9uaXRvcl9vdXRwdXQoR0RCU3RhdGUgKnMsIGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKK3sKKyAgICBjaGFyIGJ1ZltNQVhfUEFDS0VUX0xFTkdUSF07CisKKyAgICBidWZbMF0gPSAnTyc7CisgICAgaWYgKGxlbiA+IChNQVhfUEFDS0VUX0xFTkdUSC8yKSAtIDEpCisgICAgICAgIGxlbiA9IChNQVhfUEFDS0VUX0xFTkdUSC8yKSAtIDE7CisgICAgbWVtdG9oZXgoYnVmICsgMSwgKHVpbnQ4X3QgKiltc2csIGxlbik7CisgICAgcHV0X3BhY2tldChzLCBidWYpOworfQorCitzdGF0aWMgaW50IGdkYl9tb25pdG9yX3dyaXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgY29uc3QgY2hhciAqcCA9IChjb25zdCBjaGFyICopYnVmOworICAgIGludCBtYXhfc3o7CisKKyAgICBtYXhfc3ogPSAoc2l6ZW9mKGdkYnNlcnZlcl9zdGF0ZS0+bGFzdF9wYWNrZXQpIC0gMikgLyAyOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKGxlbiA8PSBtYXhfc3opIHsKKyAgICAgICAgICAgIGdkYl9tb25pdG9yX291dHB1dChnZGJzZXJ2ZXJfc3RhdGUsIHAsIGxlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnZGJfbW9uaXRvcl9vdXRwdXQoZ2Ric2VydmVyX3N0YXRlLCBwLCBtYXhfc3opOworICAgICAgICBwICs9IG1heF9zejsKKyAgICAgICAgbGVuIC09IG1heF9zejsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworI2lmbmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkIGdkYl9zaWd0ZXJtX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKyAgICBpZiAodm1fcnVubmluZykKKyAgICAgICAgdm1fc3RvcChFWENQX0lOVEVSUlVQVCk7Cit9CisjZW5kaWYKKworaW50IGdkYnNlcnZlcl9zdGFydChjb25zdCBjaGFyICpkZXZpY2UpCit7CisgICAgR0RCU3RhdGUgKnM7CisgICAgY2hhciBnZGJzdHViX2RldmljZV9uYW1lWzEyOF07CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBOVUxMOworICAgIENoYXJEcml2ZXJTdGF0ZSAqbW9uX2NocjsKKworICAgIGlmICghZGV2aWNlKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHN0cmNtcChkZXZpY2UsICJub25lIikgIT0gMCkgeworICAgICAgICBpZiAoc3Ryc3RhcnQoZGV2aWNlLCAidGNwOiIsIE5VTEwpKSB7CisgICAgICAgICAgICAvKiBlbmZvcmNlIHJlcXVpcmVkIFRDUCBhdHRyaWJ1dGVzICovCisgICAgICAgICAgICBzbnByaW50ZihnZGJzdHViX2RldmljZV9uYW1lLCBzaXplb2YoZ2Ric3R1Yl9kZXZpY2VfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAiJXMsbm93YWl0LG5vZGVsYXksc2VydmVyIiwgZGV2aWNlKTsKKyAgICAgICAgICAgIGRldmljZSA9IGdkYnN0dWJfZGV2aWNlX25hbWU7CisgICAgICAgIH0KKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChkZXZpY2UsICJzdGRpbyIpID09IDApIHsKKyAgICAgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworCisgICAgICAgICAgICBtZW1zZXQoJmFjdCwgMCwgc2l6ZW9mKGFjdCkpOworICAgICAgICAgICAgYWN0LnNhX2hhbmRsZXIgPSBnZGJfc2lndGVybV9oYW5kbGVyOworICAgICAgICAgICAgc2lnYWN0aW9uKFNJR0lOVCwgJmFjdCwgTlVMTCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBjaHIgPSBxZW11X2Nocl9vcGVuKCJnZGIiLCBkZXZpY2UsIE5VTEwpOworICAgICAgICBpZiAoIWNocikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBxZW11X2Nocl9hZGRfaGFuZGxlcnMoY2hyLCBnZGJfY2hyX2Nhbl9yZWNlaXZlLCBnZGJfY2hyX3JlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfY2hyX2V2ZW50LCBOVUxMKTsKKyAgICB9CisKKyAgICBzID0gZ2Ric2VydmVyX3N0YXRlOworICAgIGlmICghcykgeworICAgICAgICBzID0gZ19tYWxsb2MwKHNpemVvZihHREJTdGF0ZSkpOworICAgICAgICBnZGJzZXJ2ZXJfc3RhdGUgPSBzOworCisgICAgICAgIHFlbXVfYWRkX3ZtX2NoYW5nZV9zdGF0ZV9oYW5kbGVyKGdkYl92bV9zdGF0ZV9jaGFuZ2UsIE5VTEwpOworCisgICAgICAgIC8qIEluaXRpYWxpemUgYSBtb25pdG9yIHRlcm1pbmFsIGZvciBnZGIgKi8KKyAgICAgICAgbW9uX2NociA9IGdfbWFsbG9jMChzaXplb2YoKm1vbl9jaHIpKTsKKyAgICAgICAgbW9uX2Noci0+Y2hyX3dyaXRlID0gZ2RiX21vbml0b3Jfd3JpdGU7CisgICAgICAgIG1vbml0b3JfaW5pdChtb25fY2hyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+Y2hyKQorICAgICAgICAgICAgcWVtdV9jaHJfY2xvc2Uocy0+Y2hyKTsKKyAgICAgICAgbW9uX2NociA9IHMtPm1vbl9jaHI7CisgICAgICAgIG1lbXNldChzLCAwLCBzaXplb2YoR0RCU3RhdGUpKTsKKyAgICB9CisgICAgcy0+Y19jcHUgPSBRVEFJTFFfRklSU1QoJmNwdXMpLT5lbnZfcHRyOworICAgIHMtPmdfY3B1ID0gcy0+Y19jcHU7CisgICAgcy0+Y2hyID0gY2hyOworICAgIHMtPnN0YXRlID0gY2hyID8gUlNfSURMRSA6IFJTX0lOQUNUSVZFOworICAgIHMtPm1vbl9jaHIgPSBtb25fY2hyOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9hbmRyb2lkX2FybS5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2FuZHJvaWRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1MTBhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9hbmRyb2lkX2FybS5jCkBAIC0wLDAgKzEsMTU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9ib2FyZHMuaCIKKyNpbmNsdWRlICJody9kZXZpY2VzLmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorI2luY2x1ZGUgImh3L2FybS9waWMuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhdWRpby9hdWRpby5oIgorI2luY2x1ZGUgImh3L2FybS9hcm0uaCIKKyNpbmNsdWRlICJleGVjL3JhbV9hZGRyLmgiCisjaW5jbHVkZSAidWkvY29uc29sZS5oIgorI2luY2x1ZGUgInN5c2VtdS9ibG9ja2Rldi5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvcGlwZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjZGVmaW5lICBEKC4uLikgIFZFUkJPU0VfUFJJTlQoaW5pdCxfX1ZBX0FSR1NfXykKKworI2RlZmluZSBBUk1fQ1BVX1NBVkVfVkVSU0lPTiAgMQorCitjaGFyKiBhdWRpb19pbnB1dF9zb3VyY2UgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IGdvbGRmaXNoX2RldmljZSBldmVudDBfZGV2aWNlID0geworICAgIC5uYW1lID0gImdvbGRmaXNoX2V2ZW50cyIsCisgICAgLmlkID0gMCwKKyAgICAuc2l6ZSA9IDB4MTAwMCwKKyAgICAuaXJxX2NvdW50ID0gMQorfTsKKworc3RhdGljIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgbmFuZF9kZXZpY2UgPSB7CisgICAgLm5hbWUgPSAiZ29sZGZpc2hfbmFuZCIsCisgICAgLmlkID0gMCwKKyAgICAuc2l6ZSA9IDB4MTAwMAorfTsKKworLyogQm9hcmQgaW5pdC4gICovCisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfYXJtX2luaXRfKHJhbV9hZGRyX3QgcmFtX3NpemUsCisgICAgY29uc3QgY2hhciAqYm9vdF9kZXZpY2UsCisgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLAorICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lLAorICAgIGNvbnN0IGNoYXIgKmluaXRyZF9maWxlbmFtZSwKKyAgICBjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgQ1BVQVJNU3RhdGUgKmVudjsKKyAgICBxZW11X2lycSAqY3B1X3BpYzsKKyAgICBxZW11X2lycSAqZ29sZGZpc2hfcGljOworICAgIGludCBpOworICAgIHN0cnVjdCBhcm1fYm9vdF9pbmZvICBpbmZvOworICAgIHJhbV9hZGRyX3QgcmFtX29mZnNldDsKKworICAgIGlmICghY3B1X21vZGVsKQorICAgICAgICBjcHVfbW9kZWwgPSAiYXJtOTI2IjsKKworICAgIGVudiA9IGNwdV9pbml0KGNwdV9tb2RlbCk7CisKKyAgICByYW1fb2Zmc2V0ID0gcWVtdV9yYW1fYWxsb2MoTlVMTCwiYW5kcm9pZF9hcm0iLHJhbV9zaXplKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDAsIHJhbV9zaXplLCByYW1fb2Zmc2V0IHwgSU9fTUVNX1JBTSk7CisKKyAgICBjcHVfcGljID0gYXJtX3BpY19pbml0X2NwdShlbnYpOworICAgIGdvbGRmaXNoX3BpYyA9IGdvbGRmaXNoX2ludGVycnVwdF9pbml0KDB4ZmYwMDAwMDAsIGNwdV9waWNbQVJNX1BJQ19DUFVfSVJRXSwgY3B1X3BpY1tBUk1fUElDX0NQVV9GSVFdKTsKKyAgICBnb2xkZmlzaF9kZXZpY2VfaW5pdChnb2xkZmlzaF9waWMsIDB4ZmYwMTAwMDAsIDB4N2YwMDAwLCAxMCwgMjIpOworCisgICAgZ29sZGZpc2hfZGV2aWNlX2J1c19pbml0KDB4ZmYwMDEwMDAsIDEpOworCisgICAgZ29sZGZpc2hfdGltZXJfYW5kX3J0Y19pbml0KDB4ZmYwMDMwMDAsIDMpOworCisgICAgZ29sZGZpc2hfdHR5X2FkZChzZXJpYWxfaGRzWzBdLCAwLCAweGZmMDAyMDAwLCA0KTsKKyAgICBmb3IoaSA9IDE7IGkgPCBNQVhfU0VSSUFMX1BPUlRTOyBpKyspIHsKKyAgICAgICAgLy9wcmludGYoImFuZHJvaWRfYXJtX2luaXQgc2VyaWFsICVkICV4XG4iLCBpLCBzZXJpYWxfaGRzW2ldKTsKKyAgICAgICAgaWYoc2VyaWFsX2hkc1tpXSkgeworICAgICAgICAgICAgZ29sZGZpc2hfdHR5X2FkZChzZXJpYWxfaGRzW2ldLCBpLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IE1BWF9OSUNTOyBpKyspIHsKKyAgICAgICAgaWYgKG5kX3RhYmxlW2ldLnZsYW4pIHsKKyAgICAgICAgICAgIGlmIChuZF90YWJsZVtpXS5tb2RlbCA9PSBOVUxMCisgICAgICAgICAgICAgICAgfHwgc3RyY21wKG5kX3RhYmxlW2ldLm1vZGVsLCAic21jOTFjMTExIikgPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKnNtY19kZXZpY2U7CisgICAgICAgICAgICAgICAgc21jX2RldmljZSA9IGdfbWFsbG9jMChzaXplb2YoKnNtY19kZXZpY2UpKTsKKyAgICAgICAgICAgICAgICBzbWNfZGV2aWNlLT5uYW1lID0gInNtYzkxeCI7CisgICAgICAgICAgICAgICAgc21jX2RldmljZS0+aWQgPSBpOworICAgICAgICAgICAgICAgIHNtY19kZXZpY2UtPnNpemUgPSAweDEwMDA7CisgICAgICAgICAgICAgICAgc21jX2RldmljZS0+aXJxX2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBnb2xkZmlzaF9hZGRfZGV2aWNlX25vX2lvKHNtY19kZXZpY2UpOworICAgICAgICAgICAgICAgIHNtYzkxYzExMV9pbml0KCZuZF90YWJsZVtpXSwgc21jX2RldmljZS0+YmFzZSwgZ29sZGZpc2hfcGljW3NtY19kZXZpY2UtPmlycV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IFVuc3VwcG9ydGVkIE5JQzogJXNcbiIsIG5kX3RhYmxlWzBdLm1vZGVsKTsKKyAgICAgICAgICAgICAgICBleGl0ICgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGdvbGRmaXNoX2ZiX2luaXQoMCk7CisjaWZkZWYgSEFTX0FVRElPCisgICAgZ29sZGZpc2hfYXVkaW9faW5pdCgweGZmMDA0MDAwLCAwLCBhdWRpb19pbnB1dF9zb3VyY2UpOworI2VuZGlmCisgICAgeworICAgICAgICBEcml2ZUluZm8qIGluZm8gPSBkcml2ZV9nZXQoIElGX0lERSwgMCwgMCApOworICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBnb2xkZmlzaF9tbWNfaW5pdCgweGZmMDA1MDAwLCAwLCBpbmZvLT5iZHJ2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdvbGRmaXNoX2JhdHRlcnlfaW5pdChhbmRyb2lkX2h3LT5od19iYXR0ZXJ5KTsKKworICAgIGdvbGRmaXNoX2FkZF9kZXZpY2Vfbm9faW8oJmV2ZW50MF9kZXZpY2UpOworICAgIGV2ZW50c19kZXZfaW5pdChldmVudDBfZGV2aWNlLmJhc2UsIGdvbGRmaXNoX3BpY1tldmVudDBfZGV2aWNlLmlycV0pOworCisgICAgZ29sZGZpc2hfYWRkX2RldmljZV9ub19pbygmbmFuZF9kZXZpY2UpOworICAgIG5hbmRfZGV2X2luaXQobmFuZF9kZXZpY2UuYmFzZSk7CisKKyAgICB0cmFjZV9kZXZfaW5pdCgpOworCisgICAgYm9vbCBuZXdEZXZpY2VOYW1pbmcgPQorICAgICAgICAgICAgKGFuZHJvaWRId0NvbmZpZ19nZXRLZXJuZWxEZXZpY2VOYW1pbmcoYW5kcm9pZF9odykgPj0gMSk7CisgICAgcGlwZV9kZXZfaW5pdChuZXdEZXZpY2VOYW1pbmcpOworCisgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YgaW5mbyk7CisgICAgaW5mby5yYW1fc2l6ZSAgICAgICAgPSByYW1fc2l6ZTsKKyAgICBpbmZvLmtlcm5lbF9maWxlbmFtZSA9IGtlcm5lbF9maWxlbmFtZTsKKyAgICBpbmZvLmtlcm5lbF9jbWRsaW5lICA9IGtlcm5lbF9jbWRsaW5lOworICAgIGluZm8uaW5pdHJkX2ZpbGVuYW1lID0gaW5pdHJkX2ZpbGVuYW1lOworICAgIGluZm8ubmJfY3B1cyAgICAgICAgID0gMTsKKyAgICBpbmZvLmlzX2xpbnV4ICAgICAgICA9IDE7CisgICAgaW5mby5ib2FyZF9pZCAgICAgICAgPSAxNDQxOworCisgICAgYXJtX2xvYWRfa2VybmVsKGVudiwgJmluZm8pOworfQorCitRRU1VTWFjaGluZSBhbmRyb2lkX2FybV9tYWNoaW5lID0geworICAgICJhbmRyb2lkX2FybSIsCisgICAgIkFSTSBBbmRyb2lkIEVtdWxhdG9yIiwKKyAgICBhbmRyb2lkX2FybV9pbml0XywKKyAgICAwLAorICAgIDAsCisgICAgMSwKKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZCBhbmRyb2lkX2FybV9pbml0KHZvaWQpCit7CisgICAgcWVtdV9yZWdpc3Rlcl9tYWNoaW5lKCZhbmRyb2lkX2FybV9tYWNoaW5lKTsKK30KKworbWFjaGluZV9pbml0KGFuZHJvaWRfYXJtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2FuZHJvaWRfbWlwcy5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2FuZHJvaWRfbWlwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvYW5kcm9pZF9taXBzLmMKQEAgLTAsMCArMSwzNTAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2JvYXJkcy5oIgorI2luY2x1ZGUgImh3L2RldmljZXMuaCIKKyNpbmNsdWRlICJody9sb2FkZXIuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImh3L21pcHMvbWlwcy5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKyNpbmNsdWRlICJleGVjL3JhbV9hZGRyLmgiCisjaW5jbHVkZSAic3lzZW11L2Jsb2NrZGV2LmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCisKKyNkZWZpbmUgRCguLi4pICBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKyNkZWZpbmUgRSguLi4pICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiIgX19WQV9BUkdTX18pLCBmcHJpbnRmKHN0ZGVyciwgIlxuIikKKworI2RlZmluZSBNSVBTX0NQVV9TQVZFX1ZFUlNJT04gIDEKKworI2RlZmluZSBISUdITUVNX09GRlNFVCAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR09MREZJU0hfSU9fU1BBQ0UgICAweDFmMDAwMDAwCisKKyNkZWZpbmUgR09MREZJU0hfSU5URVJSVVBUICAoR09MREZJU0hfSU9fU1BBQ0UgKyAweDAwMDAwKQorI2RlZmluZSBHT0xERklTSF9ERVZJQ0VCVVMgIChHT0xERklTSF9JT19TUEFDRSArIDB4MDEwMDApCisjZGVmaW5lIEdPTERGSVNIX1RUWSAgICAgICAgKEdPTERGSVNIX0lPX1NQQUNFICsgMHgwMjAwMCkKKyNkZWZpbmUgR09MREZJU0hfUlRDICAgICAgICAoR09MREZJU0hfSU9fU1BBQ0UgKyAweDAzMDAwKQorI2RlZmluZSBHT0xERklTSF9BVURJTyAgICAgIChHT0xERklTSF9JT19TUEFDRSArIDB4MDQwMDApCisjZGVmaW5lIEdPTERGSVNIX01NQyAgICAgICAgKEdPTERGSVNIX0lPX1NQQUNFICsgMHgwNTAwMCkKKyNkZWZpbmUgR09MREZJU0hfTUVNTE9HICAgICAoR09MREZJU0hfSU9fU1BBQ0UgKyAweDA2MDAwKQorI2RlZmluZSBHT0xERklTSF9SRVNFVCAgICAgIChHT0xERklTSF9JT19TUEFDRSArIDB4MDcwMDApCisjZGVmaW5lIEdPTERGSVNIX0RFVklDRVMgICAgKEdPTERGSVNIX0lPX1NQQUNFICsgMHgxMDAwMCkKKworI2RlZmluZSBNQVhfUkFNX1NJWkVfTUIgNDA3OVVMCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlnaG1lbV9zaXplID0gMDsKKworY2hhciogYXVkaW9faW5wdXRfc291cmNlID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgZXZlbnQwX2RldmljZSA9IHsKKyAgICAubmFtZSA9ICJnb2xkZmlzaF9ldmVudHMiLAorICAgIC5pZCA9IDAsCisgICAgLnNpemUgPSAweDEwMDAsCisgICAgLmlycV9jb3VudCA9IDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIG5hbmRfZGV2aWNlID0geworICAgIC5uYW1lID0gImdvbGRmaXNoX25hbmQiLAorICAgIC5pZCA9IDAsCisgICAgLnNpemUgPSAweDEwMDAKK307CisKK3R5cGVkZWYgc3RydWN0IFJlc2V0RGF0YSB7CisgICAgQ1BVT2xkU3RhdGUgKmVudjsKKyAgICByYW1fYWRkcl90IHJhbV9zaXplOworICAgIGNvbnN0IGNoYXIqIGtlcm5lbF9maWxlbmFtZTsKKyAgICBjb25zdCBjaGFyKiBrZXJuZWxfY21kbGluZTsKKyAgICBjb25zdCBjaGFyKiBpbml0cmRfZmlsZW5hbWU7Cit9IFJlc2V0RGF0YTsKKworc3RhdGljIFJlc2V0RGF0YSAqcmVzZXRfaW5mbzsKKworLyogQm9hcmQgaW5pdC4gICovCisKKyNkZWZpbmUgVklSVF9UT19QSFlTX0FEREVORCAoMHhmZmZmZmZmZjgwMDAwMDAwTEwpCisKKyNkZWZpbmUgUEhZU19UT19WSVJUKHgpICgoeCkgfCB+KHRhcmdldF91bG9uZykweDdmZmZmZmZmKQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX2xvYWRfa2VybmVsKENQVU9sZFN0YXRlICplbnYsIGludCByYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lKQoreworICAgIGludCBpbml0cmRfc2l6ZTsKKyAgICByYW1fYWRkcl90IGluaXRyZF9vZmZzZXQ7CisgICAgdWludDY0X3Qga2VybmVsX2VudHJ5LCBrZXJuZWxfbG93LCBrZXJuZWxfaGlnaDsKKyAgICB1bnNpZ25lZCBpbnQgY21kbGluZTsKKworICAgIC8qIExvYWQgdGhlIGtlcm5lbC4gICovCisgICAgaWYgKCFrZXJuZWxfZmlsZW5hbWUpIHsKKyAgICAgICAgRSgiS2VybmVsIGltYWdlIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAobG9hZF9lbGYoa2VybmVsX2ZpbGVuYW1lLCBWSVJUX1RPX1BIWVNfQURERU5ELAorICAgICAgICAgICAgICAgICAodWludDY0X3QgKikma2VybmVsX2VudHJ5LAorICAgICAgICAgICAgICAgICAodWludDY0X3QgKikma2VybmVsX2xvdywKKyAgICAgICAgICAgICAgICAgKHVpbnQ2NF90ICopJmtlcm5lbF9oaWdoKSA8IDApIHsKKyAgICAgICAgRSgicWVtdTogY291bGQgbm90IGxvYWQga2VybmVsICclcydcbiIsIGtlcm5lbF9maWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGVudi0+YWN0aXZlX3RjLlBDID0gKGludDMyX3Qpa2VybmVsX2VudHJ5OworCisgICAgLyogbG9hZCBpbml0cmQgKi8KKyAgICBpbml0cmRfc2l6ZSA9IDA7CisgICAgaW5pdHJkX29mZnNldCA9IDA7CisgICAgaWYgKGluaXRyZF9maWxlbmFtZSkgeworICAgICAgICBpbml0cmRfc2l6ZSA9IGdldF9pbWFnZV9zaXplIChpbml0cmRfZmlsZW5hbWUpOworICAgICAgICBpZiAoaW5pdHJkX3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbml0cmRfb2Zmc2V0ID0gKGtlcm5lbF9oaWdoICsgflRBUkdFVF9QQUdFX01BU0spICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgICAgIGlmIChpbml0cmRfb2Zmc2V0ICsgaW5pdHJkX3NpemUgPiByYW1fc2l6ZSkgeworICAgICAgICAgICAgICAgIEUoInFlbXU6IG1lbW9yeSB0b28gc21hbGwgZm9yIGluaXRpYWwgcmFtIGRpc2sgJyVzJ1xuIiwgaW5pdHJkX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5pdHJkX3NpemUgPSBsb2FkX2ltYWdlX3RhcmdwaHlzKGluaXRyZF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0cmRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9zaXplIC0gaW5pdHJkX29mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluaXRyZF9zaXplID09ICh0YXJnZXRfdWxvbmcpIC0xKSB7CisgICAgICAgICAgICBFKCJxZW11OiBjb3VsZCBub3QgbG9hZCBpbml0aWFsIHJhbSBkaXNrICclcydcbiIsIGluaXRyZF9maWxlbmFtZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU3RvcmUgY29tbWFuZCBsaW5lIGluIHRvcCBwYWdlIG9mIG1lbW9yeQorICAgICAqIGtlcm5lbCB3aWxsIGNvcHkgdGhlIGNvbW1hbmQgbGluZSB0byBhIGxvY2EgYnVmZmVyCisgICAgICovCisgICAgY21kbGluZSA9IHJhbV9zaXplIC0gVEFSR0VUX1BBR0VfU0laRTsKKyAgICBjaGFyIGtlcm5lbF9jbWRbMTAyNF07CisgICAgaWYgKGluaXRyZF9zaXplID4gMCkgeworICAgICAgICBzcHJpbnRmIChrZXJuZWxfY21kLCAiJXMgcmRfc3RhcnQ9MHglIiBIV0FERFJfUFJJeCAiIHJkX3NpemU9JWxpIiwKKyAgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgIChod2FkZHIpUEhZU19UT19WSVJUKGluaXRyZF9vZmZzZXQpLAorICAgICAgICAgICAgICAgICAobG9uZyBpbnQpaW5pdHJkX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweSAoa2VybmVsX2NtZCwga2VybmVsX2NtZGxpbmUpOworICAgIH0KKworICAgIGNoYXIga2VybmVsX2NtZDJbMTAyNF07CisgICAgaWYgKGhpZ2htZW1fc2l6ZSkgeworICAgICAgICBzcHJpbnRmIChrZXJuZWxfY21kMiwgIiVzIG1lbT0ldW1AMHgwIG1lbT0ldW1AMHgleCIsCisgICAgICAgICAgICAgICAgIGtlcm5lbF9jbWQsCisgICAgICAgICAgICAgICAgIEdPTERGSVNIX0lPX1NQQUNFIC8gKDEwMjQgKiAxMDI0KSwKKyAgICAgICAgICAgICAgICAgaGlnaG1lbV9zaXplIC8gKDEwMjQgKiAxMDI0KSwKKyAgICAgICAgICAgICAgICAgSElHSE1FTV9PRkZTRVQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweSAoa2VybmVsX2NtZDIsIGtlcm5lbF9jbWQpOworICAgIH0KKworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUocmFtX3NpemUgLSBUQVJHRVRfUEFHRV9TSVpFLCAodm9pZCAqKWtlcm5lbF9jbWQyLCBzdHJsZW4oa2VybmVsX2NtZDIpICsgMSk7CisKKyNpZiAwCisgICAgaWYgKGluaXRyZF9zaXplID4gMCkKKyAgICAgICAgc3ByaW50ZiAocGh5c19yYW1fYmFzZStjbWRsaW5lLCAiJXMgcmRfc3RhcnQ9MHgiIFRBUkdFVF9GTVRfbHggIiByZF9zaXplPSVsaSIsCisgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBQSFlTX1RPX1ZJUlQoaW5pdHJkX29mZnNldCksIGluaXRyZF9zaXplKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNweSAocGh5c19yYW1fYmFzZStjbWRsaW5lLCBrZXJuZWxfY21kbGluZSk7CisjZW5kaWYKKworICAgIGVudi0+YWN0aXZlX3RjLmdwcls0XSA9IFBIWVNfVE9fVklSVChjbWRsaW5lKTsgIC8qIGEwICovCisgICAgZW52LT5hY3RpdmVfdGMuZ3ByWzVdID0gcmFtX3NpemU7ICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICBlbnYtPmFjdGl2ZV90Yy5ncHJbNl0gPSBoaWdobWVtX3NpemU7ICAgICAgICAgICAvKiBhMiAqLworICAgIGVudi0+YWN0aXZlX3RjLmdwcls3XSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX3Jlc2V0X2lvX3dyaXRlKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzd2l0Y2ggKHZhbCkgeworICAgIGNhc2UgMHg0MjoKKyAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDM6CisgICAgICAgIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3QoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICIlczogJWQ6IFVua25vd24gY29tbWFuZCAleFxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX3Jlc2V0X2lvX3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqIGNvbnN0IGdvbGRmaXNoX3Jlc2V0X2lvX29wc193cml0ZVtdID0geworICAgICZnb2xkZmlzaF9yZXNldF9pb193cml0ZSwKKyAgICAmZ29sZGZpc2hfcmVzZXRfaW9fd3JpdGUsCisgICAgJmdvbGRmaXNoX3Jlc2V0X2lvX3dyaXRlLAorfTsKKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICogY29uc3QgZ29sZGZpc2hfcmVzZXRfaW9fb3BzX3JlYWRbXSA9IHsKKyAgICAmZ29sZGZpc2hfcmVzZXRfaW9fcmVhZCwKKyAgICAmZ29sZGZpc2hfcmVzZXRfaW9fcmVhZCwKKyAgICAmZ29sZGZpc2hfcmVzZXRfaW9fcmVhZCwKK307CisKK3N0YXRpYyB2b2lkIG1haW5fY3B1X3Jlc2V0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBSZXNldERhdGEgKnMgPSAoUmVzZXREYXRhICopb3BhcXVlOworICAgIENQVU9sZFN0YXRlICplbnYgPSBzLT5lbnY7CisKKyAgICBjcHVfcmVzZXQoRU5WX0dFVF9DUFUoZW52KSk7CisgICAgYW5kcm9pZF9sb2FkX2tlcm5lbChlbnYsIE1JTihzLT5yYW1fc2l6ZSwgR09MREZJU0hfSU9fU1BBQ0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5rZXJuZWxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbml0cmRfZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IG1pcHNfcWVtdV9pb21lbXR5cGUgPSAwOworCitzdGF0aWMgdm9pZCBhbmRyb2lkX21pcHNfaW5pdF8ocmFtX2FkZHJfdCByYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib290X2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKK3sKKyAgICBDUFVPbGRTdGF0ZSAqZW52OworICAgIHFlbXVfaXJxICpnb2xkZmlzaF9waWM7CisgICAgaW50IGk7CisgICAgcmFtX2FkZHJfdCByYW1fb2Zmc2V0OworCisgICAgaWYgKCFjcHVfbW9kZWwpCisgICAgICAgIGNwdV9tb2RlbCA9ICI3NEtmIjsKKworICAgIGVudiA9IGNwdV9pbml0KGNwdV9tb2RlbCk7CisKKyAgICByZXNldF9pbmZvID0gZ19tYWxsb2MwKHNpemVvZihSZXNldERhdGEpKTsKKyAgICByZXNldF9pbmZvLT5lbnYgPSBlbnY7CisgICAgcmVzZXRfaW5mby0+a2VybmVsX2ZpbGVuYW1lID0gc3RyZHVwKGtlcm5lbF9maWxlbmFtZSk7CisgICAgcmVzZXRfaW5mby0+a2VybmVsX2NtZGxpbmUgPSBzdHJkdXAoa2VybmVsX2NtZGxpbmUpOworICAgIHJlc2V0X2luZm8tPmluaXRyZF9maWxlbmFtZSA9IHN0cmR1cChpbml0cmRfZmlsZW5hbWUpOworCisgICAgcWVtdV9yZWdpc3Rlcl9yZXNldChtYWluX2NwdV9yZXNldCwgMCwgcmVzZXRfaW5mbyk7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImNwdSIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIE1JUFNfQ1BVX1NBVkVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgY3B1X3NhdmUsCisgICAgICAgICAgICAgICAgICAgIGNwdV9sb2FkLAorICAgICAgICAgICAgICAgICAgICBlbnYpOworCisgICAgaWYgKHJhbV9zaXplID4gKE1BWF9SQU1fU0laRV9NQiA8PCAyMCkpIHsKKyAgICAgICAgRCgicWVtdTogVG9vIG11Y2ggbWVtb3J5IGZvciB0aGlzIG1hY2hpbmUuICIKKyAgICAgICAgICAiUkFNIHNpemUgcmVkdWNlZCB0byAlbHUgTUJcbiIsIE1BWF9SQU1fU0laRV9NQik7CisgICAgICAgIHJhbV9zaXplID0gTUFYX1JBTV9TSVpFX01CIDw8IDIwOworICAgIH0KKworICAgIHJlc2V0X2luZm8tPnJhbV9zaXplID0gcmFtX3NpemU7CisKKyAgICByYW1fb2Zmc2V0ID0gcWVtdV9yYW1fYWxsb2MoTlVMTCwgImFuZHJvaWRfbWlwcyIsIHJhbV9zaXplKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDAsIE1JTihyYW1fc2l6ZSwgR09MREZJU0hfSU9fU1BBQ0UpLCByYW1fb2Zmc2V0IHwgSU9fTUVNX1JBTSk7CisKKyAgICBpZiAoIW1pcHNfcWVtdV9pb21lbXR5cGUpIHsKKyAgICAgICAgbWlwc19xZW11X2lvbWVtdHlwZSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZ29sZGZpc2hfcmVzZXRfaW9fb3BzX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX3Jlc2V0X2lvX29wc193cml0ZSwgTlVMTCk7CisgICAgfQorICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoR09MREZJU0hfUkVTRVQsIDB4MTAwMCwgbWlwc19xZW11X2lvbWVtdHlwZSk7CisKKyAgICBpZiAocmFtX3NpemUgPiBHT0xERklTSF9JT19TUEFDRSkgeworICAgICAgICBoaWdobWVtX3NpemUgPSByYW1fc2l6ZSAtIEdPTERGSVNIX0lPX1NQQUNFOworICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KEhJR0hNRU1fT0ZGU0VULCBoaWdobWVtX3NpemUsIHJhbV9vZmZzZXQgKyBHT0xERklTSF9JT19TUEFDRSk7CisgICAgfQorCisgICAgLyogSW5pdCBpbnRlcm5hbCBkZXZpY2VzICovCisgICAgY3B1X21pcHNfaXJxX2luaXRfY3B1KGVudik7CisgICAgY3B1X21pcHNfY2xvY2tfaW5pdChlbnYpOworCisgICAgZ29sZGZpc2hfcGljID0gZ29sZGZpc2hfaW50ZXJydXB0X2luaXQoR09MREZJU0hfSU5URVJSVVBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+aXJxWzJdLCBlbnYtPmlycVszXSk7CisgICAgZ29sZGZpc2hfZGV2aWNlX2luaXQoZ29sZGZpc2hfcGljLCBHT0xERklTSF9ERVZJQ0VTLCAweDdmMDAwMCwgMTAsIDIyKTsKKworICAgIGdvbGRmaXNoX2RldmljZV9idXNfaW5pdChHT0xERklTSF9ERVZJQ0VCVVMsIDEpOworCisgICAgZ29sZGZpc2hfdGltZXJfYW5kX3J0Y19pbml0KEdPTERGSVNIX1JUQywgMyk7CisKKyAgICBnb2xkZmlzaF90dHlfYWRkKHNlcmlhbF9oZHNbMF0sIDAsIEdPTERGSVNIX1RUWSwgNCk7CisgICAgZm9yKGkgPSAxOyBpIDwgTUFYX1NFUklBTF9QT1JUUzsgaSsrKSB7CisgICAgICAgIGlmKHNlcmlhbF9oZHNbaV0pIHsKKyAgICAgICAgICAgIGdvbGRmaXNoX3R0eV9hZGQoc2VyaWFsX2hkc1tpXSwgaSwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfTklDUzsgaSsrKSB7CisgICAgICAgIGlmIChuZF90YWJsZVtpXS52bGFuKSB7CisgICAgICAgICAgICBpZiAobmRfdGFibGVbaV0ubW9kZWwgPT0gTlVMTAorICAgICAgICAgICAgICAgIHx8IHN0cmNtcChuZF90YWJsZVtpXS5tb2RlbCwgInNtYzkxYzExMSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlICpzbWNfZGV2aWNlOworICAgICAgICAgICAgICAgIHNtY19kZXZpY2UgPSBnX21hbGxvYzAoc2l6ZW9mKCpzbWNfZGV2aWNlKSk7CisgICAgICAgICAgICAgICAgc21jX2RldmljZS0+bmFtZSA9ICJzbWM5MXgiOworICAgICAgICAgICAgICAgIHNtY19kZXZpY2UtPmlkID0gaTsKKyAgICAgICAgICAgICAgICBzbWNfZGV2aWNlLT5zaXplID0gMHgxMDAwOworICAgICAgICAgICAgICAgIHNtY19kZXZpY2UtPmlycV9jb3VudCA9IDE7CisgICAgICAgICAgICAgICAgZ29sZGZpc2hfYWRkX2RldmljZV9ub19pbyhzbWNfZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBzbWM5MWMxMTFfaW5pdCgmbmRfdGFibGVbaV0sIHNtY19kZXZpY2UtPmJhc2UsIGdvbGRmaXNoX3BpY1tzbWNfZGV2aWNlLT5pcnFdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRSgicWVtdTogVW5zdXBwb3J0ZWQgTklDOiAlc1xuIiwgbmRfdGFibGVbMF0ubW9kZWwpOworICAgICAgICAgICAgICAgIGV4aXQgKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZ29sZGZpc2hfZmJfaW5pdCgwKTsKKyNpZmRlZiBIQVNfQVVESU8KKyAgICBnb2xkZmlzaF9hdWRpb19pbml0KEdPTERGSVNIX0FVRElPLCAwLCBhdWRpb19pbnB1dF9zb3VyY2UpOworI2VuZGlmCisgICAgeworICAgICAgICBEcml2ZUluZm8qIGluZm8gPSBkcml2ZV9nZXQoIElGX0lERSwgMCwgMCApOworICAgICAgICBpZiAoaW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBnb2xkZmlzaF9tbWNfaW5pdChHT0xERklTSF9NTUMsIDAsIGluZm8tPmJkcnYpOworICAgICAgICB9CisgICAgfQorICAgIGdvbGRmaXNoX2JhdHRlcnlfaW5pdChhbmRyb2lkX2h3LT5od19iYXR0ZXJ5KTsKKworICAgIGdvbGRmaXNoX2FkZF9kZXZpY2Vfbm9faW8oJmV2ZW50MF9kZXZpY2UpOworICAgIGV2ZW50c19kZXZfaW5pdChldmVudDBfZGV2aWNlLmJhc2UsIGdvbGRmaXNoX3BpY1tldmVudDBfZGV2aWNlLmlycV0pOworCisgICAgZ29sZGZpc2hfYWRkX2RldmljZV9ub19pbygmbmFuZF9kZXZpY2UpOworICAgIG5hbmRfZGV2X2luaXQobmFuZF9kZXZpY2UuYmFzZSk7CisKKyAgICBib29sIG5ld0RldmljZU5hbWluZyA9CisgICAgICAgICAgICAoYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbERldmljZU5hbWluZyhhbmRyb2lkX2h3KSA+PSAxKTsKKyAgICBwaXBlX2Rldl9pbml0KG5ld0RldmljZU5hbWluZyk7CisKKyAgICBhbmRyb2lkX2xvYWRfa2VybmVsKGVudiwgTUlOKHJhbV9zaXplLCBHT0xERklTSF9JT19TUEFDRSksIGtlcm5lbF9maWxlbmFtZSwga2VybmVsX2NtZGxpbmUsIGluaXRyZF9maWxlbmFtZSk7Cit9CisKKworUUVNVU1hY2hpbmUgYW5kcm9pZF9taXBzX21hY2hpbmUgPSB7CisgICAgImFuZHJvaWRfbWlwcyIsCisgICAgIk1JUFMgQW5kcm9pZCBFbXVsYXRvciIsCisgICAgYW5kcm9pZF9taXBzX2luaXRfLAorICAgIDAsCisgICAgMCwKKyAgICAxLAorICAgIE5VTEwKK307CisKK3N0YXRpYyB2b2lkIGFuZHJvaWRfbWlwc19pbml0KHZvaWQpCit7CisgICAgcWVtdV9yZWdpc3Rlcl9tYWNoaW5lKCZhbmRyb2lkX21pcHNfbWFjaGluZSk7Cit9CisKK21hY2hpbmVfaW5pdChhbmRyb2lkX21pcHNfaW5pdCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvYXVkaW8uYyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYWM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvYXVkaW8uYwpAQCAtMCwwICsxLDY3OSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3FlbXUtZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2dsb2JhbHMuaCIKKworI2RlZmluZSAgREVCVUcgIDEKKworI2lmIERFQlVHCisjICBkZWZpbmUgIEQoLi4uKSAgVkVSQk9TRV9QUklOVChhdWRpbyxfX1ZBX0FSR1NfXykKKyNlbHNlCisjICBkZWZpbmUgIEQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgIGRwcmludChjb25zdCBjaGFyKiAgZm10LCAuLi4pOworCisvKiBkZWZpbmUgVVNFX1FFTVVfQVVESU9fSU4gdG8gMSB0byB1c2UgUUVNVSdzIGF1ZGlvIHN1YnN5c3RlbSB0bworICogaW1wbGVtZW50IHRoZSBhdWRpbyBpbnB1dC4gaWYgMCwgdGhpcyB3aWxsIHRyeSB0byByZWFkIGEgLndhdiBmaWxlCisgKiBkaXJlY3RseS4uLgorICovCisjZGVmaW5lICBVU0VfUUVNVV9BVURJT19JTiAgMQorCitlbnVtIHsKKyAgICAvKiBhdWRpbyBzdGF0dXMgcmVnaXN0ZXIgKi8KKyAgICBBVURJT19JTlRfU1RBVFVTCT0gMHgwMCwKKyAgICAvKiBzZXQgdGhpcyB0byBlbmFibGUgSVJRICovCisgICAgQVVESU9fSU5UX0VOQUJMRQk9IDB4MDQsCisgICAgLyogc2V0IHRoZXNlIHRvIHNwZWNpZnkgYnVmZmVyIGFkZHJlc3NlcyAqLworICAgIEFVRElPX1NFVF9XUklURV9CVUZGRVJfMSA9IDB4MDgsCisgICAgQVVESU9fU0VUX1dSSVRFX0JVRkZFUl8yID0gMHgwQywKKyAgICAvKiBzZXQgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZmZlciB0byB3cml0ZSAqLworICAgIEFVRElPX1dSSVRFX0JVRkZFUl8xICA9IDB4MTAsCisgICAgQVVESU9fV1JJVEVfQlVGRkVSXzIgID0gMHgxNCwKKworICAgIC8qIHRydWUgaWYgYXVkaW8gaW5wdXQgaXMgc3VwcG9ydGVkICovCisgICAgQVVESU9fUkVBRF9TVVBQT1JURUQgPSAweDE4LAorICAgIC8qIGJ1ZmZlciB0byB1c2UgZm9yIGF1ZGlvIGlucHV0ICovCisgICAgQVVESU9fU0VUX1JFQURfQlVGRkVSID0gMHgxQywKKworICAgIC8qIGRyaXZlciB3cml0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKi8KKyAgICBBVURJT19TVEFSVF9SRUFEICA9IDB4MjAsCisKKyAgICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHJlYWQgYnVmZmVyICovCisgICAgQVVESU9fUkVBRF9CVUZGRVJfQVZBSUxBQkxFICA9IDB4MjQsCisKKyAgICAvKiBmb3IgNjQtYml0IGd1ZXN0IENQVXMgb25seSAqLworICAgIEFVRElPX1NFVF9XUklURV9CVUZGRVJfMV9ISUdIID0gMHgyOCwKKyAgICBBVURJT19TRVRfV1JJVEVfQlVGRkVSXzJfSElHSCA9IDB4MzAsCisgICAgQVVESU9fU0VUX1JFQURfQlVGRkVSX0hJR0ggPSAweDM0LAorCisgICAgLyogQVVESU9fSU5UX1NUQVRVUyBiaXRzICovCisKKyAgICAvKiB0aGlzIGJpdCBzZXQgd2hlbiBpdCBpcyBzYWZlIHRvIHdyaXRlIG1vcmUgYnl0ZXMgdG8gdGhlIGJ1ZmZlciAqLworICAgIEFVRElPX0lOVF9XUklURV9CVUZGRVJfMV9FTVBUWSA9IDFVIDw8IDAsCisgICAgQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8yX0VNUFRZID0gMVUgPDwgMSwKKyAgICBBVURJT19JTlRfUkVBRF9CVUZGRVJfRlVMTCAgICAgPSAxVSA8PCAyLAorfTsKKworc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYgeworICAgIHVpbnQ2NF90ICBhZGRyZXNzOworICAgIHVpbnQzMl90ICBsZW5ndGg7CisgICAgdWludDgqICAgIGRhdGE7CisgICAgdWludDMyX3QgIGNhcGFjaXR5OworICAgIHVpbnQzMl90ICBvZmZzZXQ7Cit9OworCisKK3N0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSB7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSBkZXY7CisgICAgLy8gYnVmZmVyIGZsYWdzCisgICAgdWludDMyX3QgaW50X3N0YXR1czsKKyAgICAvLyBpcnEgZW5hYmxlIG1hc2sgZm9yIGludF9zdGF0dXMKKyAgICB1aW50MzJfdCBpbnRfZW5hYmxlOworCisjaWZuZGVmIFVTRV9RRU1VX0FVRElPX0lOCisgICAgLy8gYWRkcmVzcyBvZiB0aGUgcmVhZCBidWZmZXIKKyAgICB1aW50MzJfdCByZWFkX2J1ZmZlcjsKKyAgICAvLyBwYXRoIHRvIGZpbGUgb3IgZGV2aWNlIHRvIHVzZSBmb3IgaW5wdXQKKyAgICBjb25zdCBjaGFyKiBpbnB1dF9zb3VyY2U7CisgICAgLy8gdHJ1ZSBpZiBpbnB1dCBpcyBhIHdhdiBmaWxlCisgICAgaW50IGlucHV0X2lzX3dhdjsKKyAgICAvLyB0cnVlIGlmIHdlIG5lZWQgdG8gY29udmVydCBzdGVyZW8gLT4gbW9ubworICAgIGludCBpbnB1dF9pc19zdGVyZW87CisgICAgLy8gZmlsZSBkZXNjcmlwdG9yIHRvIHVzZSBmb3IgaW5wdXQKKyAgICBpbnQgaW5wdXRfZmQ7CisjZW5kaWYKKworICAgIC8vIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIHJlYWQgYnVmZmVyCisgICAgaW50IHJlYWRfYnVmZmVyX2F2YWlsYWJsZTsKKworICAgIC8vIHNldCB0byAxIG9yIDIgdG8gaW5kaWNhdGUgd2hpY2ggYnVmZmVyIHdlIGFyZSB3cml0aW5nIGZyb20sIG9yIHplcm8gaWYgYm90aCBidWZmZXJzIGFyZSBlbXB0eQorICAgIGludCBjdXJyZW50X2J1ZmZlcjsKKworICAgIC8vIGN1cnJlbnQgZGF0YSB0byB3cml0ZQorICAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19idWZmICBvdXRfYnVmZjFbMV07CisgICAgc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYgIG91dF9idWZmMlsxXTsKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fYnVmZiAgaW5fYnVmZlsxXTsKKworICAgIC8vIGZvciBRRU1VIHNvdW5kIG91dHB1dAorICAgIFFFTVVTb3VuZENhcmQgY2FyZDsKKyAgICBTV1ZvaWNlT3V0ICp2b2ljZTsKKyNpZiBVU0VfUUVNVV9BVURJT19JTgorICAgIFNXVm9pY2VJbiogIHZvaWNlaW47CisjZW5kaWYKK307CisKK3N0YXRpYyB2b2lkCitnb2xkZmlzaF9hdWRpb19idWZmX2luaXQoIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19idWZmKiAgYiApCit7CisgICAgYi0+YWRkcmVzcyAgPSAwOworICAgIGItPmxlbmd0aCAgID0gMDsKKyAgICBiLT5kYXRhICAgICA9IE5VTEw7CisgICAgYi0+Y2FwYWNpdHkgPSAwOworICAgIGItPm9mZnNldCAgID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfcmVzZXQoIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19idWZmKiAgYiApCit7CisgICAgYi0+b2Zmc2V0ID0gMDsKKyAgICBiLT5sZW5ndGggPSAwOworfQorCitzdGF0aWMgdWludDMyX3QKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfbGVuZ3RoKCBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fYnVmZiogIGIgKQoreworICAgIHJldHVybiBiLT5sZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkCitnb2xkZmlzaF9hdWRpb19idWZmX2Vuc3VyZSggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCB1aW50MzJfdCAgc2l6ZSApCit7CisgICAgaWYgKGItPmNhcGFjaXR5IDwgc2l6ZSkgeworICAgICAgICBiLT5kYXRhICAgICA9IGdfcmVhbGxvYyhiLT5kYXRhLCBzaXplKTsKKyAgICAgICAgYi0+Y2FwYWNpdHkgPSBzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfc2V0X2FkZHJlc3MoIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19idWZmKiAgYiwgdWludDMyX3QgIGFkZHIgKQoreworICAgIHVpbnQ2NF9zZXRfbG93KCZiLT5hZGRyZXNzLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfc2V0X2FkZHJlc3NfaGlnaCggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCB1aW50MzJfdCAgYWRkciApCit7CisgICAgdWludDY0X3NldF9oaWdoKCZiLT5hZGRyZXNzLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfc2V0X2xlbmd0aCggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCB1aW50MzJfdCAgbGVuICkKK3sKKyAgICBiLT5sZW5ndGggPSBsZW47CisgICAgYi0+b2Zmc2V0ID0gMDsKKyAgICBnb2xkZmlzaF9hdWRpb19idWZmX2Vuc3VyZShiLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorZ29sZGZpc2hfYXVkaW9fYnVmZl9yZWFkKCBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fYnVmZiogIGIgKQoreworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChiLT5hZGRyZXNzLCBiLT5kYXRhLCBiLT5sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZAorZ29sZGZpc2hfYXVkaW9fYnVmZl93cml0ZSggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiICkKK3sKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGItPmFkZHJlc3MsIGItPmRhdGEsIGItPmxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbnQKK2dvbGRmaXNoX2F1ZGlvX2J1ZmZfc2VuZCggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCBpbnQgIGZyZWUsIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSogIHMgKQoreworICAgIGludCAgcmV0LCB3cml0ZSA9IGItPmxlbmd0aDsKKworICAgIGlmICh3cml0ZSA+IGZyZWUpCisgICAgICAgIHdyaXRlID0gZnJlZTsKKworICAgIHJldCA9IEFVRF93cml0ZShzLT52b2ljZSwgYi0+ZGF0YSArIGItPm9mZnNldCwgd3JpdGUpOworICAgIGItPm9mZnNldCArPSByZXQ7CisgICAgYi0+bGVuZ3RoIC09IHJldDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50Citnb2xkZmlzaF9hdWRpb19idWZmX2F2YWlsYWJsZSggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiICkKK3sKKyAgICByZXR1cm4gYi0+bGVuZ3RoIC0gYi0+b2Zmc2V0OworfQorCitzdGF0aWMgaW50Citnb2xkZmlzaF9hdWRpb19idWZmX3JlY3YoIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19idWZmKiAgYiwgaW50ICBhdmFpbCwgc3RydWN0IGdvbGRmaXNoX2F1ZGlvX3N0YXRlKiAgcyApCit7CisgICAgaW50ICAgICBtaXNzaW5nID0gYi0+bGVuZ3RoIC0gYi0+b2Zmc2V0OworICAgIGludCAgICAgYXZhaWwyID0gKGF2YWlsID4gbWlzc2luZykgPyBtaXNzaW5nIDogYXZhaWw7CisgICAgaW50ICAgICByZWFkOworCisgICAgcmVhZCA9IEFVRF9yZWFkKHMtPnZvaWNlaW4sIGItPmRhdGEgKyBiLT5vZmZzZXQsIGF2YWlsMiApOworICAgIGlmIChyZWFkID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGF2YWlsMiA+IDApCisgICAgICAgIEQoIiVzOiBBVURfcmVhZCglZCkgcmV0dXJuZWQgJWQiLCBfX0ZVTkNUSU9OX18sIGF2YWlsMiwgcmVhZCk7CisKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKCBiLT5hZGRyZXNzICsgYi0+b2Zmc2V0LCBiLT5kYXRhICsgYi0+b2Zmc2V0LCByZWFkICk7CisgICAgYi0+b2Zmc2V0ICs9IHJlYWQ7CisKKyAgICByZXR1cm4gcmVhZDsKK30KKworLyogdXBkYXRlIHRoaXMgd2hlbmV2ZXIgeW91IGNoYW5nZSB0aGUgZ29sZGZpc2hfYXVkaW9fc3RhdGUgc3RydWN0dXJlICovCisjZGVmaW5lICBBVURJT19TVEFURV9TQVZFX1ZFUlNJT04gIDMKKworI2RlZmluZSAgUUZJRUxEX1NUUlVDVCAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZQorUUZJRUxEX0JFR0lOKGF1ZGlvX3N0YXRlX2ZpZWxkcykKKyAgICBRRklFTERfSU5UMzIoaW50X3N0YXR1cyksCisgICAgUUZJRUxEX0lOVDMyKGludF9lbmFibGUpLAorICAgIFFGSUVMRF9JTlQzMihyZWFkX2J1ZmZlcl9hdmFpbGFibGUpLAorICAgIFFGSUVMRF9JTlQzMihjdXJyZW50X2J1ZmZlciksCitRRklFTERfRU5ECisKK3N0YXRpYyB2b2lkCitnb2xkZmlzaF9hdWRpb19idWZmX3B1dCggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCBRRU1VRmlsZSogIGYgKQoreworICAgIHFlbXVfcHV0X2JlNjQoZiwgYi0+YWRkcmVzcyApOworICAgIHFlbXVfcHV0X2JlMzIoZiwgYi0+bGVuZ3RoICk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBiLT5vZmZzZXQgKTsKKyAgICBxZW11X3B1dF9idWZmZXIoZiwgYi0+ZGF0YSwgYi0+bGVuZ3RoICk7Cit9CisKK3N0YXRpYyB2b2lkCitnb2xkZmlzaF9hdWRpb19idWZmX2dldCggc3RydWN0IGdvbGRmaXNoX2F1ZGlvX2J1ZmYqICBiLCBRRU1VRmlsZSogIGYsIGludCB2ZXJzaW9uX2lkICkKK3sKKyAgICBpZiAodmVyc2lvbl9pZCA9PSAgKEFVRElPX1NUQVRFX1NBVkVfVkVSU0lPTiAtIDEpKQorICAgICAgICBiLT5hZGRyZXNzID0gKHVpbnQ2NF90KXFlbXVfZ2V0X2JlMzIoZik7CisgICAgZWxzZQorICAgICAgICBiLT5hZGRyZXNzID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICBiLT5sZW5ndGggID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBiLT5vZmZzZXQgID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBnb2xkZmlzaF9hdWRpb19idWZmX2Vuc3VyZShiLCBiLT5sZW5ndGgpOworICAgIHFlbXVfZ2V0X2J1ZmZlcihmLCBiLT5kYXRhLCBiLT5sZW5ndGgpOworfQorCitzdGF0aWMgdm9pZCAgYXVkaW9fc3RhdGVfc2F2ZSggUUVNVUZpbGUqICBmLCB2b2lkKiBvcGFxdWUgKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBxZW11X3B1dF9zdHJ1Y3QoZiwgYXVkaW9fc3RhdGVfZmllbGRzLCBzKTsKKworICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfcHV0IChzLT5vdXRfYnVmZjEsIGYpOworICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfcHV0IChzLT5vdXRfYnVmZjIsIGYpOworICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfcHV0IChzLT5pbl9idWZmLCBmKTsKK30KKworc3RhdGljIGludCAgIGF1ZGlvX3N0YXRlX2xvYWQoIFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSwgaW50ICB2ZXJzaW9uX2lkICkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fc3RhdGUqICBzID0gb3BhcXVlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldDsKKworICAgIGlmICgodmVyc2lvbl9pZCAhPSBBVURJT19TVEFURV9TQVZFX1ZFUlNJT04pICYmIAorICAgICAgICAodmVyc2lvbl9pZCAhPSAoQVVESU9fU1RBVEVfU0FWRV9WRVJTSU9OIC0gMSkpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gcWVtdV9nZXRfc3RydWN0KGYsIGF1ZGlvX3N0YXRlX2ZpZWxkcywgcyk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl9nZXQoIHMtPm91dF9idWZmMSwgZiwgdmVyc2lvbl9pZCk7CisgICAgICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfZ2V0KCBzLT5vdXRfYnVmZjIsIGYsIHZlcnNpb25faWQpOworICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX2dldCAocy0+aW5fYnVmZiwgZiwgdmVyc2lvbl9pZCk7CisgICAgfQorCisgICAgLy8gU2ltaWxhciB0byBlbmFibGVfYXVkaW8gLSB3aXRob3V0IHRoZSBidWZmZXIgcmVzZXQuCisgICAgaWYgKHMtPnZvaWNlICE9IE5VTEwpIHsKKyAgICAgICAgQVVEX3NldF9hY3RpdmVfb3V0KHMtPnZvaWNlLCAgKHMtPmludF9lbmFibGUgJiAoQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8xX0VNUFRZIHwgQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8yX0VNUFRZKSkgIT0gMCk7CisgICAgfQorICAgIGlmIChzLT52b2ljZWluKSB7CisgICAgICAgIEFVRF9zZXRfYWN0aXZlX2luKHMtPnZvaWNlaW4sIChzLT5pbnRfZW5hYmxlICYgQVVESU9fSU5UX1JFQURfQlVGRkVSX0ZVTEwpICE9IDApOworICAgIH0KKworICAgIC8vIHVwb24gc25hcHNob3QgcmVzdG9yZSB3ZSBtdXN0IGFsc28gcmUgc2lnbmFsIHRoZSBJUlEKKyAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLChzLT5pbnRfc3RhdHVzICYgcy0+aW50X2VuYWJsZSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9hdWRpbyhzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fc3RhdGUgKnMsIGludCBlbmFibGUpCit7CisgICAgLy8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIG91dHB1dCB2b2ljZQorICAgIGlmIChzLT52b2ljZSAhPSBOVUxMKSB7CisgICAgICAgIEFVRF9zZXRfYWN0aXZlX291dChzLT52b2ljZSwgICAoZW5hYmxlICYgKEFVRElPX0lOVF9XUklURV9CVUZGRVJfMV9FTVBUWSB8IEFVRElPX0lOVF9XUklURV9CVUZGRVJfMl9FTVBUWSkpICE9IDApOworICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3Jlc2V0KCBzLT5vdXRfYnVmZjEgKTsKKyAgICAgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl9yZXNldCggcy0+b3V0X2J1ZmYyICk7CisgICAgfQorCisgICAgaWYgKHMtPnZvaWNlaW4pIHsKKyAgICAgICAgQVVEX3NldF9hY3RpdmVfaW4gKHMtPnZvaWNlaW4sIChlbmFibGUgJiBBVURJT19JTlRfUkVBRF9CVUZGRVJfRlVMTCkgIT0gMCk7CisgICAgICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfcmVzZXQoIHMtPmluX2J1ZmYgKTsKKyAgICB9CisgICAgcy0+Y3VycmVudF9idWZmZXIgPSAwOworfQorCisjaWYgVVNFX1FFTVVfQVVESU9fSU4KK3N0YXRpYyB2b2lkIHN0YXJ0X3JlYWQoc3RydWN0IGdvbGRmaXNoX2F1ZGlvX3N0YXRlICpzLCB1aW50MzJfdCBjb3VudCkKK3sKKyAgICAvL3ByaW50ZiggIi4uLiBnb2xkZmlzaCBhdWRpbyBzdGFydF9yZWFkLCBjb3VudD0lZFxuIiwgY291bnQgKTsKKyAgICBnb2xkZmlzaF9hdWRpb19idWZmX3NldF9sZW5ndGgoIHMtPmluX2J1ZmYsIGNvdW50ICk7CisgICAgcy0+cmVhZF9idWZmZXJfYXZhaWxhYmxlID0gY291bnQ7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgc3RhcnRfcmVhZChzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fc3RhdGUgKnMsIHVpbnQzMl90IGNvdW50KQoreworICAgIHVpbnQ4ICAgd2F2X2hlYWRlcls0NF07CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICghcy0+aW5wdXRfc291cmNlKSByZXR1cm47CisKKyAgICBpZiAocy0+aW5wdXRfZmQgPCAwKSB7CisgICAgICAgIHMtPmlucHV0X2ZkID0gb3BlbihzLT5pbnB1dF9zb3VyY2UsIE9fQklOQVJZIHwgT19SRE9OTFkpOworCisgICAgICAgIGlmIChzLT5pbnB1dF9mZCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ29sZGZpc2hfYXVkaW8gY291bGQgbm90IG9wZW4gJXMgZm9yIGF1ZGlvIGlucHV0XG4iLCBzLT5pbnB1dF9zb3VyY2UpOworICAgICAgICAgICAgcy0+aW5wdXRfc291cmNlID0gTlVMTDsgLy8gc2V0IHRvIHRvIGF2b2lkIGVuZGxlc3MgcmV0cmllcworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCBXQVYgaGVhZGVyIGlmIHdlIGhhdmUgYSBXQVYgZmlsZQorICAgICAgICBpZiAocy0+aW5wdXRfaXNfd2F2KSB7CisgICAgICAgICAgICBpZiAocmVhZChzLT5pbnB1dF9mZCwgd2F2X2hlYWRlciwgc2l6ZW9mKHdhdl9oZWFkZXIpKSAhPSBzaXplb2Yod2F2X2hlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdvbGRmaXNoX2F1ZGlvIGNvdWxkIG5vdCByZWFkIFdBViBmaWxlIGhlYWRlciAlc1xuIiwgcy0+aW5wdXRfc291cmNlKTsKKyAgICAgICAgICAgICAgICBzLT5pbnB1dF9mZCA9IC0xOworICAgICAgICAgICAgICAgIHMtPmlucHV0X3NvdXJjZSA9IE5VTEw7IC8vIHNldCB0byB0byBhdm9pZCBlbmRsZXNzIHJldHJpZXMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlzIHRoZSBXQVYgZmlsZSBzdGVyZW8/CisgICAgICAgICAgICBzLT5pbnB1dF9pc19zdGVyZW8gPSAod2F2X2hlYWRlclsyMl0gPT0gMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBhc3N1bWUgaW5wdXQgZnJvbSBhbiBhdWRpbyBkZXZpY2UgaXMgc3RlcmVvCisgICAgICAgICAgICBzLT5pbnB1dF9pc19zdGVyZW8gPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDgqIGJ1ZmZlciA9ICh1aW50OCopcGh5c19yYW1fYmFzZSArIHMtPnJlYWRfYnVmZmVyOworICAgIGlmIChzLT5pbnB1dF9pc19zdGVyZW8pIHsKKyAgICAgICAgLy8gbmVlZCB0byByZWFkIHR3aWNlIGFzIG11Y2ggZGF0YQorICAgICAgICBjb3VudCAqPSAyOworICAgIH0KKwordHJ5X2FnYWluOgorICAgIHJlc3VsdCA9IHJlYWQocy0+aW5wdXRfZmQsIGJ1ZmZlciwgY291bnQpOworICAgIGlmIChyZXN1bHQgPT0gMCAmJiBzLT5pbnB1dF9pc193YXYpIHsKKyAgICAgICAgLy8gZW5kIG9mIGZpbGUsIHNvIHNlZWsgYmFjayB0byB0aGUgYmVnaW5uaW5nCisgICAgICAgbHNlZWsocy0+aW5wdXRfZmQsIHNpemVvZih3YXZfaGVhZGVyKSwgU0VFS19TRVQpOworICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPiAwICYmIHMtPmlucHV0X2lzX3N0ZXJlbykgeworICAgICAgICAvLyB3ZSBuZWVkIHRvIGNvbnZlcnQgc3RlcmVvIHRvIG1vbm8KKyAgICAgICAgdWludDgqIHNyYyAgPSAodWludDgqKWJ1ZmZlcjsKKyAgICAgICAgdWludDgqIGRlc3QgPSBzcmM7CisgICAgICAgIGludCBjb3VudCA9IHJlc3VsdC8yOworICAgICAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgICAgIGludCAgc2FtcGxlMSA9IHNyY1swXSB8IChzcmNbMV0gPDwgOCk7CisgICAgICAgICAgICBpbnQgIHNhbXBsZTIgPSBzcmNbMl0gfCAoc3JjWzNdIDw8IDgpOworICAgICAgICAgICAgaW50ICBzYW1wbGUgID0gKHNhbXBsZTEgKyBzYW1wbGUyKSA+PiAxOworICAgICAgICAgICAgZHN0WzBdID0gKHVpbnQ4X3QpIHNhbXBsZTsKKyAgICAgICAgICAgIGRzdFsxXSA9ICh1aW50OF90KShzYW1wbGUgPj4gOCk7CisgICAgICAgICAgICBzcmMgICArPSA0OworICAgICAgICAgICAgZHN0ICAgKz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHJlZHVjZWQgdGhlIG51bWJlciBvZiBieXRlcyBieSAyCisgICAgICAgIHJlc3VsdCAvPSAyOworICAgIH0KKworICAgIHMtPnJlYWRfYnVmZmVyX2F2YWlsYWJsZSA9IChyZXN1bHQgPiAwID8gcmVzdWx0IDogMCk7CisgICAgcy0+aW50X3N0YXR1cyB8PSBBVURJT19JTlRfUkVBRF9CVUZGRVJfRlVMTDsKKyAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAocy0+aW50X3N0YXR1cyAmIHMtPmludF9lbmFibGUpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdWludDMyX3QgZ29sZGZpc2hfYXVkaW9fcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgQVVESU9fSU5UX1NUQVRVUzoKKyAgICAgICAgICAgIC8vIHJldHVybiBjdXJyZW50IGJ1ZmZlciBzdGF0dXMgZmxhZ3MKKyAgICAgICAgICAgIHJldCA9IHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlOworICAgICAgICAgICAgaWYocmV0KSB7CisgICAgICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisJY2FzZSBBVURJT19SRUFEX1NVUFBPUlRFRDoKKyNpZiBVU0VfUUVNVV9BVURJT19JTgorICAgICAgICAgICAgRCgiJXM6IEFVRElPX1JFQURfU1VQUE9SVEVEIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIChzLT52b2ljZWluICE9IE5VTEwpKTsKKyAgICAgICAgICAgIHJldHVybiAocy0+dm9pY2VpbiAhPSBOVUxMKTsKKyNlbHNlCisgICAgICAgICAgICByZXR1cm4gKHMtPmlucHV0X3NvdXJjZSA/IDEgOiAwKTsKKyNlbmRpZgorCisJY2FzZSBBVURJT19SRUFEX0JVRkZFUl9BVkFJTEFCTEU6CisgICAgICAgICAgICBEKCIlczogQVVESU9fUkVBRF9CVUZGRVJfQVZBSUxBQkxFIHJldHVybnMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICBzLT5yZWFkX2J1ZmZlcl9hdmFpbGFibGUpOworICAgICAgICAgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl93cml0ZSggcy0+aW5fYnVmZiApOworCSAgICByZXR1cm4gcy0+cmVhZF9idWZmZXJfYXZhaWxhYmxlOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2F1ZGlvX3JlYWQ6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9hdWRpb193cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fc3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgQVVESU9fSU5UX0VOQUJMRToKKyAgICAgICAgICAgIC8qIGVuYWJsZSBidWZmZXIgZW1wdHkgaW50ZXJydXB0cyAqLworICAgICAgICAgICAgRCgiJXM6IEFVRElPX0lOVF9FTkFCTEUgJWQiLCBfX0ZVTkNUSU9OX18sIHZhbCApOworICAgICAgICAgICAgZW5hYmxlX2F1ZGlvKHMsIHZhbCk7CisgICAgICAgICAgICBzLT5pbnRfZW5hYmxlID0gdmFsOworICAgICAgICAgICAgcy0+aW50X3N0YXR1cyA9IChBVURJT19JTlRfV1JJVEVfQlVGRkVSXzFfRU1QVFkgfCBBVURJT19JTlRfV1JJVEVfQlVGRkVSXzJfRU1QVFkpOworICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TRVRfV1JJVEVfQlVGRkVSXzE6CisgICAgICAgICAgICAvKiBzYXZlIHBvaW50ZXIgdG8gYnVmZmVyIDEgKi8KKyAgICAgICAgICAgIEQoICIlczogQVVESU9fU0VUX1dSSVRFX0JVRkZFUl8xICUwOHgiLCBfX0ZVTkNUSU9OX18sIHZhbCk7CisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3NldF9hZGRyZXNzKCBzLT5vdXRfYnVmZjEsIHZhbCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fU0VUX1dSSVRFX0JVRkZFUl8xX0hJR0g6CisgICAgICAgICAgICAvKiBzYXZlIHBvaW50ZXIgdG8gYnVmZmVyIDEgKi8KKyAgICAgICAgICAgIEQoICIlczogQVVESU9fU0VUX1dSSVRFX0JVRkZFUl8xX0hJR0ggJTA4eCIsIF9fRlVOQ1RJT05fXywgdmFsKTsKKyAgICAgICAgICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfc2V0X2FkZHJlc3NfaGlnaCggcy0+b3V0X2J1ZmYxLCB2YWwgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NFVF9XUklURV9CVUZGRVJfMjoKKyAgICAgICAgICAgIC8qIHNhdmUgcG9pbnRlciB0byBidWZmZXIgMiAqLworICAgICAgICAgICAgRCggIiVzOiBBVURJT19TRVRfV1JJVEVfQlVGRkVSXzIgJTA4eCIsIF9fRlVOQ1RJT05fXywgdmFsKTsKKyAgICAgICAgICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfc2V0X2FkZHJlc3MoIHMtPm91dF9idWZmMiwgdmFsICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TRVRfV1JJVEVfQlVGRkVSXzJfSElHSDoKKyAgICAgICAgICAgIC8qIHNhdmUgcG9pbnRlciB0byBidWZmZXIgMiAqLworICAgICAgICAgICAgRCggIiVzOiBBVURJT19TRVRfV1JJVEVfQlVGRkVSXzJfSElHSCAlMDh4IiwgX19GVU5DVElPTl9fLCB2YWwpOworICAgICAgICAgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl9zZXRfYWRkcmVzc19oaWdoKCBzLT5vdXRfYnVmZjIsIHZhbCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fV1JJVEVfQlVGRkVSXzE6CisgICAgICAgICAgICAvKiByZWNvcmQgdGhhdCBkYXRhIGluIGJ1ZmZlciAxIGlzIHJlYWR5IHRvIHdyaXRlICovCisgICAgICAgICAgICAvL0QoICIlczogQVVESU9fV1JJVEVfQlVGRkVSXzEgJTA4eCIsIF9fRlVOQ1RJT05fXywgdmFsKTsKKyAgICAgICAgICAgIGlmIChzLT5jdXJyZW50X2J1ZmZlciA9PSAwKSBzLT5jdXJyZW50X2J1ZmZlciA9IDE7CisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3NldF9sZW5ndGgoIHMtPm91dF9idWZmMSwgdmFsICk7CisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3JlYWQoIHMtPm91dF9idWZmMSApOworICAgICAgICAgICAgcy0+aW50X3N0YXR1cyAmPSB+QVVESU9fSU5UX1dSSVRFX0JVRkZFUl8xX0VNUFRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fV1JJVEVfQlVGRkVSXzI6CisgICAgICAgICAgICAvKiByZWNvcmQgdGhhdCBkYXRhIGluIGJ1ZmZlciAyIGlzIHJlYWR5IHRvIHdyaXRlICovCisgICAgICAgICAgICAvL0QoICIlczogQVVESU9fV1JJVEVfQlVGRkVSXzIgJTA4eCIsIF9fRlVOQ1RJT05fXywgdmFsKTsKKyAgICAgICAgICAgIGlmIChzLT5jdXJyZW50X2J1ZmZlciA9PSAwKSBzLT5jdXJyZW50X2J1ZmZlciA9IDI7CisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3NldF9sZW5ndGgoIHMtPm91dF9idWZmMiwgdmFsICk7CisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3JlYWQoIHMtPm91dF9idWZmMiApOworICAgICAgICAgICAgcy0+aW50X3N0YXR1cyAmPSB+QVVESU9fSU5UX1dSSVRFX0JVRkZFUl8yX0VNUFRZOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19TRVRfUkVBRF9CVUZGRVI6CisgICAgICAgICAgICAvKiBzYXZlIHBvaW50ZXIgdG8gdGhlIHJlYWQgYnVmZmVyICovCisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19idWZmX3NldF9hZGRyZXNzKCBzLT5pbl9idWZmLCB2YWwgKTsKKyAgICAgICAgICAgIEQoICIlczogQVVESU9fU0VUX1JFQURfQlVGRkVSICUwOHgiLCBfX0ZVTkNUSU9OX18sIHZhbCApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVURJT19TVEFSVF9SRUFEOgorICAgICAgICAgICAgRCggIiVzOiBBVURJT19TVEFSVF9SRUFEICVkIiwgX19GVU5DVElPTl9fLCB2YWwgKTsKKyAgICAgICAgICAgIHN0YXJ0X3JlYWQocywgdmFsKTsKKyAgICAgICAgICAgIHMtPmludF9zdGF0dXMgJj0gfkFVRElPX0lOVF9SRUFEX0JVRkZFUl9GVUxMOworICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1NFVF9SRUFEX0JVRkZFUl9ISUdIOgorICAgICAgICAgICAgLyogc2F2ZSBwb2ludGVyIHRvIHRoZSByZWFkIGJ1ZmZlciAqLworICAgICAgICAgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl9zZXRfYWRkcmVzc19oaWdoKCBzLT5pbl9idWZmLCB2YWwgKTsKKyAgICAgICAgICAgIEQoICIlczogQVVESU9fU0VUX1JFQURfQlVGRkVSX0hJR0ggJTA4eCIsIF9fRlVOQ1RJT05fXywgdmFsICk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF9hdWRpb193cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9hdWRpb19jYWxsYmFjayh2b2lkICpvcGFxdWUsIGludCBmcmVlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgbmV3X3N0YXR1cyA9IDA7CisKKyAgICAvKiBsb29wIHVudGlsIGZyZWUgaXMgemVybyBvciBib3RoIGJ1ZmZlcnMgYXJlIGVtcHR5ICovCisgICAgd2hpbGUgKGZyZWUgJiYgcy0+Y3VycmVudF9idWZmZXIpIHsKKworICAgICAgICAvKiB3cml0ZSBkYXRhIGluIGJ1ZmZlciAxICovCisgICAgICAgIHdoaWxlIChmcmVlICYmIHMtPmN1cnJlbnRfYnVmZmVyID09IDEpIHsKKyAgICAgICAgICAgIGludCAgd3JpdHRlbiA9IGdvbGRmaXNoX2F1ZGlvX2J1ZmZfc2VuZCggcy0+b3V0X2J1ZmYxLCBmcmVlLCBzICk7CisgICAgICAgICAgICBpZiAod3JpdHRlbikgeworICAgICAgICAgICAgICAgIEQoIiVzOiBzZW50ICU1ZCBieXRlcyB0byBhdWRpbyBvdXRwdXQgKGJ1ZmZlciAxKSIsIF9fRlVOQ1RJT05fXywgd3JpdHRlbik7CisgICAgICAgICAgICAgICAgZnJlZSAtPSB3cml0dGVuOworCisgICAgICAgICAgICAgICAgaWYgKGdvbGRmaXNoX2F1ZGlvX2J1ZmZfbGVuZ3RoKCBzLT5vdXRfYnVmZjEgKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19zdGF0dXMgfD0gQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8xX0VNUFRZOworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X2J1ZmZlciA9IChnb2xkZmlzaF9hdWRpb19idWZmX2xlbmd0aCggcy0+b3V0X2J1ZmYyICkgPyAyIDogMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIGRhdGEgaW4gYnVmZmVyIDIgKi8KKyAgICAgICAgd2hpbGUgKGZyZWUgJiYgcy0+Y3VycmVudF9idWZmZXIgPT0gMikgeworICAgICAgICAgICAgaW50ICB3cml0dGVuID0gZ29sZGZpc2hfYXVkaW9fYnVmZl9zZW5kKCBzLT5vdXRfYnVmZjIsIGZyZWUsIHMgKTsKKyAgICAgICAgICAgIGlmICh3cml0dGVuKSB7CisgICAgICAgICAgICAgICAgRCgiJXM6IHNlbnQgJTVkIGJ5dGVzIHRvIGF1ZGlvIG91dHB1dCAoYnVmZmVyIDIpIiwgX19GVU5DVElPTl9fLCB3cml0dGVuKTsKKyAgICAgICAgICAgICAgICBmcmVlIC09IHdyaXR0ZW47CisKKyAgICAgICAgICAgICAgICBpZiAoZ29sZGZpc2hfYXVkaW9fYnVmZl9sZW5ndGgoIHMtPm91dF9idWZmMiApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YXR1cyB8PSBBVURJT19JTlRfV1JJVEVfQlVGRkVSXzJfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfYnVmZmVyID0gKGdvbGRmaXNoX2F1ZGlvX2J1ZmZfbGVuZ3RoKCBzLT5vdXRfYnVmZjEgKSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld19zdGF0dXMgJiYgbmV3X3N0YXR1cyAhPSBzLT5pbnRfc3RhdHVzKSB7CisgICAgICAgIHMtPmludF9zdGF0dXMgfD0gbmV3X3N0YXR1czsKKyAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgfQorfQorCisjaWYgVVNFX1FFTVVfQVVESU9fSU4KK3N0YXRpYyB2b2lkCitnb2xkZmlzaF9hdWRpb19pbl9jYWxsYmFjayh2b2lkICpvcGFxdWUsIGludCBhdmFpbCkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYXVkaW9fc3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IG5ld19zdGF0dXMgPSAwOworCisgICAgaWYgKGdvbGRmaXNoX2F1ZGlvX2J1ZmZfYXZhaWxhYmxlKCBzLT5pbl9idWZmICkgPT0gMCApCisgICAgICAgIHJldHVybjsKKworICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgaW50ICByZWFkID0gZ29sZGZpc2hfYXVkaW9fYnVmZl9yZWN2KCBzLT5pbl9idWZmLCBhdmFpbCwgcyApOworICAgICAgICBpZiAocmVhZCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXZhaWwgLT0gcmVhZDsKKworICAgICAgICBpZiAoZ29sZGZpc2hfYXVkaW9fYnVmZl9hdmFpbGFibGUoIHMtPmluX2J1ZmYpID09IDApIHsKKyAgICAgICAgICAgIG5ld19zdGF0dXMgfD0gQVVESU9fSU5UX1JFQURfQlVGRkVSX0ZVTEw7CisgICAgICAgICAgICBEKCIlczogQVVESU9fSU5UX1JFQURfQlVGRkVSX0ZVTEwgYXZhaWxhYmxlPSVkIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnb2xkZmlzaF9hdWRpb19idWZmX2xlbmd0aCggcy0+aW5fYnVmZiApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld19zdGF0dXMgJiYgbmV3X3N0YXR1cyAhPSBzLT5pbnRfc3RhdHVzKSB7CisgICAgICAgIHMtPmludF9zdGF0dXMgfD0gbmV3X3N0YXR1czsKKyAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgfQorfQorI2VuZGlmIC8qIFVTRV9RRU1VX0FVRElPX0lOICovCisKK3N0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqZ29sZGZpc2hfYXVkaW9fcmVhZGZuW10gPSB7CisgICBnb2xkZmlzaF9hdWRpb19yZWFkLAorICAgZ29sZGZpc2hfYXVkaW9fcmVhZCwKKyAgIGdvbGRmaXNoX2F1ZGlvX3JlYWQKK307CisKK3N0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKmdvbGRmaXNoX2F1ZGlvX3dyaXRlZm5bXSA9IHsKKyAgIGdvbGRmaXNoX2F1ZGlvX3dyaXRlLAorICAgZ29sZGZpc2hfYXVkaW9fd3JpdGUsCisgICBnb2xkZmlzaF9hdWRpb193cml0ZQorfTsKKwordm9pZCBnb2xkZmlzaF9hdWRpb19pbml0KHVpbnQzMl90IGJhc2UsIGludCBpZCwgY29uc3QgY2hhciogaW5wdXRfc291cmNlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSAqczsKKyAgICBzdHJ1Y3QgYXVkc2V0dGluZ3MgYXM7CisKKyAgICAvKiBub3RoaW5nIHRvIGRvIGlmIG5vIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgKi8KKyAgICBpZiAoIWFuZHJvaWRfaHctPmh3X2F1ZGlvT3V0cHV0ICYmICFhbmRyb2lkX2h3LT5od19hdWRpb0lucHV0KQorICAgICAgICByZXR1cm47CisKKyAgICBzID0gKHN0cnVjdCBnb2xkZmlzaF9hdWRpb19zdGF0ZSAqKWdfbWFsbG9jMChzaXplb2YoKnMpKTsKKyAgICBzLT5kZXYubmFtZSA9ICJnb2xkZmlzaF9hdWRpbyI7CisgICAgcy0+ZGV2LmlkID0gaWQ7CisgICAgcy0+ZGV2LmJhc2UgPSBiYXNlOworICAgIHMtPmRldi5zaXplID0gMHgxMDAwOworICAgIHMtPmRldi5pcnFfY291bnQgPSAxOworCisjaWZuZGVmIFVTRV9RRU1VX0FVRElPX0lOCisgICAgcy0+aW5wdXRfZmQgPSAtMTsKKyAgICBpZiAoaW5wdXRfc291cmNlKSB7CisgICAgICAgIHMtPmlucHV0X3NvdXJjZSA9IGlucHV0X3NvdXJjZTsKKyAgICAgICAgY2hhciogZXh0ZW5zaW9uID0gc3RycmNocihpbnB1dF9zb3VyY2UsICcuJyk7CisgICAgICAgIGlmIChleHRlbnNpb24gJiYgc3RyY2FzZWNtcChleHRlbnNpb24sICIud2F2IikgPT0gMCkgeworICAgICAgICAgICAgcy0+aW5wdXRfaXNfd2F2ID0gMTsKKyAgICAgICAgfQorICAgICB9CisjZW5kaWYKKworICAgIEFVRF9yZWdpc3Rlcl9jYXJkKCAiZ29sZGZpc2hfYXVkaW8iLCAmcy0+Y2FyZCk7CisKKyAgICBhcy5mcmVxID0gNDQxMDA7CisgICAgYXMubmNoYW5uZWxzID0gMjsKKyAgICBhcy5mbXQgPSBBVURfRk1UX1MxNjsKKyAgICBhcy5lbmRpYW5uZXNzID0gQVVESU9fSE9TVF9FTkRJQU5ORVNTOworCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X2F1ZGlvT3V0cHV0KSB7CisgICAgICAgIHMtPnZvaWNlID0gQVVEX29wZW5fb3V0ICgKKyAgICAgICAgICAgICZzLT5jYXJkLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICJnb2xkZmlzaF9hdWRpbyIsCisgICAgICAgICAgICBzLAorICAgICAgICAgICAgZ29sZGZpc2hfYXVkaW9fY2FsbGJhY2ssCisgICAgICAgICAgICAmYXMKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICghcy0+dm9pY2UpIHsKKyAgICAgICAgICAgIGRwcmludCgid2FybmluZzogb3BlbmluZyBhdWRpbyBvdXRwdXQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVTRV9RRU1VX0FVRElPX0lOCisgICAgYXMuZnJlcSAgICAgICA9IDgwMDA7CisgICAgYXMubmNoYW5uZWxzICA9IDE7CisgICAgYXMuZm10ICAgICAgICA9IEFVRF9GTVRfUzE2OworICAgIGFzLmVuZGlhbm5lc3MgPSBBVURJT19IT1NUX0VORElBTk5FU1M7CisKKyAgICBpZiAoYW5kcm9pZF9ody0+aHdfYXVkaW9JbnB1dCkgeworICAgICAgICBzLT52b2ljZWluID0gQVVEX29wZW5faW4gKAorICAgICAgICAgICAgJnMtPmNhcmQsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgImdvbGRmaXNoX2F1ZGlvX2luIiwKKyAgICAgICAgICAgIHMsCisgICAgICAgICAgICBnb2xkZmlzaF9hdWRpb19pbl9jYWxsYmFjaywKKyAgICAgICAgICAgICZhcworICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCFzLT52b2ljZWluKSB7CisgICAgICAgICAgICBkcHJpbnQoIndhcm5pbmc6IG9wZW5pbmcgYXVkaW8gaW5wdXQgZmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZ29sZGZpc2hfYXVkaW9fYnVmZl9pbml0KCBzLT5vdXRfYnVmZjEgKTsKKyAgICBnb2xkZmlzaF9hdWRpb19idWZmX2luaXQoIHMtPm91dF9idWZmMiApOworICAgIGdvbGRmaXNoX2F1ZGlvX2J1ZmZfaW5pdCggcy0+aW5fYnVmZiApOworCisgICAgZ29sZGZpc2hfZGV2aWNlX2FkZCgmcy0+ZGV2LCBnb2xkZmlzaF9hdWRpb19yZWFkZm4sIGdvbGRmaXNoX2F1ZGlvX3dyaXRlZm4sIHMpOworCisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJhdWRpb19zdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUQVRFX1NBVkVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RhdGVfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RhdGVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvYmF0dGVyeS5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGUzNmJmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2JhdHRlcnkuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvcG93ZXJfc3VwcGx5LmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworZW51bSB7CisJLyogc3RhdHVzIHJlZ2lzdGVyICovCisJQkFUVEVSWV9JTlRfU1RBVFVTCSAgICA9IDB4MDAsCisJLyogc2V0IHRoaXMgdG8gZW5hYmxlIElSUSAqLworCUJBVFRFUllfSU5UX0VOQUJMRQkgICAgPSAweDA0LAorCisJQkFUVEVSWV9BQ19PTkxJTkUgICAgICAgPSAweDA4LAorCUJBVFRFUllfU1RBVFVTICAgICAgICAgID0gMHgwQywKKwlCQVRURVJZX0hFQUxUSCAgICAgICAgICA9IDB4MTAsCisJQkFUVEVSWV9QUkVTRU5UICAgICAgICAgPSAweDE0LAorCUJBVFRFUllfQ0FQQUNJVFkgICAgICAgID0gMHgxOCwKKworCUJBVFRFUllfU1RBVFVTX0NIQU5HRUQJPSAxVSA8PCAwLAorCUFDX1NUQVRVU19DSEFOR0VEICAgCT0gMVUgPDwgMSwKKwlCQVRURVJZX0lOVF9NQVNLICAgICAgICA9IEJBVFRFUllfU1RBVFVTX0NIQU5HRUQgfCBBQ19TVEFUVVNfQ0hBTkdFRCwKK307CisKKworc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfc3RhdGUgeworICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgZGV2OworICAgIC8vIElSUXMKKyAgICB1aW50MzJfdCBpbnRfc3RhdHVzOworICAgIC8vIGlycSBlbmFibGUgbWFzayBmb3IgaW50X3N0YXR1cworICAgIHVpbnQzMl90IGludF9lbmFibGU7CisKKyAgICBpbnQgYWNfb25saW5lOworICAgIGludCBzdGF0dXM7CisgICAgaW50IGhlYWx0aDsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgY2FwYWNpdHk7CisKKyAgICAvLyB0aGUgZmllbGRzIGJlbG93IGFyZSBwYXJ0IG9mIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgorICAgIC8vIGFuZCBkb24ndCBuZWVkIHRvIGJlIHNhdmVkIHRvIC8gcmVzdG9yZWQgZnJvbSBzbmFwc2hvdHMuCisgICAgaW50IGh3X2hhc19iYXR0ZXJ5OworfTsKKworLyogdXBkYXRlIHRoaXMgZWFjaCB0aW1lIHlvdSB1cGRhdGUgdGhlIGJhdHRlcnlfc3RhdGUgc3RydWN0ICovCisjZGVmaW5lICBCQVRURVJZX1NUQVRFX1NBVkVfVkVSU0lPTiAgMQorCisjZGVmaW5lICBRRklFTERfU1RSVUNUICBzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9zdGF0ZQorUUZJRUxEX0JFR0lOKGdvbGRmaXNoX2JhdHRlcnlfZmllbGRzKQorICAgIFFGSUVMRF9JTlQzMihpbnRfc3RhdHVzKSwKKyAgICBRRklFTERfSU5UMzIoaW50X2VuYWJsZSksCisgICAgUUZJRUxEX0lOVDMyKGFjX29ubGluZSksCisgICAgUUZJRUxEX0lOVDMyKHN0YXR1cyksCisgICAgUUZJRUxEX0lOVDMyKGhlYWx0aCksCisgICAgUUZJRUxEX0lOVDMyKHByZXNlbnQpLAorICAgIFFGSUVMRF9JTlQzMihjYXBhY2l0eSksCitRRklFTERfRU5ECisKK3N0YXRpYyB2b2lkICBnb2xkZmlzaF9iYXR0ZXJ5X3NhdmUoUUVNVUZpbGUqICBmLCB2b2lkKiBvcGFxdWUpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfc3RhdGUqICBzID0gb3BhcXVlOworCisgICAgcWVtdV9wdXRfc3RydWN0KGYsIGdvbGRmaXNoX2JhdHRlcnlfZmllbGRzLCBzKTsKK30KKworc3RhdGljIGludCAgIGdvbGRmaXNoX2JhdHRlcnlfbG9hZChRRU1VRmlsZSogIGYsIHZvaWQqICBvcGFxdWUsIGludCAgdmVyc2lvbl9pZCkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBCQVRURVJZX1NUQVRFX1NBVkVfVkVSU0lPTikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHFlbXVfZ2V0X3N0cnVjdChmLCBnb2xkZmlzaF9iYXR0ZXJ5X2ZpZWxkcywgcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9zdGF0ZSAqYmF0dGVyeV9zdGF0ZTsKKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX2JhdHRlcnlfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIHN0cnVjdCBnb2xkZmlzaF9iYXR0ZXJ5X3N0YXRlICpzID0gb3BhcXVlOworCisgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIEJBVFRFUllfSU5UX1NUQVRVUzoKKyAgICAgICAgICAgIC8vIHJldHVybiBjdXJyZW50IGJ1ZmZlciBzdGF0dXMgZmxhZ3MKKyAgICAgICAgICAgIHJldCA9IHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDApOworICAgICAgICAgICAgICAgIHMtPmludF9zdGF0dXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworCQljYXNlIEJBVFRFUllfSU5UX0VOQUJMRToKKwkJICAgIHJldHVybiBzLT5pbnRfZW5hYmxlOworCQljYXNlIEJBVFRFUllfQUNfT05MSU5FOgorCQkgICAgcmV0dXJuIHMtPmFjX29ubGluZTsKKwkJY2FzZSBCQVRURVJZX1NUQVRVUzoKKwkJICAgIHJldHVybiBzLT5zdGF0dXM7CisJCWNhc2UgQkFUVEVSWV9IRUFMVEg6CisJCSAgICByZXR1cm4gcy0+aGVhbHRoOworCQljYXNlIEJBVFRFUllfUFJFU0VOVDoKKwkJICAgIHJldHVybiBzLT5wcmVzZW50OworCQljYXNlIEJBVFRFUllfQ0FQQUNJVFk6CisJCSAgICByZXR1cm4gcy0+Y2FwYWNpdHk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfYmF0dGVyeV9yZWFkOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ29sZGZpc2hfYmF0dGVyeV93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9zdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHN3aXRjaChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSBCQVRURVJZX0lOVF9FTkFCTEU6CisgICAgICAgICAgICAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICAgICAgcy0+aW50X2VuYWJsZSA9IHZhbDsKKworICAgICAgICAgICAgdWludDMyX3Qgbm93X2FjdGl2ZSA9IChzLT5pbnRfZW5hYmxlICYgcy0+aW50X3N0YXR1cyk7CisgICAgICAgICAgICBpZiAobm93X2FjdGl2ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gU29tZSBpbnRlcnJ1cHQgaXMgbm93IHVubWFza2VkLCBzaWduYWwgSVJRCisgICAgICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgbm93X2FjdGl2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF9hdWRpb193cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQorfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmdvbGRmaXNoX2JhdHRlcnlfcmVhZGZuW10gPSB7CisgICAgZ29sZGZpc2hfYmF0dGVyeV9yZWFkLAorICAgIGdvbGRmaXNoX2JhdHRlcnlfcmVhZCwKKyAgICBnb2xkZmlzaF9iYXR0ZXJ5X3JlYWQKK307CisKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfYmF0dGVyeV93cml0ZWZuW10gPSB7CisgICAgZ29sZGZpc2hfYmF0dGVyeV93cml0ZSwKKyAgICBnb2xkZmlzaF9iYXR0ZXJ5X3dyaXRlLAorICAgIGdvbGRmaXNoX2JhdHRlcnlfd3JpdGUKK307CisKK3ZvaWQgZ29sZGZpc2hfYmF0dGVyeV9pbml0KGludCBoYXNfYmF0dGVyeSkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9zdGF0ZSAqczsKKworICAgIHMgPSAoc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfc3RhdGUgKilnX21hbGxvYzAoc2l6ZW9mKCpzKSk7CisgICAgcy0+ZGV2Lm5hbWUgPSAiZ29sZGZpc2gtYmF0dGVyeSI7CisgICAgcy0+ZGV2LmJhc2UgPSAwOyAgICAvLyB3aWxsIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseQorICAgIHMtPmRldi5zaXplID0gMHgxMDAwOworICAgIHMtPmRldi5pcnFfY291bnQgPSAxOworCisgICAgLy8gZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBiYXR0ZXJ5CisgICAgcy0+YWNfb25saW5lID0gMTsKKyAgICBzLT5od19oYXNfYmF0dGVyeSA9IGhhc19iYXR0ZXJ5OworICAgIGlmIChoYXNfYmF0dGVyeSkgeworICAgICAgICBzLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworICAgICAgICBzLT5oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisgICAgICAgIHMtPnByZXNlbnQgPSAxOyAgICAgLy8gYmF0dGVyeSBpcyBwcmVzZW50CisgICAgICAgIHMtPmNhcGFjaXR5ID0gNTA7ICAgLy8gNTAlIGNoYXJnZWQKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKyAgICAgICAgcy0+aGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworICAgICAgICBzLT5wcmVzZW50ID0gMDsKKyAgICAgICAgcy0+Y2FwYWNpdHkgPSAwOworICAgIH0KKworICAgIGJhdHRlcnlfc3RhdGUgPSBzOworCisgICAgZ29sZGZpc2hfZGV2aWNlX2FkZCgmcy0+ZGV2LCBnb2xkZmlzaF9iYXR0ZXJ5X3JlYWRmbiwgZ29sZGZpc2hfYmF0dGVyeV93cml0ZWZuLCBzKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiYmF0dGVyeV9zdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEJBVFRFUllfU1RBVEVfU0FWRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9iYXR0ZXJ5X3NhdmUsCisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX2JhdHRlcnlfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7Cit9CisKK2ludCBnb2xkZmlzaF9iYXR0ZXJ5X3JlYWRfcHJvcChpbnQgcHJvcGVydHkpCit7CisgICAgaW50IHJldFZhbCA9IDA7CisKKyAgICBpZiAoIWJhdHRlcnlfc3RhdGUgfHwgIWJhdHRlcnlfc3RhdGUtPmh3X2hhc19iYXR0ZXJ5KSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisgICAgICAgICAgICByZXRWYWwgPSBiYXR0ZXJ5X3N0YXRlLT5hY19vbmxpbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisgICAgICAgICAgICByZXRWYWwgPSBiYXR0ZXJ5X3N0YXRlLT5zdGF0dXM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisgICAgICAgICAgICByZXRWYWwgPSBiYXR0ZXJ5X3N0YXRlLT5oZWFsdGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorICAgICAgICAgICAgcmV0VmFsID0gYmF0dGVyeV9zdGF0ZS0+cHJlc2VudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgorICAgICAgICAgICAgcmV0VmFsID0gYmF0dGVyeV9zdGF0ZS0+Y2FwYWNpdHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldFZhbCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKK30KKwordm9pZCBnb2xkZmlzaF9iYXR0ZXJ5X3NldF9wcm9wKGludCBhYywgaW50IHByb3BlcnR5LCBpbnQgdmFsdWUpCit7CisgICAgaW50IG5ld19zdGF0dXMgPSAoYWMgPyBBQ19TVEFUVVNfQ0hBTkdFRCA6IEJBVFRFUllfU1RBVFVTX0NIQU5HRUQpOworCisgICAgaWYgKCFiYXR0ZXJ5X3N0YXRlIHx8ICFiYXR0ZXJ5X3N0YXRlLT5od19oYXNfYmF0dGVyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGFjKSB7CisgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorICAgICAgICAgICAgICAgIGJhdHRlcnlfc3RhdGUtPmFjX29ubGluZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHsKKyAgICAgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorICAgICAgICAgICAgICAgIGJhdHRlcnlfc3RhdGUtPnN0YXR1cyA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisgICAgICAgICAgICAgICAgYmF0dGVyeV9zdGF0ZS0+aGVhbHRoID0gdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisgICAgICAgICAgICAgICAgYmF0dGVyeV9zdGF0ZS0+cHJlc2VudCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKyAgICAgICAgICAgICAgICBiYXR0ZXJ5X3N0YXRlLT5jYXBhY2l0eSA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld19zdGF0dXMgIT0gYmF0dGVyeV9zdGF0ZS0+aW50X3N0YXR1cykgeworICAgICAgICBiYXR0ZXJ5X3N0YXRlLT5pbnRfc3RhdHVzIHw9IG5ld19zdGF0dXM7CisgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZiYXR0ZXJ5X3N0YXRlLT5kZXYsIDAsIChiYXR0ZXJ5X3N0YXRlLT5pbnRfc3RhdHVzICYgYmF0dGVyeV9zdGF0ZS0+aW50X2VuYWJsZSkpOworICAgIH0KK30KKwordm9pZCBnb2xkZmlzaF9iYXR0ZXJ5X2Rpc3BsYXkodm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikpIHsKKyAgICBjaGFyICAgICAgICAgIGJ1ZmZlclsxMDBdOworICAgIGNvbnN0IGNoYXIqICAgdmFsdWU7CisKKyAgICAvLyBOb3RlOiBvYnZpb3VzbHksIGlmIHRoZXJlIGlzIG5vIGJhdHRlcnksIHRoZSBBQyBtdXN0IGFsd2F5cyBiZSBvbi4KKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJBQzogJXNcclxuIiwKKyAgICAgICAgICAgICAoYmF0dGVyeV9zdGF0ZS0+YWNfb25saW5lKSA/ICJvbmxpbmUiIDogIm9mZmxpbmUiKTsKKyAgICBjYWxsYmFjayhkYXRhLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHN3aXRjaCAoYmF0dGVyeV9zdGF0ZS0+c3RhdHVzKSB7CisgICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzoKKyAgICAgICAgICAgIHZhbHVlID0gIkNoYXJnaW5nIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc6CisgICAgICAgICAgICB2YWx1ZSA9ICJEaXNjaGFyZ2luZyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzoKKyAgICAgICAgICAgIHZhbHVlID0gIk5vdCBjaGFyZ2luZyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw6CisgICAgICAgICAgICB2YWx1ZSA9ICJGdWxsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdmFsdWUgPSAiVW5rbm93biI7CisgICAgfQorICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgInN0YXR1czogJXNcclxuIiwgdmFsdWUpOworICAgIGNhbGxiYWNrKGRhdGEsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworCisgICAgc3dpdGNoIChiYXR0ZXJ5X3N0YXRlLT5oZWFsdGgpIHsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q6CisgICAgICAgICAgICB2YWx1ZSA9ICJHb29kIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ6CisgICAgICAgICAgICB2YWx1ZSA9ICJPdmVyaGVhZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ6CisgICAgICAgICAgICB2YWx1ZSA9ICJEZWFkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U6CisgICAgICAgICAgICB2YWx1ZSA9ICJPdmVydm9sdGFnZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOgorICAgICAgICAgICAgdmFsdWUgPSAiVW5zcGVjaWZpZWQgZmFpbHVyZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbHVlID0gIlVua25vd24iOworICAgIH0KKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJoZWFsdGg6ICVzXHJcbiIsIHZhbHVlKTsKKyAgICBjYWxsYmFjayhkYXRhLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlciwgInByZXNlbnQ6ICVzXHJcbiIsCisgICAgICAgICAgICAgKGJhdHRlcnlfc3RhdGUtPnByZXNlbnQpID8gInRydWUiIDogImZhbHNlIik7CisgICAgY2FsbGJhY2soZGF0YSwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisKKyAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZiBidWZmZXIsICJjYXBhY2l0eTogJWRcclxuIiwgYmF0dGVyeV9zdGF0ZS0+Y2FwYWNpdHkpOworICAgIGNhbGxiYWNrKGRhdGEsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTFhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vcWVtdS1maWxlLmgiCisjaW5jbHVkZSAiaHcvYXJtL3BpYy5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC92bWVtLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorCisjZGVmaW5lIFBERVZfQlVTX09QX0RPTkUgICAgICAgICgweDAwKQorI2RlZmluZSBQREVWX0JVU19PUF9SRU1PVkVfREVWICAoMHgwNCkKKyNkZWZpbmUgUERFVl9CVVNfT1BfQUREX0RFViAgICAgKDB4MDgpCisKKyNkZWZpbmUgUERFVl9CVVNfT1BfSU5JVCAgICAgICAgKDB4MDApCisKKyNkZWZpbmUgUERFVl9CVVNfT1AgICAgICAgICAgICAgKDB4MDApCisjZGVmaW5lIFBERVZfQlVTX0dFVF9OQU1FICAgICAgICgweDA0KQorI2RlZmluZSBQREVWX0JVU19OQU1FX0xFTiAgICAgICAoMHgwOCkKKyNkZWZpbmUgUERFVl9CVVNfSUQgICAgICAgICAgICAgKDB4MGMpCisjZGVmaW5lIFBERVZfQlVTX0lPX0JBU0UgICAgICAgICgweDEwKQorI2RlZmluZSBQREVWX0JVU19JT19TSVpFICAgICAgICAoMHgxNCkKKyNkZWZpbmUgUERFVl9CVVNfSVJRICAgICAgICAgICAgKDB4MTgpCisjZGVmaW5lIFBERVZfQlVTX0lSUV9DT1VOVCAgICAgICgweDFjKQorCisjZGVmaW5lIFBERVZfQlVTX05BTUVfQUREUl9ISUdIICAoMHgyMCkKKworc3RydWN0IGJ1c19zdGF0ZSB7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSBkZXY7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSAqY3VycmVudDsKKyAgICB1aW50NjRfdCBuYW1lX2FkZHJfaGlnaDsKK307CisKK3FlbXVfaXJxICpnb2xkZmlzaF9waWM7CitzdGF0aWMgc3RydWN0IGdvbGRmaXNoX2RldmljZSAqZmlyc3RfZGV2aWNlOworc3RhdGljIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmxhc3RfZGV2aWNlOwordWludDMyX3QgZ29sZGZpc2hfZnJlZV9iYXNlOwordWludDMyX3QgZ29sZGZpc2hfZnJlZV9pcnE7CisKK2ludCBnb2xkZmlzaF82NGJpdF9ndWVzdCA9IDA7CisKK2ludCBnb2xkZmlzaF9ndWVzdF9pc182NGJpdCgpCit7CisgICAgcmV0dXJuIGdvbGRmaXNoXzY0Yml0X2d1ZXN0OworfQorCit2b2lkIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmRldiwgaW50IGlycSwgaW50IGxldmVsKQoreworICAgIGlmKGlycSA+PSBkZXYtPmlycV9jb3VudCkKKyAgICAgICAgY3B1X2Fib3J0IChjcHVfc2luZ2xlX2VudiwgImdvbGRmaXNoX2RldmljZV9zZXRfaXJxOiBCYWQgaXJxICVkID49ICVkXG4iLCBpcnEsIGRldi0+aXJxX2NvdW50KTsKKyAgICBlbHNlCisgICAgICAgIHFlbXVfc2V0X2lycShnb2xkZmlzaF9waWNbZGV2LT5pcnEgKyBpcnFdLCBsZXZlbCk7Cit9CisKK2ludCBnb2xkZmlzaF9hZGRfZGV2aWNlX25vX2lvKHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmRldikKK3sKKyAgICBpZihkZXYtPmJhc2UgPT0gMCkgeworICAgICAgICBkZXYtPmJhc2UgPSBnb2xkZmlzaF9mcmVlX2Jhc2U7CisgICAgICAgIGdvbGRmaXNoX2ZyZWVfYmFzZSArPSBkZXYtPnNpemU7CisgICAgfQorICAgIGlmKGRldi0+aXJxID09IDAgJiYgZGV2LT5pcnFfY291bnQgPiAwKSB7CisgICAgICAgIGRldi0+aXJxID0gZ29sZGZpc2hfZnJlZV9pcnE7CisgICAgICAgIGdvbGRmaXNoX2ZyZWVfaXJxICs9IGRldi0+aXJxX2NvdW50OworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIHBhc3MgYnkgdGhlIHJlc2VydmVkIElSUXMuICovCisgICAgICAgIHdoaWxlIChnb2xkZmlzaF9mcmVlX2lycSA9PSBHRkRfS0JEX0lSUSB8fAorICAgICAgICAgICAgICAgZ29sZGZpc2hfZnJlZV9pcnEgPT0gR0ZEX1JUQ19JUlEgfHwKKyAgICAgICAgICAgICAgIGdvbGRmaXNoX2ZyZWVfaXJxID09IEdGRF9NT1VTRV9JUlEgfHwKKyAgICAgICAgICAgICAgIGdvbGRmaXNoX2ZyZWVfaXJxID09IEdGRF9FUlJfSVJRKSB7CisgICAgICAgICAgICBnb2xkZmlzaF9mcmVlX2lycSsrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGdvbGRmaXNoX2ZyZWVfaXJxID49IEdGRF9NQVhfSVJRKSB7CisgICAgICAgICAgICBkZXJyb3IoIkdvbGRmaXNoIGRldmljZSBoYXMgZXhjZWVkZWQgYXZhaWxhYmxlIElSUSBudW1iZXIuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIC8vcHJpbnRmKCJnb2xkZmlzaF9hZGRfZGV2aWNlOiAlcywgYmFzZSAleCAleCwgaXJxICVkICVkXG4iLAorICAgIC8vICAgICAgIGRldi0+bmFtZSwgZGV2LT5iYXNlLCBkZXYtPnNpemUsIGRldi0+aXJxLCBkZXYtPmlycV9jb3VudCk7CisgICAgZGV2LT5uZXh0ID0gTlVMTDsKKyAgICBpZihsYXN0X2RldmljZSkgeworICAgICAgICBsYXN0X2RldmljZS0+bmV4dCA9IGRldjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZpcnN0X2RldmljZSA9IGRldjsKKyAgICB9CisgICAgbGFzdF9kZXZpY2UgPSBkZXY7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBnb2xkZmlzaF9kZXZpY2VfYWRkKHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BVUmVhZE1lbW9yeUZ1bmMgKiptZW1fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BVV3JpdGVNZW1vcnlGdW5jICoqbWVtX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgaW50IGlvbWVtdHlwZTsKKyAgICBnb2xkZmlzaF9hZGRfZGV2aWNlX25vX2lvKGRldik7CisgICAgaW9tZW10eXBlID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShtZW1fcmVhZCwgbWVtX3dyaXRlLCBvcGFxdWUpOworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoZGV2LT5iYXNlLCBkZXYtPnNpemUsIGlvbWVtdHlwZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnb2xkZmlzaF9idXNfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgc3RydWN0IGJ1c19zdGF0ZSAqcyA9IChzdHJ1Y3QgYnVzX3N0YXRlICopb3BhcXVlOworCisgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSBQREVWX0JVU19PUDoKKyAgICAgICAgICAgIGlmKHMtPmN1cnJlbnQpIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50LT5yZXBvcnRlZF9zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgcy0+Y3VycmVudCA9IHMtPmN1cnJlbnQtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5jdXJyZW50ID0gZmlyc3RfZGV2aWNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUocy0+Y3VycmVudCAmJiBzLT5jdXJyZW50LT5yZXBvcnRlZF9zdGF0ZSA9PSAxKQorICAgICAgICAgICAgICAgIHMtPmN1cnJlbnQgPSBzLT5jdXJyZW50LT5uZXh0OworICAgICAgICAgICAgaWYocy0+Y3VycmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUERFVl9CVVNfT1BfQUREX0RFVjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDApOworICAgICAgICAgICAgICAgIHJldHVybiBQREVWX0JVU19PUF9ET05FOworICAgICAgICAgICAgfQorCisgICAgICAgIGNhc2UgUERFVl9CVVNfTkFNRV9MRU46CisgICAgICAgICAgICByZXR1cm4gcy0+Y3VycmVudCA/IHN0cmxlbihzLT5jdXJyZW50LT5uYW1lKSA6IDA7CisgICAgICAgIGNhc2UgUERFVl9CVVNfSUQ6CisgICAgICAgICAgICByZXR1cm4gcy0+Y3VycmVudCA/IHMtPmN1cnJlbnQtPmlkIDogMDsKKyAgICAgICAgY2FzZSBQREVWX0JVU19JT19CQVNFOgorICAgICAgICAgICAgcmV0dXJuIHMtPmN1cnJlbnQgPyBzLT5jdXJyZW50LT5iYXNlIDogMDsKKyAgICAgICAgY2FzZSBQREVWX0JVU19JT19TSVpFOgorICAgICAgICAgICAgcmV0dXJuIHMtPmN1cnJlbnQgPyBzLT5jdXJyZW50LT5zaXplIDogMDsKKyAgICAgICAgY2FzZSBQREVWX0JVU19JUlE6CisgICAgICAgICAgICByZXR1cm4gcy0+Y3VycmVudCA/IHMtPmN1cnJlbnQtPmlycSA6IDA7CisgICAgICAgIGNhc2UgUERFVl9CVVNfSVJRX0NPVU5UOgorICAgICAgICAgICAgcmV0dXJuIHMtPmN1cnJlbnQgPyBzLT5jdXJyZW50LT5pcnFfY291bnQgOiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF9idXNfcmVhZDogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9idXNfb3BfaW5pdChzdHJ1Y3QgYnVzX3N0YXRlICpzKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmRldiA9IGZpcnN0X2RldmljZTsKKyAgICB3aGlsZShkZXYpIHsKKyAgICAgICAgZGV2LT5yZXBvcnRlZF9zdGF0ZSA9IDA7CisgICAgICAgIGRldiA9IGRldi0+bmV4dDsKKyAgICB9CisgICAgcy0+Y3VycmVudCA9IE5VTEw7CisgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgZmlyc3RfZGV2aWNlICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9idXNfd3JpdGUodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgYnVzX3N0YXRlICpzID0gKHN0cnVjdCBidXNfc3RhdGUgKilvcGFxdWU7CisKKyAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgUERFVl9CVVNfT1A6CisgICAgICAgICAgICBzd2l0Y2godmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFBERVZfQlVTX09QX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX2J1c19vcF9pbml0KHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfYnVzX3dyaXRlOiBCYWQgUERFVl9CVVNfT1AgdmFsdWUgJXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUERFVl9CVVNfR0VUX05BTUU6CisgICAgICAgICAgICBpZihzLT5jdXJyZW50KSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIG5hbWUgPSAodGFyZ2V0X3Vsb25nKShzLT5uYW1lX2FkZHJfaGlnaCB8IHZhbHVlKTsKKyAgICAgICAgICAgICAgICBzYWZlX21lbW9yeV9yd19kZWJ1ZyhjdXJyZW50X2NwdSwgbmFtZSwgKHZvaWQqKXMtPmN1cnJlbnQtPm5hbWUsIHN0cmxlbihzLT5jdXJyZW50LT5uYW1lKSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQREVWX0JVU19OQU1FX0FERFJfSElHSDoKKyAgICAgICAgICAgIHMtPm5hbWVfYWRkcl9oaWdoID0gKCh1aW50NjRfdCl2YWx1ZSA8PCAzMik7CisgICAgICAgICAgICBnb2xkZmlzaF82NGJpdF9ndWVzdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfYnVzX3dyaXRlOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqZ29sZGZpc2hfYnVzX3JlYWRmbltdID0geworICAgIGdvbGRmaXNoX2J1c19yZWFkLAorICAgIGdvbGRmaXNoX2J1c19yZWFkLAorICAgIGdvbGRmaXNoX2J1c19yZWFkCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpnb2xkZmlzaF9idXNfd3JpdGVmbltdID0geworICAgIGdvbGRmaXNoX2J1c193cml0ZSwKKyAgICBnb2xkZmlzaF9idXNfd3JpdGUsCisgICAgZ29sZGZpc2hfYnVzX3dyaXRlCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3N0YXRlIGJ1c19zdGF0ZSA9IHsKKyAgICAuZGV2ID0geworICAgICAgICAubmFtZSA9ICJnb2xkZmlzaF9kZXZpY2VfYnVzIiwKKyAgICAgICAgLmlkID0gLTEsCisgICAgICAgIC5iYXNlID0gMHgxMDAwMTAwMCwKKyAgICAgICAgLnNpemUgPSAweDEwMDAsCisgICAgICAgIC5pcnEgPSAxLAorICAgICAgICAuaXJxX2NvdW50ID0gMSwKKyAgICB9Cit9OworCit2b2lkIGdvbGRmaXNoX2RldmljZV9pbml0KHFlbXVfaXJxICpwaWMsIHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IHNpemUsIHVpbnQzMl90IGlycSwgdWludDMyX3QgaXJxX2NvdW50KQoreworICAgIGdvbGRmaXNoX3BpYyA9IHBpYzsKKyAgICBnb2xkZmlzaF9mcmVlX2Jhc2UgPSBiYXNlOworICAgIGdvbGRmaXNoX2ZyZWVfaXJxID0gaXJxOworfQorCitpbnQgZ29sZGZpc2hfZGV2aWNlX2J1c19pbml0KHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IGlycSkKK3sKKyAgICBidXNfc3RhdGUuZGV2LmJhc2UgPSBiYXNlOworICAgIGJ1c19zdGF0ZS5kZXYuaXJxID0gaXJxOworCisgICAgcmV0dXJuIGdvbGRmaXNoX2RldmljZV9hZGQoJmJ1c19zdGF0ZS5kZXYsIGdvbGRmaXNoX2J1c19yZWFkZm4sIGdvbGRmaXNoX2J1c193cml0ZWZuLCAmYnVzX3N0YXRlKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2V2ZW50c19kZXZpY2UuYyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9ldmVudHNfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5MjY5MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9ldmVudHNfZGV2aWNlLmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiICAvKiBmb3IgYW5kcm9pZF9odyAqLworI2luY2x1ZGUgImFuZHJvaWQvaHctZXZlbnRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tdWx0aXRvdWNoLXNjcmVlbi5oIgorI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LWNvbnRyb2wtaW1wbC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc2tpbi9jaGFybWFwLmgiCisjaW5jbHVkZSAiZXhlYy9jcHUtY29tbW9uLmgiCisjaW5jbHVkZSAiZXhlYy9od2FkZHIuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2lycS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisKKyNkZWZpbmUgTUFYX0VWRU5UUyAyNTYqNAorCitlbnVtIHsKKyAgICBSRUdfUkVBRCAgICAgICAgPSAweDAwLAorICAgIFJFR19TRVRfUEFHRSAgICA9IDB4MDAsCisgICAgUkVHX0xFTiAgICAgICAgID0gMHgwNCwKKyAgICBSRUdfREFUQSAgICAgICAgPSAweDA4LAorCisgICAgUEFHRV9OQU1FICAgICAgID0gMHgwMDAwMCwKKyAgICBQQUdFX0VWQklUUyAgICAgPSAweDEwMDAwLAorICAgIFBBR0VfQUJTREFUQSAgICA9IDB4MjAwMDAgfCBFVl9BQlMsCit9OworCisvKiBUaGVzZSBjb3JyZXNwb25kcyB0byB0aGUgc3RhdGUgb2YgdGhlIGRyaXZlci4KKyAqIFVuZm9ydHVuYXRlbHksIHdlIGhhdmUgdG8gYnVmZmVyIGV2ZW50cyBjb21pbmcKKyAqIGZyb20gdGhlIFVJLCBzaW5jZSB0aGUga2VybmVsIGRyaXZlciBpcyBub3QKKyAqIGNhcGFibGUgb2YgcmVjZWl2aW5nIHRoZW0gdW50aWwgWFhYWFhYCisgKi8KK2VudW0geworICAgIFNUQVRFX0lOSVQgPSAwLCAgLyogVGhlIGRldmljZSBpcyBpbml0aWFsaXplZCAqLworICAgIFNUQVRFX0JVRkZFUkVELCAgLyogRXZlbnRzIGhhdmUgYmVlbiBidWZmZXJlZCwgYnV0IG5vIElSUSByYWlzZWQgeWV0ICovCisgICAgU1RBVEVfTElWRSAgICAgICAvKiBFdmVudHMgY2FuIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIGtlcm5lbCAqLworfTsKKworLyogTk9URTogVGhlIGV2X2JpdHMgYXJyYXlzIGFyZSB1c2VkIHRvIGluZGljYXRlIHRvIHRoZSBrZXJuZWwKKyAqICAgICAgIHdoaWNoIGV2ZW50cyBjYW4gYmUgc2VudCBieSB0aGUgZW11bGF0ZWQgaGFyZHdhcmUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCBiYXNlOworICAgIHFlbXVfaXJxICBpcnE7CisgICAgaW50IHBlbmRpbmc7CisgICAgaW50IHBhZ2U7CisKKyAgICB1bnNpZ25lZCBldmVudHNbTUFYX0VWRU5UU107CisgICAgdW5zaWduZWQgZmlyc3Q7CisgICAgdW5zaWduZWQgbGFzdDsKKyAgICB1bnNpZ25lZCBzdGF0ZTsKKworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBzaXplX3QgICBsZW47CisgICAgICAgIHVpbnQ4X3QgKmJpdHM7CisgICAgfSBldl9iaXRzW0VWX01BWCArIDFdOworCisgICAgaW50MzJfdCAqYWJzX2luZm87CisgICAgc2l6ZV90IGFic19pbmZvX2NvdW50OworfSBldmVudHNfc3RhdGU7CisKKy8qIEFuIGVudHJ5IGluIHRoZSBhcnJheSBvZiBBQlNfWFhYIHZhbHVlcyAqLwordHlwZWRlZiBzdHJ1Y3QgQUJTRW50cnkgeworICAgIC8qIE1pbmltdW0gQUJTX1hYWCB2YWx1ZS4gKi8KKyAgICB1aW50MzJfdCAgICBtaW47CisgICAgLyogTWF4aW11bSBBQlNfWFhYIHZhbHVlLiAqLworICAgIHVpbnQzMl90ICAgIG1heDsKKyAgICAvKiAnZnV6ejssIGFuZCAnZmxhdCcgQUJTX1hYWCB2YWx1ZXMgYXJlIGFsd2F5cyB6ZXJvIGhlcmUuICovCisgICAgdWludDMyX3QgICAgZnV6ejsKKyAgICB1aW50MzJfdCAgICBmbGF0OworfSBBQlNFbnRyeTsKKworCisvKiBtb2RpZnkgdGhpcyBlYWNoIHRpbWUgeW91IGNoYW5nZSB0aGUgZXZlbnRzX2RldmljZSBzdHJ1Y3R1cmUuIHlvdQorICogd2lsbCBhbHNvIG5lZWQgdG8gdXBhZHRlIGV2ZW50c19zdGF0ZV9sb2FkIGFuZCBldmVudHNfc3RhdGVfc2F2ZQorICovCisjZGVmaW5lICBFVkVOVFNfU1RBVEVfU0FWRV9WRVJTSU9OICAyCisKKyN1bmRlZiAgUUZJRUxEX1NUUlVDVAorI2RlZmluZSBRRklFTERfU1RSVUNUICBldmVudHNfc3RhdGUKKworUUZJRUxEX0JFR0lOKGV2ZW50c19zdGF0ZV9maWVsZHMpCisgICAgUUZJRUxEX0lOVDMyKHBlbmRpbmcpLAorICAgIFFGSUVMRF9JTlQzMihwYWdlKSwKKyAgICBRRklFTERfQlVGRkVSKGV2ZW50cyksCisgICAgUUZJRUxEX0lOVDMyKGZpcnN0KSwKKyAgICBRRklFTERfSU5UMzIobGFzdCksCisgICAgUUZJRUxEX0lOVDMyKHN0YXRlKSwKK1FGSUVMRF9FTkQKKworc3RhdGljIHZvaWQgIGV2ZW50c19zdGF0ZV9zYXZlKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSkKK3sKKyAgICBldmVudHNfc3RhdGUqICBzID0gb3BhcXVlOworCisgICAgcWVtdV9wdXRfc3RydWN0KGYsIGV2ZW50c19zdGF0ZV9maWVsZHMsIHMpOworfQorCitzdGF0aWMgaW50ICBldmVudHNfc3RhdGVfbG9hZChRRU1VRmlsZSogIGYsIHZvaWQqIG9wYXF1ZSwgaW50ICB2ZXJzaW9uX2lkKQoreworICAgIGV2ZW50c19zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBFVkVOVFNfU1RBVEVfU0FWRV9WRVJTSU9OKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gcWVtdV9nZXRfc3RydWN0KGYsIGV2ZW50c19zdGF0ZV9maWVsZHMsIHMpOworfQorCitzdGF0aWMgdm9pZCBlbnF1ZXVlX2V2ZW50KGV2ZW50c19zdGF0ZSAqcywgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCit7CisgICAgaW50ICBlbnF1ZXVlZCA9IHMtPmxhc3QgLSBzLT5maXJzdDsKKworICAgIGlmIChlbnF1ZXVlZCA8IDApCisgICAgICAgIGVucXVldWVkICs9IE1BWF9FVkVOVFM7CisKKyAgICBpZiAoZW5xdWV1ZWQgKyAzID4gTUFYX0VWRU5UUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiMjS0JEOiBGdWxsIHF1ZXVlLCBsb3NlIGV2ZW50XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKHMtPmZpcnN0ID09IHMtPmxhc3QpIHsKKwlpZiAocy0+c3RhdGUgPT0gU1RBVEVfTElWRSkKKwkgIHFlbXVfaXJxX3JhaXNlKHMtPmlycSk7CisJZWxzZSB7CisJICBzLT5zdGF0ZSA9IFNUQVRFX0JVRkZFUkVEOworCX0KKyAgICB9CisKKyAgICAvL2ZwcmludGYoc3RkZXJyLCAiIyNLQkQ6IHR5cGU9JWQgY29kZT0lZCB2YWx1ZT0lZFxuIiwgdHlwZSwgY29kZSwgdmFsdWUpOworCisgICAgcy0+ZXZlbnRzW3MtPmxhc3RdID0gdHlwZTsKKyAgICBzLT5sYXN0ID0gKHMtPmxhc3QgKyAxKSAmIChNQVhfRVZFTlRTLTEpOworICAgIHMtPmV2ZW50c1tzLT5sYXN0XSA9IGNvZGU7CisgICAgcy0+bGFzdCA9IChzLT5sYXN0ICsgMSkgJiAoTUFYX0VWRU5UUy0xKTsKKyAgICBzLT5ldmVudHNbcy0+bGFzdF0gPSB2YWx1ZTsKKyAgICBzLT5sYXN0ID0gKHMtPmxhc3QgKyAxKSAmIChNQVhfRVZFTlRTLTEpOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVxdWV1ZV9ldmVudChldmVudHNfc3RhdGUgKnMpCit7CisgICAgdW5zaWduZWQgbjsKKworICAgIGlmKHMtPmZpcnN0ID09IHMtPmxhc3QpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbiA9IHMtPmV2ZW50c1tzLT5maXJzdF07CisKKyAgICBzLT5maXJzdCA9IChzLT5maXJzdCArIDEpICYgKE1BWF9FVkVOVFMgLSAxKTsKKworICAgIGlmKHMtPmZpcnN0ID09IHMtPmxhc3QpIHsKKyAgICAgICAgcWVtdV9pcnFfbG93ZXIocy0+aXJxKTsKKyAgICB9CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICAvKgorICAgICAqIEFkZGluZyB0aGUgbG9naWMgdG8gaGFuZGxlIGVkZ2UtdHJpZ2dlcmVkIGludGVycnVwdHMgZm9yIHg4NgorICAgICAqIGJlY2F1c2UgdGhlIGV4aXNpdGluZyBnb2xkZmlzaCBldmVudHMgZGV2aWNlIGJhc2ljYWxseSBwcm92aWRlcworICAgICAqIGxldmVsLXRyaWdnZXIgaW50ZXJydXB0cyBvbmx5LgorICAgICAqCisgICAgICogTG9naWM6IFdoZW4gYW4gZXZlbnQgKGluY2x1ZGluZyB0aGUgdHlwZS9jb2RlL3ZhbHVlKSBpcyBmZXRjaGVkCisgICAgICogYnkgdGhlIGRyaXZlciwgaWYgdGhlcmUgaXMgc3RpbGwgYW5vdGhlciBldmVudCBpbiB0aGUgZXZlbnQKKyAgICAgKiBxdWV1ZSwgdGhlIGdvbGRmaXNoIGV2ZW50IGRldmljZSB3aWxsIHJlLWFzc2VydCB0aGUgSVJRIHNvIHRoYXQKKyAgICAgKiB0aGUgZHJpdmVyIGNhbiBiZSBub3RpZmllZCB0byBmZXRjaCB0aGUgZXZlbnQgYWdhaW4uCisgICAgICovCisgICAgZWxzZSBpZiAoKChzLT5maXJzdCArIDIpICYgKE1BWF9FVkVOVFMgLSAxKSkgPCBzLT5sYXN0IHx8CisgICAgICAgICAgICAgICAocy0+Zmlyc3QgJiAoTUFYX0VWRU5UUyAtIDEpKSA+IHMtPmxhc3QpIHsgLyogaWYgdGhlcmUgc3RpbGwgaXMgYW4gZXZlbnQgKi8KKyAgICAgICAgcWVtdV9pcnFfbG93ZXIocy0+aXJxKTsKKyAgICAgICAgcWVtdV9pcnFfcmFpc2Uocy0+aXJxKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljIGludCBnZXRfcGFnZV9sZW4oZXZlbnRzX3N0YXRlICpzKQoreworICAgIGludCBwYWdlID0gcy0+cGFnZTsKKyAgICBpZiAocGFnZSA9PSBQQUdFX05BTUUpIHsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9IHMtPm5hbWU7CisgICAgICAgIHJldHVybiBzdHJsZW4obmFtZSk7CisgICAgfSBpZiAocGFnZSA+PSBQQUdFX0VWQklUUyAmJiBwYWdlIDw9IFBBR0VfRVZCSVRTICsgRVZfTUFYKQorICAgICAgICByZXR1cm4gcy0+ZXZfYml0c1twYWdlIC0gUEFHRV9FVkJJVFNdLmxlbjsKKyAgICBpZiAocGFnZSA9PSBQQUdFX0FCU0RBVEEpCisgICAgICAgIHJldHVybiBzLT5hYnNfaW5mb19jb3VudCAqIHNpemVvZihzLT5hYnNfaW5mb1swXSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BhZ2VfZGF0YShldmVudHNfc3RhdGUgKnMsIGludCBvZmZzZXQpCit7CisgICAgaW50IHBhZ2VfbGVuID0gZ2V0X3BhZ2VfbGVuKHMpOworICAgIGludCBwYWdlID0gcy0+cGFnZTsKKyAgICBpZiAob2Zmc2V0ID4gcGFnZV9sZW4pCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwYWdlID09IFBBR0VfTkFNRSkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lID0gcy0+bmFtZTsKKyAgICAgICAgcmV0dXJuIG5hbWVbb2Zmc2V0XTsKKyAgICB9IGlmIChwYWdlID49IFBBR0VfRVZCSVRTICYmIHBhZ2UgPD0gUEFHRV9FVkJJVFMgKyBFVl9NQVgpCisgICAgICAgIHJldHVybiBzLT5ldl9iaXRzW3BhZ2UgLSBQQUdFX0VWQklUU10uYml0c1tvZmZzZXRdOworICAgIGlmIChwYWdlID09IFBBR0VfQUJTREFUQSkgeworICAgICAgICByZXR1cm4gcy0+YWJzX2luZm9bb2Zmc2V0IC8gc2l6ZW9mKHMtPmFic19pbmZvWzBdKV07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgZXZlbnRzX3JlYWQodm9pZCAqeCwgaHdhZGRyIG9mZikKK3sKKyAgICBldmVudHNfc3RhdGUgKnMgPSAoZXZlbnRzX3N0YXRlICopIHg7CisgICAgaW50IG9mZnNldCA9IG9mZjsgLy8gLSBzLT5iYXNlOworCisgICAgLyogVGhpcyBncm9zcyBoYWNrIGJlbG93IGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgd2UKKyAgICAgKiBvbmx5IHJhaXNlIHRoZSBJUlEgd2hlbiB0aGUga2VybmVsIGRyaXZlciBpcworICAgICAqIHByb3Blcmx5IHJlYWR5ISBJZiBkb25lIGJlZm9yZSB0aGlzLCB0aGUgZHJpdmVyCisgICAgICogYmVjb21lcyBjb25mdXNlZCBhbmQgaWdub3JlcyBhbGwgaW5wdXQgZXZlbnRzCisgICAgICogYXMgc29vbiBhcyBvbmUgd2FzIGJ1ZmZlcmVkIQorICAgICAqLworICAgIGlmIChvZmZzZXQgPT0gUkVHX0xFTiAmJiBzLT5wYWdlID09IFBBR0VfQUJTREFUQSkgeworCWlmIChzLT5zdGF0ZSA9PSBTVEFURV9CVUZGRVJFRCkKKwkgIHFlbXVfaXJxX3JhaXNlKHMtPmlycSk7CisJcy0+c3RhdGUgPSBTVEFURV9MSVZFOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPT0gUkVHX1JFQUQpCisgICAgICAgIHJldHVybiBkZXF1ZXVlX2V2ZW50KHMpOworICAgIGVsc2UgaWYgKG9mZnNldCA9PSBSRUdfTEVOKQorICAgICAgICByZXR1cm4gZ2V0X3BhZ2VfbGVuKHMpOworICAgIGVsc2UgaWYgKG9mZnNldCA+PSBSRUdfREFUQSkKKyAgICAgICAgcmV0dXJuIGdldF9wYWdlX2RhdGEocywgb2Zmc2V0IC0gUkVHX0RBVEEpOworICAgIHJldHVybiAwOyAvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4sIGlmIHRoZSBkcml2ZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcKK30KKworc3RhdGljIHZvaWQgZXZlbnRzX3dyaXRlKHZvaWQgKngsIGh3YWRkciBvZmYsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBldmVudHNfc3RhdGUgKnMgPSAoZXZlbnRzX3N0YXRlICopIHg7CisgICAgaW50IG9mZnNldCA9IG9mZjsgLy8gLSBzLT5iYXNlOworICAgIGlmIChvZmZzZXQgPT0gUkVHX1NFVF9QQUdFKQorICAgICAgICBzLT5wYWdlID0gdmFsOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmV2ZW50c19yZWFkZm5bXSA9IHsKKyAgIGV2ZW50c19yZWFkLAorICAgZXZlbnRzX3JlYWQsCisgICBldmVudHNfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZXZlbnRzX3dyaXRlZm5bXSA9IHsKKyAgIGV2ZW50c193cml0ZSwKKyAgIGV2ZW50c193cml0ZSwKKyAgIGV2ZW50c193cml0ZQorfTsKKworc3RhdGljIHZvaWQgZXZlbnRzX3B1dF9rZXljb2RlKHZvaWQgKngsIGludCBrZXljb2RlKQoreworICAgIGV2ZW50c19zdGF0ZSAqcyA9IChldmVudHNfc3RhdGUgKikgeDsKKworICAgIGVucXVldWVfZXZlbnQocywgRVZfS0VZLCBrZXljb2RlJjB4M2ZmLCAoa2V5Y29kZSYweDQwMCkgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIGV2ZW50c19wdXRfbW91c2Uodm9pZCAqb3BhcXVlLCBpbnQgZHgsIGludCBkeSwgaW50IGR6LCBpbnQgYnV0dG9uc19zdGF0ZSkKK3sKKyAgICBldmVudHNfc3RhdGUgKnMgPSAoZXZlbnRzX3N0YXRlICopIG9wYXF1ZTsKKyAgICAvKiBpbiB0aGUgQW5kcm9pZCBlbXVsYXRvciwgd2UgdXNlIGR6ID09IDAgZm9yIHRvdWNoc2NyZWVuIGV2ZW50cywKKyAgICAgKiBhbmQgZHogPT0gMSBmb3IgdHJhY2tiYWxsIGV2ZW50cy4gU2VlIHRoZSBrYmRfbW91c2VfZXZlbnQgY2FsbHMKKyAgICAgKiBpbiBhbmRyb2lkL3NraW4vdHJhY2tiYWxsLmMgYW5kIGFuZHJvaWQvc2tpbi93aW5kb3cuYworICAgICAqLworICAgIGlmIChkeiA9PSAwKSB7CisgICAgICAgIGlmIChhbmRyb2lkSHdDb25maWdfaXNTY3JlZW5NdWx0aVRvdWNoKGFuZHJvaWRfaHcpKSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IG1vdXNlIGV2ZW50IGludG8gbXVsdGktdG91Y2ggZXZlbnQgKi8KKyAgICAgICAgICAgIGludCBwcmVzc3VyZSA9IG11bHRpdG91Y2hfaXNfdG91Y2hfZG93bihidXR0b25zX3N0YXRlKSA/IDB4ODEgOiAwOworICAgICAgICAgICAgaW50IGZpbmdlciA9IG11bHRpdG91Y2hfaXNfc2Vjb25kX2ZpbmdlcihidXR0b25zX3N0YXRlKTsKKyAgICAgICAgICAgIG11bHRpdG91Y2hfdXBkYXRlX3BvaW50ZXIoTVRFU19ERVZJQ0UsIGZpbmdlciwgZHgsIGR5LCBwcmVzc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGl0b3VjaF9zaG91bGRfc2tpcF9zeW5jKGJ1dHRvbnNfc3RhdGUpKTsKKyAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkSHdDb25maWdfaXNTY3JlZW5Ub3VjaChhbmRyb2lkX2h3KSkgeworICAgICAgICAgICAgZW5xdWV1ZV9ldmVudChzLCBFVl9BQlMsIEFCU19YLCBkeCk7CisgICAgICAgICAgICBlbnF1ZXVlX2V2ZW50KHMsIEVWX0FCUywgQUJTX1ksIGR5KTsKKyAgICAgICAgICAgIGVucXVldWVfZXZlbnQocywgRVZfS0VZLCBCVE5fVE9VQ0gsIGJ1dHRvbnNfc3RhdGUmMSk7CisgICAgICAgICAgICBlbnF1ZXVlX2V2ZW50KHMsIEVWX1NZTiwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlbnF1ZXVlX2V2ZW50KHMsIEVWX1JFTCwgUkVMX1gsIGR4KTsKKyAgICAgICAgZW5xdWV1ZV9ldmVudChzLCBFVl9SRUwsIFJFTF9ZLCBkeSk7CisgICAgICAgIGVucXVldWVfZXZlbnQocywgRVZfU1lOLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgIGV2ZW50c19wdXRfZ2VuZXJpYyh2b2lkKiAgb3BhcXVlLCBpbnQgIHR5cGUsIGludCAgY29kZSwgaW50ICB2YWx1ZSkgeworICAgIGV2ZW50c19zdGF0ZSAqcyA9IChldmVudHNfc3RhdGUgKikgb3BhcXVlOworICAgIGVucXVldWVfZXZlbnQocywgdHlwZSwgY29kZSwgdmFsdWUpOworfQorCisvKiBzZXQgYml0cyBbYml0bC4uYml0aF0gaW4gdGhlIGV2X2JpdHNbdHlwZV0gYXJyYXkKKyAqLworc3RhdGljIHZvaWQKK2V2ZW50c19zZXRfYml0cyhldmVudHNfc3RhdGUgKnMsIGludCB0eXBlLCBpbnQgYml0bCwgaW50IGJpdGgpCit7CisgICAgdWludDhfdCAqYml0czsKKyAgICB1aW50OF90IG1hc2tsLCBtYXNraDsKKyAgICBpbnQgaWwsIGloOworICAgIGlsID0gYml0bCAvIDg7CisgICAgaWggPSBiaXRoIC8gODsKKyAgICBpZiAoaWggPj0gcy0+ZXZfYml0c1t0eXBlXS5sZW4pIHsKKyAgICAgICAgYml0cyA9IGdfbWFsbG9jMChpaCArIDEpOworICAgICAgICBpZiAoYml0cyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtZW1jcHkoYml0cywgcy0+ZXZfYml0c1t0eXBlXS5iaXRzLCBzLT5ldl9iaXRzW3R5cGVdLmxlbik7CisgICAgICAgIGdfZnJlZShzLT5ldl9iaXRzW3R5cGVdLmJpdHMpOworICAgICAgICBzLT5ldl9iaXRzW3R5cGVdLmJpdHMgPSBiaXRzOworICAgICAgICBzLT5ldl9iaXRzW3R5cGVdLmxlbiA9IGloICsgMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBiaXRzID0gcy0+ZXZfYml0c1t0eXBlXS5iaXRzOworICAgIG1hc2tsID0gMHhmZlUgPDwgKGJpdGwgJiA3KTsKKyAgICBtYXNraCA9IDB4ZmZVID4+ICg3IC0gKGJpdGggJiA3KSk7CisgICAgaWYgKGlsID49IGloKQorICAgICAgICBtYXNraCAmPSBtYXNrbDsKKyAgICBlbHNlIHsKKyAgICAgICAgYml0c1tpbF0gfD0gbWFza2w7CisgICAgICAgIHdoaWxlICgrK2lsIDwgaWgpCisgICAgICAgICAgICBiaXRzW2lsXSA9IDB4ZmY7CisgICAgfQorICAgIGJpdHNbaWhdIHw9IG1hc2toOworfQorCitzdGF0aWMgdm9pZAorZXZlbnRzX3NldF9iaXQoZXZlbnRzX3N0YXRlKiBzLCBpbnQgIHR5cGUsIGludCAgYml0KQoreworICAgIGV2ZW50c19zZXRfYml0cyhzLCB0eXBlLCBiaXQsIGJpdCk7Cit9CisKK3N0YXRpYyB2b2lkCitldmVudHNfY2xyX2JpdChldmVudHNfc3RhdGUqIHMsIGludCB0eXBlLCBpbnQgYml0KQoreworICAgIGludCBpaSA9IGJpdCAvIDg7CisgICAgaWYgKGlpIDwgcy0+ZXZfYml0c1t0eXBlXS5sZW4pIHsKKyAgICAgICAgdWludDhfdCogYml0cyA9IHMtPmV2X2JpdHNbdHlwZV0uYml0czsKKyAgICAgICAgdWludDhfdCAgbWFzayA9IDB4MDFVIDw8IChiaXQgJiA3KTsKKyAgICAgICAgYml0c1tpaV0gJj0gfm1hc2s7CisgICAgfQorfQorCit2b2lkIGV2ZW50c19kZXZfaW5pdCh1aW50MzJfdCBiYXNlLCBxZW11X2lycSBpcnEpCit7CisgICAgZXZlbnRzX3N0YXRlICpzOworICAgIGludCBpb21lbXR5cGU7CisgICAgQW5kcm9pZEh3Q29uZmlnKiAgY29uZmlnID0gYW5kcm9pZF9odzsKKworICAgIHMgPSAoZXZlbnRzX3N0YXRlICopIGdfbWFsbG9jMChzaXplb2YoZXZlbnRzX3N0YXRlKSk7CisKKyAgICAvKiBub3cgc2V0IHRoZSBldmVudHMgY2FwYWJpbGl0eSBiaXRzIGRlcGVuZGluZyBvbiBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisgICAgLyogYXBwYXJlbnRseSwgdGhlIEVWX1NZTiBhcnJheSBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIG90aGVyCisgICAgICogZXZlbnQgY2xhc3NlcyB0byBjb25zaWRlci4KKyAgICAgKi8KKworICAgIC8qIGNvbmZpZ3VyZSBFVl9LRVkgYXJyYXkKKyAgICAgKgorICAgICAqIEFsbCBBbmRyb2lkIGRldmljZXMgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgKiAgIEtFWV9IT01FLCBLRVlfQkFDSywgS0VZX1NFTkQgKENhbGwpLCBLRVlfRU5EIChFbmRDYWxsKSwKKyAgICAgKiAgIEtFWV9TT0ZUMSAoTWVudSksIFZPTFVNRV9VUCwgVk9MVU1FX0RPV04KKyAgICAgKgorICAgICAqICAgTm90ZSB0aGF0IHByZXZpb3VzIG1vZGVscyBhbHNvIGhhZCBhIEtFWV9TT0ZUMiwKKyAgICAgKiAgIGFuZCBhIEtFWV9QT1dFUiAgd2hpY2ggd2Ugc3RpbGwgc3VwcG9ydCBoZXJlLgorICAgICAqCisgICAgICogICBOZXdlciBtb2RlbHMgaGF2ZSBhIEtFWV9TRUFSQ0gga2V5LCB3aGljaCB3ZSBhbHdheXMKKyAgICAgKiAgIGVuYWJsZSBoZXJlLgorICAgICAqCisgICAgICogQSBEcGFkIHdpbGwgc2VuZDogS0VZX0RPV04gLyBVUCAvIExFRlQgLyBSSUdIVCAvIENFTlRFUgorICAgICAqCisgICAgICogVGhlIEtFWV9DQU1FUkEgYnV0dG9uIGlzbid0IHZlcnkgdXNlZnVsIGlmIHRoZXJlIGlzIG5vIGNhbWVyYS4KKyAgICAgKgorICAgICAqIEJUTl9NT1VTRSBpcyBzZW50IHdoZW4gdGhlIHRyYWNrYmFsbCBpcyBwcmVzc2VkCisgICAgICogQlROX1RPVUNIIGlzIHNlbnQgd2hlbiB0aGUgdG91Y2hzY3JlZW4gaXMgcHJlc3NlZAorICAgICAqLworICAgIGV2ZW50c19zZXRfYml0IChzLCBFVl9TWU4sIEVWX0tFWSApOworCisgICAgZXZlbnRzX3NldF9iaXQocywgRVZfS0VZLCBLRVlfQVBQU1dJVENIKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9IT01FKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9CQUNLKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9TRU5EKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9FTkQpOworICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX1NPRlQxKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9WT0xVTUVVUCk7CisgICAgZXZlbnRzX3NldF9iaXQocywgRVZfS0VZLCBLRVlfVk9MVU1FRE9XTik7CisgICAgZXZlbnRzX3NldF9iaXQocywgRVZfS0VZLCBLRVlfU09GVDIpOworICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX1BPV0VSKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9TRUFSQ0gpOworICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX0ZBU1RGT1JXQVJEKTsKKyAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9QTEFZUEFVU0UpOworICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX1JFV0lORCk7CisKKyAgICBpZiAoY29uZmlnLT5od19kUGFkKSB7CisgICAgICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX0RPV04pOworICAgICAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9VUCk7CisgICAgICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX0xFRlQpOworICAgICAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9SSUdIVCk7CisgICAgICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgS0VZX0NFTlRFUik7CisgICAgfQorCisgICAgaWYgKGNvbmZpZy0+aHdfdHJhY2tCYWxsKSB7CisgICAgICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0tFWSwgQlROX01PVVNFKTsKKyAgICB9CisgICAgaWYgKGFuZHJvaWRId0NvbmZpZ19pc1NjcmVlblRvdWNoKGNvbmZpZykpIHsKKyAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfS0VZLCBCVE5fVE9VQ0gpOworICAgIH0KKworICAgIGlmIChzdHJjbXAoY29uZmlnLT5od19jYW1lcmFfYmFjaywgIm5vbmUiKSB8fAorICAgICAgICBzdHJjbXAoY29uZmlnLT5od19jYW1lcmFfZnJvbnQsICJub25lIikpIHsKKyAgICAgICAgLyogQ2FtZXJhIGVtdWxhdGlvbiBpcyBlbmFibGVkLiAqLworICAgICAgICBldmVudHNfc2V0X2JpdChzLCBFVl9LRVksIEtFWV9DQU1FUkEpOworICAgIH0KKworICAgIGlmIChjb25maWctPmh3X2tleWJvYXJkKSB7CisgICAgICAgIC8qIHNpbmNlIHdlIHdhbnQgdG8gaW1wbGVtZW50IFVuaWNvZGUgcmV2ZXJzZS1tYXBwaW5nCisgICAgICAgICAqIGFsbG93IGFueSBraW5kIG9mIGtleSwgZXZlbiB0aG9zZSBub3QgYXZhaWxhYmxlIG9uCisgICAgICAgICAqIHRoZSBza2luLgorICAgICAgICAgKgorICAgICAgICAgKiB0aGUgcHJldmlvdXMgY29kZSBkaWQgc2V0IHRoZSBbMS4uMHgxZmZdIHJhbmdlLCBidXQKKyAgICAgICAgICogd2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgY2VydGFpbiBiaXRzIGluIHRoZSBtaWRkbGUKKyAgICAgICAgICogb2YgdGhlIHJhbmdlIHRoYXQgYXJlIHJlZ2lzdGVyZWQgZm9yIG1vdXNlL3RyYWNrYmFsbC9qb3lzdGljaworICAgICAgICAgKiBldmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIHNlZSAibGludXhfa2V5Y29kZXMuaCIgZm9yIHRoZSBsaXN0IG9mIGV2ZW50cyBjb2Rlcy4KKyAgICAgICAgICovCisgICAgICAgIGV2ZW50c19zZXRfYml0cyhzLCBFVl9LRVksIDEsIDB4ZmYpOworICAgICAgICBldmVudHNfc2V0X2JpdHMocywgRVZfS0VZLCAweDE2MCwgMHgxZmYpOworCisgICAgICAgIC8qIElmIHRoZXJlIGlzIGEga2V5Ym9hcmQsIGJ1dCBubyBEUGFkLCB3ZSBuZWVkIHRvIGNsZWFyIHRoZQorICAgICAgICAgKiBjb3JyZXNwb25kaW5nIGJpdC4gRG9pbmcgdGhpcyBpcyBzaW1wbGVyIHRoYW4gdHJ5aW5nIHRvIGV4Y2x1ZGUKKyAgICAgICAgICogdGhlIERQYWQgdmFsdWVzIGZyb20gdGhlIHJhbmdlcyBhYm92ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogS0VZX1VQL0RPV04vTEVGVC9SSUdIVCBzaG91bGQgYmUgbGVmdCBzZXQgc28gdGhlIGtleWJvYXJkCisgICAgICAgICAqIGFycm93IGtleXMgYXJlIHN0aWxsIHVzYWJsZSwgZXZlbiB0aG91Z2ggYSB0eXBpY2FsIGRldmljZSBoYXJkCisgICAgICAgICAqIGtleWJvYXJkIHdvdWxkIG5vdCBpbmNsdWRlIHRob3NlIGtleXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoIWNvbmZpZy0+aHdfZFBhZCkgeworICAgICAgICAgICAgZXZlbnRzX2Nscl9iaXQocywgRVZfS0VZLCBLRVlfQ0VOVEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbmZpZ3VyZSBFVl9SRUwgYXJyYXkKKyAgICAgKgorICAgICAqIEVWX1JFTCBldmVudHMgYXJlIHNlbnQgd2hlbiB0aGUgdHJhY2tiYWxsIGlzIG1vdmVkCisgICAgICovCisgICAgaWYgKGNvbmZpZy0+aHdfdHJhY2tCYWxsKSB7CisgICAgICAgIGV2ZW50c19zZXRfYml0IChzLCBFVl9TWU4sIEVWX1JFTCApOworICAgICAgICBldmVudHNfc2V0X2JpdHMocywgRVZfUkVMLCBSRUxfWCwgUkVMX1kpOworICAgIH0KKworICAgIC8qIGNvbmZpZ3VyZSBFVl9BQlMgYXJyYXkuCisgICAgICoKKyAgICAgKiBFVl9BQlMgZXZlbnRzIGFyZSBzZW50IHdoZW4gdGhlIHRvdWNoc2NyZWVuIGlzIHByZXNzZWQKKyAgICAgKi8KKyAgICBpZiAoIWFuZHJvaWRId0NvbmZpZ19pc1NjcmVlbk5vVG91Y2goY29uZmlnKSkgeworICAgICAgICBBQlNFbnRyeSogYWJzX3ZhbHVlczsKKworICAgICAgICBldmVudHNfc2V0X2JpdCAocywgRVZfU1lOLCBFVl9BQlMgKTsKKyAgICAgICAgZXZlbnRzX3NldF9iaXRzKHMsIEVWX0FCUywgQUJTX1gsIEFCU19aKTsKKyAgICAgICAgLyogQWxsb2NhdGUgdGhlIGFic2luZm8gdG8gcmVwb3J0IHRoZSBtaW4vbWF4IGJvdW5kcyBmb3IgZWFjaAorICAgICAgICAgKiBhYnNvbHV0ZSBkaW1lbnNpb24uIFRoZSBhcnJheSBtdXN0IGNvbnRhaW4gMywgb3IgQUJTX01BWCB0dXBsZXMKKyAgICAgICAgICogb2YgKG1pbixtYXgsZnV6eixmbGF0KSAzMi1iaXQgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBtaW4gYW5kIG1heCBhcmUgdGhlIGJvdW5kcworICAgICAgICAgKiBmdXp6IGNvcnJlc3BvbmRzIHRvIHRoZSBkZXZpY2UncyBmdXppbmVzcywgd2Ugc2V0IGl0IHRvIDAKKyAgICAgICAgICogZmxhdCBjb3JyZXNwb25kcyB0byB0aGUgZmxhdCBwb3NpdGlvbiBmb3IgSk9FWURFViBkZXZpY2VzLAorICAgICAgICAgKiB3ZSBhbHNvIHNldCBpdCB0byAwLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNhdmUvcmVzdG9yZSB0aGlzIGFycmF5IGluIGEgc25hcHNob3QKKyAgICAgICAgICogc2luY2UgdGhlIHZhbHVlcyBvbmx5IGRlcGVuZCBvbiB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHMtPmFic19pbmZvX2NvdW50ID0gYW5kcm9pZEh3Q29uZmlnX2lzU2NyZWVuTXVsdGlUb3VjaChjb25maWcpID8gQUJTX01BWCAqIDQgOiAzICogNDsKKyAgICAgICAgY29uc3QgaW50IGFic19zaXplID0gc2l6ZW9mKHVpbnQzMl90KSAqIHMtPmFic19pbmZvX2NvdW50OworICAgICAgICBzLT5hYnNfaW5mbyA9IG1hbGxvYyhhYnNfc2l6ZSk7CisgICAgICAgIG1lbXNldChzLT5hYnNfaW5mbywgMCwgYWJzX3NpemUpOworICAgICAgICBhYnNfdmFsdWVzID0gKEFCU0VudHJ5KilzLT5hYnNfaW5mbzsKKworICAgICAgICBhYnNfdmFsdWVzW0FCU19YXS5tYXggPSBjb25maWctPmh3X2xjZF93aWR0aC0xOworICAgICAgICBhYnNfdmFsdWVzW0FCU19ZXS5tYXggPSBjb25maWctPmh3X2xjZF9oZWlnaHQtMTsKKyAgICAgICAgYWJzX3ZhbHVlc1tBQlNfWl0ubWF4ID0gMTsKKworICAgICAgICBpZiAoYW5kcm9pZEh3Q29uZmlnX2lzU2NyZWVuTXVsdGlUb3VjaChjb25maWcpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0dXAgbXVsdGl0b3VjaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfQUJTLCBBQlNfTVRfU0xPVCk7CisgICAgICAgICAgICBldmVudHNfc2V0X2JpdChzLCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9YKTsKKyAgICAgICAgICAgIGV2ZW50c19zZXRfYml0KHMsIEVWX0FCUywgQUJTX01UX1BPU0lUSU9OX1kpOworICAgICAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfQUJTLCBBQlNfTVRfVFJBQ0tJTkdfSUQpOworICAgICAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfQUJTLCBBQlNfTVRfVE9VQ0hfTUFKT1IpOworICAgICAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfQUJTLCBBQlNfTVRfUFJFU1NVUkUpOworCisgICAgICAgICAgICBhYnNfdmFsdWVzW0FCU19NVF9TTE9UXS5tYXggPSBtdWx0aXRvdWNoX2dldF9tYXhfc2xvdCgpOworICAgICAgICAgICAgYWJzX3ZhbHVlc1tBQlNfTVRfVFJBQ0tJTkdfSURdLm1heCA9IGFic192YWx1ZXNbQUJTX01UX1NMT1RdLm1heCArIDE7CisgICAgICAgICAgICBhYnNfdmFsdWVzW0FCU19NVF9QT1NJVElPTl9YXS5tYXggPSBhYnNfdmFsdWVzW0FCU19YXS5tYXg7CisgICAgICAgICAgICBhYnNfdmFsdWVzW0FCU19NVF9QT1NJVElPTl9ZXS5tYXggPSBhYnNfdmFsdWVzW0FCU19ZXS5tYXg7CisgICAgICAgICAgICBhYnNfdmFsdWVzW0FCU19NVF9UT1VDSF9NQUpPUl0ubWF4ID0gMHg3ZmZmZmZmZjsgLy8gVE9ETzogTWFrZSBpdCBsZXNzIHJhbmRvbQorICAgICAgICAgICAgYWJzX3ZhbHVlc1tBQlNfTVRfUFJFU1NVUkVdLm1heCA9IDB4MTAwOyAvLyBUT0RPOiBNYWtlIGl0IGxlc3MgcmFuZG9tCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjb25maWd1cmUgRVZfU1cgYXJyYXkKKyAgICAgKgorICAgICAqIEVWX1NXIGV2ZW50cyBhcmUgc2VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBrZXlib2FyZCBsaWQKKyAgICAgKiB3YXMgY2xvc2VkIG9yIG9wZW5lZCAoZG9uZSB3aGVuIHdlIHN3aXRjaCBsYXlvdXRzIHRocm91Z2gKKyAgICAgKiBLUC03IG9yIEtQLTkpLgorICAgICAqCisgICAgICogV2Ugb25seSBzdXBwb3J0IHRoaXMgd2hlbiBody5rZXlib2FyZC5saWQgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICBpZiAoY29uZmlnLT5od19rZXlib2FyZCAmJiBjb25maWctPmh3X2tleWJvYXJkX2xpZCkgeworICAgICAgICBldmVudHNfc2V0X2JpdChzLCBFVl9TWU4sIEVWX1NXKTsKKyAgICAgICAgZXZlbnRzX3NldF9iaXQocywgRVZfU1csIDApOworICAgIH0KKworICAgIGlvbWVtdHlwZSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZXZlbnRzX3JlYWRmbiwgZXZlbnRzX3dyaXRlZm4sIHMpOworCisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShiYXNlLCAweGZmZiwgaW9tZW10eXBlKTsKKworICAgIHFlbXVfYWRkX2tiZF9ldmVudF9oYW5kbGVyKGV2ZW50c19wdXRfa2V5Y29kZSwgcyk7CisgICAgcWVtdV9hZGRfbW91c2VfZXZlbnRfaGFuZGxlcihldmVudHNfcHV0X21vdXNlLCBzLCAxLCAiZ29sZGZpc2gtZXZlbnRzIik7CisKKyAgICBzLT5iYXNlID0gYmFzZTsKKyAgICBzLT5pcnEgPSBpcnE7CisKKyAgICBzLT5maXJzdCA9IDA7CisgICAgcy0+bGFzdCA9IDA7CisgICAgcy0+c3RhdGUgPSBTVEFURV9JTklUOworICAgIHMtPm5hbWUgPSBnX3N0cmR1cChjb25maWctPmh3X2tleWJvYXJkX2NoYXJtYXApOworCisgICAgLy8gVGhlIGFuZHJvaWQgY29udHJvbCBhZ2VudCBtaWdodCBmaXJlIGJ1ZmZlcmVkIGV2ZW50cyB0byB0aGUgZGV2aWNlLCBzbworICAgIC8vIGVuc3VyZSB0aGF0IGl0IGlzIGVuYWJsZWQgYWZ0ZXIgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLgorICAgIHFlbXVfY29udHJvbF9zZXRFdmVudERldmljZShzKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiZXZlbnRzX3N0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgRVZFTlRTX1NUQVRFX1NBVkVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRzX3N0YXRlX3NhdmUsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50c19zdGF0ZV9sb2FkLAorICAgICAgICAgICAgICAgICAgICBzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9mYi5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiMzkyYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9mYi5jCkBAIC0wLDAgKzEsNjc2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAibWlncmF0aW9uL3FlbXUtZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2R1ZmYuaCIKKyNpbmNsdWRlICJleGVjL3JhbV9hZGRyLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKKworLyogVGhlc2UgdmFsdWVzICptdXN0KiBtYXRjaCB0aGUgcGxhdGZvcm0gZGVmaW5pdGlvbnMgZm91bmQgdW5kZXIKKyAqIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvaGFyZHdhcmUvaGFyZHdhcmUuaAorICovCitlbnVtIHsKKyAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCAgICAgICAgICA9IDEsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODggICAgICAgICAgPSAyLAorICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCAgICAgICAgICAgID0gMywKKyAgICBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUgICAgICAgICAgICA9IDQsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODggICAgICAgICAgPSA1LAorICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxICAgICAgICAgID0gNiwKKyAgICBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCAgICAgICAgICA9IDcsCit9OworCitlbnVtIHsKKyAgICBGQl9HRVRfV0lEVEggICAgICAgID0gMHgwMCwKKyAgICBGQl9HRVRfSEVJR0hUICAgICAgID0gMHgwNCwKKyAgICBGQl9JTlRfU1RBVFVTICAgICAgID0gMHgwOCwKKyAgICBGQl9JTlRfRU5BQkxFICAgICAgID0gMHgwYywKKyAgICBGQl9TRVRfQkFTRSAgICAgICAgID0gMHgxMCwKKyAgICBGQl9TRVRfUk9UQVRJT04gICAgID0gMHgxNCwKKyAgICBGQl9TRVRfQkxBTksgICAgICAgID0gMHgxOCwKKyAgICBGQl9HRVRfUEhZU19XSURUSCAgID0gMHgxYywKKyAgICBGQl9HRVRfUEhZU19IRUlHSFQgID0gMHgyMCwKKyAgICBGQl9HRVRfRk9STUFUICAgICAgID0gMHgyNCwKKworICAgIEZCX0lOVF9WU1lOQyAgICAgICAgICAgICA9IDFVIDw8IDAsCisgICAgRkJfSU5UX0JBU0VfVVBEQVRFX0RPTkUgID0gMVUgPDwgMQorfTsKKworc3RydWN0IGdvbGRmaXNoX2ZiX3N0YXRlIHsKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIGRldjsKKyAgICBEaXNwbGF5U3RhdGUqICBkczsKKyAgICBpbnQgICAgICBwaXhlbF9mb3JtYXQ7CisgICAgaW50ICAgICAgYnl0ZXNfcGVyX3BpeGVsOworICAgIHVpbnQzMl90IGZiX2Jhc2U7CisgICAgdWludDMyX3QgYmFzZV92YWxpZCA6IDE7CisgICAgdWludDMyX3QgbmVlZF91cGRhdGUgOiAxOworICAgIHVpbnQzMl90IG5lZWRfaW50IDogMTsKKyAgICB1aW50MzJfdCBzZXRfcm90YXRpb24gOiAyOworICAgIHVpbnQzMl90IGJsYW5rIDogMTsKKyAgICB1aW50MzJfdCBpbnRfc3RhdHVzOworICAgIHVpbnQzMl90IGludF9lbmFibGU7CisgICAgaW50ICAgICAgcm90YXRpb247ICAgLyogMCwgMSwgMiBvciAzICovCisgICAgaW50ICAgICAgZHBpOworfTsKKworI2RlZmluZSAgR09MREZJU0hfRkJfU0FWRV9WRVJTSU9OICAyCisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX2ZiX3NhdmUoUUVNVUZpbGUqICBmLCB2b2lkKiAgb3BhcXVlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9mYl9zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBEaXNwbGF5U3RhdGUqICBkcyA9IHMtPmRzOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBkcy0+c3VyZmFjZS0+d2lkdGgpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZHMtPnN1cmZhY2UtPmhlaWdodCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBkcy0+c3VyZmFjZS0+bGluZXNpemUpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgMCk7CisKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmZiX2Jhc2UpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgcy0+YmFzZV92YWxpZCk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5uZWVkX3VwZGF0ZSk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5uZWVkX2ludCk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5zZXRfcm90YXRpb24pOworICAgIHFlbXVfcHV0X2J5dGUoZiwgcy0+YmxhbmspOworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+aW50X3N0YXR1cyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5pbnRfZW5hYmxlKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnJvdGF0aW9uKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmRwaSk7Cit9CisKK3N0YXRpYyBpbnQgIGdvbGRmaXNoX2ZiX2xvYWQoUUVNVUZpbGUqICBmLCB2b2lkKiAgb3BhcXVlLCBpbnQgIHZlcnNpb25faWQpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX2ZiX3N0YXRlKiAgcyAgID0gb3BhcXVlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGRzX3csIGRzX2gsIGRzX3BpdGNoLCBkc19yb3Q7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBHT0xERklTSF9GQl9TQVZFX1ZFUlNJT04pCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgIGRzX3cgICAgID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBkc19oICAgICA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZHNfcGl0Y2ggPSBxZW11X2dldF9iZTMyKGYpOworICAgIGRzX3JvdCAgID0gcWVtdV9nZXRfYnl0ZShmKTsKKworICAgIERpc3BsYXlTdGF0ZSogIGRzID0gcy0+ZHM7CisKKyAgICBpZiAoZHMtPnN1cmZhY2UtPndpZHRoICE9IGRzX3cgfHwKKyAgICAgICAgZHMtPnN1cmZhY2UtPmhlaWdodCAhPSBkc19oIHx8CisgICAgICAgIGRzLT5zdXJmYWNlLT5saW5lc2l6ZSAhPSBkc19waXRjaCB8fAorICAgICAgICBkc19yb3QgIT0gMCkKKyAgICB7CisgICAgICAgIC8qIFhYWDogV2Ugc2hvdWxkIGJlIGFibGUgdG8gZm9yY2UgYSByZXNpemUvcm90YXRpb24gZnJvbSBoZXJlID8gKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZnJhbWVidWZmZXIgZGltZW5zaW9ucyBtaXNtYXRjaFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIHMtPmZiX2Jhc2UgICAgICA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcy0+YmFzZV92YWxpZCAgID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBzLT5uZWVkX3VwZGF0ZSAgPSBxZW11X2dldF9ieXRlKGYpOworICAgIHMtPm5lZWRfaW50ICAgICA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgcy0+c2V0X3JvdGF0aW9uID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBzLT5ibGFuayAgICAgICAgPSBxZW11X2dldF9ieXRlKGYpOworICAgIHMtPmludF9zdGF0dXMgICA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcy0+aW50X2VuYWJsZSAgID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5yb3RhdGlvbiAgICAgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHMtPmRwaSAgICAgICAgICA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICAvKiBmb3JjZSBhIHJlZnJlc2ggKi8KKyAgICBzLT5uZWVkX3VwZGF0ZSA9IDE7CisKKyAgICByZXQgPSAwOworRXhpdDoKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBUeXBlIHVzZWQgdG8gcmVjb3JkIGEgbWFwcGluZyBmcm9tIGRpc3BsYXkgc3VyZmFjZSBwaXhlbCBmb3JtYXQgdG8KKyAqIEhBTCBwaXhlbCBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICAgcGl4ZWxfZm9ybWF0OyAvKiBIQUwgcGl4ZWwgZm9ybWF0ICovCisgICAgdWludDhfdCBiaXRzOworICAgIHVpbnQ4X3QgYnl0ZXM7CisgICAgdWludDMyX3Qgcm1hc2ssIGdtYXNrLCBibWFzaywgYW1hc2s7Cit9IEZiQ29uZmlnOworCisKKy8qIFJldHVybiB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBjdXJyZW50IGZyYW1lYnVmZmVyLCBiYXNlZCBvbgorICogdGhlIGN1cnJlbnQgZGlzcGxheSBzdXJmYWNlJ3MgcGl4ZWwgZm9ybWF0LgorICoKKyAqIE5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGV2aWNlIGluaXRpYWxpemF0aW9uCisgKiBmdW5jdGlvbiwgYmVjYXVzZSB0aGUgZGlzcGxheSBzdXJmYWNlIHdpbGwgY2hhbmdlIGZvcm1hdCBiZWZvcmUgdGhlIGtlcm5lbAorICogc3RhcnQuCisgKi8KK3N0YXRpYyBpbnQgZ29sZGZpc2hfZmJfZ2V0X3BpeGVsX2Zvcm1hdChzdHJ1Y3QgZ29sZGZpc2hfZmJfc3RhdGUgKnMpCit7CisgICAgaWYgKHMtPnBpeGVsX2Zvcm1hdCA+PSAwKSB7CisgICAgICAgIHJldHVybiBzLT5waXhlbF9mb3JtYXQ7CisgICAgfQorICAgIHN0YXRpYyBjb25zdCBGYkNvbmZpZyBmYl9jb25maWdzW10gPSB7CisgICAgICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCAxNiwgMiwgMHhmODAwLCAweDdlMCwgMHgxZiwgMHgwIH0sCisgICAgICAgIHsgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsIDMyLCA0LCAweGZmMDAwMCwgMHhmZjAwLCAweGZmLCAweDAgfSwKKyAgICAgICAgeyBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMzIsIDQsIDB4ZmYwMDAwLCAweGZmMDAsIDB4ZmYsIDB4ZmYwMDAwMDAgfSwKKyAgICAgICAgeyAtMSwgfQorICAgIH07CisKKyAgICAvKiBEZXRlcm1pbmUgSEFMIHBpeGVsIGZvcm1hdCB2YWx1ZSBiYXNlZCBvbiBzLT5kcyAqLworICAgIHN0cnVjdCBQaXhlbEZvcm1hdCogcGYgPSAmcy0+ZHMtPnN1cmZhY2UtPnBmOworICAgIGlmIChWRVJCT1NFX0NIRUNLKGluaXQpKSB7CisgICAgICAgIHByaW50ZigiJXM6JWQ6IGRpc3BsYXkgc3VyZmFjZSxwaXhlbCBmb3JtYXQ6XG4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcHJpbnRmKCIgIGJpdHMvcGl4ZWw6ICAlZFxuIiwgcGYtPmJpdHNfcGVyX3BpeGVsKTsKKyAgICAgICAgcHJpbnRmKCIgIGJ5dGVzL3BpeGVsOiAlZFxuIiwgcGYtPmJ5dGVzX3Blcl9waXhlbCk7CisgICAgICAgIHByaW50ZigiICBkZXB0aDogICAgICAgJWRcbiIsIHBmLT5kZXB0aCk7CisgICAgICAgIHByaW50ZigiICByZWQ6ICAgICAgICAgYml0cz0lZCBtYXNrPTB4JXggc2hpZnQ9JWQgbWF4PTB4JXhcbiIsCisgICAgICAgICAgICBwZi0+cmJpdHMsIHBmLT5ybWFzaywgcGYtPnJzaGlmdCwgcGYtPnJtYXgpOworICAgICAgICBwcmludGYoIiAgZ3JlZW46ICAgICAgIGJpdHM9JWQgbWFzaz0weCV4IHNoaWZ0PSVkIG1heD0weCV4XG4iLAorICAgICAgICAgICAgcGYtPmdiaXRzLCBwZi0+Z21hc2ssIHBmLT5nc2hpZnQsIHBmLT5nbWF4KTsKKyAgICAgICAgcHJpbnRmKCIgIGJsdWU6ICAgICAgICBiaXRzPSVkIG1hc2s9MHgleCBzaGlmdD0lZCBtYXg9MHgleFxuIiwKKyAgICAgICAgICAgIHBmLT5iYml0cywgcGYtPmJtYXNrLCBwZi0+YnNoaWZ0LCBwZi0+Ym1heCk7CisgICAgICAgIHByaW50ZigiICBhbHBoYTogICAgICAgYml0cz0lZCBtYXNrPTB4JXggc2hpZnQ9JWQgbWF4PTB4JXhcbiIsCisgICAgICAgICAgICBwZi0+YWJpdHMsIHBmLT5hbWFzaywgcGYtPmFzaGlmdCwgcGYtPmFtYXgpOworICAgIH0KKworICAgIHMtPmJ5dGVzX3Blcl9waXhlbCA9IHBmLT5ieXRlc19wZXJfcGl4ZWw7CisgICAgaW50IG5uOworICAgIGZvciAobm4gPSAwOyBmYl9jb25maWdzW25uXS5waXhlbF9mb3JtYXQgPj0gMDsgbm4rKykgeworICAgICAgICBjb25zdCBGYkNvbmZpZyogZmJjID0gJmZiX2NvbmZpZ3Nbbm5dOworICAgICAgICBpZiAocGYtPmJpdHNfcGVyX3BpeGVsID09IGZiYy0+Yml0cyAmJgorICAgICAgICAgICAgcGYtPmJ5dGVzX3Blcl9waXhlbCA9PSBmYmMtPmJ5dGVzICYmCisgICAgICAgICAgICBwZi0+cm1hc2sgPT0gZmJjLT5ybWFzayAmJgorICAgICAgICAgICAgcGYtPmdtYXNrID09IGZiYy0+Z21hc2sgJiYKKyAgICAgICAgICAgIHBmLT5ibWFzayA9PSBmYmMtPmJtYXNrICYmCisgICAgICAgICAgICBwZi0+YW1hc2sgPT0gZmJjLT5hbWFzaykgeworICAgICAgICAgICAgLyogV2UgZm91bmQgaXQgKi8KKyAgICAgICAgICAgIHMtPnBpeGVsX2Zvcm1hdCA9IGZiYy0+cGl4ZWxfZm9ybWF0OworICAgICAgICAgICAgcmV0dXJuIHMtPnBpeGVsX2Zvcm1hdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBVbnN1cHBvcnRlZCBkaXNwbGF5IHBpeGVsIGZvcm1hdCAoZGVwdGg9JWQsIGJ5dGVzcHA9JWQsIGJpdHNwcD0lZClcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywKKyAgICAgICAgICAgICAgICBwZi0+ZGVwdGgsCisgICAgICAgICAgICAgICAgcGYtPmJ5dGVzX3Blcl9waXhlbCwKKyAgICAgICAgICAgICAgICBwZi0+Yml0c19wZXJfcGl4ZWwpOworICAgIGV4aXQoMSk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdvbGRmaXNoX2ZiX2dldF9ieXRlc19wZXJfcGl4ZWwoc3RydWN0IGdvbGRmaXNoX2ZiX3N0YXRlICpzKQoreworICAgIGlmIChzLT5waXhlbF9mb3JtYXQgPCAwKSB7CisgICAgICAgICh2b2lkKSBnb2xkZmlzaF9mYl9nZXRfcGl4ZWxfZm9ybWF0KHMpOworICAgIH0KKyAgICByZXR1cm4gcy0+Ynl0ZXNfcGVyX3BpeGVsOworfQorCitzdGF0aWMgaW50CitwaXhlbHNfdG9fbW0oaW50ICBwaXhlbHMsIGludCBkcGkpCit7CisgICAgLyogZHBpID0gZG90cyAvIGluY2gKKyAgICAqKiBpbmNoID0gZG90cyAvIGRwaQorICAgICoqIG1tIC8gMjUuNCA9IGRvdHMgLyBkcGkKKyAgICAqKiBtbSA9IChkb3RzICogMjUuNCkvZHBpCisgICAgKi8KKyAgICByZXR1cm4gKGludCkoMC41ICsgMjUuNCAqIHBpeGVscyAgLyBkcGkpOworfQorCisKKyNkZWZpbmUgIFNUQVRTICAwCisKKyNpZiBTVEFUUworc3RhdGljIGludCAgIHN0YXRzX2NvdW50ZXI7CitzdGF0aWMgbG9uZyAgc3RhdHNfdG90YWw7CitzdGF0aWMgaW50ICAgc3RhdHNfZnVsbF91cGRhdGVzOworc3RhdGljIGxvbmcgIHN0YXRzX3RvdGFsX2Z1bGxfdXBkYXRlczsKKyNlbmRpZgorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIGlucHV0cyBmb3IKKyAqIGNvbXB1dGVfZmJfdXBkYXRlX3JlY3RfbGluZWFyIGJlbG93LgorICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGZyYW1lYnVmZmVyIGFuZCBkZXN0aW5hdGlvbgorICogc3VyZmFjZSBwaXhlbCBidWZmZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgaGVpZ2h0OworICAgIGludCAgICAgICAgICAgIGJ5dGVzX3Blcl9waXhlbDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWxzOworICAgIGludCAgICAgICAgICAgIHNyY19waXRjaDsKKyAgICB1aW50OF90KiAgICAgICBkc3RfcGl4ZWxzOworICAgIGludCAgICAgICAgICAgIGRzdF9waXRjaDsKK30gRmJVcGRhdGVTdGF0ZTsKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHRoZSBvdXRwdXRzIGZvcgorICogY29tcHV0ZV9mYl91cGRhdGVfcmVjdF9saW5lYXIgYmVsb3cuCisgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBzbWFsbGVkIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUKKyAqIGxhdGVzdCBmcmFtZWJ1ZmZlciB1cGRhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgeG1pbiwgeW1pbiwgeG1heCwgeW1heDsKK30gRmJVcGRhdGVSZWN0OworCisvKiBEZXRlcm1pbmUgdGhlIHNtYWxsZXN0IGJvdW5kaW5nIHJlY3RhbmdsZSBvZiBwaXhlbHMgd2hpY2ggY2hhbmdlZAorICogYmV0d2VlbiB0aGUgc291cmNlIChmcmFtZWJ1ZmZlcikgYW5kIGRlc3RpbmF0aW9uIChzdXJmYWNlKSBwaXhlbAorICogYnVmZmVycy4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGVyZSB3YXMgbm8gY2hhbmdlLCBvdGhlcndpc2UsIHBvcHVsYXRlICcqcmVjdCcKKyAqIGFuZCByZXR1cm4gMS4KKyAqCisgKiBJZiAnZGlydHlfYmFzZScgaXMgbm90IDAsIGl0IGlzIGEgcGh5c2ljYWwgYWRkcmVzcyB0aGF0IHdpbGwgYmUKKyAqIHVzZWQgdG8gc3BlZWQtdXAgdGhlIGNoZWNrIHVzaW5nIHRoZSBWR0EgZGlydHkgYml0cy4gSW4gcHJhY3RpY2UKKyAqIHRoaXMgaXMgb25seSB1c2VkIGlmIHlvdXIga2VybmVsIGRyaXZlciBkb2VzIG5vdCBpbXBsZW1lbnQuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIGZyYW1lYnVmZmVycyBhcmUgaW4gbGluZWFyIG1lbW9yeS4KKyAqIFRoaXMgbWF5IGNoYW5nZSBsYXRlciB3aGVuIHdlIHdhbnQgdG8gc3VwcG9ydCBsYXJnZXIgZnJhbWVidWZmZXJzCisgKiB0aGF0IGV4Y2VlZCB0aGUgbWF4IERNQSBhcGVydHVyZSBzaXplIHRob3VnaC4KKyAqLworc3RhdGljIGludAorY29tcHV0ZV9mYl91cGRhdGVfcmVjdF9saW5lYXIoRmJVcGRhdGVTdGF0ZSogIGZicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBkaXJ0eV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmJVcGRhdGVSZWN0KiAgIHJlY3QpCit7CisgICAgaW50ICB5eTsKKyAgICBpbnQgIHdpZHRoID0gZmJzLT53aWR0aDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfbGluZSA9IGZicy0+c3JjX3BpeGVsczsKKyAgICB1aW50OF90KiAgICAgICBkc3RfbGluZSA9IGZicy0+ZHN0X3BpeGVsczsKKyAgICB1aW50MzJfdCAgICAgICBkaXJ0eV9hZGRyID0gZGlydHlfYmFzZTsKKyAgICByZWN0LT54bWluID0gcmVjdC0+eW1pbiA9IElOVF9NQVg7CisgICAgcmVjdC0+eG1heCA9IHJlY3QtPnltYXggPSBJTlRfTUlOOworICAgIGZvciAoeXkgPSAwOyB5eSA8IGZicy0+aGVpZ2h0OyB5eSsrKSB7CisgICAgICAgIGludCB4eDEsIHh4MjsKKyAgICAgICAgLyogSWYgZGlydHlfYWRkciBpcyAhPSAwLCB0aGVuIHVzZSBpdCBhcyBhIHBoeXNpY2FsIGFkZHJlc3MgdG8KKyAgICAgICAgICogdXNlIHRoZSBWR0EgZGlydHkgYml0cyB0YWJsZSB0byBzcGVlZCB1cCB0aGUgZGV0ZWN0aW9uIG9mCisgICAgICAgICAqIGNoYW5nZWQgcGl4ZWxzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGRpcnR5X2FkZHIgIT0gMCkgeworICAgICAgICAgICAgaW50ICBkaXJ0eSA9IGNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5KGRpcnR5X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJzLT5zcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX1ZHQSk7CisgICAgICAgICAgICBpZiAoIWRpcnR5KSB7IC8qIHRoaXMgbGluZSB3YXMgbm90IG1vZGlmaWVkLCBza2lwIHRvIG5leHQgb25lICovCisgICAgICAgICAgICAgICAgZ290byBORVhUX0xJTkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBUaGVuIGNvbXB1dGUgYWN0dWFsIGJvdW5kcyBvZiB0aGUgY2hhbmdlZCBwaXhlbHMsIHdoaWxlCisgICAgICAgICAqIGNvcHlpbmcgdGhlbSBmcm9tICdzcmMnIHRvICdkc3QnLiBUaGlzIGRlcGVuZHMgb24gdGhlIHBpeGVsIGRlcHRoLgorICAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChmYnMtPmJ5dGVzX3Blcl9waXhlbCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBzcmMgPSAoY29uc3QgdWludDE2X3QqKSBzcmNfbGluZTsKKyAgICAgICAgICAgIHVpbnQxNl90KiAgICAgICBkc3QgPSAodWludDE2X3QqKSBkc3RfbGluZTsKKworICAgICAgICAgICAgeHgxID0gMDsKKyAgICAgICAgICAgIERVRkY0KHdpZHRoLCB7CisgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BpeCA9IHNyY1t4eDFdOworI2lmIGRlZmluZWQoSE9TVF9XT1JEU19CSUdFTkRJQU4pICE9IGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyAgICAgICAgICAgICAgICBzcGl4ID0gKHVpbnQxNl90KSgoc3BpeCA8PCA4KSB8IChzcGl4ID4+IDgpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmIChzcGl4ICE9IGRzdFt4eDFdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB4eDErKzsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKHh4MSA9PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeHgyID0gd2lkdGgtMTsKKyAgICAgICAgICAgIERVRkY0KHh4Mi14eDEsIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjW3h4Ml0gIT0gZHN0W3h4Ml0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHh4Mi0tOworICAgICAgICAgICAgfSk7CisjaWYgZGVmaW5lZChIT1NUX1dPUkRTX0JJR0VORElBTikgIT0gZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQorICAgICAgICAgICAgLyogQ29udmVydCB0aGUgZ3Vlc3QgcGl4ZWxzIGludG8gaG9zdCBvbmVzICovCisgICAgICAgICAgICBpbnQgeHggPSB4eDE7CisgICAgICAgICAgICBEVUZGNCh4eDIteHgxKzEseworICAgICAgICAgICAgICAgIHVuc2lnbmVkICAgc3BpeCA9IHNyY1t4eF07CisgICAgICAgICAgICAgICAgZHN0W3h4XSA9ICh1aW50MTZfdCkoKHNwaXggPDwgOCkgfCAoc3BpeCA+PiA4KSk7CisgICAgICAgICAgICAgICAgeHgrKzsKKyAgICAgICAgICAgIH0pOworI2Vsc2UKKyAgICAgICAgICAgIG1lbWNweSggZHN0K3h4MSwgc3JjK3h4MSwgKHh4Mi14eDErMSkqMiApOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgeHgxID0gMDsKKyAgICAgICAgICAgIERVRkY0KHdpZHRoLCB7CisgICAgICAgICAgICAgICAgaW50IHh4ID0geHgxKjM7CisgICAgICAgICAgICAgICAgaWYgKHNyY19saW5lW3h4KzBdICE9IGRzdF9saW5lW3h4KzBdIHx8CisgICAgICAgICAgICAgICAgICAgIHNyY19saW5lW3h4KzFdICE9IGRzdF9saW5lW3h4KzFdIHx8CisgICAgICAgICAgICAgICAgICAgIHNyY19saW5lW3h4KzJdICE9IGRzdF9saW5lW3h4KzJdKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4eDEgKys7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh4eDEgPT0gd2lkdGgpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHh4MiA9IHdpZHRoLTE7CisgICAgICAgICAgICBEVUZGNCh4eDIteHgxLHsKKyAgICAgICAgICAgICAgICBpbnQgeHggPSB4eDIqMzsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2xpbmVbeHgrMF0gIT0gZHN0X2xpbmVbeHgrMF0gfHwKKyAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmVbeHgrMV0gIT0gZHN0X2xpbmVbeHgrMV0gfHwKKyAgICAgICAgICAgICAgICAgICAgc3JjX2xpbmVbeHgrMl0gIT0gZHN0X2xpbmVbeHgrMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHh4Mi0tOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtZW1jcHkoIGRzdF9saW5lK3h4MSozLCBzcmNfbGluZSt4eDEqMywgKHh4Mi14eDErMSkqMyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIDQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMgPSAoY29uc3QgdWludDMyX3QqKSBzcmNfbGluZTsKKyAgICAgICAgICAgIHVpbnQzMl90KiAgICAgICBkc3QgPSAodWludDMyX3QqKSBkc3RfbGluZTsKKworICAgICAgICAgICAgeHgxID0gMDsKKyAgICAgICAgICAgIERVRkY0KHdpZHRoLCB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3BpeCA9IHNyY1t4eDFdOworI2lmIGRlZmluZWQoSE9TVF9XT1JEU19CSUdFTkRJQU4pICE9IGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyAgICAgICAgICAgICAgICBzcGl4ID0gKHNwaXggPDwgMTYpIHwgKHNwaXggPj4gMTYpOworICAgICAgICAgICAgICAgIHNwaXggPSAoKHNwaXggPDwgOCkgJiAweGZmMDBmZjAwKSB8ICgoc3BpeCA+PiA4KSAmIDB4MDBmZjAwZmYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKHNwaXggIT0gZHN0W3h4MV0pIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHh4MSsrOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoeHgxID09IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4eDIgPSB3aWR0aC0xOworICAgICAgICAgICAgRFVGRjQoeHgyLXh4MSx7CisgICAgICAgICAgICAgICAgaWYgKHNyY1t4eDJdICE9IGRzdFt4eDJdKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4eDItLTsKKyAgICAgICAgICAgIH0pOworI2lmIGRlZmluZWQoSE9TVF9XT1JEU19CSUdFTkRJQU4pICE9IGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyAgICAgICAgICAgIC8qIENvbnZlcnQgdGhlIGd1ZXN0IHBpeGVscyBpbnRvIGhvc3Qgb25lcyAqLworICAgICAgICAgICAgaW50IHh4ID0geHgxOworICAgICAgICAgICAgRFVGRjQoeHgyLXh4MSsxLHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgIHNwaXggPSBzcmNbeHhdOworICAgICAgICAgICAgICAgIHNwaXggPSAoc3BpeCA8PCAxNikgfCAoc3BpeCA+PiAxNik7CisgICAgICAgICAgICAgICAgc3BpeCA9ICgoc3BpeCA8PCA4KSAmIDB4ZmYwMGZmMDApIHwgKChzcGl4ID4+IDgpICYgMHgwMGZmMDBmZik7CisgICAgICAgICAgICAgICAgZHN0W3h4XSA9IHNwaXg7CisgICAgICAgICAgICAgICAgeHgrKzsKKyAgICAgICAgICAgIH0pCisjZWxzZQorICAgICAgICAgICAgbWVtY3B5KCBkc3QreHgxLCBzcmMreHgxLCAoeHgyLXh4MSsxKSo0ICk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBVcGRhdGUgYm91bmRzIGlmIHBpeGVscyBvbiB0aGlzIGxpbmUgd2VyZSBtb2RpZmllZCAqLworICAgICAgICBpZiAoeHgxIDwgd2lkdGgpIHsKKyAgICAgICAgICAgIGlmICh4eDEgPCByZWN0LT54bWluKSByZWN0LT54bWluID0geHgxOworICAgICAgICAgICAgaWYgKHh4MiA+IHJlY3QtPnhtYXgpIHJlY3QtPnhtYXggPSB4eDI7CisgICAgICAgICAgICBpZiAoeXkgPCByZWN0LT55bWluKSByZWN0LT55bWluID0geXk7CisgICAgICAgICAgICBpZiAoeXkgPiByZWN0LT55bWF4KSByZWN0LT55bWF4ID0geXk7CisgICAgICAgIH0KKyAgICBORVhUX0xJTkU6CisgICAgICAgIHNyY19saW5lICs9IGZicy0+c3JjX3BpdGNoOworICAgICAgICBkc3RfbGluZSArPSBmYnMtPmRzdF9waXRjaDsKKyAgICB9CisKKyAgICBpZiAocmVjdC0+eW1pbiA+IHJlY3QtPnltYXgpIHsgLyogbm90aGluZyBjaGFuZ2VkICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIEFsd2F5cyBjbGVhciB0aGUgZGlydHkgVkdBIGJpdHMgKi8KKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3Jlc2V0X2RpcnR5KGRpcnR5X2Jhc2UgKyByZWN0LT55bWluICogZmJzLT5zcmNfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVjdC0+eW1heCAtIHJlY3QtPnltaW4gKyAxKSAqIGZicy0+c3JjX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSVFlfTUVNT1JZX1ZHQSk7CisgICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIHZvaWQgZ29sZGZpc2hfZmJfdXBkYXRlX2Rpc3BsYXkodm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9mYl9zdGF0ZSAqcyA9IChzdHJ1Y3QgZ29sZGZpc2hfZmJfc3RhdGUgKilvcGFxdWU7CisgICAgdWludDMyX3QgYmFzZTsKKyAgICB1aW50OF90KiAgZHN0X2xpbmU7CisgICAgdWludDhfdCogIHNyY19saW5lOworICAgIGludCBmdWxsX3VwZGF0ZSA9IDA7CisgICAgaW50ICB3aWR0aCwgaGVpZ2h0LCBwaXRjaDsKKworICAgIGJhc2UgPSBzLT5mYl9iYXNlOworICAgIGlmKGJhc2UgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYoKHMtPmludF9lbmFibGUgJiBGQl9JTlRfVlNZTkMpICYmICEocy0+aW50X3N0YXR1cyAmIEZCX0lOVF9WU1lOQykpIHsKKyAgICAgICAgcy0+aW50X3N0YXR1cyB8PSBGQl9JTlRfVlNZTkM7CisgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDEpOworICAgIH0KKworICAgIGlmKHMtPm5lZWRfdXBkYXRlKSB7CisgICAgICAgIGZ1bGxfdXBkYXRlID0gMTsKKyAgICAgICAgaWYocy0+bmVlZF9pbnQpIHsKKyAgICAgICAgICAgIHMtPmludF9zdGF0dXMgfD0gRkJfSU5UX0JBU0VfVVBEQVRFX0RPTkU7CisgICAgICAgICAgICBpZihzLT5pbnRfZW5hYmxlICYgRkJfSU5UX0JBU0VfVVBEQVRFX0RPTkUpCisgICAgICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+bmVlZF9pbnQgPSAwOworICAgICAgICBzLT5uZWVkX3VwZGF0ZSA9IDA7CisgICAgfQorCisgICAgc3JjX2xpbmUgID0gcWVtdV9nZXRfcmFtX3B0ciggYmFzZSApOworCisgICAgZHN0X2xpbmUgID0gcy0+ZHMtPnN1cmZhY2UtPmRhdGE7CisgICAgcGl0Y2ggICAgID0gcy0+ZHMtPnN1cmZhY2UtPmxpbmVzaXplOworICAgIHdpZHRoICAgICA9IHMtPmRzLT5zdXJmYWNlLT53aWR0aDsKKyAgICBoZWlnaHQgICAgPSBzLT5kcy0+c3VyZmFjZS0+aGVpZ2h0OworCisgICAgRmJVcGRhdGVTdGF0ZSAgZmJzOworICAgIEZiVXBkYXRlUmVjdCAgIHJlY3Q7CisKKyAgICBmYnMud2lkdGggICAgICA9IHdpZHRoOworICAgIGZicy5oZWlnaHQgICAgID0gaGVpZ2h0OworICAgIGZicy5kc3RfcGl4ZWxzID0gZHN0X2xpbmU7CisgICAgZmJzLmRzdF9waXRjaCAgPSBwaXRjaDsKKyAgICBmYnMuYnl0ZXNfcGVyX3BpeGVsID0gZ29sZGZpc2hfZmJfZ2V0X2J5dGVzX3Blcl9waXhlbChzKTsKKworICAgIGZicy5zcmNfcGl4ZWxzID0gc3JjX2xpbmU7CisgICAgZmJzLnNyY19waXRjaCAgPSB3aWR0aCpzLT5kcy0+c3VyZmFjZS0+cGYuYnl0ZXNfcGVyX3BpeGVsOworCisKKyNpZiBTVEFUUworICAgIGlmIChmdWxsX3VwZGF0ZSkKKyAgICAgICAgc3RhdHNfZnVsbF91cGRhdGVzICs9IDE7CisgICAgaWYgKCsrc3RhdHNfY291bnRlciA9PSAxMjApIHsKKyAgICAgICAgc3RhdHNfdG90YWwgICAgICAgICAgICAgICArPSBzdGF0c19jb3VudGVyOworICAgICAgICBzdGF0c190b3RhbF9mdWxsX3VwZGF0ZXMgICs9IHN0YXRzX2Z1bGxfdXBkYXRlczsKKworICAgICAgICBwcmludGYoICJmdWxsIHVwZGF0ZSBzdGF0czogIHBlYWsgJS4yZiAlJSAgdG90YWwgJS4yZiAlJVxuIiwKKyAgICAgICAgICAgICAgICBzdGF0c19mdWxsX3VwZGF0ZXMqMTAwLjAvc3RhdHNfY291bnRlciwKKyAgICAgICAgICAgICAgICBzdGF0c190b3RhbF9mdWxsX3VwZGF0ZXMqMTAwLjAvc3RhdHNfdG90YWwgKTsKKworICAgICAgICBzdGF0c19jb3VudGVyICAgICAgPSAwOworICAgICAgICBzdGF0c19mdWxsX3VwZGF0ZXMgPSAwOworICAgIH0KKyNlbmRpZiAvKiBTVEFUUyAqLworCisgICAgaWYgKHMtPmJsYW5rKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCBkc3RfbGluZSwgMCwgaGVpZ2h0KnBpdGNoICk7CisgICAgICAgIHJlY3QueG1pbiA9IDA7CisgICAgICAgIHJlY3QueW1pbiA9IDA7CisgICAgICAgIHJlY3QueG1heCA9IHdpZHRoLTE7CisgICAgICAgIHJlY3QueW1heCA9IGhlaWdodC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoZnVsbF91cGRhdGUpIHsgLyogZG9uJ3QgdXNlIGRpcnR5LWJpdHMgb3B0aW1pemF0aW9uICovCisgICAgICAgICAgICBiYXNlID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcHV0ZV9mYl91cGRhdGVfcmVjdF9saW5lYXIoJmZicywgYmFzZSwgJnJlY3QpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlY3QueG1heCArPSAxOworICAgIHJlY3QueW1heCArPSAxOworI2lmIDAKKyAgICBwcmludGYoImdvbGRmaXNoX2ZiX3VwZGF0ZV9kaXNwbGF5ICh5OiVkLGg6JWQseD0lZCx3PSVkKVxuIiwKKyAgICAgICAgICAgcmVjdC55bWluLCByZWN0LnltYXgtcmVjdC55bWluLCByZWN0LnhtaW4sIHJlY3QueG1heC1yZWN0LnhtaW4pOworI2VuZGlmCisKKyAgICBkcHlfdXBkYXRlKHMtPmRzLCByZWN0LnhtaW4sIHJlY3QueW1pbiwgcmVjdC54bWF4LXJlY3QueG1pbiwgcmVjdC55bWF4LXJlY3QueW1pbik7Cit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX2ZiX2ludmFsaWRhdGVfZGlzcGxheSh2b2lkICogb3BhcXVlKQoreworICAgIC8vIGlzIHRoaXMgY2FsbGVkPworICAgIHN0cnVjdCBnb2xkZmlzaF9mYl9zdGF0ZSAqcyA9IChzdHJ1Y3QgZ29sZGZpc2hfZmJfc3RhdGUgKilvcGFxdWU7CisgICAgcy0+bmVlZF91cGRhdGUgPSAxOworfQorCitzdGF0aWMgdWludDMyX3QgZ29sZGZpc2hfZmJfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIHN0cnVjdCBnb2xkZmlzaF9mYl9zdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHN3aXRjaChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSBGQl9HRVRfV0lEVEg6CisgICAgICAgICAgICByZXQgPSBkc19nZXRfd2lkdGgocy0+ZHMpOworICAgICAgICAgICAgLy9wcmludGYoIkZCX0dFVF9XSURUSCA9PiAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY2FzZSBGQl9HRVRfSEVJR0hUOgorICAgICAgICAgICAgcmV0ID0gZHNfZ2V0X2hlaWdodChzLT5kcyk7CisgICAgICAgICAgICAvL3ByaW50ZiggIkZCX0dFVF9IRUlHSFQgPSAlZFxuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY2FzZSBGQl9JTlRfU1RBVFVTOgorICAgICAgICAgICAgcmV0ID0gcy0+aW50X3N0YXR1cyAmIHMtPmludF9lbmFibGU7CisgICAgICAgICAgICBpZihyZXQpIHsKKyAgICAgICAgICAgICAgICBzLT5pbnRfc3RhdHVzICY9IH5yZXQ7CisgICAgICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNhc2UgRkJfR0VUX1BIWVNfV0lEVEg6CisgICAgICAgICAgICByZXQgPSBwaXhlbHNfdG9fbW0oIGRzX2dldF93aWR0aChzLT5kcyksIHMtPmRwaSApOworICAgICAgICAgICAgLy9wcmludGYoICJGQl9HRVRfUEhZU19XSURUSCA9PiAlZFxuIiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNhc2UgRkJfR0VUX1BIWVNfSEVJR0hUOgorICAgICAgICAgICAgcmV0ID0gcGl4ZWxzX3RvX21tKCBkc19nZXRfaGVpZ2h0KHMtPmRzKSwgcy0+ZHBpICk7CisgICAgICAgICAgICAvL3ByaW50ZiggIkZCX0dFVF9QSFlTX0hFSUdIVCA9PiAlZFxuIiwgcmV0ICk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNhc2UgRkJfR0VUX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBnb2xkZmlzaF9mYl9nZXRfcGl4ZWxfZm9ybWF0KHMpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2ZiX3JlYWQ6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9mYl93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX2ZiX3N0YXRlICpzID0gb3BhcXVlOworCisgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIEZCX0lOVF9FTkFCTEU6CisgICAgICAgICAgICBzLT5pbnRfZW5hYmxlID0gdmFsOworICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGQl9TRVRfQkFTRTogeworICAgICAgICAgICAgaW50IG5lZWRfcmVzaXplID0gIXMtPmJhc2VfdmFsaWQ7CisgICAgICAgICAgICBzLT5mYl9iYXNlID0gdmFsOworICAgICAgICAgICAgcy0+aW50X3N0YXR1cyAmPSB+RkJfSU5UX0JBU0VfVVBEQVRFX0RPTkU7CisgICAgICAgICAgICBzLT5uZWVkX3VwZGF0ZSA9IDE7CisgICAgICAgICAgICBzLT5uZWVkX2ludCA9IDE7CisgICAgICAgICAgICBzLT5iYXNlX3ZhbGlkID0gMTsKKyAgICAgICAgICAgIGlmKHMtPnNldF9yb3RhdGlvbiAhPSBzLT5yb3RhdGlvbikgeworICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJGQl9TRVRfQkFTRTogcm90YXRpb24gOiAlZCA9PiAlZFxuIiwgcy0+cm90YXRpb24sIHMtPnNldF9yb3RhdGlvbik7CisgICAgICAgICAgICAgICAgcy0+cm90YXRpb24gPSBzLT5zZXRfcm90YXRpb247CisgICAgICAgICAgICAgICAgbmVlZF9yZXNpemUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgKHMtPmludF9zdGF0dXMgJiBzLT5pbnRfZW5hYmxlKSk7CisgICAgICAgICAgICBpZiAobmVlZF9yZXNpemUpIHsKKyAgICAgICAgICAgICAgICAvL3ByaW50ZigiRkJfU0VUX0JBU0U6IG5lZWQgcmVzaXplIChyb3RhdGlvbj0lZClcbiIsIHMtPnJvdGF0aW9uICk7CisgICAgICAgICAgICAgICAgZHB5X3Jlc2l6ZShzLT5kcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEZCX1NFVF9ST1RBVElPTjoKKyAgICAgICAgICAgIC8vcHJpbnRmKCAiRkJfU0VUX1JPVEFUSU9OICVkXG4iLCB2YWwpOworICAgICAgICAgICAgcy0+c2V0X3JvdGF0aW9uID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkJfU0VUX0JMQU5LOgorICAgICAgICAgICAgcy0+YmxhbmsgPSB2YWw7CisgICAgICAgICAgICBzLT5uZWVkX3VwZGF0ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfZmJfd3JpdGU6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIH0KK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpnb2xkZmlzaF9mYl9yZWFkZm5bXSA9IHsKKyAgIGdvbGRmaXNoX2ZiX3JlYWQsCisgICBnb2xkZmlzaF9mYl9yZWFkLAorICAgZ29sZGZpc2hfZmJfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfZmJfd3JpdGVmbltdID0geworICAgZ29sZGZpc2hfZmJfd3JpdGUsCisgICBnb2xkZmlzaF9mYl93cml0ZSwKKyAgIGdvbGRmaXNoX2ZiX3dyaXRlCit9OworCit2b2lkIGdvbGRmaXNoX2ZiX2luaXQoaW50IGlkKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9mYl9zdGF0ZSAqczsKKworICAgIHMgPSAoc3RydWN0IGdvbGRmaXNoX2ZiX3N0YXRlICopZ19tYWxsb2MwKHNpemVvZigqcykpOworICAgIHMtPmRldi5uYW1lID0gImdvbGRmaXNoX2ZiIjsKKyAgICBzLT5kZXYuaWQgPSBpZDsKKyAgICBzLT5kZXYuc2l6ZSA9IDB4MTAwMDsKKyAgICBzLT5kZXYuaXJxX2NvdW50ID0gMTsKKworICAgIHMtPmRzID0gZ3JhcGhpY19jb25zb2xlX2luaXQoZ29sZGZpc2hfZmJfdXBkYXRlX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9mYl9pbnZhbGlkYXRlX2Rpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMpOworCisgICAgcy0+ZHBpID0gMTY1OyAgLyogWFhYOiBGaW5kIGJldHRlciB3YXkgdG8gZ2V0IGFjdHVhbCB2YWx1ZSAhICovCisKKyAgICAvKiBJTVBPUlRBTlQ6IERPIE5PVCBDT01QVVRFIHMtPnBpeGVsX2Zvcm1hdCBhbmQgcy0+Ynl0ZXNfcGVyX3BpeGVsCisgICAgICogaGVyZSBiZWNhdXNlIHRoZSBkaXNwbGF5IHN1cmZhY2UgaXMgZ29pbmcgdG8gY2hhbmdlIGxhdGVyLgorICAgICAqLworICAgIHMtPmJ5dGVzX3Blcl9waXhlbCA9IDA7CisgICAgcy0+cGl4ZWxfZm9ybWF0ICAgID0gLTE7CisKKyAgICBnb2xkZmlzaF9kZXZpY2VfYWRkKCZzLT5kZXYsIGdvbGRmaXNoX2ZiX3JlYWRmbiwgZ29sZGZpc2hfZmJfd3JpdGVmbiwgcyk7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2ZiIiwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgR09MREZJU0hfRkJfU0FWRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9mYl9zYXZlLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9mYl9sb2FkLAorICAgICAgICAgICAgICAgICAgICBzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9pbnRlcnJ1cHQuYyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9pbnRlcnJ1cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ExNjEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL2ludGVycnVwdC5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAibWlncmF0aW9uL3FlbXUtZmlsZS5oIgorI2luY2x1ZGUgImh3L2FybS9waWMuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgImh3L2lycS5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisKK2VudW0geworICAgIElOVEVSUlVQVF9TVEFUVVMgICAgICAgID0gMHgwMCwgLy8gbnVtYmVyIG9mIHBlbmRpbmcgaW50ZXJydXB0cworICAgIElOVEVSUlVQVF9OVU1CRVIgICAgICAgID0gMHgwNCwKKyAgICBJTlRFUlJVUFRfRElTQUJMRV9BTEwgICA9IDB4MDgsCisgICAgSU5URVJSVVBUX0RJU0FCTEUgICAgICAgPSAweDBjLAorICAgIElOVEVSUlVQVF9FTkFCTEUgICAgICAgID0gMHgxMAorfTsKKworc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSB7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSBkZXY7CisgICAgdWludDMyX3QgbGV2ZWw7CisgICAgdWludDMyX3QgcGVuZGluZ19jb3VudDsKKyAgICB1aW50MzJfdCBpcnFfZW5hYmxlZDsKKyAgICB1aW50MzJfdCBmaXFfZW5hYmxlZDsKKyAgICBxZW11X2lycSBwYXJlbnRfaXJxOworICAgIHFlbXVfaXJxIHBhcmVudF9maXE7Cit9OworCisjZGVmaW5lICBHT0xERklTSF9JTlRfU0FWRV9WRVJTSU9OICAxCisKKyNkZWZpbmUgIFFGSUVMRF9TVFJVQ1QgIHN0cnVjdCBnb2xkZmlzaF9pbnRfc3RhdGUKK1FGSUVMRF9CRUdJTihnb2xkZmlzaF9pbnRfZmllbGRzKQorICAgIFFGSUVMRF9JTlQzMihsZXZlbCksCisgICAgUUZJRUxEX0lOVDMyKHBlbmRpbmdfY291bnQpLAorICAgIFFGSUVMRF9JTlQzMihpcnFfZW5hYmxlZCksCisgICAgUUZJRUxEX0lOVDMyKGZpcV9lbmFibGVkKSwKK1FGSUVMRF9FTkQKKworc3RhdGljIHZvaWQgZ29sZGZpc2hfaW50X3NhdmUoUUVNVUZpbGUqICBmLCB2b2lkKiAgb3BhcXVlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9pbnRfc3RhdGUqICBzID0gb3BhcXVlOworCisgICAgcWVtdV9wdXRfc3RydWN0KGYsIGdvbGRmaXNoX2ludF9maWVsZHMsIHMpOworfQorCitzdGF0aWMgaW50ICBnb2xkZmlzaF9pbnRfbG9hZChRRU1VRmlsZSogIGYsIHZvaWQqICBvcGFxdWUsIGludCAgdmVyc2lvbl9pZCkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfaW50X3N0YXRlKiAgcyA9IG9wYXF1ZTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IEdPTERGSVNIX0lOVF9TQVZFX1ZFUlNJT04pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBxZW11X2dldF9zdHJ1Y3QoZiwgZ29sZGZpc2hfaW50X2ZpZWxkcywgcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX2ludF91cGRhdGUoc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSAqcykKK3sKKyAgICB1aW50MzJfdCBmbGFnczsKKworICAgIGZsYWdzID0gKHMtPmxldmVsICYgcy0+aXJxX2VuYWJsZWQpOworICAgIHFlbXVfc2V0X2lycShzLT5wYXJlbnRfaXJxLCBmbGFncyAhPSAwKTsKKworICAgIGZsYWdzID0gKHMtPmxldmVsICYgcy0+ZmlxX2VuYWJsZWQpOworICAgIHFlbXVfc2V0X2lycShzLT5wYXJlbnRfZmlxLCBmbGFncyAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgZ29sZGZpc2hfaW50X3NldF9pcnEodm9pZCAqb3BhcXVlLCBpbnQgaXJxLCBpbnQgbGV2ZWwpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZ29sZGZpc2hfaW50X3N0YXRlICopb3BhcXVlOworICAgIHVpbnQzMl90IG1hc2sgPSAoMVUgPDwgaXJxKTsKKworICAgIGlmKGxldmVsKSB7CisgICAgICAgIGlmKCEocy0+bGV2ZWwgJiBtYXNrKSkgeworICAgICAgICAgICAgaWYocy0+aXJxX2VuYWJsZWQgJiBtYXNrKQorICAgICAgICAgICAgICAgIHMtPnBlbmRpbmdfY291bnQrKzsKKyAgICAgICAgICAgIHMtPmxldmVsIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmKHMtPmxldmVsICYgbWFzaykgeworICAgICAgICAgICAgaWYocy0+aXJxX2VuYWJsZWQgJiBtYXNrKQorICAgICAgICAgICAgICAgIHMtPnBlbmRpbmdfY291bnQtLTsKKyAgICAgICAgICAgIHMtPmxldmVsICY9IH5tYXNrOworICAgICAgICB9CisgICAgfQorICAgIGdvbGRmaXNoX2ludF91cGRhdGUocyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnb2xkZmlzaF9pbnRfcmVhZCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZ29sZGZpc2hfaW50X3N0YXRlICopb3BhcXVlOworCisgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICBjYXNlIElOVEVSUlVQVF9TVEFUVVM6IC8qIElSUV9TVEFUVVMgKi8KKyAgICAgICAgcmV0dXJuIHMtPnBlbmRpbmdfY291bnQ7CisgICAgY2FzZSBJTlRFUlJVUFRfTlVNQkVSOiB7CisgICAgICAgIGludCBpOworICAgICAgICB1aW50MzJfdCBwZW5kaW5nID0gcy0+bGV2ZWwgJiBzLT5pcnFfZW5hYmxlZDsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICAgICAgaWYocGVuZGluZyAmICgxVSA8PCBpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2ludF9yZWFkOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX2ludF93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9pbnRfc3RhdGUgKnMgPSAoc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSAqKW9wYXF1ZTsKKyAgICB1aW50MzJfdCBtYXNrID0gKDFVIDw8IHZhbHVlKTsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgSU5URVJSVVBUX0RJU0FCTEVfQUxMOgorICAgICAgICAgICAgcy0+cGVuZGluZ19jb3VudCA9IDA7CisgICAgICAgICAgICBzLT5sZXZlbCA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOVEVSUlVQVF9ESVNBQkxFOgorICAgICAgICAgICAgaWYocy0+aXJxX2VuYWJsZWQgJiBtYXNrKSB7CisgICAgICAgICAgICAgICAgaWYocy0+bGV2ZWwgJiBtYXNrKQorICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nX2NvdW50LS07CisgICAgICAgICAgICAgICAgcy0+aXJxX2VuYWJsZWQgJj0gfm1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTlRFUlJVUFRfRU5BQkxFOgorICAgICAgICAgICAgaWYoIShzLT5pcnFfZW5hYmxlZCAmIG1hc2spKSB7CisgICAgICAgICAgICAgICAgcy0+aXJxX2VuYWJsZWQgfD0gbWFzazsKKyAgICAgICAgICAgICAgICBpZihzLT5sZXZlbCAmIG1hc2spCisgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmdfY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2ludF93cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBnb2xkZmlzaF9pbnRfdXBkYXRlKHMpOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmdvbGRmaXNoX2ludF9yZWFkZm5bXSA9IHsKKyAgICBnb2xkZmlzaF9pbnRfcmVhZCwKKyAgICBnb2xkZmlzaF9pbnRfcmVhZCwKKyAgICBnb2xkZmlzaF9pbnRfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfaW50X3dyaXRlZm5bXSA9IHsKKyAgICBnb2xkZmlzaF9pbnRfd3JpdGUsCisgICAgZ29sZGZpc2hfaW50X3dyaXRlLAorICAgIGdvbGRmaXNoX2ludF93cml0ZQorfTsKKworcWVtdV9pcnEqICBnb2xkZmlzaF9pbnRlcnJ1cHRfaW5pdCh1aW50MzJfdCBiYXNlLCBxZW11X2lycSBwYXJlbnRfaXJxLCBxZW11X2lycSBwYXJlbnRfZmlxKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IGdvbGRmaXNoX2ludF9zdGF0ZSAqczsKKyAgICBxZW11X2lycSogIHFpOworCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoKnMpKTsKKyAgICBxaSA9IHFlbXVfYWxsb2NhdGVfaXJxcyhnb2xkZmlzaF9pbnRfc2V0X2lycSwgcywgR0ZEX01BWF9JUlEpOworICAgIHMtPmRldi5uYW1lID0gImdvbGRmaXNoX2ludGVycnVwdF9jb250cm9sbGVyIjsKKyAgICBzLT5kZXYuaWQgPSAtMTsKKyAgICBzLT5kZXYuYmFzZSA9IGJhc2U7CisgICAgcy0+ZGV2LnNpemUgPSAweDEwMDA7CisgICAgcy0+cGFyZW50X2lycSA9IHBhcmVudF9pcnE7CisgICAgcy0+cGFyZW50X2ZpcSA9IHBhcmVudF9maXE7CisKKyAgICByZXQgPSBnb2xkZmlzaF9kZXZpY2VfYWRkKCZzLT5kZXYsIGdvbGRmaXNoX2ludF9yZWFkZm4sIGdvbGRmaXNoX2ludF93cml0ZWZuLCBzKTsKKyAgICBpZihyZXQpIHsKKyAgICAgICAgZ19mcmVlKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX2ludCIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX0lOVF9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX2ludF9zYXZlLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9pbnRfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7CisKKyAgICByZXR1cm4gcWk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9tbWMuYyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9tbWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmJlZWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL21tYy5jCkBAIC0wLDAgKzEsNTgwIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vcWVtdS1maWxlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L21tYy5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrLmgiCisKKy8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gJEtFUk5FTC9pbmNsdWRlL2xpbnV4L21tYy9zZC5oCisKKyNkZWZpbmUgU0RfU0VORF9SRUxBVElWRV9BRERSICAgICAzICAgLyogYmNyICAgICAgICAgICAgICAgICAgICAgUjYgICovCisjZGVmaW5lIFNEX1NFTkRfSUZfQ09ORCAgICAgICAgICAgOCAgIC8qIGJjciAgWzExOjBdIFNlZSBiZWxvdyAgIFI3ICAqLworCisjZGVmaW5lIFNEX1NXSVRDSCAgICAgICAgICAgICAgICAgNiAgIC8qIGFkdGMgWzMxOjBdIFNlZSBiZWxvdyAgIFIxICAqLworCisjZGVmaW5lIFNEX0FQUF9TRVRfQlVTX1dJRFRIICAgICAgNiAgIC8qIGFjICAgWzE6MF0gYnVzIHdpZHRoICAgIFIxICAqLworI2RlZmluZSBTRF9BUFBfU0VORF9OVU1fV1JfQkxLUyAgMjIgICAvKiBhZHRjICAgICAgICAgICAgICAgICAgICBSMSAgKi8KKyNkZWZpbmUgU0RfQVBQX09QX0NPTkQgICAgICAgICAgIDQxICAgLyogYmNyICBbMzE6MF0gT0NSICAgICAgICAgUjMgICovCisjZGVmaW5lIFNEX0FQUF9TRU5EX1NDUiAgICAgICAgICA1MSAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxICAqLworCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8wICAgICAgICAgIDAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjAgLSAxLjAxICovCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8xICAgICAgICAgIDEgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjEwICovCisjZGVmaW5lIFNDUl9TUEVDX1ZFUl8yICAgICAgICAgIDIgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAyLjAwICovCisKKyNkZWZpbmUgU0RfQlVTX1dJRFRIXzEgICAgICAgICAgMAorI2RlZmluZSBTRF9CVVNfV0lEVEhfNCAgICAgICAgICAyCisKKyNkZWZpbmUgU0RfU1dJVENIX0NIRUNLICAgICAgICAgMAorI2RlZmluZSBTRF9TV0lUQ0hfU0VUICAgICAgICAgICAxCisKKyNkZWZpbmUgU0RfU1dJVENIX0dSUF9BQ0NFU1MgICAgMAorCisjZGVmaW5lIFNEX1NXSVRDSF9BQ0NFU1NfREVGICAgIDAKKyNkZWZpbmUgU0RfU1dJVENIX0FDQ0VTU19IUyAgICAgMQorCisKK2VudW0geworICAgIC8qIHN0YXR1cyByZWdpc3RlciAqLworICAgIE1NQ19JTlRfU1RBVFVTICAgICAgICAgID0gMHgwMCwKKyAgICAvKiBzZXQgdGhpcyB0byBlbmFibGUgSVJRICovCisgICAgTU1DX0lOVF9FTkFCTEUgICAgICAgICAgPSAweDA0LAorICAgIC8qIHNldCB0aGlzIHRvIHNwZWNpZnkgYnVmZmVyIGFkZHJlc3MgKi8KKyAgICBNTUNfU0VUX0JVRkZFUiAgICAgICAgICA9IDB4MDgsCisKKyAgICAvKiBNTUMgY29tbWFuZCBudW1iZXIgKi8KKyAgICBNTUNfQ01EICAgICAgICAgICAgICAgICA9IDB4MEMsCisKKyAgICAvKiBNTUMgYXJndW1lbnQgKi8KKyAgICBNTUNfQVJHICAgICAgICAgICAgICAgICA9IDB4MTAsCisKKyAgICAvKiBNTUMgcmVzcG9uc2UgKG9yIFIyIGJpdHMgMCAtIDMxKSAqLworICAgIE1NQ19SRVNQXzAgICAgICAgICAgICAgID0gMHgxNCwKKworICAgIC8qIE1NQyBSMiByZXNwb25zZSBiaXRzIDMyIC0gNjMgKi8KKyAgICBNTUNfUkVTUF8xICAgICAgICAgICAgICA9IDB4MTgsCisKKyAgICAvKiBNTUMgUjIgcmVzcG9uc2UgYml0cyA2NCAtIDk1ICovCisgICAgTU1DX1JFU1BfMiAgICAgICAgICAgICAgPSAweDFDLAorCisgICAgLyogTU1DIFIyIHJlc3BvbnNlIGJpdHMgOTYgLSAxMjcgKi8KKyAgICBNTUNfUkVTUF8zICAgICAgICAgICAgICA9IDB4MjAsCisKKyAgICBNTUNfQkxPQ0tfTEVOR1RIICAgICAgICA9IDB4MjQsCisgICAgTU1DX0JMT0NLX0NPVU5UICAgICAgICAgPSAweDI4LAorCisgICAgLyogTU1DIHN0YXRlIGZsYWdzICovCisgICAgTU1DX1NUQVRFICAgICAgICAgICAgICAgPSAweDJDLAorCisgICAgLyogNjQtYml0IGd1ZXN0IENQVXMgb25seSAqLworCisgICAgLyogU2V0IGhpZ2ggMzItYml0cyBvZiBidWZmZXIgYWRkcmVzcyAqLworICAgIE1NQ19TRVRfQlVGRkVSX0hJR0ggICAgID0gMHgzMCwKKworICAgIC8qIE1NQ19JTlRfU1RBVFVTIGJpdHMgKi8KKworICAgIE1NQ19TVEFUX0VORF9PRl9DTUQgICAgID0gMVUgPDwgMCwKKyAgICBNTUNfU1RBVF9FTkRfT0ZfREFUQSAgICA9IDFVIDw8IDEsCisgICAgTU1DX1NUQVRfU1RBVEVfQ0hBTkdFICAgPSAxVSA8PCAyLAorCisgICAgLyogTU1DX1NUQVRFIGJpdHMgKi8KKyAgICBNTUNfU1RBVEVfSU5TRVJURUQgICAgID0gMVUgPDwgMCwKKyAgICBNTUNfU1RBVEVfUkVBRF9PTkxZICAgICA9IDFVIDw8IDEsCit9OworCisKK3N0cnVjdCBnb2xkZmlzaF9tbWNfc3RhdGUgeworICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgZGV2OworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzOworICAgIC8vIHBvaW50ZXIgdG8gb3VyIGJ1ZmZlcgorICAgIHVpbnQ2NF90IGJ1ZmZlcl9hZGRyZXNzOworICAgIC8vIG9mZnNldHMgZm9yIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMKKyAgICB1aW50MzJfdCByZWFkX29mZnNldCwgd3JpdGVfb2Zmc2V0OworICAgIC8vIGJ1ZmZlciBzdGF0dXMgZmxhZ3MKKyAgICB1aW50MzJfdCBpbnRfc3RhdHVzOworICAgIC8vIGlycSBlbmFibGUgbWFzayBmb3IgaW50X3N0YXR1cworICAgIHVpbnQzMl90IGludF9lbmFibGU7CisKKyAgICAvLyBNTUMgY29tbWFuZCBhcmd1bWVudAorICAgIHVpbnQzMl90IGFyZzsKKyAgICB1aW50MzJfdCByZXNwWzRdOworCisgICAgdWludDMyX3QgYmxvY2tfbGVuZ3RoOworICAgIHVpbnQzMl90IGJsb2NrX2NvdW50OworICAgIGludCBpc19TREhDOworCisgICAgdWludDhfdCogYnVmOworfTsKKworI2RlZmluZSAgR09MREZJU0hfTU1DX1NBVkVfVkVSU0lPTiAgMworI2RlZmluZSAgR09MREZJU0hfTU1DX1NBVkVfVkVSU0lPTl9MRUdBQ1kgIDIKKworLy8gTm90ZTogVGhpcyBkb2Vzbid0IGluY2x1ZGUgfGJ1ZmZlcl9hZGRyZXNzfCB3aGljaCBpcyBzYXZlZCBhbmQgbG9hZGVkCisvLyAgICAgICBleHBsaWN0bHkgYmVsb3cgdG8gc3VwcG9ydCBsZWdhY3kgZW5jb2RpbmdzLgorI2RlZmluZSAgUUZJRUxEX1NUUlVDVCAgc3RydWN0IGdvbGRmaXNoX21tY19zdGF0ZQorUUZJRUxEX0JFR0lOKGdvbGRmaXNoX21tY19maWVsZHMpCisgICAgUUZJRUxEX0lOVDMyKHJlYWRfb2Zmc2V0KSwKKyAgICBRRklFTERfSU5UMzIod3JpdGVfb2Zmc2V0KSwKKyAgICBRRklFTERfSU5UMzIoaW50X3N0YXR1cyksCisgICAgUUZJRUxEX0lOVDMyKGludF9lbmFibGUpLAorICAgIFFGSUVMRF9JTlQzMihhcmcpLAorICAgIFFGSUVMRF9JTlQzMihyZXNwWzBdKSwKKyAgICBRRklFTERfSU5UMzIocmVzcFsxXSksCisgICAgUUZJRUxEX0lOVDMyKHJlc3BbMl0pLAorICAgIFFGSUVMRF9JTlQzMihyZXNwWzNdKSwKKyAgICBRRklFTERfSU5UMzIoYmxvY2tfbGVuZ3RoKSwKKyAgICBRRklFTERfSU5UMzIoYmxvY2tfY291bnQpLAorICAgIFFGSUVMRF9JTlQzMihpc19TREhDKSwKK1FGSUVMRF9FTkQKKworc3RhdGljIHZvaWQgIGdvbGRmaXNoX21tY19zYXZlKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfbW1jX3N0YXRlKiAgcyA9IG9wYXF1ZTsKKworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+YnVmZmVyX2FkZHJlc3MpOworICAgIHFlbXVfcHV0X3N0cnVjdChmLCBnb2xkZmlzaF9tbWNfZmllbGRzLCBzKTsKK30KKworc3RhdGljIGludCAgZ29sZGZpc2hfbW1jX2xvYWQoUUVNVUZpbGUqICBmLCB2b2lkKiAgb3BhcXVlLCBpbnQgIHZlcnNpb25faWQpCit7CisgICAgc3RydWN0IGdvbGRmaXNoX21tY19zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBpZiAodmVyc2lvbl9pZCA9PSBHT0xERklTSF9NTUNfU0FWRV9WRVJTSU9OKSB7CisgICAgICAgIHMtPmJ1ZmZlcl9hZGRyZXNzID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICB9IGVsc2UgaWYgKHZlcnNpb25faWQgPT0gR09MREZJU0hfTU1DX1NBVkVfVkVSU0lPTl9MRUdBQ1kpIHsKKyAgICAgICAgcy0+YnVmZmVyX2FkZHJlc3MgPSBxZW11X2dldF9iZTMyKGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVuc3VwcG9ydGVkIHZlcnNpb24hCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHFlbXVfZ2V0X3N0cnVjdChmLCBnb2xkZmlzaF9tbWNfZmllbGRzLCBzKTsKK30KKworc3RydWN0IG1tY19vcGNvZGUgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgaW50IGNtZDsKK30gbW1jX29wY29kZXNbXSA9IHsKKyAgICB7ICJNTUNfR09fSURMRV9TVEFURSIsICAgICAgICAgMCAgfSwKKyAgICB7ICJNTUNfU0VORF9PUF9DT05EIiwgICAgICAgICAgMSAgfSwKKyAgICB7ICJNTUNfQUxMX1NFTkRfQ0lEIiwgICAgICAgICAgMiAgfSwKKyAgICB7ICJNTUNfU0VUX1JFTEFUSVZFX0FERFIiLCAgICAgMyAgfSwKKyAgICB7ICJNTUNfU0VUX0RTUiIsICAgICAgICAgICAgICAgNCAgfSwKKyAgICB7ICJNTUNfU1dJVENIIiwgICAgICAgICAgICAgICAgNiAgfSwKKyAgICB7ICJNTUNfU0VMRUNUX0NBUkQiLCAgICAgICAgICAgNyAgfSwKKyAgICB7ICJNTUNfU0VORF9FWFRfQ1NEIiwgICAgICAgICAgOCAgfSwKKyAgICB7ICJNTUNfU0VORF9DU0QiLCAgICAgICAgICAgICAgOSAgfSwKKyAgICB7ICJNTUNfU0VORF9DSUQiLCAgICAgICAgICAgICAxMCAgfSwKKyAgICB7ICJNTUNfUkVBRF9EQVRfVU5USUxfU1RPUCIsICAxMSAgfSwKKyAgICB7ICJNTUNfU1RPUF9UUkFOU01JU1NJT04iLCAgICAxMiAgfSwKKyAgICB7ICJNTUNfU0VORF9TVEFUVVMiLCAgICAgICAgICAxMyAgfSwKKyAgICB7ICJNTUNfR09fSU5BQ1RJVkVfU1RBVEUiLCAgICAxNSAgfSwKKyAgICB7ICJNTUNfU0VUX0JMT0NLTEVOIiwgICAgICAgICAxNiAgfSwKKyAgICB7ICJNTUNfUkVBRF9TSU5HTEVfQkxPQ0siLCAgICAxNyAgfSwKKyAgICB7ICJNTUNfUkVBRF9NVUxUSVBMRV9CTE9DSyIsICAxOCAgfSwKKyAgICB7ICJNTUNfV1JJVEVfREFUX1VOVElMX1NUT1AiLCAyMCAgfSwKKyAgICB7ICJNTUNfU0VUX0JMT0NLX0NPVU5UIiwgICAgICAyMyAgfSwKKyAgICB7ICJNTUNfV1JJVEVfQkxPQ0siLCAgICAgICAgICAyNCAgfSwKKyAgICB7ICJNTUNfV1JJVEVfTVVMVElQTEVfQkxPQ0siLCAyNSAgfSwKKyAgICB7ICJNTUNfUFJPR1JBTV9DSUQiLCAgICAgICAgICAyNiAgfSwKKyAgICB7ICJNTUNfUFJPR1JBTV9DU0QiLCAgICAgICAgICAyNyAgfSwKKyAgICB7ICJNTUNfU0VUX1dSSVRFX1BST1QiLCAgICAgICAyOCAgfSwKKyAgICB7ICJNTUNfQ0xSX1dSSVRFX1BST1QiLCAgICAgICAyOSAgfSwKKyAgICB7ICJNTUNfU0VORF9XUklURV9QUk9UIiwgICAgICAzMCAgfSwKKyAgICB7ICJNTUNfRVJBU0VfR1JPVVBfU1RBUlQiLCAgICAzNSAgfSwKKyAgICB7ICJNTUNfRVJBU0VfR1JPVVBfRU5EIiwgICAgICAzNiAgfSwKKyAgICB7ICJNTUNfRVJBU0UiLCAgICAgICAgICAgICAgICAzOCAgfSwKKyAgICB7ICJNTUNfRkFTVF9JTyIsICAgICAgICAgICAgICAzOSAgfSwKKyAgICB7ICJNTUNfR09fSVJRX1NUQVRFIiwgICAgICAgICA0MCAgfSwKKyAgICB7ICJNTUNfTE9DS19VTkxPQ0siLCAgICAgICAgICA0MiAgfSwKKyAgICB7ICJNTUNfQVBQX0NNRCIsICAgICAgICAgICAgICA1NSAgfSwKKyAgICB7ICJNTUNfR0VOX0NNRCIsICAgICAgICAgICAgICA1NiAgfSwKKyAgICB7ICJTRF9BUFBfT1BfQ09ORCIsICAgICAgICAgICA0MSAgfSwKKyAgICB7ICJTRF9BUFBfU0VORF9TQ1IiLCAgICAgICAgICA1MSAgfSwKKyAgICB7ICJVTktOT1dOIiwgICAgICAgICAgICAgICAgICAtMSAgfQorfTsKKworI2lmIDAKK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRfY29tbWFuZF9uYW1lKGludCBjb21tYW5kKQoreworICAgIHN0cnVjdCBtbWNfb3Bjb2RlKiBvcGNvZGUgPSBtbWNfb3Bjb2RlczsKKworICAgIHdoaWxlIChvcGNvZGUtPmNtZCAhPSBjb21tYW5kICYmIG9wY29kZS0+Y21kICE9IC0xKSBvcGNvZGUrKzsKKyAgICByZXR1cm4gb3Bjb2RlLT5uYW1lOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgIGdvbGRmaXNoX21tY19iZHJ2X3JlYWQoc3RydWN0IGdvbGRmaXNoX21tY19zdGF0ZSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgc2VjdG9yX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyICAgICAgICAgZHN0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zZWN0b3JzKQoreworICAgIGludCAgcmV0OworCisgICAgd2hpbGUgKG51bV9zZWN0b3JzID4gMCkgeworICAgICAgICByZXQgPSBiZHJ2X3JlYWQocy0+YnMsIHNlY3Rvcl9udW1iZXIsIHMtPmJ1ZiwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGRzdF9hZGRyZXNzLCBzLT5idWYsIDUxMik7CisgICAgICAgIGRzdF9hZGRyZXNzICAgKz0gNTEyOworICAgICAgICBudW1fc2VjdG9ycyAgIC09IDE7CisgICAgICAgIHNlY3Rvcl9udW1iZXIgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgIGdvbGRmaXNoX21tY19iZHJ2X3dyaXRlKHN0cnVjdCBnb2xkZmlzaF9tbWNfc3RhdGUgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICBzZWN0b3JfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyICAgICAgICAgZHN0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2VjdG9ycykKK3sKKyAgICBpbnQgIHJldDsKKworICAgIHdoaWxlIChudW1fc2VjdG9ycyA+IDApIHsKKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9yZWFkKGRzdF9hZGRyZXNzLCBzLT5idWYsIDUxMik7CisKKyAgICAgICAgcmV0ID0gYmRydl93cml0ZShzLT5icywgc2VjdG9yX251bWJlciwgcy0+YnVmLCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGRzdF9hZGRyZXNzICAgKz0gNTEyOworICAgICAgICBudW1fc2VjdG9ycyAgIC09IDE7CisgICAgICAgIHNlY3Rvcl9udW1iZXIgKz0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZ29sZGZpc2hfbW1jX2RvX2NvbW1hbmQoc3RydWN0IGdvbGRmaXNoX21tY19zdGF0ZSAqcywgdWludDMyX3QgY21kLCB1aW50MzJfdCBhcmcpCit7CisgICAgaW50IG5ld19zdGF0dXMgPSBNTUNfU1RBVF9FTkRfT0ZfQ01EOworICAgIGludCBvcGNvZGUgPSBjbWQgJiA2MzsKKworLy8gZnByaW50ZihzdGRlcnIsICJnb2xkZmlzaF9tbWNfZG9fY29tbWFuZCBvcGNvZGU6ICVzICgweCUwNFgpLCBhcmc6ICVkXG4iLCBnZXRfY29tbWFuZF9uYW1lKG9wY29kZSksIGNtZCwgYXJnKTsKKworICAgIHMtPnJlc3BbMF0gPSAwOworICAgIHMtPnJlc3BbMV0gPSAwOworICAgIHMtPnJlc3BbMl0gPSAwOworICAgIHMtPnJlc3BbM10gPSAwOworCisjZGVmaW5lIFNFVF9SMV9DVVJSRU5UX1NUQVRFKHMpICAgICgocyA8PCA5KSAmIDB4MDAwMDFFMDApIC8qIHN4LCBiICg0IGJpdHMpICovCisKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIE1NQ19TRU5EX0NTRDogeworICAgICAgICAgICAgaW50NjRfdCBzZWN0b3JfY291bnQgPSAwOworICAgICAgICAgICAgdWludDY0X3QgY2FwYWNpdHk7CisgICAgICAgICAgICB1aW50OF90IGV4cG9uZW50OworICAgICAgICAgICAgdWludDMyX3QgbTsKKworICAgICAgICAgICAgYmRydl9nZXRfZ2VvbWV0cnkocy0+YnMsICh1aW50NjRfdCopJnNlY3Rvcl9jb3VudCk7CisgICAgICAgICAgICBjYXBhY2l0eSA9IHNlY3Rvcl9jb3VudCAqIDUxMjsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IDIxNDc0ODM2NDhVKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgc3RvcmFnZXMgaXMgPiAyIGdpZywgdGhlbiBlbXVsYXRlIFNESEMgY2FyZAorICAgICAgICAgICAgICAgIHMtPmlzX1NESEMgPSAxOworCisgICAgICAgICAgICAgICAgLy8gQ1NEIGJpdHMgYm9ycm93ZWQgZnJvbSBhIHJlYWwgU0RIQyBjYXJkLCB3aXRoIGNhcGFjaXR5IGJpdHMgemVyb2VkIG91dAorICAgICAgICAgICAgICAgIHMtPnJlc3BbM10gPSAweDQwMEUwMDMyOworICAgICAgICAgICAgICAgIHMtPnJlc3BbMl0gPSAweDVCNTkwMDAwOworICAgICAgICAgICAgICAgIHMtPnJlc3BbMV0gPSAweDAwMDA3RjgwOworICAgICAgICAgICAgICAgIHMtPnJlc3BbMF0gPSAweDBBNDA0MERGOworCisgICAgICAgICAgICAgICAgLy8gc3R1ZmYgaW4gdGhlIHJlYWwgY2FwYWNpdHkKKyAgICAgICAgICAgICAgICAvLyBtID0gVU5TVFVGRl9CSVRTKHJlc3AsIDQ4LCAyMik7CisgICAgICAgICAgICAgICAgbSA9ICh1aW50MzJfdCkoY2FwYWNpdHkgLyAoNTEyKjEwMjQpKSAtIDE7CisgICAgICAgICAgICAgICAgLy8gbSBtdXN0IGZpdCBpbnRvIDIyIGJpdHMKKyAgICAgICAgICAgICAgICBpZiAobSAmIDB4RkZDMDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTRCBjYXJkIHRvbyBiaWcgKCUiIFBSSWQ2NCAiIGJ5dGVzKS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBTREhDIGNhcmQgc2l6ZSBpcyAxMjggZ2lnYWJ5dGVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gbG93IDE2IGJpdHMgZ28gaW4gaGlnaCBlbmQgb2YgcmVzcFsxXQorICAgICAgICAgICAgICAgIHMtPnJlc3BbMV0gfD0gKChtICYgMHgwMDAwRkZGRikgPDwgMTYpOworICAgICAgICAgICAgICAgIC8vIGhpZ2ggNiBiaXRzIGdvIGluIGxvdyBlbmQgb2YgcmVzcFsyXQorICAgICAgICAgICAgICAgIHMtPnJlc3BbMl0gfD0gKG0gPj4gMTYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBlbXVsYXRlIHN0YW5kYXJkIFNEIGNhcmQKKyAgICAgICAgICAgICAgICBzLT5pc19TREhDID0gMDsKKworICAgICAgICAgICAgICAgIC8vIENTRCBiaXRzIGJvcnJvd2VkIGZyb20gYSByZWFsIFNEIGNhcmQsIHdpdGggY2FwYWNpdHkgYml0cyB6ZXJvZWQgb3V0CisgICAgICAgICAgICAgICAgcy0+cmVzcFszXSA9IDB4MDAyNjAwMzI7CisgICAgICAgICAgICAgICAgcy0+cmVzcFsyXSA9IDB4NUY1QTgwMDA7CisgICAgICAgICAgICAgICAgcy0+cmVzcFsxXSA9IDB4M0VGODRGRkY7CisgICAgICAgICAgICAgICAgcy0+cmVzcFswXSA9IDB4OTI4MDQwQ0I7CisKKyAgICAgICAgICAgICAgICAvLyBzdHVmZiBpbiB0aGUgcmVhbCBjYXBhY2l0eQorICAgICAgICAgICAgICAgIC8vIGUgPSBVTlNUVUZGX0JJVFMocmVzcCwgNDcsIDMpOworICAgICAgICAgICAgICAgIC8vIG0gPSBVTlNUVUZGX0JJVFMocmVzcCwgNjIsIDEyKTsKKyAgICAgICAgICAgICAgICAvLyBjc2QtPmNhcGFjaXR5ID0gKDEgKyBtKSA8PCAoZSArIDIpOworICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcmV2ZXJzZSB0aGUgZm9ybXVsYSBhbmQgY2FsY3VsYXRlIGUgYW5kIG0KKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IDA7CisgICAgICAgICAgICAgICAgY2FwYWNpdHkgPSBzZWN0b3JfY291bnQgKiA1MTI7CisgICAgICAgICAgICAgICAgaWYgKGNhcGFjaXR5ID4gMjE0NzQ4MzY0OFUpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTRCBjYXJkIHRvbyBiaWcgKCUiIFBSSXU2NCAiIGJ5dGVzKS4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhpbXVtIFNEIGNhcmQgc2l6ZSBpcyAyIGdpZ2FieXRlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXBhY2l0eSA+Pj0gMTA7IC8vIGNvbnZlcnQgdG8gS2J5dGVzCisgICAgICAgICAgICAgICAgd2hpbGUgKGNhcGFjaXR5ID4gNDA5NikgeworICAgICAgICAgICAgICAgICAgICAvLyAoY2FwYWNpdHkgLSAxKSBtdXN0IGZpdCBpbnRvIDEyIGJpdHMKKyAgICAgICAgICAgICAgICAgICAgZXhwb25lbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkgPj49IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhcGFjaXR5IC09IDE7CisgICAgICAgICAgICAgICAgaWYgKGV4cG9uZW50IDwgMikgeworICAgICAgICAgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsICJTRENhcmQgdG9vIHNtYWxsLCBtdXN0IGJlIGF0IGxlYXN0IDlNQlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGV4cG9uZW50IC09IDI7CisgICAgICAgICAgICAgICAgaWYgKGV4cG9uZW50ID4gNykgeworICAgICAgICAgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsICJTRENhcmQgdG9vIGxhcmdlLlxuIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy0+cmVzcFsyXSB8PSAoKCh1aW50MzJfdCljYXBhY2l0eSA+PiAyKSAmIDB4M0ZGKTsgIC8vIGhpZ2ggMTAgYml0cyB0byBib3R0b20gb2YgcmVzcFsyXQorICAgICAgICAgICAgICAgIHMtPnJlc3BbMV0gfD0gKCgodWludDMyX3QpY2FwYWNpdHkgJiAzKSA8PCAzMCk7ICAgIC8vIGxvdyAyIGJpdHMgdG8gdG9wIG9mIHJlc3BbMV0KKyAgICAgICAgICAgICAgICBzLT5yZXNwWzFdIHw9IChleHBvbmVudCA8PCAoNDcgLSAzMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1NQ19TRU5EX0VYVF9DU0Q6CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gYXJnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTUNfQVBQX0NNRDoKKyAgICAgICAgICAgIHMtPnJlc3BbMF0gPSBTRVRfUjFfQ1VSUkVOVF9TVEFURSg0KSB8IFIxX1JFQURZX0ZPUl9EQVRBIHwgUjFfQVBQX0NNRDsgLy8yMzM2CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNEX0FQUF9PUF9DT05EOgorICAgICAgICAgICAgcy0+cmVzcFswXSA9IDB4ODBGRjgwMDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNEX0FQUF9TRU5EX1NDUjoKKyAgICAgICAgeworI2lmIDEgLyogdGhpcyBjb2RlIGlzIGFjdHVhbGx5IGVuZGlhbi1zYWZlICovCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICBzY3JbOF0gPSAiXHgwMlx4MjVceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiOworI2Vsc2UgLyogdGhpcyBvcmlnaW5hbCBjb2RlIHdhc24ndCAqLworICAgICAgICAgICAgdWludDMyX3Qgc2NyWzJdOworICAgICAgICAgICAgc2NyWzBdID0gMHgwMDAwMjUwMjsKKyAgICAgICAgICAgIHNjclsxXSA9IDB4MDAwMDAwMDA7CisjZW5kaWYKKyAgICAgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUocy0+YnVmZmVyX2FkZHJlc3MsICh1aW50OF90KilzY3IsIDgpOworCisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoNCkgfCBSMV9SRUFEWV9GT1JfREFUQSB8IFIxX0FQUF9DTUQ7IC8vMjMzNgorICAgICAgICAgICAgbmV3X3N0YXR1cyB8PSBNTUNfU1RBVF9FTkRfT0ZfREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTU1DX1NFVF9SRUxBVElWRV9BRERSOgorICAgICAgICAgICAgcy0+cmVzcFswXSA9IC01MTg1MTk1MjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1NQ19BTExfU0VORF9DSUQ6CisgICAgICAgICAgICBzLT5yZXNwWzNdID0gNTU3ODg2Mjc7CisgICAgICAgICAgICBzLT5yZXNwWzJdID0gMTQyOTIyMTk1OTsKKyAgICAgICAgICAgIHMtPnJlc3BbMV0gPSAtMjE0NzQ3OTY5MjsKKyAgICAgICAgICAgIHMtPnJlc3BbMF0gPSAtNDM2MTc5ODgzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTUNfU0VMRUNUX0NBUkQ6CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoMykgfCBSMV9SRUFEWV9GT1JfREFUQTsgLy8gMTc5MgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIGNhc2UgTU1DX1NXSVRDSDoKKyAgICAgICAgICAgIGlmIChhcmcgPT0gMHgwMEZGRkZGMSB8fCBhcmcgPT0gMHg4MEZGRkZGMSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgIGJ1ZmYwWzY0XTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYnVmZjAsIDAsIHNpemVvZiBidWZmMCk7CisgICAgICAgICAgICAgICAgYnVmZjBbMTNdID0gMjsKKyAgICAgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKHMtPmJ1ZmZlcl9hZGRyZXNzLCBidWZmMCwgc2l6ZW9mIGJ1ZmYwKTsKKyAgICAgICAgICAgICAgICBuZXdfc3RhdHVzIHw9IE1NQ19TVEFUX0VORF9PRl9EQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cmVzcFswXSA9IFNFVF9SMV9DVVJSRU5UX1NUQVRFKDQpIHwgUjFfUkVBRFlfRk9SX0RBVEEgfCBSMV9BUFBfQ01EOyAvLzIzMzYKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICBjYXNlIE1NQ19TRVRfQkxPQ0tMRU46CisgICAgICAgICAgICBzLT5ibG9ja19sZW5ndGggPSBhcmc7CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoNCkgfCBSMV9SRUFEWV9GT1JfREFUQTsgLy8gMjMwNAorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTUNfUkVBRF9TSU5HTEVfQkxPQ0s6CisgICAgICAgICAgICBzLT5ibG9ja19jb3VudCA9IDE7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgY2FzZSBNTUNfUkVBRF9NVUxUSVBMRV9CTE9DSzogeworICAgICAgICAgICAgaWYgKHMtPmlzX1NESEMpIHsKKyAgICAgICAgICAgICAgICAvLyBhcmcgaXMgYmxvY2sgb2Zmc2V0CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGFyZyBpcyBieXRlIG9mZnNldAorICAgICAgICAgICAgICAgIGlmIChhcmcgJiA1MTEpIGZwcmludGYoc3RkZXJyLCAib2Zmc2V0ICVkIGlzIG5vdCBtdWx0aXBsZSBvZiA1MTIgd2hlbiByZWFkaW5nXG4iLCBhcmcpOworICAgICAgICAgICAgICAgIGFyZyAvPSBzLT5ibG9ja19sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb2xkZmlzaF9tbWNfYmRydl9yZWFkKHMsIGFyZywgcy0+YnVmZmVyX2FkZHJlc3MsIHMtPmJsb2NrX2NvdW50KTsKKyAgICAgICAgICAgIG5ld19zdGF0dXMgfD0gTU1DX1NUQVRfRU5EX09GX0RBVEE7CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoNCkgfCBSMV9SRUFEWV9GT1JfREFUQTsgLy8gMjMwNAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1NQ19XUklURV9CTE9DSzoKKyAgICAgICAgICAgIHMtPmJsb2NrX2NvdW50ID0gMTsKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIE1NQ19XUklURV9NVUxUSVBMRV9CTE9DSzogeworICAgICAgICAgICAgaWYgKHMtPmlzX1NESEMpIHsKKyAgICAgICAgICAgICAgICAvLyBhcmcgaXMgYmxvY2sgb2Zmc2V0CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGFyZyBpcyBieXRlIG9mZnNldAorICAgICAgICAgICAgICAgIGlmIChhcmcgJiA1MTEpIGZwcmludGYoc3RkZXJyLCAib2Zmc2V0ICVkIGlzIG5vdCBtdWx0aXBsZSBvZiA1MTIgd2hlbiB3cml0aW5nXG4iLCBhcmcpOworICAgICAgICAgICAgICAgIGFyZyAvPSBzLT5ibG9ja19sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhcmcgaXMgYnl0ZSBvZmZzZXQKKyAgICAgICAgICAgIGdvbGRmaXNoX21tY19iZHJ2X3dyaXRlKHMsIGFyZywgcy0+YnVmZmVyX2FkZHJlc3MsIHMtPmJsb2NrX2NvdW50KTsKKy8vICAgICAgICAgICAgYmRydl9mbHVzaChzLT5icyk7CisgICAgICAgICAgICBuZXdfc3RhdHVzIHw9IE1NQ19TVEFUX0VORF9PRl9EQVRBOworICAgICAgICAgICAgcy0+cmVzcFswXSA9IFNFVF9SMV9DVVJSRU5UX1NUQVRFKDQpIHwgUjFfUkVBRFlfRk9SX0RBVEE7IC8vIDIzMDQKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNTUNfU1RPUF9UUkFOU01JU1NJT046CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoNSkgfCBSMV9SRUFEWV9GT1JfREFUQTsgLy8gMjgxNgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTUNfU0VORF9TVEFUVVM6CisgICAgICAgICAgICBzLT5yZXNwWzBdID0gU0VUX1IxX0NVUlJFTlRfU1RBVEUoNCkgfCBSMV9SRUFEWV9GT1JfREFUQTsgLy8gMjMwNAorICAgICAgICAgICAgYnJlYWs7CisgICAgIH0KKworICAgIHMtPmludF9zdGF0dXMgfD0gbmV3X3N0YXR1czsKKworICAgIGlmICgocy0+aW50X3N0YXR1cyAmIHMtPmludF9lbmFibGUpKSB7CisgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIChzLT5pbnRfc3RhdHVzICYgcy0+aW50X2VuYWJsZSkpOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX21tY19yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICB1aW50MzJfdCByZXQ7CisgICAgc3RydWN0IGdvbGRmaXNoX21tY19zdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHN3aXRjaChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSBNTUNfSU5UX1NUQVRVUzoKKyAgICAgICAgICAgIC8vIHJldHVybiBjdXJyZW50IGJ1ZmZlciBzdGF0dXMgZmxhZ3MKKyAgICAgICAgICAgIHJldHVybiBzLT5pbnRfc3RhdHVzICYgcy0+aW50X2VuYWJsZTsKKyAgICAgICAgY2FzZSBNTUNfUkVTUF8wOgorICAgICAgICAgICAgcmV0dXJuIHMtPnJlc3BbMF07CisgICAgICAgIGNhc2UgTU1DX1JFU1BfMToKKyAgICAgICAgICAgIHJldHVybiBzLT5yZXNwWzFdOworICAgICAgICBjYXNlIE1NQ19SRVNQXzI6CisgICAgICAgICAgICByZXR1cm4gcy0+cmVzcFsyXTsKKyAgICAgICAgY2FzZSBNTUNfUkVTUF8zOgorICAgICAgICAgICAgcmV0dXJuIHMtPnJlc3BbM107CisgICAgICAgIGNhc2UgTU1DX1NUQVRFOiB7CisgICAgICAgICAgICByZXQgPSBNTUNfU1RBVEVfSU5TRVJURUQ7CisgICAgICAgICAgICBpZiAoYmRydl9pc19yZWFkX29ubHkocy0+YnMpKSB7CisgICAgICAgICAgICAgICAgcmV0IHw9IE1NQ19TVEFURV9SRUFEX09OTFk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX21tY19yZWFkOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ29sZGZpc2hfbW1jX3dyaXRlKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCwgdWludDMyX3QgdmFsKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9tbWNfc3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IHN0YXR1cywgb2xkX3N0YXR1czsKKworICAgIHN3aXRjaChvZmZzZXQpIHsKKworICAgICAgICBjYXNlIE1NQ19JTlRfU1RBVFVTOgorICAgICAgICAgICAgc3RhdHVzID0gcy0+aW50X3N0YXR1czsKKyAgICAgICAgICAgIG9sZF9zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgJj0gfnZhbDsKKyAgICAgICAgICAgIHMtPmludF9zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBpZihzdGF0dXMgIT0gb2xkX3N0YXR1cykgeworICAgICAgICAgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1NQ19JTlRfRU5BQkxFOgorICAgICAgICAgICAgLyogZW5hYmxlIGJ1ZmZlciBpbnRlcnJ1cHRzICovCisgICAgICAgICAgICBzLT5pbnRfZW5hYmxlID0gdmFsOworICAgICAgICAgICAgcy0+aW50X3N0YXR1cyA9IDA7CisgICAgICAgICAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAocy0+aW50X3N0YXR1cyAmIHMtPmludF9lbmFibGUpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NQ19TRVRfQlVGRkVSOgorICAgICAgICAgICAgLyogc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciAxICovCisgICAgICAgICAgICB1aW50NjRfc2V0X2xvdygmcy0+YnVmZmVyX2FkZHJlc3MsIHZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTUNfU0VUX0JVRkZFUl9ISUdIOgorICAgICAgICAgICAgLyogc2F2ZSBwb2ludGVyIHRvIGJ1ZmZlciAxICovCisgICAgICAgICAgICB1aW50NjRfc2V0X2hpZ2goJnMtPmJ1ZmZlcl9hZGRyZXNzLCB2YWwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1DX0NNRDoKKyAgICAgICAgICAgIGdvbGRmaXNoX21tY19kb19jb21tYW5kKHMsIHZhbCwgcy0+YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NQ19BUkc6CisgICAgICAgICAgICBzLT5hcmcgPSB2YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTUNfQkxPQ0tfTEVOR1RIOgorICAgICAgICAgICAgcy0+YmxvY2tfbGVuZ3RoID0gdmFsICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NQ19CTE9DS19DT1VOVDoKKyAgICAgICAgICAgIHMtPmJsb2NrX2NvdW50ID0gdmFsICsgMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX21tY193cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQorfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmdvbGRmaXNoX21tY19yZWFkZm5bXSA9IHsKKyAgIGdvbGRmaXNoX21tY19yZWFkLAorICAgZ29sZGZpc2hfbW1jX3JlYWQsCisgICBnb2xkZmlzaF9tbWNfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfbW1jX3dyaXRlZm5bXSA9IHsKKyAgIGdvbGRmaXNoX21tY193cml0ZSwKKyAgIGdvbGRmaXNoX21tY193cml0ZSwKKyAgIGdvbGRmaXNoX21tY193cml0ZQorfTsKKwordm9pZCBnb2xkZmlzaF9tbWNfaW5pdCh1aW50MzJfdCBiYXNlLCBpbnQgaWQsIEJsb2NrRHJpdmVyU3RhdGUqIGJzKQoreworICAgIHN0cnVjdCBnb2xkZmlzaF9tbWNfc3RhdGUgKnM7CisKKyAgICBzID0gKHN0cnVjdCBnb2xkZmlzaF9tbWNfc3RhdGUgKilnX21hbGxvYzAoc2l6ZW9mKCpzKSk7CisgICAgcy0+ZGV2Lm5hbWUgPSAiZ29sZGZpc2hfbW1jIjsKKyAgICBzLT5kZXYuaWQgPSBpZDsKKyAgICBzLT5kZXYuYmFzZSA9IGJhc2U7CisgICAgcy0+ZGV2LnNpemUgPSAweDEwMDA7CisgICAgcy0+ZGV2LmlycV9jb3VudCA9IDE7CisgICAgcy0+YnMgPSBiczsKKyAgICBzLT5idWYgPSBxZW11X21lbWFsaWduKDUxMiw1MTIpOworCisgICAgZ29sZGZpc2hfZGV2aWNlX2FkZCgmcy0+ZGV2LCBnb2xkZmlzaF9tbWNfcmVhZGZuLCBnb2xkZmlzaF9tbWNfd3JpdGVmbiwgcyk7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX21tYyIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX01NQ19TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX21tY19zYXZlLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9tbWNfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9uYW5kLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvbmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmRkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvbmFuZC5jCkBAIC0wLDAgKzEsODczIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAibWlncmF0aW9uL3FlbXUtZmlsZS5oIgorI2luY2x1ZGUgIm5hbmRfcmVnLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL25hbmQuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL3ZtZW0uaCIKKyNpbmNsdWRlICJody9ody5oIgorCisjaWZkZWYgQ09ORklHX05BTkRfTElNSVRTCisjaW5jbHVkZSAiYW5kcm9pZC9lbXVsYXRpb24vbmFuZF9saW1pdHMuaCIKKyNlbmRpZgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYXNzZXJ0LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90ZW1wZmlsZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvcWVtdS1kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvYW5kcm9pZC5oIgorCisjZGVmaW5lICBERUJVRyAgMQorI2lmIERFQlVHCisjICBkZWZpbmUgIEQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKGluaXQsX19WQV9BUkdTX18pCisjICBkZWZpbmUgIERfQUNUSVZFICBWRVJCT1NFX0NIRUNLKGluaXQpCisjICBkZWZpbmUgIFQoLi4uKSAgICBWRVJCT1NFX1BSSU5UKG5hbmRfbGltaXRzLF9fVkFfQVJHU19fKQorIyAgZGVmaW5lICBUX0FDVElWRSAgVkVSQk9TRV9DSEVDSyhuYW5kX2xpbWl0cykKKyNlbHNlCisjICBkZWZpbmUgIEQoLi4uKSAgICAoKHZvaWQpMCkKKyMgIGRlZmluZSAgRF9BQ1RJVkUgIDAKKyMgIGRlZmluZSAgVCguLi4pICAgICgodm9pZCkwKQorIyAgZGVmaW5lICBUX0FDVElWRSAgMAorI2VuZGlmCisKKy8qIGxzZWVrIHVzZXMgNjQtYml0IG9mZnNldHMgb24gRGFyd2luLiAqLworLyogcHJlZmVyIGxzZWVrNjQgb24gTGludXggICAgICAgICAgICAgICovCisjaWZkZWYgX19BUFBMRV9fCisjICBkZWZpbmUgIGxsc2VlayAgbHNlZWsKKyNlbGlmIGRlZmluZWQoX19saW51eF9fKQorIyAgZGVmaW5lICBsbHNlZWsgIGxzZWVrNjQKKyNlbmRpZgorCisjZGVmaW5lICBYTE9HICB4bG9nCisKK0FBU1NFUlRfU1RBVElDKHNpemVvZihvZmZfdCkgPj0gOFUpCisKK3N0YXRpYyB2b2lkCit4bG9nKCBjb25zdCBjaGFyKiAgZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgIGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5BTkQ6ICIpOworICAgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKy8qIEluZm9ybWF0aW9uIG9uIGEgc2luZ2xlIGRldmljZS9uYW5kIGltYWdlIHVzZWQgYnkgdGhlIGVtdWxhdG9yCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyKiAgICAgIGRldm5hbWU7ICAgICAgLyogbmFtZSBmb3IgdGhpcyBkZXZpY2UgKG5vdCBudWxsLXRlcm1pbmF0ZWQsIHVzZSBsZW4gYmVsb3cpICovCisgICAgc2l6ZV90ICAgICBkZXZuYW1lX2xlbjsKKyAgICB1aW50OF90KiAgIGRhdGE7ICAgICAgICAgLyogYnVmZmVyIGZvciByZWFkL3dyaXRlIGFjdGlvbnMgdG8gdW5kZXJseWluZyBpbWFnZSAqLworICAgIGludCAgICAgICAgZmQ7CisgICAgdWludDMyX3QgICBmbGFnczsKKyAgICB1aW50MzJfdCAgIHBhZ2Vfc2l6ZTsKKyAgICB1aW50MzJfdCAgIGV4dHJhX3NpemU7CisgICAgdWludDMyX3QgICBlcmFzZV9zaXplOyAgIC8qIHNpemUgb2YgdGhlIGRhdGEgYnVmZmVyIG1lbnRpb25lZCBhYm92ZSAqLworICAgIHVpbnQ2NF90ICAgbWF4X3NpemU7ICAgICAvKiBDYXBhY2l0eSBsaW1pdCBmb3IgdGhlIGltYWdlLiBUaGUgYWN0dWFsIHVuZGVybHlpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsZSBtYXkgYmUgc21hbGxlci4gKi8KK30gbmFuZF9kZXY7CisKKyNpZmRlZiBDT05GSUdfTkFORF9MSU1JVFMKKworc3RhdGljIEFuZHJvaWROYW5kTGltaXQgbmFuZF9yZWFkX2xpbWl0ID0gQU5EUk9JRF9OQU5EX0xJTUlUX0lOSVQ7CitzdGF0aWMgQW5kcm9pZE5hbmRMaW1pdCBuYW5kX3dyaXRlX2xpbWl0ID0gQU5EUk9JRF9OQU5EX0xJTUlUX0lOSVQ7CisKKyNkZWZpbmUgTkFORF9VUERBVEVfUkVBRF9USFJFU0hPTEQobGVuKSBcCisgIGFuZHJvaWRfbmFuZF9saW1pdF91cGRhdGUoJm5hbmRfd3JpdGVfbGltaXQsICh1aW50MzJfdCkobGVuKSkKKworI2RlZmluZSBOQU5EX1VQREFURV9XUklURV9USFJFU0hPTEQobGVuKSBcCisgIGFuZHJvaWRfbmFuZF9saW1pdF91cGRhdGUoJm5hbmRfcmVhZF9saW1pdCwgKHVpbnQzMl90KShsZW4pKQorCisjZWxzZSAvKiAhTkFORF9USFJFU0hPTEQgKi8KKworI2RlZmluZSAgTkFORF9VUERBVEVfUkVBRF9USFJFU0hPTEQobGVuKSAgXAorICAgIGRvIHt9IHdoaWxlICgwKQorCisjZGVmaW5lICBOQU5EX1VQREFURV9XUklURV9USFJFU0hPTEQobGVuKSAgXAorICAgIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYgLyogIU5BTkRfVEhSRVNIT0xEICovCisKK3N0YXRpYyBuYW5kX2RldiAqbmFuZF9kZXZzID0gTlVMTDsKK3N0YXRpYyB1aW50MzJfdCBuYW5kX2Rldl9jb3VudCA9IDA7CisKKy8qIFRoZSBjb250cm9sbGVyIGlzIHRoZSBzaW5nbGUgYWNjZXNzIHBvaW50IGZvciBhbGwgTkFORCBpbWFnZXMgY3VycmVudGx5CisgKiBhdHRhY2hlZCB0byB0aGUgc3lzdGVtLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgYmFzZTsKKworICAgIC8vIHJlZ2lzdGVyIHN0YXRlCisgICAgdWludDMyX3QgZGV2OyAgICAgICAgICAgIC8qIG9mZnNldCBpbiBuYW5kX2RldnMgZm9yIHRoZSBkZXZpY2UgdGhhdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjdXJyZW50bHkgYmVpbmcgYWNjZXNzZWQgKi8KKyAgICB1aW50MzJfdCBhZGRyX2xvdzsKKyAgICB1aW50MzJfdCBhZGRyX2hpZ2g7CisgICAgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsKKyAgICB1aW50NjRfdCBkYXRhOworICAgIHVpbnQzMl90IGJhdGNoX2FkZHJfbG93OworICAgIHVpbnQzMl90IGJhdGNoX2FkZHJfaGlnaDsKKyAgICB1aW50MzJfdCByZXN1bHQ7Cit9IG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGU7CisKKy8qIHVwZGF0ZSB0aGlzIGV2ZXJ5dGltZSB5b3UgY2hhbmdlIHRoZSBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlIHN0cnVjdHVyZQorICogMTogaW5pdGlhbCB2ZXJzaW9uLCBzYXZpbmcgb25seSBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlIGZpZWxkcworICogMjogc2F2aW5nIGFjdHVhbCBkaXNrIGNvbnRlbnRzIGFzIHdlbGwKKyAqIDM6IHVzZSB0aGUgY29ycmVjdCBkYXRhIGxlbmd0aCBhbmQgdHJ1bmNhdGUgdG8gYXZvaWQgcGFkZGluZy4KKyAqLworI2RlZmluZSAgTkFORF9ERVZfU1RBVEVfU0FWRV9WRVJTSU9OICA1CisjZGVmaW5lICBOQU5EX0RFVl9TVEFURV9TQVZFX1ZFUlNJT05fTEVHQUNZICA0CisKKyNkZWZpbmUgIFFGSUVMRF9TVFJVQ1QgIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGUKK1FGSUVMRF9CRUdJTihuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlX2ZpZWxkcykKKyAgICBRRklFTERfSU5UMzIoZGV2KSwKKyAgICBRRklFTERfSU5UMzIoYWRkcl9sb3cpLAorICAgIFFGSUVMRF9JTlQzMihhZGRyX2hpZ2gpLAorICAgIFFGSUVMRF9JTlQzMih0cmFuc2Zlcl9zaXplKSwKKyAgICBRRklFTERfSU5UNjQoZGF0YSksCisgICAgUUZJRUxEX0lOVDMyKGJhdGNoX2FkZHJfbG93KSwKKyAgICBRRklFTERfSU5UMzIoYmF0Y2hfYWRkcl9oaWdoKSwKKyAgICBRRklFTERfSU5UMzIocmVzdWx0KSwKK1FGSUVMRF9FTkQKKworLy8gTGVnYWN5IGVuY29kaW5nIHN1cHBvcnQsIHNwbGl0IHRoZSBzdHJ1Y3R1cmUgaW4gdHdvIGhhbHZlcywgd2l0aAorLy8gYSAzMi1iaXQgfGRhdGF8IGZpZWxkIGluIHRoZSBtaWRkbGUgdG8gYmUgbG9hZGVkIGV4cGxpY3RseS4KK1FGSUVMRF9CRUdJTihuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlX2xlZ2FjeV8xX2ZpZWxkcykKKyAgICBRRklFTERfSU5UMzIoZGV2KSwKKyAgICBRRklFTERfSU5UMzIoYWRkcl9sb3cpLAorICAgIFFGSUVMRF9JTlQzMihhZGRyX2hpZ2gpLAorICAgIFFGSUVMRF9JTlQzMih0cmFuc2Zlcl9zaXplKSwKK1FGSUVMRF9FTkQKKworUUZJRUxEX0JFR0lOKG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfbGVnYWN5XzJfZmllbGRzKQorICAgIFFGSUVMRF9JTlQzMihiYXRjaF9hZGRyX2xvdyksCisgICAgUUZJRUxEX0lOVDMyKGJhdGNoX2FkZHJfaGlnaCksCisgICAgUUZJRUxEX0lOVDMyKHJlc3VsdCksCitRRklFTERfRU5ECisKKy8qIEVJTlRSLXByb29mIHJlYWQgLSBkdWUgdG8gU0lHQUxSTSBpbiB1c2UgZWxzZXdoZXJlICovCitzdGF0aWMgaW50ICBkb19yZWFkKGludCAgZmQsIHZvaWQqICBidWYsIHNpemVfdCAgc2l6ZSkKK3sKKyAgICBpbnQgIHJldDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisgICAgfSB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBFSU5UUi1wcm9vZiB3cml0ZSAtIGR1ZSB0byBTSUdBTFJNIGluIHVzZSBlbHNld2hlcmUgKi8KK3N0YXRpYyBpbnQgIGRvX3dyaXRlKGludCAgZmQsIGNvbnN0IHZvaWQqICBidWYsIHNpemVfdCAgc2l6ZSkKK3sKKyAgICBpbnQgIHJldDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IHdyaXRlKGZkLCBidWYsIHNpemUpOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogRUlOVFItcHJvb2YgbHNlZWsgLSBkdWUgdG8gU0lHQUxSTSBpbiB1c2UgZWxzZXdoZXJlICovCitzdGF0aWMgb2ZmX3QgZG9fbHNlZWsoaW50ICBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQoreworICAgIG9mZl90IHJldDsKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGxzZWVrKGZkLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgfSB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIEVJTlRSLXByb29mIGZ0cnVuY2F0ZSAtIGR1ZSB0byBTSUdBTFJNIGluIHVzZSBlbHNld2hlcmUgKi8KK3N0YXRpYyBpbnQgIGRvX2Z0cnVuY2F0ZShpbnQgIGZkLCBzaXplX3QgIHNpemUpCit7CisgICAgaW50ICByZXQ7CisgICAgZG8geworICAgICAgICByZXQgPSBmdHJ1bmNhdGUoZmQsIHNpemUpOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBOQU5EX0RFVl9TQVZFX0RJU0tfQlVGX1NJWkUgMjA0OAorCisKKy8qKgorICogQ29waWVzIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIGEgZGlzayBpbWFnZSBpbnRvIHRoZSBzbmFwc2hvdCBmaWxlLgorICoKKyAqIFRPRE8gb3B0aW1pemUgdGhpcyB1c2luZyBzb21lIGtpbmQgb2YgY29weS1vbi13cml0ZSBtZWNoYW5pc20gZm9yCisgKiAgICAgIHVuY2hhbmdlZCBkaXNrIHNlY3Rpb25zLgorICovCitzdGF0aWMgdm9pZCAgbmFuZF9kZXZfc2F2ZV9kaXNrX3N0YXRlKFFFTVVGaWxlICpmLCBuYW5kX2RldiAqZGV2KQoreworICAgIGludCBidWZfc2l6ZSA9IE5BTkRfREVWX1NBVkVfRElTS19CVUZfU0laRTsKKyAgICB1aW50OF90IGJ1ZmZlcltOQU5EX0RFVl9TQVZFX0RJU0tfQlVGX1NJWkVdID0gezB9OworICAgIG9mZl90IGxzZWVrX3JldDsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ2NF90IHRvdGFsX2NvcGllZCA9IDA7CisKKyAgICAvKiBTaXplIG9mIGZpbGUgdG8gcmVzdG9yZSwgaGVuY2Ugc2l6ZSBvZiBkYXRhIGJsb2NrIGZvbGxvd2luZy4KKyAgICAgKiBUT0RPIFdvcmsgb3V0IHdoZXRoZXIgdG8gdXNlIGxzZWVrNjQgaGVyZS4gKi8KKworICAgIGxzZWVrX3JldCA9IGRvX2xzZWVrKGRldi0+ZmQsIDAsIFNFRUtfRU5EKTsKKyAgICBpZiAobHNlZWtfcmV0ID09IC0xKSB7CisgICAgICBxZW11X2ZpbGVfc2V0X2Vycm9yKGYsIC1lcnJubyk7CisgICAgICBYTE9HKCIlcyBFT0Ygc2VlayBmYWlsZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSBsc2Vla19yZXQ7CisgICAgcWVtdV9wdXRfYmU2NChmLCB0b3RhbF9zaXplKTsKKworICAgIC8qIGNvcHkgYWxsIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHRvIHRoZSBzdG9yZWQgaW1hZ2UgKi8KKyAgICBsc2Vla19yZXQgPSBkb19sc2VlayhkZXYtPmZkLCAwLCBTRUVLX1NFVCk7CisgICAgaWYgKGxzZWVrX3JldCA9PSAtMSkgeworICAgICAgICBxZW11X2ZpbGVfc2V0X2Vycm9yKGYsIC1lcnJubyk7CisgICAgICAgIFhMT0coIiVzIHNlZWsgZmFpbGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgcmV0ID0gZG9fcmVhZChkZXYtPmZkLCBidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHFlbXVfZmlsZV9zZXRfZXJyb3IoZiwgLWVycm5vKTsKKyAgICAgICAgICAgIFhMT0coIiVzIHJlYWQgZmFpbGVkOiAlc1xuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHFlbXVfcHV0X2J1ZmZlcihmLCBidWZmZXIsIHJldCk7CisKKyAgICAgICAgdG90YWxfY29waWVkICs9IHJldDsKKyAgICB9CisgICAgd2hpbGUgKHJldCA9PSBidWZfc2l6ZSAmJiB0b3RhbF9jb3BpZWQgPCBkZXYtPm1heF9zaXplKTsKKworICAgIC8qIFRPRE8gTWF5YmUgY2hlY2sgdGhhdCB3ZSd2ZSB3cml0dGVuIHRvdGFsX3NpemUgYnl0ZXMgKi8KK30KKworCisvKioKKyAqIFNhdmVzIHRoZSBzdGF0ZSBvZiBhbGwgZGlza3MgbWFuYWdlZCBieSB0aGlzIGNvbnRyb2xsZXIgdG8gYSBzbmFwc2hvdCBmaWxlLgorICovCitzdGF0aWMgdm9pZCBuYW5kX2Rldl9zYXZlX2Rpc2tzKFFFTVVGaWxlICpmKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYW5kX2Rldl9jb3VudDsgaSsrKSB7CisgICAgICAgIG5hbmRfZGV2X3NhdmVfZGlza19zdGF0ZShmLCBuYW5kX2RldnMgKyBpKTsKKyAgICB9Cit9CisKKy8qKgorICogT3ZlcndyaXRlcyB0aGUgY29udGVudHMgb2YgdGhlIGRpc2sgaW1hZ2UgbWFuYWdlZCBieSB0aGlzIGRldmljZSB3aXRoIHRoZQorICogY29udGVudHMgYXMgdGhleSB3ZXJlIGF0IHRoZSBwb2ludCB0aGUgc25hcHNob3Qgd2FzIG1hZGUuCisgKi8KK3N0YXRpYyBpbnQgIG5hbmRfZGV2X2xvYWRfZGlza19zdGF0ZShRRU1VRmlsZSAqZiwgbmFuZF9kZXYgKmRldikKK3sKKyAgICBpbnQgYnVmX3NpemUgPSBOQU5EX0RFVl9TQVZFX0RJU0tfQlVGX1NJWkU7CisgICAgdWludDhfdCBidWZmZXJbTkFORF9ERVZfU0FWRV9ESVNLX0JVRl9TSVpFXSA9IHswfTsKKyAgICBvZmZfdCBsc2Vla19yZXQ7CisgICAgaW50IHJldDsKKworICAgIC8qIEZpbGUgc2l6ZSBmb3IgcmVzdG9yZSBhbmQgdHJ1bmNhdGUgKi8KKyAgICB1aW50NjRfdCB0b3RhbF9zaXplID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICBpZiAodG90YWxfc2l6ZSA+IGRldi0+bWF4X3NpemUpIHsKKyAgICAgICAgWExPRygiJXMsIHJlc3RvcmUgZmFpbGVkOiBzaXplIHJlcXVpcmVkICglbGxkKSBleGNlZWRzIGRldmljZSBsaW1pdCAoJWxsZClcbiIsCisgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0b3RhbF9zaXplLCBkZXYtPm1heF9zaXplKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorCisgICAgLyogb3ZlcndyaXRlIGRpc2sgY29udGVudHMgd2l0aCBzbmFwc2hvdCBjb250ZW50cyAqLworICAgIHVpbnQ2NF90IG5leHRfb2Zmc2V0ID0gMDsKKyAgICBsc2Vla19yZXQgPSBkb19sc2VlayhkZXYtPmZkLCAwLCBTRUVLX1NFVCk7CisgICAgaWYgKGxzZWVrX3JldCA9PSAtMSkgeworICAgICAgICBYTE9HKCIlcyBzZWVrIGZhaWxlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC1FSU87CisgICAgfQorICAgIHdoaWxlIChuZXh0X29mZnNldCA8IHRvdGFsX3NpemUpIHsKKyAgICAgICAgLyogc25hcHNob3QgYnVmZmVyIG1heSBub3QgYmUgYW4gZXhhY3QgbXVsdGlwbGUgb2YgYnVmX3NpemUKKyAgICAgICAgICogaWYgbmVjZXNzYXJ5LCBhZGp1c3QgYnVmZmVyIHNpemUgZm9yIGxhc3QgY29weSBvcGVyYXRpb24gKi8KKyAgICAgICAgaWYgKHRvdGFsX3NpemUgLSBuZXh0X29mZnNldCA8IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBidWZfc2l6ZSA9IHRvdGFsX3NpemUgLSBuZXh0X29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHFlbXVfZ2V0X2J1ZmZlcihmLCBidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBidWZfc2l6ZSkgeworICAgICAgICAgICAgWExPRygiJXMgcmVhZCBmYWlsZWQ6IGV4cGVjdGVkICVkIGJ5dGVzIGJ1dCBnb3QgJWRcbiIsCisgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmX3NpemUsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBkb193cml0ZShkZXYtPmZkLCBidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKHJldCAhPSBidWZfc2l6ZSkgeworICAgICAgICAgICAgWExPRygiJXMsIHdyaXRlIGZhaWxlZDogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisKKyAgICAgICAgbmV4dF9vZmZzZXQgKz0gYnVmX3NpemU7CisgICAgfQorCisgICAgcmV0ID0gZG9fZnRydW5jYXRlKGRldi0+ZmQsIHRvdGFsX3NpemUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIFhMT0coIiVzIGZ0cnVuY2F0ZSBmYWlsZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtRUlPOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhbGwgZGlza3MgbWFuYWdlZCBieSB0aGlzIGRyaXZlciBmcm9tIGEgc25hcHNob3QgZmlsZS4KKyAqLworc3RhdGljIGludCBuYW5kX2Rldl9sb2FkX2Rpc2tzKFFFTVVGaWxlICpmKQoreworICAgIGludCBpLCByZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IG5hbmRfZGV2X2NvdW50OyBpKyspIHsKKyAgICAgICAgcmV0ID0gbmFuZF9kZXZfbG9hZF9kaXNrX3N0YXRlKGYsIG5hbmRfZGV2cyArIGkpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsgLy8gYWJvcnQgb24gZXJyb3IKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfc2F2ZShRRU1VRmlsZSAqZiwgdm9pZCAgKm9wYXF1ZSkKK3sKKyAgICBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlKiBzID0gb3BhcXVlOworCisgICAgcWVtdV9wdXRfc3RydWN0KGYsIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfZmllbGRzLCBzKTsKKworICAgIC8qIFRoZSBndWVzdCB3aWxsIGNvbnRpbnVlIHdyaXRpbmcgdG8gdGhlIGRpc2sgaW1hZ2UgYWZ0ZXIgdGhlIHN0YXRlIGhhcworICAgICAqIGJlZW4gc2F2ZWQuIFRvIGd1YXJhbnRlZSB0aGF0IHRoZSBzdGF0ZSBpcyBpZGVudGljYWwgYWZ0ZXIgcmVzdW1lLCBzYXZlCisgICAgICogYSBjb3B5IG9mIHRoZSBjdXJyZW50IGRpc2sgc3RhdGUgaW4gdGhlIHNuYXBzaG90LgorICAgICAqLworICAgIG5hbmRfZGV2X3NhdmVfZGlza3MoZik7Cit9CisKK3N0YXRpYyBpbnQgICBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgICpvcGFxdWUsIGludCAgdmVyc2lvbl9pZCkKK3sKKyAgICBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlKiAgcyA9IG9wYXF1ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHZlcnNpb25faWQgPT0gTkFORF9ERVZfU1RBVEVfU0FWRV9WRVJTSU9OKSB7CisgICAgICAgIHJldCA9IHFlbXVfZ2V0X3N0cnVjdChmLCBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlX2ZpZWxkcywgcyk7CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uX2lkID09IE5BTkRfREVWX1NUQVRFX1NBVkVfVkVSU0lPTl9MRUdBQ1kpIHsKKyAgICAgICAgcmV0ID0gcWVtdV9nZXRfc3RydWN0KGYsIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfbGVnYWN5XzFfZmllbGRzLCBzKTsKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgIC8vIFJlYWQgMzItYml0IGRhdGEgZmllbGQgZGlyZWN0bHkuCisgICAgICAgICAgICBzLT5kYXRhID0gKHVpbnQ2NF90KXFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICAgICByZXQgPSBxZW11X2dldF9zdHJ1Y3QoCisgICAgICAgICAgICAgICAgICAgIGYsIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfbGVnYWN5XzJfZmllbGRzLCBzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEludmFsaWQgZW5jb2RpbmcuCisgICAgICAgIHJldCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0ID8gcmV0IDogbmFuZF9kZXZfbG9hZF9kaXNrcyhmKTsKK30KKworc3RhdGljIHVpbnQzMl90IG5hbmRfZGV2X3JlYWRfZmlsZShuYW5kX2RldiAqZGV2LCB0YXJnZXRfdWxvbmcgZGF0YSwgdWludDY0X3QgYWRkciwgdWludDMyX3QgdG90YWxfbGVuKQoreworICAgIHVpbnQzMl90IGxlbiA9IHRvdGFsX2xlbjsKKyAgICBzaXplX3QgcmVhZF9sZW4gPSBkZXYtPmVyYXNlX3NpemU7CisgICAgaW50IGVvZiA9IDA7CisKKyAgICBOQU5EX1VQREFURV9SRUFEX1RIUkVTSE9MRCh0b3RhbF9sZW4pOworCisgICAgZG9fbHNlZWsoZGV2LT5mZCwgYWRkciwgU0VFS19TRVQpOworICAgIHdoaWxlKGxlbiA+IDApIHsKKyAgICAgICAgaWYocmVhZF9sZW4gPCBkZXYtPmVyYXNlX3NpemUpIHsKKyAgICAgICAgICAgIG1lbXNldChkZXYtPmRhdGEsIDB4ZmYsIGRldi0+ZXJhc2Vfc2l6ZSk7CisgICAgICAgICAgICByZWFkX2xlbiA9IGRldi0+ZXJhc2Vfc2l6ZTsKKyAgICAgICAgICAgIGVvZiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYobGVuIDwgcmVhZF9sZW4pCisgICAgICAgICAgICByZWFkX2xlbiA9IGxlbjsKKyAgICAgICAgaWYoIWVvZikgeworICAgICAgICAgICAgcmVhZF9sZW4gPSBkb19yZWFkKGRldi0+ZmQsIGRldi0+ZGF0YSwgcmVhZF9sZW4pOworICAgICAgICB9CisgICAgICAgIHNhZmVfbWVtb3J5X3J3X2RlYnVnKGN1cnJlbnRfY3B1LCBkYXRhLCBkZXYtPmRhdGEsIHJlYWRfbGVuLCAxKTsKKyAgICAgICAgZGF0YSArPSByZWFkX2xlbjsKKyAgICAgICAgbGVuIC09IHJlYWRfbGVuOworICAgIH0KKyAgICByZXR1cm4gdG90YWxfbGVuOworfQorCitzdGF0aWMgdWludDMyX3QgbmFuZF9kZXZfd3JpdGVfZmlsZShuYW5kX2RldiAqZGV2LCB0YXJnZXRfdWxvbmcgZGF0YSwgdWludDY0X3QgYWRkciwgdWludDMyX3QgdG90YWxfbGVuKQoreworICAgIHVpbnQzMl90IGxlbiA9IHRvdGFsX2xlbjsKKyAgICBzaXplX3Qgd3JpdGVfbGVuID0gZGV2LT5lcmFzZV9zaXplOworICAgIGludCByZXQ7CisKKyAgICBOQU5EX1VQREFURV9XUklURV9USFJFU0hPTEQodG90YWxfbGVuKTsKKworICAgIGRvX2xzZWVrKGRldi0+ZmQsIGFkZHIsIFNFRUtfU0VUKTsKKyAgICB3aGlsZShsZW4gPiAwKSB7CisgICAgICAgIGlmKGxlbiA8IHdyaXRlX2xlbikKKyAgICAgICAgICAgIHdyaXRlX2xlbiA9IGxlbjsKKyAgICAgICAgc2FmZV9tZW1vcnlfcndfZGVidWcoY3VycmVudF9jcHUsIGRhdGEsIGRldi0+ZGF0YSwgd3JpdGVfbGVuLCAwKTsKKyAgICAgICAgcmV0ID0gZG9fd3JpdGUoZGV2LT5mZCwgZGV2LT5kYXRhLCB3cml0ZV9sZW4pOworICAgICAgICBpZihyZXQgPCB3cml0ZV9sZW4pIHsKKyAgICAgICAgICAgIFhMT0coIm5hbmRfZGV2X3dyaXRlX2ZpbGUsIHdyaXRlIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkYXRhICs9IHdyaXRlX2xlbjsKKyAgICAgICAgbGVuIC09IHdyaXRlX2xlbjsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsX2xlbiAtIGxlbjsKK30KKworc3RhdGljIHVpbnQzMl90IG5hbmRfZGV2X2VyYXNlX2ZpbGUobmFuZF9kZXYgKmRldiwgdWludDY0X3QgYWRkciwgdWludDMyX3QgdG90YWxfbGVuKQoreworICAgIHVpbnQzMl90IGxlbiA9IHRvdGFsX2xlbjsKKyAgICBzaXplX3Qgd3JpdGVfbGVuID0gZGV2LT5lcmFzZV9zaXplOworICAgIGludCByZXQ7CisKKyAgICBkb19sc2VlayhkZXYtPmZkLCBhZGRyLCBTRUVLX1NFVCk7CisgICAgbWVtc2V0KGRldi0+ZGF0YSwgMHhmZiwgZGV2LT5lcmFzZV9zaXplKTsKKyAgICB3aGlsZShsZW4gPiAwKSB7CisgICAgICAgIGlmKGxlbiA8IHdyaXRlX2xlbikKKyAgICAgICAgICAgIHdyaXRlX2xlbiA9IGxlbjsKKyAgICAgICAgcmV0ID0gZG9fd3JpdGUoZGV2LT5mZCwgZGV2LT5kYXRhLCB3cml0ZV9sZW4pOworICAgICAgICBpZihyZXQgPCB3cml0ZV9sZW4pIHsKKyAgICAgICAgICAgIFhMT0coICJuYW5kX2Rldl93cml0ZV9maWxlLCB3cml0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGVuIC09IHdyaXRlX2xlbjsKKyAgICB9CisgICAgcmV0dXJuIHRvdGFsX2xlbiAtIGxlbjsKK30KKworLyogdGhpcyBpcyBhIGh1Z2UgaGFjayByZXF1aXJlZCB0byBtYWtlIHRoZSBQb3dlclBDIGVtdWxhdG9yIGJpbmFyeSB1c2FibGUKKyAqIG9uIE1hYyBPUyBYLiBJZiB5b3UgZGVmaW5lIHRoaXMgZnVuY3Rpb24gYXMgJ3N0YXRpYycsIHRoZSBlbXVsYXRlZCBrZXJuZWwKKyAqIHdpbGwgcGFuaWMgd2hlbiBhdHRlbXB0aW5nIHRvIG1vdW50IHRoZSAvZGF0YSBwYXJ0aXRpb24uCisgKgorICogd29yc2UsIGlmIHlvdSBkbyAqbm90KiBkZWZpbmUgdGhlIGZ1bmN0aW9uIGFzIHN0YXRpYyBvbiBMaW51eC14ODYsIHRoZQorICogZW11bGF0ZWQga2VybmVsIHdpbGwgYWxzbyBwYW5pYyAhPworICoKKyAqIEkgc3RpbGwgd29uZGVyIGlmIHRoaXMgaXMgYSBjb21waWxlciBidWcsIG9yIGR1ZSB0byBzb21lIG5hc3R5IHRoaW5nIHRoZQorICogZW11bGF0b3IgZG9lcyB3aXRoIENQVSByZWdpc3RlcnMgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgdHJhbnNsYXRlZCBjb2RlLgorICovCisjaWYgIShkZWZpbmVkIF9fQVBQTEVfXyAmJiBkZWZpbmVkIF9fcG93ZXJwY19fKQorc3RhdGljCisjZW5kaWYKK3VpbnQzMl90IG5hbmRfZGV2X2RvX2NtZChuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlICpzLCB1aW50MzJfdCBjbWQpCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50NjRfdCBhZGRyOworICAgIG5hbmRfZGV2ICpkZXY7CisKKyAgICBpZiAoY21kID09IE5BTkRfQ01EX1dSSVRFX0JBVENIIHx8IGNtZCA9PSBOQU5EX0NNRF9SRUFEX0JBVENIIHx8CisgICAgICAgIGNtZCA9PSBOQU5EX0NNRF9FUkFTRV9CQVRDSCkgeworICAgICAgICBzdHJ1Y3QgYmF0Y2hfZGF0YSBiZDsKKyAgICAgICAgc3RydWN0IGJhdGNoX2RhdGFfNjQgYmQ2NDsKKyAgICAgICAgdWludDY0X3QgYmRfYWRkciA9ICgodWludDY0X3Qpcy0+YmF0Y2hfYWRkcl9oaWdoIDw8IDMyKSB8IHMtPmJhdGNoX2FkZHJfbG93OworICAgICAgICBpZiAoZ29sZGZpc2hfZ3Vlc3RfaXNfNjRiaXQoKSkgeworICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9yZWFkKGJkX2FkZHIsICh2b2lkKikmYmQ2NCwgc2l6ZW9mKHN0cnVjdCBiYXRjaF9kYXRhXzY0KSk7CisgICAgICAgICAgICBzLT5kZXYgPSBiZDY0LmRldjsKKyAgICAgICAgICAgIHMtPmFkZHJfbG93ID0gYmQ2NC5hZGRyX2xvdzsKKyAgICAgICAgICAgIHMtPmFkZHJfaGlnaCA9IGJkNjQuYWRkcl9oaWdoOworICAgICAgICAgICAgcy0+dHJhbnNmZXJfc2l6ZSA9IGJkNjQudHJhbnNmZXJfc2l6ZTsKKyAgICAgICAgICAgIHMtPmRhdGEgPSBiZDY0LmRhdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoYmRfYWRkciwgKHZvaWQqKSZiZCwgc2l6ZW9mKHN0cnVjdCBiYXRjaF9kYXRhKSk7CisgICAgICAgICAgICBzLT5kZXYgPSBiZC5kZXY7CisgICAgICAgICAgICBzLT5hZGRyX2xvdyA9IGJkLmFkZHJfbG93OworICAgICAgICAgICAgcy0+YWRkcl9oaWdoID0gYmQuYWRkcl9oaWdoOworICAgICAgICAgICAgcy0+dHJhbnNmZXJfc2l6ZSA9IGJkLnRyYW5zZmVyX3NpemU7CisgICAgICAgICAgICBzLT5kYXRhID0gYmQuZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhZGRyID0gcy0+YWRkcl9sb3cgfCAoKHVpbnQ2NF90KXMtPmFkZHJfaGlnaCA8PCAzMik7CisgICAgc2l6ZSA9IHMtPnRyYW5zZmVyX3NpemU7CisgICAgaWYocy0+ZGV2ID49IG5hbmRfZGV2X2NvdW50KQorICAgICAgICByZXR1cm4gMDsKKyAgICBkZXYgPSBuYW5kX2RldnMgKyBzLT5kZXY7CisKKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBOQU5EX0NNRF9HRVRfREVWX05BTUU6CisgICAgICAgIGlmKHNpemUgPiBkZXYtPmRldm5hbWVfbGVuKQorICAgICAgICAgICAgc2l6ZSA9IGRldi0+ZGV2bmFtZV9sZW47CisgICAgICAgIHNhZmVfbWVtb3J5X3J3X2RlYnVnKGN1cnJlbnRfY3B1LCBzLT5kYXRhLCAodWludDhfdCopZGV2LT5kZXZuYW1lLCBzaXplLCAxKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgY2FzZSBOQU5EX0NNRF9SRUFEX0JBVENIOgorICAgIGNhc2UgTkFORF9DTURfUkVBRDoKKyAgICAgICAgaWYoYWRkciA+PSBkZXYtPm1heF9zaXplKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmKHNpemUgPiBkZXYtPm1heF9zaXplIC0gYWRkcikKKyAgICAgICAgICAgIHNpemUgPSBkZXYtPm1heF9zaXplIC0gYWRkcjsKKyAgICAgICAgaWYoZGV2LT5mZCA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIG5hbmRfZGV2X3JlYWRfZmlsZShkZXYsIHMtPmRhdGEsIGFkZHIsIHNpemUpOworICAgICAgICBzYWZlX21lbW9yeV9yd19kZWJ1ZyhjdXJyZW50X2NwdSwgcy0+ZGF0YSwgJmRldi0+ZGF0YVthZGRyXSwgc2l6ZSwgMSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIGNhc2UgTkFORF9DTURfV1JJVEVfQkFUQ0g6CisgICAgY2FzZSBOQU5EX0NNRF9XUklURToKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIE5BTkRfREVWX0ZMQUdfUkVBRF9PTkxZKSB7CisgICAgICAgICAgICBYTE9HKCJUcnlpbmcgdG8gd3JpdGUgdG8gcmVhZC1vbmx5IE5BTkQgZGlza1xuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZihhZGRyID49IGRldi0+bWF4X3NpemUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYoc2l6ZSA+IGRldi0+bWF4X3NpemUgLSBhZGRyKQorICAgICAgICAgICAgc2l6ZSA9IGRldi0+bWF4X3NpemUgLSBhZGRyOworICAgICAgICBpZihkZXYtPmZkID49IDApCisgICAgICAgICAgICByZXR1cm4gbmFuZF9kZXZfd3JpdGVfZmlsZShkZXYsIHMtPmRhdGEsIGFkZHIsIHNpemUpOworICAgICAgICBzYWZlX21lbW9yeV9yd19kZWJ1ZyhjdXJyZW50X2NwdSwgcy0+ZGF0YSwgJmRldi0+ZGF0YVthZGRyXSwgc2l6ZSwgMCk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIGNhc2UgTkFORF9DTURfRVJBU0VfQkFUQ0g6CisgICAgY2FzZSBOQU5EX0NNRF9FUkFTRToKKyAgICAgICAgaWYoZGV2LT5mbGFncyAmIE5BTkRfREVWX0ZMQUdfUkVBRF9PTkxZKSB7CisgICAgICAgICAgICBYTE9HKCJUcnlpbmcgdG8gZXJhc2Ugd2l0aGluIGEgcmVhZC1vbmx5IE5BTkQgZGlza1xuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZihhZGRyID49IGRldi0+bWF4X3NpemUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYoc2l6ZSA+IGRldi0+bWF4X3NpemUgLSBhZGRyKQorICAgICAgICAgICAgc2l6ZSA9IGRldi0+bWF4X3NpemUgLSBhZGRyOworICAgICAgICBpZihkZXYtPmZkID49IDApCisgICAgICAgICAgICByZXR1cm4gbmFuZF9kZXZfZXJhc2VfZmlsZShkZXYsIGFkZHIsIHNpemUpOworICAgICAgICBtZW1zZXQoJmRldi0+ZGF0YVthZGRyXSwgMHhmZiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIGNhc2UgTkFORF9DTURfQkxPQ0tfQkFEX0dFVDogLy8gbm8gYmFkIGJsb2NrIHN1cHBvcnQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBOQU5EX0NNRF9CTE9DS19CQURfU0VUOgorICAgICAgICBpZihkZXYtPmZsYWdzICYgTkFORF9ERVZfRkxBR19SRUFEX09OTFkpIHsKKyAgICAgICAgICAgIFhMT0coIlRyeWluZyB0byBzZXQgYSBiYWQgYmxvY2sgaW4gYSByZWFkLW9ubHkgTkFORCBkaXNrXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwgIm5hbmRfZGV2X2RvX2NtZDogQmFkIGNvbW1hbmQgJXhcbiIsIGNtZCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogSS9PIHdyaXRlICovCitzdGF0aWMgdm9pZCBuYW5kX2Rldl93cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKQoreworICAgIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGUgKnMgPSAobmFuZF9kZXZfY29udHJvbGxlcl9zdGF0ZSAqKW9wYXF1ZTsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSBOQU5EX0RFVjoKKyAgICAgICAgcy0+ZGV2ID0gdmFsdWU7CisgICAgICAgIGlmKHMtPmRldiA+PSBuYW5kX2Rldl9jb3VudCkgeworICAgICAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LCAibmFuZF9kZXZfd3JpdGU6IEJhZCBkZXYgJXhcbiIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BTkRfQUREUl9ISUdIOgorICAgICAgICBzLT5hZGRyX2hpZ2ggPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOQU5EX0FERFJfTE9XOgorICAgICAgICBzLT5hZGRyX2xvdyA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BTkRfQkFUQ0hfQUREUl9MT1c6CisgICAgICAgIHMtPmJhdGNoX2FkZHJfbG93ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFORF9CQVRDSF9BRERSX0hJR0g6CisgICAgICAgIHMtPmJhdGNoX2FkZHJfaGlnaCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BTkRfVFJBTlNGRVJfU0laRToKKyAgICAgICAgcy0+dHJhbnNmZXJfc2l6ZSA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5BTkRfREFUQToKKyAgICAgICAgdWludDY0X3NldF9sb3coJnMtPmRhdGEsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOQU5EX0RBVEFfSElHSDoKKyAgICAgICAgdWludDY0X3NldF9oaWdoKCZzLT5kYXRhLCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTkFORF9DT01NQU5EOgorICAgICAgICBzLT5yZXN1bHQgPSBuYW5kX2Rldl9kb19jbWQocywgdmFsdWUpOworICAgICAgICBpZiAodmFsdWUgPT0gTkFORF9DTURfV1JJVEVfQkFUQ0ggfHwgdmFsdWUgPT0gTkFORF9DTURfUkVBRF9CQVRDSCB8fAorICAgICAgICAgICAgdmFsdWUgPT0gTkFORF9DTURfRVJBU0VfQkFUQ0gpIHsKKyAgICAgICAgICAgIHN0cnVjdCBiYXRjaF9kYXRhIGJkOworICAgICAgICAgICAgc3RydWN0IGJhdGNoX2RhdGFfNjQgYmQ2NDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJkX2FkZHIgPSAoKHVpbnQ2NF90KXMtPmJhdGNoX2FkZHJfaGlnaCA8PCAzMikgfCBzLT5iYXRjaF9hZGRyX2xvdzsKKyAgICAgICAgICAgIGlmIChnb2xkZmlzaF9ndWVzdF9pc182NGJpdCgpKSB7CisgICAgICAgICAgICAgICAgYmQ2NC5yZXN1bHQgPSBzLT5yZXN1bHQ7CisgICAgICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShiZF9hZGRyLCAodm9pZCopJmJkNjQsIHNpemVvZihzdHJ1Y3QgYmF0Y2hfZGF0YV82NCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiZC5yZXN1bHQgPSBzLT5yZXN1bHQ7CisgICAgICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShiZF9hZGRyLCAodm9pZCopJmJkLCBzaXplb2Yoc3RydWN0IGJhdGNoX2RhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjcHVfYWJvcnQoY3B1X3NpbmdsZV9lbnYsCisgICAgICAgICAgICAgICAgICAibmFuZF9kZXZfd3JpdGU6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwKKyAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogSS9PIHJlYWQgKi8KK3N0YXRpYyB1aW50MzJfdCBuYW5kX2Rldl9yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlICpzID0gKG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGUgKilvcGFxdWU7CisgICAgbmFuZF9kZXYgKmRldjsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSBOQU5EX1ZFUlNJT046CisgICAgICAgIHJldHVybiBOQU5EX1ZFUlNJT05fQ1VSUkVOVDsKKyAgICBjYXNlIE5BTkRfTlVNX0RFVjoKKyAgICAgICAgcmV0dXJuIG5hbmRfZGV2X2NvdW50OworICAgIGNhc2UgTkFORF9SRVNVTFQ6CisgICAgICAgIHJldHVybiBzLT5yZXN1bHQ7CisgICAgfQorCisgICAgaWYocy0+ZGV2ID49IG5hbmRfZGV2X2NvdW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGRldiA9IG5hbmRfZGV2cyArIHMtPmRldjsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSBOQU5EX0RFVl9GTEFHUzoKKyAgICAgICAgcmV0dXJuIGRldi0+ZmxhZ3M7CisKKyAgICBjYXNlIE5BTkRfREVWX05BTUVfTEVOOgorICAgICAgICByZXR1cm4gZGV2LT5kZXZuYW1lX2xlbjsKKworICAgIGNhc2UgTkFORF9ERVZfUEFHRV9TSVpFOgorICAgICAgICByZXR1cm4gZGV2LT5wYWdlX3NpemU7CisKKyAgICBjYXNlIE5BTkRfREVWX0VYVFJBX1NJWkU6CisgICAgICAgIHJldHVybiBkZXYtPmV4dHJhX3NpemU7CisKKyAgICBjYXNlIE5BTkRfREVWX0VSQVNFX1NJWkU6IHsKKyAgICAgICAgICAgIC8vIElNUE9SVEFOVDogVGhlIGtlcm5lbCdzIE1URCBtb2R1bGUsIHdoaWNoIGhhbmRsZXMgcmVhZHMvd3JpdGVzCisgICAgICAgICAgICAvLyB0byBOQU5EIG1lbW9yeSwgaW1wbGVtZW50cyBjYWNoaW5nLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGVuZHMgdXAKKyAgICAgICAgICAgIC8vIHJhbmRvbWx5IGNvcnJ1cHRpbmcgd3JpdGFibGUgcGFydGl0aW9ucyB3aGVuIHRoZSBlbXVsYXRvciBpcworICAgICAgICAgICAgLy8gc3RvcHBlZCAoZWl0aGVyIG5vcm1hbGx5IG9yIGZvcmNlZnVsbHkpLiBSZXBvcnRpbmcgYW4gZXJhc2Vfc2l6ZQorICAgICAgICAgICAgLy8gb2YgMCBoZXJlIGRpc2FibGVzIHRoYXQgY2FjaGluZywgYW5kIGFsbG93cyB0aGUgc3lzdGVtIHRvIGJvb3QKKyAgICAgICAgICAgIC8vIGFuZCBydW4gZnJvbSBleHQ0IHBhcnRpdGlvbnMgcHJvcGVybHksIGJ1dCBub3QgZnJvbSBZQUZGUyBvbmVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpbmNlIFlBRkZTIHNlZW1zIHJlc2lsaWVudCB0byB0aGVzZSBjb3JydXB0aW9uIGlzc3VlcyBhbnl3YXksCisgICAgICAgICAgICAvLyBqdXN0IHJlcG9ydCB0aGUgc2l6ZSBhcyAwIGZvciBFWFQ0IHBhcnRpdGlvbnMuCisgICAgICAgICAgICBpbnQgaXNfZXh0NCA9IChkZXYtPmV4dHJhX3NpemUgPT0gMCk7CisgICAgICAgICAgICByZXR1cm4gaXNfZXh0NCA/IDAgOiBkZXYtPmVyYXNlX3NpemU7CisgICAgICAgIH0KKworICAgIGNhc2UgTkFORF9ERVZfU0laRV9MT1c6CisgICAgICAgIHJldHVybiAodWludDMyX3QpZGV2LT5tYXhfc2l6ZTsKKworICAgIGNhc2UgTkFORF9ERVZfU0laRV9ISUdIOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KShkZXYtPm1heF9zaXplID4+IDMyKTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICJuYW5kX2Rldl9yZWFkOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqbmFuZF9kZXZfcmVhZGZuW10gPSB7CisgICBuYW5kX2Rldl9yZWFkLAorICAgbmFuZF9kZXZfcmVhZCwKKyAgIG5hbmRfZGV2X3JlYWQKK307CisKK3N0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKm5hbmRfZGV2X3dyaXRlZm5bXSA9IHsKKyAgIG5hbmRfZGV2X3dyaXRlLAorICAgbmFuZF9kZXZfd3JpdGUsCisgICBuYW5kX2Rldl93cml0ZQorfTsKKworLyogaW5pdGlhbGl6ZSB0aGUgUUZCIGRldmljZSAqLwordm9pZCBuYW5kX2Rldl9pbml0KHVpbnQzMl90IGJhc2UpCit7CisgICAgaW50IGlvbWVtdHlwZTsKKyAgICBzdGF0aWMgaW50ICBpbnN0YW5jZV9pZCA9IDA7CisgICAgbmFuZF9kZXZfY29udHJvbGxlcl9zdGF0ZSAqczsKKworICAgIHMgPSAobmFuZF9kZXZfY29udHJvbGxlcl9zdGF0ZSAqKWdfbWFsbG9jMChzaXplb2YobmFuZF9kZXZfY29udHJvbGxlcl9zdGF0ZSkpOworICAgIGlvbWVtdHlwZSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkobmFuZF9kZXZfcmVhZGZuLCBuYW5kX2Rldl93cml0ZWZuLCBzKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGJhc2UsIDB4MDAwMDBmZmYsIGlvbWVtdHlwZSk7CisgICAgcy0+YmFzZSA9IGJhc2U7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgIm5hbmRfZGV2IiwKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfaWQrKywKKyAgICAgICAgICAgICAgICAgICAgTkFORF9ERVZfU1RBVEVfU0FWRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBuYW5kX2Rldl9jb250cm9sbGVyX3N0YXRlX3NhdmUsCisgICAgICAgICAgICAgICAgICAgIG5hbmRfZGV2X2NvbnRyb2xsZXJfc3RhdGVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7Cit9CisKK3N0YXRpYyBpbnQgYXJnX21hdGNoKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIHNpemVfdCBiX2xlbikKK3sKKyAgICB3aGlsZSgqYSAmJiBiX2xlbi0tKSB7CisgICAgICAgIGlmKCphKysgIT0gKmIrKykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYl9sZW4gPT0gMDsKK30KKwordm9pZCBuYW5kX2FkZF9kZXYoY29uc3QgY2hhciAqYXJnKQoreworICAgIHVpbnQ2NF90IGRldl9zaXplID0gMDsKKyAgICBjb25zdCBjaGFyICpuZXh0X2FyZzsKKyAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICBzaXplX3QgYXJnX2xlbiwgdmFsdWVfbGVuOworICAgIG5hbmRfZGV2ICpuZXdfZGV2cywgKmRldjsKKyAgICBjaGFyICpkZXZuYW1lID0gTlVMTDsKKyAgICBzaXplX3QgZGV2bmFtZV9sZW4gPSAwOworICAgIGNoYXIgKnJ3ZmlsZW5hbWUgPSBOVUxMOworICAgIGludCByZWFkX29ubHkgPSAwOworICAgIGludCBwYWQ7CisgICAgdWludDMyX3QgcGFnZV9zaXplID0gMjA0ODsKKyAgICB1aW50MzJfdCBleHRyYV9zaXplID0gNjQ7CisgICAgdWludDMyX3QgZXJhc2VfcGFnZXMgPSA2NDsKKworICAgIFZFUkJPU0VfUFJJTlQoaW5pdCwgIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgYXJnKTsKKworICAgIHdoaWxlKGFyZykgeworICAgICAgICBuZXh0X2FyZyA9IHN0cmNocihhcmcsICcsJyk7CisgICAgICAgIHZhbHVlID0gc3RyY2hyKGFyZywgJz0nKTsKKyAgICAgICAgaWYobmV4dF9hcmcgIT0gTlVMTCkgeworICAgICAgICAgICAgYXJnX2xlbiA9IG5leHRfYXJnIC0gYXJnOworICAgICAgICAgICAgbmV4dF9hcmcrKzsKKyAgICAgICAgICAgIGlmKHZhbHVlID49IG5leHRfYXJnKQorICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBhcmdfbGVuID0gc3RybGVuKGFyZyk7CisgICAgICAgIGlmKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNpemVfdCBuZXdfYXJnX2xlbiA9IHZhbHVlIC0gYXJnOworICAgICAgICAgICAgdmFsdWVfbGVuID0gYXJnX2xlbiAtIG5ld19hcmdfbGVuIC0gMTsKKyAgICAgICAgICAgIGFyZ19sZW4gPSBuZXdfYXJnX2xlbjsKKyAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWVfbGVuID0gMDsKKworICAgICAgICBpZihkZXZuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmKHZhbHVlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBiYWRfYXJnX2FuZF92YWx1ZTsKKyAgICAgICAgICAgIGRldm5hbWVfbGVuID0gYXJnX2xlbjsKKyAgICAgICAgICAgIGRldm5hbWUgPSBtYWxsb2MoYXJnX2xlbisxKTsKKyAgICAgICAgICAgIGlmKGRldm5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dF9vZl9tZW1vcnk7CisgICAgICAgICAgICBtZW1jcHkoZGV2bmFtZSwgYXJnLCBhcmdfbGVuKTsKKyAgICAgICAgICAgIGRldm5hbWVbYXJnX2xlbl0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYoYXJnX21hdGNoKCJyZWFkb25seSIsIGFyZywgYXJnX2xlbikpIHsKKyAgICAgICAgICAgICAgICByZWFkX29ubHkgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgWExPRygiYmFkIGFyZzogJS4qc1xuIiwgYXJnX2xlbiwgYXJnKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYoYXJnX21hdGNoKCJzaXplIiwgYXJnLCBhcmdfbGVuKSkgeworICAgICAgICAgICAgICAgIGNoYXIgKmVwOworICAgICAgICAgICAgICAgIGRldl9zaXplID0gc3RydG91bGwodmFsdWUsICZlcCwgMCk7CisgICAgICAgICAgICAgICAgaWYoZXAgIT0gdmFsdWUgKyB2YWx1ZV9sZW4pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2FyZ19hbmRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGFyZ19tYXRjaCgicGFnZXNpemUiLCBhcmcsIGFyZ19sZW4pKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZXA7CisgICAgICAgICAgICAgICAgcGFnZV9zaXplID0gc3RydG91bCh2YWx1ZSwgJmVwLCAwKTsKKyAgICAgICAgICAgICAgICBpZihlcCAhPSB2YWx1ZSArIHZhbHVlX2xlbikKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfYXJnX2FuZF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoYXJnX21hdGNoKCJleHRyYXNpemUiLCBhcmcsIGFyZ19sZW4pKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZXA7CisgICAgICAgICAgICAgICAgZXh0cmFfc2l6ZSA9IHN0cnRvdWwodmFsdWUsICZlcCwgMCk7CisgICAgICAgICAgICAgICAgaWYoZXAgIT0gdmFsdWUgKyB2YWx1ZV9sZW4pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2FyZ19hbmRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGFyZ19tYXRjaCgiZXJhc2VwYWdlcyIsIGFyZywgYXJnX2xlbikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICplcDsKKyAgICAgICAgICAgICAgICBlcmFzZV9wYWdlcyA9IHN0cnRvdWwodmFsdWUsICZlcCwgMCk7CisgICAgICAgICAgICAgICAgaWYoZXAgIT0gdmFsdWUgKyB2YWx1ZV9sZW4pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2FyZ19hbmRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGFyZ19tYXRjaCgiZmlsZSIsIGFyZywgYXJnX2xlbikpIHsKKyAgICAgICAgICAgICAgICByd2ZpbGVuYW1lID0gbWFsbG9jKHZhbHVlX2xlbiArIDEpOworICAgICAgICAgICAgICAgIGlmKHJ3ZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgICAgICAgICAgICAgIG1lbWNweShyd2ZpbGVuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKyAgICAgICAgICAgICAgICByd2ZpbGVuYW1lW3ZhbHVlX2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgdW51c3VhbCBjaGFyYWN0ZXJzIHRoYXQgY29uZnVzZSBwYXJzaW5nCisgICAgICAgICAgICAgICAgcGF0aF91bmVzY2FwZV9wYXRoKHJ3ZmlsZW5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBiYWRfYXJnX2FuZF92YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFyZyA9IG5leHRfYXJnOworICAgIH0KKworICAgIGlmICghcndmaWxlbmFtZSkgeworICAgICAgICBYTE9HKCJNaXNzaW5nICUuKnMgTkFORCBkaXNrIGltYWdlIHBhdGghXG4iLCBkZXZuYW1lX2xlbiwgZGV2bmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgaWYgKCFkZXZfc2l6ZSkgeworICAgICAgICBYTE9HKCJNaXNzaW5nICUuKnMgTkFORCBkaXNrIGltYWdlIHNpemUhXG4iLCBkZXZuYW1lX2xlbiwgZGV2bmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgbmV3X2RldnMgPSByZWFsbG9jKG5hbmRfZGV2cywgc2l6ZW9mKG5hbmRfZGV2c1swXSkgKiAobmFuZF9kZXZfY291bnQgKyAxKSk7CisgICAgaWYobmV3X2RldnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBvdXRfb2ZfbWVtb3J5OworICAgIG5hbmRfZGV2cyA9IG5ld19kZXZzOworICAgIGRldiA9ICZuZXdfZGV2c1tuYW5kX2Rldl9jb3VudF07CisKKyAgICBkZXYtPnBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZTsKKyAgICBkZXYtPmV4dHJhX3NpemUgPSBleHRyYV9zaXplOworICAgIGRldi0+ZXJhc2Vfc2l6ZSA9IGVyYXNlX3BhZ2VzICogKHBhZ2Vfc2l6ZSArIGV4dHJhX3NpemUpOworICAgIHBhZCA9IGRldl9zaXplICUgZGV2LT5lcmFzZV9zaXplOworICAgIGlmIChwYWQgIT0gMCkgeworICAgICAgICBkZXZfc2l6ZSArPSAoZGV2LT5lcmFzZV9zaXplIC0gcGFkKTsKKyAgICAgICAgRCgicm91bmRpbmcgZGV2c2l6ZSB1cCB0byBhIGZ1bGwgZXJhc2V1bml0LCBub3cgJWxseFxuIiwgZGV2X3NpemUpOworICAgIH0KKyAgICBkZXYtPmRldm5hbWUgPSBkZXZuYW1lOworICAgIGRldi0+ZGV2bmFtZV9sZW4gPSBkZXZuYW1lX2xlbjsKKyAgICBkZXYtPm1heF9zaXplID0gZGV2X3NpemU7CisgICAgZGV2LT5kYXRhID0gbWFsbG9jKGRldi0+ZXJhc2Vfc2l6ZSk7CisgICAgaWYoZGV2LT5kYXRhID09IE5VTEwpCisgICAgICAgIGdvdG8gb3V0X29mX21lbW9yeTsKKyAgICAvLyBEb24ndCBwYXNzIE5BTkRfREVWX0ZMQUdfUkVBRF9PTkxZIHRvIHRoZSBrZXJuZWwsIHJlY2VudCBvbmVzCisgICAgLy8gZG8gbm90IHVuZGVyc3RhbmQgdGhlIGZsYWcgcHJvcGVybHkgYW5kIHdpbGwgcmVmdXNlIHRvIG1vdW50CisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgcGFydGl0aW9uLgorICAgIGRldi0+ZmxhZ3MgPSAwOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgZGV2LT5mbGFncyB8PSBOQU5EX0RFVl9GTEFHX0JBVENIX0NBUDsKKyNlbmRpZgorCisgICAgZGV2LT5mZCA9IG9wZW4ocndmaWxlbmFtZSwgT19CSU5BUlkgfCAocmVhZF9vbmx5ID8gT19SRE9OTFkgOiBPX1JEV1IpKTsKKyAgICBpZihkZXYtPmZkIDwgMCkgeworICAgICAgICBYTE9HKCJjb3VsZCBub3Qgb3BlbiBmaWxlICVzLCAlc1xuIiwgcndmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgLyogdGhpcyBjb3VsZCBiZSBhIHdyaXRhYmxlIHRlbXBvcmFyeSBmaWxlLiB1c2UgYXRleGl0X2Nsb3NlX2ZkIHRvIGVuc3VyZQorICAgICAqIHRoYXQgaXQgaXMgcHJvcGVybHkgY2xlYW5lZCB1cCBhdCBleGl0IG9uIFdpbjMyCisgICAgICovCisgICAgaWYgKCFyZWFkX29ubHkpCisgICAgICAgIGF0ZXhpdF9jbG9zZV9mZChkZXYtPmZkKTsKKworICAgIG5hbmRfZGV2X2NvdW50Kys7CisKKyAgICByZXR1cm47CisKK291dF9vZl9tZW1vcnk6CisgICAgWExPRygib3V0IG9mIG1lbW9yeVxuIik7CisgICAgZXhpdCgxKTsKKworYmFkX2FyZ19hbmRfdmFsdWU6CisgICAgWExPRygiYmFkIGFyZzogJS4qcz0lLipzXG4iLCBhcmdfbGVuLCBhcmcsIHZhbHVlX2xlbiwgdmFsdWUpOworICAgIGV4aXQoMSk7Cit9CisKKyNpZmRlZiBDT05GSUdfTkFORF9MSU1JVFMKK3ZvaWQgbmFuZF9wYXJzZV9saW1pdHMoY29uc3QgY2hhciogbGltaXRzKSB7CisgICAgYW5kcm9pZF9uYW5kX2xpbWl0c19wYXJzZShsaW1pdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFuZF93cml0ZV9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW5kX3JlYWRfbGltaXQpOworfQorI2VuZGlmICAvLyBDT05GSUdfTkFORF9MSU1JVFMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9uYW5kX3JlZy5oIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL25hbmRfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4OWJjYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9uYW5kX3JlZy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpZm5kZWYgTkFORF9ERVZJQ0VfUkVHX0gKKyNkZWZpbmUgTkFORF9ERVZJQ0VfUkVHX0gKKworZW51bSBuYW5kX2NtZCB7CisgICAgTkFORF9DTURfR0VUX0RFVl9OQU1FLCAgLy8gV3JpdGUgZGV2aWNlIG5hbWUgZm9yIE5BTkRfREVWIHRvIE5BTkRfREFUQSAodmFkZHIpCisgICAgTkFORF9DTURfUkVBRCwKKyAgICBOQU5EX0NNRF9XUklURSwKKyAgICBOQU5EX0NNRF9FUkFTRSwKKyAgICBOQU5EX0NNRF9CTE9DS19CQURfR0VULCAvLyBOQU5EX1JFU1VMVCBpcyAxIGlmIGJsb2NrIGlzIGJhZCwgMCBpZiBpdCBpcyBub3QKKyAgICBOQU5EX0NNRF9CTE9DS19CQURfU0VULAorICAgIE5BTkRfQ01EX1JFQURfQkFUQ0gsCS8vIEJBVENIIE9QIGV4dGVuc2lvbnMuCisgICAgTkFORF9DTURfV1JJVEVfQkFUQ0gsCisgICAgTkFORF9DTURfRVJBU0VfQkFUQ0gKK307CisKK3N0cnVjdCBiYXRjaF9kYXRheworICAgIHVpbnQzMl90IGRldjsKKyAgICB1aW50MzJfdCBhZGRyX2xvdzsKKyAgICB1aW50MzJfdCBhZGRyX2hpZ2g7CisgICAgdWludDMyX3QgdHJhbnNmZXJfc2l6ZTsKKyAgICB1aW50MzJfdCBkYXRhOworICAgIHVpbnQzMl90IHJlc3VsdDsKK307CisKK3N0cnVjdCBiYXRjaF9kYXRhXzY0IHsKKyAgICB1aW50MzJfdCBkZXY7CisgICAgdWludDMyX3QgYWRkcl9sb3c7CisgICAgdWludDMyX3QgYWRkcl9oaWdoOworICAgIHVpbnQzMl90IHRyYW5zZmVyX3NpemU7CisgICAgdWludDY0X3QgZGF0YTsKKyAgICB1aW50MzJfdCByZXN1bHQ7Cit9OworCitlbnVtIG5hbmRfZGV2X2ZsYWdzIHsKKyAgICBOQU5EX0RFVl9GTEFHX1JFQURfT05MWSA9IDB4MDAwMDAwMDEsCisgICAgTkFORF9ERVZfRkxBR19CQVRDSF9DQVAgPSAweDAwMDAwMDAyCit9OworCisjZGVmaW5lIE5BTkRfVkVSU0lPTl9DVVJSRU5UICgxKQorCitlbnVtIG5hbmRfcmVnIHsKKyAgICAvLyBHbG9iYWwKKyAgICBOQU5EX1ZFUlNJT04gICAgICAgID0gMHgwMDAsCisgICAgTkFORF9OVU1fREVWICAgICAgICA9IDB4MDA0LAorICAgIE5BTkRfREVWICAgICAgICAgICAgPSAweDAwOCwKKworICAgIC8vIERldiBpbmZvCisgICAgTkFORF9ERVZfRkxBR1MgICAgICA9IDB4MDEwLAorICAgIE5BTkRfREVWX05BTUVfTEVOICAgPSAweDAxNCwKKyAgICBOQU5EX0RFVl9QQUdFX1NJWkUgID0gMHgwMTgsCisgICAgTkFORF9ERVZfRVhUUkFfU0laRSA9IDB4MDFjLAorICAgIE5BTkRfREVWX0VSQVNFX1NJWkUgPSAweDAyMCwKKyAgICBOQU5EX0RFVl9TSVpFX0xPVyAgID0gMHgwMjgsCisgICAgTkFORF9ERVZfU0laRV9ISUdIICA9IDB4MDJjLAorCisgICAgLy8gQ29tbWFuZAorICAgIE5BTkRfUkVTVUxUICAgICAgICAgPSAweDA0MCwKKyAgICBOQU5EX0NPTU1BTkQgICAgICAgID0gMHgwNDQsCisgICAgTkFORF9EQVRBICAgICAgICAgICA9IDB4MDQ4LAorICAgIE5BTkRfVFJBTlNGRVJfU0laRSAgPSAweDA0YywKKyAgICBOQU5EX0FERFJfTE9XICAgICAgID0gMHgwNTAsCisgICAgTkFORF9BRERSX0hJR0ggICAgICA9IDB4MDU0LAorICAgIE5BTkRfQkFUQ0hfQUREUl9MT1cgPSAweDA1OCwKKyAgICBOQU5EX0JBVENIX0FERFJfSElHSD0gMHgwNWMsCisKKyAgICBOQU5EX0RBVEFfSElHSCAgICAgID0gMHgxMDAsICAvLyBGb3IgNjQtYml0IGd1ZXN0IENQVXMuCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvcGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTYxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvcGlwZS5jCkBAIC0wLDAgKzEsNzExIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL3V0aWxzL3N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvcGFuaWMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3N0cmVhbS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3lzdGVtLmgiCisKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL3BpcGUuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5oIgorI2luY2x1ZGUgImV4ZWMvcmFtX2FkZHIuaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vdm1zdGF0ZS5oIgorCisjZGVmaW5lICBERUJVRyAwCisKKy8qIFNldCB0byAxIHRvIGRlYnVnIGkvbyByZWdpc3RlciByZWFkcy93cml0ZXMgKi8KKyNkZWZpbmUgREVCVUdfUkVHUyAgMAorCisjaWYgREVCVUcgPj0gMQorIyAgZGVmaW5lIEQoLi4uKSAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorIyAgZGVmaW5lIEQoLi4uKSAgKHZvaWQpMAorI2VuZGlmCisKKyNpZiBERUJVRyA+PSAyCisjICBkZWZpbmUgREQoLi4uKSAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSwgZnByaW50ZihzdGRlcnIsICJcbiIpCisjZWxzZQorIyAgZGVmaW5lIEREKC4uLikgICh2b2lkKTAKKyNlbmRpZgorCisjaWYgREVCVUdfUkVHUyA+PSAxCisjICBkZWZpbmUgRFIoLi4uKSAgIEQoX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lIERSKC4uLikgICAodm9pZCkwCisjZW5kaWYKKworI2RlZmluZSBFKC4uLikgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IiBfX1ZBX0FSR1NfXyksIGZwcmludGYoc3RkZXJyLCAiXG4iKQorCisvKiBTZXQgdG8gMSB0byBlbmFibGUgdGhlICd6ZXJvJyBwaXBlIHR5cGUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nICovCisjZGVmaW5lIERFQlVHX1pFUk9fUElQRSAgMQorCisvKiBTZXQgdG8gMSB0byBlbmFibGUgdGhlICdwaW5ncG9uZycgcGlwZSB0eXBlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyAqLworI2RlZmluZSBERUJVR19QSU5HUE9OR19QSVBFIDEKKworLyogU2V0IHRvIDEgdG8gZW5hYmxlIHRoZSAndGhyb3R0bGUnIHBpcGUgdHlwZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgREVCVUdfVEhST1RUTEVfUElQRSAxCisKKyNkZWZpbmUgR09MREZJU0hfUElQRV9TQVZFX1ZFUlNJT04gIDQKKyNkZWZpbmUgR09MREZJU0hfUElQRV9TQVZFX0xFR0FDWV9WRVJTSU9OICAzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioKKyAqKioqKiAgICBQIEkgUCBFICAgQyBPIE4gTiBFIEMgVCBJIE8gTiBTCisgKioqKioKKyAqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgUGlwZURldmljZSAgUGlwZURldmljZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKgorICoqKioqICAgIEcgTyBMIEQgRiBJIFMgSCAgIFAgSSBQIEUgICBEIEUgViBJIEMgRQorICoqKioqCisgKioqKiovCisKKy8vIEFuIEh3UGlwZSBpbnN0YW5jZSBtb2RlbHMgdGhlIHZpcnR1YWwgaGFyZHdhcmUgdmlldyBvZiBhIGdpdmVuCisvLyBBbmRyb2lkIHBpcGUuCit0eXBlZGVmIHN0cnVjdCBId1BpcGUgeworICAgIHN0cnVjdCBId1BpcGUqIG5leHQ7CisgICAgc3RydWN0IEh3UGlwZSogbmV4dF93YWtlZDsKKyAgICB1aW50NjRfdCBjaGFubmVsOworICAgIHVuc2lnbmVkIGNoYXIgd2FrZXM7CisgICAgdW5zaWduZWQgY2hhciBjbG9zZWQ7CisgICAgdm9pZCogcGlwZTsKKyAgICBzdHJ1Y3QgUGlwZURldmljZSogZGV2aWNlOworfSBId1BpcGU7CisKK3N0YXRpYyBId1BpcGUqIGh3cGlwZV9uZXcwKHN0cnVjdCBQaXBlRGV2aWNlKiBkZXZpY2UpIHsKKyAgICBId1BpcGUqIGh3cDsKKyAgICBBTkVXMChod3ApOworICAgIGh3cC0+ZGV2aWNlID0gZGV2aWNlOworICAgIHJldHVybiBod3A7Cit9CisKK3N0YXRpYyBId1BpcGUqIGh3cGlwZV9uZXcodWludDY0X3QgY2hhbm5lbCwgc3RydWN0IFBpcGVEZXZpY2UqIGRldmljZSkgeworICAgIEh3UGlwZSogaHdwID0gaHdwaXBlX25ldzAoZGV2aWNlKTsKKyAgICBod3AtPmNoYW5uZWwgPSBjaGFubmVsOworICAgIGh3cC0+cGlwZSA9IGFuZHJvaWRfcGlwZV9ndWVzdF9vcGVuKGh3cCk7CisgICAgcmV0dXJuIGh3cDsKK30KKworc3RhdGljIHZvaWQgaHdwaXBlX2ZyZWUoSHdQaXBlKiBod3ApIHsKKyAgYW5kcm9pZF9waXBlX2d1ZXN0X2Nsb3NlKGh3cC0+cGlwZSk7CisgIGZyZWUoaHdwKTsKK30KKworc3RhdGljIEh3UGlwZSoqIGh3cGlwZV9maW5kcF9ieV9jaGFubmVsKEh3UGlwZSoqIGxpc3QsIHVpbnQ2NF90IGNoYW5uZWwpIHsKKyAgICBId1BpcGUqKiBwbm9kZSA9IGxpc3Q7CisgICAgZm9yICg7OykgeworICAgICAgICBId1BpcGUqIG5vZGUgPSAqcG5vZGU7CisgICAgICAgIGlmICghbm9kZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUtPmNoYW5uZWwgPT0gY2hhbm5lbCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGUgPSAmbm9kZS0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHBub2RlOworfQorCitzdGF0aWMgSHdQaXBlKiogaHdwaXBlX2ZpbmRwX3NpZ25hbGVkKEh3UGlwZSoqIGxpc3QsIEh3UGlwZSogcGlwZSkgeworICAgIEh3UGlwZSoqIHBub2RlID0gbGlzdDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEh3UGlwZSogbm9kZSA9ICpwbm9kZTsKKyAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUgPT0gcGlwZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGUgPSAmbm9kZS0+bmV4dF93YWtlZDsKKyAgICB9CisgICAgcmV0dXJuIHBub2RlOworfQorCisKK3N0YXRpYyB2b2lkIGh3cGlwZV9yZW1vdmVfc2lnbmFsZWQoSHdQaXBlKiogbGlzdCwgSHdQaXBlKiBwaXBlKSB7CisgICAgSHdQaXBlKiogcG5vZGUgPSBod3BpcGVfZmluZHBfc2lnbmFsZWQobGlzdCwgcGlwZSk7CisgICAgaWYgKCpwbm9kZSkgeworICAgICAgICAqcG5vZGUgPSBwaXBlLT5uZXh0X3dha2VkOworICAgICAgICBwaXBlLT5uZXh0X3dha2VkID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGh3cGlwZV9zYXZlKEh3UGlwZSogcGlwZSwgU3RyZWFtKiBmaWxlKSB7CisgICAgLyogTm93IHNhdmUgb3RoZXIgY29tbW9uIGRhdGEgKi8KKyAgICBzdHJlYW1fcHV0X2JlNjQoZmlsZSwgcGlwZS0+Y2hhbm5lbCk7CisgICAgc3RyZWFtX3B1dF9ieXRlKGZpbGUsIChpbnQpcGlwZS0+d2FrZXMpOworICAgIHN0cmVhbV9wdXRfYnl0ZShmaWxlLCAoaW50KXBpcGUtPmNsb3NlZCk7CisKKyAgICBhbmRyb2lkX3BpcGVfZ3Vlc3Rfc2F2ZShwaXBlLT5waXBlLCBmaWxlKTsKK30KKworc3RhdGljIEh3UGlwZSogaHdwaXBlX2xvYWQoUGlwZURldmljZSogZGV2LCBTdHJlYW0qIGZpbGUsIGludCB2ZXJzaW9uX2lkKSB7CisgICAgSHdQaXBlKiBwaXBlID0gaHdwaXBlX25ldzAoZGV2KTsKKworICAgIGNoYXIgZm9yY2VfY2xvc2UgPSAwOworICAgIGlmICh2ZXJzaW9uX2lkID09IEdPTERGSVNIX1BJUEVfU0FWRV9MRUdBQ1lfVkVSU0lPTikgeworICAgICAgcGlwZS0+cGlwZSA9IGFuZHJvaWRfcGlwZV9ndWVzdF9sb2FkX2xlZ2FjeShmaWxlLCBwaXBlLCAmcGlwZS0+Y2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpcGUtPndha2VzLCAmcGlwZS0+Y2xvc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9yY2VfY2xvc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpcGUtPmNoYW5uZWwgPSBzdHJlYW1fZ2V0X2JlNjQoZmlsZSk7CisgICAgICAgIHBpcGUtPndha2VzID0gc3RyZWFtX2dldF9ieXRlKGZpbGUpOworICAgICAgICBwaXBlLT5jbG9zZWQgPSBzdHJlYW1fZ2V0X2J5dGUoZmlsZSk7CisgICAgICAgIHBpcGUtPnBpcGUgPSBhbmRyb2lkX3BpcGVfZ3Vlc3RfbG9hZChmaWxlLCBwaXBlLCAmZm9yY2VfY2xvc2UpOworICAgIH0KKworICAgIC8vIFNVQlRMRTogYW5kcm9pZF9waXBlX2d1ZXN0X2xvYWQoKSBtYXkgcmV0dXJuIE5VTEwgaWYgdGhlIHBpcGUgc3RhdGUKKyAgICAvLyBjb3VsZCBub3QgYmUgc2F2ZWQuIEluIHRoaXMgY2FzZSB8Zm9yY2VfY2xvc2V8IHdpbGwgYmUgc2V0IHRob3VnaCwgc28KKyAgICAvLyBhbHdheXMgY2hlY2sgaXQgZmlyc3QuCisgICAgaWYgKGZvcmNlX2Nsb3NlKSB7CisgICAgICAgIHBpcGUtPmNsb3NlZCA9IDE7CisgICAgfSBlbHNlIGlmICghcGlwZS0+cGlwZSkgeworICAgICAgICBod3BpcGVfZnJlZShwaXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBpcGU7Cit9CisKK3N0cnVjdCBQaXBlRGV2aWNlIHsKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIGRldjsKKworICAgIC8qIHRoZSBsaXN0IG9mIGFsbCBwaXBlcyAqLworICAgIEh3UGlwZSogIHBpcGVzOworCisgICAgLyogdGhlIGxpc3Qgb2Ygc2lnbmFsbGVkIHBpcGVzICovCisgICAgSHdQaXBlKiAgc2lnbmFsZWRfcGlwZXM7CisKKyAgICAvKiBpL28gcmVnaXN0ZXJzICovCisgICAgdWludDY0X3QgIGFkZHJlc3M7CisgICAgdWludDMyX3QgIHNpemU7CisgICAgdWludDMyX3QgIHN0YXR1czsKKyAgICB1aW50NjRfdCAgY2hhbm5lbDsKKyAgICB1aW50MzJfdCAgd2FrZXM7CisgICAgdWludDY0X3QgIHBhcmFtc19hZGRyOworfTsKKworLyogVXBkYXRlIHRoaXMgdmVyc2lvbiBudW1iZXIgaWYgdGhlIGRldmljZSdzIGludGVyZmFjZSBjaGFuZ2VzLiAqLworI2RlZmluZSBQSVBFX0RFVklDRV9WRVJTSU9OICAxCisKK3R5cGVkZWYgZW51bSB7IFVTRV9WQSwgVVNFX1BBIH0gUGlwZURldmljZU1vZGU7CisKKy8qID09PT09PT09PT09PSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IHN1cHBvcnQgPT09PT09PT09PT09CisgKgorICogQnkgZGVmYXVsdCwgYXNzdW1lIG9sZCBkZXZpY2UgYmVoYXZpb3Igd2hpY2gKKyAqIHVzZXMgZ3Vlc3QgdmlydHVhbCBhZGRyZXNzZXMgZm9yIHJlYWQvd3JpdGUgb3BlcmF0aW9ucy4KKyAqIE5ldyBkcml2ZXIgd2lsbCBjaGFuZ2UgdGhlIGRldmljZSBtb2RlIHRvIG9wZXJhdGUgd2l0aAorICogZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzc2VzIGJ5IHJlYWRpbmcgdGhlIHZlcnNpb24gcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBQaXBlRGV2aWNlTW9kZSBkZXZpY2VNb2RlID0gVVNFX1ZBOworCisvKiBNYXAgdGhlIGd1ZXN0IGJ1ZmZlciBpbnRvIGhvc3QgbWVtb3J5LgorICoKKyAqIEB4YWRkciAgICAtIEd1ZXN0IFZBIG9yIFBBIGRlcGVuZGluZyBvbiB0aGUgZHJpdmVyIHZlcnNpb24uCisgKiBAc2l6ZSAgICAgLSBTaXplIG9mIHRoZSBtYXBwaW5nCisgKiBAaXNfd3JpdGUgLSBJcyBpdCBhIHJlYWQgb3Igd3JpdGU/CisgKgorICogQFJldHVybiAtIFJldHVybiBhIGhvc3QgcG9pbnRlciB3aGljaCBzaG91bGQgYmUgdW5tYXBwZWQgbGF0ZXIgdmlhCisgKiBjcHVfcGh5c2ljYWxfbWVtb3J5X3VubWFwKCksIG9yIE5VTEwgaWYgbWFwcGluZyBmYWlsZWQKKyAqIChsaWtlbHkgYmVjYXVzZSB0aGUgcGFkZHIgZG9lc24ndCBhY3R1YWxseSBwb2ludCBhdCBSQU0pLgorICogTm90ZSB0aGF0IGZvciBSQU0gdGhlICJtYXBwaW5nIiBwcm9jZXNzIGRvZXNuJ3QgYWN0dWFsbHkgaW52b2x2ZSBhCisgKiBkYXRhIGNvcHkuCisgKi8KK3N0YXRpYyB2b2lkICptYXBfZ3Vlc3RfYnVmZmVyKHRhcmdldF91bG9uZyB4YWRkciwgc2l6ZV90IHNpemUsIGludCBpc193cml0ZSkKK3sKKyAgICBDUFVPbGRTdGF0ZSogZW52ID0gY3B1X3NpbmdsZV9lbnY7CisgICAgdGFyZ2V0X3Vsb25nIHBhZ2UgPSB4YWRkciAmIFRBUkdFVF9QQUdFX01BU0s7CisgICAgaHdhZGRyIGwgPSBzaXplOworICAgIGh3YWRkciBwaHlzID0geGFkZHI7CisgICAgdm9pZCAqcHRyOworCisgICAgaWYgKHVubGlrZWx5KGRldmljZU1vZGUgPT0gVVNFX1ZBKSkgeworICAgICAgICBwaHlzID0gc2FmZV9nZXRfcGh5c19wYWdlX2RlYnVnKEVOVl9HRVRfQ1BVKGVudiksIHBhZ2UpOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgcGh5cyA9IHBoeXMgJiBUQVJHRVRfUFRFX01BU0s7CisjZW5kaWYKKyAgICB9CisKKyAgICBwdHIgPSBjcHVfcGh5c2ljYWxfbWVtb3J5X21hcChwaHlzLCAmbCwgaXNfd3JpdGUpOworICAgIGlmICghcHRyKSB7CisgICAgICAgIC8qIENhbid0IGhhcHBlbiBmb3IgUkFNICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobCAhPSBzaXplKSB7CisgICAgICAgIC8qIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiBpZiB0aGUgYWRkcmVzcyBwb2ludGVkIGF0IG5vbi1SQU0sCisgICAgICAgICAqIG9yIGlmIHRoZSBzaXplIG1lYW5zIHRoZSBidWZmZXIgZW5kIGlzIGJleW9uZCB0aGUgZW5kIG9mCisgICAgICAgICAqIHRoZSBSQU0gYmxvY2suCisgICAgICAgICAqLworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3VubWFwKHB0ciwgbCwgMCwgMCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh1bmxpa2VseShkZXZpY2VNb2RlID09IFVTRV9WQSkpIHsKKyAgICAgICAgcHRyICs9IHhhZGRyIC0gcGFnZTsKKyAgICB9CisKKyAgICByZXR1cm4gcHRyOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9hbGxfcGlwZXModm9pZCogb3BhcXVlKSB7CisgICAgc3RydWN0IFBpcGVEZXZpY2UqIGRldiA9IG9wYXF1ZTsKKyAgICBId1BpcGUqIHBpcGUgPSBkZXYtPnBpcGVzOworICAgIHdoaWxlKHBpcGUpIHsKKyAgICAgICAgSHdQaXBlKiBvbGRfcGlwZSA9IHBpcGU7CisgICAgICAgIHBpcGUgPSBwaXBlLT5uZXh0OworICAgICAgICBod3BpcGVfcmVtb3ZlX3NpZ25hbGVkKCZkZXYtPnNpZ25hbGVkX3BpcGVzLCBvbGRfcGlwZSk7CisgICAgICAgIGh3cGlwZV9mcmVlKG9sZF9waXBlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X3BpcGVfZGV2aWNlKHZvaWQqIG9wYXF1ZSkgeworICAgIFBpcGVEZXZpY2UqIGRldiA9IG9wYXF1ZTsKKyAgICBkZXYtPnBpcGVzID0gTlVMTDsKKyAgICBkZXYtPnNpZ25hbGVkX3BpcGVzID0gTlVMTDsKKyAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmZGV2LT5kZXYsIDAsIDApOworfQorCitzdGF0aWMgdm9pZAorcGlwZURldmljZV9kb0NvbW1hbmQoIFBpcGVEZXZpY2UqIGRldiwgdWludDMyX3QgY29tbWFuZCApCit7CisgICAgSHdQaXBlKiogbG9va3VwID0gaHdwaXBlX2ZpbmRwX2J5X2NoYW5uZWwoJmRldi0+cGlwZXMsIGRldi0+Y2hhbm5lbCk7CisgICAgSHdQaXBlKiAgcGlwZSA9ICpsb29rdXA7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlJ3JlIHJlZmVycmluZyBhIGtub3duIHBpcGUgY2hhbm5lbCAqLworICAgIGlmIChjb21tYW5kICE9IFBJUEVfQ01EX09QRU4gJiYgcGlwZSA9PSBOVUxMKSB7CisgICAgICAgIGRldi0+c3RhdHVzID0gUElQRV9FUlJPUl9JTlZBTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIElmIHRoZSBwaXBlIGlzIGNsb3NlZCBieSB0aGUgaG9zdCwgcmV0dXJuIGFuIGVycm9yICovCisgICAgaWYgKHBpcGUgIT0gTlVMTCAmJiBwaXBlLT5jbG9zZWQgJiYgY29tbWFuZCAhPSBQSVBFX0NNRF9DTE9TRSkgeworICAgICAgICBkZXYtPnN0YXR1cyA9IFBJUEVfRVJST1JfSU87CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIFBJUEVfQ01EX09QRU46CisgICAgICAgIEREKCIlczogQ01EX09QRU4gY2hhbm5lbD0weCVsbHgiLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5jaGFubmVsKTsKKyAgICAgICAgaWYgKHBpcGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZGV2LT5zdGF0dXMgPSBQSVBFX0VSUk9SX0lOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcGlwZSA9IGh3cGlwZV9uZXcoZGV2LT5jaGFubmVsLCBkZXYpOworICAgICAgICBwaXBlLT5uZXh0ID0gZGV2LT5waXBlczsKKyAgICAgICAgZGV2LT5waXBlcyA9IHBpcGU7CisgICAgICAgIGRldi0+c3RhdHVzID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBJUEVfQ01EX0NMT1NFOgorICAgICAgICBERCgiJXM6IENNRF9DTE9TRSBjaGFubmVsPTB4JWxseCIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmNoYW5uZWwpOworICAgICAgICAvKiBSZW1vdmUgZnJvbSBkZXZpY2UncyBsaXN0cyAqLworICAgICAgICAqbG9va3VwID0gcGlwZS0+bmV4dDsKKyAgICAgICAgcGlwZS0+bmV4dCA9IE5VTEw7CisgICAgICAgIGh3cGlwZV9yZW1vdmVfc2lnbmFsZWQoJmRldi0+c2lnbmFsZWRfcGlwZXMsIHBpcGUpOworICAgICAgICBod3BpcGVfZnJlZShwaXBlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBJUEVfQ01EX1BPTEw6CisgICAgICBkZXYtPnN0YXR1cyA9IGFuZHJvaWRfcGlwZV9ndWVzdF9wb2xsKHBpcGUtPnBpcGUpOworICAgICAgREQoIiVzOiBDTURfUE9MTCA+IHN0YXR1cz0lZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5zdGF0dXMpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBJUEVfQ01EX1JFQURfQlVGRkVSOiB7CisgICAgICAgIC8qIE1hcCBndWVzdCBidWZmZXIgaWRlbnRpZmllZCBieSBkZXYtPmFkZHJlc3MKKyAgICAgICAgICogKGd1ZXN0IFBBIG9yIFZBIGRlcGVuZGluZyBvbiB0aGUgZHJpdmVyIHZlcnNpb24pCisgICAgICAgICAqIGludG8gaG9zdCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBBbmRyb2lkUGlwZUJ1ZmZlciAgYnVmZmVyOworICAgICAgICBidWZmZXIuZGF0YSA9IG1hcF9ndWVzdF9idWZmZXIoZGV2LT5hZGRyZXNzLCBkZXYtPnNpemUsIDEpOworICAgICAgICBpZiAoIWJ1ZmZlci5kYXRhKSB7CisgICAgICAgICAgICBkZXYtPnN0YXR1cyA9IFBJUEVfRVJST1JfSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuc2l6ZSA9IGRldi0+c2l6ZTsKKyAgICAgICAgZGV2LT5zdGF0dXMgPSBhbmRyb2lkX3BpcGVfZ3Vlc3RfcmVjdihwaXBlLT5waXBlLCAmYnVmZmVyLCAxKTsKKyAgICAgICAgREQoIiVzOiBDTURfUkVBRF9CVUZGRVIgY2hhbm5lbD0weCVsbHggYWRkcmVzcz0weCVsbHggc2l6ZT0lZCA+IHN0YXR1cz0lZCIsCisgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmNoYW5uZWwsICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5hZGRyZXNzLAorICAgICAgICAgICBkZXYtPnNpemUsIGRldi0+c3RhdHVzKTsKKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV91bm1hcChidWZmZXIuZGF0YSwgZGV2LT5zaXplLCAxLCBkZXYtPnNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIFBJUEVfQ01EX1dSSVRFX0JVRkZFUjogeworICAgICAgICAvKiBNYXAgZ3Vlc3QgYnVmZmVyIGlkZW50aWZpZWQgYnkgZGV2LT5hZGRyZXNzCisgICAgICAgICAqIChndWVzdCBQQSBvciBWQSBkZXBlbmRpbmcgb24gdGhlIGRyaXZlciB2ZXJzaW9uKQorICAgICAgICAgKiBpbnRvIGhvc3QgbWVtb3J5LgorICAgICAgICAgKi8KKyAgICAgICAgQW5kcm9pZFBpcGVCdWZmZXIgIGJ1ZmZlcjsKKyAgICAgICAgYnVmZmVyLmRhdGEgPSBtYXBfZ3Vlc3RfYnVmZmVyKGRldi0+YWRkcmVzcywgZGV2LT5zaXplLCAwKTsKKyAgICAgICAgaWYgKCFidWZmZXIuZGF0YSkgeworICAgICAgICAgICAgZGV2LT5zdGF0dXMgPSBQSVBFX0VSUk9SX0lOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLnNpemUgPSBkZXYtPnNpemU7CisgICAgICAgIGRldi0+c3RhdHVzID0gYW5kcm9pZF9waXBlX2d1ZXN0X3NlbmQocGlwZS0+cGlwZSwgJmJ1ZmZlciwgMSk7CisgICAgICAgIEREKCIlczogQ01EX1dSSVRFX0JVRkZFUiBjaGFubmVsPTB4JWxseCBhZGRyZXNzPTB4JWxseCBzaXplPSVkID4gc3RhdHVzPSVkIiwKKyAgICAgICAgICAgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+Y2hhbm5lbCwKKyAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPmFkZHJlc3MsCisgICAgICAgICAgIGRldi0+c2l6ZSwgZGV2LT5zdGF0dXMpOworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3VubWFwKGJ1ZmZlci5kYXRhLCBkZXYtPnNpemUsIDAsIGRldi0+c2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgUElQRV9DTURfV0FLRV9PTl9SRUFEOgorICAgICAgICBERCgiJXM6IENNRF9XQUtFX09OX1JFQUQgY2hhbm5lbD0weCVsbHgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5jaGFubmVsKTsKKyAgICAgICAgaWYgKChwaXBlLT53YWtlcyAmIFBJUEVfV0FLRV9SRUFEKSA9PSAwKSB7CisgICAgICAgICAgICBwaXBlLT53YWtlcyB8PSBQSVBFX1dBS0VfUkVBRDsKKyAgICAgICAgICAgIGFuZHJvaWRfcGlwZV9ndWVzdF93YWtlX29uKHBpcGUtPnBpcGUsIHBpcGUtPndha2VzKTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPnN0YXR1cyA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQSVBFX0NNRF9XQUtFX09OX1dSSVRFOgorICAgICAgICBERCgiJXM6IENNRF9XQUtFX09OX1dSSVRFIGNoYW5uZWw9MHglbGx4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+Y2hhbm5lbCk7CisgICAgICAgIGlmICgocGlwZS0+d2FrZXMgJiBQSVBFX1dBS0VfV1JJVEUpID09IDApIHsKKyAgICAgICAgICAgIHBpcGUtPndha2VzIHw9IFBJUEVfV0FLRV9XUklURTsKKyAgICAgICAgICAgIGFuZHJvaWRfcGlwZV9ndWVzdF93YWtlX29uKHBpcGUtPnBpcGUsIHBpcGUtPndha2VzKTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPnN0YXR1cyA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgRCgiJXM6IGNvbW1hbmQ9JWQgKDB4JXgpXG4iLCBfX0ZVTkNUSU9OX18sIGNvbW1hbmQsIGNvbW1hbmQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGlwZV9kZXZfd3JpdGUodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBQaXBlRGV2aWNlICpzID0gKFBpcGVEZXZpY2UgKilvcGFxdWU7CisKKyAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgIGNhc2UgUElQRV9SRUdfQ09NTUFORDoKKyAgICAgICAgRFIoIiVzOiBjb21tYW5kPSVkICgweCV4KSIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgcGlwZURldmljZV9kb0NvbW1hbmQocywgdmFsdWUpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgUElQRV9SRUdfU0laRToKKyAgICAgICAgRFIoIiVzOiBzaXplPSVkICgweCV4KSIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgcy0+c2l6ZSA9IHZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgUElQRV9SRUdfQUREUkVTUzoKKyAgICAgICAgRFIoIiVzOiBhZGRyZXNzPSVkICgweCV4KSIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgdWludDY0X3NldF9sb3coJnMtPmFkZHJlc3MsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBJUEVfUkVHX0FERFJFU1NfSElHSDoKKyAgICAgICAgRFIoIiVzOiBhZGRyZXNzX2hpZ2g9JWQgKDB4JXgpIiwgX19GVU5DVElPTl9fLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICB1aW50NjRfc2V0X2hpZ2goJnMtPmFkZHJlc3MsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBJUEVfUkVHX0NIQU5ORUw6CisgICAgICAgIERSKCIlczogY2hhbm5lbD0lZCAoMHgleCkiLCBfX0ZVTkNUSU9OX18sIHZhbHVlLCB2YWx1ZSk7CisgICAgICAgIHVpbnQ2NF9zZXRfbG93KCZzLT5jaGFubmVsLCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQSVBFX1JFR19DSEFOTkVMX0hJR0g6CisgICAgICAgIERSKCIlczogY2hhbm5lbF9oaWdoPSVkICgweCV4KSIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgdWludDY0X3NldF9oaWdoKCZzLT5jaGFubmVsLCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBQSVBFX1JFR19QQVJBTVNfQUREUl9ISUdIOgorICAgICAgICBzLT5wYXJhbXNfYWRkciA9IChzLT5wYXJhbXNfYWRkciAmIH4oMHhGRkZGRkZGRlVMTCA8PCAzMikgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpdmFsdWUgPDwgMzIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgUElQRV9SRUdfUEFSQU1TX0FERFJfTE9XOgorICAgICAgICBzLT5wYXJhbXNfYWRkciA9IChzLT5wYXJhbXNfYWRkciAmIH4oMHhGRkZGRkZGRlVMTCkgKSB8IHZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgUElQRV9SRUdfQUNDRVNTX1BBUkFNUzoKKyAgICB7CisgICAgICAgIHN0cnVjdCBhY2Nlc3NfcGFyYW1zIGFwczsKKyAgICAgICAgc3RydWN0IGFjY2Vzc19wYXJhbXNfNjQgYXBzNjQ7CisgICAgICAgIHVpbnQzMl90IGNtZDsKKworICAgICAgICAvKiBEb24ndCB0b3VjaCBhcHMucmVzdWx0IGlmIGFueXRoaW5nIHdyb25nICovCisgICAgICAgIGlmIChzLT5wYXJhbXNfYWRkciA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGdvbGRmaXNoX2d1ZXN0X2lzXzY0Yml0KCkpIHsKKyAgICAgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChzLT5wYXJhbXNfYWRkciwgKHZvaWQqKSZhcHM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXBzNjQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChzLT5wYXJhbXNfYWRkciwgKHZvaWQqKSZhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwcykpOworICAgICAgICB9CisgICAgICAgIC8qIHN5bmMgcGlwZSBkZXZpY2Ugc3RhdGUgZnJvbSBiYXRjaCBidWZmZXIgKi8KKyAgICAgICAgaWYgKGdvbGRmaXNoX2d1ZXN0X2lzXzY0Yml0KCkpIHsKKyAgICAgICAgICAgIHMtPmNoYW5uZWwgPSBhcHM2NC5jaGFubmVsOworICAgICAgICAgICAgcy0+c2l6ZSA9IGFwczY0LnNpemU7CisgICAgICAgICAgICBzLT5hZGRyZXNzID0gYXBzNjQuYWRkcmVzczsKKyAgICAgICAgICAgIGNtZCA9IGFwczY0LmNtZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmNoYW5uZWwgPSBhcHMuY2hhbm5lbDsKKyAgICAgICAgICAgIHMtPnNpemUgPSBhcHMuc2l6ZTsKKyAgICAgICAgICAgIHMtPmFkZHJlc3MgPSBhcHMuYWRkcmVzczsKKyAgICAgICAgICAgIGNtZCA9IGFwcy5jbWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbWQgIT0gUElQRV9DTURfUkVBRF9CVUZGRVIpICYmIChjbWQgIT0gUElQRV9DTURfV1JJVEVfQlVGRkVSKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHBpcGVEZXZpY2VfZG9Db21tYW5kKHMsIGNtZCk7CisgICAgICAgIGlmIChnb2xkZmlzaF9ndWVzdF9pc182NGJpdCgpKSB7CisgICAgICAgICAgICBhcHM2NC5yZXN1bHQgPSBzLT5zdGF0dXM7CisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKHMtPnBhcmFtc19hZGRyLCAodm9pZCopJmFwczY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXBzNjQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFwcy5yZXN1bHQgPSBzLT5zdGF0dXM7CisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKHMtPnBhcmFtc19hZGRyLCAodm9pZCopJmFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwcykpOworICAgICAgICB9CisgICAgfQorICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgRCgiJXM6IG9mZnNldD0lbGxkICgweCVsbHgpIHZhbHVlPSVsbGQgKDB4JWxseClcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAobG9uZyBsb25nKW9mZnNldCwgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpdmFsdWUsCisgICAgICAgICAgKGxvbmcgbG9uZyl2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogSS9PIHJlYWQgKi8KK3N0YXRpYyB1aW50MzJfdCBwaXBlX2Rldl9yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICBQaXBlRGV2aWNlICpkZXYgPSAoUGlwZURldmljZSAqKW9wYXF1ZTsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSBQSVBFX1JFR19TVEFUVVM6CisgICAgICAgIERSKCIlczogUkVHX1NUQVRVUyBzdGF0dXM9JWQgKDB4JXgpIiwgX19GVU5DVElPTl9fLCBkZXYtPnN0YXR1cywgZGV2LT5zdGF0dXMpOworICAgICAgICByZXR1cm4gZGV2LT5zdGF0dXM7CisKKyAgICBjYXNlIFBJUEVfUkVHX0NIQU5ORUw6CisgICAgICAgIGlmIChkZXYtPnNpZ25hbGVkX3BpcGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEh3UGlwZSogcGlwZSA9IGRldi0+c2lnbmFsZWRfcGlwZXM7CisgICAgICAgICAgICBEUigiJXM6IGNoYW5uZWw9MHglbGx4IHdha2VzPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwaXBlLT5jaGFubmVsLCBwaXBlLT53YWtlcyk7CisgICAgICAgICAgICBkZXYtPndha2VzID0gcGlwZS0+d2FrZXM7CisgICAgICAgICAgICBwaXBlLT53YWtlcyA9IDA7CisgICAgICAgICAgICBkZXYtPnNpZ25hbGVkX3BpcGVzID0gcGlwZS0+bmV4dF93YWtlZDsKKyAgICAgICAgICAgIHBpcGUtPm5leHRfd2FrZWQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGRldi0+c2lnbmFsZWRfcGlwZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZkZXYtPmRldiwgMCwgMCk7CisgICAgICAgICAgICAgICAgREQoIiVzOiBsb3dlcmluZyBJUlEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdCkocGlwZS0+Y2hhbm5lbCAmIDB4RkZGRkZGRkZVTCk7CisgICAgICAgIH0KKyAgICAgICAgRFIoIiVzOiBubyBzaWduYWxlZCBjaGFubmVscyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBQSVBFX1JFR19DSEFOTkVMX0hJR0g6CisgICAgICAgIGlmIChkZXYtPnNpZ25hbGVkX3BpcGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEh3UGlwZSogcGlwZSA9IGRldi0+c2lnbmFsZWRfcGlwZXM7CisgICAgICAgICAgICBEUigiJXM6IGNoYW5uZWxfaGlnaD0weCVsbHggd2FrZXM9JWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBpcGUtPmNoYW5uZWwsIHBpcGUtPndha2VzKTsKKyAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpKHBpcGUtPmNoYW5uZWwgPj4gMzIpOworICAgICAgICB9CisgICAgICAgIERSKCIlczogbm8gc2lnbmFsZWQgY2hhbm5lbHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgUElQRV9SRUdfV0FLRVM6CisgICAgICAgIERSKCIlczogd2FrZXMgJWQiLCBfX0ZVTkNUSU9OX18sIGRldi0+d2FrZXMpOworICAgICAgICByZXR1cm4gZGV2LT53YWtlczsKKworICAgIGNhc2UgUElQRV9SRUdfUEFSQU1TX0FERFJfSElHSDoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkoZGV2LT5wYXJhbXNfYWRkciA+PiAzMik7CisKKyAgICBjYXNlIFBJUEVfUkVHX1BBUkFNU19BRERSX0xPVzoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkoZGV2LT5wYXJhbXNfYWRkciAmIDB4RkZGRkZGRkZVTCk7CisKKyAgICBjYXNlIFBJUEVfUkVHX1ZFUlNJT046CisgICAgICAgIGRldmljZU1vZGUgPSBVU0VfUEE7CisgICAgICAgIC8vIFBJUEVfUkVHX1ZFUlNJT04gaXMgaXNzdWVkIG9uIHByb2JlLCB3aGljaCBtZWFucyB0aGF0CisgICAgICAgIC8vIHdlIHNob3VsZCBjbGVhbiB1cCBhbGwgZXhpc3Rpbmcgc3RhbGUgcGlwZXMuCisgICAgICAgIC8vIFRoaXMgaGVscHMga2VlcCB0aGUgcmlnaHQgc3RhdGUgb24gcmVib290aW5nLgorICAgICAgICBjbG9zZV9hbGxfcGlwZXMoZGV2KTsKKyAgICAgICAgcmVzZXRfcGlwZV9kZXZpY2UoZGV2KTsKKyAgICAgICAgcmV0dXJuIFBJUEVfREVWSUNFX1ZFUlNJT047CisKKyAgICBkZWZhdWx0OgorICAgICAgICBEKCIlczogb2Zmc2V0PSVsbGQgKDB4JWxseClcbiIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsCisgICAgICAgICAgKGxvbmcgbG9uZylvZmZzZXQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpwaXBlX2Rldl9yZWFkZm5bXSA9IHsKKyAgIHBpcGVfZGV2X3JlYWQsCisgICBwaXBlX2Rldl9yZWFkLAorICAgcGlwZV9kZXZfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqcGlwZV9kZXZfd3JpdGVmbltdID0geworICAgcGlwZV9kZXZfd3JpdGUsCisgICBwaXBlX2Rldl93cml0ZSwKKyAgIHBpcGVfZGV2X3dyaXRlCit9OworCitzdGF0aWMgdm9pZAorZ29sZGZpc2hfcGlwZV9zYXZlKCBRRU1VRmlsZSogZmlsZSwgdm9pZCogb3BhcXVlICkKK3sKKyAgICBQaXBlRGV2aWNlKiBkZXYgPSBvcGFxdWU7CisKKyAgICBTdHJlYW0qIHN0cmVhbSA9IHN0cmVhbV9mcm9tX3FlbXVmaWxlKGZpbGUpOworCisgICAgc3RyZWFtX3B1dF9iZTY0KHN0cmVhbSwgZGV2LT5hZGRyZXNzKTsKKyAgICBzdHJlYW1fcHV0X2JlMzIoc3RyZWFtLCBkZXYtPnNpemUpOworICAgIHN0cmVhbV9wdXRfYmUzMihzdHJlYW0sIGRldi0+c3RhdHVzKTsKKyAgICBzdHJlYW1fcHV0X2JlNjQoc3RyZWFtLCBkZXYtPmNoYW5uZWwpOworICAgIHN0cmVhbV9wdXRfYmUzMihzdHJlYW0sIGRldi0+d2FrZXMpOworICAgIHN0cmVhbV9wdXRfYmU2NChzdHJlYW0sIGRldi0+cGFyYW1zX2FkZHIpOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBwaXBlIGNvbm5lY3Rpb25zICovCisgICAgSHdQaXBlKiBwaXBlOworICAgIGludCBjb3VudCA9IDA7CisgICAgZm9yIChwaXBlID0gZGV2LT5waXBlczsgcGlwZTsgcGlwZSA9IHBpcGUtPm5leHQpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgc3RyZWFtX3B1dF9iZTMyKHN0cmVhbSwgY291bnQpOworCisgICAgLyogTm93IHNhdmUgZWFjaCBwaXBlIG9uZSBhZnRlciB0aGUgb3RoZXIgKi8KKyAgICBmb3IgKHBpcGUgPSBkZXYtPnBpcGVzOyBwaXBlOyBwaXBlID0gcGlwZS0+bmV4dCkgeworICAgICAgICBod3BpcGVfc2F2ZShwaXBlLCBzdHJlYW0pOworICAgIH0KKyAgICBzdHJlYW1fZnJlZShzdHJlYW0pOworfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9waXBlX3dha2Uodm9pZCogaHdwaXBlLCB1bnNpZ25lZCBmbGFncyk7ICAvLyBmb3J3YXJkCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9waXBlX2Nsb3NlKHZvaWQqIGh3cGlwZSk7ICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkCisKK3N0YXRpYyBpbnQKK2dvbGRmaXNoX3BpcGVfbG9hZCggUUVNVUZpbGUqIGZpbGUsIHZvaWQqIG9wYXF1ZSwgaW50IHZlcnNpb25faWQgKQoreworICAgIFBpcGVEZXZpY2UqIGRldiA9IG9wYXF1ZTsKKworICAgIGlmICgodmVyc2lvbl9pZCAhPSBHT0xERklTSF9QSVBFX1NBVkVfVkVSU0lPTikgJiYKKyAgICAgICAgKHZlcnNpb25faWQgIT0gR09MREZJU0hfUElQRV9TQVZFX0xFR0FDWV9WRVJTSU9OKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBTdHJlYW0qIHN0cmVhbSA9IHN0cmVhbV9mcm9tX3FlbXVmaWxlKGZpbGUpOworCisgICAgZGV2LT5hZGRyZXNzID0gc3RyZWFtX2dldF9iZTY0KHN0cmVhbSk7CisgICAgZGV2LT5zaXplICAgID0gc3RyZWFtX2dldF9iZTMyKHN0cmVhbSk7CisgICAgZGV2LT5zdGF0dXMgID0gc3RyZWFtX2dldF9iZTMyKHN0cmVhbSk7CisgICAgZGV2LT5jaGFubmVsID0gc3RyZWFtX2dldF9iZTY0KHN0cmVhbSk7CisKKyAgICBkZXYtPndha2VzID0gc3RyZWFtX2dldF9iZTMyKHN0cmVhbSk7CisgICAgZGV2LT5wYXJhbXNfYWRkciA9IHN0cmVhbV9nZXRfYmU2NChzdHJlYW0pOworCisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBwaXBlIGNvbm5lY3Rpb25zICovCisgICAgSHdQaXBlKiBwaXBlOworICAgIGludCBjb3VudCA9IHN0cmVhbV9nZXRfYmUzMihzdHJlYW0pOworCisgICAgLyogTG9hZCBhbGwgcGlwZSBjb25uZWN0aW9ucyAqLworICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAgICAgcGlwZSA9IGh3cGlwZV9sb2FkKGRldiwgc3RyZWFtLCB2ZXJzaW9uX2lkKTsKKyAgICAgICAgaWYgKHBpcGUgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RyZWFtX2ZyZWUoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlPOworICAgICAgICB9CisgICAgICAgIHBpcGUtPm5leHQgPSBkZXYtPnBpcGVzOworICAgICAgICBkZXYtPnBpcGVzID0gcGlwZTsKKyAgICB9CisKKyAgICAvKiBOb3cgd2UgbmVlZCB0byB3YWtlL2Nsb3NlIGFsbCByZWxldmFudCBwaXBlcyAqLworICAgIGZvciAocGlwZSA9IGRldi0+cGlwZXM7IHBpcGU7IHBpcGUgPSBwaXBlLT5uZXh0KSB7CisgICAgICAgIGlmIChwaXBlLT53YWtlcyAhPSAwKSB7CisgICAgICAgICAgZ29sZGZpc2hfcGlwZV93YWtlKHBpcGUsIHBpcGUtPndha2VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGlwZS0+Y2xvc2VkICE9IDApIHsKKyAgICAgICAgICBnb2xkZmlzaF9waXBlX2Nsb3NlKHBpcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyZWFtX2ZyZWUoc3RyZWFtKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ29sZGZpc2hfcGlwZV9yZXNldCh2b2lkKiBod3BpcGUsIHZvaWQqIGludGVybmFsX3BpcGUpIHsKKyAgICBId1BpcGUqICBwaXBlID0gaHdwaXBlOworICAgIHBpcGUtPnBpcGUgPSBpbnRlcm5hbF9waXBlOworfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF9waXBlX3dha2Uodm9pZCogaHdwaXBlLCB1bnNpZ25lZCBmbGFncykgeworICAgIEh3UGlwZSogIHBpcGUgPSBod3BpcGU7CisgICAgSHdQaXBlKiogbG9va3VwOworICAgIFBpcGVEZXZpY2UqICBkZXYgPSBwaXBlLT5kZXZpY2U7CisKKyAgICBERCgiJXM6IGNoYW5uZWw9MHglbGx4IGZsYWdzPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcGlwZS0+Y2hhbm5lbCwgZmxhZ3MpOworCisgICAgLyogSWYgbm90IGFscmVhZHkgdGhlcmUsIGFkZCB0byB0aGUgbGlzdCBvZiBzaWduYWxlZCBwaXBlcyAqLworICAgIGxvb2t1cCA9IGh3cGlwZV9maW5kcF9zaWduYWxlZCgmZGV2LT5zaWduYWxlZF9waXBlcywgcGlwZSk7CisgICAgaWYgKCEqbG9va3VwKSB7CisgICAgICAgIHBpcGUtPm5leHRfd2FrZWQgPSBkZXYtPnNpZ25hbGVkX3BpcGVzOworICAgICAgICBkZXYtPnNpZ25hbGVkX3BpcGVzID0gcGlwZTsKKyAgICB9CisgICAgcGlwZS0+d2FrZXMgfD0gKHVuc2lnbmVkKWZsYWdzOworCisgICAgLyogUmFpc2UgSVJRIHRvIGluZGljYXRlIHRoZXJlIGFyZSBpdGVtcyBvbiBvdXIgbGlzdCAhICovCisgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJmRldi0+ZGV2LCAwLCAxKTsKKyAgICBERCgiJXM6IHJhaXNpbmcgSVJRIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgZ29sZGZpc2hfcGlwZV9jbG9zZSh2b2lkKiBod3BpcGUpIHsKKyAgICBId1BpcGUqIHBpcGUgPSBod3BpcGU7CisKKyAgICBEKCIlczogY2hhbm5lbD0weCVsbHggKGNsb3NlZD0lZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBpcGUtPmNoYW5uZWwsIHBpcGUtPmNsb3NlZCk7CisKKyAgICBwaXBlLT5jbG9zZWQgPSAxOworICAgIGdvbGRmaXNoX3BpcGVfd2FrZShod3BpcGUsIFBJUEVfV0FLRV9DTE9TRUQpOworfQorCitzdGF0aWMgY29uc3QgQW5kcm9pZFBpcGVId0Z1bmNzIGdvbGRmaXNoX3BpcGVfaHdfZnVuY3MgPSB7CisgICAgLnJlc2V0UGlwZSA9IGdvbGRmaXNoX3BpcGVfcmVzZXQsCisgICAgLmNsb3NlRnJvbUhvc3QgPSBnb2xkZmlzaF9waXBlX2Nsb3NlLAorICAgIC5zaWduYWxXYWtlID0gZ29sZGZpc2hfcGlwZV93YWtlLAorfTsKKworLyogaW5pdGlhbGl6ZSB0aGUgdHJhY2UgZGV2aWNlICovCit2b2lkIHBpcGVfZGV2X2luaXQoYm9vbCBuZXdEZXZpY2VOYW1pbmcpCit7CisgICAgUGlwZURldmljZSAqczsKKworICAgIHMgPSAoUGlwZURldmljZSAqKSBnX21hbGxvYzAoc2l6ZW9mKCpzKSk7CisKKyAgICBzLT5kZXYubmFtZSA9IG5ld0RldmljZU5hbWluZyA/ICJnb2xkZmlzaF9waXBlIiA6ICJxZW11X3BpcGUiOworICAgIHMtPmRldi5pZCA9IC0xOworICAgIHMtPmRldi5iYXNlID0gMDsgICAgICAgLy8gd2lsbCBiZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkKKyAgICBzLT5kZXYuc2l6ZSA9IDB4MjAwMDsKKyAgICBzLT5kZXYuaXJxID0gMDsKKyAgICBzLT5kZXYuaXJxX2NvdW50ID0gMTsKKworICAgIGdvbGRmaXNoX2RldmljZV9hZGQoJnMtPmRldiwgcGlwZV9kZXZfcmVhZGZuLCBwaXBlX2Rldl93cml0ZWZuLCBzKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfcGlwZSIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX1BJUEVfU0FWRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9waXBlX3NhdmUsCisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX3BpcGVfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgcyk7CisKKyAgICBhbmRyb2lkX3BpcGVfc2V0X2h3X2Z1bmNzKCZnb2xkZmlzaF9waXBlX2h3X2Z1bmNzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC9wcm9maWxlLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzMwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvcHJvZmlsZS5jCkBAIC0wLDAgKzEsMjU5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL3Byb2ZpbGUuaCIKKyNpbmNsdWRlICJleGVjL2NvZGUtcHJvZmlsZS5oIgorI2luY2x1ZGUgImNwdS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBTQU1QTEVfUEVSSU9EIDEwMDAwMDAKKyNkZWZpbmUgU0FNUExFX0JVUlNUIDEwMAorI2RlZmluZSBPVVRQVVRfVEhSRVNIT0xEIDEwMAorCit0eXBlZGVmIHN0cnVjdCBNbWFwRGF0YSB7CisgIHRhcmdldF91bG9uZyBzdGFydDsKKyAgdGFyZ2V0X3Vsb25nIGVuZDsKKyAgdGFyZ2V0X3Vsb25nIG9mZnNldDsKKyAgY2hhciAqbmFtZTsKKyAgc3RydWN0IE1tYXBEYXRhICpuZXh0OworfSBNbWFwRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VQcm9maWxlIHsKKyAgdWludDY0X3Qgc3RhcnQ7CisgIHVpbnQ2NF90IHNpemU7CisgIHVpbnQ2NF90IGNvdW50OworICBzdHJ1Y3QgUmFuZ2VQcm9maWxlICpuZXh0OworfSBSYW5nZVByb2ZpbGU7CisKK3R5cGVkZWYgc3RydWN0IEJyYW5jaFByb2ZpbGUgeworICB1aW50NjRfdCBmcm9tOworICB1aW50NjRfdCB0bzsKKyAgdWludDY0X3QgY291bnQ7CisgIHN0cnVjdCBCcmFuY2hQcm9maWxlICpuZXh0OworfSBCcmFuY2hQcm9maWxlOworCit0eXBlZGVmIHN0cnVjdCBCaW5hcnlQcm9maWxlIHsKKyAgY2hhciAqbmFtZTsKKyAgUmFuZ2VQcm9maWxlICpyYW5nZTsKKyAgQnJhbmNoUHJvZmlsZSAqYnJhbmNoOworICBzdHJ1Y3QgQmluYXJ5UHJvZmlsZSAqbmV4dDsKK30gQmluYXJ5UHJvZmlsZTsKKworZXh0ZXJuIHVuc2lnbmVkIGdldF9jdXJyZW50X3BpZCgpOworCitzdGF0aWMgTW1hcERhdGEgKm1tYXBzWzY1NTM2XTsKK3N0YXRpYyBCaW5hcnlQcm9maWxlICpoZWFkX2JpbmFyeSA9IE5VTEw7CisKKyNkZWZpbmUgQlVGX1NJWkUgNDA5NgorCitzdGF0aWMgdm9pZCBkdW1wX3Byb2ZpbGUoKSB7CisgIEJpbmFyeVByb2ZpbGUgKmN1cnIgPSBoZWFkX2JpbmFyeTsKKyAgaW50IGxlbiA9IHN0cmxlbihjb2RlX3Byb2ZpbGVfZGlybmFtZSk7CisgIGNoYXIgZmlsZW5hbWVbQlVGX1NJWkVdOworICBhc3NlcnQobGVuICsgMiA8IEJVRl9TSVpFKTsKKyAgc3RyY3B5KGZpbGVuYW1lLCBjb2RlX3Byb2ZpbGVfZGlybmFtZSk7CisgIGZpbGVuYW1lW2xlbl0gPSAnLyc7CisgIGZpbGVuYW1lW2xlbiArIDFdID0gMDsKKworICB3aGlsZSAoY3VycikgeworICAgIGNoYXIgKmk7CisKKyAgICBhc3NlcnQobGVuICsgc3RybGVuKGN1cnItPm5hbWUpICsgMiA8IEJVRl9TSVpFKTsKKyAgICBzdHJjcHkoZmlsZW5hbWUgKyBsZW4gKyAxLCBjdXJyLT5uYW1lKTsKKyAgICBmb3IgKGkgPSBmaWxlbmFtZSArIGxlbiArIDE7ICppOyBpKyspIHsKKyAgICAgIGlmICgqaSA9PSAnLycpCisgICAgICAgICppID0gJ18nOworICAgIH0KKyAgICAqaSA9ICcuJzsKKyAgICAqKGkgKyAxKSA9ICd0JzsKKyAgICAqKGkgKyAyKSA9ICd4JzsKKyAgICAqKGkgKyAzKSA9ICd0JzsKKyAgICAqKGkgKyA0KSA9IDA7CisgICAgRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworCisgICAgUmFuZ2VQcm9maWxlICpyID0gY3Vyci0+cmFuZ2U7CisgICAgaW50IHJhbmdlX3NpemUgPSAwOworICAgIHdoaWxlIChyKSB7CisgICAgICByYW5nZV9zaXplKys7CisgICAgICByID0gci0+bmV4dDsKKyAgICB9CisgICAgZnByaW50ZihmLCAiJWRcbiIsIHJhbmdlX3NpemUpOworICAgIHIgPSBjdXJyLT5yYW5nZTsKKyAgICB3aGlsZSAocikgeworICAgICAgZnByaW50ZihmLCAiJWxseC0lbGx4OiVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpci0+c3RhcnQsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHItPnN0YXJ0ICsgci0+c2l6ZSksCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpci0+Y291bnQpOworICAgICAgciA9IHItPm5leHQ7CisgICAgfQorCisgICAgZnByaW50ZihmLCAiJWRcbiIsIHJhbmdlX3NpemUpOworICAgIHIgPSBjdXJyLT5yYW5nZTsKKyAgICB3aGlsZSAocikgeworICAgICAgZnByaW50ZihmLCAiJWxseDolbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXItPnN0YXJ0LAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXItPmNvdW50KTsKKyAgICAgIHIgPSByLT5uZXh0OworICAgIH0KKworICAgIEJyYW5jaFByb2ZpbGUgKmIgPSBjdXJyLT5icmFuY2g7CisgICAgaW50IGJyYW5jaF9zaXplID0gMDsKKyAgICB3aGlsZSAoYikgeworICAgICAgYnJhbmNoX3NpemUrKzsKKyAgICAgIGIgPSBiLT5uZXh0OworICAgIH0KKyAgICBmcHJpbnRmKGYsICIlZFxuIiwgYnJhbmNoX3NpemUpOworICAgIGIgPSBjdXJyLT5icmFuY2g7CisgICAgd2hpbGUgKGIpIHsKKyAgICAgIGZwcmludGYoZiwgIiVsbHgtPiVsbHg6JWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliLT5mcm9tLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWItPnRvLCAodW5zaWduZWQgbG9uZyBsb25nKWItPmNvdW50KTsKKyAgICAgIGIgPSBiLT5uZXh0OworICAgIH0KKyAgICBmY2xvc2UoZik7CisgICAgY3VyciA9IGN1cnItPm5leHQ7CisgIH0KK30KKworc3RhdGljIEJpbmFyeVByb2ZpbGUgKmdldF9iaW5hcnlfcHJvZmlsZShjb25zdCBjaGFyICpuYW1lKSB7CisgIEJpbmFyeVByb2ZpbGUgKmN1cnIgPSBoZWFkX2JpbmFyeTsKKyAgd2hpbGUgKGN1cnIpIHsKKyAgICBpZiAoIXN0cmNtcChjdXJyLT5uYW1lLCBuYW1lKSkgeworICAgICAgcmV0dXJuIGN1cnI7CisgICAgfQorICAgIGN1cnIgPSBjdXJyLT5uZXh0OworICB9CisgIGN1cnIgPSAoQmluYXJ5UHJvZmlsZSAqKW1hbGxvYyhzaXplb2YoQmluYXJ5UHJvZmlsZSkpOworICBjdXJyLT5uYW1lID0gc3RyZHVwKG5hbWUpOworICBjdXJyLT5yYW5nZSA9IE5VTEw7CisgIGN1cnItPmJyYW5jaCA9IE5VTEw7CisgIGN1cnItPm5leHQgPSBoZWFkX2JpbmFyeTsKKyAgaGVhZF9iaW5hcnkgPSBjdXJyOworICByZXR1cm4gY3VycjsKK30KKworc3RhdGljIHZvaWQgYWRkX2JyYW5jaF9jb3VudChCaW5hcnlQcm9maWxlICpwcm9maWxlLCB0YXJnZXRfdWxvbmcgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHRvKSB7CisgIEJyYW5jaFByb2ZpbGUgKmN1cnIgPSBwcm9maWxlLT5icmFuY2g7CisgIHdoaWxlIChjdXJyKSB7CisgICAgaWYgKGN1cnItPmZyb20gPT0gZnJvbSAmJiBjdXJyLT50byA9PSB0bykgeworICAgICAgY3Vyci0+Y291bnQrKzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3VyciA9IGN1cnItPm5leHQ7CisgIH0KKyAgQnJhbmNoUHJvZmlsZSAqYiA9IChCcmFuY2hQcm9maWxlICopbWFsbG9jKHNpemVvZihCcmFuY2hQcm9maWxlKSk7CisgIGItPmZyb20gPSBmcm9tOworICBiLT50byA9IHRvOworICBiLT5jb3VudCA9IDE7CisgIGItPm5leHQgPSBwcm9maWxlLT5icmFuY2g7CisgIHByb2ZpbGUtPmJyYW5jaCA9IGI7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9yYW5nZV9jb3VudChCaW5hcnlQcm9maWxlICpwcm9maWxlLCB0YXJnZXRfdWxvbmcgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHNpemUpIHsKKyAgUmFuZ2VQcm9maWxlICpjdXJyID0gcHJvZmlsZS0+cmFuZ2U7CisgIHdoaWxlIChjdXJyKSB7CisgICAgaWYgKGN1cnItPnN0YXJ0ID09IHN0YXJ0ICYmIGN1cnItPnNpemUgPT0gc2l6ZSkgeworICAgICAgY3Vyci0+Y291bnQrKzsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY3VyciA9IGN1cnItPm5leHQ7CisgIH0KKyAgUmFuZ2VQcm9maWxlICpyID0gKFJhbmdlUHJvZmlsZSAqKW1hbGxvYyhzaXplb2YoUmFuZ2VQcm9maWxlKSk7CisgIHItPnN0YXJ0ID0gc3RhcnQ7CisgIHItPnNpemUgPSBzaXplOworICByLT5jb3VudCA9IDE7CisgIHItPm5leHQgPSBwcm9maWxlLT5yYW5nZTsKKyAgcHJvZmlsZS0+cmFuZ2UgPSByOworfQorCitzdGF0aWMgY29uc3QgTW1hcERhdGEgKmdldF9tbWFwX2RhdGEodGFyZ2V0X3Vsb25nIHBjLCBpbnQgcGlkKSB7CisgIGNvbnN0IE1tYXBEYXRhICpkYXRhID0gbW1hcHNbcGlkXTsKKyAgd2hpbGUgKGRhdGEpIHsKKyAgICBpZiAocGMgPj0gZGF0YS0+c3RhcnQgJiYgcGMgPCBkYXRhLT5lbmQpIHsKKyAgICAgIHJldHVybiBkYXRhOworICAgIH0KKyAgICBkYXRhID0gZGF0YS0+bmV4dDsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKwordm9pZCByZWNvcmRfbW1hcCh0YXJnZXRfdWxvbmcgdnN0YXJ0LCB0YXJnZXRfdWxvbmcgdmVuZCwgdGFyZ2V0X3Vsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgcGlkKSB7CisgIE1tYXBEYXRhICpkYXRhID0gKE1tYXBEYXRhICopbWFsbG9jKHNpemVvZihNbWFwRGF0YSkpOworICBkYXRhLT5zdGFydCA9IHZzdGFydDsKKyAgZGF0YS0+ZW5kID0gdmVuZDsKKyAgZGF0YS0+b2Zmc2V0ID0gb2Zmc2V0OworICBkYXRhLT5uYW1lID0gc3RyZHVwKHBhdGgpOworICBkYXRhLT5uZXh0ID0gbW1hcHNbcGlkXTsKKyAgbW1hcHNbcGlkXSA9IGRhdGE7Cit9CisKK3ZvaWQgcmVsZWFzZV9tbWFwKHVuc2lnbmVkIHBpZCkgeworICBNbWFwRGF0YSAqY3VyciA9IG1tYXBzW3BpZF07CisgIHdoaWxlIChjdXJyKSB7CisgICAgTW1hcERhdGEgKm5leHQgPSBjdXJyLT5uZXh0OworICAgIGZyZWUoY3Vyci0+bmFtZSk7CisgICAgZnJlZShjdXJyKTsKKyAgICBjdXJyID0gbmV4dDsKKyAgfQorICBtbWFwc1twaWRdID0gMDsKK30KKwordm9pZCBwcm9maWxlX2JiX2hlbHBlcih0YXJnZXRfdWxvbmcgcGMsIHVpbnQzMl90IHNpemUpIHsKKyAgc3RhdGljIGludCBiYl9jb3VudGVyID0gMDsKKyAgc3RhdGljIGludCBvdXRwdXRfY291bnRlciA9IDA7CisgIHN0YXRpYyBpbnQgcHJldl9waWQ7CisgIHN0YXRpYyBjb25zdCBNbWFwRGF0YSAqcHJldl9tbWFwOworICBzdGF0aWMgdGFyZ2V0X3Vsb25nIHByZXZfcGM7CisgIHN0YXRpYyBCaW5hcnlQcm9maWxlICpjdXJyX3Byb2ZpbGU7CisgIGlmIChjb2RlX3Byb2ZpbGVfZGlybmFtZSA9PSBOVUxMKQorICAgIHJldHVybjsKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICAvKiBwYyArIHNpemUgaXMgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJiLCB3aGljaCBkb2VzIG5vdCBiZWxvbmcgdG8gdGhlCisgICAgIGN1cnJlbnQgYmIuIFdlIGRlY3JlbWVudCBzaXplIGJ5IDEgdG8gbWFrZSBzdXJlIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgICAgcmFuZ2Ugb2YgW3BjLCBwYytzaXplXSBhbGwgYmVsb25nIHRvIHRoZSBjdXJyZW50IGJiLiAgKi8KKyAgc2l6ZS0tOworICBpZiAoYmJfY291bnRlcisrID09IFNBTVBMRV9QRVJJT0QpIHsKKyAgICBwcmV2X3BpZCA9IGdldF9jdXJyZW50X3BpZCgpOworICAgIHByZXZfbW1hcCA9IGdldF9tbWFwX2RhdGEocGMsIHByZXZfcGlkKTsKKyAgICBpZiAocHJldl9tbWFwID09IE5VTEwpIHsKKyAgICAgIGJiX2NvdW50ZXIgPSAwOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwcmV2X3BjID0gcGMgKyBzaXplOworICAgIGN1cnJfcHJvZmlsZSA9IGdldF9iaW5hcnlfcHJvZmlsZShwcmV2X21tYXAtPm5hbWUpOworCisgICAgaWYgKG91dHB1dF9jb3VudGVyKysgPT0gT1VUUFVUX1RIUkVTSE9MRCkgeworICAgICAgZHVtcF9wcm9maWxlKCk7CisgICAgICBvdXRwdXRfY291bnRlciA9IDA7CisgICAgfQorICB9IGVsc2UgaWYgKGJiX2NvdW50ZXIgPiBTQU1QTEVfUEVSSU9EKSB7CisgICAgaWYgKGJiX2NvdW50ZXIgPiBTQU1QTEVfUEVSSU9EICsgU0FNUExFX0JVUlNUIHx8CisgICAgICAgIGdldF9jdXJyZW50X3BpZCgpICE9IHByZXZfcGlkKSB7CisgICAgICBiYl9jb3VudGVyID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgTW1hcERhdGEgKmRhdGEgPSBnZXRfbW1hcF9kYXRhKHBjLCBwcmV2X3BpZCk7CisgICAgaWYgKGRhdGEgIT0gcHJldl9tbWFwKSB7CisgICAgICBiYl9jb3VudGVyID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYWRkX3JhbmdlX2NvdW50KGN1cnJfcHJvZmlsZSwgcGMgKyBkYXRhLT5vZmZzZXQgLSBkYXRhLT5zdGFydCwgc2l6ZSk7CisgICAgYWRkX2JyYW5jaF9jb3VudChjdXJyX3Byb2ZpbGUsIHByZXZfcGMgKyBkYXRhLT5vZmZzZXQgLSBkYXRhLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIHBjICsgZGF0YS0+b2Zmc2V0IC0gZGF0YS0+c3RhcnQpOworICAgIHByZXZfcGMgPSBwYyArIHNpemU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC90aW1lci5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkZDhhNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC90aW1lci5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaHcvYXJtL3BpYy5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKworZW51bSB7CisgICAgVElNRVJfVElNRV9MT1cgICAgICAgICAgPSAweDAwLCAvLyBnZXQgbG93IGJpdHMgb2YgY3VycmVudCB0aW1lIGFuZCB1cGRhdGUgVElNRVJfVElNRV9ISUdICisgICAgVElNRVJfVElNRV9ISUdIICAgICAgICAgPSAweDA0LCAvLyBnZXQgaGlnaCBiaXRzIG9mIHRpbWUgYXQgbGFzdCBUSU1FUl9USU1FX0xPVyByZWFkCisgICAgVElNRVJfQUxBUk1fTE9XICAgICAgICAgPSAweDA4LCAvLyBzZXQgbG93IGJpdHMgb2YgYWxhcm0gYW5kIGFjdGl2YXRlIGl0CisgICAgVElNRVJfQUxBUk1fSElHSCAgICAgICAgPSAweDBjLCAvLyBzZXQgaGlnaCBiaXRzIG9mIG5leHQgYWxhcm0KKyAgICBUSU1FUl9DTEVBUl9JTlRFUlJVUFQgICA9IDB4MTAsCisgICAgVElNRVJfQ0xFQVJfQUxBUk0gICAgICAgPSAweDE0Cit9OworCitzdHJ1Y3QgdGltZXJfc3RhdGUgeworICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgZGV2OworICAgIHVpbnQzMl90IGFsYXJtX2xvd19uczsKKyAgICBpbnQzMl90IGFsYXJtX2hpZ2hfbnM7CisgICAgaW50NjRfdCBub3dfbnM7CisgICAgaW50ICAgICBhcm1lZDsKKyAgICBRRU1VVGltZXIgKnRpbWVyOworfTsKKworI2RlZmluZSAgR09MREZJU0hfVElNRVJfU0FWRV9WRVJTSU9OICAxCisKK3N0YXRpYyB2b2lkICBnb2xkZmlzaF90aW1lcl9zYXZlKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgdGltZXJfc3RhdGUqICBzICAgPSBvcGFxdWU7CisKKyAgICBxZW11X3B1dF9iZTY0KGYsIHMtPm5vd19ucyk7ICAvKiBpbiBjYXNlIHRoZSBrZXJuZWwgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHRpbWVyIHJlYWQgKi8KKyAgICBxZW11X3B1dF9ieXRlKGYsIHMtPmFybWVkKTsKKyAgICBpZiAocy0+YXJtZWQpIHsKKyAgICAgICAgaW50NjRfdCAgbm93X25zICAgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgICAgICBpbnQ2NF90ICBhbGFybV9ucyA9IChzLT5hbGFybV9sb3dfbnMgfCAoaW50NjRfdClzLT5hbGFybV9oaWdoX25zIDw8IDMyKTsKKyAgICAgICAgcWVtdV9wdXRfYmU2NChmLCBhbGFybV9ucyAtIG5vd19ucyk7CisgICAgfQorfQorCitzdGF0aWMgaW50ICBnb2xkZmlzaF90aW1lcl9sb2FkKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSwgaW50ICB2ZXJzaW9uX2lkKQoreworICAgIHN0cnVjdCB0aW1lcl9zdGF0ZSogIHMgICA9IG9wYXF1ZTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IEdPTERGSVNIX1RJTUVSX1NBVkVfVkVSU0lPTikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcy0+bm93X25zID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICBzLT5hcm1lZCAgPSBxZW11X2dldF9ieXRlKGYpOworICAgIGlmIChzLT5hcm1lZCkgeworICAgICAgICBpbnQ2NF90ICBub3dfdGtzICAgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgICAgICBpbnQ2NF90ICBkaWZmX3RrcyAgPSBxZW11X2dldF9iZTY0KGYpOworICAgICAgICBpbnQ2NF90ICBhbGFybV90a3MgPSBub3dfdGtzICsgZGlmZl90a3M7CisKKyAgICAgICAgaWYgKGFsYXJtX3RrcyA8PSBub3dfdGtzKSB7CisgICAgICAgICAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAxKTsKKyAgICAgICAgICAgIHMtPmFybWVkID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpbWVyX21vZChzLT50aW1lciwgYWxhcm1fdGtzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX3RpbWVyX3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHN0cnVjdCB0aW1lcl9zdGF0ZSAqcyA9IChzdHJ1Y3QgdGltZXJfc3RhdGUgKilvcGFxdWU7CisgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIFRJTUVSX1RJTUVfTE9XOgorICAgICAgICAgICAgcy0+bm93X25zID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKTsKKyAgICAgICAgICAgIHJldHVybiBzLT5ub3dfbnM7CisgICAgICAgIGNhc2UgVElNRVJfVElNRV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIHMtPm5vd19ucyA+PiAzMjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfdGltZXJfcmVhZDogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX3RpbWVyX3dyaXRlKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCwgdWludDMyX3QgdmFsdWVfbnMpCit7CisgICAgc3RydWN0IHRpbWVyX3N0YXRlICpzID0gKHN0cnVjdCB0aW1lcl9zdGF0ZSAqKW9wYXF1ZTsKKyAgICBpbnQ2NF90IGFsYXJtX25zLCBub3dfbnM7CisgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIFRJTUVSX0FMQVJNX0xPVzoKKyAgICAgICAgICAgIHMtPmFsYXJtX2xvd19ucyA9IHZhbHVlX25zOworICAgICAgICAgICAgYWxhcm1fbnMgPSAocy0+YWxhcm1fbG93X25zIHwgKGludDY0X3Qpcy0+YWxhcm1faGlnaF9ucyA8PCAzMik7CisgICAgICAgICAgICBub3dfbnMgICA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgICAgICAgICBpZiAoYWxhcm1fbnMgPD0gbm93X25zKSB7CisgICAgICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVyX21vZChzLT50aW1lciwgYWxhcm1fbnMpOworICAgICAgICAgICAgICAgIHMtPmFybWVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRJTUVSX0FMQVJNX0hJR0g6CisgICAgICAgICAgICBzLT5hbGFybV9oaWdoX25zID0gdmFsdWVfbnM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUSU1FUl9DTEVBUl9BTEFSTToKKyAgICAgICAgICAgIHRpbWVyX2RlbChzLT50aW1lcik7CisgICAgICAgICAgICBzLT5hcm1lZCA9IDA7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSBUSU1FUl9DTEVBUl9JTlRFUlJVUFQ6CisgICAgICAgICAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF90aW1lcl93cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF90aW1lcl90aWNrKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgdGltZXJfc3RhdGUgKnMgPSAoc3RydWN0IHRpbWVyX3N0YXRlICopb3BhcXVlOworCisgICAgcy0+YXJtZWQgPSAwOworICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDEpOworfQorCitzdHJ1Y3QgcnRjX3N0YXRlIHsKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIGRldjsKKyAgICB1aW50MzJfdCBhbGFybV9sb3c7CisgICAgaW50MzJfdCBhbGFybV9oaWdoOworICAgIGludDY0X3Qgbm93OworfTsKKworLyogd2Ugc2F2ZSB0aGUgUlRDIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUga2VybmVsIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBydGNfcmVhZAorICogKGkuZS4gaXQgaGFzIHJlYWQgdGhlIGxvdyAzMi1iaXQgb2Ygcy0+bm93LCBidXQgbm90IHRoZSBoaWdoIDMyLWJpdHMgeWV0ICovCisjZGVmaW5lICBHT0xERklTSF9SVENfU0FWRV9WRVJTSU9OICAxCisKK3N0YXRpYyB2b2lkICBnb2xkZmlzaF9ydGNfc2F2ZShRRU1VRmlsZSogIGYsIHZvaWQqICBvcGFxdWUpCit7CisgICAgc3RydWN0IHJ0Y19zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBxZW11X3B1dF9iZTY0KGYsIHMtPm5vdyk7Cit9CisKK3N0YXRpYyBpbnQgIGdvbGRmaXNoX3J0Y19sb2FkKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSwgaW50ICB2ZXJzaW9uX2lkKQoreworICAgIHN0cnVjdCAgcnRjX3N0YXRlKiAgcyA9IG9wYXF1ZTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IEdPTERGSVNIX1JUQ19TQVZFX1ZFUlNJT04pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHRoaXMgaXMgYW4gb2xkIHZhbHVlIHRoYXQgaXMgbm90IGNvcnJlY3QuIGJ1dCB0aGF0J3Mgb2sgYW55d2F5ICovCisgICAgcy0+bm93ID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX3J0Y19yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICBzdHJ1Y3QgcnRjX3N0YXRlICpzID0gKHN0cnVjdCBydGNfc3RhdGUgKilvcGFxdWU7CisgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIDB4MDoKKyAgICAgICAgICAgIHMtPm5vdyA9IChpbnQ2NF90KXRpbWUoTlVMTCkgKiAxMDAwMDAwMDAwOworICAgICAgICAgICAgcmV0dXJuIHMtPm5vdzsKKyAgICAgICAgY2FzZSAweDQ6CisgICAgICAgICAgICByZXR1cm4gcy0+bm93ID4+IDMyOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF9ydGNfcmVhZDogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdvbGRmaXNoX3J0Y193cml0ZSh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQzMl90IHZhbHVlKQoreworICAgIHN0cnVjdCBydGNfc3RhdGUgKnMgPSAoc3RydWN0IHJ0Y19zdGF0ZSAqKW9wYXF1ZTsKKyAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgMHg4OgorICAgICAgICAgICAgcy0+YWxhcm1fbG93ID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGM6CisgICAgICAgICAgICBzLT5hbGFybV9oaWdoID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDEwOgorICAgICAgICAgICAgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoJnMtPmRldiwgMCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAiZ29sZGZpc2hfcnRjX3dyaXRlOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfc3RhdGUgdGltZXJfc3RhdGUgPSB7CisgICAgLmRldiA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ29sZGZpc2hfdGltZXIiLAorICAgICAgICAuaWQgPSAtMSwKKyAgICAgICAgLnNpemUgPSAweDEwMDAsCisgICAgICAgIC5pcnFfY291bnQgPSAxLAorICAgIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfc3RhdGUgcnRjX3N0YXRlID0geworICAgIC5kZXYgPSB7CisgICAgICAgIC5uYW1lID0gImdvbGRmaXNoX3J0YyIsCisgICAgICAgIC5pZCA9IC0xLAorICAgICAgICAuc2l6ZSA9IDB4MTAwMCwKKyAgICAgICAgLmlycV9jb3VudCA9IDEsCisgICAgfQorfTsKKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpnb2xkZmlzaF90aW1lcl9yZWFkZm5bXSA9IHsKKyAgICBnb2xkZmlzaF90aW1lcl9yZWFkLAorICAgIGdvbGRmaXNoX3RpbWVyX3JlYWQsCisgICAgZ29sZGZpc2hfdGltZXJfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfdGltZXJfd3JpdGVmbltdID0geworICAgIGdvbGRmaXNoX3RpbWVyX3dyaXRlLAorICAgIGdvbGRmaXNoX3RpbWVyX3dyaXRlLAorICAgIGdvbGRmaXNoX3RpbWVyX3dyaXRlCit9OworCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmdvbGRmaXNoX3J0Y19yZWFkZm5bXSA9IHsKKyAgICBnb2xkZmlzaF9ydGNfcmVhZCwKKyAgICBnb2xkZmlzaF9ydGNfcmVhZCwKKyAgICBnb2xkZmlzaF9ydGNfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfcnRjX3dyaXRlZm5bXSA9IHsKKyAgICBnb2xkZmlzaF9ydGNfd3JpdGUsCisgICAgZ29sZGZpc2hfcnRjX3dyaXRlLAorICAgIGdvbGRmaXNoX3J0Y193cml0ZQorfTsKKwordm9pZCBnb2xkZmlzaF90aW1lcl9hbmRfcnRjX2luaXQodWludDMyX3QgdGltZXJiYXNlLCBpbnQgdGltZXJpcnEpCit7CisgICAgdGltZXJfc3RhdGUuZGV2LmJhc2UgPSB0aW1lcmJhc2U7CisgICAgdGltZXJfc3RhdGUuZGV2LmlycSA9IHRpbWVyaXJxOworICAgIHRpbWVyX3N0YXRlLnRpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfVklSVFVBTCwgU0NBTEVfTlMsIGdvbGRmaXNoX3RpbWVyX3RpY2ssICZ0aW1lcl9zdGF0ZSk7CisgICAgZ29sZGZpc2hfZGV2aWNlX2FkZCgmdGltZXJfc3RhdGUuZGV2LCBnb2xkZmlzaF90aW1lcl9yZWFkZm4sIGdvbGRmaXNoX3RpbWVyX3dyaXRlZm4sICZ0aW1lcl9zdGF0ZSk7CisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF90aW1lciIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX1RJTUVSX1NBVkVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgZ29sZGZpc2hfdGltZXJfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgZ29sZGZpc2hfdGltZXJfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgJnRpbWVyX3N0YXRlKTsKKworICAgIGdvbGRmaXNoX2RldmljZV9hZGQoJnJ0Y19zdGF0ZS5kZXYsIGdvbGRmaXNoX3J0Y19yZWFkZm4sIGdvbGRmaXNoX3J0Y193cml0ZWZuLCAmcnRjX3N0YXRlKTsKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImdvbGRmaXNoX3J0YyIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX1JUQ19TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX3J0Y19zYXZlLAorICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9ydGNfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgJnJ0Y19zdGF0ZSk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC90cmFjZS5jIGIvYW5kcm9pZC9xZW11MS9ody9hbmRyb2lkL2dvbGRmaXNoL3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjZWYxYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC90cmFjZS5jCkBAIC0wLDAgKzEsMzI3IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisvKgorICogVmlydHVhbCBoYXJkd2FyZSBmb3IgYnJpZGdpbmcgdGhlIEZVU0Uga2VybmVsIG1vZHVsZQorICogaW4gdGhlIGVtdWxhdGVkIE9TIGFuZCBvdXRzaWRlIGZpbGUgc3lzdGVtCisgKi8KKyNpbmNsdWRlICJtaWdyYXRpb24vcWVtdS1maWxlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC90cmFjZS5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvcHJvZmlsZS5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfZXhlYy5oIgorI2luY2x1ZGUgImV4ZWMvY29kZS1wcm9maWxlLmgiCisKKy8qIFNldCB0byAxIHRvIGRlYnVnIHRyYWNpbmcgKi8KKyNkZWZpbmUgREVCVUcgICAwCisKKyNpZiBERUJVRworIyAgZGVmaW5lIEQoLi4uKSAgcHJpbnRmKF9fVkFfQVJHU19fKSwgZmZsdXNoKHN0ZG91dCkKKyNlbHNlCisjICBkZWZpbmUgRCguLi4pICAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBTZXQgdG8gMSB0byBkZWJ1ZyBQSUQgdHJhY2tpbmcgKi8KKyNkZWZpbmUgIERFQlVHX1BJRCAgMAorCisjaWYgREVCVUdfUElECisjICBkZWZpbmUgIERQSUQoLi4uKSAgcHJpbnRmKF9fVkFfQVJHU19fKSwgZmZsdXNoKHN0ZG91dCkKKyNlbHNlCisjICBkZWZpbmUgIERQSUQoLi4uKSAgKCh2b2lkKTApCisjZW5kaWYKKworLy8gVE9ETyhkaWdpdCk6IFJlLWVuYWJsZSB0cmFjaW5nIHNvbWUgZGF5PworI2RlZmluZSB0cmFjaW5nIDAKKworZXh0ZXJuIHZvaWQgY3B1X2xvb3BfZXhpdChDUFVBcmNoU3RhdGUqIGVudik7CisKK2NvbnN0IGNoYXIgKnRyYWNlX2ZpbGVuYW1lID0gTlVMTDsKKworLyogZm9yIGV4ZWN2ZSAqLworc3RhdGljIGNoYXIgZXhlY19wYXRoW0NMSUVOVF9QQUdFX1NJWkVdOworc3RhdGljIGNoYXIgZXhlY19hcmdbQ0xJRU5UX1BBR0VfU0laRV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyB2c3RhcnQ7ICAgIC8vIFZNIHN0YXJ0CitzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZW5kOyAgICAgIC8vIFZNIGVuZAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZW9mZjsgICAgICAvLyBvZmZzZXQgaW4gRVhFIGZpbGUKK3N0YXRpYyB1bnNpZ25lZCBjbWRsZW47ICAgICAgICAgLy8gY21kbGluZSBsZW5ndGgKK3N0YXRpYyB1bnNpZ25lZCBwaWQ7ICAgICAgICAgICAgLy8gUElEIChyZWFsbHkgdGhyZWFkIGlkKQorc3RhdGljIHVuc2lnbmVkIHRnaWQ7ICAgICAgICAgICAvLyB0aHJlYWQgZ3JvdXAgaWQgKHJlYWxseSBwcm9jZXNzIGlkKQorc3RhdGljIHVuc2lnbmVkIHRpZDsgICAgICAgICAgICAvLyBjdXJyZW50IHRocmVhZCBpZCAoc2FtZSBhcyBwaWQsIG1vc3Qgb2YgdGhlIHRpbWUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkc2FkZHI7ICAgIC8vIGR5bmFtaWMgc3ltYm9sIGFkZHJlc3MKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHVubWFwX3N0YXJ0OyAvLyBzdGFydCBhZGRyZXNzIHRvIHVubWFwCisKK3Vuc2lnbmVkIGdldF9jdXJyZW50X3BpZCgpIHsKKyAgcmV0dXJuIHRpZDsKK30KKworLyogZm9yIGNvbnRleHQgc3dpdGNoICovCisvL3N0YXRpYyB1bnNpZ25lZCBsb25nIGNzX3BpZDsgICAgLy8gY29udGV4dCBzd2l0Y2ggUElECitzdGF0aWMgc2l6ZV90IGdldF9ndWVzdF9rZXJuZWxfc3RyaW5nKGNoYXIqIHFlbXVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgZ3Vlc3Rfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcWVtdV9idWZmZXJfc2l6ZSkKK3sKKyAgICBzaXplX3QgY29waWVkID0gMDsKKworICAgIGlmIChxZW11X2J1ZmZlcl9zaXplID4gMSkgeworICAgICAgICBmb3IgKGNvcGllZCA9IDA7IGNvcGllZCA8IHFlbXVfYnVmZmVyX3NpemUgLSAxOyBjb3BpZWQrKykgeworICAgICAgICAgICAgcWVtdV9zdHJbY29waWVkXSA9IGNwdV9sZHViX2tlcm5lbChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3Rfc3RyICsgY29waWVkKTsKKyAgICAgICAgICAgIGlmIChxZW11X3N0cltjb3BpZWRdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29waWVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHFlbXVfc3RyW2NvcGllZF0gPSAnXDAnOworICAgIHJldHVybiBjb3BpZWQ7Cit9CisKKy8qIEkvTyB3cml0ZSAqLworc3RhdGljIHZvaWQgdHJhY2VfZGV2X3dyaXRlKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCwgdWludDMyX3QgdmFsdWUpCit7CisgICAgdHJhY2VfZGV2X3N0YXRlICpzID0gKHRyYWNlX2Rldl9zdGF0ZSAqKW9wYXF1ZTsKKworICAgICh2b2lkKXM7CisKKyAgICBzd2l0Y2ggKG9mZnNldCA+PiAyKSB7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1NXSVRDSDogIC8vIGNvbnRleHQgc3dpdGNoLCBzd2l0Y2ggdG8gcGlkCisgICAgICAgIERQSUQoIlFFTVUudHJhY2U6IGNvbnRleHQgc3dpdGNoIHRpZD0ldVxuIiwgdmFsdWUpOworICAgICAgICBpZiAodHJhY2VfZmlsZW5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgRCgiUUVNVS50cmFjZToga2VybmVsLCBjb250ZXh0IHN3aXRjaCAldVxuIiwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHRpZCA9ICh1bnNpZ25lZCkgdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19UR0lEOiAgICAvLyBzYXZlIHRoZSB0Z2lkIGZvciB0aGUgZm9sbG93aW5nIGZvcmsvY2xvbmUKKyAgICAgICAgRFBJRCgiUUVNVS50cmFjZTogdGdpZD0ldVxuIiwgdmFsdWUpOworICAgICAgICB0Z2lkID0gdmFsdWU7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBrZXJuZWwsIHRnaWQgJXVcbiIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfRk9SSzogICAgLy8gZm9yaywgZm9yayBuZXcgcGlkCisgICAgICAgIERQSUQoIlFFTVUudHJhY2U6IGZvcmsgKHBpZD0lZCB0Z2lkPSVkIHZhbHVlPSVkKVxuIiwgcGlkLCB0Z2lkLCB2YWx1ZSk7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBrZXJuZWwsIGZvcmsgJXVcbiIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfQ0xPTkU6ICAgIC8vIGZvcmssIGNsb25lIG5ldyBwaWQgKGkuZS4gdGhyZWFkKQorICAgICAgICBEUElEKCJRRU1VLnRyYWNlOiBjbG9uZSAocGlkPSVkIHRnaWQ9JWQgdmFsdWU9JWQpXG4iLCBwaWQsIHRnaWQsIHZhbHVlKTsKKyAgICAgICAgaWYgKHRyYWNlX2ZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEQoIlFFTVUudHJhY2U6IGtlcm5lbCwgY2xvbmUgJXVcbiIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX1ZNU1RBUlQ6ICAvLyBleGVjdmUsIHZzdGFydAorICAgICAgICB2c3RhcnQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9WTUVORDogICAgLy8gZXhlY3ZlLCB2ZW5kCisgICAgICAgIHZlbmQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9PRkZTRVQ6ICAgLy8gZXhlY3ZlLCBvZmZzZXQgaW4gRVhFCisgICAgICAgIGVvZmYgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9FWEVQQVRIOiAgLy8gaW5pdCBleGVjLCBwYXRoIG9mIEVYRQorICAgICAgICBnZXRfZ3Vlc3Rfa2VybmVsX3N0cmluZyhleGVjX3BhdGgsIHZhbHVlLCBDTElFTlRfUEFHRV9TSVpFKTsKKyAgICAgICAgaWYgKHRyYWNlX2ZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEQoIlFFTVUudHJhY2U6IGtlcm5lbCwgaW5pdCBleGVjIFslbHgsJWx4XUAlbHggWyVzXVxuIiwKKyAgICAgICAgICAgICAgdnN0YXJ0LCB2ZW5kLCBlb2ZmLCBleGVjX3BhdGgpOworICAgICAgICB9CisgICAgICAgIGV4ZWNfcGF0aFswXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19DTURMSU5FX0xFTjogICAgIC8vIGV4ZWN2ZSwgcHJvY2VzcyBjbWRsaW5lIGxlbmd0aAorICAgICAgICBjbWRsZW4gPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0NNRExJTkU6ICAgICAgICAgLy8gZXhlY3ZlLCBwcm9jZXNzIGNtZGxpbmUKKyAgICAgICAgc2FmZV9tZW1vcnlfcndfZGVidWcoY3VycmVudF9jcHUsIHZhbHVlLCAodWludDhfdCopZXhlY19hcmcsIGNtZGxlbiwgMCk7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBrZXJuZWwsIGV4ZWN2ZSBbJS4qc11cbiIsIGNtZGxlbiwgZXhlY19hcmcpOworICAgICAgICB9CisjaWYgREVCVUcgfHwgREVCVUdfUElECisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbWRsZW47IGkgKyspCisgICAgICAgICAgICAgICAgaWYgKGkgIT0gY21kbGVuIC0gMSAmJiBleGVjX2FyZ1tpXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBleGVjX2FyZ1tpXSA9ICcgJzsKKyAgICAgICAgICAgIHByaW50ZigiUUVNVS50cmFjZToga2VybmVsLCBleGVjdmUgJXNbJWRdXG4iLCBleGVjX2FyZywgY21kbGVuKTsKKyAgICAgICAgICAgIGV4ZWNfYXJnWzBdID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19FWElUOiAgICAgICAgICAgIC8vIGV4aXQsIGV4aXQgY3VycmVudCBwcm9jZXNzIHdpdGggZXhpdCBjb2RlCisgICAgICAgIERQSUQoIlFFTVUudHJhY2U6IGV4aXQgdGlkPSV1XG4iLCB2YWx1ZSk7CisgICAgICAgIHJlbGVhc2VfbW1hcCh2YWx1ZSk7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBrZXJuZWwsIGV4aXQgJXhcbiIsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTkFNRTogICAgICAgICAgICAvLyByZWNvcmQgdGhyZWFkIG5hbWUKKyAgICAgICAgZ2V0X2d1ZXN0X2tlcm5lbF9zdHJpbmcoZXhlY19wYXRoLCB2YWx1ZSwgQ0xJRU5UX1BBR0VfU0laRSk7CisgICAgICAgIERQSUQoIlFFTVUudHJhY2U6IHRocmVhZCBuYW1lPSVzXG4iLCBleGVjX3BhdGgpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGUgdHJhaWxpbmcgbmV3bGluZSBpZiBpdCBleGlzdHMKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihleGVjX3BhdGgpOworICAgICAgICBpZiAoZXhlY19wYXRoW2xlbiAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGV4ZWNfcGF0aFtsZW4gLSAxXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNlX2ZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEQoIlFFTVUudHJhY2U6IGtlcm5lbCwgbmFtZSAlc1xuIiwgZXhlY19wYXRoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTU1BUF9FWEVQQVRIOiAgICAvLyBtbWFwLCBwYXRoIG9mIEVYRSwgdGhlIG90aGVycyBhcmUgc2FtZSBhcyBleGVjdmUKKyAgICAgICAgZ2V0X2d1ZXN0X2tlcm5lbF9zdHJpbmcoZXhlY19wYXRoLCB2YWx1ZSwgQ0xJRU5UX1BBR0VfU0laRSk7CisgICAgICAgIGlmIChleGVjX3BhdGggIT0gTlVMTCkKKyAgICAgICAgICByZWNvcmRfbW1hcCh2c3RhcnQsIHZlbmQsIGVvZmYsIGV4ZWNfcGF0aCwgdGlkKTsKKyAgICAgICAgRFBJRCgiUUVNVS50cmFjZTogbW1hcCBleGU9JXNcbiIsIGV4ZWNfcGF0aCk7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBrZXJuZWwsIG1tYXAgWyVseCwlbHhdQCVseCBbJXNdXG4iLCB2c3RhcnQsIHZlbmQsIGVvZmYsIGV4ZWNfcGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgZXhlY19wYXRoWzBdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0lOSVRfUElEOiAgICAgICAgLy8gaW5pdCwgbmFtZSB0aGUgcGlkIHRoYXQgc3RhcnRzIGJlZm9yZSBkZXZpY2UgcmVnaXN0ZXJlZAorICAgICAgICBwaWQgPSB2YWx1ZTsKKyAgICAgICAgRFBJRCgiUUVNVS50cmFjZTogcGlkPSVkXG4iLCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19JTklUX05BTUU6ICAgICAgIC8vIGluaXQsIHRoZSBjb21tIG9mIHRoZSBpbml0IHBpZAorICAgICAgICBnZXRfZ3Vlc3Rfa2VybmVsX3N0cmluZyhleGVjX3BhdGgsIHZhbHVlLCBDTElFTlRfUEFHRV9TSVpFKTsKKyAgICAgICAgRFBJRCgiUUVNVS50cmFjZTogdGdpZD0lZCBwaWQ9JWQgbmFtZT0lc1xuIiwgdGdpZCwgcGlkLCBleGVjX3BhdGgpOworICAgICAgICBpZiAodHJhY2VfZmlsZW5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgRCgiUUVNVS50cmFjZToga2VybmVsLCBpbml0IG5hbWUgJXUgWyVzXVxuIiwgcGlkLCBleGVjX3BhdGgpOworICAgICAgICB9CisgICAgICAgIGV4ZWNfcGF0aFswXSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0RZTl9TWU1fQUREUjogICAgLy8gZHluYW1pYyBzeW1ib2wgYWRkcmVzcworICAgICAgICBkc2FkZHIgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX0RZTl9TWU06ICAgICAgICAgLy8gYWRkIGR5bmFtaWMgc3ltYm9sCisgICAgICAgIGdldF9ndWVzdF9rZXJuZWxfc3RyaW5nKGV4ZWNfYXJnLCB2YWx1ZSwgQ0xJRU5UX1BBR0VfU0laRSk7CisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBkeW5hbWljIHN5bWJvbCAlbHg6JXNcbiIsIGRzYWRkciwgZXhlY19hcmcpOworICAgICAgICB9CisgICAgICAgIGV4ZWNfYXJnWzBdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1JFTU9WRV9BRERSOiAgICAgICAgIC8vIHJlbW92ZSBkeW5hbWljIHN5bWJvbCBhZGRyCisgICAgICAgIGlmICh0cmFjZV9maWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBEKCJRRU1VLnRyYWNlOiBkeW5hbWljIHN5bWJvbCByZW1vdmUgJWx4XG4iLCBkc2FkZHIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1BSSU5UX1NUUjogICAgICAgLy8gcHJpbnQgc3RyaW5nCisgICAgICAgIGdldF9ndWVzdF9rZXJuZWxfc3RyaW5nKGV4ZWNfYXJnLCB2YWx1ZSwgQ0xJRU5UX1BBR0VfU0laRSk7CisgICAgICAgIHByaW50ZigiJXMiLCBleGVjX2FyZyk7CisgICAgICAgIGV4ZWNfYXJnWzBdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1BSSU5UX05VTV9ERUM6ICAgLy8gcHJpbnQgbnVtYmVyIGluIGRlY2ltYWwKKyAgICAgICAgcHJpbnRmKCIlZCIsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1BSSU5UX05VTV9IRVg6ICAgLy8gcHJpbnQgbnVtYmVyIGluIGhleGljYWwKKyAgICAgICAgcHJpbnRmKCIleCIsIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfU1RPUF9FTVU6ICAgICAgICAvLyBzdG9wIHRoZSBWTSBleGVjdXRpb24KKyAgICAgICAgY3B1X3NpbmdsZV9lbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfSExUOworICAgICAgICBjdXJyZW50X2NwdS0+aGFsdGVkID0gMTsKKyAgICAgICAgcWVtdV9zeXN0ZW1fc2h1dGRvd25fcmVxdWVzdCgpOworICAgICAgICBjcHVfbG9vcF9leGl0KGNwdV9zaW5nbGVfZW52KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfRU5BQkxFOiAgICAgICAgICAvLyB0cmFjaW5nIGVuYWJsZTogMCA9IHN0b3AsIDEgPSBzdGFydAorICAgICAgICBicmVhazsKKworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19VTk1BUF9TVEFSVDoKKyAgICAgICAgdW5tYXBfc3RhcnQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDRV9ERVZfUkVHX1VOTUFQX0VORDoKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTUVUSE9EX0VOVFJZOgorICAgIGNhc2UgVFJBQ0VfREVWX1JFR19NRVRIT0RfRVhJVDoKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTUVUSE9EX0VYQ0VQVElPTjoKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTkFUSVZFX0VOVFJZOgorICAgIGNhc2UgVFJBQ0VfREVWX1JFR19OQVRJVkVfRVhJVDoKKyAgICBjYXNlIFRSQUNFX0RFVl9SRUdfTkFUSVZFX0VYQ0VQVElPTjoKKyAgICAgICAgaWYgKHRyYWNlX2ZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh0cmFjaW5nKSB7CisgICAgICAgICAgICAgICAgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGNhbGxfdHlwZSA9IChvZmZzZXQgLSA0MDk2KSA+PiAyOworICAgICAgICAgICAgICAgIC8vdHJhY2VfaW50ZXJwcmV0ZWRfbWV0aG9kKHZhbHVlLCBjYWxsX3R5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG9mZnNldCA8IDQwOTYpIHsKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAidHJhY2VfZGV2X3dyaXRlOiBCYWQgb2Zmc2V0ICUiIEhXQUREUl9QUkl4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEQoIiVzOiBvZmZzZXQ9JWQgKDB4JXgpIHZhbHVlPSVkICgweCV4KVxuIiwgX19GVU5DVElPTl9fLCBvZmZzZXQsCisgICAgICAgICAgICAgIG9mZnNldCwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIEkvTyByZWFkICovCitzdGF0aWMgdWludDMyX3QgdHJhY2VfZGV2X3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHRyYWNlX2Rldl9zdGF0ZSAqcyA9ICh0cmFjZV9kZXZfc3RhdGUgKilvcGFxdWU7CisKKyAgICAodm9pZClzOworCisgICAgc3dpdGNoIChvZmZzZXQgPj4gMikgeworICAgIGNhc2UgVFJBQ0VfREVWX1JFR19FTkFCTEU6ICAgICAgICAgIC8vIHRyYWNpbmcgZW5hYmxlCisgICAgICAgIHJldHVybiB0cmFjaW5nOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG9mZnNldCA8IDQwOTYpIHsKKyAgICAgICAgICAgIGNwdV9hYm9ydChjcHVfc2luZ2xlX2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAidHJhY2VfZGV2X3JlYWQ6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRCgiJXM6IG9mZnNldD0lZCAoMHgleClcbiIsIF9fRlVOQ1RJT05fXywgb2Zmc2V0LCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICp0cmFjZV9kZXZfcmVhZGZuW10gPSB7CisgICB0cmFjZV9kZXZfcmVhZCwKKyAgIHRyYWNlX2Rldl9yZWFkLAorICAgdHJhY2VfZGV2X3JlYWQKK307CisKK3N0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKnRyYWNlX2Rldl93cml0ZWZuW10gPSB7CisgICB0cmFjZV9kZXZfd3JpdGUsCisgICB0cmFjZV9kZXZfd3JpdGUsCisgICB0cmFjZV9kZXZfd3JpdGUKK307CisKKy8qIGluaXRpYWxpemUgdGhlIHRyYWNlIGRldmljZSAqLwordm9pZCB0cmFjZV9kZXZfaW5pdCgpCit7CisgICAgaWYgKGNvZGVfcHJvZmlsZV9kaXJuYW1lID09IE5VTEwpCisgICAgICByZXR1cm47CisKKyAgICBjb2RlX3Byb2ZpbGVfcmVjb3JkX2Z1bmMgPSBwcm9maWxlX2JiX2hlbHBlcjsKKyAgICB0cmFjZV9kZXZfc3RhdGUgKnM7CisKKyAgICBzID0gKHRyYWNlX2Rldl9zdGF0ZSAqKWdfbWFsbG9jMChzaXplb2YodHJhY2VfZGV2X3N0YXRlKSk7CisgICAgcy0+ZGV2Lm5hbWUgPSAicWVtdV90cmFjZSI7CisgICAgcy0+ZGV2LmlkID0gLTE7CisgICAgcy0+ZGV2LmJhc2UgPSAwOyAgICAgICAvLyB3aWxsIGJlIGFsbG9jYXRlZCBkeW5hbWljYWxseQorICAgIHMtPmRldi5zaXplID0gMHgyMDAwOworICAgIHMtPmRldi5pcnEgPSAwOworICAgIHMtPmRldi5pcnFfY291bnQgPSAwOworCisgICAgZ29sZGZpc2hfZGV2aWNlX2FkZCgmcy0+ZGV2LCB0cmFjZV9kZXZfcmVhZGZuLCB0cmFjZV9kZXZfd3JpdGVmbiwgcyk7CisKKyAgICBleGVjX3BhdGhbMF0gPSBleGVjX2FyZ1swXSA9ICdcMCc7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYzJkMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC90dHkuYwpAQCAtMCwwICsxLDI2MSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJzeXNlbXUvY2hhci5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC92bWVtLmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKworZW51bSB7CisgICAgVFRZX1BVVF9DSEFSICAgICAgID0gMHgwMCwKKyAgICBUVFlfQllURVNfUkVBRFkgICAgPSAweDA0LAorICAgIFRUWV9DTUQgICAgICAgICAgICA9IDB4MDgsCisKKyAgICBUVFlfREFUQV9QVFIgICAgICAgPSAweDEwLAorICAgIFRUWV9EQVRBX0xFTiAgICAgICA9IDB4MTQsCisgICAgVFRZX0RBVEFfUFRSX0hJR0ggID0gMHgxOCwKKworICAgIC8qIE9ubHkgdXNlZCBieSBrZXJuZWwgMy4xMCsgKi8KKyAgICBUVFlfVkVSU0lPTiAgICAgICAgPSAweDIwLAorCisgICAgVFRZX0NNRF9JTlRfRElTQUJMRSAgICA9IDAsCisgICAgVFRZX0NNRF9JTlRfRU5BQkxFICAgICA9IDEsCisgICAgVFRZX0NNRF9XUklURV9CVUZGRVIgICA9IDIsCisgICAgVFRZX0NNRF9SRUFEX0JVRkZFUiAgICA9IDMsCit9OworCitzdHJ1Y3QgdHR5X3N0YXRlIHsKKyAgICBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIGRldjsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNzOworICAgIHVpbnQ2NF90IHB0cjsKKyAgICB1aW50MzJfdCBwdHJfbGVuOworICAgIHVpbnQzMl90IHJlYWR5OworICAgIHVpbnQ4X3QgZGF0YVsxMjhdOworICAgIHVpbnQzMl90IGRhdGFfY291bnQ7Cit9OworCisjZGVmaW5lICBUVFlfREVWSUNFX1ZFUlNJT04gMAorI2RlZmluZSAgR09MREZJU0hfVFRZX1NBVkVfVkVSU0lPTiAgMgorCisjZGVmaW5lICBERUJVRyAwCisKKy8qIFNldCB0byAxIHRvIGRlYnVnIGkvbyByZWdpc3RlciByZWFkcy93cml0ZXMgKi8KKyNkZWZpbmUgREVCVUdfUkVHUyAgMAorCisjaWYgREVCVUcgPj0gMQorIyAgZGVmaW5lIEQoLi4uKSAgZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgIGRlZmluZSBEKC4uLikgICh2b2lkKTAKKyNlbmRpZgorCisjZGVmaW5lIEUoLi4uKSAgY3B1X2Fib3J0KGNwdV9zaW5nbGVfZW52LCBfX1ZBX0FSR1NfXykKKworc3RhdGljIHZvaWQgIGdvbGRmaXNoX3R0eV9zYXZlKFFFTVVGaWxlKiAgZiwgdm9pZCogIG9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgdHR5X3N0YXRlKiAgcyA9IG9wYXF1ZTsKKworICAgIHFlbXVfcHV0X2JlNjQoIGYsIHMtPnB0ciApOworICAgIHFlbXVfcHV0X2JlMzIoIGYsIHMtPnB0cl9sZW4gKTsKKyAgICBxZW11X3B1dF9ieXRlKCBmLCBzLT5yZWFkeSApOworICAgIHFlbXVfcHV0X2J5dGUoIGYsIHMtPmRhdGFfY291bnQgKTsKKyAgICBxZW11X3B1dF9idWZmZXIoIGYsIHMtPmRhdGEsIHMtPmRhdGFfY291bnQgKTsKK30KKworc3RhdGljIGludCAgZ29sZGZpc2hfdHR5X2xvYWQoUUVNVUZpbGUqICBmLCB2b2lkKiAgb3BhcXVlLCBpbnQgIHZlcnNpb25faWQpCit7CisgICAgc3RydWN0IHR0eV9zdGF0ZSogIHMgPSBvcGFxdWU7CisKKyAgICBpZiAoKHZlcnNpb25faWQgIT0gR09MREZJU0hfVFRZX1NBVkVfVkVSU0lPTikgJiYgCisgICAgICAgICh2ZXJzaW9uX2lkICE9IChHT0xERklTSF9UVFlfU0FWRV9WRVJTSU9OIC0gMSkpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHZlcnNpb25faWQgPT0gKEdPTERGSVNIX1RUWV9TQVZFX1ZFUlNJT04gLSAxKSkgeworICAgICAgICBzLT5wdHIgICAgPSAodWludDY0X3QpcWVtdV9nZXRfYmUzMihmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5wdHIgICAgPSBxZW11X2dldF9iZTY0KGYpOworICAgIH0KKyAgICBzLT5wdHJfbGVuICAgID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5yZWFkeSAgICAgID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBzLT5kYXRhX2NvdW50ID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgcy0+ZGF0YSwgcy0+ZGF0YV9jb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGdvbGRmaXNoX3R0eV9yZWFkKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICBzdHJ1Y3QgdHR5X3N0YXRlICpzID0gKHN0cnVjdCB0dHlfc3RhdGUgKilvcGFxdWU7CisKKyAgICBEKCJnb2xkZmlzaF90dHlfcmVhZCAlIiBIV0FERFJfUFJJeCAiXG4iLCBvZmZzZXQpOworCisgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSBUVFlfQllURVNfUkVBRFk6CisgICAgICAgICAgICByZXR1cm4gcy0+ZGF0YV9jb3VudDsKKyAgICAgICAgY2FzZSBUVFlfVkVSU0lPTjoKKyAgICAgICAgICAgIHJldHVybiBUVFlfREVWSUNFX1ZFUlNJT047CisgICAgZGVmYXVsdDoKKyAgICAgICAgRSgiZ29sZGZpc2hfdHR5X3JlYWQ6IEJhZCBvZmZzZXQgJSIgSFdBRERSX1BSSXggIlxuIiwgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnb2xkZmlzaF90dHlfd3JpdGUodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgdHR5X3N0YXRlICpzID0gKHN0cnVjdCB0dHlfc3RhdGUgKilvcGFxdWU7CisKKyAgICBEKCJnb2xkZmlzaF90dHlfd3JpdGUgJSIgSFdBRERSX1BSSXggIiAleFxuIiwgb2Zmc2V0LCB2YWx1ZSk7CisKKyAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgVFRZX1BVVF9DSEFSOiB7CisgICAgICAgICAgICB1aW50OF90IGNoID0gdmFsdWU7CisgICAgICAgICAgICBpZihzLT5jcykKKyAgICAgICAgICAgICAgICBxZW11X2Nocl93cml0ZShzLT5jcywgJmNoLCAxKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFRUWV9DTUQ6CisgICAgICAgICAgICBzd2l0Y2godmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRUWV9DTURfSU5UX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgICAgIGlmKHMtPnJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihzLT5kYXRhX2NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgVFRZX0NNRF9JTlRfRU5BQkxFOgorICAgICAgICAgICAgICAgICAgICBpZighcy0+cmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHMtPmRhdGFfY291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVhZHkgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUVFlfQ01EX1dSSVRFX0JVRkZFUjoKKyAgICAgICAgICAgICAgICAgICAgaWYocy0+Y3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgIGJ1ZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gcy0+cHRyOworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcy0+cHRyX2xlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICB0ZW1wWzY0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgdG9fd3JpdGUgPSBzaXplb2YodGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvX3dyaXRlID4gbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b193cml0ZSA9IGxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfbWVtb3J5X3J3X2RlYnVnKGN1cnJlbnRfY3B1LCBidWYsICh1aW50OF90Kil0ZW1wLCB0b193cml0ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9jaHJfd3JpdGUocy0+Y3MsIChjb25zdCB1aW50OF90Kil0ZW1wLCB0b193cml0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IHRvX3dyaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSB0b193cml0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEQoImdvbGRmaXNoX3R0eV93cml0ZTogZ290ICVkIGJ5dGVzIGZyb20gJWxseFxuIiwgcy0+cHRyX2xlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzLT5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBUVFlfQ01EX1JFQURfQlVGRkVSOgorICAgICAgICAgICAgICAgICAgICBpZihzLT5wdHJfbGVuID4gcy0+ZGF0YV9jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEUoImdvbGRmaXNoX3R0eV93cml0ZTogcmVhZGluZyBtb3JlIGRhdGEgdGhhbiBhdmFpbGFibGUgJWQgJWRcbiIsIHMtPnB0cl9sZW4sIHMtPmRhdGFfY291bnQpOworICAgICAgICAgICAgICAgICAgICBzYWZlX21lbW9yeV9yd19kZWJ1ZyhjdXJyZW50X2NwdSwgcy0+cHRyLCBzLT5kYXRhLCBzLT5wdHJfbGVuLDEpOworICAgICAgICAgICAgICAgICAgICBEKCJnb2xkZmlzaF90dHlfd3JpdGU6IHJlYWQgJWQgYnl0ZXMgdG8gJWxseFxuIiwgcy0+cHRyX2xlbiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzLT5wdHIpOworICAgICAgICAgICAgICAgICAgICBpZihzLT5kYXRhX2NvdW50ID4gcy0+cHRyX2xlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocy0+ZGF0YSwgcy0+ZGF0YSArIHMtPnB0cl9sZW4sIHMtPmRhdGFfY291bnQgLSBzLT5wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZGF0YV9jb3VudCAtPSBzLT5wdHJfbGVuOworICAgICAgICAgICAgICAgICAgICBpZihzLT5kYXRhX2NvdW50ID09IDAgJiYgcy0+cmVhZHkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF9kZXZpY2Vfc2V0X2lycSgmcy0+ZGV2LCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBFKCJnb2xkZmlzaF90dHlfd3JpdGU6IEJhZCBjb21tYW5kICV4XG4iLCB2YWx1ZSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUVFlfREFUQV9QVFI6CisgICAgICAgICAgICB1aW50NjRfc2V0X2xvdygmcy0+cHRyLCB2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRUWV9EQVRBX1BUUl9ISUdIOgorICAgICAgICAgICAgdWludDY0X3NldF9oaWdoKCZzLT5wdHIsIHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFRZX0RBVEFfTEVOOgorICAgICAgICAgICAgcy0+cHRyX2xlbiA9IHZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEUoImdvbGRmaXNoX3R0eV93cml0ZTogQmFkIG9mZnNldCAlIiBIV0FERFJfUFJJeCAiXG4iLCBvZmZzZXQpOworICAgIH0KK30KKworc3RhdGljIGludCB0dHlfY2FuX3JlY2VpdmUodm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCB0dHlfc3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gKHNpemVvZihzLT5kYXRhKSAtIHMtPmRhdGFfY291bnQpOworfQorCitzdGF0aWMgdm9pZCB0dHlfcmVjZWl2ZSh2b2lkICpvcGFxdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgc3RydWN0IHR0eV9zdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIG1lbWNweShzLT5kYXRhICsgcy0+ZGF0YV9jb3VudCwgYnVmLCBzaXplKTsKKyAgICBzLT5kYXRhX2NvdW50ICs9IHNpemU7CisgICAgaWYocy0+ZGF0YV9jb3VudCA+IDAgJiYgcy0+cmVhZHkpCisgICAgICAgIGdvbGRmaXNoX2RldmljZV9zZXRfaXJxKCZzLT5kZXYsIDAsIDEpOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmdvbGRmaXNoX3R0eV9yZWFkZm5bXSA9IHsKKyAgICBnb2xkZmlzaF90dHlfcmVhZCwKKyAgICBnb2xkZmlzaF90dHlfcmVhZCwKKyAgICBnb2xkZmlzaF90dHlfcmVhZAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ29sZGZpc2hfdHR5X3dyaXRlZm5bXSA9IHsKKyAgICBnb2xkZmlzaF90dHlfd3JpdGUsCisgICAgZ29sZGZpc2hfdHR5X3dyaXRlLAorICAgIGdvbGRmaXNoX3R0eV93cml0ZQorfTsKKworaW50IGdvbGRmaXNoX3R0eV9hZGQoQ2hhckRyaXZlclN0YXRlICpjcywgaW50IGlkLCB1aW50MzJfdCBiYXNlLCBpbnQgaXJxKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHR0eV9zdGF0ZSAqczsKKyAgICBzdGF0aWMgaW50ICBpbnN0YW5jZV9pZCA9IDA7CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZigqcykpOworICAgIHMtPmRldi5uYW1lID0gImdvbGRmaXNoX3R0eSI7CisgICAgcy0+ZGV2LmlkID0gaWQ7CisgICAgcy0+ZGV2LmJhc2UgPSBiYXNlOworICAgIHMtPmRldi5zaXplID0gMHgxMDAwOworICAgIHMtPmRldi5pcnEgPSBpcnE7CisgICAgcy0+ZGV2LmlycV9jb3VudCA9IDE7CisgICAgcy0+Y3MgPSBjczsKKworICAgIGlmKGNzKSB7CisgICAgICAgIHFlbXVfY2hyX2FkZF9oYW5kbGVycyhjcywgdHR5X2Nhbl9yZWNlaXZlLCB0dHlfcmVjZWl2ZSwgTlVMTCwgcyk7CisgICAgfQorCisgICAgcmV0ID0gZ29sZGZpc2hfZGV2aWNlX2FkZCgmcy0+ZGV2LCBnb2xkZmlzaF90dHlfcmVhZGZuLCBnb2xkZmlzaF90dHlfd3JpdGVmbiwgcyk7CisgICAgaWYocmV0KSB7CisgICAgICAgIGdfZnJlZShzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkZmlzaF90dHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfaWQrKywKKyAgICAgICAgICAgICAgICAgICAgICAgIEdPTERGSVNIX1RUWV9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBnb2xkZmlzaF90dHlfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvbGRmaXNoX3R0eV9sb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgcyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYW5kcm9pZC9nb2xkZmlzaC92bWVtLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2M1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5oIgorI2lmZGVmIFRBUkdFVF9JMzg2CisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2VuZGlmCisKKworLy8gQm90aCBzYWZlX21lbW9yeV9yd19kZWJ1ZyBhbmQgc2FmZV9nZXRfcGh5c19wYWdlX2RlYnVnIG5lZWQgdG8gdHJhbnNsYXRlCisvLyB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMuIFdoZW4gcnVubmluZyBvbiBLVk0gd2UgbmVlZCB0bworLy8gcHVsbCB0aGUgY3IgcmVnaXN0ZXJzIGFuZCBoZmxhZ3MgZnJvbSB0aGUgVkNQVS4gVGhlc2UgZnVuY3Rpb25zIHdyYXAgdGhlCisvLyBjYWxscyB0byBrdm1fZ2V0X3NyZWdzIHRvIHB1bGwgdGhlc2UgcmVnaXN0ZXJzIG92ZXIgd2hlbiBuZWNlc3NhcnkuCisvLworLy8gTm90ZTogd2UgZG8gbm90IGNhbGwgdGhlIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZSBmdW5jdGlvbiBiZWNhdXNlIHRoYXQgcHVsbHMKKy8vIGFsbCB0aGUgVkNQVSByZWdpc3RlcnMuIFRoYXQgZXF1YXRlcyB0byA0IGlvY3RscyBvbiB0aGUgS1ZNIHZpcnR1YWwgZGV2aWNlCisvLyBhbmQgb24gQU1EIHNvbWUgb2YgdGhvc2UgaW9jdGxzIChpbiBwYXJ0aWN1bGFyIEtWTV9HRVRfTVNSUykgYXJlIDEwIHRvIDEwMHgKKy8vIHNsb3dlciB0aGFuIG9uIEludGVsIGNoaXBzLgorCitpbnQgc2FmZV9tZW1vcnlfcndfZGVidWcoQ1BVU3RhdGUgKmNwdSwgdGFyZ2V0X3Vsb25nIGFkZHIsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgaXNfd3JpdGUpCit7CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkgeworICAgICAgICBrdm1fZ2V0X3NyZWdzKGNwdSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGNwdV9tZW1vcnlfcndfZGVidWcoY3B1LCBhZGRyLCBidWYsIGxlbiwgaXNfd3JpdGUpOworfQorCitod2FkZHIgc2FmZV9nZXRfcGh5c19wYWdlX2RlYnVnKENQVVN0YXRlICpjcHUsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkgeworICAgICAgICBrdm1fZ2V0X3NyZWdzKGNwdSk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGNwdV9nZXRfcGh5c19wYWdlX2RlYnVnKGVudiwgYWRkcik7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvYXJtL2FybV9naWMuYyBiL2FuZHJvaWQvcWVtdTEvaHcvYXJtL2FybV9naWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWFlMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hcm0vYXJtX2dpYy5jCkBAIC0wLDAgKzEsNzM4IEBACisvKgorICogQVJNIEdlbmVyaWMvRGlzdHJpYnV0ZWQgSW50ZXJydXB0IENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb24gY29kZSBmb3IgdGhlIFJlYWxWaWV3IEVCIGludGVycnVwdAorICAgY29udHJvbGxlciwgTVBDb3JlIGRpc3RyaWJ1dGVkIGludGVycnVwdCBjb250cm9sbGVyIGFuZCBBUk12Ny1NCisgICBOZXN0ZWQgVmVjdG9yZWQgSW50ZXJydXB0IENvbnRyb2xsZXIuICAqLworCisvLyNkZWZpbmUgREVCVUdfR0lDCisKKyNpZmRlZiBERUJVR19HSUMKKyNkZWZpbmUgRFBSSU5URihmbXQsIC4uLikgXAorZG8geyBwcmludGYoImFybV9naWM6ICIgZm10ICwgIyMgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5URihmbXQsIC4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgTlZJQworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ2ljX2lkW10gPQoreyAweDAwLCAweGIwLCAweDFiLCAweDAwLCAweDBkLCAweGUwLCAweDA1LCAweGIxIH07CisvKiBUaGUgTlZJQyBoYXMgMTYgaW50ZXJuYWwgdmVjdG9ycy4gIEhvd2V2ZXIgdGhlc2UgYXJlIG5vdCBleHBvc2VkCisgICB0aHJvdWdoIHRoZSBub3JtYWwgR0lDIGludGVyZmFjZS4gICovCisjZGVmaW5lIEdJQ19CQVNFX0lSUSAgICAzMgorI2Vsc2UKK3N0YXRpYyBjb25zdCB1aW50OF90IGdpY19pZFtdID0KK3sgMHg5MCwgMHgxMywgMHgwNCwgMHgwMCwgMHgwZCwgMHhmMCwgMHgwNSwgMHhiMSB9OworI2RlZmluZSBHSUNfQkFTRV9JUlEgICAgMAorI2VuZGlmCisKKyNkZWZpbmUgRlJPTV9TWVNCVVNHSUModHlwZSwgZGV2KSBcCisgICAgRE9fVVBDQVNUKHR5cGUsIGdpYywgRlJPTV9TWVNCVVMoZ2ljX3N0YXRlLCBkZXYpKQorCit0eXBlZGVmIHN0cnVjdCBnaWNfaXJxX3N0YXRlCit7CisgICAgLyogPz8/IFRoZSBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIGltcGx5IHRoZSBlbmFibGUgYml0cyBhcmUgZ2xvYmFsLCBldmVuCisgICAgICAgZm9yIHBlci1jcHUgaW50ZXJydXB0cy4gIFRoaXMgc2VlbXMgc3RyYW5nZS4gICovCisgICAgdW5zaWduZWQgZW5hYmxlZDoxOworICAgIHVuc2lnbmVkIHBlbmRpbmc6TkNQVTsKKyAgICB1bnNpZ25lZCBhY3RpdmU6TkNQVTsKKyAgICB1bnNpZ25lZCBsZXZlbDpOQ1BVOworICAgIHVuc2lnbmVkIG1vZGVsOjE7IC8qIDAgPSBOOk4sIDEgPSAxOk4gKi8KKyAgICB1bnNpZ25lZCB0cmlnZ2VyOjE7IC8qIG5vbnplcm8gPSBlZGdlIHRyaWdnZXJlZC4gICovCit9IGdpY19pcnFfc3RhdGU7CisKKyNkZWZpbmUgQUxMX0NQVV9NQVNLICgoMSA8PCBOQ1BVKSAtIDEpCisKKyNkZWZpbmUgR0lDX1NFVF9FTkFCTEVEKGlycSkgcy0+aXJxX3N0YXRlW2lycV0uZW5hYmxlZCA9IDEKKyNkZWZpbmUgR0lDX0NMRUFSX0VOQUJMRUQoaXJxKSBzLT5pcnFfc3RhdGVbaXJxXS5lbmFibGVkID0gMAorI2RlZmluZSBHSUNfVEVTVF9FTkFCTEVEKGlycSkgcy0+aXJxX3N0YXRlW2lycV0uZW5hYmxlZAorI2RlZmluZSBHSUNfU0VUX1BFTkRJTkcoaXJxLCBjbSkgcy0+aXJxX3N0YXRlW2lycV0ucGVuZGluZyB8PSAoY20pCisjZGVmaW5lIEdJQ19DTEVBUl9QRU5ESU5HKGlycSwgY20pIHMtPmlycV9zdGF0ZVtpcnFdLnBlbmRpbmcgJj0gfihjbSkKKyNkZWZpbmUgR0lDX1RFU1RfUEVORElORyhpcnEsIGNtKSAoKHMtPmlycV9zdGF0ZVtpcnFdLnBlbmRpbmcgJiAoY20pKSAhPSAwKQorI2RlZmluZSBHSUNfU0VUX0FDVElWRShpcnEsIGNtKSBzLT5pcnFfc3RhdGVbaXJxXS5hY3RpdmUgfD0gKGNtKQorI2RlZmluZSBHSUNfQ0xFQVJfQUNUSVZFKGlycSwgY20pIHMtPmlycV9zdGF0ZVtpcnFdLmFjdGl2ZSAmPSB+KGNtKQorI2RlZmluZSBHSUNfVEVTVF9BQ1RJVkUoaXJxLCBjbSkgKChzLT5pcnFfc3RhdGVbaXJxXS5hY3RpdmUgJiAoY20pKSAhPSAwKQorI2RlZmluZSBHSUNfU0VUX01PREVMKGlycSkgcy0+aXJxX3N0YXRlW2lycV0ubW9kZWwgPSAxCisjZGVmaW5lIEdJQ19DTEVBUl9NT0RFTChpcnEpIHMtPmlycV9zdGF0ZVtpcnFdLm1vZGVsID0gMAorI2RlZmluZSBHSUNfVEVTVF9NT0RFTChpcnEpIHMtPmlycV9zdGF0ZVtpcnFdLm1vZGVsCisjZGVmaW5lIEdJQ19TRVRfTEVWRUwoaXJxLCBjbSkgcy0+aXJxX3N0YXRlW2lycV0ubGV2ZWwgPSAoY20pCisjZGVmaW5lIEdJQ19DTEVBUl9MRVZFTChpcnEsIGNtKSBzLT5pcnFfc3RhdGVbaXJxXS5sZXZlbCAmPSB+KGNtKQorI2RlZmluZSBHSUNfVEVTVF9MRVZFTChpcnEsIGNtKSAoKHMtPmlycV9zdGF0ZVtpcnFdLmxldmVsICYgKGNtKSkgIT0gMCkKKyNkZWZpbmUgR0lDX1NFVF9UUklHR0VSKGlycSkgcy0+aXJxX3N0YXRlW2lycV0udHJpZ2dlciA9IDEKKyNkZWZpbmUgR0lDX0NMRUFSX1RSSUdHRVIoaXJxKSBzLT5pcnFfc3RhdGVbaXJxXS50cmlnZ2VyID0gMAorI2RlZmluZSBHSUNfVEVTVF9UUklHR0VSKGlycSkgcy0+aXJxX3N0YXRlW2lycV0udHJpZ2dlcgorI2RlZmluZSBHSUNfR0VUX1BSSU9SSVRZKGlycSwgY3B1KSBcCisgICgoKGlycSkgPCAzMikgPyBzLT5wcmlvcml0eTFbaXJxXVtjcHVdIDogcy0+cHJpb3JpdHkyWyhpcnEpIC0gMzJdKQorI2lmZGVmIE5WSUMKKyNkZWZpbmUgR0lDX1RBUkdFVChpcnEpIDEKKyNlbHNlCisjZGVmaW5lIEdJQ19UQVJHRVQoaXJxKSBzLT5pcnFfdGFyZ2V0W2lycV0KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBnaWNfc3RhdGUKK3sKKyAgICBTeXNCdXNEZXZpY2UgYnVzZGV2OworICAgIHFlbXVfaXJxIHBhcmVudF9pcnFbTkNQVV07CisgICAgaW50IGVuYWJsZWQ7CisgICAgaW50IGNwdV9lbmFibGVkW05DUFVdOworCisgICAgZ2ljX2lycV9zdGF0ZSBpcnFfc3RhdGVbR0lDX05JUlFdOworI2lmbmRlZiBOVklDCisgICAgaW50IGlycV90YXJnZXRbR0lDX05JUlFdOworI2VuZGlmCisgICAgaW50IHByaW9yaXR5MVszMl1bTkNQVV07CisgICAgaW50IHByaW9yaXR5MltHSUNfTklSUSAtIDMyXTsKKyAgICBpbnQgbGFzdF9hY3RpdmVbR0lDX05JUlFdW05DUFVdOworCisgICAgaW50IHByaW9yaXR5X21hc2tbTkNQVV07CisgICAgaW50IHJ1bm5pbmdfaXJxW05DUFVdOworICAgIGludCBydW5uaW5nX3ByaW9yaXR5W05DUFVdOworICAgIGludCBjdXJyZW50X3BlbmRpbmdbTkNQVV07CisKKyAgICBpbnQgaW9tZW10eXBlOworfSBnaWNfc3RhdGU7CisKKy8qIFRPRE86IE1hbnkgcGxhY2VzIHRoYXQgY2FsbCB0aGlzIHJvdXRpbmUgY291bGQgYmUgb3B0aW1pemVkLiAgKi8KKy8qIFVwZGF0ZSBpbnRlcnJ1cHQgc3RhdHVzIGFmdGVyIGVuYWJsZWQgb3IgcGVuZGluZyBiaXRzIGhhdmUgYmVlbiBjaGFuZ2VkLiAgKi8KK3N0YXRpYyB2b2lkIGdpY191cGRhdGUoZ2ljX3N0YXRlICpzKQoreworICAgIGludCBiZXN0X2lycTsKKyAgICBpbnQgYmVzdF9wcmlvOworICAgIGludCBpcnE7CisgICAgaW50IGxldmVsOworICAgIGludCBjcHU7CisgICAgaW50IGNtOworCisgICAgZm9yIChjcHUgPSAwOyBjcHUgPCBOQ1BVOyBjcHUrKykgeworICAgICAgICBjbSA9IDEgPDwgY3B1OworICAgICAgICBzLT5jdXJyZW50X3BlbmRpbmdbY3B1XSA9IDEwMjM7CisgICAgICAgIGlmICghcy0+ZW5hYmxlZCB8fCAhcy0+Y3B1X2VuYWJsZWRbY3B1XSkgeworCSAgICBxZW11X2lycV9sb3dlcihzLT5wYXJlbnRfaXJxW2NwdV0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJlc3RfcHJpbyA9IDB4MTAwOworICAgICAgICBiZXN0X2lycSA9IDEwMjM7CisgICAgICAgIGZvciAoaXJxID0gMDsgaXJxIDwgR0lDX05JUlE7IGlycSsrKSB7CisgICAgICAgICAgICBpZiAoR0lDX1RFU1RfRU5BQkxFRChpcnEpICYmIEdJQ19URVNUX1BFTkRJTkcoaXJxLCBjbSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoR0lDX0dFVF9QUklPUklUWShpcnEsIGNwdSkgPCBiZXN0X3ByaW8pIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9wcmlvID0gR0lDX0dFVF9QUklPUklUWShpcnEsIGNwdSk7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfaXJxID0gaXJxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsZXZlbCA9IDA7CisgICAgICAgIGlmIChiZXN0X3ByaW8gPD0gcy0+cHJpb3JpdHlfbWFza1tjcHVdKSB7CisgICAgICAgICAgICBzLT5jdXJyZW50X3BlbmRpbmdbY3B1XSA9IGJlc3RfaXJxOworICAgICAgICAgICAgaWYgKGJlc3RfcHJpbyA8IHMtPnJ1bm5pbmdfcHJpb3JpdHlbY3B1XSkgeworICAgICAgICAgICAgICAgIERQUklOVEYoIlJhaXNlZCBwZW5kaW5nIElSUSAlZFxuIiwgYmVzdF9pcnEpOworICAgICAgICAgICAgICAgIGxldmVsID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBxZW11X3NldF9pcnEocy0+cGFyZW50X2lycVtjcHVdLCBsZXZlbCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorZ2ljX3NldF9wZW5kaW5nX3ByaXZhdGUoZ2ljX3N0YXRlICpzLCBpbnQgY3B1LCBpbnQgaXJxKQoreworICAgIGludCBjbSA9IDEgPDwgY3B1OworCisgICAgaWYgKEdJQ19URVNUX1BFTkRJTkcoaXJxLCBjbSkpCisgICAgICAgIHJldHVybjsKKworICAgIERQUklOVEYoIlNldCAlZCBwZW5kaW5nIGNwdSAlZFxuIiwgaXJxLCBjcHUpOworICAgIEdJQ19TRVRfUEVORElORyhpcnEsIGNtKTsKKyAgICBnaWNfdXBkYXRlKHMpOworfQorCisvKiBQcm9jZXNzIGEgY2hhbmdlIGluIGFuIGV4dGVybmFsIElSUSBpbnB1dC4gICovCitzdGF0aWMgdm9pZCBnaWNfc2V0X2lycSh2b2lkICpvcGFxdWUsIGludCBpcnEsIGludCBsZXZlbCkKK3sKKyAgICBnaWNfc3RhdGUgKnMgPSAoZ2ljX3N0YXRlICopb3BhcXVlOworICAgIC8qIFRoZSBmaXJzdCBleHRlcm5hbCBpbnB1dCBsaW5lIGlzIGludGVybmFsIGludGVycnVwdCAzMi4gICovCisgICAgaXJxICs9IDMyOworICAgIGlmIChsZXZlbCA9PSBHSUNfVEVTVF9MRVZFTChpcnEsIEFMTF9DUFVfTUFTSykpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChsZXZlbCkgeworICAgICAgICBHSUNfU0VUX0xFVkVMKGlycSwgQUxMX0NQVV9NQVNLKTsKKyAgICAgICAgaWYgKEdJQ19URVNUX1RSSUdHRVIoaXJxKSB8fCBHSUNfVEVTVF9FTkFCTEVEKGlycSkpIHsKKyAgICAgICAgICAgIERQUklOVEYoIlNldCAlZCBwZW5kaW5nIG1hc2sgJXhcbiIsIGlycSwgR0lDX1RBUkdFVChpcnEpKTsKKyAgICAgICAgICAgIEdJQ19TRVRfUEVORElORyhpcnEsIEdJQ19UQVJHRVQoaXJxKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBHSUNfQ0xFQVJfTEVWRUwoaXJxLCBBTExfQ1BVX01BU0spOworICAgIH0KKyAgICBnaWNfdXBkYXRlKHMpOworfQorCitzdGF0aWMgdm9pZCBnaWNfc2V0X3J1bm5pbmdfaXJxKGdpY19zdGF0ZSAqcywgaW50IGNwdSwgaW50IGlycSkKK3sKKyAgICBzLT5ydW5uaW5nX2lycVtjcHVdID0gaXJxOworICAgIGlmIChpcnEgPT0gMTAyMykgeworICAgICAgICBzLT5ydW5uaW5nX3ByaW9yaXR5W2NwdV0gPSAweDEwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5ydW5uaW5nX3ByaW9yaXR5W2NwdV0gPSBHSUNfR0VUX1BSSU9SSVRZKGlycSwgY3B1KTsKKyAgICB9CisgICAgZ2ljX3VwZGF0ZShzKTsKK30KKworc3RhdGljIHVpbnQzMl90IGdpY19hY2tub3dsZWRnZV9pcnEoZ2ljX3N0YXRlICpzLCBpbnQgY3B1KQoreworICAgIGludCBuZXdfaXJxOworICAgIGludCBjbSA9IDEgPDwgY3B1OworICAgIG5ld19pcnEgPSBzLT5jdXJyZW50X3BlbmRpbmdbY3B1XTsKKyAgICBpZiAobmV3X2lycSA9PSAxMDIzCisgICAgICAgICAgICB8fCBHSUNfR0VUX1BSSU9SSVRZKG5ld19pcnEsIGNwdSkgPj0gcy0+cnVubmluZ19wcmlvcml0eVtjcHVdKSB7CisgICAgICAgIERQUklOVEYoIkFDSyBubyBwZW5kaW5nIElSUVxuIik7CisgICAgICAgIHJldHVybiAxMDIzOworICAgIH0KKyAgICBzLT5sYXN0X2FjdGl2ZVtuZXdfaXJxXVtjcHVdID0gcy0+cnVubmluZ19pcnFbY3B1XTsKKyAgICAvKiBDbGVhciBwZW5kaW5nIGZsYWdzIGZvciBib3RoIGxldmVsIGFuZCBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHRzLgorICAgICAgIExldmVsIHRyaWdnZXJlZCBJUlFzIHdpbGwgYmUgcmVhc3NlcnRlZCBvbmNlIHRoZXkgYmVjb21lIGluYWN0aXZlLiAgKi8KKyAgICBHSUNfQ0xFQVJfUEVORElORyhuZXdfaXJxLCBHSUNfVEVTVF9NT0RFTChuZXdfaXJxKSA/IEFMTF9DUFVfTUFTSyA6IGNtKTsKKyAgICBnaWNfc2V0X3J1bm5pbmdfaXJxKHMsIGNwdSwgbmV3X2lycSk7CisgICAgRFBSSU5URigiQUNLICVkXG4iLCBuZXdfaXJxKTsKKyAgICByZXR1cm4gbmV3X2lycTsKK30KKworc3RhdGljIHZvaWQgZ2ljX2NvbXBsZXRlX2lycShnaWNfc3RhdGUgKiBzLCBpbnQgY3B1LCBpbnQgaXJxKQoreworICAgIGludCB1cGRhdGUgPSAwOworICAgIGludCBjbSA9IDEgPDwgY3B1OworICAgIERQUklOVEYoIkVPSSAlZFxuIiwgaXJxKTsKKyAgICBpZiAocy0+cnVubmluZ19pcnFbY3B1XSA9PSAxMDIzKQorICAgICAgICByZXR1cm47IC8qIE5vIGFjdGl2ZSBJUlEuICAqLworICAgIGlmIChpcnEgIT0gMTAyMykgeworICAgICAgICAvKiBNYXJrIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFzIHBlbmRpbmcgaWYgdGhleSBhcmUgc3RpbGwKKyAgICAgICAgICAgcmFpc2VkLiAgKi8KKyAgICAgICAgaWYgKCFHSUNfVEVTVF9UUklHR0VSKGlycSkgJiYgR0lDX1RFU1RfRU5BQkxFRChpcnEpCisgICAgICAgICAgICAgICAgJiYgR0lDX1RFU1RfTEVWRUwoaXJxLCBjbSkgJiYgKEdJQ19UQVJHRVQoaXJxKSAmIGNtKSAhPSAwKSB7CisgICAgICAgICAgICBEUFJJTlRGKCJTZXQgJWQgcGVuZGluZyBtYXNrICV4XG4iLCBpcnEsIGNtKTsKKyAgICAgICAgICAgIEdJQ19TRVRfUEVORElORyhpcnEsIGNtKTsKKyAgICAgICAgICAgIHVwZGF0ZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlycSAhPSBzLT5ydW5uaW5nX2lycVtjcHVdKSB7CisgICAgICAgIC8qIENvbXBsZXRlIGFuIElSUSB0aGF0IGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4gICovCisgICAgICAgIGludCB0bXAgPSBzLT5ydW5uaW5nX2lycVtjcHVdOworICAgICAgICB3aGlsZSAocy0+bGFzdF9hY3RpdmVbdG1wXVtjcHVdICE9IDEwMjMpIHsKKyAgICAgICAgICAgIGlmIChzLT5sYXN0X2FjdGl2ZVt0bXBdW2NwdV0gPT0gaXJxKSB7CisgICAgICAgICAgICAgICAgcy0+bGFzdF9hY3RpdmVbdG1wXVtjcHVdID0gcy0+bGFzdF9hY3RpdmVbaXJxXVtjcHVdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wID0gcy0+bGFzdF9hY3RpdmVbdG1wXVtjcHVdOworICAgICAgICB9CisgICAgICAgIGlmICh1cGRhdGUpIHsKKyAgICAgICAgICAgIGdpY191cGRhdGUocyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb21wbGV0ZSB0aGUgY3VycmVudCBydW5uaW5nIElSUS4gICovCisgICAgICAgIGdpY19zZXRfcnVubmluZ19pcnEocywgY3B1LCBzLT5sYXN0X2FjdGl2ZVtzLT5ydW5uaW5nX2lycVtjcHVdXVtjcHVdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnaWNfZGlzdF9yZWFkYih2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQpCit7CisgICAgZ2ljX3N0YXRlICpzID0gKGdpY19zdGF0ZSAqKW9wYXF1ZTsKKyAgICB1aW50MzJfdCByZXM7CisgICAgaW50IGlycTsKKyAgICBpbnQgaTsKKyAgICBpbnQgY3B1OworICAgIGludCBjbTsKKyAgICBpbnQgbWFzazsKKworICAgIGNwdSA9IGdpY19nZXRfY3VycmVudF9jcHUoKTsKKyAgICBjbSA9IDEgPDwgY3B1OworICAgIGlmIChvZmZzZXQgPCAweDEwMCkgeworI2lmbmRlZiBOVklDCisgICAgICAgIGlmIChvZmZzZXQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzLT5lbmFibGVkOworICAgICAgICBpZiAob2Zmc2V0ID09IDQpCisgICAgICAgICAgICByZXR1cm4gKChHSUNfTklSUSAvIDMyKSAtIDEpIHwgKChOQ1BVIC0gMSkgPDwgNSk7CisgICAgICAgIGlmIChvZmZzZXQgPCAweDA4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHgyMDApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IFNldC9DbGVhciBFbmFibGUuICAqLworICAgICAgICBpZiAob2Zmc2V0IDwgMHgxODApCisgICAgICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHgxMDApICogODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXJxID0gKG9mZnNldCAtIDB4MTgwKSAqIDg7CisgICAgICAgIGlycSArPSBHSUNfQkFTRV9JUlE7CisgICAgICAgIGlmIChpcnEgPj0gR0lDX05JUlEpCisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChHSUNfVEVTVF9FTkFCTEVEKGlycSArIGkpKSB7CisgICAgICAgICAgICAgICAgcmVzIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweDMwMCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgU2V0L0NsZWFyIFBlbmRpbmcuICAqLworICAgICAgICBpZiAob2Zmc2V0IDwgMHgyODApCisgICAgICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHgyMDApICogODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXJxID0gKG9mZnNldCAtIDB4MjgwKSAqIDg7CisgICAgICAgIGlycSArPSBHSUNfQkFTRV9JUlE7CisgICAgICAgIGlmIChpcnEgPj0gR0lDX05JUlEpCisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIHJlcyA9IDA7CisgICAgICAgIG1hc2sgPSAoaXJxIDwgMzIpID8gIGNtIDogQUxMX0NQVV9NQVNLOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoR0lDX1RFU1RfUEVORElORyhpcnEgKyBpLCBtYXNrKSkgeworICAgICAgICAgICAgICAgIHJlcyB8PSAoMSA8PCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHg0MDApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IEFjdGl2ZS4gICovCisgICAgICAgIGlycSA9IChvZmZzZXQgLSAweDMwMCkgKiA4ICsgR0lDX0JBU0VfSVJROworICAgICAgICBpZiAoaXJxID49IEdJQ19OSVJRKQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICByZXMgPSAwOworICAgICAgICBtYXNrID0gKGlycSA8IDMyKSA/ICBjbSA6IEFMTF9DUFVfTUFTSzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgaWYgKEdJQ19URVNUX0FDVElWRShpcnEgKyBpLCBtYXNrKSkgeworICAgICAgICAgICAgICAgIHJlcyB8PSAoMSA8PCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHg4MDApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IFByaW9yaXR5LiAgKi8KKyAgICAgICAgaXJxID0gKG9mZnNldCAtIDB4NDAwKSArIEdJQ19CQVNFX0lSUTsKKyAgICAgICAgaWYgKGlycSA+PSBHSUNfTklSUSkKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgcmVzID0gR0lDX0dFVF9QUklPUklUWShpcnEsIGNwdSk7CisjaWZuZGVmIE5WSUMKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDB4YzAwKSB7CisgICAgICAgIC8qIEludGVycnVwdCBDUFUgVGFyZ2V0LiAgKi8KKyAgICAgICAgaXJxID0gKG9mZnNldCAtIDB4ODAwKSArIEdJQ19CQVNFX0lSUTsKKyAgICAgICAgaWYgKGlycSA+PSBHSUNfTklSUSkKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgaWYgKGlycSA+PSAyOSAmJiBpcnEgPD0gMzEpIHsKKyAgICAgICAgICAgIHJlcyA9IGNtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gR0lDX1RBUkdFVChpcnEpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweGYwMCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbi4gICovCisgICAgICAgIGlycSA9IChvZmZzZXQgLSAweGMwMCkgKiAyICsgR0lDX0JBU0VfSVJROworICAgICAgICBpZiAoaXJxID49IEdJQ19OSVJRKQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICByZXMgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoR0lDX1RFU1RfTU9ERUwoaXJxICsgaSkpCisgICAgICAgICAgICAgICAgcmVzIHw9ICgxIDw8IChpICogMikpOworICAgICAgICAgICAgaWYgKEdJQ19URVNUX1RSSUdHRVIoaXJxICsgaSkpCisgICAgICAgICAgICAgICAgcmVzIHw9ICgyIDw8IChpICogMikpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDB4ZmUwKSB7CisgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICB9IGVsc2UgLyogb2Zmc2V0ID49IDB4ZmUwICovIHsKKyAgICAgICAgaWYgKG9mZnNldCAmIDMpIHsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBnaWNfaWRbKG9mZnNldCAtIDB4ZmUwKSA+PiAyXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworYmFkX3JlZzoKKyAgICBod19lcnJvcigiZ2ljX2Rpc3RfcmVhZGI6IEJhZCBvZmZzZXQgJXhcbiIsIChpbnQpb2Zmc2V0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGdpY19kaXN0X3JlYWR3KHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICB1aW50MzJfdCB2YWw7CisgICAgdmFsID0gZ2ljX2Rpc3RfcmVhZGIob3BhcXVlLCBvZmZzZXQpOworICAgIHZhbCB8PSBnaWNfZGlzdF9yZWFkYihvcGFxdWUsIG9mZnNldCArIDEpIDw8IDg7CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVpbnQzMl90IGdpY19kaXN0X3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICB1aW50MzJfdCB2YWw7CisjaWZkZWYgTlZJQworICAgIGdpY19zdGF0ZSAqcyA9IChnaWNfc3RhdGUgKilvcGFxdWU7CisgICAgdWludDMyX3QgYWRkcjsKKyAgICBhZGRyID0gb2Zmc2V0OworICAgIGlmIChhZGRyIDwgMHgxMDAgfHwgYWRkciA+IDB4ZDAwKQorICAgICAgICByZXR1cm4gbnZpY19yZWFkbChzLCBhZGRyKTsKKyNlbmRpZgorICAgIHZhbCA9IGdpY19kaXN0X3JlYWR3KG9wYXF1ZSwgb2Zmc2V0KTsKKyAgICB2YWwgfD0gZ2ljX2Rpc3RfcmVhZHcob3BhcXVlLCBvZmZzZXQgKyAyKSA8PCAxNjsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBnaWNfZGlzdF93cml0ZWIodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGdpY19zdGF0ZSAqcyA9IChnaWNfc3RhdGUgKilvcGFxdWU7CisgICAgaW50IGlycTsKKyAgICBpbnQgaTsKKyAgICBpbnQgY3B1OworCisgICAgY3B1ID0gZ2ljX2dldF9jdXJyZW50X2NwdSgpOworICAgIGlmIChvZmZzZXQgPCAweDEwMCkgeworI2lmZGVmIE5WSUMKKyAgICAgICAgZ290byBiYWRfcmVnOworI2Vsc2UKKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBzLT5lbmFibGVkID0gKHZhbHVlICYgMSk7CisgICAgICAgICAgICBEUFJJTlRGKCJEaXN0cmlidXRpb24gJXNhYmxlZFxuIiwgcy0+ZW5hYmxlZCA/ICJFbiIgOiAiRGlzIik7CisgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgNCkgeworICAgICAgICAgICAgLyogaWdub3JlZC4gICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHgxODApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IFNldCBFbmFibGUuICAqLworICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHgxMDApICogOCArIEdJQ19CQVNFX0lSUTsKKyAgICAgICAgaWYgKGlycSA+PSBHSUNfTklSUSkKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgaWYgKGlycSA8IDE2KQorICAgICAgICAgIHZhbHVlID0gMHhmZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbHVlICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbWFzayA9IChpcnEgPCAzMikgPyAoMSA8PCBjcHUpIDogR0lDX1RBUkdFVChpcnEpOworICAgICAgICAgICAgICAgIGlmICghR0lDX1RFU1RfRU5BQkxFRChpcnEgKyBpKSkKKyAgICAgICAgICAgICAgICAgICAgRFBSSU5URigiRW5hYmxlZCBJUlEgJWRcbiIsIGlycSArIGkpOworICAgICAgICAgICAgICAgIEdJQ19TRVRfRU5BQkxFRChpcnEgKyBpKTsKKyAgICAgICAgICAgICAgICAvKiBJZiBhIHJhaXNlZCBsZXZlbCB0cmlnZ2VyZWQgSVJRIGVuYWJsZWQgdGhlbiBtYXJrCisgICAgICAgICAgICAgICAgICAgaXMgYXMgcGVuZGluZy4gICovCisgICAgICAgICAgICAgICAgaWYgKEdJQ19URVNUX0xFVkVMKGlycSArIGksIG1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhR0lDX1RFU1RfVFJJR0dFUihpcnEgKyBpKSkgeworICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJTZXQgJWQgcGVuZGluZyBtYXNrICV4XG4iLCBpcnEgKyBpLCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgR0lDX1NFVF9QRU5ESU5HKGlycSArIGksIG1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHgyMDApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IENsZWFyIEVuYWJsZS4gICovCisgICAgICAgIGlycSA9IChvZmZzZXQgLSAweDE4MCkgKiA4ICsgR0lDX0JBU0VfSVJROworICAgICAgICBpZiAoaXJxID49IEdJQ19OSVJRKQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICBpZiAoaXJxIDwgMTYpCisgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgIGlmIChHSUNfVEVTVF9FTkFCTEVEKGlycSArIGkpKQorICAgICAgICAgICAgICAgICAgICBEUFJJTlRGKCJEaXNhYmxlZCBJUlEgJWRcbiIsIGlycSArIGkpOworICAgICAgICAgICAgICAgIEdJQ19DTEVBUl9FTkFCTEVEKGlycSArIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweDI4MCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgU2V0IFBlbmRpbmcuICAqLworICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHgyMDApICogOCArIEdJQ19CQVNFX0lSUTsKKyAgICAgICAgaWYgKGlycSA+PSBHSUNfTklSUSkKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgaWYgKGlycSA8IDE2KQorICAgICAgICAgIGlycSA9IDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbHVlICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICBHSUNfU0VUX1BFTkRJTkcoaXJxICsgaSwgR0lDX1RBUkdFVChpcnEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMHgzMDApIHsKKyAgICAgICAgLyogSW50ZXJydXB0IENsZWFyIFBlbmRpbmcuICAqLworICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHgyODApICogOCArIEdJQ19CQVNFX0lSUTsKKyAgICAgICAgaWYgKGlycSA+PSBHSUNfTklSUSkKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgLyogPz8/IFRoaXMgY3VycmVudGx5IGNsZWFycyB0aGUgcGVuZGluZyBiaXQgZm9yIGFsbCBDUFVzLCBldmVuCisgICAgICAgICAgICAgICBmb3IgcGVyLUNQVSBpbnRlcnJ1cHRzLiAgSXQncyB1bmNsZWFyIHdoZXRoZXIgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgIGNvcmVjdCBiZWhhdmlvci4gICovCisgICAgICAgICAgICBpZiAodmFsdWUgJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgIEdJQ19DTEVBUl9QRU5ESU5HKGlycSArIGksIEFMTF9DUFVfTUFTSyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDB4NDAwKSB7CisgICAgICAgIC8qIEludGVycnVwdCBBY3RpdmUuICAqLworICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweDgwMCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgUHJpb3JpdHkuICAqLworICAgICAgICBpcnEgPSAob2Zmc2V0IC0gMHg0MDApICsgR0lDX0JBU0VfSVJROworICAgICAgICBpZiAoaXJxID49IEdJQ19OSVJRKQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICBpZiAoaXJxIDwgMzIpIHsKKyAgICAgICAgICAgIHMtPnByaW9yaXR5MVtpcnFdW2NwdV0gPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnByaW9yaXR5MltpcnEgLSAzMl0gPSB2YWx1ZTsKKyAgICAgICAgfQorI2lmbmRlZiBOVklDCisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweGMwMCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgQ1BVIFRhcmdldC4gICovCisgICAgICAgIGlycSA9IChvZmZzZXQgLSAweDgwMCkgKyBHSUNfQkFTRV9JUlE7CisgICAgICAgIGlmIChpcnEgPj0gR0lDX05JUlEpCisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIGlmIChpcnEgPCAyOSkKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgZWxzZSBpZiAoaXJxIDwgMzIpCisgICAgICAgICAgICB2YWx1ZSA9IEFMTF9DUFVfTUFTSzsKKyAgICAgICAgcy0+aXJxX3RhcmdldFtpcnFdID0gdmFsdWUgJiBBTExfQ1BVX01BU0s7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAweGYwMCkgeworICAgICAgICAvKiBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbi4gICovCisgICAgICAgIGlycSA9IChvZmZzZXQgLSAweGMwMCkgKiA0ICsgR0lDX0JBU0VfSVJROworICAgICAgICBpZiAoaXJxID49IEdJQ19OSVJRKQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICBpZiAoaXJxIDwgMzIpCisgICAgICAgICAgICB2YWx1ZSB8PSAweGFhOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiAoMSA8PCAoaSAqIDIpKSkgeworICAgICAgICAgICAgICAgIEdJQ19TRVRfTU9ERUwoaXJxICsgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEdJQ19DTEVBUl9NT0RFTChpcnEgKyBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZSAmICgyIDw8IChpICogMikpKSB7CisgICAgICAgICAgICAgICAgR0lDX1NFVF9UUklHR0VSKGlycSArIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHSUNfQ0xFQVJfVFJJR0dFUihpcnEgKyBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMHhmMDAgaXMgb25seSBoYW5kbGVkIGZvciAzMi1iaXQgd3JpdGVzLiAgKi8KKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIH0KKyAgICBnaWNfdXBkYXRlKHMpOworICAgIHJldHVybjsKK2JhZF9yZWc6CisgICAgaHdfZXJyb3IoImdpY19kaXN0X3dyaXRlYjogQmFkIG9mZnNldCAleFxuIiwgKGludClvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBnaWNfZGlzdF93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGdpY19kaXN0X3dyaXRlYihvcGFxdWUsIG9mZnNldCwgdmFsdWUgJiAweGZmKTsKKyAgICBnaWNfZGlzdF93cml0ZWIob3BhcXVlLCBvZmZzZXQgKyAxLCB2YWx1ZSA+PiA4KTsKK30KKworc3RhdGljIHZvaWQgZ2ljX2Rpc3Rfd3JpdGVsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBnaWNfc3RhdGUgKnMgPSAoZ2ljX3N0YXRlICopb3BhcXVlOworI2lmZGVmIE5WSUMKKyAgICB1aW50MzJfdCBhZGRyOworICAgIGFkZHIgPSBvZmZzZXQ7CisgICAgaWYgKGFkZHIgPCAweDEwMCB8fCAoYWRkciA+IDB4ZDAwICYmIGFkZHIgIT0gMHhmMDApKSB7CisgICAgICAgIG52aWNfd3JpdGVsKHMsIGFkZHIsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZgorICAgIGlmIChvZmZzZXQgPT0gMHhmMDApIHsKKyAgICAgICAgaW50IGNwdTsKKyAgICAgICAgaW50IGlycTsKKyAgICAgICAgaW50IG1hc2s7CisKKyAgICAgICAgY3B1ID0gZ2ljX2dldF9jdXJyZW50X2NwdSgpOworICAgICAgICBpcnEgPSB2YWx1ZSAmIDB4M2ZmOworICAgICAgICBzd2l0Y2ggKCh2YWx1ZSA+PiAyNCkgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIG1hc2sgPSAodmFsdWUgPj4gMTYpICYgQUxMX0NQVV9NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1hc2sgPSAxIDw8IGNwdTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtYXNrID0gQUxMX0NQVV9NQVNLIF4gKDEgPDwgY3B1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgRFBSSU5URigiQmFkIFNvZnQgSW50IHRhcmdldCBmaWx0ZXJcbiIpOworICAgICAgICAgICAgbWFzayA9IEFMTF9DUFVfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEdJQ19TRVRfUEVORElORyhpcnEsIG1hc2spOworICAgICAgICBnaWNfdXBkYXRlKHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdpY19kaXN0X3dyaXRldyhvcGFxdWUsIG9mZnNldCwgdmFsdWUgJiAweGZmZmYpOworICAgIGdpY19kaXN0X3dyaXRldyhvcGFxdWUsIG9mZnNldCArIDIsIHZhbHVlID4+IDE2KTsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpnaWNfZGlzdF9yZWFkZm5bXSA9IHsKKyAgIGdpY19kaXN0X3JlYWRiLAorICAgZ2ljX2Rpc3RfcmVhZHcsCisgICBnaWNfZGlzdF9yZWFkbAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZ2ljX2Rpc3Rfd3JpdGVmbltdID0geworICAgZ2ljX2Rpc3Rfd3JpdGViLAorICAgZ2ljX2Rpc3Rfd3JpdGV3LAorICAgZ2ljX2Rpc3Rfd3JpdGVsCit9OworCisjaWZuZGVmIE5WSUMKK3N0YXRpYyB1aW50MzJfdCBnaWNfY3B1X3JlYWQoZ2ljX3N0YXRlICpzLCBpbnQgY3B1LCBpbnQgb2Zmc2V0KQoreworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSAweDAwOiAvKiBDb250cm9sICovCisgICAgICAgIHJldHVybiBzLT5jcHVfZW5hYmxlZFtjcHVdOworICAgIGNhc2UgMHgwNDogLyogUHJpb3JpdHkgbWFzayAqLworICAgICAgICByZXR1cm4gcy0+cHJpb3JpdHlfbWFza1tjcHVdOworICAgIGNhc2UgMHgwODogLyogQmluYXJ5IFBvaW50ICovCisgICAgICAgIC8qID8/PyBOb3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIDB4MGM6IC8qIEFja25vd2xlZGdlICovCisgICAgICAgIHJldHVybiBnaWNfYWNrbm93bGVkZ2VfaXJxKHMsIGNwdSk7CisgICAgY2FzZSAweDE0OiAvKiBSdW5pbmcgUHJpb3JpdHkgKi8KKyAgICAgICAgcmV0dXJuIHMtPnJ1bm5pbmdfcHJpb3JpdHlbY3B1XTsKKyAgICBjYXNlIDB4MTg6IC8qIEhpZ2hlc3QgUGVuZGluZyBJbnRlcnJ1cHQgKi8KKyAgICAgICAgcmV0dXJuIHMtPmN1cnJlbnRfcGVuZGluZ1tjcHVdOworICAgIGRlZmF1bHQ6CisgICAgICAgIGh3X2Vycm9yKCJnaWNfY3B1X3JlYWQ6IEJhZCBvZmZzZXQgJXhcbiIsIChpbnQpb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnaWNfY3B1X3dyaXRlKGdpY19zdGF0ZSAqcywgaW50IGNwdSwgaW50IG9mZnNldCwgdWludDMyX3QgdmFsdWUpCit7CisgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICBjYXNlIDB4MDA6IC8qIENvbnRyb2wgKi8KKyAgICAgICAgcy0+Y3B1X2VuYWJsZWRbY3B1XSA9ICh2YWx1ZSAmIDEpOworICAgICAgICBEUFJJTlRGKCJDUFUgJXNhYmxlZFxuIiwgcy0+Y3B1X2VuYWJsZWQgPyAiRW4iIDogIkRpcyIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDQ6IC8qIFByaW9yaXR5IG1hc2sgKi8KKyAgICAgICAgcy0+cHJpb3JpdHlfbWFza1tjcHVdID0gKHZhbHVlICYgMHhmZik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwODogLyogQmluYXJ5IFBvaW50ICovCisgICAgICAgIC8qID8/PyBOb3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTA6IC8qIEVuZCBPZiBJbnRlcnJ1cHQgKi8KKyAgICAgICAgcmV0dXJuIGdpY19jb21wbGV0ZV9pcnEocywgY3B1LCB2YWx1ZSAmIDB4M2ZmKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBod19lcnJvcigiZ2ljX2NwdV93cml0ZTogQmFkIG9mZnNldCAleFxuIiwgKGludClvZmZzZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdpY191cGRhdGUocyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2ljX3Jlc2V0KGdpY19zdGF0ZSAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBtZW1zZXQocy0+aXJxX3N0YXRlLCAwLCBHSUNfTklSUSAqIHNpemVvZihnaWNfaXJxX3N0YXRlKSk7CisgICAgZm9yIChpID0gMCA7IGkgPCBOQ1BVOyBpKyspIHsKKyAgICAgICAgcy0+cHJpb3JpdHlfbWFza1tpXSA9IDB4ZjA7CisgICAgICAgIHMtPmN1cnJlbnRfcGVuZGluZ1tpXSA9IDEwMjM7CisgICAgICAgIHMtPnJ1bm5pbmdfaXJxW2ldID0gMTAyMzsKKyAgICAgICAgcy0+cnVubmluZ19wcmlvcml0eVtpXSA9IDB4MTAwOworI2lmZGVmIE5WSUMKKyAgICAgICAgLyogVGhlIE5WSUMgZG9lc24ndCBoYXZlIHBlci1jcHUgaW50ZXJmYWNlcywgc28gZW5hYmxlIGJ5IGRlZmF1bHQuICAqLworICAgICAgICBzLT5jcHVfZW5hYmxlZFtpXSA9IDE7CisjZWxzZQorICAgICAgICBzLT5jcHVfZW5hYmxlZFtpXSA9IDA7CisjZW5kaWYKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgR0lDX1NFVF9FTkFCTEVEKGkpOworICAgICAgICBHSUNfU0VUX1RSSUdHRVIoaSk7CisgICAgfQorI2lmZGVmIE5WSUMKKyAgICAvKiBUaGUgTlZJQyBpcyBhbHdheXMgZW5hYmxlZC4gICovCisgICAgcy0+ZW5hYmxlZCA9IDE7CisjZWxzZQorICAgIHMtPmVuYWJsZWQgPSAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGdpY19zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgZ2ljX3N0YXRlICpzID0gKGdpY19zdGF0ZSAqKW9wYXF1ZTsKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+ZW5hYmxlZCk7CisgICAgZm9yIChpID0gMDsgaSA8IE5DUFU7IGkrKykgeworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmNwdV9lbmFibGVkW2ldKTsKKyNpZm5kZWYgTlZJQworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmlycV90YXJnZXRbaV0pOworI2VuZGlmCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorICAgICAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5wcmlvcml0eTFbal1baV0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgR0lDX05JUlE7IGorKykKKyAgICAgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+bGFzdF9hY3RpdmVbal1baV0pOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnByaW9yaXR5X21hc2tbaV0pOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnJ1bm5pbmdfaXJxW2ldKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5ydW5uaW5nX3ByaW9yaXR5W2ldKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5jdXJyZW50X3BlbmRpbmdbaV0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgR0lDX05JUlEgLSAzMjsgaSsrKSB7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+cHJpb3JpdHkyW2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEdJQ19OSVJROyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5pcnFfc3RhdGVbaV0uZW5hYmxlZCk7CisgICAgICAgIHFlbXVfcHV0X2J5dGUoZiwgcy0+aXJxX3N0YXRlW2ldLnBlbmRpbmcpOworICAgICAgICBxZW11X3B1dF9ieXRlKGYsIHMtPmlycV9zdGF0ZVtpXS5hY3RpdmUpOworICAgICAgICBxZW11X3B1dF9ieXRlKGYsIHMtPmlycV9zdGF0ZVtpXS5sZXZlbCk7CisgICAgICAgIHFlbXVfcHV0X2J5dGUoZiwgcy0+aXJxX3N0YXRlW2ldLm1vZGVsKTsKKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5pcnFfc3RhdGVbaV0udHJpZ2dlcik7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdpY19sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIGdpY19zdGF0ZSAqcyA9IChnaWNfc3RhdGUgKilvcGFxdWU7CisgICAgaW50IGk7CisgICAgaW50IGo7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHMtPmVuYWJsZWQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBOQ1BVOyBpKyspIHsKKyAgICAgICAgcy0+Y3B1X2VuYWJsZWRbaV0gPSBxZW11X2dldF9iZTMyKGYpOworI2lmbmRlZiBOVklDCisgICAgICAgIHMtPmlycV90YXJnZXRbaV0gPSBxZW11X2dldF9iZTMyKGYpOworI2VuZGlmCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMjsgaisrKQorICAgICAgICAgICAgcy0+cHJpb3JpdHkxW2pdW2ldID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEdJQ19OSVJROyBqKyspCisgICAgICAgICAgICBzLT5sYXN0X2FjdGl2ZVtqXVtpXSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIHMtPnByaW9yaXR5X21hc2tbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBzLT5ydW5uaW5nX2lycVtpXSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIHMtPnJ1bm5pbmdfcHJpb3JpdHlbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBzLT5jdXJyZW50X3BlbmRpbmdbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgR0lDX05JUlEgLSAzMjsgaSsrKSB7CisgICAgICAgIHMtPnByaW9yaXR5MltpXSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBHSUNfTklSUTsgaSsrKSB7CisgICAgICAgIHMtPmlycV9zdGF0ZVtpXS5lbmFibGVkID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgcy0+aXJxX3N0YXRlW2ldLnBlbmRpbmcgPSBxZW11X2dldF9ieXRlKGYpOworICAgICAgICBzLT5pcnFfc3RhdGVbaV0uYWN0aXZlID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgcy0+aXJxX3N0YXRlW2ldLmxldmVsID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgcy0+aXJxX3N0YXRlW2ldLm1vZGVsID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgcy0+aXJxX3N0YXRlW2ldLnRyaWdnZXIgPSBxZW11X2dldF9ieXRlKGYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnaWNfaW5pdChnaWNfc3RhdGUgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBxZGV2X2luaXRfZ3Bpb19pbigmcy0+YnVzZGV2LnFkZXYsIGdpY19zZXRfaXJxLCBHSUNfTklSUSAtIDMyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNQVTsgaSsrKSB7CisgICAgICAgIHN5c2J1c19pbml0X2lycSgmcy0+YnVzZGV2LCAmcy0+cGFyZW50X2lycVtpXSk7CisgICAgfQorICAgIHMtPmlvbWVtdHlwZSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZ2ljX2Rpc3RfcmVhZGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ljX2Rpc3Rfd3JpdGVmbiwgcyk7CisgICAgZ2ljX3Jlc2V0KHMpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLAorICAgICAgICAgICAgICAgICAgICAiYXJtX2dpYyIsCisgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICBnaWNfc2F2ZSwKKyAgICAgICAgICAgICAgICAgICAgZ2ljX2xvYWQsCisgICAgICAgICAgICAgICAgICAgIHMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9hcm0vYXJtdjdtLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2FybS9hcm12N20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTBjYzAyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hcm0vYXJtdjdtLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBBUk1WN00gU3lzdGVtIGVtdWxhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiaHcvc3lzYnVzLmgiCisjaW5jbHVkZSAiaHcvYXJtL2FybS5oIgorI2luY2x1ZGUgImV4ZWMvcmFtX2FkZHIuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisKKy8qIEJpdGJhbmRlZCBJTy4gIEVhY2ggd29yZCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBiaXQuICAqLworCisvKiBHZXQgdGhlIGJ5dGUgYWRkcmVzcyBvZiB0aGUgcmVhbCBtZW1vcnkgZm9yIGEgYml0YmFuZCBhY2Vzcy4gICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJpdGJhbmRfYWRkcih2b2lkICogb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIHVpbnQzMl90IHJlczsKKworICAgIHJlcyA9ICoodWludDMyX3QgKilvcGFxdWU7CisgICAgcmVzIHw9IChhZGRyICYgMHgxZmZmZmZmKSA+PiA1OworICAgIHJldHVybiByZXM7CisKK30KKworc3RhdGljIHVpbnQzMl90IGJpdGJhbmRfcmVhZGIodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHVpbnQ4X3QgdjsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoYml0YmFuZF9hZGRyKG9wYXF1ZSwgb2Zmc2V0KSwgJnYsIDEpOworICAgIHJldHVybiAodiAmICgxIDw8ICgob2Zmc2V0ID4+IDIpICYgNykpKSAhPSAwOworfQorCitzdGF0aWMgdm9pZCBiaXRiYW5kX3dyaXRlYih2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1aW50MzJfdCBhZGRyOworICAgIHVpbnQ4X3QgbWFzazsKKyAgICB1aW50OF90IHY7CisgICAgYWRkciA9IGJpdGJhbmRfYWRkcihvcGFxdWUsIG9mZnNldCk7CisgICAgbWFzayA9ICgxIDw8ICgob2Zmc2V0ID4+IDIpICYgNykpOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChhZGRyLCAmdiwgMSk7CisgICAgaWYgKHZhbHVlICYgMSkKKyAgICAgICAgdiB8PSBtYXNrOworICAgIGVsc2UKKyAgICAgICAgdiAmPSB+bWFzazsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGFkZHIsICZ2LCAxKTsKK30KKworc3RhdGljIHVpbnQzMl90IGJpdGJhbmRfcmVhZHcodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHVpbnQzMl90IGFkZHI7CisgICAgdWludDE2X3QgbWFzazsKKyAgICB1aW50MTZfdCB2OworICAgIGFkZHIgPSBiaXRiYW5kX2FkZHIob3BhcXVlLCBvZmZzZXQpICYgfjE7CisgICAgbWFzayA9ICgxIDw8ICgob2Zmc2V0ID4+IDIpICYgMTUpKTsKKyAgICBtYXNrID0gdHN3YXAxNihtYXNrKTsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoYWRkciwgKHVpbnQ4X3QgKikmdiwgMik7CisgICAgcmV0dXJuICh2ICYgbWFzaykgIT0gMDsKK30KKworc3RhdGljIHZvaWQgYml0YmFuZF93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgdWludDMyX3QgYWRkcjsKKyAgICB1aW50MTZfdCBtYXNrOworICAgIHVpbnQxNl90IHY7CisgICAgYWRkciA9IGJpdGJhbmRfYWRkcihvcGFxdWUsIG9mZnNldCkgJiB+MTsKKyAgICBtYXNrID0gKDEgPDwgKChvZmZzZXQgPj4gMikgJiAxNSkpOworICAgIG1hc2sgPSB0c3dhcDE2KG1hc2spOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZChhZGRyLCAodWludDhfdCAqKSZ2LCAyKTsKKyAgICBpZiAodmFsdWUgJiAxKQorICAgICAgICB2IHw9IG1hc2s7CisgICAgZWxzZQorICAgICAgICB2ICY9IH5tYXNrOworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUoYWRkciwgKHVpbnQ4X3QgKikmdiwgMik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBiaXRiYW5kX3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICB1aW50MzJfdCBhZGRyOworICAgIHVpbnQzMl90IG1hc2s7CisgICAgdWludDMyX3QgdjsKKyAgICBhZGRyID0gYml0YmFuZF9hZGRyKG9wYXF1ZSwgb2Zmc2V0KSAmIH4zOworICAgIG1hc2sgPSAoMSA8PCAoKG9mZnNldCA+PiAyKSAmIDMxKSk7CisgICAgbWFzayA9IHRzd2FwMzIobWFzayk7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9yZWFkKGFkZHIsICh1aW50OF90ICopJnYsIDQpOworICAgIHJldHVybiAodiAmIG1hc2spICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGJpdGJhbmRfd3JpdGVsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIHVpbnQzMl90IGFkZHI7CisgICAgdWludDMyX3QgbWFzazsKKyAgICB1aW50MzJfdCB2OworICAgIGFkZHIgPSBiaXRiYW5kX2FkZHIob3BhcXVlLCBvZmZzZXQpICYgfjM7CisgICAgbWFzayA9ICgxIDw8ICgob2Zmc2V0ID4+IDIpICYgMzEpKTsKKyAgICBtYXNrID0gdHN3YXAzMihtYXNrKTsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoYWRkciwgKHVpbnQ4X3QgKikmdiwgNCk7CisgICAgaWYgKHZhbHVlICYgMSkKKyAgICAgICAgdiB8PSBtYXNrOworICAgIGVsc2UKKyAgICAgICAgdiAmPSB+bWFzazsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGFkZHIsICh1aW50OF90ICopJnYsIDQpOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKiBjb25zdCBiaXRiYW5kX3JlYWRmbltdID0geworICAgYml0YmFuZF9yZWFkYiwKKyAgIGJpdGJhbmRfcmVhZHcsCisgICBiaXRiYW5kX3JlYWRsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICogY29uc3QgYml0YmFuZF93cml0ZWZuW10gPSB7CisgICBiaXRiYW5kX3dyaXRlYiwKKyAgIGJpdGJhbmRfd3JpdGV3LAorICAgYml0YmFuZF93cml0ZWwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTeXNCdXNEZXZpY2UgYnVzZGV2OworICAgIHVpbnQzMl90IGJhc2U7Cit9IEJpdEJhbmRTdGF0ZTsKKworc3RhdGljIHZvaWQgYml0YmFuZF9pbml0KFN5c0J1c0RldmljZSAqZGV2KQoreworICAgIEJpdEJhbmRTdGF0ZSAqcyA9IEZST01fU1lTQlVTKEJpdEJhbmRTdGF0ZSwgZGV2KTsKKyAgICBpbnQgaW9tZW10eXBlOworCisgICAgcy0+YmFzZSA9IHFkZXZfZ2V0X3Byb3BfaW50KCZkZXYtPnFkZXYsICJiYXNlIiwgMCk7CisgICAgaW9tZW10eXBlID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShiaXRiYW5kX3JlYWRmbiwgYml0YmFuZF93cml0ZWZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmJhc2UpOworICAgIHN5c2J1c19pbml0X21taW8oZGV2LCAweDAyMDAwMDAwLCBpb21lbXR5cGUpOworfQorCitzdGF0aWMgdm9pZCBhcm12N21fYml0YmFuZF9pbml0KHZvaWQpCit7CisgICAgRGV2aWNlU3RhdGUgKmRldjsKKworICAgIGRldiA9IHFkZXZfY3JlYXRlKE5VTEwsICJBUk0sYml0YmFuZC1tZW1vcnkiKTsKKyAgICBxZGV2X3NldF9wcm9wX2ludChkZXYsICJiYXNlIiwgMHgyMDAwMDAwMCk7CisgICAgcWRldl9pbml0KGRldik7CisgICAgc3lzYnVzX21taW9fbWFwKHN5c2J1c19mcm9tX3FkZXYoZGV2KSwgMCwgMHgyMjAwMDAwMCk7CisKKyAgICBkZXYgPSBxZGV2X2NyZWF0ZShOVUxMLCAiQVJNLGJpdGJhbmQtbWVtb3J5Iik7CisgICAgcWRldl9zZXRfcHJvcF9pbnQoZGV2LCAiYmFzZSIsIDB4NDAwMDAwMDApOworICAgIHFkZXZfaW5pdChkZXYpOworICAgIHN5c2J1c19tbWlvX21hcChzeXNidXNfZnJvbV9xZGV2KGRldiksIDAsIDB4NDIwMDAwMDApOworfQorCisvKiBCb2FyZCBpbml0LiAgKi8KKy8qIEluaXQgQ1BVIGFuZCBtZW1vcnkgZm9yIGEgdjctTSBiYXNlZCBib2FyZC4KKyAgIGZsYXNoX3NpemUgYW5kIHNyYW1fc2l6ZSBhcmUgaW4ga2IuCisgICBSZXR1cm5zIHRoZSBOVklDIGFycmF5LiAgKi8KKworcWVtdV9pcnEgKmFybXY3bV9pbml0KGludCBmbGFzaF9zaXplLCBpbnQgc3JhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9maWxlbmFtZSwgY29uc3QgY2hhciAqY3B1X21vZGVsKQoreworICAgIENQVU9sZFN0YXRlICplbnY7CisgICAgRGV2aWNlU3RhdGUgKm52aWM7CisgICAgLyogRklYTUU6IG1ha2UgdGhpcyBsb2NhbCBzdGF0ZS4gICovCisgICAgc3RhdGljIHFlbXVfaXJxIHBpY1s2NF07CisgICAgcWVtdV9pcnEgKmNwdV9waWM7CisgICAgdWludDMyX3QgcGM7CisgICAgaW50IGltYWdlX3NpemU7CisgICAgdWludDY0X3QgZW50cnk7CisgICAgdWludDY0X3QgbG93YWRkcjsKKyAgICBpbnQgaTsKKworICAgIGZsYXNoX3NpemUgKj0gMTAyNDsKKyAgICBzcmFtX3NpemUgKj0gMTAyNDsKKworICAgIGlmICghY3B1X21vZGVsKQorCWNwdV9tb2RlbCA9ICJjb3J0ZXgtbTMiOworICAgIGVudiA9IGNwdV9pbml0KGNwdV9tb2RlbCk7CisgICAgaWYgKCFlbnYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBDUFUgZGVmaW5pdGlvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisjaWYgMAorICAgIC8qID4gMzJNYiBTUkFNIGdldHMgY29tcGxpY2F0ZWQgYmVjYXVzZSBpdCBvdmVybGFwcyB0aGUgYml0YmFuZCBhcmVhLgorICAgICAgIFdlIGRvbid0IGhhdmUgcHJvcGVyIGNvbW1hbmRsaW5lIG9wdGlvbnMsIHNvIGFsbG9jYXRlIGhhbGYgb2YgbWVtb3J5CisgICAgICAgYXMgU1JBTSwgdXAgdG8gYSBtYXhpbXVtIG9mIDMyTWIsIGFuZCB0aGUgcmVzdCBhcyBjb2RlLiAgKi8KKyAgICBpZiAocmFtX3NpemUgPiAoNTEyICsgMzIpICogMTAyNCAqIDEwMjQpCisgICAgICAgIHJhbV9zaXplID0gKDUxMiArIDMyKSAqIDEwMjQgKiAxMDI0OworICAgIHNyYW1fc2l6ZSA9IChyYW1fc2l6ZSAvIDIpICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICBpZiAoc3JhbV9zaXplID4gMzIgKiAxMDI0ICogMTAyNCkKKyAgICAgICAgc3JhbV9zaXplID0gMzIgKiAxMDI0ICogMTAyNDsKKyAgICBjb2RlX3NpemUgPSByYW1fc2l6ZSAtIHNyYW1fc2l6ZTsKKyNlbmRpZgorCisgICAgLyogRmxhc2ggcHJvZ3JhbW1pbmcgaXMgZG9uZSB2aWEgdGhlIFNDVSwgc28gcHJldGVuZCBpdCBpcyBST00uICAqLworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMCwgZmxhc2hfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfcmFtX2FsbG9jKE5VTEwsICJhcm12N20uZmxhc2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hfc2l6ZSkgfCBJT19NRU1fUk9NKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4MjAwMDAwMDAsIHNyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfcmFtX2FsbG9jKE5VTEwsICJhcm12N20uc3JhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmFtX3NpemUpIHwgSU9fTUVNX1JBTSk7CisgICAgYXJtdjdtX2JpdGJhbmRfaW5pdCgpOworCisgICAgbnZpYyA9IHFkZXZfY3JlYXRlKE5VTEwsICJhcm12N21fbnZpYyIpOworICAgIGVudi0+bnZpYyA9IG52aWM7CisgICAgcWRldl9pbml0KG52aWMpOworICAgIGNwdV9waWMgPSBhcm1fcGljX2luaXRfY3B1KGVudik7CisgICAgc3lzYnVzX2Nvbm5lY3RfaXJxKHN5c2J1c19mcm9tX3FkZXYobnZpYyksIDAsIGNwdV9waWNbQVJNX1BJQ19DUFVfSVJRXSk7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgcGljW2ldID0gcWRldl9nZXRfZ3Bpb19pbihudmljLCBpKTsKKyAgICB9CisKKyAgICBpbWFnZV9zaXplID0gbG9hZF9lbGYoa2VybmVsX2ZpbGVuYW1lLCAwLCAmZW50cnksICZsb3dhZGRyLCBOVUxMKTsKKyAgICBpZiAoaW1hZ2Vfc2l6ZSA8IDApIHsKKyAgICAgICAgaW1hZ2Vfc2l6ZSA9IGxvYWRfaW1hZ2VfdGFyZ3BoeXMoa2VybmVsX2ZpbGVuYW1lLCAwLCBmbGFzaF9zaXplKTsKKwlsb3dhZGRyID0gMDsKKyAgICB9CisgICAgaWYgKGltYWdlX3NpemUgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogY291bGQgbm90IGxvYWQga2VybmVsICclcydcbiIsCisgICAgICAgICAgICAgICAga2VybmVsX2ZpbGVuYW1lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgaW1hZ2Ugd2FzIGxvYWRlZCBhdCBhZGRyZXNzIHplcm8gdGhlbiBhc3N1bWUgaXQgaXMgYQorICAgICAgIHJlZ3VsYXIgUk9NIGltYWdlIGFuZCBwZXJmb3JtIHRoZSBub3JtYWwgQ1BVIHJlc2V0IHNlcXVlbmNlLgorICAgICAgIE90aGVyd2lzZSBqdW1wIGRpcmVjdGx5IHRvIHRoZSBlbnRyeSBwb2ludC4gICovCisgICAgaWYgKGxvd2FkZHIgPT0gMCkgeworCWVudi0+cmVnc1sxM10gPSBsZGxfcGh5cygwKTsKKwlwYyA9IGxkbF9waHlzKDQpOworICAgIH0gZWxzZSB7CisJcGMgPSBlbnRyeTsKKyAgICB9CisgICAgZW52LT50aHVtYiA9IHBjICYgMTsKKyAgICBlbnYtPnJlZ3NbMTVdID0gcGMgJiB+MTsKKworICAgIC8qIEhhY2sgdG8gbWFwIGFuIGFkZGl0aW9uYWwgcGFnZSBvZiByYW0gYXQgdGhlIHRvcCBvZiB0aGUgYWRkcmVzcworICAgICAgIHNwYWNlLiAgVGhpcyBzdG9wcyBxZW11IGNvbXBsYWluaW5nIGFib3V0IGV4ZWN1dGluZyBjb2RlIG91dHNpZGUgUkFNCisgICAgICAgd2hlbiByZXR1cm5pbmcgZnJvbSBhbiBleGNlcHRpb24uICAqLworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHhmZmZmZjAwMCwgMHgxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9yYW1fYWxsb2MoTlVMTCwgImFybXY3bS5oYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCkgfCBJT19NRU1fUkFNKTsKKyAgICByZXR1cm4gcGljOworfQorCitzdGF0aWMgdm9pZCBhcm12N21fcmVnaXN0ZXJfZGV2aWNlcyh2b2lkKQoreworICAgIHN5c2J1c19yZWdpc3Rlcl9kZXYoIkFSTSxiaXRiYW5kLW1lbW9yeSIsIHNpemVvZihCaXRCYW5kU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgYml0YmFuZF9pbml0KTsKK30KKworZGV2aWNlX2luaXQoYXJtdjdtX3JlZ2lzdGVyX2RldmljZXMpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2FybS9hcm12N21fbnZpYy5jIGIvYW5kcm9pZC9xZW11MS9ody9hcm0vYXJtdjdtX252aWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EzNTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9hcm0vYXJtdjdtX252aWMuYwpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIEFSTSBOZXN0ZWQgVmVjdG9yZWQgSW50ZXJydXB0IENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTC4KKyAqCisgKiBUaGUgQVJNdjdNIFN5c3RlbSBjb250cm9sbGVyIGlzIGZhaXJseSB0aWdodGx5IHRpZWQgaW4gd2l0aCB0aGUKKyAqIE5WSUMuICBNdWNoIG9mIHRoYXQgaXMgYWxzbyBpbXBsZW1lbnRlZCBoZXJlLgorICovCisKKyNpbmNsdWRlICJody9zeXNidXMuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAiaHcvYXJtL2FybS5oIgorCisvKiAzMiBpbnRlcm5hbCBsaW5lcyAoMTYgdXNlZCBmb3Igc3lzdGVtIGV4Y2VwdGlvbnMpIHBsdXMgNjQgZXh0ZXJuYWwKKyAgIGludGVycnVwdCBsaW5lcy4gICovCisjZGVmaW5lIEdJQ19OSVJRIDk2CisjZGVmaW5lIE5DUFUgMQorI2RlZmluZSBOVklDIDEKKworLyogT25seSBhIHNpbmdsZSAiQ1BVIiBpbnRlcmZhY2UgaXMgcHJlc2VudC4gICovCitzdGF0aWMgaW5saW5lIGludAorZ2ljX2dldF9jdXJyZW50X2NwdSh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgbnZpY19yZWFkbCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IG9mZnNldCk7CitzdGF0aWMgdm9pZCBudmljX3dyaXRlbCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgdmFsdWUpOworCisjaW5jbHVkZSAiYXJtX2dpYy5jIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZ2ljX3N0YXRlIGdpYzsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBjb250cm9sOworICAgICAgICB1aW50MzJfdCByZWxvYWQ7CisgICAgICAgIGludDY0X3QgdGljazsKKyAgICAgICAgUUVNVVRpbWVyICp0aW1lcjsKKyAgICB9IHN5c3RpY2s7Cit9IG52aWNfc3RhdGU7CisKKy8qIHFlbXUgdGltZXJzIHJ1biBhdCAxR0h6LiAgIFdlIHdhbnQgc29tZXRoaW5nIGNsb3NlciB0byAxTUh6LiAgKi8KKyNkZWZpbmUgU1lTVElDS19TQ0FMRSAxMDAwVUxMCisKKyNkZWZpbmUgU1lTVElDS19FTkFCTEUgICAgKDEgPDwgMCkKKyNkZWZpbmUgU1lTVElDS19USUNLSU5UICAgKDEgPDwgMSkKKyNkZWZpbmUgU1lTVElDS19DTEtTT1VSQ0UgKDEgPDwgMikKKyNkZWZpbmUgU1lTVElDS19DT1VOVEZMQUcgKDEgPDwgMTYpCisKK2ludCBzeXN0ZW1fY2xvY2tfc2NhbGU7CisKKy8qIENvbnZlcnNpb24gZmFjdG9yIGZyb20gcWVtdSB0aW1lciB0byBTeXNUaWNrIGZyZXF1ZW5jaWVzLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBzeXN0aWNrX3NjYWxlKG52aWNfc3RhdGUgKnMpCit7CisgICAgaWYgKHMtPnN5c3RpY2suY29udHJvbCAmIFNZU1RJQ0tfQ0xLU09VUkNFKQorICAgICAgICByZXR1cm4gc3lzdGVtX2Nsb2NrX3NjYWxlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDEwMDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3RpY2tfcmVsb2FkKG52aWNfc3RhdGUgKnMsIGludCByZXNldCkKK3sKKyAgICBpZiAocmVzZXQpCisgICAgICAgIHMtPnN5c3RpY2sudGljayA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgcy0+c3lzdGljay50aWNrICs9IChzLT5zeXN0aWNrLnJlbG9hZCArIDEpICogc3lzdGlja19zY2FsZShzKTsKKyAgICB0aW1lcl9tb2Qocy0+c3lzdGljay50aW1lciwgcy0+c3lzdGljay50aWNrKTsKK30KKworc3RhdGljIHZvaWQgc3lzdGlja190aW1lcl90aWNrKHZvaWQgKiBvcGFxdWUpCit7CisgICAgbnZpY19zdGF0ZSAqcyA9IChudmljX3N0YXRlICopb3BhcXVlOworICAgIHMtPnN5c3RpY2suY29udHJvbCB8PSBTWVNUSUNLX0NPVU5URkxBRzsKKyAgICBpZiAocy0+c3lzdGljay5jb250cm9sICYgU1lTVElDS19USUNLSU5UKSB7CisgICAgICAgIC8qIFRyaWdnZXIgdGhlIGludGVycnVwdC4gICovCisgICAgICAgIGFybXY3bV9udmljX3NldF9wZW5kaW5nKHMsIEFSTVY3TV9FWENQX1NZU1RJQ0spOworICAgIH0KKyAgICBpZiAocy0+c3lzdGljay5yZWxvYWQgPT0gMCkgeworICAgICAgICBzLT5zeXN0aWNrLmNvbnRyb2wgJj0gflNZU1RJQ0tfRU5BQkxFOworICAgIH0gZWxzZSB7CisgICAgICAgIHN5c3RpY2tfcmVsb2FkKHMsIDApOworICAgIH0KK30KKworLyogVGhlIGV4dGVybmFsIHJvdXRpbmVzIHVzZSB0aGUgaGFyZHdhcmUgdmVjdG9yIG51bWJlcmluZywgaWUuIHRoZSBmaXJzdAorICAgSVJRIGlzICMxNi4gIFRoZSBpbnRlcm5hbCBHSUMgcm91dGluZXMgdXNlICMzMiBhcyB0aGUgZmlyc3QgSVJRLiAgKi8KK3ZvaWQgYXJtdjdtX252aWNfc2V0X3BlbmRpbmcodm9pZCAqb3BhcXVlLCBpbnQgaXJxKQoreworICAgIG52aWNfc3RhdGUgKnMgPSAobnZpY19zdGF0ZSAqKW9wYXF1ZTsKKyAgICBpZiAoaXJxID49IDE2KQorICAgICAgICBpcnEgKz0gMTY7CisgICAgZ2ljX3NldF9wZW5kaW5nX3ByaXZhdGUoJnMtPmdpYywgMCwgaXJxKTsKK30KKworLyogTWFrZSBwZW5kaW5nIElSUSBhY3RpdmUuICAqLworaW50IGFybXY3bV9udmljX2Fja25vd2xlZGdlX2lycSh2b2lkICpvcGFxdWUpCit7CisgICAgbnZpY19zdGF0ZSAqcyA9IChudmljX3N0YXRlICopb3BhcXVlOworICAgIHVpbnQzMl90IGlycTsKKworICAgIGlycSA9IGdpY19hY2tub3dsZWRnZV9pcnEoJnMtPmdpYywgMCk7CisgICAgaWYgKGlycSA9PSAxMDIzKQorICAgICAgICBod19lcnJvcigiSW50ZXJydXB0IGJ1dCBubyB2ZWN0b3JcbiIpOworICAgIGlmIChpcnEgPj0gMzIpCisgICAgICAgIGlycSAtPSAxNjsKKyAgICByZXR1cm4gaXJxOworfQorCit2b2lkIGFybXY3bV9udmljX2NvbXBsZXRlX2lycSh2b2lkICpvcGFxdWUsIGludCBpcnEpCit7CisgICAgbnZpY19zdGF0ZSAqcyA9IChudmljX3N0YXRlICopb3BhcXVlOworICAgIGlmIChpcnEgPj0gMTYpCisgICAgICAgIGlycSArPSAxNjsKKyAgICBnaWNfY29tcGxldGVfaXJxKCZzLT5naWMsIDAsIGlycSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBudmljX3JlYWRsKHZvaWQgKm9wYXF1ZSwgdWludDMyX3Qgb2Zmc2V0KQoreworICAgIG52aWNfc3RhdGUgKnMgPSAobnZpY19zdGF0ZSAqKW9wYXF1ZTsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgaW50IGlycTsKKworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSA0OiAvKiBJbnRlcnJ1cHQgQ29udHJvbCBUeXBlLiAgKi8KKyAgICAgICAgcmV0dXJuIChHSUNfTklSUSAvIDMyKSAtIDE7CisgICAgY2FzZSAweDEwOiAvKiBTeXNUaWNrIENvbnRyb2wgYW5kIFN0YXR1cy4gICovCisgICAgICAgIHZhbCA9IHMtPnN5c3RpY2suY29udHJvbDsKKyAgICAgICAgcy0+c3lzdGljay5jb250cm9sICY9IH5TWVNUSUNLX0NPVU5URkxBRzsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICBjYXNlIDB4MTQ6IC8qIFN5c1RpY2sgUmVsb2FkIFZhbHVlLiAgKi8KKyAgICAgICAgcmV0dXJuIHMtPnN5c3RpY2sucmVsb2FkOworICAgIGNhc2UgMHgxODogLyogU3lzVGljayBDdXJyZW50IFZhbHVlLiAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50NjRfdCB0OworICAgICAgICAgICAgaWYgKChzLT5zeXN0aWNrLmNvbnRyb2wgJiBTWVNUSUNLX0VOQUJMRSkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHQgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgICAgICAgICAgaWYgKHQgPj0gcy0+c3lzdGljay50aWNrKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgdmFsID0gKChzLT5zeXN0aWNrLnRpY2sgLSAodCArIDEpKSAvIHN5c3RpY2tfc2NhbGUocykpICsgMTsKKyAgICAgICAgICAgIC8qIFRoZSBpbnRlcnJ1cHQgaW4gdHJpZ2dlcmVkIHdoZW4gdGhlIHRpbWVyIHJlYWNoZXMgemVyby4KKyAgICAgICAgICAgICAgIEhvd2V2ZXIgdGhlIGNvdW50ZXIgaXMgbm90IHJlbG9hZGVkIHVudGlsIHRoZSBuZXh0IGNsb2NrCisgICAgICAgICAgICAgICB0aWNrLiAgVGhpcyBpcyBhIGhhY2sgdG8gcmV0dXJuIHplcm8gZHVyaW5nIHRoZSBmaXJzdCB0aWNrLiAgKi8KKyAgICAgICAgICAgIGlmICh2YWwgPiBzLT5zeXN0aWNrLnJlbG9hZCkKKyAgICAgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgIGNhc2UgMHgxYzogLyogU3lzVGljayBDYWxpYnJhdGlvbiBWYWx1ZS4gICovCisgICAgICAgIHJldHVybiAxMDAwMDsKKyAgICBjYXNlIDB4ZDAwOiAvKiBDUFVJRCBCYXNlLiAgKi8KKyAgICAgICAgcmV0dXJuIGNwdV9zaW5nbGVfZW52LT5jcDE1LmMwX2NwdWlkOworICAgIGNhc2UgMHhkMDQ6IC8qIEludGVycnlwdCBDb250cm9sIFN0YXRlLiAgKi8KKyAgICAgICAgLyogVkVDVEFDVElWRSAqLworICAgICAgICB2YWwgPSBzLT5naWMucnVubmluZ19pcnFbMF07CisgICAgICAgIGlmICh2YWwgPT0gMTAyMykgeworICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgPj0gMzIpIHsKKyAgICAgICAgICAgIHZhbCAtPSAxNjsKKyAgICAgICAgfQorICAgICAgICAvKiBSRVRUT0JBU0UgKi8KKyAgICAgICAgaWYgKHMtPmdpYy5ydW5uaW5nX2lycVswXSA9PSAxMDIzCisgICAgICAgICAgICAgICAgfHwgcy0+Z2ljLmxhc3RfYWN0aXZlW3MtPmdpYy5ydW5uaW5nX2lycVswXV1bMF0gPT0gMTAyMykgeworICAgICAgICAgICAgdmFsIHw9ICgxIDw8IDExKTsKKyAgICAgICAgfQorICAgICAgICAvKiBWRUNUUEVORElORyAqLworICAgICAgICBpZiAocy0+Z2ljLmN1cnJlbnRfcGVuZGluZ1swXSAhPSAxMDIzKQorICAgICAgICAgICAgdmFsIHw9IChzLT5naWMuY3VycmVudF9wZW5kaW5nWzBdIDw8IDEyKTsKKyAgICAgICAgLyogSVNSUEVORElORyAqLworICAgICAgICBmb3IgKGlycSA9IDMyOyBpcnEgPCBHSUNfTklSUTsgaXJxKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW2lycV0ucGVuZGluZykgeworICAgICAgICAgICAgICAgIHZhbCB8PSAoMSA8PCAyMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogUEVORFNUU0VUICovCisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX1NZU1RJQ0tdLnBlbmRpbmcpCisgICAgICAgICAgICB2YWwgfD0gKDEgPDwgMjYpOworICAgICAgICAvKiBQRU5EU1ZTRVQgKi8KKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfUEVORFNWXS5wZW5kaW5nKQorICAgICAgICAgICAgdmFsIHw9ICgxIDw8IDI4KTsKKyAgICAgICAgLyogTk1JUEVORFNFVCAqLworICAgICAgICBpZiAocy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9OTUldLnBlbmRpbmcpCisgICAgICAgICAgICB2YWwgfD0gKDEgPDwgMzEpOworICAgICAgICByZXR1cm4gdmFsOworICAgIGNhc2UgMHhkMDg6IC8qIFZlY3RvciBUYWJsZSBPZmZzZXQuICAqLworICAgICAgICByZXR1cm4gY3B1X3NpbmdsZV9lbnYtPnY3bS52ZWNiYXNlOworICAgIGNhc2UgMHhkMGM6IC8qIEFwcGxpY2F0aW9uIEludGVycnVwdC9SZXNldCBDb250cm9sLiAgKi8KKyAgICAgICAgcmV0dXJuIDB4ZmEwNTAwMDsKKyAgICBjYXNlIDB4ZDEwOiAvKiBTeXN0ZW0gQ29udHJvbC4gICovCisgICAgICAgIC8qIFRPRE86IEltcGxlbWVudCBTTEVFUE9ORVhJVC4gICovCisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgMHhkMTQ6IC8qIENvbmZpZ3VyYXRpb24gQ29udHJvbC4gICovCisgICAgICAgIC8qIFRPRE86IEltcGxlbWVudCBDb25maWd1cmF0aW9uIENvbnRyb2wgYml0cy4gICovCisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgMHhkMTg6IGNhc2UgMHhkMWM6IGNhc2UgMHhkMjA6IC8qIFN5c3RlbSBIYW5kbGVyIFByaW9yaXR5LiAgKi8KKyAgICAgICAgaXJxID0gb2Zmc2V0IC0gMHhkMTQ7CisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIHZhbCA9IHMtPmdpYy5wcmlvcml0eTFbaXJxKytdWzBdOworICAgICAgICB2YWwgPSBzLT5naWMucHJpb3JpdHkxW2lycSsrXVswXSA8PCA4OworICAgICAgICB2YWwgPSBzLT5naWMucHJpb3JpdHkxW2lycSsrXVswXSA8PCAxNjsKKyAgICAgICAgdmFsID0gcy0+Z2ljLnByaW9yaXR5MVtpcnFdWzBdIDw8IDI0OworICAgICAgICByZXR1cm4gdmFsOworICAgIGNhc2UgMHhkMjQ6IC8qIFN5c3RlbSBIYW5kbGVyIFN0YXR1cy4gICovCisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX01FTV0uYWN0aXZlKSB2YWwgfD0gKDEgPDwgMCk7CisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX0JVU10uYWN0aXZlKSB2YWwgfD0gKDEgPDwgMSk7CisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX1VTQUdFXS5hY3RpdmUpIHZhbCB8PSAoMSA8PCAzKTsKKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfU1ZDXS5hY3RpdmUpIHZhbCB8PSAoMSA8PCA3KTsKKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfREVCVUddLmFjdGl2ZSkgdmFsIHw9ICgxIDw8IDgpOworICAgICAgICBpZiAocy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9QRU5EU1ZdLmFjdGl2ZSkgdmFsIHw9ICgxIDw8IDEwKTsKKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfU1lTVElDS10uYWN0aXZlKSB2YWwgfD0gKDEgPDwgMTEpOworICAgICAgICBpZiAocy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9VU0FHRV0ucGVuZGluZykgdmFsIHw9ICgxIDw8IDEyKTsKKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfTUVNXS5wZW5kaW5nKSB2YWwgfD0gKDEgPDwgMTMpOworICAgICAgICBpZiAocy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9CVVNdLnBlbmRpbmcpIHZhbCB8PSAoMSA8PCAxNCk7CisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX1NWQ10ucGVuZGluZykgdmFsIHw9ICgxIDw8IDE1KTsKKyAgICAgICAgaWYgKHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfTUVNXS5lbmFibGVkKSB2YWwgfD0gKDEgPDwgMTYpOworICAgICAgICBpZiAocy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9CVVNdLmVuYWJsZWQpIHZhbCB8PSAoMSA8PCAxNyk7CisgICAgICAgIGlmIChzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX1VTQUdFXS5lbmFibGVkKSB2YWwgfD0gKDEgPDwgMTgpOworICAgICAgICByZXR1cm4gdmFsOworICAgIGNhc2UgMHhkMjg6IC8qIENvbmZpZ3VyYWJsZSBGYXVsdCBTdGF0dXMuICAqLworICAgICAgICAvKiBUT0RPOiBJbXBsZW1lbnQgRmF1bHQgU3RhdHVzLiAgKi8KKyAgICAgICAgaHdfZXJyb3IoIk5vdCBpbXBsZW1lbnRlZDogQ29uZmlndXJhYmxlIEZhdWx0IFN0YXR1cy4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAweGQyYzogLyogSGFyZCBGYXVsdCBTdGF0dXMuICAqLworICAgIGNhc2UgMHhkMzA6IC8qIERlYnVnIEZhdWx0IFN0YXR1cy4gICovCisgICAgY2FzZSAweGQzNDogLyogTWVtIE1hbmFnZSBBZGRyZXNzLiAgKi8KKyAgICBjYXNlIDB4ZDM4OiAvKiBCdXMgRmF1bHQgQWRkcmVzcy4gICovCisgICAgY2FzZSAweGQzYzogLyogQXV4IEZhdWx0IFN0YXR1cy4gICovCisgICAgICAgIC8qIFRPRE86IEltcGxlbWVudCBmYXVsdCBzdGF0dXMgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIGNhc2UgMHhkNDA6IC8qIFBGUjAuICAqLworICAgICAgICByZXR1cm4gMHgwMDAwMDAzMDsKKyAgICBjYXNlIDB4ZDQ0OiAvKiBQUkYxLiAgKi8KKyAgICAgICAgcmV0dXJuIDB4MDAwMDAyMDA7CisgICAgY2FzZSAweGQ0ODogLyogREZSMC4gICovCisgICAgICAgIHJldHVybiAweDAwMTAwMDAwOworICAgIGNhc2UgMHhkNGM6IC8qIEFGUjAuICAqLworICAgICAgICByZXR1cm4gMHgwMDAwMDAwMDsKKyAgICBjYXNlIDB4ZDUwOiAvKiBNTUZSMC4gICovCisgICAgICAgIHJldHVybiAweDAwMDAwMDMwOworICAgIGNhc2UgMHhkNTQ6IC8qIE1NRlIxLiAgKi8KKyAgICAgICAgcmV0dXJuIDB4MDAwMDAwMDA7CisgICAgY2FzZSAweGQ1ODogLyogTU1GUjIuICAqLworICAgICAgICByZXR1cm4gMHgwMDAwMDAwMDsKKyAgICBjYXNlIDB4ZDVjOiAvKiBNTUZSMy4gICovCisgICAgICAgIHJldHVybiAweDAwMDAwMDAwOworICAgIGNhc2UgMHhkNjA6IC8qIElTQVIwLiAgKi8KKyAgICAgICAgcmV0dXJuIDB4MDExNDExMTA7CisgICAgY2FzZSAweGQ2NDogLyogSVNBUjEuICAqLworICAgICAgICByZXR1cm4gMHgwMjExMTAwMDsKKyAgICBjYXNlIDB4ZDY4OiAvKiBJU0FSMi4gICovCisgICAgICAgIHJldHVybiAweDIxMTEyMjMxOworICAgIGNhc2UgMHhkNmM6IC8qIElTQVIzLiAgKi8KKyAgICAgICAgcmV0dXJuIDB4MDExMTExMTA7CisgICAgY2FzZSAweGQ3MDogLyogSVNBUjQuICAqLworICAgICAgICByZXR1cm4gMHgwMTMxMDEwMjsKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgZGVidWcgcmVnaXN0ZXJzLiAgKi8KKyAgICBkZWZhdWx0OgorICAgIGJhZF9yZWc6CisgICAgICAgIGh3X2Vycm9yKCJOVklDOiBCYWQgcmVhZCBvZmZzZXQgMHgleFxuIiwgb2Zmc2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG52aWNfd3JpdGVsKHZvaWQgKm9wYXF1ZSwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBudmljX3N0YXRlICpzID0gKG52aWNfc3RhdGUgKilvcGFxdWU7CisgICAgdWludDMyX3Qgb2xkdmFsOworICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgY2FzZSAweDEwOiAvKiBTeXNUaWNrIENvbnRyb2wgYW5kIFN0YXR1cy4gICovCisgICAgICAgIG9sZHZhbCA9IHMtPnN5c3RpY2suY29udHJvbDsKKyAgICAgICAgcy0+c3lzdGljay5jb250cm9sICY9IDB4ZmZmZmZmZjg7CisgICAgICAgIHMtPnN5c3RpY2suY29udHJvbCB8PSB2YWx1ZSAmIDc7CisgICAgICAgIGlmICgob2xkdmFsIF4gdmFsdWUpICYgU1lTVElDS19FTkFCTEUpIHsKKyAgICAgICAgICAgIGludDY0X3Qgbm93ID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAmIFNZU1RJQ0tfRU5BQkxFKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnN5c3RpY2sudGljaykgeworICAgICAgICAgICAgICAgICAgICBzLT5zeXN0aWNrLnRpY2sgKz0gbm93OworICAgICAgICAgICAgICAgICAgICB0aW1lcl9tb2Qocy0+c3lzdGljay50aW1lciwgcy0+c3lzdGljay50aWNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzeXN0aWNrX3JlbG9hZChzLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRpbWVyX2RlbChzLT5zeXN0aWNrLnRpbWVyKTsKKyAgICAgICAgICAgICAgICBzLT5zeXN0aWNrLnRpY2sgLT0gbm93OworICAgICAgICAgICAgICAgIGlmIChzLT5zeXN0aWNrLnRpY2sgPCAwKQorICAgICAgICAgICAgICAgICAgcy0+c3lzdGljay50aWNrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgob2xkdmFsIF4gdmFsdWUpICYgU1lTVElDS19DTEtTT1VSQ0UpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYSBoYWNrLiBGb3JjZSB0aGUgdGltZXIgdG8gYmUgcmVsb2FkZWQKKyAgICAgICAgICAgICAgIHdoZW4gdGhlIHJlZmVyZW5jZSBjbG9jayBpcyBjaGFuZ2VkLiAgKi8KKyAgICAgICAgICAgIHN5c3RpY2tfcmVsb2FkKHMsIDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNDogLyogU3lzVGljayBSZWxvYWQgVmFsdWUuICAqLworICAgICAgICBzLT5zeXN0aWNrLnJlbG9hZCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTg6IC8qIFN5c1RpY2sgQ3VycmVudCBWYWx1ZS4gIFdyaXRlcyByZWxvYWQgdGhlIHRpbWVyLiAgKi8KKyAgICAgICAgc3lzdGlja19yZWxvYWQocywgMSk7CisgICAgICAgIHMtPnN5c3RpY2suY29udHJvbCAmPSB+U1lTVElDS19DT1VOVEZMQUc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhkMDQ6IC8qIEludGVycnVwdCBDb250cm9sIFN0YXRlLiAgKi8KKyAgICAgICAgaWYgKHZhbHVlICYgKDEgPDwgMzEpKSB7CisgICAgICAgICAgICBhcm12N21fbnZpY19zZXRfcGVuZGluZyhzLCBBUk1WN01fRVhDUF9OTUkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSAmICgxIDw8IDI4KSkgeworICAgICAgICAgICAgYXJtdjdtX252aWNfc2V0X3BlbmRpbmcocywgQVJNVjdNX0VYQ1BfUEVORFNWKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmICgxIDw8IDI3KSkgeworICAgICAgICAgICAgcy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9QRU5EU1ZdLnBlbmRpbmcgPSAwOworICAgICAgICAgICAgZ2ljX3VwZGF0ZSgmcy0+Z2ljKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgJiAoMSA8PCAyNikpIHsKKyAgICAgICAgICAgIGFybXY3bV9udmljX3NldF9wZW5kaW5nKHMsIEFSTVY3TV9FWENQX1NZU1RJQ0spOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICYgKDEgPDwgMjUpKSB7CisgICAgICAgICAgICBzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX1NZU1RJQ0tdLnBlbmRpbmcgPSAwOworICAgICAgICAgICAgZ2ljX3VwZGF0ZSgmcy0+Z2ljKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZDA4OiAvKiBWZWN0b3IgVGFibGUgT2Zmc2V0LiAgKi8KKyAgICAgICAgY3B1X3NpbmdsZV9lbnYtPnY3bS52ZWNiYXNlID0gdmFsdWUgJiAweGZmZmZmZjgwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZDBjOiAvKiBBcHBsaWNhdGlvbiBJbnRlcnJ1cHQvUmVzZXQgQ29udHJvbC4gICovCisgICAgICAgIGlmICgodmFsdWUgPj4gMTYpID09IDB4MDVmYSkgeworICAgICAgICAgICAgaWYgKHZhbHVlICYgMikgeworICAgICAgICAgICAgICAgIGh3X2Vycm9yKCJWRUNUQ0xSQUNUSVZFIG5vdCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbHVlICYgNSkgeworICAgICAgICAgICAgICAgIGh3X2Vycm9yKCJTeXN0ZW0gcmVzZXQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZDEwOiAvKiBTeXN0ZW0gQ29udHJvbC4gICovCisgICAgY2FzZSAweGQxNDogLyogQ29uZmlndXJhdGlvbiBDb250cm9sLiAgKi8KKyAgICAgICAgLyogVE9ETzogSW1wbGVtZW50IGNvbnRyb2wgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIGNhc2UgMHhkMTg6IGNhc2UgMHhkMWM6IGNhc2UgMHhkMjA6IC8qIFN5c3RlbSBIYW5kbGVyIFByaW9yaXR5LiAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlycTsKKyAgICAgICAgICAgIGlycSA9IG9mZnNldCAtIDB4ZDE0OworICAgICAgICAgICAgcy0+Z2ljLnByaW9yaXR5MVtpcnErK11bMF0gPSB2YWx1ZSAmIDB4ZmY7CisgICAgICAgICAgICBzLT5naWMucHJpb3JpdHkxW2lycSsrXVswXSA9ICh2YWx1ZSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBzLT5naWMucHJpb3JpdHkxW2lycSsrXVswXSA9ICh2YWx1ZSA+PiAxNikgJiAweGZmOworICAgICAgICAgICAgcy0+Z2ljLnByaW9yaXR5MVtpcnFdWzBdID0gKHZhbHVlID4+IDI0KSAmIDB4ZmY7CisgICAgICAgICAgICBnaWNfdXBkYXRlKCZzLT5naWMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhkMjQ6IC8qIFN5c3RlbSBIYW5kbGVyIENvbnRyb2wuICAqLworICAgICAgICAvKiBUT0RPOiBSZWFsIGhhcmR3YXJlIGFsbG93cyB5b3UgdG8gc2V0L2NsZWFyIHRoZSBhY3RpdmUgYml0cworICAgICAgICAgICB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuICBXZSBkb24ndCBpbXBsZW1lbnQgdGhpcy4gICovCisgICAgICAgIHMtPmdpYy5pcnFfc3RhdGVbQVJNVjdNX0VYQ1BfTUVNXS5lbmFibGVkID0gKHZhbHVlICYgKDEgPDwgMTYpKSAhPSAwOworICAgICAgICBzLT5naWMuaXJxX3N0YXRlW0FSTVY3TV9FWENQX0JVU10uZW5hYmxlZCA9ICh2YWx1ZSAmICgxIDw8IDE3KSkgIT0gMDsKKyAgICAgICAgcy0+Z2ljLmlycV9zdGF0ZVtBUk1WN01fRVhDUF9VU0FHRV0uZW5hYmxlZCA9ICh2YWx1ZSAmICgxIDw8IDE4KSkgIT0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQyODogLyogQ29uZmlndXJhYmxlIEZhdWx0IFN0YXR1cy4gICovCisgICAgY2FzZSAweGQyYzogLyogSGFyZCBGYXVsdCBTdGF0dXMuICAqLworICAgIGNhc2UgMHhkMzA6IC8qIERlYnVnIEZhdWx0IFN0YXR1cy4gICovCisgICAgY2FzZSAweGQzNDogLyogTWVtIE1hbmFnZSBBZGRyZXNzLiAgKi8KKyAgICBjYXNlIDB4ZDM4OiAvKiBCdXMgRmF1bHQgQWRkcmVzcy4gICovCisgICAgY2FzZSAweGQzYzogLyogQXV4IEZhdWx0IFN0YXR1cy4gICovCisgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICBkZWZhdWx0OgorICAgIGJhZF9yZWc6CisgICAgICAgIGh3X2Vycm9yKCJOVklDOiBCYWQgd3JpdGUgb2Zmc2V0IDB4JXhcbiIsIG9mZnNldCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBudmljX3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBudmljX3N0YXRlICpzID0gKG52aWNfc3RhdGUgKilvcGFxdWU7CisKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnN5c3RpY2suY29udHJvbCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5zeXN0aWNrLnJlbG9hZCk7CisgICAgcWVtdV9wdXRfYmU2NChmLCBzLT5zeXN0aWNrLnRpY2spOworICAgIHRpbWVyX3B1dChmLCBzLT5zeXN0aWNrLnRpbWVyKTsKK30KKworc3RhdGljIGludCBudmljX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgbnZpY19zdGF0ZSAqcyA9IChudmljX3N0YXRlICopb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBzLT5zeXN0aWNrLmNvbnRyb2wgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHMtPnN5c3RpY2sucmVsb2FkID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5zeXN0aWNrLnRpY2sgPSBxZW11X2dldF9iZTY0KGYpOworICAgIHRpbWVyX2dldChmLCBzLT5zeXN0aWNrLnRpbWVyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcm12N21fbnZpY19pbml0KFN5c0J1c0RldmljZSAqZGV2KQoreworICAgIG52aWNfc3RhdGUgKnM9IEZST01fU1lTQlVTR0lDKG52aWNfc3RhdGUsIGRldik7CisKKyAgICBnaWNfaW5pdCgmcy0+Z2ljKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4ZTAwMGUwMDAsIDB4MTAwMCwgcy0+Z2ljLmlvbWVtdHlwZSk7CisgICAgcy0+c3lzdGljay50aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLCBzeXN0aWNrX3RpbWVyX3RpY2ssIHMpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAiYXJtdjdtX252aWMiLCAtMSwgMSwgbnZpY19zYXZlLCBudmljX2xvYWQsIHMpOworfQorCitzdGF0aWMgdm9pZCBhcm12N21fbnZpY19yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCit7CisgICAgc3lzYnVzX3JlZ2lzdGVyX2RldigiYXJtdjdtX252aWMiLCBzaXplb2YobnZpY19zdGF0ZSksIGFybXY3bV9udmljX2luaXQpOworfQorCitkZXZpY2VfaW5pdChhcm12N21fbnZpY19yZWdpc3Rlcl9kZXZpY2VzKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9hcm0vYm9vdC5jIGIvYW5kcm9pZC9xZW11MS9ody9hcm0vYm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTAxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FybS9ib290LmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBBUk0ga2VybmVsIGxvYWRlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9hcm0vYXJtLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisjZGVmaW5lIEtFUk5FTF9BUkdTX0FERFIgMHgxMDAKKyNkZWZpbmUgS0VSTkVMX0xPQURfQUREUiAweDAwMDEwMDAwCisjZGVmaW5lIElOSVRSRF9MT0FEX0FERFIgMHgwMDgwMDAwMAorCisvKiBUaGUgd29ybGRzIHNlY29uZCBzbWFsbGVzdCBib290bG9hZGVyLiAgU2V0IHIwLXIyLCB0aGVuIGp1bXAgdG8ga2VybmVsLiAgKi8KK3N0YXRpYyB1aW50MzJfdCBib290bG9hZGVyW10gPSB7CisgIDB4ZTNhMDAwMDAsIC8qIG1vdiAgICAgcjAsICMwICovCisgIDB4ZTNhMDEwMDAsIC8qIG1vdiAgICAgcjEsICMweD8/ICovCisgIDB4ZTM4MTFjMDAsIC8qIG9yciAgICAgcjEsIHIxLCAjMHg/PzAwICovCisgIDB4ZTU5ZjIwMDAsIC8qIGxkciAgICAgcjIsIFtwYywgIzBdICovCisgIDB4ZTU5ZmYwMDAsIC8qIGxkciAgICAgcGMsIFtwYywgIzBdICovCisgIDAsIC8qIEFkZHJlc3Mgb2Yga2VybmVsIGFyZ3MuICBTZXQgYnkgaW50ZWdyYXRvcmNwX2luaXQuICAqLworICAwICAvKiBLZXJuZWwgZW50cnkgcG9pbnQuICBTZXQgYnkgaW50ZWdyYXRvcmNwX2luaXQuICAqLworfTsKKworLyogRW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLiAgRW5hYmxlIGludGVycnVwdCBjb250cm9sbGVyIGFuZAorICAgSXNzdWUgV0ZJIHVudGlsIHN0YXJ0IGFkZHJlc3MgaXMgd3JpdHRlbiB0byBzeXN0ZW0gY29udHJvbGxlci4gICovCitzdGF0aWMgdWludDMyX3Qgc21wYm9vdFtdID0geworICAweGUzYTAwMjAxLCAvKiBtb3YgICAgIHIwLCAjMHgxMDAwMDAwMCAqLworICAweGUzODAwNjAxLCAvKiBvcnIgICAgIHIwLCByMCwgIzB4MDAxMDAwMDAwICovCisgIDB4ZTNhMDEwMDEsIC8qIG1vdiAgICAgcjEsICMxICovCisgIDB4ZTU4MDExMDAsIC8qIHN0ciAgICAgcjEsIFtyMCwgIzB4MTAwXSAqLworICAweGUzYTAwMjAxLCAvKiBtb3YgICAgIHIwLCAjMHgxMDAwMDAwMCAqLworICAweGUzODAwMDMwLCAvKiBvcnIgICAgIHIwLCAjMHgzMCAqLworICAweGUzMjBmMDAzLCAvKiB3ZmkgKi8KKyAgMHhlNTkwMTAwMCwgLyogbGRyICAgICByMSwgW3IwXSAqLworICAweGUzMTEwMDAzLCAvKiB0c3QgICAgIHIxLCAjMyAqLworICAweDFhZmZmZmZiLCAvKiBibmUgICAgIDx3Zmk+ICovCisgIDB4ZTEyZmZmMTEgIC8qIGJ4ICAgICAgcjEgKi8KK307CisKK3N0YXRpYyB2b2lkIG1haW5fY3B1X3Jlc2V0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDUFVBUk1TdGF0ZSAqZW52ID0gb3BhcXVlOworCisgICAgY3B1X3Jlc2V0KEVOVl9HRVRfQ1BVKGVudikpOworICAgIGlmIChlbnYtPmJvb3RfaW5mbykKKyAgICAgICAgYXJtX2xvYWRfa2VybmVsKGVudiwgKHN0cnVjdCBhcm1fYm9vdF9pbmZvKillbnYtPmJvb3RfaW5mbyk7CisKKyAgICAvKiBUT0RPOiAgUmVzZXQgc2Vjb25kYXJ5IENQVXMuICAqLworfQorCisjZGVmaW5lIFdSSVRFX1dPUkQocCwgdmFsdWUpIGRvIHsgXAorICAgIHN0bF9waHlzX25vdGRpcnR5KHAsIHZhbHVlKTsgIFwKKyAgICBwICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBzZXRfa2VybmVsX2FyZ3MoY29uc3Qgc3RydWN0IGFybV9ib290X2luZm8gKmluZm8sCisgICAgICAgICAgICAgICAgaW50IGluaXRyZF9zaXplLCBod2FkZHIgYmFzZSkKK3sKKyAgICBod2FkZHIgcDsKKworICAgIHAgPSBiYXNlICsgS0VSTkVMX0FSR1NfQUREUjsKKyAgICAvKiBBVEFHX0NPUkUgKi8KKyAgICBXUklURV9XT1JEKHAsIDUpOworICAgIFdSSVRFX1dPUkQocCwgMHg1NDQxMDAwMSk7CisgICAgV1JJVEVfV09SRChwLCAxKTsKKyAgICBXUklURV9XT1JEKHAsIDB4MTAwMCk7CisgICAgV1JJVEVfV09SRChwLCAwKTsKKyAgICAvKiBBVEFHX01FTSAqLworICAgIC8qIFRPRE86IGhhbmRsZSBtdWx0aXBsZSBjaGlwcyBvbiBvbmUgQVRBRyBsaXN0ICovCisgICAgV1JJVEVfV09SRChwLCA0KTsKKyAgICBXUklURV9XT1JEKHAsIDB4NTQ0MTAwMDIpOworICAgIFdSSVRFX1dPUkQocCwgaW5mby0+cmFtX3NpemUpOworICAgIFdSSVRFX1dPUkQocCwgaW5mby0+bG9hZGVyX3N0YXJ0KTsKKyAgICBpZiAoaW5pdHJkX3NpemUpIHsKKyAgICAgICAgLyogQVRBR19JTklUUkQyICovCisgICAgICAgIFdSSVRFX1dPUkQocCwgNCk7CisgICAgICAgIFdSSVRFX1dPUkQocCwgMHg1NDQyMDAwNSk7CisgICAgICAgIFdSSVRFX1dPUkQocCwgaW5mby0+bG9hZGVyX3N0YXJ0ICsgSU5JVFJEX0xPQURfQUREUik7CisgICAgICAgIFdSSVRFX1dPUkQocCwgaW5pdHJkX3NpemUpOworICAgIH0KKyAgICBpZiAoaW5mby0+a2VybmVsX2NtZGxpbmUgJiYgKmluZm8tPmtlcm5lbF9jbWRsaW5lKSB7CisgICAgICAgIC8qIEFUQUdfQ01ETElORSAqLworICAgICAgICBpbnQgY21kbGluZV9zaXplOworCisgICAgICAgIGNtZGxpbmVfc2l6ZSA9IHN0cmxlbihpbmZvLT5rZXJuZWxfY21kbGluZSk7CisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGUocCArIDgsICh2b2lkICopaW5mby0+a2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kbGluZV9zaXplICsgMSk7CisgICAgICAgIGNtZGxpbmVfc2l6ZSA9IChjbWRsaW5lX3NpemUgPj4gMikgKyAxOworICAgICAgICBXUklURV9XT1JEKHAsIGNtZGxpbmVfc2l6ZSArIDIpOworICAgICAgICBXUklURV9XT1JEKHAsIDB4NTQ0MTAwMDkpOworICAgICAgICBwICs9IGNtZGxpbmVfc2l6ZSAqIDQ7CisgICAgfQorICAgIGlmIChpbmZvLT5hdGFnX2JvYXJkKSB7CisgICAgICAgIC8qIEFUQUdfQk9BUkQgKi8KKyAgICAgICAgaW50IGF0YWdfYm9hcmRfbGVuOworICAgICAgICB1aW50OF90IGF0YWdfYm9hcmRfYnVmWzB4MTAwMF07CisKKyAgICAgICAgYXRhZ19ib2FyZF9sZW4gPSAoaW5mby0+YXRhZ19ib2FyZChpbmZvLCBhdGFnX2JvYXJkX2J1ZikgKyAzKSAmIH4zOworICAgICAgICBXUklURV9XT1JEKHAsIChhdGFnX2JvYXJkX2xlbiArIDgpID4+IDIpOworICAgICAgICBXUklURV9XT1JEKHAsIDB4NDE0ZjRkNTApOworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKHAsIGF0YWdfYm9hcmRfYnVmLCBhdGFnX2JvYXJkX2xlbik7CisgICAgICAgIHAgKz0gYXRhZ19ib2FyZF9sZW47CisgICAgfQorICAgIC8qIEFUQUdfRU5EICovCisgICAgV1JJVEVfV09SRChwLCAwKTsKKyAgICBXUklURV9XT1JEKHAsIDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfa2VybmVsX2FyZ3Nfb2xkKGNvbnN0IHN0cnVjdCBhcm1fYm9vdF9pbmZvICppbmZvLAorICAgICAgICAgICAgICAgIGludCBpbml0cmRfc2l6ZSwgaHdhZGRyIGJhc2UpCit7CisgICAgaHdhZGRyIHA7CisgICAgY29uc3QgY2hhciAqczsKKworCisgICAgLyogc2VlIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9zZXR1cC5oICovCisgICAgcCA9IGJhc2UgKyBLRVJORUxfQVJHU19BRERSOworICAgIC8qIHBhZ2Vfc2l6ZSAqLworICAgIFdSSVRFX1dPUkQocCwgNDA5Nik7CisgICAgLyogbnJfcGFnZXMgKi8KKyAgICBXUklURV9XT1JEKHAsIGluZm8tPnJhbV9zaXplIC8gNDA5Nik7CisgICAgLyogcmFtZGlza19zaXplICovCisgICAgV1JJVEVfV09SRChwLCAwKTsKKyNkZWZpbmUgRkxBR19SRUFET05MWQkxCisjZGVmaW5lIEZMQUdfUkRMT0FECTQKKyNkZWZpbmUgRkxBR19SRFBST01QVAk4CisgICAgLyogZmxhZ3MgKi8KKyAgICBXUklURV9XT1JEKHAsIEZMQUdfUkVBRE9OTFkgfCBGTEFHX1JETE9BRCB8IEZMQUdfUkRQUk9NUFQpOworICAgIC8qIHJvb3RkZXYgKi8KKyAgICBXUklURV9XT1JEKHAsICgzMSA8PCA4KSB8IDApOwkvKiAvZGV2L210ZGJsb2NrMCAqLworICAgIC8qIHZpZGVvX251bV9jb2xzICovCisgICAgV1JJVEVfV09SRChwLCAwKTsKKyAgICAvKiB2aWRlb19udW1fcm93cyAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogdmlkZW9feCAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogdmlkZW9feSAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogbWVtY19jb250cm9sX3JlZyAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogdW5zaWduZWQgY2hhciBzb3VuZGRlZmF1bHQgKi8KKyAgICAvKiB1bnNpZ25lZCBjaGFyIGFkZnNkcml2ZXMgKi8KKyAgICAvKiB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX2ggKi8KKyAgICAvKiB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9jaGFyX3YgKi8KKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIC8qIHBhZ2VzX2luX2JhbmtbNF0gKi8KKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgV1JJVEVfV09SRChwLCAwKTsKKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIC8qIHBhZ2VzX2luX3ZyYW0gKi8KKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIC8qIGluaXRyZF9zdGFydCAqLworICAgIGlmIChpbml0cmRfc2l6ZSkKKyAgICAgICAgV1JJVEVfV09SRChwLCBpbmZvLT5sb2FkZXJfc3RhcnQgKyBJTklUUkRfTE9BRF9BRERSKTsKKyAgICBlbHNlCisgICAgICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogaW5pdHJkX3NpemUgKi8KKyAgICBXUklURV9XT1JEKHAsIGluaXRyZF9zaXplKTsKKyAgICAvKiByZF9zdGFydCAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogc3lzdGVtX3JldiAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogc3lzdGVtX3NlcmlhbF9sb3cgKi8KKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIC8qIHN5c3RlbV9zZXJpYWxfaGlnaCAqLworICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgLyogbWVtX2ZjbGtfMjEyODUgKi8KKyAgICBXUklURV9XT1JEKHAsIDApOworICAgIC8qIHplcm8gdW51c2VkIGZpZWxkcyAqLworICAgIHdoaWxlIChwIDwgYmFzZSArIEtFUk5FTF9BUkdTX0FERFIgKyAyNTYgKyAxMDI0KSB7CisgICAgICAgIFdSSVRFX1dPUkQocCwgMCk7CisgICAgfQorICAgIHMgPSBpbmZvLT5rZXJuZWxfY21kbGluZTsKKyAgICBpZiAocykgeworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKHAsICh2b2lkICopcywgc3RybGVuKHMpICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV1JJVEVfV09SRChwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgYXJtX2xvYWRfa2VybmVsKENQVUFSTVN0YXRlICplbnYsIHN0cnVjdCBhcm1fYm9vdF9pbmZvICppbmZvKQoreworICAgIGludCBrZXJuZWxfc2l6ZTsKKyAgICBpbnQgaW5pdHJkX3NpemU7CisgICAgaW50IG47CisgICAgaW50IGlzX2xpbnV4ID0gMDsKKyAgICBpbnQgbmJfY3B1czsKKyAgICB1aW50NjRfdCBlbGZfZW50cnk7CisgICAgaHdhZGRyIGVudHJ5OworCisgICAgLyogTG9hZCB0aGUga2VybmVsLiAgKi8KKyAgICBpZiAoIWluZm8tPmtlcm5lbF9maWxlbmFtZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktlcm5lbCBpbWFnZSBtdXN0IGJlIHNwZWNpZmllZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgbmJfY3B1cyA9IGluZm8tPm5iX2NwdXMgPyBpbmZvLT5uYl9jcHVzIDogMTsKKyAgICBlbnYtPmJvb3RfaW5mbyA9IGluZm87CisKKyAgICAvKiBBc3N1bWUgdGhhdCByYXcgaW1hZ2VzIGFyZSBsaW51eCBrZXJuZWxzLCBhbmQgRUxGIGltYWdlcyBhcmUgbm90LiAgKi8KKyAgICBrZXJuZWxfc2l6ZSA9IGxvYWRfZWxmKGluZm8tPmtlcm5lbF9maWxlbmFtZSwgMCwgJmVsZl9lbnRyeSwgTlVMTCwgTlVMTCk7CisgICAgZW50cnkgPSBlbGZfZW50cnk7CisgICAgaWYgKGtlcm5lbF9zaXplIDwgMCkgeworICAgICAgICBrZXJuZWxfc2l6ZSA9IGxvYWRfdWltYWdlKGluZm8tPmtlcm5lbF9maWxlbmFtZSwgJmVudHJ5LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc19saW51eCk7CisgICAgfQorICAgIGlmIChrZXJuZWxfc2l6ZSA8IDApIHsKKyAgICAgICAgZW50cnkgPSBpbmZvLT5sb2FkZXJfc3RhcnQgKyBLRVJORUxfTE9BRF9BRERSOworICAgICAgICBrZXJuZWxfc2l6ZSA9IGxvYWRfaW1hZ2VfdGFyZ3BoeXMoaW5mby0+a2VybmVsX2ZpbGVuYW1lLCBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9zaXplIC0gS0VSTkVMX0xPQURfQUREUik7CisgICAgICAgIGlzX2xpbnV4ID0gMTsKKyAgICB9CisgICAgaWYgKGtlcm5lbF9zaXplIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGNvdWxkIG5vdCBsb2FkIGtlcm5lbCAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGluZm8tPmtlcm5lbF9maWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmICghaXNfbGludXgpIHsKKyAgICAgICAgLyogSnVtcCB0byB0aGUgZW50cnkgcG9pbnQuICAqLworICAgICAgICBlbnYtPnJlZ3NbMTVdID0gZW50cnkgJiAweGZmZmZmZmZlOworICAgICAgICBlbnYtPnRodW1iID0gZW50cnkgJiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmZvLT5pbml0cmRfZmlsZW5hbWUpIHsKKyAgICAgICAgICAgIGluaXRyZF9zaXplID0gbG9hZF9pbWFnZV90YXJncGh5cyhpbmZvLT5pbml0cmRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bG9hZGVyX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBJTklUUkRfTE9BRF9BRERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9zaXplIC0gSU5JVFJEX0xPQURfQUREUik7CisgICAgICAgICAgICBpZiAoaW5pdHJkX3NpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3QgbG9hZCBpbml0cmQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmluaXRyZF9maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluaXRyZF9zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBib290bG9hZGVyWzFdIHw9IGluZm8tPmJvYXJkX2lkICYgMHhmZjsKKyAgICAgICAgYm9vdGxvYWRlclsyXSB8PSAoaW5mby0+Ym9hcmRfaWQgPj4gOCkgJiAweGZmOworICAgICAgICBib290bG9hZGVyWzVdID0gaW5mby0+bG9hZGVyX3N0YXJ0ICsgS0VSTkVMX0FSR1NfQUREUjsKKyAgICAgICAgYm9vdGxvYWRlcls2XSA9IGVudHJ5OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgc2l6ZW9mKGJvb3Rsb2FkZXIpIC8gNDsgbisrKSB7CisgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShpbmZvLT5sb2FkZXJfc3RhcnQgKyAobiAqIDQpLCBib290bG9hZGVyW25dKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmJfY3B1cyA+IDEpIHsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBzaXplb2Yoc21wYm9vdCkgLyA0OyBuKyspIHsKKyAgICAgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShpbmZvLT5zbXBfbG9hZGVyX3N0YXJ0ICsgKG4gKiA0KSwgc21wYm9vdFtuXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9sZF9wYXJhbSkKKyAgICAgICAgICAgIHNldF9rZXJuZWxfYXJnc19vbGQoaW5mbywgaW5pdHJkX3NpemUsIGluZm8tPmxvYWRlcl9zdGFydCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNldF9rZXJuZWxfYXJncyhpbmZvLCBpbml0cmRfc2l6ZSwgaW5mby0+bG9hZGVyX3N0YXJ0KTsKKyAgICB9CisgICAgLy9pbmZvLT5pc19saW51eCA9IGlzX2xpbnV4OworICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQobWFpbl9jcHVfcmVzZXQsIDAsIGVudik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2FybS9waWMuYyBiL2FuZHJvaWQvcWVtdTEvaHcvYXJtL3BpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTVmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2FybS9waWMuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogR2VuZXJpYyBBUk0gUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IENvZGVTb3VyY2VyeS4KKyAqIFdyaXR0ZW4gYnkgUGF1bCBCcm9vaworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgTEdQTAorICovCisKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2kzODYvcGMuaCIKKyNpbmNsdWRlICJody9hcm0vYXJtLmgiCisKKy8qIFN0dWIgZnVuY3Rpb25zIGZvciBoYXJkd2FyZSB0aGF0IGRvZXNuJ3QgZXhpc3QuICAqLwordm9pZCBwaWNfaW5mbyhNb25pdG9yICptb24pCit7Cit9CisKK3ZvaWQgaXJxX2luZm8oTW9uaXRvciAqbW9uKQoreworfQorCisKKy8qIElucHV0IDAgaXMgSVJRIGFuZCBpbnB1dCAxIGlzIEZJUS4gICovCitzdGF0aWMgdm9pZCBhcm1fcGljX2NwdV9oYW5kbGVyKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKQoreworICAgIENQVU9sZFN0YXRlICplbnYgPSAoQ1BVT2xkU3RhdGUgKilvcGFxdWU7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisgICAgc3dpdGNoIChpcnEpIHsKKyAgICBjYXNlIEFSTV9QSUNfQ1BVX0lSUToKKyAgICAgICAgaWYgKGxldmVsKQorICAgICAgICAgICAgY3B1X2ludGVycnVwdChjcHUsIENQVV9JTlRFUlJVUFRfSEFSRCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwdV9yZXNldF9pbnRlcnJ1cHQoY3B1LCBDUFVfSU5URVJSVVBUX0hBUkQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9QSUNfQ1BVX0ZJUToKKyAgICAgICAgaWYgKGxldmVsKQorICAgICAgICAgICAgY3B1X2ludGVycnVwdChjcHUsIENQVV9JTlRFUlJVUFRfRklRKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3B1X3Jlc2V0X2ludGVycnVwdChjcHUsIENQVV9JTlRFUlJVUFRfRklRKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaHdfZXJyb3IoImFybV9waWNfY3B1X2hhbmRsZXI6IEJhZCBpbnRlcnJwdXQgbGluZSAlZFxuIiwgaXJxKTsKKyAgICB9Cit9CisKK3FlbXVfaXJxICphcm1fcGljX2luaXRfY3B1KENQVU9sZFN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIHFlbXVfYWxsb2NhdGVfaXJxcyhhcm1fcGljX2NwdV9oYW5kbGVyLCBlbnYsIDIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9jb3JlL2RtYS5jIGIvYW5kcm9pZC9xZW11MS9ody9jb3JlL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2Q4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvZG1hLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qCisgKiBRRU1VIERNQSBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBWYXNzaWxpIEthcnBvdiAobWFsYykKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2NwdS1jb21tb24uaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKworLyogI2RlZmluZSBERUJVR19ETUEgKi8KKworI2RlZmluZSBkb2xvZyguLi4pIGZwcmludGYgKHN0ZGVyciwgImRtYTogIiBfX1ZBX0FSR1NfXykKKyNpZmRlZiBERUJVR19ETUEKKyNkZWZpbmUgbGluZm8oLi4uKSBmcHJpbnRmIChzdGRlcnIsICJkbWE6ICIgX19WQV9BUkdTX18pCisjZGVmaW5lIGxkZWJ1ZyguLi4pIGZwcmludGYgKHN0ZGVyciwgImRtYTogIiBfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVmaW5lIGxpbmZvKC4uLikKKyNkZWZpbmUgbGRlYnVnKC4uLikKKyNlbmRpZgorCitzdHJ1Y3QgZG1hX3JlZ3MgeworICAgIGludCBub3dbMl07CisgICAgdWludDE2X3QgYmFzZVsyXTsKKyAgICB1aW50OF90IG1vZGU7CisgICAgdWludDhfdCBwYWdlOworICAgIHVpbnQ4X3QgcGFnZWg7CisgICAgdWludDhfdCBkYWNrOworICAgIHVpbnQ4X3QgZW9wOworICAgIERNQV90cmFuc2Zlcl9oYW5kbGVyIHRyYW5zZmVyX2hhbmRsZXI7CisgICAgdm9pZCAqb3BhcXVlOworfTsKKworI2RlZmluZSBBRERSIDAKKyNkZWZpbmUgQ09VTlQgMQorCitzdGF0aWMgc3RydWN0IGRtYV9jb250IHsKKyAgICB1aW50OF90IHN0YXR1czsKKyAgICB1aW50OF90IGNvbW1hbmQ7CisgICAgdWludDhfdCBtYXNrOworICAgIHVpbnQ4X3QgZmxpcF9mbG9wOworICAgIGludCBkc2hpZnQ7CisgICAgc3RydWN0IGRtYV9yZWdzIHJlZ3NbNF07Cit9IGRtYV9jb250cm9sbGVyc1syXTsKKworZW51bSB7CisgICAgQ01EX01FTU9SWV9UT19NRU1PUlkgPSAweDAxLAorICAgIENNRF9GSVhFRF9BRERSRVNTICAgID0gMHgwMiwKKyAgICBDTURfQkxPQ0tfQ09OVFJPTExFUiA9IDB4MDQsCisgICAgQ01EX0NPTVBSRVNTRURfVElNRSAgPSAweDA4LAorICAgIENNRF9DWUNMSUNfUFJJT1JJVFkgID0gMHgxMCwKKyAgICBDTURfRVhURU5ERURfV1JJVEUgICA9IDB4MjAsCisgICAgQ01EX0xPV19EUkVRICAgICAgICAgPSAweDQwLAorICAgIENNRF9MT1dfREFDSyAgICAgICAgID0gMHg4MCwKKyAgICBDTURfTk9UX1NVUFBPUlRFRCAgICA9IENNRF9NRU1PUllfVE9fTUVNT1JZIHwgQ01EX0ZJWEVEX0FERFJFU1MKKyAgICB8IENNRF9DT01QUkVTU0VEX1RJTUUgfCBDTURfQ1lDTElDX1BSSU9SSVRZIHwgQ01EX0VYVEVOREVEX1dSSVRFCisgICAgfCBDTURfTE9XX0RSRVEgfCBDTURfTE9XX0RBQ0sKKworfTsKKworc3RhdGljIHZvaWQgRE1BX3J1biAodm9pZCk7CisKK3N0YXRpYyBpbnQgY2hhbm5lbHNbOF0gPSB7LTEsIDIsIDMsIDEsIC0xLCAtMSwgLTEsIDB9OworCitzdGF0aWMgdm9pZCB3cml0ZV9wYWdlICh2b2lkICpvcGFxdWUsIHVpbnQzMl90IG5wb3J0LCB1aW50MzJfdCBkYXRhKQoreworICAgIHN0cnVjdCBkbWFfY29udCAqZCA9IG9wYXF1ZTsKKyAgICBpbnQgaWNoYW47CisKKyAgICBpY2hhbiA9IGNoYW5uZWxzW25wb3J0ICYgN107CisgICAgaWYgKC0xID09IGljaGFuKSB7CisgICAgICAgIGRvbG9nICgiaW52YWxpZCBjaGFubmVsICUjeCAlI3hcbiIsIG5wb3J0LCBkYXRhKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkLT5yZWdzW2ljaGFuXS5wYWdlID0gZGF0YTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGFnZWggKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgbnBvcnQsIHVpbnQzMl90IGRhdGEpCit7CisgICAgc3RydWN0IGRtYV9jb250ICpkID0gb3BhcXVlOworICAgIGludCBpY2hhbjsKKworICAgIGljaGFuID0gY2hhbm5lbHNbbnBvcnQgJiA3XTsKKyAgICBpZiAoLTEgPT0gaWNoYW4pIHsKKyAgICAgICAgZG9sb2cgKCJpbnZhbGlkIGNoYW5uZWwgJSN4ICUjeFxuIiwgbnBvcnQsIGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGQtPnJlZ3NbaWNoYW5dLnBhZ2VoID0gZGF0YTsKK30KKworc3RhdGljIHVpbnQzMl90IHJlYWRfcGFnZSAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBucG9ydCkKK3sKKyAgICBzdHJ1Y3QgZG1hX2NvbnQgKmQgPSBvcGFxdWU7CisgICAgaW50IGljaGFuOworCisgICAgaWNoYW4gPSBjaGFubmVsc1tucG9ydCAmIDddOworICAgIGlmICgtMSA9PSBpY2hhbikgeworICAgICAgICBkb2xvZyAoImludmFsaWQgY2hhbm5lbCByZWFkICUjeFxuIiwgbnBvcnQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGQtPnJlZ3NbaWNoYW5dLnBhZ2U7Cit9CisKK3N0YXRpYyB1aW50MzJfdCByZWFkX3BhZ2VoICh2b2lkICpvcGFxdWUsIHVpbnQzMl90IG5wb3J0KQoreworICAgIHN0cnVjdCBkbWFfY29udCAqZCA9IG9wYXF1ZTsKKyAgICBpbnQgaWNoYW47CisKKyAgICBpY2hhbiA9IGNoYW5uZWxzW25wb3J0ICYgN107CisgICAgaWYgKC0xID09IGljaGFuKSB7CisgICAgICAgIGRvbG9nICgiaW52YWxpZCBjaGFubmVsIHJlYWQgJSN4XG4iLCBucG9ydCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gZC0+cmVnc1tpY2hhbl0ucGFnZWg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2NoYW4gKHN0cnVjdCBkbWFfY29udCAqZCwgaW50IGljaGFuKQoreworICAgIHN0cnVjdCBkbWFfcmVncyAqcjsKKworICAgIHIgPSBkLT5yZWdzICsgaWNoYW47CisgICAgci0+bm93W0FERFJdID0gci0+YmFzZVtBRERSXSA8PCBkLT5kc2hpZnQ7CisgICAgci0+bm93W0NPVU5UXSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldGZmIChzdHJ1Y3QgZG1hX2NvbnQgKmQpCit7CisgICAgaW50IGZmOworCisgICAgZmYgPSBkLT5mbGlwX2Zsb3A7CisgICAgZC0+ZmxpcF9mbG9wID0gIWZmOworICAgIHJldHVybiBmZjsKK30KKworc3RhdGljIHVpbnQzMl90IHJlYWRfY2hhbiAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBucG9ydCkKK3sKKyAgICBzdHJ1Y3QgZG1hX2NvbnQgKmQgPSBvcGFxdWU7CisgICAgaW50IGljaGFuLCBucmVnLCBpcG9ydCwgZmYsIHZhbCwgZGlyOworICAgIHN0cnVjdCBkbWFfcmVncyAqcjsKKworICAgIGlwb3J0ID0gKG5wb3J0ID4+IGQtPmRzaGlmdCkgJiAweDBmOworICAgIGljaGFuID0gaXBvcnQgPj4gMTsKKyAgICBucmVnID0gaXBvcnQgJiAxOworICAgIHIgPSBkLT5yZWdzICsgaWNoYW47CisKKyAgICBkaXIgPSAoKHItPm1vZGUgPj4gNSkgJiAxKSA/IC0xIDogMTsKKyAgICBmZiA9IGdldGZmIChkKTsKKyAgICBpZiAobnJlZykKKyAgICAgICAgdmFsID0gKHItPmJhc2VbQ09VTlRdIDw8IGQtPmRzaGlmdCkgLSByLT5ub3dbQ09VTlRdOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gci0+bm93W0FERFJdICsgci0+bm93W0NPVU5UXSAqIGRpcjsKKworICAgIGxkZWJ1ZyAoInJlYWRfY2hhbiAlI3ggLT4gJWRcbiIsIGlwb3J0LCB2YWwpOworICAgIHJldHVybiAodmFsID4+IChkLT5kc2hpZnQgKyAoZmYgPDwgMykpKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2NoYW4gKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgbnBvcnQsIHVpbnQzMl90IGRhdGEpCit7CisgICAgc3RydWN0IGRtYV9jb250ICpkID0gb3BhcXVlOworICAgIGludCBpcG9ydCwgaWNoYW4sIG5yZWc7CisgICAgc3RydWN0IGRtYV9yZWdzICpyOworCisgICAgaXBvcnQgPSAobnBvcnQgPj4gZC0+ZHNoaWZ0KSAmIDB4MGY7CisgICAgaWNoYW4gPSBpcG9ydCA+PiAxOworICAgIG5yZWcgPSBpcG9ydCAmIDE7CisgICAgciA9IGQtPnJlZ3MgKyBpY2hhbjsKKyAgICBpZiAoZ2V0ZmYgKGQpKSB7CisgICAgICAgIHItPmJhc2VbbnJlZ10gPSAoci0+YmFzZVtucmVnXSAmIDB4ZmYpIHwgKChkYXRhIDw8IDgpICYgMHhmZjAwKTsKKyAgICAgICAgaW5pdF9jaGFuIChkLCBpY2hhbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgci0+YmFzZVtucmVnXSA9IChyLT5iYXNlW25yZWddICYgMHhmZjAwKSB8IChkYXRhICYgMHhmZik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZV9jb250ICh2b2lkICpvcGFxdWUsIHVpbnQzMl90IG5wb3J0LCB1aW50MzJfdCBkYXRhKQoreworICAgIHN0cnVjdCBkbWFfY29udCAqZCA9IG9wYXF1ZTsKKyAgICBpbnQgaXBvcnQsIGljaGFuID0gMDsKKworICAgIGlwb3J0ID0gKG5wb3J0ID4+IGQtPmRzaGlmdCkgJiAweDBmOworICAgIHN3aXRjaCAoaXBvcnQpIHsKKyAgICBjYXNlIDB4MDg6ICAgICAgICAgICAgICAgICAgLyogY29tbWFuZCAqLworICAgICAgICBpZiAoKGRhdGEgIT0gMCkgJiYgKGRhdGEgJiBDTURfTk9UX1NVUFBPUlRFRCkpIHsKKyAgICAgICAgICAgIGRvbG9nICgiY29tbWFuZCAlI3ggbm90IHN1cHBvcnRlZFxuIiwgZGF0YSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZC0+Y29tbWFuZCA9IGRhdGE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDA5OgorICAgICAgICBpY2hhbiA9IGRhdGEgJiAzOworICAgICAgICBpZiAoZGF0YSAmIDQpIHsKKyAgICAgICAgICAgIGQtPnN0YXR1cyB8PSAxIDw8IChpY2hhbiArIDQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZC0+c3RhdHVzICY9IH4oMSA8PCAoaWNoYW4gKyA0KSk7CisgICAgICAgIH0KKyAgICAgICAgZC0+c3RhdHVzICY9IH4oMSA8PCBpY2hhbik7CisgICAgICAgIERNQV9ydW4oKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MGE6ICAgICAgICAgICAgICAgICAgLyogc2luZ2xlIG1hc2sgKi8KKyAgICAgICAgaWYgKGRhdGEgJiA0KQorICAgICAgICAgICAgZC0+bWFzayB8PSAxIDw8IChkYXRhICYgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGQtPm1hc2sgJj0gfigxIDw8IChkYXRhICYgMykpOworICAgICAgICBETUFfcnVuKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDBiOiAgICAgICAgICAgICAgICAgIC8qIG1vZGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWNoYW4gPSBkYXRhICYgMzsKKyNpZmRlZiBERUJVR19ETUEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgb3AsIGFpLCBkaXIsIG9wbW9kZTsKKyAgICAgICAgICAgICAgICBvcCA9IChkYXRhID4+IDIpICYgMzsKKyAgICAgICAgICAgICAgICBhaSA9IChkYXRhID4+IDQpICYgMTsKKyAgICAgICAgICAgICAgICBkaXIgPSAoZGF0YSA+PiA1KSAmIDE7CisgICAgICAgICAgICAgICAgb3Btb2RlID0gKGRhdGEgPj4gNikgJiAzOworCisgICAgICAgICAgICAgICAgbGluZm8gKCJpY2hhbiAlZCwgb3AgJWQsIGFpICVkLCBkaXIgJWQsIG9wbW9kZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaWNoYW4sIG9wLCBhaSwgZGlyLCBvcG1vZGUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBkLT5yZWdzW2ljaGFuXS5tb2RlID0gZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBjYXNlIDB4MGM6ICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZmxpcCBmbG9wICovCisgICAgICAgIGQtPmZsaXBfZmxvcCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDBkOiAgICAgICAgICAgICAgICAgIC8qIHJlc2V0ICovCisgICAgICAgIGQtPmZsaXBfZmxvcCA9IDA7CisgICAgICAgIGQtPm1hc2sgPSB+MDsKKyAgICAgICAgZC0+c3RhdHVzID0gMDsKKyAgICAgICAgZC0+Y29tbWFuZCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDBlOiAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIG1hc2sgZm9yIGFsbCBjaGFubmVscyAqLworICAgICAgICBkLT5tYXNrID0gMDsKKyAgICAgICAgRE1BX3J1bigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHgwZjogICAgICAgICAgICAgICAgICAvKiB3cml0ZSBtYXNrIGZvciBhbGwgY2hhbm5lbHMgKi8KKyAgICAgICAgZC0+bWFzayA9IGRhdGE7CisgICAgICAgIERNQV9ydW4oKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBkb2xvZyAoInVua25vd24gaXBvcnQgJSN4XG4iLCBpcG9ydCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmZGVmIERFQlVHX0RNQQorICAgIGlmICgweGMgIT0gaXBvcnQpIHsKKyAgICAgICAgbGluZm8gKCJ3cml0ZV9jb250OiBucG9ydCAlIzA2eCwgaWNoYW4gJSAyZCwgdmFsICUjMDZ4XG4iLAorICAgICAgICAgICAgICAgbnBvcnQsIGljaGFuLCBkYXRhKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHVpbnQzMl90IHJlYWRfY29udCAodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBucG9ydCkKK3sKKyAgICBzdHJ1Y3QgZG1hX2NvbnQgKmQgPSBvcGFxdWU7CisgICAgaW50IGlwb3J0LCB2YWw7CisKKyAgICBpcG9ydCA9IChucG9ydCA+PiBkLT5kc2hpZnQpICYgMHgwZjsKKyAgICBzd2l0Y2ggKGlwb3J0KSB7CisgICAgY2FzZSAweDA4OiAgICAgICAgICAgICAgICAgIC8qIHN0YXR1cyAqLworICAgICAgICB2YWwgPSBkLT5zdGF0dXM7CisgICAgICAgIGQtPnN0YXR1cyAmPSAweGYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGY6ICAgICAgICAgICAgICAgICAgLyogbWFzayAqLworICAgICAgICB2YWwgPSBkLT5tYXNrOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB2YWwgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBsZGVidWcgKCJyZWFkX2NvbnQ6IG5wb3J0ICUjMDZ4LCBpcG9ydCAlIzA0eCB2YWwgJSN4XG4iLCBucG9ydCwgaXBvcnQsIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50IERNQV9nZXRfY2hhbm5lbF9tb2RlIChpbnQgbmNoYW4pCit7CisgICAgcmV0dXJuIGRtYV9jb250cm9sbGVyc1tuY2hhbiA+IDNdLnJlZ3NbbmNoYW4gJiAzXS5tb2RlOworfQorCit2b2lkIERNQV9ob2xkX0RSRVEgKGludCBuY2hhbikKK3sKKyAgICBpbnQgbmNvbnQsIGljaGFuOworCisgICAgbmNvbnQgPSBuY2hhbiA+IDM7CisgICAgaWNoYW4gPSBuY2hhbiAmIDM7CisgICAgbGluZm8gKCJoZWxkIGNvbnQ9JWQgY2hhbj0lZFxuIiwgbmNvbnQsIGljaGFuKTsKKyAgICBkbWFfY29udHJvbGxlcnNbbmNvbnRdLnN0YXR1cyB8PSAxIDw8IChpY2hhbiArIDQpOworICAgIERNQV9ydW4oKTsKK30KKwordm9pZCBETUFfcmVsZWFzZV9EUkVRIChpbnQgbmNoYW4pCit7CisgICAgaW50IG5jb250LCBpY2hhbjsKKworICAgIG5jb250ID0gbmNoYW4gPiAzOworICAgIGljaGFuID0gbmNoYW4gJiAzOworICAgIGxpbmZvICgicmVsZWFzZWQgY29udD0lZCBjaGFuPSVkXG4iLCBuY29udCwgaWNoYW4pOworICAgIGRtYV9jb250cm9sbGVyc1tuY29udF0uc3RhdHVzICY9IH4oMSA8PCAoaWNoYW4gKyA0KSk7CisgICAgRE1BX3J1bigpOworfQorCitzdGF0aWMgdm9pZCBjaGFubmVsX3J1biAoaW50IG5jb250LCBpbnQgaWNoYW4pCit7CisgICAgaW50IG47CisgICAgc3RydWN0IGRtYV9yZWdzICpyID0gJmRtYV9jb250cm9sbGVyc1tuY29udF0ucmVnc1tpY2hhbl07CisjaWZkZWYgREVCVUdfRE1BCisgICAgaW50IGRpciwgb3Btb2RlOworCisgICAgZGlyID0gKHItPm1vZGUgPj4gNSkgJiAxOworICAgIG9wbW9kZSA9IChyLT5tb2RlID4+IDYpICYgMzsKKworICAgIGlmIChkaXIpIHsKKyAgICAgICAgZG9sb2cgKCJETUEgaW4gYWRkcmVzcyBkZWNyZW1lbnQgbW9kZVxuIik7CisgICAgfQorICAgIGlmIChvcG1vZGUgIT0gMSkgeworICAgICAgICBkb2xvZyAoIkRNQSBub3QgaW4gc2luZ2xlIG1vZGUgc2VsZWN0ICUjeFxuIiwgb3Btb2RlKTsKKyAgICB9CisjZW5kaWYKKworICAgIHIgPSBkbWFfY29udHJvbGxlcnNbbmNvbnRdLnJlZ3MgKyBpY2hhbjsKKyAgICBpZiAoci0+dHJhbnNmZXJfaGFuZGxlcikgeworICAgICAgICBuID0gci0+dHJhbnNmZXJfaGFuZGxlciAoci0+b3BhcXVlLCBpY2hhbiArIChuY29udCA8PCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPm5vd1tDT1VOVF0sIChyLT5iYXNlW0NPVU5UXSArIDEpIDw8IG5jb250KTsKKyAgICAgICAgci0+bm93W0NPVU5UXSA9IG47CisgICAgfQorICAgIGxkZWJ1ZyAoImRtYV9wb3MgJWQgc2l6ZSAlZFxuIiwgbiwgKHItPmJhc2VbQ09VTlRdICsgMSkgPDwgbmNvbnQpOworfQorCitzdGF0aWMgUUVNVUJIICpkbWFfYmg7CisKK3N0YXRpYyB2b2lkIERNQV9ydW4gKHZvaWQpCit7CisgICAgc3RydWN0IGRtYV9jb250ICpkOworICAgIGludCBpY29udCwgaWNoYW47CisgICAgaW50IHJlYXJtID0gMDsKKworICAgIGQgPSBkbWFfY29udHJvbGxlcnM7CisKKyAgICBmb3IgKGljb250ID0gMDsgaWNvbnQgPCAyOyBpY29udCsrLCBkKyspIHsKKyAgICAgICAgZm9yIChpY2hhbiA9IDA7IGljaGFuIDwgNDsgaWNoYW4rKykgeworICAgICAgICAgICAgaW50IG1hc2s7CisKKyAgICAgICAgICAgIG1hc2sgPSAxIDw8IGljaGFuOworCisgICAgICAgICAgICBpZiAoKDAgPT0gKGQtPm1hc2sgJiBtYXNrKSkgJiYgKDAgIT0gKGQtPnN0YXR1cyAmIChtYXNrIDw8IDQpKSkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsX3J1biAoaWNvbnQsIGljaGFuKTsKKyAgICAgICAgICAgICAgICByZWFybSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVhcm0pCisgICAgICAgIHFlbXVfYmhfc2NoZWR1bGVfaWRsZShkbWFfYmgpOworfQorCitzdGF0aWMgdm9pZCBETUFfcnVuX2JoKHZvaWQgKnVudXNlZCkKK3sKKyAgICBETUFfcnVuKCk7Cit9CisKK3ZvaWQgRE1BX3JlZ2lzdGVyX2NoYW5uZWwgKGludCBuY2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV90cmFuc2Zlcl9oYW5kbGVyIHRyYW5zZmVyX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgc3RydWN0IGRtYV9yZWdzICpyOworICAgIGludCBpY2hhbiwgbmNvbnQ7CisKKyAgICBuY29udCA9IG5jaGFuID4gMzsKKyAgICBpY2hhbiA9IG5jaGFuICYgMzsKKworICAgIHIgPSBkbWFfY29udHJvbGxlcnNbbmNvbnRdLnJlZ3MgKyBpY2hhbjsKKyAgICByLT50cmFuc2Zlcl9oYW5kbGVyID0gdHJhbnNmZXJfaGFuZGxlcjsKKyAgICByLT5vcGFxdWUgPSBvcGFxdWU7Cit9CisKK2ludCBETUFfcmVhZF9tZW1vcnkgKGludCBuY2hhbiwgdm9pZCAqYnVmLCBpbnQgcG9zLCBpbnQgbGVuKQoreworICAgIHN0cnVjdCBkbWFfcmVncyAqciA9ICZkbWFfY29udHJvbGxlcnNbbmNoYW4gPiAzXS5yZWdzW25jaGFuICYgM107CisgICAgaHdhZGRyIGFkZHIgPSAoKHItPnBhZ2VoICYgMHg3ZikgPDwgMjQpIHwgKHItPnBhZ2UgPDwgMTYpIHwgci0+bm93W0FERFJdOworCisgICAgaWYgKHItPm1vZGUgJiAweDIwKSB7CisgICAgICAgIGludCBpOworICAgICAgICB1aW50OF90ICpwID0gYnVmOworCisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVhZCAoYWRkciAtIHBvcyAtIGxlbiwgYnVmLCBsZW4pOworICAgICAgICAvKiBXaGF0IGFib3V0IDE2Yml0IHRyYW5zZmVycz8gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiA+PiAxOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYiA9IHBbbGVuIC0gaSAtIDFdOworICAgICAgICAgICAgcFtpXSA9IGI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQgKGFkZHIgKyBwb3MsIGJ1ZiwgbGVuKTsKKworICAgIHJldHVybiBsZW47Cit9CisKK2ludCBETUFfd3JpdGVfbWVtb3J5IChpbnQgbmNoYW4sIHZvaWQgKmJ1ZiwgaW50IHBvcywgaW50IGxlbikKK3sKKyAgICBzdHJ1Y3QgZG1hX3JlZ3MgKnIgPSAmZG1hX2NvbnRyb2xsZXJzW25jaGFuID4gM10ucmVnc1tuY2hhbiAmIDNdOworICAgIGh3YWRkciBhZGRyID0gKChyLT5wYWdlaCAmIDB4N2YpIDw8IDI0KSB8IChyLT5wYWdlIDw8IDE2KSB8IHItPm5vd1tBRERSXTsKKworICAgIGlmIChyLT5tb2RlICYgMHgyMCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgdWludDhfdCAqcCA9IGJ1ZjsKKworICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlIChhZGRyIC0gcG9zIC0gbGVuLCBidWYsIGxlbik7CisgICAgICAgIC8qIFdoYXQgYWJvdXQgMTZiaXQgdHJhbnNmZXJzPyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgYiA9IHBbbGVuIC0gaSAtIDFdOworICAgICAgICAgICAgcFtpXSA9IGI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlIChhZGRyICsgcG9zLCBidWYsIGxlbik7CisKKyAgICByZXR1cm4gbGVuOworfQorCisvKiByZXF1ZXN0IHRoZSBlbXVsYXRvciB0byB0cmFuc2ZlciBhIG5ldyBETUEgbWVtb3J5IGJsb2NrIEFTQVAgKi8KK3ZvaWQgRE1BX3NjaGVkdWxlKGludCBuY2hhbikKK3sKKyAgICBDUFVTdGF0ZSAqY3B1ID0gY3VycmVudF9jcHU7CisgICAgaWYgKGNwdSkKKyAgICAgICAgY3B1X2V4aXQoY3B1KTsKK30KKworc3RhdGljIHZvaWQgZG1hX3Jlc2V0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgZG1hX2NvbnQgKmQgPSBvcGFxdWU7CisgICAgd3JpdGVfY29udCAoZCwgKDB4MGQgPDwgZC0+ZHNoaWZ0KSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZG1hX3Bob255X2hhbmRsZXIgKHZvaWQgKm9wYXF1ZSwgaW50IG5jaGFuLCBpbnQgZG1hX3BvcywgaW50IGRtYV9sZW4pCit7CisgICAgZG9sb2cgKCJ1bnJlZ2lzdGVyZWQgRE1BIGNoYW5uZWwgdXNlZCBuY2hhbj0lZCBkbWFfcG9zPSVkIGRtYV9sZW49JWRcbiIsCisgICAgICAgICAgIG5jaGFuLCBkbWFfcG9zLCBkbWFfbGVuKTsKKyAgICByZXR1cm4gZG1hX3BvczsKK30KKworLyogZHNoaWZ0ID0gMDogOCBiaXQgRE1BLCAxID0gMTYgYml0IERNQSAqLworc3RhdGljIHZvaWQgZG1hX2luaXQyKHN0cnVjdCBkbWFfY29udCAqZCwgaW50IGJhc2UsIGludCBkc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfYmFzZSwgaW50IHBhZ2VoX2Jhc2UpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBwYWdlX3BvcnRfbGlzdFtdID0geyAweDEsIDB4MiwgMHgzLCAweDcgfTsKKyAgICBpbnQgaTsKKworICAgIGQtPmRzaGlmdCA9IGRzaGlmdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSAoYmFzZSArIChpIDw8IGRzaGlmdCksIDEsIDEsIHdyaXRlX2NoYW4sIGQpOworICAgICAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZCAoYmFzZSArIChpIDw8IGRzaGlmdCksIDEsIDEsIHJlYWRfY2hhbiwgZCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFIChwYWdlX3BvcnRfbGlzdCk7IGkrKykgeworICAgICAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUgKHBhZ2VfYmFzZSArIHBhZ2VfcG9ydF9saXN0W2ldLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3BhZ2UsIGQpOworICAgICAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZCAocGFnZV9iYXNlICsgcGFnZV9wb3J0X2xpc3RbaV0sIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3BhZ2UsIGQpOworICAgICAgICBpZiAocGFnZWhfYmFzZSA+PSAwKSB7CisgICAgICAgICAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUgKHBhZ2VoX2Jhc2UgKyBwYWdlX3BvcnRfbGlzdFtpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfcGFnZWgsIGQpOworICAgICAgICAgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQgKHBhZ2VoX2Jhc2UgKyBwYWdlX3BvcnRfbGlzdFtpXSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3BhZ2VoLCBkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSAoYmFzZSArICgoaSArIDgpIDw8IGRzaGlmdCksIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfY29udCwgZCk7CisgICAgICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkIChiYXNlICsgKChpICsgOCkgPDwgZHNoaWZ0KSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfY29udCwgZCk7CisgICAgfQorICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQoZG1hX3Jlc2V0LCAwLCBkKTsKKyAgICBkbWFfcmVzZXQoZCk7CisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUgKGQtPnJlZ3MpOyArK2kpIHsKKyAgICAgICAgZC0+cmVnc1tpXS50cmFuc2Zlcl9oYW5kbGVyID0gZG1hX3Bob255X2hhbmRsZXI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkbWFfc2F2ZSAoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgZG1hX2NvbnQgKmQgPSBvcGFxdWU7CisgICAgaW50IGk7CisKKyAgICAvKiBxZW11X3B1dF84cyAoZiwgJmQtPnN0YXR1cyk7ICovCisgICAgcWVtdV9wdXRfOHMgKGYsICZkLT5jb21tYW5kKTsKKyAgICBxZW11X3B1dF84cyAoZiwgJmQtPm1hc2spOworICAgIHFlbXVfcHV0XzhzIChmLCAmZC0+ZmxpcF9mbG9wKTsKKyAgICBxZW11X3B1dF9iZTMyIChmLCBkLT5kc2hpZnQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBzdHJ1Y3QgZG1hX3JlZ3MgKnIgPSAmZC0+cmVnc1tpXTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMiAoZiwgci0+bm93WzBdKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMiAoZiwgci0+bm93WzFdKTsKKyAgICAgICAgcWVtdV9wdXRfYmUxNnMgKGYsICZyLT5iYXNlWzBdKTsKKyAgICAgICAgcWVtdV9wdXRfYmUxNnMgKGYsICZyLT5iYXNlWzFdKTsKKyAgICAgICAgcWVtdV9wdXRfOHMgKGYsICZyLT5tb2RlKTsKKyAgICAgICAgcWVtdV9wdXRfOHMgKGYsICZyLT5wYWdlKTsKKyAgICAgICAgcWVtdV9wdXRfOHMgKGYsICZyLT5wYWdlaCk7CisgICAgICAgIHFlbXVfcHV0XzhzIChmLCAmci0+ZGFjayk7CisgICAgICAgIHFlbXVfcHV0XzhzIChmLCAmci0+ZW9wKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZG1hX2xvYWQgKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIHN0cnVjdCBkbWFfY29udCAqZCA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgLyogcWVtdV9nZXRfOHMgKGYsICZkLT5zdGF0dXMpOyAqLworICAgIHFlbXVfZ2V0XzhzIChmLCAmZC0+Y29tbWFuZCk7CisgICAgcWVtdV9nZXRfOHMgKGYsICZkLT5tYXNrKTsKKyAgICBxZW11X2dldF84cyAoZiwgJmQtPmZsaXBfZmxvcCk7CisgICAgZC0+ZHNoaWZ0PXFlbXVfZ2V0X2JlMzIgKGYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBzdHJ1Y3QgZG1hX3JlZ3MgKnIgPSAmZC0+cmVnc1tpXTsKKyAgICAgICAgci0+bm93WzBdPXFlbXVfZ2V0X2JlMzIgKGYpOworICAgICAgICByLT5ub3dbMV09cWVtdV9nZXRfYmUzMiAoZik7CisgICAgICAgIHFlbXVfZ2V0X2JlMTZzIChmLCAmci0+YmFzZVswXSk7CisgICAgICAgIHFlbXVfZ2V0X2JlMTZzIChmLCAmci0+YmFzZVsxXSk7CisgICAgICAgIHFlbXVfZ2V0XzhzIChmLCAmci0+bW9kZSk7CisgICAgICAgIHFlbXVfZ2V0XzhzIChmLCAmci0+cGFnZSk7CisgICAgICAgIHFlbXVfZ2V0XzhzIChmLCAmci0+cGFnZWgpOworICAgICAgICBxZW11X2dldF84cyAoZiwgJnItPmRhY2spOworICAgICAgICBxZW11X2dldF84cyAoZiwgJnItPmVvcCk7CisgICAgfQorCisgICAgRE1BX3J1bigpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRE1BX2luaXQgKGludCBoaWdoX3BhZ2VfZW5hYmxlKQoreworICAgIGRtYV9pbml0MigmZG1hX2NvbnRyb2xsZXJzWzBdLCAweDAwLCAwLCAweDgwLAorICAgICAgICAgICAgICBoaWdoX3BhZ2VfZW5hYmxlID8gMHg0ODAgOiAtMSk7CisgICAgZG1hX2luaXQyKCZkbWFfY29udHJvbGxlcnNbMV0sIDB4YzAsIDEsIDB4ODgsCisgICAgICAgICAgICAgIGhpZ2hfcGFnZV9lbmFibGUgPyAweDQ4OCA6IC0xKTsKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImRtYSIsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgIGRtYV9zYXZlLAorICAgICAgICAgICAgICAgICAgICBkbWFfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgJmRtYV9jb250cm9sbGVyc1swXSk7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImRtYSIsCisgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgIGRtYV9zYXZlLAorICAgICAgICAgICAgICAgICAgICBkbWFfbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgJmRtYV9jb250cm9sbGVyc1sxXSk7CisKKyAgICBkbWFfYmggPSBxZW11X2JoX25ldyhETUFfcnVuX2JoLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvY29yZS9pcnEuYyBiL2FuZHJvaWQvcWVtdTEvaHcvY29yZS9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNmZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9jb3JlL2lycS5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBRRU1VIElSUS9HUElPIGNvbW1vbiBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDb2RlU291cmNlcnkuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJody9pcnEuaCIKKworc3RydWN0IElSUVN0YXRlIHsKKyAgICBxZW11X2lycV9oYW5kbGVyIGhhbmRsZXI7CisgICAgdm9pZCAqb3BhcXVlOworICAgIGludCBuOworfTsKKwordm9pZCBxZW11X3NldF9pcnEocWVtdV9pcnEgaXJxLCBpbnQgbGV2ZWwpCit7CisgICAgaWYgKCFpcnEpCisgICAgICAgIHJldHVybjsKKworICAgIGlycS0+aGFuZGxlcihpcnEtPm9wYXF1ZSwgaXJxLT5uLCBsZXZlbCk7Cit9CisKK3FlbXVfaXJxICpxZW11X2FsbG9jYXRlX2lycXMocWVtdV9pcnFfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpvcGFxdWUsIGludCBuKQoreworICAgIHFlbXVfaXJxICpzOworICAgIHN0cnVjdCBJUlFTdGF0ZSAqcDsKKyAgICBpbnQgaTsKKworICAgIHMgPSAocWVtdV9pcnEgKilnX21hbGxvYzAoc2l6ZW9mKHFlbXVfaXJxKSAqIG4pOworICAgIHAgPSAoc3RydWN0IElSUVN0YXRlICopZ19tYWxsb2MwKHNpemVvZihzdHJ1Y3QgSVJRU3RhdGUpICogbik7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBwLT5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgcC0+b3BhcXVlID0gb3BhcXVlOworICAgICAgICBwLT5uID0gaTsKKyAgICAgICAgc1tpXSA9IHA7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgcWVtdV9mcmVlX2lycXMocWVtdV9pcnEgKnMpCit7CisgICAgZ19mcmVlKHNbMF0pOworICAgIGdfZnJlZShzKTsKK30KKworc3RhdGljIHZvaWQgcWVtdV9ub3RpcnEodm9pZCAqb3BhcXVlLCBpbnQgbGluZSwgaW50IGxldmVsKQoreworICAgIHN0cnVjdCBJUlFTdGF0ZSAqaXJxID0gb3BhcXVlOworCisgICAgaXJxLT5oYW5kbGVyKGlycS0+b3BhcXVlLCBpcnEtPm4sICFsZXZlbCk7Cit9CisKK3FlbXVfaXJxIHFlbXVfaXJxX2ludmVydChxZW11X2lycSBpcnEpCit7CisgICAgLyogVGhlIGRlZmF1bHQgc3RhdGUgZm9yIElSUXMgaXMgbG93LCBzbyByYWlzZSB0aGUgb3V0cHV0IG5vdy4gICovCisgICAgcWVtdV9pcnFfcmFpc2UoaXJxKTsKKyAgICByZXR1cm4gcWVtdV9hbGxvY2F0ZV9pcnFzKHFlbXVfbm90aXJxLCBpcnEsIDEpWzBdOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9jb3JlL2xvYWRlci5jIGIvYW5kcm9pZC9xZW11MS9ody9jb3JlL2xvYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzRiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvbG9hZGVyLmMKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBRRU1VIEV4ZWN1dGFibGUgbG9hZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBHdW56aXAgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIHUtYm9vdDoKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDggU2VtaWhhbGYKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDAtMjAwNQorICogV29sZmdhbmcgRGVuaywgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgd2RAZGVueC5kZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImRpc2FzL2Rpc2FzLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgInVib290X2ltYWdlLmgiCisKKyNpbmNsdWRlIDx6bGliLmg+CisKKy8qIHJldHVybiB0aGUgc2l6ZSBvciAtMSBpZiBlcnJvciAqLworaW50IGdldF9pbWFnZV9zaXplKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGludCBmZCwgc2l6ZTsKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIHJldHVybiB0aGUgc2l6ZSBvciAtMSBpZiBlcnJvciAqLworLyogZGVwcmVjYXRlZCwgYmVjYXVzZSBjYWxsZXIgZG9lcyBub3Qgc3BlY2lmeSBidWZmZXIgc2l6ZSEgKi8KK2ludCBsb2FkX2ltYWdlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aW50OF90ICphZGRyKQoreworICAgIGludCBmZCwgc2l6ZTsKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKyAgICBsc2VlayhmZCwgMCwgU0VFS19TRVQpOworICAgIGlmIChyZWFkKGZkLCBhZGRyLCBzaXplKSAhPSBzaXplKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIHJldHVybiB0aGUgYW1vdW50IHJlYWQsIGp1c3QgbGlrZSBmcmVhZC4gIDAgbWF5IG1lYW4gZXJyb3Igb3IgZW9mICovCitpbnQgZnJlYWRfdGFyZ3BoeXMoaHdhZGRyIGRzdF9hZGRyLCBzaXplX3QgbmJ5dGVzLCBGSUxFICpmKQoreworICAgIHVpbnQ4X3QgYnVmWzQwOTZdOworICAgIGh3YWRkciBkc3RfYmVnaW4gPSBkc3RfYWRkcjsKKyAgICBzaXplX3Qgd2FudCwgZGlkOworCisgICAgd2hpbGUgKG5ieXRlcykgeworCXdhbnQgPSBuYnl0ZXMgPiBzaXplb2YoYnVmKSA/IHNpemVvZihidWYpIDogbmJ5dGVzOworCWRpZCA9IGZyZWFkKGJ1ZiwgMSwgd2FudCwgZik7CisKKwljcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlX3JvbShkc3RfYWRkciwgYnVmLCBkaWQpOworCWRzdF9hZGRyICs9IGRpZDsKKwluYnl0ZXMgLT0gZGlkOworCWlmIChkaWQgIT0gd2FudCkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkc3RfYWRkciAtIGRzdF9iZWdpbjsKK30KKworLyogcmV0dXJucyAwIG9uIGVycm9yLCAxIGlmIG9rICovCitpbnQgZnJlYWRfdGFyZ3BoeXNfb2soaHdhZGRyIGRzdF9hZGRyLCBzaXplX3QgbmJ5dGVzLCBGSUxFICpmKQoreworICAgIHJldHVybiBmcmVhZF90YXJncGh5cyhkc3RfYWRkciwgbmJ5dGVzLCBmKSA9PSBuYnl0ZXM7Cit9CisKKy8qIHJlYWQoKS1saWtlIHZlcnNpb24gKi8KK2ludCByZWFkX3RhcmdwaHlzKGludCBmZCwgaHdhZGRyIGRzdF9hZGRyLCBzaXplX3QgbmJ5dGVzKQoreworICAgIHVpbnQ4X3QgYnVmWzQwOTZdOworICAgIGh3YWRkciBkc3RfYmVnaW4gPSBkc3RfYWRkcjsKKyAgICBzaXplX3Qgd2FudCwgZGlkOworCisgICAgd2hpbGUgKG5ieXRlcykgeworCXdhbnQgPSBuYnl0ZXMgPiBzaXplb2YoYnVmKSA/IHNpemVvZihidWYpIDogbmJ5dGVzOworCWRpZCA9IHJlYWQoZmQsIGJ1Ziwgd2FudCk7CisJaWYgKGRpZCAhPSB3YW50KSBicmVhazsKKworCWNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKGRzdF9hZGRyLCBidWYsIGRpZCk7CisJZHN0X2FkZHIgKz0gZGlkOworCW5ieXRlcyAtPSBkaWQ7CisgICAgfQorICAgIHJldHVybiBkc3RfYWRkciAtIGRzdF9iZWdpbjsKK30KKworLyogcmV0dXJuIHRoZSBzaXplIG9yIC0xIGlmIGVycm9yICovCitpbnQgbG9hZF9pbWFnZV90YXJncGh5cyhjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCWh3YWRkciBhZGRyLCBpbnQgbWF4X3N6KQoreworICAgIEZJTEUgKmY7CisgICAgc2l6ZV90IGdvdDsKKworICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7CisgICAgaWYgKCFmKSByZXR1cm4gLTE7CisKKyAgICBnb3QgPSBmcmVhZF90YXJncGh5cyhhZGRyLCBtYXhfc3osIGYpOworICAgIGlmIChmZXJyb3IoZikpIHsgZmNsb3NlKGYpOyByZXR1cm4gLTE7IH0KKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gZ290OworfQorCit2b2lkIHBzdHJjcHlfdGFyZ3BoeXMoY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgZGVzdCwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNvdXJjZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBudWxfYnl0ZSA9IDA7CisgICAgY29uc3QgY2hhciAqbnVscDsKKworICAgIGlmIChidWZfc2l6ZSA8PSAwKSByZXR1cm47CisgICAgbnVscCA9IG1lbWNocihzb3VyY2UsIDAsIGJ1Zl9zaXplKTsKKyAgICBpZiAobnVscCkgeworCWNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKGRlc3QsICh1aW50OF90ICopc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVscCAtIHNvdXJjZSkgKyAxKTsKKyAgICB9IGVsc2UgeworCWNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKGRlc3QsICh1aW50OF90ICopc291cmNlLCBidWZfc2l6ZSAtIDEpOworCWNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKGRlc3QsICZudWxfYnl0ZSwgMSk7CisgICAgfQorfQorCisvKiBBLk9VVCBsb2FkZXIgKi8KKworc3RydWN0IGV4ZWMKK3sKKyAgdWludDMyX3QgYV9pbmZvOyAgIC8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KKyAgdWludDMyX3QgYV90ZXh0OyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLworICB1aW50MzJfdCBhX2RhdGE7ICAgLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCisgIHVpbnQzMl90IGFfYnNzOyAgICAvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEsIGluIGJ5dGVzICovCisgIHVpbnQzMl90IGFfc3ltczsgICAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KKyAgdWludDMyX3QgYV9lbnRyeTsgIC8qIHN0YXJ0IGFkZHJlc3MgKi8KKyAgdWludDMyX3QgYV90cnNpemU7IC8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCisgIHVpbnQzMl90IGFfZHJzaXplOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLworfTsKKworI2lmZGVmIEJTV0FQX05FRURFRAorc3RhdGljIHZvaWQgYnN3YXBfYWhkcihzdHJ1Y3QgZXhlYyAqZSkKK3sKKyAgICBic3dhcDMycygmZS0+YV9pbmZvKTsKKyAgICBic3dhcDMycygmZS0+YV90ZXh0KTsKKyAgICBic3dhcDMycygmZS0+YV9kYXRhKTsKKyAgICBic3dhcDMycygmZS0+YV9ic3MpOworICAgIGJzd2FwMzJzKCZlLT5hX3N5bXMpOworICAgIGJzd2FwMzJzKCZlLT5hX2VudHJ5KTsKKyAgICBic3dhcDMycygmZS0+YV90cnNpemUpOworICAgIGJzd2FwMzJzKCZlLT5hX2Ryc2l6ZSk7Cit9CisjZWxzZQorI2RlZmluZSBic3dhcF9haGRyKHgpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCisjZGVmaW5lIE9NQUdJQyAwNDA3CisjZGVmaW5lIE5NQUdJQyAwNDEwCisjZGVmaW5lIFpNQUdJQyAwNDEzCisjZGVmaW5lIFFNQUdJQyAwMzE0CisjZGVmaW5lIF9OX0hEUk9GRih4KSAoMTAyNCAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQorI2RlZmluZSBOX1RYVE9GRih4KQkJCQkJCQlcCisgICAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gX05fSERST0ZGKCh4KSkgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6CVwKKyAgICAgKE5fTUFHSUMoeCkgPT0gUU1BR0lDID8gMCA6IHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKKyNkZWZpbmUgTl9UWFRBRERSKHgpIChOX01BR0lDKHgpID09IFFNQUdJQyA/IFRBUkdFVF9QQUdFX1NJWkUgOiAwKQorI2RlZmluZSBfTl9TRUdNRU5UX1JPVU5EKHgpICgoKHgpICsgVEFSR0VUX1BBR0VfU0laRSAtIDEpICYgfihUQVJHRVRfUEFHRV9TSVpFIC0gMSkpCisKKyNkZWZpbmUgX05fVFhURU5EQUREUih4KSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpCisKKyNkZWZpbmUgTl9EQVRBRERSKHgpIFwKKyAgICAoTl9NQUdJQyh4KT09T01BR0lDPyAoX05fVFhURU5EQUREUih4KSkgXAorICAgICA6IChfTl9TRUdNRU5UX1JPVU5EIChfTl9UWFRFTkRBRERSKHgpKSkpCisKKworaW50IGxvYWRfYW91dChjb25zdCBjaGFyICpmaWxlbmFtZSwgaHdhZGRyIGFkZHIsIGludCBtYXhfc3opCit7CisgICAgaW50IGZkLCBzaXplLCByZXQ7CisgICAgc3RydWN0IGV4ZWMgZTsKKyAgICB1aW50MzJfdCBtYWdpYzsKKworICAgIGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc2l6ZSA9IHJlYWQoZmQsICZlLCBzaXplb2YoZSkpOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYnN3YXBfYWhkcigmZSk7CisKKyAgICBtYWdpYyA9IE5fTUFHSUMoZSk7CisgICAgc3dpdGNoIChtYWdpYykgeworICAgIGNhc2UgWk1BR0lDOgorICAgIGNhc2UgUU1BR0lDOgorICAgIGNhc2UgT01BR0lDOgorICAgICAgICBpZiAoZS5hX3RleHQgKyBlLmFfZGF0YSA+IG1heF9zeikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKwlsc2VlayhmZCwgTl9UWFRPRkYoZSksIFNFRUtfU0VUKTsKKwlzaXplID0gcmVhZF90YXJncGh5cyhmZCwgYWRkciwgZS5hX3RleHQgKyBlLmFfZGF0YSk7CisJaWYgKHNpemUgPCAwKQorCSAgICBnb3RvIGZhaWw7CisJYnJlYWs7CisgICAgY2FzZSBOTUFHSUM6CisgICAgICAgIGlmIChOX0RBVEFERFIoZSkgKyBlLmFfZGF0YSA+IG1heF9zeikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKwlsc2VlayhmZCwgTl9UWFRPRkYoZSksIFNFRUtfU0VUKTsKKwlzaXplID0gcmVhZF90YXJncGh5cyhmZCwgYWRkciwgZS5hX3RleHQpOworCWlmIChzaXplIDwgMCkKKwkgICAgZ290byBmYWlsOworCXJldCA9IHJlYWRfdGFyZ3BoeXMoZmQsIGFkZHIgKyBOX0RBVEFERFIoZSksIGUuYV9kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkgICAgZ290byBmYWlsOworCXNpemUgKz0gcmV0OworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJZ290byBmYWlsOworICAgIH0KKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHNpemU7CisgZmFpbDoKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIC0xOworfQorCisvKiBFTEYgbG9hZGVyICovCisKK3N0YXRpYyB2b2lkICpsb2FkX2F0KGludCBmZCwgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisgICAgdm9pZCAqcHRyOworICAgIGlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBnX21hbGxvYyhzaXplKTsKKyAgICBpZiAocmVhZChmZCwgcHRyLCBzaXplKSAhPSBzaXplKSB7CisgICAgICAgIGdfZnJlZShwdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworCisjZGVmaW5lIEVMRl9DTEFTUyAgIEVMRkNMQVNTMzIKKyNpbmNsdWRlICJlbGYuaCIKKworI2RlZmluZSBTWgkJMzIKKyNkZWZpbmUgZWxmX3dvcmQgICAgICAgIHVpbnQzMl90CisjZGVmaW5lIGVsZl9zd29yZCAgICAgICAgaW50MzJfdAorI2RlZmluZSBic3dhcFNacwlic3dhcDMycworI2luY2x1ZGUgImh3L2VsZl9vcHMuaCIKKworI3VuZGVmIGVsZmhkcgorI3VuZGVmIGVsZl9waGRyCisjdW5kZWYgZWxmX3NoZHIKKyN1bmRlZiBlbGZfc3ltCisjdW5kZWYgZWxmX25vdGUKKyN1bmRlZiBlbGZfd29yZAorI3VuZGVmIGVsZl9zd29yZAorI3VuZGVmIGJzd2FwU1pzCisjdW5kZWYgU1oKKyNkZWZpbmUgZWxmaGRyCQllbGY2NF9oZHIKKyNkZWZpbmUgZWxmX3BoZHIJZWxmNjRfcGhkcgorI2RlZmluZSBlbGZfbm90ZQllbGY2NF9ub3RlCisjZGVmaW5lIGVsZl9zaGRyCWVsZjY0X3NoZHIKKyNkZWZpbmUgZWxmX3N5bQkJZWxmNjRfc3ltCisjZGVmaW5lIGVsZl93b3JkICAgICAgICB1aW50NjRfdAorI2RlZmluZSBlbGZfc3dvcmQgICAgICAgIGludDY0X3QKKyNkZWZpbmUgYnN3YXBTWnMJYnN3YXA2NHMKKyNkZWZpbmUgU1oJCTY0CisjaW5jbHVkZSAiaHcvZWxmX29wcy5oIgorCisvKiByZXR1cm4gPCAwIGlmIGVycm9yLCBvdGhlcndpc2UgdGhlIG51bWJlciBvZiBieXRlcyBsb2FkZWQgaW4gbWVtb3J5ICovCitpbnQgbG9hZF9lbGYoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludDY0X3QgYWRkcmVzc19vZmZzZXQsCisgICAgICAgICAgICAgdWludDY0X3QgKnBlbnRyeSwgdWludDY0X3QgKmxvd2FkZHIsIHVpbnQ2NF90ICpoaWdoYWRkcikKK3sKKyAgICBpbnQgZmQsIGRhdGFfb3JkZXIsIGhvc3RfZGF0YV9vcmRlciwgbXVzdF9zd2FiLCByZXQ7CisgICAgdWludDhfdCBlX2lkZW50W0VJX05JREVOVF07CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcGVycm9yKGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocmVhZChmZCwgZV9pZGVudCwgc2l6ZW9mKGVfaWRlbnQpKSAhPSBzaXplb2YoZV9pZGVudCkpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoZV9pZGVudFswXSAhPSBFTEZNQUcwIHx8CisgICAgICAgIGVfaWRlbnRbMV0gIT0gRUxGTUFHMSB8fAorICAgICAgICBlX2lkZW50WzJdICE9IEVMRk1BRzIgfHwKKyAgICAgICAgZV9pZGVudFszXSAhPSBFTEZNQUczKQorICAgICAgICBnb3RvIGZhaWw7CisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyAgICBkYXRhX29yZGVyID0gRUxGREFUQTJNU0I7CisjZWxzZQorICAgIGRhdGFfb3JkZXIgPSBFTEZEQVRBMkxTQjsKKyNlbmRpZgorICAgIG11c3Rfc3dhYiA9IGRhdGFfb3JkZXIgIT0gZV9pZGVudFtFSV9EQVRBXTsKKworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICBob3N0X2RhdGFfb3JkZXIgPSBFTEZEQVRBMk1TQjsKKyNlbHNlCisgICAgaG9zdF9kYXRhX29yZGVyID0gRUxGREFUQTJMU0I7CisjZW5kaWYKKyAgICBpZiAoaG9zdF9kYXRhX29yZGVyICE9IGVfaWRlbnRbRUlfREFUQV0pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGxzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisgICAgaWYgKGVfaWRlbnRbRUlfQ0xBU1NdID09IEVMRkNMQVNTNjQpIHsKKyAgICAgICAgcmV0ID0gbG9hZF9lbGY2NChmZCwgYWRkcmVzc19vZmZzZXQsIG11c3Rfc3dhYiwgcGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2FkZHIsIGhpZ2hhZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBsb2FkX2VsZjMyKGZkLCBhZGRyZXNzX29mZnNldCwgbXVzdF9zd2FiLCBwZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93YWRkciwgaGlnaGFkZHIpOworICAgIH0KKworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gcmV0OworCisgZmFpbDoKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBic3dhcF91Ym9vdF9oZWFkZXIodWJvb3RfaW1hZ2VfaGVhZGVyX3QgKmhkcikKK3sKKyNpZm5kZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyAgICBic3dhcDMycygmaGRyLT5paF9tYWdpYyk7CisgICAgYnN3YXAzMnMoJmhkci0+aWhfaGNyYyk7CisgICAgYnN3YXAzMnMoJmhkci0+aWhfdGltZSk7CisgICAgYnN3YXAzMnMoJmhkci0+aWhfc2l6ZSk7CisgICAgYnN3YXAzMnMoJmhkci0+aWhfbG9hZCk7CisgICAgYnN3YXAzMnMoJmhkci0+aWhfZXApOworICAgIGJzd2FwMzJzKCZoZHItPmloX2RjcmMpOworI2VuZGlmCit9CisKKworI2RlZmluZSBaQUxMT0NfQUxJR05NRU5UCTE2CisKK3N0YXRpYyB2b2lkICp6YWxsb2Modm9pZCAqeCwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCit7CisgICAgdm9pZCAqcDsKKworICAgIHNpemUgKj0gaXRlbXM7CisgICAgc2l6ZSA9IChzaXplICsgWkFMTE9DX0FMSUdOTUVOVCAtIDEpICYgfihaQUxMT0NfQUxJR05NRU5UIC0gMSk7CisKKyAgICBwID0gZ19tYWxsb2Moc2l6ZSk7CisKKyAgICByZXR1cm4gKHApOworfQorCitzdGF0aWMgdm9pZCB6ZnJlZSh2b2lkICp4LCB2b2lkICphZGRyKQoreworICAgIGdfZnJlZShhZGRyKTsKK30KKworCisjZGVmaW5lIEhFQURfQ1JDCTIKKyNkZWZpbmUgRVhUUkFfRklFTEQJNAorI2RlZmluZSBPUklHX05BTUUJOAorI2RlZmluZSBDT01NRU5UCQkweDEwCisjZGVmaW5lIFJFU0VSVkVECTB4ZTAKKworI2RlZmluZSBERUZMQVRFRAk4CisKKy8qIFRoaXMgaXMgdGhlIG1heGltdW0gaW4gdWJvb3QsIHNvIGlmIGEgdUltYWdlIG92ZXJmbG93cyB0aGlzLCBpdCB3b3VsZAorICogb3ZlcmZsb3cgb24gcmVhbCBoYXJkd2FyZSB0b28uICovCisjZGVmaW5lIFVCT09UX01BWF9HVU5aSVBfQllURVMgMHg4MDAwMDAKKworc3RhdGljIHNzaXplX3QgZ3VuemlwKHZvaWQgKmRzdCwgc2l6ZV90IGRzdGxlbiwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNsZW4pCit7CisgICAgel9zdHJlYW0gczsKKyAgICBzc2l6ZV90IGRzdGJ5dGVzOworICAgIGludCByLCBpLCBmbGFnczsKKworICAgIC8qIHNraXAgaGVhZGVyICovCisgICAgaSA9IDEwOworICAgIGZsYWdzID0gc3JjWzNdOworICAgIGlmIChzcmNbMl0gIT0gREVGTEFURUQgfHwgKGZsYWdzICYgUkVTRVJWRUQpICE9IDApIHsKKyAgICAgICAgcHV0cyAoIkVycm9yOiBCYWQgZ3ppcHBlZCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgRVhUUkFfRklFTEQpICE9IDApCisgICAgICAgIGkgPSAxMiArIHNyY1sxMF0gKyAoc3JjWzExXSA8PCA4KTsKKyAgICBpZiAoKGZsYWdzICYgT1JJR19OQU1FKSAhPSAwKQorICAgICAgICB3aGlsZSAoc3JjW2krK10gIT0gMCkKKyAgICAgICAgICAgIDsKKyAgICBpZiAoKGZsYWdzICYgQ09NTUVOVCkgIT0gMCkKKyAgICAgICAgd2hpbGUgKHNyY1tpKytdICE9IDApCisgICAgICAgICAgICA7CisgICAgaWYgKChmbGFncyAmIEhFQURfQ1JDKSAhPSAwKQorICAgICAgICBpICs9IDI7CisgICAgaWYgKGkgPj0gc3JjbGVuKSB7CisgICAgICAgIHB1dHMgKCJFcnJvcjogZ3VuemlwIG91dCBvZiBkYXRhIGluIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLnphbGxvYyA9IHphbGxvYzsKKyAgICBzLnpmcmVlID0gemZyZWU7CisKKyAgICByID0gaW5mbGF0ZUluaXQyKCZzLCAtTUFYX1dCSVRTKTsKKyAgICBpZiAociAhPSBaX09LKSB7CisgICAgICAgIHByaW50ZiAoIkVycm9yOiBpbmZsYXRlSW5pdDIoKSByZXR1cm5lZCAlZFxuIiwgcik7CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKyAgICBzLm5leHRfaW4gPSBzcmMgKyBpOworICAgIHMuYXZhaWxfaW4gPSBzcmNsZW4gLSBpOworICAgIHMubmV4dF9vdXQgPSBkc3Q7CisgICAgcy5hdmFpbF9vdXQgPSBkc3RsZW47CisgICAgciA9IGluZmxhdGUoJnMsIFpfRklOSVNIKTsKKyAgICBpZiAociAhPSBaX09LICYmIHIgIT0gWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIHByaW50ZiAoIkVycm9yOiBpbmZsYXRlKCkgcmV0dXJuZWQgJWRcbiIsIHIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGRzdGJ5dGVzID0gcy5uZXh0X291dCAtICh1bnNpZ25lZCBjaGFyICopIGRzdDsKKyAgICBpbmZsYXRlRW5kKCZzKTsKKworICAgIHJldHVybiBkc3RieXRlczsKK30KKworLyogTG9hZCBhIFUtQm9vdCBpbWFnZS4gICovCitpbnQgbG9hZF91aW1hZ2UoY29uc3QgY2hhciAqZmlsZW5hbWUsIHRhcmdldF91bG9uZyAqZXAsIHRhcmdldF91bG9uZyAqbG9hZGFkZHIsCisgICAgICAgICAgICAgICAgaW50ICppc19saW51eCkKK3sKKyAgICBpbnQgZmQ7CisgICAgaW50IHNpemU7CisgICAgdWJvb3RfaW1hZ2VfaGVhZGVyX3QgaDsKKyAgICB1Ym9vdF9pbWFnZV9oZWFkZXJfdCAqaGRyID0gJmg7CisgICAgdWludDhfdCAqZGF0YSA9IE5VTEw7CisgICAgaW50IHJldCA9IC0xOworCisgICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzaXplID0gcmVhZChmZCwgaGRyLCBzaXplb2YodWJvb3RfaW1hZ2VfaGVhZGVyX3QpKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIGdvdG8gb3V0OworCisgICAgYnN3YXBfdWJvb3RfaGVhZGVyKGhkcik7CisKKyAgICBpZiAoaGRyLT5paF9tYWdpYyAhPSBJSF9NQUdJQykKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAvKiBUT0RPOiBJbXBsZW1lbnQgb3RoZXIgaW1hZ2UgdHlwZXMuICAqLworICAgIGlmIChoZHItPmloX3R5cGUgIT0gSUhfVFlQRV9LRVJORUwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4gb25seSBsb2FkIHUtYm9vdCBpbWFnZSB0eXBlIFwia2VybmVsXCJcbiIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGhkci0+aWhfY29tcCkgeworICAgIGNhc2UgSUhfQ09NUF9OT05FOgorICAgIGNhc2UgSUhfQ09NUF9HWklQOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvYWQgdS1ib290IGltYWdlcyB3aXRoIGNvbXByZXNzaW9uIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgaGRyLT5paF9jb21wKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgLyogVE9ETzogQ2hlY2sgQ1BVIHR5cGUuICAqLworICAgIGlmIChpc19saW51eCkgeworICAgICAgICBpZiAoaGRyLT5paF9vcyA9PSBJSF9PU19MSU5VWCkKKyAgICAgICAgICAgICppc19saW51eCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICppc19saW51eCA9IDA7CisgICAgfQorCisgICAgKmVwID0gaGRyLT5paF9lcDsKKyAgICBkYXRhID0gZ19tYWxsb2MoaGRyLT5paF9zaXplKTsKKworICAgIGlmIChyZWFkKGZkLCBkYXRhLCBoZHItPmloX3NpemUpICE9IGhkci0+aWhfc2l6ZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgZmlsZVxuIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChoZHItPmloX2NvbXAgPT0gSUhfQ09NUF9HWklQKSB7CisgICAgICAgIHVpbnQ4X3QgKmNvbXByZXNzZWRfZGF0YTsKKyAgICAgICAgc2l6ZV90IG1heF9ieXRlczsKKyAgICAgICAgc3NpemVfdCBieXRlczsKKworICAgICAgICBjb21wcmVzc2VkX2RhdGEgPSBkYXRhOworICAgICAgICBtYXhfYnl0ZXMgPSBVQk9PVF9NQVhfR1VOWklQX0JZVEVTOworICAgICAgICBkYXRhID0gZ19tYWxsb2MobWF4X2J5dGVzKTsKKworICAgICAgICBieXRlcyA9IGd1bnppcChkYXRhLCBtYXhfYnl0ZXMsIGNvbXByZXNzZWRfZGF0YSwgaGRyLT5paF9zaXplKTsKKyAgICAgICAgZ19mcmVlKGNvbXByZXNzZWRfZGF0YSk7CisgICAgICAgIGlmIChieXRlcyA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGRlY29tcHJlc3MgZ3ppcHBlZCBpbWFnZSFcbiIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaGRyLT5paF9zaXplID0gYnl0ZXM7CisgICAgfQorCisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZV9yb20oaGRyLT5paF9sb2FkLCBkYXRhLCBoZHItPmloX3NpemUpOworCisgICAgaWYgKGxvYWRhZGRyKQorICAgICAgICAqbG9hZGFkZHIgPSBoZHItPmloX2xvYWQ7CisKKyAgICByZXQgPSBoZHItPmloX3NpemU7CisKK291dDoKKyAgICBpZiAoZGF0YSkKKyAgICAgICAgZ19mcmVlKGRhdGEpOworICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9jb3JlL3FkZXYuYyBiL2FuZHJvaWQvcWVtdTEvaHcvY29yZS9xZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3YjdlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvY29yZS9xZGV2LmMKQEAgLTAsMCArMSw1MzAgQEAKKy8qCisgKiAgRHluYW1pYyBkZXZpY2UgY29uZmlndXJhdGlvbiBhbmQgY3JlYXRpb24uCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOSBDb2RlU291cmNlcnkKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24gTUEgIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogVGhlIHRoZW9yeSBoZXJlIGlzIHRoYXQgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBhIG1hY2hpbmUgd2l0aG91dAorICAga25vd2xlZGdlIG9mIHNwZWNpZmljIGRldmljZXMuICBIaXN0b3JpY2FsbHkgYm9hcmQgaW5pdCByb3V0aW5lcyBoYXZlCisgICBwYXNzZWQgYSBidW5jaCBvZiBhcmd1bWVudHMgdG8gZWFjaCBkZXZpY2UsIHJlcXVpcmluZyB0aGUgYm9hcmQga25vdworICAgZXhhY3RseSB3aGljaCBkZXZpY2UgaXQgaXMgZGVhbGluZyB3aXRoLiAgVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGFic3RyYWN0CisgICBBUEkgZm9yIGRldmljZSBjb25maWd1cmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4gIERldmljZXMgd2lsbCBnZW5lcmFsbHkKKyAgIGluaGVyaXQgZnJvbSBhIHBhcnRpY3VsYXIgYnVzIChlLmcuIFBDSSBvciBJMkMpIHJhdGhlciB0aGFuCisgICB0aGlzIEFQSSBkaXJlY3RseS4gICovCisKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAiaHcvcWRldi5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvYmxvY2tkZXYuaCIKKworc3RydWN0IERldmljZVByb3BlcnR5IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIERldmljZVByb3BUeXBlIHR5cGU7CisgICAgdW5pb24geworICAgICAgICB1aW50NjRfdCBpOworICAgICAgICB2b2lkICpwdHI7CisgICAgfSB2YWx1ZTsKKyAgICBEZXZpY2VQcm9wZXJ0eSAqbmV4dDsKK307CisKK3N0cnVjdCBEZXZpY2VUeXBlIHsKKyAgICBEZXZpY2VJbmZvICppbmZvOworICAgIERldmljZVR5cGUgKm5leHQ7Cit9OworCisvKiBUaGlzIGlzIGEgbmFzdHkgaGFjayB0byBhbGxvdyBwYXNzaW5nIGEgTlVMTCBidXMgdG8gcWRldl9jcmVhdGUuICAqLworc3RhdGljIEJ1c1N0YXRlICptYWluX3N5c3RlbV9idXM7CisKK3N0YXRpYyBEZXZpY2VUeXBlICpkZXZpY2VfdHlwZV9saXN0OworCisvKiBSZWdpc3RlciBhIG5ldyBkZXZpY2UgdHlwZS4gICovCit2b2lkIHFkZXZfcmVnaXN0ZXIoRGV2aWNlSW5mbyAqaW5mbykKK3sKKyAgICBEZXZpY2VUeXBlICp0OworCisgICAgYXNzZXJ0KGluZm8tPnNpemUgPj0gc2l6ZW9mKERldmljZVN0YXRlKSk7CisKKyAgICB0ID0gZ19tYWxsb2MwKHNpemVvZihEZXZpY2VUeXBlKSk7CisgICAgdC0+bmV4dCA9IGRldmljZV90eXBlX2xpc3Q7CisgICAgZGV2aWNlX3R5cGVfbGlzdCA9IHQ7CisgICAgdC0+aW5mbyA9IGluZm87Cit9CisKKy8qIENyZWF0ZSBhIG5ldyBkZXZpY2UuICBUaGlzIG9ubHkgaW5pdGlhbGl6ZXMgdGhlIGRldmljZSBzdGF0ZSBzdHJ1Y3R1cmUKKyAgIGFuZCBhbGxvd3MgcHJvcGVydGllcyB0byBiZSBzZXQuICBxZGV2X2luaXQgc2hvdWxkIGJlIGNhbGxlZCB0bworICAgaW5pdGlhbGl6ZSB0aGUgYWN0dWFsIGRldmljZSBlbXVsYXRpb24uICAqLworRGV2aWNlU3RhdGUgKnFkZXZfY3JlYXRlKEJ1c1N0YXRlICpidXMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgRGV2aWNlVHlwZSAqdDsKKyAgICBEZXZpY2VTdGF0ZSAqZGV2OworCisgICAgZm9yICh0ID0gZGV2aWNlX3R5cGVfbGlzdDsgdDsgdCA9IHQtPm5leHQpIHsKKyAgICAgICAgaWYgKHN0cmNtcCh0LT5pbmZvLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXQpIHsKKyAgICAgICAgaHdfZXJyb3IoIlVua25vd24gZGV2aWNlICclcydcbiIsIG5hbWUpOworICAgIH0KKworICAgIGRldiA9IGdfbWFsbG9jMCh0LT5pbmZvLT5zaXplKTsKKyAgICBkZXYtPnR5cGUgPSB0OworCisgICAgaWYgKCFidXMpIHsKKyAgICAgICAgLyogPz8/OiBUaGlzIGFzc3VtZXMgc3lzdGVtIGJ1c3NlcyBoYXZlIG5vIGFkZGl0aW9uYWwgc3RhdGUuICAqLworICAgICAgICBpZiAoIW1haW5fc3lzdGVtX2J1cykgeworICAgICAgICAgICAgbWFpbl9zeXN0ZW1fYnVzID0gcWJ1c19jcmVhdGUoQlVTX1RZUEVfU1lTVEVNLCBzaXplb2YoQnVzU3RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIm1haW4tc3lzdGVtLWJ1cyIpOworICAgICAgICB9CisgICAgICAgIGJ1cyA9IG1haW5fc3lzdGVtX2J1czsKKyAgICB9CisgICAgaWYgKHQtPmluZm8tPmJ1c190eXBlICE9IGJ1cy0+dHlwZSkgeworICAgICAgICAvKiBUT0RPOiBQcmludCBidXMgdHlwZSBuYW1lcy4gICovCisgICAgICAgIGh3X2Vycm9yKCJEZXZpY2UgJyVzJyBvbiB3cm9uZyBidXMgdHlwZSAoJWQvJWQpIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgdC0+aW5mby0+YnVzX3R5cGUsIGJ1cy0+dHlwZSk7CisgICAgfQorICAgIGRldi0+cGFyZW50X2J1cyA9IGJ1czsKKyAgICBRTElTVF9JTlNFUlRfSEVBRCgmYnVzLT5jaGlsZHJlbiwgZGV2LCBzaWJsaW5nKTsKKyAgICByZXR1cm4gZGV2OworfQorCitpbnQgcWRldl9kZXZpY2VfaGVscChRZW11T3B0cyAqb3B0cykKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRCAgLyogTm90IHJlYWR5IHlldCwgd2lsbCByZW1vdmUgd2hlbiB3ZSBwcm9wZXJseSBpbnRlZ3JhdGUgdXBzdHJlYW0gcWRldiAqLworICAgIHJldHVybiAwOworI2Vsc2UKKyAgICBjb25zdCBjaGFyICpkcml2ZXI7CisgICAgRGV2aWNlSW5mbyAqaW5mbzsKKyAgICBQcm9wZXJ0eSAqcHJvcDsKKworICAgIGRyaXZlciA9IHFlbXVfb3B0X2dldChvcHRzLCAiZHJpdmVyIik7CisgICAgaWYgKGRyaXZlciAmJiAhc3RyY21wKGRyaXZlciwgIj8iKSkgeworICAgICAgICBmb3IgKGluZm8gPSBkZXZpY2VfaW5mb19saXN0OyBpbmZvICE9IE5VTEw7IGluZm8gPSBpbmZvLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoaW5mby0+bm9fdXNlcikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBub3QgYXZhaWxhYmxlLCBkb24ndCBzaG93ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBxZGV2X3ByaW50X2RldmluZm8oaW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCFxZW11X29wdF9nZXQob3B0cywgIj8iKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpbmZvID0gcWRldl9maW5kX2luZm8oTlVMTCwgZHJpdmVyKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yIChwcm9wID0gaW5mby0+cHJvcHM7IHByb3AgJiYgcHJvcC0+bmFtZTsgcHJvcCsrKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRPRE8gUHJvcGVydGllcyB3aXRob3V0IGEgcGFyc2VyIGFyZSBqdXN0IGZvciBkaXJ0eSBoYWNrcy4KKyAgICAgICAgICogcWRldl9wcm9wX3B0ciBpcyB0aGUgb25seSBzdWNoIFByb3BlcnR5SW5mby4gIEl0J3MgbWFya2VkCisgICAgICAgICAqIGZvciByZW1vdmFsLiAgVGhpcyBjb25kaXRpb25hbCBzaG91bGQgYmUgcmVtb3ZlZCBhbG9uZyB3aXRoCisgICAgICAgICAqIGl0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFwcm9wLT5pbmZvLT5wYXJzZSkgeworICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBubyB3YXkgdG8gc2V0IGl0LCBkb24ndCBzaG93ICovCisgICAgICAgIH0KKyAgICAgICAgZXJyb3JfcHJpbnRmKCIlcy4lcz0lc1xuIiwgaW5mby0+bmFtZSwgcHJvcC0+bmFtZSwgcHJvcC0+aW5mby0+bmFtZSk7CisgICAgfQorICAgIHJldHVybiAxOworI2VuZGlmCit9CisKK0RldmljZVN0YXRlICpxZGV2X2RldmljZV9hZGQoUWVtdU9wdHMgKm9wdHMpCit7CisjaWZkZWYgQ09ORklHX0FORFJPSUQgIC8qIE5vdCByZWFkeSB5ZXQgKi8KKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgY29uc3QgY2hhciAqZHJpdmVyLCAqcGF0aCwgKmlkOworICAgIERldmljZUluZm8gKmluZm87CisgICAgRGV2aWNlU3RhdGUgKnFkZXY7CisgICAgQnVzU3RhdGUgKmJ1czsKKworICAgIGRyaXZlciA9IHFlbXVfb3B0X2dldChvcHRzLCAiZHJpdmVyIik7CisgICAgaWYgKCFkcml2ZXIpIHsKKyAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX01JU1NJTkdfUEFSQU1FVEVSLCAiZHJpdmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGZpbmQgZHJpdmVyICovCisgICAgaW5mbyA9IHFkZXZfZmluZF9pbmZvKE5VTEwsIGRyaXZlcik7CisgICAgaWYgKCFpbmZvIHx8IGluZm8tPm5vX3VzZXIpIHsKKyAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLCAiZHJpdmVyIiwgImEgZHJpdmVyIG5hbWUiKTsKKyAgICAgICAgZXJyb3JfcHJpbnRmX3VubGVzc19xbXAoIlRyeSB3aXRoIGFyZ3VtZW50ICc/JyBmb3IgYSBsaXN0LlxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIGZpbmQgYnVzICovCisgICAgcGF0aCA9IHFlbXVfb3B0X2dldChvcHRzLCAiYnVzIik7CisgICAgaWYgKHBhdGggIT0gTlVMTCkgeworICAgICAgICBidXMgPSBxYnVzX2ZpbmQocGF0aCk7CisgICAgICAgIGlmICghYnVzKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVzLT5pbmZvICE9IGluZm8tPmJ1c19pbmZvKSB7CisgICAgICAgICAgICBxZXJyb3JfcmVwb3J0KFFFUlJfQkFEX0JVU19GT1JfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLCBidXMtPmluZm8tPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBidXMgPSBxYnVzX2ZpbmRfcmVjdXJzaXZlKG1haW5fc3lzdGVtX2J1cywgTlVMTCwgaW5mby0+YnVzX2luZm8pOworICAgICAgICBpZiAoIWJ1cykgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX05PX0JVU19GT1JfREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bmFtZSwgaW5mby0+YnVzX2luZm8tPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHFkZXZfaG90cGx1ZyAmJiAhYnVzLT5hbGxvd19ob3RwbHVnKSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9CVVNfTk9fSE9UUExVRywgYnVzLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogY3JlYXRlIGRldmljZSwgc2V0IHByb3BlcnRpZXMgKi8KKyAgICBxZGV2ID0gcWRldl9jcmVhdGVfZnJvbV9pbmZvKGJ1cywgaW5mbyk7CisgICAgaWQgPSBxZW11X29wdHNfaWQob3B0cyk7CisgICAgaWYgKGlkKSB7CisgICAgICAgIHFkZXYtPmlkID0gaWQ7CisgICAgfQorICAgIGlmIChxZW11X29wdF9mb3JlYWNoKG9wdHMsIHNldF9wcm9wZXJ0eSwgcWRldiwgMSkgIT0gMCkgeworICAgICAgICBxZGV2X2ZyZWUocWRldik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAocWRldl9pbml0KHFkZXYpIDwgMCkgeworICAgICAgICBxZXJyb3JfcmVwb3J0KFFFUlJfREVWSUNFX0lOSVRfRkFJTEVELCBkcml2ZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcWRldi0+b3B0cyA9IG9wdHM7CisgICAgcmV0dXJuIHFkZXY7CisjZW5kaWYKK30KKworLyogSW5pdGlhbGl6ZSBhIGRldmljZS4gIERldmljZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKKyAgIHRoaXMgZnVuY3Rpb24uICBJUlFzIGFuZCBNTUlPIHJlZ2lvbnMgc2hvdWxkIGJlIGNvbm5lY3RlZC9tYXBwZWQgYWZ0ZXIKKyAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICovCit2b2lkIHFkZXZfaW5pdChEZXZpY2VTdGF0ZSAqZGV2KQoreworICAgIGRldi0+dHlwZS0+aW5mby0+aW5pdChkZXYsIGRldi0+dHlwZS0+aW5mbyk7Cit9CisKKy8qIFVubGluayBkZXZpY2UgZnJvbSBidXMgYW5kIGZyZWUgdGhlIHN0cnVjdHVyZS4gICovCit2b2lkIHFkZXZfZnJlZShEZXZpY2VTdGF0ZSAqZGV2KQoreworICAgIFFMSVNUX1JFTU9WRShkZXYsIHNpYmxpbmcpOworICAgIGdfZnJlZShkZXYpOworfQorCitzdGF0aWMgRGV2aWNlUHJvcGVydHkgKmNyZWF0ZV9wcm9wKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVByb3BUeXBlIHR5cGUpCit7CisgICAgRGV2aWNlUHJvcGVydHkgKnByb3A7CisKKyAgICAvKiBUT0RPOiBDaGVjayBmb3IgZHVwbGljYXRlIHByb3BlcnRpZXMuICAqLworICAgIHByb3AgPSBnX21hbGxvYzAoc2l6ZW9mKCpwcm9wKSk7CisgICAgcHJvcC0+bmFtZSA9IGdfc3RyZHVwKG5hbWUpOworICAgIHByb3AtPnR5cGUgPSB0eXBlOworICAgIHByb3AtPm5leHQgPSBkZXYtPnByb3BzOworICAgIGRldi0+cHJvcHMgPSBwcm9wOworCisgICAgcmV0dXJuIHByb3A7Cit9CisKK3ZvaWQgcWRldl9zZXRfcHJvcF9pbnQoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgdWludDY0X3QgdmFsdWUpCit7CisgICAgRGV2aWNlUHJvcGVydHkgKnByb3A7CisKKyAgICBwcm9wID0gY3JlYXRlX3Byb3AoZGV2LCBuYW1lLCBQUk9QX1RZUEVfSU5UKTsKKyAgICBwcm9wLT52YWx1ZS5pID0gdmFsdWU7Cit9CisKK3ZvaWQgcWRldl9zZXRfcHJvcF9kZXYoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgRGV2aWNlU3RhdGUgKnZhbHVlKQoreworICAgIERldmljZVByb3BlcnR5ICpwcm9wOworCisgICAgcHJvcCA9IGNyZWF0ZV9wcm9wKGRldiwgbmFtZSwgUFJPUF9UWVBFX0RFVik7CisgICAgcHJvcC0+dmFsdWUucHRyID0gdmFsdWU7Cit9CisKK3ZvaWQgcWRldl9zZXRfcHJvcF9wdHIoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqdmFsdWUpCit7CisgICAgRGV2aWNlUHJvcGVydHkgKnByb3A7CisKKyAgICBwcm9wID0gY3JlYXRlX3Byb3AoZGV2LCBuYW1lLCBQUk9QX1RZUEVfUFRSKTsKKyAgICBwcm9wLT52YWx1ZS5wdHIgPSB2YWx1ZTsKK30KKwordm9pZCBxZGV2X3NldF9uZXRkZXYoRGV2aWNlU3RhdGUgKmRldiwgTklDSW5mbyAqbmQpCit7CisgICAgYXNzZXJ0KCFkZXYtPm5kKTsKKyAgICBkZXYtPm5kID0gbmQ7Cit9CisKKworLyogR2V0IGEgY2hhcmFjdGVyIChzZXJpYWwpIGRldmljZSBpbnRlcmZhY2UuICAqLworQ2hhckRyaXZlclN0YXRlICpxZGV2X2luaXRfY2hhcmRldihEZXZpY2VTdGF0ZSAqZGV2KQoreworICAgIHN0YXRpYyBpbnQgbmV4dF9zZXJpYWw7CisgICAgc3RhdGljIGludCBuZXh0X3ZpcnRjb25zb2xlOworICAgIC8qIEZJWE1FOiBUaGlzIGlzIGEgbmFzdHkgaGFjayB0aGF0IG5lZWRzIHRvIGdvIGF3YXkuICAqLworICAgIGlmIChzdHJuY21wKGRldi0+dHlwZS0+aW5mby0+bmFtZSwgInZpcnRpbyIsIDYpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHZpcnRjb25faGRzW25leHRfdmlydGNvbnNvbGUrK107CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNlcmlhbF9oZHNbbmV4dF9zZXJpYWwrK107CisgICAgfQorfQorCitCdXNTdGF0ZSAqcWRldl9nZXRfcGFyZW50X2J1cyhEZXZpY2VTdGF0ZSAqZGV2KQoreworICAgIHJldHVybiBkZXYtPnBhcmVudF9idXM7Cit9CisKK3N0YXRpYyBEZXZpY2VQcm9wZXJ0eSAqZmluZF9wcm9wKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VQcm9wVHlwZSB0eXBlKQoreworICAgIERldmljZVByb3BlcnR5ICpwcm9wOworCisgICAgZm9yIChwcm9wID0gZGV2LT5wcm9wczsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKyAgICAgICAgaWYgKHN0cmNtcChwcm9wLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQgKHByb3AtPnR5cGUgPT0gdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gcHJvcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordWludDY0X3QgcWRldl9nZXRfcHJvcF9pbnQoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgdWludDY0X3QgZGVmKQoreworICAgIERldmljZVByb3BlcnR5ICpwcm9wOworCisgICAgcHJvcCA9IGZpbmRfcHJvcChkZXYsIG5hbWUsIFBST1BfVFlQRV9JTlQpOworICAgIGlmICghcHJvcCkgeworICAgICAgICByZXR1cm4gZGVmOworICAgIH0KKworICAgIHJldHVybiBwcm9wLT52YWx1ZS5pOworfQorCit2b2lkICpxZGV2X2dldF9wcm9wX3B0cihEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIERldmljZVByb3BlcnR5ICpwcm9wOworCisgICAgcHJvcCA9IGZpbmRfcHJvcChkZXYsIG5hbWUsIFBST1BfVFlQRV9QVFIpOworICAgIGFzc2VydChwcm9wKTsKKyAgICByZXR1cm4gcHJvcC0+dmFsdWUucHRyOworfQorCitEZXZpY2VTdGF0ZSAqcWRldl9nZXRfcHJvcF9kZXYoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBEZXZpY2VQcm9wZXJ0eSAqcHJvcDsKKworICAgIHByb3AgPSBmaW5kX3Byb3AoZGV2LCBuYW1lLCBQUk9QX1RZUEVfREVWKTsKKyAgICBpZiAoIXByb3ApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBwcm9wLT52YWx1ZS5wdHI7Cit9CisKK3ZvaWQgcWRldl9pbml0X2dwaW9faW4oRGV2aWNlU3RhdGUgKmRldiwgcWVtdV9pcnFfaGFuZGxlciBoYW5kbGVyLCBpbnQgbikKK3sKKyAgICBhc3NlcnQoZGV2LT5udW1fZ3Bpb19pbiA9PSAwKTsKKyAgICBkZXYtPm51bV9ncGlvX2luID0gbjsKKyAgICBkZXYtPmdwaW9faW4gPSBxZW11X2FsbG9jYXRlX2lycXMoaGFuZGxlciwgZGV2LCBuKTsKK30KKwordm9pZCBxZGV2X2luaXRfZ3Bpb19vdXQoRGV2aWNlU3RhdGUgKmRldiwgcWVtdV9pcnEgKnBpbnMsIGludCBuKQoreworICAgIGFzc2VydChkZXYtPm51bV9ncGlvX291dCA9PSAwKTsKKyAgICBkZXYtPm51bV9ncGlvX291dCA9IG47CisgICAgZGV2LT5ncGlvX291dCA9IHBpbnM7Cit9CisKK3FlbXVfaXJxIHFkZXZfZ2V0X2dwaW9faW4oRGV2aWNlU3RhdGUgKmRldiwgaW50IG4pCit7CisgICAgYXNzZXJ0KG4gPj0gMCAmJiBuIDwgZGV2LT5udW1fZ3Bpb19pbik7CisgICAgcmV0dXJuIGRldi0+Z3Bpb19pbltuXTsKK30KKwordm9pZCBxZGV2X2Nvbm5lY3RfZ3Bpb19vdXQoRGV2aWNlU3RhdGUgKiBkZXYsIGludCBuLCBxZW11X2lycSBwaW4pCit7CisgICAgYXNzZXJ0KG4gPj0gMCAmJiBuIDwgZGV2LT5udW1fZ3Bpb19vdXQpOworICAgIGRldi0+Z3Bpb19vdXRbbl0gPSBwaW47Cit9CisKK1ZMQU5DbGllbnRTdGF0ZSAqcWRldl9nZXRfdmxhbl9jbGllbnQoRGV2aWNlU3RhdGUgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Q2FuUmVjZWl2ZSAqY2FuX3JlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldFJlY2VpdmUgKnJlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldFJlY2VpdmVJT1YgKnJlY2VpdmVfaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRDbGVhbnVwICpjbGVhbnVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgTklDSW5mbyAqbmQgPSBkZXYtPm5kOworICAgIGFzc2VydChuZCk7CisgICAgcmV0dXJuIHFlbXVfbmV3X3ZsYW5fY2xpZW50KG5kLT52bGFuLCBuZC0+bW9kZWwsIG5kLT5uYW1lLCBjYW5fcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZSwgcmVjZWl2ZV9pb3YsIGNsZWFudXAsIG9wYXF1ZSk7Cit9CisKKwordm9pZCBxZGV2X2dldF9tYWNhZGRyKERldmljZVN0YXRlICpkZXYsIHVpbnQ4X3QgKm1hY2FkZHIpCit7CisgICAgbWVtY3B5KG1hY2FkZHIsIGRldi0+bmQtPm1hY2FkZHIsIDYpOworfQorCitzdGF0aWMgaW50IG5leHRfYmxvY2tfdW5pdFtJRl9DT1VOVF07CisKKy8qIEdldCBhIGJsb2NrIGRldmljZS4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3Igc2luZ2xlLWRyaXZlIGRldmljZXMKKyAgIChlLmcuIFNEL0Zsb3BweS9NVEQpLiAgTXVsdGktZGlzayBkZXZpY2VzIChzY3NpL2lkZSkgc2hvdWxkIHVzZSB0aGUKKyAgIGFwcHJvcHJpYXRlIGJ1cy4gICovCitCbG9ja0RyaXZlclN0YXRlICpxZGV2X2luaXRfYmRydihEZXZpY2VTdGF0ZSAqZGV2LCBCbG9ja0ludGVyZmFjZVR5cGUgdHlwZSkKK3sKKyAgICBpbnQgdW5pdCA9IG5leHRfYmxvY2tfdW5pdFt0eXBlXSsrOworICAgIERyaXZlSW5mbyogaW5mbzsKKworICAgIGluZm8gPSBkcml2ZV9nZXQodHlwZSwgMCwgdW5pdCk7CisgICAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGluZm8tPmJkcnY7Cit9CisKK0J1c1N0YXRlICpxZGV2X2dldF9jaGlsZF9idXMoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBCdXNTdGF0ZSAqYnVzOworCisgICAgUUxJU1RfRk9SRUFDSChidXMsICZkZXYtPmNoaWxkX2J1cywgc2libGluZykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIGJ1cy0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBuZXh0X3Njc2lfYnVzOworCisvKiBDcmVhdGUgYSBzY3NpIGJ1cywgYW5kIGF0dGFjaCBkZXZpY2VzIHRvIGl0LiAgKi8KKy8qIFRPRE86IEFjdHVhbGx5IGNyZWF0ZSBhIHNjc2kgYnVzIGZvciBob3RwbHVnIHRvIHVzZS4gICovCit2b2lkIHNjc2lfYnVzX25ldyhEZXZpY2VTdGF0ZSAqaG9zdCwgU0NTSUF0dGFjaEZuIGF0dGFjaCkKK3sKKyAgIGludCBidXMgPSBuZXh0X3Njc2lfYnVzKys7CisgICBpbnQgdW5pdDsKKyAgIERyaXZlSW5mbyogaW5mbzsKKworICAgZm9yICh1bml0ID0gMDsgdW5pdCA8IE1BWF9TQ1NJX0RFVlM7IHVuaXQrKykgeworICAgICAgIGluZm8gPSBkcml2ZV9nZXQoSUZfU0NTSSwgYnVzLCB1bml0KTsKKyAgICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgIH0KKyAgICAgICBhdHRhY2goaG9zdCwgaW5mby0+YmRydiwgdW5pdCk7CisgICB9Cit9CisKK0J1c1N0YXRlICpxYnVzX2NyZWF0ZShCdXNUeXBlIHR5cGUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQnVzU3RhdGUgKmJ1czsKKworICAgIGJ1cyA9IGdfbWFsbG9jMChzaXplKTsKKyAgICBidXMtPnR5cGUgPSB0eXBlOworICAgIGJ1cy0+cGFyZW50ID0gcGFyZW50OworICAgIGJ1cy0+bmFtZSA9IGdfc3RyZHVwKG5hbWUpOworICAgIFFMSVNUX0lOSVQoJmJ1cy0+Y2hpbGRyZW4pOworICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgUUxJU1RfSU5TRVJUX0hFQUQoJnBhcmVudC0+Y2hpbGRfYnVzLCBidXMsIHNpYmxpbmcpOworICAgIH0KKyAgICByZXR1cm4gYnVzOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnVzX3R5cGVfbmFtZXNbXSA9IHsKKyAgICBbIEJVU19UWVBFX1NZU1RFTSBdID0gIlN5c3RlbSIsCisgICAgWyBCVVNfVFlQRV9QQ0kgXSAgICA9ICJQQ0kiLAorICAgIFsgQlVTX1RZUEVfU0NTSSBdICAgPSAiU0NTSSIsCisgICAgWyBCVVNfVFlQRV9JMkMgXSAgICA9ICJJMkMiLAorICAgIFsgQlVTX1RZUEVfU1NJIF0gICAgPSAiU1NJIiwKK307CisKKyNkZWZpbmUgcWRldl9wcmludGYoZm10LCAuLi4pIG1vbml0b3JfcHJpbnRmKG1vbiwgIiUqcyIgZm10LCBpbmRlbnQsICIiLCAjIyBfX1ZBX0FSR1NfXykKK3N0YXRpYyB2b2lkIHFidXNfcHJpbnQoTW9uaXRvciAqbW9uLCBCdXNTdGF0ZSAqYnVzLCBpbnQgaW5kZW50KTsKKworc3RhdGljIHZvaWQgcWRldl9wcmludChNb25pdG9yICptb24sIERldmljZVN0YXRlICpkZXYsIGludCBpbmRlbnQpCit7CisgICAgRGV2aWNlUHJvcGVydHkgKnByb3A7CisgICAgQnVzU3RhdGUgKmNoaWxkOworICAgIHFkZXZfcHJpbnRmKCJkZXY6ICVzXG4iLCBkZXYtPnR5cGUtPmluZm8tPm5hbWUpOworICAgIGluZGVudCArPSAyOworICAgIGlmIChkZXYtPm51bV9ncGlvX2luKSB7CisgICAgICAgIHFkZXZfcHJpbnRmKCJncGlvLWluICVkXG4iLCBkZXYtPm51bV9ncGlvX2luKTsKKyAgICB9CisgICAgaWYgKGRldi0+bnVtX2dwaW9fb3V0KSB7CisgICAgICAgIHFkZXZfcHJpbnRmKCJncGlvLW91dCAlZFxuIiwgZGV2LT5udW1fZ3Bpb19vdXQpOworICAgIH0KKyAgICBmb3IgKHByb3AgPSBkZXYtPnByb3BzOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworICAgICAgICBzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBQUk9QX1RZUEVfSU5UOgorICAgICAgICAgICAgcWRldl9wcmludGYoInByb3AtaW50ICVzIDB4JSIgUFJJeDY0ICJcbiIsIHByb3AtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLT52YWx1ZS5pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBST1BfVFlQRV9QVFI6CisgICAgICAgICAgICBxZGV2X3ByaW50ZigicHJvcC1wdHIgJXNcbiIsIHByb3AtPm5hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFJPUF9UWVBFX0RFVjoKKyAgICAgICAgICAgIHFkZXZfcHJpbnRmKCJwcm9wLWRldiAlcyAlc1xuIiwgcHJvcC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRGV2aWNlU3RhdGUgKilwcm9wLT52YWx1ZS5wdHIpLT50eXBlLT5pbmZvLT5uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcWRldl9wcmludGYoInByb3AtdW5rbm93biVkICVzXG4iLCBwcm9wLT50eXBlLCBwcm9wLT5uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAoZGV2LT5wYXJlbnRfYnVzLT50eXBlKSB7CisgICAgY2FzZSBCVVNfVFlQRV9TWVNURU06CisgICAgICAgIHN5c2J1c19kZXZfcHJpbnQobW9uLCBkZXYsIGluZGVudCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBRTElTVF9GT1JFQUNIKGNoaWxkLCAmZGV2LT5jaGlsZF9idXMsIHNpYmxpbmcpIHsKKyAgICAgICAgcWJ1c19wcmludChtb24sIGNoaWxkLCBpbmRlbnQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcWJ1c19wcmludChNb25pdG9yICptb24sIEJ1c1N0YXRlICpidXMsIGludCBpbmRlbnQpCit7CisgICAgc3RydWN0IERldmljZVN0YXRlICpkZXY7CisKKyAgICBxZGV2X3ByaW50ZigiYnVzOiAlc1xuIiwgYnVzLT5uYW1lKTsKKyAgICBpbmRlbnQgKz0gMjsKKyAgICBxZGV2X3ByaW50ZigidHlwZSAlc1xuIiwgYnVzX3R5cGVfbmFtZXNbYnVzLT50eXBlXSk7CisgICAgUUxJU1RfRk9SRUFDSChkZXYsICZidXMtPmNoaWxkcmVuLCBzaWJsaW5nKSB7CisgICAgICAgIHFkZXZfcHJpbnQobW9uLCBkZXYsIGluZGVudCk7CisgICAgfQorfQorI3VuZGVmIHFkZXZfcHJpbnRmCisKK3ZvaWQgZG9faW5mb19xdHJlZShNb25pdG9yICptb24pCit7CisgICAgaWYgKG1haW5fc3lzdGVtX2J1cykKKyAgICAgICAgcWJ1c19wcmludChtb24sIG1haW5fc3lzdGVtX2J1cywgMCk7Cit9CisKK2NoYXIgKnFkZXZfZ2V0X2Rldl9wYXRoKERldmljZVN0YXRlICpkZXYpCit7CisgICAgLy8gVE9ETyhkaWdpdCk6IEltcGxlbWVudCB0aGlzIHByb3Blcmx5LgorICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvc3lzYnVzLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvc3lzYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmNDc3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvY29yZS9zeXNidXMuYwpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqICBTeXN0ZW0gKENQVSkgQnVzIGRldmljZSBzdXBwb3J0IGNvZGUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IENvZGVTb3VyY2VyeQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiBNQSAgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiZXhlYy9jcHUtY29tbW9uLmgiCisjaW5jbHVkZSAiaHcvc3lzYnVzLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorCit2b2lkIHN5c2J1c19jb25uZWN0X2lycShTeXNCdXNEZXZpY2UgKmRldiwgaW50IG4sIHFlbXVfaXJxIGlycSkKK3sKKyAgICBhc3NlcnQobiA+PSAwICYmIG4gPCBkZXYtPm51bV9pcnEpOworICAgIGRldi0+aXJxc1tuXSA9IDA7CisgICAgaWYgKGRldi0+aXJxcFtuXSkgeworICAgICAgICAqZGV2LT5pcnFwW25dID0gaXJxOworICAgIH0KK30KKwordm9pZCBzeXNidXNfbW1pb19tYXAoU3lzQnVzRGV2aWNlICpkZXYsIGludCBuLCBod2FkZHIgYWRkcikKK3sKKyAgICBhc3NlcnQobiA+PSAwICYmIG4gPCBkZXYtPm51bV9tbWlvKTsKKworICAgIGlmIChkZXYtPm1taW9bbl0uYWRkciA9PSBhZGRyKSB7CisgICAgICAgIC8qID8/PyByZWdpb24gYWxyZWFkeSBtYXBwZWQgaGVyZS4gICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGRldi0+bW1pb1tuXS5hZGRyICE9IChod2FkZHIpLTEpIHsKKyAgICAgICAgLyogVW5yZWdpc3RlciBwcmV2aW91cyBtYXBwaW5nLiAgKi8KKyAgICAgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShkZXYtPm1taW9bbl0uYWRkciwgZGV2LT5tbWlvW25dLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fTUVNX1VOQVNTSUdORUQpOworICAgIH0KKyAgICBkZXYtPm1taW9bbl0uYWRkciA9IGFkZHI7CisgICAgaWYgKGRldi0+bW1pb1tuXS5jYikgeworICAgICAgICBkZXYtPm1taW9bbl0uY2IoZGV2LCBhZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGFkZHIsIGRldi0+bW1pb1tuXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+bW1pb1tuXS5pb2Z1bmMpOworICAgIH0KK30KKworCisvKiBSZXF1ZXN0IGFuIElSUSBzb3VyY2UuICBUaGUgYWN0dWFsIElSUSBvYmplY3QgbWF5IGJlIHBvcHVsYXRlZCBsYXRlci4gICovCit2b2lkIHN5c2J1c19pbml0X2lycShTeXNCdXNEZXZpY2UgKmRldiwgcWVtdV9pcnEgKnApCit7CisgICAgaW50IG47CisKKyAgICBhc3NlcnQoZGV2LT5udW1faXJxIDwgUURFVl9NQVhfSVJRKTsKKyAgICBuID0gZGV2LT5udW1faXJxKys7CisgICAgZGV2LT5pcnFwW25dID0gcDsKK30KKworLyogUGFzcyBJUlFzIGZyb20gYSB0YXJnZXQgZGV2aWNlLiAgKi8KK3ZvaWQgc3lzYnVzX3Bhc3NfaXJxKFN5c0J1c0RldmljZSAqZGV2LCBTeXNCdXNEZXZpY2UgKnRhcmdldCkKK3sKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQoZGV2LT5udW1faXJxID09IDApOworICAgIGRldi0+bnVtX2lycSA9IHRhcmdldC0+bnVtX2lycTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1faXJxOyBpKyspIHsKKyAgICAgICAgZGV2LT5pcnFwW2ldID0gdGFyZ2V0LT5pcnFwW2ldOworICAgIH0KK30KKwordm9pZCBzeXNidXNfaW5pdF9tbWlvKFN5c0J1c0RldmljZSAqZGV2LCBod2FkZHIgc2l6ZSwgaW50IGlvZnVuYykKK3sKKyAgICBpbnQgbjsKKworICAgIGFzc2VydChkZXYtPm51bV9tbWlvIDwgUURFVl9NQVhfTU1JTyk7CisgICAgbiA9IGRldi0+bnVtX21taW8rKzsKKyAgICBkZXYtPm1taW9bbl0uYWRkciA9IC0xOworICAgIGRldi0+bW1pb1tuXS5zaXplID0gc2l6ZTsKKyAgICBkZXYtPm1taW9bbl0uaW9mdW5jID0gaW9mdW5jOworfQorCit2b2lkIHN5c2J1c19pbml0X21taW9fY2IoU3lzQnVzRGV2aWNlICpkZXYsIGh3YWRkciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1taW9fbWFwZnVuYyBjYikKK3sKKyAgICBpbnQgbjsKKworICAgIGFzc2VydChkZXYtPm51bV9tbWlvIDwgUURFVl9NQVhfTU1JTyk7CisgICAgbiA9IGRldi0+bnVtX21taW8rKzsKKyAgICBkZXYtPm1taW9bbl0uYWRkciA9IC0xOworICAgIGRldi0+bW1pb1tuXS5zaXplID0gc2l6ZTsKKyAgICBkZXYtPm1taW9bbl0uY2IgPSBjYjsKK30KKworc3RhdGljIHZvaWQgc3lzYnVzX2RldmljZV9pbml0KERldmljZVN0YXRlICpkZXYsIERldmljZUluZm8gKmJhc2UpCit7CisgICAgU3lzQnVzRGV2aWNlSW5mbyAqaW5mbyA9IGNvbnRhaW5lcl9vZihiYXNlLCBTeXNCdXNEZXZpY2VJbmZvLCBxZGV2KTsKKworICAgIGluZm8tPmluaXQoc3lzYnVzX2Zyb21fcWRldihkZXYpKTsKK30KKwordm9pZCBzeXNidXNfcmVnaXN0ZXJfd2l0aHByb3AoU3lzQnVzRGV2aWNlSW5mbyAqaW5mbykKK3sKKyAgICBpbmZvLT5xZGV2LmluaXQgPSBzeXNidXNfZGV2aWNlX2luaXQ7CisgICAgaW5mby0+cWRldi5idXNfdHlwZSA9IEJVU19UWVBFX1NZU1RFTTsKKworICAgIGFzc2VydChpbmZvLT5xZGV2LnNpemUgPj0gc2l6ZW9mKFN5c0J1c0RldmljZSkpOworICAgIHFkZXZfcmVnaXN0ZXIoJmluZm8tPnFkZXYpOworfQorCit2b2lkIHN5c2J1c19yZWdpc3Rlcl9kZXYoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIHN5c2J1c19pbml0Zm4gaW5pdCkKK3sKKyAgICBTeXNCdXNEZXZpY2VJbmZvICppbmZvOworCisgICAgaW5mbyA9IGdfbWFsbG9jMChzaXplb2YoKmluZm8pKTsKKyAgICBpbmZvLT5xZGV2Lm5hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgICBpbmZvLT5xZGV2LnNpemUgPSBzaXplOworICAgIGluZm8tPmluaXQgPSBpbml0OworICAgIHN5c2J1c19yZWdpc3Rlcl93aXRocHJvcChpbmZvKTsKK30KKworRGV2aWNlU3RhdGUgKnN5c2J1c19jcmVhdGVfdmFyYXJncyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgYWRkciwgLi4uKQoreworICAgIERldmljZVN0YXRlICpkZXY7CisgICAgU3lzQnVzRGV2aWNlICpzOworICAgIHZhX2xpc3QgdmE7CisgICAgcWVtdV9pcnEgaXJxOworICAgIGludCBuOworCisgICAgZGV2ID0gcWRldl9jcmVhdGUoTlVMTCwgbmFtZSk7CisgICAgcyA9IHN5c2J1c19mcm9tX3FkZXYoZGV2KTsKKyAgICBxZGV2X2luaXQoZGV2KTsKKyAgICBpZiAoYWRkciAhPSAoaHdhZGRyKS0xKSB7CisgICAgICAgIHN5c2J1c19tbWlvX21hcChzLCAwLCBhZGRyKTsKKyAgICB9CisgICAgdmFfc3RhcnQodmEsIGFkZHIpOworICAgIG4gPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlycSA9IHZhX2FyZyh2YSwgcWVtdV9pcnEpOworICAgICAgICBpZiAoIWlycSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3lzYnVzX2Nvbm5lY3RfaXJxKHMsIG4sIGlycSk7CisgICAgICAgIG4rKzsKKyAgICB9CisgICAgcmV0dXJuIGRldjsKK30KKwordm9pZCBzeXNidXNfZGV2X3ByaW50KE1vbml0b3IgKm1vbiwgRGV2aWNlU3RhdGUgKmRldiwgaW50IGluZGVudCkKK3sKKyAgICBTeXNCdXNEZXZpY2UgKnMgPSBzeXNidXNfZnJvbV9xZGV2KGRldik7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX21taW87IGkrKykgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIlKnNtbWlvICIgVEFSR0VUX0ZNVF9wbHggIi8iIFRBUkdFVF9GTVRfcGx4ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCwgIiIsIHMtPm1taW9baV0uYWRkciwgcy0+bW1pb1tpXS5zaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvdWJvb3RfaW1hZ2UuaCBiL2FuZHJvaWQvcWVtdTEvaHcvY29yZS91Ym9vdF9pbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzI3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2NvcmUvdWJvb3RfaW1hZ2UuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA1CisgKiBXb2xmZ2FuZyBEZW5rLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCB3ZEBkZW54LmRlLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdG8gVS1Cb290LiBJbmNsdWRpbmcKKyAqIHRoaXMgKHVubW9kaWZpZWQpIGhlYWRlciBmaWxlIGluIGFub3RoZXIgZmlsZSBpcyBjb25zaWRlcmVkIG5vcm1hbAorICogdXNlIG9mIFUtQm9vdCwgYW5kIGRvZXMgKm5vdCogZmFsbCB1bmRlciB0aGUgaGVhZGluZyBvZiAiZGVyaXZlZAorICogd29yayIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9fVUJPT1RfSU1BR0VfSF9fCisjZGVmaW5lIF9fVUJPT1RfSU1BR0VfSF9fCisKKy8qCisgKiBPcGVyYXRpbmcgU3lzdGVtIENvZGVzCisgKi8KKyNkZWZpbmUgSUhfT1NfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIE9TCSovCisjZGVmaW5lIElIX09TX09QRU5CU0QJCTEJLyogT3BlbkJTRAkqLworI2RlZmluZSBJSF9PU19ORVRCU0QJCTIJLyogTmV0QlNECSovCisjZGVmaW5lIElIX09TX0ZSRUVCU0QJCTMJLyogRnJlZUJTRAkqLworI2RlZmluZSBJSF9PU180XzRCU0QJCTQJLyogNC40QlNECSovCisjZGVmaW5lIElIX09TX0xJTlVYCQk1CS8qIExpbnV4CSovCisjZGVmaW5lIElIX09TX1NWUjQJCTYJLyogU1ZSNAkJKi8KKyNkZWZpbmUgSUhfT1NfRVNJWAkJNwkvKiBFc2l4CQkqLworI2RlZmluZSBJSF9PU19TT0xBUklTCQk4CS8qIFNvbGFyaXMJKi8KKyNkZWZpbmUgSUhfT1NfSVJJWAkJOQkvKiBJcml4CQkqLworI2RlZmluZSBJSF9PU19TQ08JCTEwCS8qIFNDTwkJKi8KKyNkZWZpbmUgSUhfT1NfREVMTAkJMTEJLyogRGVsbAkJKi8KKyNkZWZpbmUgSUhfT1NfTkNSCQkxMgkvKiBOQ1IJCSovCisjZGVmaW5lIElIX09TX0xZTlhPUwkJMTMJLyogTHlueE9TCSovCisjZGVmaW5lIElIX09TX1ZYV09SS1MJCTE0CS8qIFZ4V29ya3MJKi8KKyNkZWZpbmUgSUhfT1NfUFNPUwkJMTUJLyogcFNPUwkJKi8KKyNkZWZpbmUgSUhfT1NfUU5YCQkxNgkvKiBRTlgJCSovCisjZGVmaW5lIElIX09TX1VfQk9PVAkJMTcJLyogRmlybXdhcmUJKi8KKyNkZWZpbmUgSUhfT1NfUlRFTVMJCTE4CS8qIFJURU1TCSovCisjZGVmaW5lIElIX09TX0FSVE9TCQkxOQkvKiBBUlRPUwkqLworI2RlZmluZSBJSF9PU19VTklUWQkJMjAJLyogVW5pdHkgT1MJKi8KKworLyoKKyAqIENQVSBBcmNoaXRlY3R1cmUgQ29kZXMgKHN1cHBvcnRlZCBieSBMaW51eCkKKyAqLworI2RlZmluZSBJSF9DUFVfSU5WQUxJRAkJMAkvKiBJbnZhbGlkIENQVQkqLworI2RlZmluZSBJSF9DUFVfQUxQSEEJCTEJLyogQWxwaGEJKi8KKyNkZWZpbmUgSUhfQ1BVX0FSTQkJMgkvKiBBUk0JCSovCisjZGVmaW5lIElIX0NQVV9JMzg2CQkzCS8qIEludGVsIHg4NgkqLworI2RlZmluZSBJSF9DUFVfSUE2NAkJNAkvKiBJQTY0CQkqLworI2RlZmluZSBJSF9DUFVfTUlQUwkJNQkvKiBNSVBTCQkqLworI2RlZmluZSBJSF9DUFVfTUlQUzY0CQk2CS8qIE1JUFMJIDY0IEJpdCAqLworI2RlZmluZSBJSF9DUFVfUFBDCQk3CS8qIFBvd2VyUEMJKi8KKyNkZWZpbmUgSUhfQ1BVX1MzOTAJCTgJLyogSUJNIFMzOTAJKi8KKyNkZWZpbmUgSUhfQ1BVX1NICQk5CS8qIFN1cGVySAkqLworI2RlZmluZSBJSF9DUFVfU1BBUkMJCTEwCS8qIFNwYXJjCSovCisjZGVmaW5lIElIX0NQVV9TUEFSQzY0CQkxMQkvKiBTcGFyYyA2NCBCaXQgKi8KKyNkZWZpbmUgSUhfQ1BVX002OEsJCTEyCS8qIE02OEsJCSovCisjZGVmaW5lIElIX0NQVV9OSU9TCQkxMwkvKiBOaW9zLTMyCSovCisjZGVmaW5lIElIX0NQVV9NSUNST0JMQVpFCTE0CS8qIE1pY3JvQmxhemUgICAqLworI2RlZmluZSBJSF9DUFVfTklPUzIJCTE1CS8qIE5pb3MtSUkJKi8KKyNkZWZpbmUgSUhfQ1BVX0JMQUNLRklOCQkxNgkvKiBCbGFja2ZpbgkqLworI2RlZmluZSBJSF9DUFVfQVZSMzIJCTE3CS8qIEFWUjMyCSovCisKKy8qCisgKiBJbWFnZSBUeXBlcworICoKKyAqICJTdGFuZGFsb25lIFByb2dyYW1zIiBhcmUgZGlyZWN0bHkgcnVubmFibGUgaW4gdGhlIGVudmlyb25tZW50CisgKglwcm92aWRlZCBieSBVLUJvb3Q7IGl0IGlzIGV4cGVjdGVkIHRoYXQgKGlmIHRoZXkgYmVoYXZlCisgKgl3ZWxsKSB5b3UgY2FuIGNvbnRpbnVlIHRvIHdvcmsgaW4gVS1Cb290IGFmdGVyIHJldHVybiBmcm9tCisgKgl0aGUgU3RhbmRhbG9uZSBQcm9ncmFtLgorICogIk9TIEtlcm5lbCBJbWFnZXMiIGFyZSB1c3VhbGx5IGltYWdlcyBvZiBzb21lIEVtYmVkZGVkIE9TIHdoaWNoCisgKgl3aWxsIHRha2Ugb3ZlciBjb250cm9sIGNvbXBsZXRlbHkuIFVzdWFsbHkgdGhlc2UgcHJvZ3JhbXMKKyAqCXdpbGwgaW5zdGFsbCB0aGVpciBvd24gc2V0IG9mIGV4Y2VwdGlvbiBoYW5kbGVycywgZGV2aWNlCisgKglkcml2ZXJzLCBzZXQgdXAgdGhlIE1NVSwgZXRjLiAtIHRoaXMgbWVhbnMsIHRoYXQgeW91IGNhbm5vdAorICoJZXhwZWN0IHRvIHJlLWVudGVyIFUtQm9vdCBleGNlcHQgYnkgcmVzZXR0aW5nIHRoZSBDUFUuCisgKiAiUkFNRGlzayBJbWFnZXMiIGFyZSBtb3JlIG9yIGxlc3MganVzdCBkYXRhIGJsb2NrcywgYW5kIHRoZWlyCisgKglwYXJhbWV0ZXJzIChhZGRyZXNzLCBzaXplKSBhcmUgcGFzc2VkIHRvIGFuIE9TIGtlcm5lbCB0aGF0IGlzCisgKgliZWluZyBzdGFydGVkLgorICogIk11bHRpLUZpbGUgSW1hZ2VzIiBjb250YWluIHNldmVyYWwgaW1hZ2VzLCB0eXBpY2FsbHkgYW4gT1MKKyAqCShMaW51eCkga2VybmVsIGltYWdlIGFuZCBvbmUgb3IgbW9yZSBkYXRhIGltYWdlcyBsaWtlCisgKglSQU1EaXNrcy4gVGhpcyBjb25zdHJ1Y3QgaXMgdXNlZnVsIGZvciBpbnN0YW5jZSB3aGVuIHlvdSB3YW50CisgKgl0byBib290IG92ZXIgdGhlIG5ldHdvcmsgdXNpbmcgQk9PVFAgZXRjLiwgd2hlcmUgdGhlIGJvb3QKKyAqCXNlcnZlciBwcm92aWRlcyBqdXN0IGEgc2luZ2xlIGltYWdlIGZpbGUsIGJ1dCB5b3Ugd2FudCB0byBnZXQKKyAqCWZvciBpbnN0YW5jZSBhbiBPUyBrZXJuZWwgYW5kIGEgUkFNRGlzayBpbWFnZS4KKyAqCisgKgkiTXVsdGktRmlsZSBJbWFnZXMiIHN0YXJ0IHdpdGggYSBsaXN0IG9mIGltYWdlIHNpemVzLCBlYWNoCisgKglpbWFnZSBzaXplIChpbiBieXRlcykgc3BlY2lmaWVkIGJ5IGFuICJ1aW50MzJfdCIgaW4gbmV0d29yaworICoJYnl0ZSBvcmRlci4gVGhpcyBsaXN0IGlzIHRlcm1pbmF0ZWQgYnkgYW4gIih1aW50MzJfdCkwIi4KKyAqCUltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0ZXJtaW5hdGluZyAwIGZvbGxvdyB0aGUgaW1hZ2VzLCBvbmUgYnkKKyAqCW9uZSwgYWxsIGFsaWduZWQgb24gInVpbnQzMl90IiBib3VuZGFyaWVzIChzaXplIHJvdW5kZWQgdXAgdG8KKyAqCWEgbXVsdGlwbGUgb2YgNCBieXRlcyAtIGV4Y2VwdCBmb3IgdGhlIGxhc3QgZmlsZSkuCisgKgorICogIkZpcm13YXJlIEltYWdlcyIgYXJlIGJpbmFyeSBpbWFnZXMgY29udGFpbmluZyBmaXJtd2FyZSAobGlrZQorICoJVS1Cb290IG9yIEZQR0EgaW1hZ2VzKSB3aGljaCB1c3VhbGx5IHdpbGwgYmUgcHJvZ3JhbW1lZCB0bworICoJZmxhc2ggbWVtb3J5LgorICoKKyAqICJTY3JpcHQgZmlsZXMiIGFyZSBjb21tYW5kIHNlcXVlbmNlcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYnkKKyAqCVUtQm9vdCdzIGNvbW1hbmQgaW50ZXJwcmV0ZXI7IHRoaXMgZmVhdHVyZSBpcyBlc3BlY2lhbGx5CisgKgl1c2VmdWwgd2hlbiB5b3UgY29uZmlndXJlIFUtQm9vdCB0byB1c2UgYSByZWFsIHNoZWxsIChodXNoKQorICoJYXMgY29tbWFuZCBpbnRlcnByZXRlciAoPT4gU2hlbGwgU2NyaXB0cykuCisgKi8KKworI2RlZmluZSBJSF9UWVBFX0lOVkFMSUQJCTAJLyogSW52YWxpZCBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TVEFOREFMT05FCTEJLyogU3RhbmRhbG9uZSBQcm9ncmFtCQkqLworI2RlZmluZSBJSF9UWVBFX0tFUk5FTAkJMgkvKiBPUyBLZXJuZWwgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfUkFNRElTSwkJMwkvKiBSQU1EaXNrIEltYWdlCQkqLworI2RlZmluZSBJSF9UWVBFX01VTFRJCQk0CS8qIE11bHRpLUZpbGUgSW1hZ2UJCSovCisjZGVmaW5lIElIX1RZUEVfRklSTVdBUkUJNQkvKiBGaXJtd2FyZSBJbWFnZQkJKi8KKyNkZWZpbmUgSUhfVFlQRV9TQ1JJUFQJCTYJLyogU2NyaXB0IGZpbGUJCQkqLworI2RlZmluZSBJSF9UWVBFX0ZJTEVTWVNURU0JNwkvKiBGaWxlc3lzdGVtIEltYWdlIChhbnkgdHlwZSkJKi8KKyNkZWZpbmUgSUhfVFlQRV9GTEFURFQJCTgJLyogQmluYXJ5IEZsYXQgRGV2aWNlIFRyZWUgQmxvYgkqLworCisvKgorICogQ29tcHJlc3Npb24gVHlwZXMKKyAqLworI2RlZmluZSBJSF9DT01QX05PTkUJCTAJLyogIE5vCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfR1pJUAkJMQkvKiBnemlwCSBDb21wcmVzc2lvbiBVc2VkCSovCisjZGVmaW5lIElIX0NPTVBfQlpJUDIJCTIJLyogYnppcDIgQ29tcHJlc3Npb24gVXNlZAkqLworCisjZGVmaW5lIElIX01BR0lDCTB4MjcwNTE5NTYJLyogSW1hZ2UgTWFnaWMgTnVtYmVyCQkqLworI2RlZmluZSBJSF9OTUxFTgkJMzIJLyogSW1hZ2UgTmFtZSBMZW5ndGgJCSovCisKKy8qCisgKiBhbGwgZGF0YSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKGFrYSBuYXR1cmFsIGFrYSBiaWdlbmRpYW4pCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgdWJvb3RfaW1hZ2VfaGVhZGVyIHsKKwl1aW50MzJfdAlpaF9tYWdpYzsJLyogSW1hZ2UgSGVhZGVyIE1hZ2ljIE51bWJlcgkqLworCXVpbnQzMl90CWloX2hjcmM7CS8qIEltYWdlIEhlYWRlciBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50MzJfdAlpaF90aW1lOwkvKiBJbWFnZSBDcmVhdGlvbiBUaW1lc3RhbXAJKi8KKwl1aW50MzJfdAlpaF9zaXplOwkvKiBJbWFnZSBEYXRhIFNpemUJCSovCisJdWludDMyX3QJaWhfbG9hZDsJLyogRGF0YQkgTG9hZCAgQWRkcmVzcwkJKi8KKwl1aW50MzJfdAlpaF9lcDsJCS8qIEVudHJ5IFBvaW50IEFkZHJlc3MJCSovCisJdWludDMyX3QJaWhfZGNyYzsJLyogSW1hZ2UgRGF0YSBDUkMgQ2hlY2tzdW0JKi8KKwl1aW50OF90CQlpaF9vczsJCS8qIE9wZXJhdGluZyBTeXN0ZW0JCSovCisJdWludDhfdAkJaWhfYXJjaDsJLyogQ1BVIGFyY2hpdGVjdHVyZQkJKi8KKwl1aW50OF90CQlpaF90eXBlOwkvKiBJbWFnZSBUeXBlCQkJKi8KKwl1aW50OF90CQlpaF9jb21wOwkvKiBDb21wcmVzc2lvbiBUeXBlCQkqLworCXVpbnQ4X3QJCWloX25hbWVbSUhfTk1MRU5dOwkvKiBJbWFnZSBOYW1lCQkqLworfSB1Ym9vdF9pbWFnZV9oZWFkZXJfdDsKKworCisjZW5kaWYJLyogX19JTUFHRV9IX18gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvaTM4Ni9wYy5jIGIvYW5kcm9pZC9xZW11MS9ody9pMzg2L3BjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxODU2MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvaTM4Ni9wYy5jCkBAIC0wLDAgKzEsMTMzMiBAQAorLyoKKyAqIFFFTVUgUEMgU3lzdGVtIEVtdWxhdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAiaHcvbG9hZGVyLmgiCisjaW5jbHVkZSAiaHcvcGNpL3BjaS5oIgorI2luY2x1ZGUgImV4ZWMvcmFtX2FkZHIuaCIKKyNpbmNsdWRlICJibG9jay9ibG9jay5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJzeXNlbXUvYmxvY2tkZXYuaCIKKyNpbmNsdWRlICJhdWRpby9hdWRpby5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKy8vI2luY2x1ZGUgInNtYnVzLmgiCisjaW5jbHVkZSAiaHcvYm9hcmRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9nbG9iYWxzLmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAiaHcvbnZyYW0vZndfY2ZnLmgiCisvLyNpbmNsdWRlICJocGV0X2VtdWwuaCIKKyNpbmNsdWRlICJzeXNlbXUvd2F0Y2hkb2cuaCIKKyNpbmNsdWRlICJody9pMzg2L3NtYmlvcy5oIgorI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKKworI2luY2x1ZGUgImh3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmgiCisKK2NoYXIqIGF1ZGlvX2lucHV0X3NvdXJjZSA9IE5VTEw7CisvKiBvdXRwdXQgQm9jaHMgYmlvcyBpbmZvIG1lc3NhZ2VzICovCisvLyNkZWZpbmUgREVCVUdfQklPUworCisjZGVmaW5lIEJJT1NfRklMRU5BTUUgImJpb3MuYmluIgorI2RlZmluZSBWR0FCSU9TX0ZJTEVOQU1FICJ2Z2FiaW9zLmJpbiIKKyNkZWZpbmUgVkdBQklPU19DSVJSVVNfRklMRU5BTUUgInZnYWJpb3MtY2lycnVzLmJpbiIKKworI2RlZmluZSBQQ19NQVhfQklPU19TSVpFICg0ICogMTAyNCAqIDEwMjQpCisKKy8qIExlYXZlIGEgY2h1bmsgb2YgbWVtb3J5IGF0IHRoZSB0b3Agb2YgUkFNIGZvciB0aGUgQklPUyBBQ1BJIHRhYmxlcy4gICovCisjZGVmaW5lIEFDUElfREFUQV9TSVpFICAgICAgIDB4MTAwMDAKKyNkZWZpbmUgQklPU19DRkdfSU9QT1JUIDB4NTEwCisjZGVmaW5lIEZXX0NGR19BQ1BJX1RBQkxFUyAoRldfQ0ZHX0FSQ0hfTE9DQUwgKyAwKQorI2RlZmluZSBGV19DRkdfU01CSU9TX0VOVFJJRVMgKEZXX0NGR19BUkNIX0xPQ0FMICsgMSkKKworI2RlZmluZSBNQVhfSURFX0JVUyAyCisjaWZuZGVmIENPTkZJR19BTkRST0lECitzdGF0aWMgZmRjdHJsX3QgKmZsb3BweV9jb250cm9sbGVyOworI2VuZGlmCitzdGF0aWMgUlRDU3RhdGUgKnJ0Y19zdGF0ZTsKK3N0YXRpYyBQSVRTdGF0ZSAqcGl0Oworc3RhdGljIElPQVBJQ1N0YXRlICppb2FwaWM7CitzdGF0aWMgUENJRGV2aWNlICppNDQwZnhfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHJvbV9yZXNldF9kYXRhIHsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGh3YWRkciBhZGRyOworICAgIHVuc2lnbmVkIHNpemU7Cit9IFJvbVJlc2V0RGF0YTsKKworc3RhdGljIHZvaWQgb3B0aW9uX3JvbV9yZXNldCh2b2lkICpfcnJkKQoreworICAgIFJvbVJlc2V0RGF0YSAqcnJkID0gX3JyZDsKKworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfd3JpdGVfcm9tKHJyZC0+YWRkciwgcnJkLT5kYXRhLCBycmQtPnNpemUpOworfQorCitzdGF0aWMgdm9pZCBvcHRpb25fcm9tX3NldHVwX3Jlc2V0KGh3YWRkciBhZGRyLCB1bnNpZ25lZCBzaXplKQoreworICAgIFJvbVJlc2V0RGF0YSAqcnJkID0gZ19tYWxsb2Moc2l6ZW9mICpycmQpOworCisgICAgcnJkLT5kYXRhID0gZ19tYWxsb2Moc2l6ZSk7CisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9yZWFkKGFkZHIsIHJyZC0+ZGF0YSwgc2l6ZSk7CisgICAgcnJkLT5hZGRyID0gYWRkcjsKKyAgICBycmQtPnNpemUgPSBzaXplOworICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQob3B0aW9uX3JvbV9yZXNldCwgMCwgcnJkKTsKK30KKworc3RhdGljIHZvaWQgaW9wb3J0ODBfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBkYXRhKQoreworfQorCisvKiBNU0RPUyBjb21wYXRpYmlsaXR5IG1vZGUgRlBVIGV4Y2VwdGlvbiBzdXBwb3J0ICovCitzdGF0aWMgcWVtdV9pcnEgZmVycl9pcnE7CisvKiBYWFg6IGFkZCBJR05ORSBzdXBwb3J0ICovCit2b2lkIGNwdV9zZXRfZmVycihDUFVYODZTdGF0ZSAqcykKK3sKKyAgICBxZW11X2lycV9yYWlzZShmZXJyX2lycSk7Cit9CisKK3N0YXRpYyB2b2lkIGlvcG9ydEYwX3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSkKK3sKKyAgICBxZW11X2lycV9sb3dlcihmZXJyX2lycSk7Cit9CisKKy8qIFRTQyBoYW5kbGluZyAqLwordWludDY0X3QgY3B1X2dldF90c2MoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gY3B1X2dldF90aWNrcygpOworfQorCisvKiBTTU0gc3VwcG9ydCAqLwordm9pZCBjcHVfc21tX3VwZGF0ZShDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIGlmIChpNDQwZnhfc3RhdGUgJiYgRU5WX0dFVF9DUFUoZW52KSA9PSBmaXJzdF9jcHUpCisgICAgICAgIGk0NDBmeF9zZXRfc21tKGk0NDBmeF9zdGF0ZSwgKGVudi0+aGZsYWdzID4+IEhGX1NNTV9TSElGVCkgJiAxKTsKK30KKworCisvKiBJUlEgaGFuZGxpbmcgKi8KK2ludCBjcHVfZ2V0X3BpY19pbnRlcnJ1cHQoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBpbnQgaW50bm87CisKKyAgICBpbnRubyA9IGFwaWNfZ2V0X2ludGVycnVwdChlbnYpOworICAgIGlmIChpbnRubyA+PSAwKSB7CisgICAgICAgIC8qIHNldCBpcnEgcmVxdWVzdCBpZiBhIFBJQyBpcnEgaXMgc3RpbGwgcGVuZGluZyAqLworICAgICAgICAvKiBYWFg6IGltcHJvdmUgdGhhdCAqLworICAgICAgICBwaWNfdXBkYXRlX2lycShpc2FfcGljKTsKKyAgICAgICAgcmV0dXJuIGludG5vOworICAgIH0KKyAgICAvKiByZWFkIHRoZSBpcnEgZnJvbSB0aGUgUElDICovCisgICAgaWYgKCFhcGljX2FjY2VwdF9waWNfaW50cihlbnYpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpbnRubyA9IHBpY19yZWFkX2lycShpc2FfcGljKTsKKyAgICByZXR1cm4gaW50bm87Cit9CisKK3N0YXRpYyB2b2lkIHBpY19pcnFfcmVxdWVzdCh2b2lkICpvcGFxdWUsIGludCBpcnEsIGludCBsZXZlbCkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1ID0gZmlyc3RfY3B1OworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisgICAgaWYgKGVudi0+YXBpY19zdGF0ZSkgeworICAgICAgICB3aGlsZSAoY3B1KSB7CisgICAgICAgICAgICBpZiAoYXBpY19hY2NlcHRfcGljX2ludHIoZW52KSkKKyAgICAgICAgICAgICAgICBhcGljX2RlbGl2ZXJfcGljX2ludHIoZW52LCBsZXZlbCk7CisgICAgICAgICAgICBjcHUgPSBRVEFJTFFfTkVYVChjcHUsIG5vZGUpOworICAgICAgICAgICAgZW52ID0gY3B1ID8gY3B1LT5lbnZfcHRyIDogTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsZXZlbCkKKyAgICAgICAgICAgIGNwdV9pbnRlcnJ1cHQoY3B1LCBDUFVfSU5URVJSVVBUX0hBUkQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcHVfcmVzZXRfaW50ZXJydXB0KGNwdSwgQ1BVX0lOVEVSUlVQVF9IQVJEKTsKKyAgICB9Cit9CisKKy8qIFBDIGNtb3MgbWFwcGluZ3MgKi8KKworI2RlZmluZSBSRUdfRVFVSVBNRU5UX0JZVEUgICAgICAgICAgMHgxNAorCisjaWZuZGVmIENPTkZJR19BTkRST0lECitzdGF0aWMgaW50IGNtb3NfZ2V0X2ZkX2RyaXZlX3R5cGUoaW50IGZkMCkKK3sKKyAgICBpbnQgdmFsOworCisgICAgc3dpdGNoIChmZDApIHsKKyAgICBjYXNlIDA6CisgICAgICAgIC8qIDEuNDQgTWIgMyI1IGRyaXZlICovCisgICAgICAgIHZhbCA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgLyogMi44OCBNYiAzIjUgZHJpdmUgKi8KKyAgICAgICAgdmFsID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAvKiAxLjIgTWIgNSI1IGRyaXZlICovCisgICAgICAgIHZhbCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNtb3NfaW5pdF9oZChpbnQgdHlwZV9vZnMsIGludCBpbmZvX29mcywgQmxvY2tEcml2ZXJTdGF0ZSAqaGQpCit7CisgICAgUlRDU3RhdGUgKnMgPSBydGNfc3RhdGU7CisgICAgaW50IGN5bGluZGVycywgaGVhZHMsIHNlY3RvcnM7CisgICAgYmRydl9nZXRfZ2VvbWV0cnlfaGludChoZCwgJmN5bGluZGVycywgJmhlYWRzLCAmc2VjdG9ycyk7CisgICAgcnRjX3NldF9tZW1vcnkocywgdHlwZV9vZnMsIDQ3KTsKKyAgICBydGNfc2V0X21lbW9yeShzLCBpbmZvX29mcywgY3lsaW5kZXJzKTsKKyAgICBydGNfc2V0X21lbW9yeShzLCBpbmZvX29mcyArIDEsIGN5bGluZGVycyA+PiA4KTsKKyAgICBydGNfc2V0X21lbW9yeShzLCBpbmZvX29mcyArIDIsIGhlYWRzKTsKKyAgICBydGNfc2V0X21lbW9yeShzLCBpbmZvX29mcyArIDMsIDB4ZmYpOworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIGluZm9fb2ZzICsgNCwgMHhmZik7CisgICAgcnRjX3NldF9tZW1vcnkocywgaW5mb19vZnMgKyA1LCAweGMwIHwgKChoZWFkcyA+IDgpIDw8IDMpKTsKKyAgICBydGNfc2V0X21lbW9yeShzLCBpbmZvX29mcyArIDYsIGN5bGluZGVycyk7CisgICAgcnRjX3NldF9tZW1vcnkocywgaW5mb19vZnMgKyA3LCBjeWxpbmRlcnMgPj4gOCk7CisgICAgcnRjX3NldF9tZW1vcnkocywgaW5mb19vZnMgKyA4LCBzZWN0b3JzKTsKK30KKworLyogY29udmVydCBib290X2RldmljZSBsZXR0ZXIgdG8gc29tZXRoaW5nIHJlY29nbml6YWJsZSBieSB0aGUgYmlvcyAqLworc3RhdGljIGludCBib290X2RldmljZTJuaWJibGUoY2hhciBib290X2RldmljZSkKK3sKKyAgICBzd2l0Y2goYm9vdF9kZXZpY2UpIHsKKyAgICBjYXNlICdhJzoKKyAgICBjYXNlICdiJzoKKyAgICAgICAgcmV0dXJuIDB4MDE7IC8qIGZsb3BweSBib290ICovCisgICAgY2FzZSAnYyc6CisgICAgICAgIHJldHVybiAweDAyOyAvKiBoYXJkIGRyaXZlIGJvb3QgKi8KKyAgICBjYXNlICdkJzoKKyAgICAgICAgcmV0dXJuIDB4MDM7IC8qIENELVJPTSBib290ICovCisgICAgY2FzZSAnbic6CisgICAgICAgIHJldHVybiAweDA0OyAvKiBOZXR3b3JrIGJvb3QgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGNvcHkvcGFzdGVkIGZyb20gY21vc19pbml0LCBzaG91bGQgYmUgbWFkZSBhIGdlbmVyYWwgZnVuY3Rpb24KKyBhbmQgdXNlZCB0aGVyZSBhcyB3ZWxsICovCitzdGF0aWMgaW50IHBjX2Jvb3Rfc2V0KHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqYm9vdF9kZXZpY2UpCit7CisgICAgTW9uaXRvciAqbW9uID0gY3VyX21vbjsKKyNkZWZpbmUgUENfTUFYX0JPT1RfREVWSUNFUyAzCisgICAgUlRDU3RhdGUgKnMgPSAoUlRDU3RhdGUgKilvcGFxdWU7CisgICAgaW50IG5iZHMsIGJkc1szXSA9IHsgMCwgfTsKKyAgICBpbnQgaTsKKworICAgIG5iZHMgPSBzdHJsZW4oYm9vdF9kZXZpY2UpOworICAgIGlmIChuYmRzID4gUENfTUFYX0JPT1RfREVWSUNFUykgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJUb28gbWFueSBib290IGRldmljZXMgZm9yIFBDXG4iKTsKKyAgICAgICAgcmV0dXJuKDEpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJkczsgaSsrKSB7CisgICAgICAgIGJkc1tpXSA9IGJvb3RfZGV2aWNlMm5pYmJsZShib290X2RldmljZVtpXSk7CisgICAgICAgIGlmIChiZHNbaV0gPT0gMCkgeworICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiSW52YWxpZCBib290IGRldmljZSBmb3IgUEM6ICclYydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib290X2RldmljZVtpXSk7CisgICAgICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcnRjX3NldF9tZW1vcnkocywgMHgzZCwgKGJkc1sxXSA8PCA0KSB8IGJkc1swXSk7CisgICAgcnRjX3NldF9tZW1vcnkocywgMHgzOCwgKGJkc1syXSA8PCA0KSk7CisgICAgcmV0dXJuKDApOworfQorCisvKiBoZF90YWJsZSBtdXN0IGNvbnRhaW4gNCBibG9jayBkcml2ZXJzICovCitzdGF0aWMgdm9pZCBjbW9zX2luaXQocmFtX2FkZHJfdCByYW1fc2l6ZSwgcmFtX2FkZHJfdCBhYm92ZV80Z19tZW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib290X2RldmljZSwgQmxvY2tEcml2ZXJTdGF0ZSAqKmhkX3RhYmxlKQoreworICAgIFJUQ1N0YXRlICpzID0gcnRjX3N0YXRlOworICAgIGludCBuYmRzLCBiZHNbM10gPSB7IDAsIH07CisgICAgaW50IHZhbDsKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBpbnQgZmQwLCBmZDEsIG5iOworI2VuZGlmCisgICAgaW50IGk7CisKKyAgICAvKiB2YXJpb3VzIGltcG9ydGFudCBDTU9TIGxvY2F0aW9ucyBuZWVkZWQgYnkgUEMvQm9jaHMgYmlvcyAqLworCisgICAgLyogbWVtb3J5IHNpemUgKi8KKyAgICB2YWwgPSA2NDA7IC8qIGJhc2UgbWVtb3J5IGluIEsgKi8KKyAgICBydGNfc2V0X21lbW9yeShzLCAweDE1LCB2YWwpOworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MTYsIHZhbCA+PiA4KTsKKworICAgIHZhbCA9IChyYW1fc2l6ZSAvIDEwMjQpIC0gMTAyNDsKKyAgICBpZiAodmFsID4gNjU1MzUpCisgICAgICAgIHZhbCA9IDY1NTM1OworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MTcsIHZhbCk7CisgICAgcnRjX3NldF9tZW1vcnkocywgMHgxOCwgdmFsID4+IDgpOworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MzAsIHZhbCk7CisgICAgcnRjX3NldF9tZW1vcnkocywgMHgzMSwgdmFsID4+IDgpOworCisgICAgaWYgKGFib3ZlXzRnX21lbV9zaXplKSB7CisgICAgICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4NWIsICh1bnNpZ25lZCBpbnQpYWJvdmVfNGdfbWVtX3NpemUgPj4gMTYpOworICAgICAgICBydGNfc2V0X21lbW9yeShzLCAweDVjLCAodW5zaWduZWQgaW50KWFib3ZlXzRnX21lbV9zaXplID4+IDI0KTsKKyAgICAgICAgcnRjX3NldF9tZW1vcnkocywgMHg1ZCwgKHVpbnQ2NF90KWFib3ZlXzRnX21lbV9zaXplID4+IDMyKTsKKyAgICB9CisKKyAgICBpZiAocmFtX3NpemUgPiAoMTYgKiAxMDI0ICogMTAyNCkpCisgICAgICAgIHZhbCA9IChyYW1fc2l6ZSAvIDY1NTM2KSAtICgoMTYgKiAxMDI0ICogMTAyNCkgLyA2NTUzNik7CisgICAgZWxzZQorICAgICAgICB2YWwgPSAwOworICAgIGlmICh2YWwgPiA2NTUzNSkKKyAgICAgICAgdmFsID0gNjU1MzU7CisgICAgcnRjX3NldF9tZW1vcnkocywgMHgzNCwgdmFsKTsKKyAgICBydGNfc2V0X21lbW9yeShzLCAweDM1LCB2YWwgPj4gOCk7CisKKyAgICAvKiBzZXQgdGhlIG51bWJlciBvZiBDUFUgKi8KKyAgICBydGNfc2V0X21lbW9yeShzLCAweDVmLCBzbXBfY3B1cyAtIDEpOworCisgICAgLyogc2V0IGJvb3QgZGV2aWNlcywgYW5kIGRpc2FibGUgZmxvcHB5IHNpZ25hdHVyZSBjaGVjayBpZiByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgUENfTUFYX0JPT1RfREVWSUNFUyAzCisgICAgbmJkcyA9IHN0cmxlbihib290X2RldmljZSk7CisgICAgaWYgKG5iZHMgPiBQQ19NQVhfQk9PVF9ERVZJQ0VTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgYm9vdCBkZXZpY2VzIGZvciBQQ1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuYmRzOyBpKyspIHsKKyAgICAgICAgYmRzW2ldID0gYm9vdF9kZXZpY2UybmliYmxlKGJvb3RfZGV2aWNlW2ldKTsKKyAgICAgICAgaWYgKGJkc1tpXSA9PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYm9vdCBkZXZpY2UgZm9yIFBDOiAnJWMnXG4iLAorICAgICAgICAgICAgICAgICAgICBib290X2RldmljZVtpXSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4M2QsIChiZHNbMV0gPDwgNCkgfCBiZHNbMF0pOworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MzgsIChiZHNbMl0gPDwgNCkgfCAoZmRfYm9vdGNoayA/ICAweDAgOiAweDEpKTsKKworICAgIC8qIGZsb3BweSB0eXBlICovCisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBmZDAgPSBmZGN0cmxfZ2V0X2RyaXZlX3R5cGUoZmxvcHB5X2NvbnRyb2xsZXIsIDApOworICAgIGZkMSA9IGZkY3RybF9nZXRfZHJpdmVfdHlwZShmbG9wcHlfY29udHJvbGxlciwgMSk7CisKKyAgICB2YWwgPSAoY21vc19nZXRfZmRfZHJpdmVfdHlwZShmZDApIDw8IDQpIHwgY21vc19nZXRfZmRfZHJpdmVfdHlwZShmZDEpOworICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MTAsIHZhbCk7CisKKyAgICB2YWwgPSAwOworICAgIG5iID0gMDsKKyAgICBpZiAoZmQwIDwgMykKKyAgICAgICAgbmIrKzsKKyAgICBpZiAoZmQxIDwgMykKKyAgICAgICAgbmIrKzsKKyAgICBzd2l0Y2ggKG5iKSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHZhbCB8PSAweDAxOyAvKiAxIGRyaXZlLCByZWFkeSBmb3IgYm9vdCAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZhbCB8PSAweDQxOyAvKiAyIGRyaXZlcywgcmVhZHkgZm9yIGJvb3QgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHZhbCB8PSAweDAyOyAvKiBGUFUgaXMgdGhlcmUgKi8KKyAgICB2YWwgfD0gMHgwNDsgLyogUFMvMiBtb3VzZSBpbnN0YWxsZWQgKi8KKyAgICBydGNfc2V0X21lbW9yeShzLCBSRUdfRVFVSVBNRU5UX0JZVEUsIHZhbCk7CisjZW5kaWYKKworICAgIC8qIGhhcmQgZHJpdmVzICovCisKKyAgICBydGNfc2V0X21lbW9yeShzLCAweDEyLCAoaGRfdGFibGVbMF0gPyAweGYwIDogMCkgfCAoaGRfdGFibGVbMV0gPyAweDBmIDogMCkpOworICAgIGlmIChoZF90YWJsZVswXSkKKyAgICAgICAgY21vc19pbml0X2hkKDB4MTksIDB4MWIsIGhkX3RhYmxlWzBdKTsKKyAgICBpZiAoaGRfdGFibGVbMV0pCisgICAgICAgIGNtb3NfaW5pdF9oZCgweDFhLCAweDI0LCBoZF90YWJsZVsxXSk7CisKKyAgICB2YWwgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKGhkX3RhYmxlW2ldKSB7CisgICAgICAgICAgICBpbnQgY3lsaW5kZXJzLCBoZWFkcywgc2VjdG9ycywgdHJhbnNsYXRpb247CisgICAgICAgICAgICAvKiBOT1RFOiBiZHJ2X2dldF9nZW9tZXRyeV9oaW50KCkgcmV0dXJucyB0aGUgcGh5c2ljYWwKKyAgICAgICAgICAgICAgICBnZW9tZXRyeS4gIEl0IGlzIGFsd2F5cyBzdWNoIHRoYXQ6IDEgPD0gc2VjdHMgPD0gNjMsIDEKKyAgICAgICAgICAgICAgICA8PSBoZWFkcyA8PSAxNiwgMSA8PSBjeWxpbmRlcnMgPD0gMTYzODMuIFRoZSBCSU9TCisgICAgICAgICAgICAgICAgZ2VvbWV0cnkgY2FuIGJlIGRpZmZlcmVudCBpZiBhIHRyYW5zbGF0aW9uIGlzIGRvbmUuICovCisgICAgICAgICAgICB0cmFuc2xhdGlvbiA9IGJkcnZfZ2V0X3RyYW5zbGF0aW9uX2hpbnQoaGRfdGFibGVbaV0pOworICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uID09IEJJT1NfQVRBX1RSQU5TTEFUSU9OX0FVVE8pIHsKKyAgICAgICAgICAgICAgICBiZHJ2X2dldF9nZW9tZXRyeV9oaW50KGhkX3RhYmxlW2ldLCAmY3lsaW5kZXJzLCAmaGVhZHMsICZzZWN0b3JzKTsKKyAgICAgICAgICAgICAgICBpZiAoY3lsaW5kZXJzIDw9IDEwMjQgJiYgaGVhZHMgPD0gMTYgJiYgc2VjdG9ycyA8PSA2MykgeworICAgICAgICAgICAgICAgICAgICAvKiBObyB0cmFuc2xhdGlvbi4gKi8KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIExCQSB0cmFuc2xhdGlvbi4gKi8KKyAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCB8PSB0cmFuc2xhdGlvbiA8PCAoaSAqIDIpOworICAgICAgICB9CisgICAgfQorICAgIHJ0Y19zZXRfbWVtb3J5KHMsIDB4MzksIHZhbCk7Cit9CisKK3ZvaWQgaW9wb3J0X3NldF9hMjAoaW50IGVuYWJsZSkKK3sKKyAgICAvKiBYWFg6IHNlbmQgdG8gYWxsIENQVXMgPyAqLworICAgIGNwdV94ODZfc2V0X2EyMChmaXJzdF9jcHUtPmVudl9wdHIsIGVuYWJsZSk7Cit9CisKK2ludCBpb3BvcnRfZ2V0X2EyMCh2b2lkKQoreworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gZmlyc3RfY3B1LT5lbnZfcHRyOworICAgIHJldHVybiAoZW52LT5hMjBfbWFzayA+PiAyMCkgJiAxOworfQorCitzdGF0aWMgdm9pZCBpb3BvcnQ5Ml93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBpb3BvcnRfc2V0X2EyMCgodmFsID4+IDEpICYgMSk7CisgICAgLyogWFhYOiBiaXQgMCBpcyBmYXN0IHJlc2V0ICovCit9CisKK3N0YXRpYyB1aW50MzJfdCBpb3BvcnQ5Ml9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcikKK3sKKyAgICByZXR1cm4gaW9wb3J0X2dldF9hMjAoKSA8PCAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCb2NocyBCSU9TIGRlYnVnIHBvcnRzICovCisKK3N0YXRpYyB2b2lkIGJvY2hzX2Jpb3Nfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgc2h1dGRvd25fc3RyWzhdID0gIlNodXRkb3duIjsKKyAgICBzdGF0aWMgaW50IHNodXRkb3duX2luZGV4ID0gMDsKKworICAgIHN3aXRjaChhZGRyKSB7CisgICAgICAgIC8qIEJvY2hzIEJJT1MgbWVzc2FnZXMgKi8KKyAgICBjYXNlIDB4NDAwOgorICAgIGNhc2UgMHg0MDE6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQklPUyBwYW5pYyBhdCByb21iaW9zLmMsIGxpbmUgJWRcbiIsIHZhbCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgY2FzZSAweDQwMjoKKyAgICBjYXNlIDB4NDAzOgorI2lmZGVmIERFQlVHX0JJT1MKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyIsIHZhbCk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDg5MDA6CisgICAgICAgIC8qIHNhbWUgYXMgQm9jaHMgcG93ZXIgb2ZmICovCisgICAgICAgIGlmICh2YWwgPT0gc2h1dGRvd25fc3RyW3NodXRkb3duX2luZGV4XSkgeworICAgICAgICAgICAgc2h1dGRvd25faW5kZXgrKzsKKyAgICAgICAgICAgIGlmIChzaHV0ZG93bl9pbmRleCA9PSA4KSB7CisgICAgICAgICAgICAgICAgc2h1dGRvd25faW5kZXggPSAwOworICAgICAgICAgICAgICAgIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNodXRkb3duX2luZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKiBMR1BMJ2VkIFZHQSBCSU9TIG1lc3NhZ2VzICovCisgICAgY2FzZSAweDUwMToKKyAgICBjYXNlIDB4NTAyOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlZHQSBCSU9TIHBhbmljLCBsaW5lICVkXG4iLCB2YWwpOworICAgICAgICBleGl0KDEpOworICAgIGNhc2UgMHg1MDA6CisgICAgY2FzZSAweDUwMzoKKyNpZmRlZiBERUJVR19CSU9TCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWMiLCB2YWwpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworZXh0ZXJuIHVpbnQ2NF90IG5vZGVfY3B1bWFza1tNQVhfTk9ERVNdOworCitzdGF0aWMgdm9pZCBib2Noc19iaW9zX2luaXQodm9pZCkKK3sKKyAgICB2b2lkICpmd19jZmc7CisgICAgdWludDhfdCAqc21iaW9zX3RhYmxlOworICAgIHNpemVfdCBzbWJpb3NfbGVuOworICAgIHVpbnQ2NF90ICpudW1hX2Z3X2NmZzsKKyAgICBpbnQgaSwgajsKKworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSgweDQwMCwgMSwgMiwgYm9jaHNfYmlvc193cml0ZSwgTlVMTCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKDB4NDAxLCAxLCAyLCBib2Noc19iaW9zX3dyaXRlLCBOVUxMKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHg0MDIsIDEsIDEsIGJvY2hzX2Jpb3Nfd3JpdGUsIE5VTEwpOworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSgweDQwMywgMSwgMSwgYm9jaHNfYmlvc193cml0ZSwgTlVMTCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKDB4ODkwMCwgMSwgMSwgYm9jaHNfYmlvc193cml0ZSwgTlVMTCk7CisKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHg1MDEsIDEsIDIsIGJvY2hzX2Jpb3Nfd3JpdGUsIE5VTEwpOworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSgweDUwMiwgMSwgMiwgYm9jaHNfYmlvc193cml0ZSwgTlVMTCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKDB4NTAwLCAxLCAxLCBib2Noc19iaW9zX3dyaXRlLCBOVUxMKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHg1MDMsIDEsIDEsIGJvY2hzX2Jpb3Nfd3JpdGUsIE5VTEwpOworCisgICAgZndfY2ZnID0gZndfY2ZnX2luaXQoQklPU19DRkdfSU9QT1JULCBCSU9TX0NGR19JT1BPUlQgKyAxLCAwLCAwKTsKKyAgICBmd19jZmdfYWRkX2kzMihmd19jZmcsIEZXX0NGR19JRCwgMSk7CisgICAgZndfY2ZnX2FkZF9pNjQoZndfY2ZnLCBGV19DRkdfUkFNX1NJWkUsICh1aW50NjRfdClyYW1fc2l6ZSk7CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgZndfY2ZnX2FkZF9ieXRlcyhmd19jZmcsIEZXX0NGR19BQ1BJX1RBQkxFUywgKHVpbnQ4X3QgKilhY3BpX3RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgIGFjcGlfdGFibGVzX2xlbik7CisjZW5kaWYKKyAgICBzbWJpb3NfdGFibGUgPSBzbWJpb3NfZ2V0X3RhYmxlKCZzbWJpb3NfbGVuKTsKKyAgICBpZiAoc21iaW9zX3RhYmxlKQorICAgICAgICBmd19jZmdfYWRkX2J5dGVzKGZ3X2NmZywgRldfQ0ZHX1NNQklPU19FTlRSSUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNtYmlvc190YWJsZSwgc21iaW9zX2xlbik7CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBOVU1BIGNoYW5uZWw6IG9uZSAoNjRiaXQpIHdvcmQgZm9yIHRoZSBudW1iZXIKKyAgICAgKiBvZiBub2Rlcywgb25lIHdvcmQgZm9yIGVhY2ggVkNQVS0+bm9kZSBhbmQgb25lIHdvcmQgZm9yIGVhY2ggbm9kZSB0bworICAgICAqIGhvbGQgdGhlIGFtb3VudCBvZiBtZW1vcnkuCisgICAgICovCisgICAgbnVtYV9md19jZmcgPSBnX21hbGxvYzAoKDEgKyBzbXBfY3B1cyArIG5iX251bWFfbm9kZXMpICogOCk7CisgICAgbnVtYV9md19jZmdbMF0gPSBjcHVfdG9fbGU2NChuYl9udW1hX25vZGVzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc21wX2NwdXM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfbnVtYV9ub2RlczsgaisrKSB7CisgICAgICAgICAgICBpZiAobm9kZV9jcHVtYXNrW2pdICYgKDEgPDwgaSkpIHsKKyAgICAgICAgICAgICAgICBudW1hX2Z3X2NmZ1tpICsgMV0gPSBjcHVfdG9fbGU2NChqKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfbnVtYV9ub2RlczsgaSsrKSB7CisgICAgICAgIG51bWFfZndfY2ZnW3NtcF9jcHVzICsgMSArIGldID0gY3B1X3RvX2xlNjQobm9kZV9tZW1baV0pOworICAgIH0KKyAgICBmd19jZmdfYWRkX2J5dGVzKGZ3X2NmZywgRldfQ0ZHX05VTUEsICh1aW50OF90ICopbnVtYV9md19jZmcsCisgICAgICAgICAgICAgICAgICAgICAoMSArIHNtcF9jcHVzICsgbmJfbnVtYV9ub2RlcykgKiA4KTsKK30KKworLyogR2VuZXJhdGUgYW4gaW5pdGlhbCBib290IHNlY3RvciB3aGljaCBzZXRzIHN0YXRlIGFuZCBqdW1wIHRvCisgICBhIHNwZWNpZmllZCB2ZWN0b3IgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX2Jvb3RzZWN0KGh3YWRkciBvcHRpb25fcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ3ByWzhdLCB1aW50MTZfdCBzZWdzWzZdLCB1aW50MTZfdCBpcCkKK3sKKyAgICB1aW50OF90IHJvbVs1MTJdLCAqcCwgKnJlbG9jOworICAgIHVpbnQ4X3Qgc3VtOworICAgIGludCBpOworCisgICAgbWVtc2V0KHJvbSwgMCwgc2l6ZW9mKHJvbSkpOworCisgICAgcCA9IHJvbTsKKyAgICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBvcHRpb24gcm9tIHNpZ25hdHVyZSAqLworICAgICpwKysgPSAweDU1OworICAgICpwKysgPSAweGFhOworCisgICAgLyogUk9NIHNpemUgaW4gc2VjdG9ycyovCisgICAgKnArKyA9IDE7CisKKyAgICAvKiBIb29rIGludDE5ICovCisKKyAgICAqcCsrID0gMHg1MDsJCS8qIHB1c2ggYXggKi8KKyAgICAqcCsrID0gMHgxZTsJCS8qIHB1c2ggZHMgKi8KKyAgICAqcCsrID0gMHgzMTsgKnArKyA9IDB4YzA7CS8qIHhvciBheCwgYXggKi8KKyAgICAqcCsrID0gMHg4ZTsgKnArKyA9IDB4ZDg7CS8qIG1vdiBheCwgZHMgKi8KKworICAgICpwKysgPSAweGM3OyAqcCsrID0gMHgwNjsgICAvKiBtb3Z2dyBfc3RhcnQsMHg2NCAqLworICAgICpwKysgPSAweDY0OyAqcCsrID0gMHgwMDsKKyAgICByZWxvYyA9IHA7CisgICAgKnArKyA9IDB4MDA7ICpwKysgPSAweDAwOworCisgICAgKnArKyA9IDB4OGM7ICpwKysgPSAweDBlOyAgIC8qIG1vdiBjcywweDY2ICovCisgICAgKnArKyA9IDB4NjY7ICpwKysgPSAweDAwOworCisgICAgKnArKyA9IDB4MWY7CQkvKiBwb3AgZHMgKi8KKyAgICAqcCsrID0gMHg1ODsJCS8qIHBvcCBheCAqLworICAgICpwKysgPSAweGNiOwkJLyogbHJldCAqLworCisgICAgLyogQWN0dWFsIGNvZGUgKi8KKyAgICAqcmVsb2MgPSAocCAtIHJvbSk7CisKKyAgICAqcCsrID0gMHhmYTsJCS8qIENMSSAqLworICAgICpwKysgPSAweGZjOwkJLyogQ0xEICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJaWYgKGkgPT0gMSkJCS8qIFNraXAgQ1MgKi8KKwkgICAgY29udGludWU7CisKKwkqcCsrID0gMHhiODsJCS8qIE1PViBBWCxpbW0xNiAqLworCSpwKysgPSBzZWdzW2ldOworCSpwKysgPSBzZWdzW2ldID4+IDg7CisJKnArKyA9IDB4OGU7CQkvKiBNT1YgPHNlZz4sQVggKi8KKwkqcCsrID0gMHhjMCArIChpIDw8IDMpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkqcCsrID0gMHg2NjsJCS8qIDMyLWJpdCBvcGVyYW5kIHNpemUgKi8KKwkqcCsrID0gMHhiOCArIGk7CS8qIE1PViA8cmVnPixpbW0zMiAqLworCSpwKysgPSBncHJbaV07CisJKnArKyA9IGdwcltpXSA+PiA4OworCSpwKysgPSBncHJbaV0gPj4gMTY7CisJKnArKyA9IGdwcltpXSA+PiAyNDsKKyAgICB9CisKKyAgICAqcCsrID0gMHhlYTsJCS8qIEpNUCBGQVIgKi8KKyAgICAqcCsrID0gaXA7CQkJLyogSVAgKi8KKyAgICAqcCsrID0gaXAgPj4gODsKKyAgICAqcCsrID0gc2Vnc1sxXTsJCS8qIENTICovCisgICAgKnArKyA9IHNlZ3NbMV0gPj4gODsKKworICAgIC8qIHNpZ24gcm9tICovCisgICAgc3VtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihyb20pIC0gMSk7IGkrKykKKyAgICAgICAgc3VtICs9IHJvbVtpXTsKKyAgICByb21bc2l6ZW9mKHJvbSkgLSAxXSA9IC1zdW07CisKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlX3JvbShvcHRpb25fcm9tLCByb20sIHNpemVvZihyb20pKTsKKyAgICBvcHRpb25fcm9tX3NldHVwX3Jlc2V0KG9wdGlvbl9yb20sIHNpemVvZiAocm9tKSk7Cit9CisKK3N0YXRpYyBsb25nIGdldF9maWxlX3NpemUoRklMRSAqZikKK3sKKyAgICBsb25nIHdoZXJlLCBzaXplOworCisgICAgLyogWFhYOiBvbiBVbml4IHN5c3RlbXMsIHVzaW5nIGZzdGF0KCkgcHJvYmFibHkgbWFrZXMgbW9yZSBzZW5zZSAqLworCisgICAgd2hlcmUgPSBmdGVsbChmKTsKKyAgICBmc2VlayhmLCAwLCBTRUVLX0VORCk7CisgICAgc2l6ZSA9IGZ0ZWxsKGYpOworICAgIGZzZWVrKGYsIHdoZXJlLCBTRUVLX1NFVCk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9saW51eChod2FkZHIgb3B0aW9uX3JvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLAorCQkgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLAorCQkgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICBod2FkZHIgbWF4X3JhbV9zaXplKQoreworICAgIHVpbnQxNl90IHByb3RvY29sOworICAgIHVpbnQzMl90IGdwcls4XTsKKyAgICB1aW50MTZfdCBzZWdbNl07CisgICAgdWludDE2X3QgcmVhbF9zZWc7CisgICAgaW50IHNldHVwX3NpemUsIGtlcm5lbF9zaXplLCBpbml0cmRfc2l6ZSA9IDAsIGNtZGxpbmVfc2l6ZTsKKyAgICB1aW50MzJfdCBpbml0cmRfbWF4OworICAgIHVpbnQ4X3QgaGVhZGVyWzEwMjRdOworICAgIGh3YWRkciByZWFsX2FkZHIsIHByb3RfYWRkciwgY21kbGluZV9hZGRyLCBpbml0cmRfYWRkciA9IDA7CisgICAgRklMRSAqZiwgKmZpOworCisgICAgLyogQWxpZ24gdG8gMTYgYnl0ZXMgYXMgYSBwYXJhbm9pYSBtZWFzdXJlICovCisgICAgY21kbGluZV9zaXplID0gKHN0cmxlbihrZXJuZWxfY21kbGluZSkrMTYpICYgfjE1OworCisgICAgLyogbG9hZCB0aGUga2VybmVsIGhlYWRlciAqLworICAgIGYgPSBmb3BlbihrZXJuZWxfZmlsZW5hbWUsICJyYiIpOworICAgIGlmICghZiB8fCAhKGtlcm5lbF9zaXplID0gZ2V0X2ZpbGVfc2l6ZShmKSkgfHwKKwlmcmVhZChoZWFkZXIsIDEsIDEwMjQsIGYpICE9IDEwMjQpIHsKKwlmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGNvdWxkIG5vdCBsb2FkIGtlcm5lbCAnJXMnXG4iLAorCQlrZXJuZWxfZmlsZW5hbWUpOworCWV4aXQoMSk7CisgICAgfQorCisgICAgLyoga2VybmVsIHByb3RvY29sIHZlcnNpb24gKi8KKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsICJoZWFkZXIgbWFnaWM6ICUjeFxuIiwgbGRsX3AoaGVhZGVyKzB4MjAyKSk7CisjZW5kaWYKKyAgICBpZiAobGRsX3AoaGVhZGVyKzB4MjAyKSA9PSAweDUzNzI2NDQ4KQorCXByb3RvY29sID0gbGR1d19wKGhlYWRlcisweDIwNik7CisgICAgZWxzZQorCXByb3RvY29sID0gMDsKKworICAgIGlmIChwcm90b2NvbCA8IDB4MjAwIHx8ICEoaGVhZGVyWzB4MjExXSAmIDB4MDEpKSB7CisJLyogTG93IGtlcm5lbCAqLworCXJlYWxfYWRkciAgICA9IDB4OTAwMDA7CisJY21kbGluZV9hZGRyID0gMHg5YTAwMCAtIGNtZGxpbmVfc2l6ZTsKKwlwcm90X2FkZHIgICAgPSAweDEwMDAwOworICAgIH0gZWxzZSBpZiAocHJvdG9jb2wgPCAweDIwMikgeworCS8qIEhpZ2ggYnV0IGFuY2llbnQga2VybmVsICovCisJcmVhbF9hZGRyICAgID0gMHg5MDAwMDsKKwljbWRsaW5lX2FkZHIgPSAweDlhMDAwIC0gY21kbGluZV9zaXplOworCXByb3RfYWRkciAgICA9IDB4MTAwMDAwOworICAgIH0gZWxzZSB7CisJLyogSGlnaCBhbmQgcmVjZW50IGtlcm5lbCAqLworCXJlYWxfYWRkciAgICA9IDB4MTAwMDA7CisJY21kbGluZV9hZGRyID0gMHgyMDAwMDsKKwlwcm90X2FkZHIgICAgPSAweDEwMDAwMDsKKyAgICB9CisKKyNpZiAwCisgICAgZnByaW50ZihzdGRlcnIsCisJICAgICJxZW11OiByZWFsX2FkZHIgICAgID0gMHgiIFRBUkdFVF9GTVRfcGx4ICJcbiIKKwkgICAgInFlbXU6IGNtZGxpbmVfYWRkciAgPSAweCIgVEFSR0VUX0ZNVF9wbHggIlxuIgorCSAgICAicWVtdTogcHJvdF9hZGRyICAgICA9IDB4IiBUQVJHRVRfRk1UX3BseCAiXG4iLAorCSAgICByZWFsX2FkZHIsCisJICAgIGNtZGxpbmVfYWRkciwKKwkgICAgcHJvdF9hZGRyKTsKKyNlbmRpZgorCisgICAgLyogaGlnaGVzdCBhZGRyZXNzIGZvciBsb2FkaW5nIHRoZSBpbml0cmQgKi8KKyAgICBpZiAocHJvdG9jb2wgPj0gMHgyMDMpCisJaW5pdHJkX21heCA9IGxkbF9wKGhlYWRlcisweDIyYyk7CisgICAgZWxzZQorCWluaXRyZF9tYXggPSAweDM3ZmZmZmZmOworCisgICAgaWYgKGluaXRyZF9tYXggPj0gbWF4X3JhbV9zaXplLUFDUElfREFUQV9TSVpFKQorICAgIAlpbml0cmRfbWF4ID0gbWF4X3JhbV9zaXplLUFDUElfREFUQV9TSVpFLTE7CisKKyAgICAvKiBrZXJuZWwgY29tbWFuZCBsaW5lICovCisgICAgcHN0cmNweV90YXJncGh5cygiY21kbGluZSIsIGNtZGxpbmVfYWRkciwgNDA5Niwga2VybmVsX2NtZGxpbmUpOworCisgICAgaWYgKHByb3RvY29sID49IDB4MjAyKSB7CisJc3RsX3AoaGVhZGVyKzB4MjI4LCBjbWRsaW5lX2FkZHIpOworICAgIH0gZWxzZSB7CisJc3R3X3AoaGVhZGVyKzB4MjAsIDB4QTMzRik7CisJc3R3X3AoaGVhZGVyKzB4MjIsIGNtZGxpbmVfYWRkci1yZWFsX2FkZHIpOworICAgIH0KKworICAgIC8qIGxvYWRlciB0eXBlICovCisgICAgLyogSGlnaCBueWJibGUgPSBCIHJlc2VydmVkIGZvciBRZW11OyBsb3cgbnliYmxlIGlzIHJldmlzaW9uIG51bWJlci4KKyAgICAgICBJZiB0aGlzIGNvZGUgaXMgc3Vic3RhbnRpYWxseSBjaGFuZ2VkLCB5b3UgbWF5IHdhbnQgdG8gY29uc2lkZXIKKyAgICAgICBpbmNyZW1lbnRpbmcgdGhlIHJldmlzaW9uLiAqLworICAgIGlmIChwcm90b2NvbCA+PSAweDIwMCkKKwloZWFkZXJbMHgyMTBdID0gMHhCMDsKKworICAgIC8qIGhlYXAgKi8KKyAgICBpZiAocHJvdG9jb2wgPj0gMHgyMDEpIHsKKwloZWFkZXJbMHgyMTFdIHw9IDB4ODA7CS8qIENBTl9VU0VfSEVBUCAqLworCXN0d19wKGhlYWRlcisweDIyNCwgY21kbGluZV9hZGRyLXJlYWxfYWRkci0weDIwMCk7CisgICAgfQorCisgICAgLyogbG9hZCBpbml0cmQgKi8KKyAgICBpZiAoaW5pdHJkX2ZpbGVuYW1lKSB7CisJaWYgKHByb3RvY29sIDwgMHgyMDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBsaW51eCBrZXJuZWwgdG9vIG9sZCB0byBsb2FkIGEgcmFtIGRpc2sgJXMsICVzLCAlc1xuIiwKKwkJCWtlcm5lbF9maWxlbmFtZSwgaW5pdHJkX2ZpbGVuYW1lLCBrZXJuZWxfY21kbGluZSk7CisJICAgIGV4aXQoMSk7CisJfQorCisJZmkgPSBmb3Blbihpbml0cmRfZmlsZW5hbWUsICJyYiIpOworCWlmICghZmkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3QgbG9hZCBpbml0aWFsIHJhbSBkaXNrICclcydcbiIsCisJCSAgICBpbml0cmRfZmlsZW5hbWUpOworCSAgICBleGl0KDEpOworCX0KKworCWluaXRyZF9zaXplID0gZ2V0X2ZpbGVfc2l6ZShmaSk7CisJaW5pdHJkX2FkZHIgPSAoaW5pdHJkX21heC1pbml0cmRfc2l6ZSkgJiB+NDA5NTsKKworCWlmICghZnJlYWRfdGFyZ3BoeXNfb2soaW5pdHJkX2FkZHIsIGluaXRyZF9zaXplLCBmaSkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiByZWFkIGVycm9yIG9uIGluaXRpYWwgcmFtIGRpc2sgJyVzJ1xuIiwKKwkJICAgIGluaXRyZF9maWxlbmFtZSk7CisJICAgIGV4aXQoMSk7CisJfQorCWZjbG9zZShmaSk7CisKKwlzdGxfcChoZWFkZXIrMHgyMTgsIGluaXRyZF9hZGRyKTsKKwlzdGxfcChoZWFkZXIrMHgyMWMsIGluaXRyZF9zaXplKTsKKyAgICB9CisKKyAgICAvKiBzdG9yZSB0aGUgZmluYWxpemVkIGhlYWRlciBhbmQgbG9hZCB0aGUgcmVzdCBvZiB0aGUga2VybmVsICovCisgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZShyZWFsX2FkZHIsIGhlYWRlciwgMTAyNCk7CisKKyAgICBzZXR1cF9zaXplID0gaGVhZGVyWzB4MWYxXTsKKyAgICBpZiAoc2V0dXBfc2l6ZSA9PSAwKQorCXNldHVwX3NpemUgPSA0OworCisgICAgc2V0dXBfc2l6ZSA9IChzZXR1cF9zaXplKzEpKjUxMjsKKyAgICBrZXJuZWxfc2l6ZSAtPSBzZXR1cF9zaXplOwkvKiBTaXplIG9mIHByb3RlY3RlZC1tb2RlIGNvZGUgKi8KKworICAgIGlmICghZnJlYWRfdGFyZ3BoeXNfb2socmVhbF9hZGRyKzEwMjQsIHNldHVwX3NpemUtMTAyNCwgZikgfHwKKwkhZnJlYWRfdGFyZ3BoeXNfb2socHJvdF9hZGRyLCBrZXJuZWxfc2l6ZSwgZikpIHsKKwlmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHJlYWQgZXJyb3Igb24ga2VybmVsICclcydcbiIsCisJCWtlcm5lbF9maWxlbmFtZSk7CisJZXhpdCgxKTsKKyAgICB9CisgICAgZmNsb3NlKGYpOworCisgICAgLyogZ2VuZXJhdGUgYm9vdHNlY3RvciB0byBzZXQgdXAgdGhlIGluaXRpYWwgcmVnaXN0ZXIgc3RhdGUgKi8KKyAgICByZWFsX3NlZyA9IHJlYWxfYWRkciA+PiA0OworICAgIHNlZ1swXSA9IHNlZ1syXSA9IHNlZ1szXSA9IHNlZ1s0XSA9IHNlZ1s1XSA9IHJlYWxfc2VnOworICAgIHNlZ1sxXSA9IHJlYWxfc2VnKzB4MjA7CS8qIENTICovCisgICAgbWVtc2V0KGdwciwgMCwgc2l6ZW9mIGdwcik7CisgICAgZ3ByWzRdID0gY21kbGluZV9hZGRyLXJlYWxfYWRkci0xNjsJLyogU1AgKC0xNiBpcyBwYXJhbm9pYSkgKi8KKworICAgIG9wdGlvbl9yb21fc2V0dXBfcmVzZXQocmVhbF9hZGRyLCBzZXR1cF9zaXplKTsKKyAgICBvcHRpb25fcm9tX3NldHVwX3Jlc2V0KHByb3RfYWRkciwga2VybmVsX3NpemUpOworICAgIG9wdGlvbl9yb21fc2V0dXBfcmVzZXQoY21kbGluZV9hZGRyLCBjbWRsaW5lX3NpemUpOworICAgIGlmIChpbml0cmRfZmlsZW5hbWUpCisgICAgICAgIG9wdGlvbl9yb21fc2V0dXBfcmVzZXQoaW5pdHJkX2FkZHIsIGluaXRyZF9zaXplKTsKKworICAgIGdlbmVyYXRlX2Jvb3RzZWN0KG9wdGlvbl9yb20sIGdwciwgc2VnLCAwKTsKK30KKworc3RhdGljIHZvaWQgbWFpbl9jcHVfcmVzZXQodm9pZCAqb3BhcXVlKQoreworICAgIENQVU9sZFN0YXRlICplbnYgPSBvcGFxdWU7CisgICAgY3B1X3Jlc2V0KEVOVl9HRVRfQ1BVKGVudikpOworfQorCisjaWZuZGVmIENPTkZJR19BTkRST0lECitzdGF0aWMgY29uc3QgaW50IGlkZV9pb2Jhc2VbMl0gPSB7IDB4MWYwLCAweDE3MCB9Oworc3RhdGljIGNvbnN0IGludCBpZGVfaW9iYXNlMlsyXSA9IHsgMHgzZjYsIDB4Mzc2IH07CitzdGF0aWMgY29uc3QgaW50IGlkZV9pcnFbMl0gPSB7IDE0LCAxNSB9OworI2VuZGlmCisKKyNkZWZpbmUgTkUyMDAwX05CX01BWCA2CisKK3N0YXRpYyBpbnQgbmUyMDAwX2lvW05FMjAwMF9OQl9NQVhdID0geyAweDMwMCwgMHgzMjAsIDB4MzQwLCAweDM2MCwgMHgyODAsIDB4MzgwIH07CitzdGF0aWMgaW50IG5lMjAwMF9pcnFbTkUyMDAwX05CX01BWF0gPSB7IDksIDEwLCAxMSwgMywgNCwgNSB9OworCisvKiBzdGF0aWMgaW50IHNlcmlhbF9pb1tNQVhfU0VSSUFMX1BPUlRTXSA9IHsgMHgzZjgsIDB4MmY4LCAweDNlOCwgMHgyZTggfTsKK3N0YXRpYyBpbnQgc2VyaWFsX2lycVtNQVhfU0VSSUFMX1BPUlRTXSA9IHsgNCwgMywgNCwgMyB9OworCitzdGF0aWMgaW50IHBhcmFsbGVsX2lvW01BWF9QQVJBTExFTF9QT1JUU10gPSB7IDB4Mzc4LCAweDI3OCwgMHgzYmMgfTsKK3N0YXRpYyBpbnQgcGFyYWxsZWxfaXJxW01BWF9QQVJBTExFTF9QT1JUU10gPSB7IDcsIDcsIDcgfTsgKi8KKworI2lmZGVmIEhBU19BVURJTworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorc3RhdGljIHZvaWQgYXVkaW9faW5pdCAoUENJQnVzICpwY2lfYnVzLCBxZW11X2lycSAqcGljKQoreworICAgIHN0cnVjdCBzb3VuZGh3ICpjOworCisgICAgZm9yIChjID0gc291bmRodzsgYy0+bmFtZTsgKytjKSB7CisgICAgICAgIGlmIChjLT5lbmFibGVkKSB7CisgICAgICAgICAgICBpZiAoYy0+aXNhKSB7CisgICAgICAgICAgICAgICAgYy0+aW5pdC5pbml0X2lzYShwaWMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGNpX2J1cykgeworICAgICAgICAgICAgICAgICAgICBjLT5pbml0LmluaXRfcGNpKHBjaV9idXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHBjX2luaXRfbmUya19pc2EoTklDSW5mbyAqbmQsIHFlbXVfaXJxICpwaWMpCit7CisgICAgc3RhdGljIGludCBuYl9uZTJrID0gMDsKKworICAgIGlmIChuYl9uZTJrID09IE5FMjAwMF9OQl9NQVgpCisgICAgICAgIHJldHVybjsKKyAgICBpc2FfbmUyMDAwX2luaXQobmUyMDAwX2lvW25iX25lMmtdLCBwaWNbbmUyMDAwX2lycVtuYl9uZTJrXV0sIG5kKTsKKyAgICBuYl9uZTJrKys7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9vcHRpb25fcm9tKGNvbnN0IGNoYXIgKm9wcm9tLCBod2FkZHIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgZW5kKQoreworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY2hhciAqZmlsZW5hbWU7CisKKyAgICAgICAgZmlsZW5hbWUgPSBxZW11X2ZpbmRfZmlsZShRRU1VX0ZJTEVfVFlQRV9CSU9TLCBvcHJvbSk7CisgICAgICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICAgICAgc2l6ZSA9IGdldF9pbWFnZV9zaXplKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCAmJiBzdGFydCArIHNpemUgPiBlbmQpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBlbm91Z2ggc3BhY2UgdG8gbG9hZCBvcHRpb24gcm9tICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvbSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBsb2FkX2ltYWdlX3RhcmdwaHlzKGZpbGVuYW1lLCBzdGFydCwgZW5kIC0gc3RhcnQpOworICAgICAgICAgICAgZ19mcmVlKGZpbGVuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxvYWQgb3B0aW9uIHJvbSAnJXMnXG4iLCBvcHJvbSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIC8qIFJvdW5kIHVwIG9wdGlvbSByb20gc2l6ZSB0byB0aGUgbmV4dCAyayBib3VuZGFyeSAqLworICAgICAgICBzaXplID0gKHNpemUgKyAyMDQ3KSAmIH4yMDQ3OworICAgICAgICBvcHRpb25fcm9tX3NldHVwX3Jlc2V0KHN0YXJ0LCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBjcHVfaXNfYnNwKENQVU9sZFN0YXRlICplbnYpCit7CisJcmV0dXJuIGVudi0+Y3B1aWRfYXBpY19pZCA9PSAwOworfQorCitzdGF0aWMgc3RydWN0IGdvbGRmaXNoX2RldmljZSBldmVudDBfZGV2aWNlID0geworICAgIC5uYW1lID0gImdvbGRmaXNoX2V2ZW50cyIsCisgICAgLmlkID0gMCwKKyAgICAuc2l6ZSA9IDB4MTAwMCwKKyAgICAvKiBGSVhNRTogVGhpcyBpcyBqdXN0IGEgd29yayBhcm91bmQgYmVmb3JlIHdlIGhhdmUgYSBwZXJtYW5lbnQgZml4IG9uCisgICAgICogaW5jcmVhc2luZyBudW1iZXIgb2YgSVJRcyBhdmFpbGFibGUgZm9yIHg4NiBzeXNpbWFnZXMuIElSUTMgaXMgbm9ybWFsbHkKKyAgICAgKiBhc3NpZ25lZCB0byBDT00yL0NPTTQsIGFuZCB3ZSBoYXZlIG91ciBvd24gY3VzdG9tIElSUXMgZm9yIHRob3NlLiBTbywKKyAgICAgKiBpdCdzIHNhZmUgdG8gcmVzZXJ2ZSBpdCBmb3IgdGhlIGV2ZW50cyBkZXZpY2UuICovCisgICAgLmlycSA9IDMsCisgICAgLmlycV9jb3VudCA9IDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ29sZGZpc2hfZGV2aWNlIG5hbmRfZGV2aWNlID0geworICAgIC5uYW1lID0gImdvbGRmaXNoX25hbmQiLAorICAgIC5pZCA9IDAsCisgICAgLnNpemUgPSAweDEwMDAKK307CisKKy8qIFBDIGhhcmR3YXJlIGluaXRpYWxpc2F0aW9uICovCitzdGF0aWMgdm9pZCBwY19pbml0MShyYW1fYWRkcl90IHJhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9vdF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IHBjaV9lbmFibGVkLCBjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IHJldCwgbGludXhfYm9vdCwgaTsKKyAgICByYW1fYWRkcl90IHJhbV9hZGRyLCBiaW9zX29mZnNldCwgb3B0aW9uX3JvbV9vZmZzZXQ7CisgICAgcmFtX2FkZHJfdCBiZWxvd180Z19tZW1fc2l6ZSwgYWJvdmVfNGdfbWVtX3NpemUgPSAwOworICAgIGludCBiaW9zX3NpemUsIGlzYV9iaW9zX3NpemUsIG9wcm9tX2FyZWFfc2l6ZTsKKyAgICBQQ0lCdXMgKnBjaV9idXM7CisgICAgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHBpaXgzX2RldmZuID0gLTE7CisgICAgQ1BVT2xkU3RhdGUgKmVudjsKKyAgICBxZW11X2lycSAqY3B1X2lycTsKKyAgICBxZW11X2lycSAqaTgyNTk7CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgaW50IGluZGV4OworI2VuZGlmCisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqaGRbTUFYX0lERV9CVVMgKiBNQVhfSURFX0RFVlNdOworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgIEJsb2NrRHJpdmVyU3RhdGUgKmZkW01BWF9GRF07CisjZW5kaWYKKyAgICBpbnQgdXNpbmdfdmdhID0gY2lycnVzX3ZnYV9lbmFibGVkIHx8IHN0ZF92Z2FfZW5hYmxlZCB8fCB2bXN2Z2FfZW5hYmxlZDsKKworICAgIGlmIChyYW1fc2l6ZSA+PSAweGUwMDAwMDAwICkgeworICAgICAgICBhYm92ZV80Z19tZW1fc2l6ZSA9IHJhbV9zaXplIC0gMHhlMDAwMDAwMDsKKyAgICAgICAgYmVsb3dfNGdfbWVtX3NpemUgPSAweGUwMDAwMDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGJlbG93XzRnX21lbV9zaXplID0gcmFtX3NpemU7CisgICAgfQorCisgICAgbGludXhfYm9vdCA9IChrZXJuZWxfZmlsZW5hbWUgIT0gTlVMTCk7CisKKyAgICAvKiBpbml0IENQVXMgKi8KKyAgICBpZiAoY3B1X21vZGVsID09IE5VTEwpIHsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGNwdV9tb2RlbCA9ICJxZW11NjQiOworI2Vsc2UKKyAgICAgICAgY3B1X21vZGVsID0gInFlbXUzMiI7CisjZW5kaWYKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBzbXBfY3B1czsgaSsrKSB7CisgICAgICAgIGVudiA9IGNwdV9pbml0KGNwdV9tb2RlbCk7CisgICAgICAgIGlmICghZW52KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBmaW5kIHg4NiBDUFUgZGVmaW5pdGlvblxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmICgoZW52LT5jcHVpZF9mZWF0dXJlcyAmIENQVUlEX0FQSUMpIHx8IHNtcF9jcHVzID4gMSkgeworICAgICAgICAgICAgZW52LT5jcHVpZF9hcGljX2lkID0gRU5WX0dFVF9DUFUoZW52KS0+Y3B1X2luZGV4OworICAgICAgICAgICAgYXBpY19pbml0KGVudik7CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9yZWdpc3Rlcl9yZXNldChtYWluX2NwdV9yZXNldCwgMCwgZW52KTsKKyAgICB9CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgdm1wb3J0X2luaXQoKTsKKworICAgIC8qIGFsbG9jYXRlIFJBTSAqLworICAgIHJhbV9hZGRyID0gcWVtdV9yYW1fYWxsb2MoTlVMTCwgInBjLnJhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvd180Z19tZW1fc2l6ZSArIGFib3ZlXzRnX21lbV9zaXplKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDAsIDB4YTAwMDAsIHJhbV9hZGRyKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4MTAwMDAwLAorICAgICAgICAgICAgICAgICBiZWxvd180Z19tZW1fc2l6ZSAtIDB4MTAwMDAwLAorICAgICAgICAgICAgICAgICByYW1fYWRkciArIDB4MTAwMDAwKTsKKyAgICBpZiAoYWJvdmVfNGdfbWVtX3NpemUgPiAwKSB7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHgxMDAwMDAwMDBVTEwsIGFib3ZlXzRnX21lbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyICsgYmVsb3dfNGdfbWVtX3NpemUpOworICAgIH0KKyNlbHNlCisgICAgLyoKKyAgICAgKiBBbGxvY2F0ZSBhIHNpbmdsZSBjb250aWd1b3VzIFJBTSBzbyB0aGF0IHRoZSBnb2xkZmlzaAorICAgICAqIGZyYW1lYnVmZmVyIGNhbiB3b3JrIHdlbGwgZXNwZWNpYWxseSB3aGVuIHRoZSBmcmFtZSBidWZmZXIgaXMKKyAgICAgKiBsYXJnZS4KKyAgICAgKi8KKyAgICByYW1fYWRkciA9IHFlbXVfcmFtX2FsbG9jKE5VTEwsICJwYy5yYW0iLCBiZWxvd180Z19tZW1fc2l6ZSk7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeSgwLCBiZWxvd180Z19tZW1fc2l6ZSwgcmFtX2FkZHIpOworI2VuZGlmCisKKyAgICAvKiBhYm92ZSA0Z2lnYSBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGlmIChhYm92ZV80Z19tZW1fc2l6ZSA+IDApIHsKKyNpZiBUQVJHRVRfUEhZU19BRERSX0JJVFMgPT0gMzIKKyAgICAgICAgaHdfZXJyb3IoIlRvIG11Y2ggUkFNIGZvciAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyIpOworI2Vsc2UKKyAgICAgICAgcmFtX2FkZHIgPSBxZW11X3JhbV9hbGxvYyhOVUxMLCAicGMucmFtLmhpZ2giLCBhYm92ZV80Z19tZW1fc2l6ZSk7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHgxMDAwMDAwMDBVTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmVfNGdfbWVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHIpOworI2VuZGlmCisgICAgfQorCisKKyAgICAvKiBCSU9TIGxvYWQgKi8KKyAgICBpZiAoYmlvc19uYW1lID09IE5VTEwpCisgICAgICAgIGJpb3NfbmFtZSA9IEJJT1NfRklMRU5BTUU7CisgICAgZmlsZW5hbWUgPSBxZW11X2ZpbmRfZmlsZShRRU1VX0ZJTEVfVFlQRV9CSU9TLCBiaW9zX25hbWUpOworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBiaW9zX3NpemUgPSBnZXRfaW1hZ2Vfc2l6ZShmaWxlbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmlvc19zaXplID0gLTE7CisgICAgfQorICAgIGlmIChiaW9zX3NpemUgPD0gMCB8fAorICAgICAgICAoYmlvc19zaXplICUgNjU1MzYpICE9IDApIHsKKyAgICAgICAgZ290byBiaW9zX2Vycm9yOworICAgIH0KKyAgICBiaW9zX29mZnNldCA9IHFlbXVfcmFtX2FsbG9jKE5VTEwsICJiaW9zLmJpbiIsIGJpb3Nfc2l6ZSk7CisgICAgcmV0ID0gbG9hZF9pbWFnZShmaWxlbmFtZSwgcWVtdV9nZXRfcmFtX3B0cihiaW9zX29mZnNldCkpOworICAgIGlmIChyZXQgIT0gYmlvc19zaXplKSB7CisgICAgYmlvc19lcnJvcjoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3QgbG9hZCBQQyBCSU9TICclcydcbiIsIGJpb3NfbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBnX2ZyZWUoZmlsZW5hbWUpOworICAgIH0KKyAgICAvKiBtYXAgdGhlIGxhc3QgMTI4S0Igb2YgdGhlIEJJT1MgaW4gSVNBIHNwYWNlICovCisgICAgaXNhX2Jpb3Nfc2l6ZSA9IGJpb3Nfc2l6ZTsKKyAgICBpZiAoaXNhX2Jpb3Nfc2l6ZSA+ICgxMjggKiAxMDI0KSkKKyAgICAgICAgaXNhX2Jpb3Nfc2l6ZSA9IDEyOCAqIDEwMjQ7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeSgweDEwMDAwMCAtIGlzYV9iaW9zX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2FfYmlvc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpb3Nfb2Zmc2V0ICsgYmlvc19zaXplIC0gaXNhX2Jpb3Nfc2l6ZSkgfCBJT19NRU1fUk9NKTsKKworCisKKyAgICBvcHRpb25fcm9tX29mZnNldCA9IHFlbXVfcmFtX2FsbG9jKE5VTEwsICJwYy5yb20iLCAweDIwMDAwKTsKKyAgICBvcHJvbV9hcmVhX3NpemUgPSAwOworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHhjMDAwMCwgMHgyMDAwMCwgb3B0aW9uX3JvbV9vZmZzZXQpOworCisgICAgaWYgKHVzaW5nX3ZnYSkgeworICAgICAgICBjb25zdCBjaGFyICp2Z2FiaW9zX2ZpbGVuYW1lOworICAgICAgICAvKiBWR0EgQklPUyBsb2FkICovCisgICAgICAgIGlmIChjaXJydXNfdmdhX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHZnYWJpb3NfZmlsZW5hbWUgPSBWR0FCSU9TX0NJUlJVU19GSUxFTkFNRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZnYWJpb3NfZmlsZW5hbWUgPSBWR0FCSU9TX0ZJTEVOQU1FOworICAgICAgICB9CisgICAgICAgIG9wcm9tX2FyZWFfc2l6ZSA9IGxvYWRfb3B0aW9uX3JvbSh2Z2FiaW9zX2ZpbGVuYW1lLCAweGMwMDAwLCAweGUwMDAwKTsKKyAgICB9CisgICAgLyogQWx0aG91Z2ggdmlkZW8gcm9tcyBjYW4gZ3JvdyBsYXJnZXIgdGhhbiAweDgwMDAsIHRoZSBhcmVhIGJldHdlZW4KKyAgICAgKiAweGMwMDAwIC0gMHhjODAwMCBpcyByZXNlcnZlZCBmb3IgdGhlbS4gSXQgbWVhbnMgd2Ugd29uJ3QgYmUgbG9va2luZworICAgICAqIGZvciBhbnkgb3RoZXIga2luZCBvZiBvcHRpb24gcm9tIGluc2lkZSB0aGlzIGFyZWEgKi8KKyAgICBpZiAob3Byb21fYXJlYV9zaXplIDwgMHg4MDAwKQorICAgICAgICBvcHJvbV9hcmVhX3NpemUgPSAweDgwMDA7CisKKyAgICBpZiAobGludXhfYm9vdCkgeworICAgICAgICBsb2FkX2xpbnV4KDB4YzAwMDAgKyBvcHJvbV9hcmVhX3NpemUsCisgICAgICAgICAgICAgICAgICAga2VybmVsX2ZpbGVuYW1lLCBpbml0cmRfZmlsZW5hbWUsIGtlcm5lbF9jbWRsaW5lLCBiZWxvd180Z19tZW1fc2l6ZSk7CisgICAgICAgIG9wcm9tX2FyZWFfc2l6ZSArPSAyMDQ4OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vcHRpb25fcm9tczsgaSsrKSB7CisgICAgICAgIG9wcm9tX2FyZWFfc2l6ZSArPSBsb2FkX29wdGlvbl9yb20ob3B0aW9uX3JvbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGMwMDAwICsgb3Byb21fYXJlYV9zaXplLCAweGUwMDAwKTsKKyAgICB9CisKKyAgICAvKiBtYXAgYWxsIHRoZSBiaW9zIGF0IHRoZSB0b3Agb2YgbWVtb3J5ICovCisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeSgodWludDMyX3QpKC1iaW9zX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlvc19zaXplLCBiaW9zX29mZnNldCB8IElPX01FTV9ST00pOworCisgICAgYm9jaHNfYmlvc19pbml0KCk7CisKKyAgICBjcHVfaXJxID0gcWVtdV9hbGxvY2F0ZV9pcnFzKHBpY19pcnFfcmVxdWVzdCwgTlVMTCwgMSk7CisgICAgaTgyNTkgPSBpODI1OV9pbml0KGNwdV9pcnFbMF0pOworICAgIGZlcnJfaXJxID0gaTgyNTlbR0ZEX0VSUl9JUlFdOworCisjZGVmaW5lIElSUV9QREVWX0JVUyA0CisgICAgZ29sZGZpc2hfZGV2aWNlX2luaXQoaTgyNTksIDB4ZmYwMTAwMDAsIDB4N2YwMDAwLCA1LCA1KTsKKyAgICBnb2xkZmlzaF9kZXZpY2VfYnVzX2luaXQoMHhmZjAwMTAwMCwgSVJRX1BERVZfQlVTKTsKKworICAgIGdvbGRmaXNoX2JhdHRlcnlfaW5pdChhbmRyb2lkX2h3LT5od19iYXR0ZXJ5KTsKKworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgZ29sZGZpc2hfYWRkX2RldmljZV9ub19pbygmbmFuZF9kZXZpY2UpOworICAgIG5hbmRfZGV2X2luaXQobmFuZF9kZXZpY2UuYmFzZSk7CisjZW5kaWYKKyAgICBib29sIG5ld0RldmljZU5hbWluZyA9CisgICAgICAgICAgICAoYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbERldmljZU5hbWluZyhhbmRyb2lkX2h3KSA+PSAxKTsKKyAgICBwaXBlX2Rldl9pbml0KG5ld0RldmljZU5hbWluZyk7CisKKyAgICB7CisgICAgICAgIERyaXZlSW5mbyogaW5mbyA9IGRyaXZlX2dldCggSUZfSURFLCAwLCAwICk7CisgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGdvbGRmaXNoX21tY19pbml0KDB4ZmYwMDUwMDAsIDAsIGluZm8tPmJkcnYpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBjaV9lbmFibGVkKSB7CisgICAgICAgIHBjaV9idXMgPSBpNDQwZnhfaW5pdCgmaTQ0MGZ4X3N0YXRlLCBpODI1OSk7CisgICAgICAgIHBpaXgzX2RldmZuID0gcGlpeDNfaW5pdChwY2lfYnVzLCAtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGNpX2J1cyA9IE5VTEw7CisgICAgfQorCisgICAgLyogaW5pdCBiYXNpYyBQQyBoYXJkd2FyZSAqLworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZSgweDgwLCAxLCAxLCBpb3BvcnQ4MF93cml0ZSwgTlVMTCk7CisKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHhmMCwgMSwgMSwgaW9wb3J0RjBfd3JpdGUsIE5VTEwpOworCisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgaWYgKGNpcnJ1c192Z2FfZW5hYmxlZCkgeworICAgICAgICBpZiAocGNpX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHBjaV9jaXJydXNfdmdhX2luaXQocGNpX2J1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc2FfY2lycnVzX3ZnYV9pbml0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHZtc3ZnYV9lbmFibGVkKSB7CisgICAgICAgIGlmIChwY2lfZW5hYmxlZCkKKyAgICAgICAgICAgIHBjaV92bXN2Z2FfaW5pdChwY2lfYnVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogdm13YXJlX3ZnYTogbm8gUENJIGJ1c1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICB9IGVsc2UgaWYgKHN0ZF92Z2FfZW5hYmxlZCkgeworICAgICAgICBpZiAocGNpX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHBjaV92Z2FfaW5pdChwY2lfYnVzLCAwLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzYV92Z2FfaW5pdCgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBydGNfc3RhdGUgPSBydGNfaW5pdCgweDcwLCBpODI1OVs4XSwgMjAwMCk7CisKKyAgICBxZW11X3JlZ2lzdGVyX2Jvb3Rfc2V0KHBjX2Jvb3Rfc2V0LCBydGNfc3RhdGUpOworCisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoMHg5MiwgMSwgMSwgaW9wb3J0OTJfcmVhZCwgTlVMTCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKDB4OTIsIDEsIDEsIGlvcG9ydDkyX3dyaXRlLCBOVUxMKTsKKworICAgIGlmIChwY2lfZW5hYmxlZCkgeworICAgICAgICBpb2FwaWMgPSBpb2FwaWNfaW5pdCgpOworICAgIH0KKyAgICBwaXQgPSBwaXRfaW5pdCgweDQwLCBpODI1OVswXSk7CisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBwY3Nwa19pbml0KHBpdCk7CisKKyAgICBpZiAoIW5vX2hwZXQpIHsKKyAgICAgICAgaHBldF9pbml0KGk4MjU5KTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChwY2lfZW5hYmxlZCkgeworICAgICAgICBwaWNfc2V0X2FsdF9pcnFfZnVuYyhpc2FfcGljLCBpb2FwaWNfc2V0X2lycSwgaW9hcGljKTsKKyAgICB9CisKKyAgICBnb2xkZmlzaF90dHlfYWRkKHNlcmlhbF9oZHNbMF0sIDAsIDAsIDApOworICAgIC8qIEZJWE1FOiBUaGlzIGlzIGp1c3QgYSB3b3JrIGFyb3VuZCBiZWZvcmUgd2UgaGF2ZSBhIHBlcm1hbmVudCBmaXggb24KKyAgICAgKiBpbmNyZWFzaW5nIG51bWJlciBvZiBJUlFzIGF2YWlsYWJsZSBmb3IgeDg2IHN5c2ltYWdlcy4gSW4gb3JkZXIgdG8gZnJlZSB1cAorICAgICAqIHNvbWUgSVJRcyBmb3IgYSBiZXR0ZXIgdXNlLCB3ZSBsaW1pdCBudW1iZXIgb2YgVFRZIGRldmljZXMgYnkgMi4gTm9ybWFsbHkKKyAgICAgKiB3ZSBkb24ndCBuZWVkIG1vcmUgdGhhbiB0aGF0LCBzbyBhbHdheXMgaGF2aW5nIDQgb2YgdGhlbSB3b3VsZCB3YXN0ZSB0d28KKyAgICAgKiBwcmVjaW91cyBJUlFzLiAqLworI2lmIDAKKyAgICBmb3IoaSA9IDE7IGkgPCBNQVhfU0VSSUFMX1BPUlRTOyBpKyspIHsKKyNlbHNlCisgICAgZm9yKGkgPSAxOyBpIDwgMjsgaSsrKSB7CisjZW5kaWYKKyAgICAgICAgaWYoc2VyaWFsX2hkc1tpXSkgeworICAgICAgICAgICAgZ29sZGZpc2hfdHR5X2FkZChzZXJpYWxfaGRzW2ldLCBpLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGZvcihpID0gMDsgaSA8IE1BWF9TRVJJQUxfUE9SVFM7IGkrKykgeworICAgICAgICBpZiAoc2VyaWFsX2hkc1tpXSkgeworICAgICAgICAgICAgc2VyaWFsX2luaXQoc2VyaWFsX2lvW2ldLCBpODI1OVtzZXJpYWxfaXJxW2ldXSwgMTE1MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsX2hkc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfUEFSQUxMRUxfUE9SVFM7IGkrKykgeworICAgICAgICBpZiAocGFyYWxsZWxfaGRzW2ldKSB7CisgICAgICAgICAgICBwYXJhbGxlbF9pbml0KHBhcmFsbGVsX2lvW2ldLCBpODI1OVtwYXJhbGxlbF9pcnFbaV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbF9oZHNbaV0pOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICB3YXRjaGRvZ19wY19pbml0KHBjaV9idXMpOworCisgICAgZm9yKGkgPSAwOyBpIDwgbmJfbmljczsgaSsrKSB7CisgICAgICAgIE5JQ0luZm8gKm5kID0gJm5kX3RhYmxlW2ldOworCisgICAgICAgIGlmICghcGNpX2VuYWJsZWQgfHwgKG5kLT5tb2RlbCAmJiBzdHJjbXAobmQtPm1vZGVsLCAibmUya19pc2EiKSA9PSAwKSkKKyAgICAgICAgICAgIHBjX2luaXRfbmUya19pc2EobmQsIGk4MjU5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGNpX25pY19pbml0KHBjaV9idXMsIG5kLCAtMSwgIm5lMmtfcGNpIik7CisgICAgfQorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfSURFX0JVUyAqIE1BWF9JREVfREVWUzsgaSsrKQorICAgICAgIGhkW2ldID0gTlVMTDsKKyNlbHNlCisgICAgcWVtdV9zeXN0ZW1faG90X2FkZF9pbml0KCk7CisKKyAgICBpZiAoZHJpdmVfZ2V0X21heF9idXMoSUZfSURFKSA+PSBNQVhfSURFX0JVUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHRvbyBtYW55IElERSBidXNcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IE1BWF9JREVfQlVTICogTUFYX0lERV9ERVZTOyBpKyspIHsKKyAgICAgICAgaW5kZXggPSBkcml2ZV9nZXRfaW5kZXgoSUZfSURFLCBpIC8gTUFYX0lERV9ERVZTLCBpICUgTUFYX0lERV9ERVZTKTsKKwlpZiAoaW5kZXggIT0gLTEpCisJICAgIGhkW2ldID0gZHJpdmVzX3RhYmxlW2luZGV4XS5iZHJ2OworCWVsc2UKKwkgICAgaGRbaV0gPSBOVUxMOworICAgIH0KKworICAgIGlmIChwY2lfZW5hYmxlZCkgeworICAgICAgICBwY2lfcGlpeDNfaWRlX2luaXQocGNpX2J1cywgaGQsIHBpaXgzX2RldmZuICsgMSwgaTgyNTkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9JREVfQlVTOyBpKyspIHsKKyAgICAgICAgICAgIGlzYV9pZGVfaW5pdChpZGVfaW9iYXNlW2ldLCBpZGVfaW9iYXNlMltpXSwgaTgyNTlbaWRlX2lycVtpXV0sCisJICAgICAgICAgICAgICAgICBoZFtNQVhfSURFX0RFVlMgKiBpXSwgaGRbTUFYX0lERV9ERVZTICogaSArIDFdKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaTgwNDJfaW5pdChpODI1OVtHRkRfS0JEX0lSUV0sIGk4MjU5W0dGRF9NT1VTRV9JUlFdLCAweDYwKTsKKyAgICBETUFfaW5pdCgwKTsKKworICAgIGdvbGRmaXNoX2ZiX2luaXQoMCk7CisKKyAgICBnb2xkZmlzaF9hZGRfZGV2aWNlX25vX2lvKCZldmVudDBfZGV2aWNlKTsKKyAgICBldmVudHNfZGV2X2luaXQoZXZlbnQwX2RldmljZS5iYXNlLCBpODI1OVtldmVudDBfZGV2aWNlLmlycV0pOworCisjaWZkZWYgSEFTX0FVRElPCisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgYXVkaW9faW5pdChwY2lfZW5hYmxlZCA/IHBjaV9idXMgOiBOVUxMLCBpODI1OSk7CisjZWxzZQorICAgIGdvbGRmaXNoX2F1ZGlvX2luaXQoMHhmZjAwNDAwMCwgMCwgYXVkaW9faW5wdXRfc291cmNlKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfRkQ7IGkrKykgeworICAgICAgICBpbmRleCA9IGRyaXZlX2dldF9pbmRleChJRl9GTE9QUFksIDAsIGkpOworCWlmIChpbmRleCAhPSAtMSkKKwkgICAgZmRbaV0gPSBkcml2ZXNfdGFibGVbaW5kZXhdLmJkcnY7CisJZWxzZQorCSAgICBmZFtpXSA9IE5VTEw7CisgICAgfQorCisgICAgZmxvcHB5X2NvbnRyb2xsZXIgPSBmZGN0cmxfaW5pdChpODI1OVs2XSwgMiwgMCwgMHgzZjAsIGZkKTsKKyNlbmRpZgorCisgICAgY21vc19pbml0KGJlbG93XzRnX21lbV9zaXplLCBhYm92ZV80Z19tZW1fc2l6ZSwgYm9vdF9kZXZpY2UsIGhkKTsKKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGlmIChwY2lfZW5hYmxlZCAmJiB1c2JfZW5hYmxlZCkgeworICAgICAgICB1c2JfdWhjaV9waWl4M19pbml0KHBjaV9idXMsIHBpaXgzX2RldmZuICsgMik7CisgICAgfQorCisgICAgaWYgKHBjaV9lbmFibGVkICYmIGFjcGlfZW5hYmxlZCkgeworICAgICAgICB1aW50OF90ICplZXByb21fYnVmID0gZ19tYWxsb2MwKDggKiAyNTYpOyAvKiBYWFg6IG1ha2UgdGhpcyBwZXJzaXN0ZW50ICovCisgICAgICAgIGkyY19idXMgKnNtYnVzOworCisgICAgICAgIC8qIFRPRE86IFBvcHVsYXRlIFNQRCBlZXByb20gZGF0YS4gICovCisgICAgICAgIHNtYnVzID0gcGlpeDRfcG1faW5pdChwY2lfYnVzLCBwaWl4M19kZXZmbiArIDMsIDB4YjEwMCwgaTgyNTlbOV0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBEZXZpY2VTdGF0ZSAqZWVwcm9tOworICAgICAgICAgICAgZWVwcm9tID0gcWRldl9jcmVhdGUoKEJ1c1N0YXRlICopc21idXMsICJzbWJ1cy1lZXByb20iKTsKKyAgICAgICAgICAgIHFkZXZfc2V0X3Byb3BfaW50KGVlcHJvbSwgImFkZHJlc3MiLCAweDUwICsgaSk7CisgICAgICAgICAgICBxZGV2X3NldF9wcm9wX3B0cihlZXByb20sICJkYXRhIiwgZWVwcm9tX2J1ZiArIChpICogMjU2KSk7CisgICAgICAgICAgICBxZGV2X2luaXQoZWVwcm9tKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGk0NDBmeF9zdGF0ZSkgeworICAgICAgICBpNDQwZnhfaW5pdF9tZW1vcnlfbWFwcGluZ3MoaTQ0MGZ4X3N0YXRlKTsKKyAgICB9CisKKyAgICBpZiAocGNpX2VuYWJsZWQpIHsKKwlpbnQgbWF4X2J1czsKKyAgICAgICAgaW50IGJ1czsKKworICAgICAgICBtYXhfYnVzID0gZHJpdmVfZ2V0X21heF9idXMoSUZfU0NTSSk7CisJZm9yIChidXMgPSAwOyBidXMgPD0gbWF4X2J1czsgYnVzKyspIHsKKyAgICAgICAgICAgIHBjaV9jcmVhdGVfc2ltcGxlKHBjaV9idXMsIC0xLCAibHNpNTNjODk1YSIpOworICAgICAgICB9CisgICAgfQorI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgIC8qIEFkZCB2aXJ0aW8gYmxvY2sgZGV2aWNlcyAqLworICAgIGlmIChwY2lfZW5hYmxlZCkgeworICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgIGludCB1bml0X2lkID0gMDsKKworICAgICAgICB3aGlsZSAoKGluZGV4ID0gZHJpdmVfZ2V0X2luZGV4KElGX1ZJUlRJTywgMCwgdW5pdF9pZCkpICE9IC0xKSB7CisgICAgICAgICAgICBwY2lfY3JlYXRlX3NpbXBsZShwY2lfYnVzLCAtMSwgInZpcnRpby1ibGstcGNpIik7CisgICAgICAgICAgICB1bml0X2lkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBZGQgdmlydGlvIGJhbGxvb24gZGV2aWNlICovCisgICAgaWYgKHBjaV9lbmFibGVkICYmICFub192aXJ0aW9fYmFsbG9vbikgeworICAgICAgICBwY2lfY3JlYXRlX3NpbXBsZShwY2lfYnVzLCAtMSwgInZpcnRpby1iYWxsb29uLXBjaSIpOworICAgIH0KKworICAgIC8qIEFkZCB2aXJ0aW8gY29uc29sZSBkZXZpY2VzICovCisgICAgaWYgKHBjaV9lbmFibGVkKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9WSVJUSU9fQ09OU09MRVM7IGkrKykgeworICAgICAgICAgICAgaWYgKHZpcnRjb25faGRzW2ldKSB7CisgICAgICAgICAgICAgICAgcGNpX2NyZWF0ZV9zaW1wbGUocGNpX2J1cywgLTEsICJ2aXJ0aW8tY29uc29sZS1wY2kiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwY19pbml0X3BjaShyYW1fYWRkcl90IHJhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYm9vdF9kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmluaXRyZF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKK3sKKyAgICBwY19pbml0MShyYW1fc2l6ZSwgYm9vdF9kZXZpY2UsCisgICAgICAgICAgICAga2VybmVsX2ZpbGVuYW1lLCBrZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICBpbml0cmRfZmlsZW5hbWUsIDEsIGNwdV9tb2RlbCk7Cit9CisKK3N0YXRpYyB2b2lkIHBjX2luaXRfaXNhKHJhbV9hZGRyX3QgcmFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib290X2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY3B1X21vZGVsKQoreworICAgIHBjX2luaXQxKHJhbV9zaXplLCBib290X2RldmljZSwKKyAgICAgICAgICAgICBrZXJuZWxfZmlsZW5hbWUsIGtlcm5lbF9jbWRsaW5lLAorICAgICAgICAgICAgIGluaXRyZF9maWxlbmFtZSwgMCwgY3B1X21vZGVsKTsKK30KKworLyogc2V0IENNT1Mgc2h1dGRvd24gc3RhdHVzIHJlZ2lzdGVyIChpbmRleCAweEYpIGFzIFMzX3Jlc3VtZSgweEZFKQorICAgQklPUyB3aWxsIHJlYWQgaXQgYW5kIHN0YXJ0IFMzIHJlc3VtZSBhdCBQT1NUIEVudHJ5ICovCit2b2lkIGNtb3Nfc2V0X3MzX3Jlc3VtZSh2b2lkKQoreworICAgIGlmIChydGNfc3RhdGUpCisgICAgICAgIHJ0Y19zZXRfbWVtb3J5KHJ0Y19zdGF0ZSwgMHhGLCAweEZFKTsKK30KKworc3RhdGljIFFFTVVNYWNoaW5lIHBjX21hY2hpbmUgPSB7CisgICAgLm5hbWUgPSAicGMiLAorICAgIC5kZXNjID0gIlN0YW5kYXJkIFBDIiwKKyAgICAuaW5pdCA9IHBjX2luaXRfcGNpLAorICAgIC5tYXhfY3B1cyA9IDI1NSwKKyAgICAuaXNfZGVmYXVsdCA9IDEsCit9OworCitzdGF0aWMgUUVNVU1hY2hpbmUgaXNhcGNfbWFjaGluZSA9IHsKKyAgICAubmFtZSA9ICJpc2FwYyIsCisgICAgLmRlc2MgPSAiSVNBLW9ubHkgUEMiLAorICAgIC5pbml0ID0gcGNfaW5pdF9pc2EsCisgICAgLm1heF9jcHVzID0gMSwKK307CisKK3N0YXRpYyB2b2lkIHBjX21hY2hpbmVfaW5pdCh2b2lkKQoreworICAgIHFlbXVfcmVnaXN0ZXJfbWFjaGluZSgmcGNfbWFjaGluZSk7CisgICAgcWVtdV9yZWdpc3Rlcl9tYWNoaW5lKCZpc2FwY19tYWNoaW5lKTsKK30KKworbWFjaGluZV9pbml0KHBjX21hY2hpbmVfaW5pdCk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2kzODYvc21iaW9zLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2kzODYvc21iaW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkYTY5OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvaTM4Ni9zbWJpb3MuYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIFNNQklPUyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogQXV0aG9yczoKKyAqICBBbGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkBocC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImh3L2kzODYvc21iaW9zLmgiCisjaW5jbHVkZSAiaHcvbG9hZGVyLmgiCisvKgorICogU3RydWN0dXJlcyBzaGFyZWQgd2l0aCB0aGUgQklPUworICovCitzdHJ1Y3Qgc21iaW9zX2hlYWRlciB7CisgICAgdWludDE2X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgdHlwZTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qgc21iaW9zX2ZpZWxkIHsKKyAgICBzdHJ1Y3Qgc21iaW9zX2hlYWRlciBoZWFkZXI7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQxNl90IG9mZnNldDsKKyAgICB1aW50OF90IGRhdGFbXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCitzdHJ1Y3Qgc21iaW9zX3RhYmxlIHsKKyAgICBzdHJ1Y3Qgc21iaW9zX2hlYWRlciBoZWFkZXI7CisgICAgdWludDhfdCBkYXRhW107Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworI2RlZmluZSBTTUJJT1NfRklFTERfRU5UUlkgMAorI2RlZmluZSBTTUJJT1NfVEFCTEVfRU5UUlkgMQorCisKK3N0YXRpYyB1aW50OF90ICpzbWJpb3NfZW50cmllczsKK3N0YXRpYyBzaXplX3Qgc21iaW9zX2VudHJpZXNfbGVuOworCit1aW50OF90ICpzbWJpb3NfZ2V0X3RhYmxlKHNpemVfdCAqbGVuZ3RoKQoreworICAgICpsZW5ndGggPSBzbWJpb3NfZW50cmllc19sZW47CisgICAgcmV0dXJuIHNtYmlvc19lbnRyaWVzOworfQorCisvKgorICogVG8gYXZvaWQgdW5yZXNvbHZhYmxlIG92ZXJsYXBzIGluIGRhdGEsIGRvbid0IGFsbG93IGJvdGgKKyAqIHRhYmxlcyBhbmQgZmllbGRzIGZvciB0aGUgc2FtZSBzbWJpb3MgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgc21iaW9zX2NoZWNrX2NvbGxpc2lvbihpbnQgdHlwZSwgaW50IGVudHJ5KQoreworICAgIHVpbnQxNl90ICpudW1fZW50cmllcyA9ICh1aW50MTZfdCAqKXNtYmlvc19lbnRyaWVzOworICAgIHN0cnVjdCBzbWJpb3NfaGVhZGVyICpoZWFkZXI7CisgICAgY2hhciAqcDsKKyAgICBpbnQgaTsKKworICAgIGlmICghbnVtX2VudHJpZXMpCisgICAgICAgIHJldHVybjsKKworICAgIHAgPSAoY2hhciAqKShudW1fZW50cmllcyArIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8ICpudW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIGhlYWRlciA9IChzdHJ1Y3Qgc21iaW9zX2hlYWRlciAqKXA7CisgICAgICAgIGlmIChlbnRyeSA9PSBTTUJJT1NfVEFCTEVfRU5UUlkgJiYgaGVhZGVyLT50eXBlID09IFNNQklPU19GSUVMRF9FTlRSWSkgeworICAgICAgICAgICAgc3RydWN0IHNtYmlvc19maWVsZCAqZmllbGQgPSAodm9pZCAqKWhlYWRlcjsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGZpZWxkLT50eXBlKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTTUJJT1MgdHlwZSAlZCBmaWVsZCBhbHJlYWR5IGRlZmluZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBhZGQgdGFibGVcbiIsIHR5cGUpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZW50cnkgPT0gU01CSU9TX0ZJRUxEX0VOVFJZICYmCisgICAgICAgICAgICAgICAgICAgaGVhZGVyLT50eXBlID09IFNNQklPU19UQUJMRV9FTlRSWSkgeworICAgICAgICAgICAgc3RydWN0IHNtYmlvc19zdHJ1Y3R1cmVfaGVhZGVyICp0YWJsZSA9ICh2b2lkICopKGhlYWRlciArIDEpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gdGFibGUtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNNQklPUyB0eXBlICVkIHRhYmxlIGFscmVhZHkgZGVmaW5lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBmaWVsZFxuIiwgdHlwZSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwICs9IGxlMTZfdG9fY3B1KGhlYWRlci0+bGVuZ3RoKTsKKyAgICB9Cit9CisKK3ZvaWQgc21iaW9zX2FkZF9maWVsZChpbnQgdHlwZSwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqZGF0YSkKK3sKKyAgICBzdHJ1Y3Qgc21iaW9zX2ZpZWxkICpmaWVsZDsKKworICAgIHNtYmlvc19jaGVja19jb2xsaXNpb24odHlwZSwgU01CSU9TX0ZJRUxEX0VOVFJZKTsKKworICAgIGlmICghc21iaW9zX2VudHJpZXMpIHsKKyAgICAgICAgc21iaW9zX2VudHJpZXNfbGVuID0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgc21iaW9zX2VudHJpZXMgPSBnX21hbGxvYzAoc21iaW9zX2VudHJpZXNfbGVuKTsKKyAgICB9CisgICAgc21iaW9zX2VudHJpZXMgPSBnX3JlYWxsb2Moc21iaW9zX2VudHJpZXMsIHNtYmlvc19lbnRyaWVzX2xlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZmllbGQpICsgbGVuKTsKKyAgICBmaWVsZCA9IChzdHJ1Y3Qgc21iaW9zX2ZpZWxkICopKHNtYmlvc19lbnRyaWVzICsgc21iaW9zX2VudHJpZXNfbGVuKTsKKyAgICBmaWVsZC0+aGVhZGVyLnR5cGUgPSBTTUJJT1NfRklFTERfRU5UUlk7CisgICAgZmllbGQtPmhlYWRlci5sZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoKmZpZWxkKSArIGxlbik7CisKKyAgICBmaWVsZC0+dHlwZSA9IHR5cGU7CisgICAgZmllbGQtPm9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldCk7CisgICAgbWVtY3B5KGZpZWxkLT5kYXRhLCBkYXRhLCBsZW4pOworCisgICAgc21iaW9zX2VudHJpZXNfbGVuICs9IHNpemVvZigqZmllbGQpICsgbGVuOworICAgICgqKHVpbnQxNl90ICopc21iaW9zX2VudHJpZXMpID0KKyAgICAgICAgICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KCoodWludDE2X3QgKilzbWJpb3NfZW50cmllcykgKyAxKTsKK30KKworc3RhdGljIHZvaWQgc21iaW9zX2J1aWxkX3R5cGVfMF9maWVsZHMoY29uc3QgY2hhciAqdCkKK3sKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgInZlbmRvciIsIHQpKQorICAgICAgICBzbWJpb3NfYWRkX2ZpZWxkKDAsIG9mZnNldG9mKHN0cnVjdCBzbWJpb3NfdHlwZV8wLCB2ZW5kb3Jfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmKSArIDEsIGJ1Zik7CisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAidmVyc2lvbiIsIHQpKQorICAgICAgICBzbWJpb3NfYWRkX2ZpZWxkKDAsIG9mZnNldG9mKHN0cnVjdCBzbWJpb3NfdHlwZV8wLCBiaW9zX3ZlcnNpb25fc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmKSArIDEsIGJ1Zik7CisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiZGF0ZSIsIHQpKQorICAgICAgICBzbWJpb3NfYWRkX2ZpZWxkKDAsIG9mZnNldG9mKHN0cnVjdCBzbWJpb3NfdHlwZV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpb3NfcmVsZWFzZV9kYXRlX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJ1ZikgKyAxLCBidWYpOworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgInJlbGVhc2UiLCB0KSkgeworICAgICAgICBpbnQgbWFqb3IsIG1pbm9yOworICAgICAgICBzc2NhbmYoYnVmLCAiJWQuJWQiLCAmbWFqb3IsICZtaW5vcik7CisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMCwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2Jpb3NfbWFqb3JfcmVsZWFzZSksIDEsICZtYWpvcik7CisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMCwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtX2Jpb3NfbWlub3JfcmVsZWFzZSksIDEsICZtaW5vcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzbWJpb3NfYnVpbGRfdHlwZV8xX2ZpZWxkcyhjb25zdCBjaGFyICp0KQoreworICAgIGNoYXIgYnVmWzEwMjRdOworCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAibWFudWZhY3R1cmVyIiwgdCkpCisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMSwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzEsIG1hbnVmYWN0dXJlcl9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICsgMSwgYnVmKTsKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJwcm9kdWN0IiwgdCkpCisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMSwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzEsIHByb2R1Y3RfbmFtZV9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICsgMSwgYnVmKTsKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ2ZXJzaW9uIiwgdCkpCisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMSwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzEsIHZlcnNpb25fc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmKSArIDEsIGJ1Zik7CisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAic2VyaWFsIiwgdCkpCisgICAgICAgIHNtYmlvc19hZGRfZmllbGQoMSwgb2Zmc2V0b2Yoc3RydWN0IHNtYmlvc190eXBlXzEsIHNlcmlhbF9udW1iZXJfc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oYnVmKSArIDEsIGJ1Zik7CisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAidXVpZCIsIHQpKSB7CisgICAgICAgIGlmIChxZW11X3V1aWRfcGFyc2UoYnVmLCBxZW11X3V1aWQpICE9IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBTTUJJT1MgVVVJRCBzdHJpbmdcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJza3UiLCB0KSkKKyAgICAgICAgc21iaW9zX2FkZF9maWVsZCgxLCBvZmZzZXRvZihzdHJ1Y3Qgc21iaW9zX3R5cGVfMSwgc2t1X251bWJlcl9zdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihidWYpICsgMSwgYnVmKTsKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmYW1pbHkiLCB0KSkKKyAgICAgICAgc21iaW9zX2FkZF9maWVsZCgxLCBvZmZzZXRvZihzdHJ1Y3Qgc21iaW9zX3R5cGVfMSwgZmFtaWx5X3N0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJ1ZikgKyAxLCBidWYpOworfQorCitpbnQgc21iaW9zX2VudHJ5X2FkZChjb25zdCBjaGFyICp0KQoreworICAgIGNoYXIgYnVmWzEwMjRdOworCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiZmlsZSIsIHQpKSB7CisgICAgICAgIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciAqaGVhZGVyOworICAgICAgICBzdHJ1Y3Qgc21iaW9zX3RhYmxlICp0YWJsZTsKKyAgICAgICAgaW50IHNpemUgPSBnZXRfaW1hZ2Vfc2l6ZShidWYpOworCisgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlcikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgc21iaW9zIGZpbGUgJXMiLCBidWYpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc21iaW9zX2VudHJpZXMpIHsKKyAgICAgICAgICAgIHNtYmlvc19lbnRyaWVzX2xlbiA9IHNpemVvZih1aW50MTZfdCk7CisgICAgICAgICAgICBzbWJpb3NfZW50cmllcyA9IGdfbWFsbG9jMChzbWJpb3NfZW50cmllc19sZW4pOworICAgICAgICB9CisKKyAgICAgICAgc21iaW9zX2VudHJpZXMgPSBnX3JlYWxsb2Moc21iaW9zX2VudHJpZXMsIHNtYmlvc19lbnRyaWVzX2xlbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnRhYmxlKSArIHNpemUpOworICAgICAgICB0YWJsZSA9IChzdHJ1Y3Qgc21iaW9zX3RhYmxlICopKHNtYmlvc19lbnRyaWVzICsgc21iaW9zX2VudHJpZXNfbGVuKTsKKyAgICAgICAgdGFibGUtPmhlYWRlci50eXBlID0gU01CSU9TX1RBQkxFX0VOVFJZOworICAgICAgICB0YWJsZS0+aGVhZGVyLmxlbmd0aCA9IGNwdV90b19sZTE2KHNpemVvZigqdGFibGUpICsgc2l6ZSk7CisKKyAgICAgICAgaWYgKGxvYWRfaW1hZ2UoYnVmLCB0YWJsZS0+ZGF0YSkgIT0gc2l6ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gbG9hZCBzbWJpb3MgZmlsZSAlcyIsIGJ1Zik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgaGVhZGVyID0gKHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciAqKSh0YWJsZS0+ZGF0YSk7CisgICAgICAgIHNtYmlvc19jaGVja19jb2xsaXNpb24oaGVhZGVyLT50eXBlLCBTTUJJT1NfVEFCTEVfRU5UUlkpOworCisgICAgICAgIHNtYmlvc19lbnRyaWVzX2xlbiArPSBzaXplb2YoKnRhYmxlKSArIHNpemU7CisgICAgICAgICgqKHVpbnQxNl90ICopc21iaW9zX2VudHJpZXMpID0KKyAgICAgICAgICAgICAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdSgqKHVpbnQxNl90ICopc21iaW9zX2VudHJpZXMpICsgMSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgInR5cGUiLCB0KSkgeworICAgICAgICB1bnNpZ25lZCBsb25nIHR5cGUgPSBzdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzbWJpb3NfYnVpbGRfdHlwZV8wX2ZpZWxkcyh0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzbWJpb3NfYnVpbGRfdHlwZV8xX2ZpZWxkcyh0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEb24ndCBrbm93IGhvdyB0byBidWlsZCBmaWVsZHMgZm9yIFNNQklPUyB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgIiVsZFxuIiwgdHlwZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsICJzbWJpb3M6IG11c3Qgc3BlY2lmeSB0eXBlPSBvciBmaWxlPVxuIik7CisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9pbnB1dC9wY2tiZC5jIGIvYW5kcm9pZC9xZW11MS9ody9pbnB1dC9wY2tiZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWZmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2lucHV0L3Bja2JkLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qCisgKiBRRU1VIFBDIGtleWJvYXJkIGVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAiaHcvaW5wdXQvcHMyLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisvKiBkZWJ1ZyBQQyBrZXlib2FyZCAqLworLy8jZGVmaW5lIERFQlVHX0tCRAorCisvKglLZXlib2FyZCBDb250cm9sbGVyIENvbW1hbmRzICovCisjZGVmaW5lIEtCRF9DQ01EX1JFQURfTU9ERQkweDIwCS8qIFJlYWQgbW9kZSBiaXRzICovCisjZGVmaW5lIEtCRF9DQ01EX1dSSVRFX01PREUJMHg2MAkvKiBXcml0ZSBtb2RlIGJpdHMgKi8KKyNkZWZpbmUgS0JEX0NDTURfR0VUX1ZFUlNJT04JMHhBMQkvKiBHZXQgY29udHJvbGxlciB2ZXJzaW9uICovCisjZGVmaW5lIEtCRF9DQ01EX01PVVNFX0RJU0FCTEUJMHhBNwkvKiBEaXNhYmxlIG1vdXNlIGludGVyZmFjZSAqLworI2RlZmluZSBLQkRfQ0NNRF9NT1VTRV9FTkFCTEUJMHhBOAkvKiBFbmFibGUgbW91c2UgaW50ZXJmYWNlICovCisjZGVmaW5lIEtCRF9DQ01EX1RFU1RfTU9VU0UJMHhBOQkvKiBNb3VzZSBpbnRlcmZhY2UgdGVzdCAqLworI2RlZmluZSBLQkRfQ0NNRF9TRUxGX1RFU1QJMHhBQQkvKiBDb250cm9sbGVyIHNlbGYgdGVzdCAqLworI2RlZmluZSBLQkRfQ0NNRF9LQkRfVEVTVAkweEFCCS8qIEtleWJvYXJkIGludGVyZmFjZSB0ZXN0ICovCisjZGVmaW5lIEtCRF9DQ01EX0tCRF9ESVNBQkxFCTB4QUQJLyogS2V5Ym9hcmQgaW50ZXJmYWNlIGRpc2FibGUgKi8KKyNkZWZpbmUgS0JEX0NDTURfS0JEX0VOQUJMRQkweEFFCS8qIEtleWJvYXJkIGludGVyZmFjZSBlbmFibGUgKi8KKyNkZWZpbmUgS0JEX0NDTURfUkVBRF9JTlBPUlQgICAgMHhDMCAgICAvKiByZWFkIGlucHV0IHBvcnQgKi8KKyNkZWZpbmUgS0JEX0NDTURfUkVBRF9PVVRQT1JUCTB4RDAgICAgLyogcmVhZCBvdXRwdXQgcG9ydCAqLworI2RlZmluZSBLQkRfQ0NNRF9XUklURV9PVVRQT1JUCTB4RDEgICAgLyogd3JpdGUgb3V0cHV0IHBvcnQgKi8KKyNkZWZpbmUgS0JEX0NDTURfV1JJVEVfT0JVRgkweEQyCisjZGVmaW5lIEtCRF9DQ01EX1dSSVRFX0FVWF9PQlVGCTB4RDMgICAgLyogV3JpdGUgdG8gb3V0cHV0IGJ1ZmZlciBhcyBpZgorCQkJCQkgICBpbml0aWF0ZWQgYnkgdGhlIGF1eGlsaWFyeSBkZXZpY2UgKi8KKyNkZWZpbmUgS0JEX0NDTURfV1JJVEVfTU9VU0UJMHhENAkvKiBXcml0ZSB0aGUgZm9sbG93aW5nIGJ5dGUgdG8gdGhlIG1vdXNlICovCisjZGVmaW5lIEtCRF9DQ01EX0RJU0FCTEVfQTIwICAgIDB4REQgICAgLyogSFAgdmVjdHJhIG9ubHkgPyAqLworI2RlZmluZSBLQkRfQ0NNRF9FTkFCTEVfQTIwICAgICAweERGICAgIC8qIEhQIHZlY3RyYSBvbmx5ID8gKi8KKyNkZWZpbmUgS0JEX0NDTURfUkVTRVQJICAgICAgICAweEZFCisKKy8qIEtleWJvYXJkIENvbW1hbmRzICovCisjZGVmaW5lIEtCRF9DTURfU0VUX0xFRFMJMHhFRAkvKiBTZXQga2V5Ym9hcmQgbGVkcyAqLworI2RlZmluZSBLQkRfQ01EX0VDSE8gICAgIAkweEVFCisjZGVmaW5lIEtCRF9DTURfR0VUX0lEIAkgICAgICAgIDB4RjIJLyogZ2V0IGtleWJvYXJkIElEICovCisjZGVmaW5lIEtCRF9DTURfU0VUX1JBVEUJMHhGMwkvKiBTZXQgdHlwZW1hdGljIHJhdGUgKi8KKyNkZWZpbmUgS0JEX0NNRF9FTkFCTEUJCTB4RjQJLyogRW5hYmxlIHNjYW5uaW5nICovCisjZGVmaW5lIEtCRF9DTURfUkVTRVRfRElTQUJMRQkweEY1CS8qIHJlc2V0IGFuZCBkaXNhYmxlIHNjYW5uaW5nICovCisjZGVmaW5lIEtCRF9DTURfUkVTRVRfRU5BQkxFICAgCTB4RjYgICAgLyogcmVzZXQgYW5kIGVuYWJsZSBzY2FubmluZyAqLworI2RlZmluZSBLQkRfQ01EX1JFU0VUCQkweEZGCS8qIFJlc2V0ICovCisKKy8qIEtleWJvYXJkIFJlcGxpZXMgKi8KKyNkZWZpbmUgS0JEX1JFUExZX1BPUgkJMHhBQQkvKiBQb3dlciBvbiByZXNldCAqLworI2RlZmluZSBLQkRfUkVQTFlfQUNLCQkweEZBCS8qIENvbW1hbmQgQUNLICovCisjZGVmaW5lIEtCRF9SRVBMWV9SRVNFTkQJMHhGRQkvKiBDb21tYW5kIE5BQ0ssIHNlbmQgdGhlIGNtZCBhZ2FpbiAqLworCisvKiBTdGF0dXMgUmVnaXN0ZXIgQml0cyAqLworI2RlZmluZSBLQkRfU1RBVF9PQkYgCQkweDAxCS8qIEtleWJvYXJkIG91dHB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZSBLQkRfU1RBVF9JQkYgCQkweDAyCS8qIEtleWJvYXJkIGlucHV0IGJ1ZmZlciBmdWxsICovCisjZGVmaW5lIEtCRF9TVEFUX1NFTEZURVNUCTB4MDQJLyogU2VsZiB0ZXN0IHN1Y2Nlc3NmdWwgKi8KKyNkZWZpbmUgS0JEX1NUQVRfQ01ECQkweDA4CS8qIExhc3Qgd3JpdGUgd2FzIGEgY29tbWFuZCB3cml0ZSAoMD1kYXRhKSAqLworI2RlZmluZSBLQkRfU1RBVF9VTkxPQ0tFRAkweDEwCS8qIFplcm8gaWYga2V5Ym9hcmQgbG9ja2VkICovCisjZGVmaW5lIEtCRF9TVEFUX01PVVNFX09CRgkweDIwCS8qIE1vdXNlIG91dHB1dCBidWZmZXIgZnVsbCAqLworI2RlZmluZSBLQkRfU1RBVF9HVE8gCQkweDQwCS8qIEdlbmVyYWwgcmVjZWl2ZS94bWl0IHRpbWVvdXQgKi8KKyNkZWZpbmUgS0JEX1NUQVRfUEVSUiAJCTB4ODAJLyogUGFyaXR5IGVycm9yICovCisKKy8qIENvbnRyb2xsZXIgTW9kZSBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIEtCRF9NT0RFX0tCRF9JTlQJMHgwMQkvKiBLZXlib2FyZCBkYXRhIGdlbmVyYXRlIElSUTEgKi8KKyNkZWZpbmUgS0JEX01PREVfTU9VU0VfSU5UCTB4MDIJLyogTW91c2UgZGF0YSBnZW5lcmF0ZSBJUlExMiAqLworI2RlZmluZSBLQkRfTU9ERV9TWVMgCQkweDA0CS8qIFRoZSBzeXN0ZW0gZmxhZyAoPykgKi8KKyNkZWZpbmUgS0JEX01PREVfTk9fS0VZTE9DSwkweDA4CS8qIFRoZSBrZXlsb2NrIGRvZXNuJ3QgYWZmZWN0IHRoZSBrZXlib2FyZCBpZiBzZXQgKi8KKyNkZWZpbmUgS0JEX01PREVfRElTQUJMRV9LQkQJMHgxMAkvKiBEaXNhYmxlIGtleWJvYXJkIGludGVyZmFjZSAqLworI2RlZmluZSBLQkRfTU9ERV9ESVNBQkxFX01PVVNFCTB4MjAJLyogRGlzYWJsZSBtb3VzZSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgS0JEX01PREVfS0NDIAkJMHg0MAkvKiBTY2FuIGNvZGUgY29udmVyc2lvbiB0byBQQyBmb3JtYXQgKi8KKyNkZWZpbmUgS0JEX01PREVfUkZVCQkweDgwCisKKy8qIE1vdXNlIENvbW1hbmRzICovCisjZGVmaW5lIEFVWF9TRVRfU0NBTEUxMQkJMHhFNgkvKiBTZXQgMToxIHNjYWxpbmcgKi8KKyNkZWZpbmUgQVVYX1NFVF9TQ0FMRTIxCQkweEU3CS8qIFNldCAyOjEgc2NhbGluZyAqLworI2RlZmluZSBBVVhfU0VUX1JFUwkJMHhFOAkvKiBTZXQgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBVVhfR0VUX1NDQUxFCQkweEU5CS8qIEdldCBzY2FsaW5nIGZhY3RvciAqLworI2RlZmluZSBBVVhfU0VUX1NUUkVBTQkJMHhFQQkvKiBTZXQgc3RyZWFtIG1vZGUgKi8KKyNkZWZpbmUgQVVYX1BPTEwJCTB4RUIJLyogUG9sbCAqLworI2RlZmluZSBBVVhfUkVTRVRfV1JBUAkJMHhFQwkvKiBSZXNldCB3cmFwIG1vZGUgKi8KKyNkZWZpbmUgQVVYX1NFVF9XUkFQCQkweEVFCS8qIFNldCB3cmFwIG1vZGUgKi8KKyNkZWZpbmUgQVVYX1NFVF9SRU1PVEUJCTB4RjAJLyogU2V0IHJlbW90ZSBtb2RlICovCisjZGVmaW5lIEFVWF9HRVRfVFlQRQkJMHhGMgkvKiBHZXQgdHlwZSAqLworI2RlZmluZSBBVVhfU0VUX1NBTVBMRQkJMHhGMwkvKiBTZXQgc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgQVVYX0VOQUJMRV9ERVYJCTB4RjQJLyogRW5hYmxlIGF1eCBkZXZpY2UgKi8KKyNkZWZpbmUgQVVYX0RJU0FCTEVfREVWCQkweEY1CS8qIERpc2FibGUgYXV4IGRldmljZSAqLworI2RlZmluZSBBVVhfU0VUX0RFRkFVTFQJCTB4RjYKKyNkZWZpbmUgQVVYX1JFU0VUCQkweEZGCS8qIFJlc2V0IGF1eCBkZXZpY2UgKi8KKyNkZWZpbmUgQVVYX0FDSwkJCTB4RkEJLyogQ29tbWFuZCBieXRlIEFDSy4gKi8KKworI2RlZmluZSBNT1VTRV9TVEFUVVNfUkVNT1RFICAgICAweDQwCisjZGVmaW5lIE1PVVNFX1NUQVRVU19FTkFCTEVEICAgIDB4MjAKKyNkZWZpbmUgTU9VU0VfU1RBVFVTX1NDQUxFMjEgICAgMHgxMAorCisjZGVmaW5lIEtCRF9QRU5ESU5HX0tCRCAgICAgICAgIDEKKyNkZWZpbmUgS0JEX1BFTkRJTkdfQVVYICAgICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBLQkRTdGF0ZSB7CisgICAgdWludDhfdCB3cml0ZV9jbWQ7IC8qIGlmIG5vbiB6ZXJvLCB3cml0ZSBkYXRhIHRvIHBvcnQgNjAgaXMgZXhwZWN0ZWQgKi8KKyAgICB1aW50OF90IHN0YXR1czsKKyAgICB1aW50OF90IG1vZGU7CisgICAgLyogQml0bWFzayBvZiBkZXZpY2VzIHdpdGggZGF0YSBhdmFpbGFibGUuICAqLworICAgIHVpbnQ4X3QgcGVuZGluZzsKKyAgICB2b2lkICprYmQ7CisgICAgdm9pZCAqbW91c2U7CisKKyAgICBxZW11X2lycSBpcnFfa2JkOworICAgIHFlbXVfaXJxIGlycV9tb3VzZTsKKyAgICBod2FkZHIgbWFzazsKK30gS0JEU3RhdGU7CisKK3N0YXRpYyBLQkRTdGF0ZSBrYmRfc3RhdGU7CisKKy8qIHVwZGF0ZSBpcnEgYW5kIEtCRF9TVEFUX1tNT1VTRV9dT0JGICovCisvKiBYWFg6IG5vdCBnZW5lcmF0aW5nIHRoZSBpcnFzIGlmIEtCRF9NT0RFX0RJU0FCTEVfS0JEIGlzIHNldCBtYXkgYmUKKyAgIGluY29ycmVjdCwgYnV0IGl0IGF2b2lkcyBoYXZpbmcgdG8gc2ltdWxhdGUgZXhhY3QgZGVsYXlzICovCitzdGF0aWMgdm9pZCBrYmRfdXBkYXRlX2lycShLQkRTdGF0ZSAqcykKK3sKKyAgICBpbnQgaXJxX2tiZF9sZXZlbCwgaXJxX21vdXNlX2xldmVsOworCisgICAgaXJxX2tiZF9sZXZlbCA9IDA7CisgICAgaXJxX21vdXNlX2xldmVsID0gMDsKKyAgICBzLT5zdGF0dXMgJj0gfihLQkRfU1RBVF9PQkYgfCBLQkRfU1RBVF9NT1VTRV9PQkYpOworICAgIGlmIChzLT5wZW5kaW5nKSB7CisgICAgICAgIHMtPnN0YXR1cyB8PSBLQkRfU1RBVF9PQkY7CisgICAgICAgIC8qIGtiZCBkYXRhIHRha2VzIHByaW9yaXR5IG92ZXIgYXV4IGRhdGEuICAqLworICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBLQkRfUEVORElOR19BVVgpIHsKKyAgICAgICAgICAgIHMtPnN0YXR1cyB8PSBLQkRfU1RBVF9NT1VTRV9PQkY7CisgICAgICAgICAgICBpZiAocy0+bW9kZSAmIEtCRF9NT0RFX01PVVNFX0lOVCkKKyAgICAgICAgICAgICAgICBpcnFfbW91c2VfbGV2ZWwgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKChzLT5tb2RlICYgS0JEX01PREVfS0JEX0lOVCkgJiYKKyAgICAgICAgICAgICAgICAhKHMtPm1vZGUgJiBLQkRfTU9ERV9ESVNBQkxFX0tCRCkpCisgICAgICAgICAgICAgICAgaXJxX2tiZF9sZXZlbCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcWVtdV9zZXRfaXJxKHMtPmlycV9rYmQsIGlycV9rYmRfbGV2ZWwpOworICAgIHFlbXVfc2V0X2lycShzLT5pcnFfbW91c2UsIGlycV9tb3VzZV9sZXZlbCk7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF91cGRhdGVfa2JkX2lycSh2b2lkICpvcGFxdWUsIGludCBsZXZlbCkKK3sKKyAgICBLQkRTdGF0ZSAqcyA9IChLQkRTdGF0ZSAqKW9wYXF1ZTsKKworICAgIGlmIChsZXZlbCkKKyAgICAgICAgcy0+cGVuZGluZyB8PSBLQkRfUEVORElOR19LQkQ7CisgICAgZWxzZQorICAgICAgICBzLT5wZW5kaW5nICY9IH5LQkRfUEVORElOR19LQkQ7CisgICAga2JkX3VwZGF0ZV9pcnEocyk7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF91cGRhdGVfYXV4X2lycSh2b2lkICpvcGFxdWUsIGludCBsZXZlbCkKK3sKKyAgICBLQkRTdGF0ZSAqcyA9IChLQkRTdGF0ZSAqKW9wYXF1ZTsKKworICAgIGlmIChsZXZlbCkKKyAgICAgICAgcy0+cGVuZGluZyB8PSBLQkRfUEVORElOR19BVVg7CisgICAgZWxzZQorICAgICAgICBzLT5wZW5kaW5nICY9IH5LQkRfUEVORElOR19BVVg7CisgICAga2JkX3VwZGF0ZV9pcnEocyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBrYmRfcmVhZF9zdGF0dXModm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIEtCRFN0YXRlICpzID0gb3BhcXVlOworICAgIGludCB2YWw7CisgICAgdmFsID0gcy0+c3RhdHVzOworI2lmIGRlZmluZWQoREVCVUdfS0JEKQorICAgIHByaW50Zigia2JkOiByZWFkIHN0YXR1cz0weCUwMnhcbiIsIHZhbCk7CisjZW5kaWYKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBrYmRfcXVldWUoS0JEU3RhdGUgKnMsIGludCBiLCBpbnQgYXV4KQoreworICAgIGlmIChhdXgpCisgICAgICAgIHBzMl9xdWV1ZShzLT5tb3VzZSwgYik7CisgICAgZWxzZQorICAgICAgICBwczJfcXVldWUocy0+a2JkLCBiKTsKK30KKworc3RhdGljIHZvaWQga2JkX3dyaXRlX2NvbW1hbmQodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgS0JEU3RhdGUgKnMgPSBvcGFxdWU7CisKKyNpZmRlZiBERUJVR19LQkQKKyAgICBwcmludGYoImtiZDogd3JpdGUgY21kPTB4JTAyeFxuIiwgdmFsKTsKKyNlbmRpZgorICAgIHN3aXRjaCh2YWwpIHsKKyAgICBjYXNlIEtCRF9DQ01EX1JFQURfTU9ERToKKyAgICAgICAga2JkX3F1ZXVlKHMsIHMtPm1vZGUsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX1dSSVRFX01PREU6CisgICAgY2FzZSBLQkRfQ0NNRF9XUklURV9PQlVGOgorICAgIGNhc2UgS0JEX0NDTURfV1JJVEVfQVVYX09CVUY6CisgICAgY2FzZSBLQkRfQ0NNRF9XUklURV9NT1VTRToKKyAgICBjYXNlIEtCRF9DQ01EX1dSSVRFX09VVFBPUlQ6CisgICAgICAgIHMtPndyaXRlX2NtZCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9NT1VTRV9ESVNBQkxFOgorICAgICAgICBzLT5tb2RlIHw9IEtCRF9NT0RFX0RJU0FCTEVfTU9VU0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NDTURfTU9VU0VfRU5BQkxFOgorICAgICAgICBzLT5tb2RlICY9IH5LQkRfTU9ERV9ESVNBQkxFX01PVVNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX1RFU1RfTU9VU0U6CisgICAgICAgIGtiZF9xdWV1ZShzLCAweDAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9TRUxGX1RFU1Q6CisgICAgICAgIHMtPnN0YXR1cyB8PSBLQkRfU1RBVF9TRUxGVEVTVDsKKyAgICAgICAga2JkX3F1ZXVlKHMsIDB4NTUsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX0tCRF9URVNUOgorICAgICAgICBrYmRfcXVldWUocywgMHgwMCwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NDTURfS0JEX0RJU0FCTEU6CisgICAgICAgIHMtPm1vZGUgfD0gS0JEX01PREVfRElTQUJMRV9LQkQ7CisgICAgICAgIGtiZF91cGRhdGVfaXJxKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX0tCRF9FTkFCTEU6CisgICAgICAgIHMtPm1vZGUgJj0gfktCRF9NT0RFX0RJU0FCTEVfS0JEOworICAgICAgICBrYmRfdXBkYXRlX2lycShzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9SRUFEX0lOUE9SVDoKKyAgICAgICAga2JkX3F1ZXVlKHMsIDB4MDAsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX1JFQURfT1VUUE9SVDoKKyAgICAgICAgLyogWFhYOiBjaGVjayB0aGF0ICovCisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICAgICAgdmFsID0gMHgwMSB8IChpb3BvcnRfZ2V0X2EyMCgpIDw8IDEpOworI2Vsc2UKKyAgICAgICAgdmFsID0gMHgwMTsKKyNlbmRpZgorICAgICAgICBpZiAocy0+c3RhdHVzICYgS0JEX1NUQVRfT0JGKQorICAgICAgICAgICAgdmFsIHw9IDB4MTA7CisgICAgICAgIGlmIChzLT5zdGF0dXMgJiBLQkRfU1RBVF9NT1VTRV9PQkYpCisgICAgICAgICAgICB2YWwgfD0gMHgyMDsKKyAgICAgICAga2JkX3F1ZXVlKHMsIHZhbCwgMCk7CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgY2FzZSBLQkRfQ0NNRF9FTkFCTEVfQTIwOgorICAgICAgICBpb3BvcnRfc2V0X2EyMCgxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9ESVNBQkxFX0EyMDoKKyAgICAgICAgaW9wb3J0X3NldF9hMjAoMCk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBLQkRfQ0NNRF9SRVNFVDoKKyAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZmY6CisgICAgICAgIC8qIGlnbm9yZSB0aGF0IC0gSSBkb24ndCBrbm93IHdoYXQgaXMgaXRzIHVzZSAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHVuc3VwcG9ydGVkIGtleWJvYXJkIGNtZD0weCUwMnhcbiIsIHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IGtiZF9yZWFkX2RhdGEodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIEtCRFN0YXRlICpzID0gb3BhcXVlOworICAgIHVpbnQzMl90IHZhbDsKKworICAgIGlmIChzLT5wZW5kaW5nID09IEtCRF9QRU5ESU5HX0FVWCkKKyAgICAgICAgdmFsID0gcHMyX3JlYWRfZGF0YShzLT5tb3VzZSk7CisgICAgZWxzZQorICAgICAgICB2YWwgPSBwczJfcmVhZF9kYXRhKHMtPmtiZCk7CisKKyNpZiBkZWZpbmVkKERFQlVHX0tCRCkKKyAgICBwcmludGYoImtiZDogcmVhZCBkYXRhPTB4JTAyeFxuIiwgdmFsKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF93cml0ZV9kYXRhKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIEtCRFN0YXRlICpzID0gb3BhcXVlOworCisjaWZkZWYgREVCVUdfS0JECisgICAgcHJpbnRmKCJrYmQ6IHdyaXRlIGRhdGE9MHglMDJ4XG4iLCB2YWwpOworI2VuZGlmCisKKyAgICBzd2l0Y2gocy0+d3JpdGVfY21kKSB7CisgICAgY2FzZSAwOgorICAgICAgICBwczJfd3JpdGVfa2V5Ym9hcmQocy0+a2JkLCB2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX1dSSVRFX01PREU6CisgICAgICAgIHMtPm1vZGUgPSB2YWw7CisgICAgICAgIHBzMl9rZXlib2FyZF9zZXRfdHJhbnNsYXRpb24ocy0+a2JkLCAocy0+bW9kZSAmIEtCRF9NT0RFX0tDQykgIT0gMCk7CisgICAgICAgIC8qID8/PyAqLworICAgICAgICBrYmRfdXBkYXRlX2lycShzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9XUklURV9PQlVGOgorICAgICAgICBrYmRfcXVldWUocywgdmFsLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLQkRfQ0NNRF9XUklURV9BVVhfT0JVRjoKKyAgICAgICAga2JkX3F1ZXVlKHMsIHZhbCwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NDTURfV1JJVEVfT1VUUE9SVDoKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgICAgICBpb3BvcnRfc2V0X2EyMCgodmFsID4+IDEpICYgMSk7CisjZW5kaWYKKyAgICAgICAgaWYgKCEodmFsICYgMSkpIHsKKyAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEtCRF9DQ01EX1dSSVRFX01PVVNFOgorICAgICAgICBwczJfd3JpdGVfbW91c2Uocy0+bW91c2UsIHZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzLT53cml0ZV9jbWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBrYmRfcmVzZXQodm9pZCAqb3BhcXVlKQoreworICAgIEtCRFN0YXRlICpzID0gb3BhcXVlOworCisgICAgcy0+bW9kZSA9IEtCRF9NT0RFX0tCRF9JTlQgfCBLQkRfTU9ERV9NT1VTRV9JTlQ7CisgICAgcy0+c3RhdHVzID0gS0JEX1NUQVRfQ01EIHwgS0JEX1NUQVRfVU5MT0NLRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGtiZF9zYXZlKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUpCit7CisgICAgS0JEU3RhdGUgKnMgPSAoS0JEU3RhdGUqKW9wYXF1ZTsKKworICAgIHFlbXVfcHV0XzhzKGYsICZzLT53cml0ZV9jbWQpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5zdGF0dXMpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5tb2RlKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+cGVuZGluZyk7Cit9CisKK3N0YXRpYyBpbnQga2JkX2xvYWQoUUVNVUZpbGUqIGYsIHZvaWQqIG9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgS0JEU3RhdGUgKnMgPSAoS0JEU3RhdGUqKW9wYXF1ZTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IDMpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT53cml0ZV9jbWQpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5zdGF0dXMpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5tb2RlKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+cGVuZGluZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaTgwNDJfaW5pdChxZW11X2lycSBrYmRfaXJxLCBxZW11X2lycSBtb3VzZV9pcnEsIHVpbnQzMl90IGlvX2Jhc2UpCit7CisgICAgS0JEU3RhdGUgKnMgPSAma2JkX3N0YXRlOworCisgICAgcy0+aXJxX2tiZCA9IGtiZF9pcnE7CisgICAgcy0+aXJxX21vdXNlID0gbW91c2VfaXJxOworCisgICAga2JkX3Jlc2V0KHMpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAicGNrYmQiLCAwLCAzLCBrYmRfc2F2ZSwga2JkX2xvYWQsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKGlvX2Jhc2UsIDEsIDEsIGtiZF9yZWFkX2RhdGEsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShpb19iYXNlLCAxLCAxLCBrYmRfd3JpdGVfZGF0YSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoaW9fYmFzZSArIDQsIDEsIDEsIGtiZF9yZWFkX3N0YXR1cywgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGlvX2Jhc2UgKyA0LCAxLCAxLCBrYmRfd3JpdGVfY29tbWFuZCwgcyk7CisKKyAgICBzLT5rYmQgPSBwczJfa2JkX2luaXQoa2JkX3VwZGF0ZV9rYmRfaXJxLCBzKTsKKyAgICBzLT5tb3VzZSA9IHBzMl9tb3VzZV9pbml0KGtiZF91cGRhdGVfYXV4X2lycSwgcyk7CisjaWZuZGVmIENPTkZJR19BTkRST0lECisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICB2bW1vdXNlX2luaXQocy0+bW91c2UpOworI2VuZGlmCisjZW5kaWYKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KGtiZF9yZXNldCwgMCwgcyk7Cit9CisKKy8qIE1lbW9yeSBtYXBwZWQgaW50ZXJmYWNlICovCitzdGF0aWMgdWludDMyX3Qga2JkX21tX3JlYWRiICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyKQoreworICAgIEtCRFN0YXRlICpzID0gb3BhcXVlOworCisgICAgaWYgKGFkZHIgJiBzLT5tYXNrKQorICAgICAgICByZXR1cm4ga2JkX3JlYWRfc3RhdHVzKHMsIDApICYgMHhmZjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBrYmRfcmVhZF9kYXRhKHMsIDApICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQga2JkX21tX3dyaXRlYiAodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdWludDMyX3QgdmFsdWUpCit7CisgICAgS0JEU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAoYWRkciAmIHMtPm1hc2spCisgICAgICAgIGtiZF93cml0ZV9jb21tYW5kKHMsIDAsIHZhbHVlICYgMHhmZik7CisgICAgZWxzZQorICAgICAgICBrYmRfd3JpdGVfZGF0YShzLCAwLCB2YWx1ZSAmIDB4ZmYpOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmtiZF9tbV9yZWFkW10gPSB7CisgICAgJmtiZF9tbV9yZWFkYiwKKyAgICAma2JkX21tX3JlYWRiLAorICAgICZrYmRfbW1fcmVhZGIsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICprYmRfbW1fd3JpdGVbXSA9IHsKKyAgICAma2JkX21tX3dyaXRlYiwKKyAgICAma2JkX21tX3dyaXRlYiwKKyAgICAma2JkX21tX3dyaXRlYiwKK307CisKK3ZvaWQgaTgwNDJfbW1faW5pdChxZW11X2lycSBrYmRfaXJxLCBxZW11X2lycSBtb3VzZV9pcnEsCisgICAgICAgICAgICAgICAgICAgaHdhZGRyIGJhc2UsIHJhbV9hZGRyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBod2FkZHIgbWFzaykKK3sKKyAgICBLQkRTdGF0ZSAqcyA9ICZrYmRfc3RhdGU7CisgICAgaW50IHNfaW9fbWVtb3J5OworCisgICAgcy0+aXJxX2tiZCA9IGtiZF9pcnE7CisgICAgcy0+aXJxX21vdXNlID0gbW91c2VfaXJxOworICAgIHMtPm1hc2sgPSBtYXNrOworCisgICAga2JkX3Jlc2V0KHMpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAicGNrYmQiLCAwLCAzLCBrYmRfc2F2ZSwga2JkX2xvYWQsIHMpOworICAgIHNfaW9fbWVtb3J5ID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShrYmRfbW1fcmVhZCwga2JkX21tX3dyaXRlLCBzKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGJhc2UsIHNpemUsIHNfaW9fbWVtb3J5KTsKKworICAgIHMtPmtiZCA9IHBzMl9rYmRfaW5pdChrYmRfdXBkYXRlX2tiZF9pcnEsIHMpOworICAgIHMtPm1vdXNlID0gcHMyX21vdXNlX2luaXQoa2JkX3VwZGF0ZV9hdXhfaXJxLCBzKTsKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgIHZtbW91c2VfaW5pdChzLT5tb3VzZSk7CisjZW5kaWYKKyNlbmRpZgorICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQoa2JkX3Jlc2V0LCAwLCBzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvaW5wdXQvcHMyLmMgYi9hbmRyb2lkL3FlbXUxL2h3L2lucHV0L3BzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGFiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2lucHV0L3BzMi5jCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogUUVNVSBQUy8yIGtleWJvYXJkL21vdXNlIGVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2lucHV0L3BzMi5oIgorI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKKworLyogZGVidWcgUEMga2V5Ym9hcmQgKi8KKy8vI2RlZmluZSBERUJVR19LQkQKKworLyogZGVidWcgUEMga2V5Ym9hcmQgOiBvbmx5IG1vdXNlICovCisvLyNkZWZpbmUgREVCVUdfTU9VU0UKKworLyogS2V5Ym9hcmQgQ29tbWFuZHMgKi8KKyNkZWZpbmUgS0JEX0NNRF9TRVRfTEVEUwkweEVECS8qIFNldCBrZXlib2FyZCBsZWRzICovCisjZGVmaW5lIEtCRF9DTURfRUNITyAgICAgCTB4RUUKKyNkZWZpbmUgS0JEX0NNRF9TQ0FOQ09ERQkweEYwCS8qIEdldC9zZXQgc2NhbmNvZGUgc2V0ICovCisjZGVmaW5lIEtCRF9DTURfR0VUX0lEIAkgICAgICAgIDB4RjIJLyogZ2V0IGtleWJvYXJkIElEICovCisjZGVmaW5lIEtCRF9DTURfU0VUX1JBVEUJMHhGMwkvKiBTZXQgdHlwZW1hdGljIHJhdGUgKi8KKyNkZWZpbmUgS0JEX0NNRF9FTkFCTEUJCTB4RjQJLyogRW5hYmxlIHNjYW5uaW5nICovCisjZGVmaW5lIEtCRF9DTURfUkVTRVRfRElTQUJMRQkweEY1CS8qIHJlc2V0IGFuZCBkaXNhYmxlIHNjYW5uaW5nICovCisjZGVmaW5lIEtCRF9DTURfUkVTRVRfRU5BQkxFICAgCTB4RjYgICAgLyogcmVzZXQgYW5kIGVuYWJsZSBzY2FubmluZyAqLworI2RlZmluZSBLQkRfQ01EX1JFU0VUCQkweEZGCS8qIFJlc2V0ICovCisKKy8qIEtleWJvYXJkIFJlcGxpZXMgKi8KKyNkZWZpbmUgS0JEX1JFUExZX1BPUgkJMHhBQQkvKiBQb3dlciBvbiByZXNldCAqLworI2RlZmluZSBLQkRfUkVQTFlfSUQJCTB4QUIJLyogS2V5Ym9hcmQgSUQgKi8KKyNkZWZpbmUgS0JEX1JFUExZX0FDSwkJMHhGQQkvKiBDb21tYW5kIEFDSyAqLworI2RlZmluZSBLQkRfUkVQTFlfUkVTRU5ECTB4RkUJLyogQ29tbWFuZCBOQUNLLCBzZW5kIHRoZSBjbWQgYWdhaW4gKi8KKworLyogTW91c2UgQ29tbWFuZHMgKi8KKyNkZWZpbmUgQVVYX1NFVF9TQ0FMRTExCQkweEU2CS8qIFNldCAxOjEgc2NhbGluZyAqLworI2RlZmluZSBBVVhfU0VUX1NDQUxFMjEJCTB4RTcJLyogU2V0IDI6MSBzY2FsaW5nICovCisjZGVmaW5lIEFVWF9TRVRfUkVTCQkweEU4CS8qIFNldCByZXNvbHV0aW9uICovCisjZGVmaW5lIEFVWF9HRVRfU0NBTEUJCTB4RTkJLyogR2V0IHNjYWxpbmcgZmFjdG9yICovCisjZGVmaW5lIEFVWF9TRVRfU1RSRUFNCQkweEVBCS8qIFNldCBzdHJlYW0gbW9kZSAqLworI2RlZmluZSBBVVhfUE9MTAkJMHhFQgkvKiBQb2xsICovCisjZGVmaW5lIEFVWF9SRVNFVF9XUkFQCQkweEVDCS8qIFJlc2V0IHdyYXAgbW9kZSAqLworI2RlZmluZSBBVVhfU0VUX1dSQVAJCTB4RUUJLyogU2V0IHdyYXAgbW9kZSAqLworI2RlZmluZSBBVVhfU0VUX1JFTU9URQkJMHhGMAkvKiBTZXQgcmVtb3RlIG1vZGUgKi8KKyNkZWZpbmUgQVVYX0dFVF9UWVBFCQkweEYyCS8qIEdldCB0eXBlICovCisjZGVmaW5lIEFVWF9TRVRfU0FNUExFCQkweEYzCS8qIFNldCBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBBVVhfRU5BQkxFX0RFVgkJMHhGNAkvKiBFbmFibGUgYXV4IGRldmljZSAqLworI2RlZmluZSBBVVhfRElTQUJMRV9ERVYJCTB4RjUJLyogRGlzYWJsZSBhdXggZGV2aWNlICovCisjZGVmaW5lIEFVWF9TRVRfREVGQVVMVAkJMHhGNgorI2RlZmluZSBBVVhfUkVTRVQJCTB4RkYJLyogUmVzZXQgYXV4IGRldmljZSAqLworI2RlZmluZSBBVVhfQUNLCQkJMHhGQQkvKiBDb21tYW5kIGJ5dGUgQUNLLiAqLworCisjZGVmaW5lIE1PVVNFX1NUQVRVU19SRU1PVEUgICAgIDB4NDAKKyNkZWZpbmUgTU9VU0VfU1RBVFVTX0VOQUJMRUQgICAgMHgyMAorI2RlZmluZSBNT1VTRV9TVEFUVVNfU0NBTEUyMSAgICAweDEwCisKKyNkZWZpbmUgUFMyX1FVRVVFX1NJWkUgMjU2CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGRhdGFbUFMyX1FVRVVFX1NJWkVdOworICAgIGludCBycHRyLCB3cHRyLCBjb3VudDsKK30gUFMyUXVldWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQUzJRdWV1ZSBxdWV1ZTsKKyAgICBpbnQzMl90IHdyaXRlX2NtZDsKKyAgICB2b2lkICgqdXBkYXRlX2lycSkodm9pZCAqLCBpbnQpOworICAgIHZvaWQgKnVwZGF0ZV9hcmc7Cit9IFBTMlN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUFMyU3RhdGUgY29tbW9uOworICAgIGludCBzY2FuX2VuYWJsZWQ7CisgICAgLyogUWVtdSB1c2VzIHRyYW5zbGF0ZWQgUEMgc2NhbmNvZGVzIGludGVybmFsbHkuICBUbyBhdm9pZCBtdWx0aXBsZQorICAgICAgIGNvbnZlcnNpb25zIHdlIGRvIHRoZSB0cmFuc2xhdGlvbiAoaWYgYW55KSBpbiB0aGUgUFMvMiBlbXVsYXRpb24KKyAgICAgICBub3QgdGhlIGtleWJvYXJkIGNvbnRyb2xsZXIuICAqLworICAgIGludCB0cmFuc2xhdGU7CisgICAgaW50IHNjYW5jb2RlX3NldDsgLyogMT1YVCwgMj1BVCwgMz1QUy8yICovCit9IFBTMktiZFN0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUFMyU3RhdGUgY29tbW9uOworICAgIHVpbnQ4X3QgbW91c2Vfc3RhdHVzOworICAgIHVpbnQ4X3QgbW91c2VfcmVzb2x1dGlvbjsKKyAgICB1aW50OF90IG1vdXNlX3NhbXBsZV9yYXRlOworICAgIHVpbnQ4X3QgbW91c2Vfd3JhcDsKKyAgICB1aW50OF90IG1vdXNlX3R5cGU7IC8qIDAgPSBQUzIsIDMgPSBJTVBTLzIsIDQgPSBJTUVYICovCisgICAgdWludDhfdCBtb3VzZV9kZXRlY3Rfc3RhdGU7CisgICAgaW50IG1vdXNlX2R4OyAvKiBjdXJyZW50IHZhbHVlcywgbmVlZGVkIGZvciAncG9sbCcgbW9kZSAqLworICAgIGludCBtb3VzZV9keTsKKyAgICBpbnQgbW91c2VfZHo7CisgICAgdWludDhfdCBtb3VzZV9idXR0b25zOworfSBQUzJNb3VzZVN0YXRlOworCisvKiBUYWJsZSB0byBjb252ZXJ0IGZyb20gUEMgc2NhbmNvZGVzIHRvIHJhdyBzY2FuY29kZXMuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHMyX3Jhd19rZXljb2RlWzEyOF0gPSB7CisgICAgICAgICAgMCwxMTgsIDIyLCAzMCwgMzgsIDM3LCA0NiwgNTQsIDYxLCA2MiwgNzAsIDY5LCA3OCwgODUsMTAyLCAxMywKKyAgICAgICAgIDIxLCAyOSwgMzYsIDQ1LCA0NCwgNTMsIDYwLCA2NywgNjgsIDc3LCA4NCwgOTEsIDkwLCAyMCwgMjgsIDI3LAorICAgICAgICAgMzUsIDQzLCA1MiwgNTEsIDU5LCA2NiwgNzUsIDc2LCA4MiwgMTQsIDE4LCA5MywgMjYsIDM0LCAzMywgNDIsCisgICAgICAgICA1MCwgNDksIDU4LCA2NSwgNzMsIDc0LCA4OSwxMjQsIDE3LCA0MSwgODgsICA1LCAgNiwgIDQsIDEyLCAgMywKKyAgICAgICAgIDExLCAgMiwgMTAsICAxLCAgOSwxMTksMTI2LDEwOCwxMTcsMTI1LDEyMywxMDcsMTE1LDExNiwxMjEsMTA1LAorICAgICAgICAxMTQsMTIyLDExMiwxMTMsMTI3LCA5NiwgOTcsMTIwLCAgNywgMTUsIDIzLCAzMSwgMzksIDQ3LCA1NSwgNjMsCisgICAgICAgICA3MSwgNzksIDg2LCA5NCwgIDgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA3MiwgODAsIDg3LDExMSwKKyAgICAgICAgIDE5LCAyNSwgNTcsIDgxLCA4MywgOTIsIDk1LCA5OCwgOTksMTAwLDEwMSwxMDMsMTA0LDEwNiwxMDksMTEwCit9OworCit2b2lkIHBzMl9xdWV1ZSh2b2lkICpvcGFxdWUsIGludCBiKQoreworICAgIFBTMlN0YXRlICpzID0gKFBTMlN0YXRlICopb3BhcXVlOworICAgIFBTMlF1ZXVlICpxID0gJnMtPnF1ZXVlOworCisgICAgaWYgKHEtPmNvdW50ID49IFBTMl9RVUVVRV9TSVpFKQorICAgICAgICByZXR1cm47CisgICAgcS0+ZGF0YVtxLT53cHRyXSA9IGI7CisgICAgaWYgKCsrcS0+d3B0ciA9PSBQUzJfUVVFVUVfU0laRSkKKyAgICAgICAgcS0+d3B0ciA9IDA7CisgICAgcS0+Y291bnQrKzsKKyAgICBzLT51cGRhdGVfaXJxKHMtPnVwZGF0ZV9hcmcsIDEpOworfQorCisvKgorICAga2V5Y29kZSBpcyBleHByZXNzZWQgYXMgZm9sbG93OgorICAgYml0IDcgICAgLSAwIGtleSBwcmVzc2VkLCAxID0ga2V5IHJlbGVhc2VkCisgICBiaXRzIDYtMCAtIHRyYW5zbGF0ZWQgc2NhbmNvZGUgc2V0IDIKKyAqLworc3RhdGljIHZvaWQgcHMyX3B1dF9rZXljb2RlKHZvaWQgKm9wYXF1ZSwgaW50IGtleWNvZGUpCit7CisgICAgUFMyS2JkU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICAvKiBYWFg6IGFkZCBzdXBwb3J0IGZvciBzY2FuY29kZSBzZXRzIDEgYW5kIDMgKi8KKyAgICBpZiAoIXMtPnRyYW5zbGF0ZSAmJiBrZXljb2RlIDwgMHhlMCAmJiBzLT5zY2FuY29kZV9zZXQgPT0gMikKKyAgICAgIHsKKyAgICAgICAgaWYgKGtleWNvZGUgJiAweDgwKQorICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIDB4ZjApOworICAgICAgICBrZXljb2RlID0gcHMyX3Jhd19rZXljb2RlW2tleWNvZGUgJiAweDdmXTsKKyAgICAgIH0KKyAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwga2V5Y29kZSk7Cit9CisKK3VpbnQzMl90IHBzMl9yZWFkX2RhdGEodm9pZCAqb3BhcXVlKQoreworICAgIFBTMlN0YXRlICpzID0gKFBTMlN0YXRlICopb3BhcXVlOworICAgIFBTMlF1ZXVlICpxOworICAgIGludCB2YWwsIGluZGV4OworCisgICAgcSA9ICZzLT5xdWV1ZTsKKyAgICBpZiAocS0+Y291bnQgPT0gMCkgeworICAgICAgICAvKiBOT1RFOiBpZiBubyBkYXRhIGxlZnQsIHdlIHJldHVybiB0aGUgbGFzdCBrZXlib2FyZCBvbmUKKyAgICAgICAgICAgKG5lZWRlZCBmb3IgRU1NMzg2KSAqLworICAgICAgICAvKiBYWFg6IG5lZWQgYSB0aW1lciB0byBkbyB0aGluZ3MgY29ycmVjdGx5ICovCisgICAgICAgIGluZGV4ID0gcS0+cnB0ciAtIDE7CisgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICBpbmRleCA9IFBTMl9RVUVVRV9TSVpFIC0gMTsKKyAgICAgICAgdmFsID0gcS0+ZGF0YVtpbmRleF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsID0gcS0+ZGF0YVtxLT5ycHRyXTsKKyAgICAgICAgaWYgKCsrcS0+cnB0ciA9PSBQUzJfUVVFVUVfU0laRSkKKyAgICAgICAgICAgIHEtPnJwdHIgPSAwOworICAgICAgICBxLT5jb3VudC0tOworICAgICAgICAvKiByZWFkaW5nIGRlYXNzZXJ0cyBJUlEgKi8KKyAgICAgICAgcy0+dXBkYXRlX2lycShzLT51cGRhdGVfYXJnLCAwKTsKKyAgICAgICAgLyogcmVhc3NlcnQgSVJRcyBpZiBkYXRhIGxlZnQgKi8KKyAgICAgICAgcy0+dXBkYXRlX2lycShzLT51cGRhdGVfYXJnLCBxLT5jb3VudCAhPSAwKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgcHMyX3Jlc2V0X2tleWJvYXJkKFBTMktiZFN0YXRlICpzKQoreworICAgIHMtPnNjYW5fZW5hYmxlZCA9IDE7CisgICAgcy0+c2NhbmNvZGVfc2V0ID0gMjsKK30KKwordm9pZCBwczJfd3JpdGVfa2V5Ym9hcmQodm9pZCAqb3BhcXVlLCBpbnQgdmFsKQoreworICAgIFBTMktiZFN0YXRlICpzID0gKFBTMktiZFN0YXRlICopb3BhcXVlOworCisgICAgc3dpdGNoKHMtPmNvbW1vbi53cml0ZV9jbWQpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgLTE6CisgICAgICAgIHN3aXRjaCh2YWwpIHsKKyAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNToKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfUkVQTFlfUkVTRU5EKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtCRF9DTURfR0VUX0lEOgorICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICAgICAgLyogV2UgZW11bGF0ZSBhIE1GMiBBVCBrZXlib2FyZCBoZXJlICovCisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgS0JEX1JFUExZX0lEKTsKKyAgICAgICAgICAgIGlmIChzLT50cmFuc2xhdGUpCisgICAgICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIDB4NDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCAweDgzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtCRF9DTURfRUNITzoKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfQ01EX0VDSE8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0JEX0NNRF9FTkFCTEU6CisgICAgICAgICAgICBzLT5zY2FuX2VuYWJsZWQgPSAxOworICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0JEX0NNRF9TQ0FOQ09ERToKKyAgICAgICAgY2FzZSBLQkRfQ01EX1NFVF9MRURTOgorICAgICAgICBjYXNlIEtCRF9DTURfU0VUX1JBVEU6CisgICAgICAgICAgICBzLT5jb21tb24ud3JpdGVfY21kID0gdmFsOworICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0JEX0NNRF9SRVNFVF9ESVNBQkxFOgorICAgICAgICAgICAgcHMyX3Jlc2V0X2tleWJvYXJkKHMpOworICAgICAgICAgICAgcy0+c2Nhbl9lbmFibGVkID0gMDsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfUkVQTFlfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtCRF9DTURfUkVTRVRfRU5BQkxFOgorICAgICAgICAgICAgcHMyX3Jlc2V0X2tleWJvYXJkKHMpOworICAgICAgICAgICAgcy0+c2Nhbl9lbmFibGVkID0gMTsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfUkVQTFlfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtCRF9DTURfUkVTRVQ6CisgICAgICAgICAgICBwczJfcmVzZXRfa2V5Ym9hcmQocyk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgS0JEX1JFUExZX0FDSyk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgS0JEX1JFUExZX1BPUik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfUkVQTFlfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NNRF9TQ0FOQ09ERToKKyAgICAgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICAgICAgICBpZiAocy0+c2NhbmNvZGVfc2V0ID09IDEpCisgICAgICAgICAgICAgICAgcHMyX3B1dF9rZXljb2RlKHMsIDB4NDMpOworICAgICAgICAgICAgZWxzZSBpZiAocy0+c2NhbmNvZGVfc2V0ID09IDIpCisgICAgICAgICAgICAgICAgcHMyX3B1dF9rZXljb2RlKHMsIDB4NDEpOworICAgICAgICAgICAgZWxzZSBpZiAocy0+c2NhbmNvZGVfc2V0ID09IDMpCisgICAgICAgICAgICAgICAgcHMyX3B1dF9rZXljb2RlKHMsIDB4M2YpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHZhbCA+PSAxICYmIHZhbCA8PSAzKQorICAgICAgICAgICAgICAgIHMtPnNjYW5jb2RlX3NldCA9IHZhbDsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBLQkRfUkVQTFlfQUNLKTsKKyAgICAgICAgfQorICAgICAgICBzLT5jb21tb24ud3JpdGVfY21kID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NNRF9TRVRfTEVEUzoKKyAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICBzLT5jb21tb24ud3JpdGVfY21kID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0JEX0NNRF9TRVRfUkFURToKKyAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEtCRF9SRVBMWV9BQ0spOworICAgICAgICBzLT5jb21tb24ud3JpdGVfY21kID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogU2V0IHRoZSBzY2FuY29kZSB0cmFuc2xhdGlvbiBtb2RlLgorICAgMCA9IHJhdyBzY2FuY29kZXMuCisgICAxID0gdHJhbnNsYXRlZCBzY2FuY29kZXMgKHVzZWQgYnkgcWVtdSBpbnRlcm5hbGx5KS4gICovCisKK3ZvaWQgcHMyX2tleWJvYXJkX3NldF90cmFuc2xhdGlvbih2b2lkICpvcGFxdWUsIGludCBtb2RlKQoreworICAgIFBTMktiZFN0YXRlICpzID0gKFBTMktiZFN0YXRlICopb3BhcXVlOworICAgIHMtPnRyYW5zbGF0ZSA9IG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHBzMl9tb3VzZV9zZW5kX3BhY2tldChQUzJNb3VzZVN0YXRlICpzKQoreworICAgIHVuc2lnbmVkIGludCBiOworICAgIGludCBkeDEsIGR5MSwgZHoxOworCisgICAgZHgxID0gcy0+bW91c2VfZHg7CisgICAgZHkxID0gcy0+bW91c2VfZHk7CisgICAgZHoxID0gcy0+bW91c2VfZHo7CisgICAgLyogWFhYOiBpbmNyZWFzZSByYW5nZSB0byA4IGJpdHMgPyAqLworICAgIGlmIChkeDEgPiAxMjcpCisgICAgICAgIGR4MSA9IDEyNzsKKyAgICBlbHNlIGlmIChkeDEgPCAtMTI3KQorICAgICAgICBkeDEgPSAtMTI3OworICAgIGlmIChkeTEgPiAxMjcpCisgICAgICAgIGR5MSA9IDEyNzsKKyAgICBlbHNlIGlmIChkeTEgPCAtMTI3KQorICAgICAgICBkeTEgPSAtMTI3OworICAgIGIgPSAweDA4IHwgKChkeDEgPCAwKSA8PCA0KSB8ICgoZHkxIDwgMCkgPDwgNSkgfCAocy0+bW91c2VfYnV0dG9ucyAmIDB4MDcpOworICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBiKTsKKyAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgZHgxICYgMHhmZik7CisgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIGR5MSAmIDB4ZmYpOworICAgIC8qIGV4dHJhIGJ5dGUgZm9yIElNUFMvMiBvciBJTUVYICovCisgICAgc3dpdGNoKHMtPm1vdXNlX3R5cGUpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChkejEgPiAxMjcpCisgICAgICAgICAgICBkejEgPSAxMjc7CisgICAgICAgIGVsc2UgaWYgKGR6MSA8IC0xMjcpCisgICAgICAgICAgICAgICAgZHoxID0gLTEyNzsKKyAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIGR6MSAmIDB4ZmYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChkejEgPiA3KQorICAgICAgICAgICAgZHoxID0gNzsKKyAgICAgICAgZWxzZSBpZiAoZHoxIDwgLTcpCisgICAgICAgICAgICBkejEgPSAtNzsKKyAgICAgICAgYiA9IChkejEgJiAweDBmKSB8ICgocy0+bW91c2VfYnV0dG9ucyAmIDB4MTgpIDw8IDEpOworICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgYik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBkZWx0YXMgKi8KKyAgICBzLT5tb3VzZV9keCAtPSBkeDE7CisgICAgcy0+bW91c2VfZHkgLT0gZHkxOworICAgIHMtPm1vdXNlX2R6IC09IGR6MTsKK30KKworc3RhdGljIHZvaWQgcHMyX21vdXNlX2V2ZW50KHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCBkeSwgaW50IGR6LCBpbnQgYnV0dG9uc19zdGF0ZSkKK3sKKyAgICBQUzJNb3VzZVN0YXRlICpzID0gb3BhcXVlOworCisgICAgLyogY2hlY2sgaWYgZGVsdGFzIGFyZSByZWNvcmRlZCB3aGVuIGRpc2FibGVkICovCisgICAgaWYgKCEocy0+bW91c2Vfc3RhdHVzICYgTU9VU0VfU1RBVFVTX0VOQUJMRUQpKQorICAgICAgICByZXR1cm47CisKKyAgICBzLT5tb3VzZV9keCArPSBkeDsKKyAgICBzLT5tb3VzZV9keSAtPSBkeTsKKyAgICBzLT5tb3VzZV9keiArPSBkejsKKyAgICAvKiBYWFg6IFNETCBzb21ldGltZXMgZ2VuZXJhdGVzIG51bCBldmVudHM6IHdlIGRlbGV0ZSB0aGVtICovCisgICAgaWYgKHMtPm1vdXNlX2R4ID09IDAgJiYgcy0+bW91c2VfZHkgPT0gMCAmJiBzLT5tb3VzZV9keiA9PSAwICYmCisgICAgICAgIHMtPm1vdXNlX2J1dHRvbnMgPT0gYnV0dG9uc19zdGF0ZSkKKwlyZXR1cm47CisgICAgcy0+bW91c2VfYnV0dG9ucyA9IGJ1dHRvbnNfc3RhdGU7CisKKyAgICBpZiAoIShzLT5tb3VzZV9zdGF0dXMgJiBNT1VTRV9TVEFUVVNfUkVNT1RFKSAmJgorICAgICAgICAocy0+Y29tbW9uLnF1ZXVlLmNvdW50IDwgKFBTMl9RVUVVRV9TSVpFIC0gMTYpKSkgeworICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgIC8qIGlmIG5vdCByZW1vdGUsIHNlbmQgZXZlbnQuIE11bHRpcGxlIGV2ZW50cyBhcmUgc2VudCBpZgorICAgICAgICAgICAgICAgdG9vIGJpZyBkZWx0YXMgKi8KKyAgICAgICAgICAgIHBzMl9tb3VzZV9zZW5kX3BhY2tldChzKTsKKyAgICAgICAgICAgIGlmIChzLT5tb3VzZV9keCA9PSAwICYmIHMtPm1vdXNlX2R5ID09IDAgJiYgcy0+bW91c2VfZHogPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBwczJfbW91c2VfZmFrZV9ldmVudCh2b2lkICpvcGFxdWUpCit7CisgICAgcHMyX21vdXNlX2V2ZW50KG9wYXF1ZSwgMSwgMCwgMCwgMCk7Cit9CisKK3ZvaWQgcHMyX3dyaXRlX21vdXNlKHZvaWQgKm9wYXF1ZSwgaW50IHZhbCkKK3sKKyAgICBQUzJNb3VzZVN0YXRlICpzID0gKFBTMk1vdXNlU3RhdGUgKilvcGFxdWU7CisjaWZkZWYgREVCVUdfTU9VU0UKKyAgICBwcmludGYoImtiZDogd3JpdGUgbW91c2UgMHglMDJ4XG4iLCB2YWwpOworI2VuZGlmCisgICAgc3dpdGNoKHMtPmNvbW1vbi53cml0ZV9jbWQpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgLTE6CisgICAgICAgIC8qIG1vdXNlIGNvbW1hbmQgKi8KKyAgICAgICAgaWYgKHMtPm1vdXNlX3dyYXApIHsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gQVVYX1JFU0VUX1dSQVApIHsKKyAgICAgICAgICAgICAgICBzLT5tb3VzZV93cmFwID0gMDsKKyAgICAgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwgIT0gQVVYX1JFU0VUKSB7CisgICAgICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCh2YWwpIHsKKyAgICAgICAgY2FzZSBBVVhfU0VUX1NDQUxFMTE6CisgICAgICAgICAgICBzLT5tb3VzZV9zdGF0dXMgJj0gfk1PVVNFX1NUQVRVU19TQ0FMRTIxOworICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEFVWF9BQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVYX1NFVF9TQ0FMRTIxOgorICAgICAgICAgICAgcy0+bW91c2Vfc3RhdHVzIHw9IE1PVVNFX1NUQVRVU19TQ0FMRTIxOworICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEFVWF9BQ0spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVYX1NFVF9TVFJFQU06CisgICAgICAgICAgICBzLT5tb3VzZV9zdGF0dXMgJj0gfk1PVVNFX1NUQVRVU19SRU1PVEU7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfU0VUX1dSQVA6CisgICAgICAgICAgICBzLT5tb3VzZV93cmFwID0gMTsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBBVVhfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVWF9TRVRfUkVNT1RFOgorICAgICAgICAgICAgcy0+bW91c2Vfc3RhdHVzIHw9IE1PVVNFX1NUQVRVU19SRU1PVEU7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfR0VUX1RZUEU6CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgcy0+bW91c2VfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfU0VUX1JFUzoKKyAgICAgICAgY2FzZSBBVVhfU0VUX1NBTVBMRToKKyAgICAgICAgICAgIHMtPmNvbW1vbi53cml0ZV9jbWQgPSB2YWw7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfR0VUX1NDQUxFOgorICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIEFVWF9BQ0spOworICAgICAgICAgICAgcHMyX3F1ZXVlKCZzLT5jb21tb24sIHMtPm1vdXNlX3N0YXR1cyk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgcy0+bW91c2VfcmVzb2x1dGlvbik7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgcy0+bW91c2Vfc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVYX1BPTEw6CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBwczJfbW91c2Vfc2VuZF9wYWNrZXQocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfRU5BQkxFX0RFVjoKKyAgICAgICAgICAgIHMtPm1vdXNlX3N0YXR1cyB8PSBNT1VTRV9TVEFUVVNfRU5BQkxFRDsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBBVVhfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVWF9ESVNBQkxFX0RFVjoKKyAgICAgICAgICAgIHMtPm1vdXNlX3N0YXR1cyAmPSB+TU9VU0VfU1RBVFVTX0VOQUJMRUQ7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVhfU0VUX0RFRkFVTFQ6CisgICAgICAgICAgICBzLT5tb3VzZV9zYW1wbGVfcmF0ZSA9IDEwMDsKKyAgICAgICAgICAgIHMtPm1vdXNlX3Jlc29sdXRpb24gPSAyOworICAgICAgICAgICAgcy0+bW91c2Vfc3RhdHVzID0gMDsKKyAgICAgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBBVVhfQUNLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVWF9SRVNFVDoKKyAgICAgICAgICAgIHMtPm1vdXNlX3NhbXBsZV9yYXRlID0gMTAwOworICAgICAgICAgICAgcy0+bW91c2VfcmVzb2x1dGlvbiA9IDI7CisgICAgICAgICAgICBzLT5tb3VzZV9zdGF0dXMgPSAwOworICAgICAgICAgICAgcy0+bW91c2VfdHlwZSA9IDA7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgMHhhYSk7CisgICAgICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgcy0+bW91c2VfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVYX1NFVF9TQU1QTEU6CisgICAgICAgIHMtPm1vdXNlX3NhbXBsZV9yYXRlID0gdmFsOworICAgICAgICAvKiBkZXRlY3QgSU1QUy8yIG9yIElNRVggKi8KKyAgICAgICAgc3dpdGNoKHMtPm1vdXNlX2RldGVjdF9zdGF0ZSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAodmFsID09IDIwMCkKKyAgICAgICAgICAgICAgICBzLT5tb3VzZV9kZXRlY3Rfc3RhdGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmICh2YWwgPT0gMTAwKQorICAgICAgICAgICAgICAgIHMtPm1vdXNlX2RldGVjdF9zdGF0ZSA9IDI7CisgICAgICAgICAgICBlbHNlIGlmICh2YWwgPT0gMjAwKQorICAgICAgICAgICAgICAgIHMtPm1vdXNlX2RldGVjdF9zdGF0ZSA9IDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bW91c2VfZGV0ZWN0X3N0YXRlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAodmFsID09IDgwKQorICAgICAgICAgICAgICAgIHMtPm1vdXNlX3R5cGUgPSAzOyAvKiBJTVBTLzIgKi8KKyAgICAgICAgICAgIHMtPm1vdXNlX2RldGVjdF9zdGF0ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKHZhbCA9PSA4MCkKKyAgICAgICAgICAgICAgICBzLT5tb3VzZV90eXBlID0gNDsgLyogSU1FWCAqLworICAgICAgICAgICAgcy0+bW91c2VfZGV0ZWN0X3N0YXRlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBzMl9xdWV1ZSgmcy0+Y29tbW9uLCBBVVhfQUNLKTsKKyAgICAgICAgcy0+Y29tbW9uLndyaXRlX2NtZCA9IC0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVWF9TRVRfUkVTOgorICAgICAgICBzLT5tb3VzZV9yZXNvbHV0aW9uID0gdmFsOworICAgICAgICBwczJfcXVldWUoJnMtPmNvbW1vbiwgQVVYX0FDSyk7CisgICAgICAgIHMtPmNvbW1vbi53cml0ZV9jbWQgPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwczJfcmVzZXQodm9pZCAqb3BhcXVlKQoreworICAgIFBTMlN0YXRlICpzID0gKFBTMlN0YXRlICopb3BhcXVlOworICAgIFBTMlF1ZXVlICpxOworICAgIHMtPndyaXRlX2NtZCA9IC0xOworICAgIHEgPSAmcy0+cXVldWU7CisgICAgcS0+cnB0ciA9IDA7CisgICAgcS0+d3B0ciA9IDA7CisgICAgcS0+Y291bnQgPSAwOworICAgIHMtPnVwZGF0ZV9pcnEocy0+dXBkYXRlX2FyZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBzMl9jb21tb25fc2F2ZSAoUUVNVUZpbGUgKmYsIFBTMlN0YXRlICpzKQoreworICAgIHFlbXVfcHV0X2JlMzIgKGYsIHMtPndyaXRlX2NtZCk7CisgICAgcWVtdV9wdXRfYmUzMiAoZiwgcy0+cXVldWUucnB0cik7CisgICAgcWVtdV9wdXRfYmUzMiAoZiwgcy0+cXVldWUud3B0cik7CisgICAgcWVtdV9wdXRfYmUzMiAoZiwgcy0+cXVldWUuY291bnQpOworICAgIHFlbXVfcHV0X2J1ZmZlciAoZiwgcy0+cXVldWUuZGF0YSwgc2l6ZW9mIChzLT5xdWV1ZS5kYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBzMl9jb21tb25fbG9hZCAoUUVNVUZpbGUgKmYsIFBTMlN0YXRlICpzKQoreworICAgIHMtPndyaXRlX2NtZD1xZW11X2dldF9iZTMyIChmKTsKKyAgICBzLT5xdWV1ZS5ycHRyPXFlbXVfZ2V0X2JlMzIgKGYpOworICAgIHMtPnF1ZXVlLndwdHI9cWVtdV9nZXRfYmUzMiAoZik7CisgICAgcy0+cXVldWUuY291bnQ9cWVtdV9nZXRfYmUzMiAoZik7CisgICAgcWVtdV9nZXRfYnVmZmVyIChmLCBzLT5xdWV1ZS5kYXRhLCBzaXplb2YgKHMtPnF1ZXVlLmRhdGEpKTsKK30KKworc3RhdGljIHZvaWQgcHMyX2tiZF9zYXZlKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUpCit7CisgICAgUFMyS2JkU3RhdGUgKnMgPSAoUFMyS2JkU3RhdGUqKW9wYXF1ZTsKKworICAgIHBzMl9jb21tb25fc2F2ZSAoZiwgJnMtPmNvbW1vbik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5zY2FuX2VuYWJsZWQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+dHJhbnNsYXRlKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnNjYW5jb2RlX3NldCk7Cit9CisKK3N0YXRpYyB2b2lkIHBzMl9tb3VzZV9zYXZlKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUpCit7CisgICAgUFMyTW91c2VTdGF0ZSAqcyA9IChQUzJNb3VzZVN0YXRlKilvcGFxdWU7CisKKyAgICBwczJfY29tbW9uX3NhdmUgKGYsICZzLT5jb21tb24pOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5tb3VzZV9zdGF0dXMpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5tb3VzZV9yZXNvbHV0aW9uKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+bW91c2Vfc2FtcGxlX3JhdGUpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5tb3VzZV93cmFwKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+bW91c2VfdHlwZSk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPm1vdXNlX2RldGVjdF9zdGF0ZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5tb3VzZV9keCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5tb3VzZV9keSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5tb3VzZV9keik7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPm1vdXNlX2J1dHRvbnMpOworfQorCitzdGF0aWMgaW50IHBzMl9rYmRfbG9hZChRRU1VRmlsZSogZiwgdm9pZCogb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBQUzJLYmRTdGF0ZSAqcyA9IChQUzJLYmRTdGF0ZSopb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMiAmJiB2ZXJzaW9uX2lkICE9IDMpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgcHMyX2NvbW1vbl9sb2FkIChmLCAmcy0+Y29tbW9uKTsKKyAgICBzLT5zY2FuX2VuYWJsZWQ9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT50cmFuc2xhdGU9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBpZiAodmVyc2lvbl9pZCA9PSAzKQorICAgICAgICBzLT5zY2FuY29kZV9zZXQ9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbHNlCisgICAgICAgIHMtPnNjYW5jb2RlX3NldD0yOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzMl9tb3VzZV9sb2FkKFFFTVVGaWxlKiBmLCB2b2lkKiBvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFBTMk1vdXNlU3RhdGUgKnMgPSAoUFMyTW91c2VTdGF0ZSopb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBwczJfY29tbW9uX2xvYWQgKGYsICZzLT5jb21tb24pOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5tb3VzZV9zdGF0dXMpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5tb3VzZV9yZXNvbHV0aW9uKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+bW91c2Vfc2FtcGxlX3JhdGUpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5tb3VzZV93cmFwKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+bW91c2VfdHlwZSk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPm1vdXNlX2RldGVjdF9zdGF0ZSk7CisgICAgcy0+bW91c2VfZHg9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5tb3VzZV9keT1xZW11X2dldF9iZTMyKGYpOworICAgIHMtPm1vdXNlX2R6PXFlbXVfZ2V0X2JlMzIoZik7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPm1vdXNlX2J1dHRvbnMpOworICAgIHJldHVybiAwOworfQorCit2b2lkICpwczJfa2JkX2luaXQodm9pZCAoKnVwZGF0ZV9pcnEpKHZvaWQgKiwgaW50KSwgdm9pZCAqdXBkYXRlX2FyZykKK3sKKyAgICBQUzJLYmRTdGF0ZSAqcyA9IChQUzJLYmRTdGF0ZSAqKWdfbWFsbG9jMChzaXplb2YoUFMyS2JkU3RhdGUpKTsKKworICAgIHMtPmNvbW1vbi51cGRhdGVfaXJxID0gdXBkYXRlX2lycTsKKyAgICBzLT5jb21tb24udXBkYXRlX2FyZyA9IHVwZGF0ZV9hcmc7CisgICAgcy0+c2NhbmNvZGVfc2V0ID0gMjsKKyAgICBwczJfcmVzZXQoJnMtPmNvbW1vbik7CisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJwczJrYmQiLCAwLCAzLCBwczJfa2JkX3NhdmUsIHBzMl9rYmRfbG9hZCwgcyk7CisgICAgLy9xZW11X2FkZF9rYmRfZXZlbnRfaGFuZGxlcihwczJfcHV0X2tleWNvZGUsIHMpOworICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQocHMyX3Jlc2V0LCAwLCAmcy0+Y29tbW9uKTsKKyAgICByZXR1cm4gczsKK30KKwordm9pZCAqcHMyX21vdXNlX2luaXQodm9pZCAoKnVwZGF0ZV9pcnEpKHZvaWQgKiwgaW50KSwgdm9pZCAqdXBkYXRlX2FyZykKK3sKKyAgICBQUzJNb3VzZVN0YXRlICpzID0gKFBTMk1vdXNlU3RhdGUgKilnX21hbGxvYzAoc2l6ZW9mKFBTMk1vdXNlU3RhdGUpKTsKKworICAgIHMtPmNvbW1vbi51cGRhdGVfaXJxID0gdXBkYXRlX2lycTsKKyAgICBzLT5jb21tb24udXBkYXRlX2FyZyA9IHVwZGF0ZV9hcmc7CisgICAgcHMyX3Jlc2V0KCZzLT5jb21tb24pOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAicHMybW91c2UiLCAwLCAyLCBwczJfbW91c2Vfc2F2ZSwgcHMyX21vdXNlX2xvYWQsIHMpOworICAgIC8vcWVtdV9hZGRfbW91c2VfZXZlbnRfaGFuZGxlcihwczJfbW91c2VfZXZlbnQsIHMsIDAsICJRRU1VIFBTLzIgTW91c2UiKTsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KHBzMl9yZXNldCwgMCwgJnMtPmNvbW1vbik7CisgICAgcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2ludGMvYXBpYy5jIGIvYW5kcm9pZC9xZW11MS9ody9pbnRjL2FwaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgxNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9pbnRjL2FwaWMuYwpAQCAtMCwwICsxLDk2OSBAQAorLyoKKyAqICBBUElDIHN1cHBvcnQKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uIE1BICAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorCisvLyNkZWZpbmUgREVCVUdfQVBJQworCisvKiBBUElDIExvY2FsIFZlY3RvciBUYWJsZSAqLworI2RlZmluZSBBUElDX0xWVF9USU1FUiAgIDAKKyNkZWZpbmUgQVBJQ19MVlRfVEhFUk1BTCAxCisjZGVmaW5lIEFQSUNfTFZUX1BFUkZPUk0gMgorI2RlZmluZSBBUElDX0xWVF9MSU5UMCAgIDMKKyNkZWZpbmUgQVBJQ19MVlRfTElOVDEgICA0CisjZGVmaW5lIEFQSUNfTFZUX0VSUk9SICAgNQorI2RlZmluZSBBUElDX0xWVF9OQiAgICAgIDYKKworLyogQVBJQyBkZWxpdmVyeSBtb2RlcyAqLworI2RlZmluZSBBUElDX0RNX0ZJWEVECTAKKyNkZWZpbmUgQVBJQ19ETV9MT1dQUkkJMQorI2RlZmluZSBBUElDX0RNX1NNSQkyCisjZGVmaW5lIEFQSUNfRE1fTk1JCTQKKyNkZWZpbmUgQVBJQ19ETV9JTklUCTUKKyNkZWZpbmUgQVBJQ19ETV9TSVBJCTYKKyNkZWZpbmUgQVBJQ19ETV9FWFRJTlQJNworCisvKiBBUElDIGRlc3RpbmF0aW9uIG1vZGUgKi8KKyNkZWZpbmUgQVBJQ19ERVNUTU9ERV9GTEFUCTB4ZgorI2RlZmluZSBBUElDX0RFU1RNT0RFX0NMVVNURVIJMQorCisjZGVmaW5lIEFQSUNfVFJJR0dFUl9FREdFICAwCisjZGVmaW5lIEFQSUNfVFJJR0dFUl9MRVZFTCAxCisKKyNkZWZpbmUJQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMJCSgxPDwxNykKKyNkZWZpbmUJQVBJQ19MVlRfTUFTS0VECQkJKDE8PDE2KQorI2RlZmluZQlBUElDX0xWVF9MRVZFTF9UUklHR0VSCQkoMTw8MTUpCisjZGVmaW5lCUFQSUNfTFZUX1JFTU9URV9JUlIJCSgxPDwxNCkKKyNkZWZpbmUJQVBJQ19JTlBVVF9QT0xBUklUWQkJKDE8PDEzKQorI2RlZmluZQlBUElDX1NFTkRfUEVORElORwkJKDE8PDEyKQorCisjZGVmaW5lIEVTUl9JTExFR0FMX0FERFJFU1MgKDEgPDwgNykKKworI2RlZmluZSBBUElDX1NWX0VOQUJMRSAoMSA8PCA4KQorCisjZGVmaW5lIE1BWF9BUElDUyAyNTUKKyNkZWZpbmUgTUFYX0FQSUNfV09SRFMgOAorCit0eXBlZGVmIHN0cnVjdCBBUElDU3RhdGUgeworICAgIENQVU9sZFN0YXRlICpjcHVfZW52OworICAgIHVpbnQzMl90IGFwaWNiYXNlOworICAgIHVpbnQ4X3QgaWQ7CisgICAgdWludDhfdCBhcmJfaWQ7CisgICAgdWludDhfdCB0cHI7CisgICAgdWludDMyX3Qgc3B1cmlvdXNfdmVjOworICAgIHVpbnQ4X3QgbG9nX2Rlc3Q7CisgICAgdWludDhfdCBkZXN0X21vZGU7CisgICAgdWludDMyX3QgaXNyWzhdOyAgLyogaW4gc2VydmljZSByZWdpc3RlciAqLworICAgIHVpbnQzMl90IHRtcls4XTsgIC8qIHRyaWdnZXIgbW9kZSByZWdpc3RlciAqLworICAgIHVpbnQzMl90IGlycls4XTsgLyogaW50ZXJydXB0IHJlcXVlc3QgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCBsdnRbQVBJQ19MVlRfTkJdOworICAgIHVpbnQzMl90IGVzcjsgLyogZXJyb3IgcmVnaXN0ZXIgKi8KKyAgICB1aW50MzJfdCBpY3JbMl07CisKKyAgICB1aW50MzJfdCBkaXZpZGVfY29uZjsKKyAgICBpbnQgY291bnRfc2hpZnQ7CisgICAgdWludDMyX3QgaW5pdGlhbF9jb3VudDsKKyAgICBpbnQ2NF90IGluaXRpYWxfY291bnRfbG9hZF90aW1lLCBuZXh0X3RpbWU7CisgICAgdWludDMyX3QgaWR4OworICAgIFFFTVVUaW1lciAqdGltZXI7CisgICAgaW50IHNpcGlfdmVjdG9yOworICAgIGludCB3YWl0X2Zvcl9zaXBpOworfSBBUElDU3RhdGU7CisKK3N0YXRpYyBpbnQgYXBpY19pb19tZW1vcnk7CitzdGF0aWMgQVBJQ1N0YXRlICpsb2NhbF9hcGljc1tNQVhfQVBJQ1MgKyAxXTsKK3N0YXRpYyBpbnQgbGFzdF9hcGljX2lkeCA9IDA7CitzdGF0aWMgaW50IGFwaWNfaXJxX2RlbGl2ZXJlZDsKKworCitzdGF0aWMgdm9pZCBhcGljX3NldF9pcnEoQVBJQ1N0YXRlICpzLCBpbnQgdmVjdG9yX251bSwgaW50IHRyaWdnZXJfbW9kZSk7CitzdGF0aWMgdm9pZCBhcGljX3VwZGF0ZV9pcnEoQVBJQ1N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIGFwaWNfZ2V0X2RlbGl2ZXJ5X2JpdG1hc2sodWludDMyX3QgKmRlbGl2ZXJfYml0bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZXN0LCB1aW50OF90IGRlc3RfbW9kZSk7CisKKy8qIEZpbmQgZmlyc3QgYml0IHN0YXJ0aW5nIGZyb20gbXNiICovCitzdGF0aWMgaW50IGZsc19iaXQodWludDMyX3QgdmFsdWUpCit7CisgICAgcmV0dXJuIDMxIC0gY2x6MzIodmFsdWUpOworfQorCisvKiBGaW5kIGZpcnN0IGJpdCBzdGFydGluZyBmcm9tIGxzYiAqLworc3RhdGljIGludCBmZnNfYml0KHVpbnQzMl90IHZhbHVlKQoreworICAgIHJldHVybiBjdHozMih2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0KHVpbnQzMl90ICp0YWIsIGludCBpbmRleCkKK3sKKyAgICBpbnQgaSwgbWFzazsKKyAgICBpID0gaW5kZXggPj4gNTsKKyAgICBtYXNrID0gMSA8PCAoaW5kZXggJiAweDFmKTsKKyAgICB0YWJbaV0gfD0gbWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2JpdCh1aW50MzJfdCAqdGFiLCBpbnQgaW5kZXgpCit7CisgICAgaW50IGksIG1hc2s7CisgICAgaSA9IGluZGV4ID4+IDU7CisgICAgbWFzayA9IDEgPDwgKGluZGV4ICYgMHgxZik7CisgICAgdGFiW2ldICY9IH5tYXNrOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfYml0KHVpbnQzMl90ICp0YWIsIGludCBpbmRleCkKK3sKKyAgICBpbnQgaSwgbWFzazsKKyAgICBpID0gaW5kZXggPj4gNTsKKyAgICBtYXNrID0gMSA8PCAoaW5kZXggJiAweDFmKTsKKyAgICByZXR1cm4gISEodGFiW2ldICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNfbG9jYWxfZGVsaXZlcihDUFVPbGRTdGF0ZSAqZW52LCBpbnQgdmVjdG9yKQoreworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworICAgIEFQSUNTdGF0ZSAqcyA9IGVudi0+YXBpY19zdGF0ZTsKKyAgICB1aW50MzJfdCBsdnQgPSBzLT5sdnRbdmVjdG9yXTsKKyAgICBpbnQgdHJpZ2dlcl9tb2RlOworCisgICAgaWYgKGx2dCAmIEFQSUNfTFZUX01BU0tFRCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoICgobHZ0ID4+IDgpICYgNykgeworICAgIGNhc2UgQVBJQ19ETV9TTUk6CisgICAgICAgIGNwdV9pbnRlcnJ1cHQoY3B1LCBDUFVfSU5URVJSVVBUX1NNSSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBUElDX0RNX05NSToKKyAgICAgICAgY3B1X2ludGVycnVwdChjcHUsIENQVV9JTlRFUlJVUFRfTk1JKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFQSUNfRE1fRVhUSU5UOgorICAgICAgICBjcHVfaW50ZXJydXB0KGNwdSwgQ1BVX0lOVEVSUlVQVF9IQVJEKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFQSUNfRE1fRklYRUQ6CisgICAgICAgIHRyaWdnZXJfbW9kZSA9IEFQSUNfVFJJR0dFUl9FREdFOworICAgICAgICBpZiAoKHZlY3RvciA9PSBBUElDX0xWVF9MSU5UMCB8fCB2ZWN0b3IgPT0gQVBJQ19MVlRfTElOVDEpICYmCisgICAgICAgICAgICAobHZ0ICYgQVBJQ19MVlRfTEVWRUxfVFJJR0dFUikpCisgICAgICAgICAgICB0cmlnZ2VyX21vZGUgPSBBUElDX1RSSUdHRVJfTEVWRUw7CisgICAgICAgIGFwaWNfc2V0X2lycShzLCBsdnQgJiAweGZmLCB0cmlnZ2VyX21vZGUpOworICAgIH0KK30KKwordm9pZCBhcGljX2RlbGl2ZXJfcGljX2ludHIoQ1BVT2xkU3RhdGUgKmVudiwgaW50IGxldmVsKQoreworICAgIGlmIChsZXZlbCkKKyAgICAgICAgYXBpY19sb2NhbF9kZWxpdmVyKGVudiwgQVBJQ19MVlRfTElOVDApOworICAgIGVsc2UgeworICAgICAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisgICAgICAgIHVpbnQzMl90IGx2dCA9IHMtPmx2dFtBUElDX0xWVF9MSU5UMF07CisKKyAgICAgICAgc3dpdGNoICgobHZ0ID4+IDgpICYgNykgeworICAgICAgICBjYXNlIEFQSUNfRE1fRklYRUQ6CisgICAgICAgICAgICBpZiAoIShsdnQgJiBBUElDX0xWVF9MRVZFTF9UUklHR0VSKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJlc2V0X2JpdChzLT5pcnIsIGx2dCAmIDB4ZmYpOworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgQVBJQ19ETV9FWFRJTlQ6CisgICAgICAgICAgICBjcHVfcmVzZXRfaW50ZXJydXB0KEVOVl9HRVRfQ1BVKGVudiksIENQVV9JTlRFUlJVUFRfSEFSRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBmb3JlYWNoX2FwaWMoYXBpYywgZGVsaXZlcl9iaXRtYXNrLCBjb2RlKSBcCit7XAorICAgIGludCBfX2ksIF9faiwgX19tYXNrO1wKKyAgICBmb3IoX19pID0gMDsgX19pIDwgTUFYX0FQSUNfV09SRFM7IF9faSsrKSB7XAorICAgICAgICBfX21hc2sgPSBkZWxpdmVyX2JpdG1hc2tbX19pXTtcCisgICAgICAgIGlmIChfX21hc2spIHtcCisgICAgICAgICAgICBmb3IoX19qID0gMDsgX19qIDwgMzI7IF9faisrKSB7XAorICAgICAgICAgICAgICAgIGlmIChfX21hc2sgJiAoMSA8PCBfX2opKSB7XAorICAgICAgICAgICAgICAgICAgICBhcGljID0gbG9jYWxfYXBpY3NbX19pICogMzIgKyBfX2pdO1wKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFwaWMpIHtcCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlO1wKKyAgICAgICAgICAgICAgICAgICAgfVwKKyAgICAgICAgICAgICAgICB9XAorICAgICAgICAgICAgfVwKKyAgICAgICAgfVwKKyAgICB9XAorfQorCitzdGF0aWMgdm9pZCBhcGljX2J1c19kZWxpdmVyKGNvbnN0IHVpbnQzMl90ICpkZWxpdmVyX2JpdG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVsaXZlcnlfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2ZWN0b3JfbnVtLCB1aW50OF90IHBvbGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRyaWdnZXJfbW9kZSkKK3sKKyAgICBBUElDU3RhdGUgKmFwaWNfaXRlcjsKKworICAgIHN3aXRjaCAoZGVsaXZlcnlfbW9kZSkgeworICAgICAgICBjYXNlIEFQSUNfRE1fTE9XUFJJOgorICAgICAgICAgICAgLyogWFhYOiBzZWFyY2ggZm9yIGZvY3VzIHByb2Nlc3NvciwgYXJiaXRyYXRpb24gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgZDsKKyAgICAgICAgICAgICAgICBkID0gLTE7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgTUFYX0FQSUNfV09SRFM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaXZlcl9iaXRtYXNrW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gaSAqIDMyICsgZmZzX2JpdChkZWxpdmVyX2JpdG1hc2tbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBhcGljX2l0ZXIgPSBsb2NhbF9hcGljc1tkXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFwaWNfaXRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBpY19zZXRfaXJxKGFwaWNfaXRlciwgdmVjdG9yX251bSwgdHJpZ2dlcl9tb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBjYXNlIEFQSUNfRE1fRklYRUQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFQSUNfRE1fU01JOgorICAgICAgICAgICAgZm9yZWFjaF9hcGljKGFwaWNfaXRlciwgZGVsaXZlcl9iaXRtYXNrLAorICAgICAgICAgICAgICAgIGNwdV9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoYXBpY19pdGVyLT5jcHVfZW52KSwgQ1BVX0lOVEVSUlVQVF9TTUkpICk7CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgY2FzZSBBUElDX0RNX05NSToKKyAgICAgICAgICAgIGZvcmVhY2hfYXBpYyhhcGljX2l0ZXIsIGRlbGl2ZXJfYml0bWFzaywKKyAgICAgICAgICAgICAgICBjcHVfaW50ZXJydXB0KEVOVl9HRVRfQ1BVKGFwaWNfaXRlci0+Y3B1X2VudiksIENQVV9JTlRFUlJVUFRfTk1JKSApOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgQVBJQ19ETV9JTklUOgorICAgICAgICAgICAgLyogbm9ybWFsIElOSVQgSVBJIHNlbnQgdG8gcHJvY2Vzc29ycyAqLworICAgICAgICAgICAgZm9yZWFjaF9hcGljKGFwaWNfaXRlciwgZGVsaXZlcl9iaXRtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoYXBpY19pdGVyLT5jcHVfZW52KSwgQ1BVX0lOVEVSUlVQVF9JTklUKSApOworICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGNhc2UgQVBJQ19ETV9FWFRJTlQ6CisgICAgICAgICAgICAvKiBoYW5kbGVkIGluIEkvTyBBUElDIGNvZGUgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yZWFjaF9hcGljKGFwaWNfaXRlciwgZGVsaXZlcl9iaXRtYXNrLAorICAgICAgICAgICAgICAgICBhcGljX3NldF9pcnEoYXBpY19pdGVyLCB2ZWN0b3JfbnVtLCB0cmlnZ2VyX21vZGUpICk7Cit9CisKK3ZvaWQgYXBpY19kZWxpdmVyX2lycSh1aW50OF90IGRlc3QsIHVpbnQ4X3QgZGVzdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVsaXZlcnlfbW9kZSwgdWludDhfdCB2ZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9sYXJpdHksIHVpbnQ4X3QgdHJpZ2dlcl9tb2RlKQoreworICAgIHVpbnQzMl90IGRlbGl2ZXJfYml0bWFza1tNQVhfQVBJQ19XT1JEU107CisKKyAgICBhcGljX2dldF9kZWxpdmVyeV9iaXRtYXNrKGRlbGl2ZXJfYml0bWFzaywgZGVzdCwgZGVzdF9tb2RlKTsKKyAgICBhcGljX2J1c19kZWxpdmVyKGRlbGl2ZXJfYml0bWFzaywgZGVsaXZlcnlfbW9kZSwgdmVjdG9yX251bSwgcG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX21vZGUpOworfQorCit2b2lkIGNwdV9zZXRfYXBpY19iYXNlKENQVU9sZFN0YXRlICplbnYsIHVpbnQ2NF90IHZhbCkKK3sKKyAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisjaWZkZWYgREVCVUdfQVBJQworICAgIHByaW50ZigiY3B1X3NldF9hcGljX2Jhc2U6ICUwMTYiIFBSSXg2NCAiXG4iLCB2YWwpOworI2VuZGlmCisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm47CisgICAgcy0+YXBpY2Jhc2UgPSAodmFsICYgMHhmZmZmZjAwMCkgfAorICAgICAgICAocy0+YXBpY2Jhc2UgJiAoTVNSX0lBMzJfQVBJQ0JBU0VfQlNQIHwgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSk7CisgICAgLyogaWYgZGlzYWJsZWQsIGNhbm5vdCBiZSBlbmFibGVkIGFnYWluICovCisgICAgaWYgKCEodmFsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkgeworICAgICAgICBzLT5hcGljYmFzZSAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFOworICAgICAgICBlbnYtPmNwdWlkX2ZlYXR1cmVzICY9IH5DUFVJRF9BUElDOworICAgICAgICBzLT5zcHVyaW91c192ZWMgJj0gfkFQSUNfU1ZfRU5BQkxFOworICAgIH0KK30KKwordWludDY0X3QgY3B1X2dldF9hcGljX2Jhc2UoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisjaWZkZWYgREVCVUdfQVBJQworICAgIHByaW50ZigiY3B1X2dldF9hcGljX2Jhc2U6ICUwMTYiIFBSSXg2NCAiXG4iLAorICAgICAgICAgICBzID8gKHVpbnQ2NF90KXMtPmFwaWNiYXNlOiAwKTsKKyNlbmRpZgorICAgIHJldHVybiBzID8gcy0+YXBpY2Jhc2UgOiAwOworfQorCit2b2lkIGNwdV9zZXRfYXBpY190cHIoQ1BVWDg2U3RhdGUgKmVudiwgdWludDhfdCB2YWwpCit7CisgICAgQVBJQ1N0YXRlICpzID0gZW52LT5hcGljX3N0YXRlOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworICAgIHMtPnRwciA9ICh2YWwgJiAweDBmKSA8PCA0OworICAgIGFwaWNfdXBkYXRlX2lycShzKTsKK30KKwordWludDhfdCBjcHVfZ2V0X2FwaWNfdHByKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgQVBJQ1N0YXRlICpzID0gZW52LT5hcGljX3N0YXRlOworICAgIHJldHVybiBzID8gcy0+dHByID4+IDQgOiAwOworfQorCisvKiByZXR1cm4gLTEgaWYgbm8gYml0IGlzIHNldCAqLworc3RhdGljIGludCBnZXRfaGlnaGVzdF9wcmlvcml0eV9pbnQodWludDMyX3QgKnRhYikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDc7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGlmICh0YWJbaV0gIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGkgKiAzMiArIGZsc19iaXQodGFiW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYXBpY19nZXRfcHByKEFQSUNTdGF0ZSAqcykKK3sKKyAgICBpbnQgdHByLCBpc3J2LCBwcHI7CisKKyAgICB0cHIgPSAocy0+dHByID4+IDQpOworICAgIGlzcnYgPSBnZXRfaGlnaGVzdF9wcmlvcml0eV9pbnQocy0+aXNyKTsKKyAgICBpZiAoaXNydiA8IDApCisgICAgICAgIGlzcnYgPSAwOworICAgIGlzcnYgPj49IDQ7CisgICAgaWYgKHRwciA+PSBpc3J2KQorICAgICAgICBwcHIgPSBzLT50cHI7CisgICAgZWxzZQorICAgICAgICBwcHIgPSBpc3J2IDw8IDQ7CisgICAgcmV0dXJuIHBwcjsKK30KKworc3RhdGljIGludCBhcGljX2dldF9hcmJfcHJpKEFQSUNTdGF0ZSAqcykKK3sKKyAgICAvKiBYWFg6IGFyYml0cmF0aW9uICovCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHNpZ25hbCB0aGUgQ1BVIGlmIGFuIGlycSBpcyBwZW5kaW5nICovCitzdGF0aWMgdm9pZCBhcGljX3VwZGF0ZV9pcnEoQVBJQ1N0YXRlICpzKQoreworICAgIGludCBpcnJ2LCBwcHI7CisgICAgaWYgKCEocy0+c3B1cmlvdXNfdmVjICYgQVBJQ19TVl9FTkFCTEUpKQorICAgICAgICByZXR1cm47CisgICAgaXJydiA9IGdldF9oaWdoZXN0X3ByaW9yaXR5X2ludChzLT5pcnIpOworICAgIGlmIChpcnJ2IDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIHBwciA9IGFwaWNfZ2V0X3BwcihzKTsKKyAgICBpZiAocHByICYmIChpcnJ2ICYgMHhmMCkgPD0gKHBwciAmIDB4ZjApKQorICAgICAgICByZXR1cm47CisgICAgY3B1X2ludGVycnVwdChFTlZfR0VUX0NQVShzLT5jcHVfZW52KSwgQ1BVX0lOVEVSUlVQVF9IQVJEKTsKK30KKwordm9pZCBhcGljX3Jlc2V0X2lycV9kZWxpdmVyZWQodm9pZCkKK3sKKyAgICBhcGljX2lycV9kZWxpdmVyZWQgPSAwOworfQorCitpbnQgYXBpY19nZXRfaXJxX2RlbGl2ZXJlZCh2b2lkKQoreworICAgIHJldHVybiBhcGljX2lycV9kZWxpdmVyZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNfc2V0X2lycShBUElDU3RhdGUgKnMsIGludCB2ZWN0b3JfbnVtLCBpbnQgdHJpZ2dlcl9tb2RlKQoreworICAgIGFwaWNfaXJxX2RlbGl2ZXJlZCArPSAhZ2V0X2JpdChzLT5pcnIsIHZlY3Rvcl9udW0pOworCisgICAgc2V0X2JpdChzLT5pcnIsIHZlY3Rvcl9udW0pOworICAgIGlmICh0cmlnZ2VyX21vZGUpCisgICAgICAgIHNldF9iaXQocy0+dG1yLCB2ZWN0b3JfbnVtKTsKKyAgICBlbHNlCisgICAgICAgIHJlc2V0X2JpdChzLT50bXIsIHZlY3Rvcl9udW0pOworICAgIGFwaWNfdXBkYXRlX2lycShzKTsKK30KKworc3RhdGljIHZvaWQgYXBpY19lb2koQVBJQ1N0YXRlICpzKQoreworICAgIGludCBpc3J2OworICAgIGlzcnYgPSBnZXRfaGlnaGVzdF9wcmlvcml0eV9pbnQocy0+aXNyKTsKKyAgICBpZiAoaXNydiA8IDApCisgICAgICAgIHJldHVybjsKKyAgICByZXNldF9iaXQocy0+aXNyLCBpc3J2KTsKKyAgICAvKiBYWFg6IHNlbmQgdGhlIEVPSSBwYWNrZXQgdG8gdGhlIEFQSUMgYnVzIHRvIGFsbG93IHRoZSBJL08gQVBJQyB0bworICAgICAgICAgICAgc2V0IHRoZSByZW1vdGUgSVJSIGJpdCBmb3IgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMuICovCisgICAgYXBpY191cGRhdGVfaXJxKHMpOworfQorCitzdGF0aWMgaW50IGFwaWNfZmluZF9kZXN0KHVpbnQ4X3QgZGVzdCkKK3sKKyAgICBBUElDU3RhdGUgKmFwaWMgPSBsb2NhbF9hcGljc1tkZXN0XTsKKyAgICBpbnQgaTsKKworICAgIGlmIChhcGljICYmIGFwaWMtPmlkID09IGRlc3QpCisgICAgICAgIHJldHVybiBkZXN0OyAgLyogc2hvcnRjdXQgaW4gY2FzZSBhcGljLT5pZCA9PSBhcGljLT5pZHggKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQVBJQ1M7IGkrKykgeworICAgICAgICBhcGljID0gbG9jYWxfYXBpY3NbaV07CisJaWYgKGFwaWMgJiYgYXBpYy0+aWQgPT0gZGVzdCkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgYXBpY19nZXRfZGVsaXZlcnlfYml0bWFzayh1aW50MzJfdCAqZGVsaXZlcl9iaXRtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRlc3QsIHVpbnQ4X3QgZGVzdF9tb2RlKQoreworICAgIEFQSUNTdGF0ZSAqYXBpY19pdGVyOworICAgIGludCBpOworCisgICAgaWYgKGRlc3RfbW9kZSA9PSAwKSB7CisgICAgICAgIGlmIChkZXN0ID09IDB4ZmYpIHsKKyAgICAgICAgICAgIG1lbXNldChkZWxpdmVyX2JpdG1hc2ssIDB4ZmYsIE1BWF9BUElDX1dPUkRTICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gYXBpY19maW5kX2Rlc3QoZGVzdCk7CisgICAgICAgICAgICBtZW1zZXQoZGVsaXZlcl9iaXRtYXNrLCAweDAwLCBNQVhfQVBJQ19XT1JEUyAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKQorICAgICAgICAgICAgICAgIHNldF9iaXQoZGVsaXZlcl9iaXRtYXNrLCBpZHgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogWFhYOiBjbHVzdGVyIG1vZGUgKi8KKyAgICAgICAgbWVtc2V0KGRlbGl2ZXJfYml0bWFzaywgMHgwMCwgTUFYX0FQSUNfV09SRFMgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgTUFYX0FQSUNTOyBpKyspIHsKKyAgICAgICAgICAgIGFwaWNfaXRlciA9IGxvY2FsX2FwaWNzW2ldOworICAgICAgICAgICAgaWYgKGFwaWNfaXRlcikgeworICAgICAgICAgICAgICAgIGlmIChhcGljX2l0ZXItPmRlc3RfbW9kZSA9PSAweGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3QgJiBhcGljX2l0ZXItPmxvZ19kZXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChkZWxpdmVyX2JpdG1hc2ssIGkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpY19pdGVyLT5kZXN0X21vZGUgPT0gMHgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZGVzdCAmIDB4ZjApID09IChhcGljX2l0ZXItPmxvZ19kZXN0ICYgMHhmMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0ICYgYXBpY19pdGVyLT5sb2dfZGVzdCAmIDB4MGYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYml0KGRlbGl2ZXJfYml0bWFzaywgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBhcGljX2luaXRfcmVzZXQoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKworICAgIHMtPnRwciA9IDA7CisgICAgcy0+c3B1cmlvdXNfdmVjID0gMHhmZjsKKyAgICBzLT5sb2dfZGVzdCA9IDA7CisgICAgcy0+ZGVzdF9tb2RlID0gMHhmOworICAgIG1lbXNldChzLT5pc3IsIDAsIHNpemVvZihzLT5pc3IpKTsKKyAgICBtZW1zZXQocy0+dG1yLCAwLCBzaXplb2Yocy0+dG1yKSk7CisgICAgbWVtc2V0KHMtPmlyciwgMCwgc2l6ZW9mKHMtPmlycikpOworICAgIGZvcihpID0gMDsgaSA8IEFQSUNfTFZUX05COyBpKyspCisgICAgICAgIHMtPmx2dFtpXSA9IDEgPDwgMTY7IC8qIG1hc2sgTFZUICovCisgICAgcy0+ZXNyID0gMDsKKyAgICBtZW1zZXQocy0+aWNyLCAwLCBzaXplb2Yocy0+aWNyKSk7CisgICAgcy0+ZGl2aWRlX2NvbmYgPSAwOworICAgIHMtPmNvdW50X3NoaWZ0ID0gMDsKKyAgICBzLT5pbml0aWFsX2NvdW50ID0gMDsKKyAgICBzLT5pbml0aWFsX2NvdW50X2xvYWRfdGltZSA9IDA7CisgICAgcy0+bmV4dF90aW1lID0gMDsKKyAgICBzLT53YWl0X2Zvcl9zaXBpID0gMTsKKworICAgIEVOVl9HRVRfQ1BVKGVudiktPmhhbHRlZCA9ICEocy0+YXBpY2Jhc2UgJiBNU1JfSUEzMl9BUElDQkFTRV9CU1ApOworfQorCitzdGF0aWMgdm9pZCBhcGljX3N0YXJ0dXAoQVBJQ1N0YXRlICpzLCBpbnQgdmVjdG9yX251bSkKK3sKKyAgICBzLT5zaXBpX3ZlY3RvciA9IHZlY3Rvcl9udW07CisgICAgY3B1X2ludGVycnVwdChFTlZfR0VUX0NQVShzLT5jcHVfZW52KSwgQ1BVX0lOVEVSUlVQVF9TSVBJKTsKK30KKwordm9pZCBhcGljX3NpcGkoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBDUFVTdGF0ZSAqY3B1ID0gRU5WX0dFVF9DUFUoZW52KTsKKyAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisKKyAgICBjcHVfcmVzZXRfaW50ZXJydXB0KGNwdSwgQ1BVX0lOVEVSUlVQVF9TSVBJKTsKKworICAgIGlmICghcy0+d2FpdF9mb3Jfc2lwaSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZW52LT5laXAgPSAwOworICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0NTLCBzLT5zaXBpX3ZlY3RvciA8PCA4LCBzLT5zaXBpX3ZlY3RvciA8PCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZiwgMCk7CisgICAgY3B1LT5oYWx0ZWQgPSAwOworICAgIHMtPndhaXRfZm9yX3NpcGkgPSAwOworfQorCitzdGF0aWMgdm9pZCBhcGljX2RlbGl2ZXIoQVBJQ1N0YXRlICpzLCB1aW50OF90IGRlc3QsIHVpbnQ4X3QgZGVzdF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGVsaXZlcnlfbW9kZSwgdWludDhfdCB2ZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcG9sYXJpdHksIHVpbnQ4X3QgdHJpZ2dlcl9tb2RlKQoreworICAgIHVpbnQzMl90IGRlbGl2ZXJfYml0bWFza1tNQVhfQVBJQ19XT1JEU107CisgICAgaW50IGRlc3Rfc2hvcnRoYW5kID0gKHMtPmljclswXSA+PiAxOCkgJiAzOworICAgIEFQSUNTdGF0ZSAqYXBpY19pdGVyOworCisgICAgc3dpdGNoIChkZXN0X3Nob3J0aGFuZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgYXBpY19nZXRfZGVsaXZlcnlfYml0bWFzayhkZWxpdmVyX2JpdG1hc2ssIGRlc3QsIGRlc3RfbW9kZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgbWVtc2V0KGRlbGl2ZXJfYml0bWFzaywgMHgwMCwgc2l6ZW9mKGRlbGl2ZXJfYml0bWFzaykpOworICAgICAgICBzZXRfYml0KGRlbGl2ZXJfYml0bWFzaywgcy0+aWR4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBtZW1zZXQoZGVsaXZlcl9iaXRtYXNrLCAweGZmLCBzaXplb2YoZGVsaXZlcl9iaXRtYXNrKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgbWVtc2V0KGRlbGl2ZXJfYml0bWFzaywgMHhmZiwgc2l6ZW9mKGRlbGl2ZXJfYml0bWFzaykpOworICAgICAgICByZXNldF9iaXQoZGVsaXZlcl9iaXRtYXNrLCBzLT5pZHgpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRlbGl2ZXJ5X21vZGUpIHsKKyAgICAgICAgY2FzZSBBUElDX0RNX0lOSVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRyaWdfbW9kZSA9IChzLT5pY3JbMF0gPj4gMTUpICYgMTsKKyAgICAgICAgICAgICAgICBpbnQgbGV2ZWwgPSAocy0+aWNyWzBdID4+IDE0KSAmIDE7CisgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IDAgJiYgdHJpZ19tb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yZWFjaF9hcGljKGFwaWNfaXRlciwgZGVsaXZlcl9iaXRtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpY19pdGVyLT5hcmJfaWQgPSBhcGljX2l0ZXItPmlkICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFQSUNfRE1fU0lQSToKKyAgICAgICAgICAgIGZvcmVhY2hfYXBpYyhhcGljX2l0ZXIsIGRlbGl2ZXJfYml0bWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcGljX3N0YXJ0dXAoYXBpY19pdGVyLCB2ZWN0b3JfbnVtKSApOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFwaWNfYnVzX2RlbGl2ZXIoZGVsaXZlcl9iaXRtYXNrLCBkZWxpdmVyeV9tb2RlLCB2ZWN0b3JfbnVtLCBwb2xhcml0eSwKKyAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfbW9kZSk7Cit9CisKK2ludCBhcGljX2dldF9pbnRlcnJ1cHQoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBBUElDU3RhdGUgKnMgPSBlbnYtPmFwaWNfc3RhdGU7CisgICAgaW50IGludG5vOworCisgICAgLyogaWYgdGhlIEFQSUMgaXMgaW5zdGFsbGVkIG9yIGVuYWJsZWQsIHdlIGxldCB0aGUgODI1OSBoYW5kbGUgdGhlCisgICAgICAgSVJRcyAqLworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghKHMtPnNwdXJpb3VzX3ZlYyAmIEFQSUNfU1ZfRU5BQkxFKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogWFhYOiBzcHVyaW91cyBJUlEgaGFuZGxpbmcgKi8KKyAgICBpbnRubyA9IGdldF9oaWdoZXN0X3ByaW9yaXR5X2ludChzLT5pcnIpOworICAgIGlmIChpbnRubyA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocy0+dHByICYmIGludG5vIDw9IHMtPnRwcikKKyAgICAgICAgcmV0dXJuIHMtPnNwdXJpb3VzX3ZlYyAmIDB4ZmY7CisgICAgcmVzZXRfYml0KHMtPmlyciwgaW50bm8pOworICAgIHNldF9iaXQocy0+aXNyLCBpbnRubyk7CisgICAgYXBpY191cGRhdGVfaXJxKHMpOworICAgIHJldHVybiBpbnRubzsKK30KKworaW50IGFwaWNfYWNjZXB0X3BpY19pbnRyKENQVU9sZFN0YXRlICplbnYpCit7CisgICAgQVBJQ1N0YXRlICpzID0gZW52LT5hcGljX3N0YXRlOworICAgIHVpbnQzMl90IGx2dDA7CisKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGx2dDAgPSBzLT5sdnRbQVBJQ19MVlRfTElOVDBdOworCisgICAgaWYgKChzLT5hcGljYmFzZSAmIE1TUl9JQTMyX0FQSUNCQVNFX0VOQUJMRSkgPT0gMCB8fAorICAgICAgICAobHZ0MCAmIEFQSUNfTFZUX01BU0tFRCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGFwaWNfZ2V0X2N1cnJlbnRfY291bnQoQVBJQ1N0YXRlICpzKQoreworICAgIGludDY0X3QgZDsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgZCA9IChxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpIC0gcy0+aW5pdGlhbF9jb3VudF9sb2FkX3RpbWUpID4+CisgICAgICAgIHMtPmNvdW50X3NoaWZ0OworICAgIGlmIChzLT5sdnRbQVBJQ19MVlRfVElNRVJdICYgQVBJQ19MVlRfVElNRVJfUEVSSU9ESUMpIHsKKyAgICAgICAgLyogcGVyaW9kaWMgKi8KKyAgICAgICAgdmFsID0gcy0+aW5pdGlhbF9jb3VudCAtIChkICUgKCh1aW50NjRfdClzLT5pbml0aWFsX2NvdW50ICsgMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkID49IHMtPmluaXRpYWxfY291bnQpCisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwgPSBzLT5pbml0aWFsX2NvdW50IC0gZDsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgYXBpY190aW1lcl91cGRhdGUoQVBJQ1N0YXRlICpzLCBpbnQ2NF90IGN1cnJlbnRfdGltZSkKK3sKKyAgICBpbnQ2NF90IG5leHRfdGltZSwgZDsKKworICAgIGlmICghKHMtPmx2dFtBUElDX0xWVF9USU1FUl0gJiBBUElDX0xWVF9NQVNLRUQpKSB7CisgICAgICAgIGQgPSAoY3VycmVudF90aW1lIC0gcy0+aW5pdGlhbF9jb3VudF9sb2FkX3RpbWUpID4+CisgICAgICAgICAgICBzLT5jb3VudF9zaGlmdDsKKyAgICAgICAgaWYgKHMtPmx2dFtBUElDX0xWVF9USU1FUl0gJiBBUElDX0xWVF9USU1FUl9QRVJJT0RJQykgeworICAgICAgICAgICAgaWYgKCFzLT5pbml0aWFsX2NvdW50KQorICAgICAgICAgICAgICAgIGdvdG8gbm9fdGltZXI7CisgICAgICAgICAgICBkID0gKChkIC8gKCh1aW50NjRfdClzLT5pbml0aWFsX2NvdW50ICsgMSkpICsgMSkgKiAoKHVpbnQ2NF90KXMtPmluaXRpYWxfY291bnQgKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkID49IHMtPmluaXRpYWxfY291bnQpCisgICAgICAgICAgICAgICAgZ290byBub190aW1lcjsKKyAgICAgICAgICAgIGQgPSAodWludDY0X3Qpcy0+aW5pdGlhbF9jb3VudCArIDE7CisgICAgICAgIH0KKyAgICAgICAgbmV4dF90aW1lID0gcy0+aW5pdGlhbF9jb3VudF9sb2FkX3RpbWUgKyAoZCA8PCBzLT5jb3VudF9zaGlmdCk7CisgICAgICAgIHRpbWVyX21vZChzLT50aW1lciwgbmV4dF90aW1lKTsKKyAgICAgICAgcy0+bmV4dF90aW1lID0gbmV4dF90aW1lOworICAgIH0gZWxzZSB7CisgICAgbm9fdGltZXI6CisgICAgICAgIHRpbWVyX2RlbChzLT50aW1lcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhcGljX3RpbWVyKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBBUElDU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBhcGljX2xvY2FsX2RlbGl2ZXIocy0+Y3B1X2VudiwgQVBJQ19MVlRfVElNRVIpOworICAgIGFwaWNfdGltZXJfdXBkYXRlKHMsIHMtPm5leHRfdGltZSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBhcGljX21lbV9yZWFkYih2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgYXBpY19tZW1fcmVhZHcodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcikKK3sKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBpY19tZW1fd3JpdGViKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKK30KKworc3RhdGljIHZvaWQgYXBpY19tZW1fd3JpdGV3KHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKK30KKworc3RhdGljIHVpbnQzMl90IGFwaWNfbWVtX3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgQ1BVT2xkU3RhdGUgKmVudjsKKyAgICBBUElDU3RhdGUgKnM7CisgICAgdWludDMyX3QgdmFsOworICAgIGludCBpbmRleDsKKworICAgIGVudiA9IGNwdV9zaW5nbGVfZW52OworICAgIGlmICghZW52KQorICAgICAgICByZXR1cm4gMDsKKyAgICBzID0gZW52LT5hcGljX3N0YXRlOworCisgICAgaW5kZXggPSAoYWRkciA+PiA0KSAmIDB4ZmY7CisgICAgc3dpdGNoKGluZGV4KSB7CisgICAgY2FzZSAweDAyOiAvKiBpZCAqLworICAgICAgICB2YWwgPSBzLT5pZCA8PCAyNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAzOiAvKiB2ZXJzaW9uICovCisgICAgICAgIHZhbCA9IDB4MTEgfCAoKEFQSUNfTFZUX05CIC0gMSkgPDwgMTYpOyAvKiB2ZXJzaW9uIDB4MTEgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA4OgorICAgICAgICB2YWwgPSBzLT50cHI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwOToKKyAgICAgICAgdmFsID0gYXBpY19nZXRfYXJiX3ByaShzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDBhOgorICAgICAgICAvKiBwcHIgKi8KKyAgICAgICAgdmFsID0gYXBpY19nZXRfcHByKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGI6CisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwZDoKKyAgICAgICAgdmFsID0gcy0+bG9nX2Rlc3QgPDwgMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwZToKKyAgICAgICAgdmFsID0gcy0+ZGVzdF9tb2RlIDw8IDI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGY6CisgICAgICAgIHZhbCA9IHMtPnNwdXJpb3VzX3ZlYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEwIC4uLiAweDE3OgorICAgICAgICB2YWwgPSBzLT5pc3JbaW5kZXggJiA3XTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDE4IC4uLiAweDFmOgorICAgICAgICB2YWwgPSBzLT50bXJbaW5kZXggJiA3XTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDIwIC4uLiAweDI3OgorICAgICAgICB2YWwgPSBzLT5pcnJbaW5kZXggJiA3XTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDI4OgorICAgICAgICB2YWwgPSBzLT5lc3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzMDoKKyAgICBjYXNlIDB4MzE6CisgICAgICAgIHZhbCA9IHMtPmljcltpbmRleCAmIDFdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzIgLi4uIDB4Mzc6CisgICAgICAgIHZhbCA9IHMtPmx2dFtpbmRleCAtIDB4MzJdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4Mzg6CisgICAgICAgIHZhbCA9IHMtPmluaXRpYWxfY291bnQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzOToKKyAgICAgICAgdmFsID0gYXBpY19nZXRfY3VycmVudF9jb3VudChzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNlOgorICAgICAgICB2YWwgPSBzLT5kaXZpZGVfY29uZjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcy0+ZXNyIHw9IEVTUl9JTExFR0FMX0FERFJFU1M7CisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNpZmRlZiBERUJVR19BUElDCisgICAgcHJpbnRmKCJBUElDIHJlYWQ6ICUwOHggPSAlMDh4XG4iLCAodWludDMyX3QpYWRkciwgdmFsKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNfbWVtX3dyaXRlbCh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgQ1BVT2xkU3RhdGUgKmVudjsKKyAgICBBUElDU3RhdGUgKnM7CisgICAgaW50IGluZGV4OworCisgICAgZW52ID0gY3B1X3NpbmdsZV9lbnY7CisgICAgaWYgKCFlbnYpCisgICAgICAgIHJldHVybjsKKyAgICBzID0gZW52LT5hcGljX3N0YXRlOworCisjaWZkZWYgREVCVUdfQVBJQworICAgIHByaW50ZigiQVBJQyB3cml0ZTogJTA4eCA9ICUwOHhcbiIsICh1aW50MzJfdClhZGRyLCB2YWwpOworI2VuZGlmCisKKyAgICBpbmRleCA9IChhZGRyID4+IDQpICYgMHhmZjsKKyAgICBzd2l0Y2goaW5kZXgpIHsKKyAgICBjYXNlIDB4MDI6CisgICAgICAgIHMtPmlkID0gKHZhbCA+PiAyNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMzoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA4OgorICAgICAgICBzLT50cHIgPSB2YWw7CisgICAgICAgIGFwaWNfdXBkYXRlX2lycShzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDA5OgorICAgIGNhc2UgMHgwYToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDBiOiAvKiBFT0kgKi8KKyAgICAgICAgYXBpY19lb2kocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwZDoKKyAgICAgICAgcy0+bG9nX2Rlc3QgPSB2YWwgPj4gMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwZToKKyAgICAgICAgcy0+ZGVzdF9tb2RlID0gdmFsID4+IDI4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGY6CisgICAgICAgIHMtPnNwdXJpb3VzX3ZlYyA9IHZhbCAmIDB4MWZmOworICAgICAgICBhcGljX3VwZGF0ZV9pcnEocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMCAuLi4gMHgxNzoKKyAgICBjYXNlIDB4MTggLi4uIDB4MWY6CisgICAgY2FzZSAweDIwIC4uLiAweDI3OgorICAgIGNhc2UgMHgyODoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwOgorICAgICAgICBzLT5pY3JbMF0gPSB2YWw7CisgICAgICAgIGFwaWNfZGVsaXZlcihzLCAocy0+aWNyWzFdID4+IDI0KSAmIDB4ZmYsIChzLT5pY3JbMF0gPj4gMTEpICYgMSwKKyAgICAgICAgICAgICAgICAgICAgIChzLT5pY3JbMF0gPj4gOCkgJiA3LCAocy0+aWNyWzBdICYgMHhmZiksCisgICAgICAgICAgICAgICAgICAgICAocy0+aWNyWzBdID4+IDE0KSAmIDEsIChzLT5pY3JbMF0gPj4gMTUpICYgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzMToKKyAgICAgICAgcy0+aWNyWzFdID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzIgLi4uIDB4Mzc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuID0gaW5kZXggLSAweDMyOworICAgICAgICAgICAgcy0+bHZ0W25dID0gdmFsOworICAgICAgICAgICAgaWYgKG4gPT0gQVBJQ19MVlRfVElNRVIpCisgICAgICAgICAgICAgICAgYXBpY190aW1lcl91cGRhdGUocywgcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDM4OgorICAgICAgICBzLT5pbml0aWFsX2NvdW50ID0gdmFsOworICAgICAgICBzLT5pbml0aWFsX2NvdW50X2xvYWRfdGltZSA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgICAgIGFwaWNfdGltZXJfdXBkYXRlKHMsIHMtPmluaXRpYWxfY291bnRfbG9hZF90aW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDM5OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4M2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2OworICAgICAgICAgICAgcy0+ZGl2aWRlX2NvbmYgPSB2YWwgJiAweGI7CisgICAgICAgICAgICB2ID0gKHMtPmRpdmlkZV9jb25mICYgMykgfCAoKHMtPmRpdmlkZV9jb25mID4+IDEpICYgNCk7CisgICAgICAgICAgICBzLT5jb3VudF9zaGlmdCA9ICh2ICsgMSkgJiA3OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHMtPmVzciB8PSBFU1JfSUxMRUdBTF9BRERSRVNTOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFwaWNfc2F2ZShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKQoreworICAgIEFQSUNTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5hcGljYmFzZSk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmlkKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+YXJiX2lkKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+dHByKTsKKyAgICBxZW11X3B1dF9iZTMycyhmLCAmcy0+c3B1cmlvdXNfdmVjKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+bG9nX2Rlc3QpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5kZXN0X21vZGUpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmUzMnMoZiwgJnMtPmlzcltpXSk7CisgICAgICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT50bXJbaV0pOworICAgICAgICBxZW11X3B1dF9iZTMycyhmLCAmcy0+aXJyW2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IEFQSUNfTFZUX05COyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmUzMnMoZiwgJnMtPmx2dFtpXSk7CisgICAgfQorICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5lc3IpOworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5pY3JbMF0pOworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5pY3JbMV0pOworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZzLT5kaXZpZGVfY29uZik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5jb3VudF9zaGlmdCk7CisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJnMtPmluaXRpYWxfY291bnQpOworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+aW5pdGlhbF9jb3VudF9sb2FkX3RpbWUpOworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+bmV4dF90aW1lKTsKKworICAgIHRpbWVyX3B1dChmLCBzLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgYXBpY19sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIEFQSUNTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIGlmICh2ZXJzaW9uX2lkID4gMikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBYWFg6IHdoYXQgaWYgdGhlIGJhc2UgY2hhbmdlcz8gKHJlZ2lzdGVyZWQgbWVtb3J5IHJlZ2lvbnMpICovCisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmFwaWNiYXNlKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+aWQpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5hcmJfaWQpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT50cHIpOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZzLT5zcHVyaW91c192ZWMpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5sb2dfZGVzdCk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmRlc3RfbW9kZSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBxZW11X2dldF9iZTMycyhmLCAmcy0+aXNyW2ldKTsKKyAgICAgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPnRtcltpXSk7CisgICAgICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZzLT5pcnJbaV0pOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVBJQ19MVlRfTkI7IGkrKykgeworICAgICAgICBxZW11X2dldF9iZTMycyhmLCAmcy0+bHZ0W2ldKTsKKyAgICB9CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmVzcik7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmljclswXSk7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmljclsxXSk7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJnMtPmRpdmlkZV9jb25mKTsKKyAgICBzLT5jb3VudF9zaGlmdD1xZW11X2dldF9iZTMyKGYpOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZzLT5pbml0aWFsX2NvdW50KTsKKyAgICBzLT5pbml0aWFsX2NvdW50X2xvYWRfdGltZT1xZW11X2dldF9iZTY0KGYpOworICAgIHMtPm5leHRfdGltZT1xZW11X2dldF9iZTY0KGYpOworCisgICAgaWYgKHZlcnNpb25faWQgPj0gMikKKyAgICAgICAgdGltZXJfZ2V0KGYsIHMtPnRpbWVyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBpY19yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgQVBJQ1N0YXRlICpzID0gb3BhcXVlOworICAgIGludCBic3AgPSBjcHVfaXNfYnNwKHMtPmNwdV9lbnYpOworCisgICAgcy0+YXBpY2Jhc2UgPSAweGZlZTAwMDAwIHwKKyAgICAgICAgKGJzcCA/IE1TUl9JQTMyX0FQSUNCQVNFX0JTUCA6IDApIHwgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFOworCisgICAgY3B1X3Jlc2V0KEVOVl9HRVRfQ1BVKHMtPmNwdV9lbnYpKTsKKyAgICBhcGljX2luaXRfcmVzZXQocy0+Y3B1X2Vudik7CisKKyAgICBpZiAoYnNwKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIExJTlQwIGRlbGl2ZXJ5IG1vZGUgb24gQ1BVICMwIGlzIHNldCB0byBFeHRJbnQgYXQgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICogdGltZSB0eXBpY2FsbHkgYnkgQklPUywgc28gUElDIGludGVycnVwdCBjYW4gYmUgZGVsaXZlcmVkIHRvIHRoZQorICAgICAgICAgKiBwcm9jZXNzb3Igd2hlbiBsb2NhbCBBUElDIGlzIGVuYWJsZWQuCisgICAgICAgICAqLworICAgICAgICBzLT5sdnRbQVBJQ19MVlRfTElOVDBdID0gMHg3MDA7CisgICAgfQorfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmFwaWNfbWVtX3JlYWRbM10gPSB7CisgICAgYXBpY19tZW1fcmVhZGIsCisgICAgYXBpY19tZW1fcmVhZHcsCisgICAgYXBpY19tZW1fcmVhZGwsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICphcGljX21lbV93cml0ZVszXSA9IHsKKyAgICBhcGljX21lbV93cml0ZWIsCisgICAgYXBpY19tZW1fd3JpdGV3LAorICAgIGFwaWNfbWVtX3dyaXRlbCwKK307CisKK2ludCBhcGljX2luaXQoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBBUElDU3RhdGUgKnM7CisKKyAgICBpZiAobGFzdF9hcGljX2lkeCA+PSBNQVhfQVBJQ1MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihBUElDU3RhdGUpKTsKKyAgICBlbnYtPmFwaWNfc3RhdGUgPSBzOworICAgIHMtPmlkeCA9IGxhc3RfYXBpY19pZHgrKzsKKyAgICBzLT5pZCA9IGVudi0+Y3B1aWRfYXBpY19pZDsKKyAgICBzLT5jcHVfZW52ID0gZW52OworCisgICAgYXBpY19yZXNldChzKTsKKworICAgIC8qIFhYWDogbWFwcGluZyBtb3JlIEFQSUNzIGF0IHRoZSBzYW1lIG1lbW9yeSBsb2NhdGlvbiAqLworICAgIGlmIChhcGljX2lvX21lbW9yeSA9PSAwKSB7CisgICAgICAgIC8qIE5PVEU6IHRoZSBBUElDIGlzIGRpcmVjdGx5IGNvbm5lY3RlZCB0byB0aGUgQ1BVIC0gaXQgaXMgbm90CisgICAgICAgICAgIG9uIHRoZSBnbG9iYWwgbWVtb3J5IGJ1cy4gKi8KKyAgICAgICAgYXBpY19pb19tZW1vcnkgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KGFwaWNfbWVtX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljX21lbV93cml0ZSwgTlVMTCk7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkocy0+YXBpY2Jhc2UgJiB+MHhmZmYsIDB4MTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGljX2lvX21lbW9yeSk7CisgICAgfQorICAgIHMtPnRpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfVklSVFVBTCwgU0NBTEVfTlMsIGFwaWNfdGltZXIsIHMpOworCisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJhcGljIiwgcy0+aWR4LCAyLCBhcGljX3NhdmUsIGFwaWNfbG9hZCwgcyk7CisgICAgcWVtdV9yZWdpc3Rlcl9yZXNldChhcGljX3Jlc2V0LCAwLCBzKTsKKworICAgIGxvY2FsX2FwaWNzW3MtPmlkeF0gPSBzOworICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L2ludGMvaTgyNTkuYyBiL2FuZHJvaWQvcWVtdTEvaHcvaW50Yy9pODI1OS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2VkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L2ludGMvaTgyNTkuYwpAQCAtMCwwICsxLDU3MSBAQAorLyoKKyAqIFFFTVUgODI1OSBpbnRlcnJ1cHQgY29udHJvbGxlciBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2kzODYvcGMuaCIKKyNpbmNsdWRlICJody9pc2EvaXNhLmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAiaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaCIKKworLyogZGVidWcgUElDICovCisvLyNkZWZpbmUgREVCVUdfUElDCisKKy8vI2RlZmluZSBERUJVR19JUlFfTEFURU5DWQorLy8jZGVmaW5lIERFQlVHX0lSUV9DT1VOVAorCit0eXBlZGVmIHN0cnVjdCBQaWNTdGF0ZSB7CisgICAgdWludDhfdCBsYXN0X2lycjsgLyogZWRnZSBkZXRlY3Rpb24gKi8KKyAgICB1aW50OF90IGlycjsgLyogaW50ZXJydXB0IHJlcXVlc3QgcmVnaXN0ZXIgKi8KKyAgICB1aW50OF90IGltcjsgLyogaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyAgICB1aW50OF90IGlzcjsgLyogaW50ZXJydXB0IHNlcnZpY2UgcmVnaXN0ZXIgKi8KKyAgICB1aW50OF90IHByaW9yaXR5X2FkZDsgLyogaGlnaGVzdCBpcnEgcHJpb3JpdHkgKi8KKyAgICB1aW50OF90IGlycV9iYXNlOworICAgIHVpbnQ4X3QgcmVhZF9yZWdfc2VsZWN0OworICAgIHVpbnQ4X3QgcG9sbDsKKyAgICB1aW50OF90IHNwZWNpYWxfbWFzazsKKyAgICB1aW50OF90IGluaXRfc3RhdGU7CisgICAgdWludDhfdCBhdXRvX2VvaTsKKyAgICB1aW50OF90IHJvdGF0ZV9vbl9hdXRvX2VvaTsKKyAgICB1aW50OF90IHNwZWNpYWxfZnVsbHlfbmVzdGVkX21vZGU7CisgICAgdWludDhfdCBpbml0NDsgLyogdHJ1ZSBpZiA0IGJ5dGUgaW5pdCAqLworICAgIHVpbnQ4X3Qgc2luZ2xlX21vZGU7IC8qIHRydWUgaWYgc2xhdmUgcGljIGlzIG5vdCBpbml0aWFsaXplZCAqLworICAgIHVpbnQ4X3QgZWxjcjsgLyogUElJWCBlZGdlL3RyaWdnZXIgc2VsZWN0aW9uKi8KKyAgICB1aW50OF90IGVsY3JfbWFzazsKKyAgICBQaWNTdGF0ZTIgKnBpY3Nfc3RhdGU7Cit9IFBpY1N0YXRlOworCitzdHJ1Y3QgUGljU3RhdGUyIHsKKyAgICAvKiAwIGlzIG1hc3RlciBwaWMsIDEgaXMgc2xhdmUgcGljICovCisgICAgLyogWFhYOiBiZXR0ZXIgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSB0d28gcGljcyAqLworICAgIFBpY1N0YXRlIHBpY3NbMl07CisgICAgcWVtdV9pcnEgcGFyZW50X2lycTsKKyAgICB2b2lkICppcnFfcmVxdWVzdF9vcGFxdWU7CisgICAgLyogSU9BUElDIGNhbGxiYWNrIHN1cHBvcnQgKi8KKyAgICBTZXRJUlFGdW5jICphbHRfaXJxX2Z1bmM7CisgICAgdm9pZCAqYWx0X2lycV9vcGFxdWU7Cit9OworCisjaWYgZGVmaW5lZChERUJVR19QSUMpIHx8IGRlZmluZWQgKERFQlVHX0lSUV9DT1VOVCkKK3N0YXRpYyBpbnQgaXJxX2xldmVsWzE2XTsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0lSUV9DT1VOVAorc3RhdGljIHVpbnQ2NF90IGlycV9jb3VudFsxNl07CisjZW5kaWYKKworLyogc2V0IGlycSBsZXZlbC4gSWYgYW4gZWRnZSBpcyBkZXRlY3RlZCwgdGhlbiB0aGUgSVJSIGlzIHNldCB0byAxICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGljX3NldF9pcnExKFBpY1N0YXRlICpzLCBpbnQgaXJxLCBpbnQgbGV2ZWwpCit7CisgICAgaW50IG1hc2s7CisgICAgbWFzayA9IDEgPDwgaXJxOworICAgIGlmIChzLT5lbGNyICYgbWFzaykgeworICAgICAgICAvKiBsZXZlbCB0cmlnZ2VyZWQgKi8KKyAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICBzLT5pcnIgfD0gbWFzazsKKyAgICAgICAgICAgIHMtPmxhc3RfaXJyIHw9IG1hc2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5pcnIgJj0gfm1hc2s7CisgICAgICAgICAgICBzLT5sYXN0X2lyciAmPSB+bWFzazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGVkZ2UgdHJpZ2dlcmVkICovCisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgaWYgKChzLT5sYXN0X2lyciAmIG1hc2spID09IDApCisgICAgICAgICAgICAgICAgcy0+aXJyIHw9IG1hc2s7CisgICAgICAgICAgICBzLT5sYXN0X2lyciB8PSBtYXNrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+bGFzdF9pcnIgJj0gfm1hc2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIHJldHVybiB0aGUgaGlnaGVzdCBwcmlvcml0eSBmb3VuZCBpbiBtYXNrIChoaWdoZXN0ID0gc21hbGxlc3QKKyAgIG51bWJlcikuIFJldHVybiA4IGlmIG5vIGlycSAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3ByaW9yaXR5KFBpY1N0YXRlICpzLCBpbnQgbWFzaykKK3sKKyAgICBpbnQgcHJpb3JpdHk7CisgICAgaWYgKG1hc2sgPT0gMCkKKyAgICAgICAgcmV0dXJuIDg7CisgICAgcHJpb3JpdHkgPSAwOworICAgIHdoaWxlICgobWFzayAmICgxIDw8ICgocHJpb3JpdHkgKyBzLT5wcmlvcml0eV9hZGQpICYgNykpKSA9PSAwKQorICAgICAgICBwcmlvcml0eSsrOworICAgIHJldHVybiBwcmlvcml0eTsKK30KKworLyogcmV0dXJuIHRoZSBwaWMgd2FudGVkIGludGVycnVwdC4gcmV0dXJuIC0xIGlmIG5vbmUgKi8KK3N0YXRpYyBpbnQgcGljX2dldF9pcnEoUGljU3RhdGUgKnMpCit7CisgICAgaW50IG1hc2ssIGN1cl9wcmlvcml0eSwgcHJpb3JpdHk7CisKKyAgICBtYXNrID0gcy0+aXJyICYgfnMtPmltcjsKKyAgICBwcmlvcml0eSA9IGdldF9wcmlvcml0eShzLCBtYXNrKTsKKyAgICBpZiAocHJpb3JpdHkgPT0gOCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIGNvbXB1dGUgY3VycmVudCBwcmlvcml0eS4gSWYgc3BlY2lhbCBmdWxseSBuZXN0ZWQgbW9kZSBvbiB0aGUKKyAgICAgICBtYXN0ZXIsIHRoZSBJUlEgY29taW5nIGZyb20gdGhlIHNsYXZlIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQKKyAgICAgICBmb3IgdGhlIHByaW9yaXR5IGNvbXB1dGF0aW9uLiAqLworICAgIG1hc2sgPSBzLT5pc3I7CisgICAgaWYgKHMtPnNwZWNpYWxfbWFzaykKKyAgICAgICAgbWFzayAmPSB+cy0+aW1yOworICAgIGlmIChzLT5zcGVjaWFsX2Z1bGx5X25lc3RlZF9tb2RlICYmIHMgPT0gJnMtPnBpY3Nfc3RhdGUtPnBpY3NbMF0pCisgICAgICAgIG1hc2sgJj0gfigxIDw8IDIpOworICAgIGN1cl9wcmlvcml0eSA9IGdldF9wcmlvcml0eShzLCBtYXNrKTsKKyAgICBpZiAocHJpb3JpdHkgPCBjdXJfcHJpb3JpdHkpIHsKKyAgICAgICAgLyogaGlnaGVyIHByaW9yaXR5IGZvdW5kOiBhbiBpcnEgc2hvdWxkIGJlIGdlbmVyYXRlZCAqLworICAgICAgICByZXR1cm4gKHByaW9yaXR5ICsgcy0+cHJpb3JpdHlfYWRkKSAmIDc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworLyogcmFpc2UgaXJxIHRvIENQVSBpZiBuZWNlc3NhcnkuIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZQorICAgaXJxIG1heSBjaGFuZ2UgKi8KKy8qIFhYWDogc2hvdWxkIG5vdCBleHBvcnQgaXQsIGJ1dCBpdCBpcyBuZWVkZWQgZm9yIGFuIEFQSUMga2x1ZGdlICovCit2b2lkIHBpY191cGRhdGVfaXJxKFBpY1N0YXRlMiAqcykKK3sKKyAgICBpbnQgaXJxMiwgaXJxOworCisgICAgLyogZmlyc3QgbG9vayBhdCBzbGF2ZSBwaWMgKi8KKyAgICBpcnEyID0gcGljX2dldF9pcnEoJnMtPnBpY3NbMV0pOworICAgIGlmIChpcnEyID49IDApIHsKKyAgICAgICAgLyogaWYgaXJxIHJlcXVlc3QgYnkgc2xhdmUgcGljLCBzaWduYWwgbWFzdGVyIFBJQyAqLworICAgICAgICBwaWNfc2V0X2lycTEoJnMtPnBpY3NbMF0sIDIsIDEpOworICAgICAgICBwaWNfc2V0X2lycTEoJnMtPnBpY3NbMF0sIDIsIDApOworICAgIH0KKyAgICAvKiBsb29rIGF0IHJlcXVlc3RlZCBpcnEgKi8KKyAgICBpcnEgPSBwaWNfZ2V0X2lycSgmcy0+cGljc1swXSk7CisgICAgaWYgKGlycSA+PSAwKSB7CisjaWYgZGVmaW5lZChERUJVR19QSUMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJwaWMlZDogaW1yPSV4IGlycj0leCBwYWRkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBzLT5waWNzW2ldLmltciwgcy0+cGljc1tpXS5pcnIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpY3NbaV0ucHJpb3JpdHlfYWRkKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50ZigicGljOiBjcHVfaW50ZXJydXB0XG4iKTsKKyNlbmRpZgorICAgICAgICBxZW11X2lycV9yYWlzZShzLT5wYXJlbnRfaXJxKTsKKyAgICB9CisKKy8qIGFsbCB0YXJnZXRzIHNob3VsZCBkbyB0aGlzIHJhdGhlciB0aGFuIGFja2luZyB0aGUgSVJRIGluIHRoZSBjcHUgKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKSB8fCBkZWZpbmVkKFRBUkdFVF9QUEMpIHx8IGRlZmluZWQoVEFSR0VUX0FMUEhBKQorICAgIGVsc2UgeworICAgICAgICBxZW11X2lycV9sb3dlcihzLT5wYXJlbnRfaXJxKTsKKyAgICB9CisjZW5kaWYKK30KKworI2lmZGVmIERFQlVHX0lSUV9MQVRFTkNZCitpbnQ2NF90IGlycV90aW1lWzE2XTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpODI1OV9zZXRfaXJxKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKQoreworICAgIFBpY1N0YXRlMiAqcyA9IG9wYXF1ZTsKKworI2lmIGRlZmluZWQoREVCVUdfUElDKSB8fCBkZWZpbmVkKERFQlVHX0lSUV9DT1VOVCkKKyAgICBpZiAobGV2ZWwgIT0gaXJxX2xldmVsW2lycV0pIHsKKyNpZiBkZWZpbmVkKERFQlVHX1BJQykKKyAgICAgICAgcHJpbnRmKCJpODI1OV9zZXRfaXJxOiBpcnE9JWQgbGV2ZWw9JWRcbiIsIGlycSwgbGV2ZWwpOworI2VuZGlmCisgICAgICAgIGlycV9sZXZlbFtpcnFdID0gbGV2ZWw7CisjaWZkZWYgREVCVUdfSVJRX0NPVU5UCisJaWYgKGxldmVsID09IDEpCisJICAgIGlycV9jb3VudFtpcnFdKys7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZmRlZiBERUJVR19JUlFfTEFURU5DWQorICAgIGlmIChsZXZlbCkgeworICAgICAgICBpcnFfdGltZVtpcnFdID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKTsKKyAgICB9CisjZW5kaWYKKyAgICBwaWNfc2V0X2lycTEoJnMtPnBpY3NbaXJxID4+IDNdLCBpcnEgJiA3LCBsZXZlbCk7CisgICAgLyogdXNlZCBmb3IgSU9BUElDIGlycXMgKi8KKyAgICBpZiAocy0+YWx0X2lycV9mdW5jKQorICAgICAgICBzLT5hbHRfaXJxX2Z1bmMocy0+YWx0X2lycV9vcGFxdWUsIGlycSwgbGV2ZWwpOworICAgIHBpY191cGRhdGVfaXJxKHMpOworfQorCisvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgJ2lycScgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwaWNfaW50YWNrKFBpY1N0YXRlICpzLCBpbnQgaXJxKQoreworICAgIGlmIChzLT5hdXRvX2VvaSkgeworICAgICAgICBpZiAocy0+cm90YXRlX29uX2F1dG9fZW9pKQorICAgICAgICAgICAgcy0+cHJpb3JpdHlfYWRkID0gKGlycSArIDEpICYgNzsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5pc3IgfD0gKDEgPDwgaXJxKTsKKyAgICB9CisgICAgLyogV2UgZG9uJ3QgY2xlYXIgYSBsZXZlbCBzZW5zaXRpdmUgaW50ZXJydXB0IGhlcmUgKi8KKyAgICBpZiAoIShzLT5lbGNyICYgKDEgPDwgaXJxKSkpCisgICAgICAgIHMtPmlyciAmPSB+KDEgPDwgaXJxKTsKK30KKworaW50IHBpY19yZWFkX2lycShQaWNTdGF0ZTIgKnMpCit7CisgICAgaW50IGlycSwgaXJxMiwgaW50bm87CisKKyAgICBpcnEgPSBwaWNfZ2V0X2lycSgmcy0+cGljc1swXSk7CisgICAgaWYgKGlycSA+PSAwKSB7CisgICAgICAgIHBpY19pbnRhY2soJnMtPnBpY3NbMF0sIGlycSk7CisgICAgICAgIGlmIChpcnEgPT0gMikgeworICAgICAgICAgICAgaXJxMiA9IHBpY19nZXRfaXJxKCZzLT5waWNzWzFdKTsKKyAgICAgICAgICAgIGlmIChpcnEyID49IDApIHsKKyAgICAgICAgICAgICAgICBwaWNfaW50YWNrKCZzLT5waWNzWzFdLCBpcnEyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogc3B1cmlvdXMgSVJRIG9uIHNsYXZlIGNvbnRyb2xsZXIgKi8KKyAgICAgICAgICAgICAgICBpcnEyID0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludG5vID0gcy0+cGljc1sxXS5pcnFfYmFzZSArIGlycTI7CisgICAgICAgICAgICBpcnEgPSBpcnEyICsgODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludG5vID0gcy0+cGljc1swXS5pcnFfYmFzZSArIGlycTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNwdXJpb3VzIElSUSBvbiBob3N0IGNvbnRyb2xsZXIgKi8KKyAgICAgICAgaXJxID0gNzsKKyAgICAgICAgaW50bm8gPSBzLT5waWNzWzBdLmlycV9iYXNlICsgaXJxOworICAgIH0KKyAgICBwaWNfdXBkYXRlX2lycShzKTsKKworI2lmZGVmIERFQlVHX0lSUV9MQVRFTkNZCisgICAgcHJpbnRmKCJJUlElZCBsYXRlbmN5PSUwLjNmdXNcbiIsCisgICAgICAgICAgIGlycSwKKyAgICAgICAgICAgKGRvdWJsZSkocWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKSAtIGlycV90aW1lW2lycV0pICogMTAwMDAwMC4wIC8gZ2V0X3RpY2tzX3Blcl9zZWMpOworI2VuZGlmCisjaWYgZGVmaW5lZChERUJVR19QSUMpCisgICAgcHJpbnRmKCJwaWNfaW50ZXJydXB0OiBpcnE9JWRcbiIsIGlycSk7CisjZW5kaWYKKyAgICByZXR1cm4gaW50bm87Cit9CisKK3N0YXRpYyB2b2lkIHBpY19yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgUGljU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBzLT5sYXN0X2lyciA9IDA7CisgICAgcy0+aXJyID0gMDsKKyAgICBzLT5pbXIgPSAwOworICAgIHMtPmlzciA9IDA7CisgICAgcy0+cHJpb3JpdHlfYWRkID0gMDsKKyAgICBzLT5pcnFfYmFzZSA9IDA7CisgICAgcy0+cmVhZF9yZWdfc2VsZWN0ID0gMDsKKyAgICBzLT5wb2xsID0gMDsKKyAgICBzLT5zcGVjaWFsX21hc2sgPSAwOworICAgIHMtPmluaXRfc3RhdGUgPSAwOworICAgIHMtPmF1dG9fZW9pID0gMDsKKyAgICBzLT5yb3RhdGVfb25fYXV0b19lb2kgPSAwOworICAgIHMtPnNwZWNpYWxfZnVsbHlfbmVzdGVkX21vZGUgPSAwOworICAgIHMtPmluaXQ0ID0gMDsKKyAgICBzLT5zaW5nbGVfbW9kZSA9IDA7CisgICAgLyogTm90ZTogRUxDUiBpcyBub3QgcmVzZXQgKi8KK30KKworc3RhdGljIHZvaWQgcGljX2lvcG9ydF93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBQaWNTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgcHJpb3JpdHksIGNtZCwgaXJxOworCisjaWZkZWYgREVCVUdfUElDCisgICAgcHJpbnRmKCJwaWNfd3JpdGU6IGFkZHI9MHglMDJ4IHZhbD0weCUwMnhcbiIsIGFkZHIsIHZhbCk7CisjZW5kaWYKKyAgICBhZGRyICY9IDE7CisgICAgaWYgKGFkZHIgPT0gMCkgeworICAgICAgICBpZiAodmFsICYgMHgxMCkgeworICAgICAgICAgICAgLyogaW5pdCAqLworICAgICAgICAgICAgcGljX3Jlc2V0KHMpOworICAgICAgICAgICAgLyogZGVhc3NlcnQgYSBwZW5kaW5nIGludGVycnVwdCAqLworICAgICAgICAgICAgcWVtdV9pcnFfbG93ZXIocy0+cGljc19zdGF0ZS0+cGFyZW50X2lycSk7CisgICAgICAgICAgICBzLT5pbml0X3N0YXRlID0gMTsKKyAgICAgICAgICAgIHMtPmluaXQ0ID0gdmFsICYgMTsKKyAgICAgICAgICAgIHMtPnNpbmdsZV9tb2RlID0gdmFsICYgMjsKKyAgICAgICAgICAgIGlmICh2YWwgJiAweDA4KQorICAgICAgICAgICAgICAgIGh3X2Vycm9yKCJsZXZlbCBzZW5zaXRpdmUgaXJxIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgJiAweDA4KSB7CisgICAgICAgICAgICBpZiAodmFsICYgMHgwNCkKKyAgICAgICAgICAgICAgICBzLT5wb2xsID0gMTsKKyAgICAgICAgICAgIGlmICh2YWwgJiAweDAyKQorICAgICAgICAgICAgICAgIHMtPnJlYWRfcmVnX3NlbGVjdCA9IHZhbCAmIDE7CisgICAgICAgICAgICBpZiAodmFsICYgMHg0MCkKKyAgICAgICAgICAgICAgICBzLT5zcGVjaWFsX21hc2sgPSAodmFsID4+IDUpICYgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZCA9IHZhbCA+PiA1OworICAgICAgICAgICAgc3dpdGNoKGNtZCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHMtPnJvdGF0ZV9vbl9hdXRvX2VvaSA9IGNtZCA+PiAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBlbmQgb2YgaW50ZXJydXB0ICovCisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgcHJpb3JpdHkgPSBnZXRfcHJpb3JpdHkocywgcy0+aXNyKTsKKyAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gOCkgeworICAgICAgICAgICAgICAgICAgICBpcnEgPSAocHJpb3JpdHkgKyBzLT5wcmlvcml0eV9hZGQpICYgNzsKKyAgICAgICAgICAgICAgICAgICAgcy0+aXNyICY9IH4oMSA8PCBpcnEpOworICAgICAgICAgICAgICAgICAgICBpZiAoY21kID09IDUpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmlvcml0eV9hZGQgPSAoaXJxICsgMSkgJiA3OworICAgICAgICAgICAgICAgICAgICBwaWNfdXBkYXRlX2lycShzLT5waWNzX3N0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgaXJxID0gdmFsICYgNzsKKyAgICAgICAgICAgICAgICBzLT5pc3IgJj0gfigxIDw8IGlycSk7CisgICAgICAgICAgICAgICAgcGljX3VwZGF0ZV9pcnEocy0+cGljc19zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgcy0+cHJpb3JpdHlfYWRkID0gKHZhbCArIDEpICYgNzsKKyAgICAgICAgICAgICAgICBwaWNfdXBkYXRlX2lycShzLT5waWNzX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBpcnEgPSB2YWwgJiA3OworICAgICAgICAgICAgICAgIHMtPmlzciAmPSB+KDEgPDwgaXJxKTsKKyAgICAgICAgICAgICAgICBzLT5wcmlvcml0eV9hZGQgPSAoaXJxICsgMSkgJiA3OworICAgICAgICAgICAgICAgIHBpY191cGRhdGVfaXJxKHMtPnBpY3Nfc3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiBubyBvcGVyYXRpb24gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaChzLT5pbml0X3N0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIG5vcm1hbCBtb2RlICovCisgICAgICAgICAgICBzLT5pbXIgPSB2YWw7CisgICAgICAgICAgICBwaWNfdXBkYXRlX2lycShzLT5waWNzX3N0YXRlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzLT5pcnFfYmFzZSA9IHZhbCAmIDB4Zjg7CisgICAgICAgICAgICBzLT5pbml0X3N0YXRlID0gcy0+c2luZ2xlX21vZGUgPyAocy0+aW5pdDQgPyAzIDogMCkgOiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChzLT5pbml0NCkgeworICAgICAgICAgICAgICAgIHMtPmluaXRfc3RhdGUgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5pbml0X3N0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzLT5zcGVjaWFsX2Z1bGx5X25lc3RlZF9tb2RlID0gKHZhbCA+PiA0KSAmIDE7CisgICAgICAgICAgICBzLT5hdXRvX2VvaSA9ICh2YWwgPj4gMSkgJiAxOworICAgICAgICAgICAgcy0+aW5pdF9zdGF0ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IHBpY19wb2xsX3JlYWQgKFBpY1N0YXRlICpzLCB1aW50MzJfdCBhZGRyMSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gcGljX2dldF9pcnEocyk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIGlmIChhZGRyMSA+PiA3KSB7CisgICAgICAgICAgICBzLT5waWNzX3N0YXRlLT5waWNzWzBdLmlzciAmPSB+KDEgPDwgMik7CisgICAgICAgICAgICBzLT5waWNzX3N0YXRlLT5waWNzWzBdLmlyciAmPSB+KDEgPDwgMik7CisgICAgICAgIH0KKyAgICAgICAgcy0+aXJyICY9IH4oMSA8PCByZXQpOworICAgICAgICBzLT5pc3IgJj0gfigxIDw8IHJldCk7CisgICAgICAgIGlmIChhZGRyMSA+PiA3IHx8IHJldCAhPSAyKQorICAgICAgICAgICAgcGljX3VwZGF0ZV9pcnEocy0+cGljc19zdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gMHgwNzsKKyAgICAgICAgcGljX3VwZGF0ZV9pcnEocy0+cGljc19zdGF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQzMl90IHBpY19pb3BvcnRfcmVhZCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIxKQoreworICAgIFBpY1N0YXRlICpzID0gb3BhcXVlOworICAgIHVuc2lnbmVkIGludCBhZGRyOworICAgIGludCByZXQ7CisKKyAgICBhZGRyID0gYWRkcjE7CisgICAgYWRkciAmPSAxOworICAgIGlmIChzLT5wb2xsKSB7CisgICAgICAgIHJldCA9IHBpY19wb2xsX3JlYWQocywgYWRkcjEpOworICAgICAgICBzLT5wb2xsID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWRkciA9PSAwKSB7CisgICAgICAgICAgICBpZiAocy0+cmVhZF9yZWdfc2VsZWN0KQorICAgICAgICAgICAgICAgIHJldCA9IHMtPmlzcjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBzLT5pcnI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBzLT5pbXI7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUdfUElDCisgICAgcHJpbnRmKCJwaWNfcmVhZDogYWRkcj0weCUwMnggdmFsPTB4JTAyeFxuIiwgYWRkcjEsIHJldCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBtZW1vcnkgbWFwcGVkIGludGVycnVwdCBzdGF0dXMgKi8KKy8qIFhYWDogbWF5IGJlIHRoZSBzYW1lIHRoYW4gcGljX3JlYWRfaXJxKCkgKi8KK3VpbnQzMl90IHBpY19pbnRhY2tfcmVhZChQaWNTdGF0ZTIgKnMpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHBpY19wb2xsX3JlYWQoJnMtPnBpY3NbMF0sIDB4MDApOworICAgIGlmIChyZXQgPT0gMikKKyAgICAgICAgcmV0ID0gcGljX3BvbGxfcmVhZCgmcy0+cGljc1sxXSwgMHg4MCkgKyA4OworICAgIC8qIFByZXBhcmUgZm9yIElTUiByZWFkICovCisgICAgcy0+cGljc1swXS5yZWFkX3JlZ19zZWxlY3QgPSAxOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZWxjcl9pb3BvcnRfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgUGljU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgcy0+ZWxjciA9IHZhbCAmIHMtPmVsY3JfbWFzazsKK30KKworc3RhdGljIHVpbnQzMl90IGVsY3JfaW9wb3J0X3JlYWQodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyMSkKK3sKKyAgICBQaWNTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICByZXR1cm4gcy0+ZWxjcjsKK30KKworc3RhdGljIHZvaWQgcGljX3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQaWNTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5sYXN0X2lycik7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmlycik7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmltcik7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmlzcik7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnByaW9yaXR5X2FkZCk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmlycV9iYXNlKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+cmVhZF9yZWdfc2VsZWN0KTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+cG9sbCk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnNwZWNpYWxfbWFzayk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmluaXRfc3RhdGUpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5hdXRvX2VvaSk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnJvdGF0ZV9vbl9hdXRvX2VvaSk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnNwZWNpYWxfZnVsbHlfbmVzdGVkX21vZGUpOworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5pbml0NCk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnNpbmdsZV9tb2RlKTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+ZWxjcik7Cit9CisKK3N0YXRpYyBpbnQgcGljX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgUGljU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5sYXN0X2lycik7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmlycik7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmltcik7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmlzcik7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPnByaW9yaXR5X2FkZCk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmlycV9iYXNlKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+cmVhZF9yZWdfc2VsZWN0KTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+cG9sbCk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPnNwZWNpYWxfbWFzayk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmluaXRfc3RhdGUpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5hdXRvX2VvaSk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPnJvdGF0ZV9vbl9hdXRvX2VvaSk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPnNwZWNpYWxfZnVsbHlfbmVzdGVkX21vZGUpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5pbml0NCk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPnNpbmdsZV9tb2RlKTsKKyAgICBxZW11X2dldF84cyhmLCAmcy0+ZWxjcik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFhYWDogYWRkIGdlbmVyaWMgbWFzdGVyL3NsYXZlIHN5c3RlbSAqLworc3RhdGljIHZvaWQgcGljX2luaXQxKGludCBpb19hZGRyLCBpbnQgZWxjcl9hZGRyLCBQaWNTdGF0ZSAqcykKK3sKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoaW9fYWRkciwgMiwgMSwgcGljX2lvcG9ydF93cml0ZSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoaW9fYWRkciwgMiwgMSwgcGljX2lvcG9ydF9yZWFkLCBzKTsKKyAgICBpZiAoZWxjcl9hZGRyID49IDApIHsKKyAgICAgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGVsY3JfYWRkciwgMSwgMSwgZWxjcl9pb3BvcnRfd3JpdGUsIHMpOworICAgICAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChlbGNyX2FkZHIsIDEsIDEsIGVsY3JfaW9wb3J0X3JlYWQsIHMpOworICAgIH0KKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwgImk4MjU5IiwgaW9fYWRkciwgMSwgcGljX3NhdmUsIHBpY19sb2FkLCBzKTsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KHBpY19yZXNldCwgMCwgcyk7Cit9CisKK3ZvaWQgcGljX2luZm8oTW9uaXRvciAqbW9uKQoreworICAgIGludCBpOworICAgIFBpY1N0YXRlICpzOworCisgICAgaWYgKCFpc2FfcGljKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IoaT0wO2k8MjtpKyspIHsKKyAgICAgICAgcyA9ICZpc2FfcGljLT5waWNzW2ldOworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJwaWMlZDogaXJyPSUwMnggaW1yPSUwMnggaXNyPSUwMnggaHByaW89JWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiaXJxX2Jhc2U9JTAyeCBycl9zZWw9JWQgZWxjcj0lMDJ4IGZubT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgcy0+aXJyLCBzLT5pbXIsIHMtPmlzciwgcy0+cHJpb3JpdHlfYWRkLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5pcnFfYmFzZSwgcy0+cmVhZF9yZWdfc2VsZWN0LCBzLT5lbGNyLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5zcGVjaWFsX2Z1bGx5X25lc3RlZF9tb2RlKTsKKyAgICB9Cit9CisKK3ZvaWQgaXJxX2luZm8oTW9uaXRvciAqbW9uKQoreworI2lmbmRlZiBERUJVR19JUlFfQ09VTlQKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICJpcnEgc3RhdGlzdGljIGNvZGUgbm90IGNvbXBpbGVkLlxuIik7CisjZWxzZQorICAgIGludCBpOworICAgIGludDY0X3QgY291bnQ7CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICJJUlEgc3RhdGlzdGljczpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGNvdW50ID0gaXJxX2NvdW50W2ldOworICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJTJkOiAlIiBQUklkNjQgIlxuIiwgaSwgY291bnQpOworICAgIH0KKyNlbmRpZgorfQorCitxZW11X2lycSAqaTgyNTlfaW5pdChxZW11X2lycSBwYXJlbnRfaXJxKQoreworICAgIFBpY1N0YXRlMiAqczsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFBpY1N0YXRlMikpOworICAgIHBpY19pbml0MSgweDIwLCAweDRkMCwgJnMtPnBpY3NbMF0pOworICAgIHBpY19pbml0MSgweGEwLCAweDRkMSwgJnMtPnBpY3NbMV0pOworICAgIHMtPnBpY3NbMF0uZWxjcl9tYXNrID0gMHhmODsKKyAgICBzLT5waWNzWzFdLmVsY3JfbWFzayA9IDB4ZGU7CisgICAgcy0+cGFyZW50X2lycSA9IHBhcmVudF9pcnE7CisgICAgcy0+cGljc1swXS5waWNzX3N0YXRlID0gczsKKyAgICBzLT5waWNzWzFdLnBpY3Nfc3RhdGUgPSBzOworICAgIGlzYV9waWMgPSBzOworICAgIHJldHVybiBxZW11X2FsbG9jYXRlX2lycXMoaTgyNTlfc2V0X2lycSwgcywgR0ZEX01BWF9JUlEpOworfQorCit2b2lkIHBpY19zZXRfYWx0X2lycV9mdW5jKFBpY1N0YXRlMiAqcywgU2V0SVJRRnVuYyAqYWx0X2lycV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphbHRfaXJxX29wYXF1ZSkKK3sKKyAgICBzLT5hbHRfaXJxX2Z1bmMgPSBhbHRfaXJxX2Z1bmM7CisgICAgcy0+YWx0X2lycV9vcGFxdWUgPSBhbHRfaXJxX29wYXF1ZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvaW50Yy9pb2FwaWMuYyBiL2FuZHJvaWQvcWVtdTEvaHcvaW50Yy9pb2FwaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY5YjljCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9pbnRjL2lvYXBpYy5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogIGlvYXBpYy5jIElPQVBJQyBlbXVsYXRpb24gbG9naWMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRmFicmljZSBCZWxsYXJkCisgKgorICogIFNwbGl0IHRoZSBpb2FwaWMgbG9naWMgZnJvbSBhcGljLmMKKyAqICBYaWFudGFvIFpoYW5nIDx4aWFudGFvLnpoYW5nQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24gTUEgIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvaTM4Ni9wYy5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKyNpbmNsdWRlICJxZW11L2hvc3QtdXRpbHMuaCIKKworLy8jZGVmaW5lIERFQlVHX0lPQVBJQworCisjZGVmaW5lIElPQVBJQ19OVU1fUElOUwkJCTB4MTgKKyNkZWZpbmUgSU9BUElDX0xWVF9NQVNLRUQgCQkoMTw8MTYpCisKKyNkZWZpbmUgSU9BUElDX1RSSUdHRVJfRURHRQkJMAorI2RlZmluZSBJT0FQSUNfVFJJR0dFUl9MRVZFTAkJMQorCisvKmlve2FwaWMsc2FwaWN9IGRlbGl2ZXJ5IG1vZGUqLworI2RlZmluZSBJT0FQSUNfRE1fRklYRUQJCQkweDAKKyNkZWZpbmUgSU9BUElDX0RNX0xPV0VTVF9QUklPUklUWQkweDEKKyNkZWZpbmUgSU9BUElDX0RNX1BNSQkJCTB4MgorI2RlZmluZSBJT0FQSUNfRE1fTk1JCQkJMHg0CisjZGVmaW5lIElPQVBJQ19ETV9JTklUCQkJMHg1CisjZGVmaW5lIElPQVBJQ19ETV9TSVBJCQkJMHg1CisjZGVmaW5lIElPQVBJQ19ETV9FWFRJTlQJCTB4NworCitzdHJ1Y3QgSU9BUElDU3RhdGUgeworICAgIHVpbnQ4X3QgaWQ7CisgICAgdWludDhfdCBpb3JlZ3NlbDsKKworICAgIHVpbnQzMl90IGlycjsKKyAgICB1aW50NjRfdCBpb3JlZHRibFtJT0FQSUNfTlVNX1BJTlNdOworfTsKKworc3RhdGljIHZvaWQgaW9hcGljX3NlcnZpY2UoSU9BUElDU3RhdGUgKnMpCit7CisgICAgdWludDhfdCBpOworICAgIHVpbnQ4X3QgdHJpZ19tb2RlOworICAgIHVpbnQ4X3QgdmVjdG9yOworICAgIHVpbnQ4X3QgZGVsaXZlcnlfbW9kZTsKKyAgICB1aW50MzJfdCBtYXNrOworICAgIHVpbnQ2NF90IGVudHJ5OworICAgIHVpbnQ4X3QgZGVzdDsKKyAgICB1aW50OF90IGRlc3RfbW9kZTsKKyAgICB1aW50OF90IHBvbGFyaXR5OworCisgICAgZm9yIChpID0gMDsgaSA8IElPQVBJQ19OVU1fUElOUzsgaSsrKSB7CisgICAgICAgIG1hc2sgPSAxIDw8IGk7CisgICAgICAgIGlmIChzLT5pcnIgJiBtYXNrKSB7CisgICAgICAgICAgICBlbnRyeSA9IHMtPmlvcmVkdGJsW2ldOworICAgICAgICAgICAgaWYgKCEoZW50cnkgJiBJT0FQSUNfTFZUX01BU0tFRCkpIHsKKyAgICAgICAgICAgICAgICB0cmlnX21vZGUgPSAoKGVudHJ5ID4+IDE1KSAmIDEpOworICAgICAgICAgICAgICAgIGRlc3QgPSBlbnRyeSA+PiA1NjsKKyAgICAgICAgICAgICAgICBkZXN0X21vZGUgPSAoZW50cnkgPj4gMTEpICYgMTsKKyAgICAgICAgICAgICAgICBkZWxpdmVyeV9tb2RlID0gKGVudHJ5ID4+IDgpICYgNzsKKyAgICAgICAgICAgICAgICBwb2xhcml0eSA9IChlbnRyeSA+PiAxMykgJiAxOworICAgICAgICAgICAgICAgIGlmICh0cmlnX21vZGUgPT0gSU9BUElDX1RSSUdHRVJfRURHRSkKKyAgICAgICAgICAgICAgICAgICAgcy0+aXJyICY9IH5tYXNrOworICAgICAgICAgICAgICAgIGlmIChkZWxpdmVyeV9tb2RlID09IElPQVBJQ19ETV9FWFRJTlQpCisgICAgICAgICAgICAgICAgICAgIHZlY3RvciA9IHBpY19yZWFkX2lycShpc2FfcGljKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHZlY3RvciA9IGVudHJ5ICYgMHhmZjsKKworICAgICAgICAgICAgICAgIGFwaWNfZGVsaXZlcl9pcnEoZGVzdCwgZGVzdF9tb2RlLCBkZWxpdmVyeV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yLCBwb2xhcml0eSwgdHJpZ19tb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBpb2FwaWNfc2V0X2lycSh2b2lkICpvcGFxdWUsIGludCB2ZWN0b3IsIGludCBsZXZlbCkKK3sKKyAgICBJT0FQSUNTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIC8qIElTQSBJUlFzIG1hcCB0byBHU0kgMS0xIGV4Y2VwdCBmb3IgSVJRMCB3aGljaCBtYXBzCisgICAgICogdG8gR1NJIDIuICBHU0kgbWFwcyB0byBpb2FwaWMgMS0xLiAgVGhpcyBpcyBub3QKKyAgICAgKiB0aGUgY2xlYW5lc3Qgd2F5IG9mIGRvaW5nIGl0IGJ1dCBpdCBzaG91bGQgd29yay4gKi8KKworICAgIGlmICh2ZWN0b3IgPT0gMCkKKyAgICAgICAgdmVjdG9yID0gMjsKKworICAgIGlmICh2ZWN0b3IgPj0gMCAmJiB2ZWN0b3IgPCBJT0FQSUNfTlVNX1BJTlMpIHsKKyAgICAgICAgdWludDMyX3QgbWFzayA9IDEgPDwgdmVjdG9yOworICAgICAgICB1aW50NjRfdCBlbnRyeSA9IHMtPmlvcmVkdGJsW3ZlY3Rvcl07CisKKyAgICAgICAgaWYgKChlbnRyeSA+PiAxNSkgJiAxKSB7CisgICAgICAgICAgICAvKiBsZXZlbCB0cmlnZ2VyZWQgKi8KKyAgICAgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgICAgIHMtPmlyciB8PSBtYXNrOworICAgICAgICAgICAgICAgIGlvYXBpY19zZXJ2aWNlKHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5pcnIgJj0gfm1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBlZGdlIHRyaWdnZXJlZCAqLworICAgICAgICAgICAgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgcy0+aXJyIHw9IG1hc2s7CisgICAgICAgICAgICAgICAgaW9hcGljX3NlcnZpY2Uocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBpb2FwaWNfbWVtX3JlYWRsKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgSU9BUElDU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IGluZGV4OworICAgIHVpbnQzMl90IHZhbCA9IDA7CisKKyAgICBhZGRyICY9IDB4ZmY7CisgICAgaWYgKGFkZHIgPT0gMHgwMCkgeworICAgICAgICB2YWwgPSBzLT5pb3JlZ3NlbDsKKyAgICB9IGVsc2UgaWYgKGFkZHIgPT0gMHgxMCkgeworICAgICAgICBzd2l0Y2ggKHMtPmlvcmVnc2VsKSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICAgICAgdmFsID0gcy0+aWQgPDwgMjQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgdmFsID0gMHgxMSB8ICgoSU9BUElDX05VTV9QSU5TIC0gMSkgPDwgMTYpOyAvKiB2ZXJzaW9uIDB4MTEgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpbmRleCA9IChzLT5pb3JlZ3NlbCAtIDB4MTApID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBJT0FQSUNfTlVNX1BJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmlvcmVnc2VsICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHMtPmlvcmVkdGJsW2luZGV4XSA+PiAzMjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcy0+aW9yZWR0YmxbaW5kZXhdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBERUJVR19JT0FQSUMKKyAgICAgICAgcHJpbnRmKCJJL08gQVBJQyByZWFkOiAlMDh4ID0gJTA4eFxuIiwgcy0+aW9yZWdzZWwsIHZhbCk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgaW9hcGljX21lbV93cml0ZWwodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIElPQVBJQ1N0YXRlICpzID0gb3BhcXVlOworICAgIGludCBpbmRleDsKKworICAgIGFkZHIgJj0gMHhmZjsKKyAgICBpZiAoYWRkciA9PSAweDAwKSAgeworICAgICAgICBzLT5pb3JlZ3NlbCA9IHZhbDsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoYWRkciA9PSAweDEwKSB7CisjaWZkZWYgREVCVUdfSU9BUElDCisgICAgICAgIHByaW50ZigiSS9PIEFQSUMgd3JpdGU6ICUwOHggPSAlMDh4XG4iLCBzLT5pb3JlZ3NlbCwgdmFsKTsKKyNlbmRpZgorICAgICAgICBzd2l0Y2ggKHMtPmlvcmVnc2VsKSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6CisgICAgICAgICAgICAgICAgcy0+aWQgPSAodmFsID4+IDI0KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaW5kZXggPSAocy0+aW9yZWdzZWwgLSAweDEwKSA+PiAxOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgSU9BUElDX05VTV9QSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5pb3JlZ3NlbCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlvcmVkdGJsW2luZGV4XSAmPSAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW9yZWR0YmxbaW5kZXhdIHw9ICh1aW50NjRfdCl2YWwgPDwgMzI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pb3JlZHRibFtpbmRleF0gJj0gfjB4ZmZmZmZmZmZVTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pb3JlZHRibFtpbmRleF0gfD0gdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlvYXBpY19zZXJ2aWNlKHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW9hcGljX3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBJT0FQSUNTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIHFlbXVfcHV0XzhzKGYsICZzLT5pZCk7CisgICAgcWVtdV9wdXRfOHMoZiwgJnMtPmlvcmVnc2VsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU9BUElDX05VTV9QSU5TOyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJnMtPmlvcmVkdGJsW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW9hcGljX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgSU9BUElDU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IGk7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5pZCk7CisgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmlvcmVnc2VsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU9BUElDX05VTV9QSU5TOyBpKyspIHsKKyAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJnMtPmlvcmVkdGJsW2ldKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlvYXBpY19yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgSU9BUElDU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisgICAgZm9yKGkgPSAwOyBpIDwgSU9BUElDX05VTV9QSU5TOyBpKyspCisgICAgICAgIHMtPmlvcmVkdGJsW2ldID0gMSA8PCAxNjsgLyogbWFzayBMVlQgKi8KK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICppb2FwaWNfbWVtX3JlYWRbM10gPSB7CisgICAgaW9hcGljX21lbV9yZWFkbCwKKyAgICBpb2FwaWNfbWVtX3JlYWRsLAorICAgIGlvYXBpY19tZW1fcmVhZGwsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICppb2FwaWNfbWVtX3dyaXRlWzNdID0geworICAgIGlvYXBpY19tZW1fd3JpdGVsLAorICAgIGlvYXBpY19tZW1fd3JpdGVsLAorICAgIGlvYXBpY19tZW1fd3JpdGVsLAorfTsKKworSU9BUElDU3RhdGUgKmlvYXBpY19pbml0KHZvaWQpCit7CisgICAgSU9BUElDU3RhdGUgKnM7CisgICAgaW50IGlvX21lbW9yeTsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKElPQVBJQ1N0YXRlKSk7CisgICAgaW9hcGljX3Jlc2V0KHMpOworCisgICAgaW9fbWVtb3J5ID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShpb2FwaWNfbWVtX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb2FwaWNfbWVtX3dyaXRlLCBzKTsKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4ZmVjMDAwMDAsIDB4MTAwMCwgaW9fbWVtb3J5KTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAiaW9hcGljIiwgMCwgMSwgaW9hcGljX3NhdmUsIGlvYXBpY19sb2FkLCBzKTsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KGlvYXBpY19yZXNldCwgMCwgcyk7CisKKyAgICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvbWlwcy9jcHV0aW1lci5jIGIvYW5kcm9pZC9xZW11MS9ody9taXBzL2NwdXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MmM1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvbWlwcy9jcHV0aW1lci5jCkBAIC0wLDAgKzEsMTA5IEBACisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9taXBzL21pcHMuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisKKyNkZWZpbmUgVElNRVJfRlJFUQkxMDAgKiAxMDAwICogMTAwMAorCisvKiBYWFg6IGRvIG5vdCB1c2UgYSBnbG9iYWwgKi8KK3VpbnQzMl90IGNwdV9taXBzX2dldF9yYW5kb20gKENQVU9sZFN0YXRlICplbnYpCit7CisgICAgc3RhdGljIHVpbnQzMl90IGxmc3IgPSAxOworICAgIHN0YXRpYyB1aW50MzJfdCBwcmV2X2lkeCA9IDA7CisgICAgdWludDMyX3QgaWR4OworICAgIC8qIERvbid0IHJldHVybiBzYW1lIHZhbHVlIHR3aWNlLCBzbyBnZXQgYW5vdGhlciB2YWx1ZSAqLworICAgIGRvIHsKKyAgICAgICAgbGZzciA9IChsZnNyID4+IDEpIF4gKC0obGZzciAmIDF1KSAmIDB4ZDAwMDAwMDF1KTsKKyAgICAgICAgaWR4ID0gbGZzciAlIChlbnYtPnRsYi0+bmJfdGxiIC0gZW52LT5DUDBfV2lyZWQpICsgZW52LT5DUDBfV2lyZWQ7CisgICAgfSB3aGlsZSAoaWR4ID09IHByZXZfaWR4KTsKKyAgICBwcmV2X2lkeCA9IGlkeDsKKyAgICByZXR1cm4gaWR4OworfQorCisvKiBNSVBTIFI0SyB0aW1lciAqLwordWludDMyX3QgY3B1X21pcHNfZ2V0X2NvdW50IChDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIGlmIChlbnYtPkNQMF9DYXVzZSAmICgxIDw8IENQMENhX0RDKSkKKyAgICAgICAgcmV0dXJuIGVudi0+Q1AwX0NvdW50OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGVudi0+Q1AwX0NvdW50ICsKKyAgICAgICAgICAgICh1aW50MzJfdCltdWxkaXY2NChxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVSX0ZSRVEsIGdldF90aWNrc19wZXJfc2VjKCkpOworfQorCitzdGF0aWMgdm9pZCBjcHVfbWlwc190aW1lcl91cGRhdGUoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICB1aW50NjRfdCBub3csIG5leHQ7CisgICAgdWludDMyX3Qgd2FpdDsKKworICAgIG5vdyA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgd2FpdCA9IGVudi0+Q1AwX0NvbXBhcmUgLSBlbnYtPkNQMF9Db3VudCAtCisJICAgICh1aW50MzJfdCltdWxkaXY2NChub3csIFRJTUVSX0ZSRVEsIGdldF90aWNrc19wZXJfc2VjKCkpOworICAgIG5leHQgPSBub3cgKyBtdWxkaXY2NCh3YWl0LCBnZXRfdGlja3NfcGVyX3NlYygpLCBUSU1FUl9GUkVRKTsKKyAgICB0aW1lcl9tb2QoZW52LT50aW1lciwgbmV4dCk7Cit9CisKK3ZvaWQgY3B1X21pcHNfc3RvcmVfY291bnQgKENQVU9sZFN0YXRlICplbnYsIHVpbnQzMl90IGNvdW50KQoreworICAgIGlmIChlbnYtPkNQMF9DYXVzZSAmICgxIDw8IENQMENhX0RDKSkKKyAgICAgICAgZW52LT5DUDBfQ291bnQgPSBjb3VudDsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogU3RvcmUgbmV3IGNvdW50IHJlZ2lzdGVyICovCisgICAgICAgIGVudi0+Q1AwX0NvdW50ID0KKyAgICAgICAgICAgIGNvdW50IC0gKHVpbnQzMl90KW11bGRpdjY0KHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9GUkVRLCBnZXRfdGlja3NfcGVyX3NlYygpKTsKKyAgICAgICAgLyogVXBkYXRlIHRpbWVyIHRpbWVyICovCisgICAgICAgIGNwdV9taXBzX3RpbWVyX3VwZGF0ZShlbnYpOworICAgIH0KK30KKwordm9pZCBjcHVfbWlwc19zdG9yZV9jb21wYXJlIChDUFVPbGRTdGF0ZSAqZW52LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBlbnYtPkNQMF9Db21wYXJlID0gdmFsdWU7CisgICAgaWYgKCEoZW52LT5DUDBfQ2F1c2UgJiAoMSA8PCBDUDBDYV9EQykpKQorICAgICAgICBjcHVfbWlwc190aW1lcl91cGRhdGUoZW52KTsKKyAgICBpZiAoZW52LT5pbnNuX2ZsYWdzICYgSVNBX01JUFMzMlIyKQorICAgICAgICBlbnYtPkNQMF9DYXVzZSAmPSB+KDEgPDwgQ1AwQ2FfVEkpOworICAgIHFlbXVfaXJxX2xvd2VyKGVudi0+aXJxWyhlbnYtPkNQMF9JbnRDdGwgPj4gQ1AwSW50Q3RsX0lQVEkpICYgMHg3XSk7Cit9CisKK3ZvaWQgY3B1X21pcHNfc3RhcnRfY291bnQoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBjcHVfbWlwc19zdG9yZV9jb3VudChlbnYsIGVudi0+Q1AwX0NvdW50KTsKK30KKwordm9pZCBjcHVfbWlwc19zdG9wX2NvdW50KENQVU9sZFN0YXRlICplbnYpCit7CisgICAgLyogU3RvcmUgdGhlIGN1cnJlbnQgdmFsdWUgKi8KKyAgICBlbnYtPkNQMF9Db3VudCArPSAodWludDMyX3QpbXVsZGl2NjQocWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRVJfRlJFUSwgZ2V0X3RpY2tzX3Blcl9zZWMoKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNfdGltZXJfY2IgKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDUFVPbGRTdGF0ZSAqZW52OworCisgICAgZW52ID0gb3BhcXVlOworI2lmIDAKKyAgICBxZW11X2xvZygiJXNcbiIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisgICAgaWYgKGVudi0+Q1AwX0NhdXNlICYgKDEgPDwgQ1AwQ2FfREMpKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiA/Pz8gVGhpcyBjYWxsYmFjayBzaG91bGQgb2NjdXIgd2hlbiB0aGUgY291bnRlciBpcyBleGFjdGx5IGVxdWFsIHRvCisgICAgICAgdGhlIGNvbXBhcmF0b3IgdmFsdWUuICBPZmZzZXQgdGhlIGNvdW50IGJ5IG9uZSB0byBhdm9pZCBpbW1lZGlhdGVseQorICAgICAgIHJldHJpZ2dlcmluZyB0aGUgY2FsbGJhY2sgYmVmb3JlIGFueSB2aXJ0dWFsIHRpbWUgaGFzIHBhc3NlZC4gICovCisgICAgZW52LT5DUDBfQ291bnQrKzsKKyAgICBjcHVfbWlwc190aW1lcl91cGRhdGUoZW52KTsKKyAgICBlbnYtPkNQMF9Db3VudC0tOworICAgIGlmIChlbnYtPmluc25fZmxhZ3MgJiBJU0FfTUlQUzMyUjIpCisgICAgICAgIGVudi0+Q1AwX0NhdXNlIHw9IDEgPDwgQ1AwQ2FfVEk7CisgICAgcWVtdV9pcnFfcmFpc2UoZW52LT5pcnFbKGVudi0+Q1AwX0ludEN0bCA+PiBDUDBJbnRDdGxfSVBUSSkgJiAweDddKTsKK30KKwordm9pZCBjcHVfbWlwc19jbG9ja19pbml0IChDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIGVudi0+dGltZXIgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19WSVJUVUFMLCBTQ0FMRV9OUywgJm1pcHNfdGltZXJfY2IsIGVudik7CisgICAgZW52LT5DUDBfQ29tcGFyZSA9IDA7CisgICAgY3B1X21pcHNfc3RvcmVfY291bnQoZW52LCAxKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvbWlwcy9taXBzX2ludC5jIGIvYW5kcm9pZC9xZW11MS9ody9taXBzL21pcHNfaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjM2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvbWlwcy9taXBzX2ludC5jCkBAIC0wLDAgKzEsNDcgQEAKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L21pcHMvbWlwcy5oIgorI2luY2x1ZGUgImNwdS5oIgorCisvKiBSYWlzZSBJUlEgdG8gQ1BVIGlmIG5lY2Vzc2FyeS4gSXQgbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgYWN0aXZlCisgICBJUlEgbWF5IGNoYW5nZSAqLwordm9pZCBjcHVfbWlwc191cGRhdGVfaXJxKENQVU9sZFN0YXRlICplbnYpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICBpZiAoKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0lFKSkgJiYKKyAgICAgICAgIShlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9FWEwpKSAmJgorICAgICAgICAhKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpICYmCisgICAgICAgICEoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0RNKSkgeworICAgICAgICBpZiAoKGVudi0+Q1AwX1N0YXR1cyAmIGVudi0+Q1AwX0NhdXNlICYgQ1AwQ2FfSVBfbWFzaykgJiYKKyAgICAgICAgICAgICEoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkpIHsKKyAgICAgICAgICAgIGNwdV9pbnRlcnJ1cHQoY3B1LCBDUFVfSU5URVJSVVBUX0hBUkQpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGNwdV9yZXNldF9pbnRlcnJ1cHQoY3B1LCBDUFVfSU5URVJSVVBUX0hBUkQpOworfQorCitzdGF0aWMgdm9pZCBjcHVfbWlwc19pcnFfcmVxdWVzdCh2b2lkICpvcGFxdWUsIGludCBpcnEsIGludCBsZXZlbCkKK3sKKyAgICBDUFVPbGRTdGF0ZSAqZW52ID0gKENQVU9sZFN0YXRlICopb3BhcXVlOworCisgICAgaWYgKGlycSA8IDAgfHwgaXJxID4gNykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGxldmVsKSB7CisgICAgICAgIGVudi0+Q1AwX0NhdXNlIHw9IDEgPDwgKGlycSArIENQMENhX0lQKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPkNQMF9DYXVzZSAmPSB+KDEgPDwgKGlycSArIENQMENhX0lQKSk7CisgICAgfQorICAgIGNwdV9taXBzX3VwZGF0ZV9pcnEoZW52KTsKK30KKwordm9pZCBjcHVfbWlwc19pcnFfaW5pdF9jcHUoQ1BVT2xkU3RhdGUgKmVudikKK3sKKyAgICBxZW11X2lycSAqcWk7CisgICAgaW50IGk7CisKKyAgICBxaSA9IHFlbXVfYWxsb2NhdGVfaXJxcyhjcHVfbWlwc19pcnFfcmVxdWVzdCwgZW52LCA4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGVudi0+aXJxW2ldID0gcWlbaV07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9taXBzL21pcHNfcGljLmMgYi9hbmRyb2lkL3FlbXUxL2h3L21pcHMvbWlwc19waWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU0MDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9taXBzL21pcHNfcGljLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIE1JUFMgQ1BVIGludGVycnVwdCBzdXBwb3J0LgorICoKKyAqLworCisjaW5jbHVkZSAiaHcvaHcuaCIKKworLyogU3R1YiBmdW5jdGlvbnMgZm9yIGhhcmR3YXJlIHRoYXQgZG9uJ3QgZXhpc3QuICAqLwordm9pZCBwaWNfaW5mbyh2b2lkKQoreworfQorCit2b2lkIGlycV9pbmZvKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIG1pcHNfY3B1X2lycV9oYW5kbGVyKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKQoreworICAgIENQVU9sZFN0YXRlICplbnYgPSAoQ1BVT2xkU3RhdGUgKilvcGFxdWU7CisgICAgaW50IGNhdXNlYml0OworCisgICAgaWYgKGlycSA8IDAgfHwgNyA8IGlycSkKKyAgICAgICAgY3B1X2Fib3J0KGVudiwgIm1pcHNfcGljX2NwdV9oYW5kbGVyOiBCYWQgaW50ZXJydXB0IGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBpcnEpOworCisgICAgY2F1c2ViaXQgPSAweDAwMDAwMTAwIDw8IGlycTsKKyAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgZW52LT5DUDBfQ2F1c2UgfD0gY2F1c2ViaXQ7CisgICAgICAgIGNwdV9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoZW52KSwgQ1BVX0lOVEVSUlVQVF9IQVJEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPkNQMF9DYXVzZSAmPSB+Y2F1c2ViaXQ7CisgICAgICAgIGNwdV9yZXNldF9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoZW52KSwgQ1BVX0lOVEVSUlVQVF9IQVJEKTsKKyAgICB9Cit9CisKK3FlbXVfaXJxICptaXBzX2NwdV9pcnFfaW5pdChDUFVPbGRTdGF0ZSAqZW52KQoreworICAgIHJldHVybiBxZW11X2FsbG9jYXRlX2lycXMobWlwc19jcHVfaXJxX2hhbmRsZXIsIGVudiwgOCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L21pcHMvbWlwc19yNGsuYyBiL2FuZHJvaWQvcWVtdTEvaHcvbWlwcy9taXBzX3I0ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTk3OWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L21pcHMvbWlwc19yNGsuYwpAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIFFFTVUvTUlQUyBwc2V1ZG8tYm9hcmQKKyAqCisgKiBlbXVsYXRlcyBhIHNpbXBsZSBtYWNoaW5lIHdpdGggSVNBLWxpa2UgYnVzLgorICogSVNBIElPIHNwYWNlIG1hcHBlZCB0byB0aGUgMHgxNDAwMDAwMCAoUEhZUykgYW5kCisgKiBJU0EgbWVtb3J5IGF0IHRoZSAweDEwMDAwMDAwIChQSFlTLCAxNk1iIGluIHNpemUpLgorICogQWxsIHBlcmlwaGVyaWFsIGRldmljZXMgYXJlIGF0dGFjaGVkIHRvIHRoaXMgImJ1cyIgd2l0aAorICogdGhlIHN0YW5kYXJkIFBDIElTQSBhZGRyZXNzZXMuCisqLworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvbWlwcy9taXBzLmgiCisjaW5jbHVkZSAiaHcvaTM4Ni9wYy5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgImh3L2JvYXJkcy5oIgorI2luY2x1ZGUgImZsYXNoLmgiCisjaW5jbHVkZSAicWVtdS9sb2cuaCIKKyNpbmNsdWRlICJody9taXBzL2Jpb3MuaCIKKyNpbmNsdWRlICJpZGUuaCIKKyNpbmNsdWRlICJsb2FkZXIuaCIKKyNpbmNsdWRlICJlbGYuaCIKKworI2RlZmluZSBQSFlTX1RPX1ZJUlQoeCkgKCh4KSB8IH4odGFyZ2V0X3Vsb25nKTB4N2ZmZmZmZmYpCisKKyNkZWZpbmUgVklSVF9UT19QSFlTX0FEREVORCAoLSgoaW50NjRfdCkoaW50MzJfdCkweDgwMDAwMDAwKSkKKworI2RlZmluZSBNQVhfSURFX0JVUyAyCisKK3N0YXRpYyBjb25zdCBpbnQgaWRlX2lvYmFzZVsyXSA9IHsgMHgxZjAsIDB4MTcwIH07CitzdGF0aWMgY29uc3QgaW50IGlkZV9pb2Jhc2UyWzJdID0geyAweDNmNiwgMHgzNzYgfTsKK3N0YXRpYyBjb25zdCBpbnQgaWRlX2lycVsyXSA9IHsgMTQsIDE1IH07CisKK3N0YXRpYyBQSVRTdGF0ZSAqcGl0OyAvKiBQSVQgaTgyNTQgKi8KKworLyogaTgyNTQgUElUIGlzIGF0dGFjaGVkIHRvIHRoZSBJUlEwIGF0IFBJQyBpODI1OSAqLworCitzdGF0aWMgc3RydWN0IF9sb2FkZXJwYXJhbXMgeworICAgIGludCByYW1fc2l6ZTsKKyAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWU7CisgICAgY29uc3QgY2hhciAqa2VybmVsX2NtZGxpbmU7CisgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lOworfSBsb2FkZXJwYXJhbXM7CisKK3N0YXRpYyB2b2lkIG1pcHNfcWVtdV93cml0ZWwgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsCisJCQkgICAgICB1aW50MzJfdCB2YWwpCit7CisgICAgaWYgKChhZGRyICYgMHhmZmZmKSA9PSAwICYmIHZhbCA9PSA0MikKKyAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdCAoKTsKKyAgICBlbHNlIGlmICgoYWRkciAmIDB4ZmZmZikgPT0gNCAmJiB2YWwgPT0gNDIpCisgICAgICAgIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3QgKCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBtaXBzX3FlbXVfcmVhZGwgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKiBjb25zdCBtaXBzX3FlbXVfd3JpdGVbXSA9IHsKKyAgICAmbWlwc19xZW11X3dyaXRlbCwKKyAgICAmbWlwc19xZW11X3dyaXRlbCwKKyAgICAmbWlwc19xZW11X3dyaXRlbCwKK307CisKK3N0YXRpYyBDUFVSZWFkTWVtb3J5RnVuYyAqIGNvbnN0IG1pcHNfcWVtdV9yZWFkW10gPSB7CisgICAgJm1pcHNfcWVtdV9yZWFkbCwKKyAgICAmbWlwc19xZW11X3JlYWRsLAorICAgICZtaXBzX3FlbXVfcmVhZGwsCit9OworCitzdGF0aWMgaW50IG1pcHNfcWVtdV9pb21lbXR5cGUgPSAwOworCit0eXBlZGVmIHN0cnVjdCBSZXNldERhdGEgeworICAgIENQVU9sZFN0YXRlICplbnY7CisgICAgdWludDY0X3QgdmVjdG9yOworfSBSZXNldERhdGE7CisKK3N0YXRpYyBpbnQ2NF90IGxvYWRfa2VybmVsKHZvaWQpCit7CisgICAgaW50NjRfdCBlbnRyeSwga2VybmVsX2xvdywga2VybmVsX2hpZ2g7CisgICAgbG9uZyBrZXJuZWxfc2l6ZSwgaW5pdHJkX3NpemUsIHBhcmFtc19zaXplOworICAgIHJhbV9hZGRyX3QgaW5pdHJkX29mZnNldDsKKyAgICB1aW50MzJfdCAqcGFyYW1zX2J1ZjsKKyAgICBpbnQgYmlnX2VuZGlhbjsKKworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICBiaWdfZW5kaWFuID0gMTsKKyNlbHNlCisgICAgYmlnX2VuZGlhbiA9IDA7CisjZW5kaWYKKyAgICBrZXJuZWxfc2l6ZSA9IGxvYWRfZWxmKGxvYWRlcnBhcmFtcy5rZXJuZWxfZmlsZW5hbWUsIFZJUlRfVE9fUEhZU19BRERFTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QgKikmZW50cnksICh1aW50NjRfdCAqKSZrZXJuZWxfbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90ICopJmtlcm5lbF9oaWdoLCBiaWdfZW5kaWFuLCBFTEZfTUFDSElORSwgMSk7CisgICAgaWYgKGtlcm5lbF9zaXplID49IDApIHsKKyAgICAgICAgaWYgKChlbnRyeSAmIH4weDdmZmZmZmZmVUxMKSA9PSAweDgwMDAwMDAwKQorICAgICAgICAgICAgZW50cnkgPSAoaW50MzJfdCllbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGNvdWxkIG5vdCBsb2FkIGtlcm5lbCAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGxvYWRlcnBhcmFtcy5rZXJuZWxfZmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIGxvYWQgaW5pdHJkICovCisgICAgaW5pdHJkX3NpemUgPSAwOworICAgIGluaXRyZF9vZmZzZXQgPSAwOworICAgIGlmIChsb2FkZXJwYXJhbXMuaW5pdHJkX2ZpbGVuYW1lKSB7CisgICAgICAgIGluaXRyZF9zaXplID0gZ2V0X2ltYWdlX3NpemUgKGxvYWRlcnBhcmFtcy5pbml0cmRfZmlsZW5hbWUpOworICAgICAgICBpZiAoaW5pdHJkX3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbml0cmRfb2Zmc2V0ID0gKGtlcm5lbF9oaWdoICsgflRBUkdFVF9QQUdFX01BU0spICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgICAgIGlmIChpbml0cmRfb2Zmc2V0ICsgaW5pdHJkX3NpemUgPiByYW1fc2l6ZSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgInFlbXU6IG1lbW9yeSB0b28gc21hbGwgZm9yIGluaXRpYWwgcmFtIGRpc2sgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlcnBhcmFtcy5pbml0cmRfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbml0cmRfc2l6ZSA9IGxvYWRfaW1hZ2VfdGFyZ3BoeXMobG9hZGVycGFyYW1zLmluaXRyZF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0cmRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9zaXplIC0gaW5pdHJkX29mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluaXRyZF9zaXplID09ICh0YXJnZXRfdWxvbmcpIC0xKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGNvdWxkIG5vdCBsb2FkIGluaXRpYWwgcmFtIGRpc2sgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVycGFyYW1zLmluaXRyZF9maWxlbmFtZSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU3RvcmUgY29tbWFuZCBsaW5lLiAgKi8KKyAgICBwYXJhbXNfc2l6ZSA9IDI2NDsKKyAgICBwYXJhbXNfYnVmID0gZ19tYWxsb2MocGFyYW1zX3NpemUpOworCisgICAgcGFyYW1zX2J1ZlswXSA9IHRzd2FwMzIocmFtX3NpemUpOworICAgIHBhcmFtc19idWZbMV0gPSB0c3dhcDMyKDB4MTIzNDU2NzgpOworCisgICAgaWYgKGluaXRyZF9zaXplID4gMCkgeworICAgICAgICBzbnByaW50ZigoY2hhciAqKXBhcmFtc19idWYgKyA4LCAyNTYsICJyZF9zdGFydD0weCIgVEFSR0VUX0ZNVF9seCAiIHJkX3NpemU9JWxpICVzIiwKKyAgICAgICAgICAgICAgICAgUEhZU19UT19WSVJUKCh1aW50MzJfdClpbml0cmRfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgaW5pdHJkX3NpemUsIGxvYWRlcnBhcmFtcy5rZXJuZWxfY21kbGluZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoKGNoYXIgKilwYXJhbXNfYnVmICsgOCwgMjU2LCAiJXMiLCBsb2FkZXJwYXJhbXMua2VybmVsX2NtZGxpbmUpOworICAgIH0KKworICAgIHJvbV9hZGRfYmxvYl9maXhlZCgicGFyYW1zIiwgcGFyYW1zX2J1ZiwgcGFyYW1zX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICgxNiA8PCAyMCkgLSAyNjQpOworCisgICAgcmV0dXJuIGVudHJ5OworfQorCitzdGF0aWMgdm9pZCBtYWluX2NwdV9yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgUmVzZXREYXRhICpzID0gKFJlc2V0RGF0YSAqKW9wYXF1ZTsKKyAgICBDUFVPbGRTdGF0ZSAqZW52ID0gcy0+ZW52OworCisgICAgY3B1X3Jlc2V0KGVudik7CisgICAgZW52LT5hY3RpdmVfdGMuUEMgPSBzLT52ZWN0b3I7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgc2VjdG9yX2xlbiA9IDMyICogMTAyNDsKK3N0YXRpYwordm9pZCBtaXBzX3I0a19pbml0IChyYW1fYWRkcl90IHJhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpib290X2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLCBjb25zdCBjaGFyICprZXJuZWxfY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW5pdHJkX2ZpbGVuYW1lLCBjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgcmFtX2FkZHJfdCByYW1fb2Zmc2V0OworICAgIHJhbV9hZGRyX3QgYmlvc19vZmZzZXQ7CisgICAgaW50IGJpb3Nfc2l6ZTsKKyAgICBDUFVPbGRTdGF0ZSAqZW52OworICAgIFJlc2V0RGF0YSAqcmVzZXRfaW5mbzsKKyAgICBSVENTdGF0ZSAqcnRjX3N0YXRlOworICAgIGludCBpOworICAgIHFlbXVfaXJxICppODI1OTsKKyAgICBEcml2ZUluZm8gKmhkW01BWF9JREVfQlVTICogTUFYX0lERV9ERVZTXTsKKyAgICBEcml2ZUluZm8gKmRpbmZvOworCisgICAgLyogaW5pdCBDUFVzICovCisgICAgaWYgKGNwdV9tb2RlbCA9PSBOVUxMKSB7CisjaWZkZWYgVEFSR0VUX01JUFM2NAorICAgICAgICBjcHVfbW9kZWwgPSAiUjQwMDAiOworI2Vsc2UKKyAgICAgICAgY3B1X21vZGVsID0gIjI0S2YiOworI2VuZGlmCisgICAgfQorICAgIGVudiA9IGNwdV9pbml0KGNwdV9tb2RlbCk7CisgICAgaWYgKCFlbnYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBDUFUgZGVmaW5pdGlvblxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHJlc2V0X2luZm8gPSBnX21hbGxvYzAoc2l6ZW9mKFJlc2V0RGF0YSkpOworICAgIHJlc2V0X2luZm8tPmVudiA9IGVudjsKKyAgICByZXNldF9pbmZvLT52ZWN0b3IgPSBlbnYtPmFjdGl2ZV90Yy5QQzsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KG1haW5fY3B1X3Jlc2V0LCByZXNldF9pbmZvKTsKKworICAgIC8qIGFsbG9jYXRlIFJBTSAqLworICAgIGlmIChyYW1fc2l6ZSA+ICgyNTYgPDwgMjApKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJxZW11OiBUb28gbXVjaCBtZW1vcnkgZm9yIHRoaXMgbWFjaGluZTogJWQgTUIsIG1heGltdW0gMjU2IE1CXG4iLAorICAgICAgICAgICAgICAgICgodW5zaWduZWQgaW50KXJhbV9zaXplIC8gKDEgPDwgMjApKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHJhbV9vZmZzZXQgPSBxZW11X3JhbV9hbGxvYyhyYW1fc2l6ZSk7CisKKyAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDAsIHJhbV9zaXplLCByYW1fb2Zmc2V0IHwgSU9fTUVNX1JBTSk7CisKKyAgICBpZiAoIW1pcHNfcWVtdV9pb21lbXR5cGUpIHsKKyAgICAgICAgbWlwc19xZW11X2lvbWVtdHlwZSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkobWlwc19xZW11X3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfcWVtdV93cml0ZSwgTlVMTCk7CisgICAgfQorICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHgxZmJmMDAwMCwgMHgxMDAwMCwgbWlwc19xZW11X2lvbWVtdHlwZSk7CisKKyAgICAvKiBUcnkgdG8gbG9hZCBhIEJJT1MgaW1hZ2UuIElmIHRoaXMgZmFpbHMsIHdlIGNvbnRpbnVlIHJlZ2FyZGxlc3MsCisgICAgICAgYnV0IGluaXRpYWxpemUgdGhlIGhhcmR3YXJlIG91cnNlbHZlcy4gV2hlbiBhIGtlcm5lbCBnZXRzCisgICAgICAgcHJlbG9hZGVkIHdlIGFsc28gaW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUsIHNpbmNlIHRoZSBCSU9TIHdhc24ndAorICAgICAgIHJ1bi4gKi8KKyAgICBpZiAoYmlvc19uYW1lID09IE5VTEwpCisgICAgICAgIGJpb3NfbmFtZSA9IEJJT1NfRklMRU5BTUU7CisgICAgZmlsZW5hbWUgPSBxZW11X2ZpbmRfZmlsZShRRU1VX0ZJTEVfVFlQRV9CSU9TLCBiaW9zX25hbWUpOworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBiaW9zX3NpemUgPSBnZXRfaW1hZ2Vfc2l6ZShmaWxlbmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmlvc19zaXplID0gLTE7CisgICAgfQorICAgIGlmICgoYmlvc19zaXplID4gMCkgJiYgKGJpb3Nfc2l6ZSA8PSBCSU9TX1NJWkUpKSB7CisgICAgICAgIGJpb3Nfb2Zmc2V0ID0gcWVtdV9yYW1fYWxsb2MoQklPU19TSVpFKTsKKwljcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KDB4MWZjMDAwMDAsIEJJT1NfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW9zX29mZnNldCB8IElPX01FTV9ST00pOworCisgICAgICAgIGxvYWRfaW1hZ2VfdGFyZ3BoeXMoZmlsZW5hbWUsIDB4MWZjMDAwMDAsIEJJT1NfU0laRSk7CisgICAgfSBlbHNlIGlmICgoZGluZm8gPSBkcml2ZV9nZXQoSUZfUEZMQVNILCAwLCAwKSkgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBtaXBzX3JvbSA9IDB4MDA0MDAwMDA7CisgICAgICAgIGJpb3Nfb2Zmc2V0ID0gcWVtdV9yYW1fYWxsb2MobWlwc19yb20pOworICAgICAgICBpZiAoIXBmbGFzaF9jZmkwMV9yZWdpc3RlcigweDFmYzAwMDAwLCBiaW9zX29mZnNldCwKKyAgICAgICAgICAgIGRpbmZvLT5iZHJ2LCBzZWN0b3JfbGVuLCBtaXBzX3JvbSAvIHNlY3Rvcl9sZW4sCisgICAgICAgICAgICA0LCAwLCAwLCAwLCAwKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBFcnJvciByZWdpc3RlcmluZyBmbGFzaCBtZW1vcnkuXG4iKTsKKwl9CisgICAgfQorICAgIGVsc2UgeworCS8qIG5vdCBmYXRhbCAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IFdhcm5pbmcsIGNvdWxkIG5vdCBsb2FkIE1JUFMgYmlvcyAnJXMnXG4iLAorCQliaW9zX25hbWUpOworICAgIH0KKyAgICBpZiAoZmlsZW5hbWUpIHsKKyAgICAgICAgZ19mcmVlKGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBpZiAoa2VybmVsX2ZpbGVuYW1lKSB7CisgICAgICAgIGxvYWRlcnBhcmFtcy5yYW1fc2l6ZSA9IHJhbV9zaXplOworICAgICAgICBsb2FkZXJwYXJhbXMua2VybmVsX2ZpbGVuYW1lID0ga2VybmVsX2ZpbGVuYW1lOworICAgICAgICBsb2FkZXJwYXJhbXMua2VybmVsX2NtZGxpbmUgPSBrZXJuZWxfY21kbGluZTsKKyAgICAgICAgbG9hZGVycGFyYW1zLmluaXRyZF9maWxlbmFtZSA9IGluaXRyZF9maWxlbmFtZTsKKyAgICAgICAgcmVzZXRfaW5mby0+dmVjdG9yID0gbG9hZF9rZXJuZWwoKTsKKyAgICB9CisKKyAgICAvKiBJbml0IENQVSBpbnRlcm5hbCBkZXZpY2VzICovCisgICAgY3B1X21pcHNfaXJxX2luaXRfY3B1KGVudik7CisgICAgY3B1X21pcHNfY2xvY2tfaW5pdChlbnYpOworCisgICAgLyogVGhlIFBJQyBpcyBhdHRhY2hlZCB0byB0aGUgTUlQUyBDUFUgSU5UMCBwaW4gKi8KKyAgICBpODI1OSA9IGk4MjU5X2luaXQoZW52LT5pcnFbMl0pOworICAgIGlzYV9idXNfbmV3KE5VTEwpOworICAgIGlzYV9idXNfaXJxcyhpODI1OSk7CisKKyAgICBydGNfc3RhdGUgPSBydGNfaW5pdCgyMDAwKTsKKworICAgIC8qIFJlZ2lzdGVyIDY0IEtCIG9mIElTQSBJTyBzcGFjZSBhdCAweDE0MDAwMDAwICovCisgICAgaXNhX21taW9faW5pdCgweDE0MDAwMDAwLCAweDAwMDEwMDAwKTsKKyAgICBpc2FfbWVtX2Jhc2UgPSAweDEwMDAwMDAwOworCisgICAgcGl0ID0gcGl0X2luaXQoMHg0MCwgaTgyNTlbMF0pOworCisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1NFUklBTF9QT1JUUzsgaSsrKSB7CisgICAgICAgIGlmIChzZXJpYWxfaGRzW2ldKSB7CisgICAgICAgICAgICBzZXJpYWxfaXNhX2luaXQoaSwgc2VyaWFsX2hkc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpc2FfdmdhX2luaXQoKTsKKworICAgIGlmIChuZF90YWJsZVswXS52bGFuKQorICAgICAgICBpc2FfbmUyMDAwX2luaXQoMHgzMDAsIDksICZuZF90YWJsZVswXSk7CisKKyAgICBpZiAoZHJpdmVfZ2V0X21heF9idXMoSUZfSURFKSA+PSBNQVhfSURFX0JVUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IHRvbyBtYW55IElERSBidXNcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IE1BWF9JREVfQlVTICogTUFYX0lERV9ERVZTOyBpKyspIHsKKyAgICAgICAgaGRbaV0gPSBkcml2ZV9nZXQoSUZfSURFLCBpIC8gTUFYX0lERV9ERVZTLCBpICUgTUFYX0lERV9ERVZTKTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfSURFX0JVUzsgaSsrKQorICAgICAgICBpc2FfaWRlX2luaXQoaWRlX2lvYmFzZVtpXSwgaWRlX2lvYmFzZTJbaV0sIGlkZV9pcnFbaV0sCisgICAgICAgICAgICAgICAgICAgICBoZFtNQVhfSURFX0RFVlMgKiBpXSwKKwkJICAgICBoZFtNQVhfSURFX0RFVlMgKiBpICsgMV0pOworCisgICAgaXNhX2NyZWF0ZV9zaW1wbGUoImk4MDQyIik7Cit9CisKK3N0YXRpYyBRRU1VTWFjaGluZSBtaXBzX21hY2hpbmUgPSB7CisgICAgLm5hbWUgPSAibWlwcyIsCisgICAgLmRlc2MgPSAibWlwcyByNGsgcGxhdGZvcm0iLAorICAgIC5pbml0ID0gbWlwc19yNGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9pbml0KHZvaWQpCit7CisgICAgcWVtdV9yZWdpc3Rlcl9tYWNoaW5lKCZtaXBzX21hY2hpbmUpOworfQorCittYWNoaW5lX2luaXQobWlwc19tYWNoaW5lX2luaXQpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9uZXQvbmUyMDAwLmMgYi9hbmRyb2lkL3FlbXUxL2h3L25ldC9uZTIwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA3ZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9uZXQvbmUyMDAwLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiBRRU1VIE5FMjAwMCBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L3BjaS9wY2kuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorCisvKiBkZWJ1ZyBORTIwMDAgY2FyZCAqLworLy8jZGVmaW5lIERFQlVHX05FMjAwMAorCisjZGVmaW5lIE1BWF9FVEhfRlJBTUVfU0laRSAxNTE0CisKKyNkZWZpbmUgRTgzOTBfQ01ECTB4MDAgIC8qIFRoZSBjb21tYW5kIHJlZ2lzdGVyIChmb3IgYWxsIHBhZ2VzKSAqLworLyogUGFnZSAwIHJlZ2lzdGVyIG9mZnNldHMuICovCisjZGVmaW5lIEVOMF9DTERBTE8JMHgwMQkvKiBMb3cgYnl0ZSBvZiBjdXJyZW50IGxvY2FsIGRtYSBhZGRyICBSRCAqLworI2RlZmluZSBFTjBfU1RBUlRQRwkweDAxCS8qIFN0YXJ0aW5nIHBhZ2Ugb2YgcmluZyBiZnIgV1IgKi8KKyNkZWZpbmUgRU4wX0NMREFISQkweDAyCS8qIEhpZ2ggYnl0ZSBvZiBjdXJyZW50IGxvY2FsIGRtYSBhZGRyICBSRCAqLworI2RlZmluZSBFTjBfU1RPUFBHCTB4MDIJLyogRW5kaW5nIHBhZ2UgKzEgb2YgcmluZyBiZnIgV1IgKi8KKyNkZWZpbmUgRU4wX0JPVU5EQVJZCTB4MDMJLyogQm91bmRhcnkgcGFnZSBvZiByaW5nIGJmciBSRCBXUiAqLworI2RlZmluZSBFTjBfVFNSCQkweDA0CS8qIFRyYW5zbWl0IHN0YXR1cyByZWcgUkQgKi8KKyNkZWZpbmUgRU4wX1RQU1IJMHgwNAkvKiBUcmFuc21pdCBzdGFydGluZyBwYWdlIFdSICovCisjZGVmaW5lIEVOMF9OQ1IJCTB4MDUJLyogTnVtYmVyIG9mIGNvbGxpc2lvbiByZWcgUkQgKi8KKyNkZWZpbmUgRU4wX1RDTlRMTwkweDA1CS8qIExvdyAgYnl0ZSBvZiB0eCBieXRlIGNvdW50IFdSICovCisjZGVmaW5lIEVOMF9GSUZPCTB4MDYJLyogRklGTyBSRCAqLworI2RlZmluZSBFTjBfVENOVEhJCTB4MDYJLyogSGlnaCBieXRlIG9mIHR4IGJ5dGUgY291bnQgV1IgKi8KKyNkZWZpbmUgRU4wX0lTUgkJMHgwNwkvKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZyBSRCBXUiAqLworI2RlZmluZSBFTjBfQ1JEQUxPCTB4MDgJLyogbG93IGJ5dGUgb2YgY3VycmVudCByZW1vdGUgZG1hIGFkZHJlc3MgUkQgKi8KKyNkZWZpbmUgRU4wX1JTQVJMTwkweDA4CS8qIFJlbW90ZSBzdGFydCBhZGRyZXNzIHJlZyAwICovCisjZGVmaW5lIEVOMF9DUkRBSEkJMHgwOQkvKiBoaWdoIGJ5dGUsIGN1cnJlbnQgcmVtb3RlIGRtYSBhZGRyZXNzIFJEICovCisjZGVmaW5lIEVOMF9SU0FSSEkJMHgwOQkvKiBSZW1vdGUgc3RhcnQgYWRkcmVzcyByZWcgMSAqLworI2RlZmluZSBFTjBfUkNOVExPCTB4MGEJLyogUmVtb3RlIGJ5dGUgY291bnQgcmVnIFdSICovCisjZGVmaW5lIEVOMF9SVEw4MDI5SUQwCTB4MGEJLyogUmVhbHRlayBJRCBieXRlICMxIFJEICovCisjZGVmaW5lIEVOMF9SQ05USEkJMHgwYgkvKiBSZW1vdGUgYnl0ZSBjb3VudCByZWcgV1IgKi8KKyNkZWZpbmUgRU4wX1JUTDgwMjlJRDEJMHgwYgkvKiBSZWFsdGVrIElEIGJ5dGUgIzIgUkQgKi8KKyNkZWZpbmUgRU4wX1JTUgkJMHgwYwkvKiByeCBzdGF0dXMgcmVnIFJEICovCisjZGVmaW5lIEVOMF9SWENSCTB4MGMJLyogUlggY29uZmlndXJhdGlvbiByZWcgV1IgKi8KKyNkZWZpbmUgRU4wX1RYQ1IJMHgwZAkvKiBUWCBjb25maWd1cmF0aW9uIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjAJMHgwZAkvKiBSY3YgYWxpZ25tZW50IGVycm9yIGNvdW50ZXIgUkQgKi8KKyNkZWZpbmUgRU4wX0RDRkcJMHgwZQkvKiBEYXRhIGNvbmZpZ3VyYXRpb24gcmVnIFdSICovCisjZGVmaW5lIEVOMF9DT1VOVEVSMQkweDBlCS8qIFJjdiBDUkMgZXJyb3IgY291bnRlciBSRCAqLworI2RlZmluZSBFTjBfSU1SCQkweDBmCS8qIEludGVycnVwdCBtYXNrIHJlZyBXUiAqLworI2RlZmluZSBFTjBfQ09VTlRFUjIJMHgwZgkvKiBSY3YgbWlzc2VkIGZyYW1lIGVycm9yIGNvdW50ZXIgUkQgKi8KKworI2RlZmluZSBFTjFfUEhZUyAgICAgICAgMHgxMQorI2RlZmluZSBFTjFfQ1VSUEFHICAgICAgMHgxNworI2RlZmluZSBFTjFfTVVMVCAgICAgICAgMHgxOAorCisjZGVmaW5lIEVOMl9TVEFSVFBHCTB4MjEJLyogU3RhcnRpbmcgcGFnZSBvZiByaW5nIGJmciBSRCAqLworI2RlZmluZSBFTjJfU1RPUFBHCTB4MjIJLyogRW5kaW5nIHBhZ2UgKzEgb2YgcmluZyBiZnIgUkQgKi8KKworI2RlZmluZSBFTjNfQ09ORklHMAkweDMzCisjZGVmaW5lIEVOM19DT05GSUcxCTB4MzQKKyNkZWZpbmUgRU4zX0NPTkZJRzIJMHgzNQorI2RlZmluZSBFTjNfQ09ORklHMwkweDM2CisKKy8qICBSZWdpc3RlciBhY2Nlc3NlZCBhdCBFTl9DTUQsIHRoZSA4MzkwIGJhc2UgYWRkci4gICovCisjZGVmaW5lIEU4MzkwX1NUT1AJMHgwMQkvKiBTdG9wIGFuZCByZXNldCB0aGUgY2hpcCAqLworI2RlZmluZSBFODM5MF9TVEFSVAkweDAyCS8qIFN0YXJ0IHRoZSBjaGlwLCBjbGVhciByZXNldCAqLworI2RlZmluZSBFODM5MF9UUkFOUwkweDA0CS8qIFRyYW5zbWl0IGEgZnJhbWUgKi8KKyNkZWZpbmUgRTgzOTBfUlJFQUQJMHgwOAkvKiBSZW1vdGUgcmVhZCAqLworI2RlZmluZSBFODM5MF9SV1JJVEUJMHgxMAkvKiBSZW1vdGUgd3JpdGUgICovCisjZGVmaW5lIEU4MzkwX05PRE1BCTB4MjAJLyogUmVtb3RlIERNQSAqLworI2RlZmluZSBFODM5MF9QQUdFMAkweDAwCS8qIFNlbGVjdCBwYWdlIGNoaXAgcmVnaXN0ZXJzICovCisjZGVmaW5lIEU4MzkwX1BBR0UxCTB4NDAJLyogdXNpbmcgdGhlIHR3byBoaWdoLW9yZGVyIGJpdHMgKi8KKyNkZWZpbmUgRTgzOTBfUEFHRTIJMHg4MAkvKiBQYWdlIDMgaXMgaW52YWxpZC4gKi8KKworLyogQml0cyBpbiBFTjBfSVNSIC0gSW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZSBFTklTUl9SWAkweDAxCS8qIFJlY2VpdmVyLCBubyBlcnJvciAqLworI2RlZmluZSBFTklTUl9UWAkweDAyCS8qIFRyYW5zbWl0dGVyLCBubyBlcnJvciAqLworI2RlZmluZSBFTklTUl9SWF9FUlIJMHgwNAkvKiBSZWNlaXZlciwgd2l0aCBlcnJvciAqLworI2RlZmluZSBFTklTUl9UWF9FUlIJMHgwOAkvKiBUcmFuc21pdHRlciwgd2l0aCBlcnJvciAqLworI2RlZmluZSBFTklTUl9PVkVSCTB4MTAJLyogUmVjZWl2ZXIgb3Zlcndyb3RlIHRoZSByaW5nICovCisjZGVmaW5lIEVOSVNSX0NPVU5URVJTCTB4MjAJLyogQ291bnRlcnMgbmVlZCBlbXB0eWluZyAqLworI2RlZmluZSBFTklTUl9SREMJMHg0MAkvKiByZW1vdGUgZG1hIGNvbXBsZXRlICovCisjZGVmaW5lIEVOSVNSX1JFU0VUCTB4ODAJLyogUmVzZXQgY29tcGxldGVkICovCisjZGVmaW5lIEVOSVNSX0FMTAkweDNmCS8qIEludGVycnVwdHMgd2Ugd2lsbCBlbmFibGUgKi8KKworLyogQml0cyBpbiByZWNlaXZlZCBwYWNrZXQgc3RhdHVzIGJ5dGUgYW5kIEVOMF9SU1IqLworI2RlZmluZSBFTlJTUl9SWE9LCTB4MDEJLyogUmVjZWl2ZWQgYSBnb29kIHBhY2tldCAqLworI2RlZmluZSBFTlJTUl9DUkMJMHgwMgkvKiBDUkMgZXJyb3IgKi8KKyNkZWZpbmUgRU5SU1JfRkFFCTB4MDQJLyogZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisjZGVmaW5lIEVOUlNSX0ZPCTB4MDgJLyogRklGTyBvdmVycnVuICovCisjZGVmaW5lIEVOUlNSX01QQQkweDEwCS8qIG1pc3NlZCBwa3QgKi8KKyNkZWZpbmUgRU5SU1JfUEhZCTB4MjAJLyogcGh5c2ljYWwvbXVsdGljYXN0IGFkZHJlc3MgKi8KKyNkZWZpbmUgRU5SU1JfRElTCTB4NDAJLyogcmVjZWl2ZXIgZGlzYWJsZS4gc2V0IGluIG1vbml0b3IgbW9kZSAqLworI2RlZmluZSBFTlJTUl9ERUYJMHg4MAkvKiBkZWZlcnJpbmcgKi8KKworLyogVHJhbnNtaXR0ZWQgcGFja2V0IHN0YXR1cywgRU4wX1RTUi4gKi8KKyNkZWZpbmUgRU5UU1JfUFRYIDB4MDEJLyogUGFja2V0IHRyYW5zbWl0dGVkIHdpdGhvdXQgZXJyb3IgKi8KKyNkZWZpbmUgRU5UU1JfTkQgIDB4MDIJLyogVGhlIHRyYW5zbWl0IHdhc24ndCBkZWZlcnJlZC4gKi8KKyNkZWZpbmUgRU5UU1JfQ09MIDB4MDQJLyogVGhlIHRyYW5zbWl0IGNvbGxpZGVkIGF0IGxlYXN0IG9uY2UuICovCisjZGVmaW5lIEVOVFNSX0FCVCAweDA4ICAvKiBUaGUgdHJhbnNtaXQgY29sbGlkZWQgMTYgdGltZXMsIGFuZCB3YXMgZGVmZXJyZWQuICovCisjZGVmaW5lIEVOVFNSX0NSUyAweDEwCS8qIFRoZSBjYXJyaWVyIHNlbnNlIHdhcyBsb3N0LiAqLworI2RlZmluZSBFTlRTUl9GVSAgMHgyMCAgLyogQSAiRklGTyB1bmRlcnJ1biIgb2NjdXJyZWQgZHVyaW5nIHRyYW5zbWl0LiAqLworI2RlZmluZSBFTlRTUl9DREggMHg0MAkvKiBUaGUgY29sbGlzaW9uIGRldGVjdCAiaGVhcnRiZWF0IiBzaWduYWwgd2FzIGxvc3QuICovCisjZGVmaW5lIEVOVFNSX09XQyAweDgwICAvKiBUaGVyZSB3YXMgYW4gb3V0LW9mLXdpbmRvdyBjb2xsaXNpb24uICovCisKKyNkZWZpbmUgTkUyMDAwX1BNRU1fU0laRSAgICAoMzIqMTAyNCkKKyNkZWZpbmUgTkUyMDAwX1BNRU1fU1RBUlQgICAoMTYqMTAyNCkKKyNkZWZpbmUgTkUyMDAwX1BNRU1fRU5EICAgICAoTkUyMDAwX1BNRU1fU0laRStORTIwMDBfUE1FTV9TVEFSVCkKKyNkZWZpbmUgTkUyMDAwX01FTV9TSVpFICAgICBORTIwMDBfUE1FTV9FTkQKKwordHlwZWRlZiBzdHJ1Y3QgTkUyMDAwU3RhdGUgeworICAgIHVpbnQ4X3QgY21kOworICAgIHVpbnQzMl90IHN0YXJ0OworICAgIHVpbnQzMl90IHN0b3A7CisgICAgdWludDhfdCBib3VuZGFyeTsKKyAgICB1aW50OF90IHRzcjsKKyAgICB1aW50OF90IHRwc3I7CisgICAgdWludDE2X3QgdGNudDsKKyAgICB1aW50MTZfdCByY250OworICAgIHVpbnQzMl90IHJzYXI7CisgICAgdWludDhfdCByc3I7CisgICAgdWludDhfdCByeGNyOworICAgIHVpbnQ4X3QgaXNyOworICAgIHVpbnQ4X3QgZGNmZzsKKyAgICB1aW50OF90IGltcjsKKyAgICB1aW50OF90IHBoeXNbNl07IC8qIG1hYyBhZGRyZXNzICovCisgICAgdWludDhfdCBjdXJwYWc7CisgICAgdWludDhfdCBtdWx0WzhdOyAvKiBtdWx0aWNhc3QgbWFzayBhcnJheSAqLworICAgIHFlbXVfaXJxIGlycTsKKyAgICBpbnQgaXNhX2lvX2Jhc2U7CisgICAgUENJRGV2aWNlICpwY2lfZGV2OworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisgICAgdWludDhfdCBtYWNhZGRyWzZdOworICAgIHVpbnQ4X3QgbWVtW05FMjAwMF9NRU1fU0laRV07Cit9IE5FMjAwMFN0YXRlOworCitzdGF0aWMgdm9pZCBuZTIwMDBfcmVzZXQoTkUyMDAwU3RhdGUgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBzLT5pc3IgPSBFTklTUl9SRVNFVDsKKyAgICBtZW1jcHkocy0+bWVtLCBzLT5tYWNhZGRyLCA2KTsKKyAgICBzLT5tZW1bMTRdID0gMHg1NzsKKyAgICBzLT5tZW1bMTVdID0gMHg1NzsKKworICAgIC8qIGR1cGxpY2F0ZSBwcm9tIGRhdGEgKi8KKyAgICBmb3IoaSA9IDE1O2kgPj0gMDsgaS0tKSB7CisgICAgICAgIHMtPm1lbVsyICogaV0gPSBzLT5tZW1baV07CisgICAgICAgIHMtPm1lbVsyICogaSArIDFdID0gcy0+bWVtW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbmUyMDAwX3VwZGF0ZV9pcnEoTkUyMDAwU3RhdGUgKnMpCit7CisgICAgaW50IGlzcjsKKyAgICBpc3IgPSAocy0+aXNyICYgcy0+aW1yKSAmIDB4N2Y7CisjaWYgZGVmaW5lZChERUJVR19ORTIwMDApCisgICAgcHJpbnRmKCJORTIwMDA6IFNldCBJUlEgdG8gJWQgKCUwMnggJTAyeClcbiIsCisJICAgaXNyID8gMSA6IDAsIHMtPmlzciwgcy0+aW1yKTsKKyNlbmRpZgorICAgIHFlbXVfc2V0X2lycShzLT5pcnEsIChpc3IgIT0gMCkpOworfQorCisjZGVmaW5lIFBPTFlOT01JQUwgMHgwNGMxMWRiNgorCisvKiBGcm9tIEZyZWVCU0QgKi8KKy8qIFhYWDogb3B0aW1pemUgKi8KK3N0YXRpYyBpbnQgY29tcHV0ZV9tY2FzdF9pZHgoY29uc3QgdWludDhfdCAqZXApCit7CisgICAgdWludDMyX3QgY3JjOworICAgIGludCBjYXJyeSwgaSwgajsKKyAgICB1aW50OF90IGI7CisKKyAgICBjcmMgPSAweGZmZmZmZmZmOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgYiA9ICplcCsrOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBjYXJyeSA9ICgoY3JjICYgMHg4MDAwMDAwMEwpID8gMSA6IDApIF4gKGIgJiAweDAxKTsKKyAgICAgICAgICAgIGNyYyA8PD0gMTsKKyAgICAgICAgICAgIGIgPj49IDE7CisgICAgICAgICAgICBpZiAoY2FycnkpCisgICAgICAgICAgICAgICAgY3JjID0gKChjcmMgXiBQT0xZTk9NSUFMKSB8IGNhcnJ5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKGNyYyA+PiAyNik7Cit9CisKK3N0YXRpYyBpbnQgbmUyMDAwX2J1ZmZlcl9mdWxsKE5FMjAwMFN0YXRlICpzKQoreworICAgIGludCBhdmFpbCwgaW5kZXgsIGJvdW5kYXJ5OworCisgICAgaW5kZXggPSBzLT5jdXJwYWcgPDwgODsKKyAgICBib3VuZGFyeSA9IHMtPmJvdW5kYXJ5IDw8IDg7CisgICAgaWYgKGluZGV4IDwgYm91bmRhcnkpCisgICAgICAgIGF2YWlsID0gYm91bmRhcnkgLSBpbmRleDsKKyAgICBlbHNlCisgICAgICAgIGF2YWlsID0gKHMtPnN0b3AgLSBzLT5zdGFydCkgLSAoaW5kZXggLSBib3VuZGFyeSk7CisgICAgaWYgKGF2YWlsIDwgKE1BWF9FVEhfRlJBTUVfU0laRSArIDQpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZTIwMDBfY2FuX3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBORTIwMDBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBpZiAocy0+Y21kICYgRTgzOTBfU1RPUCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuICFuZTIwMDBfYnVmZmVyX2Z1bGwocyk7Cit9CisKKyNkZWZpbmUgTUlOX0JVRl9TSVpFIDYwCisKK3N0YXRpYyBzc2l6ZV90IG5lMjAwMF9yZWNlaXZlKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemVfKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKyAgICBpbnQgc2l6ZSA9IHNpemVfOworICAgIHVpbnQ4X3QgKnA7CisgICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbiwgbmV4dCwgYXZhaWwsIGxlbiwgaW5kZXgsIG1jYXN0X2lkeDsKKyAgICB1aW50OF90IGJ1ZjFbNjBdOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJyb2FkY2FzdF9tYWNhZGRyWzZdID0KKyAgICAgICAgeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisKKyNpZiBkZWZpbmVkKERFQlVHX05FMjAwMCkKKyAgICBwcmludGYoIk5FMjAwMDogcmVjZWl2ZWQgbGVuPSVkXG4iLCBzaXplKTsKKyNlbmRpZgorCisgICAgaWYgKHMtPmNtZCAmIEU4MzkwX1NUT1ApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChuZTIwMDBfYnVmZmVyX2Z1bGwocykpIHsKKyAgICAgICAgLyogTmVlZCB0byBzaWduYWwgc28gZHJpdmVyIGhhcyBjaGFuY2UgdG8gY2xlYXIgYnVmZmVyLgorICAgICAgICAgKiBPdGhlcndpc2UgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbjogYnVmZmVyIGJlY29tZSBmdWxsLCBkcml2ZXIgQUNLCisgICAgICAgICAqIGludGVycnVwdCBhbmQgdGhlbiBhZnRlciB0aGF0LCB3ZSB3aWxsIGxvc2UgcnggaW50ZXJydXB0IGZvcmV2ZXIuCisgICAgICAgICAqLworICAgICAgICBzLT5pc3IgfD0gRU5JU1JfUlhfRVJSOworICAgICAgICBuZTIwMDBfdXBkYXRlX2lycShzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFhYWDogY2hlY2sgdGhpcyAqLworICAgIGlmIChzLT5yeGNyICYgMHgxMCkgeworICAgICAgICAvKiBwcm9taXNjdW91czogcmVjZWl2ZSBhbGwgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1lbWNtcChidWYsICBicm9hZGNhc3RfbWFjYWRkciwgNikpIHsKKyAgICAgICAgICAgIC8qIGJyb2FkY2FzdCBhZGRyZXNzICovCisgICAgICAgICAgICBpZiAoIShzLT5yeGNyICYgMHgwNCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmWzBdICYgMHgwMSkgeworICAgICAgICAgICAgLyogbXVsdGljYXN0ICovCisgICAgICAgICAgICBpZiAoIShzLT5yeGNyICYgMHgwOCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICBtY2FzdF9pZHggPSBjb21wdXRlX21jYXN0X2lkeChidWYpOworICAgICAgICAgICAgaWYgKCEocy0+bXVsdFttY2FzdF9pZHggPj4gM10gJiAoMSA8PCAobWNhc3RfaWR4ICYgNykpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5tZW1bMF0gPT0gYnVmWzBdICYmCisgICAgICAgICAgICAgICAgICAgcy0+bWVtWzJdID09IGJ1ZlsxXSAmJgorICAgICAgICAgICAgICAgICAgIHMtPm1lbVs0XSA9PSBidWZbMl0gJiYKKyAgICAgICAgICAgICAgICAgICBzLT5tZW1bNl0gPT0gYnVmWzNdICYmCisgICAgICAgICAgICAgICAgICAgcy0+bWVtWzhdID09IGJ1Zls0XSAmJgorICAgICAgICAgICAgICAgICAgIHMtPm1lbVsxMF0gPT0gYnVmWzVdKSB7CisgICAgICAgICAgICAvKiBtYXRjaCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIGlmIHRvbyBzbWFsbCBidWZmZXIsIHRoZW4gZXhwYW5kIGl0ICovCisgICAgaWYgKHNpemUgPCBNSU5fQlVGX1NJWkUpIHsKKyAgICAgICAgbWVtY3B5KGJ1ZjEsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIG1lbXNldChidWYxICsgc2l6ZSwgMCwgTUlOX0JVRl9TSVpFIC0gc2l6ZSk7CisgICAgICAgIGJ1ZiA9IGJ1ZjE7CisgICAgICAgIHNpemUgPSBNSU5fQlVGX1NJWkU7CisgICAgfQorCisgICAgaW5kZXggPSBzLT5jdXJwYWcgPDwgODsKKyAgICAvKiA0IGJ5dGVzIGZvciBoZWFkZXIgKi8KKyAgICB0b3RhbF9sZW4gPSBzaXplICsgNDsKKyAgICAvKiBhZGRyZXNzIGZvciBuZXh0IHBhY2tldCAoNCBieXRlcyBmb3IgQ1JDKSAqLworICAgIG5leHQgPSBpbmRleCArICgodG90YWxfbGVuICsgNCArIDI1NSkgJiB+MHhmZik7CisgICAgaWYgKG5leHQgPj0gcy0+c3RvcCkKKyAgICAgICAgbmV4dCAtPSAocy0+c3RvcCAtIHMtPnN0YXJ0KTsKKyAgICAvKiBwcmVwYXJlIHBhY2tldCBoZWFkZXIgKi8KKyAgICBwID0gcy0+bWVtICsgaW5kZXg7CisgICAgcy0+cnNyID0gRU5SU1JfUlhPSzsgLyogcmVjZWl2ZSBzdGF0dXMgKi8KKyAgICAvKiBYWFg6IGNoZWNrIHRoaXMgKi8KKyAgICBpZiAoYnVmWzBdICYgMHgwMSkKKyAgICAgICAgcy0+cnNyIHw9IEVOUlNSX1BIWTsKKyAgICBwWzBdID0gcy0+cnNyOworICAgIHBbMV0gPSBuZXh0ID4+IDg7CisgICAgcFsyXSA9IHRvdGFsX2xlbjsKKyAgICBwWzNdID0gdG90YWxfbGVuID4+IDg7CisgICAgaW5kZXggKz0gNDsKKworICAgIC8qIHdyaXRlIHBhY2tldCBkYXRhICovCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGlmIChpbmRleCA8PSBzLT5zdG9wKQorICAgICAgICAgICAgYXZhaWwgPSBzLT5zdG9wIC0gaW5kZXg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2YWlsID0gMDsKKyAgICAgICAgbGVuID0gc2l6ZTsKKyAgICAgICAgaWYgKGxlbiA+IGF2YWlsKQorICAgICAgICAgICAgbGVuID0gYXZhaWw7CisgICAgICAgIG1lbWNweShzLT5tZW0gKyBpbmRleCwgYnVmLCBsZW4pOworICAgICAgICBidWYgKz0gbGVuOworICAgICAgICBpbmRleCArPSBsZW47CisgICAgICAgIGlmIChpbmRleCA9PSBzLT5zdG9wKQorICAgICAgICAgICAgaW5kZXggPSBzLT5zdGFydDsKKyAgICAgICAgc2l6ZSAtPSBsZW47CisgICAgfQorICAgIHMtPmN1cnBhZyA9IG5leHQgPj4gODsKKworICAgIC8qIG5vdyB3ZSBjYW4gc2lnbmFsIHdlIGhhdmUgcmVjZWl2ZWQgc29tZXRoaW5nICovCisgICAgcy0+aXNyIHw9IEVOSVNSX1JYOworICAgIG5lMjAwMF91cGRhdGVfaXJxKHMpOworCisgICAgcmV0dXJuIHNpemVfOworfQorCitzdGF0aWMgdm9pZCBuZTIwMDBfaW9wb3J0X3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gb3BhcXVlOworICAgIGludCBvZmZzZXQsIHBhZ2UsIGluZGV4OworCisgICAgYWRkciAmPSAweGY7CisjaWZkZWYgREVCVUdfTkUyMDAwCisgICAgcHJpbnRmKCJORTIwMDA6IHdyaXRlIGFkZHI9MHgleCB2YWw9MHglMDJ4XG4iLCBhZGRyLCB2YWwpOworI2VuZGlmCisgICAgaWYgKGFkZHIgPT0gRTgzOTBfQ01EKSB7CisgICAgICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgcy0+Y21kID0gdmFsOworICAgICAgICBpZiAoISh2YWwgJiBFODM5MF9TVE9QKSkgeyAvKiBTVEFSVCBiaXQgbWFrZXMgbm8gc2Vuc2Ugb24gUlRMODAyOS4uLiAqLworICAgICAgICAgICAgcy0+aXNyICY9IH5FTklTUl9SRVNFVDsKKyAgICAgICAgICAgIC8qIHRlc3Qgc3BlY2lmaWMgY2FzZTogemVybyBsZW5ndGggdHJhbnNmZXIgKi8KKyAgICAgICAgICAgIGlmICgodmFsICYgKEU4MzkwX1JSRUFEIHwgRTgzOTBfUldSSVRFKSkgJiYKKyAgICAgICAgICAgICAgICBzLT5yY250ID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT5pc3IgfD0gRU5JU1JfUkRDOworICAgICAgICAgICAgICAgIG5lMjAwMF91cGRhdGVfaXJxKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbCAmIEU4MzkwX1RSQU5TKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSAocy0+dHBzciA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IG5leHQgMiBsaW5lcyBhcmUgYSBoYWNrIHRvIG1ha2UgbmV0d2FyZSAzLjExIHdvcmsgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gTkUyMDAwX1BNRU1fRU5EKQorICAgICAgICAgICAgICAgICAgICBpbmRleCAtPSBORTIwMDBfUE1FTV9TSVpFOworICAgICAgICAgICAgICAgIC8qIGZhaWwgc2FmZTogY2hlY2sgcmFuZ2Ugb24gdGhlIHRyYW5zbWl0dGVkIGxlbmd0aCAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggKyBzLT50Y250IDw9IE5FMjAwMF9QTUVNX0VORCkgeworICAgICAgICAgICAgICAgICAgICBxZW11X3NlbmRfcGFja2V0KHMtPnZjLCBzLT5tZW0gKyBpbmRleCwgcy0+dGNudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIHNpZ25hbCBlbmQgb2YgdHJhbnNmZXIgKi8KKyAgICAgICAgICAgICAgICBzLT50c3IgPSBFTlRTUl9QVFg7CisgICAgICAgICAgICAgICAgcy0+aXNyIHw9IEVOSVNSX1RYOworICAgICAgICAgICAgICAgIHMtPmNtZCAmPSB+RTgzOTBfVFJBTlM7CisgICAgICAgICAgICAgICAgbmUyMDAwX3VwZGF0ZV9pcnEocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwYWdlID0gcy0+Y21kID4+IDY7CisgICAgICAgIG9mZnNldCA9IGFkZHIgfCAocGFnZSA8PCA0KTsKKyAgICAgICAgc3dpdGNoKG9mZnNldCkgeworICAgICAgICBjYXNlIEVOMF9TVEFSVFBHOgorICAgICAgICAgICAgcy0+c3RhcnQgPSB2YWwgPDwgODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9TVE9QUEc6CisgICAgICAgICAgICBzLT5zdG9wID0gdmFsIDw8IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTjBfQk9VTkRBUlk6CisgICAgICAgICAgICBzLT5ib3VuZGFyeSA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9JTVI6CisgICAgICAgICAgICBzLT5pbXIgPSB2YWw7CisgICAgICAgICAgICBuZTIwMDBfdXBkYXRlX2lycShzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9UUFNSOgorICAgICAgICAgICAgcy0+dHBzciA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9UQ05UTE86CisgICAgICAgICAgICBzLT50Y250ID0gKHMtPnRjbnQgJiAweGZmMDApIHwgdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4wX1RDTlRISToKKyAgICAgICAgICAgIHMtPnRjbnQgPSAocy0+dGNudCAmIDB4MDBmZikgfCAodmFsIDw8IDgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4wX1JTQVJMTzoKKyAgICAgICAgICAgIHMtPnJzYXIgPSAocy0+cnNhciAmIDB4ZmYwMCkgfCB2YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTjBfUlNBUkhJOgorICAgICAgICAgICAgcy0+cnNhciA9IChzLT5yc2FyICYgMHgwMGZmKSB8ICh2YWwgPDwgOCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTjBfUkNOVExPOgorICAgICAgICAgICAgcy0+cmNudCA9IChzLT5yY250ICYgMHhmZjAwKSB8IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9SQ05USEk6CisgICAgICAgICAgICBzLT5yY250ID0gKHMtPnJjbnQgJiAweDAwZmYpIHwgKHZhbCA8PCA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9SWENSOgorICAgICAgICAgICAgcy0+cnhjciA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9EQ0ZHOgorICAgICAgICAgICAgcy0+ZGNmZyA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9JU1I6CisgICAgICAgICAgICBzLT5pc3IgJj0gfih2YWwgJiAweDdmKTsKKyAgICAgICAgICAgIG5lMjAwMF91cGRhdGVfaXJxKHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4xX1BIWVMgLi4uIEVOMV9QSFlTICsgNToKKyAgICAgICAgICAgIHMtPnBoeXNbb2Zmc2V0IC0gRU4xX1BIWVNdID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4xX0NVUlBBRzoKKyAgICAgICAgICAgIHMtPmN1cnBhZyA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMV9NVUxUIC4uLiBFTjFfTVVMVCArIDc6CisgICAgICAgICAgICBzLT5tdWx0W29mZnNldCAtIEVOMV9NVUxUXSA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3QgbmUyMDAwX2lvcG9ydF9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcikKK3sKKyAgICBORTIwMDBTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgb2Zmc2V0LCBwYWdlLCByZXQ7CisKKyAgICBhZGRyICY9IDB4ZjsKKyAgICBpZiAoYWRkciA9PSBFODM5MF9DTUQpIHsKKyAgICAgICAgcmV0ID0gcy0+Y21kOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2UgPSBzLT5jbWQgPj4gNjsKKyAgICAgICAgb2Zmc2V0ID0gYWRkciB8IChwYWdlIDw8IDQpOworICAgICAgICBzd2l0Y2gob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgRU4wX1RTUjoKKyAgICAgICAgICAgIHJldCA9IHMtPnRzcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMF9CT1VOREFSWToKKyAgICAgICAgICAgIHJldCA9IHMtPmJvdW5kYXJ5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4wX0lTUjoKKyAgICAgICAgICAgIHJldCA9IHMtPmlzcjsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgRU4wX1JTQVJMTzoKKwkgICAgcmV0ID0gcy0+cnNhciAmIDB4MDBmZjsKKwkgICAgYnJlYWs7CisJY2FzZSBFTjBfUlNBUkhJOgorCSAgICByZXQgPSBzLT5yc2FyID4+IDg7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMV9QSFlTIC4uLiBFTjFfUEhZUyArIDU6CisgICAgICAgICAgICByZXQgPSBzLT5waHlzW29mZnNldCAtIEVOMV9QSFlTXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVOMV9DVVJQQUc6CisgICAgICAgICAgICByZXQgPSBzLT5jdXJwYWc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTjFfTVVMVCAuLi4gRU4xX01VTFQgKyA3OgorICAgICAgICAgICAgcmV0ID0gcy0+bXVsdFtvZmZzZXQgLSBFTjFfTVVMVF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFTjBfUlNSOgorICAgICAgICAgICAgcmV0ID0gcy0+cnNyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4yX1NUQVJUUEc6CisgICAgICAgICAgICByZXQgPSBzLT5zdGFydCA+PiA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU4yX1NUT1BQRzoKKyAgICAgICAgICAgIHJldCA9IHMtPnN0b3AgPj4gODsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgRU4wX1JUTDgwMjlJRDA6CisJICAgIHJldCA9IDB4NTA7CisJICAgIGJyZWFrOworCWNhc2UgRU4wX1JUTDgwMjlJRDE6CisJICAgIHJldCA9IDB4NDM7CisJICAgIGJyZWFrOworCWNhc2UgRU4zX0NPTkZJRzA6CisJICAgIHJldCA9IDA7CQkvKiAxMGJhc2VUIG1lZGlhICovCisJICAgIGJyZWFrOworCWNhc2UgRU4zX0NPTkZJRzI6CisJICAgIHJldCA9IDB4NDA7CQkvKiAxMGJhc2VUIGFjdGl2ZSAqLworCSAgICBicmVhazsKKwljYXNlIEVOM19DT05GSUczOgorCSAgICByZXQgPSAweDQwOwkJLyogRnVsbCBkdXBsZXggKi8KKwkgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSAweDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgREVCVUdfTkUyMDAwCisgICAgcHJpbnRmKCJORTIwMDA6IHJlYWQgYWRkcj0weCV4IHZhbD0lMDJ4XG4iLCBhZGRyLCByZXQpOworI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5lMjAwMF9tZW1fd3JpdGViKE5FMjAwMFN0YXRlICpzLCB1aW50MzJfdCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbCkKK3sKKyAgICBpZiAoYWRkciA8IDMyIHx8CisgICAgICAgIChhZGRyID49IE5FMjAwMF9QTUVNX1NUQVJUICYmIGFkZHIgPCBORTIwMDBfTUVNX1NJWkUpKSB7CisgICAgICAgIHMtPm1lbVthZGRyXSA9IHZhbDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZTIwMDBfbWVtX3dyaXRldyhORTIwMDBTdGF0ZSAqcywgdWludDMyX3QgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwpCit7CisgICAgYWRkciAmPSB+MTsgLyogWFhYOiBjaGVjayBleGFjdCBiZWhhdmlvdXIgaWYgbm90IGV2ZW4gKi8KKyAgICBpZiAoYWRkciA8IDMyIHx8CisgICAgICAgIChhZGRyID49IE5FMjAwMF9QTUVNX1NUQVJUICYmIGFkZHIgPCBORTIwMDBfTUVNX1NJWkUpKSB7CisgICAgICAgIHN0d19sZV9wKHMtPm1lbSArIGFkZHIsIHZhbCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmUyMDAwX21lbV93cml0ZWwoTkUyMDAwU3RhdGUgKnMsIHVpbnQzMl90IGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsKQoreworICAgIGFkZHIgJj0gfjE7IC8qIFhYWDogY2hlY2sgZXhhY3QgYmVoYXZpb3VyIGlmIG5vdCBldmVuICovCisgICAgaWYgKGFkZHIgPCAzMiB8fAorICAgICAgICAoYWRkciA+PSBORTIwMDBfUE1FTV9TVEFSVCAmJiBhZGRyIDwgTkUyMDAwX01FTV9TSVpFKSkgeworICAgICAgICBzdGxfbGVfcChzLT5tZW0gKyBhZGRyLCB2YWwpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBuZTIwMDBfbWVtX3JlYWRiKE5FMjAwMFN0YXRlICpzLCB1aW50MzJfdCBhZGRyKQoreworICAgIGlmIChhZGRyIDwgMzIgfHwKKyAgICAgICAgKGFkZHIgPj0gTkUyMDAwX1BNRU1fU1RBUlQgJiYgYWRkciA8IE5FMjAwMF9NRU1fU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIHMtPm1lbVthZGRyXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMHhmZjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbmUyMDAwX21lbV9yZWFkdyhORTIwMDBTdGF0ZSAqcywgdWludDMyX3QgYWRkcikKK3sKKyAgICBhZGRyICY9IH4xOyAvKiBYWFg6IGNoZWNrIGV4YWN0IGJlaGF2aW91ciBpZiBub3QgZXZlbiAqLworICAgIGlmIChhZGRyIDwgMzIgfHwKKyAgICAgICAgKGFkZHIgPj0gTkUyMDAwX1BNRU1fU1RBUlQgJiYgYWRkciA8IE5FMjAwMF9NRU1fU0laRSkpIHsKKyAgICAgICAgcmV0dXJuIGxkdXdfbGVfcChzLT5tZW0gKyBhZGRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBuZTIwMDBfbWVtX3JlYWRsKE5FMjAwMFN0YXRlICpzLCB1aW50MzJfdCBhZGRyKQoreworICAgIGFkZHIgJj0gfjE7IC8qIFhYWDogY2hlY2sgZXhhY3QgYmVoYXZpb3VyIGlmIG5vdCBldmVuICovCisgICAgaWYgKGFkZHIgPCAzMiB8fAorICAgICAgICAoYWRkciA+PSBORTIwMDBfUE1FTV9TVEFSVCAmJiBhZGRyIDwgTkUyMDAwX01FTV9TSVpFKSkgeworICAgICAgICByZXR1cm4gbGRsX2xlX3Aocy0+bWVtICsgYWRkcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmUyMDAwX2RtYV91cGRhdGUoTkUyMDAwU3RhdGUgKnMsIGludCBsZW4pCit7CisgICAgcy0+cnNhciArPSBsZW47CisgICAgLyogd3JhcCAqLworICAgIC8qIFhYWDogY2hlY2sgd2hhdCB0byBkbyBpZiByc2FyID4gc3RvcCAqLworICAgIGlmIChzLT5yc2FyID09IHMtPnN0b3ApCisgICAgICAgIHMtPnJzYXIgPSBzLT5zdGFydDsKKworICAgIGlmIChzLT5yY250IDw9IGxlbikgeworICAgICAgICBzLT5yY250ID0gMDsKKyAgICAgICAgLyogc2lnbmFsIGVuZCBvZiB0cmFuc2ZlciAqLworICAgICAgICBzLT5pc3IgfD0gRU5JU1JfUkRDOworICAgICAgICBuZTIwMDBfdXBkYXRlX2lycShzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5yY250IC09IGxlbjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG5lMjAwMF9hc2ljX2lvcG9ydF93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBORTIwMDBTdGF0ZSAqcyA9IG9wYXF1ZTsKKworI2lmZGVmIERFQlVHX05FMjAwMAorICAgIHByaW50ZigiTkUyMDAwOiBhc2ljIHdyaXRlIHZhbD0weCUwNHhcbiIsIHZhbCk7CisjZW5kaWYKKyAgICBpZiAocy0+cmNudCA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHMtPmRjZmcgJiAweDAxKSB7CisgICAgICAgIC8qIDE2IGJpdCBhY2Nlc3MgKi8KKyAgICAgICAgbmUyMDAwX21lbV93cml0ZXcocywgcy0+cnNhciwgdmFsKTsKKyAgICAgICAgbmUyMDAwX2RtYV91cGRhdGUocywgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogOCBiaXQgYWNjZXNzICovCisgICAgICAgIG5lMjAwMF9tZW1fd3JpdGViKHMsIHMtPnJzYXIsIHZhbCk7CisgICAgICAgIG5lMjAwMF9kbWFfdXBkYXRlKHMsIDEpOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IG5lMjAwMF9hc2ljX2lvcG9ydF9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcikKK3sKKyAgICBORTIwMDBTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPmRjZmcgJiAweDAxKSB7CisgICAgICAgIC8qIDE2IGJpdCBhY2Nlc3MgKi8KKyAgICAgICAgcmV0ID0gbmUyMDAwX21lbV9yZWFkdyhzLCBzLT5yc2FyKTsKKyAgICAgICAgbmUyMDAwX2RtYV91cGRhdGUocywgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogOCBiaXQgYWNjZXNzICovCisgICAgICAgIHJldCA9IG5lMjAwMF9tZW1fcmVhZGIocywgcy0+cnNhcik7CisgICAgICAgIG5lMjAwMF9kbWFfdXBkYXRlKHMsIDEpOworICAgIH0KKyNpZmRlZiBERUJVR19ORTIwMDAKKyAgICBwcmludGYoIk5FMjAwMDogYXNpYyByZWFkIHZhbD0weCUwNHhcbiIsIHJldCk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuZTIwMDBfYXNpY19pb3BvcnRfd3JpdGVsKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gb3BhcXVlOworCisjaWZkZWYgREVCVUdfTkUyMDAwCisgICAgcHJpbnRmKCJORTIwMDA6IGFzaWMgd3JpdGVsIHZhbD0weCUwNHhcbiIsIHZhbCk7CisjZW5kaWYKKyAgICBpZiAocy0+cmNudCA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgLyogMzIgYml0IGFjY2VzcyAqLworICAgIG5lMjAwMF9tZW1fd3JpdGVsKHMsIHMtPnJzYXIsIHZhbCk7CisgICAgbmUyMDAwX2RtYV91cGRhdGUocywgNCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBuZTIwMDBfYXNpY19pb3BvcnRfcmVhZGwodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gb3BhcXVlOworICAgIGludCByZXQ7CisKKyAgICAvKiAzMiBiaXQgYWNjZXNzICovCisgICAgcmV0ID0gbmUyMDAwX21lbV9yZWFkbChzLCBzLT5yc2FyKTsKKyAgICBuZTIwMDBfZG1hX3VwZGF0ZShzLCA0KTsKKyNpZmRlZiBERUJVR19ORTIwMDAKKyAgICBwcmludGYoIk5FMjAwMDogYXNpYyByZWFkbCB2YWw9MHglMDR4XG4iLCByZXQpOworI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbmUyMDAwX3Jlc2V0X2lvcG9ydF93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICAvKiBub3RoaW5nIHRvIGRvIChlbmQgb2YgcmVzZXQgcHVsc2UpICovCit9CisKK3N0YXRpYyB1aW50MzJfdCBuZTIwMDBfcmVzZXRfaW9wb3J0X3JlYWQodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gb3BhcXVlOworICAgIG5lMjAwMF9yZXNldChzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmUyMDAwX3NhdmUoUUVNVUZpbGUqIGYsdm9pZCogb3BhcXVlKQoreworCU5FMjAwMFN0YXRlKiBzPShORTIwMDBTdGF0ZSopb3BhcXVlOworICAgICAgICB1aW50MzJfdCB0bXA7CisKKyAgICAgICAgaWYgKHMtPnBjaV9kZXYpCisgICAgICAgICAgICBwY2lfZGV2aWNlX3NhdmUocy0+cGNpX2RldiwgZik7CisKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnJ4Y3IpOworCisJcWVtdV9wdXRfOHMoZiwgJnMtPmNtZCk7CisJcWVtdV9wdXRfYmUzMnMoZiwgJnMtPnN0YXJ0KTsKKwlxZW11X3B1dF9iZTMycyhmLCAmcy0+c3RvcCk7CisJcWVtdV9wdXRfOHMoZiwgJnMtPmJvdW5kYXJ5KTsKKwlxZW11X3B1dF84cyhmLCAmcy0+dHNyKTsKKwlxZW11X3B1dF84cyhmLCAmcy0+dHBzcik7CisJcWVtdV9wdXRfYmUxNnMoZiwgJnMtPnRjbnQpOworCXFlbXVfcHV0X2JlMTZzKGYsICZzLT5yY250KTsKKwlxZW11X3B1dF9iZTMycyhmLCAmcy0+cnNhcik7CisJcWVtdV9wdXRfOHMoZiwgJnMtPnJzcik7CisJcWVtdV9wdXRfOHMoZiwgJnMtPmlzcik7CisJcWVtdV9wdXRfOHMoZiwgJnMtPmRjZmcpOworCXFlbXVfcHV0XzhzKGYsICZzLT5pbXIpOworCXFlbXVfcHV0X2J1ZmZlcihmLCBzLT5waHlzLCA2KTsKKwlxZW11X3B1dF84cyhmLCAmcy0+Y3VycGFnKTsKKwlxZW11X3B1dF9idWZmZXIoZiwgcy0+bXVsdCwgOCk7CisgICAgICAgIHRtcCA9IDA7CisJcWVtdV9wdXRfYmUzMnMoZiwgJnRtcCk7IC8qIGlnbm9yZWQsIHdhcyBpcnEgKi8KKwlxZW11X3B1dF9idWZmZXIoZiwgcy0+bWVtLCBORTIwMDBfTUVNX1NJWkUpOworfQorCitzdGF0aWMgaW50IG5lMjAwMF9sb2FkKFFFTVVGaWxlKiBmLHZvaWQqIG9wYXF1ZSxpbnQgdmVyc2lvbl9pZCkKK3sKKwlORTIwMDBTdGF0ZSogcz0oTkUyMDAwU3RhdGUqKW9wYXF1ZTsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgdWludDMyX3QgdG1wOworCisgICAgICAgIGlmICh2ZXJzaW9uX2lkID4gMykKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChzLT5wY2lfZGV2ICYmIHZlcnNpb25faWQgPj0gMykgeworICAgICAgICAgICAgcmV0ID0gcGNpX2RldmljZV9sb2FkKHMtPnBjaV9kZXYsIGYpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uX2lkID49IDIpIHsKKyAgICAgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5yeGNyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnJ4Y3IgPSAweDBjOworICAgICAgICB9CisKKwlxZW11X2dldF84cyhmLCAmcy0+Y21kKTsKKwlxZW11X2dldF9iZTMycyhmLCAmcy0+c3RhcnQpOworCXFlbXVfZ2V0X2JlMzJzKGYsICZzLT5zdG9wKTsKKwlxZW11X2dldF84cyhmLCAmcy0+Ym91bmRhcnkpOworCXFlbXVfZ2V0XzhzKGYsICZzLT50c3IpOworCXFlbXVfZ2V0XzhzKGYsICZzLT50cHNyKTsKKwlxZW11X2dldF9iZTE2cyhmLCAmcy0+dGNudCk7CisJcWVtdV9nZXRfYmUxNnMoZiwgJnMtPnJjbnQpOworCXFlbXVfZ2V0X2JlMzJzKGYsICZzLT5yc2FyKTsKKwlxZW11X2dldF84cyhmLCAmcy0+cnNyKTsKKwlxZW11X2dldF84cyhmLCAmcy0+aXNyKTsKKwlxZW11X2dldF84cyhmLCAmcy0+ZGNmZyk7CisJcWVtdV9nZXRfOHMoZiwgJnMtPmltcik7CisJcWVtdV9nZXRfYnVmZmVyKGYsIHMtPnBoeXMsIDYpOworCXFlbXVfZ2V0XzhzKGYsICZzLT5jdXJwYWcpOworCXFlbXVfZ2V0X2J1ZmZlcihmLCBzLT5tdWx0LCA4KTsKKwlxZW11X2dldF9iZTMycyhmLCAmdG1wKTsgLyogaWdub3JlZCAqLworCXFlbXVfZ2V0X2J1ZmZlcihmLCBzLT5tZW0sIE5FMjAwMF9NRU1fU0laRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXNhX25lMjAwMF9jbGVhbnVwKFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgTkUyMDAwU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworCisgICAgdW5yZWdpc3Rlcl9zYXZldm0oTlVMTCwgIm5lMjAwMCIsIHMpOworCisgICAgaXNhX3VuYXNzaWduX2lvcG9ydChzLT5pc2FfaW9fYmFzZSwgMTYpOworICAgIGlzYV91bmFzc2lnbl9pb3BvcnQocy0+aXNhX2lvX2Jhc2UgKyAweDEwLCAyKTsKKyAgICBpc2FfdW5hc3NpZ25faW9wb3J0KHMtPmlzYV9pb19iYXNlICsgMHgxZiwgMSk7CisKKyAgICBnX2ZyZWUocyk7Cit9CisKK3ZvaWQgaXNhX25lMjAwMF9pbml0KGludCBiYXNlLCBxZW11X2lycSBpcnEsIE5JQ0luZm8gKm5kKQoreworICAgIE5FMjAwMFN0YXRlICpzOworCisgICAgcWVtdV9jaGVja19uaWNfbW9kZWwobmQsICJuZTJrX2lzYSIpOworCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoTkUyMDAwU3RhdGUpKTsKKworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShiYXNlLCAxNiwgMSwgbmUyMDAwX2lvcG9ydF93cml0ZSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYmFzZSwgMTYsIDEsIG5lMjAwMF9pb3BvcnRfcmVhZCwgcyk7CisKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoYmFzZSArIDB4MTAsIDEsIDEsIG5lMjAwMF9hc2ljX2lvcG9ydF93cml0ZSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYmFzZSArIDB4MTAsIDEsIDEsIG5lMjAwMF9hc2ljX2lvcG9ydF9yZWFkLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoYmFzZSArIDB4MTAsIDIsIDIsIG5lMjAwMF9hc2ljX2lvcG9ydF93cml0ZSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYmFzZSArIDB4MTAsIDIsIDIsIG5lMjAwMF9hc2ljX2lvcG9ydF9yZWFkLCBzKTsKKworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShiYXNlICsgMHgxZiwgMSwgMSwgbmUyMDAwX3Jlc2V0X2lvcG9ydF93cml0ZSwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYmFzZSArIDB4MWYsIDEsIDEsIG5lMjAwMF9yZXNldF9pb3BvcnRfcmVhZCwgcyk7CisgICAgcy0+aXNhX2lvX2Jhc2UgPSBiYXNlOworICAgIHMtPmlycSA9IGlycTsKKyAgICBtZW1jcHkocy0+bWFjYWRkciwgbmQtPm1hY2FkZHIsIDYpOworCisgICAgbmUyMDAwX3Jlc2V0KHMpOworCisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudChuZC0+dmxhbiwgbmQtPm1vZGVsLCBuZC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lMjAwMF9jYW5fcmVjZWl2ZSwgbmUyMDAwX3JlY2VpdmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2FfbmUyMDAwX2NsZWFudXAsIHMpOworCisgICAgcWVtdV9mb3JtYXRfbmljX2luZm9fc3RyKHMtPnZjLCBzLT5tYWNhZGRyKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAibmUyMDAwIiwgLTEsIDIsIG5lMjAwMF9zYXZlLCBuZTIwMDBfbG9hZCwgcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFBDSSBORTIwMDAgZGVmaW5pdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUENJTkUyMDAwU3RhdGUgeworICAgIFBDSURldmljZSBkZXY7CisgICAgTkUyMDAwU3RhdGUgbmUyMDAwOworfSBQQ0lORTIwMDBTdGF0ZTsKKworc3RhdGljIHZvaWQgbmUyMDAwX21hcChQQ0lEZXZpY2UgKnBjaV9kZXYsIGludCByZWdpb25fbnVtLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBzaXplLCBpbnQgdHlwZSkKK3sKKyAgICBQQ0lORTIwMDBTdGF0ZSAqZCA9IChQQ0lORTIwMDBTdGF0ZSAqKXBjaV9kZXY7CisgICAgTkUyMDAwU3RhdGUgKnMgPSAmZC0+bmUyMDAwOworCisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGFkZHIsIDE2LCAxLCBuZTIwMDBfaW9wb3J0X3dyaXRlLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChhZGRyLCAxNiwgMSwgbmUyMDAwX2lvcG9ydF9yZWFkLCBzKTsKKworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShhZGRyICsgMHgxMCwgMSwgMSwgbmUyMDAwX2FzaWNfaW9wb3J0X3dyaXRlLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChhZGRyICsgMHgxMCwgMSwgMSwgbmUyMDAwX2FzaWNfaW9wb3J0X3JlYWQsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShhZGRyICsgMHgxMCwgMiwgMiwgbmUyMDAwX2FzaWNfaW9wb3J0X3dyaXRlLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChhZGRyICsgMHgxMCwgMiwgMiwgbmUyMDAwX2FzaWNfaW9wb3J0X3JlYWQsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShhZGRyICsgMHgxMCwgNCwgNCwgbmUyMDAwX2FzaWNfaW9wb3J0X3dyaXRlbCwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYWRkciArIDB4MTAsIDQsIDQsIG5lMjAwMF9hc2ljX2lvcG9ydF9yZWFkbCwgcyk7CisKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoYWRkciArIDB4MWYsIDEsIDEsIG5lMjAwMF9yZXNldF9pb3BvcnRfd3JpdGUsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKGFkZHIgKyAweDFmLCAxLCAxLCBuZTIwMDBfcmVzZXRfaW9wb3J0X3JlYWQsIHMpOworfQorCitzdGF0aWMgdm9pZCBuZTIwMDBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIE5FMjAwMFN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKworICAgIHVucmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJuZTIwMDAiLCBzKTsKK30KKworc3RhdGljIHZvaWQgcGNpX25lMjAwMF9pbml0KFBDSURldmljZSAqcGNpX2RldikKK3sKKyAgICBQQ0lORTIwMDBTdGF0ZSAqZCA9IChQQ0lORTIwMDBTdGF0ZSAqKXBjaV9kZXY7CisgICAgTkUyMDAwU3RhdGUgKnM7CisgICAgdWludDhfdCAqcGNpX2NvbmY7CisKKyAgICBwY2lfY29uZiA9IGQtPmRldi5jb25maWc7CisgICAgcGNpX2NvbmZpZ19zZXRfdmVuZG9yX2lkKHBjaV9jb25mLCBQQ0lfVkVORE9SX0lEX1JFQUxURUspOworICAgIHBjaV9jb25maWdfc2V0X2RldmljZV9pZChwY2lfY29uZiwgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgwMjkpOworICAgIHBjaV9jb25maWdfc2V0X2NsYXNzKHBjaV9jb25mLCBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCk7CisgICAgcGNpX2NvbmZbUENJX0hFQURFUl9UWVBFXSA9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUw7IC8vIGhlYWRlcl90eXBlCisgICAgcGNpX2NvbmZbMHgzZF0gPSAxOyAvLyBpbnRlcnJ1cHQgcGluIDAKKworICAgIHBjaV9yZWdpc3Rlcl9iYXIoJmQtPmRldiwgMCwgMHgxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfQUREUkVTU19TUEFDRV9JTywgbmUyMDAwX21hcCk7CisgICAgcyA9ICZkLT5uZTIwMDA7CisgICAgcy0+aXJxID0gZC0+ZGV2LmlycVswXTsKKyAgICBzLT5wY2lfZGV2ID0gKFBDSURldmljZSAqKWQ7CisgICAgcWRldl9nZXRfbWFjYWRkcigmZC0+ZGV2LnFkZXYsIHMtPm1hY2FkZHIpOworICAgIG5lMjAwMF9yZXNldChzKTsKKyAgICBzLT52YyA9IHFkZXZfZ2V0X3ZsYW5fY2xpZW50KCZkLT5kZXYucWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lMjAwMF9jYW5fcmVjZWl2ZSwgbmUyMDAwX3JlY2VpdmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZTIwMDBfY2xlYW51cCwgcyk7CisKKyAgICBxZW11X2Zvcm1hdF9uaWNfaW5mb19zdHIocy0+dmMsIHMtPm1hY2FkZHIpOworCisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJuZTIwMDAiLCAtMSwgMywgbmUyMDAwX3NhdmUsIG5lMjAwMF9sb2FkLCBzKTsKK30KKworc3RhdGljIHZvaWQgbmUyMDAwX3JlZ2lzdGVyX2RldmljZXModm9pZCkKK3sKKyAgICBwY2lfcWRldl9yZWdpc3RlcigibmUya19wY2kiLCBzaXplb2YoUENJTkUyMDAwU3RhdGUpLCBwY2lfbmUyMDAwX2luaXQpOworfQorCitkZXZpY2VfaW5pdChuZTIwMDBfcmVnaXN0ZXJfZGV2aWNlcykKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvbmV0L3NtYzkxYzExMS5jIGIvYW5kcm9pZC9xZW11MS9ody9uZXQvc21jOTFjMTExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhYTY4NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvbmV0L3NtYzkxYzExMS5jCkBAIC0wLDAgKzEsODE5IEBACisvKgorICogU01TQyA5MUMxMTEgRXRoZXJuZXQgaW50ZXJmYWNlIGVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBDb2RlU291cmNlcnksIExMQy4KKyAqIFdyaXR0ZW4gYnkgUGF1bCBCcm9vaworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbmNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgImh3L3N5c2J1cy5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKyNpbmNsdWRlICJody9kZXZpY2VzLmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKy8qIEZvciBjcmMzMiAqLworI2luY2x1ZGUgPHpsaWIuaD4KKworLyogTnVtYmVyIG9mIDJrIG1lbW9yeSBwYWdlcyBhdmFpbGFibGUuICAqLworI2RlZmluZSBOVU1fUEFDS0VUUyA0CisjZGVmaW5lIEJVRkZFUl9QRVJfUEFDS0VUIDIwNDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFN5c0J1c0RldmljZSBidXNkZXY7CisgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKyAgICB1aW50MTZfdCB0Y3I7CisgICAgdWludDE2X3QgcmNyOworICAgIHVpbnQxNl90IGNyOworICAgIHVpbnQxNl90IGN0cjsKKyAgICB1aW50MTZfdCBncHI7CisgICAgdWludDE2X3QgcHRyOworICAgIHVpbnQxNl90IGVyY3Y7CisgICAgcWVtdV9pcnEgaXJxOworICAgIGludCBiYW5rOworICAgIGludCBwYWNrZXRfbnVtOworICAgIGludCB0eF9hbGxvYzsKKyAgICAvKiBCaXRtYXNrIG9mIGFsbG9jYXRlZCBwYWNrZXRzLiAgKi8KKyAgICBpbnQgYWxsb2NhdGVkOworICAgIGludCB0eF9maWZvX2xlbjsKKyAgICBpbnQgdHhfZmlmb1tOVU1fUEFDS0VUU107CisgICAgaW50IHJ4X2ZpZm9fbGVuOworICAgIGludCByeF9maWZvW05VTV9QQUNLRVRTXTsKKyAgICBpbnQgdHhfZmlmb19kb25lX2xlbjsKKyAgICBpbnQgdHhfZmlmb19kb25lW05VTV9QQUNLRVRTXTsKKyAgICAvKiBQYWNrZXQgYnVmZmVyIG1lbW9yeS4gICovCisgICAgdWludDhfdCBkYXRhW05VTV9QQUNLRVRTXVtCVUZGRVJfUEVSX1BBQ0tFVF07CisgICAgdWludDhfdCBpbnRfbGV2ZWw7CisgICAgdWludDhfdCBpbnRfbWFzazsKKyAgICB1aW50OF90IG1hY2FkZHJbNl07CisgICAgaW50IG1taW9faW5kZXg7Cit9IHNtYzkxYzExMV9zdGF0ZTsKKworI2RlZmluZSBTTUM5MUMxMTFfU0FWRV9WRVJTSU9OIDEKKworc3RhdGljIHZvaWQgc21jOTFjMTExX3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzbWM5MWMxMTFfc3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICAvKiBidXNkZXYsIHZjLCBtYWNhZGRyIGFuZCBtbWlvX2luZGV4IGFyZSBsaW5rZWQgdG8gdGhlIGhvc3Qgc3RhdGUgYW5kCisgICAgICogaW5pdGlhbGl6ZWQgd2hlbiB0aGUgZW11bGF0b3Igc3RhcnRzIChpbiBzbWM5MWMxMTFfaW5pdDEgYmVsb3cpLgorICAgICAqIFNhdmluZy9yZXN0b3JpbmcgdGhvc2UgdmFsdWVzIGlzIHRoZXJlZm9yZSB1c2VsZXNzIGFuZCBtYXkgZXZlbiBiZQorICAgICAqIGhhcm1mdWwsIHNvIHRoZXkgYXJlIG9taXR0ZWQuCisgICAgICovCisgICAgcWVtdV9wdXRfYmUxNihmLCBzLT50Y3IpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgcy0+cmNyKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHMtPmNyKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHMtPmN0cik7CisgICAgcWVtdV9wdXRfYmUxNihmLCBzLT5ncHIpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgcy0+cHRyKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHMtPmVyY3YpOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5iYW5rKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnBhY2tldF9udW0pOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT50eF9hbGxvYyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5hbGxvY2F0ZWQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+dHhfZmlmb19sZW4pOworICAgIHFlbXVfcHV0X2J1ZmZlcihmLCAodWludDhfdCopIHMtPnR4X2ZpZm8sIHNpemVvZihzLT50eF9maWZvKSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5yeF9maWZvX2xlbik7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsICh1aW50OF90Kikgcy0+cnhfZmlmbywgc2l6ZW9mKHMtPnJ4X2ZpZm8pKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPnR4X2ZpZm9fZG9uZV9sZW4pOworICAgIHFlbXVfcHV0X2J1ZmZlcihmLCAodWludDhfdCopIHMtPnR4X2ZpZm9fZG9uZSwgc2l6ZW9mKHMtPnR4X2ZpZm9fZG9uZSkpOworCisgICAgLyogUGFja2V0IGJ1ZmZlciBtZW1vcnkuICAqLworICAgIHFlbXVfcHV0X2J1ZmZlcihmLCAodWludDhfdCopIHMtPmRhdGEsIHNpemVvZihzLT5kYXRhKSk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzLT5pbnRfbGV2ZWwpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgcy0+aW50X21hc2spOworCisgICAgLyogbWFjYWRkciwgbW1pb19pbmRleCBvbWl0dGVkIGludGVudGlvbmFsbHkgKi8KK30KKworc3RhdGljIGludCBzbWM5MWMxMTFfbG9hZChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBzbWM5MWMxMTFfc3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBTTUM5MUMxMTFfU0FWRV9WRVJTSU9OKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT50Y3IgPSBxZW11X2dldF9iZTE2KGYpOworICAgIHMtPnJjciA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgcy0+Y3IgPSBxZW11X2dldF9iZTE2KGYpOworICAgIHMtPmN0ciA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgcy0+Z3ByID0gcWVtdV9nZXRfYmUxNihmKTsKKyAgICBzLT5wdHIgPSBxZW11X2dldF9iZTE2KGYpOworICAgIHMtPmVyY3YgPSBxZW11X2dldF9iZTE2KGYpOworCisgICAgcy0+YmFuayA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcy0+cGFja2V0X251bSA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICBzLT50eF9hbGxvYyA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcy0+YWxsb2NhdGVkID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT50eF9maWZvX2xlbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcWVtdV9nZXRfYnVmZmVyKGYsICh1aW50OF90Kikgcy0+dHhfZmlmbywgc2l6ZW9mKHMtPnR4X2ZpZm8pKTsKKyAgICBzLT5yeF9maWZvX2xlbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcWVtdV9nZXRfYnVmZmVyKGYsICh1aW50OF90Kikgcy0+cnhfZmlmbywgc2l6ZW9mKHMtPnJ4X2ZpZm8pKTsKKyAgICBzLT50eF9maWZvX2RvbmVfbGVuID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgKHVpbnQ4X3QqKSBzLT50eF9maWZvX2RvbmUsIHNpemVvZihzLT50eF9maWZvX2RvbmUpKTsKKworICAgIC8qIFBhY2tldCBidWZmZXIgbWVtb3J5LiAgKi8KKyAgICBxZW11X2dldF9idWZmZXIoZiwgKHVpbnQ4X3QqKSBzLT5kYXRhLCBzaXplb2Yocy0+ZGF0YSkpOworICAgIHMtPmludF9sZXZlbCA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgcy0+aW50X21hc2sgPSBxZW11X2dldF9ieXRlKGYpOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUkNSX1NPRlRfUlNUICAweDgwMDAKKyNkZWZpbmUgUkNSX1NUUklQX0NSQyAweDAyMDAKKyNkZWZpbmUgUkNSX1JYRU4gICAgICAweDAxMDAKKworI2RlZmluZSBUQ1JfRVBIX0xPT1AgIDB4MjAwMAorI2RlZmluZSBUQ1JfTk9DUkMgICAgIDB4MDEwMAorI2RlZmluZSBUQ1JfUEFEX0VOICAgIDB4MDA4MAorI2RlZmluZSBUQ1JfRk9SQ09MICAgIDB4MDAwNAorI2RlZmluZSBUQ1JfTE9PUCAgICAgIDB4MDAwMgorI2RlZmluZSBUQ1JfVFhFTiAgICAgIDB4MDAwMQorCisjZGVmaW5lIElOVF9NRCAgICAgICAgMHg4MAorI2RlZmluZSBJTlRfRVJDViAgICAgIDB4NDAKKyNkZWZpbmUgSU5UX0VQSCAgICAgICAweDIwCisjZGVmaW5lIElOVF9SWF9PVlJOICAgMHgxMAorI2RlZmluZSBJTlRfQUxMT0MgICAgIDB4MDgKKyNkZWZpbmUgSU5UX1RYX0VNUFRZICAweDA0CisjZGVmaW5lIElOVF9UWCAgICAgICAgMHgwMgorI2RlZmluZSBJTlRfUkNWICAgICAgIDB4MDEKKworI2RlZmluZSBDVFJfQVVUT19SRUxFQVNFICAweDA4MDAKKyNkZWZpbmUgQ1RSX1JFTE9BRCAgICAgICAgMHgwMDAyCisjZGVmaW5lIENUUl9TVE9SRSAgICAgICAgIDB4MDAwMQorCisjZGVmaW5lIFJTX0FMR05FUlIgICAgICAweDgwMDAKKyNkZWZpbmUgUlNfQlJPRENBU1QgICAgIDB4NDAwMAorI2RlZmluZSBSU19CQURDUkMgICAgICAgMHgyMDAwCisjZGVmaW5lIFJTX09EREZSQU1FICAgICAweDEwMDAKKyNkZWZpbmUgUlNfVE9PTE9ORyAgICAgIDB4MDgwMAorI2RlZmluZSBSU19UT09TSE9SVCAgICAgMHgwNDAwCisjZGVmaW5lIFJTX01VTFRJQ0FTVCAgICAweDAwMDEKKworLyogVXBkYXRlIGludGVycnVwdCBzdGF0dXMuICAqLworc3RhdGljIHZvaWQgc21jOTFjMTExX3VwZGF0ZShzbWM5MWMxMTFfc3RhdGUgKnMpCit7CisgICAgaW50IGxldmVsOworCisgICAgaWYgKHMtPnR4X2ZpZm9fbGVuID09IDApCisgICAgICAgIHMtPmludF9sZXZlbCB8PSBJTlRfVFhfRU1QVFk7CisgICAgaWYgKHMtPnR4X2ZpZm9fZG9uZV9sZW4gIT0gMCkKKyAgICAgICAgcy0+aW50X2xldmVsIHw9IElOVF9UWDsKKyAgICBsZXZlbCA9IChzLT5pbnRfbGV2ZWwgJiBzLT5pbnRfbWFzaykgIT0gMDsKKyAgICBxZW11X3NldF9pcnEocy0+aXJxLCBsZXZlbCk7Cit9CisKKy8qIFRyeSB0byBhbGxvY2F0ZSBhIHBhY2tldC4gIFJldHVybnMgMHg4MCBvbiBmYWlsdXJlLiAgKi8KK3N0YXRpYyBpbnQgc21jOTFjMTExX2FsbG9jYXRlX3BhY2tldChzbWM5MWMxMTFfc3RhdGUgKnMpCit7CisgICAgaW50IGk7CisgICAgaWYgKHMtPmFsbG9jYXRlZCA9PSAoMSA8PCBOVU1fUEFDS0VUUykgLSAxKSB7CisgICAgICAgIHJldHVybiAweDgwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUEFDS0VUUzsgaSsrKSB7CisgICAgICAgIGlmICgocy0+YWxsb2NhdGVkICYgKDEgPDwgaSkpID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcy0+YWxsb2NhdGVkIHw9IDEgPDwgaTsKKyAgICByZXR1cm4gaTsKK30KKworCisvKiBQcm9jZXNzIGEgcGVuZGluZyBUWCBhbGxvY2F0ZS4gICovCitzdGF0aWMgdm9pZCBzbWM5MWMxMTFfdHhfYWxsb2Moc21jOTFjMTExX3N0YXRlICpzKQoreworICAgIHMtPnR4X2FsbG9jID0gc21jOTFjMTExX2FsbG9jYXRlX3BhY2tldChzKTsKKyAgICBpZiAocy0+dHhfYWxsb2MgPT0gMHg4MCkKKyAgICAgICAgcmV0dXJuOworICAgIHMtPmludF9sZXZlbCB8PSBJTlRfQUxMT0M7CisgICAgc21jOTFjMTExX3VwZGF0ZShzKTsKK30KKworLyogUmVtb3ZlIGFuZCBpdGVtIGZyb20gdGhlIFJYIEZJRk8uICAqLworc3RhdGljIHZvaWQgc21jOTFjMTExX3BvcF9yeF9maWZvKHNtYzkxYzExMV9zdGF0ZSAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIHMtPnJ4X2ZpZm9fbGVuLS07CisgICAgaWYgKHMtPnJ4X2ZpZm9fbGVuKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5yeF9maWZvX2xlbjsgaSsrKQorICAgICAgICAgICAgcy0+cnhfZmlmb1tpXSA9IHMtPnJ4X2ZpZm9baSArIDFdOworICAgICAgICBzLT5pbnRfbGV2ZWwgfD0gSU5UX1JDVjsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5pbnRfbGV2ZWwgJj0gfklOVF9SQ1Y7CisgICAgfQorICAgIHNtYzkxYzExMV91cGRhdGUocyk7Cit9CisKKy8qIFJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIFRYIGNvbXBsZXRpb24gRklGTy4gICovCitzdGF0aWMgdm9pZCBzbWM5MWMxMTFfcG9wX3R4X2ZpZm9fZG9uZShzbWM5MWMxMTFfc3RhdGUgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocy0+dHhfZmlmb19kb25lX2xlbiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgcy0+dHhfZmlmb19kb25lX2xlbi0tOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT50eF9maWZvX2RvbmVfbGVuOyBpKyspCisgICAgICAgIHMtPnR4X2ZpZm9fZG9uZVtpXSA9IHMtPnR4X2ZpZm9fZG9uZVtpICsgMV07Cit9CisKKy8qIFJlbGVhc2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYSBwYWNrZXQuICAqLworc3RhdGljIHZvaWQgc21jOTFjMTExX3JlbGVhc2VfcGFja2V0KHNtYzkxYzExMV9zdGF0ZSAqcywgaW50IHBhY2tldCkKK3sKKyAgICBzLT5hbGxvY2F0ZWQgJj0gfigxIDw8IHBhY2tldCk7CisgICAgaWYgKHMtPnR4X2FsbG9jID09IDB4ODApCisgICAgICAgIHNtYzkxYzExMV90eF9hbGxvYyhzKTsKK30KKworLyogRmx1c2ggdGhlIFRYIEZJRk8uICAqLworc3RhdGljIHZvaWQgc21jOTFjMTExX2RvX3R4KHNtYzkxYzExMV9zdGF0ZSAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbGVuOworICAgIGludCBjb250cm9sOworICAgIGludCBwYWNrZXRudW07CisgICAgdWludDhfdCAqcDsKKworICAgIGlmICgocy0+dGNyICYgVENSX1RYRU4pID09IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAocy0+dHhfZmlmb19sZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT50eF9maWZvX2xlbjsgaSsrKSB7CisgICAgICAgIHBhY2tldG51bSA9IHMtPnR4X2ZpZm9baV07CisgICAgICAgIHAgPSAmcy0+ZGF0YVtwYWNrZXRudW1dWzBdOworICAgICAgICAvKiBTZXQgc3RhdHVzIHdvcmQuICAqLworICAgICAgICAqKHArKykgPSAweDAxOworICAgICAgICAqKHArKykgPSAweDQwOworICAgICAgICBsZW4gPSAqKHArKyk7CisgICAgICAgIGxlbiB8PSAoKGludCkqKHArKykpIDw8IDg7CisgICAgICAgIGxlbiAtPSA2OworICAgICAgICBjb250cm9sID0gcFtsZW4gKyAxXTsKKyAgICAgICAgaWYgKGNvbnRyb2wgJiAweDIwKQorICAgICAgICAgICAgbGVuKys7CisgICAgICAgIC8qID8/PyBUaGlzIG92ZXJ3cml0ZXMgdGhlIGRhdGEgZm9sbG93aW5nIHRoZSBidWZmZXIuCisgICAgICAgICAgIERvbid0IGtub3cgd2hhdCByZWFsIGhhcmR3YXJlIGRvZXMuICAqLworICAgICAgICBpZiAobGVuIDwgNjQgJiYgKHMtPnRjciAmIFRDUl9QQURfRU4pKSB7CisgICAgICAgICAgICBtZW1zZXQocCArIGxlbiwgMCwgNjQgLSBsZW4pOworICAgICAgICAgICAgbGVuID0gNjQ7CisgICAgICAgIH0KKyNpZiAwCisgICAgICAgIC8qIFRoZSBjYXJkIGlzIHN1cHBvc2VkIHRvIGFwcGVuZCB0aGUgQ1JDIHRvIHRoZSBmcmFtZS4gIEhvd2V2ZXIKKyAgICAgICAgICAgbm9uZSBvZiB0aGUgb3RoZXIgbmV0d29yayB0cmFmZmljIGhhcyB0aGUgQ1JDIGFwcGVuZGVkLgorICAgICAgICAgICBTdXNwZWN0IHRoaXMgaXMgbG93IGxldmVsIGV0aGVybmV0IGRldGFpbCB3ZSBkb24ndCBuZWVkIHRvIHdvcnJ5CisgICAgICAgICAgIGFib3V0LiAgKi8KKyAgICAgICAgYWRkX2NyYyA9IChjb250cm9sICYgMHgxMCkgfHwgKHMtPnRjciAmIFRDUl9OT0NSQykgPT0gMDsKKyAgICAgICAgaWYgKGFkZF9jcmMpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGNyYzsKKworICAgICAgICAgICAgY3JjID0gY3JjMzIofjAsIHAsIGxlbik7CisgICAgICAgICAgICBtZW1jcHkocCArIGxlbiwgJmNyYywgNCk7CisgICAgICAgICAgICBsZW4gKz0gNDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChzLT5jdHIgJiBDVFJfQVVUT19SRUxFQVNFKQorICAgICAgICAgICAgLyogUmFjZT8gICovCisgICAgICAgICAgICBzbWM5MWMxMTFfcmVsZWFzZV9wYWNrZXQocywgcGFja2V0bnVtKTsKKyAgICAgICAgZWxzZSBpZiAocy0+dHhfZmlmb19kb25lX2xlbiA8IE5VTV9QQUNLRVRTKQorICAgICAgICAgICAgcy0+dHhfZmlmb19kb25lW3MtPnR4X2ZpZm9fZG9uZV9sZW4rK10gPSBwYWNrZXRudW07CisgICAgICAgIHFlbXVfc2VuZF9wYWNrZXQocy0+dmMsIHAsIGxlbik7CisgICAgfQorICAgIHMtPnR4X2ZpZm9fbGVuID0gMDsKKyAgICBzbWM5MWMxMTFfdXBkYXRlKHMpOworfQorCisvKiBBZGQgYSBwYWNrZXQgdG8gdGhlIFRYIEZJRk8uICAqLworc3RhdGljIHZvaWQgc21jOTFjMTExX3F1ZXVlX3R4KHNtYzkxYzExMV9zdGF0ZSAqcywgaW50IHBhY2tldCkKK3sKKyAgICBpZiAocy0+dHhfZmlmb19sZW4gPT0gTlVNX1BBQ0tFVFMpCisgICAgICAgIHJldHVybjsKKyAgICBzLT50eF9maWZvW3MtPnR4X2ZpZm9fbGVuKytdID0gcGFja2V0OworICAgIHNtYzkxYzExMV9kb190eChzKTsKK30KKworc3RhdGljIHZvaWQgc21jOTFjMTExX3Jlc2V0KHNtYzkxYzExMV9zdGF0ZSAqcykKK3sKKyAgICBzLT5iYW5rID0gMDsKKyAgICBzLT50eF9maWZvX2xlbiA9IDA7CisgICAgcy0+dHhfZmlmb19kb25lX2xlbiA9IDA7CisgICAgcy0+cnhfZmlmb19sZW4gPSAwOworICAgIHMtPmFsbG9jYXRlZCA9IDA7CisgICAgcy0+cGFja2V0X251bSA9IDA7CisgICAgcy0+dHhfYWxsb2MgPSAwOworICAgIHMtPnRjciA9IDA7CisgICAgcy0+cmNyID0gMDsKKyAgICBzLT5jciA9IDB4YTBiMTsKKyAgICBzLT5jdHIgPSAweDEyMTA7CisgICAgcy0+cHRyID0gMDsKKyAgICBzLT5lcmN2ID0gMHgxZjsKKyAgICBzLT5pbnRfbGV2ZWwgPSBJTlRfVFhfRU1QVFk7CisgICAgcy0+aW50X21hc2sgPSAwOworICAgIHNtYzkxYzExMV91cGRhdGUocyk7Cit9CisKKyNkZWZpbmUgU0VUX0xPVyhuYW1lLCB2YWwpIHMtPm5hbWUgPSAocy0+bmFtZSAmIDB4ZmYwMCkgfCB2YWwKKyNkZWZpbmUgU0VUX0hJR0gobmFtZSwgdmFsKSBzLT5uYW1lID0gKHMtPm5hbWUgJiAweGZmKSB8ICh2YWwgPDwgOCkKKworc3RhdGljIHZvaWQgc21jOTFjMTExX3dyaXRlYih2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIHNtYzkxYzExMV9zdGF0ZSAqcyA9IChzbWM5MWMxMTFfc3RhdGUgKilvcGFxdWU7CisKKyAgICBpZiAob2Zmc2V0ID09IDE0KSB7CisgICAgICAgIHMtPmJhbmsgPSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAob2Zmc2V0ID09IDE1KQorICAgICAgICByZXR1cm47CisgICAgc3dpdGNoIChzLT5iYW5rKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6IC8qIFRDUiAqLworICAgICAgICAgICAgU0VUX0xPVyh0Y3IsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgU0VUX0hJR0godGNyLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgNDogLyogUkNSICovCisgICAgICAgICAgICBTRVRfTE9XKHJjciwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBTRVRfSElHSChyY3IsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzLT5yY3IgJiBSQ1JfU09GVF9SU1QpCisgICAgICAgICAgICAgICAgc21jOTFjMTExX3Jlc2V0KHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDEwOiBjYXNlIDExOiAvKiBSUENSICovCisgICAgICAgICAgICAvKiBJZ25vcmVkICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDE6CisgICAgICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgMDogLyogQ09ORklHICovCisgICAgICAgICAgICBTRVRfTE9XKGNyLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIFNFVF9ISUdIKGNyLHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAyOiBjYXNlIDM6IC8qIEJBU0UgKi8KKyAgICAgICAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OiBjYXNlIDg6IGNhc2UgOTogLyogSUEgKi8KKyAgICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMTA6IC8qIEdlbnJhbCBQdXJwb3NlICovCisgICAgICAgICAgICBTRVRfTE9XKGdwciwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgU0VUX0hJR0goZ3ByLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMTI6IC8qIENvbnRyb2wgKi8KKyAgICAgICAgICAgIGlmICh2YWx1ZSAmIDEpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzbWM5MWMxMTE6RUVQUk9NIHN0b3JlIG5vdCBpbXBsZW1lbnRlZFxuIik7CisgICAgICAgICAgICBpZiAodmFsdWUgJiAyKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic21jOTFjMTExOkVFUFJPTSByZWxvYWQgbm90IGltcGxlbWVudGVkXG4iKTsKKyAgICAgICAgICAgIHZhbHVlICY9IH4zOworICAgICAgICAgICAgU0VUX0xPVyhjdHIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICAgIFNFVF9ISUdIKGN0ciwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6IC8qIE1NVSBDb21tYW5kICovCisgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlID4+IDUpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLyogbm8tb3AgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogQWxsb2NhdGUgZm9yIFRYLiAgKi8KKyAgICAgICAgICAgICAgICBzLT50eF9hbGxvYyA9IDB4ODA7CisgICAgICAgICAgICAgICAgcy0+aW50X2xldmVsICY9IH5JTlRfQUxMT0M7CisgICAgICAgICAgICAgICAgc21jOTFjMTExX3VwZGF0ZShzKTsKKyAgICAgICAgICAgICAgICBzbWM5MWMxMTFfdHhfYWxsb2Mocyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIFJlc2V0IE1NVS4gICovCisgICAgICAgICAgICAgICAgcy0+YWxsb2NhdGVkID0gMDsKKyAgICAgICAgICAgICAgICBzLT50eF9maWZvX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgcy0+dHhfZmlmb19kb25lX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgcy0+cnhfZmlmb19sZW4gPSAwOworICAgICAgICAgICAgICAgIHMtPnR4X2FsbG9jID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogUmVtb3ZlIGZyb20gUlggRklGTy4gICovCisgICAgICAgICAgICAgICAgc21jOTFjMTExX3BvcF9yeF9maWZvKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBSZW1vdmUgZnJvbSBSWCBGSUZPIGFuZCByZWxlYXNlLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+cnhfZmlmb19sZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNtYzkxYzExMV9yZWxlYXNlX3BhY2tldChzLCBzLT5yeF9maWZvWzBdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc21jOTFjMTExX3BvcF9yeF9maWZvKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiAvKiBSZWxlYXNlLiAgKi8KKyAgICAgICAgICAgICAgICBzbWM5MWMxMTFfcmVsZWFzZV9wYWNrZXQocywgcy0+cGFja2V0X251bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIEFkZCB0byBUWCBGSUZPLiAgKi8KKyAgICAgICAgICAgICAgICBzbWM5MWMxMTFfcXVldWVfdHgocywgcy0+cGFja2V0X251bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IC8qIFJlc2V0IFRYIEZJRk8uICAqLworICAgICAgICAgICAgICAgIHMtPnR4X2ZpZm9fbGVuID0gMDsKKyAgICAgICAgICAgICAgICBzLT50eF9maWZvX2RvbmVfbGVuID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogSWdub3JlLiAgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAyOiAvKiBQYWNrZXQgTnVtYmVyIFJlZ2lzdGVyICovCisgICAgICAgICAgICBzLT5wYWNrZXRfbnVtID0gdmFsdWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6CisgICAgICAgICAgICAvKiBTaG91bGQgYmUgcmVhZG9ubHksIGJ1dCBsaW51eCB3cml0ZXMgdG8gdGhlbSBhbnl3YXkuIElnbm9yZS4gICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgNjogLyogUG9pbnRlciAqLworICAgICAgICAgICAgU0VUX0xPVyhwdHIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgU0VUX0hJR0gocHRyLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgODogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDExOiAvKiBEYXRhICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHA7CisgICAgICAgICAgICAgICAgaW50IG47CisKKyAgICAgICAgICAgICAgICBpZiAocy0+cHRyICYgMHg4MDAwKQorICAgICAgICAgICAgICAgICAgICBuID0gcy0+cnhfZmlmb1swXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4gPSBzLT5wYWNrZXRfbnVtOworICAgICAgICAgICAgICAgIHAgPSBzLT5wdHIgJiAweDA3ZmY7CisgICAgICAgICAgICAgICAgaWYgKHMtPnB0ciAmIDB4NDAwMCkgeworICAgICAgICAgICAgICAgICAgICBzLT5wdHIgPSAocy0+cHRyICYgMHhmODAwKSB8ICgocy0+cHRyICsgMSkgJiAweDdmZik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcCArPSAob2Zmc2V0ICYgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmRhdGFbbl1bcF0gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxMjogLyogSW50ZXJydXB0IEFDSy4gICovCisgICAgICAgICAgICBzLT5pbnRfbGV2ZWwgJj0gfih2YWx1ZSAmIDB4ZDYpOworICAgICAgICAgICAgaWYgKHZhbHVlICYgSU5UX1RYKQorICAgICAgICAgICAgICAgIHNtYzkxYzExMV9wb3BfdHhfZmlmb19kb25lKHMpOworICAgICAgICAgICAgc21jOTFjMTExX3VwZGF0ZShzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxMzogLyogSW50ZXJydXB0IG1hc2suICAqLworICAgICAgICAgICAgcy0+aW50X21hc2sgPSB2YWx1ZTsKKyAgICAgICAgICAgIHNtYzkxYzExMV91cGRhdGUocyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7OworCisgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzoKKyAgICAgICAgICAgIC8qIE11bHRpY2FzdCB0YWJsZS4gICovCisgICAgICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDg6IGNhc2UgOTogLyogTWFuYWdlbWVudCBJbnRlcmZhY2UuICAqLworICAgICAgICAgICAgLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxMjogLyogRWFybHkgcmVjZWl2ZS4gICovCisgICAgICAgICAgICBzLT5lcmN2ID0gdmFsdWUgJiAweDFmOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgLyogSWdub3JlLiAgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaHdfZXJyb3IoInNtYzkxYzExMV93cml0ZTogQmFkIHJlZyAlZDoleFxuIiwgcy0+YmFuaywgKGludClvZmZzZXQpOworfQorCitzdGF0aWMgdWludDMyX3Qgc21jOTFjMTExX3JlYWRiKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIG9mZnNldCkKK3sKKyAgICBzbWM5MWMxMTFfc3RhdGUgKnMgPSAoc21jOTFjMTExX3N0YXRlICopb3BhcXVlOworCisgICAgaWYgKG9mZnNldCA9PSAxNCkgeworICAgICAgICByZXR1cm4gcy0+YmFuazsKKyAgICB9CisgICAgaWYgKG9mZnNldCA9PSAxNSkKKyAgICAgICAgcmV0dXJuIDB4MzM7CisgICAgc3dpdGNoIChzLT5iYW5rKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6IC8qIFRDUiAqLworICAgICAgICAgICAgcmV0dXJuIHMtPnRjciAmIDB4ZmY7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBzLT50Y3IgPj4gODsKKyAgICAgICAgY2FzZSAyOiAvKiBFUEggU3RhdHVzICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDB4NDA7CisgICAgICAgIGNhc2UgNDogLyogUkNSICovCisgICAgICAgICAgICByZXR1cm4gcy0+cmNyICYgMHhmZjsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgcmV0dXJuIHMtPnJjciA+PiA4OworICAgICAgICBjYXNlIDY6IC8qIENvdW50ZXIgKi8KKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDg6IC8qIE1lbW9yeSBzaXplLiAgKi8KKyAgICAgICAgICAgIHJldHVybiBOVU1fUEFDS0VUUzsKKyAgICAgICAgY2FzZSA5OiAvKiBGcmVlIG1lbW9yeSBhdmFpbGFibGUuICAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUEFDS0VUUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hbGxvY2F0ZWQgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMTA6IGNhc2UgMTE6IC8qIFJQQ1IgKi8KKyAgICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgICAgc3dpdGNoIChvZmZzZXQpIHsKKyAgICAgICAgY2FzZSAwOiAvKiBDT05GSUcgKi8KKyAgICAgICAgICAgIHJldHVybiBzLT5jciAmIDB4ZmY7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBzLT5jciA+PiA4OworICAgICAgICBjYXNlIDI6IGNhc2UgMzogLyogQkFTRSAqLworICAgICAgICAgICAgLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OiBjYXNlIDc6IGNhc2UgODogY2FzZSA5OiAvKiBJQSAqLworICAgICAgICAgICAgcmV0dXJuIHMtPm1hY2FkZHJbb2Zmc2V0IC0gNF07CisgICAgICAgIGNhc2UgMTA6IC8qIEdlbmVyYWwgUHVycG9zZSAqLworICAgICAgICAgICAgcmV0dXJuIHMtPmdwciAmIDB4ZmY7CisgICAgICAgIGNhc2UgMTE6CisgICAgICAgICAgICByZXR1cm4gcy0+Z3ByID4+IDg7CisgICAgICAgIGNhc2UgMTI6IC8qIENvbnRyb2wgKi8KKyAgICAgICAgICAgIHJldHVybiBzLT5jdHIgJiAweGZmOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgcmV0dXJuIHMtPmN0ciA+PiA4OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgICBzd2l0Y2ggKG9mZnNldCkgeworICAgICAgICBjYXNlIDA6IGNhc2UgMTogLyogTU1VQ1IgQnVzeSBiaXQuICAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgMjogLyogUGFja2V0IE51bWJlci4gICovCisgICAgICAgICAgICByZXR1cm4gcy0+cGFja2V0X251bTsKKyAgICAgICAgY2FzZSAzOiAvKiBBbGxvY2F0aW9uIFJlc3VsdC4gICovCisgICAgICAgICAgICByZXR1cm4gcy0+dHhfYWxsb2M7CisgICAgICAgIGNhc2UgNDogLyogVFggRklGTyAqLworICAgICAgICAgICAgaWYgKHMtPnR4X2ZpZm9fZG9uZV9sZW4gPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMHg4MDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gcy0+dHhfZmlmb19kb25lWzBdOworICAgICAgICBjYXNlIDU6IC8qIFJYIEZJRk8gKi8KKyAgICAgICAgICAgIGlmIChzLT5yeF9maWZvX2xlbiA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAweDgwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBzLT5yeF9maWZvWzBdOworICAgICAgICBjYXNlIDY6IC8qIFBvaW50ZXIgKi8KKyAgICAgICAgICAgIHJldHVybiBzLT5wdHIgJiAweGZmOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICByZXR1cm4gKHMtPnB0ciA+PiA4KSAmIDB4Zjc7CisgICAgICAgIGNhc2UgODogY2FzZSA5OiBjYXNlIDEwOiBjYXNlIDExOiAvKiBEYXRhICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHA7CisgICAgICAgICAgICAgICAgaW50IG47CisKKyAgICAgICAgICAgICAgICBpZiAocy0+cHRyICYgMHg4MDAwKQorICAgICAgICAgICAgICAgICAgICBuID0gcy0+cnhfZmlmb1swXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4gPSBzLT5wYWNrZXRfbnVtOworICAgICAgICAgICAgICAgIHAgPSBzLT5wdHIgJiAweDA3ZmY7CisgICAgICAgICAgICAgICAgaWYgKHMtPnB0ciAmIDB4NDAwMCkgeworICAgICAgICAgICAgICAgICAgICBzLT5wdHIgPSAocy0+cHRyICYgMHhmODAwKSB8ICgocy0+cHRyICsgMSkgJiAweDA3ZmYpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gKG9mZnNldCAmIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcy0+ZGF0YVtuXVtwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAxMjogLyogSW50ZXJydXB0IHN0YXR1cy4gICovCisgICAgICAgICAgICByZXR1cm4gcy0+aW50X2xldmVsOworICAgICAgICBjYXNlIDEzOiAvKiBJbnRlcnJ1cHQgbWFzay4gICovCisgICAgICAgICAgICByZXR1cm4gcy0+aW50X21hc2s7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICAgIHN3aXRjaCAob2Zmc2V0KSB7CisgICAgICAgIGNhc2UgMDogY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OgorICAgICAgICAgICAgLyogTXVsdGljYXN0IHRhYmxlLiAgKi8KKyAgICAgICAgICAgIC8qIE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSA4OiAvKiBNYW5hZ2VtZW50IEludGVyZmFjZS4gICovCisgICAgICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICAgICAgcmV0dXJuIDB4MzA7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIHJldHVybiAweDMzOworICAgICAgICBjYXNlIDEwOiAvKiBSZXZpc2lvbi4gICovCisgICAgICAgICAgICByZXR1cm4gMHg5MTsKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIHJldHVybiAweDMzOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgcmV0dXJuIHMtPmVyY3Y7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaHdfZXJyb3IoInNtYzkxYzExMV9yZWFkOiBCYWQgcmVnICVkOiV4XG4iLCBzLT5iYW5rLCAoaW50KW9mZnNldCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNtYzkxYzExMV93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBzbWM5MWMxMTFfd3JpdGViKG9wYXF1ZSwgb2Zmc2V0LCB2YWx1ZSAmIDB4ZmYpOworICAgIHNtYzkxYzExMV93cml0ZWIob3BhcXVlLCBvZmZzZXQgKyAxLCB2YWx1ZSA+PiA4KTsKK30KKworc3RhdGljIHZvaWQgc21jOTFjMTExX3dyaXRlbCh2b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIC8qIDMyLWJpdCB3cml0ZXMgdG8gb2Zmc2V0IDB4YyBvbmx5IGFjdHVhbGx5IHdyaXRlIHRvIHRoZSBiYW5rIHNlbGVjdAorICAgICAgIHJlZ2lzdGVyIChvZmZzZXQgMHhlKSAgKi8KKyAgICBpZiAob2Zmc2V0ICE9IDB4YykKKyAgICAgICAgc21jOTFjMTExX3dyaXRldyhvcGFxdWUsIG9mZnNldCwgdmFsdWUgJiAweGZmZmYpOworICAgIHNtYzkxYzExMV93cml0ZXcob3BhcXVlLCBvZmZzZXQgKyAyLCB2YWx1ZSA+PiAxNik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzbWM5MWMxMTFfcmVhZHcodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHVpbnQzMl90IHZhbDsKKyAgICB2YWwgPSBzbWM5MWMxMTFfcmVhZGIob3BhcXVlLCBvZmZzZXQpOworICAgIHZhbCB8PSBzbWM5MWMxMTFfcmVhZGIob3BhcXVlLCBvZmZzZXQgKyAxKSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzbWM5MWMxMTFfcmVhZGwodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0KQoreworICAgIHVpbnQzMl90IHZhbDsKKyAgICB2YWwgPSBzbWM5MWMxMTFfcmVhZHcob3BhcXVlLCBvZmZzZXQpOworICAgIHZhbCB8PSBzbWM5MWMxMTFfcmVhZHcob3BhcXVlLCBvZmZzZXQgKyAyKSA8PCAxNjsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNtYzkxYzExMV9jYW5fcmVjZWl2ZShWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIHNtYzkxYzExMV9zdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBpZiAoKHMtPnJjciAmIFJDUl9SWEVOKSA9PSAwIHx8IChzLT5yY3IgJiBSQ1JfU09GVF9SU1QpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAocy0+YWxsb2NhdGVkID09ICgxIDw8IE5VTV9QQUNLRVRTKSAtIDEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3NpemVfdCBzbWM5MWMxMTFfcmVjZWl2ZShWTEFOQ2xpZW50U3RhdGUgKnZjLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworICAgIHNtYzkxYzExMV9zdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgcGFja2V0c2l6ZTsKKyAgICB1aW50MzJfdCBjcmM7CisgICAgaW50IHBhY2tldG51bTsKKyAgICB1aW50OF90ICpwOworCisgICAgaWYgKChzLT5yY3IgJiBSQ1JfUlhFTikgPT0gMCB8fCAocy0+cmNyICYgUkNSX1NPRlRfUlNUKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIFNob3J0IHBhY2tldHMgYXJlIHBhZGRlZCB3aXRoIHplcm9zLiAgUmVjZWl2aW5nIGEgcGFja2V0CisgICAgICAgPCA2NCBieXRlcyBsb25nIGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KKyAgICBpZiAoc2l6ZSA8IDY0KQorICAgICAgICBwYWNrZXRzaXplID0gNjQ7CisgICAgZWxzZQorICAgICAgICBwYWNrZXRzaXplID0gKHNpemUgJiB+MSk7CisgICAgcGFja2V0c2l6ZSArPSA2OworICAgIGNyYyA9IChzLT5yY3IgJiBSQ1JfU1RSSVBfQ1JDKSA9PSAwOworICAgIGlmIChjcmMpCisgICAgICAgIHBhY2tldHNpemUgKz0gNDsKKyAgICAvKiBUT0RPOiBGbGFnIG92ZXJydW4gYW5kIHJlY2VpdmUgZXJyb3JzLiAgKi8KKyAgICBpZiAocGFja2V0c2l6ZSA+IDIwNDgpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwYWNrZXRudW0gPSBzbWM5MWMxMTFfYWxsb2NhdGVfcGFja2V0KHMpOworICAgIGlmIChwYWNrZXRudW0gPT0gMHg4MCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHMtPnJ4X2ZpZm9bcy0+cnhfZmlmb19sZW4rK10gPSBwYWNrZXRudW07CisKKyAgICBwID0gJnMtPmRhdGFbcGFja2V0bnVtXVswXTsKKyAgICAvKiA/Pz8gTXVsdGljYXN0IHBhY2tldHM/ICAqLworICAgIHN0YXR1cyA9IDA7CisgICAgaWYgKHNpemUgPiAxNTE4KQorICAgICAgICBzdGF0dXMgfD0gUlNfVE9PTE9ORzsKKyAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgIHN0YXR1cyB8PSBSU19PRERGUkFNRTsKKyAgICAqKHArKykgPSBzdGF0dXMgJiAweGZmOworICAgICoocCsrKSA9IHN0YXR1cyA+PiA4OworICAgICoocCsrKSA9IHBhY2tldHNpemUgJiAweGZmOworICAgICoocCsrKSA9IHBhY2tldHNpemUgPj4gODsKKyAgICBtZW1jcHkocCwgYnVmLCBzaXplICYgfjEpOworICAgIHAgKz0gKHNpemUgJiB+MSk7CisgICAgLyogUGFkIHNob3J0IHBhY2tldHMuICAqLworICAgIGlmIChzaXplIDwgNjQpIHsKKyAgICAgICAgaW50IHBhZDsKKworICAgICAgICBpZiAoc2l6ZSAmIDEpCisgICAgICAgICAgICAqKHArKykgPSBidWZbc2l6ZSAtIDFdOworICAgICAgICBwYWQgPSA2NCAtIHNpemU7CisgICAgICAgIG1lbXNldChwLCAwLCBwYWQpOworICAgICAgICBwICs9IHBhZDsKKyAgICAgICAgc2l6ZSA9IDY0OworICAgIH0KKyAgICAvKiBJdCdzIG5vdCBjbGVhciBpZiB0aGUgQ1JDIHNob3VsZCBnbyBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGxhc3QgYnl0ZSBpbgorICAgICAgIG9kZCBzaXplZCBwYWNrZXRzLiAgTGludXggZGlzYWJsZXMgdGhlIENSQywgc28gdGhhdCdzIG5vIGhlbHAuCisgICAgICAgVGhlIHBpY3R1cmVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHNob3cgdGhlIENSQyBhbGlnbmVkIG9uIGEgMTYtYml0CisgICAgICAgYm91bmRhcnkgYmVmb3JlIHRoZSBsYXN0IG9kZCBieXRlLCBzbyB0aGF0J3Mgd2hhdCB3ZSBkby4gICovCisgICAgaWYgKGNyYykgeworICAgICAgICBjcmMgPSBjcmMzMih+MCwgYnVmLCBzaXplKTsKKyAgICAgICAgKihwKyspID0gY3JjICYgMHhmZjsgY3JjID4+PSA4OworICAgICAgICAqKHArKykgPSBjcmMgJiAweGZmOyBjcmMgPj49IDg7CisgICAgICAgICoocCsrKSA9IGNyYyAmIDB4ZmY7IGNyYyA+Pj0gODsKKyAgICAgICAgKihwKyspID0gY3JjICYgMHhmZjsgY3JjID4+PSA4OworICAgIH0KKyAgICBpZiAoc2l6ZSAmIDEpIHsKKyAgICAgICAgKihwKyspID0gYnVmW3NpemUgLSAxXTsKKyAgICAgICAgKihwKyspID0gMHg2MDsKKyAgICB9IGVsc2UgeworICAgICAgICAqKHArKykgPSAwOworICAgICAgICAqKHArKykgPSAweDQwOworICAgIH0KKyAgICAvKiBUT0RPOiBSYWlzZSBlYXJseSBSWCBpbnRlcnJ1cHQ/ICAqLworICAgIHMtPmludF9sZXZlbCB8PSBJTlRfUkNWOworICAgIHNtYzkxYzExMV91cGRhdGUocyk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpzbWM5MWMxMTFfcmVhZGZuW10gPSB7CisgICAgc21jOTFjMTExX3JlYWRiLAorICAgIHNtYzkxYzExMV9yZWFkdywKKyAgICBzbWM5MWMxMTFfcmVhZGwKK307CisKK3N0YXRpYyBDUFVXcml0ZU1lbW9yeUZ1bmMgKnNtYzkxYzExMV93cml0ZWZuW10gPSB7CisgICAgc21jOTFjMTExX3dyaXRlYiwKKyAgICBzbWM5MWMxMTFfd3JpdGV3LAorICAgIHNtYzkxYzExMV93cml0ZWwKK307CisKK3N0YXRpYyB2b2lkIHNtYzkxYzExMV9jbGVhbnVwKFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgc21jOTFjMTExX3N0YXRlICpzID0gdmMtPm9wYXF1ZTsKKworICAgIGNwdV91bnJlZ2lzdGVyX2lvX21lbW9yeShzLT5tbWlvX2luZGV4KTsKKyAgICBnX2ZyZWUocyk7Cit9CisKK3N0YXRpYyB2b2lkIHNtYzkxYzExMV9pbml0MShTeXNCdXNEZXZpY2UgKmRldikKK3sKKyAgICBzbWM5MWMxMTFfc3RhdGUgKnMgPSBGUk9NX1NZU0JVUyhzbWM5MWMxMTFfc3RhdGUsIGRldik7CisKKyAgICBzLT5tbWlvX2luZGV4ID0gY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShzbWM5MWMxMTFfcmVhZGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYzkxYzExMV93cml0ZWZuLCBzKTsKKyAgICBzeXNidXNfaW5pdF9tbWlvKGRldiwgMTYsIHMtPm1taW9faW5kZXgpOworICAgIHN5c2J1c19pbml0X2lycShkZXYsICZzLT5pcnEpOworICAgIHFkZXZfZ2V0X21hY2FkZHIoJmRldi0+cWRldiwgcy0+bWFjYWRkcik7CisKKyAgICBzbWM5MWMxMTFfcmVzZXQocyk7CisKKyAgICBzLT52YyA9IHFkZXZfZ2V0X3ZsYW5fY2xpZW50KCZkZXYtPnFkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWM5MWMxMTFfY2FuX3JlY2VpdmUsIHNtYzkxYzExMV9yZWNlaXZlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jOTFjMTExX2NsZWFudXAsIHMpOworICAgIHFlbXVfZm9ybWF0X25pY19pbmZvX3N0cihzLT52Yywgcy0+bWFjYWRkcik7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwgInNtYzkxYzExMSIsIDAsIFNNQzkxQzExMV9TQVZFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIHNtYzkxYzExMV9zYXZlLCBzbWM5MWMxMTFfbG9hZCwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNtYzkxYzExMV9yZWdpc3Rlcl9kZXZpY2VzKHZvaWQpCit7CisgICAgc3lzYnVzX3JlZ2lzdGVyX2Rldigic21jOTFjMTExIiwgc2l6ZW9mKHNtYzkxYzExMV9zdGF0ZSksIHNtYzkxYzExMV9pbml0MSk7Cit9CisKKy8qIExlZ2FjeSBoZWxwZXIgZnVuY3Rpb24uICBTaG91bGQgZ28gYXdheSB3aGVuIG1hY2hpbmUgY29uZmlnIGZpbGVzIGFyZQorICAgaW1wbGVtZW50ZWQuICAqLwordm9pZCBzbWM5MWMxMTFfaW5pdChOSUNJbmZvICpuZCwgdWludDMyX3QgYmFzZSwgcWVtdV9pcnEgaXJxKQoreworICAgIERldmljZVN0YXRlICpkZXY7CisgICAgU3lzQnVzRGV2aWNlICpzOworCisgICAgcWVtdV9jaGVja19uaWNfbW9kZWwobmQsICJzbWM5MWMxMTEiKTsKKyAgICBkZXYgPSBxZGV2X2NyZWF0ZShOVUxMLCAic21jOTFjMTExIik7CisgICAgcWRldl9zZXRfbmV0ZGV2KGRldiwgbmQpOworICAgIHFkZXZfaW5pdChkZXYpOworICAgIHMgPSBzeXNidXNfZnJvbV9xZGV2KGRldik7CisgICAgc3lzYnVzX21taW9fbWFwKHMsIDAsIGJhc2UpOworICAgIHN5c2J1c19jb25uZWN0X2lycShzLCAwLCBpcnEpOworfQorCitkZXZpY2VfaW5pdChzbWM5MWMxMTFfcmVnaXN0ZXJfZGV2aWNlcykKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvbnZyYW0vZndfY2ZnLmMgYi9hbmRyb2lkL3FlbXUxL2h3L252cmFtL2Z3X2NmZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTI5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L252cmFtL2Z3X2NmZy5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogUUVNVSBGaXJtd2FyZSBjb25maWd1cmF0aW9uIGRldmljZSBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggR2xlYiBOYXRhcG92CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAiaHcvaXNhL2lzYS5oIgorI2luY2x1ZGUgImh3L252cmFtL2Z3X2NmZy5oIgorCisvKiBkZWJ1ZyBmaXJtd2FyZSBjb25maWcgKi8KKy8vI2RlZmluZSBERUJVR19GV19DRkcKKworI2lmZGVmIERFQlVHX0ZXX0NGRworI2RlZmluZSBGV19DRkdfRFBSSU5URihmbXQsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyBwcmludGYoIkZXX0NGRzogIiBmbXQgLCAjIyBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBGV19DRkdfRFBSSU5URihmbXQsIC4uLikKKyNlbmRpZgorCisjZGVmaW5lIEZXX0NGR19TSVpFIDIKKwordHlwZWRlZiBzdHJ1Y3QgX0ZXQ2ZnRW50cnkgeworICAgIHVpbnQxNl90IGxlbjsKKyAgICB1aW50OF90ICpkYXRhOworICAgIHZvaWQgKmNhbGxiYWNrX29wYXF1ZTsKKyAgICBGV0NmZ0NhbGxiYWNrIGNhbGxiYWNrOworfSBGV0NmZ0VudHJ5OworCitzdHJ1Y3QgRldDZmdTdGF0ZSB7CisgICAgRldDZmdFbnRyeSBlbnRyaWVzWzJdW0ZXX0NGR19NQVhfRU5UUlldOworICAgIHVpbnQxNl90IGN1cl9lbnRyeTsKKyAgICB1aW50MTZfdCBjdXJfb2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgZndfY2ZnX3dyaXRlKEZXQ2ZnU3RhdGUgKnMsIHVpbnQ4X3QgdmFsdWUpCit7CisgICAgaW50IGFyY2ggPSAhIShzLT5jdXJfZW50cnkgJiBGV19DRkdfQVJDSF9MT0NBTCk7CisgICAgRldDZmdFbnRyeSAqZSA9ICZzLT5lbnRyaWVzW2FyY2hdW3MtPmN1cl9lbnRyeSAmIEZXX0NGR19FTlRSWV9NQVNLXTsKKworICAgIEZXX0NGR19EUFJJTlRGKCJ3cml0ZSAlZFxuIiwgdmFsdWUpOworCisgICAgaWYgKHMtPmN1cl9lbnRyeSAmIEZXX0NGR19XUklURV9DSEFOTkVMICYmIHMtPmN1cl9vZmZzZXQgPCBlLT5sZW4pIHsKKyAgICAgICAgZS0+ZGF0YVtzLT5jdXJfb2Zmc2V0KytdID0gdmFsdWU7CisgICAgICAgIGlmIChzLT5jdXJfb2Zmc2V0ID09IGUtPmxlbikgeworICAgICAgICAgICAgZS0+Y2FsbGJhY2soZS0+Y2FsbGJhY2tfb3BhcXVlLCBlLT5kYXRhKTsKKyAgICAgICAgICAgIHMtPmN1cl9vZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZ3X2NmZ19zZWxlY3QoRldDZmdTdGF0ZSAqcywgdWludDE2X3Qga2V5KQoreworICAgIGludCByZXQ7CisKKyAgICBzLT5jdXJfb2Zmc2V0ID0gMDsKKyAgICBpZiAoKGtleSAmIEZXX0NGR19FTlRSWV9NQVNLKSA+PSBGV19DRkdfTUFYX0VOVFJZKSB7CisgICAgICAgIHMtPmN1cl9lbnRyeSA9IEZXX0NGR19JTlZBTElEOworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmN1cl9lbnRyeSA9IGtleTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisKKyAgICBGV19DRkdfRFBSSU5URigic2VsZWN0IGtleSAlZCAoJXNmb3VuZClcbiIsIGtleSwgcmV0ID8gIiIgOiAibm90ICIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQ4X3QgZndfY2ZnX3JlYWQoRldDZmdTdGF0ZSAqcykKK3sKKyAgICBpbnQgYXJjaCA9ICEhKHMtPmN1cl9lbnRyeSAmIEZXX0NGR19BUkNIX0xPQ0FMKTsKKyAgICBGV0NmZ0VudHJ5ICplID0gJnMtPmVudHJpZXNbYXJjaF1bcy0+Y3VyX2VudHJ5ICYgRldfQ0ZHX0VOVFJZX01BU0tdOworICAgIHVpbnQ4X3QgcmV0OworCisgICAgaWYgKHMtPmN1cl9lbnRyeSA9PSBGV19DRkdfSU5WQUxJRCB8fCAhZS0+ZGF0YSB8fCBzLT5jdXJfb2Zmc2V0ID49IGUtPmxlbikKKyAgICAgICAgcmV0ID0gMDsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGUtPmRhdGFbcy0+Y3VyX29mZnNldCsrXTsKKworICAgIEZXX0NGR19EUFJJTlRGKCJyZWFkICVkXG4iLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVpbnQzMl90IGZ3X2NmZ19pb19yZWFkYih2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIpCit7CisgICAgcmV0dXJuIGZ3X2NmZ19yZWFkKG9wYXF1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2NmZ19pb193cml0ZWIodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBmd19jZmdfd3JpdGUob3BhcXVlLCAodWludDhfdCl2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2NmZ19pb193cml0ZXcodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBmd19jZmdfc2VsZWN0KG9wYXF1ZSwgKHVpbnQxNl90KXZhbHVlKTsKK30KKworc3RhdGljIHVpbnQzMl90IGZ3X2NmZ19tZW1fcmVhZGIodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcikKK3sKKyAgICByZXR1cm4gZndfY2ZnX3JlYWQob3BhcXVlKTsKK30KKworc3RhdGljIHZvaWQgZndfY2ZnX21lbV93cml0ZWIodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZ3X2NmZ193cml0ZShvcGFxdWUsICh1aW50OF90KXZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgZndfY2ZnX21lbV93cml0ZXcodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQoreworICAgIGZ3X2NmZ19zZWxlY3Qob3BhcXVlLCAodWludDE2X3QpdmFsdWUpOworfQorCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmZ3X2NmZ19jdGxfbWVtX3JlYWRbM10gPSB7CisgICAgTlVMTCwKKyAgICBOVUxMLAorICAgIE5VTEwsCit9OworCitzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpmd19jZmdfY3RsX21lbV93cml0ZVszXSA9IHsKKyAgICBOVUxMLAorICAgIGZ3X2NmZ19tZW1fd3JpdGV3LAorICAgIE5VTEwsCit9OworCitzdGF0aWMgQ1BVUmVhZE1lbW9yeUZ1bmMgKmZ3X2NmZ19kYXRhX21lbV9yZWFkWzNdID0geworICAgIGZ3X2NmZ19tZW1fcmVhZGIsCisgICAgTlVMTCwKKyAgICBOVUxMLAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqZndfY2ZnX2RhdGFfbWVtX3dyaXRlWzNdID0geworICAgIGZ3X2NmZ19tZW1fd3JpdGViLAorICAgIE5VTEwsCisgICAgTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIGZ3X2NmZ19yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgRldDZmdTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIGZ3X2NmZ19zZWxlY3QocywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ3X2NmZ19zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgRldDZmdTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHFlbXVfcHV0X2JlMTZzKGYsICZzLT5jdXJfZW50cnkpOworICAgIHFlbXVfcHV0X2JlMTZzKGYsICZzLT5jdXJfb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBmd19jZmdfbG9hZChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBGV0NmZ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgPiAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHFlbXVfZ2V0X2JlMTZzKGYsICZzLT5jdXJfZW50cnkpOworICAgIHFlbXVfZ2V0X2JlMTZzKGYsICZzLT5jdXJfb2Zmc2V0KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZndfY2ZnX2FkZF9ieXRlcyh2b2lkICpvcGFxdWUsIHVpbnQxNl90IGtleSwgdWludDhfdCAqZGF0YSwgdWludDE2X3QgbGVuKQoreworICAgIEZXQ2ZnU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IGFyY2ggPSAhIShrZXkgJiBGV19DRkdfQVJDSF9MT0NBTCk7CisKKyAgICBrZXkgJj0gRldfQ0ZHX0VOVFJZX01BU0s7CisKKyAgICBpZiAoa2V5ID49IEZXX0NGR19NQVhfRU5UUlkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcy0+ZW50cmllc1thcmNoXVtrZXldLmRhdGEgPSBkYXRhOworICAgIHMtPmVudHJpZXNbYXJjaF1ba2V5XS5sZW4gPSBsZW47CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZ3X2NmZ19hZGRfaTE2KHZvaWQgKm9wYXF1ZSwgdWludDE2X3Qga2V5LCB1aW50MTZfdCB2YWx1ZSkKK3sKKyAgICB1aW50MTZfdCAqY29weTsKKworICAgIGNvcHkgPSBnX21hbGxvYyhzaXplb2YodmFsdWUpKTsKKyAgICAqY29weSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKyAgICByZXR1cm4gZndfY2ZnX2FkZF9ieXRlcyhvcGFxdWUsIGtleSwgKHVpbnQ4X3QgKiljb3B5LCBzaXplb2YodmFsdWUpKTsKK30KKworaW50IGZ3X2NmZ19hZGRfaTMyKHZvaWQgKm9wYXF1ZSwgdWludDE2X3Qga2V5LCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1aW50MzJfdCAqY29weTsKKworICAgIGNvcHkgPSBnX21hbGxvYyhzaXplb2YodmFsdWUpKTsKKyAgICAqY29weSA9IGNwdV90b19sZTMyKHZhbHVlKTsKKyAgICByZXR1cm4gZndfY2ZnX2FkZF9ieXRlcyhvcGFxdWUsIGtleSwgKHVpbnQ4X3QgKiljb3B5LCBzaXplb2YodmFsdWUpKTsKK30KKworaW50IGZ3X2NmZ19hZGRfaTY0KHZvaWQgKm9wYXF1ZSwgdWludDE2X3Qga2V5LCB1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICB1aW50NjRfdCAqY29weTsKKworICAgIGNvcHkgPSBnX21hbGxvYyhzaXplb2YodmFsdWUpKTsKKyAgICAqY29weSA9IGNwdV90b19sZTY0KHZhbHVlKTsKKyAgICByZXR1cm4gZndfY2ZnX2FkZF9ieXRlcyhvcGFxdWUsIGtleSwgKHVpbnQ4X3QgKiljb3B5LCBzaXplb2YodmFsdWUpKTsKK30KKworaW50IGZ3X2NmZ19hZGRfY2FsbGJhY2sodm9pZCAqb3BhcXVlLCB1aW50MTZfdCBrZXksIEZXQ2ZnQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja19vcGFxdWUsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgRldDZmdTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgYXJjaCA9ICEhKGtleSAmIEZXX0NGR19BUkNIX0xPQ0FMKTsKKworICAgIGlmICghKGtleSAmIEZXX0NGR19XUklURV9DSEFOTkVMKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBrZXkgJj0gRldfQ0ZHX0VOVFJZX01BU0s7CisKKyAgICBpZiAoa2V5ID49IEZXX0NGR19NQVhfRU5UUlkgfHwgbGVuID4gNjU1MzUpCisgICAgICAgIHJldHVybiAwOworCisgICAgcy0+ZW50cmllc1thcmNoXVtrZXldLmRhdGEgPSBkYXRhOworICAgIHMtPmVudHJpZXNbYXJjaF1ba2V5XS5sZW4gPSBsZW47CisgICAgcy0+ZW50cmllc1thcmNoXVtrZXldLmNhbGxiYWNrX29wYXF1ZSA9IGNhbGxiYWNrX29wYXF1ZTsKKyAgICBzLT5lbnRyaWVzW2FyY2hdW2tleV0uY2FsbGJhY2sgPSBjYWxsYmFjazsKKworICAgIHJldHVybiAxOworfQorCit2b2lkICpmd19jZmdfaW5pdCh1aW50MzJfdCBjdGxfcG9ydCwgdWludDMyX3QgZGF0YV9wb3J0LAorCQlod2FkZHIgY3RsX2FkZHIsIGh3YWRkciBkYXRhX2FkZHIpCit7CisgICAgRldDZmdTdGF0ZSAqczsKKyAgICBpbnQgaW9fY3RsX21lbW9yeSwgaW9fZGF0YV9tZW1vcnk7CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihGV0NmZ1N0YXRlKSk7CisKKyAgICBpZiAoY3RsX3BvcnQpIHsKKyAgICAgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGN0bF9wb3J0LCAyLCAyLCBmd19jZmdfaW9fd3JpdGV3LCBzKTsKKyAgICB9CisgICAgaWYgKGRhdGFfcG9ydCkgeworICAgICAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChkYXRhX3BvcnQsIDEsIDEsIGZ3X2NmZ19pb19yZWFkYiwgcyk7CisgICAgICAgIHJlZ2lzdGVyX2lvcG9ydF93cml0ZShkYXRhX3BvcnQsIDEsIDEsIGZ3X2NmZ19pb193cml0ZWIsIHMpOworICAgIH0KKyAgICBpZiAoY3RsX2FkZHIpIHsKKyAgICAgICAgaW9fY3RsX21lbW9yeSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZndfY2ZnX2N0bF9tZW1fcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmd19jZmdfY3RsX21lbV93cml0ZSwgcyk7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoY3RsX2FkZHIsIEZXX0NGR19TSVpFLCBpb19jdGxfbWVtb3J5KTsKKyAgICB9CisgICAgaWYgKGRhdGFfYWRkcikgeworICAgICAgICBpb19kYXRhX21lbW9yeSA9IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoZndfY2ZnX2RhdGFfbWVtX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndfY2ZnX2RhdGFfbWVtX3dyaXRlLCBzKTsKKyAgICAgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShkYXRhX2FkZHIsIEZXX0NGR19TSVpFLCBpb19kYXRhX21lbW9yeSk7CisgICAgfQorICAgIGZ3X2NmZ19hZGRfYnl0ZXMocywgRldfQ0ZHX1NJR05BVFVSRSwgKHVpbnQ4X3QgKikiUUVNVSIsIDQpOworICAgIGZ3X2NmZ19hZGRfYnl0ZXMocywgRldfQ0ZHX1VVSUQsIHFlbXVfdXVpZCwgMTYpOworICAgIGZ3X2NmZ19hZGRfaTE2KHMsIEZXX0NGR19OT0dSQVBISUMsICh1aW50MTZfdCkoZGlzcGxheV90eXBlID09IERUX05PR1JBUEhJQykpOworICAgIGZ3X2NmZ19hZGRfaTE2KHMsIEZXX0NGR19OQl9DUFVTLCAodWludDE2X3Qpc21wX2NwdXMpOworCisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJmd19jZmciLCAtMSwgMSwgZndfY2ZnX3NhdmUsIGZ3X2NmZ19sb2FkLCBzKTsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KGZ3X2NmZ19yZXNldCwgMCwgcyk7CisgICAgZndfY2ZnX3Jlc2V0KHMpOworCisgICAgcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L3BjaS1ob3N0L3BjaV9ob3N0LmggYi9hbmRyb2lkL3FlbXUxL2h3L3BjaS1ob3N0L3BjaV9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZTAxZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvcGNpLWhvc3QvcGNpX2hvc3QuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIFFFTVUgQ29tbW9uIFBDSSBIb3N0IGJyaWRnZSBjb25maWd1cmF0aW9uIGRhdGEgc3BhY2UgYWNjZXNzIHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyogV29ya2VyIHJvdXRpbmVzIGZvciBhIFBDSSBob3N0IGNvbnRyb2xsZXIgdGhhdCB1c2VzIGFuIHthZGRyZXNzLGRhdGF9CisgICByZWdpc3RlciBwYWlyIHRvIGFjY2VzcyBQQ0kgY29uZmlndXJhdGlvbiBzcGFjZS4gICovCisKKy8qIGRlYnVnIFBDSSAqLworLy8jZGVmaW5lIERFQlVHX1BDSQorCisjaWZkZWYgREVCVUdfUENJCisjZGVmaW5lIFBDSV9EUFJJTlRGKGZtdCwgLi4uKSBcCitkbyB7IHByaW50ZigicGNpX2hvc3RfZGF0YTogIiBmbXQgLCAjIyBfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBQQ0lfRFBSSU5URihmbXQsIC4uLikKKyNlbmRpZgorc3RydWN0IFBDSUhvc3RTdGF0ZSB7CisgICAgdWludDMyX3QgY29uZmlnX3JlZzsKKyAgICBQQ0lCdXMgKmJ1czsKK307CisKK3N0YXRpYyB2b2lkIHBjaV9ob3N0X2RhdGFfd3JpdGViKHZvaWQqIG9wYXF1ZSwgcGNpX2FkZHJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgUENJSG9zdFN0YXRlICpzID0gb3BhcXVlOworCisgICAgUENJX0RQUklOVEYoIndyaXRlYiBhZGRyICIgVEFSR0VUX0ZNVF9wbHggIiB2YWwgJXhcbiIsCisgICAgICAgICAgICAgICAgKGh3YWRkcilhZGRyLCB2YWwpOworICAgIGlmIChzLT5jb25maWdfcmVnICYgKDF1IDw8IDMxKSkKKyAgICAgICAgcGNpX2RhdGFfd3JpdGUocy0+YnVzLCBzLT5jb25maWdfcmVnIHwgKGFkZHIgJiAzKSwgdmFsLCAxKTsKK30KKworc3RhdGljIHZvaWQgcGNpX2hvc3RfZGF0YV93cml0ZXcodm9pZCogb3BhcXVlLCBwY2lfYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBQQ0lIb3N0U3RhdGUgKnMgPSBvcGFxdWU7CisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHZhbCA9IGJzd2FwMTYodmFsKTsKKyNlbmRpZgorICAgIFBDSV9EUFJJTlRGKCJ3cml0ZXcgYWRkciAiIFRBUkdFVF9GTVRfcGx4ICIgdmFsICV4XG4iLAorICAgICAgICAgICAgICAgIChod2FkZHIpYWRkciwgdmFsKTsKKyAgICBpZiAocy0+Y29uZmlnX3JlZyAmICgxdSA8PCAzMSkpCisgICAgICAgIHBjaV9kYXRhX3dyaXRlKHMtPmJ1cywgcy0+Y29uZmlnX3JlZyB8IChhZGRyICYgMyksIHZhbCwgMik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9ob3N0X2RhdGFfd3JpdGVsKHZvaWQqIG9wYXF1ZSwgcGNpX2FkZHJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgUENJSG9zdFN0YXRlICpzID0gb3BhcXVlOworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICB2YWwgPSBic3dhcDMyKHZhbCk7CisjZW5kaWYKKyAgICBQQ0lfRFBSSU5URigid3JpdGVsIGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAleFxuIiwKKyAgICAgICAgICAgICAgICAoaHdhZGRyKWFkZHIsIHZhbCk7CisgICAgaWYgKHMtPmNvbmZpZ19yZWcgJiAoMXUgPDwgMzEpKQorICAgICAgICBwY2lfZGF0YV93cml0ZShzLT5idXMsIHMtPmNvbmZpZ19yZWcsIHZhbCwgNCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBwY2lfaG9zdF9kYXRhX3JlYWRiKHZvaWQqIG9wYXF1ZSwgcGNpX2FkZHJfdCBhZGRyKQoreworICAgIFBDSUhvc3RTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICBpZiAoIShzLT5jb25maWdfcmVnICYgKDEgPDwgMzEpKSkKKyAgICAgICAgcmV0dXJuIDB4ZmY7CisgICAgdmFsID0gcGNpX2RhdGFfcmVhZChzLT5idXMsIHMtPmNvbmZpZ19yZWcgfCAoYWRkciAmIDMpLCAxKTsKKyAgICBQQ0lfRFBSSU5URigicmVhZGIgYWRkciAiIFRBUkdFVF9GTVRfcGx4ICIgdmFsICV4XG4iLAorICAgICAgICAgICAgICAgIChod2FkZHIpYWRkciwgdmFsKTsKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdWludDMyX3QgcGNpX2hvc3RfZGF0YV9yZWFkdyh2b2lkKiBvcGFxdWUsIHBjaV9hZGRyX3QgYWRkcikKK3sKKyAgICBQQ0lIb3N0U3RhdGUgKnMgPSBvcGFxdWU7CisgICAgdWludDMyX3QgdmFsOworICAgIGlmICghKHMtPmNvbmZpZ19yZWcgJiAoMSA8PCAzMSkpKQorICAgICAgICByZXR1cm4gMHhmZmZmOworICAgIHZhbCA9IHBjaV9kYXRhX3JlYWQocy0+YnVzLCBzLT5jb25maWdfcmVnIHwgKGFkZHIgJiAzKSwgMik7CisgICAgUENJX0RQUklOVEYoInJlYWR3IGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAleFxuIiwKKyAgICAgICAgICAgICAgICAoaHdhZGRyKWFkZHIsIHZhbCk7CisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHZhbCA9IGJzd2FwMTYodmFsKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBwY2lfaG9zdF9kYXRhX3JlYWRsKHZvaWQqIG9wYXF1ZSwgcGNpX2FkZHJfdCBhZGRyKQoreworICAgIFBDSUhvc3RTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgaWYgKCEocy0+Y29uZmlnX3JlZyAmICgxIDw8IDMxKSkpCisgICAgICAgIHJldHVybiAweGZmZmZmZmZmOworICAgIHZhbCA9IHBjaV9kYXRhX3JlYWQocy0+YnVzLCBzLT5jb25maWdfcmVnIHwgKGFkZHIgJiAzKSwgNCk7CisgICAgUENJX0RQUklOVEYoInJlYWRsIGFkZHIgIiBUQVJHRVRfRk1UX3BseCAiIHZhbCAleFxuIiwKKyAgICAgICAgICAgICAgICAoaHdhZGRyKWFkZHIsIHZhbCk7CisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHZhbCA9IGJzd2FwMzIodmFsKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L3BjaS1ob3N0L3BpaXguYyBiL2FuZHJvaWQvcWVtdTEvaHcvcGNpLWhvc3QvcGlpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTY5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L3BjaS1ob3N0L3BpaXguYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIFFFTVUgaTQ0MEZYL1BJSVgzIFBDSSBCcmlkZ2UgRW11bGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAiaHcvcGNpL3BjaS5oIgorCit0eXBlZGVmIHVpbnQzMl90IHBjaV9hZGRyX3Q7CisjaW5jbHVkZSAicGNpX2hvc3QuaCIKKwordHlwZWRlZiBQQ0lIb3N0U3RhdGUgSTQ0MEZYU3RhdGU7CisKK3N0YXRpYyB2b2lkIGk0NDBmeF9hZGRyX3dyaXRlbCh2b2lkKiBvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBJNDQwRlhTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBzLT5jb25maWdfcmVnID0gdmFsOworfQorCitzdGF0aWMgdWludDMyX3QgaTQ0MGZ4X2FkZHJfcmVhZGwodm9pZCogb3BhcXVlLCB1aW50MzJfdCBhZGRyKQoreworICAgIEk0NDBGWFN0YXRlICpzID0gb3BhcXVlOworICAgIHJldHVybiBzLT5jb25maWdfcmVnOworfQorCitzdGF0aWMgdm9pZCBwaWl4M19zZXRfaXJxKHFlbXVfaXJxICpwaWMsIGludCBpcnFfbnVtLCBpbnQgbGV2ZWwpOworCisvKiByZXR1cm4gdGhlIGdsb2JhbCBpcnEgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBkZXZpY2UgaXJxCisgICBwaW4uIFdlIGNvdWxkIGFsc28gdXNlIHRoZSBidXMgbnVtYmVyIHRvIGhhdmUgYSBtb3JlIHByZWNpc2UKKyAgIG1hcHBpbmcuICovCitzdGF0aWMgaW50IHBjaV9zbG90X2dldF9waXJxKFBDSURldmljZSAqcGNpX2RldiwgaW50IGlycV9udW0pCit7CisgICAgaW50IHNsb3RfYWRkZW5kOworICAgIHNsb3RfYWRkZW5kID0gKHBjaV9kZXYtPmRldmZuID4+IDMpIC0gMTsKKyAgICByZXR1cm4gKGlycV9udW0gKyBzbG90X2FkZGVuZCkgJiAzOworfQorCitzdGF0aWMgaHdhZGRyIGlzYV9wYWdlX2Rlc2NzWzM4NCAvIDRdOworc3RhdGljIHVpbnQ4X3Qgc21tX2VuYWJsZWQ7CitzdGF0aWMgaW50IHBjaV9pcnFfbGV2ZWxzWzRdOworCitzdGF0aWMgdm9pZCB1cGRhdGVfcGFtKFBDSURldmljZSAqZCwgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCwgaW50IHIpCit7CisgICAgdWludDMyX3QgYWRkcjsKKworICAgIC8vICAgIHByaW50ZigiSVNBIG1hcHBpbmcgJTA4eC0weCUwOHg6ICVkXG4iLCBzdGFydCwgZW5kLCByKTsKKyAgICBzd2l0Y2gocikgeworICAgIGNhc2UgMzoKKyAgICAgICAgLyogUkFNICovCisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICAvKiBST00gKFhYWDogbm90IHF1aXRlIGNvcnJlY3QpICovCisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHwgSU9fTUVNX1JPTSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICBjYXNlIDA6CisgICAgICAgIC8qIFhYWDogc2hvdWxkIGRpc3Rpbmd1aXNoIHJlYWQvd3JpdGUgY2FzZXMgKi8KKyAgICAgICAgZm9yKGFkZHIgPSBzdGFydDsgYWRkciA8IGVuZDsgYWRkciArPSA0MDk2KSB7CisgICAgICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGFkZHIsIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYV9wYWdlX2Rlc2NzWyhhZGRyIC0gMHhhMDAwMCkgPj4gMTJdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGk0NDBmeF91cGRhdGVfbWVtb3J5X21hcHBpbmdzKFBDSURldmljZSAqZCkKK3sKKyAgICBpbnQgaSwgcjsKKyAgICB1aW50MzJfdCBzbXJhbSwgYWRkcjsKKworICAgIHVwZGF0ZV9wYW0oZCwgMHhmMDAwMCwgMHgxMDAwMDAsIChkLT5jb25maWdbMHg1OV0gPj4gNCkgJiAzKTsKKyAgICBmb3IoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIHIgPSAoZC0+Y29uZmlnWyhpID4+IDEpICsgMHg1YV0gPj4gKChpICYgMSkgKiA0KSkgJiAzOworICAgICAgICB1cGRhdGVfcGFtKGQsIDB4YzAwMDAgKyAweDQwMDAgKiBpLCAweGMwMDAwICsgMHg0MDAwICogKGkgKyAxKSwgcik7CisgICAgfQorICAgIHNtcmFtID0gZC0+Y29uZmlnWzB4NzJdOworICAgIGlmICgoc21tX2VuYWJsZWQgJiYgKHNtcmFtICYgMHgwOCkpIHx8IChzbXJhbSAmIDB4NDApKSB7CisgICAgICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoMHhhMDAwMCwgMHgyMDAwMCwgMHhhMDAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGFkZHIgPSAweGEwMDAwOyBhZGRyIDwgMHhjMDAwMDsgYWRkciArPSA0MDk2KSB7CisgICAgICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KGFkZHIsIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYV9wYWdlX2Rlc2NzWyhhZGRyIC0gMHhhMDAwMCkgPj4gMTJdKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBpNDQwZnhfc2V0X3NtbShQQ0lEZXZpY2UgKmQsIGludCB2YWwpCit7CisgICAgdmFsID0gKHZhbCAhPSAwKTsKKyAgICBpZiAoc21tX2VuYWJsZWQgIT0gdmFsKSB7CisgICAgICAgIHNtbV9lbmFibGVkID0gdmFsOworICAgICAgICBpNDQwZnhfdXBkYXRlX21lbW9yeV9tYXBwaW5ncyhkKTsKKyAgICB9Cit9CisKKworLyogWFhYOiBzdXBwcmVzcyB3aGVuIGJldHRlciBtZW1vcnkgQVBJLiBXZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQKKyAgIG5vIGRldmljZSAoaW4gcGFydGljdWxhciB0aGUgVkdBKSBjaGFuZ2VzIHRoZSBtZW1vcnkgbWFwcGluZ3MgaW4KKyAgIHRoZSAweGEwMDAwLTB4MTAwMDAwIHJhbmdlICovCit2b2lkIGk0NDBmeF9pbml0X21lbW9yeV9tYXBwaW5ncyhQQ0lEZXZpY2UgKmQpCit7CisgICAgaW50IGk7CisgICAgZm9yKGkgPSAwOyBpIDwgOTY7IGkrKykgeworICAgICAgICBpc2FfcGFnZV9kZXNjc1tpXSA9IGNwdV9nZXRfcGh5c2ljYWxfcGFnZV9kZXNjKDB4YTAwMDAgKyBpICogMHgxMDAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGk0NDBmeF93cml0ZV9jb25maWcoUENJRGV2aWNlICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWwsIGludCBsZW4pCit7CisgICAgLyogWFhYOiBpbXBsZW1lbnQgU01SQU0uRF9MT0NLICovCisgICAgcGNpX2RlZmF1bHRfd3JpdGVfY29uZmlnKGQsIGFkZHJlc3MsIHZhbCwgbGVuKTsKKyAgICBpZiAoKGFkZHJlc3MgPj0gMHg1OSAmJiBhZGRyZXNzIDw9IDB4NWYpIHx8IGFkZHJlc3MgPT0gMHg3MikKKyAgICAgICAgaTQ0MGZ4X3VwZGF0ZV9tZW1vcnlfbWFwcGluZ3MoZCk7Cit9CisKK3N0YXRpYyB2b2lkIGk0NDBmeF9zYXZlKFFFTVVGaWxlKiBmLCB2b2lkICpvcGFxdWUpCit7CisgICAgUENJRGV2aWNlICpkID0gb3BhcXVlOworICAgIGludCBpOworCisgICAgcGNpX2RldmljZV9zYXZlKGQsIGYpOworICAgIHFlbXVfcHV0XzhzKGYsICZzbW1fZW5hYmxlZCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHBjaV9pcnFfbGV2ZWxzW2ldKTsKK30KKworc3RhdGljIGludCBpNDQwZnhfbG9hZChRRU1VRmlsZSogZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBQQ0lEZXZpY2UgKmQgPSBvcGFxdWU7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmICh2ZXJzaW9uX2lkID4gMikKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgcmV0ID0gcGNpX2RldmljZV9sb2FkKGQsIGYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGk0NDBmeF91cGRhdGVfbWVtb3J5X21hcHBpbmdzKGQpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzbW1fZW5hYmxlZCk7CisKKyAgICBpZiAodmVyc2lvbl9pZCA+PSAyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgcGNpX2lycV9sZXZlbHNbaV0gPSBxZW11X2dldF9iZTMyKGYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK1BDSUJ1cyAqaTQ0MGZ4X2luaXQoUENJRGV2aWNlICoqcGk0NDBmeF9zdGF0ZSwgcWVtdV9pcnEgKnBpYykKK3sKKyAgICBQQ0lCdXMgKmI7CisgICAgUENJRGV2aWNlICpkOworICAgIEk0NDBGWFN0YXRlICpzOworCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoSTQ0MEZYU3RhdGUpKTsKKyAgICBiID0gcGNpX3JlZ2lzdGVyX2J1cyhOVUxMLCAicGNpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaWl4M19zZXRfaXJxLCBwY2lfc2xvdF9nZXRfcGlycSwgcGljLCAwLCA0KTsKKyAgICBzLT5idXMgPSBiOworCisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKDB4Y2Y4LCA0LCA0LCBpNDQwZnhfYWRkcl93cml0ZWwsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKDB4Y2Y4LCA0LCA0LCBpNDQwZnhfYWRkcl9yZWFkbCwgcyk7CisKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHhjZmMsIDQsIDEsIHBjaV9ob3N0X2RhdGFfd3JpdGViLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHhjZmMsIDQsIDIsIHBjaV9ob3N0X2RhdGFfd3JpdGV3LCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfd3JpdGUoMHhjZmMsIDQsIDQsIHBjaV9ob3N0X2RhdGFfd3JpdGVsLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZCgweGNmYywgNCwgMSwgcGNpX2hvc3RfZGF0YV9yZWFkYiwgcyk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoMHhjZmMsIDQsIDIsIHBjaV9ob3N0X2RhdGFfcmVhZHcsIHMpOworICAgIHJlZ2lzdGVyX2lvcG9ydF9yZWFkKDB4Y2ZjLCA0LCA0LCBwY2lfaG9zdF9kYXRhX3JlYWRsLCBzKTsKKworICAgIGQgPSBwY2lfcmVnaXN0ZXJfZGV2aWNlKGIsICJpNDQwRlgiLCBzaXplb2YoUENJRGV2aWNlKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBpNDQwZnhfd3JpdGVfY29uZmlnKTsKKworICAgIHBjaV9jb25maWdfc2V0X3ZlbmRvcl9pZChkLT5jb25maWcsIFBDSV9WRU5ET1JfSURfSU5URUwpOworICAgIHBjaV9jb25maWdfc2V0X2RldmljZV9pZChkLT5jb25maWcsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDEpOworICAgIGQtPmNvbmZpZ1sweDA4XSA9IDB4MDI7IC8vIHJldmlzaW9uCisgICAgcGNpX2NvbmZpZ19zZXRfY2xhc3MoZC0+Y29uZmlnLCBQQ0lfQ0xBU1NfQlJJREdFX0hPU1QpOworICAgIGQtPmNvbmZpZ1tQQ0lfSEVBREVSX1RZUEVdID0gUENJX0hFQURFUl9UWVBFX05PUk1BTDsgLy8gaGVhZGVyX3R5cGUKKworICAgIGQtPmNvbmZpZ1sweDcyXSA9IDB4MDI7IC8qIFNNUkFNICovCisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwgIkk0NDBGWCIsIDAsIDIsIGk0NDBmeF9zYXZlLCBpNDQwZnhfbG9hZCwgZCk7CisgICAgKnBpNDQwZnhfc3RhdGUgPSBkOworICAgIHJldHVybiBiOworfQorCisvKiBQSUlYMyBQQ0kgdG8gSVNBIGJyaWRnZSAqLworCitzdGF0aWMgUENJRGV2aWNlICpwaWl4M19kZXY7CitQQ0lEZXZpY2UgKnBpaXg0X2RldjsKKworc3RhdGljIHZvaWQgcGlpeDNfc2V0X2lycShxZW11X2lycSAqcGljLCBpbnQgaXJxX251bSwgaW50IGxldmVsKQoreworICAgIGludCBpLCBwaWNfaXJxLCBwaWNfbGV2ZWw7CisKKyAgICBwY2lfaXJxX2xldmVsc1tpcnFfbnVtXSA9IGxldmVsOworCisgICAgLyogbm93IHdlIGNoYW5nZSB0aGUgcGljIGlycSBsZXZlbCBhY2NvcmRpbmcgdG8gdGhlIHBpaXggaXJxIG1hcHBpbmdzICovCisgICAgLyogWFhYOiBvcHRpbWl6ZSAqLworICAgIHBpY19pcnEgPSBwaWl4M19kZXYtPmNvbmZpZ1sweDYwICsgaXJxX251bV07CisgICAgaWYgKHBpY19pcnEgPCAxNikgeworICAgICAgICAvKiBUaGUgcGljIGxldmVsIGlzIHRoZSBsb2dpY2FsIE9SIG9mIGFsbCB0aGUgUENJIGlycXMgbWFwcGVkCisgICAgICAgICAgIHRvIGl0ICovCisgICAgICAgIHBpY19sZXZlbCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaWNfaXJxID09IHBpaXgzX2Rldi0+Y29uZmlnWzB4NjAgKyBpXSkKKyAgICAgICAgICAgICAgICBwaWNfbGV2ZWwgfD0gcGNpX2lycV9sZXZlbHNbaV07CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9zZXRfaXJxKHBpY1twaWNfaXJxXSwgcGljX2xldmVsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBpaXgzX3Jlc2V0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQQ0lEZXZpY2UgKmQgPSBvcGFxdWU7CisgICAgdWludDhfdCAqcGNpX2NvbmYgPSBkLT5jb25maWc7CisKKyAgICBwY2lfY29uZlsweDA0XSA9IDB4MDc7IC8vIG1hc3RlciwgbWVtb3J5IGFuZCBJL08KKyAgICBwY2lfY29uZlsweDA1XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHgwNl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4MDddID0gMHgwMjsgLy8gUENJX3N0YXR1c19kZXZzZWxfbWVkaXVtCisgICAgcGNpX2NvbmZbMHg0Y10gPSAweDRkOworICAgIHBjaV9jb25mWzB4NGVdID0gMHgwMzsKKyAgICBwY2lfY29uZlsweDRmXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHg2MF0gPSAweDgwOworICAgIHBjaV9jb25mWzB4NjFdID0gMHg4MDsKKyAgICBwY2lfY29uZlsweDYyXSA9IDB4ODA7CisgICAgcGNpX2NvbmZbMHg2M10gPSAweDgwOworICAgIHBjaV9jb25mWzB4NjldID0gMHgwMjsKKyAgICBwY2lfY29uZlsweDcwXSA9IDB4ODA7CisgICAgcGNpX2NvbmZbMHg3Nl0gPSAweDBjOworICAgIHBjaV9jb25mWzB4NzddID0gMHgwYzsKKyAgICBwY2lfY29uZlsweDc4XSA9IDB4MDI7CisgICAgcGNpX2NvbmZbMHg3OV0gPSAweDAwOworICAgIHBjaV9jb25mWzB4ODBdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweDgyXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhMF0gPSAweDA4OworICAgIHBjaV9jb25mWzB4YTJdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGEzXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhNF0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTVdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGE2XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhN10gPSAweDAwOworICAgIHBjaV9jb25mWzB4YThdID0gMHgwZjsKKyAgICBwY2lfY29uZlsweGFhXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhYl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YWNdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGFlXSA9IDB4MDA7CisKKyAgICBtZW1zZXQocGNpX2lycV9sZXZlbHMsIDAsIHNpemVvZihwY2lfaXJxX2xldmVscykpOworfQorCitzdGF0aWMgdm9pZCBwaWl4NF9yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgUENJRGV2aWNlICpkID0gb3BhcXVlOworICAgIHVpbnQ4X3QgKnBjaV9jb25mID0gZC0+Y29uZmlnOworCisgICAgcGNpX2NvbmZbMHgwNF0gPSAweDA3OyAvLyBtYXN0ZXIsIG1lbW9yeSBhbmQgSS9PCisgICAgcGNpX2NvbmZbMHgwNV0gPSAweDAwOworICAgIHBjaV9jb25mWzB4MDZdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweDA3XSA9IDB4MDI7IC8vIFBDSV9zdGF0dXNfZGV2c2VsX21lZGl1bQorICAgIHBjaV9jb25mWzB4NGNdID0gMHg0ZDsKKyAgICBwY2lfY29uZlsweDRlXSA9IDB4MDM7CisgICAgcGNpX2NvbmZbMHg0Zl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4NjBdID0gMHgwYTsgLy8gUENJIEEgLT4gSVJRIDEwCisgICAgcGNpX2NvbmZbMHg2MV0gPSAweDBhOyAvLyBQQ0kgQiAtPiBJUlEgMTAKKyAgICBwY2lfY29uZlsweDYyXSA9IDB4MGI7IC8vIFBDSSBDIC0+IElSUSAxMQorICAgIHBjaV9jb25mWzB4NjNdID0gMHgwYjsgLy8gUENJIEQgLT4gSVJRIDExCisgICAgcGNpX2NvbmZbMHg2OV0gPSAweDAyOworICAgIHBjaV9jb25mWzB4NzBdID0gMHg4MDsKKyAgICBwY2lfY29uZlsweDc2XSA9IDB4MGM7CisgICAgcGNpX2NvbmZbMHg3N10gPSAweDBjOworICAgIHBjaV9jb25mWzB4NzhdID0gMHgwMjsKKyAgICBwY2lfY29uZlsweDc5XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHg4MF0gPSAweDAwOworICAgIHBjaV9jb25mWzB4ODJdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGEwXSA9IDB4MDg7CisgICAgcGNpX2NvbmZbMHhhMl0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTNdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGE0XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhNV0gPSAweDAwOworICAgIHBjaV9jb25mWzB4YTZdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGE3XSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhOF0gPSAweDBmOworICAgIHBjaV9jb25mWzB4YWFdID0gMHgwMDsKKyAgICBwY2lfY29uZlsweGFiXSA9IDB4MDA7CisgICAgcGNpX2NvbmZbMHhhY10gPSAweDAwOworICAgIHBjaV9jb25mWzB4YWVdID0gMHgwMDsKKworICAgIG1lbXNldChwY2lfaXJxX2xldmVscywgMCwgc2l6ZW9mKHBjaV9pcnFfbGV2ZWxzKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBpaXhfc2F2ZShRRU1VRmlsZSogZiwgdm9pZCAqb3BhcXVlKQoreworICAgIFBDSURldmljZSAqZCA9IG9wYXF1ZTsKKyAgICBwY2lfZGV2aWNlX3NhdmUoZCwgZik7Cit9CisKK3N0YXRpYyBpbnQgcGlpeF9sb2FkKFFFTVVGaWxlKiBmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFBDSURldmljZSAqZCA9IG9wYXF1ZTsKKyAgICBpZiAodmVyc2lvbl9pZCAhPSAyKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICByZXR1cm4gcGNpX2RldmljZV9sb2FkKGQsIGYpOworfQorCitpbnQgcGlpeDNfaW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuKQoreworICAgIFBDSURldmljZSAqZDsKKyAgICB1aW50OF90ICpwY2lfY29uZjsKKworICAgIGQgPSBwY2lfcmVnaXN0ZXJfZGV2aWNlKGJ1cywgIlBJSVgzIiwgc2l6ZW9mKFBDSURldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZmbiwgTlVMTCwgTlVMTCk7CisgICAgcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJQSUlYMyIsIDAsIDIsIHBpaXhfc2F2ZSwgcGlpeF9sb2FkLCBkKTsKKworICAgIHBpaXgzX2RldiA9IGQ7CisgICAgcGNpX2NvbmYgPSBkLT5jb25maWc7CisKKyAgICBwY2lfY29uZmlnX3NldF92ZW5kb3JfaWQocGNpX2NvbmYsIFBDSV9WRU5ET1JfSURfSU5URUwpOworICAgIHBjaV9jb25maWdfc2V0X2RldmljZV9pZChwY2lfY29uZiwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzApOyAvLyA4MjM3MVNCIFBJSVgzIFBDSS10by1JU0EgYnJpZGdlIChTdGVwIEExKQorICAgIHBjaV9jb25maWdfc2V0X2NsYXNzKHBjaV9jb25mLCBQQ0lfQ0xBU1NfQlJJREdFX0lTQSk7CisgICAgcGNpX2NvbmZbUENJX0hFQURFUl9UWVBFXSA9CisgICAgICAgIFBDSV9IRUFERVJfVFlQRV9OT1JNQUwgfCBQQ0lfSEVBREVSX1RZUEVfTVVMVElfRlVOQ1RJT047IC8vIGhlYWRlcl90eXBlID0gUENJX211bHRpZnVuY3Rpb24sIGdlbmVyaWMKKworICAgIHBpaXgzX3Jlc2V0KGQpOworICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQocGlpeDNfcmVzZXQsIDAsIGQpOworICAgIHJldHVybiBkLT5kZXZmbjsKK30KKworaW50IHBpaXg0X2luaXQoUENJQnVzICpidXMsIGludCBkZXZmbikKK3sKKyAgICBQQ0lEZXZpY2UgKmQ7CisgICAgdWludDhfdCAqcGNpX2NvbmY7CisKKyAgICBkID0gcGNpX3JlZ2lzdGVyX2RldmljZShidXMsICJQSUlYNCIsIHNpemVvZihQQ0lEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2Zm4sIE5VTEwsIE5VTEwpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAiUElJWDQiLCAwLCAyLCBwaWl4X3NhdmUsIHBpaXhfbG9hZCwgZCk7CisKKyAgICBwaWl4NF9kZXYgPSBkOworICAgIHBjaV9jb25mID0gZC0+Y29uZmlnOworCisgICAgcGNpX2NvbmZpZ19zZXRfdmVuZG9yX2lkKHBjaV9jb25mLCBQQ0lfVkVORE9SX0lEX0lOVEVMKTsKKyAgICBwY2lfY29uZmlnX3NldF9kZXZpY2VfaWQocGNpX2NvbmYsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8wKTsgLy8gODIzNzFBQi9FQi9NQiBQSUlYNCBQQ0ktdG8tSVNBIGJyaWRnZQorICAgIHBjaV9jb25maWdfc2V0X2NsYXNzKHBjaV9jb25mLCBQQ0lfQ0xBU1NfQlJJREdFX0lTQSk7CisgICAgcGNpX2NvbmZbUENJX0hFQURFUl9UWVBFXSA9CisgICAgICAgIFBDSV9IRUFERVJfVFlQRV9OT1JNQUwgfCBQQ0lfSEVBREVSX1RZUEVfTVVMVElfRlVOQ1RJT047IC8vIGhlYWRlcl90eXBlID0gUENJX211bHRpZnVuY3Rpb24sIGdlbmVyaWMKKworCisgICAgcGlpeDRfcmVzZXQoZCk7CisgICAgcWVtdV9yZWdpc3Rlcl9yZXNldChwaWl4NF9yZXNldCwgMCwgZCk7CisgICAgcmV0dXJuIGQtPmRldmZuOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody9wY2kvcGNpLmMgYi9hbmRyb2lkL3FlbXUxL2h3L3BjaS9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFiMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody9wY2kvcGNpLmMKQEAgLTAsMCArMSw5NTIgQEAKKy8qCisgKiBRRU1VIFBDSSBidXMgbWFuYWdlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L3BjaS9wY2kuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisvLyNkZWZpbmUgREVCVUdfUENJCisKK3N0cnVjdCBQQ0lCdXMgeworICAgIEJ1c1N0YXRlIHFidXM7CisgICAgaW50IGJ1c19udW07CisgICAgaW50IGRldmZuX21pbjsKKyAgICBwY2lfc2V0X2lycV9mbiBzZXRfaXJxOworICAgIHBjaV9tYXBfaXJxX2ZuIG1hcF9pcnE7CisgICAgdWludDMyX3QgY29uZmlnX3JlZzsgLyogWFhYOiBzdXBwcmVzcyAqLworICAgIC8qIGxvdyBsZXZlbCBwaWMgKi8KKyAgICBTZXRJUlFGdW5jICpsb3dfc2V0X2lycTsKKyAgICBxZW11X2lycSAqaXJxX29wYXF1ZTsKKyAgICBQQ0lEZXZpY2UgKmRldmljZXNbMjU2XTsKKyAgICBQQ0lEZXZpY2UgKnBhcmVudF9kZXY7CisgICAgUENJQnVzICpuZXh0OworICAgIC8qIFRoZSBidXMgSVJRIHN0YXRlIGlzIHRoZSBsb2dpY2FsIE9SIG9mIHRoZSBjb25uZWN0ZWQgZGV2aWNlcy4KKyAgICAgICBLZWVwIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBkZXZpY2VzIHdpdGggcmFpc2VkIElSUXMuICAqLworICAgIGludCBuaXJxOworICAgIGludCBpcnFfY291bnRbXTsKK307CisKK3N0YXRpYyB2b2lkIHBjaV91cGRhdGVfbWFwcGluZ3MoUENJRGV2aWNlICpkKTsKK3N0YXRpYyB2b2lkIHBjaV9zZXRfaXJxKHZvaWQgKm9wYXF1ZSwgaW50IGlycV9udW0sIGludCBsZXZlbCk7CisKK2h3YWRkciBwY2lfbWVtX2Jhc2U7CitzdGF0aWMgdWludDE2X3QgcGNpX2RlZmF1bHRfc3ViX3ZlbmRvcl9pZCA9IFBDSV9TVUJWRU5ET1JfSURfUkVESEFUX1FVTVJBTkVUOworc3RhdGljIHVpbnQxNl90IHBjaV9kZWZhdWx0X3N1Yl9kZXZpY2VfaWQgPSBQQ0lfU1VCREVWSUNFX0lEX1FFTVU7CitzdGF0aWMgUENJQnVzICpmaXJzdF9idXM7CisKK3N0YXRpYyB2b2lkIHBjaWJ1c19zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgUENJQnVzICpidXMgPSAoUENJQnVzICopb3BhcXVlOworICAgIGludCBpOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBidXMtPm5pcnEpOworICAgIGZvciAoaSA9IDA7IGkgPCBidXMtPm5pcnE7IGkrKykKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBidXMtPmlycV9jb3VudFtpXSk7Cit9CisKK3N0YXRpYyBpbnQgIHBjaWJ1c19sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFBDSUJ1cyAqYnVzID0gKFBDSUJ1cyAqKW9wYXF1ZTsKKyAgICBpbnQgaSwgbmlycTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbmlycSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgaWYgKGJ1cy0+bmlycSAhPSBuaXJxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicGNpYnVzX2xvYWQ6IG5pcnEgbWlzbWF0Y2g6IHNyYz0lZCBkc3Q9JWRcbiIsCisgICAgICAgICAgICAgICAgbmlycSwgYnVzLT5uaXJxKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5pcnE7IGkrKykKKyAgICAgICAgYnVzLT5pcnFfY291bnRbaV0gPSBxZW11X2dldF9iZTMyKGYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK1BDSUJ1cyAqcGNpX3JlZ2lzdGVyX2J1cyhEZXZpY2VTdGF0ZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9zZXRfaXJxX2ZuIHNldF9pcnEsIHBjaV9tYXBfaXJxX2ZuIG1hcF9pcnEsCisgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9pcnEgKnBpYywgaW50IGRldmZuX21pbiwgaW50IG5pcnEpCit7CisgICAgUENJQnVzICpidXM7CisgICAgc3RhdGljIGludCBuYnVzID0gMDsKKworICAgIGJ1cyA9IEZST01fUUJVUyhQQ0lCdXMsIHFidXNfY3JlYXRlKEJVU19UWVBFX1BDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUENJQnVzKSArIChuaXJxICogc2l6ZW9mKGludCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCwgbmFtZSkpOworICAgIGJ1cy0+c2V0X2lycSA9IHNldF9pcnE7CisgICAgYnVzLT5tYXBfaXJxID0gbWFwX2lycTsKKyAgICBidXMtPmlycV9vcGFxdWUgPSBwaWM7CisgICAgYnVzLT5kZXZmbl9taW4gPSBkZXZmbl9taW47CisgICAgYnVzLT5uaXJxID0gbmlycTsKKyAgICBidXMtPm5leHQgPSBmaXJzdF9idXM7CisgICAgZmlyc3RfYnVzID0gYnVzOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAiUENJQlVTIiwgbmJ1cysrLCAxLCBwY2lidXNfc2F2ZSwgcGNpYnVzX2xvYWQsIGJ1cyk7CisgICAgcmV0dXJuIGJ1czsKK30KKworc3RhdGljIFBDSUJ1cyAqcGNpX3JlZ2lzdGVyX3NlY29uZGFyeV9idXMoUENJRGV2aWNlICpkZXYsIHBjaV9tYXBfaXJxX2ZuIG1hcF9pcnEpCit7CisgICAgUENJQnVzICpidXM7CisgICAgYnVzID0gZ19tYWxsb2MwKHNpemVvZihQQ0lCdXMpKTsKKyAgICBidXMtPm1hcF9pcnEgPSBtYXBfaXJxOworICAgIGJ1cy0+cGFyZW50X2RldiA9IGRldjsKKyAgICBidXMtPm5leHQgPSBkZXYtPmJ1cy0+bmV4dDsKKyAgICBkZXYtPmJ1cy0+bmV4dCA9IGJ1czsKKyAgICByZXR1cm4gYnVzOworfQorCitpbnQgcGNpX2J1c19udW0oUENJQnVzICpzKQoreworICAgIHJldHVybiBzLT5idXNfbnVtOworfQorCit2b2lkIHBjaV9kZXZpY2Vfc2F2ZShQQ0lEZXZpY2UgKnMsIFFFTVVGaWxlICpmKQoreworICAgIGludCBpOworCisgICAgcWVtdV9wdXRfYmUzMihmLCAyKTsgLyogUENJIGRldmljZSB2ZXJzaW9uICovCisgICAgcWVtdV9wdXRfYnVmZmVyKGYsIHMtPmNvbmZpZywgMjU2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmlycV9zdGF0ZVtpXSk7Cit9CisKK2ludCBwY2lfZGV2aWNlX2xvYWQoUENJRGV2aWNlICpzLCBRRU1VRmlsZSAqZikKK3sKKyAgICB1aW50MzJfdCB2ZXJzaW9uX2lkOworICAgIGludCBpOworCisgICAgdmVyc2lvbl9pZCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgaWYgKHZlcnNpb25faWQgPiAyKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgcy0+Y29uZmlnLCAyNTYpOworICAgIHBjaV91cGRhdGVfbWFwcGluZ3Mocyk7CisKKyAgICBpZiAodmVyc2lvbl9pZCA+PSAyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArKykKKyAgICAgICAgICAgIHMtPmlycV9zdGF0ZVtpXSA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2lfc2V0X2RlZmF1bHRfc3Vic3lzdGVtX2lkKFBDSURldmljZSAqcGNpX2RldikKK3sKKyAgICB1aW50MTZfdCAqaWQ7CisKKyAgICBpZCA9ICh2b2lkKikoJnBjaV9kZXYtPmNvbmZpZ1tQQ0lfU1VCVkVORE9SX0lEXSk7CisgICAgaWRbMF0gPSBjcHVfdG9fbGUxNihwY2lfZGVmYXVsdF9zdWJfdmVuZG9yX2lkKTsKKyAgICBpZFsxXSA9IGNwdV90b19sZTE2KHBjaV9kZWZhdWx0X3N1Yl9kZXZpY2VfaWQpOworICAgIHJldHVybiAwOworfQorCisvKgorICogUGFyc2UgW1s8ZG9tYWluPjpdPGJ1cz46XTxzbG90PiwgcmV0dXJuIC0xIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgcGNpX3BhcnNlX2RldmFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50ICpkb21wLCBpbnQgKmJ1c3AsIHVuc2lnbmVkICpzbG90cCkKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgKmU7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBkb20gPSAwLCBidXMgPSAwOworICAgIHVuc2lnbmVkIHNsb3QgPSAwOworCisgICAgcCA9IGFkZHI7CisgICAgdmFsID0gc3RydG91bChwLCAmZSwgMTYpOworICAgIGlmIChlID09IHApCisJcmV0dXJuIC0xOworICAgIGlmICgqZSA9PSAnOicpIHsKKwlidXMgPSB2YWw7CisJcCA9IGUgKyAxOworCXZhbCA9IHN0cnRvdWwocCwgJmUsIDE2KTsKKwlpZiAoZSA9PSBwKQorCSAgICByZXR1cm4gLTE7CisJaWYgKCplID09ICc6JykgeworCSAgICBkb20gPSBidXM7CisJICAgIGJ1cyA9IHZhbDsKKwkgICAgcCA9IGUgKyAxOworCSAgICB2YWwgPSBzdHJ0b3VsKHAsICZlLCAxNik7CisJICAgIGlmIChlID09IHApCisJCXJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgaWYgKGRvbSA+IDB4ZmZmZiB8fCBidXMgPiAweGZmIHx8IHZhbCA+IDB4MWYpCisJcmV0dXJuIC0xOworCisgICAgc2xvdCA9IHZhbDsKKworICAgIGlmICgqZSkKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBOb3RlOiBRRU1VIGRvZXNuJ3QgaW1wbGVtZW50IGRvbWFpbnMgb3RoZXIgdGhhbiAwICovCisgICAgaWYgKGRvbSAhPSAwIHx8IHBjaV9maW5kX2J1cyhidXMpID09IE5VTEwpCisJcmV0dXJuIC0xOworCisgICAgKmRvbXAgPSBkb207CisgICAgKmJ1c3AgPSBidXM7CisgICAgKnNsb3RwID0gc2xvdDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHBjaV9yZWFkX2RldmFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50ICpkb21wLCBpbnQgKmJ1c3AsIHVuc2lnbmVkICpzbG90cCkKK3sKKyAgICBjaGFyIGRldmFkZHJbMzJdOworCisgICAgaWYgKCFnZXRfcGFyYW1fdmFsdWUoZGV2YWRkciwgc2l6ZW9mKGRldmFkZHIpLCAicGNpX2FkZHIiLCBhZGRyKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHBjaV9wYXJzZV9kZXZhZGRyKGRldmFkZHIsIGRvbXAsIGJ1c3AsIHNsb3RwKTsKK30KKworaW50IHBjaV9hc3NpZ25fZGV2YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgKmRvbXAsIGludCAqYnVzcCwgdW5zaWduZWQgKnNsb3RwKQoreworICAgIGNoYXIgZGV2YWRkclszMl07CisKKyAgICBpZiAoIWdldF9wYXJhbV92YWx1ZShkZXZhZGRyLCBzaXplb2YoZGV2YWRkciksICJwY2lfYWRkciIsIGFkZHIpKQorCXJldHVybiAtMTsKKworICAgIGlmICghc3RyY21wKGRldmFkZHIsICJhdXRvIikpIHsKKyAgICAgICAgKmRvbXAgPSAqYnVzcCA9IDA7CisgICAgICAgICpzbG90cCA9IC0xOworICAgICAgICAvKiB3YW50IHRvIHN1cHBvcnQgZG9tL2J1cyBhdXRvLWFzc2lnbiBhdCBzb21lIHBvaW50ICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBwY2lfcGFyc2VfZGV2YWRkcihkZXZhZGRyLCBkb21wLCBidXNwLCBzbG90cCk7Cit9CisKKy8qIC0xIGZvciBkZXZmbiBtZWFucyBhdXRvIGFzc2lnbiAqLworc3RhdGljIFBDSURldmljZSAqZG9fcGNpX3JlZ2lzdGVyX2RldmljZShQQ0lEZXZpY2UgKnBjaV9kZXYsIFBDSUJ1cyAqYnVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGV2Zm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSUNvbmZpZ1JlYWRGdW5jICpjb25maWdfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJQ29uZmlnV3JpdGVGdW5jICpjb25maWdfd3JpdGUpCit7CisgICAgaWYgKGRldmZuIDwgMCkgeworICAgICAgICBmb3IoZGV2Zm4gPSBidXMtPmRldmZuX21pbiA7IGRldmZuIDwgMjU2OyBkZXZmbiArPSA4KSB7CisgICAgICAgICAgICBpZiAoIWJ1cy0+ZGV2aWNlc1tkZXZmbl0pCisgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3VuZDogOworICAgIH0KKyAgICBwY2lfZGV2LT5idXMgPSBidXM7CisgICAgcGNpX2Rldi0+ZGV2Zm4gPSBkZXZmbjsKKyAgICBwc3RyY3B5KHBjaV9kZXYtPm5hbWUsIHNpemVvZihwY2lfZGV2LT5uYW1lKSwgbmFtZSk7CisgICAgbWVtc2V0KHBjaV9kZXYtPmlycV9zdGF0ZSwgMCwgc2l6ZW9mKHBjaV9kZXYtPmlycV9zdGF0ZSkpOworICAgIHBjaV9zZXRfZGVmYXVsdF9zdWJzeXN0ZW1faWQocGNpX2Rldik7CisKKyAgICBpZiAoIWNvbmZpZ19yZWFkKQorICAgICAgICBjb25maWdfcmVhZCA9IHBjaV9kZWZhdWx0X3JlYWRfY29uZmlnOworICAgIGlmICghY29uZmlnX3dyaXRlKQorICAgICAgICBjb25maWdfd3JpdGUgPSBwY2lfZGVmYXVsdF93cml0ZV9jb25maWc7CisgICAgcGNpX2Rldi0+Y29uZmlnX3JlYWQgPSBjb25maWdfcmVhZDsKKyAgICBwY2lfZGV2LT5jb25maWdfd3JpdGUgPSBjb25maWdfd3JpdGU7CisgICAgYnVzLT5kZXZpY2VzW2RldmZuXSA9IHBjaV9kZXY7CisgICAgcGNpX2Rldi0+aXJxID0gcWVtdV9hbGxvY2F0ZV9pcnFzKHBjaV9zZXRfaXJxLCBwY2lfZGV2LCA0KTsKKyAgICByZXR1cm4gcGNpX2RldjsKK30KKworUENJRGV2aWNlICpwY2lfcmVnaXN0ZXJfZGV2aWNlKFBDSUJ1cyAqYnVzLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZV9zaXplLCBpbnQgZGV2Zm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJQ29uZmlnUmVhZEZ1bmMgKmNvbmZpZ19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSUNvbmZpZ1dyaXRlRnVuYyAqY29uZmlnX3dyaXRlKQoreworICAgIFBDSURldmljZSAqcGNpX2RldjsKKworICAgIHBjaV9kZXYgPSBnX21hbGxvYzAoaW5zdGFuY2Vfc2l6ZSk7CisgICAgcGNpX2RldiA9IGRvX3BjaV9yZWdpc3Rlcl9kZXZpY2UocGNpX2RldiwgYnVzLCBuYW1lLCBkZXZmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfcmVhZCwgY29uZmlnX3dyaXRlKTsKKyAgICByZXR1cm4gcGNpX2RldjsKK30KK3N0YXRpYyBod2FkZHIgcGNpX3RvX2NwdV9hZGRyKGh3YWRkciBhZGRyKQoreworICAgIHJldHVybiBhZGRyICsgcGNpX21lbV9iYXNlOworfQorCitzdGF0aWMgdm9pZCBwY2lfdW5yZWdpc3Rlcl9pb19yZWdpb25zKFBDSURldmljZSAqcGNpX2RldikKK3sKKyAgICBQQ0lJT1JlZ2lvbiAqcjsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IFBDSV9OVU1fUkVHSU9OUzsgaSsrKSB7CisgICAgICAgIHIgPSAmcGNpX2Rldi0+aW9fcmVnaW9uc1tpXTsKKyAgICAgICAgaWYgKCFyLT5zaXplIHx8IHItPmFkZHIgPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHItPnR5cGUgPT0gUENJX0FERFJFU1NfU1BBQ0VfSU8pIHsKKyAgICAgICAgICAgIGlzYV91bmFzc2lnbl9pb3BvcnQoci0+YWRkciwgci0+c2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KHBjaV90b19jcHVfYWRkcihyLT5hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fTUVNX1VOQVNTSUdORUQpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgcGNpX3VucmVnaXN0ZXJfZGV2aWNlKFBDSURldmljZSAqcGNpX2RldikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChwY2lfZGV2LT51bnJlZ2lzdGVyKQorICAgICAgICByZXQgPSBwY2lfZGV2LT51bnJlZ2lzdGVyKHBjaV9kZXYpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwY2lfdW5yZWdpc3Rlcl9pb19yZWdpb25zKHBjaV9kZXYpOworCisgICAgcWVtdV9mcmVlX2lycXMocGNpX2Rldi0+aXJxKTsKKyAgICBwY2lfZGV2LT5idXMtPmRldmljZXNbcGNpX2Rldi0+ZGV2Zm5dID0gTlVMTDsKKyAgICBxZGV2X2ZyZWUoJnBjaV9kZXYtPnFkZXYpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHBjaV9yZWdpc3Rlcl9iYXIoUENJRGV2aWNlICpwY2lfZGV2LCBpbnQgcmVnaW9uX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lNYXBJT1JlZ2lvbkZ1bmMgKm1hcF9mdW5jKQoreworICAgIFBDSUlPUmVnaW9uICpyOworICAgIHVpbnQzMl90IGFkZHI7CisKKyAgICBpZiAoKHVuc2lnbmVkIGludClyZWdpb25fbnVtID49IFBDSV9OVU1fUkVHSU9OUykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHNpemUgJiAoc2l6ZS0xKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBQQ0kgcmVnaW9uIHNpemUgbXVzdCBiZSBwb3cyICIKKyAgICAgICAgICAgICAgICAgICAgInR5cGU9MHgleCwgc2l6ZT0weCV4XG4iLCB0eXBlLCBzaXplKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICByID0gJnBjaV9kZXYtPmlvX3JlZ2lvbnNbcmVnaW9uX251bV07CisgICAgci0+YWRkciA9IC0xOworICAgIHItPnNpemUgPSBzaXplOworICAgIHItPnR5cGUgPSB0eXBlOworICAgIHItPm1hcF9mdW5jID0gbWFwX2Z1bmM7CisgICAgaWYgKHJlZ2lvbl9udW0gPT0gUENJX1JPTV9TTE9UKSB7CisgICAgICAgIGFkZHIgPSAweDMwOworICAgIH0gZWxzZSB7CisgICAgICAgIGFkZHIgPSAweDEwICsgcmVnaW9uX251bSAqIDQ7CisgICAgfQorICAgIHBjaV9zZXRfbG9uZyhwY2lfZGV2LT5jb25maWcgKyBhZGRyLCB0eXBlKTsKK30KKworc3RhdGljIHZvaWQgcGNpX3VwZGF0ZV9tYXBwaW5ncyhQQ0lEZXZpY2UgKmQpCit7CisgICAgUENJSU9SZWdpb24gKnI7CisgICAgaW50IGNtZCwgaTsKKyAgICB1aW50MzJfdCBsYXN0X2FkZHIsIG5ld19hZGRyLCBjb25maWdfb2ZzOworCisgICAgY21kID0gcGNpX2dldF93b3JkKGQtPmNvbmZpZyArIFBDSV9DT01NQU5EKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBQQ0lfTlVNX1JFR0lPTlM7IGkrKykgeworICAgICAgICByID0gJmQtPmlvX3JlZ2lvbnNbaV07CisgICAgICAgIGlmIChpID09IFBDSV9ST01fU0xPVCkgeworICAgICAgICAgICAgY29uZmlnX29mcyA9IDB4MzA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdfb2ZzID0gMHgxMCArIGkgKiA0OworICAgICAgICB9CisgICAgICAgIGlmIChyLT5zaXplICE9IDApIHsKKyAgICAgICAgICAgIGlmIChyLT50eXBlICYgUENJX0FERFJFU1NfU1BBQ0VfSU8pIHsKKyAgICAgICAgICAgICAgICBpZiAoY21kICYgUENJX0NPTU1BTkRfSU8pIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2FkZHIgPSBwY2lfZ2V0X2xvbmcoZC0+Y29uZmlnICsgY29uZmlnX29mcyk7CisgICAgICAgICAgICAgICAgICAgIG5ld19hZGRyID0gbmV3X2FkZHIgJiB+KHItPnNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9hZGRyID0gbmV3X2FkZHIgKyByLT5zaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgLyogTk9URTogd2UgaGF2ZSBvbmx5IDY0SyBpb3BvcnRzIG9uIFBDICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X2FkZHIgPD0gbmV3X2FkZHIgfHwgbmV3X2FkZHIgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9hZGRyID49IDB4MTAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hZGRyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdfYWRkciA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNtZCAmIFBDSV9DT01NQU5EX01FTU9SWSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfYWRkciA9IHBjaV9nZXRfbG9uZyhkLT5jb25maWcgKyBjb25maWdfb2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhlIFJPTSBzbG90IGhhcyBhIHNwZWNpZmljIGVuYWJsZSBiaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gUENJX1JPTV9TTE9UICYmICEobmV3X2FkZHIgJiAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9fbWVtX21hcDsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2FkZHIgPSBuZXdfYWRkciAmIH4oci0+c2l6ZSAtIDEpOworICAgICAgICAgICAgICAgICAgICBsYXN0X2FkZHIgPSBuZXdfYWRkciArIHItPnNpemUgLSAxOworICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiB3ZSBkbyBub3Qgc3VwcG9ydCB3cmFwcGluZyAqLworICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IGFzIHdlIGNhbm5vdCBzdXBwb3J0IHJlYWxseSBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLCB3ZSBoYW5kbGUgc3BlY2lmaWMgdmFsdWVzIGFzIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3MuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X2FkZHIgPD0gbmV3X2FkZHIgfHwgbmV3X2FkZHIgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9hZGRyID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYWRkciA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub19tZW1fbWFwOgorICAgICAgICAgICAgICAgICAgICBuZXdfYWRkciA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIG5vdyBkbyB0aGUgcmVhbCBtYXBwaW5nICovCisgICAgICAgICAgICBpZiAobmV3X2FkZHIgIT0gci0+YWRkcikgeworICAgICAgICAgICAgICAgIGlmIChyLT5hZGRyICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyLT50eXBlICYgUENJX0FERFJFU1NfU1BBQ0VfSU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IHNwZWNpZmljIGhhY2sgZm9yIElERSBpbiBQQyBjYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSBvbmUgYnl0ZSBtdXN0IGJlIG1hcHBlZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzID0gZC0+Y29uZmlnWzB4MGFdIHwgKGQtPmNvbmZpZ1sweDBiXSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzcyA9PSAweDAxMDEgJiYgci0+c2l6ZSA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhX3VuYXNzaWduX2lvcG9ydChyLT5hZGRyICsgMiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzYV91bmFzc2lnbl9pb3BvcnQoci0+YWRkciwgci0+c2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KHBjaV90b19jcHVfYWRkcihyLT5hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9fTUVNX1VOQVNTSUdORUQpOworICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV91bnJlZ2lzdGVyX2NvYWxlc2NlZF9tbWlvKHItPmFkZHIsIHItPnNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHItPmFkZHIgPSBuZXdfYWRkcjsKKyAgICAgICAgICAgICAgICBpZiAoci0+YWRkciAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICByLT5tYXBfZnVuYyhkLCBpLCByLT5hZGRyLCByLT5zaXplLCByLT50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3VpbnQzMl90IHBjaV9kZWZhdWx0X3JlYWRfY29uZmlnKFBDSURldmljZSAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3MsIGludCBsZW4pCit7CisgICAgdWludDMyX3QgdmFsOworCisgICAgc3dpdGNoKGxlbikgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSA0OgorCWlmIChhZGRyZXNzIDw9IDB4ZmMpIHsKKwkgICAgdmFsID0gcGNpX2dldF9sb25nKGQtPmNvbmZpZyArIGFkZHJlc3MpOworCSAgICBicmVhazsKKwl9CisJLyogZmFsbCB0aHJvdWdoICovCisgICAgY2FzZSAyOgorICAgICAgICBpZiAoYWRkcmVzcyA8PSAweGZlKSB7CisJICAgIHZhbCA9IHBjaV9nZXRfd29yZChkLT5jb25maWcgKyBhZGRyZXNzKTsKKwkgICAgYnJlYWs7CisJfQorCS8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMToKKyAgICAgICAgdmFsID0gZC0+Y29uZmlnW2FkZHJlc3NdOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKwordm9pZCBwY2lfZGVmYXVsdF93cml0ZV9jb25maWcoUENJRGV2aWNlICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgdmFsLCBpbnQgbGVuKQoreworICAgIGludCBjYW5fd3JpdGUsIGk7CisgICAgdWludDMyX3QgZW5kLCBhZGRyOworCisgICAgaWYgKGxlbiA9PSA0ICYmICgoYWRkcmVzcyA+PSAweDEwICYmIGFkZHJlc3MgPCAweDEwICsgNCAqIDYpIHx8CisgICAgICAgICAgICAgICAgICAgICAoYWRkcmVzcyA+PSAweDMwICYmIGFkZHJlc3MgPCAweDM0KSkpIHsKKyAgICAgICAgUENJSU9SZWdpb24gKnI7CisgICAgICAgIGludCByZWc7CisKKyAgICAgICAgaWYgKCBhZGRyZXNzID49IDB4MzAgKSB7CisgICAgICAgICAgICByZWcgPSBQQ0lfUk9NX1NMT1Q7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgcmVnID0gKGFkZHJlc3MgLSAweDEwKSA+PiAyOworICAgICAgICB9CisgICAgICAgIHIgPSAmZC0+aW9fcmVnaW9uc1tyZWddOworICAgICAgICBpZiAoci0+c2l6ZSA9PSAwKQorICAgICAgICAgICAgZ290byBkZWZhdWx0X2NvbmZpZzsKKyAgICAgICAgLyogY29tcHV0ZSB0aGUgc3RvcmVkIHZhbHVlICovCisgICAgICAgIGlmIChyZWcgPT0gUENJX1JPTV9TTE9UKSB7CisgICAgICAgICAgICAvKiBrZWVwIFJPTSBlbmFibGUgYml0ICovCisgICAgICAgICAgICB2YWwgJj0gKH4oci0+c2l6ZSAtIDEpKSB8IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwgJj0gfihyLT5zaXplIC0gMSk7CisgICAgICAgICAgICB2YWwgfD0gci0+dHlwZTsKKyAgICAgICAgfQorICAgICAgICBwY2lfc2V0X2xvbmcoZC0+Y29uZmlnICsgYWRkcmVzcywgdmFsKTsKKyAgICAgICAgcGNpX3VwZGF0ZV9tYXBwaW5ncyhkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyBkZWZhdWx0X2NvbmZpZzoKKyAgICAvKiBub3QgZWZmaWNpZW50LCBidXQgc2ltcGxlICovCisgICAgYWRkciA9IGFkZHJlc3M7CisgICAgZm9yKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgLyogZGVmYXVsdCByZWFkL3dyaXRlIGFjY2Vzc2VzICovCisgICAgICAgIHN3aXRjaChkLT5jb25maWdbMHgwZV0pIHsKKyAgICAgICAgY2FzZSAweDAwOgorICAgICAgICBjYXNlIDB4ODA6CisgICAgICAgICAgICBzd2l0Y2goYWRkcikgeworICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgY2FzZSAweDA3OgorICAgICAgICAgICAgY2FzZSAweDA4OgorICAgICAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgY2FzZSAweDBhOgorICAgICAgICAgICAgY2FzZSAweDBiOgorICAgICAgICAgICAgY2FzZSAweDBlOgorICAgICAgICAgICAgY2FzZSAweDEwIC4uLiAweDI3OiAvKiBiYXNlICovCisgICAgICAgICAgICBjYXNlIDB4MmMgLi4uIDB4MmY6IC8qIHJlYWQtb25seSBzdWJzeXN0ZW0gSUQgJiB2ZW5kb3IgSUQgKi8KKyAgICAgICAgICAgIGNhc2UgMHgzMCAuLi4gMHgzMzogLyogcm9tICovCisgICAgICAgICAgICBjYXNlIDB4M2Q6CisgICAgICAgICAgICAgICAgY2FuX3dyaXRlID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2FuX3dyaXRlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICBzd2l0Y2goYWRkcikgeworICAgICAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgY2FzZSAweDA3OgorICAgICAgICAgICAgY2FzZSAweDA4OgorICAgICAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgY2FzZSAweDBhOgorICAgICAgICAgICAgY2FzZSAweDBiOgorICAgICAgICAgICAgY2FzZSAweDBlOgorICAgICAgICAgICAgY2FzZSAweDJjIC4uLiAweDJmOiAvKiByZWFkLW9ubHkgc3Vic3lzdGVtIElEICYgdmVuZG9yIElEICovCisgICAgICAgICAgICBjYXNlIDB4MzggLi4uIDB4M2I6IC8qIHJvbSAqLworICAgICAgICAgICAgY2FzZSAweDNkOgorICAgICAgICAgICAgICAgIGNhbl93cml0ZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNhbl93cml0ZSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FuX3dyaXRlKSB7CisgICAgICAgICAgICAvKiBNYXNrIG91dCB3cml0ZXMgdG8gcmVzZXJ2ZWQgYml0cyBpbiByZWdpc3RlcnMgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoYWRkcikgeworCSAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICAgICAgdmFsICY9IH5QQ0lfQ09NTUFORF9SRVNFUlZFRF9NQVNLX0hJOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA2OgorICAgICAgICAgICAgICAgIHZhbCAmPSB+UENJX1NUQVRVU19SRVNFUlZFRF9NQVNLX0xPOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA3OgorICAgICAgICAgICAgICAgIHZhbCAmPSB+UENJX1NUQVRVU19SRVNFUlZFRF9NQVNLX0hJOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZC0+Y29uZmlnW2FkZHJdID0gdmFsOworICAgICAgICB9CisgICAgICAgIGlmICgrK2FkZHIgPiAweGZmKQorICAgICAgICAJYnJlYWs7CisgICAgICAgIHZhbCA+Pj0gODsKKyAgICB9CisKKyAgICBlbmQgPSBhZGRyZXNzICsgbGVuOworICAgIGlmIChlbmQgPiBQQ0lfQ09NTUFORCAmJiBhZGRyZXNzIDwgKFBDSV9DT01NQU5EICsgMikpIHsKKyAgICAgICAgLyogaWYgdGhlIGNvbW1hbmQgcmVnaXN0ZXIgaXMgbW9kaWZpZWQsIHdlIG11c3QgbW9kaWZ5IHRoZSBtYXBwaW5ncyAqLworICAgICAgICBwY2lfdXBkYXRlX21hcHBpbmdzKGQpOworICAgIH0KK30KKwordm9pZCBwY2lfZGF0YV93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCwgaW50IGxlbikKK3sKKyAgICBQQ0lCdXMgKnMgPSBvcGFxdWU7CisgICAgUENJRGV2aWNlICpwY2lfZGV2OworICAgIGludCBjb25maWdfYWRkciwgYnVzX251bTsKKworI2lmIGRlZmluZWQoREVCVUdfUENJKSAmJiAwCisgICAgcHJpbnRmKCJwY2lfZGF0YV93cml0ZTogYWRkcj0lMDh4IHZhbD0lMDh4IGxlbj0lZFxuIiwKKyAgICAgICAgICAgYWRkciwgdmFsLCBsZW4pOworI2VuZGlmCisgICAgYnVzX251bSA9IChhZGRyID4+IDE2KSAmIDB4ZmY7CisgICAgd2hpbGUgKHMgJiYgcy0+YnVzX251bSAhPSBidXNfbnVtKQorICAgICAgICBzID0gcy0+bmV4dDsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICBwY2lfZGV2ID0gcy0+ZGV2aWNlc1soYWRkciA+PiA4KSAmIDB4ZmZdOworICAgIGlmICghcGNpX2RldikKKyAgICAgICAgcmV0dXJuOworICAgIGNvbmZpZ19hZGRyID0gYWRkciAmIDB4ZmY7CisjaWYgZGVmaW5lZChERUJVR19QQ0kpCisgICAgcHJpbnRmKCJwY2lfY29uZmlnX3dyaXRlOiAlczogYWRkcj0lMDJ4IHZhbD0lMDh4IGxlbj0lZFxuIiwKKyAgICAgICAgICAgcGNpX2Rldi0+bmFtZSwgY29uZmlnX2FkZHIsIHZhbCwgbGVuKTsKKyNlbmRpZgorICAgIHBjaV9kZXYtPmNvbmZpZ193cml0ZShwY2lfZGV2LCBjb25maWdfYWRkciwgdmFsLCBsZW4pOworfQorCit1aW50MzJfdCBwY2lfZGF0YV9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgaW50IGxlbikKK3sKKyAgICBQQ0lCdXMgKnMgPSBvcGFxdWU7CisgICAgUENJRGV2aWNlICpwY2lfZGV2OworICAgIGludCBjb25maWdfYWRkciwgYnVzX251bTsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICBidXNfbnVtID0gKGFkZHIgPj4gMTYpICYgMHhmZjsKKyAgICB3aGlsZSAocyAmJiBzLT5idXNfbnVtICE9IGJ1c19udW0pCisgICAgICAgIHM9IHMtPm5leHQ7CisgICAgaWYgKCFzKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcGNpX2RldiA9IHMtPmRldmljZXNbKGFkZHIgPj4gOCkgJiAweGZmXTsKKyAgICBpZiAoIXBjaV9kZXYpIHsKKyAgICBmYWlsOgorICAgICAgICBzd2l0Y2gobGVuKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHZhbCA9IDB4ZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdmFsID0gMHhmZmZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHZhbCA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgfQorICAgIGNvbmZpZ19hZGRyID0gYWRkciAmIDB4ZmY7CisgICAgdmFsID0gcGNpX2Rldi0+Y29uZmlnX3JlYWQocGNpX2RldiwgY29uZmlnX2FkZHIsIGxlbik7CisjaWYgZGVmaW5lZChERUJVR19QQ0kpCisgICAgcHJpbnRmKCJwY2lfY29uZmlnX3JlYWQ6ICVzOiBhZGRyPSUwMnggdmFsPSUwOHggbGVuPSVkXG4iLAorICAgICAgICAgICBwY2lfZGV2LT5uYW1lLCBjb25maWdfYWRkciwgdmFsLCBsZW4pOworI2VuZGlmCisgdGhlX2VuZDoKKyNpZiBkZWZpbmVkKERFQlVHX1BDSSkgJiYgMAorICAgIHByaW50ZigicGNpX2RhdGFfcmVhZDogYWRkcj0lMDh4IHZhbD0lMDh4IGxlbj0lZFxuIiwKKyAgICAgICAgICAgYWRkciwgdmFsLCBsZW4pOworI2VuZGlmCisgICAgcmV0dXJuIHZhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZ2VuZXJpYyBQQ0kgaXJxIHN1cHBvcnQgKi8KKworLyogMCA8PSBpcnFfbnVtIDw9IDMuIGxldmVsIG11c3QgYmUgMCBvciAxICovCitzdGF0aWMgdm9pZCBwY2lfc2V0X2lycSh2b2lkICpvcGFxdWUsIGludCBpcnFfbnVtLCBpbnQgbGV2ZWwpCit7CisgICAgUENJRGV2aWNlICpwY2lfZGV2ID0gKFBDSURldmljZSAqKW9wYXF1ZTsKKyAgICBQQ0lCdXMgKmJ1czsKKyAgICBpbnQgY2hhbmdlOworCisgICAgY2hhbmdlID0gbGV2ZWwgLSBwY2lfZGV2LT5pcnFfc3RhdGVbaXJxX251bV07CisgICAgaWYgKCFjaGFuZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIHBjaV9kZXYtPmlycV9zdGF0ZVtpcnFfbnVtXSA9IGxldmVsOworICAgIGZvciAoOzspIHsKKyAgICAgICAgYnVzID0gcGNpX2Rldi0+YnVzOworICAgICAgICBpcnFfbnVtID0gYnVzLT5tYXBfaXJxKHBjaV9kZXYsIGlycV9udW0pOworICAgICAgICBpZiAoYnVzLT5zZXRfaXJxKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBjaV9kZXYgPSBidXMtPnBhcmVudF9kZXY7CisgICAgfQorICAgIGJ1cy0+aXJxX2NvdW50W2lycV9udW1dICs9IGNoYW5nZTsKKyAgICBidXMtPnNldF9pcnEoYnVzLT5pcnFfb3BhcXVlLCBpcnFfbnVtLCBidXMtPmlycV9jb3VudFtpcnFfbnVtXSAhPSAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbW9uaXRvciBpbmZvIG9uIFBDSSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgY2xhc3M7CisgICAgY29uc3QgY2hhciAqZGVzYzsKK30gcGNpX2NsYXNzX2Rlc2M7CisKK3N0YXRpYyBjb25zdCBwY2lfY2xhc3NfZGVzYyBwY2lfY2xhc3NfZGVzY3JpcHRpb25zW10gPQoreworICAgIHsgMHgwMTAwLCAiU0NTSSBjb250cm9sbGVyIn0sCisgICAgeyAweDAxMDEsICJJREUgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMTAyLCAiRmxvcHB5IGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDEwMywgIklQSSBjb250cm9sbGVyIn0sCisgICAgeyAweDAxMDQsICJSQUlEIGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDEwNiwgIlNBVEEgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMTA3LCAiU0FTIGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDE4MCwgIlN0b3JhZ2UgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMjAwLCAiRXRoZXJuZXQgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMjAxLCAiVG9rZW4gUmluZyBjb250cm9sbGVyIn0sCisgICAgeyAweDAyMDIsICJGRERJIGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDIwMywgIkFUTSBjb250cm9sbGVyIn0sCisgICAgeyAweDAyODAsICJOZXR3b3JrIGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDMwMCwgIlZHQSBjb250cm9sbGVyIn0sCisgICAgeyAweDAzMDEsICJYR0EgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMzAyLCAiM0QgY29udHJvbGxlciJ9LAorICAgIHsgMHgwMzgwLCAiRGlzcGxheSBjb250cm9sbGVyIn0sCisgICAgeyAweDA0MDAsICJWaWRlbyBjb250cm9sbGVyIn0sCisgICAgeyAweDA0MDEsICJBdWRpbyBjb250cm9sbGVyIn0sCisgICAgeyAweDA0MDIsICJQaG9uZSJ9LAorICAgIHsgMHgwNDgwLCAiTXVsdGltZWRpYSBjb250cm9sbGVyIn0sCisgICAgeyAweDA1MDAsICJSQU0gY29udHJvbGxlciJ9LAorICAgIHsgMHgwNTAxLCAiRmxhc2ggY29udHJvbGxlciJ9LAorICAgIHsgMHgwNTgwLCAiTWVtb3J5IGNvbnRyb2xsZXIifSwKKyAgICB7IDB4MDYwMCwgIkhvc3QgYnJpZGdlIn0sCisgICAgeyAweDA2MDEsICJJU0EgYnJpZGdlIn0sCisgICAgeyAweDA2MDIsICJFSVNBIGJyaWRnZSJ9LAorICAgIHsgMHgwNjAzLCAiTUMgYnJpZGdlIn0sCisgICAgeyAweDA2MDQsICJQQ0kgYnJpZGdlIn0sCisgICAgeyAweDA2MDUsICJQQ01DSUEgYnJpZGdlIn0sCisgICAgeyAweDA2MDYsICJOVUJVUyBicmlkZ2UifSwKKyAgICB7IDB4MDYwNywgIkNBUkRCVVMgYnJpZGdlIn0sCisgICAgeyAweDA2MDgsICJSQUNFV0FZIGJyaWRnZSJ9LAorICAgIHsgMHgwNjgwLCAiQnJpZGdlIn0sCisgICAgeyAweDBjMDMsICJVU0IgY29udHJvbGxlciJ9LAorICAgIHsgMCwgTlVMTH0KK307CisKK3N0YXRpYyB2b2lkIHBjaV9pbmZvX2RldmljZShQQ0lEZXZpY2UgKmQpCit7CisgICAgTW9uaXRvciAqbW9uID0gY3VyX21vbjsKKyAgICBpbnQgaSwgY2xhc3M7CisgICAgUENJSU9SZWdpb24gKnI7CisgICAgY29uc3QgcGNpX2NsYXNzX2Rlc2MgKmRlc2M7CisKKyAgICB0eXBlZGVmIHVuaW9uIHsKKyAgICAgICAgdWludDE2X3QqIHB0cjE2OworICAgICAgICB2b2lkKiBwdHI7CisgICAgfSB1MTY7CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgIEJ1cyAlMmQsIGRldmljZSAlM2QsIGZ1bmN0aW9uICVkOlxuIiwKKyAgICAgICAgICAgICAgICAgICBkLT5idXMtPmJ1c19udW0sIGQtPmRldmZuID4+IDMsIGQtPmRldmZuICYgNyk7CisgICAgY2xhc3MgPSBwY2lfZ2V0X3dvcmQoZC0+Y29uZmlnICsgUENJX0NMQVNTX0RFVklDRSk7CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICAgICIpOworICAgIGRlc2MgPSBwY2lfY2xhc3NfZGVzY3JpcHRpb25zOworICAgIHdoaWxlIChkZXNjLT5kZXNjICYmIGNsYXNzICE9IGRlc2MtPmNsYXNzKQorICAgICAgICBkZXNjKys7CisgICAgaWYgKGRlc2MtPmRlc2MpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJXMiLCBkZXNjLT5kZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJDbGFzcyAlMDR4IiwgY2xhc3MpOworICAgIH0KKyAgICB1MTYgdmVuZG9yX2lkID0geyAucHRyID0gZC0+Y29uZmlnICsgUENJX1ZFTkRPUl9JRCB9OworICAgIHUxNiBkZXZpY2VfaWQgPSB7IC5wdHIgPSBkLT5jb25maWcgKyBQQ0lfREVWSUNFX0lEIH07CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICI6IFBDSSBkZXZpY2UgJTA0eDolMDR4XG4iLAorICAgICAgICAgICBsZTE2X3RvX2NwdSgqdmVuZG9yX2lkLnB0cjE2KSwKKyAgICAgICAgICAgbGUxNl90b19jcHUoKmRldmljZV9pZC5wdHIxNikpOworCisgICAgaWYgKGQtPmNvbmZpZ1tQQ0lfSU5URVJSVVBUX1BJTl0gIT0gMCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICAgICBJUlEgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBkLT5jb25maWdbUENJX0lOVEVSUlVQVF9MSU5FXSk7CisgICAgfQorICAgIGlmIChjbGFzcyA9PSAweDA2MDQpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICAgICAgQlVTICVkLlxuIiwgZC0+Y29uZmlnWzB4MTldKTsKKyAgICB9CisgICAgZm9yKGkgPSAwO2kgPCBQQ0lfTlVNX1JFR0lPTlM7IGkrKykgeworICAgICAgICByID0gJmQtPmlvX3JlZ2lvbnNbaV07CisgICAgICAgIGlmIChyLT5zaXplICE9IDApIHsKKyAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgICAgIEJBUiVkOiAiLCBpKTsKKyAgICAgICAgICAgIGlmIChyLT50eXBlICYgUENJX0FERFJFU1NfU1BBQ0VfSU8pIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJJL08gYXQgMHglMDR4IFsweCUwNHhdLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5hZGRyLCByLT5hZGRyICsgci0+c2l6ZSAtIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIzMiBiaXQgbWVtb3J5IGF0IDB4JTA4eCBbMHglMDh4XS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+YWRkciwgci0+YWRkciArIHItPnNpemUgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2xhc3MgPT0gMHgwNjA0ICYmIGQtPmNvbmZpZ1sweDE5XSAhPSAwKSB7CisgICAgICAgIHBjaV9mb3JfZWFjaF9kZXZpY2UoZC0+Y29uZmlnWzB4MTldLCBwY2lfaW5mb19kZXZpY2UpOworICAgIH0KK30KKwordm9pZCBwY2lfZm9yX2VhY2hfZGV2aWNlKGludCBidXNfbnVtLCB2b2lkICgqZm4pKFBDSURldmljZSAqZCkpCit7CisgICAgUENJQnVzICpidXMgPSBmaXJzdF9idXM7CisgICAgUENJRGV2aWNlICpkOworICAgIGludCBkZXZmbjsKKworICAgIHdoaWxlIChidXMgJiYgYnVzLT5idXNfbnVtICE9IGJ1c19udW0pCisgICAgICAgIGJ1cyA9IGJ1cy0+bmV4dDsKKyAgICBpZiAoYnVzKSB7CisgICAgICAgIGZvcihkZXZmbiA9IDA7IGRldmZuIDwgMjU2OyBkZXZmbisrKSB7CisgICAgICAgICAgICBkID0gYnVzLT5kZXZpY2VzW2RldmZuXTsKKyAgICAgICAgICAgIGlmIChkKQorICAgICAgICAgICAgICAgIGZuKGQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHBjaV9pbmZvKE1vbml0b3IgKm1vbikKK3sKKyAgICBwY2lfZm9yX2VhY2hfZGV2aWNlKDAsIHBjaV9pbmZvX2RldmljZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpX25pY19tb2RlbHNbXSA9IHsKKyAgICAibmUya19wY2kiLAorICAgICJpODI1NTEiLAorICAgICJpODI1NTdiIiwKKyAgICAiaTgyNTU5ZXIiLAorICAgICJydGw4MTM5IiwKKyAgICAiZTEwMDAiLAorICAgICJwY25ldCIsCisgICAgInZpcnRpbyIsCisgICAgTlVMTAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwY2lfbmljX25hbWVzW10gPSB7CisgICAgIm5lMmtfcGNpIiwKKyAgICAiaTgyNTUxIiwKKyAgICAiaTgyNTU3YiIsCisgICAgImk4MjU1OWVyIiwKKyAgICAicnRsODEzOSIsCisgICAgImUxMDAwIiwKKyAgICAicGNuZXQiLAorICAgICJ2aXJ0aW8tbmV0LXBjaSIsCisgICAgTlVMTAorfTsKKworLyogSW5pdGlhbGl6ZSBhIFBDSSBOSUMuICAqLworUENJRGV2aWNlICpwY2lfbmljX2luaXQoUENJQnVzICpidXMsIE5JQ0luZm8gKm5kLCBpbnQgZGV2Zm4sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWZhdWx0X21vZGVsKQoreworICAgIERldmljZVN0YXRlICpkZXY7CisgICAgaW50IGk7CisKKyAgICBxZW11X2NoZWNrX25pY19tb2RlbF9saXN0KG5kLCBwY2lfbmljX21vZGVscywgZGVmYXVsdF9tb2RlbCk7CisKKyAgICBmb3IgKGkgPSAwOyBwY2lfbmljX21vZGVsc1tpXTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmQtPm1vZGVsLCBwY2lfbmljX21vZGVsc1tpXSkgPT0gMCkgeworICAgICAgICAgICAgZGV2ID0gcWRldl9jcmVhdGUoJmJ1cy0+cWJ1cywgcGNpX25pY19uYW1lc1tpXSk7CisgICAgICAgICAgICBxZGV2X3NldF9wcm9wX2ludChkZXYsICJkZXZmbiIsIGRldmZuKTsKKyAgICAgICAgICAgIHFkZXZfc2V0X25ldGRldihkZXYsIG5kKTsKKyAgICAgICAgICAgIHFkZXZfaW5pdChkZXYpOworICAgICAgICAgICAgbmQtPnByaXZhdGUgPSBkZXY7CisgICAgICAgICAgICByZXR1cm4gKFBDSURldmljZSAqKWRldjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgUENJQnJpZGdlIHsKKyAgICBQQ0lEZXZpY2UgZGV2OworICAgIFBDSUJ1cyAqYnVzOworfTsKKworc3RhdGljIHZvaWQgcGNpX2JyaWRnZV93cml0ZV9jb25maWcoUENJRGV2aWNlICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWwsIGludCBsZW4pCit7CisgICAgUENJQnJpZGdlICpzID0gKFBDSUJyaWRnZSAqKWQ7CisKKyAgICBpZiAoYWRkcmVzcyA9PSAweDE5IHx8IChhZGRyZXNzID09IDB4MTggJiYgbGVuID4gMSkpIHsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gMHgxOSkKKyAgICAgICAgICAgIHMtPmJ1cy0+YnVzX251bSA9IHZhbCAmIDB4ZmY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPmJ1cy0+YnVzX251bSA9ICh2YWwgPj4gOCkgJiAweGZmOworI2lmIGRlZmluZWQoREVCVUdfUENJKQorICAgICAgICBwcmludGYgKCJwY2ktYnJpZGdlOiAlczogQXNzaWduZWQgYnVzICVkXG4iLCBkLT5uYW1lLCBzLT5idXMtPmJ1c19udW0pOworI2VuZGlmCisgICAgfQorICAgIHBjaV9kZWZhdWx0X3dyaXRlX2NvbmZpZyhkLCBhZGRyZXNzLCB2YWwsIGxlbik7Cit9CisKK1BDSUJ1cyAqcGNpX2ZpbmRfYnVzKGludCBidXNfbnVtKQoreworICAgIFBDSUJ1cyAqYnVzID0gZmlyc3RfYnVzOworCisgICAgd2hpbGUgKGJ1cyAmJiBidXMtPmJ1c19udW0gIT0gYnVzX251bSkKKyAgICAgICAgYnVzID0gYnVzLT5uZXh0OworCisgICAgcmV0dXJuIGJ1czsKK30KKworUENJRGV2aWNlICpwY2lfZmluZF9kZXZpY2UoaW50IGJ1c19udW0sIGludCBzbG90LCBpbnQgZnVuY3Rpb24pCit7CisgICAgUENJQnVzICpidXMgPSBwY2lfZmluZF9idXMoYnVzX251bSk7CisKKyAgICBpZiAoIWJ1cykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gYnVzLT5kZXZpY2VzW1BDSV9ERVZGTihzbG90LCBmdW5jdGlvbildOworfQorCitQQ0lCdXMgKnBjaV9icmlkZ2VfaW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuLCB1aW50MTZfdCB2aWQsIHVpbnQxNl90IGRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9tYXBfaXJxX2ZuIG1hcF9pcnEsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUENJQnJpZGdlICpzOworICAgIHMgPSAoUENJQnJpZGdlICopcGNpX3JlZ2lzdGVyX2RldmljZShidXMsIG5hbWUsIHNpemVvZihQQ0lCcmlkZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZmbiwgTlVMTCwgcGNpX2JyaWRnZV93cml0ZV9jb25maWcpOworCisgICAgcGNpX2NvbmZpZ19zZXRfdmVuZG9yX2lkKHMtPmRldi5jb25maWcsIHZpZCk7CisgICAgcGNpX2NvbmZpZ19zZXRfZGV2aWNlX2lkKHMtPmRldi5jb25maWcsIGRpZCk7CisKKyAgICBzLT5kZXYuY29uZmlnWzB4MDRdID0gMHgwNjsgLy8gY29tbWFuZCA9IGJ1cyBtYXN0ZXIsIHBjaSBtZW0KKyAgICBzLT5kZXYuY29uZmlnWzB4MDVdID0gMHgwMDsKKyAgICBzLT5kZXYuY29uZmlnWzB4MDZdID0gMHhhMDsgLy8gc3RhdHVzID0gZmFzdCBiYWNrLXRvLWJhY2ssIDY2TUh6LCBubyBlcnJvcgorICAgIHMtPmRldi5jb25maWdbMHgwN10gPSAweDAwOyAvLyBzdGF0dXMgPSBmYXN0IGRldnNlbAorICAgIHMtPmRldi5jb25maWdbMHgwOF0gPSAweDAwOyAvLyByZXZpc2lvbgorICAgIHMtPmRldi5jb25maWdbMHgwOV0gPSAweDAwOyAvLyBwcm9ncmFtbWluZyBpL2YKKyAgICBwY2lfY29uZmlnX3NldF9jbGFzcyhzLT5kZXYuY29uZmlnLCBQQ0lfQ0xBU1NfQlJJREdFX1BDSSk7CisgICAgcy0+ZGV2LmNvbmZpZ1sweDBEXSA9IDB4MTA7IC8vIGxhdGVuY3lfdGltZXIKKyAgICBzLT5kZXYuY29uZmlnW1BDSV9IRUFERVJfVFlQRV0gPQorICAgICAgICBQQ0lfSEVBREVSX1RZUEVfTVVMVElfRlVOQ1RJT04gfCBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOyAvLyBoZWFkZXJfdHlwZQorICAgIHMtPmRldi5jb25maWdbMHgxRV0gPSAweGEwOyAvLyBzZWNvbmRhcnkgc3RhdHVzCisKKyAgICBzLT5idXMgPSBwY2lfcmVnaXN0ZXJfc2Vjb25kYXJ5X2J1cygmcy0+ZGV2LCBtYXBfaXJxKTsKKyAgICByZXR1cm4gcy0+YnVzOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRGV2aWNlSW5mbyBxZGV2OworICAgIHBjaV9xZGV2X2luaXRmbiBpbml0OworfSBQQ0lEZXZpY2VJbmZvOworCitzdGF0aWMgdm9pZCBwY2lfcWRldl9pbml0KERldmljZVN0YXRlICpxZGV2LCBEZXZpY2VJbmZvICpiYXNlKQoreworICAgIFBDSURldmljZSAqcGNpX2RldiA9IChQQ0lEZXZpY2UgKilxZGV2OworICAgIFBDSURldmljZUluZm8gKmluZm8gPSBjb250YWluZXJfb2YoYmFzZSwgUENJRGV2aWNlSW5mbywgcWRldik7CisgICAgUENJQnVzICpidXM7CisgICAgaW50IGRldmZuOworCisgICAgYnVzID0gRlJPTV9RQlVTKFBDSUJ1cywgcWRldl9nZXRfcGFyZW50X2J1cyhxZGV2KSk7CisgICAgZGV2Zm4gPSBxZGV2X2dldF9wcm9wX2ludChxZGV2LCAiZGV2Zm4iLCAtMSk7CisgICAgcGNpX2RldiA9IGRvX3BjaV9yZWdpc3Rlcl9kZXZpY2UocGNpX2RldiwgYnVzLCAiRklYTUUiLCBkZXZmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsvL0ZJWE1FOmNvbmZpZ19yZWFkLCBjb25maWdfd3JpdGUpOworICAgIGFzc2VydChwY2lfZGV2KTsKKyAgICBpbmZvLT5pbml0KHBjaV9kZXYpOworfQorCit2b2lkIHBjaV9xZGV2X3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsIGludCBzaXplLCBwY2lfcWRldl9pbml0Zm4gaW5pdCkKK3sKKyAgICBQQ0lEZXZpY2VJbmZvICppbmZvOworCisgICAgaW5mbyA9IGdfbWFsbG9jMChzaXplb2YoKmluZm8pKTsKKyAgICBpbmZvLT5xZGV2Lm5hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgICBpbmZvLT5xZGV2LnNpemUgPSBzaXplOworICAgIGluZm8tPmluaXQgPSBpbml0OworICAgIGluZm8tPnFkZXYuaW5pdCA9IHBjaV9xZGV2X2luaXQ7CisgICAgaW5mby0+cWRldi5idXNfdHlwZSA9IEJVU19UWVBFX1BDSTsKKworICAgIHFkZXZfcmVnaXN0ZXIoJmluZm8tPnFkZXYpOworfQorCitQQ0lEZXZpY2UgKnBjaV9jcmVhdGVfc2ltcGxlKFBDSUJ1cyAqYnVzLCBpbnQgZGV2Zm4sIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgRGV2aWNlU3RhdGUgKmRldjsKKworICAgIGRldiA9IHFkZXZfY3JlYXRlKCZidXMtPnFidXMsIG5hbWUpOworICAgIHFkZXZfc2V0X3Byb3BfaW50KGRldiwgImRldmZuIiwgZGV2Zm4pOworICAgIHFkZXZfaW5pdChkZXYpOworCisgICAgcmV0dXJuIChQQ0lEZXZpY2UgKilkZXY7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2h3L3RpbWVyL2k4MjU0LmMgYi9hbmRyb2lkL3FlbXUxL2h3L3RpbWVyL2k4MjU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkMWVmMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaHcvdGltZXIvaTgyNTQuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIFFFTVUgODI1My84MjU0IGludGVydmFsIHRpbWVyIGVtdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvaTM4Ni9wYy5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisKKy8vI2RlZmluZSBERUJVR19QSVQKKworI2RlZmluZSBSV19TVEFURV9MU0IgMQorI2RlZmluZSBSV19TVEFURV9NU0IgMgorI2RlZmluZSBSV19TVEFURV9XT1JEMCAzCisjZGVmaW5lIFJXX1NUQVRFX1dPUkQxIDQKKwordHlwZWRlZiBzdHJ1Y3QgUElUQ2hhbm5lbFN0YXRlIHsKKyAgICBpbnQgY291bnQ7IC8qIGNhbiBiZSA2NTUzNiAqLworICAgIHVpbnQxNl90IGxhdGNoZWRfY291bnQ7CisgICAgdWludDhfdCBjb3VudF9sYXRjaGVkOworICAgIHVpbnQ4X3Qgc3RhdHVzX2xhdGNoZWQ7CisgICAgdWludDhfdCBzdGF0dXM7CisgICAgdWludDhfdCByZWFkX3N0YXRlOworICAgIHVpbnQ4X3Qgd3JpdGVfc3RhdGU7CisgICAgdWludDhfdCB3cml0ZV9sYXRjaDsKKyAgICB1aW50OF90IHJ3X21vZGU7CisgICAgdWludDhfdCBtb2RlOworICAgIHVpbnQ4X3QgYmNkOyAvKiBub3Qgc3VwcG9ydGVkICovCisgICAgdWludDhfdCBnYXRlOyAvKiB0aW1lciBzdGFydCAqLworICAgIGludDY0X3QgY291bnRfbG9hZF90aW1lOworICAgIC8qIGlycSBoYW5kbGluZyAqLworICAgIGludDY0X3QgbmV4dF90cmFuc2l0aW9uX3RpbWU7CisgICAgUUVNVVRpbWVyICppcnFfdGltZXI7CisgICAgcWVtdV9pcnEgaXJxOworfSBQSVRDaGFubmVsU3RhdGU7CisKK3N0cnVjdCBQSVRTdGF0ZSB7CisgICAgUElUQ2hhbm5lbFN0YXRlIGNoYW5uZWxzWzNdOworfTsKKworc3RhdGljIFBJVFN0YXRlIHBpdF9zdGF0ZTsKKworc3RhdGljIHZvaWQgcGl0X2lycV90aW1lcl91cGRhdGUoUElUQ2hhbm5lbFN0YXRlICpzLCBpbnQ2NF90IGN1cnJlbnRfdGltZSk7CisKK3N0YXRpYyBpbnQgcGl0X2dldF9jb3VudChQSVRDaGFubmVsU3RhdGUgKnMpCit7CisgICAgdWludDY0X3QgZDsKKyAgICBpbnQgY291bnRlcjsKKworICAgIGQgPSBtdWxkaXY2NChxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpIC0gcy0+Y291bnRfbG9hZF90aW1lLCBQSVRfRlJFUSwgZ2V0X3RpY2tzX3Blcl9zZWMoKSk7CisgICAgc3dpdGNoKHMtPm1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgICAgIGNvdW50ZXIgPSAocy0+Y291bnQgLSBkKSAmIDB4ZmZmZjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICAvKiBYWFg6IG1heSBiZSBpbmNvcnJlY3QgZm9yIG9kZCBjb3VudHMgKi8KKyAgICAgICAgY291bnRlciA9IHMtPmNvdW50IC0gKCgyICogZCkgJSBzLT5jb3VudCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNvdW50ZXIgPSBzLT5jb3VudCAtIChkICUgcy0+Y291bnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50ZXI7Cit9CisKKy8qIGdldCBwaXQgb3V0cHV0IGJpdCAqLworc3RhdGljIGludCBwaXRfZ2V0X291dDEoUElUQ2hhbm5lbFN0YXRlICpzLCBpbnQ2NF90IGN1cnJlbnRfdGltZSkKK3sKKyAgICB1aW50NjRfdCBkOworICAgIGludCBvdXQ7CisKKyAgICBkID0gbXVsZGl2NjQoY3VycmVudF90aW1lIC0gcy0+Y291bnRfbG9hZF90aW1lLCBQSVRfRlJFUSwgZ2V0X3RpY2tzX3Blcl9zZWMoKSk7CisgICAgc3dpdGNoKHMtPm1vZGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICAgICAgb3V0ID0gKGQgPj0gcy0+Y291bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIG91dCA9IChkIDwgcy0+Y291bnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICgoZCAlIHMtPmNvdW50KSA9PSAwICYmIGQgIT0gMCkKKyAgICAgICAgICAgIG91dCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG91dCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgb3V0ID0gKGQgJSBzLT5jb3VudCkgPCAoKHMtPmNvdW50ICsgMSkgPj4gMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgICAgIG91dCA9IChkID09IHMtPmNvdW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBvdXQ7Cit9CisKK2ludCBwaXRfZ2V0X291dChQSVRTdGF0ZSAqcGl0LCBpbnQgY2hhbm5lbCwgaW50NjRfdCBjdXJyZW50X3RpbWUpCit7CisgICAgUElUQ2hhbm5lbFN0YXRlICpzID0gJnBpdC0+Y2hhbm5lbHNbY2hhbm5lbF07CisgICAgcmV0dXJuIHBpdF9nZXRfb3V0MShzLCBjdXJyZW50X3RpbWUpOworfQorCisvKiByZXR1cm4gLTEgaWYgbm8gdHJhbnNpdGlvbiB3aWxsIG9jY3VyLiAgKi8KK3N0YXRpYyBpbnQ2NF90IHBpdF9nZXRfbmV4dF90cmFuc2l0aW9uX3RpbWUoUElUQ2hhbm5lbFN0YXRlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRfdGltZSkKK3sKKyAgICB1aW50NjRfdCBkLCBuZXh0X3RpbWUsIGJhc2U7CisgICAgaW50IHBlcmlvZDI7CisKKyAgICBkID0gbXVsZGl2NjQoY3VycmVudF90aW1lIC0gcy0+Y291bnRfbG9hZF90aW1lLCBQSVRfRlJFUSwgZ2V0X3RpY2tzX3Blcl9zZWMoKSk7CisgICAgc3dpdGNoKHMtPm1vZGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgMDoKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChkIDwgcy0+Y291bnQpCisgICAgICAgICAgICBuZXh0X3RpbWUgPSBzLT5jb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGJhc2UgPSAoZCAvIHMtPmNvdW50KSAqIHMtPmNvdW50OworICAgICAgICBpZiAoKGQgLSBiYXNlKSA9PSAwICYmIGQgIT0gMCkKKyAgICAgICAgICAgIG5leHRfdGltZSA9IGJhc2UgKyBzLT5jb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmV4dF90aW1lID0gYmFzZSArIHMtPmNvdW50ICsgMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBiYXNlID0gKGQgLyBzLT5jb3VudCkgKiBzLT5jb3VudDsKKyAgICAgICAgcGVyaW9kMiA9ICgocy0+Y291bnQgKyAxKSA+PiAxKTsKKyAgICAgICAgaWYgKChkIC0gYmFzZSkgPCBwZXJpb2QyKQorICAgICAgICAgICAgbmV4dF90aW1lID0gYmFzZSArIHBlcmlvZDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5leHRfdGltZSA9IGJhc2UgKyBzLT5jb3VudDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGQgPCBzLT5jb3VudCkKKyAgICAgICAgICAgIG5leHRfdGltZSA9IHMtPmNvdW50OworICAgICAgICBlbHNlIGlmIChkID09IHMtPmNvdW50KQorICAgICAgICAgICAgbmV4dF90aW1lID0gcy0+Y291bnQgKyAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBjb252ZXJ0IHRvIHRpbWVyIHVuaXRzICovCisgICAgbmV4dF90aW1lID0gcy0+Y291bnRfbG9hZF90aW1lICsgbXVsZGl2NjQobmV4dF90aW1lLCBnZXRfdGlja3NfcGVyX3NlYygpLCBQSVRfRlJFUSk7CisgICAgLyogZml4IHBvdGVudGlhbCByb3VuZGluZyBwcm9ibGVtcyAqLworICAgIC8qIFhYWDogYmV0dGVyIHNvbHV0aW9uOiB1c2UgYSBjbG9jayBhdCBQSVRfRlJFUSBIeiAqLworICAgIGlmIChuZXh0X3RpbWUgPD0gY3VycmVudF90aW1lKQorICAgICAgICBuZXh0X3RpbWUgPSBjdXJyZW50X3RpbWUgKyAxOworICAgIHJldHVybiBuZXh0X3RpbWU7Cit9CisKKy8qIHZhbCBtdXN0IGJlIDAgb3IgMSAqLwordm9pZCBwaXRfc2V0X2dhdGUoUElUU3RhdGUgKnBpdCwgaW50IGNoYW5uZWwsIGludCB2YWwpCit7CisgICAgUElUQ2hhbm5lbFN0YXRlICpzID0gJnBpdC0+Y2hhbm5lbHNbY2hhbm5lbF07CisKKyAgICBzd2l0Y2gocy0+bW9kZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgIGNhc2UgNDoKKyAgICAgICAgLyogWFhYOiBqdXN0IGRpc2FibGUvZW5hYmxlIGNvdW50aW5nICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICBjYXNlIDU6CisgICAgICAgIGlmIChzLT5nYXRlIDwgdmFsKSB7CisgICAgICAgICAgICAvKiByZXN0YXJ0IGNvdW50aW5nIG9uIHJpc2luZyBlZGdlICovCisgICAgICAgICAgICBzLT5jb3VudF9sb2FkX3RpbWUgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgICAgICAgICAgcGl0X2lycV90aW1lcl91cGRhdGUocywgcy0+Y291bnRfbG9hZF90aW1lKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgICBpZiAocy0+Z2F0ZSA8IHZhbCkgeworICAgICAgICAgICAgLyogcmVzdGFydCBjb3VudGluZyBvbiByaXNpbmcgZWRnZSAqLworICAgICAgICAgICAgcy0+Y291bnRfbG9hZF90aW1lID0gcWVtdV9jbG9ja19nZXRfbnMoUUVNVV9DTE9DS19WSVJUVUFMKTsKKyAgICAgICAgICAgIHBpdF9pcnFfdGltZXJfdXBkYXRlKHMsIHMtPmNvdW50X2xvYWRfdGltZSk7CisgICAgICAgIH0KKyAgICAgICAgLyogWFhYOiBkaXNhYmxlL2VuYWJsZSBjb3VudGluZyAqLworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcy0+Z2F0ZSA9IHZhbDsKK30KKworaW50IHBpdF9nZXRfZ2F0ZShQSVRTdGF0ZSAqcGl0LCBpbnQgY2hhbm5lbCkKK3sKKyAgICBQSVRDaGFubmVsU3RhdGUgKnMgPSAmcGl0LT5jaGFubmVsc1tjaGFubmVsXTsKKyAgICByZXR1cm4gcy0+Z2F0ZTsKK30KKworaW50IHBpdF9nZXRfaW5pdGlhbF9jb3VudChQSVRTdGF0ZSAqcGl0LCBpbnQgY2hhbm5lbCkKK3sKKyAgICBQSVRDaGFubmVsU3RhdGUgKnMgPSAmcGl0LT5jaGFubmVsc1tjaGFubmVsXTsKKyAgICByZXR1cm4gcy0+Y291bnQ7Cit9CisKK2ludCBwaXRfZ2V0X21vZGUoUElUU3RhdGUgKnBpdCwgaW50IGNoYW5uZWwpCit7CisgICAgUElUQ2hhbm5lbFN0YXRlICpzID0gJnBpdC0+Y2hhbm5lbHNbY2hhbm5lbF07CisgICAgcmV0dXJuIHMtPm1vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwaXRfbG9hZF9jb3VudChQSVRDaGFubmVsU3RhdGUgKnMsIGludCB2YWwpCit7CisgICAgaWYgKHZhbCA9PSAwKQorICAgICAgICB2YWwgPSAweDEwMDAwOworICAgIHMtPmNvdW50X2xvYWRfdGltZSA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgcy0+Y291bnQgPSB2YWw7CisgICAgcGl0X2lycV90aW1lcl91cGRhdGUocywgcy0+Y291bnRfbG9hZF90aW1lKTsKK30KKworLyogaWYgYWxyZWFkeSBsYXRjaGVkLCBkbyBub3QgbGF0Y2ggYWdhaW4gKi8KK3N0YXRpYyB2b2lkIHBpdF9sYXRjaF9jb3VudChQSVRDaGFubmVsU3RhdGUgKnMpCit7CisgICAgaWYgKCFzLT5jb3VudF9sYXRjaGVkKSB7CisgICAgICAgIHMtPmxhdGNoZWRfY291bnQgPSBwaXRfZ2V0X2NvdW50KHMpOworICAgICAgICBzLT5jb3VudF9sYXRjaGVkID0gcy0+cndfbW9kZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBpdF9pb3BvcnRfd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgUElUU3RhdGUgKnBpdCA9IG9wYXF1ZTsKKyAgICBpbnQgY2hhbm5lbCwgYWNjZXNzOworICAgIFBJVENoYW5uZWxTdGF0ZSAqczsKKworICAgIGFkZHIgJj0gMzsKKyAgICBpZiAoYWRkciA9PSAzKSB7CisgICAgICAgIGNoYW5uZWwgPSB2YWwgPj4gNjsKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gMykgeworICAgICAgICAgICAgLyogcmVhZCBiYWNrIGNvbW1hbmQgKi8KKyAgICAgICAgICAgIGZvcihjaGFubmVsID0gMDsgY2hhbm5lbCA8IDM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgICAgIHMgPSAmcGl0LT5jaGFubmVsc1tjaGFubmVsXTsKKyAgICAgICAgICAgICAgICBpZiAodmFsICYgKDIgPDwgY2hhbm5lbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEodmFsICYgMHgyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpdF9sYXRjaF9jb3VudChzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWwgJiAweDEwKSAmJiAhcy0+c3RhdHVzX2xhdGNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXR1cyBsYXRjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBhZGQgQkNEIGFuZCBudWxsIGNvdW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGF0dXMgPSAgKHBpdF9nZXRfb3V0MShzLCBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpKSA8PCA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnJ3X21vZGUgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tb2RlIDw8IDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5iY2Q7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdGF0dXNfbGF0Y2hlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzID0gJnBpdC0+Y2hhbm5lbHNbY2hhbm5lbF07CisgICAgICAgICAgICBhY2Nlc3MgPSAodmFsID4+IDQpICYgMzsKKyAgICAgICAgICAgIGlmIChhY2Nlc3MgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpdF9sYXRjaF9jb3VudChzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+cndfbW9kZSA9IGFjY2VzczsKKyAgICAgICAgICAgICAgICBzLT5yZWFkX3N0YXRlID0gYWNjZXNzOworICAgICAgICAgICAgICAgIHMtPndyaXRlX3N0YXRlID0gYWNjZXNzOworCisgICAgICAgICAgICAgICAgcy0+bW9kZSA9ICh2YWwgPj4gMSkgJiA3OworICAgICAgICAgICAgICAgIHMtPmJjZCA9IHZhbCAmIDE7CisgICAgICAgICAgICAgICAgLyogWFhYOiB1cGRhdGUgaXJxIHRpbWVyID8gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSAmcGl0LT5jaGFubmVsc1thZGRyXTsKKyAgICAgICAgc3dpdGNoKHMtPndyaXRlX3N0YXRlKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgUldfU1RBVEVfTFNCOgorICAgICAgICAgICAgcGl0X2xvYWRfY291bnQocywgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJXX1NUQVRFX01TQjoKKyAgICAgICAgICAgIHBpdF9sb2FkX2NvdW50KHMsIHZhbCA8PCA4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJXX1NUQVRFX1dPUkQwOgorICAgICAgICAgICAgcy0+d3JpdGVfbGF0Y2ggPSB2YWw7CisgICAgICAgICAgICBzLT53cml0ZV9zdGF0ZSA9IFJXX1NUQVRFX1dPUkQxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUldfU1RBVEVfV09SRDE6CisgICAgICAgICAgICBwaXRfbG9hZF9jb3VudChzLCBzLT53cml0ZV9sYXRjaCB8ICh2YWwgPDwgOCkpOworICAgICAgICAgICAgcy0+d3JpdGVfc3RhdGUgPSBSV19TVEFURV9XT1JEMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdWludDMyX3QgcGl0X2lvcG9ydF9yZWFkKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcikKK3sKKyAgICBQSVRTdGF0ZSAqcGl0ID0gb3BhcXVlOworICAgIGludCByZXQsIGNvdW50OworICAgIFBJVENoYW5uZWxTdGF0ZSAqczsKKworICAgIGFkZHIgJj0gMzsKKyAgICBzID0gJnBpdC0+Y2hhbm5lbHNbYWRkcl07CisgICAgaWYgKHMtPnN0YXR1c19sYXRjaGVkKSB7CisgICAgICAgIHMtPnN0YXR1c19sYXRjaGVkID0gMDsKKyAgICAgICAgcmV0ID0gcy0+c3RhdHVzOworICAgIH0gZWxzZSBpZiAocy0+Y291bnRfbGF0Y2hlZCkgeworICAgICAgICBzd2l0Y2gocy0+Y291bnRfbGF0Y2hlZCkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFJXX1NUQVRFX0xTQjoKKyAgICAgICAgICAgIHJldCA9IHMtPmxhdGNoZWRfY291bnQgJiAweGZmOworICAgICAgICAgICAgcy0+Y291bnRfbGF0Y2hlZCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSV19TVEFURV9NU0I6CisgICAgICAgICAgICByZXQgPSBzLT5sYXRjaGVkX2NvdW50ID4+IDg7CisgICAgICAgICAgICBzLT5jb3VudF9sYXRjaGVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJXX1NUQVRFX1dPUkQwOgorICAgICAgICAgICAgcmV0ID0gcy0+bGF0Y2hlZF9jb3VudCAmIDB4ZmY7CisgICAgICAgICAgICBzLT5jb3VudF9sYXRjaGVkID0gUldfU1RBVEVfTVNCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2gocy0+cmVhZF9zdGF0ZSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIFJXX1NUQVRFX0xTQjoKKyAgICAgICAgICAgIGNvdW50ID0gcGl0X2dldF9jb3VudChzKTsKKyAgICAgICAgICAgIHJldCA9IGNvdW50ICYgMHhmZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJXX1NUQVRFX01TQjoKKyAgICAgICAgICAgIGNvdW50ID0gcGl0X2dldF9jb3VudChzKTsKKyAgICAgICAgICAgIHJldCA9IChjb3VudCA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSV19TVEFURV9XT1JEMDoKKyAgICAgICAgICAgIGNvdW50ID0gcGl0X2dldF9jb3VudChzKTsKKyAgICAgICAgICAgIHJldCA9IGNvdW50ICYgMHhmZjsKKyAgICAgICAgICAgIHMtPnJlYWRfc3RhdGUgPSBSV19TVEFURV9XT1JEMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJXX1NUQVRFX1dPUkQxOgorICAgICAgICAgICAgY291bnQgPSBwaXRfZ2V0X2NvdW50KHMpOworICAgICAgICAgICAgcmV0ID0gKGNvdW50ID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIHMtPnJlYWRfc3RhdGUgPSBSV19TVEFURV9XT1JEMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHBpdF9pcnFfdGltZXJfdXBkYXRlKFBJVENoYW5uZWxTdGF0ZSAqcywgaW50NjRfdCBjdXJyZW50X3RpbWUpCit7CisgICAgaW50NjRfdCBleHBpcmVfdGltZTsKKyAgICBpbnQgaXJxX2xldmVsOworCisgICAgaWYgKCFzLT5pcnFfdGltZXIpCisgICAgICAgIHJldHVybjsKKyAgICBleHBpcmVfdGltZSA9IHBpdF9nZXRfbmV4dF90cmFuc2l0aW9uX3RpbWUocywgY3VycmVudF90aW1lKTsKKyAgICBpcnFfbGV2ZWwgPSBwaXRfZ2V0X291dDEocywgY3VycmVudF90aW1lKTsKKyAgICBxZW11X3NldF9pcnEocy0+aXJxLCBpcnFfbGV2ZWwpOworI2lmZGVmIERFQlVHX1BJVAorICAgIHByaW50ZigiaXJxX2xldmVsPSVkIG5leHRfZGVsYXk9JWZcbiIsCisgICAgICAgICAgIGlycV9sZXZlbCwKKyAgICAgICAgICAgKGRvdWJsZSkoZXhwaXJlX3RpbWUgLSBjdXJyZW50X3RpbWUpIC8gZ2V0X3RpY2tzX3Blcl9zZWMoKSk7CisjZW5kaWYKKyAgICBzLT5uZXh0X3RyYW5zaXRpb25fdGltZSA9IGV4cGlyZV90aW1lOworICAgIGlmIChleHBpcmVfdGltZSAhPSAtMSkKKyAgICAgICAgdGltZXJfbW9kKHMtPmlycV90aW1lciwgZXhwaXJlX3RpbWUpOworICAgIGVsc2UKKyAgICAgICAgdGltZXJfZGVsKHMtPmlycV90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHBpdF9pcnFfdGltZXIodm9pZCAqb3BhcXVlKQoreworICAgIFBJVENoYW5uZWxTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHBpdF9pcnFfdGltZXJfdXBkYXRlKHMsIHMtPm5leHRfdHJhbnNpdGlvbl90aW1lKTsKK30KKworc3RhdGljIHZvaWQgcGl0X3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQSVRTdGF0ZSAqcGl0ID0gb3BhcXVlOworICAgIFBJVENoYW5uZWxTdGF0ZSAqczsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBzID0gJnBpdC0+Y2hhbm5lbHNbaV07CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+Y291bnQpOworICAgICAgICBxZW11X3B1dF9iZTE2cyhmLCAmcy0+bGF0Y2hlZF9jb3VudCk7CisgICAgICAgIHFlbXVfcHV0XzhzKGYsICZzLT5jb3VudF9sYXRjaGVkKTsKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnN0YXR1c19sYXRjaGVkKTsKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnN0YXR1cyk7CisgICAgICAgIHFlbXVfcHV0XzhzKGYsICZzLT5yZWFkX3N0YXRlKTsKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPndyaXRlX3N0YXRlKTsKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPndyaXRlX2xhdGNoKTsKKyAgICAgICAgcWVtdV9wdXRfOHMoZiwgJnMtPnJ3X21vZGUpOworICAgICAgICBxZW11X3B1dF84cyhmLCAmcy0+bW9kZSk7CisgICAgICAgIHFlbXVfcHV0XzhzKGYsICZzLT5iY2QpOworICAgICAgICBxZW11X3B1dF84cyhmLCAmcy0+Z2F0ZSk7CisgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+Y291bnRfbG9hZF90aW1lKTsKKyAgICAgICAgaWYgKHMtPmlycV90aW1lcikgeworICAgICAgICAgICAgcWVtdV9wdXRfYmU2NChmLCBzLT5uZXh0X3RyYW5zaXRpb25fdGltZSk7CisgICAgICAgICAgICB0aW1lcl9wdXQoZiwgcy0+aXJxX3RpbWVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBwaXRfbG9hZChRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCkKK3sKKyAgICBQSVRTdGF0ZSAqcGl0ID0gb3BhcXVlOworICAgIFBJVENoYW5uZWxTdGF0ZSAqczsKKyAgICBpbnQgaTsKKworICAgIGlmICh2ZXJzaW9uX2lkICE9IDEpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHMgPSAmcGl0LT5jaGFubmVsc1tpXTsKKyAgICAgICAgcy0+Y291bnQ9cWVtdV9nZXRfYmUzMihmKTsKKyAgICAgICAgcWVtdV9nZXRfYmUxNnMoZiwgJnMtPmxhdGNoZWRfY291bnQpOworICAgICAgICBxZW11X2dldF84cyhmLCAmcy0+Y291bnRfbGF0Y2hlZCk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5zdGF0dXNfbGF0Y2hlZCk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5zdGF0dXMpOworICAgICAgICBxZW11X2dldF84cyhmLCAmcy0+cmVhZF9zdGF0ZSk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT53cml0ZV9zdGF0ZSk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT53cml0ZV9sYXRjaCk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5yd19tb2RlKTsKKyAgICAgICAgcWVtdV9nZXRfOHMoZiwgJnMtPm1vZGUpOworICAgICAgICBxZW11X2dldF84cyhmLCAmcy0+YmNkKTsKKyAgICAgICAgcWVtdV9nZXRfOHMoZiwgJnMtPmdhdGUpOworICAgICAgICBzLT5jb3VudF9sb2FkX3RpbWU9cWVtdV9nZXRfYmU2NChmKTsKKyAgICAgICAgaWYgKHMtPmlycV90aW1lcikgeworICAgICAgICAgICAgcy0+bmV4dF90cmFuc2l0aW9uX3RpbWU9cWVtdV9nZXRfYmU2NChmKTsKKyAgICAgICAgICAgIHRpbWVyX2dldChmLCBzLT5pcnFfdGltZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaXRfcmVzZXQodm9pZCAqb3BhcXVlKQoreworICAgIFBJVFN0YXRlICpwaXQgPSBvcGFxdWU7CisgICAgUElUQ2hhbm5lbFN0YXRlICpzOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwO2kgPCAzOyBpKyspIHsKKyAgICAgICAgcyA9ICZwaXQtPmNoYW5uZWxzW2ldOworICAgICAgICBzLT5tb2RlID0gMzsKKyAgICAgICAgcy0+Z2F0ZSA9IChpICE9IDIpOworICAgICAgICBwaXRfbG9hZF9jb3VudChzLCAwKTsKKyAgICB9Cit9CisKKy8qIFdoZW4gSFBFVCBpcyBvcGVyYXRpbmcgaW4gbGVnYWN5IG1vZGUsIGk4MjU0IHRpbWVyMCBpcyBkaXNhYmxlZCAqLwordm9pZCBocGV0X3BpdF9kaXNhYmxlKHZvaWQpIHsKKyAgICBQSVRDaGFubmVsU3RhdGUgKnM7CisgICAgcyA9ICZwaXRfc3RhdGUuY2hhbm5lbHNbMF07CisgICAgaWYgKHMtPmlycV90aW1lcikKKyAgICAgICAgdGltZXJfZGVsKHMtPmlycV90aW1lcik7Cit9CisKKy8qIFdoZW4gSFBFVCBpcyByZXNldCBvciBsZWF2aW5nIGxlZ2FjeSBtb2RlLCBpdCBtdXN0IHJlZW5hYmxlIGk4MjU0CisgKiB0aW1lciAwCisgKi8KKwordm9pZCBocGV0X3BpdF9lbmFibGUodm9pZCkKK3sKKyAgICBQSVRTdGF0ZSAqcGl0ID0gJnBpdF9zdGF0ZTsKKyAgICBQSVRDaGFubmVsU3RhdGUgKnM7CisgICAgcyA9ICZwaXQtPmNoYW5uZWxzWzBdOworICAgIHMtPm1vZGUgPSAzOworICAgIHMtPmdhdGUgPSAxOworICAgIHBpdF9sb2FkX2NvdW50KHMsIDApOworfQorCitQSVRTdGF0ZSAqcGl0X2luaXQoaW50IGJhc2UsIHFlbXVfaXJxIGlycSkKK3sKKyAgICBQSVRTdGF0ZSAqcGl0ID0gJnBpdF9zdGF0ZTsKKyAgICBQSVRDaGFubmVsU3RhdGUgKnM7CisKKyAgICBzID0gJnBpdC0+Y2hhbm5lbHNbMF07CisgICAgLyogdGhlIHRpbWVyIDAgaXMgY29ubmVjdGVkIHRvIGFuIElSUSAqLworICAgIHMtPmlycV90aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLCBwaXRfaXJxX3RpbWVyLCBzKTsKKyAgICBzLT5pcnEgPSBpcnE7CisKKyAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwgImk4MjU0IiwgYmFzZSwgMSwgcGl0X3NhdmUsIHBpdF9sb2FkLCBwaXQpOworCisgICAgcWVtdV9yZWdpc3Rlcl9yZXNldChwaXRfcmVzZXQsIDAsIHBpdCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGJhc2UsIDQsIDEsIHBpdF9pb3BvcnRfd3JpdGUsIHBpdCk7CisgICAgcmVnaXN0ZXJfaW9wb3J0X3JlYWQoYmFzZSwgMywgMSwgcGl0X2lvcG9ydF9yZWFkLCBwaXQpOworCisgICAgcGl0X3Jlc2V0KHBpdCk7CisKKyAgICByZXR1cm4gcGl0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9ody90aW1lci9tYzE0NjgxOHJ0Yy5jIGIvYW5kcm9pZC9xZW11MS9ody90aW1lci9tYzE0NjgxOHJ0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGEwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2h3L3RpbWVyL21jMTQ2ODE4cnRjLmMKQEAgLTAsMCArMSw3NjYgQEAKKy8qCisgKiBRRU1VIE1DMTQ2ODE4IFJUQyBlbXVsYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAiaHcvaTM4Ni9wYy5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKy8vI2luY2x1ZGUgImhwZXRfZW11bC5oIgorCisvLyNkZWZpbmUgREVCVUdfQ01PUworCisjZGVmaW5lIFJUQ19TRUNPTkRTICAgICAgICAgICAgIDAKKyNkZWZpbmUgUlRDX1NFQ09ORFNfQUxBUk0gICAgICAgMQorI2RlZmluZSBSVENfTUlOVVRFUyAgICAgICAgICAgICAyCisjZGVmaW5lIFJUQ19NSU5VVEVTX0FMQVJNICAgICAgIDMKKyNkZWZpbmUgUlRDX0hPVVJTICAgICAgICAgICAgICAgNAorI2RlZmluZSBSVENfSE9VUlNfQUxBUk0gICAgICAgICA1CisjZGVmaW5lIFJUQ19BTEFSTV9ET05UX0NBUkUgICAgMHhDMAorCisjZGVmaW5lIFJUQ19EQVlfT0ZfV0VFSyAgICAgICAgIDYKKyNkZWZpbmUgUlRDX0RBWV9PRl9NT05USCAgICAgICAgNworI2RlZmluZSBSVENfTU9OVEggICAgICAgICAgICAgICA4CisjZGVmaW5lIFJUQ19ZRUFSICAgICAgICAgICAgICAgIDkKKworI2RlZmluZSBSVENfUkVHX0EgICAgICAgICAgICAgICAxMAorI2RlZmluZSBSVENfUkVHX0IgICAgICAgICAgICAgICAxMQorI2RlZmluZSBSVENfUkVHX0MgICAgICAgICAgICAgICAxMgorI2RlZmluZSBSVENfUkVHX0QgICAgICAgICAgICAgICAxMworCisjZGVmaW5lIFJFR19BX1VJUCAweDgwCisKKyNkZWZpbmUgUkVHX0JfU0VUICAweDgwCisjZGVmaW5lIFJFR19CX1BJRSAgMHg0MAorI2RlZmluZSBSRUdfQl9BSUUgIDB4MjAKKyNkZWZpbmUgUkVHX0JfVUlFICAweDEwCisjZGVmaW5lIFJFR19CX1NRV0UgMHgwOAorI2RlZmluZSBSRUdfQl9ETSAgIDB4MDQKKworI2RlZmluZSBSRUdfQ19VRiAgIDB4MTAKKyNkZWZpbmUgUkVHX0NfSVJRRiAweDgwCisjZGVmaW5lIFJFR19DX1BGICAgMHg0MAorI2RlZmluZSBSRUdfQ19BRiAgIDB4MjAKKworc3RydWN0IFJUQ1N0YXRlIHsKKyAgICB1aW50OF90IGNtb3NfZGF0YVsxMjhdOworICAgIHVpbnQ4X3QgY21vc19pbmRleDsKKyAgICBzdHJ1Y3QgdG0gY3VycmVudF90bTsKKyAgICBpbnQgYmFzZV95ZWFyOworICAgIHFlbXVfaXJxIGlycTsKKyAgICBxZW11X2lycSBzcXdfaXJxOworICAgIGludCBpdF9zaGlmdDsKKyAgICAvKiBwZXJpb2RpYyB0aW1lciAqLworICAgIFFFTVVUaW1lciAqcGVyaW9kaWNfdGltZXI7CisgICAgaW50NjRfdCBuZXh0X3BlcmlvZGljX3RpbWU7CisgICAgLyogc2Vjb25kIHVwZGF0ZSAqLworICAgIGludDY0X3QgbmV4dF9zZWNvbmRfdGltZTsKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgIHVpbnQzMl90IGlycV9jb2FsZXNjZWQ7CisgICAgdWludDMyX3QgcGVyaW9kOworICAgIFFFTVVUaW1lciAqY29hbGVzY2VkX3RpbWVyOworI2VuZGlmCisgICAgUUVNVVRpbWVyICpzZWNvbmRfdGltZXI7CisgICAgUUVNVVRpbWVyICpzZWNvbmRfdGltZXIyOworfTsKKworc3RhdGljIHZvaWQgcnRjX2lycV9yYWlzZShxZW11X2lycSBpcnEpIHsKKyAgICAvKiBXaGVuIEhQRVQgaXMgb3BlcmF0aW5nIGluIGxlZ2FjeSBtb2RlLCBSVEMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQKKyAgICAgKiBXZSBibG9jayBxZW11X2lycV9yYWlzZSwgYnV0IG5vdCBxZW11X2lycV9sb3dlciwgaW4gY2FzZSBsZWdhY3kKKyAgICAgKiBtb2RlIGlzIGVzdGFibGlzaGVkIHdoaWxlIGludGVycnVwdCBpcyByYWlzZWQuIFdlIHdhbnQgaXQgdG8KKyAgICAgKiBiZSBsb3dlcmVkIGluIGFueSBjYXNlCisgICAgICovCisjaWZuZGVmIENPTkZJR19BTkRST0lECisjaWYgZGVmaW5lZCBUQVJHRVRfSTM4NiB8fCBkZWZpbmVkIFRBUkdFVF9YODZfNjQKKyAgICBpZiAoIWhwZXRfaW5fbGVnYWN5X21vZGUoKSkKKyNlbmRpZgorI2VuZGlmCisgICAgICAgIHFlbXVfaXJxX3JhaXNlKGlycSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y19zZXRfdGltZShSVENTdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBydGNfY29weV9kYXRlKFJUQ1N0YXRlICpzKTsKKworI2lmZGVmIFRBUkdFVF9JMzg2CitzdGF0aWMgdm9pZCBydGNfY29hbGVzY2VkX3RpbWVyX3VwZGF0ZShSVENTdGF0ZSAqcykKK3sKKyAgICBpZiAocy0+aXJxX2NvYWxlc2NlZCA9PSAwKSB7CisgICAgICAgIHRpbWVyX2RlbChzLT5jb2FsZXNjZWRfdGltZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGRpdmlkZSBlYWNoIFJUQyBpbnRlcnZhbCB0byAyIC0gOCBzbWFsbGVyIGludGVydmFscyAqLworICAgICAgICBpbnQgYyA9IE1JTihzLT5pcnFfY29hbGVzY2VkLCA3KSArIDE7CisgICAgICAgIGludDY0X3QgbmV4dF9jbG9jayA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCkgKworCQltdWxkaXY2NChzLT5wZXJpb2QgLyBjLCBnZXRfdGlja3NfcGVyX3NlYygpLCAzMjc2OCk7CisgICAgICAgIHRpbWVyX21vZChzLT5jb2FsZXNjZWRfdGltZXIsIG5leHRfY2xvY2spOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcnRjX2NvYWxlc2NlZF90aW1lcih2b2lkICpvcGFxdWUpCit7CisgICAgUlRDU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBpZiAocy0+aXJxX2NvYWxlc2NlZCAhPSAwKSB7CisgICAgICAgIGFwaWNfcmVzZXRfaXJxX2RlbGl2ZXJlZCgpOworICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19DXSB8PSAweGMwOworICAgICAgICBydGNfaXJxX3JhaXNlKHMtPmlycSk7CisgICAgICAgIGlmIChhcGljX2dldF9pcnFfZGVsaXZlcmVkKCkpIHsKKyAgICAgICAgICAgIHMtPmlycV9jb2FsZXNjZWQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJ0Y19jb2FsZXNjZWRfdGltZXJfdXBkYXRlKHMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0Y190aW1lcl91cGRhdGUoUlRDU3RhdGUgKnMsIGludDY0X3QgY3VycmVudF90aW1lKQoreworICAgIGludCBwZXJpb2RfY29kZSwgcGVyaW9kOworICAgIGludDY0X3QgY3VyX2Nsb2NrLCBuZXh0X2lycV9jbG9jazsKKyAgICBpbnQgZW5hYmxlX3BpZTsKKworICAgIHBlcmlvZF9jb2RlID0gcy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gJiAweDBmOworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorI2lmIGRlZmluZWQgVEFSR0VUX0kzODYgfHwgZGVmaW5lZCBUQVJHRVRfWDg2XzY0CisgICAgLyogZGlzYWJsZSBwZXJpb2RpYyB0aW1lciBpZiBocGV0IGlzIGluIGxlZ2FjeSBtb2RlLCBzaW5jZSBpbnRlcnJ1cHRzIGFyZQorICAgICAqIGRpc2FibGVkIGFueXdheS4KKyAgICAgKi8KKyAgICBlbmFibGVfcGllID0gIWhwZXRfaW5fbGVnYWN5X21vZGUoKTsKKyNlbHNlCisgICAgZW5hYmxlX3BpZSA9IDE7CisjZW5kaWYKKyNlbmRpZgorICAgIGVuYWJsZV9waWUgPSAxOworCisgICAgaWYgKHBlcmlvZF9jb2RlICE9IDAKKyAgICAgICAgJiYgKCgocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiBSRUdfQl9QSUUpICYmIGVuYWJsZV9waWUpCisgICAgICAgICAgICB8fCAoKHMtPmNtb3NfZGF0YVtSVENfUkVHX0JdICYgUkVHX0JfU1FXRSkgJiYgcy0+c3F3X2lycSkpKSB7CisgICAgICAgIGlmIChwZXJpb2RfY29kZSA8PSAyKQorICAgICAgICAgICAgcGVyaW9kX2NvZGUgKz0gNzsKKyAgICAgICAgLyogcGVyaW9kIGluIDMyIEtoeiBjeWNsZXMgKi8KKyAgICAgICAgcGVyaW9kID0gMSA8PCAocGVyaW9kX2NvZGUgLSAxKTsKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgICAgICBpZihwZXJpb2QgIT0gcy0+cGVyaW9kKQorICAgICAgICAgICAgcy0+aXJxX2NvYWxlc2NlZCA9IChzLT5pcnFfY29hbGVzY2VkICogcy0+cGVyaW9kKSAvIHBlcmlvZDsKKyAgICAgICAgcy0+cGVyaW9kID0gcGVyaW9kOworI2VuZGlmCisgICAgICAgIC8qIGNvbXB1dGUgMzIga2h6IGNsb2NrICovCisgICAgICAgIGN1cl9jbG9jayA9IG11bGRpdjY0KGN1cnJlbnRfdGltZSwgMzI3NjgsIGdldF90aWNrc19wZXJfc2VjKCkpOworICAgICAgICBuZXh0X2lycV9jbG9jayA9IChjdXJfY2xvY2sgJiB+KHBlcmlvZCAtIDEpKSArIHBlcmlvZDsKKyAgICAgICAgcy0+bmV4dF9wZXJpb2RpY190aW1lID0gbXVsZGl2NjQobmV4dF9pcnFfY2xvY2ssIGdldF90aWNrc19wZXJfc2VjKCksIDMyNzY4KSArIDE7CisgICAgICAgIHRpbWVyX21vZChzLT5wZXJpb2RpY190aW1lciwgcy0+bmV4dF9wZXJpb2RpY190aW1lKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgIHMtPmlycV9jb2FsZXNjZWQgPSAwOworI2VuZGlmCisgICAgICAgIHRpbWVyX2RlbChzLT5wZXJpb2RpY190aW1lcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydGNfcGVyaW9kaWNfdGltZXIodm9pZCAqb3BhcXVlKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgcnRjX3RpbWVyX3VwZGF0ZShzLCBzLT5uZXh0X3BlcmlvZGljX3RpbWUpOworICAgIGlmIChzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmIFJFR19CX1BJRSkgeworICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19DXSB8PSAweGMwOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgIGlmKHJ0Y190ZF9oYWNrKSB7CisgICAgICAgICAgICBhcGljX3Jlc2V0X2lycV9kZWxpdmVyZWQoKTsKKyAgICAgICAgICAgIHJ0Y19pcnFfcmFpc2Uocy0+aXJxKTsKKyAgICAgICAgICAgIGlmICghYXBpY19nZXRfaXJxX2RlbGl2ZXJlZCgpKSB7CisgICAgICAgICAgICAgICAgcy0+aXJxX2NvYWxlc2NlZCsrOworICAgICAgICAgICAgICAgIHJ0Y19jb2FsZXNjZWRfdGltZXJfdXBkYXRlKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICBydGNfaXJxX3JhaXNlKHMtPmlycSk7CisgICAgfQorICAgIGlmIChzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmIFJFR19CX1NRV0UpIHsKKyAgICAgICAgLyogTm90IHNxdWFyZSB3YXZlIGF0IGFsbCBidXQgd2UgZG9uJ3Qgd2FudCAyMDQ4SHogaW50ZXJydXB0cyEKKyAgICAgICAgICAgTXVzdCBiZSBzZWVuIGFzIGEgcHVsc2UuICAqLworICAgICAgICBxZW11X2lycV9yYWlzZShzLT5zcXdfaXJxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNtb3NfaW9wb3J0X3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgZGF0YSkKK3sKKyAgICBSVENTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIGlmICgoYWRkciAmIDEpID09IDApIHsKKyAgICAgICAgcy0+Y21vc19pbmRleCA9IGRhdGEgJiAweDdmOworICAgIH0gZWxzZSB7CisjaWZkZWYgREVCVUdfQ01PUworICAgICAgICBwcmludGYoImNtb3M6IHdyaXRlIGluZGV4PTB4JTAyeCB2YWw9MHglMDJ4XG4iLAorICAgICAgICAgICAgICAgcy0+Y21vc19pbmRleCwgZGF0YSk7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoKHMtPmNtb3NfaW5kZXgpIHsKKyAgICAgICAgY2FzZSBSVENfU0VDT05EU19BTEFSTToKKyAgICAgICAgY2FzZSBSVENfTUlOVVRFU19BTEFSTToKKyAgICAgICAgY2FzZSBSVENfSE9VUlNfQUxBUk06CisgICAgICAgICAgICAvKiBYWFg6IG5vdCBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XSA9IGRhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVENfU0VDT05EUzoKKyAgICAgICAgY2FzZSBSVENfTUlOVVRFUzoKKyAgICAgICAgY2FzZSBSVENfSE9VUlM6CisgICAgICAgIGNhc2UgUlRDX0RBWV9PRl9XRUVLOgorICAgICAgICBjYXNlIFJUQ19EQVlfT0ZfTU9OVEg6CisgICAgICAgIGNhc2UgUlRDX01PTlRIOgorICAgICAgICBjYXNlIFJUQ19ZRUFSOgorICAgICAgICAgICAgcy0+Y21vc19kYXRhW3MtPmNtb3NfaW5kZXhdID0gZGF0YTsKKyAgICAgICAgICAgIC8qIGlmIGluIHNldCBtb2RlLCBkbyBub3QgdXBkYXRlIHRoZSB0aW1lICovCisgICAgICAgICAgICBpZiAoIShzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmIFJFR19CX1NFVCkpIHsKKyAgICAgICAgICAgICAgICBydGNfc2V0X3RpbWUocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVENfUkVHX0E6CisgICAgICAgICAgICAvKiBVSVAgYml0IGlzIHJlYWQgb25seSAqLworICAgICAgICAgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gPSAoZGF0YSAmIH5SRUdfQV9VSVApIHwKKyAgICAgICAgICAgICAgICAocy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gJiBSRUdfQV9VSVApOworICAgICAgICAgICAgcnRjX3RpbWVyX3VwZGF0ZShzLCBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUQ19SRUdfQjoKKyAgICAgICAgICAgIGlmIChkYXRhICYgUkVHX0JfU0VUKSB7CisgICAgICAgICAgICAgICAgLyogc2V0IG1vZGU6IHJlc2V0IFVJUCBtb2RlICovCisgICAgICAgICAgICAgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gJj0gflJFR19BX1VJUDsKKyAgICAgICAgICAgICAgICBkYXRhICY9IH5SRUdfQl9VSUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGlmIGRpc2FibGluZyBzZXQgbW9kZSwgdXBkYXRlIHRoZSB0aW1lICovCisgICAgICAgICAgICAgICAgaWYgKHMtPmNtb3NfZGF0YVtSVENfUkVHX0JdICYgUkVHX0JfU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIHJ0Y19zZXRfdGltZShzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSA9IGRhdGE7CisgICAgICAgICAgICBydGNfdGltZXJfdXBkYXRlKHMsIHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlRDX1JFR19DOgorICAgICAgICBjYXNlIFJUQ19SRUdfRDoKKyAgICAgICAgICAgIC8qIGNhbm5vdCB3cml0ZSB0byB0aGVtICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XSA9IGRhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgcnRjX3RvX2JjZChSVENTdGF0ZSAqcywgaW50IGEpCit7CisgICAgaWYgKHMtPmNtb3NfZGF0YVtSVENfUkVHX0JdICYgUkVHX0JfRE0pIHsKKyAgICAgICAgcmV0dXJuIGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICgoYSAvIDEwKSA8PCA0KSB8IChhICUgMTApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgcnRjX2Zyb21fYmNkKFJUQ1N0YXRlICpzLCBpbnQgYSkKK3sKKyAgICBpZiAocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiBSRUdfQl9ETSkgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKChhID4+IDQpICogMTApICsgKGEgJiAweDBmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y19zZXRfdGltZShSVENTdGF0ZSAqcykKK3sKKyAgICBzdHJ1Y3QgdG0gKnRtID0gJnMtPmN1cnJlbnRfdG07CisKKyAgICB0bS0+dG1fc2VjID0gcnRjX2Zyb21fYmNkKHMsIHMtPmNtb3NfZGF0YVtSVENfU0VDT05EU10pOworICAgIHRtLT50bV9taW4gPSBydGNfZnJvbV9iY2Qocywgcy0+Y21vc19kYXRhW1JUQ19NSU5VVEVTXSk7CisgICAgdG0tPnRtX2hvdXIgPSBydGNfZnJvbV9iY2Qocywgcy0+Y21vc19kYXRhW1JUQ19IT1VSU10gJiAweDdmKTsKKyAgICBpZiAoIShzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmIDB4MDIpICYmCisgICAgICAgIChzLT5jbW9zX2RhdGFbUlRDX0hPVVJTXSAmIDB4ODApKSB7CisgICAgICAgIHRtLT50bV9ob3VyICs9IDEyOworICAgIH0KKyAgICB0bS0+dG1fd2RheSA9IHJ0Y19mcm9tX2JjZChzLCBzLT5jbW9zX2RhdGFbUlRDX0RBWV9PRl9XRUVLXSkgLSAxOworICAgIHRtLT50bV9tZGF5ID0gcnRjX2Zyb21fYmNkKHMsIHMtPmNtb3NfZGF0YVtSVENfREFZX09GX01PTlRIXSk7CisgICAgdG0tPnRtX21vbiA9IHJ0Y19mcm9tX2JjZChzLCBzLT5jbW9zX2RhdGFbUlRDX01PTlRIXSkgLSAxOworICAgIHRtLT50bV95ZWFyID0gcnRjX2Zyb21fYmNkKHMsIHMtPmNtb3NfZGF0YVtSVENfWUVBUl0pICsgcy0+YmFzZV95ZWFyIC0gMTkwMDsKK30KKworc3RhdGljIHZvaWQgcnRjX2NvcHlfZGF0ZShSVENTdGF0ZSAqcykKK3sKKyAgICBjb25zdCBzdHJ1Y3QgdG0gKnRtID0gJnMtPmN1cnJlbnRfdG07CisgICAgaW50IHllYXI7CisKKyAgICBzLT5jbW9zX2RhdGFbUlRDX1NFQ09ORFNdID0gcnRjX3RvX2JjZChzLCB0bS0+dG1fc2VjKTsKKyAgICBzLT5jbW9zX2RhdGFbUlRDX01JTlVURVNdID0gcnRjX3RvX2JjZChzLCB0bS0+dG1fbWluKTsKKyAgICBpZiAocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiAweDAyKSB7CisgICAgICAgIC8qIDI0IGhvdXIgZm9ybWF0ICovCisgICAgICAgIHMtPmNtb3NfZGF0YVtSVENfSE9VUlNdID0gcnRjX3RvX2JjZChzLCB0bS0+dG1faG91cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMTIgaG91ciBmb3JtYXQgKi8KKyAgICAgICAgcy0+Y21vc19kYXRhW1JUQ19IT1VSU10gPSBydGNfdG9fYmNkKHMsIHRtLT50bV9ob3VyICUgMTIpOworICAgICAgICBpZiAodG0tPnRtX2hvdXIgPj0gMTIpCisgICAgICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX0hPVVJTXSB8PSAweDgwOworICAgIH0KKyAgICBzLT5jbW9zX2RhdGFbUlRDX0RBWV9PRl9XRUVLXSA9IHJ0Y190b19iY2QocywgdG0tPnRtX3dkYXkgKyAxKTsKKyAgICBzLT5jbW9zX2RhdGFbUlRDX0RBWV9PRl9NT05USF0gPSBydGNfdG9fYmNkKHMsIHRtLT50bV9tZGF5KTsKKyAgICBzLT5jbW9zX2RhdGFbUlRDX01PTlRIXSA9IHJ0Y190b19iY2QocywgdG0tPnRtX21vbiArIDEpOworICAgIHllYXIgPSAodG0tPnRtX3llYXIgLSBzLT5iYXNlX3llYXIpICUgMTAwOworICAgIGlmICh5ZWFyIDwgMCkKKyAgICAgICAgeWVhciArPSAxMDA7CisgICAgcy0+Y21vc19kYXRhW1JUQ19ZRUFSXSA9IHJ0Y190b19iY2QocywgeWVhcik7Cit9CisKKy8qIG1vbnRoIGlzIGJldHdlZW4gMCBhbmQgMTEuICovCitzdGF0aWMgaW50IGdldF9kYXlzX2luX21vbnRoKGludCBtb250aCwgaW50IHllYXIpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBkYXlzX3RhYlsxMl0gPSB7CisgICAgICAgIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKKyAgICB9OworICAgIGludCBkOworICAgIGlmICgodW5zaWduZWQgKW1vbnRoID49IDEyKQorICAgICAgICByZXR1cm4gMzE7CisgICAgZCA9IGRheXNfdGFiW21vbnRoXTsKKyAgICBpZiAobW9udGggPT0gMSkgeworICAgICAgICBpZiAoKHllYXIgJSA0KSA9PSAwICYmICgoeWVhciAlIDEwMCkgIT0gMCB8fCAoeWVhciAlIDQwMCkgPT0gMCkpCisgICAgICAgICAgICBkKys7CisgICAgfQorICAgIHJldHVybiBkOworfQorCisvKiB1cGRhdGUgJ3RtJyB0byB0aGUgbmV4dCBzZWNvbmQgKi8KK3N0YXRpYyB2b2lkIHJ0Y19uZXh0X3NlY29uZChzdHJ1Y3QgdG0gKnRtKQoreworICAgIGludCBkYXlzX2luX21vbnRoOworCisgICAgdG0tPnRtX3NlYysrOworICAgIGlmICgodW5zaWduZWQpdG0tPnRtX3NlYyA+PSA2MCkgeworICAgICAgICB0bS0+dG1fc2VjID0gMDsKKyAgICAgICAgdG0tPnRtX21pbisrOworICAgICAgICBpZiAoKHVuc2lnbmVkKXRtLT50bV9taW4gPj0gNjApIHsKKyAgICAgICAgICAgIHRtLT50bV9taW4gPSAwOworICAgICAgICAgICAgdG0tPnRtX2hvdXIrKzsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQpdG0tPnRtX2hvdXIgPj0gMjQpIHsKKyAgICAgICAgICAgICAgICB0bS0+dG1faG91ciA9IDA7CisgICAgICAgICAgICAgICAgLyogbmV4dCBkYXkgKi8KKyAgICAgICAgICAgICAgICB0bS0+dG1fd2RheSsrOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpdG0tPnRtX3dkYXkgPj0gNykKKyAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3dkYXkgPSAwOworICAgICAgICAgICAgICAgIGRheXNfaW5fbW9udGggPSBnZXRfZGF5c19pbl9tb250aCh0bS0+dG1fbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDApOworICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5Kys7CisgICAgICAgICAgICAgICAgaWYgKHRtLT50bV9tZGF5IDwgMSkgeworICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbWRheSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0bS0+dG1fbWRheSA+IGRheXNfaW5fbW9udGgpIHsKKyAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21kYXkgPSAxOworICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uKys7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bS0+dG1fbW9uID49IDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV95ZWFyKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgcnRjX3VwZGF0ZV9zZWNvbmQodm9pZCAqb3BhcXVlKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworICAgIGludDY0X3QgZGVsYXk7CisKKyAgICAvKiBpZiB0aGUgb3NjaWxsYXRvciBpcyBub3QgaW4gbm9ybWFsIG9wZXJhdGlvbiwgd2UgZG8gbm90IHVwZGF0ZSAqLworICAgIGlmICgocy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gJiAweDcwKSAhPSAweDIwKSB7CisgICAgICAgIHMtPm5leHRfc2Vjb25kX3RpbWUgKz0gZ2V0X3RpY2tzX3Blcl9zZWMoKTsKKyAgICAgICAgdGltZXJfbW9kKHMtPnNlY29uZF90aW1lciwgcy0+bmV4dF9zZWNvbmRfdGltZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcnRjX25leHRfc2Vjb25kKCZzLT5jdXJyZW50X3RtKTsKKworICAgICAgICBpZiAoIShzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmIFJFR19CX1NFVCkpIHsKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBpbiBwcm9ncmVzcyBiaXQgKi8KKyAgICAgICAgICAgIHMtPmNtb3NfZGF0YVtSVENfUkVHX0FdIHw9IFJFR19BX1VJUDsKKyAgICAgICAgfQorICAgICAgICAvKiBzaG91bGQgYmUgMjQ0IHVzID0gOCAvIDMyNzY4IHNlY29uZHMsIGJ1dCBjdXJyZW50bHkgdGhlCisgICAgICAgICAgIHRpbWVycyBkbyBub3QgaGF2ZSB0aGUgbmVjZXNzYXJ5IHJlc29sdXRpb24uICovCisgICAgICAgIGRlbGF5ID0gKGdldF90aWNrc19wZXJfc2VjKCkgKiAxKSAvIDEwMDsKKyAgICAgICAgaWYgKGRlbGF5IDwgMSkKKyAgICAgICAgICAgIGRlbGF5ID0gMTsKKyAgICAgICAgdGltZXJfbW9kKHMtPnNlY29uZF90aW1lcjIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm5leHRfc2Vjb25kX3RpbWUgKyBkZWxheSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBydGNfdXBkYXRlX3NlY29uZDIodm9pZCAqb3BhcXVlKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgaWYgKCEocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiBSRUdfQl9TRVQpKSB7CisgICAgICAgIHJ0Y19jb3B5X2RhdGUocyk7CisgICAgfQorCisgICAgLyogY2hlY2sgYWxhcm0gKi8KKyAgICBpZiAocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiBSRUdfQl9BSUUpIHsKKyAgICAgICAgaWYgKCgocy0+Y21vc19kYXRhW1JUQ19TRUNPTkRTX0FMQVJNXSAmIDB4YzApID09IDB4YzAgfHwKKyAgICAgICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX1NFQ09ORFNfQUxBUk1dID09IHMtPmN1cnJlbnRfdG0udG1fc2VjKSAmJgorICAgICAgICAgICAgKChzLT5jbW9zX2RhdGFbUlRDX01JTlVURVNfQUxBUk1dICYgMHhjMCkgPT0gMHhjMCB8fAorICAgICAgICAgICAgIHMtPmNtb3NfZGF0YVtSVENfTUlOVVRFU19BTEFSTV0gPT0gcy0+Y3VycmVudF90bS50bV9tb24pICYmCisgICAgICAgICAgICAoKHMtPmNtb3NfZGF0YVtSVENfSE9VUlNfQUxBUk1dICYgMHhjMCkgPT0gMHhjMCB8fAorICAgICAgICAgICAgIHMtPmNtb3NfZGF0YVtSVENfSE9VUlNfQUxBUk1dID09IHMtPmN1cnJlbnRfdG0udG1faG91cikpIHsKKworICAgICAgICAgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQ10gfD0gMHhhMDsKKyAgICAgICAgICAgIHJ0Y19pcnFfcmFpc2Uocy0+aXJxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHVwZGF0ZSBlbmRlZCBpbnRlcnJ1cHQgKi8KKyAgICBpZiAocy0+Y21vc19kYXRhW1JUQ19SRUdfQl0gJiBSRUdfQl9VSUUpIHsKKyAgICAgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQ10gfD0gMHg5MDsKKyAgICAgICAgcnRjX2lycV9yYWlzZShzLT5pcnEpOworICAgIH0KKworICAgIC8qIGNsZWFyIHVwZGF0ZSBpbiBwcm9ncmVzcyBiaXQgKi8KKyAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19BXSAmPSB+UkVHX0FfVUlQOworCisgICAgcy0+bmV4dF9zZWNvbmRfdGltZSArPSBnZXRfdGlja3NfcGVyX3NlYygpOworICAgIHRpbWVyX21vZChzLT5zZWNvbmRfdGltZXIsIHMtPm5leHRfc2Vjb25kX3RpbWUpOworfQorCitzdGF0aWMgdWludDMyX3QgY21vc19pb3BvcnRfcmVhZCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHIpCit7CisgICAgUlRDU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IHJldDsKKyAgICBpZiAoKGFkZHIgJiAxKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAweGZmOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaChzLT5jbW9zX2luZGV4KSB7CisgICAgICAgIGNhc2UgUlRDX1NFQ09ORFM6CisgICAgICAgIGNhc2UgUlRDX01JTlVURVM6CisgICAgICAgIGNhc2UgUlRDX0hPVVJTOgorICAgICAgICBjYXNlIFJUQ19EQVlfT0ZfV0VFSzoKKyAgICAgICAgY2FzZSBSVENfREFZX09GX01PTlRIOgorICAgICAgICBjYXNlIFJUQ19NT05USDoKKyAgICAgICAgY2FzZSBSVENfWUVBUjoKKyAgICAgICAgICAgIHJldCA9IHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUQ19SRUdfQToKKyAgICAgICAgICAgIHJldCA9IHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJUQ19SRUdfQzoKKyAgICAgICAgICAgIHJldCA9IHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XTsKKyAgICAgICAgICAgIHFlbXVfaXJxX2xvd2VyKHMtPmlycSk7CisgICAgICAgICAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19DXSA9IDB4MDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IHMtPmNtb3NfZGF0YVtzLT5jbW9zX2luZGV4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWZkZWYgREVCVUdfQ01PUworICAgICAgICBwcmludGYoImNtb3M6IHJlYWQgaW5kZXg9MHglMDJ4IHZhbD0weCUwMnhcbiIsCisgICAgICAgICAgICAgICBzLT5jbW9zX2luZGV4LCByZXQpOworI2VuZGlmCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorfQorCit2b2lkIHJ0Y19zZXRfbWVtb3J5KFJUQ1N0YXRlICpzLCBpbnQgYWRkciwgaW50IHZhbCkKK3sKKyAgICBpZiAoYWRkciA+PSAwICYmIGFkZHIgPD0gMTI3KQorICAgICAgICBzLT5jbW9zX2RhdGFbYWRkcl0gPSB2YWw7Cit9CisKK3ZvaWQgcnRjX3NldF9kYXRlKFJUQ1N0YXRlICpzLCBjb25zdCBzdHJ1Y3QgdG0gKnRtKQoreworICAgIHMtPmN1cnJlbnRfdG0gPSAqdG07CisgICAgcnRjX2NvcHlfZGF0ZShzKTsKK30KKworLyogUEMgY21vcyBtYXBwaW5ncyAqLworI2RlZmluZSBSRUdfSUJNX0NFTlRVUllfQllURSAgICAgICAgMHgzMgorI2RlZmluZSBSRUdfSUJNX1BTMl9DRU5UVVJZX0JZVEUgICAgMHgzNworCitzdGF0aWMgdm9pZCBydGNfc2V0X2RhdGVfZnJvbV9ob3N0KFJUQ1N0YXRlICpzKQoreworICAgIHN0cnVjdCB0bSB0bTsKKyAgICBpbnQgdmFsOworCisgICAgLyogc2V0IHRoZSBDTU9TIGRhdGUgKi8KKyAgICBxZW11X2dldF90aW1lZGF0ZSgmdG0sIDApOworICAgIHJ0Y19zZXRfZGF0ZShzLCAmdG0pOworCisgICAgdmFsID0gcnRjX3RvX2JjZChzLCAodG0udG1feWVhciAvIDEwMCkgKyAxOSk7CisgICAgcnRjX3NldF9tZW1vcnkocywgUkVHX0lCTV9DRU5UVVJZX0JZVEUsIHZhbCk7CisgICAgcnRjX3NldF9tZW1vcnkocywgUkVHX0lCTV9QUzJfQ0VOVFVSWV9CWVRFLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBydGNfc2F2ZShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgcWVtdV9wdXRfYnVmZmVyKGYsIHMtPmNtb3NfZGF0YSwgMTI4KTsKKyAgICBxZW11X3B1dF84cyhmLCAmcy0+Y21vc19pbmRleCk7CisKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmN1cnJlbnRfdG0udG1fc2VjKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmN1cnJlbnRfdG0udG1fbWluKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmN1cnJlbnRfdG0udG1faG91cik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5jdXJyZW50X3RtLnRtX3dkYXkpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+Y3VycmVudF90bS50bV9tZGF5KTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmN1cnJlbnRfdG0udG1fbW9uKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHMtPmN1cnJlbnRfdG0udG1feWVhcik7CisKKyAgICB0aW1lcl9wdXQoZiwgcy0+cGVyaW9kaWNfdGltZXIpOworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+bmV4dF9wZXJpb2RpY190aW1lKTsKKworICAgIHFlbXVfcHV0X2JlNjQoZiwgcy0+bmV4dF9zZWNvbmRfdGltZSk7CisgICAgdGltZXJfcHV0KGYsIHMtPnNlY29uZF90aW1lcik7CisgICAgdGltZXJfcHV0KGYsIHMtPnNlY29uZF90aW1lcjIpOworfQorCitzdGF0aWMgaW50IHJ0Y19sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBxZW11X2dldF9idWZmZXIoZiwgcy0+Y21vc19kYXRhLCAxMjgpOworICAgIHFlbXVfZ2V0XzhzKGYsICZzLT5jbW9zX2luZGV4KTsKKworICAgIHMtPmN1cnJlbnRfdG0udG1fc2VjPXFlbXVfZ2V0X2JlMzIoZik7CisgICAgcy0+Y3VycmVudF90bS50bV9taW49cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5jdXJyZW50X3RtLnRtX2hvdXI9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5jdXJyZW50X3RtLnRtX3dkYXk9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5jdXJyZW50X3RtLnRtX21kYXk9cWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5jdXJyZW50X3RtLnRtX21vbj1xZW11X2dldF9iZTMyKGYpOworICAgIHMtPmN1cnJlbnRfdG0udG1feWVhcj1xZW11X2dldF9iZTMyKGYpOworCisgICAgdGltZXJfZ2V0KGYsIHMtPnBlcmlvZGljX3RpbWVyKTsKKyAgICBzLT5uZXh0X3BlcmlvZGljX3RpbWU9cWVtdV9nZXRfYmU2NChmKTsKKworICAgIHMtPm5leHRfc2Vjb25kX3RpbWU9cWVtdV9nZXRfYmU2NChmKTsKKyAgICB0aW1lcl9nZXQoZiwgcy0+c2Vjb25kX3RpbWVyKTsKKyAgICB0aW1lcl9nZXQoZiwgcy0+c2Vjb25kX3RpbWVyMik7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBUQVJHRVRfSTM4Ngorc3RhdGljIHZvaWQgcnRjX3NhdmVfdGQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBSVENTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIHFlbXVfcHV0X2JlMzIoZiwgcy0+aXJxX2NvYWxlc2NlZCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzLT5wZXJpb2QpOworfQorCitzdGF0aWMgaW50IHJ0Y19sb2FkX3RkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBzLT5pcnFfY29hbGVzY2VkID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzLT5wZXJpb2QgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHJ0Y19jb2FsZXNjZWRfdGltZXJfdXBkYXRlKHMpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJ0Y19yZXNldCh2b2lkICpvcGFxdWUpCit7CisgICAgUlRDU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19CXSAmPSB+KFJFR19CX1BJRSB8IFJFR19CX0FJRSB8IFJFR19CX1NRV0UpOworICAgIHMtPmNtb3NfZGF0YVtSVENfUkVHX0NdICY9IH4oUkVHX0NfVUYgfCBSRUdfQ19JUlFGIHwgUkVHX0NfUEYgfCBSRUdfQ19BRik7CisKKyAgICBxZW11X2lycV9sb3dlcihzLT5pcnEpOworCisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICBpZiAocnRjX3RkX2hhY2spCisJICAgIHMtPmlycV9jb2FsZXNjZWQgPSAwOworI2VuZGlmCit9CisKK1JUQ1N0YXRlICpydGNfaW5pdF9zcXcoaW50IGJhc2UsIHFlbXVfaXJxIGlycSwgcWVtdV9pcnEgc3F3X2lycSwgaW50IGJhc2VfeWVhcikKK3sKKyAgICBSVENTdGF0ZSAqczsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFJUQ1N0YXRlKSk7CisKKyAgICBzLT5pcnEgPSBpcnE7CisgICAgcy0+c3F3X2lycSA9IHNxd19pcnE7CisgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gPSAweDI2OworICAgIHMtPmNtb3NfZGF0YVtSVENfUkVHX0JdID0gMHgwMjsKKyAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19DXSA9IDB4MDA7CisgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfRF0gPSAweDgwOworCisgICAgcy0+YmFzZV95ZWFyID0gYmFzZV95ZWFyOworICAgIHJ0Y19zZXRfZGF0ZV9mcm9tX2hvc3Qocyk7CisKKyAgICBzLT5wZXJpb2RpY190aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRjX3BlcmlvZGljX3RpbWVyLCBzKTsKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgIGlmIChydGNfdGRfaGFjaykKKyAgICAgICAgcy0+Y29hbGVzY2VkX3RpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfVklSVFVBTCwgU0NBTEVfTlMsIHJ0Y19jb2FsZXNjZWRfdGltZXIsIHMpOworI2VuZGlmCisgICAgcy0+c2Vjb25kX3RpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfVklSVFVBTCwgU0NBTEVfTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRjX3VwZGF0ZV9zZWNvbmQsIHMpOworICAgIHMtPnNlY29uZF90aW1lcjIgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19WSVJUVUFMLCBTQ0FMRV9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRjX3VwZGF0ZV9zZWNvbmQyLCBzKTsKKworICAgIHMtPm5leHRfc2Vjb25kX3RpbWUgPSBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgKGdldF90aWNrc19wZXJfc2VjKCkgKiA5OSkgLyAxMDA7CisgICAgdGltZXJfbW9kKHMtPnNlY29uZF90aW1lcjIsIHMtPm5leHRfc2Vjb25kX3RpbWUpOworCisgICAgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKGJhc2UsIDIsIDEsIGNtb3NfaW9wb3J0X3dyaXRlLCBzKTsKKyAgICByZWdpc3Rlcl9pb3BvcnRfcmVhZChiYXNlLCAyLCAxLCBjbW9zX2lvcG9ydF9yZWFkLCBzKTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAibWMxNDY4MThydGMiLCBiYXNlLCAxLCBydGNfc2F2ZSwgcnRjX2xvYWQsIHMpOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgaWYgKHJ0Y190ZF9oYWNrKQorICAgICAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYzE0NjgxOHJ0Yy10ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0Y19zYXZlX3RkLAorICAgICAgICAgICAgICAgICAgICAgICAgcnRjX2xvYWRfdGQsCisgICAgICAgICAgICAgICAgICAgICAgICBzKTsKKyNlbmRpZgorICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQocnRjX3Jlc2V0LCAwLCBzKTsKKworICAgIHJldHVybiBzOworfQorCitSVENTdGF0ZSAqcnRjX2luaXQoaW50IGJhc2UsIHFlbXVfaXJxIGlycSwgaW50IGJhc2VfeWVhcikKK3sKKyAgICByZXR1cm4gcnRjX2luaXRfc3F3KGJhc2UsIGlycSwgTlVMTCwgYmFzZV95ZWFyKTsKK30KKworLyogTWVtb3J5IG1hcHBlZCBpbnRlcmZhY2UgKi8KK3N0YXRpYyB1aW50MzJfdCBjbW9zX21tX3JlYWRiICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworCisgICAgcmV0dXJuIGNtb3NfaW9wb3J0X3JlYWQocywgYWRkciA+PiBzLT5pdF9zaGlmdCkgJiAweEZGOworfQorCitzdGF0aWMgdm9pZCBjbW9zX21tX3dyaXRlYiAodm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBSVENTdGF0ZSAqcyA9IG9wYXF1ZTsKKworICAgIGNtb3NfaW9wb3J0X3dyaXRlKHMsIGFkZHIgPj4gcy0+aXRfc2hpZnQsIHZhbHVlICYgMHhGRik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBjbW9zX21tX3JlYWR3ICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworICAgIHVpbnQzMl90IHZhbDsKKworICAgIHZhbCA9IGNtb3NfaW9wb3J0X3JlYWQocywgYWRkciA+PiBzLT5pdF9zaGlmdCkgJiAweEZGRkY7CisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHZhbCA9IGJzd2FwMTYodmFsKTsKKyNlbmRpZgorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNtb3NfbW1fd3JpdGV3ICh2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbHVlKQoreworICAgIFJUQ1N0YXRlICpzID0gb3BhcXVlOworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICB2YWx1ZSA9IGJzd2FwMTYodmFsdWUpOworI2VuZGlmCisgICAgY21vc19pb3BvcnRfd3JpdGUocywgYWRkciA+PiBzLT5pdF9zaGlmdCwgdmFsdWUgJiAweEZGRkYpOworfQorCitzdGF0aWMgdWludDMyX3QgY21vc19tbV9yZWFkbCAodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcikKK3sKKyAgICBSVENTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICB2YWwgPSBjbW9zX2lvcG9ydF9yZWFkKHMsIGFkZHIgPj4gcy0+aXRfc2hpZnQpOworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICB2YWwgPSBic3dhcDMyKHZhbCk7CisjZW5kaWYKKyAgICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBjbW9zX21tX3dyaXRlbCAodm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBSVENTdGF0ZSAqcyA9IG9wYXF1ZTsKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgdmFsdWUgPSBic3dhcDMyKHZhbHVlKTsKKyNlbmRpZgorICAgIGNtb3NfaW9wb3J0X3dyaXRlKHMsIGFkZHIgPj4gcy0+aXRfc2hpZnQsIHZhbHVlKTsKK30KKworc3RhdGljIENQVVJlYWRNZW1vcnlGdW5jICpydGNfbW1fcmVhZFtdID0geworICAgICZjbW9zX21tX3JlYWRiLAorICAgICZjbW9zX21tX3JlYWR3LAorICAgICZjbW9zX21tX3JlYWRsLAorfTsKKworc3RhdGljIENQVVdyaXRlTWVtb3J5RnVuYyAqcnRjX21tX3dyaXRlW10gPSB7CisgICAgJmNtb3NfbW1fd3JpdGViLAorICAgICZjbW9zX21tX3dyaXRldywKKyAgICAmY21vc19tbV93cml0ZWwsCit9OworCitSVENTdGF0ZSAqcnRjX21tX2luaXQoaHdhZGRyIGJhc2UsIGludCBpdF9zaGlmdCwgcWVtdV9pcnEgaXJxLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlX3llYXIpCit7CisgICAgUlRDU3RhdGUgKnM7CisgICAgaW50IGlvX21lbW9yeTsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFJUQ1N0YXRlKSk7CisKKyAgICBzLT5pcnEgPSBpcnE7CisgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfQV0gPSAweDI2OworICAgIHMtPmNtb3NfZGF0YVtSVENfUkVHX0JdID0gMHgwMjsKKyAgICBzLT5jbW9zX2RhdGFbUlRDX1JFR19DXSA9IDB4MDA7CisgICAgcy0+Y21vc19kYXRhW1JUQ19SRUdfRF0gPSAweDgwOworCisgICAgcy0+YmFzZV95ZWFyID0gYmFzZV95ZWFyOworICAgIHJ0Y19zZXRfZGF0ZV9mcm9tX2hvc3Qocyk7CisKKyAgICBzLT5wZXJpb2RpY190aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRjX3BlcmlvZGljX3RpbWVyLCBzKTsKKyAgICBzLT5zZWNvbmRfdGltZXIgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19WSVJUVUFMLCBTQ0FMRV9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGNfdXBkYXRlX3NlY29uZCwgcyk7CisgICAgcy0+c2Vjb25kX3RpbWVyMiA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGNfdXBkYXRlX3NlY29uZDIsIHMpOworCisgICAgcy0+bmV4dF9zZWNvbmRfdGltZSA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCkgKyAoZ2V0X3RpY2tzX3Blcl9zZWMoKSAqIDk5KSAvIDEwMDsKKyAgICB0aW1lcl9tb2Qocy0+c2Vjb25kX3RpbWVyMiwgcy0+bmV4dF9zZWNvbmRfdGltZSk7CisKKyAgICBpb19tZW1vcnkgPSBjcHVfcmVnaXN0ZXJfaW9fbWVtb3J5KHJ0Y19tbV9yZWFkLCBydGNfbW1fd3JpdGUsIHMpOworICAgIGNwdV9yZWdpc3Rlcl9waHlzaWNhbF9tZW1vcnkoYmFzZSwgMiA8PCBpdF9zaGlmdCwgaW9fbWVtb3J5KTsKKworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAibWMxNDY4MThydGMiLCBiYXNlLCAxLCBydGNfc2F2ZSwgcnRjX2xvYWQsIHMpOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgaWYgKHJ0Y190ZF9oYWNrKQorICAgICAgICByZWdpc3Rlcl9zYXZldm0oTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYzE0NjgxOHJ0Yy10ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0Y19zYXZlX3RkLAorICAgICAgICAgICAgICAgICAgICAgICAgcnRjX2xvYWRfdGQsCisgICAgICAgICAgICAgICAgICAgICAgICBzKTsKKyNlbmRpZgorICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQocnRjX3Jlc2V0LCAwLCBzKTsKKyAgICByZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaHcvd2F0Y2hkb2cvd2F0Y2hkb2cuYyBiL2FuZHJvaWQvcWVtdTEvaHcvd2F0Y2hkb2cvd2F0Y2hkb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTZhMmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9ody93YXRjaGRvZy93YXRjaGRvZy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogVmlydHVhbCBoYXJkd2FyZSB3YXRjaGRvZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEJ5IFJpY2hhcmQgVy5NLiBKb25lcyAocmpvbmVzQHJlZGhhdC5jb20pLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAic3lzZW11L3dhdGNoZG9nLmgiCisKK3N0YXRpYyBRTElTVF9IRUFEKHdhdGNoZG9nX2xpc3QsIFdhdGNoZG9nVGltZXJNb2RlbCkgd2F0Y2hkb2dfbGlzdDsKKwordm9pZCB3YXRjaGRvZ19hZGRfbW9kZWwoV2F0Y2hkb2dUaW1lck1vZGVsICptb2RlbCkKK3sKKyAgICBRTElTVF9JTlNFUlRfSEVBRCgmd2F0Y2hkb2dfbGlzdCwgbW9kZWwsIGVudHJ5KTsKK30KKworLyogUmV0dXJuczoKKyAqICAgMCA9IGNvbnRpbnVlCisgKiAgIDEgPSBleGl0IHByb2dyYW0gd2l0aCBlcnJvcgorICogICAyID0gZXhpdCBwcm9ncmFtIHdpdGhvdXQgZXJyb3IKKyAqLworaW50IHNlbGVjdF93YXRjaGRvZyhjb25zdCBjaGFyICpwKQoreworICAgIFdhdGNoZG9nVGltZXJNb2RlbCAqbW9kZWw7CisKKyAgICBpZiAod2F0Y2hkb2cpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICJxZW11OiBvbmx5IG9uZSB3YXRjaGRvZyBvcHRpb24gbWF5IGJlIGdpdmVuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogLXdhdGNoZG9nID8gbGlzdHMgYXZhaWxhYmxlIGRldmljZXMgYW5kIGV4aXRzIGNsZWFubHkuICovCisgICAgaWYgKHN0cmNtcChwLCAiPyIpID09IDApIHsKKyAgICAgICAgUUxJU1RfRk9SRUFDSChtb2RlbCwgJndhdGNoZG9nX2xpc3QsIGVudHJ5KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlx0JXNcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgbW9kZWwtPndkdF9uYW1lLCBtb2RlbC0+d2R0X2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBRTElTVF9GT1JFQUNIKG1vZGVsLCAmd2F0Y2hkb2dfbGlzdCwgZW50cnkpIHsKKyAgICAgICAgaWYgKHN0cmNhc2VjbXAobW9kZWwtPndkdF9uYW1lLCBwKSA9PSAwKSB7CisgICAgICAgICAgICB3YXRjaGRvZyA9IG1vZGVsOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gLXdhdGNoZG9nIGRldmljZS4gU3VwcG9ydGVkIGRldmljZXMgYXJlOlxuIik7CisgICAgUUxJU1RfRk9SRUFDSChtb2RlbCwgJndhdGNoZG9nX2xpc3QsIGVudHJ5KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQlc1x0JXNcbiIsCisgICAgICAgICAgICAgICAgIG1vZGVsLT53ZHRfbmFtZSwgbW9kZWwtPndkdF9kZXNjcmlwdGlvbik7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitpbnQgc2VsZWN0X3dhdGNoZG9nX2FjdGlvbihjb25zdCBjaGFyICpwKQoreworICAgIGlmIChzdHJjYXNlY21wKHAsICJyZXNldCIpID09IDApCisgICAgICAgIHdhdGNoZG9nX2FjdGlvbiA9IFdEVF9SRVNFVDsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKHAsICJzaHV0ZG93biIpID09IDApCisgICAgICAgIHdhdGNoZG9nX2FjdGlvbiA9IFdEVF9TSFVURE9XTjsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKHAsICJwb3dlcm9mZiIpID09IDApCisgICAgICAgIHdhdGNoZG9nX2FjdGlvbiA9IFdEVF9QT1dFUk9GRjsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKHAsICJwYXVzZSIpID09IDApCisgICAgICAgIHdhdGNoZG9nX2FjdGlvbiA9IFdEVF9QQVVTRTsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKHAsICJkZWJ1ZyIpID09IDApCisgICAgICAgIHdhdGNoZG9nX2FjdGlvbiA9IFdEVF9ERUJVRzsKKyAgICBlbHNlIGlmIChzdHJjYXNlY21wKHAsICJub25lIikgPT0gMCkKKyAgICAgICAgd2F0Y2hkb2dfYWN0aW9uID0gV0RUX05PTkU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogVGhpcyBhY3R1YWxseSBwZXJmb3JtcyB0aGUgImFjdGlvbiIgb25jZSBhIHdhdGNoZG9nIGhhcyBleHBpcmVkLAorICogaWUuIHJlYm9vdCwgc2h1dGRvd24sIGV4aXQsIGV0Yy4KKyAqLwordm9pZCB3YXRjaGRvZ19wZXJmb3JtX2FjdGlvbih2b2lkKQoreworICAgIHN3aXRjaCh3YXRjaGRvZ19hY3Rpb24pIHsKKyAgICBjYXNlIFdEVF9SRVNFVDogICAgICAgICAgICAgLyogc2FtZSBhcyAnc3lzdGVtX3Jlc2V0JyBpbiBtb25pdG9yICovCisgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdEVF9TSFVURE9XTjogICAgICAgICAgLyogc2FtZSBhcyAnc3lzdGVtX3Bvd2VyZG93bicgaW4gbW9uaXRvciAqLworICAgICAgICBxZW11X3N5c3RlbV9wb3dlcmRvd25fcmVxdWVzdCgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgV0RUX1BPV0VST0ZGOiAgICAgICAgICAvKiBzYW1lIGFzICdxdWl0JyBjb21tYW5kIGluIG1vbml0b3IgKi8KKyAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdEVF9QQVVTRTogICAgICAgICAgICAgLyogc2FtZSBhcyAnc3RvcCcgY29tbWFuZCBpbiBtb25pdG9yICovCisgICAgICAgIHZtX3N0b3AoMCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXRFRfREVCVUc6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAid2F0Y2hkb2c6IHRpbWVyIGZpcmVkXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdEVF9OT05FOgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgd2F0Y2hkb2dfcGNfaW5pdChQQ0lCdXMgKnBjaV9idXMpCit7CisgICAgaWYgKHdhdGNoZG9nKQorICAgICAgICB3YXRjaGRvZy0+d2R0X3BjX2luaXQocGNpX2J1cyk7Cit9CisKK3ZvaWQgcmVnaXN0ZXJfd2F0Y2hkb2dzKHZvaWQpCit7CisjaWYgMAorICAgIHdkdF9pYjcwMF9pbml0KCk7CisgICAgd2R0X2k2MzAwZXNiX2luaXQoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9oeHRvb2wgYi9hbmRyb2lkL3FlbXUxL2h4dG9vbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2E4M2VkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9oeHRvb2wKQEAgLTAsMCArMSwxMDIgQEAKKyMhL2Jpbi9zaAorCitoeHRvaCgpCit7CisgICAgZmxhZz0xCisgICAgd2hpbGUgcmVhZCAtciBzdHI7IGRvCisgICAgICAgIGNhc2UgJHN0ciBpbgorICAgICAgICAgICAgSFhDT01NKikKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBTVEVYSSp8RVRFWEkqfFNRTVAqfEVRTVAqKSBmbGFnPSQoKCRmbGFnXjEpKQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICB0ZXN0ICRmbGFnIC1lcSAxICYmIHByaW50ZiAiJXNcbiIgIiRzdHIiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZG9uZQorfQorCitoeHRvdGV4aSgpCit7CisgICAgZmxhZz0wCisgICAgbGluZT0xCisgICAgd2hpbGUgcmVhZCAtciBzdHI7IGRvCisgICAgICAgIGNhc2UgIiRzdHIiIGluCisgICAgICAgICAgICBIWENPTU0qKQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIFNURVhJKikKKyAgICAgICAgICAgIGlmIHRlc3QgJGZsYWcgLWVxIDEgOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAibGluZSAkbGluZTogc3ludGF4IGVycm9yOiBleHBlY3RlZCBFVEVYSSwgZm91bmQgJHN0ciIgPiYyCisgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmxhZz0xCisgICAgICAgICAgICA7OworICAgICAgICAgICAgRVRFWEkqKQorICAgICAgICAgICAgaWYgdGVzdCAkZmxhZyAtbmUgMSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJsaW5lICRsaW5lOiBzeW50YXggZXJyb3I6IGV4cGVjdGVkIFNURVhJLCBmb3VuZCAkc3RyIiA+JjIKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmbGFnPTAKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBTUU1QKnxFUU1QKikKKyAgICAgICAgICAgIGlmIHRlc3QgJGZsYWcgLWVxIDEgOyB0aGVuCisgICAgICAgICAgICAgICAgZWNobyAibGluZSAkbGluZTogc3ludGF4IGVycm9yOiBleHBlY3RlZCBFVEVYSSwgZm91bmQgJHN0ciIgPiYyCisgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIERFRkhFQURJTkcqKQorICAgICAgICAgICAgZWNobyAiJChleHByICIkc3RyIiA6ICJERUZIRUFESU5HKFwoLipcKSkiKSIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgdGVzdCAkZmxhZyAtZXEgMSAmJiBlY2hvICIkc3RyIgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBsaW5lPSQoKGxpbmUrMSkpCisgICAgZG9uZQorfQorCitoeHRvcW1wKCkKK3sKKyAgICBJRlM9CisgICAgZmxhZz0wCisgICAgbGluZT0xCisgICAgd2hpbGUgcmVhZCAtciBzdHI7IGRvCisgICAgICAgIGNhc2UgIiRzdHIiIGluCisgICAgICAgICAgICBIWENPTU0qKQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIFNRTVAqKQorICAgICAgICAgICAgaWYgdGVzdCAkZmxhZyAtZXEgMSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJsaW5lICRsaW5lOiBzeW50YXggZXJyb3I6IGV4cGVjdGVkIEVRTVAsIGZvdW5kICRzdHIiID4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZsYWc9MQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIEVRTVAqKQorICAgICAgICAgICAgaWYgdGVzdCAkZmxhZyAtbmUgMSA7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJsaW5lICRsaW5lOiBzeW50YXggZXJyb3I6IGV4cGVjdGVkIFNRTVAsIGZvdW5kICRzdHIiID4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZsYWc9MAorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIFNURVhJKnxFVEVYSSopCisgICAgICAgICAgICBpZiB0ZXN0ICRmbGFnIC1lcSAxIDsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gImxpbmUgJGxpbmU6IHN5bnRheCBlcnJvcjogZXhwZWN0ZWQgRVFNUCwgZm91bmQgJHN0ciIgPiYyCisgICAgICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICB0ZXN0ICRmbGFnIC1lcSAxICYmIGVjaG8gIiRzdHIiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIGxpbmU9JCgobGluZSsxKSkKKyAgICBkb25lCit9CisKK2Nhc2UgIiQxIiBpbgorIi1oIikgaHh0b2ggOzsKKyItdCIpIGh4dG90ZXhpIDs7CisiLXEiKSBoeHRvcW1wIDs7CisqKSBleGl0IDEgOzsKK2VzYWMKKworZXhpdCAwCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC9rdm0uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9hbmRyb2lkL2t2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTE2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC9rdm0uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgS1ZNX0FORFJPSURfSAorI2RlZmluZSBLVk1fQU5EUk9JRF9ICisKKy8qIFJldHVybnMgMSBpZiB3ZSBjYW4gdXNlIGt2bSBkZXZpY2Ugb24gdGhpcyBtYWNoaW5lICovCitleHRlcm4gaW50IGt2bV9jaGVja19hbGxvd2VkKHZvaWQpOworCisjZW5kaWYgLyogS1ZNX0FORFJPSURfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2FuZHJvaWQvbG9nLXJvdGF0ZS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2FuZHJvaWQvbG9nLXJvdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTdiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC9sb2ctcm90YXRlLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaWZuZGVmIEFORFJPSURfTE9HX1JPVEFURV9ICisjZGVmaW5lIEFORFJPSURfTE9HX1JPVEFURV9ICisKKy8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGZhY2lsaXRpZXMgdG8gcm90YXRlIG1pc2MgUUVNVSBsb2cgZmlsZXMKKy8vIHVzZSBpbiB0aGUgQW5kcm9pZCBlbXVsYXRvci4KKworLy8gU2V0dXAgbG9nIHJvdGF0aW9uLCB0aGlzIGluc3RhbGxlZCBhIHNpZ25hbCBoYW5kbGVyIGZvciBTSUdVU1IxCisvLyB3aGljaCB3aWxsIHRyaWdnZXIgYSBsb2cgcm90YXRpb24gYXQgcnVudGltZS4KK3ZvaWQgcWVtdV9sb2dfcm90YXRpb25faW5pdCh2b2lkKTsKKworLy8gUGVyZm9ybSBsb2cgcm90YXRpb24gaWYgbmVlZGVkLiBGb3Igbm93LCB0aGlzIG11c3QgYmUgY2FsbGVkIGZyb20KKy8vIHRoZSBtYWluIGV2ZW50IGxvb3AsIHRob3VnaCBhIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiBtaWdodCBzY2hlZHVsZQorLy8gYSBib3R0b20taGFsZiBoYW5kbGVyIGluc3RlYWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQuCit2b2lkIHFlbXVfbG9nX3JvdGF0aW9uX3BvbGwodm9pZCk7CisKKyNlbmRpZiAgLy8gQU5EUk9JRF9MT0dfUk9UQVRFX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9hbmRyb2lkL21vbml0b3IuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9hbmRyb2lkL21vbml0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQyMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2FuZHJvaWQvbW9uaXRvci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBmcm9tIG1vbml0b3IuYywgaXQncyBwdXJwb3NlIGlzIHRvIGhvbGQgYXMgbXVjaAorICogQW5kcm9pZC1zcGVjaWZpYyBzdHVmZiBhcyBwb3NzaWJsZSB0byBlYXNlIHVwc3RyZWFtIGludGVncmF0aW9ucy4KKyAqLworCitNb25pdG9yKgorbW9uaXRvcl9mYWtlX25ldyh2b2lkKiBvcGFxdWUsIE1vbml0b3JGYWtlRnVuYyBjYikKK3sKKyAgICBNb25pdG9yKiBtb247CisKKyAgICBhc3NlcnQoY2IgIT0gTlVMTCk7CisgICAgbW9uID0gZ19tYWxsb2MwKHNpemVvZigqbW9uKSk7CisgICAgbW9uLT5mYWtlX29wYXF1ZSA9IG9wYXF1ZTsKKyAgICBtb24tPmZha2VfZnVuYyAgID0gY2I7CisgICAgbW9uLT5mYWtlX2NvdW50ICA9IDA7CisKKyAgICByZXR1cm4gbW9uOworfQorCitpbnQKK21vbml0b3JfZmFrZV9nZXRfYnl0ZXMoTW9uaXRvciogbW9uKQoreworICAgIGFzc2VydChtb24tPmZha2VfZnVuYyAhPSBOVUxMKTsKKyAgICByZXR1cm4gbW9uLT5mYWtlX2NvdW50OworfQorCit2b2lkCittb25pdG9yX2Zha2VfZnJlZShNb25pdG9yKiBtb24pCit7CisgICAgYXNzZXJ0KG1vbi0+ZmFrZV9mdW5jICE9IE5VTEwpOworICAgIGZyZWUobW9uKTsKK30KKworLyogVGhpcyByZXBsYWNlcyB0aGUgZGVmaW5pdGlvbiBpbiBtb25pdG9yLmMgd2hpY2ggaXMgaW4gYQorICogI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAuLiAjZW5kaWYgYmxvY2suCisgKi8KK3ZvaWQgbW9uaXRvcl9mbHVzaChNb25pdG9yICptb24pCit7CisgICAgaWYgKCFtb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtb24tPmZha2VfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIG1vbi0+ZmFrZV9mdW5jKG1vbi0+ZmFrZV9vcGFxdWUsICh2b2lkKiltb24tPm91dGJ1ZiwgbW9uLT5vdXRidWZfaW5kZXgpOworICAgICAgICBtb24tPm91dGJ1Zl9pbmRleCA9IDA7CisgICAgICAgIG1vbi0+ZmFrZV9jb3VudCArPSBtb24tPm91dGJ1Zl9pbmRleDsKKyAgICB9IGVsc2UgaWYgKCFtb24tPm11eF9vdXQpIHsKKyAgICAgICAgcWVtdV9jaHJfd3JpdGUobW9uLT5jaHIsIG1vbi0+b3V0YnVmLCBtb24tPm91dGJ1Zl9pbmRleCk7CisgICAgICAgIG1vbi0+b3V0YnVmX2luZGV4ID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC9xZW11LWRlYnVnLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC9xZW11LWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5YTE1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9hbmRyb2lkL3FlbXUtZGVidWcuaApAQCAtMCwwICsxLDUgQEAKKy8qIHRoaXMgaXMgYSB0cmFuc2l0aW9uYWwgaGVhZGVyLiBJdCBzaG91bGQgb25seSBiZSBpbmNsdWRlZAorICogYnkgbm9uLXNwZWNpZmljIHNvdXJjZSBmaWxlcy4gTGF0ZXIsIGEgbm9uLUFuZHJvaWQgc3BlY2lmaWMKKyAqIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgaG9va2VkIGluCisgKi8KKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2RlYnVnLmgiCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC90cmFjZV9jb21tb24uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9hbmRyb2lkL3RyYWNlX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlODRjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYW5kcm9pZC90cmFjZV9jb21tb24uaApAQCAtMCwwICsxLDE0MiBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaWZuZGVmIFRSQUNFX0NPTU1PTl9ICisjZGVmaW5lIFRSQUNFX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBPUENfQlVGX1NJWkUKKyNkZWZpbmUga01heEluc25QZXJCQiA1MTIKKworI2RlZmluZSBrTWF4TnVtQmFzaWNCbG9ja3MgMTAyNAorCisjZGVmaW5lIGtNYXhOdW1BZGRycyAxMDI0CisKKyNkZWZpbmUga0luc25CdWZmZXJTaXplIDEwMjQKKworI2RlZmluZSBrQ29tcHJlc3NlZFNpemUgODE5MgorCisjZGVmaW5lIGtNZXRob2RFbnRlcgkJMAorI2RlZmluZSBrTWV0aG9kRXhpdAkJMQorI2RlZmluZSBrTWV0aG9kRXhjZXB0aW9uCTIKKyNkZWZpbmUga05hdGl2ZUVudGVyCQk0CisjZGVmaW5lIGtOYXRpdmVFeGl0CQk1CisjZGVmaW5lIGtOYXRpdmVFeGNlcHRpb24JNgorCisvLyBUaGUgdHJhY2UgaWRlbnRpZmllciBzdHJpbmcgbXVzdCBiZSBsZXNzIHRoYW4gMTYgY2hhcmFjdGVycy4KKyNkZWZpbmUgVFJBQ0VfSURFTlQgInFlbXVfdHJhY2VfZmlsZSIKKyNkZWZpbmUgVFJBQ0VfVkVSU0lPTiAyCisKK3R5cGVkZWYgc3RydWN0IFRyYWNlSGVhZGVyIHsKKyAgICBjaGFyCWlkZW50WzE2XTsKKyAgICBpbnQJCXZlcnNpb247CisgICAgdWludDMyX3QJc3RhcnRfc2VjOworICAgIHVpbnQzMl90CXN0YXJ0X3VzZWM7CisgICAgdWludDMyX3QJcGRhdGU7CisgICAgdWludDMyX3QJcHRpbWU7CisgICAgdWludDMyX3QJbnVtX3VzZWRfcGlkczsJCS8vIG51bWJlciBvZiBkaXN0aW5jdCBwcm9jZXNzIGlkcyB1c2VkCisgICAgaW50CQlmaXJzdF91bnVzZWRfcGlkOwkvLyAtMSBpZiBhbGwgMzIsNzY4IHBpZHMgYXJlIHVzZWQgKHVubGlrZWx5KQorICAgIHVpbnQ4X3QJcGFkZGluZ1s0XTsJCS8vIG5leHQgZmllbGQgaXMgOC1ieXRlIGFsaWduZWQKKyAgICB1aW50NjRfdAludW1fc3RhdGljX2JiOworICAgIHVpbnQ2NF90CW51bV9zdGF0aWNfaW5zbjsKKyAgICB1aW50NjRfdAludW1fZHluYW1pY19iYjsKKyAgICB1aW50NjRfdAludW1fZHluYW1pY19pbnNuOworICAgIHVpbnQ2NF90CWVsYXBzZWRfdXNlY3M7Cit9IFRyYWNlSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBCQlJlYyB7CisgICAgdWludDY0X3QJc3RhcnRfdGltZTsJLy8gdGltZSBvZiBmaXJzdCBvY2N1cnJlbmNlCisgICAgdWludDY0X3QJYmJfbnVtOwkJLy8gYmFzaWMgYmxvY2sgbnVtYmVyCisgICAgdWludDMyX3QJcmVwZWF0OwkJLy8gcmVwZWF0IGNvdW50ICg9IDAgaWYganVzdCBvbmUgb2NjdXJyZW5jZSkKKyAgICB1aW50NjRfdAl0aW1lX2RpZmY7CS8vIGRpZmYgZnJvbSBwcmV2aW91cyB0aW1lIChpZiByZXBlYXQgPiAwKQorfSBCQlJlYzsKKworLy8gRGVmaW5lIGEgdHJhY2UgcmVjb3JkIGZvciBhZGRyZXNzZXMgdGhhdCBtaXNzIGluIHRoZSBjYWNoZQordHlwZWRlZiBzdHJ1Y3QgQWRkclJlYyB7CisgICAgdWludDY0X3QJdGltZTsKKyAgICB1aW50MzJfdAlhZGRyOworfSBBZGRyUmVjOworCisvLyBEZWZpbmUgYSB0cmFjZSByZWNvcmQgZm9yIHRoZSBzdGFydCB0aW1lIG9mIGVhY2ggaW5zdHJ1Y3Rpb24KK3R5cGVkZWYgc3RydWN0IEluc25SZWMgeworICAgIHVpbnQ2NF90CXRpbWVfZGlmZjsJLy8gdGltZSBkaWZmZXJlbmNlIGZyb20gbGFzdCBpbnN0cnVjdGlvbgorICAgIHVpbnQzMl90CXJlcGVhdDsJCS8vIHJlcGVhdCBjb3VudAorfSBJbnNuUmVjOworCisvLyBEZWZpbmUgcmVjb3JkIHR5cGVzIGZvciBwcm9jZXNzIGlkIGNoYW5nZXMuCisjZGVmaW5lIGtQaWRFbmRPZkZpbGUJCTAKKyNkZWZpbmUga1BpZEZvcmsJCTEKKyNkZWZpbmUga1BpZENsb25lCQkyCisjZGVmaW5lIGtQaWRTd2l0Y2gJCTMKKyNkZWZpbmUga1BpZEV4ZWMJCTQKKyNkZWZpbmUga1BpZE1tYXAJCTUKKyNkZWZpbmUga1BpZEV4aXQJCTYKKyNkZWZpbmUga1BpZEt0aHJlYWROYW1lCQk3CisjZGVmaW5lIGtQaWRTeW1ib2xBZGQJCTgKKyNkZWZpbmUga1BpZFN5bWJvbFJlbW92ZQk5CisjZGVmaW5lIGtQaWRNdW5tYXAJCTEwCisjZGVmaW5lIGtQaWROb0FjdGlvbgkJMTEKKyNkZWZpbmUga1BpZE5hbWUJCTEyCisKKyNkZWZpbmUgYnN3YXAxNih4KSAoKCgoeCkgJiAweGZmKSA8PCA4KSB8ICgoKHgpID4+IDgpICYgMHhmZikpCisKKyNkZWZpbmUgYnN3YXAzMih4KSAoKCgoeCkgJiAweGZmKSA8PCAyNCkgfCAoKCh4KSAmIDB4ZmYwMCkgPDwgOCkgXAorICAgICAgICB8ICgoKHgpID4+IDgpICYgMHhmZjAwKSB8ICgoKHgpID4+IDI0KSAmIDB4ZmYpKQorCisjZGVmaW5lIGJzd2FwNjQoeCkgKCgoeCkgPDwgNTYpIHwgKCgoeCkgJiAweGZmMDApIDw8IDQwKSBcCisgICAgICAgIHwgKCgoeCkgJiAweGZmMDAwMCkgPDwgMjQpIHwgKCgoeCkgJiAweGZmMDAwMDAwdWxsKSA8PCA4KSBcCisgICAgICAgIHwgKCgoeCkgPj4gOCkgJiAweGZmMDAwMDAwdWxsKSB8ICgoKHgpID4+IDI0KSAmIDB4ZmYwMDAwKSBcCisgICAgICAgIHwgKCgoeCkgPj4gNDApICYgMHhmZjAwKSB8ICgoeCkgPj4gNTYpKQorCisjaWYgQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIGhvc3RUb0xFMTYoeCkJKHgpCisjZGVmaW5lIGhvc3RUb0xFMzIoeCkJKHgpCisjZGVmaW5lIGhvc3RUb0xFNjQoeCkJKHgpCisjZGVmaW5lIExFMTZUb0hvc3QoeCkJKHgpCisjZGVmaW5lIExFMzJUb0hvc3QoeCkJKHgpCisjZGVmaW5lIExFNjRUb0hvc3QoeCkJKHgpCisjZGVmaW5lIGNvbnZlcnQxNih4KQorI2RlZmluZSBjb252ZXJ0MzIoeCkKKyNkZWZpbmUgY29udmVydDY0KHgpCisjZWxzZQorI2RlZmluZSBob3N0VG9MRTE2KHgpCWJzd2FwMTYoeCkKKyNkZWZpbmUgaG9zdFRvTEUzMih4KQlic3dhcDMyKHgpCisjZGVmaW5lIGhvc3RUb0xFNjQoeCkJYnN3YXA2NCh4KQorI2RlZmluZSBMRTE2VG9Ib3N0KHgpCWJzd2FwMTYoeCkKKyNkZWZpbmUgTEUzMlRvSG9zdCh4KQlic3dhcDMyKHgpCisjZGVmaW5lIExFNjRUb0hvc3QoeCkJYnN3YXA2NCh4KQorI2RlZmluZSBjb252ZXJ0MTYoeCkgKHggPSBic3dhcDE2KHgpKQorI2RlZmluZSBjb252ZXJ0MzIoeCkgKHggPSBic3dhcDMyKHgpKQorI2RlZmluZSBjb252ZXJ0NjQoeCkgKHggPSBic3dhcDY0KHgpKQorI2VuZGlmCisKKy8qIFhYWDogd2Ugd3JhcCAxNi1iaXQgdGh1bWIgaW5zdHJ1Y3Rpb25zIGludG8gMzItYml0IHVuZGVmaW5lZCBBUk0gaW5zdHJ1Y3Rpb25zCisgKiAgICAgIGZvciBzaW1wbGljaXR5IHJlYXNvbnMuIFNlZSBzZWN0aW9uIDMuMTMuMSBzZWN0aW9uIG9mIHRoZSBBUk0gQVJNIGZvciBkZXRhaWxzCisgKiAgICAgIG9uIHRoZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gc3BhY2Ugd2UncmUgdXNpbmcKKyAqLworc3RhdGljIF9faW5saW5lX18gaW50ICAgaW5zbl9pc190aHVtYih1aW50MzJfdCAgIGluc24pCit7CisgICAgcmV0dXJuICgoaW5zbiAmIDB4ZmZmMDAwZjApID09IDB4ZjdmMDAwZjApOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdCAgaW5zbl93cmFwX3RodW1iKHVpbnQzMl90ICBpbnNuKQoreworICAgIHJldHVybiAweGY3ZjAwMGYwIHwgKChpbnNuICYgMHhmZmYwKSA8PCA0KSB8IChpbnNuICYgMHgwMDBmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QgIGluc25fdW53cmFwX3RodW1iKHVpbnQzMl90ICBpbnNuKQoreworICAgIHJldHVybiAoKGluc24gPj4gNCkgJiAweGZmZjApIHwgKGluc24gJiAweDAwMGYpOworfQorCisjZW5kaWYgLyogVFJBQ0VfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ibG9jay9haW8uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ibG9jay9haW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY5NzZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Jsb2NrL2Fpby5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBRRU1VIGFpbyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX0FJT19ICisjZGVmaW5lIFFFTVVfQUlPX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKworLyogUmV0dXJucyAxIGlmIHRoZXJlIGFyZSBzdGlsbCBvdXRzdGFuZGluZyBBSU8gcmVxdWVzdHM7IDAgb3RoZXJ3aXNlICovCit0eXBlZGVmIGludCAoQWlvRmx1c2hIYW5kbGVyKSh2b2lkICpvcGFxdWUpOworCisvKiBSdW5zIGFsbCBjdXJyZW50bHkgYWxsb3dlZCBBSU8gY2FsbGJhY2tzIG9mIGNvbXBsZXRlZCByZXF1ZXN0cyBpbiB0aGUKKyAqIHJlc3BlY3RpdmUgQUlPIGJhY2tlbmQuIFJldHVybnMgMCBpZiBubyByZXF1ZXN0cyB3YXMgaGFuZGxlZCwgbm9uLXplcm8KKyAqIGlmIGF0IGxlYXN0IG9uZSBxdWV1ZWQgcmVxdWVzdCB3YXMgaGFuZGxlZC4gKi8KK3R5cGVkZWYgaW50IChBaW9Qcm9jZXNzUXVldWUpKHZvaWQgKm9wYXF1ZSk7CisKKy8qIEZsdXNoIGFueSBwZW5kaW5nIEFJTyBvcGVyYXRpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbCBhbGwKKyAqIG91dHN0YW5kaW5nIEFJTyBvcGVyYXRpb25zIGhhdmUgYmVlbiBjb21wbGV0ZWQgb3IgY2FuY2VsbGVkLiAqLwordm9pZCBxZW11X2Fpb19mbHVzaCh2b2lkKTsKKworLyogV2FpdCBmb3IgYSBzaW5nbGUgQUlPIGNvbXBsZXRpb24gdG8gb2NjdXIuICBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FpdAorICogdW50aWwgYSBzaW5nbGUgQUlPIGV2ZW50IGhhcyBjb21wbGV0ZWQgYW5kIGl0IHdpbGwgZW5zdXJlIHNvbWV0aGluZworICogaGFzIG1vdmVkIGJlZm9yZSByZXR1cm5pbmcuIFRoaXMgY2FuIGlzc3VlIG5ldyBwZW5kaW5nIGFpbyBhcworICogcmVzdWx0IG9mIGV4ZWN1dGluZyBJL08gY29tcGxldGlvbiBvciBiaCBjYWxsYmFja3MuICovCit2b2lkIHFlbXVfYWlvX3dhaXQodm9pZCk7CisKKy8qCisgKiBSdW5zIGFsbCBjdXJyZW50bHkgYWxsb3dlZCBBSU8gY2FsbGJhY2tzIG9mIGNvbXBsZXRlZCByZXF1ZXN0cy4gUmV0dXJucyAwCisgKiBpZiBubyByZXF1ZXN0cyB3ZXJlIGhhbmRsZWQsIG5vbi16ZXJvIGlmIGF0IGxlYXN0IG9uZSByZXF1ZXN0IHdhcworICogcHJvY2Vzc2VkLgorICovCitpbnQgcWVtdV9haW9fcHJvY2Vzc19xdWV1ZSh2b2lkKTsKKworLyogUmVnaXN0ZXIgYSBmaWxlIGRlc2NyaXB0b3IgYW5kIGFzc29jaWF0ZWQgY2FsbGJhY2tzLiAgQmVoYXZlcyB2ZXJ5IHNpbWlsYXJseQorICogdG8gcWVtdV9zZXRfZmRfaGFuZGxlcjIuICBVbmxpa2UgcWVtdV9zZXRfZmRfaGFuZGxlcjIsIHRoZXNlIGNhbGxiYWNrcyB3aWxsCisgKiBiZSBpbnZva2VkIHdoZW4gdXNpbmcgZWl0aGVyIHFlbXVfYWlvX3dhaXQoKSBvciBxZW11X2Fpb19mbHVzaCgpLgorICoKKyAqIENvZGUgdGhhdCBpbnZva2VzIEFJTyBjb21wbGV0aW9uIGZ1bmN0aW9ucyBzaG91bGQgcmVseSBvbiB0aGlzIGZ1bmN0aW9uCisgKiBpbnN0ZWFkIG9mIHFlbXVfc2V0X2ZkX2hhbmRsZXJbMl0uCisgKi8KK2ludCBxZW11X2Fpb19zZXRfZmRfaGFuZGxlcihpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICppb19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPSGFuZGxlciAqaW9fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWlvRmx1c2hIYW5kbGVyICppb19mbHVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBaW9Qcm9jZXNzUXVldWUgKmlvX3Byb2Nlc3NfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYmxvY2svYmxvY2suaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ibG9jay9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTJlMDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvYmxvY2svYmxvY2suaApAQCAtMCwwICsxLDI4OCBAQAorI2lmbmRlZiBCTE9DS19ICisjZGVmaW5lIEJMT0NLX0gKKworI2luY2x1ZGUgImJsb2NrL2Fpby5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xb2JqZWN0LmgiCisKKy8qIGJsb2NrLmMgKi8KK3R5cGVkZWYgc3RydWN0IEJsb2NrRHJpdmVyIEJsb2NrRHJpdmVyOworCit0eXBlZGVmIHN0cnVjdCBCbG9ja0RyaXZlckluZm8geworICAgIC8qIGluIGJ5dGVzLCAwIGlmIGlycmVsZXZhbnQgKi8KKyAgICBpbnQgY2x1c3Rlcl9zaXplOworICAgIC8qIG9mZnNldCBhdCB3aGljaCB0aGUgVk0gc3RhdGUgY2FuIGJlIHNhdmVkICgwIGlmIG5vdCBwb3NzaWJsZSkgKi8KKyAgICBpbnQ2NF90IHZtX3N0YXRlX29mZnNldDsKK30gQmxvY2tEcml2ZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCBRRU1VU25hcHNob3RJbmZvIHsKKyAgICBjaGFyIGlkX3N0clsxMjhdOyAvKiB1bmlxdWUgc25hcHNob3QgaWQgKi8KKyAgICAvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgaW5mb3JtYXRpdmUuIFRoZXkgYXJlIG5vdCBuZWVkZWQgZm9yCisgICAgICAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBzbmFwc2hvdCAqLworICAgIGNoYXIgbmFtZVsyNTZdOyAvKiB1c2VyIGNob29zZW4gbmFtZSAqLworICAgIHVpbnQzMl90IHZtX3N0YXRlX3NpemU7IC8qIFZNIHN0YXRlIGluZm8gc2l6ZSAqLworICAgIHVpbnQzMl90IGRhdGVfc2VjOyAvKiBVVEMgZGF0ZSBvZiB0aGUgc25hcHNob3QgKi8KKyAgICB1aW50MzJfdCBkYXRlX25zZWM7CisgICAgdWludDY0X3Qgdm1fY2xvY2tfbnNlYzsgLyogVk0gY2xvY2sgcmVsYXRpdmUgdG8gYm9vdCAqLworfSBRRU1VU25hcHNob3RJbmZvOworCisjZGVmaW5lIEJEUlZfT19SRFdSICAgICAgICAweDAwMDIKKyNkZWZpbmUgQkRSVl9PX1NOQVBTSE9UICAgIDB4MDAwOCAvKiBvcGVuIHRoZSBmaWxlIHJlYWQgb25seSBhbmQgc2F2ZSB3cml0ZXMgaW4gYSBzbmFwc2hvdCAqLworI2RlZmluZSBCRFJWX09fTk9DQUNIRSAgICAgMHgwMDIwIC8qIGRvIG5vdCB1c2UgdGhlIGhvc3QgcGFnZSBjYWNoZSAqLworI2RlZmluZSBCRFJWX09fQ0FDSEVfV0IgICAgMHgwMDQwIC8qIHVzZSB3cml0ZS1iYWNrIGNhY2hpbmcgKi8KKyNkZWZpbmUgQkRSVl9PX05BVElWRV9BSU8gIDB4MDA4MCAvKiB1c2UgbmF0aXZlIEFJTyBpbnN0ZWFkIG9mIHRoZSB0aHJlYWQgcG9vbCAqLworI2RlZmluZSBCRFJWX09fTk9fQkFDS0lORyAgMHgwMTAwIC8qIGRvbid0IG9wZW4gdGhlIGJhY2tpbmcgZmlsZSAqLworI2RlZmluZSBCRFJWX09fTk9fRkxVU0ggICAgMHgwMjAwIC8qIGRpc2FibGUgZmx1c2hpbmcgb24gdGhpcyBkaXNrICovCisKKyNkZWZpbmUgQkRSVl9PX0NBQ0hFX01BU0sgIChCRFJWX09fTk9DQUNIRSB8IEJEUlZfT19DQUNIRV9XQikKKworI2RlZmluZSBCRFJWX1NFQ1RPUl9CSVRTICAgOQorI2RlZmluZSBCRFJWX1NFQ1RPUl9TSVpFICAgKDFVTEwgPDwgQkRSVl9TRUNUT1JfQklUUykKKyNkZWZpbmUgQkRSVl9TRUNUT1JfTUFTSyAgIH4oQkRSVl9TRUNUT1JfU0laRSAtIDEpCisKK3R5cGVkZWYgZW51bSB7CisgICAgQkxPQ0tfRVJSX1JFUE9SVCwgQkxPQ0tfRVJSX0lHTk9SRSwgQkxPQ0tfRVJSX1NUT1BfRU5PU1BDLAorICAgIEJMT0NLX0VSUl9TVE9QX0FOWQorfSBCbG9ja0Vycm9yQWN0aW9uOworCit0eXBlZGVmIGVudW0geworICAgIEJEUlZfQUNUSU9OX1JFUE9SVCwgQkRSVl9BQ1RJT05fSUdOT1JFLCBCRFJWX0FDVElPTl9TVE9QCit9IEJsb2NrTW9uRXZlbnRBY3Rpb247CisKK3ZvaWQgYmRydl9tb25fZXZlbnQoY29uc3QgQmxvY2tEcml2ZXJTdGF0ZSAqYmRydiwKKyAgICAgICAgICAgICAgICAgICAgQmxvY2tNb25FdmVudEFjdGlvbiBhY3Rpb24sIGludCBpc19yZWFkKTsKK3ZvaWQgYmRydl9pbmZvX3ByaW50KE1vbml0b3IgKm1vbiwgY29uc3QgUU9iamVjdCAqZGF0YSk7Cit2b2lkIGJkcnZfaW5mbyhNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSk7Cit2b2lkIGJkcnZfc3RhdHNfcHJpbnQoTW9uaXRvciAqbW9uLCBjb25zdCBRT2JqZWN0ICpkYXRhKTsKK3ZvaWQgYmRydl9pbmZvX3N0YXRzKE1vbml0b3IgKm1vbiwgUU9iamVjdCAqKnJldF9kYXRhKTsKKwordm9pZCBiZHJ2X2luaXQodm9pZCk7Cit2b2lkIGJkcnZfaW5pdF93aXRoX3doaXRlbGlzdCh2b2lkKTsKK0Jsb2NrRHJpdmVyICpiZHJ2X2ZpbmRfcHJvdG9jb2woY29uc3QgY2hhciAqZmlsZW5hbWUpOworQmxvY2tEcml2ZXIgKmJkcnZfZmluZF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0X25hbWUpOworQmxvY2tEcml2ZXIgKmJkcnZfZmluZF93aGl0ZWxpc3RlZF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0X25hbWUpOworaW50IGJkcnZfY3JlYXRlKEJsb2NrRHJpdmVyICpkcnYsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgIFFFTVVPcHRpb25QYXJhbWV0ZXIgKm9wdGlvbnMpOworaW50IGJkcnZfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUsIFFFTVVPcHRpb25QYXJhbWV0ZXIgKm9wdGlvbnMpOworQmxvY2tEcml2ZXJTdGF0ZSAqYmRydl9uZXcoY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOwordm9pZCBiZHJ2X2RlbGV0ZShCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9maWxlX29wZW4oQmxvY2tEcml2ZXJTdGF0ZSAqKnBicywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncyk7CitpbnQgYmRydl9vcGVuKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICBCbG9ja0RyaXZlciAqZHJ2KTsKK3ZvaWQgYmRydl9jbG9zZShCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9hdHRhY2goQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIERldmljZVN0YXRlICpxZGV2KTsKK3ZvaWQgYmRydl9kZXRhY2goQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIERldmljZVN0YXRlICpxZGV2KTsKK0RldmljZVN0YXRlICpiZHJ2X2dldF9hdHRhY2hlZChCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9yZWFkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpOworaW50IGJkcnZfd3JpdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpOworaW50IGJkcnZfcHJlYWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgdm9pZCAqYnVmLCBpbnQgY291bnQpOworaW50IGJkcnZfcHdyaXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIGludCBjb3VudCk7CitpbnQgYmRydl9wd3JpdGVfc3luYyhCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBvZmZzZXQsCisgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgY291bnQpOworaW50IGJkcnZfd3JpdGVfc3luYyhCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpOworaW50IGJkcnZfdHJ1bmNhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0KTsKK2ludDY0X3QgYmRydl9nZXRsZW5ndGgoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOwordm9pZCBiZHJ2X2dldF9nZW9tZXRyeShCbG9ja0RyaXZlclN0YXRlICpicywgdWludDY0X3QgKm5iX3NlY3RvcnNfcHRyKTsKK3ZvaWQgYmRydl9ndWVzc19nZW9tZXRyeShCbG9ja0RyaXZlclN0YXRlICpicywgaW50ICpwY3lscywgaW50ICpwaGVhZHMsIGludCAqcHNlY3MpOworaW50IGJkcnZfY29tbWl0KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK3ZvaWQgYmRydl9jb21taXRfYWxsKHZvaWQpOworaW50IGJkcnZfY2hhbmdlX2JhY2tpbmdfZmlsZShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICBjb25zdCBjaGFyICpiYWNraW5nX2ZpbGUsIGNvbnN0IGNoYXIgKmJhY2tpbmdfZm10KTsKK3ZvaWQgYmRydl9yZWdpc3RlcihCbG9ja0RyaXZlciAqYmRydik7CisKKwordHlwZWRlZiBzdHJ1Y3QgQmRydkNoZWNrUmVzdWx0IHsKKyAgICBpbnQgY29ycnVwdGlvbnM7CisgICAgaW50IGxlYWtzOworICAgIGludCBjaGVja19lcnJvcnM7Cit9IEJkcnZDaGVja1Jlc3VsdDsKKworaW50IGJkcnZfY2hlY2soQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIEJkcnZDaGVja1Jlc3VsdCAqcmVzKTsKKworLyogYXN5bmMgYmxvY2sgSS9PICovCit0eXBlZGVmIHN0cnVjdCBCbG9ja0RyaXZlckFJT0NCIEJsb2NrRHJpdmVyQUlPQ0I7Cit0eXBlZGVmIHZvaWQgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyh2b2lkICpvcGFxdWUsIGludCByZXQpOwordHlwZWRlZiB2b2lkIEJsb2NrRHJpdmVyRGlydHlIYW5kbGVyKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3RvciwKKwkJCQkgICAgIGludCBzZWN0b3JfbnVtKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX3JlYWR2KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VSU9WZWN0b3IgKmlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX3dyaXRldihCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVJT1ZlY3RvciAqaW92LCBpbnQgbmJfc2VjdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX2ZsdXNoKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorCQkJCSBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKK3ZvaWQgYmRydl9haW9fY2FuY2VsKEJsb2NrRHJpdmVyQUlPQ0IgKmFjYik7CisKK3R5cGVkZWYgc3RydWN0IEJsb2NrUmVxdWVzdCB7CisgICAgLyogRmllbGRzIHRvIGJlIGZpbGxlZCBieSBtdWx0aXdyaXRlIGNhbGxlciAqLworICAgIGludDY0X3Qgc2VjdG9yOworICAgIGludCBuYl9zZWN0b3JzOworICAgIFFFTVVJT1ZlY3RvciAqcWlvdjsKKyAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYjsKKyAgICB2b2lkICpvcGFxdWU7CisKKyAgICAvKiBGaWxsZWQgYnkgbXVsdGl3cml0ZSBpbXBsZW1lbnRhdGlvbiAqLworICAgIGludCBlcnJvcjsKK30gQmxvY2tSZXF1ZXN0OworCitpbnQgYmRydl9haW9fbXVsdGl3cml0ZShCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tSZXF1ZXN0ICpyZXFzLAorICAgIGludCBudW1fcmVxcyk7CisKKy8qIHNnIHBhY2tldCBjb21tYW5kcyAqLworaW50IGJkcnZfaW9jdGwoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHVuc2lnbmVkIGxvbmcgaW50IHJlcSwgdm9pZCAqYnVmKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmJkcnZfYWlvX2lvY3RsKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICB1bnNpZ25lZCBsb25nIGludCByZXEsIHZvaWQgKmJ1ZiwKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSk7CisKKy8qIEVuc3VyZSBjb250ZW50cyBhcmUgZmx1c2hlZCB0byBkaXNrLiAgKi8KK3ZvaWQgYmRydl9mbHVzaChCbG9ja0RyaXZlclN0YXRlICpicyk7Cit2b2lkIGJkcnZfZmx1c2hfYWxsKHZvaWQpOwordm9pZCBiZHJ2X2Nsb3NlX2FsbCh2b2lkKTsKKworaW50IGJkcnZfaGFzX3plcm9faW5pdChCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9pc19hbGxvY2F0ZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwgaW50IG5iX3NlY3RvcnMsCisJaW50ICpwbnVtKTsKKworI2RlZmluZSBCRFJWX1RZUEVfSEQgICAgIDAKKyNkZWZpbmUgQkRSVl9UWVBFX0NEUk9NICAxCisjZGVmaW5lIEJEUlZfVFlQRV9GTE9QUFkgMgorI2RlZmluZSBCSU9TX0FUQV9UUkFOU0xBVElPTl9BVVRPICAgMAorI2RlZmluZSBCSU9TX0FUQV9UUkFOU0xBVElPTl9OT05FICAgMQorI2RlZmluZSBCSU9TX0FUQV9UUkFOU0xBVElPTl9MQkEgICAgMgorI2RlZmluZSBCSU9TX0FUQV9UUkFOU0xBVElPTl9MQVJHRSAgMworI2RlZmluZSBCSU9TX0FUQV9UUkFOU0xBVElPTl9SRUNIUyAgNAorCit2b2lkIGJkcnZfc2V0X2dlb21ldHJ5X2hpbnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN5bHMsIGludCBoZWFkcywgaW50IHNlY3MpOwordm9pZCBiZHJ2X3NldF90eXBlX2hpbnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCB0eXBlKTsKK3ZvaWQgYmRydl9zZXRfdHJhbnNsYXRpb25faGludChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IHRyYW5zbGF0aW9uKTsKK3ZvaWQgYmRydl9nZXRfZ2VvbWV0cnlfaGludChCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBjeWxzLCBpbnQgKnBoZWFkcywgaW50ICpwc2Vjcyk7CitpbnQgYmRydl9nZXRfdHlwZV9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK2ludCBiZHJ2X2dldF90cmFuc2xhdGlvbl9oaW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK3ZvaWQgYmRydl9zZXRfb25fZXJyb3IoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIEJsb2NrRXJyb3JBY3Rpb24gb25fcmVhZF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tFcnJvckFjdGlvbiBvbl93cml0ZV9lcnJvcik7CitCbG9ja0Vycm9yQWN0aW9uIGJkcnZfZ2V0X29uX2Vycm9yKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgaXNfcmVhZCk7Cit2b2lkIGJkcnZfc2V0X3JlbW92YWJsZShCbG9ja0RyaXZlclN0YXRlICpicywgaW50IHJlbW92YWJsZSk7CitpbnQgYmRydl9pc19yZW1vdmFibGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworaW50IGJkcnZfaXNfcmVhZF9vbmx5KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK2ludCBiZHJ2X2lzX3NnKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK2ludCBiZHJ2X2VuYWJsZV93cml0ZV9jYWNoZShCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9pc19pbnNlcnRlZChCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9tZWRpYV9jaGFuZ2VkKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK2ludCBiZHJ2X2lzX2xvY2tlZChCbG9ja0RyaXZlclN0YXRlICpicyk7Cit2b2lkIGJkcnZfc2V0X2xvY2tlZChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGxvY2tlZCk7CitpbnQgYmRydl9lamVjdChCbG9ja0RyaXZlclN0YXRlICpicywgaW50IGVqZWN0X2ZsYWcpOwordm9pZCBiZHJ2X3NldF9jaGFuZ2VfY2IoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2hhbmdlX2NiKSh2b2lkICpvcGFxdWUpLCB2b2lkICpvcGFxdWUpOwordm9pZCBiZHJ2X2dldF9mb3JtYXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKK0Jsb2NrRHJpdmVyU3RhdGUgKmJkcnZfZmluZChjb25zdCBjaGFyICpuYW1lKTsKK0Jsb2NrRHJpdmVyU3RhdGUgKmJkcnZfbmV4dChCbG9ja0RyaXZlclN0YXRlICpicyk7Cit2b2lkIGJkcnZfaXRlcmF0ZSh2b2lkICgqaXQpKHZvaWQgKm9wYXF1ZSwgQmxvY2tEcml2ZXJTdGF0ZSAqYnMpLAorICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2ludCBiZHJ2X2lzX2VuY3J5cHRlZChCbG9ja0RyaXZlclN0YXRlICpicyk7CitpbnQgYmRydl9rZXlfcmVxdWlyZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworaW50IGJkcnZfc2V0X2tleShCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgY2hhciAqa2V5KTsKK2ludCBiZHJ2X3F1ZXJ5X21pc3Npbmdfa2V5cyh2b2lkKTsKK3ZvaWQgYmRydl9pdGVyYXRlX2Zvcm1hdCh2b2lkICgqaXQpKHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2NvbnN0IGNoYXIgKmJkcnZfZ2V0X2RldmljZV9uYW1lKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKK2ludCBiZHJ2X3dyaXRlX2NvbXByZXNzZWQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgc2VjdG9yX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbmJfc2VjdG9ycyk7CitpbnQgYmRydl9nZXRfaW5mbyhCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tEcml2ZXJJbmZvICpiZGkpOworCitjb25zdCBjaGFyICpiZHJ2X2dldF9lbmNyeXB0ZWRfZmlsZW5hbWUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOwordm9pZCBiZHJ2X2dldF9iYWNraW5nX2ZpbGVuYW1lKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lLCBpbnQgZmlsZW5hbWVfc2l6ZSk7CitpbnQgYmRydl9jYW5fc25hcHNob3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworaW50IGJkcnZfaXNfc25hcHNob3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworQmxvY2tEcml2ZXJTdGF0ZSAqYmRydl9zbmFwc2hvdHModm9pZCk7CitpbnQgYmRydl9zbmFwc2hvdF9jcmVhdGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNuYXBzaG90SW5mbyAqc25faW5mbyk7CitpbnQgYmRydl9zbmFwc2hvdF9nb3RvKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzbmFwc2hvdF9pZCk7CitpbnQgYmRydl9zbmFwc2hvdF9kZWxldGUoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKTsKK2ludCBiZHJ2X3NuYXBzaG90X2xpc3QoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsCisgICAgICAgICAgICAgICAgICAgICAgIFFFTVVTbmFwc2hvdEluZm8gKipwc25faW5mbyk7CitjaGFyICpiZHJ2X3NuYXBzaG90X2R1bXAoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIFFFTVVTbmFwc2hvdEluZm8gKnNuKTsKKworY2hhciAqZ2V0X2h1bWFuX3JlYWRhYmxlX3NpemUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGludDY0X3Qgc2l6ZSk7CitpbnQgcGF0aF9pc19hYnNvbHV0ZShjb25zdCBjaGFyICpwYXRoKTsKK3ZvaWQgcGF0aF9jb21iaW5lKGNoYXIgKmRlc3QsIGludCBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlX3BhdGgsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisKK2ludCBiZHJ2X3NhdmVfdm1zdGF0ZShCbG9ja0RyaXZlclN0YXRlICpicywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSk7CisKK2ludCBiZHJ2X2xvYWRfdm1zdGF0ZShCbG9ja0RyaXZlclN0YXRlICpicywgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSk7CisKKyNkZWZpbmUgQkRSVl9TRUNUT1JTX1BFUl9ESVJUWV9DSFVOSyAyMDQ4CisKK3ZvaWQgYmRydl9zZXRfZGlydHlfdHJhY2tpbmcoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBlbmFibGUpOworaW50IGJkcnZfZ2V0X2RpcnR5KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcik7Cit2b2lkIGJkcnZfcmVzZXRfZGlydHkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3QgY3VyX3NlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbnJfc2VjdG9ycyk7CitpbnQ2NF90IGJkcnZfZ2V0X2RpcnR5X2NvdW50KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKKworCit0eXBlZGVmIGVudW0geworICAgIEJMS0RCR19MMV9VUERBVEUsCisKKyAgICBCTEtEQkdfTDFfR1JPV19BTExPQ19UQUJMRSwKKyAgICBCTEtEQkdfTDFfR1JPV19XUklURV9UQUJMRSwKKyAgICBCTEtEQkdfTDFfR1JPV19BQ1RJVkFURV9UQUJMRSwKKworICAgIEJMS0RCR19MMl9MT0FELAorICAgIEJMS0RCR19MMl9VUERBVEUsCisgICAgQkxLREJHX0wyX1VQREFURV9DT01QUkVTU0VELAorICAgIEJMS0RCR19MMl9BTExPQ19DT1dfUkVBRCwKKyAgICBCTEtEQkdfTDJfQUxMT0NfV1JJVEUsCisKKyAgICBCTEtEQkdfUkVBRCwKKyAgICBCTEtEQkdfUkVBRF9BSU8sCisgICAgQkxLREJHX1JFQURfQkFDS0lORywKKyAgICBCTEtEQkdfUkVBRF9CQUNLSU5HX0FJTywKKyAgICBCTEtEQkdfUkVBRF9DT01QUkVTU0VELAorCisgICAgQkxLREJHX1dSSVRFX0FJTywKKyAgICBCTEtEQkdfV1JJVEVfQ09NUFJFU1NFRCwKKworICAgIEJMS0RCR19WTVNUQVRFX0xPQUQsCisgICAgQkxLREJHX1ZNU1RBVEVfU0FWRSwKKworICAgIEJMS0RCR19DT1dfUkVBRCwKKyAgICBCTEtEQkdfQ09XX1dSSVRFLAorCisgICAgQkxLREJHX1JFRlRBQkxFX0xPQUQsCisgICAgQkxLREJHX1JFRlRBQkxFX0dST1csCisKKyAgICBCTEtEQkdfUkVGQkxPQ0tfTE9BRCwKKyAgICBCTEtEQkdfUkVGQkxPQ0tfVVBEQVRFLAorICAgIEJMS0RCR19SRUZCTE9DS19VUERBVEVfUEFSVCwKKyAgICBCTEtEQkdfUkVGQkxPQ0tfQUxMT0MsCisgICAgQkxLREJHX1JFRkJMT0NLX0FMTE9DX0hPT0tVUCwKKyAgICBCTEtEQkdfUkVGQkxPQ0tfQUxMT0NfV1JJVEUsCisgICAgQkxLREJHX1JFRkJMT0NLX0FMTE9DX1dSSVRFX0JMT0NLUywKKyAgICBCTEtEQkdfUkVGQkxPQ0tfQUxMT0NfV1JJVEVfVEFCTEUsCisgICAgQkxLREJHX1JFRkJMT0NLX0FMTE9DX1NXSVRDSF9UQUJMRSwKKworICAgIEJMS0RCR19DTFVTVEVSX0FMTE9DLAorICAgIEJMS0RCR19DTFVTVEVSX0FMTE9DX0JZVEVTLAorICAgIEJMS0RCR19DTFVTVEVSX0ZSRUUsCisKKyAgICBCTEtEQkdfRVZFTlRfTUFYLAorfSBCbGtEZWJ1Z0V2ZW50OworCisjZGVmaW5lIEJMS0RCR19FVkVOVChicywgZXZ0KSBiZHJ2X2RlYnVnX2V2ZW50KGJzLCBldnQpCit2b2lkIGJkcnZfZGVidWdfZXZlbnQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIEJsa0RlYnVnRXZlbnQgZXZlbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ibG9jay9ibG9ja19pbnQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ibG9jay9ibG9ja19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWE5MzIzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Jsb2NrL2Jsb2NrX2ludC5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IgYmxvY2sgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBCTE9DS19JTlRfSAorI2RlZmluZSBCTE9DS19JTlRfSAorCisjaW5jbHVkZSAiYmxvY2svYmxvY2suaCIKKyNpbmNsdWRlICJxZW11L29wdGlvbi5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKworI2RlZmluZSBCTE9DS19GTEFHX0VOQ1JZUFQJMQorI2RlZmluZSBCTE9DS19GTEFHX0NPTVBSRVNTCTIKKyNkZWZpbmUgQkxPQ0tfRkxBR19DT01QQVQ2CTQKKworI2RlZmluZSBCTE9DS19PUFRfU0laRSAgICAgICAgICAic2l6ZSIKKyNkZWZpbmUgQkxPQ0tfT1BUX0VOQ1JZUFQgICAgICAgImVuY3J5cHRpb24iCisjZGVmaW5lIEJMT0NLX09QVF9DT01QQVQ2ICAgICAgICJjb21wYXQ2IgorI2RlZmluZSBCTE9DS19PUFRfQkFDS0lOR19GSUxFICAiYmFja2luZ19maWxlIgorI2RlZmluZSBCTE9DS19PUFRfQkFDS0lOR19GTVQgICAiYmFja2luZ19mbXQiCisjZGVmaW5lIEJMT0NLX09QVF9DTFVTVEVSX1NJWkUgICJjbHVzdGVyX3NpemUiCisjZGVmaW5lIEJMT0NLX09QVF9QUkVBTExPQyAgICAgICJwcmVhbGxvY2F0aW9uIgorCit0eXBlZGVmIHN0cnVjdCBBSU9Qb29sIHsKKyAgICB2b2lkICgqY2FuY2VsKShCbG9ja0RyaXZlckFJT0NCICphY2IpOworICAgIGludCBhaW9jYl9zaXplOworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKmZyZWVfYWlvY2I7Cit9IEFJT1Bvb2w7CisKK3N0cnVjdCBCbG9ja0RyaXZlciB7CisgICAgY29uc3QgY2hhciAqZm9ybWF0X25hbWU7CisgICAgaW50IGluc3RhbmNlX3NpemU7CisgICAgaW50ICgqYmRydl9wcm9iZSkoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICBpbnQgKCpiZHJ2X3Byb2JlX2RldmljZSkoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIGludCAoKmJkcnZfb3BlbikoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBmbGFncyk7CisgICAgaW50ICgqYmRydl9maWxlX29wZW4pKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzKTsKKyAgICBpbnQgKCpiZHJ2X3JlYWQpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKTsKKyAgICBpbnQgKCpiZHJ2X3dyaXRlKShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG5iX3NlY3RvcnMpOworICAgIHZvaWQgKCpiZHJ2X2Nsb3NlKShCbG9ja0RyaXZlclN0YXRlICpicyk7CisgICAgaW50ICgqYmRydl9jcmVhdGUpKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBRRU1VT3B0aW9uUGFyYW1ldGVyICpvcHRpb25zKTsKKyAgICB2b2lkICgqYmRydl9mbHVzaCkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworICAgIGludCAoKmJkcnZfaXNfYWxsb2NhdGVkKShCbG9ja0RyaXZlclN0YXRlICpicywgaW50NjRfdCBzZWN0b3JfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2VjdG9ycywgaW50ICpwbnVtKTsKKyAgICBpbnQgKCpiZHJ2X3NldF9rZXkpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCBjaGFyICprZXkpOworICAgIGludCAoKmJkcnZfbWFrZV9lbXB0eSkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMpOworICAgIC8qIGFpbyAqLworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKigqYmRydl9haW9fcmVhZHYpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBpbnQ2NF90IHNlY3Rvcl9udW0sIFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IG5iX3NlY3RvcnMsCisgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKigqYmRydl9haW9fd3JpdGV2KShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKKyAgICBCbG9ja0RyaXZlckFJT0NCICooKmJkcnZfYWlvX2ZsdXNoKShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSk7CisKKyAgICBpbnQgKCpiZHJ2X2Fpb19tdWx0aXdyaXRlKShCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tSZXF1ZXN0ICpyZXFzLAorICAgICAgICBpbnQgbnVtX3JlcXMpOworICAgIGludCAoKmJkcnZfbWVyZ2VfcmVxdWVzdHMpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBCbG9ja1JlcXVlc3QqIGEsCisgICAgICAgIEJsb2NrUmVxdWVzdCAqYik7CisKKworICAgIGNvbnN0IGNoYXIgKnByb3RvY29sX25hbWU7CisgICAgaW50ICgqYmRydl90cnVuY2F0ZSkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludDY0X3Qgb2Zmc2V0KTsKKyAgICBpbnQ2NF90ICgqYmRydl9nZXRsZW5ndGgpKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKKyAgICBpbnQgKCpiZHJ2X3dyaXRlX2NvbXByZXNzZWQpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQ2NF90IHNlY3Rvcl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBuYl9zZWN0b3JzKTsKKworICAgIGludCAoKmJkcnZfc25hcHNob3RfY3JlYXRlKShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNuYXBzaG90SW5mbyAqc25faW5mbyk7CisgICAgaW50ICgqYmRydl9zbmFwc2hvdF9nb3RvKShCbG9ja0RyaXZlclN0YXRlICpicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKTsKKyAgICBpbnQgKCpiZHJ2X3NuYXBzaG90X2RlbGV0ZSkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGNvbnN0IGNoYXIgKnNuYXBzaG90X2lkKTsKKyAgICBpbnQgKCpiZHJ2X3NuYXBzaG90X2xpc3QpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNuYXBzaG90SW5mbyAqKnBzbl9pbmZvKTsKKyAgICBpbnQgKCpiZHJ2X2dldF9pbmZvKShCbG9ja0RyaXZlclN0YXRlICpicywgQmxvY2tEcml2ZXJJbmZvICpiZGkpOworCisgICAgaW50ICgqYmRydl9zYXZlX3Ztc3RhdGUpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSk7CisgICAgaW50ICgqYmRydl9sb2FkX3Ztc3RhdGUpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSk7CisKKyAgICBpbnQgKCpiZHJ2X2NoYW5nZV9iYWNraW5nX2ZpbGUpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICBjb25zdCBjaGFyICpiYWNraW5nX2ZpbGUsIGNvbnN0IGNoYXIgKmJhY2tpbmdfZm10KTsKKworICAgIC8qIHJlbW92YWJsZSBkZXZpY2Ugc3BlY2lmaWMgKi8KKyAgICBpbnQgKCpiZHJ2X2lzX2luc2VydGVkKShCbG9ja0RyaXZlclN0YXRlICpicyk7CisgICAgaW50ICgqYmRydl9tZWRpYV9jaGFuZ2VkKShCbG9ja0RyaXZlclN0YXRlICpicyk7CisgICAgaW50ICgqYmRydl9lamVjdCkoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBlamVjdF9mbGFnKTsKKyAgICBpbnQgKCpiZHJ2X3NldF9sb2NrZWQpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgbG9ja2VkKTsKKworICAgIC8qIHRvIGNvbnRyb2wgZ2VuZXJpYyBzY3NpIGRldmljZXMgKi8KKyAgICBpbnQgKCpiZHJ2X2lvY3RsKShCbG9ja0RyaXZlclN0YXRlICpicywgdW5zaWduZWQgbG9uZyBpbnQgcmVxLCB2b2lkICpidWYpOworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKigqYmRydl9haW9faW9jdGwpKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICB1bnNpZ25lZCBsb25nIGludCByZXEsIHZvaWQgKmJ1ZiwKKyAgICAgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2IsIHZvaWQgKm9wYXF1ZSk7CisKKyAgICAvKiBMaXN0IG9mIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGltYWdlcywgdGVybWluYXRlZCBieSBuYW1lID09IE5VTEwgKi8KKyAgICBRRU1VT3B0aW9uUGFyYW1ldGVyICpjcmVhdGVfb3B0aW9uczsKKworCisgICAgLyoKKyAgICAgKiBSZXR1cm5zIDAgZm9yIGNvbXBsZXRlZCBjaGVjaywgLWVycm5vIGZvciBpbnRlcm5hbCBlcnJvcnMuCisgICAgICogVGhlIGNoZWNrIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiByZXN1bHQuCisgICAgICovCisgICAgaW50ICgqYmRydl9jaGVjaykoQmxvY2tEcml2ZXJTdGF0ZSogYnMsIEJkcnZDaGVja1Jlc3VsdCAqcmVzdWx0KTsKKworICAgIHZvaWQgKCpiZHJ2X2RlYnVnX2V2ZW50KShCbG9ja0RyaXZlclN0YXRlICpicywgQmxrRGVidWdFdmVudCBldmVudCk7CisKKyAgICAvKgorICAgICAqIFJldHVybnMgMSBpZiBuZXdseSBjcmVhdGVkIGltYWdlcyBhcmUgZ3VhcmFudGVlZCB0byBjb250YWluIG9ubHkKKyAgICAgKiB6ZXJvcywgMCBvdGhlcndpc2UuCisgICAgICovCisgICAgaW50ICgqYmRydl9oYXNfemVyb19pbml0KShCbG9ja0RyaXZlclN0YXRlICpicyk7CisKKyAgICBRTElTVF9FTlRSWShCbG9ja0RyaXZlcikgbGlzdDsKK307CisKK3N0cnVjdCBCbG9ja0RyaXZlclN0YXRlIHsKKyAgICBpbnQ2NF90IHRvdGFsX3NlY3RvcnM7IC8qIGlmIHdlIGFyZSByZWFkaW5nIGEgZGlzayBpbWFnZSwgZ2l2ZSBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaW4gc2VjdG9ycyAqLworICAgIGludCByZWFkX29ubHk7IC8qIGlmIHRydWUsIHRoZSBtZWRpYSBpcyByZWFkIG9ubHkgKi8KKyAgICBpbnQga2VlcF9yZWFkX29ubHk7IC8qIGlmIHRydWUsIHRoZSBtZWRpYSB3YXMgcmVxdWVzdGVkIHRvIHN0YXkgcmVhZCBvbmx5ICovCisgICAgaW50IG9wZW5fZmxhZ3M7IC8qIGZsYWdzIHVzZWQgdG8gb3BlbiB0aGUgZmlsZSwgcmUtdXNlZCBmb3IgcmUtb3BlbiAqLworICAgIGludCByZW1vdmFibGU7IC8qIGlmIHRydWUsIHRoZSBtZWRpYSBjYW4gYmUgcmVtb3ZlZCAqLworICAgIGludCBsb2NrZWQ7ICAgIC8qIGlmIHRydWUsIHRoZSBtZWRpYSBjYW5ub3QgdGVtcG9yYXJpbHkgYmUgZWplY3RlZCAqLworICAgIGludCB0cmF5X29wZW47IC8qIGlmIHRydWUsIHRoZSB2aXJ0dWFsIHRyYXkgaXMgb3BlbiAqLworICAgIGludCBlbmNyeXB0ZWQ7IC8qIGlmIHRydWUsIHRoZSBtZWRpYSBpcyBlbmNyeXB0ZWQgKi8KKyAgICBpbnQgdmFsaWRfa2V5OyAvKiBpZiB0cnVlLCBhIHZhbGlkIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIHNldCAqLworICAgIGludCBzZzsgICAgICAgIC8qIGlmIHRydWUsIHRoZSBkZXZpY2UgaXMgYSAvZGV2L3NnKiAqLworICAgIGludCBwcm9iZWQ7ICAgIC8qIGlmIHRydWUsIGZvcm1hdCB3YXMgcHJvYmVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgICAvKiBldmVudCBjYWxsYmFjayB3aGVuIGluc2VydGluZy9yZW1vdmluZyAqLworICAgIHZvaWQgKCpjaGFuZ2VfY2IpKHZvaWQgKm9wYXF1ZSk7CisgICAgdm9pZCAqY2hhbmdlX29wYXF1ZTsKKworICAgIEJsb2NrRHJpdmVyICpkcnY7IC8qIE5VTEwgbWVhbnMgbm8gbWVkaWEgKi8KKyAgICB2b2lkICpvcGFxdWU7CisKKyAgICBEZXZpY2VTdGF0ZSAqcGVlcjsKKworICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CisgICAgY2hhciBiYWNraW5nX2ZpbGVbMTAyNF07IC8qIGlmIG5vbiB6ZXJvLCB0aGUgaW1hZ2UgaXMgYSBkaWZmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmlsZSBpbWFnZSAqLworICAgIGNoYXIgYmFja2luZ19mb3JtYXRbMTZdOyAvKiBpZiBub24temVybyBhbmQgYmFja2luZ19maWxlIGV4aXN0cyAqLworICAgIGludCBpc190ZW1wb3Jhcnk7CisgICAgaW50IG1lZGlhX2NoYW5nZWQ7CisKKyAgICBCbG9ja0RyaXZlclN0YXRlICpiYWNraW5nX2hkOworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmZpbGU7CisKKyAgICAvKiBhc3luYyByZWFkL3dyaXRlIGVtdWxhdGlvbiAqLworCisgICAgdm9pZCAqc3luY19haW9jYjsKKworICAgIC8qIEkvTyBzdGF0cyAoZGlzcGxheSB3aXRoICJpbmZvIGJsb2Nrc3RhdHMiKS4gKi8KKyAgICB1aW50NjRfdCByZF9ieXRlczsKKyAgICB1aW50NjRfdCB3cl9ieXRlczsKKyAgICB1aW50NjRfdCByZF9vcHM7CisgICAgdWludDY0X3Qgd3Jfb3BzOworICAgIHVpbnQ2NF90IHdyX2hpZ2hlc3Rfc2VjdG9yOworCisgICAgLyogV2hldGhlciB0aGUgZGlzayBjYW4gZXhwYW5kIGJleW9uZCB0b3RhbF9zZWN0b3JzICovCisgICAgaW50IGdyb3dhYmxlOworCisgICAgLyogdGhlIG1lbW9yeSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoZSBidWZmZXJzIGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIgKi8KKyAgICBpbnQgYnVmZmVyX2FsaWdubWVudDsKKworICAgIC8qIGRvIHdlIG5lZWQgdG8gdGVsbCB0aGUgcXVlc3QgaWYgd2UgaGF2ZSBhIHZvbGF0aWxlIHdyaXRlIGNhY2hlPyAqLworICAgIGludCBlbmFibGVfd3JpdGVfY2FjaGU7CisKKyAgICAvKiBOT1RFOiB0aGUgZm9sbG93aW5nIGluZm9zIGFyZSBvbmx5IGhpbnRzIGZvciByZWFsIGhhcmR3YXJlCisgICAgICAgZHJpdmVycy4gVGhleSBhcmUgbm90IHVzZWQgYnkgdGhlIGJsb2NrIGRyaXZlciAqLworICAgIGludCBjeWxzLCBoZWFkcywgc2VjcywgdHJhbnNsYXRpb247CisgICAgaW50IHR5cGU7CisgICAgQmxvY2tFcnJvckFjdGlvbiBvbl9yZWFkX2Vycm9yLCBvbl93cml0ZV9lcnJvcjsKKyAgICBjaGFyIGRldmljZV9uYW1lWzMyXTsKKyAgICB1bnNpZ25lZCBsb25nICpkaXJ0eV9iaXRtYXA7CisgICAgaW50NjRfdCBkaXJ0eV9jb3VudDsKKyAgICBRVEFJTFFfRU5UUlkoQmxvY2tEcml2ZXJTdGF0ZSkgbGlzdDsKKyAgICB2b2lkICpwcml2YXRlOworfTsKKworc3RydWN0IEJsb2NrRHJpdmVyQUlPQ0IgeworICAgIEFJT1Bvb2wgKnBvb2w7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisgICAgQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqY2I7CisgICAgdm9pZCAqb3BhcXVlOworICAgIEJsb2NrRHJpdmVyQUlPQ0IgKm5leHQ7Cit9OworCit2b2lkIGdldF90bXBfZmlsZW5hbWUoY2hhciAqZmlsZW5hbWUsIGludCBzaXplKTsKKwordm9pZCAqcWVtdV9haW9fZ2V0KEFJT1Bvb2wgKnBvb2wsIEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X2Fpb19yZWxlYXNlKHZvaWQgKnApOworCit2b2lkICpxZW11X2Jsb2NrYWxpZ24oQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIHNpemVfdCBzaXplKTsKKworI2lmZGVmIF9XSU4zMgoraW50IGlzX3dpbmRvd3NfZHJpdmUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEJsb2NrQ29uZiB7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisgICAgdWludDE2X3QgcGh5c2ljYWxfYmxvY2tfc2l6ZTsKKyAgICB1aW50MTZfdCBsb2dpY2FsX2Jsb2NrX3NpemU7CisgICAgdWludDE2X3QgbWluX2lvX3NpemU7CisgICAgdWludDMyX3Qgb3B0X2lvX3NpemU7Cit9IEJsb2NrQ29uZjsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0X3BoeXNpY2FsX2Jsb2NrX2V4cChCbG9ja0NvbmYgKmNvbmYpCit7CisgICAgdW5zaWduZWQgaW50IGV4cCA9IDAsIHNpemU7CisKKyAgICBmb3IgKHNpemUgPSBjb25mLT5waHlzaWNhbF9ibG9ja19zaXplOworICAgICAgICBzaXplID4gY29uZi0+bG9naWNhbF9ibG9ja19zaXplOworICAgICAgICBzaXplID4+PSAxKSB7CisgICAgICAgIGV4cCsrOworICAgIH0KKworICAgIHJldHVybiBleHA7Cit9CisKKyNkZWZpbmUgREVGSU5FX0JMT0NLX1BST1BFUlRJRVMoX3N0YXRlLCBfY29uZikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUZJTkVfUFJPUF9EUklWRSgiZHJpdmUiLCBfc3RhdGUsIF9jb25mLmJzKSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUZJTkVfUFJPUF9VSU5UMTYoImxvZ2ljYWxfYmxvY2tfc2l6ZSIsIF9zdGF0ZSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgX2NvbmYubG9naWNhbF9ibG9ja19zaXplLCA1MTIpLCAgICAgICAgICAgICAgICAgIFwKKyAgICBERUZJTkVfUFJPUF9VSU5UMTYoInBoeXNpY2FsX2Jsb2NrX3NpemUiLCBfc3RhdGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgX2NvbmYucGh5c2ljYWxfYmxvY2tfc2l6ZSwgNTEyKSwgICAgICAgICAgICAgICAgIFwKKyAgICBERUZJTkVfUFJPUF9VSU5UMTYoIm1pbl9pb19zaXplIiwgX3N0YXRlLCBfY29uZi5taW5faW9fc2l6ZSwgMCksICBcCisgICAgREVGSU5FX1BST1BfVUlOVDMyKCJvcHRfaW9fc2l6ZSIsIF9zdGF0ZSwgX2NvbmYub3B0X2lvX3NpemUsIDApCisKKyNlbmRpZiAvKiBCTE9DS19JTlRfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Rpc2FzL2JmZC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Rpc2FzL2JmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NzA2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZGlzYXMvYmZkLmgKQEAgLTAsMCArMSw0OTUgQEAKKy8qIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBvcGNvZGUgbGlicmFyeSBhbmQgaXRzIGNhbGxlcnMuCisgICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTkzLgorCisgICBUaGUgb3Bjb2RlIGxpYnJhcnkgKGxpYm9wY29kZXMuYSkgcHJvdmlkZXMgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgZm9yCisgICBhIGxhcmdlIHZhcmlldHkgb2YgaW5zdHJ1Y3Rpb24gc2V0cywgY2FsbGFibGUgd2l0aCBhbiBpZGVudGljYWwKKyAgIGludGVyZmFjZSwgZm9yIG1ha2luZyBpbnN0cnVjdGlvbi1wcm9jZXNzaW5nIHByb2dyYW1zIG1vcmUgaW5kZXBlbmRlbnQKKyAgIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQgYmVpbmcgcHJvY2Vzc2VkLiAgKi8KKworI2lmbmRlZiBESVNfQVNNX0gKKyNkZWZpbmUgRElTX0FTTV9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiB2b2lkICpQVFI7Cit0eXBlZGVmIHVpbnQ2NF90IGJmZF92bWE7Cit0eXBlZGVmIGludDY0X3QgYmZkX3NpZ25lZF92bWE7Cit0eXBlZGVmIHVpbnQ4X3QgYmZkX2J5dGU7CisjZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZiAocywgIiUwIiBQUkl4NjQsIHgpCisjZGVmaW5lIHNucHJpbnRmX3ZtYShzLHNzLHgpIHNucHJpbnRmIChzLCBzcywgIiUwIiBQUkl4NjQsIHgpCisKK3R5cGVkZWYgaW50ICgqZnByaW50Zl9mdW5jdGlvbikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisjZW5kaWYKKworI2RlZmluZSBCRkQ2NAorCitlbnVtIGJmZF9mbGF2b3VyIHsKKyAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKKyAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAorICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAorICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAorICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCisgIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKKyAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKK307CisKK2VudW0gYmZkX2VuZGlhbiB7IEJGRF9FTkRJQU5fQklHLCBCRkRfRU5ESUFOX0xJVFRMRSwgQkZEX0VORElBTl9VTktOT1dOIH07CisKK2VudW0gYmZkX2FyY2hpdGVjdHVyZQoreworICBiZmRfYXJjaF91bmtub3duLCAgICAvKiBGaWxlIGFyY2ggbm90IGtub3duICovCisgIGJmZF9hcmNoX29ic2N1cmUsICAgIC8qIEFyY2gga25vd24sIG5vdCBvbmUgb2YgdGhlc2UgKi8KKyAgYmZkX2FyY2hfbTY4aywgICAgICAgLyogTW90b3JvbGEgNjh4eHggKi8KKyNkZWZpbmUgYmZkX21hY2hfbTY4MDAwIDEKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDA4IDIKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDEwIDMKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDIwIDQKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDMwIDUKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDQwIDYKKyNkZWZpbmUgYmZkX21hY2hfbTY4MDYwIDcKKyNkZWZpbmUgYmZkX21hY2hfY3B1MzIgIDgKKyNkZWZpbmUgYmZkX21hY2hfbWNmNTIwMCAgOQorI2RlZmluZSBiZmRfbWFjaF9tY2Y1MjA2ZSAxMAorI2RlZmluZSBiZmRfbWFjaF9tY2Y1MzA3ICAxMQorI2RlZmluZSBiZmRfbWFjaF9tY2Y1NDA3ICAxMgorI2RlZmluZSBiZmRfbWFjaF9tY2Y1Mjh4ICAxMworI2RlZmluZSBiZmRfbWFjaF9tY2Z2NGUgICAxNAorI2RlZmluZSBiZmRfbWFjaF9tY2Y1MjF4ICAgMTUKKyNkZWZpbmUgYmZkX21hY2hfbWNmNTI0OSAgIDE2CisjZGVmaW5lIGJmZF9tYWNoX21jZjU0N3ggICAxNworI2RlZmluZSBiZmRfbWFjaF9tY2Y1NDh4ICAgMTgKKyAgYmZkX2FyY2hfdmF4LCAgICAgICAgLyogREVDIFZheCAqLworICBiZmRfYXJjaF9pOTYwLCAgICAgICAvKiBJbnRlbCA5NjAgKi8KKyAgICAgLyogVGhlIG9yZGVyIG9mIHRoZSBmb2xsb3dpbmcgaXMgaW1wb3J0YW50LgorICAgICAgIGxvd2VyIG51bWJlciBpbmRpY2F0ZXMgYSBtYWNoaW5lIHR5cGUgdGhhdAorICAgICAgIG9ubHkgYWNjZXB0cyBhIHN1YnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgICAgYXZhaWxhYmxlIHRvIG1hY2hpbmVzIHdpdGggaGlnaGVyIG51bWJlcnMuCisgICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKKyAgICAgICBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXIgbWFjaGluZXMgZXhjZXB0CisgICAgICAgImNvcmUiLiAqLworCisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfY29yZSAgICAgIDEKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYV9zYSAgICAgMgorI2RlZmluZSBiZmRfbWFjaF9pOTYwX2tiX3NiICAgICAzCisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfbWMgICAgICAgIDQKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF94YSAgICAgICAgNQorI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NhICAgICAgICA2CisjZGVmaW5lIGJmZF9tYWNoX2k5NjBfanggICAgICAgIDcKKyNkZWZpbmUgYmZkX21hY2hfaTk2MF9oeCAgICAgICAgOAorCisgIGJmZF9hcmNoX2EyOWssICAgICAgIC8qIEFNRCAyOTAwMCAqLworICBiZmRfYXJjaF9zcGFyYywgICAgICAvKiBTUEFSQyAqLworI2RlZmluZSBiZmRfbWFjaF9zcGFyYyAgICAgICAgICAgICAgICAgMQorLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB2OHBsdXMgYW5kIHY5IGlzIHRoYXQgdjkgaXMgYSB0cnVlIDY0IGJpdCBlbnYuICAqLworI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCAgICAgICAgMgorI2RlZmluZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUgICAgICAgMworI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgICAgICAgICAgNAorI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhICAgICAgICAgNSAvKiB3aXRoIHVsdHJhc3BhcmMgYWRkJ25zLiAgKi8KKyNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlICAgIDYKKyNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjkgICAgICAgICAgICAgIDcKKyNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlhICAgICAgICAgICAgIDggLyogd2l0aCB1bHRyYXNwYXJjIGFkZCducy4gICovCisjZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2IgICAgICAgICA5IC8qIHdpdGggY2hlZXRhaCBhZGQnbnMuICAqLworI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OWIgICAgICAgICAgICAgMTAgLyogd2l0aCBjaGVldGFoIGFkZCducy4gICovCisvKiBOb256ZXJvIGlmIE1BQ0ggaGFzIHRoZSB2OSBpbnN0cnVjdGlvbiBzZXQuICAqLworI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OV9wKG1hY2gpIFwKKyAgKChtYWNoKSA+PSBiZmRfbWFjaF9zcGFyY192OHBsdXMgJiYgKG1hY2gpIDw9IGJmZF9tYWNoX3NwYXJjX3Y5YiBcCisgICAmJiAobWFjaCkgIT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKQorICBiZmRfYXJjaF9taXBzLCAgICAgICAvKiBNSVBTIFJ4eHh4ICovCisjZGVmaW5lIGJmZF9tYWNoX21pcHMzMDAwICAgICAgICAgICAgICAzMDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHMzOTAwICAgICAgICAgICAgICAzOTAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MDAwICAgICAgICAgICAgICA0MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MDEwICAgICAgICAgICAgICA0MDEwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MTAwICAgICAgICAgICAgICA0MTAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0MzAwICAgICAgICAgICAgICA0MzAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NDAwICAgICAgICAgICAgICA0NDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NjAwICAgICAgICAgICAgICA0NjAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM0NjUwICAgICAgICAgICAgICA0NjUwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM1MDAwICAgICAgICAgICAgICA1MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM2MDAwICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHM4MDAwICAgICAgICAgICAgICA4MDAwCisjZGVmaW5lIGJmZF9tYWNoX21pcHMxMDAwMCAgICAgICAgICAgICAxMDAwMAorI2RlZmluZSBiZmRfbWFjaF9taXBzMTYgICAgICAgICAgICAgICAgMTYKKyAgYmZkX2FyY2hfaTM4NiwgICAgICAgLyogSW50ZWwgMzg2ICovCisjZGVmaW5lIGJmZF9tYWNoX2kzODZfaTM4NiAwCisjZGVmaW5lIGJmZF9tYWNoX2kzODZfaTgwODYgMQorI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4IDIKKyNkZWZpbmUgYmZkX21hY2hfeDg2XzY0IDMKKyNkZWZpbmUgYmZkX21hY2hfeDg2XzY0X2ludGVsX3N5bnRheCA0CisgIGJmZF9hcmNoX3dlMzJrLCAgICAgIC8qIEFUJlQgV0UzMnh4eCAqLworICBiZmRfYXJjaF90YWhvZSwgICAgICAvKiBDQ0kvSGFycmlzIFRhaG9lICovCisgIGJmZF9hcmNoX2k4NjAsICAgICAgIC8qIEludGVsIDg2MCAqLworICBiZmRfYXJjaF9yb21wLCAgICAgICAvKiBJQk0gUk9NUCBQQy9SVCAqLworICBiZmRfYXJjaF9hbGxpYW50LCAgICAvKiBBbGxpYW50ICovCisgIGJmZF9hcmNoX2NvbnZleCwgICAgIC8qIENvbnZleCAqLworICBiZmRfYXJjaF9tODhrLCAgICAgICAvKiBNb3Rvcm9sYSA4OHh4eCAqLworICBiZmRfYXJjaF9weXJhbWlkLCAgICAvKiBQeXJhbWlkIFRlY2hub2xvZ3kgKi8KKyAgYmZkX2FyY2hfaDgzMDAsICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KKyNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCisjZGVmaW5lIGJmZF9tYWNoX2g4MzAwaCAgMgorI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKKyAgYmZkX2FyY2hfcG93ZXJwYywgICAgLyogUG93ZXJQQyAqLworI2RlZmluZSBiZmRfbWFjaF9wcGMgICAgICAgICAgIDAKKyNkZWZpbmUgYmZkX21hY2hfcHBjNjQgICAgICAgICAxCisjZGVmaW5lIGJmZF9tYWNoX3BwY180MDMgICAgICAgNDAzCisjZGVmaW5lIGJmZF9tYWNoX3BwY180MDNnYyAgICAgNDAzMAorI2RlZmluZSBiZmRfbWFjaF9wcGNfZTUwMCAgICAgIDUwMAorI2RlZmluZSBiZmRfbWFjaF9wcGNfNTA1ICAgICAgIDUwNQorI2RlZmluZSBiZmRfbWFjaF9wcGNfNjAxICAgICAgIDYwMQorI2RlZmluZSBiZmRfbWFjaF9wcGNfNjAyICAgICAgIDYwMgorI2RlZmluZSBiZmRfbWFjaF9wcGNfNjAzICAgICAgIDYwMworI2RlZmluZSBiZmRfbWFjaF9wcGNfZWM2MDNlICAgIDYwMzEKKyNkZWZpbmUgYmZkX21hY2hfcHBjXzYwNCAgICAgICA2MDQKKyNkZWZpbmUgYmZkX21hY2hfcHBjXzYyMCAgICAgICA2MjAKKyNkZWZpbmUgYmZkX21hY2hfcHBjXzYzMCAgICAgICA2MzAKKyNkZWZpbmUgYmZkX21hY2hfcHBjXzc1MCAgICAgICA3NTAKKyNkZWZpbmUgYmZkX21hY2hfcHBjXzg2MCAgICAgICA4NjAKKyNkZWZpbmUgYmZkX21hY2hfcHBjX2EzNSAgICAgICAzNQorI2RlZmluZSBiZmRfbWFjaF9wcGNfcnM2NGlpICAgIDY0MgorI2RlZmluZSBiZmRfbWFjaF9wcGNfcnM2NGlpaSAgIDY0MworI2RlZmluZSBiZmRfbWFjaF9wcGNfNzQwMCAgICAgIDc0MDAKKyAgYmZkX2FyY2hfcnM2MDAwLCAgICAgLyogSUJNIFJTLzYwMDAgKi8KKyAgYmZkX2FyY2hfaHBwYSwgICAgICAgLyogSFAgUEEgUklTQyAqLworI2RlZmluZSBiZmRfbWFjaF9ocHBhMTAgICAgICAgIDEwCisjZGVmaW5lIGJmZF9tYWNoX2hwcGExMSAgICAgICAgMTEKKyNkZWZpbmUgYmZkX21hY2hfaHBwYTIwICAgICAgICAyMAorI2RlZmluZSBiZmRfbWFjaF9ocHBhMjB3ICAgICAgIDI1CisgIGJmZF9hcmNoX2QxMHYsICAgICAgIC8qIE1pdHN1YmlzaGkgRDEwViAqLworICBiZmRfYXJjaF96OGssICAgICAgICAvKiBaaWxvZyBaODAwMCAqLworI2RlZmluZSBiZmRfbWFjaF96ODAwMSAgICAgICAgIDEKKyNkZWZpbmUgYmZkX21hY2hfejgwMDIgICAgICAgICAyCisgIGJmZF9hcmNoX2g4NTAwLCAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCisgIGJmZF9hcmNoX3NoLCAgICAgICAgIC8qIEhpdGFjaGkgU0ggKi8KKyNkZWZpbmUgYmZkX21hY2hfc2ggICAgICAgICAgICAxCisjZGVmaW5lIGJmZF9tYWNoX3NoMiAgICAgICAgMHgyMAorI2RlZmluZSBiZmRfbWFjaF9zaF9kc3AgICAgIDB4MmQKKyNkZWZpbmUgYmZkX21hY2hfc2gyYSAgICAgICAweDJhCisjZGVmaW5lIGJmZF9tYWNoX3NoMmFfbm9mcHUgMHgyYgorI2RlZmluZSBiZmRfbWFjaF9zaDJlICAgICAgIDB4MmUKKyNkZWZpbmUgYmZkX21hY2hfc2gzICAgICAgICAweDMwCisjZGVmaW5lIGJmZF9tYWNoX3NoM19ub21tdSAgMHgzMQorI2RlZmluZSBiZmRfbWFjaF9zaDNfZHNwICAgIDB4M2QKKyNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCisjZGVmaW5lIGJmZF9tYWNoX3NoNCAgICAgICAgMHg0MAorI2RlZmluZSBiZmRfbWFjaF9zaDRfbm9mcHUgIDB4NDEKKyNkZWZpbmUgYmZkX21hY2hfc2g0X25vbW11X25vZnB1ICAweDQyCisjZGVmaW5lIGJmZF9tYWNoX3NoNGEgICAgICAgMHg0YQorI2RlZmluZSBiZmRfbWFjaF9zaDRhX25vZnB1IDB4NGIKKyNkZWZpbmUgYmZkX21hY2hfc2g0YWxfZHNwICAweDRkCisjZGVmaW5lIGJmZF9tYWNoX3NoNSAgICAgICAgMHg1MAorICBiZmRfYXJjaF9hbHBoYSwgICAgICAvKiBEZWMgQWxwaGEgKi8KKyNkZWZpbmUgYmZkX21hY2hfYWxwaGEgMQorI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKKyNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY1ICAweDIwCisjZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NiAgMHgzMAorICBiZmRfYXJjaF9hcm0sICAgICAgICAvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLworI2RlZmluZSBiZmRfbWFjaF9hcm1fdW5rbm93bgkwCisjZGVmaW5lIGJmZF9tYWNoX2FybV8yCQkxCisjZGVmaW5lIGJmZF9tYWNoX2FybV8yYQkJMgorI2RlZmluZSBiZmRfbWFjaF9hcm1fMwkJMworI2RlZmluZSBiZmRfbWFjaF9hcm1fM00gCTQKKyNkZWZpbmUgYmZkX21hY2hfYXJtXzQgCQk1CisjZGVmaW5lIGJmZF9tYWNoX2FybV80VCAJNgorI2RlZmluZSBiZmRfbWFjaF9hcm1fNSAJCTcKKyNkZWZpbmUgYmZkX21hY2hfYXJtXzVUCQk4CisjZGVmaW5lIGJmZF9tYWNoX2FybV81VEUJOQorI2RlZmluZSBiZmRfbWFjaF9hcm1fWFNjYWxlCTEwCisjZGVmaW5lIGJmZF9tYWNoX2FybV9lcDkzMTIJMTEKKyNkZWZpbmUgYmZkX21hY2hfYXJtX2lXTU1YdAkxMgorI2RlZmluZSBiZmRfbWFjaF9hcm1faVdNTVh0MgkxMworICBiZmRfYXJjaF9uczMyaywgICAgICAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9ycyBuczMyMDAwICovCisgIGJmZF9hcmNoX3c2NSwgICAgICAgIC8qIFdEQyA2NTgxNiAqLworICBiZmRfYXJjaF90aWMzMCwgICAgICAvKiBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMzAgKi8KKyAgYmZkX2FyY2hfdjg1MCwgICAgICAgLyogTkVDIFY4NTAgKi8KKyNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCisgIGJmZF9hcmNoX2FyYywgICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSAqLworI2RlZmluZSBiZmRfbWFjaF9hcmNfYmFzZSAwCisgIGJmZF9hcmNoX20zMnIsICAgICAgIC8qIE1pdHN1YmlzaGkgTTMyUi9EICovCisjZGVmaW5lIGJmZF9tYWNoX20zMnIgICAgICAgICAgMCAgLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgYmZkX2FyY2hfbW4xMDIwMCwgICAgLyogTWF0c3VzaGl0YSBNTjEwMjAwICovCisgIGJmZF9hcmNoX21uMTAzMDAsICAgIC8qIE1hdHN1c2hpdGEgTU4xMDMwMCAqLworICBiZmRfYXJjaF9jcmlzLCAgICAgICAvKiBBeGlzIENSSVMgKi8KKyNkZWZpbmUgYmZkX21hY2hfY3Jpc192MF92MTAgICAyNTUKKyNkZWZpbmUgYmZkX21hY2hfY3Jpc192MzIgICAgICAzMgorI2RlZmluZSBiZmRfbWFjaF9jcmlzX3YxMF92MzIgIDEwMzIKKyAgYmZkX2FyY2hfbWljcm9ibGF6ZSwgLyogWGlsaW54IE1pY3JvQmxhemUuICAqLworICBiZmRfYXJjaF9tb3hpZSwgICAgICAvKiBUaGUgTW94aWUgY29yZS4gICovCisgIGJmZF9hcmNoX2lhNjQsICAgICAgLyogSFAvSW50ZWwgaWE2NCAqLworI2RlZmluZSBiZmRfbWFjaF9pYTY0X2VsZjY0ICAgIDY0CisjZGVmaW5lIGJmZF9tYWNoX2lhNjRfZWxmMzIgICAgMzIKKyAgYmZkX2FyY2hfbG0zMiwgICAgICAgLyogTGF0dGljZSBNaWNvMzIgKi8KKyNkZWZpbmUgYmZkX21hY2hfbG0zMiAxCisgIGJmZF9hcmNoX2xhc3QKKyAgfTsKKyNkZWZpbmUgYmZkX21hY2hfczM5MF8zMSAzMQorI2RlZmluZSBiZmRfbWFjaF9zMzkwXzY0IDY0CisKK3R5cGVkZWYgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeQoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIFBUUiBwOworICAgICAgICBiZmRfdm1hIGk7CisgICAgfSB1ZGF0YTsKK30gYXN5bWJvbDsKKworZW51bSBkaXNfaW5zbl90eXBlIHsKKyAgZGlzX25vbmluc24sCQkJLyogTm90IGEgdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KKyAgZGlzX25vbmJyYW5jaCwJCS8qIE5vdCBhIGJyYW5jaCBpbnN0cnVjdGlvbiAqLworICBkaXNfYnJhbmNoLAkJCS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCisgIGRpc19jb25kYnJhbmNoLAkJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCisgIGRpc19qc3IsCQkJLyogSnVtcCB0byBzdWJyb3V0aW5lICovCisgIGRpc19jb25kanNyLAkJCS8qIENvbmRpdGlvbmFsIGp1bXAgdG8gc3Vicm91dGluZSAqLworICBkaXNfZHJlZiwJCQkvKiBEYXRhIHJlZmVyZW5jZSBpbnN0cnVjdGlvbiAqLworICBkaXNfZHJlZjIJCQkvKiBUd28gZGF0YSByZWZlcmVuY2VzIGluIGluc3RydWN0aW9uICovCit9OworCisvKiBUaGlzIHN0cnVjdCBpcyBwYXNzZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rpbmcgcm91dGluZSwKKyAgIGFuZCBpcyBwYXNzZWQgYmFjayBvdXQgaW50byBlYWNoIGNhbGxiYWNrLiAgVGhlIHZhcmlvdXMgZmllbGRzIGFyZSB1c2VkCisgICBmb3IgY29udmV5aW5nIGluZm9ybWF0aW9uIGZyb20geW91ciBtYWluIHJvdXRpbmUgaW50byB5b3VyIGNhbGxiYWNrcywKKyAgIGZvciBwYXNzaW5nIGluZm9ybWF0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIChzdWNoIGFzIHRoZQorICAgYWRkcmVzc2VzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMpLCBvciBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbgorICAgYmFjayBmcm9tIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyB0byB0aGVpciBjYWxsZXJzLgorCisgICBJdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBpdCBpcyBmaXJzdCBwYXNzZWQ7IHRoaXMgY2FuIGJlIGRvbmUKKyAgIGJ5IGhhbmQsIG9yIHVzaW5nIG9uZSBvZiB0aGUgaW5pdGlhbGl6YXRpb24gbWFjcm9zIGJlbG93LiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyB7CisgIGZwcmludGZfZnVuY3Rpb24gZnByaW50Zl9mdW5jOworICBGSUxFICpzdHJlYW07CisgIFBUUiBhcHBsaWNhdGlvbl9kYXRhOworCisgIC8qIFRhcmdldCBkZXNjcmlwdGlvbi4gIFdlIGNvdWxkIHJlcGxhY2UgdGhpcyB3aXRoIGEgcG9pbnRlciB0byB0aGUgYmZkLAorICAgICBidXQgdGhhdCB3b3VsZCByZXF1aXJlIG9uZS4gIFRoZXJlIGN1cnJlbnRseSBpc24ndCBhbnkgc3VjaCByZXF1aXJlbWVudAorICAgICBzbyB0byBhdm9pZCBpbnRyb2R1Y2luZyBvbmUgd2UgcmVjb3JkIHRoZXNlIGV4cGxpY2l0bHkuICAqLworICAvKiBUaGUgYmZkX2ZsYXZvdXIuICBUaGlzIGNhbiBiZSBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ci4gICovCisgIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKKyAgLyogVGhlIGJmZF9hcmNoIHZhbHVlLiAgKi8KKyAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7CisgIC8qIFRoZSBiZmRfbWFjaCB2YWx1ZS4gICovCisgIHVuc2lnbmVkIGxvbmcgbWFjaDsKKyAgLyogRW5kaWFubmVzcyAoZm9yIGJpLWVuZGlhbiBjcHVzKS4gIE1vbm8tZW5kaWFuIGNwdXMgY2FuIGlnbm9yZSB0aGlzLiAgKi8KKyAgZW51bSBiZmRfZW5kaWFuIGVuZGlhbjsKKworICAvKiBBbiBhcnJheSBvZiBwb2ludGVycyB0byBzeW1ib2xzIGVpdGhlciBhdCB0aGUgbG9jYXRpb24gYmVpbmcgZGlzYXNzZW1ibGVkCisgICAgIG9yIGF0IHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgZGlzYXNzZW1ibGVkLiAgVGhlIGFycmF5IGlzIHNvcnRlZAorICAgICBzbyB0aGF0IHRoZSBmaXJzdCBzeW1ib2wgaXMgaW50ZW5kZWQgdG8gYmUgdGhlIG9uZSB1c2VkLiAgVGhlIG90aGVycyBhcmUKKyAgICAgcHJlc2VudCBmb3IgYW55IG1pc2MuIHB1cnBvc2VzLiAgVGhpcyBpcyBub3Qgc2V0IHJlbGlhYmx5LCBidXQgaWYgaXQgaXMKKyAgICAgbm90IE5VTEwsIGl0IGlzIGNvcnJlY3QuICAqLworICBhc3ltYm9sICoqc3ltYm9sczsKKyAgLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJyYXkuICAqLworICBpbnQgbnVtX3N5bWJvbHM7CisKKyAgLyogRm9yIHVzZSBieSB0aGUgZGlzYXNzZW1ibGVyLgorICAgICBUaGUgdG9wIDE2IGJpdHMgYXJlIHJlc2VydmVkIGZvciBwdWJsaWMgdXNlIChhbmQgYXJlIGRvY3VtZW50ZWQgaGVyZSkuCisgICAgIFRoZSBib3R0b20gMTYgYml0cyBhcmUgZm9yIHRoZSBpbnRlcm5hbCB1c2Ugb2YgdGhlIGRpc2Fzc2VtYmxlci4gICovCisgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIElOU05fSEFTX1JFTE9DCTB4ODAwMDAwMDAKKyAgUFRSIHByaXZhdGVfZGF0YTsKKworICAvKiBGdW5jdGlvbiB1c2VkIHRvIGdldCBieXRlcyB0byBkaXNhc3NlbWJsZS4gIE1FTUFERFIgaXMgdGhlCisgICAgIGFkZHJlc3Mgb2YgdGhlIHN0dWZmIHRvIGJlIGRpc2Fzc2VtYmxlZCwgTVlBRERSIGlzIHRoZSBhZGRyZXNzIHRvCisgICAgIHB1dCB0aGUgYnl0ZXMgaW4sIGFuZCBMRU5HVEggaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICBJTkZPIGlzIGEgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4KKyAgICAgUmV0dXJucyBhbiBlcnJubyB2YWx1ZSBvciAwIGZvciBzdWNjZXNzLiAgKi8KKyAgaW50ICgqcmVhZF9tZW1vcnlfZnVuYykKKyAgICAoYmZkX3ZtYSBtZW1hZGRyLCBiZmRfYnl0ZSAqbXlhZGRyLCBpbnQgbGVuZ3RoLAorCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pOworCisgIC8qIEZ1bmN0aW9uIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgaWYgd2UgZ2V0IGFuIGVycm9yIHRoYXQgd2UgY2FuJ3QKKyAgICAgcmVjb3ZlciBmcm9tLiAgU1RBVFVTIGlzIHRoZSBlcnJubyB2YWx1ZSBmcm9tIHJlYWRfbWVtb3J5X2Z1bmMgYW5kCisgICAgIE1FTUFERFIgaXMgdGhlIGFkZHJlc3MgdGhhdCB3ZSB3ZXJlIHRyeWluZyB0byByZWFkLiAgSU5GTyBpcyBhCisgICAgIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QuICAqLworICB2b2lkICgqbWVtb3J5X2Vycm9yX2Z1bmMpCisgICAgKGludCBzdGF0dXMsIGJmZF92bWEgbWVtYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pOworCisgIC8qIEZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCBBRERSLiAgKi8KKyAgdm9pZCAoKnByaW50X2FkZHJlc3NfZnVuYykKKyAgICAoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyk7CisKKyAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIHN5bWJvbCBhdCB0aGUgZ2l2ZW4gQUREUi4KKyAgICAgSWYgdGhlcmUgaXMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIDEsIG90aGVyd2lzZSBpdCByZXR1cm5zIDAuCisgICAgIFRoaXMgaXMgdXNlZCBieSBwb3J0cyB3aGljaCBzdXBwb3J0IGFuIG92ZXJsYXkgbWFuYWdlciB3aGVyZQorICAgICB0aGUgb3ZlcmxheSBudW1iZXIgaXMgaGVsZCBpbiB0aGUgdG9wIHBhcnQgb2YgYW4gYWRkcmVzcy4gIEluCisgICAgIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIG92ZXJsYXkgbnVtYmVyIGluIHRoZQorICAgICBhZGRyZXNzLCAobm9ybWFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgdGhhdCBhZGRyZXNzKSwgYnV0IHNvbWV0aW1lcyB3ZSB3YW50IHRvIG1hc2sgb3V0IHRoZSBvdmVybGF5IGJpdHMuICAqLworICBpbnQgKCogc3ltYm9sX2F0X2FkZHJlc3NfZnVuYykKKyAgICAoYmZkX3ZtYSBhZGRyLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm8pOworCisgIC8qIFRoZXNlIGFyZSBmb3IgYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KKyAgYmZkX2J5dGUgKmJ1ZmZlcjsKKyAgYmZkX3ZtYSBidWZmZXJfdm1hOworICBpbnQgYnVmZmVyX2xlbmd0aDsKKworICAvKiBUaGlzIHZhcmlhYmxlIG1heSBiZSBzZXQgYnkgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICBJdCBzdWdnZXN0cworICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBvYmpkdW1wIHNob3VsZCBkaXNwbGF5IG9uIGEgc2luZ2xlIGxpbmUuICBJZgorICAgICAgdGhlIGluc3RydWN0aW9uIGRlY29kZXIgc2V0cyB0aGlzLCBpdCBzaG91bGQgYWx3YXlzIHNldCBpdCB0bworICAgICAgdGhlIHNhbWUgdmFsdWUgaW4gb3JkZXIgdG8gZ2V0IHJlYXNvbmFibGUgbG9va2luZyBvdXRwdXQuICAqLworICBpbnQgYnl0ZXNfcGVyX2xpbmU7CisKKyAgLyogdGhlIG5leHQgdHdvIHZhcmlhYmxlcyBjb250cm9sIHRoZSB3YXkgb2JqZHVtcCBkaXNwbGF5cyB0aGUgcmF3IGRhdGEgKi8KKyAgLyogRm9yIGV4YW1wbGUsIGlmIGJ5dGVzX3Blcl9saW5lIGlzIDggYW5kIGJ5dGVzX3Blcl9jaHVuayBpcyA0LCB0aGUgKi8KKyAgLyogb3V0cHV0IHdpbGwgbG9vayBsaWtlIHRoaXM6CisgICAgIDAwOiAgIDAwMDAwMDAwIDAwMDAwMDAwCisgICAgIHdpdGggdGhlIGNodW5rcyBkaXNwbGF5ZWQgYWNjb3JkaW5nIHRvICJkaXNwbGF5X2VuZGlhbiIuICovCisgIGludCBieXRlc19wZXJfY2h1bms7CisgIGVudW0gYmZkX2VuZGlhbiBkaXNwbGF5X2VuZGlhbjsKKworICAvKiBSZXN1bHRzIGZyb20gaW5zdHJ1Y3Rpb24gZGVjb2RlcnMuICBOb3QgYWxsIGRlY29kZXJzIHlldCBzdXBwb3J0CisgICAgIHRoaXMgaW5mb3JtYXRpb24uICBUaGlzIGluZm8gaXMgc2V0IGVhY2ggdGltZSBhbiBpbnN0cnVjdGlvbiBpcworICAgICBkZWNvZGVkLCBhbmQgaXMgb25seSB2YWxpZCBmb3IgdGhlIGxhc3Qgc3VjaCBpbnN0cnVjdGlvbi4KKworICAgICBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGRlY29kZXIgc3VwcG9ydHMgdGhpcyBpbmZvcm1hdGlvbiwgc2V0CisgICAgIGluc25faW5mb192YWxpZCB0byAwLCBkZWNvZGUgYW4gaW5zdHJ1Y3Rpb24sIHRoZW4gY2hlY2sgaXQuICAqLworCisgIGNoYXIgaW5zbl9pbmZvX3ZhbGlkOwkJLyogQnJhbmNoIGluZm8gaGFzIGJlZW4gc2V0LiAqLworICBjaGFyIGJyYW5jaF9kZWxheV9pbnNuczsJLyogSG93IG1hbnkgc2VxdWVudGlhbCBpbnNuJ3Mgd2lsbCBydW4gYmVmb3JlCisJCQkJICAgYSBicmFuY2ggdGFrZXMgZWZmZWN0LiAgKDAgPSBub3JtYWwpICovCisgIGNoYXIgZGF0YV9zaXplOwkJLyogU2l6ZSBvZiBkYXRhIHJlZmVyZW5jZSBpbiBpbnNuLCBpbiBieXRlcyAqLworICBlbnVtIGRpc19pbnNuX3R5cGUgaW5zbl90eXBlOwkvKiBUeXBlIG9mIGluc3RydWN0aW9uICovCisgIGJmZF92bWEgdGFyZ2V0OwkJLyogVGFyZ2V0IGFkZHJlc3Mgb2YgYnJhbmNoIG9yIGRyZWYsIGlmIGtub3duOworCQkJCSAgIHplcm8gaWYgdW5rbm93bi4gICovCisgIGJmZF92bWEgdGFyZ2V0MjsJCS8qIFNlY29uZCB0YXJnZXQgYWRkcmVzcyBmb3IgZHJlZjIgKi8KKworICAvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0IGRpc2Fzc2VtYmxlci4gICovCisgIGNoYXIgKiBkaXNhc3NlbWJsZXJfb3B0aW9uczsKKworfSBkaXNhc3NlbWJsZV9pbmZvOworCisMCisvKiBTdGFuZGFyZCBkaXNhc3NlbWJsZXJzLiAgRGlzYXNzZW1ibGUgb25lIGluc3RydWN0aW9uIGF0IHRoZSBnaXZlbgorICAgdGFyZ2V0IGFkZHJlc3MuICBSZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHByb2Nlc3NlZC4gICovCit0eXBlZGVmIGludCAoKmRpc2Fzc2VtYmxlcl9mdHlwZSkgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKik7CisKK2ludCBwcmludF9pbnNuX3RjaShiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9iaWdfbWlwcyAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9saXR0bGVfbWlwcyAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9pMzg2ICAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9tNjhrICAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl96ODAwMSAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl96ODAwMiAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9oODMwMCAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9oODMwMGggICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9oODMwMHMgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9oODUwMCAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitpbnQgcHJpbnRfaW5zbl9hbHBoYSAgICAgICAgICAgIChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKik7CitkaXNhc3NlbWJsZXJfZnR5cGUgYXJjX2dldF9kaXNhc3NlbWJsZXIgKGludCwgaW50KTsKK2ludCBwcmludF9pbnNuX2FybSAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3NwYXJjICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2JpZ19hMjlrICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2xpdHRsZV9hMjlrICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2k5NjAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3NoICAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3NobCAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2hwcGEgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX20zMnIgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX204OGsgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX21uMTAyMDAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX21uMTAzMDAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX21veGllICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX25zMzJrICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2JpZ19wb3dlcnBjICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3JzNjAwMCAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3c2NSAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2QxMHYgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3Y4NTAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3RpYzMwICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3BwYyAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX3MzOTAgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2NyaXN2MzIgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2NyaXN2MTAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX21pY3JvYmxhemUgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2lhNjQgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKK2ludCBwcmludF9pbnNuX2xtMzIgICAgICAgICAgICAgKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKTsKKworI2lmIDAKKy8qIEZldGNoIHRoZSBkaXNhc3NlbWJsZXIgZm9yIGEgZ2l2ZW4gQkZELCBpZiB0aGF0IHN1cHBvcnQgaXMgYXZhaWxhYmxlLiAgKi8KK2Rpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZXIoYmZkICopOworI2VuZGlmCisKKwwKKy8qIFRoaXMgYmxvY2sgb2YgZGVmaW5pdGlvbnMgaXMgZm9yIHBhcnRpY3VsYXIgY2FsbGVycyB3aG8gcmVhZCBpbnN0cnVjdGlvbnMKKyAgIGludG8gYSBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhlIGluc3RydWN0aW9uIGRlY29kZXIuICAqLworCisvKiBIZXJlIGlzIGEgZnVuY3Rpb24gd2hpY2ggY2FsbGVycyBtYXkgd2lzaCB0byB1c2UgZm9yIHJlYWRfbWVtb3J5X2Z1bmMuCisgICBJdCBnZXRzIGJ5dGVzIGZyb20gYSBidWZmZXIuICAqLworaW50IGJ1ZmZlcl9yZWFkX21lbW9yeShiZmRfdm1hLCBiZmRfYnl0ZSAqLCBpbnQsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopOworCisvKiBUaGlzIGZ1bmN0aW9uIGdvZXMgd2l0aCBidWZmZXJfcmVhZF9tZW1vcnkuCisgICBJdCBwcmludHMgYSBtZXNzYWdlIHVzaW5nIGluZm8tPmZwcmludGZfZnVuYyBhbmQgaW5mby0+c3RyZWFtLiAgKi8KK3ZvaWQgcGVycm9yX21lbW9yeShpbnQsIGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopOworCisKKy8qIEp1c3QgcHJpbnQgdGhlIGFkZHJlc3MgaW4gaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IgY29tcGxldGVuZXNzIGV2ZW4KKyAgIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8gcHJpbnQgc3ltYm9saWMKKyAgIGFkZHJlc3NlcykuICAqLwordm9pZCBnZW5lcmljX3ByaW50X2FkZHJlc3MoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKik7CisKKy8qIEFsd2F5cyB0cnVlLiAgKi8KK2ludCBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopOworCisvKiBNYWNybyB0byBpbml0aWFsaXplIGEgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKyAgIGJ5IGFsbCBhcHBsaWNhdGlvbnMgY3JlYXRpbmcgc3VjaCBhIHN0cnVjdC4gICovCisjZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GTyhJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAorICAoSU5GTykuZmxhdm91ciA9IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLCBcCisgIChJTkZPKS5hcmNoID0gYmZkX2FyY2hfdW5rbm93biwgXAorICAoSU5GTykubWFjaCA9IDAsIFwKKyAgKElORk8pLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAorICBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykKKworLyogQ2FsbCB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgb25seSB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciB0aGUKKyAgIGRpc2Fzc2VtYmxlci4gIEFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgdGhpbmdzIHN1Y2ggYXMgYnl0ZSBvcmRlciwgb3IgbWFjaGluZQorICAgdmFyaWFudCBhcmUgbm90IHRvdWNoZWQgYnkgdGhpcyBtYWNyby4gIFRoaXMgbWFrZXMgdGhpbmdzIG11Y2ggZWFzaWVyIGZvcgorICAgR0RCIHdoaWNoIG11c3QgaW5pdGlhbGl6ZSB0aGVzZSB0aGluZ3Mgc2VwYXJhdGVseS4gICovCisKKyNkZWZpbmUgSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0goSU5GTywgU1RSRUFNLCBGUFJJTlRGX0ZVTkMpIFwKKyAgKElORk8pLmZwcmludGZfZnVuYyA9IChGUFJJTlRGX0ZVTkMpLCBcCisgIChJTkZPKS5zdHJlYW0gPSAoU1RSRUFNKSwgXAorICAoSU5GTykuc3ltYm9scyA9IE5VTEwsIFwKKyAgKElORk8pLm51bV9zeW1ib2xzID0gMCwgXAorICAoSU5GTykucHJpdmF0ZV9kYXRhID0gTlVMTCwgXAorICAoSU5GTykuYnVmZmVyID0gTlVMTCwgXAorICAoSU5GTykuYnVmZmVyX3ZtYSA9IDAsIFwKKyAgKElORk8pLmJ1ZmZlcl9sZW5ndGggPSAwLCBcCisgIChJTkZPKS5yZWFkX21lbW9yeV9mdW5jID0gYnVmZmVyX3JlYWRfbWVtb3J5LCBcCisgIChJTkZPKS5tZW1vcnlfZXJyb3JfZnVuYyA9IHBlcnJvcl9tZW1vcnksIFwKKyAgKElORk8pLnByaW50X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfcHJpbnRfYWRkcmVzcywgXAorICAoSU5GTykuc3ltYm9sX2F0X2FkZHJlc3NfZnVuYyA9IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MsIFwKKyAgKElORk8pLmZsYWdzID0gMCwgXAorICAoSU5GTykuYnl0ZXNfcGVyX2xpbmUgPSAwLCBcCisgIChJTkZPKS5ieXRlc19wZXJfY2h1bmsgPSAwLCBcCisgIChJTkZPKS5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAorICAoSU5GTykuZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBOVUxMLCBcCisgIChJTkZPKS5pbnNuX2luZm9fdmFsaWQgPSAwCisKKyNkZWZpbmUgXyh4KSB4CisjZGVmaW5lIEFUVFJJQlVURV9VTlVTRUQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKworLyogZnJvbSBsaWJiZmQgKi8KKworYmZkX3ZtYSBiZmRfZ2V0bDY0IChjb25zdCBiZmRfYnl0ZSAqYWRkcik7CitiZmRfdm1hIGJmZF9nZXRsMzIgKGNvbnN0IGJmZF9ieXRlICphZGRyKTsKK2JmZF92bWEgYmZkX2dldGIzMiAoY29uc3QgYmZkX2J5dGUgKmFkZHIpOworYmZkX3ZtYSBiZmRfZ2V0bDE2IChjb25zdCBiZmRfYnl0ZSAqYWRkcik7CitiZmRfdm1hIGJmZF9nZXRiMTYgKGNvbnN0IGJmZF9ieXRlICphZGRyKTsKK3R5cGVkZWYgYm9vbCBiZmRfYm9vbGVhbjsKKworI2VuZGlmIC8qICEgZGVmaW5lZCAoRElTX0FTTV9IKSAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Rpc2FzL2Rpc2FzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZGlzYXMvZGlzYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWMyNTMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2Rpc2FzL2Rpc2FzLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBfUUVNVV9ESVNBU19ICisjZGVmaW5lIF9RRU1VX0RJU0FTX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKKyNpZmRlZiBORUVEX0NQVV9ICisjaW5jbHVkZSAiY3B1LmgiCisKKy8qIERpc2Fzc2VtYmxlIHRoaXMgZm9yIG1lIHBsZWFzZS4uLiAoZGVidWdnaW5nKS4gKi8KK3ZvaWQgZGlzYXMoRklMRSAqb3V0LCB2b2lkICpjb2RlLCB1bnNpZ25lZCBsb25nIHNpemUpOwordm9pZCB0YXJnZXRfZGlzYXMoRklMRSAqb3V0LCBDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGNvZGUsCisgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgc2l6ZSwgaW50IGZsYWdzKTsKKwordm9pZCBtb25pdG9yX2Rpc2FzKE1vbml0b3IgKm1vbiwgQ1BVQXJjaFN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHBjLCBpbnQgbmJfaW5zbiwgaW50IGlzX3BoeXNpY2FsLCBpbnQgZmxhZ3MpOworCisvKiBMb29rIHVwIHN5bWJvbCBmb3IgZGVidWdnaW5nIHB1cnBvc2UuICBSZXR1cm5zICIiIGlmIHVua25vd24uICovCitjb25zdCBjaGFyICpsb29rdXBfc3ltYm9sKHRhcmdldF91bG9uZyBvcmlnX2FkZHIpOworI2VuZGlmCisKK3N0cnVjdCBzeW1pbmZvOworc3RydWN0IGVsZjMyX3N5bTsKK3N0cnVjdCBlbGY2NF9zeW07CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit0eXBlZGVmIGNvbnN0IGNoYXIgKigqbG9va3VwX3N5bWJvbF90KShzdHJ1Y3Qgc3ltaW5mbyAqcywgdGFyZ2V0X3Vsb25nIG9yaWdfYWRkcik7CisjZWxzZQordHlwZWRlZiBjb25zdCBjaGFyICooKmxvb2t1cF9zeW1ib2xfdCkoc3RydWN0IHN5bWluZm8gKnMsIGh3YWRkciBvcmlnX2FkZHIpOworI2VuZGlmCisKK3N0cnVjdCBzeW1pbmZvIHsKKyAgICBsb29rdXBfc3ltYm9sX3QgbG9va3VwX3N5bWJvbDsKKyAgICB1bnNpZ25lZCBpbnQgZGlzYXNfbnVtX3N5bXM7CisgICAgdW5pb24geworICAgICAgc3RydWN0IGVsZjMyX3N5bSAqZWxmMzI7CisgICAgICBzdHJ1Y3QgZWxmNjRfc3ltICplbGY2NDsKKyAgICB9IGRpc2FzX3N5bXRhYjsKKyAgICBjb25zdCBjaGFyICpkaXNhc19zdHJ0YWI7CisgICAgc3RydWN0IHN5bWluZm8gKm5leHQ7Cit9OworCisvKiBGaWxsZWQgaW4gYnkgZWxmbG9hZC5jLiAgU2ltcGxpc3RpYywgYnV0IHdpbGwgZG8gZm9yIG5vdy4gKi8KK2V4dGVybiBzdHJ1Y3Qgc3ltaW5mbyAqc3ltaW5mb3M7CisKKyNlbmRpZiAvKiBfUUVNVV9ESVNBU19IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZWxmLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZWxmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkMTBjMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9lbGYuaApAQCAtMCwwICsxLDE1NTMgQEAKKyNpZm5kZWYgX1FFTVVfRUxGX0gKKyNkZWZpbmUgX1FFTVVfRUxGX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKy8qIDMyLWJpdCBFTEYgYmFzZSB0eXBlcy4gKi8KK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfQWRkcjsKK3R5cGVkZWYgdWludDE2X3QgRWxmMzJfSGFsZjsKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfT2ZmOwordHlwZWRlZiBpbnQzMl90ICBFbGYzMl9Td29yZDsKK3R5cGVkZWYgdWludDMyX3QgRWxmMzJfV29yZDsKKworLyogNjQtYml0IEVMRiBiYXNlIHR5cGVzLiAqLwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwordHlwZWRlZiBpbnQxNl90CSBFbGY2NF9TSGFsZjsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfT2ZmOwordHlwZWRlZiBpbnQzMl90CSBFbGY2NF9Td29yZDsKK3R5cGVkZWYgdWludDMyX3QgRWxmNjRfV29yZDsKK3R5cGVkZWYgdWludDY0X3QgRWxmNjRfWHdvcmQ7Cit0eXBlZGVmIGludDY0X3QgIEVsZjY0X1N4d29yZDsKKworLyogVGhlc2UgY29uc3RhbnRzIGFyZSBmb3IgdGhlIHNlZ21lbnQgdHlwZXMgc3RvcmVkIGluIHRoZSBpbWFnZSBoZWFkZXJzICovCisjZGVmaW5lIFBUX05VTEwgICAgMAorI2RlZmluZSBQVF9MT0FEICAgIDEKKyNkZWZpbmUgUFRfRFlOQU1JQyAyCisjZGVmaW5lIFBUX0lOVEVSUCAgMworI2RlZmluZSBQVF9OT1RFICAgIDQKKyNkZWZpbmUgUFRfU0hMSUIgICA1CisjZGVmaW5lIFBUX1BIRFIgICAgNgorI2RlZmluZSBQVF9MT1BST0MgIDB4NzAwMDAwMDAKKyNkZWZpbmUgUFRfSElQUk9DICAweDdmZmZmZmZmCisjZGVmaW5lIFBUX01JUFNfUkVHSU5GTwkJMHg3MDAwMDAwMAorI2RlZmluZSBQVF9NSVBTX09QVElPTlMJCTB4NzAwMDAwMDEKKworLyogRmxhZ3MgaW4gdGhlIGVfZmxhZ3MgZmllbGQgb2YgdGhlIGhlYWRlciAqLworLyogTUlQUyBhcmNoaXRlY3R1cmUgbGV2ZWwuICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF8xCQkweDAwMDAwMDAwCS8qIC1taXBzMSBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzIJCTB4MTAwMDAwMDAJLyogLW1pcHMyIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMwkJMHgyMDAwMDAwMAkvKiAtbWlwczMgY29kZS4gICovCisjZGVmaW5lIEVGX01JUFNfQVJDSF80CQkweDMwMDAwMDAwCS8qIC1taXBzNCBjb2RlLiAgKi8KKyNkZWZpbmUgRUZfTUlQU19BUkNIXzUJCTB4NDAwMDAwMDAJLyogLW1pcHM1IGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfMzIJCTB4NTAwMDAwMDAJLyogTUlQUzMyIGNvZGUuICAqLworI2RlZmluZSBFRl9NSVBTX0FSQ0hfNjQJCTB4NjAwMDAwMDAJLyogTUlQUzY0IGNvZGUuICAqLworCisvKiBUaGUgQUJJIG9mIGEgZmlsZS4gKi8KKyNkZWZpbmUgRUZfTUlQU19BQklfTzMyCQkweDAwMDAxMDAwCS8qIE8zMiBBQkkuICAqLworI2RlZmluZSBFRl9NSVBTX0FCSV9PNjQJCTB4MDAwMDIwMDAJLyogTzMyIGV4dGVuZGVkIGZvciA2NCBiaXQuICAqLworCisjZGVmaW5lIEVGX01JUFNfTk9SRU9SREVSIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUZfTUlQU19QSUMgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFRl9NSVBTX0NQSUMgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEVGX01JUFNfQUJJMgkJMHgwMDAwMDAyMAorI2RlZmluZSBFRl9NSVBTX09QVElPTlNfRklSU1QJMHgwMDAwMDA4MAorI2RlZmluZSBFRl9NSVBTXzMyQklUTU9ERQkweDAwMDAwMTAwCisjZGVmaW5lIEVGX01JUFNfQUJJCQkweDAwMDBmMDAwCisjZGVmaW5lIEVGX01JUFNfQVJDSCAgICAgIDB4ZjAwMDAwMDAKKworLyogVGhlc2UgY29uc3RhbnRzIGRlZmluZSB0aGUgZGlmZmVyZW50IGVsZiBmaWxlIHR5cGVzICovCisjZGVmaW5lIEVUX05PTkUgICAwCisjZGVmaW5lIEVUX1JFTCAgICAxCisjZGVmaW5lIEVUX0VYRUMgICAyCisjZGVmaW5lIEVUX0RZTiAgICAzCisjZGVmaW5lIEVUX0NPUkUgICA0CisjZGVmaW5lIEVUX0xPUFJPQyAweGZmMDAKKyNkZWZpbmUgRVRfSElQUk9DIDB4ZmZmZgorCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSB2YXJpb3VzIEVMRiB0YXJnZXQgbWFjaGluZXMgKi8KKyNkZWZpbmUgRU1fTk9ORSAgMAorI2RlZmluZSBFTV9NMzIgICAxCisjZGVmaW5lIEVNX1NQQVJDIDIKKyNkZWZpbmUgRU1fMzg2ICAgMworI2RlZmluZSBFTV82OEsgICA0CisjZGVmaW5lIEVNXzg4SyAgIDUKKyNkZWZpbmUgRU1fNDg2ICAgNiAgIC8qIFBlcmhhcHMgZGlzdXNlZCAqLworI2RlZmluZSBFTV84NjAgICA3CisKKyNkZWZpbmUgRU1fTUlQUwkJOAkvKiBNSVBTIFIzMDAwIChvZmZpY2lhbGx5LCBiaWctZW5kaWFuIG9ubHkpICovCisKKyNkZWZpbmUgRU1fTUlQU19SUzRfQkUgMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCisKKyNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLworCisjZGVmaW5lIEVNX1NQQVJDMzJQTFVTIDE4CS8qIFN1bidzICJ2OHBsdXMiICovCisKKyNkZWZpbmUgRU1fUFBDCSAgICAgICAyMAkvKiBQb3dlclBDICovCisjZGVmaW5lIEVNX1BQQzY0ICAgICAgIDIxICAgICAgIC8qIFBvd2VyUEM2NCAqLworCisjZGVmaW5lIEVNX0FSTQkJNDAJCS8qIEFSTSAqLworCisjZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBTdXBlckggKi8KKworI2RlZmluZSBFTV9TUEFSQ1Y5ICAgICA0MwkvKiBTUEFSQyB2OSA2NC1iaXQgKi8KKworI2RlZmluZSBFTV9JQV82NAk1MAkvKiBIUC9JbnRlbCBJQS02NCAqLworCisjZGVmaW5lIEVNX1g4Nl82NAk2MgkvKiBBTUQgeDg2LTY0ICovCisKKyNkZWZpbmUgRU1fUzM5MAkJMjIJLyogSUJNIFMvMzkwICovCisKKyNkZWZpbmUgRU1fQ1JJUyAgICAgICAgIDc2ICAgICAgLyogQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yICovCisKKyNkZWZpbmUgRU1fVjg1MAkJODcJLyogTkVDIHY4NTAgKi8KKworI2RlZmluZSBFTV9IOF8zMDBIICAgICAgNDcgICAgICAvKiBIaXRhY2hpIEg4LzMwMEggKi8KKyNkZWZpbmUgRU1fSDhTICAgICAgICAgIDQ4ICAgICAgLyogSGl0YWNoaSBIOFMgICAgICovCisjZGVmaW5lIEVNX0xBVFRJQ0VNSUNPMzIgMTM4ICAgIC8qIExhdHRpY2VNaWNvMzIgKi8KKworI2RlZmluZSBFTV9PUEVOUklTQyAgICAgOTIgICAgICAgIC8qIE9wZW5Db3JlcyBPcGVuUklTQyAqLworCisjZGVmaW5lIEVNX1VOSUNPUkUzMiAgICAxMTAgICAgIC8qIFVuaUNvcmUzMiAqLworCisvKgorICogVGhpcyBpcyBhbiBpbnRlcmltIHZhbHVlIHRoYXQgd2Ugd2lsbCB1c2UgdW50aWwgdGhlIGNvbW1pdHRlZSBjb21lcworICogdXAgd2l0aCBhIGZpbmFsIG51bWJlci4KKyAqLworI2RlZmluZSBFTV9BTFBIQQkweDkwMjYKKworLyogQm9ndXMgb2xkIHY4NTAgbWFnaWMgbnVtYmVyLCB1c2VkIGJ5IG9sZCB0b29scy4gICovCisjZGVmaW5lIEVNX0NZR05VU19WODUwCTB4OTA4MAorCisvKgorICogVGhpcyBpcyB0aGUgb2xkIGludGVyaW0gdmFsdWUgZm9yIFMvMzkwIGFyY2hpdGVjdHVyZQorICovCisjZGVmaW5lIEVNX1MzOTBfT0xEICAgICAweEEzOTAKKworI2RlZmluZSBFTV9NSUNST0JMQVpFICAgICAgMTg5CisjZGVmaW5lIEVNX01JQ1JPQkxBWkVfT0xEICAweEJBQUIKKworI2RlZmluZSBFTV9YVEVOU0EgICA5NCAgICAgIC8qIFRlbnNpbGljYSBYdGVuc2EgKi8KKworI2RlZmluZSBFTV9BQVJDSDY0ICAxODMKKworLyogVGhpcyBpcyB0aGUgaW5mbyB0aGF0IGlzIG5lZWRlZCB0byBwYXJzZSB0aGUgZHluYW1pYyBzZWN0aW9uIG9mIHRoZSBmaWxlICovCisjZGVmaW5lIERUX05VTEwJCTAKKyNkZWZpbmUgRFRfTkVFREVECTEKKyNkZWZpbmUgRFRfUExUUkVMU1oJMgorI2RlZmluZSBEVF9QTFRHT1QJMworI2RlZmluZSBEVF9IQVNICQk0CisjZGVmaW5lIERUX1NUUlRBQgk1CisjZGVmaW5lIERUX1NZTVRBQgk2CisjZGVmaW5lIERUX1JFTEEJCTcKKyNkZWZpbmUgRFRfUkVMQVNaCTgKKyNkZWZpbmUgRFRfUkVMQUVOVAk5CisjZGVmaW5lIERUX1NUUlNaCTEwCisjZGVmaW5lIERUX1NZTUVOVAkxMQorI2RlZmluZSBEVF9JTklUCQkxMgorI2RlZmluZSBEVF9GSU5JCQkxMworI2RlZmluZSBEVF9TT05BTUUJMTQKKyNkZWZpbmUgRFRfUlBBVEggCTE1CisjZGVmaW5lIERUX1NZTUJPTElDCTE2CisjZGVmaW5lIERUX1JFTAkgICAgICAgIDE3CisjZGVmaW5lIERUX1JFTFNaCTE4CisjZGVmaW5lIERUX1JFTEVOVAkxOQorI2RlZmluZSBEVF9QTFRSRUwJMjAKKyNkZWZpbmUgRFRfREVCVUcJMjEKKyNkZWZpbmUgRFRfVEVYVFJFTAkyMgorI2RlZmluZSBEVF9KTVBSRUwJMjMKKyNkZWZpbmUgRFRfQklORE5PVwkyNAorI2RlZmluZSBEVF9JTklUX0FSUkFZCTI1CisjZGVmaW5lIERUX0ZJTklfQVJSQVkJMjYKKyNkZWZpbmUgRFRfSU5JVF9BUlJBWVNaCTI3CisjZGVmaW5lIERUX0ZJTklfQVJSQVlTWgkyOAorI2RlZmluZSBEVF9SVU5QQVRICTI5CisjZGVmaW5lIERUX0ZMQUdTCTMwCisjZGVmaW5lIERUX0xPT1MJCTB4NjAwMDAwMGQKKyNkZWZpbmUgRFRfSElPUwkJMHg2ZmZmZjAwMAorI2RlZmluZSBEVF9MT1BST0MJMHg3MDAwMDAwMAorI2RlZmluZSBEVF9ISVBST0MJMHg3ZmZmZmZmZgorCisvKiBEVF8gZW50cmllcyB3aGljaCBmYWxsIGJldHdlZW4gRFRfVkFMUk5HTE8gYW5kIERUX1ZBTFJOREhJIHVzZQorICAgdGhlIGRfdmFsIGZpZWxkIG9mIHRoZSBFbGYqX0R5biBzdHJ1Y3R1cmUuICBJLmUuIHRoZXkgY29udGFpbiBzY2FsYXJzLiAgKi8KKyNkZWZpbmUgRFRfVkFMUk5HTE8JMHg2ZmZmZmQwMAorI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCisKKy8qIERUXyBlbnRyaWVzIHdoaWNoIGZhbGwgYmV0d2VlbiBEVF9BRERSUk5HTE8gYW5kIERUX0FERFJSTkdISSB1c2UKKyAgIHRoZSBkX3B0ciBmaWVsZCBvZiB0aGUgRWxmKl9EeW4gc3RydWN0dXJlLiAgSS5lLiB0aGV5IGNvbnRhaW4gcG9pbnRlcnMuICAqLworI2RlZmluZSBEVF9BRERSUk5HTE8JMHg2ZmZmZmUwMAorI2RlZmluZSBEVF9BRERSUk5HSEkJMHg2ZmZmZmVmZgorCisjZGVmaW5lCURUX1ZFUlNZTQkweDZmZmZmZmYwCisjZGVmaW5lIERUX1JFTEFDT1VOVAkweDZmZmZmZmY5CisjZGVmaW5lIERUX1JFTENPVU5UCTB4NmZmZmZmZmEKKyNkZWZpbmUgRFRfRkxBR1NfMQkweDZmZmZmZmZiCisjZGVmaW5lIERUX1ZFUkRFRgkweDZmZmZmZmZjCisjZGVmaW5lIERUX1ZFUkRFRk5VTQkweDZmZmZmZmZkCisjZGVmaW5lIERUX1ZFUk5FRUQJMHg2ZmZmZmZmZQorI2RlZmluZSBEVF9WRVJORUVETlVNCTB4NmZmZmZmZmYKKworI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKKyNkZWZpbmUgRFRfTUlQU19USU1FX1NUQU1QCTB4NzAwMDAwMDIKKyNkZWZpbmUgRFRfTUlQU19JQ0hFQ0tTVU0JMHg3MDAwMDAwMworI2RlZmluZSBEVF9NSVBTX0lWRVJTSU9OCTB4NzAwMDAwMDQKKyNkZWZpbmUgRFRfTUlQU19GTEFHUwkJMHg3MDAwMDAwNQorICAjZGVmaW5lIFJIRl9OT05FCQkgIDAKKyAgI2RlZmluZSBSSEZfSEFSRFdBWQkJICAxCisgICNkZWZpbmUgUkhGX05PVFBPVAkJICAyCisjZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTCTB4NzAwMDAwMDYKKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVAkweDcwMDAwMDA4CisjZGVmaW5lIERUX01JUFNfTElCTElTVAkJMHg3MDAwMDAwOQorI2RlZmluZSBEVF9NSVBTX0xPQ0FMX0dPVE5PCTB4NzAwMDAwMGEKKyNkZWZpbmUgRFRfTUlQU19DT05GTElDVE5PCTB4NzAwMDAwMGIKKyNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8JMHg3MDAwMDAxMAorI2RlZmluZSBEVF9NSVBTX1NZTVRBQk5PCTB4NzAwMDAwMTEKKyNkZWZpbmUgRFRfTUlQU19VTlJFRkVYVE5PCTB4NzAwMDAwMTIKKyNkZWZpbmUgRFRfTUlQU19HT1RTWU0JCTB4NzAwMDAwMTMKKyNkZWZpbmUgRFRfTUlQU19ISVBBR0VOTwkweDcwMDAwMDE0CisjZGVmaW5lIERUX01JUFNfUkxEX01BUAkJMHg3MDAwMDAxNgorCisvKiBUaGlzIGluZm8gaXMgbmVlZGVkIHdoZW4gcGFyc2luZyB0aGUgc3ltYm9sIHRhYmxlICovCisjZGVmaW5lIFNUQl9MT0NBTCAgMAorI2RlZmluZSBTVEJfR0xPQkFMIDEKKyNkZWZpbmUgU1RCX1dFQUsgICAyCisKKyNkZWZpbmUgU1RUX05PVFlQRSAgMAorI2RlZmluZSBTVFRfT0JKRUNUICAxCisjZGVmaW5lIFNUVF9GVU5DICAgIDIKKyNkZWZpbmUgU1RUX1NFQ1RJT04gMworI2RlZmluZSBTVFRfRklMRSAgICA0CisKKyNkZWZpbmUgRUxGX1NUX0JJTkQoeCkJCSgoeCkgPj4gNCkKKyNkZWZpbmUgRUxGX1NUX1RZUEUoeCkJCSgoKHVuc2lnbmVkIGludCkgeCkgJiAweGYpCisjZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsIHR5cGUpICgoKGJpbmQpIDw8IDQpIHwgKCh0eXBlKSAmIDB4ZikpCisjZGVmaW5lIEVMRjMyX1NUX0JJTkQoeCkJRUxGX1NUX0JJTkQoeCkKKyNkZWZpbmUgRUxGMzJfU1RfVFlQRSh4KQlFTEZfU1RfVFlQRSh4KQorI2RlZmluZSBFTEY2NF9TVF9CSU5EKHgpCUVMRl9TVF9CSU5EKHgpCisjZGVmaW5lIEVMRjY0X1NUX1RZUEUoeCkJRUxGX1NUX1RZUEUoeCkKKworLyogU3ltYm9saWMgdmFsdWVzIGZvciB0aGUgZW50cmllcyBpbiB0aGUgYXV4aWxpYXJ5IHRhYmxlCisgICBwdXQgb24gdGhlIGluaXRpYWwgc3RhY2sgKi8KKyNkZWZpbmUgQVRfTlVMTCAgIDAJLyogZW5kIG9mIHZlY3RvciAqLworI2RlZmluZSBBVF9JR05PUkUgMQkvKiBlbnRyeSBzaG91bGQgYmUgaWdub3JlZCAqLworI2RlZmluZSBBVF9FWEVDRkQgMgkvKiBmaWxlIGRlc2NyaXB0b3Igb2YgcHJvZ3JhbSAqLworI2RlZmluZSBBVF9QSERSICAgMwkvKiBwcm9ncmFtIGhlYWRlcnMgZm9yIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfUEhFTlQgIDQJLyogc2l6ZSBvZiBwcm9ncmFtIGhlYWRlciBlbnRyeSAqLworI2RlZmluZSBBVF9QSE5VTSAgNQkvKiBudW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzICovCisjZGVmaW5lIEFUX1BBR0VTWiA2CS8qIHN5c3RlbSBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQVRfQkFTRSAgIDcJLyogYmFzZSBhZGRyZXNzIG9mIGludGVycHJldGVyICovCisjZGVmaW5lIEFUX0ZMQUdTICA4CS8qIGZsYWdzICovCisjZGVmaW5lIEFUX0VOVFJZICA5CS8qIGVudHJ5IHBvaW50IG9mIHByb2dyYW0gKi8KKyNkZWZpbmUgQVRfTk9URUxGIDEwCS8qIHByb2dyYW0gaXMgbm90IEVMRiAqLworI2RlZmluZSBBVF9VSUQgICAgMTEJLyogcmVhbCB1aWQgKi8KKyNkZWZpbmUgQVRfRVVJRCAgIDEyCS8qIGVmZmVjdGl2ZSB1aWQgKi8KKyNkZWZpbmUgQVRfR0lEICAgIDEzCS8qIHJlYWwgZ2lkICovCisjZGVmaW5lIEFUX0VHSUQgICAxNAkvKiBlZmZlY3RpdmUgZ2lkICovCisjZGVmaW5lIEFUX1BMQVRGT1JNIDE1ICAvKiBzdHJpbmcgaWRlbnRpZnlpbmcgQ1BVIGZvciBvcHRpbWl6YXRpb25zICovCisjZGVmaW5lIEFUX0hXQ0FQICAxNiAgICAvKiBhcmNoIGRlcGVuZGVudCBoaW50cyBhdCBDUFUgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lIEFUX0NMS1RDSyAxNwkvKiBmcmVxdWVuY3kgYXQgd2hpY2ggdGltZXMoKSBpbmNyZW1lbnRzICovCisjZGVmaW5lIEFUX0ZQVUNXICAxOAkvKiBpbmZvIGFib3V0IGZwdSBpbml0aWFsaXphdGlvbiBieSBrZXJuZWwgKi8KKyNkZWZpbmUgQVRfRENBQ0hFQlNJWkUJMTkJLyogZGF0YSBjYWNoZSBibG9jayBzaXplICovCisjZGVmaW5lIEFUX0lDQUNIRUJTSVpFCTIwCS8qIGluc3RydWN0aW9uIGNhY2hlIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgQVRfVUNBQ0hFQlNJWkUJMjEJLyogdW5pZmllZCBjYWNoZSBibG9jayBzaXplICovCisjZGVmaW5lIEFUX0lHTk9SRVBQQwkyMgkvKiBwcGMgb25seTsgZW50cnkgc2hvdWxkIGJlIGlnbm9yZWQgKi8KKyNkZWZpbmUgQVRfU0VDVVJFCTIzCS8qIGJvb2xlYW4sIHdhcyBleGVjIHN1aWQtbGlrZT8gKi8KKyNkZWZpbmUgQVRfQkFTRV9QTEFURk9STSAyNAkvKiBzdHJpbmcgaWRlbnRpZnlpbmcgcmVhbCBwbGF0Zm9ybXMgKi8KKyNkZWZpbmUgQVRfUkFORE9NCTI1CS8qIGFkZHJlc3Mgb2YgMTYgcmFuZG9tIGJ5dGVzICovCisjZGVmaW5lIEFUX0VYRUNGTgkzMQkvKiBmaWxlbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSAqLworI2RlZmluZSBBVF9TWVNJTkZPCTMyCS8qIGFkZHJlc3Mgb2Yga2VybmVsIGVudHJ5IHBvaW50ICovCisjZGVmaW5lIEFUX1NZU0lORk9fRUhEUgkzMwkvKiBhZGRyZXNzIG9mIGtlcm5lbCB2ZHNvICovCisjZGVmaW5lIEFUX0wxSV9DQUNIRVNIQVBFIDM0CS8qIHNoYXBlcyBvZiB0aGUgY2FjaGVzOiAqLworI2RlZmluZSBBVF9MMURfQ0FDSEVTSEFQRSAzNQkvKiAgIGJpdHMgMC0zOiBjYWNoZSBhc3NvY2lhdGl2aXR5LiAgKi8KKyNkZWZpbmUgQVRfTDJfQ0FDSEVTSEFQRSAgMzYJLyogICBiaXRzIDQtNzogbG9nMiBvZiBsaW5lIHNpemUuICAqLworI2RlZmluZSBBVF9MM19DQUNIRVNIQVBFICAzNwkvKiAgIHZhbCZ+MjU1OiBjYWNoZSBzaXplLiAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZHluYW1pY3sKKyAgRWxmMzJfU3dvcmQgZF90YWc7CisgIHVuaW9ueworICAgIEVsZjMyX1N3b3JkCWRfdmFsOworICAgIEVsZjMyX0FkZHIJZF9wdHI7CisgIH0gZF91bjsKK30gRWxmMzJfRHluOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEVsZjY0X1N4d29yZCBkX3RhZzsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLworICB1bmlvbiB7CisgICAgRWxmNjRfWHdvcmQgZF92YWw7CisgICAgRWxmNjRfQWRkciBkX3B0cjsKKyAgfSBkX3VuOworfSBFbGY2NF9EeW47CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgd2l0aCByZWxvY2F0aW9ucyAqLworI2RlZmluZSBFTEYzMl9SX1NZTSh4KSAoKHgpID4+IDgpCisjZGVmaW5lIEVMRjMyX1JfVFlQRSh4KSAoKHgpICYgMHhmZikKKworI2RlZmluZSBFTEY2NF9SX1NZTShpKQkJCSgoaSkgPj4gMzIpCisjZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJCSgoaSkgJiAweGZmZmZmZmZmKQorI2RlZmluZSBFTEY2NF9SX1RZUEVfREFUQShpKSAgICAgICAgICAgICgoKEVMRjY0X1JfVFlQRShpKSA+PiA4KSBeIDB4MDA4MDAwMDApIC0gMHgwMDgwMDAwMCkKKworI2RlZmluZSBSXzM4Nl9OT05FCTAKKyNkZWZpbmUgUl8zODZfMzIJMQorI2RlZmluZSBSXzM4Nl9QQzMyCTIKKyNkZWZpbmUgUl8zODZfR09UMzIJMworI2RlZmluZSBSXzM4Nl9QTFQzMgk0CisjZGVmaW5lIFJfMzg2X0NPUFkJNQorI2RlZmluZSBSXzM4Nl9HTE9CX0RBVAk2CisjZGVmaW5lIFJfMzg2X0pNUF9TTE9UCTcKKyNkZWZpbmUgUl8zODZfUkVMQVRJVkUJOAorI2RlZmluZSBSXzM4Nl9HT1RPRkYJOQorI2RlZmluZSBSXzM4Nl9HT1RQQwkxMAorI2RlZmluZSBSXzM4Nl9OVU0JMTEKKy8qIE5vdCBhIGR5bmFtaWMgcmVsb2MsIHNvIG5vdCBpbmNsdWRlZCBpbiBSXzM4Nl9OVU0uICBVc2VkIGluIFRDRy4gICovCisjZGVmaW5lIFJfMzg2X1BDOAkyMworCisjZGVmaW5lIFJfTUlQU19OT05FCQkwCisjZGVmaW5lIFJfTUlQU18xNgkJMQorI2RlZmluZSBSX01JUFNfMzIJCTIKKyNkZWZpbmUgUl9NSVBTX1JFTDMyCQkzCisjZGVmaW5lIFJfTUlQU18yNgkJNAorI2RlZmluZSBSX01JUFNfSEkxNgkJNQorI2RlZmluZSBSX01JUFNfTE8xNgkJNgorI2RlZmluZSBSX01JUFNfR1BSRUwxNgkJNworI2RlZmluZSBSX01JUFNfTElURVJBTAkJOAorI2RlZmluZSBSX01JUFNfR09UMTYJCTkKKyNkZWZpbmUgUl9NSVBTX1BDMTYJCTEwCisjZGVmaW5lIFJfTUlQU19DQUxMMTYJCTExCisjZGVmaW5lIFJfTUlQU19HUFJFTDMyCQkxMgorLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGRlZmluZWQgb24gSXJpeCwgYWx0aG91Z2ggdGhleSBhcmUgbm90CisgICBpbiB0aGUgTUlQUyBFTEYgQUJJLiAgKi8KKyNkZWZpbmUgUl9NSVBTX1VOVVNFRDEJCTEzCisjZGVmaW5lIFJfTUlQU19VTlVTRUQyCQkxNAorI2RlZmluZSBSX01JUFNfVU5VU0VEMwkJMTUKKyNkZWZpbmUgUl9NSVBTX1NISUZUNQkJMTYKKyNkZWZpbmUgUl9NSVBTX1NISUZUNgkJMTcKKyNkZWZpbmUgUl9NSVBTXzY0CQkxOAorI2RlZmluZSBSX01JUFNfR09UX0RJU1AJCTE5CisjZGVmaW5lIFJfTUlQU19HT1RfUEFHRQkJMjAKKyNkZWZpbmUgUl9NSVBTX0dPVF9PRlNUCQkyMQorLyoKKyAqIFRoZSBmb2xsb3dpbmcgdHdvIHJlbG9jYXRpb24gdHlwZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgTUlQUyBBQkkKKyAqIGNvbmZvcm1hbmNlIGd1aWRlIHZlcnNpb24gMS4yIGJ1dCBub3QgeWV0IGluIHRoZSBwc0FCSS4KKyAqLworI2RlZmluZSBSX01JUFNfR09USEkxNgkJMjIKKyNkZWZpbmUgUl9NSVBTX0dPVExPMTYJCTIzCisjZGVmaW5lIFJfTUlQU19TVUIJCTI0CisjZGVmaW5lIFJfTUlQU19JTlNFUlRfQQkJMjUKKyNkZWZpbmUgUl9NSVBTX0lOU0VSVF9CCQkyNgorI2RlZmluZSBSX01JUFNfREVMRVRFCQkyNworI2RlZmluZSBSX01JUFNfSElHSEVSCQkyOAorI2RlZmluZSBSX01JUFNfSElHSEVTVAkJMjkKKy8qCisgKiBUaGUgZm9sbG93aW5nIHR3byByZWxvY2F0aW9uIHR5cGVzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIE1JUFMgQUJJCisgKiBjb25mb3JtYW5jZSBndWlkZSB2ZXJzaW9uIDEuMiBidXQgbm90IHlldCBpbiB0aGUgcHNBQkkuCisgKi8KKyNkZWZpbmUgUl9NSVBTX0NBTExISTE2CQkzMAorI2RlZmluZSBSX01JUFNfQ0FMTExPMTYJCTMxCisvKgorICogVGhpcyByYW5nZSBpcyByZXNlcnZlZCBmb3IgdmVuZG9yIHNwZWNpZmljIHJlbG9jYXRpb25zLgorICovCisjZGVmaW5lIFJfTUlQU19MT1ZFTkRPUgkJMTAwCisjZGVmaW5lIFJfTUlQU19ISVZFTkRPUgkJMTI3CisKKworLyogU1VOIFNQQVJDIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KKworLyogVmFsdWVzIGZvciBFbGY2NF9FaGRyLmVfZmxhZ3MuICAqLworCisjZGVmaW5lIEVGX1NQQVJDVjlfTU0gICAgICAgICAgIDMKKyNkZWZpbmUgRUZfU1BBUkNWOV9UU08gICAgICAgICAgMAorI2RlZmluZSBFRl9TUEFSQ1Y5X1BTTyAgICAgICAgICAxCisjZGVmaW5lIEVGX1NQQVJDVjlfUk1PICAgICAgICAgIDIKKyNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBICAgICAgICAgMHg4MDAwMDAgLyogbGl0dGxlIGVuZGlhbiBkYXRhICovCisjZGVmaW5lIEVGX1NQQVJDX0VYVF9NQVNLICAgICAgIDB4RkZGRjAwCisjZGVmaW5lIEVGX1NQQVJDXzMyUExVUyAgICAgICAgIDB4MDAwMTAwIC8qIGdlbmVyaWMgVjgrIGZlYXR1cmVzICovCisjZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzEgICAgICAgIDB4MDAwMjAwIC8qIFN1biBVbHRyYVNQQVJDMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX0hBTF9SMSAgICAgICAgIDB4MDAwNDAwIC8qIEhBTCBSMSBleHRlbnNpb25zICovCisjZGVmaW5lIEVGX1NQQVJDX1NVTl9VUzMgICAgICAgIDB4MDAwODAwIC8qIFN1biBVbHRyYVNQQVJDSUlJIGV4dGVuc2lvbnMgKi8KKworLyoKKyAqIFNwYXJjIEVMRiByZWxvY2F0aW9uIHR5cGVzCisgKi8KKyNkZWZpbmUJUl9TUEFSQ19OT05FCQkwCisjZGVmaW5lCVJfU1BBUkNfOAkJMQorI2RlZmluZQlSX1NQQVJDXzE2CQkyCisjZGVmaW5lCVJfU1BBUkNfMzIJCTMKKyNkZWZpbmUJUl9TUEFSQ19ESVNQOAkJNAorI2RlZmluZQlSX1NQQVJDX0RJU1AxNgkJNQorI2RlZmluZQlSX1NQQVJDX0RJU1AzMgkJNgorI2RlZmluZQlSX1NQQVJDX1dESVNQMzAJCTcKKyNkZWZpbmUJUl9TUEFSQ19XRElTUDIyCQk4CisjZGVmaW5lCVJfU1BBUkNfSEkyMgkJOQorI2RlZmluZQlSX1NQQVJDXzIyCQkxMAorI2RlZmluZQlSX1NQQVJDXzEzCQkxMQorI2RlZmluZQlSX1NQQVJDX0xPMTAJCTEyCisjZGVmaW5lCVJfU1BBUkNfR09UMTAJCTEzCisjZGVmaW5lCVJfU1BBUkNfR09UMTMJCTE0CisjZGVmaW5lCVJfU1BBUkNfR09UMjIJCTE1CisjZGVmaW5lCVJfU1BBUkNfUEMxMAkJMTYKKyNkZWZpbmUJUl9TUEFSQ19QQzIyCQkxNworI2RlZmluZQlSX1NQQVJDX1dQTFQzMAkJMTgKKyNkZWZpbmUJUl9TUEFSQ19DT1BZCQkxOQorI2RlZmluZQlSX1NQQVJDX0dMT0JfREFUCTIwCisjZGVmaW5lCVJfU1BBUkNfSk1QX1NMT1QJMjEKKyNkZWZpbmUJUl9TUEFSQ19SRUxBVElWRQkyMgorI2RlZmluZQlSX1NQQVJDX1VBMzIJCTIzCisjZGVmaW5lIFJfU1BBUkNfUExUMzIJCTI0CisjZGVmaW5lIFJfU1BBUkNfSElQTFQyMgkJMjUKKyNkZWZpbmUgUl9TUEFSQ19MT1BMVDEwCQkyNgorI2RlZmluZSBSX1NQQVJDX1BDUExUMzIJCTI3CisjZGVmaW5lIFJfU1BBUkNfUENQTFQyMgkJMjgKKyNkZWZpbmUgUl9TUEFSQ19QQ1BMVDEwCQkyOQorI2RlZmluZSBSX1NQQVJDXzEwCQkzMAorI2RlZmluZSBSX1NQQVJDXzExCQkzMQorI2RlZmluZSBSX1NQQVJDXzY0CQkzMgorI2RlZmluZSBSX1NQQVJDX09MTzEwICAgICAgICAgICAzMworI2RlZmluZSBSX1NQQVJDX0hIMjIgICAgICAgICAgICAzNAorI2RlZmluZSBSX1NQQVJDX0hNMTAgICAgICAgICAgICAzNQorI2RlZmluZSBSX1NQQVJDX0xNMjIgICAgICAgICAgICAzNgorI2RlZmluZSBSX1NQQVJDX1dESVNQMTYJCTQwCisjZGVmaW5lIFJfU1BBUkNfV0RJU1AxOQkJNDEKKyNkZWZpbmUgUl9TUEFSQ183CQk0MworI2RlZmluZSBSX1NQQVJDXzUJCTQ0CisjZGVmaW5lIFJfU1BBUkNfNgkJNDUKKworLyogQml0cyBwcmVzZW50IGluIEFUX0hXQ0FQIGZvciBBUk0uICAqLworCisjZGVmaW5lIEhXQ0FQX0FSTV9TV1AgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEhXQ0FQX0FSTV9IQUxGICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEhXQ0FQX0FSTV9USFVNQiAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEhXQ0FQX0FSTV8yNkJJVCAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEhXQ0FQX0FSTV9GQVNUX01VTFQgICAgICgxIDw8IDQpCisjZGVmaW5lIEhXQ0FQX0FSTV9GUEEgICAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIEhXQ0FQX0FSTV9WRlAgICAgICAgICAgICgxIDw8IDYpCisjZGVmaW5lIEhXQ0FQX0FSTV9FRFNQICAgICAgICAgICgxIDw8IDcpCisjZGVmaW5lIEhXQ0FQX0FSTV9KQVZBICAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEhXQ0FQX0FSTV9JV01NWFQgICAgICAgICgxIDw8IDkpCisjZGVmaW5lIEhXQ0FQX0FSTV9DUlVOQ0ggICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBIV0NBUF9BUk1fVEhVTUJFRSAgICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgSFdDQVBfQVJNX05FT04gICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIEhXQ0FQX0FSTV9WRlB2MyAgICAgICAgICgxIDw8IDEzKQorI2RlZmluZSBIV0NBUF9BUk1fVkZQdjNEMTYgICAgICAoMSA8PCAxNCkgICAgICAgLyogYWxzbyBzZXQgZm9yIFZGUHY0LUQxNiAqLworI2RlZmluZSBIV0NBUF9BUk1fVExTICAgICAgICAgICAoMSA8PCAxNSkKKyNkZWZpbmUgSFdDQVBfQVJNX1ZGUHY0ICAgICAgICAgKDEgPDwgMTYpCisjZGVmaW5lIEhXQ0FQX0FSTV9JRElWQSAgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBIV0NBUF9BUk1fSURJVlQgICAgICAgICAoMSA8PCAxOCkKKyNkZWZpbmUgSFdDQVBfSURJViAgICAgICAgICAgICAgKEhXQ0FQX0lESVZBIHwgSFdDQVBfSURJVlQpCisjZGVmaW5lIEhXQ0FQX1ZGUEQzMiAgICAgICAgICAgICgxIDw8IDE5KSAgICAgICAvKiBzZXQgaWYgVkZQIGhhcyAzMiByZWdzICovCisjZGVmaW5lIEhXQ0FQX0xQQUUgICAgICAgICAgICAgICgxIDw8IDIwKQorCisvKiBCaXRzIHByZXNlbnQgaW4gQVRfSFdDQVAgZm9yIFBvd2VyUEMuICAqLworCisjZGVmaW5lIFBQQ19GRUFUVVJFXzMyICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV82NCAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfNjAxX0lOU1RSICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9IQVNfRlBVICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfSEFTX01NVSAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0hBU180eHhNQUMgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9VTklGSUVEX0NBQ0hFICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfSEFTX1NQRSAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0hBU19FRlBfU0lOR0xFICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9IQVNfRUZQX0RPVUJMRSAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfTk9fVEIgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX1BPV0VSNCAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjUgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfUE9XRVI1X1BMVVMgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0NFTEwgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9CT09LRSAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfU01UICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0lDQUNIRV9TTk9PUCAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBQUENfRkVBVFVSRV9BUkNIXzJfMDUgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfUEE2VCAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0hBU19ERlAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBQUENfRkVBVFVSRV9QT1dFUjZfRVhUICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfQVJDSF8yXzA2ICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBQQ19GRUFUVVJFX0hBU19WU1ggICAgICAgICAgICAgMHgwMDAwMDA4MAorCisjZGVmaW5lIFBQQ19GRUFUVVJFX1BTRVJJRVNfUEVSRk1PTl9DT01QQVQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKworI2RlZmluZSBQUENfRkVBVFVSRV9UUlVFX0xFICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfUFBDX0xFICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qIEJpdHMgcHJlc2VudCBpbiBBVF9IV0NBUCwgcHJpbWFyaWx5IGZvciBTcGFyYzMyLiAgKi8KKworI2RlZmluZSBIV0NBUF9TUEFSQ19GTFVTSCAgICAgICAxICAgIC8qIENQVSBzdXBwb3J0cyBmbHVzaCBpbnN0cnVjdGlvbi4gKi8KKyNkZWZpbmUgSFdDQVBfU1BBUkNfU1RCQVIgICAgICAgMgorI2RlZmluZSBIV0NBUF9TUEFSQ19TV0FQICAgICAgICA0CisjZGVmaW5lIEhXQ0FQX1NQQVJDX01VTERJViAgICAgIDgKKyNkZWZpbmUgSFdDQVBfU1BBUkNfVjkJCTE2CisjZGVmaW5lIEhXQ0FQX1NQQVJDX1VMVFJBMwkzMgorCisvKiBCaXRzIHByZXNlbnQgaW4gQVRfSFdDQVAgZm9yIHMzOTAuICAqLworCisjZGVmaW5lIEhXQ0FQX1MzOTBfRVNBTjMgICAgICAgIDEKKyNkZWZpbmUgSFdDQVBfUzM5MF9aQVJDSCAgICAgICAgMgorI2RlZmluZSBIV0NBUF9TMzkwX1NURkxFICAgICAgICA0CisjZGVmaW5lIEhXQ0FQX1MzOTBfTVNBICAgICAgICAgIDgKKyNkZWZpbmUgSFdDQVBfUzM5MF9MRElTUCAgICAgICAgMTYKKyNkZWZpbmUgSFdDQVBfUzM5MF9FSU1NICAgICAgICAgMzIKKyNkZWZpbmUgSFdDQVBfUzM5MF9ERlAgICAgICAgICAgNjQKKyNkZWZpbmUgSFdDQVBfUzM5MF9IUEFHRSAgICAgICAgMTI4CisjZGVmaW5lIEhXQ0FQX1MzOTBfRVRGM0VIICAgICAgIDI1NgorI2RlZmluZSBIV0NBUF9TMzkwX0hJR0hfR1BSUyAgICA1MTIKKyNkZWZpbmUgSFdDQVBfUzM5MF9URSAgICAgICAgICAgMTAyNAorCisvKgorICogNjhrIEVMRiByZWxvY2F0aW9uIHR5cGVzCisgKi8KKyNkZWZpbmUgUl82OEtfTk9ORQkwCisjZGVmaW5lIFJfNjhLXzMyCTEKKyNkZWZpbmUgUl82OEtfMTYJMgorI2RlZmluZSBSXzY4S184CQkzCisjZGVmaW5lIFJfNjhLX1BDMzIJNAorI2RlZmluZSBSXzY4S19QQzE2CTUKKyNkZWZpbmUgUl82OEtfUEM4CTYKKyNkZWZpbmUgUl82OEtfR09UMzIJNworI2RlZmluZSBSXzY4S19HT1QxNgk4CisjZGVmaW5lIFJfNjhLX0dPVDgJOQorI2RlZmluZSBSXzY4S19HT1QzMk8JMTAKKyNkZWZpbmUgUl82OEtfR09UMTZPCTExCisjZGVmaW5lIFJfNjhLX0dPVDhPCTEyCisjZGVmaW5lIFJfNjhLX1BMVDMyCTEzCisjZGVmaW5lIFJfNjhLX1BMVDE2CTE0CisjZGVmaW5lIFJfNjhLX1BMVDgJMTUKKyNkZWZpbmUgUl82OEtfUExUMzJPCTE2CisjZGVmaW5lIFJfNjhLX1BMVDE2TwkxNworI2RlZmluZSBSXzY4S19QTFQ4TwkxOAorI2RlZmluZSBSXzY4S19DT1BZCTE5CisjZGVmaW5lIFJfNjhLX0dMT0JfREFUCTIwCisjZGVmaW5lIFJfNjhLX0pNUF9TTE9UCTIxCisjZGVmaW5lIFJfNjhLX1JFTEFUSVZFCTIyCisKKy8qCisgKiBBbHBoYSBFTEYgcmVsb2NhdGlvbiB0eXBlcworICovCisjZGVmaW5lIFJfQUxQSEFfTk9ORSAgICAgICAgICAgIDAgICAgICAgLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9BTFBIQV9SRUZMT05HICAgICAgICAgMSAgICAgICAvKiBEaXJlY3QgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfUkVGUVVBRCAgICAgICAgIDIgICAgICAgLyogRGlyZWN0IDY0IGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0dQUkVMMzIgICAgICAgICAzICAgICAgIC8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FMUEhBX0xJVEVSQUwgICAgICAgICA0ICAgICAgIC8qIEdQIHJlbGF0aXZlIDE2IGJpdCB3L29wdGltaXphdGlvbiAqLworI2RlZmluZSBSX0FMUEhBX0xJVFVTRSAgICAgICAgICA1ICAgICAgIC8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCisjZGVmaW5lIFJfQUxQSEFfR1BESVNQICAgICAgICAgIDYgICAgICAgLyogQWRkIGRpc3BsYWNlbWVudCB0byBHUCAqLworI2RlZmluZSBSX0FMUEhBX0JSQUREUiAgICAgICAgICA3ICAgICAgIC8qIFBDKzQgcmVsYXRpdmUgMjMgYml0IHNoaWZ0ZWQgKi8KKyNkZWZpbmUgUl9BTFBIQV9ISU5UICAgICAgICAgICAgOCAgICAgICAvKiBQQys0IHJlbGF0aXZlIDE2IGJpdCBzaGlmdGVkICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDE2ICAgICAgICAgIDkgICAgICAgLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDMyICAgICAgICAgIDEwICAgICAgLyogUEMgcmVsYXRpdmUgMzIgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfU1JFTDY0ICAgICAgICAgIDExICAgICAgLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUxISUdIICAgICAgIDE3ICAgICAgLyogR1AgcmVsYXRpdmUgMzIgYml0LCBoaWdoIDE2IGJpdHMgKi8KKyNkZWZpbmUgUl9BTFBIQV9HUFJFTExPVyAgICAgICAgMTggICAgICAvKiBHUCByZWxhdGl2ZSAzMiBiaXQsIGxvdyAxNiBiaXRzICovCisjZGVmaW5lIFJfQUxQSEFfR1BSRUwxNiAgICAgICAgIDE5ICAgICAgLyogR1AgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfQUxQSEFfQ09QWSAgICAgICAgICAgIDI0ICAgICAgLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX0FMUEhBX0dMT0JfREFUICAgICAgICAyNSAgICAgIC8qIENyZWF0ZSBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BTFBIQV9KTVBfU0xPVCAgICAgICAgMjYgICAgICAvKiBDcmVhdGUgUExUIGVudHJ5ICovCisjZGVmaW5lIFJfQUxQSEFfUkVMQVRJVkUgICAgICAgIDI3ICAgICAgLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLworI2RlZmluZSBSX0FMUEhBX0JSU0dQCQkyOAorI2RlZmluZSBSX0FMUEhBX1RMU0dEICAgICAgICAgICAyOQorI2RlZmluZSBSX0FMUEhBX1RMU19MRE0gICAgICAgICAzMAorI2RlZmluZSBSX0FMUEhBX0RUUE1PRDY0ICAgICAgICAzMQorI2RlZmluZSBSX0FMUEhBX0dPVERUUFJFTCAgICAgICAzMgorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDY0ICAgICAgICAzMworI2RlZmluZSBSX0FMUEhBX0RUUFJFTEhJICAgICAgICAzNAorI2RlZmluZSBSX0FMUEhBX0RUUFJFTExPICAgICAgICAzNQorI2RlZmluZSBSX0FMUEhBX0RUUFJFTDE2ICAgICAgICAzNgorI2RlZmluZSBSX0FMUEhBX0dPVFRQUkVMICAgICAgICAzNworI2RlZmluZSBSX0FMUEhBX1RQUkVMNjQgICAgICAgICAzOAorI2RlZmluZSBSX0FMUEhBX1RQUkVMSEkgICAgICAgICAzOQorI2RlZmluZSBSX0FMUEhBX1RQUkVMTE8gICAgICAgICA0MAorI2RlZmluZSBSX0FMUEhBX1RQUkVMMTYgICAgICAgICA0MQorCisjZGVmaW5lIFNIRl9BTFBIQV9HUFJFTAkJMHgxMDAwMDAwMAorCisKKy8qIFBvd2VyUEMgcmVsb2NhdGlvbnMgZGVmaW5lZCBieSB0aGUgQUJJcyAqLworI2RlZmluZSBSX1BQQ19OT05FCQkwCisjZGVmaW5lIFJfUFBDX0FERFIzMgkJMQkvKiAzMmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIyNAkJMgkvKiAyNmJpdCBhZGRyZXNzLCAyIGJpdHMgaWdub3JlZC4gICovCisjZGVmaW5lIFJfUFBDX0FERFIxNgkJMwkvKiAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIxNl9MTwkJNAkvKiBsb3dlciAxNmJpdCBvZiBhYnNvbHV0ZSBhZGRyZXNzICovCisjZGVmaW5lIFJfUFBDX0FERFIxNl9ISQkJNQkvKiBoaWdoIDE2Yml0IG9mIGFic29sdXRlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE2X0hBCQk2CS8qIGFkanVzdGVkIGhpZ2ggMTZiaXQgKi8KKyNkZWZpbmUgUl9QUENfQUREUjE0CQk3CS8qIDE2Yml0IGFkZHJlc3MsIDIgYml0cyBpZ25vcmVkICovCisjZGVmaW5lIFJfUFBDX0FERFIxNF9CUlRBS0VOCTgKKyNkZWZpbmUgUl9QUENfQUREUjE0X0JSTlRBS0VOCTkKKyNkZWZpbmUgUl9QUENfUkVMMjQJCTEwCS8qIFBDIHJlbGF0aXZlIDI2IGJpdCAqLworI2RlZmluZSBSX1BQQ19SRUwxNAkJMTEJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCisjZGVmaW5lIFJfUFBDX1JFTDE0X0JSVEFLRU4JMTIKKyNkZWZpbmUgUl9QUENfUkVMMTRfQlJOVEFLRU4JMTMKKyNkZWZpbmUgUl9QUENfR09UMTYJCTE0CisjZGVmaW5lIFJfUFBDX0dPVDE2X0xPCQkxNQorI2RlZmluZSBSX1BQQ19HT1QxNl9ISQkJMTYKKyNkZWZpbmUgUl9QUENfR09UMTZfSEEJCTE3CisjZGVmaW5lIFJfUFBDX1BMVFJFTDI0CQkxOAorI2RlZmluZSBSX1BQQ19DT1BZCQkxOQorI2RlZmluZSBSX1BQQ19HTE9CX0RBVAkJMjAKKyNkZWZpbmUgUl9QUENfSk1QX1NMT1QJCTIxCisjZGVmaW5lIFJfUFBDX1JFTEFUSVZFCQkyMgorI2RlZmluZSBSX1BQQ19MT0NBTDI0UEMJCTIzCisjZGVmaW5lIFJfUFBDX1VBRERSMzIJCTI0CisjZGVmaW5lIFJfUFBDX1VBRERSMTYJCTI1CisjZGVmaW5lIFJfUFBDX1JFTDMyCQkyNgorI2RlZmluZSBSX1BQQ19QTFQzMgkJMjcKKyNkZWZpbmUgUl9QUENfUExUUkVMMzIJCTI4CisjZGVmaW5lIFJfUFBDX1BMVDE2X0xPCQkyOQorI2RlZmluZSBSX1BQQ19QTFQxNl9ISQkJMzAKKyNkZWZpbmUgUl9QUENfUExUMTZfSEEJCTMxCisjZGVmaW5lIFJfUFBDX1NEQVJFTDE2CQkzMgorI2RlZmluZSBSX1BQQ19TRUNUT0ZGCQkzMworI2RlZmluZSBSX1BQQ19TRUNUT0ZGX0xPCTM0CisjZGVmaW5lIFJfUFBDX1NFQ1RPRkZfSEkJMzUKKyNkZWZpbmUgUl9QUENfU0VDVE9GRl9IQQkzNgorLyogS2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5LiAgKi8KKyNpZm5kZWYgUl9QUENfTlVNCisjZGVmaW5lIFJfUFBDX05VTQkJMzcKKyNlbmRpZgorCisvKiBBUk0gc3BlY2lmaWMgZGVjbGFyYXRpb25zICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCisjZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCisjZGVmaW5lIEVGX0FSTV9JTlRFUldPUksgICAweDA0CisjZGVmaW5lIEVGX0FSTV9BUENTXzI2ICAgICAweDA4CisjZGVmaW5lIEVGX0FSTV9BUENTX0ZMT0FUICAweDEwCisjZGVmaW5lIEVGX0FSTV9QSUMgICAgICAgICAweDIwCisjZGVmaW5lIEVGX0FMSUdOOCAgICAgICAgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLworI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAorI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKKyNkZWZpbmUgRUZfQVJNX1NPRlRfRkxPQVQgIDB4MjAwCisjZGVmaW5lIEVGX0FSTV9WRlBfRkxPQVQgICAweDQwMAorI2RlZmluZSBFRl9BUk1fTUFWRVJJQ0tfRkxPQVQgMHg4MDAKKworLyogT3RoZXIgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIEFSTSBFTEYgc3BlYy4gdmVyc2lvbiBCLTAxLiAgKi8KKyNkZWZpbmUgRUZfQVJNX1NZTVNBUkVTT1JURUQgMHgwNCAgICAgICAvKiBOQiBjb25mbGljdHMgd2l0aCBFRl9JTlRFUldPUksgKi8KKyNkZWZpbmUgRUZfQVJNX0RZTlNZTVNVU0VTRUdJRFggMHgwOCAgICAvKiBOQiBjb25mbGljdHMgd2l0aCBFRl9BUENTMjYgKi8KKyNkZWZpbmUgRUZfQVJNX01BUFNZTVNGSVJTVCAweDEwICAgICAgICAvKiBOQiBjb25mbGljdHMgd2l0aCBFRl9BUENTX0ZMT0FUICovCisjZGVmaW5lIEVGX0FSTV9FQUJJTUFTSyAgICAgIDB4RkYwMDAwMDAKKworLyogQ29uc3RhbnRzIGRlZmluZWQgaW4gQUFFTEYuICAqLworI2RlZmluZSBFRl9BUk1fQkU4ICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRUZfQVJNX0xFOCAgICAgICAgICAweDAwNDAwMDAwCisKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSU0lPTihmbGFncykgKChmbGFncykgJiBFRl9BUk1fRUFCSU1BU0spCisjZGVmaW5lIEVGX0FSTV9FQUJJX1VOS05PV04gIDB4MDAwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSMSAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVIyICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjMgICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRUZfQVJNX0VBQklfVkVSNCAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBFRl9BUk1fRUFCSV9WRVI1ICAgICAweDA1MDAwMDAwCisKKy8qIEFkZGl0aW9uYWwgc3ltYm9sIHR5cGVzIGZvciBUaHVtYiAqLworI2RlZmluZSBTVFRfQVJNX1RGVU5DICAgICAgMHhkCisKKy8qIEFSTS1zcGVjaWZpYyB2YWx1ZXMgZm9yIHNoX2ZsYWdzICovCisjZGVmaW5lIFNIRl9BUk1fRU5UUllTRUNUICAweDEwMDAwMDAwICAgLyogU2VjdGlvbiBjb250YWlucyBhbiBlbnRyeSBwb2ludCAqLworI2RlZmluZSBTSEZfQVJNX0NPTURFRiAgICAgMHg4MDAwMDAwMCAgIC8qIFNlY3Rpb24gbWF5IGJlIG11bHRpcGx5IGRlZmluZWQKKwkJCQkJICAgaW4gdGhlIGlucHV0IHRvIGEgbGluayBzdGVwICovCisKKy8qIEFSTS1zcGVjaWZpYyBwcm9ncmFtIGhlYWRlciBmbGFncyAqLworI2RlZmluZSBQRl9BUk1fU0IgICAgICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlZ21lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uCisJCQkJCSAgIGFkZHJlc3NlZCBieSB0aGUgc3RhdGljIGJhc2UgKi8KKworLyogQVJNIHJlbG9jcy4gICovCisjZGVmaW5lIFJfQVJNX05PTkUJCTAJLyogTm8gcmVsb2MgKi8KKyNkZWZpbmUgUl9BUk1fUEMyNAkJMQkvKiBQQyByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX0FCUzMyCQkyCS8qIERpcmVjdCAzMiBiaXQgICovCisjZGVmaW5lIFJfQVJNX1JFTDMyCQkzCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLworI2RlZmluZSBSX0FSTV9QQzEzCQk0CisjZGVmaW5lIFJfQVJNX0FCUzE2CQk1CS8qIERpcmVjdCAxNiBiaXQgKi8KKyNkZWZpbmUgUl9BUk1fQUJTMTIJCTYJLyogRGlyZWN0IDEyIGJpdCAqLworI2RlZmluZSBSX0FSTV9USE1fQUJTNQkJNworI2RlZmluZSBSX0FSTV9BQlM4CQk4CS8qIERpcmVjdCA4IGJpdCAqLworI2RlZmluZSBSX0FSTV9TQlJFTDMyCQk5CisjZGVmaW5lIFJfQVJNX1RITV9QQzIyCQkxMAorI2RlZmluZSBSX0FSTV9USE1fUEM4CQkxMQorI2RlZmluZSBSX0FSTV9BTVBfVkNBTEw5CTEyCisjZGVmaW5lIFJfQVJNX1NXSTI0CQkxMworI2RlZmluZSBSX0FSTV9USE1fU1dJOAkJMTQKKyNkZWZpbmUgUl9BUk1fWFBDMjUJCTE1CisjZGVmaW5lIFJfQVJNX1RITV9YUEMyMgkJMTYKKyNkZWZpbmUgUl9BUk1fQ09QWQkJMjAJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLworI2RlZmluZSBSX0FSTV9HTE9CX0RBVAkJMjEJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLworI2RlZmluZSBSX0FSTV9KVU1QX1NMT1QJCTIyCS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fUkVMQVRJVkUJCTIzCS8qIEFkanVzdCBieSBwcm9ncmFtIGJhc2UgKi8KKyNkZWZpbmUgUl9BUk1fR09UT0ZGCQkyNAkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLworI2RlZmluZSBSX0FSTV9HT1RQQwkJMjUJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KKyNkZWZpbmUgUl9BUk1fR09UMzIJCTI2CS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KKyNkZWZpbmUgUl9BUk1fUExUMzIJCTI3CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX0FSTV9DQUxMICAgICAgICAgICAgICAyOAorI2RlZmluZSBSX0FSTV9KVU1QMjQgICAgICAgICAgICAyOQorI2RlZmluZSBSX0FSTV9HTlVfVlRFTlRSWQkxMDAKKyNkZWZpbmUgUl9BUk1fR05VX1ZUSU5IRVJJVAkxMDEKKyNkZWZpbmUgUl9BUk1fVEhNX1BDMTEJCTEwMgkvKiB0aHVtYiB1bmNvbmRpdGlvbmFsIGJyYW5jaCAqLworI2RlZmluZSBSX0FSTV9USE1fUEM5CQkxMDMJLyogdGh1bWIgY29uZGl0aW9uYWwgYnJhbmNoICovCisjZGVmaW5lIFJfQVJNX1JYUEMyNQkJMjQ5CisjZGVmaW5lIFJfQVJNX1JTQlJFTDMyCQkyNTAKKyNkZWZpbmUgUl9BUk1fVEhNX1JQQzIyCQkyNTEKKyNkZWZpbmUgUl9BUk1fUlJFTDMyCQkyNTIKKyNkZWZpbmUgUl9BUk1fUkFCUzIyCQkyNTMKKyNkZWZpbmUgUl9BUk1fUlBDMjQJCTI1NAorI2RlZmluZSBSX0FSTV9SQkFTRQkJMjU1CisvKiBLZWVwIHRoaXMgdGhlIGxhc3QgZW50cnkuICAqLworI2RlZmluZSBSX0FSTV9OVU0JCTI1NgorCisvKiBBUk0gQWFyY2g2NCByZWxvY2F0aW9uIHR5cGVzICovCisjZGVmaW5lIFJfQUFSQ0g2NF9OT05FICAgICAgICAgICAgICAgIDI1NiAvKiBhbHNvIGFjY2VwdHMgUl9BUk1fTk9ORSAoMCkgKi8KKy8qIHN0YXRpYyBkYXRhIHJlbG9jYXRpb25zICovCisjZGVmaW5lIFJfQUFSQ0g2NF9BQlM2NCAgICAgICAgICAgICAgIDI1NworI2RlZmluZSBSX0FBUkNINjRfQUJTMzIgICAgICAgICAgICAgICAyNTgKKyNkZWZpbmUgUl9BQVJDSDY0X0FCUzE2ICAgICAgICAgICAgICAgMjU5CisjZGVmaW5lIFJfQUFSQ0g2NF9QUkVMNjQgICAgICAgICAgICAgIDI2MAorI2RlZmluZSBSX0FBUkNINjRfUFJFTDMyICAgICAgICAgICAgICAyNjEKKyNkZWZpbmUgUl9BQVJDSDY0X1BSRUwxNiAgICAgICAgICAgICAgMjYyCisvKiBzdGF0aWMgYWFyY2g2NCBncm91cCByZWxvY2F0aW9ucyAqLworLyogZ3JvdXAgcmVsb2NzIHRvIGNyZWF0ZSB1bnNpZ25lZCBkYXRhIHZhbHVlIG9yIGFkZHJlc3MgaW5saW5lICovCisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzAgICAgICAgIDI2MworI2RlZmluZSBSX0FBUkNINjRfTU9WV19VQUJTX0cwX05DICAgICAyNjQKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfVUFCU19HMSAgICAgICAgMjY1CisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzFfTkMgICAgIDI2NgorI2RlZmluZSBSX0FBUkNINjRfTU9WV19VQUJTX0cyICAgICAgICAyNjcKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfVUFCU19HMl9OQyAgICAgMjY4CisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzMgICAgICAgIDI2OQorLyogZ3JvdXAgcmVsb2NzIHRvIGNyZWF0ZSBzaWduZWQgZGF0YSBvciBvZmZzZXQgdmFsdWUgaW5saW5lICovCisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1NBQlNfRzAgICAgICAgIDI3MAorI2RlZmluZSBSX0FBUkNINjRfTU9WV19TQUJTX0cxICAgICAgICAyNzEKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfU0FCU19HMiAgICAgICAgMjcyCisvKiByZWxvY3MgdG8gZ2VuZXJhdGUgMTksIDIxLCBhbmQgMzMgYml0IFBDLXJlbGF0aXZlIGFkZHJlc3NlcyAqLworI2RlZmluZSBSX0FBUkNINjRfTERfUFJFTF9MTzE5ICAgICAgICAyNzMKKyNkZWZpbmUgUl9BQVJDSDY0X0FEUl9QUkVMX0xPMjEgICAgICAgMjc0CisjZGVmaW5lIFJfQUFSQ0g2NF9BRFJfUFJFTF9QR19ISTIxICAgIDI3NQorI2RlZmluZSBSX0FBUkNINjRfQURSX1BSRUxfUEdfSEkyMV9OQyAyNzYKKyNkZWZpbmUgUl9BQVJDSDY0X0FERF9BQlNfTE8xMl9OQyAgICAgMjc3CisjZGVmaW5lIFJfQUFSQ0g2NF9MRFNUOF9BQlNfTE8xMl9OQyAgIDI3OAorI2RlZmluZSBSX0FBUkNINjRfTERTVDE2X0FCU19MTzEyX05DICAyODQKKyNkZWZpbmUgUl9BQVJDSDY0X0xEU1QzMl9BQlNfTE8xMl9OQyAgMjg1CisjZGVmaW5lIFJfQUFSQ0g2NF9MRFNUNjRfQUJTX0xPMTJfTkMgIDI4NgorI2RlZmluZSBSX0FBUkNINjRfTERTVDEyOF9BQlNfTE8xMl9OQyAyOTkKKy8qIHJlbG9jcyBmb3IgY29udHJvbC1mbG93IC0gYWxsIG9mZnNldHMgYXMgbXVsdGlwbGUgb2YgNCAqLworI2RlZmluZSBSX0FBUkNINjRfVFNUQlIxNCAgICAgICAgICAgICAyNzkKKyNkZWZpbmUgUl9BQVJDSDY0X0NPTkRCUjE5ICAgICAgICAgICAgMjgwCisjZGVmaW5lIFJfQUFSQ0g2NF9KVU1QMjYgICAgICAgICAgICAgIDI4MgorI2RlZmluZSBSX0FBUkNINjRfQ0FMTDI2ICAgICAgICAgICAgICAyODMKKy8qIGdyb3VwIHJlbG9jcyB0byBjcmVhdGUgcGMtcmVsYXRpdmUgb2Zmc2V0IGlubGluZSAqLworI2RlZmluZSBSX0FBUkNINjRfTU9WV19QUkVMX0cwICAgICAgICAyODcKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfUFJFTF9HMF9OQyAgICAgMjg4CisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzEgICAgICAgIDI4OQorI2RlZmluZSBSX0FBUkNINjRfTU9WV19QUkVMX0cxX05DICAgICAyOTAKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfUFJFTF9HMiAgICAgICAgMjkxCisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzJfTkMgICAgIDI5MgorI2RlZmluZSBSX0FBUkNINjRfTU9WV19QUkVMX0czICAgICAgICAyOTMKKy8qIGdyb3VwIHJlbG9jcyB0byBjcmVhdGUgYSBHT1QtcmVsYXRpdmUgb2Zmc2V0IGlubGluZSAqLworI2RlZmluZSBSX0FBUkNINjRfTU9WV19HT1RPRkZfRzAgICAgICAzMDAKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfR09UT0ZGX0cwX05DICAgMzAxCisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMSAgICAgIDMwMgorI2RlZmluZSBSX0FBUkNINjRfTU9WV19HT1RPRkZfRzFfTkMgICAzMDMKKyNkZWZpbmUgUl9BQVJDSDY0X01PVldfR09UT0ZGX0cyICAgICAgMzA0CisjZGVmaW5lIFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMl9OQyAgIDMwNQorI2RlZmluZSBSX0FBUkNINjRfTU9WV19HT1RPRkZfRzMgICAgICAzMDYKKy8qIEdPVC1yZWxhdGl2ZSBkYXRhIHJlbG9jcyAqLworI2RlZmluZSBSX0FBUkNINjRfR09UUkVMNjQgICAgICAgICAgICAzMDcKKyNkZWZpbmUgUl9BQVJDSDY0X0dPVFJFTDMyICAgICAgICAgICAgMzA4CisvKiBHT1QtcmVsYXRpdmUgaW5zdHIgcmVsb2NzICovCisjZGVmaW5lIFJfQUFSQ0g2NF9HT1RfTERfUFJFTDE5ICAgICAgIDMwOQorI2RlZmluZSBSX0FBUkNINjRfTEQ2NF9HT1RPRkZfTE8xNSAgICAzMTAKKyNkZWZpbmUgUl9BQVJDSDY0X0FEUl9HT1RfUEFHRSAgICAgICAgMzExCisjZGVmaW5lIFJfQUFSQ0g2NF9MRDY0X0dPVF9MTzEyX05DICAgIDMxMgorI2RlZmluZSBSX0FBUkNINjRfTEQ2NF9HT1RQQUdFX0xPMTUgICAzMTMKKy8qIEdlbmVyYWwgRHluYW1pYyBUTFMgcmVsb2NhdGlvbnMgKi8KKyNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX0FEUl9QUkVMMjEgICAgICAgICAgICA1MTIKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX0FEUl9QQUdFMjEgICAgICAgICAgICA1MTMKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX0FERF9MTzEyX05DICAgICAgICAgICA1MTQKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX01PVldfRzEgICAgICAgICAgICAgICA1MTUKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU0dEX01PVldfRzBfTkMgICAgICAgICAgICA1MTYKKy8qIExvY2FsIER5bmFtaWMgVExTIHJlbG9jYXRpb25zICovCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRFJfUFJFTDIxICAgICAgICAgICAgNTE3CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRFJfUEFHRTIxICAgICAgICAgICAgNTE4CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfTE8xMl9OQyAgICAgICAgICAgNTE5CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0cxICAgICAgICAgICAgICAgNTIwCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0cwX05DICAgICAgICAgICAgNTIxCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRF9QUkVMMTkgICAgICAgICAgICAgNTIyCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMiAgICAgICAgNTIzCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMSAgICAgICAgNTI0CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMV9OQyAgICAgNTI1CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMCAgICAgICAgNTI2CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMF9OQyAgICAgNTI3CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0hJMTIgICAgICAgNTI4CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0xPMTIgICAgICAgNTI5CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0xPMTJfTkMgICAgNTMwCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUOF9EVFBSRUxfTE8xMiAgICAgNTMxCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUOF9EVFBSRUxfTE8xMl9OQyAgNTMyCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTZfRFRQUkVMX0xPMTIgICAgNTMzCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTZfRFRQUkVMX0xPMTJfTkMgNTM0CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTIgICAgNTM1CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTJfTkMgNTM2CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUNjRfRFRQUkVMX0xPMTIgICAgNTM3CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNMRF9MRFNUNjRfRFRQUkVMX0xPMTJfTkMgNTM4CisvKiBpbml0aWFsIGV4ZWMgVExTIHJlbG9jYXRpb25zICovCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9NT1ZXX0dPVFRQUkVMX0cxICAgICAgNTM5CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9NT1ZXX0dPVFRQUkVMX0cwX05DICAgNTQwCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9BRFJfR09UVFBSRUxfUEFHRTIxICAgNTQxCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9MRDY0X0dPVFRQUkVMX0xPMTJfTkMgNTQyCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNJRV9MRF9HT1RUUFJFTF9QUkVMMTkgICAgNTQzCisvKiBsb2NhbCBleGVjIFRMUyByZWxvY2F0aW9ucyAqLworI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMiAgICAgICAgIDU0NAorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMSAgICAgICAgIDU0NQorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMV9OQyAgICAgIDU0NgorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMCAgICAgICAgIDU0NworI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMF9OQyAgICAgIDU0OAorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0hJMTIgICAgICAgIDU0OQorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0xPMTIgICAgICAgIDU1MAorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0xPMTJfTkMgICAgIDU1MQorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDhfVFBSRUxfTE8xMiAgICAgIDU1MgorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDhfVFBSRUxfTE8xMl9OQyAgIDU1MworI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDE2X1RQUkVMX0xPMTIgICAgIDU1NAorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDE2X1RQUkVMX0xPMTJfTkMgIDU1NQorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDMyX1RQUkVMX0xPMTIgICAgIDU1NgorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDMyX1RQUkVMX0xPMTJfTkMgIDU1NworI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDY0X1RQUkVMX0xPMTIgICAgIDU1OAorI2RlZmluZSBSX0FBUkNINjRfVExTTEVfTERTVDY0X1RQUkVMX0xPMTJfTkMgIDU1OQorLyogRHluYW1pYyBSZWxvY2F0aW9ucyAqLworI2RlZmluZSBSX0FBUkNINjRfQ09QWSAgICAgICAgIDEwMjQKKyNkZWZpbmUgUl9BQVJDSDY0X0dMT0JfREFUICAgICAxMDI1CisjZGVmaW5lIFJfQUFSQ0g2NF9KVU1QX1NMT1QgICAgMTAyNgorI2RlZmluZSBSX0FBUkNINjRfUkVMQVRJVkUgICAgIDEwMjcKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU19EVFBSRUw2NCAxMDI4CisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNfRFRQTU9ENjQgMTAyOQorI2RlZmluZSBSX0FBUkNINjRfVExTX1RQUkVMNjQgIDEwMzAKKyNkZWZpbmUgUl9BQVJDSDY0X1RMU19EVFBSRUwzMiAxMDMxCisjZGVmaW5lIFJfQUFSQ0g2NF9UTFNfRFRQTU9EMzIgMTAzMgorI2RlZmluZSBSX0FBUkNINjRfVExTX1RQUkVMMzIgIDEwMzMKKworLyogczM5MCByZWxvY2F0aW9ucyBkZWZpbmVkIGJ5IHRoZSBBQklzICovCisjZGVmaW5lIFJfMzkwX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSXzM5MF84CQkJMQkvKiBEaXJlY3QgOCBiaXQuICAqLworI2RlZmluZSBSXzM5MF8xMgkJMgkvKiBEaXJlY3QgMTIgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfMTYJCTMJLyogRGlyZWN0IDE2IGJpdC4gICovCisjZGVmaW5lIFJfMzkwXzMyCQk0CS8qIERpcmVjdCAzMiBiaXQuICAqLworI2RlZmluZSBSXzM5MF9QQzMyCQk1CS8qIFBDIHJlbGF0aXZlIDMyIGJpdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UMTIJCTYJLyogMTIgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9HT1QzMgkJNwkvKiAzMiBiaXQgR09UIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1BMVDMyCQk4CS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBQTFQgYWRkcmVzcy4gICovCisjZGVmaW5lIFJfMzkwX0NPUFkJCTkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZS4gICovCisjZGVmaW5lIFJfMzkwX0dMT0JfREFUCQkxMAkvKiBDcmVhdGUgR09UIGVudHJ5LiAgKi8KKyNkZWZpbmUgUl8zOTBfSk1QX1NMT1QJCTExCS8qIENyZWF0ZSBQTFQgZW50cnkuICAqLworI2RlZmluZSBSXzM5MF9SRUxBVElWRQkJMTIJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZS4gICovCisjZGVmaW5lIFJfMzkwX0dPVE9GRjMyCQkxMwkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVC4JICovCisjZGVmaW5lIFJfMzkwX0dPVFBDCQkxNAkvKiAzMiBiaXQgUEMgcmVsLiBvZmZzZXQgdG8gR09ULiAgKi8KKyNkZWZpbmUgUl8zOTBfR09UMTYJCTE1CS8qIDE2IGJpdCBHT1Qgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEMxNgkJMTYJLyogUEMgcmVsYXRpdmUgMTYgYml0LgkqLworI2RlZmluZSBSXzM5MF9QQzE2REJMCQkxNwkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMTZEQkwJCTE4CS8qIDE2IGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9QQzMyREJMCQkxOQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgc2hpZnRlZCBieSAxLiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUMzJEQkwJCTIwCS8qIDMyIGJpdCBQQyByZWwuIFBMVCBzaGlmdGVkIGJ5IDEuICAqLworI2RlZmluZSBSXzM5MF9HT1RQQ0RCTAkJMjEJLyogMzIgYml0IFBDIHJlbC4gR09UIHNoaWZ0ZWQgYnkgMS4gICovCisjZGVmaW5lIFJfMzkwXzY0CQkyMgkvKiBEaXJlY3QgNjQgYml0LiAgKi8KKyNkZWZpbmUgUl8zOTBfUEM2NAkJMjMJLyogUEMgcmVsYXRpdmUgNjQgYml0LgkqLworI2RlZmluZSBSXzM5MF9HT1Q2NAkJMjQJLyogNjQgYml0IEdPVCBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9QTFQ2NAkJMjUJLyogNjQgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl8zOTBfR09URU5UCQkyNgkvKiAzMiBiaXQgUEMgcmVsLiB0byBHT1QgZW50cnkgPj4gMS4gKi8KKyNkZWZpbmUgUl8zOTBfR09UT0ZGMTYJCTI3CS8qIDE2IGJpdCBvZmZzZXQgdG8gR09ULiAqLworI2RlZmluZSBSXzM5MF9HT1RPRkY2NAkJMjgJLyogNjQgYml0IG9mZnNldCB0byBHT1QuICovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDEyCQkyOQkvKiAxMiBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExUMTYJCTMwCS8qIDE2IGJpdCBvZmZzZXQgdG8ganVtcCBzbG90LgkqLworI2RlZmluZSBSXzM5MF9HT1RQTFQzMgkJMzEJLyogMzIgYml0IG9mZnNldCB0byBqdW1wIHNsb3QuCSovCisjZGVmaW5lIFJfMzkwX0dPVFBMVDY0CQkzMgkvKiA2NCBiaXQgb2Zmc2V0IHRvIGp1bXAgc2xvdC4JKi8KKyNkZWZpbmUgUl8zOTBfR09UUExURU5UCQkzMwkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8ganVtcCBzbG90LiAgKi8KKyNkZWZpbmUgUl8zOTBfUExUT0ZGMTYJCTM0CS8qIDE2IGJpdCBvZmZzZXQgZnJvbSBHT1QgdG8gUExULiAqLworI2RlZmluZSBSXzM5MF9QTFRPRkYzMgkJMzUJLyogMzIgYml0IG9mZnNldCBmcm9tIEdPVCB0byBQTFQuICovCisjZGVmaW5lIFJfMzkwX1BMVE9GRjY0CQkzNgkvKiAxNiBiaXQgb2Zmc2V0IGZyb20gR09UIHRvIFBMVC4gKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xPQUQJCTM3CS8qIFRhZyBmb3IgbG9hZCBpbnNuIGluIFRMUyBjb2RlLiAqLworI2RlZmluZSBSXzM5MF9UTFNfR0RDQUxMCTM4CS8qIFRhZyBmb3IgZnVuY3Rpb24gY2FsbCBpbiBnZW5lcmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBUTFMgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRENBTEwJMzkJLyogVGFnIGZvciBmdW5jdGlvbiBjYWxsIGluIGxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBUTFMgY29kZS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HRDMyCQk0MAkvKiBEaXJlY3QgMzIgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HRDY0CQk0MQkvKiBEaXJlY3QgNjQgYml0IGZvciBnZW5lcmFsIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgbG9jYWwgZGF0YS4gICovCisjZGVmaW5lIFJfMzkwX1RMU19HT1RJRTEyCTQyCS8qIDEyIGJpdCBHT1Qgb2Zmc2V0IGZvciBzdGF0aWMgVExTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0dPVElFMzIJNDMJLyogMzIgYml0IEdPVCBvZmZzZXQgZm9yIHN0YXRpYyBUTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfR09USUU2NAk0NAkvKiA2NCBiaXQgR09UIG9mZnNldCBmb3Igc3RhdGljIFRMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrIG9mZnNldC4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRE0zMgkJNDUJLyogRGlyZWN0IDMyIGJpdCBmb3IgbG9jYWwgZHluYW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCBsb2NhbCBkYXRhIGluIExEIGNvZGUuICAqLworI2RlZmluZSBSXzM5MF9UTFNfTERNNjQJCTQ2CS8qIERpcmVjdCA2NCBiaXQgZm9yIGxvY2FsIGR5bmFtaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQgbG9jYWwgZGF0YSBpbiBMRCBjb2RlLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFMzIJCTQ3CS8qIDMyIGJpdCBhZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFNjQJCTQ4CS8qIDY0IGJpdCBhZGRyZXNzIG9mIEdPVCBlbnRyeSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGVkIHN0YXRpYyBUTFMgYmxvY2sgb2Zmc2V0LiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0lFRU5UCQk0OQkvKiAzMiBiaXQgcmVsLiBvZmZzZXQgdG8gR09UIGVudHJ5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZWQgc3RhdGljIFRMUyBibG9jayBvZmZzZXQuICAqLworI2RlZmluZSBSXzM5MF9UTFNfTEUzMgkJNTAJLyogMzIgYml0IG5lZ2F0ZWQgb2Zmc2V0IHJlbGF0aXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIFRMUyBibG9jay4gICovCisjZGVmaW5lIFJfMzkwX1RMU19MRTY0CQk1MQkvKiA2NCBiaXQgbmVnYXRlZCBvZmZzZXQgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgVExTIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETzMyCQk1MgkvKiAzMiBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0xETzY0CQk1MwkvKiA2NCBiaXQgb2Zmc2V0IHJlbGF0aXZlIHRvIFRMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiAgKi8KKyNkZWZpbmUgUl8zOTBfVExTX0RUUE1PRAk1NAkvKiBJRCBvZiBtb2R1bGUgY29udGFpbmluZyBzeW1ib2wuICAqLworI2RlZmluZSBSXzM5MF9UTFNfRFRQT0ZGCTU1CS8qIE9mZnNldCBpbiBUTFMgYmxvY2suICAqLworI2RlZmluZSBSXzM5MF9UTFNfVFBPRkYJCTU2CS8qIE5lZ2F0ZSBvZmZzZXQgaW4gc3RhdGljIFRMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLiAgKi8KKy8qIEtlZXAgdGhpcyB0aGUgbGFzdCBlbnRyeS4gICovCisjZGVmaW5lIFJfMzkwX05VTQk1NworCisvKiB4ODYtNjQgcmVsb2NhdGlvbiB0eXBlcyAqLworI2RlZmluZSBSX1g4Nl82NF9OT05FCQkwCS8qIE5vIHJlbG9jICovCisjZGVmaW5lIFJfWDg2XzY0XzY0CQkxCS8qIERpcmVjdCA2NCBiaXQgICovCisjZGVmaW5lIFJfWDg2XzY0X1BDMzIJCTIJLyogUEMgcmVsYXRpdmUgMzIgYml0IHNpZ25lZCAqLworI2RlZmluZSBSX1g4Nl82NF9HT1QzMgkJMwkvKiAzMiBiaXQgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X1BMVDMyCQk0CS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLworI2RlZmluZSBSX1g4Nl82NF9DT1BZCQk1CS8qIENvcHkgc3ltYm9sIGF0IHJ1bnRpbWUgKi8KKyNkZWZpbmUgUl9YODZfNjRfR0xPQl9EQVQJNgkvKiBDcmVhdGUgR09UIGVudHJ5ICovCisjZGVmaW5lIFJfWDg2XzY0X0pVTVBfU0xPVAk3CS8qIENyZWF0ZSBQTFQgZW50cnkgKi8KKyNkZWZpbmUgUl9YODZfNjRfUkVMQVRJVkUJOAkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCisjZGVmaW5lIFJfWDg2XzY0X0dPVFBDUkVMCTkJLyogMzIgYml0IHNpZ25lZCBwYyByZWxhdGl2ZQorCQkJCQkgICBvZmZzZXQgdG8gR09UICovCisjZGVmaW5lIFJfWDg2XzY0XzMyCQkxMAkvKiBEaXJlY3QgMzIgYml0IHplcm8gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMzJTCQkxMQkvKiBEaXJlY3QgMzIgYml0IHNpZ24gZXh0ZW5kZWQgKi8KKyNkZWZpbmUgUl9YODZfNjRfMTYJCTEyCS8qIERpcmVjdCAxNiBiaXQgemVybyBleHRlbmRlZCAqLworI2RlZmluZSBSX1g4Nl82NF9QQzE2CQkxMwkvKiAxNiBiaXQgc2lnbiBleHRlbmRlZCBwYyByZWxhdGl2ZSAqLworI2RlZmluZSBSX1g4Nl82NF84CQkxNAkvKiBEaXJlY3QgOCBiaXQgc2lnbiBleHRlbmRlZCAgKi8KKyNkZWZpbmUgUl9YODZfNjRfUEM4CQkxNQkvKiA4IGJpdCBzaWduIGV4dGVuZGVkIHBjIHJlbGF0aXZlICovCisKKyNkZWZpbmUgUl9YODZfNjRfTlVNCQkxNgorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmNjRfRWhkci4gICovCisKKyNkZWZpbmUgRUZfQUxQSEFfMzJCSVQJCTEJLyogQWxsIGFkZHJlc3NlcyBhcmUgYmVsb3cgMkdCICovCisKKy8qIEhQUEEgc3BlY2lmaWMgZGVmaW5pdGlvbnMuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIGVfZmxhZ3MgZmllbGQgb2YgRWxmMzJfRWhkci4gICovCisKKyNkZWZpbmUgRUZfUEFSSVNDX1RSQVBOSUwJMHgwMDAxMDAwMCAvKiBUcmFwIG5pbCBwb2ludGVyIGRlcmVmZXJlbmNlLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0VYVAkJMHgwMDAyMDAwMCAvKiBQcm9ncmFtIHVzZXMgYXJjaC4gZXh0ZW5zaW9ucy4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xTQgkJMHgwMDA0MDAwMCAvKiBQcm9ncmFtIGV4cGVjdHMgbGl0dGxlIGVuZGlhbi4gKi8KKyNkZWZpbmUgRUZfUEFSSVNDX1dJREUJCTB4MDAwODAwMDAgLyogUHJvZ3JhbSBleHBlY3RzIHdpZGUgbW9kZS4gICovCisjZGVmaW5lIEVGX1BBUklTQ19OT19LQUJQCTB4MDAxMDAwMDAgLyogTm8ga2VybmVsIGFzc2lzdGVkIGJyYW5jaAorCQkJCQkgICAgICBwcmVkaWN0aW9uLiAgKi8KKyNkZWZpbmUgRUZfUEFSSVNDX0xBWllTV0FQCTB4MDA0MDAwMDAgLyogQWxsb3cgbGF6eSBzd2FwcGluZy4gICovCisjZGVmaW5lIEVGX1BBUklTQ19BUkNICQkweDAwMDBmZmZmIC8qIEFyY2hpdGVjdHVyZSB2ZXJzaW9uLiAgKi8KKworLyogRGVmaW5lZCB2YWx1ZXMgZm9yIGBlX2ZsYWdzICYgRUZfUEFSSVNDX0FSQ0gnIGFyZTogICovCisKKyNkZWZpbmUgRUZBX1BBUklTQ18xXzAJCSAgICAweDAyMGIgLyogUEEtUklTQyAxLjAgYmlnLWVuZGlhbi4gICovCisjZGVmaW5lIEVGQV9QQVJJU0NfMV8xCQkgICAgMHgwMjEwIC8qIFBBLVJJU0MgMS4xIGJpZy1lbmRpYW4uICAqLworI2RlZmluZSBFRkFfUEFSSVNDXzJfMAkJICAgIDB4MDIxNCAvKiBQQS1SSVNDIDIuMCBiaWctZW5kaWFuLiAgKi8KKworLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZGVjZXMuICAqLworCisjZGVmaW5lIFNITl9QQVJJU0NfQU5TSV9DT01NT04JMHhmZjAwCSAgIC8qIFNlY3Rpb24gZm9yIHRlbmF0aXZlbHkgZGVjbGFyZWQKKwkJCQkJICAgICAgc3ltYm9scyBpbiBBTlNJIEMuICAqLworI2RlZmluZSBTSE5fUEFSSVNDX0hVR0VfQ09NTU9OCTB4ZmYwMQkgICAvKiBDb21tb24gYmxvY2tzIGluIGh1Z2UgbW9kZWwuICAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHNoX3R5cGUgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hUX1BBUklTQ19FWFQJCTB4NzAwMDAwMDAgLyogQ29udGFpbnMgcHJvZHVjdCBzcGVjaWZpYyBleHQuICovCisjZGVmaW5lIFNIVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEgLyogVW53aW5kIGluZm9ybWF0aW9uLiAgKi8KKyNkZWZpbmUgU0hUX1BBUklTQ19ET0MJCTB4NzAwMDAwMDIgLyogRGVidWcgaW5mbyBmb3Igb3B0aW1pemVkIGNvZGUuICovCisKKy8qIExlZ2FsIHZhbHVlcyBmb3Igc2hfZmxhZ3MgZmllbGQgb2YgRWxmMzJfU2hkci4gICovCisKKyNkZWZpbmUgU0hGX1BBUklTQ19TSE9SVAkweDIwMDAwMDAwIC8qIFNlY3Rpb24gd2l0aCBzaG9ydCBhZGRyZXNzaW5nLiAqLworI2RlZmluZSBTSEZfUEFSSVNDX0hVR0UJCTB4NDAwMDAwMDAgLyogU2VjdGlvbiBmYXIgZnJvbSBncC4gICovCisjZGVmaW5lIFNIRl9QQVJJU0NfU0JQCQkweDgwMDAwMDAwIC8qIFN0YXRpYyBicmFuY2ggcHJlZGljdGlvbiBjb2RlLiAqLworCisvKiBMZWdhbCB2YWx1ZXMgZm9yIFNUX1RZUEUgc3ViZmllbGQgb2Ygc3RfaW5mbyAoc3ltYm9sIHR5cGUpLiAgKi8KKworI2RlZmluZSBTVFRfUEFSSVNDX01JTExJQ09ERQkxMwkvKiBNaWxsaWNvZGUgZnVuY3Rpb24gZW50cnkgcG9pbnQuICAqLworCisjZGVmaW5lIFNUVF9IUF9PUEFRVUUJCShTVFRfTE9PUyArIDB4MSkKKyNkZWZpbmUgU1RUX0hQX1NUVUIJCShTVFRfTE9PUyArIDB4MikKKworLyogSFBQQSByZWxvY3MuICAqLworCisjZGVmaW5lIFJfUEFSSVNDX05PTkUJCTAJLyogTm8gcmVsb2MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIzMgkJMQkvKiBEaXJlY3QgMzItYml0IHJlZmVyZW5jZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjIxTAkJMgkvKiBMZWZ0IDIxIGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdSCQkzCS8qIFJpZ2h0IDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTdGCQk0CS8qIDE3IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTRSCQk2CS8qIFJpZ2h0IDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwzMgk5CS8qIDMyLWJpdCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIxTAkxMAkvKiBMZWZ0IDIxIGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxN1IJMTEJLyogUmlnaHQgMTcgYml0cyBvZiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE3RgkxMgkvKiAxNyBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRSCTE0CS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRFBSRUwyMUwJMTgJLyogTGVmdCAyMSBiaXRzIG9mIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RQUkVMMTRSCTIyCS8qIFJpZ2h0IDE0IGJpdHMgb2YgcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwyMUwJMjYJLyogR1AtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTRSCTMwCS8qIEdQLXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkYyMUwJMzQJLyogTFQtcmVsYXRpdmUsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRSCTM4CS8qIExULXJlbGF0aXZlLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMMzIJNDEJLyogMzIgYml0cyBzZWN0aW9uIHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR0JBU0UJNDgJLyogTm8gcmVsb2NhdGlvbiwgc2V0IHNlZ21lbnQgYmFzZS4gICovCisjZGVmaW5lIFJfUEFSSVNDX1NFR1JFTDMyCTQ5CS8qIDMyIGJpdHMgc2VnbWVudCByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYyMUwJNTAJLyogUExUIHJlbC4gYWRkcmVzcywgbGVmdCAyMSBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTRSCTU0CS8qIFBMVCByZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMzIJNTcJLyogMzIgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHBvaW50ZXIuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIyMUwJNTgJLyogTFQtcmVsLiBmY3QgcHRyLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIJNjIJLyogTFQtcmVsLiBmY3QgcHRyLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19GUFRSNjQJCTY0CS8qIDY0IGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMQUJFTDMyCTY1CS8qIDMyIGJpdHMgZnVuY3Rpb24gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMNjQJNzIJLyogNjQgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDIyRgk3NAkvKiAyMiBiaXRzIFBDLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BDUkVMMTRXUgk3NQkvKiBQQy1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE0RFIJNzYJLyogUEMgcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUENSRUwxNkYJNzcJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2V0YJNzgJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19QQ1JFTDE2REYJNzkJLyogMTYgYml0cyBQQy1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVI2NAkJODAJLyogNjQgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNFdSCTgzCS8qIDE0IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTREUgk4NAkvKiAxNCBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0RJUjE2RgkJODUJLyogMTYgYml0cyBvZiBlZmYuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19ESVIxNldGCTg2CS8qIDE2IGJpdHMgb2YgZWZmLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRElSMTZERgk4NwkvKiAxNiBiaXRzIG9mIGVmZi4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMNjQJODgJLyogNjQgYml0cyBvZiBHUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19HUFJFTDE0V1IJOTEJLyogR1AtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNERSCTkyCS8qIEdQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0dQUkVMMTZGCTkzCS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNldGCTk0CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfR1BSRUwxNkRGCTk1CS8qIDE2IGJpdHMgR1AtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkY2NAk5NgkvKiA2NCBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTRXUgk5OQkvKiBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE0RFIJMTAwCS8qIExULXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZGCTEwMQkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGMTZXRgkxMDIJLyogMTYgYml0cyBMVC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRjE2REYJMTAzCS8qIDE2IGJpdHMgTFQtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfU0VDUkVMNjQJMTA0CS8qIDY0IGJpdHMgc2VjdGlvbiByZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19TRUdSRUw2NAkxMTIJLyogNjQgYml0cyBzZWdtZW50IHJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE0V1IJMTE1CS8qIFBMVC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19QTFRPRkYxNERSCTExNgkvKiBQTFQtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfUExUT0ZGMTZGCTExNwkvKiAxNiBiaXRzIExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2V0YJMTE4CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1BMVE9GRjE2REYJMTE5CS8qIDE2IGJpdHMgUExULXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NAkxMjAJLyogNjQgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSCTEyMwkvKiBMVC1yZWwuIGZjdC4gcHRyLiwgcmlnaHQgMTQgYml0cy4gKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIJMTI0CS8qIExULXJlbC4gZmN0LiBwdHIuLCByaWdodCAxNCBiaXRzLiAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZGCTEyNQkvKiAxNiBiaXRzIExULXJlbC4gZnVuY3Rpb24gcHRyLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfRlBUUjE2V0YJMTI2CS8qIDE2IGJpdHMgTFQtcmVsLiBmdW5jdGlvbiBwdHIuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9GUFRSMTZERgkxMjcJLyogMTYgYml0cyBMVC1yZWwuIGZ1bmN0aW9uIHB0ci4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xPUkVTRVJWRQkxMjgKKyNkZWZpbmUgUl9QQVJJU0NfQ09QWQkJMTI4CS8qIENvcHkgcmVsb2NhdGlvbi4gICovCisjZGVmaW5lIFJfUEFSSVNDX0lQTFQJCTEyOQkvKiBEeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQgKi8KKyNkZWZpbmUgUl9QQVJJU0NfRVBMVAkJMTMwCS8qIER5bmFtaWMgcmVsb2MsIGV4cG9ydGVkIFBMVCAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDMyCTE1MwkvKiAzMiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMjFMCTE1NAkvKiBUUC1yZWwuIGFkZHJlc3MsIGxlZnQgMjEgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTRSCTE1OAkvKiBUUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDIxTAkxNjIJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCBsZWZ0IDIxIGJpdHMuICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRSCTE2NgkvKiBMVC1UUC1yZWwuIGFkZHJlc3MsIHJpZ2h0IDE0IGJpdHMuKi8KKyNkZWZpbmUgUl9QQVJJU0NfTFRPRkZfVFAxNEYJMTY3CS8qIDE0IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUw2NAkyMTYJLyogNjQgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19UUFJFTDE0V1IJMjE5CS8qIFRQLXJlbC4gYWRkcmVzcywgcmlnaHQgMTQgYml0cy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTREUgkyMjAJLyogVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNkYJMjIxCS8qIDE2IGJpdHMgVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfVFBSRUwxNldGCTIyMgkvKiAxNiBiaXRzIFRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX1RQUkVMMTZERgkyMjMJLyogMTYgYml0cyBUUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDY0CTIyNAkvKiA2NCBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTRXUgkyMjcJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTREUgkyMjgJLyogTFQtVFAtcmVsLiBhZGRyZXNzLCByaWdodCAxNCBiaXRzLiovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZGCTIyOQkvKiAxNiBiaXRzIExULVRQLXJlbC4gYWRkcmVzcy4gICovCisjZGVmaW5lIFJfUEFSSVNDX0xUT0ZGX1RQMTZXRgkyMzAJLyogMTYgYml0cyBMVC1UUC1yZWwuIGFkZHJlc3MuICAqLworI2RlZmluZSBSX1BBUklTQ19MVE9GRl9UUDE2REYJMjMxCS8qIDE2IGJpdHMgTFQtVFAtcmVsLiBhZGRyZXNzLiAgKi8KKyNkZWZpbmUgUl9QQVJJU0NfSElSRVNFUlZFCTI1NQorCisvKiBMZWdhbCB2YWx1ZXMgZm9yIHBfdHlwZSBmaWVsZCBvZiBFbGYzMl9QaGRyL0VsZjY0X1BoZHIuICAqLworCisjZGVmaW5lIFBUX0hQX1RMUwkJKFBUX0xPT1MgKyAweDApCisjZGVmaW5lIFBUX0hQX0NPUkVfTk9ORQkJKFBUX0xPT1MgKyAweDEpCisjZGVmaW5lIFBUX0hQX0NPUkVfVkVSU0lPTgkoUFRfTE9PUyArIDB4MikKKyNkZWZpbmUgUFRfSFBfQ09SRV9LRVJORUwJKFBUX0xPT1MgKyAweDMpCisjZGVmaW5lIFBUX0hQX0NPUkVfQ09NTQkJKFBUX0xPT1MgKyAweDQpCisjZGVmaW5lIFBUX0hQX0NPUkVfUFJPQwkJKFBUX0xPT1MgKyAweDUpCisjZGVmaW5lIFBUX0hQX0NPUkVfTE9BREFCTEUJKFBUX0xPT1MgKyAweDYpCisjZGVmaW5lIFBUX0hQX0NPUkVfU1RBQ0sJKFBUX0xPT1MgKyAweDcpCisjZGVmaW5lIFBUX0hQX0NPUkVfU0hNCQkoUFRfTE9PUyArIDB4OCkKKyNkZWZpbmUgUFRfSFBfQ09SRV9NTUYJCShQVF9MT09TICsgMHg5KQorI2RlZmluZSBQVF9IUF9QQVJBTExFTAkJKFBUX0xPT1MgKyAweDEwKQorI2RlZmluZSBQVF9IUF9GQVNUQklORAkJKFBUX0xPT1MgKyAweDExKQorI2RlZmluZSBQVF9IUF9PUFRfQU5OT1QJCShQVF9MT09TICsgMHgxMikKKyNkZWZpbmUgUFRfSFBfSFNMX0FOTk9UCQkoUFRfTE9PUyArIDB4MTMpCisjZGVmaW5lIFBUX0hQX1NUQUNLCQkoUFRfTE9PUyArIDB4MTQpCisKKyNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAorI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKKworLyogTGVnYWwgdmFsdWVzIGZvciBwX2ZsYWdzIGZpZWxkIG9mIEVsZjMyX1BoZHIvRWxmNjRfUGhkci4gICovCisKKyNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAorCisjZGVmaW5lIFBGX0hQX1BBR0VfU0laRQkJMHgwMDEwMDAwMAorI2RlZmluZSBQRl9IUF9GQVJfU0hBUkVECTB4MDAyMDAwMDAKKyNkZWZpbmUgUEZfSFBfTkVBUl9TSEFSRUQJMHgwMDQwMDAwMAorI2RlZmluZSBQRl9IUF9DT0RFCQkweDAxMDAwMDAwCisjZGVmaW5lIFBGX0hQX01PRElGWQkJMHgwMjAwMDAwMAorI2RlZmluZSBQRl9IUF9MQVpZU1dBUAkJMHgwNDAwMDAwMAorI2RlZmluZSBQRl9IUF9TQlAJCTB4MDgwMDAwMDAKKworLyogSUEtNjQgc3BlY2lmaWMgZGVjbGFyYXRpb25zLiAgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRWhkciBlX2ZsYWdzIGZpZWxkLiAgKi8KKyNkZWZpbmUgRUZfSUFfNjRfTUFTS09TCQkweDAwMDAwMDBmCS8qIG9zLXNwZWNpZmljIGZsYWdzICovCisjZGVmaW5lIEVGX0lBXzY0X0FCSTY0CQkweDAwMDAwMDEwCS8qIDY0LWJpdCBBQkkgKi8KKyNkZWZpbmUgRUZfSUFfNjRfQVJDSAkJMHhmZjAwMDAwMAkvKiBhcmNoLiB2ZXJzaW9uIG1hc2sgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIHZhbHVlcyBmb3IgdGhlIFBoZHIgcF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgUFRfSUFfNjRfQVJDSEVYVAkoUFRfTE9QUk9DICsgMCkJLyogYXJjaCBleHRlbnNpb24gYml0cyAqLworI2RlZmluZSBQVF9JQV82NF9VTldJTkQJCShQVF9MT1BST0MgKyAxKQkvKiBpYTY0IHVud2luZCBiaXRzICovCisKKy8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIFBoZHIgcF9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIFBGX0lBXzY0X05PUkVDT1YJMHg4MDAwMDAwMAkvKiBzcGVjIGluc25zIHcvbyByZWNvdmVyeSAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgU2hkciBzaF90eXBlIGZpZWxkLiAgKi8KKyNkZWZpbmUgU0hUX0lBXzY0X0VYVAkJKFNIVF9MT1BST0MgKyAwKSAvKiBleHRlbnNpb24gYml0cyAqLworI2RlZmluZSBTSFRfSUFfNjRfVU5XSU5ECShTSFRfTE9QUk9DICsgMSkgLyogdW53aW5kIGJpdHMgKi8KKworLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgU2hkciBzaF9mbGFncyBmaWVsZC4gICovCisjZGVmaW5lIFNIRl9JQV82NF9TSE9SVAkJMHgxMDAwMDAwMAkvKiBzZWN0aW9uIG5lYXIgZ3AgKi8KKyNkZWZpbmUgU0hGX0lBXzY0X05PUkVDT1YJMHgyMDAwMDAwMAkvKiBzcGVjIGluc25zIHcvbyByZWNvdmVyeSAqLworCisvKiBQcm9jZXNzb3Igc3BlY2lmaWMgdmFsdWVzIGZvciB0aGUgRHluIGRfdGFnIGZpZWxkLiAgKi8KKyNkZWZpbmUgRFRfSUFfNjRfUExUX1JFU0VSVkUJKERUX0xPUFJPQyArIDApCisjZGVmaW5lIERUX0lBXzY0X05VTQkJMQorCisvKiBJQS02NCByZWxvY2F0aW9ucy4gICovCisjZGVmaW5lIFJfSUE2NF9OT05FCQkweDAwCS8qIG5vbmUgKi8KKyNkZWZpbmUgUl9JQTY0X0lNTTE0CQkweDIxCS8qIHN5bWJvbCArIGFkZGVuZCwgYWRkIGltbTE0ICovCisjZGVmaW5lIFJfSUE2NF9JTU0yMgkJMHgyMgkvKiBzeW1ib2wgKyBhZGRlbmQsIGFkZCBpbW0yMiAqLworI2RlZmluZSBSX0lBNjRfSU1NNjQJCTB4MjMJLyogc3ltYm9sICsgYWRkZW5kLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjMyTVNCCQkweDI0CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9ESVIzMkxTQgkJMHgyNQkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfRElSNjRNU0IJCTB4MjYJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RJUjY0TFNCCQkweDI3CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDIyCQkweDJhCS8qIEBncHJlbChzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRJCQkweDJiCS8qIEBncHJlbChzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMMzJNU0IJMHgyYwkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9HUFJFTDMyTFNCCTB4MmQJLyogQGdwcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfR1BSRUw2NE1TQgkweDJlCS8qIEBncHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0dQUkVMNjRMU0IJMHgyZgkvKiBAZ3ByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjIyCQkweDMyCS8qIEBsdG9mZihzeW0gKyBhZGQpLCBhZGQgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGNjRJCQkweDMzCS8qIEBsdG9mZihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X1BMVE9GRjIyCQkweDNhCS8qIEBwbHRvZmYoc3ltICsgYWRkKSwgYWRkIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9QTFRPRkY2NEkJMHgzYgkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIG1vdiBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRNU0IJMHgzZQkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfUExUT0ZGNjRMU0IJMHgzZgkvKiBAcGx0b2ZmKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjY0SQkJMHg0MwkvKiBAZnB0cihzeW0gKyBhZGQpLCBtb3YgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFIzMk1TQgkweDQ0CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE0IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRlBUUjMyTFNCCTB4NDUJLyogQGZwdHIoc3ltICsgYWRkKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9GUFRSNjRNU0IJMHg0NgkvKiBAZnB0cihzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0ZQVFI2NExTQgkweDQ3CS8qIEBmcHRyKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2MEIJCTB4NDgJLyogQHBjcmVsKHN5bSArIGFkZCksIGJybCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMUIJCTB4NDkJLyogQHBjcmVsKHN5bSArIGFkZCksIHB0YiwgY2FsbCAqLworI2RlZmluZSBSX0lBNjRfUENSRUwyMU0JCTB4NGEJLyogQHBjcmVsKHN5bSArIGFkZCksIGNoay5zICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIxRgkJMHg0YgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZmNoa2YgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMzJNU0IJMHg0YwkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTQgTVNCICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDMyTFNCCTB4NGQJLyogQHBjcmVsKHN5bSArIGFkZCksIGRhdGE0IExTQiAqLworI2RlZmluZSBSX0lBNjRfUENSRUw2NE1TQgkweDRlCS8qIEBwY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMNjRMU0IJMHg0ZgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSMjIJMHg1MgkvKiBAbHRvZmYoQGZwdHIocythKSksIGltbTIyICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRJCTB4NTMJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjMyTVNCCTB4NTQJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0ZQVFIzMkxTQgkweDU1CS8qIEBsdG9mZihAZnB0cihzK2EpKSwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9GUFRSNjRNU0IJMHg1NgkvKiBAbHRvZmYoQGZwdHIocythKSksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRlBUUjY0TFNCCTB4NTcJLyogQGx0b2ZmKEBmcHRyKHMrYSkpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDMyTVNCCTB4NWMJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDMyTFNCCTB4NWQJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDY0TVNCCTB4NWUJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFR1JFTDY0TFNCCTB4NWYJLyogQHNlZ3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDMyTVNCCTB4NjQJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDMyTFNCCTB4NjUJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDY0TVNCCTB4NjYJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1NFQ1JFTDY0TFNCCTB4NjcJLyogQHNlY3JlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDMyTVNCCQkweDZjCS8qIGRhdGEgNCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfUkVMMzJMU0IJCTB4NmQJLyogZGF0YSA0ICsgUkVMICovCisjZGVmaW5lIFJfSUE2NF9SRUw2NE1TQgkJMHg2ZQkvKiBkYXRhIDggKyBSRUwgKi8KKyNkZWZpbmUgUl9JQTY0X1JFTDY0TFNCCQkweDZmCS8qIGRhdGEgOCArIFJFTCAqLworI2RlZmluZSBSX0lBNjRfTFRWMzJNU0IJCTB4NzQJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUVjMyTFNCCQkweDc1CS8qIHN5bWJvbCArIGFkZGVuZCwgZGF0YTQgTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVFY2NE1TQgkJMHg3NgkvKiBzeW1ib2wgKyBhZGRlbmQsIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfTFRWNjRMU0IJCTB4NzcJLyogc3ltYm9sICsgYWRkZW5kLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1BDUkVMMjFCSQkweDc5CS8qIEBwY3JlbChzeW0gKyBhZGQpLCAyMWJpdCBpbnN0ICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDIyCQkweDdhCS8qIEBwY3JlbChzeW0gKyBhZGQpLCAyMmJpdCBpbnN0ICovCisjZGVmaW5lIFJfSUE2NF9QQ1JFTDY0SQkJMHg3YgkvKiBAcGNyZWwoc3ltICsgYWRkKSwgNjRiaXQgaW5zdCAqLworI2RlZmluZSBSX0lBNjRfSVBMVE1TQgkJMHg4MAkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIE1TQiAqLworI2RlZmluZSBSX0lBNjRfSVBMVExTQgkJMHg4MQkvKiBkeW5hbWljIHJlbG9jLCBpbXBvcnRlZCBQTFQsIExTQiAqLworI2RlZmluZSBSX0lBNjRfQ09QWQkJMHg4NAkvKiBjb3B5IHJlbG9jYXRpb24gKi8KKyNkZWZpbmUgUl9JQTY0X1NVQgkJMHg4NQkvKiBBZGRlbmQgYW5kIHN5bWJvbCBkaWZmZXJlbmNlICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRjIyWAkJMHg4NgkvKiBMVE9GRjIyLCByZWxheGFibGUuICAqLworI2RlZmluZSBSX0lBNjRfTERYTU9WCQkweDg3CS8qIFVzZSBvZiBMVE9GRjIyWC4gICovCisjZGVmaW5lIFJfSUE2NF9UUFJFTDE0CQkweDkxCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW0xNCAqLworI2RlZmluZSBSX0lBNjRfVFBSRUwyMgkJMHg5MgkvKiBAdHByZWwoc3ltICsgYWRkKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRJCQkweDkzCS8qIEB0cHJlbChzeW0gKyBhZGQpLCBpbW02NCAqLworI2RlZmluZSBSX0lBNjRfVFBSRUw2NE1TQgkweDk2CS8qIEB0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X1RQUkVMNjRMU0IJMHg5NwkvKiBAdHByZWwoc3ltICsgYWRkKSwgZGF0YTggTFNCICovCisjZGVmaW5lIFJfSUE2NF9MVE9GRl9UUFJFTDIyCTB4OWEJLyogQGx0b2ZmKEB0cHJlbChzK2EpKSwgaW1tMiAqLworI2RlZmluZSBSX0lBNjRfRFRQTU9ENjRNU0IJMHhhNgkvKiBAZHRwbW9kKHN5bSArIGFkZCksIGRhdGE4IE1TQiAqLworI2RlZmluZSBSX0lBNjRfRFRQTU9ENjRMU0IJMHhhNwkvKiBAZHRwbW9kKHN5bSArIGFkZCksIGRhdGE4IExTQiAqLworI2RlZmluZSBSX0lBNjRfTFRPRkZfRFRQTU9EMjIJMHhhYQkvKiBAbHRvZmYoQGR0cG1vZChzeW0gKyBhZGQpKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDE0CQkweGIxCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tMTQgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDIyCQkweGIyCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tMjIgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0SQkweGIzCS8qIEBkdHByZWwoc3ltICsgYWRkKSwgaW1tNjQgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDMyTVNCCTB4YjQJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhNCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDMyTFNCCTB4YjUJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhNCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0TVNCCTB4YjYJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBNU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0RUUFJFTDY0TFNCCTB4YjcJLyogQGR0cHJlbChzeW0gKyBhZGQpLCBkYXRhOCBMU0IgKi8KKyNkZWZpbmUgUl9JQTY0X0xUT0ZGX0RUUFJFTDIyCTB4YmEJLyogQGx0b2ZmKEBkdHByZWwocythKSksIGltbTIyICovCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3JlbCB7CisgIEVsZjMyX0FkZHIJcl9vZmZzZXQ7CisgIEVsZjMyX1dvcmQJcl9pbmZvOworfSBFbGYzMl9SZWw7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3JlbCB7CisgIEVsZjY0X0FkZHIgcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KKyAgRWxmNjRfWHdvcmQgcl9pbmZvOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCit9IEVsZjY0X1JlbDsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfcmVsYXsKKyAgRWxmMzJfQWRkcglyX29mZnNldDsKKyAgRWxmMzJfV29yZAlyX2luZm87CisgIEVsZjMyX1N3b3JkCXJfYWRkZW5kOworfSBFbGYzMl9SZWxhOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9yZWxhIHsKKyAgRWxmNjRfQWRkciByX29mZnNldDsJLyogTG9jYXRpb24gYXQgd2hpY2ggdG8gYXBwbHkgdGhlIGFjdGlvbiAqLworICBFbGY2NF9Yd29yZCByX2luZm87CS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KKyAgRWxmNjRfU3h3b3JkIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCit9IEVsZjY0X1JlbGE7CisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX3N5bXsKKyAgRWxmMzJfV29yZAlzdF9uYW1lOworICBFbGYzMl9BZGRyCXN0X3ZhbHVlOworICBFbGYzMl9Xb3JkCXN0X3NpemU7CisgIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsKKyAgdW5zaWduZWQgY2hhcglzdF9vdGhlcjsKKyAgRWxmMzJfSGFsZglzdF9zaG5keDsKK30gRWxmMzJfU3ltOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9zeW0geworICBFbGY2NF9Xb3JkIHN0X25hbWU7CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLworICB1bnNpZ25lZCBjaGFyCXN0X2luZm87CS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLworICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkvKiBObyBkZWZpbmVkIG1lYW5pbmcsIDAgKi8KKyAgRWxmNjRfSGFsZiBzdF9zaG5keDsJCS8qIEFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLworICBFbGY2NF9BZGRyIHN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLworICBFbGY2NF9Yd29yZCBzdF9zaXplOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLworfSBFbGY2NF9TeW07CisKKworI2RlZmluZSBFSV9OSURFTlQJMTYKKworLyogU3BlY2lhbCB2YWx1ZSBmb3IgZV9waG51bS4gIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlYWwgbnVtYmVyIG9mCisgICBwcm9ncmFtIGhlYWRlcnMgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIGVfcGhudW0uICBJbnN0ZWFkIHRoZSByZWFsCisgICB2YWx1ZSBpcyBpbiB0aGUgZmllbGQgc2hfaW5mbyBvZiBzZWN0aW9uIDAuICAqLworI2RlZmluZSBQTl9YTlVNICAgICAgICAgMHhmZmZmCisKK3R5cGVkZWYgc3RydWN0IGVsZjMyX2hkcnsKKyAgdW5zaWduZWQgY2hhcgllX2lkZW50W0VJX05JREVOVF07CisgIEVsZjMyX0hhbGYJZV90eXBlOworICBFbGYzMl9IYWxmCWVfbWFjaGluZTsKKyAgRWxmMzJfV29yZAllX3ZlcnNpb247CisgIEVsZjMyX0FkZHIJZV9lbnRyeTsgIC8qIEVudHJ5IHBvaW50ICovCisgIEVsZjMyX09mZgllX3Bob2ZmOworICBFbGYzMl9PZmYJZV9zaG9mZjsKKyAgRWxmMzJfV29yZAllX2ZsYWdzOworICBFbGYzMl9IYWxmCWVfZWhzaXplOworICBFbGYzMl9IYWxmCWVfcGhlbnRzaXplOworICBFbGYzMl9IYWxmCWVfcGhudW07CisgIEVsZjMyX0hhbGYJZV9zaGVudHNpemU7CisgIEVsZjMyX0hhbGYJZV9zaG51bTsKKyAgRWxmMzJfSGFsZgllX3Noc3RybmR4OworfSBFbGYzMl9FaGRyOworCit0eXBlZGVmIHN0cnVjdCBlbGY2NF9oZHIgeworICB1bnNpZ25lZCBjaGFyCWVfaWRlbnRbMTZdOwkJLyogRUxGICJtYWdpYyBudW1iZXIiICovCisgIEVsZjY0X0hhbGYgZV90eXBlOworICBFbGY2NF9IYWxmIGVfbWFjaGluZTsKKyAgRWxmNjRfV29yZCBlX3ZlcnNpb247CisgIEVsZjY0X0FkZHIgZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLworICBFbGY2NF9PZmYgZV9waG9mZjsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X09mZiBlX3Nob2ZmOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfV29yZCBlX2ZsYWdzOworICBFbGY2NF9IYWxmIGVfZWhzaXplOworICBFbGY2NF9IYWxmIGVfcGhlbnRzaXplOworICBFbGY2NF9IYWxmIGVfcGhudW07CisgIEVsZjY0X0hhbGYgZV9zaGVudHNpemU7CisgIEVsZjY0X0hhbGYgZV9zaG51bTsKKyAgRWxmNjRfSGFsZiBlX3Noc3RybmR4OworfSBFbGY2NF9FaGRyOworCisvKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBwZXJtaXNzaW9ucyBvbiBzZWN0aW9ucyBpbiB0aGUgcHJvZ3JhbQorICAgaGVhZGVyLCBwX2ZsYWdzLiAqLworI2RlZmluZSBQRl9SCQkweDQKKyNkZWZpbmUgUEZfVwkJMHgyCisjZGVmaW5lIFBGX1gJCTB4MQorCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9waGRyeworICBFbGYzMl9Xb3JkCXBfdHlwZTsKKyAgRWxmMzJfT2ZmCXBfb2Zmc2V0OworICBFbGYzMl9BZGRyCXBfdmFkZHI7CisgIEVsZjMyX0FkZHIJcF9wYWRkcjsKKyAgRWxmMzJfV29yZAlwX2ZpbGVzejsKKyAgRWxmMzJfV29yZAlwX21lbXN6OworICBFbGYzMl9Xb3JkCXBfZmxhZ3M7CisgIEVsZjMyX1dvcmQJcF9hbGlnbjsKK30gRWxmMzJfUGhkcjsKKwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfcGhkciB7CisgIEVsZjY0X1dvcmQgcF90eXBlOworICBFbGY2NF9Xb3JkIHBfZmxhZ3M7CisgIEVsZjY0X09mZiBwX29mZnNldDsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KKyAgRWxmNjRfQWRkciBwX3ZhZGRyOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgRWxmNjRfQWRkciBwX3BhZGRyOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgIEVsZjY0X1h3b3JkIHBfZmlsZXN6OwkJLyogU2VnbWVudCBzaXplIGluIGZpbGUgKi8KKyAgRWxmNjRfWHdvcmQgcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KKyAgRWxmNjRfWHdvcmQgcF9hbGlnbjsJCS8qIFNlZ21lbnQgYWxpZ25tZW50LCBmaWxlICYgbWVtb3J5ICovCit9IEVsZjY0X1BoZHI7CisKKy8qIHNoX3R5cGUgKi8KKyNkZWZpbmUgU0hUX05VTEwJMAorI2RlZmluZSBTSFRfUFJPR0JJVFMJMQorI2RlZmluZSBTSFRfU1lNVEFCCTIKKyNkZWZpbmUgU0hUX1NUUlRBQgkzCisjZGVmaW5lIFNIVF9SRUxBCTQKKyNkZWZpbmUgU0hUX0hBU0gJNQorI2RlZmluZSBTSFRfRFlOQU1JQwk2CisjZGVmaW5lIFNIVF9OT1RFCTcKKyNkZWZpbmUgU0hUX05PQklUUwk4CisjZGVmaW5lIFNIVF9SRUwJCTkKKyNkZWZpbmUgU0hUX1NITElCCTEwCisjZGVmaW5lIFNIVF9EWU5TWU0JMTEKKyNkZWZpbmUgU0hUX05VTQkJMTIKKyNkZWZpbmUgU0hUX0xPUFJPQwkweDcwMDAwMDAwCisjZGVmaW5lIFNIVF9ISVBST0MJMHg3ZmZmZmZmZgorI2RlZmluZSBTSFRfTE9VU0VSCTB4ODAwMDAwMDAKKyNkZWZpbmUgU0hUX0hJVVNFUgkweGZmZmZmZmZmCisjZGVmaW5lIFNIVF9NSVBTX0xJU1QJCTB4NzAwMDAwMDAKKyNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgorI2RlZmluZSBTSFRfTUlQU19HUFRBQgkJMHg3MDAwMDAwMworI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAorCisvKiBzaF9mbGFncyAqLworI2RlZmluZSBTSEZfV1JJVEUJMHgxCisjZGVmaW5lIFNIRl9BTExPQwkweDIKKyNkZWZpbmUgU0hGX0VYRUNJTlNUUgkweDQKKyNkZWZpbmUgU0hGX01BU0tQUk9DCTB4ZjAwMDAwMDAKKyNkZWZpbmUgU0hGX01JUFNfR1BSRUwJMHgxMDAwMDAwMAorCisvKiBzcGVjaWFsIHNlY3Rpb24gaW5kZXhlcyAqLworI2RlZmluZSBTSE5fVU5ERUYJMAorI2RlZmluZSBTSE5fTE9SRVNFUlZFCTB4ZmYwMAorI2RlZmluZSBTSE5fTE9QUk9DCTB4ZmYwMAorI2RlZmluZSBTSE5fSElQUk9DCTB4ZmYxZgorI2RlZmluZSBTSE5fQUJTCQkweGZmZjEKKyNkZWZpbmUgU0hOX0NPTU1PTgkweGZmZjIKKyNkZWZpbmUgU0hOX0hJUkVTRVJWRQkweGZmZmYKKyNkZWZpbmUgU0hOX01JUFNfQUNDT01PTgkweGZmMDAKKwordHlwZWRlZiBzdHJ1Y3QgZWxmMzJfc2hkciB7CisgIEVsZjMyX1dvcmQJc2hfbmFtZTsKKyAgRWxmMzJfV29yZAlzaF90eXBlOworICBFbGYzMl9Xb3JkCXNoX2ZsYWdzOworICBFbGYzMl9BZGRyCXNoX2FkZHI7CisgIEVsZjMyX09mZglzaF9vZmZzZXQ7CisgIEVsZjMyX1dvcmQJc2hfc2l6ZTsKKyAgRWxmMzJfV29yZAlzaF9saW5rOworICBFbGYzMl9Xb3JkCXNoX2luZm87CisgIEVsZjMyX1dvcmQJc2hfYWRkcmFsaWduOworICBFbGYzMl9Xb3JkCXNoX2VudHNpemU7Cit9IEVsZjMyX1NoZHI7CisKK3R5cGVkZWYgc3RydWN0IGVsZjY0X3NoZHIgeworICBFbGY2NF9Xb3JkIHNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KKyAgRWxmNjRfV29yZCBzaF90eXBlOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCisgIEVsZjY0X1h3b3JkIHNoX2ZsYWdzOwkJLyogTWlzY2VsbGFuZW91cyBzZWN0aW9uIGF0dHJpYnV0ZXMgKi8KKyAgRWxmNjRfQWRkciBzaF9hZGRyOwkJLyogU2VjdGlvbiB2aXJ0dWFsIGFkZHIgYXQgZXhlY3V0aW9uICovCisgIEVsZjY0X09mZiBzaF9vZmZzZXQ7CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCisgIEVsZjY0X1h3b3JkIHNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KKyAgRWxmNjRfV29yZCBzaF9saW5rOwkJLyogSW5kZXggb2YgYW5vdGhlciBzZWN0aW9uICovCisgIEVsZjY0X1dvcmQgc2hfaW5mbzsJCS8qIEFkZGl0aW9uYWwgc2VjdGlvbiBpbmZvcm1hdGlvbiAqLworICBFbGY2NF9Yd29yZCBzaF9hZGRyYWxpZ247CS8qIFNlY3Rpb24gYWxpZ25tZW50ICovCisgIEVsZjY0X1h3b3JkIHNoX2VudHNpemU7CS8qIEVudHJ5IHNpemUgaWYgc2VjdGlvbiBob2xkcyB0YWJsZSAqLworfSBFbGY2NF9TaGRyOworCisjZGVmaW5lCUVJX01BRzAJCTAJCS8qIGVfaWRlbnRbXSBpbmRleGVzICovCisjZGVmaW5lCUVJX01BRzEJCTEKKyNkZWZpbmUJRUlfTUFHMgkJMgorI2RlZmluZQlFSV9NQUczCQkzCisjZGVmaW5lCUVJX0NMQVNTCTQKKyNkZWZpbmUJRUlfREFUQQkJNQorI2RlZmluZQlFSV9WRVJTSU9OCTYKKyNkZWZpbmUJRUlfT1NBQkkJNworI2RlZmluZQlFSV9QQUQJCTgKKworI2RlZmluZSBFTEZPU0FCSV9OT05FICAgICAgICAgICAwICAgICAgIC8qIFVOSVggU3lzdGVtIFYgQUJJICovCisjZGVmaW5lIEVMRk9TQUJJX1NZU1YgICAgICAgICAgIDAgICAgICAgLyogQWxpYXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9IUFVYICAgICAgICAgICAxICAgICAgIC8qIEhQLVVYICovCisjZGVmaW5lIEVMRk9TQUJJX05FVEJTRCAgICAgICAgIDIgICAgICAgLyogTmV0QlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfTElOVVggICAgICAgICAgMyAgICAgICAvKiBMaW51eC4gICovCisjZGVmaW5lIEVMRk9TQUJJX1NPTEFSSVMgICAgICAgIDYgICAgICAgLyogU3VuIFNvbGFyaXMuICAqLworI2RlZmluZSBFTEZPU0FCSV9BSVggICAgICAgICAgICA3ICAgICAgIC8qIElCTSBBSVguICAqLworI2RlZmluZSBFTEZPU0FCSV9JUklYICAgICAgICAgICA4ICAgICAgIC8qIFNHSSBJcml4LiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfRlJFRUJTRCAgICAgICAgOSAgICAgICAvKiBGcmVlQlNELiAgKi8KKyNkZWZpbmUgRUxGT1NBQklfVFJVNjQgICAgICAgICAgMTAgICAgICAvKiBDb21wYXEgVFJVNjQgVU5JWC4gICovCisjZGVmaW5lIEVMRk9TQUJJX01PREVTVE8gICAgICAgIDExICAgICAgLyogTm92ZWxsIE1vZGVzdG8uICAqLworI2RlZmluZSBFTEZPU0FCSV9PUEVOQlNEICAgICAgICAxMiAgICAgIC8qIE9wZW5CU0QuICAqLworI2RlZmluZSBFTEZPU0FCSV9BUk0gICAgICAgICAgICA5NyAgICAgIC8qIEFSTSAqLworI2RlZmluZSBFTEZPU0FCSV9TVEFOREFMT05FICAgICAyNTUgICAgIC8qIFN0YW5kYWxvbmUgKGVtYmVkZGVkKSBhcHBsaWNhdGlvbiAqLworCisjZGVmaW5lCUVMRk1BRzAJCTB4N2YJCS8qIEVJX01BRyAqLworI2RlZmluZQlFTEZNQUcxCQknRScKKyNkZWZpbmUJRUxGTUFHMgkJJ0wnCisjZGVmaW5lCUVMRk1BRzMJCSdGJworI2RlZmluZQlFTEZNQUcJCSJcMTc3RUxGIgorI2RlZmluZQlTRUxGTUFHCQk0CisKKyNkZWZpbmUJRUxGQ0xBU1NOT05FCTAJCS8qIEVJX0NMQVNTICovCisjZGVmaW5lCUVMRkNMQVNTMzIJMQorI2RlZmluZQlFTEZDTEFTUzY0CTIKKyNkZWZpbmUJRUxGQ0xBU1NOVU0JMworCisjZGVmaW5lIEVMRkRBVEFOT05FCTAJCS8qIGVfaWRlbnRbRUlfREFUQV0gKi8KKyNkZWZpbmUgRUxGREFUQTJMU0IJMQorI2RlZmluZSBFTEZEQVRBMk1TQgkyCisKKyNkZWZpbmUgRVZfTk9ORQkJMAkJLyogZV92ZXJzaW9uLCBFSV9WRVJTSU9OICovCisjZGVmaW5lIEVWX0NVUlJFTlQJMQorI2RlZmluZSBFVl9OVU0JCTIKKworLyogTm90ZXMgdXNlZCBpbiBFVF9DT1JFICovCisjZGVmaW5lIE5UX1BSU1RBVFVTCTEKKyNkZWZpbmUgTlRfRlBSRUdTRVQgICAgIDIKKyNkZWZpbmUgTlRfUFJGUFJFRwkyCisjZGVmaW5lIE5UX1BSUFNJTkZPCTMKKyNkZWZpbmUgTlRfVEFTS1NUUlVDVAk0CisjZGVmaW5lIE5UX0FVWFYJCTYKKyNkZWZpbmUgTlRfUFJYRlBSRUcgICAgIDB4NDZlNjJiN2YgICAgICAvKiBjb3BpZWQgZnJvbSBnZGI1LjEvaW5jbHVkZS9lbGYvY29tbW9uLmggKi8KKyNkZWZpbmUgTlRfUzM5MF9QUkVGSVggIDB4MzA1ICAgICAgICAgICAvKiBzMzkwIHByZWZpeCByZWdpc3RlciAqLworI2RlZmluZSBOVF9TMzkwX0NUUlMgICAgMHgzMDQgICAgICAgICAgIC8qIHMzOTAgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTlRfUzM5MF9UT0RQUkVHIDB4MzAzICAgICAgICAgICAvKiBzMzkwIFRPRCBwcm9ncmFtbWFibGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTlRfUzM5MF9UT0RDTVAgIDB4MzAyICAgICAgICAgICAvKiBzMzkwIFRPRCBjbG9jayBjb21wYXJhdG9yIHJlZ2lzdGVyICovCisjZGVmaW5lIE5UX1MzOTBfVElNRVIgICAweDMwMSAgICAgICAgICAgLyogczM5MCB0aW1lciByZWdpc3RlciAqLworI2RlZmluZSBOVF9QUENfVk1YICAgICAgIDB4MTAwICAgICAgICAgIC8qIFBvd2VyUEMgQWx0aXZlYy9WTVggcmVnaXN0ZXJzICovCisjZGVmaW5lIE5UX1BQQ19TUEUgICAgICAgMHgxMDEgICAgICAgICAgLyogUG93ZXJQQyBTUEUvRVZSIHJlZ2lzdGVycyAqLworI2RlZmluZSBOVF9QUENfVlNYICAgICAgIDB4MTAyICAgICAgICAgIC8qIFBvd2VyUEMgVlNYIHJlZ2lzdGVycyAqLworCisKKy8qIEF1eGlsaWFyeSB2ZWN0b3IuICAqLworCisvKiBUaGlzIHZlY3RvciBpcyBub3JtYWxseSBvbmx5IHVzZWQgYnkgdGhlIHByb2dyYW0gaW50ZXJwcmV0ZXIuICBUaGUKKyAgIHVzdWFsIGRlZmluaXRpb24gaW4gYW4gQUJJIHN1cHBsZW1lbnQgdXNlcyB0aGUgbmFtZSBhdXh2X3QuICBUaGUKKyAgIHZlY3RvciBpcyBub3QgdXN1YWxseSBkZWZpbmVkIGluIGEgc3RhbmRhcmQgPGVsZi5oPiBmaWxlLCBidXQgaXQKKyAgIGNhbid0IGh1cnQuICBXZSByZW5hbWUgaXQgdG8gYXZvaWQgY29uZmxpY3RzLiAgVGhlIHNpemVzIG9mIHRoZXNlCisgICB0eXBlcyBhcmUgYW4gYXJyYW5nZW1lbnQgYmV0d2VlbiB0aGUgZXhlYyBzZXJ2ZXIgYW5kIHRoZSBwcm9ncmFtCisgICBpbnRlcnByZXRlciwgc28gd2UgZG9uJ3QgZnVsbHkgc3BlY2lmeSB0aGVtIGhlcmUuICAqLworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBhX3R5cGU7ICAgICAgLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQzMl90IGFfdmFsOyAgICAgICAvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICAvKiBXZSB1c2UgdG8gaGF2ZSBwb2ludGVyIGVsZW1lbnRzIGFkZGVkIGhlcmUuICBXZSBjYW5ub3QgZG8gdGhhdCwKKyAgICAgdGhvdWdoLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gdXNpbmcgMzItYml0IGRlZmluaXRpb25zCisgICAgIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EuICAqLworICAgIH0gYV91bjsKK30gRWxmMzJfYXV4dl90OworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50NjRfdCBhX3R5cGU7ICAgICAgLyogRW50cnkgdHlwZSAqLworICB1bmlvbgorICAgIHsKKyAgICAgIHVpbnQ2NF90IGFfdmFsOyAgICAgICAvKiBJbnRlZ2VyIHZhbHVlICovCisgICAgICAvKiBXZSB1c2UgdG8gaGF2ZSBwb2ludGVyIGVsZW1lbnRzIGFkZGVkIGhlcmUuICBXZSBjYW5ub3QgZG8gdGhhdCwKKyAgICAgdGhvdWdoLCBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIHdoZW4gdXNpbmcgMzItYml0IGRlZmluaXRpb25zCisgICAgIG9uIDY0LWJpdCBwbGF0Zm9ybXMgYW5kIHZpY2UgdmVyc2EuICAqLworICAgIH0gYV91bjsKK30gRWxmNjRfYXV4dl90OworCisKKy8qIE5vdGUgaGVhZGVyIGluIGEgUFRfTk9URSBzZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBlbGYzMl9ub3RlIHsKKyAgRWxmMzJfV29yZAluX25hbWVzejsJLyogTmFtZSBzaXplICovCisgIEVsZjMyX1dvcmQJbl9kZXNjc3o7CS8qIENvbnRlbnQgc2l6ZSAqLworICBFbGYzMl9Xb3JkCW5fdHlwZTsJCS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGYzMl9OaGRyOworCisvKiBOb3RlIGhlYWRlciBpbiBhIFBUX05PVEUgc2VjdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgZWxmNjRfbm90ZSB7CisgIEVsZjY0X1dvcmQgbl9uYW1lc3o7CS8qIE5hbWUgc2l6ZSAqLworICBFbGY2NF9Xb3JkIG5fZGVzY3N6OwkvKiBDb250ZW50IHNpemUgKi8KKyAgRWxmNjRfV29yZCBuX3R5cGU7CS8qIENvbnRlbnQgdHlwZSAqLworfSBFbGY2NF9OaGRyOworCisKKy8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIFBUX0xPQUQgc2VnbWVudC4gICovCitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyB7CisgIC8qIENvcmUgYWRkcmVzcyB0byB3aGljaCB0aGUgc2VnbWVudCBpcyBtYXBwZWQuICAqLworICBFbGYzMl9BZGRyIGFkZHI7CisgIC8qIFZNQSByZWNvcmRlZCBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIuICAqLworICBFbGYzMl9BZGRyIHBfdmFkZHI7CisgIC8qIFNpemUgb2YgdGhpcyBzZWdtZW50IGluIG1lbW9yeS4gICovCisgIEVsZjMyX1dvcmQgcF9tZW1zejsKK307CitzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCB7CisgIC8qIFByb3RvY29sIHZlcnNpb24gbnVtYmVyLCBtdXN0IGJlIHplcm8uICAqLworICBFbGYzMl9IYWxmIHZlcnNpb247CisgIC8qIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGlzIG1hcC4gICovCisgIEVsZjMyX0hhbGYgbnNlZ3M7CisgIC8qIFRoZSBhY3R1YWwgbWVtb3J5IG1hcC4gICovCisgIHN0cnVjdCBlbGYzMl9mZHBpY19sb2Fkc2VnIHNlZ3NbLypuc2VncyovXTsKK307CisKKyNpZmRlZiBFTEZfQ0xBU1MKKyNpZiBFTEZfQ0xBU1MgPT0gRUxGQ0xBU1MzMgorCisjZGVmaW5lIGVsZmhkcgkJZWxmMzJfaGRyCisjZGVmaW5lIGVsZl9waGRyCWVsZjMyX3BoZHIKKyNkZWZpbmUgZWxmX25vdGUJZWxmMzJfbm90ZQorI2RlZmluZSBlbGZfc2hkcgllbGYzMl9zaGRyCisjZGVmaW5lIGVsZl9zeW0JCWVsZjMyX3N5bQorI2RlZmluZSBlbGZfYWRkcl90CUVsZjMyX09mZgorCisjaWZkZWYgRUxGX1VTRVNfUkVMT0NBCisjIGRlZmluZSBFTEZfUkVMT0MgICAgICBFbGYzMl9SZWxhCisjZWxzZQorIyBkZWZpbmUgRUxGX1JFTE9DICAgICAgRWxmMzJfUmVsCisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBlbGZoZHIJCWVsZjY0X2hkcgorI2RlZmluZSBlbGZfcGhkcgllbGY2NF9waGRyCisjZGVmaW5lIGVsZl9ub3RlCWVsZjY0X25vdGUKKyNkZWZpbmUgZWxmX3NoZHIJZWxmNjRfc2hkcgorI2RlZmluZSBlbGZfc3ltCQllbGY2NF9zeW0KKyNkZWZpbmUgZWxmX2FkZHJfdAlFbGY2NF9PZmYKKworI2lmZGVmIEVMRl9VU0VTX1JFTE9DQQorIyBkZWZpbmUgRUxGX1JFTE9DICAgICAgRWxmNjRfUmVsYQorI2Vsc2UKKyMgZGVmaW5lIEVMRl9SRUxPQyAgICAgIEVsZjY0X1JlbAorI2VuZGlmCisKKyNlbmRpZiAvKiBFTEZfQ0xBU1MgKi8KKworI2lmbmRlZiBFbGZXCisjIGlmIEVMRl9DTEFTUyA9PSBFTEZDTEFTUzMyCisjICBkZWZpbmUgRWxmVyh4KSAgRWxmMzJfICMjIHgKKyMgIGRlZmluZSBFTEZXKHgpICBFTEYzMl8gIyMgeAorIyBlbHNlCisjICBkZWZpbmUgRWxmVyh4KSAgRWxmNjRfICMjIHgKKyMgIGRlZmluZSBFTEZXKHgpICBFTEY2NF8gIyMgeAorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZiAvKiBFTEZfQ0xBU1MgKi8KKworCisjZW5kaWYgLyogX1FFTVVfRUxGX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NvZGUtcHJvZmlsZS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvY29kZS1wcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhZDJlNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NvZGUtcHJvZmlsZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpZm5kZWYgX0NPREVfUFJPRklMRV9IXworI2RlZmluZSBfQ09ERV9QUk9GSUxFX0hfCisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2NwdS1kZWZzLmgiCisKKy8vIEZ1bmN0aW9uIHR5cGUgdXNlZCB0byByZWNvcmQgdGhlIGV4ZWN1dGlvbiBvZiBhIGdpdmVuCisvLyBUcmFuc2xhdGlvbkJsb2NrLiB8dGJfcGN8IGlzIHRoZSBfZ3Vlc3RfIGFkZHJlc3Mgb2YgdGhlCisvLyBjb3JyZXNwb25kaW5nIHRyYW5zbGF0ZWQgYmFzaWMgYmxvY2ssIGFuZCB8dGJfc2l6ZXwgaXMgaXRzCisvLyBzaXplIGluIGJ5dGVzLgordHlwZWRlZiB2b2lkICgqQ29kZVByb2ZpbGVSZWNvcmRGdW5jKSh0YXJnZXRfdWxvbmcgdGJfcGMsIHVpbnQzMl90IHRiX3NpemUpOworCisvLyBBIGZ1bmN0aW9uIGNhbGxiYWNrIHVzZWQgdG8gcmVjb3JkIHRoZSBleGVjdXRpb24gb2YgdHJhbnNsYXRlZAorLy8gYmxvY2ssIHVzZWQgdG8gaW1wbGVtZW50IGNvZGUgcHJvZmlsaW5nLiBJZiBub3QgTlVMTCwgdGhpcworLy8gZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHJ1bnRpbWUgZXZlcnl0aW1lIGEgbmV3IGJhc2ljIGJsb2NrCisvLyBpcyBleGVjdXRlZCB1bmRlciBub24tYWNjZWxlcmF0ZWQgZW11bGF0aW9uLgorZXh0ZXJuIENvZGVQcm9maWxlUmVjb3JkRnVuYyBjb2RlX3Byb2ZpbGVfcmVjb3JkX2Z1bmM7CisKKy8vIEEgc3RyaW5nIHRvIGluZGljYXRlIHdoZXJlIHByb2ZpbGUgd2lsbCBiZSBzdG9yZWQuIFByb2ZpbGluZyB3aWxsCisvLyBiZSB0dXJuZWQgb2ZmIGlmIGl0cyB2YWx1ZSBpcyBOVUxMLgorZXh0ZXJuIGNvbnN0IGNoYXIgKmNvZGVfcHJvZmlsZV9kaXJuYW1lOworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9jcHUtYWxsLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9jcHUtYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwODNhOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NwdS1hbGwuaApAQCAtMCwwICsxLDU0NSBAQAorLyoKKyAqIGRlZmluZXMgY29tbW9uIHRvIGFsbCB2aXJ0dWFsIENQVXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBDUFVfQUxMX0gKKyNkZWZpbmUgQ1BVX0FMTF9ICisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxZW11L3RocmVhZC5oIgorI2luY2x1ZGUgInFlbXUvdGxzLmgiCisjaW5jbHVkZSAiZXhlYy9jcHUtY29tbW9uLmgiCisKKy8qIHNvbWUgaW1wb3J0YW50IGRlZmluZXM6CisgKgorICogV09SRFNfQUxJR05FRCA6IGlmIGRlZmluZWQsIHRoZSBob3N0IGNwdSBjYW4gb25seSBtYWtlIHdvcmQgYWxpZ25lZAorICogbWVtb3J5IGFjY2Vzc2VzLgorICoKKyAqIEhPU1RfV09SRFNfQklHRU5ESUFOIDogaWYgZGVmaW5lZCwgdGhlIGhvc3QgY3B1IGlzIGJpZyBlbmRpYW4gYW5kCisgKiBvdGhlcndpc2UgbGl0dGxlIGVuZGlhbi4KKyAqCisgKiAoVEFSR0VUX1dPUkRTX0FMSUdORUQgOiBzYW1lIGZvciB0YXJnZXQgY3B1IChub3Qgc3VwcG9ydGVkIHlldCkpCisgKgorICogVEFSR0VUX1dPUkRTX0JJR0VORElBTiA6IHNhbWUgZm9yIHRhcmdldCBjcHUKKyAqLworCisjaWYgZGVmaW5lZChIT1NUX1dPUkRTX0JJR0VORElBTikgIT0gZGVmaW5lZChUQVJHRVRfV09SRFNfQklHRU5ESUFOKQorI2RlZmluZSBCU1dBUF9ORUVERUQKKyNlbmRpZgorCisjaWZkZWYgQlNXQVBfTkVFREVECisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgdHN3YXAxNih1aW50MTZfdCBzKQoreworICAgIHJldHVybiBic3dhcDE2KHMpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHRzd2FwMzIodWludDMyX3QgcykKK3sKKyAgICByZXR1cm4gYnN3YXAzMihzKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCB0c3dhcDY0KHVpbnQ2NF90IHMpCit7CisgICAgcmV0dXJuIGJzd2FwNjQocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0c3dhcDE2cyh1aW50MTZfdCAqcykKK3sKKyAgICAqcyA9IGJzd2FwMTYoKnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHN3YXAzMnModWludDMyX3QgKnMpCit7CisgICAgKnMgPSBic3dhcDMyKCpzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRzd2FwNjRzKHVpbnQ2NF90ICpzKQoreworICAgICpzID0gYnN3YXA2NCgqcyk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgdHN3YXAxNih1aW50MTZfdCBzKQoreworICAgIHJldHVybiBzOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHRzd2FwMzIodWludDMyX3QgcykKK3sKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCB0c3dhcDY0KHVpbnQ2NF90IHMpCit7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0c3dhcDE2cyh1aW50MTZfdCAqcykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRzd2FwMzJzKHVpbnQzMl90ICpzKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHN3YXA2NHModWludDY0X3QgKnMpCit7Cit9CisKKyNlbmRpZgorCisjaWYgVEFSR0VUX0xPTkdfU0laRSA9PSA0CisjZGVmaW5lIHRzd2FwbChzKSB0c3dhcDMyKHMpCisjZGVmaW5lIHRzd2FwbHMocykgdHN3YXAzMnMoKHVpbnQzMl90ICopKHMpKQorI2RlZmluZSBic3dhcHRscyhzKSBic3dhcDMycyhzKQorI2Vsc2UKKyNkZWZpbmUgdHN3YXBsKHMpIHRzd2FwNjQocykKKyNkZWZpbmUgdHN3YXBscyhzKSB0c3dhcDY0cygodWludDY0X3QgKikocykpCisjZGVmaW5lIGJzd2FwdGxzKHMpIGJzd2FwNjRzKHMpCisjZW5kaWYKKworLyogQ1BVIG1lbW9yeSBhY2Nlc3Mgd2l0aG91dCBhbnkgbWVtb3J5IG9yIGlvIHJlbWFwcGluZyAqLworCisvKgorICogdGhlIGdlbmVyaWMgc3ludGF4IGZvciB0aGUgbWVtb3J5IGFjY2Vzc2VzIGlzOgorICoKKyAqIGxvYWQ6IGxke3R5cGV9e3NpZ259e3NpemV9e2VuZGlhbn1fe2FjY2Vzc190eXBlfShwdHIpCisgKgorICogc3RvcmU6IHN0e3R5cGV9e3NpemV9e2VuZGlhbn1fe2FjY2Vzc190eXBlfShwdHIsIHZhbCkKKyAqCisgKiB0eXBlIGlzOgorICogKGVtcHR5KTogaW50ZWdlciBhY2Nlc3MKKyAqICAgZiAgICA6IGZsb2F0IGFjY2VzcworICoKKyAqIHNpZ24gaXM6CisgKiAoZW1wdHkpOiBmb3IgZmxvYXRzIG9yIDMyIGJpdCBzaXplCisgKiAgIHUgICAgOiB1bnNpZ25lZAorICogICBzICAgIDogc2lnbmVkCisgKgorICogc2l6ZSBpczoKKyAqICAgYjogOCBiaXRzCisgKiAgIHc6IDE2IGJpdHMKKyAqICAgbDogMzIgYml0cworICogICBxOiA2NCBiaXRzCisgKgorICogZW5kaWFuIGlzOgorICogKGVtcHR5KTogdGFyZ2V0IGNwdSBlbmRpYW5uZXNzIG9yIDggYml0IGFjY2VzcworICogICByICAgIDogcmV2ZXJzZWQgdGFyZ2V0IGNwdSBlbmRpYW5uZXNzIChub3QgaW1wbGVtZW50ZWQgeWV0KQorICogICBiZSAgIDogYmlnIGVuZGlhbiAobm90IGltcGxlbWVudGVkIHlldCkKKyAqICAgbGUgICA6IGxpdHRsZSBlbmRpYW4gKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCisgKgorICogYWNjZXNzX3R5cGUgaXM6CisgKiAgIHJhdyAgICA6IGhvc3QgbWVtb3J5IGFjY2VzcworICogICB1c2VyICAgOiB1c2VyIG1vZGUgYWNjZXNzIHVzaW5nIHNvZnQgTU1VCisgKiAgIGtlcm5lbCA6IGtlcm5lbCBtb2RlIGFjY2VzcyB1c2luZyBzb2Z0IE1NVQorICovCisKKy8qIHRhcmdldC1lbmRpYW5uZXNzIENQVSBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyAqLworI2lmIGRlZmluZWQoVEFSR0VUX1dPUkRTX0JJR0VORElBTikKKyNkZWZpbmUgbGR1d19wKHApIGxkdXdfYmVfcChwKQorI2RlZmluZSBsZHN3X3AocCkgbGRzd19iZV9wKHApCisjZGVmaW5lIGxkbF9wKHApIGxkbF9iZV9wKHApCisjZGVmaW5lIGxkcV9wKHApIGxkcV9iZV9wKHApCisjZGVmaW5lIGxkZmxfcChwKSBsZGZsX2JlX3AocCkKKyNkZWZpbmUgbGRmcV9wKHApIGxkZnFfYmVfcChwKQorI2RlZmluZSBzdHdfcChwLCB2KSBzdHdfYmVfcChwLCB2KQorI2RlZmluZSBzdGxfcChwLCB2KSBzdGxfYmVfcChwLCB2KQorI2RlZmluZSBzdHFfcChwLCB2KSBzdHFfYmVfcChwLCB2KQorI2RlZmluZSBzdGZsX3AocCwgdikgc3RmbF9iZV9wKHAsIHYpCisjZGVmaW5lIHN0ZnFfcChwLCB2KSBzdGZxX2JlX3AocCwgdikKKyNlbHNlCisjZGVmaW5lIGxkdXdfcChwKSBsZHV3X2xlX3AocCkKKyNkZWZpbmUgbGRzd19wKHApIGxkc3dfbGVfcChwKQorI2RlZmluZSBsZGxfcChwKSBsZGxfbGVfcChwKQorI2RlZmluZSBsZHFfcChwKSBsZHFfbGVfcChwKQorI2RlZmluZSBsZGZsX3AocCkgbGRmbF9sZV9wKHApCisjZGVmaW5lIGxkZnFfcChwKSBsZGZxX2xlX3AocCkKKyNkZWZpbmUgc3R3X3AocCwgdikgc3R3X2xlX3AocCwgdikKKyNkZWZpbmUgc3RsX3AocCwgdikgc3RsX2xlX3AocCwgdikKKyNkZWZpbmUgc3RxX3AocCwgdikgc3RxX2xlX3AocCwgdikKKyNkZWZpbmUgc3RmbF9wKHAsIHYpIHN0ZmxfbGVfcChwLCB2KQorI2RlZmluZSBzdGZxX3AocCwgdikgc3RmcV9sZV9wKHAsIHYpCisjZW5kaWYKKworLyogTU1VIG1lbW9yeSBhY2Nlc3MgbWFjcm9zICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiZXhlYy91c2VyL2FiaXR5cGVzLmgiCisKKy8qIE9uIHNvbWUgaG9zdCBzeXN0ZW1zIHRoZSBndWVzdCBhZGRyZXNzIHNwYWNlIGlzIHJlc2VydmVkIG9uIHRoZSBob3N0LgorICogVGhpcyBhbGxvd3MgdGhlIGd1ZXN0IGFkZHJlc3Mgc3BhY2UgdG8gYmUgb2Zmc2V0IHRvIGEgY29udmVuaWVudCBsb2NhdGlvbi4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1VTRV9HVUVTVF9CQVNFKQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ3Vlc3RfYmFzZTsKK2V4dGVybiBpbnQgaGF2ZV9ndWVzdF9iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWRfdmE7CisjZGVmaW5lIEdVRVNUX0JBU0UgZ3Vlc3RfYmFzZQorI2RlZmluZSBSRVNFUlZFRF9WQSByZXNlcnZlZF92YQorI2Vsc2UKKyNkZWZpbmUgR1VFU1RfQkFTRSAwdWwKKyNkZWZpbmUgUkVTRVJWRURfVkEgMHVsCisjZW5kaWYKKworLyogQWxsIGRpcmVjdCB1c2VzIG9mIGcyaCBhbmQgaDJnIG5lZWQgdG8gZ28gYXdheSBmb3IgdXNlcm1vZGUgc29mdG1tdS4gICovCisjZGVmaW5lIGcyaCh4KSAoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHRhcmdldF91bG9uZykoeCkgKyBHVUVTVF9CQVNFKSkKKworI2lmIEhPU1RfTE9OR19CSVRTIDw9IFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUworI2RlZmluZSBoMmdfdmFsaWQoeCkgMQorI2Vsc2UKKyNkZWZpbmUgaDJnX3ZhbGlkKHgpICh7IFwKKyAgICB1bnNpZ25lZCBsb25nIF9fZ3Vlc3QgPSAodW5zaWduZWQgbG9uZykoeCkgLSBHVUVTVF9CQVNFOyBcCisgICAgKF9fZ3Vlc3QgPCAoMXVsIDw8IFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUykpICYmIFwKKyAgICAoIVJFU0VSVkVEX1ZBIHx8IChfX2d1ZXN0IDwgUkVTRVJWRURfVkEpKTsgXAorfSkKKyNlbmRpZgorCisjZGVmaW5lIGgyZ19ub2NoZWNrKHgpICh7IFwKKyAgICB1bnNpZ25lZCBsb25nIF9fcmV0ID0gKHVuc2lnbmVkIGxvbmcpKHgpIC0gR1VFU1RfQkFTRTsgXAorICAgIChhYmlfdWxvbmcpX19yZXQ7IFwKK30pCisKKyNkZWZpbmUgaDJnKHgpICh7IFwKKyAgICAvKiBDaGVjayBpZiBnaXZlbiBhZGRyZXNzIGZpdHMgdGFyZ2V0IGFkZHJlc3Mgc3BhY2UgKi8gXAorICAgIGFzc2VydChoMmdfdmFsaWQoeCkpOyBcCisgICAgaDJnX25vY2hlY2soeCk7IFwKK30pCisKKyNkZWZpbmUgc2FkZHIoeCkgZzJoKHgpCisjZGVmaW5lIGxhZGRyKHgpIGcyaCh4KQorCisjZWxzZSAvKiAhQ09ORklHX1VTRVJfT05MWSAqLworLyogTk9URTogd2UgdXNlIGRvdWJsZSBjYXN0cyBpZiBwb2ludGVycyBhbmQgdGFyZ2V0X3Vsb25nIGhhdmUKKyAgIGRpZmZlcmVudCBzaXplcyAqLworI2RlZmluZSBzYWRkcih4KSAodWludDhfdCAqKShpbnRwdHJfdCkoeCkKKyNkZWZpbmUgbGFkZHIoeCkgKHVpbnQ4X3QgKikoaW50cHRyX3QpKHgpCisjZW5kaWYKKworI2RlZmluZSBsZHViX3JhdyhwKSBsZHViX3AobGFkZHIoKHApKSkKKyNkZWZpbmUgbGRzYl9yYXcocCkgbGRzYl9wKGxhZGRyKChwKSkpCisjZGVmaW5lIGxkdXdfcmF3KHApIGxkdXdfcChsYWRkcigocCkpKQorI2RlZmluZSBsZHN3X3JhdyhwKSBsZHN3X3AobGFkZHIoKHApKSkKKyNkZWZpbmUgbGRsX3JhdyhwKSBsZGxfcChsYWRkcigocCkpKQorI2RlZmluZSBsZHFfcmF3KHApIGxkcV9wKGxhZGRyKChwKSkpCisjZGVmaW5lIGxkZmxfcmF3KHApIGxkZmxfcChsYWRkcigocCkpKQorI2RlZmluZSBsZGZxX3JhdyhwKSBsZGZxX3AobGFkZHIoKHApKSkKKyNkZWZpbmUgc3RiX3JhdyhwLCB2KSBzdGJfcChzYWRkcigocCkpLCB2KQorI2RlZmluZSBzdHdfcmF3KHAsIHYpIHN0d19wKHNhZGRyKChwKSksIHYpCisjZGVmaW5lIHN0bF9yYXcocCwgdikgc3RsX3Aoc2FkZHIoKHApKSwgdikKKyNkZWZpbmUgc3RxX3JhdyhwLCB2KSBzdHFfcChzYWRkcigocCkpLCB2KQorI2RlZmluZSBzdGZsX3JhdyhwLCB2KSBzdGZsX3Aoc2FkZHIoKHApKSwgdikKKyNkZWZpbmUgc3RmcV9yYXcocCwgdikgc3RmcV9wKHNhZGRyKChwKSksIHYpCisKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKworLyogaWYgdXNlciBtb2RlLCBubyBvdGhlciBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyAqLworI2RlZmluZSBsZHViKHApIGxkdWJfcmF3KHApCisjZGVmaW5lIGxkc2IocCkgbGRzYl9yYXcocCkKKyNkZWZpbmUgbGR1dyhwKSBsZHV3X3JhdyhwKQorI2RlZmluZSBsZHN3KHApIGxkc3dfcmF3KHApCisjZGVmaW5lIGxkbChwKSBsZGxfcmF3KHApCisjZGVmaW5lIGxkcShwKSBsZHFfcmF3KHApCisjZGVmaW5lIGxkZmwocCkgbGRmbF9yYXcocCkKKyNkZWZpbmUgbGRmcShwKSBsZGZxX3JhdyhwKQorI2RlZmluZSBzdGIocCwgdikgc3RiX3JhdyhwLCB2KQorI2RlZmluZSBzdHcocCwgdikgc3R3X3JhdyhwLCB2KQorI2RlZmluZSBzdGwocCwgdikgc3RsX3JhdyhwLCB2KQorI2RlZmluZSBzdHEocCwgdikgc3RxX3JhdyhwLCB2KQorI2RlZmluZSBzdGZsKHAsIHYpIHN0ZmxfcmF3KHAsIHYpCisjZGVmaW5lIHN0ZnEocCwgdikgc3RmcV9yYXcocCwgdikKKworI2RlZmluZSBjcHVfbGR1Yl9jb2RlKGVudjEsIHApIGxkdWJfcmF3KHApCisjZGVmaW5lIGNwdV9sZHNiX2NvZGUoZW52MSwgcCkgbGRzYl9yYXcocCkKKyNkZWZpbmUgY3B1X2xkdXdfY29kZShlbnYxLCBwKSBsZHV3X3JhdyhwKQorI2RlZmluZSBjcHVfbGRzd19jb2RlKGVudjEsIHApIGxkc3dfcmF3KHApCisjZGVmaW5lIGNwdV9sZGxfY29kZShlbnYxLCBwKSBsZGxfcmF3KHApCisjZGVmaW5lIGNwdV9sZHFfY29kZShlbnYxLCBwKSBsZHFfcmF3KHApCisKKyNkZWZpbmUgY3B1X2xkdWJfZGF0YShlbnYsIGFkZHIpIGxkdWJfcmF3KGFkZHIpCisjZGVmaW5lIGNwdV9sZHV3X2RhdGEoZW52LCBhZGRyKSBsZHV3X3JhdyhhZGRyKQorI2RlZmluZSBjcHVfbGRzd19kYXRhKGVudiwgYWRkcikgbGRzd19yYXcoYWRkcikKKyNkZWZpbmUgY3B1X2xkbF9kYXRhKGVudiwgYWRkcikgbGRsX3JhdyhhZGRyKQorI2RlZmluZSBjcHVfbGRxX2RhdGEoZW52LCBhZGRyKSBsZHFfcmF3KGFkZHIpCisKKyNkZWZpbmUgY3B1X3N0Yl9kYXRhKGVudiwgYWRkciwgZGF0YSkgc3RiX3JhdyhhZGRyLCBkYXRhKQorI2RlZmluZSBjcHVfc3R3X2RhdGEoZW52LCBhZGRyLCBkYXRhKSBzdHdfcmF3KGFkZHIsIGRhdGEpCisjZGVmaW5lIGNwdV9zdGxfZGF0YShlbnYsIGFkZHIsIGRhdGEpIHN0bF9yYXcoYWRkciwgZGF0YSkKKyNkZWZpbmUgY3B1X3N0cV9kYXRhKGVudiwgYWRkciwgZGF0YSkgc3RxX3JhdyhhZGRyLCBkYXRhKQorCisjZGVmaW5lIGNwdV9sZHViX2tlcm5lbChlbnYsIGFkZHIpIGxkdWJfcmF3KGFkZHIpCisjZGVmaW5lIGNwdV9sZHV3X2tlcm5lbChlbnYsIGFkZHIpIGxkdXdfcmF3KGFkZHIpCisjZGVmaW5lIGNwdV9sZHN3X2tlcm5lbChlbnYsIGFkZHIpIGxkc3dfcmF3KGFkZHIpCisjZGVmaW5lIGNwdV9sZGxfa2VybmVsKGVudiwgYWRkcikgbGRsX3JhdyhhZGRyKQorI2RlZmluZSBjcHVfbGRxX2tlcm5lbChlbnYsIGFkZHIpIGxkcV9yYXcoYWRkcikKKworI2RlZmluZSBjcHVfc3RiX2tlcm5lbChlbnYsIGFkZHIsIGRhdGEpIHN0Yl9yYXcoYWRkciwgZGF0YSkKKyNkZWZpbmUgY3B1X3N0d19rZXJuZWwoZW52LCBhZGRyLCBkYXRhKSBzdHdfcmF3KGFkZHIsIGRhdGEpCisjZGVmaW5lIGNwdV9zdGxfa2VybmVsKGVudiwgYWRkciwgZGF0YSkgc3RsX3JhdyhhZGRyLCBkYXRhKQorI2RlZmluZSBjcHVfc3RxX2tlcm5lbChlbnYsIGFkZHIsIGRhdGEpIHN0cV9yYXcoYWRkciwgZGF0YSkKKworI2RlZmluZSBsZHViX2tlcm5lbChwKSBsZHViX3JhdyhwKQorI2RlZmluZSBsZHNiX2tlcm5lbChwKSBsZHNiX3JhdyhwKQorI2RlZmluZSBsZHV3X2tlcm5lbChwKSBsZHV3X3JhdyhwKQorI2RlZmluZSBsZHN3X2tlcm5lbChwKSBsZHN3X3JhdyhwKQorI2RlZmluZSBsZGxfa2VybmVsKHApIGxkbF9yYXcocCkKKyNkZWZpbmUgbGRxX2tlcm5lbChwKSBsZHFfcmF3KHApCisjZGVmaW5lIGxkZmxfa2VybmVsKHApIGxkZmxfcmF3KHApCisjZGVmaW5lIGxkZnFfa2VybmVsKHApIGxkZnFfcmF3KHApCisjZGVmaW5lIHN0Yl9rZXJuZWwocCwgdikgc3RiX3JhdyhwLCB2KQorI2RlZmluZSBzdHdfa2VybmVsKHAsIHYpIHN0d19yYXcocCwgdikKKyNkZWZpbmUgc3RsX2tlcm5lbChwLCB2KSBzdGxfcmF3KHAsIHYpCisjZGVmaW5lIHN0cV9rZXJuZWwocCwgdikgc3RxX3JhdyhwLCB2KQorI2RlZmluZSBzdGZsX2tlcm5lbChwLCB2KSBzdGZsX3JhdyhwLCB2KQorI2RlZmluZSBzdGZxX2tlcm5lbChwLCB2dCkgc3RmcV9yYXcocCwgdikKKworI2RlZmluZSBjcHVfbGR1Yl9kYXRhKGVudiwgYWRkcikgbGR1Yl9yYXcoYWRkcikKKyNkZWZpbmUgY3B1X2xkdXdfZGF0YShlbnYsIGFkZHIpIGxkdXdfcmF3KGFkZHIpCisjZGVmaW5lIGNwdV9sZGxfZGF0YShlbnYsIGFkZHIpIGxkbF9yYXcoYWRkcikKKworI2RlZmluZSBjcHVfc3RiX2RhdGEoZW52LCBhZGRyLCBkYXRhKSBzdGJfcmF3KGFkZHIsIGRhdGEpCisjZGVmaW5lIGNwdV9zdHdfZGF0YShlbnYsIGFkZHIsIGRhdGEpIHN0d19yYXcoYWRkciwgZGF0YSkKKyNkZWZpbmUgY3B1X3N0bF9kYXRhKGVudiwgYWRkciwgZGF0YSkgc3RsX3JhdyhhZGRyLCBkYXRhKQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KKworLyogcGFnZSByZWxhdGVkIHN0dWZmICovCisKKyNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAoMSA8PCBUQVJHRVRfUEFHRV9CSVRTKQorI2RlZmluZSBUQVJHRVRfUEFHRV9NQVNLIH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpCisjZGVmaW5lIFRBUkdFVF9QQUdFX0FMSUdOKGFkZHIpICgoKGFkZHIpICsgVEFSR0VUX1BBR0VfU0laRSAtIDEpICYgVEFSR0VUX1BBR0VfTUFTSykKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisjZGVmaW5lIFRBUkdFVF9QVEVfTUFTSyAweDdmZmZmZmZmZmZmZlVMTAorI2VuZGlmCisKKy8qID8/PyBUaGVzZSBzaG91bGQgYmUgdGhlIGxhcmdlciBvZiB1aW50cHRyX3QgYW5kIHRhcmdldF91bG9uZy4gICovCitleHRlcm4gdWludHB0cl90IHFlbXVfcmVhbF9ob3N0X3BhZ2Vfc2l6ZTsKK2V4dGVybiB1aW50cHRyX3QgcWVtdV9ob3N0X3BhZ2Vfc2l6ZTsKK2V4dGVybiB1aW50cHRyX3QgcWVtdV9ob3N0X3BhZ2VfbWFzazsKKworI2RlZmluZSBIT1NUX1BBR0VfQUxJR04oYWRkcikgKCgoYWRkcikgKyBxZW11X2hvc3RfcGFnZV9zaXplIC0gMSkgJiBxZW11X2hvc3RfcGFnZV9tYXNrKQorCisvKiBzYW1lIGFzIFBST1RfeHh4ICovCisjZGVmaW5lIFBBR0VfUkVBRCAgICAgIDB4MDAwMQorI2RlZmluZSBQQUdFX1dSSVRFICAgICAweDAwMDIKKyNkZWZpbmUgUEFHRV9FWEVDICAgICAgMHgwMDA0CisjZGVmaW5lIFBBR0VfQklUUyAgICAgIChQQUdFX1JFQUQgfCBQQUdFX1dSSVRFIHwgUEFHRV9FWEVDKQorI2RlZmluZSBQQUdFX1ZBTElEICAgICAweDAwMDgKKy8qIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSB3cml0ZSBmbGFnICh1c2VkIHdoZW4gdHJhY2tpbmcgc2VsZi1tb2RpZnlpbmcKKyAgIGNvZGUgKi8KKyNkZWZpbmUgUEFHRV9XUklURV9PUkcgMHgwMDEwCisjaWYgZGVmaW5lZChDT05GSUdfQlNEKSAmJiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisvKiBGSVhNRTogQ29kZSB0aGF0IHNldHMvdXNlcyB0aGlzIGlzIGJyb2tlbiBhbmQgbmVlZHMgdG8gZ28gYXdheS4gICovCisjZGVmaW5lIFBBR0VfUkVTRVJWRUQgIDB4MDAyMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIHBhZ2VfZHVtcChGSUxFICpmKTsKKwordHlwZWRlZiBpbnQgKCp3YWxrX21lbW9yeV9yZWdpb25zX2ZuKSh2b2lkICosIGFiaV91bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpX3Vsb25nLCB1bnNpZ25lZCBsb25nKTsKK2ludCB3YWxrX21lbW9yeV9yZWdpb25zKHZvaWQgKiwgd2Fsa19tZW1vcnlfcmVnaW9uc19mbik7CisKK2ludCBwYWdlX2dldF9mbGFncyh0YXJnZXRfdWxvbmcgYWRkcmVzcyk7Cit2b2lkIHBhZ2Vfc2V0X2ZsYWdzKHRhcmdldF91bG9uZyBzdGFydCwgdGFyZ2V0X3Vsb25nIGVuZCwgaW50IGZsYWdzKTsKK2ludCBwYWdlX2NoZWNrX3JhbmdlKHRhcmdldF91bG9uZyBzdGFydCwgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IGZsYWdzKTsKKyNlbmRpZgorCisvKiBGbGFncyBmb3IgdXNlIGluIEVOVi0+SU5URVJSVVBUX1BFTkRJTkcuCisKKyAgIFRoZSBudW1iZXJzIGFzc2lnbmVkIGhlcmUgYXJlIG5vbi1zZXF1ZW50aWFsIGluIG9yZGVyIHRvIHByZXNlcnZlCisgICBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB2bXN0YXRlIGR1bXAuICBCaXQgMCAoMHgwMDAxKSB3YXMKKyAgIHByZXZpb3VzbHkgdXNlZCBmb3IgQ1BVX0lOVEVSUlVQVF9FWElULCBhbmQgaXMgY2xlYXJlZCB3aGVuIGxvYWRpbmcKKyAgIHRoZSB2bXN0YXRlIGR1bXAuICAqLworCisvKiBFeHRlcm5hbCBoYXJkd2FyZSBpbnRlcnJ1cHQgcGVuZGluZy4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yCisgICBpbnRlcnJ1cHRzIGZyb20gZGV2aWNlcy4gICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfSEFSRCAgICAgICAgMHgwMDAyCisKKy8qIEV4aXQgdGhlIGN1cnJlbnQgVEIuICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gc29tZSBzeXN0ZW0tbGV2ZWwgZGV2aWNlCisgICBtYWtlcyBzb21lIGNoYW5nZSB0byB0aGUgbWVtb3J5IG1hcHBpbmcuICBFLmcuIHRoZSBhMjAgbGluZSBjaGFuZ2UuICAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUX0VYSVRUQiAgICAgIDB4MDAwNAorCisvKiBIYWx0IHRoZSBDUFUuICAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUX0hBTFQgICAgICAgIDB4MDAyMAorCisvKiBEZWJ1ZyBldmVudCBwZW5kaW5nLiAgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9ERUJVRyAgICAgICAweDAwODAKKworLyogU2V2ZXJhbCB0YXJnZXQtc3BlY2lmaWMgZXh0ZXJuYWwgaGFyZHdhcmUgaW50ZXJydXB0cy4gIEVhY2ggdGFyZ2V0L2NwdS5oCisgICBzaG91bGQgZGVmaW5lIHByb3BlciBuYW1lcyBiYXNlZCBvbiB0aGVzZSBkZWZpbmVzLiAgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzAgICAweDAwMDgKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzEgICAweDAwMTAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzIgICAweDAwNDAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzMgICAweDAyMDAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzQgICAweDEwMDAKKworLyogU2V2ZXJhbCB0YXJnZXQtc3BlY2lmaWMgaW50ZXJuYWwgaW50ZXJydXB0cy4gIFRoZXNlIGRpZmZlciBmcm9tIHRoZQorICAgcHJlY2VkaW5nIHRhcmdldC1zcGVjaWZpYyBpbnRlcnJ1cHRzIGluIHRoYXQgdGhleSBhcmUgaW50ZW5kZWQgdG8KKyAgIG9yaWdpbmF0ZSBmcm9tIHdpdGhpbiB0aGUgY3B1IGl0c2VsZiwgdHlwaWNhbGx5IGluIHJlc3BvbnNlIHRvIHNvbWUKKyAgIGluc3RydWN0aW9uIGJlaW5nIGV4ZWN1dGVkLiAgVGhlc2UsIHRoZXJlZm9yZSwgYXJlIG5vdCBtYXNrZWQgd2hpbGUKKyAgIHNpbmdsZS1zdGVwcGluZyB3aXRoaW4gdGhlIGRlYnVnZ2VyLiAgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfSU5UXzAgICAweDAxMDAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfSU5UXzEgICAweDA0MDAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfSU5UXzIgICAweDA4MDAKKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9UR1RfSU5UXzMgICAweDIwMDAKKworLyogRmlyc3QgdW51c2VkIGJpdDogMHg0MDAwLiAgKi8KKworLyogVGhlIHNldCBvZiBhbGwgYml0cyB0aGF0IHNob3VsZCBiZSBtYXNrZWQgd2hlbiBzaW5nbGUtc3RlcHBpbmcuICAqLworI2RlZmluZSBDUFVfSU5URVJSVVBUX1NTVEVQX01BU0sgXAorICAgIChDUFVfSU5URVJSVVBUX0hBUkQgICAgICAgICAgXAorICAgICB8IENQVV9JTlRFUlJVUFRfVEdUX0VYVF8wICAgXAorICAgICB8IENQVV9JTlRFUlJVUFRfVEdUX0VYVF8xICAgXAorICAgICB8IENQVV9JTlRFUlJVUFRfVEdUX0VYVF8yICAgXAorICAgICB8IENQVV9JTlRFUlJVUFRfVEdUX0VYVF8zICAgXAorICAgICB8IENQVV9JTlRFUlJVUFRfVEdUX0VYVF80KQorCisvKiBCcmVha3BvaW50L3dhdGNocG9pbnQgZmxhZ3MgKi8KKyNkZWZpbmUgQlBfTUVNX1JFQUQgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQlBfTUVNX1dSSVRFICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQlBfTUVNX0FDQ0VTUyAgICAgICAgIChCUF9NRU1fUkVBRCB8IEJQX01FTV9XUklURSkKKyNkZWZpbmUgQlBfU1RPUF9CRUZPUkVfQUNDRVNTIDB4MDQKKyNkZWZpbmUgQlBfV0FUQ0hQT0lOVF9ISVQgICAgIDB4MDgKKyNkZWZpbmUgQlBfR0RCICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQlBfQ1BVICAgICAgICAgICAgICAgIDB4MjAKKworLy8gc2V2ZXJhbCBmdW5jdGlvbnMgYmVsb3cgZGVwZW5kIG9uIGNwdS5oCisvLyBjcHUuaCBkZXBlbmRzIG9uIENQVV9JTlRFUlJVUFRfKiBkZWZpbml0aW9ucyAoYWJvdmUpCisjaW5jbHVkZSAiY3B1LmgiCisKK2ludCBjcHVfYnJlYWtwb2ludF9pbnNlcnQoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwYywgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVCcmVha3BvaW50ICoqYnJlYWtwb2ludCk7CitpbnQgY3B1X2JyZWFrcG9pbnRfcmVtb3ZlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcGMsIGludCBmbGFncyk7Cit2b2lkIGNwdV9icmVha3BvaW50X3JlbW92ZV9ieV9yZWYoQ1BVQXJjaFN0YXRlICplbnYsIENQVUJyZWFrcG9pbnQgKmJyZWFrcG9pbnQpOwordm9pZCBjcHVfYnJlYWtwb2ludF9yZW1vdmVfYWxsKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgbWFzayk7CitpbnQgY3B1X3dhdGNocG9pbnRfaW5zZXJ0KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgdGFyZ2V0X3Vsb25nIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBDUFVXYXRjaHBvaW50ICoqd2F0Y2hwb2ludCk7CitpbnQgY3B1X3dhdGNocG9pbnRfcmVtb3ZlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IGZsYWdzKTsKK3ZvaWQgY3B1X3dhdGNocG9pbnRfcmVtb3ZlX2J5X3JlZihDUFVBcmNoU3RhdGUgKmVudiwgQ1BVV2F0Y2hwb2ludCAqd2F0Y2hwb2ludCk7Cit2b2lkIGNwdV93YXRjaHBvaW50X3JlbW92ZV9hbGwoQ1BVQXJjaFN0YXRlICplbnYsIGludCBtYXNrKTsKKworI2RlZmluZSBTU1RFUF9FTkFCTEUgIDB4MSAgLyogRW5hYmxlIHNpbXVsYXRlZCBIVyBzaW5nbGUgc3RlcHBpbmcgKi8KKyNkZWZpbmUgU1NURVBfTk9JUlEgICAweDIgIC8qIERvIG5vdCB1c2UgSVJRIHdoaWxlIHNpbmdsZSBzdGVwcGluZyAqLworI2RlZmluZSBTU1RFUF9OT1RJTUVSIDB4NCAgLyogRG8gbm90IFRpbWVycyB3aGlsZSBzaW5nbGUgc3RlcHBpbmcgKi8KKwordm9pZCBRRU1VX05PUkVUVVJOIGNwdV9hYm9ydChDUFVBcmNoU3RhdGUgKmVudiwgY29uc3QgY2hhciAqZm10LCAuLi4pCitHQ0NfRk1UX0FUVFIoMiwgMyk7CisKK3ZvaWQgY3B1X3NpbmdsZV9zdGVwKENQVVN0YXRlICpjcHUsIGludCBlbmFibGVkKTsKKworCisvKiBJTyBwb3J0cyBBUEkgKi8KKyNpbmNsdWRlICJleGVjL2lvcG9ydC5oIgorCisvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIHBhZ2UgY29ycmVzcG9uZGluZyB0byBhIHZpcnR1YWwgb25lLiBVc2UgaXQKKyAgIG9ubHkgZm9yIGRlYnVnZ2luZyBiZWNhdXNlIG5vIHByb3RlY3Rpb24gY2hlY2tzIGFyZSBkb25lLiBSZXR1cm4gLTEKKyAgIGlmIG5vIHBhZ2UgZm91bmQuICovCitod2FkZHIgY3B1X2dldF9waHlzX3BhZ2VfZGVidWcoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKTsKKworLyogbWVtb3J5IEFQSSAqLworCitleHRlcm4gaW50IHBoeXNfcmFtX2ZkOworZXh0ZXJuIHJhbV9hZGRyX3QgcmFtX3NpemU7CisKKy8qIFJBTSBpcyBwcmUtYWxsb2NhdGVkIGFuZCBwYXNzZWQgaW50byBxZW11X3JhbV9hbGxvY19mcm9tX3B0ciAqLworI2RlZmluZSBSQU1fUFJFQUxMT0NfTUFTSyAgICgxIDw8IDApCisKK3R5cGVkZWYgc3RydWN0IFJBTUJsb2NrIHsKKyAgICB1aW50OF90ICpob3N0OworICAgIHJhbV9hZGRyX3Qgb2Zmc2V0OworICAgIHJhbV9hZGRyX3QgbGVuZ3RoOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGNoYXIgaWRzdHJbMjU2XTsKKyAgICAvKiBSZWFkcyBjYW4gdGFrZSBlaXRoZXIgdGhlIGlvdGhyZWFkIG9yIHRoZSByYW1saXN0IGxvY2suCisgICAgICogV3JpdGVzIG11c3QgdGFrZSBib3RoIGxvY2tzLgorICAgICAqLworICAgIFFUQUlMUV9FTlRSWShSQU1CbG9jaykgbmV4dDsKKyAgICBpbnQgZmQ7Cit9IFJBTUJsb2NrOworCisjZGVmaW5lIERJUlRZX01FTU9SWV9WR0EgICAgICAgMAorI2RlZmluZSBESVJUWV9NRU1PUllfQ09ERSAgICAgIDEKKyNkZWZpbmUgRElSVFlfTUVNT1JZX01JR1JBVElPTiAyCisjZGVmaW5lIERJUlRZX01FTU9SWV9OVU0gICAgICAgMyAgICAgICAgLyogbnVtIG9mIGRpcnR5IGJpdHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUkFNTGlzdCB7CisgICAgUWVtdU11dGV4IG11dGV4OworICAgIHVuc2lnbmVkIGxvbmcgKmRpcnR5X21lbW9yeVtESVJUWV9NRU1PUllfTlVNXTsKKyAgICBSQU1CbG9jayAqbXJ1X2Jsb2NrOworICAgIFFUQUlMUV9IRUFEKHJhbSwgUkFNQmxvY2spIGJsb2NrczsKKyAgICB1aW50MzJfdCB2ZXJzaW9uOworfSBSQU1MaXN0OworZXh0ZXJuIFJBTUxpc3QgcmFtX2xpc3Q7CisKK2V4dGVybiBjb25zdCBjaGFyICptZW1fcGF0aDsKK2V4dGVybiBpbnQgbWVtX3ByZWFsbG9jOworCisvKiBwaHlzaWNhbCBtZW1vcnkgYWNjZXNzICovCisKKy8qIEZsYWdzIHN0b3JlZCBpbiB0aGUgbG93IGJpdHMgb2YgdGhlIFRMQiB2aXJ0dWFsIGFkZHJlc3MuICBUaGVzZSBhcmUKKyAgIGRlZmluZWQgc28gdGhhdCBmYXN0IHBhdGggcmFtIGFjY2VzcyBpcyBhbGwgemVyb3MuICAqLworLyogWmVybyBpZiBUTEIgZW50cnkgaXMgdmFsaWQuICAqLworI2RlZmluZSBUTEJfSU5WQUxJRF9NQVNLICAgKDEgPDwgMykKKy8qIFNldCBpZiBUTEIgZW50cnkgcmVmZXJlbmNlcyBhIGNsZWFuIFJBTSBwYWdlLiAgVGhlIGlvdGxiIGVudHJ5IHdpbGwKKyAgIGNvbnRhaW4gdGhlIHBhZ2UgcGh5c2ljYWwgYWRkcmVzcy4gICovCisjZGVmaW5lIFRMQl9OT1RESVJUWSAgICAoMSA8PCA0KQorLyogU2V0IGlmIFRMQiBlbnRyeSBpcyBhbiBJTyBjYWxsYmFjay4gICovCisjZGVmaW5lIFRMQl9NTUlPICAgICAgICAoMSA8PCA1KQorCisjZGVmaW5lIFZHQV9ESVJUWV9GTEFHICAgICAgIDB4MDEKKyNkZWZpbmUgQ09ERV9ESVJUWV9GTEFHICAgICAgMHgwMgorI2RlZmluZSBNSUdSQVRJT05fRElSVFlfRkxBRyAweDA4CisKK3ZvaWQgY3B1X3RsYl91cGRhdGVfZGlydHkoQ1BVQXJjaFN0YXRlICplbnYpOworCit2b2lkIGR1bXBfZXhlY19pbmZvKEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgIGludCAoKmNwdV9mcHJpbnRmKShGSUxFICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLikpOworCisvKiBDb2FsZXNjZWQgTU1JTyByZWdpb25zIGFyZSBhcmVhcyB3aGVyZSB3cml0ZSBvcGVyYXRpb25zIGNhbiBiZSByZW9yZGVyZWQuCisgKiBUaGlzIHVzdWFsbHkgaW1wbGllcyB0aGF0IHdyaXRlIG9wZXJhdGlvbnMgYXJlIHNpZGUtZWZmZWN0IGZyZWUuICBUaGlzIGFsbG93cworICogYmF0Y2hpbmcgd2hpY2ggY2FuIG1ha2UgYSBtYWpvciBpbXBhY3Qgb24gcGVyZm9ybWFuY2Ugd2hlbiB1c2luZworICogdmlydHVhbGl6YXRpb24uCisgKi8KK3ZvaWQgcWVtdV9yZWdpc3Rlcl9jb2FsZXNjZWRfbW1pbyhod2FkZHIgYWRkciwgcmFtX2FkZHJfdCBzaXplKTsKKwordm9pZCBxZW11X3VucmVnaXN0ZXJfY29hbGVzY2VkX21taW8oaHdhZGRyIGFkZHIsIHJhbV9hZGRyX3Qgc2l6ZSk7CisKK3ZvaWQgcWVtdV9mbHVzaF9jb2FsZXNjZWRfbW1pb19idWZmZXIodm9pZCk7CisKKy8qIHByb2ZpbGluZyAqLworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorc3RhdGljIGlubGluZSBpbnQ2NF90IHByb2ZpbGVfZ2V0Y2xvY2sodm9pZCkKK3sKKyAgICByZXR1cm4gY3B1X2dldF9yZWFsX3RpY2tzKCk7Cit9CisKK2V4dGVybiBpbnQ2NF90IHFlbXVfdGltZSwgcWVtdV90aW1lX3N0YXJ0OworZXh0ZXJuIGludDY0X3QgdGxiX2ZsdXNoX3RpbWU7CitleHRlcm4gaW50NjRfdCBkZXZfdGltZTsKKyNlbmRpZgorCitpbnQgY3B1X21lbW9yeV9yd19kZWJ1ZyhDUFVTdGF0ZSAqY3B1LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGlzX3dyaXRlKTsKKwordm9pZCBjcHVfaW5qZWN0X3g4Nl9tY2UoQ1BVQXJjaFN0YXRlICpjZW52LCBpbnQgYmFuaywgdWludDY0X3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgbWNnX3N0YXR1cywgdWludDY0X3QgYWRkciwgdWludDY0X3QgbWlzYyk7CisKKyNlbmRpZiAvKiBDUFVfQUxMX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NwdS1jb21tb24uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NwdS1jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY0MTUzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvY3B1LWNvbW1vbi5oCkBAIC0wLDAgKzEsMTUyIEBACisjaWZuZGVmIENQVV9DT01NT05fSAorI2RlZmluZSBDUFVfQ09NTU9OX0ggMQorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKworLyogQ1BVIGludGVyZmFjZXMgdGhhdCBhcmUgdGFyZ2V0IGluZGVwZW5kZW50LiAgKi8KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisjaW5jbHVkZSAiZXhlYy9od2FkZHIuaCIKKyNlbmRpZgorCisjaWZuZGVmIE5FRURfQ1BVX0gKKyNpbmNsdWRlICJleGVjL3BvaXNvbi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJxZW11L2Jzd2FwLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorCisvKioKKyAqIENQVUxpc3RTdGF0ZToKKyAqIEBjcHVfZnByaW50ZjogUHJpbnQgZnVuY3Rpb24uCisgKiBAZmlsZTogRmlsZSB0byBwcmludCB0byB1c2luZyBAY3B1X2ZwcmludC4KKyAqCisgKiBTdGF0ZSBjb21tb25seSB1c2VkIGZvciBpdGVyYXRpbmcgb3ZlciBDUFUgbW9kZWxzLgorICovCit0eXBlZGVmIHN0cnVjdCBDUFVMaXN0U3RhdGUgeworICAgIGZwcmludGZfZnVuY3Rpb24gY3B1X2ZwcmludGY7CisgICAgRklMRSAqZmlsZTsKK30gQ1BVTGlzdFN0YXRlOworCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKworZW51bSBkZXZpY2VfZW5kaWFuIHsKKyAgICBERVZJQ0VfTkFUSVZFX0VORElBTiwKKyAgICBERVZJQ0VfQklHX0VORElBTiwKKyAgICBERVZJQ0VfTElUVExFX0VORElBTiwKK307CisKKy8qIGFkZHJlc3MgaW4gdGhlIFJBTSAoZGlmZmVyZW50IGZyb20gYSBwaHlzaWNhbCBhZGRyZXNzKSAqLworI2lmIGRlZmluZWQoQ09ORklHX1hFTl9CQUNLRU5EKQordHlwZWRlZiB1aW50NjRfdCByYW1fYWRkcl90OworIyAgZGVmaW5lIFJBTV9BRERSX01BWCBVSU5UNjRfTUFYCisjICBkZWZpbmUgUkFNX0FERFJfRk1UICIlIiBQUkl4NjQKKyNlbHNlCit0eXBlZGVmIHVpbnRwdHJfdCByYW1fYWRkcl90OworIyAgZGVmaW5lIFJBTV9BRERSX01BWCBVSU5UUFRSX01BWAorIyAgZGVmaW5lIFJBTV9BRERSX0ZNVCAiJSIgUFJJeFBUUgorI2VuZGlmCisKKy8qIG1lbW9yeSBBUEkgKi8KKworLyogTU1JTyBwYWdlcyBhcmUgaWRlbnRpZmllZCBieSBhIGNvbWJpbmF0aW9uIG9mIGFuIElPIGRldmljZSBpbmRleCBhbmQKKyAgIDMgZmxhZ3MuICBUaGUgUk9NRCBjb2RlIHN0b3JlcyB0aGUgcGFnZSByYW0gb2Zmc2V0IGluIGlvdGxiIGVudHJ5LAorICAgc28gb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGlkcyBhcmUgYXZhaWFibGUuICAqLworCisjZGVmaW5lIElPX01FTV9OQl9FTlRSSUVTICAoMSA8PCAoVEFSR0VUX1BBR0VfQklUUyAgLSBJT19NRU1fU0hJRlQpKQorCit0eXBlZGVmIHZvaWQgQ1BVV3JpdGVNZW1vcnlGdW5jKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbHVlKTsKK3R5cGVkZWYgdWludDMyX3QgQ1BVUmVhZE1lbW9yeUZ1bmModm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkcik7CisKK3ZvaWQgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeV9sb2coaHdhZGRyIHN0YXJ0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBwaHlzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCByZWdpb25fb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvZ19kaXJ0eSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5X29mZnNldChod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBwaHlzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IHJlZ2lvbl9vZmZzZXQpCit7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeV9sb2coc3RhcnRfYWRkciwgc2l6ZSwgcGh5c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uX29mZnNldCwgZmFsc2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeShod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3QgcGh5c19vZmZzZXQpCit7CisgICAgY3B1X3JlZ2lzdGVyX3BoeXNpY2FsX21lbW9yeV9vZmZzZXQoc3RhcnRfYWRkciwgc2l6ZSwgcGh5c19vZmZzZXQsIDApOworfQorCityYW1fYWRkcl90IGNwdV9nZXRfcGh5c2ljYWxfcGFnZV9kZXNjKGh3YWRkciBhZGRyKTsKKworaW50IGNwdV9yZWdpc3Rlcl9pb19tZW1vcnkoQ1BVUmVhZE1lbW9yeUZ1bmMgKiBjb25zdCAqbWVtX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVXcml0ZU1lbW9yeUZ1bmMgKiBjb25zdCAqbWVtX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK3ZvaWQgY3B1X3VucmVnaXN0ZXJfaW9fbWVtb3J5KGludCB0YWJsZV9hZGRyZXNzKTsKKwordm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KGh3YWRkciBhZGRyLCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGlzX3dyaXRlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X3JlYWQoaHdhZGRyIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KGFkZHIsIGJ1ZiwgbGVuLCAwKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQoreworICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfcncoYWRkciwgKHZvaWQqKWJ1ZiwgbGVuLCAxKTsKK30KK3ZvaWQgKmNwdV9waHlzaWNhbF9tZW1vcnlfbWFwKGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyICpwbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3dyaXRlKTsKK3ZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV91bm1hcCh2b2lkICpidWZmZXIsIGh3YWRkciBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3dyaXRlLCBod2FkZHIgYWNjZXNzX2xlbik7Cit2b2lkICpjcHVfcmVnaXN0ZXJfbWFwX2NsaWVudCh2b2lkICpvcGFxdWUsIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqb3BhcXVlKSk7CisKK3VpbnQzMl90IGxkdWJfcGh5cyhod2FkZHIgYWRkcik7Cit1aW50MzJfdCBsZHV3X2xlX3BoeXMoaHdhZGRyIGFkZHIpOwordWludDMyX3QgbGR1d19iZV9waHlzKGh3YWRkciBhZGRyKTsKK3VpbnQzMl90IGxkbF9sZV9waHlzKGh3YWRkciBhZGRyKTsKK3VpbnQzMl90IGxkbF9iZV9waHlzKGh3YWRkciBhZGRyKTsKK3VpbnQ2NF90IGxkcV9sZV9waHlzKGh3YWRkciBhZGRyKTsKK3VpbnQ2NF90IGxkcV9iZV9waHlzKGh3YWRkciBhZGRyKTsKK3ZvaWQgc3RiX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCk7Cit2b2lkIHN0d19sZV9waHlzKGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpOwordm9pZCBzdHdfYmVfcGh5cyhod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKTsKK3ZvaWQgc3RsX2xlX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQzMl90IHZhbCk7Cit2b2lkIHN0bF9iZV9waHlzKGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpOwordm9pZCBzdHFfbGVfcGh5cyhod2FkZHIgYWRkciwgdWludDY0X3QgdmFsKTsKK3ZvaWQgc3RxX2JlX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQ2NF90IHZhbCk7CisKKyNpZmRlZiBORUVEX0NQVV9ICit1aW50MzJfdCBsZHV3X3BoeXMoaHdhZGRyIGFkZHIpOwordWludDMyX3QgbGRsX3BoeXMoaHdhZGRyIGFkZHIpOwordWludDY0X3QgbGRxX3BoeXMoaHdhZGRyIGFkZHIpOwordm9pZCBzdGxfcGh5c19ub3RkaXJ0eShod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKTsKK3ZvaWQgc3RxX3BoeXNfbm90ZGlydHkoaHdhZGRyIGFkZHIsIHVpbnQ2NF90IHZhbCk7Cit2b2lkIHN0d19waHlzKGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWwpOwordm9pZCBzdGxfcGh5cyhod2FkZHIgYWRkciwgdWludDMyX3QgdmFsKTsKK3ZvaWQgc3RxX3BoeXMoaHdhZGRyIGFkZHIsIHVpbnQ2NF90IHZhbCk7CisjZW5kaWYKKwordm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlX3JvbShod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworI2RlZmluZSBJT19NRU1fU0hJRlQgICAgICAgMworCisjZGVmaW5lIElPX01FTV9SQU0gICAgICAgICAoMCA8PCBJT19NRU1fU0hJRlQpIC8qIGhhcmRjb2RlZCBvZmZzZXQgKi8KKyNkZWZpbmUgSU9fTUVNX1JPTSAgICAgICAgICgxIDw8IElPX01FTV9TSElGVCkgLyogaGFyZGNvZGVkIG9mZnNldCAqLworI2RlZmluZSBJT19NRU1fVU5BU1NJR05FRCAgKDIgPDwgSU9fTUVNX1NISUZUKQorI2RlZmluZSBJT19NRU1fTk9URElSVFkgICAgKDMgPDwgSU9fTUVNX1NISUZUKQorCisvKiBBY3RzIGxpa2UgYSBST00gd2hlbiByZWFkIGFuZCBsaWtlIGEgZGV2aWNlIHdoZW4gd3JpdHRlbi4gICovCisjZGVmaW5lIElPX01FTV9ST01EICAgICAgICAoMSkKKyNkZWZpbmUgSU9fTUVNX1NVQlBBR0UgICAgICgyKQorI2RlZmluZSBJT19NRU1fU1VCV0lEVEggICAgKDQpCisKKyNlbmRpZgorCisjZW5kaWYgLyogIUNQVV9DT01NT05fSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvY3B1LWRlZnMuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NwdS1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNjM2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2NwdS1kZWZzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBjb21tb24gZGVmaW5lcyBmb3IgYWxsIENQVXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIENQVV9ERUZTX0gKKyNkZWZpbmUgQ1BVX0RFRlNfSAorCisjaWZuZGVmIE5FRURfQ1BVX0gKKyNlcnJvciBjcHUuaCBpbmNsdWRlZCBmcm9tIGNvbW1vbiBjb2RlCisjZW5kaWYKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgImV4ZWMvaHdhZGRyLmgiCisKKyNpZm5kZWYgVEFSR0VUX0xPTkdfQklUUworI2Vycm9yIFRBUkdFVF9MT05HX0JJVFMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSBpbmNsdWRpbmcgdGhpcyBoZWFkZXIKKyNlbmRpZgorCisjZGVmaW5lIFRBUkdFVF9MT05HX1NJWkUgKFRBUkdFVF9MT05HX0JJVFMgLyA4KQorCisvKiB0YXJnZXRfdWxvbmcgaXMgdGhlIHR5cGUgb2YgYSB2aXJ0dWFsIGFkZHJlc3MgKi8KKyNpZiBUQVJHRVRfTE9OR19TSVpFID09IDQKK3R5cGVkZWYgaW50MzJfdCB0YXJnZXRfbG9uZzsKK3R5cGVkZWYgdWludDMyX3QgdGFyZ2V0X3Vsb25nOworI2RlZmluZSBUQVJHRVRfRk1UX2x4ICIlMDh4IgorI2RlZmluZSBUQVJHRVRfRk1UX2xkICIlZCIKKyNkZWZpbmUgVEFSR0VUX0ZNVF9sdSAiJXUiCisjZWxpZiBUQVJHRVRfTE9OR19TSVpFID09IDgKK3R5cGVkZWYgaW50NjRfdCB0YXJnZXRfbG9uZzsKK3R5cGVkZWYgdWludDY0X3QgdGFyZ2V0X3Vsb25nOworI2RlZmluZSBUQVJHRVRfRk1UX2x4ICIlMDE2IiBQUkl4NjQKKyNkZWZpbmUgVEFSR0VUX0ZNVF9sZCAiJSIgUFJJZDY0CisjZGVmaW5lIFRBUkdFVF9GTVRfbHUgIiUiIFBSSXU2NAorI2Vsc2UKKyNlcnJvciBUQVJHRVRfTE9OR19TSVpFIHVuZGVmaW5lZAorI2VuZGlmCisKKyNkZWZpbmUgSE9TVF9MT05HX1NJWkUgKEhPU1RfTE9OR19CSVRTIC8gOCkKKworI2RlZmluZSBFWENQX0lOVEVSUlVQVCAJMHgxMDAwMCAvKiBhc3luYyBpbnRlcnJ1cHRpb24gKi8KKyNkZWZpbmUgRVhDUF9ITFQgICAgICAgIDB4MTAwMDEgLyogaGx0IGluc3RydWN0aW9uIHJlYWNoZWQgKi8KKyNkZWZpbmUgRVhDUF9ERUJVRyAgICAgIDB4MTAwMDIgLyogY3B1IHN0b3BwZWQgYWZ0ZXIgYSBicmVha3BvaW50IG9yIHNpbmdsZXN0ZXAgKi8KKyNkZWZpbmUgRVhDUF9IQUxURUQgICAgIDB4MTAwMDMgLyogY3B1IGlzIGhhbHRlZCAod2FpdGluZyBmb3IgZXh0ZXJuYWwgZXZlbnQpICovCisKKyNkZWZpbmUgVEJfSk1QX0NBQ0hFX0JJVFMgMTIKKyNkZWZpbmUgVEJfSk1QX0NBQ0hFX1NJWkUgKDEgPDwgVEJfSk1QX0NBQ0hFX0JJVFMpCisKKy8qIE9ubHkgdGhlIGJvdHRvbSBUQl9KTVBfUEFHRV9CSVRTIG9mIHRoZSBqdW1wIGNhY2hlIGhhc2ggYml0cyB2YXJ5IGZvcgorICAgYWRkcmVzc2VzIG9uIHRoZSBzYW1lIHBhZ2UuICBUaGUgdG9wIGJpdHMgYXJlIHRoZSBzYW1lLiAgVGhpcyBhbGxvd3MKKyAgIFRMQiBpbnZhbGlkYXRpb24gdG8gcXVpY2tseSBjbGVhciBhIHN1YnNldCBvZiB0aGUgaGFzaCB0YWJsZS4gICovCisjZGVmaW5lIFRCX0pNUF9QQUdFX0JJVFMgKFRCX0pNUF9DQUNIRV9CSVRTIC8gMikKKyNkZWZpbmUgVEJfSk1QX1BBR0VfU0laRSAoMSA8PCBUQl9KTVBfUEFHRV9CSVRTKQorI2RlZmluZSBUQl9KTVBfQUREUl9NQVNLIChUQl9KTVBfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgVEJfSk1QX1BBR0VfTUFTSyAoVEJfSk1QX0NBQ0hFX1NJWkUgLSBUQl9KTVBfUEFHRV9TSVpFKQorCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNkZWZpbmUgQ1BVX1RMQl9CSVRTIDgKKyNkZWZpbmUgQ1BVX1RMQl9TSVpFICgxIDw8IENQVV9UTEJfQklUUykKKworI2lmIEhPU1RfTE9OR19CSVRTID09IDMyICYmIFRBUkdFVF9MT05HX0JJVFMgPT0gMzIKKyNkZWZpbmUgQ1BVX1RMQl9FTlRSWV9CSVRTIDQKKyNlbHNlCisjZGVmaW5lIENQVV9UTEJfRU5UUllfQklUUyA1CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQ1BVVExCRW50cnkgeworICAgIC8qIGJpdCBUQVJHRVRfTE9OR19CSVRTIHRvIFRBUkdFVF9QQUdFX0JJVFMgOiB2aXJ0dWFsIGFkZHJlc3MKKyAgICAgICBiaXQgVEFSR0VUX1BBR0VfQklUUy0xLi40ICA6IE5vbnplcm8gZm9yIGFjY2Vzc2VzIHRoYXQgc2hvdWxkIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28gZGlyZWN0bHkgdG8gcmFtLgorICAgICAgIGJpdCAzICAgICAgICAgICAgICAgICAgICAgIDogaW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IGlzIGludmFsaWQKKyAgICAgICBiaXQgMi4uMCAgICAgICAgICAgICAgICAgICA6IHplcm8KKyAgICAqLworICAgIHRhcmdldF91bG9uZyBhZGRyX3JlYWQ7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHJfd3JpdGU7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHJfY29kZTsKKyAgICAvKiBBZGRlbmQgdG8gdmlydHVhbCBhZGRyZXNzIHRvIGdldCBob3N0IGFkZHJlc3MuICBJTyBhY2Nlc3NlcworICAgICAgIHVzZSB0aGUgY29ycmVzcG9uZGluZyBpb3RsYiB2YWx1ZS4gICovCisgICAgdWludHB0cl90IGFkZGVuZDsKKyAgICAvKiBwYWRkaW5nIHRvIGdldCBhIHBvd2VyIG9mIHR3byBzaXplICovCisgICAgdWludDhfdCBkdW1teVsoMSA8PCBDUFVfVExCX0VOVFJZX0JJVFMpIC0KKyAgICAgICAgICAgICAgICAgIChzaXplb2YodGFyZ2V0X3Vsb25nKSAqIDMgKworICAgICAgICAgICAgICAgICAgICgoLXNpemVvZih0YXJnZXRfdWxvbmcpICogMykgJiAoc2l6ZW9mKHVpbnRwdHJfdCkgLSAxKSkgKworICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50cHRyX3QpKV07Cit9IENQVVRMQkVudHJ5OworCitRRU1VX0JVSUxEX0JVR19PTihzaXplb2YoQ1BVVExCRW50cnkpICE9ICgxIDw8IENQVV9UTEJfRU5UUllfQklUUykpOworCisjZGVmaW5lIENQVV9DT01NT05fVExCIFwKKyAgICAvKiBUaGUgbWVhbmluZyBvZiB0aGUgTU1VIG1vZGVzIGlzIGRlZmluZWQgaW4gdGhlIHRhcmdldCBjb2RlLiAqLyAgIFwKKyAgICBDUFVUTEJFbnRyeSB0bGJfdGFibGVbTkJfTU1VX01PREVTXVtDUFVfVExCX1NJWkVdOyAgICAgICAgICAgICAgICAgIFwKKyAgICBod2FkZHIgaW90bGJbTkJfTU1VX01PREVTXVtDUFVfVExCX1NJWkVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXJnZXRfdWxvbmcgdGxiX2ZsdXNoX2FkZHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXJnZXRfdWxvbmcgdGxiX2ZsdXNoX21hc2s7CisKKyNlbHNlCisKKyNkZWZpbmUgQ1BVX0NPTU1PTl9UTEIKKworI2VuZGlmCisKKworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCit0eXBlZGVmIHN0cnVjdCBpY291bnRfZGVjcl91MTYgeworICAgIHVpbnQxNl90IGhpZ2g7CisgICAgdWludDE2X3QgbG93OworfSBpY291bnRfZGVjcl91MTY7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgaWNvdW50X2RlY3JfdTE2IHsKKyAgICB1aW50MTZfdCBsb3c7CisgICAgdWludDE2X3QgaGlnaDsKK30gaWNvdW50X2RlY3JfdTE2OworI2VuZGlmCisKK3N0cnVjdCBrdm1fcnVuOworc3RydWN0IEtWTVN0YXRlOworc3RydWN0IHFlbXVfd29ya19pdGVtOworCit0eXBlZGVmIHN0cnVjdCBDUFVCcmVha3BvaW50IHsKKyAgICB0YXJnZXRfdWxvbmcgcGM7CisgICAgaW50IGZsYWdzOyAvKiBCUF8qICovCisgICAgUVRBSUxRX0VOVFJZKENQVUJyZWFrcG9pbnQpIGVudHJ5OworfSBDUFVCcmVha3BvaW50OworCit0eXBlZGVmIHN0cnVjdCBDUFVXYXRjaHBvaW50IHsKKyAgICB0YXJnZXRfdWxvbmcgdmFkZHI7CisgICAgdGFyZ2V0X3Vsb25nIGxlbl9tYXNrOworICAgIGludCBmbGFnczsgLyogQlBfKiAqLworICAgIFFUQUlMUV9FTlRSWShDUFVXYXRjaHBvaW50KSBlbnRyeTsKK30gQ1BVV2F0Y2hwb2ludDsKKworI2RlZmluZSBDUFVfVEVNUF9CVUZfTkxPTkdTIDEyOAorI2RlZmluZSBDUFVfQ09NTU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICpjdXJyZW50X3RiOyAvKiBjdXJyZW50bHkgZXhlY3V0aW5nIFRCICAqLyAgXAorICAgIC8qIHNvZnQgbW11IHN1cHBvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGluIG9yZGVyIHRvIGF2b2lkIHBhc3NpbmcgdG9vIG1hbnkgYXJndW1lbnRzIHRvIHRoZSBNTUlPICAgICAgICAgXAorICAgICAgIGhlbHBlcnMsIHdlIHN0b3JlIHNvbWUgcmFyZWx5IHVzZWQgaW5mb3JtYXRpb24gaW4gdGhlIENQVSAgICAgICAgXAorICAgICAgIGNvbnRleHQpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnRwdHJfdCAgbWVtX2lvX3BjOyAvKiBob3N0IHBjIGF0IHdoaWNoIHRoZSBtZW1vcnkgd2FzICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhcmdldF91bG9uZyBtZW1faW9fdmFkZHI7IC8qIHRhcmdldCB2aXJ0dWFsIGFkZHIgYXQgd2hpY2ggdGhlICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSB3YXMgYWNjZXNzZWQgKi8gICAgICAgICAgICAgXAorICAgIENQVV9DT01NT05fVExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICp0Yl9qbXBfY2FjaGVbVEJfSk1QX0NBQ0hFX1NJWkVdOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDY0X3QgaWNvdW50X2V4dHJhOyAvKiBJbnN0cnVjdGlvbnMgdW50aWwgbmV4dCB0aW1lciBldmVudC4gICovICAgXAorICAgIC8qIE51bWJlciBvZiBjeWNsZXMgbGVmdCwgd2l0aCBpbnRlcnJ1cHQgZmxhZyBpbiBoaWdoIGJpdC4gICAgICAgICAgXAorICAgICAgIFRoaXMgYWxsb3dzIGEgc2luZ2xlIHJlYWQtY29tcGFyZS1jYnJhbmNoLXdyaXRlIHNlcXVlbmNlIHRvIHRlc3QgXAorICAgICAgIGZvciBib3RoIGRlY3JlbWVudGVyIHVuZGVyZmxvdyBhbmQgZXhjZXB0aW9ucy4gICovICAgICAgICAgICAgICAgXAorICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCB1MzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY291bnRfZGVjcl91MTYgdTE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gaWNvdW50X2RlY3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGNhbl9kb19pbzsgLyogbm9uemVybyBpZiBtZW1vcnkgbWFwcGVkIElPIGlzIHNhZmUuICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZyb20gdGhpcyBwb2ludDogcHJlc2VydmVkIGJ5IENQVSByZXNldCAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGljZSBkZWJ1ZyBzdXBwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFFUQUlMUV9IRUFEKGJyZWFrcG9pbnRzX2hlYWQsIENQVUJyZWFrcG9pbnQpIGJyZWFrcG9pbnRzOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBRVEFJTFFfSEVBRCh3YXRjaHBvaW50c19oZWFkLCBDUFVXYXRjaHBvaW50KSB3YXRjaHBvaW50czsgICAgICAgICAgICBcCisgICAgQ1BVV2F0Y2hwb2ludCAqd2F0Y2hwb2ludF9oaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQ29yZSBpbnRlcnJ1cHQgY29kZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgam1wX2J1ZiBqbXBfZW52OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGV4Y2VwdGlvbl9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdXNlciBkYXRhICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCAqb3BhcXVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvY3B1dGxiLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9jcHV0bGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmUwZDljCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvY3B1dGxiLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBDb21tb24gQ1BVIFRMQiBoYW5kbGluZworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIENQVVRMQl9ICisjZGVmaW5lIENQVVRMQl9ICisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorLyogY3B1dGxiLmMgKi8KK3ZvaWQgdGxiX3Byb3RlY3RfY29kZShyYW1fYWRkcl90IHJhbV9hZGRyKTsKK3ZvaWQgdGxiX3VucHJvdGVjdF9jb2RlX3BoeXMoQ1BVQXJjaFN0YXRlICplbnYsIHJhbV9hZGRyX3QgcmFtX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyB2YWRkcik7Cit2b2lkIHRsYl9yZXNldF9kaXJ0eV9yYW5nZShDUFVUTEJFbnRyeSAqdGxiX2VudHJ5LCB1aW50cHRyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgbGVuZ3RoKTsKK3ZvaWQgY3B1X3RsYl9yZXNldF9kaXJ0eV9hbGwocmFtX2FkZHJfdCBzdGFydDEsIHJhbV9hZGRyX3QgbGVuZ3RoKTsKK3ZvaWQgdGxiX3NldF9kaXJ0eShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHZhZGRyKTsKK2V4dGVybiBpbnQgdGxiX2ZsdXNoX2NvdW50OworCisvKiBleGVjLmMgKi8KK3ZvaWQgdGJfZmx1c2hfam1wX2NhY2hlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcik7CisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQgLy8gVE9ETyhkaWdpdCkKK01lbW9yeVJlZ2lvblNlY3Rpb24gKgorYWRkcmVzc19zcGFjZV90cmFuc2xhdGVfZm9yX2lvdGxiKEFkZHJlc3NTcGFjZSAqYXMsIGh3YWRkciBhZGRyLCBod2FkZHIgKnhsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyICpwbGVuKTsKK2h3YWRkciBtZW1vcnlfcmVnaW9uX3NlY3Rpb25fZ2V0X2lvdGxiKENQVUFyY2hTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5UmVnaW9uU2VjdGlvbiAqc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyB2YWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBwYWRkciwgaHdhZGRyIHhsYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyAqYWRkcmVzcyk7Citib29sIG1lbW9yeV9yZWdpb25faXNfdW5hc3NpZ25lZChNZW1vcnlSZWdpb24gKm1yKTsKKyNlbmRpZgorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvZGVmLWhlbHBlci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvZGVmLWhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZDUxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9kZWYtaGVscGVyLmgKQEAgLTAsMCArMSwyNzQgQEAKKy8qIEhlbHBlciBmaWxlIGZvciBkZWNsYXJpbmcgVENHIGhlbHBlciBmdW5jdGlvbnMuCisgICBTaG91bGQgYmUgaW5jbHVkZWQgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGFyZ2V0LWZvby9oZWxwZXIuaC4KKworICAgVGFyZ2V0cyBzaG91bGQgdXNlIERFRl9IRUxQRVJfTiBhbmQgREVGX0hFTFBFUl9GTEFHU19OIHRvIGRlY2xhcmUgaGVscGVyCisgICBmdW5jdGlvbnMuICBOYW1lcyBzaG91bGQgYmUgc3BlY2lmaWVkIHdpdGhvdXQgdGhlIGhlbHBlcl8gcHJlZml4LCBhbmQKKyAgIHRoZSByZXR1cm4gYW5kIGFyZ3VtZW50IHR5cGVzIHNwZWNpZmllZC4gIDMgYmFzaWMgdHlwZXMgYXJlIHVuZGVyc3Rvb2QKKyAgIChpMzIsIGk2NCBhbmQgcHRyKS4gIEFkZGl0aW9uYWwgYWxpYXNlcyBhcmUgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlIGFuZAorICAgdG8gbWF0Y2ggdGhlIHR5cGVzIHVzZWQgYnkgdGhlIEMgaGVscGVyIGltcGxlbWVudGF0aW9uLgorCisgICBUaGUgdGFyZ2V0IGhlbHBlci5oIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbGwgZmlsZXMgdGhhdCB1c2UvZGVmaW5lCisgICBoZWxwZXIgZnVuY3Rpb25zLiAgVEhpcyB3aWxsIGVuc3VyZSB0aGF0IGZ1bmN0aW9uIHByb3RvdHlwZXMgYXJlCisgICBjb25zaXN0ZW50LiAgSW4gYWRkaXRpb24gaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGFuIGV4dHJhIHR3byB0aW1lcyBmb3IKKyAgIGhlbHBlci5jLCBkZWZpbmluZzoKKyAgICBHRU5fSEVMUEVSIDEgdG8gcHJvZHVjZSBvcCBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAoZ2VuX2hlbHBlcl8qKQorICAgIEdFTl9IRUxQRVIgMiB0byBkbyBydW50aW1lIHJlZ2lzdHJhdGlvbiBoZWxwZXIgZnVuY3Rpb25zLgorICovCisKKyNpZm5kZWYgREVGX0hFTFBFUl9ICisjZGVmaW5lIERFRl9IRUxQRVJfSCAxCisKKyNkZWZpbmUgSEVMUEVSKG5hbWUpIGdsdWUoaGVscGVyXywgbmFtZSkKKworI2RlZmluZSBHRVRfVENHVl9pMzIgR0VUX1RDR1ZfSTMyCisjZGVmaW5lIEdFVF9UQ0dWX2k2NCBHRVRfVENHVl9JNjQKKyNkZWZpbmUgR0VUX1RDR1ZfcHRyIEdFVF9UQ0dWX1BUUgorCisvKiBTb21lIHR5cGVzIHRoYXQgbWFrZSBzZW5zZSBpbiBDLCBidXQgbm90IGZvciBUQ0cuICAqLworI2RlZmluZSBkaF9hbGlhc19pMzIgaTMyCisjZGVmaW5lIGRoX2FsaWFzX3MzMiBpMzIKKyNkZWZpbmUgZGhfYWxpYXNfaW50IGkzMgorI2RlZmluZSBkaF9hbGlhc19pNjQgaTY0CisjZGVmaW5lIGRoX2FsaWFzX3M2NCBpNjQKKyNkZWZpbmUgZGhfYWxpYXNfZjMyIGkzMgorI2RlZmluZSBkaF9hbGlhc19mNjQgaTY0CisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorI2RlZmluZSBkaF9hbGlhc190bCBpMzIKKyNlbHNlCisjZGVmaW5lIGRoX2FsaWFzX3RsIGk2NAorI2VuZGlmCisjZGVmaW5lIGRoX2FsaWFzX3B0ciBwdHIKKyNkZWZpbmUgZGhfYWxpYXNfdm9pZCB2b2lkCisjZGVmaW5lIGRoX2FsaWFzX25vcmV0dXJuIG5vcmV0dXJuCisjZGVmaW5lIGRoX2FsaWFzX2VudiBwdHIKKyNkZWZpbmUgZGhfYWxpYXModCkgZ2x1ZShkaF9hbGlhc18sIHQpCisKKyNkZWZpbmUgZGhfY3R5cGVfaTMyIHVpbnQzMl90CisjZGVmaW5lIGRoX2N0eXBlX3MzMiBpbnQzMl90CisjZGVmaW5lIGRoX2N0eXBlX2ludCBpbnQKKyNkZWZpbmUgZGhfY3R5cGVfaTY0IHVpbnQ2NF90CisjZGVmaW5lIGRoX2N0eXBlX3M2NCBpbnQ2NF90CisjZGVmaW5lIGRoX2N0eXBlX2YzMiBmbG9hdDMyCisjZGVmaW5lIGRoX2N0eXBlX2Y2NCBmbG9hdDY0CisjZGVmaW5lIGRoX2N0eXBlX3RsIHRhcmdldF91bG9uZworI2RlZmluZSBkaF9jdHlwZV9wdHIgdm9pZCAqCisjZGVmaW5lIGRoX2N0eXBlX3ZvaWQgdm9pZAorI2RlZmluZSBkaF9jdHlwZV9ub3JldHVybiB2b2lkIFFFTVVfTk9SRVRVUk4KKyNkZWZpbmUgZGhfY3R5cGVfZW52IENQVUFyY2hTdGF0ZSAqCisjZGVmaW5lIGRoX2N0eXBlKHQpIGRoX2N0eXBlXyMjdAorCisvKiBXZSBjYW4ndCB1c2UgZ2x1ZSgpIGhlcmUgYmVjYXVzZSBpdCBmYWxscyBmb3VsIG9mIEMgcHJlcHJvY2Vzc29yCisgICByZWN1cnNpdmUgZXhwYW5zaW9uIHJ1bGVzLiAgKi8KKyNkZWZpbmUgZGhfcmV0dmFyX2RlY2wwX3ZvaWQgdm9pZAorI2RlZmluZSBkaF9yZXR2YXJfZGVjbDBfbm9yZXR1cm4gdm9pZAorI2RlZmluZSBkaF9yZXR2YXJfZGVjbDBfaTMyIFRDR3ZfaTMyIHJldHZhbAorI2RlZmluZSBkaF9yZXR2YXJfZGVjbDBfaTY0IFRDR3ZfaTY0IHJldHZhbAorI2RlZmluZSBkaF9yZXR2YXJfZGVjbDBfcHRyIFRDR3ZfcHRyIHJldHZhbAorI2RlZmluZSBkaF9yZXR2YXJfZGVjbDAodCkgZ2x1ZShkaF9yZXR2YXJfZGVjbDBfLCBkaF9hbGlhcyh0KSkKKworI2RlZmluZSBkaF9yZXR2YXJfZGVjbF92b2lkCisjZGVmaW5lIGRoX3JldHZhcl9kZWNsX25vcmV0dXJuCisjZGVmaW5lIGRoX3JldHZhcl9kZWNsX2kzMiBUQ0d2X2kzMiByZXR2YWwsCisjZGVmaW5lIGRoX3JldHZhcl9kZWNsX2k2NCBUQ0d2X2k2NCByZXR2YWwsCisjZGVmaW5lIGRoX3JldHZhcl9kZWNsX3B0ciBUQ0d2X3B0ciByZXR2YWwsCisjZGVmaW5lIGRoX3JldHZhcl9kZWNsKHQpIGdsdWUoZGhfcmV0dmFyX2RlY2xfLCBkaF9hbGlhcyh0KSkKKworI2RlZmluZSBkaF9yZXR2YXJfdm9pZCBUQ0dfQ0FMTF9EVU1NWV9BUkcKKyNkZWZpbmUgZGhfcmV0dmFyX25vcmV0dXJuIFRDR19DQUxMX0RVTU1ZX0FSRworI2RlZmluZSBkaF9yZXR2YXJfaTMyIEdFVF9UQ0dWX2kzMihyZXR2YWwpCisjZGVmaW5lIGRoX3JldHZhcl9pNjQgR0VUX1RDR1ZfaTY0KHJldHZhbCkKKyNkZWZpbmUgZGhfcmV0dmFyX3B0ciBHRVRfVENHVl9wdHIocmV0dmFsKQorI2RlZmluZSBkaF9yZXR2YXIodCkgZ2x1ZShkaF9yZXR2YXJfLCBkaF9hbGlhcyh0KSkKKworI2RlZmluZSBkaF9pc182NGJpdF92b2lkIDAKKyNkZWZpbmUgZGhfaXNfNjRiaXRfbm9yZXR1cm4gMAorI2RlZmluZSBkaF9pc182NGJpdF9pMzIgMAorI2RlZmluZSBkaF9pc182NGJpdF9pNjQgMQorI2RlZmluZSBkaF9pc182NGJpdF9wdHIgKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQpCisjZGVmaW5lIGRoX2lzXzY0Yml0KHQpIGdsdWUoZGhfaXNfNjRiaXRfLCBkaF9hbGlhcyh0KSkKKworI2RlZmluZSBkaF9pc19zaWduZWRfdm9pZCAwCisjZGVmaW5lIGRoX2lzX3NpZ25lZF9ub3JldHVybiAwCisjZGVmaW5lIGRoX2lzX3NpZ25lZF9pMzIgMAorI2RlZmluZSBkaF9pc19zaWduZWRfczMyIDEKKyNkZWZpbmUgZGhfaXNfc2lnbmVkX2k2NCAwCisjZGVmaW5lIGRoX2lzX3NpZ25lZF9zNjQgMQorI2RlZmluZSBkaF9pc19zaWduZWRfZjMyIDAKKyNkZWZpbmUgZGhfaXNfc2lnbmVkX2Y2NCAwCisjZGVmaW5lIGRoX2lzX3NpZ25lZF90bCAgMAorI2RlZmluZSBkaF9pc19zaWduZWRfaW50IDEKKy8qID8/PyBUaGlzIGlzIGhpZ2hseSBzcGVjaWZpYyB0byB0aGUgaG9zdCBjcHUuICBUaGVyZSBhcmUgZXZlbiBzcGVjaWFsCisgICBleHRlbnNpb24gaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGJlIHJlcXVpcmVkLCBlLmcuIGlhNjQncyBhZGRwNC4gIEJ1dAorICAgZm9yIG5vdyB3ZSBkb24ndCBzdXBwb3J0IGFueSA2NC1iaXQgdGFyZ2V0cyB3aXRoIDMyLWJpdCBwb2ludGVycy4gICovCisjZGVmaW5lIGRoX2lzX3NpZ25lZF9wdHIgMAorI2RlZmluZSBkaF9pc19zaWduZWRfZW52IGRoX2lzX3NpZ25lZF9wdHIKKyNkZWZpbmUgZGhfaXNfc2lnbmVkKHQpIGRoX2lzX3NpZ25lZF8jI3QKKworI2RlZmluZSBkaF9zaXplbWFzayh0LCBuKSBcCisgIHNpemVtYXNrIHw9IGRoX2lzXzY0Yml0KHQpIDw8IChuKjIpOyBcCisgIHNpemVtYXNrIHw9IGRoX2lzX3NpZ25lZCh0KSA8PCAobioyKzEpCisKKyNkZWZpbmUgZGhfYXJnKHQsIG4pIFwKKyAgYXJnc1tuIC0gMV0gPSBnbHVlKEdFVF9UQ0dWXywgZGhfYWxpYXModCkpKGdsdWUoYXJnLCBuKSk7IFwKKyAgZGhfc2l6ZW1hc2sodCwgbikKKworI2RlZmluZSBkaF9hcmdfZGVjbCh0LCBuKSBnbHVlKFRDR3ZfLCBkaF9hbGlhcyh0KSkgZ2x1ZShhcmcsIG4pCisKKworI2RlZmluZSBERUZfSEVMUEVSXzAobmFtZSwgcmV0KSBcCisgICAgREVGX0hFTFBFUl9GTEFHU18wKG5hbWUsIDAsIHJldCkKKyNkZWZpbmUgREVGX0hFTFBFUl8xKG5hbWUsIHJldCwgdDEpIFwKKyAgICBERUZfSEVMUEVSX0ZMQUdTXzEobmFtZSwgMCwgcmV0LCB0MSkKKyNkZWZpbmUgREVGX0hFTFBFUl8yKG5hbWUsIHJldCwgdDEsIHQyKSBcCisgICAgREVGX0hFTFBFUl9GTEFHU18yKG5hbWUsIDAsIHJldCwgdDEsIHQyKQorI2RlZmluZSBERUZfSEVMUEVSXzMobmFtZSwgcmV0LCB0MSwgdDIsIHQzKSBcCisgICAgREVGX0hFTFBFUl9GTEFHU18zKG5hbWUsIDAsIHJldCwgdDEsIHQyLCB0MykKKyNkZWZpbmUgREVGX0hFTFBFUl80KG5hbWUsIHJldCwgdDEsIHQyLCB0MywgdDQpIFwKKyAgICBERUZfSEVMUEVSX0ZMQUdTXzQobmFtZSwgMCwgcmV0LCB0MSwgdDIsIHQzLCB0NCkKKyNkZWZpbmUgREVGX0hFTFBFUl81KG5hbWUsIHJldCwgdDEsIHQyLCB0MywgdDQsIHQ1KSBcCisgICAgREVGX0hFTFBFUl9GTEFHU181KG5hbWUsIDAsIHJldCwgdDEsIHQyLCB0MywgdDQsIHQ1KQorCisvKiBNQVhfT1BDX1BBUkFNX0lBUkdTIG11c3QgYmUgc2V0IHRvIG4gaWYgbGFzdCBlbnRyeSBpcyBERUZfSEVMUEVSX0ZMQUdTX24uICovCisKKyNlbmRpZiAvKiBERUZfSEVMUEVSX0ggKi8KKworI2lmbmRlZiBHRU5fSEVMUEVSCisvKiBGdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzAobmFtZSwgZmxhZ3MsIHJldCkgXAorZGhfY3R5cGUocmV0KSBIRUxQRVIobmFtZSkgKHZvaWQpOworCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfMShuYW1lLCBmbGFncywgcmV0LCB0MSkgXAorZGhfY3R5cGUocmV0KSBIRUxQRVIobmFtZSkgKGRoX2N0eXBlKHQxKSk7CisKKyNkZWZpbmUgREVGX0hFTFBFUl9GTEFHU18yKG5hbWUsIGZsYWdzLCByZXQsIHQxLCB0MikgXAorZGhfY3R5cGUocmV0KSBIRUxQRVIobmFtZSkgKGRoX2N0eXBlKHQxKSwgZGhfY3R5cGUodDIpKTsKKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzMobmFtZSwgZmxhZ3MsIHJldCwgdDEsIHQyLCB0MykgXAorZGhfY3R5cGUocmV0KSBIRUxQRVIobmFtZSkgKGRoX2N0eXBlKHQxKSwgZGhfY3R5cGUodDIpLCBkaF9jdHlwZSh0MykpOworCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfNChuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIsIHQzLCB0NCkgXAorZGhfY3R5cGUocmV0KSBIRUxQRVIobmFtZSkgKGRoX2N0eXBlKHQxKSwgZGhfY3R5cGUodDIpLCBkaF9jdHlwZSh0MyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGhfY3R5cGUodDQpKTsKKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzUobmFtZSwgZmxhZ3MsIHJldCwgdDEsIHQyLCB0MywgdDQsIHQ1KSBcCitkaF9jdHlwZShyZXQpIEhFTFBFUihuYW1lKSAoZGhfY3R5cGUodDEpLCBkaF9jdHlwZSh0MiksIGRoX2N0eXBlKHQzKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoX2N0eXBlKHQ0KSwgZGhfY3R5cGUodDUpKTsKKworI3VuZGVmIEdFTl9IRUxQRVIKKyNkZWZpbmUgR0VOX0hFTFBFUiAtMQorCisjZWxpZiBHRU5fSEVMUEVSID09IDEKKy8qIEdlbiBmdW5jdGlvbnMuICAqLworCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfMChuYW1lLCBmbGFncywgcmV0KSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2x1ZShnZW5faGVscGVyXywgbmFtZSkoZGhfcmV0dmFyX2RlY2wwKHJldCkpIFwKK3sgXAorICBpbnQgc2l6ZW1hc2s7IFwKKyAgc2l6ZW1hc2sgPSBkaF9pc182NGJpdChyZXQpOyBcCisgIHRjZ19nZW5faGVscGVyTihIRUxQRVIobmFtZSksIGZsYWdzLCBzaXplbWFzaywgZGhfcmV0dmFyKHJldCksIDAsIE5VTEwpOyBcCit9CisKKyNkZWZpbmUgREVGX0hFTFBFUl9GTEFHU18xKG5hbWUsIGZsYWdzLCByZXQsIHQxKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2x1ZShnZW5faGVscGVyXywgbmFtZSkoZGhfcmV0dmFyX2RlY2wocmV0KSBkaF9hcmdfZGVjbCh0MSwgMSkpIFwKK3sgXAorICBUQ0dBcmcgYXJnc1sxXTsgXAorICBpbnQgc2l6ZW1hc2sgPSAwOyBcCisgIGRoX3NpemVtYXNrKHJldCwgMCk7IFwKKyAgZGhfYXJnKHQxLCAxKTsgXAorICB0Y2dfZ2VuX2hlbHBlck4oSEVMUEVSKG5hbWUpLCBmbGFncywgc2l6ZW1hc2ssIGRoX3JldHZhcihyZXQpLCAxLCBhcmdzKTsgXAorfQorCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfMihuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbHVlKGdlbl9oZWxwZXJfLCBuYW1lKShkaF9yZXR2YXJfZGVjbChyZXQpIGRoX2FyZ19kZWNsKHQxLCAxKSwgXAorICAgIGRoX2FyZ19kZWNsKHQyLCAyKSkgXAoreyBcCisgIFRDR0FyZyBhcmdzWzJdOyBcCisgIGludCBzaXplbWFzayA9IDA7IFwKKyAgZGhfc2l6ZW1hc2socmV0LCAwKTsgXAorICBkaF9hcmcodDEsIDEpOyBcCisgIGRoX2FyZyh0MiwgMik7IFwKKyAgdGNnX2dlbl9oZWxwZXJOKEhFTFBFUihuYW1lKSwgZmxhZ3MsIHNpemVtYXNrLCBkaF9yZXR2YXIocmV0KSwgMiwgYXJncyk7IFwKK30KKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzMobmFtZSwgZmxhZ3MsIHJldCwgdDEsIHQyLCB0MykgXAorc3RhdGljIGlubGluZSB2b2lkIGdsdWUoZ2VuX2hlbHBlcl8sIG5hbWUpKGRoX3JldHZhcl9kZWNsKHJldCkgZGhfYXJnX2RlY2wodDEsIDEpLCBcCisgICAgZGhfYXJnX2RlY2wodDIsIDIpLCBkaF9hcmdfZGVjbCh0MywgMykpIFwKK3sgXAorICBUQ0dBcmcgYXJnc1szXTsgXAorICBpbnQgc2l6ZW1hc2sgPSAwOyBcCisgIGRoX3NpemVtYXNrKHJldCwgMCk7IFwKKyAgZGhfYXJnKHQxLCAxKTsgXAorICBkaF9hcmcodDIsIDIpOyBcCisgIGRoX2FyZyh0MywgMyk7IFwKKyAgdGNnX2dlbl9oZWxwZXJOKEhFTFBFUihuYW1lKSwgZmxhZ3MsIHNpemVtYXNrLCBkaF9yZXR2YXIocmV0KSwgMywgYXJncyk7IFwKK30KKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzQobmFtZSwgZmxhZ3MsIHJldCwgdDEsIHQyLCB0MywgdDQpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbHVlKGdlbl9oZWxwZXJfLCBuYW1lKShkaF9yZXR2YXJfZGVjbChyZXQpIGRoX2FyZ19kZWNsKHQxLCAxKSwgXAorICAgIGRoX2FyZ19kZWNsKHQyLCAyKSwgZGhfYXJnX2RlY2wodDMsIDMpLCBkaF9hcmdfZGVjbCh0NCwgNCkpIFwKK3sgXAorICBUQ0dBcmcgYXJnc1s0XTsgXAorICBpbnQgc2l6ZW1hc2sgPSAwOyBcCisgIGRoX3NpemVtYXNrKHJldCwgMCk7IFwKKyAgZGhfYXJnKHQxLCAxKTsgXAorICBkaF9hcmcodDIsIDIpOyBcCisgIGRoX2FyZyh0MywgMyk7IFwKKyAgZGhfYXJnKHQ0LCA0KTsgXAorICB0Y2dfZ2VuX2hlbHBlck4oSEVMUEVSKG5hbWUpLCBmbGFncywgc2l6ZW1hc2ssIGRoX3JldHZhcihyZXQpLCA0LCBhcmdzKTsgXAorfQorCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfNShuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIsIHQzLCB0NCwgdDUpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbHVlKGdlbl9oZWxwZXJfLCBuYW1lKShkaF9yZXR2YXJfZGVjbChyZXQpIFwKKyAgICBkaF9hcmdfZGVjbCh0MSwgMSksICBkaF9hcmdfZGVjbCh0MiwgMiksIGRoX2FyZ19kZWNsKHQzLCAzKSwgXAorICAgIGRoX2FyZ19kZWNsKHQ0LCA0KSwgZGhfYXJnX2RlY2wodDUsIDUpKSBcCit7IFwKKyAgVENHQXJnIGFyZ3NbNV07IFwKKyAgaW50IHNpemVtYXNrID0gMDsgXAorICBkaF9zaXplbWFzayhyZXQsIDApOyBcCisgIGRoX2FyZyh0MSwgMSk7IFwKKyAgZGhfYXJnKHQyLCAyKTsgXAorICBkaF9hcmcodDMsIDMpOyBcCisgIGRoX2FyZyh0NCwgNCk7IFwKKyAgZGhfYXJnKHQ1LCA1KTsgXAorICB0Y2dfZ2VuX2hlbHBlck4oSEVMUEVSKG5hbWUpLCBmbGFncywgc2l6ZW1hc2ssIGRoX3JldHZhcihyZXQpLCA1LCBhcmdzKTsgXAorfQorCisjdW5kZWYgR0VOX0hFTFBFUgorI2RlZmluZSBHRU5fSEVMUEVSIC0xCisKKyNlbGlmIEdFTl9IRUxQRVIgPT0gMgorLyogUmVnaXN0ZXIgaGVscGVycy4gICovCisKKyNkZWZpbmUgREVGX0hFTFBFUl9GTEFHU18wKG5hbWUsIGZsYWdzLCByZXQpICB7IEhFTFBFUihuYW1lKSwgI25hbWUgfSwKKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzEobmFtZSwgZmxhZ3MsIHJldCwgdDEpIFwKK0RFRl9IRUxQRVJfRkxBR1NfMChuYW1lLCBmbGFncywgcmV0KQorCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfMihuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIpIFwKK0RFRl9IRUxQRVJfRkxBR1NfMChuYW1lLCBmbGFncywgcmV0KQorCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfMyhuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIsIHQzKSBcCitERUZfSEVMUEVSX0ZMQUdTXzAobmFtZSwgZmxhZ3MsIHJldCkKKworI2RlZmluZSBERUZfSEVMUEVSX0ZMQUdTXzQobmFtZSwgZmxhZ3MsIHJldCwgdDEsIHQyLCB0MywgdDQpIFwKK0RFRl9IRUxQRVJfRkxBR1NfMChuYW1lLCBmbGFncywgcmV0KQorCisjZGVmaW5lIERFRl9IRUxQRVJfRkxBR1NfNShuYW1lLCBmbGFncywgcmV0LCB0MSwgdDIsIHQzLCB0NCwgdDUpIFwKK0RFRl9IRUxQRVJfRkxBR1NfMChuYW1lLCBmbGFncywgcmV0KQorCisjdW5kZWYgR0VOX0hFTFBFUgorI2RlZmluZSBHRU5fSEVMUEVSIC0xCisKKyNlbGlmIEdFTl9IRUxQRVIgPT0gLTEKKy8qIFVuZGVmaW5lIG1hY3Jvcy4gICovCisKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzAKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzEKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzIKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzMKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzQKKyN1bmRlZiBERUZfSEVMUEVSX0ZMQUdTXzUKKyN1bmRlZiBHRU5fSEVMUEVSCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvZXhlYy1hbGwuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2V4ZWMtYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNzM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2V4ZWMtYWxsLmgKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBpbnRlcm5hbCBleGVjdXRpb24gZGVmaW5lcyBmb3IgcWVtdQorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX0VYRUNfQUxMX0hfCisjZGVmaW5lIF9FWEVDX0FMTF9IXworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJleGVjL2NwdS1jb21tb24uaCIKKyNpbmNsdWRlICJleGVjL2NwdS1hbGwuaCIKKworLyogYWxsb3cgdG8gc2VlIHRyYW5zbGF0aW9uIHJlc3VsdHMgLSB0aGUgc2xvd2Rvd24gc2hvdWxkIGJlIG5lZ2xpZ2libGUsIHNvIHdlIGxlYXZlIGl0ICovCisjZGVmaW5lIERFQlVHX0RJU0FTCisKKy8qIFBhZ2UgdHJhY2tpbmcgY29kZSB1c2VzIHJhbSBhZGRyZXNzZXMgaW4gc3lzdGVtIG1vZGUsIGFuZCB2aXJ0dWFsCisgICBhZGRyZXNzZXMgaW4gdXNlcnNwYWNlIG1vZGUuICBEZWZpbmUgdGJfcGFnZV9hZGRyX3QgdG8gYmUgYW4gYXBwcm9wcmlhdGUKKyAgIHR5cGUuICAqLworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKK3R5cGVkZWYgYWJpX3Vsb25nIHRiX3BhZ2VfYWRkcl90OworI2Vsc2UKK3R5cGVkZWYgcmFtX2FkZHJfdCB0Yl9wYWdlX2FkZHJfdDsKKyNlbmRpZgorCisvKiBpc19qbXAgZmllbGQgdmFsdWVzICovCisjZGVmaW5lIERJU0FTX05FWFQgICAgMCAvKiBuZXh0IGluc3RydWN0aW9uIGNhbiBiZSBhbmFseXplZCAqLworI2RlZmluZSBESVNBU19KVU1QICAgIDEgLyogb25seSBwYyB3YXMgbW9kaWZpZWQgZHluYW1pY2FsbHkgKi8KKyNkZWZpbmUgRElTQVNfVVBEQVRFICAyIC8qIGNwdSBzdGF0ZSB3YXMgbW9kaWZpZWQgZHluYW1pY2FsbHkgKi8KKyNkZWZpbmUgRElTQVNfVEJfSlVNUCAzIC8qIG9ubHkgcGMgd2FzIG1vZGlmaWVkIHN0YXRpY2FsbHkgKi8KKworc3RydWN0IFRyYW5zbGF0aW9uQmxvY2s7Cit0eXBlZGVmIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrIFRyYW5zbGF0aW9uQmxvY2s7CisKKy8qIFhYWDogbWFrZSBzYWZlIGd1ZXNzIGFib3V0IHNpemVzICovCisjZGVmaW5lIE1BWF9PUF9QRVJfSU5TVFIgMjA4CisKKyNpZiBIT1NUX0xPTkdfQklUUyA9PSAzMgorI2RlZmluZSBNQVhfT1BDX1BBUkFNX1BFUl9BUkcgMgorI2Vsc2UKKyNkZWZpbmUgTUFYX09QQ19QQVJBTV9QRVJfQVJHIDEKKyNlbmRpZgorI2RlZmluZSBNQVhfT1BDX1BBUkFNX0lBUkdTIDUKKyNkZWZpbmUgTUFYX09QQ19QQVJBTV9PQVJHUyAxCisjZGVmaW5lIE1BWF9PUENfUEFSQU1fQVJHUyAoTUFYX09QQ19QQVJBTV9JQVJHUyArIE1BWF9PUENfUEFSQU1fT0FSR1MpCisKKy8qIEEgQ2FsbCBvcCBuZWVkcyB1cCB0byA0ICsgMk4gcGFyYW1ldGVycyBvbiAzMi1iaXQgYXJjaHMsCisgKiBhbmQgdXAgdG8gNCArIE4gcGFyYW1ldGVycyBvbiA2NC1iaXQgYXJjaHMKKyAqIChOID0gbnVtYmVyIG9mIGlucHV0IGFyZ3VtZW50cyArIG91dHB1dCBhcmd1bWVudHMpLiAgKi8KKyNkZWZpbmUgTUFYX09QQ19QQVJBTSAoNCArIChNQVhfT1BDX1BBUkFNX1BFUl9BUkcgKiBNQVhfT1BDX1BBUkFNX0FSR1MpKQorI2RlZmluZSBPUENfQlVGX1NJWkUgMjA0OAorI2RlZmluZSBPUENfTUFYX1NJWkUgKE9QQ19CVUZfU0laRSAtIE1BWF9PUF9QRVJfSU5TVFIpCisKKy8qIE1heGltdW0gc2l6ZSBhIFRDRyBvcCBjYW4gZXhwYW5kIHRvLiAgVGhpcyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIGEKKyAgIHNpbmdsZSBvcCBtYXkgcmVxdWlyZSBzZXZlcmFsIGhvc3QgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlciByZWxvYWRzLgorICAgRm9yIG5vdyB0YWtlIGEgd2lsZCBndWVzcyBhdCAxOTIgYnl0ZXMsIHdoaWNoIHNob3VsZCBhbGxvdyBhdCBsZWFzdAorICAgYSBjb3VwbGUgb2YgZml4dXAgaW5zdHJ1Y3Rpb25zIHBlciBhcmd1bWVudC4gICovCisjZGVmaW5lIFRDR19NQVhfT1BfU0laRSAxOTIKKworI2RlZmluZSBPUFBBUkFNX0JVRl9TSVpFIChPUENfQlVGX1NJWkUgKiBNQVhfT1BDX1BBUkFNKQorCisjaW5jbHVkZSAicWVtdS9sb2cuaCIKKwordm9pZCBnZW5faW50ZXJtZWRpYXRlX2NvZGUoQ1BVQXJjaFN0YXRlICplbnYsIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICp0Yik7Cit2b2lkIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9wYyhDUFVBcmNoU3RhdGUgKmVudiwgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnRiKTsKK3ZvaWQgcmVzdG9yZV9zdGF0ZV90b19vcGMoQ1BVQXJjaFN0YXRlICplbnYsIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICp0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBjX3Bvcyk7CisKK3Vuc2lnbmVkIGxvbmcgY29kZV9nZW5fbWF4X2Jsb2NrX3NpemUodm9pZCk7Cit2b2lkIGNwdV9nZW5faW5pdCh2b2lkKTsKK3ZvaWQgdGNnX2V4ZWNfaW5pdCh1bnNpZ25lZCBsb25nIHRiX3NpemUpOworaW50IGNwdV9nZW5fY29kZShDUFVBcmNoU3RhdGUgKmVudiwgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnRiLAorICAgICAgICAgICAgICAgICBpbnQgKmdlbl9jb2RlX3NpemVfcHRyKTsKK2Jvb2wgY3B1X3Jlc3RvcmVfc3RhdGUoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnRwdHJfdCBzZWFyY2hlZF9wYyk7CisKK3ZvaWQgUUVNVV9OT1JFVFVSTiBjcHVfcmVzdW1lX2Zyb21fc2lnbmFsKENQVUFyY2hTdGF0ZSAqZW52MSwgdm9pZCAqcHVjKTsKK3ZvaWQgUUVNVV9OT1JFVFVSTiBjcHVfaW9fcmVjb21waWxlKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50cHRyX3QgcmV0YWRkcik7CitUcmFuc2xhdGlvbkJsb2NrICp0Yl9nZW5fY29kZShDUFVBcmNoU3RhdGUgKmVudiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcGMsIHRhcmdldF91bG9uZyBjc19iYXNlLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2ZsYWdzKTsKK3ZvaWQgY3B1X2V4ZWNfaW5pdChDUFVBcmNoU3RhdGUgKmVudik7Cit2b2lkIFFFTVVfTk9SRVRVUk4gY3B1X2xvb3BfZXhpdChDUFVBcmNoU3RhdGUgKmVudjEpOworaW50IHBhZ2VfdW5wcm90ZWN0KHRhcmdldF91bG9uZyBhZGRyZXNzLCB1aW50cHRyX3QgcGMsIHZvaWQgKnB1Yyk7Cit2b2lkIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX3JhbmdlKHRiX3BhZ2VfYWRkcl90IHN0YXJ0LCB0Yl9wYWdlX2FkZHJfdCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19jcHVfd3JpdGVfYWNjZXNzKTsKK3ZvaWQgdGJfaW52YWxpZGF0ZV9waHlzX3JhbmdlKHRiX3BhZ2VfYWRkcl90IHN0YXJ0LCB0Yl9wYWdlX2FkZHJfdCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfY3B1X3dyaXRlX2FjY2Vzcyk7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKy8qIGNwdXRsYi5jICovCit2b2lkIHRsYl9mbHVzaF9wYWdlKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcik7Cit2b2lkIHRsYl9mbHVzaChDUFVBcmNoU3RhdGUgKmVudiwgaW50IGZsdXNoX2dsb2JhbCk7Cit2b2lkIHRsYl9zZXRfcGFnZShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHZhZGRyLAorICAgICAgICAgICAgICAgICAgaHdhZGRyIHBhZGRyLCBpbnQgcHJvdCwKKyAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB0YXJnZXRfdWxvbmcgc2l6ZSk7Cit2b2lkIHRiX2ludmFsaWRhdGVfcGh5c19hZGRyKGh3YWRkciBhZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoX3BhZ2UoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2ZsdXNoKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgZmx1c2hfZ2xvYmFsKQoreworfQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFBoeXNQYWdlRGVzYyB7CisgICAgLyogb2Zmc2V0IGluIGhvc3QgbWVtb3J5IG9mIHRoZSBwYWdlICsgaW9faW5kZXggaW4gdGhlIGxvdyBiaXRzICovCisgICAgcmFtX2FkZHJfdCBwaHlzX29mZnNldDsKKyAgICByYW1fYWRkcl90IHJlZ2lvbl9vZmZzZXQ7Cit9IFBoeXNQYWdlRGVzYzsKKworUGh5c1BhZ2VEZXNjICpwaHlzX3BhZ2VfZmluZChod2FkZHIgaW5kZXgpOworUGh5c1BhZ2VEZXNjICpwaHlzX3BhZ2VfZmluZF9hbGxvYyhod2FkZHIgaW5kZXgsIGludCBhbGxvYyk7CisKK2ludCBpb19tZW1fd2F0Y2g7CisKKyNkZWZpbmUgQ09ERV9HRU5fQUxJR04gICAgICAgICAgIDE2IC8qIG11c3QgYmUgPj0gb2YgdGhlIHNpemUgb2YgYSBpY2FjaGUgbGluZSAqLworCisjZGVmaW5lIENPREVfR0VOX1BIWVNfSEFTSF9CSVRTICAgICAxNQorI2RlZmluZSBDT0RFX0dFTl9QSFlTX0hBU0hfU0laRSAgICAgKDEgPDwgQ09ERV9HRU5fUEhZU19IQVNIX0JJVFMpCisKKy8qIGVzdGltYXRlZCBibG9jayBzaXplIGZvciBUQiBhbGxvY2F0aW9uICovCisvKiBYWFg6IHVzZSBhIHBlciBjb2RlIGF2ZXJhZ2UgY29kZSBmcmFnbWVudCBzaXplIGFuZCBtb2R1bGF0ZSBpdAorICAgYWNjb3JkaW5nIHRvIHRoZSBob3N0IENQVSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisjZGVmaW5lIENPREVfR0VOX0FWR19CTE9DS19TSVpFIDEyOAorI2Vsc2UKKyNkZWZpbmUgQ09ERV9HRU5fQVZHX0JMT0NLX1NJWkUgNjQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9BUkNIX1BQQykgXAorICAgIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykgXAorICAgIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSBcCisgICAgfHwgZGVmaW5lZChDT05GSUdfVENHX0lOVEVSUFJFVEVSKQorI2RlZmluZSBVU0VfRElSRUNUX0pVTVAKKyNlbmRpZgorCitzdHJ1Y3QgVHJhbnNsYXRpb25CbG9jayB7CisgICAgdGFyZ2V0X3Vsb25nIHBjOyAgIC8qIHNpbXVsYXRlZCBQQyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYmxvY2sgKEVJUCArIENTIGJhc2UpICovCisgICAgdGFyZ2V0X3Vsb25nIGNzX2Jhc2U7IC8qIENTIGJhc2UgZm9yIHRoaXMgYmxvY2sgKi8KKyAgICB1aW50NjRfdCBmbGFnczsgLyogZmxhZ3MgZGVmaW5pbmcgaW4gd2hpY2ggY29udGV4dCB0aGUgY29kZSB3YXMgZ2VuZXJhdGVkICovCisgICAgdWludDE2X3Qgc2l6ZTsgICAgICAvKiBzaXplIG9mIHRhcmdldCBjb2RlIGZvciB0aGlzIGJsb2NrICgxIDw9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIDw9IFRBUkdFVF9QQUdFX1NJWkUpICovCisgICAgdWludDE2X3QgY2ZsYWdzOyAgICAvKiBjb21waWxlIGZsYWdzICovCisjZGVmaW5lIENGX0NPVU5UX01BU0sgIDB4N2ZmZgorI2RlZmluZSBDRl9MQVNUX0lPICAgICAweDgwMDAgLyogTGFzdCBpbnNuIG1heSBiZSBhbiBJTyBhY2Nlc3MuICAqLworCisgICAgdWludDhfdCAqdGNfcHRyOyAgICAvKiBwb2ludGVyIHRvIHRoZSB0cmFuc2xhdGVkIGNvZGUgKi8KKyAgICAvKiBuZXh0IG1hdGNoaW5nIHRiIGZvciBwaHlzaWNhbCBhZGRyZXNzLiAqLworICAgIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICpwaHlzX2hhc2hfbmV4dDsKKyAgICAvKiBmaXJzdCBhbmQgc2Vjb25kIHBoeXNpY2FsIHBhZ2UgY29udGFpbmluZyBjb2RlLiBUaGUgbG93ZXIgYml0CisgICAgICAgb2YgdGhlIHBvaW50ZXIgdGVsbHMgdGhlIGluZGV4IGluIHBhZ2VfbmV4dFtdICovCisgICAgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnBhZ2VfbmV4dFsyXTsKKyAgICB0Yl9wYWdlX2FkZHJfdCBwYWdlX2FkZHJbMl07CisKKyAgICAvKiB0aGUgZm9sbG93aW5nIGRhdGEgYXJlIHVzZWQgdG8gZGlyZWN0bHkgY2FsbCBhbm90aGVyIFRCIGZyb20KKyAgICAgICB0aGUgY29kZSBvZiB0aGlzIG9uZS4gKi8KKyAgICB1aW50MTZfdCB0Yl9uZXh0X29mZnNldFsyXTsgLyogb2Zmc2V0IG9mIG9yaWdpbmFsIGp1bXAgdGFyZ2V0ICovCisjaWZkZWYgVVNFX0RJUkVDVF9KVU1QCisgICAgdWludDE2X3QgdGJfam1wX29mZnNldFs0XTsgLyogb2Zmc2V0IG9mIGp1bXAgaW5zdHJ1Y3Rpb24gKi8KKyNlbHNlCisgICAgdWludHB0cl90IHRiX25leHRbMl07IC8qIGFkZHJlc3Mgb2YganVtcCBnZW5lcmF0ZWQgY29kZSAqLworI2VuZGlmCisgICAgLyogbGlzdCBvZiBUQnMganVtcGluZyB0byB0aGlzIG9uZS4gVGhpcyBpcyBhIGNpcmN1bGFyIGxpc3QgdXNpbmcKKyAgICAgICB0aGUgdHdvIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHBvaW50ZXJzIHRvIHRlbGwgd2hhdCBpcworICAgICAgIHRoZSBuZXh0IHBvaW50ZXI6IDAgPSBqbXBfbmV4dFswXSwgMSA9IGptcF9uZXh0WzFdLCAyID0KKyAgICAgICBqbXBfZmlyc3QgKi8KKyAgICBzdHJ1Y3QgVHJhbnNsYXRpb25CbG9jayAqam1wX25leHRbMl07CisgICAgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKmptcF9maXJzdDsKKyAgICB1aW50MzJfdCBpY291bnQ7Cit9OworCisjaW5jbHVkZSAiZXhlYy9zcGlubG9jay5oIgorCit0eXBlZGVmIHN0cnVjdCBUQkNvbnRleHQgVEJDb250ZXh0OworCitzdHJ1Y3QgVEJDb250ZXh0IHsKKworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiczsKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0Yl9waHlzX2hhc2hbQ09ERV9HRU5fUEhZU19IQVNIX1NJWkVdOworICAgIGludCBuYl90YnM7CisgICAgLyogYW55IGFjY2VzcyB0byB0aGUgdGJzIG9yIHRoZSBwYWdlIHRhYmxlIG11c3QgdXNlIHRoaXMgbG9jayAqLworICAgIHNwaW5sb2NrX3QgdGJfbG9jazsKKworICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBpbnQgdGJfZmx1c2hfY291bnQ7CisgICAgaW50IHRiX3BoeXNfaW52YWxpZGF0ZV9jb3VudDsKKworICAgIGludCB0Yl9pbnZhbGlkYXRlZF9mbGFnOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGJfam1wX2NhY2hlX2hhc2hfcGFnZSh0YXJnZXRfdWxvbmcgcGMpCit7CisgICAgdGFyZ2V0X3Vsb25nIHRtcDsKKyAgICB0bXAgPSBwYyBeIChwYyA+PiAoVEFSR0VUX1BBR0VfQklUUyAtIFRCX0pNUF9QQUdFX0JJVFMpKTsKKyAgICByZXR1cm4gKHRtcCA+PiAoVEFSR0VUX1BBR0VfQklUUyAtIFRCX0pNUF9QQUdFX0JJVFMpKSAmIFRCX0pNUF9QQUdFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRiX2ptcF9jYWNoZV9oYXNoX2Z1bmModGFyZ2V0X3Vsb25nIHBjKQoreworICAgIHRhcmdldF91bG9uZyB0bXA7CisgICAgdG1wID0gcGMgXiAocGMgPj4gKFRBUkdFVF9QQUdFX0JJVFMgLSBUQl9KTVBfUEFHRV9CSVRTKSk7CisgICAgcmV0dXJuICgoKHRtcCA+PiAoVEFSR0VUX1BBR0VfQklUUyAtIFRCX0pNUF9QQUdFX0JJVFMpKSAmIFRCX0pNUF9QQUdFX01BU0spCisJICAgIHwgKHRtcCAmIFRCX0pNUF9BRERSX01BU0spKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGJfcGh5c19oYXNoX2Z1bmModGJfcGFnZV9hZGRyX3QgcGMpCit7CisgICAgcmV0dXJuIChwYyA+PiAyKSAmIChDT0RFX0dFTl9QSFlTX0hBU0hfU0laRSAtIDEpOworfQorCit2b2lkIHRiX2ZyZWUoVHJhbnNsYXRpb25CbG9jayAqdGIpOwordm9pZCB0Yl9mbHVzaChDUFVBcmNoU3RhdGUgKmVudik7Cit2b2lkIHRiX2xpbmtfcGh5cyhUcmFuc2xhdGlvbkJsb2NrICp0YiwKKyAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBwaHlzX3BjLCB0YXJnZXRfdWxvbmcgcGh5c19wYWdlMik7Cit2b2lkIHRiX3BoeXNfaW52YWxpZGF0ZShUcmFuc2xhdGlvbkJsb2NrICp0YiwgdGJfcGFnZV9hZGRyX3QgcGFnZV9hZGRyKTsKK3ZvaWQgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfZmFzdDAoaHdhZGRyIHN0YXJ0LCBpbnQgbGVuKTsKKworZXh0ZXJuIHVpbnQ4X3QgKmNvZGVfZ2VuX3B0cjsKK2V4dGVybiBpbnQgY29kZV9nZW5fbWF4X2Jsb2NrczsKKworI2lmIGRlZmluZWQoVVNFX0RJUkVDVF9KVU1QKQorCisjaWYgZGVmaW5lZChDT05GSUdfVENHX0lOVEVSUFJFVEVSKQorc3RhdGljIGlubGluZSB2b2lkIHRiX3NldF9qbXBfdGFyZ2V0MSh1aW50cHRyX3Qgam1wX2FkZHIsIHVpbnRwdHJfdCBhZGRyKQoreworICAgIC8qIHBhdGNoIHRoZSBicmFuY2ggZGVzdGluYXRpb24gKi8KKyAgICAqKHVpbnQzMl90ICopam1wX2FkZHIgPSBhZGRyIC0gKGptcF9hZGRyICsgNCk7CisgICAgLyogbm8gbmVlZCB0byBmbHVzaCBpY2FjaGUgZXhwbGljaXRseSAqLworfQorI2VsaWYgZGVmaW5lZChfQVJDSF9QUEMpCit2b2lkIHBwY190Yl9zZXRfam1wX3RhcmdldCh1bnNpZ25lZCBsb25nIGptcF9hZGRyLCB1bnNpZ25lZCBsb25nIGFkZHIpOworI2RlZmluZSB0Yl9zZXRfam1wX3RhcmdldDEgcHBjX3RiX3NldF9qbXBfdGFyZ2V0CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgaW5saW5lIHZvaWQgdGJfc2V0X2ptcF90YXJnZXQxKHVpbnRwdHJfdCBqbXBfYWRkciwgdWludHB0cl90IGFkZHIpCit7CisgICAgLyogcGF0Y2ggdGhlIGJyYW5jaCBkZXN0aW5hdGlvbiAqLworICAgICoodWludDMyX3QgKilqbXBfYWRkciA9IGFkZHIgLSAoam1wX2FkZHIgKyA0KTsKKyAgICAvKiBubyBuZWVkIHRvIGZsdXNoIGljYWNoZSBleHBsaWNpdGx5ICovCit9CisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKQordm9pZCBhYXJjaDY0X3RiX3NldF9qbXBfdGFyZ2V0KHVpbnRwdHJfdCBqbXBfYWRkciwgdWludHB0cl90IGFkZHIpOworI2RlZmluZSB0Yl9zZXRfam1wX3RhcmdldDEgYWFyY2g2NF90Yl9zZXRfam1wX3RhcmdldAorI2VsaWYgZGVmaW5lZChfX2FybV9fKQorc3RhdGljIGlubGluZSB2b2lkIHRiX3NldF9qbXBfdGFyZ2V0MSh1aW50cHRyX3Qgam1wX2FkZHIsIHVpbnRwdHJfdCBhZGRyKQoreworI2lmICFRRU1VX0dOVUNfUFJFUkVRKDQsIDEpCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBfYmVnIF9fYXNtICgiYTEiKTsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9lbmQgX19hc20gKCJhMiIpOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgX2ZsZyBfX2FzbSAoImEzIik7CisjZW5kaWYKKworICAgIC8qIHdlIGNvdWxkIHVzZSBhIGxkciBwYywgW3BjLCAjLTRdIGtpbmQgb2YgYnJhbmNoIGFuZCBhdm9pZCB0aGUgZmx1c2ggKi8KKyAgICAqKHVpbnQzMl90ICopam1wX2FkZHIgPQorICAgICAgICAoKih1aW50MzJfdCAqKWptcF9hZGRyICYgfjB4ZmZmZmZmKQorICAgICAgICB8ICgoKGFkZHIgLSAoam1wX2FkZHIgKyA4KSkgPj4gMikgJiAweGZmZmZmZik7CisKKyNpZiBRRU1VX0dOVUNfUFJFUkVRKDQsIDEpCisgICAgX19idWlsdGluX19fY2xlYXJfY2FjaGUoKGNoYXIgKikgam1wX2FkZHIsIChjaGFyICopIGptcF9hZGRyICsgNCk7CisjZWxzZQorICAgIC8qIGZsdXNoIGljYWNoZSAqLworICAgIF9iZWcgPSBqbXBfYWRkcjsKKyAgICBfZW5kID0gam1wX2FkZHIgKyA0OworICAgIF9mbGcgPSAwOworICAgIF9fYXNtIF9fdm9sYXRpbGVfXyAoInN3aSAweDlmMDAwMiIgOiA6ICJyIiAoX2JlZyksICJyIiAoX2VuZCksICJyIiAoX2ZsZykpOworI2VuZGlmCit9CisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKK3ZvaWQgdGJfc2V0X2ptcF90YXJnZXQxKHVpbnRwdHJfdCBqbXBfYWRkciwgdWludHB0cl90IGFkZHIpOworI2Vsc2UKKyNlcnJvciB0Yl9zZXRfam1wX3RhcmdldDEgaXMgbWlzc2luZworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Yl9zZXRfam1wX3RhcmdldChUcmFuc2xhdGlvbkJsb2NrICp0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgdWludHB0cl90IGFkZHIpCit7CisgICAgdWludDE2X3Qgb2Zmc2V0ID0gdGItPnRiX2ptcF9vZmZzZXRbbl07CisgICAgdGJfc2V0X2ptcF90YXJnZXQxKCh1aW50cHRyX3QpKHRiLT50Y19wdHIgKyBvZmZzZXQpLCBhZGRyKTsKKyAgICBvZmZzZXQgPSB0Yi0+dGJfam1wX29mZnNldFtuICsgMl07CisgICAgaWYgKG9mZnNldCAhPSAweGZmZmYpCisgICAgICAgIHRiX3NldF9qbXBfdGFyZ2V0MSgodWludHB0cl90KSh0Yi0+dGNfcHRyICsgb2Zmc2V0KSwgYWRkcik7Cit9CisKKyNlbHNlCisKKy8qIHNldCB0aGUganVtcCB0YXJnZXQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Yl9zZXRfam1wX3RhcmdldChUcmFuc2xhdGlvbkJsb2NrICp0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgdWludHB0cl90IGFkZHIpCit7CisgICAgdGItPnRiX25leHRbbl0gPSBhZGRyOworfQorCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHRiX2FkZF9qdW1wKFRyYW5zbGF0aW9uQmxvY2sgKnRiLCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbkJsb2NrICp0Yl9uZXh0KQoreworICAgIC8qIE5PVEU6IHRoaXMgdGVzdCBpcyBvbmx5IG5lZWRlZCBmb3IgdGhyZWFkIHNhZmV0eSAqLworICAgIGlmICghdGItPmptcF9uZXh0W25dKSB7CisgICAgICAgIC8qIHBhdGNoIHRoZSBuYXRpdmUganVtcCBhZGRyZXNzICovCisgICAgICAgIHRiX3NldF9qbXBfdGFyZ2V0KHRiLCBuLCAodWludHB0cl90KXRiX25leHQtPnRjX3B0cik7CisKKyAgICAgICAgLyogYWRkIGluIFRCIGptcCBjaXJjdWxhciBsaXN0ICovCisgICAgICAgIHRiLT5qbXBfbmV4dFtuXSA9IHRiX25leHQtPmptcF9maXJzdDsKKyAgICAgICAgdGJfbmV4dC0+am1wX2ZpcnN0ID0gKFRyYW5zbGF0aW9uQmxvY2sgKikoKHVpbnRwdHJfdCkodGIpIHwgKG4pKTsKKyAgICB9Cit9CisKKy8qIEdFVFJBIGlzIHRoZSB0cnVlIHRhcmdldCBvZiB0aGUgcmV0dXJuIGluc3RydWN0aW9uIHRoYXQgd2UnbGwgZXhlY3V0ZSwKKyAgIGRlZmluZWQgaGVyZSBmb3Igc2ltcGxpY2l0eSBvZiBkZWZpbmluZyB0aGUgZm9sbG93LXVwIG1hY3Jvcy4gICovCisjaWYgZGVmaW5lZChDT05GSUdfVENHX0lOVEVSUFJFVEVSKQorZXh0ZXJuIHVpbnRwdHJfdCB0Y2lfdGJfcHRyOworIyBkZWZpbmUgR0VUUkEoKSB0Y2lfdGJfcHRyCisjZWxzZQorIyBkZWZpbmUgR0VUUkEoKSBcCisgICAgKCh1aW50cHRyX3QpX19idWlsdGluX2V4dHJhY3RfcmV0dXJuX2FkZHIoX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKSkKKyNlbmRpZgorCisvKiBUaGUgdHJ1ZSByZXR1cm4gYWRkcmVzcyB3aWxsIG9mdGVuIHBvaW50IHRvIGEgaG9zdCBpbnNuIHRoYXQgaXMgcGFydCBvZgorICAgdGhlIG5leHQgdHJhbnNsYXRlZCBndWVzdCBpbnNuLiAgQWRqdXN0IHRoZSBhZGRyZXNzIGJhY2t3YXJkIHRvIHBvaW50IHRvCisgICB0aGUgbWlkZGxlIG9mIHRoZSBjYWxsIGluc24uICBTdWJ0cmFjdGluZyBvbmUgd291bGQgZG8gdGhlIGpvYiBleGNlcHQgZm9yCisgICBzZXZlcmFsIGNvbXByZXNzZWQgbW9kZSBhcmNoaXRlY3R1cmVzIChhcm0sIG1pcHMpIHdoaWNoIHNldCB0aGUgbG93IGJpdAorICAgdG8gaW5kaWNhdGUgdGhlIGNvbXByZXNzZWQgbW9kZTsgc3VidHJhY3RpbmcgdHdvIHdvcmtzIGFyb3VuZCB0aGF0LiAgSXQKKyAgIGlzIGFsc28gdGhlIGNhc2UgdGhhdCB0aGVyZSBhcmUgbm8gaG9zdCBpc2FzIHRoYXQgY29udGFpbiBhIGNhbGwgaW5zbgorICAgc21hbGxlciB0aGFuIDQgYnl0ZXMsIHNvIHdlIGRvbid0IHdvcnJ5IGFib3V0IHNwZWNpYWwtY2FzaW5nIHRoaXMuICAqLworI2lmIGRlZmluZWQoQ09ORklHX1RDR19JTlRFUlBSRVRFUikKKyMgZGVmaW5lIEdFVFBDX0FESiAgIDAKKyNlbHNlCisjIGRlZmluZSBHRVRQQ19BREogICAyCisjZW5kaWYKKworI2RlZmluZSBHRVRQQygpICAoR0VUUkEoKSAtIEdFVFBDX0FESikKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisKK3ZvaWQgcGh5c19tZW1fc2V0X2FsbG9jKHZvaWQgKigqYWxsb2MpKHNpemVfdCkpOworCitUcmFuc2xhdGlvbkJsb2NrICp0Yl9maW5kX3BjKHVpbnRwdHJfdCBwY19wdHIpOworCit1aW50NjRfdCBpb19tZW1fcmVhZChpbnQgaW5kZXgsIGh3YWRkciBhZGRyLCB1bnNpZ25lZCBzaXplKTsKK3ZvaWQgaW9fbWVtX3dyaXRlKGludCBpbmRleCwgaHdhZGRyIGFkZHIsIHVpbnQ2NF90IHZhbHVlLCB1bnNpZ25lZCBzaXplKTsKKworZXh0ZXJuIENQVVdyaXRlTWVtb3J5RnVuYyAqX2lvX21lbV93cml0ZVtJT19NRU1fTkJfRU5UUklFU11bNF07CitleHRlcm4gQ1BVUmVhZE1lbW9yeUZ1bmMgKl9pb19tZW1fcmVhZFtJT19NRU1fTkJfRU5UUklFU11bNF07CitleHRlcm4gdm9pZCAqaW9fbWVtX29wYXF1ZVtJT19NRU1fTkJfRU5UUklFU107CisKK3ZvaWQgdGxiX2ZpbGwoQ1BVQXJjaFN0YXRlICplbnYxLCB0YXJnZXRfdWxvbmcgYWRkciwgaW50IGlzX3dyaXRlLCBpbnQgbW11X2lkeCwKKyAgICAgICAgICAgICAgdWludHB0cl90IHJldGFkZHIpOworCit1aW50OF90IGhlbHBlcl9sZGJfY21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4KTsKK3VpbnQxNl90IGhlbHBlcl9sZHdfY21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4KTsKK3VpbnQzMl90IGhlbHBlcl9sZGxfY21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4KTsKK3VpbnQ2NF90IGhlbHBlcl9sZHFfY21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4KTsKKworI2RlZmluZSBBQ0NFU1NfVFlQRSAoTkJfTU1VX01PREVTICsgMSkKKyNkZWZpbmUgTUVNU1VGRklYIF9jb2RlCisKKyNkZWZpbmUgREFUQV9TSVpFIDEKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDIKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDQKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDgKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyN1bmRlZiBBQ0NFU1NfVFlQRQorI3VuZGVmIE1FTVNVRkZJWAorCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKK3N0YXRpYyBpbmxpbmUgdGJfcGFnZV9hZGRyX3QgZ2V0X3BhZ2VfYWRkcl9jb2RlKENQVUFyY2hTdGF0ZSAqZW52MSwgdGFyZ2V0X3Vsb25nIGFkZHIpCit7CisgICAgcmV0dXJuIGFkZHI7Cit9CisjZWxzZQorLyogY3B1dGxiLmMgKi8KK3RiX3BhZ2VfYWRkcl90IGdldF9wYWdlX2FkZHJfY29kZShDUFVBcmNoU3RhdGUgKmVudjEsIHRhcmdldF91bG9uZyBhZGRyKTsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKENQVURlYnVnRXhjcEhhbmRsZXIpKENQVUFyY2hTdGF0ZSAqZW52KTsKKwordm9pZCBjcHVfc2V0X2RlYnVnX2V4Y3BfaGFuZGxlcihDUFVEZWJ1Z0V4Y3BIYW5kbGVyICpoYW5kbGVyKTsKKworLyogdmwuYyAqLworZXh0ZXJuIGludCBzaW5nbGVzdGVwOworCisvKiBjcHUtZXhlYy5jICovCitleHRlcm4gdm9sYXRpbGUgc2lnX2F0b21pY190IGV4aXRfcmVxdWVzdDsKKworLyogRGV0ZXJtaW5pc3RpYyBleGVjdXRpb24gcmVxdWlyZXMgdGhhdCBJTyBvbmx5IGJlIHBlcmZvcm1lZCBvbiB0aGUgbGFzdAorICAgaW5zdHJ1Y3Rpb24gb2YgYSBUQiBzbyB0aGF0IGludGVycnVwdHMgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuICAqLworc3RhdGljIGlubGluZSBpbnQgY2FuX2RvX2lvKENQVUFyY2hTdGF0ZSAqZW52KQoreworICAgIGlmICghdXNlX2ljb3VudCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSWYgbm90IGV4ZWN1dGluZyBjb2RlIHRoZW4gYXNzdW1lIHdlIGFyZSBvay4gICovCisgICAgaWYgKGVudi0+Y3VycmVudF90YiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gZW52LT5jYW5fZG9faW8gIT0gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9nZGJzdHViLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9nZGJzdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxMjJkMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2dkYnN0dWIuaApAQCAtMCwwICsxLDQzIEBACisjaWZuZGVmIEdEQlNUVUJfSAorI2RlZmluZSBHREJTVFVCX0gKKworI2RlZmluZSBERUZBVUxUX0dEQlNUVUJfUE9SVCAiMTIzNCIKKworLyogR0RCIGJyZWFrcG9pbnQvd2F0Y2hwb2ludCB0eXBlcyAqLworI2RlZmluZSBHREJfQlJFQUtQT0lOVF9TVyAgICAgICAgMAorI2RlZmluZSBHREJfQlJFQUtQT0lOVF9IVyAgICAgICAgMQorI2RlZmluZSBHREJfV0FUQ0hQT0lOVF9XUklURSAgICAgMgorI2RlZmluZSBHREJfV0FUQ0hQT0lOVF9SRUFEICAgICAgMworI2RlZmluZSBHREJfV0FUQ0hQT0lOVF9BQ0NFU1MgICAgNAorCisjaWZkZWYgTkVFRF9DUFVfSAorI2luY2x1ZGUgImNwdS5oIgorCit0eXBlZGVmIHZvaWQgKCpnZGJfc3lzY2FsbF9jb21wbGV0ZV9jYikoQ1BVU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcmV0LCB0YXJnZXRfdWxvbmcgZXJyKTsKKwordm9pZCBnZGJfZG9fc3lzY2FsbChnZGJfc3lzY2FsbF9jb21wbGV0ZV9jYiBjYiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IHVzZV9nZGJfc3lzY2FsbHModm9pZCk7Cit2b2lkIGdkYl9zZXRfc3RvcF9jcHUoQ1BVU3RhdGUgKmVudik7Cit2b2lkIGdkYl9leGl0KENQVUFyY2hTdGF0ZSAqLCBpbnQpOworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKK2ludCBnZGJfcXVldWVzaWcgKHZvaWQpOworaW50IGdkYl9oYW5kbGVzaWcgKENQVVN0YXRlICosIGludCk7Cit2b2lkIGdkYl9zaWduYWxsZWQoQ1BVQXJjaFN0YXRlICosIGludCk7Cit2b2lkIGdkYnNlcnZlcl9mb3JrKENQVUFyY2hTdGF0ZSAqKTsKKyNlbmRpZgorLyogR2V0IG9yIHNldCBhIHJlZ2lzdGVyLiAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcmVnaXN0ZXIuICAqLwordHlwZWRlZiBpbnQgKCpnZGJfcmVnX2NiKShDUFVBcmNoU3RhdGUgKmVudiwgdWludDhfdCAqYnVmLCBpbnQgcmVnKTsKK3ZvaWQgZ2RiX3JlZ2lzdGVyX2NvcHJvY2Vzc29yKENQVVN0YXRlICpjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfcmVnX2NiIGdldF9yZWcsIGdkYl9yZWdfY2Igc2V0X3JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcmVncywgY29uc3QgY2hhciAqeG1sLCBpbnQgZ19wb3MpOworCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKK2ludCBnZGJzZXJ2ZXJfc3RhcnQoaW50KTsKKyNlbHNlCitpbnQgZ2Ric2VydmVyX3N0YXJ0KGNvbnN0IGNoYXIgKnBvcnQpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvZ2VuLWljb3VudC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvZ2VuLWljb3VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTRiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9nZW4taWNvdW50LmgKQEAgLTAsMCArMSw2NSBAQAorI2lmbmRlZiBHRU5fSUNPVU5UX0gKKyNkZWZpbmUgR0VOX0lDT1VOVF9IIDEKKworI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKworLyogSGVscGVycyBmb3IgaW5zdHJ1Y3Rpb24gY291bnRpbmcgY29kZSBnZW5lcmF0aW9uLiAgKi8KKworc3RhdGljIFRDR0FyZyAqaWNvdW50X2FyZzsKK3N0YXRpYyBpbnQgaWNvdW50X2xhYmVsOworc3RhdGljIGludCBleGl0cmVxX2xhYmVsOworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2ljb3VudF9zdGFydCh2b2lkKQoreworICAgIFRDR3ZfaTMyIGNvdW50OworICAgIFRDR3ZfaTMyIGZsYWc7CisKKyAgICBleGl0cmVxX2xhYmVsID0gZ2VuX25ld19sYWJlbCgpOworICAgIGZsYWcgPSB0Y2dfdGVtcF9sb2NhbF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9sZF9pMzIoZmxhZywgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVTdGF0ZSwgdGNnX2V4aXRfcmVxKSAtIEVOVl9PRkZTRVQpOworICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfTkUsIGZsYWcsIDAsIGV4aXRyZXFfbGFiZWwpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZsYWcpOworCisgICAgaWYgKCF1c2VfaWNvdW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpY291bnRfbGFiZWwgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgY291bnQgPSB0Y2dfdGVtcF9sb2NhbF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9sZF9pMzIoY291bnQsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFyY2hTdGF0ZSwgaWNvdW50X2RlY3IudTMyKSk7CisgICAgLyogVGhpcyBpcyBhIGhvcnJpZCBoYWNrIHRvIGFsbG93IGZpeGluZyB1cCB0aGUgdmFsdWUgbGF0ZXIuICAqLworICAgIGljb3VudF9hcmcgPSB0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0ciArIDE7CisgICAgdGNnX2dlbl9zdWJpX2kzMihjb3VudCwgY291bnQsIDB4ZGVhZGJlZWYpOworCisgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9MVCwgY291bnQsIDAsIGljb3VudF9sYWJlbCk7CisgICAgdGNnX2dlbl9zdDE2X2kzMihjb3VudCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQXJjaFN0YXRlLCBpY291bnRfZGVjci51MTYubG93KSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIoY291bnQpOworfQorCitzdGF0aWMgdm9pZCBnZW5faWNvdW50X2VuZChUcmFuc2xhdGlvbkJsb2NrICp0YiwgaW50IG51bV9pbnNucykKK3sKKyAgICBnZW5fc2V0X2xhYmVsKGV4aXRyZXFfbGFiZWwpOworICAgIHRjZ19nZW5fZXhpdF90YigodWludHB0cl90KXRiICsgVEJfRVhJVF9SRVFVRVNURUQpOworCisgICAgaWYgKHVzZV9pY291bnQpIHsKKyAgICAgICAgKmljb3VudF9hcmcgPSBudW1faW5zbnM7CisgICAgICAgIGdlbl9zZXRfbGFiZWwoaWNvdW50X2xhYmVsKTsKKyAgICAgICAgdGNnX2dlbl9leGl0X3RiKCh1aW50cHRyX3QpdGIgKyBUQl9FWElUX0lDT1VOVF9FWFBJUkVEKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5faW9fc3RhcnQodm9pZCkKK3sKKyAgICBUQ0d2X2kzMiB0bXAgPSB0Y2dfY29uc3RfaTMyKDEpOworICAgIHRjZ19nZW5fc3RfaTMyKHRtcCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQXJjaFN0YXRlLCBjYW5fZG9faW8pKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2lvX2VuZCh2b2lkKQoreworICAgIFRDR3ZfaTMyIHRtcCA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgdGNnX2dlbl9zdF9pMzIodG1wLCBjcHVfZW52LCBvZmZzZXRvZihDUFVBcmNoU3RhdGUsIGNhbl9kb19pbykpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvaGF4LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9oYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY2MDkyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvaGF4LmgKQEAgLTAsMCArMSw0MCBAQAorLyogaGVhZGVyIHRvIGJlIGluY2x1ZGVkIGluIG5vbi1IQVgtc3BlY2lmaWMgY29kZSAqLworI2lmbmRlZiBfSEFYX0gKKyNkZWZpbmUgX0hBWF9ICisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImNwdS5oIgorCitleHRlcm4gaW50IGhheF9kaXNhYmxlZDsKK3N0cnVjdCBoYXhfdmNwdV9zdGF0ZTsKKworI2lmZGVmIENPTkZJR19IQVgKK2ludCBoYXhfZW5hYmxlZCh2b2lkKTsKK2ludCBoYXhfZ2V0X21heF9yYW0odWludDY0X3QqIG1heF9yYW0pOworaW50IGhheF9zZXRfcmFtc2l6ZSh1aW50NjRfdCByYW1zaXplKTsKK2ludCBoYXhfaW5pdChpbnQgc21wX2NwdXMpOworaW50IGhheF9pbml0X3ZjcHUoQ1BVU3RhdGUgKmNwdSk7CisvKiBFeGVjdXRlIHZjcHUgaW4gbm9uLXJvb3QgbW9kZSAqLworaW50IGhheF92Y3B1X2V4ZWMoQ1BVU3RhdGUgKmNwdSk7CisvKiBTeW5jIHZjcHUgc3RhdGUgd2l0aCBIQVggZHJpdmVyICovCitpbnQgaGF4X3N5bmNfdmNwdXModm9pZCk7Cit2b2lkIGhheF92Y3B1X3N5bmNfc3RhdGUoQ1BVU3RhdGUgKmNwdSwgaW50IG1vZGlmaWVkKTsKK2ludCBoYXhfcG9wdWxhdGVfcmFtKHVpbnQ2NF90IHZhLCB1aW50MzJfdCBzaXplKTsKK2ludCBoYXhfc2V0X3BoeXNfbWVtKGh3YWRkciBzdGFydF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBzaXplLCByYW1fYWRkcl90IHBoeXNfb2Zmc2V0KTsKKy8qIENoZWNrIGlmIFFFTVUgbmVlZCBlbXVsYXRlIGd1ZXN0IGV4ZWN1dGlvbiAqLworaW50IGhheF92Y3B1X2VtdWxhdGlvbl9tb2RlKENQVVN0YXRlICpjcHUpOworaW50IGhheF9zdG9wX2VtdWxhdGlvbihDUFVTdGF0ZSAqY3B1KTsKK2ludCBoYXhfc3RvcF90cmFuc2xhdGUoQ1BVU3RhdGUgKmNwdSk7CitpbnQgaGF4X2FyY2hfZ2V0X3JlZ2lzdGVycyhDUFVTdGF0ZSAqY3B1KTsKK3ZvaWQgaGF4X3JhaXNlX2V2ZW50KENQVVN0YXRlICpjcHUpOwordm9pZCBoYXhfcmVzZXRfdmNwdV9zdGF0ZSh2b2lkICpvcGFxdWUpOworCisjaW5jbHVkZSAidGFyZ2V0LWkzODYvaGF4LWludGVyZmFjZS5oIgorCisjZWxzZQorI2RlZmluZSBoYXhfZW5hYmxlZCgpICgwKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvaHdhZGRyLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9od2FkZHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjYyZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvaHdhZGRyLmgKQEAgLTAsMCArMSwyMiBAQAorLyogRGVmaW5lIGh3YWRkciBpZiBpdCBleGlzdHMuICAqLworCisjaWZuZGVmIEhXQUREUl9ICisjZGVmaW5lIEhXQUREUl9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBIV0FERFJfQklUUyA2NAorLyogaHdhZGRyIGlzIHRoZSB0eXBlIG9mIGEgcGh5c2ljYWwgYWRkcmVzcyAoaXRzIHNpemUgY2FuCisgICBiZSBkaWZmZXJlbnQgZnJvbSAndGFyZ2V0X3Vsb25nJykuICAqLworCit0eXBlZGVmIHVpbnQ2NF90IGh3YWRkcjsKKyNkZWZpbmUgSFdBRERSX01BWCBVSU5UNjRfTUFYCisjZGVmaW5lIFRBUkdFVF9GTVRfcGx4ICIlMDE2IiBQUkl4NjQKKyNkZWZpbmUgSFdBRERSX1BSSWQgUFJJZDY0CisjZGVmaW5lIEhXQUREUl9QUklpIFBSSWk2NAorI2RlZmluZSBIV0FERFJfUFJJbyBQUklvNjQKKyNkZWZpbmUgSFdBRERSX1BSSXUgUFJJdTY0CisjZGVmaW5lIEhXQUREUl9QUkl4IFBSSXg2NAorI2RlZmluZSBIV0FERFJfUFJJWCBQUklYNjQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9pb3BvcnQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL2lvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkM2M4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9pb3BvcnQuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogZGVmaW5lcyBpb3BvcnQgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElPIHBvcnRzIEFQSQorICovCisKKyNpZm5kZWYgSU9QT1JUX0gKKyNkZWZpbmUgSU9QT1JUX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKK3R5cGVkZWYgdWludDMyX3QgcGlvX2FkZHJfdDsKKyNkZWZpbmUgRk1UX3Bpb2FkZHIgICAgIFBSSXgzMgorCisjZGVmaW5lIE1BWF9JT1BPUlRTICAgICAoNjQgKiAxMDI0KQorI2RlZmluZSBJT1BPUlRTX01BU0sgICAgKE1BWF9JT1BPUlRTIC0gMSkKKworLyogVGhlc2Ugc2hvdWxkIHJlYWxseSBiZSBpbiBpc2EuaCwgYnV0IGFyZSBoZXJlIHRvIG1ha2UgcGMuaCBoYXBweS4gICovCit0eXBlZGVmIHZvaWQgKElPUG9ydFdyaXRlRnVuYykodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyZXNzLCB1aW50MzJfdCBkYXRhKTsKK3R5cGVkZWYgdWludDMyX3QgKElPUG9ydFJlYWRGdW5jKSh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHJlc3MpOworCitpbnQgcmVnaXN0ZXJfaW9wb3J0X3JlYWQocGlvX2FkZHJfdCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU9Qb3J0UmVhZEZ1bmMgKmZ1bmMsIHZvaWQgKm9wYXF1ZSk7CitpbnQgcmVnaXN0ZXJfaW9wb3J0X3dyaXRlKHBpb19hZGRyX3Qgc3RhcnQsIGludCBsZW5ndGgsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJT1BvcnRXcml0ZUZ1bmMgKmZ1bmMsIHZvaWQgKm9wYXF1ZSk7Cit2b2lkIGlzYV91bmFzc2lnbl9pb3BvcnQocGlvX2FkZHJfdCBzdGFydCwgaW50IGxlbmd0aCk7CisKKwordm9pZCBjcHVfb3V0YihwaW9fYWRkcl90IGFkZHIsIHVpbnQ4X3QgdmFsKTsKK3ZvaWQgY3B1X291dHcocGlvX2FkZHJfdCBhZGRyLCB1aW50MTZfdCB2YWwpOwordm9pZCBjcHVfb3V0bChwaW9fYWRkcl90IGFkZHIsIHVpbnQzMl90IHZhbCk7Cit1aW50OF90IGNwdV9pbmIocGlvX2FkZHJfdCBhZGRyKTsKK3VpbnQxNl90IGNwdV9pbncocGlvX2FkZHJfdCBhZGRyKTsKK3VpbnQzMl90IGNwdV9pbmwocGlvX2FkZHJfdCBhZGRyKTsKKworI2VuZGlmIC8qIElPUE9SVF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9wb2lzb24uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3BvaXNvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWQxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9wb2lzb24uaApAQCAtMCwwICsxLDcwIEBACisvKiBQb2lzb24gaWRlbnRpZmllcnMgdGhhdCBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBidWlsZGluZworICAgdGFyZ2V0IGluZGVwZW5kZW50IGRldmljZSBjb2RlLiAgKi8KKworI2lmbmRlZiBIV19QT0lTT05fSAorI2RlZmluZSBIV19QT0lTT05fSAorI2lmZGVmIF9fR05VQ19fCisKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfSTM4NgorI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9YODZfNjQKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfQUxQSEEKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfQVJNCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX0NSSVMKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfTE0zMgorI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9NNjhLCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX01JUFMKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfTUlQUzY0CisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX09QRU5SSVNDCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX1BQQworI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9QUENFTUIKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfUFBDNjQKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfQUJJMzIKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfU0g0CisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX1NQQVJDCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX1NQQVJDNjQKKworI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyNwcmFnbWEgR0NDIHBvaXNvbiBCU1dBUF9ORUVERUQKKworI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9MT05HX0JJVFMKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfRk1UX2x4CisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX0ZNVF9sZAorCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX1BBR0VfU0laRQorI3ByYWdtYSBHQ0MgcG9pc29uIFRBUkdFVF9QQUdFX01BU0sKKyNwcmFnbWEgR0NDIHBvaXNvbiBUQVJHRVRfUEFHRV9CSVRTCisjcHJhZ21hIEdDQyBwb2lzb24gVEFSR0VUX1BBR0VfQUxJR04KKworI3ByYWdtYSBHQ0MgcG9pc29uIENQVU9sZFN0YXRlCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVQXJjaFN0YXRlCisjcHJhZ21hIEdDQyBwb2lzb24gZW52CisKKyNwcmFnbWEgR0NDIHBvaXNvbiBsZHV3X3BoeXMKKyNwcmFnbWEgR0NDIHBvaXNvbiBsZGxfcGh5cworI3ByYWdtYSBHQ0MgcG9pc29uIGxkcV9waHlzCisjcHJhZ21hIEdDQyBwb2lzb24gc3RsX3BoeXNfbm90ZGlydHkKKyNwcmFnbWEgR0NDIHBvaXNvbiBzdHFfcGh5c19ub3RkaXJ0eQorI3ByYWdtYSBHQ0MgcG9pc29uIHN0d19waHlzCisjcHJhZ21hIEdDQyBwb2lzb24gc3RsX3BoeXMKKyNwcmFnbWEgR0NDIHBvaXNvbiBzdHFfcGh5cworCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9IQVJECisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9FWElUVEIKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX1RJTUVSCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9GSVEKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX0hBTFQKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX1NNSQorI3ByYWdtYSBHQ0MgcG9pc29uIENQVV9JTlRFUlJVUFRfREVCVUcKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX1ZJUlEKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX05NSQorI3ByYWdtYSBHQ0MgcG9pc29uIENQVV9JTlRFUlJVUFRfVEdUX0VYVF8wCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzEKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX1RHVF9FWFRfMgorI3ByYWdtYSBHQ0MgcG9pc29uIENQVV9JTlRFUlJVUFRfVEdUX0VYVF8zCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzQKKyNwcmFnbWEgR0NDIHBvaXNvbiBDUFVfSU5URVJSVVBUX1RHVF9JTlRfMAorI3ByYWdtYSBHQ0MgcG9pc29uIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8xCisjcHJhZ21hIEdDQyBwb2lzb24gQ1BVX0lOVEVSUlVQVF9UR1RfSU5UXzIKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3JhbV9hZGRyLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9yYW1fYWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTZhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9yYW1fYWRkci5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogRGVjbGFyYXRpb25zIGZvciBjcHUgcGh5c2ljYWwgbWVtb3J5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDExIFJlZCBIYXQsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzCisgKgorICogQXV0aG9yczoKKyAqICBBdmkgS2l2aXR5IDxhdmlAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IKKyAqIGxhdGVyLiAgU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBpcyBmb3IgdXNlIGJ5IGV4ZWMuYyBhbmQgbWVtb3J5LmMgT05MWS4gIERvIG5vdCBpbmNsdWRlIGl0LgorICogVGhlIGZ1bmN0aW9ucyBkZWNsYXJlZCBoZXJlIHdpbGwgYmUgcmVtb3ZlZCBzb29uLgorICovCisKKyNpZm5kZWYgUkFNX0FERFJfSAorI2RlZmluZSBSQU1fQUREUl9ICisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorI2luY2x1ZGUgImV4ZWMvY3B1LWFsbC5oIgorI2luY2x1ZGUgImh3L3hlbi94ZW4uaCIKKyNpbmNsdWRlICJxZW11L2JpdG1hcC5oIgorI2luY2x1ZGUgInFlbXUvYml0b3BzLmgiCisKK3JhbV9hZGRyX3QgcWVtdV9yYW1fYWxsb2NfZnJvbV9wdHIoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBzaXplLCB2b2lkICpob3N0KTsKK3JhbV9hZGRyX3QgcWVtdV9yYW1fYWxsb2MoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgY2hhciAqbmFtZSwgcmFtX2FkZHJfdCBzaXplKTsKKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmFtIGxvY2FsIHRvIGEgZGV2aWNlLiAgKi8KK3ZvaWQgKnFlbXVfZ2V0X3JhbV9wdHIocmFtX2FkZHJfdCBhZGRyKTsKKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgcmFtIGxvY2FsIHRvIGEgZGV2aWNlLiAgKi8KKy8qIFNhbWUgYnV0IHNsb3dlciwgdG8gdXNlIGZvciBtaWdyYXRpb24sIHdoZXJlIHRoZSBvcmRlciBvZgorICogUkFNQmxvY2tzIG11c3Qgbm90IGNoYW5nZS4gKi8KK3ZvaWQgKnFlbXVfc2FmZV9yYW1fcHRyKHJhbV9hZGRyX3QgYWRkcik7CisvKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBieSBkZXZpY2VzLiAgKi8KK2ludCBxZW11X3JhbV9hZGRyX2Zyb21faG9zdCh2b2lkICpwdHIsIHJhbV9hZGRyX3QgKnJhbV9hZGRyKTsKK3ZvaWQgcWVtdV9yYW1fZnJlZShyYW1fYWRkcl90IGFkZHIpOwordm9pZCBxZW11X3JhbV9yZW1hcChyYW1fYWRkcl90IGFkZHIsIHJhbV9hZGRyX3QgbGVuZ3RoKTsKK3JhbV9hZGRyX3QgcWVtdV9yYW1fYWRkcl9mcm9tX2hvc3Rfbm9mYWlsKHZvaWQgKnB0cik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5KHJhbV9hZGRyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNsaWVudCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGVuZCwgcGFnZSwgbmV4dDsKKworICAgIGFzc2VydChjbGllbnQgPCBESVJUWV9NRU1PUllfTlVNKTsKKworICAgIGVuZCA9IFRBUkdFVF9QQUdFX0FMSUdOKHN0YXJ0ICsgbGVuZ3RoKSA+PiBUQVJHRVRfUEFHRV9CSVRTOworICAgIHBhZ2UgPSBzdGFydCA+PiBUQVJHRVRfUEFHRV9CSVRTOworICAgIG5leHQgPSBmaW5kX25leHRfYml0KHJhbV9saXN0LmRpcnR5X21lbW9yeVtjbGllbnRdLCBlbmQsIHBhZ2UpOworCisgICAgcmV0dXJuIG5leHQgPCBlbmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcHVfcGh5c2ljYWxfbWVtb3J5X2dldF9kaXJ0eV9mbGFnKHJhbV9hZGRyX3QgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNsaWVudCkKK3sKKyAgICByZXR1cm4gY3B1X3BoeXNpY2FsX21lbW9yeV9nZXRfZGlydHkoYWRkciwgMSwgY2xpZW50KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGNwdV9waHlzaWNhbF9tZW1vcnlfaXNfY2xlYW4ocmFtX2FkZHJfdCBhZGRyKQoreworICAgIGJvb2wgdmdhID0gY3B1X3BoeXNpY2FsX21lbW9yeV9nZXRfZGlydHlfZmxhZyhhZGRyLCBESVJUWV9NRU1PUllfVkdBKTsKKyAgICBib29sIGNvZGUgPSBjcHVfcGh5c2ljYWxfbWVtb3J5X2dldF9kaXJ0eV9mbGFnKGFkZHIsIERJUlRZX01FTU9SWV9DT0RFKTsKKyAgICBib29sIG1pZ3JhdGlvbiA9CisgICAgICAgIGNwdV9waHlzaWNhbF9tZW1vcnlfZ2V0X2RpcnR5X2ZsYWcoYWRkciwgRElSVFlfTUVNT1JZX01JR1JBVElPTik7CisgICAgcmV0dXJuICEodmdhICYmIGNvZGUgJiYgbWlncmF0aW9uKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X2ZsYWcocmFtX2FkZHJfdCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2xpZW50KQoreworICAgIGFzc2VydChjbGllbnQgPCBESVJUWV9NRU1PUllfTlVNKTsKKyAgICBzZXRfYml0KGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUywgcmFtX2xpc3QuZGlydHlfbWVtb3J5W2NsaWVudF0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfcmFuZ2UocmFtX2FkZHJfdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IGxlbmd0aCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGVuZCwgcGFnZTsKKworICAgIGVuZCA9IFRBUkdFVF9QQUdFX0FMSUdOKHN0YXJ0ICsgbGVuZ3RoKSA+PiBUQVJHRVRfUEFHRV9CSVRTOworICAgIHBhZ2UgPSBzdGFydCA+PiBUQVJHRVRfUEFHRV9CSVRTOworICAgIGJpdG1hcF9zZXQocmFtX2xpc3QuZGlydHlfbWVtb3J5W0RJUlRZX01FTU9SWV9NSUdSQVRJT05dLCBwYWdlLCBlbmQgLSBwYWdlKTsKKyAgICBiaXRtYXBfc2V0KHJhbV9saXN0LmRpcnR5X21lbW9yeVtESVJUWV9NRU1PUllfVkdBXSwgcGFnZSwgZW5kIC0gcGFnZSk7CisgICAgYml0bWFwX3NldChyYW1fbGlzdC5kaXJ0eV9tZW1vcnlbRElSVFlfTUVNT1JZX0NPREVdLCBwYWdlLCBlbmQgLSBwYWdlKTsKKyAgICAvL3hlbl9tb2RpZmllZF9tZW1vcnkoc3RhcnQsIGxlbmd0aCk7Cit9CisKKyNpZiAhZGVmaW5lZChfV0lOMzIpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfbGViaXRtYXAodW5zaWduZWQgbG9uZyAqYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBwYWdlcykKK3sKKyAgICB1bnNpZ25lZCBsb25nIGksIGo7CisgICAgdW5zaWduZWQgbG9uZyBwYWdlX251bWJlciwgYzsKKyAgICBod2FkZHIgYWRkcjsKKyAgICByYW1fYWRkcl90IHJhbV9hZGRyOworICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gKHBhZ2VzICsgSE9TVF9MT05HX0JJVFMgLSAxKSAvIEhPU1RfTE9OR19CSVRTOworICAgIHVuc2lnbmVkIGxvbmcgaHByYXRpbyA9IGdldHBhZ2VzaXplKCkgLyBUQVJHRVRfUEFHRV9TSVpFOworICAgIHVuc2lnbmVkIGxvbmcgcGFnZSA9IEJJVF9XT1JEKHN0YXJ0ID4+IFRBUkdFVF9QQUdFX0JJVFMpOworCisgICAgLyogc3RhcnQgYWRkcmVzcyBpcyBhbGlnbmVkIGF0IHRoZSBzdGFydCBvZiBhIHdvcmQ/ICovCisgICAgaWYgKCgoKHBhZ2UgKiBCSVRTX1BFUl9MT05HKSA8PCBUQVJHRVRfUEFHRV9CSVRTKSA9PSBzdGFydCkgJiYKKyAgICAgICAgKGhwcmF0aW8gPT0gMSkpIHsKKyAgICAgICAgbG9uZyBrOworICAgICAgICBsb25nIG5yID0gQklUU19UT19MT05HUyhwYWdlcyk7CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG5yOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChiaXRtYXBba10pIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSBsZXVsX3RvX2NwdShiaXRtYXBba10pOworCisgICAgICAgICAgICAgICAgcmFtX2xpc3QuZGlydHlfbWVtb3J5W0RJUlRZX01FTU9SWV9NSUdSQVRJT05dW3BhZ2UgKyBrXSB8PSB0ZW1wOworICAgICAgICAgICAgICAgIHJhbV9saXN0LmRpcnR5X21lbW9yeVtESVJUWV9NRU1PUllfVkdBXVtwYWdlICsga10gfD0gdGVtcDsKKyAgICAgICAgICAgICAgICByYW1fbGlzdC5kaXJ0eV9tZW1vcnlbRElSVFlfTUVNT1JZX0NPREVdW3BhZ2UgKyBrXSB8PSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8veGVuX21vZGlmaWVkX21lbW9yeShzdGFydCwgcGFnZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qCisgICAgICAgICAqIGJpdG1hcC10cmF2ZWxpbmcgaXMgZmFzdGVyIHRoYW4gbWVtb3J5LXRyYXZlbGluZyAoZm9yIGFkZHIuLi4pCisgICAgICAgICAqIGVzcGVjaWFsbHkgd2hlbiBtb3N0IG9mIHRoZSBtZW1vcnkgaXMgbm90IGRpcnR5LgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYml0bWFwW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBjID0gbGV1bF90b19jcHUoYml0bWFwW2ldKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGogPSBmZnNsKGMpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgYyAmPSB+KDF1bCA8PCBqKTsKKyAgICAgICAgICAgICAgICAgICAgcGFnZV9udW1iZXIgPSAoaSAqIEhPU1RfTE9OR19CSVRTICsgaikgKiBocHJhdGlvOworICAgICAgICAgICAgICAgICAgICBhZGRyID0gcGFnZV9udW1iZXIgKiBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICAgICAgICAgICAgICByYW1fYWRkciA9IHN0YXJ0ICsgYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfcmFuZ2UocmFtX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfUEFHRV9TSVpFICogaHByYXRpbyk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyAhPSAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvKiBub3QgX1dJTjMyICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcGh5c2ljYWxfbWVtb3J5X2NsZWFyX2RpcnR5X3JhbmdlKHJhbV9hZGRyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNsaWVudCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGVuZCwgcGFnZTsKKworICAgIGFzc2VydChjbGllbnQgPCBESVJUWV9NRU1PUllfTlVNKTsKKyAgICBlbmQgPSBUQVJHRVRfUEFHRV9BTElHTihzdGFydCArIGxlbmd0aCkgPj4gVEFSR0VUX1BBR0VfQklUUzsKKyAgICBwYWdlID0gc3RhcnQgPj4gVEFSR0VUX1BBR0VfQklUUzsKKyAgICBiaXRtYXBfY2xlYXIocmFtX2xpc3QuZGlydHlfbWVtb3J5W2NsaWVudF0sIHBhZ2UsIGVuZCAtIHBhZ2UpOworfQorCit2b2lkIGNwdV9waHlzaWNhbF9tZW1vcnlfcmVzZXRfZGlydHkocmFtX2FkZHJfdCBzdGFydCwgcmFtX2FkZHJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2xpZW50KTsKKworaW50IGNwdV9waHlzaWNhbF9tZW1vcnlfc2V0X2RpcnR5X3RyYWNraW5nKGludCBlbmFibGUpOworCitpbnQgY3B1X3BoeXNpY2FsX21lbW9yeV9nZXRfZGlydHlfdHJhY2tpbmcodm9pZCk7CisKK2ludCBjcHVfcGh5c2ljYWxfc3luY19kaXJ0eV9iaXRtYXAoaHdhZGRyIHN0YXJ0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBlbmRfYWRkcik7CisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9zb2Z0bW11LXNlbWkuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NvZnRtbXUtc2VtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDFmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9zb2Z0bW11LXNlbWkuaApAQCAtMCwwICsxLDc5IEBACisvKgorICogSGVscGVyIHJvdXRpbmVzIHRvIHByb3ZpZGUgdGFyZ2V0IG1lbW9yeSBhY2Nlc3MgZm9yIHNlbWlob3N0aW5nCisgKiBzeXNjYWxscyBpbiBzeXN0ZW0gZW11bGF0aW9uIG1vZGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IENvZGVTb3VyY2VyeS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisjaWZuZGVmIFNPRlRNTVVfU0VNSV9ICisjZGVmaW5lIFNPRlRNTVVfU0VNSV9IIDEKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBzb2Z0bW11X3RnZXQzMihDUFVBcmNoU3RhdGUgKmVudiwgdWludDMyX3QgYWRkcikKK3sKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICBjcHVfbWVtb3J5X3J3X2RlYnVnKEVOVl9HRVRfQ1BVKGVudiksIGFkZHIsICh1aW50OF90ICopJnZhbCwgNCwgMCk7CisgICAgcmV0dXJuIHRzd2FwMzIodmFsKTsKK30KK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgc29mdG1tdV90Z2V0OChDUFVBcmNoU3RhdGUgKmVudiwgdWludDMyX3QgYWRkcikKK3sKKyAgICB1aW50OF90IHZhbDsKKworICAgIGNwdV9tZW1vcnlfcndfZGVidWcoRU5WX0dFVF9DUFUoZW52KSwgYWRkciwgJnZhbCwgMSwgMCk7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBnZXRfdXNlcl91MzIoYXJnLCBwKSAoeyBhcmcgPSBzb2Z0bW11X3RnZXQzMihlbnYsIHApIDsgMDsgfSkKKyNkZWZpbmUgZ2V0X3VzZXJfdTgoYXJnLCBwKSAoeyBhcmcgPSBzb2Z0bW11X3RnZXQ4KGVudiwgcCkgOyAwOyB9KQorI2RlZmluZSBnZXRfdXNlcl91YWwoYXJnLCBwKSBnZXRfdXNlcl91MzIoYXJnLCBwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgc29mdG1tdV90cHV0MzIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHZhbCkKK3sKKyAgICB2YWwgPSB0c3dhcDMyKHZhbCk7CisgICAgY3B1X21lbW9yeV9yd19kZWJ1ZyhFTlZfR0VUX0NQVShlbnYpLCBhZGRyLCAodWludDhfdCAqKSZ2YWwsIDQsIDEpOworfQorI2RlZmluZSBwdXRfdXNlcl91MzIoYXJnLCBwKSAoeyBzb2Z0bW11X3RwdXQzMihlbnYsIHAsIGFyZykgOyAwOyB9KQorI2RlZmluZSBwdXRfdXNlcl91YWwoYXJnLCBwKSBwdXRfdXNlcl91MzIoYXJnLCBwKQorCitzdGF0aWMgdm9pZCAqc29mdG1tdV9sb2NrX3VzZXIoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weSkKK3sKKyAgICB1aW50OF90ICpwOworICAgIC8qIFRPRE86IE1ha2UgdGhpcyBzb21ldGhpbmcgdGhhdCBpc24ndCBmaXhlZCBzaXplLiAgKi8KKyAgICBwID0gbWFsbG9jKGxlbik7CisgICAgaWYgKHAgJiYgY29weSkgeworICAgICAgICBjcHVfbWVtb3J5X3J3X2RlYnVnKEVOVl9HRVRfQ1BVKGVudiksIGFkZHIsIHAsIGxlbiwgMCk7CisgICAgfQorICAgIHJldHVybiBwOworfQorI2RlZmluZSBsb2NrX3VzZXIodHlwZSwgcCwgbGVuLCBjb3B5KSBzb2Z0bW11X2xvY2tfdXNlcihlbnYsIHAsIGxlbiwgY29weSkKK3N0YXRpYyBjaGFyICpzb2Z0bW11X2xvY2tfdXNlcl9zdHJpbmcoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQzMl90IGFkZHIpCit7CisgICAgY2hhciAqcDsKKyAgICBjaGFyICpzOworICAgIHVpbnQ4X3QgYzsKKyAgICAvKiBUT0RPOiBNYWtlIHRoaXMgc29tZXRoaW5nIHRoYXQgaXNuJ3QgZml4ZWQgc2l6ZS4gICovCisgICAgcyA9IHAgPSBtYWxsb2MoMTAyNCk7CisgICAgaWYgKCFzKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGNwdV9tZW1vcnlfcndfZGVidWcoRU5WX0dFVF9DUFUoZW52KSwgYWRkciwgJmMsIDEsIDApOworICAgICAgICBhZGRyKys7CisgICAgICAgICoocCsrKSA9IGM7CisgICAgfSB3aGlsZSAoYyk7CisgICAgcmV0dXJuIHM7Cit9CisjZGVmaW5lIGxvY2tfdXNlcl9zdHJpbmcocCkgc29mdG1tdV9sb2NrX3VzZXJfc3RyaW5nKGVudiwgcCkKK3N0YXRpYyB2b2lkIHNvZnRtbXVfdW5sb2NrX3VzZXIoQ1BVQXJjaFN0YXRlICplbnYsIHZvaWQgKnAsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbGVuKQoreworICAgIGlmIChsZW4pIHsKKyAgICAgICAgY3B1X21lbW9yeV9yd19kZWJ1ZyhFTlZfR0VUX0NQVShlbnYpLCBhZGRyLCBwLCBsZW4sIDEpOworICAgIH0KKyAgICBmcmVlKHApOworfQorI2RlZmluZSB1bmxvY2tfdXNlcihzLCBhcmdzLCBsZW4pIHNvZnRtbXVfdW5sb2NrX3VzZXIoZW52LCBzLCBhcmdzLCBsZW4pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvc29mdG1tdV9leGVjLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9zb2Z0bW11X2V4ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRlMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvc29mdG1tdV9leGVjLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiAgU29mdHdhcmUgTU1VIHN1cHBvcnQKKyAqCisgKiBHZW5lcmF0ZSBpbmxpbmUgbG9hZC9zdG9yZSBmdW5jdGlvbnMgZm9yIGFsbCBNTVUgbW9kZXMgKHR5cGljYWxseQorICogYXQgbGVhc3QgX3VzZXIgYW5kIF9rZXJuZWwpIGFzIHdlbGwgYXMgX2RhdGEgdmVyc2lvbnMsIGZvciBhbGwgZGF0YQorICogc2l6ZXMuCisgKgorICogVXNlZCBieSB0YXJnZXQgb3AgaGVscGVycy4KKyAqCisgKiBNTVUgbW9kZSBzdWZmaXhlcyBhcmUgZGVmaW5lZCBpbiB0YXJnZXQgY3B1LmguCisgKi8KKworLyogWFhYOiBmaW5kIHNvbWV0aGluZyBjbGVhbmVyLgorICogRnVydGhlcm1vcmUsIHRoaXMgaXMgZmFsc2UgZm9yIDY0IGJpdHMgdGFyZ2V0cworICovCisjZGVmaW5lIGxkdWxfdXNlciAgICAgICBsZGxfdXNlcgorI2RlZmluZSBsZHVsX2tlcm5lbCAgICAgbGRsX2tlcm5lbAorI2RlZmluZSBsZHVsX2h5cHYgICAgICAgbGRsX2h5cHYKKyNkZWZpbmUgbGR1bF9leGVjdXRpdmUgIGxkbF9leGVjdXRpdmUKKyNkZWZpbmUgbGR1bF9zdXBlcnZpc29yIGxkbF9zdXBlcnZpc29yCisKKy8qIFRoZSBtZW1vcnkgaGVscGVycyBmb3IgdGNnLWdlbmVyYXRlZCBjb2RlIG5lZWQgdGNnX3RhcmdldF9sb25nIGV0Yy4gICovCisjaW5jbHVkZSAidGNnLmgiCisKKyNkZWZpbmUgQUNDRVNTX1RZUEUgMAorI2RlZmluZSBNRU1TVUZGSVggTU1VX01PREUwX1NVRkZJWAorI2RlZmluZSBEQVRBX1NJWkUgMQorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgMgorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgNAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgOAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKyN1bmRlZiBBQ0NFU1NfVFlQRQorI3VuZGVmIE1FTVNVRkZJWAorCisjZGVmaW5lIEFDQ0VTU19UWVBFIDEKKyNkZWZpbmUgTUVNU1VGRklYIE1NVV9NT0RFMV9TVUZGSVgKKyNkZWZpbmUgREFUQV9TSVpFIDEKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDIKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDQKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDgKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisjdW5kZWYgQUNDRVNTX1RZUEUKKyN1bmRlZiBNRU1TVUZGSVgKKworI2lmIChOQl9NTVVfTU9ERVMgPj0gMykKKworI2RlZmluZSBBQ0NFU1NfVFlQRSAyCisjZGVmaW5lIE1FTVNVRkZJWCBNTVVfTU9ERTJfU1VGRklYCisjZGVmaW5lIERBVEFfU0laRSAxCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSAyCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA0CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA4CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorI3VuZGVmIEFDQ0VTU19UWVBFCisjdW5kZWYgTUVNU1VGRklYCisjZW5kaWYgLyogKE5CX01NVV9NT0RFUyA+PSAzKSAqLworCisjaWYgKE5CX01NVV9NT0RFUyA+PSA0KQorCisjZGVmaW5lIEFDQ0VTU19UWVBFIDMKKyNkZWZpbmUgTUVNU1VGRklYIE1NVV9NT0RFM19TVUZGSVgKKyNkZWZpbmUgREFUQV9TSVpFIDEKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDIKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDQKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFIDgKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfaGVhZGVyLmgiCisjdW5kZWYgQUNDRVNTX1RZUEUKKyN1bmRlZiBNRU1TVUZGSVgKKyNlbmRpZiAvKiAoTkJfTU1VX01PREVTID49IDQpICovCisKKyNpZiAoTkJfTU1VX01PREVTID49IDUpCisKKyNkZWZpbmUgQUNDRVNTX1RZUEUgNAorI2RlZmluZSBNRU1TVUZGSVggTU1VX01PREU0X1NVRkZJWAorI2RlZmluZSBEQVRBX1NJWkUgMQorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgMgorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgNAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKworI2RlZmluZSBEQVRBX1NJWkUgOAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9oZWFkZXIuaCIKKyN1bmRlZiBBQ0NFU1NfVFlQRQorI3VuZGVmIE1FTVNVRkZJWAorI2VuZGlmIC8qIChOQl9NTVVfTU9ERVMgPj0gNSkgKi8KKworI2lmIChOQl9NTVVfTU9ERVMgPj0gNikKKworI2RlZmluZSBBQ0NFU1NfVFlQRSA1CisjZGVmaW5lIE1FTVNVRkZJWCBNTVVfTU9ERTVfU1VGRklYCisjZGVmaW5lIERBVEFfU0laRSAxCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSAyCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA0CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA4CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorI3VuZGVmIEFDQ0VTU19UWVBFCisjdW5kZWYgTUVNU1VGRklYCisjZW5kaWYgLyogKE5CX01NVV9NT0RFUyA+PSA2KSAqLworCisjaWYgKE5CX01NVV9NT0RFUyA+IDYpCisjZXJyb3IgIk5CX01NVV9NT0RFUyA+IDYgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93IgorI2VuZGlmIC8qIChOQl9NTVVfTU9ERVMgPiA2KSAqLworCisvKiB0aGVzZSBhY2Nlc3MgYXJlIHNsb3dlciwgdGhleSBtdXN0IGJlIGFzIHJhcmUgYXMgcG9zc2libGUgKi8KKyNkZWZpbmUgQUNDRVNTX1RZUEUgKE5CX01NVV9NT0RFUykKKyNkZWZpbmUgTUVNU1VGRklYIF9kYXRhCisjZGVmaW5lIERBVEFfU0laRSAxCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSAyCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA0CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorCisjZGVmaW5lIERBVEFfU0laRSA4CisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2hlYWRlci5oIgorI3VuZGVmIEFDQ0VTU19UWVBFCisjdW5kZWYgTUVNU1VGRklYCisKKyNkZWZpbmUgbGR1YihwKSBsZHViX2RhdGEocCkKKyNkZWZpbmUgbGRzYihwKSBsZHNiX2RhdGEocCkKKyNkZWZpbmUgbGR1dyhwKSBsZHV3X2RhdGEocCkKKyNkZWZpbmUgbGRzdyhwKSBsZHN3X2RhdGEocCkKKyNkZWZpbmUgbGRsKHApIGxkbF9kYXRhKHApCisjZGVmaW5lIGxkcShwKSBsZHFfZGF0YShwKQorCisjZGVmaW5lIHN0YihwLCB2KSBzdGJfZGF0YShwLCB2KQorI2RlZmluZSBzdHcocCwgdikgc3R3X2RhdGEocCwgdikKKyNkZWZpbmUgc3RsKHAsIHYpIHN0bF9kYXRhKHAsIHYpCisjZGVmaW5lIHN0cShwLCB2KSBzdHFfZGF0YShwLCB2KQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvc29mdG1tdV9oZWFkZXIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NvZnRtbXVfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkOWM4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NvZnRtbXVfaGVhZGVyLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiAgU29mdHdhcmUgTU1VIHN1cHBvcnQKKyAqCisgKiBHZW5lcmF0ZSBpbmxpbmUgbG9hZC9zdG9yZSBmdW5jdGlvbnMgZm9yIG9uZSBNTVUgbW9kZSBhbmQgZGF0YQorICogc2l6ZS4KKyAqCisgKiBHZW5lcmF0ZSBhIHN0b3JlIGZ1bmN0aW9uIGFzIHdlbGwgYXMgc2lnbmVkIGFuZCB1bnNpZ25lZCBsb2Fkcy4gRm9yCisgKiAzMiBhbmQgNjQgYml0IGNhc2VzLCBhbHNvIGdlbmVyYXRlIGZsb2F0aW5nIHBvaW50IGZ1bmN0aW9ucyB3aXRoCisgKiB0aGUgc2FtZSBzaXplLgorICoKKyAqIE5vdCB1c2VkIGRpcmVjdGx5IGJ1dCBpbmNsdWRlZCBmcm9tIHNvZnRtbXVfZXhlYy5oIGFuZCBleGVjLWFsbC5oLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWYgREFUQV9TSVpFID09IDgKKyNkZWZpbmUgU1VGRklYIHEKKyNkZWZpbmUgVVNVRkZJWCBxCisjZGVmaW5lIERBVEFfVFlQRSB1aW50NjRfdAorI2VsaWYgREFUQV9TSVpFID09IDQKKyNkZWZpbmUgU1VGRklYIGwKKyNkZWZpbmUgVVNVRkZJWCBsCisjZGVmaW5lIERBVEFfVFlQRSB1aW50MzJfdAorI2VsaWYgREFUQV9TSVpFID09IDIKKyNkZWZpbmUgU1VGRklYIHcKKyNkZWZpbmUgVVNVRkZJWCB1dworI2RlZmluZSBEQVRBX1RZUEUgdWludDE2X3QKKyNkZWZpbmUgREFUQV9TVFlQRSBpbnQxNl90CisjZWxpZiBEQVRBX1NJWkUgPT0gMQorI2RlZmluZSBTVUZGSVggYgorI2RlZmluZSBVU1VGRklYIHViCisjZGVmaW5lIERBVEFfVFlQRSB1aW50OF90CisjZGVmaW5lIERBVEFfU1RZUEUgaW50OF90CisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIGRhdGEgc2l6ZQorI2VuZGlmCisKKyNpZiBBQ0NFU1NfVFlQRSA8IChOQl9NTVVfTU9ERVMpCisKKyNkZWZpbmUgQ1BVX01NVV9JTkRFWCBBQ0NFU1NfVFlQRQorI2RlZmluZSBNTVVTVUZGSVggX21tdQorCisjZWxpZiBBQ0NFU1NfVFlQRSA9PSAoTkJfTU1VX01PREVTKQorCisjZGVmaW5lIENQVV9NTVVfSU5ERVggKGNwdV9tbXVfaW5kZXgoZW52KSkKKyNkZWZpbmUgTU1VU1VGRklYIF9tbXUKKworI2VsaWYgQUNDRVNTX1RZUEUgPT0gKE5CX01NVV9NT0RFUyArIDEpCisKKyNkZWZpbmUgQ1BVX01NVV9JTkRFWCAoY3B1X21tdV9pbmRleChlbnYpKQorI2RlZmluZSBNTVVTVUZGSVggX2NtbXUKKworI2Vsc2UKKyNlcnJvciBpbnZhbGlkIEFDQ0VTU19UWVBFCisjZW5kaWYKKworI2lmIERBVEFfU0laRSA9PSA4CisjZGVmaW5lIFJFU19UWVBFIHVpbnQ2NF90CisjZWxzZQorI2RlZmluZSBSRVNfVFlQRSB1aW50MzJfdAorI2VuZGlmCisKKyNpZiBBQ0NFU1NfVFlQRSA9PSAoTkJfTU1VX01PREVTICsgMSkKKyNkZWZpbmUgQUREUl9SRUFEIGFkZHJfY29kZQorI2Vsc2UKKyNkZWZpbmUgQUREUl9SRUFEIGFkZHJfcmVhZAorI2VuZGlmCisKKy8qIGdlbmVyaWMgbG9hZC9zdG9yZSBtYWNyb3MgKi8KKworc3RhdGljIGlubGluZSBSRVNfVFlQRQorZ2x1ZShnbHVlKGNwdV9sZCwgVVNVRkZJWCksIE1FTVNVRkZJWCkoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIpCit7CisgICAgaW50IHBhZ2VfaW5kZXg7CisgICAgUkVTX1RZUEUgcmVzOworICAgIHRhcmdldF91bG9uZyBhZGRyOworICAgIGludCBtbXVfaWR4OworCisgICAgYWRkciA9IHB0cjsKKyAgICBwYWdlX2luZGV4ID0gKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUykgJiAoQ1BVX1RMQl9TSVpFIC0gMSk7CisgICAgbW11X2lkeCA9IENQVV9NTVVfSU5ERVg7CisgICAgaWYgKHVubGlrZWx5KGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW3BhZ2VfaW5kZXhdLkFERFJfUkVBRCAhPQorICAgICAgICAgICAgICAgICAoYWRkciAmIChUQVJHRVRfUEFHRV9NQVNLIHwgKERBVEFfU0laRSAtIDEpKSkpKSB7CisgICAgICAgIHJlcyA9IGdsdWUoZ2x1ZShoZWxwZXJfbGQsIFNVRkZJWCksIE1NVVNVRkZJWCkoZW52LCBhZGRyLCBtbXVfaWR4KTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50cHRyX3QgaG9zdGFkZHIgPSBhZGRyICsgZW52LT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uYWRkZW5kOworICAgICAgICByZXMgPSBnbHVlKGdsdWUobGQsIFVTVUZGSVgpLCBfcmF3KShob3N0YWRkcik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiBEQVRBX1NJWkUgPD0gMgorc3RhdGljIGlubGluZSBpbnQKK2dsdWUoZ2x1ZShjcHVfbGRzLCBTVUZGSVgpLCBNRU1TVUZGSVgpKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyKQoreworICAgIGludCByZXMsIHBhZ2VfaW5kZXg7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgaW50IG1tdV9pZHg7CisKKyAgICBhZGRyID0gcHRyOworICAgIHBhZ2VfaW5kZXggPSAoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKKyAgICBtbXVfaWR4ID0gQ1BVX01NVV9JTkRFWDsKKyAgICBpZiAodW5saWtlbHkoZW52LT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uQUREUl9SRUFEICE9CisgICAgICAgICAgICAgICAgIChhZGRyICYgKFRBUkdFVF9QQUdFX01BU0sgfCAoREFUQV9TSVpFIC0gMSkpKSkpIHsKKyAgICAgICAgcmVzID0gKERBVEFfU1RZUEUpZ2x1ZShnbHVlKGhlbHBlcl9sZCwgU1VGRklYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTVVTVUZGSVgpKGVudiwgYWRkciwgbW11X2lkeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludHB0cl90IGhvc3RhZGRyID0gYWRkciArIGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW3BhZ2VfaW5kZXhdLmFkZGVuZDsKKyAgICAgICAgcmVzID0gZ2x1ZShnbHVlKGxkcywgU1VGRklYKSwgX3JhdykoaG9zdGFkZHIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorI2VuZGlmCisKKyNpZiBBQ0NFU1NfVFlQRSAhPSAoTkJfTU1VX01PREVTICsgMSkKKworLyogZ2VuZXJpYyBzdG9yZSBtYWNybyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQKK2dsdWUoZ2x1ZShjcHVfc3QsIFNVRkZJWCksIE1FTVNVRkZJWCkoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU19UWVBFIHYpCit7CisgICAgaW50IHBhZ2VfaW5kZXg7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgaW50IG1tdV9pZHg7CisKKyAgICBhZGRyID0gcHRyOworICAgIHBhZ2VfaW5kZXggPSAoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKKyAgICBtbXVfaWR4ID0gQ1BVX01NVV9JTkRFWDsKKyAgICBpZiAodW5saWtlbHkoZW52LT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uYWRkcl93cml0ZSAhPQorICAgICAgICAgICAgICAgICAoYWRkciAmIChUQVJHRVRfUEFHRV9NQVNLIHwgKERBVEFfU0laRSAtIDEpKSkpKSB7CisgICAgICAgIGdsdWUoZ2x1ZShoZWxwZXJfc3QsIFNVRkZJWCksIE1NVVNVRkZJWCkoZW52LCBhZGRyLCB2LCBtbXVfaWR4KTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50cHRyX3QgaG9zdGFkZHIgPSBhZGRyICsgZW52LT50bGJfdGFibGVbbW11X2lkeF1bcGFnZV9pbmRleF0uYWRkZW5kOworICAgICAgICBnbHVlKGdsdWUoc3QsIFNVRkZJWCksIF9yYXcpKGhvc3RhZGRyLCB2KTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBBQ0NFU1NfVFlQRSAhPSAoTkJfTU1VX01PREVTICsgMSkgKi8KKworI2lmIEFDQ0VTU19UWVBFICE9IChOQl9NTVVfTU9ERVMgKyAxKQorCisjaWYgREFUQV9TSVpFID09IDgKK3N0YXRpYyBpbmxpbmUgZmxvYXQ2NCBnbHVlKGNwdV9sZGZxLCBNRU1TVUZGSVgpKENQVUFyY2hTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHB0cikKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0NjQgZDsKKyAgICAgICAgdWludDY0X3QgaTsKKyAgICB9IHU7CisgICAgdS5pID0gZ2x1ZShjcHVfbGRxLCBNRU1TVUZGSVgpKGVudiwgcHRyKTsKKyAgICByZXR1cm4gdS5kOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2x1ZShjcHVfc3RmcSwgTUVNU1VGRklYKShDUFVBcmNoU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBwdHIsIGZsb2F0NjQgdikKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0NjQgZDsKKyAgICAgICAgdWludDY0X3QgaTsKKyAgICB9IHU7CisgICAgdS5kID0gdjsKKyAgICBnbHVlKGNwdV9zdHEsIE1FTVNVRkZJWCkoZW52LCBwdHIsIHUuaSk7Cit9CisjZW5kaWYgLyogREFUQV9TSVpFID09IDggKi8KKworI2lmIERBVEFfU0laRSA9PSA0CitzdGF0aWMgaW5saW5lIGZsb2F0MzIgZ2x1ZShjcHVfbGRmbCwgTUVNU1VGRklYKShDUFVBcmNoU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBwdHIpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDMyIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfSB1OworICAgIHUuaSA9IGdsdWUoY3B1X2xkbCwgTUVNU1VGRklYKShlbnYsIHB0cik7CisgICAgcmV0dXJuIHUuZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdsdWUoY3B1X3N0ZmwsIE1FTVNVRkZJWCkoQ1BVQXJjaFN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcHRyLCBmbG9hdDMyIHYpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDMyIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfSB1OworICAgIHUuZiA9IHY7CisgICAgZ2x1ZShjcHVfc3RsLCBNRU1TVUZGSVgpKGVudiwgcHRyLCB1LmkpOworfQorI2VuZGlmIC8qIERBVEFfU0laRSA9PSA0ICovCisKKyNlbmRpZiAvKiBBQ0NFU1NfVFlQRSAhPSAoTkJfTU1VX01PREVTICsgMSkgKi8KKworI3VuZGVmIFJFU19UWVBFCisjdW5kZWYgREFUQV9UWVBFCisjdW5kZWYgREFUQV9TVFlQRQorI3VuZGVmIFNVRkZJWAorI3VuZGVmIFVTVUZGSVgKKyN1bmRlZiBEQVRBX1NJWkUKKyN1bmRlZiBDUFVfTU1VX0lOREVYCisjdW5kZWYgTU1VU1VGRklYCisjdW5kZWYgQUREUl9SRUFECmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkZjVhZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NvZnRtbXVfdGVtcGxhdGUuaApAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqICBTb2Z0d2FyZSBNTVUgc3VwcG9ydAorICoKKyAqIEdlbmVyYXRlIGhlbHBlcnMgdXNlZCBieSBUQ0cgZm9yIHFlbXVfbGQvc3Qgb3BzIGFuZCBjb2RlIGxvYWQKKyAqIGZ1bmN0aW9ucy4KKyAqCisgKiBJbmNsdWRlZCBmcm9tIHRhcmdldCBvcCBoZWxwZXJzIGFuZCBleGVjLmMuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisKKyNkZWZpbmUgREFUQV9TSVpFICgxIDw8IFNISUZUKQorCisjaWYgREFUQV9TSVpFID09IDgKKyNkZWZpbmUgU1VGRklYIHEKKyNkZWZpbmUgTFNVRkZJWCBxCisjZGVmaW5lIFNEQVRBX1RZUEUgIGludDY0X3QKKyNlbGlmIERBVEFfU0laRSA9PSA0CisjZGVmaW5lIFNVRkZJWCBsCisjZGVmaW5lIExTVUZGSVggbAorI2RlZmluZSBTREFUQV9UWVBFICBpbnQzMl90CisjZWxpZiBEQVRBX1NJWkUgPT0gMgorI2RlZmluZSBTVUZGSVggdworI2RlZmluZSBMU1VGRklYIHV3CisjZGVmaW5lIFNEQVRBX1RZUEUgIGludDE2X3QKKyNlbGlmIERBVEFfU0laRSA9PSAxCisjZGVmaW5lIFNVRkZJWCBiCisjZGVmaW5lIExTVUZGSVggdWIKKyNkZWZpbmUgU0RBVEFfVFlQRSAgaW50OF90CisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkIGRhdGEgc2l6ZQorI2VuZGlmCisKKyNkZWZpbmUgREFUQV9UWVBFICAgZ2x1ZSh1LCBTREFUQV9UWVBFKQorCisvKiBGb3IgdGhlIGJlbmVmaXQgb2YgVENHIGdlbmVyYXRlZCBjb2RlLCB3ZSB3YW50IHRvIGF2b2lkIHRoZSBjb21wbGljYXRpb24KKyAgIG9mIEFCSS1zcGVjaWZpYyByZXR1cm4gdHlwZSBwcm9tb3Rpb24gYW5kIGFsd2F5cyByZXR1cm4gYSB2YWx1ZSBleHRlbmRlZAorICAgdG8gdGhlIHJlZ2lzdGVyIHNpemUgb2YgdGhlIGhvc3QuICBUaGlzIGlzIHRjZ190YXJnZXRfbG9uZywgZXhjZXB0IGluIHRoZQorICAgY2FzZSBvZiBhIDMyLWJpdCBob3N0IGFuZCA2NC1iaXQgZGF0YSwgYW5kIGZvciB0aGF0IHdlIGFsd2F5cyBoYXZlCisgICB1aW50NjRfdC4gIERvbid0IGJvdGhlciB3aXRoIHRoaXMgd2lkZW5lZCB2YWx1ZSBmb3IgU09GVE1NVV9DT0RFX0FDQ0VTUy4gICovCisjaWYgZGVmaW5lZChTT0ZUTU1VX0NPREVfQUNDRVNTKSB8fCBEQVRBX1NJWkUgPT0gOAorIyBkZWZpbmUgV09SRF9UWVBFICBEQVRBX1RZUEUKKyMgZGVmaW5lIFVTVUZGSVggICAgU1VGRklYCisjZWxzZQorIyBkZWZpbmUgV09SRF9UWVBFICB0Y2dfdGFyZ2V0X3Vsb25nCisjIGRlZmluZSBVU1VGRklYICAgIGdsdWUodSwgU1VGRklYKQorIyBkZWZpbmUgU1NVRkZJWCAgICBnbHVlKHMsIFNVRkZJWCkKKyNlbmRpZgorCisjaWZkZWYgU09GVE1NVV9DT0RFX0FDQ0VTUworI2RlZmluZSBSRUFEX0FDQ0VTU19UWVBFIDIKKyNkZWZpbmUgQUREUl9SRUFEIGFkZHJfY29kZQorI2Vsc2UKKyNkZWZpbmUgUkVBRF9BQ0NFU1NfVFlQRSAwCisjZGVmaW5lIEFERFJfUkVBRCBhZGRyX3JlYWQKKyNlbmRpZgorCisjaWYgREFUQV9TSVpFID09IDgKKyMgZGVmaW5lIEJTV0FQKFgpICBic3dhcDY0KFgpCisjZWxpZiBEQVRBX1NJWkUgPT0gNAorIyBkZWZpbmUgQlNXQVAoWCkgIGJzd2FwMzIoWCkKKyNlbGlmIERBVEFfU0laRSA9PSAyCisjIGRlZmluZSBCU1dBUChYKSAgYnN3YXAxNihYKQorI2Vsc2UKKyMgZGVmaW5lIEJTV0FQKFgpICAoWCkKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorIyBkZWZpbmUgVEdUX0JFKFgpICAoWCkKKyMgZGVmaW5lIFRHVF9MRShYKSAgQlNXQVAoWCkKKyNlbHNlCisjIGRlZmluZSBUR1RfQkUoWCkgIEJTV0FQKFgpCisjIGRlZmluZSBUR1RfTEUoWCkgIChYKQorI2VuZGlmCisKKyNpZiBEQVRBX1NJWkUgPT0gMQorIyBkZWZpbmUgaGVscGVyX2xlX2xkX25hbWUgIGdsdWUoZ2x1ZShoZWxwZXJfcmV0X2xkLCBVU1VGRklYKSwgTU1VU1VGRklYKQorIyBkZWZpbmUgaGVscGVyX2JlX2xkX25hbWUgIGhlbHBlcl9sZV9sZF9uYW1lCisjIGRlZmluZSBoZWxwZXJfbGVfbGRzX25hbWUgZ2x1ZShnbHVlKGhlbHBlcl9yZXRfbGQsIFNTVUZGSVgpLCBNTVVTVUZGSVgpCisjIGRlZmluZSBoZWxwZXJfYmVfbGRzX25hbWUgaGVscGVyX2xlX2xkc19uYW1lCisjIGRlZmluZSBoZWxwZXJfbGVfc3RfbmFtZSAgZ2x1ZShnbHVlKGhlbHBlcl9yZXRfc3QsIFNVRkZJWCksIE1NVVNVRkZJWCkKKyMgZGVmaW5lIGhlbHBlcl9iZV9zdF9uYW1lICBoZWxwZXJfbGVfc3RfbmFtZQorI2Vsc2UKKyMgZGVmaW5lIGhlbHBlcl9sZV9sZF9uYW1lICBnbHVlKGdsdWUoaGVscGVyX2xlX2xkLCBVU1VGRklYKSwgTU1VU1VGRklYKQorIyBkZWZpbmUgaGVscGVyX2JlX2xkX25hbWUgIGdsdWUoZ2x1ZShoZWxwZXJfYmVfbGQsIFVTVUZGSVgpLCBNTVVTVUZGSVgpCisjIGRlZmluZSBoZWxwZXJfbGVfbGRzX25hbWUgZ2x1ZShnbHVlKGhlbHBlcl9sZV9sZCwgU1NVRkZJWCksIE1NVVNVRkZJWCkKKyMgZGVmaW5lIGhlbHBlcl9iZV9sZHNfbmFtZSBnbHVlKGdsdWUoaGVscGVyX2JlX2xkLCBTU1VGRklYKSwgTU1VU1VGRklYKQorIyBkZWZpbmUgaGVscGVyX2xlX3N0X25hbWUgIGdsdWUoZ2x1ZShoZWxwZXJfbGVfc3QsIFNVRkZJWCksIE1NVVNVRkZJWCkKKyMgZGVmaW5lIGhlbHBlcl9iZV9zdF9uYW1lICBnbHVlKGdsdWUoaGVscGVyX2JlX3N0LCBTVUZGSVgpLCBNTVVTVUZGSVgpCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyMgZGVmaW5lIGhlbHBlcl90ZV9sZF9uYW1lICBoZWxwZXJfYmVfbGRfbmFtZQorIyBkZWZpbmUgaGVscGVyX3RlX3N0X25hbWUgIGhlbHBlcl9iZV9zdF9uYW1lCisjZWxzZQorIyBkZWZpbmUgaGVscGVyX3RlX2xkX25hbWUgIGhlbHBlcl9sZV9sZF9uYW1lCisjIGRlZmluZSBoZWxwZXJfdGVfc3RfbmFtZSAgaGVscGVyX2xlX3N0X25hbWUKKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgREFUQV9UWVBFIGdsdWUoaW9fcmVhZCwgU1VGRklYKShDUFVBcmNoU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgcGh5c2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IHJldGFkZHIpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIGludCBpbmRleCA9IChwaHlzYWRkciA+PiBJT19NRU1fU0hJRlQpICYgKElPX01FTV9OQl9FTlRSSUVTIC0gMSk7CisgICAgcGh5c2FkZHIgPSAocGh5c2FkZHIgJiBUQVJHRVRfUEFHRV9NQVNLKSArIGFkZHI7CisgICAgZW52LT5tZW1faW9fcGMgPSByZXRhZGRyOworICAgIGlmIChpbmRleCA+IChJT19NRU1fTk9URElSVFkgPj4gSU9fTUVNX1NISUZUKQorICAgICAgICAgICAgJiYgIWNhbl9kb19pbyhlbnYpKSB7CisgICAgICAgIGNwdV9pb19yZWNvbXBpbGUoZW52LCByZXRhZGRyKTsKKyAgICB9CisKKyAgICBlbnYtPm1lbV9pb192YWRkciA9IGFkZHI7CisjaWYgU0hJRlQgPD0gMgorICAgIHZhbCA9IGlvX21lbV9yZWFkKGluZGV4LCBwaHlzYWRkciwgMSA8PCBTSElGVCk7CisjZWxzZQorI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICB2YWwgPSAodWludDY0X3QpaW9fbWVtX3JlYWQoaW5kZXgsIHBoeXNhZGRyLCA0KSA8PCAzMjsKKyAgICB2YWwgfD0gaW9fbWVtX3JlYWQoaW5kZXgsIHBoeXNhZGRyICsgNCwgNCk7CisjZWxzZQorICAgIHZhbCA9IGlvX21lbV9yZWFkKGluZGV4LCBwaHlzYWRkciwgNCk7CisgICAgdmFsIHw9ICh1aW50NjRfdClpb19tZW1fcmVhZChpbmRleCwgcGh5c2FkZHIgKyA0LCA0KSA8PCAzMjsKKyNlbmRpZgorI2VuZGlmIC8qIFNISUZUID4gMiAqLworICAgIHJldHVybiB2YWw7Cit9CisKKyNpZmRlZiBTT0ZUTU1VX0NPREVfQUNDRVNTCitzdGF0aWMgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbmRpZgorV09SRF9UWVBFIGhlbHBlcl9sZV9sZF9uYW1lKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgaW50IG1tdV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IHJldGFkZHIpCit7CisgICAgaW50IGluZGV4ID0gKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUykgJiAoQ1BVX1RMQl9TSVpFIC0gMSk7CisgICAgdGFyZ2V0X3Vsb25nIHRsYl9hZGRyID0gZW52LT50bGJfdGFibGVbbW11X2lkeF1baW5kZXhdLkFERFJfUkVBRDsKKyAgICB1aW50cHRyX3QgaGFkZHI7CisgICAgREFUQV9UWVBFIHJlczsKKworICAgIC8qIEFkanVzdCB0aGUgZ2l2ZW4gcmV0dXJuIGFkZHJlc3MuICAqLworICAgIHJldGFkZHIgLT0gR0VUUENfQURKOworCisgICAgLyogSWYgdGhlIFRMQiBlbnRyeSBpcyBmb3IgYSBkaWZmZXJlbnQgcGFnZSwgcmVsb2FkIGFuZCB0cnkgYWdhaW4uICAqLworICAgIGlmICgoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spCisgICAgICAgICAhPSAodGxiX2FkZHIgJiAoVEFSR0VUX1BBR0VfTUFTSyB8IFRMQl9JTlZBTElEX01BU0spKSkgeworI2lmZGVmIEFMSUdORURfT05MWQorICAgICAgICBpZiAoKGFkZHIgJiAoREFUQV9TSVpFIC0gMSkpICE9IDApIHsKKyAgICAgICAgICAgIGRvX3VuYWxpZ25lZF9hY2Nlc3MoZW52LCBhZGRyLCBSRUFEX0FDQ0VTU19UWVBFLCBtbXVfaWR4LCByZXRhZGRyKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRsYl9maWxsKGVudiwgYWRkciwgUkVBRF9BQ0NFU1NfVFlQRSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgICAgIHRsYl9hZGRyID0gZW52LT50bGJfdGFibGVbbW11X2lkeF1baW5kZXhdLkFERFJfUkVBRDsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgYW4gSU8gYWNjZXNzLiAgKi8KKyAgICBpZiAodW5saWtlbHkodGxiX2FkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykpIHsKKyAgICAgICAgaHdhZGRyIGlvYWRkcjsKKyAgICAgICAgaWYgKChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIGRvX3VuYWxpZ25lZF9hY2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgaW9hZGRyID0gZW52LT5pb3RsYlttbXVfaWR4XVtpbmRleF07CisKKyAgICAgICAgLyogPz8/IE5vdGUgdGhhdCB0aGUgaW8gaGVscGVycyBhbHdheXMgcmVhZCBkYXRhIGluIHRoZSB0YXJnZXQKKyAgICAgICAgICAgYnl0ZSBvcmRlcmluZy4gIFdlIHNob3VsZCBwdXNoIHRoZSBMRS9CRSByZXF1ZXN0IGRvd24gaW50byBpby4gICovCisgICAgICAgIHJlcyA9IGdsdWUoaW9fcmVhZCwgU1VGRklYKShlbnYsIGlvYWRkciwgYWRkciwgcmV0YWRkcik7CisgICAgICAgIHJlcyA9IFRHVF9MRShyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qIEhhbmRsZSBzbG93IHVuYWxpZ25lZCBhY2Nlc3MgKGl0IHNwYW5zIHR3byBwYWdlcyBvciBJTykuICAqLworICAgIGlmIChEQVRBX1NJWkUgPiAxCisgICAgICAgICYmIHVubGlrZWx5KChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsgREFUQV9TSVpFIC0gMQorICAgICAgICAgICAgICAgICAgICA+PSBUQVJHRVRfUEFHRV9TSVpFKSkgeworICAgICAgICB0YXJnZXRfdWxvbmcgYWRkcjEsIGFkZHIyOworICAgICAgICBEQVRBX1RZUEUgcmVzMSwgcmVzMjsKKyAgICAgICAgdW5zaWduZWQgc2hpZnQ7CisgICAgZG9fdW5hbGlnbmVkX2FjY2VzczoKKyNpZmRlZiBBTElHTkVEX09OTFkKKyAgICAgICAgZG9fdW5hbGlnbmVkX2FjY2VzcyhlbnYsIGFkZHIsIFJFQURfQUNDRVNTX1RZUEUsIG1tdV9pZHgsIHJldGFkZHIpOworI2VuZGlmCisgICAgICAgIGFkZHIxID0gYWRkciAmIH4oREFUQV9TSVpFIC0gMSk7CisgICAgICAgIGFkZHIyID0gYWRkcjEgKyBEQVRBX1NJWkU7CisgICAgICAgIC8qIE5vdGUgdGhlIGFkanVzdG1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24uCisgICAgICAgICAgIFVuZG8gdGhhdCBmb3IgdGhlIHJlY3Vyc2lvbi4gICovCisgICAgICAgIHJlczEgPSBoZWxwZXJfbGVfbGRfbmFtZShlbnYsIGFkZHIxLCBtbXVfaWR4LCByZXRhZGRyICsgR0VUUENfQURKKTsKKyAgICAgICAgcmVzMiA9IGhlbHBlcl9sZV9sZF9uYW1lKGVudiwgYWRkcjIsIG1tdV9pZHgsIHJldGFkZHIgKyBHRVRQQ19BREopOworICAgICAgICBzaGlmdCA9IChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAqIDg7CisKKyAgICAgICAgLyogTGl0dGxlLWVuZGlhbiBjb21iaW5lLiAgKi8KKyAgICAgICAgcmVzID0gKHJlczEgPj4gc2hpZnQpIHwgKHJlczIgPDwgKChEQVRBX1NJWkUgKiA4KSAtIHNoaWZ0KSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyogSGFuZGxlIGFsaWduZWQgYWNjZXNzIG9yIHVuYWxpZ25lZCBhY2Nlc3MgaW4gdGhlIHNhbWUgcGFnZS4gICovCisjaWZkZWYgQUxJR05FRF9PTkxZCisgICAgaWYgKChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAhPSAwKSB7CisgICAgICAgIGRvX3VuYWxpZ25lZF9hY2Nlc3MoZW52LCBhZGRyLCBSRUFEX0FDQ0VTU19UWVBFLCBtbXVfaWR4LCByZXRhZGRyKTsKKyAgICB9CisjZW5kaWYKKworICAgIGhhZGRyID0gYWRkciArIGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2luZGV4XS5hZGRlbmQ7CisjaWYgREFUQV9TSVpFID09IDEKKyAgICByZXMgPSBnbHVlKGdsdWUobGQsIExTVUZGSVgpLCBfcCkoKHVpbnQ4X3QgKiloYWRkcik7CisjZWxzZQorICAgIHJlcyA9IGdsdWUoZ2x1ZShsZCwgTFNVRkZJWCksIF9sZV9wKSgodWludDhfdCAqKWhhZGRyKTsKKyNlbmRpZgorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiBEQVRBX1NJWkUgPiAxCisjaWZkZWYgU09GVE1NVV9DT0RFX0FDQ0VTUworc3RhdGljIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisjZW5kaWYKK1dPUkRfVFlQRSBoZWxwZXJfYmVfbGRfbmFtZShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCByZXRhZGRyKQoreworICAgIGludCBpbmRleCA9IChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpICYgKENQVV9UTEJfU0laRSAtIDEpOworICAgIHRhcmdldF91bG9uZyB0bGJfYWRkciA9IGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2luZGV4XS5BRERSX1JFQUQ7CisgICAgdWludHB0cl90IGhhZGRyOworICAgIERBVEFfVFlQRSByZXM7CisKKyAgICAvKiBBZGp1c3QgdGhlIGdpdmVuIHJldHVybiBhZGRyZXNzLiAgKi8KKyAgICByZXRhZGRyIC09IEdFVFBDX0FESjsKKworICAgIC8qIElmIHRoZSBUTEIgZW50cnkgaXMgZm9yIGEgZGlmZmVyZW50IHBhZ2UsIHJlbG9hZCBhbmQgdHJ5IGFnYWluLiAgKi8KKyAgICBpZiAoKGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLKQorICAgICAgICAgIT0gKHRsYl9hZGRyICYgKFRBUkdFVF9QQUdFX01BU0sgfCBUTEJfSU5WQUxJRF9NQVNLKSkpIHsKKyNpZmRlZiBBTElHTkVEX09OTFkKKyAgICAgICAgaWYgKChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAhPSAwKSB7CisgICAgICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzKGVudiwgYWRkciwgUkVBRF9BQ0NFU1NfVFlQRSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB0bGJfZmlsbChlbnYsIGFkZHIsIFJFQURfQUNDRVNTX1RZUEUsIG1tdV9pZHgsIHJldGFkZHIpOworICAgICAgICB0bGJfYWRkciA9IGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2luZGV4XS5BRERSX1JFQUQ7CisgICAgfQorCisgICAgLyogSGFuZGxlIGFuIElPIGFjY2Vzcy4gICovCisgICAgaWYgKHVubGlrZWx5KHRsYl9hZGRyICYgflRBUkdFVF9QQUdFX01BU0spKSB7CisgICAgICAgIGh3YWRkciBpb2FkZHI7CisgICAgICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgZ290byBkb191bmFsaWduZWRfYWNjZXNzOworICAgICAgICB9CisgICAgICAgIGlvYWRkciA9IGVudi0+aW90bGJbbW11X2lkeF1baW5kZXhdOworCisgICAgICAgIC8qID8/PyBOb3RlIHRoYXQgdGhlIGlvIGhlbHBlcnMgYWx3YXlzIHJlYWQgZGF0YSBpbiB0aGUgdGFyZ2V0CisgICAgICAgICAgIGJ5dGUgb3JkZXJpbmcuICBXZSBzaG91bGQgcHVzaCB0aGUgTEUvQkUgcmVxdWVzdCBkb3duIGludG8gaW8uICAqLworICAgICAgICByZXMgPSBnbHVlKGlvX3JlYWQsIFNVRkZJWCkoZW52LCBpb2FkZHIsIGFkZHIsIHJldGFkZHIpOworICAgICAgICByZXMgPSBUR1RfQkUocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgc2xvdyB1bmFsaWduZWQgYWNjZXNzIChpdCBzcGFucyB0d28gcGFnZXMgb3IgSU8pLiAgKi8KKyAgICBpZiAoREFUQV9TSVpFID4gMQorICAgICAgICAmJiB1bmxpa2VseSgoYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSArIERBVEFfU0laRSAtIDEKKyAgICAgICAgICAgICAgICAgICAgPj0gVEFSR0VUX1BBR0VfU0laRSkpIHsKKyAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHIxLCBhZGRyMjsKKyAgICAgICAgREFUQV9UWVBFIHJlczEsIHJlczI7CisgICAgICAgIHVuc2lnbmVkIHNoaWZ0OworICAgIGRvX3VuYWxpZ25lZF9hY2Nlc3M6CisjaWZkZWYgQUxJR05FRF9PTkxZCisgICAgICAgIGRvX3VuYWxpZ25lZF9hY2Nlc3MoZW52LCBhZGRyLCBSRUFEX0FDQ0VTU19UWVBFLCBtbXVfaWR4LCByZXRhZGRyKTsKKyNlbmRpZgorICAgICAgICBhZGRyMSA9IGFkZHIgJiB+KERBVEFfU0laRSAtIDEpOworICAgICAgICBhZGRyMiA9IGFkZHIxICsgREFUQV9TSVpFOworICAgICAgICAvKiBOb3RlIHRoZSBhZGp1c3RtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgICBVbmRvIHRoYXQgZm9yIHRoZSByZWN1cnNpb24uICAqLworICAgICAgICByZXMxID0gaGVscGVyX2JlX2xkX25hbWUoZW52LCBhZGRyMSwgbW11X2lkeCwgcmV0YWRkciArIEdFVFBDX0FESik7CisgICAgICAgIHJlczIgPSBoZWxwZXJfYmVfbGRfbmFtZShlbnYsIGFkZHIyLCBtbXVfaWR4LCByZXRhZGRyICsgR0VUUENfQURKKTsKKyAgICAgICAgc2hpZnQgPSAoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgKiA4OworCisgICAgICAgIC8qIEJpZy1lbmRpYW4gY29tYmluZS4gICovCisgICAgICAgIHJlcyA9IChyZXMxIDw8IHNoaWZ0KSB8IChyZXMyID4+ICgoREFUQV9TSVpFICogOCkgLSBzaGlmdCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8qIEhhbmRsZSBhbGlnbmVkIGFjY2VzcyBvciB1bmFsaWduZWQgYWNjZXNzIGluIHRoZSBzYW1lIHBhZ2UuICAqLworI2lmZGVmIEFMSUdORURfT05MWQorICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzKGVudiwgYWRkciwgUkVBRF9BQ0NFU1NfVFlQRSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgfQorI2VuZGlmCisKKyAgICBoYWRkciA9IGFkZHIgKyBlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF0uYWRkZW5kOworICAgIHJlcyA9IGdsdWUoZ2x1ZShsZCwgTFNVRkZJWCksIF9iZV9wKSgodWludDhfdCAqKWhhZGRyKTsKKyAgICByZXR1cm4gcmVzOworfQorI2VuZGlmIC8qIERBVEFfU0laRSA+IDEgKi8KKworREFUQV9UWVBFCitnbHVlKGdsdWUoaGVscGVyX2xkLCBTVUZGSVgpLCBNTVVTVUZGSVgpKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgpCit7CisgICAgcmV0dXJuIGhlbHBlcl90ZV9sZF9uYW1lIChlbnYsIGFkZHIsIG1tdV9pZHgsIEdFVFJBKCkpOworfQorCisjaWZuZGVmIFNPRlRNTVVfQ09ERV9BQ0NFU1MKKworLyogUHJvdmlkZSBzaWduZWQgdmVyc2lvbnMgb2YgdGhlIGxvYWQgcm91dGluZXMgYXMgd2VsbC4gIFdlIGNhbiBvZiBjb3Vyc2UKKyAgIGF2b2lkIHRoaXMgZm9yIDY0LWJpdCBkYXRhLCBvciBmb3IgMzItYml0IGRhdGEgb24gMzItYml0IGhvc3QuICAqLworI2lmIERBVEFfU0laRSAqIDggPCBUQ0dfVEFSR0VUX1JFR19CSVRTCitXT1JEX1RZUEUgaGVscGVyX2xlX2xkc19uYW1lKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKQoreworICAgIHJldHVybiAoU0RBVEFfVFlQRSloZWxwZXJfbGVfbGRfbmFtZShlbnYsIGFkZHIsIG1tdV9pZHgsIHJldGFkZHIpOworfQorCisjIGlmIERBVEFfU0laRSA+IDEKK1dPUkRfVFlQRSBoZWxwZXJfYmVfbGRzX25hbWUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpCit7CisgICAgcmV0dXJuIChTREFUQV9UWVBFKWhlbHBlcl9iZV9sZF9uYW1lKGVudiwgYWRkciwgbW11X2lkeCwgcmV0YWRkcik7Cit9CisjIGVuZGlmCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGdsdWUoaW9fd3JpdGUsIFNVRkZJWCkoQ1BVQXJjaFN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgcGh5c2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX1RZUEUgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgcmV0YWRkcikKK3sKKyAgICBpbnQgaW5kZXggPSAocGh5c2FkZHIgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgIHBoeXNhZGRyID0gKHBoeXNhZGRyICYgVEFSR0VUX1BBR0VfTUFTSykgKyBhZGRyOworICAgIGlmIChpbmRleCA+IChJT19NRU1fTk9URElSVFkgPj4gSU9fTUVNX1NISUZUKQorICAgICAgICAgICAgJiYgIWNhbl9kb19pbyhlbnYpKSB7CisgICAgICAgIGNwdV9pb19yZWNvbXBpbGUoZW52LCByZXRhZGRyKTsKKyAgICB9CisKKyAgICBlbnYtPm1lbV9pb192YWRkciA9IGFkZHI7CisgICAgZW52LT5tZW1faW9fcGMgPSByZXRhZGRyOworI2lmIFNISUZUIDw9IDIKKyAgICBpb19tZW1fd3JpdGUoaW5kZXgsIHBoeXNhZGRyLCB2YWwsIDEgPDwgU0hJRlQpOworI2Vsc2UKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgaW9fbWVtX3dyaXRlKGluZGV4LCBwaHlzYWRkciwgdmFsID4+IDMyLCA0KTsKKyAgICBpb19tZW1fd3JpdGUoaW5kZXgsIHBoeXNhZGRyICsgNCwgdmFsLCA0KTsKKyNlbHNlCisgICAgaW9fbWVtX3dyaXRlKGluZGV4LCBwaHlzYWRkciwgdmFsLCA0KTsKKyAgICBpb19tZW1fd3JpdGUoaW5kZXgsIHBoeXNhZGRyICsgNCwgdmFsID4+IDMyLCA0KTsKKyNlbmRpZgorI2VuZGlmIC8qIFNISUZUID4gMiAqLworfQorCit2b2lkIGhlbHBlcl9sZV9zdF9uYW1lKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgREFUQV9UWVBFIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKQoreworICAgIGludCBpbmRleCA9IChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpICYgKENQVV9UTEJfU0laRSAtIDEpOworICAgIHRhcmdldF91bG9uZyB0bGJfYWRkciA9IGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2luZGV4XS5hZGRyX3dyaXRlOworICAgIHVpbnRwdHJfdCBoYWRkcjsKKworICAgIC8qIEFkanVzdCB0aGUgZ2l2ZW4gcmV0dXJuIGFkZHJlc3MuICAqLworICAgIHJldGFkZHIgLT0gR0VUUENfQURKOworCisgICAgLyogSWYgdGhlIFRMQiBlbnRyeSBpcyBmb3IgYSBkaWZmZXJlbnQgcGFnZSwgcmVsb2FkIGFuZCB0cnkgYWdhaW4uICAqLworICAgIGlmICgoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spCisgICAgICAgICE9ICh0bGJfYWRkciAmIChUQVJHRVRfUEFHRV9NQVNLIHwgVExCX0lOVkFMSURfTUFTSykpKSB7CisjaWZkZWYgQUxJR05FRF9PTkxZCisgICAgICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgZG9fdW5hbGlnbmVkX2FjY2VzcyhlbnYsIGFkZHIsIDEsIG1tdV9pZHgsIHJldGFkZHIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGxiX2ZpbGwoZW52LCBhZGRyLCAxLCBtbXVfaWR4LCByZXRhZGRyKTsKKyAgICAgICAgdGxiX2FkZHIgPSBlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF0uYWRkcl93cml0ZTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgYW4gSU8gYWNjZXNzLiAgKi8KKyAgICBpZiAodW5saWtlbHkodGxiX2FkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykpIHsKKyAgICAgICAgaHdhZGRyIGlvYWRkcjsKKyAgICAgICAgaWYgKChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAhPSAwKSB7CisgICAgICAgICAgICBnb3RvIGRvX3VuYWxpZ25lZF9hY2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgaW9hZGRyID0gZW52LT5pb3RsYlttbXVfaWR4XVtpbmRleF07CisKKyAgICAgICAgLyogPz8/IE5vdGUgdGhhdCB0aGUgaW8gaGVscGVycyBhbHdheXMgcmVhZCBkYXRhIGluIHRoZSB0YXJnZXQKKyAgICAgICAgICAgYnl0ZSBvcmRlcmluZy4gIFdlIHNob3VsZCBwdXNoIHRoZSBMRS9CRSByZXF1ZXN0IGRvd24gaW50byBpby4gICovCisgICAgICAgIHZhbCA9IFRHVF9MRSh2YWwpOworICAgICAgICBnbHVlKGlvX3dyaXRlLCBTVUZGSVgpKGVudiwgaW9hZGRyLCB2YWwsIGFkZHIsIHJldGFkZHIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSGFuZGxlIHNsb3cgdW5hbGlnbmVkIGFjY2VzcyAoaXQgc3BhbnMgdHdvIHBhZ2VzIG9yIElPKS4gICovCisgICAgaWYgKERBVEFfU0laRSA+IDEKKyAgICAgICAgJiYgdW5saWtlbHkoKGFkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykgKyBEQVRBX1NJWkUgLSAxCisgICAgICAgICAgICAgICAgICAgICA+PSBUQVJHRVRfUEFHRV9TSVpFKSkgeworICAgICAgICBpbnQgaTsKKyAgICBkb191bmFsaWduZWRfYWNjZXNzOgorI2lmZGVmIEFMSUdORURfT05MWQorICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzKGVudiwgYWRkciwgMSwgbW11X2lkeCwgcmV0YWRkcik7CisjZW5kaWYKKyAgICAgICAgLyogWFhYOiBub3QgZWZmaWNpZW50LCBidXQgc2ltcGxlICovCisgICAgICAgIC8qIE5vdGU6IHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRsYl9maWxsKCkgZG9lcyBub3QgcmVtb3ZlIHRoZQorICAgICAgICAgKiBwcmV2aW91cyBwYWdlIGZyb20gdGhlIFRMQiBjYWNoZS4gICovCisgICAgICAgIGZvciAoaSA9IERBVEFfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAvKiBMaXR0bGUtZW5kaWFuIGV4dHJhY3QuICAqLworICAgICAgICAgICAgdWludDhfdCB2YWw4ID0gdmFsID4+IChpICogOCk7CisgICAgICAgICAgICAvKiBOb3RlIHRoZSBhZGp1c3RtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgVW5kbyB0aGF0IGZvciB0aGUgcmVjdXJzaW9uLiAgKi8KKyAgICAgICAgICAgIGdsdWUoaGVscGVyX3JldF9zdGIsIE1NVVNVRkZJWCkoZW52LCBhZGRyICsgaSwgdmFsOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW11X2lkeCwgcmV0YWRkciArIEdFVFBDX0FESik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEhhbmRsZSBhbGlnbmVkIGFjY2VzcyBvciB1bmFsaWduZWQgYWNjZXNzIGluIHRoZSBzYW1lIHBhZ2UuICAqLworI2lmZGVmIEFMSUdORURfT05MWQorICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzKGVudiwgYWRkciwgMSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgfQorI2VuZGlmCisKKyAgICBoYWRkciA9IGFkZHIgKyBlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF0uYWRkZW5kOworI2lmIERBVEFfU0laRSA9PSAxCisgICAgZ2x1ZShnbHVlKHN0LCBTVUZGSVgpLCBfcCkoKHVpbnQ4X3QgKiloYWRkciwgdmFsKTsKKyNlbHNlCisgICAgZ2x1ZShnbHVlKHN0LCBTVUZGSVgpLCBfbGVfcCkoKHVpbnQ4X3QgKiloYWRkciwgdmFsKTsKKyNlbmRpZgorfQorCisjaWYgREFUQV9TSVpFID4gMQordm9pZCBoZWxwZXJfYmVfc3RfbmFtZShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIERBVEFfVFlQRSB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcikKK3sKKyAgICBpbnQgaW5kZXggPSAoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKKyAgICB0YXJnZXRfdWxvbmcgdGxiX2FkZHIgPSBlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF0uYWRkcl93cml0ZTsKKyAgICB1aW50cHRyX3QgaGFkZHI7CisKKyAgICAvKiBBZGp1c3QgdGhlIGdpdmVuIHJldHVybiBhZGRyZXNzLiAgKi8KKyAgICByZXRhZGRyIC09IEdFVFBDX0FESjsKKworICAgIC8qIElmIHRoZSBUTEIgZW50cnkgaXMgZm9yIGEgZGlmZmVyZW50IHBhZ2UsIHJlbG9hZCBhbmQgdHJ5IGFnYWluLiAgKi8KKyAgICBpZiAoKGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLKQorICAgICAgICAhPSAodGxiX2FkZHIgJiAoVEFSR0VUX1BBR0VfTUFTSyB8IFRMQl9JTlZBTElEX01BU0spKSkgeworI2lmZGVmIEFMSUdORURfT05MWQorICAgICAgICBpZiAoKGFkZHIgJiAoREFUQV9TSVpFIC0gMSkpICE9IDApIHsKKyAgICAgICAgICAgIGRvX3VuYWxpZ25lZF9hY2Nlc3MoZW52LCBhZGRyLCAxLCBtbXVfaWR4LCByZXRhZGRyKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRsYl9maWxsKGVudiwgYWRkciwgMSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgICAgIHRsYl9hZGRyID0gZW52LT50bGJfdGFibGVbbW11X2lkeF1baW5kZXhdLmFkZHJfd3JpdGU7CisgICAgfQorCisgICAgLyogSGFuZGxlIGFuIElPIGFjY2Vzcy4gICovCisgICAgaWYgKHVubGlrZWx5KHRsYl9hZGRyICYgflRBUkdFVF9QQUdFX01BU0spKSB7CisgICAgICAgIGh3YWRkciBpb2FkZHI7CisgICAgICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgZ290byBkb191bmFsaWduZWRfYWNjZXNzOworICAgICAgICB9CisgICAgICAgIGlvYWRkciA9IGVudi0+aW90bGJbbW11X2lkeF1baW5kZXhdOworCisgICAgICAgIC8qID8/PyBOb3RlIHRoYXQgdGhlIGlvIGhlbHBlcnMgYWx3YXlzIHJlYWQgZGF0YSBpbiB0aGUgdGFyZ2V0CisgICAgICAgICAgIGJ5dGUgb3JkZXJpbmcuICBXZSBzaG91bGQgcHVzaCB0aGUgTEUvQkUgcmVxdWVzdCBkb3duIGludG8gaW8uICAqLworICAgICAgICB2YWwgPSBUR1RfQkUodmFsKTsKKyAgICAgICAgZ2x1ZShpb193cml0ZSwgU1VGRklYKShlbnYsIGlvYWRkciwgdmFsLCBhZGRyLCByZXRhZGRyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEhhbmRsZSBzbG93IHVuYWxpZ25lZCBhY2Nlc3MgKGl0IHNwYW5zIHR3byBwYWdlcyBvciBJTykuICAqLworICAgIGlmIChEQVRBX1NJWkUgPiAxCisgICAgICAgICYmIHVubGlrZWx5KChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsgREFUQV9TSVpFIC0gMQorICAgICAgICAgICAgICAgICAgICAgPj0gVEFSR0VUX1BBR0VfU0laRSkpIHsKKyAgICAgICAgaW50IGk7CisgICAgZG9fdW5hbGlnbmVkX2FjY2VzczoKKyNpZmRlZiBBTElHTkVEX09OTFkKKyAgICAgICAgZG9fdW5hbGlnbmVkX2FjY2VzcyhlbnYsIGFkZHIsIDEsIG1tdV9pZHgsIHJldGFkZHIpOworI2VuZGlmCisgICAgICAgIC8qIFhYWDogbm90IGVmZmljaWVudCwgYnV0IHNpbXBsZSAqLworICAgICAgICAvKiBOb3RlOiByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCB0bGJfZmlsbCgpIGRvZXMgbm90IHJlbW92ZSB0aGUKKyAgICAgICAgICogcHJldmlvdXMgcGFnZSBmcm9tIHRoZSBUTEIgY2FjaGUuICAqLworICAgICAgICBmb3IgKGkgPSBEQVRBX1NJWkUgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgLyogQmlnLWVuZGlhbiBleHRyYWN0LiAgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgdmFsOCA9IHZhbCA+PiAoKChEQVRBX1NJWkUgLSAxKSAqIDgpIC0gKGkgKiA4KSk7CisgICAgICAgICAgICAvKiBOb3RlIHRoZSBhZGp1c3RtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgVW5kbyB0aGF0IGZvciB0aGUgcmVjdXJzaW9uLiAgKi8KKyAgICAgICAgICAgIGdsdWUoaGVscGVyX3JldF9zdGIsIE1NVVNVRkZJWCkoZW52LCBhZGRyICsgaSwgdmFsOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW11X2lkeCwgcmV0YWRkciArIEdFVFBDX0FESik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEhhbmRsZSBhbGlnbmVkIGFjY2VzcyBvciB1bmFsaWduZWQgYWNjZXNzIGluIHRoZSBzYW1lIHBhZ2UuICAqLworI2lmZGVmIEFMSUdORURfT05MWQorICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkgeworICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzKGVudiwgYWRkciwgMSwgbW11X2lkeCwgcmV0YWRkcik7CisgICAgfQorI2VuZGlmCisKKyAgICBoYWRkciA9IGFkZHIgKyBlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF0uYWRkZW5kOworICAgIGdsdWUoZ2x1ZShzdCwgU1VGRklYKSwgX2JlX3ApKCh1aW50OF90ICopaGFkZHIsIHZhbCk7Cit9CisjZW5kaWYgLyogREFUQV9TSVpFID4gMSAqLworCit2b2lkCitnbHVlKGdsdWUoaGVscGVyX3N0LCBTVUZGSVgpLCBNTVVTVUZGSVgpKENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9UWVBFIHZhbCwgaW50IG1tdV9pZHgpCit7CisgICAgaGVscGVyX3RlX3N0X25hbWUoZW52LCBhZGRyLCB2YWwsIG1tdV9pZHgsIEdFVFJBKCkpOworfQorCisjZW5kaWYgLyogIWRlZmluZWQoU09GVE1NVV9DT0RFX0FDQ0VTUykgKi8KKworI3VuZGVmIFJFQURfQUNDRVNTX1RZUEUKKyN1bmRlZiBTSElGVAorI3VuZGVmIERBVEFfVFlQRQorI3VuZGVmIFNVRkZJWAorI3VuZGVmIExTVUZGSVgKKyN1bmRlZiBEQVRBX1NJWkUKKyN1bmRlZiBBRERSX1JFQUQKKyN1bmRlZiBXT1JEX1RZUEUKKyN1bmRlZiBTREFUQV9UWVBFCisjdW5kZWYgVVNVRkZJWAorI3VuZGVmIFNTVUZGSVgKKyN1bmRlZiBCU1dBUAorI3VuZGVmIFRHVF9CRQorI3VuZGVmIFRHVF9MRQorI3VuZGVmIENQVV9CRQorI3VuZGVmIENQVV9MRQorI3VuZGVmIGhlbHBlcl9sZV9sZF9uYW1lCisjdW5kZWYgaGVscGVyX2JlX2xkX25hbWUKKyN1bmRlZiBoZWxwZXJfbGVfbGRzX25hbWUKKyN1bmRlZiBoZWxwZXJfYmVfbGRzX25hbWUKKyN1bmRlZiBoZWxwZXJfbGVfc3RfbmFtZQorI3VuZGVmIGhlbHBlcl9iZV9zdF9uYW1lCisjdW5kZWYgaGVscGVyX3RlX2xkX25hbWUKKyN1bmRlZiBoZWxwZXJfdGVfc3RfbmFtZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2V4ZWMvc3BpbmxvY2suaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NwaW5sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZWRkYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9leGVjL3NwaW5sb2NrLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+CisgKi8KKworLyogY29uZmlndXJlIGd1YXJhbnRlZXMgdXMgdGhhdCB3ZSBoYXZlIHB0aHJlYWRzIG9uIGFueSBob3N0IGV4Y2VwdAorICogbWluZ3czMiwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGFueSBvZiB0aGUgdXNlci1vbmx5IHRhcmdldHMuCisgKiBTbyB3ZSBjYW4gc2ltcGx5IGFzc3VtZSB3ZSBoYXZlIHB0aHJlYWQgbXV0ZXhlcyBoZXJlLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2RlZmluZSBzcGluX2xvY2sgcHRocmVhZF9tdXRleF9sb2NrCisjZGVmaW5lIHNwaW5fdW5sb2NrIHB0aHJlYWRfbXV0ZXhfdW5sb2NrCisjZGVmaW5lIHNwaW5sb2NrX3QgcHRocmVhZF9tdXRleF90CisjZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCisKKyNlbHNlCisKKy8qIEVtcHR5IGltcGxlbWVudGF0aW9ucywgb24gdGhlIHRoZW9yeSB0aGF0IHN5c3RlbSBtb2RlIGVtdWxhdGlvbgorICogaXMgc2luZ2xlLXRocmVhZGVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBvbmx5CisgKiBiZSB1c2VkIGZyb20gY29kZSBydW4gaW4gdGhlIFRDRyBjcHUgdGhyZWFkLCBhbmQgY2Fubm90IHByb3RlY3QKKyAqIGRhdGEgc3RydWN0dXJlcyB3aGljaCBtaWdodCBhbHNvIGJlIGFjY2Vzc2VkIGZyb20gdGhlIElPIHRocmVhZAorICogb3IgZnJvbSBzaWduYWwgaGFuZGxlcnMuCisgKi8KK3R5cGVkZWYgaW50IHNwaW5sb2NrX3Q7CisjZGVmaW5lIFNQSU5fTE9DS19VTkxPQ0tFRCAwCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGluX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaW5fdW5sb2NrKHNwaW5sb2NrX3QgKmxvY2spCit7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2ZwdS9zb2Z0ZmxvYXQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9mcHUvc29mdGZsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2NTI3NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9mcHUvc29mdGZsb2F0LmgKQEAgLTAsMCArMSw2NDUgQEAKKy8qCisgKiBRRU1VIGZsb2F0IHN1cHBvcnQKKyAqCisgKiBEZXJpdmVkIGZyb20gU29mdEZsb2F0LgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIEMgaGVhZGVyIGZpbGUgaXMgcGFydCBvZiB0aGUgU29mdEZsb2F0IElFQy9JRUVFIEZsb2F0aW5nLXBvaW50IEFyaXRobWV0aWMKK1BhY2thZ2UsIFJlbGVhc2UgMmIuCisKK1dyaXR0ZW4gYnkgSm9obiBSLiBIYXVzZXIuICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgaW4gcGFydCBieSB0aGUKK0ludGVybmF0aW9uYWwgQ29tcHV0ZXIgU2NpZW5jZSBJbnN0aXR1dGUsIGxvY2F0ZWQgYXQgU3VpdGUgNjAwLCAxOTQ3IENlbnRlcgorU3RyZWV0LCBCZXJrZWxleSwgQ2FsaWZvcm5pYSA5NDcwNC4gIEZ1bmRpbmcgd2FzIHBhcnRpYWxseSBwcm92aWRlZCBieSB0aGUKK05hdGlvbmFsIFNjaWVuY2UgRm91bmRhdGlvbiB1bmRlciBncmFudCBNSVAtOTMxMTk4MC4gIFRoZSBvcmlnaW5hbCB2ZXJzaW9uCitvZiB0aGlzIGNvZGUgd2FzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gYnVpbGQgYSBmaXhlZC1wb2ludCB2ZWN0b3IKK3Byb2Nlc3NvciBpbiBjb2xsYWJvcmF0aW9uIHdpdGggdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleSwKK292ZXJzZWVuIGJ5IFByb2ZzLiBOZWxzb24gTW9yZ2FuIGFuZCBKb2huIFdhd3J6eW5lay4gIE1vcmUgaW5mb3JtYXRpb24KK2lzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBXZWIgcGFnZSBgaHR0cDovL3d3dy5jcy5iZXJrZWxleS5lZHUvfmpoYXVzZXIvCithcml0aG1ldGljL1NvZnRGbG9hdC5odG1sJy4KKworVEhJUyBTT0ZUV0FSRSBJUyBESVNUUklCVVRFRCBBUyBJUywgRk9SIEZSRUUuICBBbHRob3VnaCByZWFzb25hYmxlIGVmZm9ydCBoYXMKK2JlZW4gbWFkZSB0byBhdm9pZCBpdCwgVEhJUyBTT0ZUV0FSRSBNQVkgQ09OVEFJTiBGQVVMVFMgVEhBVCBXSUxMIEFUIFRJTUVTCitSRVNVTFQgSU4gSU5DT1JSRUNUIEJFSEFWSU9SLiAgVVNFIE9GIFRISVMgU09GVFdBUkUgSVMgUkVTVFJJQ1RFRCBUTyBQRVJTT05TCitBTkQgT1JHQU5JWkFUSU9OUyBXSE8gQ0FOIEFORCBXSUxMIFRBS0UgRlVMTCBSRVNQT05TSUJJTElUWSBGT1IgQUxMIExPU1NFUywKK0NPU1RTLCBPUiBPVEhFUiBQUk9CTEVNUyBUSEVZIElOQ1VSIERVRSBUTyBUSEUgU09GVFdBUkUsIEFORCBXSE8gRlVSVEhFUk1PUkUKK0VGRkVDVElWRUxZIElOREVNTklGWSBKT0hOIEhBVVNFUiBBTkQgVEhFIElOVEVSTkFUSU9OQUwgQ09NUFVURVIgU0NJRU5DRQorSU5TVElUVVRFIChwb3NzaWJseSB2aWEgc2ltaWxhciBsZWdhbCB3YXJuaW5nKSBBR0FJTlNUIEFMTCBMT1NTRVMsIENPU1RTLCBPUgorT1RIRVIgUFJPQkxFTVMgSU5DVVJSRUQgQlkgVEhFSVIgQ1VTVE9NRVJTIEFORCBDTElFTlRTIERVRSBUTyBUSEUgU09GVFdBUkUuCisKK0Rlcml2YXRpdmUgd29ya3MgYXJlIGFjY2VwdGFibGUsIGV2ZW4gZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMsIHNvIGxvbmcgYXMKKygxKSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBkZXJpdmF0aXZlIHdvcmsgaW5jbHVkZXMgcHJvbWluZW50IG5vdGljZSB0aGF0Cit0aGUgd29yayBpcyBkZXJpdmF0aXZlLCBhbmQgKDIpIHRoZSBzb3VyY2UgY29kZSBpbmNsdWRlcyBwcm9taW5lbnQgbm90aWNlIHdpdGgKK3RoZXNlIGZvdXIgcGFyYWdyYXBocyBmb3IgdGhvc2UgcGFydHMgb2YgdGhpcyBjb2RlIHRoYXQgYXJlIHJldGFpbmVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgU09GVEZMT0FUX0gKKyNkZWZpbmUgU09GVEZMT0FUX0gKKworI2lmIGRlZmluZWQoQ09ORklHX1NPTEFSSVMpICYmIGRlZmluZWQoQ09ORklHX05FRURTX0xJQlNVTk1BVEgpCisjaW5jbHVkZSA8c3VubWF0aC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGB0eXBlZGVmJ3MgZGVmaW5lcyB0aGUgbW9zdCBjb252ZW5pZW50IHR5cGUgdGhhdCBob2xkcworfCBpbnRlZ2VycyBvZiBhdCBsZWFzdCBhcyBtYW55IGJpdHMgYXMgc3BlY2lmaWVkLiAgRm9yIGV4YW1wbGUsIGB1aW50OCcgc2hvdWxkCit8IGJlIHRoZSBtb3N0IGNvbnZlbmllbnQgdHlwZSB0aGF0IGNhbiBob2xkIHVuc2lnbmVkIGludGVnZXJzIG9mIGFzIG1hbnkgYXMKK3wgOCBiaXRzLiAgVGhlIGBmbGFnJyB0eXBlIG11c3QgYmUgYWJsZSB0byBob2xkIGVpdGhlciBhIDAgb3IgMS4gIEZvciBtb3N0Cit8IGltcGxlbWVudGF0aW9ucyBvZiBDLCBgZmxhZycsIGB1aW50OCcsIGFuZCBgaW50OCcgc2hvdWxkIGFsbCBiZSBgdHlwZWRlZidlZAorfCB0byB0aGUgc2FtZSBhcyBgaW50Jy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgdWludDhfdCBmbGFnOwordHlwZWRlZiB1aW50OF90IHVpbnQ4OwordHlwZWRlZiBpbnQ4X3QgaW50ODsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQzMjsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMjsKK3R5cGVkZWYgdWludDY0X3QgdWludDY0OwordHlwZWRlZiBpbnQ2NF90IGludDY0OworCisjZGVmaW5lIExJVDY0KCBhICkgYSMjTEwKKyNkZWZpbmUgSU5MSU5FIHN0YXRpYyBpbmxpbmUKKworI2RlZmluZSBTVEFUVVNfUEFSQU0gLCBmbG9hdF9zdGF0dXMgKnN0YXR1cworI2RlZmluZSBTVEFUVVMoZmllbGQpIHN0YXR1cy0+ZmllbGQKKyNkZWZpbmUgU1RBVFVTX1ZBUiAsIHN0YXR1cworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU29mdHdhcmUgSUVDL0lFRUUgZmxvYXRpbmctcG9pbnQgb3JkZXJpbmcgcmVsYXRpb25zCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlbnVtIHsKKyAgICBmbG9hdF9yZWxhdGlvbl9sZXNzICAgICAgPSAtMSwKKyAgICBmbG9hdF9yZWxhdGlvbl9lcXVhbCAgICAgPSAgMCwKKyAgICBmbG9hdF9yZWxhdGlvbl9ncmVhdGVyICAgPSAgMSwKKyAgICBmbG9hdF9yZWxhdGlvbl91bm9yZGVyZWQgPSAgMgorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNvZnR3YXJlIElFQy9JRUVFIGZsb2F0aW5nLXBvaW50IHR5cGVzLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVXNlIHN0cnVjdHVyZXMgZm9yIHNvZnQtZmxvYXQgdHlwZXMuICBUaGlzIHByZXZlbnRzIGFjY2lkZW50YWxseSBtaXhpbmcKKyAgIHRoZW0gd2l0aCBuYXRpdmUgaW50L2Zsb2F0IHR5cGVzLiAgQSBzdWZmaWNpZW50bHkgY2xldmVyIGNvbXBpbGVyIGFuZAorICAgc2FuZSBBQkkgc2hvdWxkIGJlIGFibGUgdG8gc2VlIHRob3VnaCB0aGVzZSBzdHJ1Y3RzLiAgSG93ZXZlcgorICAgeDg2L2djYyAzLnggc2VlbXMgdG8gc3RydWdnbGUgYSBiaXQsIHNvIGxlYXZlIHRoZW0gZGlzYWJsZWQgYnkgZGVmYXVsdC4gICovCisvLyNkZWZpbmUgVVNFX1NPRlRGTE9BVF9TVFJVQ1RfVFlQRVMKKyNpZmRlZiBVU0VfU09GVEZMT0FUX1NUUlVDVF9UWVBFUwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90IHY7Cit9IGZsb2F0MTY7CisjZGVmaW5lIGZsb2F0MTZfdmFsKHgpICgoKGZsb2F0MTYpKHgpKS52KQorI2RlZmluZSBtYWtlX2Zsb2F0MTYoeCkgX19leHRlbnNpb25fXyAoeyBmbG9hdDE2IGYxNl92YWwgPSB7eH07IGYxNl92YWw7IH0pCisjZGVmaW5lIGNvbnN0X2Zsb2F0MTYoeCkgeyB4IH0KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCB2OworfSBmbG9hdDMyOworLyogVGhlIGNhc3QgZW5zdXJlcyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgdHlwZSBpcyBwYXNzZWQuICAqLworI2RlZmluZSBmbG9hdDMyX3ZhbCh4KSAoKChmbG9hdDMyKSh4KSkudikKKyNkZWZpbmUgbWFrZV9mbG9hdDMyKHgpIF9fZXh0ZW5zaW9uX18gKHsgZmxvYXQzMiBmMzJfdmFsID0ge3h9OyBmMzJfdmFsOyB9KQorI2RlZmluZSBjb25zdF9mbG9hdDMyKHgpIHsgeCB9Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgdjsKK30gZmxvYXQ2NDsKKyNkZWZpbmUgZmxvYXQ2NF92YWwoeCkgKCgoZmxvYXQ2NCkoeCkpLnYpCisjZGVmaW5lIG1ha2VfZmxvYXQ2NCh4KSBfX2V4dGVuc2lvbl9fICh7IGZsb2F0NjQgZjY0X3ZhbCA9IHt4fTsgZjY0X3ZhbDsgfSkKKyNkZWZpbmUgY29uc3RfZmxvYXQ2NCh4KSB7IHggfQorI2Vsc2UKK3R5cGVkZWYgdWludDE2X3QgZmxvYXQxNjsKK3R5cGVkZWYgdWludDMyX3QgZmxvYXQzMjsKK3R5cGVkZWYgdWludDY0X3QgZmxvYXQ2NDsKKyNkZWZpbmUgZmxvYXQxNl92YWwoeCkgKHgpCisjZGVmaW5lIGZsb2F0MzJfdmFsKHgpICh4KQorI2RlZmluZSBmbG9hdDY0X3ZhbCh4KSAoeCkKKyNkZWZpbmUgbWFrZV9mbG9hdDE2KHgpICh4KQorI2RlZmluZSBtYWtlX2Zsb2F0MzIoeCkgKHgpCisjZGVmaW5lIG1ha2VfZmxvYXQ2NCh4KSAoeCkKKyNkZWZpbmUgY29uc3RfZmxvYXQxNih4KSAoeCkKKyNkZWZpbmUgY29uc3RfZmxvYXQzMih4KSAoeCkKKyNkZWZpbmUgY29uc3RfZmxvYXQ2NCh4KSAoeCkKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ2NF90IGxvdzsKKyAgICB1aW50MTZfdCBoaWdoOworfSBmbG9hdHg4MDsKKyNkZWZpbmUgbWFrZV9mbG9hdHg4MChleHAsIG1hbnQpICgoZmxvYXR4ODApIHsgbWFudCwgZXhwIH0pCisjZGVmaW5lIG1ha2VfZmxvYXR4ODBfaW5pdChleHAsIG1hbnQpIHsgLmxvdyA9IG1hbnQsIC5oaWdoID0gZXhwIH0KK3R5cGVkZWYgc3RydWN0IHsKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgIHVpbnQ2NF90IGhpZ2gsIGxvdzsKKyNlbHNlCisgICAgdWludDY0X3QgbG93LCBoaWdoOworI2VuZGlmCit9IGZsb2F0MTI4OworI2RlZmluZSBtYWtlX2Zsb2F0MTI4KGhpZ2hfLCBsb3dfKSAoKGZsb2F0MTI4KSB7IC5oaWdoID0gaGlnaF8sIC5sb3cgPSBsb3dfIH0pCisjZGVmaW5lIG1ha2VfZmxvYXQxMjhfaW5pdChoaWdoXywgbG93XykgeyAuaGlnaCA9IGhpZ2hfLCAubG93ID0gbG93XyB9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBmbG9hdGluZy1wb2ludCB1bmRlcmZsb3cgdGluaW5lc3MtZGV0ZWN0aW9uIG1vZGUuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlbnVtIHsKKyAgICBmbG9hdF90aW5pbmVzc19hZnRlcl9yb3VuZGluZyAgPSAwLAorICAgIGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZyA9IDEKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBmbG9hdGluZy1wb2ludCByb3VuZGluZyBtb2RlLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZW51bSB7CisgICAgZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuID0gMCwKKyAgICBmbG9hdF9yb3VuZF9kb3duICAgICAgICAgPSAxLAorICAgIGZsb2F0X3JvdW5kX3VwICAgICAgICAgICA9IDIsCisgICAgZmxvYXRfcm91bmRfdG9femVybyAgICAgID0gMworfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNvZnR3YXJlIElFQy9JRUVFIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBmbGFncy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2VudW0geworICAgIGZsb2F0X2ZsYWdfaW52YWxpZCAgID0gIDEsCisgICAgZmxvYXRfZmxhZ19kaXZieXplcm8gPSAgNCwKKyAgICBmbG9hdF9mbGFnX292ZXJmbG93ICA9ICA4LAorICAgIGZsb2F0X2ZsYWdfdW5kZXJmbG93ID0gMTYsCisgICAgZmxvYXRfZmxhZ19pbmV4YWN0ICAgPSAzMiwKKyAgICBmbG9hdF9mbGFnX2lucHV0X2Rlbm9ybWFsID0gNjQsCisgICAgZmxvYXRfZmxhZ19vdXRwdXRfZGVub3JtYWwgPSAxMjgKK307CisKK3R5cGVkZWYgc3RydWN0IGZsb2F0X3N0YXR1cyB7CisgICAgc2lnbmVkIGNoYXIgZmxvYXRfZGV0ZWN0X3RpbmluZXNzOworICAgIHNpZ25lZCBjaGFyIGZsb2F0X3JvdW5kaW5nX21vZGU7CisgICAgc2lnbmVkIGNoYXIgZmxvYXRfZXhjZXB0aW9uX2ZsYWdzOworICAgIHNpZ25lZCBjaGFyIGZsb2F0eDgwX3JvdW5kaW5nX3ByZWNpc2lvbjsKKyAgICAvKiBzaG91bGQgZGVub3JtYWxpc2VkIHJlc3VsdHMgZ28gdG8gemVybyBhbmQgc2V0IHRoZSBpbmV4YWN0IGZsYWc/ICovCisgICAgZmxhZyBmbHVzaF90b196ZXJvOworICAgIC8qIHNob3VsZCBkZW5vcm1hbGlzZWQgaW5wdXRzIGdvIHRvIHplcm8gYW5kIHNldCB0aGUgaW5wdXRfZGVub3JtYWwgZmxhZz8gKi8KKyAgICBmbGFnIGZsdXNoX2lucHV0c190b196ZXJvOworICAgIGZsYWcgZGVmYXVsdF9uYW5fbW9kZTsKK30gZmxvYXRfc3RhdHVzOworCit2b2lkIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGludCB2YWwgU1RBVFVTX1BBUkFNKTsKK3ZvaWQgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncyhpbnQgdmFsIFNUQVRVU19QQVJBTSk7CitJTkxJTkUgdm9pZCBzZXRfZmxvYXRfZGV0ZWN0X3RpbmluZXNzKGludCB2YWwgU1RBVFVTX1BBUkFNKQoreworICAgIFNUQVRVUyhmbG9hdF9kZXRlY3RfdGluaW5lc3MpID0gdmFsOworfQorSU5MSU5FIHZvaWQgc2V0X2ZsdXNoX3RvX3plcm8oZmxhZyB2YWwgU1RBVFVTX1BBUkFNKQoreworICAgIFNUQVRVUyhmbHVzaF90b196ZXJvKSA9IHZhbDsKK30KK0lOTElORSB2b2lkIHNldF9mbHVzaF9pbnB1dHNfdG9femVybyhmbGFnIHZhbCBTVEFUVVNfUEFSQU0pCit7CisgICAgU1RBVFVTKGZsdXNoX2lucHV0c190b196ZXJvKSA9IHZhbDsKK30KK0lOTElORSB2b2lkIHNldF9kZWZhdWx0X25hbl9tb2RlKGZsYWcgdmFsIFNUQVRVU19QQVJBTSkKK3sKKyAgICBTVEFUVVMoZGVmYXVsdF9uYW5fbW9kZSkgPSB2YWw7Cit9CitJTkxJTkUgaW50IGdldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoZmxvYXRfc3RhdHVzICpzdGF0dXMpCit7CisgICAgcmV0dXJuIFNUQVRVUyhmbG9hdF9leGNlcHRpb25fZmxhZ3MpOworfQordm9pZCBzZXRfZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uKGludCB2YWwgU1RBVFVTX1BBUkFNKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFJvdXRpbmUgdG8gcmFpc2UgYW55IG9yIGFsbCBvZiB0aGUgc29mdHdhcmUgSUVDL0lFRUUgZmxvYXRpbmctcG9pbnQKK3wgZXhjZXB0aW9uIGZsYWdzLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBmbG9hdF9yYWlzZSggaW50OCBmbGFncyBTVEFUVVNfUEFSQU0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgT3B0aW9ucyB0byBpbmRpY2F0ZSB3aGljaCBuZWdhdGlvbnMgdG8gcGVyZm9ybSBpbiBmbG9hdCpfbXVsYWRkKCkKK3wgVXNpbmcgdGhlc2UgZGlmZmVycyBmcm9tIG5lZ2F0aW5nIGFuIGlucHV0IG9yIG91dHB1dCBiZWZvcmUgY2FsbGluZworfCB0aGUgbXVsYWRkIGZ1bmN0aW9uIGluIHRoYXQgdGhpcyBtZWFucyB0aGF0IGEgTmFOIGRvZXNuJ3QgaGF2ZSBpdHMKK3wgc2lnbiBiaXQgaW52ZXJ0ZWQgYmVmb3JlIGl0IGlzIHByb3BhZ2F0ZWQuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitlbnVtIHsKKyAgICBmbG9hdF9tdWxhZGRfbmVnYXRlX2MgPSAxLAorICAgIGZsb2F0X211bGFkZF9uZWdhdGVfcHJvZHVjdCA9IDIsCisgICAgZmxvYXRfbXVsYWRkX25lZ2F0ZV9yZXN1bHQgPSA0LAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNvZnR3YXJlIElFQy9JRUVFIGludGVnZXItdG8tZmxvYXRpbmctcG9pbnQgY29udmVyc2lvbiByb3V0aW5lcy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Zsb2F0MzIgaW50MzJfdG9fZmxvYXQzMiggaW50MzIgU1RBVFVTX1BBUkFNICk7CitmbG9hdDY0IGludDMyX3RvX2Zsb2F0NjQoIGludDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiB1aW50MzJfdG9fZmxvYXQzMiggdWludDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCB1aW50MzJfdG9fZmxvYXQ2NCggdWludDMyIFNUQVRVU19QQVJBTSApOworZmxvYXR4ODAgaW50MzJfdG9fZmxvYXR4ODAoIGludDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQxMjggaW50MzJfdG9fZmxvYXQxMjgoIGludDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiBpbnQ2NF90b19mbG9hdDMyKCBpbnQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgdWludDY0X3RvX2Zsb2F0MzIoIHVpbnQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0NjQgaW50NjRfdG9fZmxvYXQ2NCggaW50NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdDY0IHVpbnQ2NF90b19mbG9hdDY0KCB1aW50NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdHg4MCBpbnQ2NF90b19mbG9hdHg4MCggaW50NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdDEyOCBpbnQ2NF90b19mbG9hdDEyOCggaW50NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdDEyOCB1aW50NjRfdG9fZmxvYXQxMjgoIHVpbnQ2NCBTVEFUVVNfUEFSQU0gKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNvZnR3YXJlIGhhbGYtcHJlY2lzaW9uIGNvbnZlcnNpb24gcm91dGluZXMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitmbG9hdDE2IGZsb2F0MzJfdG9fZmxvYXQxNiggZmxvYXQzMiwgZmxhZyBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQxNl90b19mbG9hdDMyKCBmbG9hdDE2LCBmbGFnIFNUQVRVU19QQVJBTSApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU29mdHdhcmUgaGFsZi1wcmVjaXNpb24gb3BlcmF0aW9ucy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBmbG9hdDE2X2lzX3F1aWV0X25hbiggZmxvYXQxNiApOworaW50IGZsb2F0MTZfaXNfc2lnbmFsaW5nX25hbiggZmxvYXQxNiApOworZmxvYXQxNiBmbG9hdDE2X21heWJlX3NpbGVuY2VfbmFuKCBmbG9hdDE2ICk7CisKK0lOTElORSBpbnQgZmxvYXQxNl9pc19hbnlfbmFuKGZsb2F0MTYgYSkKK3sKKyAgICByZXR1cm4gKChmbG9hdDE2X3ZhbChhKSAmIH4weDgwMDApID4gMHg3YzAwKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBwYXR0ZXJuIGZvciBhIGRlZmF1bHQgZ2VuZXJhdGVkIGhhbGYtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBjb25zdCBmbG9hdDE2IGZsb2F0MTZfZGVmYXVsdF9uYW47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBzaW5nbGUtcHJlY2lzaW9uIGNvbnZlcnNpb24gcm91dGluZXMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnRfZmFzdDE2X3QgZmxvYXQzMl90b19pbnQxNl9yb3VuZF90b196ZXJvKGZsb2F0MzIgU1RBVFVTX1BBUkFNKTsKK3VpbnRfZmFzdDE2X3QgZmxvYXQzMl90b191aW50MTZfcm91bmRfdG9femVybyhmbG9hdDMyIFNUQVRVU19QQVJBTSk7CitpbnQzMiBmbG9hdDMyX3RvX2ludDMyKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworaW50MzIgZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOwordWludDMyIGZsb2F0MzJfdG9fdWludDMyKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOwordWludDMyIGZsb2F0MzJfdG9fdWludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQ2NCBmbG9hdDMyX3RvX2ludDY0KCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworaW50NjQgZmxvYXQzMl90b19pbnQ2NF9yb3VuZF90b196ZXJvKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCBmbG9hdDMyX3RvX2Zsb2F0NjQoIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitmbG9hdHg4MCBmbG9hdDMyX3RvX2Zsb2F0eDgwKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQxMjggZmxvYXQzMl90b19mbG9hdDEyOCggZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFNvZnR3YXJlIElFQy9JRUVFIHNpbmdsZS1wcmVjaXNpb24gb3BlcmF0aW9ucy4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2Zsb2F0MzIgZmxvYXQzMl9yb3VuZF90b19pbnQoIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitmbG9hdDMyIGZsb2F0MzJfYWRkKCBmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiBmbG9hdDMyX3N1YiggZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQzMl9tdWwoIGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitmbG9hdDMyIGZsb2F0MzJfZGl2KCBmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiBmbG9hdDMyX3JlbSggZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQzMl9tdWxhZGQoZmxvYXQzMiwgZmxvYXQzMiwgZmxvYXQzMiwgaW50IFNUQVRVU19QQVJBTSk7CitmbG9hdDMyIGZsb2F0MzJfc3FydCggZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQzMl9leHAyKCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiBmbG9hdDMyX2xvZzIoIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQzMl9lcSggZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDMyX2xlKCBmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MzJfbHQoIGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQzMl91bm9yZGVyZWQoIGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQzMl9lcV9xdWlldCggZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDMyX2xlX3F1aWV0KCBmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MzJfbHRfcXVpZXQoIGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQzMl91bm9yZGVyZWRfcXVpZXQoIGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQzMl9jb21wYXJlKCBmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MzJfY29tcGFyZV9xdWlldCggZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQzMl9taW4oZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0pOworZmxvYXQzMiBmbG9hdDMyX21heChmbG9hdDMyLCBmbG9hdDMyIFNUQVRVU19QQVJBTSk7CitmbG9hdDMyIGZsb2F0MzJfbWlubnVtKGZsb2F0MzIsIGZsb2F0MzIgU1RBVFVTX1BBUkFNKTsKK2Zsb2F0MzIgZmxvYXQzMl9tYXhudW0oZmxvYXQzMiwgZmxvYXQzMiBTVEFUVVNfUEFSQU0pOworaW50IGZsb2F0MzJfaXNfcXVpZXRfbmFuKCBmbG9hdDMyICk7CitpbnQgZmxvYXQzMl9pc19zaWduYWxpbmdfbmFuKCBmbG9hdDMyICk7CitmbG9hdDMyIGZsb2F0MzJfbWF5YmVfc2lsZW5jZV9uYW4oIGZsb2F0MzIgKTsKK2Zsb2F0MzIgZmxvYXQzMl9zY2FsYm4oIGZsb2F0MzIsIGludCBTVEFUVVNfUEFSQU0gKTsKKworSU5MSU5FIGZsb2F0MzIgZmxvYXQzMl9hYnMoZmxvYXQzMiBhKQoreworICAgIC8qIE5vdGUgdGhhdCBhYnMgZG9lcyAqbm90KiBoYW5kbGUgTmFOIHNwZWNpYWxseSwgbm9yIGRvZXMKKyAgICAgKiBpdCBmbHVzaCBkZW5vcm1hbCBpbnB1dHMgdG8gemVyby4KKyAgICAgKi8KKyAgICByZXR1cm4gbWFrZV9mbG9hdDMyKGZsb2F0MzJfdmFsKGEpICYgMHg3ZmZmZmZmZik7Cit9CisKK0lOTElORSBmbG9hdDMyIGZsb2F0MzJfY2hzKGZsb2F0MzIgYSkKK3sKKyAgICAvKiBOb3RlIHRoYXQgY2hzIGRvZXMgKm5vdCogaGFuZGxlIE5hTiBzcGVjaWFsbHksIG5vciBkb2VzCisgICAgICogaXQgZmx1c2ggZGVub3JtYWwgaW5wdXRzIHRvIHplcm8uCisgICAgICovCisgICAgcmV0dXJuIG1ha2VfZmxvYXQzMihmbG9hdDMyX3ZhbChhKSBeIDB4ODAwMDAwMDApOworfQorCitJTkxJTkUgaW50IGZsb2F0MzJfaXNfaW5maW5pdHkoZmxvYXQzMiBhKQoreworICAgIHJldHVybiAoZmxvYXQzMl92YWwoYSkgJiAweDdmZmZmZmZmKSA9PSAweDdmODAwMDAwOworfQorCitJTkxJTkUgaW50IGZsb2F0MzJfaXNfbmVnKGZsb2F0MzIgYSkKK3sKKyAgICByZXR1cm4gZmxvYXQzMl92YWwoYSkgPj4gMzE7Cit9CisKK0lOTElORSBpbnQgZmxvYXQzMl9pc196ZXJvKGZsb2F0MzIgYSkKK3sKKyAgICByZXR1cm4gKGZsb2F0MzJfdmFsKGEpICYgMHg3ZmZmZmZmZikgPT0gMDsKK30KKworSU5MSU5FIGludCBmbG9hdDMyX2lzX2FueV9uYW4oZmxvYXQzMiBhKQoreworICAgIHJldHVybiAoKGZsb2F0MzJfdmFsKGEpICYgfigxIDw8IDMxKSkgPiAweDdmODAwMDAwVUwpOworfQorCitJTkxJTkUgaW50IGZsb2F0MzJfaXNfemVyb19vcl9kZW5vcm1hbChmbG9hdDMyIGEpCit7CisgICAgcmV0dXJuIChmbG9hdDMyX3ZhbChhKSAmIDB4N2Y4MDAwMDApID09IDA7Cit9CisKK0lOTElORSBmbG9hdDMyIGZsb2F0MzJfc2V0X3NpZ24oZmxvYXQzMiBhLCBpbnQgc2lnbikKK3sKKyAgICByZXR1cm4gbWFrZV9mbG9hdDMyKChmbG9hdDMyX3ZhbChhKSAmIDB4N2ZmZmZmZmYpIHwgKHNpZ24gPDwgMzEpKTsKK30KKworI2RlZmluZSBmbG9hdDMyX3plcm8gbWFrZV9mbG9hdDMyKDApCisjZGVmaW5lIGZsb2F0MzJfb25lIG1ha2VfZmxvYXQzMigweDNmODAwMDAwKQorI2RlZmluZSBmbG9hdDMyX2xuMiBtYWtlX2Zsb2F0MzIoMHgzZjMxNzIxOCkKKyNkZWZpbmUgZmxvYXQzMl9waSBtYWtlX2Zsb2F0MzIoMHg0MDQ5MGZkYikKKyNkZWZpbmUgZmxvYXQzMl9oYWxmIG1ha2VfZmxvYXQzMigweDNmMDAwMDAwKQorI2RlZmluZSBmbG9hdDMyX2luZmluaXR5IG1ha2VfZmxvYXQzMigweDdmODAwMDAwKQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUaGUgcGF0dGVybiBmb3IgYSBkZWZhdWx0IGdlbmVyYXRlZCBzaW5nbGUtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBjb25zdCBmbG9hdDMyIGZsb2F0MzJfZGVmYXVsdF9uYW47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBkb3VibGUtcHJlY2lzaW9uIGNvbnZlcnNpb24gcm91dGluZXMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnRfZmFzdDE2X3QgZmxvYXQ2NF90b19pbnQxNl9yb3VuZF90b196ZXJvKGZsb2F0NjQgU1RBVFVTX1BBUkFNKTsKK3VpbnRfZmFzdDE2X3QgZmxvYXQ2NF90b191aW50MTZfcm91bmRfdG9femVybyhmbG9hdDY0IFNUQVRVU19QQVJBTSk7CitpbnQzMiBmbG9hdDY0X3RvX2ludDMyKCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworaW50MzIgZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOwordWludDMyIGZsb2F0NjRfdG9fdWludDMyKCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOwordWludDMyIGZsb2F0NjRfdG9fdWludDMyX3JvdW5kX3RvX3plcm8oIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQ2NCBmbG9hdDY0X3RvX2ludDY0KCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworaW50NjQgZmxvYXQ2NF90b19pbnQ2NF9yb3VuZF90b196ZXJvKCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOwordWludDY0IGZsb2F0NjRfdG9fdWludDY0IChmbG9hdDY0IGEgU1RBVFVTX1BBUkFNKTsKK3VpbnQ2NCBmbG9hdDY0X3RvX3VpbnQ2NF9yb3VuZF90b196ZXJvIChmbG9hdDY0IGEgU1RBVFVTX1BBUkFNKTsKK2Zsb2F0MzIgZmxvYXQ2NF90b19mbG9hdDMyKCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworZmxvYXR4ODAgZmxvYXQ2NF90b19mbG9hdHg4MCggZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MTI4IGZsb2F0NjRfdG9fZmxvYXQxMjgoIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBkb3VibGUtcHJlY2lzaW9uIG9wZXJhdGlvbnMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitmbG9hdDY0IGZsb2F0NjRfcm91bmRfdG9faW50KCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCBmbG9hdDY0X3RydW5jX3RvX2ludCggZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0NjQgZmxvYXQ2NF9hZGQoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdDY0IGZsb2F0NjRfc3ViKCBmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCBmbG9hdDY0X211bCggZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0NjQgZmxvYXQ2NF9kaXYoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitmbG9hdDY0IGZsb2F0NjRfcmVtKCBmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCBmbG9hdDY0X211bGFkZChmbG9hdDY0LCBmbG9hdDY0LCBmbG9hdDY0LCBpbnQgU1RBVFVTX1BBUkFNKTsKK2Zsb2F0NjQgZmxvYXQ2NF9zcXJ0KCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworZmxvYXQ2NCBmbG9hdDY0X2xvZzIoIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQ2NF9lcSggZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDY0X2xlKCBmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0NjRfbHQoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQ2NF91bm9yZGVyZWQoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQ2NF9lcV9xdWlldCggZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDY0X2xlX3F1aWV0KCBmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0NjRfbHRfcXVpZXQoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQ2NF91bm9yZGVyZWRfcXVpZXQoIGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQ2NF9jb21wYXJlKCBmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0NjRfY29tcGFyZV9xdWlldCggZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0NjQgZmxvYXQ2NF9taW4oZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0pOworZmxvYXQ2NCBmbG9hdDY0X21heChmbG9hdDY0LCBmbG9hdDY0IFNUQVRVU19QQVJBTSk7CitmbG9hdDY0IGZsb2F0NjRfbWlubnVtKGZsb2F0NjQsIGZsb2F0NjQgU1RBVFVTX1BBUkFNKTsKK2Zsb2F0NjQgZmxvYXQ2NF9tYXhudW0oZmxvYXQ2NCwgZmxvYXQ2NCBTVEFUVVNfUEFSQU0pOworaW50IGZsb2F0NjRfaXNfcXVpZXRfbmFuKCBmbG9hdDY0IGEgKTsKK2ludCBmbG9hdDY0X2lzX3NpZ25hbGluZ19uYW4oIGZsb2F0NjQgKTsKK2Zsb2F0NjQgZmxvYXQ2NF9tYXliZV9zaWxlbmNlX25hbiggZmxvYXQ2NCApOworZmxvYXQ2NCBmbG9hdDY0X3NjYWxibiggZmxvYXQ2NCwgaW50IFNUQVRVU19QQVJBTSApOworCitJTkxJTkUgZmxvYXQ2NCBmbG9hdDY0X2FicyhmbG9hdDY0IGEpCit7CisgICAgLyogTm90ZSB0aGF0IGFicyBkb2VzICpub3QqIGhhbmRsZSBOYU4gc3BlY2lhbGx5LCBub3IgZG9lcworICAgICAqIGl0IGZsdXNoIGRlbm9ybWFsIGlucHV0cyB0byB6ZXJvLgorICAgICAqLworICAgIHJldHVybiBtYWtlX2Zsb2F0NjQoZmxvYXQ2NF92YWwoYSkgJiAweDdmZmZmZmZmZmZmZmZmZmZMTCk7Cit9CisKK0lOTElORSBmbG9hdDY0IGZsb2F0NjRfY2hzKGZsb2F0NjQgYSkKK3sKKyAgICAvKiBOb3RlIHRoYXQgY2hzIGRvZXMgKm5vdCogaGFuZGxlIE5hTiBzcGVjaWFsbHksIG5vciBkb2VzCisgICAgICogaXQgZmx1c2ggZGVub3JtYWwgaW5wdXRzIHRvIHplcm8uCisgICAgICovCisgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NChmbG9hdDY0X3ZhbChhKSBeIDB4ODAwMDAwMDAwMDAwMDAwMExMKTsKK30KKworSU5MSU5FIGludCBmbG9hdDY0X2lzX2luZmluaXR5KGZsb2F0NjQgYSkKK3sKKyAgICByZXR1cm4gKGZsb2F0NjRfdmFsKGEpICYgMHg3ZmZmZmZmZmZmZmZmZmZmTEwgKSA9PSAweDdmZjAwMDAwMDAwMDAwMDBMTDsKK30KKworSU5MSU5FIGludCBmbG9hdDY0X2lzX25lZyhmbG9hdDY0IGEpCit7CisgICAgcmV0dXJuIGZsb2F0NjRfdmFsKGEpID4+IDYzOworfQorCitJTkxJTkUgaW50IGZsb2F0NjRfaXNfemVybyhmbG9hdDY0IGEpCit7CisgICAgcmV0dXJuIChmbG9hdDY0X3ZhbChhKSAmIDB4N2ZmZmZmZmZmZmZmZmZmZkxMKSA9PSAwOworfQorCitJTkxJTkUgaW50IGZsb2F0NjRfaXNfYW55X25hbihmbG9hdDY0IGEpCit7CisgICAgcmV0dXJuICgoZmxvYXQ2NF92YWwoYSkgJiB+KDFVTEwgPDwgNjMpKSA+IDB4N2ZmMDAwMDAwMDAwMDAwMFVMTCk7Cit9CisKK0lOTElORSBpbnQgZmxvYXQ2NF9pc196ZXJvX29yX2Rlbm9ybWFsKGZsb2F0NjQgYSkKK3sKKyAgICByZXR1cm4gKGZsb2F0NjRfdmFsKGEpICYgMHg3ZmYwMDAwMDAwMDAwMDAwTEwpID09IDA7Cit9CisKK0lOTElORSBmbG9hdDY0IGZsb2F0NjRfc2V0X3NpZ24oZmxvYXQ2NCBhLCBpbnQgc2lnbikKK3sKKyAgICByZXR1cm4gbWFrZV9mbG9hdDY0KChmbG9hdDY0X3ZhbChhKSAmIDB4N2ZmZmZmZmZmZmZmZmZmZlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgKChpbnQ2NF90KXNpZ24gPDwgNjMpKTsKK30KKworI2RlZmluZSBmbG9hdDY0X3plcm8gbWFrZV9mbG9hdDY0KDApCisjZGVmaW5lIGZsb2F0NjRfb25lIG1ha2VfZmxvYXQ2NCgweDNmZjAwMDAwMDAwMDAwMDBMTCkKKyNkZWZpbmUgZmxvYXQ2NF9sbjIgbWFrZV9mbG9hdDY0KDB4M2ZlNjJlNDJmZWZhMzllZkxMKQorI2RlZmluZSBmbG9hdDY0X3BpIG1ha2VfZmxvYXQ2NCgweDQwMDkyMWZiNTQ0NDJkMThMTCkKKyNkZWZpbmUgZmxvYXQ2NF9oYWxmIG1ha2VfZmxvYXQ2NCgweDNmZTAwMDAwMDAwMDAwMDBMTCkKKyNkZWZpbmUgZmxvYXQ2NF9pbmZpbml0eSBtYWtlX2Zsb2F0NjQoMHg3ZmYwMDAwMDAwMDAwMDAwTEwpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUaGUgcGF0dGVybiBmb3IgYSBkZWZhdWx0IGdlbmVyYXRlZCBkb3VibGUtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBjb25zdCBmbG9hdDY0IGZsb2F0NjRfZGVmYXVsdF9uYW47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIGNvbnZlcnNpb24gcm91dGluZXMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQzMiBmbG9hdHg4MF90b19pbnQzMiggZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitpbnQzMiBmbG9hdHg4MF90b19pbnQzMl9yb3VuZF90b196ZXJvKCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2ludDY0IGZsb2F0eDgwX3RvX2ludDY0KCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2ludDY0IGZsb2F0eDgwX3RvX2ludDY0X3JvdW5kX3RvX3plcm8oIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworZmxvYXQzMiBmbG9hdHg4MF90b19mbG9hdDMyKCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0NjQgZmxvYXR4ODBfdG9fZmxvYXQ2NCggZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitmbG9hdDEyOCBmbG9hdHg4MF90b19mbG9hdDEyOCggZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBTb2Z0d2FyZSBJRUMvSUVFRSBleHRlbmRlZCBkb3VibGUtcHJlY2lzaW9uIG9wZXJhdGlvbnMuCisqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitmbG9hdHg4MCBmbG9hdHg4MF9yb3VuZF90b19pbnQoIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworZmxvYXR4ODAgZmxvYXR4ODBfYWRkKCBmbG9hdHg4MCwgZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitmbG9hdHg4MCBmbG9hdHg4MF9zdWIoIGZsb2F0eDgwLCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX211bCggZmxvYXR4ODAsIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworZmxvYXR4ODAgZmxvYXR4ODBfZGl2KCBmbG9hdHg4MCwgZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitmbG9hdHg4MCBmbG9hdHg4MF9yZW0oIGZsb2F0eDgwLCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3NxcnQoIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0eDgwX2VxKCBmbG9hdHg4MCwgZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXR4ODBfbGUoIGZsb2F0eDgwLCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdHg4MF9sdCggZmxvYXR4ODAsIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0eDgwX3Vub3JkZXJlZCggZmxvYXR4ODAsIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0eDgwX2VxX3F1aWV0KCBmbG9hdHg4MCwgZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXR4ODBfbGVfcXVpZXQoIGZsb2F0eDgwLCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdHg4MF9sdF9xdWlldCggZmxvYXR4ODAsIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0eDgwX3Vub3JkZXJlZF9xdWlldCggZmxvYXR4ODAsIGZsb2F0eDgwIFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0eDgwX2NvbXBhcmUoIGZsb2F0eDgwLCBmbG9hdHg4MCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdHg4MF9jb21wYXJlX3F1aWV0KCBmbG9hdHg4MCwgZmxvYXR4ODAgU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXR4ODBfaXNfcXVpZXRfbmFuKCBmbG9hdHg4MCApOworaW50IGZsb2F0eDgwX2lzX3NpZ25hbGluZ19uYW4oIGZsb2F0eDgwICk7CitmbG9hdHg4MCBmbG9hdHg4MF9tYXliZV9zaWxlbmNlX25hbiggZmxvYXR4ODAgKTsKK2Zsb2F0eDgwIGZsb2F0eDgwX3NjYWxibiggZmxvYXR4ODAsIGludCBTVEFUVVNfUEFSQU0gKTsKKworSU5MSU5FIGZsb2F0eDgwIGZsb2F0eDgwX2FicyhmbG9hdHg4MCBhKQoreworICAgIGEuaGlnaCAmPSAweDdmZmY7CisgICAgcmV0dXJuIGE7Cit9CisKK0lOTElORSBmbG9hdHg4MCBmbG9hdHg4MF9jaHMoZmxvYXR4ODAgYSkKK3sKKyAgICBhLmhpZ2ggXj0gMHg4MDAwOworICAgIHJldHVybiBhOworfQorCitJTkxJTkUgaW50IGZsb2F0eDgwX2lzX2luZmluaXR5KGZsb2F0eDgwIGEpCit7CisgICAgcmV0dXJuIChhLmhpZ2ggJiAweDdmZmYpID09IDB4N2ZmZiAmJiBhLmxvdyA9PSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKK30KKworSU5MSU5FIGludCBmbG9hdHg4MF9pc19uZWcoZmxvYXR4ODAgYSkKK3sKKyAgICByZXR1cm4gYS5oaWdoID4+IDE1OworfQorCitJTkxJTkUgaW50IGZsb2F0eDgwX2lzX3plcm8oZmxvYXR4ODAgYSkKK3sKKyAgICByZXR1cm4gKGEuaGlnaCAmIDB4N2ZmZikgPT0gMCAmJiBhLmxvdyA9PSAwOworfQorCitJTkxJTkUgaW50IGZsb2F0eDgwX2lzX3plcm9fb3JfZGVub3JtYWwoZmxvYXR4ODAgYSkKK3sKKyAgICByZXR1cm4gKGEuaGlnaCAmIDB4N2ZmZikgPT0gMDsKK30KKworSU5MSU5FIGludCBmbG9hdHg4MF9pc19hbnlfbmFuKGZsb2F0eDgwIGEpCit7CisgICAgcmV0dXJuICgoYS5oaWdoICYgMHg3ZmZmKSA9PSAweDdmZmYpICYmIChhLmxvdzw8MSk7Cit9CisKKyNkZWZpbmUgZmxvYXR4ODBfemVybyBtYWtlX2Zsb2F0eDgwKDB4MDAwMCwgMHgwMDAwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIGZsb2F0eDgwX29uZSBtYWtlX2Zsb2F0eDgwKDB4M2ZmZiwgMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIGZsb2F0eDgwX2xuMiBtYWtlX2Zsb2F0eDgwKDB4M2ZmZSwgMHhiMTcyMTdmN2QxY2Y3OWFjTEwpCisjZGVmaW5lIGZsb2F0eDgwX3BpIG1ha2VfZmxvYXR4ODAoMHg0MDAwLCAweGM5MGZkYWEyMjE2OGMyMzVMTCkKKyNkZWZpbmUgZmxvYXR4ODBfaGFsZiBtYWtlX2Zsb2F0eDgwKDB4M2ZmZSwgMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIGZsb2F0eDgwX2luZmluaXR5IG1ha2VfZmxvYXR4ODAoMHg3ZmZmLCAweDgwMDAwMDAwMDAwMDAwMDBMTCkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBwYXR0ZXJuIGZvciBhIGRlZmF1bHQgZ2VuZXJhdGVkIGV4dGVuZGVkIGRvdWJsZS1wcmVjaXNpb24gTmFOLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuIGNvbnN0IGZsb2F0eDgwIGZsb2F0eDgwX2RlZmF1bHRfbmFuOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU29mdHdhcmUgSUVDL0lFRUUgcXVhZHJ1cGxlLXByZWNpc2lvbiBjb252ZXJzaW9uIHJvdXRpbmVzLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50MzIgZmxvYXQxMjhfdG9faW50MzIoIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworaW50MzIgZmxvYXQxMjhfdG9faW50MzJfcm91bmRfdG9femVybyggZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitpbnQ2NCBmbG9hdDEyOF90b19pbnQ2NCggZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitpbnQ2NCBmbG9hdDEyOF90b19pbnQ2NF9yb3VuZF90b196ZXJvKCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MzIgZmxvYXQxMjhfdG9fZmxvYXQzMiggZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitmbG9hdDY0IGZsb2F0MTI4X3RvX2Zsb2F0NjQoIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworZmxvYXR4ODAgZmxvYXQxMjhfdG9fZmxvYXR4ODAoIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3wgU29mdHdhcmUgSUVDL0lFRUUgcXVhZHJ1cGxlLXByZWNpc2lvbiBvcGVyYXRpb25zLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZmxvYXQxMjggZmxvYXQxMjhfcm91bmRfdG9faW50KCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MTI4IGZsb2F0MTI4X2FkZCggZmxvYXQxMjgsIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworZmxvYXQxMjggZmxvYXQxMjhfc3ViKCBmbG9hdDEyOCwgZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitmbG9hdDEyOCBmbG9hdDEyOF9tdWwoIGZsb2F0MTI4LCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2Zsb2F0MTI4IGZsb2F0MTI4X2RpdiggZmxvYXQxMjgsIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworZmxvYXQxMjggZmxvYXQxMjhfcmVtKCBmbG9hdDEyOCwgZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitmbG9hdDEyOCBmbG9hdDEyOF9zcXJ0KCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDEyOF9lcSggZmxvYXQxMjgsIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MTI4X2xlKCBmbG9hdDEyOCwgZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQxMjhfbHQoIGZsb2F0MTI4LCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDEyOF91bm9yZGVyZWQoIGZsb2F0MTI4LCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDEyOF9lcV9xdWlldCggZmxvYXQxMjgsIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MTI4X2xlX3F1aWV0KCBmbG9hdDEyOCwgZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQxMjhfbHRfcXVpZXQoIGZsb2F0MTI4LCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDEyOF91bm9yZGVyZWRfcXVpZXQoIGZsb2F0MTI4LCBmbG9hdDEyOCBTVEFUVVNfUEFSQU0gKTsKK2ludCBmbG9hdDEyOF9jb21wYXJlKCBmbG9hdDEyOCwgZmxvYXQxMjggU1RBVFVTX1BBUkFNICk7CitpbnQgZmxvYXQxMjhfY29tcGFyZV9xdWlldCggZmxvYXQxMjgsIGZsb2F0MTI4IFNUQVRVU19QQVJBTSApOworaW50IGZsb2F0MTI4X2lzX3F1aWV0X25hbiggZmxvYXQxMjggKTsKK2ludCBmbG9hdDEyOF9pc19zaWduYWxpbmdfbmFuKCBmbG9hdDEyOCApOworZmxvYXQxMjggZmxvYXQxMjhfbWF5YmVfc2lsZW5jZV9uYW4oIGZsb2F0MTI4ICk7CitmbG9hdDEyOCBmbG9hdDEyOF9zY2FsYm4oIGZsb2F0MTI4LCBpbnQgU1RBVFVTX1BBUkFNICk7CisKK0lOTElORSBmbG9hdDEyOCBmbG9hdDEyOF9hYnMoZmxvYXQxMjggYSkKK3sKKyAgICBhLmhpZ2ggJj0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgcmV0dXJuIGE7Cit9CisKK0lOTElORSBmbG9hdDEyOCBmbG9hdDEyOF9jaHMoZmxvYXQxMjggYSkKK3sKKyAgICBhLmhpZ2ggXj0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7CisgICAgcmV0dXJuIGE7Cit9CisKK0lOTElORSBpbnQgZmxvYXQxMjhfaXNfaW5maW5pdHkoZmxvYXQxMjggYSkKK3sKKyAgICByZXR1cm4gKGEuaGlnaCAmIDB4N2ZmZmZmZmZmZmZmZmZmZkxMKSA9PSAweDdmZmYwMDAwMDAwMDAwMDBMTCAmJiBhLmxvdyA9PSAwOworfQorCitJTkxJTkUgaW50IGZsb2F0MTI4X2lzX25lZyhmbG9hdDEyOCBhKQoreworICAgIHJldHVybiBhLmhpZ2ggPj4gNjM7Cit9CisKK0lOTElORSBpbnQgZmxvYXQxMjhfaXNfemVybyhmbG9hdDEyOCBhKQoreworICAgIHJldHVybiAoYS5oaWdoICYgMHg3ZmZmZmZmZmZmZmZmZmZmTEwpID09IDAgJiYgYS5sb3cgPT0gMDsKK30KKworSU5MSU5FIGludCBmbG9hdDEyOF9pc196ZXJvX29yX2Rlbm9ybWFsKGZsb2F0MTI4IGEpCit7CisgICAgcmV0dXJuIChhLmhpZ2ggJiAweDdmZmYwMDAwMDAwMDAwMDBMTCkgPT0gMDsKK30KKworSU5MSU5FIGludCBmbG9hdDEyOF9pc19hbnlfbmFuKGZsb2F0MTI4IGEpCit7CisgICAgcmV0dXJuICgoYS5oaWdoID4+IDQ4KSAmIDB4N2ZmZikgPT0gMHg3ZmZmICYmCisgICAgICAgICgoYS5sb3cgIT0gMCkgfHwgKChhLmhpZ2ggJiAweGZmZmZmZmZmZmZmZkxMKSAhPSAwKSk7Cit9CisKKyNkZWZpbmUgZmxvYXQxMjhfemVybyBtYWtlX2Zsb2F0MTI4KDAsIDApCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfCBUaGUgcGF0dGVybiBmb3IgYSBkZWZhdWx0IGdlbmVyYXRlZCBxdWFkcnVwbGUtcHJlY2lzaW9uIE5hTi4KKyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2V4dGVybiBjb25zdCBmbG9hdDEyOCBmbG9hdDEyOF9kZWZhdWx0X25hbjsKKworI2VuZGlmIC8qICFTT0ZURkxPQVRfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9kZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY1N2EwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvZGV2aWNlLmgKQEAgLTAsMCArMSw5NSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2lmbmRlZiBHT0xERklTSF9ERVZJQ0VfSAorI2RlZmluZSBHT0xERklTSF9ERVZJQ0VfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiZXhlYy9jcHUtY29tbW9uLmgiCisKK3N0cnVjdCBnb2xkZmlzaF9kZXZpY2UgeworICAgIHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKm5leHQ7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSAqcHJldjsKKyAgICB1aW50MzJfdCByZXBvcnRlZF9zdGF0ZTsKKyAgICB2b2lkICpjb29raWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1aW50MzJfdCBpZDsKKyAgICB1aW50MzJfdCBiYXNlOyAvLyBmaWxsZWQgaW4gYnkgZ29sZGZpc2hfZGV2aWNlX2FkZCBpZiAwCisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBpcnE7IC8vIGZpbGxlZCBpbiBieSBnb2xkZmlzaF9kZXZpY2VfYWRkIGlmIDAKKyAgICB1aW50MzJfdCBpcnFfY291bnQ7Cit9OworCisKK3ZvaWQgZ29sZGZpc2hfZGV2aWNlX3NldF9pcnEoc3RydWN0IGdvbGRmaXNoX2RldmljZSAqZGV2LCBpbnQgaXJxLCBpbnQgbGV2ZWwpOworaW50IGdvbGRmaXNoX2RldmljZV9hZGQoc3RydWN0IGdvbGRmaXNoX2RldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICBDUFVSZWFkTWVtb3J5RnVuYyAqKm1lbV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICBDUFVXcml0ZU1lbW9yeUZ1bmMgKiptZW1fd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisKK2ludCBnb2xkZmlzaF9hZGRfZGV2aWNlX25vX2lvKHN0cnVjdCBnb2xkZmlzaF9kZXZpY2UgKmRldik7CisKK3ZvaWQgZ29sZGZpc2hfZGV2aWNlX2luaXQocWVtdV9pcnEgKnBpYywgdWludDMyX3QgYmFzZSwgdWludDMyX3Qgc2l6ZSwgdWludDMyX3QgaXJxLCB1aW50MzJfdCBpcnFfY291bnQpOworaW50IGdvbGRmaXNoX2RldmljZV9idXNfaW5pdCh1aW50MzJfdCBiYXNlLCB1aW50MzJfdCBpcnEpOworCisvLyBkZXZpY2UgaW5pdCBmdW5jdGlvbnM6CitxZW11X2lycSAqZ29sZGZpc2hfaW50ZXJydXB0X2luaXQodWludDMyX3QgYmFzZSwgcWVtdV9pcnEgcGFyZW50X2lycSwgcWVtdV9pcnEgcGFyZW50X2ZpcSk7Cit2b2lkIGdvbGRmaXNoX3RpbWVyX2FuZF9ydGNfaW5pdCh1aW50MzJfdCB0aW1lcmJhc2UsIGludCB0aW1lcmlycSk7CitpbnQgZ29sZGZpc2hfdHR5X2FkZChDaGFyRHJpdmVyU3RhdGUgKmNzLCBpbnQgaWQsIHVpbnQzMl90IGJhc2UsIGludCBpcnEpOwordm9pZCBnb2xkZmlzaF9mYl9pbml0KGludCBpZCk7Cit2b2lkIGdvbGRmaXNoX2F1ZGlvX2luaXQodWludDMyX3QgYmFzZSwgaW50IGlkLCBjb25zdCBjaGFyKiBpbnB1dF9zb3VyY2UpOwordm9pZCBnb2xkZmlzaF9iYXR0ZXJ5X2luaXQoaW50IGhhc19iYXR0ZXJ5KTsKK3ZvaWQgZ29sZGZpc2hfYmF0dGVyeV9zZXRfcHJvcChpbnQgYWMsIGludCBwcm9wZXJ0eSwgaW50IHZhbHVlKTsKK2ludCAgZ29sZGZpc2hfYmF0dGVyeV9yZWFkX3Byb3AoaW50IHByb3BlcnR5KTsKK3ZvaWQgZ29sZGZpc2hfbW1jX2luaXQodWludDMyX3QgYmFzZSwgaW50IGlkLCBCbG9ja0RyaXZlclN0YXRlKiBicyk7CisKKy8vIFF1ZXJ5IGZ1bmN0aW9uczoKK2ludCBnb2xkZmlzaF9ndWVzdF9pc182NGJpdCgpOwordm9pZCBnb2xkZmlzaF9iYXR0ZXJ5X2Rpc3BsYXkodm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKSh2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikpOworCisvLyB0aGVzZSBkbyBub3QgYWRkIGEgZGV2aWNlCit2b2lkIHRyYWNlX2Rldl9pbml0KCk7Cit2b2lkIGV2ZW50c19kZXZfaW5pdCh1aW50MzJfdCBiYXNlLCBxZW11X2lycSBpcnEpOwordm9pZCBuYW5kX2Rldl9pbml0KHVpbnQzMl90IGJhc2UpOworCisjaWZkZWYgVEFSR0VUX0kzODYKKy8qIE1heGltdW0gSVJRIG51bWJlciBhdmFpbGFibGUgZm9yIGEgZGV2aWNlIG9uIHg4Ni4gKi8KKyNkZWZpbmUgR0ZEX01BWF9JUlEgICAgICAxNgorLyogSVJRIHJlc2VydmVkIGZvciBrZXlib2FyZC4gKi8KKyNkZWZpbmUgR0ZEX0tCRF9JUlEgICAgICAxCisvKiBJUlEgcmVzZXJ2ZWQgZm9yIFJUQy4gKi8KKyNkZWZpbmUgR0ZEX1JUQ19JUlEgICAgICA4CisvKiBJUlEgcmVzZXJ2ZWQgZm9yIG1vdXNlLiAqLworI2RlZmluZSBHRkRfTU9VU0VfSVJRICAgIDEyCisvKiBJUlEgcmVzZXJ2ZWQgZm9yIGVycm9yIChyYWlzaW5nIGFuIGV4Y2VwdGlvbiBpbiBUQiBjb2RlKS4gKi8KKyNkZWZpbmUgR0ZEX0VSUl9JUlEgICAgICAxMworI2Vsc2UKKy8qIE1heGltdW0gSVJRIG51bWJlciBhdmFpbGFibGUgZm9yIGEgZGV2aWNlIG9uIEFSTS4gKi8KKyNkZWZpbmUgR0ZEX01BWF9JUlEgICAgIDMyCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHVpbnQ2NF9zZXRfbG93KHVpbnQ2NF90ICphZGRyLCB1aW50MzIgdmFsdWUpCit7CisgICAgKmFkZHIgPSAoKmFkZHIgJiB+KDB4RkZGRkZGRkZVTEwpKSB8IHZhbHVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWludDY0X3NldF9oaWdoKHVpbnQ2NF90ICphZGRyLCB1aW50MzIgdmFsdWUpCit7CisgICAgKmFkZHIgPSAoKmFkZHIgJiAweEZGRkZGRkZGVUxMKSB8ICgodWludDY0X3QpdmFsdWUgPDwgMzIpOworfQorCisvLyBBbGxvd3MgYW5kcm9pZCBnbHVlIGNvZGUgdG8gZm9yd2FyZCBnZW5lcmljIGV2ZW50cyBkaXJlY3RseSB0byB0aGUgZXZlbnRzCisvLyBkZXZpY2UuIHxvcGFxdWV8IGlzIGEgaGFuZGxlIHRoZSBkZXZpY2UuCit2b2lkIGV2ZW50c19wdXRfZ2VuZXJpYyh2b2lkKiBvcGFxdWUsIGludCB0eXBlLCBpbnQgY29kZSwgaW50IHZhbHVlKTsKKworI2VuZGlmICAvKiBHT0xERklTSF9ERVZJQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvbmFuZC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvbmFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmVmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9uYW5kLmgKQEAgLTAsMCArMSwxOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2lmbmRlZiBOQU5EX0RFVklDRV9ICisjZGVmaW5lIE5BTkRfREVWSUNFX0gKKwordm9pZCBuYW5kX2Rldl9pbml0KHVpbnQzMl90IGJhc2UpOwordm9pZCBuYW5kX2FkZF9kZXYoY29uc3QgY2hhciAqYXJnKTsKK3ZvaWQgbmFuZF9wYXJzZV9saW1pdHMoY29uc3QgY2hhciogbGltaXRzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9waXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0ZDNjNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hbmRyb2lkL2dvbGRmaXNoL3BpcGUuaApAQCAtMCwwICsxLDgyIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2lmbmRlZiBfSFdfR09MREZJU0hfUElQRV9ICisjZGVmaW5lIF9IV19HT0xERklTSF9QSVBFX0gKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2FuZHJvaWRfcGlwZV9kZXZpY2UuaCIKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBtdXN0IG1hdGNoIHRob3NlIGZvdW5kIGF0CisgKiBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlL2tlcm5lbC9nb2xkZmlzaC5naXQKKyAqCisgKiBGb3IgYnJhbmNoIGFuZHJvaWQtZ29sZGZpc2gtMi42Lnh4OgorICogICAgJEtFUk5FTC9kcml2ZXJzL21pc2MvcWVtdXBpcGUvcWVtdV9waXBlLmMKKyAqCisgKiBGb3IgYnJhbmNoIGFuZHJvaWQtZ29sZGZpc2gtMy40IGFuZCBoaWdoZXI6CisgKiAgICAkS0VSTkVML2RyaXZlcnMvcGxhdGZvcm0vZ29sZGZpc2gvZ29sZGZpc2hfcGlwZS5jCisgKi8KKworLyogcGlwZSBkZXZpY2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBJUEVfUkVHX0NPTU1BTkQgICAgICAgICAgICAweDAwICAvKiB3cml0ZTogdmFsdWUgPSBjb21tYW5kICovCisjZGVmaW5lIFBJUEVfUkVHX1NUQVRVUyAgICAgICAgICAgICAweDA0ICAvKiByZWFkICovCisjZGVmaW5lIFBJUEVfUkVHX0NIQU5ORUwgICAgICAgICAgICAweDA4ICAvKiByZWFkL3dyaXRlOiBjaGFubmVsIGlkICovCisjZGVmaW5lIFBJUEVfUkVHX1NJWkUgICAgICAgICAgICAgICAweDBjICAvKiByZWFkL3dyaXRlOiBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBQSVBFX1JFR19BRERSRVNTICAgICAgICAgICAgMHgxMCAgLyogd3JpdGU6IHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgUElQRV9SRUdfV0FLRVMgICAgICAgICAgICAgIDB4MTQgIC8qIHJlYWQ6IHdha2UgZmxhZ3MgKi8KKy8qIHJlYWQvd3JpdGU6IHBhcmFtZXRlciBidWZmZXIgYWRkcmVzcyAqLworI2RlZmluZSBQSVBFX1JFR19QQVJBTVNfQUREUl9MT1cgICAgIDB4MTgKKyNkZWZpbmUgUElQRV9SRUdfUEFSQU1TX0FERFJfSElHSCAgICAweDFjCisvKiB3cml0ZTogYWNjZXNzIHdpdGggcGFyZW1ldGVyIGJ1ZmZlciAqLworI2RlZmluZSBQSVBFX1JFR19BQ0NFU1NfUEFSQU1TICAgICAgIDB4MjAKKyNkZWZpbmUgUElQRV9SRUdfVkVSU0lPTiAgICAgICAgICAgICAweDI0IC8qIHJlYWQ6IGRldmljZSB2ZXJzaW9uICovCisjZGVmaW5lIFBJUEVfUkVHX0NIQU5ORUxfSElHSCAgICAgICAgMHgzMCAvKiByZWFkL3dyaXRlOiBoaWdoIDMyIGJpdCBjaGFubmVsIGlkICovCisjZGVmaW5lIFBJUEVfUkVHX0FERFJFU1NfSElHSCAgICAgICAgMHgzNCAvKiB3cml0ZTogaGlnaCAzMiBiaXQgcGh5c2ljYWwgYWRkcmVzcyAqLworCisvKiBsaXN0IG9mIGNvbW1hbmRzIGZvciBQSVBFX1JFR19DT01NQU5EICovCisjZGVmaW5lIFBJUEVfQ01EX09QRU4gICAgICAgICAgICAgICAxICAvKiBvcGVuIG5ldyBjaGFubmVsICovCisjZGVmaW5lIFBJUEVfQ01EX0NMT1NFICAgICAgICAgICAgICAyICAvKiBjbG9zZSBjaGFubmVsIChmcm9tIGd1ZXN0KSAqLworI2RlZmluZSBQSVBFX0NNRF9QT0xMICAgICAgICAgICAgICAgMyAgLyogcG9sbCByZWFkL3dyaXRlIHN0YXR1cyAqLworCisvKiBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSByZWxhdGVkIHRvIHdyaXRlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgUElQRV9DTURfV1JJVEVfQlVGRkVSICAgICAgIDQgIC8qIHNlbmQgYSB1c2VyIGJ1ZmZlciB0byB0aGUgZW11bGF0b3IgKi8KKyNkZWZpbmUgUElQRV9DTURfV0FLRV9PTl9XUklURSAgICAgIDUgIC8qIHRlbGwgdGhlIGVtdWxhdG9yIHRvIHdha2UgdXMgd2hlbiB3cml0aW5nIGlzIHBvc3NpYmxlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHJlbGF0ZWQgdG8gcmVhZCBvcGVyYXRpb25zLCB0aGV5IG11c3QgYmUKKyAqIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHdyaXRlIG9uZXMsIHNpbmNlIHdlCisgKiB3aWxsIHVzZSAoQ01EX1JFQURfQlVGRkVSIC0gQ01EX1dSSVRFX0JVRkZFUikgYXMgYSBzcGVjaWFsIG9mZnNldAorICogaW4gcWVtdV9waXBlX3JlYWRfd3JpdGUoKSBiZWxvdy4KKyAqLworI2RlZmluZSBQSVBFX0NNRF9SRUFEX0JVRkZFUiAgICAgICAgNiAgLyogcmVjZWl2ZSBhIHBhZ2UtY29udGFpbmVkIGJ1ZmZlciBmcm9tIHRoZSBlbXVsYXRvciAqLworI2RlZmluZSBQSVBFX0NNRF9XQUtFX09OX1JFQUQgICAgICAgNyAgLyogdGVsbCB0aGUgZW11bGF0b3IgdG8gd2FrZSB1cyB3aGVuIHJlYWRpbmcgaXMgcG9zc2libGUgKi8KKwordm9pZCBwaXBlX2Rldl9pbml0KGJvb2wgbmV3RGV2aWNlTmFtaW5nKTsKKworc3RydWN0IGFjY2Vzc19wYXJhbXN7CisgICAgdWludDMyX3QgY2hhbm5lbDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IGFkZHJlc3M7CisgICAgdWludDMyX3QgY21kOworICAgIHVpbnQzMl90IHJlc3VsdDsKKyAgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbiAqLworICAgIHVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IGFjY2Vzc19wYXJhbXNfNjQgeworICAgIHVpbnQ2NF90IGNoYW5uZWw7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50NjRfdCBhZGRyZXNzOworICAgIHVpbnQzMl90IGNtZDsKKyAgICB1aW50MzJfdCByZXN1bHQ7CisgICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24gKi8KKyAgICB1aW50MzJfdCBmbGFnczsKK307CisKKyNlbmRpZiAvKiBfSFdfR09MREZJU0hfUElQRV9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9wcm9maWxlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC9wcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYjEzYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hbmRyb2lkL2dvbGRmaXNoL3Byb2ZpbGUuaApAQCAtMCwwICsxLDI5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaWZuZGVmIF9QUk9GSUxFX0RFVl9IXworI2RlZmluZSBfUFJPRklMRV9ERVZfSF8KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImV4ZWMvY3B1LWRlZnMuaCIKKworLy8gUmVjb3JkIHRoZSBtbWFwIGluZm9tYXRpb24gZm9yIHByb2ZpbGUuYyB0byBtYXAgKHBpZCwgYWRkcmVzcykgcGFpcgorLy8gYmFjayB0byBpdHMgY29ycmVzcG9uZGluZyBiaW5hcnkuCisvLyBDYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiBndWVzdCBPUyBtbWFwcyBhIGJpbmFyeS4KK3ZvaWQgcmVjb3JkX21tYXAodGFyZ2V0X3Vsb25nIHZzdGFydCwgdGFyZ2V0X3Vsb25nIHZlbmQsCisgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBvZmZzZXQsIGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIHBpZCk7CisKKy8vIFJlbGVhc2UgYWxsIG1tYXAgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gcHJvZmlsZS5jLgorLy8gQ2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHByb2Nlc3MocGlkKSBleGl0cy4KK3ZvaWQgcmVsZWFzZV9tbWFwKHVuc2lnbmVkIHBpZCk7CisKK3ZvaWQgcHJvZmlsZV9iYl9oZWxwZXIodGFyZ2V0X3Vsb25nIHBjLCB1aW50MzJfdCBzaXplKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvdHJhY2UuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hbmRyb2lkL2dvbGRmaXNoL3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYTI4NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hbmRyb2lkL2dvbGRmaXNoL3RyYWNlLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKyNpZm5kZWYgX1RSQUNFX0RFVl9IXworI2RlZmluZSBfVFJBQ0VfREVWX0hfCisKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL2RldmljZS5oIgorI2luY2x1ZGUgImNwdS5oIgorCisjZGVmaW5lIENMSUVOVF9QQUdFX1NJWkUgICAgICAgIDQwOTYKKworLyogdHJhY2UgZGV2aWNlIHJlZ2lzdGVycyAqLworCisvKiBUaGUgaW5kaWNlcyBiZWxvdyBhbGwgY29ycmVzcG9uZHMgdG8gc2xvdHMgdGhhdCBjYW4gb25seSBiZSBhY2Nlc3NlZAorICogYnkgdGhlIGd1ZXN0IGtlcm5lbC4gU2VlIGJlbG93IGZvciBpbmRpY2VzIHJlYWNoYWJsZSBmcm9tIHRoZSBndWVzdAorICogdXNlci1sYW5kLgorICovCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfU1dJVENIICAgICAgICAgICAgMAorI2RlZmluZSBUUkFDRV9ERVZfUkVHX0ZPUksgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19FWEVDVkVfUElEICAgICAgICAyCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX1ZNU1RBUlQgICAgMworI2RlZmluZSBUUkFDRV9ERVZfUkVHX0VYRUNWRV9WTUVORCAgICAgIDQKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19FWEVDVkVfT0ZGU0VUICAgICA1CisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfRVhFQ1ZFX0VYRVBBVEggICAgNgorI2RlZmluZSBUUkFDRV9ERVZfUkVHX0VYSVQgICAgICAgICAgICAgIDcKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19DTURMSU5FICAgICAgICAgICA4CisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfQ01ETElORV9MRU4gICAgICAgOQorI2RlZmluZSBUUkFDRV9ERVZfUkVHX01NQVBfRVhFUEFUSCAgICAgIDEwCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfSU5JVF9QSUQgICAgICAgICAgMTEKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19JTklUX05BTUUgICAgICAgICAxMgorI2RlZmluZSBUUkFDRV9ERVZfUkVHX0NMT05FICAgICAgICAgICAgIDEzCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfVU5NQVBfU1RBUlQgICAgICAgMTQKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19VTk1BUF9FTkQgICAgICAgICAxNQorI2RlZmluZSBUUkFDRV9ERVZfUkVHX05BTUUgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfVEdJRCAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19EWU5fU1lNICAgICAgICAgICA1MAorI2RlZmluZSBUUkFDRV9ERVZfUkVHX0RZTl9TWU1fQUREUiAgICAgIDUxCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfUkVNT1ZFX0FERFIgICAgICAgNTIKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19QUklOVF9TVFIgICAgICAgICA2MAorI2RlZmluZSBUUkFDRV9ERVZfUkVHX1BSSU5UX05VTV9ERUMgICAgIDYxCisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfUFJJTlRfTlVNX0hFWCAgICAgNjIKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19TVE9QX0VNVSAgICAgICAgICA5MAorI2RlZmluZSBUUkFDRV9ERVZfUkVHX0VOQUJMRSAgICAgICAgICAgIDEwMAorCisvKiBOT1RFOiBUaGUgZGV2aWNlJ3Mgc2Vjb25kIHBoeXNpY2FsIHBhZ2UgaXMgbWFwcGVkIHRvIC9kZXYvcWVtdV90cmFjZQorICogICAgICAgIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgZG8gdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgICAgICAgICAgbWFnaWNQYWdlID0gbXlfbW1hcCgiL2Rldi9xZW11X3RyYWNlIiwgLi4uKTsKKyAqICAgICAgICAgICAqKHVpbnQzMl90KiltYWdpY1BhZ2VbaW5kZXhdID0gdmFsdWU7CisgKgorICogICAgICAgIFRoZSB3cml0ZSBhdCBhZGRyZXNzIG1hZ2ljUGFnZStpbmRleCo0IGhlcmUgd2lsbCBiZSBzZWVuCisgKiAgICAgICAgYnkgdGhlIGRldmljZSBhcyBhIHdyaXRlIHRvIHRoZSBpL28gb2Zmc2V0IDQwOTYgKyBpbmRleCo0LAorICogICAgICAgIGkuZS4gKDEwMjQgKyBpbmRleCkqNC4KKyAqCisgKiAgICAgICAgQXMgYSBjb25zZXF1ZW5jZSwgYW55IGluZGV4IGRlZmluZWQgYmVsb3cgY29ycmVzcG9uZHMgdG8KKyAqICAgICAgICBsb2NhdGlvbiAoaW5kZXgtMTAyNCkqNCBpbiB0aGUgbW1hcHBlZCBwYWdlIGluIHRoZSBndWVzdC4KKyAqLworCisvKiBUaGUgZmlyc3QgNjQgZW50cmllcyBhcmUgcmVzZXJ2ZWQgZm9yIFZNIGluc3RydW1lbnRhdGlvbiAqLworI2RlZmluZSBUUkFDRV9ERVZfUkVHX01FVEhPRF9FTlRSWSAgICAgIDEwMjQKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19NRVRIT0RfRVhJVCAgICAgICAxMDI1CisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfTUVUSE9EX0VYQ0VQVElPTiAgMTAyNgorI2RlZmluZSBUUkFDRV9ERVZfUkVHX05BVElWRV9FTlRSWSAgICAgIDEwMjgKKyNkZWZpbmUgVFJBQ0VfREVWX1JFR19OQVRJVkVfRVhJVCAgICAgICAxMDI5CisjZGVmaW5lIFRSQUNFX0RFVl9SRUdfTkFUSVZFX0VYQ0VQVElPTiAgMTAzMAorCisvKiBOZXh0LCBRRU1VRCBmYXN0IHBpcGVzICovCisjZGVmaW5lIFRSQUNFX0RFVl9QSVBFX0JBU0UgICAgICAgICAgICAgMTI4MCAgICAvKiAxMDI0ICsgKDY0KjQpICovCisjZGVmaW5lIFRSQUNFX0RFVl9QSVBFX0NPTU1BTkQgICAgICAgICAgKFRSQUNFX0RFVl9QSVBFX0JBU0UgKyAwKQorI2RlZmluZSBUUkFDRV9ERVZfUElQRV9TVEFUVVMgICAgICAgICAgIChUUkFDRV9ERVZfUElQRV9CQVNFICsgMCkKKyNkZWZpbmUgVFJBQ0VfREVWX1BJUEVfQUREUkVTUyAgICAgICAgICAoVFJBQ0VfREVWX1BJUEVfQkFTRSArIDEpCisjZGVmaW5lIFRSQUNFX0RFVl9QSVBFX1NJWkUgICAgICAgICAgICAgKFRSQUNFX0RFVl9QSVBFX0JBU0UgKyAyKQorI2RlZmluZSBUUkFDRV9ERVZfUElQRV9DSEFOTkVMICAgICAgICAgIChUUkFDRV9ERVZfUElQRV9CQVNFICsgMykKKworLyogdGhlIHZpcnR1YWwgdHJhY2UgZGV2aWNlIHN0YXRlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IGdvbGRmaXNoX2RldmljZSBkZXY7Cit9IHRyYWNlX2Rldl9zdGF0ZTsKKworLyoKKyAqIGludGVyZmFjZXMgZm9yIGNvcHkgZnJvbSB2aXJ0dWFsIHNwYWNlCisgKiBmcm9tIHRhcmdldC1hcm0vb3BfaGVscGVyLmMKKyAqLworZXh0ZXJuIHZvaWQgdnN0cmNweSh0YXJnZXRfdWxvbmcgcHRyLCBjaGFyICpidWYsIGludCBtYXgpOworCisvKgorICogaW50ZXJmYWNlcyB0byB0cmFjZSBtb2R1bGUgdG8gc2lnbmFsIGtlcm5lbCBldmVudHMKKyAqLworZXh0ZXJuIHZvaWQgdHJhY2Vfc3dpdGNoKGludCBwaWQpOworZXh0ZXJuIHZvaWQgdHJhY2VfZm9yayhpbnQgdGdpZCwgaW50IHBpZCk7CitleHRlcm4gdm9pZCB0cmFjZV9jbG9uZShpbnQgdGdpZCwgaW50IHBpZCk7CitleHRlcm4gdm9pZCB0cmFjZV9leGVjdmUoY29uc3QgY2hhciAqYXJnLCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIHRyYWNlX2V4aXQoaW50IGV4aXRjb2RlKTsKK2V4dGVybiB2b2lkIHRyYWNlX21tYXAodW5zaWduZWQgbG9uZyB2c3RhcnQsIHVuc2lnbmVkIGxvbmcgdmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGNvbnN0IGNoYXIgKnBhdGgpOworZXh0ZXJuIHZvaWQgdHJhY2VfbXVubWFwKHVuc2lnbmVkIGxvbmcgdnN0YXJ0LCB1bnNpZ25lZCBsb25nIHZlbmQpOworZXh0ZXJuIHZvaWQgdHJhY2VfZHluYW1pY19zeW1ib2xfYWRkKHVuc2lnbmVkIGxvbmcgdmFkZHIsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgdHJhY2VfZHluYW1pY19zeW1ib2xfcmVtb3ZlKHVuc2lnbmVkIGxvbmcgdmFkZHIpOworZXh0ZXJuIHZvaWQgdHJhY2VfaW5pdF9uYW1lKGludCB0Z2lkLCBpbnQgcGlkLCBjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHRyYWNlX2luaXRfZXhlYyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgY29uc3QgY2hhciAqZXhlKTsKK2V4dGVybiB2b2lkIHN0YXJ0X3RyYWNpbmcodm9pZCk7CitleHRlcm4gdm9pZCBzdG9wX3RyYWNpbmcodm9pZCk7CitleHRlcm4gdm9pZCB0cmFjZV9leGNlcHRpb24odWludDMyIHRhcmdldF9wYyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FuZHJvaWQvZ29sZGZpc2gvdm1lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWQxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYW5kcm9pZC9nb2xkZmlzaC92bWVtLmgKQEAgLTAsMCArMSwyNyBAQAorLyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworI2lmbmRlZiBHT0xERklTSF9WTUVNX0gKKyNkZWZpbmUgR09MREZJU0hfVk1FTV9ICisKKyNpbmNsdWRlICJjcHUuaCIKKworLy8gQ2FsbCB0aGVzZSBmdW5jdGlvbnMgaW5zdGVhZCBvZiBjcHVfbWVtb3J5X3J3X2RlYnVnIGFuZAorLy8gY3B1X2dldF9waHlzX3BhZ2VfZGVidWcgdG8gZW5zdXJlIHZpcnR1YWwgYWRkcmVzcyB0cmFuc2xhdGlvbiBhbHdheXMgd29ya3MKKy8vIHByb3Blcmx5LCBhbmQgZWZmaWNlbnRseSwgdW5kZXIgS1ZNLgorCitpbnQgc2FmZV9tZW1vcnlfcndfZGVidWcoQ1BVU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgaXNfd3JpdGUpOworCitod2FkZHIgc2FmZV9nZXRfcGh5c19wYWdlX2RlYnVnKENQVVN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKTsKKworCisjZW5kaWYgIC8qIEdPTERGSVNIX1ZNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2FybS9hcm0uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hcm0vYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ODMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hcm0vYXJtLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIE1pc2MgQVJNIGRlY2xhcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIExHUEwuCisgKgorICovCisKKyNpZm5kZWYgQVJNX01JU0NfSAorI2RlZmluZSBBUk1fTUlTQ19IIDEKKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImh3L2xvYWRlci5oIgorCisvKiBUaGUgQ1BVIGlzIGFsc28gbW9kZWxlZCBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4gICovCisjZGVmaW5lIEFSTV9QSUNfQ1BVX0lSUSAwCisjZGVmaW5lIEFSTV9QSUNfQ1BVX0ZJUSAxCitxZW11X2lycSAqYXJtX3BpY19pbml0X2NwdShDUFVPbGRTdGF0ZSAqZW52KTsKKworLyogYXJtdjdtLmMgKi8KK3FlbXVfaXJxICphcm12N21faW5pdChpbnQgZmxhc2hfc2l6ZSwgaW50IHNyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXJuZWxfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCk7CisKKy8qIGFybV9ib290LmMgKi8KK3N0cnVjdCBhcm1fYm9vdF9pbmZvIHsKKyAgICBpbnQgcmFtX3NpemU7CisgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lOworICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9jbWRsaW5lOworICAgIGNvbnN0IGNoYXIgKmluaXRyZF9maWxlbmFtZTsKKyAgICBod2FkZHIgbG9hZGVyX3N0YXJ0OworICAgIGh3YWRkciBzbXBfbG9hZGVyX3N0YXJ0OworICAgIGh3YWRkciBzbXBfcHJpdl9iYXNlOworICAgIGludCBuYl9jcHVzOworICAgIGludCBib2FyZF9pZDsKKyAgICBpbnQgKCphdGFnX2JvYXJkKShjb25zdCBzdHJ1Y3QgYXJtX2Jvb3RfaW5mbyAqaW5mbywgdm9pZCAqcCk7CisgICAgLyogVXNlZCBpbnRlcm5hbGx5IGJ5IGFybV9ib290LmMgKi8KKyAgICBpbnQgaXNfbGludXg7CisgICAgaHdhZGRyIGluaXRyZF9zaXplOworICAgIGh3YWRkciBlbnRyeTsKK307Cit2b2lkIGFybV9sb2FkX2tlcm5lbChDUFVBUk1TdGF0ZSAqZW52LCBzdHJ1Y3QgYXJtX2Jvb3RfaW5mbyAqaW5mbyk7CisKKy8qIE11bHRpcGxpY2F0aW9uIGZhY3RvciB0byBjb252ZXJ0IGZyb20gc3lzdGVtIGNsb2NrIHRpY2tzIHRvIHFlbXUgdGltZXIKKyAgIHRpY2tzLiAgKi8KK2V4dGVybiBpbnQgc3lzdGVtX2Nsb2NrX3NjYWxlOworCisjZW5kaWYgLyogIUFSTV9NSVNDX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hcm0vcGljLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYXJtL3BpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2FlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYXJtL3BpYy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBHZW5lcmljIEFSTSBQcm9ncmFtbWFibGUgSW50ZXJydXB0IENvbnRyb2xsZXIgc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQ29kZVNvdXJjZXJ5LgorICogV3JpdHRlbiBieSBQYXVsIEJyb29rCisgKgorICogVGhpcyBjb2RlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBMR1BMLgorICoKKyAqIEFybSBoYXJkd2FyZSB1c2VzIGEgd2lkZSB2YXJpZXR5IG9mIGludGVycnVwdCBoYW5kbGluZyBoYXJkd2FyZS4KKyAqIFRoaXMgcHJvdmlkZXMgYSBnZW5lcmljIGZyYW1ld29yayBmb3IgY29ubmVjdGluZyBpbnRlcnJ1cHQgc291cmNlcyBhbmQKKyAqIGlucHV0cy4KKyAqLworCisjaWZuZGVmIEFSTV9JTlRFUlJVUFRfSAorI2RlZmluZSBBUk1fSU5URVJSVVBUX0ggMQorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaHcvaXJxLmgiCisKKy8qIFRoZSBDUFUgaXMgYWxzbyBtb2RlbGVkIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyLiAgKi8KKyNkZWZpbmUgQVJNX1BJQ19DUFVfSVJRIDAKKyNkZWZpbmUgQVJNX1BJQ19DUFVfRklRIDEKK3FlbXVfaXJxICphcm1fcGljX2luaXRfY3B1KENQVU9sZFN0YXRlICplbnYpOworCisjZW5kaWYgLyogIUFSTV9JTlRFUlJVUFRfSCAqLworCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYXVkaW9kZXYuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9hdWRpb2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTcyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYXVkaW9kZXYuaApAQCAtMCwwICsxLDE3IEBACisvKiBlczEzNzAuYyAqLworaW50IGVzMTM3MF9pbml0KFBDSUJ1cyAqYnVzKTsKKworLyogc2IxNi5jICovCitpbnQgU0IxNl9pbml0KHFlbXVfaXJxICpwaWMpOworCisvKiBhZGxpYi5jICovCitpbnQgQWRsaWJfaW5pdChxZW11X2lycSAqcGljKTsKKworLyogZ3VzLmMgKi8KK2ludCBHVVNfaW5pdChxZW11X2lycSAqcGljKTsKKworLyogYWM5Ny5jICovCitpbnQgYWM5N19pbml0KFBDSUJ1cyAqYnVmKTsKKworLyogY3M0MjMxYS5jICovCitpbnQgY3M0MjMxYV9pbml0KHFlbXVfaXJxICpwaWMpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2JvYXJkcy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2JvYXJkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNzdhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvYm9hcmRzLmgKQEAgLTAsMCArMSwzNSBAQAorLyogRGVjbGFyYXRpb25zIGZvciB1c2UgYnkgYm9hcmQgZmlsZXMgZm9yIGNyZWF0aW5nIGRldmljZXMuICAqLworCisjaWZuZGVmIEhXX0JPQVJEU19ICisjZGVmaW5lIEhXX0JPQVJEU19ICisKKyNpbmNsdWRlICJleGVjL2NwdS1jb21tb24uaCIKKwordHlwZWRlZiB2b2lkIFFFTVVNYWNoaW5lSW5pdEZ1bmMocmFtX2FkZHJfdCByYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJvb3RfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0cmRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjcHVfbW9kZWwpOworCit0eXBlZGVmIHN0cnVjdCBRRU1VTWFjaGluZSB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIFFFTVVNYWNoaW5lSW5pdEZ1bmMgKmluaXQ7CisgICAgaW50IHVzZV9zY3NpOworICAgIGludCBtYXhfY3B1czsKKyAgICBpbnQgaXNfZGVmYXVsdDsKKyAgICBzdHJ1Y3QgUUVNVU1hY2hpbmUgKm5leHQ7Cit9IFFFTVVNYWNoaW5lOworCitpbnQgcWVtdV9yZWdpc3Rlcl9tYWNoaW5lKFFFTVVNYWNoaW5lICptKTsKKworZXh0ZXJuIFFFTVVNYWNoaW5lICpjdXJyZW50X21hY2hpbmU7CisKKy8qIGFuZHJvaWRfYXJtLmMgKi8KK2V4dGVybiBRRU1VTWFjaGluZSBhbmRyb2lkX2FybV9tYWNoaW5lOworCisvKiBhbmRyb2lkX21pcHMuYyAqLworZXh0ZXJuIFFFTVVNYWNoaW5lIGFuZHJvaWRfbWlwc19tYWNoaW5lOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9kZXZpY2VzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvZGV2aWNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODgzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvZGV2aWNlcy5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpZm5kZWYgUUVNVV9ERVZJQ0VTX0gKKyNkZWZpbmUgUUVNVV9ERVZJQ0VTX0gKKworLyogRGV2aWNlcyB0aGF0IGhhdmUgbm93aGVyZSBiZXR0ZXIgdG8gZ28uICAqLworCisvKiBzbWM5MWMxMTEuYyAqLwordm9pZCBzbWM5MWMxMTFfaW5pdChOSUNJbmZvICosIHVpbnQzMl90LCBxZW11X2lycSk7CisKKy8qIGxhbjkxMTguYyAqLwordm9pZCBsYW45MTE4X2luaXQoTklDSW5mbyAqLCB1aW50MzJfdCwgcWVtdV9pcnEpOworCisvKiB0c2MyMTB4LmMgKi8KK3VXaXJlU2xhdmUgKnRzYzIxMDJfaW5pdChxZW11X2lycSBwaW50KTsKK3VXaXJlU2xhdmUgKnRzYzIzMDFfaW5pdChxZW11X2lycSBwZW5pcnEsIHFlbXVfaXJxIGtiaXJxLCBxZW11X2lycSBkYXYpOworSTJTQ29kZWMgKnRzYzIxMHhfY29kZWModVdpcmVTbGF2ZSAqY2hpcCk7Cit1aW50MzJfdCB0c2MyMTB4X3R4cngodm9pZCAqb3BhcXVlLCB1aW50MzJfdCB2YWx1ZSwgaW50IGxlbik7Cit2b2lkIHRzYzIxMHhfc2V0X3RyYW5zZm9ybSh1V2lyZVNsYXZlICpjaGlwLAorICAgICAgICAgICAgICAgIE1vdXNlVHJhbnNmb3JtSW5mbyAqaW5mbyk7Cit2b2lkIHRzYzIxMHhfa2V5X2V2ZW50KHVXaXJlU2xhdmUgKmNoaXAsIGludCBrZXksIGludCBkb3duKTsKKworLyogdHNjMjAwNS5jICovCit2b2lkICp0c2MyMDA1X2luaXQocWVtdV9pcnEgcGludGRhdik7Cit1aW50MzJfdCB0c2MyMDA1X3R4cngodm9pZCAqb3BhcXVlLCB1aW50MzJfdCB2YWx1ZSwgaW50IGxlbik7Cit2b2lkIHRzYzIwMDVfc2V0X3RyYW5zZm9ybSh2b2lkICpvcGFxdWUsIE1vdXNlVHJhbnNmb3JtSW5mbyAqaW5mbyk7CisKKy8qIHN0ZWxsYXJpc19pbnB1dC5jICovCit2b2lkIHN0ZWxsYXJpc19nYW1lcGFkX2luaXQoaW50IG4sIHFlbXVfaXJxICppcnEsIGNvbnN0IGludCAqa2V5Y29kZSk7CisKKy8qIGJsaXp6YXJkLmMgKi8KK3ZvaWQgKnMxZDEzNzQ1X2luaXQocWVtdV9pcnEgZ3Bpb19pbnQpOwordm9pZCBzMWQxMzc0NV93cml0ZSh2b2lkICpvcGFxdWUsIGludCBkYywgdWludDE2X3QgdmFsdWUpOwordm9pZCBzMWQxMzc0NV93cml0ZV9ibG9jayh2b2lkICpvcGFxdWUsIGludCBkYywKKyAgICAgICAgICAgICAgICB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBwaXRjaCk7Cit1aW50MTZfdCBzMWQxMzc0NV9yZWFkKHZvaWQgKm9wYXF1ZSwgaW50IGRjKTsKKworLyogY2J1cy5jICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgcWVtdV9pcnEgY2xrOworICAgIHFlbXVfaXJxIGRhdDsKKyAgICBxZW11X2lycSBzZWw7Cit9IENCdXM7CitDQnVzICpjYnVzX2luaXQocWVtdV9pcnEgZGF0X291dCk7Cit2b2lkIGNidXNfYXR0YWNoKENCdXMgKmJ1cywgdm9pZCAqc2xhdmVfb3BhcXVlKTsKKwordm9pZCAqcmV0dV9pbml0KHFlbXVfaXJxIGlycSwgaW50IHZpbG1hKTsKK3ZvaWQgKnRhaHZvX2luaXQocWVtdV9pcnEgaXJxLCBpbnQgYmV0dHkpOworCit2b2lkIHJldHVfa2V5X2V2ZW50KHZvaWQgKnJldHUsIGludCBzdGF0ZSk7CisKKy8qIHR1c2I2MDEwLmMgKi8KK3R5cGVkZWYgc3RydWN0IFRVU0JTdGF0ZSBUVVNCU3RhdGU7CitUVVNCU3RhdGUgKnR1c2I2MDEwX2luaXQocWVtdV9pcnEgaW50cik7CitpbnQgdHVzYjYwMTBfc3luY19pbyhUVVNCU3RhdGUgKnMpOworaW50IHR1c2I2MDEwX2FzeW5jX2lvKFRVU0JTdGF0ZSAqcyk7Cit2b2lkIHR1c2I2MDEwX3Bvd2VyKFRVU0JTdGF0ZSAqcywgaW50IG9uKTsKKworLyogdGM2MzkzeGIuYyAqLwordHlwZWRlZiBzdHJ1Y3QgVEM2MzkzeGJTdGF0ZSBUQzYzOTN4YlN0YXRlOworI2RlZmluZSBUQzYzOTNYQl9SQU0JMHgxMTAwMDAgLyogYW1vdW50IG9mIHJhbSBmb3IgVmlkZW8gYW5kIFVTQiAqLworVEM2MzkzeGJTdGF0ZSAqdGM2MzkzeGJfaW5pdCh1aW50MzJfdCBiYXNlLCBxZW11X2lycSBpcnEpOwordm9pZCB0YzYzOTN4Yl9ncGlvX291dF9zZXQoVEM2MzkzeGJTdGF0ZSAqcywgaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgIHFlbXVfaXJxIGhhbmRsZXIpOworcWVtdV9pcnEgKnRjNjM5M3hiX2dwaW9faW5fZ2V0KFRDNjM5M3hiU3RhdGUgKnMpOworcWVtdV9pcnEgdGM2MzkzeGJfbDN2X2dldChUQzYzOTN4YlN0YXRlICpzKTsKKworLyogc201MDEuYyAqLwordm9pZCBzbTUwMV9pbml0KHVpbnQzMl90IGJhc2UsIHVpbnQzMl90IGxvY2FsX21lbV9ieXRlcywgcWVtdV9pcnEgaXJxLAorICAgICAgICAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvZWxmX29wcy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2VsZl9vcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTEwYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2VsZl9vcHMuaApAQCAtMCwwICsxLDI3NCBAQAorc3RhdGljIHZvaWQgZ2x1ZShic3dhcF9laGRyLCBTWikoc3RydWN0IGVsZmhkciAqZWhkcikKK3sKKyAgICBic3dhcDE2cygmZWhkci0+ZV90eXBlKTsJCQkvKiBPYmplY3QgZmlsZSB0eXBlICovCisgICAgYnN3YXAxNnMoJmVoZHItPmVfbWFjaGluZSk7CQkvKiBBcmNoaXRlY3R1cmUgKi8KKyAgICBic3dhcDMycygmZWhkci0+ZV92ZXJzaW9uKTsJCS8qIE9iamVjdCBmaWxlIHZlcnNpb24gKi8KKyAgICBic3dhcFNacygmZWhkci0+ZV9lbnRyeSk7CQkvKiBFbnRyeSBwb2ludCB2aXJ0dWFsIGFkZHJlc3MgKi8KKyAgICBic3dhcFNacygmZWhkci0+ZV9waG9mZik7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLworICAgIGJzd2FwU1pzKCZlaGRyLT5lX3Nob2ZmKTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCisgICAgYnN3YXAzMnMoJmVoZHItPmVfZmxhZ3MpOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCisgICAgYnN3YXAxNnMoJmVoZHItPmVfZWhzaXplKTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLworICAgIGJzd2FwMTZzKCZlaGRyLT5lX3BoZW50c2l6ZSk7CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCisgICAgYnN3YXAxNnMoJmVoZHItPmVfcGhudW0pOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KKyAgICBic3dhcDE2cygmZWhkci0+ZV9zaGVudHNpemUpOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLworICAgIGJzd2FwMTZzKCZlaGRyLT5lX3NobnVtKTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCisgICAgYnN3YXAxNnMoJmVoZHItPmVfc2hzdHJuZHgpOwkJLyogU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4ICovCit9CisKK3N0YXRpYyB2b2lkIGdsdWUoYnN3YXBfcGhkciwgU1opKHN0cnVjdCBlbGZfcGhkciAqcGhkcikKK3sKKyAgICBic3dhcDMycygmcGhkci0+cF90eXBlKTsJCQkvKiBTZWdtZW50IHR5cGUgKi8KKyAgICBic3dhcFNacygmcGhkci0+cF9vZmZzZXQpOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLworICAgIGJzd2FwU1pzKCZwaGRyLT5wX3ZhZGRyKTsJCS8qIFNlZ21lbnQgdmlydHVhbCBhZGRyZXNzICovCisgICAgYnN3YXBTWnMoJnBoZHItPnBfcGFkZHIpOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCisgICAgYnN3YXBTWnMoJnBoZHItPnBfZmlsZXN6KTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCisgICAgYnN3YXBTWnMoJnBoZHItPnBfbWVtc3opOwkJLyogU2VnbWVudCBzaXplIGluIG1lbW9yeSAqLworICAgIGJzd2FwMzJzKCZwaGRyLT5wX2ZsYWdzKTsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KKyAgICBic3dhcFNacygmcGhkci0+cF9hbGlnbik7CQkvKiBTZWdtZW50IGFsaWdubWVudCAqLworfQorCitzdGF0aWMgdm9pZCBnbHVlKGJzd2FwX3NoZHIsIFNaKShzdHJ1Y3QgZWxmX3NoZHIgKnNoZHIpCit7CisgICAgYnN3YXAzMnMoJnNoZHItPnNoX25hbWUpOworICAgIGJzd2FwMzJzKCZzaGRyLT5zaF90eXBlKTsKKyAgICBic3dhcFNacygmc2hkci0+c2hfZmxhZ3MpOworICAgIGJzd2FwU1pzKCZzaGRyLT5zaF9hZGRyKTsKKyAgICBic3dhcFNacygmc2hkci0+c2hfb2Zmc2V0KTsKKyAgICBic3dhcFNacygmc2hkci0+c2hfc2l6ZSk7CisgICAgYnN3YXAzMnMoJnNoZHItPnNoX2xpbmspOworICAgIGJzd2FwMzJzKCZzaGRyLT5zaF9pbmZvKTsKKyAgICBic3dhcFNacygmc2hkci0+c2hfYWRkcmFsaWduKTsKKyAgICBic3dhcFNacygmc2hkci0+c2hfZW50c2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdsdWUoYnN3YXBfc3ltLCBTWikoc3RydWN0IGVsZl9zeW0gKnN5bSkKK3sKKyAgICBic3dhcDMycygmc3ltLT5zdF9uYW1lKTsKKyAgICBic3dhcFNacygmc3ltLT5zdF92YWx1ZSk7CisgICAgYnN3YXBTWnMoJnN5bS0+c3Rfc2l6ZSk7CisgICAgYnN3YXAxNnMoJnN5bS0+c3Rfc2huZHgpOworfQorCitzdGF0aWMgc3RydWN0IGVsZl9zaGRyICpnbHVlKGZpbmRfc2VjdGlvbiwgU1opKHN0cnVjdCBlbGZfc2hkciAqc2hkcl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCB0eXBlKQoreworICAgIGludCBpOworICAgIGZvcihpPTA7aTxuO2krKykgeworICAgICAgICBpZiAoc2hkcl90YWJsZVtpXS5zaF90eXBlID09IHR5cGUpCisgICAgICAgICAgICByZXR1cm4gc2hkcl90YWJsZSArIGk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdsdWUoc3ltZmluZCwgU1opKGNvbnN0IHZvaWQgKnMwLCBjb25zdCB2b2lkICpzMSkKK3sKKyAgICBzdHJ1Y3QgZWxmX3N5bSAqa2V5ID0gKHN0cnVjdCBlbGZfc3ltICopczA7CisgICAgc3RydWN0IGVsZl9zeW0gKnN5bSA9IChzdHJ1Y3QgZWxmX3N5bSAqKXMxOworICAgIGludCByZXN1bHQgPSAwOworICAgIGlmIChrZXktPnN0X3ZhbHVlIDwgc3ltLT5zdF92YWx1ZSkgeworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9IGVsc2UgaWYgKGtleS0+c3RfdmFsdWUgPiBzeW0tPnN0X3ZhbHVlICsgc3ltLT5zdF9zaXplKSB7CisgICAgICAgIHJlc3VsdCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnbHVlKGxvb2t1cF9zeW1ib2wsIFNaKShzdHJ1Y3Qgc3ltaW5mbyAqcywgaHdhZGRyIG9yaWdfYWRkcikKK3sKKyAgICBzdHJ1Y3QgZWxmX3N5bSAqc3ltcyA9IGdsdWUocy0+ZGlzYXNfc3ltdGFiLmVsZiwgU1opOworICAgIHN0cnVjdCBlbGZfc3ltIGtleTsKKyAgICBzdHJ1Y3QgZWxmX3N5bSAqc3ltOworCisgICAga2V5LnN0X3ZhbHVlID0gb3JpZ19hZGRyOworCisgICAgc3ltID0gYnNlYXJjaCgma2V5LCBzeW1zLCBzLT5kaXNhc19udW1fc3ltcywgc2l6ZW9mKCpzeW1zKSwgZ2x1ZShzeW1maW5kLCBTWikpOworICAgIGlmIChzeW0gIT0gMCkgeworICAgICAgICByZXR1cm4gcy0+ZGlzYXNfc3RydGFiICsgc3ltLT5zdF9uYW1lOworICAgIH0KKworICAgIHJldHVybiAiIjsKK30KKworc3RhdGljIGludCBnbHVlKHN5bWNtcCwgU1opKGNvbnN0IHZvaWQgKnMwLCBjb25zdCB2b2lkICpzMSkKK3sKKyAgICBzdHJ1Y3QgZWxmX3N5bSAqc3ltMCA9IChzdHJ1Y3QgZWxmX3N5bSAqKXMwOworICAgIHN0cnVjdCBlbGZfc3ltICpzeW0xID0gKHN0cnVjdCBlbGZfc3ltICopczE7CisgICAgcmV0dXJuIChzeW0wLT5zdF92YWx1ZSA8IHN5bTEtPnN0X3ZhbHVlKQorICAgICAgICA/IC0xCisgICAgICAgIDogKChzeW0wLT5zdF92YWx1ZSA+IHN5bTEtPnN0X3ZhbHVlKSA/IDEgOiAwKTsKK30KKworc3RhdGljIGludCBnbHVlKGxvYWRfc3ltYm9scywgU1opKHN0cnVjdCBlbGZoZHIgKmVoZHIsIGludCBmZCwgaW50IG11c3Rfc3dhYikKK3sKKyAgICBzdHJ1Y3QgZWxmX3NoZHIgKnN5bXRhYiwgKnN0cnRhYiwgKnNoZHJfdGFibGUgPSBOVUxMOworICAgIHN0cnVjdCBlbGZfc3ltICpzeW1zID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3ltaW5mbyAqczsKKyAgICBpbnQgbnN5bXMsIGk7CisgICAgY2hhciAqc3RyID0gTlVMTDsKKworICAgIHNoZHJfdGFibGUgPSBsb2FkX2F0KGZkLCBlaGRyLT5lX3Nob2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZWxmX3NoZHIpICogZWhkci0+ZV9zaG51bSk7CisgICAgaWYgKCFzaGRyX3RhYmxlKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAobXVzdF9zd2FiKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlaGRyLT5lX3NobnVtOyBpKyspIHsKKyAgICAgICAgICAgIGdsdWUoYnN3YXBfc2hkciwgU1opKHNoZHJfdGFibGUgKyBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN5bXRhYiA9IGdsdWUoZmluZF9zZWN0aW9uLCBTWikoc2hkcl90YWJsZSwgZWhkci0+ZV9zaG51bSwgU0hUX1NZTVRBQik7CisgICAgaWYgKCFzeW10YWIpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzeW1zID0gbG9hZF9hdChmZCwgc3ltdGFiLT5zaF9vZmZzZXQsIHN5bXRhYi0+c2hfc2l6ZSk7CisgICAgaWYgKCFzeW1zKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBuc3ltcyA9IHN5bXRhYi0+c2hfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZWxmX3N5bSk7CisKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG5zeW1zKSB7CisgICAgICAgIGlmIChtdXN0X3N3YWIpCisgICAgICAgICAgICBnbHVlKGJzd2FwX3N5bSwgU1opKCZzeW1zW2ldKTsKKyAgICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBmdW5jdGlvbiBzeW1ib2xzLgorICAgICAgICAgICBUaHJvdyBldmVyeXRoaW5nIGVsc2UgYXdheS4gICovCisgICAgICAgIGlmIChzeW1zW2ldLnN0X3NobmR4ID09IFNITl9VTkRFRiB8fAorICAgICAgICAgICAgICAgIHN5bXNbaV0uc3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSB8fAorICAgICAgICAgICAgICAgIEVMRl9TVF9UWVBFKHN5bXNbaV0uc3RfaW5mbykgIT0gU1RUX0ZVTkMpIHsKKyAgICAgICAgICAgIG5zeW1zLS07CisgICAgICAgICAgICBpZiAoaSA8IG5zeW1zKSB7CisgICAgICAgICAgICAgICAgc3ltc1tpXSA9IHN5bXNbbnN5bXNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pIHx8IGRlZmluZWQgKFRBUkdFVF9NSVBTKQorICAgICAgICAvKiBUaGUgYm90dG9tIGFkZHJlc3MgYml0IG1hcmtzIGEgVGh1bWIgb3IgTUlQUzE2IHN5bWJvbC4gICovCisgICAgICAgIHN5bXNbaV0uc3RfdmFsdWUgJj0gfihod2FkZHIpMTsKKyNlbmRpZgorICAgICAgICBpKys7CisgICAgfQorICAgIHN5bXMgPSBnX3JlYWxsb2Moc3ltcywgbnN5bXMgKiBzaXplb2YoKnN5bXMpKTsKKworICAgIHFzb3J0KHN5bXMsIG5zeW1zLCBzaXplb2YoKnN5bXMpLCBnbHVlKHN5bWNtcCwgU1opKTsKKworICAgIC8qIFN0cmluZyB0YWJsZSAqLworICAgIGlmIChzeW10YWItPnNoX2xpbmsgPj0gZWhkci0+ZV9zaG51bSkKKyAgICAgICAgZ290byBmYWlsOworICAgIHN0cnRhYiA9ICZzaGRyX3RhYmxlW3N5bXRhYi0+c2hfbGlua107CisKKyAgICBzdHIgPSBsb2FkX2F0KGZkLCBzdHJ0YWItPnNoX29mZnNldCwgc3RydGFiLT5zaF9zaXplKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogQ29tbWl0ICovCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoKnMpKTsKKyAgICBzLT5sb29rdXBfc3ltYm9sID0gZ2x1ZShsb29rdXBfc3ltYm9sLCBTWik7CisgICAgZ2x1ZShzLT5kaXNhc19zeW10YWIuZWxmLCBTWikgPSBzeW1zOworICAgIHMtPmRpc2FzX251bV9zeW1zID0gbnN5bXM7CisgICAgcy0+ZGlzYXNfc3RydGFiID0gc3RyOworICAgIHMtPm5leHQgPSBzeW1pbmZvczsKKyAgICBzeW1pbmZvcyA9IHM7CisgICAgZ19mcmVlKHNoZHJfdGFibGUpOworICAgIHJldHVybiAwOworIGZhaWw6CisgICAgZ19mcmVlKHN5bXMpOworICAgIGdfZnJlZShzdHIpOworICAgIGdfZnJlZShzaGRyX3RhYmxlKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZ2x1ZShsb2FkX2VsZiwgU1opKGludCBmZCwgaW50NjRfdCBhZGRyZXNzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtdXN0X3N3YWIsIHVpbnQ2NF90ICpwZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqbG93YWRkciwgdWludDY0X3QgKmhpZ2hhZGRyKQoreworICAgIHN0cnVjdCBlbGZoZHIgZWhkcjsKKyAgICBzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIgPSBOVUxMLCAqcGg7CisgICAgaW50IHNpemUsIGksIHRvdGFsX3NpemU7CisgICAgZWxmX3dvcmQgbWVtX3NpemU7CisgICAgdWludDY0X3QgYWRkciwgbG93ID0gKHVpbnQ2NF90KS0xLCBoaWdoID0gMDsKKyAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKKworICAgIGlmIChyZWFkKGZkLCAmZWhkciwgc2l6ZW9mKGVoZHIpKSAhPSBzaXplb2YoZWhkcikpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAobXVzdF9zd2FiKSB7CisgICAgICAgIGdsdWUoYnN3YXBfZWhkciwgU1opKCZlaGRyKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKEVMRl9NQUNISU5FKSB7CisgICAgICAgIGNhc2UgRU1fUFBDNjQ6CisgICAgICAgICAgICBpZiAoRU1fUFBDNjQgIT0gZWhkci5lX21hY2hpbmUpCisgICAgICAgICAgICAgICAgaWYgKEVNX1BQQyAhPSBlaGRyLmVfbWFjaGluZSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU1fWDg2XzY0OgorICAgICAgICAgICAgaWYgKEVNX1g4Nl82NCAhPSBlaGRyLmVfbWFjaGluZSkKKyAgICAgICAgICAgICAgICBpZiAoRU1fMzg2ICE9IGVoZHIuZV9tYWNoaW5lKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChFTEZfTUFDSElORSAhPSBlaGRyLmVfbWFjaGluZSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHBlbnRyeSkKKyAgIAkqcGVudHJ5ID0gKHVpbnQ2NF90KShlbGZfc3dvcmQpZWhkci5lX2VudHJ5OworCisgICAgZ2x1ZShsb2FkX3N5bWJvbHMsIFNaKSgmZWhkciwgZmQsIG11c3Rfc3dhYik7CisKKyAgICBzaXplID0gZWhkci5lX3BobnVtICogc2l6ZW9mKHBoZHJbMF0pOworICAgIGxzZWVrKGZkLCBlaGRyLmVfcGhvZmYsIFNFRUtfU0VUKTsKKyAgICBwaGRyID0gZ19tYWxsb2MwKHNpemUpOworICAgIGlmICghcGhkcikKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChyZWFkKGZkLCBwaGRyLCBzaXplKSAhPSBzaXplKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKG11c3Rfc3dhYikgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBlaGRyLmVfcGhudW07IGkrKykgeworICAgICAgICAgICAgcGggPSAmcGhkcltpXTsKKyAgICAgICAgICAgIGdsdWUoYnN3YXBfcGhkciwgU1opKHBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRvdGFsX3NpemUgPSAwOworICAgIGZvcihpID0gMDsgaSA8IGVoZHIuZV9waG51bTsgaSsrKSB7CisgICAgICAgIHBoID0gJnBoZHJbaV07CisgICAgICAgIGlmIChwaC0+cF90eXBlID09IFBUX0xPQUQpIHsKKyAgICAgICAgICAgIG1lbV9zaXplID0gcGgtPnBfbWVtc3o7CisgICAgICAgICAgICAvKiBYWFg6IGF2b2lkIGFsbG9jYXRpbmcgKi8KKyAgICAgICAgICAgIGRhdGEgPSBnX21hbGxvYzAobWVtX3NpemUpOworICAgICAgICAgICAgaWYgKHBoLT5wX2ZpbGVzeiA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobHNlZWsoZmQsIHBoLT5wX29mZnNldCwgU0VFS19TRVQpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGlmIChyZWFkKGZkLCBkYXRhLCBwaC0+cF9maWxlc3opICE9IHBoLT5wX2ZpbGVzeikKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogYWRkcmVzc19vZmZzZXQgaXMgaGFjayBmb3Iga2VybmVsIGltYWdlcyB0aGF0IGFyZQorICAgICAgICAgICAgICAgbGlua2VkIGF0IHRoZSB3cm9uZyBwaHlzaWNhbCBhZGRyZXNzLiAgKi8KKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTKQorICAgICAgICAgICAgYWRkciA9IChpbnQzMl90KShwaC0+cF9wYWRkciArIGFkZHJlc3Nfb2Zmc2V0KTsKKyNlbHNlCisgICAgICAgICAgICBhZGRyID0gcGgtPnBfcGFkZHIgKyBhZGRyZXNzX29mZnNldDsKKyNlbmRpZgorICAgICAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZV9yb20oYWRkciwgZGF0YSwgbWVtX3NpemUpOworCisgICAgICAgICAgICB0b3RhbF9zaXplICs9IG1lbV9zaXplOworICAgICAgICAgICAgaWYgKGFkZHIgPCBsb3cpCisgICAgICAgICAgICAgICAgbG93ID0gYWRkcjsKKyAgICAgICAgICAgIGlmICgoYWRkciArIG1lbV9zaXplKSA+IGhpZ2gpCisgICAgICAgICAgICAgICAgaGlnaCA9IGFkZHIgKyBtZW1fc2l6ZTsKKworICAgICAgICAgICAgZ19mcmVlKGRhdGEpOworICAgICAgICAgICAgZGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZ19mcmVlKHBoZHIpOworICAgIGlmIChsb3dhZGRyKQorICAgICAgICAqbG93YWRkciA9ICh1aW50NjRfdCkoZWxmX3N3b3JkKWxvdzsKKyAgICBpZiAoaGlnaGFkZHIpCisgICAgICAgICpoaWdoYWRkciA9ICh1aW50NjRfdCkoZWxmX3N3b3JkKWhpZ2g7CisgICAgcmV0dXJuIHRvdGFsX3NpemU7CisgZmFpbDoKKyAgICBnX2ZyZWUoZGF0YSk7CisgICAgZ19mcmVlKHBoZHIpOworICAgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9ody5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2h3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkYzhiYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9ody5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIERlY2xhcmF0aW9ucyBmb3IgdXNlIGJ5IGhhcmR3YXJlIGVtdWxhdGlvbi4gICovCisjaWZuZGVmIFFFTVVfSFdfSAorI2RlZmluZSBRRU1VX0hXX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiaHcvaXJxLmgiCisjaW5jbHVkZSAibWlncmF0aW9uL3FlbXUtZmlsZS5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi92bXN0YXRlLmgiCisKKyNpZmRlZiBORUVEX0NQVV9ICisjaW5jbHVkZSAiY3B1LmgiCisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0FORFJPSUQKK3ZvaWQgcWVtdV9wdXRfc3RyaW5nKFFFTVVGaWxlICpmLCBjb25zdCBjaGFyKiBzdHIpOworY2hhciogcWVtdV9nZXRfc3RyaW5nKFFFTVVGaWxlICpmKTsKKyNlbmRpZgorCisjaWZkZWYgTkVFRF9DUFVfSAorI2lmIFRBUkdFVF9MT05HX0JJVFMgPT0gNjQKKyNkZWZpbmUgcWVtdV9wdXRfYmV0bCBxZW11X3B1dF9iZTY0CisjZGVmaW5lIHFlbXVfZ2V0X2JldGwgcWVtdV9nZXRfYmU2NAorI2RlZmluZSBxZW11X3B1dF9iZXRscyBxZW11X3B1dF9iZTY0cworI2RlZmluZSBxZW11X2dldF9iZXRscyBxZW11X2dldF9iZTY0cworI2RlZmluZSBxZW11X3B1dF9zYmV0bCBxZW11X3B1dF9zYmU2NAorI2RlZmluZSBxZW11X2dldF9zYmV0bCBxZW11X2dldF9zYmU2NAorI2RlZmluZSBxZW11X3B1dF9zYmV0bHMgcWVtdV9wdXRfc2JlNjRzCisjZGVmaW5lIHFlbXVfZ2V0X3NiZXRscyBxZW11X2dldF9zYmU2NHMKKyNlbHNlCisjZGVmaW5lIHFlbXVfcHV0X2JldGwgcWVtdV9wdXRfYmUzMgorI2RlZmluZSBxZW11X2dldF9iZXRsIHFlbXVfZ2V0X2JlMzIKKyNkZWZpbmUgcWVtdV9wdXRfYmV0bHMgcWVtdV9wdXRfYmUzMnMKKyNkZWZpbmUgcWVtdV9nZXRfYmV0bHMgcWVtdV9nZXRfYmUzMnMKKyNkZWZpbmUgcWVtdV9wdXRfc2JldGwgcWVtdV9wdXRfc2JlMzIKKyNkZWZpbmUgcWVtdV9nZXRfc2JldGwgcWVtdV9nZXRfc2JlMzIKKyNkZWZpbmUgcWVtdV9wdXRfc2JldGxzIHFlbXVfcHV0X3NiZTMycworI2RlZmluZSBxZW11X2dldF9zYmV0bHMgcWVtdV9nZXRfc2JlMzJzCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgUUVNVVJlc2V0SGFuZGxlcih2b2lkICpvcGFxdWUpOworCit2b2lkIHFlbXVfcmVnaXN0ZXJfcmVzZXQoUUVNVVJlc2V0SGFuZGxlciAqZnVuYywgaW50IG9yZGVyLCB2b2lkICpvcGFxdWUpOworCisvKiBoYW5kbGVyIHRvIHNldCB0aGUgYm9vdF9kZXZpY2UgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZiBRRU1VTWFjaGluZSAqLworLyogcmV0dXJuIDAgaWYgc3VjY2VzcyAqLwordHlwZWRlZiBpbnQgUUVNVUJvb3RTZXRIYW5kbGVyKHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqYm9vdF9kZXZpY2UpOwordm9pZCBxZW11X3JlZ2lzdGVyX2Jvb3Rfc2V0KFFFTVVCb290U2V0SGFuZGxlciAqZnVuYywgdm9pZCAqb3BhcXVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvaTM4Ni9wYy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2kzODYvcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDBlNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2kzODYvcGMuaApAQCAtMCwwICsxLDE2OCBAQAorI2lmbmRlZiBIV19QQ19ICisjZGVmaW5lIEhXX1BDX0gKKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiZXhlYy9od2FkZHIuaCIKKworLyogUEMtc3R5bGUgcGVyaXBoZXJhbHMgKGFsc28gdXNlZCBieSBvdGhlciBtYWNoaW5lcykuICAqLworCisvKiBzZXJpYWwuYyAqLworCitTZXJpYWxTdGF0ZSAqc2VyaWFsX2luaXQoaW50IGJhc2UsIHFlbXVfaXJxIGlycSwgaW50IGJhdWRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyKTsKK1NlcmlhbFN0YXRlICpzZXJpYWxfbW1faW5pdCAoaHdhZGRyIGJhc2UsIGludCBpdF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9pcnEgaXJxLCBpbnQgYmF1ZGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBpbnQgaW9yZWdpc3Rlcik7Cit1aW50MzJfdCBzZXJpYWxfbW1fcmVhZGIgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpOwordm9pZCBzZXJpYWxfbW1fd3JpdGViICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWx1ZSk7Cit1aW50MzJfdCBzZXJpYWxfbW1fcmVhZHcgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpOwordm9pZCBzZXJpYWxfbW1fd3JpdGV3ICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWx1ZSk7Cit1aW50MzJfdCBzZXJpYWxfbW1fcmVhZGwgKHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIpOwordm9pZCBzZXJpYWxfbW1fd3JpdGVsICh2b2lkICpvcGFxdWUsIGh3YWRkciBhZGRyLCB1aW50MzJfdCB2YWx1ZSk7CisKKy8qIHBhcmFsbGVsLmMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUGFyYWxsZWxTdGF0ZSBQYXJhbGxlbFN0YXRlOworUGFyYWxsZWxTdGF0ZSAqcGFyYWxsZWxfaW5pdChpbnQgYmFzZSwgcWVtdV9pcnEgaXJxLCBDaGFyRHJpdmVyU3RhdGUgKmNocik7CitQYXJhbGxlbFN0YXRlICpwYXJhbGxlbF9tbV9pbml0KGh3YWRkciBiYXNlLCBpbnQgaXRfc2hpZnQsIHFlbXVfaXJxIGlycSwgQ2hhckRyaXZlclN0YXRlICpjaHIpOworCisvKiBpODI1OS5jICovCisKK3R5cGVkZWYgc3RydWN0IFBpY1N0YXRlMiBQaWNTdGF0ZTI7CitleHRlcm4gUGljU3RhdGUyICppc2FfcGljOwordm9pZCBwaWNfc2V0X2lycShpbnQgaXJxLCBpbnQgbGV2ZWwpOwordm9pZCBwaWNfc2V0X2lycV9uZXcodm9pZCAqb3BhcXVlLCBpbnQgaXJxLCBpbnQgbGV2ZWwpOworcWVtdV9pcnEgKmk4MjU5X2luaXQocWVtdV9pcnEgcGFyZW50X2lycSk7Cit2b2lkIHBpY19zZXRfYWx0X2lycV9mdW5jKFBpY1N0YXRlMiAqcywgU2V0SVJRRnVuYyAqYWx0X2lycV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphbHRfaXJxX29wYXF1ZSk7CitpbnQgcGljX3JlYWRfaXJxKFBpY1N0YXRlMiAqcyk7Cit2b2lkIHBpY191cGRhdGVfaXJxKFBpY1N0YXRlMiAqcyk7Cit1aW50MzJfdCBwaWNfaW50YWNrX3JlYWQoUGljU3RhdGUyICpzKTsKK3ZvaWQgcGljX2luZm8oTW9uaXRvciAqbW9uKTsKK3ZvaWQgaXJxX2luZm8oTW9uaXRvciAqbW9uKTsKKworLyogQVBJQyAqLwordHlwZWRlZiBzdHJ1Y3QgSU9BUElDU3RhdGUgSU9BUElDU3RhdGU7Cit2b2lkIGFwaWNfZGVsaXZlcl9pcnEodWludDhfdCBkZXN0LCB1aW50OF90IGRlc3RfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkZWxpdmVyeV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZlY3Rvcl9udW0sIHVpbnQ4X3QgcG9sYXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHJpZ2dlcl9tb2RlKTsKK2ludCBhcGljX2luaXQoQ1BVT2xkU3RhdGUgKmVudik7CitpbnQgYXBpY19hY2NlcHRfcGljX2ludHIoQ1BVT2xkU3RhdGUgKmVudik7Cit2b2lkIGFwaWNfZGVsaXZlcl9waWNfaW50cihDUFVPbGRTdGF0ZSAqZW52LCBpbnQgbGV2ZWwpOworaW50IGFwaWNfZ2V0X2ludGVycnVwdChDUFVPbGRTdGF0ZSAqZW52KTsKK0lPQVBJQ1N0YXRlICppb2FwaWNfaW5pdCh2b2lkKTsKK3ZvaWQgaW9hcGljX3NldF9pcnEodm9pZCAqb3BhcXVlLCBpbnQgdmVjdG9yLCBpbnQgbGV2ZWwpOwordm9pZCBhcGljX3Jlc2V0X2lycV9kZWxpdmVyZWQodm9pZCk7CitpbnQgYXBpY19nZXRfaXJxX2RlbGl2ZXJlZCh2b2lkKTsKKworLyogaTgyNTQuYyAqLworCisjZGVmaW5lIFBJVF9GUkVRIDExOTMxODIKKwordHlwZWRlZiBzdHJ1Y3QgUElUU3RhdGUgUElUU3RhdGU7CisKK1BJVFN0YXRlICpwaXRfaW5pdChpbnQgYmFzZSwgcWVtdV9pcnEgaXJxKTsKK3ZvaWQgcGl0X3NldF9nYXRlKFBJVFN0YXRlICpwaXQsIGludCBjaGFubmVsLCBpbnQgdmFsKTsKK2ludCBwaXRfZ2V0X2dhdGUoUElUU3RhdGUgKnBpdCwgaW50IGNoYW5uZWwpOworaW50IHBpdF9nZXRfaW5pdGlhbF9jb3VudChQSVRTdGF0ZSAqcGl0LCBpbnQgY2hhbm5lbCk7CitpbnQgcGl0X2dldF9tb2RlKFBJVFN0YXRlICpwaXQsIGludCBjaGFubmVsKTsKK2ludCBwaXRfZ2V0X291dChQSVRTdGF0ZSAqcGl0LCBpbnQgY2hhbm5lbCwgaW50NjRfdCBjdXJyZW50X3RpbWUpOworCit2b2lkIGhwZXRfcGl0X2Rpc2FibGUodm9pZCk7Cit2b2lkIGhwZXRfcGl0X2VuYWJsZSh2b2lkKTsKKworLyogdm1wb3J0LmMgKi8KK3ZvaWQgdm1wb3J0X2luaXQodm9pZCk7Cit2b2lkIHZtcG9ydF9yZWdpc3Rlcih1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIElPUG9ydFJlYWRGdW5jICpmdW5jLCB2b2lkICpvcGFxdWUpOworCisvKiB2bW1vdXNlLmMgKi8KK3ZvaWQgKnZtbW91c2VfaW5pdCh2b2lkICptKTsKKworLyogcGNrYmQuYyAqLworCit2b2lkIGk4MDQyX2luaXQocWVtdV9pcnEga2JkX2lycSwgcWVtdV9pcnEgbW91c2VfaXJxLCB1aW50MzJfdCBpb19iYXNlKTsKK3ZvaWQgaTgwNDJfbW1faW5pdChxZW11X2lycSBrYmRfaXJxLCBxZW11X2lycSBtb3VzZV9pcnEsCisgICAgICAgICAgICAgICAgICAgaHdhZGRyIGJhc2UsIHJhbV9hZGRyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBod2FkZHIgbWFzayk7CisKKy8qIG1jMTQ2ODE4cnRjLmMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUlRDU3RhdGUgUlRDU3RhdGU7CisKK1JUQ1N0YXRlICpydGNfaW5pdChpbnQgYmFzZSwgcWVtdV9pcnEgaXJxLCBpbnQgYmFzZV95ZWFyKTsKK1JUQ1N0YXRlICpydGNfaW5pdF9zcXcoaW50IGJhc2UsIHFlbXVfaXJxIGlycSwgcWVtdV9pcnEgc3F3X2lycSwgaW50IGJhc2VfeWVhcik7CitSVENTdGF0ZSAqcnRjX21tX2luaXQoaHdhZGRyIGJhc2UsIGludCBpdF9zaGlmdCwgcWVtdV9pcnEgaXJxLAorICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlX3llYXIpOwordm9pZCBydGNfc2V0X21lbW9yeShSVENTdGF0ZSAqcywgaW50IGFkZHIsIGludCB2YWwpOwordm9pZCBydGNfc2V0X2RhdGUoUlRDU3RhdGUgKnMsIGNvbnN0IHN0cnVjdCB0bSAqdG0pOwordm9pZCBjbW9zX3NldF9zM19yZXN1bWUodm9pZCk7CisKKy8qIHBjLmMgKi8KK2V4dGVybiBpbnQgZmRfYm9vdGNoazsKKwordm9pZCBpb3BvcnRfc2V0X2EyMChpbnQgZW5hYmxlKTsKK2ludCBpb3BvcnRfZ2V0X2EyMCh2b2lkKTsKKworLyogYWNwaS5jICovCitleHRlcm4gaW50IGFjcGlfZW5hYmxlZDsKK2V4dGVybiBjaGFyICphY3BpX3RhYmxlczsKK2V4dGVybiBzaXplX3QgYWNwaV90YWJsZXNfbGVuOworCitpMmNfYnVzICpwaWl4NF9wbV9pbml0KFBDSUJ1cyAqYnVzLCBpbnQgZGV2Zm4sIHVpbnQzMl90IHNtYl9pb19iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBxZW11X2lycSBzY2lfaXJxKTsKK3ZvaWQgcGlpeDRfc21idXNfcmVnaXN0ZXJfZGV2aWNlKFNNQnVzRGV2aWNlICpkZXYsIHVpbnQ4X3QgYWRkcik7Cit2b2lkIGFjcGlfYmlvc19pbml0KHZvaWQpOworaW50IGFjcGlfdGFibGVfYWRkKGNvbnN0IGNoYXIgKnRhYmxlX2Rlc2MpOworCisvKiBocGV0LmMgKi8KK2V4dGVybiBpbnQgbm9faHBldDsKKworLyogcGNzcGsuYyAqLwordm9pZCBwY3Nwa19pbml0KFBJVFN0YXRlICopOworaW50IHBjc3BrX2F1ZGlvX2luaXQocWVtdV9pcnEgKnBpYyk7CisKKy8qIHBpaXhfcGNpLmMgKi8KK1BDSUJ1cyAqaTQ0MGZ4X2luaXQoUENJRGV2aWNlICoqcGk0NDBmeF9zdGF0ZSwgcWVtdV9pcnEgKnBpYyk7Cit2b2lkIGk0NDBmeF9zZXRfc21tKFBDSURldmljZSAqZCwgaW50IHZhbCk7CitpbnQgcGlpeDNfaW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuKTsKK3ZvaWQgaTQ0MGZ4X2luaXRfbWVtb3J5X21hcHBpbmdzKFBDSURldmljZSAqZCk7CisKK2V4dGVybiBQQ0lEZXZpY2UgKnBpaXg0X2RldjsKK2ludCBwaWl4NF9pbml0KFBDSUJ1cyAqYnVzLCBpbnQgZGV2Zm4pOworCisvKiB2Z2EuYyAqLworZW51bSB2Z2FfcmV0cmFjZV9tZXRob2QgeworICAgIFZHQV9SRVRSQUNFX0RVTUIsCisgICAgVkdBX1JFVFJBQ0VfUFJFQ0lTRQorfTsKKworZXh0ZXJuIGVudW0gdmdhX3JldHJhY2VfbWV0aG9kIHZnYV9yZXRyYWNlX21ldGhvZDsKKworaW50IGlzYV92Z2FfaW5pdCh2b2lkKTsKK2ludCBwY2lfdmdhX2luaXQoUENJQnVzICpidXMsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmdhX2Jpb3Nfb2Zmc2V0LCBpbnQgdmdhX2Jpb3Nfc2l6ZSk7CitpbnQgaXNhX3ZnYV9tbV9pbml0KGh3YWRkciB2cmFtX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgIGh3YWRkciBjdHJsX2Jhc2UsIGludCBpdF9zaGlmdCk7CisKKy8qIGNpcnJ1c192Z2EuYyAqLwordm9pZCBwY2lfY2lycnVzX3ZnYV9pbml0KFBDSUJ1cyAqYnVzKTsKK3ZvaWQgaXNhX2NpcnJ1c192Z2FfaW5pdCh2b2lkKTsKKworLyogaWRlLmMgKi8KK3ZvaWQgaXNhX2lkZV9pbml0KGludCBpb2Jhc2UsIGludCBpb2Jhc2UyLCBxZW11X2lycSBpcnEsCisgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlclN0YXRlICpoZDAsIEJsb2NrRHJpdmVyU3RhdGUgKmhkMSk7Cit2b2lkIHBjaV9jbWQ2NDZfaWRlX2luaXQoUENJQnVzICpidXMsIEJsb2NrRHJpdmVyU3RhdGUgKipoZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vjb25kYXJ5X2lkZV9lbmFibGVkKTsKK3ZvaWQgcGNpX3BpaXgzX2lkZV9pbml0KFBDSUJ1cyAqYnVzLCBCbG9ja0RyaXZlclN0YXRlICoqaGRfdGFibGUsIGludCBkZXZmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfaXJxICpwaWMpOwordm9pZCBwY2lfcGlpeDRfaWRlX2luaXQoUENJQnVzICpidXMsIEJsb2NrRHJpdmVyU3RhdGUgKipoZF90YWJsZSwgaW50IGRldmZuLAorICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9pcnEgKnBpYyk7CisKKy8qIG5lMjAwMC5jICovCisKK3ZvaWQgaXNhX25lMjAwMF9pbml0KGludCBiYXNlLCBxZW11X2lycSBpcnEsIE5JQ0luZm8gKm5kKTsKKworaW50IGNwdV9pc19ic3AoQ1BVT2xkU3RhdGUgKmVudik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pMzg2L3NtYmlvcy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2kzODYvc21iaW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1MTY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pMzg2L3NtYmlvcy5oCkBAIC0wLDAgKzEsMTYyIEBACisjaWZuZGVmIFFFTVVfU01CSU9TX0gKKyNkZWZpbmUgUUVNVV9TTUJJT1NfSAorLyoKKyAqIFNNQklPUyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogQXV0aG9yczoKKyAqICBBbGV4IFdpbGxpYW1zb24gPGFsZXgud2lsbGlhbXNvbkBocC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCitpbnQgc21iaW9zX2VudHJ5X2FkZChjb25zdCBjaGFyICp0KTsKK3ZvaWQgc21iaW9zX2FkZF9maWVsZChpbnQgdHlwZSwgaW50IG9mZnNldCwgaW50IGxlbiwgdm9pZCAqZGF0YSk7Cit1aW50OF90ICpzbWJpb3NfZ2V0X3RhYmxlKHNpemVfdCAqbGVuZ3RoKTsKKworLyoKKyAqIFNNQklPUyBzcGVjIGRlZmluZWQgdGFibGVzCisgKi8KKworLyogVGhpcyBnb2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgU01CSU9TIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciB7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgIHVpbnQxNl90IGhhbmRsZTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBTTUJJT1MgdHlwZSAwIC0gQklPUyBJbmZvcm1hdGlvbiAqLworc3RydWN0IHNtYmlvc190eXBlXzAgeworICAgIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciBoZWFkZXI7CisgICAgdWludDhfdCB2ZW5kb3Jfc3RyOworICAgIHVpbnQ4X3QgYmlvc192ZXJzaW9uX3N0cjsKKyAgICB1aW50MTZfdCBiaW9zX3N0YXJ0aW5nX2FkZHJlc3Nfc2VnbWVudDsKKyAgICB1aW50OF90IGJpb3NfcmVsZWFzZV9kYXRlX3N0cjsKKyAgICB1aW50OF90IGJpb3Nfcm9tX3NpemU7CisgICAgdWludDhfdCBiaW9zX2NoYXJhY3RlcmlzdGljc1s4XTsKKyAgICB1aW50OF90IGJpb3NfY2hhcmFjdGVyaXN0aWNzX2V4dGVuc2lvbl9ieXRlc1syXTsKKyAgICB1aW50OF90IHN5c3RlbV9iaW9zX21ham9yX3JlbGVhc2U7CisgICAgdWludDhfdCBzeXN0ZW1fYmlvc19taW5vcl9yZWxlYXNlOworICAgIHVpbnQ4X3QgZW1iZWRkZWRfY29udHJvbGxlcl9tYWpvcl9yZWxlYXNlOworICAgIHVpbnQ4X3QgZW1iZWRkZWRfY29udHJvbGxlcl9taW5vcl9yZWxlYXNlOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIFNNQklPUyB0eXBlIDEgLSBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KK3N0cnVjdCBzbWJpb3NfdHlwZV8xIHsKKyAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZV9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3QgbWFudWZhY3R1cmVyX3N0cjsKKyAgICB1aW50OF90IHByb2R1Y3RfbmFtZV9zdHI7CisgICAgdWludDhfdCB2ZXJzaW9uX3N0cjsKKyAgICB1aW50OF90IHNlcmlhbF9udW1iZXJfc3RyOworICAgIHVpbnQ4X3QgdXVpZFsxNl07CisgICAgdWludDhfdCB3YWtlX3VwX3R5cGU7CisgICAgdWludDhfdCBza3VfbnVtYmVyX3N0cjsKKyAgICB1aW50OF90IGZhbWlseV9zdHI7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogU01CSU9TIHR5cGUgMyAtIFN5c3RlbSBFbmNsb3N1cmUgKHYyLjMpICovCitzdHJ1Y3Qgc21iaW9zX3R5cGVfMyB7CisgICAgc3RydWN0IHNtYmlvc19zdHJ1Y3R1cmVfaGVhZGVyIGhlYWRlcjsKKyAgICB1aW50OF90IG1hbnVmYWN0dXJlcl9zdHI7CisgICAgdWludDhfdCB0eXBlOworICAgIHVpbnQ4X3QgdmVyc2lvbl9zdHI7CisgICAgdWludDhfdCBzZXJpYWxfbnVtYmVyX3N0cjsKKyAgICB1aW50OF90IGFzc2V0X3RhZ19udW1iZXJfc3RyOworICAgIHVpbnQ4X3QgYm9vdF91cF9zdGF0ZTsKKyAgICB1aW50OF90IHBvd2VyX3N1cHBseV9zdGF0ZTsKKyAgICB1aW50OF90IHRoZXJtYWxfc3RhdGU7CisgICAgdWludDhfdCBzZWN1cml0eV9zdGF0dXM7CisgICAgdWludDMyX3Qgb2VtX2RlZmluZWQ7CisgICAgdWludDhfdCBoZWlnaHQ7CisgICAgdWludDhfdCBudW1iZXJfb2ZfcG93ZXJfY29yZHM7CisgICAgdWludDhfdCBjb250YWluZWRfZWxlbWVudF9jb3VudDsKKyAgICAvLyBjb250YWluZWQgZWxlbWVudHMgZm9sbG93Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogU01CSU9TIHR5cGUgNCAtIFByb2Nlc3NvciBJbmZvcm1hdGlvbiAodjIuMCkgKi8KK3N0cnVjdCBzbWJpb3NfdHlwZV80IHsKKyAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZV9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3Qgc29ja2V0X2Rlc2lnbmF0aW9uX3N0cjsKKyAgICB1aW50OF90IHByb2Nlc3Nvcl90eXBlOworICAgIHVpbnQ4X3QgcHJvY2Vzc29yX2ZhbWlseTsKKyAgICB1aW50OF90IHByb2Nlc3Nvcl9tYW51ZmFjdHVyZXJfc3RyOworICAgIHVpbnQzMl90IHByb2Nlc3Nvcl9pZFsyXTsKKyAgICB1aW50OF90IHByb2Nlc3Nvcl92ZXJzaW9uX3N0cjsKKyAgICB1aW50OF90IHZvbHRhZ2U7CisgICAgdWludDE2X3QgZXh0ZXJuYWxfY2xvY2s7CisgICAgdWludDE2X3QgbWF4X3NwZWVkOworICAgIHVpbnQxNl90IGN1cnJlbnRfc3BlZWQ7CisgICAgdWludDhfdCBzdGF0dXM7CisgICAgdWludDhfdCBwcm9jZXNzb3JfdXBncmFkZTsKKyAgICB1aW50MTZfdCBsMV9jYWNoZV9oYW5kbGU7CisgICAgdWludDE2X3QgbDJfY2FjaGVfaGFuZGxlOworICAgIHVpbnQxNl90IGwzX2NhY2hlX2hhbmRsZTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBTTUJJT1MgdHlwZSAxNiAtIFBoeXNpY2FsIE1lbW9yeSBBcnJheQorICogICBBc3NvY2lhdGVkIHdpdGggb25lIHR5cGUgMTcgKE1lbW9yeSBEZXZpY2UpLgorICovCitzdHJ1Y3Qgc21iaW9zX3R5cGVfMTYgeworICAgIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciBoZWFkZXI7CisgICAgdWludDhfdCBsb2NhdGlvbjsKKyAgICB1aW50OF90IHVzZTsKKyAgICB1aW50OF90IGVycm9yX2NvcnJlY3Rpb247CisgICAgdWludDMyX3QgbWF4aW11bV9jYXBhY2l0eTsKKyAgICB1aW50MTZfdCBtZW1vcnlfZXJyb3JfaW5mb3JtYXRpb25faGFuZGxlOworICAgIHVpbnQxNl90IG51bWJlcl9vZl9tZW1vcnlfZGV2aWNlczsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworLyogU01CSU9TIHR5cGUgMTcgLSBNZW1vcnkgRGV2aWNlCisgKiAgIEFzc29jaWF0ZWQgd2l0aCBvbmUgdHlwZSAxOQorICovCitzdHJ1Y3Qgc21iaW9zX3R5cGVfMTcgeworICAgIHN0cnVjdCBzbWJpb3Nfc3RydWN0dXJlX2hlYWRlciBoZWFkZXI7CisgICAgdWludDE2X3QgcGh5c2ljYWxfbWVtb3J5X2FycmF5X2hhbmRsZTsKKyAgICB1aW50MTZfdCBtZW1vcnlfZXJyb3JfaW5mb3JtYXRpb25faGFuZGxlOworICAgIHVpbnQxNl90IHRvdGFsX3dpZHRoOworICAgIHVpbnQxNl90IGRhdGFfd2lkdGg7CisgICAgdWludDE2X3Qgc2l6ZTsKKyAgICB1aW50OF90IGZvcm1fZmFjdG9yOworICAgIHVpbnQ4X3QgZGV2aWNlX3NldDsKKyAgICB1aW50OF90IGRldmljZV9sb2NhdG9yX3N0cjsKKyAgICB1aW50OF90IGJhbmtfbG9jYXRvcl9zdHI7CisgICAgdWludDhfdCBtZW1vcnlfdHlwZTsKKyAgICB1aW50MTZfdCB0eXBlX2RldGFpbDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBTTUJJT1MgdHlwZSAxOSAtIE1lbW9yeSBBcnJheSBNYXBwZWQgQWRkcmVzcyAqLworc3RydWN0IHNtYmlvc190eXBlXzE5IHsKKyAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZV9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQzMl90IHN0YXJ0aW5nX2FkZHJlc3M7CisgICAgdWludDMyX3QgZW5kaW5nX2FkZHJlc3M7CisgICAgdWludDE2X3QgbWVtb3J5X2FycmF5X2hhbmRsZTsKKyAgICB1aW50OF90IHBhcnRpdGlvbl93aWR0aDsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBTTUJJT1MgdHlwZSAyMCAtIE1lbW9yeSBEZXZpY2UgTWFwcGVkIEFkZHJlc3MgKi8KK3N0cnVjdCBzbWJpb3NfdHlwZV8yMCB7CisgICAgc3RydWN0IHNtYmlvc19zdHJ1Y3R1cmVfaGVhZGVyIGhlYWRlcjsKKyAgICB1aW50MzJfdCBzdGFydGluZ19hZGRyZXNzOworICAgIHVpbnQzMl90IGVuZGluZ19hZGRyZXNzOworICAgIHVpbnQxNl90IG1lbW9yeV9kZXZpY2VfaGFuZGxlOworICAgIHVpbnQxNl90IG1lbW9yeV9hcnJheV9tYXBwZWRfYWRkcmVzc19oYW5kbGU7CisgICAgdWludDhfdCBwYXJ0aXRpb25fcm93X3Bvc2l0aW9uOworICAgIHVpbnQ4X3QgaW50ZXJsZWF2ZV9wb3NpdGlvbjsKKyAgICB1aW50OF90IGludGVybGVhdmVkX2RhdGFfZGVwdGg7Cit9IF9fYXR0cmlidXRlX18oKF9fcGFja2VkX18pKTsKKworLyogU01CSU9TIHR5cGUgMzIgLSBTeXN0ZW0gQm9vdCBJbmZvcm1hdGlvbiAqLworc3RydWN0IHNtYmlvc190eXBlXzMyIHsKKyAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZV9oZWFkZXIgaGVhZGVyOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNl07CisgICAgdWludDhfdCBib290X3N0YXR1czsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKiBTTUJJT1MgdHlwZSAxMjcgLS0gRW5kLW9mLXRhYmxlICovCitzdHJ1Y3Qgc21iaW9zX3R5cGVfMTI3IHsKKyAgICBzdHJ1Y3Qgc21iaW9zX3N0cnVjdHVyZV9oZWFkZXIgaGVhZGVyOworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKyNlbmRpZiAvKlFFTVVfU01CSU9TX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pbnB1dC9wczIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pbnB1dC9wczIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmE0MjMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2lucHV0L3BzMi5oCkBAIC0wLDAgKzEsOSBAQAorLyogcHMyLmMgKi8KK3ZvaWQgKnBzMl9rYmRfaW5pdCh2b2lkICgqdXBkYXRlX2lycSkodm9pZCAqLCBpbnQpLCB2b2lkICp1cGRhdGVfYXJnKTsKK3ZvaWQgKnBzMl9tb3VzZV9pbml0KHZvaWQgKCp1cGRhdGVfaXJxKSh2b2lkICosIGludCksIHZvaWQgKnVwZGF0ZV9hcmcpOwordm9pZCBwczJfd3JpdGVfbW91c2Uodm9pZCAqLCBpbnQgdmFsKTsKK3ZvaWQgcHMyX3dyaXRlX2tleWJvYXJkKHZvaWQgKiwgaW50IHZhbCk7Cit1aW50MzJfdCBwczJfcmVhZF9kYXRhKHZvaWQgKik7Cit2b2lkIHBzMl9xdWV1ZSh2b2lkICosIGludCBiKTsKK3ZvaWQgcHMyX2tleWJvYXJkX3NldF90cmFuc2xhdGlvbih2b2lkICpvcGFxdWUsIGludCBtb2RlKTsKK3ZvaWQgcHMyX21vdXNlX2Zha2VfZXZlbnQodm9pZCAqb3BhcXVlKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pcnEuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGFhZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2lycS5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgUUVNVV9JUlFfSAorI2RlZmluZSBRRU1VX0lSUV9ICisKKy8qIEdlbmVyaWMgSVJRL0dQSU8gcGluIGluZnJhc3RydWN0dXJlLiAgKi8KKworLyogRklYTUU6IFJtb3ZlIG9uZSBvZiB0aGVzZS4gICovCit0eXBlZGVmIHZvaWQgKCpxZW11X2lycV9oYW5kbGVyKSh2b2lkICpvcGFxdWUsIGludCBuLCBpbnQgbGV2ZWwpOwordHlwZWRlZiB2b2lkIFNldElSUUZ1bmModm9pZCAqb3BhcXVlLCBpbnQgaXJxX251bSwgaW50IGxldmVsKTsKKwordm9pZCBxZW11X3NldF9pcnEocWVtdV9pcnEgaXJxLCBpbnQgbGV2ZWwpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9pcnFfcmFpc2UocWVtdV9pcnEgaXJxKQoreworICAgIHFlbXVfc2V0X2lycShpcnEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9pcnFfbG93ZXIocWVtdV9pcnEgaXJxKQoreworICAgIHFlbXVfc2V0X2lycShpcnEsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9pcnFfcHVsc2UocWVtdV9pcnEgaXJxKQoreworICAgIHFlbXVfc2V0X2lycShpcnEsIDEpOworICAgIHFlbXVfc2V0X2lycShpcnEsIDApOworfQorCisvKiBSZXR1cm5zIGFuIGFycmF5IG9mIE4gSVJRcy4gICovCitxZW11X2lycSAqcWVtdV9hbGxvY2F0ZV9pcnFzKHFlbXVfaXJxX2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqb3BhcXVlLCBpbnQgbik7Cit2b2lkIHFlbXVfZnJlZV9pcnFzKHFlbXVfaXJxICpzKTsKKworLyogUmV0dXJucyBhIG5ldyBJUlEgd2l0aCBvcHBvc2l0ZSBwb2xhcml0eS4gICovCitxZW11X2lycSBxZW11X2lycV9pbnZlcnQocWVtdV9pcnEgaXJxKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvaXNhL2lzYS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2lzYS9pc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2YwNGQwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2lzYS9pc2EuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIEhXX0lTQV9ICisjZGVmaW5lIEhXX0lTQV9ICisKKy8qIElTQSBidXMgKi8KKworI2luY2x1ZGUgImV4ZWMvaHdhZGRyLmgiCisjaW5jbHVkZSAiZXhlYy9pb3BvcnQuaCIKKyNpbmNsdWRlICJody9xZGV2LmgiCisKK2V4dGVybiBod2FkZHIgaXNhX21lbV9iYXNlOworCit2b2lkIGlzYV9tbWlvX2luaXQoaHdhZGRyIGJhc2UsIGh3YWRkciBzaXplKTsKKworLyogZG1hLmMgKi8KK2ludCBETUFfZ2V0X2NoYW5uZWxfbW9kZSAoaW50IG5jaGFuKTsKK2ludCBETUFfcmVhZF9tZW1vcnkgKGludCBuY2hhbiwgdm9pZCAqYnVmLCBpbnQgcG9zLCBpbnQgc2l6ZSk7CitpbnQgRE1BX3dyaXRlX21lbW9yeSAoaW50IG5jaGFuLCB2b2lkICpidWYsIGludCBwb3MsIGludCBzaXplKTsKK3ZvaWQgRE1BX2hvbGRfRFJFUSAoaW50IG5jaGFuKTsKK3ZvaWQgRE1BX3JlbGVhc2VfRFJFUSAoaW50IG5jaGFuKTsKK3ZvaWQgRE1BX3NjaGVkdWxlKGludCBuY2hhbik7Cit2b2lkIERNQV9pbml0IChpbnQgaGlnaF9wYWdlX2VuYWJsZSk7Cit2b2lkIERNQV9yZWdpc3Rlcl9jaGFubmVsIChpbnQgbmNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfdHJhbnNmZXJfaGFuZGxlciB0cmFuc2Zlcl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2xvYWRlci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L2xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzVlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbG9hZGVyLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmbmRlZiBMT0FERVJfSAorI2RlZmluZSBMT0FERVJfSAorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJody9udnJhbS9md19jZmcuaCIKKworLyogbG9hZGVyLmMgKi8KK2ludCBnZXRfaW1hZ2Vfc2l6ZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpbnQgbG9hZF9pbWFnZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdWludDhfdCAqYWRkcik7IC8qIGRlcHJlY2F0ZWQgKi8KK2ludCBsb2FkX2ltYWdlX3RhcmdwaHlzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBod2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtYXhfc3opOworaW50IGxvYWRfZWxmKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQ2NF90IGFkZHJlc3Nfb2Zmc2V0LAorICAgICAgICAgICAgIHVpbnQ2NF90ICpwZW50cnksIHVpbnQ2NF90ICpsb3dhZGRyLCB1aW50NjRfdCAqaGlnaGFkZHIpOworaW50IGxvYWRfYW91dChjb25zdCBjaGFyICpmaWxlbmFtZSwgaHdhZGRyIGFkZHIsIGludCBtYXhfc3opOworaW50IGxvYWRfdWltYWdlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBod2FkZHIgKmVwLCB0YXJnZXRfdWxvbmcgKmxvYWRhZGRyLAorICAgICAgICAgICAgICAgIGludCAqaXNfbGludXgpOworCisvKioKKyAqIGxvYWRfcmFtZGlzazoKKyAqIEBmaWxlbmFtZTogUGF0aCB0byB0aGUgcmFtZGlzayBpbWFnZQorICogQGFkZHI6IE1lbW9yeSBhZGRyZXNzIHRvIGxvYWQgdGhlIHJhbWRpc2sgdG8KKyAqIEBtYXhfc3o6IE1heGltdW0gYWxsb3dlZCByYW1kaXNrIHNpemUgKGZvciBub24tdS1ib290IHJhbWRpc2tzKQorICoKKyAqIExvYWQgYSByYW1kaXNrIGltYWdlIHdpdGggVS1Cb290IGhlYWRlciB0byB0aGUgc3BlY2lmaWVkIG1lbW9yeQorICogYWRkcmVzcy4KKyAqCisgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsb2FkZWQgaW1hZ2Ugb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgbG9hZF9yYW1kaXNrKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBod2FkZHIgYWRkciwgdWludDY0X3QgbWF4X3N6KTsKKworaW50IGZyZWFkX3RhcmdwaHlzX29rKGh3YWRkciBkc3RfYWRkciwgc2l6ZV90IG5ieXRlcywgRklMRSAqZik7CisKK3NzaXplX3QgcmVhZF90YXJncGh5cyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaHdhZGRyIGRzdF9hZGRyLCBzaXplX3QgbmJ5dGVzKTsKK3ZvaWQgcHN0cmNweV90YXJncGh5cyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBkZXN0LCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc291cmNlKTsKKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLy8gVE9ETyhkaWdpdCkKK2V4dGVybiBib29sIHJvbV9maWxlX2luX3JhbTsKKworaW50IHJvbV9hZGRfZmlsZShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmd19kaXIsCisgICAgICAgICAgICAgICAgIGh3YWRkciBhZGRyLCBpbnQzMl90IGJvb3RpbmRleCk7Cit2b2lkICpyb21fYWRkX2Jsb2IoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYmxvYiwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICBod2FkZHIgYWRkciwgY29uc3QgY2hhciAqZndfZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgIEZXQ2ZnUmVhZENhbGxiYWNrIGZ3X2NhbGxiYWNrLCB2b2lkICpjYWxsYmFja19vcGFxdWUpOworaW50IHJvbV9hZGRfZWxmX3Byb2dyYW0oY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJvbXNpemUsIGh3YWRkciBhZGRyKTsKK2ludCByb21fbG9hZF9hbGwodm9pZCk7Cit2b2lkIHJvbV9sb2FkX2RvbmUodm9pZCk7Cit2b2lkIHJvbV9zZXRfZncoRldDZmdTdGF0ZSAqZik7CitpbnQgcm9tX2NvcHkodWludDhfdCAqZGVzdCwgaHdhZGRyIGFkZHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgKnJvbV9wdHIoaHdhZGRyIGFkZHIpOwordm9pZCBkb19pbmZvX3JvbXMoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QpOworCisjZGVmaW5lIHJvbV9hZGRfZmlsZV9maXhlZChfZiwgX2EsIF9pKSAgICAgICAgICBcCisgICAgcm9tX2FkZF9maWxlKF9mLCBOVUxMLCBfYSwgX2kpCisjZGVmaW5lIHJvbV9hZGRfYmxvYl9maXhlZChfZiwgX2IsIF9sLCBfYSkgICAgICBcCisgICAgcm9tX2FkZF9ibG9iKF9mLCBfYiwgX2wsIF9hLCBOVUxMLCBOVUxMLCBOVUxMKQorCisjZGVmaW5lIFBDX1JPTV9NSU5fVkdBICAgICAweGMwMDAwCisjZGVmaW5lIFBDX1JPTV9NSU5fT1BUSU9OICAweGM4MDAwCisjZGVmaW5lIFBDX1JPTV9NQVggICAgICAgICAweGUwMDAwCisjZGVmaW5lIFBDX1JPTV9BTElHTiAgICAgICAweDgwMAorI2RlZmluZSBQQ19ST01fU0laRSAgICAgICAgKFBDX1JPTV9NQVggLSBQQ19ST01fTUlOX1ZHQSkKKworaW50IHJvbV9hZGRfdmdhKGNvbnN0IGNoYXIgKmZpbGUpOworaW50IHJvbV9hZGRfb3B0aW9uKGNvbnN0IGNoYXIgKmZpbGUsIGludDMyX3QgYm9vdGluZGV4KTsKKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L21pcHMvYmlvcy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L21pcHMvYmlvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Yjg4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbWlwcy9iaW9zLmgKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAiY3B1LmgiCisKKyNkZWZpbmUgQklPU19TSVpFICg0ICogMTAyNCAqIDEwMjQpCisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorI2RlZmluZSBCSU9TX0ZJTEVOQU1FICJtaXBzX2Jpb3MuYmluIgorI2Vsc2UKKyNkZWZpbmUgQklPU19GSUxFTkFNRSAibWlwc2VsX2Jpb3MuYmluIgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbWlwcy9taXBzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbWlwcy9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcwOTRlYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9taXBzL21pcHMuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIEhXX01JUFNfSAorI2RlZmluZSBIV19NSVBTX0gKKy8qIERlZmluaXRpb25zIGZvciBtaXBzIGJvYXJkIGVtdWxhdGlvbi4gICovCisKKy8qIGd0NjR4eHguYyAqLworUENJQnVzICpwY2lfZ3Q2NDEyMF9pbml0KHFlbXVfaXJxICpwaWMpOworCisvKiBkczEyMjV5LmMgKi8KK3ZvaWQgKmRzMTIyNXlfaW5pdChod2FkZHIgbWVtX2Jhc2UsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyogZzM2NGZiLmMgKi8KK2ludCBnMzY0ZmJfbW1faW5pdChod2FkZHIgdnJhbV9iYXNlLAorICAgICAgICAgICAgICAgICAgIGh3YWRkciBjdHJsX2Jhc2UsIGludCBpdF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICBxZW11X2lycSBpcnEpOworCisvKiBtaXBzbmV0LmMgKi8KK3ZvaWQgbWlwc25ldF9pbml0KGludCBiYXNlLCBxZW11X2lycSBpcnEsIE5JQ0luZm8gKm5kKTsKKworLyogamF6el9sZWQuYyAqLworZXh0ZXJuIHZvaWQgamF6el9sZWRfaW5pdChod2FkZHIgYmFzZSk7CisKKy8qIG1pcHNfaW50LmMgKi8KK2V4dGVybiB2b2lkIGNwdV9taXBzX2lycV9pbml0X2NwdShDUFVPbGRTdGF0ZSAqZW52KTsKKworLyogbWlwc190aW1lci5jICovCitleHRlcm4gdm9pZCBjcHVfbWlwc19jbG9ja19pbml0KENQVU9sZFN0YXRlICopOworCisvKiByYzQwMzAuYyAqLwordHlwZWRlZiBzdHJ1Y3QgcmM0MDMwRE1BU3RhdGUgKnJjNDAzMF9kbWE7Cit2b2lkIHJjNDAzMF9kbWFfbWVtb3J5X3J3KHZvaWQgKm9wYXF1ZSwgaHdhZGRyIGFkZHIsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbiwgaW50IGlzX3dyaXRlKTsKK3ZvaWQgcmM0MDMwX2RtYV9yZWFkKHZvaWQgKmRtYSwgdWludDhfdCAqYnVmLCBpbnQgbGVuKTsKK3ZvaWQgcmM0MDMwX2RtYV93cml0ZSh2b2lkICpkbWEsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CisKK3ZvaWQgKnJjNDAzMF9pbml0KHFlbXVfaXJxIHRpbWVyLCBxZW11X2lycSBqYXp6X2J1cywKKyAgICAgICAgICAgICAgICAgIHFlbXVfaXJxICoqaXJxcywgcmM0MDMwX2RtYSAqKmRtYXMpOworCisvKiBkcDgzOTN4LmMgKi8KK3ZvaWQgZHA4MzkzMl9pbml0KE5JQ0luZm8gKm5kLCBod2FkZHIgYmFzZSwgaW50IGl0X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgcWVtdV9pcnEgaXJxLCB2b2lkKiBtZW1fb3BhcXVlLAorICAgICAgICAgICAgICAgICAgdm9pZCAoKm1lbW9yeV9ydykodm9pZCAqb3BhcXVlLCBod2FkZHIgYWRkciwgdWludDhfdCAqYnVmLCBpbnQgbGVuLCBpbnQgaXNfd3JpdGUpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbW1jLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbW1jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlM2VhOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9tbWMuaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIEhlYWRlciBmb3IgTXVsdGlNZWRpYUNhcmQgKE1NQykKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICoKKyAqIFVzZSBjb25zaXN0ZW50IHdpdGggdGhlIEdOVSBHUEwgaXMgcGVybWl0dGVkLAorICogcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMKKyAqIHByZXNlcnZlZCBpbiBpdHMgZW50aXJldHkgaW4gYWxsIGNvcGllcyBhbmQgZGVyaXZlZCB3b3Jrcy4KKyAqCisgKiBIRVdMRVRULVBBQ0tBUkQgQ09NUEFOWSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTRUQgT1IgSU1QTElFRCwKKyAqIEFTIFRPIFRIRSBVU0VGVUxORVNTIE9SIENPUlJFQ1RORVNTIE9GIFRISVMgQ09ERSBPUiBJVFMKKyAqIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogTWFueSB0aGFua3MgdG8gQWxlc3NhbmRybyBSdWJpbmkgYW5kIEpvbmF0aGFuIENvcmJldCEKKyAqCisgKiBCYXNlZCBzdHJvbmdseSBvbiBjb2RlIGJ5OgorICoKKyAqIEF1dGhvcjogWW9uZy1pTCBKb2ggPHRvbGtpZW5AbWl6aS5jb20+CisgKiBEYXRlICA6ICREYXRlOiAyMDAyLzA2LzE4IDEyOjM3OjMwICQKKyAqCisgKiBBdXRob3I6ICBBbmRyZXcgQ2hyaXN0aWFuCisgKiAgICAgICAgICAxNSBNYXkgMjAwMgorICovCisKKyNpZm5kZWYgTU1DX01NQ19ICisjZGVmaW5lIE1NQ19NTUNfSAorCisvKiBTdGFuZGFyZCBNTUMgY29tbWFuZHMgKDQuMSkgICAgICAgICAgIHR5cGUgIGFyZ3VtZW50ICAgICByZXNwb25zZSAqLworICAgLyogY2xhc3MgMSAqLworI2RlZmluZQlNTUNfR09fSURMRV9TVEFURSAgICAgICAgIDAgICAvKiBiYyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTU1DX1NFTkRfT1BfQ09ORCAgICAgICAgICAxICAgLyogYmNyICBbMzE6MF0gT0NSICAgICAgICAgUjMgICovCisjZGVmaW5lIE1NQ19BTExfU0VORF9DSUQgICAgICAgICAgMiAgIC8qIGJjciAgICAgICAgICAgICAgICAgICAgIFIyICAqLworI2RlZmluZSBNTUNfU0VUX1JFTEFUSVZFX0FERFIgICAgIDMgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMSAgKi8KKyNkZWZpbmUgTU1DX1NFVF9EU1IgICAgICAgICAgICAgICA0ICAgLyogYmMgICBbMzE6MTZdIFJDQSAgICAgICAgICAgICovCisjZGVmaW5lIE1NQ19TV0lUQ0ggICAgICAgICAgICAgICAgNiAgIC8qIGFjICAgWzMxOjBdIFNlZSBiZWxvdyAgIFIxYiAqLworI2RlZmluZSBNTUNfU0VMRUNUX0NBUkQgICAgICAgICAgIDcgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMSAgKi8KKyNkZWZpbmUgTU1DX1NFTkRfRVhUX0NTRCAgICAgICAgICA4ICAgLyogYWR0YyAgICAgICAgICAgICAgICAgICAgUjEgICovCisjZGVmaW5lIE1NQ19TRU5EX0NTRCAgICAgICAgICAgICAgOSAgIC8qIGFjICAgWzMxOjE2XSBSQ0EgICAgICAgIFIyICAqLworI2RlZmluZSBNTUNfU0VORF9DSUQgICAgICAgICAgICAgMTAgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMiAgKi8KKyNkZWZpbmUgTU1DX1JFQURfREFUX1VOVElMX1NUT1AgIDExICAgLyogYWR0YyBbMzE6MF0gZGFkciAgICAgICAgUjEgICovCisjZGVmaW5lIE1NQ19TVE9QX1RSQU5TTUlTU0lPTiAgICAxMiAgIC8qIGFjICAgICAgICAgICAgICAgICAgICAgIFIxYiAqLworI2RlZmluZSBNTUNfU0VORF9TVEFUVVMJICAgICAgICAgMTMgICAvKiBhYyAgIFszMToxNl0gUkNBICAgICAgICBSMSAgKi8KKyNkZWZpbmUgTU1DX0dPX0lOQUNUSVZFX1NUQVRFICAgIDE1ICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgICAgICovCisKKyAgLyogY2xhc3MgMiAqLworI2RlZmluZSBNTUNfU0VUX0JMT0NLTEVOICAgICAgICAgMTYgICAvKiBhYyAgIFszMTowXSBibG9jayBsZW4gICBSMSAgKi8KKyNkZWZpbmUgTU1DX1JFQURfU0lOR0xFX0JMT0NLICAgIDE3ICAgLyogYWR0YyBbMzE6MF0gZGF0YSBhZGRyICAgUjEgICovCisjZGVmaW5lIE1NQ19SRUFEX01VTFRJUExFX0JMT0NLICAxOCAgIC8qIGFkdGMgWzMxOjBdIGRhdGEgYWRkciAgIFIxICAqLworCisgIC8qIGNsYXNzIDMgKi8KKyNkZWZpbmUgTU1DX1dSSVRFX0RBVF9VTlRJTF9TVE9QIDIwICAgLyogYWR0YyBbMzE6MF0gZGF0YSBhZGRyICAgUjEgICovCisKKyAgLyogY2xhc3MgNCAqLworI2RlZmluZSBNTUNfU0VUX0JMT0NLX0NPVU5UICAgICAgMjMgICAvKiBhZHRjIFszMTowXSBkYXRhIGFkZHIgICBSMSAgKi8KKyNkZWZpbmUgTU1DX1dSSVRFX0JMT0NLICAgICAgICAgIDI0ICAgLyogYWR0YyBbMzE6MF0gZGF0YSBhZGRyICAgUjEgICovCisjZGVmaW5lIE1NQ19XUklURV9NVUxUSVBMRV9CTE9DSyAyNSAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxICAqLworI2RlZmluZSBNTUNfUFJPR1JBTV9DSUQgICAgICAgICAgMjYgICAvKiBhZHRjICAgICAgICAgICAgICAgICAgICBSMSAgKi8KKyNkZWZpbmUgTU1DX1BST0dSQU1fQ1NEICAgICAgICAgIDI3ICAgLyogYWR0YyAgICAgICAgICAgICAgICAgICAgUjEgICovCisKKyAgLyogY2xhc3MgNiAqLworI2RlZmluZSBNTUNfU0VUX1dSSVRFX1BST1QgICAgICAgMjggICAvKiBhYyAgIFszMTowXSBkYXRhIGFkZHIgICBSMWIgKi8KKyNkZWZpbmUgTU1DX0NMUl9XUklURV9QUk9UICAgICAgIDI5ICAgLyogYWMgICBbMzE6MF0gZGF0YSBhZGRyICAgUjFiICovCisjZGVmaW5lIE1NQ19TRU5EX1dSSVRFX1BST1QgICAgICAzMCAgIC8qIGFkdGMgWzMxOjBdIHdwZGF0YSBhZGRyIFIxICAqLworCisgIC8qIGNsYXNzIDUgKi8KKyNkZWZpbmUgTU1DX0VSQVNFX0dST1VQX1NUQVJUICAgIDM1ICAgLyogYWMgICBbMzE6MF0gZGF0YSBhZGRyICAgUjEgICovCisjZGVmaW5lIE1NQ19FUkFTRV9HUk9VUF9FTkQgICAgICAzNiAgIC8qIGFjICAgWzMxOjBdIGRhdGEgYWRkciAgIFIxICAqLworI2RlZmluZSBNTUNfRVJBU0UgICAgICAgICAgICAgICAgMzggICAvKiBhYyAgICAgICAgICAgICAgICAgICAgICBSMWIgKi8KKworICAvKiBjbGFzcyA5ICovCisjZGVmaW5lIE1NQ19GQVNUX0lPICAgICAgICAgICAgICAzOSAgIC8qIGFjICAgPENvbXBsZXg+ICAgICAgICAgIFI0ICAqLworI2RlZmluZSBNTUNfR09fSVJRX1NUQVRFICAgICAgICAgNDAgICAvKiBiY3IgICAgICAgICAgICAgICAgICAgICBSNSAgKi8KKworICAvKiBjbGFzcyA3ICovCisjZGVmaW5lIE1NQ19MT0NLX1VOTE9DSyAgICAgICAgICA0MiAgIC8qIGFkdGMgICAgICAgICAgICAgICAgICAgIFIxYiAqLworCisgIC8qIGNsYXNzIDggKi8KKyNkZWZpbmUgTU1DX0FQUF9DTUQgICAgICAgICAgICAgIDU1ICAgLyogYWMgICBbMzE6MTZdIFJDQSAgICAgICAgUjEgICovCisjZGVmaW5lIE1NQ19HRU5fQ01EICAgICAgICAgICAgICA1NiAgIC8qIGFkdGMgWzBdIFJEL1dSICAgICAgICAgIFIxICAqLworCisvKgorICogTU1DX1NXSVRDSCBhcmd1bWVudCBmb3JtYXQ6CisgKgorICoJWzMxOjI2XSBBbHdheXMgMAorICoJWzI1OjI0XSBBY2Nlc3MgTW9kZQorICoJWzIzOjE2XSBMb2NhdGlvbiBvZiB0YXJnZXQgQnl0ZSBpbiBFWFRfQ1NECisgKglbMTU6MDhdIFZhbHVlIEJ5dGUKKyAqCVswNzowM10gQWx3YXlzIDAKKyAqCVswMjowMF0gQ29tbWFuZCBTZXQKKyAqLworCisvKgorICBNTUMgc3RhdHVzIGluIFIxCisgIFR5cGUKKyAgCWUgOiBlcnJvciBiaXQKKwlzIDogc3RhdHVzIGJpdAorCXIgOiBkZXRlY3RlZCBhbmQgc2V0IGZvciB0aGUgYWN0dWFsIGNvbW1hbmQgcmVzcG9uc2UKKwl4IDogZGV0ZWN0ZWQgYW5kIHNldCBkdXJpbmcgY29tbWFuZCBleGVjdXRpb24uIHRoZSBob3N0IG11c3QgcG9sbAorICAgICAgICAgICAgdGhlIGNhcmQgYnkgc2VuZGluZyBzdGF0dXMgY29tbWFuZCBpbiBvcmRlciB0byByZWFkIHRoZXNlIGJpdHMuCisgIENsZWFyIGNvbmRpdGlvbgorICAJYSA6IGFjY29yZGluZyB0byB0aGUgY2FyZCBzdGF0ZQorCWIgOiBhbHdheXMgcmVsYXRlZCB0byB0aGUgcHJldmlvdXMgY29tbWFuZC4gUmVjZXB0aW9uIG9mCisgICAgICAgICAgICBhIHZhbGlkIGNvbW1hbmQgd2lsbCBjbGVhciBpdCAod2l0aCBhIGRlbGF5IG9mIG9uZSBjb21tYW5kKQorCWMgOiBjbGVhciBieSByZWFkCisgKi8KKworI2RlZmluZSBSMV9PVVRfT0ZfUkFOR0UJCSgxIDw8IDMxKQkvKiBlciwgYyAqLworI2RlZmluZSBSMV9BRERSRVNTX0VSUk9SCSgxIDw8IDMwKQkvKiBlcngsIGMgKi8KKyNkZWZpbmUgUjFfQkxPQ0tfTEVOX0VSUk9SCSgxIDw8IDI5KQkvKiBlciwgYyAqLworI2RlZmluZSBSMV9FUkFTRV9TRVFfRVJST1IgICAgICAoMSA8PCAyOCkJLyogZXIsIGMgKi8KKyNkZWZpbmUgUjFfRVJBU0VfUEFSQU0JCSgxIDw8IDI3KQkvKiBleCwgYyAqLworI2RlZmluZSBSMV9XUF9WSU9MQVRJT04JCSgxIDw8IDI2KQkvKiBlcngsIGMgKi8KKyNkZWZpbmUgUjFfQ0FSRF9JU19MT0NLRUQJKDEgPDwgMjUpCS8qIHN4LCBhICovCisjZGVmaW5lIFIxX0xPQ0tfVU5MT0NLX0ZBSUxFRAkoMSA8PCAyNCkJLyogZXJ4LCBjICovCisjZGVmaW5lIFIxX0NPTV9DUkNfRVJST1IJKDEgPDwgMjMpCS8qIGVyLCBiICovCisjZGVmaW5lIFIxX0lMTEVHQUxfQ09NTUFORAkoMSA8PCAyMikJLyogZXIsIGIgKi8KKyNkZWZpbmUgUjFfQ0FSRF9FQ0NfRkFJTEVECSgxIDw8IDIxKQkvKiBleCwgYyAqLworI2RlZmluZSBSMV9DQ19FUlJPUgkJKDEgPDwgMjApCS8qIGVyeCwgYyAqLworI2RlZmluZSBSMV9FUlJPUgkJKDEgPDwgMTkpCS8qIGVyeCwgYyAqLworI2RlZmluZSBSMV9VTkRFUlJVTgkJKDEgPDwgMTgpCS8qIGV4LCBjICovCisjZGVmaW5lIFIxX09WRVJSVU4JCSgxIDw8IDE3KQkvKiBleCwgYyAqLworI2RlZmluZSBSMV9DSURfQ1NEX09WRVJXUklURQkoMSA8PCAxNikJLyogZXJ4LCBjLCBDSUQvQ1NEIG92ZXJ3cml0ZSAqLworI2RlZmluZSBSMV9XUF9FUkFTRV9TS0lQCSgxIDw8IDE1KQkvKiBzeCwgYyAqLworI2RlZmluZSBSMV9DQVJEX0VDQ19ESVNBQkxFRAkoMSA8PCAxNCkJLyogc3gsIGEgKi8KKyNkZWZpbmUgUjFfRVJBU0VfUkVTRVQJCSgxIDw8IDEzKQkvKiBzciwgYyAqLworI2RlZmluZSBSMV9TVEFUVVMoeCkgICAgICAgICAgICAoeCAmIDB4RkZGRkUwMDApCisjZGVmaW5lIFIxX0NVUlJFTlRfU1RBVEUoeCkgICAgCSgoeCAmIDB4MDAwMDFFMDApID4+IDkpCS8qIHN4LCBiICg0IGJpdHMpICovCisjZGVmaW5lIFIxX1JFQURZX0ZPUl9EQVRBCSgxIDw8IDgpCS8qIHN4LCBhICovCisjZGVmaW5lIFIxX0FQUF9DTUQJCSgxIDw8IDUpCS8qIHNyLCBjICovCisKKworLyoKKyAqIE9DUiBiaXRzIGFyZSBtb3N0bHkgaW4gaG9zdC5oCisgKi8KKyNkZWZpbmUgTU1DX0NBUkRfQlVTWQkweDgwMDAwMDAwCS8qIENhcmQgUG93ZXIgdXAgc3RhdHVzIGJpdCAqLworCisvKgorICogQ2FyZCBDb21tYW5kIENsYXNzZXMgKENDQykKKyAqLworI2RlZmluZSBDQ0NfQkFTSUMJCSgxPDwwKQkvKiAoMCkgQmFzaWMgcHJvdG9jb2wgZnVuY3Rpb25zICovCisJCQkJCS8qIChDTUQwLDEsMiwzLDQsNyw5LDEwLDEyLDEzLDE1KSAqLworI2RlZmluZSBDQ0NfU1RSRUFNX1JFQUQJCSgxPDwxKQkvKiAoMSkgU3RyZWFtIHJlYWQgY29tbWFuZHMgKi8KKwkJCQkJLyogKENNRDExKSAqLworI2RlZmluZSBDQ0NfQkxPQ0tfUkVBRAkJKDE8PDIpCS8qICgyKSBCbG9jayByZWFkIGNvbW1hbmRzICovCisJCQkJCS8qIChDTUQxNiwxNywxOCkgKi8KKyNkZWZpbmUgQ0NDX1NUUkVBTV9XUklURQkoMTw8MykJLyogKDMpIFN0cmVhbSB3cml0ZSBjb21tYW5kcyAqLworCQkJCQkvKiAoQ01EMjApICovCisjZGVmaW5lIENDQ19CTE9DS19XUklURQkJKDE8PDQpCS8qICg0KSBCbG9jayB3cml0ZSBjb21tYW5kcyAqLworCQkJCQkvKiAoQ01EMTYsMjQsMjUsMjYsMjcpICovCisjZGVmaW5lIENDQ19FUkFTRQkJKDE8PDUpCS8qICg1KSBBYmlsaXR5IHRvIGVyYXNlIGJsb2NrcyAqLworCQkJCQkvKiAoQ01EMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzkpICovCisjZGVmaW5lIENDQ19XUklURV9QUk9UCQkoMTw8NikJLyogKDYpIEFibGUgdG8gd3JpdGUgcHJvdGVjdCBibG9ja3MgKi8KKwkJCQkJLyogKENNRDI4LDI5LDMwKSAqLworI2RlZmluZSBDQ0NfTE9DS19DQVJECQkoMTw8NykJLyogKDcpIEFibGUgdG8gbG9jayBkb3duIGNhcmQgKi8KKwkJCQkJLyogKENNRDE2LENNRDQyKSAqLworI2RlZmluZSBDQ0NfQVBQX1NQRUMJCSgxPDw4KQkvKiAoOCkgQXBwbGljYXRpb24gc3BlY2lmaWMgKi8KKwkJCQkJLyogKENNRDU1LDU2LDU3LEFDTUQqKSAqLworI2RlZmluZSBDQ0NfSU9fTU9ERQkJKDE8PDkpCS8qICg5KSBJL08gbW9kZSAqLworCQkJCQkvKiAoQ01ENSwzOSw0MCw1Miw1MykgKi8KKyNkZWZpbmUgQ0NDX1NXSVRDSAkJKDE8PDEwKQkvKiAoMTApIEhpZ2ggc3BlZWQgc3dpdGNoICovCisJCQkJCS8qIChDTUQ2LDM0LDM1LDM2LDM3LDUwKSAqLworCQkJCQkvKiAoMTEpIFJlc2VydmVkICovCisJCQkJCS8qIChDTUQ/KSAqLworCisvKgorICogQ1NEIGZpZWxkIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBDU0RfU1RSVUNUX1ZFUl8xXzAgIDAgICAgICAgICAgIC8qIFZhbGlkIGZvciBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjAgLSAxLjIgKi8KKyNkZWZpbmUgQ1NEX1NUUlVDVF9WRVJfMV8xICAxICAgICAgICAgICAvKiBWYWxpZCBmb3Igc3lzdGVtIHNwZWNpZmljYXRpb24gMS40IC0gMi4yICovCisjZGVmaW5lIENTRF9TVFJVQ1RfVkVSXzFfMiAgMiAgICAgICAgICAgLyogVmFsaWQgZm9yIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDMuMSAtIDMuMiAtIDMuMzEgLSA0LjAgLSA0LjEgKi8KKyNkZWZpbmUgQ1NEX1NUUlVDVF9FWFRfQ1NEICAzICAgICAgICAgICAvKiBWZXJzaW9uIGlzIGNvZGVkIGluIENTRF9TVFJVQ1RVUkUgaW4gRVhUX0NTRCAqLworCisjZGVmaW5lIENTRF9TUEVDX1ZFUl8wICAgICAgMCAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAxLjAgLSAxLjIgKi8KKyNkZWZpbmUgQ1NEX1NQRUNfVkVSXzEgICAgICAxICAgICAgICAgICAvKiBJbXBsZW1lbnRzIHN5c3RlbSBzcGVjaWZpY2F0aW9uIDEuNCAqLworI2RlZmluZSBDU0RfU1BFQ19WRVJfMiAgICAgIDIgICAgICAgICAgIC8qIEltcGxlbWVudHMgc3lzdGVtIHNwZWNpZmljYXRpb24gMi4wIC0gMi4yICovCisjZGVmaW5lIENTRF9TUEVDX1ZFUl8zICAgICAgMyAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiAzLjEgLSAzLjIgLSAzLjMxICovCisjZGVmaW5lIENTRF9TUEVDX1ZFUl80ICAgICAgNCAgICAgICAgICAgLyogSW1wbGVtZW50cyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiA0LjAgLSA0LjEgKi8KKworLyoKKyAqIEVYVF9DU0QgZmllbGRzCisgKi8KKworI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSAkxODMJLyogUi9XICovCisjZGVmaW5lIEVYVF9DU0RfSFNfVElNSU5HCTE4NQkvKiBSL1cgKi8KKyNkZWZpbmUgRVhUX0NTRF9DQVJEX1RZUEUJMTk2CS8qIFJPICovCisjZGVmaW5lIEVYVF9DU0RfU0VDX0NOVAkJMjEyCS8qIFJPLCA0IGJ5dGVzICovCisKKy8qCisgKiBFWFRfQ1NEIGZpZWxkIGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFRfQ1NEX0NNRF9TRVRfTk9STUFMCQkoMTw8MCkKKyNkZWZpbmUgRVhUX0NTRF9DTURfU0VUX1NFQ1VSRQkJKDE8PDEpCisjZGVmaW5lIEVYVF9DU0RfQ01EX1NFVF9DUFNFQ1VSRQkoMTw8MikKKworI2RlZmluZSBFWFRfQ1NEX0NBUkRfVFlQRV8yNgkoMTw8MCkJLyogQ2FyZCBjYW4gcnVuIGF0IDI2TUh6ICovCisjZGVmaW5lIEVYVF9DU0RfQ0FSRF9UWVBFXzUyCSgxPDwxKQkvKiBDYXJkIGNhbiBydW4gYXQgNTJNSHogKi8KKworI2RlZmluZSBFWFRfQ1NEX0JVU19XSURUSF8xCTAJLyogQ2FyZCBpcyBpbiAxIGJpdCBtb2RlICovCisjZGVmaW5lIEVYVF9DU0RfQlVTX1dJRFRIXzQJMQkvKiBDYXJkIGlzIGluIDQgYml0IG1vZGUgKi8KKyNkZWZpbmUgRVhUX0NTRF9CVVNfV0lEVEhfOAkyCS8qIENhcmQgaXMgaW4gOCBiaXQgbW9kZSAqLworCisvKgorICogTU1DX1NXSVRDSCBhY2Nlc3MgbW9kZXMKKyAqLworCisjZGVmaW5lIE1NQ19TV0lUQ0hfTU9ERV9DTURfU0VUCQkweDAwCS8qIENoYW5nZSB0aGUgY29tbWFuZCBzZXQgKi8KKyNkZWZpbmUgTU1DX1NXSVRDSF9NT0RFX1NFVF9CSVRTCTB4MDEJLyogU2V0IGJpdHMgd2hpY2ggYXJlIDEgaW4gdmFsdWUgKi8KKyNkZWZpbmUgTU1DX1NXSVRDSF9NT0RFX0NMRUFSX0JJVFMJMHgwMgkvKiBDbGVhciBiaXRzIHdoaWNoIGFyZSAxIGluIHZhbHVlICovCisjZGVmaW5lIE1NQ19TV0lUQ0hfTU9ERV9XUklURV9CWVRFCTB4MDMJLyogU2V0IHRhcmdldCB0byB2YWx1ZSAqLworCisjZW5kaWYgIC8qIE1NQ19NTUNfUFJPVE9DT0xfSCAqLworCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbXNtb3VzZS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L21zbW91c2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZjYjIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L21zbW91c2UuaApAQCAtMCwwICsxLDIgQEAKKy8qIG1zbW91c2UuYyAqLworQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX21zbW91c2UoUWVtdU9wdHMgKm9wdHMpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L252cmFtL2Z3X2NmZy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L252cmFtL2Z3X2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjRjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvbnZyYW0vZndfY2ZnLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmbmRlZiBGV19DRkdfSAorI2RlZmluZSBGV19DRkdfSAorCisjZGVmaW5lIEZXX0NGR19TSUdOQVRVUkUgICAgICAgIDB4MDAKKyNkZWZpbmUgRldfQ0ZHX0lEICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGV19DRkdfVVVJRCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIEZXX0NGR19SQU1fU0laRSAgICAgICAgIDB4MDMKKyNkZWZpbmUgRldfQ0ZHX05PR1JBUEhJQyAgICAgICAgMHgwNAorI2RlZmluZSBGV19DRkdfTkJfQ1BVUyAgICAgICAgICAweDA1CisjZGVmaW5lIEZXX0NGR19NQUNISU5FX0lEICAgICAgIDB4MDYKKyNkZWZpbmUgRldfQ0ZHX0tFUk5FTF9BRERSICAgICAgMHgwNworI2RlZmluZSBGV19DRkdfS0VSTkVMX1NJWkUgICAgICAweDA4CisjZGVmaW5lIEZXX0NGR19LRVJORUxfQ01ETElORSAgIDB4MDkKKyNkZWZpbmUgRldfQ0ZHX0lOSVRSRF9BRERSICAgICAgMHgwYQorI2RlZmluZSBGV19DRkdfSU5JVFJEX1NJWkUgICAgICAweDBiCisjZGVmaW5lIEZXX0NGR19CT09UX0RFVklDRSAgICAgIDB4MGMKKyNkZWZpbmUgRldfQ0ZHX05VTUEgICAgICAgICAgICAgMHgwZAorI2RlZmluZSBGV19DRkdfTUFYX0VOVFJZICAgICAgICAweDEwCisKKyNkZWZpbmUgRldfQ0ZHX1dSSVRFX0NIQU5ORUwgICAgMHg0MDAwCisjZGVmaW5lIEZXX0NGR19BUkNIX0xPQ0FMICAgICAgIDB4ODAwMAorI2RlZmluZSBGV19DRkdfRU5UUllfTUFTSyAgICAgICB+KEZXX0NGR19XUklURV9DSEFOTkVMIHwgRldfQ0ZHX0FSQ0hfTE9DQUwpCisKKyNkZWZpbmUgRldfQ0ZHX0lOVkFMSUQgICAgICAgICAgMHhmZmZmCisKKyNpZm5kZWYgTk9fUUVNVV9QUk9UT1MKK3R5cGVkZWYgdm9pZCAoKkZXQ2ZnQ2FsbGJhY2spKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSk7CisKK2ludCBmd19jZmdfYWRkX2J5dGVzKHZvaWQgKm9wYXF1ZSwgdWludDE2X3Qga2V5LCB1aW50OF90ICpkYXRhLCB1aW50MTZfdCBsZW4pOworaW50IGZ3X2NmZ19hZGRfaTE2KHZvaWQgKm9wYXF1ZSwgdWludDE2X3Qga2V5LCB1aW50MTZfdCB2YWx1ZSk7CitpbnQgZndfY2ZnX2FkZF9pMzIodm9pZCAqb3BhcXVlLCB1aW50MTZfdCBrZXksIHVpbnQzMl90IHZhbHVlKTsKK2ludCBmd19jZmdfYWRkX2k2NCh2b2lkICpvcGFxdWUsIHVpbnQxNl90IGtleSwgdWludDY0X3QgdmFsdWUpOworaW50IGZ3X2NmZ19hZGRfY2FsbGJhY2sodm9pZCAqb3BhcXVlLCB1aW50MTZfdCBrZXksIEZXQ2ZnQ2FsbGJhY2sgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja19vcGFxdWUsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pOwordm9pZCAqZndfY2ZnX2luaXQodWludDMyX3QgY3RsX3BvcnQsIHVpbnQzMl90IGRhdGFfcG9ydCwKKwkJaHdhZGRyIGNybF9hZGRyLCBod2FkZHIgZGF0YV9hZGRyKTsKKworI2VuZGlmIC8qIE5PX1FFTVVfUFJPVE9TICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3BjaS9wY2kuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9wY2kvcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiMzQzNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9wY2kvcGNpLmgKQEAgLTAsMCArMSwyOTkgQEAKKyNpZm5kZWYgUUVNVV9QQ0lfSAorI2RlZmluZSBRRU1VX1BDSV9ICisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCisjaW5jbHVkZSAiaHcvcWRldi5oIgorCisvKiBQQ0kgaW5jbHVkZXMgbGVnYWN5IElTQSBhY2Nlc3MuICAqLworI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKworLyogUENJIGJ1cyAqLworCitleHRlcm4gaHdhZGRyIHBjaV9tZW1fYmFzZTsKKworI2RlZmluZSBQQ0lfREVWRk4oc2xvdCwgZnVuYykgICAoKCgoc2xvdCkgJiAweDFmKSA8PCAzKSB8ICgoZnVuYykgJiAweDA3KSkKKyNkZWZpbmUgUENJX1NMT1QoZGV2Zm4pICAgICAgICAgKCgoZGV2Zm4pID4+IDMpICYgMHgxZikKKyNkZWZpbmUgUENJX0ZVTkMoZGV2Zm4pICAgICAgICAgKChkZXZmbikgJiAweDA3KQorCisvKiBDbGFzcywgVmVuZG9yIGFuZCBEZXZpY2UgSURzIGZyb20gTGludXgncyBwY2lfaWRzLmggKi8KKyNpbmNsdWRlICJody9wY2kvcGNpX2lkcy5oIgorCisvKiBRRU1VLXNwZWNpZmljIFZlbmRvciBhbmQgRGV2aWNlIElEIGRlZmluaXRpb25zICovCisKKy8qIElCTSAoMHgxMDE0KSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lCTV80NDBHWCAgICAgICAgICAweDAyN2YKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JQk1fT1BFTlBJQzIgICAgICAgMHhmZmZmCisKKy8qIEhpdGFjaGkgKDB4MTA1NCkgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9ISVRBQ0hJICAgICAgICAgICAgMHgxMDU0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSElUQUNISV9TSDc3NTFSICAgIDB4MzUwZQorCisvKiBBcHBsZSAoMHgxMDZiKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFXzM0M1MxMjAxICAgICAweDAwMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9VTklfTl9JX1BDSSAgMHgwMDFlCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fUENJICAgIDB4MDAxZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FQUExFX1VOSV9OX0tFWUwgICAweDAwMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BUFBMRV9JUElEX1VTQiAgICAgMHgwMDNmCisKKy8qIFJlYWx0ZWsgKDB4MTBlYykgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgwMjkgICAgICAgMHg4MDI5CisKKy8qIFhpbGlueCAoMHgxMGVlKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1hJTElOWF9YQzJWUDMwICAgICAweDAzMDAKKworLyogTWFydmVsbCAoMHgxMWFiKSAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q2NDEyWCAgICAweDQ2MjAKKworLyogUUVNVS9Cb2NocyBWR0EgKDB4MTIzNCkgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9RRU1VICAgICAgICAgICAgICAgMHgxMjM0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUVNVV9WR0EgICAgICAgICAgIDB4MTExMQorCisvKiBWTVdhcmUgKDB4MTVhZCkgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WTVdBUkUgICAgICAgICAgICAgMHgxNWFkCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk1XQVJFX1NWR0EyICAgICAgIDB4MDQwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9TVkdBICAgICAgICAweDA3MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WTVdBUkVfTkVUICAgICAgICAgMHgwNzIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVk1XQVJFX1NDU0kgICAgICAgIDB4MDczMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZNV0FSRV9JREUgICAgICAgICAweDE3MjkKKworLyogSW50ZWwgKDB4ODA4NikgKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjU1MUlUICAgICAgMHgxMjA5CisKKy8qIFJlZCBIYXQgLyBRdW1yYW5ldCAoZm9yIFFFTVUpIC0tIHNlZSBwY2ktaWRzLnR4dCAqLworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFREhBVF9RVU1SQU5FVCAgICAweDFhZjQKKyNkZWZpbmUgUENJX1NVQlZFTkRPUl9JRF9SRURIQVRfUVVNUkFORVQgMHgxYWY0CisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfUUVNVSAgICAgICAgICAgIDB4MTEwMAorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklSVElPX05FVCAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJUlRJT19CTE9DSyAgICAgICAweDEwMDEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVJUSU9fQkFMTE9PTiAgICAgMHgxMDAyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklSVElPX0NPTlNPTEUgICAgIDB4MTAwMworCit0eXBlZGVmIHZvaWQgUENJQ29uZmlnV3JpdGVGdW5jKFBDSURldmljZSAqcGNpX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSwgaW50IGxlbik7Cit0eXBlZGVmIHVpbnQzMl90IFBDSUNvbmZpZ1JlYWRGdW5jKFBDSURldmljZSAqcGNpX2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWRkcmVzcywgaW50IGxlbik7Cit0eXBlZGVmIHZvaWQgUENJTWFwSU9SZWdpb25GdW5jKFBDSURldmljZSAqcGNpX2RldiwgaW50IHJlZ2lvbl9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHIsIHVpbnQzMl90IHNpemUsIGludCB0eXBlKTsKK3R5cGVkZWYgaW50IFBDSVVucmVnaXN0ZXJGdW5jKFBDSURldmljZSAqcGNpX2Rldik7CisKKyNkZWZpbmUgUENJX0FERFJFU1NfU1BBQ0VfTUVNCQkweDAwCisjZGVmaW5lIFBDSV9BRERSRVNTX1NQQUNFX0lPCQkweDAxCisjZGVmaW5lIFBDSV9BRERSRVNTX1NQQUNFX01FTV9QUkVGRVRDSAkweDA4CisKK3R5cGVkZWYgc3RydWN0IFBDSUlPUmVnaW9uIHsKKyAgICB1aW50MzJfdCBhZGRyOyAvKiBjdXJyZW50IFBDSSBtYXBwaW5nIGFkZHJlc3MuIC0xIG1lYW5zIG5vdCBtYXBwZWQgKi8KKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBQQ0lNYXBJT1JlZ2lvbkZ1bmMgKm1hcF9mdW5jOworfSBQQ0lJT1JlZ2lvbjsKKworI2RlZmluZSBQQ0lfUk9NX1NMT1QgNgorI2RlZmluZSBQQ0lfTlVNX1JFR0lPTlMgNworCisvKiBEZWNsYXJhdGlvbnMgZnJvbSBsaW51eC9wY2lfcmVncy5oICovCisjZGVmaW5lIFBDSV9WRU5ET1JfSUQJCTB4MDAJLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfREVWSUNFX0lECQkweDAyCS8qIDE2IGJpdHMgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkQJCTB4MDQJLyogMTYgYml0cyAqLworI2RlZmluZSAgUENJX0NPTU1BTkRfSU8JCTB4MQkvKiBFbmFibGUgcmVzcG9uc2UgaW4gSS9PIHNwYWNlICovCisjZGVmaW5lICBQQ0lfQ09NTUFORF9NRU1PUlkJMHgyCS8qIEVuYWJsZSByZXNwb25zZSBpbiBNZW1vcnkgc3BhY2UgKi8KKyNkZWZpbmUgUENJX1NUQVRVUyAgICAgICAgICAgICAgMHgwNiAgICAvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9SRVZJU0lPTl9JRCAgICAgICAgIDB4MDggICAgLyogOCBiaXRzICAqLworI2RlZmluZSBQQ0lfQ0xBU1NfREVWSUNFICAgICAgICAweDBhICAgIC8qIERldmljZSBjbGFzcyAqLworI2RlZmluZSBQQ0lfSEVBREVSX1RZUEUgICAgICAgICAweDBlICAgIC8qIDggYml0cyAqLworI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX05PUk1BTAkJMAorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0JSSURHRQkJMQorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX0NBUkRCVVMJMgorI2RlZmluZSAgUENJX0hFQURFUl9UWVBFX01VTFRJX0ZVTkNUSU9OIDB4ODAKKyNkZWZpbmUgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQgMHgyYyAgICAvKiAxNiBiaXRzICovCisjZGVmaW5lIFBDSV9TVUJTWVNURU1fSUQgICAgICAgIDB4MmUgICAgLyogMTYgYml0cyAqLworI2RlZmluZSBQQ0lfSU5URVJSVVBUX0xJTkUJMHgzYwkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX0lOVEVSUlVQVF9QSU4JMHgzZAkvKiA4IGJpdHMgKi8KKyNkZWZpbmUgUENJX01JTl9HTlQJCTB4M2UJLyogOCBiaXRzICovCisjZGVmaW5lIFBDSV9NQVhfTEFUCQkweDNmCS8qIDggYml0cyAqLworCisjZGVmaW5lIFBDSV9SRVZJU0lPTiAgICAgICAgICAgIDB4MDggICAgLyogb2Jzb2xldGUsIHVzZSBQQ0lfUkVWSVNJT05fSUQgKi8KKyNkZWZpbmUgUENJX1NVQlZFTkRPUl9JRCAgICAgICAgMHgyYyAgICAvKiBvYnNvbGV0ZSwgdXNlIFBDSV9TVUJTWVNURU1fVkVORE9SX0lEICovCisjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSUQgICAgICAgIDB4MmUgICAgLyogb2Jzb2xldGUsIHVzZSBQQ0lfU1VCU1lTVEVNX0lEICovCisKKy8qIEJpdHMgaW4gdGhlIFBDSSBTdGF0dXMgUmVnaXN0ZXIgKFBDSSAyLjMgc3BlYykgKi8KKyNkZWZpbmUgUENJX1NUQVRVU19SRVNFUlZFRDEJMHgwMDcKKyNkZWZpbmUgUENJX1NUQVRVU19JTlRfU1RBVFVTCTB4MDA4CisjZGVmaW5lIFBDSV9TVEFUVVNfQ0FQQUJJTElUSUVTCTB4MDEwCisjZGVmaW5lIFBDSV9TVEFUVVNfNjZNSFoJMHgwMjAKKyNkZWZpbmUgUENJX1NUQVRVU19SRVNFUlZFRDIJMHgwNDAKKyNkZWZpbmUgUENJX1NUQVRVU19GQVNUX0JBQ0sJMHgwODAKKyNkZWZpbmUgUENJX1NUQVRVU19ERVZTRUwJMHg2MDAKKworI2RlZmluZSBQQ0lfU1RBVFVTX1JFU0VSVkVEX01BU0tfTE8gKFBDSV9TVEFUVVNfUkVTRVJWRUQxIHwgXAorICAgICAgICAgICAgICAgIFBDSV9TVEFUVVNfSU5UX1NUQVRVUyB8IFBDSV9TVEFUVVNfQ0FQQUJJTElUSUVTIHwgXAorICAgICAgICAgICAgICAgIFBDSV9TVEFUVVNfNjZNSFogfCBQQ0lfU1RBVFVTX1JFU0VSVkVEMiB8IFBDSV9TVEFUVVNfRkFTVF9CQUNLKQorCisjZGVmaW5lIFBDSV9TVEFUVVNfUkVTRVJWRURfTUFTS19ISSAoUENJX1NUQVRVU19ERVZTRUwgPj4gOCkKKworLyogQml0cyBpbiB0aGUgUENJIENvbW1hbmQgUmVnaXN0ZXIgKFBDSSAyLjMgc3BlYykgKi8KKyNkZWZpbmUgUENJX0NPTU1BTkRfUkVTRVJWRUQJMHhmODAwCisKKyNkZWZpbmUgUENJX0NPTU1BTkRfUkVTRVJWRURfTUFTS19ISSAoUENJX0NPTU1BTkRfUkVTRVJWRUQgPj4gOCkKKworc3RydWN0IFBDSURldmljZSB7CisgICAgRGV2aWNlU3RhdGUgcWRldjsKKyAgICAvKiBQQ0kgY29uZmlnIHNwYWNlICovCisgICAgdWludDhfdCBjb25maWdbMjU2XTsKKworICAgIC8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSByZWFkIG9ubHkgKi8KKyAgICBQQ0lCdXMgKmJ1czsKKyAgICBpbnQgZGV2Zm47CisgICAgY2hhciBuYW1lWzY0XTsKKyAgICBQQ0lJT1JlZ2lvbiBpb19yZWdpb25zW1BDSV9OVU1fUkVHSU9OU107CisKKyAgICAvKiBkbyBub3QgYWNjZXNzIHRoZSBmb2xsb3dpbmcgZmllbGRzICovCisgICAgUENJQ29uZmlnUmVhZEZ1bmMgKmNvbmZpZ19yZWFkOworICAgIFBDSUNvbmZpZ1dyaXRlRnVuYyAqY29uZmlnX3dyaXRlOworICAgIFBDSVVucmVnaXN0ZXJGdW5jICp1bnJlZ2lzdGVyOworCisgICAgLyogSVJRIG9iamVjdHMgZm9yIHRoZSBJTlRBLUlOVEQgcGlucy4gICovCisgICAgcWVtdV9pcnEgKmlycTsKKworICAgIC8qIEN1cnJlbnQgSVJRIGxldmVscy4gIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgZ2VuZXJpYyBQQ0kgY29kZS4gICovCisgICAgaW50IGlycV9zdGF0ZVs0XTsKK307CisKK1BDSURldmljZSAqcGNpX3JlZ2lzdGVyX2RldmljZShQQ0lCdXMgKmJ1cywgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2Vfc2l6ZSwgaW50IGRldmZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSUNvbmZpZ1JlYWRGdW5jICpjb25maWdfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lDb25maWdXcml0ZUZ1bmMgKmNvbmZpZ193cml0ZSk7CitpbnQgcGNpX3VucmVnaXN0ZXJfZGV2aWNlKFBDSURldmljZSAqcGNpX2Rldik7CisKK3ZvaWQgcGNpX3JlZ2lzdGVyX2JhcihQQ0lEZXZpY2UgKnBjaV9kZXYsIGludCByZWdpb25fbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSU1hcElPUmVnaW9uRnVuYyAqbWFwX2Z1bmMpOworCit1aW50MzJfdCBwY2lfZGVmYXVsdF9yZWFkX2NvbmZpZyhQQ0lEZXZpY2UgKmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhZGRyZXNzLCBpbnQgbGVuKTsKK3ZvaWQgcGNpX2RlZmF1bHRfd3JpdGVfY29uZmlnKFBDSURldmljZSAqZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IHZhbCwgaW50IGxlbik7Cit2b2lkIHBjaV9kZXZpY2Vfc2F2ZShQQ0lEZXZpY2UgKnMsIFFFTVVGaWxlICpmKTsKK2ludCBwY2lfZGV2aWNlX2xvYWQoUENJRGV2aWNlICpzLCBRRU1VRmlsZSAqZik7CisKK3R5cGVkZWYgdm9pZCAoKnBjaV9zZXRfaXJxX2ZuKShxZW11X2lycSAqcGljLCBpbnQgaXJxX251bSwgaW50IGxldmVsKTsKK3R5cGVkZWYgaW50ICgqcGNpX21hcF9pcnFfZm4pKFBDSURldmljZSAqcGNpX2RldiwgaW50IGlycV9udW0pOworUENJQnVzICpwY2lfcmVnaXN0ZXJfYnVzKERldmljZVN0YXRlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3NldF9pcnFfZm4gc2V0X2lycSwgcGNpX21hcF9pcnFfZm4gbWFwX2lycSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2lycSAqcGljLCBpbnQgZGV2Zm5fbWluLCBpbnQgbmlycSk7CisKK1BDSURldmljZSAqcGNpX25pY19pbml0KFBDSUJ1cyAqYnVzLCBOSUNJbmZvICpuZCwgaW50IGRldmZuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9tb2RlbCk7Cit2b2lkIHBjaV9kYXRhX3dyaXRlKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkciwgdWludDMyX3QgdmFsLCBpbnQgbGVuKTsKK3VpbnQzMl90IHBjaV9kYXRhX3JlYWQodm9pZCAqb3BhcXVlLCB1aW50MzJfdCBhZGRyLCBpbnQgbGVuKTsKK2ludCBwY2lfYnVzX251bShQQ0lCdXMgKnMpOwordm9pZCBwY2lfZm9yX2VhY2hfZGV2aWNlKGludCBidXNfbnVtLCB2b2lkICgqZm4pKFBDSURldmljZSAqZCkpOworUENJQnVzICpwY2lfZmluZF9idXMoaW50IGJ1c19udW0pOworUENJRGV2aWNlICpwY2lfZmluZF9kZXZpY2UoaW50IGJ1c19udW0sIGludCBzbG90LCBpbnQgZnVuY3Rpb24pOworCitpbnQgcGNpX3JlYWRfZGV2YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgKmRvbXAsIGludCAqYnVzcCwgdW5zaWduZWQgKnNsb3RwKTsKK2ludCBwY2lfYXNzaWduX2RldmFkZHIoY29uc3QgY2hhciAqYWRkciwgaW50ICpkb21wLCBpbnQgKmJ1c3AsIHVuc2lnbmVkICpzbG90cCk7CisKK3ZvaWQgcGNpX2luZm8oTW9uaXRvciAqbW9uKTsKK1BDSUJ1cyAqcGNpX2JyaWRnZV9pbml0KFBDSUJ1cyAqYnVzLCBpbnQgZGV2Zm4sIHVpbnQxNl90IHZpZCwgdWludDE2X3QgZGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgcGNpX21hcF9pcnFfZm4gbWFwX2lycSwgY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGNpX3NldF9ieXRlKHVpbnQ4X3QgKmNvbmZpZywgdWludDhfdCB2YWwpCit7CisgICAgKmNvbmZpZyA9IHZhbDsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90CitwY2lfZ2V0X2J5dGUoY29uc3QgdWludDhfdCAqY29uZmlnKQoreworICAgIHJldHVybiAqY29uZmlnOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaV9zZXRfd29yZCh1aW50OF90ICpjb25maWcsIHVpbnQxNl90IHZhbCkKK3sKKyAgICBzdHdfbGVfcChjb25maWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK3BjaV9nZXRfd29yZChjb25zdCB1aW50OF90ICpjb25maWcpCit7CisgICAgcmV0dXJuIGxkdXdfbGVfcChjb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaV9zZXRfbG9uZyh1aW50OF90ICpjb25maWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzdGxfbGVfcChjb25maWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK3BjaV9nZXRfbG9uZyhjb25zdCB1aW50OF90ICpjb25maWcpCit7CisgICAgcmV0dXJuIGxkbF9sZV9wKGNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGNpX3NldF9xdWFkKHVpbnQ4X3QgKmNvbmZpZywgdWludDY0X3QgdmFsKQoreworICAgIGNwdV90b19sZTY0dygodWludDY0X3QgKiljb25maWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK3BjaV9nZXRfcXVhZChjb25zdCB1aW50OF90ICpjb25maWcpCit7CisgICAgcmV0dXJuIGxlNjRfdG9fY3B1cCgoY29uc3QgdWludDY0X3QgKiljb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaV9jb25maWdfc2V0X3ZlbmRvcl9pZCh1aW50OF90ICpwY2lfY29uZmlnLCB1aW50MTZfdCB2YWwpCit7CisgICAgcGNpX3NldF93b3JkKCZwY2lfY29uZmlnW1BDSV9WRU5ET1JfSURdLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaV9jb25maWdfc2V0X2RldmljZV9pZCh1aW50OF90ICpwY2lfY29uZmlnLCB1aW50MTZfdCB2YWwpCit7CisgICAgcGNpX3NldF93b3JkKCZwY2lfY29uZmlnW1BDSV9ERVZJQ0VfSURdLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BjaV9jb25maWdfc2V0X2NsYXNzKHVpbnQ4X3QgKnBjaV9jb25maWcsIHVpbnQxNl90IHZhbCkKK3sKKyAgICBwY2lfc2V0X3dvcmQoJnBjaV9jb25maWdbUENJX0NMQVNTX0RFVklDRV0sIHZhbCk7Cit9CisKK3R5cGVkZWYgdm9pZCAoKnBjaV9xZGV2X2luaXRmbikoUENJRGV2aWNlICpkZXYpOwordm9pZCBwY2lfcWRldl9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLCBpbnQgc2l6ZSwgcGNpX3FkZXZfaW5pdGZuIGluaXQpOworCitQQ0lEZXZpY2UgKnBjaV9jcmVhdGVfc2ltcGxlKFBDSUJ1cyAqYnVzLCBpbnQgZGV2Zm4sIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBsc2k1M2M4OTVhLmMgKi8KKyNkZWZpbmUgTFNJX01BWF9ERVZTIDcKK3ZvaWQgbHNpX3Njc2lfYXR0YWNoKERldmljZVN0YXRlICpob3N0LCBCbG9ja0RyaXZlclN0YXRlICpiZCwgaW50IGlkKTsKKworLyogdm13YXJlX3ZnYS5jICovCit2b2lkIHBjaV92bXN2Z2FfaW5pdChQQ0lCdXMgKmJ1cyk7CisKKy8qIHVzYi11aGNpLmMgKi8KK3ZvaWQgdXNiX3VoY2lfcGlpeDNfaW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuKTsKK3ZvaWQgdXNiX3VoY2lfcGlpeDRfaW5pdChQQ0lCdXMgKmJ1cywgaW50IGRldmZuKTsKKworLyogdXNiLW9oY2kuYyAqLwordm9pZCB1c2Jfb2hjaV9pbml0X3BjaShzdHJ1Y3QgUENJQnVzICpidXMsIGludCBudW1fcG9ydHMsIGludCBkZXZmbik7CisKKy8qIHByZXBfcGNpLmMgKi8KK1BDSUJ1cyAqcGNpX3ByZXBfaW5pdChxZW11X2lycSAqcGljKTsKKworLyogYXBiX3BjaS5jICovCitQQ0lCdXMgKnBjaV9hcGJfaW5pdChod2FkZHIgc3BlY2lhbF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIG1lbV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgcWVtdV9pcnEgKnBpYywgUENJQnVzICoqYnVzMiwgUENJQnVzICoqYnVzMyk7CisKKy8qIHNoX3BjaS5jICovCitQQ0lCdXMgKnNoX3BjaV9yZWdpc3Rlcl9idXMocGNpX3NldF9pcnFfZm4gc2V0X2lycSwgcGNpX21hcF9pcnFfZm4gbWFwX2lycSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2lycSAqcGljLCBpbnQgZGV2Zm5fbWluLCBpbnQgbmlycSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3BjaS9wY2lfaWRzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvcGNpL3BjaV9pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZlNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3BjaS9wY2lfaWRzLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqICAgICAgUENJIENsYXNzLCBWZW5kb3IgYW5kIERldmljZSBJRHMKKyAqCisgKiAgICAgIFBsZWFzZSBrZWVwIHNvcnRlZC4KKyAqCisgKiAgICAgIEFiYnJldmlhdGVkIHZlcnNpb24gb2YgbGludXgvcGNpX2lkcy5oCisgKgorICogICAgICBRRU1VLXNwZWNpZmljIGRlZmluaXRpb25zIGJlbG9uZyBpbiBwY2kuaAorICovCisKKy8qIERldmljZSBjbGFzc2VzIGFuZCBzdWJjbGFzc2VzICovCisKKyNkZWZpbmUgUENJX0JBU0VfQ0xBU1NfU1RPUkFHRSAgICAgICAgICAgMHgwMQorI2RlZmluZSBQQ0lfQkFTRV9DTEFTU19ORVRXT1JLICAgICAgICAgICAweDAyCisKKyNkZWZpbmUgUENJX0NMQVNTX1NUT1JBR0VfU0NTSSAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIFBDSV9DTEFTU19TVE9SQUdFX0lERSAgICAgICAgICAgIDB4MDEwMQorI2RlZmluZSBQQ0lfQ0xBU1NfU1RPUkFHRV9PVEhFUiAgICAgICAgICAweDAxODAKKworI2RlZmluZSBQQ0lfQ0xBU1NfTkVUV09SS19FVEhFUk5FVCAgICAgICAweDAyMDAKKworI2RlZmluZSBQQ0lfQ0xBU1NfRElTUExBWV9WR0EgICAgICAgICAgICAweDAzMDAKKyNkZWZpbmUgUENJX0NMQVNTX0RJU1BMQVlfT1RIRVIgICAgICAgICAgMHgwMzgwCisKKyNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gICAgICAgMHgwNDAxCisKKyNkZWZpbmUgUENJX0NMQVNTX01FTU9SWV9SQU0gICAgICAgICAgICAgMHgwNTAwCisKKyNkZWZpbmUgUENJX0NMQVNTX1NZU1RFTV9PVEhFUiAgICAgICAgICAgMHgwODgwCisKKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9VU0IgICAgICAgICAgICAgMHgwYzAzCisKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9IT1NUICAgICAgICAgICAgMHgwNjAwCisjZGVmaW5lIFBDSV9DTEFTU19CUklER0VfSVNBICAgICAgICAgICAgIDB4MDYwMQorI2RlZmluZSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSAgICAgICAgICAgICAweDA2MDQKKyNkZWZpbmUgUENJX0NMQVNTX0JSSURHRV9PVEhFUiAgICAgICAgICAgMHgwNjgwCisKKyNkZWZpbmUgUENJX0NMQVNTX0NPTU1VTklDQVRJT05fT1RIRVIgICAgMHgwNzgwCisKKyNkZWZpbmUgUENJX0NMQVNTX1BST0NFU1NPUl9DTyAgICAgICAgICAgMHgwYjQwCisjZGVmaW5lIFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyAgICAgIDB4MGIyMAorCisjZGVmaW5lIFBDSV9DTEFTU19PVEhFUlMgICAgICAgICAgICAgICAgIDB4ZmYKKworLyogVmVuZG9ycyBhbmQgZGV2aWNlcy4gIFNvcnQga2V5OiB2ZW5kb3IgZmlyc3QsIGRldmljZSBuZXh0LiAqLworCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTFNJX0xPR0lDICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0xTSV81M0M4OTVBICAgICAgICAweDAwMTIKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RFQyAgICAgICAgICAgICAgICAweDEwMTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ERUNfMjExNTQgICAgICAgICAgMHgwMDI2CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DSVJSVVMgICAgICAgICAgICAgMHgxMDEzCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JQk0gICAgICAgICAgICAgICAgMHgxMDE0CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BTUQgICAgICAgICAgICAgICAgMHgxMDIyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0xBTkNFICAgICAgICAgIDB4MjAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfTU9UT1JPTEEgICAgICAgICAgIDB4MTA1NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01PVE9ST0xBX01QQzEwNiAgICAweDAwMDIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NT1RPUk9MQV9SQVZFTiAgICAgMHg0ODAxCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9BUFBMRSAgICAgICAgICAgICAgMHgxMDZiCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVBQTEVfVU5JX05fQUdQICAgIDB4MDAyMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VOICAgICAgICAgICAgICAgIDB4MTA4ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTl9FQlVTICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9TVU5fU0lNQkEgICAgICAgICAgMHg1MDAwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU1VOX1NBQlJFICAgICAgICAgIDB4YTAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ01EICAgICAgICAgICAgICAgIDB4MTA5NQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NNRF82NDYgICAgICAgICAgICAweDA2NDYKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX1JFQUxURUsgICAgICAgICAgICAweDEwZWMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzkgICAgICAgMHg4MTM5CisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YSUxJTlggICAgICAgICAgICAgMHgxMGVlCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NQVJWRUxMICAgICAgICAgICAgMHgxMWFiCisKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTlNPTklRICAgICAgICAgICAgMHgxMjc0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzAgICAgIDB4NTAwMAorCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRlJFRVNDQUxFICAgICAgICAgIDB4MTk1NworI2RlZmluZSBQQ0lfREVWSUNFX0lEX01QQzg1MzNFICAgICAgICAgICAweDAwMzAKKworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMICAgICAgICAgICAgICAweDgwODYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0MSAgICAgICAgMHgxMjM3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV81ICAgIDB4MjQxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxU0JfMCAgICAweDcwMDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MVNCXzEgICAgMHg3MDEwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFTQl8yICAgIDB4NzAyMAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMCAgICAweDcxMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCICAgICAgMHg3MTExCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8yICAgIDB4NzExMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMyAgICAweDcxMTMKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9wb3dlcl9zdXBwbHkuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9wb3dlcl9zdXBwbHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVlZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3Bvd2VyX3N1cHBseS5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIFVuaXZlcnNhbCBwb3dlciBzdXBwbHkgbW9uaXRvciBjbGFzcworICoKKyAqICBDb3B5cmlnaHQgwqkgMjAwNyAgQW50b24gVm9yb250c292IDxjYm91QG1haWwucnU+CisgKiAgQ29weXJpZ2h0IMKpIDIwMDQgIFN6YWJvbGNzIEd5dXJrbworICogIENvcHlyaWdodCDCqSAyMDAzICBJYW4gTW9sdG9uIDxzcHlyb0BmMnMuY29tPgorICoKKyAqICBNb2RpZmllZDogMjAwNCwgT2N0ICAgICBTemFib2xjcyBHeXVya28KKyAqCisgKiAgWW91IG1heSB1c2UgdGhpcyBjb2RlIGFzIHBlciBHUEwgdmVyc2lvbiAyCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1BPV0VSX1NVUFBMWV9IX18KKyNkZWZpbmUgX19MSU5VWF9QT1dFUl9TVVBQTFlfSF9fCisKKy8qCisgKiBBbGwgdm9sdGFnZXMsIGN1cnJlbnRzLCBjaGFyZ2VzLCBlbmVyZ2llcywgdGltZSBhbmQgdGVtcGVyYXR1cmVzIGluIHVWLAorICogwrVBLCDCtUFoLCDCtVdoLCBzZWNvbmRzIGFuZCB0ZW50aHMgb2YgZGVncmVlIENlbHNpdXMgdW5sZXNzIG90aGVyd2lzZQorICogc3RhdGVkLiBJdCdzIGRyaXZlcidzIGpvYiB0byBjb252ZXJ0IGl0cyByYXcgdmFsdWVzIHRvIHVuaXRzIGluIHdoaWNoCisgKiB0aGlzIGNsYXNzIG9wZXJhdGVzLgorICovCisKKy8qCisgKiBGb3Igc3lzdGVtcyB3aGVyZSB0aGUgY2hhcmdlciBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGJhdHRlcnkgY2FwYWNpdHkKKyAqIHRoZSBtaW4gYW5kIG1heCBmaWVsZHMgc2hvdWxkIGJlIHVzZWQgdG8gcHJlc2VudCB0aGVzZSB2YWx1ZXMgdG8gdXNlcgorICogc3BhY2UuIFVudXNlZC91bmtub3duIGZpZWxkcyB3aWxsIG5vdCBhcHBlYXIgaW4gc3lzZnMuCisgKi8KKworZW51bSB7CisJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOID0gMCwKKwlQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HLAorCVBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcsCisJUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkcsCisJUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMLAorfTsKKworZW51bSB7CisJUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOID0gMCwKKwlQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QsCisJUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVCwKKwlQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQsCisJUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRSwKKwlQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFLAorfTsKKworZW51bSB7CisJUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfVU5LTk9XTiA9IDAsCisJUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTmlNSCwKKwlQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OLAorCVBPV0VSX1NVUFBMWV9URUNITk9MT0dZX0xJUE8sCisJUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTGlGZSwKKwlQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9OaUNkLAorfTsKKworZW51bSB7CisJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX1VOS05PV04gPSAwLAorCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9DUklUSUNBTCwKKwlQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfTE9XLAorCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9OT1JNQUwsCisJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0hJR0gsCisJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEwsCit9OworCitlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB7CisJLyogUHJvcGVydGllcyBvZiB0eXBlIGBpbnQnICovCisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTID0gMCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFlfREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9FTVBUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTExfREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9FTVBUWV9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0VNUFRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwgLyogaW4gcGVyY2VudHMhICovCisJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUwsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FNQklFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfQVZHLAorCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgY29uc3QgY2hhciAqJyAqLworCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUsCisJUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAorfTsKKworZW51bSBwb3dlcl9zdXBwbHlfdHlwZSB7CisJUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSA9IDAsCisJUE9XRVJfU1VQUExZX1RZUEVfVVBTLAorCVBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCVBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1BPV0VSX1NVUFBMWV9IX18gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9xZGV2LWNvcmUuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9xZGV2LWNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjg2NTZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3FkZXYtY29yZS5oCkBAIC0wLDAgKzEsMTI5IEBACisjaWZuZGVmIFFERVZfQ09SRV9ICisjZGVmaW5lIFFERVZfQ09SRV9ICisKKyNpbmNsdWRlICJody9pcnEuaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisKK3R5cGVkZWYgc3RydWN0IERldmljZVR5cGUgRGV2aWNlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgRGV2aWNlUHJvcGVydHkgRGV2aWNlUHJvcGVydHk7CisKKy8qIFRoaXMgc3RydWN0dXJlIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkuICBXZSBkZWNsYXJlIGl0IGhlcmUKKyAgIHNvIHRoYXQgaXQgY2FuIGJlIGVtYmVkZGVkIGluIGluZGl2aWR1YWwgZGV2aWNlIHN0YXRlIHN0cnVjdHVyZXMuICAqLworc3RydWN0IERldmljZVN0YXRlIHsKKyAgICBEZXZpY2VUeXBlICp0eXBlOworICAgIEJ1c1N0YXRlICpwYXJlbnRfYnVzOworICAgIERldmljZVByb3BlcnR5ICpwcm9wczsKKyAgICBpbnQgbnVtX2dwaW9fb3V0OworICAgIHFlbXVfaXJxICpncGlvX291dDsKKyAgICBpbnQgbnVtX2dwaW9faW47CisgICAgcWVtdV9pcnEgKmdwaW9faW47CisgICAgUUxJU1RfSEVBRCgsIEJ1c1N0YXRlKSBjaGlsZF9idXM7CisgICAgTklDSW5mbyAqbmQ7CisgICAgUUxJU1RfRU5UUlkoRGV2aWNlU3RhdGUpIHNpYmxpbmc7Cit9OworCit0eXBlZGVmIGVudW0geworICAgIEJVU19UWVBFX1NZU1RFTSwKKyAgICBCVVNfVFlQRV9QQ0ksCisgICAgQlVTX1RZUEVfU0NTSSwKKyAgICBCVVNfVFlQRV9JMkMsCisgICAgQlVTX1RZUEVfU1NJCit9IEJ1c1R5cGU7CisKK3N0cnVjdCBCdXNTdGF0ZSB7CisgICAgRGV2aWNlU3RhdGUgKnBhcmVudDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIEJ1c1R5cGUgdHlwZTsKKyAgICBRTElTVF9IRUFEKCwgRGV2aWNlU3RhdGUpIGNoaWxkcmVuOworICAgIFFMSVNUX0VOVFJZKEJ1c1N0YXRlKSBzaWJsaW5nOworfTsKKworLyoqKiBCb2FyZCBBUEkuICBUaGlzIHNob3VsZCBnbyBhd2F5IG9uY2Ugd2UgaGF2ZSBhIG1hY2hpbmUgY29uZmlnIGZpbGUuICAqKiovCisKK0RldmljZVN0YXRlICpxZGV2X2NyZWF0ZShCdXNTdGF0ZSAqYnVzLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgcWRldl9pbml0KERldmljZVN0YXRlICpkZXYpOwordm9pZCBxZGV2X2ZyZWUoRGV2aWNlU3RhdGUgKmRldik7CisKKy8qIFNldCBwcm9wZXJ0aWVzIGJldHdlZW4gY3JlYXRpb24gYW5kIGluaXQuICAqLwordm9pZCBxZGV2X3NldF9wcm9wX2ludChEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCB2YWx1ZSk7Cit2b2lkIHFkZXZfc2V0X3Byb3BfZGV2KERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIERldmljZVN0YXRlICp2YWx1ZSk7Cit2b2lkIHFkZXZfc2V0X3Byb3BfcHRyKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnZhbHVlKTsKK3ZvaWQgcWRldl9zZXRfbmV0ZGV2KERldmljZVN0YXRlICpkZXYsIE5JQ0luZm8gKm5kKTsKKworcWVtdV9pcnEgcWRldl9nZXRfZ3Bpb19pbihEZXZpY2VTdGF0ZSAqZGV2LCBpbnQgbik7Cit2b2lkIHFkZXZfY29ubmVjdF9ncGlvX291dChEZXZpY2VTdGF0ZSAqZGV2LCBpbnQgbiwgcWVtdV9pcnEgcGluKTsKKworQnVzU3RhdGUgKnFkZXZfZ2V0X2NoaWxkX2J1cyhEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqKiBEZXZpY2UgQVBJLiAgKioqLworCit0eXBlZGVmIGVudW0geworICAgIFBST1BfVFlQRV9JTlQsCisgICAgUFJPUF9UWVBFX1BUUiwKKyAgICBQUk9QX1RZUEVfREVWCit9IERldmljZVByb3BUeXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBEZXZpY2VQcm9wVHlwZSB0eXBlOworfSBEZXZpY2VQcm9wTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgRGV2aWNlSW5mbyBEZXZpY2VJbmZvOworCit0eXBlZGVmIHZvaWQgKCpxZGV2X2luaXRmbikoRGV2aWNlU3RhdGUgKmRldiwgRGV2aWNlSW5mbyAqaW5mbyk7Cit0eXBlZGVmIHZvaWQgKCpTQ1NJQXR0YWNoRm4pKERldmljZVN0YXRlICpob3N0LCBCbG9ja0RyaXZlclN0YXRlICpiZHJ2LAorICAgICAgICAgICAgICBpbnQgdW5pdCk7CisKK3N0cnVjdCBEZXZpY2VJbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHNpemVfdCBzaXplOworICAgIERldmljZVByb3BMaXN0ICpwcm9wczsKKworICAgIC8qIFByaXZhdGUgdG8gcWRldiAvIGJ1cy4gICovCisgICAgcWRldl9pbml0Zm4gaW5pdDsKKyAgICBCdXNUeXBlIGJ1c190eXBlOworfTsKKwordm9pZCBxZGV2X3JlZ2lzdGVyKERldmljZUluZm8gKmluZm8pOworCisvKiBSZWdpc3RlciBkZXZpY2UgcHJvcGVydGllcy4gICovCisvKiBHUElPIGlucHV0cyBhbHNvIGRvdWJsZSBhcyBJUlEgc2lua3MuICAqLwordm9pZCBxZGV2X2luaXRfZ3Bpb19pbihEZXZpY2VTdGF0ZSAqZGV2LCBxZW11X2lycV9oYW5kbGVyIGhhbmRsZXIsIGludCBuKTsKK3ZvaWQgcWRldl9pbml0X2dwaW9fb3V0KERldmljZVN0YXRlICpkZXYsIHFlbXVfaXJxICpwaW5zLCBpbnQgbik7CisKK3ZvaWQgc2NzaV9idXNfbmV3KERldmljZVN0YXRlICpob3N0LCBTQ1NJQXR0YWNoRm4gYXR0YWNoKTsKKworQ2hhckRyaXZlclN0YXRlICpxZGV2X2luaXRfY2hhcmRldihEZXZpY2VTdGF0ZSAqZGV2KTsKKworQnVzU3RhdGUgKnFkZXZfZ2V0X3BhcmVudF9idXMoRGV2aWNlU3RhdGUgKmRldik7Cit1aW50NjRfdCBxZGV2X2dldF9wcm9wX2ludChEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBkZWYpOworRGV2aWNlU3RhdGUgKnFkZXZfZ2V0X3Byb3BfZGV2KERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOworLyogRklYTUU6IFJlbW92ZSBvcGFxdWUgcG9pbnRlciBwcm9wZXJ0aWVzLiAgKi8KK3ZvaWQgKnFkZXZfZ2V0X3Byb3BfcHRyKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBDb252ZXJ5IGZyb20gYSBiYXNlIHR5cGUgdG8gYSBwYXJlbnQgdHlwZSwgd2l0aCBjb21waWxlIHRpbWUgY2hlY2tpbmcuICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIERPX1VQQ0FTVCh0eXBlLCBmaWVsZCwgZGV2KSAoIF9fZXh0ZW5zaW9uX18gKCB7IFwKKyAgICBjaGFyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9mZnNldF9tdXN0X2JlX3plcm9bIFwKKyAgICAgICAgLW9mZnNldG9mKHR5cGUsIGZpZWxkKV07IFwKKyAgICBjb250YWluZXJfb2YoZGV2LCB0eXBlLCBmaWVsZCk7fSkpCisjZWxzZQorI2RlZmluZSBET19VUENBU1QodHlwZSwgZmllbGQsIGRldikgY29udGFpbmVyX29mKGRldiwgdHlwZSwgZmllbGQpCisjZW5kaWYKKworLyoqKiBCVVMgQVBJLiAqKiovCisKK0J1c1N0YXRlICpxYnVzX2NyZWF0ZShCdXNUeXBlIHR5cGUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIERldmljZVN0YXRlICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpOworCisjZGVmaW5lIEZST01fUUJVUyh0eXBlLCBkZXYpIERPX1VQQ0FTVCh0eXBlLCBxYnVzLCBkZXYpCisKKy8qKiogbW9uaXRvciBjb21tYW5kcyAqKiovCisKK3ZvaWQgZG9faW5mb19xdHJlZShNb25pdG9yICptb24pOwordm9pZCBzeXNidXNfZGV2X3ByaW50KE1vbml0b3IgKm1vbiwgRGV2aWNlU3RhdGUgKmRldiwgaW50IGluZGVudCk7CisKK2NoYXIgKnFkZXZfZ2V0X2Rldl9wYXRoKERldmljZVN0YXRlICpkZXYpOworCisjZW5kaWYgIC8vIFFERVZfQ09SRV9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvcWRldi5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3FkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxM2FmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3FkZXYuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgUURFVl9ICisjZGVmaW5lIFFERVZfSAorCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9xZGV2LWNvcmUuaCIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvc3lzYnVzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvc3lzYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyN2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody9zeXNidXMuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIEhXX1NZU0JVU19ICisjZGVmaW5lIEhXX1NZU0JVU19IIDEKKworLyogRGV2aWNlcyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgbWFpbiBzeXN0ZW0gYnVzLiAgKi8KKworI2luY2x1ZGUgImV4ZWMvaHdhZGRyLmgiCisjaW5jbHVkZSAiaHcvcWRldi5oIgorCisjZGVmaW5lIFFERVZfTUFYX01NSU8gNQorI2RlZmluZSBRREVWX01BWF9JUlEgMzIKKwordHlwZWRlZiBzdHJ1Y3QgU3lzQnVzRGV2aWNlIFN5c0J1c0RldmljZTsKK3R5cGVkZWYgdm9pZCAoKm1taW9fbWFwZnVuYykoU3lzQnVzRGV2aWNlICpkZXYsIGh3YWRkciBhZGRyKTsKKworc3RydWN0IFN5c0J1c0RldmljZSB7CisgICAgRGV2aWNlU3RhdGUgcWRldjsKKyAgICBpbnQgbnVtX2lycTsKKyAgICBxZW11X2lycSBpcnFzW1FERVZfTUFYX0lSUV07CisgICAgcWVtdV9pcnEgKmlycXBbUURFVl9NQVhfSVJRXTsKKyAgICBpbnQgbnVtX21taW87CisgICAgc3RydWN0IHsKKyAgICAgICAgaHdhZGRyIGFkZHI7CisgICAgICAgIGh3YWRkciBzaXplOworICAgICAgICBtbWlvX21hcGZ1bmMgY2I7CisgICAgICAgIGludCBpb2Z1bmM7CisgICAgfSBtbWlvW1FERVZfTUFYX01NSU9dOworfTsKKwordHlwZWRlZiB2b2lkICgqc3lzYnVzX2luaXRmbikoU3lzQnVzRGV2aWNlICpkZXYpOworCisvKiBNYWNyb3MgdG8gY29tcGVuc2F0ZSBmb3IgbGFjayBvZiB0eXBlIGluaGVyaXRhbmNlIGluIEMuICAqLworI2RlZmluZSBzeXNidXNfZnJvbV9xZGV2KGRldikgKChTeXNCdXNEZXZpY2UgKikoZGV2KSkKKyNkZWZpbmUgRlJPTV9TWVNCVVModHlwZSwgZGV2KSBET19VUENBU1QodHlwZSwgYnVzZGV2LCBkZXYpCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEZXZpY2VJbmZvIHFkZXY7CisgICAgc3lzYnVzX2luaXRmbiBpbml0OworfSBTeXNCdXNEZXZpY2VJbmZvOworCit2b2lkIHN5c2J1c19yZWdpc3Rlcl9kZXYoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIHN5c2J1c19pbml0Zm4gaW5pdCk7Cit2b2lkIHN5c2J1c19yZWdpc3Rlcl93aXRocHJvcChTeXNCdXNEZXZpY2VJbmZvICppbmZvKTsKK3ZvaWQgKnN5c2J1c19uZXcodm9pZCk7Cit2b2lkIHN5c2J1c19pbml0X21taW8oU3lzQnVzRGV2aWNlICpkZXYsIGh3YWRkciBzaXplLCBpbnQgaW9mdW5jKTsKK3ZvaWQgc3lzYnVzX2luaXRfbW1pb19jYihTeXNCdXNEZXZpY2UgKmRldiwgaHdhZGRyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1pb19tYXBmdW5jIGNiKTsKK3ZvaWQgc3lzYnVzX2luaXRfaXJxKFN5c0J1c0RldmljZSAqZGV2LCBxZW11X2lycSAqcCk7Cit2b2lkIHN5c2J1c19wYXNzX2lycShTeXNCdXNEZXZpY2UgKmRldiwgU3lzQnVzRGV2aWNlICp0YXJnZXQpOworCisKK3ZvaWQgc3lzYnVzX2Nvbm5lY3RfaXJxKFN5c0J1c0RldmljZSAqZGV2LCBpbnQgbiwgcWVtdV9pcnEgaXJxKTsKK3ZvaWQgc3lzYnVzX21taW9fbWFwKFN5c0J1c0RldmljZSAqZGV2LCBpbnQgbiwgaHdhZGRyIGFkZHIpOworCisvKiBMZWdhY3kgaGVscGVyIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBkZXZpY2VzLiAgKi8KK0RldmljZVN0YXRlICpzeXNidXNfY3JlYXRlX3ZhcmFyZ3MoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWRkciBhZGRyLCAuLi4pOworc3RhdGljIGlubGluZSBEZXZpY2VTdGF0ZSAqc3lzYnVzX2NyZWF0ZV9zaW1wbGUoY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZW11X2lycSBpcnEpCit7CisgICAgcmV0dXJuIHN5c2J1c19jcmVhdGVfdmFyYXJncyhuYW1lLCBhZGRyLCBpcnEsIE5VTEwpOworfQorCisjZW5kaWYgLyogIUhXX1NZU0JVU19IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvaHcvdGltZXIvaHBldC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3RpbWVyL2hwZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTQwNTFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3RpbWVyL2hwZXQuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmCV9fSFBFVF9fCisjZGVmaW5lCV9fSFBFVF9fIDEKKworCisKK3N0cnVjdCBocGV0X2luZm8geworCXVuc2lnbmVkIGxvbmcgaGlfaXJlcWZyZXE7CS8qIEh6ICovCisJdW5zaWduZWQgbG9uZyBoaV9mbGFnczsJLyogaW5mb3JtYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBoaV9ocGV0OworCXVuc2lnbmVkIHNob3J0IGhpX3RpbWVyOworfTsKKworI2RlZmluZQlIUEVUX0lORk9fUEVSSU9ESUMJMHgwMDAxCS8qIHRpbWVyIGlzIHBlcmlvZGljICovCisKKyNkZWZpbmUJSFBFVF9JRV9PTglfSU8oJ2gnLCAweDAxKQkvKiBpbnRlcnJ1cHQgb24gKi8KKyNkZWZpbmUJSFBFVF9JRV9PRkYJX0lPKCdoJywgMHgwMikJLyogaW50ZXJydXB0IG9mZiAqLworI2RlZmluZQlIUEVUX0lORk8JX0lPUignaCcsIDB4MDMsIHN0cnVjdCBocGV0X2luZm8pCisjZGVmaW5lCUhQRVRfRVBJCV9JTygnaCcsIDB4MDQpCS8qIGVuYWJsZSBwZXJpb2RpYyAqLworI2RlZmluZQlIUEVUX0RQSQlfSU8oJ2gnLCAweDA1KQkvKiBkaXNhYmxlIHBlcmlvZGljICovCisjZGVmaW5lCUhQRVRfSVJRRlJFUQlfSU9XKCdoJywgMHg2LCB1bnNpZ25lZCBsb25nKQkvKiBJUlFGUkVRIHVzZWMgKi8KKworI2VuZGlmCQkJCS8qICFfX0hQRVRfXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL2h3L3hlbi94ZW4uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody94ZW4veGVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFmODhiZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9ody94ZW4veGVuLmgKQEAgLTAsMCArMSw1NSBAQAorI2lmbmRlZiBRRU1VX0hXX1hFTl9ICisjZGVmaW5lIFFFTVVfSFdfWEVOX0ggMQorLyoKKyAqIHB1YmxpYyB4ZW4gaGVhZGVyCisgKiAgIHN0dWZmIG5lZWRlZCBvdXRzaWRlIHhlbi0qLmMsIGkuZS4gaW50ZXJmYWNlcyB0byBxZW11LgorICogICBtdXN0IG5vdCBkZXBlbmQgb24gYW55IHhlbiBoZWFkZXJzIGJlaW5nIHByZXNlbnQgaW4KKyAqICAgL3Vzci9pbmNsdWRlL3hlbiwgc28gaXQgY2FuIGJlIGluY2x1ZGVkIHVuY29uZGl0aW9uYWxseS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJody9pcnEuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCisvKiB4ZW4tbWFjaGluZS5jICovCitlbnVtIHhlbl9tb2RlIHsKKyAgICBYRU5fRU1VTEFURSA9IDAsICAvLyB4ZW4gZW11bGF0aW9uLCB1c2luZyB4ZW5uZXIgKGRlZmF1bHQpCisgICAgWEVOX0NSRUFURSwgICAgICAgLy8gY3JlYXRlIHhlbiBkb21haW4KKyAgICBYRU5fQVRUQUNIICAgICAgICAvLyBhdHRhY2ggdG8geGVuIGRvbWFpbiBjcmVhdGVkIGJ5IHhlbmQKK307CisKK2V4dGVybiB1aW50MzJfdCB4ZW5fZG9taWQ7CitleHRlcm4gZW51bSB4ZW5fbW9kZSB4ZW5fbW9kZTsKKworZXh0ZXJuIGJvb2wgeGVuX2FsbG93ZWQ7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB4ZW5fZW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiB4ZW5fYWxsb3dlZDsKK30KKworaW50IHhlbl9wY2lfc2xvdF9nZXRfcGlycShQQ0lEZXZpY2UgKnBjaV9kZXYsIGludCBpcnFfbnVtKTsKK3ZvaWQgeGVuX3BpaXgzX3NldF9pcnEodm9pZCAqb3BhcXVlLCBpbnQgaXJxX251bSwgaW50IGxldmVsKTsKK3ZvaWQgeGVuX3BpaXhfcGNpX3dyaXRlX2NvbmZpZ19jbGllbnQodWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgdmFsLCBpbnQgbGVuKTsKK3ZvaWQgeGVuX2h2bV9pbmplY3RfbXNpKHVpbnQ2NF90IGFkZHIsIHVpbnQzMl90IGRhdGEpOwordm9pZCB4ZW5fY21vc19zZXRfczNfcmVzdW1lKHZvaWQgKm9wYXF1ZSwgaW50IGlycSwgaW50IGxldmVsKTsKKworcWVtdV9pcnEgKnhlbl9pbnRlcnJ1cHRfY29udHJvbGxlcl9pbml0KHZvaWQpOworCitpbnQgeGVuX2luaXQodm9pZCk7CitpbnQgeGVuX2h2bV9pbml0KE1lbW9yeVJlZ2lvbiAqKnJhbV9tZW1vcnkpOwordm9pZCB4ZW5zdG9yZV9zdG9yZV9wdl9jb25zb2xlX2luZm8oaW50IGksIHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNocik7CisKKyNpZiBkZWZpbmVkKE5FRURfQ1BVX0gpICYmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIHhlbl9yYW1fYWxsb2MocmFtX2FkZHJfdCByYW1fYWRkciwgcmFtX2FkZHJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBNZW1vcnlSZWdpb24gKm1yKTsKK3ZvaWQgeGVuX21vZGlmaWVkX21lbW9yeShyYW1fYWRkcl90IHN0YXJ0LCByYW1fYWRkcl90IGxlbmd0aCk7CisjZW5kaWYKKwordm9pZCB4ZW5fcmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RydWN0IE1lbW9yeVJlZ2lvbiAqbXIpOworCisjaWYgZGVmaW5lZChDT05GSUdfWEVOKSAmJiBDT05GSUdfWEVOX0NUUkxfSU5URVJGQUNFX1ZFUlNJT04gPCA0MDAKKyMgIGRlZmluZSBIVk1fTUFYX1ZDUFVTIDMyCisjZW5kaWYKKworI2VuZGlmIC8qIFFFTVVfSFdfWEVOX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9taWdyYXRpb24vbWlncmF0aW9uLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbWlncmF0aW9uL21pZ3JhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTQ1YjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbWlncmF0aW9uL21pZ3JhdGlvbi5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogUUVNVSBsaXZlIG1pZ3JhdGlvbgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX01JR1JBVElPTl9ICisjZGVmaW5lIFFFTVVfTUlHUkFUSU9OX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKKyNkZWZpbmUgTUlHX1NUQVRFX0VSUk9SCQktMQorI2RlZmluZSBNSUdfU1RBVEVfQ09NUExFVEVECTAKKyNkZWZpbmUgTUlHX1NUQVRFX0NBTkNFTExFRAkxCisjZGVmaW5lIE1JR19TVEFURV9BQ1RJVkUJMgorCit0eXBlZGVmIHN0cnVjdCBNaWdyYXRpb25TdGF0ZSBNaWdyYXRpb25TdGF0ZTsKKworc3RydWN0IE1pZ3JhdGlvblN0YXRlCit7CisgICAgLyogRklYTUU6IGFkZCBtb3JlIGFjY2Vzc29ycyB0byBwcmludCBtaWdyYXRpb24gaW5mbyAqLworICAgIHZvaWQgKCpjYW5jZWwpKE1pZ3JhdGlvblN0YXRlICpzKTsKKyAgICBpbnQgKCpnZXRfc3RhdHVzKShNaWdyYXRpb25TdGF0ZSAqcyk7CisgICAgdm9pZCAoKnJlbGVhc2UpKE1pZ3JhdGlvblN0YXRlICpzKTsKK307CisKK3R5cGVkZWYgc3RydWN0IEZkTWlncmF0aW9uU3RhdGUgRmRNaWdyYXRpb25TdGF0ZTsKKworc3RydWN0IEZkTWlncmF0aW9uU3RhdGUKK3sKKyAgICBNaWdyYXRpb25TdGF0ZSBtaWdfc3RhdGU7CisgICAgaW50NjRfdCBiYW5kd2lkdGhfbGltaXQ7CisgICAgUUVNVUZpbGUgKmZpbGU7CisgICAgaW50IGZkOworICAgIE1vbml0b3IgKm1vbl9yZXN1bWU7CisgICAgaW50IHN0YXRlOworICAgIGludCAoKmdldF9lcnJvcikoc3RydWN0IEZkTWlncmF0aW9uU3RhdGUqKTsKKyAgICBpbnQgKCpjbG9zZSkoc3RydWN0IEZkTWlncmF0aW9uU3RhdGUqKTsKKyAgICBpbnQgKCp3cml0ZSkoc3RydWN0IEZkTWlncmF0aW9uU3RhdGUqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisgICAgdm9pZCAqb3BhcXVlOworfTsKKwordm9pZCBxZW11X3N0YXJ0X2luY29taW5nX21pZ3JhdGlvbihjb25zdCBjaGFyICp1cmkpOworCit2b2lkIGRvX21pZ3JhdGUoTW9uaXRvciAqbW9uLCBpbnQgZGV0YWNoLCBjb25zdCBjaGFyICp1cmkpOworCit2b2lkIGRvX21pZ3JhdGVfY2FuY2VsKE1vbml0b3IgKm1vbik7CisKK3ZvaWQgZG9fbWlncmF0ZV9zZXRfc3BlZWQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKK3VpbnQ2NF90IG1pZ3JhdGVfbWF4X2Rvd250aW1lKHZvaWQpOworCit2b2lkIGRvX21pZ3JhdGVfc2V0X2Rvd250aW1lKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqdmFsdWUpOworCit2b2lkIGRvX2luZm9fbWlncmF0ZShNb25pdG9yICptb24pOworCitpbnQgZXhlY19zdGFydF9pbmNvbWluZ19taWdyYXRpb24oY29uc3QgY2hhciAqaG9zdF9wb3J0KTsKKworTWlncmF0aW9uU3RhdGUgKmV4ZWNfc3RhcnRfb3V0Z29pbmdfbWlncmF0aW9uKGNvbnN0IGNoYXIgKmhvc3RfcG9ydCwKKwkJCQkJICAgICBpbnQ2NF90IGJhbmR3aWR0aF9saW1pdCwKKwkJCQkJICAgICBpbnQgZGV0YWNoKTsKKworaW50IHRjcF9zdGFydF9pbmNvbWluZ19taWdyYXRpb24oY29uc3QgY2hhciAqaG9zdF9wb3J0KTsKKworTWlncmF0aW9uU3RhdGUgKnRjcF9zdGFydF9vdXRnb2luZ19taWdyYXRpb24oY29uc3QgY2hhciAqaG9zdF9wb3J0LAorCQkJCQkgICAgIGludDY0X3QgYmFuZHdpZHRoX2xpbWl0LAorCQkJCQkgICAgIGludCBkZXRhY2gpOworCit2b2lkIG1pZ3JhdGVfZmRfbW9uaXRvcl9zdXNwZW5kKEZkTWlncmF0aW9uU3RhdGUgKnMpOworCit2b2lkIG1pZ3JhdGVfZmRfZXJyb3IoRmRNaWdyYXRpb25TdGF0ZSAqcyk7CisKK3ZvaWQgbWlncmF0ZV9mZF9jbGVhbnVwKEZkTWlncmF0aW9uU3RhdGUgKnMpOworCit2b2lkIG1pZ3JhdGVfZmRfcHV0X25vdGlmeSh2b2lkICpvcGFxdWUpOworCitzc2l6ZV90IG1pZ3JhdGVfZmRfcHV0X2J1ZmZlcih2b2lkICpvcGFxdWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKwordm9pZCBtaWdyYXRlX2ZkX2Nvbm5lY3QoRmRNaWdyYXRpb25TdGF0ZSAqcyk7CisKK3ZvaWQgbWlncmF0ZV9mZF9wdXRfcmVhZHkodm9pZCAqb3BhcXVlKTsKKworaW50IG1pZ3JhdGVfZmRfZ2V0X3N0YXR1cyhNaWdyYXRpb25TdGF0ZSAqbWlnX3N0YXRlKTsKKwordm9pZCBtaWdyYXRlX2ZkX2NhbmNlbChNaWdyYXRpb25TdGF0ZSAqbWlnX3N0YXRlKTsKKwordm9pZCBtaWdyYXRlX2ZkX3JlbGVhc2UoTWlncmF0aW9uU3RhdGUgKm1pZ19zdGF0ZSk7CisKK3ZvaWQgbWlncmF0ZV9mZF93YWl0X2Zvcl91bmZyZWV6ZSh2b2lkICpvcGFxdWUpOworCitpbnQgbWlncmF0ZV9mZF9jbG9zZSh2b2lkICpvcGFxdWUpOworCitzdGF0aWMgaW5saW5lIEZkTWlncmF0aW9uU3RhdGUgKm1pZ3JhdGVfdG9fZm1zKE1pZ3JhdGlvblN0YXRlICptaWdfc3RhdGUpCit7CisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihtaWdfc3RhdGUsIEZkTWlncmF0aW9uU3RhdGUsIG1pZ19zdGF0ZSk7Cit9CisKK3VpbnQ2NF90IHJhbV9ieXRlc19yZW1haW5pbmcodm9pZCk7Cit1aW50NjRfdCByYW1fYnl0ZXNfdHJhbnNmZXJyZWQodm9pZCk7Cit1aW50NjRfdCByYW1fYnl0ZXNfdG90YWwodm9pZCk7CisKK2ludCByYW1fc2F2ZV9saXZlKFFFTVVGaWxlICpmLCBpbnQgc3RhZ2UsIHZvaWQgKm9wYXF1ZSk7CitpbnQgcmFtX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9taWdyYXRpb24vcWVtdS1maWxlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbWlncmF0aW9uL3FlbXUtZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWZlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbWlncmF0aW9uL3FlbXUtZmlsZS5oCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgUUVNVV9GSUxFX0gKKyNkZWZpbmUgUUVNVV9GSUxFX0ggMQorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+ICAvLyBmb3IgRklMRQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgLy8gb25seSBmb3Igc3NpemVfdCwgKnNpZ2gqCisKKyNpbmNsdWRlICJxZW11L3R5cGVkZWZzLmgiICAvLyBmb3IgUUVNVUZpbGUKKworc3RydWN0IGlvdmVjOworCisvLyBVcHN0cmVhbSB1c2VzIHRoaXMgdG8gZGVjbGFyZSByYW1fYWRkcl90LCBidXQgdGhpcyBmb3JjZXMgYQorLy8gc3R1cGlkIGRlcGVuZGVuY3kgdGhhdCBnZW5lcmF0ZXMgb3RoZXIgY29uZmxpY3RzLiBJbnN0ZWFkLCB0aGlzCisvLyBoZWFkZXIgdXNlcyB1aW50NjRfdCBpbnN0ZWFkIG9mIHJhbV9hZGRyX3QgZm9yIHBvcnRhYmlsaXR5LgorLy8jaW5jbHVkZSAiZXhlYy9jcHUtY29tbW9uLmgiCisKKy8qIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgY2h1bmsgb2YgZGF0YSB0byBhIGZpbGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICogVGhlIHBvcyBhcmd1bWVudCBjYW4gYmUgaWdub3JlZCBpZiB0aGUgZmlsZSBpcyBvbmx5IGJlaW5nIHVzZWQgZm9yCisgKiBzdHJlYW1pbmcuICBUaGUgaGFuZGxlciBzaG91bGQgdHJ5IHRvIHdyaXRlIGFsbCBvZiB0aGUgZGF0YSBpdCBjYW4uCisgKi8KK3R5cGVkZWYgaW50IChRRU1VRmlsZVB1dEJ1ZmZlckZ1bmMpKHZvaWQgKm9wYXF1ZSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MsIGludCBzaXplKTsKKworLyogUmVhZCBhIGNodW5rIG9mIGRhdGEgZnJvbSBhIGZpbGUgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiAgVGhlIHBvcyBhcmd1bWVudAorICogY2FuIGJlIGlnbm9yZWQgaWYgdGhlIGZpbGUgaXMgb25seSBiZSB1c2VkIGZvciBzdHJlYW1pbmcuICBUaGUgbnVtYmVyIG9mCisgKiBieXRlcyBhY3R1YWxseSByZWFkIHNob3VsZCBiZSByZXR1cm5lZC4KKyAqLwordHlwZWRlZiBpbnQgKFFFTVVGaWxlR2V0QnVmZmVyRnVuYykodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IHNpemUpOworCisvKiBDbG9zZSBhIGZpbGUKKyAqCisgKiBSZXR1cm4gbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGVycm9yLCAwIG9yIHBvc2l0aXZlIHZhbHVlIG9uIHN1Y2Nlc3MuCisgKgorICogVGhlIG1lYW5pbmcgb2YgcmV0dXJuIHZhbHVlIG9uIHN1Y2Nlc3MgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgYmFjay1lbmQgYmVpbmcKKyAqIHVzZWQuCisgKi8KK3R5cGVkZWYgaW50IChRRU1VRmlsZUNsb3NlRnVuYykodm9pZCAqb3BhcXVlKTsKKworLyogQ2FsbGVkIHRvIHJldHVybiB0aGUgT1MgZmlsZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIFFFTVVGaWxlLgorICovCit0eXBlZGVmIGludCAoUUVNVUZpbGVHZXRGRCkodm9pZCAqb3BhcXVlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGFuIGlvdmVjIHRvIGZpbGUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCAoUUVNVUZpbGVXcml0ZXZCdWZmZXJGdW5jKSh2b2lkICpvcGFxdWUsIHN0cnVjdCBpb3ZlYyAqaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb3ZjbnQsIGludDY0X3QgcG9zKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgaG9va3MgYXJvdW5kIGRpZmZlcmVudAorICogc3RhZ2VzIG9mIFJBTSBtaWdyYXRpb24uCisgKi8KK3R5cGVkZWYgaW50IChRRU1VUmFtSG9va0Z1bmMpKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIHVpbnQ2NF90IGZsYWdzKTsKKworLyoKKyAqIENvbnN0YW50cyB1c2VkIGJ5IHJhbV9jb250cm9sXyogaG9va3MKKyAqLworI2RlZmluZSBSQU1fQ09OVFJPTF9TRVRVUCAgICAwCisjZGVmaW5lIFJBTV9DT05UUk9MX1JPVU5EICAgIDEKKyNkZWZpbmUgUkFNX0NPTlRST0xfSE9PSyAgICAgMgorI2RlZmluZSBSQU1fQ09OVFJPTF9GSU5JU0ggICAzCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBvdmVycmlkZSBvZiB3aGVyZSB0aGUgUkFNIHBhZ2UKKyAqIGlzIHNhdmVkIChzdWNoIGFzIFJETUEsIGZvciBleGFtcGxlLikKKyAqLworLy8gTk9URShkaWdpdCk6IFVwc3RyZWFtIHVzZXMgcmFtX2FkZHJfdCBpbnN0ZWFkIG9mIHVpbnQ2NF90IGhlcmUuCit0eXBlZGVmIHNpemVfdCAoUUVNVVJhbVNhdmVGdW5jKShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlc19zZW50KTsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVUZpbGVPcHMgeworICAgIFFFTVVGaWxlUHV0QnVmZmVyRnVuYyAqcHV0X2J1ZmZlcjsKKyAgICBRRU1VRmlsZUdldEJ1ZmZlckZ1bmMgKmdldF9idWZmZXI7CisgICAgUUVNVUZpbGVDbG9zZUZ1bmMgKmNsb3NlOworICAgIFFFTVVGaWxlR2V0RkQgKmdldF9mZDsKKyAgICBRRU1VRmlsZVdyaXRldkJ1ZmZlckZ1bmMgKndyaXRldl9idWZmZXI7CisgICAgUUVNVVJhbUhvb2tGdW5jICpiZWZvcmVfcmFtX2l0ZXJhdGU7CisgICAgUUVNVVJhbUhvb2tGdW5jICphZnRlcl9yYW1faXRlcmF0ZTsKKyAgICBRRU1VUmFtSG9va0Z1bmMgKmhvb2tfcmFtX2xvYWQ7CisgICAgUUVNVVJhbVNhdmVGdW5jICpzYXZlX3BhZ2U7Cit9IFFFTVVGaWxlT3BzOworCitRRU1VRmlsZSAqcWVtdV9mb3Blbl9vcHModm9pZCAqb3BhcXVlLCBjb25zdCBRRU1VRmlsZU9wcyAqb3BzKTsKK1FFTVVGaWxlICpxZW11X2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKTsKK1FFTVVGaWxlICpxZW11X2Zkb3BlbihpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpOworUUVNVUZpbGUgKnFlbXVfZm9wZW5fc29ja2V0KGludCBmZCwgY29uc3QgY2hhciAqbW9kZSk7CitRRU1VRmlsZSAqcWVtdV9wb3Blbl9jbWQoY29uc3QgY2hhciAqY29tbWFuZCwgY29uc3QgY2hhciAqbW9kZSk7CitpbnQgcWVtdV9nZXRfZmQoUUVNVUZpbGUgKmYpOworaW50IHFlbXVfZmNsb3NlKFFFTVVGaWxlICpmKTsKK2ludDY0X3QgcWVtdV9mdGVsbChRRU1VRmlsZSAqZik7Cit2b2lkIHFlbXVfcHV0X2J1ZmZlcihRRU1VRmlsZSAqZiwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7Cit2b2lkIHFlbXVfcHV0X2J5dGUoUUVNVUZpbGUgKmYsIGludCB2KTsKKwordm9pZCBxZW11X2ZpbGVfc2V0X2Vycm9yKFFFTVVGaWxlKiBmLCBpbnQgZXJyb3IpOworaW50IHFlbXVfZmlsZV9oYXNfZXJyb3IoUUVNVUZpbGUqIGYpOwordm9pZCBxZW11X2ZpbGVfcHV0X25vdGlmeShRRU1VRmlsZSogZik7CisKKy8qCisgKiBwdXRfYnVmZmVyIHdpdGhvdXQgY29weWluZyB0aGUgYnVmZmVyLgorICogVGhlIGJ1ZmZlciBzaG91bGQgYmUgYXZhaWxhYmxlIHRpbGwgaXQgaXMgc2VudCBhc3luY2hyb25vdXNseS4KKyAqLwordm9pZCBxZW11X3B1dF9idWZmZXJfYXN5bmMoUUVNVUZpbGUgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworYm9vbCBxZW11X2ZpbGVfbW9kZV9pc19ub3RfdmFsaWQoY29uc3QgY2hhciAqbW9kZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF91Ynl0ZShRRU1VRmlsZSAqZiwgdW5zaWduZWQgaW50IHYpCit7CisgICAgcWVtdV9wdXRfYnl0ZShmLCAoaW50KXYpOworfQorCisjZGVmaW5lIHFlbXVfcHV0X3NieXRlIHFlbXVfcHV0X2J5dGUKKwordm9pZCBxZW11X3B1dF9iZTE2KFFFTVVGaWxlICpmLCB1bnNpZ25lZCBpbnQgdik7Cit2b2lkIHFlbXVfcHV0X2JlMzIoUUVNVUZpbGUgKmYsIHVuc2lnbmVkIGludCB2KTsKK3ZvaWQgcWVtdV9wdXRfYmU2NChRRU1VRmlsZSAqZiwgdWludDY0X3Qgdik7CitpbnQgcWVtdV9nZXRfYnVmZmVyKFFFTVVGaWxlICpmLCB1aW50OF90ICpidWYsIGludCBzaXplKTsKK2ludCBxZW11X2dldF9ieXRlKFFFTVVGaWxlICpmKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAordm9pZCBxZW11X3B1dF9mbG9hdChRRU1VRmlsZSAqZiwgZmxvYXQgdik7CisjZW5kaWYKKwordm9pZCBxZW11X3VwZGF0ZV9wb3NpdGlvbihRRU1VRmlsZSAqZiwgc2l6ZV90IHNpemUpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxZW11X2dldF91Ynl0ZShRRU1VRmlsZSAqZikKK3sKKyAgICByZXR1cm4gKHVuc2lnbmVkIGludClxZW11X2dldF9ieXRlKGYpOworfQorCisjZGVmaW5lIHFlbXVfZ2V0X3NieXRlIHFlbXVfZ2V0X2J5dGUKKwordW5zaWduZWQgaW50IHFlbXVfZ2V0X2JlMTYoUUVNVUZpbGUgKmYpOwordW5zaWduZWQgaW50IHFlbXVfZ2V0X2JlMzIoUUVNVUZpbGUgKmYpOwordWludDY0X3QgcWVtdV9nZXRfYmU2NChRRU1VRmlsZSAqZik7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKK2Zsb2F0IHFlbXVfZ2V0X2Zsb2F0KFFFTVVGaWxlICpmKTsKKyNlbmRpZgoraW50IHFlbXVfZmlsZV9yYXRlX2xpbWl0KFFFTVVGaWxlICpmKTsKK3ZvaWQgcWVtdV9maWxlX3Jlc2V0X3JhdGVfbGltaXQoUUVNVUZpbGUgKmYpOwordm9pZCBxZW11X2ZpbGVfc2V0X3JhdGVfbGltaXQoUUVNVUZpbGUgKmYsIGludDY0X3QgbmV3X3JhdGUpOworaW50NjRfdCBxZW11X2ZpbGVfZ2V0X3JhdGVfbGltaXQoUUVNVUZpbGUgKmYpOworaW50IHFlbXVfZmlsZV9nZXRfZXJyb3IoUUVNVUZpbGUgKmYpOwordm9pZCBxZW11X2ZmbHVzaChRRU1VRmlsZSAqZik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF9iZTY0cyhRRU1VRmlsZSAqZiwgY29uc3QgdWludDY0X3QgKnB2KQoreworICAgIHFlbXVfcHV0X2JlNjQoZiwgKnB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlbXVfcHV0X2JlMzJzKFFFTVVGaWxlICpmLCBjb25zdCB1aW50MzJfdCAqcHYpCit7CisgICAgcWVtdV9wdXRfYmUzMihmLCAqcHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9wdXRfYmUxNnMoUUVNVUZpbGUgKmYsIGNvbnN0IHVpbnQxNl90ICpwdikKK3sKKyAgICBxZW11X3B1dF9iZTE2KGYsICpwdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF84cyhRRU1VRmlsZSAqZiwgY29uc3QgdWludDhfdCAqcHYpCit7CisgICAgcWVtdV9wdXRfYnl0ZShmLCAqcHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9nZXRfYmU2NHMoUUVNVUZpbGUgKmYsIHVpbnQ2NF90ICpwdikKK3sKKyAgICAqcHYgPSBxZW11X2dldF9iZTY0KGYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9nZXRfYmUzMnMoUUVNVUZpbGUgKmYsIHVpbnQzMl90ICpwdikKK3sKKyAgICAqcHYgPSBxZW11X2dldF9iZTMyKGYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9nZXRfYmUxNnMoUUVNVUZpbGUgKmYsIHVpbnQxNl90ICpwdikKK3sKKyAgICAqcHYgPSBxZW11X2dldF9iZTE2KGYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9nZXRfOHMoUUVNVUZpbGUgKmYsIHVpbnQ4X3QgKnB2KQoreworICAgICpwdiA9IHFlbXVfZ2V0X2J5dGUoZik7Cit9CisKKy8vIFNpZ25lZCB2ZXJzaW9ucyBmb3IgdHlwZSBzYWZldHkKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF9zYnVmZmVyKFFFTVVGaWxlICpmLCBjb25zdCBpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsIChjb25zdCB1aW50OF90ICopYnVmLCBzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlbXVfcHV0X3NiZTE2KFFFTVVGaWxlICpmLCBpbnQgdikKK3sKKyAgICBxZW11X3B1dF9iZTE2KGYsICh1bnNpZ25lZCBpbnQpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF9zYmUzMihRRU1VRmlsZSAqZiwgaW50IHYpCit7CisgICAgcWVtdV9wdXRfYmUzMihmLCAodW5zaWduZWQgaW50KXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9wdXRfc2JlNjQoUUVNVUZpbGUgKmYsIGludDY0X3QgdikKK3sKKyAgICBxZW11X3B1dF9iZTY0KGYsICh1aW50NjRfdCl2KTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QgcWVtdV9nZXRfc2J1ZmZlcihRRU1VRmlsZSAqZiwgaW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIHJldHVybiBxZW11X2dldF9idWZmZXIoZiwgKHVpbnQ4X3QgKilidWYsIHNpemUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBxZW11X2dldF9zYmUxNihRRU1VRmlsZSAqZikKK3sKKyAgICByZXR1cm4gKGludClxZW11X2dldF9iZTE2KGYpOworfQorCitzdGF0aWMgaW5saW5lIGludCBxZW11X2dldF9zYmUzMihRRU1VRmlsZSAqZikKK3sKKyAgICByZXR1cm4gKGludClxZW11X2dldF9iZTMyKGYpOworfQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgcWVtdV9nZXRfc2JlNjQoUUVNVUZpbGUgKmYpCit7CisgICAgcmV0dXJuIChpbnQ2NF90KXFlbXVfZ2V0X2JlNjQoZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF9zOHMoUUVNVUZpbGUgKmYsIGNvbnN0IGludDhfdCAqcHYpCit7CisgICAgcWVtdV9wdXRfOHMoZiwgKGNvbnN0IHVpbnQ4X3QgKilwdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3B1dF9zYmUxNnMoUUVNVUZpbGUgKmYsIGNvbnN0IGludDE2X3QgKnB2KQoreworICAgIHFlbXVfcHV0X2JlMTZzKGYsIChjb25zdCB1aW50MTZfdCAqKXB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlbXVfcHV0X3NiZTMycyhRRU1VRmlsZSAqZiwgY29uc3QgaW50MzJfdCAqcHYpCit7CisgICAgcWVtdV9wdXRfYmUzMnMoZiwgKGNvbnN0IHVpbnQzMl90ICopcHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9wdXRfc2JlNjRzKFFFTVVGaWxlICpmLCBjb25zdCBpbnQ2NF90ICpwdikKK3sKKyAgICBxZW11X3B1dF9iZTY0cyhmLCAoY29uc3QgdWludDY0X3QgKilwdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2dldF9zOHMoUUVNVUZpbGUgKmYsIGludDhfdCAqcHYpCit7CisgICAgcWVtdV9nZXRfOHMoZiwgKHVpbnQ4X3QgKilwdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2dldF9zYmUxNnMoUUVNVUZpbGUgKmYsIGludDE2X3QgKnB2KQoreworICAgIHFlbXVfZ2V0X2JlMTZzKGYsICh1aW50MTZfdCAqKXB2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFlbXVfZ2V0X3NiZTMycyhRRU1VRmlsZSAqZiwgaW50MzJfdCAqcHYpCit7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgKHVpbnQzMl90ICopcHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9nZXRfc2JlNjRzKFFFTVVGaWxlICpmLCBpbnQ2NF90ICpwdikKK3sKKyAgICBxZW11X2dldF9iZTY0cyhmLCAodWludDY0X3QgKilwdik7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAordm9pZCBxZW11X3B1dF9zdHJpbmcoUUVNVUZpbGUgKmYsIGNvbnN0IGNoYXIqIHN0cik7CitjaGFyKiBxZW11X2dldF9zdHJpbmcoUUVNVUZpbGUgKmYpOworI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgUV9GSUVMRF9FTkQsICAgICAgICAgIC8qIG1hcmsgZW5kIG9mIGZpZWxkIGxpc3QgKi8KKyAgICBRX0ZJRUxEX0JZVEUsICAgICAgICAgLyogZm9yIDEtYnl0ZSBmaWVsZHMgKi8KKyAgICBRX0ZJRUxEX0lOVDE2LCAgICAgICAgLyogZm9yIDItYnl0ZSBmaWVsZHMgKi8KKyAgICBRX0ZJRUxEX0lOVDMyLCAgICAgICAgLyogZm9yIDQtYnl0ZSBmaWVsZHMgKi8KKyAgICBRX0ZJRUxEX0lOVDY0LCAgICAgICAgLyogZm9yIDgtYnl0ZSBmaWVsZHMgKi8KKyAgICBRX0ZJRUxEX0JVRkZFUiwgICAgICAgLyogZm9yIGJ1ZmZlciBmaWVsZHMgKi8KKyAgICBRX0ZJRUxEX0JVRkZFUl9TSVpFLCAgLyogdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiBidWZmZXJzICovCit9IFFGaWVsZFR5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBRRmllbGRUeXBlICB0eXBlIDogMTY7IC8qIGZpZWxkIHR5cGUgKi8KKyAgICB1aW50MTZfdCAgICBvZmZzZXQ7ICAgIC8qIG9mZnNldCBvZiBmaWVsZCBpbiBzdHJ1Y3R1cmUgKi8KK30gUUZpZWxkOworCisjZGVmaW5lICBRRklFTERfQkVHSU4obmFtZSkgIFwKKyAgICBzdGF0aWMgY29uc3QgUUZpZWxkICAgIG5hbWVbXSA9IHsKKworI2RlZmluZSAgX1FGSUVMRF8odCwgZikgICAgeyB0LCBvZmZzZXRvZihRRklFTERfU1RSVUNULGYpIH0KKyNkZWZpbmUgIFFGSUVMRF9CWVRFKGYpICAgX1FGSUVMRF8oUV9GSUVMRF9CWVRFLCBmKQorI2RlZmluZSAgUUZJRUxEX0lOVDE2KGYpICBfUUZJRUxEXyhRX0ZJRUxEX0lOVDE2LCBmKQorI2RlZmluZSAgUUZJRUxEX0lOVDMyKGYpICBfUUZJRUxEXyhRX0ZJRUxEX0lOVDMyLCBmKQorI2RlZmluZSAgUUZJRUxEX0lOVDY0KGYpICBfUUZJRUxEXyhRX0ZJRUxEX0lOVDY0LCBmKQorI2RlZmluZSAgUUZJRUxEX1RMKGYpICAgICBfUUZJRUxEXyhRX0ZJRUxEX1RMLCBmKQorCisjZGVmaW5lICBfUUZJRUxEX1NJWkVPRihmKSAgIHNpemVvZigoKFFGSUVMRF9TVFJVQ1QqKTApLT5mKQorCisjZGVmaW5lICBRRklFTERfQlVGRkVSKGYpICBcCisgICAgX1FGSUVMRF8oUV9GSUVMRF9CVUZGRVIsIGYpLCBcCisgICAgeyBRX0ZJRUxEX0JVRkZFUl9TSVpFLCAodWludDE2X3QpKF9RRklFTERfU0laRU9GKGYpID4+IDE2KSB9LCBcCisgICAgeyBRX0ZJRUxEX0JVRkZFUl9TSVpFLCAodWludDE2X3QpIF9RRklFTERfU0laRU9GKGYpIH0KKworI2RlZmluZSAgUUZJRUxEX0VORCAgICAgICAgICAgXAorICAgICAgICB7IFFfRklFTERfRU5ELCAwIH0sICAgXAorICAgIH07CisKK2V4dGVybiB2b2lkICBxZW11X3B1dF9zdHJ1Y3QoUUVNVUZpbGUqICBmLCBjb25zdCBRRmllbGQqICBmaWVsZHMsIGNvbnN0IHZvaWQqICBzKTsKK2V4dGVybiBpbnQgICBxZW11X2dldF9zdHJ1Y3QoUUVNVUZpbGUqICBmLCBjb25zdCBRRmllbGQqICBmaWVsZHMsIHZvaWQqICBzKTsKKworI2VuZGlmIC8qIF9RRU1VX0ZJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL21pZ3JhdGlvbi92bXN0YXRlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbWlncmF0aW9uL3Ztc3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI1ODJiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL21pZ3JhdGlvbi92bXN0YXRlLmgKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiBRRU1VIG1pZ3JhdGlvbi9zbmFwc2hvdCBkZWNsYXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSBSZWQgSGF0LCBJbmMuCisgKgorICogT3JpZ2luYWwgYXV0aG9yOiBKdWFuIFF1aW50ZWxhIDxxdWludGVsYUByZWRoYXQuY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBRRU1VX1ZNU1RBVEVfSAorI2RlZmluZSBRRU1VX1ZNU1RBVEVfSCAxCisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorI2luY2x1ZGUgPG1pZ3JhdGlvbi9xZW11LWZpbGUuaD4KKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgU2F2ZVN0YXRlSGFuZGxlcihRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKTsKK3R5cGVkZWYgaW50IFNhdmVMaXZlU3RhdGVIYW5kbGVyKFFFTVVGaWxlICpmLCBpbnQgc3RhZ2UsIHZvaWQgKm9wYXF1ZSk7Cit0eXBlZGVmIGludCBMb2FkU3RhdGVIYW5kbGVyKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgU2F2ZVZNSGFuZGxlcnMgeworI2lmIDAgICAgCisgICAgLyogVGhpcyBydW5zIGluc2lkZSB0aGUgaW90aHJlYWQgbG9jay4gICovCisgICAgdm9pZCAoKnNldF9wYXJhbXMpKGNvbnN0IE1pZ3JhdGlvblBhcmFtcyAqcGFyYW1zLCB2b2lkICogb3BhcXVlKTsKKyNlbmRpZiAgICAKKyAgICBTYXZlU3RhdGVIYW5kbGVyICpzYXZlX3N0YXRlOworICAgIFNhdmVMaXZlU3RhdGVIYW5kbGVyICpzYXZlX2xpdmVfc3RhdGU7CisjaWYgMAorICAgIHZvaWQgKCpjYW5jZWwpKHZvaWQgKm9wYXF1ZSk7CisgICAgaW50ICgqc2F2ZV9saXZlX2NvbXBsZXRlKShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKTsKKworICAgIC8qIFRoaXMgcnVucyBib3RoIG91dHNpZGUgYW5kIGluc2lkZSB0aGUgaW90aHJlYWQgbG9jay4gICovCisgICAgYm9vbCAoKmlzX2FjdGl2ZSkodm9pZCAqb3BhcXVlKTsKKworICAgIC8qIFRoaXMgcnVucyBvdXRzaWRlIHRoZSBpb3RocmVhZCBsb2NrIGluIHRoZSBtaWdyYXRpb24gY2FzZSwgYW5kCisgICAgICogd2l0aGluIHRoZSBsb2NrIGluIHRoZSBzYXZldm0gY2FzZS4gIFRoZSBjYWxsYmFjayBoYWQgYmV0dGVyIG9ubHkKKyAgICAgKiB1c2UgZGF0YSB0aGF0IGlzIGxvY2FsIHRvIHRoZSBtaWdyYXRpb24gdGhyZWFkIG9yIHByb3RlY3RlZAorICAgICAqIGJ5IG90aGVyIGxvY2tzLgorICAgICAqLworICAgIGludCAoKnNhdmVfbGl2ZV9pdGVyYXRlKShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKTsKKworICAgIC8qIFRoaXMgcnVucyBvdXRzaWRlIHRoZSBpb3RocmVhZCBsb2NrISAgKi8KKyAgICBpbnQgKCpzYXZlX2xpdmVfc2V0dXApKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpOworICAgIHVpbnQ2NF90ICgqc2F2ZV9saXZlX3BlbmRpbmcpKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIHVpbnQ2NF90IG1heF9zaXplKTsKKyNlbmRpZgorICAgIExvYWRTdGF0ZUhhbmRsZXIgKmxvYWRfc3RhdGU7Cit9IFNhdmVWTUhhbmRsZXJzOworCitpbnQgcmVnaXN0ZXJfc2F2ZXZtKERldmljZVN0YXRlKiBkZXYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkc3RyLAorICAgICAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VfaWQsCisgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uX2lkLAorICAgICAgICAgICAgICAgICAgICBTYXZlU3RhdGVIYW5kbGVyICpzYXZlX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICBMb2FkU3RhdGVIYW5kbGVyICpsb2FkX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpOworCitpbnQgcmVnaXN0ZXJfc2F2ZXZtX2xpdmUoRGV2aWNlU3RhdGUqIGRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppZHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5zdGFuY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZVZNSGFuZGxlcnMgKm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpOworCit2b2lkIHVucmVnaXN0ZXJfc2F2ZXZtKERldmljZVN0YXRlKiBkZXYsIGNvbnN0IGNoYXIgKmlkc3RyLCB2b2lkICpvcGFxdWUpOwordm9pZCByZWdpc3Rlcl9kZXZpY2VfdW5taWdyYXRhYmxlKERldmljZVN0YXRlICpkZXYsIGNvbnN0IGNoYXIgKmlkc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisKK3R5cGVkZWYgc3RydWN0IFZNU3RhdGVJbmZvIFZNU3RhdGVJbmZvOwordHlwZWRlZiBzdHJ1Y3QgVk1TdGF0ZURlc2NyaXB0aW9uIFZNU3RhdGVEZXNjcmlwdGlvbjsKKworc3RydWN0IFZNU3RhdGVJbmZvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCAoKmdldCkoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSk7CisgICAgdm9pZCAoKnB1dCkoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSk7Cit9OworCitlbnVtIFZNU3RhdGVGbGFncyB7CisgICAgVk1TX1NJTkdMRSAgICAgICAgICAgPSAweDAwMSwKKyAgICBWTVNfUE9JTlRFUiAgICAgICAgICA9IDB4MDAyLAorICAgIFZNU19BUlJBWSAgICAgICAgICAgID0gMHgwMDQsCisgICAgVk1TX1NUUlVDVCAgICAgICAgICAgPSAweDAwOCwKKyAgICBWTVNfVkFSUkFZX0lOVDMyICAgICA9IDB4MDEwLCAgLyogQXJyYXkgd2l0aCBzaXplIGluIGludDMyX3QgZmllbGQqLworICAgIFZNU19CVUZGRVIgICAgICAgICAgID0gMHgwMjAsICAvKiBzdGF0aWMgc2l6ZWQgYnVmZmVyICovCisgICAgVk1TX0FSUkFZX09GX1BPSU5URVIgPSAweDA0MCwKKyAgICBWTVNfVkFSUkFZX1VJTlQxNiAgICA9IDB4MDgwLCAgLyogQXJyYXkgd2l0aCBzaXplIGluIHVpbnQxNl90IGZpZWxkICovCisgICAgVk1TX1ZCVUZGRVIgICAgICAgICAgPSAweDEwMCwgIC8qIEJ1ZmZlciB3aXRoIHNpemUgaW4gaW50MzJfdCBmaWVsZCAqLworICAgIFZNU19NVUxUSVBMWSAgICAgICAgID0gMHgyMDAsICAvKiBtdWx0aXBseSAic2l6ZSIgZmllbGQgYnkgZmllbGRfc2l6ZSAqLworICAgIFZNU19WQVJSQVlfVUlOVDggICAgID0gMHg0MDAsICAvKiBBcnJheSB3aXRoIHNpemUgaW4gdWludDhfdCBmaWVsZCovCisgICAgVk1TX1ZBUlJBWV9VSU5UMzIgICAgPSAweDgwMCwgIC8qIEFycmF5IHdpdGggc2l6ZSBpbiB1aW50MzJfdCBmaWVsZCovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworICAgIHNpemVfdCBzdGFydDsKKyAgICBpbnQgbnVtOworICAgIHNpemVfdCBudW1fb2Zmc2V0OworICAgIHNpemVfdCBzaXplX29mZnNldDsKKyAgICBjb25zdCBWTVN0YXRlSW5mbyAqaW5mbzsKKyAgICBlbnVtIFZNU3RhdGVGbGFncyBmbGFnczsKKyAgICBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnZtc2Q7CisgICAgaW50IHZlcnNpb25faWQ7CisgICAgYm9vbCAoKmZpZWxkX2V4aXN0cykodm9pZCAqb3BhcXVlLCBpbnQgdmVyc2lvbl9pZCk7Cit9IFZNU3RhdGVGaWVsZDsKKwordHlwZWRlZiBzdHJ1Y3QgVk1TdGF0ZVN1YnNlY3Rpb24geworICAgIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiAqdm1zZDsKKyAgICBib29sICgqbmVlZGVkKSh2b2lkICpvcGFxdWUpOworfSBWTVN0YXRlU3Vic2VjdGlvbjsKKworc3RydWN0IFZNU3RhdGVEZXNjcmlwdGlvbiB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgdW5taWdyYXRhYmxlOworICAgIGludCB2ZXJzaW9uX2lkOworICAgIGludCBtaW5pbXVtX3ZlcnNpb25faWQ7CisgICAgaW50IG1pbmltdW1fdmVyc2lvbl9pZF9vbGQ7CisgICAgTG9hZFN0YXRlSGFuZGxlciAqbG9hZF9zdGF0ZV9vbGQ7CisgICAgaW50ICgqcHJlX2xvYWQpKHZvaWQgKm9wYXF1ZSk7CisgICAgaW50ICgqcG9zdF9sb2FkKSh2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKTsKKyAgICB2b2lkICgqcHJlX3NhdmUpKHZvaWQgKm9wYXF1ZSk7CisgICAgVk1TdGF0ZUZpZWxkICpmaWVsZHM7CisgICAgY29uc3QgVk1TdGF0ZVN1YnNlY3Rpb24gKnN1YnNlY3Rpb25zOworfTsKKworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKK2V4dGVybiBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gdm1zdGF0ZV9kdW1teTsKKyNlbmRpZgorCitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2Jvb2w7CisKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9faW50ODsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9faW50MTY7CitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDMyOworZXh0ZXJuIGNvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb19pbnQ2NDsKKworZXh0ZXJuIGNvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb191aW50OF9lcXVhbDsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDE2X2VxdWFsOworZXh0ZXJuIGNvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb19pbnQzMl9lcXVhbDsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDMyX2VxdWFsOworZXh0ZXJuIGNvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb191aW50NjRfZXF1YWw7CitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDMyX2xlOworCitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQ4OworZXh0ZXJuIGNvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb191aW50MTY7CitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQzMjsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDY0OworCitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2Zsb2F0NjQ7CisKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdGltZXI7CitleHRlcm4gY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2J1ZmZlcjsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdW51c2VkX2J1ZmZlcjsKK2V4dGVybiBjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fYml0bWFwOworCisjZGVmaW5lIHR5cGVfY2hlY2tfMmRhcnJheSh0MSx0MixuLG0pICgodDEoKilbbl1bbV0pMCAtICh0MiopMCkKKyNkZWZpbmUgdHlwZV9jaGVja19hcnJheSh0MSx0MixuKSAoKHQxKCopW25dKTAgLSAodDIqKTApCisjZGVmaW5lIHR5cGVfY2hlY2tfcG9pbnRlcih0MSx0MikgKCh0MSoqKTAgLSAodDIqKTApCisKKyNkZWZpbmUgdm1zdGF0ZV9vZmZzZXRfdmFsdWUoX3N0YXRlLCBfZmllbGQsIF90eXBlKSAgICAgICAgICAgICAgICAgIFwKKyAgICAob2Zmc2V0b2YoX3N0YXRlLCBfZmllbGQpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdHlwZV9jaGVjayhfdHlwZSwgdHlwZW9mX2ZpZWxkKF9zdGF0ZSwgX2ZpZWxkKSkpCisKKyNkZWZpbmUgdm1zdGF0ZV9vZmZzZXRfcG9pbnRlcihfc3RhdGUsIF9maWVsZCwgX3R5cGUpICAgICAgICAgICAgICAgIFwKKyAgICAob2Zmc2V0b2YoX3N0YXRlLCBfZmllbGQpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgdHlwZV9jaGVja19wb2ludGVyKF90eXBlLCB0eXBlb2ZfZmllbGQoX3N0YXRlLCBfZmllbGQpKSkKKworI2RlZmluZSB2bXN0YXRlX29mZnNldF9hcnJheShfc3RhdGUsIF9maWVsZCwgX3R5cGUsIF9udW0pICAgICAgICAgICAgXAorICAgIChvZmZzZXRvZihfc3RhdGUsIF9maWVsZCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB0eXBlX2NoZWNrX2FycmF5KF90eXBlLCB0eXBlb2ZfZmllbGQoX3N0YXRlLCBfZmllbGQpLCBfbnVtKSkKKworI2RlZmluZSB2bXN0YXRlX29mZnNldF8yZGFycmF5KF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSwgX24xLCBfbjIpICAgICAgXAorICAgIChvZmZzZXRvZihfc3RhdGUsIF9maWVsZCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB0eXBlX2NoZWNrXzJkYXJyYXkoX3R5cGUsIHR5cGVvZl9maWVsZChfc3RhdGUsIF9maWVsZCksIF9uMSwgX24yKSkKKworI2RlZmluZSB2bXN0YXRlX29mZnNldF9zdWJfYXJyYXkoX3N0YXRlLCBfZmllbGQsIF90eXBlLCBfc3RhcnQpICAgICAgXAorICAgIChvZmZzZXRvZihfc3RhdGUsIF9maWVsZFtfc3RhcnRdKSkKKworI2RlZmluZSB2bXN0YXRlX29mZnNldF9idWZmZXIoX3N0YXRlLCBfZmllbGQpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZtc3RhdGVfb2Zmc2V0X2FycmF5KF9zdGF0ZSwgX2ZpZWxkLCB1aW50OF90LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0eXBlb2ZfZmllbGQoX3N0YXRlLCBfZmllbGQpKSkKKworI2RlZmluZSBWTVNUQVRFX1NJTkdMRV9URVNUKF9maWVsZCwgX3N0YXRlLCBfdGVzdCwgX3ZlcnNpb24sIF9pbmZvLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgICA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZpZWxkX2V4aXN0cyA9IChfdGVzdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmluZm8gICAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgICA9IFZNU19TSU5HTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgICA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSksICAgICBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9QT0lOVEVSKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX2luZm8sIF90eXBlKSB7ICAgIFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5mbyAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19TSU5HTEV8Vk1TX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSksICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1BPSU5URVJfVEVTVChfZmllbGQsIF9zdGF0ZSwgX3Rlc3QsIF9pbmZvLCBfdHlwZSkgeyAgXAorICAgIC5uYW1lICAgICAgID0gKHN0cmluZ2lmeShfZmllbGQpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5pbmZvICAgICAgID0gJihfaW5mbyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgID0gc2l6ZW9mKF90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgID0gVk1TX1NJTkdMRXxWTVNfUE9JTlRFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgID0gdm1zdGF0ZV9vZmZzZXRfdmFsdWUoX3N0YXRlLCBfZmllbGQsIF90eXBlKSwgICAgICAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfQVJSQVkoX2ZpZWxkLCBfc3RhdGUsIF9udW0sIF92ZXJzaW9uLCBfaW5mbywgX3R5cGUpIHtcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm51bSAgICAgICAgPSAoX251bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmluZm8gICAgICAgPSAmKF9pbmZvKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfQVJSQVksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF9hcnJheShfc3RhdGUsIF9maWVsZCwgX3R5cGUsIF9udW0pLCBcCit9CisKKyNkZWZpbmUgVk1TVEFURV8yREFSUkFZKF9maWVsZCwgX3N0YXRlLCBfbjEsIF9uMiwgX3ZlcnNpb24sIF9pbmZvLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkID0gKF92ZXJzaW9uKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtICAgICAgICA9IChfbjEpICogKF9uMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmluZm8gICAgICAgPSAmKF9pbmZvKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgID0gc2l6ZW9mKF90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19BUlJBWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF8yZGFycmF5KF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSwgX24xLCBfbjIpLCAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfQVJSQVlfVEVTVChfZmllbGQsIF9zdGF0ZSwgX251bSwgX3Rlc3QsIF9pbmZvLCBfdHlwZSkge1wKKyAgICAubmFtZSAgICAgICAgID0gKHN0cmluZ2lmeShfZmllbGQpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZpZWxkX2V4aXN0cyA9IChfdGVzdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5udW0gICAgICAgICAgPSAoX251bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5mbyAgICAgICAgID0gJihfaW5mbyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfQVJSQVksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICAgID0gdm1zdGF0ZV9vZmZzZXRfYXJyYXkoX3N0YXRlLCBfZmllbGQsIF90eXBlLCBfbnVtKSxcCit9CisKKyNkZWZpbmUgVk1TVEFURV9TVUJfQVJSQVkoX2ZpZWxkLCBfc3RhdGUsIF9zdGFydCwgX251bSwgX3ZlcnNpb24sIF9pbmZvLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm51bSAgICAgICAgPSAoX251bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmluZm8gICAgICAgPSAmKF9pbmZvKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfQVJSQVksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF9zdWJfYXJyYXkoX3N0YXRlLCBfZmllbGQsIF90eXBlLCBfc3RhcnQpLCBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9BUlJBWV9JTlQzMl9VTlNBRkUoX2ZpZWxkLCBfc3RhdGUsIF9maWVsZF9udW0sIF9pbmZvLCBfdHlwZSkge1wKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgaW50MzJfdCksIFwKKyAgICAuaW5mbyAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19WQVJSQVlfSU5UMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1ZBUlJBWV9JTlQzMihfZmllbGQsIF9zdGF0ZSwgX2ZpZWxkX251bSwgX3ZlcnNpb24sIF9pbmZvLCBfdHlwZSkge1wKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgaW50MzJfdCksIFwKKyAgICAuaW5mbyAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19WQVJSQVlfSU5UMzJ8Vk1TX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IHZtc3RhdGVfb2Zmc2V0X3BvaW50ZXIoX3N0YXRlLCBfZmllbGQsIF90eXBlKSwgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1ZBUlJBWV9VSU5UMzIoX2ZpZWxkLCBfc3RhdGUsIF9maWVsZF9udW0sIF92ZXJzaW9uLCBfaW5mbywgX3R5cGUpIHtcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm51bV9vZmZzZXQgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZF9udW0sIHVpbnQzMl90KSxcCisgICAgLmluZm8gICAgICAgPSAmKF9pbmZvKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfVkFSUkFZX1VJTlQzMnxWTVNfUE9JTlRFUiwgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF9wb2ludGVyKF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSksICAgICBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9WQVJSQVlfVUlOVDE2X1VOU0FGRShfZmllbGQsIF9zdGF0ZSwgX2ZpZWxkX251bSwgX3ZlcnNpb24sIF9pbmZvLCBfdHlwZSkge1wKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgdWludDE2X3QpLFwKKyAgICAuaW5mbyAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19WQVJSQVlfVUlOVDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9URVNUKF9maWVsZCwgX3N0YXRlLCBfdGVzdCwgX3ZlcnNpb24sIF92bXNkLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgICA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZpZWxkX2V4aXN0cyA9IChfdGVzdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZtc2QgICAgICAgICA9ICYoX3Ztc2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgICA9IFZNU19TVFJVQ1QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgICA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSksICAgICBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9TVFJVQ1RfUE9JTlRFUl9WKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX3Ztc2QsIF90eXBlKSB7IFwKKyAgICAubmFtZSAgICAgICAgID0gKHN0cmluZ2lmeShfZmllbGQpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCAgID0gKF92ZXJzaW9uKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52bXNkICAgICAgICAgPSAmKF92bXNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfU1RSVUNUfFZNU19QT0lOVEVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgICAgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZCwgX3R5cGUpLCAgICAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfU1RSVUNUX1BPSU5URVJfVEVTVF9WKF9maWVsZCwgX3N0YXRlLCBfdGVzdCwgX3ZlcnNpb24sIF92bXNkLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgICA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmllbGRfZXhpc3RzID0gKF90ZXN0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudm1zZCAgICAgICAgID0gJihfdm1zZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICAgID0gc2l6ZW9mKF90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgID0gVk1TX1NUUlVDVHxWTVNfUE9JTlRFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICAgID0gdm1zdGF0ZV9vZmZzZXRfdmFsdWUoX3N0YXRlLCBfZmllbGQsIF90eXBlKSwgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX0FSUkFZX09GX1BPSU5URVIoX2ZpZWxkLCBfc3RhdGUsIF9udW0sIF92ZXJzaW9uLCBfaW5mbywgX3R5cGUpIHtcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm51bSAgICAgICAgPSAoX251bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmluZm8gICAgICAgPSAmKF9pbmZvKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfQVJSQVl8Vk1TX0FSUkFZX09GX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF9hcnJheShfc3RhdGUsIF9maWVsZCwgX3R5cGUsIF9udW0pLCBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9TVFJVQ1RfQVJSQVlfVEVTVChfZmllbGQsIF9zdGF0ZSwgX251bSwgX3Rlc3QsIF92ZXJzaW9uLCBfdm1zZCwgX3R5cGUpIHsgXAorICAgIC5uYW1lICAgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5udW0gICAgICAgICAgPSAoX251bSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52bXNkICAgICAgICAgPSAmKF92bXNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfU1RSVUNUfFZNU19BUlJBWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgICAgPSB2bXN0YXRlX29mZnNldF9hcnJheShfc3RhdGUsIF9maWVsZCwgX3R5cGUsIF9udW0pLFwKK30KKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9WQVJSQVlfVUlOVDgoX2ZpZWxkLCBfc3RhdGUsIF9maWVsZF9udW0sIF92ZXJzaW9uLCBfdm1zZCwgX3R5cGUpIHsgXAorICAgIC5uYW1lICAgICAgID0gKHN0cmluZ2lmeShfZmllbGQpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5udW1fb2Zmc2V0ID0gdm1zdGF0ZV9vZmZzZXRfdmFsdWUoX3N0YXRlLCBfZmllbGRfbnVtLCB1aW50OF90KSwgXAorICAgIC52ZXJzaW9uX2lkID0gKF92ZXJzaW9uKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52bXNkICAgICAgID0gJihfdm1zZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgID0gc2l6ZW9mKF90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgID0gVk1TX1NUUlVDVHxWTVNfVkFSUkFZX1VJTlQ4LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgID0gb2Zmc2V0b2YoX3N0YXRlLCBfZmllbGQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfU1RSVUNUX1ZBUlJBWV9QT0lOVEVSX0lOVDMyKF9maWVsZCwgX3N0YXRlLCBfZmllbGRfbnVtLCBfdm1zZCwgX3R5cGUpIHsgXAorICAgIC5uYW1lICAgICAgID0gKHN0cmluZ2lmeShfZmllbGQpKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5udW1fb2Zmc2V0ID0gdm1zdGF0ZV9vZmZzZXRfdmFsdWUoX3N0YXRlLCBfZmllbGRfbnVtLCBpbnQzMl90KSwgXAorICAgIC5zaXplICAgICAgID0gc2l6ZW9mKF90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52bXNkICAgICAgID0gJihfdm1zZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgID0gVk1TX1BPSU5URVIgfCBWTVNfVkFSUkFZX0lOVDMyIHwgVk1TX1NUUlVDVCwgICAgICAgXAorICAgIC5vZmZzZXQgICAgID0gdm1zdGF0ZV9vZmZzZXRfcG9pbnRlcihfc3RhdGUsIF9maWVsZCwgX3R5cGUpLCAgICAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfU1RSVUNUX1ZBUlJBWV9QT0lOVEVSX1VJTlQzMihfZmllbGQsIF9zdGF0ZSwgX2ZpZWxkX251bSwgX3Ztc2QsIF90eXBlKSB7IFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgdWludDMyX3QpLFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudm1zZCAgICAgICA9ICYoX3Ztc2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19QT0lOVEVSIHwgVk1TX1ZBUlJBWV9JTlQzMiB8IFZNU19TVFJVQ1QsICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IHZtc3RhdGVfb2Zmc2V0X3BvaW50ZXIoX3N0YXRlLCBfZmllbGQsIF90eXBlKSwgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9WQVJSQVlfUE9JTlRFUl9VSU5UMTYoX2ZpZWxkLCBfc3RhdGUsIF9maWVsZF9udW0sIF92bXNkLCBfdHlwZSkgeyBcCisgICAgLm5hbWUgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm51bV9vZmZzZXQgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZF9udW0sIHVpbnQxNl90KSxcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZtc2QgICAgICAgPSAmKF92bXNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfUE9JTlRFUiB8IFZNU19WQVJSQVlfVUlOVDE2IHwgVk1TX1NUUlVDVCwgICAgICBcCisgICAgLm9mZnNldCAgICAgPSB2bXN0YXRlX29mZnNldF9wb2ludGVyKF9zdGF0ZSwgX2ZpZWxkLCBfdHlwZSksICAgICBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9TVFJVQ1RfVkFSUkFZX0lOVDMyKF9maWVsZCwgX3N0YXRlLCBfZmllbGRfbnVtLCBfdmVyc2lvbiwgX3Ztc2QsIF90eXBlKSB7IFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgaW50MzJfdCksIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudm1zZCAgICAgICA9ICYoX3Ztc2QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IHNpemVvZihfdHlwZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19TVFJVQ1R8Vk1TX1ZBUlJBWV9JTlQzMiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9WQVJSQVlfVUlOVDMyKF9maWVsZCwgX3N0YXRlLCBfZmllbGRfbnVtLCBfdmVyc2lvbiwgX3Ztc2QsIF90eXBlKSB7IFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubnVtX29mZnNldCA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX251bSwgdWludDMyX3QpLCBcCisgICAgLnZlcnNpb25faWQgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZtc2QgICAgICAgPSAmKF92bXNkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemUgICAgICAgPSBzaXplb2YoX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgPSBWTVNfU1RSVUNUfFZNU19WQVJSQVlfVUlOVDMyLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgPSBvZmZzZXRvZihfc3RhdGUsIF9maWVsZCksICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgVk1TVEFURV9TVEFUSUNfQlVGRkVSKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX3Rlc3QsIF9zdGFydCwgX3NpemUpIHsgXAorICAgIC5uYW1lICAgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgICAgPSAoX3NpemUgLSBfc3RhcnQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5pbmZvICAgICAgICAgPSAmdm1zdGF0ZV9pbmZvX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfQlVGRkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgICAgPSB2bXN0YXRlX29mZnNldF9idWZmZXIoX3N0YXRlLCBfZmllbGQpICsgX3N0YXJ0LCAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfVkJVRkZFUl9NVUxUSVBMWShfZmllbGQsIF9zdGF0ZSwgX3ZlcnNpb24sIF90ZXN0LCBfc3RhcnQsIF9maWVsZF9zaXplLCBfbXVsdGlwbHkpIHsgXAorICAgIC5uYW1lICAgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplX29mZnNldCAgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZF9zaXplLCB1aW50MzJfdCksXAorICAgIC5zaXplICAgICAgICAgPSAoX211bHRpcGx5KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5mbyAgICAgICAgID0gJnZtc3RhdGVfaW5mb19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgID0gVk1TX1ZCVUZGRVJ8Vk1TX1BPSU5URVJ8Vk1TX01VTFRJUExZLCAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICAgID0gb2Zmc2V0b2YoX3N0YXRlLCBfZmllbGQpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc3RhcnQgICAgICAgID0gKF9zdGFydCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1ZCVUZGRVIoX2ZpZWxkLCBfc3RhdGUsIF92ZXJzaW9uLCBfdGVzdCwgX3N0YXJ0LCBfZmllbGRfc2l6ZSkgeyBcCisgICAgLm5hbWUgICAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnZlcnNpb25faWQgICA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZpZWxkX2V4aXN0cyA9IChfdGVzdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnNpemVfb2Zmc2V0ICA9IHZtc3RhdGVfb2Zmc2V0X3ZhbHVlKF9zdGF0ZSwgX2ZpZWxkX3NpemUsIGludDMyX3QpLFwKKyAgICAuaW5mbyAgICAgICAgID0gJnZtc3RhdGVfaW5mb19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICAgID0gVk1TX1ZCVUZGRVJ8Vk1TX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICAgID0gb2Zmc2V0b2YoX3N0YXRlLCBfZmllbGQpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc3RhcnQgICAgICAgID0gKF9zdGFydCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1ZCVUZGRVJfVUlOVDMyKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX3Rlc3QsIF9zdGFydCwgX2ZpZWxkX3NpemUpIHsgXAorICAgIC5uYW1lICAgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplX29mZnNldCAgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZF9zaXplLCB1aW50MzJfdCksXAorICAgIC5pbmZvICAgICAgICAgPSAmdm1zdGF0ZV9pbmZvX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfVkJVRkZFUnxWTVNfUE9JTlRFUiwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5vZmZzZXQgICAgICAgPSBvZmZzZXRvZihfc3RhdGUsIF9maWVsZCksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zdGFydCAgICAgICAgPSAoX3N0YXJ0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFZNU1RBVEVfQlVGRkVSX1VOU0FGRV9JTkZPKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX2luZm8sIF9zaXplKSB7IFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IChfc2l6ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5mbyAgICAgICA9ICYoX2luZm8pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19CVUZGRVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX0JVRkZFUl9QT0lOVEVSX1VOU0FGRShfZmllbGQsIF9zdGF0ZSwgX3ZlcnNpb24sIF9zaXplKSB7IFwKKyAgICAubmFtZSAgICAgICA9IChzdHJpbmdpZnkoX2ZpZWxkKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAudmVyc2lvbl9pZCA9IChfdmVyc2lvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuc2l6ZSAgICAgICA9IChfc2l6ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5mbyAgICAgICA9ICZ2bXN0YXRlX2luZm9fYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuZmxhZ3MgICAgICA9IFZNU19CVUZGRVJ8Vk1TX1BPSU5URVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAub2Zmc2V0ICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBWTVNUQVRFX1VOVVNFRF9CVUZGRVIoX3Rlc3QsIF92ZXJzaW9uLCBfc2l6ZSkgeyAgICAgICAgICAgICAgXAorICAgIC5uYW1lICAgICAgICAgPSAidW51c2VkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5maWVsZF9leGlzdHMgPSAoX3Rlc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplICAgICAgICAgPSAoX3NpemUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5pbmZvICAgICAgICAgPSAmdm1zdGF0ZV9pbmZvX3VudXNlZF9idWZmZXIsICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5mbGFncyAgICAgICAgPSBWTVNfQlVGRkVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBfZmllbGRfc2l6ZSBzaG91bGQgYmUgYSBpbnQzMl90IGZpZWxkIGluIHRoZSBfc3RhdGUgc3RydWN0IGdpdmluZyB0aGUKKyAqIHNpemUgb2YgdGhlIGJpdG1hcCBfZmllbGQgaW4gYml0cy4KKyAqLworI2RlZmluZSBWTVNUQVRFX0JJVE1BUChfZmllbGQsIF9zdGF0ZSwgX3ZlcnNpb24sIF9maWVsZF9zaXplKSB7ICAgICAgXAorICAgIC5uYW1lICAgICAgICAgPSAoc3RyaW5naWZ5KF9maWVsZCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uX2lkICAgPSAoX3ZlcnNpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5zaXplX29mZnNldCAgPSB2bXN0YXRlX29mZnNldF92YWx1ZShfc3RhdGUsIF9maWVsZF9zaXplLCBpbnQzMl90KSxcCisgICAgLmluZm8gICAgICAgICA9ICZ2bXN0YXRlX2luZm9fYml0bWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsYWdzICAgICAgICA9IFZNU19WQlVGRkVSfFZNU19QT0lOVEVSLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9mZnNldCAgICAgICA9IG9mZnNldG9mKF9zdGF0ZSwgX2ZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIF9mIDogZmllbGQgbmFtZQorICAgX2ZfbiA6IG51bSBvZiBlbGVtZW50cyBmaWVsZF9uYW1lCisgICBfbiA6IG51bSBvZiBlbGVtZW50cworICAgX3MgOiBzdHJ1Y3Qgc3RhdGUgbmFtZQorICAgX3YgOiB2ZXJzaW9uCisqLworCisjZGVmaW5lIFZNU1RBVEVfU0lOR0xFKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgX2luZm8sIF90eXBlKSAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFX1RFU1QoX2ZpZWxkLCBfc3RhdGUsIE5VTEwsIF92ZXJzaW9uLCBfaW5mbywgX3R5cGUpCisKKyNkZWZpbmUgVk1TVEFURV9TVFJVQ1QoX2ZpZWxkLCBfc3RhdGUsIF92ZXJzaW9uLCBfdm1zZCwgX3R5cGUpICAgICAgICBcCisgICAgVk1TVEFURV9TVFJVQ1RfVEVTVChfZmllbGQsIF9zdGF0ZSwgTlVMTCwgX3ZlcnNpb24sIF92bXNkLCBfdHlwZSkKKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9QT0lOVEVSKF9maWVsZCwgX3N0YXRlLCBfdm1zZCwgX3R5cGUpICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NUUlVDVF9QT0lOVEVSX1YoX2ZpZWxkLCBfc3RhdGUsIDAsIF92bXNkLCBfdHlwZSkKKworI2RlZmluZSBWTVNUQVRFX1NUUlVDVF9QT0lOVEVSX1RFU1QoX2ZpZWxkLCBfc3RhdGUsIF90ZXN0LCBfdm1zZCwgX3R5cGUpICAgICBcCisgICAgVk1TVEFURV9TVFJVQ1RfUE9JTlRFUl9URVNUX1YoX2ZpZWxkLCBfc3RhdGUsIF90ZXN0LCAwLCBfdm1zZCwgX3R5cGUpCisKKyNkZWZpbmUgVk1TVEFURV9TVFJVQ1RfQVJSQVkoX2ZpZWxkLCBfc3RhdGUsIF9udW0sIF92ZXJzaW9uLCBfdm1zZCwgX3R5cGUpIFwKKyAgICBWTVNUQVRFX1NUUlVDVF9BUlJBWV9URVNUKF9maWVsZCwgX3N0YXRlLCBfbnVtLCBOVUxMLCBfdmVyc2lvbiwgICBcCisgICAgICAgICAgICBfdm1zZCwgX3R5cGUpCisKKyNkZWZpbmUgVk1TVEFURV9CT09MX1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX2Jvb2wsIGJvb2wpCisKKyNkZWZpbmUgVk1TVEFURV9JTlQ4X1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX2ludDgsIGludDhfdCkKKyNkZWZpbmUgVk1TVEFURV9JTlQxNl9WKF9mLCBfcywgX3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX2ludDE2LCBpbnQxNl90KQorI2RlZmluZSBWTVNUQVRFX0lOVDMyX1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRShfZiwgX3MsIF92LCB2bXN0YXRlX2luZm9faW50MzIsIGludDMyX3QpCisjZGVmaW5lIFZNU1RBVEVfSU5UNjRfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFKF9mLCBfcywgX3YsIHZtc3RhdGVfaW5mb19pbnQ2NCwgaW50NjRfdCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQ4X1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRShfZiwgX3MsIF92LCB2bXN0YXRlX2luZm9fdWludDgsIHVpbnQ4X3QpCisjZGVmaW5lIFZNU1RBVEVfVUlOVDE2X1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFKF9mLCBfcywgX3YsIHZtc3RhdGVfaW5mb191aW50MTYsIHVpbnQxNl90KQorI2RlZmluZSBWTVNUQVRFX1VJTlQzMl9WKF9mLCBfcywgX3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRShfZiwgX3MsIF92LCB2bXN0YXRlX2luZm9fdWludDMyLCB1aW50MzJfdCkKKyNkZWZpbmUgVk1TVEFURV9VSU5UNjRfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQ2NCwgdWludDY0X3QpCisKKyNkZWZpbmUgVk1TVEFURV9CT09MKF9mLCBfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9CT09MX1YoX2YsIF9zLCAwKQorCisjZGVmaW5lIFZNU1RBVEVfSU5UOChfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfSU5UOF9WKF9mLCBfcywgMCkKKyNkZWZpbmUgVk1TVEFURV9JTlQxNihfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9JTlQxNl9WKF9mLCBfcywgMCkKKyNkZWZpbmUgVk1TVEFURV9JTlQzMihfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9JTlQzMl9WKF9mLCBfcywgMCkKKyNkZWZpbmUgVk1TVEFURV9JTlQ2NChfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9JTlQ2NF9WKF9mLCBfcywgMCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQ4KF9mLCBfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1VJTlQ4X1YoX2YsIF9zLCAwKQorI2RlZmluZSBWTVNUQVRFX1VJTlQxNihfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1VJTlQxNl9WKF9mLCBfcywgMCkKKyNkZWZpbmUgVk1TVEFURV9VSU5UMzIoX2YsIF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UMzJfVihfZiwgX3MsIDApCisjZGVmaW5lIFZNU1RBVEVfVUlOVDY0KF9mLCBfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfVUlOVDY0X1YoX2YsIF9zLCAwKQorCisjZGVmaW5lIFZNU1RBVEVfVUlOVDhfRVFVQUwoX2YsIF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFKF9mLCBfcywgMCwgdm1zdGF0ZV9pbmZvX3VpbnQ4X2VxdWFsLCB1aW50OF90KQorCisjZGVmaW5lIFZNU1RBVEVfVUlOVDE2X0VRVUFMKF9mLCBfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFKF9mLCBfcywgMCwgdm1zdGF0ZV9pbmZvX3VpbnQxNl9lcXVhbCwgdWludDE2X3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMTZfRVFVQUxfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQxNl9lcXVhbCwgdWludDE2X3QpCisKKyNkZWZpbmUgVk1TVEFURV9JTlQzMl9FUVVBTChfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCAwLCB2bXN0YXRlX2luZm9faW50MzJfZXF1YWwsIGludDMyX3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMzJfRVFVQUxfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQzMl9lcXVhbCwgdWludDMyX3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMzJfRVFVQUwoX2YsIF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UMzJfRVFVQUxfVihfZiwgX3MsIDApCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UNjRfRVFVQUxfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQ2NF9lcXVhbCwgdWludDY0X3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UNjRfRVFVQUwoX2YsIF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UNjRfRVFVQUxfVihfZiwgX3MsIDApCisKKyNkZWZpbmUgVk1TVEFURV9JTlQzMl9MRShfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TSU5HTEUoX2YsIF9zLCAwLCB2bXN0YXRlX2luZm9faW50MzJfbGUsIGludDMyX3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UOF9URVNUKF9mLCBfcywgX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRV9URVNUKF9mLCBfcywgX3QsIDAsIHZtc3RhdGVfaW5mb191aW50OCwgdWludDhfdCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQxNl9URVNUKF9mLCBfcywgX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRV9URVNUKF9mLCBfcywgX3QsIDAsIHZtc3RhdGVfaW5mb191aW50MTYsIHVpbnQxNl90KQorCisjZGVmaW5lIFZNU1RBVEVfVUlOVDMyX1RFU1QoX2YsIF9zLCBfdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU0lOR0xFX1RFU1QoX2YsIF9zLCBfdCwgMCwgdm1zdGF0ZV9pbmZvX3VpbnQzMiwgdWludDMyX3QpCisKKworI2RlZmluZSBWTVNUQVRFX0ZMT0FUNjRfVihfZiwgX3MsIF92KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NJTkdMRShfZiwgX3MsIF92LCB2bXN0YXRlX2luZm9fZmxvYXQ2NCwgZmxvYXQ2NCkKKworI2RlZmluZSBWTVNUQVRFX0ZMT0FUNjQoX2YsIF9zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0ZMT0FUNjRfVihfZiwgX3MsIDApCisKKyNkZWZpbmUgVk1TVEFURV9USU1FUl9URVNUKF9mLCBfcywgX3Rlc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9QT0lOVEVSX1RFU1QoX2YsIF9zLCBfdGVzdCwgdm1zdGF0ZV9pbmZvX3RpbWVyLCBRRU1VVGltZXIgKikKKworI2RlZmluZSBWTVNUQVRFX1RJTUVSX1YoX2YsIF9zLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1BPSU5URVIoX2YsIF9zLCBfdiwgdm1zdGF0ZV9pbmZvX3RpbWVyLCBRRU1VVGltZXIgKikKKworI2RlZmluZSBWTVNUQVRFX1RJTUVSKF9mLCBfcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1RJTUVSX1YoX2YsIF9zLCAwKQorCisjZGVmaW5lIFZNU1RBVEVfVElNRVJfQVJSQVkoX2YsIF9zLCBfbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9BUlJBWV9PRl9QT0lOVEVSKF9mLCBfcywgX24sIDAsIHZtc3RhdGVfaW5mb190aW1lciwgUUVNVVRpbWVyICopCisKKyNkZWZpbmUgVk1TVEFURV9CT09MX0FSUkFZX1YoX2YsIF9zLCBfbiwgX3YpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0FSUkFZKF9mLCBfcywgX24sIF92LCB2bXN0YXRlX2luZm9fYm9vbCwgYm9vbCkKKworI2RlZmluZSBWTVNUQVRFX0JPT0xfQVJSQVkoX2YsIF9zLCBfbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfQk9PTF9BUlJBWV9WKF9mLCBfcywgX24sIDApCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMTZfQVJSQVlfVihfZiwgX3MsIF9uLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfQVJSQVkoX2YsIF9zLCBfbiwgX3YsIHZtc3RhdGVfaW5mb191aW50MTYsIHVpbnQxNl90KQorCisjZGVmaW5lIFZNU1RBVEVfVUlOVDE2XzJEQVJSQVlfVihfZiwgX3MsIF9uMSwgX24yLCBfdikgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfMkRBUlJBWShfZiwgX3MsIF9uMSwgX24yLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQxNiwgdWludDE2X3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMTZfQVJSQVkoX2YsIF9zLCBfbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfVUlOVDE2X0FSUkFZX1YoX2YsIF9zLCBfbiwgMCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQxNl8yREFSUkFZKF9mLCBfcywgX24xLCBfbjIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1VJTlQxNl8yREFSUkFZX1YoX2YsIF9zLCBfbjEsIF9uMiwgMCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQ4XzJEQVJSQVlfVihfZiwgX3MsIF9uMSwgX24yLCBfdikgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFXzJEQVJSQVkoX2YsIF9zLCBfbjEsIF9uMiwgX3YsIHZtc3RhdGVfaW5mb191aW50OCwgdWludDhfdCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQ4X0FSUkFZX1YoX2YsIF9zLCBfbiwgX3YpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0FSUkFZKF9mLCBfcywgX24sIF92LCB2bXN0YXRlX2luZm9fdWludDgsIHVpbnQ4X3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UOF9BUlJBWShfZiwgX3MsIF9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UOF9BUlJBWV9WKF9mLCBfcywgX24sIDApCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UOF8yREFSUkFZKF9mLCBfcywgX24xLCBfbjIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UOF8yREFSUkFZX1YoX2YsIF9zLCBfbjEsIF9uMiwgMCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQzMl9BUlJBWV9WKF9mLCBfcywgX24sIF92KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0FSUkFZKF9mLCBfcywgX24sIF92LCB2bXN0YXRlX2luZm9fdWludDMyLCB1aW50MzJfdCkKKworI2RlZmluZSBWTVNUQVRFX1VJTlQzMl9BUlJBWShfZiwgX3MsIF9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1VJTlQzMl9BUlJBWV9WKF9mLCBfcywgX24sIDApCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UNjRfQVJSQVlfVihfZiwgX3MsIF9uLCBfdikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9BUlJBWShfZiwgX3MsIF9uLCBfdiwgdm1zdGF0ZV9pbmZvX3VpbnQ2NCwgdWludDY0X3QpCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UNjRfQVJSQVkoX2YsIF9zLCBfbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VSU5UNjRfQVJSQVlfVihfZiwgX3MsIF9uLCAwKQorCisjZGVmaW5lIFZNU1RBVEVfSU5UMTZfQVJSQVlfVihfZiwgX3MsIF9uLCBfdikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfQVJSQVkoX2YsIF9zLCBfbiwgX3YsIHZtc3RhdGVfaW5mb19pbnQxNiwgaW50MTZfdCkKKworI2RlZmluZSBWTVNUQVRFX0lOVDE2X0FSUkFZKF9mLCBfcywgX24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0lOVDE2X0FSUkFZX1YoX2YsIF9zLCBfbiwgMCkKKworI2RlZmluZSBWTVNUQVRFX0lOVDMyX0FSUkFZX1YoX2YsIF9zLCBfbiwgX3YpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0FSUkFZKF9mLCBfcywgX24sIF92LCB2bXN0YXRlX2luZm9faW50MzIsIGludDMyX3QpCisKKyNkZWZpbmUgVk1TVEFURV9JTlQzMl9BUlJBWShfZiwgX3MsIF9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9JTlQzMl9BUlJBWV9WKF9mLCBfcywgX24sIDApCisKKyNkZWZpbmUgVk1TVEFURV9VSU5UMzJfU1VCX0FSUkFZKF9mLCBfcywgX3N0YXJ0LCBfbnVtKSAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9TVUJfQVJSQVkoX2YsIF9zLCBfc3RhcnQsIF9udW0sIDAsIHZtc3RhdGVfaW5mb191aW50MzIsIHVpbnQzMl90KQorCisjZGVmaW5lIFZNU1RBVEVfVUlOVDMyX0FSUkFZKF9mLCBfcywgX24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfVUlOVDMyX0FSUkFZX1YoX2YsIF9zLCBfbiwgMCkKKworI2RlZmluZSBWTVNUQVRFX0lOVDY0X0FSUkFZX1YoX2YsIF9zLCBfbiwgX3YpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0FSUkFZKF9mLCBfcywgX24sIF92LCB2bXN0YXRlX2luZm9faW50NjQsIGludDY0X3QpCisKKyNkZWZpbmUgVk1TVEFURV9JTlQ2NF9BUlJBWShfZiwgX3MsIF9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9JTlQ2NF9BUlJBWV9WKF9mLCBfcywgX24sIDApCisKKyNkZWZpbmUgVk1TVEFURV9GTE9BVDY0X0FSUkFZX1YoX2YsIF9zLCBfbiwgX3YpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9BUlJBWShfZiwgX3MsIF9uLCBfdiwgdm1zdGF0ZV9pbmZvX2Zsb2F0NjQsIGZsb2F0NjQpCisKKyNkZWZpbmUgVk1TVEFURV9GTE9BVDY0X0FSUkFZKF9mLCBfcywgX24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9GTE9BVDY0X0FSUkFZX1YoX2YsIF9zLCBfbiwgMCkKKworI2RlZmluZSBWTVNUQVRFX0JVRkZFUl9WKF9mLCBfcywgX3YpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NUQVRJQ19CVUZGRVIoX2YsIF9zLCBfdiwgTlVMTCwgMCwgc2l6ZW9mKHR5cGVvZl9maWVsZChfcywgX2YpKSkKKworI2RlZmluZSBWTVNUQVRFX0JVRkZFUihfZiwgX3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX0JVRkZFUl9WKF9mLCBfcywgMCkKKworI2RlZmluZSBWTVNUQVRFX1BBUlRJQUxfQlVGRkVSKF9mLCBfcywgX3NpemUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1NUQVRJQ19CVUZGRVIoX2YsIF9zLCAwLCBOVUxMLCAwLCBfc2l6ZSkKKworI2RlZmluZSBWTVNUQVRFX0JVRkZFUl9TVEFSVF9NSURETEUoX2YsIF9zLCBfc3RhcnQpIFwKKyAgICBWTVNUQVRFX1NUQVRJQ19CVUZGRVIoX2YsIF9zLCAwLCBOVUxMLCBfc3RhcnQsIHNpemVvZih0eXBlb2ZfZmllbGQoX3MsIF9mKSkpCisKKyNkZWZpbmUgVk1TVEFURV9QQVJUSUFMX1ZCVUZGRVIoX2YsIF9zLCBfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9WQlVGRkVSKF9mLCBfcywgMCwgTlVMTCwgMCwgX3NpemUpCisKKyNkZWZpbmUgVk1TVEFURV9QQVJUSUFMX1ZCVUZGRVJfVUlOVDMyKF9mLCBfcywgX3NpemUpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfVkJVRkZFUl9VSU5UMzIoX2YsIF9zLCAwLCBOVUxMLCAwLCBfc2l6ZSkKKworI2RlZmluZSBWTVNUQVRFX1NVQl9WQlVGRkVSKF9mLCBfcywgX3N0YXJ0LCBfc2l6ZSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1ZCVUZGRVIoX2YsIF9zLCAwLCBOVUxMLCBfc3RhcnQsIF9zaXplKQorCisjZGVmaW5lIFZNU1RBVEVfQlVGRkVSX1RFU1QoX2YsIF9zLCBfdGVzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfU1RBVElDX0JVRkZFUihfZiwgX3MsIDAsIF90ZXN0LCAwLCBzaXplb2YodHlwZW9mX2ZpZWxkKF9zLCBfZikpKQorCisjZGVmaW5lIFZNU1RBVEVfQlVGRkVSX1VOU0FGRShfZmllbGQsIF9zdGF0ZSwgX3ZlcnNpb24sIF9zaXplKSAgICAgICAgXAorICAgIFZNU1RBVEVfQlVGRkVSX1VOU0FGRV9JTkZPKF9maWVsZCwgX3N0YXRlLCBfdmVyc2lvbiwgdm1zdGF0ZV9pbmZvX2J1ZmZlciwgX3NpemUpCisKKyNkZWZpbmUgVk1TVEFURV9VTlVTRURfVihfdiwgX3NpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVk1TVEFURV9VTlVTRURfQlVGRkVSKE5VTEwsIF92LCBfc2l6ZSkKKworI2RlZmluZSBWTVNUQVRFX1VOVVNFRChfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWTVNUQVRFX1VOVVNFRF9WKDAsIF9zaXplKQorCisjZGVmaW5lIFZNU1RBVEVfVU5VU0VEX1RFU1QoX3Rlc3QsIF9zaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZNU1RBVEVfVU5VU0VEX0JVRkZFUihfdGVzdCwgMCwgX3NpemUpCisKKyNkZWZpbmUgVk1TVEFURV9FTkRfT0ZfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAge30KKworaW50IHZtc3RhdGVfbG9hZF9zdGF0ZShRRU1VRmlsZSAqZiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKTsKK3ZvaWQgdm1zdGF0ZV9zYXZlX3N0YXRlKFFFTVVGaWxlICpmLCBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnZtc2QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpOworCitpbnQgdm1zdGF0ZV9yZWdpc3Rlcl93aXRoX2FsaWFzX2lkKERldmljZVN0YXRlICpkZXYsIGludCBpbnN0YW5jZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpiYXNlLCBpbnQgYWxpYXNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1aXJlZF9mb3JfdmVyc2lvbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IHZtc3RhdGVfcmVnaXN0ZXIoRGV2aWNlU3RhdGUgKmRldiwgaW50IGluc3RhbmNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnZtc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gdm1zdGF0ZV9yZWdpc3Rlcl93aXRoX2FsaWFzX2lkKGRldiwgaW5zdGFuY2VfaWQsIHZtc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFxdWUsIC0xLCAwKTsKK30KKwordm9pZCB2bXN0YXRlX3VucmVnaXN0ZXIoRGV2aWNlU3RhdGUgKmRldiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorc3RydWN0IE1lbW9yeVJlZ2lvbjsKK3ZvaWQgdm1zdGF0ZV9yZWdpc3Rlcl9yYW0oc3RydWN0IE1lbW9yeVJlZ2lvbiAqbWVtb3J5LCBEZXZpY2VTdGF0ZSAqZGV2KTsKK3ZvaWQgdm1zdGF0ZV91bnJlZ2lzdGVyX3JhbShzdHJ1Y3QgTWVtb3J5UmVnaW9uICptZW1vcnksIERldmljZVN0YXRlICpkZXYpOwordm9pZCB2bXN0YXRlX3JlZ2lzdGVyX3JhbV9nbG9iYWwoc3RydWN0IE1lbW9yeVJlZ2lvbiAqbWVtb3J5KTsKKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL21vbml0b3IvbW9uaXRvci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL21vbml0b3IvbW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDE4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvbW9uaXRvci9tb25pdG9yLmgKQEAgLTAsMCArMSw4MCBAQAorI2lmbmRlZiBNT05JVE9SX0gKKyNkZWZpbmUgTU9OSVRPUl9ICisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJibG9jay9ibG9jay5oIgorCitleHRlcm4gTW9uaXRvciAqY3VyX21vbjsKK2V4dGVybiBNb25pdG9yICpkZWZhdWx0X21vbjsKKworLyogZmxhZ3MgZm9yIG1vbml0b3JfaW5pdCAqLworI2RlZmluZSBNT05JVE9SX0lTX0RFRkFVTFQgICAgMHgwMQorI2RlZmluZSBNT05JVE9SX1VTRV9SRUFETElORSAgMHgwMgorI2RlZmluZSBNT05JVE9SX1VTRV9DT05UUk9MICAgMHgwNAorI2RlZmluZSBNT05JVE9SX1VTRV9QUkVUVFkgICAgMHgwOAorI2RlZmluZSBNT05JVE9SX1FVSVRfRE9FU05UX0VYSVQgIDB4ODAgIC8qIHByZXZlbnQgJ3F1aXQnIGZyb20gZXhpdGluZyB0aGUgZW11bGF0b3IgKi8KKworLyogZmxhZ3MgZm9yIG1vbml0b3IgY29tbWFuZHMgKi8KKyNkZWZpbmUgTU9OSVRPUl9DTURfQVNZTkMgICAgICAgMHgwMDAxCisjZGVmaW5lIE1PTklUT1JfQ01EX1VTRVJfT05MWSAgIDB4MDAwMgorCisvKiBRTVAgZXZlbnRzICovCit0eXBlZGVmIGVudW0gTW9uaXRvckV2ZW50IHsKKyAgICBRRVZFTlRfU0hVVERPV04sCisgICAgUUVWRU5UX1JFU0VULAorICAgIFFFVkVOVF9QT1dFUkRPV04sCisgICAgUUVWRU5UX1NUT1AsCisgICAgUUVWRU5UX1JFU1VNRSwKKyAgICBRRVZFTlRfVk5DX0NPTk5FQ1RFRCwKKyAgICBRRVZFTlRfVk5DX0lOSVRJQUxJWkVELAorICAgIFFFVkVOVF9WTkNfRElTQ09OTkVDVEVELAorICAgIFFFVkVOVF9CTE9DS19JT19FUlJPUiwKKyAgICBRRVZFTlRfUlRDX0NIQU5HRSwKKyAgICBRRVZFTlRfV0FUQ0hET0csCisgICAgUUVWRU5UX1NQSUNFX0NPTk5FQ1RFRCwKKyAgICBRRVZFTlRfU1BJQ0VfSU5JVElBTElaRUQsCisgICAgUUVWRU5UX1NQSUNFX0RJU0NPTk5FQ1RFRCwKKyAgICBRRVZFTlRfTUFYLAorfSBNb25pdG9yRXZlbnQ7CisKK2ludCBtb25pdG9yX2N1cl9pc19xbXAodm9pZCk7CisKK3ZvaWQgbW9uaXRvcl9wcm90b2NvbF9ldmVudChNb25pdG9yRXZlbnQgZXZlbnQsIFFPYmplY3QgKmRhdGEpOwordm9pZCBtb25pdG9yX2luaXQoQ2hhckRyaXZlclN0YXRlICpjaHIsIGludCBmbGFncyk7CisKK2ludCBtb25pdG9yX3N1c3BlbmQoTW9uaXRvciAqbW9uKTsKK3ZvaWQgbW9uaXRvcl9yZXN1bWUoTW9uaXRvciAqbW9uKTsKKworaW50IG1vbml0b3JfcmVhZF9iZHJ2X2tleV9zdGFydChNb25pdG9yICptb24sIEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjb21wbGV0aW9uX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpOworCitpbnQgbW9uaXRvcl9nZXRfZmQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpmZG5hbWUpOworCit2b2lkIG1vbml0b3JfdnByaW50ZihNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKKyAgICBHQ0NfRk1UX0FUVFIoMiwgMCk7Cit2b2lkIG1vbml0b3JfcHJpbnRmKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqZm10LCAuLi4pIEdDQ19GTVRfQVRUUigyLCAzKTsKK3ZvaWQgbW9uaXRvcl9wcmludF9maWxlbmFtZShNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3ZvaWQgbW9uaXRvcl9mbHVzaChNb25pdG9yICptb24pOworCit0eXBlZGVmIHZvaWQgKE1vbml0b3JDb21wbGV0aW9uKSh2b2lkICpvcGFxdWUsIFFPYmplY3QgKnJldF9kYXRhKTsKKwordm9pZCBtb25pdG9yX3NldF9lcnJvcihNb25pdG9yICptb24sIFFFcnJvciAqcWVycm9yKTsKKworI2lmZGVmIENPTkZJR19BTkRST0lECit0eXBlZGVmIGludCAoKk1vbml0b3JGYWtlRnVuYykodm9pZCogb3BhcXVlLCBjb25zdCBjaGFyKiBzdHIsIGludCBzdHJzaXplKTsKKworLyogQ3JlYXRlIGEgbmV3IGZha2UgTW9uaXRvciBvYmplY3QgdG8gc2VuZCBhbGwgb3V0cHV0IHRvIGFuIGludGVybmFsCisgKiBidWZmZXIuIFRoaXMgaXMgdXNlZCB0byBzZW5kIHNuYXBzaG90IHNhdmUvbG9hZCBlcnJvcnMgKHByb2R1Y2VkIGluCisgKiBzYXZldm0uYykgdG8gdGhlIEFuZHJvaWQgY29uc29sZSB3aGVuICdhdmQgc25hcHNob3Qgc2F2ZScgb3IKKyAqICdhdmQgc25hcHNob3QgbG9hZCcgYXJlIHVzZWQuCisgKi8KK01vbml0b3IqIG1vbml0b3JfZmFrZV9uZXcodm9pZCogb3BhcXVlLCBNb25pdG9yRmFrZUZ1bmMgY2IpOworaW50ICAgICAgbW9uaXRvcl9mYWtlX2dldF9ieXRlcyhNb25pdG9yKiBtb24pOwordm9pZCAgICAgbW9uaXRvcl9mYWtlX2ZyZWUoTW9uaXRvciogbW9uKTsKKyNlbmRpZgorCisjZW5kaWYgLyogIU1PTklUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL25ldC9uZXQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9uZXQvbmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxN2ZkZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9uZXQvbmV0LmgKQEAgLTAsMCArMSwxNDcgQEAKKyNpZm5kZWYgUUVNVV9ORVRfSAorI2RlZmluZSBRRU1VX05FVF9ICisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCisvKiBWTEFOcyBzdXBwb3J0ICovCisKKwordHlwZWRlZiBpbnQgKE5ldENhblJlY2VpdmUpKFZMQU5DbGllbnRTdGF0ZSAqKTsKK3R5cGVkZWYgc3NpemVfdCAoTmV0UmVjZWl2ZSkoVkxBTkNsaWVudFN0YXRlICosIGNvbnN0IHVpbnQ4X3QgKiwgc2l6ZV90KTsKK3R5cGVkZWYgc3NpemVfdCAoTmV0UmVjZWl2ZUlPVikoVkxBTkNsaWVudFN0YXRlICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCBpbnQpOwordHlwZWRlZiB2b2lkIChOZXRDbGVhbnVwKSAoVkxBTkNsaWVudFN0YXRlICopOwordHlwZWRlZiB2b2lkIChMaW5rU3RhdHVzQ2hhbmdlZCkoVkxBTkNsaWVudFN0YXRlICopOworCitzdHJ1Y3QgVkxBTkNsaWVudFN0YXRlIHsKKyAgICBOZXRSZWNlaXZlICpyZWNlaXZlOworICAgIE5ldFJlY2VpdmVJT1YgKnJlY2VpdmVfaW92OworICAgIC8qIFBhY2tldHMgbWF5IHN0aWxsIGJlIHNlbnQgaWYgdGhpcyByZXR1cm5zIHplcm8uICBJdCdzIHVzZWQgdG8KKyAgICAgICByYXRlLWxpbWl0IHRoZSBzbGlycCBjb2RlLiAgKi8KKyAgICBOZXRDYW5SZWNlaXZlICpjYW5fcmVjZWl2ZTsKKyAgICBOZXRDbGVhbnVwICpjbGVhbnVwOworICAgIExpbmtTdGF0dXNDaGFuZ2VkICpsaW5rX3N0YXR1c19jaGFuZ2VkOworICAgIGludCBsaW5rX2Rvd247CisgICAgdm9pZCAqb3BhcXVlOworICAgIHN0cnVjdCBWTEFOQ2xpZW50U3RhdGUgKm5leHQ7CisgICAgc3RydWN0IFZMQU5TdGF0ZSAqdmxhbjsKKyAgICBjaGFyICptb2RlbDsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgaW5mb19zdHJbMjU2XTsKK307CisKK3R5cGVkZWYgc3RydWN0IFZMQU5QYWNrZXQgVkxBTlBhY2tldDsKKwordHlwZWRlZiB2b2lkIChOZXRQYWNrZXRTZW50KSAoVkxBTkNsaWVudFN0YXRlICopOworCitzdHJ1Y3QgVkxBTlBhY2tldCB7CisgICAgc3RydWN0IFZMQU5QYWNrZXQgKm5leHQ7CisgICAgVkxBTkNsaWVudFN0YXRlICpzZW5kZXI7CisgICAgaW50IHNpemU7CisgICAgTmV0UGFja2V0U2VudCAqc2VudF9jYjsKKyAgICB1aW50OF90IGRhdGFbMF07Cit9OworCitzdHJ1Y3QgVkxBTlN0YXRlIHsKKyAgICBpbnQgaWQ7CisgICAgVkxBTkNsaWVudFN0YXRlICpmaXJzdF9jbGllbnQ7CisgICAgc3RydWN0IFZMQU5TdGF0ZSAqbmV4dDsKKyAgICB1bnNpZ25lZCBpbnQgbmJfZ3Vlc3RfZGV2cywgbmJfaG9zdF9kZXZzOworICAgIFZMQU5QYWNrZXQgKnNlbmRfcXVldWU7CisgICAgaW50IGRlbGl2ZXJpbmc7Cit9OworCitWTEFOU3RhdGUgKnFlbXVfZmluZF92bGFuKGludCBpZCk7CitWTEFOQ2xpZW50U3RhdGUgKnFlbXVfbmV3X3ZsYW5fY2xpZW50KFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldENhblJlY2VpdmUgKmNhbl9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlICpyZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlSU9WICpyZWNlaXZlX2lvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Q2xlYW51cCAqY2xlYW51cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK3ZvaWQgcWVtdV9kZWxfdmxhbl9jbGllbnQoVkxBTkNsaWVudFN0YXRlICp2Yyk7CitWTEFOQ2xpZW50U3RhdGUgKnFlbXVfZmluZF92bGFuX2NsaWVudChWTEFOU3RhdGUgKnZsYW4sIHZvaWQgKm9wYXF1ZSk7CitpbnQgcWVtdV9jYW5fc2VuZF9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICp2Yyk7Citzc2l6ZV90IHFlbXVfc2VuZHZfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW92Y250KTsKK3NzaXplX3QgcWVtdV9zZW5kdl9wYWNrZXRfYXN5bmMoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb3ZjbnQsIE5ldFBhY2tldFNlbnQgKnNlbnRfY2IpOwordm9pZCBxZW11X3NlbmRfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworc3NpemVfdCBxZW11X3NlbmRfcGFja2V0X2FzeW5jKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgTmV0UGFja2V0U2VudCAqc2VudF9jYik7Cit2b2lkIHFlbXVfZmx1c2hfcXVldWVkX3BhY2tldHMoVkxBTkNsaWVudFN0YXRlICp2Yyk7Cit2b2lkIHFlbXVfZm9ybWF0X25pY19pbmZvX3N0cihWTEFOQ2xpZW50U3RhdGUgKnZjLCB1aW50OF90IG1hY2FkZHJbNl0pOwordm9pZCBxZW11X2NoZWNrX25pY19tb2RlbChOSUNJbmZvICpuZCwgY29uc3QgY2hhciAqbW9kZWwpOwordm9pZCBxZW11X2NoZWNrX25pY19tb2RlbF9saXN0KE5JQ0luZm8gKm5kLCBjb25zdCBjaGFyICogY29uc3QgKm1vZGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWZhdWx0X21vZGVsKTsKK3ZvaWQgcWVtdV9oYW5kbGVyX3RydWUodm9pZCAqb3BhcXVlKTsKKwordm9pZCBkb19pbmZvX25ldHdvcmsoTW9uaXRvciAqbW9uKTsKK2ludCBkb19zZXRfbGluayhNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnVwX29yX2Rvd24pOworCisvKiBOSUMgaW5mbyAqLworCisjZGVmaW5lIE1BWF9OSUNTIDgKKworc3RydWN0IE5JQ0luZm8geworICAgIHVpbnQ4X3QgbWFjYWRkcls2XTsKKyAgICBjb25zdCBjaGFyICptb2RlbDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIFZMQU5TdGF0ZSAqdmxhbjsKKyAgICB2b2lkICpwcml2YXRlOworICAgIGludCB1c2VkOworfTsKKworZXh0ZXJuIGludCBuYl9uaWNzOworZXh0ZXJuIE5JQ0luZm8gbmRfdGFibGVbTUFYX05JQ1NdOworCisvKiBCVCBIQ0kgaW5mbyAqLworCitzdHJ1Y3QgSENJSW5mbyB7CisgICAgaW50ICgqYmRhZGRyX3NldCkoc3RydWN0IEhDSUluZm8gKmhjaSwgY29uc3QgdWludDhfdCAqYmRfYWRkcik7CisgICAgdm9pZCAoKmNtZF9zZW5kKShzdHJ1Y3QgSENJSW5mbyAqaGNpLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKyAgICB2b2lkICgqc2NvX3NlbmQpKHN0cnVjdCBIQ0lJbmZvICpoY2ksIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pOworICAgIHZvaWQgKCphY2xfc2VuZCkoc3RydWN0IEhDSUluZm8gKmhjaSwgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbik7CisgICAgdm9pZCAqb3BhcXVlOworICAgIHZvaWQgKCpldnRfcmVjdikodm9pZCAqb3BhcXVlLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKyAgICB2b2lkICgqYWNsX3JlY3YpKHZvaWQgKm9wYXF1ZSwgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbik7Cit9OworCitzdHJ1Y3QgSENJSW5mbyAqcWVtdV9uZXh0X2hjaSh2b2lkKTsKKworLyogY2hlY2tzdW1taW5nIGZ1bmN0aW9ucyAobmV0LWNoZWNrc3VtLmMpICovCit1aW50MzJfdCBuZXRfY2hlY2tzdW1fYWRkKGludCBsZW4sIHVpbnQ4X3QgKmJ1Zik7Cit1aW50MTZfdCBuZXRfY2hlY2tzdW1fZmluaXNoKHVpbnQzMl90IHN1bSk7Cit1aW50MTZfdCBuZXRfY2hlY2tzdW1fdGNwdWRwKHVpbnQxNl90IGxlbmd0aCwgdWludDE2X3QgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmFkZHJzLCB1aW50OF90ICpidWYpOwordm9pZCBuZXRfY2hlY2tzdW1fY2FsY3VsYXRlKHVpbnQ4X3QgKmRhdGEsIGludCBsZW5ndGgpOworCisvKiBmcm9tIG5ldC5jICovCitpbnQgbmV0X2NsaWVudF9pbml0KE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICpwKTsKK3ZvaWQgbmV0X2NsaWVudF91bmluaXQoTklDSW5mbyAqbmQpOworaW50IG5ldF9jbGllbnRfcGFyc2UoY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgbmV0X3NsaXJwX3NtYihjb25zdCBjaGFyICpleHBvcnRlZF9kaXIpOwordm9pZCBuZXRfc2xpcnBfcmVkaXIoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpyZWRpcl9zdHIsIGNvbnN0IGNoYXIgKnJlZGlyX29wdDIpOwordm9pZCBuZXRfY2xlYW51cCh2b2lkKTsKK2ludCBzbGlycF9pc19pbml0ZWQodm9pZCk7Cit2b2lkIG5ldF9jbGllbnRfY2hlY2sodm9pZCk7Cit2b2lkIG5ldF9ob3N0X2RldmljZV9hZGQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdHMpOwordm9pZCBuZXRfaG9zdF9kZXZpY2VfcmVtb3ZlKE1vbml0b3IgKm1vbiwgaW50IHZsYW5faWQsIGNvbnN0IGNoYXIgKmRldmljZSk7CisKKyNkZWZpbmUgREVGQVVMVF9ORVRXT1JLX1NDUklQVCAiL2V0Yy9xZW11LWlmdXAiCisjZGVmaW5lIERFRkFVTFRfTkVUV09SS19ET1dOX1NDUklQVCAiL2V0Yy9xZW11LWlmZG93biIKKyNpZmRlZiBfX3N1bl9fCisjZGVmaW5lIFNNQkRfQ09NTUFORCAiL3Vzci9zZncvc2Jpbi9zbWJkIgorI2Vsc2UKKyNkZWZpbmUgU01CRF9DT01NQU5EICIvdXNyL3NiaW4vc21iZCIKKyNlbmRpZgorCit2b2lkIHFkZXZfZ2V0X21hY2FkZHIoRGV2aWNlU3RhdGUgKmRldiwgdWludDhfdCAqbWFjYWRkcik7CitWTEFOQ2xpZW50U3RhdGUgKnFkZXZfZ2V0X3ZsYW5fY2xpZW50KERldmljZVN0YXRlICpkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldENhblJlY2VpdmUgKmNhbl9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlICpyZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlSU9WICpyZWNlaXZlX2lvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Q2xlYW51cCAqY2xlYW51cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9kZWFsbG9jLXZpc2l0b3IuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL2RlYWxsb2MtdmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGMzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9kZWFsbG9jLXZpc2l0b3IuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogRGVhbGxvYyBWaXNpdG9yCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgTWljaGFlbCBSb3RoICAgPG1kcm90aEBsaW51eC52bmV0LmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFBUElfREVBTExPQ19WSVNJVE9SX0gKKyNkZWZpbmUgUUFQSV9ERUFMTE9DX1ZJU0lUT1JfSAorCisjaW5jbHVkZSAicWFwaS92aXNpdG9yLmgiCisKK3R5cGVkZWYgc3RydWN0IFFhcGlEZWFsbG9jVmlzaXRvciBRYXBpRGVhbGxvY1Zpc2l0b3I7CisKK1FhcGlEZWFsbG9jVmlzaXRvciAqcWFwaV9kZWFsbG9jX3Zpc2l0b3JfbmV3KHZvaWQpOwordm9pZCBxYXBpX2RlYWxsb2NfdmlzaXRvcl9jbGVhbnVwKFFhcGlEZWFsbG9jVmlzaXRvciAqZCk7CisKK1Zpc2l0b3IgKnFhcGlfZGVhbGxvY19nZXRfdmlzaXRvcihRYXBpRGVhbGxvY1Zpc2l0b3IgKnYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL2Vycm9yLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9lcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGM2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9lcnJvci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBRRU1VIEVycm9yIE9iamVjdHMKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworI2lmbmRlZiBFUlJPUl9ICisjZGVmaW5lIEVSUk9SX0gKKworI2luY2x1ZGUgInFlbXUvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJxYXBpLXR5cGVzLmgiCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvKioKKyAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGludGVybmFsIGVycm9ycyB3aXRoaW4gUUVNVS4gIEFuIGVycm9yIGhhcyBhIEVycm9yQ2xhc3MKKyAqIGNvZGUgYW5kIGEgaHVtYW4gbWVzc2FnZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRXJyb3IgRXJyb3I7CisKKy8qKgorICogU2V0IGFuIGluZGlyZWN0IHBvaW50ZXIgdG8gYW4gZXJyb3IgZ2l2ZW4gYSBFcnJvckNsYXNzIHZhbHVlIGFuZCBhCisgKiBwcmludGYtc3R5bGUgaHVtYW4gbWVzc2FnZS4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZQorICogb2YgUUVNVS4KKyAqLwordm9pZCBlcnJvcl9zZXQoRXJyb3IgKiplcnIsIEVycm9yQ2xhc3MgZXJyX2NsYXNzLCBjb25zdCBjaGFyICpmbXQsIC4uLikgR0NDX0ZNVF9BVFRSKDMsIDQpOworCisvKioKKyAqIFNldCBhbiBpbmRpcmVjdCBwb2ludGVyIHRvIGFuIGVycm9yIGdpdmVuIGEgRXJyb3JDbGFzcyB2YWx1ZSBhbmQgYQorICogcHJpbnRmLXN0eWxlIGh1bWFuIG1lc3NhZ2UsIGZvbGxvd2VkIGJ5IGEgc3RyZXJyb3IoKSBzdHJpbmcgaWYKKyAqIEBvc19lcnJvciBpcyBub3QgemVyby4KKyAqLwordm9pZCBlcnJvcl9zZXRfZXJybm8oRXJyb3IgKiplcnIsIGludCBvc19lcnJvciwgRXJyb3JDbGFzcyBlcnJfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBHQ0NfRk1UX0FUVFIoNCwgNSk7CisKKyNpZmRlZiBfV0lOMzIKKy8qKgorICogU2V0IGFuIGluZGlyZWN0IHBvaW50ZXIgdG8gYW4gZXJyb3IgZ2l2ZW4gYSBFcnJvckNsYXNzIHZhbHVlIGFuZCBhCisgKiBwcmludGYtc3R5bGUgaHVtYW4gbWVzc2FnZSwgZm9sbG93ZWQgYnkgYSBnX3dpbjMyX2Vycm9yX21lc3NhZ2UoKSBzdHJpbmcgaWYKKyAqIEB3aW4zMl9lcnIgaXMgbm90IHplcm8uCisgKi8KK3ZvaWQgZXJyb3Jfc2V0X3dpbjMyKEVycm9yICoqZXJyLCBpbnQgd2luMzJfZXJyLCBFcnJvckNsYXNzIGVycl9jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pIEdDQ19GTVRfQVRUUig0LCA1KTsKKyNlbmRpZgorCisvKioKKyAqIFNhbWUgYXMgZXJyb3Jfc2V0KCksIGJ1dCBzZXRzIGEgZ2VuZXJpYyBlcnJvcgorICovCisjZGVmaW5lIGVycm9yX3NldGcoZXJyLCBmbXQsIC4uLikgXAorICAgIGVycm9yX3NldChlcnIsIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIGVycm9yX3NldGdfZXJybm8oZXJyLCBvc19lcnJvciwgZm10LCAuLi4pIFwKKyAgICBlcnJvcl9zZXRfZXJybm8oZXJyLCBvc19lcnJvciwgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgZXJyb3Jfc2V0Z193aW4zMihlcnIsIHdpbjMyX2VyciwgZm10LCAuLi4pIFwKKyAgICBlcnJvcl9zZXRfd2luMzIoZXJyLCB3aW4zMl9lcnIsIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZW5kaWYKKworLyoqCisgKiBIZWxwZXIgZm9yIG9wZW4oKSBlcnJvcnMKKyAqLwordm9pZCBlcnJvcl9zZXRnX2ZpbGVfb3BlbihFcnJvciAqKmVycnAsIGludCBvc19lcnJubywgY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbiBpbmRpcmVjdCBwb2ludGVyIHRvIGFuIGVycm9yIGlzIHBvaW50aW5nIHRvIGEgdmFsaWQKKyAqIGVycm9yIG9iamVjdC4KKyAqLworYm9vbCBlcnJvcl9pc19zZXQoRXJyb3IgKiplcnIpOworCisvKgorICogR2V0IHRoZSBlcnJvciBjbGFzcyBvZiBhbiBlcnJvciBvYmplY3QuCisgKi8KK0Vycm9yQ2xhc3MgZXJyb3JfZ2V0X2NsYXNzKGNvbnN0IEVycm9yICplcnIpOworCisvKioKKyAqIFJldHVybnMgYW4gZXhhY3QgY29weSBvZiB0aGUgZXJyb3IgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgorICovCitFcnJvciAqZXJyb3JfY29weShjb25zdCBFcnJvciAqZXJyKTsKKworLyoqCisgKiBHZXQgYSBodW1hbiByZWFkYWJsZSByZXByZXNlbnRhdGlvbiBvZiBhbiBlcnJvciBvYmplY3QuCisgKi8KK2NvbnN0IGNoYXIgKmVycm9yX2dldF9wcmV0dHkoRXJyb3IgKmVycik7CisKKy8qKgorICogUHJvcGFnYXRlIGFuIGVycm9yIHRvIGFuIGluZGlyZWN0IHBvaW50ZXIgdG8gYW4gZXJyb3IuICBUaGlzIGZ1bmN0aW9uIHdpbGwKKyAqIGFsd2F5cyB0cmFuc2ZlciBvd25lcnNoaXAgb2YgdGhlIGVycm9yIHJlZmVyZW5jZSBhbmQgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZQorICogZHN0X2VyciBpcyBOVUxMIGNvcnJlY3RseS4gIEVycm9ycyBhZnRlciB0aGUgZmlyc3QgYXJlIGRpc2NhcmRlZC4KKyAqLwordm9pZCBlcnJvcl9wcm9wYWdhdGUoRXJyb3IgKipkc3RfZXJyLCBFcnJvciAqbG9jYWxfZXJyKTsKKworLyoqCisgKiBGcmVlIGFuIGVycm9yIG9iamVjdC4KKyAqLwordm9pZCBlcnJvcl9mcmVlKEVycm9yICplcnIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL29wdHMtdmlzaXRvci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvb3B0cy12aXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0OGMxNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL29wdHMtdmlzaXRvci5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBPcHRpb25zIFZpc2l0b3IKKyAqCisgKiBDb3B5cmlnaHQgUmVkIEhhdCwgSW5jLiAyMDEyCisgKgorICogQXV0aG9yOiBMYXN6bG8gRXJzZWsgPGxlcnNla0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBPUFRTX1ZJU0lUT1JfSAorI2RlZmluZSBPUFRTX1ZJU0lUT1JfSAorCisjaW5jbHVkZSAicWFwaS92aXNpdG9yLmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKworLyogSW5jbHVzaXZlIHVwcGVyIGJvdW5kIG9uIHRoZSBzaXplIG9mIGFueSBmbGF0dGVuZWQgcmFuZ2UuIFRoaXMgaXMgYSBzYWZldHkKKyAqICg9IGFudGktYW5ub3lhbmNlKSBtZWFzdXJlOyB3cm9uZyByYW5nZXMgc2hvdWxkIG5vdCBjYXVzZSBsb25nIHN0YXJ0dXAKKyAqIGRlbGF5cyBub3IgZXhoYXVzdCB2aXJ0dWFsIG1lbW9yeS4KKyAqLworI2RlZmluZSBPUFRTX1ZJU0lUT1JfUkFOR0VfTUFYIDY1NTM2CisKK3R5cGVkZWYgc3RydWN0IE9wdHNWaXNpdG9yIE9wdHNWaXNpdG9yOworCisvKiBDb250cmFyaWx5IHRvIHFlbXUtb3B0aW9uLmM6OnBhcnNlX29wdGlvbl9udW1iZXIoKSwgT3B0c1Zpc2l0b3IncyAiaW50IgorICogcGFyc2VyIHJlbGllcyBvbiBzdHJ0b2xsKCkgaW5zdGVhZCBvZiBzdHJ0b3VsbCgpLiBDb25zZXF1ZW5jZXM6CisgKiAtIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgbmVnYXRpdmUgbnVtYmVycyB5aWVsZCBuZWdhdGl2ZSB2YWx1ZXMsCisgKiAtIHZhbHVlcyBiZWxvdyBJTlQ2NF9NSU4gb3IgTExPTkdfTUlOIGFyZSByZWplY3RlZCwKKyAqIC0gdmFsdWVzIGFib3ZlIElOVDY0X01BWCBvciBMTE9OR19NQVggYXJlIHJlamVjdGVkLgorICovCitPcHRzVmlzaXRvciAqb3B0c192aXNpdG9yX25ldyhjb25zdCBRZW11T3B0cyAqb3B0cyk7Cit2b2lkIG9wdHNfdmlzaXRvcl9jbGVhbnVwKE9wdHNWaXNpdG9yICpudik7CitWaXNpdG9yICpvcHRzX2dldF92aXNpdG9yKE9wdHNWaXNpdG9yICpudik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wLWlucHV0LXZpc2l0b3IuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC1pbnB1dC12aXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkNDk5YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC1pbnB1dC12aXNpdG9yLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIElucHV0IFZpc2l0b3IKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUU1QX0lOUFVUX1ZJU0lUT1JfSAorI2RlZmluZSBRTVBfSU5QVVRfVklTSVRPUl9ICisKKyNpbmNsdWRlICJxYXBpL3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xb2JqZWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IFFtcElucHV0VmlzaXRvciBRbXBJbnB1dFZpc2l0b3I7CisKK1FtcElucHV0VmlzaXRvciAqcW1wX2lucHV0X3Zpc2l0b3JfbmV3KFFPYmplY3QgKm9iaik7CitRbXBJbnB1dFZpc2l0b3IgKnFtcF9pbnB1dF92aXNpdG9yX25ld19zdHJpY3QoUU9iamVjdCAqb2JqKTsKKwordm9pZCBxbXBfaW5wdXRfdmlzaXRvcl9jbGVhbnVwKFFtcElucHV0VmlzaXRvciAqdik7CisKK1Zpc2l0b3IgKnFtcF9pbnB1dF9nZXRfdmlzaXRvcihRbXBJbnB1dFZpc2l0b3IgKnYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC1vdXRwdXQtdmlzaXRvci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wLW91dHB1dC12aXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2Njc3MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC1vdXRwdXQtdmlzaXRvci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBPdXRwdXQgVmlzaXRvcgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTEKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRTVBfT1VUUFVUX1ZJU0lUT1JfSAorI2RlZmluZSBRTVBfT1VUUFVUX1ZJU0lUT1JfSAorCisjaW5jbHVkZSAicWFwaS92aXNpdG9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorCit0eXBlZGVmIHN0cnVjdCBRbXBPdXRwdXRWaXNpdG9yIFFtcE91dHB1dFZpc2l0b3I7CisKK1FtcE91dHB1dFZpc2l0b3IgKnFtcF9vdXRwdXRfdmlzaXRvcl9uZXcodm9pZCk7Cit2b2lkIHFtcF9vdXRwdXRfdmlzaXRvcl9jbGVhbnVwKFFtcE91dHB1dFZpc2l0b3IgKnYpOworCitRT2JqZWN0ICpxbXBfb3V0cHV0X2dldF9xb2JqZWN0KFFtcE91dHB1dFZpc2l0b3IgKnYpOworVmlzaXRvciAqcW1wX291dHB1dF9nZXRfdmlzaXRvcihRbXBPdXRwdXRWaXNpdG9yICp2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvZGlzcGF0Y2guaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9kaXNwYXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTM4MTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvZGlzcGF0Y2guaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29yZSBEZWZpbml0aW9ucyBmb3IgUUFQSS9RTVAgRGlzcGF0Y2gKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUU1QX0NPUkVfSAorI2RlZmluZSBRTVBfQ09SRV9ICisKKyNpbmNsdWRlICJxYXBpL3FtcC9xb2JqZWN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCisKK3R5cGVkZWYgdm9pZCAoUW1wQ29tbWFuZEZ1bmMpKFFEaWN0ICosIFFPYmplY3QgKiosIEVycm9yICoqKTsKKwordHlwZWRlZiBlbnVtIFFtcENvbW1hbmRUeXBlCit7CisgICAgUUNUX05PUk1BTCwKK30gUW1wQ29tbWFuZFR5cGU7CisKK3R5cGVkZWYgZW51bSBRbXBDb21tYW5kT3B0aW9ucworeworICAgIFFDT19OT19PUFRJT05TID0gMHgwLAorICAgIFFDT19OT19TVUNDRVNTX1JFU1AgPSAweDEsCit9IFFtcENvbW1hbmRPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBRbXBDb21tYW5kCit7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBRbXBDb21tYW5kVHlwZSB0eXBlOworICAgIFFtcENvbW1hbmRGdW5jICpmbjsKKyAgICBRbXBDb21tYW5kT3B0aW9ucyBvcHRpb25zOworICAgIFFUQUlMUV9FTlRSWShRbXBDb21tYW5kKSBub2RlOworICAgIGJvb2wgZW5hYmxlZDsKK30gUW1wQ29tbWFuZDsKKwordm9pZCBxbXBfcmVnaXN0ZXJfY29tbWFuZChjb25zdCBjaGFyICpuYW1lLCBRbXBDb21tYW5kRnVuYyAqZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFtcENvbW1hbmRPcHRpb25zIG9wdGlvbnMpOworUW1wQ29tbWFuZCAqcW1wX2ZpbmRfY29tbWFuZChjb25zdCBjaGFyICpuYW1lKTsKK1FPYmplY3QgKnFtcF9kaXNwYXRjaChRT2JqZWN0ICpyZXF1ZXN0KTsKK3ZvaWQgcW1wX2Rpc2FibGVfY29tbWFuZChjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgcW1wX2VuYWJsZV9jb21tYW5kKGNvbnN0IGNoYXIgKm5hbWUpOworYm9vbCBxbXBfY29tbWFuZF9pc19lbmFibGVkKGNvbnN0IFFtcENvbW1hbmQgKmNtZCk7Citjb25zdCBjaGFyICpxbXBfY29tbWFuZF9uYW1lKGNvbnN0IFFtcENvbW1hbmQgKmNtZCk7Citib29sIHFtcF9oYXNfc3VjY2Vzc19yZXNwb25zZShjb25zdCBRbXBDb21tYW5kICpjbWQpOworUU9iamVjdCAqcW1wX2J1aWxkX2Vycm9yX29iamVjdChFcnJvciAqZXJycCk7Cit0eXBlZGVmIHZvaWQgKCpxbXBfY21kX2NhbGxiYWNrX2ZuKShRbXBDb21tYW5kICpjbWQsIHZvaWQgKm9wYXF1ZSk7Cit2b2lkIHFtcF9mb3JfZWFjaF9jb21tYW5kKHFtcF9jbWRfY2FsbGJhY2tfZm4gZm4sIHZvaWQgKm9wYXF1ZSk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvanNvbi1sZXhlci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL2pzb24tbGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGZmMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL2pzb24tbGV4ZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogSlNPTiBsZXhlcgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDkKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX0pTT05fTEVYRVJfSAorI2RlZmluZSBRRU1VX0pTT05fTEVYRVJfSAorCisjaW5jbHVkZSAicWFwaS9xbXAvcXN0cmluZy5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FsaXN0LmgiCisKK3R5cGVkZWYgZW51bSBqc29uX3Rva2VuX3R5cGUgeworICAgIEpTT05fT1BFUkFUT1IgPSAxMDAsCisgICAgSlNPTl9JTlRFR0VSLAorICAgIEpTT05fRkxPQVQsCisgICAgSlNPTl9LRVlXT1JELAorICAgIEpTT05fU1RSSU5HLAorICAgIEpTT05fRVNDQVBFLAorICAgIEpTT05fU0tJUCwKKyAgICBKU09OX0VSUk9SLAorfSBKU09OVG9rZW5UeXBlOworCit0eXBlZGVmIHN0cnVjdCBKU09OTGV4ZXIgSlNPTkxleGVyOworCit0eXBlZGVmIHZvaWQgKEpTT05MZXhlckVtaXR0ZXIpKEpTT05MZXhlciAqLCBRU3RyaW5nICosIEpTT05Ub2tlblR5cGUsIGludCB4LCBpbnQgeSk7CisKK3N0cnVjdCBKU09OTGV4ZXIKK3sKKyAgICBKU09OTGV4ZXJFbWl0dGVyICplbWl0OworICAgIGludCBzdGF0ZTsKKyAgICBRU3RyaW5nICp0b2tlbjsKKyAgICBpbnQgeCwgeTsKK307CisKK3ZvaWQganNvbl9sZXhlcl9pbml0KEpTT05MZXhlciAqbGV4ZXIsIEpTT05MZXhlckVtaXR0ZXIgZnVuYyk7CisKK2ludCBqc29uX2xleGVyX2ZlZWQoSlNPTkxleGVyICpsZXhlciwgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKK2ludCBqc29uX2xleGVyX2ZsdXNoKEpTT05MZXhlciAqbGV4ZXIpOworCit2b2lkIGpzb25fbGV4ZXJfZGVzdHJveShKU09OTGV4ZXIgKmxleGVyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvanNvbi1wYXJzZXIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9qc29uLXBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MGIzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvanNvbi1wYXJzZXIuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogSlNPTiBQYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA5CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUUVNVV9KU09OX1BBUlNFUl9ICisjZGVmaW5lIFFFTVVfSlNPTl9QQVJTRVJfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvZXJyb3IuaCIKKworUU9iamVjdCAqanNvbl9wYXJzZXJfcGFyc2UoUUxpc3QgKnRva2VucywgdmFfbGlzdCAqYXApOworUU9iamVjdCAqanNvbl9wYXJzZXJfcGFyc2VfZXJyKFFMaXN0ICp0b2tlbnMsIHZhX2xpc3QgKmFwLCBFcnJvciAqKmVycnApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9qc29uLXN0cmVhbWVyLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvanNvbi1zdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyM2Y3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvanNvbi1zdHJlYW1lci5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBKU09OIHN0cmVhbWluZyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFFTVVfSlNPTl9TVFJFQU1FUl9ICisjZGVmaW5lIFFFTVVfSlNPTl9TVFJFQU1FUl9ICisKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL2pzb24tbGV4ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSlNPTk1lc3NhZ2VQYXJzZXIKK3sKKyAgICB2b2lkICgqZW1pdCkoc3RydWN0IEpTT05NZXNzYWdlUGFyc2VyICpwYXJzZXIsIFFMaXN0ICp0b2tlbnMpOworICAgIEpTT05MZXhlciBsZXhlcjsKKyAgICBpbnQgYnJhY2VfY291bnQ7CisgICAgaW50IGJyYWNrZXRfY291bnQ7CisgICAgUUxpc3QgKnRva2VuczsKKyAgICB1aW50NjRfdCB0b2tlbl9zaXplOworfSBKU09OTWVzc2FnZVBhcnNlcjsKKwordm9pZCBqc29uX21lc3NhZ2VfcGFyc2VyX2luaXQoSlNPTk1lc3NhZ2VQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmdW5jKShKU09OTWVzc2FnZVBhcnNlciAqLCBRTGlzdCAqKSk7CisKK2ludCBqc29uX21lc3NhZ2VfcGFyc2VyX2ZlZWQoSlNPTk1lc3NhZ2VQYXJzZXIgKnBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKK2ludCBqc29uX21lc3NhZ2VfcGFyc2VyX2ZsdXNoKEpTT05NZXNzYWdlUGFyc2VyICpwYXJzZXIpOworCit2b2lkIGpzb25fbWVzc2FnZV9wYXJzZXJfZGVzdHJveShKU09OTWVzc2FnZVBhcnNlciAqcGFyc2VyKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWJvb2wuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWFhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWJvb2wuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogUUJvb2wgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFCT09MX0gKKyNkZWZpbmUgUUJPT0xfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorCit0eXBlZGVmIHN0cnVjdCBRQm9vbCB7CisgICAgUU9iamVjdF9IRUFEOworICAgIGludCB2YWx1ZTsKK30gUUJvb2w7CisKK1FCb29sICpxYm9vbF9mcm9tX2ludChpbnQgdmFsdWUpOworaW50IHFib29sX2dldF9pbnQoY29uc3QgUUJvb2wgKnFiKTsKK1FCb29sICpxb2JqZWN0X3RvX3Fib29sKGNvbnN0IFFPYmplY3QgKm9iaik7CisKKyNlbmRpZiAvKiBRQk9PTF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWRpY3QuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xZGljdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWZkODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWRpY3QuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogUURpY3QgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHVpeiBDYXBpdHVsaW5vIDxsY2FwaXR1bGlub0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaWZuZGVmIFFESUNUX0gKKyNkZWZpbmUgUURJQ1RfSAorCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FsaXN0LmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIFFESUNUX0JVQ0tFVF9NQVggNTEyCisKK3R5cGVkZWYgc3RydWN0IFFEaWN0RW50cnkgeworICAgIGNoYXIgKmtleTsKKyAgICBRT2JqZWN0ICp2YWx1ZTsKKyAgICBRTElTVF9FTlRSWShRRGljdEVudHJ5KSBuZXh0OworfSBRRGljdEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBRRGljdCB7CisgICAgUU9iamVjdF9IRUFEOworICAgIHNpemVfdCBzaXplOworICAgIFFMSVNUX0hFQUQoLFFEaWN0RW50cnkpIHRhYmxlW1FESUNUX0JVQ0tFVF9NQVhdOworfSBRRGljdDsKKworLyogT2JqZWN0IEFQSSAqLworUURpY3QgKnFkaWN0X25ldyh2b2lkKTsKK2NvbnN0IGNoYXIgKnFkaWN0X2VudHJ5X2tleShjb25zdCBRRGljdEVudHJ5ICplbnRyeSk7CitRT2JqZWN0ICpxZGljdF9lbnRyeV92YWx1ZShjb25zdCBRRGljdEVudHJ5ICplbnRyeSk7CitzaXplX3QgcWRpY3Rfc2l6ZShjb25zdCBRRGljdCAqcWRpY3QpOwordm9pZCBxZGljdF9wdXRfb2JqKFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5LCBRT2JqZWN0ICp2YWx1ZSk7Cit2b2lkIHFkaWN0X2RlbChRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQgcWRpY3RfaGFza2V5KGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5KTsKK1FPYmplY3QgKnFkaWN0X2dldChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSk7CitRRGljdCAqcW9iamVjdF90b19xZGljdChjb25zdCBRT2JqZWN0ICpvYmopOwordm9pZCBxZGljdF9pdGVyKGNvbnN0IFFEaWN0ICpxZGljdCwKKyAgICAgICAgICAgICAgICB2b2lkICgqaXRlcikoY29uc3QgY2hhciAqa2V5LCBRT2JqZWN0ICpvYmosIHZvaWQgKm9wYXF1ZSksCisgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2NvbnN0IFFEaWN0RW50cnkgKnFkaWN0X2ZpcnN0KGNvbnN0IFFEaWN0ICpxZGljdCk7Citjb25zdCBRRGljdEVudHJ5ICpxZGljdF9uZXh0KGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgUURpY3RFbnRyeSAqZW50cnkpOworCisvKiBIZWxwZXIgdG8gcWRpY3RfcHV0X29iaigpLCBhY2NlcHRzIGFueSBvYmplY3QgKi8KKyNkZWZpbmUgcWRpY3RfcHV0KHFkaWN0LCBrZXksIG9iaikgXAorICAgICAgICBxZGljdF9wdXRfb2JqKHFkaWN0LCBrZXksIFFPQkpFQ1Qob2JqKSkKKworLyogSGlnaCBsZXZlbCBoZWxwZXJzICovCitkb3VibGUgcWRpY3RfZ2V0X2RvdWJsZShjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSk7CitpbnQ2NF90IHFkaWN0X2dldF9pbnQoY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXkpOworaW50IHFkaWN0X2dldF9ib29sKGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5KTsKK1FMaXN0ICpxZGljdF9nZXRfcWxpc3QoY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXkpOworUURpY3QgKnFkaWN0X2dldF9xZGljdChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSk7Citjb25zdCBjaGFyICpxZGljdF9nZXRfc3RyKGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5KTsKK2ludDY0X3QgcWRpY3RfZ2V0X3RyeV9pbnQoY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVmX3ZhbHVlKTsKK2ludCBxZGljdF9nZXRfdHJ5X2Jvb2woY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXksIGludCBkZWZfdmFsdWUpOworY29uc3QgY2hhciAqcWRpY3RfZ2V0X3RyeV9zdHIoY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXkpOworCitRRGljdCAqcWRpY3RfY2xvbmVfc2hhbGxvdyhjb25zdCBRRGljdCAqc3JjKTsKK3ZvaWQgcWRpY3RfZmxhdHRlbihRRGljdCAqcWRpY3QpOworCit2b2lkIHFkaWN0X2V4dHJhY3Rfc3VicWRpY3QoUURpY3QgKnNyYywgUURpY3QgKipkc3QsIGNvbnN0IGNoYXIgKnN0YXJ0KTsKKworI2VuZGlmIC8qIFFESUNUX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xZXJyb3IuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBjMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3FlcnJvci5oCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogUUVycm9yIE1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBBdXRob3JzOgorICogIEx1aXogQ2FwaXR1bGlubyA8bGNhcGl0dWxpbm9AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKyNpZm5kZWYgUUVSUk9SX0gKKyNkZWZpbmUgUUVSUk9SX0gKKworI2luY2x1ZGUgInFhcGkvcW1wL3FkaWN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcXN0cmluZy5oIgorI2luY2x1ZGUgInFlbXUvZXJyb3ItcmVwb3J0LmgiCisjaW5jbHVkZSAicWFwaS9lcnJvci5oIgorI2luY2x1ZGUgInFhcGktdHlwZXMuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QgUUVycm9yIHsKKyAgICBRT2JqZWN0X0hFQUQ7CisgICAgTG9jYXRpb24gbG9jOworICAgIGNoYXIgKmVycl9tc2c7CisgICAgRXJyb3JDbGFzcyBlcnJfY2xhc3M7Cit9IFFFcnJvcjsKKworUVN0cmluZyAqcWVycm9yX2h1bWFuKGNvbnN0IFFFcnJvciAqcWVycm9yKTsKK3ZvaWQgcWVycm9yX3JlcG9ydChFcnJvckNsYXNzIGVycl9jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pIEdDQ19GTVRfQVRUUigyLCAzKTsKK3ZvaWQgcWVycm9yX3JlcG9ydF9lcnIoRXJyb3IgKmVycik7Cit2b2lkIGFzc2VydF9ub19lcnJvcihFcnJvciAqZXJyKTsKKworLyoKKyAqIFFFcnJvciBjbGFzcyBsaXN0CisgKiBQbGVhc2Uga2VlcCB0aGUgZGVmaW5pdGlvbnMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICogVXNlIHNjcmlwdHMvY2hlY2stcWVycm9yLnNoIHRvIGNoZWNrLgorICovCisjZGVmaW5lIFFFUlJfQUREX0NMSUVOVF9GQUlMRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJDb3VsZCBub3QgYWRkIGNsaWVudCIKKworI2RlZmluZSBRRVJSX0FNQklHVU9VU19QQVRIIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiUGF0aCAnJXMnIGRvZXMgbm90IHVuaXF1ZWx5IGlkZW50aWZ5IGFuIG9iamVjdCIKKworI2RlZmluZSBRRVJSX0JBRF9CVVNfRk9SX0RFVklDRSBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkRldmljZSAnJXMnIGNhbid0IGdvIG9uIGEgJXMgYnVzIgorCisjZGVmaW5lIFFFUlJfQkFTRV9OT1RfRk9VTkQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJCYXNlICclcycgbm90IGZvdW5kIgorCisjZGVmaW5lIFFFUlJfQkxPQ0tfSk9CX05PVF9BQ1RJVkUgXAorICAgIEVSUk9SX0NMQVNTX0RFVklDRV9OT1RfQUNUSVZFLCAiTm8gYWN0aXZlIGJsb2NrIGpvYiBvbiBkZXZpY2UgJyVzJyIKKworI2RlZmluZSBRRVJSX0JMT0NLX0pPQl9QQVVTRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJUaGUgYmxvY2sgam9iIGZvciBkZXZpY2UgJyVzJyBpcyBjdXJyZW50bHkgcGF1c2VkIgorCisjZGVmaW5lIFFFUlJfQkxPQ0tfSk9CX05PVF9SRUFEWSBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlRoZSBhY3RpdmUgYmxvY2sgam9iIGZvciBkZXZpY2UgJyVzJyBjYW5ub3QgYmUgY29tcGxldGVkIgorCisjZGVmaW5lIFFFUlJfQkxPQ0tfRk9STUFUX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkJsb2NrIGZvcm1hdCAnJXMnIHVzZWQgYnkgZGV2aWNlICclcycgZG9lcyBub3Qgc3VwcG9ydCBmZWF0dXJlICclcyciCisKKyNkZWZpbmUgUUVSUl9CVUZGRVJfT1ZFUlJVTiBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkFuIGludGVybmFsIGJ1ZmZlciBvdmVycmFuIgorCisjZGVmaW5lIFFFUlJfQlVTX05PX0hPVFBMVUcgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJCdXMgJyVzJyBkb2VzIG5vdCBzdXBwb3J0IGhvdHBsdWdnaW5nIgorCisjZGVmaW5lIFFFUlJfQlVTX05PVF9GT1VORCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkJ1cyAnJXMnIG5vdCBmb3VuZCIKKworI2RlZmluZSBRRVJSX0NPTU1BTkRfRElTQUJMRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJUaGUgY29tbWFuZCAlcyBoYXMgYmVlbiBkaXNhYmxlZCBmb3IgdGhpcyBpbnN0YW5jZSIKKworI2RlZmluZSBRRVJSX0NPTU1BTkRfTk9UX0ZPVU5EIFwKKyAgICBFUlJPUl9DTEFTU19DT01NQU5EX05PVF9GT1VORCwgIlRoZSBjb21tYW5kICVzIGhhcyBub3QgYmVlbiBmb3VuZCIKKworI2RlZmluZSBRRVJSX0RFVklDRV9FTkNSWVBURUQgXAorICAgIEVSUk9SX0NMQVNTX0RFVklDRV9FTkNSWVBURUQsICInJXMnICglcykgaXMgZW5jcnlwdGVkIgorCisjZGVmaW5lIFFFUlJfREVWSUNFX0ZFQVRVUkVfQkxPQ0tTX01JR1JBVElPTiBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIk1pZ3JhdGlvbiBpcyBkaXNhYmxlZCB3aGVuIHVzaW5nIGZlYXR1cmUgJyVzJyBpbiBkZXZpY2UgJyVzJyIKKworI2RlZmluZSBRRVJSX0RFVklDRV9IQVNfTk9fTUVESVVNIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiRGV2aWNlICclcycgaGFzIG5vIG1lZGl1bSIKKworI2RlZmluZSBRRVJSX0RFVklDRV9JTklUX0ZBSUxFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkRldmljZSAnJXMnIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCIKKworI2RlZmluZSBRRVJSX0RFVklDRV9JTl9VU0UgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJEZXZpY2UgJyVzJyBpcyBpbiB1c2UiCisKKyNkZWZpbmUgUUVSUl9ERVZJQ0VfSVNfUkVBRF9PTkxZIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiRGV2aWNlICclcycgaXMgcmVhZCBvbmx5IgorCisjZGVmaW5lIFFFUlJfREVWSUNFX0xPQ0tFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkRldmljZSAnJXMnIGlzIGxvY2tlZCIKKworI2RlZmluZSBRRVJSX0RFVklDRV9NVUxUSVBMRV9CVVNTRVMgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJEZXZpY2UgJyVzJyBoYXMgbXVsdGlwbGUgY2hpbGQgYnVzc2VzIgorCisjZGVmaW5lIFFFUlJfREVWSUNFX05PX0JVUyBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkRldmljZSAnJXMnIGhhcyBubyBjaGlsZCBidXMiCisKKyNkZWZpbmUgUUVSUl9ERVZJQ0VfTk9fSE9UUExVRyBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkRldmljZSAnJXMnIGRvZXMgbm90IHN1cHBvcnQgaG90cGx1Z2dpbmciCisKKyNkZWZpbmUgUUVSUl9ERVZJQ0VfTk9UX0FDVElWRSBcCisgICAgRVJST1JfQ0xBU1NfREVWSUNFX05PVF9BQ1RJVkUsICJEZXZpY2UgJyVzJyBoYXMgbm90IGJlZW4gYWN0aXZhdGVkIgorCisjZGVmaW5lIFFFUlJfREVWSUNFX05PVF9FTkNSWVBURUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJEZXZpY2UgJyVzJyBpcyBub3QgZW5jcnlwdGVkIgorCisjZGVmaW5lIFFFUlJfREVWSUNFX05PVF9GT1VORCBcCisgICAgRVJST1JfQ0xBU1NfREVWSUNFX05PVF9GT1VORCwgIkRldmljZSAnJXMnIG5vdCBmb3VuZCIKKworI2RlZmluZSBRRVJSX0RFVklDRV9OT1RfUkVNT1ZBQkxFIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiRGV2aWNlICclcycgaXMgbm90IHJlbW92YWJsZSIKKworI2RlZmluZSBRRVJSX0RVUExJQ0FURV9JRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkR1cGxpY2F0ZSBJRCAnJXMnIGZvciAlcyIKKworI2RlZmluZSBRRVJSX0ZEX05PVF9GT1VORCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkZpbGUgZGVzY3JpcHRvciBuYW1lZCAnJXMnIG5vdCBmb3VuZCIKKworI2RlZmluZSBRRVJSX0ZEX05PVF9TVVBQTElFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIk5vIGZpbGUgZGVzY3JpcHRvciBzdXBwbGllZCB2aWEgU0NNX1JJR0hUUyIKKworI2RlZmluZSBRRVJSX0ZFQVRVUkVfRElTQUJMRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJUaGUgZmVhdHVyZSAnJXMnIGlzIG5vdCBlbmFibGVkIgorCisjZGVmaW5lIFFFUlJfSU5WQUxJRF9CTE9DS19GT1JNQVQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJJbnZhbGlkIGJsb2NrIGZvcm1hdCAnJXMnIgorCisjZGVmaW5lIFFFUlJfSU5WQUxJRF9PUFRJT05fR1JPVVAgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJUaGVyZSBpcyBubyBvcHRpb24gZ3JvdXAgJyVzJyIKKworI2RlZmluZSBRRVJSX0lOVkFMSURfUEFSQU1FVEVSIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXIgJyVzJyIKKworI2RlZmluZSBRRVJSX0lOVkFMSURfUEFSQU1FVEVSX0NPTUJJTkFUSU9OIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXIgY29tYmluYXRpb24iCisKKyNkZWZpbmUgUUVSUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiSW52YWxpZCBwYXJhbWV0ZXIgdHlwZSBmb3IgJyVzJywgZXhwZWN0ZWQ6ICVzIgorCisjZGVmaW5lIFFFUlJfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJQYXJhbWV0ZXIgJyVzJyBleHBlY3RzICVzIgorCisjZGVmaW5lIFFFUlJfSU5WQUxJRF9QQVNTV09SRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlBhc3N3b3JkIGluY29ycmVjdCIKKworI2RlZmluZSBRRVJSX0lPX0VSUk9SIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiQW4gSU8gZXJyb3IgaGFzIG9jY3VycmVkIgorCisjZGVmaW5lIFFFUlJfSlNPTl9QQVJTRV9FUlJPUiBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkpTT04gcGFyc2UgZXJyb3IsICVzIgorCisjZGVmaW5lIFFFUlJfSlNPTl9QQVJTSU5HIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiSW52YWxpZCBKU09OIHN5bnRheCIKKworI2RlZmluZSBRRVJSX0tWTV9NSVNTSU5HX0NBUCBcCisgICAgRVJST1JfQ0xBU1NfS19WX01fTUlTU0lOR19DQVAsICJVc2luZyBLVk0gd2l0aG91dCAlcywgJXMgdW5hdmFpbGFibGUiCisKKyNkZWZpbmUgUUVSUl9NSUdSQVRJT05fQUNUSVZFIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiVGhlcmUncyBhIG1pZ3JhdGlvbiBwcm9jZXNzIGluIHByb2dyZXNzIgorCisjZGVmaW5lIFFFUlJfTUlHUkFUSU9OX05PVF9TVVBQT1JURUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJTdGF0ZSBibG9ja2VkIGJ5IG5vbi1taWdyYXRhYmxlIGRldmljZSAnJXMnIgorCisjZGVmaW5lIFFFUlJfTUlTU0lOR19QQVJBTUVURVIgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJQYXJhbWV0ZXIgJyVzJyBpcyBtaXNzaW5nIgorCisjZGVmaW5lIFFFUlJfTk9fQlVTX0ZPUl9ERVZJQ0UgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJObyAnJXMnIGJ1cyBmb3VuZCBmb3IgZGV2aWNlICclcyciCisKKyNkZWZpbmUgUUVSUl9OT1RfU1VQUE9SVEVEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiTm90IHN1cHBvcnRlZCIKKworI2RlZmluZSBRRVJSX1BFUk1JU1NJT05fREVOSUVEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiSW5zdWZmaWNpZW50IHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiIKKworI2RlZmluZSBRRVJSX1BST1BFUlRZX05PVF9GT1VORCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlByb3BlcnR5ICclcy4lcycgbm90IGZvdW5kIgorCisjZGVmaW5lIFFFUlJfUFJPUEVSVFlfVkFMVUVfQkFEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiUHJvcGVydHkgJyVzLiVzJyBkb2Vzbid0IHRha2UgdmFsdWUgJyVzJyIKKworI2RlZmluZSBRRVJSX1BST1BFUlRZX1ZBTFVFX0lOX1VTRSBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlByb3BlcnR5ICclcy4lcycgY2FuJ3QgdGFrZSB2YWx1ZSAnJXMnLCBpdCdzIGluIHVzZSIKKworI2RlZmluZSBRRVJSX1BST1BFUlRZX1ZBTFVFX05PVF9GT1VORCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlByb3BlcnR5ICclcy4lcycgY2FuJ3QgZmluZCB2YWx1ZSAnJXMnIgorCisjZGVmaW5lIFFFUlJfUFJPUEVSVFlfVkFMVUVfTk9UX1BPV0VSX09GXzIgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJQcm9wZXJ0eSAlcy4lcyBkb2Vzbid0IHRha2UgdmFsdWUgJyUiIFBSSWQ2NCAiJywgaXQncyBub3QgYSBwb3dlciBvZiAyIgorCisjZGVmaW5lIFFFUlJfUFJPUEVSVFlfVkFMVUVfT1VUX09GX1JBTkdFIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiUHJvcGVydHkgJXMuJXMgZG9lc24ndCB0YWtlIHZhbHVlICUiIFBSSWQ2NCAiIChtaW5pbXVtOiAlIiBQUklkNjQgIiwgbWF4aW11bTogJSIgUFJJZDY0ICIpIgorCisjZGVmaW5lIFFFUlJfUUdBX0NPTU1BTkRfRkFJTEVEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiR3Vlc3QgYWdlbnQgY29tbWFuZCBmYWlsZWQsIGVycm9yIHdhcyAnJXMnIgorCisjZGVmaW5lIFFFUlJfUUdBX0xPR0dJTkdfRkFJTEVEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiR3Vlc3QgYWdlbnQgZmFpbGVkIHRvIGxvZyBub24tb3B0aW9uYWwgbG9nIHN0YXRlbWVudCIKKworI2RlZmluZSBRRVJSX1FNUF9CQURfSU5QVVRfT0JKRUNUIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiRXhwZWN0ZWQgJyVzJyBpbiBRTVAgaW5wdXQiCisKKyNkZWZpbmUgUUVSUl9RTVBfQkFEX0lOUFVUX09CSkVDVF9NRU1CRVIgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJRTVAgaW5wdXQgb2JqZWN0IG1lbWJlciAnJXMnIGV4cGVjdHMgJyVzJyIKKworI2RlZmluZSBRRVJSX1FNUF9FWFRSQV9NRU1CRVIgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJRTVAgaW5wdXQgb2JqZWN0IG1lbWJlciAnJXMnIGlzIHVuZXhwZWN0ZWQiCisKKyNkZWZpbmUgUUVSUl9SRVNFVF9SRVFVSVJFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIlJlc2V0dGluZyB0aGUgVmlydHVhbCBNYWNoaW5lIGlzIHJlcXVpcmVkIgorCisjZGVmaW5lIFFFUlJfU0VUX1BBU1NXRF9GQUlMRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJDb3VsZCBub3Qgc2V0IHBhc3N3b3JkIgorCisjZGVmaW5lIFFFUlJfVE9PX01BTllfRklMRVMgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJUb28gbWFueSBvcGVuIGZpbGVzIgorCisjZGVmaW5lIFFFUlJfVU5ERUZJTkVEX0VSUk9SIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiQW4gdW5kZWZpbmVkIGVycm9yIGhhcyBvY2N1cnJlZCIKKworI2RlZmluZSBRRVJSX1VOS05PV05fQkxPQ0tfRk9STUFUX0ZFQVRVUkUgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICInJXMnIHVzZXMgYSAlcyBmZWF0dXJlIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBxZW11IHZlcnNpb246ICVzIgorCisjZGVmaW5lIFFFUlJfVU5TVVBQT1JURUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJ0aGlzIGZlYXR1cmUgb3IgY29tbWFuZCBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCIKKworI2RlZmluZSBRRVJSX1ZJUlRGU19GRUFUVVJFX0JMT0NLU19NSUdSQVRJT04gXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJNaWdyYXRpb24gaXMgZGlzYWJsZWQgd2hlbiBWaXJ0RlMgZXhwb3J0IHBhdGggJyVzJyBpcyBtb3VudGVkIGluIHRoZSBndWVzdCB1c2luZyBtb3VudF90YWcgJyVzJyIKKworI2RlZmluZSBRRVJSX1NPQ0tFVF9DT05ORUNUX0ZBSUxFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkZhaWxlZCB0byBjb25uZWN0IHRvIHNvY2tldCIKKworI2RlZmluZSBRRVJSX1NPQ0tFVF9MSVNURU5fRkFJTEVEIFwKKyAgICBFUlJPUl9DTEFTU19HRU5FUklDX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBzb2NrZXQgdG8gbGlzdGVuaW5nIG1vZGUiCisKKyNkZWZpbmUgUUVSUl9TT0NLRVRfQklORF9GQUlMRUQgXAorICAgIEVSUk9SX0NMQVNTX0dFTkVSSUNfRVJST1IsICJGYWlsZWQgdG8gYmluZCBzb2NrZXQiCisKKyNkZWZpbmUgUUVSUl9TT0NLRVRfQ1JFQVRFX0ZBSUxFRCBcCisgICAgRVJST1JfQ0xBU1NfR0VORVJJQ19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0IgorCisjZW5kaWYgLyogUUVSUk9SX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xZmxvYXQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xZmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY1ODQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3FmbG9hdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBRRmxvYXQgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFGTE9BVF9ICisjZGVmaW5lIFFGTE9BVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJxYXBpL3FtcC9xb2JqZWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IFFGbG9hdCB7CisgICAgUU9iamVjdF9IRUFEOworICAgIGRvdWJsZSB2YWx1ZTsKK30gUUZsb2F0OworCitRRmxvYXQgKnFmbG9hdF9mcm9tX2RvdWJsZShkb3VibGUgdmFsdWUpOworZG91YmxlIHFmbG9hdF9nZXRfZG91YmxlKGNvbnN0IFFGbG9hdCAqcWkpOworUUZsb2F0ICpxb2JqZWN0X3RvX3FmbG9hdChjb25zdCBRT2JqZWN0ICpvYmopOworCisjZW5kaWYgLyogUUZMT0FUX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xaW50LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTQxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWludC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBRSW50IE1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBBdXRob3JzOgorICogIEx1aXogQ2FwaXR1bGlubyA8bGNhcGl0dWxpbm9AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBRSU5UX0gKKyNkZWZpbmUgUUlOVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJxYXBpL3FtcC9xb2JqZWN0LmgiCisKK3R5cGVkZWYgc3RydWN0IFFJbnQgeworICAgIFFPYmplY3RfSEVBRDsKKyAgICBpbnQ2NF90IHZhbHVlOworfSBRSW50OworCitRSW50ICpxaW50X2Zyb21faW50KGludDY0X3QgdmFsdWUpOworaW50NjRfdCBxaW50X2dldF9pbnQoY29uc3QgUUludCAqcWkpOworUUludCAqcW9iamVjdF90b19xaW50KGNvbnN0IFFPYmplY3QgKm9iaik7CisKKyNlbmRpZiAvKiBRSU5UX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xanNvbi5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3Fqc29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNTFlZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xanNvbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBRT2JqZWN0IEpTT04gaW50ZWdyYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA5CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUUpTT05fSAorI2RlZmluZSBRSlNPTl9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlICJxZW11L2NvbXBpbGVyLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKworUU9iamVjdCAqcW9iamVjdF9mcm9tX2pzb24oY29uc3QgY2hhciAqc3RyaW5nKSBHQ0NfRk1UX0FUVFIoMSwgMCk7CitRT2JqZWN0ICpxb2JqZWN0X2Zyb21fanNvbmYoY29uc3QgY2hhciAqc3RyaW5nLCAuLi4pIEdDQ19GTVRfQVRUUigxLCAyKTsKK1FPYmplY3QgKnFvYmplY3RfZnJvbV9qc29udihjb25zdCBjaGFyICpzdHJpbmcsIHZhX2xpc3QgKmFwKSBHQ0NfRk1UX0FUVFIoMSwgMCk7CisKK1FTdHJpbmcgKnFvYmplY3RfdG9fanNvbihjb25zdCBRT2JqZWN0ICpvYmopOworUVN0cmluZyAqcW9iamVjdF90b19qc29uX3ByZXR0eShjb25zdCBRT2JqZWN0ICpvYmopOworCisjZW5kaWYgLyogUUpTT05fSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3FsaXN0LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M0ODMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3FsaXN0LmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIFFMaXN0IE1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBBdXRob3JzOgorICogIEx1aXogQ2FwaXR1bGlubyA8bGNhcGl0dWxpbm9AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBRTElTVF9ICisjZGVmaW5lIFFMSVNUX0gKKworI2luY2x1ZGUgInFhcGkvcW1wL3FvYmplY3QuaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisKK3R5cGVkZWYgc3RydWN0IFFMaXN0RW50cnkgeworICAgIFFPYmplY3QgKnZhbHVlOworICAgIFFUQUlMUV9FTlRSWShRTGlzdEVudHJ5KSBuZXh0OworfSBRTGlzdEVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBRTGlzdCB7CisgICAgUU9iamVjdF9IRUFEOworICAgIFFUQUlMUV9IRUFEKCxRTGlzdEVudHJ5KSBoZWFkOworfSBRTGlzdDsKKworI2RlZmluZSBxbGlzdF9hcHBlbmQocWxpc3QsIG9iaikgXAorICAgICAgICBxbGlzdF9hcHBlbmRfb2JqKHFsaXN0LCBRT0JKRUNUKG9iaikpCisKKyNkZWZpbmUgUUxJU1RfRk9SRUFDSF9FTlRSWShxbGlzdCwgdmFyKSAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoKHZhcikgPSAoKHFsaXN0KS0+aGVhZC50cWhfZmlyc3QpOyAgICAgXAorICAgICAgICAgICAgKHZhcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh2YXIpID0gKCh2YXIpLT5uZXh0LnRxZV9uZXh0KSkKKworc3RhdGljIGlubGluZSBRT2JqZWN0ICpxbGlzdF9lbnRyeV9vYmooY29uc3QgUUxpc3RFbnRyeSAqZW50cnkpCit7CisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKK30KKworUUxpc3QgKnFsaXN0X25ldyh2b2lkKTsKK1FMaXN0ICpxbGlzdF9jb3B5KFFMaXN0ICpzcmMpOwordm9pZCBxbGlzdF9hcHBlbmRfb2JqKFFMaXN0ICpxbGlzdCwgUU9iamVjdCAqb2JqKTsKK3ZvaWQgcWxpc3RfaXRlcihjb25zdCBRTGlzdCAqcWxpc3QsCisgICAgICAgICAgICAgICAgdm9pZCAoKml0ZXIpKFFPYmplY3QgKm9iaiwgdm9pZCAqb3BhcXVlKSwgdm9pZCAqb3BhcXVlKTsKK1FPYmplY3QgKnFsaXN0X3BvcChRTGlzdCAqcWxpc3QpOworUU9iamVjdCAqcWxpc3RfcGVlayhRTGlzdCAqcWxpc3QpOworaW50IHFsaXN0X2VtcHR5KGNvbnN0IFFMaXN0ICpxbGlzdCk7CitzaXplX3QgcWxpc3Rfc2l6ZShjb25zdCBRTGlzdCAqcWxpc3QpOworUUxpc3QgKnFvYmplY3RfdG9fcWxpc3QoY29uc3QgUU9iamVjdCAqb2JqKTsKKworc3RhdGljIGlubGluZSBjb25zdCBRTGlzdEVudHJ5ICpxbGlzdF9maXJzdChjb25zdCBRTGlzdCAqcWxpc3QpCit7CisgICAgcmV0dXJuIFFUQUlMUV9GSVJTVCgmcWxpc3QtPmhlYWQpOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IFFMaXN0RW50cnkgKnFsaXN0X25leHQoY29uc3QgUUxpc3RFbnRyeSAqZW50cnkpCit7CisgICAgcmV0dXJuIFFUQUlMUV9ORVhUKGVudHJ5LCBuZXh0KTsKK30KKworI2VuZGlmIC8qIFFMSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xb2JqZWN0LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmJjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvcW9iamVjdC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogUUVNVSBPYmplY3QgTW9kZWwuCisgKgorICogQmFzZWQgb24gaWRlYXMgYnkgQXZpIEtpdml0eSA8YXZpQHJlZGhhdC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHVpeiBDYXBpdHVsaW5vIDxsY2FwaXR1bGlub0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKiBRT2JqZWN0IFJlZmVyZW5jZSBDb3VudHMgVGVybWlub2xvZ3kKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAtIFJldHVybmluZyByZWZlcmVuY2VzOiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYmplY3QgbWF5CisgKiAgcmV0dXJuIGl0IGFzIGVpdGhlciBhIHdlYWsgb3IgYSBzdHJvbmcgcmVmZXJlbmNlLiAgSWYgdGhlIHJlZmVyZW5jZQorICogIGlzIHN0cm9uZywgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBRREVDUkVGKCkgb24gdGhlIHJlZmVyZW5jZQorICogIHdoZW4geW91IGFyZSBkb25lLgorICoKKyAqICBJZiB0aGUgcmVmZXJlbmNlIGlzIHdlYWssIHRoZSBvd25lciBvZiB0aGUgcmVmZXJlbmNlIG1heSBmcmVlIGl0IGF0CisgKiAgYW55IHRpbWUgaW4gdGhlIGZ1dHVyZS4gIEJlZm9yZSBzdG9yaW5nIHRoZSByZWZlcmVuY2UgYW55d2hlcmUsIHlvdQorICogIHNob3VsZCBjYWxsIFFJTkNSRUYoKSB0byBtYWtlIHRoZSByZWZlcmVuY2Ugc3Ryb25nLgorICoKKyAqICAtIFRyYW5zZmVycmluZyBvd25lcnNoaXA6IHdoZW4geW91IHRyYW5zZmVyIG93bmVyc2hpcCBvZiBhIHJlZmVyZW5jZQorICogIGJ5IGNhbGxpbmcgYSBmdW5jdGlvbiwgeW91IGFyZSBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAqICBRREVDUkVGKCkgd2hlbiB0aGUgcmVmZXJlbmNlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJbiBvdGhlciB3b3JkcywKKyAqICB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHlvdSBtdXN0IGJlaGF2ZSBhcyBpZiB0aGUgcmVmZXJlbmNlIHRvIHRoZQorICogIHBhc3NlZCBvYmplY3Qgd2FzIHdlYWsuCisgKi8KKyNpZm5kZWYgUU9CSkVDVF9ICisjZGVmaW5lIFFPQkpFQ1RfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3R5cGVkZWYgZW51bSB7CisgICAgUVRZUEVfTk9ORSwKKyAgICBRVFlQRV9RSU5ULAorICAgIFFUWVBFX1FTVFJJTkcsCisgICAgUVRZUEVfUURJQ1QsCisgICAgUVRZUEVfUUxJU1QsCisgICAgUVRZUEVfUUZMT0FULAorICAgIFFUWVBFX1FCT09MLAorICAgIFFUWVBFX1FFUlJPUiwKKyAgICBRVFlQRV9NQVgsCit9IHF0eXBlX2NvZGU7CisKK3N0cnVjdCBRT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCBRVHlwZSB7CisgICAgcXR5cGVfY29kZSBjb2RlOworICAgIHZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgUU9iamVjdCAqKTsKK30gUVR5cGU7CisKK3R5cGVkZWYgc3RydWN0IFFPYmplY3QgeworICAgIGNvbnN0IFFUeXBlICp0eXBlOworICAgIHNpemVfdCByZWZjbnQ7Cit9IFFPYmplY3Q7CisKKy8qIE9iamVjdHMgZGVmaW5pdGlvbnMgbXVzdCBpbmNsdWRlIHRoaXMgKi8KKyNkZWZpbmUgUU9iamVjdF9IRUFEICBcCisgICAgUU9iamVjdCBiYXNlCisKKy8qIEdldCB0aGUgJ2Jhc2UnIHBhcnQgb2YgYW4gb2JqZWN0ICovCisjZGVmaW5lIFFPQkpFQ1Qob2JqKSAoJihvYmopLT5iYXNlKQorCisvKiBIaWdoLWxldmVsIGludGVyZmFjZSBmb3IgcW9iamVjdF9pbmNyZWYoKSAqLworI2RlZmluZSBRSU5DUkVGKG9iaikgICAgICBcCisgICAgcW9iamVjdF9pbmNyZWYoUU9CSkVDVChvYmopKQorCisvKiBIaWdoLWxldmVsIGludGVyZmFjZSBmb3IgcW9iamVjdF9kZWNyZWYoKSAqLworI2RlZmluZSBRREVDUkVGKG9iaikgICAgICAgICAgICAgIFwKKyAgICBxb2JqZWN0X2RlY3JlZihvYmogPyBRT0JKRUNUKG9iaikgOiBOVUxMKQorCisvKiBJbml0aWFsaXplIGFuIG9iamVjdCB0byBkZWZhdWx0IHZhbHVlcyAqLworI2RlZmluZSBRT0JKRUNUX0lOSVQob2JqLCBxdHlwZV90eXBlKSAgIFwKKyAgICBvYmotPmJhc2UucmVmY250ID0gMTsgICAgICAgICAgICAgICBcCisgICAgb2JqLT5iYXNlLnR5cGUgICA9IHF0eXBlX3R5cGUKKworLyoqCisgKiBxb2JqZWN0X2luY3JlZigpOiBJbmNyZW1lbnQgUU9iamVjdCdzIHJlZmVyZW5jZSBjb3VudAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcW9iamVjdF9pbmNyZWYoUU9iamVjdCAqb2JqKQoreworICAgIGlmIChvYmopCisgICAgICAgIG9iai0+cmVmY250Kys7Cit9CisKKy8qKgorICogcW9iamVjdF9kZWNyZWYoKTogRGVjcmVtZW50IFFPYmplY3QncyByZWZlcmVuY2UgY291bnQsIGRlYWxsb2NhdGUKKyAqIHdoZW4gaXQgcmVhY2hlcyB6ZXJvCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxb2JqZWN0X2RlY3JlZihRT2JqZWN0ICpvYmopCit7CisgICAgaWYgKG9iaiAmJiAtLW9iai0+cmVmY250ID09IDApIHsKKyAgICAgICAgYXNzZXJ0KG9iai0+dHlwZSAhPSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KG9iai0+dHlwZS0+ZGVzdHJveSAhPSBOVUxMKTsKKyAgICAgICAgb2JqLT50eXBlLT5kZXN0cm95KG9iaik7CisgICAgfQorfQorCisvKioKKyAqIHFvYmplY3RfdHlwZSgpOiBSZXR1cm4gdGhlIFFPYmplY3QncyB0eXBlCisgKi8KK3N0YXRpYyBpbmxpbmUgcXR5cGVfY29kZSBxb2JqZWN0X3R5cGUoY29uc3QgUU9iamVjdCAqb2JqKQoreworICAgIGFzc2VydChvYmotPnR5cGUgIT0gTlVMTCk7CisgICAgcmV0dXJuIG9iai0+dHlwZS0+Y29kZTsKK30KKworI2VuZGlmIC8qIFFPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvcW1wL3FzdHJpbmcuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xc3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjMzY2NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC9xc3RyaW5nLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFFTdHJpbmcgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHVpeiBDYXBpdHVsaW5vIDxsY2FwaXR1bGlub0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaWZuZGVmIFFTVFJJTkdfSAorI2RlZmluZSBRU1RSSU5HX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInFhcGkvcW1wL3FvYmplY3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUVN0cmluZyB7CisgICAgUU9iamVjdF9IRUFEOworICAgIGNoYXIgKnN0cmluZzsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIHNpemVfdCBjYXBhY2l0eTsKK30gUVN0cmluZzsKKworUVN0cmluZyAqcXN0cmluZ19uZXcodm9pZCk7CitRU3RyaW5nICpxc3RyaW5nX2Zyb21fc3RyKGNvbnN0IGNoYXIgKnN0cik7CitRU3RyaW5nICpxc3RyaW5nX2Zyb21fc3Vic3RyKGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKTsKK3NpemVfdCBxc3RyaW5nX2dldF9sZW5ndGgoY29uc3QgUVN0cmluZyAqcXN0cmluZyk7Citjb25zdCBjaGFyICpxc3RyaW5nX2dldF9zdHIoY29uc3QgUVN0cmluZyAqcXN0cmluZyk7Cit2b2lkIHFzdHJpbmdfYXBwZW5kX2ludChRU3RyaW5nICpxc3RyaW5nLCBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgcXN0cmluZ19hcHBlbmQoUVN0cmluZyAqcXN0cmluZywgY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgcXN0cmluZ19hcHBlbmRfY2hyKFFTdHJpbmcgKnFzdHJpbmcsIGludCBjKTsKK1FTdHJpbmcgKnFvYmplY3RfdG9fcXN0cmluZyhjb25zdCBRT2JqZWN0ICpvYmopOworCisjZW5kaWYgLyogUVNUUklOR19IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvdHlwZXMuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3FtcC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODJlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9xbXAvdHlwZXMuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogSW5jbHVkZSBhbGwgUUVNVSBvYmplY3RzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0IEluYy4KKyAqCisgKiBBdXRob3JzOgorICogIEx1aXogQ2FwaXR1bGlubyA8bGNhcGl0dWxpbm9AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBRRU1VX09CSkVDVFNfSAorI2RlZmluZSBRRU1VX09CSkVDVFNfSAorCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FpbnQuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xZmxvYXQuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xYm9vbC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xZGljdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FsaXN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWpzb24uaCIKKworI2VuZGlmIC8qIFFFTVVfT0JKRUNUU19IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9zdHJpbmctaW5wdXQtdmlzaXRvci5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvc3RyaW5nLWlucHV0LXZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODkyNDNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvc3RyaW5nLWlucHV0LXZpc2l0b3IuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogU3RyaW5nIHBhcnNpbmcgVmlzaXRvcgorICoKKyAqIENvcHlyaWdodCBSZWQgSGF0LCBJbmMuIDIwMTIKKyAqCisgKiBBdXRob3I6IFBhb2xvIEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFNUUklOR19JTlBVVF9WSVNJVE9SX0gKKyNkZWZpbmUgU1RSSU5HX0lOUFVUX1ZJU0lUT1JfSAorCisjaW5jbHVkZSAicWFwaS92aXNpdG9yLmgiCisKK3R5cGVkZWYgc3RydWN0IFN0cmluZ0lucHV0VmlzaXRvciBTdHJpbmdJbnB1dFZpc2l0b3I7CisKK1N0cmluZ0lucHV0VmlzaXRvciAqc3RyaW5nX2lucHV0X3Zpc2l0b3JfbmV3KGNvbnN0IGNoYXIgKnN0cik7Cit2b2lkIHN0cmluZ19pbnB1dF92aXNpdG9yX2NsZWFudXAoU3RyaW5nSW5wdXRWaXNpdG9yICp2KTsKKworVmlzaXRvciAqc3RyaW5nX2lucHV0X2dldF92aXNpdG9yKFN0cmluZ0lucHV0VmlzaXRvciAqdik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvc3RyaW5nLW91dHB1dC12aXNpdG9yLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS9zdHJpbmctb3V0cHV0LXZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgxZTQyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvc3RyaW5nLW91dHB1dC12aXNpdG9yLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIFN0cmluZyBwcmludGluZyBWaXNpdG9yCisgKgorICogQ29weXJpZ2h0IFJlZCBIYXQsIEluYy4gMjAxMgorICoKKyAqIEF1dGhvcjogUGFvbG8gQm9uemluaSA8cGJvbnppbmlAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgU1RSSU5HX09VVFBVVF9WSVNJVE9SX0gKKyNkZWZpbmUgU1RSSU5HX09VVFBVVF9WSVNJVE9SX0gKKworI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgorCit0eXBlZGVmIHN0cnVjdCBTdHJpbmdPdXRwdXRWaXNpdG9yIFN0cmluZ091dHB1dFZpc2l0b3I7CisKK1N0cmluZ091dHB1dFZpc2l0b3IgKnN0cmluZ19vdXRwdXRfdmlzaXRvcl9uZXcodm9pZCk7Cit2b2lkIHN0cmluZ19vdXRwdXRfdmlzaXRvcl9jbGVhbnVwKFN0cmluZ091dHB1dFZpc2l0b3IgKnYpOworCitjaGFyICpzdHJpbmdfb3V0cHV0X2dldF9zdHJpbmcoU3RyaW5nT3V0cHV0VmlzaXRvciAqdik7CitWaXNpdG9yICpzdHJpbmdfb3V0cHV0X2dldF92aXNpdG9yKFN0cmluZ091dHB1dFZpc2l0b3IgKnYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3Zpc2l0b3ItaW1wbC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FhcGkvdmlzaXRvci1pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3Zpc2l0b3ItaW1wbC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3JlIERlZmluaXRpb25zIGZvciBRQVBJIFZpc2l0b3IgaW1wbGVtZW50YXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6IFBhb2xvIEJvbml6bmkgPHBib256aW5pQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworI2lmbmRlZiBRQVBJX1ZJU0lUT1JfSU1QTF9ICisjZGVmaW5lIFFBUElfVklTSVRPUl9JTVBMX0gKKworI2luY2x1ZGUgInFhcGkvZXJyb3IuaCIKKyNpbmNsdWRlICJxYXBpL3Zpc2l0b3IuaCIKKworc3RydWN0IFZpc2l0b3IKK3sKKyAgICAvKiBNdXN0IGJlIHNldCAqLworICAgIHZvaWQgKCpzdGFydF9zdHJ1Y3QpKFZpc2l0b3IgKnYsIHZvaWQgKipvYmosIGNvbnN0IGNoYXIgKmtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IHNpemUsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKmVuZF9zdHJ1Y3QpKFZpc2l0b3IgKnYsIEVycm9yICoqZXJycCk7CisKKyAgICB2b2lkICgqc3RhcnRfaW1wbGljaXRfc3RydWN0KShWaXNpdG9yICp2LCB2b2lkICoqb2JqLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCplbmRfaW1wbGljaXRfc3RydWN0KShWaXNpdG9yICp2LCBFcnJvciAqKmVycnApOworCisgICAgdm9pZCAoKnN0YXJ0X2xpc3QpKFZpc2l0b3IgKnYsIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisgICAgR2VuZXJpY0xpc3QgKigqbmV4dF9saXN0KShWaXNpdG9yICp2LCBHZW5lcmljTGlzdCAqKmxpc3QsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKmVuZF9saXN0KShWaXNpdG9yICp2LCBFcnJvciAqKmVycnApOworCisgICAgdm9pZCAoKnR5cGVfZW51bSkoVmlzaXRvciAqdiwgaW50ICpvYmosIGNvbnN0IGNoYXIgKnN0cmluZ3NbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpraW5kLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCpnZXRfbmV4dF90eXBlKShWaXNpdG9yICp2LCBpbnQgKmtpbmQsIGNvbnN0IGludCAqcW9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisKKyAgICB2b2lkICgqdHlwZV9pbnQpKFZpc2l0b3IgKnYsIGludDY0X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKyAgICB2b2lkICgqdHlwZV9ib29sKShWaXNpdG9yICp2LCBib29sICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKnR5cGVfc3RyKShWaXNpdG9yICp2LCBjaGFyICoqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCp0eXBlX251bWJlcikoVmlzaXRvciAqdiwgZG91YmxlICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworCisgICAgLyogTWF5IGJlIE5VTEwgKi8KKyAgICB2b2lkICgqc3RhcnRfb3B0aW9uYWwpKFZpc2l0b3IgKnYsIGJvb2wgKnByZXNlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCplbmRfb3B0aW9uYWwpKFZpc2l0b3IgKnYsIEVycm9yICoqZXJycCk7CisKKyAgICB2b2lkICgqc3RhcnRfaGFuZGxlKShWaXNpdG9yICp2LCB2b2lkICoqb2JqLCBjb25zdCBjaGFyICpraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKmVuZF9oYW5kbGUpKFZpc2l0b3IgKnYsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKnR5cGVfdWludDgpKFZpc2l0b3IgKnYsIHVpbnQ4X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKyAgICB2b2lkICgqdHlwZV91aW50MTYpKFZpc2l0b3IgKnYsIHVpbnQxNl90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKnR5cGVfdWludDMyKShWaXNpdG9yICp2LCB1aW50MzJfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCp0eXBlX3VpbnQ2NCkoVmlzaXRvciAqdiwgdWludDY0X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKyAgICB2b2lkICgqdHlwZV9pbnQ4KShWaXNpdG9yICp2LCBpbnQ4X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKyAgICB2b2lkICgqdHlwZV9pbnQxNikoVmlzaXRvciAqdiwgaW50MTZfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOworICAgIHZvaWQgKCp0eXBlX2ludDMyKShWaXNpdG9yICp2LCBpbnQzMl90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisgICAgdm9pZCAoKnR5cGVfaW50NjQpKFZpc2l0b3IgKnYsIGludDY0X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKyAgICAvKiB2aXNpdF90eXBlX3NpemUoKSBmYWxscyBiYWNrIHRvICgqdHlwZV91aW50NjQpKCkgaWYgdHlwZV9zaXplIGlzIHVuc2V0ICovCisgICAgdm9pZCAoKnR5cGVfc2l6ZSkoVmlzaXRvciAqdiwgdWludDY0X3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKK307CisKK3ZvaWQgaW5wdXRfdHlwZV9lbnVtKFZpc2l0b3IgKnYsIGludCAqb2JqLCBjb25zdCBjaGFyICpzdHJpbmdzW10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpraW5kLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCBvdXRwdXRfdHlwZV9lbnVtKFZpc2l0b3IgKnYsIGludCAqb2JqLCBjb25zdCBjaGFyICpzdHJpbmdzW10sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2luZCwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS92aXNpdG9yLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWFwaS92aXNpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4MTMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xYXBpL3Zpc2l0b3IuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29yZSBEZWZpbml0aW9ucyBmb3IgUUFQSSBWaXNpdG9yIENsYXNzZXMKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisjaWZuZGVmIFFBUElfVklTSVRPUl9DT1JFX0gKKyNkZWZpbmUgUUFQSV9WSVNJVE9SX0NPUkVfSAorCisjaW5jbHVkZSAicWVtdS90eXBlZGVmcy5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FvYmplY3QuaCIKKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3R5cGVkZWYgc3RydWN0IEdlbmVyaWNMaXN0Cit7CisgICAgdW5pb24geworICAgICAgICB2b2lkICp2YWx1ZTsKKyAgICAgICAgdWludDY0X3QgcGFkZGluZzsKKyAgICB9OworICAgIHN0cnVjdCBHZW5lcmljTGlzdCAqbmV4dDsKK30gR2VuZXJpY0xpc3Q7CisKKwordm9pZCB2aXNpdF9zdGFydF9oYW5kbGUoVmlzaXRvciAqdiwgdm9pZCAqKm9iaiwgY29uc3QgY2hhciAqa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7Cit2b2lkIHZpc2l0X2VuZF9oYW5kbGUoVmlzaXRvciAqdiwgRXJyb3IgKiplcnJwKTsKK3ZvaWQgdmlzaXRfc3RhcnRfc3RydWN0KFZpc2l0b3IgKnYsIHZvaWQgKipvYmosIGNvbnN0IGNoYXIgKmtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3Qgc2l6ZSwgRXJyb3IgKiplcnJwKTsKK3ZvaWQgdmlzaXRfZW5kX3N0cnVjdChWaXNpdG9yICp2LCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF9zdGFydF9pbXBsaWNpdF9zdHJ1Y3QoVmlzaXRvciAqdiwgdm9pZCAqKm9iaiwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF9lbmRfaW1wbGljaXRfc3RydWN0KFZpc2l0b3IgKnYsIEVycm9yICoqZXJycCk7Cit2b2lkIHZpc2l0X3N0YXJ0X2xpc3QoVmlzaXRvciAqdiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKK0dlbmVyaWNMaXN0ICp2aXNpdF9uZXh0X2xpc3QoVmlzaXRvciAqdiwgR2VuZXJpY0xpc3QgKipsaXN0LCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF9lbmRfbGlzdChWaXNpdG9yICp2LCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF9zdGFydF9vcHRpb25hbChWaXNpdG9yICp2LCBib29sICpwcmVzZW50LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF9lbmRfb3B0aW9uYWwoVmlzaXRvciAqdiwgRXJyb3IgKiplcnJwKTsKK3ZvaWQgdmlzaXRfZ2V0X25leHRfdHlwZShWaXNpdG9yICp2LCBpbnQgKm9iaiwgY29uc3QgaW50ICpxdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKK3ZvaWQgdmlzaXRfdHlwZV9lbnVtKFZpc2l0b3IgKnYsIGludCAqb2JqLCBjb25zdCBjaGFyICpzdHJpbmdzW10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpraW5kLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX2ludChWaXNpdG9yICp2LCBpbnQ2NF90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7Cit2b2lkIHZpc2l0X3R5cGVfdWludDgoVmlzaXRvciAqdiwgdWludDhfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX3VpbnQxNihWaXNpdG9yICp2LCB1aW50MTZfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX3VpbnQzMihWaXNpdG9yICp2LCB1aW50MzJfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX3VpbnQ2NChWaXNpdG9yICp2LCB1aW50NjRfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX2ludDgoVmlzaXRvciAqdiwgaW50OF90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7Cit2b2lkIHZpc2l0X3R5cGVfaW50MTYoVmlzaXRvciAqdiwgaW50MTZfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX2ludDMyKFZpc2l0b3IgKnYsIGludDMyX3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKK3ZvaWQgdmlzaXRfdHlwZV9pbnQ2NChWaXNpdG9yICp2LCBpbnQ2NF90ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7Cit2b2lkIHZpc2l0X3R5cGVfc2l6ZShWaXNpdG9yICp2LCB1aW50NjRfdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX2Jvb2woVmlzaXRvciAqdiwgYm9vbCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX3N0cihWaXNpdG9yICp2LCBjaGFyICoqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOwordm9pZCB2aXNpdF90eXBlX251bWJlcihWaXNpdG9yICp2LCBkb3VibGUgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS1jb21tb24uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11LWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmFiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS1jb21tb24uaApAQCAtMCwwICsxLDUxMCBAQAorCisvKiBDb21tb24gaGVhZGVyIGZpbGUgdGhhdCBpcyBpbmNsdWRlZCBieSBhbGwgb2YgUUVNVS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgaW5jbHVkZWQgb25seSBieSAuYyBmaWxlcy4gTm8gaGVhZGVyIGZpbGUgc2hvdWxkCisgKiBkZXBlbmQgb24gcWVtdS1jb21tb24uaCwgYXMgdGhpcyB3b3VsZCBlYXNpbHkgbGVhZCB0byBjaXJjdWxhciBoZWFkZXIKKyAqIGRlcGVuZGVuY2llcy4KKyAqCisgKiBJZiBhIGhlYWRlciBmaWxlIHVzZXMgYSBkZWZpbml0aW9uIGZyb20gcWVtdS1jb21tb24uaCwgdGhhdCBkZWZpbml0aW9uCisgKiBtdXN0IGJlIG1vdmVkIHRvIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUsIGFuZCB0aGUgaGVhZGVyIHRoYXQgdXNlcyBpdAorICogbXVzdCBpbmNsdWRlIHRoYXQgaGVhZGVyLgorICovCisjaWZuZGVmIFFFTVVfQ09NTU9OX0gKKyNkZWZpbmUgUUVNVV9DT01NT05fSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworI2luY2x1ZGUgInFlbXUvY29tcGlsZXIuaCIKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorI2luY2x1ZGUgInFlbXUvdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAicWVtdS9ic3dhcC5oIgorCisKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9faHBwYV9fKSB8fCBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBXT1JEU19BTElHTkVECisjZW5kaWYKKworI2RlZmluZSBURlIoZXhwcikgZG8geyBpZiAoKGV4cHIpICE9IC0xKSBicmVhazsgfSB3aGlsZSAoZXJybm8gPT0gRUlOVFIpCisKKy8qIHdlIHB1dCBiYXNpYyBpbmNsdWRlcyBoZXJlIHRvIGF2b2lkIHJlcGVhdGluZyB0aGVtIGluIGRldmljZSBkcml2ZXJzICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlICJzeXNlbXUvb3Mtd2luMzIuaCIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BPU0lYCisjaW5jbHVkZSAic3lzZW11L29zLXBvc2l4LmgiCisjZW5kaWYKKworI2lmbmRlZiBPX0xBUkdFRklMRQorI2RlZmluZSBPX0xBUkdFRklMRSAwCisjZW5kaWYKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisjaWZuZGVmIE1BUF9BTk9OWU1PVVMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisjaWZuZGVmIEVOT01FRElVTQorI2RlZmluZSBFTk9NRURJVU0gRU5PREVWCisjZW5kaWYKKyNpZiAhZGVmaW5lZChFTk9UU1VQKQorI2RlZmluZSBFTk9UU1VQIDQwOTYKKyNlbmRpZgorI2lmICFkZWZpbmVkKEVDQU5DRUxFRCkKKyNkZWZpbmUgRUNBTkNFTEVEIDQwOTcKKyNlbmRpZgorI2lmICFkZWZpbmVkKEVNRURJVU1UWVBFKQorI2RlZmluZSBFTUVESVVNVFlQRSA0MDk4CisjZW5kaWYKKyNpZm5kZWYgVElNRV9NQVgKKyNkZWZpbmUgVElNRV9NQVggTE9OR19NQVgKKyNlbmRpZgorCisvKiBIT1NUX0xPTkdfQklUUyBpcyB0aGUgc2l6ZSBvZiBhIG5hdGl2ZSBwb2ludGVyIGluIGJpdHMuICovCisjaWYgVUlOVFBUUl9NQVggPT0gVUlOVDMyX01BWAorIyBkZWZpbmUgSE9TVF9MT05HX0JJVFMgMzIKKyNlbGlmIFVJTlRQVFJfTUFYID09IFVJTlQ2NF9NQVgKKyMgZGVmaW5lIEhPU1RfTE9OR19CSVRTIDY0CisjZWxzZQorIyBlcnJvciBVbmtub3duIHBvaW50ZXIgc2l6ZQorI2VuZGlmCisKK3R5cGVkZWYgaW50ICgqZnByaW50Zl9mdW5jdGlvbikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisgICAgR0NDX0ZNVF9BVFRSKDIsIDMpOworCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIGZzeW5jIF9jb21taXQKKyNpZiAhZGVmaW5lZChsc2VlaykKKyMgZGVmaW5lIGxzZWVrIF9sc2Vla2k2NAorI2VuZGlmCitpbnQgcWVtdV9mdHJ1bmNhdGU2NChpbnQsIGludDY0X3QpOworI2lmICFkZWZpbmVkKGZ0cnVuY2F0ZSkKKyMgZGVmaW5lIGZ0cnVuY2F0ZSBxZW11X2Z0cnVuY2F0ZTY0CisjZW5kaWYKKworY2hhciAqcmVhbHBhdGhfd2l0aF9sZW5ndGgoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqcmVzb2x2ZWRfcGF0aCwgaW50IGxlbmd0aCk7CitzdGF0aWMgaW5saW5lIGNoYXIgKnJlYWxwYXRoKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKnJlc29sdmVkX3BhdGgpCit7CisgICAgcmVhbHBhdGhfd2l0aF9sZW5ndGgocGF0aCwgcmVzb2x2ZWRfcGF0aCwgX01BWF9QQVRIKTsKKyAgICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKK30KKyNlbmRpZiAvKiBfV0lOMzIgKi8KKworLyogYm90dG9tIGhhbHZlcyAqLwordHlwZWRlZiB2b2lkIFFFTVVCSEZ1bmModm9pZCAqb3BhcXVlKTsKKwordm9pZCBhc3luY19jb250ZXh0X3B1c2godm9pZCk7Cit2b2lkIGFzeW5jX2NvbnRleHRfcG9wKHZvaWQpOworaW50IGdldF9hc3luY19jb250ZXh0X2lkKHZvaWQpOworCitRRU1VQkggKnFlbXVfYmhfbmV3KFFFTVVCSEZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X2JoX3NjaGVkdWxlKFFFTVVCSCAqYmgpOworLyogQm90dG9tIGhhbGZzIHRoYXQgYXJlIHNjaGVkdWxlZCBmcm9tIGEgYm90dG9tIGhhbGYgaGFuZGxlciBhcmUgaW5zdGFudGx5CisgKiBpbnZva2VkLiAgVGhpcyBjYW4gY3JlYXRlIGFuIGluZmluaXRlIGxvb3AgaWYgYSBib3R0b20gaGFsZiBoYW5kbGVyCisgKiBzY2hlZHVsZXMgaXRzZWxmLiAgcWVtdV9iaF9zY2hlZHVsZV9pZGxlKCkgYXZvaWRzIHRoaXMgaW5maW5pdGUgbG9vcCBieQorICogZW5zdXJpbmcgdGhhdCB0aGUgYm90dG9tIGhhbGYgaXNuJ3QgZXhlY3V0ZWQgdW50aWwgdGhlIG5leHQgbWFpbiBsb29wCisgKiBpdGVyYXRpb24uCisgKi8KK3ZvaWQgcWVtdV9iaF9zY2hlZHVsZV9pZGxlKFFFTVVCSCAqYmgpOwordm9pZCBxZW11X2JoX2NhbmNlbChRRU1VQkggKmJoKTsKK3ZvaWQgcWVtdV9iaF9kZWxldGUoUUVNVUJIICpiaCk7CitpbnQgcWVtdV9iaF9wb2xsKHZvaWQpOwordm9pZCBxZW11X2JoX3VwZGF0ZV90aW1lb3V0KGludCAqdGltZW91dCk7CisKK3ZvaWQgcWVtdV9nZXRfdGltZWRhdGUoc3RydWN0IHRtICp0bSwgaW50IG9mZnNldCk7CitpbnQgcWVtdV90aW1lZGF0ZV9kaWZmKHN0cnVjdCB0bSAqdG0pOworCisvKioKKyAqIGlzX2hlbHBfb3B0aW9uOgorICogQHM6IHN0cmluZyB0byB0ZXN0CisgKgorICogQ2hlY2sgd2hldGhlciBAcyBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIHN0cmluZ3Mgd2hpY2ggaW5kaWNhdGUKKyAqIHRoYXQgdGhlIHVzZXIgaXMgYXNraW5nIGZvciBhIGxpc3Qgb2YgdGhlIHZhbGlkIHZhbHVlcyBmb3IgYQorICogY29tbWFuZCBvcHRpb24gbGlrZSAtY3B1IG9yIC1NLiBUaGUgY3VycmVudCBhY2NlcHRlZCBzdHJpbmdzCisgKiBhcmUgJ2hlbHAnIGFuZCAnPycuICc/JyBpcyBkZXByZWNhdGVkIChpdCBpcyBhIHNoZWxsIHdpbGRjYXJkCisgKiB3aGljaCBtYWtlcyBpdCBhbm5veWluZyB0byB1c2UgaW4gYSByZWxpYWJsZSB3YXkpIGJ1dCBwcm92aWRlZAorICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgQHMgaXMgYSByZXF1ZXN0IGZvciBhIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19oZWxwX29wdGlvbihjb25zdCBjaGFyICpzKQoreworICAgIHJldHVybiAhc3RyY21wKHMsICI/IikgfHwgIXN0cmNtcChzLCAiaGVscCIpOworfQorCisvKiBjdXRpbHMuYyAqLwordm9pZCBwc3RyY3B5KGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpzdHIpOwordm9pZCBzdHJwYWRjcHkoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnN0ciwgY2hhciBwYWQpOworY2hhciAqcHN0cmNhdChjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqcyk7CitpbnQgc3Ryc3RhcnQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKipwdHIpOworaW50IHN0cmlzdGFydChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqKnB0cik7CitpbnQgcWVtdV9zdHJubGVuKGNvbnN0IGNoYXIgKnMsIGludCBtYXhfbGVuKTsKK2NoYXIgKnFlbXVfc3Ryc2VwKGNoYXIgKippbnB1dCwgY29uc3QgY2hhciAqZGVsaW0pOwordGltZV90IG1rdGltZWdtKHN0cnVjdCB0bSAqdG0pOworaW50IHFlbXVfZmxzKGludCBpKTsKK2ludCBxZW11X2ZkYXRhc3luYyhpbnQgZmQpOworaW50IGZjbnRsX3NldGZsKGludCBmZCwgaW50IGZsYWcpOworaW50IHFlbXVfcGFyc2VfZmQoY29uc3QgY2hhciAqcGFyYW0pOworCitpbnQgcGFyc2VfdWludChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbHVlLCBjaGFyICoqZW5kcHRyLAorICAgICAgICAgICAgICAgaW50IGJhc2UpOworaW50IHBhcnNlX3VpbnRfZnVsbChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbHVlLCBpbnQgYmFzZSk7CisKKy8qCisgKiBzdHJ0b3N6KCkgc3VmZml4ZXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IHRyZWF0bWVudCBvZiBhbgorICogYXJndW1lbnQgcGFzc2VkIHRvIHN0cnRvc3ooKSB3aXRob3V0IGFuIGV4cGxpY2l0IHN1ZmZpeC4KKyAqIFRoZXNlIHNob3VsZCBiZSBkZWZpbmVkIHVzaW5nIHVwcGVyIGNhc2UgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UKKyAqIEEtWiwgYXMgc3RydG9zeigpIHdpbGwgdXNlIHFlbXVfdG91cHBlcigpIG9uIHRoZSBnaXZlbiBhcmd1bWVudAorICogcHJpb3IgdG8gY29tcGFyaXNvbi4KKyAqLworI2RlZmluZSBTVFJUT1NaX0RFRlNVRkZJWF9FQgknRScKKyNkZWZpbmUgU1RSVE9TWl9ERUZTVUZGSVhfUEIJJ1AnCisjZGVmaW5lIFNUUlRPU1pfREVGU1VGRklYX1RCCSdUJworI2RlZmluZSBTVFJUT1NaX0RFRlNVRkZJWF9HQgknRycKKyNkZWZpbmUgU1RSVE9TWl9ERUZTVUZGSVhfTUIJJ00nCisjZGVmaW5lIFNUUlRPU1pfREVGU1VGRklYX0tCCSdLJworI2RlZmluZSBTVFJUT1NaX0RFRlNVRkZJWF9CCSdCJworaW50NjRfdCBzdHJ0b3N6KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmQpOworaW50NjRfdCBzdHJ0b3N6X3N1ZmZpeChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kLCBjb25zdCBjaGFyIGRlZmF1bHRfc3VmZml4KTsKK2ludDY0X3Qgc3RydG9zel9zdWZmaXhfdW5pdChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZGVmYXVsdF9zdWZmaXgsIGludDY0X3QgdW5pdCk7CisKKy8qIHVzZWQgdG8gcHJpbnQgY2hhciogc2FmZWx5ICovCisjZGVmaW5lIFNUUl9PUl9OVUxMKHN0cikgKChzdHIpID8gKHN0cikgOiAibnVsbCIpCisKKy8qIHBhdGguYyAqLwordm9pZCBpbml0X3BhdGhzKGNvbnN0IGNoYXIgKnByZWZpeCk7Citjb25zdCBjaGFyICpwYXRoKGNvbnN0IGNoYXIgKnBhdGhuYW1lKTsKKworI2RlZmluZSBxZW11X2lzYWxudW0oYykJCWlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzYWxwaGEoYykJCWlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzY250cmwoYykJCWlzY250cmwoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzZGlnaXQoYykJCWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzZ3JhcGgoYykJCWlzZ3JhcGgoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzbG93ZXIoYykJCWlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzcHJpbnQoYykJCWlzcHJpbnQoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzcHVuY3QoYykJCWlzcHVuY3QoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzc3BhY2UoYykJCWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzdXBwZXIoYykJCWlzdXBwZXIoKHVuc2lnbmVkIGNoYXIpKGMpKQorI2RlZmluZSBxZW11X2lzeGRpZ2l0KGMpCWlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKShjKSkKKyNkZWZpbmUgcWVtdV90b2xvd2VyKGMpCQl0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKShjKSkKKyNkZWZpbmUgcWVtdV90b3VwcGVyKGMpCQl0b3VwcGVyKCh1bnNpZ25lZCBjaGFyKShjKSkKKyNkZWZpbmUgcWVtdV9pc2FzY2lpKGMpCQlpc2FzY2lpKCh1bnNpZ25lZCBjaGFyKShjKSkKKyNkZWZpbmUgcWVtdV90b2FzY2lpKGMpCQl0b2FzY2lpKCh1bnNpZ25lZCBjaGFyKShjKSkKKwordm9pZCBxZW11X211dGV4X2xvY2tfaW90aHJlYWQodm9pZCk7Cit2b2lkIHFlbXVfbXV0ZXhfdW5sb2NrX2lvdGhyZWFkKHZvaWQpOworYm9vbCBxZW11X211dGV4X2NoZWNrX2lvdGhyZWFkKHZvaWQpOwordm9pZCBxZW11X2luaXRfY3B1X2xvb3Aodm9pZCk7CisKK2ludCBxZW11X29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCAuLi4pOworc3NpemVfdCBxZW11X3dyaXRlX2Z1bGwoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKKyAgICBRRU1VX1dBUk5fVU5VU0VEX1JFU1VMVDsKK3NzaXplX3QgcWVtdV9zZW5kX2Z1bGwoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgaW50IGZsYWdzKQorICAgIFFFTVVfV0FSTl9VTlVTRURfUkVTVUxUOworc3NpemVfdCBxZW11X3JlY3ZfZnVsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MpCisgICAgUUVNVV9XQVJOX1VOVVNFRF9SRVNVTFQ7Cit2b2lkIHFlbXVfc2V0X2Nsb2V4ZWMoaW50IGZkKTsKKworI2lmbmRlZiBfV0lOMzIKK2ludCBxZW11X2FkZF9jaGlsZF93YXRjaChwaWRfdCBwaWQpOworaW50IHFlbXVfZXZlbnRmZChpbnQgcGlwZWZkWzJdKTsKK2ludCBxZW11X3BpcGUoaW50IHBpcGVmZFsyXSk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BTkRST0lECitpbnQgcWVtdV9yZWN2KGludCBzb2NrLCB2b2lkKiBidWYsIHNpemVfdCBsZW4sIGludCBmbGFncyk7CisKK2ludCBxZW11X2dldHNvY2tvcHQoaW50IHNvY2tmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogb3B0dmFsLCBzaXplX3QqIG9wdGxlbik7CisKK2ludCBxZW11X3NldHNvY2tvcHQoaW50IHNvY2tmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogb3B0dmFsLCBzaXplX3Qgb3B0bGVuKTsKKworI2Vsc2UgIC8vICFDT05GSUdfQU5EUk9JRAorI2lmZGVmIF9XSU4zMgorLyogTWluR1cgbmVlZHMgdHlwZSBjYXN0cyBmb3IgdGhlICdidWYnIGFuZCAnb3B0dmFsJyBhcmd1bWVudHMuICovCisjZGVmaW5lIHFlbXVfZ2V0c29ja29wdChzb2NrZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikgXAorICAgIGdldHNvY2tvcHQoc29ja2ZkLCBsZXZlbCwgb3B0bmFtZSwgKHZvaWQgKilvcHR2YWwsIG9wdGxlbikKKyNkZWZpbmUgcWVtdV9zZXRzb2Nrb3B0KHNvY2tmZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSBcCisgICAgc2V0c29ja29wdChzb2NrZmQsIGxldmVsLCBvcHRuYW1lLCAoY29uc3Qgdm9pZCAqKW9wdHZhbCwgb3B0bGVuKQorI2RlZmluZSBxZW11X3JlY3Yoc29ja2ZkLCBidWYsIGxlbiwgZmxhZ3MpIHJlY3Yoc29ja2ZkLCAodm9pZCAqKWJ1ZiwgbGVuLCBmbGFncykKKyNkZWZpbmUgcWVtdV9zZW5kdG8oc29ja2ZkLCBidWYsIGxlbiwgZmxhZ3MsIGRlc3RhZGRyLCBhZGRybGVuKSBcCisgICAgc2VuZHRvKHNvY2tmZCwgKGNvbnN0IHZvaWQgKilidWYsIGxlbiwgZmxhZ3MsIGRlc3RhZGRyLCBhZGRybGVuKQorI2Vsc2UKKyNkZWZpbmUgcWVtdV9nZXRzb2Nrb3B0KHNvY2tmZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSBcCisgICAgZ2V0c29ja29wdChzb2NrZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikKKyNkZWZpbmUgcWVtdV9zZXRzb2Nrb3B0KHNvY2tmZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKSBcCisgICAgc2V0c29ja29wdChzb2NrZmQsIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbikKKyNkZWZpbmUgcWVtdV9yZWN2KHNvY2tmZCwgYnVmLCBsZW4sIGZsYWdzKSByZWN2KHNvY2tmZCwgYnVmLCBsZW4sIGZsYWdzKQorI2RlZmluZSBxZW11X3NlbmR0byhzb2NrZmQsIGJ1ZiwgbGVuLCBmbGFncywgZGVzdGFkZHIsIGFkZHJsZW4pIFwKKyAgICBzZW5kdG8oc29ja2ZkLCBidWYsIGxlbiwgZmxhZ3MsIGRlc3RhZGRyLCBhZGRybGVuKQorI2VuZGlmCisjZW5kaWYgIC8vICFDT05GSUdfQU5EUk9JRAorCit2b2lkICpnZXRfbW1hcF9hZGRyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKKworLyogRXJyb3IgaGFuZGxpbmcuICAqLworCit2b2lkIFFFTVVfTk9SRVRVUk4gaHdfZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pIEdDQ19GTVRfQVRUUigxLCAyKTsKKworLyogSU8gY2FsbGJhY2tzLiAgKi8KK3R5cGVkZWYgdm9pZCBJT1JlYWRIYW5kbGVyKHZvaWQgKm9wYXF1ZSwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSk7Cit0eXBlZGVmIGludCBJT0NhblJlYWRIYW5kbGVyKHZvaWQgKm9wYXF1ZSk7Cit0eXBlZGVmIHZvaWQgSU9IYW5kbGVyKHZvaWQgKm9wYXF1ZSk7CisKK3ZvaWQgcWVtdV9pb2hhbmRsZXJfZmlsbChpbnQgKnBuZmRzLCBmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcyk7Cit2b2lkIHFlbXVfaW9oYW5kbGVyX3BvbGwoZmRfc2V0ICpyZWFkZmRzLCBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKnhmZHMsIGludCByYyk7CisKK3N0cnVjdCBQYXJhbGxlbElPQXJnIHsKKyAgICB2b2lkICpidWZmZXI7CisgICAgaW50IGNvdW50OworfTsKKwordHlwZWRlZiBpbnQgKCpETUFfdHJhbnNmZXJfaGFuZGxlcikgKHZvaWQgKm9wYXF1ZSwgaW50IG5jaGFuLCBpbnQgcG9zLCBpbnQgc2l6ZSk7CisKK3R5cGVkZWYgdWludDY0X3QgcGNpYnVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSUZfTk9ORSwKKyAgICBJRl9JREUsIElGX1NDU0ksIElGX0ZMT1BQWSwgSUZfUEZMQVNILCBJRl9NVEQsIElGX1NELCBJRl9WSVJUSU8sIElGX1hFTiwKKyAgICBJRl9DT1VOVAorfSBCbG9ja0ludGVyZmFjZVR5cGU7CisKK3R5cGVkZWYgZW51bSBMb3N0VGlja1BvbGljeSB7CisgICAgTE9TVF9USUNLX0RJU0NBUkQsCisgICAgTE9TVF9USUNLX0RFTEFZLAorICAgIExPU1RfVElDS19NRVJHRSwKKyAgICBMT1NUX1RJQ0tfU0xFVywKKyAgICBMT1NUX1RJQ0tfTUFYCit9IExvc3RUaWNrUG9saWN5OworCit0eXBlZGVmIHN0cnVjdCBQQ0lIb3N0RGV2aWNlQWRkcmVzcyB7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICB1bnNpZ25lZCBpbnQgYnVzOworICAgIHVuc2lnbmVkIGludCBzbG90OworICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjsKK30gUENJSG9zdERldmljZUFkZHJlc3M7CisKKwordm9pZCBjcHVfZXhlY19pbml0X2FsbCh1bnNpZ25lZCBsb25nIHRiX3NpemUpOworCisvKiBDUFUgc2F2ZS9sb2FkLiAgKi8KK3ZvaWQgY3B1X3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSk7CitpbnQgY3B1X2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpOworCisvKiBGb3JjZSBRRU1VIHRvIHByb2Nlc3MgcGVuZGluZyBldmVudHMgKi8KK3ZvaWQgcWVtdV9ub3RpZnlfZXZlbnQodm9pZCk7CisKKy8qIHdvcmsgcXVldWUgKi8KK3N0cnVjdCBxZW11X3dvcmtfaXRlbSB7CisgICAgc3RydWN0IHFlbXVfd29ya19pdGVtICpuZXh0OworICAgIHZvaWQgKCpmdW5jKSh2b2lkICpkYXRhKTsKKyAgICB2b2lkICpkYXRhOworICAgIGludCBkb25lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVUlPVmVjdG9yIHsKKyAgICBzdHJ1Y3QgaW92ZWMgKmlvdjsKKyAgICBpbnQgbmlvdjsKKyAgICBpbnQgbmFsbG9jOworICAgIHNpemVfdCBzaXplOworfSBRRU1VSU9WZWN0b3I7CisKK3ZvaWQgcWVtdV9pb3ZlY19pbml0KFFFTVVJT1ZlY3RvciAqcWlvdiwgaW50IGFsbG9jX2hpbnQpOwordm9pZCBxZW11X2lvdmVjX2luaXRfZXh0ZXJuYWwoUUVNVUlPVmVjdG9yICpxaW92LCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IG5pb3YpOwordm9pZCBxZW11X2lvdmVjX2FkZChRRU1VSU9WZWN0b3IgKnFpb3YsIHZvaWQgKmJhc2UsIHNpemVfdCBsZW4pOwordm9pZCBxZW11X2lvdmVjX2NvbmNhdChRRU1VSU9WZWN0b3IgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgUUVNVUlPVmVjdG9yICpzcmMsIHNpemVfdCBzb2Zmc2V0LCBzaXplX3Qgc2J5dGVzKTsKK3ZvaWQgcWVtdV9pb3ZlY19jb25jYXRfaW92KFFFTVVJT1ZlY3RvciAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlvdmVjICpzcmNfaW92LCB1bnNpZ25lZCBpbnQgc3JjX2NudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzb2Zmc2V0LCBzaXplX3Qgc2J5dGVzKTsKK3ZvaWQgcWVtdV9pb3ZlY19kZXN0cm95KFFFTVVJT1ZlY3RvciAqcWlvdik7Cit2b2lkIHFlbXVfaW92ZWNfcmVzZXQoUUVNVUlPVmVjdG9yICpxaW92KTsKK3NpemVfdCBxZW11X2lvdmVjX3RvX2J1ZihRRU1VSU9WZWN0b3IgKnFpb3YsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpOworc2l6ZV90IHFlbXVfaW92ZWNfZnJvbV9idWYoUUVNVUlPVmVjdG9yICpxaW92LCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpOworc2l6ZV90IHFlbXVfaW92ZWNfbWVtc2V0KFFFTVVJT1ZlY3RvciAqcWlvdiwgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbGMsIHNpemVfdCBieXRlcyk7CisKK2Jvb2wgYnVmZmVyX2lzX3plcm8oY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKKworI2RlZmluZSBRRU1VX0ZJTEVfVFlQRV9CSU9TICAgMAorI2RlZmluZSBRRU1VX0ZJTEVfVFlQRV9LRVlNQVAgMQorY2hhciAqcWVtdV9maW5kX2ZpbGUoaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBPUyBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK3ZvaWQgb3Nfc2V0dXBfZWFybHlfc2lnbmFsX2hhbmRsaW5nKHZvaWQpOworY2hhciAqb3NfZmluZF9kYXRhZGlyKGNvbnN0IGNoYXIgKmFyZ3YwKTsKK3ZvaWQgb3NfcGFyc2VfY21kX2FyZ3MoaW50IGluZGV4LCBjb25zdCBjaGFyICpvcHRhcmcpOwordm9pZCBvc19waWRmaWxlX2Vycm9yKHZvaWQpOworCisvKiBDb252ZXJ0IGEgYnl0ZSBiZXR3ZWVuIGJpbmFyeSBhbmQgQkNELiAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCB0b19iY2QodWludDhfdCB2YWwpCit7CisgICAgcmV0dXJuICgodmFsIC8gMTApIDw8IDQpIHwgKHZhbCAlIDEwKTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGZyb21fYmNkKHVpbnQ4X3QgdmFsKQoreworICAgIHJldHVybiAoKHZhbCA+PiA0KSAqIDEwKSArICh2YWwgJiAweDBmKTsKK30KKworLyogY29tcHV0ZSB3aXRoIDk2IGJpdCBpbnRlcm1lZGlhdGUgcmVzdWx0OiAoYSpiKS9jICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IG11bGRpdjY0KHVpbnQ2NF90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpCit7CisgICAgdW5pb24geworICAgICAgICB1aW50NjRfdCBsbDsKKyAgICAgICAgc3RydWN0IHsKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICAgICAgdWludDMyX3QgaGlnaCwgbG93OworI2Vsc2UKKyAgICAgICAgICAgIHVpbnQzMl90IGxvdywgaGlnaDsKKyNlbmRpZgorICAgICAgICB9IGw7CisgICAgfSB1LCByZXM7CisgICAgdWludDY0X3QgcmwsIHJoOworCisgICAgdS5sbCA9IGE7CisgICAgcmwgPSAodWludDY0X3QpdS5sLmxvdyAqICh1aW50NjRfdCliOworICAgIHJoID0gKHVpbnQ2NF90KXUubC5oaWdoICogKHVpbnQ2NF90KWI7CisgICAgcmggKz0gKHJsID4+IDMyKTsKKyAgICByZXMubC5oaWdoID0gcmggLyBjOworICAgIHJlcy5sLmxvdyA9ICgoKHJoICUgYykgPDwgMzIpICsgKHJsICYgMHhmZmZmZmZmZikpIC8gYzsKKyAgICByZXR1cm4gcmVzLmxsOworfQorCisvKiBSb3VuZCBudW1iZXIgZG93biB0byBtdWx0aXBsZSAqLworI2RlZmluZSBRRU1VX0FMSUdOX0RPV04obiwgbSkgKChuKSAvIChtKSAqIChtKSkKKworLyogUm91bmQgbnVtYmVyIHVwIHRvIG11bHRpcGxlICovCisjZGVmaW5lIFFFTVVfQUxJR05fVVAobiwgbSkgUUVNVV9BTElHTl9ET1dOKChuKSArIChtKSAtIDEsIChtKSkKKworc3RhdGljIGlubGluZSBib29sIGlzX3Bvd2VyX29mXzIodWludDY0X3QgdmFsdWUpCit7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gISh2YWx1ZSAmICh2YWx1ZSAtIDEpKTsKK30KKworLyogcm91bmQgZG93biB0byB0aGUgbmVhcmVzdCBwb3dlciBvZiAyKi8KK2ludDY0X3QgcG93MmZsb29yKGludDY0X3QgdmFsdWUpOworCisjaW5jbHVkZSAicWVtdS9tb2R1bGUuaCIKKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFVMRUIxMjggKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTEVCMTI4KQorICogSW5wdXQgaXMgbGltaXRlZCB0byAxNC1iaXQgbnVtYmVycworICovCisKK2ludCB1bGViMTI4X2VuY29kZV9zbWFsbCh1aW50OF90ICpvdXQsIHVpbnQzMl90IG4pOworaW50IHVsZWIxMjhfZGVjb2RlX3NtYWxsKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50MzJfdCAqbik7CisKKy8qIHVuaWNvZGUuYyAqLworaW50IG1vZF91dGY4X2NvZGVwb2ludChjb25zdCBjaGFyICpzLCBzaXplX3QgbiwgY2hhciAqKmVuZCk7CisKKy8qCisgKiBIZXhkdW1wIGEgYnVmZmVyIHRvIGEgZmlsZS4gQW4gb3B0aW9uYWwgc3RyaW5nIHByZWZpeCBpcyBhZGRlZCB0byBldmVyeSBsaW5lCisgKi8KKwordm9pZCBxZW11X2hleGR1bXAoY29uc3QgY2hhciAqYnVmLCBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4LCBzaXplX3Qgc2l6ZSk7CisKKy8qCisgKiBBIGZpeGVyIGZvciB0aW1lb3V0IHZhbHVlIHBhc3NlZCB0byBzZWxlY3QoKSBvbiBNYWMuIFRoZSBpc3N1ZSBpcyB0aGF0IE1hYydzCisgKiB2ZXJzaW9uIG9mIHNlbGVjdCgpIHdpbGwgcmV0dXJuIEVJTlZBTCBvbiB0aW1lb3V0cyBsYXJnZXIgdGhhbiAxMDAwMDAwMDAKKyAqIHNlY29uZHMsIGV2ZW4gdGhvdWdoIGl0IHNob3VsZCBoYXZlIGp1c3QgY2xhbXBlZCBpdC4gU28sIGZvciBNYWMgd2Ugc2hvdWxkCisgKiBtYWtlIHN1cmUgdGhhdCB0aW1lb3V0IHZhbHVlIGlzIGJvdW5kIHRvIDEwMDAwMDAwMCBzZWNvbmRzIGJlZm9yZSBwYXNzaW5nIGl0CisgKiB0byBzZWxlY3QoKS4KKyAqLworI2lmIF9EQVJXSU5fQ19TT1VSQ0UKKyNkZWZpbmUgQ0xBTVBfTUFDX1RJTUVPVVQodG8pIGRvIHsgaWYgKHRvID4gMTAwMDAwMDAwMDAwTEwpIHRvID0gMTAwMDAwMDAwMDAwTEw7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBDTEFNUF9NQUNfVElNRU9VVCh0bykgKCh2b2lkKTApCisjZW5kaWYgIC8vIF9EQVJXSU5fQ19TT1VSQ0UKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fbGx2bV9fKQorLyogQ2xhbmcgYW5kIGxsdm0tZ2NjIGRvbid0IHN1cHBvcnQgZ2xvYmFsIHJlZ2lzdGVyIHZhcmlhYmxlIChHUlYpLgorICAgQ2xhbmcgaXNzdWVzIGNvbXBpbGUtdGltZSBlcnJvciBmb3IgR1JWLiAgbGx2bS1nY2MgYWNjZXB0cyBHUlYgKGJlY2F1c2UKKyAgIGl0cyBmcm9udC1lbmQgaXMgZ2NjKSBidXQgaWdub3JlcyBpdCBpbiB0aGUgbGx2bS1iYXNlZCBiYWNrLWVuZC4KKyAgIFVuZGVmaW5pbmcgR1JWIGRlY2wgdG8gYWxsb3cgZXh0ZXJuYWwvcWVtdSBhbmQgdGhlIHJlc3Qgb2YgQW5kcm9pZAorICAgdG8gY29tcGlsZS4gIEJ1dCBlbXVsYXRvciBidWlsdCB3L28gR1JWIHN1cHBvcnQgd2lsbCBub3QgZnVuY3Rpb24KKyAgIGNvcnJlY3RseS4gIFVzZXIgd2lsbCBiZSBncmVldGVkIHdpdGggYW4gZXJyb3IgbWVzc2FnZSAoaXNzdWVkCisgICBpbiB0Y2cvdGNnLmMpIHdoZW4gZW11bGF0b3IgYnVpbHQgdGhpcyB3YXkgaXMgbGF1bmNoZWQuCisgKi8KKyNkZWZpbmUgU1VQUE9SVF9HTE9CQUxfUkVHSVNURVJfVkFSSUFCTEUgMAorI2RlZmluZSBHTE9CQUxfUkVHSVNURVJfVkFSSUFCTEVfREVDTAorI2Vsc2UKKyNkZWZpbmUgU1VQUE9SVF9HTE9CQUxfUkVHSVNURVJfVkFSSUFCTEUgMQorI2RlZmluZSBHTE9CQUxfUkVHSVNURVJfVkFSSUFCTEVfREVDTCByZWdpc3RlcgorI2VuZGlmIC8qIF9fY2xhbmdfXyB8fCBfX2xsdm1fXyAqLworCisvKiB2ZWN0b3IgZGVmaW5pdGlvbnMgKi8KKyNpZmRlZiBfX0FMVElWRUNfXworI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKy8qIFRoZSBhbHRpdmVjLmggaGVhZGVyIHNheXMgd2UncmUgYWxsb3dlZCB0byB1bmRlZiB0aGVzZSBmb3IKKyAqIEMrKyBjb21wYXRpYmlsaXR5LiAgSGVyZSB3ZSBkb24ndCBjYXJlIGFib3V0IEMrKywgYnV0IHdlCisgKiB1bmRlZiB0aGVtIGFueXdheSB0byBhdm9pZCBuYW1lc3BhY2UgcG9sbHV0aW9uLgorICovCisjdW5kZWYgdmVjdG9yCisjdW5kZWYgcGl4ZWwKKyN1bmRlZiBib29sCisjZGVmaW5lIFZFQ1RZUEUgICAgICAgIF9fdmVjdG9yIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgU1BMQVQocCkgICAgICAgdmVjX3NwbGF0KHZlY19sZCgwLCBwKSwgMCkKKyNkZWZpbmUgQUxMX0VRKHYxLCB2MikgdmVjX2FsbF9lcSh2MSwgdjIpCisvKiBhbHRpdmVjLmggbWF5IHJlZGVmaW5lIHRoZSBib29sIG1hY3JvIGFzIHZlY3RvciB0eXBlLgorICogUmVzZXQgaXQgdG8gUE9TSVggc2VtYW50aWNzLiAqLworI2RlZmluZSBib29sIF9Cb29sCisjZWxpZiBkZWZpbmVkIF9fU1NFMl9fCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjZGVmaW5lIFZFQ1RZUEUgICAgICAgIF9fbTEyOGkKKyNkZWZpbmUgU1BMQVQocCkgICAgICAgX21tX3NldDFfZXBpOCgqKHApKQorI2RlZmluZSBBTExfRVEodjEsIHYyKSAoX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgodjEsIHYyKSkgPT0gMHhGRkZGKQorI2Vsc2UKKyNkZWZpbmUgVkVDVFlQRSAgICAgICAgdW5zaWduZWQgbG9uZworI2RlZmluZSBTUExBVChwKSAgICAgICAoKihwKSAqICh+MFVMIC8gMjU1KSkKKyNkZWZpbmUgQUxMX0VRKHYxLCB2MikgKCh2MSkgPT0gKHYyKSkKKyNlbmRpZgorCisjZGVmaW5lIEJVRkZFUl9GSU5EX05PTlpFUk9fT0ZGU0VUX1VOUk9MTF9GQUNUT1IgOAorc3RhdGljIGlubGluZSBib29sCitjYW5fdXNlX2J1ZmZlcl9maW5kX25vbnplcm9fb2Zmc2V0KGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgICByZXR1cm4gKGxlbiAlIChCVUZGRVJfRklORF9OT05aRVJPX09GRlNFVF9VTlJPTExfRkFDVE9SCisgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoVkVDVFlQRSkpID09IDAKKyAgICAgICAgICAgICYmICgodWludHB0cl90KSBidWYpICUgc2l6ZW9mKFZFQ1RZUEUpID09IDApOworfQorc2l6ZV90IGJ1ZmZlcl9maW5kX25vbnplcm9fb2Zmc2V0KGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CisKKy8qCisgKiBoZWxwZXIgdG8gcGFyc2UgZGVidWcgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKi8KK2ludCBwYXJzZV9kZWJ1Z19lbnYoY29uc3QgY2hhciAqbmFtZSwgaW50IG1heCwgaW50IGluaXRpYWwpOworCitleHRlcm4gaW50IHVzZV9pY291bnQ7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvYWVzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzljNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvYWVzLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBRRU1VX0FFU19ICisjZGVmaW5lIFFFTVVfQUVTX0gKKworI2RlZmluZSBBRVNfTUFYTlIgMTQKKyNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKKworc3RydWN0IGFlc19rZXlfc3QgeworICAgIHVpbnQzMl90IHJkX2tleVs0ICooQUVTX01BWE5SICsgMSldOworICAgIGludCByb3VuZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYWVzX2tleV9zdCBBRVNfS0VZOworCitpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKwlBRVNfS0VZICprZXkpOworaW50IEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJQUVTX0tFWSAqa2V5KTsKKwordm9pZCBBRVNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCWNvbnN0IEFFU19LRVkgKmtleSk7Cit2b2lkIEFFU19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJY29uc3QgQUVTX0tFWSAqa2V5KTsKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICppdmVjLCBjb25zdCBpbnQgZW5jKTsKKworLyoKK0FFU19UZTBbeF0gPSBTIFt4XS5bMDIsIDAxLCAwMSwgMDNdOworQUVTX1RlMVt4XSA9IFMgW3hdLlswMywgMDIsIDAxLCAwMV07CitBRVNfVGUyW3hdID0gUyBbeF0uWzAxLCAwMywgMDIsIDAxXTsKK0FFU19UZTNbeF0gPSBTIFt4XS5bMDEsIDAxLCAwMywgMDJdOworQUVTX1RlNFt4XSA9IFMgW3hdLlswMSwgMDEsIDAxLCAwMV07CisKK0FFU19UZDBbeF0gPSBTaVt4XS5bMGUsIDA5LCAwZCwgMGJdOworQUVTX1RkMVt4XSA9IFNpW3hdLlswYiwgMGUsIDA5LCAwZF07CitBRVNfVGQyW3hdID0gU2lbeF0uWzBkLCAwYiwgMGUsIDA5XTsKK0FFU19UZDNbeF0gPSBTaVt4XS5bMDksIDBkLCAwYiwgMGVdOworQUVTX1RkNFt4XSA9IFNpW3hdLlswMSwgMDEsIDAxLCAwMV07CisqLworCitleHRlcm4gY29uc3QgdWludDMyX3QgQUVTX1RlMFsyNTZdLCBBRVNfVGUxWzI1Nl0sIEFFU19UZTJbMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICBBRVNfVGUzWzI1Nl0sIEFFU19UZTRbMjU2XTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBBRVNfVGQwWzI1Nl0sIEFFU19UZDFbMjU2XSwgQUVTX1RkMlsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDNbMjU2XSwgQUVTX1RkNFsyNTZdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2F0b21pYy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyYmNlMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2F0b21pYy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogU2ltcGxlIGludGVyZmFjZSBmb3IgYXRvbWljIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6IFBhb2xvIEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgX19RRU1VX0FUT01JQ19ICisjZGVmaW5lIF9fUUVNVV9BVE9NSUNfSCAxCisKKyNpbmNsdWRlICJxZW11L2NvbXBpbGVyLmgiCisKKy8qIEZvciBDMTEgYXRvbWljIG9wcyAqLworCisvKiBDb21waWxlciBiYXJyaWVyICovCisjZGVmaW5lIGJhcnJpZXIoKSAgICh7IGFzbSB2b2xhdGlsZSgiIiA6OjogIm1lbW9yeSIpOyAodm9pZCkwOyB9KQorCisjaWZuZGVmIF9fQVRPTUlDX1JFTEFYRUQKKworLyoKKyAqIFdlIHVzZSBHQ0MgYnVpbHRpbiBpZiBpdCdzIGF2YWlsYWJsZSwgYXMgdGhhdCBjYW4gdXNlIG1mZW5jZSBvbgorICogMzItYml0IGFzIHdlbGwsIGUuZy4gaWYgYnVpbHQgd2l0aCAtbWFyY2g9cGVudGl1bS1tLiBIb3dldmVyLCBvbgorICogaTM4NiB0aGUgc3BlYyBpcyBidWdneSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBmb2xsb3dlZCBpdCB1bnRpbAorICogNC4zIChodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM2NzkzKS4KKyAqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyNpZiAhUUVNVV9HTlVDX1BSRVJFUSg0LCA0KQorI2lmIGRlZmluZWQgX194ODZfNjRfXworI2RlZmluZSBzbXBfbWIoKSAgICAoeyBhc20gdm9sYXRpbGUoIm1mZW5jZSIgOjo6ICJtZW1vcnkiKTsgKHZvaWQpMDsgfSkKKyNlbHNlCisjZGVmaW5lIHNtcF9tYigpICAgICh7IGFzbSB2b2xhdGlsZSgibG9jazsgYWRkbCAkMCwwKCUlZXNwKSAiIDo6OiAibWVtb3J5Iik7ICh2b2lkKTA7IH0pCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fYWxwaGFfXworI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSAgIGFzbSB2b2xhdGlsZSgibWIiOjo6Im1lbW9yeSIpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3MzOTB4X18pCisKKy8qCisgKiBCZWNhdXNlIG9mIHRoZSBzdHJvbmdseSBvcmRlcmVkIHN0b3JhZ2UgbW9kZWwsIHdtYigpIGFuZCBybWIoKSBhcmUgbm9wcworICogaGVyZSAoYSBjb21waWxlciBiYXJyaWVyIG9ubHkpLiAgUUVNVSBkb2Vzbid0IGRvIGFjY2Vzc2VzIHRvIHdyaXRlLWNvbWJpbmluZworICogcWVtdSBtZW1vcnkgb3Igbm9uLXRlbXBvcmFsIGxvYWQvc3RvcmVzIGZyb20gQyBjb2RlLgorICovCisjZGVmaW5lIHNtcF93bWIoKSAgIGJhcnJpZXIoKQorI2RlZmluZSBzbXBfcm1iKCkgICBiYXJyaWVyKCkKKworLyoKKyAqIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCgpIGlzIGRvY3VtZW50ZWQgdG8gYmUgYW4gYWNxdWlyZSBiYXJyaWVyIG9ubHksCisgKiBidXQgaXQgaXMgYSBmdWxsIGJhcnJpZXIgYXQgdGhlIGhhcmR3YXJlIGxldmVsLiAgQWRkIGEgY29tcGlsZXIgYmFycmllcgorICogdG8gbWFrZSBpdCBhIGZ1bGwgYmFycmllciBhbHNvIGF0IHRoZSBjb21waWxlciBsZXZlbC4KKyAqLworI2RlZmluZSBhdG9taWNfeGNoZyhwdHIsIGkpICAgIChiYXJyaWVyKCksIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldChwdHIsIGkpKQorCisvKgorICogTG9hZC9zdG9yZSB3aXRoIEphdmEgdm9sYXRpbGUgc2VtYW50aWNzLgorICovCisjZGVmaW5lIGF0b21pY19tYl9zZXQocHRyLCBpKSAgKCh2b2lkKWF0b21pY194Y2hnKHB0ciwgaSkpCisKKyNlbGlmIGRlZmluZWQoX0FSQ0hfUFBDKQorCisvKgorICogV2UgdXNlIGFuIGVpZWlvKCkgZm9yIHdtYigpIG9uIHBvd2VycGMuICBUaGlzIGFzc3VtZXMgd2UgZG9uJ3QKKyAqIG5lZWQgdG8gb3JkZXIgY2FjaGVhYmxlIGFuZCBub24tY2FjaGVhYmxlIHN0b3JlcyB3aXRoIHJlc3BlY3QgdG8KKyAqIGVhY2ggb3RoZXIuCisgKgorICogc21wX21iIGhhcyB0aGUgc2FtZSBwcm9ibGVtIGFzIG9uIHg4NiBmb3Igbm90LXZlcnktbmV3IEdDQworICogKGh0dHA6Ly9wYXRjaHdvcmsub3psYWJzLm9yZy9wYXRjaC8xMjYxODQvLCBOb3YgMjAxMSkuCisgKi8KKyNkZWZpbmUgc21wX3dtYigpICAgKHsgYXNtIHZvbGF0aWxlKCJlaWVpbyIgOjo6ICJtZW1vcnkiKTsgKHZvaWQpMDsgfSkKKyNpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisjZGVmaW5lIHNtcF9ybWIoKSAgICh7IGFzbSB2b2xhdGlsZSgibHdzeW5jIiA6OjogIm1lbW9yeSIpOyAodm9pZCkwOyB9KQorI2Vsc2UKKyNkZWZpbmUgc21wX3JtYigpICAgKHsgYXNtIHZvbGF0aWxlKCJzeW5jIiA6OjogIm1lbW9yeSIpOyAodm9pZCkwOyB9KQorI2VuZGlmCisjZGVmaW5lIHNtcF9tYigpICAgICh7IGFzbSB2b2xhdGlsZSgic3luYyIgOjo6ICJtZW1vcnkiKTsgKHZvaWQpMDsgfSkKKworI2VuZGlmIC8qIF9BUkNIX1BQQyAqLworCisjZW5kaWYgLyogQzExIGF0b21pY3MgKi8KKworLyoKKyAqIEZvciAoaG9zdCkgcGxhdGZvcm1zIHdlIGRvbid0IGhhdmUgZXhwbGljaXQgYmFycmllciBkZWZpbml0aW9ucworICogZm9yLCB3ZSB1c2UgdGhlIGdjYyBfX3N5bmNfc3luY2hyb25pemUoKSBwcmltaXRpdmUgdG8gZ2VuZXJhdGUgYQorICogZnVsbCBiYXJyaWVyLiAgVGhpcyBzaG91bGQgYmUgc2FmZSBvbiBhbGwgcGxhdGZvcm1zLCB0aG91Z2ggaXQgbWF5CisgKiBiZSBvdmVya2lsbCBmb3Igc21wX3dtYigpIGFuZCBzbXBfcm1iKCkuCisgKi8KKyNpZm5kZWYgc21wX21iCisjZGVmaW5lIHNtcF9tYigpICAgIF9fc3luY19zeW5jaHJvbml6ZSgpCisjZW5kaWYKKworI2lmbmRlZiBzbXBfd21iCisjaWZkZWYgX19BVE9NSUNfUkVMRUFTRQorI2RlZmluZSBzbXBfd21iKCkgICBfX2F0b21pY190aHJlYWRfZmVuY2UoX19BVE9NSUNfUkVMRUFTRSkKKyNlbHNlCisjZGVmaW5lIHNtcF93bWIoKSAgIF9fc3luY19zeW5jaHJvbml6ZSgpCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIHNtcF9ybWIKKyNpZmRlZiBfX0FUT01JQ19BQ1FVSVJFCisjZGVmaW5lIHNtcF9ybWIoKSAgIF9fYXRvbWljX3RocmVhZF9mZW5jZShfX0FUT01JQ19BQ1FVSVJFKQorI2Vsc2UKKyNkZWZpbmUgc21wX3JtYigpICAgX19zeW5jX3N5bmNocm9uaXplKCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzCisjaWZkZWYgX19BVE9NSUNfQ09OU1VNRQorI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSAgIF9fYXRvbWljX3RocmVhZF9mZW5jZShfX0FUT01JQ19DT05TVU1FKQorI2Vsc2UKKyNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkgICBiYXJyaWVyKCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgYXRvbWljX3JlYWQKKyNkZWZpbmUgYXRvbWljX3JlYWQocHRyKSAgICAgICAoKihfX3R5cGVvZl9fKCpwdHIpICp2b2xhdGlsZSkgKHB0cikpCisjZW5kaWYKKworI2lmbmRlZiBhdG9taWNfc2V0CisjZGVmaW5lIGF0b21pY19zZXQocHRyLCBpKSAgICAgKCgqKF9fdHlwZW9mX18oKnB0cikgKnZvbGF0aWxlKSAocHRyKSkgPSAoaSkpCisjZW5kaWYKKworLyogVGhlc2UgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgSmF2YSB2b2xhdGlsZSB2YXJpYWJsZXMuCisgKiBTZWUgaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2ptbS9jb29rYm9vay5odG1sOgorICogIjEuIElzc3VlIGEgU3RvcmVTdG9yZSBiYXJyaWVyICh3bWIpIGJlZm9yZSBlYWNoIHZvbGF0aWxlIHN0b3JlLiIKKyAqICAyLiBJc3N1ZSBhIFN0b3JlTG9hZCBiYXJyaWVyIGFmdGVyIGVhY2ggdm9sYXRpbGUgc3RvcmUuCisgKiAgICAgTm90ZSB0aGF0IHlvdSBjb3VsZCBpbnN0ZWFkIGlzc3VlIG9uZSBiZWZvcmUgZWFjaCB2b2xhdGlsZSBsb2FkLCBidXQKKyAqICAgICB0aGlzIHdvdWxkIGJlIHNsb3dlciBmb3IgdHlwaWNhbCBwcm9ncmFtcyB1c2luZyB2b2xhdGlsZXMgaW4gd2hpY2gKKyAqICAgICByZWFkcyBncmVhdGx5IG91dG51bWJlciB3cml0ZXMuIEFsdGVybmF0aXZlbHksIGlmIGF2YWlsYWJsZSwgeW91CisgKiAgICAgY2FuIGltcGxlbWVudCB2b2xhdGlsZSBzdG9yZSBhcyBhbiBhdG9taWMgaW5zdHJ1Y3Rpb24gKGZvciBleGFtcGxlCisgKiAgICAgWENIRyBvbiB4ODYpIGFuZCBvbWl0IHRoZSBiYXJyaWVyLiBUaGlzIG1heSBiZSBtb3JlIGVmZmljaWVudCBpZgorICogICAgIGF0b21pYyBpbnN0cnVjdGlvbnMgYXJlIGNoZWFwZXIgdGhhbiBTdG9yZUxvYWQgYmFycmllcnMuCisgKiAgMy4gSXNzdWUgTG9hZExvYWQgYW5kIExvYWRTdG9yZSBiYXJyaWVycyBhZnRlciBlYWNoIHZvbGF0aWxlIGxvYWQuIgorICoKKyAqIElmIHlvdSBwcmVmZXIgdG8gdGhpbmsgaW4gdGVybXMgb2YgInBhaXJpbmciIG9mIG1lbW9yeSBiYXJyaWVycywKKyAqIGFuIGF0b21pY19tYl9yZWFkIHBhaXJzIHdpdGggYW4gYXRvbWljX21iX3NldC4KKyAqCisgKiBBbmQgZm9yIHRoZSBmZXcgaWE2NCBsb3ZlcnMgdGhhdCBleGlzdCwgYW4gYXRvbWljX21iX3JlYWQgaXMgYSBsZC5hY3EsCisgKiB3aGlsZSBhbiBhdG9taWNfbWJfc2V0IGlzIGEgc3QucmVsIGZvbGxvd2VkIGJ5IGEgbWVtb3J5IGJhcnJpZXIuCisgKgorICogVGhlc2UgYXJlIGEgYml0IHdlYWtlciB0aGFuIF9fYXRvbWljX2xvYWQvc3RvcmUgd2l0aCBfX0FUT01JQ19TRVFfQ1NUCisgKiAoc2VlIGRvY3MvYXRvbWljcy50eHQpLCBhbmQgSSdtIG5vdCBzdXJlIHRoYXQgX19BVE9NSUNfQUNRX1JFTCBpcyBlbm91Z2guCisgKiBKdXN0IGFsd2F5cyB1c2UgdGhlIGJhcnJpZXJzIG1hbnVhbGx5IGJ5IHRoZSBydWxlcyBhYm92ZS4KKyAqLworI2lmbmRlZiBhdG9taWNfbWJfcmVhZAorI2RlZmluZSBhdG9taWNfbWJfcmVhZChwdHIpICAgICh7ICAgICAgICAgICBcCisgICAgdHlwZW9mKCpwdHIpIF92YWwgPSBhdG9taWNfcmVhZChwdHIpOyAgIFwKKyAgICBzbXBfcm1iKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2VuZGlmCisKKyNpZm5kZWYgYXRvbWljX21iX3NldAorI2RlZmluZSBhdG9taWNfbWJfc2V0KHB0ciwgaSkgIGRvIHsgICAgICAgICBcCisgICAgc21wX3dtYigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdG9taWNfc2V0KHB0ciwgaSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNtcF9tYigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgYXRvbWljX3hjaGcKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgYXRvbWljX3hjaGcocHRyLCBpKSAgICBfX3N5bmNfc3dhcChwdHIsIGkpCisjZWxpZiBkZWZpbmVkKF9fQVRPTUlDX1NFUV9DU1QpCisjZGVmaW5lIGF0b21pY194Y2hnKHB0ciwgaSkgICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZW9mKCpwdHIpIF9uZXcgPSAoaSksIF9vbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hdG9taWNfZXhjaGFuZ2UocHRyLCAmX25ldywgJl9vbGQsIF9fQVRPTUlDX1NFUV9DU1QpOyBcCisgICAgX29sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorI2Vsc2UKKy8qIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCgpIGlzIGRvY3VtZW50ZWQgdG8gYmUgYW4gYWNxdWlyZSBiYXJyaWVyIG9ubHkuICAqLworI2RlZmluZSBhdG9taWNfeGNoZyhwdHIsIGkpICAgIChzbXBfbWIoKSwgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KHB0ciwgaSkpCisjZW5kaWYKKyNlbmRpZgorCisvKiBQcm92aWRlIHNob3J0ZXIgbmFtZXMgZm9yIEdDQyBhdG9taWMgYnVpbHRpbnMuICAqLworI2RlZmluZSBhdG9taWNfZmV0Y2hfaW5jKHB0cikgIF9fc3luY19mZXRjaF9hbmRfYWRkKHB0ciwgMSkKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2RlYyhwdHIpICBfX3N5bmNfZmV0Y2hfYW5kX2FkZChwdHIsIC0xKQorI2RlZmluZSBhdG9taWNfZmV0Y2hfYWRkICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWIgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FuZCAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZAorI2RlZmluZSBhdG9taWNfZmV0Y2hfb3IgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IKKyNkZWZpbmUgYXRvbWljX2NtcHhjaGcgICAgICAgICBfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAKKworLyogQW5kIGV2ZW4gc2hvcnRlciBuYW1lcyB0aGF0IHJldHVybiB2b2lkLiAgKi8KKyNkZWZpbmUgYXRvbWljX2luYyhwdHIpICAgICAgICAoKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKHB0ciwgMSkpCisjZGVmaW5lIGF0b21pY19kZWMocHRyKSAgICAgICAgKCh2b2lkKSBfX3N5bmNfZmV0Y2hfYW5kX2FkZChwdHIsIC0xKSkKKyNkZWZpbmUgYXRvbWljX2FkZChwdHIsIG4pICAgICAoKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKHB0ciwgbikpCisjZGVmaW5lIGF0b21pY19zdWIocHRyLCBuKSAgICAgKCh2b2lkKSBfX3N5bmNfZmV0Y2hfYW5kX3N1YihwdHIsIG4pKQorI2RlZmluZSBhdG9taWNfYW5kKHB0ciwgbikgICAgICgodm9pZCkgX19zeW5jX2ZldGNoX2FuZF9hbmQocHRyLCBuKSkKKyNkZWZpbmUgYXRvbWljX29yKHB0ciwgbikgICAgICAoKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfb3IocHRyLCBuKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9iaXRtYXAuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2JpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjAxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9iaXRtYXAuaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIEJpdG1hcCBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluLmNoYXJ5QGdtYWlsLmNvbT4KKyAqCisgKiBNb3N0bHkgaW5zcGlyZWQgYnkgKHN0b2xlbiBmcm9tKSBsaW51eC9iaXRtYXAuaCBhbmQgbGludXgvYml0b3BzLmgKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBCSVRNQVBfSAorI2RlZmluZSBCSVRNQVBfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L2JpdG9wcy5oIgorCisvKgorICogVGhlIGF2YWlsYWJsZSBiaXRtYXAgb3BlcmF0aW9ucyBhbmQgdGhlaXIgcm91Z2ggbWVhbmluZyBpbiB0aGUKKyAqIGNhc2UgdGhhdCB0aGUgYml0bWFwIGlzIGEgc2luZ2xlIHVuc2lnbmVkIGxvbmcgYXJlIHRodXM6CisgKgorICogTm90ZSB0aGF0IG5iaXRzIHNob3VsZCBiZSBhbHdheXMgYSBjb21waWxlIHRpbWUgZXZhbHVhYmxlIGNvbnN0YW50LgorICogT3RoZXJ3aXNlIG1hbnkgaW5saW5lcyB3aWxsIGdlbmVyYXRlIGhvcnJpYmxlIGNvZGUuCisgKgorICogYml0bWFwX3plcm8oZHN0LCBuYml0cykJCQkqZHN0ID0gMFVMCisgKiBiaXRtYXBfZmlsbChkc3QsIG5iaXRzKQkJCSpkc3QgPSB+MFVMCisgKiBiaXRtYXBfY29weShkc3QsIHNyYywgbmJpdHMpCQkJKmRzdCA9ICpzcmMKKyAqIGJpdG1hcF9hbmQoZHN0LCBzcmMxLCBzcmMyLCBuYml0cykJCSpkc3QgPSAqc3JjMSAmICpzcmMyCisgKiBiaXRtYXBfb3IoZHN0LCBzcmMxLCBzcmMyLCBuYml0cykJCSpkc3QgPSAqc3JjMSB8ICpzcmMyCisgKiBiaXRtYXBfeG9yKGRzdCwgc3JjMSwgc3JjMiwgbmJpdHMpCQkqZHN0ID0gKnNyYzEgXiAqc3JjMgorICogYml0bWFwX2FuZG5vdChkc3QsIHNyYzEsIHNyYzIsIG5iaXRzKQkqZHN0ID0gKnNyYzEgJiB+KCpzcmMyKQorICogYml0bWFwX2NvbXBsZW1lbnQoZHN0LCBzcmMsIG5iaXRzKQkJKmRzdCA9IH4oKnNyYykKKyAqIGJpdG1hcF9lcXVhbChzcmMxLCBzcmMyLCBuYml0cykJCUFyZSAqc3JjMSBhbmQgKnNyYzIgZXF1YWw/CisgKiBiaXRtYXBfaW50ZXJzZWN0cyhzcmMxLCBzcmMyLCBuYml0cykgICAgICAgICBEbyAqc3JjMSBhbmQgKnNyYzIgb3ZlcmxhcD8KKyAqIGJpdG1hcF9lbXB0eShzcmMsIG5iaXRzKQkJCUFyZSBhbGwgYml0cyB6ZXJvIGluICpzcmM/CisgKiBiaXRtYXBfZnVsbChzcmMsIG5iaXRzKQkJCUFyZSBhbGwgYml0cyBzZXQgaW4gKnNyYz8KKyAqIGJpdG1hcF9zZXQoZHN0LCBwb3MsIG5iaXRzKQkJCVNldCBzcGVjaWZpZWQgYml0IGFyZWEKKyAqIGJpdG1hcF9jbGVhcihkc3QsIHBvcywgbmJpdHMpCQlDbGVhciBzcGVjaWZpZWQgYml0IGFyZWEKKyAqIGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhKGJ1ZiwgbGVuLCBwb3MsIG4sIG1hc2spCUZpbmQgYml0IGZyZWUgYXJlYQorICovCisKKy8qCisgKiBBbHNvIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcHBseSB0byBiaXRtYXBzLgorICoKKyAqIHNldF9iaXQoYml0LCBhZGRyKQkJCSphZGRyIHw9IGJpdAorICogY2xlYXJfYml0KGJpdCwgYWRkcikJCQkqYWRkciAmPSB+Yml0CisgKiBjaGFuZ2VfYml0KGJpdCwgYWRkcikJCSphZGRyIF49IGJpdAorICogdGVzdF9iaXQoYml0LCBhZGRyKQkJCUlzIGJpdCBzZXQgaW4gKmFkZHI/CisgKiB0ZXN0X2FuZF9zZXRfYml0KGJpdCwgYWRkcikJCVNldCBiaXQgYW5kIHJldHVybiBvbGQgdmFsdWUKKyAqIHRlc3RfYW5kX2NsZWFyX2JpdChiaXQsIGFkZHIpCUNsZWFyIGJpdCBhbmQgcmV0dXJuIG9sZCB2YWx1ZQorICogdGVzdF9hbmRfY2hhbmdlX2JpdChiaXQsIGFkZHIpCUNoYW5nZSBiaXQgYW5kIHJldHVybiBvbGQgdmFsdWUKKyAqIGZpbmRfZmlyc3RfemVyb19iaXQoYWRkciwgbmJpdHMpCVBvc2l0aW9uIGZpcnN0IHplcm8gYml0IGluICphZGRyCisgKiBmaW5kX2ZpcnN0X2JpdChhZGRyLCBuYml0cykJCVBvc2l0aW9uIGZpcnN0IHNldCBiaXQgaW4gKmFkZHIKKyAqIGZpbmRfbmV4dF96ZXJvX2JpdChhZGRyLCBuYml0cywgYml0KQlQb3NpdGlvbiBuZXh0IHplcm8gYml0IGluICphZGRyID49IGJpdAorICogZmluZF9uZXh0X2JpdChhZGRyLCBuYml0cywgYml0KQlQb3NpdGlvbiBuZXh0IHNldCBiaXQgaW4gKmFkZHIgPj0gYml0CisgKi8KKworI2RlZmluZSBCSVRNQVBfTEFTVF9XT1JEX01BU0sobmJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKG5iaXRzKSAlIEJJVFNfUEVSX0xPTkcpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoMVVMPDwoKG5iaXRzKSAlIEJJVFNfUEVSX0xPTkcpKS0xIDogfjBVTCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICApCisKKyNkZWZpbmUgREVDTEFSRV9CSVRNQVAobmFtZSxiaXRzKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuYW1lW0JJVFNfVE9fTE9OR1MoYml0cyldCisKKyNkZWZpbmUgc21hbGxfbmJpdHMobmJpdHMpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKChuYml0cykgPD0gKGludClCSVRTX1BFUl9MT05HKQorCitpbnQgc2xvd19iaXRtYXBfZW1wdHkoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwLCBsb25nIGJpdHMpOworaW50IHNsb3dfYml0bWFwX2Z1bGwoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwLCBsb25nIGJpdHMpOworaW50IHNsb3dfYml0bWFwX2VxdWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMiwgbG9uZyBiaXRzKTsKK3ZvaWQgc2xvd19iaXRtYXBfY29tcGxlbWVudCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJpdHMpOwordm9pZCBzbG93X2JpdG1hcF9zaGlmdF9yaWdodCh1bnNpZ25lZCBsb25nICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywgaW50IHNoaWZ0LCBsb25nIGJpdHMpOwordm9pZCBzbG93X2JpdG1hcF9zaGlmdF9sZWZ0KHVuc2lnbmVkIGxvbmcgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBzaGlmdCwgbG9uZyBiaXRzKTsKK2ludCBzbG93X2JpdG1hcF9hbmQodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpOwordm9pZCBzbG93X2JpdG1hcF9vcih1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIGxvbmcgYml0cyk7Cit2b2lkIHNsb3dfYml0bWFwX3hvcih1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpOworaW50IHNsb3dfYml0bWFwX2FuZG5vdCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIGxvbmcgYml0cyk7CitpbnQgc2xvd19iaXRtYXBfaW50ZXJzZWN0cyhjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMiwgbG9uZyBiaXRzKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpiaXRtYXBfbmV3KGxvbmcgbmJpdHMpCit7CisgICAgbG9uZyBsZW4gPSBCSVRTX1RPX0xPTkdTKG5iaXRzKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICByZXR1cm4gZ19tYWxsb2MwKGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRtYXBfemVybyh1bnNpZ25lZCBsb25nICpkc3QsIGxvbmcgbmJpdHMpCit7CisgICAgaWYgKHNtYWxsX25iaXRzKG5iaXRzKSkgeworICAgICAgICAqZHN0ID0gMFVMOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvbmcgbGVuID0gQklUU19UT19MT05HUyhuYml0cykgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisgICAgICAgIG1lbXNldChkc3QsIDAsIGxlbik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYml0bWFwX2ZpbGwodW5zaWduZWQgbG9uZyAqZHN0LCBsb25nIG5iaXRzKQoreworICAgIHNpemVfdCBubG9uZ3MgPSBCSVRTX1RPX0xPTkdTKG5iaXRzKTsKKyAgICBpZiAoIXNtYWxsX25iaXRzKG5iaXRzKSkgeworICAgICAgICBsb25nIGxlbiA9IChubG9uZ3MgLSAxKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICAgICAgbWVtc2V0KGRzdCwgMHhmZiwgIGxlbik7CisgICAgfQorICAgIGRzdFtubG9uZ3MgLSAxXSA9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRtYXBfY29weSh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5iaXRzKQoreworICAgIGlmIChzbWFsbF9uYml0cyhuYml0cykpIHsKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9uZyBsZW4gPSBCSVRTX1RPX0xPTkdTKG5iaXRzKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgYml0bWFwX2FuZCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYzIsIGxvbmcgbmJpdHMpCit7CisgICAgaWYgKHNtYWxsX25iaXRzKG5iaXRzKSkgeworICAgICAgICByZXR1cm4gKCpkc3QgPSAqc3JjMSAmICpzcmMyKSAhPSAwOworICAgIH0KKyAgICByZXR1cm4gc2xvd19iaXRtYXBfYW5kKGRzdCwgc3JjMSwgc3JjMiwgbmJpdHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYml0bWFwX29yKHVuc2lnbmVkIGxvbmcgKmRzdCwgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjMiwgbG9uZyBuYml0cykKK3sKKyAgICBpZiAoc21hbGxfbmJpdHMobmJpdHMpKSB7CisgICAgICAgICpkc3QgPSAqc3JjMSB8ICpzcmMyOworICAgIH0gZWxzZSB7CisgICAgICAgIHNsb3dfYml0bWFwX29yKGRzdCwgc3JjMSwgc3JjMiwgbmJpdHMpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGJpdG1hcF94b3IodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjMiwgbG9uZyBuYml0cykKK3sKKyAgICBpZiAoc21hbGxfbmJpdHMobmJpdHMpKSB7CisgICAgICAgICpkc3QgPSAqc3JjMSBeICpzcmMyOworICAgIH0gZWxzZSB7CisgICAgICAgIHNsb3dfYml0bWFwX3hvcihkc3QsIHNyYzEsIHNyYzIsIG5iaXRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJpdG1hcF9hbmRub3QodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMyLCBsb25nIG5iaXRzKQoreworICAgIGlmIChzbWFsbF9uYml0cyhuYml0cykpIHsKKyAgICAgICAgcmV0dXJuICgqZHN0ID0gKnNyYzEgJiB+KCpzcmMyKSkgIT0gMDsKKyAgICB9CisgICAgcmV0dXJuIHNsb3dfYml0bWFwX2FuZG5vdChkc3QsIHNyYzEsIHNyYzIsIG5iaXRzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJpdG1hcF9jb21wbGVtZW50KHVuc2lnbmVkIGxvbmcgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBuYml0cykKK3sKKyAgICBpZiAoc21hbGxfbmJpdHMobmJpdHMpKSB7CisgICAgICAgICpkc3QgPSB+KCpzcmMpICYgQklUTUFQX0xBU1RfV09SRF9NQVNLKG5iaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbG93X2JpdG1hcF9jb21wbGVtZW50KGRzdCwgc3JjLCBuYml0cyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBiaXRtYXBfZXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMyLCBsb25nIG5iaXRzKQoreworICAgIGlmIChzbWFsbF9uYml0cyhuYml0cykpIHsKKyAgICAgICAgcmV0dXJuICEgKCgqc3JjMSBeICpzcmMyKSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cykpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzbG93X2JpdG1hcF9lcXVhbChzcmMxLCBzcmMyLCBuYml0cyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBiaXRtYXBfZW1wdHkoY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjLCBsb25nIG5iaXRzKQoreworICAgIGlmIChzbWFsbF9uYml0cyhuYml0cykpIHsKKyAgICAgICAgcmV0dXJuICEgKCpzcmMgJiBCSVRNQVBfTEFTVF9XT1JEX01BU0sobmJpdHMpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc2xvd19iaXRtYXBfZW1wdHkoc3JjLCBuYml0cyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBiaXRtYXBfZnVsbChjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGxvbmcgbmJpdHMpCit7CisgICAgaWYgKHNtYWxsX25iaXRzKG5iaXRzKSkgeworICAgICAgICByZXR1cm4gISAofigqc3JjKSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cykpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzbG93X2JpdG1hcF9mdWxsKHNyYywgbmJpdHMpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgYml0bWFwX2ludGVyc2VjdHMoY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYzIsIGxvbmcgbmJpdHMpCit7CisgICAgaWYgKHNtYWxsX25iaXRzKG5iaXRzKSkgeworICAgICAgICByZXR1cm4gKCgqc3JjMSAmICpzcmMyKSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cykpICE9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHNsb3dfYml0bWFwX2ludGVyc2VjdHMoc3JjMSwgc3JjMiwgbmJpdHMpOworICAgIH0KK30KKwordm9pZCBiaXRtYXBfc2V0KHVuc2lnbmVkIGxvbmcgKm1hcCwgbG9uZyBpLCBsb25nIGxlbik7Cit2b2lkIGJpdG1hcF9jbGVhcih1bnNpZ25lZCBsb25nICptYXAsIGxvbmcgc3RhcnQsIGxvbmcgbnIpOwordW5zaWduZWQgbG9uZyBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYSh1bnNpZ25lZCBsb25nICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpiaXRtYXBfemVyb19leHRlbmQodW5zaWduZWQgbG9uZyAqb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBvbGRfbmJpdHMsIGxvbmcgbmV3X25iaXRzKQoreworICAgIGxvbmcgbmV3X2xlbiA9IEJJVFNfVE9fTE9OR1MobmV3X25iaXRzKSAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKyAgICB1bnNpZ25lZCBsb25nICpuZXcgPSBnX3JlYWxsb2Mob2xkLCBuZXdfbGVuKTsKKyAgICBiaXRtYXBfY2xlYXIobmV3LCBvbGRfbmJpdHMsIG5ld19uYml0cyAtIG9sZF9uYml0cyk7CisgICAgcmV0dXJuIG5ldzsKK30KKworI2VuZGlmIC8qIEJJVE1BUF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9iaXRvcHMuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2JpdG9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MGIxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9iaXRvcHMuaApAQCAtMCwwICsxLDQwNiBAQAorLyoKKyAqIEJpdG9wcyBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQ29yZW50aW4gQ2hhcnkgPGNvcmVudGluLmNoYXJ5QGdtYWlsLmNvbT4KKyAqCisgKiBNb3N0bHkgaW5zcGlyZWQgYnkgKHN0b2xlbiBmcm9tKSBsaW51eC9iaXRtYXAuaCBhbmQgbGludXgvYml0b3BzLmgKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBCSVRPUFNfSAorI2RlZmluZSBCSVRPUFNfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJob3N0LXV0aWxzLmgiCisKKyNkZWZpbmUgQklUU19QRVJfQllURSAgICAgICAgICAgQ0hBUl9CSVQKKyNkZWZpbmUgQklUU19QRVJfTE9ORyAgICAgICAgICAgKHNpemVvZiAodW5zaWduZWQgbG9uZykgKiBCSVRTX1BFUl9CWVRFKQorCisjZGVmaW5lIEJJVChucikJCQkoMVVMIDw8IChucikpCisjZGVmaW5lIEJJVF9NQVNLKG5yKQkJKDFVTCA8PCAoKG5yKSAlIEJJVFNfUEVSX0xPTkcpKQorI2RlZmluZSBCSVRfV09SRChucikJCSgobnIpIC8gQklUU19QRVJfTE9ORykKKyNkZWZpbmUgQklUU19UT19MT05HUyhucikJRElWX1JPVU5EX1VQKG5yLCBCSVRTX1BFUl9CWVRFICogc2l6ZW9mKGxvbmcpKQorCisvKioKKyAqIHNldF9iaXQgLSBTZXQgYSBiaXQgaW4gbWVtb3J5CisgKiBAbnI6IHRoZSBiaXQgdG8gc2V0CisgKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gc3RhcnQgY291bnRpbmcgZnJvbQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChsb25nIG5yLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgbWFzayA9IEJJVF9NQVNLKG5yKTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAqcCA9IGFkZHIgKyBCSVRfV09SRChucik7CisKKwkqcCAgfD0gbWFzazsKK30KKworLyoqCisgKiBjbGVhcl9iaXQgLSBDbGVhcnMgYSBiaXQgaW4gbWVtb3J5CisgKiBAbnI6IEJpdCB0byBjbGVhcgorICogQGFkZHI6IEFkZHJlc3MgdG8gc3RhcnQgY291bnRpbmcgZnJvbQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0KGxvbmcgbnIsIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gQklUX01BU0sobnIpOworICAgICAgICB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIEJJVF9XT1JEKG5yKTsKKworCSpwICY9IH5tYXNrOworfQorCisvKioKKyAqIGNoYW5nZV9iaXQgLSBUb2dnbGUgYSBiaXQgaW4gbWVtb3J5CisgKiBAbnI6IEJpdCB0byBjaGFuZ2UKKyAqIEBhZGRyOiBBZGRyZXNzIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9iaXQobG9uZyBuciwgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBCSVRfTUFTSyhucik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgQklUX1dPUkQobnIpOworCisJKnAgXj0gbWFzazsKK30KKworLyoqCisgKiB0ZXN0X2FuZF9zZXRfYml0IC0gU2V0IGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiBCaXQgdG8gc2V0CisgKiBAYWRkcjogQWRkcmVzcyB0byBjb3VudCBmcm9tCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX3NldF9iaXQobG9uZyBuciwgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBCSVRfTUFTSyhucik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgQklUX1dPUkQobnIpOworCXVuc2lnbmVkIGxvbmcgb2xkID0gKnA7CisKKwkqcCA9IG9sZCB8IG1hc2s7CisJcmV0dXJuIChvbGQgJiBtYXNrKSAhPSAwOworfQorCisvKioKKyAqIHRlc3RfYW5kX2NsZWFyX2JpdCAtIENsZWFyIGEgYml0IGFuZCByZXR1cm4gaXRzIG9sZCB2YWx1ZQorICogQG5yOiBCaXQgdG8gY2xlYXIKKyAqIEBhZGRyOiBBZGRyZXNzIHRvIGNvdW50IGZyb20KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGxvbmcgbnIsIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gQklUX01BU0sobnIpOworICAgICAgICB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIEJJVF9XT1JEKG5yKTsKKwl1bnNpZ25lZCBsb25nIG9sZCA9ICpwOworCisJKnAgPSBvbGQgJiB+bWFzazsKKwlyZXR1cm4gKG9sZCAmIG1hc2spICE9IDA7Cit9CisKKy8qKgorICogdGVzdF9hbmRfY2hhbmdlX2JpdCAtIENoYW5nZSBhIGJpdCBhbmQgcmV0dXJuIGl0cyBvbGQgdmFsdWUKKyAqIEBucjogQml0IHRvIGNoYW5nZQorICogQGFkZHI6IEFkZHJlc3MgdG8gY291bnQgZnJvbQorICovCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGxvbmcgbnIsIHVuc2lnbmVkIGxvbmcgKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gQklUX01BU0sobnIpOworICAgICAgICB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIEJJVF9XT1JEKG5yKTsKKwl1bnNpZ25lZCBsb25nIG9sZCA9ICpwOworCisJKnAgPSBvbGQgXiBtYXNrOworCXJldHVybiAob2xkICYgbWFzaykgIT0gMDsKK30KKworLyoqCisgKiB0ZXN0X2JpdCAtIERldGVybWluZSB3aGV0aGVyIGEgYml0IGlzIHNldAorICogQG5yOiBiaXQgbnVtYmVyIHRvIHRlc3QKKyAqIEBhZGRyOiBBZGRyZXNzIHRvIHN0YXJ0IGNvdW50aW5nIGZyb20KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaXQobG9uZyBuciwgY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkcikKK3sKKwlyZXR1cm4gMVVMICYgKGFkZHJbQklUX1dPUkQobnIpXSA+PiAobnIgJiAoQklUU19QRVJfTE9ORy0xKSkpOworfQorCisvKioKKyAqIGZpbmRfbGFzdF9iaXQgLSBmaW5kIHRoZSBsYXN0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gc3RhcnQgdGhlIHNlYXJjaCBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKgorICogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgZmlyc3Qgc2V0IGJpdCwgb3Igc2l6ZS4KKyAqLwordW5zaWduZWQgbG9uZyBmaW5kX2xhc3RfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKKworLyoqCisgKiBmaW5kX25leHRfYml0IC0gZmluZCB0aGUgbmV4dCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgorICogQGFkZHI6IFRoZSBhZGRyZXNzIHRvIGJhc2UgdGhlIHNlYXJjaCBvbgorICogQG9mZnNldDogVGhlIGJpdG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgYXQKKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICovCit1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwKKwkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKworLyoqCisgKiBmaW5kX25leHRfemVyb19iaXQgLSBmaW5kIHRoZSBuZXh0IGNsZWFyZWQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgorICogQGFkZHI6IFRoZSBhZGRyZXNzIHRvIGJhc2UgdGhlIHNlYXJjaCBvbgorICogQG9mZnNldDogVGhlIGJpdG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgYXQKKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICovCisKK3Vuc2lnbmVkIGxvbmcgZmluZF9uZXh0X3plcm9fYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCk7CisKKy8qKgorICogZmluZF9maXJzdF9iaXQgLSBmaW5kIHRoZSBmaXJzdCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgorICogQGFkZHI6IFRoZSBhZGRyZXNzIHRvIHN0YXJ0IHRoZSBzZWFyY2ggYXQKKyAqIEBzaXplOiBUaGUgbWF4aW11bSBzaXplIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgdGhlIGJpdCBudW1iZXIgb2YgdGhlIGZpcnN0IHNldCBiaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaW5kX2ZpcnN0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICByZXR1cm4gZmluZF9uZXh0X2JpdChhZGRyLCBzaXplLCAwKTsKK30KKworLyoqCisgKiBmaW5kX2ZpcnN0X3plcm9fYml0IC0gZmluZCB0aGUgZmlyc3QgY2xlYXJlZCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCisgKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gc3RhcnQgdGhlIHNlYXJjaCBhdAorICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCisgKgorICogUmV0dXJucyB0aGUgYml0IG51bWJlciBvZiB0aGUgZmlyc3QgY2xlYXJlZCBiaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmaW5kX2ZpcnN0X3plcm9fYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgcmV0dXJuIGZpbmRfbmV4dF96ZXJvX2JpdChhZGRyLCBzaXplLCAwKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGh3ZWlnaHRfbG9uZyh1bnNpZ25lZCBsb25nIHcpCit7CisgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKKworICAgIGZvciAoY291bnQgPSAwOyB3OyB3ID4+PSAxKSB7CisgICAgICAgIGNvdW50ICs9IHcgJiAxOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogcm9sOCAtIHJvdGF0ZSBhbiA4LWJpdCB2YWx1ZSBsZWZ0CisgKiBAd29yZDogdmFsdWUgdG8gcm90YXRlCisgKiBAc2hpZnQ6IGJpdHMgdG8gcm9sbAorICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgcm9sOCh1aW50OF90IHdvcmQsIHVuc2lnbmVkIGludCBzaGlmdCkKK3sKKyAgICByZXR1cm4gKHdvcmQgPDwgc2hpZnQpIHwgKHdvcmQgPj4gKDggLSBzaGlmdCkpOworfQorCisvKioKKyAqIHJvcjggLSByb3RhdGUgYW4gOC1iaXQgdmFsdWUgcmlnaHQKKyAqIEB3b3JkOiB2YWx1ZSB0byByb3RhdGUKKyAqIEBzaGlmdDogYml0cyB0byByb2xsCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDhfdCByb3I4KHVpbnQ4X3Qgd29yZCwgdW5zaWduZWQgaW50IHNoaWZ0KQoreworICAgIHJldHVybiAod29yZCA+PiBzaGlmdCkgfCAod29yZCA8PCAoOCAtIHNoaWZ0KSk7Cit9CisKKy8qKgorICogcm9sMTYgLSByb3RhdGUgYSAxNi1iaXQgdmFsdWUgbGVmdAorICogQHdvcmQ6IHZhbHVlIHRvIHJvdGF0ZQorICogQHNoaWZ0OiBiaXRzIHRvIHJvbGwKKyAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCByb2wxNih1aW50MTZfdCB3b3JkLCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisgICAgcmV0dXJuICh3b3JkIDw8IHNoaWZ0KSB8ICh3b3JkID4+ICgxNiAtIHNoaWZ0KSk7Cit9CisKKy8qKgorICogcm9yMTYgLSByb3RhdGUgYSAxNi1iaXQgdmFsdWUgcmlnaHQKKyAqIEB3b3JkOiB2YWx1ZSB0byByb3RhdGUKKyAqIEBzaGlmdDogYml0cyB0byByb2xsCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3Qgcm9yMTYodWludDE2X3Qgd29yZCwgdW5zaWduZWQgaW50IHNoaWZ0KQoreworICAgIHJldHVybiAod29yZCA+PiBzaGlmdCkgfCAod29yZCA8PCAoMTYgLSBzaGlmdCkpOworfQorCisvKioKKyAqIHJvbDMyIC0gcm90YXRlIGEgMzItYml0IHZhbHVlIGxlZnQKKyAqIEB3b3JkOiB2YWx1ZSB0byByb3RhdGUKKyAqIEBzaGlmdDogYml0cyB0byByb2xsCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgcm9sMzIodWludDMyX3Qgd29yZCwgdW5zaWduZWQgaW50IHNoaWZ0KQoreworICAgIHJldHVybiAod29yZCA8PCBzaGlmdCkgfCAod29yZCA+PiAoMzIgLSBzaGlmdCkpOworfQorCisvKioKKyAqIHJvcjMyIC0gcm90YXRlIGEgMzItYml0IHZhbHVlIHJpZ2h0CisgKiBAd29yZDogdmFsdWUgdG8gcm90YXRlCisgKiBAc2hpZnQ6IGJpdHMgdG8gcm9sbAorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHJvcjMyKHVpbnQzMl90IHdvcmQsIHVuc2lnbmVkIGludCBzaGlmdCkKK3sKKyAgICByZXR1cm4gKHdvcmQgPj4gc2hpZnQpIHwgKHdvcmQgPDwgKDMyIC0gc2hpZnQpKTsKK30KKworLyoqCisgKiByb2w2NCAtIHJvdGF0ZSBhIDY0LWJpdCB2YWx1ZSBsZWZ0CisgKiBAd29yZDogdmFsdWUgdG8gcm90YXRlCisgKiBAc2hpZnQ6IGJpdHMgdG8gcm9sbAorICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHJvbDY0KHVpbnQ2NF90IHdvcmQsIHVuc2lnbmVkIGludCBzaGlmdCkKK3sKKyAgICByZXR1cm4gKHdvcmQgPDwgc2hpZnQpIHwgKHdvcmQgPj4gKDY0IC0gc2hpZnQpKTsKK30KKworLyoqCisgKiByb3I2NCAtIHJvdGF0ZSBhIDY0LWJpdCB2YWx1ZSByaWdodAorICogQHdvcmQ6IHZhbHVlIHRvIHJvdGF0ZQorICogQHNoaWZ0OiBiaXRzIHRvIHJvbGwKKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCByb3I2NCh1aW50NjRfdCB3b3JkLCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisgICAgcmV0dXJuICh3b3JkID4+IHNoaWZ0KSB8ICh3b3JkIDw8ICg2NCAtIHNoaWZ0KSk7Cit9CisKKy8qKgorICogZXh0cmFjdDMyOgorICogQHZhbHVlOiB0aGUgdmFsdWUgdG8gZXh0cmFjdCB0aGUgYml0IGZpZWxkIGZyb20KKyAqIEBzdGFydDogdGhlIGxvd2VzdCBiaXQgaW4gdGhlIGJpdCBmaWVsZCAobnVtYmVyZWQgZnJvbSAwKQorICogQGxlbmd0aDogdGhlIGxlbmd0aCBvZiB0aGUgYml0IGZpZWxkCisgKgorICogRXh0cmFjdCBmcm9tIHRoZSAzMiBiaXQgaW5wdXQgQHZhbHVlIHRoZSBiaXQgZmllbGQgc3BlY2lmaWVkIGJ5IHRoZQorICogQHN0YXJ0IGFuZCBAbGVuZ3RoIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gaXQuIFRoZSBiaXQgZmllbGQgbXVzdAorICogbGllIGVudGlyZWx5IHdpdGhpbiB0aGUgMzIgYml0IHdvcmQuIEl0IGlzIHZhbGlkIHRvIHJlcXVlc3QgdGhhdAorICogYWxsIDMyIGJpdHMgYXJlIHJldHVybmVkIChpZSBAbGVuZ3RoIDMyIGFuZCBAc3RhcnQgMCkuCisgKgorICogUmV0dXJuczogdGhlIHZhbHVlIG9mIHRoZSBiaXQgZmllbGQgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGV4dHJhY3QzMih1aW50MzJfdCB2YWx1ZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworICAgIGFzc2VydChzdGFydCA+PSAwICYmIGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDMyIC0gc3RhcnQpOworICAgIHJldHVybiAodmFsdWUgPj4gc3RhcnQpICYgKH4wVSA+PiAoMzIgLSBsZW5ndGgpKTsKK30KKworLyoqCisgKiBleHRyYWN0NjQ6CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBleHRyYWN0IHRoZSBiaXQgZmllbGQgZnJvbQorICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqCisgKiBFeHRyYWN0IGZyb20gdGhlIDY0IGJpdCBpbnB1dCBAdmFsdWUgdGhlIGJpdCBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlCisgKiBAc3RhcnQgYW5kIEBsZW5ndGggcGFyYW1ldGVycywgYW5kIHJldHVybiBpdC4gVGhlIGJpdCBmaWVsZCBtdXN0CisgKiBsaWUgZW50aXJlbHkgd2l0aGluIHRoZSA2NCBiaXQgd29yZC4gSXQgaXMgdmFsaWQgdG8gcmVxdWVzdCB0aGF0CisgKiBhbGwgNjQgYml0cyBhcmUgcmV0dXJuZWQgKGllIEBsZW5ndGggNjQgYW5kIEBzdGFydCAwKS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgdmFsdWUgb2YgdGhlIGJpdCBmaWVsZCBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZXh0cmFjdDY0KHVpbnQ2NF90IHZhbHVlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCit7CisgICAgYXNzZXJ0KHN0YXJ0ID49IDAgJiYgbGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gNjQgLSBzdGFydCk7CisgICAgcmV0dXJuICh2YWx1ZSA+PiBzdGFydCkgJiAofjBVTEwgPj4gKDY0IC0gbGVuZ3RoKSk7Cit9CisKKy8qKgorICogc2V4dHJhY3QzMjoKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGV4dHJhY3QgdGhlIGJpdCBmaWVsZCBmcm9tCisgKiBAc3RhcnQ6IHRoZSBsb3dlc3QgYml0IGluIHRoZSBiaXQgZmllbGQgKG51bWJlcmVkIGZyb20gMCkKKyAqIEBsZW5ndGg6IHRoZSBsZW5ndGggb2YgdGhlIGJpdCBmaWVsZAorICoKKyAqIEV4dHJhY3QgZnJvbSB0aGUgMzIgYml0IGlucHV0IEB2YWx1ZSB0aGUgYml0IGZpZWxkIHNwZWNpZmllZCBieSB0aGUKKyAqIEBzdGFydCBhbmQgQGxlbmd0aCBwYXJhbWV0ZXJzLCBhbmQgcmV0dXJuIGl0LCBzaWduIGV4dGVuZGVkIHRvCisgKiBhbiBpbnQzMl90IChpZSB3aXRoIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgZmllbGQgcHJvcGFnYXRlZAorICogdG8gYWxsIHRoZSB1cHBlciBiaXRzIG9mIHRoZSByZXR1cm4gdmFsdWUpLiBUaGUgYml0IGZpZWxkIG11c3QgbGllCisgKiBlbnRpcmVseSB3aXRoaW4gdGhlIDMyIGJpdCB3b3JkLiBJdCBpcyB2YWxpZCB0byByZXF1ZXN0IHRoYXQKKyAqIGFsbCAzMiBiaXRzIGFyZSByZXR1cm5lZCAoaWUgQGxlbmd0aCAzMiBhbmQgQHN0YXJ0IDApLgorICoKKyAqIFJldHVybnM6IHRoZSBzaWduIGV4dGVuZGVkIHZhbHVlIG9mIHRoZSBiaXQgZmllbGQgZXh0cmFjdGVkIGZyb20gdGhlCisgKiBpbnB1dCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90IHNleHRyYWN0MzIodWludDMyX3QgdmFsdWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkKK3sKKyAgICBhc3NlcnQoc3RhcnQgPj0gMCAmJiBsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAzMiAtIHN0YXJ0KTsKKyAgICAvKiBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gcmlnaHQgc2hpZnQgb2Ygc2lnbmVkCisgICAgICogaW50ZWdlcnMgYmVpbmcgYW4gYXJpdGhtZXRpYyBzaGlmdC4KKyAgICAgKi8KKyAgICByZXR1cm4gKChpbnQzMl90KSh2YWx1ZSA8PCAoMzIgLSBsZW5ndGggLSBzdGFydCkpKSA+PiAoMzIgLSBsZW5ndGgpOworfQorCisvKioKKyAqIHNleHRyYWN0NjQ6CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBleHRyYWN0IHRoZSBiaXQgZmllbGQgZnJvbQorICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqCisgKiBFeHRyYWN0IGZyb20gdGhlIDY0IGJpdCBpbnB1dCBAdmFsdWUgdGhlIGJpdCBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlCisgKiBAc3RhcnQgYW5kIEBsZW5ndGggcGFyYW1ldGVycywgYW5kIHJldHVybiBpdCwgc2lnbiBleHRlbmRlZCB0bworICogYW4gaW50NjRfdCAoaWUgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZpZWxkIHByb3BhZ2F0ZWQKKyAqIHRvIGFsbCB0aGUgdXBwZXIgYml0cyBvZiB0aGUgcmV0dXJuIHZhbHVlKS4gVGhlIGJpdCBmaWVsZCBtdXN0IGxpZQorICogZW50aXJlbHkgd2l0aGluIHRoZSA2NCBiaXQgd29yZC4gSXQgaXMgdmFsaWQgdG8gcmVxdWVzdCB0aGF0CisgKiBhbGwgNjQgYml0cyBhcmUgcmV0dXJuZWQgKGllIEBsZW5ndGggNjQgYW5kIEBzdGFydCAwKS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgc2lnbiBleHRlbmRlZCB2YWx1ZSBvZiB0aGUgYml0IGZpZWxkIGV4dHJhY3RlZCBmcm9tIHRoZQorICogaW5wdXQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2V4dHJhY3Q2NCh1aW50NjRfdCB2YWx1ZSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKQoreworICAgIGFzc2VydChzdGFydCA+PSAwICYmIGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDY0IC0gc3RhcnQpOworICAgIC8qIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiByaWdodCBzaGlmdCBvZiBzaWduZWQKKyAgICAgKiBpbnRlZ2VycyBiZWluZyBhbiBhcml0aG1ldGljIHNoaWZ0LgorICAgICAqLworICAgIHJldHVybiAoKGludDY0X3QpKHZhbHVlIDw8ICg2NCAtIGxlbmd0aCAtIHN0YXJ0KSkpID4+ICg2NCAtIGxlbmd0aCk7Cit9CisKKy8qKgorICogZGVwb3NpdDMyOgorICogQHZhbHVlOiBpbml0aWFsIHZhbHVlIHRvIGluc2VydCBiaXQgZmllbGQgaW50bworICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqIEBmaWVsZHZhbDogdGhlIHZhbHVlIHRvIGluc2VydCBpbnRvIHRoZSBiaXQgZmllbGQKKyAqCisgKiBEZXBvc2l0IEBmaWVsZHZhbCBpbnRvIHRoZSAzMiBiaXQgQHZhbHVlIGF0IHRoZSBiaXQgZmllbGQgc3BlY2lmaWVkCisgKiBieSB0aGUgQHN0YXJ0IGFuZCBAbGVuZ3RoIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gdGhlIG1vZGlmaWVkCisgKiBAdmFsdWUuIEJpdHMgb2YgQHZhbHVlIG91dHNpZGUgdGhlIGJpdCBmaWVsZCBhcmUgbm90IG1vZGlmaWVkLgorICogQml0cyBvZiBAZmllbGR2YWwgYWJvdmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IEBsZW5ndGggYml0cyBhcmUKKyAqIGlnbm9yZWQuIFRoZSBiaXQgZmllbGQgbXVzdCBsaWUgZW50aXJlbHkgd2l0aGluIHRoZSAzMiBiaXQgd29yZC4KKyAqIEl0IGlzIHZhbGlkIHRvIHJlcXVlc3QgdGhhdCBhbGwgMzIgYml0cyBhcmUgbW9kaWZpZWQgKGllIEBsZW5ndGgKKyAqIDMyIGFuZCBAc3RhcnQgMCkuCisgKgorICogUmV0dXJuczogdGhlIG1vZGlmaWVkIEB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkZXBvc2l0MzIodWludDMyX3QgdmFsdWUsIGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpZWxkdmFsKQoreworICAgIHVpbnQzMl90IG1hc2s7CisgICAgYXNzZXJ0KHN0YXJ0ID49IDAgJiYgbGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gMzIgLSBzdGFydCk7CisgICAgbWFzayA9ICh+MFUgPj4gKDMyIC0gbGVuZ3RoKSkgPDwgc3RhcnQ7CisgICAgcmV0dXJuICh2YWx1ZSAmIH5tYXNrKSB8ICgoZmllbGR2YWwgPDwgc3RhcnQpICYgbWFzayk7Cit9CisKKy8qKgorICogZGVwb3NpdDY0OgorICogQHZhbHVlOiBpbml0aWFsIHZhbHVlIHRvIGluc2VydCBiaXQgZmllbGQgaW50bworICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqIEBmaWVsZHZhbDogdGhlIHZhbHVlIHRvIGluc2VydCBpbnRvIHRoZSBiaXQgZmllbGQKKyAqCisgKiBEZXBvc2l0IEBmaWVsZHZhbCBpbnRvIHRoZSA2NCBiaXQgQHZhbHVlIGF0IHRoZSBiaXQgZmllbGQgc3BlY2lmaWVkCisgKiBieSB0aGUgQHN0YXJ0IGFuZCBAbGVuZ3RoIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gdGhlIG1vZGlmaWVkCisgKiBAdmFsdWUuIEJpdHMgb2YgQHZhbHVlIG91dHNpZGUgdGhlIGJpdCBmaWVsZCBhcmUgbm90IG1vZGlmaWVkLgorICogQml0cyBvZiBAZmllbGR2YWwgYWJvdmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IEBsZW5ndGggYml0cyBhcmUKKyAqIGlnbm9yZWQuIFRoZSBiaXQgZmllbGQgbXVzdCBsaWUgZW50aXJlbHkgd2l0aGluIHRoZSA2NCBiaXQgd29yZC4KKyAqIEl0IGlzIHZhbGlkIHRvIHJlcXVlc3QgdGhhdCBhbGwgNjQgYml0cyBhcmUgbW9kaWZpZWQgKGllIEBsZW5ndGgKKyAqIDY0IGFuZCBAc3RhcnQgMCkuCisgKgorICogUmV0dXJuczogdGhlIG1vZGlmaWVkIEB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBkZXBvc2l0NjQodWludDY0X3QgdmFsdWUsIGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZpZWxkdmFsKQoreworICAgIHVpbnQ2NF90IG1hc2s7CisgICAgYXNzZXJ0KHN0YXJ0ID49IDAgJiYgbGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gNjQgLSBzdGFydCk7CisgICAgbWFzayA9ICh+MFVMTCA+PiAoNjQgLSBsZW5ndGgpKSA8PCBzdGFydDsKKyAgICByZXR1cm4gKHZhbHVlICYgfm1hc2spIHwgKChmaWVsZHZhbCA8PCBzdGFydCkgJiBtYXNrKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9ic3dhcC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvYnN3YXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzdiOGUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvYnN3YXAuaApAQCAtMCwwICsxLDQzMSBAQAorI2lmbmRlZiBCU1dBUF9ICisjZGVmaW5lIEJTV0FQX0gKKworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJmcHUvc29mdGZsb2F0LmgiCisKKyNpZmRlZiBDT05GSUdfTUFDSElORV9CU1dBUF9ICisjIGluY2x1ZGUgPHN5cy9lbmRpYW4uaD4KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPG1hY2hpbmUvYnN3YXAuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX0JZVEVTV0FQX0gpCisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYnN3YXAxNih1aW50MTZfdCB4KQoreworICAgIHJldHVybiBic3dhcF8xNih4KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBic3dhcDMyKHVpbnQzMl90IHgpCit7CisgICAgcmV0dXJuIGJzd2FwXzMyKHgpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGJzd2FwNjQodWludDY0X3QgeCkKK3sKKyAgICByZXR1cm4gYnN3YXBfNjQoeCk7Cit9CisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgYnN3YXAxNih1aW50MTZfdCB4KQoreworICAgIHJldHVybiAoKCh4ICYgMHgwMGZmKSA8PCA4KSB8CisgICAgICAgICAgICAoKHggJiAweGZmMDApID4+IDgpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBic3dhcDMyKHVpbnQzMl90IHgpCit7CisgICAgcmV0dXJuICgoKHggJiAweDAwMDAwMGZmVSkgPDwgMjQpIHwKKyAgICAgICAgICAgICgoeCAmIDB4MDAwMGZmMDBVKSA8PCAgOCkgfAorICAgICAgICAgICAgKCh4ICYgMHgwMGZmMDAwMFUpID4+ICA4KSB8CisgICAgICAgICAgICAoKHggJiAweGZmMDAwMDAwVSkgPj4gMjQpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBic3dhcDY0KHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuICgoKHggJiAweDAwMDAwMDAwMDAwMDAwZmZVTEwpIDw8IDU2KSB8CisgICAgICAgICAgICAoKHggJiAweDAwMDAwMDAwMDAwMGZmMDBVTEwpIDw8IDQwKSB8CisgICAgICAgICAgICAoKHggJiAweDAwMDAwMDAwMDBmZjAwMDBVTEwpIDw8IDI0KSB8CisgICAgICAgICAgICAoKHggJiAweDAwMDAwMDAwZmYwMDAwMDBVTEwpIDw8ICA4KSB8CisgICAgICAgICAgICAoKHggJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+ICA4KSB8CisgICAgICAgICAgICAoKHggJiAweDAwMDBmZjAwMDAwMDAwMDBVTEwpID4+IDI0KSB8CisgICAgICAgICAgICAoKHggJiAweDAwZmYwMDAwMDAwMDAwMDBVTEwpID4+IDQwKSB8CisgICAgICAgICAgICAoKHggJiAweGZmMDAwMDAwMDAwMDAwMDBVTEwpID4+IDU2KSk7Cit9CisjZW5kaWYgLyogISBDT05GSUdfTUFDSElORV9CU1dBUF9IICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBic3dhcDE2cyh1aW50MTZfdCAqcykKK3sKKyAgICAqcyA9IGJzd2FwMTYoKnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnN3YXAzMnModWludDMyX3QgKnMpCit7CisgICAgKnMgPSBic3dhcDMyKCpzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJzd2FwNjRzKHVpbnQ2NF90ICpzKQoreworICAgICpzID0gYnN3YXA2NCgqcyk7Cit9CisKKyNpZiBkZWZpbmVkKEhPU1RfV09SRFNfQklHRU5ESUFOKQorI2RlZmluZSBiZV9ic3dhcCh2LCBzaXplKSAodikKKyNkZWZpbmUgbGVfYnN3YXAodiwgc2l6ZSkgZ2x1ZShic3dhcCwgc2l6ZSkodikKKyNkZWZpbmUgYmVfYnN3YXBzKHYsIHNpemUpCisjZGVmaW5lIGxlX2Jzd2FwcyhwLCBzaXplKSBkbyB7ICpwID0gZ2x1ZShic3dhcCwgc2l6ZSkoKnApOyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBsZV9ic3dhcCh2LCBzaXplKSAodikKKyNkZWZpbmUgYmVfYnN3YXAodiwgc2l6ZSkgZ2x1ZShic3dhcCwgc2l6ZSkodikKKyNkZWZpbmUgbGVfYnN3YXBzKHYsIHNpemUpCisjZGVmaW5lIGJlX2Jzd2FwcyhwLCBzaXplKSBkbyB7ICpwID0gZ2x1ZShic3dhcCwgc2l6ZSkoKnApOyB9IHdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBDUFVfQ09OVkVSVChlbmRpYW4sIHNpemUsIHR5cGUpXAorc3RhdGljIGlubGluZSB0eXBlIGVuZGlhbiAjIyBzaXplICMjIF90b19jcHUodHlwZSB2KVwKK3tcCisgICAgcmV0dXJuIGdsdWUoZW5kaWFuLCBfYnN3YXApKHYsIHNpemUpO1wKK31cCitcCitzdGF0aWMgaW5saW5lIHR5cGUgY3B1X3RvXyAjIyBlbmRpYW4gIyMgc2l6ZSh0eXBlIHYpXAore1wKKyAgICByZXR1cm4gZ2x1ZShlbmRpYW4sIF9ic3dhcCkodiwgc2l6ZSk7XAorfVwKK1wKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmRpYW4gIyMgc2l6ZSAjIyBfdG9fY3B1cyh0eXBlICpwKVwKK3tcCisgICAgZ2x1ZShlbmRpYW4sIF9ic3dhcHMpKHAsIHNpemUpO1wKK31cCitcCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3RvXyAjIyBlbmRpYW4gIyMgc2l6ZSAjIyBzKHR5cGUgKnApXAore1wKKyAgICBnbHVlKGVuZGlhbiwgX2Jzd2FwcykocCwgc2l6ZSk7XAorfVwKK1wKK3N0YXRpYyBpbmxpbmUgdHlwZSBlbmRpYW4gIyMgc2l6ZSAjIyBfdG9fY3B1cChjb25zdCB0eXBlICpwKVwKK3tcCisgICAgcmV0dXJuIGdsdWUoZ2x1ZShlbmRpYW4sIHNpemUpLCBfdG9fY3B1KSgqcCk7XAorfVwKK1wKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfdG9fICMjIGVuZGlhbiAjIyBzaXplICMjIHcodHlwZSAqcCwgdHlwZSB2KVwKK3tcCisgICAgKnAgPSBnbHVlKGdsdWUoY3B1X3RvXywgZW5kaWFuKSwgc2l6ZSkodik7XAorfQorCitDUFVfQ09OVkVSVChiZSwgMTYsIHVpbnQxNl90KQorQ1BVX0NPTlZFUlQoYmUsIDMyLCB1aW50MzJfdCkKK0NQVV9DT05WRVJUKGJlLCA2NCwgdWludDY0X3QpCisKK0NQVV9DT05WRVJUKGxlLCAxNiwgdWludDE2X3QpCitDUFVfQ09OVkVSVChsZSwgMzIsIHVpbnQzMl90KQorQ1BVX0NPTlZFUlQobGUsIDY0LCB1aW50NjRfdCkKKworLyogbGVuIG11c3QgYmUgb25lIG9mIDEsIDIsIDQgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcWVtdV9ic3dhcF9sZW4odWludDMyX3QgdmFsdWUsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGJzd2FwMzIodmFsdWUpID4+ICgzMiAtIDggKiBsZW4pOworfQorCisvKiBVbmlvbnMgZm9yIHJlaW50ZXJwcmV0aW5nIGJldHdlZW4gZmxvYXRzIGFuZCBpbnRlZ2Vycy4gICovCisKK3R5cGVkZWYgdW5pb24geworICAgIGZsb2F0MzIgZjsKKyAgICB1aW50MzJfdCBsOworfSBDUFVfRmxvYXRVOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBmbG9hdDY0IGQ7CisjaWYgZGVmaW5lZChIT1NUX1dPUkRTX0JJR0VORElBTikKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCB1cHBlcjsKKyAgICAgICAgdWludDMyX3QgbG93ZXI7CisgICAgfSBsOworI2Vsc2UKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBsb3dlcjsKKyAgICAgICAgdWludDMyX3QgdXBwZXI7CisgICAgfSBsOworI2VuZGlmCisgICAgdWludDY0X3QgbGw7Cit9IENQVV9Eb3VibGVVOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICAgZmxvYXR4ODAgZDsKKyAgICAgc3RydWN0IHsKKyAgICAgICAgIHVpbnQ2NF90IGxvd2VyOworICAgICAgICAgdWludDE2X3QgdXBwZXI7CisgICAgIH0gbDsKK30gQ1BVX0xEb3VibGVVOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBmbG9hdDEyOCBxOworI2lmIGRlZmluZWQoSE9TVF9XT1JEU19CSUdFTkRJQU4pCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDMyX3QgdXBtb3N0OworICAgICAgICB1aW50MzJfdCB1cHBlcjsKKyAgICAgICAgdWludDMyX3QgbG93ZXI7CisgICAgICAgIHVpbnQzMl90IGxvd2VzdDsKKyAgICB9IGw7CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDY0X3QgdXBwZXI7CisgICAgICAgIHVpbnQ2NF90IGxvd2VyOworICAgIH0gbGw7CisjZWxzZQorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IGxvd2VzdDsKKyAgICAgICAgdWludDMyX3QgbG93ZXI7CisgICAgICAgIHVpbnQzMl90IHVwcGVyOworICAgICAgICB1aW50MzJfdCB1cG1vc3Q7CisgICAgfSBsOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IGxvd2VyOworICAgICAgICB1aW50NjRfdCB1cHBlcjsKKyAgICB9IGxsOworI2VuZGlmCit9IENQVV9RdWFkVTsKKworLyogdW5hbGlnbmVkL2VuZGlhbi1pbmRlcGVuZGVudCBwb2ludGVyIGFjY2VzcyAqLworCisvKgorICogdGhlIGdlbmVyaWMgc3ludGF4IGlzOgorICoKKyAqIGxvYWQ6IGxke3R5cGV9e3NpZ259e3NpemV9e2VuZGlhbn1fcChwdHIpCisgKgorICogc3RvcmU6IHN0e3R5cGV9e3NpemV9e2VuZGlhbn1fcChwdHIsIHZhbCkKKyAqCisgKiBOb3RlIHRoZXJlIGFyZSBzbWFsbCBkaWZmZXJlbmNlcyB3aXRoIHRoZSBzb2Z0bW11IGFjY2VzcyBBUEkhCisgKgorICogdHlwZSBpczoKKyAqIChlbXB0eSk6IGludGVnZXIgYWNjZXNzCisgKiAgIGYgICAgOiBmbG9hdCBhY2Nlc3MKKyAqCisgKiBzaWduIGlzOgorICogKGVtcHR5KTogZm9yIGZsb2F0cyBvciAzMiBiaXQgc2l6ZQorICogICB1ICAgIDogdW5zaWduZWQKKyAqICAgcyAgICA6IHNpZ25lZAorICoKKyAqIHNpemUgaXM6CisgKiAgIGI6IDggYml0cworICogICB3OiAxNiBiaXRzCisgKiAgIGw6IDMyIGJpdHMKKyAqICAgcTogNjQgYml0cworICoKKyAqIGVuZGlhbiBpczoKKyAqIChlbXB0eSk6IGhvc3QgZW5kaWFuCisgKiAgIGJlICAgOiBiaWcgZW5kaWFuCisgKiAgIGxlICAgOiBsaXR0bGUgZW5kaWFuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGR1Yl9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gKih1aW50OF90ICopcHRyOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZHNiX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHJldHVybiAqKGludDhfdCAqKXB0cjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0Yl9wKHZvaWQgKnB0ciwgaW50IHYpCit7CisgICAgKih1aW50OF90ICopcHRyID0gdjsKK30KKworLyogQW55IGNvbXBpbGVyIHdvcnRoIGl0cyBzYWx0IHdpbGwgdHVybiB0aGVzZSBtZW1jcHkgaW50byBuYXRpdmUgdW5hbGlnbmVkCisgICBvcGVyYXRpb25zLiAgVGh1cyB3ZSBkb24ndCBuZWVkIHRvIHBsYXkgZ2FtZXMgd2l0aCBwYWNrZWQgYXR0cmlidXRlcywgb3IKKyAgIGlubGluZSBieXRlLWJ5LWJ5dGUgc3RvcmVzLiAgKi8KKworc3RhdGljIGlubGluZSBpbnQgbGR1d19wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICB1aW50MTZfdCByOworICAgIG1lbWNweSgmciwgcHRyLCBzaXplb2YocikpOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZHN3X3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIGludDE2X3QgcjsKKyAgICBtZW1jcHkoJnIsIHB0ciwgc2l6ZW9mKHIpKTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0d19wKHZvaWQgKnB0ciwgdWludDE2X3QgdikKK3sKKyAgICBtZW1jcHkocHRyLCAmdiwgc2l6ZW9mKHYpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGRsX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIGludDMyX3QgcjsKKyAgICBtZW1jcHkoJnIsIHB0ciwgc2l6ZW9mKHIpKTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0bF9wKHZvaWQgKnB0ciwgdWludDMyX3QgdikKK3sKKyAgICBtZW1jcHkocHRyLCAmdiwgc2l6ZW9mKHYpKTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBsZHFfcChjb25zdCB2b2lkICpwdHIpCit7CisgICAgdWludDY0X3QgcjsKKyAgICBtZW1jcHkoJnIsIHB0ciwgc2l6ZW9mKHIpKTsKKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0cV9wKHZvaWQgKnB0ciwgdWludDY0X3QgdikKK3sKKyAgICBtZW1jcHkocHRyLCAmdiwgc2l6ZW9mKHYpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGR1d19sZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gKHVpbnQxNl90KWxlX2Jzd2FwKGxkdXdfcChwdHIpLCAxNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxkc3dfbGVfcChjb25zdCB2b2lkICpwdHIpCit7CisgICAgcmV0dXJuIChpbnQxNl90KWxlX2Jzd2FwKGxkdXdfcChwdHIpLCAxNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxkbF9sZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gbGVfYnN3YXAobGRsX3AocHRyKSwgMzIpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGxkcV9sZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gbGVfYnN3YXAobGRxX3AocHRyKSwgNjQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3R3X2xlX3Aodm9pZCAqcHRyLCBpbnQgdikKK3sKKyAgICBzdHdfcChwdHIsIGxlX2Jzd2FwKHYsIDE2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGxfbGVfcCh2b2lkICpwdHIsIGludCB2KQoreworICAgIHN0bF9wKHB0ciwgbGVfYnN3YXAodiwgMzIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0cV9sZV9wKHZvaWQgKnB0ciwgdWludDY0X3QgdikKK3sKKyAgICBzdHFfcChwdHIsIGxlX2Jzd2FwKHYsIDY0KSk7Cit9CisKKy8qIGZsb2F0IGFjY2VzcyAqLworCitzdGF0aWMgaW5saW5lIGZsb2F0MzIgbGRmbF9sZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICBDUFVfRmxvYXRVIHU7CisgICAgdS5sID0gbGRsX2xlX3AocHRyKTsKKyAgICByZXR1cm4gdS5mOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RmbF9sZV9wKHZvaWQgKnB0ciwgZmxvYXQzMiB2KQoreworICAgIENQVV9GbG9hdFUgdTsKKyAgICB1LmYgPSB2OworICAgIHN0bF9sZV9wKHB0ciwgdS5sKTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdDY0IGxkZnFfbGVfcChjb25zdCB2b2lkICpwdHIpCit7CisgICAgQ1BVX0RvdWJsZVUgdTsKKyAgICB1LmxsID0gbGRxX2xlX3AocHRyKTsKKyAgICByZXR1cm4gdS5kOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RmcV9sZV9wKHZvaWQgKnB0ciwgZmxvYXQ2NCB2KQoreworICAgIENQVV9Eb3VibGVVIHU7CisgICAgdS5kID0gdjsKKyAgICBzdHFfbGVfcChwdHIsIHUubGwpOworfQorCitzdGF0aWMgaW5saW5lIGludCBsZHV3X2JlX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHJldHVybiAodWludDE2X3QpYmVfYnN3YXAobGR1d19wKHB0ciksIDE2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGRzd19iZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICByZXR1cm4gKGludDE2X3QpYmVfYnN3YXAobGR1d19wKHB0ciksIDE2KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGRsX2JlX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHJldHVybiBiZV9ic3dhcChsZGxfcChwdHIpLCAzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgbGRxX2JlX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIHJldHVybiBiZV9ic3dhcChsZHFfcChwdHIpLCA2NCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHdfYmVfcCh2b2lkICpwdHIsIGludCB2KQoreworICAgIHN0d19wKHB0ciwgYmVfYnN3YXAodiwgMTYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0bF9iZV9wKHZvaWQgKnB0ciwgaW50IHYpCit7CisgICAgc3RsX3AocHRyLCBiZV9ic3dhcCh2LCAzMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RxX2JlX3Aodm9pZCAqcHRyLCB1aW50NjRfdCB2KQoreworICAgIHN0cV9wKHB0ciwgYmVfYnN3YXAodiwgNjQpKTsKK30KKworLyogZmxvYXQgYWNjZXNzICovCisKK3N0YXRpYyBpbmxpbmUgZmxvYXQzMiBsZGZsX2JlX3AoY29uc3Qgdm9pZCAqcHRyKQoreworICAgIENQVV9GbG9hdFUgdTsKKyAgICB1LmwgPSBsZGxfYmVfcChwdHIpOworICAgIHJldHVybiB1LmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGZsX2JlX3Aodm9pZCAqcHRyLCBmbG9hdDMyIHYpCit7CisgICAgQ1BVX0Zsb2F0VSB1OworICAgIHUuZiA9IHY7CisgICAgc3RsX2JlX3AocHRyLCB1LmwpOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0NjQgbGRmcV9iZV9wKGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICBDUFVfRG91YmxlVSB1OworICAgIHUubGwgPSBsZHFfYmVfcChwdHIpOworICAgIHJldHVybiB1LmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGZxX2JlX3Aodm9pZCAqcHRyLCBmbG9hdDY0IHYpCit7CisgICAgQ1BVX0RvdWJsZVUgdTsKKyAgICB1LmQgPSB2OworICAgIHN0cV9iZV9wKHB0ciwgdS5sbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsZXVsX3RvX2NwdSh1bnNpZ25lZCBsb25nIHYpCit7CisgICAgLyogSW4gb3JkZXIgdG8gYnJlYWsgYW4gaW5jbHVkZSBsb29wIGJldHdlZW4gaGVyZSBhbmQKKyAgICAgICBxZW11LWNvbW1vbi5oLCBkb24ndCByZWx5IG9uIEhPU1RfTE9OR19CSVRTLiAgKi8KKyNpZiBVTE9OR19NQVggPT0gVUlOVDMyX01BWAorICAgIHJldHVybiBsZV9ic3dhcCh2LCAzMik7CisjZWxpZiBVTE9OR19NQVggPT0gVUlOVDY0X01BWAorICAgIHJldHVybiBsZV9ic3dhcCh2LCA2NCk7CisjZWxzZQorIyBlcnJvciBVbmtub3duIHNpemVvZiBsb25nCisjZW5kaWYKK30KKworI3VuZGVmIGxlX2Jzd2FwCisjdW5kZWYgYmVfYnN3YXAKKyN1bmRlZiBsZV9ic3dhcHMKKyN1bmRlZiBiZV9ic3dhcHMKKworI2VuZGlmIC8qIEJTV0FQX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NhY2hlLXV0aWxzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9jYWNoZS11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTI0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9jYWNoZS11dGlscy5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgUUVNVV9DQUNIRV9VVElMU19ICisjZGVmaW5lIFFFTVVfQ0FDSEVfVVRJTFNfSAorCisjaWYgZGVmaW5lZChfQVJDSF9QUEMpCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4gLyogdWludHB0cl90ICovCisKK3N0cnVjdCBxZW11X2NhY2hlX2NvbmYgeworICAgIHVuc2lnbmVkIGxvbmcgZGNhY2hlX2JzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaWNhY2hlX2JzaXplOworfTsKKworZXh0ZXJuIHN0cnVjdCBxZW11X2NhY2hlX2NvbmYgcWVtdV9jYWNoZV9jb25mOworCit2b2lkIHFlbXVfY2FjaGVfdXRpbHNfaW5pdCh2b2lkKTsKKworLyogbWlsZGx5IGFkanVzdGVkIGNvZGUgZnJvbSB0Y2ctZHluZ2VuLmMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3Qgc3RvcCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHAsIHN0YXJ0MSwgc3RvcDE7CisgICAgdW5zaWduZWQgbG9uZyBkc2l6ZSA9IHFlbXVfY2FjaGVfY29uZi5kY2FjaGVfYnNpemU7CisgICAgdW5zaWduZWQgbG9uZyBpc2l6ZSA9IHFlbXVfY2FjaGVfY29uZi5pY2FjaGVfYnNpemU7CisKKyAgICBzdGFydDEgPSBzdGFydCAmIH4oZHNpemUgLSAxKTsKKyAgICBzdG9wMSA9IChzdG9wICsgZHNpemUgLSAxKSAmIH4oZHNpemUgLSAxKTsKKyAgICBmb3IgKHAgPSBzdGFydDE7IHAgPCBzdG9wMTsgcCArPSBkc2l6ZSkgeworICAgICAgICBhc20gdm9sYXRpbGUgKCJkY2JzdCAwLCUwIiA6IDogInIiKHApIDogIm1lbW9yeSIpOworICAgIH0KKyAgICBhc20gdm9sYXRpbGUgKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7CisKKyAgICBzdGFydCAmPSBzdGFydCAmIH4oaXNpemUgLSAxKTsKKyAgICBzdG9wMSA9IChzdG9wICsgaXNpemUgLSAxKSAmIH4oaXNpemUgLSAxKTsKKyAgICBmb3IgKHAgPSBzdGFydDE7IHAgPCBzdG9wMTsgcCArPSBpc2l6ZSkgeworICAgICAgICBhc20gdm9sYXRpbGUgKCJpY2JpIDAsJTAiIDogOiAiciIocCkgOiAibWVtb3J5Iik7CisgICAgfQorICAgIGFzbSB2b2xhdGlsZSAoInN5bmMiIDogOiA6ICJtZW1vcnkiKTsKKyAgICBhc20gdm9sYXRpbGUgKCJpc3luYyIgOiA6IDogIm1lbW9yeSIpOworfQorCisjZWxzZQorI2RlZmluZSBxZW11X2NhY2hlX3V0aWxzX2luaXQoKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmIC8qIFFFTVVfQ0FDSEVfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvY29tcGF0ZmQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbXBhdGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwNDg3NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbXBhdGZkLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIHNpZ25hbGZkL2V2ZW50ZmQgY29tcGF0aWJpbGl0eQorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX0NPTVBBVEZEX0gKKyNkZWZpbmUgUUVNVV9DT01QQVRGRF9ICisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworc3RydWN0IHFlbXVfc2lnbmFsZmRfc2lnaW5mbyB7CisgICAgdWludDMyX3Qgc3NpX3NpZ25vOyAgIC8qIFNpZ25hbCBudW1iZXIgKi8KKyAgICBpbnQzMl90ICBzc2lfZXJybm87ICAgLyogRXJyb3IgbnVtYmVyICh1bnVzZWQpICovCisgICAgaW50MzJfdCAgc3NpX2NvZGU7ICAgIC8qIFNpZ25hbCBjb2RlICovCisgICAgdWludDMyX3Qgc3NpX3BpZDsgICAgIC8qIFBJRCBvZiBzZW5kZXIgKi8KKyAgICB1aW50MzJfdCBzc2lfdWlkOyAgICAgLyogUmVhbCBVSUQgb2Ygc2VuZGVyICovCisgICAgaW50MzJfdCAgc3NpX2ZkOyAgICAgIC8qIEZpbGUgZGVzY3JpcHRvciAoU0lHSU8pICovCisgICAgdWludDMyX3Qgc3NpX3RpZDsgICAgIC8qIEtlcm5lbCB0aW1lciBJRCAoUE9TSVggdGltZXJzKSAqLworICAgIHVpbnQzMl90IHNzaV9iYW5kOyAgICAvKiBCYW5kIGV2ZW50IChTSUdJTykgKi8KKyAgICB1aW50MzJfdCBzc2lfb3ZlcnJ1bjsgLyogUE9TSVggdGltZXIgb3ZlcnJ1biBjb3VudCAqLworICAgIHVpbnQzMl90IHNzaV90cmFwbm87ICAvKiBUcmFwIG51bWJlciB0aGF0IGNhdXNlZCBzaWduYWwgKi8KKyAgICBpbnQzMl90ICBzc2lfc3RhdHVzOyAgLyogRXhpdCBzdGF0dXMgb3Igc2lnbmFsIChTSUdDSExEKSAqLworICAgIGludDMyX3QgIHNzaV9pbnQ7ICAgICAvKiBJbnRlZ2VyIHNlbnQgYnkgc2lncXVldWUoMikgKi8KKyAgICB1aW50NjRfdCBzc2lfcHRyOyAgICAgLyogUG9pbnRlciBzZW50IGJ5IHNpZ3F1ZXVlKDIpICovCisgICAgdWludDY0X3Qgc3NpX3V0aW1lOyAgIC8qIFVzZXIgQ1BVIHRpbWUgY29uc3VtZWQgKFNJR0NITEQpICovCisgICAgdWludDY0X3Qgc3NpX3N0aW1lOyAgIC8qIFN5c3RlbSBDUFUgdGltZSBjb25zdW1lZCAoU0lHQ0hMRCkgKi8KKyAgICB1aW50NjRfdCBzc2lfYWRkcjsgICAgLyogQWRkcmVzcyB0aGF0IGdlbmVyYXRlZCBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBoYXJkd2FyZS1nZW5lcmF0ZWQgc2lnbmFscykgKi8KKyAgICB1aW50OF90ICBwYWRbNDhdOyAgICAgLyogUGFkIHNpemUgdG8gMTI4IGJ5dGVzIChhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBmaWVsZHMgaW4gdGhlIGZ1dHVyZSkgKi8KK307CisKK2ludCBxZW11X3NpZ25hbGZkKGNvbnN0IHNpZ3NldF90ICptYXNrKTsKK2Jvb2wgcWVtdV9zaWduYWxmZF9hdmFpbGFibGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvY29tcGlsZXIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YjM1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbXBpbGVyLmgKQEAgLTAsMCArMSw1NSBAQAorLyogcHVibGljIGRvbWFpbiAqLworCisjaWZuZGVmIENPTVBJTEVSX0gKKyNkZWZpbmUgQ09NUElMRVJfSAorCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit8IFRoZSBtYWNybyBRRU1VX0dOVUNfUFJFUkVRIHRlc3RzIGZvciBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIEdOVSBDIGNvbXBpbGVyLgorfCBUaGUgY29kZSBpcyBhIGNvcHkgb2YgU09GVEZMT0FUX0dOVUNfUFJFUkVRLCBzZWUgc29mdGZsb2F0LW1hY3Jvcy5oLgorKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTlVDX01JTk9SX18pCisjIGRlZmluZSBRRU1VX0dOVUNfUFJFUkVRKG1haiwgbWluKSBcCisgICAgICAgICAoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjIGRlZmluZSBRRU1VX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworI2RlZmluZSBRRU1VX05PUkVUVVJOIF9fYXR0cmlidXRlX18gKChfX25vcmV0dXJuX18pKQorCisjaWYgUUVNVV9HTlVDX1BSRVJFUSgzLCA0KQorI2RlZmluZSBRRU1VX1dBUk5fVU5VU0VEX1JFU1VMVCBfX2F0dHJpYnV0ZV9fKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorI2Vsc2UKKyNkZWZpbmUgUUVNVV9XQVJOX1VOVVNFRF9SRVNVTFQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjIGRlZmluZSBRRU1VX1BBQ0tFRCBfX2F0dHJpYnV0ZV9fKChnY2Nfc3RydWN0LCBwYWNrZWQpKQorI2Vsc2UKKyMgZGVmaW5lIFFFTVVfUEFDS0VEIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisjZW5kaWYKKworI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKKyNkZWZpbmUgY2F0Mih4LHkpIGNhdCh4LHkpCisjZGVmaW5lIFFFTVVfQlVJTERfQlVHX09OKHgpIFwKKyAgICB0eXBlZGVmIGNoYXIgY2F0MihxZW11X2J1aWxkX2J1Z19vbl9fLF9fTElORV9fKVsoeCk/LTE6MV0gX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CisKKyNpZiBkZWZpbmVkIF9fR05VQ19fCisjIGlmICFRRU1VX0dOVUNfUFJFUkVRKDQsIDQpCisgICAvKiBnY2MgdmVyc2lvbnMgYmVmb3JlIDQuNC54IGRvbid0IHN1cHBvcnQgZ251X3ByaW50Ziwgc28gdXNlIHByaW50Zi4gKi8KKyMgIGRlZmluZSBHQ0NfRk1UX0FUVFIobiwgbSkgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgbiwgbSkpKQorIyBlbHNlCisgICAvKiBVc2UgZ251X3ByaW50ZiB3aGVuIHN1cHBvcnRlZCAocWVtdSB1c2VzIHN0YW5kYXJkIGZvcm1hdCBzdHJpbmdzKS4gKi8KKyMgIGRlZmluZSBHQ0NfRk1UX0FUVFIobiwgbSkgX19hdHRyaWJ1dGVfXygoZm9ybWF0KGdudV9wcmludGYsIG4sIG0pKSkKKyMgIGlmIGRlZmluZWQoX1dJTjMyKQorICAgIC8qIE1hcCBfX3ByaW50Zl9fIHRvIF9fZ251X3ByaW50Zl9fIGJlY2F1c2Ugd2Ugd2FudCBzdGFuZGFyZCBmb3JtYXQgc3RyaW5ncworICAgICAqIGV2ZW4gd2hlbiBNaW5HVyBvciBHTGliIGluY2x1ZGUgZmlsZXMgdXNlIF9fcHJpbnRmX18uICovCisjICAgZGVmaW5lIF9fcHJpbnRmX18gX19nbnVfcHJpbnRmX18KKyMgIGVuZGlmCisjIGVuZGlmCisjZWxzZQorI2RlZmluZSBHQ0NfRk1UX0FUVFIobiwgbSkKKyNlbmRpZgorCisjZW5kaWYgLyogQ09NUElMRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvY29uZmlnLWZpbGUuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbmZpZy1maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkNzA3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2NvbmZpZy1maWxlLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBRRU1VX0NPTkZJR19ICisjZGVmaW5lIFFFTVVfQ09ORklHX0gKKworZXh0ZXJuIFFlbXVPcHRzTGlzdCBxZW11X2ZzZGV2X29wdHM7CitleHRlcm4gUWVtdU9wdHNMaXN0IHFlbXVfdmlydGZzX29wdHM7CitleHRlcm4gUWVtdU9wdHNMaXN0IHFlbXVfc3BpY2Vfb3B0czsKKworUWVtdU9wdHNMaXN0ICpxZW11X2ZpbmRfb3B0cyhjb25zdCBjaGFyICpncm91cCk7Cit2b2lkIHFlbXVfYWRkX29wdHMoUWVtdU9wdHNMaXN0ICpsaXN0KTsKK2ludCBxZW11X3NldF9vcHRpb24oY29uc3QgY2hhciAqc3RyKTsKK2ludCBxZW11X2dsb2JhbF9vcHRpb24oY29uc3QgY2hhciAqc3RyKTsKK3ZvaWQgcWVtdV9hZGRfZ2xvYmFscyh2b2lkKTsKKwordm9pZCBxZW11X2NvbmZpZ193cml0ZShGSUxFICpmcCk7CitpbnQgcWVtdV9jb25maWdfcGFyc2UoRklMRSAqZnAsIFFlbXVPcHRzTGlzdCAqKmxpc3RzLCBjb25zdCBjaGFyICpmbmFtZSk7CisKK2ludCBxZW11X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworCisjZW5kaWYgLyogUUVNVV9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvZW52bGlzdC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvZW52bGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YWRkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9lbnZsaXN0LmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBFTlZMSVNUX0gKKyNkZWZpbmUgRU5WTElTVF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgZW52bGlzdCBlbnZsaXN0X3Q7CisKK2Vudmxpc3RfdCAqZW52bGlzdF9jcmVhdGUodm9pZCk7Cit2b2lkIGVudmxpc3RfZnJlZShlbnZsaXN0X3QgKik7CitpbnQgZW52bGlzdF9zZXRlbnYoZW52bGlzdF90ICosIGNvbnN0IGNoYXIgKik7CitpbnQgZW52bGlzdF91bnNldGVudihlbnZsaXN0X3QgKiwgY29uc3QgY2hhciAqKTsKK2ludCBlbnZsaXN0X3BhcnNlX3NldChlbnZsaXN0X3QgKiwgY29uc3QgY2hhciAqKTsKK2ludCBlbnZsaXN0X3BhcnNlX3Vuc2V0KGVudmxpc3RfdCAqLCBjb25zdCBjaGFyICopOworY2hhciAqKmVudmxpc3RfdG9fZW52aXJvbihjb25zdCBlbnZsaXN0X3QgKiwgc2l6ZV90ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogRU5WTElTVF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9lcnJvci1yZXBvcnQuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2Vycm9yLXJlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDk4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9lcnJvci1yZXBvcnQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogRXJyb3IgcmVwb3J0aW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTWFya3VzIEFybWJydXN0ZXIgPGFybWJydUByZWRoYXQuY29tPiwKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaWZuZGVmIFFFTVVfRVJST1JfSAorI2RlZmluZSBRRU1VX0VSUk9SX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJxZW11L2NvbXBpbGVyLmgiCisKK3R5cGVkZWYgc3RydWN0IExvY2F0aW9uIHsKKyAgICAvKiBhbGwgbWVtYmVycyBhcmUgcHJpdmF0ZSB0byBxZW11LWVycm9yLmMgKi8KKyAgICBlbnVtIHsgTE9DX05PTkUsIExPQ19DTURMSU5FLCBMT0NfRklMRSB9IGtpbmQ7CisgICAgaW50IG51bTsKKyAgICBjb25zdCB2b2lkICpwdHI7CisgICAgc3RydWN0IExvY2F0aW9uICpwcmV2OworfSBMb2NhdGlvbjsKKworTG9jYXRpb24gKmxvY19wdXNoX3Jlc3RvcmUoTG9jYXRpb24gKmxvYyk7CitMb2NhdGlvbiAqbG9jX3B1c2hfbm9uZShMb2NhdGlvbiAqbG9jKTsKK0xvY2F0aW9uICpsb2NfcG9wKExvY2F0aW9uICpsb2MpOworTG9jYXRpb24gKmxvY19zYXZlKExvY2F0aW9uICpsb2MpOwordm9pZCBsb2NfcmVzdG9yZShMb2NhdGlvbiAqbG9jKTsKK3ZvaWQgbG9jX3NldF9ub25lKHZvaWQpOwordm9pZCBsb2Nfc2V0X2NtZGxpbmUoY2hhciAqKmFyZ3YsIGludCBpZHgsIGludCBjbnQpOwordm9pZCBsb2Nfc2V0X2ZpbGUoY29uc3QgY2hhciAqZm5hbWUsIGludCBsbm8pOworCit2b2lkIGVycm9yX3ZwcmludGYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKSBHQ0NfRk1UX0FUVFIoMSwgMCk7Cit2b2lkIGVycm9yX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikgR0NDX0ZNVF9BVFRSKDEsIDIpOwordm9pZCBlcnJvcl9wcmludGZfdW5sZXNzX3FtcChjb25zdCBjaGFyICpmbXQsIC4uLikgR0NDX0ZNVF9BVFRSKDEsIDIpOwordm9pZCBlcnJvcl9wcmludF9sb2Modm9pZCk7Cit2b2lkIGVycm9yX3NldF9wcm9nbmFtZShjb25zdCBjaGFyICphcmd2MCk7Cit2b2lkIGVycm9yX3JlcG9ydChjb25zdCBjaGFyICpmbXQsIC4uLikgR0NDX0ZNVF9BVFRSKDEsIDIpOworY29uc3QgY2hhciAqZXJyb3JfZ2V0X3Byb2duYW1lKHZvaWQpOworZXh0ZXJuIGJvb2wgZW5hYmxlX3RpbWVzdGFtcF9tc2c7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaG9zdC11dGlscy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaG9zdC11dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNjg4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9ob3N0LXV0aWxzLmgKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBVdGlsaXR5IGNvbXB1dGUgb3BlcmF0aW9ucyB1c2VkIGJ5IHRyYW5zbGF0ZWQgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhpZW1vIFNldWZlcgorICogQ29weXJpZ2h0IChjKSAyMDA3IEpvY2VseW4gTWF5ZXIKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgSE9TVF9VVElMU19ICisjZGVmaW5lIEhPU1RfVVRJTFNfSCAxCisKKyNpbmNsdWRlICJxZW11L2NvbXBpbGVyLmgiICAgLyogUUVNVV9HTlVDX1BSRVJFUSAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZkZWYgQ09ORklHX0lOVDEyOAorc3RhdGljIGlubGluZSB2b2lkIG11bHU2NCh1aW50NjRfdCAqcGxvdywgdWludDY0X3QgKnBoaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIF9fdWludDEyOF90IHIgPSAoX191aW50MTI4X3QpYSAqIGI7CisgICAgKnBsb3cgPSByOworICAgICpwaGlnaCA9IHIgPj4gNjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdWxzNjQodWludDY0X3QgKnBsb3csIHVpbnQ2NF90ICpwaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBhLCBpbnQ2NF90IGIpCit7CisgICAgX19pbnQxMjhfdCByID0gKF9faW50MTI4X3QpYSAqIGI7CisgICAgKnBsb3cgPSByOworICAgICpwaGlnaCA9IHIgPj4gNjQ7Cit9CisjZWxzZQordm9pZCBtdWxzNjQodWludDY0X3QgKnBoaWdoLCB1aW50NjRfdCAqcGxvdywgaW50NjRfdCBhLCBpbnQ2NF90IGIpOwordm9pZCBtdWx1NjQodWludDY0X3QgKnBoaWdoLCB1aW50NjRfdCAqcGxvdywgdWludDY0X3QgYSwgdWludDY0X3QgYik7CisjZW5kaWYKKworLyoqCisgKiBjbHozMiAtIGNvdW50IGxlYWRpbmcgemVyb3MgaW4gYSAzMi1iaXQgdmFsdWUuCisgKiBAdmFsOiBUaGUgdmFsdWUgdG8gc2VhcmNoCisgKgorICogUmV0dXJucyAzMiBpZiB0aGUgdmFsdWUgaXMgemVyby4gIE5vdGUgdGhhdCB0aGUgR0NDIGJ1aWx0aW4gaXMKKyAqIHVuZGVmaW5lZCBpZiB0aGUgdmFsdWUgaXMgemVyby4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2x6MzIodWludDMyX3QgdmFsKQoreworI2lmIFFFTVVfR05VQ19QUkVSRVEoMywgNCkKKyAgICByZXR1cm4gdmFsID8gX19idWlsdGluX2Nseih2YWwpIDogMzI7CisjZWxzZQorICAgIC8qIEJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsZWFkaW5nIG9uZSBiaXQuICAqLworICAgIGludCBjbnQgPSAwOworCisgICAgaWYgKCEodmFsICYgMHhGRkZGMDAwMFUpKSB7CisgICAgICAgIGNudCArPSAxNjsKKyAgICAgICAgdmFsIDw8PSAxNjsKKyAgICB9CisgICAgaWYgKCEodmFsICYgMHhGRjAwMDAwMFUpKSB7CisgICAgICAgIGNudCArPSA4OworICAgICAgICB2YWwgPDw9IDg7CisgICAgfQorICAgIGlmICghKHZhbCAmIDB4RjAwMDAwMDBVKSkgeworICAgICAgICBjbnQgKz0gNDsKKyAgICAgICAgdmFsIDw8PSA0OworICAgIH0KKyAgICBpZiAoISh2YWwgJiAweEMwMDAwMDAwVSkpIHsKKyAgICAgICAgY250ICs9IDI7CisgICAgICAgIHZhbCA8PD0gMjsKKyAgICB9CisgICAgaWYgKCEodmFsICYgMHg4MDAwMDAwMFUpKSB7CisgICAgICAgIGNudCsrOworICAgICAgICB2YWwgPDw9IDE7CisgICAgfQorICAgIGlmICghKHZhbCAmIDB4ODAwMDAwMDBVKSkgeworICAgICAgICBjbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIGNudDsKKyNlbmRpZgorfQorCisvKioKKyAqIGNsbzMyIC0gY291bnQgbGVhZGluZyBvbmVzIGluIGEgMzItYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgMzIgaWYgdGhlIHZhbHVlIGlzIC0xLgorICovCitzdGF0aWMgaW5saW5lIGludCBjbG8zMih1aW50MzJfdCB2YWwpCit7CisgICAgcmV0dXJuIGNsejMyKH52YWwpOworfQorCisvKioKKyAqIGNsejY0IC0gY291bnQgbGVhZGluZyB6ZXJvcyBpbiBhIDY0LWJpdCB2YWx1ZS4KKyAqIEB2YWw6IFRoZSB2YWx1ZSB0byBzZWFyY2gKKyAqCisgKiBSZXR1cm5zIDY0IGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLiAgTm90ZSB0aGF0IHRoZSBHQ0MgYnVpbHRpbiBpcworICogdW5kZWZpbmVkIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIGludCBjbHo2NCh1aW50NjRfdCB2YWwpCit7CisjaWYgUUVNVV9HTlVDX1BSRVJFUSgzLCA0KQorICAgIHJldHVybiB2YWwgPyBfX2J1aWx0aW5fY2x6bGwodmFsKSA6IDY0OworI2Vsc2UKKyAgICBpbnQgY250ID0gMDsKKworICAgIGlmICghKHZhbCA+PiAzMikpIHsKKyAgICAgICAgY250ICs9IDMyOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbCA+Pj0gMzI7CisgICAgfQorCisgICAgcmV0dXJuIGNudCArIGNsejMyKHZhbCk7CisjZW5kaWYKK30KKworLyoqCisgKiBjbG82NCAtIGNvdW50IGxlYWRpbmcgb25lcyBpbiBhIDY0LWJpdCB2YWx1ZS4KKyAqIEB2YWw6IFRoZSB2YWx1ZSB0byBzZWFyY2gKKyAqCisgKiBSZXR1cm5zIDY0IGlmIHRoZSB2YWx1ZSBpcyAtMS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2xvNjQodWludDY0X3QgdmFsKQoreworICAgIHJldHVybiBjbHo2NCh+dmFsKTsKK30KKworLyoqCisgKiBjdHozMiAtIGNvdW50IHRyYWlsaW5nIHplcm9zIGluIGEgMzItYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgMzIgaWYgdGhlIHZhbHVlIGlzIHplcm8uICBOb3RlIHRoYXQgdGhlIEdDQyBidWlsdGluIGlzCisgKiB1bmRlZmluZWQgaWYgdGhlIHZhbHVlIGlzIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN0ejMyKHVpbnQzMl90IHZhbCkKK3sKKyNpZiBRRU1VX0dOVUNfUFJFUkVRKDMsIDQpCisgICAgcmV0dXJuIHZhbCA/IF9fYnVpbHRpbl9jdHoodmFsKSA6IDMyOworI2Vsc2UKKyAgICAvKiBCaW5hcnkgc2VhcmNoIGZvciB0aGUgdHJhaWxpbmcgb25lIGJpdC4gICovCisgICAgaW50IGNudDsKKworICAgIGNudCA9IDA7CisgICAgaWYgKCEodmFsICYgMHgwMDAwRkZGRlVMKSkgeworICAgICAgICBjbnQgKz0gMTY7CisgICAgICAgIHZhbCA+Pj0gMTY7CisgICAgfQorICAgIGlmICghKHZhbCAmIDB4MDAwMDAwRkZVTCkpIHsKKyAgICAgICAgY250ICs9IDg7CisgICAgICAgIHZhbCA+Pj0gODsKKyAgICB9CisgICAgaWYgKCEodmFsICYgMHgwMDAwMDAwRlVMKSkgeworICAgICAgICBjbnQgKz0gNDsKKyAgICAgICAgdmFsID4+PSA0OworICAgIH0KKyAgICBpZiAoISh2YWwgJiAweDAwMDAwMDAzVUwpKSB7CisgICAgICAgIGNudCArPSAyOworICAgICAgICB2YWwgPj49IDI7CisgICAgfQorICAgIGlmICghKHZhbCAmIDB4MDAwMDAwMDFVTCkpIHsKKyAgICAgICAgY250Kys7CisgICAgICAgIHZhbCA+Pj0gMTsKKyAgICB9CisgICAgaWYgKCEodmFsICYgMHgwMDAwMDAwMVVMKSkgeworICAgICAgICBjbnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gY250OworI2VuZGlmCit9CisKKy8qKgorICogY3RvMzIgLSBjb3VudCB0cmFpbGluZyBvbmVzIGluIGEgMzItYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgMzIgaWYgdGhlIHZhbHVlIGlzIC0xLgorICovCitzdGF0aWMgaW5saW5lIGludCBjdG8zMih1aW50MzJfdCB2YWwpCit7CisgICAgcmV0dXJuIGN0ejMyKH52YWwpOworfQorCisvKioKKyAqIGN0ejY0IC0gY291bnQgdHJhaWxpbmcgemVyb3MgaW4gYSA2NC1iaXQgdmFsdWUuCisgKiBAdmFsOiBUaGUgdmFsdWUgdG8gc2VhcmNoCisgKgorICogUmV0dXJucyA2NCBpZiB0aGUgdmFsdWUgaXMgemVyby4gIE5vdGUgdGhhdCB0aGUgR0NDIGJ1aWx0aW4gaXMKKyAqIHVuZGVmaW5lZCBpZiB0aGUgdmFsdWUgaXMgemVyby4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3R6NjQodWludDY0X3QgdmFsKQoreworI2lmIFFFTVVfR05VQ19QUkVSRVEoMywgNCkKKyAgICByZXR1cm4gdmFsID8gX19idWlsdGluX2N0emxsKHZhbCkgOiA2NDsKKyNlbHNlCisgICAgaW50IGNudDsKKworICAgIGNudCA9IDA7CisgICAgaWYgKCEoKHVpbnQzMl90KXZhbCkpIHsKKyAgICAgICAgY250ICs9IDMyOworICAgICAgICB2YWwgPj49IDMyOworICAgIH0KKworICAgIHJldHVybiBjbnQgKyBjdHozMih2YWwpOworI2VuZGlmCit9CisKKy8qKgorICogY3R6NjQgLSBjb3VudCB0cmFpbGluZyBvbmVzIGluIGEgNjQtYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICoKKyAqIFJldHVybnMgNjQgaWYgdGhlIHZhbHVlIGlzIC0xLgorICovCitzdGF0aWMgaW5saW5lIGludCBjdG82NCh1aW50NjRfdCB2YWwpCit7CisgICAgcmV0dXJuIGN0ejY0KH52YWwpOworfQorCisvKioKKyAqIGN0cG9wOCAtIGNvdW50IHRoZSBwb3B1bGF0aW9uIG9mIG9uZSBiaXRzIGluIGFuIDgtYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICovCitzdGF0aWMgaW5saW5lIGludCBjdHBvcDgodWludDhfdCB2YWwpCit7CisjaWYgUUVNVV9HTlVDX1BSRVJFUSgzLCA0KQorICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQodmFsKTsKKyNlbHNlCisgICAgdmFsID0gKHZhbCAmIDB4NTUpICsgKCh2YWwgPj4gMSkgJiAweDU1KTsKKyAgICB2YWwgPSAodmFsICYgMHgzMykgKyAoKHZhbCA+PiAyKSAmIDB4MzMpOworICAgIHZhbCA9ICh2YWwgJiAweDBmKSArICgodmFsID4+IDQpICYgMHgwZik7CisKKyAgICByZXR1cm4gdmFsOworI2VuZGlmCit9CisKKy8qKgorICogY3Rwb3AxNiAtIGNvdW50IHRoZSBwb3B1bGF0aW9uIG9mIG9uZSBiaXRzIGluIGEgMTYtYml0IHZhbHVlLgorICogQHZhbDogVGhlIHZhbHVlIHRvIHNlYXJjaAorICovCitzdGF0aWMgaW5saW5lIGludCBjdHBvcDE2KHVpbnQxNl90IHZhbCkKK3sKKyNpZiBRRU1VX0dOVUNfUFJFUkVRKDMsIDQpCisgICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCh2YWwpOworI2Vsc2UKKyAgICB2YWwgPSAodmFsICYgMHg1NTU1KSArICgodmFsID4+IDEpICYgMHg1NTU1KTsKKyAgICB2YWwgPSAodmFsICYgMHgzMzMzKSArICgodmFsID4+IDIpICYgMHgzMzMzKTsKKyAgICB2YWwgPSAodmFsICYgMHgwZjBmKSArICgodmFsID4+IDQpICYgMHgwZjBmKTsKKyAgICB2YWwgPSAodmFsICYgMHgwMGZmKSArICgodmFsID4+IDgpICYgMHgwMGZmKTsKKworICAgIHJldHVybiB2YWw7CisjZW5kaWYKK30KKworLyoqCisgKiBjdHBvcDMyIC0gY291bnQgdGhlIHBvcHVsYXRpb24gb2Ygb25lIGJpdHMgaW4gYSAzMi1iaXQgdmFsdWUuCisgKiBAdmFsOiBUaGUgdmFsdWUgdG8gc2VhcmNoCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN0cG9wMzIodWludDMyX3QgdmFsKQoreworI2lmIFFFTVVfR05VQ19QUkVSRVEoMywgNCkKKyAgICByZXR1cm4gX19idWlsdGluX3BvcGNvdW50KHZhbCk7CisjZWxzZQorICAgIHZhbCA9ICh2YWwgJiAweDU1NTU1NTU1KSArICgodmFsID4+ICAxKSAmIDB4NTU1NTU1NTUpOworICAgIHZhbCA9ICh2YWwgJiAweDMzMzMzMzMzKSArICgodmFsID4+ICAyKSAmIDB4MzMzMzMzMzMpOworICAgIHZhbCA9ICh2YWwgJiAweDBmMGYwZjBmKSArICgodmFsID4+ICA0KSAmIDB4MGYwZjBmMGYpOworICAgIHZhbCA9ICh2YWwgJiAweDAwZmYwMGZmKSArICgodmFsID4+ICA4KSAmIDB4MDBmZjAwZmYpOworICAgIHZhbCA9ICh2YWwgJiAweDAwMDBmZmZmKSArICgodmFsID4+IDE2KSAmIDB4MDAwMGZmZmYpOworCisgICAgcmV0dXJuIHZhbDsKKyNlbmRpZgorfQorCisvKioKKyAqIGN0cG9wNjQgLSBjb3VudCB0aGUgcG9wdWxhdGlvbiBvZiBvbmUgYml0cyBpbiBhIDY0LWJpdCB2YWx1ZS4KKyAqIEB2YWw6IFRoZSB2YWx1ZSB0byBzZWFyY2gKKyAqLworc3RhdGljIGlubGluZSBpbnQgY3Rwb3A2NCh1aW50NjRfdCB2YWwpCit7CisjaWYgUUVNVV9HTlVDX1BSRVJFUSgzLCA0KQorICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbCh2YWwpOworI2Vsc2UKKyAgICB2YWwgPSAodmFsICYgMHg1NTU1NTU1NTU1NTU1NTU1VUxMKSArICgodmFsID4+ICAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NVVMTCk7CisgICAgdmFsID0gKHZhbCAmIDB4MzMzMzMzMzMzMzMzMzMzM1VMTCkgKyAoKHZhbCA+PiAgMikgJiAweDMzMzMzMzMzMzMzMzMzMzNVTEwpOworICAgIHZhbCA9ICh2YWwgJiAweDBmMGYwZjBmMGYwZjBmMGZVTEwpICsgKCh2YWwgPj4gIDQpICYgMHgwZjBmMGYwZjBmMGYwZjBmVUxMKTsKKyAgICB2YWwgPSAodmFsICYgMHgwMGZmMDBmZjAwZmYwMGZmVUxMKSArICgodmFsID4+ICA4KSAmIDB4MDBmZjAwZmYwMGZmMDBmZlVMTCk7CisgICAgdmFsID0gKHZhbCAmIDB4MDAwMGZmZmYwMDAwZmZmZlVMTCkgKyAoKHZhbCA+PiAxNikgJiAweDAwMDBmZmZmMDAwMGZmZmZVTEwpOworICAgIHZhbCA9ICh2YWwgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpICsgKCh2YWwgPj4gMzIpICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKTsKKworICAgIHJldHVybiB2YWw7CisjZW5kaWYKK30KKworLyogSG9zdCB0eXBlIHNwZWNpZmljIHNpemVzIG9mIHRoZXNlIHJvdXRpbmVzLiAgKi8KKworI2lmIFVMT05HX01BWCA9PSBVSU5UMzJfTUFYCisjIGRlZmluZSBjbHpsICAgY2x6MzIKKyMgZGVmaW5lIGN0emwgICBjdHozMgorIyBkZWZpbmUgY2xvbCAgIGNsbzMyCisjIGRlZmluZSBjdG9sICAgY3RvMzIKKyMgZGVmaW5lIGN0cG9wbCBjdHBvcDMyCisjZWxpZiBVTE9OR19NQVggPT0gVUlOVDY0X01BWAorIyBkZWZpbmUgY2x6bCAgIGNsejY0CisjIGRlZmluZSBjdHpsICAgY3R6NjQKKyMgZGVmaW5lIGNsb2wgICBjbG82NAorIyBkZWZpbmUgY3RvbCAgIGN0bzY0CisjIGRlZmluZSBjdHBvcGwgY3Rwb3A2NAorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBzaXplb2YgbG9uZworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaW50MTI4LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9pbnQxMjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQ0N2FhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaW50MTI4LmgKQEAgLTAsMCArMSwxNDQgQEAKKyNpZm5kZWYgSU5UMTI4X0gKKyNkZWZpbmUgSU5UMTI4X0gKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwordHlwZWRlZiBzdHJ1Y3QgSW50MTI4IEludDEyODsKKworc3RydWN0IEludDEyOCB7CisgICAgdWludDY0X3QgbG87CisgICAgaW50NjRfdCBoaTsKK307CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9tYWtlNjQodWludDY0X3QgYSkKK3sKKyAgICByZXR1cm4gKEludDEyOCkgeyBhLCAwIH07Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgaW50MTI4X2dldDY0KEludDEyOCBhKQoreworICAgIGFzc2VydCghYS5oaSk7CisgICAgcmV0dXJuIGEubG87Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF96ZXJvKHZvaWQpCit7CisgICAgcmV0dXJuIGludDEyOF9tYWtlNjQoMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9vbmUodm9pZCkKK3sKKyAgICByZXR1cm4gaW50MTI4X21ha2U2NCgxKTsKK30KKworc3RhdGljIGlubGluZSBJbnQxMjggaW50MTI4XzJfNjQodm9pZCkKK3sKKyAgICByZXR1cm4gKEludDEyOCkgeyAwLCAxIH07Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9hbmQoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHJldHVybiAoSW50MTI4KSB7IGEubG8gJiBiLmxvLCBhLmhpICYgYi5oaSB9OworfQorCitzdGF0aWMgaW5saW5lIEludDEyOCBpbnQxMjhfcnNoaWZ0KEludDEyOCBhLCBpbnQgbikKK3sKKyAgICBpbnQ2NF90IGg7CisgICAgaWYgKCFuKSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKyAgICBoID0gYS5oaSA+PiAobiAmIDYzKTsKKyAgICBpZiAobiA+PSA2NCkgeworICAgICAgICByZXR1cm4gKEludDEyOCkgeyBoLCBoID4+IDYzIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIChJbnQxMjgpIHsgKGEubG8gPj4gbikgfCAoYS5oaSA8PCAoNjQgLSBuKSksIGggfTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9hZGQoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHVpbnQ2NF90IGxvID0gYS5sbyArIGIubG87CisKKyAgICAvKiBhLmxvIDw9IGEubG8gKyBiLmxvIDwgYS5sbyArIGsgKGsgaXMgdGhlIGJhc2UsIDJeNjQpLiAgSGVuY2UsCisgICAgICogYS5sbyArIGIubG8gPj0gayBpbXBsaWVzIDAgPD0gbG8gPSBhLmxvICsgYi5sbyAtIGsgPCBhLmxvLgorICAgICAqIFNpbWlsYXJseSwgYS5sbyArIGIubG8gPCBrIGltcGxpZXMgYS5sbyA8PSBsbyA9IGEubG8gKyBiLmxvIDwgay4KKyAgICAgKgorICAgICAqIFNvIHRoZSBjYXJyeSBpcyBsbyA8IGEubG8uCisgICAgICovCisgICAgcmV0dXJuIChJbnQxMjgpIHsgbG8sICh1aW50NjRfdClhLmhpICsgYi5oaSArIChsbyA8IGEubG8pIH07Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9uZWcoSW50MTI4IGEpCit7CisgICAgdWludDY0X3QgbG8gPSAtYS5sbzsKKyAgICByZXR1cm4gKEludDEyOCkgeyBsbywgfih1aW50NjRfdClhLmhpICsgIWxvIH07Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9zdWIoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHJldHVybiAoSW50MTI4KXsgYS5sbyAtIGIubG8sIGEuaGkgLSBiLmhpIC0gKGEubG8gPCBiLmxvKSB9OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW50MTI4X25vbm5lZyhJbnQxMjggYSkKK3sKKyAgICByZXR1cm4gYS5oaSA+PSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW50MTI4X2VxKEludDEyOCBhLCBJbnQxMjggYikKK3sKKyAgICByZXR1cm4gYS5sbyA9PSBiLmxvICYmIGEuaGkgPT0gYi5oaTsKK30KKworc3RhdGljIGlubGluZSBib29sIGludDEyOF9uZShJbnQxMjggYSwgSW50MTI4IGIpCit7CisgICAgcmV0dXJuICFpbnQxMjhfZXEoYSwgYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnQxMjhfZ2UoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHJldHVybiBhLmhpID4gYi5oaSB8fCAoYS5oaSA9PSBiLmhpICYmIGEubG8gPj0gYi5sbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnQxMjhfbHQoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHJldHVybiAhaW50MTI4X2dlKGEsIGIpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW50MTI4X2xlKEludDEyOCBhLCBJbnQxMjggYikKK3sKKyAgICByZXR1cm4gaW50MTI4X2dlKGIsIGEpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaW50MTI4X2d0KEludDEyOCBhLCBJbnQxMjggYikKK3sKKyAgICByZXR1cm4gIWludDEyOF9sZShhLCBiKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGludDEyOF9ueihJbnQxMjggYSkKK3sKKyAgICByZXR1cm4gYS5sbyB8fCBhLmhpOworfQorCitzdGF0aWMgaW5saW5lIEludDEyOCBpbnQxMjhfbWluKEludDEyOCBhLCBJbnQxMjggYikKK3sKKyAgICByZXR1cm4gaW50MTI4X2xlKGEsIGIpID8gYSA6IGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50MTI4IGludDEyOF9tYXgoSW50MTI4IGEsIEludDEyOCBiKQoreworICAgIHJldHVybiBpbnQxMjhfZ2UoYSwgYikgPyBhIDogYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGludDEyOF9hZGR0byhJbnQxMjggKmEsIEludDEyOCBiKQoreworICAgICphID0gaW50MTI4X2FkZCgqYSwgYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnQxMjhfc3ViZnJvbShJbnQxMjggKmEsIEludDEyOCBiKQoreworICAgICphID0gaW50MTI4X3N1YigqYSwgYik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaW92LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9pb3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGQyNWYyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvaW92LmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBIZWxwZXJzIGZvciB1c2luZyAocGFydGlhbCkgaW92ZWNzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogQXV0aG9yKHMpOgorICogIEFtaXQgU2hhaCA8YW1pdC5zaGFoQHJlZGhhdC5jb20+CisgKiAgTWljaGFlbCBUb2thcmV2IDxtanRAdGxzLm1zay5ydT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2lmbmRlZiBJT1ZfSAorI2RlZmluZSBJT1ZfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKworLyoqCisgKiBjb3VudCBhbmQgcmV0dXJuIGRhdGEgc2l6ZSwgaW4gYnl0ZXMsIG9mIGFuIGlvdmVjCisgKiBzdGFydGluZyBhdCBgaW92JyBvZiBgaW92X2NudCcgbnVtYmVyIG9mIGVsZW1lbnRzLgorICovCitzaXplX3QgaW92X3NpemUoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGNvbnN0IHVuc2lnbmVkIGludCBpb3ZfY250KTsKKworLyoqCisgKiBDb3B5IGZyb20gc2luZ2xlIGNvbnRpbnVvdXMgYnVmZmVyIHRvIHNjYXR0ZXItZ2F0aGVyIHZlY3RvciBvZiBidWZmZXJzCisgKiAoaW92ZWMpIGFuZCBiYWNrIGxpa2UgbWVtY3B5KCkgYmV0d2VlbiB0d28gY29udGludW91cyBtZW1vcnkgcmVnaW9ucy4KKyAqIERhdGEgaW4gc2luZ2xlIGNvbnRpbnVvdXMgYnVmZmVyIHN0YXJ0aW5nIGF0IGFkZHJlc3MgYGJ1ZicgYW5kCisgKiBgYnl0ZXMnIGJ5dGVzIGxvbmcgd2lsbCBiZSBjb3BpZWQgdG8vZnJvbSBhbiBpb3ZlYyBgaW92JyB3aXRoCisgKiBgaW92X2NudCcgbnVtYmVyIG9mIGVsZW1lbnRzLCBzdGFydGluZyBhdCBieXRlIHBvc2l0aW9uIGBvZmZzZXQnCisgKiB3aXRoaW4gdGhlIGlvdmVjLiAgSWYgdGhlIGlvdmVjIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIHNwYWNlLAorICogb25seSBwYXJ0IG9mIGRhdGEgd2lsbCBiZSBjb3BpZWQsIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGlvdmVjLgorICogTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNvcGllZCB3aWxsIGJlIHJldHVybmVkLCB3aGljaCBpcworICogIG1pbihieXRlcywgaW92X3NpemUoaW92KS1vZmZzZXQpCisgKiBgT2Zmc2V0JyBtdXN0IHBvaW50IHRvIHRoZSBpbnNpZGUgb2YgaW92ZWMuCisgKiBJdCBpcyBva2F5IHRvIHVzZSB2ZXJ5IGxhcmdlIHZhbHVlIGZvciBgYnl0ZXMnIHNpbmNlIHdlJ3JlCisgKiBsaW1pdGVkIGJ5IHRoZSBzaXplIG9mIHRoZSBpb3ZlYyBhbnl3YXksIHByb3ZpZGVkIHRoYXQgdGhlCisgKiBidWZmZXIgcG9pbnRlZCB0byBieSBidWYgaGFzIGVub3VnaCBzcGFjZS4gIE9uZSBwb3NzaWJsZQorICogc3VjaCAibGFyZ2UiIHZhbHVlIGlzIC0xIChzaW5pY2Ugc2l6ZV90IGlzIHVuc2lnbmVkKSwKKyAqIHNvIHNwZWNpZnlpbmcgYC0xJyBhcyBgYnl0ZXMnIG1lYW5zICd1cCB0byB0aGUgZW5kIG9mIGlvdmVjJy4KKyAqLworc2l6ZV90IGlvdl9mcm9tX2J1Zihjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgaW50IGlvdl9jbnQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKTsKK3NpemVfdCBpb3ZfdG9fYnVmKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKTsKKworLyoqCisgKiBTZXQgZGF0YSBieXRlcyBwb2ludGVkIG91dCBieSBpb3ZlYyBgaW92JyBvZiBzaXplIGBpb3ZfY250JyBlbGVtZW50cywKKyAqIHN0YXJ0aW5nIGF0IGJ5dGUgb2Zmc2V0IGBzdGFydCcsIHRvIHZhbHVlIGBmaWxsYycsIHJlcGVhdGluZyBpdAorICogYGJ5dGVzJyBudW1iZXIgb2YgdGltZXMuICBgT2Zmc2V0JyBtdXN0IHBvaW50IHRvIHRoZSBpbnNpZGUgb2YgaW92ZWMuCisgKiBJZiBgYnl0ZXMnIGlzIGxhcmdlIGVub3VnaCwgb25seSBsYXN0IGJ5dGVzIHBvcnRpb24gb2YgaW92ZWMsCisgKiB1cCB0byB0aGUgZW5kIG9mIGl0LCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgKiBGdW5jdGlvbiByZXR1cm4gYWN0dWFsIG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQsIHdoaWNoIGlzCisgKiBtaW4oc2l6ZSwgaW92X3NpemUoaW92KSAtIG9mZnNldCkuCisgKiBBZ2FpbiwgaXQgaXMgb2theSB0byB1c2UgbGFyZ2UgdmFsdWUgZm9yIGBieXRlcycgdG8gbWVhbiAidXAgdG8gdGhlIGVuZCIuCisgKi8KK3NpemVfdCBpb3ZfbWVtc2V0KGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGludCBmaWxsYywgc2l6ZV90IGJ5dGVzKTsKKworLyoKKyAqIFNlbmQvcmVjdiBkYXRhIGZyb20vdG8gaW92ZWMgYnVmZmVycyBkaXJlY3RseQorICoKKyAqIGBvZmZzZXQnIGJ5dGVzIGluIHRoZSBiZWdpbm5pbmcgb2YgaW92ZWMgYnVmZmVyIGFyZSBza2lwcGVkIGFuZAorICogbmV4dCBgYnl0ZXMnIGJ5dGVzIGFyZSB1c2VkLCB3aGljaCBtdXN0IGJlIHdpdGhpbiBkYXRhIG9mIGlvdmVjLgorICoKKyAqICAgciA9IGlvdl9zZW5kX3JlY3Yoc29ja2ZkLCBpb3YsIGlvdmNudCwgb2Zmc2V0LCBieXRlcywgdHJ1ZSk7CisgKgorICogaXMgbG9naWNhbGx5IGVxdWl2YWxlbnQgdG8KKyAqCisgKiAgIGNoYXIgKmJ1ZiA9IG1hbGxvYyhieXRlcyk7CisgKiAgIGlvdl90b19idWYoaW92LCBpb3ZjbnQsIG9mZnNldCwgYnVmLCBieXRlcyk7CisgKiAgIHIgPSBzZW5kKHNvY2tmZCwgYnVmLCBieXRlcywgMCk7CisgKiAgIGZyZWUoYnVmKTsKKyAqCisgKiBGb3IgaW92X3NlbmRfcmVjdigpIF93aG9sZV8gYXJlYSBiZWluZyBzZW50IG9yIHJlY2VpdmVkCisgKiBzaG91bGQgYmUgd2l0aGluIHRoZSBpb3ZlYywgbm90IG9ubHkgYmVnaW5uaW5nIG9mIGl0LgorICovCitzc2l6ZV90IGlvdl9zZW5kX3JlY3YoaW50IHNvY2tmZCwgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGlvdl9jbnQsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLCBib29sIGRvX3NlbmQpOworI2RlZmluZSBpb3ZfcmVjdihzb2NrZmQsIGlvdiwgaW92X2NudCwgb2Zmc2V0LCBieXRlcykgXAorICBpb3Zfc2VuZF9yZWN2KHNvY2tmZCwgaW92LCBpb3ZfY250LCBvZmZzZXQsIGJ5dGVzLCBmYWxzZSkKKyNkZWZpbmUgaW92X3NlbmQoc29ja2ZkLCBpb3YsIGlvdl9jbnQsIG9mZnNldCwgYnl0ZXMpIFwKKyAgaW92X3NlbmRfcmVjdihzb2NrZmQsIGlvdiwgaW92X2NudCwgb2Zmc2V0LCBieXRlcywgdHJ1ZSkKKworLyoqCisgKiBQcm9kdWNlIGEgdGV4dCBoZXhkdW1wIG9mIGlvdmVjIGBpb3YnIHdpdGggYGlvdl9jbnQnIG51bWJlciBvZiBlbGVtZW50cworICogaW4gZmlsZSBgZnAnLCBwcmVmaXhpbmcgZWFjaCBsaW5lIHdpdGggYHByZWZpeCcgYW5kIHByb2Nlc3Npbmcgbm90IG1vcmUKKyAqIHRoYW4gYGxpbWl0JyBkYXRhIGJ5dGVzLgorICovCit2b2lkIGlvdl9oZXhkdW1wKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgRklMRSAqZnAsIGNvbnN0IGNoYXIgKnByZWZpeCwgc2l6ZV90IGxpbWl0KTsKKworLyoKKyAqIFBhcnRpYWwgY29weSBvZiB2ZWN0b3IgZnJvbSBpb3YgdG8gZHN0X2lvdiAoZGF0YSBpcyBub3QgY29waWVkKS4KKyAqIGRzdF9pb3Ygb3ZlcmxhcHMgaW92IGF0IGEgc3BlY2lmaWVkIG9mZnNldC4KKyAqIHNpemUgb2YgZHN0X2lvdiBpcyBhdCBtb3N0IGJ5dGVzLiBkc3QgdmVjdG9yIGNvdW50IGlzIHJldHVybmVkLgorICovCit1bnNpZ25lZCBpb3ZfY29weShzdHJ1Y3QgaW92ZWMgKmRzdF9pb3YsIHVuc2lnbmVkIGludCBkc3RfaW92X2NudCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGludCBpb3ZfY250LAorICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMpOworCisvKgorICogUmVtb3ZlIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGZyb250IG9yIGJhY2sgb2YgYSB2ZWN0b3IuCisgKiBUaGlzIG1heSB1cGRhdGUgaW92IGFuZC9vciBpb3ZfY250IHRvIGV4Y2x1ZGUgaW92ZWMgZWxlbWVudHMgdGhhdCBhcmUKKyAqIG5vIGxvbmdlciByZXF1aXJlZC4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGRpc2NhcmRlZCBpcyByZXR1cm5lZC4gIFRoaXMgbnVtYmVyIG1heSBiZQorICogc21hbGxlciB0aGFuIHJlcXVlc3RlZCBpZiB0aGUgdmVjdG9yIGlzIHRvbyBzbWFsbC4KKyAqLworc2l6ZV90IGlvdl9kaXNjYXJkX2Zyb250KHN0cnVjdCBpb3ZlYyAqKmlvdiwgdW5zaWduZWQgaW50ICppb3ZfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcyk7CitzaXplX3QgaW92X2Rpc2NhcmRfYmFjayhzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgaW50ICppb3ZfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9sb2cuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L2xvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDdlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9sb2cuaApAQCAtMCwwICsxLDE4NyBAQAorI2lmbmRlZiBRRU1VX0xPR19ICisjZGVmaW5lIFFFTVVfTE9HX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInFlbXUvY29tcGlsZXIuaCIKKyNpZmRlZiBORUVEX0NQVV9ICisvLyBUT0RPKGRpZ2l0KTogI2luY2x1ZGUgInFvbS9jcHUuaCIKKyNpbmNsdWRlICJkaXNhcy9kaXNhcy5oIgorI2VuZGlmCisKKy8qIFByaXZhdGUgZ2xvYmFsIHZhcmlhYmxlcywgZG9uJ3QgdXNlICovCitleHRlcm4gRklMRSAqcWVtdV9sb2dmaWxlOworZXh0ZXJuIGludCBxZW11X2xvZ2xldmVsOworCisvKgorICogVGhlIG5ldyBBUEk6CisgKgorICovCisKKy8qIExvZyBzZXR0aW5ncyBjaGVja2luZyBtYWNyb3M6ICovCisKKy8qIFJldHVybnMgdHJ1ZSBpZiBxZW11X2xvZygpIHdpbGwgcmVhbGx5IHdyaXRlIHNvbWV3aGVyZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcWVtdV9sb2dfZW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiBxZW11X2xvZ2ZpbGUgIT0gTlVMTDsKK30KKworI2RlZmluZSBDUFVfTE9HX1RCX09VVF9BU00gKDEgPDwgMCkKKyNkZWZpbmUgQ1BVX0xPR19UQl9JTl9BU00gICgxIDw8IDEpCisjZGVmaW5lIENQVV9MT0dfVEJfT1AgICAgICAoMSA8PCAyKQorI2RlZmluZSBDUFVfTE9HX1RCX09QX09QVCAgKDEgPDwgMykKKyNkZWZpbmUgQ1BVX0xPR19JTlQgICAgICAgICgxIDw8IDQpCisjZGVmaW5lIENQVV9MT0dfRVhFQyAgICAgICAoMSA8PCA1KQorI2RlZmluZSBDUFVfTE9HX1BDQUxMICAgICAgKDEgPDwgNikKKyNkZWZpbmUgQ1BVX0xPR19JT1BPUlQgICAgICgxIDw8IDcpCisjZGVmaW5lIENQVV9MT0dfVEJfQ1BVICAgICAoMSA8PCA4KQorI2RlZmluZSBDUFVfTE9HX1JFU0VUICAgICAgKDEgPDwgOSkKKyNkZWZpbmUgTE9HX1VOSU1QICAgICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBMT0dfR1VFU1RfRVJST1IgICAgKDEgPDwgMTEpCisKKy8qIFJldHVybnMgdHJ1ZSBpZiBhIGJpdCBpcyBzZXQgaW4gdGhlIGN1cnJlbnQgbG9nbGV2ZWwgbWFzaworICovCitzdGF0aWMgaW5saW5lIGJvb2wgcWVtdV9sb2dsZXZlbF9tYXNrKGludCBtYXNrKQoreworICAgIHJldHVybiAocWVtdV9sb2dsZXZlbCAmIG1hc2spICE9IDA7Cit9CisKKy8qIExvZ2dpbmcgZnVuY3Rpb25zOiAqLworCisvKiBtYWluIGxvZ2dpbmcgZnVuY3Rpb24KKyAqLwordm9pZCBHQ0NfRk1UX0FUVFIoMSwgMikgcWVtdV9sb2coY29uc3QgY2hhciAqZm10LCAuLi4pOworCisvKiB2ZnByaW50Zi1saWtlIGxvZ2dpbmcgZnVuY3Rpb24KKyAqLworc3RhdGljIGlubGluZSB2b2lkIEdDQ19GTVRfQVRUUigxLCAwKQorcWVtdV9sb2dfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmEpCit7CisgICAgaWYgKHFlbXVfbG9nZmlsZSkgeworICAgICAgICB2ZnByaW50ZihxZW11X2xvZ2ZpbGUsIGZtdCwgdmEpOworICAgIH0KK30KKworLyogbG9nIG9ubHkgaWYgYSBiaXQgaXMgc2V0IG9uIHRoZSBjdXJyZW50IGxvZ2xldmVsIG1hc2sKKyAqLwordm9pZCBHQ0NfRk1UX0FUVFIoMiwgMykgcWVtdV9sb2dfbWFzayhpbnQgbWFzaywgY29uc3QgY2hhciAqZm10LCAuLi4pOworCisKKy8qIFNwZWNpYWwgY2FzZXM6ICovCisKKyNpZmRlZiBORUVEX0NQVV9ICisKKy8qIGNwdV9kdW1wX3N0YXRlKCkgbG9nZ2luZyBmdW5jdGlvbnM6ICovCisvKioKKyAqIGxvZ19jcHVfc3RhdGU6CisgKiBAY3B1OiBUaGUgQ1BVIHdob3NlIHN0YXRlIGlzIHRvIGJlIGxvZ2dlZC4KKyAqIEBmbGFnczogRmxhZ3Mgd2hhdCB0byBsb2cuCisgKgorICogTG9ncyB0aGUgb3V0cHV0IG9mIGNwdV9kdW1wX3N0YXRlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2dfY3B1X3N0YXRlKENQVVN0YXRlICpjcHUsIGludCBmbGFncykKK3sKKyAgICBpZiAocWVtdV9sb2dfZW5hYmxlZCgpKSB7CisgICAgICAgIGNwdV9kdW1wX3N0YXRlKGNwdSwgcWVtdV9sb2dmaWxlLCBmcHJpbnRmLCBmbGFncyk7CisgICAgfQorfQorLyoqCisgKiBsb2dfY3B1X3N0YXRlX21hc2s6CisgKiBAbWFzazogTWFzayB3aGVuIHRvIGxvZy4KKyAqIEBjcHU6IFRoZSBDUFUgd2hvc2Ugc3RhdGUgaXMgdG8gYmUgbG9nZ2VkLgorICogQGZsYWdzOiBGbGFncyB3aGF0IHRvIGxvZy4KKyAqCisgKiBMb2dzIHRoZSBvdXRwdXQgb2YgY3B1X2R1bXBfc3RhdGUoKSBpZiBsb2dsZXZlbCBpbmNsdWRlcyBAbWFzay4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxvZ19jcHVfc3RhdGVfbWFzayhpbnQgbWFzaywgQ1BVU3RhdGUgKmNwdSwgaW50IGZsYWdzKQoreworICAgIGlmIChxZW11X2xvZ2xldmVsICYgbWFzaykgeworICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgZmxhZ3MpOworICAgIH0KK30KKworLyogZGlzYXMoKSBhbmQgdGFyZ2V0X2Rpc2FzKCkgdG8gcWVtdV9sb2dmaWxlOiAqLwordm9pZCB0YXJnZXRfZGlzYXMoRklMRSosIENQVUFyY2hTdGF0ZSosIHRhcmdldF91bG9uZywgdGFyZ2V0X3Vsb25nLCBpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbG9nX3RhcmdldF9kaXNhcyhDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IGZsYWdzKQoreworICAgIHRhcmdldF9kaXNhcyhxZW11X2xvZ2ZpbGUsIGVudiwgc3RhcnQsIGxlbiwgZmxhZ3MpOworfQorCit2b2lkIGRpc2FzKEZJTEUqLCB2b2lkKiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW5saW5lIHZvaWQgbG9nX2Rpc2FzKHZvaWQgKmNvZGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICBkaXNhcyhxZW11X2xvZ2ZpbGUsIGNvZGUsIHNpemUpOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorLyogcGFnZV9kdW1wKCkgb3V0cHV0IHRvIHRoZSBsb2cgZmlsZTogKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2dfcGFnZV9kdW1wKHZvaWQpCit7CisgICAgcGFnZV9kdW1wKHFlbXVfbG9nZmlsZSk7Cit9CisjZW5kaWYKKyNlbmRpZiAgLy8gTkVFRF9DUFVfSAorCisKKy8qIE1haW50ZW5hbmNlOiAqLworCisvKiBmZmx1c2goKSB0aGUgbG9nIGZpbGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2xvZ19mbHVzaCh2b2lkKQoreworICAgIGZmbHVzaChxZW11X2xvZ2ZpbGUpOworfQorCisvKiBDbG9zZSB0aGUgbG9nIGZpbGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2xvZ19jbG9zZSh2b2lkKQoreworICAgIGlmIChxZW11X2xvZ2ZpbGUpIHsKKyAgICAgICAgaWYgKHFlbXVfbG9nZmlsZSAhPSBzdGRlcnIpIHsKKyAgICAgICAgICAgIGZjbG9zZShxZW11X2xvZ2ZpbGUpOworICAgICAgICB9CisgICAgICAgIHFlbXVfbG9nZmlsZSA9IE5VTEw7CisgICAgfQorfQorCisvKiBTZXQgdXAgYSBuZXcgbG9nIGZpbGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2xvZ19zZXRfZmlsZShGSUxFICpmKQoreworICAgIHFlbXVfbG9nZmlsZSA9IGY7Cit9CisKKy8qIGRlZmluZSBsb2cgaXRlbXMgKi8KK3R5cGVkZWYgc3RydWN0IFFFTVVMb2dJdGVtIHsKKyAgICBpbnQgbWFzazsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKmhlbHA7Cit9IFFFTVVMb2dJdGVtOworCitleHRlcm4gY29uc3QgUUVNVUxvZ0l0ZW0gcWVtdV9sb2dfaXRlbXNbXTsKKworLyogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mCisgKiBjaGFuZ2luZyB0aGUgbG9nIGxldmVsOyBpdCBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCB2aWEKKyAqIHRoZSBxZW11X3NldF9sb2coKSB3cmFwcGVyLgorICovCit2b2lkIGRvX3FlbXVfc2V0X2xvZyhpbnQgbG9nX2ZsYWdzLCBib29sIHVzZV9vd25fYnVmZmVycyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3NldF9sb2coaW50IGxvZ19mbGFncykKK3sKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgZG9fcWVtdV9zZXRfbG9nKGxvZ19mbGFncywgdHJ1ZSk7CisjZWxzZQorICAgIGRvX3FlbXVfc2V0X2xvZyhsb2dfZmxhZ3MsIGZhbHNlKTsKKyNlbmRpZgorfQorCit2b2lkIHFlbXVfc2V0X2xvZ19maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSk7CitpbnQgcWVtdV9zdHJfdG9fbG9nX21hc2soY29uc3QgY2hhciAqc3RyKTsKKworLyogUHJpbnQgYSB1c2FnZSBtZXNzYWdlIGxpc3RpbmcgYWxsIHRoZSB2YWxpZCBsb2dnaW5nIGNhdGVnb3JpZXMKKyAqIHRvIHRoZSBzcGVjaWZpZWQgRklMRSouCisgKi8KK3ZvaWQgcWVtdV9wcmludF9sb2dfdXNhZ2UoRklMRSAqZik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvbW9kdWxlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9tb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTEwNDRjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvbW9kdWxlLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIFFFTVUgTW9kdWxlIEluZnJhc3RydWN0dXJlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmIFFFTVVfTU9EVUxFX0gKKyNkZWZpbmUgUUVNVV9NT0RVTEVfSAorCisvKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gIFVzZSBibG9ja19pbml0IGV0Yy4gaW5zdGVhZC4gICovCisjZGVmaW5lIG1vZHVsZV9pbml0KGZ1bmN0aW9uLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBkb19xZW11X2luaXRfICMjIGZ1bmN0aW9uKHZvaWQpIHsgIFwKKyAgICByZWdpc3Rlcl9tb2R1bGVfaW5pdChmdW5jdGlvbiwgdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3R5cGVkZWYgZW51bSB7CisgICAgTU9EVUxFX0lOSVRfQkxPQ0ssCisgICAgTU9EVUxFX0lOSVRfREVWSUNFLCAgLy8gVE9ETyhkaWdpdCk6IFJlbW92ZSB0aGlzLgorICAgIE1PRFVMRV9JTklUX01BQ0hJTkUsCisgICAgTU9EVUxFX0lOSVRfUUFQSSwKKyAgICBNT0RVTEVfSU5JVF9RT00sCisgICAgTU9EVUxFX0lOSVRfTUFYCit9IG1vZHVsZV9pbml0X3R5cGU7CisKKyNkZWZpbmUgYmxvY2tfaW5pdChmdW5jdGlvbikgbW9kdWxlX2luaXQoZnVuY3Rpb24sIE1PRFVMRV9JTklUX0JMT0NLKQorI2RlZmluZSBkZXZpY2VfaW5pdChmdW5jdGlvbikgbW9kdWxlX2luaXQoZnVuY3Rpb24sIE1PRFVMRV9JTklUX0RFVklDRSkgIC8vIFRPRE8oZGlnaXQpOiBSZW1vdmUgdGhpcy4KKyNkZWZpbmUgbWFjaGluZV9pbml0KGZ1bmN0aW9uKSBtb2R1bGVfaW5pdChmdW5jdGlvbiwgTU9EVUxFX0lOSVRfTUFDSElORSkKKyNkZWZpbmUgcWFwaV9pbml0KGZ1bmN0aW9uKSBtb2R1bGVfaW5pdChmdW5jdGlvbiwgTU9EVUxFX0lOSVRfUUFQSSkKKyNkZWZpbmUgdHlwZV9pbml0KGZ1bmN0aW9uKSBtb2R1bGVfaW5pdChmdW5jdGlvbiwgTU9EVUxFX0lOSVRfUU9NKQorCit2b2lkIHJlZ2lzdGVyX21vZHVsZV9pbml0KHZvaWQgKCpmbikodm9pZCksIG1vZHVsZV9pbml0X3R5cGUgdHlwZSk7CisKK3ZvaWQgbW9kdWxlX2NhbGxfaW5pdChtb2R1bGVfaW5pdF90eXBlIHR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L25vdGlmeS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkNzNlNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L25vdGlmeS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBOb3RpZmllciBsaXN0cworICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTAKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX05PVElGWV9ICisjZGVmaW5lIFFFTVVfTk9USUZZX0gKKworI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTm90aWZpZXIgTm90aWZpZXI7CisKK3N0cnVjdCBOb3RpZmllcgoreworICAgIHZvaWQgKCpub3RpZnkpKE5vdGlmaWVyICpub3RpZmllciwgdm9pZCAqZGF0YSk7CisgICAgUUxJU1RfRU5UUlkoTm90aWZpZXIpIG5vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBOb3RpZmllckxpc3QKK3sKKyAgICBRTElTVF9IRUFEKCwgTm90aWZpZXIpIG5vdGlmaWVyczsKK30gTm90aWZpZXJMaXN0OworCisjZGVmaW5lIE5PVElGSUVSX0xJU1RfSU5JVElBTElaRVIoaGVhZCkgXAorICAgIHsgUUxJU1RfSEVBRF9JTklUSUFMSVpFUigoaGVhZCkubm90aWZpZXJzKSB9CisKK3ZvaWQgbm90aWZpZXJfbGlzdF9pbml0KE5vdGlmaWVyTGlzdCAqbGlzdCk7CisKK3ZvaWQgbm90aWZpZXJfbGlzdF9hZGQoTm90aWZpZXJMaXN0ICpsaXN0LCBOb3RpZmllciAqbm90aWZpZXIpOworCit2b2lkIG5vdGlmaWVyX3JlbW92ZShOb3RpZmllciAqbm90aWZpZXIpOworCit2b2lkIG5vdGlmaWVyX2xpc3Rfbm90aWZ5KE5vdGlmaWVyTGlzdCAqbGlzdCwgdm9pZCAqZGF0YSk7CisKKy8qIFNhbWUgYXMgTm90aWZpZXIgYnV0IGFsbG93cyAubm90aWZ5KCkgdG8gcmV0dXJuIGVycm9ycyAqLwordHlwZWRlZiBzdHJ1Y3QgTm90aWZpZXJXaXRoUmV0dXJuIE5vdGlmaWVyV2l0aFJldHVybjsKKworc3RydWN0IE5vdGlmaWVyV2l0aFJldHVybiB7CisgICAgLyoqCisgICAgICogUmV0dXJuIDAgb24gc3VjY2VzcyAobmV4dCBub3RpZmllciB3aWxsIGJlIGludm9rZWQpLCBvdGhlcndpc2UKKyAgICAgKiBub3RpZmllcl93aXRoX3JldHVybl9saXN0X25vdGlmeSgpIHdpbGwgc3RvcCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpbnQgKCpub3RpZnkpKE5vdGlmaWVyV2l0aFJldHVybiAqbm90aWZpZXIsIHZvaWQgKmRhdGEpOworICAgIFFMSVNUX0VOVFJZKE5vdGlmaWVyV2l0aFJldHVybikgbm9kZTsKK307CisKK3R5cGVkZWYgc3RydWN0IE5vdGlmaWVyV2l0aFJldHVybkxpc3QgeworICAgIFFMSVNUX0hFQUQoLCBOb3RpZmllcldpdGhSZXR1cm4pIG5vdGlmaWVyczsKK30gTm90aWZpZXJXaXRoUmV0dXJuTGlzdDsKKworI2RlZmluZSBOT1RJRklFUl9XSVRIX1JFVFVSTl9MSVNUX0lOSVRJQUxJWkVSKGhlYWQpIFwKKyAgICB7IFFMSVNUX0hFQURfSU5JVElBTElaRVIoKGhlYWQpLm5vdGlmaWVycykgfQorCit2b2lkIG5vdGlmaWVyX3dpdGhfcmV0dXJuX2xpc3RfaW5pdChOb3RpZmllcldpdGhSZXR1cm5MaXN0ICpsaXN0KTsKKwordm9pZCBub3RpZmllcl93aXRoX3JldHVybl9saXN0X2FkZChOb3RpZmllcldpdGhSZXR1cm5MaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmllcldpdGhSZXR1cm4gKm5vdGlmaWVyKTsKKwordm9pZCBub3RpZmllcl93aXRoX3JldHVybl9yZW1vdmUoTm90aWZpZXJXaXRoUmV0dXJuICpub3RpZmllcik7CisKK2ludCBub3RpZmllcl93aXRoX3JldHVybl9saXN0X25vdGlmeShOb3RpZmllcldpdGhSZXR1cm5MaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L29wdGlvbi5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvb3B0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MDYwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L29wdGlvbi5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29tbWFuZGxpbmUgb3B0aW9uIHBhcnNpbmcgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgS2V2aW4gV29sZiA8a3dvbGZAcmVkaGF0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBRRU1VX09QVElPTlNfSAorI2RlZmluZSBRRU1VX09QVElPTlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FkaWN0LmgiCisKK2VudW0gUUVNVU9wdGlvblBhclR5cGUgeworICAgIE9QVF9GTEFHLAorICAgIE9QVF9OVU1CRVIsCisgICAgT1BUX1NJWkUsCisgICAgT1BUX1NUUklORywKK307CisKK3R5cGVkZWYgc3RydWN0IFFFTVVPcHRpb25QYXJhbWV0ZXIgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgZW51bSBRRU1VT3B0aW9uUGFyVHlwZSB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgbjsKKyAgICAgICAgY2hhciogczsKKyAgICB9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKmhlbHA7Cit9IFFFTVVPcHRpb25QYXJhbWV0ZXI7CisKKworY29uc3QgY2hhciAqZ2V0X29wdF9uYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpwLCBjaGFyIGRlbGltKTsKK2NvbnN0IGNoYXIgKmdldF9vcHRfdmFsdWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnApOworaW50IGdldF9uZXh0X3BhcmFtX3ZhbHVlKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqKnBzdHIpOworaW50IGdldF9wYXJhbV92YWx1ZShjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpzdHIpOworaW50IGNoZWNrX3BhcmFtcyhjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpwYXJhbXMsIGNvbnN0IGNoYXIgKnN0cik7CisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRha2UgYSBwYXJhbWV0ZXIgbGlzdCBhcyBpbnB1dC4gVGhpcyBpcyBhIHBvaW50ZXIgdG8KKyAqIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgUUVNVU9wdGlvblBhcmFtZXRlciBhcnJheSB3aGljaCBpcyB0ZXJtaW5hdGVkIGJ5IGFuCisgKiBlbnRyeSB3aXRoIGVudHJ5LT5uYW1lID09IE5VTEwuCisgKi8KKworUUVNVU9wdGlvblBhcmFtZXRlciAqZ2V0X29wdGlvbl9wYXJhbWV0ZXIoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCwKKyAgICBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBzZXRfb3B0aW9uX3BhcmFtZXRlcihRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0LCBjb25zdCBjaGFyICpuYW1lLAorICAgIGNvbnN0IGNoYXIgKnZhbHVlKTsKK2ludCBzZXRfb3B0aW9uX3BhcmFtZXRlcl9pbnQoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICB1aW50NjRfdCB2YWx1ZSk7CitRRU1VT3B0aW9uUGFyYW1ldGVyICphcHBlbmRfb3B0aW9uX3BhcmFtZXRlcnMoUUVNVU9wdGlvblBhcmFtZXRlciAqZGVzdCwKKyAgICBRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0KTsKK1FFTVVPcHRpb25QYXJhbWV0ZXIgKnBhcnNlX29wdGlvbl9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIgKnBhcmFtLAorICAgIFFFTVVPcHRpb25QYXJhbWV0ZXIgKmxpc3QsIFFFTVVPcHRpb25QYXJhbWV0ZXIgKmRlc3QpOwordm9pZCBmcmVlX29wdGlvbl9wYXJhbWV0ZXJzKFFFTVVPcHRpb25QYXJhbWV0ZXIgKmxpc3QpOwordm9pZCBwcmludF9vcHRpb25fcGFyYW1ldGVycyhRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0KTsKK3ZvaWQgcHJpbnRfb3B0aW9uX2hlbHAoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCBRZW11T3B0IFFlbXVPcHQ7Cit0eXBlZGVmIHN0cnVjdCBRZW11T3B0cyBRZW11T3B0czsKK3R5cGVkZWYgc3RydWN0IFFlbXVPcHRzTGlzdCBRZW11T3B0c0xpc3Q7CisKK2VudW0gUWVtdU9wdFR5cGUgeworICAgIFFFTVVfT1BUX1NUUklORyA9IDAsICAvKiBubyBwYXJzaW5nICh1c2Ugc3RyaW5nIGFzLWlzKSAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgUUVNVV9PUFRfQk9PTCwgICAgICAgIC8qIG9uL29mZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBRRU1VX09QVF9OVU1CRVIsICAgICAgLyogc2ltcGxlIG51bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIFFFTVVfT1BUX1NJWkUsICAgICAgICAvKiBzaXplLCBhY2NlcHRzIChLKWlsbywgKE0pZWdhLCAoRylpZ2EsIChUKWVyYSBwb3N0Zml4ICovCit9OworCit0eXBlZGVmIHN0cnVjdCBRZW11T3B0RGVzYyB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBlbnVtIFFlbXVPcHRUeXBlIHR5cGU7CisgICAgY29uc3QgY2hhciAqaGVscDsKK30gUWVtdU9wdERlc2M7CisKK3N0cnVjdCBRZW11T3B0c0xpc3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqaW1wbGllZF9vcHRfbmFtZTsKKyAgICBRVEFJTFFfSEVBRCgsIFFlbXVPcHRzKSBoZWFkOworICAgIFFlbXVPcHREZXNjIGRlc2NbXTsKK307CisKK2NvbnN0IGNoYXIgKnFlbXVfb3B0X2dldChRZW11T3B0cyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcWVtdV9vcHRfZ2V0X2Jvb2woUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkZWZ2YWwpOwordWludDY0X3QgcWVtdV9vcHRfZ2V0X251bWJlcihRZW11T3B0cyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSwgdWludDY0X3QgZGVmdmFsKTsKK3VpbnQ2NF90IHFlbXVfb3B0X2dldF9zaXplKFFlbXVPcHRzICpvcHRzLCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBkZWZ2YWwpOworaW50IHFlbXVfb3B0X3NldChRZW11T3B0cyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOwordHlwZWRlZiBpbnQgKCpxZW11X29wdF9sb29wZnVuYykoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKm9wYXF1ZSk7CitpbnQgcWVtdV9vcHRfZm9yZWFjaChRZW11T3B0cyAqb3B0cywgcWVtdV9vcHRfbG9vcGZ1bmMgZnVuYywgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGFib3J0X29uX2ZhaWx1cmUpOworCitRZW11T3B0cyAqcWVtdV9vcHRzX2ZpbmQoUWVtdU9wdHNMaXN0ICpsaXN0LCBjb25zdCBjaGFyICppZCk7CitRZW11T3B0cyAqcWVtdV9vcHRzX2NyZWF0ZShRZW11T3B0c0xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKmlkLCBpbnQgZmFpbF9pZl9leGlzdHMpOwordm9pZCBxZW11X29wdHNfcmVzZXQoUWVtdU9wdHNMaXN0ICpsaXN0KTsKK3ZvaWQgcWVtdV9vcHRzX2xvY19yZXN0b3JlKFFlbXVPcHRzICpvcHRzKTsKK2ludCBxZW11X29wdHNfc2V0KFFlbXVPcHRzTGlzdCAqbGlzdCwgY29uc3QgY2hhciAqaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSk7Citjb25zdCBjaGFyICpxZW11X29wdHNfaWQoUWVtdU9wdHMgKm9wdHMpOwordm9pZCBxZW11X29wdHNfZGVsKFFlbXVPcHRzICpvcHRzKTsKK2ludCBxZW11X29wdHNfdmFsaWRhdGUoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IFFlbXVPcHREZXNjICpkZXNjKTsKK2ludCBxZW11X29wdHNfZG9fcGFyc2UoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKnBhcmFtcywgY29uc3QgY2hhciAqZmlyc3RuYW1lKTsKK1FlbXVPcHRzICpxZW11X29wdHNfcGFyc2UoUWVtdU9wdHNMaXN0ICpsaXN0LCBjb25zdCBjaGFyICpwYXJhbXMsIGludCBwZXJtaXRfYWJicmV2KTsKK1FlbXVPcHRzICpxZW11X29wdHNfZnJvbV9xZGljdChRZW11T3B0c0xpc3QgKmxpc3QsIGNvbnN0IFFEaWN0ICpxZGljdCk7CitRRGljdCAqcWVtdV9vcHRzX3RvX3FkaWN0KFFlbXVPcHRzICpvcHRzLCBRRGljdCAqcWRpY3QpOworCit0eXBlZGVmIGludCAoKnFlbXVfb3B0c19sb29wZnVuYykoUWVtdU9wdHMgKm9wdHMsIHZvaWQgKm9wYXF1ZSk7CitpbnQgcWVtdV9vcHRzX3ByaW50KFFlbXVPcHRzICpvcHRzLCB2b2lkICpkdW1teSk7CitpbnQgcWVtdV9vcHRzX2ZvcmVhY2goUWVtdU9wdHNMaXN0ICpsaXN0LCBxZW11X29wdHNfbG9vcGZ1bmMgZnVuYywgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBhYm9ydF9vbl9mYWlsdXJlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9vc2RlcC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvb3NkZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGEzZmNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvb3NkZXAuaApAQCAtMCwwICsxLDI0NSBAQAorI2lmbmRlZiBRRU1VX09TREVQX0gKKyNkZWZpbmUgUUVNVV9PU0RFUF9ICisKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBfX09wZW5CU0RfXworI2luY2x1ZGUgPHN5cy9zaWduYWwuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZWxzZQorI2RlZmluZSBXSUZFWElURUQoeCkgICAxCisjZGVmaW5lIFdFWElUU1RBVFVTKHgpICh4KQorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU09MQVJJUykgJiYgQ09ORklHX1NPTEFSSVNfVkVSU0lPTiA8IDEwCisvKiBbdV1pbnRfZmFzdCpfdCBub3QgaW4gPHN5cy9pbnRfdHlwZXMuaD4gKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICAgdWludF9mYXN0OF90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICB1aW50X2Zhc3QxNl90OwordHlwZWRlZiBzaWduZWQgaW50ICAgICAgICAgICAgICBpbnRfZmFzdDE2X3Q7CisjZW5kaWYKKworI2lmbmRlZiBnbHVlCisjZGVmaW5lIHhnbHVlKHgsIHkpIHggIyMgeQorI2RlZmluZSBnbHVlKHgsIHkpIHhnbHVlKHgsIHkpCisjZGVmaW5lIHN0cmluZ2lmeShzKQl0b3N0cmluZyhzKQorI2RlZmluZSB0b3N0cmluZyhzKQkjcworI2VuZGlmCisKKyNpZm5kZWYgbGlrZWx5CisjaWYgX19HTlVDX18gPCAzCisjZGVmaW5lIF9fYnVpbHRpbl9leHBlY3QoeCwgbikgKHgpCisjZW5kaWYKKworI2RlZmluZSBsaWtlbHkoeCkgICBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAxKQorI2RlZmluZSB1bmxpa2VseSh4KSAgIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDApCisjZW5kaWYKKworI2lmbmRlZiBjb250YWluZXJfb2YKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHR5cGVvZigoKHR5cGUgKikgMCktPm1lbWJlcikgKl9fbXB0ciA9IChwdHIpOyAgICAgXAorICAgICAgICAodHlwZSAqKSAoKGNoYXIgKikgX19tcHRyIC0gb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSk7fSkKKyNlbmRpZgorCisvKiBDb252ZXJ0IGZyb20gYSBiYXNlIHR5cGUgdG8gYSBwYXJlbnQgdHlwZSwgd2l0aCBjb21waWxlIHRpbWUgY2hlY2tpbmcuICAqLworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIERPX1VQQ0FTVCh0eXBlLCBmaWVsZCwgZGV2KSAoIF9fZXh0ZW5zaW9uX18gKCB7IFwKKyAgICBjaGFyIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9mZnNldF9tdXN0X2JlX3plcm9bIFwKKyAgICAgICAgLW9mZnNldG9mKHR5cGUsIGZpZWxkKV07IFwKKyAgICBjb250YWluZXJfb2YoZGV2LCB0eXBlLCBmaWVsZCk7fSkpCisjZWxzZQorI2RlZmluZSBET19VUENBU1QodHlwZSwgZmllbGQsIGRldikgY29udGFpbmVyX29mKGRldiwgdHlwZSwgZmllbGQpCisjZW5kaWYKKworI2RlZmluZSB0eXBlb2ZfZmllbGQodHlwZSwgZmllbGQpIHR5cGVvZigoKHR5cGUgKikwKS0+ZmllbGQpCisjZGVmaW5lIHR5cGVfY2hlY2sodDEsdDIpICgodDEqKTAgLSAodDIqKTApCisKKyNpZm5kZWYgTUlOCisjZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLCBiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBST1VORF9VUAorI2RlZmluZSBST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgJiAtKGQpKQorI2VuZGlmCisKKyNpZm5kZWYgRElWX1JPVU5EX1VQCisjZGVmaW5lIERJVl9ST1VORF9VUChuLGQpICgoKG4pICsgKGQpIC0gMSkgLyAoZCkpCisjZW5kaWYKKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorI2VuZGlmCisKKyNpZm5kZWYgYWx3YXlzX2lubGluZQorI2lmICEoKF9fR05VQ19fIDwgMykgfHwgZGVmaW5lZChfX0FQUExFX18pKQorI2lmZGVmIF9fT1BUSU1JWkVfXworI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUgX19hdHRyaWJ1dGVfXyAoKCBhbHdheXNfaW5saW5lICkpIF9faW5saW5lX18KKyNlbmRpZgorI2VuZGlmCisjZWxzZQorI3VuZGVmIGlubGluZQorI2RlZmluZSBpbmxpbmUgYWx3YXlzX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgcWVtdV9wcmludGYgcHJpbnRmCisKK2ludCBxZW11X2RhZW1vbihpbnQgbm9jaGRpciwgaW50IG5vY2xvc2UpOwordm9pZCAqcWVtdV9tZW1hbGlnbihzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSk7Cit2b2lkICpxZW11X3ZtYWxsb2Moc2l6ZV90IHNpemUpOwordm9pZCAqcWVtdV9hbm9uX3JhbV9hbGxvYyhzaXplX3Qgc2l6ZSk7Cit2b2lkIHFlbXVfdmZyZWUodm9pZCAqcHRyKTsKK3ZvaWQgcWVtdV9hbm9uX3JhbV9mcmVlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworCisjZGVmaW5lIFFFTVVfTUFEVl9JTlZBTElEIC0xCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQURWSVNFKQorCisjZGVmaW5lIFFFTVVfTUFEVl9XSUxMTkVFRCAgTUFEVl9XSUxMTkVFRAorI2RlZmluZSBRRU1VX01BRFZfRE9OVE5FRUQgIE1BRFZfRE9OVE5FRUQKKyNpZmRlZiBNQURWX0RPTlRGT1JLCisjZGVmaW5lIFFFTVVfTUFEVl9ET05URk9SSyAgTUFEVl9ET05URk9SSworI2Vsc2UKKyNkZWZpbmUgUUVNVV9NQURWX0RPTlRGT1JLICBRRU1VX01BRFZfSU5WQUxJRAorI2VuZGlmCisjaWZkZWYgTUFEVl9NRVJHRUFCTEUKKyNkZWZpbmUgUUVNVV9NQURWX01FUkdFQUJMRSBNQURWX01FUkdFQUJMRQorI2Vsc2UKKyNkZWZpbmUgUUVNVV9NQURWX01FUkdFQUJMRSBRRU1VX01BRFZfSU5WQUxJRAorI2VuZGlmCisjaWZkZWYgTUFEVl9ET05URFVNUAorI2RlZmluZSBRRU1VX01BRFZfRE9OVERVTVAgTUFEVl9ET05URFVNUAorI2Vsc2UKKyNkZWZpbmUgUUVNVV9NQURWX0RPTlREVU1QIFFFTVVfTUFEVl9JTlZBTElECisjZW5kaWYKKyNpZmRlZiBNQURWX0hVR0VQQUdFCisjZGVmaW5lIFFFTVVfTUFEVl9IVUdFUEFHRSBNQURWX0hVR0VQQUdFCisjZWxzZQorI2RlZmluZSBRRU1VX01BRFZfSFVHRVBBR0UgUUVNVV9NQURWX0lOVkFMSUQKKyNlbmRpZgorCisjZWxpZiBkZWZpbmVkKENPTkZJR19QT1NJWF9NQURWSVNFKQorCisjZGVmaW5lIFFFTVVfTUFEVl9XSUxMTkVFRCAgUE9TSVhfTUFEVl9XSUxMTkVFRAorI2RlZmluZSBRRU1VX01BRFZfRE9OVE5FRUQgIFBPU0lYX01BRFZfRE9OVE5FRUQKKyNkZWZpbmUgUUVNVV9NQURWX0RPTlRGT1JLICBRRU1VX01BRFZfSU5WQUxJRAorI2RlZmluZSBRRU1VX01BRFZfTUVSR0VBQkxFIFFFTVVfTUFEVl9JTlZBTElECisjZGVmaW5lIFFFTVVfTUFEVl9ET05URFVNUCBRRU1VX01BRFZfSU5WQUxJRAorI2RlZmluZSBRRU1VX01BRFZfSFVHRVBBR0UgIFFFTVVfTUFEVl9JTlZBTElECisKKyNlbHNlIC8qIG5vLW9wICovCisKKyNkZWZpbmUgUUVNVV9NQURWX1dJTExORUVEICBRRU1VX01BRFZfSU5WQUxJRAorI2RlZmluZSBRRU1VX01BRFZfRE9OVE5FRUQgIFFFTVVfTUFEVl9JTlZBTElECisjZGVmaW5lIFFFTVVfTUFEVl9ET05URk9SSyAgUUVNVV9NQURWX0lOVkFMSUQKKyNkZWZpbmUgUUVNVV9NQURWX01FUkdFQUJMRSBRRU1VX01BRFZfSU5WQUxJRAorI2RlZmluZSBRRU1VX01BRFZfRE9OVERVTVAgUUVNVV9NQURWX0lOVkFMSUQKKyNkZWZpbmUgUUVNVV9NQURWX0hVR0VQQUdFICBRRU1VX01BRFZfSU5WQUxJRAorCisjZW5kaWYKKworaW50IHFlbXVfbWFkdmlzZSh2b2lkICphZGRyLCBzaXplX3QgbGVuLCBpbnQgYWR2aWNlKTsKKworaW50IHFlbXVfb3Blbihjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MsIC4uLik7CitpbnQgcWVtdV9jbG9zZShpbnQgZmQpOworCisjaWYgZGVmaW5lZChfX0hBSUtVX18pICYmIGRlZmluZWQoX19pMzg2X18pCisjZGVmaW5lIEZNVF9waWQgIiVsZCIKKyNlbGlmIGRlZmluZWQoV0lONjQpCisjZGVmaW5lIEZNVF9waWQgIiUiIFBSSWQ2NAorI2Vsc2UKKyNkZWZpbmUgRk1UX3BpZCAiJWQiCisjZW5kaWYKKworaW50IHFlbXVfY3JlYXRlX3BpZGZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpOworaW50IHFlbXVfZ2V0X3RocmVhZF9pZCh2b2lkKTsKKworI2lmbmRlZiBDT05GSUdfSU9WRUMKK3N0cnVjdCBpb3ZlYyB7CisgICAgdm9pZCAqaW92X2Jhc2U7CisgICAgc2l6ZV90IGlvdl9sZW47Cit9OworLyoKKyAqIFVzZSB0aGUgc2FtZSB2YWx1ZSBhcyBMaW51eCBmb3Igbm93LgorICovCisjZGVmaW5lIElPVl9NQVggMTAyNAorCitzc2l6ZV90IHJlYWR2KGludCBmZCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfY250KTsKK3NzaXplX3Qgd3JpdGV2KGludCBmZCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfY250KTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X3RpbWVyc3ViKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp2YWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnZhbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqcmVzKQoreworICAgIHJlcy0+dHZfc2VjID0gdmFsMS0+dHZfc2VjIC0gdmFsMi0+dHZfc2VjOworICAgIGlmICh2YWwxLT50dl91c2VjIDwgdmFsMi0+dHZfdXNlYykgeworICAgICAgICByZXMtPnR2X3NlYy0tOworICAgICAgICByZXMtPnR2X3VzZWMgPSB2YWwxLT50dl91c2VjIC0gdmFsMi0+dHZfdXNlYyArIDEwMDAgKiAxMDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcy0+dHZfdXNlYyA9IHZhbDEtPnR2X3VzZWMgLSB2YWwyLT50dl91c2VjOworICAgIH0KK30KKyNlbHNlCisjZGVmaW5lIHFlbXVfdGltZXJzdWIgdGltZXJzdWIKKyNkZWZpbmUgZmZzIF9fYnVpbHRpbl9mZnMKKyNlbmRpZgorCit2b2lkIHFlbXVfc2V0X2Nsb2V4ZWMoaW50IGZkKTsKKwordm9pZCBxZW11X3NldF92ZXJzaW9uKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICpxZW11X2dldF92ZXJzaW9uKHZvaWQpOworCit2b2lkIGZpcHNfc2V0X3N0YXRlKGJvb2wgcmVxdWVzdGVkKTsKK2Jvb2wgZmlwc19nZXRfc3RhdGUodm9pZCk7CisKKy8qIFJldHVybiBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwYXRobmFtZSBkZW5vdGluZyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgaXMKKyAqIGFwcHJvcHJpYXRlIGZvciBzdG9yaW5nIGxvY2FsIHN0YXRlLgorICoKKyAqIEByZWxhdGl2ZV9wYXRobmFtZSBuZWVkIG5vdCBzdGFydCB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvcjsgb25lIHdpbGwgYmUKKyAqIGFkZGVkIGF1dG9tYXRpY2FsbHkuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSB2YWx1ZSByZXR1cm5lZCB3aXRoIGdfZnJlZSgpCisgKiBhZnRlciB1c2UuCisgKi8KK2NoYXIgKnFlbXVfZ2V0X2xvY2FsX3N0YXRlX3BhdGhuYW1lKGNvbnN0IGNoYXIgKnJlbGF0aXZlX3BhdGhuYW1lKTsKKworLyoqCisgKiBxZW11X2dldGF1eHZhbDoKKyAqIEB0eXBlOiB0aGUgYXV4aWxpYXJ5IHZlY3RvciBrZXkgdG8gbG9va3VwCisgKgorICogU2VhcmNoIHRoZSBhdXhpbGlhcnkgdmVjdG9yIGZvciBAdHlwZSwgcmV0dXJuaW5nIHRoZSB2YWx1ZQorICogb3IgMCBpZiBAdHlwZSBpcyBub3QgcHJlc2VudC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0dFVEFVWFZBTCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCit1bnNpZ25lZCBsb25nIHFlbXVfZ2V0YXV4dmFsKHVuc2lnbmVkIGxvbmcgdHlwZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHFlbXVfZ2V0YXV4dmFsKHVuc2lnbmVkIGxvbmcgdHlwZSkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKKy8qKgorICogcWVtdV9pbml0X2F1eHZhbDoKKyAqIEBlbnZwOiB0aGUgdGhpcmQgYXJndW1lbnQgdG8gbWFpbgorICoKKyAqIElmIHN1cHBvcnRlZCBhbmQgcmVxdWlyZWQsIGxvY2F0ZSB0aGUgYXV4aWxpYXJ5IHZlY3RvciBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19HRVRBVVhWQUwpIHx8ICFkZWZpbmVkKF9fbGludXhfXykKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZW11X2luaXRfYXV4dmFsKGNoYXIgKiplbnZwKSB7IH0KKyNlbHNlCit2b2lkIHFlbXVfaW5pdF9hdXh2YWwoY2hhciAqKmVudnApOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvcXVldWUuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzM2I5MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3F1ZXVlLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qICAgICAgJE5ldEJTRDogcXVldWUuaCx2IDEuNTIgMjAwOS8wNC8yMCAwOTo1NjowOCBtc2NodWV0dCBFeHAgJCAqLworCisvKgorICogUUVNVSB2ZXJzaW9uOiBDb3B5IGZyb20gbmV0YnNkLCByZW1vdmVkIGRlYnVnIGNvZGUsIHJlbW92ZWQgc29tZSBvZgorICogdGhlIGltcGxlbWVudGF0aW9ucy4gIExlZnQgaW4gc2luZ2x5LWxpbmtlZCBsaXN0cywgbGlzdHMsIHNpbXBsZQorICogcXVldWVzLCBhbmQgdGFpbCBxdWV1ZXMuCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogICAgICBAKCMpcXVldWUuaCAgICAgOC41IChCZXJrZWxleSkgOC8yMC85NAorICovCisKKyNpZm5kZWYgUUVNVV9TWVNfUVVFVUVfSF8KKyNkZWZpbmUgUUVNVV9TWVNfUVVFVUVfSF8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGZvdXIgdHlwZXMgb2YgZGF0YSBzdHJ1Y3R1cmVzOiBzaW5nbHktbGlua2VkIGxpc3RzLAorICogbGlzdHMsIHNpbXBsZSBxdWV1ZXMsIGFuZCB0YWlsIHF1ZXVlcy4KKyAqCisgKiBBIHNpbmdseS1saW5rZWQgbGlzdCBpcyBoZWFkZWQgYnkgYSBzaW5nbGUgZm9yd2FyZCBwb2ludGVyLiBUaGUKKyAqIGVsZW1lbnRzIGFyZSBzaW5nbHkgbGlua2VkIGZvciBtaW5pbXVtIHNwYWNlIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbgorICogb3ZlcmhlYWQgYXQgdGhlIGV4cGVuc2Ugb2YgTyhuKSByZW1vdmFsIGZvciBhcmJpdHJhcnkgZWxlbWVudHMuIE5ldworICogZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiAgRWxlbWVudHMgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBsaXN0CisgKiBzaG91bGQgdXNlIHRoZSBleHBsaWNpdCBtYWNybyBmb3IgdGhpcyBwdXJwb3NlIGZvciBvcHRpbXVtCisgKiBlZmZpY2llbmN5LiBBIHNpbmdseS1saW5rZWQgbGlzdCBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQKKyAqIGRpcmVjdGlvbi4gIFNpbmdseS1saW5rZWQgbGlzdHMgYXJlIGlkZWFsIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsYXJnZQorICogZGF0YXNldHMgYW5kIGZldyBvciBubyByZW1vdmFscyBvciBmb3IgaW1wbGVtZW50aW5nIGEgTElGTyBxdWV1ZS4KKyAqCisgKiBBIGxpc3QgaXMgaGVhZGVkIGJ5IGEgc2luZ2xlIGZvcndhcmQgcG9pbnRlciAob3IgYW4gYXJyYXkgb2YgZm9yd2FyZAorICogcG9pbnRlcnMgZm9yIGEgaGFzaCB0YWJsZSBoZWFkZXIpLiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseSBsaW5rZWQKKyAqIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZQorICogb3IgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gQSBsaXN0CisgKiBtYXkgb25seSBiZSB0cmF2ZXJzZWQgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uLgorICoKKyAqIEEgc2ltcGxlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBzaW5nbHkKKyAqIGxpbmtlZCB0byBzYXZlIHNwYWNlLCBzbyBlbGVtZW50cyBjYW4gb25seSBiZSByZW1vdmVkIGZyb20gdGhlCisgKiBoZWFkIG9mIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGFmdGVyCisgKiBhbiBleGlzdGluZyBlbGVtZW50LCBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IgYXQgdGhlIGVuZCBvZiB0aGUKKyAqIGxpc3QuIEEgc2ltcGxlIHF1ZXVlIG1heSBvbmx5IGJlIHRyYXZlcnNlZCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCisgKgorICogQSB0YWlsIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IKKyAqIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mCisgKiB0aGUgbGlzdC4gQSB0YWlsIHF1ZXVlIG1heSBiZSB0cmF2ZXJzZWQgaW4gZWl0aGVyIGRpcmVjdGlvbi4KKyAqCisgKiBGb3IgZGV0YWlscyBvbiB0aGUgdXNlIG9mIHRoZXNlIG1hY3Jvcywgc2VlIHRoZSBxdWV1ZSgzKSBtYW51YWwgcGFnZS4KKyAqLworCisjaW5jbHVkZSAicWVtdS9hdG9taWMuaCIgLyogZm9yIHNtcF93bWIoKSAqLworCisvKgorICogTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBRTElTVF9IRUFEKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IG5hbWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgdHlwZSAqbGhfZmlyc3Q7ICAvKiBmaXJzdCBlbGVtZW50ICovICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFFMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgTlVMTCB9CisKKyNkZWZpbmUgUUxJU1RfRU5UUlkodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IHR5cGUgKmxlX25leHQ7ICAgLyogbmV4dCBlbGVtZW50ICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RydWN0IHR5cGUgKipsZV9wcmV2OyAgLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8gIFwKK30KKworLyoKKyAqIExpc3QgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIFFMSVNUX0lOSVQoaGVhZCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChoZWFkKS0+bGhfZmlyc3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRTElTVF9JTlNFUlRfQUZURVIobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKChlbG0pLT5maWVsZC5sZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5sZV9uZXh0KSAhPSBOVUxMKSAgXAorICAgICAgICAgICAgICAgIChsaXN0ZWxtKS0+ZmllbGQubGVfbmV4dC0+ZmllbGQubGVfcHJldiA9ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAmKGVsbSktPmZpZWxkLmxlX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAobGlzdGVsbSktPmZpZWxkLmxlX25leHQgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZWxtKS0+ZmllbGQubGVfcHJldiA9ICYobGlzdGVsbSktPmZpZWxkLmxlX25leHQ7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUUxJU1RfSU5TRVJUX0JFRk9SRShsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGVsbSktPmZpZWxkLmxlX3ByZXYgPSAobGlzdGVsbSktPmZpZWxkLmxlX3ByZXY7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGVsbSktPmZpZWxkLmxlX25leHQgPSAobGlzdGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKihsaXN0ZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGxpc3RlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihlbG0pLT5maWVsZC5sZV9uZXh0OyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKGVsbSktPmZpZWxkLmxlX25leHQgPSAoaGVhZCktPmxoX2ZpcnN0KSAhPSBOVUxMKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDtcCisgICAgICAgIChoZWFkKS0+bGhfZmlyc3QgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChlbG0pLT5maWVsZC5sZV9wcmV2ID0gJihoZWFkKS0+bGhfZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRTElTVF9JTlNFUlRfSEVBRF9SQ1UoaGVhZCwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZWxtKS0+ZmllbGQubGVfcHJldiA9ICYoaGVhZCktPmxoX2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZWxtKS0+ZmllbGQubGVfbmV4dCA9IChoZWFkKS0+bGhfZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzbXBfd21iKCk7IC8qIGZpbGwgZWxtIGJlZm9yZSBsaW5raW5nIGl0ICovICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGhlYWQpLT5saF9maXJzdCAhPSBOVUxMKSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGhlYWQpLT5saF9maXJzdC0+ZmllbGQubGVfcHJldiA9ICYoZWxtKS0+ZmllbGQubGVfbmV4dDsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoaGVhZCktPmxoX2ZpcnN0ID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzbXBfd21iKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLyogQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFMSVNUX1JFTU9WRShlbG0sIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoZWxtKS0+ZmllbGQubGVfbmV4dCAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGVsbSktPmZpZWxkLmxlX25leHQtPmZpZWxkLmxlX3ByZXYgPSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChlbG0pLT5maWVsZC5sZV9wcmV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooZWxtKS0+ZmllbGQubGVfcHJldiA9IChlbG0pLT5maWVsZC5sZV9uZXh0OyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKCh2YXIpID0gKChoZWFkKS0+bGhfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpID0gKCh2YXIpLT5maWVsZC5sZV9uZXh0KSkKKworI2RlZmluZSBRTElTVF9GT1JFQUNIX1NBRkUodmFyLCBoZWFkLCBmaWVsZCwgbmV4dF92YXIpICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKCh2YXIpID0gKChoZWFkKS0+bGhfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpICYmICgobmV4dF92YXIpID0gKCh2YXIpLT5maWVsZC5sZV9uZXh0KSwgMSk7ICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpID0gKG5leHRfdmFyKSkKKworLyoKKyAqIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUgUUxJU1RfRU1QVFkoaGVhZCkgICAgICAgICAgICAgICAgKChoZWFkKS0+bGhfZmlyc3QgPT0gTlVMTCkKKyNkZWZpbmUgUUxJU1RfRklSU1QoaGVhZCkgICAgICAgICAgICAgICAgKChoZWFkKS0+bGhfZmlyc3QpCisjZGVmaW5lIFFMSVNUX05FWFQoZWxtLCBmaWVsZCkgICAgICAgICAgICgoZWxtKS0+ZmllbGQubGVfbmV4dCkKKworCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFFTTElTVF9IRUFEKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IG5hbWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgdHlwZSAqc2xoX2ZpcnN0OyAvKiBmaXJzdCBlbGVtZW50ICovICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFFTTElTVF9IRUFEX0lOSVRJQUxJWkVSKGhlYWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7IE5VTEwgfQorCisjZGVmaW5lIFFTTElTVF9FTlRSWSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7ICAvKiBuZXh0IGVsZW1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBRU0xJU1RfSU5JVChoZWFkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpLT5zbGhfZmlyc3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFTTElTVF9JTlNFUlRfQUZURVIoc2xpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZWxtKS0+ZmllbGQuc2xlX25leHQgPSAoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dDsgICAgICAgICAgICAgXAorICAgICAgICAoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChlbG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUVNMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChoZWFkKS0+c2xoX2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChoZWFkKS0+c2xoX2ZpcnN0ID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRU0xJU1RfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpLT5zbGhfZmlyc3QgPSAoaGVhZCktPnNsaF9maXJzdC0+ZmllbGQuc2xlX25leHQ7ICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFTTElTVF9SRU1PVkVfQUZURVIoc2xpc3RlbG0sIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoc2xpc3RlbG0pLT5maWVsZC5zbGVfbmV4dCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUVNMSVNUX05FWFQoUVNMSVNUX05FWFQoKHNsaXN0ZWxtKSwgZmllbGQpLCBmaWVsZCk7ICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRU0xJU1RfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCh2YXIpID0gKGhlYWQpLT5zbGhfZmlyc3Q7ICh2YXIpOyAodmFyKSA9ICh2YXIpLT5maWVsZC5zbGVfbmV4dCkKKworI2RlZmluZSBRU0xJU1RfRk9SRUFDSF9TQUZFKHZhciwgaGVhZCwgZmllbGQsIHR2YXIpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICgodmFyKSA9IFFTTElTVF9GSVJTVCgoaGVhZCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodmFyKSAmJiAoKHR2YXIpID0gUVNMSVNUX05FWFQoKHZhciksIGZpZWxkKSwgMSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgKHZhcikgPSAodHZhcikpCisKKy8qCisgKiBTaW5nbHktbGlua2VkIExpc3QgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUgUVNMSVNUX0VNUFRZKGhlYWQpICAgICAgICgoaGVhZCktPnNsaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZSBRU0xJU1RfRklSU1QoaGVhZCkgICAgICAgKChoZWFkKS0+c2xoX2ZpcnN0KQorI2RlZmluZSBRU0xJU1RfTkVYVChlbG0sIGZpZWxkKSAgKChlbG0pLT5maWVsZC5zbGVfbmV4dCkKKworCisvKgorICogU2ltcGxlIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIFFTSU1QTEVRX0hFQUQobmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdHJ1Y3QgbmFtZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IHR5cGUgKnNxaF9maXJzdDsgICAgLyogZmlyc3QgZWxlbWVudCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IHR5cGUgKipzcWhfbGFzdDsgICAgLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLyAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUVNJTVBMRVFfSEVBRF9JTklUSUFMSVpFUihoZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IE5VTEwsICYoaGVhZCkuc3FoX2ZpcnN0IH0KKworI2RlZmluZSBRU0lNUExFUV9FTlRSWSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCB0eXBlICpzcWVfbmV4dDsgICAgLyogbmV4dCBlbGVtZW50ICovICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKgorICogU2ltcGxlIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBRU0lNUExFUV9JTklUKGhlYWQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKS0+c3FoX2ZpcnN0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChoZWFkKS0+c3FoX2xhc3QgPSAmKGhlYWQpLT5zcWhfZmlyc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUVNJTVBMRVFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChoZWFkKS0+c3FoX2ZpcnN0KSA9PSBOVUxMKSAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFTSU1QTEVRX0lOU0VSVF9UQUlMKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKihoZWFkKS0+c3FoX2xhc3QgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQuc3FlX25leHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRU0lNUExFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgXAorICAgIGlmICgoKGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgICAgXAorICAgICAgICAoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUVNJTVBMRVFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChoZWFkKS0+c3FoX2ZpcnN0ID0gKGhlYWQpLT5zcWhfZmlyc3QtPmZpZWxkLnNxZV9uZXh0KSA9PSBOVUxMKVwKKyAgICAgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoaGVhZCktPnNxaF9maXJzdDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFTSU1QTEVRX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChoZWFkKS0+c3FoX2ZpcnN0ID09IChlbG0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFFTSU1QTEVRX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cnVjdCB0eXBlICpjdXJlbG0gPSAoaGVhZCktPnNxaF9maXJzdDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChjdXJlbG0tPmZpZWxkLnNxZV9uZXh0ICE9IChlbG0pKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJlbG0gPSBjdXJlbG0tPmZpZWxkLnNxZV9uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoY3VyZWxtLT5maWVsZC5zcWVfbmV4dCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJlbG0tPmZpZWxkLnNxZV9uZXh0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT5zcWhfbGFzdCA9ICYoY3VyZWxtKS0+ZmllbGQuc3FlX25leHQ7ICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRU0lNUExFUV9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoKHZhcikgPSAoKGhlYWQpLT5zcWhfZmlyc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFyKSA9ICgodmFyKS0+ZmllbGQuc3FlX25leHQpKQorCisjZGVmaW5lIFFTSU1QTEVRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCBuZXh0KSAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICgodmFyKSA9ICgoaGVhZCktPnNxaF9maXJzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2YXIpICYmICgobmV4dCA9ICgodmFyKS0+ZmllbGQuc3FlX25leHQpKSwgMSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2YXIpID0gKG5leHQpKQorCisjZGVmaW5lIFFTSU1QTEVRX0NPTkNBVChoZWFkMSwgaGVhZDIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFRU0lNUExFUV9FTVBUWSgoaGVhZDIpKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooaGVhZDEpLT5zcWhfbGFzdCA9IChoZWFkMiktPnNxaF9maXJzdDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChoZWFkMSktPnNxaF9sYXN0ID0gKGhlYWQyKS0+c3FoX2xhc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFFTSU1QTEVRX0lOSVQoKGhlYWQyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRU0lNUExFUV9MQVNUKGhlYWQsIHR5cGUsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChRU0lNUExFUV9FTVBUWSgoaGVhZCkpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOVUxMIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKChzdHJ1Y3QgdHlwZSAqKSh2b2lkICopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGNoYXIgKikoKGhlYWQpLT5zcWhfbGFzdCkgLSBvZmZzZXRvZihzdHJ1Y3QgdHlwZSwgZmllbGQpKSkpCisKKy8qCisgKiBTaW1wbGUgcXVldWUgYWNjZXNzIG1ldGhvZHMuCisgKi8KKyNkZWZpbmUgUVNJTVBMRVFfRU1QVFkoaGVhZCkgICAgICAgICgoaGVhZCktPnNxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZSBRU0lNUExFUV9GSVJTVChoZWFkKSAgICAgICAgKChoZWFkKS0+c3FoX2ZpcnN0KQorI2RlZmluZSBRU0lNUExFUV9ORVhUKGVsbSwgZmllbGQpICAgKChlbG0pLT5maWVsZC5zcWVfbmV4dCkKKworCisvKgorICogVGFpbCBxdWV1ZSBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBRX1RBSUxRX0hFQUQobmFtZSwgdHlwZSwgcXVhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IG5hbWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBxdWFsIHR5cGUgKnRxaF9maXJzdDsgICAgICAgICAgIC8qIGZpcnN0IGVsZW1lbnQgKi8gICAgICAgICAgICAgXAorICAgICAgICBxdWFsIHR5cGUgKnF1YWwgKnRxaF9sYXN0OyAgICAgIC8qIGFkZHIgb2YgbGFzdCBuZXh0IGVsZW1lbnQgKi8gXAorfQorI2RlZmluZSBRVEFJTFFfSEVBRChuYW1lLCB0eXBlKSAgUV9UQUlMUV9IRUFEKG5hbWUsIHN0cnVjdCB0eXBlLCkKKworI2RlZmluZSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihoZWFkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7IE5VTEwsICYoaGVhZCkudHFoX2ZpcnN0IH0KKworI2RlZmluZSBRX1RBSUxRX0VOVFJZKHR5cGUsIHF1YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBxdWFsIHR5cGUgKnRxZV9uZXh0OyAgICAgICAgICAgIC8qIG5leHQgZWxlbWVudCAqLyAgICAgICAgICAgICAgXAorICAgICAgICBxdWFsIHR5cGUgKnF1YWwgKnRxZV9wcmV2OyAgICAgIC8qIGFkZHJlc3Mgb2YgcHJldmlvdXMgbmV4dCBlbGVtZW50ICovXAorfQorI2RlZmluZSBRVEFJTFFfRU5UUlkodHlwZSkgICAgICAgUV9UQUlMUV9FTlRSWShzdHJ1Y3QgdHlwZSwpCisKKy8qCisgKiBUYWlsIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBRVEFJTFFfSU5JVChoZWFkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoaGVhZCktPnRxaF9maXJzdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoaGVhZCktPnRxaF9sYXN0ID0gJihoZWFkKS0+dHFoX2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUVRBSUxRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCgoZWxtKS0+ZmllbGQudHFlX25leHQgPSAoaGVhZCktPnRxaF9maXJzdCkgIT0gTlVMTCkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoaGVhZCktPnRxaF9maXJzdC0+ZmllbGQudHFlX3ByZXYgPSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsgICAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpLT50cWhfZmlyc3QgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gJihoZWFkKS0+dHFoX2ZpcnN0OyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFUQUlMUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChlbG0pLT5maWVsZC50cWVfbmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChlbG0pLT5maWVsZC50cWVfcHJldiA9IChoZWFkKS0+dHFoX2xhc3Q7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICooaGVhZCktPnRxaF9sYXN0ID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpXAorICAgICAgICAgICAgICAgIChlbG0pLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OyAgICAgICAgICAgICAgXAorICAgICAgICAobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dDsgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLzApCisKKyNkZWZpbmUgUVRBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldjsgICAgICAgICAgICAgIFwKKyAgICAgICAgKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGxpc3RlbG0pLT5maWVsZC50cWVfcHJldiA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8wKQorCisjZGVmaW5lIFFUQUlMUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGVsbSktPmZpZWxkLnRxZV9uZXh0LT5maWVsZC50cWVfcHJldiA9ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIChlbG0pLT5maWVsZC50cWVfcHJldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pLT5maWVsZC50cWVfcHJldjsgICAgICAgICAgICAgICBcCisgICAgICAgICooZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKS0+ZmllbGQudHFlX25leHQ7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovMCkKKworI2RlZmluZSBRVEFJTFFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKCh2YXIpID0gKChoZWFkKS0+dHFoX2ZpcnN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpID0gKCh2YXIpLT5maWVsZC50cWVfbmV4dCkpCisKKyNkZWZpbmUgUVRBSUxRX0ZPUkVBQ0hfU0FGRSh2YXIsIGhlYWQsIGZpZWxkLCBuZXh0X3ZhcikgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICgodmFyKSA9ICgoaGVhZCktPnRxaF9maXJzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodmFyKSAmJiAoKG5leHRfdmFyKSA9ICgodmFyKS0+ZmllbGQudHFlX25leHQpLCAxKTsgICAgIFwKKyAgICAgICAgICAgICAgICAodmFyKSA9IChuZXh0X3ZhcikpCisKKyNkZWZpbmUgUVRBSUxRX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGhlYWQsIGhlYWRuYW1lLCBmaWVsZCkgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICgodmFyKSA9ICgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKTsgICAgXAorICAgICAgICAgICAgICAgICh2YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICh2YXIpID0gKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKHZhciktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkpCisKKy8qCisgKiBUYWlsIHF1ZXVlIGFjY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lIFFUQUlMUV9FTVBUWShoZWFkKSAgICAgICAgICAgICAgICgoaGVhZCktPnRxaF9maXJzdCA9PSBOVUxMKQorI2RlZmluZSBRVEFJTFFfRklSU1QoaGVhZCkgICAgICAgICAgICAgICAoKGhlYWQpLT50cWhfZmlyc3QpCisjZGVmaW5lIFFUQUlMUV9ORVhUKGVsbSwgZmllbGQpICAgICAgICAgICgoZWxtKS0+ZmllbGQudHFlX25leHQpCisKKyNkZWZpbmUgUVRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpIFwKKyAgICAgICAgKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGhlYWQpLT50cWhfbGFzdCkpLT50cWhfbGFzdCkpCisjZGVmaW5lIFFUQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKSBcCisgICAgICAgICgqKCgoc3RydWN0IGhlYWRuYW1lICopKChlbG0pLT5maWVsZC50cWVfcHJldikpLT50cWhfbGFzdCkpCisKKyNlbmRpZiAgLyogIVFFTVVfU1lTX1FVRVVFX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9yYW5nZS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvcmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU5NzIwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvcmFuZ2UuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIFFFTVVfUkFOR0VfSAorI2RlZmluZSBRRU1VX1JBTkdFX0gKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cWVtdS90eXBlZGVmcy5oPgorCisvKgorICogT3BlcmF0aW9ucyBvbiA2NCBiaXQgYWRkcmVzcyByYW5nZXMuCisgKiBOb3RlczoKKyAqICAgLSByYW5nZXMgbXVzdCBub3Qgd3JhcCBhcm91bmQgMCwgYnV0IGNhbiBpbmNsdWRlIHRoZSBsYXN0IGJ5dGUgfjB4MExMLgorICogICAtIHRoaXMgY2FuIG5vdCByZXByZXNlbnQgYSBmdWxsIDAgdG8gfjB4MExMIHJhbmdlLgorICovCisKKy8qIEEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHJhbmdlIG9mIGFkZHJlc3Nlcy4gKi8KK3N0cnVjdCBSYW5nZSB7CisgICAgdWludDY0X3QgYmVnaW47IC8qIEZpcnN0IGJ5dGUgb2YgdGhlIHJhbmdlLCBvciAwIGlmIGVtcHR5LiAqLworICAgIHVpbnQ2NF90IGVuZDsgICAvKiAxICsgdGhlIGxhc3QgYnl0ZS4gMCBpZiByYW5nZSBlbXB0eSBvciBlbmRzIGF0IH4weDBMTC4gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYW5nZV9leHRlbmQoUmFuZ2UgKnJhbmdlLCBSYW5nZSAqZXh0ZW5kX2J5KQoreworICAgIGlmICghZXh0ZW5kX2J5LT5iZWdpbiAmJiAhZXh0ZW5kX2J5LT5lbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXJhbmdlLT5iZWdpbiAmJiAhcmFuZ2UtPmVuZCkgeworICAgICAgICAqcmFuZ2UgPSAqZXh0ZW5kX2J5OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChyYW5nZS0+YmVnaW4gPiBleHRlbmRfYnktPmJlZ2luKSB7CisgICAgICAgIHJhbmdlLT5iZWdpbiA9IGV4dGVuZF9ieS0+YmVnaW47CisgICAgfQorICAgIC8qIENvbXBhcmUgbGFzdCBieXRlIGluIGNhc2UgcmVnaW9uIGVuZHMgYXQgfjB4MExMICovCisgICAgaWYgKHJhbmdlLT5lbmQgLSAxIDwgZXh0ZW5kX2J5LT5lbmQgLSAxKSB7CisgICAgICAgIHJhbmdlLT5lbmQgPSBleHRlbmRfYnktPmVuZDsKKyAgICB9Cit9CisKKy8qIEdldCBsYXN0IGJ5dGUgb2YgYSByYW5nZSBmcm9tIG9mZnNldCArIGxlbmd0aC4KKyAqIFVuZGVmaW5lZCBmb3IgcmFuZ2VzIHRoYXQgd3JhcCBhcm91bmQgMC4gKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgcmFuZ2VfZ2V0X2xhc3QodWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBsZW4pCit7CisgICAgcmV0dXJuIG9mZnNldCArIGxlbiAtIDE7Cit9CisKKy8qIENoZWNrIHdoZXRoZXIgYSBnaXZlbiByYW5nZSBjb3ZlcnMgYSBnaXZlbiBieXRlLiAqLworc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfY292ZXJzX2J5dGUodWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBieXRlKQoreworICAgIHJldHVybiBvZmZzZXQgPD0gYnl0ZSAmJiBieXRlIDw9IHJhbmdlX2dldF9sYXN0KG9mZnNldCwgbGVuKTsKK30KKworLyogQ2hlY2sgd2hldGhlciAyIGdpdmVuIHJhbmdlcyBvdmVybGFwLgorICogVW5kZWZpbmVkIGlmIHJhbmdlcyB0aGF0IHdyYXAgYXJvdW5kIDAuICovCitzdGF0aWMgaW5saW5lIGludCByYW5nZXNfb3ZlcmxhcCh1aW50NjRfdCBmaXJzdDEsIHVpbnQ2NF90IGxlbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmaXJzdDIsIHVpbnQ2NF90IGxlbjIpCit7CisgICAgdWludDY0X3QgbGFzdDEgPSByYW5nZV9nZXRfbGFzdChmaXJzdDEsIGxlbjEpOworICAgIHVpbnQ2NF90IGxhc3QyID0gcmFuZ2VfZ2V0X2xhc3QoZmlyc3QyLCBsZW4yKTsKKworICAgIHJldHVybiAhKGxhc3QyIDwgZmlyc3QxIHx8IGxhc3QxIDwgZmlyc3QyKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9zb2NrZXRzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS9zb2NrZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4ZDgxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3NvY2tldHMuaApAQCAtMCwwICsxLDMyIEBACisvKiBoZWFkZXJzIHRvIHVzZSB0aGUgQlNEIHNvY2tldHMgKi8KKyNpZm5kZWYgUUVNVV9fU09DS0VUX0gKKyNkZWZpbmUgUUVNVV9fU09DS0VUX0gKKworI2luY2x1ZGUgInFlbXUvb3B0aW9uLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKyNkZWZpbmUgIHNvY2tldF9lcnJvcigpICBlcnJubworI2RlZmluZSAgY2xvc2Vzb2NrZXQgICAgIHNvY2tldF9jbG9zZQorCisvKiBOZXcsIGlwdjYtcmVhZHkgc29ja2V0IGhlbHBlciBmdW5jdGlvbnMsIHNlZSBxZW11LXNvY2tldHMuYyAqLworaW50IGluZXRfbGlzdGVuX29wdHMoUWVtdU9wdHMgKm9wdHMsIGludCBwb3J0X29mZnNldCk7CitpbnQgaW5ldF9saXN0ZW4oY29uc3QgY2hhciAqc3RyLCBjaGFyICpvc3RyLCBpbnQgb2xlbiwKKyAgICAgICAgICAgICAgICBpbnQgc29ja3R5cGUsIGludCBwb3J0X29mZnNldCk7CitpbnQgaW5ldF9jb25uZWN0X29wdHMoUWVtdU9wdHMgKm9wdHMpOworaW50IGluZXRfY29ubmVjdChjb25zdCBjaGFyICpzdHIsIGludCBzb2NrdHlwZSk7CitpbnQgaW5ldF9kZ3JhbV9vcHRzKFFlbXVPcHRzICpvcHRzKTsKK2NvbnN0IGNoYXIgKmluZXRfc3RyZmFtaWx5KGludCBmYW1pbHkpOworCitpbnQgdW5peF9saXN0ZW5fb3B0cyhRZW11T3B0cyAqb3B0cyk7CitpbnQgdW5peF9saXN0ZW4oY29uc3QgY2hhciAqcGF0aCwgY2hhciAqb3N0ciwgaW50IG9sZW4pOworaW50IHVuaXhfY29ubmVjdF9vcHRzKFFlbXVPcHRzICpvcHRzKTsKK2ludCB1bml4X2Nvbm5lY3QoY29uc3QgY2hhciAqcGF0aCk7CisKKy8qIE9sZCwgaXB2NCBvbmx5IGJpdHMuICBEb24ndCB1c2UgZm9yIG5ldyBjb2RlLiAqLworaW50IHBhcnNlX2hvc3RfcG9ydChTb2NrQWRkcmVzcyogIHNhZGRyLCBjb25zdCBjaGFyICpzdHIpOworaW50IHBhcnNlX2hvc3Rfc3JjX3BvcnQoU29ja0FkZHJlc3MqICBoYWRkciwgU29ja0FkZHJlc3MqICBzYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cik7CisKK3ZvaWQgcWVtdV9zZXRfYmxvY2soaW50IGZkKTsKKworI2VuZGlmIC8qIFFFTVVfX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90aHJlYWQtcG9zaXguaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RocmVhZC1wb3NpeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNWM3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90aHJlYWQtcG9zaXguaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIF9fUUVNVV9USFJFQURfUE9TSVhfSAorI2RlZmluZSBfX1FFTVVfVEhSRUFEX1BPU0lYX0ggMQorI2luY2x1ZGUgInB0aHJlYWQuaCIKKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKworc3RydWN0IFFlbXVNdXRleCB7CisgICAgcHRocmVhZF9tdXRleF90IGxvY2s7Cit9OworCitzdHJ1Y3QgUWVtdUNvbmQgeworICAgIHB0aHJlYWRfY29uZF90IGNvbmQ7Cit9OworCitzdHJ1Y3QgUWVtdVNlbWFwaG9yZSB7CisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKKyAgICBwdGhyZWFkX211dGV4X3QgbG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBjb25kOworICAgIHVuc2lnbmVkIGludCBjb3VudDsKKyNlbHNlCisgICAgc2VtX3Qgc2VtOworI2VuZGlmCit9OworCitzdHJ1Y3QgUWVtdUV2ZW50IHsKKyNpZm5kZWYgX19saW51eF9fCisgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyNlbmRpZgorICAgIHVuc2lnbmVkIHZhbHVlOworfTsKKworc3RydWN0IFFlbXVUaHJlYWQgeworICAgIHB0aHJlYWRfdCB0aHJlYWQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RocmVhZC13aW4zMi5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvdGhyZWFkLXdpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ODA4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RocmVhZC13aW4zMi5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX19RRU1VX1RIUkVBRF9XSU4zMl9ICisjZGVmaW5lIF9fUUVNVV9USFJFQURfV0lOMzJfSCAxCisjaW5jbHVkZSAid2luZG93cy5oIgorCitzdHJ1Y3QgUWVtdU11dGV4IHsKKyAgICBDUklUSUNBTF9TRUNUSU9OIGxvY2s7CisgICAgTE9ORyBvd25lcjsKK307CisKK3N0cnVjdCBRZW11Q29uZCB7CisgICAgTE9ORyB3YWl0ZXJzLCB0YXJnZXQ7CisgICAgSEFORExFIHNlbWE7CisgICAgSEFORExFIGNvbnRpbnVlX2V2ZW50OworfTsKKworc3RydWN0IFFlbXVTZW1hcGhvcmUgeworICAgIEhBTkRMRSBzZW1hOworfTsKKworc3RydWN0IFFlbXVFdmVudCB7CisgICAgSEFORExFIGV2ZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUWVtdVRocmVhZERhdGEgUWVtdVRocmVhZERhdGE7CitzdHJ1Y3QgUWVtdVRocmVhZCB7CisgICAgUWVtdVRocmVhZERhdGEgKmRhdGE7CisgICAgdW5zaWduZWQgdGlkOworfTsKKworLyogT25seSB2YWxpZCBmb3Igam9pbmFibGUgdGhyZWFkcy4gICovCitIQU5ETEUgcWVtdV90aHJlYWRfZ2V0X2hhbmRsZShRZW11VGhyZWFkICp0aHJlYWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RocmVhZC5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ZGEzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RocmVhZC5oCkBAIC0wLDAgKzEsNjUgQEAKKyNpZm5kZWYgX19RRU1VX1RIUkVBRF9ICisjZGVmaW5lIF9fUUVNVV9USFJFQURfSCAxCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwordHlwZWRlZiBzdHJ1Y3QgUWVtdU11dGV4IFFlbXVNdXRleDsKK3R5cGVkZWYgc3RydWN0IFFlbXVDb25kIFFlbXVDb25kOwordHlwZWRlZiBzdHJ1Y3QgUWVtdVNlbWFwaG9yZSBRZW11U2VtYXBob3JlOwordHlwZWRlZiBzdHJ1Y3QgUWVtdUV2ZW50IFFlbXVFdmVudDsKK3R5cGVkZWYgc3RydWN0IFFlbXVUaHJlYWQgUWVtdVRocmVhZDsKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgInFlbXUvdGhyZWFkLXdpbjMyLmgiCisjZWxzZQorI2luY2x1ZGUgInFlbXUvdGhyZWFkLXBvc2l4LmgiCisjZW5kaWYKKworI2RlZmluZSBRRU1VX1RIUkVBRF9KT0lOQUJMRSAwCisjZGVmaW5lIFFFTVVfVEhSRUFEX0RFVEFDSEVEIDEKKwordm9pZCBxZW11X211dGV4X2luaXQoUWVtdU11dGV4ICptdXRleCk7Cit2b2lkIHFlbXVfbXV0ZXhfZGVzdHJveShRZW11TXV0ZXggKm11dGV4KTsKK3ZvaWQgcWVtdV9tdXRleF9sb2NrKFFlbXVNdXRleCAqbXV0ZXgpOworaW50IHFlbXVfbXV0ZXhfdHJ5bG9jayhRZW11TXV0ZXggKm11dGV4KTsKK2ludCBxZW11X211dGV4X3RpbWVkbG9jayhRZW11TXV0ZXggKm11dGV4LCB1aW50NjRfdCBtc2Vjcyk7Cit2b2lkIHFlbXVfbXV0ZXhfdW5sb2NrKFFlbXVNdXRleCAqbXV0ZXgpOworCisjZGVmaW5lIHJjdV9yZWFkX2xvY2soKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHJjdV9yZWFkX3VubG9jaygpIGRvIHsgfSB3aGlsZSAoMCkKKwordm9pZCBxZW11X2NvbmRfaW5pdChRZW11Q29uZCAqY29uZCk7Cit2b2lkIHFlbXVfY29uZF9kZXN0cm95KFFlbXVDb25kICpjb25kKTsKKworLyoKKyAqIElNUE9SVEFOVDogVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHB0aHJlYWRfY29uZF9zaWduYWwKKyAqIGFuZCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0IGNhbiBiZSBjYWxsZWQgZXhjZXB0IHdoaWxlIHRoZSBzYW1lIG11dGV4IGlzCisgKiBoZWxkIGFzIGluIHRoZSBjb3JyZXNwb25kaW5nIHB0aHJlYWRfY29uZF93YWl0IGNhbGxzIQorICovCit2b2lkIHFlbXVfY29uZF9zaWduYWwoUWVtdUNvbmQgKmNvbmQpOwordm9pZCBxZW11X2NvbmRfYnJvYWRjYXN0KFFlbXVDb25kICpjb25kKTsKK3ZvaWQgcWVtdV9jb25kX3dhaXQoUWVtdUNvbmQgKmNvbmQsIFFlbXVNdXRleCAqbXV0ZXgpOworaW50IHFlbXVfY29uZF90aW1lZHdhaXQoUWVtdUNvbmQgKmNvbmQsIFFlbXVNdXRleCAqbXV0ZXgsIHVpbnQ2NF90IG1zZWNzKTsKKwordm9pZCBxZW11X3NlbV9pbml0KFFlbXVTZW1hcGhvcmUgKnNlbSwgaW50IGluaXQpOwordm9pZCBxZW11X3NlbV9wb3N0KFFlbXVTZW1hcGhvcmUgKnNlbSk7Cit2b2lkIHFlbXVfc2VtX3dhaXQoUWVtdVNlbWFwaG9yZSAqc2VtKTsKK2ludCBxZW11X3NlbV90aW1lZHdhaXQoUWVtdVNlbWFwaG9yZSAqc2VtLCBpbnQgbXMpOwordm9pZCBxZW11X3NlbV9kZXN0cm95KFFlbXVTZW1hcGhvcmUgKnNlbSk7CisKK3ZvaWQgcWVtdV9ldmVudF9pbml0KFFlbXVFdmVudCAqZXYsIGJvb2wgaW5pdCk7Cit2b2lkIHFlbXVfZXZlbnRfc2V0KFFlbXVFdmVudCAqZXYpOwordm9pZCBxZW11X2V2ZW50X3Jlc2V0KFFlbXVFdmVudCAqZXYpOwordm9pZCBxZW11X2V2ZW50X3dhaXQoUWVtdUV2ZW50ICpldik7Cit2b2lkIHFlbXVfZXZlbnRfZGVzdHJveShRZW11RXZlbnQgKmV2KTsKKwordm9pZCBxZW11X3RocmVhZF9jcmVhdGUoUWVtdVRocmVhZCAqdGhyZWFkLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnLCBpbnQgbW9kZSk7Cit2b2lkICpxZW11X3RocmVhZF9qb2luKFFlbXVUaHJlYWQgKnRocmVhZCk7Cit2b2lkIHFlbXVfdGhyZWFkX2dldF9zZWxmKFFlbXVUaHJlYWQgKnRocmVhZCk7Citib29sIHFlbXVfdGhyZWFkX2lzX3NlbGYoUWVtdVRocmVhZCAqdGhyZWFkKTsKK3ZvaWQgcWVtdV90aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3RpbWVyLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90aW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGYwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90aW1lci5oCkBAIC0wLDAgKzEsOTE2IEBACisjaWZuZGVmIFFFTVVfVElNRVJfSAorI2RlZmluZSBRRU1VX1RJTUVSX0gKKworI2luY2x1ZGUgInFlbXUvdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvbm90aWZ5LmgiCisKKy8qIHRpbWVycyAqLworCisjZGVmaW5lIFNDQUxFX01TIDEwMDAwMDAKKyNkZWZpbmUgU0NBTEVfVVMgMTAwMAorI2RlZmluZSBTQ0FMRV9OUyAxCisKKy8qKgorICogUUVNVUNsb2NrVHlwZToKKyAqCisgKiBUaGUgZm9sbG93aW5nIGNsb2NrIHR5cGVzIGFyZSBhdmFpbGFibGU6CisgKgorICogQFFFTVVfQ0xPQ0tfUkVBTFRJTUU6IFJlYWwgdGltZSBjbG9jaworICoKKyAqIFRoZSByZWFsIHRpbWUgY2xvY2sgc2hvdWxkIGJlIHVzZWQgb25seSBmb3Igc3R1ZmYgd2hpY2ggZG9lcyBub3QKKyAqIGNoYW5nZSB0aGUgdmlydHVhbCBtYWNoaW5lIHN0YXRlLCBhcyBpdCBpcyBydW4gZXZlbiBpZiB0aGUgdmlydHVhbAorICogbWFjaGluZSBpcyBzdG9wcGVkLiBUaGUgcmVhbCB0aW1lIGNsb2NrIGhhcyBhIGZyZXF1ZW5jeSBvZiAxMDAwCisgKiBIei4KKyAqCisgKiBAUUVNVV9DTE9DS19WSVJUVUFMOiB2aXJ0dWFsIGNsb2NrCisgKgorICogVGhlIHZpcnR1YWwgY2xvY2sgaXMgb25seSBydW4gZHVyaW5nIHRoZSBlbXVsYXRpb24uIEl0IGlzIHN0b3BwZWQKKyAqIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZSBpcyBzdG9wcGVkLiBWaXJ0dWFsIHRpbWVycyB1c2UgYSBoaWdoCisgKiBwcmVjaXNpb24gY2xvY2ssIHVzdWFsbHkgY3B1IGN5Y2xlcyAodXNlIHRpY2tzX3Blcl9zZWMpLgorICoKKyAqIEBRRU1VX0NMT0NLX0hPU1Q6IGhvc3QgY2xvY2sKKyAqCisgKiBUaGUgaG9zdCBjbG9jayBzaG91bGQgYmUgdXNlIGZvciBkZXZpY2UgbW9kZWxzIHRoYXQgZW11bGF0ZSBhY2N1cmF0ZQorICogcmVhbCB0aW1lIHNvdXJjZXMuIEl0IHdpbGwgY29udGludWUgdG8gcnVuIHdoZW4gdGhlIHZpcnR1YWwgbWFjaGluZQorICogaXMgc3VzcGVuZGVkLCBhbmQgaXQgd2lsbCByZWZsZWN0IHN5c3RlbSB0aW1lIGNoYW5nZXMgdGhlIGhvc3QgbWF5CisgKiB1bmRlcmdvIChlLmcuIGR1ZSB0byBOVFApLiBUaGUgaG9zdCBjbG9jayBoYXMgdGhlIHNhbWUgcHJlY2lzaW9uIGFzCisgKiB0aGUgdmlydHVhbCBjbG9jay4KKyAqLworCit0eXBlZGVmIGVudW0geworICAgIFFFTVVfQ0xPQ0tfUkVBTFRJTUUgPSAwLAorICAgIFFFTVVfQ0xPQ0tfVklSVFVBTCA9IDEsCisgICAgUUVNVV9DTE9DS19IT1NUID0gMiwKKyAgICBRRU1VX0NMT0NLX01BWAorfSBRRU1VQ2xvY2tUeXBlOworCit0eXBlZGVmIHN0cnVjdCBRRU1VVGltZXJMaXN0IFFFTVVUaW1lckxpc3Q7CisKK3N0cnVjdCBRRU1VVGltZXJMaXN0R3JvdXAgeworICAgIFFFTVVUaW1lckxpc3QgKnRsW1FFTVVfQ0xPQ0tfTUFYXTsKK307CisKK3R5cGVkZWYgdm9pZCBRRU1VVGltZXJDQih2b2lkICpvcGFxdWUpOwordHlwZWRlZiB2b2lkIFFFTVVUaW1lckxpc3ROb3RpZnlDQih2b2lkICpvcGFxdWUpOworCitzdHJ1Y3QgUUVNVVRpbWVyIHsKKyAgICBpbnQ2NF90IGV4cGlyZV90aW1lOyAgICAgICAgLyogaW4gbmFub3NlY29uZHMgKi8KKyAgICBRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0OworICAgIFFFTVVUaW1lckNCICpjYjsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgUUVNVVRpbWVyICpuZXh0OworICAgIGludCBzY2FsZTsKK307CisKK2V4dGVybiBRRU1VVGltZXJMaXN0R3JvdXAgbWFpbl9sb29wX3RsZzsKKworLyoKKyAqIFFFTVVDbG9ja1R5cGUKKyAqLworCisvKgorICogcWVtdV9jbG9ja19nZXRfbnM7CisgKiBAdHlwZTogdGhlIGNsb2NrIHR5cGUKKyAqCisgKiBHZXQgdGhlIG5hbm9zZWNvbmQgdmFsdWUgb2YgYSBjbG9jayB3aXRoCisgKiB0eXBlIEB0eXBlCisgKgorICogUmV0dXJuczogdGhlIGNsb2NrIHZhbHVlIGluIG5hbm9zZWNvbmRzCisgKi8KK2ludDY0X3QgcWVtdV9jbG9ja19nZXRfbnMoUUVNVUNsb2NrVHlwZSB0eXBlKTsKKworLyoqCisgKiBxZW11X2Nsb2NrX2dldF9tczsKKyAqIEB0eXBlOiB0aGUgY2xvY2sgdHlwZQorICoKKyAqIEdldCB0aGUgbWlsbGlzZWNvbmQgdmFsdWUgb2YgYSBjbG9jayB3aXRoCisgKiB0eXBlIEB0eXBlCisgKgorICogUmV0dXJuczogdGhlIGNsb2NrIHZhbHVlIGluIG1pbGxpc2Vjb25kcworICovCitzdGF0aWMgaW5saW5lIGludDY0X3QgcWVtdV9jbG9ja19nZXRfbXMoUUVNVUNsb2NrVHlwZSB0eXBlKQoreworICAgIHJldHVybiBxZW11X2Nsb2NrX2dldF9ucyh0eXBlKSAvIFNDQUxFX01TOworfQorCisvKioKKyAqIHFlbXVfY2xvY2tfZ2V0X3VzOworICogQHR5cGU6IHRoZSBjbG9jayB0eXBlCisgKgorICogR2V0IHRoZSBtaWNyb3NlY29uZCB2YWx1ZSBvZiBhIGNsb2NrIHdpdGgKKyAqIHR5cGUgQHR5cGUKKyAqCisgKiBSZXR1cm5zOiB0aGUgY2xvY2sgdmFsdWUgaW4gbWljcm9zZWNvbmRzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBxZW11X2Nsb2NrX2dldF91cyhRRU1VQ2xvY2tUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuIHFlbXVfY2xvY2tfZ2V0X25zKHR5cGUpIC8gU0NBTEVfVVM7Cit9CisKKy8qKgorICogcWVtdV9jbG9ja19oYXNfdGltZXJzOgorICogQHR5cGU6IHRoZSBjbG9jayB0eXBlCisgKgorICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2xvY2sncyBkZWZhdWx0IHRpbWVyIGxpc3QKKyAqIGhhcyB0aW1lcnMgYXR0YWNoZWQKKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgd2hlbiBvdGhlciB0aHJlYWRzIGFsc28gYWNjZXNzCisgKiB0aGUgdGltZXIgbGlzdC4gIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIG91dGRhdGVkIGJ5IHRoZSB0aW1lIGl0IGlzIGFjdGVkCisgKiB1cG9uLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIGNsb2NrJ3MgZGVmYXVsdCB0aW1lciBsaXN0CisgKiBoYXMgdGltZXJzIGF0dGFjaGVkCisgKi8KK2Jvb2wgcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVDbG9ja1R5cGUgdHlwZSk7CisKKy8qKgorICogcWVtdV9jbG9ja19leHBpcmVkOgorICogQHR5cGU6IHRoZSBjbG9jayB0eXBlCisgKgorICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgY2xvY2sncyBkZWZhdWx0IHRpbWVyIGxpc3QKKyAqIGhhcyBhbiBleHBpcmVkIGNsb2NrLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIGNsb2NrJ3MgZGVmYXVsdCB0aW1lciBsaXN0IGhhcworICogYW4gZXhwaXJlZCB0aW1lcgorICovCitib29sIHFlbXVfY2xvY2tfZXhwaXJlZChRRU1VQ2xvY2tUeXBlIHR5cGUpOworCisvKioKKyAqIHFlbXVfY2xvY2tfdXNlX2Zvcl9kZWFkbGluZToKKyAqIEB0eXBlOiB0aGUgY2xvY2sgdHlwZQorICoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgY2xvY2sgc2hvdWxkIGJlIHVzZWQgZm9yIGRlYWRsaW5lCisgKiBjYWxjdWxhdGlvbnMuIFNvbWUgY2xvY2tzLCBmb3IgaW5zdGFuY2Ugdm1fY2xvY2sgd2l0aAorICogdXNlX2ljb3VudCBzZXQsIGRvIG5vdCBjb3VudCBpbiBuYW5vc2Vjb25kcy4gU3VjaCBjbG9ja3MKKyAqIGFyZSBub3QgdXNlZCBmb3IgZGVhZGxpbmUgY2FsY3VsYXRpb25zLCBhbmQgYXJlIHByZXN1bWVkCisgKiB0byBpbnRlcnJ1cHQgYW55IHBvbGwgdXNpbmcgcWVtdV9ub3RpZnkvYWlvX25vdGlmeQorICogZXRjLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIGNsb2NrIHJ1bnMgaW4gbmFub3NlY29uZHMgYW5kCisgKiBzaG91bGQgYmUgdXNlZCBmb3IgYSBkZWFkbGluZS4KKyAqLworYm9vbCBxZW11X2Nsb2NrX3VzZV9mb3JfZGVhZGxpbmUoUUVNVUNsb2NrVHlwZSB0eXBlKTsKKworLyoqCisgKiBxZW11X2Nsb2NrX2RlYWRsaW5lX25zX2FsbDoKKyAqIEB0eXBlOiB0aGUgY2xvY2sgdHlwZQorICoKKyAqIENhbGN1bGF0ZSB0aGUgZGVhZGxpbmUgYWNyb3NzIGFsbCB0aW1lciBsaXN0cyBhc3NvY2lhdGVkCisgKiB3aXRoIGEgY2xvY2sgKGFzIG9wcG9zZWQgdG8ganVzdCB0aGUgZGVmYXVsdCBvbmUpCisgKiBpbiBuYW5vc2Vjb25kcywgb3IgLTEgaWYgbm8gdGltZXIgaXMgc2V0IHRvIGV4cGlyZS4KKyAqCisgKiBSZXR1cm5zOiB0aW1lIHVudGlsIGV4cGlyeSBpbiBuYW5vc2Vjb25kcyBvciAtMQorICovCitpbnQ2NF90IHFlbXVfY2xvY2tfZGVhZGxpbmVfbnNfYWxsKFFFTVVDbG9ja1R5cGUgdHlwZSk7CisKKy8qKgorICogcWVtdV9jbG9ja19nZXRfbWFpbl9sb29wX3RpbWVybGlzdDoKKyAqIEB0eXBlOiB0aGUgY2xvY2sgdHlwZQorICoKKyAqIFJldHVybiB0aGUgZGVmYXVsdCB0aW1lciBsaXN0IGFzc29jYXRpYXRlZCB3aXRoIGEgY2xvY2suCisgKgorICogUmV0dXJuczogdGhlIGRlZmF1bHQgdGltZXIgbGlzdAorICovCitRRU1VVGltZXJMaXN0ICpxZW11X2Nsb2NrX2dldF9tYWluX2xvb3BfdGltZXJsaXN0KFFFTVVDbG9ja1R5cGUgdHlwZSk7CisKKy8qKgorICogcWVtdV9jbG9ja19ub2ZpZnk6CisgKiBAdHlwZTogdGhlIGNsb2NrIHR5cGUKKyAqCisgKiBDYWxsIHRoZSBub3RpZmllciBjYWxsYmFjayBjb25uZWN0ZWQgd2l0aCB0aGUgZGVmYXVsdCB0aW1lcgorICogbGlzdCBsaW5rZWQgdG8gdGhlIGNsb2NrLCBvciBxZW11X25vdGlmeSgpIGlmIG5vbmUuCisgKi8KK3ZvaWQgcWVtdV9jbG9ja19ub3RpZnkoUUVNVUNsb2NrVHlwZSB0eXBlKTsKKworLyoqCisgKiBxZW11X2Nsb2NrX2VuYWJsZToKKyAqIEB0eXBlOiB0aGUgY2xvY2sgdHlwZQorICogQGVuYWJsZWQ6IHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlCisgKgorICogRW5hYmxlIG9yIGRpc2FibGUgYSBjbG9jaworICogRGlzYWJsaW5nIHRoZSBjbG9jayB3aWxsIHdhaXQgZm9yIHJlbGF0ZWQgdGltZXJsaXN0cyB0byBzdG9wCisgKiBleGVjdXRpbmcgcWVtdV9ydW5fdGltZXJzLiAgVGh1cywgdGhpcyBmdW5jdGlvbnMgc2hvdWxkIG5vdAorICogYmUgdXNlZCBmcm9tIHRoZSBjYWxsYmFjayBvZiBhIHRpbWVyIHRoYXQgaXMgYmFzZWQgb24gQGNsb2NrLgorICogRG9pbmcgc28gd291bGQgY2F1c2UgYSBkZWFkbG9jay4KKyAqCisgKiBDYWxsZXIgc2hvdWxkIGhvbGQgQlFMLgorICovCit2b2lkIHFlbXVfY2xvY2tfZW5hYmxlKFFFTVVDbG9ja1R5cGUgdHlwZSwgYm9vbCBlbmFibGVkKTsKKworLyoqCisgKiBxZW11X2Nsb2NrX3dhcnA6CisgKiBAdHlwZTogdGhlIGNsb2NrIHR5cGUKKyAqCisgKiBXYXJwIGEgY2xvY2sgdG8gYSBuZXcgdmFsdWUKKyAqLwordm9pZCBxZW11X2Nsb2NrX3dhcnAoUUVNVUNsb2NrVHlwZSB0eXBlKTsKKworLyoqCisgKiBxZW11X2Nsb2NrX3JlZ2lzdGVyX3Jlc2V0X25vdGlmaWVyOgorICogQHR5cGU6IHRoZSBjbG9jayB0eXBlCisgKiBAbm90aWZpZXI6IHRoZSBub3RpZmllciBmdW5jdGlvbgorICoKKyAqIFJlZ2lzdGVyIGEgbm90aWZpZXIgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBjbG9jaworICogY29uY2VybmVkIGlzIHJlc2V0LgorICovCit2b2lkIHFlbXVfY2xvY2tfcmVnaXN0ZXJfcmVzZXRfbm90aWZpZXIoUUVNVUNsb2NrVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWVyICpub3RpZmllcik7CisKKy8qKgorICogcWVtdV9jbG9ja191bnJlZ2lzdGVyX3Jlc2V0X25vdGlmaWVyOgorICogQHR5cGU6IHRoZSBjbG9jayB0eXBlCisgKiBAbm90aWZpZXI6IHRoZSBub3RpZmllciBmdW5jdGlvbgorICoKKyAqIFVucmVnaXN0ZXIgYSBub3RpZmllciBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGNsb2NrCisgKiBjb25jZXJuZWQgaXMgcmVzZXQuCisgKi8KK3ZvaWQgcWVtdV9jbG9ja191bnJlZ2lzdGVyX3Jlc2V0X25vdGlmaWVyKFFFTVVDbG9ja1R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWVyICpub3RpZmllcik7CisKKy8qKgorICogcWVtdV9jbG9ja19ydW5fdGltZXJzOgorICogQHR5cGU6IGNsb2NrIG9uIHdoaWNoIHRvIG9wZXJhdGUKKyAqCisgKiBSdW4gYWxsIHRoZSB0aW1lcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZhdWx0IHRpbWVyIGxpc3QKKyAqIG9mIGEgY2xvY2suCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBhbnkgdGltZXIgcmFuLgorICovCitib29sIHFlbXVfY2xvY2tfcnVuX3RpbWVycyhRRU1VQ2xvY2tUeXBlIHR5cGUpOworCisvKioKKyAqIHFlbXVfY2xvY2tfcnVuX2FsbF90aW1lcnM6CisgKgorICogUnVuIGFsbCB0aGUgdGltZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVmYXVsdCB0aW1lciBsaXN0CisgKiBvZiBldmVyeSBjbG9jay4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIGFueSB0aW1lciByYW4uCisgKi8KK2Jvb2wgcWVtdV9jbG9ja19ydW5fYWxsX3RpbWVycyh2b2lkKTsKKworLyoKKyAqIFFFTVVUaW1lckxpc3QKKyAqLworCisvKioKKyAqIHRpbWVybGlzdF9uZXc6CisgKiBAdHlwZTogdGhlIGNsb2NrIHR5cGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRpbWVybGlzdAorICogQGNiOiB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBub3RpZmljYXRpb24KKyAqIEBvcGFxdWU6IHRoZSBvcGFxdWUgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjaworICoKKyAqIENyZWF0ZSBhIG5ldyB0aW1lcmxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjbG9jayBvZgorICogdHlwZSBAdHlwZS4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIFFFTVVUaW1lckxpc3QgY3JlYXRlZAorICovCitRRU1VVGltZXJMaXN0ICp0aW1lcmxpc3RfbmV3KFFFTVVDbG9ja1R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVRpbWVyTGlzdE5vdGlmeUNCICpjYiwgdm9pZCAqb3BhcXVlKTsKKworLyoqCisgKiB0aW1lcmxpc3RfZnJlZToKKyAqIEB0aW1lcl9saXN0OiB0aGUgdGltZXIgbGlzdCB0byBmcmVlCisgKgorICogRnJlZXMgYSB0aW1lcl9saXN0LiBJdCBtdXN0IGhhdmUgbm8gYWN0aXZlIHRpbWVycy4KKyAqLwordm9pZCB0aW1lcmxpc3RfZnJlZShRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0KTsKKworLyoqCisgKiB0aW1lcmxpc3RfaGFzX3RpbWVyczoKKyAqIEB0aW1lcl9saXN0OiB0aGUgdGltZXIgbGlzdCB0byBvcGVyYXRlIG9uCisgKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB0aW1lciBsaXN0IGhhcyBhY3RpdmUgdGltZXJzCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gb3RoZXIgdGhyZWFkcyBhbHNvIGFjY2VzcworICogdGhlIHRpbWVyIGxpc3QuICBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSBvdXRkYXRlZCBieSB0aGUgdGltZSBpdCBpcyBhY3RlZAorICogdXBvbi4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSB0aW1lciBsaXN0IGhhcyB0aW1lcnMuCisgKi8KK2Jvb2wgdGltZXJsaXN0X2hhc190aW1lcnMoUUVNVVRpbWVyTGlzdCAqdGltZXJfbGlzdCk7CisKKy8qKgorICogdGltZXJsaXN0X2V4cGlyZWQ6CisgKiBAdGltZXJfbGlzdDogdGhlIHRpbWVyIGxpc3QgdG8gb3BlcmF0ZSBvbgorICoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgdGltZXIgbGlzdCBoYXMgYW55IHRpbWVycyB3aGljaAorICogYXJlIGV4cGlyZWQuCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiB0aGUgdGltZXIgbGlzdCBoYXMgdGltZXJzIHdoaWNoCisgKiBoYXZlIGV4cGlyZWQuCisgKi8KK2Jvb2wgdGltZXJsaXN0X2V4cGlyZWQoUUVNVVRpbWVyTGlzdCAqdGltZXJfbGlzdCk7CisKKy8qKgorICogdGltZXJsaXN0X2RlYWRsaW5lX25zOgorICogQHRpbWVyX2xpc3Q6IHRoZSB0aW1lciBsaXN0IHRvIG9wZXJhdGUgb24KKyAqCisgKiBEZXRlcm1pbmUgdGhlIGRlYWRsaW5lIGZvciBhIHRpbWVyX2xpc3QsIGkuZS4KKyAqIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgdW50aWwgdGhlIGZpcnN0IHRpbWVyCisgKiBleHBpcmVzLiBSZXR1cm4gLTEgaWYgdGhlcmUgYXJlIG5vIHRpbWVycy4KKyAqCisgKiBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHVudGlsIHRoZSBlYXJsaWVzdAorICogdGltZXIgZXhwaXJlcyAtMSBpZiBub25lCisgKi8KK2ludDY0X3QgdGltZXJsaXN0X2RlYWRsaW5lX25zKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpOworCisvKioKKyAqIHRpbWVybGlzdF9nZXRfY2xvY2s6CisgKiBAdGltZXJfbGlzdDogdGhlIHRpbWVyIGxpc3QgdG8gb3BlcmF0ZSBvbgorICoKKyAqIERldGVybWluZSB0aGUgY2xvY2sgdHlwZSBhc3NvY2lhdGVkIHdpdGggYSB0aW1lciBsaXN0LgorICoKKyAqIFJldHVybnM6IHRoZSBjbG9jayB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIHRpbWVyIGxpc3QuCisgKi8KK1FFTVVDbG9ja1R5cGUgdGltZXJsaXN0X2dldF9jbG9jayhRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0KTsKKworLyoqCisgKiB0aW1lcmxpc3RfcnVuX3RpbWVyczoKKyAqIEB0aW1lcl9saXN0OiB0aGUgdGltZXIgbGlzdCB0byB1c2UKKyAqCisgKiBDYWxsIGFsbCBleHBpcmVkIHRpbWVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyIGxpc3QuCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBhbnkgdGltZXIgZXhwaXJlZAorICovCitib29sIHRpbWVybGlzdF9ydW5fdGltZXJzKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpOworCisvKioKKyAqIHRpbWVybGlzdF9ub3RpZnk6CisgKiBAdGltZXJfbGlzdDogdGhlIHRpbWVyIGxpc3QgdG8gdXNlCisgKgorICogY2FsbCB0aGUgbm90aWZpZXIgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lciBsaXN0LgorICovCit2b2lkIHRpbWVybGlzdF9ub3RpZnkoUUVNVVRpbWVyTGlzdCAqdGltZXJfbGlzdCk7CisKKy8qCisgKiBRRU1VVGltZXJMaXN0R3JvdXAKKyAqLworCisvKioKKyAqIHRpbWVybGlzdGdyb3VwX2luaXQ6CisgKiBAdGxnOiB0aGUgdGltZXIgbGlzdCBncm91cAorICogQGNiOiB0aGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgbm90aWZ5IGlzIHJlcXVpcmVkCisgKiBAb3BhcXVlOiB0aGUgb3BhcXVlIHBvaW50ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4KKyAqCisgKiBJbml0aWFsaXNlIGEgdGltZXIgbGlzdCBncm91cC4gVGhpcyBtdXN0IGFscmVhZHkgYmUKKyAqIGFsbG9jYXRlZCBpbiBtZW1vcnkgYW5kIHplcm9lZC4gVGhlIG5vdGlmaWVyIGNhbGxiYWNrIGlzCisgKiBjYWxsZWQgd2hlbmV2ZXIgYSBjbG9jayBpbiB0aGUgdGltZXIgbGlzdCBncm91cCBpcworICogcmVlbmFibGVkIG9yIHdoZW5ldmVyIGEgdGltZXIgYXNzb2NpYXRlZCB3aXRoIGFueSB0aW1lcgorICogbGlzdCBpcyBtb2RpZmllZC4gSWYgQGNiIGlzIHNwZWNpZmllZCBhcyBudWxsLCBxZW11X25vdGlmeSgpCisgKiBpcyB1c2VkIGluc3RlYWQuCisgKi8KK3ZvaWQgdGltZXJsaXN0Z3JvdXBfaW5pdChRRU1VVGltZXJMaXN0R3JvdXAgKnRsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VVGltZXJMaXN0Tm90aWZ5Q0IgKmNiLCB2b2lkICpvcGFxdWUpOworCisvKioKKyAqIHRpbWVybGlzdGdyb3VwX2RlaW5pdDoKKyAqIEB0bGc6IHRoZSB0aW1lciBsaXN0IGdyb3VwCisgKgorICogRGVpbml0aWFsaXNlIGEgdGltZXIgbGlzdCBncm91cC4gVGhpcyBtdXN0IGFscmVhZHkgYmUKKyAqIGluaXRpYWxpc2VkLiBOb3RlIHRoZSBtZW1vcnkgaXMgbm90IGZyZWVkLgorICovCit2b2lkIHRpbWVybGlzdGdyb3VwX2RlaW5pdChRRU1VVGltZXJMaXN0R3JvdXAgKnRsZyk7CisKKy8qKgorICogdGltZXJsaXN0Z3JvdXBfcnVuX3RpbWVyczoKKyAqIEB0bGc6IHRoZSB0aW1lciBsaXN0IGdyb3VwCisgKgorICogUnVuIHRoZSB0aW1lcnMgYXNzb2NpYXRlZCB3aXRoIGEgdGltZXIgbGlzdCBncm91cC4KKyAqIFRoaXMgd2lsbCBydW4gdGltZXJzIG9uIG11bHRpcGxlIGNsb2Nrcy4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIGFueSB0aW1lciBjYWxsYmFjayByYW4KKyAqLworYm9vbCB0aW1lcmxpc3Rncm91cF9ydW5fdGltZXJzKFFFTVVUaW1lckxpc3RHcm91cCAqdGxnKTsKKworLyoqCisgKiB0aW1lcmxpc3Rncm91cF9kZWFkbGluZV9uczoKKyAqIEB0bGc6IHRoZSB0aW1lciBsaXN0IGdyb3VwCisgKgorICogRGV0ZXJtaW5lIHRoZSBkZWFkbGluZSBvZiB0aGUgc29vbmVzdCB0aW1lciB0bworICogZXhwaXJlIGFzc29jaWF0ZWQgd2l0aCBhbnkgdGltZXIgbGlzdCBsaW5rZWQgdG8KKyAqIHRoZSB0aW1lciBsaXN0IGdyb3VwLiBPbmx5IGNsb2NrcyBzdWl0YWJsZSBmb3IKKyAqIGRlYWRsaW5lIGNhbGN1bGF0aW9uIGFyZSBpbmNsdWRlZC4KKyAqCisgKiBSZXR1cm5zOiB0aGUgZGVhZGxpbmUgaW4gbmFub3NlY29uZHMgb3IgLTEgaWYgbm8KKyAqIHRpbWVycyBhcmUgdG8gZXhwaXJlLgorICovCitpbnQ2NF90IHRpbWVybGlzdGdyb3VwX2RlYWRsaW5lX25zKFFFTVVUaW1lckxpc3RHcm91cCAqdGxnKTsKKworLyoKKyAqIFFFTVVUaW1lcgorICovCisKKy8qKgorICogdGltZXJfaW5pdDoKKyAqIEB0czogdGhlIHRpbWVyIHRvIGJlIGluaXRpYWxpc2VkCisgKiBAdGltZXJfbGlzdDogdGhlIHRpbWVyIGxpc3QgdG8gYXR0YWNoIHRoZSB0aW1lciB0bworICogQHNjYWxlOiB0aGUgc2NhbGUgdmFsdWUgZm9yIHRoZSB0aWVtcgorICogQGNiOiB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMKKyAqIEBvcGFxdWU6IHRoZSBvcGFxdWUgcG9pbnRlciB0byBiZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgKgorICogSW5pdGlhbGlzZSBhIG5ldyB0aW1lciBhbmQgYXNzb2NpYXRlIGl0IHdpdGggQHRpbWVyX2xpc3QuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkuCisgKgorICogWW91IG5lZWQgbm90IGNhbGwgYW4gZXhwbGljaXQgZGVpbml0IGNhbGwuIFNpbXBseSBtYWtlCisgKiBzdXJlIGl0IGlzIG5vdCBvbiBhIGxpc3Qgd2l0aCB0aW1lcl9kZWwuCisgKi8KK3ZvaWQgdGltZXJfaW5pdChRRU1VVGltZXIgKnRzLAorICAgICAgICAgICAgICAgIFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QsIGludCBzY2FsZSwKKyAgICAgICAgICAgICAgICBRRU1VVGltZXJDQiAqY2IsIHZvaWQgKm9wYXF1ZSk7CisKKy8qKgorICogdGltZXJfbmV3X3RsOgorICogQHRpbWVyX2xpc3Q6IHRoZSB0aW1lciBsaXN0IHRvIGF0dGFjaCB0aGUgdGltZXIgdG8KKyAqIEBzY2FsZTogdGhlIHNjYWxlIHZhbHVlIGZvciB0aGUgdGllbXIKKyAqIEBjYjogdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB0aW1lciBleHBpcmVzCisgKiBAb3BhcXVlOiB0aGUgb3BhcXVlIHBvaW50ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjaworICoKKyAqIENyZWVhdGUgYSBuZXcgdGltZXIgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIEB0aW1lcl9saXN0LgorICogVGhlIG1lbW9yeSBpcyBhbGxvY2F0ZWQgYnkgdGhlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgaXMgbm90IHRoZSBwcmVmZXJyZWQgaW50ZXJmYWNlIHVubGVzcyB5b3Uga25vdyB5b3UKKyAqIGFyZSBnb2luZyB0byBjYWxsIHRpbWVyX2ZyZWUuIFVzZSB0aW1lcl9pbml0IGluc3RlYWQuCisgKgorICogUmV0dXJuczogYSBwb2ludGVyIHRvIHRoZSB0aW1lcgorICovCitzdGF0aWMgaW5saW5lIFFFTVVUaW1lciAqdGltZXJfbmV3X3RsKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVRpbWVyQ0IgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVVRpbWVyICp0cyA9IChRRU1VVGltZXIqKWdfbWFsbG9jMChzaXplb2YoUUVNVVRpbWVyKSk7CisgICAgdGltZXJfaW5pdCh0cywgdGltZXJfbGlzdCwgc2NhbGUsIGNiLCBvcGFxdWUpOworICAgIHJldHVybiB0czsKK30KKworLyoqCisgKiB0aW1lcl9uZXc6CisgKiBAdHlwZTogdGhlIGNsb2NrIHR5cGUgdG8gdXNlCisgKiBAc2NhbGU6IHRoZSBzY2FsZSB2YWx1ZSBmb3IgdGhlIHRpZW1yCisgKiBAY2I6IHRoZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdGltZXIgZXhwaXJlcworICogQG9wYXF1ZTogdGhlIG9wYXF1ZSBwb2ludGVyIHRvIGJlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sKKyAqCisgKiBDcmVlYXRlIGEgbmV3IHRpbWVyIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgZGVmYXVsdAorICogdGltZXIgbGlzdCBmb3IgdGhlIGNsb2NrIHR5cGUgQHR5cGUuCisgKgorICogUmV0dXJuczogYSBwb2ludGVyIHRvIHRoZSB0aW1lcgorICovCitzdGF0aWMgaW5saW5lIFFFTVVUaW1lciAqdGltZXJfbmV3KFFFTVVDbG9ja1R5cGUgdHlwZSwgaW50IHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VVGltZXJDQiAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gdGltZXJfbmV3X3RsKG1haW5fbG9vcF90bGcudGxbdHlwZV0sIHNjYWxlLCBjYiwgb3BhcXVlKTsKK30KKworLyoqCisgKiB0aW1lcl9uZXdfbnM6CisgKiBAY2xvY2s6IHRoZSBjbG9jayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGltZXIKKyAqIEBjYWxsYmFjazogdGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdGltZXIgZXhwaXJlcworICogQG9wYXF1ZTogdGhlIG9wYXF1ZSBwb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCisgKgorICogQ3JlYXRlIGEgbmV3IHRpbWVyIHdpdGggbmFub3NlY29uZCBzY2FsZSBvbiB0aGUgZGVmYXVsdCB0aW1lciBsaXN0CisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNsb2NrLgorICoKKyAqIFJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCB0aW1lcgorICovCitzdGF0aWMgaW5saW5lIFFFTVVUaW1lciAqdGltZXJfbmV3X25zKFFFTVVDbG9ja1R5cGUgdHlwZSwgUUVNVVRpbWVyQ0IgKmNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgcmV0dXJuIHRpbWVyX25ldyh0eXBlLCBTQ0FMRV9OUywgY2IsIG9wYXF1ZSk7Cit9CisKKy8qKgorICogdGltZXJfbmV3X3VzOgorICogQGNsb2NrOiB0aGUgY2xvY2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRpbWVyCisgKiBAY2FsbGJhY2s6IHRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHRpbWVyIGV4cGlyZXMKKyAqIEBvcGFxdWU6IHRoZSBvcGFxdWUgcG9pbnRlciB0byBwYXNzIHRvIHRoZSBjYWxsYmFjaworICoKKyAqIENyZWF0ZSBhIG5ldyB0aW1lciB3aXRoIG1pY3Jvc2Vjb25kIHNjYWxlIG9uIHRoZSBkZWZhdWx0IHRpbWVyIGxpc3QKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2xvY2suCisgKgorICogUmV0dXJuczogYSBwb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIHRpbWVyCisgKi8KK3N0YXRpYyBpbmxpbmUgUUVNVVRpbWVyICp0aW1lcl9uZXdfdXMoUUVNVUNsb2NrVHlwZSB0eXBlLCBRRU1VVGltZXJDQiAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICByZXR1cm4gdGltZXJfbmV3KHR5cGUsIFNDQUxFX1VTLCBjYiwgb3BhcXVlKTsKK30KKworLyoqCisgKiB0aW1lcl9uZXdfbXM6CisgKiBAY2xvY2s6IHRoZSBjbG9jayB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdGltZXIKKyAqIEBjYWxsYmFjazogdGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdGltZXIgZXhwaXJlcworICogQG9wYXF1ZTogdGhlIG9wYXF1ZSBwb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrCisgKgorICogQ3JlYXRlIGEgbmV3IHRpbWVyIHdpdGggbWlsbGlzZWNvbmQgc2NhbGUgb24gdGhlIGRlZmF1bHQgdGltZXIgbGlzdAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBjbG9jay4KKyAqCisgKiBSZXR1cm5zOiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgdGltZXIKKyAqLworc3RhdGljIGlubGluZSBRRU1VVGltZXIgKnRpbWVyX25ld19tcyhRRU1VQ2xvY2tUeXBlIHR5cGUsIFFFTVVUaW1lckNCICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiB0aW1lcl9uZXcodHlwZSwgU0NBTEVfTVMsIGNiLCBvcGFxdWUpOworfQorCisvKioKKyAqIHRpbWVyX2ZyZWU6CisgKiBAdHM6IHRoZSB0aW1lcgorICoKKyAqIEZyZWUgYSB0aW1lciAoaXQgbXVzdCBub3QgYmUgb24gdGhlIGFjdGl2ZSBsaXN0KQorICovCit2b2lkIHRpbWVyX2ZyZWUoUUVNVVRpbWVyICp0cyk7CisKKy8qKgorICogdGltZXJfZGVsOgorICogQHRzOiB0aGUgdGltZXIKKyAqCisgKiBEZWxldGUgYSB0aW1lciBmcm9tIHRoZSBhY3RpdmUgbGlzdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlIGJ1dCB0aGUgdGltZXIgYW5kIGl0cyB0aW1lciBsaXN0IG11c3Qgbm90IGJlCisgKiBmcmVlZCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuCisgKi8KK3ZvaWQgdGltZXJfZGVsKFFFTVVUaW1lciAqdHMpOworCisvKioKKyAqIHRpbWVyX21vZF9uczoKKyAqIEB0czogdGhlIHRpbWVyCisgKiBAZXhwaXJlX3RpbWU6IHRoZSBleHBpcnkgdGltZSBpbiBuYW5vc2Vjb25kcworICoKKyAqIE1vZGlmeSBhIHRpbWVyIHRvIGV4cGlyZSBhdCBAZXhwaXJlX3RpbWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRocmVhZC1zYWZlIGJ1dCB0aGUgdGltZXIgYW5kIGl0cyB0aW1lciBsaXN0IG11c3Qgbm90IGJlCisgKiBmcmVlZCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuCisgKi8KK3ZvaWQgdGltZXJfbW9kX25zKFFFTVVUaW1lciAqdHMsIGludDY0X3QgZXhwaXJlX3RpbWUpOworCisvKioKKyAqIHRpbWVyX21vZF9hbnRpY2lwYXRlX25zOgorICogQHRzOiB0aGUgdGltZXIKKyAqIEBleHBpcmVfdGltZTogdGhlIGV4cGlyeSB0aW1lIGluIG5hbm9zZWNvbmRzCisgKgorICogTW9kaWZ5IGEgdGltZXIgdG8gZXhwaXJlIGF0IEBleHBpcmVfdGltZSBvciB0aGUgY3VycmVudCB0aW1lLAorICogd2hpY2hldmVyIGNvbWVzIGVhcmxpZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBidXQgdGhlIHRpbWVyIGFuZCBpdHMgdGltZXIgbGlzdCBtdXN0IG5vdCBiZQorICogZnJlZWQgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nLgorICovCit2b2lkIHRpbWVyX21vZF9hbnRpY2lwYXRlX25zKFFFTVVUaW1lciAqdHMsIGludDY0X3QgZXhwaXJlX3RpbWUpOworCisvKioKKyAqIHRpbWVyX21vZDoKKyAqIEB0czogdGhlIHRpbWVyCisgKiBAZXhwaXJlX3RpbWU6IHRoZSBleHBpcmUgdGltZSBpbiB0aGUgdW5pdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lcgorICoKKyAqIE1vZGlmeSBhIHRpbWVyIHRvIGV4cGlyeSBhdCBAZXhwaXJlX3RpbWUsIHRha2luZyBpbnRvCisgKiBhY2NvdW50IHRoZSBzY2FsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRpbWVyLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhyZWFkLXNhZmUgYnV0IHRoZSB0aW1lciBhbmQgaXRzIHRpbWVyIGxpc3QgbXVzdCBub3QgYmUKKyAqIGZyZWVkIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgcnVubmluZy4KKyAqLwordm9pZCB0aW1lcl9tb2QoUUVNVVRpbWVyICp0cywgaW50NjRfdCBleHBpcmVfdGltZXIpOworCisvKioKKyAqIHRpbWVyX21vZF9hbnRpY2lwYXRlOgorICogQHRzOiB0aGUgdGltZXIKKyAqIEBleHBpcmVfdGltZTogdGhlIGV4cGlyeSB0aW1lIGluIG5hbm9zZWNvbmRzCisgKgorICogTW9kaWZ5IGEgdGltZXIgdG8gZXhwaXJlIGF0IEBleHBpcmVfdGltZSBvciB0aGUgY3VycmVudCB0aW1lLCB3aGljaGV2ZXIKKyAqIGNvbWVzIGVhcmxpZXIsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHNjYWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGltZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aHJlYWQtc2FmZSBidXQgdGhlIHRpbWVyIGFuZCBpdHMgdGltZXIgbGlzdCBtdXN0IG5vdCBiZQorICogZnJlZWQgd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBydW5uaW5nLgorICovCit2b2lkIHRpbWVyX21vZF9hbnRpY2lwYXRlKFFFTVVUaW1lciAqdHMsIGludDY0X3QgZXhwaXJlX3RpbWUpOworCisvKioKKyAqIHRpbWVyX3BlbmRpbmc6CisgKiBAdHM6IHRoZSB0aW1lcgorICoKKyAqIERldGVybWluZXMgd2hldGhlciBhIHRpbWVyIGlzIHBlbmRpbmcgKGkuZS4gaXMgb24gdGhlCisgKiBhY3RpdmUgbGlzdCBvZiB0aW1lcnMsIHdoZXRoZXIgb3Igbm90IGl0IGhhcyBub3QgeWV0IGV4cGlyZWQpLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHRpbWVyIGlzIHBlbmRpbmcKKyAqLworYm9vbCB0aW1lcl9wZW5kaW5nKFFFTVVUaW1lciAqdHMpOworCisvKioKKyAqIHRpbWVyX2V4cGlyZWQ6CisgKiBAdHM6IHRoZSB0aW1lcgorICoKKyAqIERldGVybWluZXMgd2hldGhlciBhIHRpbWVyIGhhcyBleHBpcmVkLgorICoKKyAqIFJldHVybnM6IHRydWUgaWYgdGhlIHRpbWVyIGhhcyBleHBpcmVkCisgKi8KK2Jvb2wgdGltZXJfZXhwaXJlZChRRU1VVGltZXIgKnRpbWVyX2hlYWQsIGludDY0X3QgY3VycmVudF90aW1lKTsKKworLyoqCisgKiB0aW1lcl9leHBpcmVfdGltZV9uczoKKyAqIEB0czogdGhlIHRpbWVyCisgKgorICogRGV0ZXJtaW5lIHRoZSBleHBpcnkgdGltZSBvZiBhIHRpbWVyCisgKgorICogUmV0dXJuczogdGhlIGV4cGlyeSB0aW1lIGluIG5hbm9zZWNvbmRzCisgKi8KK3VpbnQ2NF90IHRpbWVyX2V4cGlyZV90aW1lX25zKFFFTVVUaW1lciAqdHMpOworCisvKioKKyAqIHRpbWVyX2dldDoKKyAqIEBmOiB0aGUgZmlsZQorICogQHRzOiB0aGUgdGltZXIKKyAqCisgKiBSZWFkIGEgdGltZXIgQHRzIGZyb20gYSBmaWxlIEBmCisgKi8KK3ZvaWQgdGltZXJfZ2V0KFFFTVVGaWxlICpmLCBRRU1VVGltZXIgKnRzKTsKKworLyoqCisgKiB0aW1lcl9wdXQ6CisgKiBAZjogdGhlIGZpbGUKKyAqIEB0czogdGhlIHRpbWVyCisgKi8KK3ZvaWQgdGltZXJfcHV0KFFFTVVGaWxlICpmLCBRRU1VVGltZXIgKnRzKTsKKworLyoKKyAqIEdlbmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHFlbXVfdGltZW91dF9uc190b19tczoKKyAqIEBuczogbmFub3NlY29uZCB0aW1lb3V0IHZhbHVlCisgKgorICogQ29udmVydCBhIG5hbm9zZWNvbmQgdGltZW91dCB2YWx1ZSAob3IgLTEpIHRvCisgKiBhIG1pbGxpc2Vjb25kIHZhbHVlIChvciAtMSksIGFsd2F5cyByb3VuZGluZyB1cC4KKyAqCisgKiBSZXR1cm5zOiBtaWxsaXNlY29uZCB0aW1lb3V0IHZhbHVlCisgKi8KK2ludCBxZW11X3RpbWVvdXRfbnNfdG9fbXMoaW50NjRfdCBucyk7CisKKy8qKgorICogcWVtdV9wb2xsX25zOgorICogQGZkczogQXJyYXkgb2YgZmlsZSBkZXNjcmlwdG9ycworICogQG5mZHM6IG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzCisgKiBAdGltZW91dDogdGltZW91dCBpbiBuYW5vc2Vjb25kcworICoKKyAqIFBlcmZvcm0gYSBwb2xsIGxpa2UgZ19wb2xsIGJ1dCB3aXRoIGEgdGltZW91dCBpbiBuYW5vc2Vjb25kcy4KKyAqIFNlZSBnX3BvbGwgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLgorICoKKyAqIFJldHVybnM6IG51bWJlciBvZiBmZHMgcmVhZHkKKyAqLworaW50IHFlbXVfcG9sbF9ucyhHUG9sbEZEICpmZHMsIGd1aW50IG5mZHMsIGludDY0X3QgdGltZW91dCk7CisKKy8qKgorICogcWVtdV9zb29uZXN0X3RpbWVvdXQ6CisgKiBAdGltZW91dDE6IGZpcnN0IHRpbWVvdXQgaW4gbmFub3NlY29uZHMgKG9yIC0xIGZvciBpbmZpbml0ZSkKKyAqIEB0aW1lb3V0Mjogc2Vjb25kIHRpbWVvdXQgaW4gbmFub3NlY29uZHMgKG9yIC0xIGZvciBpbmZpbml0ZSkKKyAqCisgKiBDYWxjdWxhdGVzIHRoZSBzb29uZXN0IG9mIHR3byB0aW1lb3V0IHZhbHVlcy4gLTEgbWVhbnMgaW5maW5pdGUsIHdoaWNoCisgKiBpcyBsYXRlciB0aGFuIGFueSBvdGhlciB2YWx1ZS4KKyAqCisgKiBSZXR1cm5zOiBzb29uZXN0IHRpbWVvdXQgdmFsdWUgaW4gbmFub3NlY29uZHMgKG9yIC0xIGZvciBpbmZpbml0ZSkKKyAqLworc3RhdGljIGlubGluZSBpbnQ2NF90IHFlbXVfc29vbmVzdF90aW1lb3V0KGludDY0X3QgdGltZW91dDEsIGludDY0X3QgdGltZW91dDIpCit7CisgICAgLyogd2UgY2FuIGFidXNlIHRoZSBmYWN0IHRoYXQgLTEgKHdoaWNoIG1lYW5zIGluZmluaXRlKSBpcyBhIG1heGltYWwKKyAgICAgKiB2YWx1ZSB3aGVuIGNhc3QgdG8gdW5zaWduZWQuIEFzIHRoaXMgaXMgZGlzZ3VzdGluZywgaXQncyBrZXB0IGluCisgICAgICogb25lIGlubGluZSBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICByZXR1cm4gKCh1aW50NjRfdCkgdGltZW91dDEgPCAodWludDY0X3QpIHRpbWVvdXQyKSA/IHRpbWVvdXQxIDogdGltZW91dDI7Cit9CisKKy8qKgorICogaW5pdGNsb2NrczoKKyAqCisgKiBJbml0aWFsaXNlIHRoZSBjbG9jayAmIHRpbWVyIGluZnJhc3RydWN0dXJlCisgKi8KK3ZvaWQgaW5pdF9jbG9ja3Modm9pZCk7CisKK2ludDY0X3QgY3B1X2dldF90aWNrcyh2b2lkKTsKKy8qIENhbGxlciBtdXN0IGhvbGQgQlFMICovCit2b2lkIGNwdV9lbmFibGVfdGlja3Modm9pZCk7CisvKiBDYWxsZXIgbXVzdCBob2xkIEJRTCAqLwordm9pZCBjcHVfZGlzYWJsZV90aWNrcyh2b2lkKTsKKworc3RhdGljIGlubGluZSBpbnQ2NF90IGdldF90aWNrc19wZXJfc2VjKHZvaWQpCit7CisgICAgcmV0dXJuIDEwMDAwMDAwMDBMTDsKK30KKworLyoKKyAqIExvdyBsZXZlbCBjbG9jayBmdW5jdGlvbnMKKyAqLworCisvKiByZWFsIHRpbWUgaG9zdCBtb25vdG9uaWMgdGltZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfY2xvY2tfcmVhbHRpbWUodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyAodHYudHZfdXNlYyAqIDEwMDApOworfQorCisvKiBXYXJuaW5nOiBkb24ndCBpbnNlcnQgdHJhY2Vwb2ludHMgaW50byB0aGVzZSBmdW5jdGlvbnMsIHRoZXkgYXJlCisgICBhbHNvIHVzZWQgYnkgc2ltcGxldHJhY2UgYmFja2VuZCBhbmQgdHJhY2Vwb2ludHMgd291bGQgY2F1c2UKKyAgIGFuIGluZmluaXRlIHJlY3Vyc2lvbiEgKi8KKyNpZmRlZiBfV0lOMzIKK2V4dGVybiBpbnQ2NF90IGNsb2NrX2ZyZXE7CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfY2xvY2sodm9pZCkKK3sKKyAgICBMQVJHRV9JTlRFR0VSIHRpOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZ0aSk7CisgICAgcmV0dXJuIG11bGRpdjY0KHRpLlF1YWRQYXJ0LCBnZXRfdGlja3NfcGVyX3NlYygpLCBjbG9ja19mcmVxKTsKK30KKworI2Vsc2UKKworZXh0ZXJuIGludCB1c2VfcnRfY2xvY2s7CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfY2xvY2sodm9pZCkKK3sKKyNpZmRlZiBDTE9DS19NT05PVE9OSUMKKyAgICBpZiAodXNlX3J0X2Nsb2NrKSB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgICAgIHJldHVybiB0cy50dl9zZWMgKiAxMDAwMDAwMDAwTEwgKyB0cy50dl9uc2VjOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICAvKiBYWFg6IHVzaW5nIGdldHRpbWVvZmRheSBsZWFkcyB0byBwcm9ibGVtcyBpZiB0aGUgZGF0ZQorICAgICAgICAgICBjaGFuZ2VzLCBzbyBpdCBzaG91bGQgYmUgYXZvaWRlZC4gKi8KKyAgICAgICAgcmV0dXJuIGdldF9jbG9ja19yZWFsdGltZSgpOworICAgIH0KK30KKyNlbmRpZgorCisvKiBpY291bnQgKi8KK2ludDY0X3QgY3B1X2dldF9pY291bnQodm9pZCk7CitpbnQ2NF90IGNwdV9nZXRfY2xvY2sodm9pZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaG9zdCBDUFUgdGlja3MgKGlmIGF2YWlsYWJsZSkgKi8KKworI2lmIGRlZmluZWQoX0FSQ0hfUFBDKQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzKHZvaWQpCit7CisgICAgaW50NjRfdCByZXR2YWw7CisjaWZkZWYgX0FSQ0hfUFBDNjQKKyAgICAvKiBUaGlzIHJlYWRzIHRpbWViYXNlIGluIG9uZSA2NGJpdCBnbyBhbmQgaW5jbHVkZXMgQ2VsbCB3b3JrYXJvdW5kIGZyb206CisgICAgICAgaHR0cDovL296bGFicy5vcmcvcGlwZXJtYWlsL2xpbnV4cHBjLWRldi8yMDA2LU9jdG9iZXIvMDI3MDUyLmh0bWwKKyAgICAqLworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibWZ0YiAgICAlMFxuXHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjbXB3aSAgICUwLDBcblx0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVxLSAgICAkLTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAocmV0dmFsKSk7CisjZWxzZQorICAgIC8qIGh0dHA6Ly9vemxhYnMub3JnL3BpcGVybWFpbC9saW51eHBwYy1kZXYvMTk5OS1PY3RvYmVyLzAwMzg4OS5odG1sICovCisgICAgdW5zaWduZWQgbG9uZyBqdW5rOworICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgibWZzcHIgICAlMSwyNjlcblx0IiAgLyogbWZ0YnUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1mc3ByICAgJUwwLDI2OFxuXHQiIC8qIG1mdGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1mc3ByICAgJTAsMjY5XG5cdCIgIC8qIG1mdGJ1ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjbXB3ICAgICUwLCUxXG5cdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJuZSAgICAgJC0xNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiIChyZXR2YWwpLCAiPXIiIChqdW5rKSk7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzKHZvaWQpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgYXNtIHZvbGF0aWxlICgicmR0c2MiIDogIj1BIiAodmFsKSk7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzKHZvaWQpCit7CisgICAgdWludDMyX3QgbG93LGhpZ2g7CisgICAgaW50NjRfdCB2YWw7CisgICAgYXNtIHZvbGF0aWxlKCJyZHRzYyIgOiAiPWEiIChsb3cpLCAiPWQiIChoaWdoKSk7CisgICAgdmFsID0gaGlnaDsKKyAgICB2YWwgPDw9IDMyOworICAgIHZhbCB8PSBsb3c7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2VsaWYgZGVmaW5lZChfX2hwcGFfXykKKworc3RhdGljIGlubGluZSBpbnQ2NF90IGNwdV9nZXRfcmVhbF90aWNrcyh2b2lkKQoreworICAgIGludCB2YWw7CisgICAgYXNtIHZvbGF0aWxlICgibWZjdGwgJSVjcjE2LCAlMCIgOiAiPXIiKHZhbCkpOworICAgIHJldHVybiB2YWw7Cit9CisKKyNlbGlmIGRlZmluZWQoX19pYTY0KQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzKHZvaWQpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgYXNtIHZvbGF0aWxlICgibW92ICUwID0gYXIuaXRjIiA6ICI9ciIodmFsKSA6OiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHZhbDsKK30KKworI2VsaWYgZGVmaW5lZChfX3MzOTBfXykKKworc3RhdGljIGlubGluZSBpbnQ2NF90IGNwdV9nZXRfcmVhbF90aWNrcyh2b2lkKQoreworICAgIGludDY0X3QgdmFsOworICAgIGFzbSB2b2xhdGlsZSgic3RjayAwKCUxKSIgOiAiPW0iICh2YWwpIDogImEiICgmdmFsKSA6ICJjYyIpOworICAgIHJldHVybiB2YWw7Cit9CisKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzICh2b2lkKQoreworI2lmIGRlZmluZWQoX0xQNjQpCisgICAgdWludDY0X3QgICAgICAgIHJ2YWw7CisgICAgYXNtIHZvbGF0aWxlKCJyZCAlJXRpY2ssJTAiIDogIj1yIihydmFsKSk7CisgICAgcmV0dXJuIHJ2YWw7CisjZWxzZQorICAgIC8qIFdlIG5lZWQgYW4gJW8gb3IgJWcgcmVnaXN0ZXIgZm9yIHRoaXMuICBGb3IgcmVjZW50IGVub3VnaCBnY2MKKyAgICAgICB0aGVyZSBpcyBhbiAiaCIgY29uc3RyYWludCBmb3IgdGhhdC4gIERvbid0IGJvdGhlciB3aXRoIHRoYXQuICAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgaTY0OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3QgaGlnaDsKKyAgICAgICAgICAgIHVpbnQzMl90IGxvdzsKKyAgICAgICAgfSAgICAgICBpMzI7CisgICAgfSBydmFsOworICAgIGFzbSB2b2xhdGlsZSgicmQgJSV0aWNrLCUlZzE7IHNybHggJSVnMSwzMiwlMDsgbW92ICUlZzEsJTEiCisgICAgICAgICAgICAgICAgIDogIj1yIihydmFsLmkzMi5oaWdoKSwgIj1yIihydmFsLmkzMi5sb3cpIDogOiAiZzEiKTsKKyAgICByZXR1cm4gcnZhbC5pNjQ7CisjZW5kaWYKK30KKworI2VsaWYgZGVmaW5lZChfX21pcHNfXykgJiYgXAorICAgICgoZGVmaW5lZChfX21pcHNfaXNhX3JldikgJiYgX19taXBzX2lzYV9yZXYgPj0gMikgfHwgZGVmaW5lZChfX2xpbnV4X18pKQorLyoKKyAqIGJpbnV0aWxzIHdhbnRzIHRvIHVzZSByZGh3ciBvbmx5IG9uIG1pcHMzMnIyCisgKiBidXQgYXMgbGludXgga2VybmVsIGVtdWxhdGUgaXQsIGl0J3MgZmluZQorICogdG8gdXNlIGl0LgorICoKKyAqLworI2RlZmluZSBNSVBTX1JESFdSKHJkLCB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgiLnNldCAgIHB1c2hcblx0IiAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG1pcHMzMnIyXG5cdCIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJkaHdyICAlMCwgIiByZCAiXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnNldCAgIHBvcCIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAodmFsdWUpKTsgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIGlubGluZSBpbnQ2NF90IGNwdV9nZXRfcmVhbF90aWNrcyh2b2lkKQoreworICAgIC8qIE9uIGtlcm5lbHMgPj0gMi42LjI1IHJkaHdyIDxyZWc+LCAkMiBhbmQgJDMgYXJlIGVtdWxhdGVkICovCisgICAgdWludDMyX3QgY291bnQ7CisgICAgc3RhdGljIHVpbnQzMl90IGN5Y19wZXJfY291bnQgPSAwOworCisgICAgaWYgKCFjeWNfcGVyX2NvdW50KSB7CisgICAgICAgIE1JUFNfUkRIV1IoIiQzIiwgY3ljX3Blcl9jb3VudCk7CisgICAgfQorCisgICAgTUlQU19SREhXUigiJDIiLCBjb3VudCk7CisgICAgcmV0dXJuIChpbnQ2NF90KShjb3VudCAqIGN5Y19wZXJfY291bnQpOworfQorCisjZWxpZiBkZWZpbmVkKF9fYWxwaGFfXykKKworc3RhdGljIGlubGluZSBpbnQ2NF90IGNwdV9nZXRfcmVhbF90aWNrcyh2b2lkKQoreworICAgIHVpbnQ2NF90IGNjOworICAgIHVpbnQzMl90IGN1ciwgb2ZzOworCisgICAgYXNtIHZvbGF0aWxlKCJycGNjICUwIiA6ICI9ciIoY2MpKTsKKyAgICBjdXIgPSBjYzsKKyAgICBvZnMgPSBjYyA+PiAzMjsKKyAgICByZXR1cm4gY3VyIC0gb2ZzOworfQorCisjZWxzZQorLyogVGhlIGhvc3QgQ1BVIGRvZXNuJ3QgaGF2ZSBhbiBlYXNpbHkgYWNjZXNzaWJsZSBjeWNsZSBjb3VudGVyLgorICAgSnVzdCByZXR1cm4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdmFsdWUuICBUaGlzIHdpbGwgYmUKKyAgIHRvdGFsbHkgd3JvbmcsIGJ1dCBob3BlZnVsbHkgYmV0dGVyIHRoYW4gbm90aGluZy4gICovCitzdGF0aWMgaW5saW5lIGludDY0X3QgY3B1X2dldF9yZWFsX3RpY2tzICh2b2lkKQoreworICAgIHN0YXRpYyBpbnQ2NF90IHRpY2tzID0gMDsKKyAgICByZXR1cm4gdGlja3MrKzsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCitzdGF0aWMgaW5saW5lIGludDY0X3QgcHJvZmlsZV9nZXRjbG9jayh2b2lkKQoreworICAgIHJldHVybiBjcHVfZ2V0X3JlYWxfdGlja3MoKTsKK30KKworZXh0ZXJuIGludDY0X3QgcWVtdV90aW1lLCBxZW11X3RpbWVfc3RhcnQ7CitleHRlcm4gaW50NjRfdCB0bGJfZmx1c2hfdGltZTsKK2V4dGVybiBpbnQ2NF90IGRldl90aW1lOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvdGxzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTJlYTlkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FlbXUvdGxzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIEFic3RyYWN0aW9uIGxheWVyIGZvciBkZWZpbmluZyBhbmQgdXNpbmcgVExTIHZhcmlhYmxlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSZWQgSGF0LCBJbmMKKyAqIENvcHlyaWdodCAoYykgMjAxMSBMaW5hcm8gTGltaXRlZAorICoKKyAqIEF1dGhvcnM6CisgKiAgUGFvbG8gQm9uemluaSA8cGJvbnppbmlAcmVkaGF0LmNvbT4KKyAqICBQZXRlciBNYXlkZWxsIDxwZXRlci5tYXlkZWxsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgUUVNVV9UTFNfSAorI2RlZmluZSBRRU1VX1RMU19ICisKKy8qIFBlci10aHJlYWQgdmFyaWFibGVzLiBOb3RlIHRoYXQgd2Ugb25seSBoYXZlIGltcGxlbWVudGF0aW9ucworICogd2hpY2ggYXJlIHJlYWxseSB0aHJlYWQtbG9jYWwgb24gTGludXg7IHRoZSBkdW1teSBpbXBsZW1lbnRhdGlvbnMKKyAqIGRlZmluZSBwbGFpbiBnbG9iYWwgdmFyaWFibGVzLgorICoKKyAqIFRoaXMgbWVhbnMgdGhhdCBmb3IgdGhlIG1vbWVudCB1c2Ugc2hvdWxkIGJlIHJlc3RyaWN0ZWQgdG8KKyAqIHBlci1WQ1BVIHZhcmlhYmxlcywgd2hpY2ggYXJlIE9LIGJlY2F1c2U6CisgKiAgLSB0aGUgb25seSAtdXNlciBtb2RlIHN1cHBvcnRpbmcgbXVsdGlwbGUgVkNQVSB0aHJlYWRzIGlzIGxpbnV4LXVzZXIKKyAqICAtIFRDRyBzeXN0ZW0gbW9kZSBpcyBzaW5nbGUtdGhyZWFkZWQgcmVnYXJkaW5nIFZDUFVzCisgKiAgLSBLVk0gc3lzdGVtIG1vZGUgaXMgbXVsdGktdGhyZWFkZWQgYnV0IGxpbWl0ZWQgdG8gTGludXgKKyAqCisgKiBUT0RPOiBwcm9wZXIgaW1wbGVtZW50YXRpb25zIHZpYSBXaW4zMiAudGxzIHNlY3Rpb25zIGFuZAorICogUE9TSVggcHRocmVhZF9nZXRzcGVjaWZpYy4KKyAqLworI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBERUNMQVJFX1RMUyh0eXBlLCB4KSBleHRlcm4gREVGSU5FX1RMUyh0eXBlLCB4KQorI2RlZmluZSBERUZJTkVfVExTKHR5cGUsIHgpICBfX3RocmVhZCBfX3R5cGVvZl9fKHR5cGUpIHRsc19fIyN4CisjZGVmaW5lIHRsc192YXIoeCkgICAgICAgICAgIHRsc19fIyN4CisjZWxzZQorLyogRHVtbXkgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRlZmluZSBwbGFpbiBnbG9iYWwgdmFyaWFibGVzICovCisjZGVmaW5lIERFQ0xBUkVfVExTKHR5cGUsIHgpIGV4dGVybiBERUZJTkVfVExTKHR5cGUsIHgpCisjZGVmaW5lIERFRklORV9UTFModHlwZSwgeCkgIF9fdHlwZW9mX18odHlwZSkgdGxzX18jI3gKKyNkZWZpbmUgdGxzX3Zhcih4KSAgICAgICAgICAgdGxzX18jI3gKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xZW11L3R5cGVkZWZzLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90eXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiODlkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcWVtdS90eXBlZGVmcy5oCkBAIC0wLDAgKzEsODAgQEAKKyNpZm5kZWYgUUVNVV9UWVBFREVGU19ICisjZGVmaW5lIFFFTVVfVFlQRURFRlNfSAorCisvKiBBIGxvYWQgb2Ygb3BhcXVlIHR5cGVzIHNvIHRoYXQgZGV2aWNlIGluaXQgZGVjbGFyYXRpb25zIGRvbid0IGhhdmUgdG8KKyAgIHB1bGwgaW4gYWxsIHRoZSByZWFsIGRlZmluaXRpb25zLiAgKi8KK3R5cGVkZWYgc3RydWN0IFFFTVVUaW1lciBRRU1VVGltZXI7Cit0eXBlZGVmIHN0cnVjdCBRRU1VVGltZXJMaXN0R3JvdXAgUUVNVVRpbWVyTGlzdEdyb3VwOwordHlwZWRlZiBzdHJ1Y3QgUUVNVUZpbGUgUUVNVUZpbGU7Cit0eXBlZGVmIHN0cnVjdCBRRU1VQkggUUVNVUJIOworCit0eXBlZGVmIHN0cnVjdCBBaW9Db250ZXh0IEFpb0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFZpc2l0b3IgVmlzaXRvcjsKK3N0cnVjdCBNb25pdG9yOwordHlwZWRlZiBzdHJ1Y3QgTW9uaXRvciBNb25pdG9yOwordHlwZWRlZiBzdHJ1Y3QgTWlncmF0aW9uUGFyYW1zIE1pZ3JhdGlvblBhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QgUHJvcGVydHkgUHJvcGVydHk7Cit0eXBlZGVmIHN0cnVjdCBQcm9wZXJ0eUluZm8gUHJvcGVydHlJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQ29tcGF0UHJvcGVydHkgQ29tcGF0UHJvcGVydHk7Cit0eXBlZGVmIHN0cnVjdCBEZXZpY2VTdGF0ZSBEZXZpY2VTdGF0ZTsKK3R5cGVkZWYgc3RydWN0IEJ1c1N0YXRlIEJ1c1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgQnVzQ2xhc3MgQnVzQ2xhc3M7CisKK3R5cGVkZWYgc3RydWN0IEFkZHJlc3NTcGFjZSBBZGRyZXNzU3BhY2U7Cit0eXBlZGVmIHN0cnVjdCBNZW1vcnlSZWdpb24gTWVtb3J5UmVnaW9uOwordHlwZWRlZiBzdHJ1Y3QgTWVtb3J5UmVnaW9uU2VjdGlvbiBNZW1vcnlSZWdpb25TZWN0aW9uOworCit0eXBlZGVmIHN0cnVjdCBNZW1vcnlNYXBwaW5nTGlzdCBNZW1vcnlNYXBwaW5nTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgTklDSW5mbyBOSUNJbmZvOwordHlwZWRlZiBzdHJ1Y3QgSENJSW5mbyBIQ0lJbmZvOwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9TdGF0ZSBBdWRpb1N0YXRlOwordHlwZWRlZiBzdHJ1Y3QgQmxvY2tEcml2ZXJTdGF0ZSBCbG9ja0RyaXZlclN0YXRlOwordHlwZWRlZiBzdHJ1Y3QgRHJpdmVJbmZvIERyaXZlSW5mbzsKK3R5cGVkZWYgc3RydWN0IERpc3BsYXlTdGF0ZSBEaXNwbGF5U3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgRGlzcGxheUNoYW5nZUxpc3RlbmVyOwordHlwZWRlZiBzdHJ1Y3QgRGlzcGxheVN1cmZhY2UgRGlzcGxheVN1cmZhY2U7Cit0eXBlZGVmIHN0cnVjdCBQaXhlbEZvcm1hdCBQaXhlbEZvcm1hdDsKK3R5cGVkZWYgc3RydWN0IFFlbXVDb25zb2xlIFFlbXVDb25zb2xlOwordHlwZWRlZiBzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlIENoYXJEcml2ZXJTdGF0ZTsKK3R5cGVkZWYgc3RydWN0IE1BQ0FkZHIgTUFDQWRkcjsKK3R5cGVkZWYgc3RydWN0IE5ldENsaWVudFN0YXRlIE5ldENsaWVudFN0YXRlOwordHlwZWRlZiBzdHJ1Y3QgaTJjX2J1cyBpMmNfYnVzOwordHlwZWRlZiBzdHJ1Y3QgSVNBQnVzIElTQUJ1czsKK3R5cGVkZWYgc3RydWN0IElTQURldmljZSBJU0FEZXZpY2U7Cit0eXBlZGVmIHN0cnVjdCBTTUJ1c0RldmljZSBTTUJ1c0RldmljZTsKK3R5cGVkZWYgc3RydWN0IFBDSUhvc3RTdGF0ZSBQQ0lIb3N0U3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBQQ0lFeHByZXNzSG9zdCBQQ0lFeHByZXNzSG9zdDsKK3R5cGVkZWYgc3RydWN0IFBDSUJ1cyBQQ0lCdXM7Cit0eXBlZGVmIHN0cnVjdCBQQ0lEZXZpY2UgUENJRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgUENJRXhwcmVzc0RldmljZSBQQ0lFeHByZXNzRGV2aWNlOwordHlwZWRlZiBzdHJ1Y3QgUENJQnJpZGdlIFBDSUJyaWRnZTsKK3R5cGVkZWYgc3RydWN0IFBDSUVBRVJNc2cgUENJRUFFUk1zZzsKK3R5cGVkZWYgc3RydWN0IFBDSUVBRVJMb2cgUENJRUFFUkxvZzsKK3R5cGVkZWYgc3RydWN0IFBDSUVBRVJFcnIgUENJRUFFUkVycjsKK3R5cGVkZWYgc3RydWN0IFBDSUVQb3J0IFBDSUVQb3J0OwordHlwZWRlZiBzdHJ1Y3QgUENJRVNsb3QgUENJRVNsb3Q7Cit0eXBlZGVmIHN0cnVjdCBNU0lNZXNzYWdlIE1TSU1lc3NhZ2U7Cit0eXBlZGVmIHN0cnVjdCBTZXJpYWxTdGF0ZSBTZXJpYWxTdGF0ZTsKK3R5cGVkZWYgc3RydWN0IFBDTUNJQUNhcmRTdGF0ZSBQQ01DSUFDYXJkU3RhdGU7Cit0eXBlZGVmIHN0cnVjdCBNb3VzZVRyYW5zZm9ybUluZm8gTW91c2VUcmFuc2Zvcm1JbmZvOwordHlwZWRlZiBzdHJ1Y3QgdVdpcmVTbGF2ZSB1V2lyZVNsYXZlOwordHlwZWRlZiBzdHJ1Y3QgSTJTQ29kZWMgSTJTQ29kZWM7Cit0eXBlZGVmIHN0cnVjdCBTU0lCdXMgU1NJQnVzOwordHlwZWRlZiBzdHJ1Y3QgRXZlbnROb3RpZmllciBFdmVudE5vdGlmaWVyOwordHlwZWRlZiBzdHJ1Y3QgVmlydElPRGV2aWNlIFZpcnRJT0RldmljZTsKK3R5cGVkZWYgc3RydWN0IFFFTVVTR0xpc3QgUUVNVVNHTGlzdDsKK3R5cGVkZWYgc3RydWN0IFNIUENEZXZpY2UgU0hQQ0RldmljZTsKK3R5cGVkZWYgc3RydWN0IEZXQ2ZnU3RhdGUgRldDZmdTdGF0ZTsKK3R5cGVkZWYgc3RydWN0IFBjR3Vlc3RJbmZvIFBjR3Vlc3RJbmZvOwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2UgUmFuZ2U7CisKKy8vIE5PVEUoZGlnaXQpOiBSZW1vdmUgdHlwZWRlZnMgYmVsb3cgd2hlbiBldmVyeXRoaW5nIGlzIHVwc3RyZWFtZWQuCit0eXBlZGVmIHN0cnVjdCBEaXNwbGF5QWxsb2NhdG9yIERpc3BsYXlBbGxvY2F0b3I7Cit0eXBlZGVmIHN0cnVjdCBJUlFTdGF0ZSAqcWVtdV9pcnE7Cit0eXBlZGVmIHN0cnVjdCBWTEFOU3RhdGUgVkxBTlN0YXRlOwordHlwZWRlZiBzdHJ1Y3QgVkxBTkNsaWVudFN0YXRlIFZMQU5DbGllbnRTdGF0ZTsKKworI2VuZGlmIC8qIFFFTVVfVFlQRURFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3FvbS9jcHUuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xb20vY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYWFlOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xb20vY3B1LmgKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBRRU1VIENQVSBtb2RlbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBTVVNFIExJTlVYIFByb2R1Y3RzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZQorICogPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWw+CisgKi8KKyNpZm5kZWYgUUVNVV9DUFVfSAorI2RlZmluZSBRRU1VX0NQVV9ICisKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJody9xZGV2LWNvcmUuaCIKKyNpbmNsdWRlICJleGVjL2h3YWRkci5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxZW11L3RocmVhZC5oIgorI2luY2x1ZGUgInFlbXUvdGxzLmgiCisjaW5jbHVkZSAicWVtdS90eXBlZGVmcy5oIgorCit0eXBlZGVmIGludCAoKldyaXRlQ29yZUR1bXBGdW5jdGlvbikodm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgdm9pZCAqb3BhcXVlKTsKKworLyoqCisgKiB2YWRkcjoKKyAqIFR5cGUgd2lkZSBlbm91Z2ggdG8gY29udGFpbiBhbnkgI3RhcmdldF91bG9uZyB2aXJ0dWFsIGFkZHJlc3MuCisgKi8KK3R5cGVkZWYgdWludDY0X3QgdmFkZHI7CisjZGVmaW5lIFZBRERSX1BSSWQgUFJJZDY0CisjZGVmaW5lIFZBRERSX1BSSXUgUFJJdTY0CisjZGVmaW5lIFZBRERSX1BSSW8gUFJJbzY0CisjZGVmaW5lIFZBRERSX1BSSXggUFJJeDY0CisjZGVmaW5lIFZBRERSX1BSSVggUFJJWDY0CisjZGVmaW5lIFZBRERSX01BWCBVSU5UNjRfTUFYCisKK3R5cGVkZWYgc3RydWN0IENQVVN0YXRlIENQVVN0YXRlOworCit0eXBlZGVmIHZvaWQgKCpDUFVVbmFzc2lnbmVkQWNjZXNzKShDUFVTdGF0ZSAqY3B1LCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfd3JpdGUsIGJvb2wgaXNfZXhlYywgaW50IG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpOworCitzdHJ1Y3QgVHJhbnNsYXRpb25CbG9jazsKKworLy8gVE9ETyhkaWdpdCk6IE1ha2UgdGhpcyBhIHByb3BlciBRT00gb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbQorLy8gRGV2aWNlU3RhdGUvRGV2aWNlQ2xhc3MuCitzdHJ1Y3QgQ1BVU3RhdGUgeworICAgIGludCBucl9jb3JlczsKKyAgICBpbnQgbnJfdGhyZWFkczsKKyAgICBpbnQgbnVtYV9ub2RlOworCisgICAgc3RydWN0IFFlbXVUaHJlYWQgKnRocmVhZDsKKworICAgIHVpbnQzMl90IGhvc3RfdGlkOyAvKiBob3N0IHRocmVhZCBJRCAqLworICAgIGludCBydW5uaW5nOyAvKiBOb256ZXJvIGlmIGNwdSBpcyBjdXJyZW50bHkgcnVubmluZyh1c2VybW9kZSkuICAqLworICAgIHN0cnVjdCBRZW11Q29uZCAqaGFsdF9jb25kOworICAgIHN0cnVjdCBxZW11X3dvcmtfaXRlbSAqcXVldWVkX3dvcmtfZmlyc3QsICpxdWV1ZWRfd29ya19sYXN0OworCisgICAgdWludDMyX3QgY3JlYXRlZDsKKyAgICB1aW50MzJfdCBzdG9wOyAgIC8qIFN0b3AgcmVxdWVzdCAqLworICAgIHVpbnQzMl90IHN0b3BwZWQ7IC8qIEFydGlmaWNpYWxseSBzdG9wcGVkICovCisKKyAgICB2b2xhdGlsZSBzaWdfYXRvbWljX3QgZXhpdF9yZXF1ZXN0OworICAgIHZvbGF0aWxlIHNpZ19hdG9taWNfdCB0Y2dfZXhpdF9yZXE7CisgICAgdWludDMyX3QgaW50ZXJydXB0X3JlcXVlc3Q7CisKKyAgICB2b2lkICplbnZfcHRyOyAvKiBDUFVBcmNoU3RhdGUgKi8KKyAgICBzdHJ1Y3QgVHJhbnNsYXRpb25CbG9jayAqY3VycmVudF90YjsgLyogY3VycmVudGx5IGV4ZWN1dGluZyBUQiAgKi8KKyAgICBpbnQgc2luZ2xlc3RlcF9lbmFibGVkOworICAgIHN0cnVjdCBHREJSZWdpc3RlclN0YXRlICpnZGJfcmVnczsKKyAgICBRVEFJTFFfRU5UUlkoQ1BVU3RhdGUpIG5vZGU7ICAgLyogbmV4dCBDUFUgc2hhcmluZyBUQiBjYWNoZSAqLworCisgICAgY29uc3QgY2hhciAqY3B1X21vZGVsX3N0cjsKKworICAgIGludCBrdm1fZmQ7CisgICAgaW50IGt2bV92Y3B1X2RpcnR5OworICAgIHN0cnVjdCBLVk1TdGF0ZSAqa3ZtX3N0YXRlOworICAgIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuOworCisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICpoYXhfdmNwdTsKKworICAgIC8qIFRPRE8gTW92ZSBjb21tb24gZmllbGRzIGZyb20gQ1BVQXJjaFN0YXRlIGhlcmUuICovCisgICAgaW50IGNwdV9pbmRleDsgLyogdXNlZCBieSBhbHBoYSBUQ0cgKi8KKyAgICB1aW50MzJfdCBoYWx0ZWQ7IC8qIHVzZWQgYnkgYWxwaGEsIGNyaXMsIHBwYyBUQ0cgKi8KK307CisKKyNkZWZpbmUgQ1BVKG9iaikgICgoQ1BVU3RhdGUqKShvYmopKQorCitRVEFJTFFfSEVBRChDUFVUYWlsUSwgQ1BVU3RhdGUpOworZXh0ZXJuIHN0cnVjdCBDUFVUYWlsUSBjcHVzOworI2RlZmluZSBDUFVfTkVYVChjcHUpIFFUQUlMUV9ORVhUKGNwdSwgbm9kZSkKKyNkZWZpbmUgQ1BVX0ZPUkVBQ0goY3B1KSBRVEFJTFFfRk9SRUFDSChjcHUsICZjcHVzLCBub2RlKQorI2RlZmluZSBDUFVfRk9SRUFDSF9TQUZFKGNwdSwgbmV4dF9jcHUpIFwKKyAgICBRVEFJTFFfRk9SRUFDSF9TQUZFKGNwdSwgJmNwdXMsIG5vZGUsIG5leHRfY3B1KQorI2RlZmluZSBmaXJzdF9jcHUgUVRBSUxRX0ZJUlNUKCZjcHVzKQorCitERUNMQVJFX1RMUyhDUFVTdGF0ZSAqLCBjdXJyZW50X2NwdSk7CisjZGVmaW5lIGN1cnJlbnRfY3B1IHRsc192YXIoY3VycmVudF9jcHUpCisKKy8vIFRPRE8oZGlnaXQpOiBSZW1vdmUgdGhpcy4KKyNkZWZpbmUgY3B1X3NpbmdsZV9lbnYgKChDUFVBcmNoU3RhdGUqKWN1cnJlbnRfY3B1LT5lbnZfcHRyKQorCisvKioKKyAqIENQVUR1bXBGbGFnczoKKyAqIEBDUFVfRFVNUF9DT0RFOgorICogQENQVV9EVU1QX0ZQVTogZHVtcCBGUFUgcmVnaXN0ZXIgc3RhdGUsIG5vdCBqdXN0IGludGVnZXIKKyAqIEBDUFVfRFVNUF9DQ09QOiBkdW1wIGluZm8gYWJvdXQgVENHIFFFTVUncyBjb25kaXRpb24gY29kZSBvcHRpbWl6YXRpb24gc3RhdGUKKyAqLworZW51bSBDUFVEdW1wRmxhZ3MgeworICAgIENQVV9EVU1QX0NPREUgPSAweDAwMDEwMDAwLAorICAgIENQVV9EVU1QX0ZQVSAgPSAweDAwMDIwMDAwLAorICAgIENQVV9EVU1QX0NDT1AgPSAweDAwMDQwMDAwLAorfTsKKworLyoqCisgKiBjcHVfZHVtcF9zdGF0ZToKKyAqIEBjcHU6IFRoZSBDUFUgd2hvc2Ugc3RhdGUgaXMgdG8gYmUgZHVtcGVkLgorICogQGY6IEZpbGUgdG8gZHVtcCB0by4KKyAqIEBjcHVfZnByaW50ZjogRnVuY3Rpb24gdG8gZHVtcCB3aXRoLgorICogQGZsYWdzOiBGbGFncyB3aGF0IHRvIGR1bXAuCisgKgorICogRHVtcHMgQ1BVIHN0YXRlLgorICovCit2b2lkIGNwdV9kdW1wX3N0YXRlKENQVVN0YXRlICpjcHUsIEZJTEUgKmYsIGZwcmludGZfZnVuY3Rpb24gY3B1X2ZwcmludGYsCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKy8qKgorICogY3B1X2R1bXBfc3RhdGlzdGljczoKKyAqIEBjcHU6IFRoZSBDUFUgd2hvc2Ugc3RhdGUgaXMgdG8gYmUgZHVtcGVkLgorICogQGY6IEZpbGUgdG8gZHVtcCB0by4KKyAqIEBjcHVfZnByaW50ZjogRnVuY3Rpb24gdG8gZHVtcCB3aXRoLgorICogQGZsYWdzOiBGbGFncyB3aGF0IHRvIGR1bXAuCisgKgorICogRHVtcHMgQ1BVIHN0YXRpc3RpY3MuCisgKi8KK3ZvaWQgY3B1X2R1bXBfc3RhdGlzdGljcyhDUFVTdGF0ZSAqY3B1LCBGSUxFICpmLCBmcHJpbnRmX2Z1bmN0aW9uIGNwdV9mcHJpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKy8qKgorICogY3B1X3Jlc2V0OgorICogQGNwdTogVGhlIENQVSB3aG9zZSBzdGF0ZSBpcyB0byBiZSByZXNldC4KKyAqLwordm9pZCBjcHVfcmVzZXQoQ1BVU3RhdGUgKmNwdSk7CisKKy8qKgorICogcWVtdV9jcHVfaGFzX3dvcms6CisgKiBAY3B1OiBUaGUgdkNQVSB0byBjaGVjay4KKyAqCisgKiBDaGVja3Mgd2hldGhlciB0aGUgQ1BVIGhhcyB3b3JrIHRvIGRvLgorICoKKyAqIFJldHVybnM6ICV0cnVlIGlmIHRoZSBDUFUgaGFzIHdvcmssICVmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgcWVtdV9jcHVfaGFzX3dvcmsoQ1BVU3RhdGUgKmNwdSk7CisKKy8qKgorICogcWVtdV9jcHVfaXNfc2VsZjoKKyAqIEBjcHU6IFRoZSB2Q1BVIHRvIGNoZWNrIGFnYWluc3QuCisgKgorICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGxlciBpcyBleGVjdXRpbmcgb24gdGhlIHZDUFUgdGhyZWFkLgorICoKKyAqIFJldHVybnM6ICV0cnVlIGlmIGNhbGxlZCBmcm9tIEBjcHUncyB0aHJlYWQsICVmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgcWVtdV9jcHVfaXNfc2VsZihDUFVTdGF0ZSAqY3B1KTsKKworLyoqCisgKiBxZW11X2NwdV9raWNrOgorICogQGNwdTogVGhlIHZDUFUgdG8ga2ljay4KKyAqCisgKiBLaWNrcyBAY3B1J3MgdGhyZWFkLgorICovCit2b2lkIHFlbXVfY3B1X2tpY2soQ1BVU3RhdGUgKmNwdSk7CisKKy8qKgorICogY3B1X2lzX3N0b3BwZWQ6CisgKiBAY3B1OiBUaGUgQ1BVIHRvIGNoZWNrLgorICoKKyAqIENoZWNrcyB3aGV0aGVyIHRoZSBDUFUgaXMgc3RvcHBlZC4KKyAqCisgKiBSZXR1cm5zOiAldHJ1ZSBpZiBydW4gc3RhdGUgaXMgbm90IHJ1bm5pbmcgb3IgaWYgYXJ0aWZpY2lhbGx5IHN0b3BwZWQ7CisgKiAlZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIGNwdV9pc19zdG9wcGVkKENQVVN0YXRlICpjcHUpOworCisvKioKKyAqIHJ1bl9vbl9jcHU6CisgKiBAY3B1OiBUaGUgdkNQVSB0byBydW4gb24uCisgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLgorICogQGRhdGE6IERhdGEgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uCisgKgorICogU2NoZWR1bGVzIHRoZSBmdW5jdGlvbiBAZnVuYyBmb3IgZXhlY3V0aW9uIG9uIHRoZSB2Q1BVIEBjcHUuCisgKi8KK3ZvaWQgcnVuX29uX2NwdShDUFVTdGF0ZSAqY3B1LCB2b2lkICgqZnVuYykodm9pZCAqZGF0YSksIHZvaWQgKmRhdGEpOworCisvKioKKyAqIHFlbXVfZ2V0X2NwdToKKyAqIEBpbmRleDogVGhlIENQVVN0YXRlQGNwdV9pbmRleCB2YWx1ZSBvZiB0aGUgQ1BVIHRvIG9idGFpbi4KKyAqCisgKiBHZXRzIGEgQ1BVIG1hdGNoaW5nIEBpbmRleC4KKyAqCisgKiBSZXR1cm5zOiBUaGUgQ1BVIG9yICVOVUxMIGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIENQVS4KKyAqLworQ1BVU3RhdGUgKnFlbXVfZ2V0X2NwdShpbnQgaW5kZXgpOworCisvKioKKyAqIGNwdV9pbnRlcnJ1cHQ6CisgKiBAY3B1OiBUaGUgQ1BVIHRvIHNldCBhbiBpbnRlcnJ1cHQgb24uCisgKiBAbWFzazogVGhlIGludGVydXB0cyB0byBzZXQuCisgKgorICogSW52b2tlcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3ZvaWQgY3B1X2ludGVycnVwdChDUFVTdGF0ZSAqY3B1LCBpbnQgbWFzayk7CisKKy8qKgorICogY3B1X3Jlc2V0X2ludGVycnVwdDoKKyAqIEBjcHU6IFRoZSBDUFUgdG8gY2xlYXIgdGhlIGludGVycnVwdCBvbi4KKyAqIEBtYXNrOiBUaGUgaW50ZXJydXB0IG1hc2sgdG8gY2xlYXIuCisgKgorICogUmVzZXRzIGludGVycnVwdHMgb24gdGhlIHZDUFUgQGNwdS4KKyAqLwordm9pZCBjcHVfcmVzZXRfaW50ZXJydXB0KENQVVN0YXRlICpjcHUsIGludCBtYXNrKTsKKworLyoqCisgKiBjcHVfZXhpdDoKKyAqIEBjcHU6IFRoZSBDUFUgdG8gZXhpdC4KKyAqCisgKiBSZXF1ZXN0cyB0aGUgQ1BVIEBjcHUgdG8gZXhpdCBleGVjdXRpb24uCisgKi8KK3ZvaWQgY3B1X2V4aXQoQ1BVU3RhdGUgKmNwdSk7CisKKy8qKgorICogY3B1X3Jlc3VtZToKKyAqIEBjcHU6IFRoZSBDUFUgdG8gcmVzdW1lLgorICoKKyAqIFJlc3VtZXMgQ1BVLCBpLmUuIHB1dHMgQ1BVIGludG8gcnVubmFibGUgc3RhdGUuCisgKi8KK3ZvaWQgY3B1X3Jlc3VtZShDUFVTdGF0ZSAqY3B1KTsKKworLyoqCisgKiBxZW11X2luaXRfdmNwdToKKyAqIEBjcHU6IFRoZSB2Q1BVIHRvIGluaXRpYWxpemUuCisgKgorICogSW5pdGlhbGl6ZXMgYSB2Q1BVLgorICovCit2b2lkIHFlbXVfaW5pdF92Y3B1KENQVVN0YXRlICpjcHUpOworCisjZGVmaW5lIFNTVEVQX0VOQUJMRSAgMHgxICAvKiBFbmFibGUgc2ltdWxhdGVkIEhXIHNpbmdsZSBzdGVwcGluZyAqLworI2RlZmluZSBTU1RFUF9OT0lSUSAgIDB4MiAgLyogRG8gbm90IHVzZSBJUlEgd2hpbGUgc2luZ2xlIHN0ZXBwaW5nICovCisjZGVmaW5lIFNTVEVQX05PVElNRVIgMHg0ICAvKiBEbyBub3QgVGltZXJzIHdoaWxlIHNpbmdsZSBzdGVwcGluZyAqLworCisvKioKKyAqIGNwdV9zaW5nbGVfc3RlcDoKKyAqIEBjcHU6IENQVSB0byB0aGUgZmxhZ3MgZm9yLgorICogQGVuYWJsZWQ6IEZsYWdzIHRvIGVuYWJsZS4KKyAqCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIHNpbmdsZS1zdGVwcGluZyBmb3IgQGNwdS4KKyAqLwordm9pZCBjcHVfc2luZ2xlX3N0ZXAoQ1BVU3RhdGUgKmNwdSwgaW50IGVuYWJsZWQpOworCisjZW5kaWYgIC8vIFFFTVVfQ1BVX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xb20vb2JqZWN0LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcW9tL29iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzVkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcW9tL29iamVjdC5oCkBAIC0wLDAgKzEsMTE5NCBAQAorLyoKKyAqIFFFTVUgT2JqZWN0IE1vZGVsCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUUVNVV9PQkpFQ1RfSAorI2RlZmluZSBRRU1VX09CSkVDVF9ICisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCisKK3N0cnVjdCBWaXNpdG9yOworCitzdHJ1Y3QgVHlwZUltcGw7Cit0eXBlZGVmIHN0cnVjdCBUeXBlSW1wbCAqVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgT2JqZWN0Q2xhc3MgT2JqZWN0Q2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBPYmplY3QgT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCBUeXBlSW5mbyBUeXBlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgSW50ZXJmYWNlQ2xhc3MgSW50ZXJmYWNlQ2xhc3M7Cit0eXBlZGVmIHN0cnVjdCBJbnRlcmZhY2VJbmZvIEludGVyZmFjZUluZm87CisKKyNkZWZpbmUgVFlQRV9PQkpFQ1QgIm9iamVjdCIKKworLyoqCisgKiBTRUNUSU9OOm9iamVjdC5oCisgKiBAdGl0bGU6QmFzZSBPYmplY3QgVHlwZSBTeXN0ZW0KKyAqIEBzaG9ydF9kZXNjcmlwdGlvbjogaW50ZXJmYWNlcyBmb3IgY3JlYXRpbmcgbmV3IHR5cGVzIGFuZCBvYmplY3RzCisgKgorICogVGhlIFFFTVUgT2JqZWN0IE1vZGVsIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciByZWdpc3RlcmluZyB1c2VyIGNyZWF0YWJsZQorICogdHlwZXMgYW5kIGluc3RhbnRpYXRpbmcgb2JqZWN0cyBmcm9tIHRob3NlIHR5cGVzLiAgUU9NIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKKyAqIGZlYXR1cmVzOgorICoKKyAqICAtIFN5c3RlbSBmb3IgZHluYW1pY2FsbHkgcmVnaXN0ZXJpbmcgdHlwZXMKKyAqICAtIFN1cHBvcnQgZm9yIHNpbmdsZS1pbmhlcml0YW5jZSBvZiB0eXBlcworICogIC0gTXVsdGlwbGUgaW5oZXJpdGFuY2Ugb2Ygc3RhdGVsZXNzIGludGVyZmFjZXMKKyAqCisgKiA8ZXhhbXBsZT4KKyAqICAgPHRpdGxlPkNyZWF0aW5nIGEgbWluaW1hbCB0eXBlPC90aXRsZT4KKyAqICAgPHByb2dyYW1saXN0aW5nPgorICogI2luY2x1ZGUgInFkZXYuaCIKKyAqCisgKiAjZGVmaW5lIFRZUEVfTVlfREVWSUNFICJteS1kZXZpY2UiCisgKgorICogLy8gTm8gbmV3IHZpcnR1YWwgZnVuY3Rpb25zOiB3ZSBjYW4gcmV1c2UgdGhlIHR5cGVkZWYgZm9yIHRoZQorICogLy8gc3VwZXJjbGFzcy4KKyAqIHR5cGVkZWYgRGV2aWNlQ2xhc3MgTXlEZXZpY2VDbGFzczsKKyAqIHR5cGVkZWYgc3RydWN0IE15RGV2aWNlCisgKiB7CisgKiAgICAgRGV2aWNlU3RhdGUgcGFyZW50OworICoKKyAqICAgICBpbnQgcmVnMCwgcmVnMSwgcmVnMjsKKyAqIH0gTXlEZXZpY2U7CisgKgorICogc3RhdGljIGNvbnN0IFR5cGVJbmZvIG15X2RldmljZV9pbmZvID0geworICogICAgIC5uYW1lID0gVFlQRV9NWV9ERVZJQ0UsCisgKiAgICAgLnBhcmVudCA9IFRZUEVfREVWSUNFLAorICogICAgIC5pbnN0YW5jZV9zaXplID0gc2l6ZW9mKE15RGV2aWNlKSwKKyAqIH07CisgKgorICogc3RhdGljIHZvaWQgbXlfZGV2aWNlX3JlZ2lzdGVyX3R5cGVzKHZvaWQpCisgKiB7CisgKiAgICAgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJm15X2RldmljZV9pbmZvKTsKKyAqIH0KKyAqCisgKiB0eXBlX2luaXQobXlfZGV2aWNlX3JlZ2lzdGVyX3R5cGVzKQorICogICA8L3Byb2dyYW1saXN0aW5nPgorICogPC9leGFtcGxlPgorICoKKyAqIEluIHRoZSBhYm92ZSBleGFtcGxlLCB3ZSBjcmVhdGUgYSBzaW1wbGUgdHlwZSB0aGF0IGlzIGRlc2NyaWJlZCBieSAjVHlwZUluZm8uCisgKiAjVHlwZUluZm8gZGVzY3JpYmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIGluY2x1ZGluZyB3aGF0IGl0IGluaGVyaXRzCisgKiBmcm9tLCB0aGUgaW5zdGFuY2UgYW5kIGNsYXNzIHNpemUsIGFuZCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGhvb2tzLgorICoKKyAqIEV2ZXJ5IHR5cGUgaGFzIGFuICNPYmplY3RDbGFzcyBhc3NvY2lhdGVkIHdpdGggaXQuICAjT2JqZWN0Q2xhc3MgZGVyaXZhdGl2ZXMKKyAqIGFyZSBpbnN0YW50aWF0ZWQgZHluYW1pY2FsbHkgYnV0IHRoZXJlIGlzIG9ubHkgZXZlciBvbmUgaW5zdGFuY2UgZm9yIGFueQorICogZ2l2ZW4gdHlwZS4gIFRoZSAjT2JqZWN0Q2xhc3MgdHlwaWNhbGx5IGhvbGRzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMKKyAqIGZvciB0aGUgdmlydHVhbCBtZXRob2RzIGltcGxlbWVudGVkIGJ5IHRoaXMgdHlwZS4KKyAqCisgKiBVc2luZyBvYmplY3RfbmV3KCksIGEgbmV3ICNPYmplY3QgZGVyaXZhdGl2ZSB3aWxsIGJlIGluc3RhbnRpYXRlZC4gIFlvdSBjYW4KKyAqIGNhc3QgYW4gI09iamVjdCB0byBhIHN1YmNsYXNzIChvciBiYXNlLWNsYXNzKSB0eXBlIHVzaW5nCisgKiBvYmplY3RfZHluYW1pY19jYXN0KCkuICBZb3UgdHlwaWNhbGx5IHdhbnQgdG8gZGVmaW5lIG1hY3JvIHdyYXBwZXJzIGFyb3VuZAorICogT0JKRUNUX0NIRUNLKCkgYW5kIE9CSkVDVF9DTEFTU19DSEVDSygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvbnZlcnQgdG8gYQorICogc3BlY2lmaWMgdHlwZToKKyAqCisgKiA8ZXhhbXBsZT4KKyAqICAgPHRpdGxlPlR5cGVjYXN0aW5nIG1hY3JvczwvdGl0bGU+CisgKiAgIDxwcm9ncmFtbGlzdGluZz4KKyAqICAgICNkZWZpbmUgTVlfREVWSUNFX0dFVF9DTEFTUyhvYmopIFwKKyAqICAgICAgIE9CSkVDVF9HRVRfQ0xBU1MoTXlEZXZpY2VDbGFzcywgb2JqLCBUWVBFX01ZX0RFVklDRSkKKyAqICAgICNkZWZpbmUgTVlfREVWSUNFX0NMQVNTKGtsYXNzKSBcCisgKiAgICAgICBPQkpFQ1RfQ0xBU1NfQ0hFQ0soTXlEZXZpY2VDbGFzcywga2xhc3MsIFRZUEVfTVlfREVWSUNFKQorICogICAgI2RlZmluZSBNWV9ERVZJQ0Uob2JqKSBcCisgKiAgICAgICBPQkpFQ1RfQ0hFQ0soTXlEZXZpY2UsIG9iaiwgVFlQRV9NWV9ERVZJQ0UpCisgKiAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgKiA8L2V4YW1wbGU+CisgKgorICogIyBDbGFzcyBJbml0aWFsaXphdGlvbiAjCisgKgorICogQmVmb3JlIGFuIG9iamVjdCBpcyBpbml0aWFsaXplZCwgdGhlIGNsYXNzIGZvciB0aGUgb2JqZWN0IG11c3QgYmUKKyAqIGluaXRpYWxpemVkLiAgVGhlcmUgaXMgb25seSBvbmUgY2xhc3Mgb2JqZWN0IGZvciBhbGwgaW5zdGFuY2Ugb2JqZWN0cworICogdGhhdCBpcyBjcmVhdGVkIGxhemlseS4KKyAqCisgKiBDbGFzc2VzIGFyZSBpbml0aWFsaXplZCBieSBmaXJzdCBpbml0aWFsaXppbmcgYW55IHBhcmVudCBjbGFzc2VzIChpZgorICogbmVjZXNzYXJ5KS4gIEFmdGVyIHRoZSBwYXJlbnQgY2xhc3Mgb2JqZWN0IGhhcyBpbml0aWFsaXplZCwgaXQgd2lsbCBiZQorICogY29waWVkIGludG8gdGhlIGN1cnJlbnQgY2xhc3Mgb2JqZWN0IGFuZCBhbnkgYWRkaXRpb25hbCBzdG9yYWdlIGluIHRoZQorICogY2xhc3Mgb2JqZWN0IGlzIHplcm8gZmlsbGVkLgorICoKKyAqIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGNsYXNzZXMgYXV0b21hdGljYWxseSBpbmhlcml0IGFueSB2aXJ0dWFsCisgKiBmdW5jdGlvbiBwb2ludGVycyB0aGF0IHRoZSBwYXJlbnQgY2xhc3MgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQuICBBbGwKKyAqIG90aGVyIGZpZWxkcyB3aWxsIGJlIHplcm8gZmlsbGVkLgorICoKKyAqIE9uY2UgYWxsIG9mIHRoZSBwYXJlbnQgY2xhc3NlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsICNUeXBlSW5mbzo6Y2xhc3NfaW5pdAorICogaXMgY2FsbGVkIHRvIGxldCB0aGUgY2xhc3MgYmVpbmcgaW5zdGFudGlhdGVkIHByb3ZpZGUgZGVmYXVsdCBpbml0aWFsaXplIGZvcgorICogaXRzIHZpcnR1YWwgZnVuY3Rpb25zLiAgSGVyZSBpcyBob3cgdGhlIGFib3ZlIGV4YW1wbGUgbWlnaHQgYmUgbW9kaWZpZWQKKyAqIHRvIGludHJvZHVjZSBhbiBvdmVycmlkZGVuIHZpcnR1YWwgZnVuY3Rpb246CisgKgorICogPGV4YW1wbGU+CisgKiAgIDx0aXRsZT5PdmVycmlkaW5nIGEgdmlydHVhbCBmdW5jdGlvbjwvdGl0bGU+CisgKiAgIDxwcm9ncmFtbGlzdGluZz4KKyAqICNpbmNsdWRlICJxZGV2LmgiCisgKgorICogdm9pZCBteV9kZXZpY2VfY2xhc3NfaW5pdChPYmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKmNsYXNzX2RhdGEpCisgKiB7CisgKiAgICAgRGV2aWNlQ2xhc3MgKmRjID0gREVWSUNFX0NMQVNTKGtsYXNzKTsKKyAqICAgICBkYy0+cmVzZXQgPSBteV9kZXZpY2VfcmVzZXQ7CisgKiB9CisgKgorICogc3RhdGljIGNvbnN0IFR5cGVJbmZvIG15X2RldmljZV9pbmZvID0geworICogICAgIC5uYW1lID0gVFlQRV9NWV9ERVZJQ0UsCisgKiAgICAgLnBhcmVudCA9IFRZUEVfREVWSUNFLAorICogICAgIC5pbnN0YW5jZV9zaXplID0gc2l6ZW9mKE15RGV2aWNlKSwKKyAqICAgICAuY2xhc3NfaW5pdCA9IG15X2RldmljZV9jbGFzc19pbml0LAorICogfTsKKyAqICAgPC9wcm9ncmFtbGlzdGluZz4KKyAqIDwvZXhhbXBsZT4KKyAqCisgKiBJbnRyb2R1Y2luZyBuZXcgdmlydHVhbCBtZXRob2RzIHJlcXVpcmVzIGEgY2xhc3MgdG8gZGVmaW5lIGl0cyBvd24KKyAqIHN0cnVjdCBhbmQgdG8gYWRkIGEgLmNsYXNzX3NpemUgbWVtYmVyIHRvIHRoZSAjVHlwZUluZm8uICBFYWNoIG1ldGhvZAorICogd2lsbCBhbHNvIGhhdmUgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNhbGwgaXQgZWFzaWx5OgorICoKKyAqIDxleGFtcGxlPgorICogICA8dGl0bGU+RGVmaW5pbmcgYW4gYWJzdHJhY3QgY2xhc3M8L3RpdGxlPgorICogICA8cHJvZ3JhbWxpc3Rpbmc+CisgKiAjaW5jbHVkZSAicWRldi5oIgorICoKKyAqIHR5cGVkZWYgc3RydWN0IE15RGV2aWNlQ2xhc3MKKyAqIHsKKyAqICAgICBEZXZpY2VDbGFzcyBwYXJlbnQ7CisgKgorICogICAgIHZvaWQgKCpmcm9ibmljYXRlKSAoTXlEZXZpY2UgKm9iaik7CisgKiB9IE15RGV2aWNlQ2xhc3M7CisgKgorICogc3RhdGljIGNvbnN0IFR5cGVJbmZvIG15X2RldmljZV9pbmZvID0geworICogICAgIC5uYW1lID0gVFlQRV9NWV9ERVZJQ0UsCisgKiAgICAgLnBhcmVudCA9IFRZUEVfREVWSUNFLAorICogICAgIC5pbnN0YW5jZV9zaXplID0gc2l6ZW9mKE15RGV2aWNlKSwKKyAqICAgICAuYWJzdHJhY3QgPSB0cnVlLCAvLyBvciBzZXQgYSBkZWZhdWx0IGluIG15X2RldmljZV9jbGFzc19pbml0CisgKiAgICAgLmNsYXNzX3NpemUgPSBzaXplb2YoTXlEZXZpY2VDbGFzcyksCisgKiB9OworICoKKyAqIHZvaWQgbXlfZGV2aWNlX2Zyb2JuaWNhdGUoTXlEZXZpY2UgKm9iaikKKyAqIHsKKyAqICAgICBNeURldmljZUNsYXNzICprbGFzcyA9IE1ZX0RFVklDRV9HRVRfQ0xBU1Mob2JqKTsKKyAqCisgKiAgICAga2xhc3MtPmZyb2JuaWNhdGUob2JqKTsKKyAqIH0KKyAqICAgPC9wcm9ncmFtbGlzdGluZz4KKyAqIDwvZXhhbXBsZT4KKyAqCisgKiAjIEludGVyZmFjZXMgIworICoKKyAqIEludGVyZmFjZXMgYWxsb3cgYSBsaW1pdGVkIGZvcm0gb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJbnN0YW5jZXMgYXJlCisgKiBzaW1pbGFyIHRvIG5vcm1hbCB0eXBlcyBleGNlcHQgZm9yIHRoZSBmYWN0IHRoYXQgYXJlIG9ubHkgZGVmaW5lZCBieQorICogdGhlaXIgY2xhc3NlcyBhbmQgbmV2ZXIgY2FycnkgYW55IHN0YXRlLiAgWW91IGNhbiBkeW5hbWljYWxseSBjYXN0IGFuIG9iamVjdAorICogdG8gb25lIG9mIGl0cyAjSW50ZXJmYWNlIHR5cGVzIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqICMgTWV0aG9kcyAjCisgKgorICogQSA8ZW1waGFzaXM+bWV0aG9kPC9lbXBoYXNpcz4gaXMgYSBmdW5jdGlvbiB3aXRoaW4gdGhlIG5hbWVzcGFjZSBzY29wZSBvZgorICogYSBjbGFzcy4gSXQgdXN1YWxseSBvcGVyYXRlcyBvbiB0aGUgb2JqZWN0IGluc3RhbmNlIGJ5IHBhc3NpbmcgaXQgYXMgYQorICogc3Ryb25nbHktdHlwZWQgZmlyc3QgYXJndW1lbnQuCisgKiBJZiBpdCBkb2VzIG5vdCBvcGVyYXRlIG9uIGFuIG9iamVjdCBpbnN0YW5jZSwgaXQgaXMgZHViYmVkCisgKiA8ZW1waGFzaXM+Y2xhc3MgbWV0aG9kPC9lbXBoYXNpcz4uCisgKgorICogTWV0aG9kcyBjYW5ub3QgYmUgb3ZlcmxvYWRlZC4gVGhhdCBpcywgdGhlICNPYmplY3RDbGFzcyBhbmQgbWV0aG9kIG5hbWUKKyAqIHVuaXF1ZWx5IGlkZW50aXR5IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQ7IHRoZSBzaWduYXR1cmUgZG9lcyBub3QgdmFyeQorICogZXhjZXB0IGZvciB0cmFpbGluZyB2YXJhcmdzLgorICoKKyAqIE1ldGhvZHMgYXJlIGFsd2F5cyA8ZW1waGFzaXM+dmlydHVhbDwvZW1waGFzaXM+LiBPdmVycmlkaW5nIGEgbWV0aG9kIGluCisgKiAjVHlwZUluZm8uY2xhc3NfaW5pdCBvZiBhIHN1YmNsYXNzIGxlYWRzIHRvIGFueSB1c2VyIG9mIHRoZSBjbGFzcyBvYnRhaW5lZAorICogdmlhIE9CSkVDVF9HRVRfQ0xBU1MoKSBhY2Nlc3NpbmcgdGhlIG92ZXJyaWRkZW4gZnVuY3Rpb24uCisgKiBUaGUgb3JpZ2luYWwgZnVuY3Rpb24gaXMgbm90IGF1dG9tYXRpY2FsbHkgaW52b2tlZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CisgKiBvZiB0aGUgb3ZlcnJpZGluZyBjbGFzcyB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgd2hlbiB0byBpbnZva2UgdGhlIG1ldGhvZAorICogYmVpbmcgb3ZlcnJpZGRlbi4KKyAqCisgKiBUbyBpbnZva2UgdGhlIG1ldGhvZCBiZWluZyBvdmVycmlkZGVuLCB0aGUgcHJlZmVycmVkIHNvbHV0aW9uIGlzIHRvIHN0b3JlCisgKiB0aGUgb3JpZ2luYWwgdmFsdWUgaW4gdGhlIG92ZXJyaWRpbmcgY2xhc3MgYmVmb3JlIG92ZXJyaWRpbmcgdGhlIG1ldGhvZC4KKyAqIFRoaXMgY29ycmVzcG9uZHMgdG8gfFsge3N1cGVyLGJhc2V9Lm1ldGhvZCguLi4pIF18IGluIEphdmEgYW5kIEMjCisgKiByZXNwZWN0aXZlbHk7IHRoaXMgZnJlZXMgdGhlIG92ZXJyaWRpbmcgY2xhc3MgZnJvbSBoYXJkY29kaW5nIGl0cyBwYXJlbnQKKyAqIGNsYXNzLCB3aGljaCBzb21lb25lIG1pZ2h0IGNob29zZSB0byBjaGFuZ2UgYXQgc29tZSBwb2ludC4KKyAqCisgKiA8ZXhhbXBsZT4KKyAqICAgPHRpdGxlPk92ZXJyaWRpbmcgYSB2aXJ0dWFsIG1ldGhvZDwvdGl0bGU+CisgKiAgIDxwcm9ncmFtbGlzdGluZz4KKyAqIHR5cGVkZWYgc3RydWN0IE15U3RhdGUgTXlTdGF0ZTsKKyAqCisgKiB0eXBlZGVmIHZvaWQgKCpNeURvU29tZXRoaW5nKShNeVN0YXRlICpvYmopOworICoKKyAqIHR5cGVkZWYgc3RydWN0IE15Q2xhc3MgeworICogICAgIE9iamVjdENsYXNzIHBhcmVudF9jbGFzczsKKyAqCisgKiAgICAgTXlEb1NvbWV0aGluZyBkb19zb21ldGhpbmc7CisgKiB9IE15Q2xhc3M7CisgKgorICogc3RhdGljIHZvaWQgbXlfZG9fc29tZXRoaW5nKE15U3RhdGUgKm9iaikKKyAqIHsKKyAqICAgICAvLyBkbyBzb21ldGhpbmcKKyAqIH0KKyAqCisgKiBzdGF0aWMgdm9pZCBteV9jbGFzc19pbml0KE9iamVjdENsYXNzICpvYywgdm9pZCAqZGF0YSkKKyAqIHsKKyAqICAgICBNeUNsYXNzICptYyA9IE1ZX0NMQVNTKG9jKTsKKyAqCisgKiAgICAgbWMtPmRvX3NvbWV0aGluZyA9IG15X2RvX3NvbWV0aGluZzsKKyAqIH0KKyAqCisgKiBzdGF0aWMgY29uc3QgVHlwZUluZm8gbXlfdHlwZV9pbmZvID0geworICogICAgIC5uYW1lID0gVFlQRV9NWSwKKyAqICAgICAucGFyZW50ID0gVFlQRV9PQkpFQ1QsCisgKiAgICAgLmluc3RhbmNlX3NpemUgPSBzaXplb2YoTXlTdGF0ZSksCisgKiAgICAgLmNsYXNzX3NpemUgPSBzaXplb2YoTXlDbGFzcyksCisgKiAgICAgLmNsYXNzX2luaXQgPSBteV9jbGFzc19pbml0LAorICogfTsKKyAqCisgKiB0eXBlZGVmIHN0cnVjdCBEZXJpdmVkQ2xhc3MgeworICogICAgIE15Q2xhc3MgcGFyZW50X2NsYXNzOworICoKKyAqICAgICBNeURvU29tZXRoaW5nIHBhcmVudF9kb19zb21ldGhpbmc7CisgKiB9IERlcml2ZWRDbGFzczsKKyAqCisgKiBzdGF0aWMgdm9pZCBkZXJpdmVkX2RvX3NvbWV0aGluZyhNeVN0YXRlICpvYmopCisgKiB7CisgKiAgICAgRGVyaXZlZENsYXNzICpkYyA9IERFUklWRURfR0VUX0NMQVNTKG9iaik7CisgKgorICogICAgIC8vIGRvIHNvbWV0aGluZyBoZXJlCisgKiAgICAgZGMtPnBhcmVudF9kb19zb21ldGhpbmcob2JqKTsKKyAqICAgICAvLyBkbyBzb21ldGhpbmcgZWxzZSBoZXJlCisgKiB9CisgKgorICogc3RhdGljIHZvaWQgZGVyaXZlZF9jbGFzc19pbml0KE9iamVjdENsYXNzICpvYywgdm9pZCAqZGF0YSkKKyAqIHsKKyAqICAgICBNeUNsYXNzICptYyA9IE1ZX0NMQVNTKG9jKTsKKyAqICAgICBEZXJpdmVkQ2xhc3MgKmRjID0gREVSSVZFRF9DTEFTUyhvYyk7CisgKgorICogICAgIGRjLT5wYXJlbnRfZG9fc29tZXRoaW5nID0gbWMtPmRvX3NvbWV0aGluZzsKKyAqICAgICBtYy0+ZG9fc29tZXRoaW5nID0gZGVyaXZlZF9kb19zb21ldGhpbmc7CisgKiB9CisgKgorICogc3RhdGljIGNvbnN0IFR5cGVJbmZvIGRlcml2ZWRfdHlwZV9pbmZvID0geworICogICAgIC5uYW1lID0gVFlQRV9ERVJJVkVELAorICogICAgIC5wYXJlbnQgPSBUWVBFX01ZLAorICogICAgIC5jbGFzc19zaXplID0gc2l6ZW9mKERlcml2ZWRDbGFzcyksCisgKiAgICAgLmNsYXNzX2luaXQgPSBteV9jbGFzc19pbml0LAorICogfTsKKyAqICAgPC9wcm9ncmFtbGlzdGluZz4KKyAqIDwvZXhhbXBsZT4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCBvYmplY3RfY2xhc3NfYnlfbmFtZSgpIGNhbiBiZSB1c2VkIHRvIG9idGFpbiB0aGUgY2xhc3MgYW5kCisgKiBpdHMgbm9uLW92ZXJyaWRkZW4gbWV0aG9kcyBmb3IgYSBzcGVjaWZpYyB0eXBlLiBUaGlzIHdvdWxkIGNvcnJlc3BvbmQgdG8KKyAqIHxbIE15Q2xhc3M6Om1ldGhvZCguLi4pIF18IGluIEMrKy4KKyAqCisgKiBUaGUgZmlyc3QgZXhhbXBsZSBvZiBzdWNoIGEgUU9NIG1ldGhvZCB3YXMgI0NQVUNsYXNzLnJlc2V0LAorICogYW5vdGhlciBleGFtcGxlIGlzICNEZXZpY2VDbGFzcy5yZWFsaXplLgorICovCisKKworLyoqCisgKiBPYmplY3RQcm9wZXJ0eUFjY2Vzc29yOgorICogQG9iajogdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIHByb3BlcnR5CisgKiBAdjogdGhlIHZpc2l0b3IgdGhhdCBjb250YWlucyB0aGUgcHJvcGVydHkgZGF0YQorICogQG9wYXF1ZTogdGhlIG9iamVjdCBwcm9wZXJ0eSBvcGFxdWUKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEBlcnJwOiBhIHBvaW50ZXIgdG8gYW4gRXJyb3IgdGhhdCBpcyBmaWxsZWQgaWYgZ2V0dGluZy9zZXR0aW5nIGZhaWxzLgorICoKKyAqIENhbGxlZCB3aGVuIHRyeWluZyB0byBnZXQvc2V0IGEgcHJvcGVydHkuCisgKi8KK3R5cGVkZWYgdm9pZCAoT2JqZWN0UHJvcGVydHlBY2Nlc3NvcikoT2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWaXNpdG9yICp2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCk7CisKKy8qKgorICogT2JqZWN0UHJvcGVydHlSZWxlYXNlOgorICogQG9iajogdGhlIG9iamVjdCB0aGF0IG93bnMgdGhlIHByb3BlcnR5CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAb3BhcXVlOiB0aGUgb3BhcXVlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcHJvcGVydHkKKyAqCisgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IGlzIHJlbW92ZWQgZnJvbSBhIG9iamVjdC4KKyAqLwordHlwZWRlZiB2b2lkIChPYmplY3RQcm9wZXJ0eVJlbGVhc2UpKE9iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKwordHlwZWRlZiBzdHJ1Y3QgT2JqZWN0UHJvcGVydHkKK3sKKyAgICBnY2hhciAqbmFtZTsKKyAgICBnY2hhciAqdHlwZTsKKyAgICBPYmplY3RQcm9wZXJ0eUFjY2Vzc29yICpnZXQ7CisgICAgT2JqZWN0UHJvcGVydHlBY2Nlc3NvciAqc2V0OworICAgIE9iamVjdFByb3BlcnR5UmVsZWFzZSAqcmVsZWFzZTsKKyAgICB2b2lkICpvcGFxdWU7CisKKyAgICBRVEFJTFFfRU5UUlkoT2JqZWN0UHJvcGVydHkpIG5vZGU7Cit9IE9iamVjdFByb3BlcnR5OworCisvKioKKyAqIE9iamVjdFVucGFyZW50OgorICogQG9iajogdGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgY29tcG9zaXRpb24gdHJlZQorICoKKyAqIENhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIFFPTSBjb21wb3NpdGlvbiB0cmVlLgorICogVGhlIGZ1bmN0aW9uIHNob3VsZCByZW1vdmUgYW55IGJhY2tsaW5rcyBmcm9tIGNoaWxkcmVuIG9iamVjdHMgdG8gQG9iai4KKyAqLwordHlwZWRlZiB2b2lkIChPYmplY3RVbnBhcmVudCkoT2JqZWN0ICpvYmopOworCisvKioKKyAqIE9iamVjdEZyZWU6CisgKiBAb2JqOiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkCisgKgorICogQ2FsbGVkIHdoZW4gYW4gb2JqZWN0J3MgbGFzdCByZWZlcmVuY2UgaXMgcmVtb3ZlZC4KKyAqLwordHlwZWRlZiB2b2lkIChPYmplY3RGcmVlKSh2b2lkICpvYmopOworCisjZGVmaW5lIE9CSkVDVF9DTEFTU19DQVNUX0NBQ0hFIDQKKworLyoqCisgKiBPYmplY3RDbGFzczoKKyAqCisgKiBUaGUgYmFzZSBmb3IgYWxsIGNsYXNzZXMuICBUaGUgb25seSB0aGluZyB0aGF0ICNPYmplY3RDbGFzcyBjb250YWlucyBpcyBhbgorICogaW50ZWdlciB0eXBlIGhhbmRsZS4KKyAqLworc3RydWN0IE9iamVjdENsYXNzCit7CisgICAgLyo8IHByaXZhdGUgPiovCisgICAgVHlwZSB0eXBlOworICAgIEdTTGlzdCAqaW50ZXJmYWNlczsKKworICAgIGNvbnN0IGNoYXIgKmNhc3RfY2FjaGVbT0JKRUNUX0NMQVNTX0NBU1RfQ0FDSEVdOworCisgICAgT2JqZWN0VW5wYXJlbnQgKnVucGFyZW50OworfTsKKworLyoqCisgKiBPYmplY3Q6CisgKgorICogVGhlIGJhc2UgZm9yIGFsbCBvYmplY3RzLiAgVGhlIGZpcnN0IG1lbWJlciBvZiB0aGlzIG9iamVjdCBpcyBhIHBvaW50ZXIgdG8KKyAqIGEgI09iamVjdENsYXNzLiAgU2luY2UgQyBndWFyYW50ZWVzIHRoYXQgdGhlIGZpcnN0IG1lbWJlciBvZiBhIHN0cnVjdHVyZQorICogYWx3YXlzIGJlZ2lucyBhdCBieXRlIDAgb2YgdGhhdCBzdHJ1Y3R1cmUsIGFzIGxvbmcgYXMgYW55IHN1Yi1vYmplY3QgcGxhY2VzCisgKiBpdHMgcGFyZW50IGFzIHRoZSBmaXJzdCBtZW1iZXIsIHdlIGNhbiBjYXN0IGRpcmVjdGx5IHRvIGEgI09iamVjdC4KKyAqCisgKiBBcyBhIHJlc3VsdCwgI09iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0cyB0eXBlIGFzIGl0cworICogZmlyc3QgbWVtYmVyLiAgVGhpcyBhbGxvd3MgaWRlbnRpZmljYXRpb24gb2YgdGhlIHJlYWwgdHlwZSBvZiB0aGUgb2JqZWN0IGF0CisgKiBydW4gdGltZS4KKyAqCisgKiAjT2JqZWN0IGFsc28gY29udGFpbnMgYSBsaXN0IG9mICNJbnRlcmZhY2VzIHRoYXQgdGhpcyBvYmplY3QKKyAqIGltcGxlbWVudHMuCisgKi8KK3N0cnVjdCBPYmplY3QKK3sKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICBPYmplY3RDbGFzcyAqY2xhc3M7CisgICAgT2JqZWN0RnJlZSAqZnJlZTsKKyAgICBRVEFJTFFfSEVBRCgsIE9iamVjdFByb3BlcnR5KSBwcm9wZXJ0aWVzOworICAgIHVpbnQzMl90IHJlZjsKKyAgICBPYmplY3QgKnBhcmVudDsKK307CisKKy8qKgorICogVHlwZUluZm86CisgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIHR5cGUuCisgKiBAcGFyZW50OiBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHR5cGUuCisgKiBAaW5zdGFuY2Vfc2l6ZTogVGhlIHNpemUgb2YgdGhlIG9iamVjdCAoZGVyaXZhdGl2ZSBvZiAjT2JqZWN0KS4gIElmCisgKiAgIEBpbnN0YW5jZV9zaXplIGlzIDAsIHRoZW4gdGhlIHNpemUgb2YgdGhlIG9iamVjdCB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZQorICogICBwYXJlbnQgb2JqZWN0LgorICogQGluc3RhbmNlX2luaXQ6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGluaXRpYWxpemUgYW4gb2JqZWN0LiAgVGhlIHBhcmVudAorICogICBjbGFzcyB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHNvIHRoZSB0eXBlIGlzIG9ubHkgcmVzcG9uc2libGUKKyAqICAgZm9yIGluaXRpYWxpemluZyBpdHMgb3duIG1lbWJlcnMuCisgKiBAaW5zdGFuY2VfcG9zdF9pbml0OiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YKKyAqICAgYW4gb2JqZWN0LCBhZnRlciBhbGwgQGluc3RhbmNlX2luaXQgZnVuY3Rpb25zIHdlcmUgY2FsbGVkLgorICogQGluc3RhbmNlX2ZpbmFsaXplOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgb2JqZWN0IGRlc3RydWN0aW9uLiAgVGhpcworICogICBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwYXJlbnQgQGluc3RhbmNlX2ZpbmFsaXplIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZC4KKyAqICAgQW4gb2JqZWN0IHNob3VsZCBvbmx5IGZyZWUgdGhlIG1lbWJlcnMgdGhhdCBhcmUgdW5pcXVlIHRvIGl0cyB0eXBlIGluIHRoaXMKKyAqICAgZnVuY3Rpb24uCisgKiBAYWJzdHJhY3Q6IElmIHRoaXMgZmllbGQgaXMgdHJ1ZSwgdGhlbiB0aGUgY2xhc3MgaXMgY29uc2lkZXJlZCBhYnN0cmFjdCBhbmQKKyAqICAgY2Fubm90IGJlIGRpcmVjdGx5IGluc3RhbnRpYXRlZC4KKyAqIEBjbGFzc19zaXplOiBUaGUgc2l6ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0IChkZXJpdmF0aXZlIG9mICNPYmplY3RDbGFzcykKKyAqICAgZm9yIHRoaXMgb2JqZWN0LiAgSWYgQGNsYXNzX3NpemUgaXMgMCwgdGhlbiB0aGUgc2l6ZSBvZiB0aGUgY2xhc3Mgd2lsbCBiZQorICogICBhc3N1bWVkIHRvIGJlIHRoZSBzaXplIG9mIHRoZSBwYXJlbnQgY2xhc3MuICBUaGlzIGFsbG93cyBhIHR5cGUgdG8gYXZvaWQKKyAqICAgaW1wbGVtZW50aW5nIGFuIGV4cGxpY2l0IGNsYXNzIHR5cGUgaWYgdGhleSBhcmUgbm90IGFkZGluZyBhZGRpdGlvbmFsCisgKiAgIHZpcnR1YWwgZnVuY3Rpb25zLgorICogQGNsYXNzX2luaXQ6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGFsbCBwYXJlbnQgY2xhc3MgaW5pdGlhbGl6YXRpb24KKyAqICAgaGFzIG9jY3VycmVkIHRvIGFsbG93IGEgY2xhc3MgdG8gc2V0IGl0cyBkZWZhdWx0IHZpcnR1YWwgbWV0aG9kIHBvaW50ZXJzLgorICogICBUaGlzIGlzIGFsc28gdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBvdmVycmlkZSB2aXJ0dWFsIG1ldGhvZHMgZnJvbSBhIHBhcmVudAorICogICBjbGFzcy4KKyAqIEBjbGFzc19iYXNlX2luaXQ6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBhbGwgYmFzZSBjbGFzc2VzIGFmdGVyIGFsbAorICogICBwYXJlbnQgY2xhc3MgaW5pdGlhbGl6YXRpb24gaGFzIG9jY3VycmVkLCBidXQgYmVmb3JlIHRoZSBjbGFzcyBpdHNlbGYKKyAqICAgaXMgaW5pdGlhbGl6ZWQuICBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0byB1c2UgdG8gdW5kbyB0aGUgZWZmZWN0cyBvZgorICogICBtZW1jcHkgZnJvbSB0aGUgcGFyZW50IGNsYXNzIHRvIHRoZSBkZXNjZW5kZW50cy4KKyAqIEBjbGFzc19maW5hbGl6ZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGNsYXNzIGRlc3RydWN0aW9uIGFuZCBpcworICogICBtZWFudCB0byByZWxlYXNlIGFuZCBkeW5hbWljIHBhcmFtZXRlcnMgYWxsb2NhdGVkIGJ5IEBjbGFzc19pbml0LgorICogQGNsYXNzX2RhdGE6IERhdGEgdG8gcGFzcyB0byB0aGUgQGNsYXNzX2luaXQsIEBjbGFzc19iYXNlX2luaXQgYW5kCisgKiAgIEBjbGFzc19maW5hbGl6ZSBmdW5jdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBidWlsZGluZyBkeW5hbWljCisgKiAgIGNsYXNzZXMuCisgKiBAaW50ZXJmYWNlczogVGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLiAgVGhpcworICogICBzaG91bGQgcG9pbnQgdG8gYSBzdGF0aWMgYXJyYXkgdGhhdCdzIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gZmlsbGVkCisgKiAgIGVsZW1lbnQuCisgKi8KK3N0cnVjdCBUeXBlSW5mbworeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqcGFyZW50OworCisgICAgc2l6ZV90IGluc3RhbmNlX3NpemU7CisgICAgdm9pZCAoKmluc3RhbmNlX2luaXQpKE9iamVjdCAqb2JqKTsKKyAgICB2b2lkICgqaW5zdGFuY2VfcG9zdF9pbml0KShPYmplY3QgKm9iaik7CisgICAgdm9pZCAoKmluc3RhbmNlX2ZpbmFsaXplKShPYmplY3QgKm9iaik7CisKKyAgICBib29sIGFic3RyYWN0OworICAgIHNpemVfdCBjbGFzc19zaXplOworCisgICAgdm9pZCAoKmNsYXNzX2luaXQpKE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqZGF0YSk7CisgICAgdm9pZCAoKmNsYXNzX2Jhc2VfaW5pdCkoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKTsKKyAgICB2b2lkICgqY2xhc3NfZmluYWxpemUpKE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqZGF0YSk7CisgICAgdm9pZCAqY2xhc3NfZGF0YTsKKworICAgIEludGVyZmFjZUluZm8gKmludGVyZmFjZXM7Cit9OworCisvKioKKyAqIE9CSkVDVDoKKyAqIEBvYmo6IEEgZGVyaXZhdGl2ZSBvZiAjT2JqZWN0CisgKgorICogQ29udmVydHMgYW4gb2JqZWN0IHRvIGEgI09iamVjdC4gIFNpbmNlIGFsbCBvYmplY3RzIGFyZSAjT2JqZWN0cywKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgc3VjY2VlZC4KKyAqLworI2RlZmluZSBPQkpFQ1Qob2JqKSBcCisgICAgKChPYmplY3QgKikob2JqKSkKKworLyoqCisgKiBPQkpFQ1RfQ0xBU1M6CisgKiBAY2xhc3M6IEEgZGVyaXZhdGl2ZSBvZiAjT2JqZWN0Q2xhc3MuCisgKgorICogQ29udmVydHMgYSBjbGFzcyB0byBhbiAjT2JqZWN0Q2xhc3MuICBTaW5jZSBhbGwgb2JqZWN0cyBhcmUgI09iamVjdHMsCisgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHN1Y2NlZWQuCisgKi8KKyNkZWZpbmUgT0JKRUNUX0NMQVNTKGNsYXNzKSBcCisgICAgKChPYmplY3RDbGFzcyAqKShjbGFzcykpCisKKy8qKgorICogT0JKRUNUX0NIRUNLOgorICogQHR5cGU6IFRoZSBDIHR5cGUgdG8gdXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLgorICogQG9iajogQSBkZXJpdmF0aXZlIG9mIEB0eXBlIHRvIGNhc3QuCisgKiBAbmFtZTogVGhlIFFPTSB0eXBlbmFtZSBvZiBAdHlwZQorICoKKyAqIEEgdHlwZSBzYWZlIHZlcnNpb24gb2YgQG9iamVjdF9keW5hbWljX2Nhc3RfYXNzZXJ0LiAgVHlwaWNhbGx5IGVhY2ggY2xhc3MKKyAqIHdpbGwgZGVmaW5lIGEgbWFjcm8gYmFzZWQgb24gdGhpcyB0eXBlIHRvIHBlcmZvcm0gdHlwZSBzYWZlIGR5bmFtaWNfY2FzdHMgdG8KKyAqIHRoaXMgb2JqZWN0IHR5cGUuCisgKgorICogSWYgYW4gaW52YWxpZCBvYmplY3QgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24sIGEgcnVuIHRpbWUgYXNzZXJ0IHdpbGwgYmUKKyAqIGdlbmVyYXRlZC4KKyAqLworI2RlZmluZSBPQkpFQ1RfQ0hFQ0sodHlwZSwgb2JqLCBuYW1lKSBcCisgICAgKCh0eXBlICopb2JqZWN0X2R5bmFtaWNfY2FzdF9hc3NlcnQoT0JKRUNUKG9iaiksIChuYW1lKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pKQorCisvKioKKyAqIE9CSkVDVF9DTEFTU19DSEVDSzoKKyAqIEBjbGFzczogVGhlIEMgdHlwZSB0byB1c2UgZm9yIHRoZSByZXR1cm4gdmFsdWUuCisgKiBAb2JqOiBBIGRlcml2YXRpdmUgb2YgQHR5cGUgdG8gY2FzdC4KKyAqIEBuYW1lOiB0aGUgUU9NIHR5cGVuYW1lIG9mIEBjbGFzcy4KKyAqCisgKiBBIHR5cGUgc2FmZSB2ZXJzaW9uIG9mIEBvYmplY3RfY2xhc3NfZHluYW1pY19jYXN0X2Fzc2VydC4gIFRoaXMgbWFjcm8gaXMKKyAqIHR5cGljYWxseSB3cmFwcGVkIGJ5IGVhY2ggdHlwZSB0byBwZXJmb3JtIHR5cGUgc2FmZSBjYXN0cyBvZiBhIGNsYXNzIHRvIGEKKyAqIHNwZWNpZmljIGNsYXNzIHR5cGUuCisgKi8KKyNkZWZpbmUgT0JKRUNUX0NMQVNTX0NIRUNLKGNsYXNzLCBvYmosIG5hbWUpIFwKKyAgICAoKGNsYXNzICopb2JqZWN0X2NsYXNzX2R5bmFtaWNfY2FzdF9hc3NlcnQoT0JKRUNUX0NMQVNTKG9iaiksIChuYW1lKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKSkKKworLyoqCisgKiBPQkpFQ1RfR0VUX0NMQVNTOgorICogQGNsYXNzOiBUaGUgQyB0eXBlIHRvIHVzZSBmb3IgdGhlIHJldHVybiB2YWx1ZS4KKyAqIEBvYmo6IFRoZSBvYmplY3QgdG8gb2J0YWluIHRoZSBjbGFzcyBmb3IuCisgKiBAbmFtZTogVGhlIFFPTSB0eXBlbmFtZSBvZiBAb2JqLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBzcGVjaWZpYyBjbGFzcyBmb3IgYSBnaXZlbiBvYmplY3QuICBJdHMgZ2VuZXJhbGx5CisgKiB1c2VkIGJ5IGVhY2ggdHlwZSB0byBwcm92aWRlIGEgdHlwZSBzYWZlIG1hY3JvIHRvIGdldCBhIHNwZWNpZmljIGNsYXNzIHR5cGUKKyAqIGZyb20gYW4gb2JqZWN0LgorICovCisjZGVmaW5lIE9CSkVDVF9HRVRfQ0xBU1MoY2xhc3MsIG9iaiwgbmFtZSkgXAorICAgIE9CSkVDVF9DTEFTU19DSEVDSyhjbGFzcywgb2JqZWN0X2dldF9jbGFzcyhPQkpFQ1Qob2JqKSksIG5hbWUpCisKKy8qKgorICogSW50ZXJmYWNlSW5mbzoKKyAqIEB0eXBlOiBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlLgorICoKKyAqIFRoZSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gaW50ZXJmYWNlLgorICovCitzdHJ1Y3QgSW50ZXJmYWNlSW5mbyB7CisgICAgY29uc3QgY2hhciAqdHlwZTsKK307CisKKy8qKgorICogSW50ZXJmYWNlQ2xhc3M6CisgKiBAcGFyZW50X2NsYXNzOiB0aGUgYmFzZSBjbGFzcworICoKKyAqIFRoZSBjbGFzcyBmb3IgYWxsIGludGVyZmFjZXMuICBTdWJjbGFzc2VzIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYWRkCisgKiB2aXJ0dWFsIG1ldGhvZHMuCisgKi8KK3N0cnVjdCBJbnRlcmZhY2VDbGFzcworeworICAgIE9iamVjdENsYXNzIHBhcmVudF9jbGFzczsKKyAgICAvKjwgcHJpdmF0ZSA+Ki8KKyAgICBPYmplY3RDbGFzcyAqY29uY3JldGVfY2xhc3M7Cit9OworCisjZGVmaW5lIFRZUEVfSU5URVJGQUNFICJpbnRlcmZhY2UiCisKKy8qKgorICogSU5URVJGQUNFX0NMQVNTOgorICogQGtsYXNzOiBjbGFzcyB0byBjYXN0IGZyb20KKyAqIFJldHVybnM6IEFuICNJbnRlcmZhY2VDbGFzcyBvciByYWlzZSBhbiBlcnJvciBpZiBjYXN0IGlzIGludmFsaWQKKyAqLworI2RlZmluZSBJTlRFUkZBQ0VfQ0xBU1Moa2xhc3MpIFwKKyAgICBPQkpFQ1RfQ0xBU1NfQ0hFQ0soSW50ZXJmYWNlQ2xhc3MsIGtsYXNzLCBUWVBFX0lOVEVSRkFDRSkKKworLyoqCisgKiBJTlRFUkZBQ0VfQ0hFQ0s6CisgKiBAaW50ZXJmYWNlOiB0aGUgdHlwZSB0byByZXR1cm4KKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gY29udmVydCB0byBhbiBpbnRlcmZhY2UKKyAqIEBuYW1lOiB0aGUgaW50ZXJmYWNlIHR5cGUgbmFtZQorICoKKyAqIFJldHVybnM6IEBvYmogY2FzdGVkIHRvIEBpbnRlcmZhY2UgaWYgY2FzdCBpcyB2YWxpZCwgb3RoZXJ3aXNlIHJhaXNlIGVycm9yLgorICovCisjZGVmaW5lIElOVEVSRkFDRV9DSEVDSyhpbnRlcmZhY2UsIG9iaiwgbmFtZSkgXAorICAgICgoaW50ZXJmYWNlICopb2JqZWN0X2R5bmFtaWNfY2FzdF9hc3NlcnQoT0JKRUNUKChvYmopKSwgKG5hbWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKSkKKworLyoqCisgKiBvYmplY3RfbmV3OgorICogQHR5cGVuYW1lOiBUaGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGluc3RhbnRpYXRlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGEgbmV3IG9iamVjdCB1c2luZyBoZWFwIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLCBhbmQgd2lsbCBiZSBmcmVlZCB3aGVuCisgKiB0aGUgbGFzdCByZWZlcmVuY2UgaXMgZHJvcHBlZC4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbmV3bHkgYWxsb2NhdGVkIGFuZCBpbnN0YW50aWF0ZWQgb2JqZWN0LgorICovCitPYmplY3QgKm9iamVjdF9uZXcoY29uc3QgY2hhciAqdHlwZW5hbWUpOworCisvKioKKyAqIG9iamVjdF9uZXdfd2l0aF90eXBlOgorICogQHR5cGU6IFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gaW5zdGFudGlhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgYSBuZXcgb2JqZWN0IHVzaW5nIGhlYXAgYWxsb2NhdGVkIG1lbW9yeS4KKyAqIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEsIGFuZCB3aWxsIGJlIGZyZWVkIHdoZW4KKyAqIHRoZSBsYXN0IHJlZmVyZW5jZSBpcyBkcm9wcGVkLgorICoKKyAqIFJldHVybnM6IFRoZSBuZXdseSBhbGxvY2F0ZWQgYW5kIGluc3RhbnRpYXRlZCBvYmplY3QuCisgKi8KK09iamVjdCAqb2JqZWN0X25ld193aXRoX3R5cGUoVHlwZSB0eXBlKTsKKworLyoqCisgKiBvYmplY3RfaW5pdGlhbGl6ZV93aXRoX3R5cGU6CisgKiBAZGF0YTogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gYmUgdXNlZCBmb3IgdGhlIG9iamVjdC4KKyAqIEBzaXplOiBUaGUgbWF4aW11bSBzaXplIGF2YWlsYWJsZSBhdCBAZGF0YSBmb3IgdGhlIG9iamVjdC4KKyAqIEB0eXBlOiBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGluc3RhbnRpYXRlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFuIG9iamVjdC4gIFRoZSBtZW1vcnkgZm9yIHRoZSBvYmplY3Qgc2hvdWxkCisgKiBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLAorICogYW5kIHdpbGwgYmUgZmluYWxpemVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGRyb3BwZWQuCisgKi8KK3ZvaWQgb2JqZWN0X2luaXRpYWxpemVfd2l0aF90eXBlKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBUeXBlIHR5cGUpOworCisvKioKKyAqIG9iamVjdF9pbml0aWFsaXplOgorICogQG9iajogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgdG8gYmUgdXNlZCBmb3IgdGhlIG9iamVjdC4KKyAqIEBzaXplOiBUaGUgbWF4aW11bSBzaXplIGF2YWlsYWJsZSBhdCBAb2JqIGZvciB0aGUgb2JqZWN0LgorICogQHR5cGVuYW1lOiBUaGUgbmFtZSBvZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGluc3RhbnRpYXRlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBpbml0aWFsaXplIGFuIG9iamVjdC4gIFRoZSBtZW1vcnkgZm9yIHRoZSBvYmplY3Qgc2hvdWxkCisgKiBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLAorICogYW5kIHdpbGwgYmUgZmluYWxpemVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGRyb3BwZWQuCisgKi8KK3ZvaWQgb2JqZWN0X2luaXRpYWxpemUodm9pZCAqb2JqLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqdHlwZW5hbWUpOworCisvKioKKyAqIG9iamVjdF9keW5hbWljX2Nhc3Q6CisgKiBAb2JqOiBUaGUgb2JqZWN0IHRvIGNhc3QuCisgKiBAdHlwZW5hbWU6IFRoZSBAdHlwZW5hbWUgdG8gY2FzdCB0by4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIGlmIEBvYmogaXMtYSBAdHlwZW5hbWUuICBAb2JqIGNhbiByZWZlciB0byBhbgorICogb2JqZWN0IG9yIGFuIGludGVyZmFjZSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0LgorICoKKyAqIFJldHVybnM6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBAb2JqIG9uIHN1Y2Nlc3Mgb3IgI05VTEwgb24gZmFpbHVyZS4KKyAqLworT2JqZWN0ICpvYmplY3RfZHluYW1pY19jYXN0KE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICp0eXBlbmFtZSk7CisKKy8qKgorICogb2JqZWN0X2R5bmFtaWNfY2FzdF9hc3NlcnQ6CisgKgorICogU2VlIG9iamVjdF9keW5hbWljX2Nhc3QoKSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGlzCisgKiBmdW5jdGlvbi4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaW4gYmVoYXZpb3IgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGFzc2VydHMKKyAqIGluc3RlYWQgb2YgcmV0dXJuaW5nICNOVUxMIG9uIGZhaWx1cmUgaWYgUU9NIGNhc3QgZGVidWdnaW5nIGlzIGVuYWJsZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGJ1dCBvbmx5IHRocm91Z2gKKyAqIHRoZSB3cmFwcGVyIG1hY3JvIE9CSkVDVF9DSEVDSy4KKyAqLworT2JqZWN0ICpvYmplY3RfZHluYW1pY19jYXN0X2Fzc2VydChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqdHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKTsKKworLyoqCisgKiBvYmplY3RfZ2V0X2NsYXNzOgorICogQG9iajogQSBkZXJpdmF0aXZlIG9mICNPYmplY3QKKyAqCisgKiBSZXR1cm5zOiBUaGUgI09iamVjdENsYXNzIG9mIHRoZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCBAb2JqLgorICovCitPYmplY3RDbGFzcyAqb2JqZWN0X2dldF9jbGFzcyhPYmplY3QgKm9iaik7CisKKy8qKgorICogb2JqZWN0X2dldF90eXBlbmFtZToKKyAqIEBvYmo6IEEgZGVyaXZhdGl2ZSBvZiAjT2JqZWN0LgorICoKKyAqIFJldHVybnM6IFRoZSBRT00gdHlwZW5hbWUgb2YgQG9iai4KKyAqLworY29uc3QgY2hhciAqb2JqZWN0X2dldF90eXBlbmFtZShPYmplY3QgKm9iaik7CisKKy8qKgorICogdHlwZV9yZWdpc3Rlcl9zdGF0aWM6CisgKiBAaW5mbzogVGhlICNUeXBlSW5mbyBvZiB0aGUgbmV3IHR5cGUuCisgKgorICogQGluZm8gYW5kIGFsbCBvZiB0aGUgc3RyaW5ncyBpdCBwb2ludHMgdG8gc2hvdWxkIGV4aXN0IGZvciB0aGUgbGlmZSB0aW1lCisgKiB0aGF0IHRoZSB0eXBlIGlzIHJlZ2lzdGVyZWQuCisgKgorICogUmV0dXJuczogMCBvbiBmYWlsdXJlLCB0aGUgbmV3ICNUeXBlIG9uIHN1Y2Nlc3MuCisgKi8KK1R5cGUgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoY29uc3QgVHlwZUluZm8gKmluZm8pOworCisvKioKKyAqIHR5cGVfcmVnaXN0ZXI6CisgKiBAaW5mbzogVGhlICNUeXBlSW5mbyBvZiB0aGUgbmV3IHR5cGUKKyAqCisgKiBVbmxpa2UgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoKSwgdGhpcyBjYWxsIGRvZXMgbm90IHJlcXVpcmUgQGluZm8gb3IgaXRzCisgKiBzdHJpbmcgbWVtYmVycyB0byBjb250aW51ZSB0byBleGlzdCBhZnRlciB0aGUgY2FsbCByZXR1cm5zLgorICoKKyAqIFJldHVybnM6IDAgb24gZmFpbHVyZSwgdGhlIG5ldyAjVHlwZSBvbiBzdWNjZXNzLgorICovCitUeXBlIHR5cGVfcmVnaXN0ZXIoY29uc3QgVHlwZUluZm8gKmluZm8pOworCisvKioKKyAqIG9iamVjdF9jbGFzc19keW5hbWljX2Nhc3RfYXNzZXJ0OgorICogQGtsYXNzOiBUaGUgI09iamVjdENsYXNzIHRvIGF0dGVtcHQgdG8gY2FzdC4KKyAqIEB0eXBlbmFtZTogVGhlIFFPTSB0eXBlbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2FzdCB0by4KKyAqCisgKiBTZWUgb2JqZWN0X2NsYXNzX2R5bmFtaWNfY2FzdCgpIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzCisgKiBvZiB0aGlzIGZ1bmN0aW9uLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBpbiBiZWhhdmlvciBpcyB0aGF0IHRoaXMgZnVuY3Rpb24KKyAqIGFzc2VydHMgaW5zdGVhZCBvZiByZXR1cm5pbmcgI05VTEwgb24gZmFpbHVyZSBpZiBRT00gY2FzdCBkZWJ1Z2dpbmcgaXMKKyAqIGVuYWJsZWQuICBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBtZWFudCB0byBiZSBjYWxsZWQgZGlyZWN0bHksIGJ1dCBvbmx5IHRocm91Z2gKKyAqIHRoZSB3cmFwcGVyIG1hY3JvcyBPQkpFQ1RfQ0xBU1NfQ0hFQ0sgYW5kIElOVEVSRkFDRV9DSEVDSy4KKyAqLworT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzc19keW5hbWljX2Nhc3RfYXNzZXJ0KE9iamVjdENsYXNzICprbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jKTsKKworLyoqCisgKiBvYmplY3RfY2xhc3NfZHluYW1pY19jYXN0OgorICogQGtsYXNzOiBUaGUgI09iamVjdENsYXNzIHRvIGF0dGVtcHQgdG8gY2FzdC4KKyAqIEB0eXBlbmFtZTogVGhlIFFPTSB0eXBlbmFtZSBvZiB0aGUgY2xhc3MgdG8gY2FzdCB0by4KKyAqCisgKiBSZXR1cm5zOiBJZiBAdHlwZW5hbWUgaXMgYSBjbGFzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIEBrbGFzcyBpZgorICogQHR5cGVuYW1lIGlzIGEgc3VidHlwZSBvZiBAa2xhc3MsIGVsc2UgcmV0dXJucyAjTlVMTC4KKyAqCisgKiBJZiBAdHlwZW5hbWUgaXMgYW4gaW50ZXJmYWNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGludGVyZmFjZQorICogZGVmaW5pdGlvbiBmb3IgQGtsYXNzIGlmIEBrbGFzcyBpbXBsZW1lbnRzIGl0IHVuYW1iaWd1b3VzbHk7ICNOVUxMCisgKiBpcyByZXR1cm5lZCBpZiBAa2xhc3MgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2Ugb3IgaWYgbXVsdGlwbGUKKyAqIGNsYXNzZXMgb3IgaW50ZXJmYWNlcyBvbiB0aGUgaGllcmFyY2h5IGxlYWRpbmcgdG8gQGtsYXNzIGltcGxlbWVudAorICogaXQuICAoRklYTUU6IHBlcmhhcHMgdGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYXQgdHlwZSBkZWZpbml0aW9uIHRpbWU/KQorICovCitPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzX2R5bmFtaWNfY2FzdChPYmplY3RDbGFzcyAqa2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlbmFtZSk7CisKKy8qKgorICogb2JqZWN0X2NsYXNzX2dldF9wYXJlbnQ6CisgKiBAa2xhc3M6IFRoZSBjbGFzcyB0byBvYnRhaW4gdGhlIHBhcmVudCBmb3IuCisgKgorICogUmV0dXJuczogVGhlIHBhcmVudCBmb3IgQGtsYXNzIG9yICVOVUxMIGlmIG5vbmUuCisgKi8KK09iamVjdENsYXNzICpvYmplY3RfY2xhc3NfZ2V0X3BhcmVudChPYmplY3RDbGFzcyAqa2xhc3MpOworCisvKioKKyAqIG9iamVjdF9jbGFzc19nZXRfbmFtZToKKyAqIEBrbGFzczogVGhlIGNsYXNzIHRvIG9idGFpbiB0aGUgUU9NIHR5cGVuYW1lIGZvci4KKyAqCisgKiBSZXR1cm5zOiBUaGUgUU9NIHR5cGVuYW1lIGZvciBAa2xhc3MuCisgKi8KK2NvbnN0IGNoYXIgKm9iamVjdF9jbGFzc19nZXRfbmFtZShPYmplY3RDbGFzcyAqa2xhc3MpOworCisvKioKKyAqIG9iamVjdF9jbGFzc19pc19hYnN0cmFjdDoKKyAqIEBrbGFzczogVGhlIGNsYXNzIHRvIG9idGFpbiB0aGUgYWJzdHJhY3RuZXNzIGZvci4KKyAqCisgKiBSZXR1cm5zOiAldHJ1ZSBpZiBAa2xhc3MgaXMgYWJzdHJhY3QsICVmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgb2JqZWN0X2NsYXNzX2lzX2Fic3RyYWN0KE9iamVjdENsYXNzICprbGFzcyk7CisKKy8qKgorICogb2JqZWN0X2NsYXNzX2J5X25hbWU6CisgKiBAdHlwZW5hbWU6IFRoZSBRT00gdHlwZW5hbWUgdG8gb2J0YWluIHRoZSBjbGFzcyBmb3IuCisgKgorICogUmV0dXJuczogVGhlIGNsYXNzIGZvciBAdHlwZW5hbWUgb3IgJU5VTEwgaWYgbm90IGZvdW5kLgorICovCitPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzX2J5X25hbWUoY29uc3QgY2hhciAqdHlwZW5hbWUpOworCit2b2lkIG9iamVjdF9jbGFzc19mb3JlYWNoKHZvaWQgKCpmbikoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpvcGFxdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbXBsZW1lbnRzX3R5cGUsIGJvb2wgaW5jbHVkZV9hYnN0cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworLyoqCisgKiBvYmplY3RfY2xhc3NfZ2V0X2xpc3Q6CisgKiBAaW1wbGVtZW50c190eXBlOiBUaGUgdHlwZSB0byBmaWx0ZXIgZm9yLCBpbmNsdWRpbmcgaXRzIGRlcml2YXRpdmVzLgorICogQGluY2x1ZGVfYWJzdHJhY3Q6IFdoZXRoZXIgdG8gaW5jbHVkZSBhYnN0cmFjdCBjbGFzc2VzLgorICoKKyAqIFJldHVybnM6IEEgc2luZ2x5LWxpbmtlZCBsaXN0IG9mIHRoZSBjbGFzc2VzIGluIHJldmVyc2UgaGFzaHRhYmxlIG9yZGVyLgorICovCitHU0xpc3QgKm9iamVjdF9jbGFzc19nZXRfbGlzdChjb25zdCBjaGFyICppbXBsZW1lbnRzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfYWJzdHJhY3QpOworCisvKioKKyAqIG9iamVjdF9yZWY6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKgorICogSW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIG9iamVjdC4gIEEgb2JqZWN0IGNhbm5vdCBiZSBmcmVlZCBhcyBsb25nCisgKiBhcyBpdHMgcmVmZXJlbmNlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorICovCit2b2lkIG9iamVjdF9yZWYoT2JqZWN0ICpvYmopOworCisvKioKKyAqIHFkZWZfdW5yZWY6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKgorICogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhIG9iamVjdC4gIEEgb2JqZWN0IGNhbm5vdCBiZSBmcmVlZCBhcyBsb25nCisgKiBhcyBpdHMgcmVmZXJlbmNlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgorICovCit2b2lkIG9iamVjdF91bnJlZihPYmplY3QgKm9iaik7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X2FkZDoKKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG8KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuICBUaGlzIGNhbiBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGZvcgorICogIGEgZm9yd2FyZCBzbGFzaC4gIEluIGdlbmVyYWwsIHlvdSBzaG91bGQgdXNlIGh5cGhlbnMgJy0nIGluc3RlYWQgb2YKKyAqICB1bmRlcnNjb3JlcyAnXycgd2hlbiBuYW1pbmcgcHJvcGVydGllcy4KKyAqIEB0eXBlOiB0aGUgdHlwZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gIFRoaXMgbmFtZXNwYWNlIGlzIHByZXR0eSBsb29zZWx5CisgKiAgIGRlZmluZWQuICBTdWIgbmFtZXNwYWNlcyBhcmUgY29uc3RydWN0ZWQgYnkgdXNpbmcgYSBwcmVmaXggYW5kIHRoZW4KKyAqICAgdG8gYW5nbGUgYnJhY2tldHMuICBGb3IgaW5zdGFuY2UsIHRoZSB0eXBlICd2aXJ0aW8tbmV0LXBjaScgaW4gdGhlCisgKiAgICdsaW5rJyBuYW1lc3BhY2Ugd291bGQgYmUgJ2xpbms8dmlydGlvLW5ldC1wY2k+Jy4KKyAqIEBnZXQ6IFRoZSBnZXR0ZXIgdG8gYmUgY2FsbGVkIHRvIHJlYWQgYSBwcm9wZXJ0eS4gIElmIHRoaXMgaXMgTlVMTCwgdGhlbgorICogICB0aGUgcHJvcGVydHkgY2Fubm90IGJlIHJlYWQuCisgKiBAc2V0OiB0aGUgc2V0dGVyIHRvIGJlIGNhbGxlZCB0byB3cml0ZSBhIHByb3BlcnR5LiAgSWYgdGhpcyBpcyBOVUxMLAorICogICB0aGVuIHRoZSBwcm9wZXJ0eSBjYW5ub3QgYmUgd3JpdHRlbi4KKyAqIEByZWxlYXNlOiBjYWxsZWQgd2hlbiB0aGUgcHJvcGVydHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBvYmplY3QuICBUaGlzIGlzCisgKiAgIG1lYW50IHRvIGFsbG93IGEgcHJvcGVydHkgdG8gZnJlZSBpdHMgb3BhcXVlIHVwb24gb2JqZWN0CisgKiAgIGRlc3RydWN0aW9uLiAgVGhpcyBtYXkgYmUgTlVMTC4KKyAqIEBvcGFxdWU6IGFuIG9wYXF1ZSBwb2ludGVyIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrcyBmb3IgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2FkZChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQcm9wZXJ0eUFjY2Vzc29yICpnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UHJvcGVydHlBY2Nlc3NvciAqc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFByb3BlcnR5UmVsZWFzZSAqcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIEVycm9yICoqZXJycCk7CisKK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2RlbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfZmluZDoKKyAqIEBvYmo6IHRoZSBvYmplY3QKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEBlcnJwOiByZXR1cm5zIGFuIGVycm9yIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMKKyAqCisgKiBMb29rIHVwIGEgcHJvcGVydHkgZm9yIGFuIG9iamVjdCBhbmQgcmV0dXJuIGl0cyAjT2JqZWN0UHJvcGVydHkgaWYgZm91bmQuCisgKi8KK09iamVjdFByb3BlcnR5ICpvYmplY3RfcHJvcGVydHlfZmluZChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworCit2b2lkIG9iamVjdF91bnBhcmVudChPYmplY3QgKm9iaik7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X2dldDoKKyAqIEBvYmo6IHRoZSBvYmplY3QKKyAqIEB2OiB0aGUgdmlzaXRvciB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgcHJvcGVydHkgdmFsdWUuICBUaGlzIHNob3VsZCBiZSBhbgorICogICBPdXRwdXQgdmlzaXRvciBhbmQgdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIHdpdGggQG5hbWUgYXMgdGhlIG5hbWUuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUmVhZHMgYSBwcm9wZXJ0eSBmcm9tIGEgb2JqZWN0LgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9nZXQoT2JqZWN0ICpvYmosIHN0cnVjdCBWaXNpdG9yICp2LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X3NldF9zdHI6CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBwcm9wZXJ0eQorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQGVycnA6IHJldHVybnMgYW4gZXJyb3IgaWYgdGhpcyBmdW5jdGlvbiBmYWlscworICoKKyAqIFdyaXRlcyBhIHN0cmluZyB2YWx1ZSB0byBhIHByb3BlcnR5LgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXRfc3RyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfZ2V0X3N0cjoKKyAqIEBvYmo6IHRoZSBvYmplY3QKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEBlcnJwOiByZXR1cm5zIGFuIGVycm9yIGlmIHRoaXMgZnVuY3Rpb24gZmFpbHMKKyAqCisgKiBSZXR1cm5zOiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCBjb252ZXJ0ZWQgdG8gYSBDIHN0cmluZywgb3IgTlVMTCBpZgorICogYW4gZXJyb3Igb2NjdXJzIChpbmNsdWRpbmcgd2hlbiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgbm90IGEgc3RyaW5nKS4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGZyZWUgdGhlIHN0cmluZy4KKyAqLworY2hhciAqb2JqZWN0X3Byb3BlcnR5X2dldF9zdHIoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9zZXRfbGluazoKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHByb3BlcnR5CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogV3JpdGVzIGFuIG9iamVjdCdzIGNhbm9uaWNhbCBwYXRoIHRvIGEgcHJvcGVydHkuCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X3NldF9saW5rKE9iamVjdCAqb2JqLCBPYmplY3QgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfZ2V0X2xpbms6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUmV0dXJuczogdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgcmVzb2x2ZWQgZnJvbSBhIHBhdGggdG8gYW4gT2JqZWN0LAorICogb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMgKGluY2x1ZGluZyB3aGVuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBub3QgYQorICogc3RyaW5nIG9yIG5vdCBhIHZhbGlkIG9iamVjdCBwYXRoKS4KKyAqLworT2JqZWN0ICpvYmplY3RfcHJvcGVydHlfZ2V0X2xpbmsoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9zZXRfYm9vbDoKKyAqIEB2YWx1ZTogdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHByb3BlcnR5CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogV3JpdGVzIGEgYm9vbCB2YWx1ZSB0byBhIHByb3BlcnR5LgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXRfYm9vbChPYmplY3QgKm9iaiwgYm9vbCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X2dldF9ib29sOgorICogQG9iajogdGhlIG9iamVjdAorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQGVycnA6IHJldHVybnMgYW4gZXJyb3IgaWYgdGhpcyBmdW5jdGlvbiBmYWlscworICoKKyAqIFJldHVybnM6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIGNvbnZlcnRlZCB0byBhIGJvb2xlYW4sIG9yIE5VTEwgaWYKKyAqIGFuIGVycm9yIG9jY3VycyAoaW5jbHVkaW5nIHdoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIG5vdCBhIGJvb2wpLgorICovCitib29sIG9iamVjdF9wcm9wZXJ0eV9nZXRfYm9vbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X3NldF9pbnQ6CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIHRoZSBwcm9wZXJ0eQorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQGVycnA6IHJldHVybnMgYW4gZXJyb3IgaWYgdGhpcyBmdW5jdGlvbiBmYWlscworICoKKyAqIFdyaXRlcyBhbiBpbnRlZ2VyIHZhbHVlIHRvIGEgcHJvcGVydHkuCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X3NldF9pbnQoT2JqZWN0ICpvYmosIGludDY0X3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X2dldF9pbnQ6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUmV0dXJuczogdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgY29udmVydGVkIHRvIGFuIGludGVnZXIsIG9yIE5VTEwgaWYKKyAqIGFuIGVycm9yIG9jY3VycyAoaW5jbHVkaW5nIHdoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIG5vdCBhbiBpbnRlZ2VyKS4KKyAqLworaW50NjRfdCBvYmplY3RfcHJvcGVydHlfZ2V0X2ludChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfc2V0OgorICogQG9iajogdGhlIG9iamVjdAorICogQHY6IHRoZSB2aXNpdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHdyaXRlIHRoZSBwcm9wZXJ0eSB2YWx1ZS4gIFRoaXMgc2hvdWxkCisgKiAgIGJlIGFuIElucHV0IHZpc2l0b3IgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZmlyc3QgcmVhZCB3aXRoIEBuYW1lIGFzIHRoZQorICogICBuYW1lIGFuZCB0aGVuIHdyaXR0ZW4gYXMgdGhlIHByb3BlcnR5IHZhbHVlLgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQGVycnA6IHJldHVybnMgYW4gZXJyb3IgaWYgdGhpcyBmdW5jdGlvbiBmYWlscworICoKKyAqIFdyaXRlcyBhIHByb3BlcnR5IHRvIGEgb2JqZWN0LgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXQoT2JqZWN0ICpvYmosIHN0cnVjdCBWaXNpdG9yICp2LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X3BhcnNlOgorICogQG9iajogdGhlIG9iamVjdAorICogQHN0cmluZzogdGhlIHN0cmluZyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSB0aGUgcHJvcGVydHkgdmFsdWUuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUGFyc2VzIGEgc3RyaW5nIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCBpbnRvIGEgcHJvcGVydHkgb2YgYW4gb2JqZWN0LgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9wYXJzZShPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfcHJpbnQ6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiAgVGhlCisgKiBjYWxsZXIgc2hhbGwgZnJlZSB0aGUgc3RyaW5nLgorICovCitjaGFyICpvYmplY3RfcHJvcGVydHlfcHJpbnQoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfZ2V0X3R5cGU6CisgKiBAb2JqOiB0aGUgb2JqZWN0CisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogUmV0dXJuczogIFRoZSB0eXBlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICovCitjb25zdCBjaGFyICpvYmplY3RfcHJvcGVydHlfZ2V0X3R5cGUoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfZ2V0X3Jvb3Q6CisgKgorICogUmV0dXJuczogdGhlIHJvb3Qgb2JqZWN0IG9mIHRoZSBjb21wb3NpdGlvbiB0cmVlCisgKi8KK09iamVjdCAqb2JqZWN0X2dldF9yb290KHZvaWQpOworCisvKioKKyAqIG9iamVjdF9nZXRfY2Fub25pY2FsX3BhdGg6CisgKgorICogUmV0dXJuczogVGhlIGNhbm9uaWNhbCBwYXRoIGZvciBhIG9iamVjdC4gIFRoaXMgaXMgdGhlIHBhdGggd2l0aGluIHRoZQorICogY29tcG9zaXRpb24gdHJlZSBzdGFydGluZyBmcm9tIHRoZSByb290LgorICovCitnY2hhciAqb2JqZWN0X2dldF9jYW5vbmljYWxfcGF0aChPYmplY3QgKm9iaik7CisKKy8qKgorICogb2JqZWN0X3Jlc29sdmVfcGF0aDoKKyAqIEBwYXRoOiB0aGUgcGF0aCB0byByZXNvbHZlCisgKiBAYW1iaWd1b3VzOiByZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggcmVzb2x1dGlvbiBmYWlsZWQgYmVjYXVzZSBvZiBhbgorICogICBhbWJpZ3VvdXMgbWF0Y2gKKyAqCisgKiBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHN1cHBvcnRlZCBwYXRocy0tYWJzb2x1dGUgcGF0aHMgYW5kIHBhcnRpYWwgcGF0aHMuCisgKiAKKyAqIEFic29sdXRlIHBhdGhzIGFyZSBkZXJpdmVkIGZyb20gdGhlIHJvb3Qgb2JqZWN0IGFuZCBjYW4gZm9sbG93IGNoaWxkPD4gb3IKKyAqIGxpbms8PiBwcm9wZXJ0aWVzLiAgU2luY2UgdGhleSBjYW4gZm9sbG93IGxpbms8PiBwcm9wZXJ0aWVzLCB0aGV5IGNhbiBiZQorICogYXJiaXRyYXJpbHkgbG9uZy4gIEFic29sdXRlIHBhdGhzIGxvb2sgbGlrZSBhYnNvbHV0ZSBmaWxlbmFtZXMgYW5kIGFyZQorICogcHJlZml4ZWQgd2l0aCBhIGxlYWRpbmcgc2xhc2guCisgKiAKKyAqIFBhcnRpYWwgcGF0aHMgbG9vayBsaWtlIHJlbGF0aXZlIGZpbGVuYW1lcy4gIFRoZXkgZG8gbm90IGJlZ2luIHdpdGggYQorICogcHJlZml4LiAgVGhlIG1hdGNoaW5nIHJ1bGVzIGZvciBwYXJ0aWFsIHBhdGhzIGFyZSBzdWJ0bGUgYnV0IGRlc2lnbmVkIHRvIG1ha2UKKyAqIHNwZWNpZnlpbmcgb2JqZWN0cyBlYXN5LiAgQXQgZWFjaCBsZXZlbCBvZiB0aGUgY29tcG9zaXRpb24gdHJlZSwgdGhlIHBhcnRpYWwKKyAqIHBhdGggaXMgbWF0Y2hlZCBhcyBhbiBhYnNvbHV0ZSBwYXRoLiAgVGhlIGZpcnN0IG1hdGNoIGlzIG5vdCByZXR1cm5lZC4gIEF0CisgKiBsZWFzdCB0d28gbWF0Y2hlcyBhcmUgc2VhcmNoZWQgZm9yLiAgQSBzdWNjZXNzZnVsIHJlc3VsdCBpcyBvbmx5IHJldHVybmVkIGlmCisgKiBvbmx5IG9uZSBtYXRjaCBpcyBmb3VuZC4gIElmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQsIGEgZmxhZyBpcworICogcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWF0Y2ggd2FzIGFtYmlndW91cy4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbWF0Y2hlZCBvYmplY3Qgb3IgTlVMTCBvbiBwYXRoIGxvb2t1cCBmYWlsdXJlLgorICovCitPYmplY3QgKm9iamVjdF9yZXNvbHZlX3BhdGgoY29uc3QgY2hhciAqcGF0aCwgYm9vbCAqYW1iaWd1b3VzKTsKKworLyoqCisgKiBvYmplY3RfcmVzb2x2ZV9wYXRoX3R5cGU6CisgKiBAcGF0aDogdGhlIHBhdGggdG8gcmVzb2x2ZQorICogQHR5cGVuYW1lOiB0aGUgdHlwZSB0byBsb29rIGZvci4KKyAqIEBhbWJpZ3VvdXM6IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCByZXNvbHV0aW9uIGZhaWxlZCBiZWNhdXNlIG9mIGFuCisgKiAgIGFtYmlndW91cyBtYXRjaAorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byBvYmplY3RfcmVzb2x2ZV9wYXRoLiAgSG93ZXZlciwgd2hlbiBsb29raW5nIGZvciBhCisgKiBwYXJ0aWFsIHBhdGggb25seSBtYXRjaGVzIHRoYXQgaW1wbGVtZW50IHRoZSBnaXZlbiB0eXBlIGFyZSBjb25zaWRlcmVkLgorICogVGhpcyByZXN0cmljdHMgdGhlIHNlYXJjaCBhbmQgYXZvaWRzIHNwdXJpb3VzbHkgZmxhZ2dpbmcgbWF0Y2hlcyBhcworICogYW1iaWd1b3VzLgorICoKKyAqIEZvciBib3RoIHBhcnRpYWwgYW5kIGFic29sdXRlIHBhdGhzLCB0aGUgcmV0dXJuIHZhbHVlIGdvZXMgdGhyb3VnaAorICogYSBkeW5hbWljIGNhc3QgdG8gQHR5cGVuYW1lLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgZWl0aGVyIHRoZSBsaW5rLAorICogb3IgdGhlIHR5cGVuYW1lIGl0c2VsZiBhcmUgb2YgaW50ZXJmYWNlIHR5cGVzLgorICoKKyAqIFJldHVybnM6IFRoZSBtYXRjaGVkIG9iamVjdCBvciBOVUxMIG9uIHBhdGggbG9va3VwIGZhaWx1cmUuCisgKi8KK09iamVjdCAqb2JqZWN0X3Jlc29sdmVfcGF0aF90eXBlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqYW1iaWd1b3VzKTsKKworLyoqCisgKiBvYmplY3RfcmVzb2x2ZV9wYXRoX2NvbXBvbmVudDoKKyAqIEBwYXJlbnQ6IHRoZSBvYmplY3QgaW4gd2hpY2ggdG8gcmVzb2x2ZSB0aGUgcGF0aAorICogQHBhcnQ6IHRoZSBjb21wb25lbnQgdG8gcmVzb2x2ZS4KKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gb2JqZWN0X3Jlc29sdmVfcGF0aCB3aXRoIGFuIGFic29sdXRlIHBhdGgsIGJ1dCBpdAorICogb25seSByZXNvbHZlcyBvbmUgZWxlbWVudCAoQHBhcnQpIGFuZCB0YWtlcyB0aGUgb3RoZXJzIGZyb20gQHBhcmVudC4KKyAqCisgKiBSZXR1cm5zOiBUaGUgcmVzb2x2ZWQgb2JqZWN0IG9yIE5VTEwgb24gcGF0aCBsb29rdXAgZmFpbHVyZS4KKyAqLworT2JqZWN0ICpvYmplY3RfcmVzb2x2ZV9wYXRoX2NvbXBvbmVudChPYmplY3QgKnBhcmVudCwgY29uc3QgZ2NoYXIgKnBhcnQpOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9hZGRfY2hpbGQ6CisgKiBAb2JqOiB0aGUgb2JqZWN0IHRvIGFkZCBhIHByb3BlcnR5IHRvCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAY2hpbGQ6IHRoZSBjaGlsZCBvYmplY3QKKyAqIEBlcnJwOiBpZiBhbiBlcnJvciBvY2N1cnMsIGEgcG9pbnRlciB0byBhbiBhcmVhIHRvIHN0b3JlIHRoZSBhcmVhCisgKgorICogQ2hpbGQgcHJvcGVydGllcyBmb3JtIHRoZSBjb21wb3NpdGlvbiB0cmVlLiAgQWxsIG9iamVjdHMgbmVlZCB0byBiZSBhIGNoaWxkCisgKiBvZiBhbm90aGVyIG9iamVjdC4gIE9iamVjdHMgY2FuIG9ubHkgYmUgYSBjaGlsZCBvZiBvbmUgb2JqZWN0LgorICoKKyAqIFRoZXJlIGlzIG5vIHdheSBmb3IgYSBjaGlsZCB0byBkZXRlcm1pbmUgd2hhdCBpdHMgcGFyZW50IGlzLiAgSXQgaXMgbm90CisgKiBhIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwLiAgVGhpcyBpcyBieSBkZXNpZ24uCisgKgorICogVGhlIHZhbHVlIG9mIGEgY2hpbGQgcHJvcGVydHkgYXMgYSBDIHN0cmluZyB3aWxsIGJlIHRoZSBjaGlsZCBvYmplY3QncworICogY2Fub25pY2FsIHBhdGguIEl0IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgb2JqZWN0X3Byb3BlcnR5X2dldF9zdHIoKS4KKyAqIFRoZSBjaGlsZCBvYmplY3QgaXRzZWxmIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcgb2JqZWN0X3Byb3BlcnR5X2dldF9saW5rKCkuCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2FkZF9jaGlsZChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgKmNoaWxkLCBFcnJvciAqKmVycnApOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9hZGRfbGluazoKKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG8KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEB0eXBlOiB0aGUgcW9iaiB0eXBlIG9mIHRoZSBsaW5rCisgKiBAY2hpbGQ6IGEgcG9pbnRlciB0byB3aGVyZSB0aGUgbGluayBvYmplY3QgcmVmZXJlbmNlIGlzIHN0b3JlZAorICogQGVycnA6IGlmIGFuIGVycm9yIG9jY3VycywgYSBwb2ludGVyIHRvIGFuIGFyZWEgdG8gc3RvcmUgdGhlIGFyZWEKKyAqCisgKiBMaW5rcyBlc3RhYmxpc2ggcmVsYXRpb25zaGlwcyBiZXR3ZWVuIG9iamVjdHMuICBMaW5rcyBhcmUgdW5pZGlyZWN0aW9uYWwKKyAqIGFsdGhvdWdoIHR3byBsaW5rcyBjYW4gYmUgY29tYmluZWQgdG8gZm9ybSBhIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwCisgKiBiZXR3ZWVuIG9iamVjdHMuCisgKgorICogTGlua3MgZm9ybSB0aGUgZ3JhcGggaW4gdGhlIG9iamVjdCBtb2RlbC4KKyAqCisgKiBPd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIgdGhhdCBAY2hpbGQgcG9pbnRzIHRvIGlzIHRyYW5zZmVycmVkIHRvIHRoZQorICogbGluayBwcm9wZXJ0eS4gIFRoZSByZWZlcmVuY2UgY291bnQgZm9yIDxjb2RlPipAY2hpbGQ8L2NvZGU+IGlzCisgKiBtYW5hZ2VkIGJ5IHRoZSBwcm9wZXJ0eSBmcm9tIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRpbGwgdGhlCisgKiBwcm9wZXJ0eSBpcyBkZWxldGVkIHdpdGggb2JqZWN0X3Byb3BlcnR5X2RlbCgpLgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfbGluayhPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIE9iamVjdCAqKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfYWRkX3N0cjoKKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG8KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEBnZXQ6IHRoZSBnZXR0ZXIgb3IgTlVMTCBpZiB0aGUgcHJvcGVydHkgaXMgd3JpdGUtb25seS4gIFRoaXMgZnVuY3Rpb24gbXVzdAorICogICByZXR1cm4gYSBzdHJpbmcgdG8gYmUgZnJlZWQgYnkgZ19mcmVlKCkuCisgKiBAc2V0OiB0aGUgc2V0dGVyIG9yIE5VTEwgaWYgdGhlIHByb3BlcnR5IGlzIHJlYWQtb25seQorICogQGVycnA6IGlmIGFuIGVycm9yIG9jY3VycywgYSBwb2ludGVyIHRvIGFuIGFyZWEgdG8gc3RvcmUgdGhlIGVycm9yCisgKgorICogQWRkIGEgc3RyaW5nIHByb3BlcnR5IHVzaW5nIGdldHRlcnMvc2V0dGVycy4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgYQorICogcHJvcGVydHkgb2YgdHlwZSAnc3RyaW5nJy4KKyAqLwordm9pZCBvYmplY3RfcHJvcGVydHlfYWRkX3N0cihPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKCpnZXQpKE9iamVjdCAqLCBFcnJvciAqKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpzZXQpKE9iamVjdCAqLCBjb25zdCBjaGFyICosIEVycm9yICoqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfYWRkX2Jvb2w6CisgKiBAb2JqOiB0aGUgb2JqZWN0IHRvIGFkZCBhIHByb3BlcnR5IHRvCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZ2V0OiB0aGUgZ2V0dGVyIG9yIE5VTEwgaWYgdGhlIHByb3BlcnR5IGlzIHdyaXRlLW9ubHkuCisgKiBAc2V0OiB0aGUgc2V0dGVyIG9yIE5VTEwgaWYgdGhlIHByb3BlcnR5IGlzIHJlYWQtb25seQorICogQGVycnA6IGlmIGFuIGVycm9yIG9jY3VycywgYSBwb2ludGVyIHRvIGFuIGFyZWEgdG8gc3RvcmUgdGhlIGVycm9yCisgKgorICogQWRkIGEgYm9vbCBwcm9wZXJ0eSB1c2luZyBnZXR0ZXJzL3NldHRlcnMuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGEKKyAqIHByb3BlcnR5IG9mIHR5cGUgJ2Jvb2wnLgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfYm9vbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCpnZXQpKE9iamVjdCAqLCBFcnJvciAqKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqc2V0KShPYmplY3QgKiwgYm9vbCwgRXJyb3IgKiopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfYWRkX3VpbnQ4X3B0cjoKKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG8KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEB2OiBwb2ludGVyIHRvIHZhbHVlCisgKiBAZXJycDogaWYgYW4gZXJyb3Igb2NjdXJzLCBhIHBvaW50ZXIgdG8gYW4gYXJlYSB0byBzdG9yZSB0aGUgZXJyb3IKKyAqCisgKiBBZGQgYW4gaW50ZWdlciBwcm9wZXJ0eSBpbiBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGEKKyAqIHByb3BlcnR5IG9mIHR5cGUgJ3VpbnQ4Jy4KKyAqLwordm9pZCBvYmplY3RfcHJvcGVydHlfYWRkX3VpbnQ4X3B0cihPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdiwgRXJyb3IgKiplcnJwKTsKKworLyoqCisgKiBvYmplY3RfcHJvcGVydHlfYWRkX3VpbnQxNl9wdHI6CisgKiBAb2JqOiB0aGUgb2JqZWN0IHRvIGFkZCBhIHByb3BlcnR5IHRvCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAdjogcG9pbnRlciB0byB2YWx1ZQorICogQGVycnA6IGlmIGFuIGVycm9yIG9jY3VycywgYSBwb2ludGVyIHRvIGFuIGFyZWEgdG8gc3RvcmUgdGhlIGVycm9yCisgKgorICogQWRkIGFuIGludGVnZXIgcHJvcGVydHkgaW4gbWVtb3J5LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhCisgKiBwcm9wZXJ0eSBvZiB0eXBlICd1aW50MTYnLgorICovCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfdWludDE2X3B0cihPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp2LCBFcnJvciAqKmVycnApOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9hZGRfdWludDMyX3B0cjoKKyAqIEBvYmo6IHRoZSBvYmplY3QgdG8gYWRkIGEgcHJvcGVydHkgdG8KKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyAqIEB2OiBwb2ludGVyIHRvIHZhbHVlCisgKiBAZXJycDogaWYgYW4gZXJyb3Igb2NjdXJzLCBhIHBvaW50ZXIgdG8gYW4gYXJlYSB0byBzdG9yZSB0aGUgZXJyb3IKKyAqCisgKiBBZGQgYW4gaW50ZWdlciBwcm9wZXJ0eSBpbiBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgYWRkIGEKKyAqIHByb3BlcnR5IG9mIHR5cGUgJ3VpbnQzMicuCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2FkZF91aW50MzJfcHRyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnYsIEVycm9yICoqZXJycCk7CisKKy8qKgorICogb2JqZWN0X3Byb3BlcnR5X2FkZF91aW50NjRfcHRyOgorICogQG9iajogdGhlIG9iamVjdCB0byBhZGQgYSBwcm9wZXJ0eSB0bworICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQHY6IHBvaW50ZXIgdG8gdmFsdWUKKyAqIEBlcnJwOiBpZiBhbiBlcnJvciBvY2N1cnMsIGEgcG9pbnRlciB0byBhbiBhcmVhIHRvIHN0b3JlIHRoZSBlcnJvcgorICoKKyAqIEFkZCBhbiBpbnRlZ2VyIHByb3BlcnR5IGluIG1lbW9yeS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgYQorICogcHJvcGVydHkgb2YgdHlwZSAndWludDY0Jy4KKyAqLwordm9pZCBvYmplY3RfcHJvcGVydHlfYWRkX3VpbnQ2NF9wdHIoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCAqdiwgRXJyb3IgKipFcnJwKTsKKworLyoqCisgKiBvYmplY3RfY2hpbGRfZm9yZWFjaDoKKyAqIEBvYmo6IHRoZSBvYmplY3Qgd2hvc2UgY2hpbGRyZW4gd2lsbCBiZSBuYXZpZ2F0ZWQKKyAqIEBmbjogdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAorICogQG9wYXF1ZTogYW4gb3BhcXVlIHZhbHVlIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yCisgKgorICogQ2FsbCBAZm4gcGFzc2luZyBlYWNoIGNoaWxkIG9mIEBvYmogYW5kIEBvcGFxdWUgdG8gaXQsIHVudGlsIEBmbiByZXR1cm5zCisgKiBub24temVyby4KKyAqCisgKiBSZXR1cm5zOiBUaGUgbGFzdCB2YWx1ZSByZXR1cm5lZCBieSBAZm4sIG9yIDAgaWYgdGhlcmUgaXMgbm8gY2hpbGQuCisgKi8KK2ludCBvYmplY3RfY2hpbGRfZm9yZWFjaChPYmplY3QgKm9iaiwgaW50ICgqZm4pKE9iamVjdCAqY2hpbGQsIHZvaWQgKm9wYXF1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworLyoqCisgKiBjb250YWluZXJfZ2V0OgorICogQHJvb3Q6IHJvb3Qgb2YgdGhlICNwYXRoLCBlLmcuLCBvYmplY3RfZ2V0X3Jvb3QoKQorICogQHBhdGg6IHBhdGggdG8gdGhlIGNvbnRhaW5lcgorICoKKyAqIFJldHVybiBhIGNvbnRhaW5lciBvYmplY3Qgd2hvc2UgcGF0aCBpcyBAcGF0aC4gIENyZWF0ZSBtb3JlIGNvbnRhaW5lcnMKKyAqIGFsb25nIHRoZSBwYXRoIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgY29udGFpbmVyIG9iamVjdC4KKyAqLworT2JqZWN0ICpjb250YWluZXJfZ2V0KE9iamVjdCAqcm9vdCwgY29uc3QgY2hhciAqcGF0aCk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcW9tL3FvbS1xb2JqZWN0LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvcW9tL3FvbS1xb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjZDcxNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9xb20vcW9tLXFvYmplY3QuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogUUVNVSBPYmplY3QgTW9kZWwgLSBRT2JqZWN0IHdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6IFBhb2xvIEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpZm5kZWYgUUVNVV9RT01fUU9CSkVDVF9ICisjZGVmaW5lIFFFTVVfUU9NX1FPQkpFQ1RfSAorCisjaW5jbHVkZSAicW9tL29iamVjdC5oIgorCisvKgorICogb2JqZWN0X3Byb3BlcnR5X2dldF9xb2JqZWN0OgorICogQG9iajogdGhlIG9iamVjdAorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICogQGVycnA6IHJldHVybnMgYW4gZXJyb3IgaWYgdGhpcyBmdW5jdGlvbiBmYWlscworICoKKyAqIFJldHVybnM6IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIGNvbnZlcnRlZCB0byBRT2JqZWN0LCBvciBOVUxMIGlmCisgKiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK3N0cnVjdCBRT2JqZWN0ICpvYmplY3RfcHJvcGVydHlfZ2V0X3FvYmplY3QoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBFcnJvciAqKmVycnApOworCisvKioKKyAqIG9iamVjdF9wcm9wZXJ0eV9zZXRfcW9iamVjdDoKKyAqIEBvYmo6IHRoZSBvYmplY3QKKyAqIEByZXQ6IFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgcHJvcGVydHkuCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5CisgKiBAZXJycDogcmV0dXJucyBhbiBlcnJvciBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzCisgKgorICogV3JpdGVzIGEgcHJvcGVydHkgdG8gYSBvYmplY3QuCisgKi8KK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X3NldF9xb2JqZWN0KE9iamVjdCAqb2JqLCBzdHJ1Y3QgUU9iamVjdCAqcW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBFcnJvciAqKmVycnApOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvYXJjaF9pbml0LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2FyY2hfaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZWJjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2FyY2hfaW5pdC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgUUVNVV9BUkNIX0lOSVRfSAorI2RlZmluZSBRRU1VX0FSQ0hfSU5JVF9ICisKK2V4dGVybiBjb25zdCBjaGFyIGFyY2hfY29uZmlnX25hbWVbXTsKKworZW51bSB7CisgICAgUUVNVV9BUkNIX0FMTCA9IC0xLAorICAgIFFFTVVfQVJDSF9BTFBIQSA9IDEsCisgICAgUUVNVV9BUkNIX0FSTSA9IDIsCisgICAgUUVNVV9BUkNIX0NSSVMgPSA0LAorICAgIFFFTVVfQVJDSF9JMzg2ID0gOCwKKyAgICBRRU1VX0FSQ0hfTTY4SyA9IDE2LAorICAgIFFFTVVfQVJDSF9MTTMyID0gMzIsCisgICAgUUVNVV9BUkNIX01JQ1JPQkxBWkUgPSA2NCwKKyAgICBRRU1VX0FSQ0hfTUlQUyA9IDEyOCwKKyAgICBRRU1VX0FSQ0hfUFBDID0gMjU2LAorICAgIFFFTVVfQVJDSF9TMzkwWCA9IDUxMiwKKyAgICBRRU1VX0FSQ0hfU0g0ID0gMTAyNCwKKyAgICBRRU1VX0FSQ0hfU1BBUkMgPSAyMDQ4LAorfTsKKworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGFyY2hfdHlwZTsKKwordm9pZCBzZWxlY3Rfc291bmRodyhjb25zdCBjaGFyICpvcHRhcmcpOwordm9pZCBkb19hY3BpdGFibGVfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdGFyZyk7Cit2b2lkIGRvX3NtYmlvc19vcHRpb24oY29uc3QgY2hhciAqb3B0YXJnKTsKK3ZvaWQgY3B1ZGVmX2luaXQodm9pZCk7CitpbnQgYXVkaW9fYXZhaWxhYmxlKHZvaWQpOwordm9pZCBhdWRpb19pbml0KHFlbXVfaXJxICppc2FfcGljLCBQQ0lCdXMgKnBjaV9idXMpOworaW50IGt2bV9hdmFpbGFibGUodm9pZCk7CitpbnQgeGVuX2F2YWlsYWJsZSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2JhbGxvb24uaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvYmFsbG9vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWFhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2JhbGxvb24uaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQmFsbG9vbgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDgKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBfUUVNVV9CQUxMT09OX0gKKyNkZWZpbmUgX1FFTVVfQkFMTE9PTl9ICisKKyNpbmNsdWRlICJleGVjL2NwdS1kZWZzLmgiCisKK3R5cGVkZWYgcmFtX2FkZHJfdCAoUUVNVUJhbGxvb25FdmVudCkodm9pZCAqb3BhcXVlLCByYW1fYWRkcl90IHRhcmdldCk7CisKK3ZvaWQgcWVtdV9hZGRfYmFsbG9vbl9oYW5kbGVyKFFFTVVCYWxsb29uRXZlbnQgKmZ1bmMsIHZvaWQgKm9wYXF1ZSk7CisKK3ZvaWQgcWVtdV9iYWxsb29uKHJhbV9hZGRyX3QgdGFyZ2V0KTsKKworcmFtX2FkZHJfdCBxZW11X2JhbGxvb25fc3RhdHVzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvYmxvY2tkZXYuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvYmxvY2tkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdhNzIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9ibG9ja2Rldi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBRRU1VIGhvc3QgYmxvY2sgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvcgorICogbGF0ZXIuICBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaWZuZGVmIEJMT0NLREVWX0gKKyNkZWZpbmUgQkxPQ0tERVZfSAorCisjaW5jbHVkZSAiYmxvY2svYmxvY2suaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisKK3ZvaWQgYmxvY2tkZXZfbWFya19hdXRvX2RlbChCbG9ja0RyaXZlclN0YXRlICpicyk7Cit2b2lkIGJsb2NrZGV2X2F1dG9fZGVsKEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKKworI2RlZmluZSBCTE9DS19TRVJJQUxfU1RSTEVOIDIwCisKK3N0cnVjdCBEcml2ZUluZm8geworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJkcnY7CisgICAgY2hhciAqaWQ7CisgICAgY29uc3QgY2hhciAqZGV2YWRkcjsKKyAgICBCbG9ja0ludGVyZmFjZVR5cGUgdHlwZTsKKyAgICBpbnQgYnVzOworICAgIGludCB1bml0OworICAgIGludCBhdXRvX2RlbDsgICAgICAgICAgICAgICAvKiBzZWUgYmxvY2tkZXZfbWFya19hdXRvX2RlbCgpICovCisgICAgUWVtdU9wdHMgKm9wdHM7CisgICAgY2hhciBzZXJpYWxbQkxPQ0tfU0VSSUFMX1NUUkxFTiArIDFdOworICAgIFFUQUlMUV9FTlRSWShEcml2ZUluZm8pIG5leHQ7Cit9OworCisjZGVmaW5lIE1BWF9JREVfREVWUwkyCisjZGVmaW5lIE1BWF9TQ1NJX0RFVlMJNworCitleHRlcm4gRHJpdmVJbmZvICpkcml2ZV9nZXQoQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGUsIGludCBidXMsIGludCB1bml0KTsKK2V4dGVybiBpbnQgZHJpdmVfZ2V0X21heF9idXMoQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGUpOworZXh0ZXJuIHZvaWQgZHJpdmVfdW5pbml0KERyaXZlSW5mbyAqZGluZm8pOworZXh0ZXJuIERyaXZlSW5mbyAqZHJpdmVfZ2V0X2J5X2Jsb2NrZGV2KEJsb2NrRHJpdmVyU3RhdGUgKmJzKTsKKworZXh0ZXJuIFFlbXVPcHRzICpkcml2ZV9hZGQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIERyaXZlSW5mbyAqZHJpdmVfaW5pdChRZW11T3B0cyAqYXJnLCBpbnQgZGVmYXVsdF90b19zY3NpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZhdGFsX2Vycm9yKTsKKworLyogZGV2aWNlLWhvdHBsdWcgKi8KKworRHJpdmVJbmZvICphZGRfaW5pdF9kcml2ZShjb25zdCBjaGFyICpvcHRzKTsKKwordm9pZCBkb19jb21taXQoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QpOworaW50IGRvX2VqZWN0KE1vbml0b3IgKm1vbiwgY29uc3QgUURpY3QgKnFkaWN0LCBRT2JqZWN0ICoqcmV0X2RhdGEpOworaW50IGRvX2Jsb2NrX3NldF9wYXNzd2QoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QsIFFPYmplY3QgKipyZXRfZGF0YSk7CitpbnQgZG9fY2hhbmdlX2Jsb2NrKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZm10KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2NoYXIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvY2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTJiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2NoYXIuaApAQCAtMCwwICsxLDEyOSBAQAorI2lmbmRlZiBRRU1VX0NIQVJfSAorI2RlZmluZSBRRU1VX0NIQVJfSAorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKyNpbmNsdWRlICJxZW11L2NvbmZpZy1maWxlLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKworLyogY2hhcmFjdGVyIGRldmljZSAqLworCisjZGVmaW5lIENIUl9FVkVOVF9CUkVBSyAgIDAgLyogc2VyaWFsIGJyZWFrIGNoYXIgKi8KKyNkZWZpbmUgQ0hSX0VWRU5UX0ZPQ1VTICAgMSAvKiBmb2N1cyB0byB0aGlzIHRlcm1pbmFsIChtb2RhbCBpbnB1dCBuZWVkZWQpICovCisjZGVmaW5lIENIUl9FVkVOVF9PUEVORUQgIDIgLyogbmV3IGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQgKi8KKyNkZWZpbmUgQ0hSX0VWRU5UX01VWF9JTiAgMyAvKiBtdXgtZm9jdXMgd2FzIHNldCB0byB0aGlzIHRlcm1pbmFsICovCisjZGVmaW5lIENIUl9FVkVOVF9NVVhfT1VUIDQgLyogbXV4LWZvY3VzIHdpbGwgbW92ZSBvbiAqLworI2RlZmluZSBDSFJfRVZFTlRfQ0xPU0VEICA1IC8qIGNvbm5lY3Rpb24gY2xvc2VkICovCisKKworI2RlZmluZSBDSFJfSU9DVExfU0VSSUFMX1NFVF9QQVJBTVMgICAxCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNwZWVkOworICAgIGludCBwYXJpdHk7CisgICAgaW50IGRhdGFfYml0czsKKyAgICBpbnQgc3RvcF9iaXRzOworfSBRRU1VU2VyaWFsU2V0UGFyYW1zOworCisjZGVmaW5lIENIUl9JT0NUTF9TRVJJQUxfU0VUX0JSRUFLICAgIDIKKworI2RlZmluZSBDSFJfSU9DVExfUFBfUkVBRF9EQVRBICAgICAgICAzCisjZGVmaW5lIENIUl9JT0NUTF9QUF9XUklURV9EQVRBICAgICAgIDQKKyNkZWZpbmUgQ0hSX0lPQ1RMX1BQX1JFQURfQ09OVFJPTCAgICAgNQorI2RlZmluZSBDSFJfSU9DVExfUFBfV1JJVEVfQ09OVFJPTCAgICA2CisjZGVmaW5lIENIUl9JT0NUTF9QUF9SRUFEX1NUQVRVUyAgICAgIDcKKyNkZWZpbmUgQ0hSX0lPQ1RMX1BQX0VQUF9SRUFEX0FERFIgICAgOAorI2RlZmluZSBDSFJfSU9DVExfUFBfRVBQX1JFQUQgICAgICAgICA5CisjZGVmaW5lIENIUl9JT0NUTF9QUF9FUFBfV1JJVEVfQUREUiAgMTAKKyNkZWZpbmUgQ0hSX0lPQ1RMX1BQX0VQUF9XUklURSAgICAgICAxMQorI2RlZmluZSBDSFJfSU9DVExfUFBfREFUQV9ESVIgICAgICAgIDEyCisKKyNkZWZpbmUgQ0hSX0lPQ1RMX1NFUklBTF9TRVRfVElPQ00gICAxMworI2RlZmluZSBDSFJfSU9DVExfU0VSSUFMX0dFVF9USU9DTSAgIDE0CisKKyNkZWZpbmUgQ0hSX1RJT0NNX0NUUwkweDAyMAorI2RlZmluZSBDSFJfVElPQ01fQ0FSCTB4MDQwCisjZGVmaW5lIENIUl9USU9DTV9EU1IJMHgxMDAKKyNkZWZpbmUgQ0hSX1RJT0NNX1JJCTB4MDgwCisjZGVmaW5lIENIUl9USU9DTV9EVFIJMHgwMDIKKyNkZWZpbmUgQ0hSX1RJT0NNX1JUUwkweDAwNAorCit0eXBlZGVmIHZvaWQgSU9FdmVudEhhbmRsZXIodm9pZCAqb3BhcXVlLCBpbnQgZXZlbnQpOworCitzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlIHsKKyAgICB2b2lkICgqaW5pdCkoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqcyk7CisgICAgaW50ICgqY2hyX3dyaXRlKShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pOworICAgIHZvaWQgKCpjaHJfdXBkYXRlX3JlYWRfaGFuZGxlcikoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqcyk7CisgICAgaW50ICgqY2hyX2lvY3RsKShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpzLCBpbnQgY21kLCB2b2lkICphcmcpOworICAgIGludCAoKmdldF9tc2dmZCkoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqcyk7CisgICAgSU9FdmVudEhhbmRsZXIgKmNocl9ldmVudDsKKyAgICBJT0NhblJlYWRIYW5kbGVyICpjaHJfY2FuX3JlYWQ7CisgICAgSU9SZWFkSGFuZGxlciAqY2hyX3JlYWQ7CisgICAgdm9pZCAqaGFuZGxlcl9vcGFxdWU7CisgICAgdm9pZCAoKmNocl9zZW5kX2V2ZW50KShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIsIGludCBldmVudCk7CisgICAgdm9pZCAoKmNocl9jbG9zZSkoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyKTsKKyAgICB2b2lkICgqY2hyX2FjY2VwdF9pbnB1dCkoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyKTsKKyAgICB2b2lkICgqY2hyX3NldF9lY2hvKShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIsIGJvb2wgZWNobyk7CisgICAgdm9pZCAoKmNocl9ndWVzdF9vcGVuKShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIpOworICAgIHZvaWQgKCpjaHJfZ3Vlc3RfY2xvc2UpKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNocik7CisgICAgdm9pZCAqb3BhcXVlOworICAgIFFFTVVCSCAqYmg7CisgICAgY2hhciAqbGFiZWw7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IG9wZW5lZDsKKyAgICBpbnQgYXZhaWxfY29ubmVjdGlvbnM7CisgICAgUVRBSUxRX0VOVFJZKENoYXJEcml2ZXJTdGF0ZSkgbmV4dDsKK307CisKK1FlbXVPcHRzICpxZW11X2Nocl9wYXJzZV9jb21wYXQoY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK0NoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl9vcHRzKFFlbXVPcHRzICpvcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmluaXQpKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKnMpKTsKK0NoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbihjb25zdCBjaGFyICpsYWJlbCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKCppbml0KShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpzKSk7Cit2b2lkIHFlbXVfY2hyX3NldF9lY2hvKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNociwgYm9vbCBlY2hvKTsKK3ZvaWQgcWVtdV9jaHJfZ3Vlc3Rfb3BlbihzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIpOwordm9pZCBxZW11X2Nocl9ndWVzdF9jbG9zZShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIpOwordm9pZCBxZW11X2Nocl9jbG9zZShDaGFyRHJpdmVyU3RhdGUgKmNocik7Cit2b2lkIHFlbXVfY2hyX3ByaW50ZihDaGFyRHJpdmVyU3RhdGUgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIEdDQ19GTVRfQVRUUigyLCAzKTsKK2ludCBxZW11X2Nocl93cml0ZShDaGFyRHJpdmVyU3RhdGUgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbik7Cit2b2lkIHFlbXVfY2hyX3NlbmRfZXZlbnQoQ2hhckRyaXZlclN0YXRlICpzLCBpbnQgZXZlbnQpOwordm9pZCBxZW11X2Nocl9hZGRfaGFuZGxlcnMoQ2hhckRyaXZlclN0YXRlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9DYW5SZWFkSGFuZGxlciAqZmRfY2FuX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1JlYWRIYW5kbGVyICpmZF9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9FdmVudEhhbmRsZXIgKmZkX2V2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2ludCBxZW11X2Nocl9pb2N0bChDaGFyRHJpdmVyU3RhdGUgKnMsIGludCBjbWQsIHZvaWQgKmFyZyk7Cit2b2lkIHFlbXVfY2hyX2luaXRpYWxfcmVzZXQodm9pZCk7Cit2b2lkIHFlbXVfY2hyX2dlbmVyaWNfb3BlbihDaGFyRHJpdmVyU3RhdGUgKnMpOworaW50IHFlbXVfY2hyX2Nhbl9yZWFkKENoYXJEcml2ZXJTdGF0ZSAqcyk7Cit2b2lkIHFlbXVfY2hyX3JlYWQoQ2hhckRyaXZlclN0YXRlICpzLCB1aW50OF90ICpidWYsIGludCBsZW4pOworaW50IHFlbXVfY2hyX2dldF9tc2dmZChDaGFyRHJpdmVyU3RhdGUgKnMpOwordm9pZCBxZW11X2Nocl9hY2NlcHRfaW5wdXQoQ2hhckRyaXZlclN0YXRlICpzKTsKK3ZvaWQgcWVtdV9jaHJfaW5mb19wcmludChNb25pdG9yICptb24sIGNvbnN0IFFPYmplY3QgKnJldF9kYXRhKTsKK3ZvaWQgcWVtdV9jaHJfaW5mbyhNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSk7CitDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX2ZpbmQoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIGFkZCBhbiBldmVudGZkIHRvIHRoZSBxZW11IGRldmljZXMgdGhhdCBhcmUgcG9sbGVkICovCitDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fZXZlbnRmZChpbnQgZXZlbnRmZCk7CisKK2V4dGVybiBpbnQgdGVybV9lc2NhcGVfY2hhcjsKKworLyogbWVtb3J5IGNoYXJkZXYgKi8KK3ZvaWQgcWVtdV9jaHJfaW5pdF9tZW0oQ2hhckRyaXZlclN0YXRlICpjaHIpOwordm9pZCBxZW11X2Nocl9jbG9zZV9tZW0oQ2hhckRyaXZlclN0YXRlICpjaHIpOworUVN0cmluZyAqcWVtdV9jaHJfbWVtX3RvX3FzKENoYXJEcml2ZXJTdGF0ZSAqY2hyKTsKK3NpemVfdCBxZW11X2Nocl9tZW1fb3NpemUoY29uc3QgQ2hhckRyaXZlclN0YXRlICpjaHIpOworCisvKiBhc3luYyBJL08gc3VwcG9ydCAqLworCitpbnQgcWVtdV9zZXRfZmRfaGFuZGxlcjIoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgIElPQ2FuUmVhZEhhbmRsZXIgKmZkX3JlYWRfcG9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmZkX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICpmZF93cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpOworaW50IHFlbXVfc2V0X2ZkX2hhbmRsZXIoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICpmZF9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgSU9IYW5kbGVyICpmZF93cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvY3B1cy5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9jcHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2NDZlYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvY3B1cy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBRRU1VX0NQVVNfSAorI2RlZmluZSBRRU1VX0NQVVNfSAorCit2b2lkIHRjZ19jcHVfZXhlYyh2b2lkKTsKK3ZvaWQgdm1fc3RhdGVfbm90aWZ5KGludCBydW5uaW5nLCBpbnQgcmVhc29uKTsKK2V4dGVybiBpbnQgdGJmbHVzaF9yZXF1ZXN0ZWQ7CitleHRlcm4gaW50IGRlYnVnX3JlcXVlc3RlZDsKKwordm9pZCByZXN1bWVfYWxsX3ZjcHVzKHZvaWQpOwordm9pZCBwYXVzZV9hbGxfdmNwdXModm9pZCk7CitpbnQgcWVtdV9pbml0X21haW5fbG9vcCh2b2lkKTsKK3ZvaWQgbWFpbl9sb29wKHZvaWQpOworCisjZW5kaWYgLyogUUVNVV9DUFVTX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvZG1hLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMzVjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2RtYS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBETUEgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIChHTlUgR1BMKSwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICovCisKKyNpZm5kZWYgRE1BX0gKKyNkZWZpbmUgRE1BX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisvLyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBod2FkZHIgYmFzZTsKKyAgICBod2FkZHIgbGVuOworfSBTY2F0dGVyR2F0aGVyRW50cnk7CisKK3N0cnVjdCBRRU1VU0dMaXN0IHsKKyAgICBTY2F0dGVyR2F0aGVyRW50cnkgKnNnOworICAgIGludCBuc2c7CisgICAgaW50IG5hbGxvYzsKKyAgICBod2FkZHIgc2l6ZTsKK307CisKK3ZvaWQgcWVtdV9zZ2xpc3RfaW5pdChRRU1VU0dMaXN0ICpxc2csIGludCBhbGxvY19oaW50KTsKK3ZvaWQgcWVtdV9zZ2xpc3RfYWRkKFFFTVVTR0xpc3QgKnFzZywgaHdhZGRyIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICBod2FkZHIgbGVuKTsKK3ZvaWQgcWVtdV9zZ2xpc3RfZGVzdHJveShRRU1VU0dMaXN0ICpxc2cpOworCitCbG9ja0RyaXZlckFJT0NCICpkbWFfYmRydl9yZWFkKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VU0dMaXN0ICpzZywgdWludDY0X3Qgc2VjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKTsKK0Jsb2NrRHJpdmVyQUlPQ0IgKmRtYV9iZHJ2X3dyaXRlKEJsb2NrRHJpdmVyU3RhdGUgKmJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVVNHTGlzdCAqc2csIHVpbnQ2NF90IHNlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRHJpdmVyQ29tcGxldGlvbkZ1bmMgKmNiLCB2b2lkICpvcGFxdWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L2t2bS5oIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9rdm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODYwMjZhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9rdm0uaApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFFFTVUgS1ZNIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2lmbmRlZiBRRU1VX0tWTV9ICisjZGVmaW5lIFFFTVVfS1ZNX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKworI2lmZGVmIENPTkZJR19LVk0KKworI2lmZGVmIFRBUkdFVF9JMzg2CitleHRlcm4gaW50IGt2bV9hbGxvd2VkOworCisjZGVmaW5lIGt2bV9lbmFibGVkKCkgKGt2bV9hbGxvd2VkKQorI2Vsc2UKKyNkZWZpbmUga3ZtX2VuYWJsZWQoKSAoMCkKKyNlbmRpZgorCisjZWxzZQorI2RlZmluZSBrdm1fZW5hYmxlZCgpICgwKQorI2VuZGlmCisKK3N0cnVjdCBrdm1fcnVuOworCisvKiBleHRlcm5hbCBBUEkgKi8KKworaW50IGt2bV9pbml0KGludCBzbXBfY3B1cyk7CisKK2ludCBrdm1faW5pdF92Y3B1KENQVVN0YXRlICplbnYpOworaW50IGt2bV9zeW5jX3ZjcHVzKHZvaWQpOworCitpbnQga3ZtX2NwdV9leGVjKENQVVN0YXRlICplbnYpOworCit2b2lkIGt2bV9zZXRfcGh5c19tZW0oaHdhZGRyIHN0YXJ0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3QgcGh5c19vZmZzZXQpOworCitpbnQga3ZtX3BoeXNpY2FsX3N5bmNfZGlydHlfYml0bWFwKGh3YWRkciBzdGFydF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2FkZHIgZW5kX2FkZHIpOworCitpbnQga3ZtX2xvZ19zdGFydChod2FkZHIgcGh5c19hZGRyLCByYW1fYWRkcl90IHNpemUpOworaW50IGt2bV9sb2dfc3RvcChod2FkZHIgcGh5c19hZGRyLCByYW1fYWRkcl90IHNpemUpOworaW50IGt2bV9zZXRfbWlncmF0aW9uX2xvZyhpbnQgZW5hYmxlKTsKKworaW50IGt2bV9oYXNfc3luY19tbXUodm9pZCk7CisKK3ZvaWQga3ZtX3NldHVwX2d1ZXN0X21lbW9yeSh2b2lkICpzdGFydCwgc2l6ZV90IHNpemUpOworCitpbnQga3ZtX2NvYWxlc2NlX21taW9fcmVnaW9uKGh3YWRkciBzdGFydCwgcmFtX2FkZHJfdCBzaXplKTsKK2ludCBrdm1fdW5jb2FsZXNjZV9tbWlvX3JlZ2lvbihod2FkZHIgc3RhcnQsIHJhbV9hZGRyX3Qgc2l6ZSk7CisKK2ludCBrdm1faW5zZXJ0X2JyZWFrcG9pbnQoQ1BVU3RhdGUgKmN1cnJlbnRfZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IHR5cGUpOworaW50IGt2bV9yZW1vdmVfYnJlYWtwb2ludChDUFVTdGF0ZSAqY3VycmVudF9lbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbGVuLCBpbnQgdHlwZSk7Cit2b2lkIGt2bV9yZW1vdmVfYWxsX2JyZWFrcG9pbnRzKENQVVN0YXRlICpjdXJyZW50X2Vudik7CitpbnQga3ZtX3VwZGF0ZV9ndWVzdF9kZWJ1ZyhDUFVTdGF0ZSAqZW52LCB1bnNpZ25lZCBsb25nIHJlaW5qZWN0X3RyYXApOworCisvKiBpbnRlcm5hbCBBUEkgKi8KKworc3RydWN0IEtWTVN0YXRlOwordHlwZWRlZiBzdHJ1Y3QgS1ZNU3RhdGUgS1ZNU3RhdGU7CisKK2ludCBrdm1faW9jdGwoS1ZNU3RhdGUgKnMsIGludCB0eXBlLCAuLi4pOworCitpbnQga3ZtX3ZtX2lvY3RsKEtWTVN0YXRlICpzLCBpbnQgdHlwZSwgLi4uKTsKKworaW50IGt2bV92Y3B1X2lvY3RsKENQVVN0YXRlICplbnYsIGludCB0eXBlLCAuLi4pOworCitpbnQga3ZtX2dldF9tcF9zdGF0ZShDUFVTdGF0ZSAqZW52KTsKK2ludCBrdm1fcHV0X21wX3N0YXRlKENQVVN0YXRlICplbnYpOworCisvKiBBcmNoIHNwZWNpZmljIGhvb2tzICovCisKK2ludCBrdm1fYXJjaF9wb3N0X3J1bihDUFVTdGF0ZSAqZW52LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKTsKKworaW50IGt2bV9hcmNoX3ZjcHVfcnVuKENQVVN0YXRlICplbnYpOworCitpbnQga3ZtX2FyY2hfaGFuZGxlX2V4aXQoQ1BVU3RhdGUgKmVudiwgc3RydWN0IGt2bV9ydW4gKnJ1bik7CisKK2ludCBrdm1fYXJjaF9wcmVfcnVuKENQVVN0YXRlICplbnYsIHN0cnVjdCBrdm1fcnVuICpydW4pOworCitpbnQga3ZtX2FyY2hfZ2V0X3JlZ2lzdGVycyhDUFVTdGF0ZSAqZW52KTsKKworaW50IGt2bV9hcmNoX3B1dF9yZWdpc3RlcnMoQ1BVU3RhdGUgKmVudik7CisKK2ludCBrdm1fYXJjaF9pbml0KEtWTVN0YXRlICpzLCBpbnQgc21wX2NwdXMpOworCitpbnQga3ZtX2FyY2hfaW5pdF92Y3B1KENQVVN0YXRlICplbnYpOworCitzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnOworc3RydWN0IGt2bV9kZWJ1Z19leGl0X2FyY2g7CisKK3N0cnVjdCBrdm1fc3dfYnJlYWtwb2ludCB7CisgICAgdGFyZ2V0X3Vsb25nIHBjOworICAgIHRhcmdldF91bG9uZyBzYXZlZF9pbnNuOworICAgIGludCB1c2VfY291bnQ7CisgICAgUVRBSUxRX0VOVFJZKGt2bV9zd19icmVha3BvaW50KSBlbnRyeTsKK307CisKK1FUQUlMUV9IRUFEKGt2bV9zd19icmVha3BvaW50X2hlYWQsIGt2bV9zd19icmVha3BvaW50KTsKKworaW50IGt2bV9hcmNoX2RlYnVnKHN0cnVjdCBrdm1fZGVidWdfZXhpdF9hcmNoICphcmNoX2luZm8pOworCitzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmt2bV9maW5kX3N3X2JyZWFrcG9pbnQoQ1BVU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcGMpOworCitpbnQga3ZtX3N3X2JyZWFrcG9pbnRzX2FjdGl2ZShDUFVTdGF0ZSAqZW52KTsKKworaW50IGt2bV9hcmNoX2luc2VydF9zd19icmVha3BvaW50KENQVVN0YXRlICpjdXJyZW50X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmJwKTsKK2ludCBrdm1fYXJjaF9yZW1vdmVfc3dfYnJlYWtwb2ludChDUFVTdGF0ZSAqY3VycmVudF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGt2bV9zd19icmVha3BvaW50ICpicCk7CitpbnQga3ZtX2FyY2hfaW5zZXJ0X2h3X2JyZWFrcG9pbnQodGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IHR5cGUpOworaW50IGt2bV9hcmNoX3JlbW92ZV9od19icmVha3BvaW50KHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBsZW4sIGludCB0eXBlKTsKK3ZvaWQga3ZtX2FyY2hfcmVtb3ZlX2FsbF9od19icmVha3BvaW50cyh2b2lkKTsKKwordm9pZCBrdm1fYXJjaF91cGRhdGVfZ3Vlc3RfZGVidWcoQ1BVU3RhdGUgKmVudiwgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnKTsKKworaW50IGt2bV9jaGVja19leHRlbnNpb24oS1ZNU3RhdGUgKnMsIHVuc2lnbmVkIGludCBleHRlbnNpb24pOworCit1aW50MzJfdCBrdm1fYXJjaF9nZXRfc3VwcG9ydGVkX2NwdWlkKENQVVN0YXRlICplbnYsIHVpbnQzMl90IGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnKTsKKworLyogZ2VuZXJpYyBob29rcyAtIHRvIGJlIG1vdmVkL3JlZmFjdG9yZWQgb25jZSB0aGVyZSBhcmUgbW9yZSB1c2VycyAqLworI2lmZGVmIENPTkZJR19IQVgKK3ZvaWQgaGF4X3ZjcHVfc3luY19zdGF0ZShDUFVTdGF0ZSAqY3B1LCBpbnQgbW9kaWZpZWQpOworI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3N5bmNocm9uaXplX3N0YXRlKENQVVN0YXRlICpjcHUsIGludCBtb2RpZmllZCkKK3sKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkgeworICAgICAgICBpZiAobW9kaWZpZWQpCisgICAgICAgICAgICBrdm1fYXJjaF9wdXRfcmVnaXN0ZXJzKGNwdSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGt2bV9hcmNoX2dldF9yZWdpc3RlcnMoY3B1KTsKKyAgICB9CisjaWZkZWYgQ09ORklHX0hBWAorICAgIGhheF92Y3B1X3N5bmNfc3RhdGUoY3B1LCBtb2RpZmllZCk7CisjZW5kaWYKK30KKworaW50IGt2bV9nZXRfc3JlZ3MoQ1BVU3RhdGUgKmVudik7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L29zLXBvc2l4LmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L29zLXBvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3NzNlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvb3MtcG9zaXguaApAQCAtMCwwICsxLDU0IEBACisvKgorICogcG9zaXggc3BlY2lmaWMgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBRRU1VX09TX1BPU0lYX0gKKyNkZWZpbmUgUUVNVV9PU19QT1NJWF9ICisKK3ZvaWQgb3Nfc2V0X2xpbmVfYnVmZmVyaW5nKHZvaWQpOwordm9pZCBvc19zZXRfcHJvY19uYW1lKGNvbnN0IGNoYXIgKnMpOwordm9pZCBvc19zZXR1cF9zaWduYWxfaGFuZGxpbmcodm9pZCk7Cit2b2lkIG9zX2RhZW1vbml6ZSh2b2lkKTsKK3ZvaWQgb3Nfc2V0dXBfcG9zdCh2b2lkKTsKK2ludCBvc19tbG9jayh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgdGltZXZhbCBxZW11X3RpbWV2YWw7CisjZGVmaW5lIHFlbXVfZ2V0dGltZW9mZGF5KHRwKSBnZXR0aW1lb2ZkYXkodHAsIE5VTEwpCisKKyNpZm5kZWYgQ09ORklHX1VUSU1FTlNBVAorI2lmbmRlZiBVVElNRV9OT1cKKyMgZGVmaW5lIFVUSU1FX05PVyAgICAgKCgxbCA8PCAzMCkgLSAxbCkKKyNlbmRpZgorI2lmbmRlZiBVVElNRV9PTUlUCisjIGRlZmluZSBVVElNRV9PTUlUICAgICgoMWwgPDwgMzApIC0gMmwpCisjZW5kaWYKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgcWVtdV90aW1lc3BlYzsKK2ludCBxZW11X3V0aW1lbnMoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgcWVtdV90aW1lc3BlYyAqdGltZXMpOworCitib29sIGlzX2RhZW1vbml6ZWQodm9pZCk7CitpbnQgcWVtdV91dGltZW5zYXQoaW50IGRpcmZkLCBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBxZW11X3RpbWVzcGVjICp0aW1lcywKKyAgICBpbnQgZmxhZ3MpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvb3Mtd2luMzIuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvb3Mtd2luMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODg0NTIyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9vcy13aW4zMi5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogd2luMzIgc3BlY2lmaWMgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBRRU1VX09TX1dJTjMyX0gKKyNkZWZpbmUgUUVNVV9PU19XSU4zMl9ICisKKyNkZWZpbmUgc29ja2V0X2Nsb3NlICB3aW5zb2NrMl9zb2NrZXRfY2xvc2UzCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworI3VuZGVmIHNvY2tldF9jbG9zZQorCisvKiBXb3JrYXJvdW5kIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBNaW5HVy4gKi8KKyNpZm5kZWYgRUNPTk5SRUZVU0VECisjIGRlZmluZSBFQ09OTlJFRlVTRUQgV1NBRUNPTk5SRUZVU0VECisjZW5kaWYKKyNpZm5kZWYgRUlOUFJPR1JFU1MKKyMgZGVmaW5lIEVJTlBST0dSRVNTICBXU0FFSU5QUk9HUkVTUworI2VuZGlmCisjaWZuZGVmIEVIT1NUVU5SRUFDSAorIyBkZWZpbmUgRUhPU1RVTlJFQUNIIFdTQUVIT1NUVU5SRUFDSAorI2VuZGlmCisjaWZuZGVmIEVJTlRSCisjIGRlZmluZSBFSU5UUiAgICAgICAgV1NBRUlOVFIKKyNlbmRpZgorI2lmbmRlZiBFSU5QUk9HUkVTUworIyBkZWZpbmUgRUlOUFJPR1JFU1MgIFdTQUVJTlBST0dSRVNTCisjZW5kaWYKKyNpZm5kZWYgRU5FVFVOUkVBQ0gKKyMgZGVmaW5lIEVORVRVTlJFQUNIICBXU0FFTkVUVU5SRUFDSAorI2VuZGlmCisjaWZuZGVmIEVOT1RDT05OCisjIGRlZmluZSBFTk9UQ09OTiAgICAgV1NBRU5PVENPTk4KKyNlbmRpZgorI2lmbmRlZiBFV09VTERCTE9DSworIyBkZWZpbmUgRVdPVUxEQkxPQ0sgIFdTQUVXT1VMREJMT0NLCisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjY0KQorLyogT24gdzY0LCBzZXRqbXAgaXMgaW1wbGVtZW50ZWQgYnkgX3NldGptcCB3aGljaCBuZWVkcyBhIHNlY29uZCBwYXJhbWV0ZXIuCisgKiBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCBsb25nanVtcCBkb2VzIG5vIHN0YWNrIHVud2luZGluZy4KKyAqIFRoYXQgaXMgd2hhdCB3ZSBuZWVkIGZvciBRRU1VLiBQYXNzaW5nIHRoZSB2YWx1ZSBvZiByZWdpc3RlciByc3AgKGRlZmF1bHQpCisgKiBsZXRzIGxvbmdqbXAgdHJ5IGEgc3RhY2sgdW53aW5kaW5nIHdoaWNoIHdpbGwgY3Jhc2ggd2l0aCBnZW5lcmF0ZWQgY29kZS4gKi8KKyMgdW5kZWYgc2V0am1wCisjIGRlZmluZSBzZXRqbXAoZW52KSBfc2V0am1wKGVudiwgTlVMTCkKKyNlbmRpZgorLyogUUVNVSB1c2VzIHNpZ3NldGptcCgpL3NpZ2xvbmdqbXAoKSBhcyB0aGUgcG9ydGFibGUgd2F5IHRvIHNwZWNpZnkKKyAqICJsb25nam1wIGFuZCBkb24ndCB0b3VjaCB0aGUgc2lnbmFsIG1hc2tzIi4gU2luY2Ugd2Uga25vdyB0aGF0IHRoZQorICogc2F2ZW1hc2sgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIHplcm8gd2UgY2FuIHNhZmVseSBkZWZpbmUgdGhlc2UKKyAqIGluIHRlcm1zIG9mIHNldGptcC9sb25nam1wIG9uIFdpbjMyLgorICovCisjZGVmaW5lIHNpZ2ptcF9idWYgam1wX2J1ZgorI2RlZmluZSBzaWdzZXRqbXAoZW52LCBzYXZlbWFzaykgc2V0am1wKGVudikKKyNkZWZpbmUgc2lnbG9uZ2ptcChlbnYsIHZhbCkgbG9uZ2ptcChlbnYsIHZhbCkKKworLyogRGVjbGFyYXRpb24gb2YgZmZzKCkgaXMgbWlzc2luZyBpbiBNaW5HVydzIHN0cmluZ3MuaC4gKi8KK2ludCBmZnMoaW50IGkpOworCisvKiBNaXNzaW5nIFBPU0lYIGZ1bmN0aW9ucy4gRG9uJ3QgdXNlIE1pbkdXLXc2NCBtYWNyb3MuICovCisjdW5kZWYgZ210aW1lX3IKK3N0cnVjdCB0bSAqZ210aW1lX3IoY29uc3QgdGltZV90ICp0aW1lcCwgc3RydWN0IHRtICpyZXN1bHQpOworI3VuZGVmIGxvY2FsdGltZV9yCitzdHJ1Y3QgdG0gKmxvY2FsdGltZV9yKGNvbnN0IHRpbWVfdCAqdGltZXAsIHN0cnVjdCB0bSAqcmVzdWx0KTsKKyN1bmRlZiBzdHJ0b2tfcgorY2hhciAqc3RydG9rX3IoY2hhciAqc3RyLCBjb25zdCBjaGFyICpkZWxpbSwgY2hhciAqKnNhdmVwdHIpOworCisvKiBQb2xsaW5nIGhhbmRsaW5nICovCisKKy8qIHJldHVybiBUUlVFIGlmIG5vIHNsZWVwIHNob3VsZCBiZSBkb25lIGFmdGVyd2FyZHMgKi8KK3R5cGVkZWYgaW50IFBvbGxpbmdGdW5jKHZvaWQgKm9wYXF1ZSk7CisKK2ludCBxZW11X2FkZF9wb2xsaW5nX2NiKFBvbGxpbmdGdW5jICpmdW5jLCB2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X2RlbF9wb2xsaW5nX2NiKFBvbGxpbmdGdW5jICpmdW5jLCB2b2lkICpvcGFxdWUpOworCisvKiBXYWl0IG9iamVjdHMgaGFuZGxpbmcgKi8KK3R5cGVkZWYgdm9pZCBXYWl0T2JqZWN0RnVuYyh2b2lkICpvcGFxdWUpOworCitpbnQgcWVtdV9hZGRfd2FpdF9vYmplY3QoSEFORExFIGhhbmRsZSwgV2FpdE9iamVjdEZ1bmMgKmZ1bmMsIHZvaWQgKm9wYXF1ZSk7Cit2b2lkIHFlbXVfZGVsX3dhaXRfb2JqZWN0KEhBTkRMRSBoYW5kbGUsIFdhaXRPYmplY3RGdW5jICpmdW5jLCB2b2lkICpvcGFxdWUpOworCit2b2lkIG9zX2hvc3RfbWFpbl9sb29wX3dhaXQoaW50ICp0aW1lb3V0KTsKKworc3RhdGljIGlubGluZSB2b2lkIG9zX3NldHVwX3NpZ25hbF9oYW5kbGluZyh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG9zX2RhZW1vbml6ZSh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG9zX3NldHVwX3Bvc3Qodm9pZCkge30KK3ZvaWQgb3Nfc2V0X2xpbmVfYnVmZmVyaW5nKHZvaWQpOworc3RhdGljIGlubGluZSB2b2lkIG9zX3NldF9wcm9jX25hbWUoY29uc3QgY2hhciAqZHVtbXkpIHt9CisKKyNpZiAhZGVmaW5lZChFUFJPVE9OT1NVUFBPUlQpCisjIGRlZmluZSBFUFJPVE9OT1NVUFBPUlQgRUlOVkFMCisjZW5kaWYKKworaW50IHNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsb25nIHR2X3NlYzsKKyAgICBsb25nIHR2X3VzZWM7Cit9IHFlbXVfdGltZXZhbDsKK2ludCBxZW11X2dldHRpbWVvZmRheShxZW11X3RpbWV2YWwgKnRwKTsKKworc3RhdGljIGlubGluZSBib29sIGlzX2RhZW1vbml6ZWQodm9pZCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9zX21sb2NrKHZvaWQpCit7CisgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3N5c2VtdS9zeXNlbXUuaCBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvc3lzZW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkMmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvc3lzZW11LmgKQEAgLTAsMCArMSwyNjQgQEAKKyNpZm5kZWYgU1lTRU1VX0gKKyNkZWZpbmUgU1lTRU1VX0gKKy8qIE1pc2MuIHRoaW5ncyByZWxhdGVkIHRvIHRoZSBzeXN0ZW0gZW11bGF0b3IuICAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L29wdGlvbi5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xZXJyb3IuaCIKKworI2luY2x1ZGUgImV4ZWMvaHdhZGRyLmgiCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworLyogdmwuYyAqLworZXh0ZXJuIGNvbnN0IGNoYXIgKmJpb3NfbmFtZTsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIHNhdmV2bV9vbl9leGl0OworZXh0ZXJuIGludCBub19zaHV0ZG93bjsKK2V4dGVybiBpbnQgdm1fcnVubmluZzsKK2V4dGVybiBpbnQgdm1fY2FuX3J1bih2b2lkKTsKK2V4dGVybiBpbnQgcWVtdV9kZWJ1Z19yZXF1ZXN0ZWQodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqcWVtdV9uYW1lOworZXh0ZXJuIHVpbnQ4X3QgcWVtdV91dWlkW107CitpbnQgcWVtdV91dWlkX3BhcnNlKGNvbnN0IGNoYXIgKnN0ciwgdWludDhfdCAqdXVpZCk7CisjZGVmaW5lIFVVSURfRk1UICIlMDJoaHglMDJoaHglMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4LSUwMmhoeCUwMmhoeC0lMDJoaHglMDJoaHgtJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4IgorCit0eXBlZGVmIHN0cnVjdCB2bV9jaGFuZ2Vfc3RhdGVfZW50cnkgVk1DaGFuZ2VTdGF0ZUVudHJ5OwordHlwZWRlZiB2b2lkIFZNQ2hhbmdlU3RhdGVIYW5kbGVyKHZvaWQgKm9wYXF1ZSwgaW50IHJ1bm5pbmcsIGludCByZWFzb24pOworCitWTUNoYW5nZVN0YXRlRW50cnkgKnFlbXVfYWRkX3ZtX2NoYW5nZV9zdGF0ZV9oYW5kbGVyKFZNQ2hhbmdlU3RhdGVIYW5kbGVyICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK3ZvaWQgcWVtdV9kZWxfdm1fY2hhbmdlX3N0YXRlX2hhbmRsZXIoVk1DaGFuZ2VTdGF0ZUVudHJ5ICplKTsKKwordm9pZCB2bV9zdGFydCh2b2lkKTsKK3ZvaWQgdm1fc3RvcChpbnQgcmVhc29uKTsKKwordWludDY0X3QgcmFtX2J5dGVzX3JlbWFpbmluZyh2b2lkKTsKK3VpbnQ2NF90IHJhbV9ieXRlc190cmFuc2ZlcnJlZCh2b2lkKTsKK3VpbnQ2NF90IHJhbV9ieXRlc190b3RhbCh2b2lkKTsKKworaW50NjRfdCBjcHVfZ2V0X3RpY2tzKHZvaWQpOwordm9pZCBjcHVfZW5hYmxlX3RpY2tzKHZvaWQpOwordm9pZCBjcHVfZGlzYWJsZV90aWNrcyh2b2lkKTsKKwordm9pZCBjb25maWd1cmVfaWNvdW50KGNvbnN0IGNoYXIqIG9wdHMpOwordm9pZCBjb25maWd1cmVfYWxhcm1zKGNvbnN0IGNoYXIqIG9wdHMpOworaW50IGluaXRfdGltZXJfYWxhcm0odm9pZCk7CitpbnQgcWVtdV90aW1lcl9hbGFybV9wZW5kaW5nKHZvaWQpOwordm9pZCBxdWl0X3RpbWVycyh2b2lkKTsKKworaW50NjRfdCBxZW11X2ljb3VudDsKK2ludDY0X3QgcWVtdV9pY291bnRfYmlhczsKK2ludCBpY291bnRfdGltZV9zaGlmdDsKKworaW50IHRjZ19oYXNfd29yayh2b2lkKTsKKwordm9pZCBxZW11X3N5c3RlbV9yZXNldF9yZXF1ZXN0KHZvaWQpOwordm9pZCBxZW11X3N5c3RlbV9zaHV0ZG93bl9yZXF1ZXN0KHZvaWQpOwordm9pZCBxZW11X3N5c3RlbV9wb3dlcmRvd25fcmVxdWVzdCh2b2lkKTsKK2ludCBxZW11X3NodXRkb3duX3JlcXVlc3RlZCh2b2lkKTsKK2ludCBxZW11X3Jlc2V0X3JlcXVlc3RlZCh2b2lkKTsKK2ludCBxZW11X3Ztc3RvcF9yZXF1ZXN0ZWQodm9pZCk7CitpbnQgcWVtdV9wb3dlcmRvd25fcmVxdWVzdGVkKHZvaWQpOwordm9pZCBxZW11X3N5c3RlbV9raWxsZWQoaW50IHNpZ25hbCwgcGlkX3QgcGlkKTsKKyNpZmRlZiBORUVEX0NQVV9ICisjaWYgIWRlZmluZWQoVEFSR0VUX1NQQVJDKQorLy8gUGxlYXNlIGltcGxlbWVudCBhIHBvd2VyIGZhaWx1cmUgZnVuY3Rpb24gdG8gc2lnbmFsIHRoZSBPUworI2RlZmluZSBxZW11X3N5c3RlbV9wb3dlcmRvd24oKSBkb3t9d2hpbGUoMCkKKyNlbHNlCit2b2lkIHFlbXVfc3lzdGVtX3Bvd2VyZG93bih2b2lkKTsKKyNlbmRpZgorI2VuZGlmCit2b2lkIHFlbXVfc3lzdGVtX3Jlc2V0KHZvaWQpOworCit2b2lkIGRvX3NhdmV2bShNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBkb19sb2Fkdm0oTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZG9fZGVsdm0oTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgZG9faW5mb19zbmFwc2hvdHMoTW9uaXRvciAqbW9uLCBNb25pdG9yKiBlcnIpOworCit2b2lkIHFlbXVfYW5ub3VuY2Vfc2VsZih2b2lkKTsKKwordm9pZCBtYWluX2xvb3Bfd2FpdChpbnQgdGltZW91dCk7CisKK2ludCBxZW11X3NhdmV2bV9zdGF0ZV9iZWdpbihRRU1VRmlsZSAqZik7CitpbnQgcWVtdV9zYXZldm1fc3RhdGVfaXRlcmF0ZShRRU1VRmlsZSAqZik7CitpbnQgcWVtdV9zYXZldm1fc3RhdGVfY29tcGxldGUoUUVNVUZpbGUgKmYpOworaW50IHFlbXVfc2F2ZXZtX3N0YXRlKFFFTVVGaWxlICpmKTsKK2ludCBxZW11X2xvYWR2bV9zdGF0ZShRRU1VRmlsZSAqZik7CisKK3ZvaWQgcWVtdV9lcnJvcnNfdG9fZmlsZShGSUxFICpmcCk7Cit2b2lkIHFlbXVfZXJyb3JzX3RvX21vbihNb25pdG9yICptb24pOwordm9pZCBxZW11X2Vycm9yc190b19wcmV2aW91cyh2b2lkKTsKK3ZvaWQgcWVtdV9lcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7Cit2b2lkIHFlbXVfZXJyb3JfaW50ZXJuYWwoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmVuciwgY29uc3QgY2hhciAqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgNCwgNSkpKTsKKworI2RlZmluZSBxZW11X2Vycm9yX25ldyhmbXQsIC4uLikgXAorICAgIHFlbXVfZXJyb3JfaW50ZXJuYWwoX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXywgZm10LCAjIyBfX1ZBX0FSR1NfXykKKworLyogVEFQIHdpbjMyICovCitpbnQgdGFwX3dpbjMyX2luaXQoVkxBTlN0YXRlICp2bGFuLCBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICppZm5hbWUpOworCisvKiBTTElSUCAqLwordm9pZCBkb19pbmZvX3NsaXJwKE1vbml0b3IgKm1vbik7CisKK3R5cGVkZWYgZW51bSBEaXNwbGF5VHlwZQoreworICAgIERUX0RFRkFVTFQsCisgICAgRFRfQ1VSU0VTLAorICAgIERUX1NETCwKKyAgICBEVF9RVCwKKyAgICBEVF9HVEssCisgICAgRFRfVk5DLAorICAgIERUX05PR1JBUEhJQywKKyAgICBEVF9OT05FLAorfSBEaXNwbGF5VHlwZTsKKworZXh0ZXJuIGludCBhdXRvc3RhcnQ7CitleHRlcm4gaW50IGJpb3Nfc2l6ZTsKK2V4dGVybiBpbnQgY2lycnVzX3ZnYV9lbmFibGVkOworZXh0ZXJuIGludCBzdGRfdmdhX2VuYWJsZWQ7CitleHRlcm4gaW50IHZtc3ZnYV9lbmFibGVkOworZXh0ZXJuIGludCB4ZW5mYl9lbmFibGVkOworZXh0ZXJuIGludCBncmFwaGljX3dpZHRoOworZXh0ZXJuIGludCBncmFwaGljX2hlaWdodDsKK2V4dGVybiBpbnQgZ3JhcGhpY19kZXB0aDsKK2V4dGVybiBEaXNwbGF5VHlwZSBkaXNwbGF5X3R5cGU7CitleHRlcm4gY29uc3QgY2hhciAqa2V5Ym9hcmRfbGF5b3V0OworZXh0ZXJuIGludCB3aW4ya19pbnN0YWxsX2hhY2s7CitleHRlcm4gaW50IHJ0Y190ZF9oYWNrOworZXh0ZXJuIGludCBhbHRfZ3JhYjsKK2V4dGVybiBpbnQgdXNiX2VuYWJsZWQ7CitleHRlcm4gaW50IG5vX3ZpcnRpb19iYWxsb29uOworZXh0ZXJuIGludCBzbXBfY3B1czsKK2V4dGVybiBpbnQgY3Vyc29yX2hpZGU7CitleHRlcm4gaW50IGdyYXBoaWNfcm90YXRlOworZXh0ZXJuIGludCBub19xdWl0OworZXh0ZXJuIGludCBzZW1paG9zdGluZ19lbmFibGVkOworZXh0ZXJuIGludCBvbGRfcGFyYW07CisKK2NvbnN0IGNoYXIqIGRuc19sb2dfZmlsZW5hbWU7Citjb25zdCBjaGFyKiBkcm9wX2xvZ19maWxlbmFtZTsKKworI2RlZmluZSBNQVhfTk9ERVMgNjQKK2V4dGVybiBpbnQgbmJfbnVtYV9ub2RlczsKK2V4dGVybiB1aW50NjRfdCBub2RlX21lbVtNQVhfTk9ERVNdOworCisjZGVmaW5lIE1BWF9PUFRJT05fUk9NUyAxNgorZXh0ZXJuIGNvbnN0IGNoYXIgKm9wdGlvbl9yb21bTUFYX09QVElPTl9ST01TXTsKK2V4dGVybiBpbnQgbmJfb3B0aW9uX3JvbXM7CisKKyNpZmRlZiBORUVEX0NQVV9ICisjaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpIHx8IGRlZmluZWQoVEFSR0VUX1BQQykKKyNkZWZpbmUgTUFYX1BST01fRU5WUyAxMjgKK2V4dGVybiBjb25zdCBjaGFyICpwcm9tX2VudnNbTUFYX1BST01fRU5WU107CitleHRlcm4gdW5zaWduZWQgaW50IG5iX3Byb21fZW52czsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiAwCit0eXBlZGVmIGVudW0geworICAgIEJMT0NLX0VSUl9SRVBPUlQsIEJMT0NLX0VSUl9JR05PUkUsIEJMT0NLX0VSUl9TVE9QX0VOT1NQQywKKyAgICBCTE9DS19FUlJfU1RPUF9BTlkKK30gQmxvY2tJbnRlcmZhY2VFcnJvckFjdGlvbjsKKworc3RydWN0IERyaXZlSW5mbyB7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYmRydjsKKyAgICBCbG9ja0ludGVyZmFjZVR5cGUgdHlwZTsKKyAgICBpbnQgYnVzOworICAgIGludCB1bml0OworICAgIGludCB1c2VkOworICAgIGludCBkcml2ZV9vcHRfaWR4OworICAgIEJsb2NrSW50ZXJmYWNlRXJyb3JBY3Rpb24gb25lcnJvcjsKKyAgICBjaGFyIHNlcmlhbFsyMV07Cit9OworCisjZGVmaW5lIE1BWF9JREVfREVWUwkyCisjZGVmaW5lIE1BWF9TQ1NJX0RFVlMJNworI2RlZmluZSBNQVhfRFJJVkVTIDMyCisKK2V4dGVybiBpbnQgbmJfZHJpdmVzOworZXh0ZXJuIERyaXZlSW5mbyBkcml2ZXNfdGFibGVbTUFYX0RSSVZFUysxXTsKKworZXh0ZXJuIGludCBkcml2ZV9nZXRfaW5kZXgoQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGUsIGludCBidXMsIGludCB1bml0KTsKK2V4dGVybiBpbnQgZHJpdmVfZ2V0X21heF9idXMoQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGUpOworZXh0ZXJuIHZvaWQgZHJpdmVfdW5pbml0KEJsb2NrRHJpdmVyU3RhdGUgKmJkcnYpOworZXh0ZXJuIHZvaWQgZHJpdmVfcmVtb3ZlKGludCBpbmRleCk7CitleHRlcm4gY29uc3QgY2hhciAqZHJpdmVfZ2V0X3NlcmlhbChCbG9ja0RyaXZlclN0YXRlICpiZHJ2KTsKK2V4dGVybiBCbG9ja0ludGVyZmFjZUVycm9yQWN0aW9uIGRyaXZlX2dldF9vbmVycm9yKEJsb2NrRHJpdmVyU3RhdGUgKmJkcnYpOworCitCbG9ja0RyaXZlclN0YXRlICpxZGV2X2luaXRfYmRydihEZXZpY2VTdGF0ZSAqZGV2LCBCbG9ja0ludGVyZmFjZVR5cGUgdHlwZSk7CisKK3N0cnVjdCBkcml2ZV9vcHQgeworICAgIGNvbnN0IGNoYXIgKmZpbGU7CisgICAgY2hhciBvcHRbMTAyNF07CisgICAgaW50IHVzZWQ7Cit9OworCitleHRlcm4gc3RydWN0IGRyaXZlX29wdCBkcml2ZXNfb3B0W01BWF9EUklWRVNdOworZXh0ZXJuIGludCBuYl9kcml2ZXNfb3B0OworCitleHRlcm4gaW50IGRyaXZlX2FkZChjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gaW50IGRyaXZlX2luaXQoc3RydWN0IGRyaXZlX29wdCAqYXJnLCBpbnQgc25hcHNob3QsIHZvaWQgKm1hY2hpbmUpOworaW50IGFkZF9pbml0X2RyaXZlKGNvbnN0IGNoYXIgKm9wdHMpOworI2VuZGlmCisKKy8qIGFjcGkgKi8KK3ZvaWQgcWVtdV9zeXN0ZW1faG90X2FkZF9pbml0KHZvaWQpOwordm9pZCBxZW11X3N5c3RlbV9kZXZpY2VfaG90X2FkZChpbnQgcGNpYnVzLCBpbnQgc2xvdCwgaW50IHN0YXRlKTsKKworLyogZGV2aWNlLWhvdHBsdWcgKi8KKwordHlwZWRlZiBpbnQgKGRldl9tYXRjaF9mbikodm9pZCAqZGV2X3ByaXZhdGUsIHZvaWQgKmFyZyk7CisKK3ZvaWQgZGVzdHJveV9uaWMoZGV2X21hdGNoX2ZuICptYXRjaF9mbiwgdm9pZCAqYXJnKTsKK3ZvaWQgZGVzdHJveV9iZHJ2cyhkZXZfbWF0Y2hfZm4gKm1hdGNoX2ZuLCB2b2lkICphcmcpOworCisjaWZuZGVmIENPTkZJR19BTkRST0lECisvKiBwY2ktaG90cGx1ZyAqLwordm9pZCBwY2lfZGV2aWNlX2hvdF9hZGQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpwY2lfYWRkciwgY29uc3QgY2hhciAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdHMpOwordm9pZCBkcml2ZV9ob3RfYWRkKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqcGNpX2FkZHIsIGNvbnN0IGNoYXIgKm9wdHMpOwordm9pZCBwY2lfZGV2aWNlX2hvdF9yZW1vdmUoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpwY2lfYWRkcik7Cit2b2lkIHBjaV9kZXZpY2VfaG90X3JlbW92ZV9zdWNjZXNzKGludCBwY2lidXMsIGludCBzbG90KTsKKyNlbmRpZgorCisvKiBzZXJpYWwgcG9ydHMgKi8KKworI2RlZmluZSBNQVhfU0VSSUFMX1BPUlRTIDQKKworZXh0ZXJuIENoYXJEcml2ZXJTdGF0ZSAqc2VyaWFsX2hkc1tNQVhfU0VSSUFMX1BPUlRTXTsKKworLyogcGFyYWxsZWwgcG9ydHMgKi8KKworI2RlZmluZSBNQVhfUEFSQUxMRUxfUE9SVFMgMworCitleHRlcm4gQ2hhckRyaXZlclN0YXRlICpwYXJhbGxlbF9oZHNbTUFYX1BBUkFMTEVMX1BPUlRTXTsKKworLyogdmlydGlvIGNvbnNvbGVzICovCisKKyNkZWZpbmUgTUFYX1ZJUlRJT19DT05TT0xFUyAxCisKK2V4dGVybiBDaGFyRHJpdmVyU3RhdGUgKnZpcnRjb25faGRzW01BWF9WSVJUSU9fQ09OU09MRVNdOworCisjZGVmaW5lIFRGUihleHByKSBkbyB7IGlmICgoZXhwcikgIT0gLTEpIGJyZWFrOyB9IHdoaWxlIChlcnJubyA9PSBFSU5UUikKKwordm9pZCBkb191c2JfYWRkKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqZGV2bmFtZSk7Cit2b2lkIGRvX3VzYl9kZWwoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpkZXZuYW1lKTsKK3ZvaWQgdXNiX2luZm8oTW9uaXRvciAqbW9uKTsKKworaW50IGdldF9wYXJhbV92YWx1ZShjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICpzdHIpOworaW50IGNoZWNrX3BhcmFtcyhjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpwYXJhbXMsIGNvbnN0IGNoYXIgKnN0cik7CisKK3ZvaWQgcmVnaXN0ZXJfZGV2aWNlcyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L3dhdGNoZG9nLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvc3lzZW11L3dhdGNoZG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5NTVjYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS9zeXNlbXUvd2F0Y2hkb2cuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogVmlydHVhbCBoYXJkd2FyZSB3YXRjaGRvZy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEJ5IFJpY2hhcmQgVy5NLiBKb25lcyAocmpvbmVzQHJlZGhhdC5jb20pLgorICovCisKKyNpZm5kZWYgUUVNVV9XQVRDSERPR19ICisjZGVmaW5lIFFFTVVfV0FUQ0hET0dfSAorCitleHRlcm4gdm9pZCB3ZHRfaTYzMDBlc2JfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHdkdF9pYjcwMF9pbml0KHZvaWQpOworCisvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFjdGlvbiBwYXJhbWV0ZXIuICovCisjZGVmaW5lIFdEVF9SRVNFVCAgICAgICAgMQkvKiBIYXJkIHJlc2V0LiAqLworI2RlZmluZSBXRFRfU0hVVERPV04gICAgIDIJLyogU2h1dGRvd24uICovCisjZGVmaW5lIFdEVF9QT1dFUk9GRiAgICAgMwkvKiBRdWl0LiAqLworI2RlZmluZSBXRFRfUEFVU0UgICAgICAgIDQJLyogUGF1c2UuICovCisjZGVmaW5lIFdEVF9ERUJVRyAgICAgICAgNQkvKiBQcmludHMgYSBtZXNzYWdlIGFuZCBjb250aW51ZXMgcnVubmluZy4gKi8KKyNkZWZpbmUgV0RUX05PTkUgICAgICAgICA2CS8qIERvIG5vdGhpbmcuICovCisKK3N0cnVjdCBXYXRjaGRvZ1RpbWVyTW9kZWwgeworICAgIFFMSVNUX0VOVFJZKFdhdGNoZG9nVGltZXJNb2RlbCkgZW50cnk7CisKKyAgICAvKiBTaG9ydCBuYW1lIG9mIHRoZSBkZXZpY2UgLSB1c2VkIHRvIHNlbGVjdCBpdCBvbiB0aGUgY29tbWFuZCBsaW5lLiAqLworICAgIGNvbnN0IGNoYXIgKndkdF9uYW1lOworICAgIC8qIExvbmdlciBkZXNjcmlwdGlvbiAoZWcuIG1hbnVmYWN0dXJlciBhbmQgZnVsbCBtb2RlbCBudW1iZXIpLiAqLworICAgIGNvbnN0IGNoYXIgKndkdF9kZXNjcmlwdGlvbjsKKworICAgIC8qIFRoaXMgY2FsbGJhY2sgc2hvdWxkIGNyZWF0ZS9yZWdpc3RlciB0aGUgZGV2aWNlLiAgSXQgaXMgY2FsbGVkCisgICAgICogaW5kaXJlY3RseSBmcm9tIGh3L3BjLmMgd2hlbiB0aGUgdmlydHVhbCBQQyBpcyBiZWluZyBzZXQgdXAuCisgICAgICovCisgICAgdm9pZCAoKndkdF9wY19pbml0KShQQ0lCdXMgKnBjaV9idXMpOworfTsKK3R5cGVkZWYgc3RydWN0IFdhdGNoZG9nVGltZXJNb2RlbCBXYXRjaGRvZ1RpbWVyTW9kZWw7CisKKy8qIGluIHZsLmMgKi8KK2V4dGVybiBXYXRjaGRvZ1RpbWVyTW9kZWwgKndhdGNoZG9nOworZXh0ZXJuIGludCB3YXRjaGRvZ19hY3Rpb247CisKKy8qIGluIGh3L3dhdGNoZG9nLmMgKi8KK2V4dGVybiBpbnQgc2VsZWN0X3dhdGNoZG9nKGNvbnN0IGNoYXIgKnApOworZXh0ZXJuIGludCBzZWxlY3Rfd2F0Y2hkb2dfYWN0aW9uKGNvbnN0IGNoYXIgKmFjdGlvbik7CitleHRlcm4gdm9pZCB3YXRjaGRvZ19hZGRfbW9kZWwoV2F0Y2hkb2dUaW1lck1vZGVsICptb2RlbCk7CitleHRlcm4gdm9pZCB3YXRjaGRvZ19wZXJmb3JtX2FjdGlvbih2b2lkKTsKK2V4dGVybiB2b2lkIHdhdGNoZG9nX3BjX2luaXQoUENJQnVzICpwY2lfYnVzKTsKK2V4dGVybiB2b2lkIHJlZ2lzdGVyX3dhdGNoZG9ncyh2b2lkKTsKKworI2VuZGlmIC8qIFFFTVVfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3RyYWNlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pbmNsdWRlL3RyYWNlLmgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW5jbHVkZS91aS9jb25zb2xlLmggYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvdWkvY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2luY2x1ZGUvdWkvY29uc29sZS5oCkBAIC0wLDAgKzEsNDc2IEBACisjaWZuZGVmIENPTlNPTEVfSAorI2RlZmluZSBDT05TT0xFX0gKKworI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxZW11L25vdGlmeS5oIgorCisvKiBrZXlib2FyZC9tb3VzZSBzdXBwb3J0ICovCisKKyNkZWZpbmUgTU9VU0VfRVZFTlRfTEJVVFRPTiAweDAxCisjZGVmaW5lIE1PVVNFX0VWRU5UX1JCVVRUT04gMHgwMgorI2RlZmluZSBNT1VTRV9FVkVOVF9NQlVUVE9OIDB4MDQKK2V4dGVybiBpbnQgbXVsdGl0b3VjaF9lbmFibGVkOworCisvKiBpZGVudGljYWwgdG8gdGhlIHBzLzIga2V5Ym9hcmQgYml0cyAqLworI2RlZmluZSBRRU1VX1NDUk9MTF9MT0NLX0xFRCAoMSA8PCAwKQorI2RlZmluZSBRRU1VX05VTV9MT0NLX0xFRCAgICAoMSA8PCAxKQorI2RlZmluZSBRRU1VX0NBUFNfTE9DS19MRUQgICAoMSA8PCAyKQorCisvKiBpbiBtcyAqLworI2lmZGVmIENPTkZJR19BTkRST0lECisjZGVmaW5lIEdVSV9SRUZSRVNIX0lOVEVSVkFMICgxMDAwLzYwKSAgLyogNjAgZnJhbWVzL3MgaXMgYmV0dGVyICovCisjZWxzZQorI2RlZmluZSBHVUlfUkVGUkVTSF9JTlRFUlZBTCAzMAorI2VuZGlmCisKK3R5cGVkZWYgaW50IFFFTVVEaXNwbGF5Q2xvc2VDYWxsYmFjayh2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X3NldF9kaXNwbGF5X2Nsb3NlX2hhbmRsZXIoUUVNVURpc3BsYXlDbG9zZUNhbGxiYWNrICpjYiwgdm9pZCAqb3BhcXVlKTsKK2ludCBxZW11X3J1bl9kaXNwbGF5X2Nsb3NlX2hhbmRsZXIodm9pZCk7CisKK3R5cGVkZWYgdm9pZCBRRU1VUHV0S0JERXZlbnQodm9pZCAqb3BhcXVlLCBpbnQga2V5Y29kZSk7Cit0eXBlZGVmIHZvaWQgUUVNVVB1dExFREV2ZW50KHZvaWQgKm9wYXF1ZSwgaW50IGxlZHN0YXRlKTsKK3R5cGVkZWYgdm9pZCBRRU1VUHV0TW91c2VFdmVudCh2b2lkICpvcGFxdWUsIGludCBkeCwgaW50IGR5LCBpbnQgZHosIGludCBidXR0b25zX3N0YXRlKTsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVVB1dE1vdXNlRW50cnkgeworICAgIFFFTVVQdXRNb3VzZUV2ZW50ICpxZW11X3B1dF9tb3VzZV9ldmVudDsKKyAgICB2b2lkICpxZW11X3B1dF9tb3VzZV9ldmVudF9vcGFxdWU7CisgICAgaW50IHFlbXVfcHV0X21vdXNlX2V2ZW50X2Fic29sdXRlOworICAgIGNoYXIgKnFlbXVfcHV0X21vdXNlX2V2ZW50X25hbWU7CisKKyAgICBpbnQgaW5kZXg7CisKKyAgICAvKiB1c2VkIGludGVybmFsbHkgYnkgcWVtdSBmb3IgaGFuZGxpbmcgbWljZSAqLworICAgIFFUQUlMUV9FTlRSWShRRU1VUHV0TW91c2VFbnRyeSkgbm9kZTsKK30gUUVNVVB1dE1vdXNlRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFFFTVVQdXRLQkRFbnRyeSB7CisgICAgUUVNVVB1dEtCREV2ZW50ICpwdXRfa2JkX2V2ZW50OworICAgIHZvaWQgKm9wYXF1ZTsKKworICAgIC8qIHVzZWQgaW50ZXJuYWxseSBieSBxZW11IGZvciBoYW5kbGluZyBrZXlib2FyZHMgKi8KKyAgICBRVEFJTFFfRU5UUlkoUUVNVVB1dEtCREVudHJ5KSBuZXh0OworfSBRRU1VUHV0S0JERW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFFFTVVQdXRMRURFbnRyeSB7CisgICAgUUVNVVB1dExFREV2ZW50ICpwdXRfbGVkOworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBRVEFJTFFfRU5UUlkoUUVNVVB1dExFREVudHJ5KSBuZXh0OworfSBRRU1VUHV0TEVERW50cnk7CisKK3ZvaWQgcWVtdV9hZGRfa2JkX2V2ZW50X2hhbmRsZXIoUUVNVVB1dEtCREV2ZW50ICpmdW5jLCB2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X3JlbW92ZV9rYmRfZXZlbnRfaGFuZGxlcihRRU1VUHV0S0JERXZlbnQgKmZ1bmMsIHZvaWQgKm9wYXF1ZSk7CitRRU1VUHV0TW91c2VFbnRyeSAqcWVtdV9hZGRfbW91c2VfZXZlbnRfaGFuZGxlcihRRU1VUHV0TW91c2VFdmVudCAqZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgaW50IGFic29sdXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHFlbXVfcmVtb3ZlX21vdXNlX2V2ZW50X2hhbmRsZXIoUUVNVVB1dE1vdXNlRW50cnkgKmVudHJ5KTsKK3ZvaWQgcWVtdV9hY3RpdmF0ZV9tb3VzZV9ldmVudF9oYW5kbGVyKFFFTVVQdXRNb3VzZUVudHJ5ICplbnRyeSk7CisKK1FFTVVQdXRMRURFbnRyeSAqcWVtdV9hZGRfbGVkX2V2ZW50X2hhbmRsZXIoUUVNVVB1dExFREV2ZW50ICpmdW5jLCB2b2lkICpvcGFxdWUpOwordm9pZCBxZW11X3JlbW92ZV9sZWRfZXZlbnRfaGFuZGxlcihRRU1VUHV0TEVERW50cnkgKmVudHJ5KTsKKwordm9pZCBrYmRfcHV0X2tleWNvZGUoaW50IGtleWNvZGUpOwordm9pZCBrYmRfcHV0X2xlZHN0YXRlKGludCBsZWRzdGF0ZSk7Cit2b2lkIGtiZF9tb3VzZV9ldmVudChpbnQgZHgsIGludCBkeSwgaW50IGR6LCBpbnQgYnV0dG9uc19zdGF0ZSk7CisKKy8qIERvZXMgdGhlIGN1cnJlbnQgbW91c2UgZ2VuZXJhdGUgYWJzb2x1dGUgZXZlbnRzICovCitpbnQga2JkX21vdXNlX2lzX2Fic29sdXRlKHZvaWQpOwordm9pZCBxZW11X2FkZF9tb3VzZV9tb2RlX2NoYW5nZV9ub3RpZmllcihOb3RpZmllciAqbm90aWZ5KTsKK3ZvaWQgcWVtdV9yZW1vdmVfbW91c2VfbW9kZV9jaGFuZ2Vfbm90aWZpZXIoTm90aWZpZXIgKm5vdGlmeSk7CisKKy8qIE9mIGFsbCB0aGUgbWljZSwgaXMgdGhlcmUgb25lIHRoYXQgZ2VuZXJhdGVzIGFic29sdXRlIGV2ZW50cyAqLworaW50IGtiZF9tb3VzZV9oYXNfYWJzb2x1dGUodm9pZCk7CisKK3N0cnVjdCBNb3VzZVRyYW5zZm9ybUluZm8geworICAgIC8qIFRvdWNoc2NyZWVuIHJlc29sdXRpb24gKi8KKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKKyAgICAvKiBDYWxpYnJhdGlvbiB2YWx1ZXMgYXMgdXNlZC9nZW5lcmF0ZWQgYnkgdHNsaWIgKi8KKyAgICBpbnQgYVs3XTsKK307CisKK3ZvaWQgZG9faW5mb19taWNlX3ByaW50KE1vbml0b3IgKm1vbiwgY29uc3QgUU9iamVjdCAqZGF0YSk7Cit2b2lkIGRvX2luZm9fbWljZShNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSk7Cit2b2lkIGRvX21vdXNlX3NldChNb25pdG9yICptb24sIGNvbnN0IFFEaWN0ICpxZGljdCk7CisKKy8qIGtleXN5bSBpcyBhIHVuaWNvZGUgY29kZSBleGNlcHQgZm9yIHNwZWNpYWwga2V5cyAoc2VlIFFFTVVfS0VZX3h4eAorICAgY29uc3RhbnRzKSAqLworI2RlZmluZSBRRU1VX0tFWV9FU0MxKGMpICgoYykgfCAweGUxMDApCisjZGVmaW5lIFFFTVVfS0VZX0JBQ0tTUEFDRSAgMHgwMDdmCisjZGVmaW5lIFFFTVVfS0VZX1VQICAgICAgICAgUUVNVV9LRVlfRVNDMSgnQScpCisjZGVmaW5lIFFFTVVfS0VZX0RPV04gICAgICAgUUVNVV9LRVlfRVNDMSgnQicpCisjZGVmaW5lIFFFTVVfS0VZX1JJR0hUICAgICAgUUVNVV9LRVlfRVNDMSgnQycpCisjZGVmaW5lIFFFTVVfS0VZX0xFRlQgICAgICAgUUVNVV9LRVlfRVNDMSgnRCcpCisjZGVmaW5lIFFFTVVfS0VZX0hPTUUgICAgICAgUUVNVV9LRVlfRVNDMSgxKQorI2RlZmluZSBRRU1VX0tFWV9FTkQgICAgICAgIFFFTVVfS0VZX0VTQzEoNCkKKyNkZWZpbmUgUUVNVV9LRVlfUEFHRVVQICAgICBRRU1VX0tFWV9FU0MxKDUpCisjZGVmaW5lIFFFTVVfS0VZX1BBR0VET1dOICAgUUVNVV9LRVlfRVNDMSg2KQorI2RlZmluZSBRRU1VX0tFWV9ERUxFVEUgICAgIFFFTVVfS0VZX0VTQzEoMykKKworI2RlZmluZSBRRU1VX0tFWV9DVFJMX1VQICAgICAgICAgMHhlNDAwCisjZGVmaW5lIFFFTVVfS0VZX0NUUkxfRE9XTiAgICAgICAweGU0MDEKKyNkZWZpbmUgUUVNVV9LRVlfQ1RSTF9MRUZUICAgICAgIDB4ZTQwMgorI2RlZmluZSBRRU1VX0tFWV9DVFJMX1JJR0hUICAgICAgMHhlNDAzCisjZGVmaW5lIFFFTVVfS0VZX0NUUkxfSE9NRSAgICAgICAweGU0MDQKKyNkZWZpbmUgUUVNVV9LRVlfQ1RSTF9FTkQgICAgICAgIDB4ZTQwNQorI2RlZmluZSBRRU1VX0tFWV9DVFJMX1BBR0VVUCAgICAgMHhlNDA2CisjZGVmaW5lIFFFTVVfS0VZX0NUUkxfUEFHRURPV04gICAweGU0MDcKKwordm9pZCBrYmRfcHV0X2tleXN5bShpbnQga2V5c3ltKTsKKworLyogY29uc29sZXMgKi8KKworI2RlZmluZSBRRU1VX0JJR19FTkRJQU5fRkxBRyAgICAweDAxCisjZGVmaW5lIFFFTVVfQUxMT0NBVEVEX0ZMQUcgICAgIDB4MDIKKyNkZWZpbmUgUUVNVV9SRUFMUElYRUxTX0ZMQUcgICAgMHgwNAorCitzdHJ1Y3QgUGl4ZWxGb3JtYXQgeworICAgIHVpbnQ4X3QgYml0c19wZXJfcGl4ZWw7CisgICAgdWludDhfdCBieXRlc19wZXJfcGl4ZWw7CisgICAgdWludDhfdCBkZXB0aDsgLyogY29sb3IgZGVwdGggaW4gYml0cyAqLworICAgIHVpbnQzMl90IHJtYXNrLCBnbWFzaywgYm1hc2ssIGFtYXNrOworICAgIHVpbnQ4X3QgcnNoaWZ0LCBnc2hpZnQsIGJzaGlmdCwgYXNoaWZ0OworICAgIHVpbnQ4X3Qgcm1heCwgZ21heCwgYm1heCwgYW1heDsKKyAgICB1aW50OF90IHJiaXRzLCBnYml0cywgYmJpdHMsIGFiaXRzOworfTsKKworc3RydWN0IERpc3BsYXlTdXJmYWNlIHsKKyAgICB1aW50OF90IGZsYWdzOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBsaW5lc2l6ZTsgICAgICAgIC8qIGJ5dGVzIHBlciBsaW5lICovCisgICAgdWludDhfdCAqZGF0YTsKKworICAgIHN0cnVjdCBQaXhlbEZvcm1hdCBwZjsKK307CisKKy8qIGN1cnNvciBkYXRhIGZvcm1hdCBpcyAzMmJpdCBSR0JBICovCit0eXBlZGVmIHN0cnVjdCBRRU1VQ3Vyc29yIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBob3RfeCwgaG90X3k7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWZjb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIGRhdGFbXTsKK30gUUVNVUN1cnNvcjsKKworUUVNVUN1cnNvciAqY3Vyc29yX2FsbG9jKGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit2b2lkIGN1cnNvcl9nZXQoUUVNVUN1cnNvciAqYyk7Cit2b2lkIGN1cnNvcl9wdXQoUUVNVUN1cnNvciAqYyk7CitRRU1VQ3Vyc29yICpjdXJzb3JfYnVpbHRpbl9oaWRkZW4odm9pZCk7CitRRU1VQ3Vyc29yICpjdXJzb3JfYnVpbHRpbl9sZWZ0X3B0cih2b2lkKTsKK3ZvaWQgY3Vyc29yX3ByaW50X2FzY2lpX2FydChRRU1VQ3Vyc29yICpjLCBjb25zdCBjaGFyICpwcmVmaXgpOworaW50IGN1cnNvcl9nZXRfbW9ub19icGwoUUVNVUN1cnNvciAqYyk7Cit2b2lkIGN1cnNvcl9zZXRfbW9ubyhRRU1VQ3Vyc29yICpjLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9yZWdyb3VuZCwgdWludDMyX3QgYmFja2dyb3VuZCwgdWludDhfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNwYXJlbnQsIHVpbnQ4X3QgKm1hc2spOwordm9pZCBjdXJzb3JfZ2V0X21vbm9faW1hZ2UoUUVNVUN1cnNvciAqYywgaW50IGZvcmVncm91bmQsIHVpbnQ4X3QgKm1hc2spOwordm9pZCBjdXJzb3JfZ2V0X21vbm9fbWFzayhRRU1VQ3Vyc29yICpjLCBpbnQgdHJhbnNwYXJlbnQsIHVpbnQ4X3QgKm1hc2spOworCitzdHJ1Y3QgRGlzcGxheUNoYW5nZUxpc3RlbmVyIHsKKyAgICBpbnQgaWRsZTsKKyAgICB1aW50NjRfdCBndWlfdGltZXJfaW50ZXJ2YWw7CisKKyAgICB2b2lkICgqZHB5X3VwZGF0ZSkoc3RydWN0IERpc3BsYXlTdGF0ZSAqcywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOworICAgIHZvaWQgKCpkcHlfcmVzaXplKShzdHJ1Y3QgRGlzcGxheVN0YXRlICpzKTsKKyAgICB2b2lkICgqZHB5X3NldGRhdGEpKHN0cnVjdCBEaXNwbGF5U3RhdGUgKnMpOworICAgIHZvaWQgKCpkcHlfcmVmcmVzaCkoc3RydWN0IERpc3BsYXlTdGF0ZSAqcyk7CisgICAgdm9pZCAoKmRweV9jb3B5KShzdHJ1Y3QgRGlzcGxheVN0YXRlICpzLCBpbnQgc3JjX3gsIGludCBzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpOworICAgIHZvaWQgKCpkcHlfZmlsbCkoc3RydWN0IERpc3BsYXlTdGF0ZSAqcywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCB1aW50MzJfdCBjKTsKKyAgICB2b2lkICgqZHB5X3RleHRfY3Vyc29yKShzdHJ1Y3QgRGlzcGxheVN0YXRlICpzLCBpbnQgeCwgaW50IHkpOworI2lmZGVmIENPTkZJR19HTEVTMgorICAgIHZvaWQgKCpkcHlfdXBkYXRlY2FwdGlvbikodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0tJTk5JTkcKKyAgICB2b2lkICgqZHB5X2VuYWJsZXpvb20pKHN0cnVjdCBEaXNwbGF5U3RhdGUgKnMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgdm9pZCAoKmRweV9nZXRyZXNvbHV0aW9uKShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCk7CisjZW5kaWYKKyAgICBzdHJ1Y3QgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpuZXh0OworfTsKKworI2lmZGVmIENPTkZJR19BTkRST0lECisvKiBUaGUgcHJvYmxlbSB3aXRoIERpc3BsYXlDaGFuZ2VMaXN0ZW5lciBpcyB0aGF0IHRoZSBjYWxsYmFja3MgY2FuJ3QKKyAqIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQgRGlzcGxheUNoYW5nZUxpc3RlbmVycy4gSW5zdGVhZCBvZgorICogbW9kaWZ5aW5nIHRoZSB0eXBlIGFib3ZlLCB3aGljaCBpcyBnb2luZyB0byBnZW5lcmF0ZSBjb25mbGljdHMgd2l0aAorICogdXBzdHJlYW0gY2hhbmdlcywgd2UgZGVmaW5lIG91ciBvd24gbGlzdGVuZXIgdHlwZSBoZXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBEaXNwbGF5VXBkYXRlTGlzdGVuZXIgeworICAgIHZvaWQqIG9wYXF1ZTsKKyAgICB2b2lkICgqZHB5X3VwZGF0ZSkodm9pZCogb3BhcXVlLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCk7CisgICAgc3RydWN0IERpc3BsYXlVcGRhdGVMaXN0ZW5lciAqbmV4dDsKK30gRGlzcGxheVVwZGF0ZUxpc3RlbmVyOworI2VuZGlmCisKK3N0cnVjdCBEaXNwbGF5QWxsb2NhdG9yIHsKKyAgICBEaXNwbGF5U3VyZmFjZSogKCpjcmVhdGVfZGlzcGxheXN1cmZhY2UpKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgRGlzcGxheVN1cmZhY2UqICgqcmVzaXplX2Rpc3BsYXlzdXJmYWNlKShEaXNwbGF5U3VyZmFjZSAqc3VyZmFjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICB2b2lkICgqZnJlZV9kaXNwbGF5c3VyZmFjZSkoRGlzcGxheVN1cmZhY2UgKnN1cmZhY2UpOworfTsKKworc3RydWN0IERpc3BsYXlTdGF0ZSB7CisgICAgc3RydWN0IERpc3BsYXlTdXJmYWNlICpzdXJmYWNlOworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBzdHJ1Y3QgUUVNVVRpbWVyICpndWlfdGltZXI7CisKKyAgICBzdHJ1Y3QgRGlzcGxheUFsbG9jYXRvciogYWxsb2NhdG9yOworICAgIHN0cnVjdCBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIqIGxpc3RlbmVyczsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIHN0cnVjdCBEaXNwbGF5VXBkYXRlTGlzdGVuZXIqIHVwZGF0ZV9saXN0ZW5lcnM7CisjZW5kaWYKKyAgICB2b2lkICgqbW91c2Vfc2V0KShpbnQgeCwgaW50IHksIGludCBvbik7CisgICAgdm9pZCAoKmN1cnNvcl9kZWZpbmUpKFFFTVVDdXJzb3IgKmN1cnNvcik7CisKKyAgICBzdHJ1Y3QgRGlzcGxheVN0YXRlICpuZXh0OworfTsKKwordm9pZCB2Z2FfZmlsbF9yZWN0IChEaXNwbGF5U3RhdGUgKmRzLCBpbnQgcG9zeCwgaW50IHBvc3ksCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50MzJfdCBjb2xvcik7Cit2b2lkIHJlZ2lzdGVyX2Rpc3BsYXlzdGF0ZShEaXNwbGF5U3RhdGUgKmRzKTsKK0Rpc3BsYXlTdGF0ZSAqZ2V0X2Rpc3BsYXlzdGF0ZSh2b2lkKTsKK0Rpc3BsYXlTdXJmYWNlKiBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZV9mcm9tKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgdWludDhfdCAqZGF0YSk7Cit2b2lkIHFlbXVfYWxsb2NfZGlzcGxheShEaXNwbGF5U3VyZmFjZSAqc3VyZmFjZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBQaXhlbEZvcm1hdCBwZiwgaW50IG5ld2ZsYWdzKTsKK1BpeGVsRm9ybWF0IHFlbXVfZGlmZmVyZW50X2VuZGlhbm5lc3NfcGl4ZWxmb3JtYXQoaW50IGJwcCk7CitQaXhlbEZvcm1hdCBxZW11X2RlZmF1bHRfcGl4ZWxmb3JtYXQoaW50IGJwcCk7CisKK0Rpc3BsYXlBbGxvY2F0b3IgKnJlZ2lzdGVyX2Rpc3BsYXlhbGxvY2F0b3IoRGlzcGxheVN0YXRlICpkcywgRGlzcGxheUFsbG9jYXRvciAqZGEpOworCitzdGF0aWMgaW5saW5lIERpc3BsYXlTdXJmYWNlKiBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIGRzLT5hbGxvY2F0b3ItPmNyZWF0ZV9kaXNwbGF5c3VyZmFjZSh3aWR0aCwgaGVpZ2h0KTsKK30KKworc3RhdGljIGlubGluZSBEaXNwbGF5U3VyZmFjZSogcWVtdV9yZXNpemVfZGlzcGxheXN1cmZhY2UoRGlzcGxheVN0YXRlICpkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIHJldHVybiBkcy0+YWxsb2NhdG9yLT5yZXNpemVfZGlzcGxheXN1cmZhY2UoZHMtPnN1cmZhY2UsIHdpZHRoLCBoZWlnaHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVtdV9mcmVlX2Rpc3BsYXlzdXJmYWNlKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgZHMtPmFsbG9jYXRvci0+ZnJlZV9kaXNwbGF5c3VyZmFjZShkcy0+c3VyZmFjZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3N1cmZhY2VfYmdyKERpc3BsYXlTdXJmYWNlICpzdXJmYWNlKQoreworICAgIGlmIChzdXJmYWNlLT5wZi5iaXRzX3Blcl9waXhlbCA9PSAzMiAmJiBzdXJmYWNlLT5wZi5yc2hpZnQgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfYnVmZmVyX3NoYXJlZChEaXNwbGF5U3VyZmFjZSAqc3VyZmFjZSkKK3sKKyAgICByZXR1cm4gKCEoc3VyZmFjZS0+ZmxhZ3MgJiBRRU1VX0FMTE9DQVRFRF9GTEFHKSAmJgorICAgICAgICAgICAgIShzdXJmYWNlLT5mbGFncyAmIFFFTVVfUkVBTFBJWEVMU19GTEFHKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9kaXNwbGF5Y2hhbmdlbGlzdGVuZXIoRGlzcGxheVN0YXRlICpkcywgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2wpCit7CisgICAgZGNsLT5uZXh0ID0gZHMtPmxpc3RlbmVyczsKKyAgICBkcy0+bGlzdGVuZXJzID0gZGNsOworfQorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl9kaXNwbGF5dXBkYXRlbGlzdGVuZXIoRGlzcGxheVN0YXRlICpkcywgRGlzcGxheVVwZGF0ZUxpc3RlbmVyICpkdWwpCit7CisgICAgZHVsLT5uZXh0ID0gZHMtPnVwZGF0ZV9saXN0ZW5lcnM7CisgICAgZHMtPnVwZGF0ZV9saXN0ZW5lcnMgPSBkdWw7Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl9kaXNwbGF5dXBkYXRlbGlzdGVuZXIoRGlzcGxheVN0YXRlICpkcywgRGlzcGxheVVwZGF0ZUxpc3RlbmVyICpkdWwpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcHlfdXBkYXRlKERpc3BsYXlTdGF0ZSAqcywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgc3RydWN0IERpc3BsYXlDaGFuZ2VMaXN0ZW5lciAqZGNsID0gcy0+bGlzdGVuZXJzOworICAgIHdoaWxlIChkY2wgIT0gTlVMTCkgeworICAgICAgICBkY2wtPmRweV91cGRhdGUocywgeCwgeSwgdywgaCk7CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICBEaXNwbGF5VXBkYXRlTGlzdGVuZXIqIGR1bCA9IHMtPnVwZGF0ZV9saXN0ZW5lcnM7CisgICAgd2hpbGUgKGR1bCAhPSBOVUxMKSB7CisgICAgICAgIGR1bC0+ZHB5X3VwZGF0ZShkdWwtPm9wYXF1ZSwgeCwgeSwgdywgaCk7CisgICAgICAgIGR1bCA9IGR1bC0+bmV4dDsKKyAgICB9CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19HTEVTMgorc3RhdGljIGlubGluZSB2b2lkIGRweV91cGRhdGVjYXB0aW9uKERpc3BsYXlTdGF0ZSAqcykKK3sKKyAgICBzdHJ1Y3QgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2wgPSBzLT5saXN0ZW5lcnM7CisgICAgd2hpbGUgKGRjbCAhPSBOVUxMKSB7CisgICAgICAgIGlmKGRjbC0+ZHB5X3VwZGF0ZWNhcHRpb24gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgZGNsLT5kcHlfdXBkYXRlY2FwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGRweV9yZXNpemUoRGlzcGxheVN0YXRlICpzKQoreworICAgIHN0cnVjdCBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgKmRjbCA9IHMtPmxpc3RlbmVyczsKKyAgICB3aGlsZSAoZGNsICE9IE5VTEwpIHsKKyAgICAgICAgZGNsLT5kcHlfcmVzaXplKHMpOworICAgICAgICBkY2wgPSBkY2wtPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHB5X3NldGRhdGEoRGlzcGxheVN0YXRlICpzKQoreworICAgIHN0cnVjdCBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgKmRjbCA9IHMtPmxpc3RlbmVyczsKKyAgICB3aGlsZSAoZGNsICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRjbC0+ZHB5X3NldGRhdGEpIGRjbC0+ZHB5X3NldGRhdGEocyk7CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcHlfcmVmcmVzaChEaXNwbGF5U3RhdGUgKnMpCit7CisgICAgc3RydWN0IERpc3BsYXlDaGFuZ2VMaXN0ZW5lciAqZGNsID0gcy0+bGlzdGVuZXJzOworICAgIHdoaWxlIChkY2wgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGNsLT5kcHlfcmVmcmVzaCkgZGNsLT5kcHlfcmVmcmVzaChzKTsKKyAgICAgICAgZGNsID0gZGNsLT5uZXh0OworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRweV9jb3B5KHN0cnVjdCBEaXNwbGF5U3RhdGUgKnMsIGludCBzcmNfeCwgaW50IHNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3gsIGludCBkc3RfeSwgaW50IHcsIGludCBoKSB7CisgICAgc3RydWN0IERpc3BsYXlDaGFuZ2VMaXN0ZW5lciAqZGNsID0gcy0+bGlzdGVuZXJzOworICAgIHdoaWxlIChkY2wgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGNsLT5kcHlfY29weSkKKyAgICAgICAgICAgIGRjbC0+ZHB5X2NvcHkocywgc3JjX3gsIHNyY195LCBkc3RfeCwgZHN0X3ksIHcsIGgpOworICAgICAgICBlbHNlIC8qIFRPRE8gKi8KKyAgICAgICAgICAgIGRjbC0+ZHB5X3VwZGF0ZShzLCBkc3RfeCwgZHN0X3ksIHcsIGgpOworICAgICAgICBkY2wgPSBkY2wtPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHB5X2ZpbGwoc3RydWN0IERpc3BsYXlTdGF0ZSAqcywgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIHVpbnQzMl90IGMpIHsKKyAgICBzdHJ1Y3QgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2wgPSBzLT5saXN0ZW5lcnM7CisgICAgd2hpbGUgKGRjbCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkY2wtPmRweV9maWxsKSBkY2wtPmRweV9maWxsKHMsIHgsIHksIHcsIGgsIGMpOworICAgICAgICBkY2wgPSBkY2wtPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHB5X2N1cnNvcihzdHJ1Y3QgRGlzcGxheVN0YXRlICpzLCBpbnQgeCwgaW50IHkpIHsKKyAgICBzdHJ1Y3QgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2wgPSBzLT5saXN0ZW5lcnM7CisgICAgd2hpbGUgKGRjbCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkY2wtPmRweV90ZXh0X2N1cnNvcikgZGNsLT5kcHlfdGV4dF9jdXJzb3IocywgeCwgeSk7CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9Cit9CisKKyNpZmRlZiBDT05GSUdfU0tJTk5JTkcKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcHlfZW5hYmxlem9vbShzdHJ1Y3QgRGlzcGxheVN0YXRlICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgc3RydWN0IERpc3BsYXlDaGFuZ2VMaXN0ZW5lciAqZGNsID0gcy0+bGlzdGVuZXJzOworICAgIHdoaWxlIChkY2wgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGNsLT5kcHlfZW5hYmxlem9vbSkgZGNsLT5kcHlfZW5hYmxlem9vbShzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZGNsID0gZGNsLT5uZXh0OworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGRweV9nZXRyZXNvbHV0aW9uKHN0cnVjdCBEaXNwbGF5U3RhdGUgKnMsIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KQoreworICAgIHN0cnVjdCBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgKmRjbCA9IHMtPmxpc3RlbmVyczsKKyAgICB3aGlsZSAoZGNsICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRjbC0+ZHB5X2dldHJlc29sdXRpb24pIGRjbC0+ZHB5X2dldHJlc29sdXRpb24od2lkdGgsIGhlaWdodCk7CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgZHNfZ2V0X2xpbmVzaXplKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgcmV0dXJuIGRzLT5zdXJmYWNlLT5saW5lc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90KiBkc19nZXRfZGF0YShEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIHJldHVybiBkcy0+c3VyZmFjZS0+ZGF0YTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHNfZ2V0X3dpZHRoKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgcmV0dXJuIGRzLT5zdXJmYWNlLT53aWR0aDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHNfZ2V0X2hlaWdodChEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIHJldHVybiBkcy0+c3VyZmFjZS0+aGVpZ2h0OworfQorCitzdGF0aWMgaW5saW5lIGludCBkc19nZXRfYml0c19wZXJfcGl4ZWwoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICByZXR1cm4gZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsOworfQorCitzdGF0aWMgaW5saW5lIGludCBkc19nZXRfYnl0ZXNfcGVyX3BpeGVsKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgcmV0dXJuIGRzLT5zdXJmYWNlLT5wZi5ieXRlc19wZXJfcGl4ZWw7Cit9CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBjb25zb2xlX2NoX3Q7CitzdGF0aWMgaW5saW5lIHZvaWQgY29uc29sZV93cml0ZV9jaChjb25zb2xlX2NoX3QgKmRlc3QsIHVpbnQzMl90IGNoKQoreworICAgIGlmICghKGNoICYgMHhmZikpCisgICAgICAgIGNoIHw9ICcgJzsKKyAgICAqZGVzdCA9IGNoOworfQorCit0eXBlZGVmIHZvaWQgKCp2Z2FfaHdfdXBkYXRlX3B0cikodm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKnZnYV9od19pbnZhbGlkYXRlX3B0cikodm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKnZnYV9od19zY3JlZW5fZHVtcF9wdHIpKHZvaWQgKiwgY29uc3QgY2hhciAqKTsKK3R5cGVkZWYgdm9pZCAoKnZnYV9od190ZXh0X3VwZGF0ZV9wdHIpKHZvaWQgKiwgY29uc29sZV9jaF90ICopOworCitEaXNwbGF5U3RhdGUgKmdyYXBoaWNfY29uc29sZV9pbml0KHZnYV9od191cGRhdGVfcHRyIHVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X2ludmFsaWRhdGVfcHRyIGludmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnYV9od19zY3JlZW5fZHVtcF9wdHIgc2NyZWVuX2R1bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnYV9od190ZXh0X3VwZGF0ZV9wdHIgdGV4dF91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisKK3ZvaWQgdmdhX2h3X3VwZGF0ZSh2b2lkKTsKK3ZvaWQgdmdhX2h3X2ludmFsaWRhdGUodm9pZCk7Cit2b2lkIHZnYV9od19zY3JlZW5fZHVtcChjb25zdCBjaGFyICpmaWxlbmFtZSk7Cit2b2lkIHZnYV9od190ZXh0X3VwZGF0ZShjb25zb2xlX2NoX3QgKmNoYXJkYXRhKTsKKworaW50IGlzX2dyYXBoaWNfY29uc29sZSh2b2lkKTsKK2ludCBpc19maXhlZHNpemVfY29uc29sZSh2b2lkKTsKK0NoYXJEcml2ZXJTdGF0ZSAqdGV4dF9jb25zb2xlX2luaXQoUWVtdU9wdHMgKm9wdHMpOworQ2hhckRyaXZlclN0YXRlKiB0ZXh0X2NvbnNvbGVfaW5pdF9jb21wYXQoY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IGNoYXIgKnApOwordm9pZCB0ZXh0X2NvbnNvbGVzX3NldF9kaXNwbGF5KERpc3BsYXlTdGF0ZSAqZHMpOwordm9pZCBjb25zb2xlX3NlbGVjdCh1bnNpZ25lZCBpbnQgaW5kZXgpOwordm9pZCBjb25zb2xlX2NvbG9yX2luaXQoRGlzcGxheVN0YXRlICpkcyk7Cit2b2lkIHFlbXVfY29uc29sZV9yZXNpemUoRGlzcGxheVN0YXRlICpkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgcWVtdV9jb25zb2xlX2NvcHkoRGlzcGxheVN0YXRlICpkcywgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpOworCisvKiBzZGwuYyAqLwordm9pZCBzZGxfZGlzcGxheV9pbml0KERpc3BsYXlTdGF0ZSAqZHMsIGludCBmdWxsX3NjcmVlbiwgaW50IG5vX2ZyYW1lKTsKKworLyogY29jb2EubSAqLwordm9pZCBjb2NvYV9kaXNwbGF5X2luaXQoRGlzcGxheVN0YXRlICpkcywgaW50IGZ1bGxfc2NyZWVuKTsKKworLyogdm5jLmMgKi8KK3ZvaWQgdm5jX2Rpc3BsYXlfaW5pdChEaXNwbGF5U3RhdGUgKmRzKTsKK3ZvaWQgdm5jX2Rpc3BsYXlfY2xvc2UoRGlzcGxheVN0YXRlICpkcyk7CitpbnQgdm5jX2Rpc3BsYXlfb3BlbihEaXNwbGF5U3RhdGUgKmRzLCBjb25zdCBjaGFyICpkaXNwbGF5KTsKK2ludCB2bmNfZGlzcGxheV9wYXNzd29yZChEaXNwbGF5U3RhdGUgKmRzLCBjb25zdCBjaGFyICpwYXNzd29yZCk7Cit2b2lkIGRvX2luZm9fdm5jKE1vbml0b3IgKm1vbik7CitjaGFyICp2bmNfZGlzcGxheV9sb2NhbF9hZGRyKERpc3BsYXlTdGF0ZSAqZHMpOworCisvKiBjdXJzZXMuYyAqLwordm9pZCBjdXJzZXNfZGlzcGxheV9pbml0KERpc3BsYXlTdGF0ZSAqZHMsIGludCBmdWxsX3NjcmVlbik7CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAordm9pZCBhbmRyb2lkX2Rpc3BsYXlfcmVzZXQoRGlzcGxheVN0YXRlKiBkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0c3BwKTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvaW9oYW5kbGVyLmMgYi9hbmRyb2lkL3FlbXUxL2lvaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNWNiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL2lvaGFuZGxlci5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IgLSBtYW5hZ2luZyBJL08gaGFuZGxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgSU9IYW5kbGVyUmVjb3JkIHsKKyAgICBpbnQgZmQ7CisgICAgSU9DYW5SZWFkSGFuZGxlciAqZmRfcmVhZF9wb2xsOworICAgIElPSGFuZGxlciAqZmRfcmVhZDsKKyAgICBJT0hhbmRsZXIgKmZkX3dyaXRlOworICAgIGludCBkZWxldGVkOworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBRTElTVF9FTlRSWShJT0hhbmRsZXJSZWNvcmQpIG5leHQ7Cit9IElPSGFuZGxlclJlY29yZDsKKworc3RhdGljIFFMSVNUX0hFQUQoLCBJT0hhbmRsZXJSZWNvcmQpIGlvX2hhbmRsZXJzID0KKyAgICBRTElTVF9IRUFEX0lOSVRJQUxJWkVSKGlvX2hhbmRsZXJzKTsKKworCisvKiBYWFg6IGZkX3JlYWRfcG9sbCBzaG91bGQgYmUgc3VwcHJlc3NlZCwgYnV0IGFuIEFQSSBjaGFuZ2UgaXMKKyAgIG5lY2Vzc2FyeSBpbiB0aGUgY2hhcmFjdGVyIGRldmljZXMgdG8gc3VwcHJlc3MgZmRfY2FuX3JlYWQoKS4gKi8KK2ludCBxZW11X3NldF9mZF9oYW5kbGVyMihpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgSU9DYW5SZWFkSGFuZGxlciAqZmRfcmVhZF9wb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgIElPSGFuZGxlciAqZmRfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmZkX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBJT0hhbmRsZXJSZWNvcmQgKmlvaDsKKworICAgIGlmICghZmRfcmVhZCAmJiAhZmRfd3JpdGUpIHsKKyAgICAgICAgUUxJU1RfRk9SRUFDSChpb2gsICZpb19oYW5kbGVycywgbmV4dCkgeworICAgICAgICAgICAgaWYgKGlvaC0+ZmQgPT0gZmQpIHsKKyAgICAgICAgICAgICAgICBpb2gtPmRlbGV0ZWQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUUxJU1RfRk9SRUFDSChpb2gsICZpb19oYW5kbGVycywgbmV4dCkgeworICAgICAgICAgICAgaWYgKGlvaC0+ZmQgPT0gZmQpCisgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgICAgICBpb2ggPSBnX21hbGxvYzAoc2l6ZW9mKElPSGFuZGxlclJlY29yZCkpOworICAgICAgICBRTElTVF9JTlNFUlRfSEVBRCgmaW9faGFuZGxlcnMsIGlvaCwgbmV4dCk7CisgICAgZm91bmQ6CisgICAgICAgIGlvaC0+ZmQgPSBmZDsKKyAgICAgICAgaW9oLT5mZF9yZWFkX3BvbGwgPSBmZF9yZWFkX3BvbGw7CisgICAgICAgIGlvaC0+ZmRfcmVhZCA9IGZkX3JlYWQ7CisgICAgICAgIGlvaC0+ZmRfd3JpdGUgPSBmZF93cml0ZTsKKyAgICAgICAgaW9oLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgICAgIGlvaC0+ZGVsZXRlZCA9IDA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgcWVtdV9zZXRfZmRfaGFuZGxlcihpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmZkX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBJT0hhbmRsZXIgKmZkX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIHJldHVybiBxZW11X3NldF9mZF9oYW5kbGVyMihmZCwgTlVMTCwgZmRfcmVhZCwgZmRfd3JpdGUsIG9wYXF1ZSk7Cit9CisKK3ZvaWQgcWVtdV9pb2hhbmRsZXJfZmlsbChpbnQgKnBuZmRzLCBmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcykKK3sKKyAgICBJT0hhbmRsZXJSZWNvcmQgKmlvaDsKKworICAgIFFMSVNUX0ZPUkVBQ0goaW9oLCAmaW9faGFuZGxlcnMsIG5leHQpIHsKKyAgICAgICAgaWYgKGlvaC0+ZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaW9oLT5mZF9yZWFkICYmCisgICAgICAgICAgICAoIWlvaC0+ZmRfcmVhZF9wb2xsIHx8CisgICAgICAgICAgICAgaW9oLT5mZF9yZWFkX3BvbGwoaW9oLT5vcGFxdWUpICE9IDApKSB7CisgICAgICAgICAgICBGRF9TRVQoaW9oLT5mZCwgcmVhZGZkcyk7CisgICAgICAgICAgICBpZiAoaW9oLT5mZCA+ICpwbmZkcykKKyAgICAgICAgICAgICAgICAqcG5mZHMgPSBpb2gtPmZkOworICAgICAgICB9CisgICAgICAgIGlmIChpb2gtPmZkX3dyaXRlKSB7CisgICAgICAgICAgICBGRF9TRVQoaW9oLT5mZCwgd3JpdGVmZHMpOworICAgICAgICAgICAgaWYgKGlvaC0+ZmQgPiAqcG5mZHMpCisgICAgICAgICAgICAgICAgKnBuZmRzID0gaW9oLT5mZDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBxZW11X2lvaGFuZGxlcl9wb2xsKGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICp4ZmRzLCBpbnQgcmV0KQoreworICAgIGlmIChyZXQgPiAwKSB7CisgICAgICAgIElPSGFuZGxlclJlY29yZCAqcGlvaCwgKmlvaDsKKworICAgICAgICBRTElTVF9GT1JFQUNIX1NBRkUoaW9oLCAmaW9faGFuZGxlcnMsIG5leHQsIHBpb2gpIHsKKyAgICAgICAgICAgIGlmICghaW9oLT5kZWxldGVkICYmIGlvaC0+ZmRfcmVhZCAmJiBGRF9JU1NFVChpb2gtPmZkLCByZWFkZmRzKSkgeworICAgICAgICAgICAgICAgIGlvaC0+ZmRfcmVhZChpb2gtPm9wYXF1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlvaC0+ZGVsZXRlZCAmJiBpb2gtPmZkX3dyaXRlICYmIEZEX0lTU0VUKGlvaC0+ZmQsIHdyaXRlZmRzKSkgeworICAgICAgICAgICAgICAgIGlvaC0+ZmRfd3JpdGUoaW9oLT5vcGFxdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEbyB0aGlzIGxhc3QgaW4gY2FzZSByZWFkL3dyaXRlIGhhbmRsZXJzIG1hcmtlZCBpdCBmb3IgZGVsZXRpb24gKi8KKyAgICAgICAgICAgIGlmIChpb2gtPmRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBRTElTVF9SRU1PVkUoaW9oLCBuZXh0KTsKKyAgICAgICAgICAgICAgICBnX2ZyZWUoaW9oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyogcmVhcGluZyBvZiB6b21iaWVzLiAgcmlnaHQgbm93IHdlJ3JlIG5vdCBwYXNzaW5nIHRoZSBzdGF0dXMgdG8KKyAgIGFueW9uZSwgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGFkZCBhIGNhbGxiYWNrLiAgKi8KKyNpZm5kZWYgX1dJTjMyCit0eXBlZGVmIHN0cnVjdCBDaGlsZFByb2Nlc3NSZWNvcmQgeworICAgIGludCBwaWQ7CisgICAgUUxJU1RfRU5UUlkoQ2hpbGRQcm9jZXNzUmVjb3JkKSBuZXh0OworfSBDaGlsZFByb2Nlc3NSZWNvcmQ7CisKK3N0YXRpYyBRTElTVF9IRUFEKCwgQ2hpbGRQcm9jZXNzUmVjb3JkKSBjaGlsZF93YXRjaGVzID0KKyAgICBRTElTVF9IRUFEX0lOSVRJQUxJWkVSKGNoaWxkX3dhdGNoZXMpOworCitzdGF0aWMgUUVNVUJIICpzaWdjaGxkX2JoOworCitzdGF0aWMgdm9pZCBzaWdjaGxkX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKyAgICBxZW11X2JoX3NjaGVkdWxlKHNpZ2NobGRfYmgpOworfQorCitzdGF0aWMgdm9pZCBzaWdjaGxkX2JoX2hhbmRsZXIodm9pZCAqb3BhcXVlKQoreworICAgIENoaWxkUHJvY2Vzc1JlY29yZCAqcmVjLCAqbmV4dDsKKworICAgIFFMSVNUX0ZPUkVBQ0hfU0FGRShyZWMsICZjaGlsZF93YXRjaGVzLCBuZXh0LCBuZXh0KSB7CisgICAgICAgIGlmICh3YWl0cGlkKHJlYy0+cGlkLCBOVUxMLCBXTk9IQU5HKSA9PSByZWMtPnBpZCkgeworICAgICAgICAgICAgUUxJU1RfUkVNT1ZFKHJlYywgbmV4dCk7CisgICAgICAgICAgICBnX2ZyZWUocmVjKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcWVtdV9pbml0X2NoaWxkX3dhdGNoKHZvaWQpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgICAgc2lnY2hsZF9iaCA9IHFlbXVfYmhfbmV3KHNpZ2NobGRfYmhfaGFuZGxlciwgTlVMTCk7CisKKyAgICBhY3Quc2FfaGFuZGxlciA9IHNpZ2NobGRfaGFuZGxlcjsKKyAgICBhY3Quc2FfZmxhZ3MgPSBTQV9OT0NMRFNUT1A7CisgICAgc2lnYWN0aW9uKFNJR0NITEQsICZhY3QsIE5VTEwpOworfQorCitpbnQgcWVtdV9hZGRfY2hpbGRfd2F0Y2gocGlkX3QgcGlkKQoreworICAgIENoaWxkUHJvY2Vzc1JlY29yZCAqcmVjOworCisgICAgaWYgKCFzaWdjaGxkX2JoKSB7CisgICAgICAgIHFlbXVfaW5pdF9jaGlsZF93YXRjaCgpOworICAgIH0KKworICAgIFFMSVNUX0ZPUkVBQ0gocmVjLCAmY2hpbGRfd2F0Y2hlcywgbmV4dCkgeworICAgICAgICBpZiAocmVjLT5waWQgPT0gcGlkKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZWMgPSBnX21hbGxvYzAoc2l6ZW9mKENoaWxkUHJvY2Vzc1JlY29yZCkpOworICAgIHJlYy0+cGlkID0gcGlkOworICAgIFFMSVNUX0lOU0VSVF9IRUFEKCZjaGlsZF93YXRjaGVzLCByZWMsIG5leHQpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL2lvcG9ydC5jIGIvYW5kcm9pZC9xZW11MS9pb3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2EzMDVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9pb3BvcnQuYwpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIFFFTVUgU3lzdGVtIEVtdWxhdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisvKgorICogc3BsaXR0ZWQgb3V0IGlvcG9ydCByZWxhdGVkIHN0dWZmcyBmcm9tIHZsLmMuCisgKi8KKworI2luY2x1ZGUgImV4ZWMvaW9wb3J0LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElPIFBvcnQgKi8KKworLy8jZGVmaW5lIERFQlVHX1VOVVNFRF9JT1BPUlQKKy8vI2RlZmluZSBERUJVR19JT1BPUlQKKworI2lmZGVmIERFQlVHX1VOVVNFRF9JT1BPUlQKKyMgIGRlZmluZSBMT0dfVU5VU0VEX0lPUE9SVChmbXQsIC4uLikgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgX19WQV9BUkdTX18pCisjZWxzZQorIyAgZGVmaW5lIExPR19VTlVTRURfSU9QT1JUKGZtdCwgLi4uKSBkb3sgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUdfSU9QT1JUCisjICBkZWZpbmUgTE9HX0lPUE9SVCguLi4pIHFlbXVfbG9nX21hc2soQ1BVX0xPR19JT1BPUlQsICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgIGRlZmluZSBMT0dfSU9QT1JUKC4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIFhYWDogdXNlIGEgdHdvIGxldmVsIHRhYmxlIHRvIGxpbWl0IG1lbW9yeSB1c2FnZSAqLworCitzdGF0aWMgdm9pZCAqaW9wb3J0X29wYXF1ZVtNQVhfSU9QT1JUU107CitzdGF0aWMgSU9Qb3J0UmVhZEZ1bmMgKmlvcG9ydF9yZWFkX3RhYmxlWzNdW01BWF9JT1BPUlRTXTsKK3N0YXRpYyBJT1BvcnRXcml0ZUZ1bmMgKmlvcG9ydF93cml0ZV90YWJsZVszXVtNQVhfSU9QT1JUU107CisKK3N0YXRpYyBJT1BvcnRSZWFkRnVuYyBkZWZhdWx0X2lvcG9ydF9yZWFkYiwgZGVmYXVsdF9pb3BvcnRfcmVhZHcsIGRlZmF1bHRfaW9wb3J0X3JlYWRsOworc3RhdGljIElPUG9ydFdyaXRlRnVuYyBkZWZhdWx0X2lvcG9ydF93cml0ZWIsIGRlZmF1bHRfaW9wb3J0X3dyaXRldywgZGVmYXVsdF9pb3BvcnRfd3JpdGVsOworCitzdGF0aWMgdWludDMyX3QgaW9wb3J0X3JlYWQoaW50IGluZGV4LCB1aW50MzJfdCBhZGRyZXNzKQoreworICAgIHN0YXRpYyBJT1BvcnRSZWFkRnVuYyAqIGNvbnN0IGRlZmF1bHRfZnVuY1szXSA9IHsKKyAgICAgICAgZGVmYXVsdF9pb3BvcnRfcmVhZGIsCisgICAgICAgIGRlZmF1bHRfaW9wb3J0X3JlYWR3LAorICAgICAgICBkZWZhdWx0X2lvcG9ydF9yZWFkbAorICAgIH07CisgICAgSU9Qb3J0UmVhZEZ1bmMgKmZ1bmMgPSBpb3BvcnRfcmVhZF90YWJsZVtpbmRleF1bYWRkcmVzc107CisgICAgaWYgKCFmdW5jKQorICAgICAgICBmdW5jID0gZGVmYXVsdF9mdW5jW2luZGV4XTsKKyAgICByZXR1cm4gZnVuYyhpb3BvcnRfb3BhcXVlW2FkZHJlc3NdLCBhZGRyZXNzKTsKK30KKworc3RhdGljIHZvaWQgaW9wb3J0X3dyaXRlKGludCBpbmRleCwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSkKK3sKKyAgICBzdGF0aWMgSU9Qb3J0V3JpdGVGdW5jICogY29uc3QgZGVmYXVsdF9mdW5jWzNdID0geworICAgICAgICBkZWZhdWx0X2lvcG9ydF93cml0ZWIsCisgICAgICAgIGRlZmF1bHRfaW9wb3J0X3dyaXRldywKKyAgICAgICAgZGVmYXVsdF9pb3BvcnRfd3JpdGVsCisgICAgfTsKKyAgICBJT1BvcnRXcml0ZUZ1bmMgKmZ1bmMgPSBpb3BvcnRfd3JpdGVfdGFibGVbaW5kZXhdW2FkZHJlc3NdOworICAgIGlmICghZnVuYykKKyAgICAgICAgZnVuYyA9IGRlZmF1bHRfZnVuY1tpbmRleF07CisgICAgZnVuYyhpb3BvcnRfb3BhcXVlW2FkZHJlc3NdLCBhZGRyZXNzLCBkYXRhKTsKK30KKworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfaW9wb3J0X3JlYWRiKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcykKK3sKKyAgICBMT0dfVU5VU0VEX0lPUE9SVCgidW51c2VkIGluYjogcG9ydD0weCUwNCJQUkl4MzIiXG4iLCBhZGRyZXNzKTsKKyAgICByZXR1cm4gMHhmZjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9pb3BvcnRfd3JpdGViKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSkKK3sKKyAgICBMT0dfVU5VU0VEX0lPUE9SVCgidW51c2VkIG91dGI6IHBvcnQ9MHglMDQiUFJJeDMyIiBkYXRhPTB4JTAyIlBSSXgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZGF0YSk7Cit9CisKKy8qIGRlZmF1bHQgaXMgdG8gbWFrZSB0d28gYnl0ZSBhY2Nlc3NlcyAqLworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfaW9wb3J0X3JlYWR3KHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcykKK3sKKyAgICB1aW50MzJfdCBkYXRhOworICAgIGRhdGEgPSBpb3BvcnRfcmVhZCgwLCBhZGRyZXNzKTsKKyAgICBhZGRyZXNzID0gKGFkZHJlc3MgKyAxKSAmIElPUE9SVFNfTUFTSzsKKyAgICBkYXRhIHw9IGlvcG9ydF9yZWFkKDAsIGFkZHJlc3MpIDw8IDg7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfaW9wb3J0X3dyaXRldyh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IGRhdGEpCit7CisgICAgaW9wb3J0X3dyaXRlKDAsIGFkZHJlc3MsIGRhdGEgJiAweGZmKTsKKyAgICBhZGRyZXNzID0gKGFkZHJlc3MgKyAxKSAmIElPUE9SVFNfTUFTSzsKKyAgICBpb3BvcnRfd3JpdGUoMCwgYWRkcmVzcywgKGRhdGEgPj4gOCkgJiAweGZmKTsKK30KKworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfaW9wb3J0X3JlYWRsKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcykKK3sKKyAgICBMT0dfVU5VU0VEX0lPUE9SVCgidW51c2VkIGlubDogcG9ydD0weCUwNCJQUkl4MzIiXG4iLCBhZGRyZXNzKTsKKyAgICByZXR1cm4gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9pb3BvcnRfd3JpdGVsKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSkKK3sKKyAgICBMT0dfVU5VU0VEX0lPUE9SVCgidW51c2VkIG91dGw6IHBvcnQ9MHglMDQiUFJJeDMyIiBkYXRhPTB4JTAyIlBSSXgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgaW9wb3J0X2JzaXplKGludCBzaXplLCBpbnQgKmJzaXplKQoreworICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgKmJzaXplID0gMDsKKyAgICB9IGVsc2UgaWYgKHNpemUgPT0gMikgeworICAgICAgICAqYnNpemUgPSAxOworICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICpic2l6ZSA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogc2l6ZSBpcyB0aGUgd29yZCBzaXplIGluIGJ5dGUgKi8KK2ludCByZWdpc3Rlcl9pb3BvcnRfcmVhZChwaW9fYWRkcl90IHN0YXJ0LCBpbnQgbGVuZ3RoLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT1BvcnRSZWFkRnVuYyAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIHBpb19hZGRyX3QgaTsKKyAgICBpbnQgYnNpemU7CisKKyAgICBpZiAoaW9wb3J0X2JzaXplKHNpemUsICZic2l6ZSkpIHsKKyAgICAgICAgaHdfZXJyb3IoInJlZ2lzdGVyX2lvcG9ydF9yZWFkOiBpbnZhbGlkIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IoaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBsZW5ndGg7IGkgKz0gc2l6ZSkgeworICAgICAgICBpb3BvcnRfcmVhZF90YWJsZVtic2l6ZV1baV0gPSBmdW5jOworICAgICAgICBpZiAoaW9wb3J0X29wYXF1ZVtpXSAhPSBOVUxMICYmIGlvcG9ydF9vcGFxdWVbaV0gIT0gb3BhcXVlKQorICAgICAgICAgICAgaHdfZXJyb3IoInJlZ2lzdGVyX2lvcG9ydF9yZWFkOiBpbnZhbGlkIG9wYXF1ZSIpOworICAgICAgICBpb3BvcnRfb3BhcXVlW2ldID0gb3BhcXVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogc2l6ZSBpcyB0aGUgd29yZCBzaXplIGluIGJ5dGUgKi8KK2ludCByZWdpc3Rlcl9pb3BvcnRfd3JpdGUocGlvX2FkZHJfdCBzdGFydCwgaW50IGxlbmd0aCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElPUG9ydFdyaXRlRnVuYyAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIHBpb19hZGRyX3QgaTsKKyAgICBpbnQgYnNpemU7CisKKyAgICBpZiAoaW9wb3J0X2JzaXplKHNpemUsICZic2l6ZSkpIHsKKyAgICAgICAgaHdfZXJyb3IoInJlZ2lzdGVyX2lvcG9ydF93cml0ZTogaW52YWxpZCBzaXplIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGVuZ3RoOyBpICs9IHNpemUpIHsKKyAgICAgICAgaW9wb3J0X3dyaXRlX3RhYmxlW2JzaXplXVtpXSA9IGZ1bmM7CisgICAgICAgIGlmIChpb3BvcnRfb3BhcXVlW2ldICE9IE5VTEwgJiYgaW9wb3J0X29wYXF1ZVtpXSAhPSBvcGFxdWUpCisgICAgICAgICAgICBod19lcnJvcigicmVnaXN0ZXJfaW9wb3J0X3dyaXRlOiBpbnZhbGlkIG9wYXF1ZSIpOworICAgICAgICBpb3BvcnRfb3BhcXVlW2ldID0gb3BhcXVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBpc2FfdW5hc3NpZ25faW9wb3J0KHBpb19hZGRyX3Qgc3RhcnQsIGludCBsZW5ndGgpCit7CisgICAgcGlvX2FkZHJfdCBpOworCisgICAgZm9yKGkgPSBzdGFydDsgaSA8IHN0YXJ0ICsgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaW9wb3J0X3JlYWRfdGFibGVbMF1baV0gPSBkZWZhdWx0X2lvcG9ydF9yZWFkYjsKKyAgICAgICAgaW9wb3J0X3JlYWRfdGFibGVbMV1baV0gPSBkZWZhdWx0X2lvcG9ydF9yZWFkdzsKKyAgICAgICAgaW9wb3J0X3JlYWRfdGFibGVbMl1baV0gPSBkZWZhdWx0X2lvcG9ydF9yZWFkbDsKKworICAgICAgICBpb3BvcnRfd3JpdGVfdGFibGVbMF1baV0gPSBkZWZhdWx0X2lvcG9ydF93cml0ZWI7CisgICAgICAgIGlvcG9ydF93cml0ZV90YWJsZVsxXVtpXSA9IGRlZmF1bHRfaW9wb3J0X3dyaXRldzsKKyAgICAgICAgaW9wb3J0X3dyaXRlX3RhYmxlWzJdW2ldID0gZGVmYXVsdF9pb3BvcnRfd3JpdGVsOworCisgICAgICAgIGlvcG9ydF9vcGFxdWVbaV0gPSBOVUxMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGNwdV9vdXRiKHBpb19hZGRyX3QgYWRkciwgdWludDhfdCB2YWwpCit7CisgICAgTE9HX0lPUE9SVCgib3V0YjogJTA0IkZNVF9waW9hZGRyIiAlMDIiUFJJeDgiXG4iLCBhZGRyLCB2YWwpOworICAgIGlvcG9ydF93cml0ZSgwLCBhZGRyLCB2YWwpOworfQorCit2b2lkIGNwdV9vdXR3KHBpb19hZGRyX3QgYWRkciwgdWludDE2X3QgdmFsKQoreworICAgIExPR19JT1BPUlQoIm91dHc6ICUwNCJGTVRfcGlvYWRkciIgJTA0IlBSSXgxNiJcbiIsIGFkZHIsIHZhbCk7CisgICAgaW9wb3J0X3dyaXRlKDEsIGFkZHIsIHZhbCk7Cit9CisKK3ZvaWQgY3B1X291dGwocGlvX2FkZHJfdCBhZGRyLCB1aW50MzJfdCB2YWwpCit7CisgICAgTE9HX0lPUE9SVCgib3V0bDogJTA0IkZNVF9waW9hZGRyIiAlMDgiUFJJeDMyIlxuIiwgYWRkciwgdmFsKTsKKyAgICBpb3BvcnRfd3JpdGUoMiwgYWRkciwgdmFsKTsKK30KKwordWludDhfdCBjcHVfaW5iKHBpb19hZGRyX3QgYWRkcikKK3sKKyAgICB1aW50OF90IHZhbDsKKyAgICB2YWwgPSBpb3BvcnRfcmVhZCgwLCBhZGRyKTsKKyAgICBMT0dfSU9QT1JUKCJpbmIgOiAlMDQiRk1UX3Bpb2FkZHIiICUwMiJQUkl4OCJcbiIsIGFkZHIsIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDE2X3QgY3B1X2ludyhwaW9fYWRkcl90IGFkZHIpCit7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IGlvcG9ydF9yZWFkKDEsIGFkZHIpOworICAgIExPR19JT1BPUlQoImludyA6ICUwNCJGTVRfcGlvYWRkciIgJTA0IlBSSXgxNiJcbiIsIGFkZHIsIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKK30KKwordWludDMyX3QgY3B1X2lubChwaW9fYWRkcl90IGFkZHIpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHZhbCA9IGlvcG9ydF9yZWFkKDIsIGFkZHIpOworICAgIExPR19JT1BPUlQoImlubCA6ICUwNCJGTVRfcGlvYWRkciIgJTA4IlBSSXgzMiJcbiIsIGFkZHIsIHZhbCk7CisgICAgcmV0dXJuIHZhbDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEva3ZtLWFsbC5jIGIvYW5kcm9pZC9xZW11MS9rdm0tYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhMGM3NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEva3ZtLWFsbC5jCkBAIC0wLDAgKzEsMTA3MyBAQAorLyoKKyAqIFFFTVUgS1ZNIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKiAgICAgICAgICAgUmVkIEhhdCwgSW5jLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqICBHbGF1YmVyIENvc3RhICAgICA8Z2Nvc3RhQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSA8bGludXgva3ZtLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImFuZHJvaWQva3ZtLmgiCisjaW5jbHVkZSAiZXhlYy9nZGJzdHViLmgiCisjaW5jbHVkZSAiZXhlYy9yYW1fYWRkci5oIgorI2luY2x1ZGUgInN5c2VtdS9rdm0uaCIKKworI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2t2bV9lbnYuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKworLyogS1ZNIHVzZXMgUEFHRV9TSVpFIGluIGl0J3MgZGVmaW5pdGlvbiBvZiBDT0FMRVNDRURfTU1JT19NQVggKi8KKyNkZWZpbmUgUEFHRV9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKKworLy8jZGVmaW5lIERFQlVHX0tWTQorCisjaWZkZWYgREVCVUdfS1ZNCisjZGVmaW5lIGRwcmludGYoZm10LCAuLi4pIFwKKyAgICBkbyB7IGZwcmludGYoc3RkZXJyLCBmbXQsICMjIF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoZm10LCAuLi4pIFwKKyAgICBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKSBkaWUoY29uc3QgY2hhciogbWVzc2FnZSwgY29uc3QgY2hhciogZnVuY3Rpb24pIHsKKyAgICBjcmFzaGhhbmRsZXJfZGllX2Zvcm1hdCgiS1ZNIG9wZXJhdGlvbiBmYWlsZWQ6ICVzICglcykiLCBtZXNzYWdlLCBmdW5jdGlvbik7CisgICAgYWJvcnQoKTsgLy8ganVzdCBpbiBjYXNlCit9CisKK3R5cGVkZWYgc3RydWN0IEtWTVNsb3QKK3sKKyAgICBod2FkZHIgc3RhcnRfYWRkcjsKKyAgICByYW1fYWRkcl90IG1lbW9yeV9zaXplOworICAgIHJhbV9hZGRyX3QgcGh5c19vZmZzZXQ7CisgICAgaW50IHNsb3Q7CisgICAgaW50IGZsYWdzOworfSBLVk1TbG90OworCit0eXBlZGVmIHN0cnVjdCBrdm1fZGlydHlfbG9nIEtWTURpcnR5TG9nOworCitpbnQga3ZtX2FsbG93ZWQgPSAwOworCitzdHJ1Y3QgS1ZNU3RhdGUKK3sKKyAgICBLVk1TbG90IHNsb3RzWzMyXTsKKyAgICBpbnQgZmQ7CisgICAgaW50IHZtZmQ7CisgICAgaW50IGNvYWxlc2NlZF9tbWlvOworICAgIGludCBicm9rZW5fc2V0X21lbV9yZWdpb247CisgICAgaW50IG1pZ3JhdGlvbl9sb2c7CisjaWZkZWYgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcKKyAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnRfaGVhZCBrdm1fc3dfYnJlYWtwb2ludHM7CisjZW5kaWYKK307CisKK3N0YXRpYyBLVk1TdGF0ZSAqa3ZtX3N0YXRlOworCitzdGF0aWMgS1ZNU2xvdCAqa3ZtX2FsbG9jX3Nsb3QoS1ZNU3RhdGUgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5zbG90cyk7IGkrKykgeworICAgICAgICAvKiBLVk0gcHJpdmF0ZSBtZW1vcnkgc2xvdHMgKi8KKyAgICAgICAgaWYgKGkgPj0gOCAmJiBpIDwgMTIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHMtPnNsb3RzW2ldLm1lbW9yeV9zaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gJnMtPnNsb3RzW2ldOworICAgIH0KKworICAgIGRpZSgibm8gZnJlZSBzbG90IGF2YWlsYWJsZSIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIEtWTVNsb3QgKmt2bV9sb29rdXBfbWF0Y2hpbmdfc2xvdChLVk1TdGF0ZSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIHN0YXJ0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnNsb3RzKTsgaSsrKSB7CisgICAgICAgIEtWTVNsb3QgKm1lbSA9ICZzLT5zbG90c1tpXTsKKyAgICAgICAgaWYgKHN0YXJ0X2FkZHIgPT0gbWVtLT5zdGFydF9hZGRyICYmIHNpemUgPT0gbWVtLT5tZW1vcnlfc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG1lbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogRmluZCBvdmVybGFwcGluZyBzbG90IHdpdGggbG93ZXN0IHN0YXJ0IGFkZHJlc3MKKyAqLworc3RhdGljIEtWTVNsb3QgKmt2bV9sb29rdXBfb3ZlcmxhcHBpbmdfc2xvdChLVk1TdGF0ZSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIHN0YXJ0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICBLVk1TbG90ICpmb3VuZCA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5zbG90cyk7IGkrKykgeworICAgICAgICBLVk1TbG90ICptZW0gPSAmcy0+c2xvdHNbaV07CisKKyAgICAgICAgLy8gU2tpcCBlbXB0eSBzbG90cy4KKyAgICAgICAgaWYgKCFtZW0tPm1lbW9yeV9zaXplKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gU2tpcCBub24tb3ZlcmxhcHBpbmcgc2xvdHMsIGNvbmRpdGlvbnMgYXJlOgorICAgICAgICAvLyAgICBzdGFydF9hZGRyICsgc2l6ZSA8PSBtZW0tPnN0YXJ0X2FkZHIgfHwKKyAgICAgICAgLy8gICAgc3RhcnRfYWRkciA+PSBtZW0tPnN0YXJ0X2FkZHIgKyBtZW0tPm1lbW9yeV9zaXplCisgICAgICAgIC8vCisgICAgICAgIC8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gYXZvaWQgd3JhcHBpbmcgZXJyb3JzLCBzbyBhdm9pZAorICAgICAgICAvLyBhZGRpdGlvbnMgYW5kIG9ubHkgY29tcGFyZSBwb3NpdGl2ZSB2YWx1ZXMuCisgICAgICAgIGlmIChzdGFydF9hZGRyIDw9IG1lbS0+c3RhcnRfYWRkcikgeworICAgICAgICAgICAgaWYgKG1lbS0+c3RhcnRfYWRkciAtIHN0YXJ0X2FkZHIgPj0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0X2FkZHIgLSBtZW0tPnN0YXJ0X2FkZHIgPj0gbWVtLT5tZW1vcnlfc2l6ZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQgJiYgZm91bmQtPnN0YXJ0X2FkZHIgPCBtZW0tPnN0YXJ0X2FkZHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZm91bmQgPSBtZW07CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IGt2bV9zZXRfdXNlcl9tZW1vcnlfcmVnaW9uKEtWTVN0YXRlICpzLCBLVk1TbG90ICpzbG90KQoreworICAgIHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24gbWVtOworCisgICAgbWVtLnNsb3QgPSBzbG90LT5zbG90OworICAgIG1lbS5ndWVzdF9waHlzX2FkZHIgPSBzbG90LT5zdGFydF9hZGRyOworICAgIG1lbS5tZW1vcnlfc2l6ZSA9IHNsb3QtPm1lbW9yeV9zaXplOworICAgIG1lbS51c2Vyc3BhY2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKXFlbXVfZ2V0X3JhbV9wdHIoc2xvdC0+cGh5c19vZmZzZXQpOworICAgIG1lbS5mbGFncyA9IHNsb3QtPmZsYWdzOworICAgIGlmIChzLT5taWdyYXRpb25fbG9nKSB7CisgICAgICAgIG1lbS5mbGFncyB8PSBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUzsKKyAgICB9CisgICAgcmV0dXJuIGt2bV92bV9pb2N0bChzLCBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTiwgJm1lbSk7Cit9CisKKworaW50IGt2bV9pbml0X3ZjcHUoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKyAgICBsb25nIG1tYXBfc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgZHByaW50Zigia3ZtX2luaXRfdmNwdVxuIik7CisKKyAgICByZXQgPSBrdm1fdm1faW9jdGwocywgS1ZNX0NSRUFURV9WQ1BVLCBjcHUtPmNwdV9pbmRleCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZHByaW50Zigia3ZtX2NyZWF0ZV92Y3B1IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGNwdS0+a3ZtX2ZkID0gcmV0OworICAgIGNwdS0+a3ZtX3N0YXRlID0gczsKKworICAgIG1tYXBfc2l6ZSA9IGt2bV9pb2N0bChzLCBLVk1fR0VUX1ZDUFVfTU1BUF9TSVpFLCAwKTsKKyAgICBpZiAobW1hcF9zaXplIDwgMCkgeworICAgICAgICBkcHJpbnRmKCJLVk1fR0VUX1ZDUFVfTU1BUF9TSVpFIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGNwdS0+a3ZtX3J1biA9IG1tYXAoTlVMTCwgbW1hcF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgY3B1LT5rdm1fZmQsIDApOworICAgIGlmIChjcHUtPmt2bV9ydW4gPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgIGRwcmludGYoIm1tYXAnaW5nIHZjcHUgc3RhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgcmV0ID0ga3ZtX2FyY2hfaW5pdF92Y3B1KGNwdSk7CisKK2VycjoKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQga3ZtX3B1dF9tcF9zdGF0ZShDUFVTdGF0ZSAqY3B1KQoreworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIHN0cnVjdCBrdm1fbXBfc3RhdGUgbXBfc3RhdGUgPSB7IC5tcF9zdGF0ZSA9IGVudi0+bXBfc3RhdGUgfTsKKworICAgIHJldHVybiBrdm1fdmNwdV9pb2N0bChjcHUsIEtWTV9TRVRfTVBfU1RBVEUsICZtcF9zdGF0ZSk7Cit9CisKK2ludCBrdm1fZ2V0X21wX3N0YXRlKENQVVN0YXRlICpjcHUpCit7CisgICAgc3RydWN0IGt2bV9tcF9zdGF0ZSBtcF9zdGF0ZTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0ga3ZtX3ZjcHVfaW9jdGwoY3B1LCBLVk1fR0VUX01QX1NUQVRFLCAmbXBfc3RhdGUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIGVudi0+bXBfc3RhdGUgPSBtcF9zdGF0ZS5tcF9zdGF0ZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9zeW5jX3ZjcHVzKHZvaWQpCit7CisgICAgQ1BVU3RhdGUgKmNwdTsKKworICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICBpbnQgcmV0ID0ga3ZtX2FyY2hfcHV0X3JlZ2lzdGVycyhjcHUpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIGRpcnR5IHBhZ2VzIGxvZ2dpbmcgY29udHJvbAorICovCitzdGF0aWMgaW50IGt2bV9kaXJ0eV9wYWdlc19sb2dfY2hhbmdlKGh3YWRkciBwaHlzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgc2l6ZSwgaW50IGZsYWdzLCBpbnQgbWFzaykKK3sKKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKyAgICBLVk1TbG90ICptZW0gPSBrdm1fbG9va3VwX21hdGNoaW5nX3Nsb3QocywgcGh5c19hZGRyLCBzaXplKTsKKyAgICBpbnQgb2xkX2ZsYWdzOworCisgICAgaWYgKG1lbSA9PSBOVUxMKSAgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCVUc6ICVzOiBpbnZhbGlkIHBhcmFtZXRlcnMgIiBUQVJHRVRfRk1UX3BseCAiLSIKKyAgICAgICAgICAgICAgICAgICAgVEFSR0VUX0ZNVF9wbHggIlxuIiwgX19mdW5jX18sIChod2FkZHIpcGh5c19hZGRyLAorICAgICAgICAgICAgICAgICAgICAoaHdhZGRyKShwaHlzX2FkZHIgKyBzaXplIC0gMSkpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgb2xkX2ZsYWdzID0gbWVtLT5mbGFnczsKKworICAgIGZsYWdzID0gKG1lbS0+ZmxhZ3MgJiB+bWFzaykgfCBmbGFnczsKKyAgICBtZW0tPmZsYWdzID0gZmxhZ3M7CisKKyAgICAvKiBJZiBub3RoaW5nIGNoYW5nZWQgZWZmZWN0aXZlbHksIG5vIG5lZWQgdG8gaXNzdWUgaW9jdGwgKi8KKyAgICBpZiAocy0+bWlncmF0aW9uX2xvZykgeworICAgICAgICBmbGFncyB8PSBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUzsKKyAgICB9CisgICAgaWYgKGZsYWdzID09IG9sZF9mbGFncykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGt2bV9zZXRfdXNlcl9tZW1vcnlfcmVnaW9uKHMsIG1lbSk7Cit9CisKK2ludCBrdm1fbG9nX3N0YXJ0KGh3YWRkciBwaHlzX2FkZHIsIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICAgICAgcmV0dXJuIGt2bV9kaXJ0eV9wYWdlc19sb2dfY2hhbmdlKHBoeXNfYWRkciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWTV9NRU1fTE9HX0RJUlRZX1BBR0VTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMpOworfQorCitpbnQga3ZtX2xvZ19zdG9wKGh3YWRkciBwaHlzX2FkZHIsIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICAgICAgcmV0dXJuIGt2bV9kaXJ0eV9wYWdlc19sb2dfY2hhbmdlKHBoeXNfYWRkciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUyk7Cit9CisKK2ludCBrdm1fc2V0X21pZ3JhdGlvbl9sb2coaW50IGVuYWJsZSkKK3sKKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKyAgICBLVk1TbG90ICptZW07CisgICAgaW50IGksIGVycjsKKworICAgIHMtPm1pZ3JhdGlvbl9sb2cgPSBlbmFibGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5zbG90cyk7IGkrKykgeworICAgICAgICBtZW0gPSAmcy0+c2xvdHNbaV07CisKKyAgICAgICAgaWYgKCEhKG1lbS0+ZmxhZ3MgJiBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUykgPT0gZW5hYmxlKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBrdm1fc2V0X3VzZXJfbWVtb3J5X3JlZ2lvbihzLCBtZW0pOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEFMSUdOKHgsIHkpICAoKCh4KSsoeSktMSkgJiB+KCh5KS0xKSkKKworLyoqCisgKiBrdm1fcGh5c2ljYWxfc3luY19kaXJ0eV9iaXRtYXAgLSBHcmFiIGRpcnR5IGJpdG1hcCBmcm9tIGtlcm5lbCBzcGFjZQorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHFlbXUncyBkaXJ0eSBiaXRtYXAgdXNpbmcgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHkoKS4KKyAqIFRoaXMgbWVhbnMgYWxsIGJpdHMgYXJlIHNldCB0byBkaXJ0eS4KKyAqCisgKiBAc3RhcnRfYWRkOiBzdGFydCBvZiBsb2dnZWQgcmVnaW9uLgorICogQGVuZF9hZGRyOiBlbmQgb2YgbG9nZ2VkIHJlZ2lvbi4KKyAqLworaW50IGt2bV9waHlzaWNhbF9zeW5jX2RpcnR5X2JpdG1hcChod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIGVuZF9hZGRyKQoreworICAgIEtWTVN0YXRlICpzID0ga3ZtX3N0YXRlOworICAgIHNpemVfdCBzaXplLCBhbGxvY2F0ZWRfc2l6ZSA9IDA7CisgICAgS1ZNRGlydHlMb2cgZDsKKyAgICBLVk1TbG90ICptZW07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBkLmRpcnR5X2JpdG1hcCA9IE5VTEw7CisgICAgd2hpbGUgKHN0YXJ0X2FkZHIgPCBlbmRfYWRkcikgeworICAgICAgICByYW1fYWRkcl90IHN0YXJ0X3NpemUgPSAocmFtX2FkZHJfdCkoZW5kX2FkZHIgLSBzdGFydF9hZGRyKTsKKworICAgICAgICBtZW0gPSBrdm1fbG9va3VwX292ZXJsYXBwaW5nX3Nsb3Qocywgc3RhcnRfYWRkciwgc3RhcnRfc2l6ZSk7CisgICAgICAgIGlmIChtZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzaXplID0gQUxJR04oKChtZW0tPm1lbW9yeV9zaXplKSA+PiBUQVJHRVRfUEFHRV9CSVRTKSwKKyAgICAgICAgICAgICAgICAgICAgIC8qSE9TVF9MT05HX0JJVFMqLyA2NCkgLyA4OworICAgICAgICBpZiAoc2l6ZSA+IGFsbG9jYXRlZF9zaXplKSB7CisgICAgICAgICAgICBkLmRpcnR5X2JpdG1hcCA9IGdfcmVhbGxvYyhkLmRpcnR5X2JpdG1hcCwgc2l6ZSk7CisgICAgICAgICAgICBhbGxvY2F0ZWRfc2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGQuZGlydHlfYml0bWFwLCAwLCBhbGxvY2F0ZWRfc2l6ZSk7CisKKyAgICAgICAgZC5zbG90ID0gbWVtLT5zbG90OworCisgICAgICAgIGlmIChrdm1fdm1faW9jdGwocywgS1ZNX0dFVF9ESVJUWV9MT0csICZkKSA9PSAtMSkgeworICAgICAgICAgICAgZHByaW50ZigiaW9jdGwgZmFpbGVkICVkXG4iLCBlcnJubyk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY3B1X3BoeXNpY2FsX21lbW9yeV9zZXRfZGlydHlfbGViaXRtYXAoZC5kaXJ0eV9iaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbS0+cGh5c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbS0+bWVtb3J5X3NpemUgLyBnZXRwYWdlc2l6ZSgpKTsKKyAgICAgICAgc3RhcnRfYWRkciArPSBtZW0tPm1lbW9yeV9zaXplOworICAgICAgICBpZiAoIXN0YXJ0X2FkZHIpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZSB3cmFwLWFyb3VuZCwgd2hpY2ggaGFwcGVucyB3aGVuIGEgc2xvdCBpcyBtYXBwZWQKKyAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBnX2ZyZWUoZC5kaXJ0eV9iaXRtYXApOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGt2bV9jb2FsZXNjZV9tbWlvX3JlZ2lvbihod2FkZHIgc3RhcnQsIHJhbV9hZGRyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gLUVOT1NZUzsKKyNpZmRlZiBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPCisgICAgS1ZNU3RhdGUgKnMgPSBrdm1fc3RhdGU7CisKKyAgICBpZiAocy0+Y29hbGVzY2VkX21taW8pIHsKKyAgICAgICAgc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb196b25lIHpvbmU7CisKKyAgICAgICAgem9uZS5hZGRyID0gc3RhcnQ7CisgICAgICAgIHpvbmUuc2l6ZSA9IHNpemU7CisKKyAgICAgICAgcmV0ID0ga3ZtX3ZtX2lvY3RsKHMsIEtWTV9SRUdJU1RFUl9DT0FMRVNDRURfTU1JTywgJnpvbmUpOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGt2bV91bmNvYWxlc2NlX21taW9fcmVnaW9uKGh3YWRkciBzdGFydCwgcmFtX2FkZHJfdCBzaXplKQoreworICAgIGludCByZXQgPSAtRU5PU1lTOworI2lmZGVmIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU8KKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKworICAgIGlmIChzLT5jb2FsZXNjZWRfbW1pbykgeworICAgICAgICBzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgem9uZTsKKworICAgICAgICB6b25lLmFkZHIgPSBzdGFydDsKKyAgICAgICAgem9uZS5zaXplID0gc2l6ZTsKKworICAgICAgICByZXQgPSBrdm1fdm1faW9jdGwocywgS1ZNX1VOUkVHSVNURVJfQ09BTEVTQ0VEX01NSU8sICZ6b25lKTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBrdm1fY2hlY2tfZXh0ZW5zaW9uKEtWTVN0YXRlICpzLCB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBrdm1faW9jdGwocywgS1ZNX0NIRUNLX0VYVEVOU0lPTiwgZXh0ZW5zaW9uKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXQgPSAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9yZXNldF92Y3B1cyh2b2lkICpvcGFxdWUpCit7CisgICAga3ZtX3N5bmNfdmNwdXMoKTsKK30KKworaW50IGt2bV9pbml0KGludCBzbXBfY3B1cykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciB1cGdyYWRlX25vdGVbXSA9CisgICAgICAgICJQbGVhc2UgdXBncmFkZSB0byBhdCBsZWFzdCBrZXJuZWwgMi42LjI5IG9yIHJlY2VudCBrdm0ta21vZFxuIgorICAgICAgICAiKHNlZSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2t2bSkuXG4iOworICAgIEtWTVN0YXRlICpzOworICAgIGludCByZXQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoc21wX2NwdXMgPiAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gU01QIEtWTSBzdXBwb3J0LCB1c2UgJy1zbXAgMSdcbiIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihLVk1TdGF0ZSkpOworCisjaWZkZWYgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcKKyAgICBRVEFJTFFfSU5JVCgmcy0+a3ZtX3N3X2JyZWFrcG9pbnRzKTsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPnNsb3RzKTsgaSsrKQorICAgICAgICBzLT5zbG90c1tpXS5zbG90ID0gaTsKKworICAgIGNoYXIqIGt2bV9kZXZpY2UgPSBnZXRlbnYoS1ZNX0RFVklDRV9OQU1FX0VOVik7CisgICAgaWYgKE5VTEwgPT0ga3ZtX2RldmljZSkgeworICAgICAga3ZtX2RldmljZSA9ICIvZGV2L2t2bSI7CisgICAgfQorCisgICAgcy0+dm1mZCA9IC0xOworICAgIHMtPmZkID0gb3Blbihrdm1fZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChzLT5mZCA9PSAtMSkgeworICAgICAgICByZXQgPSAtZXJybm87CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFjY2VzcyBLVk0ga2VybmVsIG1vZHVsZTogJW1cbiIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmY250bChzLT5mZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKyAgICByZXQgPSBrdm1faW9jdGwocywgS1ZNX0dFVF9BUElfVkVSU0lPTiwgMCk7CisgICAgaWYgKHJldCA8IEtWTV9BUElfVkVSU0lPTikgeworICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAia3ZtIHZlcnNpb24gdG9vIG9sZFxuIik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChyZXQgPiBLVk1fQVBJX1ZFUlNJT04pIHsKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJrdm0gdmVyc2lvbiBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZG8geworICAgICAgcy0+dm1mZCA9IGt2bV9pb2N0bChzLCBLVk1fQ1JFQVRFX1ZNLCAwKTsKKyAgICB9IHdoaWxlIChzLT52bWZkIDwgMCAmJiAoRUlOVFIgPT0gZXJybm8gfHwgRUFHQUlOID09IGVycm5vKSk7CisKKyAgICBpZiAocy0+dm1mZCA8IDApIHsKKyAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImlvY3RsKEtWTV9DUkVBVEVfVk0pIGZhaWxlZDogJWQgJXNcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsbHksIEtWTSBhbGxvY2F0ZWQgaXRzIG93biBtZW1vcnkgYW5kIHdlIGhhZCB0byBqdW1wIHRocm91Z2gKKyAgICAgKiBob29rcyB0byBtYWtlIHBoeXNfcmFtX2Jhc2UgcG9pbnQgdG8gdGhpcy4gIE1vZGVybiB2ZXJzaW9ucyBvZiBLVk0KKyAgICAgKiBqdXN0IHVzZSBhIHVzZXIgYWxsb2NhdGVkIGJ1ZmZlciBzbyB3ZSBjYW4gdXNlIHJlZ3VsYXIgcGFnZXMKKyAgICAgKiB1bm1vZGlmaWVkLiAgTWFrZSBzdXJlIHdlIGhhdmUgYSBzdWZmaWNpZW50bHkgbW9kZXJuIHZlcnNpb24gb2YgS1ZNLgorICAgICAqLworICAgIGlmICgha3ZtX2NoZWNrX2V4dGVuc2lvbihzLCBLVk1fQ0FQX1VTRVJfTUVNT1JZKSkgeworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImt2bSBkb2VzIG5vdCBzdXBwb3J0IEtWTV9DQVBfVVNFUl9NRU1PUllcbiVzIiwKKyAgICAgICAgICAgICAgICB1cGdyYWRlX25vdGUpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKiBUaGVyZSB3YXMgYSBuYXN0eSBidWcgaW4gPCBrdm0tODAgdGhhdCBwcmV2ZW50cyBtZW1vcnkgc2xvdHMgZnJvbSBiZWluZworICAgICAqIGRlc3Ryb3llZCBwcm9wZXJseS4gIFNpbmNlIHdlIHJlbHkgb24gdGhpcyBjYXBhYmlsaXR5LCByZWZ1c2UgdG8gd29yaworICAgICAqIHdpdGggYW55IGtlcm5lbCB3aXRob3V0IHRoaXMgY2FwYWJpbGl0eS4gKi8KKyAgICBpZiAoIWt2bV9jaGVja19leHRlbnNpb24ocywgS1ZNX0NBUF9ERVNUUk9ZX01FTU9SWV9SRUdJT05fV09SS1MpKSB7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIktWTSBrZXJuZWwgbW9kdWxlIGJyb2tlbiAoREVTVFJPWV9NRU1PUllfUkVHSU9OKS5cbiVzIiwKKyAgICAgICAgICAgICAgICB1cGdyYWRlX25vdGUpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyNpZmRlZiBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPCisgICAgcy0+Y29hbGVzY2VkX21taW8gPSBrdm1fY2hlY2tfZXh0ZW5zaW9uKHMsIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU8pOworI2Vsc2UKKyAgICBzLT5jb2FsZXNjZWRfbW1pbyA9IDA7CisjZW5kaWYKKworICAgIHMtPmJyb2tlbl9zZXRfbWVtX3JlZ2lvbiA9IDE7CisjaWZkZWYgS1ZNX0NBUF9KT0lOX01FTU9SWV9SRUdJT05TX1dPUktTCisgICAgcmV0ID0ga3ZtX2lvY3RsKHMsIEtWTV9DSEVDS19FWFRFTlNJT04sIEtWTV9DQVBfSk9JTl9NRU1PUllfUkVHSU9OU19XT1JLUyk7CisgICAgaWYgKHJldCA+IDApIHsKKyAgICAgICAgcy0+YnJva2VuX3NldF9tZW1fcmVnaW9uID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldCA9IGt2bV9hcmNoX2luaXQocywgc21wX2NwdXMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycjsKKworICAgIHFlbXVfcmVnaXN0ZXJfcmVzZXQoa3ZtX3Jlc2V0X3ZjcHVzLCBJTlRfTUFYLCBOVUxMKTsKKworICAgIGt2bV9zdGF0ZSA9IHM7CisKKyAgICByZXR1cm4gMDsKKworZXJyOgorICAgIGlmIChzKSB7CisgICAgICAgIGlmIChzLT52bWZkICE9IC0xKQorICAgICAgICAgICAgY2xvc2Uocy0+dm1mZCk7CisgICAgICAgIGlmIChzLT5mZCAhPSAtMSkKKyAgICAgICAgICAgIGNsb3NlKHMtPmZkKTsKKyAgICB9CisgICAgZ19mcmVlKHMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBrdm1faGFuZGxlX2lvKENQVVN0YXRlICpjcHUsIHVpbnQxNl90IHBvcnQsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbiwgaW50IHNpemUsIHVpbnQzMl90IGNvdW50KQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnB0ciA9IGRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAoZGlyZWN0aW9uID09IEtWTV9FWElUX0lPX0lOKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBzdGJfcChwdHIsIGNwdV9pbmIocG9ydCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN0d19wKHB0ciwgY3B1X2ludyhwb3J0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgc3RsX3AocHRyLCBjcHVfaW5sKHBvcnQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGNwdV9vdXRiKHBvcnQsIGxkdWJfcChwdHIpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBjcHVfb3V0dyhwb3J0LCBsZHV3X3AocHRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY3B1X291dGwocG9ydCwgbGRsX3AocHRyKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdHIgKz0gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQga3ZtX3J1bl9jb2FsZXNjZWRfbW1pbyhDUFVTdGF0ZSAqY3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKQoreworI2lmZGVmIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU8KKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKyAgICBpZiAocy0+Y29hbGVzY2VkX21taW8pIHsKKyAgICAgICAgc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19yaW5nICpyaW5nOworCisgICAgICAgIHJpbmcgPSAodm9pZCAqKXJ1biArIChzLT5jb2FsZXNjZWRfbW1pbyAqIFRBUkdFVF9QQUdFX1NJWkUpOworICAgICAgICB3aGlsZSAocmluZy0+Zmlyc3QgIT0gcmluZy0+bGFzdCkgeworICAgICAgICAgICAgc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pbyAqZW50OworCisgICAgICAgICAgICBlbnQgPSAmcmluZy0+Y29hbGVzY2VkX21taW9bcmluZy0+Zmlyc3RdOworCisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3dyaXRlKGVudC0+cGh5c19hZGRyLCBlbnQtPmRhdGEsIGVudC0+bGVuKTsKKyAgICAgICAgICAgIC8qIEZJWE1FIHNtcF93bWIoKSAqLworICAgICAgICAgICAgcmluZy0+Zmlyc3QgPSAocmluZy0+Zmlyc3QgKyAxKSAlIEtWTV9DT0FMRVNDRURfTU1JT19NQVg7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworaW50IGt2bV9jcHVfZXhlYyhDUFVTdGF0ZSAqY3B1KQoreworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIHN0cnVjdCBrdm1fcnVuICpydW4gPSBjcHUtPmt2bV9ydW47CisgICAgaW50IHJldDsKKworICAgIGRwcmludGYoImt2bV9jcHVfZXhlYygpXG4iKTsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKGNwdS0+ZXhpdF9yZXF1ZXN0KSB7CisgICAgICAgICAgICBkcHJpbnRmKCJpbnRlcnJ1cHQgZXhpdCByZXF1ZXN0ZWRcbiIpOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAga3ZtX2FyY2hfcHJlX3J1bihjcHUsIHJ1bik7CisgICAgICAgIHJldCA9IGt2bV9hcmNoX3ZjcHVfcnVuKGNwdSk7CisgICAgICAgIGt2bV9hcmNoX3Bvc3RfcnVuKGNwdSwgcnVuKTsKKworICAgICAgICBpZiAocmV0ID09IC1FSU5UUiB8fCByZXQgPT0gLUVBR0FJTikgeworICAgICAgICAgICAgZHByaW50ZigiaW8gd2luZG93IGV4aXRcbiIpOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGRwcmludGYoImt2bSBydW4gZmFpbGVkICVzXG4iLCBzdHJlcnJvcigtcmV0KSk7CisgICAgICAgICAgICBkaWUoImt2bSB2Y3B1IHJ1biBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKworICAgICAgICBrdm1fcnVuX2NvYWxlc2NlZF9tbWlvKGNwdSwgcnVuKTsKKworICAgICAgICByZXQgPSAwOyAvKiBleGl0IGxvb3AgKi8KKyAgICAgICAgc3dpdGNoIChydW4tPmV4aXRfcmVhc29uKSB7CisgICAgICAgIGNhc2UgS1ZNX0VYSVRfSU86CisgICAgICAgICAgICBkcHJpbnRmKCJoYW5kbGVfaW9cbiIpOworICAgICAgICAgICAgcmV0ID0ga3ZtX2hhbmRsZV9pbyhjcHUsIHJ1bi0+aW8ucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilydW4gKyBydW4tPmlvLmRhdGFfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4tPmlvLmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuLT5pby5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4tPmlvLmNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtWTV9FWElUX01NSU86CisgICAgICAgICAgICBkcHJpbnRmKCJoYW5kbGVfbW1pb1xuIik7CisgICAgICAgICAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KHJ1bi0+bW1pby5waHlzX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bi0+bW1pby5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4tPm1taW8ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4tPm1taW8uaXNfd3JpdGUpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtWTV9FWElUX0lSUV9XSU5ET1dfT1BFTjoKKyAgICAgICAgICAgIGRwcmludGYoImlycV93aW5kb3dfb3BlblxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLVk1fRVhJVF9TSFVURE9XTjoKKyAgICAgICAgICAgIGRwcmludGYoInNodXRkb3duXG4iKTsKKyAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLVk1fRVhJVF9VTktOT1dOOgorICAgICAgICAgICAgZHByaW50Zigia3ZtX2V4aXRfdW5rbm93blxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLVk1fRVhJVF9GQUlMX0VOVFJZOgorICAgICAgICAgICAgZHByaW50Zigia3ZtX2V4aXRfZmFpbF9lbnRyeVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLVk1fRVhJVF9FWENFUFRJT046CisgICAgICAgICAgICBkcHJpbnRmKCJrdm1fZXhpdF9leGNlcHRpb25cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS1ZNX0VYSVRfREVCVUc6CisgICAgICAgICAgICBkcHJpbnRmKCJrdm1fZXhpdF9kZWJ1Z1xuIik7CisjaWZkZWYgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcKKyAgICAgICAgICAgIGlmIChrdm1fYXJjaF9kZWJ1ZygmcnVuLT5kZWJ1Zy5hcmNoKSkgeworICAgICAgICAgICAgICAgIGdkYl9zZXRfc3RvcF9jcHUoY3B1KTsKKyAgICAgICAgICAgICAgICB2bV9zdG9wKEVYQ1BfREVCVUcpO1wKKyAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfREVCVUc7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiByZS1lbnRlciwgdGhpcyBleGNlcHRpb24gd2FzIGd1ZXN0LWludGVybmFsICovCisgICAgICAgICAgICByZXQgPSAxOworI2VuZGlmIC8qIEtWTV9DQVBfU0VUX0dVRVNUX0RFQlVHICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRwcmludGYoImt2bV9hcmNoX2hhbmRsZV9leGl0XG4iKTsKKyAgICAgICAgICAgIHJldCA9IGt2bV9hcmNoX2hhbmRsZV9leGl0KGNwdSwgcnVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0ID4gMCk7CisKKyAgICBpZiAoY3B1LT5leGl0X3JlcXVlc3QpIHsKKyAgICAgICAgY3B1LT5leGl0X3JlcXVlc3QgPSAwOworICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfSU5URVJSVVBUOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQga3ZtX3NldF9waHlzX21lbShod2FkZHIgc3RhcnRfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICByYW1fYWRkcl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBwaHlzX29mZnNldCkKK3sKKyAgICBLVk1TdGF0ZSAqcyA9IGt2bV9zdGF0ZTsKKyAgICByYW1fYWRkcl90IGZsYWdzID0gcGh5c19vZmZzZXQgJiB+VEFSR0VUX1BBR0VfTUFTSzsKKyAgICBLVk1TbG90ICptZW0sIG9sZDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHN0YXJ0X2FkZHIgJiB+VEFSR0VUX1BBR0VfTUFTSykgeworICAgICAgICBpZiAoZmxhZ3MgPj0gSU9fTUVNX1VOQVNTSUdORUQpIHsKKyAgICAgICAgICAgIGlmICgha3ZtX2xvb2t1cF9vdmVybGFwcGluZ19zbG90KHMsIHN0YXJ0X2FkZHIsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFsaWduZWQgc3BsaXQgb2YgYSBLVk0gbWVtb3J5IHNsb3RcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPbmx5IHBhZ2UtYWxpZ25lZCBtZW1vcnkgc2xvdHMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBkaWUoImJhZCBzdGFydCBhZGRyZXNzIiwgX19mdW5jX18pOworICAgIH0KKworICAgIC8qIEtWTSBkb2VzIG5vdCBzdXBwb3J0IHJlYWQtb25seSBzbG90cyAqLworICAgIHBoeXNfb2Zmc2V0ICY9IH5JT19NRU1fUk9NOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgbWVtID0ga3ZtX2xvb2t1cF9vdmVybGFwcGluZ19zbG90KHMsIHN0YXJ0X2FkZHIsIHNpemUpOworICAgICAgICBpZiAoIW1lbSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ3MgPCBJT19NRU1fVU5BU1NJR05FRCAmJiBzdGFydF9hZGRyID49IG1lbS0+c3RhcnRfYWRkciAmJgorICAgICAgICAgICAgKHN0YXJ0X2FkZHIgKyBzaXplIDw9IG1lbS0+c3RhcnRfYWRkciArIG1lbS0+bWVtb3J5X3NpemUpICYmCisgICAgICAgICAgICAocGh5c19vZmZzZXQgLSBzdGFydF9hZGRyID09IG1lbS0+cGh5c19vZmZzZXQgLSBtZW0tPnN0YXJ0X2FkZHIpKSB7CisgICAgICAgICAgICAvKiBUaGUgbmV3IHNsb3QgZml0cyBpbnRvIHRoZSBleGlzdGluZyBvbmUgYW5kIGNvbWVzIHdpdGgKKyAgICAgICAgICAgICAqIGlkZW50aWNhbCBwYXJhbWV0ZXJzIC0gbm90aGluZyB0byBiZSBkb25lLiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb2xkID0gKm1lbTsKKworICAgICAgICAvKiB1bnJlZ2lzdGVyIHRoZSBvdmVybGFwcGluZyBzbG90ICovCisgICAgICAgIG1lbS0+bWVtb3J5X3NpemUgPSAwOworICAgICAgICBlcnIgPSBrdm1fc2V0X3VzZXJfbWVtb3J5X3JlZ2lvbihzLCBtZW0pOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciB1bnJlZ2lzdGVyaW5nIG92ZXJsYXBwaW5nIHNsb3Q6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgZGllKCJlcnJvciB1bnJlZ2lzdGVyaW5nIG92ZXJsYXBwaW5nIHNsb3QiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBXb3JrYXJvdW5kIGZvciBvbGRlciBLVk0gdmVyc2lvbnM6IHdlIGNhbid0IGpvaW4gc2xvdHMsIGV2ZW4gbm90IGJ5CisgICAgICAgICAqIHVucmVnaXN0ZXJpbmcgdGhlIHByZXZpb3VzIG9uZXMgYW5kIHRoZW4gcmVnaXN0ZXJpbmcgdGhlIGxhcmdlcgorICAgICAgICAgKiBzbG90LiBXZSBoYXZlIHRvIG1haW50YWluIHRoZSBleGlzdGluZyBmcmFnbWVudGF0aW9uLiBTaWdoLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIHdvcmthcm91bmQgYXNzdW1lcyB0aGF0IHRoZSBuZXcgc2xvdCBzdGFydHMgYXQgdGhlIHNhbWUKKyAgICAgICAgICogYWRkcmVzcyBhcyB0aGUgZmlyc3QgZXhpc3Rpbmcgb25lLiBJZiBub3Qgb3IgaWYgc29tZSBvdmVybGFwcGluZworICAgICAgICAgKiBzbG90IGNvbWVzIGFyb3VuZCBsYXRlciwgd2Ugd2lsbCBmYWlsIChub3Qgc2VlbiBpbiBwcmFjdGljZSBzbyBmYXIpCisgICAgICAgICAqIC0gYW5kIGFjdHVhbGx5IHJlcXVpcmUgYSByZWNlbnQgS1ZNIHZlcnNpb24uICovCisgICAgICAgIGlmIChzLT5icm9rZW5fc2V0X21lbV9yZWdpb24gJiYKKyAgICAgICAgICAgIG9sZC5zdGFydF9hZGRyID09IHN0YXJ0X2FkZHIgJiYgb2xkLm1lbW9yeV9zaXplIDwgc2l6ZSAmJgorICAgICAgICAgICAgZmxhZ3MgPCBJT19NRU1fVU5BU1NJR05FRCkgeworICAgICAgICAgICAgbWVtID0ga3ZtX2FsbG9jX3Nsb3Qocyk7CisgICAgICAgICAgICBtZW0tPm1lbW9yeV9zaXplID0gb2xkLm1lbW9yeV9zaXplOworICAgICAgICAgICAgbWVtLT5zdGFydF9hZGRyID0gb2xkLnN0YXJ0X2FkZHI7CisgICAgICAgICAgICBtZW0tPnBoeXNfb2Zmc2V0ID0gb2xkLnBoeXNfb2Zmc2V0OworICAgICAgICAgICAgbWVtLT5mbGFncyA9IDA7CisKKyAgICAgICAgICAgIGVyciA9IGt2bV9zZXRfdXNlcl9tZW1vcnlfcmVnaW9uKHMsIG1lbSk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgdXBkYXRpbmcgc2xvdDogJXNcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVycikpOworICAgICAgICAgICAgICAgIGRpZSgiZmFpbGVkIHRvIHNldCB1c2VyIG1lbW9yeSByZWdpb24gIgorICAgICAgICAgICAgICAgICAgICAiKG1vc3QgcHJvYmFibHkgb3V0IG9mIG1lbW9yeSkiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0X2FkZHIgKz0gb2xkLm1lbW9yeV9zaXplOworICAgICAgICAgICAgcGh5c19vZmZzZXQgKz0gb2xkLm1lbW9yeV9zaXplOworICAgICAgICAgICAgc2l6ZSAtPSBvbGQubWVtb3J5X3NpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlZ2lzdGVyIHByZWZpeCBzbG90ICovCisgICAgICAgIGlmIChvbGQuc3RhcnRfYWRkciA8IHN0YXJ0X2FkZHIpIHsKKyAgICAgICAgICAgIG1lbSA9IGt2bV9hbGxvY19zbG90KHMpOworICAgICAgICAgICAgbWVtLT5tZW1vcnlfc2l6ZSA9IHN0YXJ0X2FkZHIgLSBvbGQuc3RhcnRfYWRkcjsKKyAgICAgICAgICAgIG1lbS0+c3RhcnRfYWRkciA9IG9sZC5zdGFydF9hZGRyOworICAgICAgICAgICAgbWVtLT5waHlzX29mZnNldCA9IG9sZC5waHlzX29mZnNldDsKKyAgICAgICAgICAgIG1lbS0+ZmxhZ3MgPSAwOworCisgICAgICAgICAgICBlcnIgPSBrdm1fc2V0X3VzZXJfbWVtb3J5X3JlZ2lvbihzLCBtZW0pOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHJlZ2lzdGVyaW5nIHByZWZpeCBzbG90OiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgICAgICAgICAgZGllKCJmYWlsZWQgdG8gc2V0IHVzZXIgbWVtb3J5IHJlZ2lvbiAiCisgICAgICAgICAgICAgICAgICAgICIobW9zdCBwcm9iYWJseSBvdXQgb2YgbWVtb3J5KSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlZ2lzdGVyIHN1ZmZpeCBzbG90ICovCisgICAgICAgIGlmIChvbGQuc3RhcnRfYWRkciArIG9sZC5tZW1vcnlfc2l6ZSA+IHN0YXJ0X2FkZHIgKyBzaXplKSB7CisgICAgICAgICAgICByYW1fYWRkcl90IHNpemVfZGVsdGE7CisKKyAgICAgICAgICAgIG1lbSA9IGt2bV9hbGxvY19zbG90KHMpOworICAgICAgICAgICAgbWVtLT5zdGFydF9hZGRyID0gc3RhcnRfYWRkciArIHNpemU7CisgICAgICAgICAgICBzaXplX2RlbHRhID0gbWVtLT5zdGFydF9hZGRyIC0gb2xkLnN0YXJ0X2FkZHI7CisgICAgICAgICAgICBtZW0tPm1lbW9yeV9zaXplID0gb2xkLm1lbW9yeV9zaXplIC0gc2l6ZV9kZWx0YTsKKyAgICAgICAgICAgIG1lbS0+cGh5c19vZmZzZXQgPSBvbGQucGh5c19vZmZzZXQgKyBzaXplX2RlbHRhOworICAgICAgICAgICAgbWVtLT5mbGFncyA9IDA7CisKKyAgICAgICAgICAgIGVyciA9IGt2bV9zZXRfdXNlcl9tZW1vcnlfcmVnaW9uKHMsIG1lbSk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgcmVnaXN0ZXJpbmcgc3VmZml4IHNsb3Q6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVycm9yKC1lcnIpKTsKKyAgICAgICAgICAgICAgICBkaWUoImZhaWxlZCB0byBzZXQgdXNlciBtZW1vcnkgcmVnaW9uICIKKyAgICAgICAgICAgICAgICAgICAgIihtb3N0IHByb2JhYmx5IG91dCBvZiBtZW1vcnkpIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogaW4gY2FzZSB0aGUgS1ZNIGJ1ZyB3b3JrYXJvdW5kIGFscmVhZHkgImNvbnN1bWVkIiB0aGUgbmV3IHNsb3QgKi8KKyAgICBpZiAoIXNpemUpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEtWTSBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhpcyBtZW1vcnkgKi8KKyAgICBpZiAoZmxhZ3MgPj0gSU9fTUVNX1VOQVNTSUdORUQpCisgICAgICAgIHJldHVybjsKKworICAgIG1lbSA9IGt2bV9hbGxvY19zbG90KHMpOworICAgIG1lbS0+bWVtb3J5X3NpemUgPSBzaXplOworICAgIG1lbS0+c3RhcnRfYWRkciA9IHN0YXJ0X2FkZHI7CisgICAgbWVtLT5waHlzX29mZnNldCA9IHBoeXNfb2Zmc2V0OworICAgIG1lbS0+ZmxhZ3MgPSAwOworCisgICAgZXJyID0ga3ZtX3NldF91c2VyX21lbW9yeV9yZWdpb24ocywgbWVtKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHJlZ2lzdGVyaW5nIHNsb3Q6ICVzXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgIGRpZSgiRmFpbGVkIHRvIHNldCB1c2VyIG1lbW9yeSByZWdpb24gKG1vc3QgcHJvYmFibHkgb3V0IG9mIG1lbW9yeSkiLAorICAgICAgICAgICAgX19mdW5jX18pOworICAgIH0KK30KKworaW50IGt2bV9pb2N0bChLVk1TdGF0ZSAqcywgaW50IHR5cGUsIC4uLikKK3sKKyAgICBpbnQgcmV0OworICAgIHZvaWQgKmFyZzsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIHR5cGUpOworICAgIGFyZyA9IHZhX2FyZyhhcCwgdm9pZCAqKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIHR5cGUsIGFyZyk7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgcmV0ID0gLWVycm5vOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGt2bV92bV9pb2N0bChLVk1TdGF0ZSAqcywgaW50IHR5cGUsIC4uLikKK3sKKyAgICBpbnQgcmV0OworICAgIHZvaWQgKmFyZzsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIHR5cGUpOworICAgIGFyZyA9IHZhX2FyZyhhcCwgdm9pZCAqKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgcmV0ID0gaW9jdGwocy0+dm1mZCwgdHlwZSwgYXJnKTsKKyAgICBpZiAocmV0ID09IC0xKQorICAgICAgICByZXQgPSAtZXJybm87CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQga3ZtX3ZjcHVfaW9jdGwoQ1BVU3RhdGUgKmNwdSwgaW50IHR5cGUsIC4uLikKK3sKKyAgICBpbnQgcmV0OworICAgIHZvaWQgKmFyZzsKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIHR5cGUpOworICAgIGFyZyA9IHZhX2FyZyhhcCwgdm9pZCAqKTsKKyAgICB2YV9lbmQoYXApOworCisgICAgcmV0ID0gaW9jdGwoY3B1LT5rdm1fZmQsIHR5cGUsIGFyZyk7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgcmV0ID0gLWVycm5vOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGt2bV9oYXNfc3luY19tbXUodm9pZCkKK3sKKyNpZmRlZiBLVk1fQ0FQX1NZTkNfTU1VCisgICAgS1ZNU3RhdGUgKnMgPSBrdm1fc3RhdGU7CisKKyAgICByZXR1cm4ga3ZtX2NoZWNrX2V4dGVuc2lvbihzLCBLVk1fQ0FQX1NZTkNfTU1VKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKwordm9pZCBrdm1fc2V0dXBfZ3Vlc3RfbWVtb3J5KHZvaWQgKnN0YXJ0LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpZiAoIWt2bV9oYXNfc3luY19tbXUoKSkgeworI2lmZGVmIE1BRFZfRE9OVEZPUksKKyAgICAgICAgaW50IHJldCA9IG1hZHZpc2Uoc3RhcnQsIHNpemUsIE1BRFZfRE9OVEZPUkspOworCisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIHBlcnJvcigibWFkdmljZSIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIk5lZWQgTUFEVl9ET05URk9SSyBpbiBhYnNlbmNlIG9mIHN5bmNocm9ub3VzIEtWTSBNTVVcbiIpOworICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgfQorfQorCisjaWZkZWYgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcKK3N0cnVjdCBrdm1fc3dfYnJlYWtwb2ludCAqa3ZtX2ZpbmRfc3dfYnJlYWtwb2ludChDUFVTdGF0ZSAqY3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBwYykKK3sKKyAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmJwOworCisgICAgUVRBSUxRX0ZPUkVBQ0goYnAsICZjcHUtPmt2bV9zdGF0ZS0+a3ZtX3N3X2JyZWFrcG9pbnRzLCBlbnRyeSkgeworICAgICAgICBpZiAoYnAtPnBjID09IHBjKQorICAgICAgICAgICAgcmV0dXJuIGJwOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGt2bV9zd19icmVha3BvaW50c19hY3RpdmUoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICByZXR1cm4gIVFUQUlMUV9FTVBUWSgmY3B1LT5rdm1fc3RhdGUtPmt2bV9zd19icmVha3BvaW50cyk7Cit9CisKK2ludCBrdm1fdXBkYXRlX2d1ZXN0X2RlYnVnKENQVVN0YXRlICpjcHUsIHVuc2lnbmVkIGxvbmcgcmVpbmplY3RfdHJhcCkKK3sKKyAgICBzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnIGRiZzsKKworICAgIGRiZy5jb250cm9sID0gMDsKKyAgICBpZiAoY3B1LT5zaW5nbGVzdGVwX2VuYWJsZWQpCisgICAgICAgIGRiZy5jb250cm9sID0gS1ZNX0dVRVNUREJHX0VOQUJMRSB8IEtWTV9HVUVTVERCR19TSU5HTEVTVEVQOworCisgICAga3ZtX2FyY2hfdXBkYXRlX2d1ZXN0X2RlYnVnKGNwdSwgJmRiZyk7CisgICAgZGJnLmNvbnRyb2wgfD0gcmVpbmplY3RfdHJhcDsKKworICAgIHJldHVybiBrdm1fdmNwdV9pb2N0bChjcHUsIEtWTV9TRVRfR1VFU1RfREVCVUcsICZkYmcpOworfQorCitpbnQga3ZtX2luc2VydF9icmVha3BvaW50KENQVVN0YXRlICpjcHUsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbGVuLCBpbnQgdHlwZSkKK3sKKyAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmJwOworICAgIGludCBlcnI7CisKKyAgICBpZiAodHlwZSA9PSBHREJfQlJFQUtQT0lOVF9TVykgeworICAgICAgICBicCA9IGt2bV9maW5kX3N3X2JyZWFrcG9pbnQoY3B1LCBhZGRyKTsKKyAgICAgICAgaWYgKGJwKSB7CisgICAgICAgICAgICBicC0+dXNlX2NvdW50Kys7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGJwID0gZ19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fc3dfYnJlYWtwb2ludCkpOworICAgICAgICBpZiAoIWJwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICAgYnAtPnBjID0gYWRkcjsKKyAgICAgICAgYnAtPnVzZV9jb3VudCA9IDE7CisgICAgICAgIGVyciA9IGt2bV9hcmNoX2luc2VydF9zd19icmVha3BvaW50KGNwdSwgYnApOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBmcmVlKGJwKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBRVEFJTFFfSU5TRVJUX0hFQUQoJmNwdS0+a3ZtX3N0YXRlLT5rdm1fc3dfYnJlYWtwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLCBlbnRyeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0ga3ZtX2FyY2hfaW5zZXJ0X2h3X2JyZWFrcG9pbnQoYWRkciwgbGVuLCB0eXBlKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGVyciA9IGt2bV91cGRhdGVfZ3Vlc3RfZGVidWcoY3B1LCAwKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQga3ZtX3JlbW92ZV9icmVha3BvaW50KENQVVN0YXRlICpjcHUsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbGVuLCBpbnQgdHlwZSkKK3sKKyAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmJwOworICAgIGludCBlcnI7CisKKyAgICBpZiAodHlwZSA9PSBHREJfQlJFQUtQT0lOVF9TVykgeworICAgICAgICBicCA9IGt2bV9maW5kX3N3X2JyZWFrcG9pbnQoY3B1LCBhZGRyKTsKKyAgICAgICAgaWYgKCFicCkKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgICAgIGlmIChicC0+dXNlX2NvdW50ID4gMSkgeworICAgICAgICAgICAgYnAtPnVzZV9jb3VudC0tOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBrdm1fYXJjaF9yZW1vdmVfc3dfYnJlYWtwb2ludChjcHUsIGJwKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgUVRBSUxRX1JFTU9WRSgmY3B1LT5rdm1fc3RhdGUtPmt2bV9zd19icmVha3BvaW50cywgYnAsIGVudHJ5KTsKKyAgICAgICAgZ19mcmVlKGJwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBrdm1fYXJjaF9yZW1vdmVfaHdfYnJlYWtwb2ludChhZGRyLCBsZW4sIHR5cGUpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBDUFVfRk9SRUFDSChjcHUpIHsKKyAgICAgICAgZXJyID0ga3ZtX3VwZGF0ZV9ndWVzdF9kZWJ1ZyhjcHUsIDApOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga3ZtX3JlbW92ZV9hbGxfYnJlYWtwb2ludHMoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBzdHJ1Y3Qga3ZtX3N3X2JyZWFrcG9pbnQgKmJwLCAqbmV4dDsKKyAgICBLVk1TdGF0ZSAqcyA9IGNwdS0+a3ZtX3N0YXRlOworCisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShicCwgJnMtPmt2bV9zd19icmVha3BvaW50cywgZW50cnksIG5leHQpIHsKKyAgICAgICAgaWYgKGt2bV9hcmNoX3JlbW92ZV9zd19icmVha3BvaW50KGNwdSwgYnApICE9IDApIHsKKyAgICAgICAgICAgIC8qIFRyeSBoYXJkZXIgdG8gZmluZCBhIENQVSB0aGF0IGN1cnJlbnRseSBzZWVzIHRoZSBicmVha3BvaW50LiAqLworICAgICAgICAgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgICAgICAgICAgaWYgKGt2bV9hcmNoX3JlbW92ZV9zd19icmVha3BvaW50KGNwdSwgYnApID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGt2bV9hcmNoX3JlbW92ZV9hbGxfaHdfYnJlYWtwb2ludHMoKTsKKworICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICBrdm1fdXBkYXRlX2d1ZXN0X2RlYnVnKGNwdSwgMCk7CisgICAgfQorfQorCisjZWxzZSAvKiAhS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgKi8KKworaW50IGt2bV91cGRhdGVfZ3Vlc3RfZGVidWcoQ1BVU3RhdGUgKmNwdSwgdW5zaWduZWQgbG9uZyByZWluamVjdF90cmFwKQoreworICAgIHJldHVybiAtRUlOVkFMOworfQorCitpbnQga3ZtX2luc2VydF9icmVha3BvaW50KENQVVN0YXRlICpjcHUsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbGVuLCBpbnQgdHlwZSkKK3sKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworaW50IGt2bV9yZW1vdmVfYnJlYWtwb2ludChDUFVTdGF0ZSAqY3B1LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGxlbiwgaW50IHR5cGUpCit7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQga3ZtX3JlbW92ZV9hbGxfYnJlYWtwb2ludHMoQ1BVU3RhdGUgKmNwdSkKK3sKK30KKyNlbmRpZiAvKiAhS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEva3ZtLWFuZHJvaWQuYyBiL2FuZHJvaWQvcWVtdTEva3ZtLWFuZHJvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBhNTViCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9rdm0tYW5kcm9pZC5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgImFuZHJvaWQvZW11bGF0aW9uL2t2bV9lbnYuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2t2bS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKworI2RlZmluZSBEKC4uLikgVkVSQk9TRV9QUklOVChpbml0LF9fVkFfQVJHU19fKQorCisvKiBBIHNpbXBsZSByb3V0aW5lIHVzZWQgdG8gY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIHRoZSBwcm9ncmFtIHVuZGVyIEtWTS4KKyAqIFdlIHNpbXBseSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBrdm0gZHJpdmVyIGlzIGxvYWRlZCBhbmQgdGhhdCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZpbGUgaXMgYWNjZXNzaWJsZSBieSB0aGUgdXNlci4KKyAqLworCisjaWZuZGVmIF9fbGludXhfXworI2Vycm9yICJUaGlzIGZpbGUgc2hvdWxkIG9ubHkgYmUgY29tcGlsZWQgdW5kZXIgbGludXgiCisjZW5kaWYKKworaW50Citrdm1fY2hlY2tfYWxsb3dlZCh2b2lkKQoreworCisgICAgY2hhcioga3ZtX2RldmljZSA9IGdldGVudihLVk1fREVWSUNFX05BTUVfRU5WKTsKKyAgICBpZiAoTlVMTCA9PSBrdm1fZGV2aWNlKSB7CisgICAgICBrdm1fZGV2aWNlID0gIi9kZXYva3ZtIjsKKyAgICB9CisgICAgLyogSXMgdGhlcmUgYSAvZGV2L2t2bSBkZXZpY2UgZmlsZSBoZXJlPyAqLworICAgIGlmIChhY2Nlc3Moa3ZtX2RldmljZSxGX09LKSkgeworICAgICAgICAvKiBubyBuZWVkIHRvIHByaW50IGEgd2FybmluZyBoZXJlICovCisgICAgICAgIEQoIk5vIGt2bSBkZXZpY2UgZmlsZSBkZXRlY3RlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBDYW4gd2UgYWNjZXNzIGl0PyAqLworICAgIGlmIChhY2Nlc3Moa3ZtX2RldmljZSxSX09LKSkgeworICAgICAgICBEKCJLVk0gZGV2aWNlIGZpbGUgaXMgbm90IHJlYWRhYmxlIGZvciB0aGlzIHVzZXIuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEQoIktWTSBtb2RlIGF1dG8tZW5hYmxlZCEiKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9sb2ctcm90YXRlLWFuZHJvaWQuYyBiL2FuZHJvaWQvcWVtdTEvbG9nLXJvdGF0ZS1hbmRyb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1NjVlYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvbG9nLXJvdGF0ZS1hbmRyb2lkLmMKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisvLyBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorLy8gbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjaW5jbHVkZSAiYW5kcm9pZC9sb2ctcm90YXRlLmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorI2luY2x1ZGUgInNsaXJwLWFuZHJvaWQvbGlic2xpcnAuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgX1dJTjMyCisKK3ZvaWQgcWVtdV9sb2dfcm90YXRpb25faW5pdCh2b2lkKSB7CisgICAgLy8gTm90aGluZyB0byBkbyBvbiBXaW4zMiBmb3Igbm93LgorfQorCit2b2lkIHFlbXVfbG9nX3JvdGF0aW9uX3BvbGwodm9pZCkgeworICAgIC8vIE5vdGhpbmcgdG8gZG8gb24gV2luMzIgZm9yIG5vdy4KK30KKworI2Vsc2UgLy8gIV9XSU4zMgorCisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorCitzdGF0aWMgaW50IHJvdGF0ZV9sb2dzX3JlcXVlc3RlZCA9IDA7CisKK3N0YXRpYyB2b2lkIHJvdGF0ZV9xZW11X2xvZ3NfaGFuZGxlcihpbnQgc2lnbnVtKSB7CisgIHJvdGF0ZV9sb2dzX3JlcXVlc3RlZCA9IDE7Cit9CisKK3ZvaWQgcWVtdV9sb2dfcm90YXRpb25faW5pdCh2b2lkKSB7CisgIC8vIEluc3RhbGwgU0lHVVNSMSBzaWduYWwgaGFuZGxlci4KKyAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgIHNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKyAgYWN0LnNhX2ZsYWdzID0gMDsKKyAgYWN0LnNhX2hhbmRsZXIgPSByb3RhdGVfcWVtdV9sb2dzX2hhbmRsZXI7CisgIGlmIChzaWdhY3Rpb24oU0lHVVNSMSwgJmFjdCwgTlVMTCkgPT0gLTEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZXR1cCBTSUdVU1IxIGhhbmRsZXIgdG8gY2xlYXIgUWVtdSBsb2dzXG4iKTsKKyAgICBleGl0KC0xKTsKKyAgfQorfQorCisKKy8vIENsZWFycyB0aGUgcGFzc2VkIHFlbXUgbG9nIHdoZW4gdGhlIHJvdGF0ZV9sb2dzX3JlcXVlc3RlZAorLy8gaXMgc2V0LiBXZSBuZWVkIHRvIGNsZWFyIHRoZSBsb2dzIGJldHdlZW4gdGhlIHRhc2tzIHRoYXQgZG8gbm90CisvLyByZXF1aXJlIHJlc3RhcnRpbmcgUWVtdS4KK3N0YXRpYyBGSUxFKiByb3RhdGVfbG9nKEZJTEUqIG9sZF9sb2dfZmQsIGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7CisgIEZJTEUqIG5ld19sb2dfZmQgPSBOVUxMOworICBpZiAob2xkX2xvZ19mZCkgeworICAgIGlmIChmY2xvc2Uob2xkX2xvZ19mZCkgPT0gLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGNsb3NlIG9sZF9sb2cgZmRcbiIpOworICAgICAgZXhpdChlcnJubyk7CisgICAgfQorICB9CisKKyAgaWYgKCFmaWxlbmFtZSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVGhlIGxvZyBmaWxlbmFtZSB0byBiZSByb3RhdGVkIGlzIG5vdCBwcm92aWRlZCIpOworICAgIGV4aXQoLTEpOworICB9CisKKyAgbmV3X2xvZ19mZCA9IGZvcGVuKGZpbGVuYW1lICwgIndiKyIpOworICBpZiAobmV3X2xvZ19mZCA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiB0aGUgbG9nIGZpbGU6ICVzIGZvciB3cml0ZS5cbiIsCisgICAgICAgICAgICBmaWxlbmFtZSk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIHJldHVybiBuZXdfbG9nX2ZkOworfQorCisKK3ZvaWQgcWVtdV9sb2dfcm90YXRpb25fcG9sbCh2b2lkKSB7CisgICAgaWYgKCFyb3RhdGVfbG9nc19yZXF1ZXN0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIEZJTEUqIG5ld19kbnNfbG9nX2ZkID0gcm90YXRlX2xvZyhnZXRfc2xpcnBfZG5zX2xvZ19mZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnNfbG9nX2ZpbGVuYW1lKTsKKyAgICBGSUxFKiBuZXdfZHJvcF9sb2dfZmQgPSByb3RhdGVfbG9nKGdldF9zbGlycF9kcm9wX2xvZ19mZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF9sb2dfZmlsZW5hbWUpOworICAgIHNsaXJwX2Ruc19sb2dfZmQobmV3X2Ruc19sb2dfZmQpOworICAgIHNsaXJwX2Ryb3BfbG9nX2ZkKG5ld19kcm9wX2xvZ19mZCk7CisgICAgcm90YXRlX2xvZ3NfcmVxdWVzdGVkID0gMDsKK30KKworI2VuZGlmICAvLyAhX1dJTjMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL21haW4tbG9vcC5jIGIvYW5kcm9pZC9xZW11MS9tYWluLWxvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2NiZjZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9tYWluLWxvb3AuYwpAQCAtMCwwICsxLDEwMjMgQEAKKy8qCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9jaGFycGlwZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbG9nLXJvdGF0ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc25hcGhvc3QtYW5kcm9pZC5oIgorI2luY2x1ZGUgImJsb2NrL2Fpby5oIgorI2luY2x1ZGUgImV4ZWMvaGF4LmgiCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAic2xpcnAtYW5kcm9pZC9saWJzbGlycC5oIgorI2luY2x1ZGUgInN5c2VtdS9jcHVzLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxtbXN5c3RlbS5oPgorI2VuZGlmCisKK2ludCBxZW11X2NhbGN1bGF0ZV90aW1lb3V0KHZvaWQpOworCisvKiBDb252ZXJzaW9uIGZhY3RvciBmcm9tIGVtdWxhdGVkIGluc3RydWN0aW9ucyB0byB2aXJ0dWFsIGNsb2NrIHRpY2tzLiAgKi8KK2ludCBpY291bnRfdGltZV9zaGlmdDsKKy8qIEFyYml0cmFyaWx5IHBpY2sgMU1JUFMgYXMgdGhlIG1pbmltdW0gYWxsb3dhYmxlIHNwZWVkLiAgKi8KKyNkZWZpbmUgTUFYX0lDT1VOVF9TSElGVCAxMAorLyogQ29tcGVuc2F0ZSBmb3IgdmFyeWluZyBndWVzdCBleGVjdXRpb24gc3BlZWQuICAqLworaW50NjRfdCBxZW11X2ljb3VudF9iaWFzOworc3RhdGljIFFFTVVUaW1lciAqaWNvdW50X3J0X3RpbWVyOworc3RhdGljIFFFTVVUaW1lciAqaWNvdW50X3ZtX3RpbWVyOworCisjaWZuZGVmIF9XSU4zMgorc3RhdGljIGludCBpb190aHJlYWRfZmQgPSAtMTsKKworc3RhdGljIHZvaWQgcWVtdV9ldmVudF9yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpbnQgZmQgPSAodW5zaWduZWQgbG9uZylvcGFxdWU7CisgICAgc3NpemVfdCBsZW47CisKKyAgICAvKiBEcmFpbiB0aGUgbm90aWZ5IHBpcGUgKi8KKyAgICBkbyB7CisgICAgICAgIGNoYXIgYnVmZmVyWzUxMl07CisgICAgICAgIGxlbiA9IHJlYWQoZmQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIH0gd2hpbGUgKChsZW4gPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHx8IGxlbiA+IDApOworfQorCitzdGF0aWMgaW50IHFlbXVfbWFpbl9sb29wX2V2ZW50X2luaXQodm9pZCkKK3sKKyAgICBpbnQgZXJyOworICAgIGludCBmZHNbMl07CisKKyAgICBlcnIgPSBwaXBlKGZkcyk7CisgICAgaWYgKGVyciA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIGVyciA9IGZjbnRsX3NldGZsKGZkc1swXSwgT19OT05CTE9DSyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IGZjbnRsX3NldGZsKGZkc1sxXSwgT19OT05CTE9DSyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKGZkc1swXSwgTlVMTCwgcWVtdV9ldmVudF9yZWFkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpZmRzWzBdKTsKKworICAgIGlvX3RocmVhZF9mZCA9IGZkc1sxXTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBjbG9zZShmZHNbMF0pOworICAgIGNsb3NlKGZkc1sxXSk7CisgICAgcmV0dXJuIGVycjsKK30KKyNlbHNlCitIQU5ETEUgcWVtdV9ldmVudF9oYW5kbGU7CisKK3N0YXRpYyB2b2lkIGR1bW15X2V2ZW50X2hhbmRsZXIodm9pZCAqb3BhcXVlKQoreworfQorCitzdGF0aWMgaW50IHFlbXVfbWFpbl9sb29wX2V2ZW50X2luaXQodm9pZCkKK3sKKyAgICBxZW11X2V2ZW50X2hhbmRsZSA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKCFxZW11X2V2ZW50X2hhbmRsZSkgeworICAgICAgICBwZXJyb3IoIkZhaWxlZCBDcmVhdGVFdmVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHFlbXVfYWRkX3dhaXRfb2JqZWN0KHFlbXVfZXZlbnRfaGFuZGxlLCBkdW1teV9ldmVudF9oYW5kbGVyLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgcWVtdV9pbml0X21haW5fbG9vcCh2b2lkKQoreworICAgIHJldHVybiBxZW11X21haW5fbG9vcF9ldmVudF9pbml0KCk7Cit9CisKKyNpZm5kZWYgX1dJTjMyCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvc19ob3N0X21haW5fbG9vcF93YWl0KGludCAqdGltZW91dCkKK3sKK30KKworI2Vsc2UgIC8vIF9XSU4zMgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQb2xsaW5nIGhhbmRsaW5nICovCisKK3R5cGVkZWYgc3RydWN0IFBvbGxpbmdFbnRyeSB7CisgICAgUG9sbGluZ0Z1bmMgKmZ1bmM7CisgICAgdm9pZCAqb3BhcXVlOworICAgIHN0cnVjdCBQb2xsaW5nRW50cnkgKm5leHQ7Cit9IFBvbGxpbmdFbnRyeTsKKworc3RhdGljIFBvbGxpbmdFbnRyeSAqZmlyc3RfcG9sbGluZ19lbnRyeTsKKworaW50IHFlbXVfYWRkX3BvbGxpbmdfY2IoUG9sbGluZ0Z1bmMgKmZ1bmMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQb2xsaW5nRW50cnkgKipwcGUsICpwZTsKKyAgICBwZSA9IGdfbWFsbG9jMChzaXplb2YoUG9sbGluZ0VudHJ5KSk7CisgICAgcGUtPmZ1bmMgPSBmdW5jOworICAgIHBlLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgZm9yKHBwZSA9ICZmaXJzdF9wb2xsaW5nX2VudHJ5OyAqcHBlICE9IE5VTEw7IHBwZSA9ICYoKnBwZSktPm5leHQpOworICAgICpwcGUgPSBwZTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBxZW11X2RlbF9wb2xsaW5nX2NiKFBvbGxpbmdGdW5jICpmdW5jLCB2b2lkICpvcGFxdWUpCit7CisgICAgUG9sbGluZ0VudHJ5ICoqcHBlLCAqcGU7CisgICAgZm9yKHBwZSA9ICZmaXJzdF9wb2xsaW5nX2VudHJ5OyAqcHBlICE9IE5VTEw7IHBwZSA9ICYoKnBwZSktPm5leHQpIHsKKyAgICAgICAgcGUgPSAqcHBlOworICAgICAgICBpZiAocGUtPmZ1bmMgPT0gZnVuYyAmJiBwZS0+b3BhcXVlID09IG9wYXF1ZSkgeworICAgICAgICAgICAgKnBwZSA9IHBlLT5uZXh0OworICAgICAgICAgICAgZ19mcmVlKHBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBXYWl0IG9iamVjdHMgc3VwcG9ydCAqLwordHlwZWRlZiBzdHJ1Y3QgV2FpdE9iamVjdHMgeworICAgIGludCBudW07CisgICAgSEFORExFIGV2ZW50c1tNQVhJTVVNX1dBSVRfT0JKRUNUUyArIDFdOworICAgIFdhaXRPYmplY3RGdW5jICpmdW5jW01BWElNVU1fV0FJVF9PQkpFQ1RTICsgMV07CisgICAgdm9pZCAqb3BhcXVlW01BWElNVU1fV0FJVF9PQkpFQ1RTICsgMV07Cit9IFdhaXRPYmplY3RzOworCitzdGF0aWMgV2FpdE9iamVjdHMgd2FpdF9vYmplY3RzID0gezB9OworCitpbnQgcWVtdV9hZGRfd2FpdF9vYmplY3QoSEFORExFIGhhbmRsZSwgV2FpdE9iamVjdEZ1bmMgKmZ1bmMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBXYWl0T2JqZWN0cyAqdyA9ICZ3YWl0X29iamVjdHM7CisKKyAgICBpZiAody0+bnVtID49IE1BWElNVU1fV0FJVF9PQkpFQ1RTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgdy0+ZXZlbnRzW3ctPm51bV0gPSBoYW5kbGU7CisgICAgdy0+ZnVuY1t3LT5udW1dID0gZnVuYzsKKyAgICB3LT5vcGFxdWVbdy0+bnVtXSA9IG9wYXF1ZTsKKyAgICB3LT5udW0rKzsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBxZW11X2RlbF93YWl0X29iamVjdChIQU5ETEUgaGFuZGxlLCBXYWl0T2JqZWN0RnVuYyAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIGludCBpLCBmb3VuZDsKKyAgICBXYWl0T2JqZWN0cyAqdyA9ICZ3YWl0X29iamVjdHM7CisKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHctPm51bTsgaSsrKSB7CisgICAgICAgIGlmICh3LT5ldmVudHNbaV0gPT0gaGFuZGxlKQorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIHctPmV2ZW50c1tpXSA9IHctPmV2ZW50c1tpICsgMV07CisgICAgICAgICAgICB3LT5mdW5jW2ldID0gdy0+ZnVuY1tpICsgMV07CisgICAgICAgICAgICB3LT5vcGFxdWVbaV0gPSB3LT5vcGFxdWVbaSArIDFdOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmb3VuZCkKKyAgICAgICAgdy0+bnVtLS07Cit9CisKK3ZvaWQgb3NfaG9zdF9tYWluX2xvb3Bfd2FpdChpbnQgKnRpbWVvdXQpCit7CisgICAgaW50IHJldCwgcmV0MiwgaTsKKyAgICBQb2xsaW5nRW50cnkgKnBlOworCisgICAgLyogWFhYOiBuZWVkIHRvIHN1cHByZXNzIHBvbGxpbmcgYnkgYmV0dGVyIHVzaW5nIHdpbjMyIGV2ZW50cyAqLworICAgIHJldCA9IDA7CisgICAgZm9yKHBlID0gZmlyc3RfcG9sbGluZ19lbnRyeTsgcGUgIT0gTlVMTDsgcGUgPSBwZS0+bmV4dCkgeworICAgICAgICByZXQgfD0gcGUtPmZ1bmMocGUtPm9wYXF1ZSk7CisgICAgfQorICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBXYWl0T2JqZWN0cyAqdyA9ICZ3YWl0X29iamVjdHM7CisKKyAgICAgICAgcWVtdV9tdXRleF91bmxvY2tfaW90aHJlYWQoKTsKKyAgICAgICAgcmV0ID0gV2FpdEZvck11bHRpcGxlT2JqZWN0cyh3LT5udW0sIHctPmV2ZW50cywgRkFMU0UsICp0aW1lb3V0KTsKKyAgICAgICAgcWVtdV9tdXRleF9sb2NrX2lvdGhyZWFkKCk7CisgICAgICAgIGlmIChXQUlUX09CSkVDVF8wICsgMCA8PSByZXQgJiYgcmV0IDw9IFdBSVRfT0JKRUNUXzAgKyB3LT5udW0gLSAxKSB7CisgICAgICAgICAgICBpZiAody0+ZnVuY1tyZXQgLSBXQUlUX09CSkVDVF8wXSkKKyAgICAgICAgICAgICAgICB3LT5mdW5jW3JldCAtIFdBSVRfT0JKRUNUXzBdKHctPm9wYXF1ZVtyZXQgLSBXQUlUX09CSkVDVF8wXSk7CisKKyAgICAgICAgICAgIC8qIENoZWNrIGZvciBhZGRpdGlvbmFsIHNpZ25hbGVkIGV2ZW50cyAqLworICAgICAgICAgICAgZm9yKGkgPSAocmV0IC0gV0FJVF9PQkpFQ1RfMCArIDEpOyBpIDwgdy0+bnVtOyBpKyspIHsKKworICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIGV2ZW50IGlzIHNpZ25hbGVkICovCisgICAgICAgICAgICAgICAgcmV0MiA9IFdhaXRGb3JTaW5nbGVPYmplY3Qody0+ZXZlbnRzW2ldLCAwKTsKKyAgICAgICAgICAgICAgICBpZihyZXQyID09IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHctPmZ1bmNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICB3LT5mdW5jW2ldKHctPm9wYXF1ZVtpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQyID09IFdBSVRfVElNRU9VVCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRGb3JTaW5nbGVPYmplY3QgZXJyb3IgJWQgJWRcbiIsIGksIGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSBXQUlUX1RJTUVPVVQpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzIGVycm9yICVkICVkXG4iLCByZXQsIGVycik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqdGltZW91dCA9IDA7Cit9CisKKyNlbmRpZiAgLy8gX1dJTjMyCisKK3N0YXRpYyB2b2lkIHFlbXVfcnVuX2FsYXJtX3RpbWVyKHZvaWQpOyAgLy8gZm9yd2FyZAorCit2b2lkIG1haW5fbG9vcF93YWl0KGludCB0aW1lb3V0KQoreworICAgIGZkX3NldCByZmRzLCB3ZmRzLCB4ZmRzOworICAgIGludCByZXQsIG5mZHM7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisKKyAgICBxZW11X2JoX3VwZGF0ZV90aW1lb3V0KCZ0aW1lb3V0KTsKKworICAgIG9zX2hvc3RfbWFpbl9sb29wX3dhaXQoJnRpbWVvdXQpOworCisgICAgdHYudHZfc2VjID0gdGltZW91dCAvIDEwMDA7CisgICAgdHYudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworCisgICAgLyogcG9sbCBhbnkgZXZlbnRzICovCisKKyAgICAvKiBYWFg6IHNlcGFyYXRlIGRldmljZSBoYW5kbGVycyBmcm9tIHN5c3RlbSBvbmVzICovCisgICAgbmZkcyA9IC0xOworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1pFUk8oJndmZHMpOworICAgIEZEX1pFUk8oJnhmZHMpOworICAgIHFlbXVfaW9oYW5kbGVyX2ZpbGwoJm5mZHMsICZyZmRzLCAmd2ZkcywgJnhmZHMpOworICAgIGlmIChzbGlycF9pc19pbml0ZWQoKSkgeworICAgICAgICBzbGlycF9zZWxlY3RfZmlsbCgmbmZkcywgJnJmZHMsICZ3ZmRzLCAmeGZkcyk7CisgICAgfQorCisgICAgcWVtdV9tdXRleF91bmxvY2tfaW90aHJlYWQoKTsKKyAgICByZXQgPSBzZWxlY3QobmZkcyArIDEsICZyZmRzLCAmd2ZkcywgJnhmZHMsICZ0dik7CisgICAgcWVtdV9tdXRleF9sb2NrX2lvdGhyZWFkKCk7CisgICAgcWVtdV9pb2hhbmRsZXJfcG9sbCgmcmZkcywgJndmZHMsICZ4ZmRzLCByZXQpOworICAgIGlmIChzbGlycF9pc19pbml0ZWQoKSkgeworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgRkRfWkVSTygmcmZkcyk7CisgICAgICAgICAgICBGRF9aRVJPKCZ3ZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8oJnhmZHMpOworICAgICAgICB9CisgICAgICAgIHNsaXJwX3NlbGVjdF9wb2xsKCZyZmRzLCAmd2ZkcywgJnhmZHMpOworICAgIH0KKyAgICBjaGFycGlwZV9wb2xsKCk7CisKKyAgICBxZW11X2Nsb2NrX3J1bl9hbGxfdGltZXJzKCk7CisKKyAgICBxZW11X3J1bl9hbGFybV90aW1lcigpOworCisgICAgLyogQ2hlY2sgYm90dG9tLWhhbHZlcyBsYXN0IGluIGNhc2UgYW55IG9mIHRoZSBlYXJsaWVyIGV2ZW50cyB0cmlnZ2VyZWQKKyAgICAgICB0aGVtLiAgKi8KKyAgICBxZW11X2JoX3BvbGwoKTsKKworfQorCit2b2lkIG1haW5fbG9vcCh2b2lkKQoreworICAgIGludCByOworCisjaWZkZWYgQ09ORklHX0hBWAorICAgIGlmIChoYXhfZW5hYmxlZCgpKSB7CisgICAgICAgIGlmIChoYXhfc3luY192Y3B1cygpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnRlcm5hbCBlcnJvcjogaGF4IHN5bmMgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgZm9yICg7OykgeworICAgICAgICBkbyB7CisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgICAgICAgICBpbnQ2NF90IHRpOworI2VuZGlmCisgICAgICAgICAgICB0Y2dfY3B1X2V4ZWMoKTsKKyNpZmRlZiBDT05GSUdfUFJPRklMRVIKKyAgICAgICAgICAgIHRpID0gcHJvZmlsZV9nZXRjbG9jaygpOworI2VuZGlmCisgICAgICAgICAgICBtYWluX2xvb3Bfd2FpdChxZW11X2NhbGN1bGF0ZV90aW1lb3V0KCkpOworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgICAgICAgICAgZGV2X3RpbWUgKz0gcHJvZmlsZV9nZXRjbG9jaygpIC0gdGk7CisjZW5kaWYKKworICAgICAgICAgICAgcWVtdV9sb2dfcm90YXRpb25fcG9sbCgpOworCisgICAgICAgIH0gd2hpbGUgKHZtX2Nhbl9ydW4oKSk7CisKKyAgICAgICAgaWYgKHFlbXVfZGVidWdfcmVxdWVzdGVkKCkpCisgICAgICAgICAgICB2bV9zdG9wKEVYQ1BfREVCVUcpOworICAgICAgICBpZiAocWVtdV9zaHV0ZG93bl9yZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgaWYgKG5vX3NodXRkb3duKSB7CisgICAgICAgICAgICAgICAgdm1fc3RvcCgwKTsKKyAgICAgICAgICAgICAgICBub19zaHV0ZG93biA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzYXZldm1fb25fZXhpdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAvKiBQcmlvciB0byBzYXZpbmcgVk0gdG8gdGhlIHNuYXBzaG90IGZpbGUsIHNhdmUgSFcgY29uZmlnCisgICAgICAgICAgICAgICAgICAgKiBzZXR0aW5ncyBmb3IgdGhhdCBWTSwgc28gd2UgY2FuIG1hdGNoIHRoZW0gd2hlbiBWTSBnZXRzCisgICAgICAgICAgICAgICAgICAgKiBsb2FkZWQgZnJvbSB0aGUgc25hcHNob3QuICovCisgICAgICAgICAgICAgICAgICBzbmFwaG9zdF9zYXZlX2NvbmZpZyhzYXZldm1fb25fZXhpdCk7CisgICAgICAgICAgICAgICAgICBkb19zYXZldm0oY3VyX21vbiwgc2F2ZXZtX29uX2V4aXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocWVtdV9yZXNldF9yZXF1ZXN0ZWQoKSkgeworICAgICAgICAgICAgcGF1c2VfYWxsX3ZjcHVzKCk7CisgICAgICAgICAgICBxZW11X3N5c3RlbV9yZXNldCgpOworICAgICAgICAgICAgcmVzdW1lX2FsbF92Y3B1cygpOworICAgICAgICB9CisgICAgICAgIGlmIChxZW11X3Bvd2VyZG93bl9yZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Bvd2VyZG93bigpOworICAgICAgICBpZiAoKHIgPSBxZW11X3Ztc3RvcF9yZXF1ZXN0ZWQoKSkpCisgICAgICAgICAgICB2bV9zdG9wKHIpOworICAgIH0KKyAgICBwYXVzZV9hbGxfdmNwdXMoKTsKK30KKworLyogQ29ycmVsYXRpb24gYmV0d2VlbiByZWFsIGFuZCB2aXJ0dWFsIHRpbWUgaXMgYWx3YXlzIGdvaW5nIHRvIGJlCisgICBmYWlybHkgYXBwcm94aW1hdGUsIHNvIGlnbm9yZSBzbWFsbCB2YXJpYXRpb24uCisgICBXaGVuIHRoZSBndWVzdCBpcyBpZGxlIHJlYWwgYW5kIHZpcnR1YWwgdGltZSB3aWxsIGJlIGFsaWduZWQgaW4KKyAgIHRoZSBJTyB3YWl0IGxvb3AuICAqLworI2RlZmluZSBJQ09VTlRfV09CQkxFIChnZXRfdGlja3NfcGVyX3NlYygpIC8gMTApCisKK3N0YXRpYyB2b2lkIGljb3VudF9hZGp1c3Qodm9pZCkKK3sKKyAgICBpbnQ2NF90IGN1cl90aW1lOworICAgIGludDY0X3QgY3VyX2ljb3VudDsKKyAgICBpbnQ2NF90IGRlbHRhOworICAgIHN0YXRpYyBpbnQ2NF90IGxhc3RfZGVsdGE7CisgICAgLyogSWYgdGhlIFZNIGlzIG5vdCBydW5uaW5nLCB0aGVuIGRvIG5vdGhpbmcuICAqLworICAgIGlmICghdm1fcnVubmluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgY3VyX3RpbWUgPSBjcHVfZ2V0X2Nsb2NrKCk7CisgICAgY3VyX2ljb3VudCA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisgICAgZGVsdGEgPSBjdXJfaWNvdW50IC0gY3VyX3RpbWU7CisgICAgLyogRklYTUU6IFRoaXMgaXMgYSB2ZXJ5IGNydWRlIGFsZ29yaXRobSwgc29tZXdoYXQgcHJvbmUgdG8gb3NjaWxsYXRpb24uICAqLworICAgIGlmIChkZWx0YSA+IDAKKyAgICAgICAgJiYgbGFzdF9kZWx0YSArIElDT1VOVF9XT0JCTEUgPCBkZWx0YSAqIDIKKyAgICAgICAgJiYgaWNvdW50X3RpbWVfc2hpZnQgPiAwKSB7CisgICAgICAgIC8qIFRoZSBndWVzdCBpcyBnZXR0aW5nIHRvbyBmYXIgYWhlYWQuICBTbG93IHRpbWUgZG93bi4gICovCisgICAgICAgIGljb3VudF90aW1lX3NoaWZ0LS07CisgICAgfQorICAgIGlmIChkZWx0YSA8IDAKKyAgICAgICAgJiYgbGFzdF9kZWx0YSAtIElDT1VOVF9XT0JCTEUgPiBkZWx0YSAqIDIKKyAgICAgICAgJiYgaWNvdW50X3RpbWVfc2hpZnQgPCBNQVhfSUNPVU5UX1NISUZUKSB7CisgICAgICAgIC8qIFRoZSBndWVzdCBpcyBnZXR0aW5nIHRvbyBmYXIgYmVoaW5kLiAgU3BlZWQgdGltZSB1cC4gICovCisgICAgICAgIGljb3VudF90aW1lX3NoaWZ0Kys7CisgICAgfQorICAgIGxhc3RfZGVsdGEgPSBkZWx0YTsKKyAgICBxZW11X2ljb3VudF9iaWFzID0gY3VyX2ljb3VudCAtIChxZW11X2ljb3VudCA8PCBpY291bnRfdGltZV9zaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIGljb3VudF9hZGp1c3RfcnQodm9pZCAqIG9wYXF1ZSkKK3sKKyAgICB0aW1lcl9tb2QoaWNvdW50X3J0X3RpbWVyLAorICAgICAgICAgICAgICAgICAgIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsgMTAwMCk7CisgICAgaWNvdW50X2FkanVzdCgpOworfQorCitzdGF0aWMgdm9pZCBpY291bnRfYWRqdXN0X3ZtKHZvaWQgKiBvcGFxdWUpCit7CisgICAgdGltZXJfbW9kKGljb3VudF92bV90aW1lciwKKyAgICAgICAgICAgICAgICAgICBxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpICsgZ2V0X3RpY2tzX3Blcl9zZWMoKSAvIDEwKTsKKyAgICBpY291bnRfYWRqdXN0KCk7Cit9CitleHRlcm4gdm9pZCBxZW11X3RpbWVyX3JlZ2lzdGVyX3NhdmV2bSh2b2lkKTsKKwordm9pZCBjb25maWd1cmVfaWNvdW50KGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKyAgICBxZW11X3RpbWVyX3JlZ2lzdGVyX3NhdmV2bSgpOworCisgICAgaWYgKCFvcHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChzdHJjbXAob3B0aW9uLCAiYXV0byIpICE9IDApIHsKKyAgICAgICAgaWNvdW50X3RpbWVfc2hpZnQgPSBzdHJ0b2wob3B0aW9uLCBOVUxMLCAwKTsKKyAgICAgICAgdXNlX2ljb3VudCA9IDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1c2VfaWNvdW50ID0gMjsKKworICAgIC8qIDEyNU1JUFMgc2VlbXMgYSByZWFzb25hYmxlIGluaXRpYWwgZ3Vlc3MgYXQgdGhlIGd1ZXN0IHNwZWVkLgorICAgICAgIEl0IHdpbGwgYmUgY29ycmVjdGVkIGZhaXJseSBxdWlja2x5IGFueXdheS4gICovCisgICAgaWNvdW50X3RpbWVfc2hpZnQgPSAzOworCisgICAgLyogSGF2ZSBib3RoIHJlYWx0aW1lIGFuZCB2aXJ0dWFsIHRpbWUgdHJpZ2dlcnMgZm9yIHNwZWVkIGFkanVzdG1lbnQuCisgICAgICAgVGhlIHJlYWx0aW1lIHRyaWdnZXIgY2F0Y2hlcyBlbXVsYXRlZCB0aW1lIHBhc3NpbmcgdG9vIHNsb3dseSwKKyAgICAgICB0aGUgdmlydHVhbCB0aW1lIHRyaWdnZXIgY2F0Y2hlcyBlbXVsYXRlZCB0aW1lIHBhc3NpbmcgdG9vIGZhc3QuCisgICAgICAgUmVhbHRpbWUgdHJpZ2dlcnMgb2NjdXIgZXZlbiB3aGVuIGlkbGUsIHNvIHVzZSB0aGVtIGxlc3MgZnJlcXVlbnRseQorICAgICAgIHRoYW4gVk0gdHJpZ2dlcnMuICAqLworICAgIGljb3VudF9ydF90aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1JFQUxUSU1FLCBTQ0FMRV9NUywgaWNvdW50X2FkanVzdF9ydCwgTlVMTCk7CisgICAgdGltZXJfbW9kKGljb3VudF9ydF90aW1lciwKKyAgICAgICAgICAgICAgICAgICBxZW11X2Nsb2NrX2dldF9tcyhRRU1VX0NMT0NLX1JFQUxUSU1FKSArIDEwMDApOworICAgIGljb3VudF92bV90aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1ZJUlRVQUwsIFNDQUxFX05TLCBpY291bnRfYWRqdXN0X3ZtLCBOVUxMKTsKKyAgICB0aW1lcl9tb2QoaWNvdW50X3ZtX3RpbWVyLAorICAgICAgICAgICAgICAgICAgIHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCkgKyBnZXRfdGlja3NfcGVyX3NlYygpIC8gMTApOworfQorCitzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciB7CisgICAgY2hhciBjb25zdCAqbmFtZTsKKyAgICBpbnQgKCpzdGFydCkoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworICAgIHZvaWQgKCpzdG9wKShzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCk7CisgICAgdm9pZCAoKnJlYXJtKShzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCk7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisgICAgaW50IGZkOworICAgIHRpbWVyX3QgdGltZXI7CisjZWxpZiBkZWZpbmVkKF9XSU4zMikKKyAgICBIQU5ETEUgdGltZXI7CisjZW5kaWYKKyAgICBjaGFyIGV4cGlyZWQ7Cit9OworCitzdGF0aWMgc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKmFsYXJtX3RpbWVyOworCitzdGF0aWMgaW5saW5lIGludCBhbGFybV9oYXNfZHludGlja3Moc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgcmV0dXJuIHQtPnJlYXJtICE9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfcmVhcm1fYWxhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgaWYgKHQtPnJlYXJtKSB7CisgICAgICAgIHQtPnJlYXJtKHQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcWVtdV9ydW5fYWxhcm1fdGltZXIodm9pZCkgeworICAgIC8qIHJlYXJtIHRpbWVyLCBpZiBub3QgcGVyaW9kaWMgKi8KKyAgICBpZiAoYWxhcm1fdGltZXItPmV4cGlyZWQpIHsKKyAgICAgICAgYWxhcm1fdGltZXItPmV4cGlyZWQgPSAwOworICAgICAgICBxZW11X3JlYXJtX2FsYXJtX3RpbWVyKGFsYXJtX3RpbWVyKTsKKyAgICB9Cit9CisKKy8qIFRPRE86IE1JTl9USU1FUl9SRUFSTV9OUyBzaG91bGQgYmUgb3B0aW1pemVkICovCisjZGVmaW5lIE1JTl9USU1FUl9SRUFSTV9OUyAyNTAwMDAKKworI2lmZGVmIF9XSU4zMgorCitzdGF0aWMgaW50IG1tX3N0YXJ0X3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KTsKK3N0YXRpYyB2b2lkIG1tX3N0b3BfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworc3RhdGljIHZvaWQgbW1fcmVhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworCitzdGF0aWMgaW50IHdpbjMyX3N0YXJ0X3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KTsKK3N0YXRpYyB2b2lkIHdpbjMyX3N0b3BfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworc3RhdGljIHZvaWQgd2luMzJfcmVhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworCisjZWxzZQorCitzdGF0aWMgaW50IHVuaXhfc3RhcnRfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworc3RhdGljIHZvaWQgdW5peF9zdG9wX3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KTsKKworI2lmZGVmIF9fbGludXhfXworCitzdGF0aWMgaW50IGR5bnRpY2tzX3N0YXJ0X3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KTsKK3N0YXRpYyB2b2lkIGR5bnRpY2tzX3N0b3BfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworc3RhdGljIHZvaWQgZHludGlja3NfcmVhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpOworCisjZW5kaWYgLyogX19saW51eF9fICovCisKKyNlbmRpZiAvKiBfV0lOMzIgKi8KKworaW50NjRfdCBxZW11X2ljb3VudF9yb3VuZChpbnQ2NF90IGNvdW50KQoreworICAgIHJldHVybiAoY291bnQgKyAoMSA8PCBpY291bnRfdGltZV9zaGlmdCkgLSAxKSA+PiBpY291bnRfdGltZV9zaGlmdDsKK30KKworc3RhdGljIHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyIGFsYXJtX3RpbWVyc1tdID0geworI2lmbmRlZiBfV0lOMzIKKyAgICB7InVuaXgiLCB1bml4X3N0YXJ0X3RpbWVyLCB1bml4X3N0b3BfdGltZXIsIE5VTEx9LAorI2lmZGVmIF9fbGludXhfXworICAgIC8qIG9uIExpbnV4LCB0aGUgJ2R5bnRpY2tzJyBjbG9jayBzb21ldGltZXMgZG9lc24ndCB3b3JrCisgICAgICogcHJvcGVybHkuIHRoaXMgcmVzdWx0cyBpbiB0aGUgVUkgZnJlZXppbmcgd2hpbGUgZW11bGF0aW9uCisgICAgICogY29udGludWVzLCBmb3Igc2V2ZXJhbCBzZWNvbmRzLi4uIFNvIG1vdmUgaXQgdG8gdGhlIGVuZAorICAgICAqIG9mIHRoZSBsaXN0LiAqLworICAgIHsiZHludGlja3MiLCBkeW50aWNrc19zdGFydF90aW1lciwKKyAgICAgZHludGlja3Nfc3RvcF90aW1lciwgZHludGlja3NfcmVhcm1fdGltZXJ9LAorI2VuZGlmCisjZWxzZQorICAgIHsibW10aW1lciIsIG1tX3N0YXJ0X3RpbWVyLCBtbV9zdG9wX3RpbWVyLCBOVUxMfSwKKyAgICB7Im1tdGltZXIyIiwgbW1fc3RhcnRfdGltZXIsIG1tX3N0b3BfdGltZXIsIG1tX3JlYXJtX3RpbWVyfSwKKyAgICB7ImR5bnRpY2tzIiwgd2luMzJfc3RhcnRfdGltZXIsIHdpbjMyX3N0b3BfdGltZXIsIHdpbjMyX3JlYXJtX3RpbWVyfSwKKyAgICB7IndpbjMyIiwgd2luMzJfc3RhcnRfdGltZXIsIHdpbjMyX3N0b3BfdGltZXIsIE5VTEx9LAorI2VuZGlmCisgICAge05VTEwsIH0KK307CisKK3N0YXRpYyB2b2lkIHNob3dfYXZhaWxhYmxlX2FsYXJtcyh2b2lkKQoreworICAgIGludCBpOworCisgICAgcHJpbnRmKCJBdmFpbGFibGUgYWxhcm0gdGltZXJzLCBpbiBvcmRlciBvZiBwcmVjZWRlbmNlOlxuIik7CisgICAgZm9yIChpID0gMDsgYWxhcm1fdGltZXJzW2ldLm5hbWU7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlc1xuIiwgYWxhcm1fdGltZXJzW2ldLm5hbWUpOworfQorCit2b2lkIGNvbmZpZ3VyZV9hbGFybXMoY2hhciBjb25zdCAqb3B0KQoreworICAgIGludCBpOworICAgIGludCBjdXIgPSAwOworICAgIGludCBjb3VudCA9IEFSUkFZX1NJWkUoYWxhcm1fdGltZXJzKSAtIDE7CisgICAgY2hhciAqYXJnOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgdG1wOworCisgICAgaWYgKCFzdHJjbXAob3B0LCAiPyIpKSB7CisgICAgICAgIHNob3dfYXZhaWxhYmxlX2FsYXJtcygpOworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIGFyZyA9IGdfc3RyZHVwKG9wdCk7CisKKyAgICAvKiBSZW9yZGVyIHRoZSBhcnJheSAqLworICAgIG5hbWUgPSBzdHJ0b2soYXJnLCAiLCIpOworICAgIHdoaWxlIChuYW1lKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudCAmJiBhbGFybV90aW1lcnNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhbGFybV90aW1lcnNbaV0ubmFtZSwgbmFtZSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaSA9PSBjb3VudCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGNsb2NrICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgY3VyKQorICAgICAgICAgICAgLyogSWdub3JlICovCisgICAgICAgICAgICBnb3RvIG5leHQ7CisKKyAgICAgICAgLyogU3dhcCAqLworICAgICAgICB0bXAgPSBhbGFybV90aW1lcnNbaV07CisgICAgICAgIGFsYXJtX3RpbWVyc1tpXSA9IGFsYXJtX3RpbWVyc1tjdXJdOworICAgICAgICBhbGFybV90aW1lcnNbY3VyXSA9IHRtcDsKKworICAgICAgICBjdXIrKzsKK25leHQ6CisgICAgICAgIG5hbWUgPSBzdHJ0b2soTlVMTCwgIiwiKTsKKyAgICB9CisKKyAgICBnX2ZyZWUoYXJnKTsKKworICAgIGlmIChjdXIpIHsKKyAgICAgICAgLyogRGlzYWJsZSByZW1haW5pbmcgdGltZXJzICovCisgICAgICAgIGZvciAoaSA9IGN1cjsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICBhbGFybV90aW1lcnNbaV0ubmFtZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hvd19hdmFpbGFibGVfYWxhcm1zKCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCisvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBxZW11X3RpbWVyX2FsYXJtX3BlbmRpbmcoKSBjYWxsZXIKKy8vIChyZWFsbHkgdGNnX2NwdV9leGVjKCkpIHRoYXQgYW4gYWxhcm0gaGFzIGV4cGlyZWQuIEl0IGlzIHNldCBpbiB0aGUKKy8vIHRpbWVyIGNhbGxiYWNrLCB3aGljaCBjYW4gYmUgYSBzaWduYWwgaGFuZGxlciBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IHRpbWVyX2FsYXJtX3BlbmRpbmcgPSAxOworCitpbnQgcWVtdV90aW1lcl9hbGFybV9wZW5kaW5nKHZvaWQpCit7CisgICAgaW50IHJldCA9IHRpbWVyX2FsYXJtX3BlbmRpbmc7CisgICAgdGltZXJfYWxhcm1fcGVuZGluZyA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9XSU4zMikKKy8vIENvbXB1dGUgdGhlIG5leHQgYWxhcm0gZGVhZGxpbmUsIHJldHVybiBhIHRpbWVvdXQgaW4gbmFub3NlY29uZHMuCisvLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIHNpZ25hbCBoYW5kbGVyIHNpbmNlCisvLyBpdCBjYWxscyBxZW11LXRpbWVyLmMgZnVuY3Rpb25zIHRoYXQgYWNxdWlyZS9yZWxlYXNlIGdsb2JhbCBtdXRleGVzLgorc3RhdGljIGludDY0X3QgcWVtdV9uZXh0X2FsYXJtX2RlYWRsaW5lKHZvaWQpCit7CisgICAgaW50NjRfdCBkZWx0YSA9IElOVDMyX01BWDsKKyAgICBpZiAoIXVzZV9pY291bnQpIHsKKyAgICAgICAgZGVsdGEgPSBxZW11X2Nsb2NrX2RlYWRsaW5lX25zX2FsbChRRU1VX0NMT0NLX1ZJUlRVQUwpOworICAgIH0KKyAgICBpbnQ2NF90IGhkZWx0YSA9IHFlbXVfY2xvY2tfZGVhZGxpbmVfbnNfYWxsKFFFTVVfQ0xPQ0tfSE9TVCk7CisgICAgaWYgKGhkZWx0YSA8IGRlbHRhKSB7CisgICAgICAgIGRlbHRhID0gaGRlbHRhOworICAgIH0KKyAgICBpbnQ2NF90IHJ0ZGVsdGEgPSBxZW11X2Nsb2NrX2RlYWRsaW5lX25zX2FsbChRRU1VX0NMT0NLX1JFQUxUSU1FKTsKKyAgICBpZiAocnRkZWx0YSA8IGRlbHRhKSB7CisgICAgICAgIGRlbHRhID0gcnRkZWx0YTsKKyAgICB9CisgICAgcmV0dXJuIGRlbHRhOworfQorI2VuZGlmICAvLyBfX2xpbnV4X18gfHwgX1dJTjMyCisKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkIENBTExCQUNLIGhvc3RfYWxhcm1faGFuZGxlcihQVk9JRCBscFBhcmFtLCBCT09MRUFOIHVudXNlZCkKKyNlbHNlCitzdGF0aWMgdm9pZCBob3N0X2FsYXJtX2hhbmRsZXIoaW50IGhvc3Rfc2lnbnVtKQorI2VuZGlmCit7CisgICAgc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQgPSBhbGFybV90aW1lcjsKKyAgICBpZiAoIXQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGNhbGwgcWVtdV9uZXh0X2FsYXJtX2RlYWRsaW5lKCkgdG8ga25vdworICAgIC8vIGlmIGEgdGltZXIgaGFzIHJlYWxseSBleHBpcmVkLCBpbiB0aGUgY2FzZSBvZiBub24tZHluYW1pYyBhbGFybXMsCisgICAgLy8gc28ganVzdCBzaWduYWwgYW5kIGxldCB0aGUgbWFpbiBsb29wIHRocmVhZCBkbyB0aGUgY2hlY2tzIGluc3RlYWQuCisgICAgdGltZXJfYWxhcm1fcGVuZGluZyA9IDE7CisKKyAgICAvLyBFbnN1cmUgYSBkeW5hbWljIGFsYXJtIHdpbGwgYmUgcHJvcGVybHkgcmVzY2hlZHVsZWQuCisgICAgaWYgKGFsYXJtX2hhc19keW50aWNrcyh0KSkKKyAgICAgICAgdC0+ZXhwaXJlZCA9IDE7CisKKyAgICAvLyBUaGlzIGZvcmNlcyBhIGNwdV9leGl0KCkgY2FsbCB0aGF0IHdpbGwgZW5kIHRoZSBjdXJyZW50IENQVQorICAgIC8vIGV4ZWN1dGlvbiBBU0FQLgorICAgIHFlbXVfbm90aWZ5X2V2ZW50KCk7Cit9CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKworc3RhdGljIGludCBkeW50aWNrc19zdGFydF90aW1lcihzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCkKK3sKKyAgICBzdHJ1Y3Qgc2lnZXZlbnQgZXY7CisgICAgdGltZXJfdCBob3N0X3RpbWVyOworICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworCisgICAgc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworICAgIGFjdC5zYV9mbGFncyA9IDA7CisgICAgYWN0LnNhX2hhbmRsZXIgPSBob3N0X2FsYXJtX2hhbmRsZXI7CisKKyAgICBzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdCwgTlVMTCk7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgZXYgc3RydWN0IHRvIDAgdG8gYXZvaWQgdmFsZ3JpbmQgY29tcGxhaW5pbmcKKyAgICAgKiBhYm91dCB1bmluaXRpYWxpemVkIGRhdGEgaW4gdGltZXJfY3JlYXRlIGNhbGwKKyAgICAgKi8KKyAgICBtZW1zZXQoJmV2LCAwLCBzaXplb2YoZXYpKTsKKyAgICBldi5zaWdldl92YWx1ZS5zaXZhbF9pbnQgPSAwOworICAgIGV2LnNpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKyAgICBldi5zaWdldl9zaWdubyA9IFNJR0FMUk07CisKKyAgICBpZiAodGltZXJfY3JlYXRlKENMT0NLX1JFQUxUSU1FLCAmZXYsICZob3N0X3RpbWVyKSkgeworICAgICAgICBwZXJyb3IoInRpbWVyX2NyZWF0ZSIpOworCisgICAgICAgIC8qIGRpc2FibGUgZHludGlja3MgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEeW5hbWljIFRpY2tzIGRpc2FibGVkXG4iKTsKKworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdC0+dGltZXIgPSBob3N0X3RpbWVyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR5bnRpY2tzX3N0b3BfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgdGltZXJfdCBob3N0X3RpbWVyID0gdC0+dGltZXI7CisKKyAgICB0aW1lcl9kZWxldGUoaG9zdF90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIGR5bnRpY2tzX3JlYXJtX3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KQoreworICAgIHRpbWVyX3QgaG9zdF90aW1lciA9IHQtPnRpbWVyOworICAgIHN0cnVjdCBpdGltZXJzcGVjIHRpbWVvdXQ7CisgICAgaW50NjRfdCBuZWFyZXN0X2RlbHRhX25zID0gSU5UNjRfTUFYOworICAgIGludDY0X3QgY3VycmVudF9uczsKKworICAgIGFzc2VydChhbGFybV9oYXNfZHludGlja3ModCkpOworICAgIGlmICghcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICYmCisgICAgICAgICFxZW11X2Nsb2NrX2hhc190aW1lcnMoUUVNVV9DTE9DS19WSVJUVUFMKSAmJgorICAgICAgICAhcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVfQ0xPQ0tfSE9TVCkpCisgICAgICAgIHJldHVybjsKKworICAgIG5lYXJlc3RfZGVsdGFfbnMgPSBxZW11X25leHRfYWxhcm1fZGVhZGxpbmUoKTsKKyAgICBpZiAobmVhcmVzdF9kZWx0YV9ucyA8IE1JTl9USU1FUl9SRUFSTV9OUykKKyAgICAgICAgbmVhcmVzdF9kZWx0YV9ucyA9IE1JTl9USU1FUl9SRUFSTV9OUzsKKworICAgIC8qIGNoZWNrIHdoZXRoZXIgYSB0aW1lciBpcyBhbHJlYWR5IHJ1bm5pbmcgKi8KKyAgICBpZiAodGltZXJfZ2V0dGltZShob3N0X3RpbWVyLCAmdGltZW91dCkpIHsKKyAgICAgICAgcGVycm9yKCJnZXR0aW1lIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW50ZXJuYWwgdGltZXIgZXJyb3I6IGFib3J0aW5nXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgY3VycmVudF9ucyA9IHRpbWVvdXQuaXRfdmFsdWUudHZfc2VjICogMTAwMDAwMDAwMExMICsgdGltZW91dC5pdF92YWx1ZS50dl9uc2VjOworICAgIGlmIChjdXJyZW50X25zICYmIGN1cnJlbnRfbnMgPD0gbmVhcmVzdF9kZWx0YV9ucykKKyAgICAgICAgcmV0dXJuOworCisgICAgdGltZW91dC5pdF9pbnRlcnZhbC50dl9zZWMgPSAwOworICAgIHRpbWVvdXQuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IDA7IC8qIDAgZm9yIG9uZS1zaG90IHRpbWVyICovCisgICAgdGltZW91dC5pdF92YWx1ZS50dl9zZWMgPSAgbmVhcmVzdF9kZWx0YV9ucyAvIDEwMDAwMDAwMDA7CisgICAgdGltZW91dC5pdF92YWx1ZS50dl9uc2VjID0gbmVhcmVzdF9kZWx0YV9ucyAlIDEwMDAwMDAwMDA7CisgICAgaWYgKHRpbWVyX3NldHRpbWUoaG9zdF90aW1lciwgMCAvKiBSRUxBVElWRSAqLywgJnRpbWVvdXQsIE5VTEwpKSB7CisgICAgICAgIHBlcnJvcigic2V0dGltZSIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludGVybmFsIHRpbWVyIGVycm9yOiBhYm9ydGluZ1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCisjZW5kaWYgLyogZGVmaW5lZChfX2xpbnV4X18pICovCisKKyNpZiAhZGVmaW5lZChfV0lOMzIpCisKK3N0YXRpYyBpbnQgdW5peF9zdGFydF90aW1lcihzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCkKK3sKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKyAgICBzdHJ1Y3QgaXRpbWVydmFsIGl0djsKKyAgICBpbnQgZXJyOworCisgICAgLyogdGltZXIgc2lnbmFsICovCisgICAgc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworICAgIGFjdC5zYV9mbGFncyA9IDA7CisgICAgYWN0LnNhX2hhbmRsZXIgPSBob3N0X2FsYXJtX2hhbmRsZXI7CisKKyAgICBzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdCwgTlVMTCk7CisKKyAgICBpdHYuaXRfaW50ZXJ2YWwudHZfc2VjID0gMDsKKyAgICAvKiBmb3IgaTM4NiBrZXJuZWwgMi42IHRvIGdldCAxIG1zICovCisgICAgaXR2Lml0X2ludGVydmFsLnR2X3VzZWMgPSA5OTk7CisgICAgaXR2Lml0X3ZhbHVlLnR2X3NlYyA9IDA7CisgICAgaXR2Lml0X3ZhbHVlLnR2X3VzZWMgPSAxMCAqIDEwMDA7CisKKyAgICBlcnIgPSBzZXRpdGltZXIoSVRJTUVSX1JFQUwsICZpdHYsIE5VTEwpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1bml4X3N0b3BfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgc3RydWN0IGl0aW1lcnZhbCBpdHY7CisKKyAgICBtZW1zZXQoJml0diwgMCwgc2l6ZW9mKGl0dikpOworICAgIHNldGl0aW1lcihJVElNRVJfUkVBTCwgJml0diwgTlVMTCk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfV0lOMzIpICovCisKKworI2lmZGVmIF9XSU4zMgorCitzdGF0aWMgTU1SRVNVTFQgbW1fdGltZXI7CitzdGF0aWMgdW5zaWduZWQgbW1fcGVyaW9kOworCitzdGF0aWMgdm9pZCBDQUxMQkFDSyBtbV9hbGFybV9oYW5kbGVyKFVJTlQgdVRpbWVySUQsIFVJTlQgdU1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIGR3VXNlciwgRFdPUkRfUFRSIGR3MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkRfUFRSIGR3MikKK3sKKyAgICBzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCA9IGFsYXJtX3RpbWVyOworICAgIGlmICghdCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFdlIGNhbiBhY3R1YWxseSBjYWxsIHFlbXVfbmV4dF9hbGFybV9kZWFkbGluZSgpIGhlcmUgc2luY2UgdGhpcworICAgIC8vIGRvZXNuJ3QgcnVuIGluIGEgc2lnbmFsIGhhbmRsZXIsIGJ1dCBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgaWYgKGFsYXJtX2hhc19keW50aWNrcyh0KSB8fCBxZW11X25leHRfYWxhcm1fZGVhZGxpbmUoKSA8PSAwKSB7CisgICAgICAgIHQtPmV4cGlyZWQgPSAxOworICAgICAgICB0aW1lcl9hbGFybV9wZW5kaW5nID0gMTsKKyAgICAgICAgcWVtdV9ub3RpZnlfZXZlbnQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbW1fc3RhcnRfdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgVElNRUNBUFMgdGM7CisgICAgVUlOVCBmbGFnczsKKworICAgIG1lbXNldCgmdGMsIDAsIHNpemVvZih0YykpOworICAgIHRpbWVHZXREZXZDYXBzKCZ0Yywgc2l6ZW9mKHRjKSk7CisKKyAgICBtbV9wZXJpb2QgPSB0Yy53UGVyaW9kTWluOworICAgIHRpbWVCZWdpblBlcmlvZChtbV9wZXJpb2QpOworCisgICAgZmxhZ3MgPSBUSU1FX0NBTExCQUNLX0ZVTkNUSU9OOworICAgIGlmIChhbGFybV9oYXNfZHludGlja3ModCkpIHsKKyAgICAgICAgZmxhZ3MgfD0gVElNRV9PTkVTSE9UOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzIHw9IFRJTUVfUEVSSU9ESUM7CisgICAgfQorCisgICAgbW1fdGltZXIgPSB0aW1lU2V0RXZlbnQoMSwgICAgICAgICAgICAgICAgICAvKiBpbnRlcnZhbCAobXMpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fcGVyaW9kLCAgICAgICAgICAvKiByZXNvbHV0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYWxhcm1faGFuZGxlciwgICAvKiBmdW5jdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRF9QVFIpdCwgICAgICAgLyogcGFyYW1ldGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisKKyAgICBpZiAoIW1tX3RpbWVyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd2luMzIgYWxhcm0gdGltZXI6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHRpbWVFbmRQZXJpb2QobW1fcGVyaW9kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtbV9zdG9wX3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KQoreworICAgIHRpbWVLaWxsRXZlbnQobW1fdGltZXIpOworICAgIHRpbWVFbmRQZXJpb2QobW1fcGVyaW9kKTsKK30KKworc3RhdGljIHZvaWQgbW1fcmVhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgaW50IG5lYXJlc3RfZGVsdGFfbXM7CisKKyAgICBhc3NlcnQoYWxhcm1faGFzX2R5bnRpY2tzKHQpKTsKKyAgICBpZiAoIXFlbXVfY2xvY2tfaGFzX3RpbWVycyhRRU1VX0NMT0NLX1JFQUxUSU1FKSAmJgorICAgICAgICAhcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVfQ0xPQ0tfVklSVFVBTCkgJiYKKyAgICAgICAgIXFlbXVfY2xvY2tfaGFzX3RpbWVycyhRRU1VX0NMT0NLX0hPU1QpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aW1lS2lsbEV2ZW50KG1tX3RpbWVyKTsKKworICAgIG5lYXJlc3RfZGVsdGFfbXMgPSAocWVtdV9uZXh0X2FsYXJtX2RlYWRsaW5lKCkgKyA5OTk5OTkpIC8gMTAwMDAwMDsKKyAgICBpZiAobmVhcmVzdF9kZWx0YV9tcyA8IDEpIHsKKyAgICAgICAgbmVhcmVzdF9kZWx0YV9tcyA9IDE7CisgICAgfQorICAgIG1tX3RpbWVyID0gdGltZVNldEV2ZW50KG5lYXJlc3RfZGVsdGFfbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fcGVyaW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2FsYXJtX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEX1BUUil0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfT05FU0hPVCB8IFRJTUVfQ0FMTEJBQ0tfRlVOQ1RJT04pOworCisgICAgaWYgKCFtbV90aW1lcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZS1hcm0gd2luMzIgYWxhcm0gdGltZXIgJWxkXG4iLAorICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKKworICAgICAgICB0aW1lRW5kUGVyaW9kKG1tX3BlcmlvZCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHdpbjMyX3N0YXJ0X3RpbWVyKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICp0KQoreworICAgIEhBTkRMRSBoVGltZXI7CisgICAgQk9PTEVBTiBzdWNjZXNzOworCisgICAgLyogSWYgeW91IGNhbGwgQ2hhbmdlVGltZXJRdWV1ZVRpbWVyIG9uIGEgb25lLXNob3QgdGltZXIgKGl0cyBwZXJpb2QKKyAgICAgICBpcyB6ZXJvKSB0aGF0IGhhcyBhbHJlYWR5IGV4cGlyZWQsIHRoZSB0aW1lciBpcyBub3QgdXBkYXRlZC4gIFNpbmNlCisgICAgICAgY3JlYXRpbmcgYSBuZXcgdGltZXIgaXMgcmVsYXRpdmVseSBleHBlbnNpdmUsIHNldCBhIGJvZ3VzIG9uZS1ob3VyCisgICAgICAgaW50ZXJ2YWwgaW4gdGhlIGR5bnRpY2tzIGNhc2UuICAqLworICAgIHN1Y2Nlc3MgPSBDcmVhdGVUaW1lclF1ZXVlVGltZXIoJmhUaW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9hbGFybV9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFybV9oYXNfZHludGlja3ModCkgPyAzNjAwMDAwIDogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV1RfRVhFQ1VURUlOVElNRVJUSFJFQUQpOworCisgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgd2luMzIgYWxhcm0gdGltZXI6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0LT50aW1lciA9IGhUaW1lcjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2luMzJfc3RvcF90aW1lcihzdHJ1Y3QgcWVtdV9hbGFybV90aW1lciAqdCkKK3sKKyAgICBIQU5ETEUgaFRpbWVyID0gdC0+dGltZXI7CisKKyAgICBpZiAoaFRpbWVyKSB7CisgICAgICAgIERlbGV0ZVRpbWVyUXVldWVUaW1lcihOVUxMLCBoVGltZXIsIE5VTEwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd2luMzJfcmVhcm1fdGltZXIoc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQpCit7CisgICAgSEFORExFIGhUaW1lciA9IHQtPnRpbWVyOworICAgIGludCBuZWFyZXN0X2RlbHRhX21zOworICAgIEJPT0xFQU4gc3VjY2VzczsKKworICAgIGFzc2VydChhbGFybV9oYXNfZHludGlja3ModCkpOworICAgIGlmICghcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICYmCisgICAgICAgICFxZW11X2Nsb2NrX2hhc190aW1lcnMoUUVNVV9DTE9DS19WSVJUVUFMKSAmJgorICAgICAgICAhcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVfQ0xPQ0tfSE9TVCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuZWFyZXN0X2RlbHRhX21zID0gKHFlbXVfbmV4dF9hbGFybV9kZWFkbGluZSgpICsgOTk5OTk5KSAvIDEwMDAwMDA7CisgICAgaWYgKG5lYXJlc3RfZGVsdGFfbXMgPCAxKSB7CisgICAgICAgIG5lYXJlc3RfZGVsdGFfbXMgPSAxOworICAgIH0KKyAgICBzdWNjZXNzID0gQ2hhbmdlVGltZXJRdWV1ZVRpbWVyKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGltZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWFyZXN0X2RlbHRhX21zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYwMDAwMCk7CisKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhcm0gd2luMzIgYWxhcm0gdGltZXI6ICVsZFxuIiwKKyAgICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KK30KKworI2VuZGlmIC8qIF9XSU4zMiAqLworCitzdGF0aWMgdm9pZCBhbGFybV90aW1lcl9vbl9jaGFuZ2Vfc3RhdGVfcmVhcm0odm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydW5uaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24pCit7CisgICAgaWYgKHJ1bm5pbmcpCisgICAgICAgIHFlbXVfcmVhcm1fYWxhcm1fdGltZXIoKHN0cnVjdCBxZW11X2FsYXJtX3RpbWVyICopIG9wYXF1ZSk7Cit9CisKK2ludCBpbml0X3RpbWVyX2FsYXJtKHZvaWQpCit7CisgICAgc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQgPSBOVUxMOworICAgIGludCBpLCBlcnIgPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGFsYXJtX3RpbWVyc1tpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgdCA9ICZhbGFybV90aW1lcnNbaV07CisKKyAgICAgICAgZXJyID0gdC0+c3RhcnQodCk7CisgICAgICAgIGlmICghZXJyKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGVycikgeworICAgICAgICBlcnIgPSAtRU5PRU5UOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogZmlyc3QgZXZlbnQgaXMgYXQgdGltZSAwICovCisgICAgYWxhcm1fdGltZXIgPSB0OworICAgIHRpbWVyX2FsYXJtX3BlbmRpbmcgPSAxOworICAgIHFlbXVfYWRkX3ZtX2NoYW5nZV9zdGF0ZV9oYW5kbGVyKGFsYXJtX3RpbWVyX29uX2NoYW5nZV9zdGF0ZV9yZWFybSwgdCk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIHF1aXRfdGltZXJzKHZvaWQpCit7CisgICAgc3RydWN0IHFlbXVfYWxhcm1fdGltZXIgKnQgPSBhbGFybV90aW1lcjsKKyAgICBhbGFybV90aW1lciA9IE5VTEw7CisgICAgdC0+c3RvcCh0KTsKK30KKworaW50IHFlbXVfY2FsY3VsYXRlX3RpbWVvdXQodm9pZCkKK3sKKyAgICBpbnQgdGltZW91dDsKKworICAgIGlmICghdm1fcnVubmluZykKKyAgICAgICAgdGltZW91dCA9IDUwMDA7CisgICAgZWxzZSBpZiAodGNnX2hhc193b3JrKCkpCisgICAgICAgIHRpbWVvdXQgPSAwOworICAgIGVsc2UgeworI2lmZGVmIFdJTjMyCisgICAgICAgIC8qIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNhc2Ugd2hlcmUgdGhlIGVtdWxhdGVkIHN5c3RlbSBpcworICAgICAgICAgKiB0b3RhbGx5IGlkbGUgYW5kIHdhaXRpbmcgZm9yIGkvby4gVGhlIHByb2JsZW0gaXMgdGhhdCBvbgorICAgICAgICAgKiBXaW5kb3dzLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIHByZXZlbnQgV2luZG93cyB1c2VyIGV2ZW50cworICAgICAgICAgKiB0byBiZSBkZWxpdmVyZWQgaW4gbGVzcyB0aGFuIDUgc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogVXBzdHJlYW0gY29udGFpbnMgYSBkaWZmZXJlbnQgd2F5IHRvIGhhbmRsZSB0aGlzLCBmb3Igbm93CisgICAgICAgICAqIHRoaXMgaGFjayBzaG91bGQgYmUgc3VmZmljaWVudCB1bnRpbCB3ZSBpbnRlZ3JhdGUgaXQgaW50bworICAgICAgICAgKiBvdXIgdHJlZS4KKyAgICAgICAgICovCisgICAgICAgIHRpbWVvdXQgPSAxMDAwLzE1OyAgLyogZGVsaXZlciB1c2VyIGV2ZW50cyBldmVyeSAxNS90aCBvZiBzZWNvbmQgKi8KKyNlbHNlCisgICAgICAgIHRpbWVvdXQgPSA1MDAwOworI2VuZGlmCisgICAgICAgIGludDY0X3QgdGltZW91dF9ucyA9IChpbnQ2NF90KXRpbWVvdXQgKiAxMDAwMDAwTEw7CisgICAgICAgIHRpbWVvdXRfbnMgPSBxZW11X3Nvb25lc3RfdGltZW91dCgKKyAgICAgICAgICAgICAgICB0aW1lb3V0X25zLCB0aW1lcmxpc3Rncm91cF9kZWFkbGluZV9ucygmbWFpbl9sb29wX3RsZykpOworICAgICAgICB0aW1lb3V0ID0gKGludCkoKHRpbWVvdXRfbnMgKyA5OTk5OTlMTCkgLyAxMDAwMDAwTEwpOworICAgIH0KKworICAgIHJldHVybiB0aW1lb3V0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9tZW1vcnktYW5kcm9pZC5jIGIvYW5kcm9pZC9xZW11MS9tZW1vcnktYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2Y2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL21lbW9yeS1hbmRyb2lkLmMKQEAgLTAsMCArMSwxNiBAQAorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNpbmNsdWRlICJxZW11L2hvc3QtdXRpbHMuaCIKKwordWludDY0X3QgaW9fbWVtX3JlYWQoaW50IGlvX2luZGV4LCBod2FkZHIgYWRkciwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICByZXR1cm4gX2lvX21lbV9yZWFkW2lvX2luZGV4XVtjdHpsKHNpemUpXShpb19tZW1fb3BhcXVlW2lvX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyKTsKK30KKwordm9pZCBpb19tZW1fd3JpdGUoaW50IGlvX2luZGV4LCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbCwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBfaW9fbWVtX3dyaXRlW2lvX2luZGV4XVtjdHpsKHNpemUpXShpb19tZW1fb3BhcXVlW2lvX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyLCB2YWwpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9taWdyYXRpb24tZHVtbXktYW5kcm9pZC5jIGIvYW5kcm9pZC9xZW11MS9taWdyYXRpb24tZHVtbXktYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTc4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL21pZ3JhdGlvbi1kdW1teS1hbmRyb2lkLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFFFTVUgbGl2ZSBtaWdyYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9taWdyYXRpb24uaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAiYmxvY2svYmxvY2suaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKworLy8jZGVmaW5lIERFQlVHX01JR1JBVElPTgorCisjaWZkZWYgREVCVUdfTUlHUkFUSU9OCisjZGVmaW5lIGRwcmludGYoZm10LCAuLi4pIFwKKyAgICBkbyB7IHByaW50ZigibWlncmF0aW9uOiAiIGZtdCwgIyMgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ZihmbXQsIC4uLikgXAorICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCit2b2lkIHFlbXVfc3RhcnRfaW5jb21pbmdfbWlncmF0aW9uKGNvbnN0IGNoYXIgKnVyaSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIm1pZ3JhdGlvbiBub3Qgc3VwcG9ydGVkICEhXG4iKTsKK30KKwordm9pZCBkb19taWdyYXRlKE1vbml0b3IgKm1vbiwgaW50IGRldGFjaCwgY29uc3QgY2hhciAqdXJpKQoreworCXJldHVybjsKK30KKwordm9pZCBkb19taWdyYXRlX2NhbmNlbChNb25pdG9yICptb24pCit7CisJcmV0dXJuOworfQorCit2b2lkIGRvX21pZ3JhdGVfc2V0X3NwZWVkKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJcmV0dXJuOworfQorCit1aW50NjRfdCBtaWdyYXRlX21heF9kb3dudGltZSh2b2lkKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGRvX21pZ3JhdGVfc2V0X2Rvd250aW1lKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkIGRvX2luZm9fbWlncmF0ZShNb25pdG9yICptb24pCit7CisJbW9uaXRvcl9wcmludGYobW9uLCAiTm8gTWlncmF0aW9uIHN1cHBvcnRcbiIpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9tb25pdG9yLWFuZHJvaWQuYyBiL2FuZHJvaWQvcWVtdTEvbW9uaXRvci1hbmRyb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZWIxMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvbW9uaXRvci1hbmRyb2lkLmMKQEAgLTAsMCArMSwxNjggQEAKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgImh3L2h3LmgiCisKK3N0cnVjdCBNb25pdG9yIHsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBpbnQgbXV4X291dDsKKyAgICAvLyBpbnQgcmVzZXRfc2VlbjsKKyAgICBpbnQgZmxhZ3M7CisgICAgLy8gaW50IHN1c3BlbmRfY250OworICAgIHVpbnQ4X3Qgb3V0YnVmWzEwMjRdOworICAgIGludCBvdXRidWZfaW5kZXg7CisgICAgLy8gUmVhZExpbmVTdGF0ZSAqcnM7CisgICAgLy8gQ1BVT2xkU3RhdGUgKm1vbl9jcHU7CisgICAgLy8gQmxvY2tEcml2ZXJDb21wbGV0aW9uRnVuYyAqcGFzc3dvcmRfY29tcGxldGlvbl9jYjsKKyAgICAvLyB2b2lkICpwYXNzd29yZF9vcGFxdWU7CisgICAgUUxJU1RfRU5UUlkoTW9uaXRvcikgZW50cnk7CisgICAgLy9pbnQgaGFzX3F1aXQ7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICB2b2lkKiAgICAgICAgICAgIGZha2Vfb3BhcXVlOworICAgIE1vbml0b3JGYWtlRnVuYyAgZmFrZV9mdW5jOworICAgIGludDY0X3QgICAgICAgICAgZmFrZV9jb3VudDsKKworI2VuZGlmCit9OworCisvLyBNaW5pbWFsaXN0aWMgLyBmYWtlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBRRU1VIE1vbml0b3IuCisKK01vbml0b3IqIGN1cl9tb247CisKKy8qIFJldHVybiBub24temVybyBpZmYgd2UgaGF2ZSBhIGN1cnJlbnQgbW9uaXRvciwgYW5kIGl0IGlzIGluIFFNUCBtb2RlLiAgKi8KK2ludCBtb25pdG9yX2N1cl9pc19xbXAodm9pZCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworTW9uaXRvcioKK21vbml0b3JfZmFrZV9uZXcodm9pZCogb3BhcXVlLCBNb25pdG9yRmFrZUZ1bmMgY2IpCit7CisgICAgTW9uaXRvciogbW9uOworCisgICAgYXNzZXJ0KGNiICE9IE5VTEwpOworICAgIG1vbiA9IGdfbWFsbG9jMChzaXplb2YoKm1vbikpOworICAgIG1vbi0+ZmFrZV9vcGFxdWUgPSBvcGFxdWU7CisgICAgbW9uLT5mYWtlX2Z1bmMgICA9IGNiOworICAgIG1vbi0+ZmFrZV9jb3VudCAgPSAwOworCisgICAgcmV0dXJuIG1vbjsKK30KKworaW50Cittb25pdG9yX2Zha2VfZ2V0X2J5dGVzKE1vbml0b3IqIG1vbikKK3sKKyAgICBhc3NlcnQobW9uLT5mYWtlX2Z1bmMgIT0gTlVMTCk7CisgICAgcmV0dXJuIG1vbi0+ZmFrZV9jb3VudDsKK30KKwordm9pZAorbW9uaXRvcl9mYWtlX2ZyZWUoTW9uaXRvciogbW9uKQoreworICAgIGFzc2VydChtb24tPmZha2VfZnVuYyAhPSBOVUxMKTsKKyAgICBmcmVlKG1vbik7Cit9CisKKy8qIFRoaXMgcmVwbGFjZXMgdGhlIGRlZmluaXRpb24gaW4gbW9uaXRvci5jIHdoaWNoIGlzIGluIGEKKyAqICNpZm5kZWYgQ09ORklHX0FORFJPSUQgLi4gI2VuZGlmIGJsb2NrLgorICovCit2b2lkIG1vbml0b3JfZmx1c2goTW9uaXRvciAqbW9uKQoreworICAgIGlmICghbW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobW9uLT5mYWtlX2Z1bmMgIT0gTlVMTCkgeworICAgICAgICBtb24tPmZha2VfZnVuYyhtb24tPmZha2Vfb3BhcXVlLCAodm9pZCopbW9uLT5vdXRidWYsIG1vbi0+b3V0YnVmX2luZGV4KTsKKyAgICAgICAgbW9uLT5vdXRidWZfaW5kZXggPSAwOworICAgICAgICBtb24tPmZha2VfY291bnQgKz0gbW9uLT5vdXRidWZfaW5kZXg7CisgICAgfSBlbHNlIGlmICghbW9uLT5tdXhfb3V0KSB7CisgICAgICAgIHFlbXVfY2hyX3dyaXRlKG1vbi0+Y2hyLCBtb24tPm91dGJ1ZiwgbW9uLT5vdXRidWZfaW5kZXgpOworICAgICAgICBtb24tPm91dGJ1Zl9pbmRleCA9IDA7CisgICAgfQorfQorCisvKiBmbHVzaCBhdCBldmVyeSBlbmQgb2YgbGluZSBvciBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwgKi8KK3N0YXRpYyB2b2lkIG1vbml0b3JfcHV0cyhNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyIGM7CisKKyAgICBpZiAoIW1vbikKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yKDs7KSB7CisgICAgICAgIGMgPSAqc3RyKys7CisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIG1vbi0+b3V0YnVmW21vbi0+b3V0YnVmX2luZGV4KytdID0gJ1xyJzsKKyAgICAgICAgbW9uLT5vdXRidWZbbW9uLT5vdXRidWZfaW5kZXgrK10gPSBjOworICAgICAgICBpZiAobW9uLT5vdXRidWZfaW5kZXggPj0gKHNpemVvZihtb24tPm91dGJ1ZikgLSAxKQorICAgICAgICAgICAgfHwgYyA9PSAnXG4nKQorICAgICAgICAgICAgbW9uaXRvcl9mbHVzaChtb24pOworICAgIH0KK30KKwordm9pZCBtb25pdG9yX3ZwcmludGYoTW9uaXRvciogbW9uLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncykgeworICAgIGNoYXIgYnVmWzQwOTZdOworICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworICAgIG1vbml0b3JfcHV0cyhtb24sIGJ1Zik7Cit9CisKK3ZvaWQgbW9uaXRvcl9wcmludGYoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIG1vbml0b3JfdnByaW50Zihtb24sIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgbW9uaXRvcl9wcmludF9maWxlbmFtZShNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgZmlsZW5hbWVbaV07IGkrKykgeworICAgICAgICBzd2l0Y2ggKGZpbGVuYW1lW2ldKSB7CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICBjYXNlICciJzoKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiXFwlYyIsIGZpbGVuYW1lW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJcXHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJcXHIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJcXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJWMiLCBmaWxlbmFtZVtpXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBtb25pdG9yX3Byb3RvY29sX2V2ZW50KE1vbml0b3JFdmVudCBldmVudCwgUU9iamVjdCAqZGF0YSkKK3sKKyAgICAvKiBYWFg6IFRPRE8gKi8KK30KKwordm9pZCBtb25pdG9yX3NldF9lcnJvcihNb25pdG9yICptb24sIFFFcnJvciAqcWVycm9yKQoreworICAgIFFERUNSRUYocWVycm9yKTsKK30KKwordm9pZCBtb25pdG9yX2luaXQoQ2hhckRyaXZlclN0YXRlKiBjcywgaW50IGZsYWdzKSB7CisgICAgLy8gTm90aGluZy4KK30KKworLyogYm9vdF9zZXQgaGFuZGxlciAqLworc3RhdGljIFFFTVVCb290U2V0SGFuZGxlciAqcWVtdV9ib290X3NldF9oYW5kbGVyID0gTlVMTDsKK3N0YXRpYyB2b2lkICpib290X29wYXF1ZTsKKwordm9pZCBxZW11X3JlZ2lzdGVyX2Jvb3Rfc2V0KFFFTVVCb290U2V0SGFuZGxlciAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIHFlbXVfYm9vdF9zZXRfaGFuZGxlciA9IGZ1bmM7CisgICAgYm9vdF9vcGFxdWUgPSBvcGFxdWU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL25ldC9jaGVja3N1bS5jIGIvYW5kcm9pZC9xZW11MS9uZXQvY2hlY2tzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM2ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9uZXQvY2hlY2tzdW0uYwpAQCAtMCwwICsxLDg2IEBACisvKgorICogIElQIGNoZWNrc3VtbWluZyBmdW5jdGlvbnMuCisgKiAgKGMpIDIwMDggR2VyZCBIb2ZmbWFubiA8a3JheGVsQHJlZGhhdC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB1bmRlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisKKyNkZWZpbmUgUFJPVE9fVENQICA2CisjZGVmaW5lIFBST1RPX1VEUCAxNworCit1aW50MzJfdCBuZXRfY2hlY2tzdW1fYWRkKGludCBsZW4sIHVpbnQ4X3QgKmJ1ZikKK3sKKyAgICB1aW50MzJfdCBzdW0gPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJaWYgKGkgJiAxKQorCSAgICBzdW0gKz0gKHVpbnQzMl90KWJ1ZltpXTsKKwllbHNlCisJICAgIHN1bSArPSAodWludDMyX3QpYnVmW2ldIDw8IDg7CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKK3VpbnQxNl90IG5ldF9jaGVja3N1bV9maW5pc2godWludDMyX3Qgc3VtKQoreworICAgIHdoaWxlIChzdW0+PjE2KQorCXN1bSA9IChzdW0gJiAweEZGRkYpKyhzdW0gPj4gMTYpOworICAgIHJldHVybiB+c3VtOworfQorCit1aW50MTZfdCBuZXRfY2hlY2tzdW1fdGNwdWRwKHVpbnQxNl90IGxlbmd0aCwgdWludDE2X3QgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmFkZHJzLCB1aW50OF90ICpidWYpCit7CisgICAgdWludDMyX3Qgc3VtID0gMDsKKworICAgIHN1bSArPSBuZXRfY2hlY2tzdW1fYWRkKGxlbmd0aCwgYnVmKTsgICAgICAgICAvLyBwYXlsb2FkCisgICAgc3VtICs9IG5ldF9jaGVja3N1bV9hZGQoOCwgYWRkcnMpOyAgICAgICAgICAgIC8vIHNyYyArIGRzdCBhZGRyZXNzCisgICAgc3VtICs9IHByb3RvICsgbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3RvY29sICYgbGVuZ3RoCisgICAgcmV0dXJuIG5ldF9jaGVja3N1bV9maW5pc2goc3VtKTsKK30KKwordm9pZCBuZXRfY2hlY2tzdW1fY2FsY3VsYXRlKHVpbnQ4X3QgKmRhdGEsIGludCBsZW5ndGgpCit7CisgICAgaW50IGhsZW4sIHBsZW4sIHByb3RvLCBjc3VtX29mZnNldDsKKyAgICB1aW50MTZfdCBjc3VtOworCisgICAgaWYgKChkYXRhWzE0XSAmIDB4ZjApICE9IDB4NDApCisJcmV0dXJuOyAvKiBub3QgSVB2NCAqLworICAgIGhsZW4gID0gKGRhdGFbMTRdICYgMHgwZikgKiA0OworICAgIHBsZW4gID0gKGRhdGFbMTZdIDw8IDggfCBkYXRhWzE3XSkgLSBobGVuOworICAgIHByb3RvID0gZGF0YVsyM107CisKKyAgICBzd2l0Y2ggKHByb3RvKSB7CisgICAgY2FzZSBQUk9UT19UQ1A6CisJY3N1bV9vZmZzZXQgPSAxNjsKKwlicmVhazsKKyAgICBjYXNlIFBST1RPX1VEUDoKKwljc3VtX29mZnNldCA9IDY7CisJYnJlYWs7CisgICAgZGVmYXVsdDoKKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKHBsZW4gPCBjc3VtX29mZnNldCsyKQorCXJldHVybjsKKworICAgIGRhdGFbMTQraGxlbitjc3VtX29mZnNldF0gICA9IDA7CisgICAgZGF0YVsxNCtobGVuK2NzdW1fb2Zmc2V0KzFdID0gMDsKKyAgICBjc3VtID0gbmV0X2NoZWNrc3VtX3RjcHVkcChwbGVuLCBwcm90bywgZGF0YSsxNCsxMiwgZGF0YSsxNCtobGVuKTsKKyAgICBkYXRhWzE0K2hsZW4rY3N1bV9vZmZzZXRdICAgPSBjc3VtID4+IDg7CisgICAgZGF0YVsxNCtobGVuK2NzdW1fb2Zmc2V0KzFdID0gY3N1bSAmIDB4ZmY7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL25ldC9uZXQtYW5kcm9pZC5jIGIvYW5kcm9pZC9xZW11MS9uZXQvbmV0LWFuZHJvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFiNzYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9uZXQvbmV0LWFuZHJvaWQuYwpAQCAtMCwwICsxLDI2MDcgQEAKKy8qCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx6bGliLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3RjcGR1bXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2lwYWRkci5oIgorCisvKiBOZWVkZWQgZWFybHkgZm9yIEhPU1RfQlNEIGV0Yy4gKi8KKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpZmRlZiBfX05ldEJTRF9fCisjaW5jbHVkZSA8bmV0L2lmX3RhcC5oPgorI2VuZGlmCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8bGludXgvaWZfdHVuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpZmRlZiBDT05GSUdfQlNECisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjaW5jbHVkZSA8bGlidXRpbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKyNlbGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX19GcmVlQlNEX2tlcm5lbF9fKQorI2luY2x1ZGUgPGZyZWVic2Qvc3RkbGliLmg+CisjZWxzZQorI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPHB0eS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisvKiBGb3IgdGhlIGJlbmVmaXQgb2Ygb2xkZXIgbGludXggc3lzdGVtcyB3aGljaCBkb24ndCBzdXBwbHkgaXQsCisgICB3ZSB1c2UgYSBsb2NhbCBjb3B5IG9mIGhwZXQuaC4gKi8KKy8qICNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+ICovCisjaW5jbHVkZSAiaHcvdGltZXIvaHBldC5oIgorCisjaW5jbHVkZSA8bGludXgvcHBkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CisjZW5kaWYKKyNpZmRlZiBfX3N1bl9fCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9hcnAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwX2ljbXAuaD4gLy8gbXVzdCBjb21lIGFmdGVyIGlwLmgKKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3Ryb3B0cy5oPgorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykKKyNpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1ZERSkKKyNpbmNsdWRlIDxsaWJ2ZGVwbHVnLmg+CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisjZGVmaW5lIGdldG9wdF9sb25nX29ubHkgZ2V0b3B0X2xvbmcKKyNkZWZpbmUgbWVtYWxpZ24oYWxpZ24sIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJxZW11L2xvZy5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfU0xJUlApCisjaW5jbHVkZSAibGlic2xpcnAuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQU5EUk9JRCkKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2dsb2JhbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NoYXBlci5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuaCIKKworc3RhdGljIFZMQU5TdGF0ZSAqZmlyc3RfdmxhbjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbmV0d29yayBkZXZpY2UgcmVkaXJlY3RvcnMgKi8KKworI2lmIGRlZmluZWQoREVCVUdfTkVUKSB8fCBkZWZpbmVkKERFQlVHX1NMSVJQKQorc3RhdGljIHZvaWQgaGV4X2R1bXAoRklMRSAqZiwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbGVuLCBpLCBqLCBjOworCisgICAgZm9yKGk9MDtpPHNpemU7aSs9MTYpIHsKKyAgICAgICAgbGVuID0gc2l6ZSAtIGk7CisgICAgICAgIGlmIChsZW4gPiAxNikKKyAgICAgICAgICAgIGxlbiA9IDE2OworICAgICAgICBmcHJpbnRmKGYsICIlMDh4ICIsIGkpOworICAgICAgICBmb3Ioaj0wO2o8MTY7aisrKSB7CisgICAgICAgICAgICBpZiAoaiA8IGxlbikKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgJTAyeCIsIGJ1ZltpK2pdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgICAiKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGYsICIgIik7CisgICAgICAgIGZvcihqPTA7ajxsZW47aisrKSB7CisgICAgICAgICAgICBjID0gYnVmW2kral07CisgICAgICAgICAgICBpZiAoYyA8ICcgJyB8fCBjID4gJ34nKQorICAgICAgICAgICAgICAgIGMgPSAnLic7CisgICAgICAgICAgICBmcHJpbnRmKGYsICIlYyIsIGMpOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGFyc2VfbWFjYWRkcih1aW50OF90ICptYWNhZGRyLCBjb25zdCBjaGFyICpwKQoreworICAgIGludCBpOworICAgIGNoYXIgKmxhc3RfY2hhcjsKKyAgICBsb25nIGludCBvZmZzZXQ7CisKKyAgICBlcnJubyA9IDA7CisgICAgb2Zmc2V0ID0gc3RydG9sKHAsICZsYXN0X2NoYXIsIDApOworICAgIGlmICgwID09IGVycm5vICYmICdcMCcgPT0gKmxhc3RfY2hhciAmJgorICAgICAgICAgICAgb2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IDB4RkZGRkZGKSB7CisgICAgICAgIG1hY2FkZHJbM10gPSAob2Zmc2V0ICYgMHhGRjAwMDApID4+IDE2OworICAgICAgICBtYWNhZGRyWzRdID0gKG9mZnNldCAmIDB4RkYwMCkgPj4gODsKKyAgICAgICAgbWFjYWRkcls1XSA9IG9mZnNldCAmIDB4RkY7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICAgICAgbWFjYWRkcltpXSA9IHN0cnRvbChwLCAoY2hhciAqKikmcCwgMTYpOworICAgICAgICAgICAgaWYgKGkgPT0gNSkgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgqcCAhPSAnOicgJiYgKnAgIT0gJy0nKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBnZXRfc3RyX3NlcChjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqKnBwLCBpbnQgc2VwKQoreworICAgIGNvbnN0IGNoYXIgKnAsICpwMTsKKyAgICBpbnQgbGVuOworICAgIHAgPSAqcHA7CisgICAgcDEgPSBzdHJjaHIocCwgc2VwKTsKKyAgICBpZiAoIXAxKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbGVuID0gcDEgLSBwOworICAgIHAxKys7CisgICAgaWYgKGJ1Zl9zaXplID4gMCkgeworICAgICAgICBpZiAobGVuID4gYnVmX3NpemUgLSAxKQorICAgICAgICAgICAgbGVuID0gYnVmX3NpemUgLSAxOworICAgICAgICBtZW1jcHkoYnVmLCBwLCBsZW4pOworICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgfQorICAgICpwcCA9IHAxOworICAgIHJldHVybiAwOworfQorCitpbnQgcGFyc2VfaG9zdF9zcmNfcG9ydChTb2NrQWRkcmVzcyAqaGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrQWRkcmVzcyAqc2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnB1dF9zdHIpCit7CisgICAgY2hhciAqc3RyID0gc3RyZHVwKGlucHV0X3N0cik7CisgICAgY2hhciAqaG9zdF9zdHIgPSBzdHI7CisgICAgY2hhciAqc3JjX3N0cjsKKyAgICBjb25zdCBjaGFyICpzcmNfc3RyMjsKKyAgICBjaGFyICpwdHI7CisKKyAgICAvKgorICAgICAqIENob3Agb2ZmIGFueSBleHRyYSBhcmd1bWVudHMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdoaWNoCisgICAgICogd291bGQgc3RhcnQgd2l0aCBhIGNvbW1hLCB0aGVuIGZpbGwgaW4gdGhlIHNyYyBwb3J0IGluZm9ybWF0aW9uCisgICAgICogaWYgaXQgd2FzIHByb3ZpZGVkIGVsc2UgdXNlIHRoZSAiYW55IGFkZHJlc3MiIGFuZCAiYW55IHBvcnQiLgorICAgICAqLworICAgIGlmICgocHRyID0gc3RyY2hyKHN0ciwnLCcpKSkKKyAgICAgICAgKnB0ciA9ICdcMCc7CisKKyAgICBpZiAoKHNyY19zdHIgPSBzdHJjaHIoaW5wdXRfc3RyLCdAJykpKSB7CisgICAgICAgICpzcmNfc3RyID0gJ1wwJzsKKyAgICAgICAgc3JjX3N0cisrOworICAgIH0KKworICAgIGlmIChwYXJzZV9ob3N0X3BvcnQoaGFkZHIsIGhvc3Rfc3RyKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHNyY19zdHIyID0gc3JjX3N0cjsKKyAgICBpZiAoIXNyY19zdHIgfHwgKnNyY19zdHIgPT0gJ1wwJykKKyAgICAgICAgc3JjX3N0cjIgPSAiOjAiOworCisgICAgaWYgKHBhcnNlX2hvc3RfcG9ydChzYWRkciwgc3JjX3N0cjIpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZnJlZShzdHIpOworICAgIHJldHVybigwKTsKKworZmFpbDoKKyAgICBmcmVlKHN0cik7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgcGFyc2VfaG9zdF9wb3J0KFNvY2tBZGRyZXNzICpzYWRkciwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGNoYXIgYnVmWzUxMl07CisgICAgY29uc3QgY2hhciAqcCwgKnI7CisgICAgdWludDMyX3QgaXA7CisgICAgaW50IHBvcnQ7CisKKyAgICBwID0gc3RyOworICAgIGlmIChnZXRfc3RyX3NlcChidWYsIHNpemVvZihidWYpLCAmcCwgJzonKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChidWZbMF0gPT0gJ1wwJykgeworICAgICAgICBpcCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHFlbXVfaXNkaWdpdChidWZbMF0pKSB7CisgICAgICAgICAgICBpZiAoaW5ldF9zdHJ0b2lwKGJ1ZiwgJmlwKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNvY2tfYWRkcmVzc19pbml0X3Jlc29sdmUoc2FkZHIsIGJ1ZiwgMCwgMCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtIDE7CisgICAgICAgICAgICBpcCA9IHNvY2tfYWRkcmVzc19nZXRfaXAoc2FkZHIpOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQgPSBzdHJ0b2wocCwgKGNoYXIgKiopJnIsIDApOworICAgIGlmIChyID09IHApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KHNhZGRyLCBpcCwgcG9ydCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiAhZGVmaW5lZChfV0lOMzIpICYmIDAKK3N0YXRpYyBpbnQgcGFyc2VfdW5peF9wYXRoKHN0cnVjdCBzb2NrYWRkcl91biAqdWFkZHIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGludCBsZW47CisKKyAgICBsZW4gPSBNSU4oMTA4LCBzdHJsZW4oc3RyKSk7CisgICAgcCA9IHN0cmNocihzdHIsICcsJyk7CisgICAgaWYgKHApCisJbGVuID0gTUlOKGxlbiwgcCAtIHN0cik7CisKKyAgICBtZW1zZXQodWFkZHIsIDAsIHNpemVvZigqdWFkZHIpKTsKKworICAgIHVhZGRyLT5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBtZW1jcHkodWFkZHItPnN1bl9wYXRoLCBzdHIsIGxlbik7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIHFlbXVfZm9ybWF0X25pY19pbmZvX3N0cihWTEFOQ2xpZW50U3RhdGUgKnZjLCB1aW50OF90IG1hY2FkZHJbNl0pCit7CisgICAgc25wcmludGYodmMtPmluZm9fc3RyLCBzaXplb2YodmMtPmluZm9fc3RyKSwKKyAgICAgICAgICAgICAibW9kZWw9JXMsbWFjYWRkcj0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisgICAgICAgICAgICAgdmMtPm1vZGVsLAorICAgICAgICAgICAgIG1hY2FkZHJbMF0sIG1hY2FkZHJbMV0sIG1hY2FkZHJbMl0sCisgICAgICAgICAgICAgbWFjYWRkclszXSwgbWFjYWRkcls0XSwgbWFjYWRkcls1XSk7Cit9CisKK3N0YXRpYyBjaGFyICphc3NpZ25fbmFtZShWTEFOQ2xpZW50U3RhdGUgKnZjMSwgY29uc3QgY2hhciAqbW9kZWwpCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgaW50IGlkID0gMDsKKworICAgIGZvciAodmxhbiA9IGZpcnN0X3ZsYW47IHZsYW47IHZsYW4gPSB2bGFuLT5uZXh0KSB7CisgICAgICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisKKyAgICAgICAgZm9yICh2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsgdmM7IHZjID0gdmMtPm5leHQpCisgICAgICAgICAgICBpZiAodmMgIT0gdmMxICYmIHN0cmNtcCh2Yy0+bW9kZWwsIG1vZGVsKSA9PSAwKQorICAgICAgICAgICAgICAgIGlkKys7CisgICAgfQorCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLiVkIiwgbW9kZWwsIGlkKTsKKworICAgIHJldHVybiBzdHJkdXAoYnVmKTsKK30KKworVkxBTkNsaWVudFN0YXRlICpxZW11X25ld192bGFuX2NsaWVudChWTEFOU3RhdGUgKnZsYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRDYW5SZWNlaXZlICpjYW5fcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0UmVjZWl2ZSAqcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0UmVjZWl2ZUlPViAqcmVjZWl2ZV9pb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldENsZWFudXAgKmNsZWFudXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjLCAqKnB2YzsKKyAgICB2YyA9IGdfbWFsbG9jMChzaXplb2YoVkxBTkNsaWVudFN0YXRlKSk7CisgICAgdmMtPm1vZGVsID0gc3RyZHVwKG1vZGVsKTsKKyAgICBpZiAobmFtZSkKKyAgICAgICAgdmMtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisgICAgZWxzZQorICAgICAgICB2Yy0+bmFtZSA9IGFzc2lnbl9uYW1lKHZjLCBtb2RlbCk7CisgICAgdmMtPmNhbl9yZWNlaXZlID0gY2FuX3JlY2VpdmU7CisgICAgdmMtPnJlY2VpdmUgPSByZWNlaXZlOworICAgIHZjLT5yZWNlaXZlX2lvdiA9IHJlY2VpdmVfaW92OworICAgIHZjLT5jbGVhbnVwID0gY2xlYW51cDsKKyAgICB2Yy0+b3BhcXVlID0gb3BhcXVlOworICAgIHZjLT52bGFuID0gdmxhbjsKKworICAgIHZjLT5uZXh0ID0gTlVMTDsKKyAgICBwdmMgPSAmdmxhbi0+Zmlyc3RfY2xpZW50OworICAgIHdoaWxlICgqcHZjICE9IE5VTEwpCisgICAgICAgIHB2YyA9ICYoKnB2YyktPm5leHQ7CisgICAgKnB2YyA9IHZjOworICAgIHJldHVybiB2YzsKK30KKwordm9pZCBxZW11X2RlbF92bGFuX2NsaWVudChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIFZMQU5DbGllbnRTdGF0ZSAqKnB2YyA9ICZ2Yy0+dmxhbi0+Zmlyc3RfY2xpZW50OworCisgICAgd2hpbGUgKCpwdmMgIT0gTlVMTCkKKyAgICAgICAgaWYgKCpwdmMgPT0gdmMpIHsKKyAgICAgICAgICAgICpwdmMgPSB2Yy0+bmV4dDsKKyAgICAgICAgICAgIGlmICh2Yy0+Y2xlYW51cCkgeworICAgICAgICAgICAgICAgIHZjLT5jbGVhbnVwKHZjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUodmMtPm5hbWUpOworICAgICAgICAgICAgZnJlZSh2Yy0+bW9kZWwpOworICAgICAgICAgICAgZ19mcmVlKHZjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHB2YyA9ICYoKnB2YyktPm5leHQ7Cit9CisKK1ZMQU5DbGllbnRTdGF0ZSAqcWVtdV9maW5kX3ZsYW5fY2xpZW50KFZMQU5TdGF0ZSAqdmxhbiwgdm9pZCAqb3BhcXVlKQoreworICAgIFZMQU5DbGllbnRTdGF0ZSAqKnB2YyA9ICZ2bGFuLT5maXJzdF9jbGllbnQ7CisKKyAgICB3aGlsZSAoKnB2YyAhPSBOVUxMKQorICAgICAgICBpZiAoKCpwdmMpLT5vcGFxdWUgPT0gb3BhcXVlKQorICAgICAgICAgICAgcmV0dXJuICpwdmM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB2YyA9ICYoKnB2YyktPm5leHQ7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IHFlbXVfY2FuX3NlbmRfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyKQoreworICAgIFZMQU5TdGF0ZSAqdmxhbiA9IHNlbmRlci0+dmxhbjsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworCisgICAgZm9yICh2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsgdmMgIT0gTlVMTDsgdmMgPSB2Yy0+bmV4dCkgeworICAgICAgICBpZiAodmMgPT0gc2VuZGVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG5vIGNhbl9yZWNlaXZlKCkgaGFuZGxlciwgdGhleSBjYW4gYWx3YXlzIHJlY2VpdmUgKi8KKyAgICAgICAgaWYgKCF2Yy0+Y2FuX3JlY2VpdmUgfHwgdmMtPmNhbl9yZWNlaXZlKHZjKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FlbXVfZGVsaXZlcl9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKyAgICBpbnQgcmV0ID0gLTE7CisKKyAgICBzZW5kZXItPnZsYW4tPmRlbGl2ZXJpbmcgPSAxOworCisgICAgZm9yICh2YyA9IHNlbmRlci0+dmxhbi0+Zmlyc3RfY2xpZW50OyB2YyAhPSBOVUxMOyB2YyA9IHZjLT5uZXh0KSB7CisgICAgICAgIHNzaXplX3QgbGVuOworCisgICAgICAgIGlmICh2YyA9PSBzZW5kZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZjLT5saW5rX2Rvd24pIHsKKyAgICAgICAgICAgIHJldCA9IHNpemU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IHZjLT5yZWNlaXZlKHZjLCBidWYsIHNpemUpOworCisgICAgICAgIHJldCA9IChyZXQgPj0gMCkgPyByZXQgOiBsZW47CisgICAgfQorCisgICAgc2VuZGVyLT52bGFuLT5kZWxpdmVyaW5nID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgcWVtdV9mbHVzaF9xdWV1ZWRfcGFja2V0cyhWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIFZMQU5QYWNrZXQgKnBhY2tldDsKKworICAgIHdoaWxlICgocGFja2V0ID0gdmMtPnZsYW4tPnNlbmRfcXVldWUpICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICB2Yy0+dmxhbi0+c2VuZF9xdWV1ZSA9IHBhY2tldC0+bmV4dDsKKworICAgICAgICByZXQgPSBxZW11X2RlbGl2ZXJfcGFja2V0KHBhY2tldC0+c2VuZGVyLCBwYWNrZXQtPmRhdGEsIHBhY2tldC0+c2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gMCAmJiBwYWNrZXQtPnNlbnRfY2IgIT0gTlVMTCkgeworICAgICAgICAgICAgcGFja2V0LT5uZXh0ID0gdmMtPnZsYW4tPnNlbmRfcXVldWU7CisgICAgICAgICAgICB2Yy0+dmxhbi0+c2VuZF9xdWV1ZSA9IHBhY2tldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhY2tldC0+c2VudF9jYikKKyAgICAgICAgICAgIHBhY2tldC0+c2VudF9jYihwYWNrZXQtPnNlbmRlcik7CisKKyAgICAgICAgZ19mcmVlKHBhY2tldCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxZW11X2VucXVldWVfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRQYWNrZXRTZW50ICpzZW50X2NiKQoreworICAgIFZMQU5QYWNrZXQgKnBhY2tldDsKKworICAgIHBhY2tldCA9IGdfbWFsbG9jKHNpemVvZihWTEFOUGFja2V0KSArIHNpemUpOworICAgIHBhY2tldC0+bmV4dCA9IHNlbmRlci0+dmxhbi0+c2VuZF9xdWV1ZTsKKyAgICBwYWNrZXQtPnNlbmRlciA9IHNlbmRlcjsKKyAgICBwYWNrZXQtPnNpemUgPSBzaXplOworICAgIHBhY2tldC0+c2VudF9jYiA9IHNlbnRfY2I7CisgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSwgYnVmLCBzaXplKTsKKyAgICBzZW5kZXItPnZsYW4tPnNlbmRfcXVldWUgPSBwYWNrZXQ7Cit9CisKK3NzaXplX3QgcWVtdV9zZW5kX3BhY2tldF9hc3luYyhWTEFOQ2xpZW50U3RhdGUgKnNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldFBhY2tldFNlbnQgKnNlbnRfY2IpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChzZW5kZXItPmxpbmtfZG93bikgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19ORVQKKyAgICBwcmludGYoInZsYW4gJWQgc2VuZDpcbiIsIHNlbmRlci0+dmxhbi0+aWQpOworICAgIGhleF9kdW1wKHN0ZG91dCwgYnVmLCBzaXplKTsKKyNlbmRpZgorCisgICAgaWYgKHNlbmRlci0+dmxhbi0+ZGVsaXZlcmluZykgeworICAgICAgICBxZW11X2VucXVldWVfcGFja2V0KHNlbmRlciwgYnVmLCBzaXplLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgcmV0ID0gcWVtdV9kZWxpdmVyX3BhY2tldChzZW5kZXIsIGJ1Ziwgc2l6ZSk7CisgICAgaWYgKHJldCA9PSAwICYmIHNlbnRfY2IgIT0gTlVMTCkgeworICAgICAgICBxZW11X2VucXVldWVfcGFja2V0KHNlbmRlciwgYnVmLCBzaXplLCBzZW50X2NiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcWVtdV9mbHVzaF9xdWV1ZWRfcGFja2V0cyhzZW5kZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBxZW11X3NlbmRfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgcWVtdV9zZW5kX3BhY2tldF9hc3luYyh2YywgYnVmLCBzaXplLCBOVUxMKTsKK30KKworc3RhdGljIHNzaXplX3QgdmNfc2VuZHZfY29tcGF0KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb3ZjbnQpCit7CisgICAgdWludDhfdCBidWZmZXJbNDA5Nl07CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGxlbjsKKworICAgICAgICBsZW4gPSBNSU4oc2l6ZW9mKGJ1ZmZlcikgLSBvZmZzZXQsIGlvdltpXS5pb3ZfbGVuKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciArIG9mZnNldCwgaW92W2ldLmlvdl9iYXNlLCBsZW4pOworICAgICAgICBvZmZzZXQgKz0gbGVuOworICAgIH0KKworICAgIHJldHVybiB2Yy0+cmVjZWl2ZSh2YywgYnVmZmVyLCBvZmZzZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBjYWxjX2lvdl9sZW5ndGgoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQpCit7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW92Y250OyBpKyspCisgICAgICAgIG9mZnNldCArPSBpb3ZbaV0uaW92X2xlbjsKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IHFlbXVfZGVsaXZlcl9wYWNrZXRfaW92KFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCkKK3sKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIGludCByZXQgPSAtMTsKKworICAgIHNlbmRlci0+dmxhbi0+ZGVsaXZlcmluZyA9IDE7CisKKyAgICBmb3IgKHZjID0gc2VuZGVyLT52bGFuLT5maXJzdF9jbGllbnQ7IHZjICE9IE5VTEw7IHZjID0gdmMtPm5leHQpIHsKKyAgICAgICAgc3NpemVfdCBsZW47CisKKyAgICAgICAgaWYgKHZjID09IHNlbmRlcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmMtPmxpbmtfZG93bikgeworICAgICAgICAgICAgcmV0ID0gY2FsY19pb3ZfbGVuZ3RoKGlvdiwgaW92Y250KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZjLT5yZWNlaXZlX2lvdikgeworICAgICAgICAgICAgbGVuID0gdmMtPnJlY2VpdmVfaW92KHZjLCBpb3YsIGlvdmNudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gPSB2Y19zZW5kdl9jb21wYXQodmMsIGlvdiwgaW92Y250KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IChyZXQgPj0gMCkgPyByZXQgOiBsZW47CisgICAgfQorCisgICAgc2VuZGVyLT52bGFuLT5kZWxpdmVyaW5nID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHFlbXVfZW5xdWV1ZV9wYWNrZXRfaW92KFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRQYWNrZXRTZW50ICpzZW50X2NiKQoreworICAgIFZMQU5QYWNrZXQgKnBhY2tldDsKKyAgICBzaXplX3QgbWF4X2xlbiA9IDA7CisgICAgaW50IGk7CisKKyAgICBtYXhfbGVuID0gY2FsY19pb3ZfbGVuZ3RoKGlvdiwgaW92Y250KTsKKworICAgIHBhY2tldCA9IGdfbWFsbG9jKHNpemVvZihWTEFOUGFja2V0KSArIG1heF9sZW4pOworICAgIHBhY2tldC0+bmV4dCA9IHNlbmRlci0+dmxhbi0+c2VuZF9xdWV1ZTsKKyAgICBwYWNrZXQtPnNlbmRlciA9IHNlbmRlcjsKKyAgICBwYWNrZXQtPnNlbnRfY2IgPSBzZW50X2NiOworICAgIHBhY2tldC0+c2l6ZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW92Y250OyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IGlvdltpXS5pb3ZfbGVuOworCisgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEgKyBwYWNrZXQtPnNpemUsIGlvdltpXS5pb3ZfYmFzZSwgbGVuKTsKKyAgICAgICAgcGFja2V0LT5zaXplICs9IGxlbjsKKyAgICB9CisKKyAgICBzZW5kZXItPnZsYW4tPnNlbmRfcXVldWUgPSBwYWNrZXQ7CisKKyAgICByZXR1cm4gcGFja2V0LT5zaXplOworfQorCitzc2l6ZV90IHFlbXVfc2VuZHZfcGFja2V0X2FzeW5jKFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0UGFja2V0U2VudCAqc2VudF9jYikKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNlbmRlci0+bGlua19kb3duKSB7CisgICAgICAgIHJldHVybiBjYWxjX2lvdl9sZW5ndGgoaW92LCBpb3ZjbnQpOworICAgIH0KKworICAgIGlmIChzZW5kZXItPnZsYW4tPmRlbGl2ZXJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHFlbXVfZW5xdWV1ZV9wYWNrZXRfaW92KHNlbmRlciwgaW92LCBpb3ZjbnQsIE5VTEwpOworICAgIH0KKworICAgIHJldCA9IHFlbXVfZGVsaXZlcl9wYWNrZXRfaW92KHNlbmRlciwgaW92LCBpb3ZjbnQpOworICAgIGlmIChyZXQgPT0gMCAmJiBzZW50X2NiICE9IE5VTEwpIHsKKyAgICAgICAgcWVtdV9lbnF1ZXVlX3BhY2tldF9pb3Yoc2VuZGVyLCBpb3YsIGlvdmNudCwgc2VudF9jYik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHFlbXVfZmx1c2hfcXVldWVkX3BhY2tldHMoc2VuZGVyKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK3FlbXVfc2VuZHZfcGFja2V0KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250KQoreworICAgIHJldHVybiBxZW11X3NlbmR2X3BhY2tldF9hc3luYyh2YywgaW92LCBpb3ZjbnQsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfZXJyb3IoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgaWYgKG1vbikgeworICAgICAgICBtb25pdG9yX3ZwcmludGYobW9uLCBmbXQsIGFwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICIpOworICAgICAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICB2YV9lbmQoYXApOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfU0xJUlApCisKKy8qIHNsaXJwIG5ldHdvcmsgYWRhcHRlciAqLworCitzdHJ1Y3Qgc2xpcnBfY29uZmlnX3N0ciB7CisgICAgc3RydWN0IHNsaXJwX2NvbmZpZ19zdHIgKm5leHQ7CisgICAgY29uc3QgY2hhciAqc3RyOworfTsKKworc3RhdGljIGludCBzbGlycF9pbml0ZWQ7CitzdGF0aWMgc3RydWN0IHNsaXJwX2NvbmZpZ19zdHIgKnNsaXJwX3JlZGlyczsKKyNpZm5kZWYgX1dJTjMyCitzdGF0aWMgY29uc3QgY2hhciAqc2xpcnBfc21iX2V4cG9ydDsKKyNlbmRpZgorc3RhdGljIFZMQU5DbGllbnRTdGF0ZSAqc2xpcnBfdmM7CisKKyNpZm5kZWYgX1dJTjMyCitzdGF0aWMgdm9pZCBzbGlycF9zbWIoY29uc3QgY2hhciAqZXhwb3J0ZWRfZGlyKTsKKyNlbmRpZgorc3RhdGljIHZvaWQgc2xpcnBfcmVkaXJlY3Rpb24oTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpyZWRpcl9zdHIpOworCitpbnQKK2lwX3BhY2tldF9pc19pbnRlcm5hbCggY29uc3QgdWludDhfdCogIGRhdGEsIHNpemVfdCAgc2l6ZSApCit7CisgICAgY29uc3QgdWludDhfdCogIGVuZCA9IGRhdGEgKyBzaXplOworCisgICAgLyogbXVzdCBoYXZlIHJvb20gZm9yIE1hYyArIElQIGhlYWRlciAqLworICAgIGlmIChkYXRhICsgNDAgPiBlbmQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGRhdGFbMTJdICE9IDB4MDggfHwgZGF0YVsxM10gIT0gMHgwMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogbXVzdCBoYXZlIHZhbGlkIElQIGhlYWRlciAqLworICAgIGRhdGEgKz0gMTQ7CisgICAgaWYgKChkYXRhWzBdID4+IDQpICE9IDQgfHwgKGRhdGFbMF0gJiAxNSkgPCA1KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGludGVybmFsIGlmIGJvdGggc291cmNlIGFuZCBkZXN0IGFkZHJlc3NlcyBhcmUgaW4gMTAueC54LnggKi8KKyAgICByZXR1cm4gKCBkYXRhWzEyXSA9PSAxMCAmJiBkYXRhWzE2XSA9PSAxMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9uZXRfZGVsYXlfaW5fY2IoIHZvaWQqICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICBzaXplX3QgIHNpemUsCisgICAgICAgICAgICAgICAgICAgdm9pZCogICBvcGFxdWUgKQoreworICAgIHNsaXJwX2lucHV0KCAoY29uc3QgdWludDhfdCopZGF0YSwgKGludClzaXplICk7CisgICAgKHZvaWQpb3BhcXVlOworfQorCitzdGF0aWMgdm9pZAorYW5kcm9pZF9uZXRfc2hhcGVyX2luX2NiKCB2b2lkKiAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogICBvcGFxdWUgKQoreworICAgIG5ldGRlbGF5X3NlbmRfYXV4KCBhbmRyb2lkX25ldF9kZWxheV9pbiwgZGF0YSwgc2l6ZSwgb3BhcXVlICk7Cit9CisKK3N0YXRpYyB2b2lkCithbmRyb2lkX25ldF9zaGFwZXJfb3V0X2NiKCB2b2lkKiAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgIG9wYXF1ZSApCit7CisgICAgcWVtdV9zZW5kX3BhY2tldCggc2xpcnBfdmMsIChjb25zdCB1aW50OF90KilkYXRhLCAoaW50KXNpemUgKTsKK30KKwordm9pZAorc2xpcnBfaW5pdF9zaGFwZXJzKCB2b2lkICkKK3sKKyAgICBhbmRyb2lkX25ldF9kZWxheV9pbiAgID0gbmV0ZGVsYXlfY3JlYXRlKCBhbmRyb2lkX25ldF9kZWxheV9pbl9jYiApOworICAgIGFuZHJvaWRfbmV0X3NoYXBlcl9pbiAgPSBuZXRzaGFwZXJfY3JlYXRlKCAxLCBhbmRyb2lkX25ldF9zaGFwZXJfaW5fY2IgKTsKKyAgICBhbmRyb2lkX25ldF9zaGFwZXJfb3V0ID0gbmV0c2hhcGVyX2NyZWF0ZSggMSwgYW5kcm9pZF9uZXRfc2hhcGVyX291dF9jYiApOworCisgICAgbmV0ZGVsYXlfc2V0X2xhdGVuY3koIGFuZHJvaWRfbmV0X2RlbGF5X2luLCBhbmRyb2lkX25ldF9taW5fbGF0ZW5jeSwgYW5kcm9pZF9uZXRfbWF4X2xhdGVuY3kgKTsKKyAgICBuZXRzaGFwZXJfc2V0X3JhdGUoIGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQsIGFuZHJvaWRfbmV0X2Rvd25sb2FkX3NwZWVkICk7CisgICAgbmV0c2hhcGVyX3NldF9yYXRlKCBhbmRyb2lkX25ldF9zaGFwZXJfaW4sICBhbmRyb2lkX25ldF91cGxvYWRfc3BlZWQgICk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfQU5EUk9JRCAqLworCisKK2ludCBzbGlycF9jYW5fb3V0cHV0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICByZXR1cm4gIXNsaXJwX3ZjIHx8CisgICAgICAgICAgICggbmV0c2hhcGVyX2Nhbl9zZW5kKGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQpICYmCisgICAgICAgICAgICAgcWVtdV9jYW5fc2VuZF9wYWNrZXQoc2xpcnBfdmMpICk7CisjZWxzZQorICAgIHJldHVybiAhc2xpcnBfdmMgfHwgcWVtdV9jYW5fc2VuZF9wYWNrZXQoc2xpcnBfdmMpOworI2VuZGlmCit9CisKK3ZvaWQgc2xpcnBfb3V0cHV0KGNvbnN0IHVpbnQ4X3QgKnBrdCwgaW50IHBrdF9sZW4pCit7CisjaWZkZWYgREVCVUdfU0xJUlAKKyAgICBwcmludGYoInNsaXJwIG91dHB1dDpcbiIpOworICAgIGhleF9kdW1wKHN0ZG91dCwgcGt0LCBwa3RfbGVuKTsKKyNlbmRpZgorICAgIGlmIChxZW11X3RjcGR1bXBfYWN0aXZlKQorICAgICAgICBxZW11X3RjcGR1bXBfcGFja2V0KHBrdCwgcGt0X2xlbik7CisKKyAgICBpZiAoIXNsaXJwX3ZjKQorICAgICAgICByZXR1cm47CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIG5ldHNoYXBlcl9zZW5kKGFuZHJvaWRfbmV0X3NoYXBlcl9vdXQsICh2b2lkKilwa3QsIHBrdF9sZW4pOworI2Vsc2UKKyAgICBxZW11X3NlbmRfcGFja2V0KHNsaXJwX3ZjLCBwa3QsIHBrdF9sZW4pOworI2VuZGlmCit9CisKK2ludCBzbGlycF9pc19pbml0ZWQodm9pZCkKK3sKKyAgICByZXR1cm4gc2xpcnBfaW5pdGVkOworfQorCitzdGF0aWMgc3NpemVfdCBzbGlycF9yZWNlaXZlKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisjaWZkZWYgREVCVUdfU0xJUlAKKyAgICBwcmludGYoInNsaXJwIGlucHV0OlxuIik7CisgICAgaGV4X2R1bXAoc3Rkb3V0LCBidWYsIHNpemUpOworI2VuZGlmCisgICAgaWYgKHFlbXVfdGNwZHVtcF9hY3RpdmUpCisgICAgICAgIHFlbXVfdGNwZHVtcF9wYWNrZXQoYnVmLCBzaXplKTsKKworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgbmV0c2hhcGVyX3NlbmQoYW5kcm9pZF9uZXRfc2hhcGVyX2luLCAoY2hhciopYnVmLCBzaXplKTsKKyNlbHNlCisgICAgc2xpcnBfaW5wdXQoYnVmLCBzaXplKTsKKyNlbmRpZgorICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IHNsaXJwX2luX3VzZTsKKworc3RhdGljIHZvaWQgbmV0X3NsaXJwX2NsZWFudXAoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBzbGlycF9pbl91c2UgPSAwOworfQorCitzdGF0aWMgaW50IG5ldF9zbGlycF9pbml0KFZMQU5TdGF0ZSAqdmxhbiwgY29uc3QgY2hhciAqbW9kZWwsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN0cmljdGVkLCBjb25zdCBjaGFyICppcCkKK3sKKyAgICBpZiAoc2xpcnBfaW5fdXNlKSB7CisgICAgICAgIC8qIHNsaXJwIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgaW5zdGFuY2Ugc28gZmFyICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFzbGlycF9pbml0ZWQpIHsKKyAgICAgICAgc2xpcnBfaW5pdGVkID0gMTsKKyAgICAgICAgc2xpcnBfaW5pdChyZXN0cmljdGVkLCBpcCk7CisKKyAgICAgICAgd2hpbGUgKHNsaXJwX3JlZGlycykgeworICAgICAgICAgICAgc3RydWN0IHNsaXJwX2NvbmZpZ19zdHIgKmNvbmZpZyA9IHNsaXJwX3JlZGlyczsKKworICAgICAgICAgICAgc2xpcnBfcmVkaXJlY3Rpb24oTlVMTCwgY29uZmlnLT5zdHIpOworICAgICAgICAgICAgc2xpcnBfcmVkaXJzID0gY29uZmlnLT5uZXh0OworICAgICAgICAgICAgZ19mcmVlKGNvbmZpZyk7CisgICAgICAgIH0KKyNpZm5kZWYgX1dJTjMyCisgICAgICAgIGlmIChzbGlycF9zbWJfZXhwb3J0KSB7CisgICAgICAgICAgICBzbGlycF9zbWIoc2xpcnBfc21iX2V4cG9ydCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBzbGlycF9pbml0X3NoYXBlcnMoKTsKKyAgICB9CisKKyAgICBzbGlycF92YyA9IHFlbXVfbmV3X3ZsYW5fY2xpZW50KHZsYW4sIG1vZGVsLCBuYW1lLCBOVUxMLCBzbGlycF9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbmV0X3NsaXJwX2NsZWFudXAsIE5VTEwpOworICAgIHNsaXJwX3ZjLT5pbmZvX3N0clswXSA9ICdcMCc7CisgICAgc2xpcnBfaW5fdXNlID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0X3NsaXJwX3JlZGlyX3ByaW50KHZvaWQgKm9wYXF1ZSwgaW50IGlzX3VkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2NrQWRkcmVzcyAqbGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MgKmZhZGRyKQoreworICAgIE1vbml0b3IgKm1vbiA9IChNb25pdG9yICopb3BhcXVlOworICAgIHVpbnQzMl90IGhfYWRkcjsKKyAgICB1aW50MzJfdCBnX2FkZHI7CisgICAgY2hhciBidWZbMTZdOworCisgICAgaF9hZGRyID0gc29ja19hZGRyZXNzX2dldF9pcChmYWRkcik7CisgICAgZ19hZGRyID0gc29ja19hZGRyZXNzX2dldF9pcChsYWRkcik7CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICVzIHwiLCBpc191ZHAgPyAidWRwIiA6ICJ0Y3AiICk7CisgICAgc25wcmludGYoYnVmLCAxNSwgIiVkLiVkLiVkLiVkIiwgKGhfYWRkciA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoX2FkZHIgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaF9hZGRyID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaF9hZGRyKSAmIDB4ZmYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlMTVzIHwiLCBidWYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlNWQgfCIsIHNvY2tfYWRkcmVzc19nZXRfcG9ydChmYWRkcikpOworCisgICAgc25wcmludGYoYnVmLCAxNSwgIiVkLiVkLiVkLiVkIiwgKGdfYWRkciA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnX2FkZHIgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ19hZGRyID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ19hZGRyKSAmIDB4ZmYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlMTVzIHwiLCBidWYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlNWRcbiIsIHNvY2tfYWRkcmVzc19nZXRfcG9ydChsYWRkcikpOworCit9CisKK3N0YXRpYyB2b2lkIG5ldF9zbGlycF9yZWRpcl9saXN0KE1vbml0b3IgKm1vbikKK3sKKyAgICBpZiAoIW1vbikKKyAgICAgICAgcmV0dXJuOworCisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiIFByb3QgfCAgICBIb3N0IEFkZHIgICAgfCBIUG9ydCB8ICAgIEd1ZXN0IEFkZHIgICB8IEdQb3J0XG4iKTsKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICBcbiIpOworICAgIHNsaXJwX3JlZGlyX2xvb3AobmV0X3NsaXJwX3JlZGlyX3ByaW50LCBtb24pOworfQorCitzdGF0aWMgdm9pZCBuZXRfc2xpcnBfcmVkaXJfcm0oTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpwb3J0X3N0cikKK3sKKyAgICBpbnQgaG9zdF9wb3J0OworICAgIGNoYXIgYnVmWzI1Nl0gPSAiIjsKKyAgICBjb25zdCBjaGFyICpwID0gcG9ydF9zdHI7CisgICAgaW50IGlzX3VkcCA9IDA7CisgICAgaW50IG47CisKKyAgICBpZiAoIW1vbikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFwb3J0X3N0ciB8fCAhcG9ydF9zdHJbMF0pCisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisKKyAgICBnZXRfc3RyX3NlcChidWYsIHNpemVvZihidWYpLCAmcCwgJzonKTsKKworICAgIGlmICghc3RyY21wKGJ1ZiwgInRjcCIpIHx8IGJ1ZlswXSA9PSAnXDAnKSB7CisgICAgICAgIGlzX3VkcCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInVkcCIpKSB7CisgICAgICAgIGlzX3VkcCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBmYWlsX3N5bnRheDsKKyAgICB9CisKKyAgICBob3N0X3BvcnQgPSBhdG9pKHApOworCisgICAgbiA9IHNsaXJwX3JlZGlyX3JtKGlzX3VkcCwgaG9zdF9wb3J0KTsKKworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgInJlbW92ZWQgJWQgcmVkaXJlY3Rpb25zIHRvICVzIHBvcnQgJWRcbiIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICBpc191ZHAgPyAidWRwIiA6ICJ0Y3AiLCBob3N0X3BvcnQpOworICAgIHJldHVybjsKKworIGZhaWxfc3ludGF4OgorICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgImludmFsaWQgZm9ybWF0XG4iKTsKK30KKworc3RhdGljIHZvaWQgc2xpcnBfcmVkaXJlY3Rpb24oTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpyZWRpcl9zdHIpCit7CisgICAgdWludDMyX3QgZ3Vlc3RfYWRkcjsKKyAgICBpbnQgaG9zdF9wb3J0LCBndWVzdF9wb3J0OworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgY2hhciBidWZbMjU2XSwgKnI7CisgICAgaW50IGlzX3VkcDsKKworICAgIHAgPSByZWRpcl9zdHI7CisgICAgaWYgKGdldF9zdHJfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZwLCAnOicpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWxfc3ludGF4OworICAgIH0KKyAgICBpZiAoIXN0cmNtcChidWYsICJ0Y3AiKSB8fCBidWZbMF0gPT0gJ1wwJykgeworICAgICAgICBpc191ZHAgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChidWYsICJ1ZHAiKSkgeworICAgICAgICBpc191ZHAgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorCisgICAgaWYgKGdldF9zdHJfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZwLCAnOicpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWxfc3ludGF4OworICAgIH0KKyAgICBob3N0X3BvcnQgPSBzdHJ0b2woYnVmLCAmciwgMCk7CisgICAgaWYgKHIgPT0gYnVmKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorCisgICAgaWYgKGdldF9zdHJfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZwLCAnOicpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWxfc3ludGF4OworICAgIH0KKyAgICBpZiAoYnVmWzBdID09ICdcMCcpIHsKKyAgICAgICAgcHN0cmNweShidWYsIHNpemVvZihidWYpLCAiMTAuMC4yLjE1Iik7CisgICAgfQorICAgIGlmIChpbmV0X3N0cnRvaXAoYnVmLCAmZ3Vlc3RfYWRkcikgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorCisgICAgZ3Vlc3RfcG9ydCA9IHN0cnRvbChwLCAmciwgMCk7CisgICAgaWYgKHIgPT0gcCkgeworICAgICAgICBnb3RvIGZhaWxfc3ludGF4OworICAgIH0KKworICAgIGlmIChzbGlycF9yZWRpcihpc191ZHAsIGhvc3RfcG9ydCwgZ3Vlc3RfYWRkciwgZ3Vlc3RfcG9ydCkgPCAwKSB7CisgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJjb3VsZCBub3Qgc2V0IHVwIHJlZGlyZWN0aW9uICclcydcbiIsIHJlZGlyX3N0cik7CisgICAgfQorICAgIHJldHVybjsKKworIGZhaWxfc3ludGF4OgorICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHJlZGlyZWN0aW9uIGZvcm1hdCAnJXMnXG4iLCByZWRpcl9zdHIpOworfQorCit2b2lkIG5ldF9zbGlycF9yZWRpcihNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKnJlZGlyX3N0ciwgY29uc3QgY2hhciAqcmVkaXJfb3B0MikKK3sKKyAgICBzdHJ1Y3Qgc2xpcnBfY29uZmlnX3N0ciAqY29uZmlnOworCisgICAgaWYgKCFzbGlycF9pbml0ZWQpIHsKKyAgICAgICAgaWYgKG1vbikgeworICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAidXNlciBtb2RlIG5ldHdvcmsgc3RhY2sgbm90IGluIHVzZVxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWcgPSBnX21hbGxvYyhzaXplb2YoKmNvbmZpZykpOworICAgICAgICAgICAgY29uZmlnLT5zdHIgPSByZWRpcl9zdHI7CisgICAgICAgICAgICBjb25maWctPm5leHQgPSBzbGlycF9yZWRpcnM7CisgICAgICAgICAgICBzbGlycF9yZWRpcnMgPSBjb25maWc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghc3RyY21wKHJlZGlyX3N0ciwgInJlbW92ZSIpKSB7CisgICAgICAgIG5ldF9zbGlycF9yZWRpcl9ybShtb24sIHJlZGlyX29wdDIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAocmVkaXJfc3RyLCAibGlzdCIpKSB7CisgICAgICAgIG5ldF9zbGlycF9yZWRpcl9saXN0KG1vbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzbGlycF9yZWRpcmVjdGlvbihtb24sIHJlZGlyX3N0cik7Cit9CisKKyNpZm5kZWYgX1dJTjMyCisKK3N0YXRpYyBjaGFyIHNtYl9kaXJbMTAyNF07CisKK3N0YXRpYyB2b2lkIGVyYXNlX2RpcihjaGFyICpkaXJfbmFtZSkKK3sKKyAgICBESVIgKmQ7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKworICAgIC8qIGVyYXNlIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSAqLworICAgIGlmICgoZCA9IG9wZW5kaXIoZGlyX25hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgIGZvcig7OykgeworICAgICAgICAgICAgZGUgPSByZWFkZGlyKGQpOworICAgICAgICAgICAgaWYgKCFkZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZGUtPmRfbmFtZSwgIi4iKSAhPSAwICYmCisgICAgICAgICAgICAgICAgc3RyY21wKGRlLT5kX25hbWUsICIuLiIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbWJfZGlyLCBkZS0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodW5saW5rKGZpbGVuYW1lKSAhPSAwKSAgLyogaXMgaXQgYSBkaXJlY3Rvcnk/ICovCisgICAgICAgICAgICAgICAgICAgIGVyYXNlX2RpcihmaWxlbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIoZCk7CisgICAgICAgIHJtZGlyKGRpcl9uYW1lKTsKKyAgICB9Cit9CisKKy8qIGF1dG9tYXRpYyB1c2VyIG1vZGUgc2FtYmEgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyB2b2lkIHNtYl9leGl0KHZvaWQpCit7CisgICAgZXJhc2VfZGlyKHNtYl9kaXIpOworfQorCitzdGF0aWMgdm9pZCBzbGlycF9zbWIoY29uc3QgY2hhciAqZXhwb3J0ZWRfZGlyKQoreworICAgIGNoYXIgc21iX2NvbmZbMTAyNF07CisgICAgY2hhciBzbWJfY21kbGluZVsxMDI0XTsKKyAgICBGSUxFICpmOworCisgICAgLyogWFhYOiBiZXR0ZXIgdG1wIGRpciBjb25zdHJ1Y3Rpb24gKi8KKyAgICBzbnByaW50ZihzbWJfZGlyLCBzaXplb2Yoc21iX2RpciksICIvdG1wL3FlbXUtc21iLiVsZCIsIChsb25nKWdldHBpZCgpKTsKKyAgICBpZiAobWtkaXIoc21iX2RpciwgMDcwMCkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogY291bGQgbm90IGNyZWF0ZSBzYW1iYSBzZXJ2ZXIgZGlyICclcydcbiIsIHNtYl9kaXIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBzbnByaW50ZihzbWJfY29uZiwgc2l6ZW9mKHNtYl9jb25mKSwgIiVzLyVzIiwgc21iX2RpciwgInNtYi5jb25mIik7CisKKyAgICBmID0gZm9wZW4oc21iX2NvbmYsICJ3Iik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogY291bGQgbm90IGNyZWF0ZSBzYW1iYSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmaWxlICclcydcbiIsIHNtYl9jb25mKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZnByaW50ZihmLAorICAgICAgICAgICAgIltnbG9iYWxdXG4iCisgICAgICAgICAgICAicHJpdmF0ZSBkaXI9JXNcbiIKKyAgICAgICAgICAgICJzbWIgcG9ydHM9MFxuIgorICAgICAgICAgICAgInNvY2tldCBhZGRyZXNzPTEyNy4wLjAuMVxuIgorICAgICAgICAgICAgInBpZCBkaXJlY3Rvcnk9JXNcbiIKKyAgICAgICAgICAgICJsb2NrIGRpcmVjdG9yeT0lc1xuIgorICAgICAgICAgICAgImxvZyBmaWxlPSVzL2xvZy5zbWJkXG4iCisgICAgICAgICAgICAic21iIHBhc3N3ZCBmaWxlPSVzL3NtYnBhc3N3ZFxuIgorICAgICAgICAgICAgInNlY3VyaXR5ID0gc2hhcmVcbiIKKyAgICAgICAgICAgICJbcWVtdV1cbiIKKyAgICAgICAgICAgICJwYXRoPSVzXG4iCisgICAgICAgICAgICAicmVhZCBvbmx5PW5vXG4iCisgICAgICAgICAgICAiZ3Vlc3Qgb2s9eWVzXG4iLAorICAgICAgICAgICAgc21iX2RpciwKKyAgICAgICAgICAgIHNtYl9kaXIsCisgICAgICAgICAgICBzbWJfZGlyLAorICAgICAgICAgICAgc21iX2RpciwKKyAgICAgICAgICAgIHNtYl9kaXIsCisgICAgICAgICAgICBleHBvcnRlZF9kaXIKKyAgICAgICAgICAgICk7CisgICAgZmNsb3NlKGYpOworICAgIGF0ZXhpdChzbWJfZXhpdCk7CisKKyAgICBzbnByaW50ZihzbWJfY21kbGluZSwgc2l6ZW9mKHNtYl9jbWRsaW5lKSwgIiVzIC1zICVzIiwKKyAgICAgICAgICAgICBTTUJEX0NPTU1BTkQsIHNtYl9jb25mKTsKKworICAgIHNsaXJwX2FkZF9leGVjKDAsIHNtYl9jbWRsaW5lLCA0LCAxMzkpOworfQorCisvKiBhdXRvbWF0aWMgdXNlciBtb2RlIHNhbWJhIHNlcnZlciBjb25maWd1cmF0aW9uICovCit2b2lkIG5ldF9zbGlycF9zbWIoY29uc3QgY2hhciAqZXhwb3J0ZWRfZGlyKQoreworICAgIGlmIChzbGlycF9zbWJfZXhwb3J0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLXNtYiBnaXZlbiB0d2ljZVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHNsaXJwX3NtYl9leHBvcnQgPSBleHBvcnRlZF9kaXI7CisgICAgaWYgKHNsaXJwX2luaXRlZCkgeworICAgICAgICBzbGlycF9zbWIoZXhwb3J0ZWRfZGlyKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChfV0lOMzIpICovCisKK3ZvaWQgZG9faW5mb19zbGlycChNb25pdG9yICptb24pCit7CisgICAgLy9zbGlycF9zdGF0cygpOworfQorCitzdHJ1Y3QgVk1DaGFubmVsIHsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmhkOworICAgIGludCBwb3J0OworfTsKKworc3RhdGljIGludCB2bWNoYW5uZWxfY2FuX3JlYWQodm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCBWTUNoYW5uZWwgKnZtYyA9IChzdHJ1Y3QgVk1DaGFubmVsKilvcGFxdWU7CisgICAgcmV0dXJuIHNsaXJwX3NvY2tldF9jYW5fcmVjdig0LCB2bWMtPnBvcnQpOworfQorCitzdGF0aWMgdm9pZCB2bWNoYW5uZWxfcmVhZCh2b2lkICpvcGFxdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgc3RydWN0IFZNQ2hhbm5lbCAqdm1jID0gKHN0cnVjdCBWTUNoYW5uZWwqKW9wYXF1ZTsKKyAgICBzbGlycF9zb2NrZXRfcmVjdig0LCB2bWMtPnBvcnQsIGJ1Ziwgc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0xJUlAgKi8KKworI2lmICFkZWZpbmVkKF9XSU4zMikKKwordHlwZWRlZiBzdHJ1Y3QgVEFQU3RhdGUgeworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisgICAgaW50IGZkOworICAgIGNoYXIgZG93bl9zY3JpcHRbMTAyNF07CisgICAgY2hhciBkb3duX3NjcmlwdF9hcmdbMTI4XTsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKK30gVEFQU3RhdGU7CisKK3N0YXRpYyBpbnQgbGF1bmNoX3NjcmlwdChjb25zdCBjaGFyICpzZXR1cF9zY3JpcHQsIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50IGZkKTsKKworc3RhdGljIHNzaXplX3QgdGFwX3JlY2VpdmVfaW92KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb3ZjbnQpCit7CisgICAgVEFQU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworICAgIHNzaXplX3QgbGVuOworCisgICAgZG8geworICAgICAgICBsZW4gPSB3cml0ZXYocy0+ZmQsIGlvdiwgaW92Y250KTsKKyAgICB9IHdoaWxlIChsZW4gPT0gLTEgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgdGFwX3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBkbyB7CisgICAgICAgIGxlbiA9IHdyaXRlKHMtPmZkLCBidWYsIHNpemUpOworICAgIH0gd2hpbGUgKGxlbiA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHRhcF9jYW5fc2VuZCh2b2lkICpvcGFxdWUpCit7CisgICAgVEFQU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gcWVtdV9jYW5fc2VuZF9wYWNrZXQocy0+dmMpOworfQorCisjaWZkZWYgX19zdW5fXworc3RhdGljIHNzaXplX3QgdGFwX3JlYWRfcGFja2V0KGludCB0YXBmZCwgdWludDhfdCAqYnVmLCBpbnQgbWF4bGVuKQoreworICAgIHN0cnVjdCBzdHJidWYgc2J1ZjsKKyAgICBpbnQgZiA9IDA7CisKKyAgICBzYnVmLm1heGxlbiA9IG1heGxlbjsKKyAgICBzYnVmLmJ1ZiA9IChjaGFyICopYnVmOworCisgICAgcmV0dXJuIGdldG1zZyh0YXBmZCwgTlVMTCwgJnNidWYsICZmKSA+PSAwID8gc2J1Zi5sZW4gOiAtMTsKK30KKyNlbHNlCitzdGF0aWMgc3NpemVfdCB0YXBfcmVhZF9wYWNrZXQoaW50IHRhcGZkLCB1aW50OF90ICpidWYsIGludCBtYXhsZW4pCit7CisgICAgcmV0dXJuIHJlYWQodGFwZmQsIGJ1ZiwgbWF4bGVuKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0YXBfc2VuZCh2b2lkICpvcGFxdWUpOworCitzdGF0aWMgdm9pZCB0YXBfc2VuZF9jb21wbGV0ZWQoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyMihzLT5mZCwgdGFwX2Nhbl9zZW5kLCB0YXBfc2VuZCwgTlVMTCwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRhcF9zZW5kKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgc2l6ZTsKKworICAgIGRvIHsKKyAgICAgICAgc2l6ZSA9IHRhcF9yZWFkX3BhY2tldChzLT5mZCwgcy0+YnVmLCBzaXplb2Yocy0+YnVmKSk7CisgICAgICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZSA9IHFlbXVfc2VuZF9wYWNrZXRfYXN5bmMocy0+dmMsIHMtPmJ1Ziwgc2l6ZSwgdGFwX3NlbmRfY29tcGxldGVkKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoc2l6ZSA+IDApOworfQorCitzdGF0aWMgdm9pZCB0YXBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIFRBUFN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKworICAgIGlmIChzLT5kb3duX3NjcmlwdFswXSkKKyAgICAgICAgbGF1bmNoX3NjcmlwdChzLT5kb3duX3NjcmlwdCwgcy0+ZG93bl9zY3JpcHRfYXJnLCBzLT5mZCk7CisKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBjbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworfQorCisvKiBmZCBzdXBwb3J0ICovCisKK3N0YXRpYyBUQVBTdGF0ZSAqbmV0X3RhcF9mZF9pbml0KFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCkKK3sKKyAgICBUQVBTdGF0ZSAqczsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFRBUFN0YXRlKSk7CisgICAgcy0+ZmQgPSBmZDsKKyAgICBzLT52YyA9IHFlbXVfbmV3X3ZsYW5fY2xpZW50KHZsYW4sIG1vZGVsLCBuYW1lLCBOVUxMLCB0YXBfcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcF9yZWNlaXZlX2lvdiwgdGFwX2NsZWFudXAsIHMpOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHMtPmZkLCB0YXBfY2FuX3NlbmQsIHRhcF9zZW5kLCBOVUxMLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLCAiZmQ9JWQiLCBmZCk7CisgICAgcmV0dXJuIHM7Cit9CisKKyNpZiBkZWZpbmVkIChDT05GSUdfQlNEKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0Rfa2VybmVsX18pCitzdGF0aWMgaW50IHRhcF9vcGVuKGNoYXIgKmlmbmFtZSwgaW50IGlmbmFtZV9zaXplKQoreworICAgIGludCBmZDsKKyAgICBjaGFyICpkZXY7CisgICAgc3RydWN0IHN0YXQgczsKKworICAgIFRGUihmZCA9IG9wZW4oIi9kZXYvdGFwIiwgT19SRFdSKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGNvdWxkIG5vdCBvcGVuIC9kZXYvdGFwOiBubyB2aXJ0dWFsIG5ldHdvcmsgZW11bGF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZzdGF0KGZkLCAmcyk7CisgICAgZGV2ID0gZGV2bmFtZShzLnN0X3JkZXYsIFNfSUZDSFIpOworICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgZGV2KTsKKworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICByZXR1cm4gZmQ7Cit9CisjZWxpZiBkZWZpbmVkKF9fc3VuX18pCisjZGVmaW5lIFRVTk5FV1BQQSAgICAgICAoKCdUJzw8MTYpIHwgMHgwMDAxKQorLyoKKyAqIEFsbG9jYXRlIFRBUCBkZXZpY2UsIHJldHVybnMgb3BlbmVkIGZkLgorICogU3RvcmVzIGRldiBuYW1lIGluIHRoZSBmaXJzdCBhcmcobXVzdCBiZSBsYXJnZSBlbm91Z2gpLgorICovCitzdGF0aWMgaW50IHRhcF9hbGxvYyhjaGFyICpkZXYsIHNpemVfdCBkZXZfc2l6ZSkKK3sKKyAgICBpbnQgdGFwX2ZkLCBpZl9mZCwgcHBhID0gLTE7CisgICAgc3RhdGljIGludCBpcF9mZCA9IDA7CisgICAgY2hhciAqcHRyOworCisgICAgc3RhdGljIGludCBhcnBfZmQgPSAwOworICAgIGludCBpcF9tdXhpZCwgYXJwX211eGlkOworICAgIHN0cnVjdCBzdHJpb2N0bCAgc3RyaW9jX2lmLCBzdHJpb2NfcHBhOworICAgIGludCBsaW5rX3R5cGUgPSBJX1BMSU5LOzsKKyAgICBzdHJ1Y3QgbGlmcmVxIGlmcjsKKyAgICBjaGFyIGFjdHVhbF9uYW1lWzMyXSA9ICIiOworCisgICAgbWVtc2V0KCZpZnIsIDB4MCwgc2l6ZW9mKGlmcikpOworCisgICAgaWYoICpkZXYgKXsKKyAgICAgICBwdHIgPSBkZXY7CisgICAgICAgd2hpbGUoICpwdHIgJiYgIXFlbXVfaXNkaWdpdCgoaW50KSpwdHIpICkgcHRyKys7CisgICAgICAgcHBhID0gYXRvaShwdHIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIElQIGRldmljZSB3YXMgb3BlbmVkICovCisgICAgaWYoIGlwX2ZkICkKKyAgICAgICBjbG9zZShpcF9mZCk7CisKKyAgICBURlIoaXBfZmQgPSBvcGVuKCIvZGV2L3VkcCIsIE9fUkRXUiwgMCkpOworICAgIGlmIChpcF9mZCA8IDApIHsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IG9wZW4gL2Rldi9pcCAoYWN0dWFsbHkgL2Rldi91ZHApIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFRGUih0YXBfZmQgPSBvcGVuKCIvZGV2L3RhcCIsIE9fUkRXUiwgMCkpOworICAgIGlmICh0YXBfZmQgPCAwKSB7CisgICAgICAgc3lzbG9nKExPR19FUlIsICJDYW4ndCBvcGVuIC9kZXYvdGFwIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEFzc2lnbiBhIG5ldyBQUEEgYW5kIGdldCBpdHMgdW5pdCBudW1iZXIuICovCisgICAgc3RyaW9jX3BwYS5pY19jbWQgPSBUVU5ORVdQUEE7CisgICAgc3RyaW9jX3BwYS5pY190aW1vdXQgPSAwOworICAgIHN0cmlvY19wcGEuaWNfbGVuID0gc2l6ZW9mKHBwYSk7CisgICAgc3RyaW9jX3BwYS5pY19kcCA9IChjaGFyICopJnBwYTsKKyAgICBpZiAoKHBwYSA9IGlvY3RsICh0YXBfZmQsIElfU1RSLCAmc3RyaW9jX3BwYSkpIDwgMCkKKyAgICAgICBzeXNsb2cgKExPR19FUlIsICJDYW4ndCBhc3NpZ24gbmV3IGludGVyZmFjZSIpOworCisgICAgVEZSKGlmX2ZkID0gb3BlbigiL2Rldi90YXAiLCBPX1JEV1IsIDApKTsKKyAgICBpZiAoaWZfZmQgPCAwKSB7CisgICAgICAgc3lzbG9nKExPR19FUlIsICJDYW4ndCBvcGVuIC9kZXYvdGFwICgyKSIpOworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoaW9jdGwoaWZfZmQsIElfUFVTSCwgImlwIikgPCAwKXsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IHB1c2ggSVAgbW9kdWxlIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChpb2N0bChpZl9mZCwgU0lPQ0dMSUZGTEFHUywgJmlmcikgPCAwKQorCXN5c2xvZyhMT0dfRVJSLCAiQ2FuJ3QgZ2V0IGZsYWdzXG4iKTsKKworICAgIHNucHJpbnRmIChhY3R1YWxfbmFtZSwgMzIsICJ0YXAlZCIsIHBwYSk7CisgICAgcHN0cmNweShpZnIubGlmcl9uYW1lLCBzaXplb2YoaWZyLmxpZnJfbmFtZSksIGFjdHVhbF9uYW1lKTsKKworICAgIGlmci5saWZyX3BwYSA9IHBwYTsKKyAgICAvKiBBc3NpZ24gcHBhIGFjY29yZGluZyB0byB0aGUgdW5pdCBudW1iZXIgcmV0dXJuZWQgYnkgdHVuIGRldmljZSAqLworCisgICAgaWYgKGlvY3RsIChpZl9mZCwgU0lPQ1NMSUZOQU1FLCAmaWZyKSA8IDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IHNldCBQUEEgJWQiLCBwcGEpOworICAgIGlmIChpb2N0bChpZl9mZCwgU0lPQ0dMSUZGTEFHUywgJmlmcikgPDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IGdldCBmbGFnc1xuIik7CisgICAgLyogUHVzaCBhcnAgbW9kdWxlIHRvIGlmX2ZkICovCisgICAgaWYgKGlvY3RsIChpZl9mZCwgSV9QVVNILCAiYXJwIikgPCAwKQorICAgICAgICBzeXNsb2cgKExPR19FUlIsICJDYW4ndCBwdXNoIEFSUCBtb2R1bGUgKDIpIik7CisKKyAgICAvKiBQdXNoIGFycCBtb2R1bGUgdG8gaXBfZmQgKi8KKyAgICBpZiAoaW9jdGwgKGlwX2ZkLCBJX1BPUCwgTlVMTCkgPCAwKQorICAgICAgICBzeXNsb2cgKExPR19FUlIsICJJX1BPUCBmYWlsZWRcbiIpOworICAgIGlmIChpb2N0bCAoaXBfZmQsIElfUFVTSCwgImFycCIpIDwgMCkKKyAgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3QgcHVzaCBBUlAgbW9kdWxlICgzKVxuIik7CisgICAgLyogT3BlbiBhcnBfZmQgKi8KKyAgICBURlIoYXJwX2ZkID0gb3BlbiAoIi9kZXYvdGFwIiwgT19SRFdSLCAwKSk7CisgICAgaWYgKGFycF9mZCA8IDApCisgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3Qgb3BlbiAlc1xuIiwgIi9kZXYvdGFwIik7CisKKyAgICAvKiBTZXQgaWZuYW1lIHRvIGFycCAqLworICAgIHN0cmlvY19pZi5pY19jbWQgPSBTSU9DU0xJRk5BTUU7CisgICAgc3RyaW9jX2lmLmljX3RpbW91dCA9IDA7CisgICAgc3RyaW9jX2lmLmljX2xlbiA9IHNpemVvZihpZnIpOworICAgIHN0cmlvY19pZi5pY19kcCA9IChjaGFyICopJmlmcjsKKyAgICBpZiAoaW9jdGwoYXJwX2ZkLCBJX1NUUiwgJnN0cmlvY19pZikgPCAwKXsKKyAgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3Qgc2V0IGlmbmFtZSB0byBhcnBcbiIpOworICAgIH0KKworICAgIGlmKChpcF9tdXhpZCA9IGlvY3RsKGlwX2ZkLCBJX0xJTkssIGlmX2ZkKSkgPCAwKXsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IGxpbmsgVEFQIGRldmljZSB0byBJUCIpOworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKGFycF9tdXhpZCA9IGlvY3RsIChpcF9mZCwgbGlua190eXBlLCBhcnBfZmQpKSA8IDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IGxpbmsgVEFQIGRldmljZSB0byBBUlAiKTsKKworICAgIGNsb3NlIChpZl9mZCk7CisKKyAgICBtZW1zZXQoJmlmciwgMHgwLCBzaXplb2YoaWZyKSk7CisgICAgcHN0cmNweShpZnIubGlmcl9uYW1lLCBzaXplb2YoaWZyLmxpZnJfbmFtZSksIGFjdHVhbF9uYW1lKTsKKyAgICBpZnIubGlmcl9pcF9tdXhpZCAgPSBpcF9tdXhpZDsKKyAgICBpZnIubGlmcl9hcnBfbXV4aWQgPSBhcnBfbXV4aWQ7CisKKyAgICBpZiAoaW9jdGwgKGlwX2ZkLCBTSU9DU0xJRk1VWElELCAmaWZyKSA8IDApCisgICAgeworICAgICAgaW9jdGwgKGlwX2ZkLCBJX1BVTkxJTksgLCBhcnBfbXV4aWQpOworICAgICAgaW9jdGwgKGlwX2ZkLCBJX1BVTkxJTkssIGlwX211eGlkKTsKKyAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IHNldCBtdWx0aXBsZXhvciBpZCIpOworICAgIH0KKworICAgIHNucHJpbnRmKGRldiwgZGV2X3NpemUsICJ0YXAlZCIsIHBwYSk7CisgICAgcmV0dXJuIHRhcF9mZDsKK30KKworc3RhdGljIGludCB0YXBfb3BlbihjaGFyICppZm5hbWUsIGludCBpZm5hbWVfc2l6ZSkKK3sKKyAgICBjaGFyICBkZXZbMTBdPSIiOworICAgIGludCBmZDsKKyAgICBpZiggKGZkID0gdGFwX2FsbG9jKGRldiwgc2l6ZW9mKGRldikpKSA8IDAgKXsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBhbGxvY2F0ZSBUQVAgZGV2aWNlXG4iKTsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgZGV2KTsKKyAgICBmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgcmV0dXJuIGZkOworfQorI2VsaWYgZGVmaW5lZCAoX0FJWCkKK3N0YXRpYyBpbnQgdGFwX29wZW4oY2hhciAqaWZuYW1lLCBpbnQgaWZuYW1lX3NpemUpCit7CisgICAgZnByaW50ZiAoc3RkZXJyLCAibm8gdGFwIG9uIEFJWFxuIik7CisgICAgcmV0dXJuIC0xOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdGFwX29wZW4oY2hhciAqaWZuYW1lLCBpbnQgaWZuYW1lX3NpemUpCit7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpbnQgZmQsIHJldDsKKworICAgIFRGUihmZCA9IG9wZW4oIi9kZXYvbmV0L3R1biIsIE9fUkRXUikpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBjb3VsZCBub3Qgb3BlbiAvZGV2L25ldC90dW46IG5vIHZpcnR1YWwgbmV0d29yayBlbXVsYXRpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisgICAgaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CisgICAgaWYgKGlmbmFtZVswXSAhPSAnXDAnKQorICAgICAgICBwc3RyY3B5KGlmci5pZnJfbmFtZSwgSUZOQU1TSVosIGlmbmFtZSk7CisgICAgZWxzZQorICAgICAgICBwc3RyY3B5KGlmci5pZnJfbmFtZSwgSUZOQU1TSVosICJ0YXAlZCIpOworICAgIHJldCA9IGlvY3RsKGZkLCBUVU5TRVRJRkYsICh2b2lkICopICZpZnIpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGNvdWxkIG5vdCBjb25maWd1cmUgL2Rldi9uZXQvdHVuOiBubyB2aXJ0dWFsIG5ldHdvcmsgZW11bGF0aW9uXG4iKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgaWZyLmlmcl9uYW1lKTsKKyAgICBmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgcmV0dXJuIGZkOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbGF1bmNoX3NjcmlwdChjb25zdCBjaGFyICpzZXR1cF9zY3JpcHQsIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50IGZkKQoreworICAgIHNpZ3NldF90IG9sZG1hc2ssIG1hc2s7CisgICAgaW50IHBpZCwgc3RhdHVzOworICAgIGNoYXIgKmFyZ3NbM107CisgICAgY2hhciAqKnBhcmc7CisKKyAgICBzaWdlbXB0eXNldCgmbWFzayk7CisgICAgc2lnYWRkc2V0KCZtYXNrLCBTSUdDSExEKTsKKyAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZtYXNrLCAmb2xkbWFzayk7CisKKyAgICAvKiB0cnkgdG8gbGF1bmNoIG5ldHdvcmsgc2NyaXB0ICovCisgICAgcGlkID0gZm9yaygpOworICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICBpbnQgb3Blbl9tYXggPSBzeXNjb25mKF9TQ19PUEVOX01BWCksIGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wZW5fbWF4OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IFNURElOX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gU1RET1VUX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gU1RERVJSX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gZmQpIHsKKyAgICAgICAgICAgICAgICBjbG9zZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYXJnID0gYXJnczsKKyAgICAgICAgKnBhcmcrKyA9IChjaGFyICopc2V0dXBfc2NyaXB0OworICAgICAgICAqcGFyZysrID0gKGNoYXIgKilpZm5hbWU7CisgICAgICAgICpwYXJnKysgPSBOVUxMOworICAgICAgICBleGVjdihzZXR1cF9zY3JpcHQsIGFyZ3MpOworICAgICAgICBleGl0KDEpOworICAgIH0gZWxzZSBpZiAocGlkID4gMCkgeworICAgICAgICB3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkgeworICAgICAgICAgICAgLyogbG9vcCAqLworICAgICAgICB9CisgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkbWFzaywgTlVMTCk7CisKKyAgICAgICAgaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGxhdW5jaCBuZXR3b3JrIHNjcmlwdFxuIiwgc2V0dXBfc2NyaXB0KTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbmV0X3RhcF9pbml0KFZMQU5TdGF0ZSAqdmxhbiwgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICppZm5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2V0dXBfc2NyaXB0LCBjb25zdCBjaGFyICpkb3duX3NjcmlwdCkKK3sKKyAgICBUQVBTdGF0ZSAqczsKKyAgICBpbnQgZmQ7CisgICAgY2hhciBpZm5hbWVbMTI4XTsKKworICAgIGlmIChpZm5hbWUxICE9IE5VTEwpCisgICAgICAgIHBzdHJjcHkoaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgaWZuYW1lMSk7CisgICAgZWxzZQorICAgICAgICBpZm5hbWVbMF0gPSAnXDAnOworICAgIFRGUihmZCA9IHRhcF9vcGVuKGlmbmFtZSwgc2l6ZW9mKGlmbmFtZSkpKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXNldHVwX3NjcmlwdCB8fCAhc3RyY21wKHNldHVwX3NjcmlwdCwgIm5vIikpCisgICAgICAgIHNldHVwX3NjcmlwdCA9ICIiOworICAgIGlmIChzZXR1cF9zY3JpcHRbMF0gIT0gJ1wwJykgeworCWlmIChsYXVuY2hfc2NyaXB0KHNldHVwX3NjcmlwdCwgaWZuYW1lLCBmZCkpCisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcyA9IG5ldF90YXBfZmRfaW5pdCh2bGFuLCBtb2RlbCwgbmFtZSwgZmQpOworICAgIHNucHJpbnRmKHMtPnZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMtPnZjLT5pbmZvX3N0ciksCisgICAgICAgICAgICAgImlmbmFtZT0lcyxzY3JpcHQ9JXMsZG93bnNjcmlwdD0lcyIsCisgICAgICAgICAgICAgaWZuYW1lLCBzZXR1cF9zY3JpcHQsIGRvd25fc2NyaXB0KTsKKyAgICBpZiAoZG93bl9zY3JpcHQgJiYgc3RyY21wKGRvd25fc2NyaXB0LCAibm8iKSkgeworICAgICAgICBzbnByaW50ZihzLT5kb3duX3NjcmlwdCwgc2l6ZW9mKHMtPmRvd25fc2NyaXB0KSwgIiVzIiwgZG93bl9zY3JpcHQpOworICAgICAgICBzbnByaW50ZihzLT5kb3duX3NjcmlwdF9hcmcsIHNpemVvZihzLT5kb3duX3NjcmlwdF9hcmcpLCAiJXMiLCBpZm5hbWUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICFfV0lOMzIgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZERSkKK3R5cGVkZWYgc3RydWN0IFZERVN0YXRlIHsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIFZERUNPTk4gKnZkZTsKK30gVkRFU3RhdGU7CisKK3N0YXRpYyB2b2lkIHZkZV90b19xZW11KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWREVTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSB2ZGVfcmVjdihzLT52ZGUsIChjaGFyICopYnVmLCBzaXplb2YoYnVmKSwgMCk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHFlbXVfc2VuZF9wYWNrZXQocy0+dmMsIGJ1Ziwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgc3NpemVfdCB2ZGVfcmVjZWl2ZShWTEFOQ2xpZW50U3RhdGUgKnZjLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworICAgIFZERVN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKyAgICBzc2l6ZV90IHJldDsKKworICAgIGRvIHsKKyAgICAgIHJldCA9IHZkZV9zZW5kKHMtPnZkZSwgKGNvbnN0IGNoYXIgKilidWYsIHNpemUsIDApOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdmRlX2NsZWFudXAoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBWREVTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcih2ZGVfZGF0YWZkKHMtPnZkZSksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHZkZV9jbG9zZShzLT52ZGUpOworICAgIGdfZnJlZShzKTsKK30KKworc3RhdGljIGludCBuZXRfdmRlX2luaXQoVkxBTlN0YXRlICp2bGFuLCBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwgY29uc3QgY2hhciAqZ3JvdXAsIGludCBtb2RlKQoreworICAgIFZERVN0YXRlICpzOworICAgIGNoYXIgKmluaXRfZ3JvdXAgPSBzdHJsZW4oZ3JvdXApID8gKGNoYXIgKilncm91cCA6IE5VTEw7CisgICAgY2hhciAqaW5pdF9zb2NrID0gc3RybGVuKHNvY2spID8gKGNoYXIgKilzb2NrIDogTlVMTDsKKworICAgIHN0cnVjdCB2ZGVfb3Blbl9hcmdzIGFyZ3MgPSB7CisgICAgICAgIC5wb3J0ID0gcG9ydCwKKyAgICAgICAgLmdyb3VwID0gaW5pdF9ncm91cCwKKyAgICAgICAgLm1vZGUgPSBtb2RlLAorICAgIH07CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihWREVTdGF0ZSkpOworICAgIHMtPnZkZSA9IHZkZV9vcGVuKGluaXRfc29jaywgKGNoYXIgKikiUUVNVSIsICZhcmdzKTsKKyAgICBpZiAoIXMtPnZkZSl7CisgICAgICAgIGZyZWUocyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgdmRlX3JlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB2ZGVfY2xlYW51cCwgcyk7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcih2ZGVfZGF0YWZkKHMtPnZkZSksIHZkZV90b19xZW11LCBOVUxMLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLCAic29jaz0lcyxmZD0lZCIsCisgICAgICAgICAgICAgc29jaywgdmRlX2RhdGFmZChzLT52ZGUpKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IE5ldFNvY2tldFN0YXRlIHsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIGludCBmZDsKKyAgICBpbnQgc3RhdGU7IC8qIDAgPSBnZXR0aW5nIGxlbmd0aCwgMSA9IGdldHRpbmcgZGF0YSAqLworICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgcGFja2V0X2xlbjsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICBTb2NrQWRkcmVzcyAgZGdyYW1fZHN0OyAvKiBjb250YWlucyBpbmV0IGhvc3QgYW5kIHBvcnQgZGVzdGluYXRpb24gaWZmIGNvbm5lY3Rpb25sZXNzIChTT0NLX0RHUkFNKSAqLworfSBOZXRTb2NrZXRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgTmV0U29ja2V0TGlzdGVuU3RhdGUgeworICAgIFZMQU5TdGF0ZSAqdmxhbjsKKyAgICBjaGFyICptb2RlbDsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBmZDsKK30gTmV0U29ja2V0TGlzdGVuU3RhdGU7CisKKy8qIFhYWDogd2UgY29uc2lkZXIgd2UgY2FuIHNlbmQgdGhlIHdob2xlIHBhY2tldCB3aXRob3V0IGJsb2NraW5nICovCitzdGF0aWMgc3NpemVfdCBuZXRfc29ja2V0X3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgdWludDMyX3QgbGVuOworICAgIGxlbiA9IGh0b25sKHNpemUpOworCisgICAgc29ja2V0X3NlbmQocy0+ZmQsIChjb25zdCB1aW50OF90ICopJmxlbiwgc2l6ZW9mKGxlbikpOworICAgIHJldHVybiBzb2NrZXRfc2VuZChzLT5mZCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgbmV0X3NvY2tldF9yZWNlaXZlX2RncmFtKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworCisgICAgcmV0dXJuIHNvY2tldF9zZW5kdG8ocy0+ZmQsIGJ1Ziwgc2l6ZSwgJnMtPmRncmFtX2RzdCk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zb2NrZXRfc2VuZCh2b2lkICpvcGFxdWUpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSBvcGFxdWU7CisgICAgaW50IHNpemUsIGVycjsKKyAgICB1bnNpZ25lZCBsOworICAgIHVpbnQ4X3QgYnVmMVs0MDk2XTsKKyAgICBjb25zdCB1aW50OF90ICpidWY7CisKKyAgICBzaXplID0gcmVjdihzLT5mZCwgKHZvaWQgKilidWYxLCBzaXplb2YoYnVmMSksIDApOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBlcnIgPSBzb2NrZXRfZXJyb3IoKTsKKyAgICAgICAgaWYgKGVyciAhPSBFV09VTERCTE9DSyAmJiBlcnIgIT0gRUFHQUlOKQorICAgICAgICAgICAgZ290byBlb2M7CisgICAgfSBlbHNlIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogZW5kIG9mIGNvbm5lY3Rpb24gKi8KKyAgICBlb2M6CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBjbG9zZXNvY2tldChzLT5mZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmID0gYnVmMTsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgLyogcmVhc3NlbWJsZSBhIHBhY2tldCBmcm9tIHRoZSBuZXR3b3JrICovCisgICAgICAgIHN3aXRjaChzLT5zdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBsID0gNCAtIHMtPmluZGV4OworICAgICAgICAgICAgaWYgKGwgPiAodW5zaWduZWQpc2l6ZSkKKyAgICAgICAgICAgICAgICBsID0gKHVuc2lnbmVkKXNpemU7CisgICAgICAgICAgICBtZW1jcHkocy0+YnVmICsgcy0+aW5kZXgsIGJ1ZiwgbCk7CisgICAgICAgICAgICBidWYgKz0gbDsKKyAgICAgICAgICAgIHNpemUgLT0gbDsKKyAgICAgICAgICAgIHMtPmluZGV4ICs9IGw7CisgICAgICAgICAgICBpZiAocy0+aW5kZXggPT0gNCkgeworICAgICAgICAgICAgICAgIC8qIGdvdCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBzLT5wYWNrZXRfbGVuID0gbnRvaGwoKih1aW50MzJfdCAqKXMtPmJ1Zik7CisgICAgICAgICAgICAgICAgcy0+aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBsID0gcy0+cGFja2V0X2xlbiAtIHMtPmluZGV4OworICAgICAgICAgICAgaWYgKGwgPiAodW5zaWduZWQpc2l6ZSkKKyAgICAgICAgICAgICAgICBsID0gKHVuc2lnbmVkKXNpemU7CisgICAgICAgICAgICBpZiAocy0+aW5kZXggKyBsIDw9IHNpemVvZihzLT5idWYpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmJ1ZiArIHMtPmluZGV4LCBidWYsIGwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNlcmlvdXMgZXJyb3I6IG92ZXJzaXplZCBwYWNrZXQgcmVjZWl2ZWQsIgorICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiB0ZXJtaW5hdGVkLlxuIik7CisgICAgICAgICAgICAgICAgcy0+c3RhdGUgPSAwOworICAgICAgICAgICAgICAgIGdvdG8gZW9jOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5pbmRleCArPSBsOworICAgICAgICAgICAgYnVmICs9IGw7CisgICAgICAgICAgICBzaXplIC09IGw7CisgICAgICAgICAgICBpZiAocy0+aW5kZXggPj0gcy0+cGFja2V0X2xlbikgeworICAgICAgICAgICAgICAgIHFlbXVfc2VuZF9wYWNrZXQocy0+dmMsIHMtPmJ1Ziwgcy0+cGFja2V0X2xlbik7CisgICAgICAgICAgICAgICAgcy0+aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBuZXRfc29ja2V0X3NlbmRfZGdyYW0odm9pZCAqb3BhcXVlKQoreworICAgIE5ldFNvY2tldFN0YXRlICpzID0gb3BhcXVlOworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IHJlY3Yocy0+ZmQsICh2b2lkICopcy0+YnVmLCBzaXplb2Yocy0+YnVmKSwgMCk7CisgICAgaWYgKHNpemUgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvKiBlbmQgb2YgY29ubmVjdGlvbiAqLworICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBxZW11X3NlbmRfcGFja2V0KHMtPnZjLCBzLT5idWYsIHNpemUpOworfQorCitzdGF0aWMgaW50IG5ldF9zb2NrZXRfbWNhc3RfY3JlYXRlKFNvY2tBZGRyZXNzICptY2FzdGFkZHIpCit7CisgICAgaW50IGZkOworICAgIGludCByZXQ7CisgICAgaWYgKCFJTl9NVUxUSUNBU1Qoc29ja19hZGRyZXNzX2dldF9pcChtY2FzdGFkZHIpKSkgeworCWZwcmludGYoc3RkZXJyLCAicWVtdTogZXJyb3I6IHNwZWNpZmllZCBtY2FzdGFkZHIgXCIlc1wiICgweCUwOHgpIGRvZXMgbm90IGNvbnRhaW4gYSBtdWx0aWNhc3QgYWRkcmVzc1xuIiwKKwkJc29ja19hZGRyZXNzX3RvX3N0cmluZyhtY2FzdGFkZHIpLAorICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19nZXRfaXAobWNhc3RhZGRyKSk7CisJcmV0dXJuIC0xOworCisgICAgfQorICAgIGZkID0gc29ja2V0X2NyZWF0ZV9pbmV0KFNPQ0tFVF9ER1JBTSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoInNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNKSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0ID0gc29ja2V0X3NldF94cmV1c2VhZGRyKGZkKTsKKyAgICBpZiAocmV0IDwgMCkgeworCXBlcnJvcigic2V0c29ja29wdChTT0xfU09DS0VULCBTT19SRVVTRUFERFIpIik7CisJZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IHNvY2tldF9iaW5kKGZkLCBtY2FzdGFkZHIpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiYmluZCIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogQWRkIGhvc3QgdG8gbXVsdGljYXN0IGdyb3VwICovCisgICAgcmV0ID0gc29ja2V0X21jYXN0X2luZXRfYWRkX21lbWJlcnNoaXAoZmQsIHNvY2tfYWRkcmVzc19nZXRfaXAobWNhc3RhZGRyKSk7CisgICAgaWYgKHJldCA8IDApIHsKKwlwZXJyb3IoInNldHNvY2tvcHQoSVBfQUREX01FTUJFUlNISVApIik7CisJZ290byBmYWlsOworICAgIH0KKworICAgIC8qIEZvcmNlIG1jYXN0IG1zZ3MgdG8gbG9vcGJhY2sgKGVnLiBzZXZlcmFsIFFFTVVzIGluIHNhbWUgaG9zdCAqLworICAgIHJldCA9IHNvY2tldF9tY2FzdF9pbmV0X3NldF9sb29wKGZkLCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworCXBlcnJvcigic2V0c29ja29wdChTT0xfSVAsIElQX01VTFRJQ0FTVF9MT09QKSIpOworCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzb2NrZXRfc2V0X25vbmJsb2NrKGZkKTsKKyAgICByZXR1cm4gZmQ7CitmYWlsOgorICAgIGlmIChmZCA+PSAwKQorICAgICAgICBzb2NrZXRfY2xvc2UoZmQpOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgbmV0X3NvY2tldF9jbGVhbnVwKFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHNvY2tldF9jbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworfQorCitzdGF0aWMgTmV0U29ja2V0U3RhdGUgKm5ldF9zb2NrZXRfZmRfaW5pdF9kZ3JhbShWTEFOU3RhdGUgKnZsYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIGludCBpc19jb25uZWN0ZWQpCit7CisgICAgU29ja0FkZHJlc3MgIHNhZGRyOworICAgIGludCBuZXdmZDsKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczsKKworICAgIC8qIGZkIHBhc3NlZDogbXVsdGljYXN0OiAibGVhcm4iIGRncmFtX2RzdCBhZGRyZXNzIGZyb20gYm91bmQgYWRkcmVzcyBhbmQgc2F2ZSBpdAorICAgICAqIEJlY2F1c2UgdGhpcyBtYXkgYmUgInNoYXJlZCIgc29ja2V0IGZyb20gYSAibWFzdGVyIiBwcm9jZXNzLCBkYXRhZ3JhbXMgd291bGQgYmUgcmVjdigpCisgICAgICogYnkgT05MWSBPTkUgcHJvY2Vzczogd2UgbXVzdCAiY2xvbmUiIHRoaXMgZGdyYW0gc29ja2V0IC0tampvCisgICAgICovCisKKyAgICBpZiAoaXNfY29ubmVjdGVkKSB7CisJaWYgKHNvY2tldF9nZXRfYWRkcmVzcyhmZCwgJnNhZGRyKSA9PSAwKSB7CisJICAgIC8qIG11c3QgYmUgYm91bmQgKi8KKwkgICAgaWYgKHNvY2tfYWRkcmVzc19nZXRfaXAoJnNhZGRyKSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicWVtdTogZXJyb3I6IGluaXRfZGdyYW06IGZkPSVkIHVuYm91bmQsIGNhbm5vdCBzZXR1cCBtdWx0aWNhc3QgZHN0IGFkZHJcbiIsCisJCQlmZCk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIC8qIGNsb25lIGRncmFtIHNvY2tldCAqLworCSAgICBuZXdmZCA9IG5ldF9zb2NrZXRfbWNhc3RfY3JlYXRlKCZzYWRkcik7CisJICAgIGlmIChuZXdmZCA8IDApIHsKKwkJLyogZXJyb3IgYWxyZWFkeSByZXBvcnRlZCBieSBuZXRfc29ja2V0X21jYXN0X2NyZWF0ZSgpICovCisJCXNvY2tldF9jbG9zZShmZCk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJICAgIC8qIGNsb25lIG5ld2ZkIHRvIGZkLCBjbG9zZSBuZXdmZCAqLworCSAgICBkdXAyKG5ld2ZkLCBmZCk7CisJICAgIHNvY2tldF9jbG9zZShuZXdmZCk7CisKKwl9IGVsc2UgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGVycm9yOiBpbml0X2RncmFtOiBmZD0lZCBmYWlsZWQgZ2V0c29ja25hbWUoKTogJXNcbiIsCisJCSAgICBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKE5ldFNvY2tldFN0YXRlKSk7CisgICAgcy0+ZmQgPSBmZDsKKworICAgIHMtPnZjID0gcWVtdV9uZXdfdmxhbl9jbGllbnQodmxhbiwgbW9kZWwsIG5hbWUsIE5VTEwsIG5ldF9zb2NrZXRfcmVjZWl2ZV9kZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG5ldF9zb2NrZXRfY2xlYW51cCwgcyk7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgbmV0X3NvY2tldF9zZW5kX2RncmFtLCBOVUxMLCBzKTsKKworICAgIC8qIG1jYXN0OiBzYXZlIGJvdW5kIGFkZHJlc3MgYXMgZHN0ICovCisgICAgaWYgKGlzX2Nvbm5lY3RlZCkgcy0+ZGdyYW1fZHN0PXNhZGRyOworCisgICAgc25wcmludGYocy0+dmMtPmluZm9fc3RyLCBzaXplb2Yocy0+dmMtPmluZm9fc3RyKSwKKwkgICAgInNvY2tldDogZmQ9JWQgKCVzIG1jYXN0PSVzKSIsCisJICAgIGZkLCBpc19jb25uZWN0ZWQ/ICJjbG9uZWQiIDogIiIsCisJICAgIHNvY2tfYWRkcmVzc190b19zdHJpbmcoJnNhZGRyKSk7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zb2NrZXRfY29ubmVjdCh2b2lkICpvcGFxdWUpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSBvcGFxdWU7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgbmV0X3NvY2tldF9zZW5kLCBOVUxMLCBzKTsKK30KKworc3RhdGljIE5ldFNvY2tldFN0YXRlICpuZXRfc29ja2V0X2ZkX2luaXRfc3RyZWFtKFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczsKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihOZXRTb2NrZXRTdGF0ZSkpOworICAgIHMtPmZkID0gZmQ7CisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgbmV0X3NvY2tldF9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbmV0X3NvY2tldF9jbGVhbnVwLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJzb2NrZXQ6IGZkPSVkIiwgZmQpOworICAgIGlmIChpc19jb25uZWN0ZWQpIHsKKyAgICAgICAgbmV0X3NvY2tldF9jb25uZWN0KHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIocy0+ZmQsIE5VTEwsIG5ldF9zb2NrZXRfY29ubmVjdCwgcyk7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0aWMgTmV0U29ja2V0U3RhdGUgKm5ldF9zb2NrZXRfZmRfaW5pdChWTEFOU3RhdGUgKnZsYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKyAgICBTb2NrZXRUeXBlICBzb190eXBlID0gc29ja2V0X2dldF90eXBlKGZkKTsKKworICAgIHN3aXRjaChzb190eXBlKSB7CisgICAgY2FzZSBTT0NLRVRfREdSQU06CisgICAgICAgIHJldHVybiBuZXRfc29ja2V0X2ZkX2luaXRfZGdyYW0odmxhbiwgbW9kZWwsIG5hbWUsIGZkLCBpc19jb25uZWN0ZWQpOworICAgIGNhc2UgU09DS0VUX1NUUkVBTToKKyAgICAgICAgcmV0dXJuIG5ldF9zb2NrZXRfZmRfaW5pdF9zdHJlYW0odmxhbiwgbW9kZWwsIG5hbWUsIGZkLCBpc19jb25uZWN0ZWQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHdobyBrbm93cyAuLi4gdGhpcyBjb3VsZCBiZSBhIGVnLiBhIHB0eSwgZG8gd2FybiBhbmQgY29udGludWUgYXMgc3RyZWFtICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogd2FybmluZzogc29ja2V0IHR5cGU9JWQgZm9yIGZkPSVkIGlzIG5vdCBTT0NLX0RHUkFNIG9yIFNPQ0tfU1RSRUFNXG4iLCBzb190eXBlLCBmZCk7CisgICAgICAgIHJldHVybiBuZXRfc29ja2V0X2ZkX2luaXRfc3RyZWFtKHZsYW4sIG1vZGVsLCBuYW1lLCBmZCwgaXNfY29ubmVjdGVkKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zb2NrZXRfYWNjZXB0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBOZXRTb2NrZXRMaXN0ZW5TdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczE7CisgICAgU29ja0FkZHJlc3MgIHNhZGRyOworICAgIGludCBmZDsKKworICAgIGZvcig7OykgeworICAgICAgICBmZCA9IHNvY2tldF9hY2NlcHQocy0+ZmQsICZzYWRkcik7CisgICAgICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChmZCA+PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzMSA9IG5ldF9zb2NrZXRfZmRfaW5pdChzLT52bGFuLCBzLT5tb2RlbCwgcy0+bmFtZSwgZmQsIDEpOworICAgIGlmICghczEpIHsKKyAgICAgICAgc29ja2V0X2Nsb3NlKGZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihzMS0+dmMtPmluZm9fc3RyLCBzaXplb2YoczEtPnZjLT5pbmZvX3N0ciksCisgICAgICAgICAgICAgICAgICJzb2NrZXQ6IGNvbm5lY3Rpb24gZnJvbSAlcyIsIHNvY2tfYWRkcmVzc190b19zdHJpbmcoJnNhZGRyKSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG5ldF9zb2NrZXRfbGlzdGVuX2luaXQoVkxBTlN0YXRlICp2bGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdF9zdHIpCit7CisgICAgTmV0U29ja2V0TGlzdGVuU3RhdGUgKnM7CisgICAgaW50IGZkLCByZXQ7CisgICAgU29ja0FkZHJlc3MgIHNhZGRyOworCisgICAgaWYgKHBhcnNlX2hvc3RfcG9ydCgmc2FkZHIsIGhvc3Rfc3RyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKE5ldFNvY2tldExpc3RlblN0YXRlKSk7CisKKyAgICBmZCA9IHNvY2tldF9jcmVhdGVfaW5ldChTT0NLRVRfU1RSRUFNKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigic29ja2V0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc29ja2V0X3NldF9ub25ibG9jayhmZCk7CisKKyAgICAvKiBhbGxvdyBmYXN0IHJldXNlICovCisgICAgc29ja2V0X3NldF94cmV1c2VhZGRyKGZkKTsKKworICAgIHJldCA9IHNvY2tldF9iaW5kKGZkLCAmc2FkZHIpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiYmluZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IHNvY2tldF9saXN0ZW4oZmQsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHBlcnJvcigibGlzdGVuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+dmxhbiA9IHZsYW47CisgICAgcy0+bW9kZWwgPSBzdHJkdXAobW9kZWwpOworICAgIHMtPm5hbWUgPSBuYW1lID8gc3RyZHVwKG5hbWUpIDogTlVMTDsKKyAgICBzLT5mZCA9IGZkOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIoZmQsIG5ldF9zb2NrZXRfYWNjZXB0LCBOVUxMLCBzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRfc29ja2V0X2Nvbm5lY3RfaW5pdChWTEFOU3RhdGUgKnZsYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpob3N0X3N0cikKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczsKKyAgICBpbnQgZmQsIGNvbm5lY3RlZCwgcmV0LCBlcnI7CisgICAgU29ja0FkZHJlc3Mgc2FkZHI7CisKKyAgICBpZiAocGFyc2VfaG9zdF9wb3J0KCZzYWRkciwgaG9zdF9zdHIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZmQgPSBzb2NrZXRfY3JlYXRlX2luZXQoU09DS0VUX1NUUkVBTSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoInNvY2tldCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworCisgICAgY29ubmVjdGVkID0gMDsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcmV0ID0gc29ja2V0X2Nvbm5lY3QoZmQsICZzYWRkcik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBlcnIgPSBzb2NrZXRfZXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVdPVUxEQkxPQ0sgfHwgZXJyID09IEVBR0FJTikgeworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRUlOUFJPR1JFU1MgfHwgZXJyID09IEVBTFJFQURZKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCIpOworICAgICAgICAgICAgICAgIHNvY2tldF9jbG9zZShmZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHMgPSBuZXRfc29ja2V0X2ZkX2luaXQodmxhbiwgbW9kZWwsIG5hbWUsIGZkLCBjb25uZWN0ZWQpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNucHJpbnRmKHMtPnZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMtPnZjLT5pbmZvX3N0ciksCisgICAgICAgICAgICAgInNvY2tldDogY29ubmVjdCB0byAlcyIsCisgICAgICAgICAgICAgc29ja19hZGRyZXNzX3RvX3N0cmluZygmc2FkZHIpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRfc29ja2V0X21jYXN0X2luaXQoVkxBTlN0YXRlICp2bGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdF9zdHIpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnM7CisgICAgaW50IGZkOworICAgIFNvY2tBZGRyZXNzIHNhZGRyOworCisgICAgaWYgKHBhcnNlX2hvc3RfcG9ydCgmc2FkZHIsIGhvc3Rfc3RyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworCisgICAgZmQgPSBuZXRfc29ja2V0X21jYXN0X2NyZWF0ZSgmc2FkZHIpOworICAgIGlmIChmZCA8IDApCisJcmV0dXJuIC0xOworCisgICAgcyA9IG5ldF9zb2NrZXRfZmRfaW5pdCh2bGFuLCBtb2RlbCwgbmFtZSwgZmQsIDApOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcy0+ZGdyYW1fZHN0ID0gc2FkZHI7CisKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJzb2NrZXQ6IG1jYXN0PSVzIiwKKyAgICAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKCZzYWRkcikpOworICAgIHJldHVybiAwOworCit9CisKK3R5cGVkZWYgc3RydWN0IER1bXBTdGF0ZSB7CisgICAgVkxBTkNsaWVudFN0YXRlICpwY2FwX3ZjOworICAgIGludCBmZDsKKyAgICBpbnQgcGNhcF9jYXBsZW47Cit9IER1bXBTdGF0ZTsKKworI2RlZmluZSBQQ0FQX01BR0lDIDB4YTFiMmMzZDQKKworc3RydWN0IHBjYXBfZmlsZV9oZHIgeworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIHVpbnQxNl90IHZlcnNpb25fbWFqb3I7CisgICAgdWludDE2X3QgdmVyc2lvbl9taW5vcjsKKyAgICBpbnQzMl90IHRoaXN6b25lOworICAgIHVpbnQzMl90IHNpZ2ZpZ3M7CisgICAgdWludDMyX3Qgc25hcGxlbjsKKyAgICB1aW50MzJfdCBsaW5rdHlwZTsKK307CisKK3N0cnVjdCBwY2FwX3NmX3BrdGhkciB7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50MzJfdCB0dl9zZWM7CisgICAgICAgIGludDMyX3QgdHZfdXNlYzsKKyAgICB9IHRzOworICAgIHVpbnQzMl90IGNhcGxlbjsKKyAgICB1aW50MzJfdCBsZW47Cit9OworCitzdGF0aWMgc3NpemVfdCBkdW1wX3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBEdW1wU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworICAgIHN0cnVjdCBwY2FwX3NmX3BrdGhkciBoZHI7CisgICAgaW50NjRfdCB0czsKKyAgICBpbnQgY2FwbGVuOworCisgICAgLyogRWFybHkgcmV0dXJuIGluIGNhc2Ugb2YgcHJldmlvdXMgZXJyb3IuICovCisgICAgaWYgKHMtPmZkIDwgMCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICB0cyA9IG11bGRpdjY0KHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCksIDEwMDAwMDAsIGdldF90aWNrc19wZXJfc2VjKCkpOworICAgIGNhcGxlbiA9IHNpemUgPiAoc2l6ZV90KXMtPnBjYXBfY2FwbGVuID8gcy0+cGNhcF9jYXBsZW4gOiAoaW50KXNpemU7CisKKyAgICBoZHIudHMudHZfc2VjID0gdHMgLyAxMDAwMDAwOworICAgIGhkci50cy50dl91c2VjID0gdHMgJSAxMDAwMDAwOworICAgIGhkci5jYXBsZW4gPSBjYXBsZW47CisgICAgaGRyLmxlbiA9IHNpemU7CisgICAgaWYgKHdyaXRlKHMtPmZkLCAmaGRyLCBzaXplb2YoaGRyKSkgIT0gc2l6ZW9mKGhkcikgfHwKKyAgICAgICAgd3JpdGUocy0+ZmQsIGJ1ZiwgY2FwbGVuKSAhPSBjYXBsZW4pIHsKKyAgICAgICAgcWVtdV9sb2coIi1uZXQgZHVtcCB3cml0ZSBlcnJvciAtIHN0b3AgZHVtcFxuIik7CisgICAgICAgIGNsb3NlKHMtPmZkKTsKKyAgICAgICAgcy0+ZmQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIER1bXBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBjbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworfQorCitzdGF0aWMgaW50IG5ldF9kdW1wX2luaXQoTW9uaXRvciAqbW9uLCBWTEFOU3RhdGUgKnZsYW4sIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxlbikKK3sKKyAgICBzdHJ1Y3QgcGNhcF9maWxlX2hkciBoZHI7CisgICAgRHVtcFN0YXRlICpzOworCisgICAgcyA9IGdfbWFsbG9jKHNpemVvZihEdW1wU3RhdGUpKTsKKworICAgIHMtPmZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZLCAwNjQ0KTsKKyAgICBpZiAocy0+ZmQgPCAwKSB7CisgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICItbmV0IGR1bXA6IGNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHMtPnBjYXBfY2FwbGVuID0gbGVuOworCisgICAgaGRyLm1hZ2ljID0gUENBUF9NQUdJQzsKKyAgICBoZHIudmVyc2lvbl9tYWpvciA9IDI7CisgICAgaGRyLnZlcnNpb25fbWlub3IgPSA0OworICAgIGhkci50aGlzem9uZSA9IDA7CisgICAgaGRyLnNpZ2ZpZ3MgPSAwOworICAgIGhkci5zbmFwbGVuID0gcy0+cGNhcF9jYXBsZW47CisgICAgaGRyLmxpbmt0eXBlID0gMTsKKworICAgIGlmICh3cml0ZShzLT5mZCwgJmhkciwgc2l6ZW9mKGhkcikpIDwgKGludClzaXplb2YoaGRyKSkgeworICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiLW5ldCBkdW1wIHdyaXRlIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgY2xvc2Uocy0+ZmQpOworICAgICAgICBnX2ZyZWUocyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT5wY2FwX3ZjID0gcWVtdV9uZXdfdmxhbl9jbGllbnQodmxhbiwgZGV2aWNlLCBuYW1lLCBOVUxMLCBkdW1wX3JlY2VpdmUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldF9kdW1wX2NsZWFudXAsIHMpOworICAgIHNucHJpbnRmKHMtPnBjYXBfdmMtPmluZm9fc3RyLCBzaXplb2Yocy0+cGNhcF92Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJkdW1wIHRvICVzIChsZW49JWQpIiwgZmlsZW5hbWUsIGxlbik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGZpbmQgb3IgYWxsb2MgYSBuZXcgVkxBTiAqLworVkxBTlN0YXRlICpxZW11X2ZpbmRfdmxhbihpbnQgaWQpCit7CisgICAgVkxBTlN0YXRlICoqcHZsYW4sICp2bGFuOworICAgIGZvcih2bGFuID0gZmlyc3RfdmxhbjsgdmxhbiAhPSBOVUxMOyB2bGFuID0gdmxhbi0+bmV4dCkgeworICAgICAgICBpZiAodmxhbi0+aWQgPT0gaWQpCisgICAgICAgICAgICByZXR1cm4gdmxhbjsKKyAgICB9CisgICAgdmxhbiA9IGdfbWFsbG9jMChzaXplb2YoVkxBTlN0YXRlKSk7CisgICAgdmxhbi0+aWQgPSBpZDsKKyAgICB2bGFuLT5uZXh0ID0gTlVMTDsKKyAgICBwdmxhbiA9ICZmaXJzdF92bGFuOworICAgIHdoaWxlICgqcHZsYW4gIT0gTlVMTCkKKyAgICAgICAgcHZsYW4gPSAmKCpwdmxhbiktPm5leHQ7CisgICAgKnB2bGFuID0gdmxhbjsKKyAgICByZXR1cm4gdmxhbjsKK30KKworc3RhdGljIGludCBuaWNfZ2V0X2ZyZWVfaWR4KHZvaWQpCit7CisgICAgaW50IGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX05JQ1M7IGluZGV4KyspCisgICAgICAgIGlmICghbmRfdGFibGVbaW5kZXhdLnVzZWQpCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIHFlbXVfY2hlY2tfbmljX21vZGVsKE5JQ0luZm8gKm5kLCBjb25zdCBjaGFyICptb2RlbCkKK3sKKyAgICBjb25zdCBjaGFyICptb2RlbHNbMl07CisKKyAgICBtb2RlbHNbMF0gPSBtb2RlbDsKKyAgICBtb2RlbHNbMV0gPSBOVUxMOworCisgICAgcWVtdV9jaGVja19uaWNfbW9kZWxfbGlzdChuZCwgbW9kZWxzLCBtb2RlbCk7Cit9CisKK3ZvaWQgcWVtdV9jaGVja19uaWNfbW9kZWxfbGlzdChOSUNJbmZvICpuZCwgY29uc3QgY2hhciAqIGNvbnN0ICptb2RlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmYXVsdF9tb2RlbCkKK3sKKyAgICBpbnQgaSwgZXhpdF9zdGF0dXMgPSAwOworCisgICAgaWYgKCFuZC0+bW9kZWwpCisgICAgICAgIG5kLT5tb2RlbCA9IHN0cmR1cChkZWZhdWx0X21vZGVsKTsKKworICAgIGlmIChzdHJjbXAobmQtPm1vZGVsLCAiPyIpICE9IDApIHsKKyAgICAgICAgZm9yIChpID0gMCA7IG1vZGVsc1tpXTsgaSsrKQorICAgICAgICAgICAgaWYgKHN0cmNtcChuZC0+bW9kZWwsIG1vZGVsc1tpXSkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBVbnN1cHBvcnRlZCBOSUMgbW9kZWw6ICVzXG4iLCBuZC0+bW9kZWwpOworICAgICAgICBleGl0X3N0YXR1cyA9IDE7CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBTdXBwb3J0ZWQgTklDIG1vZGVsczogIik7CisgICAgZm9yIChpID0gMCA7IG1vZGVsc1tpXTsgaSsrKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzJWMiLCBtb2RlbHNbaV0sIG1vZGVsc1tpKzFdID8gJywnIDogJ1xuJyk7CisKKyAgICBleGl0KGV4aXRfc3RhdHVzKTsKK30KKworaW50IG5ldF9jbGllbnRfaW5pdChNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZkX3BhcmFtc1tdID0geworICAgICAgICAidmxhbiIsICJuYW1lIiwgImZkIiwgTlVMTAorICAgIH07CisgICAgY2hhciBidWZbMTAyNF07CisgICAgaW50IHZsYW5faWQsIHJldDsKKyAgICBWTEFOU3RhdGUgKnZsYW47CisgICAgY2hhciAqbmFtZSA9IE5VTEw7CisKKyAgICB2bGFuX2lkID0gMDsKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ2bGFuIiwgcCkpIHsKKyAgICAgICAgdmxhbl9pZCA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgIH0KKyAgICB2bGFuID0gcWVtdV9maW5kX3ZsYW4odmxhbl9pZCk7CisKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJuYW1lIiwgcCkpIHsKKyAgICAgICAgbmFtZSA9IGdfc3RyZHVwKGJ1Zik7CisgICAgfQorICAgIGlmICghc3RyY21wKGRldmljZSwgIm5pYyIpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmljX3BhcmFtc1tdID0geworICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJtYWNhZGRyIiwgIm1vZGVsIiwgTlVMTAorICAgICAgICB9OworICAgICAgICBOSUNJbmZvICpuZDsKKyAgICAgICAgdWludDhfdCAqbWFjYWRkcjsKKyAgICAgICAgaW50IGlkeCA9IG5pY19nZXRfZnJlZV9pZHgoKTsKKworICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG5pY19wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgYnVmLCBwKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlkeCA9PSAtMSB8fCBuYl9uaWNzID49IE1BWF9OSUNTKSB7CisgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiVG9vIE1hbnkgTklDc1xuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIG5kID0gJm5kX3RhYmxlW2lkeF07CisgICAgICAgIG1hY2FkZHIgPSBuZC0+bWFjYWRkcjsKKyAgICAgICAgbWFjYWRkclswXSA9IDB4NTI7CisgICAgICAgIG1hY2FkZHJbMV0gPSAweDU0OworICAgICAgICBtYWNhZGRyWzJdID0gMHgwMDsKKyAgICAgICAgbWFjYWRkclszXSA9IDB4MTI7CisgICAgICAgIG1hY2FkZHJbNF0gPSAweDM0OworICAgICAgICBtYWNhZGRyWzVdID0gMHg1NiArIGlkeDsKKworICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtYWNhZGRyIiwgcCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJzZV9tYWNhZGRyKG1hY2FkZHIsIGJ1ZikgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgc3ludGF4IGZvciBldGhlcm5ldCBhZGRyZXNzXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtb2RlbCIsIHApKSB7CisgICAgICAgICAgICBuZC0+bW9kZWwgPSBzdHJkdXAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBuZC0+dmxhbiA9IHZsYW47CisgICAgICAgIG5kLT5uYW1lID0gbmFtZTsKKyAgICAgICAgbmQtPnVzZWQgPSAxOworICAgICAgICBuYW1lID0gTlVMTDsKKyAgICAgICAgbmJfbmljcysrOworICAgICAgICB2bGFuLT5uYl9ndWVzdF9kZXZzKys7CisgICAgICAgIHJldCA9IGlkeDsKKyAgICB9IGVsc2UKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJub25lIikpIHsKKyAgICAgICAgaWYgKCpwICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICInbm9uZScgdGFrZXMgbm8gcGFyYW1ldGVyc1xuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIC8qIGRvZXMgbm90aGluZy4gSXQgaXMgbmVlZGVkIHRvIHNpZ25hbCB0aGF0IG5vIG5ldHdvcmsgY2FyZHMKKyAgICAgICAgICAgYXJlIHdhbnRlZCAqLworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZQorI2lmZGVmIENPTkZJR19TTElSUAorICAgIGlmICghc3RyY21wKGRldmljZSwgInVzZXIiKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNsaXJwX3BhcmFtc1tdID0geworICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJob3N0bmFtZSIsICJyZXN0cmljdCIsICJpcCIsIE5VTEwKKyAgICAgICAgfTsKKyAgICAgICAgaW50IHJlc3RyaWN0ZWQgPSAwOworICAgICAgICBjaGFyICppcCA9IE5VTEw7CisKKyAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhidWYsIHNpemVvZihidWYpLCBzbGlycF9wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgYnVmLCBwKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiaG9zdG5hbWUiLCBwKSkgeworICAgICAgICAgICAgcHN0cmNweShzbGlycF9ob3N0bmFtZSwgc2l6ZW9mKHNsaXJwX2hvc3RuYW1lKSwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJyZXN0cmljdCIsIHApKSB7CisgICAgICAgICAgICByZXN0cmljdGVkID0gKGJ1ZlswXSA9PSAneScpID8gMSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiaXAiLCBwKSkgeworICAgICAgICAgICAgaXAgPSBnX3N0cmR1cChidWYpOworICAgICAgICB9CisgICAgICAgIHZsYW4tPm5iX2hvc3RfZGV2cysrOworICAgICAgICByZXQgPSBuZXRfc2xpcnBfaW5pdCh2bGFuLCBkZXZpY2UsIG5hbWUsIHJlc3RyaWN0ZWQsIGlwKTsKKyAgICAgICAgZ19mcmVlKGlwKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZGV2aWNlLCAiY2hhbm5lbCIpKSB7CisgICAgICAgIGxvbmcgcG9ydDsKKyAgICAgICAgY2hhciBuYW1lWzIwXSwgKmRldm5hbWU7CisgICAgICAgIHN0cnVjdCBWTUNoYW5uZWwgKnZtYzsKKworICAgICAgICBwb3J0ID0gc3RydG9sKHAsICZkZXZuYW1lLCAxMCk7CisgICAgICAgIGRldm5hbWUrKzsKKyAgICAgICAgaWYgKHBvcnQgPCAxIHx8IHBvcnQgPiA2NTUzNSkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgInZtY2hhbm5lbCB3cm9uZyBwb3J0IG51bWJlclxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHZtYyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IFZNQ2hhbm5lbCkpOworICAgICAgICBzbnByaW50ZihuYW1lLCAyMCwgInZtY2hhbm5lbCVsZCIsIHBvcnQpOworICAgICAgICB2bWMtPmhkID0gcWVtdV9jaHJfb3BlbihuYW1lLCBkZXZuYW1lLCBOVUxMKTsKKyAgICAgICAgaWYgKCF2bWMtPmhkKSB7CisgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiY291bGQgbm90IG9wZW4gdm1jaGFubmVsIGRldmljZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldm5hbWUpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICB2bWMtPnBvcnQgPSBwb3J0OworICAgICAgICBzbGlycF9hZGRfZXhlYygzLCB2bWMtPmhkLCA0LCBwb3J0KTsKKyAgICAgICAgcWVtdV9jaHJfYWRkX2hhbmRsZXJzKHZtYy0+aGQsIHZtY2hhbm5lbF9jYW5fcmVhZCwgdm1jaGFubmVsX3JlYWQsCisgICAgICAgICAgICAgICAgTlVMTCwgdm1jKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UKKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorICAgIGlmICghc3RyY21wKGRldmljZSwgInRhcCIpKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFwX3BhcmFtc1tdID0geworICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJpZm5hbWUiLCBOVUxMCisgICAgICAgIH07CisgICAgICAgIGNoYXIgaWZuYW1lWzY0XTsKKworICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHRhcF9wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgYnVmLCBwKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShpZm5hbWUsIHNpemVvZihpZm5hbWUpLCAiaWZuYW1lIiwgcCkgPD0gMCkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgInRhcDogbm8gaW50ZXJmYWNlIG5hbWVcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICB2bGFuLT5uYl9ob3N0X2RldnMrKzsKKyAgICAgICAgcmV0ID0gdGFwX3dpbjMyX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBpZm5hbWUpOworICAgIH0gZWxzZQorI2VsaWYgZGVmaW5lZCAoX0FJWCkKKyNlbHNlCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAidGFwIikpIHsKKyAgICAgICAgY2hhciBpZm5hbWVbNjRdLCBjaGtidWZbNjRdOworICAgICAgICBjaGFyIHNldHVwX3NjcmlwdFsxMDI0XSwgZG93bl9zY3JpcHRbMTAyNF07CisgICAgICAgIGludCBmZDsKKyAgICAgICAgdmxhbi0+bmJfaG9zdF9kZXZzKys7CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImZkIiwgcCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGNoa2J1Ziwgc2l6ZW9mKGNoa2J1ZiksIGZkX3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgY2hrYnVmLCBwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZkID0gc3RydG9sKGJ1ZiwgTlVMTCwgMCk7CisgICAgICAgICAgICBmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgICAgICAgICBuZXRfdGFwX2ZkX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBmZCk7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0YXBfcGFyYW1zW10gPSB7CisgICAgICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJpZm5hbWUiLCAic2NyaXB0IiwgImRvd25zY3JpcHQiLCBOVUxMCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhjaGtidWYsIHNpemVvZihjaGtidWYpLCB0YXBfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLCBjaGtidWYsIHApOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShpZm5hbWUsIHNpemVvZihpZm5hbWUpLCAiaWZuYW1lIiwgcCkgPD0gMCkgeworICAgICAgICAgICAgICAgIGlmbmFtZVswXSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKHNldHVwX3NjcmlwdCwgc2l6ZW9mKHNldHVwX3NjcmlwdCksICJzY3JpcHQiLCBwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHN0cmNweShzZXR1cF9zY3JpcHQsIHNpemVvZihzZXR1cF9zY3JpcHQpLCBERUZBVUxUX05FVFdPUktfU0NSSVBUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoZG93bl9zY3JpcHQsIHNpemVvZihkb3duX3NjcmlwdCksICJkb3duc2NyaXB0IiwgcCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBzdHJjcHkoZG93bl9zY3JpcHQsIHNpemVvZihkb3duX3NjcmlwdCksIERFRkFVTFRfTkVUV09SS19ET1dOX1NDUklQVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBuZXRfdGFwX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBpZm5hbWUsIHNldHVwX3NjcmlwdCwgZG93bl9zY3JpcHQpOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJzb2NrZXQiKSkgeworICAgICAgICBjaGFyIGNoa2J1Zls2NF07CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImZkIiwgcCkgPiAwKSB7CisgICAgICAgICAgICBpbnQgZmQ7CisgICAgICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGNoa2J1Ziwgc2l6ZW9mKGNoa2J1ZiksIGZkX3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgY2hrYnVmLCBwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZkID0gc3RydG9sKGJ1ZiwgTlVMTCwgMCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGlmIChuZXRfc29ja2V0X2ZkX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBmZCwgMSkpCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImxpc3RlbiIsIHApID4gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsaXN0ZW5fcGFyYW1zW10gPSB7CisgICAgICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJsaXN0ZW4iLCBOVUxMCisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhjaGtidWYsIHNpemVvZihjaGtidWYpLCBsaXN0ZW5fcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLCBjaGtidWYsIHApOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gbmV0X3NvY2tldF9saXN0ZW5faW5pdCh2bGFuLCBkZXZpY2UsIG5hbWUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJjb25uZWN0IiwgcCkgPiAwKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbm5lY3RfcGFyYW1zW10gPSB7CisgICAgICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJjb25uZWN0IiwgTlVMTAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmIChjaGVja19wYXJhbXMoY2hrYnVmLCBzaXplb2YoY2hrYnVmKSwgY29ubmVjdF9wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGNoa2J1ZiwgcCk7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBuZXRfc29ja2V0X2Nvbm5lY3RfaW5pdCh2bGFuLCBkZXZpY2UsIG5hbWUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtY2FzdCIsIHApID4gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtY2FzdF9wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICAgICAidmxhbiIsICJuYW1lIiwgIm1jYXN0IiwgTlVMTAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmIChjaGVja19wYXJhbXMoY2hrYnVmLCBzaXplb2YoY2hrYnVmKSwgbWNhc3RfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLCBjaGtidWYsIHApOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gbmV0X3NvY2tldF9tY2FzdF9pbml0KHZsYW4sIGRldmljZSwgbmFtZSwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJVbmtub3duIHNvY2tldCBvcHRpb25zOiAlc1xuIiwgcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHZsYW4tPm5iX2hvc3RfZGV2cysrOworICAgIH0gZWxzZQorI2lmZGVmIENPTkZJR19WREUKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJ2ZGUiKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZkZV9wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAic29jayIsICJwb3J0IiwgImdyb3VwIiwgIm1vZGUiLCBOVUxMCisgICAgICAgIH07CisgICAgICAgIGNoYXIgdmRlX3NvY2tbMTAyNF0sIHZkZV9ncm91cFs1MTJdOworCWludCB2ZGVfcG9ydCwgdmRlX21vZGU7CisKKyAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhidWYsIHNpemVvZihidWYpLCB2ZGVfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGJ1ZiwgcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIHZsYW4tPm5iX2hvc3RfZGV2cysrOworICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKHZkZV9zb2NrLCBzaXplb2YodmRlX3NvY2spLCAic29jayIsIHApIDw9IDApIHsKKwkgICAgdmRlX3NvY2tbMF0gPSAnXDAnOworCX0KKwlpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJwb3J0IiwgcCkgPiAwKSB7CisJICAgIHZkZV9wb3J0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCX0gZWxzZSB7CisJICAgIHZkZV9wb3J0ID0gMDsKKwl9CisJaWYgKGdldF9wYXJhbV92YWx1ZSh2ZGVfZ3JvdXAsIHNpemVvZih2ZGVfZ3JvdXApLCAiZ3JvdXAiLCBwKSA8PSAwKSB7CisJICAgIHZkZV9ncm91cFswXSA9ICdcMCc7CisJfQorCWlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgIm1vZGUiLCBwKSA+IDApIHsKKwkgICAgdmRlX21vZGUgPSBzdHJ0b2woYnVmLCBOVUxMLCA4KTsKKwl9IGVsc2UgeworCSAgICB2ZGVfbW9kZSA9IDA3MDA7CisJfQorCXJldCA9IG5ldF92ZGVfaW5pdCh2bGFuLCBkZXZpY2UsIG5hbWUsIHZkZV9zb2NrLCB2ZGVfcG9ydCwgdmRlX2dyb3VwLCB2ZGVfbW9kZSk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJkdW1wIikpIHsKKyAgICAgICAgaW50IGxlbiA9IDY1NTM2OworCisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImxlbiIsIHApID4gMCkgeworICAgICAgICAgICAgbGVuID0gc3RydG9sKGJ1ZiwgTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImZpbGUiLCBwKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInFlbXUtdmxhbiVkLnBjYXAiLCB2bGFuX2lkKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBuZXRfZHVtcF9pbml0KG1vbiwgdmxhbiwgZGV2aWNlLCBuYW1lLCBidWYsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgIlVua25vd24gbmV0d29yayBkZXZpY2U6ICVzXG4iLCBkZXZpY2UpOworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJDb3VsZCBub3QgaW5pdGlhbGl6ZSBkZXZpY2UgJyVzJ1xuIiwgZGV2aWNlKTsKKyAgICB9CitvdXQ6CisgICAgZ19mcmVlKG5hbWUpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgbmV0X2NsaWVudF91bmluaXQoTklDSW5mbyAqbmQpCit7CisgICAgbmQtPnZsYW4tPm5iX2d1ZXN0X2RldnMtLTsKKyAgICBuYl9uaWNzLS07CisgICAgbmQtPnVzZWQgPSAwOworICAgIGZyZWUoKHZvaWQgKiluZC0+bW9kZWwpOworfQorCitzdGF0aWMgaW50IG5ldF9ob3N0X2NoZWNrX2RldmljZShjb25zdCBjaGFyICpkZXZpY2UpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgY2hhciAqdmFsaWRfcGFyYW1fbGlzdFtdID0geyAidGFwIiwgInNvY2tldCIsICJkdW1wIgorI2lmZGVmIENPTkZJR19TTElSUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCJ1c2VyIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZERQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCJ2ZGUiCisjZW5kaWYKKyAgICB9OworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YodmFsaWRfcGFyYW1fbGlzdCkgLyBzaXplb2YoY2hhciAqKSk7IGkrKykgeworICAgICAgICBpZiAoIXN0cm5jbXAodmFsaWRfcGFyYW1fbGlzdFtpXSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHZhbGlkX3BhcmFtX2xpc3RbaV0pKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIG5ldF9ob3N0X2RldmljZV9hZGQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisgICAgaWYgKCFuZXRfaG9zdF9jaGVja19kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJpbnZhbGlkIGhvc3QgbmV0d29yayBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG5ldF9jbGllbnRfaW5pdChtb24sIGRldmljZSwgb3B0cyA/IG9wdHMgOiAiIikgPCAwKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgImFkZGluZyBob3N0IG5ldHdvcmsgZGV2aWNlICVzIGZhaWxlZFxuIiwgZGV2aWNlKTsKKyAgICB9Cit9CisKK3ZvaWQgbmV0X2hvc3RfZGV2aWNlX3JlbW92ZShNb25pdG9yICptb24sIGludCB2bGFuX2lkLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisKKyAgICB2bGFuID0gcWVtdV9maW5kX3ZsYW4odmxhbl9pZCk7CisKKyAgICBmb3IgKHZjID0gdmxhbi0+Zmlyc3RfY2xpZW50OyB2YyAhPSBOVUxMOyB2YyA9IHZjLT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKHZjLT5uYW1lLCBkZXZpY2UpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdmMpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiY2FuJ3QgZmluZCBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFuZXRfaG9zdF9jaGVja19kZXZpY2UodmMtPm1vZGVsKSkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJpbnZhbGlkIGhvc3QgbmV0d29yayBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcWVtdV9kZWxfdmxhbl9jbGllbnQodmMpOworfQorCitpbnQgbmV0X2NsaWVudF9wYXJzZShjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpxOworICAgIGNoYXIgZGV2aWNlWzY0XTsKKworICAgIHAgPSBzdHI7CisgICAgcSA9IGRldmljZTsKKyAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLCcpIHsKKyAgICAgICAgaWYgKChxIC0gZGV2aWNlKSA8IChpbnQpc2l6ZW9mKGRldmljZSkgLSAxKQorICAgICAgICAgICAgKnErKyA9ICpwOworICAgICAgICBwKys7CisgICAgfQorICAgICpxID0gJ1wwJzsKKyAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICBwKys7CisKKyAgICByZXR1cm4gbmV0X2NsaWVudF9pbml0KE5VTEwsIGRldmljZSwgcCk7Cit9CisKK3ZvaWQgZG9faW5mb19uZXR3b3JrKE1vbml0b3IgKm1vbikKK3sKKyAgICBWTEFOU3RhdGUgKnZsYW47CisgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKworICAgIGZvcih2bGFuID0gZmlyc3RfdmxhbjsgdmxhbiAhPSBOVUxMOyB2bGFuID0gdmxhbi0+bmV4dCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJWTEFOICVkIGRldmljZXM6XG4iLCB2bGFuLT5pZCk7CisgICAgICAgIGZvcih2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsgdmMgIT0gTlVMTDsgdmMgPSB2Yy0+bmV4dCkKKyAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgJXM6ICVzXG4iLCB2Yy0+bmFtZSwgdmMtPmluZm9fc3RyKTsKKyAgICB9Cit9CisKK2ludCBkb19zZXRfbGluayhNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnVwX29yX2Rvd24pCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmMgPSBOVUxMOworCisgICAgZm9yICh2bGFuID0gZmlyc3RfdmxhbjsgdmxhbiAhPSBOVUxMOyB2bGFuID0gdmxhbi0+bmV4dCkKKyAgICAgICAgZm9yICh2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsgdmMgIT0gTlVMTDsgdmMgPSB2Yy0+bmV4dCkKKyAgICAgICAgICAgIGlmIChzdHJjbXAodmMtPm5hbWUsIG5hbWUpID09IDApCisgICAgICAgICAgICAgICAgZ290byBkb25lOworZG9uZToKKworICAgIGlmICghdmMpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiY291bGQgbm90IGZpbmQgbmV0d29yayBkZXZpY2UgJyVzJyIsIG5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoc3RyY21wKHVwX29yX2Rvd24sICJ1cCIpID09IDApCisgICAgICAgIHZjLT5saW5rX2Rvd24gPSAwOworICAgIGVsc2UgaWYgKHN0cmNtcCh1cF9vcl9kb3duLCAiZG93biIpID09IDApCisgICAgICAgIHZjLT5saW5rX2Rvd24gPSAxOworICAgIGVsc2UKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiaW52YWxpZCBsaW5rIHN0YXR1cyAnJXMnOyBvbmx5ICd1cCcgb3IgJ2Rvd24nICIKKyAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkXG4iLCB1cF9vcl9kb3duKTsKKworICAgIGlmICh2Yy0+bGlua19zdGF0dXNfY2hhbmdlZCkKKyAgICAgICAgdmMtPmxpbmtfc3RhdHVzX2NoYW5nZWQodmMpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgbmV0X2NsZWFudXAodm9pZCkKK3sKKyAgICBWTEFOU3RhdGUgKnZsYW47CisKKyAgICAvKiBjbG9zZSBuZXR3b3JrIGNsaWVudHMgKi8KKyAgICBmb3IodmxhbiA9IGZpcnN0X3ZsYW47IHZsYW4gIT0gTlVMTDsgdmxhbiA9IHZsYW4tPm5leHQpIHsKKyAgICAgICAgVkxBTkNsaWVudFN0YXRlICp2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsKKworICAgICAgICB3aGlsZSAodmMpIHsKKyAgICAgICAgICAgIFZMQU5DbGllbnRTdGF0ZSAqbmV4dCA9IHZjLT5uZXh0OworCisgICAgICAgICAgICBxZW11X2RlbF92bGFuX2NsaWVudCh2Yyk7CisKKyAgICAgICAgICAgIHZjID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBuZXRfY2xpZW50X2NoZWNrKHZvaWQpCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworCisgICAgZm9yKHZsYW4gPSBmaXJzdF92bGFuOyB2bGFuICE9IE5VTEw7IHZsYW4gPSB2bGFuLT5uZXh0KSB7CisgICAgICAgIGlmICh2bGFuLT5uYl9ndWVzdF9kZXZzID09IDAgJiYgdmxhbi0+bmJfaG9zdF9kZXZzID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHZsYW4tPm5iX2d1ZXN0X2RldnMgPT0gMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogdmxhbiAlZCB3aXRoIG5vIG5pY3NcbiIsIHZsYW4tPmlkKTsKKyAgICAgICAgaWYgKHZsYW4tPm5iX2hvc3RfZGV2cyA9PSAwKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiB2bGFuICVkIGlzIG5vdCBjb25uZWN0ZWQgdG8gaG9zdCBuZXR3b3JrXG4iLAorICAgICAgICAgICAgICAgICAgICB2bGFuLT5pZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9uZXQvbmV0LmMgYi9hbmRyb2lkL3FlbXUxL25ldC9uZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNkNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9uZXQvbmV0LmMKQEAgLTAsMCArMSwyNTM0IEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisvKiBOZWVkZWQgZWFybHkgZm9yIENPTkZJR19CU0QgZXRjLiAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2lmZGVmIF9fTmV0QlNEX18KKyNpbmNsdWRlIDxuZXQvaWZfdGFwLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2lmZGVmIENPTkZJR19CU0QKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyNpbmNsdWRlIDxsaWJ1dGlsLmg+CisjZWxzZQorI2luY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaW5jbHVkZSA8ZnJlZWJzZC9zdGRsaWIuaD4KKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8cHR5Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKy8qIEZvciB0aGUgYmVuZWZpdCBvZiBvbGRlciBsaW51eCBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBseSBpdCwKKyAgIHdlIHVzZSBhIGxvY2FsIGNvcHkgb2YgaHBldC5oLiAqLworLyogI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4gKi8KKyNpbmNsdWRlICJody90aW1lci9ocGV0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNlbmRpZgorI2lmZGVmIF9fc3VuX18KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3RtLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPiAvLyBtdXN0IGNvbWUgYWZ0ZXIgaXAuaAorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2luY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVkRFKQorI2luY2x1ZGUgPGxpYnZkZXBsdWcuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisjZGVmaW5lIGdldG9wdF9sb25nX29ubHkgZ2V0b3B0X2xvbmcKKyNkZWZpbmUgbWVtYWxpZ24oYWxpZ24sIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJxZW11L2xvZy5oIgorCisjaWYgZGVmaW5lZChDT05GSUdfU0xJUlApCisjaW5jbHVkZSAibGlic2xpcnAuaCIKKyNlbmRpZgorCisKK3N0YXRpYyBWTEFOU3RhdGUgKmZpcnN0X3ZsYW47CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG5ldHdvcmsgZGV2aWNlIHJlZGlyZWN0b3JzICovCisKKyNpZiBkZWZpbmVkKERFQlVHX05FVCkgfHwgZGVmaW5lZChERUJVR19TTElSUCkKK3N0YXRpYyB2b2lkIGhleF9kdW1wKEZJTEUgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IGxlbiwgaSwgaiwgYzsKKworICAgIGZvcihpPTA7aTxzaXplO2krPTE2KSB7CisgICAgICAgIGxlbiA9IHNpemUgLSBpOworICAgICAgICBpZiAobGVuID4gMTYpCisgICAgICAgICAgICBsZW4gPSAxNjsKKyAgICAgICAgZnByaW50ZihmLCAiJTA4eCAiLCBpKTsKKyAgICAgICAgZm9yKGo9MDtqPDE2O2orKykgeworICAgICAgICAgICAgaWYgKGogPCBsZW4pCisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICUwMngiLCBidWZbaStqXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICAgIik7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50ZihmLCAiICIpOworICAgICAgICBmb3Ioaj0wO2o8bGVuO2orKykgeworICAgICAgICAgICAgYyA9IGJ1ZltpK2pdOworICAgICAgICAgICAgaWYgKGMgPCAnICcgfHwgYyA+ICd+JykKKyAgICAgICAgICAgICAgICBjID0gJy4nOworICAgICAgICAgICAgZnByaW50ZihmLCAiJWMiLCBjKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGYsICJcbiIpOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHBhcnNlX21hY2FkZHIodWludDhfdCAqbWFjYWRkciwgY29uc3QgY2hhciAqcCkKK3sKKyAgICBpbnQgaTsKKyAgICBjaGFyICpsYXN0X2NoYXI7CisgICAgbG9uZyBpbnQgb2Zmc2V0OworCisgICAgZXJybm8gPSAwOworICAgIG9mZnNldCA9IHN0cnRvbChwLCAmbGFzdF9jaGFyLCAwKTsKKyAgICBpZiAoMCA9PSBlcnJubyAmJiAnXDAnID09ICpsYXN0X2NoYXIgJiYKKyAgICAgICAgICAgIG9mZnNldCA+PSAwICYmIG9mZnNldCA8PSAweEZGRkZGRikgeworICAgICAgICBtYWNhZGRyWzNdID0gKG9mZnNldCAmIDB4RkYwMDAwKSA+PiAxNjsKKyAgICAgICAgbWFjYWRkcls0XSA9IChvZmZzZXQgJiAweEZGMDApID4+IDg7CisgICAgICAgIG1hY2FkZHJbNV0gPSBvZmZzZXQgJiAweEZGOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIG1hY2FkZHJbaV0gPSBzdHJ0b2wocCwgKGNoYXIgKiopJnAsIDE2KTsKKyAgICAgICAgICAgIGlmIChpID09IDUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJzonICYmICpwICE9ICctJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N0cl9zZXAoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKipwcCwgaW50IHNlcCkKK3sKKyAgICBjb25zdCBjaGFyICpwLCAqcDE7CisgICAgaW50IGxlbjsKKyAgICBwID0gKnBwOworICAgIHAxID0gc3RyY2hyKHAsIHNlcCk7CisgICAgaWYgKCFwMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGxlbiA9IHAxIC0gcDsKKyAgICBwMSsrOworICAgIGlmIChidWZfc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKGxlbiA+IGJ1Zl9zaXplIC0gMSkKKyAgICAgICAgICAgIGxlbiA9IGJ1Zl9zaXplIC0gMTsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgcCwgbGVuKTsKKyAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgIH0KKyAgICAqcHAgPSBwMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHBhcnNlX2hvc3Rfc3JjX3BvcnQoc3RydWN0IHNvY2thZGRyX2luICpoYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbnB1dF9zdHIpCit7CisgICAgY2hhciAqc3RyID0gc3RyZHVwKGlucHV0X3N0cik7CisgICAgY2hhciAqaG9zdF9zdHIgPSBzdHI7CisgICAgY2hhciAqc3JjX3N0cjsKKyAgICBjb25zdCBjaGFyICpzcmNfc3RyMjsKKyAgICBjaGFyICpwdHI7CisKKyAgICAvKgorICAgICAqIENob3Agb2ZmIGFueSBleHRyYSBhcmd1bWVudHMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHdoaWNoCisgICAgICogd291bGQgc3RhcnQgd2l0aCBhIGNvbW1hLCB0aGVuIGZpbGwgaW4gdGhlIHNyYyBwb3J0IGluZm9ybWF0aW9uCisgICAgICogaWYgaXQgd2FzIHByb3ZpZGVkIGVsc2UgdXNlIHRoZSAiYW55IGFkZHJlc3MiIGFuZCAiYW55IHBvcnQiLgorICAgICAqLworICAgIGlmICgocHRyID0gc3RyY2hyKHN0ciwnLCcpKSkKKyAgICAgICAgKnB0ciA9ICdcMCc7CisKKyAgICBpZiAoKHNyY19zdHIgPSBzdHJjaHIoaW5wdXRfc3RyLCdAJykpKSB7CisgICAgICAgICpzcmNfc3RyID0gJ1wwJzsKKyAgICAgICAgc3JjX3N0cisrOworICAgIH0KKworICAgIGlmIChwYXJzZV9ob3N0X3BvcnQoaGFkZHIsIGhvc3Rfc3RyKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHNyY19zdHIyID0gc3JjX3N0cjsKKyAgICBpZiAoIXNyY19zdHIgfHwgKnNyY19zdHIgPT0gJ1wwJykKKyAgICAgICAgc3JjX3N0cjIgPSAiOjAiOworCisgICAgaWYgKHBhcnNlX2hvc3RfcG9ydChzYWRkciwgc3JjX3N0cjIpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZnJlZShzdHIpOworICAgIHJldHVybigwKTsKKworZmFpbDoKKyAgICBmcmVlKHN0cik7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgcGFyc2VfaG9zdF9wb3J0KHN0cnVjdCBzb2NrYWRkcl9pbiAqc2FkZHIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIHN0cnVjdCBob3N0ZW50ICpoZTsKKyAgICBjb25zdCBjaGFyICpwLCAqcjsKKyAgICBpbnQgcG9ydDsKKworICAgIHAgPSBzdHI7CisgICAgaWYgKGdldF9zdHJfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZwLCAnOicpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBpZiAoYnVmWzBdID09ICdcMCcpIHsKKyAgICAgICAgc2FkZHItPnNpbl9hZGRyLnNfYWRkciA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHFlbXVfaXNkaWdpdChidWZbMF0pKSB7CisgICAgICAgICAgICBpZiAoIWluZXRfYXRvbihidWYsICZzYWRkci0+c2luX2FkZHIpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoaGUgPSBnZXRob3N0YnluYW1lKGJ1ZikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0gMTsKKyAgICAgICAgICAgIHNhZGRyLT5zaW5fYWRkciA9ICooc3RydWN0IGluX2FkZHIgKiloZS0+aF9hZGRyOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQgPSBzdHJ0b2wocCwgKGNoYXIgKiopJnIsIDApOworICAgIGlmIChyID09IHApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzYWRkci0+c2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKyAgICByZXR1cm4gMDsKK30KKworI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgMAorc3RhdGljIGludCBwYXJzZV91bml4X3BhdGgoc3RydWN0IHNvY2thZGRyX3VuICp1YWRkciwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IGxlbjsKKworICAgIGxlbiA9IE1JTigxMDgsIHN0cmxlbihzdHIpKTsKKyAgICBwID0gc3RyY2hyKHN0ciwgJywnKTsKKyAgICBpZiAocCkKKwlsZW4gPSBNSU4obGVuLCBwIC0gc3RyKTsKKworICAgIG1lbXNldCh1YWRkciwgMCwgc2l6ZW9mKCp1YWRkcikpOworCisgICAgdWFkZHItPnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweSh1YWRkci0+c3VuX3BhdGgsIHN0ciwgbGVuKTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3ZvaWQgcWVtdV9mb3JtYXRfbmljX2luZm9fc3RyKFZMQU5DbGllbnRTdGF0ZSAqdmMsIHVpbnQ4X3QgbWFjYWRkcls2XSkKK3sKKyAgICBzbnByaW50Zih2Yy0+aW5mb19zdHIsIHNpemVvZih2Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJtb2RlbD0lcyxtYWNhZGRyPSUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4IiwKKyAgICAgICAgICAgICB2Yy0+bW9kZWwsCisgICAgICAgICAgICAgbWFjYWRkclswXSwgbWFjYWRkclsxXSwgbWFjYWRkclsyXSwKKyAgICAgICAgICAgICBtYWNhZGRyWzNdLCBtYWNhZGRyWzRdLCBtYWNhZGRyWzVdKTsKK30KKworc3RhdGljIGNoYXIgKmFzc2lnbl9uYW1lKFZMQU5DbGllbnRTdGF0ZSAqdmMxLCBjb25zdCBjaGFyICptb2RlbCkKK3sKKyAgICBWTEFOU3RhdGUgKnZsYW47CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBpbnQgaWQgPSAwOworCisgICAgZm9yICh2bGFuID0gZmlyc3RfdmxhbjsgdmxhbjsgdmxhbiA9IHZsYW4tPm5leHQpIHsKKyAgICAgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKworICAgICAgICBmb3IgKHZjID0gdmxhbi0+Zmlyc3RfY2xpZW50OyB2YzsgdmMgPSB2Yy0+bmV4dCkKKyAgICAgICAgICAgIGlmICh2YyAhPSB2YzEgJiYgc3RyY21wKHZjLT5tb2RlbCwgbW9kZWwpID09IDApCisgICAgICAgICAgICAgICAgaWQrKzsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMuJWQiLCBtb2RlbCwgaWQpOworCisgICAgcmV0dXJuIHN0cmR1cChidWYpOworfQorCitWTEFOQ2xpZW50U3RhdGUgKnFlbXVfbmV3X3ZsYW5fY2xpZW50KFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldENhblJlY2VpdmUgKmNhbl9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlICpyZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRSZWNlaXZlSU9WICpyZWNlaXZlX2lvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0Q2xlYW51cCAqY2xlYW51cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmMsICoqcHZjOworICAgIHZjID0gZ19tYWxsb2MwKHNpemVvZihWTEFOQ2xpZW50U3RhdGUpKTsKKyAgICB2Yy0+bW9kZWwgPSBzdHJkdXAobW9kZWwpOworICAgIGlmIChuYW1lKQorICAgICAgICB2Yy0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHZjLT5uYW1lID0gYXNzaWduX25hbWUodmMsIG1vZGVsKTsKKyAgICB2Yy0+Y2FuX3JlY2VpdmUgPSBjYW5fcmVjZWl2ZTsKKyAgICB2Yy0+cmVjZWl2ZSA9IHJlY2VpdmU7CisgICAgdmMtPnJlY2VpdmVfaW92ID0gcmVjZWl2ZV9pb3Y7CisgICAgdmMtPmNsZWFudXAgPSBjbGVhbnVwOworICAgIHZjLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgdmMtPnZsYW4gPSB2bGFuOworCisgICAgdmMtPm5leHQgPSBOVUxMOworICAgIHB2YyA9ICZ2bGFuLT5maXJzdF9jbGllbnQ7CisgICAgd2hpbGUgKCpwdmMgIT0gTlVMTCkKKyAgICAgICAgcHZjID0gJigqcHZjKS0+bmV4dDsKKyAgICAqcHZjID0gdmM7CisgICAgcmV0dXJuIHZjOworfQorCit2b2lkIHFlbXVfZGVsX3ZsYW5fY2xpZW50KFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgVkxBTkNsaWVudFN0YXRlICoqcHZjID0gJnZjLT52bGFuLT5maXJzdF9jbGllbnQ7CisKKyAgICB3aGlsZSAoKnB2YyAhPSBOVUxMKQorICAgICAgICBpZiAoKnB2YyA9PSB2YykgeworICAgICAgICAgICAgKnB2YyA9IHZjLT5uZXh0OworICAgICAgICAgICAgaWYgKHZjLT5jbGVhbnVwKSB7CisgICAgICAgICAgICAgICAgdmMtPmNsZWFudXAodmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZSh2Yy0+bmFtZSk7CisgICAgICAgICAgICBmcmVlKHZjLT5tb2RlbCk7CisgICAgICAgICAgICBnX2ZyZWUodmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcHZjID0gJigqcHZjKS0+bmV4dDsKK30KKworVkxBTkNsaWVudFN0YXRlICpxZW11X2ZpbmRfdmxhbl9jbGllbnQoVkxBTlN0YXRlICp2bGFuLCB2b2lkICpvcGFxdWUpCit7CisgICAgVkxBTkNsaWVudFN0YXRlICoqcHZjID0gJnZsYW4tPmZpcnN0X2NsaWVudDsKKworICAgIHdoaWxlICgqcHZjICE9IE5VTEwpCisgICAgICAgIGlmICgoKnB2YyktPm9wYXF1ZSA9PSBvcGFxdWUpCisgICAgICAgICAgICByZXR1cm4gKnB2YzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHZjID0gJigqcHZjKS0+bmV4dDsKKworICAgIHJldHVybiBOVUxMOworfQorCitpbnQgcWVtdV9jYW5fc2VuZF9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIpCit7CisgICAgVkxBTlN0YXRlICp2bGFuID0gc2VuZGVyLT52bGFuOworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisKKyAgICBmb3IgKHZjID0gdmxhbi0+Zmlyc3RfY2xpZW50OyB2YyAhPSBOVUxMOyB2YyA9IHZjLT5uZXh0KSB7CisgICAgICAgIGlmICh2YyA9PSBzZW5kZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogbm8gY2FuX3JlY2VpdmUoKSBoYW5kbGVyLCB0aGV5IGNhbiBhbHdheXMgcmVjZWl2ZSAqLworICAgICAgICBpZiAoIXZjLT5jYW5fcmVjZWl2ZSB8fCB2Yy0+Y2FuX3JlY2VpdmUodmMpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWVtdV9kZWxpdmVyX3BhY2tldChWTEFOQ2xpZW50U3RhdGUgKnNlbmRlciwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIGludCByZXQgPSAtMTsKKworICAgIHNlbmRlci0+dmxhbi0+ZGVsaXZlcmluZyA9IDE7CisKKyAgICBmb3IgKHZjID0gc2VuZGVyLT52bGFuLT5maXJzdF9jbGllbnQ7IHZjICE9IE5VTEw7IHZjID0gdmMtPm5leHQpIHsKKyAgICAgICAgc3NpemVfdCBsZW47CisKKyAgICAgICAgaWYgKHZjID09IHNlbmRlcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmMtPmxpbmtfZG93bikgeworICAgICAgICAgICAgcmV0ID0gc2l6ZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgbGVuID0gdmMtPnJlY2VpdmUodmMsIGJ1Ziwgc2l6ZSk7CisKKyAgICAgICAgcmV0ID0gKHJldCA+PSAwKSA/IHJldCA6IGxlbjsKKyAgICB9CisKKyAgICBzZW5kZXItPnZsYW4tPmRlbGl2ZXJpbmcgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBxZW11X2ZsdXNoX3F1ZXVlZF9wYWNrZXRzKFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgVkxBTlBhY2tldCAqcGFja2V0OworCisgICAgd2hpbGUgKChwYWNrZXQgPSB2Yy0+dmxhbi0+c2VuZF9xdWV1ZSkgIT0gTlVMTCkgeworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIHZjLT52bGFuLT5zZW5kX3F1ZXVlID0gcGFja2V0LT5uZXh0OworCisgICAgICAgIHJldCA9IHFlbXVfZGVsaXZlcl9wYWNrZXQocGFja2V0LT5zZW5kZXIsIHBhY2tldC0+ZGF0YSwgcGFja2V0LT5zaXplKTsKKyAgICAgICAgaWYgKHJldCA9PSAwICYmIHBhY2tldC0+c2VudF9jYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBwYWNrZXQtPm5leHQgPSB2Yy0+dmxhbi0+c2VuZF9xdWV1ZTsKKyAgICAgICAgICAgIHZjLT52bGFuLT5zZW5kX3F1ZXVlID0gcGFja2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFja2V0LT5zZW50X2NiKQorICAgICAgICAgICAgcGFja2V0LT5zZW50X2NiKHBhY2tldC0+c2VuZGVyKTsKKworICAgICAgICBnX2ZyZWUocGFja2V0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfZW5xdWV1ZV9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldFBhY2tldFNlbnQgKnNlbnRfY2IpCit7CisgICAgVkxBTlBhY2tldCAqcGFja2V0OworCisgICAgcGFja2V0ID0gZ19tYWxsb2Moc2l6ZW9mKFZMQU5QYWNrZXQpICsgc2l6ZSk7CisgICAgcGFja2V0LT5uZXh0ID0gc2VuZGVyLT52bGFuLT5zZW5kX3F1ZXVlOworICAgIHBhY2tldC0+c2VuZGVyID0gc2VuZGVyOworICAgIHBhY2tldC0+c2l6ZSA9IHNpemU7CisgICAgcGFja2V0LT5zZW50X2NiID0gc2VudF9jYjsKKyAgICBtZW1jcHkocGFja2V0LT5kYXRhLCBidWYsIHNpemUpOworICAgIHNlbmRlci0+dmxhbi0+c2VuZF9xdWV1ZSA9IHBhY2tldDsKK30KKworc3NpemVfdCBxZW11X3NlbmRfcGFja2V0X2FzeW5jKFZMQU5DbGllbnRTdGF0ZSAqc2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0UGFja2V0U2VudCAqc2VudF9jYikKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNlbmRlci0+bGlua19kb3duKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworI2lmZGVmIERFQlVHX05FVAorICAgIHByaW50ZigidmxhbiAlZCBzZW5kOlxuIiwgc2VuZGVyLT52bGFuLT5pZCk7CisgICAgaGV4X2R1bXAoc3Rkb3V0LCBidWYsIHNpemUpOworI2VuZGlmCisKKyAgICBpZiAoc2VuZGVyLT52bGFuLT5kZWxpdmVyaW5nKSB7CisgICAgICAgIHFlbXVfZW5xdWV1ZV9wYWNrZXQoc2VuZGVyLCBidWYsIHNpemUsIE5VTEwpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICByZXQgPSBxZW11X2RlbGl2ZXJfcGFja2V0KHNlbmRlciwgYnVmLCBzaXplKTsKKyAgICBpZiAocmV0ID09IDAgJiYgc2VudF9jYiAhPSBOVUxMKSB7CisgICAgICAgIHFlbXVfZW5xdWV1ZV9wYWNrZXQoc2VuZGVyLCBidWYsIHNpemUsIHNlbnRfY2IpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBxZW11X2ZsdXNoX3F1ZXVlZF9wYWNrZXRzKHNlbmRlcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIHFlbXVfc2VuZF9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBxZW11X3NlbmRfcGFja2V0X2FzeW5jKHZjLCBidWYsIHNpemUsIE5VTEwpOworfQorCitzdGF0aWMgc3NpemVfdCB2Y19zZW5kdl9jb21wYXQoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvdmNudCkKK3sKKyAgICB1aW50OF90IGJ1ZmZlcls0MDk2XTsKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgeworICAgICAgICBzaXplX3QgbGVuOworCisgICAgICAgIGxlbiA9IE1JTihzaXplb2YoYnVmZmVyKSAtIG9mZnNldCwgaW92W2ldLmlvdl9sZW4pOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgb2Zmc2V0LCBpb3ZbaV0uaW92X2Jhc2UsIGxlbik7CisgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIHZjLT5yZWNlaXZlKHZjLCBidWZmZXIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNhbGNfaW92X2xlbmd0aChjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCkKK3sKKyAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykKKyAgICAgICAgb2Zmc2V0ICs9IGlvdltpXS5pb3ZfbGVuOworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbnQgcWVtdV9kZWxpdmVyX3BhY2tldF9pb3YoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250KQoreworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisgICAgaW50IHJldCA9IC0xOworCisgICAgc2VuZGVyLT52bGFuLT5kZWxpdmVyaW5nID0gMTsKKworICAgIGZvciAodmMgPSBzZW5kZXItPnZsYW4tPmZpcnN0X2NsaWVudDsgdmMgIT0gTlVMTDsgdmMgPSB2Yy0+bmV4dCkgeworICAgICAgICBzc2l6ZV90IGxlbjsKKworICAgICAgICBpZiAodmMgPT0gc2VuZGVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2Yy0+bGlua19kb3duKSB7CisgICAgICAgICAgICByZXQgPSBjYWxjX2lvdl9sZW5ndGgoaW92LCBpb3ZjbnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmMtPnJlY2VpdmVfaW92KSB7CisgICAgICAgICAgICBsZW4gPSB2Yy0+cmVjZWl2ZV9pb3YodmMsIGlvdiwgaW92Y250KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbiA9IHZjX3NlbmR2X2NvbXBhdCh2YywgaW92LCBpb3ZjbnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gKHJldCA+PSAwKSA/IHJldCA6IGxlbjsKKyAgICB9CisKKyAgICBzZW5kZXItPnZsYW4tPmRlbGl2ZXJpbmcgPSAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcWVtdV9lbnF1ZXVlX3BhY2tldF9pb3YoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldFBhY2tldFNlbnQgKnNlbnRfY2IpCit7CisgICAgVkxBTlBhY2tldCAqcGFja2V0OworICAgIHNpemVfdCBtYXhfbGVuID0gMDsKKyAgICBpbnQgaTsKKworICAgIG1heF9sZW4gPSBjYWxjX2lvdl9sZW5ndGgoaW92LCBpb3ZjbnQpOworCisgICAgcGFja2V0ID0gZ19tYWxsb2Moc2l6ZW9mKFZMQU5QYWNrZXQpICsgbWF4X2xlbik7CisgICAgcGFja2V0LT5uZXh0ID0gc2VuZGVyLT52bGFuLT5zZW5kX3F1ZXVlOworICAgIHBhY2tldC0+c2VuZGVyID0gc2VuZGVyOworICAgIHBhY2tldC0+c2VudF9jYiA9IHNlbnRfY2I7CisgICAgcGFja2V0LT5zaXplID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpb3ZjbnQ7IGkrKykgeworICAgICAgICBzaXplX3QgbGVuID0gaW92W2ldLmlvdl9sZW47CisKKyAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSArIHBhY2tldC0+c2l6ZSwgaW92W2ldLmlvdl9iYXNlLCBsZW4pOworICAgICAgICBwYWNrZXQtPnNpemUgKz0gbGVuOworICAgIH0KKworICAgIHNlbmRlci0+dmxhbi0+c2VuZF9xdWV1ZSA9IHBhY2tldDsKKworICAgIHJldHVybiBwYWNrZXQtPnNpemU7Cit9CisKK3NzaXplX3QgcWVtdV9zZW5kdl9wYWNrZXRfYXN5bmMoVkxBTkNsaWVudFN0YXRlICpzZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRQYWNrZXRTZW50ICpzZW50X2NiKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoc2VuZGVyLT5saW5rX2Rvd24pIHsKKyAgICAgICAgcmV0dXJuIGNhbGNfaW92X2xlbmd0aChpb3YsIGlvdmNudCk7CisgICAgfQorCisgICAgaWYgKHNlbmRlci0+dmxhbi0+ZGVsaXZlcmluZykgeworICAgICAgICByZXR1cm4gcWVtdV9lbnF1ZXVlX3BhY2tldF9pb3Yoc2VuZGVyLCBpb3YsIGlvdmNudCwgTlVMTCk7CisgICAgfQorCisgICAgcmV0ID0gcWVtdV9kZWxpdmVyX3BhY2tldF9pb3Yoc2VuZGVyLCBpb3YsIGlvdmNudCk7CisgICAgaWYgKHJldCA9PSAwICYmIHNlbnRfY2IgIT0gTlVMTCkgeworICAgICAgICBxZW11X2VucXVldWVfcGFja2V0X2lvdihzZW5kZXIsIGlvdiwgaW92Y250LCBzZW50X2NiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcWVtdV9mbHVzaF9xdWV1ZWRfcGFja2V0cyhzZW5kZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdAorcWVtdV9zZW5kdl9wYWNrZXQoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQpCit7CisgICAgcmV0dXJuIHFlbXVfc2VuZHZfcGFja2V0X2FzeW5jKHZjLCBpb3YsIGlvdmNudCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ19lcnJvcihNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBpZiAobW9uKSB7CisgICAgICAgIG1vbml0b3JfdnByaW50Zihtb24sIGZtdCwgYXApOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogIik7CisgICAgICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHZhX2VuZChhcCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TTElSUCkKKworLyogc2xpcnAgbmV0d29yayBhZGFwdGVyICovCisKK3N0cnVjdCBzbGlycF9jb25maWdfc3RyIHsKKyAgICBzdHJ1Y3Qgc2xpcnBfY29uZmlnX3N0ciAqbmV4dDsKKyAgICBjb25zdCBjaGFyICpzdHI7Cit9OworCitzdGF0aWMgaW50IHNsaXJwX2luaXRlZDsKK3N0YXRpYyBzdHJ1Y3Qgc2xpcnBfY29uZmlnX3N0ciAqc2xpcnBfcmVkaXJzOworI2lmbmRlZiBfV0lOMzIKK3N0YXRpYyBjb25zdCBjaGFyICpzbGlycF9zbWJfZXhwb3J0OworI2VuZGlmCitzdGF0aWMgVkxBTkNsaWVudFN0YXRlICpzbGlycF92YzsKKworI2lmbmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkIHNsaXJwX3NtYihjb25zdCBjaGFyICpleHBvcnRlZF9kaXIpOworI2VuZGlmCitzdGF0aWMgdm9pZCBzbGlycF9yZWRpcmVjdGlvbihNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKnJlZGlyX3N0cik7CisKK2ludCBzbGlycF9jYW5fb3V0cHV0KHZvaWQpCit7CisgICAgcmV0dXJuICFzbGlycF92YyB8fCBxZW11X2Nhbl9zZW5kX3BhY2tldChzbGlycF92Yyk7Cit9CisKK3ZvaWQgc2xpcnBfb3V0cHV0KGNvbnN0IHVpbnQ4X3QgKnBrdCwgaW50IHBrdF9sZW4pCit7CisjaWZkZWYgREVCVUdfU0xJUlAKKyAgICBwcmludGYoInNsaXJwIG91dHB1dDpcbiIpOworICAgIGhleF9kdW1wKHN0ZG91dCwgcGt0LCBwa3RfbGVuKTsKKyNlbmRpZgorICAgIGlmICghc2xpcnBfdmMpCisgICAgICAgIHJldHVybjsKKyAgICBxZW11X3NlbmRfcGFja2V0KHNsaXJwX3ZjLCBwa3QsIHBrdF9sZW4pOworfQorCitpbnQgc2xpcnBfaXNfaW5pdGVkKHZvaWQpCit7CisgICAgcmV0dXJuIHNsaXJwX2luaXRlZDsKK30KKworc3RhdGljIHNzaXplX3Qgc2xpcnBfcmVjZWl2ZShWTEFOQ2xpZW50U3RhdGUgKnZjLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworI2lmZGVmIERFQlVHX1NMSVJQCisgICAgcHJpbnRmKCJzbGlycCBpbnB1dDpcbiIpOworICAgIGhleF9kdW1wKHN0ZG91dCwgYnVmLCBzaXplKTsKKyNlbmRpZgorICAgIHNsaXJwX2lucHV0KGJ1Ziwgc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgc2xpcnBfaW5fdXNlOworCitzdGF0aWMgdm9pZCBuZXRfc2xpcnBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIHNsaXJwX2luX3VzZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0X3NsaXJwX2luaXQoVkxBTlN0YXRlICp2bGFuLCBjb25zdCBjaGFyICptb2RlbCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3RyaWN0ZWQsIGNvbnN0IGNoYXIgKmlwKQoreworICAgIGlmIChzbGlycF9pbl91c2UpIHsKKyAgICAgICAgLyogc2xpcnAgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBpbnN0YW5jZSBzbyBmYXIgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXNsaXJwX2luaXRlZCkgeworICAgICAgICBzbGlycF9pbml0ZWQgPSAxOworICAgICAgICBzbGlycF9pbml0KHJlc3RyaWN0ZWQsIGlwKTsKKworICAgICAgICB3aGlsZSAoc2xpcnBfcmVkaXJzKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc2xpcnBfY29uZmlnX3N0ciAqY29uZmlnID0gc2xpcnBfcmVkaXJzOworCisgICAgICAgICAgICBzbGlycF9yZWRpcmVjdGlvbihOVUxMLCBjb25maWctPnN0cik7CisgICAgICAgICAgICBzbGlycF9yZWRpcnMgPSBjb25maWctPm5leHQ7CisgICAgICAgICAgICBnX2ZyZWUoY29uZmlnKTsKKyAgICAgICAgfQorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgaWYgKHNsaXJwX3NtYl9leHBvcnQpIHsKKyAgICAgICAgICAgIHNsaXJwX3NtYihzbGlycF9zbWJfZXhwb3J0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgc2xpcnBfdmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgc2xpcnBfcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG5ldF9zbGlycF9jbGVhbnVwLCBOVUxMKTsKKyAgICBzbGlycF92Yy0+aW5mb19zdHJbMF0gPSAnXDAnOworICAgIHNsaXJwX2luX3VzZSA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zbGlycF9yZWRpcl9wcmludCh2b2lkICpvcGFxdWUsIGludCBpc191ZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIgKmxhZGRyLCB1X2ludCBscG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fYWRkciAqZmFkZHIsIHVfaW50IGZwb3J0KQoreworICAgIE1vbml0b3IgKm1vbiA9IChNb25pdG9yICopb3BhcXVlOworICAgIHVpbnQzMl90IGhfYWRkcjsKKyAgICB1aW50MzJfdCBnX2FkZHI7CisgICAgY2hhciBidWZbMTZdOworCisgICAgaF9hZGRyID0gbnRvaGwoZmFkZHItPnNfYWRkcik7CisgICAgZ19hZGRyID0gbnRvaGwobGFkZHItPnNfYWRkcik7CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICVzIHwiLCBpc191ZHAgPyAidWRwIiA6ICJ0Y3AiICk7CisgICAgc25wcmludGYoYnVmLCAxNSwgIiVkLiVkLiVkLiVkIiwgKGhfYWRkciA+PiAyNCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoX2FkZHIgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaF9hZGRyID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaF9hZGRyKSAmIDB4ZmYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlMTVzIHwiLCBidWYpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAlNWQgfCIsIGZwb3J0KTsKKworICAgIHNucHJpbnRmKGJ1ZiwgMTUsICIlZC4lZC4lZC4lZCIsIChnX2FkZHIgPj4gMjQpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ19hZGRyID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdfYWRkciA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdfYWRkcikgJiAweGZmKTsKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgJTE1cyB8IiwgYnVmKTsKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgJTVkXG4iLCBscG9ydCk7CisKK30KKworc3RhdGljIHZvaWQgbmV0X3NsaXJwX3JlZGlyX2xpc3QoTW9uaXRvciAqbW9uKQoreworICAgIGlmICghbW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBtb25pdG9yX3ByaW50Zihtb24sICIgUHJvdCB8ICAgIEhvc3QgQWRkciAgICB8IEhQb3J0IHwgICAgR3Vlc3QgQWRkciAgIHwgR1BvcnRcbiIpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgIFxuIik7CisgICAgc2xpcnBfcmVkaXJfbG9vcChuZXRfc2xpcnBfcmVkaXJfcHJpbnQsIG1vbik7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zbGlycF9yZWRpcl9ybShNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKnBvcnRfc3RyKQoreworICAgIGludCBob3N0X3BvcnQ7CisgICAgY2hhciBidWZbMjU2XSA9ICIiOworICAgIGNvbnN0IGNoYXIgKnAgPSBwb3J0X3N0cjsKKyAgICBpbnQgaXNfdWRwID0gMDsKKyAgICBpbnQgbjsKKworICAgIGlmICghbW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXBvcnRfc3RyIHx8ICFwb3J0X3N0clswXSkKKyAgICAgICAgZ290byBmYWlsX3N5bnRheDsKKworICAgIGdldF9zdHJfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZwLCAnOicpOworCisgICAgaWYgKCFzdHJjbXAoYnVmLCAidGNwIikgfHwgYnVmWzBdID09ICdcMCcpIHsKKyAgICAgICAgaXNfdWRwID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAidWRwIikpIHsKKyAgICAgICAgaXNfdWRwID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGZhaWxfc3ludGF4OworICAgIH0KKworICAgIGhvc3RfcG9ydCA9IGF0b2kocCk7CisKKyAgICBuID0gc2xpcnBfcmVkaXJfcm0oaXNfdWRwLCBob3N0X3BvcnQpOworCisgICAgbW9uaXRvcl9wcmludGYobW9uLCAicmVtb3ZlZCAlZCByZWRpcmVjdGlvbnMgdG8gJXMgcG9ydCAlZFxuIiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3VkcCA/ICJ1ZHAiIDogInRjcCIsIGhvc3RfcG9ydCk7CisgICAgcmV0dXJuOworCisgZmFpbF9zeW50YXg6CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiaW52YWxpZCBmb3JtYXRcbiIpOworfQorCitzdGF0aWMgdm9pZCBzbGlycF9yZWRpcmVjdGlvbihNb25pdG9yICptb24sIGNvbnN0IGNoYXIgKnJlZGlyX3N0cikKK3sKKyAgICBzdHJ1Y3QgaW5fYWRkciBndWVzdF9hZGRyOworICAgIGludCBob3N0X3BvcnQsIGd1ZXN0X3BvcnQ7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGJ1ZlsyNTZdLCAqcjsKKyAgICBpbnQgaXNfdWRwOworCisgICAgcCA9IHJlZGlyX3N0cjsKKyAgICBpZiAoZ2V0X3N0cl9zZXAoYnVmLCBzaXplb2YoYnVmKSwgJnAsICc6JykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorICAgIGlmICghc3RyY21wKGJ1ZiwgInRjcCIpIHx8IGJ1ZlswXSA9PSAnXDAnKSB7CisgICAgICAgIGlzX3VkcCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInVkcCIpKSB7CisgICAgICAgIGlzX3VkcCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBmYWlsX3N5bnRheDsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3N0cl9zZXAoYnVmLCBzaXplb2YoYnVmKSwgJnAsICc6JykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorICAgIGhvc3RfcG9ydCA9IHN0cnRvbChidWYsICZyLCAwKTsKKyAgICBpZiAociA9PSBidWYpIHsKKyAgICAgICAgZ290byBmYWlsX3N5bnRheDsKKyAgICB9CisKKyAgICBpZiAoZ2V0X3N0cl9zZXAoYnVmLCBzaXplb2YoYnVmKSwgJnAsICc6JykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorICAgIGlmIChidWZbMF0gPT0gJ1wwJykgeworICAgICAgICBwc3RyY3B5KGJ1Ziwgc2l6ZW9mKGJ1ZiksICIxMC4wLjIuMTUiKTsKKyAgICB9CisgICAgaWYgKCFpbmV0X2F0b24oYnVmLCAmZ3Vlc3RfYWRkcikpIHsKKyAgICAgICAgZ290byBmYWlsX3N5bnRheDsKKyAgICB9CisKKyAgICBndWVzdF9wb3J0ID0gc3RydG9sKHAsICZyLCAwKTsKKyAgICBpZiAociA9PSBwKSB7CisgICAgICAgIGdvdG8gZmFpbF9zeW50YXg7CisgICAgfQorCisgICAgaWYgKHNsaXJwX3JlZGlyKGlzX3VkcCwgaG9zdF9wb3J0LCBndWVzdF9hZGRyLCBndWVzdF9wb3J0KSA8IDApIHsKKyAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImNvdWxkIG5vdCBzZXQgdXAgcmVkaXJlY3Rpb24gJyVzJ1xuIiwgcmVkaXJfc3RyKTsKKyAgICB9CisgICAgcmV0dXJuOworCisgZmFpbF9zeW50YXg6CisgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcmVkaXJlY3Rpb24gZm9ybWF0ICclcydcbiIsIHJlZGlyX3N0cik7Cit9CisKK3ZvaWQgbmV0X3NsaXJwX3JlZGlyKE1vbml0b3IgKm1vbiwgY29uc3QgY2hhciAqcmVkaXJfc3RyLCBjb25zdCBjaGFyICpyZWRpcl9vcHQyKQoreworICAgIHN0cnVjdCBzbGlycF9jb25maWdfc3RyICpjb25maWc7CisKKyAgICBpZiAoIXNsaXJwX2luaXRlZCkgeworICAgICAgICBpZiAobW9uKSB7CisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJ1c2VyIG1vZGUgbmV0d29yayBzdGFjayBub3QgaW4gdXNlXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbmZpZyA9IGdfbWFsbG9jKHNpemVvZigqY29uZmlnKSk7CisgICAgICAgICAgICBjb25maWctPnN0ciA9IHJlZGlyX3N0cjsKKyAgICAgICAgICAgIGNvbmZpZy0+bmV4dCA9IHNsaXJwX3JlZGlyczsKKyAgICAgICAgICAgIHNsaXJwX3JlZGlycyA9IGNvbmZpZzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAocmVkaXJfc3RyLCAicmVtb3ZlIikpIHsKKyAgICAgICAgbmV0X3NsaXJwX3JlZGlyX3JtKG1vbiwgcmVkaXJfb3B0Mik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChyZWRpcl9zdHIsICJsaXN0IikpIHsKKyAgICAgICAgbmV0X3NsaXJwX3JlZGlyX2xpc3QobW9uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNsaXJwX3JlZGlyZWN0aW9uKG1vbiwgcmVkaXJfc3RyKTsKK30KKworI2lmbmRlZiBfV0lOMzIKKworc3RhdGljIGNoYXIgc21iX2RpclsxMDI0XTsKKworc3RhdGljIHZvaWQgZXJhc2VfZGlyKGNoYXIgKmRpcl9uYW1lKQoreworICAgIERJUiAqZDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKKyAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworCisgICAgLyogZXJhc2UgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5ICovCisgICAgaWYgKChkID0gb3BlbmRpcihkaXJfbmFtZSkpICE9IE5VTEwpIHsKKyAgICAgICAgZm9yKDs7KSB7CisgICAgICAgICAgICBkZSA9IHJlYWRkaXIoZCk7CisgICAgICAgICAgICBpZiAoIWRlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHN0cmNtcChkZS0+ZF9uYW1lLCAiLiIpICE9IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAoZGUtPmRfbmFtZSwgIi4uIikgIT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNtYl9kaXIsIGRlLT5kX25hbWUpOworICAgICAgICAgICAgICAgIGlmICh1bmxpbmsoZmlsZW5hbWUpICE9IDApICAvKiBpcyBpdCBhIGRpcmVjdG9yeT8gKi8KKyAgICAgICAgICAgICAgICAgICAgZXJhc2VfZGlyKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkKTsKKyAgICAgICAgcm1kaXIoZGlyX25hbWUpOworICAgIH0KK30KKworLyogYXV0b21hdGljIHVzZXIgbW9kZSBzYW1iYSBzZXJ2ZXIgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHZvaWQgc21iX2V4aXQodm9pZCkKK3sKKyAgICBlcmFzZV9kaXIoc21iX2Rpcik7Cit9CisKK3N0YXRpYyB2b2lkIHNsaXJwX3NtYihjb25zdCBjaGFyICpleHBvcnRlZF9kaXIpCit7CisgICAgY2hhciBzbWJfY29uZlsxMDI0XTsKKyAgICBjaGFyIHNtYl9jbWRsaW5lWzEwMjRdOworICAgIEZJTEUgKmY7CisKKyAgICAvKiBYWFg6IGJldHRlciB0bXAgZGlyIGNvbnN0cnVjdGlvbiAqLworICAgIHNucHJpbnRmKHNtYl9kaXIsIHNpemVvZihzbWJfZGlyKSwgIi90bXAvcWVtdS1zbWIuJWxkIiwgKGxvbmcpZ2V0cGlkKCkpOworICAgIGlmIChta2RpcihzbWJfZGlyLCAwNzAwKSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3QgY3JlYXRlIHNhbWJhIHNlcnZlciBkaXIgJyVzJ1xuIiwgc21iX2Rpcik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHNucHJpbnRmKHNtYl9jb25mLCBzaXplb2Yoc21iX2NvbmYpLCAiJXMvJXMiLCBzbWJfZGlyLCAic21iLmNvbmYiKTsKKworICAgIGYgPSBmb3BlbihzbWJfY29uZiwgInciKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBjb3VsZCBub3QgY3JlYXRlIHNhbWJhIHNlcnZlciBjb25maWd1cmF0aW9uIGZpbGUgJyVzJ1xuIiwgc21iX2NvbmYpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBmcHJpbnRmKGYsCisgICAgICAgICAgICAiW2dsb2JhbF1cbiIKKyAgICAgICAgICAgICJwcml2YXRlIGRpcj0lc1xuIgorICAgICAgICAgICAgInNtYiBwb3J0cz0wXG4iCisgICAgICAgICAgICAic29ja2V0IGFkZHJlc3M9MTI3LjAuMC4xXG4iCisgICAgICAgICAgICAicGlkIGRpcmVjdG9yeT0lc1xuIgorICAgICAgICAgICAgImxvY2sgZGlyZWN0b3J5PSVzXG4iCisgICAgICAgICAgICAibG9nIGZpbGU9JXMvbG9nLnNtYmRcbiIKKyAgICAgICAgICAgICJzbWIgcGFzc3dkIGZpbGU9JXMvc21icGFzc3dkXG4iCisgICAgICAgICAgICAic2VjdXJpdHkgPSBzaGFyZVxuIgorICAgICAgICAgICAgIltxZW11XVxuIgorICAgICAgICAgICAgInBhdGg9JXNcbiIKKyAgICAgICAgICAgICJyZWFkIG9ubHk9bm9cbiIKKyAgICAgICAgICAgICJndWVzdCBvaz15ZXNcbiIsCisgICAgICAgICAgICBzbWJfZGlyLAorICAgICAgICAgICAgc21iX2RpciwKKyAgICAgICAgICAgIHNtYl9kaXIsCisgICAgICAgICAgICBzbWJfZGlyLAorICAgICAgICAgICAgc21iX2RpciwKKyAgICAgICAgICAgIGV4cG9ydGVkX2RpcgorICAgICAgICAgICAgKTsKKyAgICBmY2xvc2UoZik7CisgICAgYXRleGl0KHNtYl9leGl0KTsKKworICAgIHNucHJpbnRmKHNtYl9jbWRsaW5lLCBzaXplb2Yoc21iX2NtZGxpbmUpLCAiJXMgLXMgJXMiLAorICAgICAgICAgICAgIFNNQkRfQ09NTUFORCwgc21iX2NvbmYpOworCisgICAgc2xpcnBfYWRkX2V4ZWMoMCwgc21iX2NtZGxpbmUsIDQsIDEzOSk7Cit9CisKKy8qIGF1dG9tYXRpYyB1c2VyIG1vZGUgc2FtYmEgc2VydmVyIGNvbmZpZ3VyYXRpb24gKi8KK3ZvaWQgbmV0X3NsaXJwX3NtYihjb25zdCBjaGFyICpleHBvcnRlZF9kaXIpCit7CisgICAgaWYgKHNsaXJwX3NtYl9leHBvcnQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICItc21iIGdpdmVuIHR3aWNlXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgc2xpcnBfc21iX2V4cG9ydCA9IGV4cG9ydGVkX2RpcjsKKyAgICBpZiAoc2xpcnBfaW5pdGVkKSB7CisgICAgICAgIHNsaXJwX3NtYihleHBvcnRlZF9kaXIpOworICAgIH0KK30KKworI2VuZGlmIC8qICFkZWZpbmVkKF9XSU4zMikgKi8KKwordm9pZCBkb19pbmZvX3NsaXJwKE1vbml0b3IgKm1vbikKK3sKKyAgICBzbGlycF9zdGF0cygpOworfQorCitzdHJ1Y3QgVk1DaGFubmVsIHsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmhkOworICAgIGludCBwb3J0OworfTsKKworc3RhdGljIGludCB2bWNoYW5uZWxfY2FuX3JlYWQodm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCBWTUNoYW5uZWwgKnZtYyA9IChzdHJ1Y3QgVk1DaGFubmVsKilvcGFxdWU7CisgICAgcmV0dXJuIHNsaXJwX3NvY2tldF9jYW5fcmVjdig0LCB2bWMtPnBvcnQpOworfQorCitzdGF0aWMgdm9pZCB2bWNoYW5uZWxfcmVhZCh2b2lkICpvcGFxdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgc3RydWN0IFZNQ2hhbm5lbCAqdm1jID0gKHN0cnVjdCBWTUNoYW5uZWwqKW9wYXF1ZTsKKyAgICBzbGlycF9zb2NrZXRfcmVjdig0LCB2bWMtPnBvcnQsIGJ1Ziwgc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0xJUlAgKi8KKworI2lmICFkZWZpbmVkKF9XSU4zMikKKwordHlwZWRlZiBzdHJ1Y3QgVEFQU3RhdGUgeworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisgICAgaW50IGZkOworICAgIGNoYXIgZG93bl9zY3JpcHRbMTAyNF07CisgICAgY2hhciBkb3duX3NjcmlwdF9hcmdbMTI4XTsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKK30gVEFQU3RhdGU7CisKK3N0YXRpYyBpbnQgbGF1bmNoX3NjcmlwdChjb25zdCBjaGFyICpzZXR1cF9zY3JpcHQsIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50IGZkKTsKKworc3RhdGljIHNzaXplX3QgdGFwX3JlY2VpdmVfaW92KFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb3ZjbnQpCit7CisgICAgVEFQU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworICAgIHNzaXplX3QgbGVuOworCisgICAgZG8geworICAgICAgICBsZW4gPSB3cml0ZXYocy0+ZmQsIGlvdiwgaW92Y250KTsKKyAgICB9IHdoaWxlIChsZW4gPT0gLTEgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgdGFwX3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBkbyB7CisgICAgICAgIGxlbiA9IHdyaXRlKHMtPmZkLCBidWYsIHNpemUpOworICAgIH0gd2hpbGUgKGxlbiA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSk7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHRhcF9jYW5fc2VuZCh2b2lkICpvcGFxdWUpCit7CisgICAgVEFQU3RhdGUgKnMgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gcWVtdV9jYW5fc2VuZF9wYWNrZXQocy0+dmMpOworfQorCisjaWZkZWYgX19zdW5fXworc3RhdGljIHNzaXplX3QgdGFwX3JlYWRfcGFja2V0KGludCB0YXBmZCwgdWludDhfdCAqYnVmLCBpbnQgbWF4bGVuKQoreworICAgIHN0cnVjdCBzdHJidWYgc2J1ZjsKKyAgICBpbnQgZiA9IDA7CisKKyAgICBzYnVmLm1heGxlbiA9IG1heGxlbjsKKyAgICBzYnVmLmJ1ZiA9IChjaGFyICopYnVmOworCisgICAgcmV0dXJuIGdldG1zZyh0YXBmZCwgTlVMTCwgJnNidWYsICZmKSA+PSAwID8gc2J1Zi5sZW4gOiAtMTsKK30KKyNlbHNlCitzdGF0aWMgc3NpemVfdCB0YXBfcmVhZF9wYWNrZXQoaW50IHRhcGZkLCB1aW50OF90ICpidWYsIGludCBtYXhsZW4pCit7CisgICAgcmV0dXJuIHJlYWQodGFwZmQsIGJ1ZiwgbWF4bGVuKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0YXBfc2VuZCh2b2lkICpvcGFxdWUpOworCitzdGF0aWMgdm9pZCB0YXBfc2VuZF9jb21wbGV0ZWQoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyMihzLT5mZCwgdGFwX2Nhbl9zZW5kLCB0YXBfc2VuZCwgTlVMTCwgcyk7Cit9CisKK3N0YXRpYyB2b2lkIHRhcF9zZW5kKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgc2l6ZTsKKworICAgIGRvIHsKKyAgICAgICAgc2l6ZSA9IHRhcF9yZWFkX3BhY2tldChzLT5mZCwgcy0+YnVmLCBzaXplb2Yocy0+YnVmKSk7CisgICAgICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZSA9IHFlbXVfc2VuZF9wYWNrZXRfYXN5bmMocy0+dmMsIHMtPmJ1Ziwgc2l6ZSwgdGFwX3NlbmRfY29tcGxldGVkKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoc2l6ZSA+IDApOworfQorCitzdGF0aWMgdm9pZCB0YXBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIFRBUFN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKworICAgIGlmIChzLT5kb3duX3NjcmlwdFswXSkKKyAgICAgICAgbGF1bmNoX3NjcmlwdChzLT5kb3duX3NjcmlwdCwgcy0+ZG93bl9zY3JpcHRfYXJnLCBzLT5mZCk7CisKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBjbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworfQorCisvKiBmZCBzdXBwb3J0ICovCisKK3N0YXRpYyBUQVBTdGF0ZSAqbmV0X3RhcF9mZF9pbml0KFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCkKK3sKKyAgICBUQVBTdGF0ZSAqczsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFRBUFN0YXRlKSk7CisgICAgcy0+ZmQgPSBmZDsKKyAgICBzLT52YyA9IHFlbXVfbmV3X3ZsYW5fY2xpZW50KHZsYW4sIG1vZGVsLCBuYW1lLCBOVUxMLCB0YXBfcmVjZWl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcF9yZWNlaXZlX2lvdiwgdGFwX2NsZWFudXAsIHMpOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHMtPmZkLCB0YXBfY2FuX3NlbmQsIHRhcF9zZW5kLCBOVUxMLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLCAiZmQ9JWQiLCBmZCk7CisgICAgcmV0dXJuIHM7Cit9CisKKyNpZiBkZWZpbmVkIChDT05GSUdfQlNEKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0Rfa2VybmVsX18pCitzdGF0aWMgaW50IHRhcF9vcGVuKGNoYXIgKmlmbmFtZSwgaW50IGlmbmFtZV9zaXplKQoreworICAgIGludCBmZDsKKyAgICBjaGFyICpkZXY7CisgICAgc3RydWN0IHN0YXQgczsKKworICAgIFRGUihmZCA9IG9wZW4oIi9kZXYvdGFwIiwgT19SRFdSKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGNvdWxkIG5vdCBvcGVuIC9kZXYvdGFwOiBubyB2aXJ0dWFsIG5ldHdvcmsgZW11bGF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZzdGF0KGZkLCAmcyk7CisgICAgZGV2ID0gZGV2bmFtZShzLnN0X3JkZXYsIFNfSUZDSFIpOworICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgZGV2KTsKKworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICByZXR1cm4gZmQ7Cit9CisjZWxpZiBkZWZpbmVkKF9fc3VuX18pCisjZGVmaW5lIFRVTk5FV1BQQSAgICAgICAoKCdUJzw8MTYpIHwgMHgwMDAxKQorLyoKKyAqIEFsbG9jYXRlIFRBUCBkZXZpY2UsIHJldHVybnMgb3BlbmVkIGZkLgorICogU3RvcmVzIGRldiBuYW1lIGluIHRoZSBmaXJzdCBhcmcobXVzdCBiZSBsYXJnZSBlbm91Z2gpLgorICovCitzdGF0aWMgaW50IHRhcF9hbGxvYyhjaGFyICpkZXYsIHNpemVfdCBkZXZfc2l6ZSkKK3sKKyAgICBpbnQgdGFwX2ZkLCBpZl9mZCwgcHBhID0gLTE7CisgICAgc3RhdGljIGludCBpcF9mZCA9IDA7CisgICAgY2hhciAqcHRyOworCisgICAgc3RhdGljIGludCBhcnBfZmQgPSAwOworICAgIGludCBpcF9tdXhpZCwgYXJwX211eGlkOworICAgIHN0cnVjdCBzdHJpb2N0bCAgc3RyaW9jX2lmLCBzdHJpb2NfcHBhOworICAgIGludCBsaW5rX3R5cGUgPSBJX1BMSU5LOzsKKyAgICBzdHJ1Y3QgbGlmcmVxIGlmcjsKKyAgICBjaGFyIGFjdHVhbF9uYW1lWzMyXSA9ICIiOworCisgICAgbWVtc2V0KCZpZnIsIDB4MCwgc2l6ZW9mKGlmcikpOworCisgICAgaWYoICpkZXYgKXsKKyAgICAgICBwdHIgPSBkZXY7CisgICAgICAgd2hpbGUoICpwdHIgJiYgIXFlbXVfaXNkaWdpdCgoaW50KSpwdHIpICkgcHRyKys7CisgICAgICAgcHBhID0gYXRvaShwdHIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIElQIGRldmljZSB3YXMgb3BlbmVkICovCisgICAgaWYoIGlwX2ZkICkKKyAgICAgICBjbG9zZShpcF9mZCk7CisKKyAgICBURlIoaXBfZmQgPSBvcGVuKCIvZGV2L3VkcCIsIE9fUkRXUiwgMCkpOworICAgIGlmIChpcF9mZCA8IDApIHsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IG9wZW4gL2Rldi9pcCAoYWN0dWFsbHkgL2Rldi91ZHApIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFRGUih0YXBfZmQgPSBvcGVuKCIvZGV2L3RhcCIsIE9fUkRXUiwgMCkpOworICAgIGlmICh0YXBfZmQgPCAwKSB7CisgICAgICAgc3lzbG9nKExPR19FUlIsICJDYW4ndCBvcGVuIC9kZXYvdGFwIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIEFzc2lnbiBhIG5ldyBQUEEgYW5kIGdldCBpdHMgdW5pdCBudW1iZXIuICovCisgICAgc3RyaW9jX3BwYS5pY19jbWQgPSBUVU5ORVdQUEE7CisgICAgc3RyaW9jX3BwYS5pY190aW1vdXQgPSAwOworICAgIHN0cmlvY19wcGEuaWNfbGVuID0gc2l6ZW9mKHBwYSk7CisgICAgc3RyaW9jX3BwYS5pY19kcCA9IChjaGFyICopJnBwYTsKKyAgICBpZiAoKHBwYSA9IGlvY3RsICh0YXBfZmQsIElfU1RSLCAmc3RyaW9jX3BwYSkpIDwgMCkKKyAgICAgICBzeXNsb2cgKExPR19FUlIsICJDYW4ndCBhc3NpZ24gbmV3IGludGVyZmFjZSIpOworCisgICAgVEZSKGlmX2ZkID0gb3BlbigiL2Rldi90YXAiLCBPX1JEV1IsIDApKTsKKyAgICBpZiAoaWZfZmQgPCAwKSB7CisgICAgICAgc3lzbG9nKExPR19FUlIsICJDYW4ndCBvcGVuIC9kZXYvdGFwICgyKSIpOworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoaW9jdGwoaWZfZmQsIElfUFVTSCwgImlwIikgPCAwKXsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IHB1c2ggSVAgbW9kdWxlIik7CisgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChpb2N0bChpZl9mZCwgU0lPQ0dMSUZGTEFHUywgJmlmcikgPCAwKQorCXN5c2xvZyhMT0dfRVJSLCAiQ2FuJ3QgZ2V0IGZsYWdzXG4iKTsKKworICAgIHNucHJpbnRmIChhY3R1YWxfbmFtZSwgMzIsICJ0YXAlZCIsIHBwYSk7CisgICAgcHN0cmNweShpZnIubGlmcl9uYW1lLCBzaXplb2YoaWZyLmxpZnJfbmFtZSksIGFjdHVhbF9uYW1lKTsKKworICAgIGlmci5saWZyX3BwYSA9IHBwYTsKKyAgICAvKiBBc3NpZ24gcHBhIGFjY29yZGluZyB0byB0aGUgdW5pdCBudW1iZXIgcmV0dXJuZWQgYnkgdHVuIGRldmljZSAqLworCisgICAgaWYgKGlvY3RsIChpZl9mZCwgU0lPQ1NMSUZOQU1FLCAmaWZyKSA8IDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IHNldCBQUEEgJWQiLCBwcGEpOworICAgIGlmIChpb2N0bChpZl9mZCwgU0lPQ0dMSUZGTEFHUywgJmlmcikgPDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IGdldCBmbGFnc1xuIik7CisgICAgLyogUHVzaCBhcnAgbW9kdWxlIHRvIGlmX2ZkICovCisgICAgaWYgKGlvY3RsIChpZl9mZCwgSV9QVVNILCAiYXJwIikgPCAwKQorICAgICAgICBzeXNsb2cgKExPR19FUlIsICJDYW4ndCBwdXNoIEFSUCBtb2R1bGUgKDIpIik7CisKKyAgICAvKiBQdXNoIGFycCBtb2R1bGUgdG8gaXBfZmQgKi8KKyAgICBpZiAoaW9jdGwgKGlwX2ZkLCBJX1BPUCwgTlVMTCkgPCAwKQorICAgICAgICBzeXNsb2cgKExPR19FUlIsICJJX1BPUCBmYWlsZWRcbiIpOworICAgIGlmIChpb2N0bCAoaXBfZmQsIElfUFVTSCwgImFycCIpIDwgMCkKKyAgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3QgcHVzaCBBUlAgbW9kdWxlICgzKVxuIik7CisgICAgLyogT3BlbiBhcnBfZmQgKi8KKyAgICBURlIoYXJwX2ZkID0gb3BlbiAoIi9kZXYvdGFwIiwgT19SRFdSLCAwKSk7CisgICAgaWYgKGFycF9mZCA8IDApCisgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3Qgb3BlbiAlc1xuIiwgIi9kZXYvdGFwIik7CisKKyAgICAvKiBTZXQgaWZuYW1lIHRvIGFycCAqLworICAgIHN0cmlvY19pZi5pY19jbWQgPSBTSU9DU0xJRk5BTUU7CisgICAgc3RyaW9jX2lmLmljX3RpbW91dCA9IDA7CisgICAgc3RyaW9jX2lmLmljX2xlbiA9IHNpemVvZihpZnIpOworICAgIHN0cmlvY19pZi5pY19kcCA9IChjaGFyICopJmlmcjsKKyAgICBpZiAoaW9jdGwoYXJwX2ZkLCBJX1NUUiwgJnN0cmlvY19pZikgPCAwKXsKKyAgICAgICAgc3lzbG9nIChMT0dfRVJSLCAiQ2FuJ3Qgc2V0IGlmbmFtZSB0byBhcnBcbiIpOworICAgIH0KKworICAgIGlmKChpcF9tdXhpZCA9IGlvY3RsKGlwX2ZkLCBJX0xJTkssIGlmX2ZkKSkgPCAwKXsKKyAgICAgICBzeXNsb2coTE9HX0VSUiwgIkNhbid0IGxpbmsgVEFQIGRldmljZSB0byBJUCIpOworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKGFycF9tdXhpZCA9IGlvY3RsIChpcF9mZCwgbGlua190eXBlLCBhcnBfZmQpKSA8IDApCisgICAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IGxpbmsgVEFQIGRldmljZSB0byBBUlAiKTsKKworICAgIGNsb3NlIChpZl9mZCk7CisKKyAgICBtZW1zZXQoJmlmciwgMHgwLCBzaXplb2YoaWZyKSk7CisgICAgcHN0cmNweShpZnIubGlmcl9uYW1lLCBzaXplb2YoaWZyLmxpZnJfbmFtZSksIGFjdHVhbF9uYW1lKTsKKyAgICBpZnIubGlmcl9pcF9tdXhpZCAgPSBpcF9tdXhpZDsKKyAgICBpZnIubGlmcl9hcnBfbXV4aWQgPSBhcnBfbXV4aWQ7CisKKyAgICBpZiAoaW9jdGwgKGlwX2ZkLCBTSU9DU0xJRk1VWElELCAmaWZyKSA8IDApCisgICAgeworICAgICAgaW9jdGwgKGlwX2ZkLCBJX1BVTkxJTksgLCBhcnBfbXV4aWQpOworICAgICAgaW9jdGwgKGlwX2ZkLCBJX1BVTkxJTkssIGlwX211eGlkKTsKKyAgICAgIHN5c2xvZyAoTE9HX0VSUiwgIkNhbid0IHNldCBtdWx0aXBsZXhvciBpZCIpOworICAgIH0KKworICAgIHNucHJpbnRmKGRldiwgZGV2X3NpemUsICJ0YXAlZCIsIHBwYSk7CisgICAgcmV0dXJuIHRhcF9mZDsKK30KKworc3RhdGljIGludCB0YXBfb3BlbihjaGFyICppZm5hbWUsIGludCBpZm5hbWVfc2l6ZSkKK3sKKyAgICBjaGFyICBkZXZbMTBdPSIiOworICAgIGludCBmZDsKKyAgICBpZiggKGZkID0gdGFwX2FsbG9jKGRldiwgc2l6ZW9mKGRldikpKSA8IDAgKXsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBhbGxvY2F0ZSBUQVAgZGV2aWNlXG4iKTsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgZGV2KTsKKyAgICBmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgcmV0dXJuIGZkOworfQorI2VsaWYgZGVmaW5lZCAoX0FJWCkKK3N0YXRpYyBpbnQgdGFwX29wZW4oY2hhciAqaWZuYW1lLCBpbnQgaWZuYW1lX3NpemUpCit7CisgICAgZnByaW50ZiAoc3RkZXJyLCAibm8gdGFwIG9uIEFJWFxuIik7CisgICAgcmV0dXJuIC0xOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdGFwX29wZW4oY2hhciAqaWZuYW1lLCBpbnQgaWZuYW1lX3NpemUpCit7CisgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICBpbnQgZmQsIHJldDsKKworICAgIFRGUihmZCA9IG9wZW4oIi9kZXYvbmV0L3R1biIsIE9fUkRXUikpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiBjb3VsZCBub3Qgb3BlbiAvZGV2L25ldC90dW46IG5vIHZpcnR1YWwgbmV0d29yayBlbXVsYXRpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisgICAgaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CisgICAgaWYgKGlmbmFtZVswXSAhPSAnXDAnKQorICAgICAgICBwc3RyY3B5KGlmci5pZnJfbmFtZSwgSUZOQU1TSVosIGlmbmFtZSk7CisgICAgZWxzZQorICAgICAgICBwc3RyY3B5KGlmci5pZnJfbmFtZSwgSUZOQU1TSVosICJ0YXAlZCIpOworICAgIHJldCA9IGlvY3RsKGZkLCBUVU5TRVRJRkYsICh2b2lkICopICZpZnIpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IGNvdWxkIG5vdCBjb25maWd1cmUgL2Rldi9uZXQvdHVuOiBubyB2aXJ0dWFsIG5ldHdvcmsgZW11bGF0aW9uXG4iKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBzdHJjcHkoaWZuYW1lLCBpZm5hbWVfc2l6ZSwgaWZyLmlmcl9uYW1lKTsKKyAgICBmY250bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisgICAgcmV0dXJuIGZkOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbGF1bmNoX3NjcmlwdChjb25zdCBjaGFyICpzZXR1cF9zY3JpcHQsIGNvbnN0IGNoYXIgKmlmbmFtZSwgaW50IGZkKQoreworICAgIHNpZ3NldF90IG9sZG1hc2ssIG1hc2s7CisgICAgaW50IHBpZCwgc3RhdHVzOworICAgIGNoYXIgKmFyZ3NbM107CisgICAgY2hhciAqKnBhcmc7CisKKyAgICBzaWdlbXB0eXNldCgmbWFzayk7CisgICAgc2lnYWRkc2V0KCZtYXNrLCBTSUdDSExEKTsKKyAgICBzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZtYXNrLCAmb2xkbWFzayk7CisKKyAgICAvKiB0cnkgdG8gbGF1bmNoIG5ldHdvcmsgc2NyaXB0ICovCisgICAgcGlkID0gZm9yaygpOworICAgIGlmIChwaWQgPT0gMCkgeworICAgICAgICBpbnQgb3Blbl9tYXggPSBzeXNjb25mKF9TQ19PUEVOX01BWCksIGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wZW5fbWF4OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpICE9IFNURElOX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gU1RET1VUX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gU1RERVJSX0ZJTEVOTyAmJgorICAgICAgICAgICAgICAgIGkgIT0gZmQpIHsKKyAgICAgICAgICAgICAgICBjbG9zZShpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYXJnID0gYXJnczsKKyAgICAgICAgKnBhcmcrKyA9IChjaGFyICopc2V0dXBfc2NyaXB0OworICAgICAgICAqcGFyZysrID0gKGNoYXIgKilpZm5hbWU7CisgICAgICAgICpwYXJnKysgPSBOVUxMOworICAgICAgICBleGVjdihzZXR1cF9zY3JpcHQsIGFyZ3MpOworICAgICAgICBleGl0KDEpOworICAgIH0gZWxzZSBpZiAocGlkID4gMCkgeworICAgICAgICB3aGlsZSAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApICE9IHBpZCkgeworICAgICAgICAgICAgLyogbG9vcCAqLworICAgICAgICB9CisgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkbWFzaywgTlVMTCk7CisKKyAgICAgICAgaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGxhdW5jaCBuZXR3b3JrIHNjcmlwdFxuIiwgc2V0dXBfc2NyaXB0KTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbmV0X3RhcF9pbml0KFZMQU5TdGF0ZSAqdmxhbiwgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICppZm5hbWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2V0dXBfc2NyaXB0LCBjb25zdCBjaGFyICpkb3duX3NjcmlwdCkKK3sKKyAgICBUQVBTdGF0ZSAqczsKKyAgICBpbnQgZmQ7CisgICAgY2hhciBpZm5hbWVbMTI4XTsKKworICAgIGlmIChpZm5hbWUxICE9IE5VTEwpCisgICAgICAgIHBzdHJjcHkoaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgaWZuYW1lMSk7CisgICAgZWxzZQorICAgICAgICBpZm5hbWVbMF0gPSAnXDAnOworICAgIFRGUihmZCA9IHRhcF9vcGVuKGlmbmFtZSwgc2l6ZW9mKGlmbmFtZSkpKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoIXNldHVwX3NjcmlwdCB8fCAhc3RyY21wKHNldHVwX3NjcmlwdCwgIm5vIikpCisgICAgICAgIHNldHVwX3NjcmlwdCA9ICIiOworICAgIGlmIChzZXR1cF9zY3JpcHRbMF0gIT0gJ1wwJykgeworCWlmIChsYXVuY2hfc2NyaXB0KHNldHVwX3NjcmlwdCwgaWZuYW1lLCBmZCkpCisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcyA9IG5ldF90YXBfZmRfaW5pdCh2bGFuLCBtb2RlbCwgbmFtZSwgZmQpOworICAgIHNucHJpbnRmKHMtPnZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMtPnZjLT5pbmZvX3N0ciksCisgICAgICAgICAgICAgImlmbmFtZT0lcyxzY3JpcHQ9JXMsZG93bnNjcmlwdD0lcyIsCisgICAgICAgICAgICAgaWZuYW1lLCBzZXR1cF9zY3JpcHQsIGRvd25fc2NyaXB0KTsKKyAgICBpZiAoZG93bl9zY3JpcHQgJiYgc3RyY21wKGRvd25fc2NyaXB0LCAibm8iKSkgeworICAgICAgICBzbnByaW50ZihzLT5kb3duX3NjcmlwdCwgc2l6ZW9mKHMtPmRvd25fc2NyaXB0KSwgIiVzIiwgZG93bl9zY3JpcHQpOworICAgICAgICBzbnByaW50ZihzLT5kb3duX3NjcmlwdF9hcmcsIHNpemVvZihzLT5kb3duX3NjcmlwdF9hcmcpLCAiJXMiLCBpZm5hbWUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICFfV0lOMzIgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1ZERSkKK3R5cGVkZWYgc3RydWN0IFZERVN0YXRlIHsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIFZERUNPTk4gKnZkZTsKK30gVkRFU3RhdGU7CisKK3N0YXRpYyB2b2lkIHZkZV90b19xZW11KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWREVTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSB2ZGVfcmVjdihzLT52ZGUsIChjaGFyICopYnVmLCBzaXplb2YoYnVmKSwgMCk7CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHFlbXVfc2VuZF9wYWNrZXQocy0+dmMsIGJ1Ziwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgc3NpemVfdCB2ZGVfcmVjZWl2ZShWTEFOQ2xpZW50U3RhdGUgKnZjLCBjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworICAgIFZERVN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKyAgICBzc2l6ZV90IHJldDsKKworICAgIGRvIHsKKyAgICAgIHJldCA9IHZkZV9zZW5kKHMtPnZkZSwgKGNvbnN0IGNoYXIgKilidWYsIHNpemUsIDApOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdmRlX2NsZWFudXAoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBWREVTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcih2ZGVfZGF0YWZkKHMtPnZkZSksIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHZkZV9jbG9zZShzLT52ZGUpOworICAgIGdfZnJlZShzKTsKK30KKworc3RhdGljIGludCBuZXRfdmRlX2luaXQoVkxBTlN0YXRlICp2bGFuLCBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwgY29uc3QgY2hhciAqZ3JvdXAsIGludCBtb2RlKQoreworICAgIFZERVN0YXRlICpzOworICAgIGNoYXIgKmluaXRfZ3JvdXAgPSBzdHJsZW4oZ3JvdXApID8gKGNoYXIgKilncm91cCA6IE5VTEw7CisgICAgY2hhciAqaW5pdF9zb2NrID0gc3RybGVuKHNvY2spID8gKGNoYXIgKilzb2NrIDogTlVMTDsKKworICAgIHN0cnVjdCB2ZGVfb3Blbl9hcmdzIGFyZ3MgPSB7CisgICAgICAgIC5wb3J0ID0gcG9ydCwKKyAgICAgICAgLmdyb3VwID0gaW5pdF9ncm91cCwKKyAgICAgICAgLm1vZGUgPSBtb2RlLAorICAgIH07CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihWREVTdGF0ZSkpOworICAgIHMtPnZkZSA9IHZkZV9vcGVuKGluaXRfc29jaywgKGNoYXIgKikiUUVNVSIsICZhcmdzKTsKKyAgICBpZiAoIXMtPnZkZSl7CisgICAgICAgIGZyZWUocyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgdmRlX3JlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB2ZGVfY2xlYW51cCwgcyk7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcih2ZGVfZGF0YWZkKHMtPnZkZSksIHZkZV90b19xZW11LCBOVUxMLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLCAic29jaz0lcyxmZD0lZCIsCisgICAgICAgICAgICAgc29jaywgdmRlX2RhdGFmZChzLT52ZGUpKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBuZXR3b3JrIGNvbm5lY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IE5ldFNvY2tldFN0YXRlIHsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjOworICAgIGludCBmZDsKKyAgICBpbnQgc3RhdGU7IC8qIDAgPSBnZXR0aW5nIGxlbmd0aCwgMSA9IGdldHRpbmcgZGF0YSAqLworICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgcGFja2V0X2xlbjsKKyAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGdyYW1fZHN0OyAvKiBjb250YWlucyBpbmV0IGhvc3QgYW5kIHBvcnQgZGVzdGluYXRpb24gaWZmIGNvbm5lY3Rpb25sZXNzIChTT0NLX0RHUkFNKSAqLworfSBOZXRTb2NrZXRTdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgTmV0U29ja2V0TGlzdGVuU3RhdGUgeworICAgIFZMQU5TdGF0ZSAqdmxhbjsKKyAgICBjaGFyICptb2RlbDsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBmZDsKK30gTmV0U29ja2V0TGlzdGVuU3RhdGU7CisKKy8qIFhYWDogd2UgY29uc2lkZXIgd2UgY2FuIHNlbmQgdGhlIHdob2xlIHBhY2tldCB3aXRob3V0IGJsb2NraW5nICovCitzdGF0aWMgc3NpemVfdCBuZXRfc29ja2V0X3JlY2VpdmUoVkxBTkNsaWVudFN0YXRlICp2YywgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgdWludDMyX3QgbGVuOworICAgIGxlbiA9IGh0b25sKHNpemUpOworCisgICAgc2VuZF9hbGwocy0+ZmQsIChjb25zdCB1aW50OF90ICopJmxlbiwgc2l6ZW9mKGxlbikpOworICAgIHJldHVybiBzZW5kX2FsbChzLT5mZCwgYnVmLCBzaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgbmV0X3NvY2tldF9yZWNlaXZlX2RncmFtKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworCisgICAgcmV0dXJuIHNlbmR0byhzLT5mZCwgKGNvbnN0IHZvaWQgKilidWYsIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJnMtPmRncmFtX2RzdCwgc2l6ZW9mKHMtPmRncmFtX2RzdCkpOworfQorCitzdGF0aWMgdm9pZCBuZXRfc29ja2V0X3NlbmQodm9pZCAqb3BhcXVlKQoreworICAgIE5ldFNvY2tldFN0YXRlICpzID0gb3BhcXVlOworICAgIGludCBzaXplLCBlcnI7CisgICAgdW5zaWduZWQgbDsKKyAgICB1aW50OF90IGJ1ZjFbNDA5Nl07CisgICAgY29uc3QgdWludDhfdCAqYnVmOworCisgICAgc2l6ZSA9IHJlY3Yocy0+ZmQsICh2b2lkICopYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAwKTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgZXJyID0gc29ja2V0X2Vycm9yKCk7CisgICAgICAgIGlmIChlcnIgIT0gRVdPVUxEQkxPQ0spCisgICAgICAgICAgICBnb3RvIGVvYzsKKyAgICB9IGVsc2UgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvKiBlbmQgb2YgY29ubmVjdGlvbiAqLworICAgIGVvYzoKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGNsb3Nlc29ja2V0KHMtPmZkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBidWYgPSBidWYxOworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICAvKiByZWFzc2VtYmxlIGEgcGFja2V0IGZyb20gdGhlIG5ldHdvcmsgKi8KKyAgICAgICAgc3dpdGNoKHMtPnN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGwgPSA0IC0gcy0+aW5kZXg7CisgICAgICAgICAgICBpZiAobCA+IHNpemUpCisgICAgICAgICAgICAgICAgbCA9IHNpemU7CisgICAgICAgICAgICBtZW1jcHkocy0+YnVmICsgcy0+aW5kZXgsIGJ1ZiwgbCk7CisgICAgICAgICAgICBidWYgKz0gbDsKKyAgICAgICAgICAgIHNpemUgLT0gbDsKKyAgICAgICAgICAgIHMtPmluZGV4ICs9IGw7CisgICAgICAgICAgICBpZiAocy0+aW5kZXggPT0gNCkgeworICAgICAgICAgICAgICAgIC8qIGdvdCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICBzLT5wYWNrZXRfbGVuID0gbnRvaGwoKih1aW50MzJfdCAqKXMtPmJ1Zik7CisgICAgICAgICAgICAgICAgcy0+aW5kZXggPSAwOworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBsID0gcy0+cGFja2V0X2xlbiAtIHMtPmluZGV4OworICAgICAgICAgICAgaWYgKGwgPiBzaXplKQorICAgICAgICAgICAgICAgIGwgPSBzaXplOworICAgICAgICAgICAgaWYgKHMtPmluZGV4ICsgbCA8PSBzaXplb2Yocy0+YnVmKSkgeworICAgICAgICAgICAgICAgIG1lbWNweShzLT5idWYgKyBzLT5pbmRleCwgYnVmLCBsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzZXJpb3VzIGVycm9yOiBvdmVyc2l6ZWQgcGFja2V0IHJlY2VpdmVkLCIKKyAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gdGVybWluYXRlZC5cbiIpOworICAgICAgICAgICAgICAgIHMtPnN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGVvYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+aW5kZXggKz0gbDsKKyAgICAgICAgICAgIGJ1ZiArPSBsOworICAgICAgICAgICAgc2l6ZSAtPSBsOworICAgICAgICAgICAgaWYgKHMtPmluZGV4ID49IHMtPnBhY2tldF9sZW4pIHsKKyAgICAgICAgICAgICAgICBxZW11X3NlbmRfcGFja2V0KHMtPnZjLCBzLT5idWYsIHMtPnBhY2tldF9sZW4pOworICAgICAgICAgICAgICAgIHMtPmluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5zdGF0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbmV0X3NvY2tldF9zZW5kX2RncmFtKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSByZWN2KHMtPmZkLCAodm9pZCAqKXMtPmJ1Ziwgc2l6ZW9mKHMtPmJ1ZiksIDApOworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogZW5kIG9mIGNvbm5lY3Rpb24gKi8KKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcWVtdV9zZW5kX3BhY2tldChzLT52Yywgcy0+YnVmLCBzaXplKTsKK30KKworc3RhdGljIGludCBuZXRfc29ja2V0X21jYXN0X2NyZWF0ZShzdHJ1Y3Qgc29ja2FkZHJfaW4gKm1jYXN0YWRkcikKK3sKKyAgICBzdHJ1Y3QgaXBfbXJlcSBpbXI7CisgICAgaW50IGZkOworICAgIGludCB2YWwsIHJldDsKKyAgICBpZiAoIUlOX01VTFRJQ0FTVChudG9obChtY2FzdGFkZHItPnNpbl9hZGRyLnNfYWRkcikpKSB7CisJZnByaW50ZihzdGRlcnIsICJxZW11OiBlcnJvcjogc3BlY2lmaWVkIG1jYXN0YWRkciBcIiVzXCIgKDB4JTA4eCkgZG9lcyBub3QgY29udGFpbiBhIG11bHRpY2FzdCBhZGRyZXNzXG4iLAorCQlpbmV0X250b2EobWNhc3RhZGRyLT5zaW5fYWRkciksCisgICAgICAgICAgICAgICAgKGludCludG9obChtY2FzdGFkZHItPnNpbl9hZGRyLnNfYWRkcikpOworCXJldHVybiAtMTsKKworICAgIH0KKyAgICBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigic29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0pIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2YWwgPSAxOworICAgIHJldD1xZW11X3NldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSZ2YWwsIHNpemVvZih2YWwpKTsKKyAgICBpZiAocmV0IDwgMCkgeworCXBlcnJvcigic2V0c29ja29wdChTT0xfU09DS0VULCBTT19SRVVTRUFERFIpIik7CisJZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKiltY2FzdGFkZHIsIHNpemVvZigqbWNhc3RhZGRyKSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBBZGQgaG9zdCB0byBtdWx0aWNhc3QgZ3JvdXAgKi8KKyAgICBpbXIuaW1yX211bHRpYWRkciA9IG1jYXN0YWRkci0+c2luX2FkZHI7CisgICAgaW1yLmltcl9pbnRlcmZhY2Uuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisKKyAgICByZXQgPSBxZW11X3NldHNvY2tvcHQoZmQsIElQUFJPVE9fSVAsIElQX0FERF9NRU1CRVJTSElQLAorICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikmaW1yLCBzaXplb2Yoc3RydWN0IGlwX21yZXEpKTsKKyAgICBpZiAocmV0IDwgMCkgeworCXBlcnJvcigic2V0c29ja29wdChJUF9BRERfTUVNQkVSU0hJUCkiKTsKKwlnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogRm9yY2UgbWNhc3QgbXNncyB0byBsb29wYmFjayAoZWcuIHNldmVyYWwgUUVNVXMgaW4gc2FtZSBob3N0ICovCisgICAgdmFsID0gMTsKKyAgICByZXQ9cWVtdV9zZXRzb2Nrb3B0KGZkLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfTE9PUCwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKSZ2YWwsIHNpemVvZih2YWwpKTsKKyAgICBpZiAocmV0IDwgMCkgeworCXBlcnJvcigic2V0c29ja29wdChTT0xfSVAsIElQX01VTFRJQ0FTVF9MT09QKSIpOworCWdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzb2NrZXRfc2V0X25vbmJsb2NrKGZkKTsKKyAgICByZXR1cm4gZmQ7CitmYWlsOgorICAgIGlmIChmZCA+PSAwKQorICAgICAgICBjbG9zZXNvY2tldChmZCk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBuZXRfc29ja2V0X2NsZWFudXAoVkxBTkNsaWVudFN0YXRlICp2YykKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgY2xvc2Uocy0+ZmQpOworICAgIGdfZnJlZShzKTsKK30KKworc3RhdGljIE5ldFNvY2tldFN0YXRlICpuZXRfc29ja2V0X2ZkX2luaXRfZGdyYW0oVkxBTlN0YXRlICp2bGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgaXNfY29ubmVjdGVkKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKyAgICBpbnQgbmV3ZmQ7CisgICAgc29ja2xlbl90IHNhZGRyX2xlbjsKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczsKKworICAgIC8qIGZkIHBhc3NlZDogbXVsdGljYXN0OiAibGVhcm4iIGRncmFtX2RzdCBhZGRyZXNzIGZyb20gYm91bmQgYWRkcmVzcyBhbmQgc2F2ZSBpdAorICAgICAqIEJlY2F1c2UgdGhpcyBtYXkgYmUgInNoYXJlZCIgc29ja2V0IGZyb20gYSAibWFzdGVyIiBwcm9jZXNzLCBkYXRhZ3JhbXMgd291bGQgYmUgcmVjdigpCisgICAgICogYnkgT05MWSBPTkUgcHJvY2Vzczogd2UgbXVzdCAiY2xvbmUiIHRoaXMgZGdyYW0gc29ja2V0IC0tampvCisgICAgICovCisKKyAgICBpZiAoaXNfY29ubmVjdGVkKSB7CisJaWYgKGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJnNhZGRyX2xlbikgPT0gMCkgeworCSAgICAvKiBtdXN0IGJlIGJvdW5kICovCisJICAgIGlmIChzYWRkci5zaW5fYWRkci5zX2FkZHI9PTApIHsKKwkJZnByaW50ZihzdGRlcnIsICJxZW11OiBlcnJvcjogaW5pdF9kZ3JhbTogZmQ9JWQgdW5ib3VuZCwgY2Fubm90IHNldHVwIG11bHRpY2FzdCBkc3QgYWRkclxuIiwKKwkJCWZkKTsKKwkJcmV0dXJuIE5VTEw7CisJICAgIH0KKwkgICAgLyogY2xvbmUgZGdyYW0gc29ja2V0ICovCisJICAgIG5ld2ZkID0gbmV0X3NvY2tldF9tY2FzdF9jcmVhdGUoJnNhZGRyKTsKKwkgICAgaWYgKG5ld2ZkIDwgMCkgeworCQkvKiBlcnJvciBhbHJlYWR5IHJlcG9ydGVkIGJ5IG5ldF9zb2NrZXRfbWNhc3RfY3JlYXRlKCkgKi8KKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gTlVMTDsKKwkgICAgfQorCSAgICAvKiBjbG9uZSBuZXdmZCB0byBmZCwgY2xvc2UgbmV3ZmQgKi8KKwkgICAgZHVwMihuZXdmZCwgZmQpOworCSAgICBjbG9zZShuZXdmZCk7CisKKwl9IGVsc2UgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IGVycm9yOiBpbml0X2RncmFtOiBmZD0lZCBmYWlsZWQgZ2V0c29ja25hbWUoKTogJXNcbiIsCisJCSAgICBmZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorICAgIH0KKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKE5ldFNvY2tldFN0YXRlKSk7CisgICAgcy0+ZmQgPSBmZDsKKworICAgIHMtPnZjID0gcWVtdV9uZXdfdmxhbl9jbGllbnQodmxhbiwgbW9kZWwsIG5hbWUsIE5VTEwsIG5ldF9zb2NrZXRfcmVjZWl2ZV9kZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG5ldF9zb2NrZXRfY2xlYW51cCwgcyk7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgbmV0X3NvY2tldF9zZW5kX2RncmFtLCBOVUxMLCBzKTsKKworICAgIC8qIG1jYXN0OiBzYXZlIGJvdW5kIGFkZHJlc3MgYXMgZHN0ICovCisgICAgaWYgKGlzX2Nvbm5lY3RlZCkgcy0+ZGdyYW1fZHN0PXNhZGRyOworCisgICAgc25wcmludGYocy0+dmMtPmluZm9fc3RyLCBzaXplb2Yocy0+dmMtPmluZm9fc3RyKSwKKwkgICAgInNvY2tldDogZmQ9JWQgKCVzIG1jYXN0PSVzOiVkKSIsCisJICAgIGZkLCBpc19jb25uZWN0ZWQ/ICJjbG9uZWQiIDogIiIsCisJICAgIGluZXRfbnRvYShzYWRkci5zaW5fYWRkciksIG50b2hzKHNhZGRyLnNpbl9wb3J0KSk7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zb2NrZXRfY29ubmVjdCh2b2lkICpvcGFxdWUpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnMgPSBvcGFxdWU7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgbmV0X3NvY2tldF9zZW5kLCBOVUxMLCBzKTsKK30KKworc3RhdGljIE5ldFNvY2tldFN0YXRlICpuZXRfc29ja2V0X2ZkX2luaXRfc3RyZWFtKFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczsKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihOZXRTb2NrZXRTdGF0ZSkpOworICAgIHMtPmZkID0gZmQ7CisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgbmV0X3NvY2tldF9yZWNlaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbmV0X3NvY2tldF9jbGVhbnVwLCBzKTsKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJzb2NrZXQ6IGZkPSVkIiwgZmQpOworICAgIGlmIChpc19jb25uZWN0ZWQpIHsKKyAgICAgICAgbmV0X3NvY2tldF9jb25uZWN0KHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIocy0+ZmQsIE5VTEwsIG5ldF9zb2NrZXRfY29ubmVjdCwgcyk7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0aWMgTmV0U29ja2V0U3RhdGUgKm5ldF9zb2NrZXRfZmRfaW5pdChWTEFOU3RhdGUgKnZsYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKyAgICBpbnQgc29fdHlwZT0tMSwgb3B0bGVuPXNpemVvZihzb190eXBlKTsKKworICAgIGlmKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1RZUEUsIChjaGFyICopJnNvX3R5cGUsCisgICAgICAgIChzb2NrbGVuX3QgKikmb3B0bGVuKTwgMCkgeworCWZwcmludGYoc3RkZXJyLCAicWVtdTogZXJyb3I6IGdldHNvY2tvcHQoU09fVFlQRSkgZm9yIGZkPSVkIGZhaWxlZFxuIiwgZmQpOworCXJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2goc29fdHlwZSkgeworICAgIGNhc2UgU09DS19ER1JBTToKKyAgICAgICAgcmV0dXJuIG5ldF9zb2NrZXRfZmRfaW5pdF9kZ3JhbSh2bGFuLCBtb2RlbCwgbmFtZSwgZmQsIGlzX2Nvbm5lY3RlZCk7CisgICAgY2FzZSBTT0NLX1NUUkVBTToKKyAgICAgICAgcmV0dXJuIG5ldF9zb2NrZXRfZmRfaW5pdF9zdHJlYW0odmxhbiwgbW9kZWwsIG5hbWUsIGZkLCBpc19jb25uZWN0ZWQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHdobyBrbm93cyAuLi4gdGhpcyBjb3VsZCBiZSBhIGVnLiBhIHB0eSwgZG8gd2FybiBhbmQgY29udGludWUgYXMgc3RyZWFtICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogd2FybmluZzogc29ja2V0IHR5cGU9JWQgZm9yIGZkPSVkIGlzIG5vdCBTT0NLX0RHUkFNIG9yIFNPQ0tfU1RSRUFNXG4iLCBzb190eXBlLCBmZCk7CisgICAgICAgIHJldHVybiBuZXRfc29ja2V0X2ZkX2luaXRfc3RyZWFtKHZsYW4sIG1vZGVsLCBuYW1lLCBmZCwgaXNfY29ubmVjdGVkKTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5ldF9zb2NrZXRfYWNjZXB0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBOZXRTb2NrZXRMaXN0ZW5TdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICBOZXRTb2NrZXRTdGF0ZSAqczE7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworICAgIHNvY2tsZW5fdCBsZW47CisgICAgaW50IGZkOworCisgICAgZm9yKDs7KSB7CisgICAgICAgIGxlbiA9IHNpemVvZihzYWRkcik7CisgICAgICAgIGZkID0gYWNjZXB0KHMtPmZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhZGRyLCAmbGVuKTsKKyAgICAgICAgaWYgKGZkIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGZkID49IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHMxID0gbmV0X3NvY2tldF9mZF9pbml0KHMtPnZsYW4sIHMtPm1vZGVsLCBzLT5uYW1lLCBmZCwgMSk7CisgICAgaWYgKCFzMSkgeworICAgICAgICBjbG9zZXNvY2tldChmZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoczEtPnZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMxLT52Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICAgICAic29ja2V0OiBjb25uZWN0aW9uIGZyb20gJXM6JWQiLAorICAgICAgICAgICAgICAgICBpbmV0X250b2Eoc2FkZHIuc2luX2FkZHIpLCBudG9ocyhzYWRkci5zaW5fcG9ydCkpOworICAgIH0KK30KKworc3RhdGljIGludCBuZXRfc29ja2V0X2xpc3Rlbl9pbml0KFZMQU5TdGF0ZSAqdmxhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3Rfc3RyKQoreworICAgIE5ldFNvY2tldExpc3RlblN0YXRlICpzOworICAgIGludCBmZCwgdmFsLCByZXQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyOworCisgICAgaWYgKHBhcnNlX2hvc3RfcG9ydCgmc2FkZHIsIGhvc3Rfc3RyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKE5ldFNvY2tldExpc3RlblN0YXRlKSk7CisKKyAgICBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoInNvY2tldCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworCisgICAgLyogYWxsb3cgZmFzdCByZXVzZSAqLworICAgIHZhbCA9IDE7CisgICAgcWVtdV9zZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjb25zdCBjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCisgICAgcmV0ID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcGVycm9yKCJiaW5kIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gbGlzdGVuKGZkLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBwZXJyb3IoImxpc3RlbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHMtPnZsYW4gPSB2bGFuOworICAgIHMtPm1vZGVsID0gc3RyZHVwKG1vZGVsKTsKKyAgICBzLT5uYW1lID0gbmFtZSA/IHN0cmR1cChuYW1lKSA6IE5VTEw7CisgICAgcy0+ZmQgPSBmZDsKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyKGZkLCBuZXRfc29ja2V0X2FjY2VwdCwgTlVMTCwgcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0X3NvY2tldF9jb25uZWN0X2luaXQoVkxBTlN0YXRlICp2bGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdF9zdHIpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnM7CisgICAgaW50IGZkLCBjb25uZWN0ZWQsIHJldCwgZXJyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKworICAgIGlmIChwYXJzZV9ob3N0X3BvcnQoJnNhZGRyLCBob3N0X3N0cikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBwZXJyb3IoInNvY2tldCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworCisgICAgY29ubmVjdGVkID0gMDsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcmV0ID0gY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBlcnIgPSBzb2NrZXRfZXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRUlOVFIgfHwgZXJyID09IEVXT1VMREJMT0NLKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBFSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIF9XSU4zMgorICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gV1NBRUFMUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICBjbG9zZXNvY2tldChmZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29ubmVjdGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHMgPSBuZXRfc29ja2V0X2ZkX2luaXQodmxhbiwgbW9kZWwsIG5hbWUsIGZkLCBjb25uZWN0ZWQpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNucHJpbnRmKHMtPnZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMtPnZjLT5pbmZvX3N0ciksCisgICAgICAgICAgICAgInNvY2tldDogY29ubmVjdCB0byAlczolZCIsCisgICAgICAgICAgICAgaW5ldF9udG9hKHNhZGRyLnNpbl9hZGRyKSwgbnRvaHMoc2FkZHIuc2luX3BvcnQpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZXRfc29ja2V0X21jYXN0X2luaXQoVkxBTlN0YXRlICp2bGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdF9zdHIpCit7CisgICAgTmV0U29ja2V0U3RhdGUgKnM7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkcjsKKworICAgIGlmIChwYXJzZV9ob3N0X3BvcnQoJnNhZGRyLCBob3N0X3N0cikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKworICAgIGZkID0gbmV0X3NvY2tldF9tY2FzdF9jcmVhdGUoJnNhZGRyKTsKKyAgICBpZiAoZmQgPCAwKQorCXJldHVybiAtMTsKKworICAgIHMgPSBuZXRfc29ja2V0X2ZkX2luaXQodmxhbiwgbW9kZWwsIG5hbWUsIGZkLCAwKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHMtPmRncmFtX2RzdCA9IHNhZGRyOworCisgICAgc25wcmludGYocy0+dmMtPmluZm9fc3RyLCBzaXplb2Yocy0+dmMtPmluZm9fc3RyKSwKKyAgICAgICAgICAgICAic29ja2V0OiBtY2FzdD0lczolZCIsCisgICAgICAgICAgICAgaW5ldF9udG9hKHNhZGRyLnNpbl9hZGRyKSwgbnRvaHMoc2FkZHIuc2luX3BvcnQpKTsKKyAgICByZXR1cm4gMDsKKworfQorCit0eXBlZGVmIHN0cnVjdCBEdW1wU3RhdGUgeworICAgIFZMQU5DbGllbnRTdGF0ZSAqcGNhcF92YzsKKyAgICBpbnQgZmQ7CisgICAgaW50IHBjYXBfY2FwbGVuOworfSBEdW1wU3RhdGU7CisKKyNkZWZpbmUgUENBUF9NQUdJQyAweGExYjJjM2Q0CisKK3N0cnVjdCBwY2FwX2ZpbGVfaGRyIHsKKyAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB1aW50MTZfdCB2ZXJzaW9uX21ham9yOworICAgIHVpbnQxNl90IHZlcnNpb25fbWlub3I7CisgICAgaW50MzJfdCB0aGlzem9uZTsKKyAgICB1aW50MzJfdCBzaWdmaWdzOworICAgIHVpbnQzMl90IHNuYXBsZW47CisgICAgdWludDMyX3QgbGlua3R5cGU7Cit9OworCitzdHJ1Y3QgcGNhcF9zZl9wa3RoZHIgeworICAgIHN0cnVjdCB7CisgICAgICAgIGludDMyX3QgdHZfc2VjOworICAgICAgICBpbnQzMl90IHR2X3VzZWM7CisgICAgfSB0czsKKyAgICB1aW50MzJfdCBjYXBsZW47CisgICAgdWludDMyX3QgbGVuOworfTsKKworc3RhdGljIHNzaXplX3QgZHVtcF9yZWNlaXZlKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgRHVtcFN0YXRlICpzID0gdmMtPm9wYXF1ZTsKKyAgICBzdHJ1Y3QgcGNhcF9zZl9wa3RoZHIgaGRyOworICAgIGludDY0X3QgdHM7CisgICAgaW50IGNhcGxlbjsKKworICAgIC8qIEVhcmx5IHJldHVybiBpbiBjYXNlIG9mIHByZXZpb3VzIGVycm9yLiAqLworICAgIGlmIChzLT5mZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgdHMgPSBtdWxkaXY2NChxZW11X2Nsb2NrX2dldF9ucyhRRU1VX0NMT0NLX1ZJUlRVQUwpLCAxMDAwMDAwLCBnZXRfdGlja3NfcGVyX3NlYygpKTsKKyAgICBjYXBsZW4gPSBzaXplID4gcy0+cGNhcF9jYXBsZW4gPyBzLT5wY2FwX2NhcGxlbiA6IHNpemU7CisKKyAgICBoZHIudHMudHZfc2VjID0gdHMgLyAxMDAwMDAwOworICAgIGhkci50cy50dl91c2VjID0gdHMgJSAxMDAwMDAwOworICAgIGhkci5jYXBsZW4gPSBjYXBsZW47CisgICAgaGRyLmxlbiA9IHNpemU7CisgICAgaWYgKHdyaXRlKHMtPmZkLCAmaGRyLCBzaXplb2YoaGRyKSkgIT0gc2l6ZW9mKGhkcikgfHwKKyAgICAgICAgd3JpdGUocy0+ZmQsIGJ1ZiwgY2FwbGVuKSAhPSBjYXBsZW4pIHsKKyAgICAgICAgcWVtdV9sb2coIi1uZXQgZHVtcCB3cml0ZSBlcnJvciAtIHN0b3AgZHVtcFxuIik7CisgICAgICAgIGNsb3NlKHMtPmZkKTsKKyAgICAgICAgcy0+ZmQgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfY2xlYW51cChWTEFOQ2xpZW50U3RhdGUgKnZjKQoreworICAgIER1bXBTdGF0ZSAqcyA9IHZjLT5vcGFxdWU7CisKKyAgICBjbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworfQorCitzdGF0aWMgaW50IG5ldF9kdW1wX2luaXQoTW9uaXRvciAqbW9uLCBWTEFOU3RhdGUgKnZsYW4sIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxlbikKK3sKKyAgICBzdHJ1Y3QgcGNhcF9maWxlX2hkciBoZHI7CisgICAgRHVtcFN0YXRlICpzOworCisgICAgcyA9IGdfbWFsbG9jKHNpemVvZihEdW1wU3RhdGUpKTsKKworICAgIHMtPmZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZLCAwNjQ0KTsKKyAgICBpZiAocy0+ZmQgPCAwKSB7CisgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICItbmV0IGR1bXA6IGNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHMtPnBjYXBfY2FwbGVuID0gbGVuOworCisgICAgaGRyLm1hZ2ljID0gUENBUF9NQUdJQzsKKyAgICBoZHIudmVyc2lvbl9tYWpvciA9IDI7CisgICAgaGRyLnZlcnNpb25fbWlub3IgPSA0OworICAgIGhkci50aGlzem9uZSA9IDA7CisgICAgaGRyLnNpZ2ZpZ3MgPSAwOworICAgIGhkci5zbmFwbGVuID0gcy0+cGNhcF9jYXBsZW47CisgICAgaGRyLmxpbmt0eXBlID0gMTsKKworICAgIGlmICh3cml0ZShzLT5mZCwgJmhkciwgc2l6ZW9mKGhkcikpIDwgc2l6ZW9mKGhkcikpIHsKKyAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgIi1uZXQgZHVtcCB3cml0ZSBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKHMtPmZkKTsKKyAgICAgICAgZ19mcmVlKHMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy0+cGNhcF92YyA9IHFlbXVfbmV3X3ZsYW5fY2xpZW50KHZsYW4sIGRldmljZSwgbmFtZSwgTlVMTCwgZHVtcF9yZWNlaXZlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRfZHVtcF9jbGVhbnVwLCBzKTsKKyAgICBzbnByaW50ZihzLT5wY2FwX3ZjLT5pbmZvX3N0ciwgc2l6ZW9mKHMtPnBjYXBfdmMtPmluZm9fc3RyKSwKKyAgICAgICAgICAgICAiZHVtcCB0byAlcyAobGVuPSVkKSIsIGZpbGVuYW1lLCBsZW4pOworICAgIHJldHVybiAwOworfQorCisvKiBmaW5kIG9yIGFsbG9jIGEgbmV3IFZMQU4gKi8KK1ZMQU5TdGF0ZSAqcWVtdV9maW5kX3ZsYW4oaW50IGlkKQoreworICAgIFZMQU5TdGF0ZSAqKnB2bGFuLCAqdmxhbjsKKyAgICBmb3IodmxhbiA9IGZpcnN0X3ZsYW47IHZsYW4gIT0gTlVMTDsgdmxhbiA9IHZsYW4tPm5leHQpIHsKKyAgICAgICAgaWYgKHZsYW4tPmlkID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIHZsYW47CisgICAgfQorICAgIHZsYW4gPSBnX21hbGxvYzAoc2l6ZW9mKFZMQU5TdGF0ZSkpOworICAgIHZsYW4tPmlkID0gaWQ7CisgICAgdmxhbi0+bmV4dCA9IE5VTEw7CisgICAgcHZsYW4gPSAmZmlyc3RfdmxhbjsKKyAgICB3aGlsZSAoKnB2bGFuICE9IE5VTEwpCisgICAgICAgIHB2bGFuID0gJigqcHZsYW4pLT5uZXh0OworICAgICpwdmxhbiA9IHZsYW47CisgICAgcmV0dXJuIHZsYW47Cit9CisKK3N0YXRpYyBpbnQgbmljX2dldF9mcmVlX2lkeCh2b2lkKQoreworICAgIGludCBpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9OSUNTOyBpbmRleCsrKQorICAgICAgICBpZiAoIW5kX3RhYmxlW2luZGV4XS51c2VkKQorICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgIHJldHVybiAtMTsKK30KKwordm9pZCBxZW11X2NoZWNrX25pY19tb2RlbChOSUNJbmZvICpuZCwgY29uc3QgY2hhciAqbW9kZWwpCit7CisgICAgY29uc3QgY2hhciAqbW9kZWxzWzJdOworCisgICAgbW9kZWxzWzBdID0gbW9kZWw7CisgICAgbW9kZWxzWzFdID0gTlVMTDsKKworICAgIHFlbXVfY2hlY2tfbmljX21vZGVsX2xpc3QobmQsIG1vZGVscywgbW9kZWwpOworfQorCit2b2lkIHFlbXVfY2hlY2tfbmljX21vZGVsX2xpc3QoTklDSW5mbyAqbmQsIGNvbnN0IGNoYXIgKiBjb25zdCAqbW9kZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfbW9kZWwpCit7CisgICAgaW50IGksIGV4aXRfc3RhdHVzID0gMDsKKworICAgIGlmICghbmQtPm1vZGVsKQorICAgICAgICBuZC0+bW9kZWwgPSBzdHJkdXAoZGVmYXVsdF9tb2RlbCk7CisKKyAgICBpZiAoc3RyY21wKG5kLT5tb2RlbCwgIj8iKSAhPSAwKSB7CisgICAgICAgIGZvciAoaSA9IDAgOyBtb2RlbHNbaV07IGkrKykKKyAgICAgICAgICAgIGlmIChzdHJjbXAobmQtPm1vZGVsLCBtb2RlbHNbaV0pID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogVW5zdXBwb3J0ZWQgTklDIG1vZGVsOiAlc1xuIiwgbmQtPm1vZGVsKTsKKyAgICAgICAgZXhpdF9zdGF0dXMgPSAxOworICAgIH0KKworICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogU3VwcG9ydGVkIE5JQyBtb2RlbHM6ICIpOworICAgIGZvciAoaSA9IDAgOyBtb2RlbHNbaV07IGkrKykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyVjIiwgbW9kZWxzW2ldLCBtb2RlbHNbaSsxXSA/ICcsJyA6ICdcbicpOworCisgICAgZXhpdChleGl0X3N0YXR1cyk7Cit9CisKK2ludCBuZXRfY2xpZW50X2luaXQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKnApCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmZF9wYXJhbXNbXSA9IHsKKyAgICAgICAgInZsYW4iLCAibmFtZSIsICJmZCIsIE5VTEwKKyAgICB9OworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIGludCB2bGFuX2lkLCByZXQ7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIGNoYXIgKm5hbWUgPSBOVUxMOworCisgICAgdmxhbl9pZCA9IDA7CisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAidmxhbiIsIHApKSB7CisgICAgICAgIHZsYW5faWQgPSBzdHJ0b2woYnVmLCBOVUxMLCAwKTsKKyAgICB9CisgICAgdmxhbiA9IHFlbXVfZmluZF92bGFuKHZsYW5faWQpOworCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAibmFtZSIsIHApKSB7CisgICAgICAgIG5hbWUgPSBnX3N0cmR1cChidWYpOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJuaWMiKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5pY19wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAibWFjYWRkciIsICJtb2RlbCIsIE5VTEwKKyAgICAgICAgfTsKKyAgICAgICAgTklDSW5mbyAqbmQ7CisgICAgICAgIHVpbnQ4X3QgKm1hY2FkZHI7CisgICAgICAgIGludCBpZHggPSBuaWNfZ2V0X2ZyZWVfaWR4KCk7CisKKyAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhidWYsIHNpemVvZihidWYpLCBuaWNfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGJ1ZiwgcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGlmIChpZHggPT0gLTEgfHwgbmJfbmljcyA+PSBNQVhfTklDUykgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgIlRvbyBNYW55IE5JQ3NcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBuZCA9ICZuZF90YWJsZVtpZHhdOworICAgICAgICBtYWNhZGRyID0gbmQtPm1hY2FkZHI7CisgICAgICAgIG1hY2FkZHJbMF0gPSAweDUyOworICAgICAgICBtYWNhZGRyWzFdID0gMHg1NDsKKyAgICAgICAgbWFjYWRkclsyXSA9IDB4MDA7CisgICAgICAgIG1hY2FkZHJbM10gPSAweDEyOworICAgICAgICBtYWNhZGRyWzRdID0gMHgzNDsKKyAgICAgICAgbWFjYWRkcls1XSA9IDB4NTYgKyBpZHg7CisKKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAibWFjYWRkciIsIHApKSB7CisgICAgICAgICAgICBpZiAocGFyc2VfbWFjYWRkcihtYWNhZGRyLCBidWYpIDwgMCkgeworICAgICAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHN5bnRheCBmb3IgZXRoZXJuZXQgYWRkcmVzc1xuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAibW9kZWwiLCBwKSkgeworICAgICAgICAgICAgbmQtPm1vZGVsID0gc3RyZHVwKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgbmQtPnZsYW4gPSB2bGFuOworICAgICAgICBuZC0+bmFtZSA9IG5hbWU7CisgICAgICAgIG5kLT51c2VkID0gMTsKKyAgICAgICAgbmFtZSA9IE5VTEw7CisgICAgICAgIG5iX25pY3MrKzsKKyAgICAgICAgdmxhbi0+bmJfZ3Vlc3RfZGV2cysrOworICAgICAgICByZXQgPSBpZHg7CisgICAgfSBlbHNlCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAibm9uZSIpKSB7CisgICAgICAgIGlmICgqcCAhPSAnXDAnKSB7CisgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiJ25vbmUnIHRha2VzIG5vIHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICAvKiBkb2VzIG5vdGhpbmcuIEl0IGlzIG5lZWRlZCB0byBzaWduYWwgdGhhdCBubyBuZXR3b3JrIGNhcmRzCisgICAgICAgICAgIGFyZSB3YW50ZWQgKi8KKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UKKyNpZmRlZiBDT05GSUdfU0xJUlAKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJ1c2VyIikpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbGlycF9wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAiaG9zdG5hbWUiLCAicmVzdHJpY3QiLCAiaXAiLCBOVUxMCisgICAgICAgIH07CisgICAgICAgIGludCByZXN0cmljdGVkID0gMDsKKyAgICAgICAgY2hhciAqaXAgPSBOVUxMOworCisgICAgICAgIGlmIChjaGVja19wYXJhbXMoYnVmLCBzaXplb2YoYnVmKSwgc2xpcnBfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGJ1ZiwgcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImhvc3RuYW1lIiwgcCkpIHsKKyAgICAgICAgICAgIHBzdHJjcHkoc2xpcnBfaG9zdG5hbWUsIHNpemVvZihzbGlycF9ob3N0bmFtZSksIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAicmVzdHJpY3QiLCBwKSkgeworICAgICAgICAgICAgcmVzdHJpY3RlZCA9IChidWZbMF0gPT0gJ3knKSA/IDEgOiAwOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImlwIiwgcCkpIHsKKyAgICAgICAgICAgIGlwID0gZ19zdHJkdXAoYnVmKTsKKyAgICAgICAgfQorICAgICAgICB2bGFuLT5uYl9ob3N0X2RldnMrKzsKKyAgICAgICAgcmV0ID0gbmV0X3NsaXJwX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCByZXN0cmljdGVkLCBpcCk7CisgICAgICAgIGdfZnJlZShpcCk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGRldmljZSwgImNoYW5uZWwiKSkgeworICAgICAgICBsb25nIHBvcnQ7CisgICAgICAgIGNoYXIgbmFtZVsyMF0sICpkZXZuYW1lOworICAgICAgICBzdHJ1Y3QgVk1DaGFubmVsICp2bWM7CisKKyAgICAgICAgcG9ydCA9IHN0cnRvbChwLCAmZGV2bmFtZSwgMTApOworICAgICAgICBkZXZuYW1lKys7CisgICAgICAgIGlmIChwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUpIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJ2bWNoYW5uZWwgd3JvbmcgcG9ydCBudW1iZXJcbiIpOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICB2bWMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBWTUNoYW5uZWwpKTsKKyAgICAgICAgc25wcmludGYobmFtZSwgMjAsICJ2bWNoYW5uZWwlbGQiLCBwb3J0KTsKKyAgICAgICAgdm1jLT5oZCA9IHFlbXVfY2hyX29wZW4obmFtZSwgZGV2bmFtZSwgTlVMTCk7CisgICAgICAgIGlmICghdm1jLT5oZCkgeworICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImNvdWxkIG5vdCBvcGVuIHZtY2hhbm5lbCBkZXZpY2UgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXZuYW1lKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgdm1jLT5wb3J0ID0gcG9ydDsKKyAgICAgICAgc2xpcnBfYWRkX2V4ZWMoMywgdm1jLT5oZCwgNCwgcG9ydCk7CisgICAgICAgIHFlbXVfY2hyX2FkZF9oYW5kbGVycyh2bWMtPmhkLCB2bWNoYW5uZWxfY2FuX3JlYWQsIHZtY2hhbm5lbF9yZWFkLAorICAgICAgICAgICAgICAgIE5VTEwsIHZtYyk7CisgICAgICAgIHJldCA9IDA7CisgICAgfSBlbHNlCisjZW5kaWYKKyNpZmRlZiBfV0lOMzIKKyAgICBpZiAoIXN0cmNtcChkZXZpY2UsICJ0YXAiKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhcF9wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAiaWZuYW1lIiwgTlVMTAorICAgICAgICB9OworICAgICAgICBjaGFyIGlmbmFtZVs2NF07CisKKyAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhidWYsIHNpemVvZihidWYpLCB0YXBfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGJ1ZiwgcCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgImlmbmFtZSIsIHApIDw9IDApIHsKKyAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJ0YXA6IG5vIGludGVyZmFjZSBuYW1lXG4iKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgdmxhbi0+bmJfaG9zdF9kZXZzKys7CisgICAgICAgIHJldCA9IHRhcF93aW4zMl9pbml0KHZsYW4sIGRldmljZSwgbmFtZSwgaWZuYW1lKTsKKyAgICB9IGVsc2UKKyNlbGlmIGRlZmluZWQgKF9BSVgpCisjZWxzZQorICAgIGlmICghc3RyY21wKGRldmljZSwgInRhcCIpKSB7CisgICAgICAgIGNoYXIgaWZuYW1lWzY0XSwgY2hrYnVmWzY0XTsKKyAgICAgICAgY2hhciBzZXR1cF9zY3JpcHRbMTAyNF0sIGRvd25fc2NyaXB0WzEwMjRdOworICAgICAgICBpbnQgZmQ7CisgICAgICAgIHZsYW4tPm5iX2hvc3RfZGV2cysrOworICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmZCIsIHApID4gMCkgeworICAgICAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhjaGtidWYsIHNpemVvZihjaGtidWYpLCBmZF9wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGNoa2J1ZiwgcCk7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZCA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgICAgICAgICAgZmNudGwoZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgICAgICAgICAgbmV0X3RhcF9mZF9pbml0KHZsYW4sIGRldmljZSwgbmFtZSwgZmQpOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGFwX3BhcmFtc1tdID0geworICAgICAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAiaWZuYW1lIiwgInNjcmlwdCIsICJkb3duc2NyaXB0IiwgTlVMTAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmIChjaGVja19wYXJhbXMoY2hrYnVmLCBzaXplb2YoY2hrYnVmKSwgdGFwX3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgY2hrYnVmLCBwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgImlmbmFtZSIsIHApIDw9IDApIHsKKyAgICAgICAgICAgICAgICBpZm5hbWVbMF0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZShzZXR1cF9zY3JpcHQsIHNpemVvZihzZXR1cF9zY3JpcHQpLCAic2NyaXB0IiwgcCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBzdHJjcHkoc2V0dXBfc2NyaXB0LCBzaXplb2Yoc2V0dXBfc2NyaXB0KSwgREVGQVVMVF9ORVRXT1JLX1NDUklQVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGRvd25fc2NyaXB0LCBzaXplb2YoZG93bl9zY3JpcHQpLCAiZG93bnNjcmlwdCIsIHApID09IDApIHsKKyAgICAgICAgICAgICAgICBwc3RyY3B5KGRvd25fc2NyaXB0LCBzaXplb2YoZG93bl9zY3JpcHQpLCBERUZBVUxUX05FVFdPUktfRE9XTl9TQ1JJUFQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gbmV0X3RhcF9pbml0KHZsYW4sIGRldmljZSwgbmFtZSwgaWZuYW1lLCBzZXR1cF9zY3JpcHQsIGRvd25fc2NyaXB0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAic29ja2V0IikpIHsKKyAgICAgICAgY2hhciBjaGtidWZbNjRdOworICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmZCIsIHApID4gMCkgeworICAgICAgICAgICAgaW50IGZkOworICAgICAgICAgICAgaWYgKGNoZWNrX3BhcmFtcyhjaGtidWYsIHNpemVvZihjaGtidWYpLCBmZF9wYXJhbXMsIHApIDwgMCkgeworICAgICAgICAgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJpbnZhbGlkIHBhcmFtZXRlciAnJXMnIGluICclcydcbiIsIGNoa2J1ZiwgcCk7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZCA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBpZiAobmV0X3NvY2tldF9mZF9pbml0KHZsYW4sIGRldmljZSwgbmFtZSwgZmQsIDEpKQorICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsaXN0ZW4iLCBwKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGlzdGVuX3BhcmFtc1tdID0geworICAgICAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAibGlzdGVuIiwgTlVMTAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmIChjaGVja19wYXJhbXMoY2hrYnVmLCBzaXplb2YoY2hrYnVmKSwgbGlzdGVuX3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgY2hrYnVmLCBwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IG5ldF9zb2NrZXRfbGlzdGVuX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBidWYpOworICAgICAgICB9IGVsc2UgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiY29ubmVjdCIsIHApID4gMCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb25uZWN0X3BhcmFtc1tdID0geworICAgICAgICAgICAgICAgICJ2bGFuIiwgIm5hbWUiLCAiY29ubmVjdCIsIE5VTEwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGNoa2J1Ziwgc2l6ZW9mKGNoa2J1ZiksIGNvbm5lY3RfcGFyYW1zLCBwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLCBjaGtidWYsIHApOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gbmV0X3NvY2tldF9jb25uZWN0X2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCBidWYpOworICAgICAgICB9IGVsc2UgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAibWNhc3QiLCBwKSA+IDApIHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWNhc3RfcGFyYW1zW10gPSB7CisgICAgICAgICAgICAgICAgInZsYW4iLCAibmFtZSIsICJtY2FzdCIsIE5VTEwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZiAoY2hlY2tfcGFyYW1zKGNoa2J1Ziwgc2l6ZW9mKGNoa2J1ZiksIG1jYXN0X3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Vycm9yKG1vbiwgImludmFsaWQgcGFyYW1ldGVyICclcycgaW4gJyVzJ1xuIiwgY2hrYnVmLCBwKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IG5ldF9zb2NrZXRfbWNhc3RfaW5pdCh2bGFuLCBkZXZpY2UsIG5hbWUsIGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiVW5rbm93biBzb2NrZXQgb3B0aW9uczogJXNcbiIsIHApOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICB2bGFuLT5uYl9ob3N0X2RldnMrKzsKKyAgICB9IGVsc2UKKyNpZmRlZiBDT05GSUdfVkRFCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAidmRlIikpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2ZGVfcGFyYW1zW10gPSB7CisgICAgICAgICAgICAidmxhbiIsICJuYW1lIiwgInNvY2siLCAicG9ydCIsICJncm91cCIsICJtb2RlIiwgTlVMTAorICAgICAgICB9OworICAgICAgICBjaGFyIHZkZV9zb2NrWzEwMjRdLCB2ZGVfZ3JvdXBbNTEyXTsKKwlpbnQgdmRlX3BvcnQsIHZkZV9tb2RlOworCisgICAgICAgIGlmIChjaGVja19wYXJhbXMoYnVmLCBzaXplb2YoYnVmKSwgdmRlX3BhcmFtcywgcCkgPCAwKSB7CisgICAgICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiaW52YWxpZCBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLCBidWYsIHApOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICB2bGFuLT5uYl9ob3N0X2RldnMrKzsKKyAgICAgICAgaWYgKGdldF9wYXJhbV92YWx1ZSh2ZGVfc29jaywgc2l6ZW9mKHZkZV9zb2NrKSwgInNvY2siLCBwKSA8PSAwKSB7CisJICAgIHZkZV9zb2NrWzBdID0gJ1wwJzsKKwl9CisJaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAicG9ydCIsIHApID4gMCkgeworCSAgICB2ZGVfcG9ydCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKwl9IGVsc2UgeworCSAgICB2ZGVfcG9ydCA9IDA7CisJfQorCWlmIChnZXRfcGFyYW1fdmFsdWUodmRlX2dyb3VwLCBzaXplb2YodmRlX2dyb3VwKSwgImdyb3VwIiwgcCkgPD0gMCkgeworCSAgICB2ZGVfZ3JvdXBbMF0gPSAnXDAnOworCX0KKwlpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtb2RlIiwgcCkgPiAwKSB7CisJICAgIHZkZV9tb2RlID0gc3RydG9sKGJ1ZiwgTlVMTCwgOCk7CisJfSBlbHNlIHsKKwkgICAgdmRlX21vZGUgPSAwNzAwOworCX0KKwlyZXQgPSBuZXRfdmRlX2luaXQodmxhbiwgZGV2aWNlLCBuYW1lLCB2ZGVfc29jaywgdmRlX3BvcnQsIHZkZV9ncm91cCwgdmRlX21vZGUpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKCFzdHJjbXAoZGV2aWNlLCAiZHVtcCIpKSB7CisgICAgICAgIGludCBsZW4gPSA2NTUzNjsKKworICAgICAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsZW4iLCBwKSA+IDApIHsKKyAgICAgICAgICAgIGxlbiA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgICAgICB9CisgICAgICAgIGlmICghZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmaWxlIiwgcCkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJxZW11LXZsYW4lZC5wY2FwIiwgdmxhbl9pZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gbmV0X2R1bXBfaW5pdChtb24sIHZsYW4sIGRldmljZSwgbmFtZSwgYnVmLCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbmZpZ19lcnJvcihtb24sICJVbmtub3duIG5ldHdvcmsgZGV2aWNlOiAlc1xuIiwgZGV2aWNlKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBjb25maWdfZXJyb3IobW9uLCAiQ291bGQgbm90IGluaXRpYWxpemUgZGV2aWNlICclcydcbiIsIGRldmljZSk7CisgICAgfQorb3V0OgorICAgIGdfZnJlZShuYW1lKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIG5ldF9jbGllbnRfdW5pbml0KE5JQ0luZm8gKm5kKQoreworICAgIG5kLT52bGFuLT5uYl9ndWVzdF9kZXZzLS07CisgICAgbmJfbmljcy0tOworICAgIG5kLT51c2VkID0gMDsKKyAgICBmcmVlKCh2b2lkICopbmQtPm1vZGVsKTsKK30KKworc3RhdGljIGludCBuZXRfaG9zdF9jaGVja19kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnZhbGlkX3BhcmFtX2xpc3RbXSA9IHsgInRhcCIsICJzb2NrZXQiLCAiZHVtcCIKKyNpZmRlZiBDT05GSUdfU0xJUlAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwidXNlciIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwidmRlIgorI2VuZGlmCisgICAgfTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHZhbGlkX3BhcmFtX2xpc3QpIC8gc2l6ZW9mKGNoYXIgKik7IGkrKykgeworICAgICAgICBpZiAoIXN0cm5jbXAodmFsaWRfcGFyYW1fbGlzdFtpXSwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHZhbGlkX3BhcmFtX2xpc3RbaV0pKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIG5ldF9ob3N0X2RldmljZV9hZGQoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdHMpCit7CisgICAgaWYgKCFuZXRfaG9zdF9jaGVja19kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJpbnZhbGlkIGhvc3QgbmV0d29yayBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG5ldF9jbGllbnRfaW5pdChtb24sIGRldmljZSwgb3B0cyA/IG9wdHMgOiAiIikgPCAwKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgImFkZGluZyBob3N0IG5ldHdvcmsgZGV2aWNlICVzIGZhaWxlZFxuIiwgZGV2aWNlKTsKKyAgICB9Cit9CisKK3ZvaWQgbmV0X2hvc3RfZGV2aWNlX3JlbW92ZShNb25pdG9yICptb24sIGludCB2bGFuX2lkLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisKKyAgICB2bGFuID0gcWVtdV9maW5kX3ZsYW4odmxhbl9pZCk7CisKKyAgICBmb3IgKHZjID0gdmxhbi0+Zmlyc3RfY2xpZW50OyB2YyAhPSBOVUxMOyB2YyA9IHZjLT5uZXh0KSB7CisgICAgICAgIGlmICghc3RyY21wKHZjLT5uYW1lLCBkZXZpY2UpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdmMpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiY2FuJ3QgZmluZCBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFuZXRfaG9zdF9jaGVja19kZXZpY2UodmMtPm1vZGVsKSkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJpbnZhbGlkIGhvc3QgbmV0d29yayBkZXZpY2UgJXNcbiIsIGRldmljZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcWVtdV9kZWxfdmxhbl9jbGllbnQodmMpOworfQorCitpbnQgbmV0X2NsaWVudF9wYXJzZShjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpxOworICAgIGNoYXIgZGV2aWNlWzY0XTsKKworICAgIHAgPSBzdHI7CisgICAgcSA9IGRldmljZTsKKyAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSAnLCcpIHsKKyAgICAgICAgaWYgKChxIC0gZGV2aWNlKSA8IHNpemVvZihkZXZpY2UpIC0gMSkKKyAgICAgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICAqcSA9ICdcMCc7CisgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgcCsrOworCisgICAgcmV0dXJuIG5ldF9jbGllbnRfaW5pdChOVUxMLCBkZXZpY2UsIHApOworfQorCit2b2lkIGRvX2luZm9fbmV0d29yayhNb25pdG9yICptb24pCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworICAgIFZMQU5DbGllbnRTdGF0ZSAqdmM7CisKKyAgICBmb3IodmxhbiA9IGZpcnN0X3ZsYW47IHZsYW4gIT0gTlVMTDsgdmxhbiA9IHZsYW4tPm5leHQpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiVkxBTiAlZCBkZXZpY2VzOlxuIiwgdmxhbi0+aWQpOworICAgICAgICBmb3IodmMgPSB2bGFuLT5maXJzdF9jbGllbnQ7IHZjICE9IE5VTEw7IHZjID0gdmMtPm5leHQpCisgICAgICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICVzOiAlc1xuIiwgdmMtPm5hbWUsIHZjLT5pbmZvX3N0cik7CisgICAgfQorfQorCitpbnQgZG9fc2V0X2xpbmsoTW9uaXRvciAqbW9uLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1cF9vcl9kb3duKQoreworICAgIFZMQU5TdGF0ZSAqdmxhbjsKKyAgICBWTEFOQ2xpZW50U3RhdGUgKnZjID0gTlVMTDsKKworICAgIGZvciAodmxhbiA9IGZpcnN0X3ZsYW47IHZsYW4gIT0gTlVMTDsgdmxhbiA9IHZsYW4tPm5leHQpCisgICAgICAgIGZvciAodmMgPSB2bGFuLT5maXJzdF9jbGllbnQ7IHZjICE9IE5VTEw7IHZjID0gdmMtPm5leHQpCisgICAgICAgICAgICBpZiAoc3RyY21wKHZjLT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKK2RvbmU6CisKKyAgICBpZiAoIXZjKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgImNvdWxkIG5vdCBmaW5kIG5ldHdvcmsgZGV2aWNlICclcyciLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHN0cmNtcCh1cF9vcl9kb3duLCAidXAiKSA9PSAwKQorICAgICAgICB2Yy0+bGlua19kb3duID0gMDsKKyAgICBlbHNlIGlmIChzdHJjbXAodXBfb3JfZG93biwgImRvd24iKSA9PSAwKQorICAgICAgICB2Yy0+bGlua19kb3duID0gMTsKKyAgICBlbHNlCisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgImludmFsaWQgbGluayBzdGF0dXMgJyVzJzsgb25seSAndXAnIG9yICdkb3duJyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ2YWxpZFxuIiwgdXBfb3JfZG93bik7CisKKyAgICBpZiAodmMtPmxpbmtfc3RhdHVzX2NoYW5nZWQpCisgICAgICAgIHZjLT5saW5rX3N0YXR1c19jaGFuZ2VkKHZjKTsKKworICAgIHJldHVybiAxOworfQorCit2b2lkIG5ldF9jbGVhbnVwKHZvaWQpCit7CisgICAgVkxBTlN0YXRlICp2bGFuOworCisgICAgLyogY2xvc2UgbmV0d29yayBjbGllbnRzICovCisgICAgZm9yKHZsYW4gPSBmaXJzdF92bGFuOyB2bGFuICE9IE5VTEw7IHZsYW4gPSB2bGFuLT5uZXh0KSB7CisgICAgICAgIFZMQU5DbGllbnRTdGF0ZSAqdmMgPSB2bGFuLT5maXJzdF9jbGllbnQ7CisKKyAgICAgICAgd2hpbGUgKHZjKSB7CisgICAgICAgICAgICBWTEFOQ2xpZW50U3RhdGUgKm5leHQgPSB2Yy0+bmV4dDsKKworICAgICAgICAgICAgcWVtdV9kZWxfdmxhbl9jbGllbnQodmMpOworCisgICAgICAgICAgICB2YyA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgbmV0X2NsaWVudF9jaGVjayh2b2lkKQoreworICAgIFZMQU5TdGF0ZSAqdmxhbjsKKworICAgIGZvcih2bGFuID0gZmlyc3RfdmxhbjsgdmxhbiAhPSBOVUxMOyB2bGFuID0gdmxhbi0+bmV4dCkgeworICAgICAgICBpZiAodmxhbi0+bmJfZ3Vlc3RfZGV2cyA9PSAwICYmIHZsYW4tPm5iX2hvc3RfZGV2cyA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh2bGFuLT5uYl9ndWVzdF9kZXZzID09IDApCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHZsYW4gJWQgd2l0aCBubyBuaWNzXG4iLCB2bGFuLT5pZCk7CisgICAgICAgIGlmICh2bGFuLT5uYl9ob3N0X2RldnMgPT0gMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogdmxhbiAlZCBpcyBub3QgY29ubmVjdGVkIHRvIGhvc3QgbmV0d29ya1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdmxhbi0+aWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvb3MtcG9zaXguYyBiL2FuZHJvaWQvcWVtdTEvb3MtcG9zaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTk0NTczCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9vcy1wb3NpeC5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogb3MtcG9zaXguYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKy8qbmVlZGVkIGZvciBNQVBfUE9QVUxBVEUgYmVmb3JlIGluY2x1ZGluZyBxZW11LW9wdGlvbnMuaCAqLworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisKKy8qIE5lZWRlZCBlYXJseSBmb3IgQ09ORklHX0JTRCBldGMuICovCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorI2luY2x1ZGUgInFlbXUtb3B0aW9ucy5oIgorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19MSU5VWAorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19FVkVOVEZECisjaW5jbHVkZSA8c3lzL2V2ZW50ZmQuaD4KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBhc3N3ZCAqdXNlcl9wd2Q7CitzdGF0aWMgY29uc3QgY2hhciAqY2hyb290X2RpcjsKK3N0YXRpYyBpbnQgZGFlbW9uaXplOworc3RhdGljIGludCBmZHNbMl07CisKK3ZvaWQgb3Nfc2V0dXBfZWFybHlfc2lnbmFsX2hhbmRsaW5nKHZvaWQpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisgICAgc2lnZmlsbHNldCgmYWN0LnNhX21hc2spOworICAgIGFjdC5zYV9mbGFncyA9IDA7CisgICAgYWN0LnNhX2hhbmRsZXIgPSBTSUdfSUdOOworICAgIHNpZ2FjdGlvbihTSUdQSVBFLCAmYWN0LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgdGVybXNpZ19oYW5kbGVyKGludCBzaWduYWwpCit7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICAvLyBJbiBhbmRyb2lkLCByZXF1ZXN0IGNsb3NpbmcgdGhlIFVJLCBpbnN0ZWFkIG9mIHNob3J0LWNpcmN1dGluZyBkb3duIHRvCisgICAgLy8gcWVtdS4gVGhpcyB3aWxsIGV2ZW50dWFsbHkgY2FsbCBxZW11X3N5c3RlbV9zaHV0ZG93bl9yZXF1ZXN0IHZpYSBhIHNraW4KKyAgICAvLyBldmVudC4KKyAgICBza2luX3dpbnN5c19xdWl0X3JlcXVlc3QoKTsKKyNlbHNlCisgICAgcWVtdV9zeXN0ZW1fc2h1dGRvd25fcmVxdWVzdCgpOworI2VuZGlmICAvLyFDT05GSUdfQU5EUk9JRAorfQorCisjaWZuZGVmIENPTkZJR19BTkRST0lECitzdGF0aWMgdm9pZCBzaWdjaGxkX2hhbmRsZXIoaW50IHNpZ25hbCkKK3sKKyAgICB3YWl0cGlkKC0xLCBOVUxMLCBXTk9IQU5HKTsKK30KKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKK3ZvaWQgb3Nfc2V0dXBfc2lnbmFsX2hhbmRsaW5nKHZvaWQpCit7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisKKyAgICBtZW1zZXQoJmFjdCwgMCwgc2l6ZW9mKGFjdCkpOworICAgIGFjdC5zYV9oYW5kbGVyID0gdGVybXNpZ19oYW5kbGVyOworICAgIHNpZ2FjdGlvbihTSUdJTlQsICAmYWN0LCBOVUxMKTsKKyAgICBzaWdhY3Rpb24oU0lHSFVQLCAgJmFjdCwgTlVMTCk7CisgICAgc2lnYWN0aW9uKFNJR1RFUk0sICZhY3QsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICBhY3Quc2FfaGFuZGxlciA9IFNJR19ERkw7CisjZWxzZQorICAgIGFjdC5zYV9oYW5kbGVyID0gc2lnY2hsZF9oYW5kbGVyOworI2VuZGlmCisgICAgYWN0LnNhX2ZsYWdzID0gU0FfTk9DTERTVE9QOworICAgIHNpZ2FjdGlvbihTSUdDSExELCAmYWN0LCBOVUxMKTsKK30KKworLyogRmluZCBhIGxpa2VseSBsb2NhdGlvbiBmb3Igc3VwcG9ydCBmaWxlcyB1c2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyeS4KKyAgIEZvciBpbnN0YWxsZWQgYmluYXJpZXMgdGhpcyB3aWxsIGJlICIkYmluZGlyLy4uL3NoYXJlL3FlbXUiLiAgV2hlbgorICAgcnVubmluZyBmcm9tIHRoZSBidWlsZCB0cmVlIHRoaXMgd2lsbCBiZSAiJGJpbmRpci8uLi9wYy1iaW9zIi4gICovCisjZGVmaW5lIFNIQVJFX1NVRkZJWCAiL3NoYXJlL3FlbXUiCisjZGVmaW5lIEJVSUxEX1NVRkZJWCAiL3BjLWJpb3MiCitjaGFyICpvc19maW5kX2RhdGFkaXIoY29uc3QgY2hhciAqYXJndjApCit7CisgICAgY2hhciAqZGlyOworICAgIGNoYXIgKnAgPSBOVUxMOworICAgIGNoYXIgKnJlczsKKyAgICBjaGFyIGJ1ZltQQVRIX01BWF07CisgICAgc2l6ZV90IG1heF9sZW47CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGxlbiA9IHJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIGJ1ZltsZW5dID0gMDsKKyAgICAgICAgICAgIHAgPSBidWY7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorICAgIHsKKyAgICAgICAgc3RhdGljIGludCBtaWJbNF0gPSB7Q1RMX0tFUk4sIEtFUk5fUFJPQywgS0VSTl9QUk9DX1BBVEhOQU1FLCAtMX07CisgICAgICAgIHNpemVfdCBsZW4gPSBzaXplb2YoYnVmKSAtIDE7CisKKyAgICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgICAgIGlmICghc3lzY3RsKG1pYiwgQVJSQVlfU0laRShtaWIpLCBidWYsICZsZW4sIE5VTEwsIDApICYmCisgICAgICAgICAgICAqYnVmKSB7CisgICAgICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisgICAgICAgICAgICBwID0gYnVmOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgd2F5IG9mIGZpZ3VyaW5nIG91dCB0aGUgYWN0dWFsIGV4ZWN1dGFibGUKKyAgICAgICBsb2NhdGlvbiB0aGVuIHRyeSBhcmd2WzBdLiAgKi8KKyAgICBpZiAoIXApIHsKKyAgICAgICAgcCA9IHJlYWxwYXRoKGFyZ3YwLCBidWYpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGRpciA9IGRpcm5hbWUocCk7CisgICAgZGlyID0gZGlybmFtZShkaXIpOworCisgICAgbWF4X2xlbiA9IHN0cmxlbihkaXIpICsKKyAgICAgICAgTUFYKHN0cmxlbihTSEFSRV9TVUZGSVgpLCBzdHJsZW4oQlVJTERfU1VGRklYKSkgKyAxOworICAgIHJlcyA9IGdfbWFsbG9jMChtYXhfbGVuKTsKKyAgICBzbnByaW50ZihyZXMsIG1heF9sZW4sICIlcyVzIiwgZGlyLCBTSEFSRV9TVUZGSVgpOworICAgIGlmIChhY2Nlc3MocmVzLCBSX09LKSkgeworICAgICAgICBzbnByaW50ZihyZXMsIG1heF9sZW4sICIlcyVzIiwgZGlyLCBCVUlMRF9TVUZGSVgpOworICAgICAgICBpZiAoYWNjZXNzKHJlcywgUl9PSykpIHsKKyAgICAgICAgICAgIGdfZnJlZShyZXMpOworICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisjdW5kZWYgU0hBUkVfU1VGRklYCisjdW5kZWYgQlVJTERfU1VGRklYCisKK3ZvaWQgb3Nfc2V0X3Byb2NfbmFtZShjb25zdCBjaGFyICpzKQoreworI2lmIGRlZmluZWQoUFJfU0VUX05BTUUpCisgICAgY2hhciBuYW1lWzE2XTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKyAgICBuYW1lW3NpemVvZihuYW1lKSAtIDFdID0gMDsKKyAgICBzdHJuY3B5KG5hbWUsIHMsIHNpemVvZihuYW1lKSk7CisgICAgLyogQ291bGQgcmV3cml0ZSBhcmd2WzBdIHRvbywgYnV0IHRoYXQncyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLgorICAgICAgIFRoaXMgc2ltcGxlIHdheSBpcyBlbm91Z2ggZm9yIGB0b3AnLiAqLworICAgIGlmIChwcmN0bChQUl9TRVRfTkFNRSwgbmFtZSkpIHsKKyAgICAgICAgcGVycm9yKCJ1bmFibGUgdG8gY2hhbmdlIHByb2Nlc3MgbmFtZSIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyNlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJDaGFuZ2Ugb2YgcHJvY2VzcyBuYW1lIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBPU1xuIik7CisgICAgZXhpdCgxKTsKKyNlbmRpZgorfQorCisvKgorICogUGFyc2UgT1Mgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgKiByZXR1cm4gMCBpZiBvcHRpb24gaGFuZGxlZCwgLTEgb3RoZXJ3aXNlCisgKi8KK3ZvaWQgb3NfcGFyc2VfY21kX2FyZ3MoaW50IGluZGV4LCBjb25zdCBjaGFyICpvcHRhcmcpCit7CisgICAgc3dpdGNoIChpbmRleCkgeworI2lmZGVmIENPTkZJR19TTElSUAorICAgIGNhc2UgUUVNVV9PUFRJT05fc21iOgorI2lmIDEKKyAgICAgICAgbmV0X3NsaXJwX3NtYihvcHRhcmcpOworI2Vsc2UKKyAgICAgICAgaWYgKG5ldF9zbGlycF9zbWIob3B0YXJnKSA8IDApCisgICAgICAgICAgICBleGl0KDEpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBRRU1VX09QVElPTl9ydW5hczoKKyAgICAgICAgdXNlcl9wd2QgPSBnZXRwd25hbShvcHRhcmcpOworICAgICAgICBpZiAoIXVzZXJfcHdkKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzZXIgXCIlc1wiIGRvZXNuJ3QgZXhpc3RcbiIsIG9wdGFyZyk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUVNVV9PUFRJT05fY2hyb290OgorICAgICAgICBjaHJvb3RfZGlyID0gb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFTVVfT1BUSU9OX2RhZW1vbml6ZToKKyAgICAgICAgZGFlbW9uaXplID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2hhbmdlX3Byb2Nlc3NfdWlkKHZvaWQpCit7CisgICAgaWYgKHVzZXJfcHdkKSB7CisgICAgICAgIGlmIChzZXRnaWQodXNlcl9wd2QtPnB3X2dpZCkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZXRnaWQoJWQpXG4iLCB1c2VyX3B3ZC0+cHdfZ2lkKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHVpZCh1c2VyX3B3ZC0+cHdfdWlkKSA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHNldHVpZCglZClcbiIsIHVzZXJfcHdkLT5wd191aWQpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2V0dWlkKDApICE9IC0xKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRyb3BwaW5nIHByaXZpbGVnZXMgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9yb290KHZvaWQpCit7CisgICAgaWYgKGNocm9vdF9kaXIpIHsKKyAgICAgICAgaWYgKGNocm9vdChjaHJvb3RfZGlyKSA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2hyb290IGZhaWxlZFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChjaGRpcigiLyIpKSB7CisgICAgICAgICAgICBwZXJyb3IoIm5vdCBhYmxlIHRvIGNoZGlyIHRvIC8iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKK30KKwordm9pZCBvc19kYWVtb25pemUodm9pZCkKK3sKKyAgICBpZiAoZGFlbW9uaXplKSB7CisJcGlkX3QgcGlkOworCisJaWYgKHBpcGUoZmRzKSA9PSAtMSkKKwkgICAgZXhpdCgxKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID4gMCkgeworCSAgICB1aW50OF90IHN0YXR1czsKKwkgICAgc3NpemVfdCBsZW47CisKKwkgICAgY2xvc2UoZmRzWzFdKTsKKworCWFnYWluOgorICAgICAgICAgICAgbGVuID0gcmVhZChmZHNbMF0sICZzdGF0dXMsIDEpOworICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSAmJiAoZXJybm8gPT0gRUlOVFIpKQorICAgICAgICAgICAgICAgIGdvdG8gYWdhaW47CisKKyAgICAgICAgICAgIGlmIChsZW4gIT0gMSkKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09IDEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhY3F1aXJlIHBpZGZpbGU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBleGl0KDApOworCX0gZWxzZSBpZiAocGlkIDwgMCkKKyAgICAgICAgICAgIGV4aXQoMSk7CisKKwljbG9zZShmZHNbMF0pOworCXFlbXVfc2V0X2Nsb2V4ZWMoZmRzWzFdKTsKKworCXNldHNpZCgpOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPiAwKQorCSAgICBleGl0KDApOworCWVsc2UgaWYgKHBpZCA8IDApCisJICAgIGV4aXQoMSk7CisKKwl1bWFzaygwMjcpOworCisgICAgICAgIHNpZ25hbChTSUdUU1RQLCBTSUdfSUdOKTsKKyAgICAgICAgc2lnbmFsKFNJR1RUT1UsIFNJR19JR04pOworICAgICAgICBzaWduYWwoU0lHVFRJTiwgU0lHX0lHTik7CisgICAgfQorfQorCit2b2lkIG9zX3NldHVwX3Bvc3Qodm9pZCkKK3sKKyAgICBpbnQgZmQgPSAwOworCisgICAgaWYgKGRhZW1vbml6ZSkgeworCXVpbnQ4X3Qgc3RhdHVzID0gMDsKKwlzc2l6ZV90IGxlbjsKKworICAgIGFnYWluMToKKwlsZW4gPSB3cml0ZShmZHNbMV0sICZzdGF0dXMsIDEpOworCWlmIChsZW4gPT0gLTEgJiYgKGVycm5vID09IEVJTlRSKSkKKwkgICAgZ290byBhZ2FpbjE7CisKKwlpZiAobGVuICE9IDEpCisJICAgIGV4aXQoMSk7CisKKyAgICAgICAgaWYgKGNoZGlyKCIvIikpIHsKKyAgICAgICAgICAgIHBlcnJvcigibm90IGFibGUgdG8gY2hkaXIgdG8gLyIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCVRGUihmZCA9IHFlbXVfb3BlbigiL2Rldi9udWxsIiwgT19SRFdSKSk7CisJaWYgKGZkID09IC0xKQorCSAgICBleGl0KDEpOworICAgIH0KKworICAgIGNoYW5nZV9yb290KCk7CisgICAgY2hhbmdlX3Byb2Nlc3NfdWlkKCk7CisKKyAgICBpZiAoZGFlbW9uaXplKSB7CisgICAgICAgIGR1cDIoZmQsIDApOworICAgICAgICBkdXAyKGZkLCAxKTsKKyAgICAgICAgZHVwMihmZCwgMik7CisKKyAgICAgICAgY2xvc2UoZmQpOworICAgIH0KK30KKwordm9pZCBvc19waWRmaWxlX2Vycm9yKHZvaWQpCit7CisgICAgaWYgKGRhZW1vbml6ZSkgeworICAgICAgICB1aW50OF90IHN0YXR1cyA9IDE7CisgICAgICAgIGlmICh3cml0ZShmZHNbMV0sICZzdGF0dXMsIDEpICE9IDEpIHsKKyAgICAgICAgICAgIHBlcnJvcigiZGFlbW9uaXplLiBXcml0aW5nIHRvIHBpcGVcbiIpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFjcXVpcmUgcGlkIGZpbGU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworfQorCit2b2lkIG9zX3NldF9saW5lX2J1ZmZlcmluZyh2b2lkKQoreworICAgIHNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIDApOworfQorCisvKgorICogQ3JlYXRlcyBhbiBldmVudGZkIHRoYXQgbG9va3MgbGlrZSBhIHBpcGUgYW5kIGhhcyBFRkRfQ0xPRVhFQyBzZXQuCisgKi8KK2ludCBxZW11X2V2ZW50ZmQoaW50IGZkc1syXSkKK3sKKyNpZmRlZiBDT05GSUdfRVZFTlRGRAorICAgIGludCByZXQ7CisKKyAgICByZXQgPSBldmVudGZkKDAsIDApOworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICBmZHNbMF0gPSByZXQ7CisgICAgICAgIHFlbXVfc2V0X2Nsb2V4ZWMocmV0KTsKKyAgICAgICAgaWYgKChmZHNbMV0gPSBkdXAocmV0KSkgPT0gLTEpIHsKKyAgICAgICAgICAgIGNsb3NlKHJldCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9zZXRfY2xvZXhlYyhmZHNbMV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZXJybm8gIT0gRU5PU1lTKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBxZW11X3BpcGUoZmRzKTsKK30KKworaW50IHFlbXVfY3JlYXRlX3BpZGZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciBidWZmZXJbMTI4XTsKKyAgICBpbnQgbGVuOworICAgIGludCBmZDsKKworICAgIGZkID0gcWVtdV9vcGVuKGZpbGVuYW1lLCBPX1JEV1IgfCBPX0NSRUFULCAwNjAwKTsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobG9ja2YoZmQsIEZfVExPQ0ssIDApID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVsZFxuIiwgKGxvbmcpZ2V0cGlkKCkpOworICAgIGlmICh3cml0ZShmZCwgYnVmZmVyLCBsZW4pICE9IGxlbikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL29zLXdpbjMyLmMgYi9hbmRyb2lkL3FlbXUxL29zLXdpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlYWIyOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvb3Mtd2luMzIuYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIG9zLXdpbjMyLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgInFlbXUtb3B0aW9ucy5oIgorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vd2luc3lzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy93aW4zMl91bmljb2RlLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRnVuY3Rpb25zIG1pc3NpbmcgaW4gbWluZ3cgKi8KKworaW50IHNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpZiAob3ZlcndyaXRlIHx8ICFnZXRlbnYobmFtZSkpIHsKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyOworICAgICAgICBjaGFyICpzdHJpbmcgPSBnX21hbGxvYyhsZW5ndGgpOworICAgICAgICBzbnByaW50ZihzdHJpbmcsIGxlbmd0aCwgIiVzPSVzIiwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXN1bHQgPSBwdXRlbnYoc3RyaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIEJPT0wgV0lOQVBJIHFlbXVfY3RybF9oYW5kbGVyKERXT1JEIHR5cGUpCit7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICAvLyBJbiBhbmRyb2lkLCByZXF1ZXN0IGNsb3NpbmcgdGhlIFVJLCBpbnN0ZWFkIG9mIHNob3J0LWNpcmN1dGluZyBkb3duIHRvCisgICAgLy8gcWVtdS4gVGhpcyB3aWxsIGV2ZW50dWFsbHkgY2FsbCBxZW11X3N5c3RlbV9zaHV0ZG93bl9yZXF1ZXN0IHZpYSBhIHNraW4KKyAgICAvLyBldmVudC4KKyAgICBza2luX3dpbnN5c19xdWl0X3JlcXVlc3QoKTsKKyAgICAvLyBXaW5kb3dzIDcga2lsbHMgYXBwbGljYXRpb24gd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucy4KKyAgICAvLyBTbGVlcCBoZXJlIHRvIGdpdmUgUUVNVSBhIHRyeSBmb3IgY2xvc2luZy4KKyAgICAvLyBTbGVlcCBwZXJpb2QgaXMgMTAwMDBtcyBiZWNhdXNlIFdpbmRvd3Mga2lsbHMgdGhlIHByb2dyYW0KKyAgICAvLyBhZnRlciAxMCBzZWNvbmRzIGFueXdheS4KKyAgICBTbGVlcCgxMDAwMCk7CisjZWxzZQorICAgIGV4aXQoU1RBVFVTX0NPTlRST0xfQ19FWElUKTsKKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgb3Nfc2V0dXBfZWFybHlfc2lnbmFsX2hhbmRsaW5nKHZvaWQpCit7CisgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKHFlbXVfY3RybF9oYW5kbGVyLCBUUlVFKTsKK30KKworLyogTG9vayBmb3Igc3VwcG9ydCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGV4ZWN1dGFibGUuICAqLworY2hhciAqb3NfZmluZF9kYXRhZGlyKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworICAgIGNoYXIgKnA7CisgICAgY2hhciBidWZbTUFYX1BBVEhdOworICAgIERXT1JEIGxlbjsKKworICAgIHdjaGFyX3Qgd2lkZUJ1ZltNQVhfUEFUSF07CisgICAgbGVuID0gR2V0TW9kdWxlRmlsZU5hbWVXKE5VTEwsIHdpZGVCdWYsIE1BWF9QQVRIKTsKKyAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IE1BWF9QQVRIKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbnQgd3JpdHRlbiA9IHdpbjMyX3V0ZjE2X3RvX3V0ZjhfYnVmKHdpZGVCdWYsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGlmICh3cml0dGVuIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gd3JpdHRlbjsKKworICAgIHAgPSBidWYgKyBsZW4gLSAxOworICAgIHdoaWxlIChwICE9IGJ1ZiAmJiAqcCAhPSAnXFwnKQorICAgICAgICBwLS07CisgICAgKnAgPSAwOworICAgIGlmIChhY2Nlc3MoYnVmLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBnX3N0cmR1cChidWYpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBvc19zZXRfbGluZV9idWZmZXJpbmcodm9pZCkKK3sKKyAgICBzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKyAgICBzZXRidWYoc3RkZXJyLCBOVUxMKTsKK30KKworLyoKKyAqIFBhcnNlIE9TIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgorICogcmV0dXJuIDAgaWYgb3B0aW9uIGhhbmRsZWQsIC0xIG90aGVyd2lzZQorICovCit2b2lkIG9zX3BhcnNlX2NtZF9hcmdzKGludCBpbmRleCwgY29uc3QgY2hhciAqb3B0YXJnKQoreworICAgIHJldHVybjsKK30KKwordm9pZCBvc19waWRmaWxlX2Vycm9yKHZvaWQpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWNxdWlyZSBwaWQgZmlsZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK2ludCBxZW11X2NyZWF0ZV9waWRmaWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgaW50IGxlbjsKKyAgICBIQU5ETEUgZmlsZTsKKyAgICBPVkVSTEFQUEVEIG92ZXJsYXA7CisgICAgQk9PTCByZXQ7CisgICAgbWVtc2V0KCZvdmVybGFwLCAwLCBzaXplb2Yob3ZlcmxhcCkpOworCisgICAgZmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsIEdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKwkJICAgICAgT1BFTl9BTFdBWVMsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7CisKKyAgICBpZiAoZmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlbGRcbiIsIChsb25nKWdldHBpZCgpKTsKKyAgICByZXQgPSBXcml0ZUZpbGVFeChmaWxlLCAoTFBDVk9JRClidWZmZXIsIChEV09SRClsZW4sCisJCSAgICAgICZvdmVybGFwLCBOVUxMKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2FyIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzMGMwMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2FyCkBAIC0wLDAgKzEsOTggQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBhcgoraW5jbHVkZSBjb21tb24KK21hcCAweDQwMQorZXhjbGFtIDB4MDIgc2hpZnQKK2F0IDB4MDMgc2hpZnQKK251bWJlcnNpZ24gMHgwNCBzaGlmdAorZG9sbGFyIDB4MDUgc2hpZnQKK3BlcmNlbnQgMHgwNiBzaGlmdAorYXNjaWljaXJjdW0gMHgwNyBzaGlmdAorYW1wZXJzYW5kIDB4MDggc2hpZnQKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK3BhcmVubGVmdCAweDBhIHNoaWZ0CitwYXJlbnJpZ2h0IDB4MGIgc2hpZnQKK21pbnVzIDB4MGMKK3VuZGVyc2NvcmUgMHgwYyBzaGlmdAorZXF1YWwgMHgwZAorcGx1cyAweDBkIHNoaWZ0CitBcmFiaWNfZGFkIDB4MTAgYWx0Z3IKK0FyYWJpY19mYXRoYSAweDEwIHNoaWZ0IGFsdGdyCitBcmFiaWNfc2FkIDB4MTEgYWx0Z3IKK0FyYWJpY19mYXRoYXRhbiAweDExIHNoaWZ0IGFsdGdyCitBcmFiaWNfdGhlaCAweDEyIGFsdGdyCitBcmFiaWNfZGFtbWEgMHgxMiBzaGlmdCBhbHRncgorQXJhYmljX3FhZiAweDEzIGFsdGdyCitBcmFiaWNfZGFtbWF0YW4gMHgxMyBzaGlmdCBhbHRncgorQXJhYmljX2ZlaCAweDE0IGFsdGdyCitVRkVGOSAweDE0IHNoaWZ0IGFsdGdyCitBcmFiaWNfZ2hhaW4gMHgxNSBhbHRncgorQXJhYmljX2hhbXphdW5kZXJhbGVmIDB4MTUgc2hpZnQgYWx0Z3IKK0FyYWJpY19haW4gMHgxNiBhbHRncgorZ3JhdmUgMHgxNiBzaGlmdCBhbHRncgorQXJhYmljX2hhIDB4MTcgYWx0Z3IKK2RpdmlzaW9uIDB4MTcgc2hpZnQgYWx0Z3IKK0FyYWJpY19raGFoIDB4MTggYWx0Z3IKK211bHRpcGx5IDB4MTggc2hpZnQgYWx0Z3IKK0FyYWJpY19oYWggMHgxOSBhbHRncgorQXJhYmljX3NlbWljb2xvbiAweDE5IHNoaWZ0IGFsdGdyCiticmFja2V0bGVmdCAweDFhCiticmFjZWxlZnQgMHgxYSBzaGlmdAorQXJhYmljX2plZW0gMHgxYSBhbHRncgorYnJhY2tldHJpZ2h0IDB4MWIKK2JyYWNlcmlnaHQgMHgxYiBzaGlmdAorQXJhYmljX2RhbCAweDFiIGFsdGdyCitBcmFiaWNfc2hlZW4gMHgxZSBhbHRncgorYmFja3NsYXNoIDB4MWUgc2hpZnQgYWx0Z3IKK0FyYWJpY19zZWVuIDB4MWYgYWx0Z3IKK0FyYWJpY195ZWggMHgyMCBhbHRncgorYnJhY2tldGxlZnQgMHgyMCBzaGlmdCBhbHRncgorQXJhYmljX2JlaCAweDIxIGFsdGdyCiticmFja2V0cmlnaHQgMHgyMSBzaGlmdCBhbHRncgorQXJhYmljX2xhbSAweDIyIGFsdGdyCitVRkVGNyAweDIyIHNoaWZ0IGFsdGdyCitBcmFiaWNfYWxlZiAweDIzIGFsdGdyCitBcmFiaWNfaGFtemFvbmFsZWYgMHgyMyBzaGlmdCBhbHRncgorQXJhYmljX3RlaCAweDI0IGFsdGdyCitBcmFiaWNfdGF0d2VlbCAweDI0IHNoaWZ0IGFsdGdyCitBcmFiaWNfbm9vbiAweDI1IGFsdGdyCitBcmFiaWNfY29tbWEgMHgyNSBzaGlmdCBhbHRncgorQXJhYmljX21lZW0gMHgyNiBhbHRncgorc2xhc2ggMHgyNiBzaGlmdCBhbHRncgorc2VtaWNvbG9uIDB4MjcKK2NvbG9uIDB4Mjcgc2hpZnQKK0FyYWJpY19rYWYgMHgyNyBhbHRncgorYXBvc3Ryb3BoZSAweDI4CitxdW90ZWRibCAweDI4IHNoaWZ0CitBcmFiaWNfdGFoIDB4MjggYWx0Z3IKK2dyYXZlIDB4MjkKK2FzY2lpdGlsZGUgMHgyOSBzaGlmdAorQXJhYmljX3RoYWwgMHgyOSBhbHRncgorQXJhYmljX3NoYWRkYSAweDI5IHNoaWZ0IGFsdGdyCitiYWNrc2xhc2ggMHgyYgorYmFyIDB4MmIgc2hpZnQKK2xlc3MgMHgyYiBhbHRncgorZ3JlYXRlciAweDJiIHNoaWZ0IGFsdGdyCitBcmFiaWNfaGFtemFvbnllaCAweDJjIGFsdGdyCithc2NpaXRpbGRlIDB4MmMgc2hpZnQgYWx0Z3IKK0FyYWJpY19oYW16YSAweDJkIGFsdGdyCitBcmFiaWNfc3VrdW4gMHgyZCBzaGlmdCBhbHRncgorQXJhYmljX2hhbXphb253YXcgMHgyZSBhbHRncgorQXJhYmljX2thc3JhIDB4MmUgc2hpZnQgYWx0Z3IKK0FyYWJpY19yYSAweDJmIGFsdGdyCitBcmFiaWNfa2FzcmF0YW4gMHgyZiBzaGlmdCBhbHRncgorVUZFRkIgMHgzMCBhbHRncgorVUZFRjUgMHgzMCBzaGlmdCBhbHRncgorQXJhYmljX2FsZWZtYWtzdXJhIDB4MzEgYWx0Z3IKK0FyYWJpY19tYWRkYW9uYWxlZiAweDMxIHNoaWZ0IGFsdGdyCitBcmFiaWNfdGVobWFyYnV0YSAweDMyIGFsdGdyCithcG9zdHJvcGhlIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK2xlc3MgMHgzMyBzaGlmdAorQXJhYmljX3dhdyAweDMzIGFsdGdyCitwZXJpb2QgMHgzNAorZ3JlYXRlciAweDM0IHNoaWZ0CitBcmFiaWNfemFpbiAweDM0IGFsdGdyCitzbGFzaCAweDM1CitxdWVzdGlvbiAweDM1IHNoaWZ0CitBcmFiaWNfemFoIDB4MzUgYWx0Z3IKK0FyYWJpY19xdWVzdGlvbl9tYXJrIDB4MzUgc2hpZnQgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2NvbW1vbiBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2NvbW1vbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGM1NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvY29tbW9uCkBAIC0wLDAgKzEsMTU3IEBACitpbmNsdWRlIG1vZGlmaWVycworCisjCisjIFRvcCByb3cKKyMKKzEgMHgyCisyIDB4MworMyAweDQKKzQgMHg1Cis1IDB4NgorNiAweDcKKzcgMHg4Cis4IDB4OQorOSAweGEKKzAgMHhiCitCYWNrU3BhY2UgMHhlCisKKyMKKyMgUVdFUlRZIGZpcnN0IHJvdworIworVGFiIDB4ZiBsb2NhbHN0YXRlCitJU09fTGVmdF9UYWIgMHhmIHNoaWZ0CitxIDB4MTAgYWRkdXBwZXIKK3cgMHgxMSBhZGR1cHBlcgorZSAweDEyIGFkZHVwcGVyCityIDB4MTMgYWRkdXBwZXIKK3QgMHgxNCBhZGR1cHBlcgoreSAweDE1IGFkZHVwcGVyCit1IDB4MTYgYWRkdXBwZXIKK2kgMHgxNyBhZGR1cHBlcgorbyAweDE4IGFkZHVwcGVyCitwIDB4MTkgYWRkdXBwZXIKKworIworIyBRV0VSVFkgc2Vjb25kIHJvdworIworYSAweDFlIGFkZHVwcGVyCitzIDB4MWYgYWRkdXBwZXIKK2QgMHgyMCBhZGR1cHBlcgorZiAweDIxIGFkZHVwcGVyCitnIDB4MjIgYWRkdXBwZXIKK2ggMHgyMyBhZGR1cHBlcgoraiAweDI0IGFkZHVwcGVyCitrIDB4MjUgYWRkdXBwZXIKK2wgMHgyNiBhZGR1cHBlcgorUmV0dXJuIDB4MWMgbG9jYWxzdGF0ZQorCisjCisjIFFXRVJUWSB0aGlyZCByb3cKKyMKK3ogMHgyYyBhZGR1cHBlcgoreCAweDJkIGFkZHVwcGVyCitjIDB4MmUgYWRkdXBwZXIKK3YgMHgyZiBhZGR1cHBlcgorYiAweDMwIGFkZHVwcGVyCituIDB4MzEgYWRkdXBwZXIKK20gMHgzMiBhZGR1cHBlcgorCitzcGFjZSAweDM5IGxvY2Fsc3RhdGUKKworbGVzcyAweDU2CitncmVhdGVyIDB4NTYgc2hpZnQKK2JhciAweDU2IGFsdGdyCiticm9rZW5iYXIgMHg1NiBzaGlmdCBhbHRncgorCisjCisjIEVzYyBhbmQgRnVuY3Rpb24ga2V5cworIworRXNjYXBlIDB4MSBsb2NhbHN0YXRlCitGMSAweDNiIGxvY2Fsc3RhdGUKK0YyIDB4M2MgbG9jYWxzdGF0ZQorRjMgMHgzZCBsb2NhbHN0YXRlCitGNCAweDNlIGxvY2Fsc3RhdGUKK0Y1IDB4M2YgbG9jYWxzdGF0ZQorRjYgMHg0MCBsb2NhbHN0YXRlCitGNyAweDQxIGxvY2Fsc3RhdGUKK0Y4IDB4NDIgbG9jYWxzdGF0ZQorRjkgMHg0MyBsb2NhbHN0YXRlCitGMTAgMHg0NCBsb2NhbHN0YXRlCitGMTEgMHg1NyBsb2NhbHN0YXRlCitGMTIgMHg1OCBsb2NhbHN0YXRlCisKKyMgUHJpbnRzY3JlZW4sIFNjcm9sbG9jayBhbmQgUGF1c2UKKyMgUHJpbnRzY3JlZW4gcmVhbGx5IHJlcXVpcmVzIGZvdXIgc2NhbmNvZGVzICgweGUwLCAweDJhLCAweGUwLCAweDM3KSwKKyMgYnV0ICgweGUwLCAweDM3KSBzZWVtcyB0byB3b3JrLgorUHJpbnQgMHhiNyBsb2NhbHN0YXRlCitTeXNfUmVxIDB4YjcgbG9jYWxzdGF0ZQorRXhlY3V0ZSAweGI3IGxvY2Fsc3RhdGUKK1Njcm9sbF9Mb2NrIDB4NDYKKworIworIyBJbnNlcnQgLSBQZ0Rvd24KKyMKK0luc2VydCAweGQyIGxvY2Fsc3RhdGUKK0RlbGV0ZSAweGQzIGxvY2Fsc3RhdGUKK0hvbWUgMHhjNyBsb2NhbHN0YXRlCitFbmQgMHhjZiBsb2NhbHN0YXRlCitQYWdlX1VwIDB4YzkgbG9jYWxzdGF0ZQorUGFnZV9Eb3duIDB4ZDEgbG9jYWxzdGF0ZQorCisjCisjIEFycm93IGtleXMKKyMKK0xlZnQgMHhjYiBsb2NhbHN0YXRlCitVcCAweGM4IGxvY2Fsc3RhdGUKK0Rvd24gMHhkMCBsb2NhbHN0YXRlCitSaWdodCAweGNkIGxvY2Fsc3RhdGUKKworIworIyBOdW1wYWQKKyMKK051bV9Mb2NrIDB4NDUKK0tQX0RpdmlkZSAweGI1CitLUF9NdWx0aXBseSAweDM3CitLUF9TdWJ0cmFjdCAweDRhCitLUF9BZGQgMHg0ZQorS1BfRW50ZXIgMHg5YworCitLUF9EZWNpbWFsIDB4NTMgbnVtbG9jaworS1BfU2VwYXJhdG9yIDB4NTMgbnVtbG9jaworS1BfRGVsZXRlIDB4NTMKKworS1BfMCAweDUyIG51bWxvY2sKK0tQX0luc2VydCAweDUyCisKK0tQXzEgMHg0ZiBudW1sb2NrCitLUF9FbmQgMHg0ZgorCitLUF8yIDB4NTAgbnVtbG9jaworS1BfRG93biAweDUwCisKK0tQXzMgMHg1MSBudW1sb2NrCitLUF9OZXh0IDB4NTEKKworS1BfNCAweDRiIG51bWxvY2sKK0tQX0xlZnQgMHg0YgorCitLUF81IDB4NGMgbnVtbG9jaworS1BfQmVnaW4gMHg0YworCitLUF82IDB4NGQgbnVtbG9jaworS1BfUmlnaHQgMHg0ZAorCitLUF83IDB4NDcgbnVtbG9jaworS1BfSG9tZSAweDQ3CisKK0tQXzggMHg0OCBudW1sb2NrCitLUF9VcCAweDQ4CisKK0tQXzkgMHg0OSBudW1sb2NrCitLUF9QcmlvciAweDQ5CisKK0NhcHNfTG9jayAweDNhCisjCisjIEluaGliaXRlZCBrZXlzCisjCitNdWx0aV9rZXkgMHgwIGluaGliaXQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2RhIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4NGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2RhCkBAIC0wLDAgKzEsMTIwIEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgZGsKK2luY2x1ZGUgY29tbW9uCittYXAgMHg0MDYKK2V4Y2xhbSAweDAyIHNoaWZ0CitleGNsYW1kb3duIDB4MDIgYWx0Z3IKK29uZXN1cGVyaW9yIDB4MDIgc2hpZnQgYWx0Z3IKK3F1b3RlZGJsIDB4MDMgc2hpZnQKK2F0IDB4MDMgYWx0Z3IKK3R3b3N1cGVyaW9yIDB4MDMgc2hpZnQgYWx0Z3IKK251bWJlcnNpZ24gMHgwNCBzaGlmdAorc3RlcmxpbmcgMHgwNCBhbHRncgordGhyZWVzdXBlcmlvciAweDA0IHNoaWZ0IGFsdGdyCitjdXJyZW5jeSAweDA1IHNoaWZ0Citkb2xsYXIgMHgwNSBhbHRncgorb25lcXVhcnRlciAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgorY2VudCAweDA2IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwNyBzaGlmdAoreWVuIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitkaXZpc2lvbiAweDA4IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwOSBzaGlmdAorYnJhY2tldGxlZnQgMHgwOSBhbHRncgorZ3VpbGxlbW90bGVmdCAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweDBhIGFsdGdyCitndWlsbGVtb3RyaWdodCAweDBhIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCitwbHVzIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK3BsdXNtaW51cyAweDBjIGFsdGdyCitxdWVzdGlvbmRvd24gMHgwYyBzaGlmdCBhbHRncgorZGVhZF9hY3V0ZSAweDBkCitkZWFkX2dyYXZlIDB4MGQgc2hpZnQKK2JhciAweDBkIGFsdGdyCiticm9rZW5iYXIgMHgwZCBzaGlmdCBhbHRncgorR3JlZWtfT01FR0EgMHgxMCBzaGlmdCBhbHRncgorbHN0cm9rZSAweDExIGFsdGdyCitMc3Ryb2tlIDB4MTEgc2hpZnQgYWx0Z3IKK0V1cm9TaWduIDB4MTIgYWx0Z3IKK2NlbnQgMHgxMiBzaGlmdCBhbHRncgorcmVnaXN0ZXJlZCAweDEzIGFsdGdyCit0aG9ybiAweDE0IGFsdGdyCitUSE9STiAweDE0IHNoaWZ0IGFsdGdyCitsZWZ0YXJyb3cgMHgxNSBhbHRncgoreWVuIDB4MTUgc2hpZnQgYWx0Z3IKK2Rvd25hcnJvdyAweDE2IGFsdGdyCit1cGFycm93IDB4MTYgc2hpZnQgYWx0Z3IKK3JpZ2h0YXJyb3cgMHgxNyBhbHRncgoraWRvdGxlc3MgMHgxNyBzaGlmdCBhbHRncgorb2UgMHgxOCBhbHRncgorT0UgMHgxOCBzaGlmdCBhbHRncgordGhvcm4gMHgxOSBhbHRncgorVEhPUk4gMHgxOSBzaGlmdCBhbHRncgorYXJpbmcgMHgxYQorQXJpbmcgMHgxYSBzaGlmdAorZGVhZF9kaWFlcmVzaXMgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorZGVhZF9kaWFlcmVzaXMgMHgxYgorZGVhZF9jaXJjdW1mbGV4IDB4MWIgc2hpZnQKK2RlYWRfdGlsZGUgMHgxYiBhbHRncgorZGVhZF9jYXJvbiAweDFiIHNoaWZ0IGFsdGdyCitvcmRmZW1pbmluZSAweDFlIGFsdGdyCittYXNjdWxpbmUgMHgxZSBzaGlmdCBhbHRncgorc3NoYXJwIDB4MWYgYWx0Z3IKK3NlY3Rpb24gMHgxZiBzaGlmdCBhbHRncgorZXRoIDB4MjAgYWx0Z3IKK0VUSCAweDIwIHNoaWZ0IGFsdGdyCitkc3Ryb2tlIDB4MjEgYWx0Z3IKK29yZGZlbWluaW5lIDB4MjEgc2hpZnQgYWx0Z3IKK2VuZyAweDIyIGFsdGdyCitFTkcgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2tyYSAweDI1IGFsdGdyCitsc3Ryb2tlIDB4MjYgYWx0Z3IKK0xzdHJva2UgMHgyNiBzaGlmdCBhbHRncgorYWUgMHgyNworQUUgMHgyNyBzaGlmdAorb3NsYXNoIDB4MjgKK09vYmxpcXVlIDB4Mjggc2hpZnQKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgorb25laGFsZiAweDI5CitzZWN0aW9uIDB4Mjkgc2hpZnQKK3RocmVlcXVhcnRlcnMgMHgyOSBhbHRncgorcGFyYWdyYXBoIDB4Mjkgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgyYgorYXN0ZXJpc2sgMHgyYiBzaGlmdAorZGVhZF9kb3VibGVhY3V0ZSAweDJiIGFsdGdyCittdWx0aXBseSAweDJiIHNoaWZ0IGFsdGdyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NvcHlyaWdodCAweDJlIGFsdGdyCitsZWZ0ZG91YmxlcXVvdGVtYXJrIDB4MmYgYWx0Z3IKK2dyYXZlIDB4MmYgc2hpZnQgYWx0Z3IKK3JpZ2h0ZG91YmxlcXVvdGVtYXJrIDB4MzAgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK21hc2N1bGluZSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MzMgYWx0Z3IKK2RlYWRfb2dvbmVrIDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0Citjb2xvbiAweDM0IHNoaWZ0CitwZXJpb2RjZW50ZXJlZCAweDM0IGFsdGdyCitkZWFkX2Fib3ZlZG90IDB4MzQgc2hpZnQgYWx0Z3IKK21pbnVzIDB4MzUKK3VuZGVyc2NvcmUgMHgzNSBzaGlmdAoraHlwaGVuIDB4MzUgYWx0Z3IKK21hY3JvbiAweDM1IHNoaWZ0IGFsdGdyCitub2JyZWFrc3BhY2UgMHgzOSBhbHRncgorbGVzcyAweDU2CitncmVhdGVyIDB4NTYgc2hpZnQKK2JhY2tzbGFzaCAweDU2IGFsdGdyCitub3RzaWduIDB4NTYgc2hpZnQgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2RlIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MjljNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2RlCkBAIC0wLDAgKzEsMTE0IEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgZGUKK2luY2x1ZGUgY29tbW9uCittYXAgMHg0MDcKK2V4Y2xhbSAweDAyIHNoaWZ0CitvbmVzdXBlcmlvciAweDAyIGFsdGdyCitleGNsYW1kb3duIDB4MDIgc2hpZnQgYWx0Z3IKK3F1b3RlZGJsIDB4MDMgc2hpZnQKK3R3b3N1cGVyaW9yIDB4MDMgYWx0Z3IKK29uZWVpZ2h0aCAweDAzIHNoaWZ0IGFsdGdyCitzZWN0aW9uIDB4MDQgc2hpZnQKK3RocmVlc3VwZXJpb3IgMHgwNCBhbHRncgorc3RlcmxpbmcgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK29uZXF1YXJ0ZXIgMHgwNSBhbHRncgorY3VycmVuY3kgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK3RocmVlZWlnaHRocyAweDA2IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwNyBzaGlmdAordGhyZWVxdWFydGVycyAweDA3IGFsdGdyCitmaXZlZWlnaHRocyAweDA3IHNoaWZ0IGFsdGdyCitzbGFzaCAweDA4IHNoaWZ0CiticmFjZWxlZnQgMHgwOCBhbHRncgorc2V2ZW5laWdodGhzIDB4MDggc2hpZnQgYWx0Z3IKK3BhcmVubGVmdCAweDA5IHNoaWZ0CiticmFja2V0bGVmdCAweDA5IGFsdGdyCit0cmFkZW1hcmsgMHgwOSBzaGlmdCBhbHRncgorcGFyZW5yaWdodCAweDBhIHNoaWZ0CiticmFja2V0cmlnaHQgMHgwYSBhbHRncgorcGx1c21pbnVzIDB4MGEgc2hpZnQgYWx0Z3IKK2VxdWFsIDB4MGIgc2hpZnQKK2JyYWNlcmlnaHQgMHgwYiBhbHRncgorc3NoYXJwIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK2JhY2tzbGFzaCAweDBjIGFsdGdyCitxdWVzdGlvbmRvd24gMHgwYyBzaGlmdCBhbHRncgorYWN1dGUgMHgwZAorZGVhZF9hY3V0ZSAweDBkCitncmF2ZSAweDBkIHNoaWZ0CitkZWFkX2dyYXZlIDB4MGQgc2hpZnQKK2RlYWRfY2VkaWxsYSAweDBkIGFsdGdyCitkZWFkX29nb25layAweDBkIHNoaWZ0IGFsdGdyCithdCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKK3ogMHgxNSBhZGR1cHBlcgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCit1ZGlhZXJlc2lzIDB4MWEKK1VkaWFlcmVzaXMgMHgxYSBzaGlmdAorZGVhZF9kaWFlcmVzaXMgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorcGx1cyAweDFiCithc3RlcmlzayAweDFiIHNoaWZ0Cithc2NpaXRpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfdGlsZGUgMHgxYiBhbHRncgorZGVhZF9tYWNyb24gMHgxYiBzaGlmdCBhbHRncgorYWUgMHgxZSBhbHRncgorQUUgMHgxZSBzaGlmdCBhbHRncgorZXRoIDB4MjAgYWx0Z3IKK0VUSCAweDIwIHNoaWZ0IGFsdGdyCitkc3Ryb2tlIDB4MjEgYWx0Z3IKK29yZGZlbWluaW5lIDB4MjEgc2hpZnQgYWx0Z3IKK2VuZyAweDIyIGFsdGdyCitFTkcgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2tyYSAweDI1IGFsdGdyCitvZGlhZXJlc2lzIDB4MjcKK09kaWFlcmVzaXMgMHgyNyBzaGlmdAorZGVhZF9kb3VibGVhY3V0ZSAweDI3IGFsdGdyCithZGlhZXJlc2lzIDB4MjgKK0FkaWFlcmVzaXMgMHgyOCBzaGlmdAorZGVhZF9jYXJvbiAweDI4IHNoaWZ0IGFsdGdyCithc2NpaWNpcmN1bSAweDI5CitkZWFkX2NpcmN1bWZsZXggMHgyOQorZGVncmVlIDB4Mjkgc2hpZnQKK25vdHNpZ24gMHgyOSBhbHRncgorbnVtYmVyc2lnbiAweDJiCithcG9zdHJvcGhlIDB4MmIgc2hpZnQKK2RlYWRfYnJldmUgMHgyYiBzaGlmdCBhbHRncgoreSAweDJjIGFkZHVwcGVyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NlbnQgMHgyZSBhbHRncgorY29weXJpZ2h0IDB4MmUgc2hpZnQgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorbXUgMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0Citob3JpemNvbm5lY3RvciAweDMzIGFsdGdyCittdWx0aXBseSAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGl2aXNpb24gMHgzNCBzaGlmdCBhbHRncgorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CitkZWFkX2JlbG93ZG90IDB4MzUgYWx0Z3IKK2RlYWRfYWJvdmVkb3QgMHgzNSBzaGlmdCBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZGUtY2ggYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9kZS1jaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJmOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZGUtY2gKQEAgLTAsMCArMSwxNjkgQEAKKyMgcmRlc2t0b3AgU3dpc3MtR2VybWFuIChkZS1jaCkga2V5bWFwIGZpbGUKKyMgMjAwMy0wNi0wMyBieSBub2xkaUB0cmlzdGFyLmNoCisjCitpbmNsdWRlIGNvbW1vbgorbWFwIDB4MDAwMDA4MDcKKyMKKyMgU2NhbiBDb2RlIDEKK3NlY3Rpb24gMHgyOQorZGVncmVlIDB4Mjkgc2hpZnQKK25vdHNpZ24gMHgyOSBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSAyCitwbHVzIDB4MiBzaGlmdAorYnJva2VuYmFyIDB4MDIgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDMKK3F1b3RlZGJsIDB4MDMgc2hpZnQKK2F0IDB4MDMgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDQKK2FzdGVyaXNrIDB4MDQgc2hpZnQKK251bWJlcnNpZ24gMHgwNCBhbHRncgorIworIyBTY2FuIENvZGUgNQorY2NlZGlsbGEgMHgwNSBzaGlmdAorb25lcXVhcnRlciAweDA1IGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDYKK3BlcmNlbnQgMHgwNiBzaGlmdAorb25laGFsZiAweDA2IGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDcKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Citub3RzaWduIDB4MDcgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDgKK3NsYXNoIDB4MDggc2hpZnQKK2JhciAweDA4IGFsdGdyCisjCisjIFNjYW4gQ29kZSA5CitwYXJlbmxlZnQgMHgwOSBzaGlmdAorY2VudCAweDA5IGFsdGdyCisjCisjIFNjYW4gQ29kZSAxMAorcGFyZW5yaWdodCAweDBhIHNoaWZ0CisjCisjIFNjYW4gQ29kZSAxMQorZXF1YWwgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDEyCithcG9zdHJvcGhlIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK2RlYWRfYWN1dGUgMHgwYyBhbHRncgorIworIyBTY2FuIENvZGUgMTMKK2RlYWRfY2lyY3VtZmxleCAweDBkCitkZWFkX2dyYXZlIDB4MGQgc2hpZnQKK2RlYWRfdGlsZGUgMHgwZCBhbHRncgorIworIyBTY2FuIENvZGUgMTkKK0V1cm9TaWduIDB4MTIgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDIyCit6IDB4MTUgYWRkdXBwZXIKKyMKKyMgU2NhbiBDb2RlIDI3Cit1ZGlhZXJlc2lzIDB4MWEKK2VncmF2ZSAweDFhIHNoaWZ0CiticmFja2V0bGVmdCAweDFhIGFsdGdyCisjCisjIFNjYW4gQ29kZSAyOAorZGVhZF9kaWFlcmVzaXMgMHgxYgorZXhjbGFtIDB4MWIgc2hpZnQKK2JyYWNrZXRyaWdodCAweDFiIGFsdGdyCisjCisjIFNjYW4gQ29kZSA0MAorb2RpYWVyZXNpcyAweDI3CitlYWN1dGUgMHgyNyBzaGlmdAorIworIyBTY2FuIENvZGUgNDEKK2FkaWFlcmVzaXMgMHgyOAorYWdyYXZlIDB4Mjggc2hpZnQKK2JyYWNlbGVmdCAweDI4IGFsdGdyCisjCisjIFNjYW4gQ29kZSA0MiAob25seSBvbiBpbnRlcm5hdGlvbmFsIGtleWJvYXJkcykKK2RvbGxhciAweDJiCitzdGVybGluZyAweDJiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MmIgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDQ1IChvbmx5IG9uIGludGVybmF0aW9uYWwga2V5Ym9hcmRzKQorYmFja3NsYXNoIDB4NTYgYWx0Z3IKKyMKKyMgU2NhbiBDb2RlIDQ2Cit5IDB4MmMgYWRkdXBwZXIKKyMKKyMgU2NhbiBDb2RlIDUzCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAorIworIyBTY2FuIENvZGUgNTQKK3BlcmlvZCAweDM0Citjb2xvbiAweDM0IHNoaWZ0CisjCisjIFNjYW4gQ29kZSA1NQorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CisjCisjIFN1cHByZXNzIFdpbmRvd3MgdW5zdXBwb3J0ZWQgQWx0R3Iga2V5cworIworIyBTY2FuIENvZGUgMTcKK3BhcmFncmFwaCAweDEwIGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDIxCit0c2xhc2ggMHgxNCBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSAyMgorbGVmdGFycm93IDB4MTUgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgMjMKK2Rvd25hcnJvdyAweDE2IGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDI0CityaWdodGFycm93IDB4MTcgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgMjUKK29zbGFzaCAweDE4IGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDI2Cit0aG9ybiAweDE5IGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDMxCithZSAweDFlIGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDMyCitzc2hhcnAgMHgxZiBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSAzMworZXRoIDB4MjAgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgMzQKK2RzdHJva2UgMHgyMSBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSAzNQorZW5nIDB4MjIgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgMzYKK2hzdHJva2UgMHgyMyBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSAzOAora3JhIDB4MjUgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgMzkKK2xzdHJva2UgMHgyNiBhbHRnciBpbmhpYml0CisjCisjIFNjYW4gQ29kZSA0NgorZ3VpbGxlbW90bGVmdCAweDJjIGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDQ3CitndWlsbGVtb3RyaWdodCAweDJkIGFsdGdyIGluaGliaXQKKyMKKyMgU2NhbiBDb2RlIDQ5CitsZWZ0ZG91YmxlcXVvdGVtYXJrIDB4MmYgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgNTAKK3JpZ2h0ZG91YmxlcXVvdGVtYXJrIDB4MzAgYWx0Z3IgaW5oaWJpdAorIworIyBTY2FuIENvZGUgNTIKK211IDB4MzIgYWx0Z3IgaW5oaWJpdApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZW4tZ2IgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9lbi1nYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVmMDZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZW4tZ2IKQEAgLTAsMCArMSwxMTkgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBnYgoraW5jbHVkZSBjb21tb24KK21hcCAweDgwOQorZXhjbGFtIDB4MDIgc2hpZnQKK29uZXN1cGVyaW9yIDB4MDIgYWx0Z3IKK2V4Y2xhbWRvd24gMHgwMiBzaGlmdCBhbHRncgorcXVvdGVkYmwgMHgwMyBzaGlmdAordHdvc3VwZXJpb3IgMHgwMyBhbHRncgorb25lZWlnaHRoIDB4MDMgc2hpZnQgYWx0Z3IKK3N0ZXJsaW5nIDB4MDQgc2hpZnQKK3RocmVlc3VwZXJpb3IgMHgwNCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK0V1cm9TaWduIDB4MDUgYWx0Z3IKK3BlcmNlbnQgMHgwNiBzaGlmdAorb25laGFsZiAweDA2IGFsdGdyCit0aHJlZWVpZ2h0aHMgMHgwNiBzaGlmdCBhbHRncgorYXNjaWljaXJjdW0gMHgwNyBzaGlmdAordGhyZWVxdWFydGVycyAweDA3IGFsdGdyCitmaXZlZWlnaHRocyAweDA3IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwOCBzaGlmdAorYnJhY2VsZWZ0IDB4MDggYWx0Z3IKK3NldmVuZWlnaHRocyAweDA4IHNoaWZ0IGFsdGdyCithc3RlcmlzayAweDA5IHNoaWZ0CiticmFja2V0bGVmdCAweDA5IGFsdGdyCit0cmFkZW1hcmsgMHgwOSBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweDBhIGFsdGdyCitwbHVzbWludXMgMHgwYSBzaGlmdCBhbHRncgorcGFyZW5yaWdodCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCittaW51cyAweDBjCit1bmRlcnNjb3JlIDB4MGMgc2hpZnQKK2JhY2tzbGFzaCAweDBjIGFsdGdyCitxdWVzdGlvbmRvd24gMHgwYyBzaGlmdCBhbHRncgorZXF1YWwgMHgwZAorcGx1cyAweDBkIHNoaWZ0CitkZWFkX2NlZGlsbGEgMHgwZCBhbHRncgorZGVhZF9vZ29uZWsgMHgwZCBzaGlmdCBhbHRncgorYXQgMHgxMCBhbHRncgorR3JlZWtfT01FR0EgMHgxMCBzaGlmdCBhbHRncgorbHN0cm9rZSAweDExIGFsdGdyCitMc3Ryb2tlIDB4MTEgc2hpZnQgYWx0Z3IKK3BhcmFncmFwaCAweDEzIGFsdGdyCityZWdpc3RlcmVkIDB4MTMgc2hpZnQgYWx0Z3IKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCiticmFja2V0bGVmdCAweDFhCiticmFjZWxlZnQgMHgxYSBzaGlmdAorZGVhZF9kaWFlcmVzaXMgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorYnJhY2tldHJpZ2h0IDB4MWIKK2JyYWNlcmlnaHQgMHgxYiBzaGlmdAorZGVhZF90aWxkZSAweDFiIGFsdGdyCitkZWFkX21hY3JvbiAweDFiIHNoaWZ0IGFsdGdyCithZSAweDFlIGFsdGdyCitBRSAweDFlIHNoaWZ0IGFsdGdyCitzc2hhcnAgMHgxZiBhbHRncgorc2VjdGlvbiAweDFmIHNoaWZ0IGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZW5nIDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgora3JhIDB4MjUgYWx0Z3IKK2xzdHJva2UgMHgyNiBhbHRncgorTHN0cm9rZSAweDI2IHNoaWZ0IGFsdGdyCitzZW1pY29sb24gMHgyNworY29sb24gMHgyNyBzaGlmdAorZGVhZF9hY3V0ZSAweDI3IGFsdGdyCitkZWFkX2RvdWJsZWFjdXRlIDB4Mjcgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgyOAorYXQgMHgyOCBzaGlmdAorZGVhZF9jaXJjdW1mbGV4IDB4MjggYWx0Z3IKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgorZ3JhdmUgMHgyOQorbm90c2lnbiAweDI5IHNoaWZ0CitiYXIgMHgyOSBhbHRncgorbnVtYmVyc2lnbiAweDJiCithc2NpaXRpbGRlIDB4MmIgc2hpZnQKK2RlYWRfZ3JhdmUgMHgyYiBhbHRncgorZGVhZF9icmV2ZSAweDJiIHNoaWZ0IGFsdGdyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2xlc3MgMHgyYyBzaGlmdCBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorZ3JlYXRlciAweDJkIHNoaWZ0IGFsdGdyCitjZW50IDB4MmUgYWx0Z3IKK2NvcHlyaWdodCAweDJlIHNoaWZ0IGFsdGdyCitsZWZ0ZG91YmxlcXVvdGVtYXJrIDB4MmYgYWx0Z3IKK3JpZ2h0ZG91YmxlcXVvdGVtYXJrIDB4MzAgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK21hc2N1bGluZSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitsZXNzIDB4MzMgc2hpZnQKK2hvcml6Y29ubmVjdG9yIDB4MzMgYWx0Z3IKK211bHRpcGx5IDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RpdmlzaW9uIDB4MzQgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MzUKK3F1ZXN0aW9uIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCitiYWNrc2xhc2ggMHg1NgorYmFyIDB4NTYgc2hpZnQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2VuLXVzIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZW4tdXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3ODRiYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2VuLXVzCkBAIC0wLDAgKzEsMzUgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCB1cworaW5jbHVkZSBjb21tb24KK21hcCAweDQwOQorZXhjbGFtIDB4MDIgc2hpZnQKK2F0IDB4MDMgc2hpZnQKK251bWJlcnNpZ24gMHgwNCBzaGlmdAorZG9sbGFyIDB4MDUgc2hpZnQKK3BlcmNlbnQgMHgwNiBzaGlmdAorYXNjaWljaXJjdW0gMHgwNyBzaGlmdAorYW1wZXJzYW5kIDB4MDggc2hpZnQKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK3BhcmVubGVmdCAweDBhIHNoaWZ0CitwYXJlbnJpZ2h0IDB4MGIgc2hpZnQKK21pbnVzIDB4MGMKK3VuZGVyc2NvcmUgMHgwYyBzaGlmdAorZXF1YWwgMHgwZAorcGx1cyAweDBkIHNoaWZ0CiticmFja2V0bGVmdCAweDFhCiticmFjZWxlZnQgMHgxYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MWIKK2JyYWNlcmlnaHQgMHgxYiBzaGlmdAorc2VtaWNvbG9uIDB4MjcKK2NvbG9uIDB4Mjcgc2hpZnQKK2Fwb3N0cm9waGUgMHgyOAorcXVvdGVkYmwgMHgyOCBzaGlmdAorZ3JhdmUgMHgyOQorYXNjaWl0aWxkZSAweDI5IHNoaWZ0CitiYWNrc2xhc2ggMHgyYgorYmFyIDB4MmIgc2hpZnQKK2NvbW1hIDB4MzMKK2xlc3MgMHgzMyBzaGlmdAorcGVyaW9kIDB4MzQKK2dyZWF0ZXIgMHgzNCBzaGlmdAorc2xhc2ggMHgzNQorcXVlc3Rpb24gMHgzNSBzaGlmdApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZXMgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzI5ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZXMKQEAgLTAsMCArMSwxMDUgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBlcworaW5jbHVkZSBjb21tb24KK21hcCAweDQwYQorZXhjbGFtIDB4MDIgc2hpZnQKK2JhciAweDAyIGFsdGdyCitxdW90ZWRibCAweDAzIHNoaWZ0CithdCAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorcGVyaW9kY2VudGVyZWQgMHgwNCBzaGlmdAorbnVtYmVyc2lnbiAweDA0IGFsdGdyCitzdGVybGluZyAweDA0IHNoaWZ0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorYXNjaWl0aWxkZSAweDA1IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgordGhyZWVlaWdodGhzIDB4MDYgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Citub3RzaWduIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK3NldmVuZWlnaHRocyAweDA4IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwOSBzaGlmdAordHJhZGVtYXJrIDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYSBzaGlmdAorcGx1c21pbnVzIDB4MGEgc2hpZnQgYWx0Z3IKK2VxdWFsIDB4MGIgc2hpZnQKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCithcG9zdHJvcGhlIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK2V4Y2xhbWRvd24gMHgwZAorcXVlc3Rpb25kb3duIDB4MGQgc2hpZnQKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvc2xhc2ggMHgxOCBhbHRncgorT29ibGlxdWUgMHgxOCBzaGlmdCBhbHRncgordGhvcm4gMHgxOSBhbHRncgorVEhPUk4gMHgxOSBzaGlmdCBhbHRncgorZGVhZF9ncmF2ZSAweDFhCitkZWFkX2NpcmN1bWZsZXggMHgxYSBzaGlmdAorYnJhY2tldGxlZnQgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorcGx1cyAweDFiCithc3RlcmlzayAweDFiIHNoaWZ0CiticmFja2V0cmlnaHQgMHgxYiBhbHRncgorZGVhZF9tYWNyb24gMHgxYiBzaGlmdCBhbHRncgorYWUgMHgxZSBhbHRncgorQUUgMHgxZSBzaGlmdCBhbHRncgorc3NoYXJwIDB4MWYgYWx0Z3IKK3NlY3Rpb24gMHgxZiBzaGlmdCBhbHRncgorZXRoIDB4MjAgYWx0Z3IKK0VUSCAweDIwIHNoaWZ0IGFsdGdyCitkc3Ryb2tlIDB4MjEgYWx0Z3IKK2VuZyAweDIyIGFsdGdyCitFTkcgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2tyYSAweDI1IGFsdGdyCitsc3Ryb2tlIDB4MjYgYWx0Z3IKK0xzdHJva2UgMHgyNiBzaGlmdCBhbHRncgorbnRpbGRlIDB4MjcKK050aWxkZSAweDI3IHNoaWZ0CitkZWFkX2RvdWJsZWFjdXRlIDB4Mjcgc2hpZnQgYWx0Z3IKK2RlYWRfYWN1dGUgMHgyOAorZGVhZF9kaWFlcmVzaXMgMHgyOCBzaGlmdAorYnJhY2VsZWZ0IDB4MjggYWx0Z3IKK21hc2N1bGluZSAweDI5CitvcmRmZW1pbmluZSAweDI5IHNoaWZ0CitiYWNrc2xhc2ggMHgyOSBhbHRncgorY2NlZGlsbGEgMHgyYgorQ2NlZGlsbGEgMHgyYiBzaGlmdAorYnJhY2VyaWdodCAweDJiIGFsdGdyCitkZWFkX2JyZXZlIDB4MmIgc2hpZnQgYWx0Z3IKK2d1aWxsZW1vdGxlZnQgMHgyYyBhbHRncgorbGVzcyAweDU2CitncmVhdGVyIDB4NTYgc2hpZnQKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NlbnQgMHgyZSBhbHRncgorY29weXJpZ2h0IDB4MmUgc2hpZnQgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorZ3JhdmUgMHgyZiBzaGlmdCBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorbXUgMHgzMiBhbHRncgorY29tbWEgMHgzMworc2VtaWNvbG9uIDB4MzMgc2hpZnQKK2hvcml6Y29ubmVjdG9yIDB4MzMgYWx0Z3IKK211bHRpcGx5IDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0Citjb2xvbiAweDM0IHNoaWZ0CitkaXZpc2lvbiAweDM0IHNoaWZ0IGFsdGdyCittaW51cyAweDM1Cit1bmRlcnNjb3JlIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9ldCBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTQxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9ldApAQCAtMCwwICsxLDg1IEBACittYXAgMHgwMDAwMDQyNQoraW5jbHVkZSBjb21tb24KKworIworIyBUb3Agcm93CisjCitkZWFkX2Nhcm9uIDB4MjkKK2RlYWRfdGlsZGUgMHgyOSBzaGlmdAorCisjIDEKK2V4Y2xhbSAweDIgc2hpZnQKKworIyAyCitxdW90ZWRibCAweDMgc2hpZnQKK2F0IDB4MyBhbHRncgorCisjIDMKK251bWJlcnNpZ24gMHg0IHNoaWZ0CitzdGVybGluZyAweDQgYWx0Z3IKKyMgNAorY3VycmVuY3kgMHg1IHNoaWZ0Citkb2xsYXIgMHg1IGFsdGdyCisjIDUKK3BlcmNlbnQgMHg2IHNoaWZ0CisjIDYKK2FtcGVyc2FuZCAweDcgc2hpZnQKKyMgNworc2xhc2ggMHg4IHNoaWZ0CiticmFjZWxlZnQgMHg4IGFsdGdyCisjIDgKK3BhcmVubGVmdCAweDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4OSBhbHRncgorIyA5CitwYXJlbnJpZ2h0IDB4YSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4YSBhbHRncgorIyAwCitlcXVhbCAweGIgc2hpZnQKK2JyYWNlcmlnaHQgMHhiIGFsdGdyCisKK3BsdXMgMHhjCitxdWVzdGlvbiAweGMgc2hpZnQKK2JhY2tzbGFzaCAweGMgYWx0Z3IKKworYWN1dGUgMHhkCitkZWFkX2FjdXRlIDB4ZAorZ3JhdmUgMHhkIHNoaWZ0CitkZWFkX2dyYXZlIDB4ZCBzaGlmdAorCisjCisjIFFXRVJUWSBmaXJzdCByb3cKKyMKK0V1cm9TaWduIDB4MTIgYWx0Z3IKK3VkaWFlcmVzaXMgMHgxYQorVWRpYWVyZXNpcyAweDFhIHNoaWZ0CitvdGlsZGUgMHgxYgorT3RpbGRlIDB4MWIgc2hpZnQKK3NlY3Rpb24gMHgxYiBhbHRncgorCisjCisjIFFXRVJUWSBzZWNvbmQgcm93CisjCitzY2Fyb24gMHgxZiBhbHRncgorU2Nhcm9uIDB4MWYgYWx0Z3Igc2hpZnQKK29kaWFlcmVzaXMgMHgyNworT2RpYWVyZXNpcyAweDI3IHNoaWZ0CithZGlhZXJlc2lzIDB4MjgKK0FkaWFlcmVzaXMgMHgyOCBzaGlmdAorYXNjaWljaXJjdW0gMHgyOCBhbHRncgorYXBvc3Ryb3BoZSAweDJiCithc3RlcmlzayAweDJiIHNoaWZ0CitvbmVoYWxmIDB4MmIgYWx0Z3IKKyMKKyMgUVdFUlRZIHRoaXJkIHJvdworIworbGVzcyAweDU2CitncmVhdGVyIDB4NTYgc2hpZnQKK2JhciAweDU2IGFsdGdyCit6Y2Fyb24gMHgyYyBhbHRncgorWmNhcm9uIDB4MmMgYWx0Z3Igc2hpZnQKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0CitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9maSBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGUwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9maQpAQCAtMCwwICsxLDEyNCBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIHNlX0ZJCitpbmNsdWRlIGNvbW1vbgorbWFwIDB4NDBiCitleGNsYW0gMHgwMiBzaGlmdAorZXhjbGFtZG93biAweDAyIGFsdGdyCitvbmVzdXBlcmlvciAweDAyIHNoaWZ0IGFsdGdyCitxdW90ZWRibCAweDAzIHNoaWZ0CithdCAweDAzIGFsdGdyCit0d29zdXBlcmlvciAweDAzIHNoaWZ0IGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK3N0ZXJsaW5nIDB4MDQgYWx0Z3IKK3RocmVlc3VwZXJpb3IgMHgwNCBzaGlmdCBhbHRncgorY3VycmVuY3kgMHgwNSBzaGlmdAorZG9sbGFyIDB4MDUgYWx0Z3IKK29uZXF1YXJ0ZXIgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK2NlbnQgMHgwNiBzaGlmdCBhbHRncgorYW1wZXJzYW5kIDB4MDcgc2hpZnQKK3llbiAweDA3IGFsdGdyCitmaXZlZWlnaHRocyAweDA3IHNoaWZ0IGFsdGdyCitzbGFzaCAweDA4IHNoaWZ0CiticmFjZWxlZnQgMHgwOCBhbHRncgorZGl2aXNpb24gMHgwOCBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4MDkgYWx0Z3IKK2d1aWxsZW1vdGxlZnQgMHgwOSBzaGlmdCBhbHRncgorcGFyZW5yaWdodCAweDBhIHNoaWZ0CiticmFja2V0cmlnaHQgMHgwYSBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgwYSBzaGlmdCBhbHRncgorZXF1YWwgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyCitkZWdyZWUgMHgwYiBzaGlmdCBhbHRncgorcGx1cyAweDBjCitxdWVzdGlvbiAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorcXVlc3Rpb25kb3duIDB4MGMgc2hpZnQgYWx0Z3IKK2RlYWRfYWN1dGUgMHgwZAorZGVhZF9ncmF2ZSAweDBkIHNoaWZ0CitwbHVzbWludXMgMHgwZCBhbHRncgorbm90c2lnbiAweDBkIHNoaWZ0IGFsdGdyCithdCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitsc3Ryb2tlIDB4MTEgYWx0Z3IKK0xzdHJva2UgMHgxMSBzaGlmdCBhbHRncgorRXVyb1NpZ24gMHgxMiBhbHRncgorY2VudCAweDEyIHNoaWZ0IGFsdGdyCityZWdpc3RlcmVkIDB4MTMgYWx0Z3IKK3Rob3JuIDB4MTQgYWx0Z3IKK1RIT1JOIDB4MTQgc2hpZnQgYWx0Z3IKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvZSAweDE4IGFsdGdyCitPRSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCithcmluZyAweDFhCitBcmluZyAweDFhIHNoaWZ0CitkZWFkX2RpYWVyZXNpcyAweDFhIGFsdGdyCitkZWFkX2Fib3ZlcmluZyAweDFhIHNoaWZ0IGFsdGdyCitkZWFkX2RpYWVyZXNpcyAweDFiCitkZWFkX2NpcmN1bWZsZXggMHgxYiBzaGlmdAorZGVhZF90aWxkZSAweDFiIGFsdGdyCitkZWFkX2Nhcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK29yZGZlbWluaW5lIDB4MWUgYWx0Z3IKK21hc2N1bGluZSAweDFlIHNoaWZ0IGFsdGdyCitzc2hhcnAgMHgxZiBhbHRncgorc2VjdGlvbiAweDFmIHNoaWZ0IGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZW5nIDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgora3JhIDB4MjUgYWx0Z3IKK2FtcGVyc2FuZCAweDI1IHNoaWZ0IGFsdGdyCitsc3Ryb2tlIDB4MjYgYWx0Z3IKK0xzdHJva2UgMHgyNiBzaGlmdCBhbHRncgorb2RpYWVyZXNpcyAweDI3CitPZGlhZXJlc2lzIDB4Mjcgc2hpZnQKK29zbGFzaCAweDI3IGFsdGdyCitPb2JsaXF1ZSAweDI3IHNoaWZ0IGFsdGdyCithZGlhZXJlc2lzIDB4MjgKK0FkaWFlcmVzaXMgMHgyOCBzaGlmdAorYWUgMHgyOCBhbHRncgorQUUgMHgyOCBzaGlmdCBhbHRncgorc2VjdGlvbiAweDI5CitvbmVoYWxmIDB4Mjkgc2hpZnQKK3BhcmFncmFwaCAweDI5IGFsdGdyCit0aHJlZXF1YXJ0ZXJzIDB4Mjkgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgyYgorYXN0ZXJpc2sgMHgyYiBzaGlmdAorYWN1dGUgMHgyYiBhbHRncgorbXVsdGlwbHkgMHgyYiBzaGlmdCBhbHRncgorZ3VpbGxlbW90bGVmdCAweDJjIGFsdGdyCitsZXNzIDB4MmMgc2hpZnQgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2dyZWF0ZXIgMHgyZCBzaGlmdCBhbHRncgorY29weXJpZ2h0IDB4MmUgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorZ3JhdmUgMHgyZiBzaGlmdCBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorYXBvc3Ryb3BoZSAweDMwIHNoaWZ0IGFsdGdyCittdSAweDMyIGFsdGdyCittYXNjdWxpbmUgMHgzMiBzaGlmdCBhbHRncgorY29tbWEgMHgzMworc2VtaWNvbG9uIDB4MzMgc2hpZnQKK2RlYWRfY2VkaWxsYSAweDMzIGFsdGdyCitkZWFkX29nb25layAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM0IHNoaWZ0IGFsdGdyCittaW51cyAweDM1Cit1bmRlcnNjb3JlIDB4MzUgc2hpZnQKK2h5cGhlbiAweDM1IGFsdGdyCittYWNyb24gMHgzNSBzaGlmdCBhbHRncgorbm9icmVha3NwYWNlIDB4MzkgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZvIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZDlkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZvCkBAIC0wLDAgKzEsNzYgQEAKK21hcCAweDQzOAoraW5jbHVkZSBjb21tb24KKworIworIyBUb3Agcm93CisjCitvbmVoYWxmIDB4MjkKK3NlY3Rpb24gMHgyOSBzaGlmdAorCisjIDEKK2V4Y2xhbSAweDIgc2hpZnQKKworIyAyCitxdW90ZWRibCAweDMgc2hpZnQKK2F0IDB4MyBhbHRncgorCisjIDMKK251bWJlcnNpZ24gMHg0IHNoaWZ0CitzdGVybGluZyAweDQgYWx0Z3IKKyMgNAorY3VycmVuY3kgMHg1IHNoaWZ0Citkb2xsYXIgMHg1IGFsdGdyCisjIDUKK3BlcmNlbnQgMHg2IHNoaWZ0CisjIDYKK2FtcGVyc2FuZCAweDcgc2hpZnQKKyMgNworc2xhc2ggMHg4IHNoaWZ0CiticmFjZWxlZnQgMHg4IGFsdGdyCisjIDgKK3BhcmVubGVmdCAweDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4OSBhbHRncgorIyA5CitwYXJlbnJpZ2h0IDB4YSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4YSBhbHRncgorIyAwCitlcXVhbCAweGIgc2hpZnQKK2JyYWNlcmlnaHQgMHhiIGFsdGdyCisKK3BsdXMgMHhjCitxdWVzdGlvbiAweGMgc2hpZnQKK3BsdXNtaW51cyAweGMgYWx0Z3IKKworYmFyIDB4ZCBhbHRncgorZGVhZF9hY3V0ZSAweGQKKworIworIyBRV0VSVFkgZmlyc3Qgcm93CisjCitFdXJvU2lnbiAweDEyIGFsdGdyCithcmluZyAweDFhCitBcmluZyAweDFhIHNoaWZ0CitldGggMHgxYiBhZGR1cHBlcgorYXNjaWl0aWxkZSAweDFiIGFsdGdyCisKKyMKKyMgUVdFUlRZIHNlY29uZCByb3cKKyMKK2FlIDB4MjcgYWRkdXBwZXIKK29zbGFzaCAweDI4CitPb2JsaXF1ZSAweDI4IHNoaWZ0CithcG9zdHJvcGhlIDB4MmIKK2FzdGVyaXNrIDB4MmIgc2hpZnQKKworIworIyBRV0VSVFkgdGhpcmQgcm93CisjCitsZXNzIDB4NTYKK2dyZWF0ZXIgMHg1NiBzaGlmdAorYmFja3NsYXNoIDB4NTYgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0CitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9mciBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWExNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9mcgpAQCAtMCwwICsxLDE4MSBAQAoraW5jbHVkZSBjb21tb24KK21hcCAweDQwYworIworIyBUb3Agcm93CisjCit0d29zdXBlcmlvciAweDI5Citub3RzaWduIDB4MjkgYWx0Z3IKKworYW1wZXJzYW5kIDB4MDIKKzEgMHgwMiBzaGlmdAorb25lc3VwZXJpb3IgMHgwMiBhbHRncgorZXhjbGFtZG93biAweDAyIHNoaWZ0IGFsdGdyCisKK2VhY3V0ZSAweDAzCisyIDB4MDMgc2hpZnQKK2FzY2lpdGlsZGUgMHgwMyBhbHRncgorb25lZWlnaHRoIDB4MDMgc2hpZnQgYWx0Z3IKKworcXVvdGVkYmwgMHgwNAorMyAweDA0IHNoaWZ0CitudW1iZXJzaWduIDB4MDQgYWx0Z3IKKworYXBvc3Ryb3BoZSAweDA1Cis0IDB4MDUgc2hpZnQKK2JyYWNlbGVmdCAweDA1IGFsdGdyCisKK3BhcmVubGVmdCAweDA2Cis1IDB4MDYgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4MDYgYWx0Z3IKK3RocmVlZWlnaHRocyAweDA2IHNoaWZ0IGFsdGdyCisKK21pbnVzIDB4MDcKKzYgMHgwNyBzaGlmdAorYmFyIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKKworZWdyYXZlIDB4MDgKKzcgMHgwOCBzaGlmdAorZ3JhdmUgMHgwOCBhbHRncgorc2V2ZW5laWdodGhzIDB4MDggc2hpZnQgYWx0Z3IKKwordW5kZXJzY29yZSAweDA5Cis4IDB4MDkgc2hpZnQKK2JhY2tzbGFzaCAweDA5IGFsdGdyCit0cmFkZW1hcmsgMHgwOSBzaGlmdCBhbHRncgorCitjY2VkaWxsYSAweDBhCis5IDB4MGEgc2hpZnQKK2FzY2lpY2lyY3VtIDB4MGEgYWx0Z3IKK3BsdXNtaW51cyAweDBhIHNoaWZ0IGFsdGdyCisKK2FncmF2ZSAweDBiCiswIDB4MGIgc2hpZnQKK2F0IDB4MGIgYWx0Z3IKKworcGFyZW5yaWdodCAweDBjCitkZWdyZWUgMHgwYyBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MGMgYWx0Z3IKK3F1ZXN0aW9uZG93biAweDBjIHNoaWZ0IGFsdGdyCisKK2VxdWFsIDB4MGQKK3BsdXMgMHgwZCBzaGlmdAorYnJhY2VyaWdodCAweDBkIGFsdGdyCitkZWFkX29nb25layAweDBkIHNoaWZ0IGFsdGdyCisKKyMKKyMgQVpFUlRZIGZpcnN0IHJvdworIworCithIDB4MTAgYWRkdXBwZXIKK2FlIDB4MTAgYWx0Z3IKK0FFIDB4MTAgc2hpZnQgYWx0Z3IKKworeiAweDExIGFkZHVwcGVyCitndWlsbGVtb3RsZWZ0IDB4MTEgYWx0Z3IKKworRXVyb1NpZ24gMHgxMiBhbHRncgorCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCisKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgorCitsZWZ0YXJyb3cgMHgxNSBhbHRncgoreWVuIDB4MTUgc2hpZnQgYWx0Z3IKKworZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKKworb3NsYXNoIDB4MTggYWx0Z3IKK09vYmxpcXVlIDB4MTggc2hpZnQgYWx0Z3IKKwordGhvcm4gMHgxOSBhbHRncgorVEhPUk4gMHgxOSBzaGlmdCBhbHRncgorCitkZWFkX2NpcmN1bWZsZXggMHgxYQorZGVhZF9kaWFlcmVzaXMgMHgxYSBzaGlmdAorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorCitkb2xsYXIgMHgxYgorc3RlcmxpbmcgMHgxYiBzaGlmdAorY3VycmVuY3kgMHgxYiBhbHRncgorZGVhZF9tYWNyb24gMHgxYiBzaGlmdCBhbHRncgorCisjCisjIEFaRVJUWSBzZWNvbmQgcm93CisjCitxIDB4MWUgYWRkdXBwZXIKK0dyZWVrX09NRUdBIDB4MWUgc2hpZnQgYWx0Z3IKKworc3NoYXJwIDB4MWYgYWx0Z3IKKworZXRoIDB4MjAgYWx0Z3IKK0VUSCAweDIwIHNoaWZ0IGFsdGdyCisKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorCitlbmcgMHgyMiBhbHRncgorRU5HIDB4MjIgc2hpZnQgYWx0Z3IKKworaHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKKwora3JhIDB4MjUgYWx0Z3IKKworbHN0cm9rZSAweDI2IGFsdGdyCitMc3Ryb2tlIDB4MjYgc2hpZnQgYWx0Z3IKKworbSAweDI3IGFkZHVwcGVyCittYXNjdWxpbmUgMHgyNyBzaGlmdCBhbHRncgorCit1Z3JhdmUgMHgyOAorcGVyY2VudCAweDI4IHNoaWZ0CitkZWFkX2Nhcm9uIDB4Mjggc2hpZnQgYWx0Z3IKKworYXN0ZXJpc2sgMHgyYgorbXUgMHgyYiBzaGlmdAorZGVhZF9ncmF2ZSAweDJiIGFsdGdyCitkZWFkX2JyZXZlIDB4MmIgc2hpZnQgYWx0Z3IKKworIworIyBBWkVSVFkgdGhpcmQgcm93CisjCitsZXNzIDB4NTYKK2dyZWF0ZXIgMHg1NiBzaGlmdAorCit3IDB4MmMgYWRkdXBwZXIKKworZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorCitjZW50IDB4MmUgYWx0Z3IKK2NvcHlyaWdodCAweDJlIHNoaWZ0IGFsdGdyCisKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorCityaWdodGRvdWJsZXF1b3RlbWFyayAweDMwIGFsdGdyCisKK2NvbW1hIDB4MzIKK3F1ZXN0aW9uIDB4MzIgc2hpZnQKK2RlYWRfYWN1dGUgMHgzMiBhbHRncgorZGVhZF9kb3VibGVhY3V0ZSAweDMyIHNoaWZ0IGFsdGdyCisKK3NlbWljb2xvbiAweDMzCitwZXJpb2QgMHgzMyBzaGlmdAoraG9yaXpjb25uZWN0b3IgMHgzMyBhbHRncgorbXVsdGlwbHkgMHgzMyBzaGlmdCBhbHRncgorCitjb2xvbiAweDM0CitzbGFzaCAweDM0IHNoaWZ0CitwZXJpb2RjZW50ZXJlZCAweDM0IGFsdGdyCitkaXZpc2lvbiAweDM0IHNoaWZ0IGFsdGdyCisKK2V4Y2xhbSAweDM1CitzZWN0aW9uIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9mci1iZSBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyLWJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZjcxMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9mci1iZQpAQCAtMCwwICsxLDEzNCBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIGJlCitpbmNsdWRlIGNvbW1vbgorbWFwIDB4ODBjCithbXBlcnNhbmQgMHgwMgorMSAweDAyIHNoaWZ0CitiYXIgMHgwMiBhbHRncgorZXhjbGFtZG93biAweDAyIHNoaWZ0IGFsdGdyCitlYWN1dGUgMHgwMworMiAweDAzIHNoaWZ0CithdCAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorcXVvdGVkYmwgMHgwNAorMyAweDA0IHNoaWZ0CitudW1iZXJzaWduIDB4MDQgYWx0Z3IKK3N0ZXJsaW5nIDB4MDQgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgwNQorNCAweDA1IHNoaWZ0CitvbmVxdWFydGVyIDB4MDUgYWx0Z3IKK2RvbGxhciAweDA1IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwNgorNSAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK3RocmVlZWlnaHRocyAweDA2IHNoaWZ0IGFsdGdyCitzZWN0aW9uIDB4MDcKKzYgMHgwNyBzaGlmdAorYXNjaWljaXJjdW0gMHgwNyBhbHRncgorZml2ZWVpZ2h0aHMgMHgwNyBzaGlmdCBhbHRncgorZWdyYXZlIDB4MDgKKzcgMHgwOCBzaGlmdAorYnJhY2VsZWZ0IDB4MDggYWx0Z3IKK3NldmVuZWlnaHRocyAweDA4IHNoaWZ0IGFsdGdyCitleGNsYW0gMHgwOQorOCAweDA5IHNoaWZ0CiticmFja2V0bGVmdCAweDA5IGFsdGdyCit0cmFkZW1hcmsgMHgwOSBzaGlmdCBhbHRncgorY2NlZGlsbGEgMHgwYQorOSAweDBhIHNoaWZ0CiticmFjZWxlZnQgMHgwYSBhbHRncgorcGx1c21pbnVzIDB4MGEgc2hpZnQgYWx0Z3IKK2FncmF2ZSAweDBiCiswIDB4MGIgc2hpZnQKK2JyYWNlcmlnaHQgMHgwYiBhbHRncgorZGVncmVlIDB4MGIgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYworZGVncmVlIDB4MGMgc2hpZnQKK2JhY2tzbGFzaCAweDBjIGFsdGdyCitxdWVzdGlvbmRvd24gMHgwYyBzaGlmdCBhbHRncgorbWludXMgMHgwZAordW5kZXJzY29yZSAweDBkIHNoaWZ0CitkZWFkX2NlZGlsbGEgMHgwZCBhbHRncgorZGVhZF9vZ29uZWsgMHgwZCBzaGlmdCBhbHRncgorYSAweDEwIGFkZHVwcGVyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCit6IDB4MTEgYWRkdXBwZXIKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitjZW50IDB4MTIgc2hpZnQgYWx0Z3IKK3BhcmFncmFwaCAweDEzIGFsdGdyCityZWdpc3RlcmVkIDB4MTMgc2hpZnQgYWx0Z3IKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCitkZWFkX2NpcmN1bWZsZXggMHgxYQorZGVhZF9kaWFlcmVzaXMgMHgxYSBzaGlmdAorYnJhY2tldGxlZnQgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorZG9sbGFyIDB4MWIKK2FzdGVyaXNrIDB4MWIgc2hpZnQKK2JyYWNrZXRyaWdodCAweDFiIGFsdGdyCitkZWFkX21hY3JvbiAweDFiIHNoaWZ0IGFsdGdyCitxIDB4MWUgYWRkdXBwZXIKK2FlIDB4MWUgYWx0Z3IKK0FFIDB4MWUgc2hpZnQgYWx0Z3IKK3NzaGFycCAweDFmIGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZW5nIDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgora3JhIDB4MjUgYWx0Z3IKK2xzdHJva2UgMHgyNiBhbHRncgorTHN0cm9rZSAweDI2IHNoaWZ0IGFsdGdyCittIDB4MjcgYWRkdXBwZXIKK2RlYWRfYWN1dGUgMHgyNyBhbHRncgorZGVhZF9kb3VibGVhY3V0ZSAweDI3IHNoaWZ0IGFsdGdyCit1Z3JhdmUgMHgyOAorcGVyY2VudCAweDI4IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjggYWx0Z3IKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgordHdvc3VwZXJpb3IgMHgyOQordGhyZWVzdXBlcmlvciAweDI5IHNoaWZ0Citub3RzaWduIDB4MjkgYWx0Z3IKK211IDB4MmIKK3N0ZXJsaW5nIDB4MmIgc2hpZnQKK2RlYWRfZ3JhdmUgMHgyYiBhbHRncgorZGVhZF9icmV2ZSAweDJiIHNoaWZ0IGFsdGdyCit3IDB4MmMgYWRkdXBwZXIKK2d1aWxsZW1vdGxlZnQgMHgyYyBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorY2VudCAweDJlIGFsdGdyCitjb3B5cmlnaHQgMHgyZSBzaGlmdCBhbHRncgorbGVmdGRvdWJsZXF1b3RlbWFyayAweDJmIGFsdGdyCitncmF2ZSAweDJmIHNoaWZ0IGFsdGdyCityaWdodGRvdWJsZXF1b3RlbWFyayAweDMwIGFsdGdyCitjb21tYSAweDMyCitxdWVzdGlvbiAweDMyIHNoaWZ0CitkZWFkX2NlZGlsbGEgMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK3NlbWljb2xvbiAweDMzCitwZXJpb2QgMHgzMyBzaGlmdAoraG9yaXpjb25uZWN0b3IgMHgzMyBhbHRncgorbXVsdGlwbHkgMHgzMyBzaGlmdCBhbHRncgorY29sb24gMHgzNAorc2xhc2ggMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGl2aXNpb24gMHgzNCBzaGlmdCBhbHRncgorZXF1YWwgMHgzNQorcGx1cyAweDM1IHNoaWZ0CitkZWFkX3RpbGRlIDB4MzUgYWx0Z3IKK2RlYWRfYWJvdmVkb3QgMHgzNSBzaGlmdCBhbHRncgorYmFja3NsYXNoIDB4NTYgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyLWNhIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZnItY2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY0NTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyLWNhCkBAIC0wLDAgKzEsNTAgQEAKKyMgQ2FuYWRpYW4gRnJlbmNoCisjIEJ5IFNpbW9uIEdlcm1haW4KK2luY2x1ZGUgY29tbW9uCittYXAgMHhjMGMKKworYmFja3NsYXNoIDB4MjkgYWx0Z3IKK3BsdXNtaW51cyAweDIgYWx0Z3IKK2F0IDB4MyBhbHRncgorc3RlcmxpbmcgMHg0IGFsdGdyCitjZW50IDB4NSBhbHRncgorY3VycmVuY3kgMHg2IGFsdGdyCitub3RzaWduIDB4NyBhbHRncgorYmFyIDB4Mjkgc2hpZnQKK3R3b3N1cGVyaW9yIDB4OSBhbHRncgordGhyZWVzdXBlcmlvciAweGEgYWx0Z3IKK29uZXF1YXJ0ZXIgMHhiIGFsdGdyCitvbmVoYWxmIDB4YyBhbHRncgordGhyZWVxdWFydGVycyAweGQgYWx0Z3IKK3NlY3Rpb24gMHgxOCBhbHRncgorcGFyYWdyYXBoIDB4MTkgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MWEgYWx0Z3IKK2JyYWNrZXRyaWdodCAweDFiIGFsdGdyCithc2NpaXRpbGRlIDB4MjcgYWx0Z3IKK2JyYWNlbGVmdCAweDI4IGFsdGdyCiticmFjZXJpZ2h0IDB4MmIgYWx0Z3IKK2xlc3MgMHgyYgorZ3JlYXRlciAweDJiIHNoaWZ0CitndWlsbGVtb3RsZWZ0IDB4NTYKK2d1aWxsZW1vdHJpZ2h0IDB4NTYgc2hpZnQKK2RlZ3JlZSAweDU2IGFsdGdyCittdSAweDMyIGFsdGdyCitlYWN1dGUgMHgzNQorZGVhZF9hY3V0ZSAweDM1IGFsdGdyCitkZWFkX2dyYXZlIDB4MjgKK2RlYWRfY2lyY3VtZmxleCAweDFhCitkZWFkX2NpcmN1bWZsZXggMHgxYSBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MWIKK2RlYWRfZGlhZXJlc2lzIDB4MWIgc2hpZnQKK2V4Y2xhbSAweDIgc2hpZnQKK3F1b3RlZGJsIDB4MyBzaGlmdAorc2xhc2ggMHg0IHNoaWZ0Citkb2xsYXIgMHg1IHNoaWZ0CitwZXJjZW50IDB4NiBzaGlmdAorcXVlc3Rpb24gMHg3IHNoaWZ0CithbXBlcnNhbmQgMHg4IHNoaWZ0Cithc3RlcmlzayAweDkgc2hpZnQKK3BhcmVubGVmdCAweGEgc2hpZnQKK3BhcmVucmlnaHQgMHhiIHNoaWZ0Cit1bmRlcnNjb3JlIDB4YyBzaGlmdAorcGx1cyAweGQgc2hpZnQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyLWNoIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvZnItY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYyMGQyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2ZyLWNoCkBAIC0wLDAgKzEsMTE0IEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgZnJfQ0gKK2luY2x1ZGUgY29tbW9uCittYXAgMHgxMDBjCitleGNsYW0gMHgwMiBzaGlmdAorb25lc3VwZXJpb3IgMHgwMiBhbHRncgorZXhjbGFtZG93biAweDAyIHNoaWZ0IGFsdGdyCitxdW90ZWRibCAweDAzIHNoaWZ0Cit0d29zdXBlcmlvciAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorc2VjdGlvbiAweDA0IHNoaWZ0Cit0aHJlZXN1cGVyaW9yIDB4MDQgYWx0Z3IKK3N0ZXJsaW5nIDB4MDQgc2hpZnQgYWx0Z3IKK2RvbGxhciAweDA1IHNoaWZ0CitvbmVxdWFydGVyIDB4MDUgYWx0Z3IKK2N1cnJlbmN5IDB4MDUgc2hpZnQgYWx0Z3IKK3BlcmNlbnQgMHgwNiBzaGlmdAorb25laGFsZiAweDA2IGFsdGdyCit0aHJlZWVpZ2h0aHMgMHgwNiBzaGlmdCBhbHRncgorYW1wZXJzYW5kIDB4MDcgc2hpZnQKK3RocmVlcXVhcnRlcnMgMHgwNyBhbHRncgorZml2ZWVpZ2h0aHMgMHgwNyBzaGlmdCBhbHRncgorc2xhc2ggMHgwOCBzaGlmdAorYnJhY2VsZWZ0IDB4MDggYWx0Z3IKK3NldmVuZWlnaHRocyAweDA4IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwOSBzaGlmdAorYnJhY2tldGxlZnQgMHgwOSBhbHRncgordHJhZGVtYXJrIDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MGEgYWx0Z3IKK3BsdXNtaW51cyAweDBhIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK3NzaGFycCAweDBjCitxdWVzdGlvbiAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorcXVlc3Rpb25kb3duIDB4MGMgc2hpZnQgYWx0Z3IKK2FjdXRlIDB4MGQKK2RlYWRfYWN1dGUgMHgwZAorZ3JhdmUgMHgwZCBzaGlmdAorZGVhZF9ncmF2ZSAweDBkIHNoaWZ0CitkZWFkX2NlZGlsbGEgMHgwZCBhbHRncgorZGVhZF9vZ29uZWsgMHgwZCBzaGlmdCBhbHRncgorYXQgMHgxMCBhbHRncgorR3JlZWtfT01FR0EgMHgxMCBzaGlmdCBhbHRncgorRXVyb1NpZ24gMHgxMiBhbHRncgorcGFyYWdyYXBoIDB4MTMgYWx0Z3IKK3JlZ2lzdGVyZWQgMHgxMyBzaGlmdCBhbHRncgordHNsYXNoIDB4MTQgYWx0Z3IKK1RzbGFzaCAweDE0IHNoaWZ0IGFsdGdyCit6IDB4MTUgYWRkdXBwZXIKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvc2xhc2ggMHgxOCBhbHRncgorT29ibGlxdWUgMHgxOCBzaGlmdCBhbHRncgordGhvcm4gMHgxOSBhbHRncgorVEhPUk4gMHgxOSBzaGlmdCBhbHRncgordWRpYWVyZXNpcyAweDFhCitVZGlhZXJlc2lzIDB4MWEgc2hpZnQKK2RlYWRfZGlhZXJlc2lzIDB4MWEgYWx0Z3IKK2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK3BsdXMgMHgxYgorYXN0ZXJpc2sgMHgxYiBzaGlmdAorYXNjaWl0aWxkZSAweDFiIGFsdGdyCitkZWFkX3RpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK2FlIDB4MWUgYWx0Z3IKK0FFIDB4MWUgc2hpZnQgYWx0Z3IKK2V0aCAweDIwIGFsdGdyCitFVEggMHgyMCBzaGlmdCBhbHRncgorZHN0cm9rZSAweDIxIGFsdGdyCitvcmRmZW1pbmluZSAweDIxIHNoaWZ0IGFsdGdyCitlbmcgMHgyMiBhbHRncgorRU5HIDB4MjIgc2hpZnQgYWx0Z3IKK2hzdHJva2UgMHgyMyBhbHRncgorSHN0cm9rZSAweDIzIHNoaWZ0IGFsdGdyCitrcmEgMHgyNSBhbHRncgorb2RpYWVyZXNpcyAweDI3CitPZGlhZXJlc2lzIDB4Mjcgc2hpZnQKK2RlYWRfZG91YmxlYWN1dGUgMHgyNyBhbHRncgorYWRpYWVyZXNpcyAweDI4CitBZGlhZXJlc2lzIDB4Mjggc2hpZnQKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgorYXNjaWljaXJjdW0gMHgyOQorZGVhZF9jaXJjdW1mbGV4IDB4MjkKK2RlZ3JlZSAweDI5IHNoaWZ0Citub3RzaWduIDB4MjkgYWx0Z3IKK251bWJlcnNpZ24gMHgyYgorYXBvc3Ryb3BoZSAweDJiIHNoaWZ0CitkZWFkX2JyZXZlIDB4MmIgc2hpZnQgYWx0Z3IKK3kgMHgyYyBhZGR1cHBlcgorZ3VpbGxlbW90bGVmdCAweDJjIGFsdGdyCitndWlsbGVtb3RyaWdodCAweDJkIGFsdGdyCitjZW50IDB4MmUgYWx0Z3IKK2NvcHlyaWdodCAweDJlIHNoaWZ0IGFsdGdyCitsZWZ0ZG91YmxlcXVvdGVtYXJrIDB4MmYgYWx0Z3IKK3JpZ2h0ZG91YmxlcXVvdGVtYXJrIDB4MzAgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK21hc2N1bGluZSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAoraG9yaXpjb25uZWN0b3IgMHgzMyBhbHRncgorbXVsdGlwbHkgMHgzMyBzaGlmdCBhbHRncgorcGVyaW9kIDB4MzQKK2NvbG9uIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RpdmlzaW9uIDB4MzQgc2hpZnQgYWx0Z3IKK21pbnVzIDB4MzUKK3VuZGVyc2NvcmUgMHgzNSBzaGlmdAorZGVhZF9iZWxvd2RvdCAweDM1IGFsdGdyCitkZWFkX2Fib3ZlZG90IDB4MzUgc2hpZnQgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2hyIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvaHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzYWE2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2hyCkBAIC0wLDAgKzEsMTI1IEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgaHIKK2luY2x1ZGUgY29tbW9uCittYXAgMHg0MWEKK2V4Y2xhbSAweDAyIHNoaWZ0Cithc2NpaXRpbGRlIDB4MDIgYWx0Z3IKK2RlYWRfdGlsZGUgMHgwMiBzaGlmdCBhbHRncgorcXVvdGVkYmwgMHgwMyBzaGlmdAorZGVhZF9jYXJvbiAweDAzIGFsdGdyCitjYXJvbiAweDAzIHNoaWZ0IGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK2FzY2lpY2lyY3VtIDB4MDQgYWx0Z3IKK2RlYWRfY2lyY3VtZmxleCAweDA0IHNoaWZ0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorZGVhZF9icmV2ZSAweDA1IGFsdGdyCiticmV2ZSAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK2RlZ3JlZSAweDA2IGFsdGdyCitkZWFkX2Fib3ZlcmluZyAweDA2IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwNyBzaGlmdAorZGVhZF9vZ29uZWsgMHgwNyBhbHRncgorb2dvbmVrIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2dyYXZlIDB4MDggYWx0Z3IKK2RlYWRfZ3JhdmUgMHgwOCBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK2RlYWRfYWJvdmVkb3QgMHgwOSBhbHRncgorYWJvdmVkb3QgMHgwOSBzaGlmdCBhbHRncgorcGFyZW5yaWdodCAweDBhIHNoaWZ0CitkZWFkX2FjdXRlIDB4MGEgYWx0Z3IKK2Fwb3N0cm9waGUgMHgwYSBzaGlmdCBhbHRncgorZXF1YWwgMHgwYiBzaGlmdAorZGVhZF9kb3VibGVhY3V0ZSAweDBiIGFsdGdyCitkb3VibGVhY3V0ZSAweDBiIHNoaWZ0IGFsdGdyCithcG9zdHJvcGhlIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK2RlYWRfZGlhZXJlc2lzIDB4MGMgYWx0Z3IKK2RpYWVyZXNpcyAweDBjIHNoaWZ0IGFsdGdyCitwbHVzIDB4MGQKK2FzdGVyaXNrIDB4MGQgc2hpZnQKK2RlYWRfY2VkaWxsYSAweDBkIGFsdGdyCitjZWRpbGxhIDB4MGQgc2hpZnQgYWx0Z3IKK2JhY2tzbGFzaCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitiYXIgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKK3ogMHgxNSBhZGR1cHBlcgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCitzY2Fyb24gMHgxYQorU2Nhcm9uIDB4MWEgc2hpZnQKK2RpdmlzaW9uIDB4MWEgYWx0Z3IKK2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgxYgorRHN0cm9rZSAweDFiIHNoaWZ0CittdWx0aXBseSAweDFiIGFsdGdyCitkZWFkX21hY3JvbiAweDFiIHNoaWZ0IGFsdGdyCithZSAweDFlIGFsdGdyCitBRSAweDFlIHNoaWZ0IGFsdGdyCitzc2hhcnAgMHgxZiBhbHRncgorc2VjdGlvbiAweDFmIHNoaWZ0IGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MjEgYWx0Z3IKK29yZGZlbWluaW5lIDB4MjEgc2hpZnQgYWx0Z3IKK2JyYWNrZXRyaWdodCAweDIyIGFsdGdyCitFTkcgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgyNSBhbHRncgorYW1wZXJzYW5kIDB4MjUgc2hpZnQgYWx0Z3IKK0xzdHJva2UgMHgyNiBhbHRncgorY2Nhcm9uIDB4MjcKK0NjYXJvbiAweDI3IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjcgYWx0Z3IKK2RlYWRfZG91YmxlYWN1dGUgMHgyNyBzaGlmdCBhbHRncgorY2FjdXRlIDB4MjgKK0NhY3V0ZSAweDI4IHNoaWZ0Citzc2hhcnAgMHgyOCBhbHRncgorZGVhZF9jYXJvbiAweDI4IHNoaWZ0IGFsdGdyCitkZWFkX2NlZGlsbGEgMHgyOQorZGVhZF9kaWFlcmVzaXMgMHgyOSBzaGlmdAorbm90c2lnbiAweDI5IGFsdGdyCit6Y2Fyb24gMHgyYgorWmNhcm9uIDB4MmIgc2hpZnQKK2N1cnJlbmN5IDB4MmIgYWx0Z3IKK2RlYWRfYnJldmUgMHgyYiBzaGlmdCBhbHRncgoreSAweDJjIGFkZHVwcGVyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2xlc3MgMHgyYyBzaGlmdCBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorZ3JlYXRlciAweDJkIHNoaWZ0IGFsdGdyCitjZW50IDB4MmUgYWx0Z3IKK2NvcHlyaWdodCAweDJlIHNoaWZ0IGFsdGdyCithdCAweDJmIGFsdGdyCitncmF2ZSAweDJmIHNoaWZ0IGFsdGdyCiticmFjZWxlZnQgMHgzMCBhbHRncgorYXBvc3Ryb3BoZSAweDMwIHNoaWZ0IGFsdGdyCiticmFjZXJpZ2h0IDB4MzEgYWx0Z3IKK3NlY3Rpb24gMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0Citob3JpemNvbm5lY3RvciAweDMzIGFsdGdyCittdWx0aXBseSAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGl2aXNpb24gMHgzNCBzaGlmdCBhbHRncgorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CitkZWFkX2JlbG93ZG90IDB4MzUgYWx0Z3IKK2RlYWRfYWJvdmVkb3QgMHgzNSBzaGlmdCBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvaHUgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9odQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWJhNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvaHUKQEAgLTAsMCArMSwxMTUgQEAKKyMgSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoUVdFUlRaKQorIyBDcmVhdGVkIGJ5OiBUaGUgTmV2ZXJHb25lIDxuZXZlckBkZWxmaW4ua2x0ZS5odT4KKworaW5jbHVkZSBjb21tb24KK21hcCAweDQwZQorCisKKyMgQWx0R3Iga2V5czoKK25vdHNpZ24gMHgyOSBhbHRncgorYXNjaWl0aWxkZSAweDAyIGFsdGdyCitjYXJvbiAweDAzIGFsdGdyCithc2NpaWNpcmN1bSAweDA0IGFsdGdyCiticmV2ZSAweDA1IGFsdGdyCitkZWdyZWUgMHgwNiBhbHRncgorb2dvbmVrIDB4MDcgYWx0Z3IKK2dyYXZlIDB4MDggYWx0Z3IKK2Fib3ZlZG90IDB4MDkgYWx0Z3IKK2FjdXRlIDB4MGEgYWx0Z3IKK2RvdWJsZWFjdXRlIDB4MGIgYWx0Z3IKK2RpYWVyZXNpcyAweDBjIGFsdGdyCitjZWRpbGxhIDB4MGQgYWx0Z3IKK2JhY2tzbGFzaCAweDEwIGFsdGdyCitiYXIgMHgxMSBhbHRncgorRXVyb1NpZ24gMHgxMiBhbHRncgorSWFjdXRlIDB4MTcgYWx0Z3IKK2RpdmlzaW9uIDB4MWEgYWx0Z3IKK211bHRpcGx5IDB4MWIgYWx0Z3IKK2RzdHJva2UgMHgxZiBhbHRncgorRHN0cm9rZSAweDIwIGFsdGdyCiticmFja2V0bGVmdCAweDIxIGFsdGdyCiticmFja2V0cmlnaHQgMHgyMiBhbHRncgoraWFjdXRlIDB4MjQgYWx0Z3IKK2xzdHJva2UgMHgyNSBhbHRncgorTHN0cm9rZSAweDI2IGFsdGdyCitkb2xsYXIgMHgyNyBhbHRncgorc3NoYXJwIDB4MjggYWx0Z3IKK2N1cnJlbmN5IDB4MmIgYWx0Z3IKK2xlc3MgMHg1NiBhbHRncgorZ3JlYXRlciAweDJjIGFsdGdyCitudW1iZXJzaWduIDB4MmQgYWx0Z3IKK2FtcGVyc2FuZCAweDJlIGFsdGdyCithdCAweDJmIGFsdGdyCiticmFjZWxlZnQgMHgzMCBhbHRncgorYnJhY2VyaWdodCAweDMxIGFsdGdyCitzZW1pY29sb24gMHgzMyBhbHRncgorYXN0ZXJpc2sgMHgzNSBhbHRncgorCisKKyMgU2hpZnQga2V5czoKK3NlY3Rpb24gMHgyOSBzaGlmdAorYXBvc3Ryb3BoZSAweDAyIHNoaWZ0CitxdW90ZWRibCAweDAzIHNoaWZ0CitwbHVzIDB4MDQgc2hpZnQKK2V4Y2xhbSAweDA1IHNoaWZ0CitwZXJjZW50IDB4MDYgc2hpZnQKK3NsYXNoIDB4MDcgc2hpZnQKK2VxdWFsIDB4MDggc2hpZnQKK3BhcmVubGVmdCAweDA5IHNoaWZ0CitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK09kaWFlcmVzaXMgMHgwYiBzaGlmdAorVWRpYWVyZXNpcyAweDBjIHNoaWZ0CitPYWN1dGUgMHgwZCBzaGlmdAorWiAweDE1IHNoaWZ0CitPZG91YmxlYWN1dGUgMHgxYSBzaGlmdAorVWFjdXRlIDB4MWIgc2hpZnQKK0VhY3V0ZSAweDI3IHNoaWZ0CitBYWN1dGUgMHgyOCBzaGlmdAorVWRvdWJsZWFjdXRlIDB4MmIgc2hpZnQKK1kgMHgyYyBzaGlmdAorcXVlc3Rpb24gMHgzMyBzaGlmdAorY29sb24gMHgzNCBzaGlmdAordW5kZXJzY29yZSAweDM1IHNoaWZ0CitGMTMgMHgzYiBzaGlmdAorRjE0IDB4M2Mgc2hpZnQKK0YxNSAweDNkIHNoaWZ0CitGMTYgMHgzZSBzaGlmdAorRjE3IDB4M2Ygc2hpZnQKK0YxOCAweDQwIHNoaWZ0CitGMTkgMHg0MSBzaGlmdAorRjIwIDB4NDIgc2hpZnQKK0YyMSAweDQzIHNoaWZ0CitGMjIgMHg0NCBzaGlmdAorRjIzIDB4NTcgc2hpZnQKK0YyNCAweDU4IHNoaWZ0CisKKworIyBDdHJsIGtleXM6CitGMjUgMHgzYiBjdHJsCitGMjYgMHgzYyBjdHJsCitGMjcgMHgzZCBjdHJsCitGMjggMHgzZSBjdHJsCitGMjkgMHgzZiBjdHJsCitGMzAgMHg0MCBjdHJsCitGMzEgMHg0MSBjdHJsCitGMzIgMHg0MiBjdHJsCitGMzMgMHg0MyBjdHJsCitGMzQgMHg0NCBjdHJsCitGMzUgMHg1NyBjdHJsCisjTm9TeW1ib2wgMHg1OCBjdHJsCisKKworMCAweDI5CitvZGlhZXJlc2lzIDB4MGIKK3VkaWFlcmVzaXMgMHgwYworb2FjdXRlIDB4MGQKK3ogMHgxNQorb2RvdWJsZWFjdXRlIDB4MWEKK3VhY3V0ZSAweDFiCitlYWN1dGUgMHgyNworYWFjdXRlIDB4MjgKK3Vkb3VibGVhY3V0ZSAweDJiCit5IDB4MmMKK2NvbW1hIDB4MzMKK3BlcmlvZCAweDM0CittaW51cyAweDM1CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9pcyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZGMxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9pcwpAQCAtMCwwICsxLDEzOSBAQAorIyAyMDA0LTAzLTE2IEhhbGxk83IgR3XwbXVuZHNzb24gYW5kIE1vcnRlbiBMYW5nZQorIyBLZXlib2FyZCBkZWZpbml0aW9uIGZpbGUgZm9yIHRoZSBJY2VsYW5kaWMga2V5Ym9hcmQKKyMgdG8gYmUgdXNlZCBpbiByZGVza3RvcCAxLjMueCAoIFNlZSByZGVza3RvcC5vcmcpCisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgZGUsIGFuZCBjaGFuZ2VkIG1hbnVhbGx5CisjIExvY2F0aW9uIGZvciBleGFtcGxlIC91c3IvbG9jYWwvc2hhcmUvcmRlc2t0b3Ava2V5bWFwcy9pcworaW5jbHVkZSBjb21tb24KK21hcCAweDQwZgorZXhjbGFtIDB4MDIgc2hpZnQKK29uZXN1cGVyaW9yIDB4MDIgYWx0Z3IKK2V4Y2xhbWRvd24gMHgwMiBzaGlmdCBhbHRncgorcXVvdGVkYmwgMHgwMyBzaGlmdAordHdvc3VwZXJpb3IgMHgwMyBhbHRncgorb25lZWlnaHRoIDB4MDMgc2hpZnQgYWx0Z3IKKyNzZWN0aW9uIDB4MDQgc2hpZnQKK251bWJlcnNpZ24gMHgwNCBzaGlmdAordGhyZWVzdXBlcmlvciAweDA0IGFsdGdyCitzdGVybGluZyAweDA0IHNoaWZ0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorb25lcXVhcnRlciAweDA1IGFsdGdyCitjdXJyZW5jeSAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgordGhyZWVlaWdodGhzIDB4MDYgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Cit0aHJlZXF1YXJ0ZXJzIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitzZXZlbmVpZ2h0aHMgMHgwOCBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4MDkgYWx0Z3IKK3RyYWRlbWFyayAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweDBhIGFsdGdyCitwbHVzbWludXMgMHgwYSBzaGlmdCBhbHRncgorZXF1YWwgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyCisjc3NoYXJwIDB4MGMKK29kaWFlcmVzaXMgMHgwYworI3F1ZXN0aW9uIDB4MGMgc2hpZnQKK09kaWFlcmVzaXMgMHgwYyBzaGlmdAorYmFja3NsYXNoIDB4MGMgYWx0Z3IKK3F1ZXN0aW9uZG93biAweDBjIHNoaWZ0IGFsdGdyCisjYWN1dGUgMHgwZAorbWludXMgIDB4MGQKKyNkZWFkX2FjdXRlIDB4MGQKKyNncmF2ZSAweDBkIHNoaWZ0CisjZGVhZF9ncmF2ZSAweDBkIHNoaWZ0Cit1bmRlcnNjb3JlIDB4MGQgc2hpZnQKK2RlYWRfY2VkaWxsYSAweDBkIGFsdGdyCitkZWFkX29nb25layAweDBkIHNoaWZ0IGFsdGdyCithdCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKKyN6IDB4MTUgYWRkdXBwZXIKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvc2xhc2ggMHgxOCBhbHRncgorT29ibGlxdWUgMHgxOCBzaGlmdCBhbHRncgorI3Rob3JuIDB4MTkgYWx0Z3IKKyNUSE9STiAweDE5IHNoaWZ0IGFsdGdyCisjdWRpYWVyZXNpcyAweDFhCisjVWRpYWVyZXNpcyAweDFhIHNoaWZ0CisjZGVhZF9kaWFlcmVzaXMgMHgxYSBhbHRncgorI2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK2V0aCAweDFhCitFVEggMHgxYSBzaGlmdAorYXBvc3Ryb3BoZSAweDFiCitxdWVzdGlvbiAweDFiIHNoaWZ0CisjcGx1cyAweDFiCisjYXN0ZXJpc2sgMHgxYiBzaGlmdAorYXNjaWl0aWxkZSAweDFiIGFsdGdyCisjZ3JhdmUgMHgxYiBhbHRncgorI2RlYWRfdGlsZGUgMHgxYiBhbHRncgorI2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKKyNhZSAweDFlIGFsdGdyCisjQUUgMHgxZSBzaGlmdCBhbHRncgorI2V0aCAweDIwIGFsdGdyCisjZXRoIDB4MjAKKyNFVEggMHgyMCBzaGlmdCBhbHRncgorI0VUSCAweDIwIHNoaWZ0Citkc3Ryb2tlIDB4MjEgYWx0Z3IKK29yZGZlbWluaW5lIDB4MjEgc2hpZnQgYWx0Z3IKK2VuZyAweDIyIGFsdGdyCitFTkcgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2tyYSAweDI1IGFsdGdyCisjYWRpYWVyZXNpcyAweDI3CisjQWRpYWVyZXNpcyAweDI3IHNoaWZ0CithZSAweDI3CitBRSAweDI3IHNoaWZ0CitkZWFkX2RvdWJsZWFjdXRlIDB4MjcgYWx0Z3IKKyNhZGlhZXJlc2lzIDB4MjgKKyNBZGlhZXJlc2lzIDB4Mjggc2hpZnQKKyNkZWFkX2Nhcm9uIDB4Mjggc2hpZnQgYWx0Z3IKKyNhc2NpaWNpcmN1bSAweDI5CithY3V0ZSAgMHgyOAorZGVhZF9hY3V0ZSAweDI4CisjZGVhZF9jaXJjdW1mbGV4IDB4MjkKKyNkZWdyZWUgMHgyOSBzaGlmdAorI25vdHNpZ24gMHgyOSBhbHRncgorcGx1cyAweDJiCithc3RlcmlzayAweDJiIHNoaWZ0CitncmF2ZSAweDJiIGFsdGdyCisjbnVtYmVyc2lnbiAweDJiCisjYXBvc3Ryb3BoZSAweDJiIHNoaWZ0CisjZGVhZF9icmV2ZSAweDJiIHNoaWZ0IGFsdGdyCisjeSAweDJjIGFkZHVwcGVyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NlbnQgMHgyZSBhbHRncgorY29weXJpZ2h0IDB4MmUgc2hpZnQgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorbXUgMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0Citob3JpemNvbm5lY3RvciAweDMzIGFsdGdyCittdWx0aXBseSAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGl2aXNpb24gMHgzNCBzaGlmdCBhbHRncgorI21pbnVzIDB4MzUKKyN1bmRlcnNjb3JlIDB4MzUgc2hpZnQKK3Rob3JuIDB4MzUKK1RIT1JOIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9pdCBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2l0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2E3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9pdApAQCAtMCwwICsxLDExNSBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIGl0CitpbmNsdWRlIGNvbW1vbgorbWFwIDB4NDEwCitleGNsYW0gMHgwMiBzaGlmdAorb25lc3VwZXJpb3IgMHgwMiBhbHRncgorZXhjbGFtZG93biAweDAyIHNoaWZ0IGFsdGdyCitxdW90ZWRibCAweDAzIHNoaWZ0Cit0d29zdXBlcmlvciAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorc3RlcmxpbmcgMHgwNCBzaGlmdAordGhyZWVzdXBlcmlvciAweDA0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorb25lcXVhcnRlciAweDA1IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgordGhyZWVlaWdodGhzIDB4MDYgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Cit0aHJlZXF1YXJ0ZXJzIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitzZXZlbmVpZ2h0aHMgMHgwOCBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK3RyYWRlbWFyayAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK3BsdXNtaW51cyAweDBhIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCithcG9zdHJvcGhlIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK2dyYXZlIDB4MGMgYWx0Z3IKK3F1ZXN0aW9uZG93biAweDBjIHNoaWZ0IGFsdGdyCitpZ3JhdmUgMHgwZAorYXNjaWljaXJjdW0gMHgwZCBzaGlmdAorYXNjaWl0aWxkZSAweDBkIGFsdGdyCitkZWFkX29nb25layAweDBkIHNoaWZ0IGFsdGdyCithdCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitsc3Ryb2tlIDB4MTEgYWx0Z3IKK0xzdHJva2UgMHgxMSBzaGlmdCBhbHRncgorRXVyb1NpZ24gMHgxMiBhbHRncgorY2VudCAweDEyIHNoaWZ0IGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvc2xhc2ggMHgxOCBhbHRncgorT29ibGlxdWUgMHgxOCBzaGlmdCBhbHRncgordGhvcm4gMHgxOSBhbHRncgorVEhPUk4gMHgxOSBzaGlmdCBhbHRncgorZWdyYXZlIDB4MWEKK2VhY3V0ZSAweDFhIHNoaWZ0CiticmFja2V0bGVmdCAweDFhIGFsdGdyCitkZWFkX2Fib3ZlcmluZyAweDFhIHNoaWZ0IGFsdGdyCitwbHVzIDB4MWIKK2FzdGVyaXNrIDB4MWIgc2hpZnQKK2JyYWNrZXRyaWdodCAweDFiIGFsdGdyCitkZWFkX21hY3JvbiAweDFiIHNoaWZ0IGFsdGdyCithZSAweDFlIGFsdGdyCitBRSAweDFlIHNoaWZ0IGFsdGdyCitzc2hhcnAgMHgxZiBhbHRncgorc2VjdGlvbiAweDFmIHNoaWZ0IGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZW5nIDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgora3JhIDB4MjUgYWx0Z3IKK2xzdHJva2UgMHgyNiBhbHRncgorTHN0cm9rZSAweDI2IHNoaWZ0IGFsdGdyCitvZ3JhdmUgMHgyNworY2NlZGlsbGEgMHgyNyBzaGlmdAorYXQgMHgyNyBhbHRncgorZGVhZF9kb3VibGVhY3V0ZSAweDI3IHNoaWZ0IGFsdGdyCithZ3JhdmUgMHgyOAorZGVncmVlIDB4Mjggc2hpZnQKK251bWJlcnNpZ24gMHgyOCBhbHRncgorYmFja3NsYXNoIDB4MjkKK2JhciAweDI5IHNoaWZ0Citub3RzaWduIDB4MjkgYWx0Z3IKK3VncmF2ZSAweDJiCitzZWN0aW9uIDB4MmIgc2hpZnQKK2RlYWRfZ3JhdmUgMHgyYiBhbHRncgorZGVhZF9icmV2ZSAweDJiIHNoaWZ0IGFsdGdyCitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NlbnQgMHgyZSBhbHRncgorY29weXJpZ2h0IDB4MmUgc2hpZnQgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorZ3JhdmUgMHgyZiBzaGlmdCBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorbXUgMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0Citob3JpemNvbm5lY3RvciAweDMzIGFsdGdyCittdWx0aXBseSAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorY29sb24gMHgzNCBzaGlmdAorcGVyaW9kY2VudGVyZWQgMHgzNCBhbHRncgorZGl2aXNpb24gMHgzNCBzaGlmdCBhbHRncgorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CitkZWFkX2JlbG93ZG90IDB4MzUgYWx0Z3IKK2RlYWRfYWJvdmVkb3QgMHgzNSBzaGlmdCBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvamEgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9qYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDkwYTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvamEKQEAgLTAsMCArMSwxMDkgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBqcDEwNgoraW5jbHVkZSBjb21tb24KK21hcCAweDQxMQorZXhjbGFtIDB4MDIgc2hpZnQKK2thbmFfTlUgMHgwMiBhbHRncgorcXVvdGVkYmwgMHgwMyBzaGlmdAora2FuYV9GVSAweDAzIGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK2thbmFfQSAweDA0IGFsdGdyCitrYW5hX2EgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK2thbmFfVSAweDA1IGFsdGdyCitrYW5hX3UgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitrYW5hX0UgMHgwNiBhbHRncgora2FuYV9lIDB4MDYgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0CitrYW5hX08gMHgwNyBhbHRncgora2FuYV9vIDB4MDcgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgwOCBzaGlmdAora2FuYV9ZQSAweDA4IGFsdGdyCitrYW5hX3lhIDB4MDggc2hpZnQgYWx0Z3IKK3BhcmVubGVmdCAweDA5IHNoaWZ0CitrYW5hX1lVIDB4MDkgYWx0Z3IKK2thbmFfeXUgMHgwOSBzaGlmdCBhbHRncgorcGFyZW5yaWdodCAweDBhIHNoaWZ0CitrYW5hX1lPIDB4MGEgYWx0Z3IKK2thbmFfeW8gMHgwYSBzaGlmdCBhbHRncgorYXNjaWl0aWxkZSAweDBiIHNoaWZ0CitrYW5hX1dBIDB4MGIgYWx0Z3IKK2thbmFfV08gMHgwYiBzaGlmdCBhbHRncgorbWludXMgMHgwYworZXF1YWwgMHgwYyBzaGlmdAora2FuYV9ITyAweDBjIGFsdGdyCithc2NpaWNpcmN1bSAweDBkCithc2NpaXRpbGRlIDB4MGQgc2hpZnQKK2thbmFfSEUgMHgwZCBhbHRncgora2FuYV9UQSAweDEwIGFsdGdyCitrYW5hX1RFIDB4MTEgYWx0Z3IKK2thbmFfSSAweDEyIGFsdGdyCitrYW5hX2kgMHgxMiBzaGlmdCBhbHRncgora2FuYV9TVSAweDEzIGFsdGdyCitrYW5hX0tBIDB4MTQgYWx0Z3IKK2thbmFfTiAweDE1IGFsdGdyCitrYW5hX05BIDB4MTYgYWx0Z3IKK2thbmFfTkkgMHgxNyBhbHRncgora2FuYV9SQSAweDE4IGFsdGdyCitrYW5hX1NFIDB4MTkgYWx0Z3IKK2F0IDB4MWEKK2dyYXZlIDB4MWEgc2hpZnQKK3ZvaWNlZHNvdW5kIDB4MWEgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MWIKK2JyYWNlbGVmdCAweDFiIHNoaWZ0CitzZW1pdm9pY2Vkc291bmQgMHgxYiBhbHRncgora2FuYV9vcGVuaW5nYnJhY2tldCAweDFiIHNoaWZ0IGFsdGdyCitrYW5hX0NISSAweDFlIGFsdGdyCitrYW5hX1RPIDB4MWYgYWx0Z3IKK2thbmFfU0hJIDB4MjAgYWx0Z3IKK2thbmFfSEEgMHgyMSBhbHRncgora2FuYV9LSSAweDIyIGFsdGdyCitrYW5hX0tVIDB4MjMgYWx0Z3IKK2thbmFfTUEgMHgyNCBhbHRncgora2FuYV9OTyAweDI1IGFsdGdyCitrYW5hX1JJIDB4MjYgYWx0Z3IKK3NlbWljb2xvbiAweDI3CitwbHVzIDB4Mjcgc2hpZnQKK2thbmFfUkUgMHgyNyBhbHRncgorY29sb24gMHgyOAorYXN0ZXJpc2sgMHgyOCBzaGlmdAora2FuYV9LRSAweDI4IGFsdGdyCitaZW5rYWt1X0hhbmtha3UgMHgyOQorYnJhY2tldHJpZ2h0IDB4MmIKK2JyYWNlcmlnaHQgMHgyYiBzaGlmdAora2FuYV9NVSAweDJiIGFsdGdyCitrYW5hX2Nsb3NpbmdicmFja2V0IDB4MmIgc2hpZnQgYWx0Z3IKK2thbmFfVFNVIDB4MmMgYWx0Z3IKK2thbmFfdHN1IDB4MmMgc2hpZnQgYWx0Z3IKK2thbmFfU0EgMHgyZCBhbHRncgora2FuYV9TTyAweDJlIGFsdGdyCitrYW5hX0hJIDB4MmYgYWx0Z3IKK2thbmFfS08gMHgzMCBhbHRncgora2FuYV9NSSAweDMxIGFsdGdyCitrYW5hX01PIDB4MzIgYWx0Z3IKK2NvbW1hIDB4MzMKK2xlc3MgMHgzMyBzaGlmdAora2FuYV9ORSAweDMzIGFsdGdyCitrYW5hX2NvbW1hIDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK2thbmFfUlUgMHgzNCBhbHRncgora2FuYV9mdWxsc3RvcCAweDM0IHNoaWZ0IGFsdGdyCitzbGFzaCAweDM1CitxdWVzdGlvbiAweDM1IHNoaWZ0CitrYW5hX01FIDB4MzUgYWx0Z3IKK2thbmFfY29uanVuY3RpdmUgMHgzNSBzaGlmdCBhbHRncgorRWlzdV90b2dnbGUgMHgzYSBzaGlmdAorRXhlY3V0ZSAweDU0IHNoaWZ0CitLYW5qaSAweDcwCitiYWNrc2xhc2ggMHg3MworeWVuIDB4N2QKK2JhciAweDdkIHNoaWZ0Cit1bmRlcnNjb3JlIDB4NzMgc2hpZnQKK0hlbmthbl9Nb2RlIDB4NzkKK0thdGFrYW5hX1JlYWwgMHg3MAorS2F0YWthbmEgMHg3MAorTXVoZW5rYW4gMHg3YgorSGVua2FuX01vZGVfUmVhbCAweDc5CitIZW5rYW5fTW9kZV9VbHRyYSAweDc5CitiYWNrc2xhc2hfamEgMHg3MwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbHQgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9sdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDlkNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbHQKQEAgLTAsMCArMSw1NyBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIGx0CitpbmNsdWRlIGNvbW1vbgorbWFwIDB4NDI3CitleGNsYW0gMHgwMiBzaGlmdAorYW9nb25layAweDAyIGFsdGdyCitBb2dvbmVrIDB4MDIgc2hpZnQgYWx0Z3IKK2F0IDB4MDMgc2hpZnQKK2NjYXJvbiAweDAzIGFsdGdyCitDY2Fyb24gMHgwMyBzaGlmdCBhbHRncgorbnVtYmVyc2lnbiAweDA0IHNoaWZ0Citlb2dvbmVrIDB4MDQgYWx0Z3IKK0VvZ29uZWsgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK2VhYm92ZWRvdCAweDA1IGFsdGdyCitFYWJvdmVkb3QgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0Citpb2dvbmVrIDB4MDYgYWx0Z3IKK0lvZ29uZWsgMHgwNiBzaGlmdCBhbHRncgorYXNjaWljaXJjdW0gMHgwNyBzaGlmdAorc2Nhcm9uIDB4MDcgYWx0Z3IKK1NjYXJvbiAweDA3IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwOCBzaGlmdAordW9nb25layAweDA4IGFsdGdyCitVb2dvbmVrIDB4MDggc2hpZnQgYWx0Z3IKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK3VtYWNyb24gMHgwOSBhbHRncgorVW1hY3JvbiAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwYSBzaGlmdAorZG91YmxlbG93cXVvdGVtYXJrIDB4MGEgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYiBzaGlmdAorbGVmdGRvdWJsZXF1b3RlbWFyayAweDBiIGFsdGdyCittaW51cyAweDBjCit1bmRlcnNjb3JlIDB4MGMgc2hpZnQKK2VxdWFsIDB4MGQKK3BsdXMgMHgwZCBzaGlmdAoremNhcm9uIDB4MGQgYWx0Z3IKK1pjYXJvbiAweDBkIHNoaWZ0IGFsdGdyCiticmFja2V0bGVmdCAweDFhCiticmFjZWxlZnQgMHgxYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MWIKK2JyYWNlcmlnaHQgMHgxYiBzaGlmdAorc2VtaWNvbG9uIDB4MjcKK2NvbG9uIDB4Mjcgc2hpZnQKK2Fwb3N0cm9waGUgMHgyOAorcXVvdGVkYmwgMHgyOCBzaGlmdAorZ3JhdmUgMHgyOQorYXNjaWl0aWxkZSAweDI5IHNoaWZ0CitiYWNrc2xhc2ggMHgyYgorYmFyIDB4MmIgc2hpZnQKK2NvbW1hIDB4MzMKK2xlc3MgMHgzMyBzaGlmdAorcGVyaW9kIDB4MzQKK2dyZWF0ZXIgMHgzNCBzaGlmdAorc2xhc2ggMHgzNQorcXVlc3Rpb24gMHgzNSBzaGlmdAorZW5kYXNoIDB4NTYKK0V1cm9TaWduIDB4NTYgc2hpZnQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2x2IGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5MTcyNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL2x2CkBAIC0wLDAgKzEsMTI4IEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgbHYKK2luY2x1ZGUgY29tbW9uCittYXAgMHg0MjYKK2V4Y2xhbSAweDAyIHNoaWZ0CitvbmVzdXBlcmlvciAweDAyIGFsdGdyCitleGNsYW1kb3duIDB4MDIgc2hpZnQgYWx0Z3IKK2F0IDB4MDMgc2hpZnQKK3R3b3N1cGVyaW9yIDB4MDMgYWx0Z3IKK29uZWVpZ2h0aCAweDAzIHNoaWZ0IGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK3RocmVlc3VwZXJpb3IgMHgwNCBhbHRncgorc3RlcmxpbmcgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK0V1cm9TaWduIDB4MDUgYWx0Z3IKK2NlbnQgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK3RocmVlZWlnaHRocyAweDA2IHNoaWZ0IGFsdGdyCithc2NpaWNpcmN1bSAweDA3IHNoaWZ0Cit0aHJlZXF1YXJ0ZXJzIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA4IHNoaWZ0CiticmFjZWxlZnQgMHgwOCBhbHRncgorc2V2ZW5laWdodGhzIDB4MDggc2hpZnQgYWx0Z3IKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4MDkgYWx0Z3IKK3RyYWRlbWFyayAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MGEgYWx0Z3IKK3BsdXNtaW51cyAweDBhIHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGIgc2hpZnQKK2JyYWNlcmlnaHQgMHgwYiBhbHRncgorZGVncmVlIDB4MGIgc2hpZnQgYWx0Z3IKK21pbnVzIDB4MGMKK3VuZGVyc2NvcmUgMHgwYyBzaGlmdAorYmFja3NsYXNoIDB4MGMgYWx0Z3IKK3F1ZXN0aW9uZG93biAweDBjIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBkCitwbHVzIDB4MGQgc2hpZnQKK2RlYWRfY2VkaWxsYSAweDBkIGFsdGdyCitkZWFkX29nb25layAweDBkIHNoaWZ0IGFsdGdyCithdCAweDEwIGFsdGdyCitHcmVla19PTUVHQSAweDEwIHNoaWZ0IGFsdGdyCitsc3Ryb2tlIDB4MTEgYWx0Z3IKK0xzdHJva2UgMHgxMSBzaGlmdCBhbHRncgorZW1hY3JvbiAweDEyIGFsdGdyCitFbWFjcm9uIDB4MTIgc2hpZnQgYWx0Z3IKK3JjZWRpbGxhIDB4MTMgYWx0Z3IKK1JjZWRpbGxhIDB4MTMgc2hpZnQgYWx0Z3IKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCit1bWFjcm9uIDB4MTYgYWx0Z3IKK1VtYWNyb24gMHgxNiBzaGlmdCBhbHRncgoraW1hY3JvbiAweDE3IGFsdGdyCitJbWFjcm9uIDB4MTcgc2hpZnQgYWx0Z3IKK29tYWNyb24gMHgxOCBhbHRncgorT21hY3JvbiAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCiticmFja2V0bGVmdCAweDFhCiticmFjZWxlZnQgMHgxYSBzaGlmdAorZGVhZF9kaWFlcmVzaXMgMHgxYSBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgxYSBzaGlmdCBhbHRncgorYnJhY2tldHJpZ2h0IDB4MWIKK2JyYWNlcmlnaHQgMHgxYiBzaGlmdAorZGVhZF90aWxkZSAweDFiIGFsdGdyCitkZWFkX21hY3JvbiAweDFiIHNoaWZ0IGFsdGdyCitJU09fTmV4dF9Hcm91cCAweDFjIHNoaWZ0CithbWFjcm9uIDB4MWUgYWx0Z3IKK0FtYWNyb24gMHgxZSBzaGlmdCBhbHRncgorc2Nhcm9uIDB4MWYgYWx0Z3IKK1NjYXJvbiAweDFmIHNoaWZ0IGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZ2NlZGlsbGEgMHgyMiBhbHRncgorR2NlZGlsbGEgMHgyMiBzaGlmdCBhbHRncgoraHN0cm9rZSAweDIzIGFsdGdyCitIc3Ryb2tlIDB4MjMgc2hpZnQgYWx0Z3IKK2tjZWRpbGxhIDB4MjUgYWx0Z3IKK0tjZWRpbGxhIDB4MjUgc2hpZnQgYWx0Z3IKK2xjZWRpbGxhIDB4MjYgYWx0Z3IKK0xjZWRpbGxhIDB4MjYgc2hpZnQgYWx0Z3IKK3NlbWljb2xvbiAweDI3Citjb2xvbiAweDI3IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjcgYWx0Z3IKK2RlYWRfZG91YmxlYWN1dGUgMHgyNyBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDI4CitxdW90ZWRibCAweDI4IHNoaWZ0CitsZWZ0ZG91YmxlcXVvdGVtYXJrIDB4MjggYWx0Z3IKK2RvdWJsZWxvd3F1b3RlbWFyayAweDI4IHNoaWZ0IGFsdGdyCitncmF2ZSAweDI5Cithc2NpaXRpbGRlIDB4Mjkgc2hpZnQKK25vdHNpZ24gMHgyOSBhbHRncgorYmFja3NsYXNoIDB4MmIKK2JhciAweDJiIHNoaWZ0CitkZWFkX2dyYXZlIDB4MmIgYWx0Z3IKK2RlYWRfYnJldmUgMHgyYiBzaGlmdCBhbHRncgoremNhcm9uIDB4MmMgYWx0Z3IKK1pjYXJvbiAweDJjIHNoaWZ0IGFsdGdyCitndWlsbGVtb3RyaWdodCAweDJkIGFsdGdyCitncmVhdGVyIDB4MmQgc2hpZnQgYWx0Z3IKK2NjYXJvbiAweDJlIGFsdGdyCitDY2Fyb24gMHgyZSBzaGlmdCBhbHRncgorbGVmdGRvdWJsZXF1b3RlbWFyayAweDJmIGFsdGdyCitncmF2ZSAweDJmIHNoaWZ0IGFsdGdyCityaWdodGRvdWJsZXF1b3RlbWFyayAweDMwIGFsdGdyCithcG9zdHJvcGhlIDB4MzAgc2hpZnQgYWx0Z3IKK25jZWRpbGxhIDB4MzEgYWx0Z3IKK05jZWRpbGxhIDB4MzEgc2hpZnQgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK21hc2N1bGluZSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitsZXNzIDB4MzMgc2hpZnQKK2hvcml6Y29ubmVjdG9yIDB4MzMgYWx0Z3IKK211bHRpcGx5IDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RpdmlzaW9uIDB4MzQgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MzUKK3F1ZXN0aW9uIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCitub2JyZWFrc3BhY2UgMHgzOSBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbWsgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGMxNTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbWsKQEAgLTAsMCArMSwxMDEgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBtaworaW5jbHVkZSBjb21tb24KK21hcCAweDQyZgorZXhjbGFtIDB4MDIgc2hpZnQKK2F0IDB4MDMgc2hpZnQKK2RvdWJsZWxvd3F1b3RlbWFyayAweDAzIHNoaWZ0IGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK3BlcmNlbnQgMHgwNiBzaGlmdAorYXNjaWljaXJjdW0gMHgwNyBzaGlmdAorYW1wZXJzYW5kIDB4MDggc2hpZnQKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK3BhcmVubGVmdCAweDBhIHNoaWZ0CitwYXJlbnJpZ2h0IDB4MGIgc2hpZnQKK21pbnVzIDB4MGMKK3VuZGVyc2NvcmUgMHgwYyBzaGlmdAorZXF1YWwgMHgwZAorcGx1cyAweDBkIHNoaWZ0CitDeXJpbGxpY19samUgMHgxMCBhbHRncgorQ3lyaWxsaWNfTEpFIDB4MTAgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX25qZSAweDExIGFsdGdyCitDeXJpbGxpY19OSkUgMHgxMSBzaGlmdCBhbHRncgorQ3lyaWxsaWNfaWUgMHgxMiBhbHRncgorQ3lyaWxsaWNfSUUgMHgxMiBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZXIgMHgxMyBhbHRncgorQ3lyaWxsaWNfRVIgMHgxMyBzaGlmdCBhbHRncgorQ3lyaWxsaWNfdGUgMHgxNCBhbHRncgorQ3lyaWxsaWNfVEUgMHgxNCBzaGlmdCBhbHRncgorTWFjZWRvbmlhX2RzZSAweDE1IGFsdGdyCitNYWNlZG9uaWFfRFNFIDB4MTUgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX3UgMHgxNiBhbHRncgorQ3lyaWxsaWNfVSAweDE2IHNoaWZ0IGFsdGdyCitDeXJpbGxpY19pIDB4MTcgYWx0Z3IKK0N5cmlsbGljX0kgMHgxNyBzaGlmdCBhbHRncgorQ3lyaWxsaWNfbyAweDE4IGFsdGdyCitDeXJpbGxpY19PIDB4MTggc2hpZnQgYWx0Z3IKK0N5cmlsbGljX3BlIDB4MTkgYWx0Z3IKK0N5cmlsbGljX1BFIDB4MTkgc2hpZnQgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MWEKK2JyYWNlbGVmdCAweDFhIHNoaWZ0CitDeXJpbGxpY19zaGEgMHgxYSBhbHRncgorQ3lyaWxsaWNfU0hBIDB4MWEgc2hpZnQgYWx0Z3IKK2JyYWNrZXRyaWdodCAweDFiCiticmFjZXJpZ2h0IDB4MWIgc2hpZnQKK01hY2Vkb25pYV9namUgMHgxYiBhbHRncgorTWFjZWRvbmlhX0dKRSAweDFiIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19hIDB4MWUgYWx0Z3IKK0N5cmlsbGljX0EgMHgxZSBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZXMgMHgxZiBhbHRncgorQ3lyaWxsaWNfRVMgMHgxZiBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZGUgMHgyMCBhbHRncgorQ3lyaWxsaWNfREUgMHgyMCBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZWYgMHgyMSBhbHRncgorQ3lyaWxsaWNfRUYgMHgyMSBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZ2hlIDB4MjIgYWx0Z3IKK0N5cmlsbGljX0dIRSAweDIyIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19oYSAweDIzIGFsdGdyCitDeXJpbGxpY19IQSAweDIzIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19qZSAweDI0IGFsdGdyCitDeXJpbGxpY19KRSAweDI0IHNoaWZ0IGFsdGdyCitDeXJpbGxpY19rYSAweDI1IGFsdGdyCitDeXJpbGxpY19LQSAweDI1IHNoaWZ0IGFsdGdyCitDeXJpbGxpY19lbCAweDI2IGFsdGdyCitDeXJpbGxpY19FTCAweDI2IHNoaWZ0IGFsdGdyCitzZW1pY29sb24gMHgyNworY29sb24gMHgyNyBzaGlmdAorQ3lyaWxsaWNfY2hlIDB4MjcgYWx0Z3IKK0N5cmlsbGljX0NIRSAweDI3IHNoaWZ0IGFsdGdyCithcG9zdHJvcGhlIDB4MjgKK3F1b3RlZGJsIDB4Mjggc2hpZnQKK01hY2Vkb25pYV9ramUgMHgyOCBhbHRncgorTWFjZWRvbmlhX0tKRSAweDI4IHNoaWZ0IGFsdGdyCitncmF2ZSAweDI5Cithc2NpaXRpbGRlIDB4Mjkgc2hpZnQKK2JhY2tzbGFzaCAweDJiCitiYXIgMHgyYiBzaGlmdAorQ3lyaWxsaWNfemhlIDB4MmIgYWx0Z3IKK0N5cmlsbGljX1pIRSAweDJiIHNoaWZ0IGFsdGdyCitDeXJpbGxpY196ZSAweDJjIGFsdGdyCitDeXJpbGxpY19aRSAweDJjIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19kemhlIDB4MmQgYWx0Z3IKK0N5cmlsbGljX0RaSEUgMHgyZCBzaGlmdCBhbHRncgorQ3lyaWxsaWNfdHNlIDB4MmUgYWx0Z3IKK0N5cmlsbGljX1RTRSAweDJlIHNoaWZ0IGFsdGdyCitDeXJpbGxpY192ZSAweDJmIGFsdGdyCitDeXJpbGxpY19WRSAweDJmIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19iZSAweDMwIGFsdGdyCitDeXJpbGxpY19CRSAweDMwIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19lbiAweDMxIGFsdGdyCitDeXJpbGxpY19FTiAweDMxIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19lbSAweDMyIGFsdGdyCitDeXJpbGxpY19FTSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitsZXNzIDB4MzMgc2hpZnQKK3NlbWljb2xvbiAweDMzIHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNAorZ3JlYXRlciAweDM0IHNoaWZ0Citjb2xvbiAweDM0IHNoaWZ0IGFsdGdyCitzbGFzaCAweDM1CitxdWVzdGlvbiAweDM1IHNoaWZ0CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9tb2RpZmllcnMgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9tb2RpZmllcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYjdhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL21vZGlmaWVycwpAQCAtMCwwICsxLDE4IEBACitTaGlmdF9SIDB4MzYKK1NoaWZ0X0wgMHgyYQorCitBbHRfUiAweGI4CitNb2RlX3N3aXRjaCAweGI4CitJU09fTGV2ZWwzX1NoaWZ0IDB4YjgKK0FsdF9MIDB4MzgKKworQ29udHJvbF9SIDB4OWQKK0NvbnRyb2xfTCAweDFkCisKKyMgVHJhbnNsYXRlIFN1cGVyIHRvIFdpbmRvd3Mga2V5cy4KKyMgVGhpcyBpcyBoYXJkY29kZWQuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgorU3VwZXJfUiAweGRjCitTdXBlcl9MIDB4ZGIKKworIyBUcmFuc2xhdGUgTWVudSB0byB0aGUgV2luZG93cyBBcHBsaWNhdGlvbiBrZXkuCitNZW51IDB4ZGQKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25sIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4OTJmOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25sCkBAIC0wLDAgKzEsNTkgQEAKKyMgRHV0Y2ggKE5ldGhlcmxhbmRzKQoraW5jbHVkZSBjb21tb24KK21hcCAweDQxMworCitleGNsYW0gMHgwMiBzaGlmdAorb25lc3VwZXJpb3IgMHgwMiBhbHRncgorcXVvdGVibCAweDAzIHNoaWZ0Cit0d29zdXBlcmlvciAweDAzIGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK3RocmVlc3VwZXJpb3IgMHgwNCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK29uZXF1YXJ0ZXIgMHgwNSBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Cit0aHJlZXF1YXJ0ZXJzIDB4MDcgYWx0Z3IKK3VuZGVyc2NvcmUgMHgwOCBzaGlmdAorc3RlcmxpbmcgMHgwOCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK2JyYWNlbGVmdCAweDA5IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK2JyYWNlcmlnaHQgMHgwYSBhbHRncgorYXBvc3Ryb3BoZSAweDBiIHNoaWZ0CitzbGFzaCAweDBjCitxdWVzdGlvbiAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorZGVncmVlIDB4MGQKK2RlYWRfdGlsZGUgMHgwZCBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MGQgYWx0Z3IKK0V1cm9TaWduIDB4MTIgYWx0Z3IKK3BhcmFncmFwaCAweDEzIGFsdGdyCitkZWFkX2RpYWVyZXNpcyAweDFhCitkZWFkX2NpcmN1bWZsZXggMHgxYSBzaGlmdAorYXN0ZXJpc2sgMHgxYgorYmFyIDB4MWIgc2hpZnQKK3NzaGFycCAweDFmIGFsdGdyCitwbHVzIDB4MjcKK3BsdXNtaW51cyAweDI3IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjgKK2RlYWRfZ3JhdmUgMHgyOCBzaGlmdAorYXQgMHgyOQorc2VjdGlvbiAweDI5IHNoaWZ0Citub3RzaWduIDB4MjkgYWx0Z3IKK2xlc3MgMHgyYgorZ3JlYXRlciAweDJiIHNoaWZ0CitndWlsbGVtb3RsZWZ0IDB4MmMgYWx0Z3IKK2d1aWxsZW1vdHJpZ2h0IDB4MmQgYWx0Z3IKK2NvcHlyaWdodCAweDJlIGFsdGdyCittdSAweDMyIGFsdGdyCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAorcGVyaW9kIDB4MzQKK2NvbG9uIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2h5cGhlbiAweDM1CitlcXVhbCAweDM1IHNoaWZ0CiticmFja2V0cmlnaHQgMHg1NgorYnJhY2tldGxlZnQgMHg1NiBzaGlmdAorYnJva2VuYmFyIDB4NTYgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25sLWJlIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbmwtYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmYzg4MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25sLWJlCkBAIC0wLDAgKzEsMyBAQAorIyBEdXRjaCAoQmVsZ2l1bSkKK21hcCAweDgxMworaW5jbHVkZSBjb21tb24KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25vIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvbm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhNjQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL25vCkBAIC0wLDAgKzEsMTE5IEBACisjIGdlbmVyYXRlZCBmcm9tIFhLQiBtYXAgbm8KK2luY2x1ZGUgY29tbW9uCittYXAgMHg0MTQKK2V4Y2xhbSAweDAyIHNoaWZ0CitleGNsYW1kb3duIDB4MDIgYWx0Z3IKK29uZXN1cGVyaW9yIDB4MDIgc2hpZnQgYWx0Z3IKK3F1b3RlZGJsIDB4MDMgc2hpZnQKK2F0IDB4MDMgYWx0Z3IKK3R3b3N1cGVyaW9yIDB4MDMgc2hpZnQgYWx0Z3IKK251bWJlcnNpZ24gMHgwNCBzaGlmdAorc3RlcmxpbmcgMHgwNCBhbHRncgordGhyZWVzdXBlcmlvciAweDA0IHNoaWZ0IGFsdGdyCitjdXJyZW5jeSAweDA1IHNoaWZ0Citkb2xsYXIgMHgwNSBhbHRncgorb25lcXVhcnRlciAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgorY2VudCAweDA2IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwNyBzaGlmdAoreWVuIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitkaXZpc2lvbiAweDA4IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwOSBzaGlmdAorYnJhY2tldGxlZnQgMHgwOSBhbHRncgorZ3VpbGxlbW90bGVmdCAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweDBhIGFsdGdyCitndWlsbGVtb3RyaWdodCAweDBhIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCitwbHVzIDB4MGMKK3F1ZXN0aW9uIDB4MGMgc2hpZnQKK3BsdXNtaW51cyAweDBjIGFsdGdyCitxdWVzdGlvbmRvd24gMHgwYyBzaGlmdCBhbHRncgorYmFja3NsYXNoIDB4MGQKK2RlYWRfZ3JhdmUgMHgwZCBzaGlmdAorZGVhZF9hY3V0ZSAweDBkIGFsdGdyCitub3RzaWduIDB4MGQgc2hpZnQgYWx0Z3IKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitjZW50IDB4MTIgc2hpZnQgYWx0Z3IKK3JlZ2lzdGVyZWQgMHgxMyBhbHRncgordGhvcm4gMHgxNCBhbHRncgorVEhPUk4gMHgxNCBzaGlmdCBhbHRncgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29lIDB4MTggYWx0Z3IKK09FIDB4MTggc2hpZnQgYWx0Z3IKK3Rob3JuIDB4MTkgYWx0Z3IKK1RIT1JOIDB4MTkgc2hpZnQgYWx0Z3IKK2FyaW5nIDB4MWEKK0FyaW5nIDB4MWEgc2hpZnQKK2RlYWRfZGlhZXJlc2lzIDB4MWEgYWx0Z3IKK2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK2RlYWRfZGlhZXJlc2lzIDB4MWIKK2RlYWRfY2lyY3VtZmxleCAweDFiIHNoaWZ0Cithc2NpaWNpcmN1bSAweDAxYiBzaGlmdAorZGVhZF90aWxkZSAweDFiIGFsdGdyCithc2NpaXRpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfY2Fyb24gMHgxYiBzaGlmdCBhbHRncgorb3JkZmVtaW5pbmUgMHgxZSBhbHRncgorbWFzY3VsaW5lIDB4MWUgc2hpZnQgYWx0Z3IKK3NzaGFycCAweDFmIGFsdGdyCitzZWN0aW9uIDB4MWYgc2hpZnQgYWx0Z3IKK2V0aCAweDIwIGFsdGdyCitFVEggMHgyMCBzaGlmdCBhbHRncgorZHN0cm9rZSAweDIxIGFsdGdyCitvcmRmZW1pbmluZSAweDIxIHNoaWZ0IGFsdGdyCitlbmcgMHgyMiBhbHRncgorRU5HIDB4MjIgc2hpZnQgYWx0Z3IKK2hzdHJva2UgMHgyMyBhbHRncgorSHN0cm9rZSAweDIzIHNoaWZ0IGFsdGdyCitrcmEgMHgyNSBhbHRncgorbHN0cm9rZSAweDI2IGFsdGdyCitMc3Ryb2tlIDB4MjYgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDI3CitPb2JsaXF1ZSAweDI3IHNoaWZ0CitkZWFkX2RvdWJsZWFjdXRlIDB4Mjcgc2hpZnQgYWx0Z3IKK2FlIDB4MjgKK0FFIDB4Mjggc2hpZnQKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgorYmFyIDB4MjkKK3NlY3Rpb24gMHgyOSBzaGlmdAorYnJva2VuYmFyIDB4MjkgYWx0Z3IKK3BhcmFncmFwaCAweDI5IHNoaWZ0IGFsdGdyCithcG9zdHJvcGhlIDB4MmIKK2FzdGVyaXNrIDB4MmIgc2hpZnQKK211bHRpcGx5IDB4MmIgc2hpZnQgYWx0Z3IKK2d1aWxsZW1vdGxlZnQgMHgyYyBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorY29weXJpZ2h0IDB4MmUgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorbXUgMHgzMiBhbHRncgorbWFzY3VsaW5lIDB4MzIgc2hpZnQgYWx0Z3IKK2NvbW1hIDB4MzMKK3NlbWljb2xvbiAweDMzIHNoaWZ0CitkZWFkX2NlZGlsbGEgMHgzMyBhbHRncgorZGVhZF9vZ29uZWsgMHgzMyBzaGlmdCBhbHRncgorcGVyaW9kIDB4MzQKK2NvbG9uIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RlYWRfYWJvdmVkb3QgMHgzNCBzaGlmdCBhbHRncgorbWludXMgMHgzNQordW5kZXJzY29yZSAweDM1IHNoaWZ0CitoeXBoZW4gMHgzNSBhbHRncgorbWFjcm9uIDB4MzUgc2hpZnQgYWx0Z3IKK25vYnJlYWtzcGFjZSAweDM5IGFsdGdyCitvbmVoYWxmIDB4NTYgYWx0Z3IKK3RocmVlcXVhcnRlcnMgMHg1NiBzaGlmdCBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvcGwgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWM2MDBkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvcGwKQEAgLTAsMCArMSwxMjIgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBwbAoraW5jbHVkZSBjb21tb24KK21hcCAweDQxNQorZXhjbGFtIDB4MDIgc2hpZnQKK29uZXN1cGVyaW9yIDB4MDIgYWx0Z3IKK2V4Y2xhbWRvd24gMHgwMiBzaGlmdCBhbHRncgorYXQgMHgwMyBzaGlmdAordHdvc3VwZXJpb3IgMHgwMyBhbHRncgorb25lZWlnaHRoIDB4MDMgc2hpZnQgYWx0Z3IKK251bWJlcnNpZ24gMHgwNCBzaGlmdAordGhyZWVzdXBlcmlvciAweDA0IGFsdGdyCitzdGVybGluZyAweDA0IHNoaWZ0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorb25lcXVhcnRlciAweDA1IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgordGhyZWVlaWdodGhzIDB4MDYgc2hpZnQgYWx0Z3IKK2FzY2lpY2lyY3VtIDB4MDcgc2hpZnQKK3RocmVlcXVhcnRlcnMgMHgwNyBhbHRncgorZml2ZWVpZ2h0aHMgMHgwNyBzaGlmdCBhbHRncgorYW1wZXJzYW5kIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitzZXZlbmVpZ2h0aHMgMHgwOCBzaGlmdCBhbHRncgorYXN0ZXJpc2sgMHgwOSBzaGlmdAorYnJhY2tldGxlZnQgMHgwOSBhbHRncgordHJhZGVtYXJrIDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVubGVmdCAweDBhIHNoaWZ0CiticmFja2V0cmlnaHQgMHgwYSBhbHRncgorcGx1c21pbnVzIDB4MGEgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyCitkZWdyZWUgMHgwYiBzaGlmdCBhbHRncgorbWludXMgMHgwYwordW5kZXJzY29yZSAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorcXVlc3Rpb25kb3duIDB4MGMgc2hpZnQgYWx0Z3IKK2VxdWFsIDB4MGQKK3BsdXMgMHgwZCBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MGQgYWx0Z3IKK2RlYWRfb2dvbmVrIDB4MGQgc2hpZnQgYWx0Z3IKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitlb2dvbmVrIDB4MTIgYWx0Z3IKK0VvZ29uZWsgMHgxMiBzaGlmdCBhbHRncgorcGFyYWdyYXBoIDB4MTMgYWx0Z3IKK3JlZ2lzdGVyZWQgMHgxMyBzaGlmdCBhbHRncgordHNsYXNoIDB4MTQgYWx0Z3IKK1RzbGFzaCAweDE0IHNoaWZ0IGFsdGdyCitsZWZ0YXJyb3cgMHgxNSBhbHRncgoreWVuIDB4MTUgc2hpZnQgYWx0Z3IKK0V1cm9TaWduIDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgorcmlnaHRhcnJvdyAweDE3IGFsdGdyCitpZG90bGVzcyAweDE3IHNoaWZ0IGFsdGdyCitvYWN1dGUgMHgxOCBhbHRncgorT2FjdXRlIDB4MTggc2hpZnQgYWx0Z3IKK3Rob3JuIDB4MTkgYWx0Z3IKK1RIT1JOIDB4MTkgc2hpZnQgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MWEKK2JyYWNlbGVmdCAweDFhIHNoaWZ0CitkZWFkX2RpYWVyZXNpcyAweDFhIGFsdGdyCitkZWFkX2Fib3ZlcmluZyAweDFhIHNoaWZ0IGFsdGdyCiticmFja2V0cmlnaHQgMHgxYgorYnJhY2VyaWdodCAweDFiIHNoaWZ0CitkZWFkX3RpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK2FvZ29uZWsgMHgxZSBhbHRncgorQW9nb25layAweDFlIHNoaWZ0IGFsdGdyCitzYWN1dGUgMHgxZiBhbHRncgorU2FjdXRlIDB4MWYgc2hpZnQgYWx0Z3IKK2V0aCAweDIwIGFsdGdyCitFVEggMHgyMCBzaGlmdCBhbHRncgorZHN0cm9rZSAweDIxIGFsdGdyCitvcmRmZW1pbmluZSAweDIxIHNoaWZ0IGFsdGdyCitlbmcgMHgyMiBhbHRncgorRU5HIDB4MjIgc2hpZnQgYWx0Z3IKK2hzdHJva2UgMHgyMyBhbHRncgorSHN0cm9rZSAweDIzIHNoaWZ0IGFsdGdyCitrcmEgMHgyNSBhbHRncgorbHN0cm9rZSAweDI2IGFsdGdyCitMc3Ryb2tlIDB4MjYgc2hpZnQgYWx0Z3IKK3NlbWljb2xvbiAweDI3Citjb2xvbiAweDI3IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjcgYWx0Z3IKK2RlYWRfZG91YmxlYWN1dGUgMHgyNyBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDI4CitxdW90ZWRibCAweDI4IHNoaWZ0CitkZWFkX2NpcmN1bWZsZXggMHgyOCBhbHRncgorZGVhZF9jYXJvbiAweDI4IHNoaWZ0IGFsdGdyCitncmF2ZSAweDI5Cithc2NpaXRpbGRlIDB4Mjkgc2hpZnQKK25vdHNpZ24gMHgyOSBhbHRncgorYmFja3NsYXNoIDB4MmIKK2JhciAweDJiIHNoaWZ0CitkZWFkX2dyYXZlIDB4MmIgYWx0Z3IKK2RlYWRfYnJldmUgMHgyYiBzaGlmdCBhbHRncgoremFib3ZlZG90IDB4MmMgYWx0Z3IKK1phYm92ZWRvdCAweDJjIHNoaWZ0IGFsdGdyCit6YWN1dGUgMHgyZCBhbHRncgorWmFjdXRlIDB4MmQgc2hpZnQgYWx0Z3IKK2NhY3V0ZSAweDJlIGFsdGdyCitDYWN1dGUgMHgyZSBzaGlmdCBhbHRncgorbGVmdGRvdWJsZXF1b3RlbWFyayAweDJmIGFsdGdyCitncmF2ZSAweDJmIHNoaWZ0IGFsdGdyCityaWdodGRvdWJsZXF1b3RlbWFyayAweDMwIGFsdGdyCituYWN1dGUgMHgzMSBhbHRncgorTmFjdXRlIDB4MzEgc2hpZnQgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK21hc2N1bGluZSAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitsZXNzIDB4MzMgc2hpZnQKK2hvcml6Y29ubmVjdG9yIDB4MzMgYWx0Z3IKK211bHRpcGx5IDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RpdmlzaW9uIDB4MzQgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MzUKK3F1ZXN0aW9uIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgorZGVhZF9hYm92ZWRvdCAweDM1IHNoaWZ0IGFsdGdyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9wdCBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL3B0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OTQxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9wdApAQCAtMCwwICsxLDExMyBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIHB0CitpbmNsdWRlIGNvbW1vbgorbWFwIDB4ODE2CitleGNsYW0gMHgwMiBzaGlmdAorb25lc3VwZXJpb3IgMHgwMiBhbHRncgorZXhjbGFtZG93biAweDAyIHNoaWZ0IGFsdGdyCitxdW90ZWRibCAweDAzIHNoaWZ0CithdCAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorbnVtYmVyc2lnbiAweDA0IHNoaWZ0CitzdGVybGluZyAweDA0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorc2VjdGlvbiAweDA1IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK29uZWhhbGYgMHgwNiBhbHRncgordGhyZWVlaWdodGhzIDB4MDYgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA3IHNoaWZ0Cit0aHJlZXF1YXJ0ZXJzIDB4MDcgYWx0Z3IKK2ZpdmVlaWdodGhzIDB4MDcgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCitzZXZlbmVpZ2h0aHMgMHgwOCBzaGlmdCBhbHRncgorcGFyZW5sZWZ0IDB4MDkgc2hpZnQKK2JyYWNrZXRsZWZ0IDB4MDkgYWx0Z3IKK3RyYWRlbWFyayAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbnJpZ2h0IDB4MGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweDBhIGFsdGdyCitwbHVzbWludXMgMHgwYSBzaGlmdCBhbHRncgorZXF1YWwgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyCitkZWdyZWUgMHgwYiBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDBjCitxdWVzdGlvbiAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorcXVlc3Rpb25kb3duIDB4MGMgc2hpZnQgYWx0Z3IKK2d1aWxsZW1vdGxlZnQgMHgwZAorZ3VpbGxlbW90cmlnaHQgMHgwZCBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MGQgYWx0Z3IKK2RlYWRfb2dvbmVrIDB4MGQgc2hpZnQgYWx0Z3IKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitjZW50IDB4MTIgc2hpZnQgYWx0Z3IKK3BhcmFncmFwaCAweDEzIGFsdGdyCityZWdpc3RlcmVkIDB4MTMgc2hpZnQgYWx0Z3IKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgorbGVmdGFycm93IDB4MTUgYWx0Z3IKK3llbiAweDE1IHNoaWZ0IGFsdGdyCitkb3duYXJyb3cgMHgxNiBhbHRncgordXBhcnJvdyAweDE2IHNoaWZ0IGFsdGdyCityaWdodGFycm93IDB4MTcgYWx0Z3IKK2lkb3RsZXNzIDB4MTcgc2hpZnQgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCitwbHVzIDB4MWEKK2FzdGVyaXNrIDB4MWEgc2hpZnQKK2RlYWRfZGlhZXJlc2lzIDB4MWEgYWx0Z3IKK2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK2RlYWRfYWN1dGUgMHgxYgorZGVhZF9ncmF2ZSAweDFiIHNoaWZ0CitkZWFkX3RpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK2FlIDB4MWUgYWx0Z3IKK0FFIDB4MWUgc2hpZnQgYWx0Z3IKK3NzaGFycCAweDFmIGFsdGdyCitldGggMHgyMCBhbHRncgorRVRIIDB4MjAgc2hpZnQgYWx0Z3IKK2RzdHJva2UgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorZW5nIDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgora3JhIDB4MjUgYWx0Z3IKK2xzdHJva2UgMHgyNiBhbHRncgorTHN0cm9rZSAweDI2IHNoaWZ0IGFsdGdyCitjY2VkaWxsYSAweDI3CitDY2VkaWxsYSAweDI3IHNoaWZ0CitkZWFkX2RvdWJsZWFjdXRlIDB4Mjcgc2hpZnQgYWx0Z3IKK21hc2N1bGluZSAweDI4CitvcmRmZW1pbmluZSAweDI4IHNoaWZ0CitkZWFkX2NpcmN1bWZsZXggMHgyOCBhbHRncgorZGVhZF9jYXJvbiAweDI4IHNoaWZ0IGFsdGdyCitiYWNrc2xhc2ggMHgyOQorYmFyIDB4Mjkgc2hpZnQKK25vdHNpZ24gMHgyOSBhbHRncgorZGVhZF90aWxkZSAweDJiCitkZWFkX2NpcmN1bWZsZXggMHgyYiBzaGlmdAorZGVhZF9icmV2ZSAweDJiIHNoaWZ0IGFsdGdyCitsZXNzIDB4NTYKK2dyZWF0ZXIgMHg1NiBzaGlmdAorY2VudCAweDJlIGFsdGdyCitjb3B5cmlnaHQgMHgyZSBzaGlmdCBhbHRncgorbGVmdGRvdWJsZXF1b3RlbWFyayAweDJmIGFsdGdyCitncmF2ZSAweDJmIHNoaWZ0IGFsdGdyCityaWdodGRvdWJsZXF1b3RlbWFyayAweDMwIGFsdGdyCittdSAweDMyIGFsdGdyCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAoraG9yaXpjb25uZWN0b3IgMHgzMyBhbHRncgorbXVsdGlwbHkgMHgzMyBzaGlmdCBhbHRncgorcGVyaW9kIDB4MzQKK2NvbG9uIDB4MzQgc2hpZnQKK3BlcmlvZGNlbnRlcmVkIDB4MzQgYWx0Z3IKK2RpdmlzaW9uIDB4MzQgc2hpZnQgYWx0Z3IKK21pbnVzIDB4MzUKK3VuZGVyc2NvcmUgMHgzNSBzaGlmdAorZGVhZF9iZWxvd2RvdCAweDM1IGFsdGdyCitkZWFkX2Fib3ZlZG90IDB4MzUgc2hpZnQgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL3B0LWJyIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvcHQtYnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiYWZjNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL3B0LWJyCkBAIC0wLDAgKzEsNjkgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCBicgoraW5jbHVkZSBjb21tb24KK21hcCAweDQxNgorZXhjbGFtIDB4MDIgc2hpZnQKK29uZXN1cGVyaW9yIDB4MDIgYWx0Z3IKK2V4Y2xhbWRvd24gMHgwMiBzaGlmdCBhbHRncgorYXQgMHgwMyBzaGlmdAordHdvc3VwZXJpb3IgMHgwMyBhbHRncgorb25laGFsZiAweDAzIHNoaWZ0IGFsdGdyCitudW1iZXJzaWduIDB4MDQgc2hpZnQKK3RocmVlc3VwZXJpb3IgMHgwNCBhbHRncgordGhyZWVxdWFydGVycyAweDA0IHNoaWZ0IGFsdGdyCitkb2xsYXIgMHgwNSBzaGlmdAorc3RlcmxpbmcgMHgwNSBhbHRncgorb25lcXVhcnRlciAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK2NlbnQgMHgwNiBhbHRncgorZGVhZF9kaWFlcmVzaXMgMHgwNyBzaGlmdAorbm90c2lnbiAweDA3IGFsdGdyCitkaWFlcmVzaXMgMHgwNyBzaGlmdCBhbHRncgorYW1wZXJzYW5kIDB4MDggc2hpZnQKK2JyYWNlbGVmdCAweDA4IGFsdGdyCithc3RlcmlzayAweDA5IHNoaWZ0CiticmFja2V0bGVmdCAweDA5IGFsdGdyCitwYXJlbmxlZnQgMHgwYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MGEgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYiBzaGlmdAorYnJhY2VyaWdodCAweDBiIGFsdGdyCittaW51cyAweDBjCit1bmRlcnNjb3JlIDB4MGMgc2hpZnQKK2JhY2tzbGFzaCAweDBjIGFsdGdyCitlcXVhbCAweDBkCitwbHVzIDB4MGQgc2hpZnQKK3NlY3Rpb24gMHgwZCBhbHRncgorRXVyb1NpZ24gMHgxMiBhbHRncgorcmVnaXN0ZXJlZCAweDEzIGFsdGdyCitkZWFkX2FjdXRlIDB4MWEKK2RlYWRfZ3JhdmUgMHgxYSBzaGlmdAorYWN1dGUgMHgxYSBhbHRncgorZ3JhdmUgMHgxYSBzaGlmdCBhbHRncgorYnJhY2tldGxlZnQgMHgxYgorYnJhY2VsZWZ0IDB4MWIgc2hpZnQKK29yZGZlbWluaW5lIDB4MWIgYWx0Z3IKK2NjZWRpbGxhIDB4MjcKK0NjZWRpbGxhIDB4Mjcgc2hpZnQKK2RlYWRfdGlsZGUgMHgyOAorZGVhZF9jaXJjdW1mbGV4IDB4Mjggc2hpZnQKK2FzY2lpdGlsZGUgMHgyOCBhbHRncgorYXNjaWljaXJjdW0gMHgyOCBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDI5CitxdW90ZWRibCAweDI5IHNoaWZ0CiticmFja2V0cmlnaHQgMHgyYgorYnJhY2VyaWdodCAweDJiIHNoaWZ0CittYXNjdWxpbmUgMHgyYiBhbHRncgorY29weXJpZ2h0IDB4MmUgYWx0Z3IKK211IDB4MzIgYWx0Z3IKK2NvbW1hIDB4MzMKK2xlc3MgMHgzMyBzaGlmdAorcGVyaW9kIDB4MzQKK2dyZWF0ZXIgMHgzNCBzaGlmdAorc2VtaWNvbG9uIDB4MzUKK2NvbG9uIDB4MzUgc2hpZnQKK2NvbW1hIDB4NTMgbnVtbG9jaworYmFja3NsYXNoIDB4NTYKK2JhciAweDU2IHNoaWZ0CitzbGFzaCAweDczCitxdWVzdGlvbiAweDczIHNoaWZ0CitkZWdyZWUgMHg3MyBhbHRncgorS1BfRGVjaW1hbCAweDM0CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9ydSBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL3J1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZTdkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9ydQpAQCAtMCwwICsxLDEwOSBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIHJ1CitpbmNsdWRlIGNvbW1vbgorbWFwIDB4NDE5CitleGNsYW0gMHgwMiBzaGlmdAorYXQgMHgwMyBzaGlmdAorcXVvdGVkYmwgMHgwMyBzaGlmdCBhbHRncgorbnVtYmVyc2lnbiAweDA0IHNoaWZ0Citkb2xsYXIgMHgwNSBzaGlmdAorYXN0ZXJpc2sgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0Citjb2xvbiAweDA2IHNoaWZ0IGFsdGdyCithc2NpaWNpcmN1bSAweDA3IHNoaWZ0Citjb21tYSAweDA3IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwOCBzaGlmdAorcGVyaW9kIDB4MDggc2hpZnQgYWx0Z3IKK2FzdGVyaXNrIDB4MDkgc2hpZnQKK3NlbWljb2xvbiAweDA5IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwYSBzaGlmdAorcGFyZW5yaWdodCAweDBiIHNoaWZ0CittaW51cyAweDBjCit1bmRlcnNjb3JlIDB4MGMgc2hpZnQKK2VxdWFsIDB4MGQKK3BsdXMgMHgwZCBzaGlmdAorQ3lyaWxsaWNfc2hvcnRpIDB4MTAgYWx0Z3IKK0N5cmlsbGljX1NIT1JUSSAweDEwIHNoaWZ0IGFsdGdyCitDeXJpbGxpY190c2UgMHgxMSBhbHRncgorQ3lyaWxsaWNfVFNFIDB4MTEgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX3UgMHgxMiBhbHRncgorQ3lyaWxsaWNfVSAweDEyIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19rYSAweDEzIGFsdGdyCitDeXJpbGxpY19LQSAweDEzIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19pZSAweDE0IGFsdGdyCitDeXJpbGxpY19JRSAweDE0IHNoaWZ0IGFsdGdyCitDeXJpbGxpY19lbiAweDE1IGFsdGdyCitDeXJpbGxpY19FTiAweDE1IHNoaWZ0IGFsdGdyCitDeXJpbGxpY19naGUgMHgxNiBhbHRncgorQ3lyaWxsaWNfR0hFIDB4MTYgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX3NoYSAweDE3IGFsdGdyCitDeXJpbGxpY19TSEEgMHgxNyBzaGlmdCBhbHRncgorQ3lyaWxsaWNfc2hjaGEgMHgxOCBhbHRncgorQ3lyaWxsaWNfU0hDSEEgMHgxOCBzaGlmdCBhbHRncgorQ3lyaWxsaWNfemUgMHgxOSBhbHRncgorQ3lyaWxsaWNfWkUgMHgxOSBzaGlmdCBhbHRncgorYnJhY2tldGxlZnQgMHgxYQorYnJhY2VsZWZ0IDB4MWEgc2hpZnQKK0N5cmlsbGljX2hhIDB4MWEgYWx0Z3IKK0N5cmlsbGljX0hBIDB4MWEgc2hpZnQgYWx0Z3IKK2JyYWNrZXRyaWdodCAweDFiCiticmFjZXJpZ2h0IDB4MWIgc2hpZnQKK0N5cmlsbGljX2hhcmRzaWduIDB4MWIgYWx0Z3IKK0N5cmlsbGljX0hBUkRTSUdOIDB4MWIgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2VmIDB4MWUgYWx0Z3IKK0N5cmlsbGljX0VGIDB4MWUgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX3llcnUgMHgxZiBhbHRncgorQ3lyaWxsaWNfWUVSVSAweDFmIHNoaWZ0IGFsdGdyCitDeXJpbGxpY192ZSAweDIwIGFsdGdyCitDeXJpbGxpY19WRSAweDIwIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19hIDB4MjEgYWx0Z3IKK0N5cmlsbGljX0EgMHgyMSBzaGlmdCBhbHRncgorQ3lyaWxsaWNfcGUgMHgyMiBhbHRncgorQ3lyaWxsaWNfUEUgMHgyMiBzaGlmdCBhbHRncgorQ3lyaWxsaWNfZXIgMHgyMyBhbHRncgorQ3lyaWxsaWNfRVIgMHgyMyBzaGlmdCBhbHRncgorQ3lyaWxsaWNfbyAweDI0IGFsdGdyCitDeXJpbGxpY19PIDB4MjQgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2VsIDB4MjUgYWx0Z3IKK0N5cmlsbGljX0VMIDB4MjUgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2RlIDB4MjYgYWx0Z3IKK0N5cmlsbGljX0RFIDB4MjYgc2hpZnQgYWx0Z3IKK3NlbWljb2xvbiAweDI3Citjb2xvbiAweDI3IHNoaWZ0CitDeXJpbGxpY196aGUgMHgyNyBhbHRncgorQ3lyaWxsaWNfWkhFIDB4Mjcgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgyOAorcXVvdGVkYmwgMHgyOCBzaGlmdAorQ3lyaWxsaWNfZSAweDI4IGFsdGdyCitDeXJpbGxpY19FIDB4Mjggc2hpZnQgYWx0Z3IKK2dyYXZlIDB4MjkKK2FzY2lpdGlsZGUgMHgyOSBzaGlmdAorQ3lyaWxsaWNfaW8gMHgyOSBhbHRncgorQ3lyaWxsaWNfSU8gMHgyOSBzaGlmdCBhbHRncgorYmFja3NsYXNoIDB4MmIKK2JhciAweDJiIHNoaWZ0CitDeXJpbGxpY195YSAweDJjIGFsdGdyCitDeXJpbGxpY19ZQSAweDJjIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19jaGUgMHgyZCBhbHRncgorQ3lyaWxsaWNfQ0hFIDB4MmQgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2VzIDB4MmUgYWx0Z3IKK0N5cmlsbGljX0VTIDB4MmUgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2VtIDB4MmYgYWx0Z3IKK0N5cmlsbGljX0VNIDB4MmYgc2hpZnQgYWx0Z3IKK0N5cmlsbGljX2kgMHgzMCBhbHRncgorQ3lyaWxsaWNfSSAweDMwIHNoaWZ0IGFsdGdyCitDeXJpbGxpY190ZSAweDMxIGFsdGdyCitDeXJpbGxpY19URSAweDMxIHNoaWZ0IGFsdGdyCitDeXJpbGxpY19zb2Z0c2lnbiAweDMyIGFsdGdyCitDeXJpbGxpY19TT0ZUU0lHTiAweDMyIHNoaWZ0IGFsdGdyCitjb21tYSAweDMzCitsZXNzIDB4MzMgc2hpZnQKK0N5cmlsbGljX2JlIDB4MzMgYWx0Z3IKK0N5cmlsbGljX0JFIDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK0N5cmlsbGljX3l1IDB4MzQgYWx0Z3IKK0N5cmlsbGljX1lVIDB4MzQgc2hpZnQgYWx0Z3IKK3NsYXNoIDB4MzUKK3F1ZXN0aW9uIDB4MzUgc2hpZnQKK3NsYXNoIDB4NTYgYWx0Z3IKK2JhciAweDU2IHNoaWZ0IGFsdGdyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9zbCBiL2FuZHJvaWQvcWVtdTEvcGMtYmlvcy9rZXltYXBzL3NsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODM1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9zbApAQCAtMCwwICsxLDExMCBAQAorIyBnZW5lcmF0ZWQgZnJvbSBYS0IgbWFwIHNsCitpbmNsdWRlIGNvbW1vbgorbWFwIDB4NDI0CitleGNsYW0gMHgwMiBzaGlmdAorYXNjaWl0aWxkZSAweDAyIGFsdGdyCitkZWFkX3RpbGRlIDB4MDIgc2hpZnQgYWx0Z3IKK3F1b3RlZGJsIDB4MDMgc2hpZnQKK2RlYWRfY2Fyb24gMHgwMyBhbHRncgorY2Fyb24gMHgwMyBzaGlmdCBhbHRncgorbnVtYmVyc2lnbiAweDA0IHNoaWZ0Cithc2NpaWNpcmN1bSAweDA0IGFsdGdyCitkZWFkX2NpcmN1bWZsZXggMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK2RlYWRfYnJldmUgMHgwNSBhbHRncgorYnJldmUgMHgwNSBzaGlmdCBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitkZWdyZWUgMHgwNiBhbHRncgorZGVhZF9hYm92ZXJpbmcgMHgwNiBzaGlmdCBhbHRncgorYW1wZXJzYW5kIDB4MDcgc2hpZnQKK2RlYWRfb2dvbmVrIDB4MDcgYWx0Z3IKK29nb25layAweDA3IHNoaWZ0IGFsdGdyCitzbGFzaCAweDA4IHNoaWZ0CitncmF2ZSAweDA4IGFsdGdyCitkZWFkX2dyYXZlIDB4MDggc2hpZnQgYWx0Z3IKK3BhcmVubGVmdCAweDA5IHNoaWZ0CitkZWFkX2Fib3ZlZG90IDB4MDkgYWx0Z3IKK2Fib3ZlZG90IDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYSBzaGlmdAorZGVhZF9hY3V0ZSAweDBhIGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CitkZWFkX2RvdWJsZWFjdXRlIDB4MGIgYWx0Z3IKK2RvdWJsZWFjdXRlIDB4MGIgc2hpZnQgYWx0Z3IKK2Fwb3N0cm9waGUgMHgwYworcXVlc3Rpb24gMHgwYyBzaGlmdAorZGVhZF9kaWFlcmVzaXMgMHgwYyBhbHRncgorZGlhZXJlc2lzIDB4MGMgc2hpZnQgYWx0Z3IKK3BsdXMgMHgwZAorYXN0ZXJpc2sgMHgwZCBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MGQgYWx0Z3IKK2NlZGlsbGEgMHgwZCBzaGlmdCBhbHRncgorYmFja3NsYXNoIDB4MTAgYWx0Z3IKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2JhciAweDExIGFsdGdyCitMc3Ryb2tlIDB4MTEgc2hpZnQgYWx0Z3IKK0V1cm9TaWduIDB4MTIgYWx0Z3IKK3BhcmFncmFwaCAweDEzIGFsdGdyCityZWdpc3RlcmVkIDB4MTMgc2hpZnQgYWx0Z3IKK3RzbGFzaCAweDE0IGFsdGdyCitUc2xhc2ggMHgxNCBzaGlmdCBhbHRncgoreiAweDE1IGFkZHVwcGVyCitsZWZ0YXJyb3cgMHgxNSBhbHRncgoreWVuIDB4MTUgc2hpZnQgYWx0Z3IKK2Rvd25hcnJvdyAweDE2IGFsdGdyCit1cGFycm93IDB4MTYgc2hpZnQgYWx0Z3IKK3JpZ2h0YXJyb3cgMHgxNyBhbHRncgoraWRvdGxlc3MgMHgxNyBzaGlmdCBhbHRncgorb3NsYXNoIDB4MTggYWx0Z3IKK09vYmxpcXVlIDB4MTggc2hpZnQgYWx0Z3IKK3Rob3JuIDB4MTkgYWx0Z3IKK1RIT1JOIDB4MTkgc2hpZnQgYWx0Z3IKK3NjYXJvbiAweDFhCitTY2Fyb24gMHgxYSBzaGlmdAorZGl2aXNpb24gMHgxYSBhbHRncgorZHN0cm9rZSAweDFiCitEc3Ryb2tlIDB4MWIgc2hpZnQKK211bHRpcGx5IDB4MWIgYWx0Z3IKK2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK2FlIDB4MWUgYWx0Z3IKK0FFIDB4MWUgc2hpZnQgYWx0Z3IKK3NzaGFycCAweDFmIGFsdGdyCitzZWN0aW9uIDB4MWYgc2hpZnQgYWx0Z3IKK2V0aCAweDIwIGFsdGdyCitFVEggMHgyMCBzaGlmdCBhbHRncgorYnJhY2tldGxlZnQgMHgyMSBhbHRncgorb3JkZmVtaW5pbmUgMHgyMSBzaGlmdCBhbHRncgorYnJhY2tldHJpZ2h0IDB4MjIgYWx0Z3IKK0VORyAweDIyIHNoaWZ0IGFsdGdyCitoc3Ryb2tlIDB4MjMgYWx0Z3IKK0hzdHJva2UgMHgyMyBzaGlmdCBhbHRncgorbHN0cm9rZSAweDI1IGFsdGdyCitMc3Ryb2tlIDB4MjYgYWx0Z3IKK2NjYXJvbiAweDI3CitDY2Fyb24gMHgyNyBzaGlmdAorY2FjdXRlIDB4MjgKK0NhY3V0ZSAweDI4IHNoaWZ0Citzc2hhcnAgMHgyOCBhbHRncgorZGVhZF9jZWRpbGxhIDB4MjkKK25vdHNpZ24gMHgyOSBhbHRncgoremNhcm9uIDB4MmIKK1pjYXJvbiAweDJiIHNoaWZ0CitjdXJyZW5jeSAweDJiIGFsdGdyCit5IDB4MmMgYWRkdXBwZXIKK2d1aWxsZW1vdGxlZnQgMHgyYyBhbHRncgorZ3VpbGxlbW90cmlnaHQgMHgyZCBhbHRncgorY2VudCAweDJlIGFsdGdyCitjb3B5cmlnaHQgMHgyZSBzaGlmdCBhbHRncgorYXQgMHgyZiBhbHRncgorYnJhY2VsZWZ0IDB4MzAgYWx0Z3IKK2JyYWNlcmlnaHQgMHgzMSBhbHRncgorc2VjdGlvbiAweDMyIGFsdGdyCittYXNjdWxpbmUgMHgzMiBzaGlmdCBhbHRncgorY29tbWEgMHgzMworc2VtaWNvbG9uIDB4MzMgc2hpZnQKK2hvcml6Y29ubmVjdG9yIDB4MzMgYWx0Z3IKK3BlcmlvZCAweDM0Citjb2xvbiAweDM0IHNoaWZ0CitwZXJpb2RjZW50ZXJlZCAweDM0IGFsdGdyCittaW51cyAweDM1Cit1bmRlcnNjb3JlIDB4MzUgc2hpZnQKK2RlYWRfYmVsb3dkb3QgMHgzNSBhbHRncgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvc3YgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy9zdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkwODBlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvc3YKQEAgLTAsMCArMSw4MSBAQAorbWFwIDB4MDAwMDA0MWQKK2luY2x1ZGUgY29tbW9uCisKKyMKKyMgVG9wIHJvdworIworc2VjdGlvbiAweDI5CitvbmVoYWxmIDB4Mjkgc2hpZnQKKworIyAxCitleGNsYW0gMHgyIHNoaWZ0CisKKyMgMgorcXVvdGVkYmwgMHgzIHNoaWZ0CithdCAweDMgYWx0Z3IKKworIyAzCitudW1iZXJzaWduIDB4NCBzaGlmdAorc3RlcmxpbmcgMHg0IGFsdGdyCisjIDQKK2N1cnJlbmN5IDB4NSBzaGlmdAorZG9sbGFyIDB4NSBhbHRncgorIyA1CitwZXJjZW50IDB4NiBzaGlmdAorIyA2CithbXBlcnNhbmQgMHg3IHNoaWZ0CisjIDcKK3NsYXNoIDB4OCBzaGlmdAorYnJhY2VsZWZ0IDB4OCBhbHRncgorIyA4CitwYXJlbmxlZnQgMHg5IHNoaWZ0CiticmFja2V0bGVmdCAweDkgYWx0Z3IKKyMgOQorcGFyZW5yaWdodCAweGEgc2hpZnQKK2JyYWNrZXRyaWdodCAweGEgYWx0Z3IKKyMgMAorZXF1YWwgMHhiIHNoaWZ0CiticmFjZXJpZ2h0IDB4YiBhbHRncgorCitwbHVzIDB4YworcXVlc3Rpb24gMHhjIHNoaWZ0CitiYWNrc2xhc2ggMHhjIGFsdGdyCisKK2FjdXRlIDB4ZAorZGVhZF9hY3V0ZSAweGQKK2dyYXZlIDB4ZCBzaGlmdAorZGVhZF9ncmF2ZSAweGQgc2hpZnQKKworIworIyBRV0VSVFkgZmlyc3Qgcm93CisjCitFdXJvU2lnbiAweDEyIGFsdGdyCithcmluZyAweDFhCitBcmluZyAweDFhIHNoaWZ0CitkZWFkX2RpYWVyZXNpcyAweDFiCitkZWFkX2NpcmN1bWZsZXggMHgxYiBzaGlmdAorZGVhZF90aWxkZSAweDFiIGFsdGdyCisKKyMKKyMgUVdFUlRZIHNlY29uZCByb3cKKyMKK29kaWFlcmVzaXMgMHgyNworT2RpYWVyZXNpcyAweDI3IHNoaWZ0CithZGlhZXJlc2lzIDB4MjgKK0FkaWFlcmVzaXMgMHgyOCBzaGlmdAorYXBvc3Ryb3BoZSAweDJiCithc3RlcmlzayAweDJiIHNoaWZ0CisKKyMKKyMgUVdFUlRZIHRoaXJkIHJvdworIworbGVzcyAweDU2CitncmVhdGVyIDB4NTYgc2hpZnQKK2JhciAweDU2IGFsdGdyCittdSAweDMyIGFsdGdyCitjb21tYSAweDMzCitzZW1pY29sb24gMHgzMyBzaGlmdAorcGVyaW9kIDB4MzQKK2NvbG9uIDB4MzQgc2hpZnQKK21pbnVzIDB4MzUKK3VuZGVyc2NvcmUgMHgzNSBzaGlmdApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvdGggYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy90aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjViNmRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvdGgKQEAgLTAsMCArMSwxMzEgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCB0aAoraW5jbHVkZSBjb21tb24KK21hcCAweDQxZQorZXhjbGFtIDB4MDIgc2hpZnQKK1RoYWlfbGFra2hhbmd5YW8gMHgwMiBhbHRncgorcGx1cyAweDAyIHNoaWZ0IGFsdGdyCithdCAweDAzIHNoaWZ0CitzbGFzaCAweDAzIGFsdGdyCitUaGFpX2xla251bmcgMHgwMyBzaGlmdCBhbHRncgorbnVtYmVyc2lnbiAweDA0IHNoaWZ0CittaW51cyAweDA0IGFsdGdyCitUaGFpX2xla3NvbmcgMHgwNCBzaGlmdCBhbHRncgorZG9sbGFyIDB4MDUgc2hpZnQKK1RoYWlfcGhvc2FtcGhhbyAweDA1IGFsdGdyCitUaGFpX2xla3NhbSAweDA1IHNoaWZ0IGFsdGdyCitwZXJjZW50IDB4MDYgc2hpZnQKK1RoYWlfdGhvdGh1bmcgMHgwNiBhbHRncgorVGhhaV9sZWtzaSAweDA2IHNoaWZ0IGFsdGdyCithc2NpaWNpcmN1bSAweDA3IHNoaWZ0CitUaGFpX3NhcmF1IDB4MDcgYWx0Z3IKK1RoYWlfc2FyYXV1IDB4MDcgc2hpZnQgYWx0Z3IKK2FtcGVyc2FuZCAweDA4IHNoaWZ0CitUaGFpX3NhcmF1ZSAweDA4IGFsdGdyCitUaGFpX2JhaHQgMHgwOCBzaGlmdCBhbHRncgorYXN0ZXJpc2sgMHgwOSBzaGlmdAorVGhhaV9raG9raHdhaSAweDA5IGFsdGdyCitUaGFpX2xla2hhIDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVubGVmdCAweDBhIHNoaWZ0CitUaGFpX3RvdGFvIDB4MGEgYWx0Z3IKK1RoYWlfbGVraG9rIDB4MGEgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYiBzaGlmdAorVGhhaV9jaG9jaGFuIDB4MGIgYWx0Z3IKK1RoYWlfbGVrY2hldCAweDBiIHNoaWZ0IGFsdGdyCittaW51cyAweDBjCit1bmRlcnNjb3JlIDB4MGMgc2hpZnQKK1RoYWlfa2hva2hhaSAweDBjIGFsdGdyCitUaGFpX2xla3BhZXQgMHgwYyBzaGlmdCBhbHRncgorZXF1YWwgMHgwZAorcGx1cyAweDBkIHNoaWZ0CitUaGFpX2Nob2NoYW5nIDB4MGQgYWx0Z3IKK1RoYWlfbGVra2FvIDB4MGQgc2hpZnQgYWx0Z3IKK1RoYWlfbWFpeWFtb2sgMHgxMCBhbHRncgorVGhhaV9sZWtzdW4gMHgxMCBzaGlmdCBhbHRncgorVGhhaV9zYXJhYWltYWltYWxhaSAweDExIGFsdGdyCitxdW90ZWRibCAweDExIHNoaWZ0IGFsdGdyCitUaGFpX3NhcmFhbSAweDEyIGFsdGdyCitUaGFpX2RvY2hhZGEgMHgxMiBzaGlmdCBhbHRncgorVGhhaV9waG9waGFuIDB4MTMgYWx0Z3IKK1RoYWlfdGhvbmFuZ21vbnRobyAweDEzIHNoaWZ0IGFsdGdyCitUaGFpX3NhcmFhIDB4MTQgYWx0Z3IKK1RoYWlfdGhvdGhvbmcgMHgxNCBzaGlmdCBhbHRncgorVGhhaV9tYWloYW5ha2F0IDB4MTUgYWx0Z3IKK1RoYWlfbmlraGFoaXQgMHgxNSBzaGlmdCBhbHRncgorVGhhaV9zYXJhaWkgMHgxNiBhbHRncgorVGhhaV9tYWl0cmkgMHgxNiBzaGlmdCBhbHRncgorVGhhaV9yb3J1YSAweDE3IGFsdGdyCitUaGFpX25vbmVuIDB4MTcgc2hpZnQgYWx0Z3IKK1RoYWlfbm9udSAweDE4IGFsdGdyCitUaGFpX3BhaXlhbm5vaSAweDE4IHNoaWZ0IGFsdGdyCitUaGFpX3lveWFrIDB4MTkgYWx0Z3IKK1RoYWlfeW95aW5nIDB4MTkgc2hpZnQgYWx0Z3IKK2JyYWNrZXRsZWZ0IDB4MWEKK2JyYWNlbGVmdCAweDFhIHNoaWZ0CitUaGFpX2JvYmFpbWFpIDB4MWEgYWx0Z3IKK1RoYWlfdGhvdGhhbiAweDFhIHNoaWZ0IGFsdGdyCiticmFja2V0cmlnaHQgMHgxYgorYnJhY2VyaWdodCAweDFiIHNoaWZ0CitUaGFpX2xvbGluZyAweDFiIGFsdGdyCitjb21tYSAweDFiIHNoaWZ0IGFsdGdyCitUaGFpX2ZvZmFuIDB4MWUgYWx0Z3IKK1RoYWlfcnUgMHgxZSBzaGlmdCBhbHRncgorVGhhaV9ob2hpcCAweDFmIGFsdGdyCitUaGFpX2tob3Jha2hhbmcgMHgxZiBzaGlmdCBhbHRncgorVGhhaV9rb2thaSAweDIwIGFsdGdyCitUaGFpX3RvcGF0YWsgMHgyMCBzaGlmdCBhbHRncgorVGhhaV9kb2RlayAweDIxIGFsdGdyCitUaGFpX3NhcmFvIDB4MjEgc2hpZnQgYWx0Z3IKK1RoYWlfc2FyYWUgMHgyMiBhbHRncgorVGhhaV9jaG9jaG9lIDB4MjIgc2hpZnQgYWx0Z3IKK1RoYWlfbWFpdGhvIDB4MjMgYWx0Z3IKK1RoYWlfbWFpdGFpa2h1IDB4MjMgc2hpZnQgYWx0Z3IKK1RoYWlfbWFpZWsgMHgyNCBhbHRncgorVGhhaV9tYWljaGF0dGF3YSAweDI0IHNoaWZ0IGFsdGdyCitUaGFpX3NhcmFhYSAweDI1IGFsdGdyCitUaGFpX3NvcnVzaSAweDI1IHNoaWZ0IGFsdGdyCitUaGFpX3Nvc3VhIDB4MjYgYWx0Z3IKK1RoYWlfc29zYWxhIDB4MjYgc2hpZnQgYWx0Z3IKK3NlbWljb2xvbiAweDI3Citjb2xvbiAweDI3IHNoaWZ0CitUaGFpX3dvd2FlbiAweDI3IGFsdGdyCitUaGFpX3Nvc28gMHgyNyBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDI4CitxdW90ZWRibCAweDI4IHNoaWZ0CitUaGFpX25nb25ndSAweDI4IGFsdGdyCitwZXJpb2QgMHgyOCBzaGlmdCBhbHRncgorZ3JhdmUgMHgyOQorYXNjaWl0aWxkZSAweDI5IHNoaWZ0Cit1bmRlcnNjb3JlIDB4MjkgYWx0Z3IKK3BlcmNlbnQgMHgyOSBzaGlmdCBhbHRncgorSVNPX0ZpcnN0X0dyb3VwIDB4MmEgc2hpZnQKK2JhY2tzbGFzaCAweDJiCitiYXIgMHgyYiBzaGlmdAorVGhhaV9raG9raHVhdCAweDJiIGFsdGdyCitUaGFpX2tob2tob24gMHgyYiBzaGlmdCBhbHRncgorVGhhaV9waG9waHVuZyAweDJjIGFsdGdyCitwYXJlbmxlZnQgMHgyYyBzaGlmdCBhbHRncgorVGhhaV9wb3BsYSAweDJkIGFsdGdyCitwYXJlbnJpZ2h0IDB4MmQgc2hpZnQgYWx0Z3IKK1RoYWlfc2FyYWFlIDB4MmUgYWx0Z3IKK1RoYWlfY2hvY2hpbmcgMHgyZSBzaGlmdCBhbHRncgorVGhhaV9vYW5nIDB4MmYgYWx0Z3IKK1RoYWlfaG9ub2todWsgMHgyZiBzaGlmdCBhbHRncgorVGhhaV9zYXJhaSAweDMwIGFsdGdyCitUaGFpX3BoaW50aHUgMHgzMCBzaGlmdCBhbHRncgorVGhhaV9zYXJhdWVlIDB4MzEgYWx0Z3IKK1RoYWlfdGhhbnRoYWtoYXQgMHgzMSBzaGlmdCBhbHRncgorVGhhaV90aG90aGFoYW4gMHgzMiBhbHRncgorcXVlc3Rpb24gMHgzMiBzaGlmdCBhbHRncgorY29tbWEgMHgzMworbGVzcyAweDMzIHNoaWZ0CitUaGFpX21vbWEgMHgzMyBhbHRncgorVGhhaV90aG9waHV0aGFvIDB4MzMgc2hpZnQgYWx0Z3IKK3BlcmlvZCAweDM0CitncmVhdGVyIDB4MzQgc2hpZnQKK1RoYWlfc2FyYWFpbWFpbXVhbiAweDM0IGFsdGdyCitUaGFpX2xvY2h1bGEgMHgzNCBzaGlmdCBhbHRncgorc2xhc2ggMHgzNQorcXVlc3Rpb24gMHgzNSBzaGlmdAorVGhhaV9mb2ZhIDB4MzUgYWx0Z3IKK1RoYWlfbHUgMHgzNSBzaGlmdCBhbHRncgorSVNPX0xhc3RfR3JvdXAgMHgzNiBzaGlmdApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvdHIgYi9hbmRyb2lkL3FlbXUxL3BjLWJpb3Mva2V5bWFwcy90cgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjUwZTFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9wYy1iaW9zL2tleW1hcHMvdHIKQEAgLTAsMCArMSwxMjMgQEAKKyMgZ2VuZXJhdGVkIGZyb20gWEtCIG1hcCB0cgoraW5jbHVkZSBjb21tb24KK21hcCAweDQxZgorZXhjbGFtIDB4MDIgc2hpZnQKK29uZXN1cGVyaW9yIDB4MDIgYWx0Z3IKK2V4Y2xhbWRvd24gMHgwMiBzaGlmdCBhbHRncgorYXBvc3Ryb3BoZSAweDAzIHNoaWZ0CithdCAweDAzIGFsdGdyCitvbmVlaWdodGggMHgwMyBzaGlmdCBhbHRncgorZGVhZF9jaXJjdW1mbGV4IDB4MDQgc2hpZnQKK251bWJlcnNpZ24gMHgwNCBhbHRncgorc3RlcmxpbmcgMHgwNCBzaGlmdCBhbHRncgorcGx1cyAweDA1IHNoaWZ0Citkb2xsYXIgMHgwNSBhbHRncgorcGVyY2VudCAweDA2IHNoaWZ0CitvbmVoYWxmIDB4MDYgYWx0Z3IKK3RocmVlZWlnaHRocyAweDA2IHNoaWZ0IGFsdGdyCithbXBlcnNhbmQgMHgwNyBzaGlmdAorYXNjaWljaXJjdW0gMHgwNyBhbHRncgorZml2ZWVpZ2h0aHMgMHgwNyBzaGlmdCBhbHRncgorc2xhc2ggMHgwOCBzaGlmdAorYnJhY2VsZWZ0IDB4MDggYWx0Z3IKK3NldmVuZWlnaHRocyAweDA4IHNoaWZ0IGFsdGdyCitwYXJlbmxlZnQgMHgwOSBzaGlmdAorYnJhY2tldGxlZnQgMHgwOSBhbHRncgordHJhZGVtYXJrIDB4MDkgc2hpZnQgYWx0Z3IKK3BhcmVucmlnaHQgMHgwYSBzaGlmdAorYnJhY2tldHJpZ2h0IDB4MGEgYWx0Z3IKK3BsdXNtaW51cyAweDBhIHNoaWZ0IGFsdGdyCitlcXVhbCAweDBiIHNoaWZ0CiticmFjZXJpZ2h0IDB4MGIgYWx0Z3IKK2RlZ3JlZSAweDBiIHNoaWZ0IGFsdGdyCithc3RlcmlzayAweDBjCitxdWVzdGlvbiAweDBjIHNoaWZ0CitiYWNrc2xhc2ggMHgwYyBhbHRncgorcXVlc3Rpb25kb3duIDB4MGMgc2hpZnQgYWx0Z3IKK21pbnVzIDB4MGQKK3VuZGVyc2NvcmUgMHgwZCBzaGlmdAorZGVhZF9jZWRpbGxhIDB4MGQgYWx0Z3IKK2RlYWRfb2dvbmVrIDB4MGQgc2hpZnQgYWx0Z3IKK2F0IDB4MTAgYWx0Z3IKK0dyZWVrX09NRUdBIDB4MTAgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgxMSBhbHRncgorTHN0cm9rZSAweDExIHNoaWZ0IGFsdGdyCitFdXJvU2lnbiAweDEyIGFsdGdyCitwYXJhZ3JhcGggMHgxMyBhbHRncgorcmVnaXN0ZXJlZCAweDEzIHNoaWZ0IGFsdGdyCit0c2xhc2ggMHgxNCBhbHRncgorVHNsYXNoIDB4MTQgc2hpZnQgYWx0Z3IKK2xlZnRhcnJvdyAweDE1IGFsdGdyCit5ZW4gMHgxNSBzaGlmdCBhbHRncgorZG93bmFycm93IDB4MTYgYWx0Z3IKK3VwYXJyb3cgMHgxNiBzaGlmdCBhbHRncgoraWRvdGxlc3MgMHgxNworSSAweDE3IHNoaWZ0CityaWdodGFycm93IDB4MTcgYWx0Z3IKK29zbGFzaCAweDE4IGFsdGdyCitPb2JsaXF1ZSAweDE4IHNoaWZ0IGFsdGdyCit0aG9ybiAweDE5IGFsdGdyCitUSE9STiAweDE5IHNoaWZ0IGFsdGdyCitnYnJldmUgMHgxYQorR2JyZXZlIDB4MWEgc2hpZnQKK2RlYWRfZGlhZXJlc2lzIDB4MWEgYWx0Z3IKK2RlYWRfYWJvdmVyaW5nIDB4MWEgc2hpZnQgYWx0Z3IKK3VkaWFlcmVzaXMgMHgxYgorVWRpYWVyZXNpcyAweDFiIHNoaWZ0Cithc2NpaXRpbGRlIDB4MWIgYWx0Z3IKK2RlYWRfbWFjcm9uIDB4MWIgc2hpZnQgYWx0Z3IKK2FlIDB4MWUgYWx0Z3IKK0FFIDB4MWUgc2hpZnQgYWx0Z3IKK3NzaGFycCAweDFmIGFsdGdyCitzZWN0aW9uIDB4MWYgc2hpZnQgYWx0Z3IKK2V0aCAweDIwIGFsdGdyCitFVEggMHgyMCBzaGlmdCBhbHRncgorZHN0cm9rZSAweDIxIGFsdGdyCitvcmRmZW1pbmluZSAweDIxIHNoaWZ0IGFsdGdyCitlbmcgMHgyMiBhbHRncgorRU5HIDB4MjIgc2hpZnQgYWx0Z3IKK2hzdHJva2UgMHgyMyBhbHRncgorSHN0cm9rZSAweDIzIHNoaWZ0IGFsdGdyCitrcmEgMHgyNSBhbHRncgorYW1wZXJzYW5kIDB4MjUgc2hpZnQgYWx0Z3IKK2xzdHJva2UgMHgyNiBhbHRncgorTHN0cm9rZSAweDI2IHNoaWZ0IGFsdGdyCitzY2VkaWxsYSAweDI3CitTY2VkaWxsYSAweDI3IHNoaWZ0CitkZWFkX2FjdXRlIDB4MjcgYWx0Z3IKK2RlYWRfZG91YmxlYWN1dGUgMHgyNyBzaGlmdCBhbHRncgoraSAweDI4CitJYWJvdmVkb3QgMHgyOCBzaGlmdAorZGVhZF9jaXJjdW1mbGV4IDB4MjggYWx0Z3IKK2RlYWRfY2Fyb24gMHgyOCBzaGlmdCBhbHRncgorYmFja3NsYXNoIDB4MjkKK3F1b3RlZGJsIDB4Mjkgc2hpZnQKK2FzY2lpdGlsZGUgMHgyOSBhbHRncgorY29tbWEgMHgyYgorc2VtaWNvbG9uIDB4MmIgc2hpZnQKK2JhciAweDJiIGFsdGdyCitkZWFkX2JyZXZlIDB4MmIgc2hpZnQgYWx0Z3IKK2d1aWxsZW1vdGxlZnQgMHgyYyBhbHRncgorbGVzcyAweDJjIHNoaWZ0IGFsdGdyCitndWlsbGVtb3RyaWdodCAweDJkIGFsdGdyCitncmVhdGVyIDB4MmQgc2hpZnQgYWx0Z3IKK2NlbnQgMHgyZSBhbHRncgorY29weXJpZ2h0IDB4MmUgc2hpZnQgYWx0Z3IKK2xlZnRkb3VibGVxdW90ZW1hcmsgMHgyZiBhbHRncgorZ3JhdmUgMHgyZiBzaGlmdCBhbHRncgorcmlnaHRkb3VibGVxdW90ZW1hcmsgMHgzMCBhbHRncgorYXBvc3Ryb3BoZSAweDMwIHNoaWZ0IGFsdGdyCittdSAweDMyIGFsdGdyCittYXNjdWxpbmUgMHgzMiBzaGlmdCBhbHRncgorb2RpYWVyZXNpcyAweDMzCitPZGlhZXJlc2lzIDB4MzMgc2hpZnQKK2xlc3MgMHgzMyBhbHRncgorbXVsdGlwbHkgMHgzMyBzaGlmdCBhbHRncgorY2NlZGlsbGEgMHgzNAorQ2NlZGlsbGEgMHgzNCBzaGlmdAorZ3JlYXRlciAweDM0IGFsdGdyCitkaXZpc2lvbiAweDM0IHNoaWZ0IGFsdGdyCitwZXJpb2QgMHgzNQorY29sb24gMHgzNSBzaGlmdAorZGVhZF9iZWxvd2RvdCAweDM1IGFsdGdyCitkZWFkX2Fib3ZlZG90IDB4MzUgc2hpZnQgYWx0Z3IKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcG9zaXgtYWlvLWNvbXBhdC5jIGIvYW5kcm9pZC9xZW11MS9wb3NpeC1haW8tY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZTRjNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcG9zaXgtYWlvLWNvbXBhdC5jCkBAIC0wLDAgKzEsNjY1IEBACisvKgorICogUUVNVSBwb3NpeC1haW8gZW11bGF0aW9uCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOAorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImJsb2NrL2Jsb2NrX2ludC5oIgorCisjaW5jbHVkZSAiYmxvY2svcmF3LXBvc2l4LWFpby5oIgorCisKK3N0cnVjdCBxZW11X3BhaW9jYiB7CisgICAgQmxvY2tEcml2ZXJBSU9DQiBjb21tb247CisgICAgaW50IGFpb19maWxkZXM7CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgaW92ZWMgKmFpb19pb3Y7CisgICAgICAgIHZvaWQgKmFpb19pb2N0bF9idWY7CisgICAgfTsKKyAgICBpbnQgYWlvX25pb3Y7CisgICAgc2l6ZV90IGFpb19uYnl0ZXM7CisjZGVmaW5lIGFpb19pb2N0bF9jbWQgICBhaW9fbmJ5dGVzIC8qIGZvciBRRU1VX0FJT19JT0NUTCAqLworICAgIGludCBldl9zaWdubzsKKyAgICBvZmZfdCBhaW9fb2Zmc2V0OworCisgICAgUVRBSUxRX0VOVFJZKHFlbXVfcGFpb2NiKSBub2RlOworICAgIGludCBhaW9fdHlwZTsKKyAgICBzc2l6ZV90IHJldDsKKyAgICBpbnQgYWN0aXZlOworICAgIHN0cnVjdCBxZW11X3BhaW9jYiAqbmV4dDsKKworICAgIGludCBhc3luY19jb250ZXh0X2lkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUG9zaXhBaW9TdGF0ZSB7CisgICAgaW50IHJmZCwgd2ZkOworICAgIHN0cnVjdCBxZW11X3BhaW9jYiAqZmlyc3RfYWlvOworfSBQb3NpeEFpb1N0YXRlOworCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgY29uZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKK3N0YXRpYyBwdGhyZWFkX3QgdGhyZWFkX2lkOworc3RhdGljIHB0aHJlYWRfYXR0cl90IGF0dHI7CitzdGF0aWMgaW50IG1heF90aHJlYWRzID0gNjQ7CitzdGF0aWMgaW50IGN1cl90aHJlYWRzID0gMDsKK3N0YXRpYyBpbnQgaWRsZV90aHJlYWRzID0gMDsKK3N0YXRpYyBRVEFJTFFfSEVBRCgsIHFlbXVfcGFpb2NiKSByZXF1ZXN0X2xpc3Q7CisKKyNpZmRlZiBDT05GSUdfUFJFQURWCitzdGF0aWMgaW50IHByZWFkdl9wcmVzZW50ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IHByZWFkdl9wcmVzZW50ID0gMDsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUyKGludCBlcnIsIGNvbnN0IGNoYXIgKndoYXQpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyBmYWlsZWQ6ICVzXG4iLCB3aGF0LCBzdHJlcnJvcihlcnIpKTsKKyAgICBhYm9ydCgpOworfQorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqd2hhdCkKK3sKKyAgICBkaWUyKGVycm5vLCB3aGF0KTsKK30KKworc3RhdGljIHZvaWQgbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQoreworICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworICAgIGlmIChyZXQpIGRpZTIocmV0LCAicHRocmVhZF9tdXRleF9sb2NrIik7Cit9CisKK3N0YXRpYyB2b2lkIG11dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQoreworICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7CisgICAgaWYgKHJldCkgZGllMihyZXQsICJwdGhyZWFkX211dGV4X3VubG9jayIpOworfQorCitzdGF0aWMgaW50IGNvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKyAgICBpbnQgcmV0ID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdChjb25kLCBtdXRleCwgdHMpOworICAgIGlmIChyZXQgJiYgcmV0ICE9IEVUSU1FRE9VVCkgZGllMihyZXQsICJwdGhyZWFkX2NvbmRfdGltZWR3YWl0Iik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCit7CisgICAgaW50IHJldCA9IHB0aHJlYWRfY29uZF9zaWduYWwoY29uZCk7CisgICAgaWYgKHJldCkgZGllMihyZXQsICJwdGhyZWFkX2NvbmRfc2lnbmFsIik7Cit9CisKK3N0YXRpYyB2b2lkIHRocmVhZF9jcmVhdGUocHRocmVhZF90ICp0aHJlYWQsIHB0aHJlYWRfYXR0cl90ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKSwgdm9pZCAqYXJnKQoreworICAgIGludCByZXQgPSBwdGhyZWFkX2NyZWF0ZSh0aHJlYWQsIGF0dHIsIHN0YXJ0X3JvdXRpbmUsIGFyZyk7CisgICAgaWYgKHJldCkgZGllMihyZXQsICJwdGhyZWFkX2NyZWF0ZSIpOworfQorCitzdGF0aWMgc3NpemVfdCBoYW5kbGVfYWlvY2JfaW9jdGwoc3RydWN0IHFlbXVfcGFpb2NiICphaW9jYikKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoYWlvY2ItPmFpb19maWxkZXMsIGFpb2NiLT5haW9faW9jdGxfY21kLCBhaW9jYi0+YWlvX2lvY3RsX2J1Zik7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIC8qCisgICAgICogVGhpcyBsb29rcyB3ZWlyZCwgYnV0IHRoZSBhaW8gY29kZSBvbmx5IGNvbnNpZGVyZXMgYSByZXF1ZXN0CisgICAgICogc3VjY2Vzc2Z1bCBpZiBpdCBoYXMgd3JpdHRlbiB0aGUgbnVtYmVyIGZ1bGwgbnVtYmVyIG9mIGJ5dGVzLgorICAgICAqCisgICAgICogTm93IHdlIG92ZXJsb2FkIGFpb19uYnl0ZXMgYXMgYWlvX2lvY3RsX2NtZCBmb3IgdGhlIGlvY3RsIGNvbW1hbmQsCisgICAgICogc28gaW4gZmFjdCB3ZSByZXR1cm4gdGhlIGlvY3RsIGNvbW1hbmQgaGVyZSB0byBtYWtlIHBvc2l4X2Fpb19yZWFkKCkKKyAgICAgKiBoYXBweS4uCisgICAgICovCisgICAgcmV0dXJuIGFpb2NiLT5haW9fbmJ5dGVzOworfQorCitzdGF0aWMgc3NpemVfdCBoYW5kbGVfYWlvY2JfZmx1c2goc3RydWN0IHFlbXVfcGFpb2NiICphaW9jYikKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gcWVtdV9mZGF0YXN5bmMoYWlvY2ItPmFpb19maWxkZXMpOworICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJFQURWCisKK3N0YXRpYyBzc2l6ZV90CitxZW11X3ByZWFkdihpbnQgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgbnJfaW92LCBvZmZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIHByZWFkdihmZCwgaW92LCBucl9pb3YsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitxZW11X3B3cml0ZXYoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IG5yX2lvdiwgb2ZmX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiBwd3JpdGV2KGZkLCBpb3YsIG5yX2lvdiwgb2Zmc2V0KTsKK30KKworI2Vsc2UKKworc3RhdGljIHNzaXplX3QKK3FlbXVfcHJlYWR2KGludCBmZCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBucl9pb3YsIG9mZl90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIHNzaXplX3QKK3FlbXVfcHdyaXRldihpbnQgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgbnJfaW92LCBvZmZfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIC1FTk9TWVM7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgc3NpemVfdCBoYW5kbGVfYWlvY2JfcndfdmVjdG9yKHN0cnVjdCBxZW11X3BhaW9jYiAqYWlvY2IpCit7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgc3NpemVfdCBsZW47CisKKyAgICBkbyB7CisgICAgICAgIGlmIChhaW9jYi0+YWlvX3R5cGUgJiBRRU1VX0FJT19XUklURSkKKyAgICAgICAgICAgIGxlbiA9IHFlbXVfcHdyaXRldihhaW9jYi0+YWlvX2ZpbGRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaW9jYi0+YWlvX2lvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaW9jYi0+YWlvX25pb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlvY2ItPmFpb19vZmZzZXQgKyBvZmZzZXQpOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuID0gcWVtdV9wcmVhZHYoYWlvY2ItPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaW9jYi0+YWlvX2lvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpb2NiLT5haW9fbmlvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpb2NiLT5haW9fb2Zmc2V0ICsgb2Zmc2V0KTsKKyAgICB9IHdoaWxlIChsZW4gPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpOworCisgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBoYW5kbGVfYWlvY2JfcndfbGluZWFyKHN0cnVjdCBxZW11X3BhaW9jYiAqYWlvY2IsIGNoYXIgKmJ1ZikKK3sKKyAgICBzc2l6ZV90IG9mZnNldCA9IDA7CisgICAgc3NpemVfdCBsZW47CisKKyAgICB3aGlsZSAoKHNpemVfdClvZmZzZXQgPCBhaW9jYi0+YWlvX25ieXRlcykgeworICAgICAgICAgaWYgKGFpb2NiLT5haW9fdHlwZSAmIFFFTVVfQUlPX1dSSVRFKQorICAgICAgICAgICAgIGxlbiA9IHB3cml0ZShhaW9jYi0+YWlvX2ZpbGRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilidWYgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFpb2NiLT5haW9fbmJ5dGVzIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhaW9jYi0+YWlvX29mZnNldCArIG9mZnNldCk7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgbGVuID0gcHJlYWQoYWlvY2ItPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpb2NiLT5haW9fbmJ5dGVzIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFpb2NiLT5haW9fb2Zmc2V0ICsgb2Zmc2V0KTsKKworICAgICAgICAgaWYgKGxlbiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICAgICAgIG9mZnNldCA9IC1lcnJubzsKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApCisgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgIG9mZnNldCArPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHNzaXplX3QgaGFuZGxlX2Fpb2NiX3J3KHN0cnVjdCBxZW11X3BhaW9jYiAqYWlvY2IpCit7CisgICAgc3NpemVfdCBuYnl0ZXM7CisgICAgY2hhciAqYnVmOworCisgICAgaWYgKCEoYWlvY2ItPmFpb190eXBlICYgUUVNVV9BSU9fTUlTQUxJR05FRCkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlcmUgaXMganVzdCBhIHNpbmdsZSBidWZmZXIsIGFuZCBpdCBpcyBwcm9wZXJseSBhbGlnbmVkCisgICAgICAgICAqIHdlIGNhbiBqdXN0IHVzZSBwbGFpbiBwcmVhZC9wd3JpdGUgd2l0aG91dCBhbnkgcHJvYmxlbXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoYWlvY2ItPmFpb19uaW92ID09IDEpCisgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9haW9jYl9yd19saW5lYXIoYWlvY2IsIGFpb2NiLT5haW9faW92LT5pb3ZfYmFzZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogV2UgaGF2ZSBtb3JlIHRoYW4gb25lIGlvdmVjLCBhbmQgYWxsIGFyZSBwcm9wZXJseSBhbGlnbmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBUcnkgcHJlYWR2L3B3cml0ZXYgZmlyc3QgYW5kIGZhbGwgYmFjayB0byBsaW5lYXJpemluZyB0aGUKKyAgICAgICAgICogYnVmZmVyIGlmIGl0J3Mgbm90IHN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwcmVhZHZfcHJlc2VudCkgeworICAgICAgICAgICAgbmJ5dGVzID0gaGFuZGxlX2Fpb2NiX3J3X3ZlY3RvcihhaW9jYik7CisgICAgICAgICAgICBpZiAobmJ5dGVzID09IChzc2l6ZV90KWFpb2NiLT5haW9fbmJ5dGVzKQorICAgICAgICAgICAgICAgIHJldHVybiBuYnl0ZXM7CisgICAgICAgICAgICBpZiAobmJ5dGVzIDwgMCAmJiBuYnl0ZXMgIT0gLUVOT1NZUykKKyAgICAgICAgICAgICAgICByZXR1cm4gbmJ5dGVzOworICAgICAgICAgICAgcHJlYWR2X3ByZXNlbnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogWFhYKGhjaCk6IHNob3J0IHJlYWQvd3JpdGUuICBubyBlYXN5IHdheSB0byBoYW5kbGUgdGhlIHJlbWluZGVyCisgICAgICAgICAqIHVzaW5nIHRoZXNlIGludGVyZmFjZXMuICBGb3Igbm93IHJldHJ5IHVzaW5nIHBsYWluCisgICAgICAgICAqIHByZWFkL3B3cml0ZT8KKyAgICAgICAgICovCisgICAgfQorCisgICAgLyoKKyAgICAgKiBPaywgd2UgaGF2ZSB0byBkbyBpdCB0aGUgaGFyZCB3YXksIGNvcHkgYWxsIHNlZ21lbnRzIGludG8KKyAgICAgKiBhIHNpbmdsZSBhbGlnbmVkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBidWYgPSBxZW11X2Jsb2NrYWxpZ24oYWlvY2ItPmNvbW1vbi5icywgYWlvY2ItPmFpb19uYnl0ZXMpOworICAgIGlmIChhaW9jYi0+YWlvX3R5cGUgJiBRRU1VX0FJT19XUklURSkgeworICAgICAgICBjaGFyICpwID0gYnVmOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWlvY2ItPmFpb19uaW92OyArK2kpIHsKKyAgICAgICAgICAgIG1lbWNweShwLCBhaW9jYi0+YWlvX2lvdltpXS5pb3ZfYmFzZSwgYWlvY2ItPmFpb19pb3ZbaV0uaW92X2xlbik7CisgICAgICAgICAgICBwICs9IGFpb2NiLT5haW9faW92W2ldLmlvdl9sZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuYnl0ZXMgPSBoYW5kbGVfYWlvY2JfcndfbGluZWFyKGFpb2NiLCBidWYpOworICAgIGlmICghKGFpb2NiLT5haW9fdHlwZSAmIFFFTVVfQUlPX1dSSVRFKSkgeworICAgICAgICBjaGFyICpwID0gYnVmOworICAgICAgICBzaXplX3QgY291bnQgPSBhaW9jYi0+YWlvX25ieXRlcywgY29weTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFpb2NiLT5haW9fbmlvdiAmJiBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBjb3B5ID0gY291bnQ7CisgICAgICAgICAgICBpZiAoY29weSA+IGFpb2NiLT5haW9faW92W2ldLmlvdl9sZW4pCisgICAgICAgICAgICAgICAgY29weSA9IGFpb2NiLT5haW9faW92W2ldLmlvdl9sZW47CisgICAgICAgICAgICBtZW1jcHkoYWlvY2ItPmFpb19pb3ZbaV0uaW92X2Jhc2UsIHAsIGNvcHkpOworICAgICAgICAgICAgcCAgICAgKz0gY29weTsKKyAgICAgICAgICAgIGNvdW50IC09IGNvcHk7CisgICAgICAgIH0KKyAgICB9CisgICAgcWVtdV92ZnJlZShidWYpOworCisgICAgcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHZvaWQgKmFpb190aHJlYWQodm9pZCAqdW51c2VkKQoreworICAgIHBpZF90IHBpZDsKKworICAgIHBpZCA9IGdldHBpZCgpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc3RydWN0IHFlbXVfcGFpb2NiICphaW9jYjsKKyAgICAgICAgc3NpemVfdCByZXQgPSAwOworICAgICAgICBxZW11X3RpbWV2YWwgdHY7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKworICAgICAgICBxZW11X2dldHRpbWVvZmRheSgmdHYpOworICAgICAgICB0cy50dl9zZWMgPSB0di50dl9zZWMgKyAxMDsKKyAgICAgICAgdHMudHZfbnNlYyA9IDA7CisKKyAgICAgICAgbXV0ZXhfbG9jaygmbG9jayk7CisKKyAgICAgICAgd2hpbGUgKFFUQUlMUV9FTVBUWSgmcmVxdWVzdF9saXN0KSAmJgorICAgICAgICAgICAgICAgIShyZXQgPT0gRVRJTUVET1VUKSkgeworICAgICAgICAgICAgcmV0ID0gY29uZF90aW1lZHdhaXQoJmNvbmQsICZsb2NrLCAmdHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFFUQUlMUV9FTVBUWSgmcmVxdWVzdF9saXN0KSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGFpb2NiID0gUVRBSUxRX0ZJUlNUKCZyZXF1ZXN0X2xpc3QpOworICAgICAgICBRVEFJTFFfUkVNT1ZFKCZyZXF1ZXN0X2xpc3QsIGFpb2NiLCBub2RlKTsKKyAgICAgICAgYWlvY2ItPmFjdGl2ZSA9IDE7CisgICAgICAgIGlkbGVfdGhyZWFkcy0tOworICAgICAgICBtdXRleF91bmxvY2soJmxvY2spOworCisgICAgICAgIHN3aXRjaCAoYWlvY2ItPmFpb190eXBlICYgUUVNVV9BSU9fVFlQRV9NQVNLKSB7CisgICAgICAgIGNhc2UgUUVNVV9BSU9fUkVBRDoKKyAgICAgICAgY2FzZSBRRU1VX0FJT19XUklURToKKyAgICAgICAgICAgIHJldCA9IGhhbmRsZV9haW9jYl9ydyhhaW9jYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRRU1VX0FJT19GTFVTSDoKKyAgICAgICAgICAgIHJldCA9IGhhbmRsZV9haW9jYl9mbHVzaChhaW9jYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRRU1VX0FJT19JT0NUTDoKKyAgICAgICAgICAgIHJldCA9IGhhbmRsZV9haW9jYl9pb2N0bChhaW9jYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBhaW8gcmVxdWVzdCAoMHgleClcbiIsIGFpb2NiLT5haW9fdHlwZSk7CisgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtdXRleF9sb2NrKCZsb2NrKTsKKyAgICAgICAgYWlvY2ItPnJldCA9IHJldDsKKyAgICAgICAgaWRsZV90aHJlYWRzKys7CisgICAgICAgIG11dGV4X3VubG9jaygmbG9jayk7CisKKyAgICAgICAgaWYgKGtpbGwocGlkLCBhaW9jYi0+ZXZfc2lnbm8pKSBkaWUoImtpbGwgZmFpbGVkIik7CisgICAgfQorCisgICAgaWRsZV90aHJlYWRzLS07CisgICAgY3VyX3RocmVhZHMtLTsKKyAgICBtdXRleF91bmxvY2soJmxvY2spOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNwYXduX3RocmVhZCh2b2lkKQoreworICAgIHNpZ3NldF90IHNldCwgb2xkc2V0OworCisgICAgY3VyX3RocmVhZHMrKzsKKyAgICBpZGxlX3RocmVhZHMrKzsKKworICAgIC8qIGJsb2NrIGFsbCBzaWduYWxzICovCisgICAgaWYgKHNpZ2ZpbGxzZXQoJnNldCkpIGRpZSgic2lnZmlsbHNldCIpOworICAgIGlmIChzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNldCwgJm9sZHNldCkpIGRpZSgic2lncHJvY21hc2siKTsKKworICAgIHRocmVhZF9jcmVhdGUoJnRocmVhZF9pZCwgJmF0dHIsIGFpb190aHJlYWQsIE5VTEwpOworCisgICAgaWYgKHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb2xkc2V0LCBOVUxMKSkgZGllKCJzaWdwcm9jbWFzayByZXN0b3JlIik7Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfcGFpb19zdWJtaXQoc3RydWN0IHFlbXVfcGFpb2NiICphaW9jYikKK3sKKyAgICBhaW9jYi0+cmV0ID0gLUVJTlBST0dSRVNTOworICAgIGFpb2NiLT5hY3RpdmUgPSAwOworICAgIG11dGV4X2xvY2soJmxvY2spOworICAgIGlmIChpZGxlX3RocmVhZHMgPT0gMCAmJiBjdXJfdGhyZWFkcyA8IG1heF90aHJlYWRzKQorICAgICAgICBzcGF3bl90aHJlYWQoKTsKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJnJlcXVlc3RfbGlzdCwgYWlvY2IsIG5vZGUpOworICAgIG11dGV4X3VubG9jaygmbG9jayk7CisgICAgY29uZF9zaWduYWwoJmNvbmQpOworfQorCitzdGF0aWMgc3NpemVfdCBxZW11X3BhaW9fcmV0dXJuKHN0cnVjdCBxZW11X3BhaW9jYiAqYWlvY2IpCit7CisgICAgc3NpemVfdCByZXQ7CisKKyAgICBtdXRleF9sb2NrKCZsb2NrKTsKKyAgICByZXQgPSBhaW9jYi0+cmV0OworICAgIG11dGV4X3VubG9jaygmbG9jayk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFlbXVfcGFpb19lcnJvcihzdHJ1Y3QgcWVtdV9wYWlvY2IgKmFpb2NiKQoreworICAgIHNzaXplX3QgcmV0ID0gcWVtdV9wYWlvX3JldHVybihhaW9jYik7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0ID0gLXJldDsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBvc2l4X2Fpb19wcm9jZXNzX3F1ZXVlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQb3NpeEFpb1N0YXRlICpzID0gb3BhcXVlOworICAgIHN0cnVjdCBxZW11X3BhaW9jYiAqYWNiLCAqKnBhY2I7CisgICAgaW50IHJldDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgYXN5bmNfY29udGV4dF9pZCA9IGdldF9hc3luY19jb250ZXh0X2lkKCk7CisKKyAgICBmb3IoOzspIHsKKyAgICAgICAgcGFjYiA9ICZzLT5maXJzdF9haW87CisgICAgICAgIGZvcig7OykgeworICAgICAgICAgICAgYWNiID0gKnBhY2I7CisgICAgICAgICAgICBpZiAoIWFjYikKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgICAgICAgICAvKiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gcmVxdWVzdHMgaW4gdGhlIHJpZ2h0IGNvbnRleHQgKi8KKyAgICAgICAgICAgIGlmIChhY2ItPmFzeW5jX2NvbnRleHRfaWQgIT0gYXN5bmNfY29udGV4dF9pZCkgeworICAgICAgICAgICAgICAgIHBhY2IgPSAmYWNiLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBxZW11X3BhaW9fZXJyb3IoYWNiKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gRUNBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHRoZSByZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgKnBhY2IgPSBhY2ItPm5leHQ7CisgICAgICAgICAgICAgICAgcWVtdV9haW9fcmVsZWFzZShhY2IpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBFSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBhaW8gKi8KKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcWVtdV9wYWlvX3JldHVybihhY2IpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IChpbnQpYWNiLT5haW9fbmJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAtcmV0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vdHJhY2VfcGFpb19jb21wbGV0ZShhY2IsIGFjYi0+Y29tbW9uLm9wYXF1ZSwgcmV0KTsKKworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSB0aGUgcmVxdWVzdCAqLworICAgICAgICAgICAgICAgICpwYWNiID0gYWNiLT5uZXh0OworICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgYWNiLT5jb21tb24uY2IoYWNiLT5jb21tb24ub3BhcXVlLCByZXQpOworICAgICAgICAgICAgICAgIHFlbXVfYWlvX3JlbGVhc2UoYWNiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYWNiID0gJmFjYi0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvc2l4X2Fpb19yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBQb3NpeEFpb1N0YXRlICpzID0gb3BhcXVlOworICAgIHNzaXplX3QgbGVuOworCisgICAgLyogcmVhZCBhbGwgYnl0ZXMgZnJvbSBzaWduYWwgcGlwZSAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciBieXRlc1sxNl07CisKKyAgICAgICAgbGVuID0gcmVhZChzLT5yZmQsIGJ5dGVzLCBzaXplb2YoYnl0ZXMpKTsKKyAgICAgICAgaWYgKGxlbiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiB0cnkgYWdhaW4gKi8KKyAgICAgICAgaWYgKGxlbiA9PSBzaXplb2YoYnl0ZXMpKQorICAgICAgICAgICAgY29udGludWU7IC8qIG1vcmUgdG8gcmVhZCAqLworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwb3NpeF9haW9fcHJvY2Vzc19xdWV1ZShzKTsKK30KKworc3RhdGljIGludCBwb3NpeF9haW9fZmx1c2godm9pZCAqb3BhcXVlKQoreworICAgIFBvc2l4QWlvU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgcmV0dXJuICEhcy0+Zmlyc3RfYWlvOworfQorCitzdGF0aWMgUG9zaXhBaW9TdGF0ZSAqcG9zaXhfYWlvX3N0YXRlOworCitzdGF0aWMgdm9pZCBhaW9fc2lnbmFsX2hhbmRsZXIoaW50IHNpZ251bSkKK3sKKyAgICBpZiAocG9zaXhfYWlvX3N0YXRlKSB7CisgICAgICAgIGNoYXIgYnl0ZSA9IDA7CisgICAgICAgIHNzaXplX3QgcmV0OworCisgICAgICAgIHJldCA9IHdyaXRlKHBvc2l4X2Fpb19zdGF0ZS0+d2ZkLCAmYnl0ZSwgc2l6ZW9mKGJ5dGUpKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgZXJybm8gIT0gRUFHQUlOKQorICAgICAgICAgICAgZGllKCJ3cml0ZSgpIik7CisgICAgfQorCisgICAgcWVtdV9ub3RpZnlfZXZlbnQoKTsKK30KKworc3RhdGljIHZvaWQgcGFpb19yZW1vdmUoc3RydWN0IHFlbXVfcGFpb2NiICphY2IpCit7CisgICAgc3RydWN0IHFlbXVfcGFpb2NiICoqcGFjYjsKKworICAgIC8qIHJlbW92ZSB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgcXVldWUgKi8KKyAgICBwYWNiID0gJnBvc2l4X2Fpb19zdGF0ZS0+Zmlyc3RfYWlvOworICAgIGZvcig7OykgeworICAgICAgICBpZiAoKnBhY2IgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJwYWlvX3JlbW92ZTogYWlvIHJlcXVlc3Qgbm90IGZvdW5kIVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmICgqcGFjYiA9PSBhY2IpIHsKKyAgICAgICAgICAgICpwYWNiID0gYWNiLT5uZXh0OworICAgICAgICAgICAgcWVtdV9haW9fcmVsZWFzZShhY2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcGFjYiA9ICYoKnBhY2IpLT5uZXh0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFpb19jYW5jZWwoQmxvY2tEcml2ZXJBSU9DQiAqYmxvY2thY2IpCit7CisgICAgc3RydWN0IHFlbXVfcGFpb2NiICphY2IgPSAoc3RydWN0IHFlbXVfcGFpb2NiICopYmxvY2thY2I7CisgICAgaW50IGFjdGl2ZSA9IDA7CisKKyAgICAvL3RyYWNlX3BhaW9fY2FuY2VsKGFjYiwgYWNiLT5jb21tb24ub3BhcXVlKTsKKworICAgIG11dGV4X2xvY2soJmxvY2spOworICAgIGlmICghYWNiLT5hY3RpdmUpIHsKKyAgICAgICAgUVRBSUxRX1JFTU9WRSgmcmVxdWVzdF9saXN0LCBhY2IsIG5vZGUpOworICAgICAgICBhY2ItPnJldCA9IC1FQ0FOQ0VMRUQ7CisgICAgfSBlbHNlIGlmIChhY2ItPnJldCA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgYWN0aXZlID0gMTsKKyAgICB9CisgICAgbXV0ZXhfdW5sb2NrKCZsb2NrKTsKKworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgLyogZmFpbCBzYWZlOiBpZiB0aGUgYWlvIGNvdWxkIG5vdCBiZSBjYW5jZWxlZCwgd2Ugd2FpdCBmb3IKKyAgICAgICAgICAgaXQgKi8KKyAgICAgICAgd2hpbGUgKHFlbXVfcGFpb19lcnJvcihhY2IpID09IEVJTlBST0dSRVNTKQorICAgICAgICAgICAgOworICAgIH0KKworICAgIHBhaW9fcmVtb3ZlKGFjYik7Cit9CisKK3N0YXRpYyBBSU9Qb29sIHJhd19haW9fcG9vbCA9IHsKKyAgICAuYWlvY2Jfc2l6ZSAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCBxZW11X3BhaW9jYiksCisgICAgLmNhbmNlbCAgICAgICAgICAgICA9IHBhaW9fY2FuY2VsLAorfTsKKworQmxvY2tEcml2ZXJBSU9DQiAqcGFpb19zdWJtaXQoQmxvY2tEcml2ZXJTdGF0ZSAqYnMsIGludCBmZCwKKyAgICAgICAgaW50NjRfdCBzZWN0b3JfbnVtLCBRRU1VSU9WZWN0b3IgKnFpb3YsIGludCBuYl9zZWN0b3JzLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlLCBpbnQgdHlwZSkKK3sKKyAgICBzdHJ1Y3QgcWVtdV9wYWlvY2IgKmFjYjsKKworICAgIGFjYiA9IHFlbXVfYWlvX2dldCgmcmF3X2Fpb19wb29sLCBicywgY2IsIG9wYXF1ZSk7CisgICAgaWYgKCFhY2IpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFjYi0+YWlvX3R5cGUgPSB0eXBlOworICAgIGFjYi0+YWlvX2ZpbGRlcyA9IGZkOworICAgIGFjYi0+ZXZfc2lnbm8gPSBTSUdVU1IyOworICAgIGFjYi0+YXN5bmNfY29udGV4dF9pZCA9IGdldF9hc3luY19jb250ZXh0X2lkKCk7CisKKyAgICBpZiAocWlvdikgeworICAgICAgICBhY2ItPmFpb19pb3YgPSBxaW92LT5pb3Y7CisgICAgICAgIGFjYi0+YWlvX25pb3YgPSBxaW92LT5uaW92OworICAgIH0KKyAgICBhY2ItPmFpb19uYnl0ZXMgPSBuYl9zZWN0b3JzICogNTEyOworICAgIGFjYi0+YWlvX29mZnNldCA9IHNlY3Rvcl9udW0gKiA1MTI7CisKKyAgICBhY2ItPm5leHQgPSBwb3NpeF9haW9fc3RhdGUtPmZpcnN0X2FpbzsKKyAgICBwb3NpeF9haW9fc3RhdGUtPmZpcnN0X2FpbyA9IGFjYjsKKworICAgIC8vdHJhY2VfcGFpb19zdWJtaXQoYWNiLCBvcGFxdWUsIHNlY3Rvcl9udW0sIG5iX3NlY3RvcnMsIHR5cGUpOworICAgIHFlbXVfcGFpb19zdWJtaXQoYWNiKTsKKyAgICByZXR1cm4gJmFjYi0+Y29tbW9uOworfQorCitCbG9ja0RyaXZlckFJT0NCICpwYWlvX2lvY3RsKEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgZmQsCisgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50IHJlcSwgdm9pZCAqYnVmLAorICAgICAgICBCbG9ja0RyaXZlckNvbXBsZXRpb25GdW5jICpjYiwgdm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCBxZW11X3BhaW9jYiAqYWNiOworCisgICAgYWNiID0gcWVtdV9haW9fZ2V0KCZyYXdfYWlvX3Bvb2wsIGJzLCBjYiwgb3BhcXVlKTsKKyAgICBpZiAoIWFjYikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWNiLT5haW9fdHlwZSA9IFFFTVVfQUlPX0lPQ1RMOworICAgIGFjYi0+YWlvX2ZpbGRlcyA9IGZkOworICAgIGFjYi0+ZXZfc2lnbm8gPSBTSUdVU1IyOworICAgIGFjYi0+YXN5bmNfY29udGV4dF9pZCA9IGdldF9hc3luY19jb250ZXh0X2lkKCk7CisgICAgYWNiLT5haW9fb2Zmc2V0ID0gMDsKKyAgICBhY2ItPmFpb19pb2N0bF9idWYgPSBidWY7CisgICAgYWNiLT5haW9faW9jdGxfY21kID0gcmVxOworCisgICAgYWNiLT5uZXh0ID0gcG9zaXhfYWlvX3N0YXRlLT5maXJzdF9haW87CisgICAgcG9zaXhfYWlvX3N0YXRlLT5maXJzdF9haW8gPSBhY2I7CisKKyAgICBxZW11X3BhaW9fc3VibWl0KGFjYik7CisgICAgcmV0dXJuICZhY2ItPmNvbW1vbjsKK30KKworaW50IHBhaW9faW5pdCh2b2lkKQoreworICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0OworICAgIFBvc2l4QWlvU3RhdGUgKnM7CisgICAgaW50IGZkc1syXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBvc2l4X2Fpb19zdGF0ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzID0gZ19tYWxsb2Moc2l6ZW9mKFBvc2l4QWlvU3RhdGUpKTsKKworICAgIHNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKyAgICBhY3Quc2FfZmxhZ3MgPSAwOyAvKiBkbyBub3QgcmVzdGFydCBzeXNjYWxscyB0byBpbnRlcnJ1cHQgc2VsZWN0KCkgKi8KKyAgICBhY3Quc2FfaGFuZGxlciA9IGFpb19zaWduYWxfaGFuZGxlcjsKKyAgICBzaWdhY3Rpb24oU0lHVVNSMiwgJmFjdCwgTlVMTCk7CisKKyAgICBzLT5maXJzdF9haW8gPSBOVUxMOworICAgIGlmIChxZW11X3BpcGUoZmRzKSA9PSAtMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBjcmVhdGUgcGlwZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzLT5yZmQgPSBmZHNbMF07CisgICAgcy0+d2ZkID0gZmRzWzFdOworCisgICAgZmNudGwocy0+cmZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICBmY250bChzLT53ZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCisgICAgcWVtdV9haW9fc2V0X2ZkX2hhbmRsZXIocy0+cmZkLCBwb3NpeF9haW9fcmVhZCwgTlVMTCwgcG9zaXhfYWlvX2ZsdXNoLAorICAgICAgICBwb3NpeF9haW9fcHJvY2Vzc19xdWV1ZSwgcyk7CisKKyAgICByZXQgPSBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgaWYgKHJldCkKKyAgICAgICAgZGllMihyZXQsICJwdGhyZWFkX2F0dHJfaW5pdCIpOworCisgICAgcmV0ID0gcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgZGllMihyZXQsICJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUiKTsKKworICAgIFFUQUlMUV9JTklUKCZyZXF1ZXN0X2xpc3QpOworCisgICAgcG9zaXhfYWlvX3N0YXRlID0gczsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcWFwaS1zY2hlbWEuanNvbiBiL2FuZHJvaWQvcWVtdTEvcWFwaS1zY2hlbWEuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmY4NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xYXBpLXNjaGVtYS5qc29uCkBAIC0wLDAgKzEsNDIzNyBAQAorIyAtKi0gTW9kZTogUHl0aG9uIC0qLQorIworIyBRQVBJIFNjaGVtYQorCisjIworIyBARXJyb3JDbGFzcworIworIyBRRU1VIGVycm9yIGNsYXNzZXMKKyMKKyMgQEdlbmVyaWNFcnJvcjogdGhpcyBpcyB1c2VkIGZvciBlcnJvcnMgdGhhdCBkb24ndCByZXF1aXJlIGEgc3BlY2lmaWMgZXJyb3IKKyMgICAgICAgICAgICAgICAgY2xhc3MuIFRoaXMgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IGNhc2UgZm9yIG1vc3QgZXJyb3JzCisjCisjIEBDb21tYW5kTm90Rm91bmQ6IHRoZSByZXF1ZXN0ZWQgY29tbWFuZCBoYXMgbm90IGJlZW4gZm91bmQKKyMKKyMgQERldmljZUVuY3J5cHRlZDogdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24gY2FuJ3QgYmUgZnVsZmlsbGVkIGJlY2F1c2UgdGhlCisjICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIGRldmljZSBpcyBlbmNyeXB0ZWQKKyMKKyMgQERldmljZU5vdEFjdGl2ZTogYSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSBiZWNvbWUgYWN0aXZlCisjCisjIEBEZXZpY2VOb3RGb3VuZDogdGhlIHJlcXVlc3RlZCBkZXZpY2UgaGFzIG5vdCBiZWVuIGZvdW5kCisjCisjIEBLVk1NaXNzaW5nQ2FwOiB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4ndCBiZSBmdWxmaWxsZWQgYmVjYXVzZSBhCisjICAgICAgICAgICAgICAgICByZXF1aXJlZCBLVk0gY2FwYWJpbGl0eSBpcyBtaXNzaW5nCisjCisjIFNpbmNlOiAxLjIKKyMjCit7ICdlbnVtJzogJ0Vycm9yQ2xhc3MnLAorICAnZGF0YSc6IFsgJ0dlbmVyaWNFcnJvcicsICdDb21tYW5kTm90Rm91bmQnLCAnRGV2aWNlRW5jcnlwdGVkJywKKyAgICAgICAgICAgICdEZXZpY2VOb3RBY3RpdmUnLCAnRGV2aWNlTm90Rm91bmQnLCAnS1ZNTWlzc2luZ0NhcCcgXSB9CisKKyMjCisjIEBhZGRfY2xpZW50CisjCisjIEFsbG93IGNsaWVudCBjb25uZWN0aW9ucyBmb3IgVk5DLCBTcGljZSBhbmQgc29ja2V0IGJhc2VkCisjIGNoYXJhY3RlciBkZXZpY2VzIHRvIGJlIHBhc3NlZCBpbiB0byBRRU1VIHZpYSBTQ01fUklHSFRTLgorIworIyBAcHJvdG9jb2w6IHByb3RvY29sIG5hbWUuIFZhbGlkIG5hbWVzIGFyZSAidm5jIiwgInNwaWNlIiBvciB0aGUKKyMgICAgICAgICAgICBuYW1lIG9mIGEgY2hhcmFjdGVyIGRldmljZSAoZWcuIGZyb20gLWNoYXJkZXYgaWQ9WFhYWCkKKyMKKyMgQGZkbmFtZTogZmlsZSBkZXNjcmlwdG9yIG5hbWUgcHJldmlvdXNseSBwYXNzZWQgdmlhICdnZXRmZCcgY29tbWFuZAorIworIyBAc2tpcGF1dGg6ICNvcHRpb25hbCB3aGV0aGVyIHRvIHNraXAgYXV0aGVudGljYXRpb24uIE9ubHkgYXBwbGllcworIyAgICAgICAgICAgIHRvICJ2bmMiIGFuZCAic3BpY2UiIHByb3RvY29scworIworIyBAdGxzOiAjb3B0aW9uYWwgd2hldGhlciB0byBwZXJmb3JtIFRMUy4gT25seSBhcHBsaWVzIHRvIHRoZSAic3BpY2UiCisjICAgICAgIHByb3RvY29sCisjCisjIFJldHVybnM6IG5vdGhpbmcgb24gc3VjY2Vzcy4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnYWRkX2NsaWVudCcsCisgICdkYXRhJzogeyAncHJvdG9jb2wnOiAnc3RyJywgJ2ZkbmFtZSc6ICdzdHInLCAnKnNraXBhdXRoJzogJ2Jvb2wnLAorICAgICAgICAgICAgJyp0bHMnOiAnYm9vbCcgfSB9CisKKyMjCisjIEBOYW1lSW5mbzoKKyMKKyMgR3Vlc3QgbmFtZSBpbmZvcm1hdGlvbi4KKyMKKyMgQG5hbWU6ICNvcHRpb25hbCBUaGUgbmFtZSBvZiB0aGUgZ3Vlc3QKKyMKKyMgU2luY2UgMC4xNC4wCisjIworeyAndHlwZSc6ICdOYW1lSW5mbycsICdkYXRhJzogeycqbmFtZSc6ICdzdHInfSB9CisKKyMjCisjIEBxdWVyeS1uYW1lOgorIworIyBSZXR1cm4gdGhlIG5hbWUgaW5mb3JtYXRpb24gb2YgYSBndWVzdC4KKyMKKyMgUmV0dXJuczogQE5hbWVJbmZvIG9mIHRoZSBndWVzdAorIworIyBTaW5jZSAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LW5hbWUnLCAncmV0dXJucyc6ICdOYW1lSW5mbycgfQorCisjIworIyBAVmVyc2lvbkluZm86CisjCisjIEEgZGVzY3JpcHRpb24gb2YgUUVNVSdzIHZlcnNpb24uCisjCisjIEBxZW11Lm1ham9yOiAgVGhlIG1ham9yIHZlcnNpb24gb2YgUUVNVQorIworIyBAcWVtdS5taW5vcjogIFRoZSBtaW5vciB2ZXJzaW9uIG9mIFFFTVUKKyMKKyMgQHFlbXUubWljcm86ICBUaGUgbWljcm8gdmVyc2lvbiBvZiBRRU1VLiAgQnkgY3VycmVudCBjb252ZW50aW9uLCBhIG1pY3JvCisjICAgICAgICAgICAgICAgdmVyc2lvbiBvZiA1MCBzaWduaWZpZXMgYSBkZXZlbG9wbWVudCBicmFuY2guICBBIG1pY3JvIHZlcnNpb24KKyMgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gOTAgc2lnbmlmaWVzIGEgcmVsZWFzZSBjYW5kaWRhdGUgZm9yCisjICAgICAgICAgICAgICAgdGhlIG5leHQgbWlub3IgdmVyc2lvbi4gIEEgbWljcm8gdmVyc2lvbiBvZiBsZXNzIHRoYW4gNTAKKyMgICAgICAgICAgICAgICBzaWduaWZpZXMgYSBzdGFibGUgcmVsZWFzZS4KKyMKKyMgQHBhY2thZ2U6ICAgICBRRU1VIHdpbGwgYWx3YXlzIHNldCB0aGlzIGZpZWxkIHRvIGFuIGVtcHR5IHN0cmluZy4gIERvd25zdHJlYW0KKyMgICAgICAgICAgICAgICB2ZXJzaW9ucyBvZiBRRU1VIHNob3VsZCBzZXQgdGhpcyB0byBhIG5vbi1lbXB0eSBzdHJpbmcuICBUaGUKKyMgICAgICAgICAgICAgICBleGFjdCBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgZG93bnN0cmVhbSBob3dldmVyIGl0IGhpZ2hseQorIyAgICAgICAgICAgICAgIHJlY29tbWVuZGVkIHRoYXQgYSB1bmlxdWUgbmFtZSBpcyB1c2VkLgorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAndHlwZSc6ICdWZXJzaW9uSW5mbycsCisgICdkYXRhJzogeydxZW11JzogeydtYWpvcic6ICdpbnQnLCAnbWlub3InOiAnaW50JywgJ21pY3JvJzogJ2ludCd9LAorICAgICAgICAgICAncGFja2FnZSc6ICdzdHInfSB9CisKKyMjCisjIEBxdWVyeS12ZXJzaW9uOgorIworIyBSZXR1cm5zIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUUVNVS4KKyMKKyMgUmV0dXJuczogIEEgQFZlcnNpb25JbmZvIG9iamVjdCBkZXNjcmliaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUUVNVS4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktdmVyc2lvbicsICdyZXR1cm5zJzogJ1ZlcnNpb25JbmZvJyB9CisKKyMjCisjIEBLdm1JbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBzdXBwb3J0IGZvciBLVk0gYWNjZWxlcmF0aW9uCisjCisjIEBlbmFibGVkOiB0cnVlIGlmIEtWTSBhY2NlbGVyYXRpb24gaXMgYWN0aXZlCisjCisjIEBwcmVzZW50OiB0cnVlIGlmIEtWTSBhY2NlbGVyYXRpb24gaXMgYnVpbHQgaW50byB0aGlzIGV4ZWN1dGFibGUKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnS3ZtSW5mbycsICdkYXRhJzogeydlbmFibGVkJzogJ2Jvb2wnLCAncHJlc2VudCc6ICdib29sJ30gfQorCisjIworIyBAcXVlcnkta3ZtOgorIworIyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IEtWTSBhY2NlbGVyYXRpb24KKyMKKyMgUmV0dXJuczogQEt2bUluZm8KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnkta3ZtJywgJ3JldHVybnMnOiAnS3ZtSW5mbycgfQorCisjIworIyBAUnVuU3RhdGUKKyMKKyMgQW4gZW51bWVyYXRpb24gb2YgVk0gcnVuIHN0YXRlcy4KKyMKKyMgQGRlYnVnOiBRRU1VIGlzIHJ1bm5pbmcgb24gYSBkZWJ1Z2dlcgorIworIyBAZmluaXNoLW1pZ3JhdGU6IGd1ZXN0IGlzIHBhdXNlZCB0byBmaW5pc2ggdGhlIG1pZ3JhdGlvbiBwcm9jZXNzCisjCisjIEBpbm1pZ3JhdGU6IGd1ZXN0IGlzIHBhdXNlZCB3YWl0aW5nIGZvciBhbiBpbmNvbWluZyBtaWdyYXRpb24uICBOb3RlCisjIHRoYXQgdGhpcyBzdGF0ZSBkb2VzIG5vdCB0ZWxsIHdoZXRoZXIgdGhlIG1hY2hpbmUgd2lsbCBzdGFydCBhdCB0aGUKKyMgZW5kIG9mIHRoZSBtaWdyYXRpb24uICBUaGlzIGRlcGVuZHMgb24gdGhlIGNvbW1hbmQtbGluZSAtUyBvcHRpb24gYW5kCisjIGFueSBpbnZvY2F0aW9uIG9mICdzdG9wJyBvciAnY29udCcgdGhhdCBoYXMgaGFwcGVuZWQgc2luY2UgUUVNVSB3YXMKKyMgc3RhcnRlZC4KKyMKKyMgQGludGVybmFsLWVycm9yOiBBbiBpbnRlcm5hbCBlcnJvciB0aGF0IHByZXZlbnRzIGZ1cnRoZXIgZ3Vlc3QgZXhlY3V0aW9uCisjIGhhcyBvY2N1cnJlZAorIworIyBAaW8tZXJyb3I6IHRoZSBsYXN0IElPUCBoYXMgZmFpbGVkIGFuZCB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgdG8gcGF1c2UKKyMgb24gSS9PIGVycm9ycworIworIyBAcGF1c2VkOiBndWVzdCBoYXMgYmVlbiBwYXVzZWQgdmlhIHRoZSAnc3RvcCcgY29tbWFuZAorIworIyBAcG9zdG1pZ3JhdGU6IGd1ZXN0IGlzIHBhdXNlZCBmb2xsb3dpbmcgYSBzdWNjZXNzZnVsICdtaWdyYXRlJworIworIyBAcHJlbGF1bmNoOiBRRU1VIHdhcyBzdGFydGVkIHdpdGggLVMgYW5kIGd1ZXN0IGhhcyBub3Qgc3RhcnRlZAorIworIyBAcmVzdG9yZS12bTogZ3Vlc3QgaXMgcGF1c2VkIHRvIHJlc3RvcmUgVk0gc3RhdGUKKyMKKyMgQHJ1bm5pbmc6IGd1ZXN0IGlzIGFjdGl2ZWx5IHJ1bm5pbmcKKyMKKyMgQHNhdmUtdm06IGd1ZXN0IGlzIHBhdXNlZCB0byBzYXZlIHRoZSBWTSBzdGF0ZQorIworIyBAc2h1dGRvd246IGd1ZXN0IGlzIHNodXQgZG93biAoYW5kIC1uby1zaHV0ZG93biBpcyBpbiB1c2UpCisjCisjIEBzdXNwZW5kZWQ6IGd1ZXN0IGlzIHN1c3BlbmRlZCAoQUNQSSBTMykKKyMKKyMgQHdhdGNoZG9nOiB0aGUgd2F0Y2hkb2cgYWN0aW9uIGlzIGNvbmZpZ3VyZWQgdG8gcGF1c2UgYW5kIGhhcyBiZWVuIHRyaWdnZXJlZAorIworIyBAZ3Vlc3QtcGFuaWNrZWQ6IGd1ZXN0IGhhcyBiZWVuIHBhbmlja2VkIGFzIGEgcmVzdWx0IG9mIGd1ZXN0IE9TIHBhbmljCisjIworeyAnZW51bSc6ICdSdW5TdGF0ZScsCisgICdkYXRhJzogWyAnZGVidWcnLCAnaW5taWdyYXRlJywgJ2ludGVybmFsLWVycm9yJywgJ2lvLWVycm9yJywgJ3BhdXNlZCcsCisgICAgICAgICAgICAncG9zdG1pZ3JhdGUnLCAncHJlbGF1bmNoJywgJ2ZpbmlzaC1taWdyYXRlJywgJ3Jlc3RvcmUtdm0nLAorICAgICAgICAgICAgJ3J1bm5pbmcnLCAnc2F2ZS12bScsICdzaHV0ZG93bicsICdzdXNwZW5kZWQnLCAnd2F0Y2hkb2cnLAorICAgICAgICAgICAgJ2d1ZXN0LXBhbmlja2VkJyBdIH0KKworIyMKKyMgQFNuYXBzaG90SW5mbworIworIyBAaWQ6IHVuaXF1ZSBzbmFwc2hvdCBpZAorIworIyBAbmFtZTogdXNlciBjaG9zZW4gbmFtZQorIworIyBAdm0tc3RhdGUtc2l6ZTogc2l6ZSBvZiB0aGUgVk0gc3RhdGUKKyMKKyMgQGRhdGUtc2VjOiBVVEMgZGF0ZSBvZiB0aGUgc25hcHNob3QgaW4gc2Vjb25kcworIworIyBAZGF0ZS1uc2VjOiBmcmFjdGlvbmFsIHBhcnQgaW4gbmFubyBzZWNvbmRzIHRvIGJlIHVzZWQgd2l0aCBkYXRlLXNlYworIworIyBAdm0tY2xvY2stc2VjOiBWTSBjbG9jayByZWxhdGl2ZSB0byBib290IGluIHNlY29uZHMKKyMKKyMgQHZtLWNsb2NrLW5zZWM6IGZyYWN0aW9uYWwgcGFydCBpbiBuYW5vIHNlY29uZHMgdG8gYmUgdXNlZCB3aXRoIHZtLWNsb2NrLXNlYworIworIyBTaW5jZTogMS4zCisjCisjIworCit7ICd0eXBlJzogJ1NuYXBzaG90SW5mbycsCisgICdkYXRhJzogeyAnaWQnOiAnc3RyJywgJ25hbWUnOiAnc3RyJywgJ3ZtLXN0YXRlLXNpemUnOiAnaW50JywKKyAgICAgICAgICAgICdkYXRlLXNlYyc6ICdpbnQnLCAnZGF0ZS1uc2VjJzogJ2ludCcsCisgICAgICAgICAgICAndm0tY2xvY2stc2VjJzogJ2ludCcsICd2bS1jbG9jay1uc2VjJzogJ2ludCcgfSB9CisKKyMjCisjIEBJbWFnZUluZm9TcGVjaWZpY1FDb3cyOgorIworIyBAY29tcGF0OiBjb21wYXRpYmlsaXR5IGxldmVsCisjCisjIEBsYXp5LXJlZmNvdW50czogI29wdGlvbmFsIG9uIG9yIG9mZjsgb25seSB2YWxpZCBmb3IgY29tcGF0ID49IDEuMQorIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdJbWFnZUluZm9TcGVjaWZpY1FDb3cyJywKKyAgJ2RhdGEnOiB7CisgICAgICAnY29tcGF0JzogJ3N0cicsCisgICAgICAnKmxhenktcmVmY291bnRzJzogJ2Jvb2wnCisgIH0gfQorCisjIworIyBASW1hZ2VJbmZvU3BlY2lmaWNWbWRrOgorIworIyBAY3JlYXRlLXR5cGU6IFRoZSBjcmVhdGUgdHlwZSBvZiBWTURLIGltYWdlCisjCisjIEBjaWQ6IENvbnRlbnQgaWQgb2YgaW1hZ2UKKyMKKyMgQHBhcmVudC1jaWQ6IFBhcmVudCBWTURLIGltYWdlJ3MgY2lkCisjCisjIEBleHRlbnRzOiBMaXN0IG9mIGV4dGVudCBmaWxlcworIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdJbWFnZUluZm9TcGVjaWZpY1ZtZGsnLAorICAnZGF0YSc6IHsKKyAgICAgICdjcmVhdGUtdHlwZSc6ICdzdHInLAorICAgICAgJ2NpZCc6ICdpbnQnLAorICAgICAgJ3BhcmVudC1jaWQnOiAnaW50JywKKyAgICAgICdleHRlbnRzJzogWydJbWFnZUluZm8nXQorICB9IH0KKworIyMKKyMgQEltYWdlSW5mb1NwZWNpZmljOgorIworIyBBIGRpc2NyaW1pbmF0ZWQgcmVjb3JkIG9mIGltYWdlIGZvcm1hdCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzLgorIworIyBTaW5jZTogMS43CisjIworCit7ICd1bmlvbic6ICdJbWFnZUluZm9TcGVjaWZpYycsCisgICdkYXRhJzogeworICAgICAgJ3Fjb3cyJzogJ0ltYWdlSW5mb1NwZWNpZmljUUNvdzInLAorICAgICAgJ3ZtZGsnOiAnSW1hZ2VJbmZvU3BlY2lmaWNWbWRrJworICB9IH0KKworIyMKKyMgQEltYWdlSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBRRU1VIGltYWdlIGZpbGUKKyMKKyMgQGZpbGVuYW1lOiBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlCisjCisjIEBmb3JtYXQ6IGZvcm1hdCBvZiB0aGUgaW1hZ2UgZmlsZQorIworIyBAdmlydHVhbC1zaXplOiBtYXhpbXVtIGNhcGFjaXR5IGluIGJ5dGVzIG9mIHRoZSBpbWFnZQorIworIyBAYWN0dWFsLXNpemU6ICNvcHRpb25hbCBhY3R1YWwgc2l6ZSBvbiBkaXNrIGluIGJ5dGVzIG9mIHRoZSBpbWFnZQorIworIyBAZGlydHktZmxhZzogI29wdGlvbmFsIHRydWUgaWYgaW1hZ2UgaXMgbm90IGNsZWFubHkgY2xvc2VkCisjCisjIEBjbHVzdGVyLXNpemU6ICNvcHRpb25hbCBzaXplIG9mIGEgY2x1c3RlciBpbiBieXRlcworIworIyBAZW5jcnlwdGVkOiAjb3B0aW9uYWwgdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgZW5jcnlwdGVkCisjCisjIEBjb21wcmVzc2VkOiAjb3B0aW9uYWwgdHJ1ZSBpZiB0aGUgaW1hZ2UgaXMgY29tcHJlc3NlZCAoU2luY2UgMS43KQorIworIyBAYmFja2luZy1maWxlbmFtZTogI29wdGlvbmFsIG5hbWUgb2YgdGhlIGJhY2tpbmcgZmlsZQorIworIyBAZnVsbC1iYWNraW5nLWZpbGVuYW1lOiAjb3B0aW9uYWwgZnVsbCBwYXRoIG9mIHRoZSBiYWNraW5nIGZpbGUKKyMKKyMgQGJhY2tpbmctZmlsZW5hbWUtZm9ybWF0OiAjb3B0aW9uYWwgdGhlIGZvcm1hdCBvZiB0aGUgYmFja2luZyBmaWxlCisjCisjIEBzbmFwc2hvdHM6ICNvcHRpb25hbCBsaXN0IG9mIFZNIHNuYXBzaG90cworIworIyBAYmFja2luZy1pbWFnZTogI29wdGlvbmFsIGluZm8gb2YgdGhlIGJhY2tpbmcgaW1hZ2UgKHNpbmNlIDEuNikKKyMKKyMgQGZvcm1hdC1zcGVjaWZpYzogI29wdGlvbmFsIHN0cnVjdHVyZSBzdXBwbHlpbmcgYWRkaXRpb25hbCBmb3JtYXQtc3BlY2lmaWMKKyMgaW5mb3JtYXRpb24gKHNpbmNlIDEuNykKKyMKKyMgU2luY2U6IDEuMworIworIyMKKworeyAndHlwZSc6ICdJbWFnZUluZm8nLAorICAnZGF0YSc6IHsnZmlsZW5hbWUnOiAnc3RyJywgJ2Zvcm1hdCc6ICdzdHInLCAnKmRpcnR5LWZsYWcnOiAnYm9vbCcsCisgICAgICAgICAgICcqYWN0dWFsLXNpemUnOiAnaW50JywgJ3ZpcnR1YWwtc2l6ZSc6ICdpbnQnLAorICAgICAgICAgICAnKmNsdXN0ZXItc2l6ZSc6ICdpbnQnLCAnKmVuY3J5cHRlZCc6ICdib29sJywgJypjb21wcmVzc2VkJzogJ2Jvb2wnLAorICAgICAgICAgICAnKmJhY2tpbmctZmlsZW5hbWUnOiAnc3RyJywgJypmdWxsLWJhY2tpbmctZmlsZW5hbWUnOiAnc3RyJywKKyAgICAgICAgICAgJypiYWNraW5nLWZpbGVuYW1lLWZvcm1hdCc6ICdzdHInLCAnKnNuYXBzaG90cyc6IFsnU25hcHNob3RJbmZvJ10sCisgICAgICAgICAgICcqYmFja2luZy1pbWFnZSc6ICdJbWFnZUluZm8nLAorICAgICAgICAgICAnKmZvcm1hdC1zcGVjaWZpYyc6ICdJbWFnZUluZm9TcGVjaWZpYycgfSB9CisKKyMjCisjIEBJbWFnZUNoZWNrOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFFFTVUgaW1hZ2UgZmlsZSBjaGVjaworIworIyBAZmlsZW5hbWU6IG5hbWUgb2YgdGhlIGltYWdlIGZpbGUgY2hlY2tlZAorIworIyBAZm9ybWF0OiBmb3JtYXQgb2YgdGhlIGltYWdlIGZpbGUgY2hlY2tlZAorIworIyBAY2hlY2stZXJyb3JzOiBudW1iZXIgb2YgdW5leHBlY3RlZCBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGNoZWNrCisjCisjIEBpbWFnZS1lbmQtb2Zmc2V0OiAjb3B0aW9uYWwgb2Zmc2V0IChpbiBieXRlcykgd2hlcmUgdGhlIGltYWdlIGVuZHMsIHRoaXMKKyMgICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIHByZXNlbnQgaWYgdGhlIGRyaXZlciBmb3IgdGhlIGltYWdlIGZvcm1hdAorIyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgaXQKKyMKKyMgQGNvcnJ1cHRpb25zOiAjb3B0aW9uYWwgbnVtYmVyIG9mIGNvcnJ1cHRpb25zIGZvdW5kIGR1cmluZyB0aGUgY2hlY2sgaWYgYW55CisjCisjIEBsZWFrczogI29wdGlvbmFsIG51bWJlciBvZiBsZWFrcyBmb3VuZCBkdXJpbmcgdGhlIGNoZWNrIGlmIGFueQorIworIyBAY29ycnVwdGlvbnMtZml4ZWQ6ICNvcHRpb25hbCBudW1iZXIgb2YgY29ycnVwdGlvbnMgZml4ZWQgZHVyaW5nIHRoZSBjaGVjaworIyAgICAgICAgICAgICAgICAgICAgIGlmIGFueQorIworIyBAbGVha3MtZml4ZWQ6ICNvcHRpb25hbCBudW1iZXIgb2YgbGVha3MgZml4ZWQgZHVyaW5nIHRoZSBjaGVjayBpZiBhbnkKKyMKKyMgQHRvdGFsLWNsdXN0ZXJzOiAjb3B0aW9uYWwgdG90YWwgbnVtYmVyIG9mIGNsdXN0ZXJzLCB0aGlzIGZpZWxkIGlzIHByZXNlbnQKKyMgICAgICAgICAgICAgICAgICBpZiB0aGUgZHJpdmVyIGZvciB0aGUgaW1hZ2UgZm9ybWF0IHN1cHBvcnRzIGl0CisjCisjIEBhbGxvY2F0ZWQtY2x1c3RlcnM6ICNvcHRpb25hbCB0b3RhbCBudW1iZXIgb2YgYWxsb2NhdGVkIGNsdXN0ZXJzLCB0aGlzCisjICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIHByZXNlbnQgaWYgdGhlIGRyaXZlciBmb3IgdGhlIGltYWdlIGZvcm1hdAorIyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyBpdAorIworIyBAZnJhZ21lbnRlZC1jbHVzdGVyczogI29wdGlvbmFsIHRvdGFsIG51bWJlciBvZiBmcmFnbWVudGVkIGNsdXN0ZXJzLCB0aGlzCisjICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpcyBwcmVzZW50IGlmIHRoZSBkcml2ZXIgZm9yIHRoZSBpbWFnZSBmb3JtYXQKKyMgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIGl0CisjCisjIEBjb21wcmVzc2VkLWNsdXN0ZXJzOiAjb3B0aW9uYWwgdG90YWwgbnVtYmVyIG9mIGNvbXByZXNzZWQgY2x1c3RlcnMsIHRoaXMKKyMgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIHByZXNlbnQgaWYgdGhlIGRyaXZlciBmb3IgdGhlIGltYWdlIGZvcm1hdAorIyAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgaXQKKyMKKyMgU2luY2U6IDEuNAorIworIyMKKworeyAndHlwZSc6ICdJbWFnZUNoZWNrJywKKyAgJ2RhdGEnOiB7J2ZpbGVuYW1lJzogJ3N0cicsICdmb3JtYXQnOiAnc3RyJywgJ2NoZWNrLWVycm9ycyc6ICdpbnQnLAorICAgICAgICAgICAnKmltYWdlLWVuZC1vZmZzZXQnOiAnaW50JywgJypjb3JydXB0aW9ucyc6ICdpbnQnLCAnKmxlYWtzJzogJ2ludCcsCisgICAgICAgICAgICcqY29ycnVwdGlvbnMtZml4ZWQnOiAnaW50JywgJypsZWFrcy1maXhlZCc6ICdpbnQnLAorICAgICAgICAgICAnKnRvdGFsLWNsdXN0ZXJzJzogJ2ludCcsICcqYWxsb2NhdGVkLWNsdXN0ZXJzJzogJ2ludCcsCisgICAgICAgICAgICcqZnJhZ21lbnRlZC1jbHVzdGVycyc6ICdpbnQnLCAnKmNvbXByZXNzZWQtY2x1c3RlcnMnOiAnaW50JyB9IH0KKworIyMKKyMgQFN0YXR1c0luZm86CisjCisjIEluZm9ybWF0aW9uIGFib3V0IFZDUFUgcnVuIHN0YXRlCisjCisjIEBydW5uaW5nOiB0cnVlIGlmIGFsbCBWQ1BVcyBhcmUgcnVubmFibGUsIGZhbHNlIGlmIG5vdCBydW5uYWJsZQorIworIyBAc2luZ2xlc3RlcDogdHJ1ZSBpZiBWQ1BVcyBhcmUgaW4gc2luZ2xlLXN0ZXAgbW9kZQorIworIyBAc3RhdHVzOiB0aGUgdmlydHVhbCBtYWNoaW5lIEBSdW5TdGF0ZQorIworIyBTaW5jZTogIDAuMTQuMAorIworIyBOb3RlczogQHNpbmdsZXN0ZXAgaXMgZW5hYmxlZCB0aHJvdWdoIHRoZSBHREIgc3R1YgorIyMKK3sgJ3R5cGUnOiAnU3RhdHVzSW5mbycsCisgICdkYXRhJzogeydydW5uaW5nJzogJ2Jvb2wnLCAnc2luZ2xlc3RlcCc6ICdib29sJywgJ3N0YXR1cyc6ICdSdW5TdGF0ZSd9IH0KKworIyMKKyMgQHF1ZXJ5LXN0YXR1czoKKyMKKyMgUXVlcnkgdGhlIHJ1biBzdGF0dXMgb2YgYWxsIFZDUFVzCisjCisjIFJldHVybnM6IEBTdGF0dXNJbmZvIHJlZmxlY3RpbmcgYWxsIFZDUFVzCisjCisjIFNpbmNlOiAgMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1zdGF0dXMnLCAncmV0dXJucyc6ICdTdGF0dXNJbmZvJyB9CisKKyMjCisjIEBVdWlkSW5mbzoKKyMKKyMgR3Vlc3QgVVVJRCBpbmZvcm1hdGlvbi4KKyMKKyMgQFVVSUQ6IHRoZSBVVUlEIG9mIHRoZSBndWVzdAorIworIyBTaW5jZTogMC4xNC4wCisjCisjIE5vdGVzOiBJZiBubyBVVUlEIHdhcyBzcGVjaWZpZWQgZm9yIHRoZSBndWVzdCwgYSBudWxsIFVVSUQgaXMgcmV0dXJuZWQuCisjIworeyAndHlwZSc6ICdVdWlkSW5mbycsICdkYXRhJzogeydVVUlEJzogJ3N0cid9IH0KKworIyMKKyMgQHF1ZXJ5LXV1aWQ6CisjCisjIFF1ZXJ5IHRoZSBndWVzdCBVVUlEIGluZm9ybWF0aW9uLgorIworIyBSZXR1cm5zOiBUaGUgQFV1aWRJbmZvIGZvciB0aGUgZ3Vlc3QKKyMKKyMgU2luY2UgMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS11dWlkJywgJ3JldHVybnMnOiAnVXVpZEluZm8nIH0KKworIyMKKyMgQENoYXJkZXZJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIGNoYXJhY3RlciBkZXZpY2UuCisjCisjIEBsYWJlbDogdGhlIGxhYmVsIG9mIHRoZSBjaGFyYWN0ZXIgZGV2aWNlCisjCisjIEBmaWxlbmFtZTogdGhlIGZpbGVuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgZGV2aWNlCisjCisjIE5vdGVzOiBAZmlsZW5hbWUgaXMgZW5jb2RlZCB1c2luZyB0aGUgUUVNVSBjb21tYW5kIGxpbmUgY2hhcmFjdGVyIGRldmljZQorIyAgICAgICAgZW5jb2RpbmcuICBTZWUgdGhlIFFFTVUgbWFuIHBhZ2UgZm9yIGRldGFpbHMuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ0NoYXJkZXZJbmZvJywgJ2RhdGEnOiB7J2xhYmVsJzogJ3N0cicsICdmaWxlbmFtZSc6ICdzdHInfSB9CisKKyMjCisjIEBxdWVyeS1jaGFyZGV2OgorIworIyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgY2hhcmFjdGVyIGRldmljZXMuCisjCisjIFJldHVybnM6IGEgbGlzdCBvZiBAQ2hhcmRldkluZm8KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktY2hhcmRldicsICdyZXR1cm5zJzogWydDaGFyZGV2SW5mbyddIH0KKworIyMKKyMgQERhdGFGb3JtYXQ6CisjCisjIEFuIGVudW1lcmF0aW9uIG9mIGRhdGEgZm9ybWF0LgorIworIyBAdXRmODogRGF0YSBpcyBhIFVURi04IHN0cmluZyAoUkZDIDM2MjkpCisjCisjIEBiYXNlNjQ6IERhdGEgaXMgQmFzZTY0IGVuY29kZWQgYmluYXJ5IChSRkMgMzU0OCkKKyMKKyMgU2luY2U6IDEuNAorIyMKK3sgJ2VudW0nOiAnRGF0YUZvcm1hdCcsCisgICdkYXRhJzogWyAndXRmOCcsICdiYXNlNjQnIF0gfQorCisjIworIyBAcmluZ2J1Zi13cml0ZToKKyMKKyMgV3JpdGUgdG8gYSByaW5nIGJ1ZmZlciBjaGFyYWN0ZXIgZGV2aWNlLgorIworIyBAZGV2aWNlOiB0aGUgcmluZyBidWZmZXIgY2hhcmFjdGVyIGRldmljZSBuYW1lCisjCisjIEBkYXRhOiBkYXRhIHRvIHdyaXRlCisjCisjIEBmb3JtYXQ6ICNvcHRpb25hbCBkYXRhIGVuY29kaW5nIChkZWZhdWx0ICd1dGY4JykuCisjICAgICAgICAgIC0gYmFzZTY0OiBkYXRhIG11c3QgYmUgYmFzZTY0IGVuY29kZWQgdGV4dC4gIEl0cyBiaW5hcnkKKyMgICAgICAgICAgICBkZWNvZGluZyBnZXRzIHdyaXR0ZW4uCisjICAgICAgICAgICAgQnVnOiBpbnZhbGlkIGJhc2U2NCBpcyBjdXJyZW50bHkgbm90IHJlamVjdGVkLgorIyAgICAgICAgICAgIFdoaXRlc3BhY2UgKmlzKiBpbnZhbGlkLgorIyAgICAgICAgICAtIHV0Zjg6IGRhdGEncyBVVEYtOCBlbmNvZGluZyBpcyB3cml0dGVuCisjICAgICAgICAgIC0gZGF0YSBpdHNlbGYgaXMgYWx3YXlzIFVuaWNvZGUgcmVnYXJkbGVzcyBvZiBmb3JtYXQsIGxpa2UKKyMgICAgICAgICAgICBhbnkgb3RoZXIgc3RyaW5nLgorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDEuNAorIyMKK3sgJ2NvbW1hbmQnOiAncmluZ2J1Zi13cml0ZScsCisgICdkYXRhJzogeydkZXZpY2UnOiAnc3RyJywgJ2RhdGEnOiAnc3RyJywKKyAgICAgICAgICAgJypmb3JtYXQnOiAnRGF0YUZvcm1hdCd9IH0KKworIyMKKyMgQHJpbmdidWYtcmVhZDoKKyMKKyMgUmVhZCBmcm9tIGEgcmluZyBidWZmZXIgY2hhcmFjdGVyIGRldmljZS4KKyMKKyMgQGRldmljZTogdGhlIHJpbmcgYnVmZmVyIGNoYXJhY3RlciBkZXZpY2UgbmFtZQorIworIyBAc2l6ZTogaG93IG1hbnkgYnl0ZXMgdG8gcmVhZCBhdCBtb3N0CisjCisjIEBmb3JtYXQ6ICNvcHRpb25hbCBkYXRhIGVuY29kaW5nIChkZWZhdWx0ICd1dGY4JykuCisjICAgICAgICAgIC0gYmFzZTY0OiB0aGUgZGF0YSByZWFkIGlzIHJldHVybmVkIGluIGJhc2U2NCBlbmNvZGluZy4KKyMgICAgICAgICAgLSB1dGY4OiB0aGUgZGF0YSByZWFkIGlzIGludGVycHJldGVkIGFzIFVURi04LgorIyAgICAgICAgICAgIEJ1ZzogY2FuIHNjcmV3IHVwIHdoZW4gdGhlIGJ1ZmZlciBjb250YWlucyBpbnZhbGlkIFVURi04CisjICAgICAgICAgICAgc2VxdWVuY2VzLCBOVUwgY2hhcmFjdGVycywgYWZ0ZXIgdGhlIHJpbmcgYnVmZmVyIGxvc3QKKyMgICAgICAgICAgICBkYXRhLCBhbmQgd2hlbiByZWFkaW5nIHN0b3BzIGJlY2F1c2UgdGhlIHNpemUgbGltaXQgaXMKKyMgICAgICAgICAgICByZWFjaGVkLgorIyAgICAgICAgICAtIFRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIFVuaWNvZGUgcmVnYXJkbGVzcyBvZiBmb3JtYXQsCisjICAgICAgICAgICAgbGlrZSBhbnkgb3RoZXIgc3RyaW5nLgorIworIyBSZXR1cm5zOiBkYXRhIHJlYWQgZnJvbSB0aGUgZGV2aWNlCisjCisjIFNpbmNlOiAxLjQKKyMjCit7ICdjb21tYW5kJzogJ3JpbmdidWYtcmVhZCcsCisgICdkYXRhJzogeydkZXZpY2UnOiAnc3RyJywgJ3NpemUnOiAnaW50JywgJypmb3JtYXQnOiAnRGF0YUZvcm1hdCd9LAorICAncmV0dXJucyc6ICdzdHInIH0KKworIyMKKyMgQENvbW1hbmRJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFFNUCBjb21tYW5kCisjCisjIEBuYW1lOiBUaGUgY29tbWFuZCBuYW1lCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ0NvbW1hbmRJbmZvJywgJ2RhdGEnOiB7J25hbWUnOiAnc3RyJ30gfQorCisjIworIyBAcXVlcnktY29tbWFuZHM6CisjCisjIFJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIFFNUCBjb21tYW5kcyBieSB0aGlzIHNlcnZlcgorIworIyBSZXR1cm5zOiBBIGxpc3Qgb2YgQENvbW1hbmRJbmZvIGZvciBhbGwgc3VwcG9ydGVkIGNvbW1hbmRzCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LWNvbW1hbmRzJywgJ3JldHVybnMnOiBbJ0NvbW1hbmRJbmZvJ10gfQorCisjIworIyBARXZlbnRJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFFNUCBldmVudAorIworIyBAbmFtZTogVGhlIGV2ZW50IG5hbWUKKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAndHlwZSc6ICdFdmVudEluZm8nLCAnZGF0YSc6IHsnbmFtZSc6ICdzdHInfSB9CisKKyMjCisjIEBxdWVyeS1ldmVudHM6CisjCisjIFJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIFFNUCBldmVudHMgYnkgdGhpcyBzZXJ2ZXIKKyMKKyMgUmV0dXJuczogQSBsaXN0IG9mIEBFdmVudEluZm8gZm9yIGFsbCBzdXBwb3J0ZWQgZXZlbnRzCisjCisjIFNpbmNlOiAxLjIuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktZXZlbnRzJywgJ3JldHVybnMnOiBbJ0V2ZW50SW5mbyddIH0KKworIyMKKyMgQE1pZ3JhdGlvblN0YXRzCisjCisjIERldGFpbGVkIG1pZ3JhdGlvbiBzdGF0dXMuCisjCisjIEB0cmFuc2ZlcnJlZDogYW1vdW50IG9mIGJ5dGVzIGFscmVhZHkgdHJhbnNmZXJyZWQgdG8gdGhlIHRhcmdldCBWTQorIworIyBAcmVtYWluaW5nOiBhbW91bnQgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHRyYW5zZmVycmVkIHRvIHRoZSB0YXJnZXQgVk0KKyMKKyMgQHRvdGFsOiB0b3RhbCBhbW91bnQgb2YgYnl0ZXMgaW52b2x2ZWQgaW4gdGhlIG1pZ3JhdGlvbiBwcm9jZXNzCisjCisjIEBkdXBsaWNhdGU6IG51bWJlciBvZiBkdXBsaWNhdGUgKHplcm8pIHBhZ2VzIChzaW5jZSAxLjIpCisjCisjIEBza2lwcGVkOiBudW1iZXIgb2Ygc2tpcHBlZCB6ZXJvIHBhZ2VzIChzaW5jZSAxLjUpCisjCisjIEBub3JtYWwgOiBudW1iZXIgb2Ygbm9ybWFsIHBhZ2VzIChzaW5jZSAxLjIpCisjCisjIEBub3JtYWwtYnl0ZXM6IG51bWJlciBvZiBub3JtYWwgYnl0ZXMgc2VudCAoc2luY2UgMS4yKQorIworIyBAZGlydHktcGFnZXMtcmF0ZTogbnVtYmVyIG9mIHBhZ2VzIGRpcnRpZWQgYnkgc2Vjb25kIGJ5IHRoZQorIyAgICAgICAgZ3Vlc3QgKHNpbmNlIDEuMykKKyMKKyMgQG1icHM6IHRocm91Z2hwdXQgaW4gbWVnYWJpdHMvc2VjLiAoc2luY2UgMS42KQorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAndHlwZSc6ICdNaWdyYXRpb25TdGF0cycsCisgICdkYXRhJzogeyd0cmFuc2ZlcnJlZCc6ICdpbnQnLCAncmVtYWluaW5nJzogJ2ludCcsICd0b3RhbCc6ICdpbnQnICwKKyAgICAgICAgICAgJ2R1cGxpY2F0ZSc6ICdpbnQnLCAnc2tpcHBlZCc6ICdpbnQnLCAnbm9ybWFsJzogJ2ludCcsCisgICAgICAgICAgICdub3JtYWwtYnl0ZXMnOiAnaW50JywgJ2RpcnR5LXBhZ2VzLXJhdGUnIDogJ2ludCcsCisgICAgICAgICAgICdtYnBzJyA6ICdudW1iZXInIH0gfQorCisjIworIyBAWEJaUkxFQ2FjaGVTdGF0cworIworIyBEZXRhaWxlZCBYQlpSTEUgbWlncmF0aW9uIGNhY2hlIHN0YXRpc3RpY3MKKyMKKyMgQGNhY2hlLXNpemU6IFhCWlJMRSBjYWNoZSBzaXplCisjCisjIEBieXRlczogYW1vdW50IG9mIGJ5dGVzIGFscmVhZHkgdHJhbnNmZXJyZWQgdG8gdGhlIHRhcmdldCBWTQorIworIyBAcGFnZXM6IGFtb3VudCBvZiBwYWdlcyB0cmFuc2ZlcnJlZCB0byB0aGUgdGFyZ2V0IFZNCisjCisjIEBjYWNoZS1taXNzOiBudW1iZXIgb2YgY2FjaGUgbWlzcworIworIyBAb3ZlcmZsb3c6IG51bWJlciBvZiBvdmVyZmxvd3MKKyMKKyMgU2luY2U6IDEuMgorIyMKK3sgJ3R5cGUnOiAnWEJaUkxFQ2FjaGVTdGF0cycsCisgICdkYXRhJzogeydjYWNoZS1zaXplJzogJ2ludCcsICdieXRlcyc6ICdpbnQnLCAncGFnZXMnOiAnaW50JywKKyAgICAgICAgICAgJ2NhY2hlLW1pc3MnOiAnaW50JywgJ292ZXJmbG93JzogJ2ludCcgfSB9CisKKyMjCisjIEBNaWdyYXRpb25JbmZvCisjCisjIEluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgbWlncmF0aW9uIHByb2Nlc3MuCisjCisjIEBzdGF0dXM6ICNvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY3VycmVudCBtaWdyYXRpb24gc3RhdHVzLgorIyAgICAgICAgICBBcyBvZiAwLjE0LjAgdGhpcyBjYW4gYmUgJ2FjdGl2ZScsICdjb21wbGV0ZWQnLCAnZmFpbGVkJyBvcgorIyAgICAgICAgICAnY2FuY2VsbGVkJy4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcmV0dXJuZWQsIG5vIG1pZ3JhdGlvbiBwcm9jZXNzCisjICAgICAgICAgIGhhcyBiZWVuIGluaXRpYXRlZAorIworIyBAcmFtOiAjb3B0aW9uYWwgQE1pZ3JhdGlvblN0YXRzIGNvbnRhaW5pbmcgZGV0YWlsZWQgbWlncmF0aW9uCisjICAgICAgIHN0YXR1cywgb25seSByZXR1cm5lZCBpZiBzdGF0dXMgaXMgJ2FjdGl2ZScgb3IKKyMgICAgICAgJ2NvbXBsZXRlZCcuICdjb21wcGxldGVkJyAoc2luY2UgMS4yKQorIworIyBAZGlzazogI29wdGlvbmFsIEBNaWdyYXRpb25TdGF0cyBjb250YWluaW5nIGRldGFpbGVkIGRpc2sgbWlncmF0aW9uCisjICAgICAgICBzdGF0dXMsIG9ubHkgcmV0dXJuZWQgaWYgc3RhdHVzIGlzICdhY3RpdmUnIGFuZCBpdCBpcyBhIGJsb2NrCisjICAgICAgICBtaWdyYXRpb24KKyMKKyMgQHhienJsZS1jYWNoZTogI29wdGlvbmFsIEBYQlpSTEVDYWNoZVN0YXRzIGNvbnRhaW5pbmcgZGV0YWlsZWQgWEJaUkxFCisjICAgICAgICAgICAgICAgIG1pZ3JhdGlvbiBzdGF0aXN0aWNzLCBvbmx5IHJldHVybmVkIGlmIFhCWlJMRSBmZWF0dXJlIGlzIG9uIGFuZAorIyAgICAgICAgICAgICAgICBzdGF0dXMgaXMgJ2FjdGl2ZScgb3IgJ2NvbXBsZXRlZCcgKHNpbmNlIDEuMikKKyMKKyMgQHRvdGFsLXRpbWU6ICNvcHRpb25hbCB0b3RhbCBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIG1pZ3JhdGlvbiBzdGFydGVkLgorIyAgICAgICAgSWYgbWlncmF0aW9uIGhhcyBlbmRlZCwgaXQgcmV0dXJucyB0aGUgdG90YWwgbWlncmF0aW9uCisjICAgICAgICB0aW1lLiAoc2luY2UgMS4yKQorIworIyBAZG93bnRpbWU6ICNvcHRpb25hbCBvbmx5IHByZXNlbnQgd2hlbiBtaWdyYXRpb24gZmluaXNoZXMgY29ycmVjdGx5CisjICAgICAgICB0b3RhbCBkb3dudGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBndWVzdC4KKyMgICAgICAgIChzaW5jZSAxLjMpCisjCisjIEBleHBlY3RlZC1kb3dudGltZTogI29wdGlvbmFsIG9ubHkgcHJlc2VudCB3aGlsZSBtaWdyYXRpb24gaXMgYWN0aXZlCisjICAgICAgICBleHBlY3RlZCBkb3dudGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBndWVzdCBpbiBsYXN0IHdhbGsKKyMgICAgICAgIG9mIHRoZSBkaXJ0eSBiaXRtYXAuIChzaW5jZSAxLjMpCisjCisjIEBzZXR1cC10aW1lOiAjb3B0aW9uYWwgYW1vdW50IG9mIHNldHVwIHRpbWUgaW4gbWlsbGlzZWNvbmRzIF9iZWZvcmVfIHRoZQorIyAgICAgICAgaXRlcmF0aW9ucyBiZWdpbiBidXQgX2FmdGVyXyB0aGUgUU1QIGNvbW1hbmQgaXMgaXNzdWVkLiBUaGlzIGlzIGRlc2lnbmVkCisjICAgICAgICB0byBwcm92aWRlIGFuIGFjY291bnRpbmcgb2YgYW55IGFjdGl2aXRpZXMgKHN1Y2ggYXMgUkRNQSBwaW5uaW5nKSB3aGljaAorIyAgICAgICAgbWF5IGJlIGV4cGVuc2l2ZSwgYnV0IGRvIG5vdCBhY3R1YWxseSBvY2N1ciBkdXJpbmcgdGhlIGl0ZXJhdGl2ZQorIyAgICAgICAgbWlncmF0aW9uIHJvdW5kcyB0aGVtc2VsdmVzLiAoc2luY2UgMS42KQorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAndHlwZSc6ICdNaWdyYXRpb25JbmZvJywKKyAgJ2RhdGEnOiB7JypzdGF0dXMnOiAnc3RyJywgJypyYW0nOiAnTWlncmF0aW9uU3RhdHMnLAorICAgICAgICAgICAnKmRpc2snOiAnTWlncmF0aW9uU3RhdHMnLAorICAgICAgICAgICAnKnhienJsZS1jYWNoZSc6ICdYQlpSTEVDYWNoZVN0YXRzJywKKyAgICAgICAgICAgJyp0b3RhbC10aW1lJzogJ2ludCcsCisgICAgICAgICAgICcqZXhwZWN0ZWQtZG93bnRpbWUnOiAnaW50JywKKyAgICAgICAgICAgJypkb3dudGltZSc6ICdpbnQnLAorICAgICAgICAgICAnKnNldHVwLXRpbWUnOiAnaW50J30gfQorCisjIworIyBAcXVlcnktbWlncmF0ZQorIworIyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgbWlncmF0aW9uIHByb2Nlc3MuCisjCisjIFJldHVybnM6IEBNaWdyYXRpb25JbmZvCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LW1pZ3JhdGUnLCAncmV0dXJucyc6ICdNaWdyYXRpb25JbmZvJyB9CisKKyMjCisjIEBNaWdyYXRpb25DYXBhYmlsaXR5CisjCisjIE1pZ3JhdGlvbiBjYXBhYmlsaXRpZXMgZW51bWVyYXRpb24KKyMKKyMgQHhienJsZTogTWlncmF0aW9uIHN1cHBvcnRzIHhienJsZSAoWG9yIEJhc2VkIFplcm8gUnVuIExlbmd0aCBFbmNvZGluZykuCisjICAgICAgICAgIFRoaXMgZmVhdHVyZSBhbGxvd3MgdXMgdG8gbWluaW1pemUgbWlncmF0aW9uIHRyYWZmaWMgZm9yIGNlcnRhaW4gd29yaworIyAgICAgICAgICBsb2FkcywgYnkgc2VuZGluZyBjb21wcmVzc2VkIGRpZmZlcmVuY2Ugb2YgdGhlIHBhZ2VzCisjCisjIEB4LXJkbWEtcGluLWFsbDogQ29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGVudGlyZSBWTSBtZW1vcnkgZm9vdHByaW50IGlzCisjICAgICAgICAgIG1sb2NrKCknZCBvbiBkZW1hbmQgb3IgYWxsIGF0IG9uY2UuIFJlZmVyIHRvIGRvY3MvcmRtYS50eHQgZm9yIHVzYWdlLgorIyAgICAgICAgICBEaXNhYmxlZCBieSBkZWZhdWx0LiBFeHBlcmltZW50YWw6IG1heSAob3IgbWF5IG5vdCkgYmUgcmVuYW1lZCBhZnRlcgorIyAgICAgICAgICBmdXJ0aGVyIHRlc3RpbmcgaXMgY29tcGxldGUuIChzaW5jZSAxLjYpCisjCisjIEB6ZXJvLWJsb2NrczogRHVyaW5nIHN0b3JhZ2UgbWlncmF0aW9uIGVuY29kZSBibG9ja3Mgb2YgemVyb2VzIGVmZmljaWVudGx5LiBUaGlzCisjICAgICAgICAgIGVzc2VudGlhbGx5IHNhdmVzIDFNQiBvZiB6ZXJvZXMgcGVyIGJsb2NrIG9uIHRoZSB3aXJlLiBFbmFibGluZyByZXF1aXJlcworIyAgICAgICAgICBzb3VyY2UgYW5kIHRhcmdldCBWTSB0byBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gVG8gZW5hYmxlIGl0IGlzIHN1ZmZpY2llbnQKKyMgICAgICAgICAgdG8gZW5hYmxlIHRoZSBjYXBhYmlsaXR5IG9uIHRoZSBzb3VyY2UgVk0uIFRoZSBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5CisjICAgICAgICAgIGRlZmF1bHQuIChzaW5jZSAxLjYpCisjCisjIEBhdXRvLWNvbnZlcmdlOiBJZiBlbmFibGVkLCBRRU1VIHdpbGwgYXV0b21hdGljYWxseSB0aHJvdHRsZSBkb3duIHRoZSBndWVzdAorIyAgICAgICAgICB0byBzcGVlZCB1cCBjb252ZXJnZW5jZSBvZiBSQU0gbWlncmF0aW9uLiAoc2luY2UgMS42KQorIworIyBTaW5jZTogMS4yCisjIworeyAnZW51bSc6ICdNaWdyYXRpb25DYXBhYmlsaXR5JywKKyAgJ2RhdGEnOiBbJ3hienJsZScsICd4LXJkbWEtcGluLWFsbCcsICdhdXRvLWNvbnZlcmdlJywgJ3plcm8tYmxvY2tzJ10gfQorCisjIworIyBATWlncmF0aW9uQ2FwYWJpbGl0eVN0YXR1cworIworIyBNaWdyYXRpb24gY2FwYWJpbGl0eSBpbmZvcm1hdGlvbgorIworIyBAY2FwYWJpbGl0eTogY2FwYWJpbGl0eSBlbnVtCisjCisjIEBzdGF0ZTogY2FwYWJpbGl0eSBzdGF0ZSBib29sCisjCisjIFNpbmNlOiAxLjIKKyMjCit7ICd0eXBlJzogJ01pZ3JhdGlvbkNhcGFiaWxpdHlTdGF0dXMnLAorICAnZGF0YSc6IHsgJ2NhcGFiaWxpdHknIDogJ01pZ3JhdGlvbkNhcGFiaWxpdHknLCAnc3RhdGUnIDogJ2Jvb2wnIH0gfQorCisjIworIyBAbWlncmF0ZS1zZXQtY2FwYWJpbGl0aWVzCisjCisjIEVuYWJsZS9EaXNhYmxlIHRoZSBmb2xsb3dpbmcgbWlncmF0aW9uIGNhcGFiaWxpdGllcyAobGlrZSB4YnpybGUpCisjCisjIEBjYXBhYmlsaXRpZXM6IGpzb24gYXJyYXkgb2YgY2FwYWJpbGl0eSBtb2RpZmljYXRpb25zIHRvIG1ha2UKKyMKKyMgU2luY2U6IDEuMgorIyMKK3sgJ2NvbW1hbmQnOiAnbWlncmF0ZS1zZXQtY2FwYWJpbGl0aWVzJywKKyAgJ2RhdGEnOiB7ICdjYXBhYmlsaXRpZXMnOiBbJ01pZ3JhdGlvbkNhcGFiaWxpdHlTdGF0dXMnXSB9IH0KKworIyMKKyMgQHF1ZXJ5LW1pZ3JhdGUtY2FwYWJpbGl0aWVzCisjCisjIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgbWlncmF0aW9uIGNhcGFiaWxpdGllcyBzdGF0dXMKKyMKKyMgUmV0dXJuczogQE1pZ3JhdGlvbkNhcGFiaWxpdGllc1N0YXR1cworIworIyBTaW5jZTogMS4yCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1taWdyYXRlLWNhcGFiaWxpdGllcycsICdyZXR1cm5zJzogICBbJ01pZ3JhdGlvbkNhcGFiaWxpdHlTdGF0dXMnXX0KKworIyMKKyMgQE1vdXNlSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBtb3VzZSBkZXZpY2UuCisjCisjIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbW91c2UgZGV2aWNlCisjCisjIEBpbmRleDogdGhlIGluZGV4IG9mIHRoZSBtb3VzZSBkZXZpY2UKKyMKKyMgQGN1cnJlbnQ6IHRydWUgaWYgdGhpcyBkZXZpY2UgaXMgY3VycmVudGx5IHJlY2VpdmluZyBtb3VzZSBldmVudHMKKyMKKyMgQGFic29sdXRlOiB0cnVlIGlmIHRoaXMgZGV2aWNlIHN1cHBvcnRzIGFic29sdXRlIGNvb3JkaW5hdGVzIGFzIGlucHV0CisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ01vdXNlSW5mbycsCisgICdkYXRhJzogeyduYW1lJzogJ3N0cicsICdpbmRleCc6ICdpbnQnLCAnY3VycmVudCc6ICdib29sJywKKyAgICAgICAgICAgJ2Fic29sdXRlJzogJ2Jvb2wnfSB9CisKKyMjCisjIEBxdWVyeS1taWNlOgorIworIyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggYWN0aXZlIG1vdXNlIGRldmljZQorIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgQE1vdXNlSW5mbyBmb3IgZWFjaCBkZXZpY2UKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktbWljZScsICdyZXR1cm5zJzogWydNb3VzZUluZm8nXSB9CisKKyMjCisjIEBDcHVJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIHZpcnR1YWwgQ1BVCisjCisjIEBDUFU6IHRoZSBpbmRleCBvZiB0aGUgdmlydHVhbCBDUFUKKyMKKyMgQGN1cnJlbnQ6IHRoaXMgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmxlIGFuZCBzaG91bGQgYmUgaWdub3JlZAorIworIyBAaGFsdGVkOiB0cnVlIGlmIHRoZSB2aXJ0dWFsIENQVSBpcyBpbiB0aGUgaGFsdCBzdGF0ZS4gIEhhbHQgdXN1YWxseSByZWZlcnMKKyMgICAgICAgICAgdG8gYSBwcm9jZXNzb3Igc3BlY2lmaWMgbG93IHBvd2VyIG1vZGUuCisjCisjIEBwYzogI29wdGlvbmFsIElmIHRoZSB0YXJnZXQgaXMgaTM4NiBvciB4ODZfNjQsIHRoaXMgaXMgdGhlIDY0LWJpdCBpbnN0cnVjdGlvbgorIyAgICAgICAgICAgICAgICBwb2ludGVyLgorIyAgICAgICAgICAgICAgICBJZiB0aGUgdGFyZ2V0IGlzIFNwYXJjLCB0aGlzIGlzIHRoZSBQQyBjb21wb25lbnQgb2YgdGhlCisjICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIHBvaW50ZXIuCisjCisjIEBuaXA6ICNvcHRpb25hbCBJZiB0aGUgdGFyZ2V0IGlzIFBQQywgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIKKyMKKyMgQG5wYzogI29wdGlvbmFsIElmIHRoZSB0YXJnZXQgaXMgU3BhcmMsIHRoZSBOUEMgY29tcG9uZW50IG9mIHRoZSBpbnN0cnVjdGlvbgorIyAgICAgICAgICAgICAgICAgcG9pbnRlcgorIworIyBAUEM6ICNvcHRpb25hbCBJZiB0aGUgdGFyZ2V0IGlzIE1JUFMsIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyCisjCisjIEB0aHJlYWRfaWQ6IElEIG9mIHRoZSB1bmRlcmx5aW5nIGhvc3QgdGhyZWFkCisjCisjIFNpbmNlOiAwLjE0LjAKKyMKKyMgTm90ZXM6IEBoYWx0ZWQgaXMgYSB0cmFuc2llbnQgc3RhdGUgdGhhdCBjaGFuZ2VzIGZyZXF1ZW50bHkuICBCeSB0aGUgdGltZSB0aGUKKyMgICAgICAgIGRhdGEgaXMgc2VudCB0byB0aGUgY2xpZW50LCB0aGUgZ3Vlc3QgbWF5IG5vIGxvbmdlciBiZSBoYWx0ZWQuCisjIworeyAndHlwZSc6ICdDcHVJbmZvJywKKyAgJ2RhdGEnOiB7J0NQVSc6ICdpbnQnLCAnY3VycmVudCc6ICdib29sJywgJ2hhbHRlZCc6ICdib29sJywgJypwYyc6ICdpbnQnLAorICAgICAgICAgICAnKm5pcCc6ICdpbnQnLCAnKm5wYyc6ICdpbnQnLCAnKlBDJzogJ2ludCcsICd0aHJlYWRfaWQnOiAnaW50J30gfQorCisjIworIyBAcXVlcnktY3B1czoKKyMKKyMgUmV0dXJucyBhIGxpc3Qgb2YgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCB2aXJ0dWFsIENQVS4KKyMKKyMgUmV0dXJuczogYSBsaXN0IG9mIEBDcHVJbmZvIGZvciBlYWNoIHZpcnR1YWwgQ1BVCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LWNwdXMnLCAncmV0dXJucyc6IFsnQ3B1SW5mbyddIH0KKworIyMKKyMgQEJsb2NrRGV2aWNlSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhY2tpbmcgZGV2aWNlIGZvciBhIGJsb2NrIGRldmljZS4KKyMKKyMgQGZpbGU6IHRoZSBmaWxlbmFtZSBvZiB0aGUgYmFja2luZyBkZXZpY2UKKyMKKyMgQHJvOiB0cnVlIGlmIHRoZSBiYWNraW5nIGRldmljZSB3YXMgb3BlbiByZWFkLW9ubHkKKyMKKyMgQGRydjogdGhlIG5hbWUgb2YgdGhlIGJsb2NrIGZvcm1hdCB1c2VkIHRvIG9wZW4gdGhlIGJhY2tpbmcgZGV2aWNlLiBBcyBvZgorIyAgICAgICAwLjE0LjAgdGhpcyBjYW4gYmU6ICdibGtkZWJ1ZycsICdib2NocycsICdjbG9vcCcsICdjb3cnLCAnZG1nJywKKyMgICAgICAgJ2ZpbGUnLCAnZmlsZScsICdmdHAnLCAnZnRwcycsICdob3N0X2Nkcm9tJywgJ2hvc3RfZGV2aWNlJywKKyMgICAgICAgJ2hvc3RfZmxvcHB5JywgJ2h0dHAnLCAnaHR0cHMnLCAnbmJkJywgJ3BhcmFsbGVscycsICdxY293JywKKyMgICAgICAgJ3Fjb3cyJywgJ3JhdycsICd0ZnRwJywgJ3ZkaScsICd2bWRrJywgJ3ZwYycsICd2dmZhdCcKKyMKKyMgQGJhY2tpbmdfZmlsZTogI29wdGlvbmFsIHRoZSBuYW1lIG9mIHRoZSBiYWNraW5nIGZpbGUgKGZvciBjb3B5LW9uLXdyaXRlKQorIworIyBAYmFja2luZ19maWxlX2RlcHRoOiBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIGJhY2tpbmcgZmlsZSBjaGFpbiAoc2luY2U6IDEuMikKKyMKKyMgQGVuY3J5cHRlZDogdHJ1ZSBpZiB0aGUgYmFja2luZyBkZXZpY2UgaXMgZW5jcnlwdGVkCisjCisjIEBlbmNyeXB0aW9uX2tleV9taXNzaW5nOiB0cnVlIGlmIHRoZSBiYWNraW5nIGRldmljZSBpcyBlbmNyeXB0ZWQgYnV0IGFuCisjICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBlbmNyeXB0aW9uIGtleSBpcyBtaXNzaW5nCisjCisjIEBicHM6IHRvdGFsIHRocm91Z2hwdXQgbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZCBpcyBzcGVjaWZpZWQKKyMKKyMgQGJwc19yZDogcmVhZCB0aHJvdWdocHV0IGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQgaXMgc3BlY2lmaWVkCisjCisjIEBicHNfd3I6IHdyaXRlIHRocm91Z2hwdXQgbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZCBpcyBzcGVjaWZpZWQKKyMKKyMgQGlvcHM6IHRvdGFsIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQgaXMgc3BlY2lmaWVkCisjCisjIEBpb3BzX3JkOiByZWFkIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQgaXMgc3BlY2lmaWVkCisjCisjIEBpb3BzX3dyOiB3cml0ZSBJL08gb3BlcmF0aW9ucyBwZXIgc2Vjb25kIGlzIHNwZWNpZmllZAorIworIyBAaW1hZ2U6IHRoZSBpbmZvIG9mIGltYWdlIHVzZWQgKHNpbmNlOiAxLjYpCisjCisjIEBicHNfbWF4OiAjb3B0aW9uYWwgdG90YWwgbWF4IGluIGJ5dGVzIChTaW5jZSAxLjcpCisjCisjIEBicHNfcmRfbWF4OiAjb3B0aW9uYWwgcmVhZCBtYXggaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgQGJwc193cl9tYXg6ICNvcHRpb25hbCB3cml0ZSBtYXggaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgQGlvcHNfbWF4OiAjb3B0aW9uYWwgdG90YWwgSS9PIG9wZXJhdGlvbnMgbWF4IChTaW5jZSAxLjcpCisjCisjIEBpb3BzX3JkX21heDogI29wdGlvbmFsIHJlYWQgSS9PIG9wZXJhdGlvbnMgbWF4IChTaW5jZSAxLjcpCisjCisjIEBpb3BzX3dyX21heDogI29wdGlvbmFsIHdyaXRlIEkvTyBvcGVyYXRpb25zIG1heCAoU2luY2UgMS43KQorIworIyBAaW9wc19zaXplOiAjb3B0aW9uYWwgYW4gSS9PIHNpemUgaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgU2luY2U6IDAuMTQuMAorIworIyBOb3RlczogVGhpcyBpbnRlcmZhY2UgaXMgb25seSBmb3VuZCBpbiBAQmxvY2tJbmZvLgorIyMKK3sgJ3R5cGUnOiAnQmxvY2tEZXZpY2VJbmZvJywKKyAgJ2RhdGEnOiB7ICdmaWxlJzogJ3N0cicsICdybyc6ICdib29sJywgJ2Rydic6ICdzdHInLAorICAgICAgICAgICAgJypiYWNraW5nX2ZpbGUnOiAnc3RyJywgJ2JhY2tpbmdfZmlsZV9kZXB0aCc6ICdpbnQnLAorICAgICAgICAgICAgJ2VuY3J5cHRlZCc6ICdib29sJywgJ2VuY3J5cHRpb25fa2V5X21pc3NpbmcnOiAnYm9vbCcsCisgICAgICAgICAgICAnYnBzJzogJ2ludCcsICdicHNfcmQnOiAnaW50JywgJ2Jwc193cic6ICdpbnQnLAorICAgICAgICAgICAgJ2lvcHMnOiAnaW50JywgJ2lvcHNfcmQnOiAnaW50JywgJ2lvcHNfd3InOiAnaW50JywKKyAgICAgICAgICAgICdpbWFnZSc6ICdJbWFnZUluZm8nLAorICAgICAgICAgICAgJypicHNfbWF4JzogJ2ludCcsICcqYnBzX3JkX21heCc6ICdpbnQnLAorICAgICAgICAgICAgJypicHNfd3JfbWF4JzogJ2ludCcsICcqaW9wc19tYXgnOiAnaW50JywKKyAgICAgICAgICAgICcqaW9wc19yZF9tYXgnOiAnaW50JywgJyppb3BzX3dyX21heCc6ICdpbnQnLAorICAgICAgICAgICAgJyppb3BzX3NpemUnOiAnaW50JyB9IH0KKworIyMKKyMgQEJsb2NrRGV2aWNlSW9TdGF0dXM6CisjCisjIEFuIGVudW1lcmF0aW9uIG9mIGJsb2NrIGRldmljZSBJL08gc3RhdHVzLgorIworIyBAb2s6IFRoZSBsYXN0IEkvTyBvcGVyYXRpb24gaGFzIHN1Y2NlZWRlZAorIworIyBAZmFpbGVkOiBUaGUgbGFzdCBJL08gb3BlcmF0aW9uIGhhcyBmYWlsZWQKKyMKKyMgQG5vc3BhY2U6IFRoZSBsYXN0IEkvTyBvcGVyYXRpb24gaGFzIGZhaWxlZCBkdWUgdG8gYSBuby1zcGFjZSBjb25kaXRpb24KKyMKKyMgU2luY2U6IDEuMAorIyMKK3sgJ2VudW0nOiAnQmxvY2tEZXZpY2VJb1N0YXR1cycsICdkYXRhJzogWyAnb2snLCAnZmFpbGVkJywgJ25vc3BhY2UnIF0gfQorCisjIworIyBAQmxvY2tEZXZpY2VNYXBFbnRyeToKKyMKKyMgRW50cnkgaW4gdGhlIG1ldGFkYXRhIG1hcCBvZiB0aGUgZGV2aWNlIChyZXR1cm5lZCBieSAicWVtdS1pbWcgbWFwIikKKyMKKyMgQHN0YXJ0OiBPZmZzZXQgaW4gdGhlIGltYWdlIG9mIHRoZSBmaXJzdCBieXRlIGRlc2NyaWJlZCBieSB0aGlzIGVudHJ5CisjICAgICAgICAgKGluIGJ5dGVzKQorIworIyBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIHJhbmdlIGRlc2NyaWJlZCBieSB0aGlzIGVudHJ5IChpbiBieXRlcykKKyMKKyMgQGRlcHRoOiBOdW1iZXIgb2YgbGF5ZXJzICgwID0gdG9wIGltYWdlLCAxID0gdG9wIGltYWdlJ3MgYmFja2luZyBmaWxlLCBldGMuKQorIyAgICAgICAgIGJlZm9yZSByZWFjaGluZyBvbmUgZm9yIHdoaWNoIHRoZSByYW5nZSBpcyBhbGxvY2F0ZWQuICBUaGUgdmFsdWUgaXMKKyMgICAgICAgICBpbiB0aGUgcmFuZ2UgMCB0byB0aGUgZGVwdGggb2YgdGhlIGltYWdlIGNoYWluIC0gMS4KKyMKKyMgQHplcm86IHRoZSBzZWN0b3JzIGluIHRoaXMgcmFuZ2UgcmVhZCBhcyB6ZXJvcworIworIyBAZGF0YTogcmVhZGluZyB0aGUgaW1hZ2Ugd2lsbCBhY3R1YWxseSByZWFkIGRhdGEgZnJvbSBhIGZpbGUgKGluIHBhcnRpY3VsYXIsCisjICAgICAgICBpZiBAb2Zmc2V0IGlzIHByZXNlbnQgdGhpcyBtZWFucyB0aGF0IHRoZSBzZWN0b3JzIGFyZSBub3Qgc2ltcGx5CisjICAgICAgICBwcmVhbGxvY2F0ZWQsIGJ1dCBjb250YWluIGFjdHVhbCBkYXRhIGluIHJhdyBmb3JtYXQpCisjCisjIEBvZmZzZXQ6IGlmIHByZXNlbnQsIHRoZSBpbWFnZSBmaWxlIHN0b3JlcyB0aGUgZGF0YSBmb3IgdGhpcyByYW5nZSBpbgorIyAgICAgICAgICByYXcgZm9ybWF0IGF0IHRoZSBnaXZlbiBvZmZzZXQuCisjCisjIFNpbmNlIDEuNworIyMKK3sgJ3R5cGUnOiAnQmxvY2tEZXZpY2VNYXBFbnRyeScsCisgICdkYXRhJzogeyAnc3RhcnQnOiAnaW50JywgJ2xlbmd0aCc6ICdpbnQnLCAnZGVwdGgnOiAnaW50JywgJ3plcm8nOiAnYm9vbCcsCisgICAgICAgICAgICAnZGF0YSc6ICdib29sJywgJypvZmZzZXQnOiAnaW50JyB9IH0KKworIyMKKyMgQEJsb2NrRGlydHlJbmZvOgorIworIyBCbG9jayBkaXJ0eSBiaXRtYXAgaW5mb3JtYXRpb24uCisjCisjIEBjb3VudDogbnVtYmVyIG9mIGRpcnR5IGJ5dGVzIGFjY29yZGluZyB0byB0aGUgZGlydHkgYml0bWFwCisjCisjIEBncmFudWxhcml0eTogZ3JhbnVsYXJpdHkgb2YgdGhlIGRpcnR5IGJpdG1hcCBpbiBieXRlcyAoc2luY2UgMS40KQorIworIyBTaW5jZTogMS4zCisjIworeyAndHlwZSc6ICdCbG9ja0RpcnR5SW5mbycsCisgICdkYXRhJzogeydjb3VudCc6ICdpbnQnLCAnZ3JhbnVsYXJpdHknOiAnaW50J30gfQorCisjIworIyBAQmxvY2tJbmZvOgorIworIyBCbG9jayBkZXZpY2UgaW5mb3JtYXRpb24uICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSB2aXJ0dWFsIGRldmljZSBhbmQKKyMgdGhlIGJhY2tpbmcgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyMKKyMgQGRldmljZTogVGhlIGRldmljZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlydHVhbCBkZXZpY2UuCisjCisjIEB0eXBlOiBUaGlzIGZpZWxkIGlzIHJldHVybmVkIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucywgaXQgc2hvdWxkCisjICAgICAgICBub3QgYmUgdXNlZCAoYWx3YXlzIHJldHVybnMgJ3Vua25vd24nKQorIworIyBAcmVtb3ZhYmxlOiBUcnVlIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcmVtb3ZhYmxlIG1lZGlhLgorIworIyBAbG9ja2VkOiBUcnVlIGlmIHRoZSBndWVzdCBoYXMgbG9ja2VkIHRoaXMgZGV2aWNlIGZyb20gaGF2aW5nIGl0cyBtZWRpYQorIyAgICAgICAgICByZW1vdmVkCisjCisjIEB0cmF5X29wZW46ICNvcHRpb25hbCBUcnVlIGlmIHRoZSBkZXZpY2UgaGFzIGEgdHJheSBhbmQgaXQgaXMgb3BlbgorIyAgICAgICAgICAgICAob25seSBwcmVzZW50IGlmIHJlbW92YWJsZSBpcyB0cnVlKQorIworIyBAZGlydHktYml0bWFwczogI29wdGlvbmFsIGRpcnR5IGJpdG1hcHMgaW5mb3JtYXRpb24gKG9ubHkgcHJlc2VudCBpZiB0aGUKKyMgICAgICAgICAgICAgICAgIGRyaXZlciBoYXMgb25lIG9yIG1vcmUgZGlydHkgYml0bWFwcykgKFNpbmNlIDEuOCkKKyMKKyMgQGlvLXN0YXR1czogI29wdGlvbmFsIEBCbG9ja0RldmljZUlvU3RhdHVzLiBPbmx5IHByZXNlbnQgaWYgdGhlIGRldmljZQorIyAgICAgICAgICAgICBzdXBwb3J0cyBpdCBhbmQgdGhlIFZNIGlzIGNvbmZpZ3VyZWQgdG8gc3RvcCBvbiBlcnJvcnMKKyMKKyMgQGluc2VydGVkOiAjb3B0aW9uYWwgQEJsb2NrRGV2aWNlSW5mbyBkZXNjcmliaW5nIHRoZSBkZXZpY2UgaWYgbWVkaWEgaXMKKyMgICAgICAgICAgICBwcmVzZW50CisjCisjIFNpbmNlOiAgMC4xNC4wCisjIworeyAndHlwZSc6ICdCbG9ja0luZm8nLAorICAnZGF0YSc6IHsnZGV2aWNlJzogJ3N0cicsICd0eXBlJzogJ3N0cicsICdyZW1vdmFibGUnOiAnYm9vbCcsCisgICAgICAgICAgICdsb2NrZWQnOiAnYm9vbCcsICcqaW5zZXJ0ZWQnOiAnQmxvY2tEZXZpY2VJbmZvJywKKyAgICAgICAgICAgJyp0cmF5X29wZW4nOiAnYm9vbCcsICcqaW8tc3RhdHVzJzogJ0Jsb2NrRGV2aWNlSW9TdGF0dXMnLAorICAgICAgICAgICAnKmRpcnR5LWJpdG1hcHMnOiBbJ0Jsb2NrRGlydHlJbmZvJ10gfSB9CisKKyMjCisjIEBxdWVyeS1ibG9jazoKKyMKKyMgR2V0IGEgbGlzdCBvZiBCbG9ja0luZm8gZm9yIGFsbCB2aXJ0dWFsIGJsb2NrIGRldmljZXMuCisjCisjIFJldHVybnM6IGEgbGlzdCBvZiBAQmxvY2tJbmZvIGRlc2NyaWJpbmcgZWFjaCB2aXJ0dWFsIGJsb2NrIGRldmljZQorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1ibG9jaycsICdyZXR1cm5zJzogWydCbG9ja0luZm8nXSB9CisKKyMjCisjIEBCbG9ja0RldmljZVN0YXRzOgorIworIyBTdGF0aXN0aWNzIG9mIGEgdmlydHVhbCBibG9jayBkZXZpY2Ugb3IgYSBibG9jayBiYWNraW5nIGRldmljZS4KKyMKKyMgQHJkX2J5dGVzOiAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBieSB0aGUgZGV2aWNlLgorIworIyBAd3JfYnl0ZXM6ICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGJ5IHRoZSBkZXZpY2UuCisjCisjIEByZF9vcGVyYXRpb25zOiBUaGUgbnVtYmVyIG9mIHJlYWQgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIGRldmljZS4KKyMKKyMgQHdyX29wZXJhdGlvbnM6IFRoZSBudW1iZXIgb2Ygd3JpdGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIGRldmljZS4KKyMKKyMgQGZsdXNoX29wZXJhdGlvbnM6IFRoZSBudW1iZXIgb2YgY2FjaGUgZmx1c2ggb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgdGhlCisjICAgICAgICAgICAgICAgICAgICBkZXZpY2UgKHNpbmNlIDAuMTUuMCkKKyMKKyMgQGZsdXNoX3RvdGFsX3RpbWVfbnM6IFRvdGFsIHRpbWUgc3BlbmQgb24gY2FjaGUgZmx1c2hlcyBpbiBuYW5vLXNlY29uZHMKKyMgICAgICAgICAgICAgICAgICAgICAgIChzaW5jZSAwLjE1LjApLgorIworIyBAd3JfdG90YWxfdGltZV9uczogVG90YWwgdGltZSBzcGVuZCBvbiB3cml0ZXMgaW4gbmFuby1zZWNvbmRzIChzaW5jZSAwLjE1LjApLgorIworIyBAcmRfdG90YWxfdGltZV9uczogVG90YWxfdGltZV9zcGVuZCBvbiByZWFkcyBpbiBuYW5vLXNlY29uZHMgKHNpbmNlIDAuMTUuMCkuCisjCisjIEB3cl9oaWdoZXN0X29mZnNldDogVGhlIG9mZnNldCBhZnRlciB0aGUgZ3JlYXRlc3QgYnl0ZSB3cml0dGVuIHRvIHRoZQorIyAgICAgICAgICAgICAgICAgICAgIGRldmljZS4gIFRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBmb3IKKyMgICAgICAgICAgICAgICAgICAgICBncm93YWJsZSBzcGFyc2UgZmlsZXMgKGxpa2UgcWNvdzIpIHRoYXQgYXJlIHVzZWQgb24gdG9wCisjICAgICAgICAgICAgICAgICAgICAgb2YgYSBwaHlzaWNhbCBkZXZpY2UuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ0Jsb2NrRGV2aWNlU3RhdHMnLAorICAnZGF0YSc6IHsncmRfYnl0ZXMnOiAnaW50JywgJ3dyX2J5dGVzJzogJ2ludCcsICdyZF9vcGVyYXRpb25zJzogJ2ludCcsCisgICAgICAgICAgICd3cl9vcGVyYXRpb25zJzogJ2ludCcsICdmbHVzaF9vcGVyYXRpb25zJzogJ2ludCcsCisgICAgICAgICAgICdmbHVzaF90b3RhbF90aW1lX25zJzogJ2ludCcsICd3cl90b3RhbF90aW1lX25zJzogJ2ludCcsCisgICAgICAgICAgICdyZF90b3RhbF90aW1lX25zJzogJ2ludCcsICd3cl9oaWdoZXN0X29mZnNldCc6ICdpbnQnIH0gfQorCisjIworIyBAQmxvY2tTdGF0czoKKyMKKyMgU3RhdGlzdGljcyBvZiBhIHZpcnR1YWwgYmxvY2sgZGV2aWNlIG9yIGEgYmxvY2sgYmFja2luZyBkZXZpY2UuCisjCisjIEBkZXZpY2U6ICNvcHRpb25hbCBJZiB0aGUgc3RhdHMgYXJlIGZvciBhIHZpcnR1YWwgYmxvY2sgZGV2aWNlLCB0aGUgbmFtZQorIyAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSB2aXJ0dWFsIGJsb2NrIGRldmljZS4KKyMKKyMgQHN0YXRzOiAgQSBAQmxvY2tEZXZpY2VTdGF0cyBmb3IgdGhlIGRldmljZS4KKyMKKyMgQHBhcmVudDogI29wdGlvbmFsIFRoaXMgbWF5IHBvaW50IHRvIHRoZSBiYWNraW5nIGJsb2NrIGRldmljZSBpZiB0aGlzIGlzIGEKKyMgICAgICAgICAgYSB2aXJ0dWFsIGJsb2NrIGRldmljZS4gIElmIGl0J3MgYSBiYWNraW5nIGJsb2NrLCB0aGlzIHdpbGwgcG9pbnQKKyMgICAgICAgICAgdG8gdGhlIGJhY2tpbmcgZmlsZSBpcyBvbmUgaXMgcHJlc2VudC4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnQmxvY2tTdGF0cycsCisgICdkYXRhJzogeycqZGV2aWNlJzogJ3N0cicsICdzdGF0cyc6ICdCbG9ja0RldmljZVN0YXRzJywKKyAgICAgICAgICAgJypwYXJlbnQnOiAnQmxvY2tTdGF0cyd9IH0KKworIyMKKyMgQHF1ZXJ5LWJsb2Nrc3RhdHM6CisjCisjIFF1ZXJ5IHRoZSBAQmxvY2tTdGF0cyBmb3IgYWxsIHZpcnR1YWwgYmxvY2sgZGV2aWNlcy4KKyMKKyMgUmV0dXJuczogQSBsaXN0IG9mIEBCbG9ja1N0YXRzIGZvciBlYWNoIHZpcnR1YWwgYmxvY2sgZGV2aWNlcy4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktYmxvY2tzdGF0cycsICdyZXR1cm5zJzogWydCbG9ja1N0YXRzJ10gfQorCisjIworIyBAVm5jQ2xpZW50SW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBjb25uZWN0ZWQgVk5DIGNsaWVudC4KKyMKKyMgQGhvc3Q6IFRoZSBob3N0IG5hbWUgb2YgdGhlIGNsaWVudC4gIFFFTVUgdHJpZXMgdG8gcmVzb2x2ZSB0aGlzIHRvIGEgRE5TIG5hbWUKKyMgICAgICAgIHdoZW4gcG9zc2libGUuCisjCisjIEBmYW1pbHk6ICdpcHY2JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgSVB2NiBhbmQgVENQCisjICAgICAgICAgICdpcHY0JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgSVB2NCBhbmQgVENQCisjICAgICAgICAgICd1bml4JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgYSB1bml4IGRvbWFpbiBzb2NrZXQKKyMgICAgICAgICAgJ3Vua25vd24nIG90aGVyd2lzZQorIworIyBAc2VydmljZTogVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgY2xpZW50J3MgcG9ydC4gIFRoaXMgbWF5IGRlcGVuZHMgb24gdGhlCisjICAgICAgICAgICBob3N0IHN5c3RlbSdzIHNlcnZpY2UgZGF0YWJhc2Ugc28gc3ltYm9saWMgbmFtZXMgc2hvdWxkIG5vdCBiZQorIyAgICAgICAgICAgcmVsaWVkIG9uLgorIworIyBAeDUwOV9kbmFtZTogI29wdGlvbmFsIElmIHg1MDkgYXV0aGVudGljYXRpb24gaXMgaW4gdXNlLCB0aGUgRGlzdGluZ3Vpc2hlZAorIyAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgY2xpZW50LgorIworIyBAc2FzbF91c2VybmFtZTogI29wdGlvbmFsIElmIFNBU0wgYXV0aGVudGljYXRpb24gaXMgaW4gdXNlLCB0aGUgU0FTTCB1c2VybmFtZQorIyAgICAgICAgICAgICAgICAgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ1ZuY0NsaWVudEluZm8nLAorICAnZGF0YSc6IHsnaG9zdCc6ICdzdHInLCAnZmFtaWx5JzogJ3N0cicsICdzZXJ2aWNlJzogJ3N0cicsCisgICAgICAgICAgICcqeDUwOV9kbmFtZSc6ICdzdHInLCAnKnNhc2xfdXNlcm5hbWUnOiAnc3RyJ30gfQorCisjIworIyBAVm5jSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIFZOQyBzZXNzaW9uLgorIworIyBAZW5hYmxlZDogdHJ1ZSBpZiB0aGUgVk5DIHNlcnZlciBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UKKyMKKyMgQGhvc3Q6ICNvcHRpb25hbCBUaGUgaG9zdG5hbWUgdGhlIFZOQyBzZXJ2ZXIgaXMgYm91bmQgdG8uICBUaGlzIGRlcGVuZHMgb24KKyMgICAgICAgIHRoZSBuYW1lIHJlc29sdXRpb24gb24gdGhlIGhvc3QgYW5kIG1heSBiZSBhbiBJUCBhZGRyZXNzLgorIworIyBAZmFtaWx5OiAjb3B0aW9uYWwgJ2lwdjYnIGlmIHRoZSBob3N0IGlzIGxpc3RlbmluZyBmb3IgSVB2NiBjb25uZWN0aW9ucworIyAgICAgICAgICAgICAgICAgICAgJ2lwdjQnIGlmIHRoZSBob3N0IGlzIGxpc3RlbmluZyBmb3IgSVB2NCBjb25uZWN0aW9ucworIyAgICAgICAgICAgICAgICAgICAgJ3VuaXgnIGlmIHRoZSBob3N0IGlzIGxpc3RlbmluZyBvbiBhIHVuaXggZG9tYWluIHNvY2tldAorIyAgICAgICAgICAgICAgICAgICAgJ3Vua25vd24nIG90aGVyd2lzZQorIworIyBAc2VydmljZTogI29wdGlvbmFsIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHBvcnQuICBUaGlzIG1heSBkZXBlbmRzCisjICAgICAgICAgICBvbiB0aGUgaG9zdCBzeXN0ZW0ncyBzZXJ2aWNlIGRhdGFiYXNlIHNvIHN5bWJvbGljIG5hbWVzIHNob3VsZCBub3QKKyMgICAgICAgICAgIGJlIHJlbGllZCBvbi4KKyMKKyMgQGF1dGg6ICNvcHRpb25hbCB0aGUgY3VycmVudCBhdXRoZW50aWNhdGlvbiB0eXBlIHVzZWQgYnkgdGhlIHNlcnZlcgorIyAgICAgICAgJ25vbmUnIGlmIG5vIGF1dGhlbnRpY2F0aW9uIGlzIGJlaW5nIHVzZWQKKyMgICAgICAgICd2bmMnIGlmIFZOQyBhdXRoZW50aWNhdGlvbiBpcyBiZWluZyB1c2VkCisjICAgICAgICAndmVuY3J5cHQrcGxhaW4nIGlmIFZFbmNyeXB0IGlzIHVzZWQgd2l0aCBwbGFpbiB0ZXh0IGF1dGhlbnRpY2F0aW9uCisjICAgICAgICAndmVuY3J5cHQrdGxzK25vbmUnIGlmIFZFbmNyeXB0IGlzIHVzZWQgd2l0aCBUTFMgYW5kIG5vIGF1dGhlbnRpY2F0aW9uCisjICAgICAgICAndmVuY3J5cHQrdGxzK3ZuYycgaWYgVkVuY3J5cHQgaXMgdXNlZCB3aXRoIFRMUyBhbmQgVk5DIGF1dGhlbnRpY2F0aW9uCisjICAgICAgICAndmVuY3J5cHQrdGxzK3BsYWluJyBpZiBWRW5jcnlwdCBpcyB1c2VkIHdpdGggVExTIGFuZCBwbGFpbiB0ZXh0IGF1dGgKKyMgICAgICAgICd2ZW5jcnlwdCt4NTA5K25vbmUnIGlmIFZFbmNyeXB0IGlzIHVzZWQgd2l0aCB4NTA5IGFuZCBubyBhdXRoCisjICAgICAgICAndmVuY3J5cHQreDUwOSt2bmMnIGlmIFZFbmNyeXB0IGlzIHVzZWQgd2l0aCB4NTA5IGFuZCBWTkMgYXV0aAorIyAgICAgICAgJ3ZlbmNyeXB0K3g1MDkrcGxhaW4nIGlmIFZFbmNyeXB0IGlzIHVzZWQgd2l0aCB4NTA5IGFuZCBwbGFpbiB0ZXh0IGF1dGgKKyMgICAgICAgICd2ZW5jcnlwdCt0bHMrc2FzbCcgaWYgVkVuY3J5cHQgaXMgdXNlZCB3aXRoIFRMUyBhbmQgU0FTTCBhdXRoCisjICAgICAgICAndmVuY3J5cHQreDUwOStzYXNsJyBpZiBWRW5jcnlwdCBpcyB1c2VkIHdpdGggeDUwOSBhbmQgU0FTTCBhdXRoCisjCisjIEBjbGllbnRzOiBhIGxpc3Qgb2YgQFZuY0NsaWVudEluZm8gb2YgYWxsIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAndHlwZSc6ICdWbmNJbmZvJywKKyAgJ2RhdGEnOiB7J2VuYWJsZWQnOiAnYm9vbCcsICcqaG9zdCc6ICdzdHInLCAnKmZhbWlseSc6ICdzdHInLAorICAgICAgICAgICAnKnNlcnZpY2UnOiAnc3RyJywgJyphdXRoJzogJ3N0cicsICcqY2xpZW50cyc6IFsnVm5jQ2xpZW50SW5mbyddfSB9CisKKyMjCisjIEBxdWVyeS12bmM6CisjCisjIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgVk5DIHNlcnZlcgorIworIyBSZXR1cm5zOiBAVm5jSW5mbworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS12bmMnLCAncmV0dXJucyc6ICdWbmNJbmZvJyB9CisKKyMjCisjIEBTcGljZUNoYW5uZWwKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBTUElDRSBjbGllbnQgY2hhbm5lbC4KKyMKKyMgQGhvc3Q6IFRoZSBob3N0IG5hbWUgb2YgdGhlIGNsaWVudC4gIFFFTVUgdHJpZXMgdG8gcmVzb2x2ZSB0aGlzIHRvIGEgRE5TIG5hbWUKKyMgICAgICAgIHdoZW4gcG9zc2libGUuCisjCisjIEBmYW1pbHk6ICdpcHY2JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgSVB2NiBhbmQgVENQCisjICAgICAgICAgICdpcHY0JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgSVB2NCBhbmQgVENQCisjICAgICAgICAgICd1bml4JyBpZiB0aGUgY2xpZW50IGlzIGNvbm5lY3RlZCB2aWEgYSB1bml4IGRvbWFpbiBzb2NrZXQKKyMgICAgICAgICAgJ3Vua25vd24nIG90aGVyd2lzZQorIworIyBAcG9ydDogVGhlIGNsaWVudCdzIHBvcnQgbnVtYmVyLgorIworIyBAY29ubmVjdGlvbi1pZDogU1BJQ0UgY29ubmVjdGlvbiBpZCBudW1iZXIuICBBbGwgY2hhbm5lbHMgd2l0aCB0aGUgc2FtZSBpZAorIyAgICAgICAgICAgICAgICAgYmVsb25nIHRvIHRoZSBzYW1lIFNQSUNFIHNlc3Npb24uCisjCisjIEBjb25uZWN0aW9uLXR5cGU6IFNQSUNFIGNoYW5uZWwgdHlwZSBudW1iZXIuICAiMSIgaXMgdGhlIG1haW4gY29udHJvbAorIyAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBmaWx0ZXIgZm9yIHRoaXMgb25lIGlmIHlvdSB3YW50IHRvIHRyYWNrIHNwaWNlCisjICAgICAgICAgICAgICAgICAgIHNlc3Npb25zIG9ubHkKKyMKKyMgQGNoYW5uZWwtaWQ6IFNQSUNFIGNoYW5uZWwgSUQgbnVtYmVyLiAgVXN1YWxseSAiMCIsIG1pZ2h0IGJlIGRpZmZlcmVudCB3aGVuCisjICAgICAgICAgICAgICBtdWx0aXBsZSBjaGFubmVscyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0LCBzdWNoIGFzIG11bHRpcGxlCisjICAgICAgICAgICAgICBkaXNwbGF5IGNoYW5uZWxzIGluIGEgbXVsdGloZWFkIHNldHVwCisjCisjIEB0bHM6IHRydWUgaWYgdGhlIGNoYW5uZWwgaXMgZW5jcnlwdGVkLCBmYWxzZSBvdGhlcndpc2UuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ1NwaWNlQ2hhbm5lbCcsCisgICdkYXRhJzogeydob3N0JzogJ3N0cicsICdmYW1pbHknOiAnc3RyJywgJ3BvcnQnOiAnc3RyJywKKyAgICAgICAgICAgJ2Nvbm5lY3Rpb24taWQnOiAnaW50JywgJ2NoYW5uZWwtdHlwZSc6ICdpbnQnLCAnY2hhbm5lbC1pZCc6ICdpbnQnLAorICAgICAgICAgICAndGxzJzogJ2Jvb2wnfSB9CisKKyMjCisjIEBTcGljZVF1ZXJ5TW91c2VNb2RlCisjCisjIEFuIGVudW1lcmF0aW9uIG9mIFNwaWNlIG1vdXNlIHN0YXRlcy4KKyMKKyMgQGNsaWVudDogTW91c2UgY3Vyc29yIHBvc2l0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KKyMKKyMgQHNlcnZlcjogTW91c2UgY3Vyc29yIHBvc2l0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIHNlcnZlci4KKyMKKyMgQHVua25vd246IE5vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhYm91dCBtb3VzZSBtb2RlIHVzZWQgYnkKKyMgICAgICAgICAgIHRoZSBzcGljZSBzZXJ2ZXIuCisjCisjIE5vdGU6IHNwaWNlL2VudW1zLmggaGFzIGEgU3BpY2VNb3VzZU1vZGUgYWxyZWFkeSwgaGVuY2UgdGhlIG5hbWUuCisjCisjIFNpbmNlOiAxLjEKKyMjCit7ICdlbnVtJzogJ1NwaWNlUXVlcnlNb3VzZU1vZGUnLAorICAnZGF0YSc6IFsgJ2NsaWVudCcsICdzZXJ2ZXInLCAndW5rbm93bicgXSB9CisKKyMjCisjIEBTcGljZUluZm8KKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIFNQSUNFIHNlc3Npb24uCisjCisjIEBlbmFibGVkOiB0cnVlIGlmIHRoZSBTUElDRSBzZXJ2ZXIgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisjCisjIEBtaWdyYXRlZDogdHJ1ZSBpZiB0aGUgbGFzdCBndWVzdCBtaWdyYXRpb24gY29tcGxldGVkIGFuZCBzcGljZQorIyAgICAgICAgICAgIG1pZ3JhdGlvbiBoYWQgY29tcGxldGVkIGFzIHdlbGwuIGZhbHNlIG90aGVyd2lzZS4KKyMKKyMgQGhvc3Q6ICNvcHRpb25hbCBUaGUgaG9zdG5hbWUgdGhlIFNQSUNFIHNlcnZlciBpcyBib3VuZCB0by4gIFRoaXMgZGVwZW5kcyBvbgorIyAgICAgICAgdGhlIG5hbWUgcmVzb2x1dGlvbiBvbiB0aGUgaG9zdCBhbmQgbWF5IGJlIGFuIElQIGFkZHJlc3MuCisjCisjIEBwb3J0OiAjb3B0aW9uYWwgVGhlIFNQSUNFIHNlcnZlcidzIHBvcnQgbnVtYmVyLgorIworIyBAY29tcGlsZWQtdmVyc2lvbjogI29wdGlvbmFsIFNQSUNFIHNlcnZlciB2ZXJzaW9uLgorIworIyBAdGxzLXBvcnQ6ICNvcHRpb25hbCBUaGUgU1BJQ0Ugc2VydmVyJ3MgVExTIHBvcnQgbnVtYmVyLgorIworIyBAYXV0aDogI29wdGlvbmFsIHRoZSBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHR5cGUgdXNlZCBieSB0aGUgc2VydmVyCisjICAgICAgICAnbm9uZScgIGlmIG5vIGF1dGhlbnRpY2F0aW9uIGlzIGJlaW5nIHVzZWQKKyMgICAgICAgICdzcGljZScgdXNlcyBTQVNMIG9yIGRpcmVjdCBUTFMgYXV0aGVudGljYXRpb24sIGRlcGVuZGluZyBvbiBjb21tYW5kCisjICAgICAgICAgICAgICAgIGxpbmUgb3B0aW9ucworIworIyBAbW91c2UtbW9kZTogVGhlIG1vZGUgaW4gd2hpY2ggdGhlIG1vdXNlIGN1cnNvciBpcyBkaXNwbGF5ZWQgY3VycmVudGx5LiBDYW4KKyMgICAgICAgICAgICAgIGJlIGRldGVybWluZWQgYnkgdGhlIGNsaWVudCBvciB0aGUgc2VydmVyLCBvciB1bmtub3duIGlmIHNwaWNlCisjICAgICAgICAgICAgICBzZXJ2ZXIgZG9lc24ndCBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24uCisjCisjICAgICAgICAgICAgICBTaW5jZTogMS4xCisjCisjIEBjaGFubmVsczogYSBsaXN0IG9mIEBTcGljZUNoYW5uZWwgZm9yIGVhY2ggYWN0aXZlIHNwaWNlIGNoYW5uZWwKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnU3BpY2VJbmZvJywKKyAgJ2RhdGEnOiB7J2VuYWJsZWQnOiAnYm9vbCcsICdtaWdyYXRlZCc6ICdib29sJywgJypob3N0JzogJ3N0cicsICcqcG9ydCc6ICdpbnQnLAorICAgICAgICAgICAnKnRscy1wb3J0JzogJ2ludCcsICcqYXV0aCc6ICdzdHInLCAnKmNvbXBpbGVkLXZlcnNpb24nOiAnc3RyJywKKyAgICAgICAgICAgJ21vdXNlLW1vZGUnOiAnU3BpY2VRdWVyeU1vdXNlTW9kZScsICcqY2hhbm5lbHMnOiBbJ1NwaWNlQ2hhbm5lbCddfSB9CisKKyMjCisjIEBxdWVyeS1zcGljZQorIworIyBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IFNQSUNFIHNlcnZlcgorIworIyBSZXR1cm5zOiBAU3BpY2VJbmZvCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LXNwaWNlJywgJ3JldHVybnMnOiAnU3BpY2VJbmZvJyB9CisKKyMjCisjIEBCYWxsb29uSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGd1ZXN0IGJhbGxvb24gZGV2aWNlLgorIworIyBAYWN0dWFsOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBiYWxsb29uIGN1cnJlbnRseSBjb250YWlucworIworIyBTaW5jZTogMC4xNC4wCisjCisjIworeyAndHlwZSc6ICdCYWxsb29uSW5mbycsICdkYXRhJzogeydhY3R1YWwnOiAnaW50JyB9IH0KKworIyMKKyMgQHF1ZXJ5LWJhbGxvb246CisjCisjIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmFsbG9vbiBkZXZpY2UuCisjCisjIFJldHVybnM6IEBCYWxsb29uSW5mbyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIHRoZSBiYWxsb29uIGRyaXZlciBpcyBlbmFibGVkIGJ1dCBub3QgZnVuY3Rpb25hbCBiZWNhdXNlIHRoZSBLVk0KKyMgICAgICAgICAga2VybmVsIG1vZHVsZSBjYW5ub3Qgc3VwcG9ydCBpdCwgS3ZtTWlzc2luZ0NhcAorIyAgICAgICAgICBJZiBubyBiYWxsb29uIGRldmljZSBpcyBwcmVzZW50LCBEZXZpY2VOb3RBY3RpdmUKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktYmFsbG9vbicsICdyZXR1cm5zJzogJ0JhbGxvb25JbmZvJyB9CisKKyMjCisjIEBQY2lNZW1vcnlSYW5nZToKKyMKKyMgQSBQQ0kgZGV2aWNlIG1lbW9yeSByZWdpb24KKyMKKyMgQGJhc2U6IHRoZSBzdGFydGluZyBhZGRyZXNzIChndWVzdCBwaHlzaWNhbCkKKyMKKyMgQGxpbWl0OiB0aGUgZW5kaW5nIGFkZHJlc3MgKGd1ZXN0IHBoeXNpY2FsKQorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAndHlwZSc6ICdQY2lNZW1vcnlSYW5nZScsICdkYXRhJzogeydiYXNlJzogJ2ludCcsICdsaW1pdCc6ICdpbnQnfSB9CisKKyMjCisjIEBQY2lNZW1vcnlSZWdpb24KKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBQQ0kgZGV2aWNlIEkvTyByZWdpb24uCisjCisjIEBiYXI6IHRoZSBpbmRleCBvZiB0aGUgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIGZvciB0aGlzIHJlZ2lvbgorIworIyBAdHlwZTogJ2lvJyBpZiB0aGUgcmVnaW9uIGlzIGEgUElPIHJlZ2lvbgorIyAgICAgICAgJ21lbW9yeScgaWYgdGhlIHJlZ2lvbiBpcyBhIE1NSU8gcmVnaW9uCisjCisjIEBwcmVmZXRjaDogI29wdGlvbmFsIGlmIEB0eXBlIGlzICdtZW1vcnknLCB0cnVlIGlmIHRoZSBtZW1vcnkgaXMgcHJlZmV0Y2hhYmxlCisjCisjIEBtZW1fdHlwZV82NDogI29wdGlvbmFsIGlmIEB0eXBlIGlzICdtZW1vcnknLCB0cnVlIGlmIHRoZSBCQVIgaXMgNjQtYml0CisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICd0eXBlJzogJ1BjaU1lbW9yeVJlZ2lvbicsCisgICdkYXRhJzogeydiYXInOiAnaW50JywgJ3R5cGUnOiAnc3RyJywgJ2FkZHJlc3MnOiAnaW50JywgJ3NpemUnOiAnaW50JywKKyAgICAgICAgICAgJypwcmVmZXRjaCc6ICdib29sJywgJyptZW1fdHlwZV82NCc6ICdib29sJyB9IH0KKworIyMKKyMgQFBjaUJyaWRnZUluZm86CisjCisjIEluZm9ybWF0aW9uIGFib3V0IGEgUENJIEJyaWRnZSBkZXZpY2UKKyMKKyMgQGJ1cy5udW1iZXI6IHByaW1hcnkgYnVzIGludGVyZmFjZSBudW1iZXIuICBUaGlzIHNob3VsZCBiZSB0aGUgbnVtYmVyIG9mIHRoZQorIyAgICAgICAgICAgICAgYnVzIHRoZSBkZXZpY2UgcmVzaWRlcyBvbi4KKyMKKyMgQGJ1cy5zZWNvbmRhcnk6IHNlY29uZGFyeSBidXMgaW50ZXJmYWNlIG51bWJlci4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiB0aGUKKyMgICAgICAgICAgICAgICAgIG1haW4gYnVzIGZvciB0aGUgYnJpZGdlCisjCisjIEBidXMuc3Vib3JkaW5hdGU6IFRoaXMgaXMgdGhlIGhpZ2hlc3QgbnVtYmVyIGJ1cyB0aGF0IHJlc2lkZXMgYmVsb3cgdGhlCisjICAgICAgICAgICAgICAgICAgIGJyaWRnZS4KKyMKKyMgQGJ1cy5pb19yYW5nZTogVGhlIFBJTyByYW5nZSBmb3IgYWxsIGRldmljZXMgb24gdGhpcyBicmlkZ2UKKyMKKyMgQGJ1cy5tZW1vcnlfcmFuZ2U6IFRoZSBNTUlPIHJhbmdlIGZvciBhbGwgZGV2aWNlcyBvbiB0aGlzIGJyaWRnZQorIworIyBAYnVzLnByZWZldGNoYWJsZV9yYW5nZTogVGhlIHJhbmdlIG9mIHByZWZldGNoYWJsZSBNTUlPIGZvciBhbGwgZGV2aWNlcyBvbgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBicmlkZ2UKKyMKKyMgQGRldmljZXM6IGEgbGlzdCBvZiBAUGNpRGV2aWNlSW5mbyBmb3IgZWFjaCBkZXZpY2Ugb24gdGhpcyBicmlkZ2UKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnUGNpQnJpZGdlSW5mbycsCisgICdkYXRhJzogeydidXMnOiB7ICdudW1iZXInOiAnaW50JywgJ3NlY29uZGFyeSc6ICdpbnQnLCAnc3Vib3JkaW5hdGUnOiAnaW50JywKKyAgICAgICAgICAgICAgICAgICAgJ2lvX3JhbmdlJzogJ1BjaU1lbW9yeVJhbmdlJywKKyAgICAgICAgICAgICAgICAgICAgJ21lbW9yeV9yYW5nZSc6ICdQY2lNZW1vcnlSYW5nZScsCisgICAgICAgICAgICAgICAgICAgICdwcmVmZXRjaGFibGVfcmFuZ2UnOiAnUGNpTWVtb3J5UmFuZ2UnIH0sCisgICAgICAgICAgICcqZGV2aWNlcyc6IFsnUGNpRGV2aWNlSW5mbyddfSB9CisKKyMjCisjIEBQY2lEZXZpY2VJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFBDSSBkZXZpY2UKKyMKKyMgQGJ1czogdGhlIGJ1cyBudW1iZXIgb2YgdGhlIGRldmljZQorIworIyBAc2xvdDogdGhlIHNsb3QgdGhlIGRldmljZSBpcyBsb2NhdGVkIGluCisjCisjIEBmdW5jdGlvbjogdGhlIGZ1bmN0aW9uIG9mIHRoZSBzbG90IHVzZWQgYnkgdGhlIGRldmljZQorIworIyBAY2xhc3NfaW5mby5kZXNjOiAjb3B0aW9uYWwgYSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGRldmljZSdzIGNsYXNzCisjCisjIEBjbGFzc19pbmZvLmNsYXNzOiB0aGUgY2xhc3MgY29kZSBvZiB0aGUgZGV2aWNlCisjCisjIEBpZC5kZXZpY2U6IHRoZSBQQ0kgZGV2aWNlIGlkCisjCisjIEBpZC52ZW5kb3I6IHRoZSBQQ0kgdmVuZG9yIGlkCisjCisjIEBpcnE6ICNvcHRpb25hbCBpZiBhbiBJUlEgaXMgYXNzaWduZWQgdG8gdGhlIGRldmljZSwgdGhlIElSUSBudW1iZXIKKyMKKyMgQHFkZXZfaWQ6IHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgUENJIGRldmljZQorIworIyBAcGNpX2JyaWRnZTogaWYgdGhlIGRldmljZSBpcyBhIFBDSSBicmlkZ2UsIHRoZSBicmlkZ2UgaW5mb3JtYXRpb24KKyMKKyMgQHJlZ2lvbnM6IGEgbGlzdCBvZiB0aGUgUENJIEkvTyByZWdpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCisjCisjIE5vdGVzOiB0aGUgY29udGVudHMgb2YgQGNsYXNzX2luZm8uZGVzYyBhcmUgbm90IHN0YWJsZSBhbmQgc2hvdWxkIG9ubHkgYmUKKyMgICAgICAgIHRyZWF0ZWQgYXMgaW5mb3JtYXRpb25hbC4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnUGNpRGV2aWNlSW5mbycsCisgICdkYXRhJzogeydidXMnOiAnaW50JywgJ3Nsb3QnOiAnaW50JywgJ2Z1bmN0aW9uJzogJ2ludCcsCisgICAgICAgICAgICdjbGFzc19pbmZvJzogeycqZGVzYyc6ICdzdHInLCAnY2xhc3MnOiAnaW50J30sCisgICAgICAgICAgICdpZCc6IHsnZGV2aWNlJzogJ2ludCcsICd2ZW5kb3InOiAnaW50J30sCisgICAgICAgICAgICcqaXJxJzogJ2ludCcsICdxZGV2X2lkJzogJ3N0cicsICcqcGNpX2JyaWRnZSc6ICdQY2lCcmlkZ2VJbmZvJywKKyAgICAgICAgICAgJ3JlZ2lvbnMnOiBbJ1BjaU1lbW9yeVJlZ2lvbiddfSB9CisKKyMjCisjIEBQY2lJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFBDSSBidXMKKyMKKyMgQGJ1czogdGhlIGJ1cyBpbmRleAorIworIyBAZGV2aWNlczogYSBsaXN0IG9mIGRldmljZXMgb24gdGhpcyBidXMKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ3R5cGUnOiAnUGNpSW5mbycsICdkYXRhJzogeydidXMnOiAnaW50JywgJ2RldmljZXMnOiBbJ1BjaURldmljZUluZm8nXX0gfQorCisjIworIyBAcXVlcnktcGNpOgorIworIyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIFBDSSBidXMgdG9wb2xvZ3kgb2YgdGhlIGd1ZXN0LgorIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgQFBjaUluZm8gZm9yIGVhY2ggUENJIGJ1cworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1wY2knLCAncmV0dXJucyc6IFsnUGNpSW5mbyddIH0KKworIyMKKyMgQEJsb2NrZGV2T25FcnJvcjoKKyMKKyMgQW4gZW51bWVyYXRpb24gb2YgcG9zc2libGUgYmVoYXZpb3JzIGZvciBlcnJvcnMgb24gSS9PIG9wZXJhdGlvbnMuCisjIFRoZSBleGFjdCBtZWFuaW5nIGRlcGVuZHMgb24gd2hldGhlciB0aGUgSS9PIHdhcyBpbml0aWF0ZWQgYnkgYSBndWVzdAorIyBvciBieSBhIGJsb2NrIGpvYgorIworIyBAcmVwb3J0OiBmb3IgZ3Vlc3Qgb3BlcmF0aW9ucywgcmVwb3J0IHRoZSBlcnJvciB0byB0aGUgZ3Vlc3Q7CisjICAgICAgICAgIGZvciBqb2JzLCBjYW5jZWwgdGhlIGpvYgorIworIyBAaWdub3JlOiBpZ25vcmUgdGhlIGVycm9yLCBvbmx5IHJlcG9ydCBhIFFNUCBldmVudCAoQkxPQ0tfSU9fRVJST1IKKyMgICAgICAgICAgb3IgQkxPQ0tfSk9CX0VSUk9SKQorIworIyBAZW5vc3BjOiBzYW1lIGFzIEBzdG9wIG9uIEVOT1NQQywgc2FtZSBhcyBAcmVwb3J0IG90aGVyd2lzZS4KKyMKKyMgQHN0b3A6IGZvciBndWVzdCBvcGVyYXRpb25zLCBzdG9wIHRoZSB2aXJ0dWFsIG1hY2hpbmU7CisjICAgICAgICBmb3Igam9icywgcGF1c2UgdGhlIGpvYgorIworIyBTaW5jZTogMS4zCisjIworeyAnZW51bSc6ICdCbG9ja2Rldk9uRXJyb3InLAorICAnZGF0YSc6IFsncmVwb3J0JywgJ2lnbm9yZScsICdlbm9zcGMnLCAnc3RvcCddIH0KKworIyMKKyMgQE1pcnJvclN5bmNNb2RlOgorIworIyBBbiBlbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiZWhhdmlvcnMgZm9yIHRoZSBpbml0aWFsIHN5bmNocm9uaXphdGlvbgorIyBwaGFzZSBvZiBzdG9yYWdlIG1pcnJvcmluZy4KKyMKKyMgQHRvcDogY29waWVzIGRhdGEgaW4gdGhlIHRvcG1vc3QgaW1hZ2UgdG8gdGhlIGRlc3RpbmF0aW9uCisjCisjIEBmdWxsOiBjb3BpZXMgZGF0YSBmcm9tIGFsbCBpbWFnZXMgdG8gdGhlIGRlc3RpbmF0aW9uCisjCisjIEBub25lOiBvbmx5IGNvcHkgZGF0YSB3cml0dGVuIGZyb20gbm93IG9uCisjCisjIFNpbmNlOiAxLjMKKyMjCit7ICdlbnVtJzogJ01pcnJvclN5bmNNb2RlJywKKyAgJ2RhdGEnOiBbJ3RvcCcsICdmdWxsJywgJ25vbmUnXSB9CisKKyMjCisjIEBCbG9ja0pvYlR5cGU6CisjCisjIFR5cGUgb2YgYSBibG9jayBqb2IuCisjCisjIEBjb21taXQ6IGJsb2NrIGNvbW1pdCBqb2IgdHlwZSwgc2VlICJibG9jay1jb21taXQiCisjCisjIEBzdHJlYW06IGJsb2NrIHN0cmVhbSBqb2IgdHlwZSwgc2VlICJibG9jay1zdHJlYW0iCisjCisjIEBtaXJyb3I6IGRyaXZlIG1pcnJvciBqb2IgdHlwZSwgc2VlICJkcml2ZS1taXJyb3IiCisjCisjIEBiYWNrdXA6IGRyaXZlIGJhY2t1cCBqb2IgdHlwZSwgc2VlICJkcml2ZS1iYWNrdXAiCisjCisjIFNpbmNlOiAxLjcKKyMjCit7ICdlbnVtJzogJ0Jsb2NrSm9iVHlwZScsCisgICdkYXRhJzogWydjb21taXQnLCAnc3RyZWFtJywgJ21pcnJvcicsICdiYWNrdXAnXSB9CisKKyMjCisjIEBCbG9ja0pvYkluZm86CisjCisjIEluZm9ybWF0aW9uIGFib3V0IGEgbG9uZy1ydW5uaW5nIGJsb2NrIGRldmljZSBvcGVyYXRpb24uCisjCisjIEB0eXBlOiB0aGUgam9iIHR5cGUgKCdzdHJlYW0nIGZvciBpbWFnZSBzdHJlYW1pbmcpCisjCisjIEBkZXZpY2U6IHRoZSBibG9jayBkZXZpY2UgbmFtZQorIworIyBAbGVuOiB0aGUgbWF4aW11bSBwcm9ncmVzcyB2YWx1ZQorIworIyBAYnVzeTogZmFsc2UgaWYgdGhlIGpvYiBpcyBrbm93biB0byBiZSBpbiBhIHF1aWVzY2VudCBzdGF0ZSwgd2l0aAorIyAgICAgICAgbm8gcGVuZGluZyBJL08uICBTaW5jZSAxLjMuCisjCisjIEBwYXVzZWQ6IHdoZXRoZXIgdGhlIGpvYiBpcyBwYXVzZWQgb3IsIGlmIEBidXN5IGlzIHRydWUsIHdpbGwKKyMgICAgICAgICAgcGF1c2UgaXRzZWxmIGFzIHNvb24gYXMgcG9zc2libGUuICBTaW5jZSAxLjMuCisjCisjIEBvZmZzZXQ6IHRoZSBjdXJyZW50IHByb2dyZXNzIHZhbHVlCisjCisjIEBzcGVlZDogdGhlIHJhdGUgbGltaXQsIGJ5dGVzIHBlciBzZWNvbmQKKyMKKyMgQGlvLXN0YXR1czogdGhlIHN0YXR1cyBvZiB0aGUgam9iIChzaW5jZSAxLjMpCisjCisjIFNpbmNlOiAxLjEKKyMjCit7ICd0eXBlJzogJ0Jsb2NrSm9iSW5mbycsCisgICdkYXRhJzogeyd0eXBlJzogJ3N0cicsICdkZXZpY2UnOiAnc3RyJywgJ2xlbic6ICdpbnQnLAorICAgICAgICAgICAnb2Zmc2V0JzogJ2ludCcsICdidXN5JzogJ2Jvb2wnLCAncGF1c2VkJzogJ2Jvb2wnLCAnc3BlZWQnOiAnaW50JywKKyAgICAgICAgICAgJ2lvLXN0YXR1cyc6ICdCbG9ja0RldmljZUlvU3RhdHVzJ30gfQorCisjIworIyBAcXVlcnktYmxvY2stam9iczoKKyMKKyMgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGxvbmctcnVubmluZyBibG9jayBkZXZpY2Ugb3BlcmF0aW9ucy4KKyMKKyMgUmV0dXJuczogYSBsaXN0IG9mIEBCbG9ja0pvYkluZm8gZm9yIGVhY2ggYWN0aXZlIGJsb2NrIGpvYgorIworIyBTaW5jZTogMS4xCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1ibG9jay1qb2JzJywgJ3JldHVybnMnOiBbJ0Jsb2NrSm9iSW5mbyddIH0KKworIyMKKyMgQHF1aXQ6CisjCisjIFRoaXMgY29tbWFuZCB3aWxsIGNhdXNlIHRoZSBRRU1VIHByb2Nlc3MgdG8gZXhpdCBncmFjZWZ1bGx5LiAgV2hpbGUgZXZlcnkKKyMgYXR0ZW1wdCBpcyBtYWRlIHRvIHNlbmQgdGhlIFFNUCByZXNwb25zZSBiZWZvcmUgdGVybWluYXRpbmcsIHRoaXMgaXMgbm90CisjIGd1YXJhbnRlZWQuICBXaGVuIHVzaW5nIHRoaXMgaW50ZXJmYWNlLCBhIHByZW1hdHVyZSBFT0Ygd291bGQgbm90IGJlCisjIHVuZXhwZWN0ZWQuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ3F1aXQnIH0KKworIyMKKyMgQHN0b3A6CisjCisjIFN0b3AgYWxsIGd1ZXN0IFZDUFUgZXhlY3V0aW9uLgorIworIyBTaW5jZTogIDAuMTQuMAorIworIyBOb3RlczogIFRoaXMgZnVuY3Rpb24gd2lsbCBzdWNjZWVkIGV2ZW4gaWYgdGhlIGd1ZXN0IGlzIGFscmVhZHkgaW4gdGhlIHN0b3BwZWQKKyMgICAgICAgICBzdGF0ZS4gIEluICJpbm1pZ3JhdGUiIHN0YXRlLCBpdCB3aWxsIGVuc3VyZSB0aGF0IHRoZSBndWVzdAorIyAgICAgICAgIHJlbWFpbnMgcGF1c2VkIG9uY2UgbWlncmF0aW9uIGZpbmlzaGVzLCBhcyBpZiB0aGUgLVMgb3B0aW9uIHdhcworIyAgICAgICAgIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorIyMKK3sgJ2NvbW1hbmQnOiAnc3RvcCcgfQorCisjIworIyBAc3lzdGVtX3Jlc2V0OgorIworIyBQZXJmb3JtcyBhIGhhcmQgcmVzZXQgb2YgYSBndWVzdC4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnc3lzdGVtX3Jlc2V0JyB9CisKKyMjCisjIEBzeXN0ZW1fcG93ZXJkb3duOgorIworIyBSZXF1ZXN0cyB0aGF0IGEgZ3Vlc3QgcGVyZm9ybSBhIHBvd2VyZG93biBvcGVyYXRpb24uCisjCisjIFNpbmNlOiAwLjE0LjAKKyMKKyMgTm90ZXM6IEEgZ3Vlc3QgbWF5IG9yIG1heSBub3QgcmVzcG9uZCB0byB0aGlzIGNvbW1hbmQuICBUaGlzIGNvbW1hbmQKKyMgICAgICAgIHJldHVybmluZyBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZ3Vlc3QgaGFzIGFjY2VwdGVkIHRoZSByZXF1ZXN0IG9yCisjICAgICAgICB0aGF0IGl0IGhhcyBzaHV0IGRvd24uICBNYW55IGd1ZXN0cyB3aWxsIHJlc3BvbmQgdG8gdGhpcyBjb21tYW5kIGJ5CisjICAgICAgICBwcm9tcHRpbmcgdGhlIHVzZXIgaW4gc29tZSB3YXkuCisjIworeyAnY29tbWFuZCc6ICdzeXN0ZW1fcG93ZXJkb3duJyB9CisKKyMjCisjIEBjcHU6CisjCisjIFRoaXMgY29tbWFuZCBpcyBhIG5vcCB0aGF0IGlzIG9ubHkgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiBjb21wYXRpYmlsaXR5LgorIworIyBTaW5jZTogMC4xNC4wCisjCisjIE5vdGVzOiBEbyBub3QgdXNlIHRoaXMgY29tbWFuZC4KKyMjCit7ICdjb21tYW5kJzogJ2NwdScsICdkYXRhJzogeydpbmRleCc6ICdpbnQnfSB9CisKKyMjCisjIEBjcHUtYWRkCisjCisjIEFkZHMgQ1BVIHdpdGggc3BlY2lmaWVkIElECisjCisjIEBpZDogSUQgb2YgQ1BVIHRvIGJlIGNyZWF0ZWQsIHZhbGlkIHZhbHVlcyBbMC4ubWF4X2NwdXMpCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIworIyBTaW5jZSAxLjUKKyMjCit7ICdjb21tYW5kJzogJ2NwdS1hZGQnLCAnZGF0YSc6IHsnaWQnOiAnaW50J30gfQorCisjIworIyBAbWVtc2F2ZToKKyMKKyMgU2F2ZSBhIHBvcnRpb24gb2YgZ3Vlc3QgbWVtb3J5IHRvIGEgZmlsZS4KKyMKKyMgQHZhbDogdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZ3Vlc3QgdG8gc3RhcnQgZnJvbQorIworIyBAc2l6ZTogdGhlIHNpemUgb2YgbWVtb3J5IHJlZ2lvbiB0byBzYXZlCisjCisjIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gc2F2ZSB0aGUgbWVtb3J5IHRvIGFzIGJpbmFyeSBkYXRhCisjCisjIEBjcHUtaW5kZXg6ICNvcHRpb25hbCB0aGUgaW5kZXggb2YgdGhlIHZpcnR1YWwgQ1BVIHRvIHVzZSBmb3IgdHJhbnNsYXRpbmcgdGhlCisjICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGFkZHJlc3MgKGRlZmF1bHRzIHRvIENQVSAwKQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDAuMTQuMAorIworIyBOb3RlczogRXJyb3JzIHdlcmUgbm90IHJlbGlhYmx5IHJldHVybmVkIHVudGlsIDEuMQorIyMKK3sgJ2NvbW1hbmQnOiAnbWVtc2F2ZScsCisgICdkYXRhJzogeyd2YWwnOiAnaW50JywgJ3NpemUnOiAnaW50JywgJ2ZpbGVuYW1lJzogJ3N0cicsICcqY3B1LWluZGV4JzogJ2ludCd9IH0KKworIyMKKyMgQHBtZW1zYXZlOgorIworIyBTYXZlIGEgcG9ydGlvbiBvZiBndWVzdCBwaHlzaWNhbCBtZW1vcnkgdG8gYSBmaWxlLgorIworIyBAdmFsOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgZ3Vlc3QgdG8gc3RhcnQgZnJvbQorIworIyBAc2l6ZTogdGhlIHNpemUgb2YgbWVtb3J5IHJlZ2lvbiB0byBzYXZlCisjCisjIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gc2F2ZSB0aGUgbWVtb3J5IHRvIGFzIGJpbmFyeSBkYXRhCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIworIyBTaW5jZTogMC4xNC4wCisjCisjIE5vdGVzOiBFcnJvcnMgd2VyZSBub3QgcmVsaWFibHkgcmV0dXJuZWQgdW50aWwgMS4xCisjIworeyAnY29tbWFuZCc6ICdwbWVtc2F2ZScsCisgICdkYXRhJzogeyd2YWwnOiAnaW50JywgJ3NpemUnOiAnaW50JywgJ2ZpbGVuYW1lJzogJ3N0cid9IH0KKworIyMKKyMgQGNvbnQ6CisjCisjIFJlc3VtZSBndWVzdCBWQ1BVIGV4ZWN1dGlvbi4KKyMKKyMgU2luY2U6ICAwLjE0LjAKKyMKKyMgUmV0dXJuczogIElmIHN1Y2Nlc3NmdWwsIG5vdGhpbmcKKyMgICAgICAgICAgIElmIFFFTVUgd2FzIHN0YXJ0ZWQgd2l0aCBhbiBlbmNyeXB0ZWQgYmxvY2sgZGV2aWNlIGFuZCBhIGtleSBoYXMKKyMgICAgICAgICAgICAgIG5vdCB5ZXQgYmVlbiBzZXQsIERldmljZUVuY3J5cHRlZC4KKyMKKyMgTm90ZXM6ICBUaGlzIGNvbW1hbmQgd2lsbCBzdWNjZWVkIGlmIHRoZSBndWVzdCBpcyBjdXJyZW50bHkgcnVubmluZy4gIEl0CisjICAgICAgICAgd2lsbCBhbHNvIHN1Y2NlZWQgaWYgdGhlIGd1ZXN0IGlzIGluIHRoZSAiaW5taWdyYXRlIiBzdGF0ZTsgaW4KKyMgICAgICAgICB0aGlzIGNhc2UsIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQgaXMgdG8gbWFrZSBzdXJlIHRoZSBndWVzdAorIyAgICAgICAgIHN0YXJ0cyBvbmNlIG1pZ3JhdGlvbiBmaW5pc2hlcywgcmVtb3ZpbmcgdGhlIGVmZmVjdCBvZiB0aGUgLVMKKyMgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uIGlmIGl0IHdhcyBwYXNzZWQuCisjIworeyAnY29tbWFuZCc6ICdjb250JyB9CisKKyMjCisjIEBzeXN0ZW1fd2FrZXVwOgorIworIyBXYWtldXAgZ3Vlc3QgZnJvbSBzdXNwZW5kLiAgRG9lcyBub3RoaW5nIGluIGNhc2UgdGhlIGd1ZXN0IGlzbid0IHN1c3BlbmRlZC4KKyMKKyMgU2luY2U6ICAxLjEKKyMKKyMgUmV0dXJuczogIG5vdGhpbmcuCisjIworeyAnY29tbWFuZCc6ICdzeXN0ZW1fd2FrZXVwJyB9CisKKyMjCisjIEBpbmplY3Qtbm1pOgorIworIyBJbmplY3RzIGFuIE5vbi1NYXNrYWJsZSBJbnRlcnJ1cHQgaW50byBhbGwgZ3Vlc3QncyBWQ1BVcy4KKyMKKyMgUmV0dXJuczogIElmIHN1Y2Nlc3NmdWwsIG5vdGhpbmcKKyMKKyMgU2luY2U6ICAwLjE0LjAKKyMKKyMgTm90ZXM6IE9ubHkgeDg2IFZpcnR1YWwgTWFjaGluZXMgc3VwcG9ydCB0aGlzIGNvbW1hbmQuCisjIworeyAnY29tbWFuZCc6ICdpbmplY3Qtbm1pJyB9CisKKyMjCisjIEBzZXRfbGluazoKKyMKKyMgU2V0cyB0aGUgbGluayBzdGF0dXMgb2YgYSB2aXJ0dWFsIG5ldHdvcmsgYWRhcHRlci4KKyMKKyMgQG5hbWU6IHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgdmlydHVhbCBuZXR3b3JrIGFkYXB0ZXIKKyMKKyMgQHVwOiB0cnVlIHRvIHNldCB0aGUgbGluayBzdGF0dXMgdG8gYmUgdXAKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBuYW1lIGlzIG5vdCBhIHZhbGlkIG5ldHdvcmsgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZTogMC4xNC4wCisjCisjIE5vdGVzOiBOb3QgYWxsIG5ldHdvcmsgYWRhcHRlcnMgc3VwcG9ydCBzZXR0aW5nIGxpbmsgc3RhdHVzLiAgVGhpcyBjb21tYW5kCisjICAgICAgICB3aWxsIHN1Y2NlZWQgZXZlbiBpZiB0aGUgbmV0d29yayBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgbGluayBzdGF0dXMKKyMgICAgICAgIG5vdGlmaWNhdGlvbi4KKyMjCit7ICdjb21tYW5kJzogJ3NldF9saW5rJywgJ2RhdGEnOiB7J25hbWUnOiAnc3RyJywgJ3VwJzogJ2Jvb2wnfSB9CisKKyMjCisjIEBibG9ja19wYXNzd2Q6CisjCisjIFRoaXMgY29tbWFuZCBzZXRzIHRoZSBwYXNzd29yZCBvZiBhIGJsb2NrIGRldmljZSB0aGF0IGhhcyBub3QgYmVlbiBvcGVuCisjIHdpdGggYSBwYXNzd29yZCBhbmQgcmVxdWlyZXMgb25lLgorIworIyBUaGUgdHdvIGNhc2VzIHdoZXJlIHRoaXMgY2FuIGhhcHBlbiBhcmUgYSBibG9jayBkZXZpY2UgaXMgY3JlYXRlZCB0aHJvdWdoCisjIFFFTVUncyBpbml0aWFsIGNvbW1hbmQgbGluZSBvciBhIGJsb2NrIGRldmljZSBpcyBjaGFuZ2VkIHRocm91Z2ggdGhlIGxlZ2FjeQorIyBAY2hhbmdlIGludGVyZmFjZS4KKyMKKyMgSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGJsb2NrIGRldmljZSBpcyBjcmVhdGVkIHRocm91Z2ggdGhlIGluaXRpYWwgY29tbWFuZAorIyBsaW5lLCB0aGUgVk0gd2lsbCBzdGFydCBpbiB0aGUgc3RvcHBlZCBzdGF0ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgJy1TJyBpcworIyB1c2VkLiAgVGhlIGludGVudGlvbiBpcyBmb3IgYSBtYW5hZ2VtZW50IHRvb2wgdG8gcXVlcnkgdGhlIGJsb2NrIGRldmljZXMgdG8KKyMgZGV0ZXJtaW5lIHdoaWNoIG9uZXMgYXJlIGVuY3J5cHRlZCwgc2V0IHRoZSBwYXNzd29yZHMgd2l0aCB0aGlzIGNvbW1hbmQsIGFuZAorIyB0aGVuIHN0YXJ0IHRoZSBndWVzdCB3aXRoIHRoZSBAY29udCBjb21tYW5kLgorIworIyBAZGV2aWNlOiAgIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gc2V0IHRoZSBwYXNzd29yZCBvbgorIworIyBAcGFzc3dvcmQ6IHRoZSBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBkZXZpY2UKKyMKKyMgUmV0dXJuczogbm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgbm90IGEgdmFsaWQgYmxvY2sgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIyAgICAgICAgICBJZiBAZGV2aWNlIGlzIG5vdCBlbmNyeXB0ZWQsIERldmljZU5vdEVuY3J5cHRlZAorIworIyBOb3RlczogIE5vdCBhbGwgYmxvY2sgZm9ybWF0cyBzdXBwb3J0IGVuY3J5cHRpb24gYW5kIHNvbWUgdGhhdCBkbyBhcmUgbm90CisjICAgICAgICAgYWJsZSB0byB2YWxpZGF0ZSB0aGF0IGEgcGFzc3dvcmQgaXMgY29ycmVjdC4gIERpc2sgY29ycnVwdGlvbiBtYXkKKyMgICAgICAgICBvY2N1ciBpZiBhbiBpbnZhbGlkIHBhc3N3b3JkIGlzIHNwZWNpZmllZC4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnYmxvY2tfcGFzc3dkJywgJ2RhdGEnOiB7J2RldmljZSc6ICdzdHInLCAncGFzc3dvcmQnOiAnc3RyJ30gfQorCisjIworIyBAYmFsbG9vbjoKKyMKKyMgUmVxdWVzdCB0aGUgYmFsbG9vbiBkcml2ZXIgdG8gY2hhbmdlIGl0cyBiYWxsb29uIHNpemUuCisjCisjIEB2YWx1ZTogdGhlIHRhcmdldCBzaXplIG9mIHRoZSBiYWxsb29uIGluIGJ5dGVzCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIyAgICAgICAgICBJZiB0aGUgYmFsbG9vbiBkcml2ZXIgaXMgZW5hYmxlZCBidXQgbm90IGZ1bmN0aW9uYWwgYmVjYXVzZSB0aGUgS1ZNCisjICAgICAgICAgICAga2VybmVsIG1vZHVsZSBjYW5ub3Qgc3VwcG9ydCBpdCwgS3ZtTWlzc2luZ0NhcAorIyAgICAgICAgICBJZiBubyBiYWxsb29uIGRldmljZSBpcyBwcmVzZW50LCBEZXZpY2VOb3RBY3RpdmUKKyMKKyMgTm90ZXM6IFRoaXMgY29tbWFuZCBqdXN0IGlzc3VlcyBhIHJlcXVlc3QgdG8gdGhlIGd1ZXN0LiAgV2hlbiBpdCByZXR1cm5zLAorIyAgICAgICAgdGhlIGJhbGxvb24gc2l6ZSBtYXkgbm90IGhhdmUgY2hhbmdlZC4gIEEgZ3Vlc3QgY2FuIGNoYW5nZSB0aGUgYmFsbG9vbgorIyAgICAgICAgc2l6ZSBpbmRlcGVuZGVudCBvZiB0aGlzIGNvbW1hbmQuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ2JhbGxvb24nLCAnZGF0YSc6IHsndmFsdWUnOiAnaW50J30gfQorCisjIworIyBAYmxvY2tfcmVzaXplCisjCisjIFJlc2l6ZSBhIGJsb2NrIGltYWdlIHdoaWxlIGEgZ3Vlc3QgaXMgcnVubmluZy4KKyMKKyMgQGRldmljZTogIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gZ2V0IHRoZSBpbWFnZSByZXNpemVkCisjCisjIEBzaXplOiAgbmV3IGltYWdlIHNpemUgaW4gYnl0ZXMKKyMKKyMgUmV0dXJuczogbm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgbm90IGEgdmFsaWQgYmxvY2sgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdibG9ja19yZXNpemUnLCAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnc2l6ZSc6ICdpbnQnIH19CisKKyMjCisjIEBOZXdJbWFnZU1vZGUKKyMKKyMgQW4gZW51bWVyYXRpb24gdGhhdCB0ZWxscyBRRU1VIGhvdyB0byBzZXQgdGhlIGJhY2tpbmcgZmlsZSBwYXRoIGluCisjIGEgbmV3IGltYWdlIGZpbGUuCisjCisjIEBleGlzdGluZzogUUVNVSBzaG91bGQgbG9vayBmb3IgYW4gZXhpc3RpbmcgaW1hZ2UgZmlsZS4KKyMKKyMgQGFic29sdXRlLXBhdGhzOiBRRU1VIHNob3VsZCBjcmVhdGUgYSBuZXcgaW1hZ2Ugd2l0aCBhYnNvbHV0ZSBwYXRocworIyBmb3IgdGhlIGJhY2tpbmcgZmlsZS4gSWYgdGhlcmUgaXMgbm8gYmFja2luZyBmaWxlIGF2YWlsYWJsZSwgdGhlIG5ldworIyBpbWFnZSB3aWxsIG5vdCBiZSBiYWNrZWQgZWl0aGVyLgorIworIyBTaW5jZTogMS4xCisjIworeyAnZW51bSc6ICdOZXdJbWFnZU1vZGUnLAorICAnZGF0YSc6IFsgJ2V4aXN0aW5nJywgJ2Fic29sdXRlLXBhdGhzJyBdIH0KKworIyMKKyMgQEJsb2NrZGV2U25hcHNob3QKKyMKKyMgQGRldmljZTogIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UgdG8gZ2VuZXJhdGUgdGhlIHNuYXBzaG90IGZyb20uCisjCisjIEBzbmFwc2hvdC1maWxlOiB0aGUgdGFyZ2V0IG9mIHRoZSBuZXcgaW1hZ2UuIEEgbmV3IGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorIworIyBAZm9ybWF0OiAjb3B0aW9uYWwgdGhlIGZvcm1hdCBvZiB0aGUgc25hcHNob3QgaW1hZ2UsIGRlZmF1bHQgaXMgJ3Fjb3cyJy4KKyMKKyMgQG1vZGU6ICNvcHRpb25hbCB3aGV0aGVyIGFuZCBob3cgUUVNVSBzaG91bGQgY3JlYXRlIGEgbmV3IGltYWdlLCBkZWZhdWx0IGlzCisjICAgICAgICAnYWJzb2x1dGUtcGF0aHMnLgorIyMKK3sgJ3R5cGUnOiAnQmxvY2tkZXZTbmFwc2hvdCcsCisgICdkYXRhJzogeyAnZGV2aWNlJzogJ3N0cicsICdzbmFwc2hvdC1maWxlJzogJ3N0cicsICcqZm9ybWF0JzogJ3N0cicsCisgICAgICAgICAgICAnKm1vZGUnOiAnTmV3SW1hZ2VNb2RlJyB9IH0KKworIyMKKyMgQEJsb2NrZGV2U25hcHNob3RJbnRlcm5hbAorIworIyBAZGV2aWNlOiB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGdlbmVyYXRlIHRoZSBzbmFwc2hvdCBmcm9tCisjCisjIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgaW50ZXJuYWwgc25hcHNob3QgdG8gYmUgY3JlYXRlZAorIworIyBOb3RlczogSW4gdHJhbnNhY3Rpb24sIGlmIEBuYW1lIGlzIGVtcHR5LCBvciBhbnkgc25hcHNob3QgbWF0Y2hpbmcgQG5hbWUKKyMgICAgICAgIGV4aXN0cywgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwuIE9ubHkgc29tZSBpbWFnZSBmb3JtYXRzIHN1cHBvcnQgaXQsCisjICAgICAgICBmb3IgZXhhbXBsZSwgcWNvdzIsIHJiZCwgYW5kIHNoZWVwZG9nLgorIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdCbG9ja2RldlNuYXBzaG90SW50ZXJuYWwnLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnbmFtZSc6ICdzdHInIH0gfQorCisjIworIyBARHJpdmVCYWNrdXAKKyMKKyMgQGRldmljZTogdGhlIG5hbWUgb2YgdGhlIGRldmljZSB3aGljaCBzaG91bGQgYmUgY29waWVkLgorIworIyBAdGFyZ2V0OiB0aGUgdGFyZ2V0IG9mIHRoZSBuZXcgaW1hZ2UuIElmIHRoZSBmaWxlIGV4aXN0cywgb3IgaWYgaXQKKyMgICAgICAgICAgaXMgYSBkZXZpY2UsIHRoZSBleGlzdGluZyBmaWxlL2RldmljZSB3aWxsIGJlIHVzZWQgYXMgdGhlIG5ldworIyAgICAgICAgICBkZXN0aW5hdGlvbi4gIElmIGl0IGRvZXMgbm90IGV4aXN0LCBhIG5ldyBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KKyMKKyMgQGZvcm1hdDogI29wdGlvbmFsIHRoZSBmb3JtYXQgb2YgdGhlIG5ldyBkZXN0aW5hdGlvbiwgZGVmYXVsdCBpcyB0bworIyAgICAgICAgICBwcm9iZSBpZiBAbW9kZSBpcyAnZXhpc3RpbmcnLCBlbHNlIHRoZSBmb3JtYXQgb2YgdGhlIHNvdXJjZQorIworIyBAc3luYzogd2hhdCBwYXJ0cyBvZiB0aGUgZGlzayBpbWFnZSBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbgorIyAgICAgICAgKGFsbCB0aGUgZGlzaywgb25seSB0aGUgc2VjdG9ycyBhbGxvY2F0ZWQgaW4gdGhlIHRvcG1vc3QgaW1hZ2UsIG9yCisjICAgICAgICBvbmx5IG5ldyBJL08pLgorIworIyBAbW9kZTogI29wdGlvbmFsIHdoZXRoZXIgYW5kIGhvdyBRRU1VIHNob3VsZCBjcmVhdGUgYSBuZXcgaW1hZ2UsIGRlZmF1bHQgaXMKKyMgICAgICAgICdhYnNvbHV0ZS1wYXRocycuCisjCisjIEBzcGVlZDogI29wdGlvbmFsIHRoZSBtYXhpbXVtIHNwZWVkLCBpbiBieXRlcyBwZXIgc2Vjb25kCisjCisjIEBvbi1zb3VyY2UtZXJyb3I6ICNvcHRpb25hbCB0aGUgYWN0aW9uIHRvIHRha2Ugb24gYW4gZXJyb3Igb24gdGhlIHNvdXJjZSwKKyMgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAncmVwb3J0Jy4gICdzdG9wJyBhbmQgJ2Vub3NwYycgY2FuIG9ubHkgYmUgdXNlZAorIyAgICAgICAgICAgICAgICAgICBpZiB0aGUgYmxvY2sgZGV2aWNlIHN1cHBvcnRzIGlvLXN0YXR1cyAoc2VlIEJsb2NrSW5mbykuCisjCisjIEBvbi10YXJnZXQtZXJyb3I6ICNvcHRpb25hbCB0aGUgYWN0aW9uIHRvIHRha2Ugb24gYW4gZXJyb3Igb24gdGhlIHRhcmdldCwKKyMgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAncmVwb3J0JyAobm8gbGltaXRhdGlvbnMsIHNpbmNlIHRoaXMgYXBwbGllcyB0bworIyAgICAgICAgICAgICAgICAgICBhIGRpZmZlcmVudCBibG9jayBkZXZpY2UgdGhhbiBAZGV2aWNlKS4KKyMKKyMgTm90ZSB0aGF0IEBvbi1zb3VyY2UtZXJyb3IgYW5kIEBvbi10YXJnZXQtZXJyb3Igb25seSBhZmZlY3QgYmFja2dyb3VuZCBJL08uCisjIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgYSBndWVzdCB3cml0ZSByZXF1ZXN0LCB0aGUgZGV2aWNlJ3MgcmVycm9yL3dlcnJvcgorIyBhY3Rpb25zIHdpbGwgYmUgdXNlZC4KKyMKKyMgU2luY2U6IDEuNgorIyMKK3sgJ3R5cGUnOiAnRHJpdmVCYWNrdXAnLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAndGFyZ2V0JzogJ3N0cicsICcqZm9ybWF0JzogJ3N0cicsCisgICAgICAgICAgICAnc3luYyc6ICdNaXJyb3JTeW5jTW9kZScsICcqbW9kZSc6ICdOZXdJbWFnZU1vZGUnLAorICAgICAgICAgICAgJypzcGVlZCc6ICdpbnQnLAorICAgICAgICAgICAgJypvbi1zb3VyY2UtZXJyb3InOiAnQmxvY2tkZXZPbkVycm9yJywKKyAgICAgICAgICAgICcqb24tdGFyZ2V0LWVycm9yJzogJ0Jsb2NrZGV2T25FcnJvcicgfSB9CisKKyMjCisjIEBBYm9ydAorIworIyBUaGlzIGFjdGlvbiBjYW4gYmUgdXNlZCB0byB0ZXN0IHRyYW5zYWN0aW9uIGZhaWx1cmUuCisjCisjIFNpbmNlOiAxLjYKKyMjIworeyAndHlwZSc6ICdBYm9ydCcsCisgICdkYXRhJzogeyB9IH0KKworIyMKKyMgQFRyYW5zYWN0aW9uQWN0aW9uCisjCisjIEEgZGlzY3JpbWluYXRlZCByZWNvcmQgb2Ygb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgd2l0aAorIyBAdHJhbnNhY3Rpb24uCisjIworeyAndW5pb24nOiAnVHJhbnNhY3Rpb25BY3Rpb24nLAorICAnZGF0YSc6IHsKKyAgICAgICAnYmxvY2tkZXYtc25hcHNob3Qtc3luYyc6ICdCbG9ja2RldlNuYXBzaG90JywKKyAgICAgICAnZHJpdmUtYmFja3VwJzogJ0RyaXZlQmFja3VwJywKKyAgICAgICAnYWJvcnQnOiAnQWJvcnQnLAorICAgICAgICdibG9ja2Rldi1zbmFwc2hvdC1pbnRlcm5hbC1zeW5jJzogJ0Jsb2NrZGV2U25hcHNob3RJbnRlcm5hbCcKKyAgIH0gfQorCisjIworIyBAdHJhbnNhY3Rpb24KKyMKKyMgRXhlY3V0ZXMgYSBudW1iZXIgb2YgdHJhbnNhY3Rpb25hYmxlIFFNUCBjb21tYW5kcyBhdG9taWNhbGx5LiBJZiBhbnkKKyMgb3BlcmF0aW9uIGZhaWxzLCB0aGVuIHRoZSBlbnRpcmUgc2V0IG9mIGFjdGlvbnMgd2lsbCBiZSBhYmFuZG9uZWQgYW5kIHRoZQorIyBhcHByb3ByaWF0ZSBlcnJvciByZXR1cm5lZC4KKyMKKyMgIExpc3Qgb2Y6CisjICBAVHJhbnNhY3Rpb25BY3Rpb246IGluZm9ybWF0aW9uIG5lZWRlZCBmb3IgdGhlIHJlc3BlY3RpdmUgb3BlcmF0aW9uCisjCisjIFJldHVybnM6IG5vdGhpbmcgb24gc3VjY2VzcworIyAgICAgICAgICBFcnJvcnMgZGVwZW5kIG9uIHRoZSBvcGVyYXRpb25zIG9mIHRoZSB0cmFuc2FjdGlvbgorIworIyBOb3RlOiBUaGUgdHJhbnNhY3Rpb24gYWJvcnRzIG9uIHRoZSBmaXJzdCBmYWlsdXJlLiAgVGhlcmVmb3JlLCB0aGVyZSB3aWxsIGJlCisjIGluZm9ybWF0aW9uIG9uIG9ubHkgb25lIGZhaWxlZCBvcGVyYXRpb24gcmV0dXJuZWQgaW4gYW4gZXJyb3IgY29uZGl0aW9uLCBhbmQKKyMgc3Vic2VxdWVudCBhY3Rpb25zIHdpbGwgbm90IGhhdmUgYmVlbiBhdHRlbXB0ZWQuCisjCisjIFNpbmNlIDEuMQorIyMKK3sgJ2NvbW1hbmQnOiAndHJhbnNhY3Rpb24nLAorICAnZGF0YSc6IHsgJ2FjdGlvbnMnOiBbICdUcmFuc2FjdGlvbkFjdGlvbicgXSB9IH0KKworIyMKKyMgQGJsb2NrZGV2LXNuYXBzaG90LXN5bmMKKyMKKyMgR2VuZXJhdGVzIGEgc3luY2hyb25vdXMgc25hcHNob3Qgb2YgYSBibG9jayBkZXZpY2UuCisjCisjIEZvciB0aGUgYXJndW1lbnRzLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQmxvY2tkZXZTbmFwc2hvdC4KKyMKKyMgUmV0dXJuczogbm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgbm90IGEgdmFsaWQgYmxvY2sgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZSAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ2Jsb2NrZGV2LXNuYXBzaG90LXN5bmMnLAorICAnZGF0YSc6ICdCbG9ja2RldlNuYXBzaG90JyB9CisKKyMjCisjIEBibG9ja2Rldi1zbmFwc2hvdC1pbnRlcm5hbC1zeW5jCisjCisjIFN5bmNocm9ub3VzbHkgdGFrZSBhbiBpbnRlcm5hbCBzbmFwc2hvdCBvZiBhIGJsb2NrIGRldmljZSwgd2hlbiB0aGUgZm9ybWF0CisjIG9mIHRoZSBpbWFnZSB1c2VkIHN1cHBvcnRzIGl0LgorIworIyBGb3IgdGhlIGFyZ3VtZW50cywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEJsb2NrZGV2U25hcHNob3RJbnRlcm5hbC4KKyMKKyMgUmV0dXJuczogbm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgbm90IGEgdmFsaWQgYmxvY2sgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIyAgICAgICAgICBJZiBhbnkgc25hcHNob3QgbWF0Y2hpbmcgQG5hbWUgZXhpc3RzLCBvciBAbmFtZSBpcyBlbXB0eSwKKyMgICAgICAgICAgR2VuZXJpY0Vycm9yCisjICAgICAgICAgIElmIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlIHVzZWQgZG9lcyBub3Qgc3VwcG9ydCBpdCwKKyMgICAgICAgICAgQmxvY2tGb3JtYXRGZWF0dXJlTm90U3VwcG9ydGVkCisjCisjIFNpbmNlIDEuNworIyMKK3sgJ2NvbW1hbmQnOiAnYmxvY2tkZXYtc25hcHNob3QtaW50ZXJuYWwtc3luYycsCisgICdkYXRhJzogJ0Jsb2NrZGV2U25hcHNob3RJbnRlcm5hbCcgfQorCisjIworIyBAYmxvY2tkZXYtc25hcHNob3QtZGVsZXRlLWludGVybmFsLXN5bmMKKyMKKyMgU3luY2hyb25vdXNseSBkZWxldGUgYW4gaW50ZXJuYWwgc25hcHNob3Qgb2YgYSBibG9jayBkZXZpY2UsIHdoZW4gdGhlIGZvcm1hdAorIyBvZiB0aGUgaW1hZ2UgdXNlZCBzdXBwb3J0IGl0LiBUaGUgc25hcHNob3QgaXMgaWRlbnRpZmllZCBieSBuYW1lIG9yIGlkIG9yCisjIGJvdGguIE9uZSBvZiB0aGUgbmFtZSBvciBpZCBpcyByZXF1aXJlZC4gUmV0dXJuIFNuYXBzaG90SW5mbyBmb3IgdGhlCisjIHN1Y2Nlc3NmdWxseSBkZWxldGVkIHNuYXBzaG90LgorIworIyBAZGV2aWNlOiB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGRlbGV0ZSB0aGUgc25hcHNob3QgZnJvbQorIworIyBAaWQ6IG9wdGlvbmFsIHRoZSBzbmFwc2hvdCdzIElEIHRvIGJlIGRlbGV0ZWQKKyMKKyMgQG5hbWU6IG9wdGlvbmFsIHRoZSBzbmFwc2hvdCdzIG5hbWUgdG8gYmUgZGVsZXRlZAorIworIyBSZXR1cm5zOiBTbmFwc2hvdEluZm8gb24gc3VjY2VzcworIyAgICAgICAgICBJZiBAZGV2aWNlIGlzIG5vdCBhIHZhbGlkIGJsb2NrIGRldmljZSwgRGV2aWNlTm90Rm91bmQKKyMgICAgICAgICAgSWYgc25hcHNob3Qgbm90IGZvdW5kLCBHZW5lcmljRXJyb3IKKyMgICAgICAgICAgSWYgdGhlIGZvcm1hdCBvZiB0aGUgaW1hZ2UgdXNlZCBkb2VzIG5vdCBzdXBwb3J0IGl0LAorIyAgICAgICAgICBCbG9ja0Zvcm1hdEZlYXR1cmVOb3RTdXBwb3J0ZWQKKyMgICAgICAgICAgSWYgQGlkIGFuZCBAbmFtZSBhcmUgYm90aCBub3Qgc3BlY2lmaWVkLCBHZW5lcmljRXJyb3IKKyMKKyMgU2luY2UgMS43CisjIworeyAnY29tbWFuZCc6ICdibG9ja2Rldi1zbmFwc2hvdC1kZWxldGUtaW50ZXJuYWwtc3luYycsCisgICdkYXRhJzogeyAnZGV2aWNlJzogJ3N0cicsICcqaWQnOiAnc3RyJywgJypuYW1lJzogJ3N0cid9LAorICAncmV0dXJucyc6ICdTbmFwc2hvdEluZm8nIH0KKworIyMKKyMgQGh1bWFuLW1vbml0b3ItY29tbWFuZDoKKyMKKyMgRXhlY3V0ZSBhIGNvbW1hbmQgb24gdGhlIGh1bWFuIG1vbml0b3IgYW5kIHJldHVybiB0aGUgb3V0cHV0LgorIworIyBAY29tbWFuZC1saW5lOiB0aGUgY29tbWFuZCB0byBleGVjdXRlIGluIHRoZSBodW1hbiBtb25pdG9yCisjCisjIEBjcHUtaW5kZXg6ICNvcHRpb25hbCBUaGUgQ1BVIHRvIHVzZSBmb3IgY29tbWFuZHMgdGhhdCByZXF1aXJlIGFuIGltcGxpY2l0IENQVQorIworIyBSZXR1cm5zOiB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIGFzIGEgc3RyaW5nCisjCisjIFNpbmNlOiAwLjE0LjAKKyMKKyMgTm90ZXM6IFRoaXMgY29tbWFuZCBvbmx5IGV4aXN0cyBhcyBhIHN0b3AtZ2FwLiAgSXRzIHVzZSBpcyBoaWdobHkKKyMgICAgICAgIGRpc2NvdXJhZ2VkLiAgVGhlIHNlbWFudGljcyBvZiB0aGlzIGNvbW1hbmQgYXJlIG5vdCBndWFyYW50ZWVkLgorIworIyAgICAgICAgS25vd24gbGltaXRhdGlvbnM6CisjCisjICAgICAgICBvIFRoaXMgY29tbWFuZCBpcyBzdGF0ZWxlc3MsIHRoaXMgbWVhbnMgdGhhdCBjb21tYW5kcyB0aGF0IGRlcGVuZAorIyAgICAgICAgICBvbiBzdGF0ZSBpbmZvcm1hdGlvbiAoc3VjaCBhcyBnZXRmZCkgbWlnaHQgbm90IHdvcmsKKyMKKyMgICAgICAgbyBDb21tYW5kcyB0aGF0IHByb21wdCB0aGUgdXNlciBmb3IgZGF0YSAoZWcuICdjb250JyB3aGVuIHRoZSBibG9jaworIyAgICAgICAgIGRldmljZSBpcyBlbmNyeXB0ZWQpIGRvbid0IGN1cnJlbnRseSB3b3JrCisjIworeyAnY29tbWFuZCc6ICdodW1hbi1tb25pdG9yLWNvbW1hbmQnLAorICAnZGF0YSc6IHsnY29tbWFuZC1saW5lJzogJ3N0cicsICcqY3B1LWluZGV4JzogJ2ludCd9LAorICAncmV0dXJucyc6ICdzdHInIH0KKworIyMKKyMgQGJsb2NrLWNvbW1pdAorIworIyBMaXZlIGNvbW1pdCBvZiBkYXRhIGZyb20gb3ZlcmxheSBpbWFnZSBub2RlcyBpbnRvIGJhY2tpbmcgbm9kZXMgLSBpLmUuLAorIyB3cml0ZXMgZGF0YSBiZXR3ZWVuICd0b3AnIGFuZCAnYmFzZScgaW50byAnYmFzZScuCisjCisjIEBkZXZpY2U6ICB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlCisjCisjIEBiYXNlOiAgICNvcHRpb25hbCBUaGUgZmlsZSBuYW1lIG9mIHRoZSBiYWNraW5nIGltYWdlIHRvIHdyaXRlIGRhdGEgaW50by4KKyMgICAgICAgICAgICAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgaXMgdGhlIGRlZXBlc3QgYmFja2luZyBpbWFnZQorIworIyBAdG9wOiAgICAgICAgICAgICAgVGhlIGZpbGUgbmFtZSBvZiB0aGUgYmFja2luZyBpbWFnZSB3aXRoaW4gdGhlIGltYWdlIGNoYWluLAorIyAgICAgICAgICAgICAgICAgICAgd2hpY2ggY29udGFpbnMgdGhlIHRvcG1vc3QgZGF0YSB0byBiZSBjb21taXR0ZWQgZG93bi4KKyMgICAgICAgICAgICAgICAgICAgIE5vdGUsIHRoZSBhY3RpdmUgbGF5ZXIgYXMgJ3RvcCcgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkLgorIworIyAgICAgICAgICAgICAgICAgICAgSWYgdG9wID09IGJhc2UsIHRoYXQgaXMgYW4gZXJyb3IuCisjCisjCisjIEBzcGVlZDogICNvcHRpb25hbCB0aGUgbWF4aW11bSBzcGVlZCwgaW4gYnl0ZXMgcGVyIHNlY29uZAorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgY29tbWl0IG9yIHN0cmVhbSBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIGRldmljZSwgRGV2aWNlSW5Vc2UKKyMgICAgICAgICAgSWYgQGRldmljZSBkb2VzIG5vdCBleGlzdCwgRGV2aWNlTm90Rm91bmQKKyMgICAgICAgICAgSWYgaW1hZ2UgY29tbWl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UsIE5vdFN1cHBvcnRlZAorIyAgICAgICAgICBJZiBAYmFzZSBvciBAdG9wIGlzIGludmFsaWQsIGEgZ2VuZXJpYyBlcnJvciBpcyByZXR1cm5lZAorIyAgICAgICAgICBJZiBAdG9wIGlzIHRoZSBhY3RpdmUgbGF5ZXIsIG9yIG9taXR0ZWQsIGEgZ2VuZXJpYyBlcnJvciBpcyByZXR1cm5lZAorIyAgICAgICAgICBJZiBAc3BlZWQgaXMgaW52YWxpZCwgSW52YWxpZFBhcmFtZXRlcgorIworIyBTaW5jZTogMS4zCisjCisjIworeyAnY29tbWFuZCc6ICdibG9jay1jb21taXQnLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnKmJhc2UnOiAnc3RyJywgJ3RvcCc6ICdzdHInLAorICAgICAgICAgICAgJypzcGVlZCc6ICdpbnQnIH0gfQorCisjIworIyBAZHJpdmUtYmFja3VwCisjCisjIFN0YXJ0IGEgcG9pbnQtaW4tdGltZSBjb3B5IG9mIGEgYmxvY2sgZGV2aWNlIHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgVGhlCisjIHN0YXR1cyBvZiBvbmdvaW5nIGRyaXZlLWJhY2t1cCBvcGVyYXRpb25zIGNhbiBiZSBjaGVja2VkIHdpdGgKKyMgcXVlcnktYmxvY2stam9icyB3aGVyZSB0aGUgQmxvY2tKb2JJbmZvLnR5cGUgZmllbGQgaGFzIHRoZSB2YWx1ZSAnYmFja3VwJy4KKyMgVGhlIG9wZXJhdGlvbiBjYW4gYmUgc3RvcHBlZCBiZWZvcmUgaXQgaGFzIGNvbXBsZXRlZCB1c2luZyB0aGUKKyMgYmxvY2stam9iLWNhbmNlbCBjb21tYW5kLgorIworIyBGb3IgdGhlIGFyZ3VtZW50cywgc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIERyaXZlQmFja3VwLgorIworIyBSZXR1cm5zOiBub3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgQGRldmljZSBpcyBub3QgYSB2YWxpZCBibG9jayBkZXZpY2UsIERldmljZU5vdEZvdW5kCisjCisjIFNpbmNlIDEuNgorIyMKK3sgJ2NvbW1hbmQnOiAnZHJpdmUtYmFja3VwJywgJ2RhdGEnOiAnRHJpdmVCYWNrdXAnIH0KKworIyMKKyMgQGRyaXZlLW1pcnJvcgorIworIyBTdGFydCBtaXJyb3JpbmcgYSBibG9jayBkZXZpY2UncyB3cml0ZXMgdG8gYSBuZXcgZGVzdGluYXRpb24uCisjCisjIEBkZXZpY2U6ICB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlIHdob3NlIHdyaXRlcyBzaG91bGQgYmUgbWlycm9yZWQuCisjCisjIEB0YXJnZXQ6IHRoZSB0YXJnZXQgb2YgdGhlIG5ldyBpbWFnZS4gSWYgdGhlIGZpbGUgZXhpc3RzLCBvciBpZiBpdAorIyAgICAgICAgICBpcyBhIGRldmljZSwgdGhlIGV4aXN0aW5nIGZpbGUvZGV2aWNlIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmV3CisjICAgICAgICAgIGRlc3RpbmF0aW9uLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QsIGEgbmV3IGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorIworIyBAZm9ybWF0OiAjb3B0aW9uYWwgdGhlIGZvcm1hdCBvZiB0aGUgbmV3IGRlc3RpbmF0aW9uLCBkZWZhdWx0IGlzIHRvCisjICAgICAgICAgIHByb2JlIGlmIEBtb2RlIGlzICdleGlzdGluZycsIGVsc2UgdGhlIGZvcm1hdCBvZiB0aGUgc291cmNlCisjCisjIEBtb2RlOiAjb3B0aW9uYWwgd2hldGhlciBhbmQgaG93IFFFTVUgc2hvdWxkIGNyZWF0ZSBhIG5ldyBpbWFnZSwgZGVmYXVsdCBpcworIyAgICAgICAgJ2Fic29sdXRlLXBhdGhzJy4KKyMKKyMgQHNwZWVkOiAgI29wdGlvbmFsIHRoZSBtYXhpbXVtIHNwZWVkLCBpbiBieXRlcyBwZXIgc2Vjb25kCisjCisjIEBzeW5jOiB3aGF0IHBhcnRzIG9mIHRoZSBkaXNrIGltYWdlIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uCisjICAgICAgICAoYWxsIHRoZSBkaXNrLCBvbmx5IHRoZSBzZWN0b3JzIGFsbG9jYXRlZCBpbiB0aGUgdG9wbW9zdCBpbWFnZSwgb3IKKyMgICAgICAgIG9ubHkgbmV3IEkvTykuCisjCisjIEBncmFudWxhcml0eTogI29wdGlvbmFsIGdyYW51bGFyaXR5IG9mIHRoZSBkaXJ0eSBiaXRtYXAsIGRlZmF1bHQgaXMgNjRLCisjICAgICAgICAgICAgICAgaWYgdGhlIGltYWdlIGZvcm1hdCBkb2Vzbid0IGhhdmUgY2x1c3RlcnMsIDRLIGlmIHRoZSBjbHVzdGVycworIyAgICAgICAgICAgICAgIGFyZSBzbWFsbGVyIHRoYW4gdGhhdCwgZWxzZSB0aGUgY2x1c3RlciBzaXplLiAgTXVzdCBiZSBhCisjICAgICAgICAgICAgICAgcG93ZXIgb2YgMiBiZXR3ZWVuIDUxMiBhbmQgNjRNIChzaW5jZSAxLjQpLgorIworIyBAYnVmLXNpemU6ICNvcHRpb25hbCBtYXhpbXVtIGFtb3VudCBvZiBkYXRhIGluIGZsaWdodCBmcm9tIHNvdXJjZSB0bworIyAgICAgICAgICAgIHRhcmdldCAoc2luY2UgMS40KS4KKyMKKyMgQG9uLXNvdXJjZS1lcnJvcjogI29wdGlvbmFsIHRoZSBhY3Rpb24gdG8gdGFrZSBvbiBhbiBlcnJvciBvbiB0aGUgc291cmNlLAorIyAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICdyZXBvcnQnLiAgJ3N0b3AnIGFuZCAnZW5vc3BjJyBjYW4gb25seSBiZSB1c2VkCisjICAgICAgICAgICAgICAgICAgIGlmIHRoZSBibG9jayBkZXZpY2Ugc3VwcG9ydHMgaW8tc3RhdHVzIChzZWUgQmxvY2tJbmZvKS4KKyMKKyMgQG9uLXRhcmdldC1lcnJvcjogI29wdGlvbmFsIHRoZSBhY3Rpb24gdG8gdGFrZSBvbiBhbiBlcnJvciBvbiB0aGUgdGFyZ2V0LAorIyAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICdyZXBvcnQnIChubyBsaW1pdGF0aW9ucywgc2luY2UgdGhpcyBhcHBsaWVzIHRvCisjICAgICAgICAgICAgICAgICAgIGEgZGlmZmVyZW50IGJsb2NrIGRldmljZSB0aGFuIEBkZXZpY2UpLgorIworIyBSZXR1cm5zOiBub3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgQGRldmljZSBpcyBub3QgYSB2YWxpZCBibG9jayBkZXZpY2UsIERldmljZU5vdEZvdW5kCisjCisjIFNpbmNlIDEuMworIyMKK3sgJ2NvbW1hbmQnOiAnZHJpdmUtbWlycm9yJywKKyAgJ2RhdGEnOiB7ICdkZXZpY2UnOiAnc3RyJywgJ3RhcmdldCc6ICdzdHInLCAnKmZvcm1hdCc6ICdzdHInLAorICAgICAgICAgICAgJ3N5bmMnOiAnTWlycm9yU3luY01vZGUnLCAnKm1vZGUnOiAnTmV3SW1hZ2VNb2RlJywKKyAgICAgICAgICAgICcqc3BlZWQnOiAnaW50JywgJypncmFudWxhcml0eSc6ICd1aW50MzInLAorICAgICAgICAgICAgJypidWYtc2l6ZSc6ICdpbnQnLCAnKm9uLXNvdXJjZS1lcnJvcic6ICdCbG9ja2Rldk9uRXJyb3InLAorICAgICAgICAgICAgJypvbi10YXJnZXQtZXJyb3InOiAnQmxvY2tkZXZPbkVycm9yJyB9IH0KKworIyMKKyMgQG1pZ3JhdGVfY2FuY2VsCisjCisjIENhbmNlbCB0aGUgY3VycmVudCBleGVjdXRpbmcgbWlncmF0aW9uIHByb2Nlc3MuCisjCisjIFJldHVybnM6IG5vdGhpbmcgb24gc3VjY2VzcworIworIyBOb3RlczogVGhpcyBjb21tYW5kIHN1Y2NlZWRzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gbWlncmF0aW9uIHByb2Nlc3MgcnVubmluZy4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnbWlncmF0ZV9jYW5jZWwnIH0KKworIyMKKyMgQG1pZ3JhdGVfc2V0X2Rvd250aW1lCisjCisjIFNldCBtYXhpbXVtIHRvbGVyYXRlZCBkb3dudGltZSBmb3IgbWlncmF0aW9uLgorIworIyBAdmFsdWU6IG1heGltdW0gZG93bnRpbWUgaW4gc2Vjb25kcworIworIyBSZXR1cm5zOiBub3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnbWlncmF0ZV9zZXRfZG93bnRpbWUnLCAnZGF0YSc6IHsndmFsdWUnOiAnbnVtYmVyJ30gfQorCisjIworIyBAbWlncmF0ZV9zZXRfc3BlZWQKKyMKKyMgU2V0IG1heGltdW0gc3BlZWQgZm9yIG1pZ3JhdGlvbi4KKyMKKyMgQHZhbHVlOiBtYXhpbXVtIHNwZWVkIGluIGJ5dGVzLgorIworIyBSZXR1cm5zOiBub3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgTm90ZXM6IEEgdmFsdWUgbGVzc2VyIHRoYW4gemVybyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcm91bmQgdXAgdG8gemVyby4KKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnbWlncmF0ZV9zZXRfc3BlZWQnLCAnZGF0YSc6IHsndmFsdWUnOiAnaW50J30gfQorCisjIworIyBAbWlncmF0ZS1zZXQtY2FjaGUtc2l6ZQorIworIyBTZXQgWEJaUkxFIGNhY2hlIHNpemUKKyMKKyMgQHZhbHVlOiBjYWNoZSBzaXplIGluIGJ5dGVzCisjCisjIFRoZSBzaXplIHdpbGwgYmUgcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIuCisjIFRoZSBjYWNoZSBzaXplIGNhbiBiZSBtb2RpZmllZCBiZWZvcmUgYW5kIGR1cmluZyBvbmdvaW5nIG1pZ3JhdGlvbgorIworIyBSZXR1cm5zOiBub3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDEuMgorIyMKK3sgJ2NvbW1hbmQnOiAnbWlncmF0ZS1zZXQtY2FjaGUtc2l6ZScsICdkYXRhJzogeyd2YWx1ZSc6ICdpbnQnfSB9CisKKyMjCisjIEBxdWVyeS1taWdyYXRlLWNhY2hlLXNpemUKKyMKKyMgcXVlcnkgWEJaUkxFIGNhY2hlIHNpemUKKyMKKyMgUmV0dXJuczogWEJaUkxFIGNhY2hlIHNpemUgaW4gYnl0ZXMKKyMKKyMgU2luY2U6IDEuMgorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktbWlncmF0ZS1jYWNoZS1zaXplJywgJ3JldHVybnMnOiAnaW50JyB9CisKKyMjCisjIEBPYmplY3RQcm9wZXJ0eUluZm86CisjCisjIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKKyMKKyMgQHR5cGU6IHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS4gIFRoaXMgd2lsbCB0eXBpY2FsbHkgY29tZSBpbiBvbmUgb2YgZm91cgorIyAgICAgICAgZm9ybXM6CisjCisjICAgICAgICAxKSBBIHByaW1pdGl2ZSB0eXBlIHN1Y2ggYXMgJ3U4JywgJ3UxNicsICdib29sJywgJ3N0cicsIG9yICdkb3VibGUnLgorIyAgICAgICAgICAgVGhlc2UgdHlwZXMgYXJlIG1hcHBlZCB0byB0aGUgYXBwcm9wcmlhdGUgSlNPTiB0eXBlLgorIworIyAgICAgICAgMikgQSBsZWdhY3kgdHlwZSBpbiB0aGUgZm9ybSAnbGVnYWN5PHN1YnR5cGU+JyB3aGVyZSBzdWJ0eXBlIGlzIHRoZQorIyAgICAgICAgICAgbGVnYWN5IHFkZXYgdHlwZW5hbWUuICBUaGVzZSB0eXBlcyBhcmUgYWx3YXlzIHRyZWF0ZWQgYXMgc3RyaW5ncy4KKyMKKyMgICAgICAgIDMpIEEgY2hpbGQgdHlwZSBpbiB0aGUgZm9ybSAnY2hpbGQ8c3VidHlwZT4nIHdoZXJlIHN1YnR5cGUgaXMgYSBxZGV2CisjICAgICAgICAgICBkZXZpY2UgdHlwZSBuYW1lLiAgQ2hpbGQgcHJvcGVydGllcyBjcmVhdGUgdGhlIGNvbXBvc2l0aW9uIHRyZWUuCisjCisjICAgICAgICA0KSBBIGxpbmsgdHlwZSBpbiB0aGUgZm9ybSAnbGluazxzdWJ0eXBlPicgd2hlcmUgc3VidHlwZSBpcyBhIHFkZXYKKyMgICAgICAgICAgIGRldmljZSB0eXBlIG5hbWUuICBMaW5rIHByb3BlcnRpZXMgZm9ybSB0aGUgZGV2aWNlIG1vZGVsIGdyYXBoLgorIworIyBTaW5jZTogMS4yCisjIworeyAndHlwZSc6ICdPYmplY3RQcm9wZXJ0eUluZm8nLAorICAnZGF0YSc6IHsgJ25hbWUnOiAnc3RyJywgJ3R5cGUnOiAnc3RyJyB9IH0KKworIyMKKyMgQHFvbS1saXN0OgorIworIyBUaGlzIGNvbW1hbmQgd2lsbCBsaXN0IGFueSBwcm9wZXJ0aWVzIG9mIGEgb2JqZWN0IGdpdmVuIGEgcGF0aCBpbiB0aGUgb2JqZWN0CisjIG1vZGVsLgorIworIyBAcGF0aDogdGhlIHBhdGggd2l0aGluIHRoZSBvYmplY3QgbW9kZWwuICBTZWUgQHFvbS1nZXQgZm9yIGEgZGVzY3JpcHRpb24gb2YKKyMgICAgICAgIHRoaXMgcGFyYW1ldGVyLgorIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgQE9iamVjdFByb3BlcnR5SW5mbyB0aGF0IGRlc2NyaWJlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZQorIyAgICAgICAgICBvYmplY3QuCisjCisjIFNpbmNlOiAxLjIKKyMjCit7ICdjb21tYW5kJzogJ3FvbS1saXN0JywKKyAgJ2RhdGEnOiB7ICdwYXRoJzogJ3N0cicgfSwKKyAgJ3JldHVybnMnOiBbICdPYmplY3RQcm9wZXJ0eUluZm8nIF0gfQorCisjIworIyBAcW9tLWdldDoKKyMKKyMgVGhpcyBjb21tYW5kIHdpbGwgZ2V0IGEgcHJvcGVydHkgZnJvbSBhIG9iamVjdCBtb2RlbCBwYXRoIGFuZCByZXR1cm4gdGhlCisjIHZhbHVlLgorIworIyBAcGF0aDogVGhlIHBhdGggd2l0aGluIHRoZSBvYmplY3QgbW9kZWwuICBUaGVyZSBhcmUgdHdvIGZvcm1zIG9mIHN1cHBvcnRlZAorIyAgICAgICAgcGF0aHMtLWFic29sdXRlIGFuZCBwYXJ0aWFsIHBhdGhzLgorIworIyAgICAgICAgQWJzb2x1dGUgcGF0aHMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcm9vdCBvYmplY3QgYW5kIGNhbiBmb2xsb3cgY2hpbGQ8PgorIyAgICAgICAgb3IgbGluazw+IHByb3BlcnRpZXMuICBTaW5jZSB0aGV5IGNhbiBmb2xsb3cgbGluazw+IHByb3BlcnRpZXMsIHRoZXkKKyMgICAgICAgIGNhbiBiZSBhcmJpdHJhcmlseSBsb25nLiAgQWJzb2x1dGUgcGF0aHMgbG9vayBsaWtlIGFic29sdXRlIGZpbGVuYW1lcworIyAgICAgICAgYW5kIGFyZSBwcmVmaXhlZCAgd2l0aCBhIGxlYWRpbmcgc2xhc2guCisjCisjICAgICAgICBQYXJ0aWFsIHBhdGhzIGxvb2sgbGlrZSByZWxhdGl2ZSBmaWxlbmFtZXMuICBUaGV5IGRvIG5vdCBiZWdpbgorIyAgICAgICAgd2l0aCBhIHByZWZpeC4gIFRoZSBtYXRjaGluZyBydWxlcyBmb3IgcGFydGlhbCBwYXRocyBhcmUgc3VidGxlIGJ1dAorIyAgICAgICAgZGVzaWduZWQgdG8gbWFrZSBzcGVjaWZ5aW5nIG9iamVjdHMgZWFzeS4gIEF0IGVhY2ggbGV2ZWwgb2YgdGhlCisjICAgICAgICBjb21wb3NpdGlvbiB0cmVlLCB0aGUgcGFydGlhbCBwYXRoIGlzIG1hdGNoZWQgYXMgYW4gYWJzb2x1dGUgcGF0aC4KKyMgICAgICAgIFRoZSBmaXJzdCBtYXRjaCBpcyBub3QgcmV0dXJuZWQuICBBdCBsZWFzdCB0d28gbWF0Y2hlcyBhcmUgc2VhcmNoZWQKKyMgICAgICAgIGZvci4gIEEgc3VjY2Vzc2Z1bCByZXN1bHQgaXMgb25seSByZXR1cm5lZCBpZiBvbmx5IG9uZSBtYXRjaCBpcworIyAgICAgICAgZm91bmQuICBJZiBtb3JlIHRoYW4gb25lIG1hdGNoIGlzIGZvdW5kLCBhIGZsYWcgaXMgcmV0dXJuIHRvCisjICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBtYXRjaCB3YXMgYW1iaWd1b3VzLgorIworIyBAcHJvcGVydHk6IFRoZSBwcm9wZXJ0eSBuYW1lIHRvIHJlYWQKKyMKKyMgUmV0dXJuczogVGhlIHByb3BlcnR5IHZhbHVlLiAgVGhlIHR5cGUgZGVwZW5kcyBvbiB0aGUgcHJvcGVydHkgdHlwZS4gIGxlZ2FjeTw+CisjICAgICAgICAgIHByb3BlcnRpZXMgYXJlIHJldHVybmVkIGFzICNzdHIuICBjaGlsZDw+IGFuZCBsaW5rPD4gcHJvcGVydGllcyBhcmUKKyMgICAgICAgICAgcmV0dXJucyBhcyAjc3RyIHBhdGhuYW1lcy4gIEFsbCBpbnRlZ2VyIHByb3BlcnR5IHR5cGVzICh1OCwgdTE2LCBldGMpCisjICAgICAgICAgIGFyZSByZXR1cm5lZCBhcyAjaW50LgorIworIyBTaW5jZTogMS4yCisjIworeyAnY29tbWFuZCc6ICdxb20tZ2V0JywKKyAgJ2RhdGEnOiB7ICdwYXRoJzogJ3N0cicsICdwcm9wZXJ0eSc6ICdzdHInIH0sCisgICdyZXR1cm5zJzogJ3Zpc2l0b3InLAorICAnZ2VuJzogJ25vJyB9CisKKyMjCisjIEBxb20tc2V0OgorIworIyBUaGlzIGNvbW1hbmQgd2lsbCBzZXQgYSBwcm9wZXJ0eSBmcm9tIGEgb2JqZWN0IG1vZGVsIHBhdGguCisjCisjIEBwYXRoOiBzZWUgQHFvbS1nZXQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhpcyBwYXJhbWV0ZXIKKyMKKyMgQHByb3BlcnR5OiB0aGUgcHJvcGVydHkgbmFtZSB0byBzZXQKKyMKKyMgQHZhbHVlOiBhIHZhbHVlIHdobydzIHR5cGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBwcm9wZXJ0eSB0eXBlLiAgU2VlIEBxb20tZ2V0CisjICAgICAgICAgZm9yIGEgZGVzY3JpcHRpb24gb2YgdHlwZSBtYXBwaW5nLgorIworIyBTaW5jZTogMS4yCisjIworeyAnY29tbWFuZCc6ICdxb20tc2V0JywKKyAgJ2RhdGEnOiB7ICdwYXRoJzogJ3N0cicsICdwcm9wZXJ0eSc6ICdzdHInLCAndmFsdWUnOiAndmlzaXRvcicgfSwKKyAgJ2dlbic6ICdubycgfQorCisjIworIyBAc2V0X3Bhc3N3b3JkOgorIworIyBTZXRzIHRoZSBwYXNzd29yZCBvZiBhIHJlbW90ZSBkaXNwbGF5IHNlc3Npb24uCisjCisjIEBwcm90b2NvbDogYHZuYycgdG8gbW9kaWZ5IHRoZSBWTkMgc2VydmVyIHBhc3N3b3JkCisjICAgICAgICAgICAgYHNwaWNlJyB0byBtb2RpZnkgdGhlIFNwaWNlIHNlcnZlciBwYXNzd29yZAorIworIyBAcGFzc3dvcmQ6IHRoZSBuZXcgcGFzc3dvcmQKKyMKKyMgQGNvbm5lY3RlZDogI29wdGlvbmFsIGhvdyB0byBoYW5kbGUgZXhpc3RpbmcgY2xpZW50cyB3aGVuIGNoYW5naW5nIHRoZQorIyAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQuICBJZiBub3RoaW5nIGlzIHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gYGtlZXAnCisjICAgICAgICAgICAgICAgICAgICAgICBgZmFpbCcgdG8gZmFpbCB0aGUgY29tbWFuZCBpZiBjbGllbnRzIGFyZSBjb25uZWN0ZWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGBkaXNjb25uZWN0JyB0byBkaXNjb25uZWN0IGV4aXN0aW5nIGNsaWVudHMKKyMgICAgICAgICAgICAgICAgICAgICAgIGBrZWVwJyB0byBtYWludGFpbiBleGlzdGluZyBjbGllbnRzCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIyAgICAgICAgICBJZiBTcGljZSBpcyBub3QgZW5hYmxlZCwgRGV2aWNlTm90Rm91bmQKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnc2V0X3Bhc3N3b3JkJywKKyAgJ2RhdGEnOiB7J3Byb3RvY29sJzogJ3N0cicsICdwYXNzd29yZCc6ICdzdHInLCAnKmNvbm5lY3RlZCc6ICdzdHInfSB9CisKKyMjCisjIEBleHBpcmVfcGFzc3dvcmQ6CisjCisjIEV4cGlyZSB0aGUgcGFzc3dvcmQgb2YgYSByZW1vdGUgZGlzcGxheSBzZXJ2ZXIuCisjCisjIEBwcm90b2NvbDogdGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBkaXNwbGF5IHByb3RvY29sIGB2bmMnIG9yIGBzcGljZScKKyMKKyMgQHRpbWU6IHdoZW4gdG8gZXhwaXJlIHRoZSBwYXNzd29yZC4KKyMgICAgICAgIGBub3cnIHRvIGV4cGlyZSB0aGUgcGFzc3dvcmQgaW1tZWRpYXRlbHkKKyMgICAgICAgIGBuZXZlcicgdG8gY2FuY2VsIHBhc3N3b3JkIGV4cGlyYXRpb24KKyMgICAgICAgIGArSU5UJyB3aGVyZSBJTlQgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gbm93IChpbnRlZ2VyKQorIyAgICAgICAgYElOVCcgd2hlcmUgSU5UIGlzIHRoZSBhYnNvbHV0ZSB0aW1lIGluIHNlY29uZHMKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBwcm90b2NvbCBpcyBgc3BpY2UnIGFuZCBTcGljZSBpcyBub3QgYWN0aXZlLCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZTogMC4xNC4wCisjCisjIE5vdGVzOiBUaW1lIGlzIHJlbGF0aXZlIHRvIHRoZSBzZXJ2ZXIgYW5kIGN1cnJlbnRseSB0aGVyZSBpcyBubyB3YXkgdG8KKyMgICAgICAgIGNvb3JkaW5hdGUgc2VydmVyIHRpbWUgd2l0aCBjbGllbnQgdGltZS4gIEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0bworIyAgICAgICAgdXNlIHRoZSBhYnNvbHV0ZSB0aW1lIHZlcnNpb24gb2YgdGhlIEB0aW1lIHBhcmFtZXRlciB1bmxlc3MgeW91J3JlCisjICAgICAgICBzdXJlIHlvdSBhcmUgb24gdGhlIHNhbWUgbWFjaGluZSBhcyB0aGUgUUVNVSBpbnN0YW5jZS4KKyMjCit7ICdjb21tYW5kJzogJ2V4cGlyZV9wYXNzd29yZCcsICdkYXRhJzogeydwcm90b2NvbCc6ICdzdHInLCAndGltZSc6ICdzdHInfSB9CisKKyMjCisjIEBlamVjdDoKKyMKKyMgRWplY3RzIGEgZGV2aWNlIGZyb20gYSByZW1vdmFibGUgZHJpdmUuCisjCisjIEBkZXZpY2U6ICBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlCisjCisjIEBmb3JjZTogICBAb3B0aW9uYWwgSWYgdHJ1ZSwgZWplY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkcml2ZSBpcyBsb2NrZWQuCisjICAgICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyMKKyMgUmV0dXJuczogIE5vdGhpbmcgb24gc3VjY2VzcworIyAgICAgICAgICAgSWYgQGRldmljZSBpcyBub3QgYSB2YWxpZCBibG9jayBkZXZpY2UsIERldmljZU5vdEZvdW5kCisjCisjIE5vdGVzOiAgICBFamVjdGluZyBhIGRldmljZSB3aWxsIG5vIG1lZGlhIHJlc3VsdHMgaW4gc3VjY2VzcworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdlamVjdCcsICdkYXRhJzogeydkZXZpY2UnOiAnc3RyJywgJypmb3JjZSc6ICdib29sJ30gfQorCisjIworIyBAY2hhbmdlLXZuYy1wYXNzd29yZDoKKyMKKyMgQ2hhbmdlIHRoZSBWTkMgc2VydmVyIHBhc3N3b3JkLgorIworIyBAdGFyZ2V0OiAgdGhlIG5ldyBwYXNzd29yZCB0byB1c2Ugd2l0aCBWTkMgYXV0aGVudGljYXRpb24KKyMKKyMgU2luY2U6IDEuMQorIworIyBOb3RlczogIEFuIGVtcHR5IHBhc3N3b3JkIGluIHRoaXMgY29tbWFuZCB3aWxsIHNldCB0aGUgcGFzc3dvcmQgdG8gdGhlIGVtcHR5CisjICAgICAgICAgc3RyaW5nLiAgRXhpc3RpbmcgY2xpZW50cyBhcmUgdW5hZmZlY3RlZCBieSBleGVjdXRpbmcgdGhpcyBjb21tYW5kLgorIyMKK3sgJ2NvbW1hbmQnOiAnY2hhbmdlLXZuYy1wYXNzd29yZCcsICdkYXRhJzogeydwYXNzd29yZCc6ICdzdHInfSB9CisKKyMjCisjIEBjaGFuZ2U6CisjCisjIFRoaXMgY29tbWFuZCBpcyBtdWx0aXBsZSBjb21tYW5kcyBtdWx0aXBsZXhlZCB0b2dldGhlci4KKyMKKyMgQGRldmljZTogVGhpcyBpcyBub3JtYWxseSB0aGUgbmFtZSBvZiBhIGJsb2NrIGRldmljZSBidXQgaXQgbWF5IGFsc28gYmUgJ3ZuYycuCisjICAgICAgICAgIHdoZW4gaXQncyAndm5jJywgdGhlbiBzdWIgY29tbWFuZCBkZXBlbmRzIG9uIEB0YXJnZXQKKyMKKyMgQHRhcmdldDogSWYgQGRldmljZSBpcyBhIGJsb2NrIGRldmljZSwgdGhlbiB0aGlzIGlzIHRoZSBuZXcgZmlsZW5hbWUuCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgJ3ZuYycsIHRoZW4gaWYgdGhlIHZhbHVlICdwYXNzd29yZCcgc2VsZWN0cyB0aGUgdm5jCisjICAgICAgICAgIGNoYW5nZSBwYXNzd29yZCBjb21tYW5kLiAgIE90aGVyd2lzZSwgdGhpcyBzcGVjaWZpZXMgYSBuZXcgc2VydmVyIFVSSQorIyAgICAgICAgICBhZGRyZXNzIHRvIGxpc3RlbiB0byBmb3IgVk5DIGNvbm5lY3Rpb25zLgorIworIyBAYXJnOiAgICBJZiBAZGV2aWNlIGlzIGEgYmxvY2sgZGV2aWNlLCB0aGVuIHRoaXMgaXMgYW4gb3B0aW9uYWwgZm9ybWF0IHRvIG9wZW4KKyMgICAgICAgICAgdGhlIGRldmljZSB3aXRoLgorIyAgICAgICAgICBJZiBAZGV2aWNlIGlzICd2bmMnIGFuZCBAdGFyZ2V0IGlzICdwYXNzd29yZCcsIHRoaXMgaXMgdGhlIG5ldyBWTkMKKyMgICAgICAgICAgcGFzc3dvcmQgdG8gc2V0LiAgSWYgdGhpcyBhcmd1bWVudCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZW4gbm8gZnV0dXJlCisjICAgICAgICAgIGxvZ2lucyB3aWxsIGJlIGFsbG93ZWQuCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2Vzcy4KKyMgICAgICAgICAgSWYgQGRldmljZSBpcyBub3QgYSB2YWxpZCBibG9jayBkZXZpY2UsIERldmljZU5vdEZvdW5kCisjICAgICAgICAgIElmIHRoZSBuZXcgYmxvY2sgZGV2aWNlIGlzIGVuY3J5cHRlZCwgRGV2aWNlRW5jcnlwdGVkLiAgTm90ZSB0aGF0CisjICAgICAgICAgIGlmIHRoaXMgZXJyb3IgaXMgcmV0dXJuZWQsIHRoZSBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkIHN1Y2Nlc3NmdWxseQorIyAgICAgICAgICBhbmQgYW4gYWRkaXRpb25hbCBjYWxsIHRvIEBibG9ja19wYXNzd2QgaXMgcmVxdWlyZWQgdG8gc2V0IHRoZQorIyAgICAgICAgICBkZXZpY2UncyBwYXNzd29yZC4gIFRoZSBiZWhhdmlvciBvZiByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBibG9jaworIyAgICAgICAgICBkZXZpY2UgYmV0d2VlbiB3aGVuIHRoZXNlIGNhbGxzIGFyZSBleGVjdXRlZCBpcyB1bmRlZmluZWQuCisjCisjIE5vdGVzOiAgSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB0aGlzIGludGVyZmFjZSBpcyBub3QgdXNlZCBlc3BlY2lhbGx5CisjICAgICAgICAgZm9yIGNoYW5naW5nIGJsb2NrIGRldmljZXMuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ2NoYW5nZScsCisgICdkYXRhJzogeydkZXZpY2UnOiAnc3RyJywgJ3RhcmdldCc6ICdzdHInLCAnKmFyZyc6ICdzdHInfSB9CisKKyMjCisjIEBibG9ja19zZXRfaW9fdGhyb3R0bGU6CisjCisjIENoYW5nZSBJL08gdGhyb3R0bGUgbGltaXRzIGZvciBhIGJsb2NrIGRyaXZlLgorIworIyBAZGV2aWNlOiBUaGUgbmFtZSBvZiB0aGUgZGV2aWNlCisjCisjIEBicHM6IHRvdGFsIHRocm91Z2hwdXQgbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZAorIworIyBAYnBzX3JkOiByZWFkIHRocm91Z2hwdXQgbGltaXQgaW4gYnl0ZXMgcGVyIHNlY29uZAorIworIyBAYnBzX3dyOiB3cml0ZSB0aHJvdWdocHV0IGxpbWl0IGluIGJ5dGVzIHBlciBzZWNvbmQKKyMKKyMgQGlvcHM6IHRvdGFsIEkvTyBvcGVyYXRpb25zIHBlciBzZWNvbmQKKyMKKyMgQG9wc19yZDogcmVhZCBJL08gb3BlcmF0aW9ucyBwZXIgc2Vjb25kCisjCisjIEBpb3BzX3dyOiB3cml0ZSBJL08gb3BlcmF0aW9ucyBwZXIgc2Vjb25kCisjCisjIEBicHNfbWF4OiAjb3B0aW9uYWwgdG90YWwgbWF4IGluIGJ5dGVzIChTaW5jZSAxLjcpCisjCisjIEBicHNfcmRfbWF4OiAjb3B0aW9uYWwgcmVhZCBtYXggaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgQGJwc193cl9tYXg6ICNvcHRpb25hbCB3cml0ZSBtYXggaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgQGlvcHNfbWF4OiAjb3B0aW9uYWwgdG90YWwgSS9PIG9wZXJhdGlvbnMgbWF4IChTaW5jZSAxLjcpCisjCisjIEBpb3BzX3JkX21heDogI29wdGlvbmFsIHJlYWQgSS9PIG9wZXJhdGlvbnMgbWF4IChTaW5jZSAxLjcpCisjCisjIEBpb3BzX3dyX21heDogI29wdGlvbmFsIHdyaXRlIEkvTyBvcGVyYXRpb25zIG1heCAoU2luY2UgMS43KQorIworIyBAaW9wc19zaXplOiAjb3B0aW9uYWwgYW4gSS9PIHNpemUgaW4gYnl0ZXMgKFNpbmNlIDEuNykKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBkZXZpY2UgaXMgbm90IGEgdmFsaWQgYmxvY2sgZGV2aWNlLCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZTogMS4xCisjIworeyAnY29tbWFuZCc6ICdibG9ja19zZXRfaW9fdGhyb3R0bGUnLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnYnBzJzogJ2ludCcsICdicHNfcmQnOiAnaW50JywgJ2Jwc193cic6ICdpbnQnLAorICAgICAgICAgICAgJ2lvcHMnOiAnaW50JywgJ2lvcHNfcmQnOiAnaW50JywgJ2lvcHNfd3InOiAnaW50JywKKyAgICAgICAgICAgICcqYnBzX21heCc6ICdpbnQnLCAnKmJwc19yZF9tYXgnOiAnaW50JywKKyAgICAgICAgICAgICcqYnBzX3dyX21heCc6ICdpbnQnLCAnKmlvcHNfbWF4JzogJ2ludCcsCisgICAgICAgICAgICAnKmlvcHNfcmRfbWF4JzogJ2ludCcsICcqaW9wc193cl9tYXgnOiAnaW50JywKKyAgICAgICAgICAgICcqaW9wc19zaXplJzogJ2ludCcgfSB9CisKKyMjCisjIEBibG9jay1zdHJlYW06CisjCisjIENvcHkgZGF0YSBmcm9tIGEgYmFja2luZyBmaWxlIGludG8gYSBibG9jayBkZXZpY2UuCisjCisjIFRoZSBibG9jayBzdHJlYW1pbmcgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBpbiB0aGUgYmFja2dyb3VuZCB1bnRpbCB0aGUgZW50aXJlCisjIGJhY2tpbmcgZmlsZSBoYXMgYmVlbiBjb3BpZWQuICBUaGlzIGNvbW1hbmQgcmV0dXJucyBpbW1lZGlhdGVseSBvbmNlIHN0cmVhbWluZworIyBoYXMgc3RhcnRlZC4gIFRoZSBzdGF0dXMgb2Ygb25nb2luZyBibG9jayBzdHJlYW1pbmcgb3BlcmF0aW9ucyBjYW4gYmUgY2hlY2tlZAorIyB3aXRoIHF1ZXJ5LWJsb2NrLWpvYnMuICBUaGUgb3BlcmF0aW9uIGNhbiBiZSBzdG9wcGVkIGJlZm9yZSBpdCBoYXMgY29tcGxldGVkCisjIHVzaW5nIHRoZSBibG9jay1qb2ItY2FuY2VsIGNvbW1hbmQuCisjCisjIElmIGEgYmFzZSBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIHNlY3RvcnMgYXJlIG5vdCBjb3BpZWQgZnJvbSB0aGF0IGJhc2UgZmlsZSBhbmQKKyMgaXRzIGJhY2tpbmcgY2hhaW4uICBXaGVuIHN0cmVhbWluZyBjb21wbGV0ZXMgdGhlIGltYWdlIGZpbGUgd2lsbCBoYXZlIHRoZSBiYXNlCisjIGZpbGUgYXMgaXRzIGJhY2tpbmcgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3RyZWFtIGEgc3Vic2V0IG9mIHRoZSBiYWNraW5nCisjIGZpbGUgY2hhaW4gaW5zdGVhZCBvZiBmbGF0dGVuaW5nIHRoZSBlbnRpcmUgaW1hZ2UuCisjCisjIE9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiB0aGUgaW1hZ2UgZmlsZSBpcyB1cGRhdGVkIHRvIGRyb3AgdGhlIGJhY2tpbmcgZmlsZQorIyBhbmQgdGhlIEJMT0NLX0pPQl9DT01QTEVURUQgZXZlbnQgaXMgZW1pdHRlZC4KKyMKKyMgQGRldmljZTogdGhlIGRldmljZSBuYW1lCisjCisjIEBiYXNlOiAgICNvcHRpb25hbCB0aGUgY29tbW9uIGJhY2tpbmcgZmlsZSBuYW1lCisjCisjIEBzcGVlZDogICNvcHRpb25hbCB0aGUgbWF4aW11bSBzcGVlZCwgaW4gYnl0ZXMgcGVyIHNlY29uZAorIworIyBAb24tZXJyb3I6ICNvcHRpb25hbCB0aGUgYWN0aW9uIHRvIHRha2Ugb24gYW4gZXJyb3IgKGRlZmF1bHQgcmVwb3J0KS4KKyMgICAgICAgICAgICAnc3RvcCcgYW5kICdlbm9zcGMnIGNhbiBvbmx5IGJlIHVzZWQgaWYgdGhlIGJsb2NrIGRldmljZQorIyAgICAgICAgICAgIHN1cHBvcnRzIGlvLXN0YXR1cyAoc2VlIEJsb2NrSW5mbykuICBTaW5jZSAxLjMuCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIyAgICAgICAgICBJZiBAZGV2aWNlIGRvZXMgbm90IGV4aXN0LCBEZXZpY2VOb3RGb3VuZAorIworIyBTaW5jZTogMS4xCisjIworeyAnY29tbWFuZCc6ICdibG9jay1zdHJlYW0nLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnKmJhc2UnOiAnc3RyJywgJypzcGVlZCc6ICdpbnQnLAorICAgICAgICAgICAgJypvbi1lcnJvcic6ICdCbG9ja2Rldk9uRXJyb3InIH0gfQorCisjIworIyBAYmxvY2stam9iLXNldC1zcGVlZDoKKyMKKyMgU2V0IG1heGltdW0gc3BlZWQgZm9yIGEgYmFja2dyb3VuZCBibG9jayBvcGVyYXRpb24uCisjCisjIFRoaXMgY29tbWFuZCBjYW4gb25seSBiZSBpc3N1ZWQgd2hlbiB0aGVyZSBpcyBhbiBhY3RpdmUgYmxvY2sgam9iLgorIworIyBUaHJvdHRsaW5nIGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBzcGVlZCB0byAwLgorIworIyBAZGV2aWNlOiB0aGUgZGV2aWNlIG5hbWUKKyMKKyMgQHNwZWVkOiAgdGhlIG1heGltdW0gc3BlZWQsIGluIGJ5dGVzIHBlciBzZWNvbmQsIG9yIDAgZm9yIHVubGltaXRlZC4KKyMgICAgICAgICAgRGVmYXVsdHMgdG8gMC4KKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIG5vIGJhY2tncm91bmQgb3BlcmF0aW9uIGlzIGFjdGl2ZSBvbiB0aGlzIGRldmljZSwgRGV2aWNlTm90QWN0aXZlCisjCisjIFNpbmNlOiAxLjEKKyMjCit7ICdjb21tYW5kJzogJ2Jsb2NrLWpvYi1zZXQtc3BlZWQnLAorICAnZGF0YSc6IHsgJ2RldmljZSc6ICdzdHInLCAnc3BlZWQnOiAnaW50JyB9IH0KKworIyMKKyMgQGJsb2NrLWpvYi1jYW5jZWw6CisjCisjIFN0b3AgYW4gYWN0aXZlIGJhY2tncm91bmQgYmxvY2sgb3BlcmF0aW9uLgorIworIyBUaGlzIGNvbW1hbmQgcmV0dXJucyBpbW1lZGlhdGVseSBhZnRlciBtYXJraW5nIHRoZSBhY3RpdmUgYmFja2dyb3VuZCBibG9jaworIyBvcGVyYXRpb24gZm9yIGNhbmNlbGxhdGlvbi4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBjb21tYW5kIGlmIG5vCisjIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcy4KKyMKKyMgVGhlIG9wZXJhdGlvbiB3aWxsIGNhbmNlbCBhcyBzb29uIGFzIHBvc3NpYmxlIGFuZCB0aGVuIGVtaXQgdGhlCisjIEJMT0NLX0pPQl9DQU5DRUxMRUQgZXZlbnQuICBCZWZvcmUgdGhhdCBoYXBwZW5zIHRoZSBqb2IgaXMgc3RpbGwgdmlzaWJsZSB3aGVuCisjIGVudW1lcmF0ZWQgdXNpbmcgcXVlcnktYmxvY2stam9icy4KKyMKKyMgRm9yIHN0cmVhbWluZywgdGhlIGltYWdlIGZpbGUgcmV0YWlucyBpdHMgYmFja2luZyBmaWxlIHVubGVzcyB0aGUgc3RyZWFtaW5nCisjIG9wZXJhdGlvbiBoYXBwZW5zIHRvIGNvbXBsZXRlIGp1c3QgYXMgaXQgaXMgYmVpbmcgY2FuY2VsbGVkLiAgQSBuZXcgc3RyZWFtaW5nCisjIG9wZXJhdGlvbiBjYW4gYmUgc3RhcnRlZCBhdCBhIGxhdGVyIHRpbWUgdG8gZmluaXNoIGNvcHlpbmcgYWxsIGRhdGEgZnJvbSB0aGUKKyMgYmFja2luZyBmaWxlLgorIworIyBAZGV2aWNlOiB0aGUgZGV2aWNlIG5hbWUKKyMKKyMgQGZvcmNlOiAjb3B0aW9uYWwgd2hldGhlciB0byBhbGxvdyBjYW5jZWxsYXRpb24gb2YgYSBwYXVzZWQgam9iIChkZWZhdWx0CisjICAgICAgICAgZmFsc2UpLiAgU2luY2UgMS4zLgorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgbm8gYmFja2dyb3VuZCBvcGVyYXRpb24gaXMgYWN0aXZlIG9uIHRoaXMgZGV2aWNlLCBEZXZpY2VOb3RBY3RpdmUKKyMKKyMgU2luY2U6IDEuMQorIyMKK3sgJ2NvbW1hbmQnOiAnYmxvY2stam9iLWNhbmNlbCcsICdkYXRhJzogeyAnZGV2aWNlJzogJ3N0cicsICcqZm9yY2UnOiAnYm9vbCcgfSB9CisKKyMjCisjIEBibG9jay1qb2ItcGF1c2U6CisjCisjIFBhdXNlIGFuIGFjdGl2ZSBiYWNrZ3JvdW5kIGJsb2NrIG9wZXJhdGlvbi4KKyMKKyMgVGhpcyBjb21tYW5kIHJldHVybnMgaW1tZWRpYXRlbHkgYWZ0ZXIgbWFya2luZyB0aGUgYWN0aXZlIGJhY2tncm91bmQgYmxvY2sKKyMgb3BlcmF0aW9uIGZvciBwYXVzaW5nLiAgSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGNvbW1hbmQgaWYgbm8KKyMgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLiAgUGF1c2luZyBhbiBhbHJlYWR5IHBhdXNlZCBqb2IgaGFzIG5vIGN1bXVsYXRpdmUKKyMgZWZmZWN0OyBhIHNpbmdsZSBibG9jay1qb2ItcmVzdW1lIGNvbW1hbmQgd2lsbCByZXN1bWUgdGhlIGpvYi4KKyMKKyMgVGhlIG9wZXJhdGlvbiB3aWxsIHBhdXNlIGFzIHNvb24gYXMgcG9zc2libGUuICBObyBldmVudCBpcyBlbWl0dGVkIHdoZW4KKyMgdGhlIG9wZXJhdGlvbiBpcyBhY3R1YWxseSBwYXVzZWQuICBDYW5jZWxsaW5nIGEgcGF1c2VkIGpvYiBhdXRvbWF0aWNhbGx5CisjIHJlc3VtZXMgaXQuCisjCisjIEBkZXZpY2U6IHRoZSBkZXZpY2UgbmFtZQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgbm8gYmFja2dyb3VuZCBvcGVyYXRpb24gaXMgYWN0aXZlIG9uIHRoaXMgZGV2aWNlLCBEZXZpY2VOb3RBY3RpdmUKKyMKKyMgU2luY2U6IDEuMworIyMKK3sgJ2NvbW1hbmQnOiAnYmxvY2stam9iLXBhdXNlJywgJ2RhdGEnOiB7ICdkZXZpY2UnOiAnc3RyJyB9IH0KKworIyMKKyMgQGJsb2NrLWpvYi1yZXN1bWU6CisjCisjIFJlc3VtZSBhbiBhY3RpdmUgYmFja2dyb3VuZCBibG9jayBvcGVyYXRpb24uCisjCisjIFRoaXMgY29tbWFuZCByZXR1cm5zIGltbWVkaWF0ZWx5IGFmdGVyIHJlc3VtaW5nIGEgcGF1c2VkIGJhY2tncm91bmQgYmxvY2sKKyMgb3BlcmF0aW9uLiAgSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGNvbW1hbmQgaWYgbm8gb3BlcmF0aW9uIGlzIGluCisjIHByb2dyZXNzLiAgUmVzdW1pbmcgYW4gYWxyZWFkeSBydW5uaW5nIGpvYiBpcyBub3QgYW4gZXJyb3IuCisjCisjIFRoaXMgY29tbWFuZCBhbHNvIGNsZWFycyB0aGUgZXJyb3Igc3RhdHVzIG9mIHRoZSBqb2IuCisjCisjIEBkZXZpY2U6IHRoZSBkZXZpY2UgbmFtZQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgbm8gYmFja2dyb3VuZCBvcGVyYXRpb24gaXMgYWN0aXZlIG9uIHRoaXMgZGV2aWNlLCBEZXZpY2VOb3RBY3RpdmUKKyMKKyMgU2luY2U6IDEuMworIyMKK3sgJ2NvbW1hbmQnOiAnYmxvY2stam9iLXJlc3VtZScsICdkYXRhJzogeyAnZGV2aWNlJzogJ3N0cicgfSB9CisKKyMjCisjIEBibG9jay1qb2ItY29tcGxldGU6CisjCisjIE1hbnVhbGx5IHRyaWdnZXIgY29tcGxldGlvbiBvZiBhbiBhY3RpdmUgYmFja2dyb3VuZCBibG9jayBvcGVyYXRpb24uICBUaGlzCisjIGlzIHN1cHBvcnRlZCBmb3IgZHJpdmUgbWlycm9yaW5nLCB3aGVyZSBpdCBhbHNvIHN3aXRjaGVzIHRoZSBkZXZpY2UgdG8KKyMgd3JpdGUgdG8gdGhlIHRhcmdldCBwYXRoIG9ubHkuICBUaGUgYWJpbGl0eSB0byBjb21wbGV0ZSBpcyBzaWduYWxlZCB3aXRoCisjIGEgQkxPQ0tfSk9CX1JFQURZIGV2ZW50LgorIworIyBUaGlzIGNvbW1hbmQgY29tcGxldGVzIGFuIGFjdGl2ZSBiYWNrZ3JvdW5kIGJsb2NrIG9wZXJhdGlvbiBzeW5jaHJvbm91c2x5LgorIyBUaGUgb3JkZXJpbmcgb2YgdGhpcyBjb21tYW5kJ3MgcmV0dXJuIHdpdGggdGhlIEJMT0NLX0pPQl9DT01QTEVURUQgZXZlbnQKKyMgaXMgbm90IGRlZmluZWQuICBOb3RlIHRoYXQgaWYgYW4gSS9PIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YKKyMgdGhpcyBjb21tYW5kOiAxKSB0aGUgY29tbWFuZCBpdHNlbGYgd2lsbCBmYWlsOyAyKSB0aGUgZXJyb3Igd2lsbCBiZSBwcm9jZXNzZWQKKyMgYWNjb3JkaW5nIHRvIHRoZSByZXJyb3Ivd2Vycm9yIGFyZ3VtZW50cyB0aGF0IHdlcmUgc3BlY2lmaWVkIHdoZW4gc3RhcnRpbmcKKyMgdGhlIG9wZXJhdGlvbi4KKyMKKyMgQSBjYW5jZWxsZWQgb3IgcGF1c2VkIGpvYiBjYW5ub3QgYmUgY29tcGxldGVkLgorIworIyBAZGV2aWNlOiB0aGUgZGV2aWNlIG5hbWUKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIG5vIGJhY2tncm91bmQgb3BlcmF0aW9uIGlzIGFjdGl2ZSBvbiB0aGlzIGRldmljZSwgRGV2aWNlTm90QWN0aXZlCisjCisjIFNpbmNlOiAxLjMKKyMjCit7ICdjb21tYW5kJzogJ2Jsb2NrLWpvYi1jb21wbGV0ZScsICdkYXRhJzogeyAnZGV2aWNlJzogJ3N0cicgfSB9CisKKyMjCisjIEBPYmplY3RUeXBlSW5mbzoKKyMKKyMgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2VhcmNoIHJlc3VsdCBmcm9tIEBxb20tbGlzdC10eXBlcworIworIyBAbmFtZTogdGhlIHR5cGUgbmFtZSBmb3VuZCBpbiB0aGUgc2VhcmNoCisjCisjIFNpbmNlOiAxLjEKKyMKKyMgTm90ZXM6IFRoaXMgY29tbWFuZCBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2Ugc3ludGF4IGluIGZ1dHVyZSByZWxlYXNlcy4KKyMjCit7ICd0eXBlJzogJ09iamVjdFR5cGVJbmZvJywKKyAgJ2RhdGEnOiB7ICduYW1lJzogJ3N0cicgfSB9CisKKyMjCisjIEBxb20tbGlzdC10eXBlczoKKyMKKyMgVGhpcyBjb21tYW5kIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiB0eXBlcyBnaXZlbiBzZWFyY2ggcGFyYW1ldGVycworIworIyBAaW1wbGVtZW50czogaWYgc3BlY2lmaWVkLCBvbmx5IHJldHVybiB0eXBlcyB0aGF0IGltcGxlbWVudCB0aGlzIHR5cGUgbmFtZQorIworIyBAYWJzdHJhY3Q6IGlmIHRydWUsIGluY2x1ZGUgYWJzdHJhY3QgdHlwZXMgaW4gdGhlIHJlc3VsdHMKKyMKKyMgUmV0dXJuczogYSBsaXN0IG9mIEBPYmplY3RUeXBlSW5mbyBvciBhbiBlbXB0eSBsaXN0IGlmIG5vIHJlc3VsdHMgYXJlIGZvdW5kCisjCisjIFNpbmNlOiAxLjEKKyMjCit7ICdjb21tYW5kJzogJ3FvbS1saXN0LXR5cGVzJywKKyAgJ2RhdGEnOiB7ICcqaW1wbGVtZW50cyc6ICdzdHInLCAnKmFic3RyYWN0JzogJ2Jvb2wnIH0sCisgICdyZXR1cm5zJzogWyAnT2JqZWN0VHlwZUluZm8nIF0gfQorCisjIworIyBARGV2aWNlUHJvcGVydHlJbmZvOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCBkZXZpY2UgcHJvcGVydGllcy4KKyMKKyMgQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorIyBAdHlwZTogdGhlIHR5cGVuYW1lIG9mIHRoZSBwcm9wZXJ0eQorIworIyBTaW5jZTogMS4yCisjIworeyAndHlwZSc6ICdEZXZpY2VQcm9wZXJ0eUluZm8nLAorICAnZGF0YSc6IHsgJ25hbWUnOiAnc3RyJywgJ3R5cGUnOiAnc3RyJyB9IH0KKworIyMKKyMgQGRldmljZS1saXN0LXByb3BlcnRpZXM6CisjCisjIExpc3QgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggYSBkZXZpY2UuCisjCisjIEB0eXBlbmFtZTogdGhlIHR5cGUgbmFtZSBvZiBhIGRldmljZQorIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgRGV2aWNlUHJvcGVydHlJbmZvIGRlc2NyaWJpbmcgYSBkZXZpY2VzIHByb3BlcnRpZXMKKyMKKyMgU2luY2U6IDEuMgorIyMKK3sgJ2NvbW1hbmQnOiAnZGV2aWNlLWxpc3QtcHJvcGVydGllcycsCisgICdkYXRhJzogeyAndHlwZW5hbWUnOiAnc3RyJ30sCisgICdyZXR1cm5zJzogWyAnRGV2aWNlUHJvcGVydHlJbmZvJyBdIH0KKworIyMKKyMgQG1pZ3JhdGUKKyMKKyMgTWlncmF0ZXMgdGhlIGN1cnJlbnQgcnVubmluZyBndWVzdCB0byBhbm90aGVyIFZpcnR1YWwgTWFjaGluZS4KKyMKKyMgQHVyaTogdGhlIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciBvZiB0aGUgZGVzdGluYXRpb24gVk0KKyMKKyMgQGJsazogI29wdGlvbmFsIGRvIGJsb2NrIG1pZ3JhdGlvbiAoZnVsbCBkaXNrIGNvcHkpCisjCisjIEBpbmM6ICNvcHRpb25hbCBpbmNyZW1lbnRhbCBkaXNrIGNvcHkgbWlncmF0aW9uCisjCisjIEBkZXRhY2g6IHRoaXMgYXJndW1lbnQgZXhpc3RzIG9ubHkgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBhbmQKKyMgICAgICAgICAgaXMgaWdub3JlZCBieSBRRU1VCisjCisjIFJldHVybnM6IG5vdGhpbmcgb24gc3VjY2VzcworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdtaWdyYXRlJywKKyAgJ2RhdGEnOiB7J3VyaSc6ICdzdHInLCAnKmJsayc6ICdib29sJywgJyppbmMnOiAnYm9vbCcsICcqZGV0YWNoJzogJ2Jvb2wnIH0gfQorCisjIEB4ZW4tc2F2ZS1kZXZpY2VzLXN0YXRlOgorIworIyBTYXZlIHRoZSBzdGF0ZSBvZiBhbGwgZGV2aWNlcyB0byBmaWxlLiBUaGUgUkFNIGFuZCB0aGUgYmxvY2sgZGV2aWNlcworIyBvZiB0aGUgVk0gYXJlIG5vdCBzYXZlZCBieSB0aGlzIGNvbW1hbmQuCisjCisjIEBmaWxlbmFtZTogdGhlIGZpbGUgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhlIGRldmljZXMgdG8gYXMgYmluYXJ5CisjIGRhdGEuIFNlZSB4ZW4tc2F2ZS1kZXZpY2VzLXN0YXRlLnR4dCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYmluYXJ5CisjIGZvcm1hdC4KKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjCisjIFNpbmNlOiAxLjEKKyMjCit7ICdjb21tYW5kJzogJ3hlbi1zYXZlLWRldmljZXMtc3RhdGUnLCAnZGF0YSc6IHsnZmlsZW5hbWUnOiAnc3RyJ30gfQorCisjIworIyBAeGVuLXNldC1nbG9iYWwtZGlydHktbG9nCisjCisjIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBnbG9iYWwgZGlydHkgbG9nIG1vZGUuCisjCisjIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlLgorIworIyBSZXR1cm5zOiBub3RoaW5nCisjCisjIFNpbmNlOiAxLjMKKyMjCit7ICdjb21tYW5kJzogJ3hlbi1zZXQtZ2xvYmFsLWRpcnR5LWxvZycsICdkYXRhJzogeyAnZW5hYmxlJzogJ2Jvb2wnIH0gfQorCisjIworIyBAZGV2aWNlX2RlbDoKKyMKKyMgUmVtb3ZlIGEgZGV2aWNlIGZyb20gYSBndWVzdAorIworIyBAaWQ6IHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBpZCBpcyBub3QgYSB2YWxpZCBkZXZpY2UsIERldmljZU5vdEZvdW5kCisjCisjIE5vdGVzOiBXaGVuIHRoaXMgY29tbWFuZCBjb21wbGV0ZXMsIHRoZSBkZXZpY2UgbWF5IG5vdCBiZSByZW1vdmVkIGZyb20gdGhlCisjICAgICAgICBndWVzdC4gIEhvdCByZW1vdmFsIGlzIGFuIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIGd1ZXN0IGNvb3BlcmF0aW9uLgorIyAgICAgICAgVGhpcyBjb21tYW5kIG1lcmVseSByZXF1ZXN0cyB0aGF0IHRoZSBndWVzdCBiZWdpbiB0aGUgaG90IHJlbW92YWwKKyMgICAgICAgIHByb2Nlc3MuICBDb21wbGV0aW9uIG9mIHRoZSBkZXZpY2UgcmVtb3ZhbCBwcm9jZXNzIGlzIHNpZ25hbGVkIHdpdGggYQorIyAgICAgICAgREVWSUNFX0RFTEVURUQgZXZlbnQuIEd1ZXN0IHJlc2V0IHdpbGwgYXV0b21hdGljYWxseSBjb21wbGV0ZSByZW1vdmFsCisjICAgICAgICBmb3IgYWxsIGRldmljZXMuCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ2RldmljZV9kZWwnLCAnZGF0YSc6IHsnaWQnOiAnc3RyJ30gfQorCisjIworIyBAZHVtcC1ndWVzdC1tZW1vcnkKKyMKKyMgRHVtcCBndWVzdCdzIG1lbW9yeSB0byB2bWNvcmUuIEl0IGlzIGEgc3luY2hyb25vdXMgb3BlcmF0aW9uIHRoYXQgY2FuIHRha2UKKyMgdmVyeSBsb25nIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIGd1ZXN0IG1lbW9yeS4gVGhpcyBjb21tYW5kIGlzIG9ubHkKKyMgc3VwcG9ydGVkIG9uIGkzODYgYW5kIHg4Nl82NC4KKyMKKyMgQHBhZ2luZzogaWYgdHJ1ZSwgZG8gcGFnaW5nIHRvIGdldCBndWVzdCdzIG1lbW9yeSBtYXBwaW5nLiBUaGlzIGFsbG93cworIyAgICAgICAgICB1c2luZyBnZGIgdG8gcHJvY2VzcyB0aGUgY29yZSBmaWxlLgorIworIyAgICAgICAgICBJTVBPUlRBTlQ6IHRoaXMgb3B0aW9uIGNhbiBtYWtlIFFFTVUgYWxsb2NhdGUgc2V2ZXJhbCBnaWdhYnl0ZXMKKyMgICAgICAgICAgICAgICAgICAgICBvZiBSQU0uIFRoaXMgY2FuIGhhcHBlbiBmb3IgYSBsYXJnZSBndWVzdCwgb3IgYQorIyAgICAgICAgICAgICAgICAgICAgIG1hbGljaW91cyBndWVzdCBwcmV0ZW5kaW5nIHRvIGJlIGxhcmdlLgorIworIyAgICAgICAgICBBbHNvLCBwYWdpbmc9dHJ1ZSBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczoKKyMKKyMgICAgICAgICAgICAgMS4gVGhlIGd1ZXN0IG1heSBiZSBpbiBhIGNhdGFzdHJvcGhpYyBzdGF0ZSBvciBjYW4gaGF2ZSBjb3JydXB0ZWQKKyMgICAgICAgICAgICAgICAgbWVtb3J5LCB3aGljaCBjYW5ub3QgYmUgdHJ1c3RlZAorIyAgICAgICAgICAgICAyLiBUaGUgZ3Vlc3QgY2FuIGJlIGluIHJlYWwtbW9kZSBldmVuIGlmIHBhZ2luZyBpcyBlbmFibGVkLiBGb3IKKyMgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGd1ZXN0IHVzZXMgQUNQSSB0byBzbGVlcCwgYW5kIEFDUEkgc2xlZXAgc3RhdGUKKyMgICAgICAgICAgICAgICAgZ29lcyBpbiByZWFsLW1vZGUKKyMKKyMgQHByb3RvY29sOiB0aGUgZmlsZW5hbWUgb3IgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSB2bWNvcmUuIFRoZSBzdXBwb3J0ZWQKKyMgICAgICAgICAgICBwcm90b2NvbHMgYXJlOgorIworIyAgICAgICAgICAgIDEuIGZpbGU6IHRoZSBwcm90b2NvbCBzdGFydHMgd2l0aCAiZmlsZToiLCBhbmQgdGhlIGZvbGxvd2luZworIyAgICAgICAgICAgICAgIHN0cmluZyBpcyB0aGUgZmlsZSdzIHBhdGguCisjICAgICAgICAgICAgMi4gZmQ6IHRoZSBwcm90b2NvbCBzdGFydHMgd2l0aCAiZmQ6IiwgYW5kIHRoZSBmb2xsb3dpbmcgc3RyaW5nCisjICAgICAgICAgICAgICAgaXMgdGhlIGZkJ3MgbmFtZS4KKyMKKyMgQGJlZ2luOiAjb3B0aW9uYWwgaWYgc3BlY2lmaWVkLCB0aGUgc3RhcnRpbmcgcGh5c2ljYWwgYWRkcmVzcy4KKyMKKyMgQGxlbmd0aDogI29wdGlvbmFsIGlmIHNwZWNpZmllZCwgdGhlIG1lbW9yeSBzaXplLCBpbiBieXRlcy4gSWYgeW91IGRvbid0CisjICAgICAgICAgIHdhbnQgdG8gZHVtcCBhbGwgZ3Vlc3QncyBtZW1vcnksIHBsZWFzZSBzcGVjaWZ5IHRoZSBzdGFydCBAYmVnaW4KKyMgICAgICAgICAgYW5kIEBsZW5ndGgKKyMKKyMgUmV0dXJuczogbm90aGluZyBvbiBzdWNjZXNzCisjCisjIFNpbmNlOiAxLjIKKyMjCit7ICdjb21tYW5kJzogJ2R1bXAtZ3Vlc3QtbWVtb3J5JywKKyAgJ2RhdGEnOiB7ICdwYWdpbmcnOiAnYm9vbCcsICdwcm90b2NvbCc6ICdzdHInLCAnKmJlZ2luJzogJ2ludCcsCisgICAgICAgICAgICAnKmxlbmd0aCc6ICdpbnQnIH0gfQorCisjIworIyBAbmV0ZGV2X2FkZDoKKyMKKyMgQWRkIGEgbmV0d29yayBiYWNrZW5kLgorIworIyBAdHlwZTogdGhlIHR5cGUgb2YgbmV0d29yayBiYWNrZW5kLiAgQ3VycmVudCB2YWxpZCB2YWx1ZXMgYXJlICd1c2VyJywgJ3RhcCcsCisjICAgICAgICAndmRlJywgJ3NvY2tldCcsICdkdW1wJyBhbmQgJ2JyaWRnZScKKyMKKyMgQGlkOiB0aGUgbmFtZSBvZiB0aGUgbmV3IG5ldHdvcmsgYmFja2VuZAorIworIyBAcHJvcHM6ICNvcHRpb25hbCBhIGxpc3Qgb2YgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgdG8gdGhlIGJhY2tlbmQgaW4KKyMgICAgICAgICB0aGUgZm9ybWF0ICduYW1lPXZhbHVlJywgbGlrZSAnaWZuYW1lPXRhcDAsc2NyaXB0PW5vJworIworIyBOb3RlczogVGhlIHNlbWFudGljcyBvZiBAcHJvcHMgaXMgbm90IHdlbGwgZGVmaW5lZC4gIEZ1dHVyZSBjb21tYW5kcyB3aWxsIGJlCisjICAgICAgICBpbnRyb2R1Y2VkIHRoYXQgcHJvdmlkZSBzdHJvbmdlciB0eXBpbmcgZm9yIGJhY2tlbmQgY3JlYXRpb24uCisjCisjIFNpbmNlOiAwLjE0LjAKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEB0eXBlIGlzIG5vdCBhIHZhbGlkIG5ldHdvcmsgYmFja2VuZCwgRGV2aWNlTm90Rm91bmQKKyMjCit7ICdjb21tYW5kJzogJ25ldGRldl9hZGQnLAorICAnZGF0YSc6IHsndHlwZSc6ICdzdHInLCAnaWQnOiAnc3RyJywgJypwcm9wcyc6ICcqKid9LAorICAnZ2VuJzogJ25vJyB9CisKKyMjCisjIEBuZXRkZXZfZGVsOgorIworIyBSZW1vdmUgYSBuZXR3b3JrIGJhY2tlbmQuCisjCisjIEBpZDogdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgYmFja2VuZCB0byByZW1vdmUKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBpZCBpcyBub3QgYSB2YWxpZCBuZXR3b3JrIGJhY2tlbmQsIERldmljZU5vdEZvdW5kCisjCisjIFNpbmNlOiAwLjE0LjAKKyMjCit7ICdjb21tYW5kJzogJ25ldGRldl9kZWwnLCAnZGF0YSc6IHsnaWQnOiAnc3RyJ30gfQorCisjIworIyBATmV0ZGV2Tm9uZU9wdGlvbnMKKyMKKyMgVXNlIGl0IGFsb25lIHRvIGhhdmUgemVybyBuZXR3b3JrIGRldmljZXMuCisjCisjIFNpbmNlIDEuMgorIyMKK3sgJ3R5cGUnOiAnTmV0ZGV2Tm9uZU9wdGlvbnMnLAorICAnZGF0YSc6IHsgfSB9CisKKyMjCisjIEBOZXRMZWdhY3lOaWNPcHRpb25zCisjCisjIENyZWF0ZSBhIG5ldyBOZXR3b3JrIEludGVyZmFjZSBDYXJkLgorIworIyBAbmV0ZGV2OiAjb3B0aW9uYWwgaWQgb2YgLW5ldGRldiB0byBjb25uZWN0IHRvCisjCisjIEBtYWNhZGRyOiAjb3B0aW9uYWwgTUFDIGFkZHJlc3MKKyMKKyMgQG1vZGVsOiAjb3B0aW9uYWwgZGV2aWNlIG1vZGVsIChlMTAwMCwgcnRsODEzOSwgdmlydGlvIGV0Yy4pCisjCisjIEBhZGRyOiAjb3B0aW9uYWwgUENJIGRldmljZSBhZGRyZXNzCisjCisjIEB2ZWN0b3JzOiAjb3B0aW9uYWwgbnVtYmVyIG9mIE1TSS14IHZlY3RvcnMsIDAgdG8gZGlzYWJsZSBNU0ktWAorIworIyBTaW5jZSAxLjIKKyMjCit7ICd0eXBlJzogJ05ldExlZ2FjeU5pY09wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnKm5ldGRldic6ICAnc3RyJywKKyAgICAnKm1hY2FkZHInOiAnc3RyJywKKyAgICAnKm1vZGVsJzogICAnc3RyJywKKyAgICAnKmFkZHInOiAgICAnc3RyJywKKyAgICAnKnZlY3RvcnMnOiAndWludDMyJyB9IH0KKworIyMKKyMgQFN0cmluZworIworIyBBIGZhdCB0eXBlIHdyYXBwaW5nICdzdHInLCB0byBiZSBlbWJlZGRlZCBpbiBsaXN0cy4KKyMKKyMgU2luY2UgMS4yCisjIworeyAndHlwZSc6ICdTdHJpbmcnLAorICAnZGF0YSc6IHsKKyAgICAnc3RyJzogJ3N0cicgfSB9CisKKyMjCisjIEBOZXRkZXZVc2VyT3B0aW9ucworIworIyBVc2UgdGhlIHVzZXIgbW9kZSBuZXR3b3JrIHN0YWNrIHdoaWNoIHJlcXVpcmVzIG5vIGFkbWluaXN0cmF0b3IgcHJpdmlsZWdlIHRvCisjIHJ1bi4KKyMKKyMgQGhvc3RuYW1lOiAjb3B0aW9uYWwgY2xpZW50IGhvc3RuYW1lIHJlcG9ydGVkIGJ5IHRoZSBidWlsdGluIERIQ1Agc2VydmVyCisjCisjIEByZXN0cmljdDogI29wdGlvbmFsIGlzb2xhdGUgdGhlIGd1ZXN0IGZyb20gdGhlIGhvc3QKKyMKKyMgQGlwOiAjb3B0aW9uYWwgbGVnYWN5IHBhcmFtZXRlciwgdXNlIG5ldD0gaW5zdGVhZAorIworIyBAbmV0OiAjb3B0aW9uYWwgSVAgYWRkcmVzcyBhbmQgb3B0aW9uYWwgbmV0bWFzaworIworIyBAaG9zdDogI29wdGlvbmFsIGd1ZXN0LXZpc2libGUgYWRkcmVzcyBvZiB0aGUgaG9zdAorIworIyBAdGZ0cDogI29wdGlvbmFsIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBidWlsdC1pbiBURlRQIHNlcnZlcgorIworIyBAYm9vdGZpbGU6ICNvcHRpb25hbCBCT09UUCBmaWxlbmFtZSwgZm9yIHVzZSB3aXRoIHRmdHA9CisjCisjIEBkaGNwc3RhcnQ6ICNvcHRpb25hbCB0aGUgZmlyc3Qgb2YgdGhlIDE2IElQcyB0aGUgYnVpbHQtaW4gREhDUCBzZXJ2ZXIgY2FuCisjICAgICAgICAgICAgIGFzc2lnbgorIworIyBAZG5zOiAjb3B0aW9uYWwgZ3Vlc3QtdmlzaWJsZSBhZGRyZXNzIG9mIHRoZSB2aXJ0dWFsIG5hbWVzZXJ2ZXIKKyMKKyMgQGRuc3NlYXJjaDogI29wdGlvbmFsIGxpc3Qgb2YgRE5TIHN1ZmZpeGVzIHRvIHNlYXJjaCwgcGFzc2VkIGFzIERIQ1Agb3B0aW9uCisjICAgICAgICAgICAgIHRvIHRoZSBndWVzdAorIworIyBAc21iOiAjb3B0aW9uYWwgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWx0LWluIFNNQiBzZXJ2ZXIKKyMKKyMgQHNtYnNlcnZlcjogI29wdGlvbmFsIElQIGFkZHJlc3Mgb2YgdGhlIGJ1aWx0LWluIFNNQiBzZXJ2ZXIKKyMKKyMgQGhvc3Rmd2Q6ICNvcHRpb25hbCByZWRpcmVjdCBpbmNvbWluZyBUQ1Agb3IgVURQIGhvc3QgY29ubmVjdGlvbnMgdG8gZ3Vlc3QKKyMgICAgICAgICAgIGVuZHBvaW50cworIworIyBAZ3Vlc3Rmd2Q6ICNvcHRpb25hbCBmb3J3YXJkIGd1ZXN0IFRDUCBjb25uZWN0aW9ucworIworIyBTaW5jZSAxLjIKKyMjCit7ICd0eXBlJzogJ05ldGRldlVzZXJPcHRpb25zJywKKyAgJ2RhdGEnOiB7CisgICAgJypob3N0bmFtZSc6ICAnc3RyJywKKyAgICAnKnJlc3RyaWN0JzogICdib29sJywKKyAgICAnKmlwJzogICAgICAgICdzdHInLAorICAgICcqbmV0JzogICAgICAgJ3N0cicsCisgICAgJypob3N0JzogICAgICAnc3RyJywKKyAgICAnKnRmdHAnOiAgICAgICdzdHInLAorICAgICcqYm9vdGZpbGUnOiAgJ3N0cicsCisgICAgJypkaGNwc3RhcnQnOiAnc3RyJywKKyAgICAnKmRucyc6ICAgICAgICdzdHInLAorICAgICcqZG5zc2VhcmNoJzogWydTdHJpbmcnXSwKKyAgICAnKnNtYic6ICAgICAgICdzdHInLAorICAgICcqc21ic2VydmVyJzogJ3N0cicsCisgICAgJypob3N0ZndkJzogICBbJ1N0cmluZyddLAorICAgICcqZ3Vlc3Rmd2QnOiAgWydTdHJpbmcnXSB9IH0KKworIyMKKyMgQE5ldGRldlRhcE9wdGlvbnMKKyMKKyMgQ29ubmVjdCB0aGUgaG9zdCBUQVAgbmV0d29yayBpbnRlcmZhY2UgbmFtZSB0byB0aGUgVkxBTi4KKyMKKyMgQGlmbmFtZTogI29wdGlvbmFsIGludGVyZmFjZSBuYW1lCisjCisjIEBmZDogI29wdGlvbmFsIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBhbHJlYWR5IG9wZW5lZCB0YXAKKyMKKyMgQGZkczogI29wdGlvbmFsIG11bHRpcGxlIGZpbGUgZGVzY3JpcHRvcnMgb2YgYWxyZWFkeSBvcGVuZWQgbXVsdGlxdWV1ZSBjYXBhYmxlCisjIHRhcAorIworIyBAc2NyaXB0OiAjb3B0aW9uYWwgc2NyaXB0IHRvIGluaXRpYWxpemUgdGhlIGludGVyZmFjZQorIworIyBAZG93bnNjcmlwdDogI29wdGlvbmFsIHNjcmlwdCB0byBzaHV0IGRvd24gdGhlIGludGVyZmFjZQorIworIyBAaGVscGVyOiAjb3B0aW9uYWwgY29tbWFuZCB0byBleGVjdXRlIHRvIGNvbmZpZ3VyZSBicmlkZ2UKKyMKKyMgQHNuZGJ1ZjogI29wdGlvbmFsIHNlbmQgYnVmZmVyIGxpbWl0LiBVbmRlcnN0YW5kcyBbVEdNS2tiXSBzdWZmaXhlcy4KKyMKKyMgQHZuZXRfaGRyOiAjb3B0aW9uYWwgZW5hYmxlIHRoZSBJRkZfVk5FVF9IRFIgZmxhZyBvbiB0aGUgdGFwIGludGVyZmFjZQorIworIyBAdmhvc3Q6ICNvcHRpb25hbCBlbmFibGUgdmhvc3QtbmV0IG5ldHdvcmsgYWNjZWxlcmF0b3IKKyMKKyMgQHZob3N0ZmQ6ICNvcHRpb25hbCBmaWxlIGRlc2NyaXB0b3Igb2YgYW4gYWxyZWFkeSBvcGVuZWQgdmhvc3QgbmV0IGRldmljZQorIworIyBAdmhvc3RmZHM6ICNvcHRpb25hbCBmaWxlIGRlc2NyaXB0b3JzIG9mIG11bHRpcGxlIGFscmVhZHkgb3BlbmVkIHZob3N0IG5ldAorIyBkZXZpY2VzCisjCisjIEB2aG9zdGZvcmNlOiAjb3B0aW9uYWwgdmhvc3Qgb24gZm9yIG5vbi1NU0lYIHZpcnRpbyBndWVzdHMKKyMKKyMgQHF1ZXVlczogI29wdGlvbmFsIG51bWJlciBvZiBxdWV1ZXMgdG8gYmUgY3JlYXRlZCBmb3IgbXVsdGlxdWV1ZSBjYXBhYmxlIHRhcAorIworIyBTaW5jZSAxLjIKKyMjCit7ICd0eXBlJzogJ05ldGRldlRhcE9wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnKmlmbmFtZSc6ICAgICAnc3RyJywKKyAgICAnKmZkJzogICAgICAgICAnc3RyJywKKyAgICAnKmZkcyc6ICAgICAgICAnc3RyJywKKyAgICAnKnNjcmlwdCc6ICAgICAnc3RyJywKKyAgICAnKmRvd25zY3JpcHQnOiAnc3RyJywKKyAgICAnKmhlbHBlcic6ICAgICAnc3RyJywKKyAgICAnKnNuZGJ1Zic6ICAgICAnc2l6ZScsCisgICAgJyp2bmV0X2hkcic6ICAgJ2Jvb2wnLAorICAgICcqdmhvc3QnOiAgICAgICdib29sJywKKyAgICAnKnZob3N0ZmQnOiAgICAnc3RyJywKKyAgICAnKnZob3N0ZmRzJzogICAnc3RyJywKKyAgICAnKnZob3N0Zm9yY2UnOiAnYm9vbCcsCisgICAgJypxdWV1ZXMnOiAgICAgJ3VpbnQzMid9IH0KKworIyMKKyMgQE5ldGRldlNvY2tldE9wdGlvbnMKKyMKKyMgQ29ubmVjdCB0aGUgVkxBTiB0byBhIHJlbW90ZSBWTEFOIGluIGFub3RoZXIgUUVNVSB2aXJ0dWFsIG1hY2hpbmUgdXNpbmcgYSBUQ1AKKyMgc29ja2V0IGNvbm5lY3Rpb24uCisjCisjIEBmZDogI29wdGlvbmFsIGZpbGUgZGVzY3JpcHRvciBvZiBhbiBhbHJlYWR5IG9wZW5lZCBzb2NrZXQKKyMKKyMgQGxpc3RlbjogI29wdGlvbmFsIHBvcnQgbnVtYmVyLCBhbmQgb3B0aW9uYWwgaG9zdG5hbWUsIHRvIGxpc3RlbiBvbgorIworIyBAY29ubmVjdDogI29wdGlvbmFsIHBvcnQgbnVtYmVyLCBhbmQgb3B0aW9uYWwgaG9zdG5hbWUsIHRvIGNvbm5lY3QgdG8KKyMKKyMgQG1jYXN0OiAjb3B0aW9uYWwgVURQIG11bHRpY2FzdCBhZGRyZXNzIGFuZCBwb3J0IG51bWJlcgorIworIyBAbG9jYWxhZGRyOiAjb3B0aW9uYWwgc291cmNlIGFkZHJlc3MgYW5kIHBvcnQgZm9yIG11bHRpY2FzdCBhbmQgdWRwIHBhY2tldHMKKyMKKyMgQHVkcDogI29wdGlvbmFsIFVEUCB1bmljYXN0IGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyCisjCisjIFNpbmNlIDEuMgorIyMKK3sgJ3R5cGUnOiAnTmV0ZGV2U29ja2V0T3B0aW9ucycsCisgICdkYXRhJzogeworICAgICcqZmQnOiAgICAgICAgJ3N0cicsCisgICAgJypsaXN0ZW4nOiAgICAnc3RyJywKKyAgICAnKmNvbm5lY3QnOiAgICdzdHInLAorICAgICcqbWNhc3QnOiAgICAgJ3N0cicsCisgICAgJypsb2NhbGFkZHInOiAnc3RyJywKKyAgICAnKnVkcCc6ICAgICAgICdzdHInIH0gfQorCisjIworIyBATmV0ZGV2VmRlT3B0aW9ucworIworIyBDb25uZWN0IHRoZSBWTEFOIHRvIGEgdmRlIHN3aXRjaCBydW5uaW5nIG9uIHRoZSBob3N0LgorIworIyBAc29jazogI29wdGlvbmFsIHNvY2tldCBwYXRoCisjCisjIEBwb3J0OiAjb3B0aW9uYWwgcG9ydCBudW1iZXIKKyMKKyMgQGdyb3VwOiAjb3B0aW9uYWwgZ3JvdXAgb3duZXIgb2Ygc29ja2V0CisjCisjIEBtb2RlOiAjb3B0aW9uYWwgcGVybWlzc2lvbnMgZm9yIHNvY2tldAorIworIyBTaW5jZSAxLjIKKyMjCit7ICd0eXBlJzogJ05ldGRldlZkZU9wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnKnNvY2snOiAgJ3N0cicsCisgICAgJypwb3J0JzogICd1aW50MTYnLAorICAgICcqZ3JvdXAnOiAnc3RyJywKKyAgICAnKm1vZGUnOiAgJ3VpbnQxNicgfSB9CisKKyMjCisjIEBOZXRkZXZEdW1wT3B0aW9ucworIworIyBEdW1wIFZMQU4gbmV0d29yayB0cmFmZmljIHRvIGEgZmlsZS4KKyMKKyMgQGxlbjogI29wdGlvbmFsIHBlci1wYWNrZXQgc2l6ZSBsaW1pdCAoNjRrIGRlZmF1bHQpLiBVbmRlcnN0YW5kcyBbVEdNS2tiXQorIyBzdWZmaXhlcy4KKyMKKyMgQGZpbGU6ICNvcHRpb25hbCBkdW1wIGZpbGUgcGF0aCAoZGVmYXVsdCBpcyBxZW11LXZsYW4wLnBjYXApCisjCisjIFNpbmNlIDEuMgorIyMKK3sgJ3R5cGUnOiAnTmV0ZGV2RHVtcE9wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnKmxlbic6ICAnc2l6ZScsCisgICAgJypmaWxlJzogJ3N0cicgfSB9CisKKyMjCisjIEBOZXRkZXZCcmlkZ2VPcHRpb25zCisjCisjIENvbm5lY3QgYSBob3N0IFRBUCBuZXR3b3JrIGludGVyZmFjZSB0byBhIGhvc3QgYnJpZGdlIGRldmljZS4KKyMKKyMgQGJyOiAjb3B0aW9uYWwgYnJpZGdlIG5hbWUKKyMKKyMgQGhlbHBlcjogI29wdGlvbmFsIGNvbW1hbmQgdG8gZXhlY3V0ZSB0byBjb25maWd1cmUgYnJpZGdlCisjCisjIFNpbmNlIDEuMgorIyMKK3sgJ3R5cGUnOiAnTmV0ZGV2QnJpZGdlT3B0aW9ucycsCisgICdkYXRhJzogeworICAgICcqYnInOiAgICAgJ3N0cicsCisgICAgJypoZWxwZXInOiAnc3RyJyB9IH0KKworIyMKKyMgQE5ldGRldkh1YlBvcnRPcHRpb25zCisjCisjIENvbm5lY3QgdHdvIG9yIG1vcmUgbmV0IGNsaWVudHMgdGhyb3VnaCBhIHNvZnR3YXJlIGh1Yi4KKyMKKyMgQGh1YmlkOiBodWIgaWRlbnRpZmllciBudW1iZXIKKyMKKyMgU2luY2UgMS4yCisjIworeyAndHlwZSc6ICdOZXRkZXZIdWJQb3J0T3B0aW9ucycsCisgICdkYXRhJzogeworICAgICdodWJpZCc6ICAgICAnaW50MzInIH0gfQorCisjIworIyBATmV0ZGV2TmV0bWFwT3B0aW9ucworIworIyBDb25uZWN0IGEgY2xpZW50IHRvIGEgbmV0bWFwLWVuYWJsZWQgTklDIG9yIHRvIGEgVkFMRSBzd2l0Y2ggcG9ydAorIworIyBAaWZuYW1lOiBFaXRoZXIgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgbmV0d29yayBpbnRlcmZhY2Ugc3VwcG9ydGVkIGJ5CisjICAgICAgICAgIG5ldG1hcCwgb3IgdGhlIG5hbWUgb2YgYSBWQUxFIHBvcnQgKGNyZWF0ZWQgb24gdGhlIGZseSkuCisjICAgICAgICAgIEEgVkFMRSBwb3J0IG5hbWUgaXMgaW4gdGhlIGZvcm0gJ3ZhbGVYWFg6WVlZJywgd2hlcmUgWFhYIGFuZAorIyAgICAgICAgICBZWVkgYXJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycy4gWFhYIGlkZW50aWZpZXMgYSBzd2l0Y2ggYW5kCisjICAgICAgICAgIFlZWSBpZGVudGlmaWVzIGEgcG9ydCBvZiB0aGUgc3dpdGNoLiBWQUxFIHBvcnRzIGhhdmluZyB0aGUKKyMgICAgICAgICAgc2FtZSBYWFggYXJlIHRoZXJlZm9yZSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgc3dpdGNoLgorIworIyBAZGV2bmFtZTogI29wdGlvbmFsIHBhdGggb2YgdGhlIG5ldG1hcCBkZXZpY2UgKGRlZmF1bHQ6ICcvZGV2L25ldG1hcCcpLgorIworIyBTaW5jZSAxLjgKKyMjCit7ICd0eXBlJzogJ05ldGRldk5ldG1hcE9wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnaWZuYW1lJzogICAgICdzdHInLAorICAgICcqZGV2bmFtZSc6ICAgICdzdHInIH0gfQorCisjIworIyBATmV0Q2xpZW50T3B0aW9ucworIworIyBBIGRpc2NyaW1pbmF0ZWQgcmVjb3JkIG9mIG5ldHdvcmsgZGV2aWNlIHRyYWl0cy4KKyMKKyMgU2luY2UgMS4yCisjIworeyAndW5pb24nOiAnTmV0Q2xpZW50T3B0aW9ucycsCisgICdkYXRhJzogeworICAgICdub25lJzogICAgICdOZXRkZXZOb25lT3B0aW9ucycsCisgICAgJ25pYyc6ICAgICAgJ05ldExlZ2FjeU5pY09wdGlvbnMnLAorICAgICd1c2VyJzogICAgICdOZXRkZXZVc2VyT3B0aW9ucycsCisgICAgJ3RhcCc6ICAgICAgJ05ldGRldlRhcE9wdGlvbnMnLAorICAgICdzb2NrZXQnOiAgICdOZXRkZXZTb2NrZXRPcHRpb25zJywKKyAgICAndmRlJzogICAgICAnTmV0ZGV2VmRlT3B0aW9ucycsCisgICAgJ2R1bXAnOiAgICAgJ05ldGRldkR1bXBPcHRpb25zJywKKyAgICAnYnJpZGdlJzogICAnTmV0ZGV2QnJpZGdlT3B0aW9ucycsCisgICAgJ2h1YnBvcnQnOiAgJ05ldGRldkh1YlBvcnRPcHRpb25zJywKKyAgICAnbmV0bWFwJzogICAnTmV0ZGV2TmV0bWFwT3B0aW9ucycgfSB9CisKKyMjCisjIEBOZXRMZWdhY3kKKyMKKyMgQ2FwdHVyZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBuZXR3b3JrIGRldmljZTsgbGVnYWN5LgorIworIyBAdmxhbjogI29wdGlvbmFsIHZsYW4gbnVtYmVyCisjCisjIEBpZDogI29wdGlvbmFsIGlkZW50aWZpZXIgZm9yIG1vbml0b3IgY29tbWFuZHMKKyMKKyMgQG5hbWU6ICNvcHRpb25hbCBpZGVudGlmaWVyIGZvciBtb25pdG9yIGNvbW1hbmRzLCBpZ25vcmVkIGlmIEBpZCBpcyBwcmVzZW50CisjCisjIEBvcHRzOiBkZXZpY2UgdHlwZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIChsZWdhY3kpCisjCisjIFNpbmNlIDEuMgorIyMKK3sgJ3R5cGUnOiAnTmV0TGVnYWN5JywKKyAgJ2RhdGEnOiB7CisgICAgJyp2bGFuJzogJ2ludDMyJywKKyAgICAnKmlkJzogICAnc3RyJywKKyAgICAnKm5hbWUnOiAnc3RyJywKKyAgICAnb3B0cyc6ICAnTmV0Q2xpZW50T3B0aW9ucycgfSB9CisKKyMjCisjIEBOZXRkZXYKKyMKKyMgQ2FwdHVyZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBuZXR3b3JrIGRldmljZS4KKyMKKyMgQGlkOiBpZGVudGlmaWVyIGZvciBtb25pdG9yIGNvbW1hbmRzLgorIworIyBAb3B0czogZGV2aWNlIHR5cGUgc3BlY2lmaWMgcHJvcGVydGllcworIworIyBTaW5jZSAxLjIKKyMjCit7ICd0eXBlJzogJ05ldGRldicsCisgICdkYXRhJzogeworICAgICdpZCc6ICAgJ3N0cicsCisgICAgJ29wdHMnOiAnTmV0Q2xpZW50T3B0aW9ucycgfSB9CisKKyMjCisjIEBJbmV0U29ja2V0QWRkcmVzcworIworIyBDYXB0dXJlcyBhIHNvY2tldCBhZGRyZXNzIG9yIGFkZHJlc3MgcmFuZ2UgaW4gdGhlIEludGVybmV0IG5hbWVzcGFjZS4KKyMKKyMgQGhvc3Q6IGhvc3QgcGFydCBvZiB0aGUgYWRkcmVzcworIworIyBAcG9ydDogcG9ydCBwYXJ0IG9mIHRoZSBhZGRyZXNzLCBvciBsb3dlc3QgcG9ydCBpZiBAdG8gaXMgcHJlc2VudAorIworIyBAdG86IGhpZ2hlc3QgcG9ydCB0byB0cnkKKyMKKyMgQGlwdjQ6IHdoZXRoZXIgdG8gYWNjZXB0IElQdjQgYWRkcmVzc2VzLCBkZWZhdWx0IHRyeSBib3RoIElQdjQgYW5kIElQdjYKKyMgICAgICAgICNvcHRpb25hbAorIworIyBAaXB2Njogd2hldGhlciB0byBhY2NlcHQgSVB2NiBhZGRyZXNzZXMsIGRlZmF1bHQgdHJ5IGJvdGggSVB2NCBhbmQgSVB2NgorIyAgICAgICAgI29wdGlvbmFsCisjCisjIFNpbmNlIDEuMworIyMKK3sgJ3R5cGUnOiAnSW5ldFNvY2tldEFkZHJlc3MnLAorICAnZGF0YSc6IHsKKyAgICAnaG9zdCc6ICdzdHInLAorICAgICdwb3J0JzogJ3N0cicsCisgICAgJyp0byc6ICd1aW50MTYnLAorICAgICcqaXB2NCc6ICdib29sJywKKyAgICAnKmlwdjYnOiAnYm9vbCcgfSB9CisKKyMjCisjIEBVbml4U29ja2V0QWRkcmVzcworIworIyBDYXB0dXJlcyBhIHNvY2tldCBhZGRyZXNzIGluIHRoZSBsb2NhbCAoIlVuaXggc29ja2V0IikgbmFtZXNwYWNlLgorIworIyBAcGF0aDogZmlsZXN5c3RlbSBwYXRoIHRvIHVzZQorIworIyBTaW5jZSAxLjMKKyMjCit7ICd0eXBlJzogJ1VuaXhTb2NrZXRBZGRyZXNzJywKKyAgJ2RhdGEnOiB7CisgICAgJ3BhdGgnOiAnc3RyJyB9IH0KKworIyMKKyMgQFNvY2tldEFkZHJlc3MKKyMKKyMgQ2FwdHVyZXMgdGhlIGFkZHJlc3Mgb2YgYSBzb2NrZXQsIHdoaWNoIGNvdWxkIGFsc28gYmUgYSBuYW1lZCBmaWxlIGRlc2NyaXB0b3IKKyMKKyMgU2luY2UgMS4zCisjIworeyAndW5pb24nOiAnU29ja2V0QWRkcmVzcycsCisgICdkYXRhJzogeworICAgICdpbmV0JzogJ0luZXRTb2NrZXRBZGRyZXNzJywKKyAgICAndW5peCc6ICdVbml4U29ja2V0QWRkcmVzcycsCisgICAgJ2ZkJzogJ1N0cmluZycgfSB9CisKKyMjCisjIEBnZXRmZDoKKyMKKyMgUmVjZWl2ZSBhIGZpbGUgZGVzY3JpcHRvciB2aWEgU0NNIHJpZ2h0cyBhbmQgYXNzaWduIGl0IGEgbmFtZQorIworIyBAZmRuYW1lOiBmaWxlIGRlc2NyaXB0b3IgbmFtZQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDAuMTQuMAorIworIyBOb3RlczogSWYgQGZkbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlIGZpbGUgZGVzY3JpcHRvciBhc3NpZ25lZCB0bworIyAgICAgICAgaXQgd2lsbCBiZSBjbG9zZWQgYW5kIHJlcGxhY2VkIGJ5IHRoZSByZWNlaXZlZCBmaWxlCisjICAgICAgICBkZXNjcmlwdG9yLgorIyAgICAgICAgVGhlICdjbG9zZWZkJyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgY2xvc2UgdGhlCisjICAgICAgICBmaWxlIGRlc2NyaXB0b3Igd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorIyMKK3sgJ2NvbW1hbmQnOiAnZ2V0ZmQnLCAnZGF0YSc6IHsnZmRuYW1lJzogJ3N0cid9IH0KKworIyMKKyMgQGNsb3NlZmQ6CisjCisjIENsb3NlIGEgZmlsZSBkZXNjcmlwdG9yIHByZXZpb3VzbHkgcGFzc2VkIHZpYSBTQ00gcmlnaHRzCisjCisjIEBmZG5hbWU6IGZpbGUgZGVzY3JpcHRvciBuYW1lCisjCisjIFJldHVybnM6IE5vdGhpbmcgb24gc3VjY2VzcworIworIyBTaW5jZTogMC4xNC4wCisjIworeyAnY29tbWFuZCc6ICdjbG9zZWZkJywgJ2RhdGEnOiB7J2ZkbmFtZSc6ICdzdHInfSB9CisKKyMjCisjIEBNYWNoaW5lSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gZGVzY3JpYmluZyBhIG1hY2hpbmUuCisjCisjIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWFjaGluZQorIworIyBAYWxpYXM6ICNvcHRpb25hbCBhbiBhbGlhcyBmb3IgdGhlIG1hY2hpbmUgbmFtZQorIworIyBAZGVmYXVsdDogI29wdGlvbmFsIHdoZXRoZXIgdGhlIG1hY2hpbmUgaXMgZGVmYXVsdAorIworIyBAY3B1LW1heDogbWF4aW11bSBudW1iZXIgb2YgQ1BVcyBzdXBwb3J0ZWQgYnkgdGhlIG1hY2hpbmUgdHlwZQorIyAgICAgICAgICAgKHNpbmNlIDEuNS4wKQorIworIyBTaW5jZTogMS4yLjAKKyMjCit7ICd0eXBlJzogJ01hY2hpbmVJbmZvJywKKyAgJ2RhdGEnOiB7ICduYW1lJzogJ3N0cicsICcqYWxpYXMnOiAnc3RyJywKKyAgICAgICAgICAgICcqaXMtZGVmYXVsdCc6ICdib29sJywgJ2NwdS1tYXgnOiAnaW50JyB9IH0KKworIyMKKyMgQHF1ZXJ5LW1hY2hpbmVzOgorIworIyBSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCBtYWNoaW5lcworIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgTWFjaGluZUluZm8KKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1tYWNoaW5lcycsICdyZXR1cm5zJzogWydNYWNoaW5lSW5mbyddIH0KKworIyMKKyMgQENwdURlZmluaXRpb25JbmZvOgorIworIyBWaXJ0dWFsIENQVSBkZWZpbml0aW9uLgorIworIyBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIENQVSBkZWZpbml0aW9uCisjCisjIFNpbmNlOiAxLjIuMAorIyMKK3sgJ3R5cGUnOiAnQ3B1RGVmaW5pdGlvbkluZm8nLAorICAnZGF0YSc6IHsgJ25hbWUnOiAnc3RyJyB9IH0KKworIyMKKyMgQHF1ZXJ5LWNwdS1kZWZpbml0aW9uczoKKyMKKyMgUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmlydHVhbCBDUFUgZGVmaW5pdGlvbnMKKyMKKyMgUmV0dXJuczogYSBsaXN0IG9mIENwdURlZkluZm8KKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAnY29tbWFuZCc6ICdxdWVyeS1jcHUtZGVmaW5pdGlvbnMnLCAncmV0dXJucyc6IFsnQ3B1RGVmaW5pdGlvbkluZm8nXSB9CisKKyMgQEFkZGZkSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCB3YXMgYWRkZWQgdG8gYW4gZmQgc2V0LgorIworIyBAZmRzZXQtaWQ6IFRoZSBJRCBvZiB0aGUgZmQgc2V0IHRoYXQgQGZkIHdhcyBhZGRlZCB0by4KKyMKKyMgQGZkOiBUaGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgd2FzIHJlY2VpdmVkIHZpYSBTQ00gcmlnaHRzIGFuZAorIyAgICAgIGFkZGVkIHRvIHRoZSBmZCBzZXQuCisjCisjIFNpbmNlOiAxLjIuMAorIyMKK3sgJ3R5cGUnOiAnQWRkZmRJbmZvJywgJ2RhdGEnOiB7J2Zkc2V0LWlkJzogJ2ludCcsICdmZCc6ICdpbnQnfSB9CisKKyMjCisjIEBhZGQtZmQ6CisjCisjIEFkZCBhIGZpbGUgZGVzY3JpcHRvciwgdGhhdCB3YXMgcGFzc2VkIHZpYSBTQ00gcmlnaHRzLCB0byBhbiBmZCBzZXQuCisjCisjIEBmZHNldC1pZDogI29wdGlvbmFsIFRoZSBJRCBvZiB0aGUgZmQgc2V0IHRvIGFkZCB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvLgorIworIyBAb3BhcXVlOiAjb3B0aW9uYWwgQSBmcmVlLWZvcm0gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZkLgorIworIyBSZXR1cm5zOiBAQWRkZmRJbmZvIG9uIHN1Y2Nlc3MKKyMgICAgICAgICAgSWYgZmlsZSBkZXNjcmlwdG9yIHdhcyBub3QgcmVjZWl2ZWQsIEZkTm90U3VwcGxpZWQKKyMgICAgICAgICAgSWYgQGZkc2V0LWlkIGlzIGEgbmVnYXRpdmUgdmFsdWUsIEludmFsaWRQYXJhbWV0ZXJWYWx1ZQorIworIyBOb3RlczogVGhlIGxpc3Qgb2YgZmQgc2V0cyBpcyBzaGFyZWQgYnkgYWxsIG1vbml0b3IgY29ubmVjdGlvbnMuCisjCisjICAgICAgICBJZiBAZmRzZXQtaWQgaXMgbm90IHNwZWNpZmllZCwgYSBuZXcgZmQgc2V0IHdpbGwgYmUgY3JlYXRlZC4KKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAnY29tbWFuZCc6ICdhZGQtZmQnLCAnZGF0YSc6IHsnKmZkc2V0LWlkJzogJ2ludCcsICcqb3BhcXVlJzogJ3N0cid9LAorICAncmV0dXJucyc6ICdBZGRmZEluZm8nIH0KKworIyMKKyMgQHJlbW92ZS1mZDoKKyMKKyMgUmVtb3ZlIGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYW4gZmQgc2V0LgorIworIyBAZmRzZXQtaWQ6IFRoZSBJRCBvZiB0aGUgZmQgc2V0IHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvciBiZWxvbmdzIHRvLgorIworIyBAZmQ6ICNvcHRpb25hbCBUaGUgZmlsZSBkZXNjcmlwdG9yIHRoYXQgaXMgdG8gYmUgcmVtb3ZlZC4KKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIEBmZHNldC1pZCBvciBAZmQgaXMgbm90IGZvdW5kLCBGZE5vdEZvdW5kCisjCisjIFNpbmNlOiAxLjIuMAorIworIyBOb3RlczogVGhlIGxpc3Qgb2YgZmQgc2V0cyBpcyBzaGFyZWQgYnkgYWxsIG1vbml0b3IgY29ubmVjdGlvbnMuCisjCisjICAgICAgICBJZiBAZmQgaXMgbm90IHNwZWNpZmllZCwgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaW4gQGZkc2V0LWlkCisjICAgICAgICB3aWxsIGJlIHJlbW92ZWQuCisjIworeyAnY29tbWFuZCc6ICdyZW1vdmUtZmQnLCAnZGF0YSc6IHsnZmRzZXQtaWQnOiAnaW50JywgJypmZCc6ICdpbnQnfSB9CisKKyMjCisjIEBGZHNldEZkSW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCBiZWxvbmdzIHRvIGFuIGZkIHNldC4KKyMKKyMgQGZkOiBUaGUgZmlsZSBkZXNjcmlwdG9yIHZhbHVlLgorIworIyBAb3BhcXVlOiAjb3B0aW9uYWwgQSBmcmVlLWZvcm0gc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZkLgorIworIyBTaW5jZTogMS4yLjAKKyMjCit7ICd0eXBlJzogJ0Zkc2V0RmRJbmZvJywKKyAgJ2RhdGEnOiB7J2ZkJzogJ2ludCcsICcqb3BhcXVlJzogJ3N0cid9IH0KKworIyMKKyMgQEZkc2V0SW5mbzoKKyMKKyMgSW5mb3JtYXRpb24gYWJvdXQgYW4gZmQgc2V0LgorIworIyBAZmRzZXQtaWQ6IFRoZSBJRCBvZiB0aGUgZmQgc2V0LgorIworIyBAZmRzOiBBIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycyB0aGF0IGJlbG9uZyB0byB0aGlzIGZkIHNldC4KKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAndHlwZSc6ICdGZHNldEluZm8nLAorICAnZGF0YSc6IHsnZmRzZXQtaWQnOiAnaW50JywgJ2Zkcyc6IFsnRmRzZXRGZEluZm8nXX0gfQorCisjIworIyBAcXVlcnktZmRzZXRzOgorIworIyBSZXR1cm4gaW5mb3JtYXRpb24gZGVzY3JpYmluZyBhbGwgZmQgc2V0cy4KKyMKKyMgUmV0dXJuczogQSBsaXN0IG9mIEBGZHNldEluZm8KKyMKKyMgU2luY2U6IDEuMi4wCisjCisjIE5vdGU6IFRoZSBsaXN0IG9mIGZkIHNldHMgaXMgc2hhcmVkIGJ5IGFsbCBtb25pdG9yIGNvbm5lY3Rpb25zLgorIworIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktZmRzZXRzJywgJ3JldHVybnMnOiBbJ0Zkc2V0SW5mbyddIH0KKworIyMKKyMgQFRhcmdldEluZm86CisjCisjIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIFFFTVUgdGFyZ2V0LgorIworIyBAYXJjaDogdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgKGVnICJ4ODZfNjQiLCAiaTM4NiIsIGV0YykKKyMKKyMgU2luY2U6IDEuMi4wCisjIworeyAndHlwZSc6ICdUYXJnZXRJbmZvJywKKyAgJ2RhdGEnOiB7ICdhcmNoJzogJ3N0cicgfSB9CisKKyMjCisjIEBxdWVyeS10YXJnZXQ6CisjCisjIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFyZ2V0IGZvciB0aGlzIFFFTVUKKyMKKyMgUmV0dXJuczogVGFyZ2V0SW5mbworIworIyBTaW5jZTogMS4yLjAKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LXRhcmdldCcsICdyZXR1cm5zJzogJ1RhcmdldEluZm8nIH0KKworIyMKKyMgQFFLZXlDb2RlOgorIworIyBBbiBlbnVtZXJhdGlvbiBvZiBrZXkgbmFtZS4KKyMKKyMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBzZW5kLWtleSBjb21tYW5kLgorIworIyBTaW5jZTogMS4zLjAKKyMjCit7ICdlbnVtJzogJ1FLZXlDb2RlJywKKyAgJ2RhdGEnOiBbICdzaGlmdCcsICdzaGlmdF9yJywgJ2FsdCcsICdhbHRfcicsICdhbHRncicsICdhbHRncl9yJywgJ2N0cmwnLAorICAgICAgICAgICAgJ2N0cmxfcicsICdtZW51JywgJ2VzYycsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLAorICAgICAgICAgICAgJzknLCAnMCcsICdtaW51cycsICdlcXVhbCcsICdiYWNrc3BhY2UnLCAndGFiJywgJ3EnLCAndycsICdlJywKKyAgICAgICAgICAgICdyJywgJ3QnLCAneScsICd1JywgJ2knLCAnbycsICdwJywgJ2JyYWNrZXRfbGVmdCcsICdicmFja2V0X3JpZ2h0JywKKyAgICAgICAgICAgICdyZXQnLCAnYScsICdzJywgJ2QnLCAnZicsICdnJywgJ2gnLCAnaicsICdrJywgJ2wnLCAnc2VtaWNvbG9uJywKKyAgICAgICAgICAgICdhcG9zdHJvcGhlJywgJ2dyYXZlX2FjY2VudCcsICdiYWNrc2xhc2gnLCAneicsICd4JywgJ2MnLCAndicsICdiJywKKyAgICAgICAgICAgICduJywgJ20nLCAnY29tbWEnLCAnZG90JywgJ3NsYXNoJywgJ2FzdGVyaXNrJywgJ3NwYycsICdjYXBzX2xvY2snLAorICAgICAgICAgICAgJ2YxJywgJ2YyJywgJ2YzJywgJ2Y0JywgJ2Y1JywgJ2Y2JywgJ2Y3JywgJ2Y4JywgJ2Y5JywgJ2YxMCcsCisgICAgICAgICAgICAnbnVtX2xvY2snLCAnc2Nyb2xsX2xvY2snLCAna3BfZGl2aWRlJywgJ2twX211bHRpcGx5JywKKyAgICAgICAgICAgICdrcF9zdWJ0cmFjdCcsICdrcF9hZGQnLCAna3BfZW50ZXInLCAna3BfZGVjaW1hbCcsICdzeXNycScsICdrcF8wJywKKyAgICAgICAgICAgICdrcF8xJywgJ2twXzInLCAna3BfMycsICdrcF80JywgJ2twXzUnLCAna3BfNicsICdrcF83JywgJ2twXzgnLAorICAgICAgICAgICAgJ2twXzknLCAnbGVzcycsICdmMTEnLCAnZjEyJywgJ3ByaW50JywgJ2hvbWUnLCAncGd1cCcsICdwZ2RuJywgJ2VuZCcsCisgICAgICAgICAgICAnbGVmdCcsICd1cCcsICdkb3duJywgJ3JpZ2h0JywgJ2luc2VydCcsICdkZWxldGUnLCAnc3RvcCcsICdhZ2FpbicsCisgICAgICAgICAgICAncHJvcHMnLCAndW5kbycsICdmcm9udCcsICdjb3B5JywgJ29wZW4nLCAncGFzdGUnLCAnZmluZCcsICdjdXQnLAorICAgICAgICAgICAgICdsZicsICdoZWxwJywgJ21ldGFfbCcsICdtZXRhX3InLCAnY29tcG9zZScgXSB9CisKKyMjCisjIEBLZXlWYWx1ZQorIworIyBSZXByZXNlbnRzIGEga2V5Ym9hcmQga2V5LgorIworIyBTaW5jZTogMS4zLjAKKyMjCit7ICd1bmlvbic6ICdLZXlWYWx1ZScsCisgICdkYXRhJzogeworICAgICdudW1iZXInOiAnaW50JywKKyAgICAncWNvZGUnOiAnUUtleUNvZGUnIH0gfQorCisjIworIyBAc2VuZC1rZXk6CisjCisjIFNlbmQga2V5cyB0byBndWVzdC4KKyMKKyMgQGtleXM6IEFuIGFycmF5IG9mIEBLZXlWYWx1ZSBlbGVtZW50cy4gQWxsIEBLZXlWYWx1ZXMgaW4gdGhpcyBhcnJheSBhcmUKKyMgICAgICAgIHNpbXVsdGFuZW91c2x5IHNlbnQgdG8gdGhlIGd1ZXN0LiBBIEBLZXlWYWx1ZS5udW1iZXIgdmFsdWUgaXMgc2VudAorIyAgICAgICAgZGlyZWN0bHkgdG8gdGhlIGd1ZXN0LCB3aGlsZSBAS2V5VmFsdWUucWNvZGUgbXVzdCBiZSBhIHZhbGlkCisjICAgICAgICBAUUtleUNvZGUgdmFsdWUKKyMKKyMgQGhvbGQtdGltZTogI29wdGlvbmFsIHRpbWUgdG8gZGVsYXkga2V5IHVwIGV2ZW50cywgbWlsbGlzZWNvbmRzLiBEZWZhdWx0cworIyAgICAgICAgICAgICB0byAxMDAKKyMKKyMgUmV0dXJuczogTm90aGluZyBvbiBzdWNjZXNzCisjICAgICAgICAgIElmIGtleSBpcyB1bmtub3duIG9yIHJlZHVuZGFudCwgSW52YWxpZFBhcmFtZXRlcgorIworIyBTaW5jZTogMS4zLjAKKyMKKyMjCit7ICdjb21tYW5kJzogJ3NlbmQta2V5JywKKyAgJ2RhdGEnOiB7ICdrZXlzJzogWydLZXlWYWx1ZSddLCAnKmhvbGQtdGltZSc6ICdpbnQnIH0gfQorCisjIworIyBAc2NyZWVuZHVtcDoKKyMKKyMgV3JpdGUgYSBQUE0gb2YgdGhlIFZHQSBzY3JlZW4gdG8gYSBmaWxlLgorIworIyBAZmlsZW5hbWU6IHRoZSBwYXRoIG9mIGEgbmV3IFBQTSBmaWxlIHRvIHN0b3JlIHRoZSBpbWFnZQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDAuMTQuMAorIyMKK3sgJ2NvbW1hbmQnOiAnc2NyZWVuZHVtcCcsICdkYXRhJzogeydmaWxlbmFtZSc6ICdzdHInfSB9CisKKyMjCisjIEBuYmQtc2VydmVyLXN0YXJ0OgorIworIyBTdGFydCBhbiBOQkQgc2VydmVyIGxpc3RlbmluZyBvbiB0aGUgZ2l2ZW4gaG9zdCBhbmQgcG9ydC4gIEJsb2NrCisjIGRldmljZXMgY2FuIHRoZW4gYmUgZXhwb3J0ZWQgdXNpbmcgQG5iZC1zZXJ2ZXItYWRkLiAgVGhlIE5CRAorIyBzZXJ2ZXIgd2lsbCBwcmVzZW50IHRoZW0gYXMgbmFtZWQgZXhwb3J0czsgZm9yIGV4YW1wbGUsIGFub3RoZXIKKyMgUUVNVSBpbnN0YW5jZSBjb3VsZCByZWZlciB0byB0aGVtIGFzICJuYmQ6SE9TVDpQT1JUOmV4cG9ydG5hbWU9TkFNRSIuCisjCisjIEBhZGRyOiBBZGRyZXNzIG9uIHdoaWNoIHRvIGxpc3Rlbi4KKyMKKyMgUmV0dXJuczogZXJyb3IgaWYgdGhlIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcuCisjCisjIFNpbmNlOiAxLjMuMAorIyMKK3sgJ2NvbW1hbmQnOiAnbmJkLXNlcnZlci1zdGFydCcsCisgICdkYXRhJzogeyAnYWRkcic6ICdTb2NrZXRBZGRyZXNzJyB9IH0KKworIyMKKyMgQG5iZC1zZXJ2ZXItYWRkOgorIworIyBFeHBvcnQgYSBkZXZpY2UgdG8gUUVNVSdzIGVtYmVkZGVkIE5CRCBzZXJ2ZXIuCisjCisjIEBkZXZpY2U6IEJsb2NrIGRldmljZSB0byBiZSBleHBvcnRlZAorIworIyBAd3JpdGFibGU6IFdoZXRoZXIgY2xpZW50cyBzaG91bGQgYmUgYWJsZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlIHZpYSB0aGUKKyMgICAgIE5CRCBjb25uZWN0aW9uIChkZWZhdWx0IGZhbHNlKS4gI29wdGlvbmFsCisjCisjIFJldHVybnM6IGVycm9yIGlmIHRoZSBkZXZpY2UgaXMgYWxyZWFkeSBtYXJrZWQgZm9yIGV4cG9ydC4KKyMKKyMgU2luY2U6IDEuMy4wCisjIworeyAnY29tbWFuZCc6ICduYmQtc2VydmVyLWFkZCcsICdkYXRhJzogeydkZXZpY2UnOiAnc3RyJywgJyp3cml0YWJsZSc6ICdib29sJ30gfQorCisjIworIyBAbmJkLXNlcnZlci1zdG9wOgorIworIyBTdG9wIFFFTVUncyBlbWJlZGRlZCBOQkQgc2VydmVyLCBhbmQgdW5yZWdpc3RlciBhbGwgZGV2aWNlcyBwcmV2aW91c2x5CisjIGFkZGVkIHZpYSBAbmJkLXNlcnZlci1hZGQuCisjCisjIFNpbmNlOiAxLjMuMAorIyMKK3sgJ2NvbW1hbmQnOiAnbmJkLXNlcnZlci1zdG9wJyB9CisKKyMjCisjIEBDaGFyZGV2RmlsZToKKyMKKyMgQ29uZmlndXJhdGlvbiBpbmZvIGZvciBmaWxlIGNoYXJkZXZzLgorIworIyBAaW46ICAjb3B0aW9uYWwgVGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUKKyMgQG91dDogVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlCisjCisjIFNpbmNlOiAxLjQKKyMjCit7ICd0eXBlJzogJ0NoYXJkZXZGaWxlJywgJ2RhdGEnOiB7ICcqaW4nIDogJ3N0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdXQnIDogJ3N0cicgfSB9CisKKyMjCisjIEBDaGFyZGV2SG9zdGRldjoKKyMKKyMgQ29uZmlndXJhdGlvbiBpbmZvIGZvciBkZXZpY2UgYW5kIHBpcGUgY2hhcmRldnMuCisjCisjIEBkZXZpY2U6IFRoZSBuYW1lIG9mIHRoZSBzcGVjaWFsIGZpbGUgZm9yIHRoZSBkZXZpY2UsCisjICAgICAgICAgIGkuZS4gL2Rldi90dHlTMCBvbiBVbml4IG9yIENPTTE6IG9uIFdpbmRvd3MKKyMgQHR5cGU6IFdoYXQga2luZCBvZiBkZXZpY2UgdGhpcyBpcy4KKyMKKyMgU2luY2U6IDEuNAorIyMKK3sgJ3R5cGUnOiAnQ2hhcmRldkhvc3RkZXYnLCAnZGF0YSc6IHsgJ2RldmljZScgOiAnc3RyJyB9IH0KKworIyMKKyMgQENoYXJkZXZTb2NrZXQ6CisjCisjIENvbmZpZ3VyYXRpb24gaW5mbyBmb3IgKHN0cmVhbSkgc29ja2V0IGNoYXJkZXZzLgorIworIyBAYWRkcjogc29ja2V0IGFkZHJlc3MgdG8gbGlzdGVuIG9uIChzZXJ2ZXI9dHJ1ZSkKKyMgICAgICAgIG9yIGNvbm5lY3QgdG8gKHNlcnZlcj1mYWxzZSkKKyMgQHNlcnZlcjogI29wdGlvbmFsIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IChkZWZhdWx0OiB0cnVlKQorIyBAd2FpdDogI29wdGlvbmFsIHdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb24gb24gc2VydmVyCisjICAgICAgICBzb2NrZXRzIChkZWZhdWx0OiBmYWxzZSkuCisjIEBub2RlbGF5OiAjb3B0aW9uYWwgc2V0IFRDUF9OT0RFTEFZIHNvY2tldCBvcHRpb24gKGRlZmF1bHQ6IGZhbHNlKQorIyBAdGVsbmV0OiAjb3B0aW9uYWwgZW5hYmxlIHRlbG5ldCBwcm90b2NvbCBvbiBzZXJ2ZXIKKyMgICAgICAgICAgc29ja2V0cyAoZGVmYXVsdDogZmFsc2UpCisjCisjIFNpbmNlOiAxLjQKKyMjCit7ICd0eXBlJzogJ0NoYXJkZXZTb2NrZXQnLCAnZGF0YSc6IHsgJ2FkZHInICAgICA6ICdTb2NrZXRBZGRyZXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnNlcnZlcicgIDogJ2Jvb2wnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqd2FpdCcgICAgOiAnYm9vbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypub2RlbGF5JyA6ICdib29sJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKnRlbG5ldCcgIDogJ2Jvb2wnIH0gfQorCisjIworIyBAQ2hhcmRldlVkcDoKKyMKKyMgQ29uZmlndXJhdGlvbiBpbmZvIGZvciBkYXRhZ3JhbSBzb2NrZXQgY2hhcmRldnMuCisjCisjIEByZW1vdGU6IHJlbW90ZSBhZGRyZXNzCisjIEBsb2NhbDogI29wdGlvbmFsIGxvY2FsIGFkZHJlc3MKKyMKKyMgU2luY2U6IDEuNQorIyMKK3sgJ3R5cGUnOiAnQ2hhcmRldlVkcCcsICdkYXRhJzogeyAncmVtb3RlJyA6ICdTb2NrZXRBZGRyZXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKmxvY2FsJyA6ICdTb2NrZXRBZGRyZXNzJyB9IH0KKworIyMKKyMgQENoYXJkZXZNdXg6CisjCisjIENvbmZpZ3VyYXRpb24gaW5mbyBmb3IgbXV4IGNoYXJkZXZzLgorIworIyBAY2hhcmRldjogbmFtZSBvZiB0aGUgYmFzZSBjaGFyZGV2LgorIworIyBTaW5jZTogMS41CisjIworeyAndHlwZSc6ICdDaGFyZGV2TXV4JywgJ2RhdGEnOiB7ICdjaGFyZGV2JyA6ICdzdHInIH0gfQorCisjIworIyBAQ2hhcmRldlN0ZGlvOgorIworIyBDb25maWd1cmF0aW9uIGluZm8gZm9yIHN0ZGlvIGNoYXJkZXZzLgorIworIyBAc2lnbmFsOiAjb3B0aW9uYWwgQWxsb3cgc2lnbmFscyAoc3VjaCBhcyBTSUdJTlQgdHJpZ2dlcmVkIGJ5IF5DKQorIyAgICAgICAgICBiZSBkZWxpdmVyZWQgdG8gcWVtdS4gIERlZmF1bHQ6IHRydWUgaW4gLW5vZ3JhcGhpYyBtb2RlLAorIyAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICd0eXBlJzogJ0NoYXJkZXZTdGRpbycsICdkYXRhJzogeyAnKnNpZ25hbCcgOiAnYm9vbCcgfSB9CisKKyMjCisjIEBDaGFyZGV2U3BpY2VDaGFubmVsOgorIworIyBDb25maWd1cmF0aW9uIGluZm8gZm9yIHNwaWNlIHZtIGNoYW5uZWwgY2hhcmRldnMuCisjCisjIEB0eXBlOiBraW5kIG9mIGNoYW5uZWwgKGZvciBleGFtcGxlIHZkYWdlbnQpLgorIworIyBTaW5jZTogMS41CisjIworeyAndHlwZSc6ICdDaGFyZGV2U3BpY2VDaGFubmVsJywgJ2RhdGEnOiB7ICd0eXBlJyAgOiAnc3RyJyB9IH0KKworIyMKKyMgQENoYXJkZXZTcGljZVBvcnQ6CisjCisjIENvbmZpZ3VyYXRpb24gaW5mbyBmb3Igc3BpY2UgcG9ydCBjaGFyZGV2cy4KKyMKKyMgQGZxZG46IG5hbWUgb2YgdGhlIGNoYW5uZWwgKHNlZSBkb2NzL3NwaWNlLXBvcnQtZnFkbi50eHQpCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICd0eXBlJzogJ0NoYXJkZXZTcGljZVBvcnQnLCAnZGF0YSc6IHsgJ2ZxZG4nICA6ICdzdHInIH0gfQorCisjIworIyBAQ2hhcmRldlZDOgorIworIyBDb25maWd1cmF0aW9uIGluZm8gZm9yIHZpcnR1YWwgY29uc29sZSBjaGFyZGV2cy4KKyMKKyMgQHdpZHRoOiAgY29uc29sZSB3aWR0aCwgIGluIHBpeGVscworIyBAaGVpZ2h0OiBjb25zb2xlIGhlaWdodCwgaW4gcGl4ZWxzCisjIEBjb2xzOiAgIGNvbnNvbGUgd2lkdGgsICBpbiBjaGFycworIyBAcm93czogICBjb25zb2xlIGhlaWdodCwgaW4gY2hhcnMKKyMKKyMgU2luY2U6IDEuNQorIyMKK3sgJ3R5cGUnOiAnQ2hhcmRldlZDJywgJ2RhdGEnOiB7ICcqd2lkdGgnICA6ICdpbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJypoZWlnaHQnIDogJ2ludCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKmNvbHMnICAgOiAnaW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqcm93cycgICA6ICdpbnQnIH0gfQorCisjIworIyBAQ2hhcmRldlJpbmdidWY6CisjCisjIENvbmZpZ3VyYXRpb24gaW5mbyBmb3IgcmluZyBidWZmZXIgY2hhcmRldnMuCisjCisjIEBzaXplOiAjb3B0aW9uYWwgcmluZyBidWZmZXIgc2l6ZSwgbXVzdCBiZSBwb3dlciBvZiB0d28sIGRlZmF1bHQgaXMgNjU1MzYKKyMKKyMgU2luY2U6IDEuNQorIyMKK3sgJ3R5cGUnOiAnQ2hhcmRldlJpbmdidWYnLCAnZGF0YSc6IHsgJypzaXplJyAgOiAnaW50JyB9IH0KKworIyMKKyMgQENoYXJkZXZCYWNrZW5kOgorIworIyBDb25maWd1cmF0aW9uIGluZm8gZm9yIHRoZSBuZXcgY2hhcmRldiBiYWNrZW5kLgorIworIyBTaW5jZTogMS40CisjIworeyAndHlwZSc6ICdDaGFyZGV2RHVtbXknLCAnZGF0YSc6IHsgfSB9CisKK3sgJ3VuaW9uJzogJ0NoYXJkZXZCYWNrZW5kJywgJ2RhdGEnOiB7ICdmaWxlJyAgIDogJ0NoYXJkZXZGaWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJpYWwnIDogJ0NoYXJkZXZIb3N0ZGV2JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbGxlbCc6ICdDaGFyZGV2SG9zdGRldicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGlwZScgICA6ICdDaGFyZGV2SG9zdGRldicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0JyA6ICdDaGFyZGV2U29ja2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1ZHAnICAgIDogJ0NoYXJkZXZVZHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0eScgICAgOiAnQ2hhcmRldkR1bW15JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudWxsJyAgIDogJ0NoYXJkZXZEdW1teScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXV4JyAgICA6ICdDaGFyZGV2TXV4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtc21vdXNlJzogJ0NoYXJkZXZEdW1teScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJhaWxsZSc6ICdDaGFyZGV2RHVtbXknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0ZGlvJyAgOiAnQ2hhcmRldlN0ZGlvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zb2xlJzogJ0NoYXJkZXZEdW1teScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BpY2V2bWMnIDogJ0NoYXJkZXZTcGljZUNoYW5uZWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwaWNlcG9ydCcgOiAnQ2hhcmRldlNwaWNlUG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmMnICAgICA6ICdDaGFyZGV2VkMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmdidWYnOiAnQ2hhcmRldlJpbmdidWYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXh0IG9uZSBpcyBqdXN0IGZvciBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtb3J5JyA6ICdDaGFyZGV2UmluZ2J1ZicgfSB9CisKKyMjCisjIEBDaGFyZGV2UmV0dXJuOgorIworIyBSZXR1cm4gaW5mbyBhYm91dCB0aGUgY2hhcmRldiBiYWNrZW5kIGp1c3QgY3JlYXRlZC4KKyMKKyMgQHB0eTogI29wdGlvbmFsIG5hbWUgb2YgdGhlIHNsYXZlIHBzZXVkb3Rlcm1pbmFsIGRldmljZSwgcHJlc2VudCBpZgorIyAgICAgICBhbmQgb25seSBpZiBhIGNoYXJkZXYgb2YgdHlwZSAncHR5JyB3YXMgY3JlYXRlZAorIworIyBTaW5jZTogMS40CisjIworeyAndHlwZScgOiAnQ2hhcmRldlJldHVybicsICdkYXRhJzogeyAnKnB0eScgOiAnc3RyJyB9IH0KKworIyMKKyMgQGNoYXJkZXYtYWRkOgorIworIyBBZGQgYSBjaGFyYWN0ZXIgZGV2aWNlIGJhY2tlbmQKKyMKKyMgQGlkOiB0aGUgY2hhcmRldidzIElELCBtdXN0IGJlIHVuaXF1ZQorIyBAYmFja2VuZDogYmFja2VuZCB0eXBlIGFuZCBwYXJhbWV0ZXJzCisjCisjIFJldHVybnM6IENoYXJkZXZSZXR1cm4uCisjCisjIFNpbmNlOiAxLjQKKyMjCit7ICdjb21tYW5kJzogJ2NoYXJkZXYtYWRkJywgJ2RhdGEnOiB7J2lkJyAgICAgIDogJ3N0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tlbmQnIDogJ0NoYXJkZXZCYWNrZW5kJyB9LAorICAncmV0dXJucyc6ICdDaGFyZGV2UmV0dXJuJyB9CisKKyMjCisjIEBjaGFyZGV2LXJlbW92ZToKKyMKKyMgUmVtb3ZlIGEgY2hhcmFjdGVyIGRldmljZSBiYWNrZW5kCisjCisjIEBpZDogdGhlIGNoYXJkZXYncyBJRCwgbXVzdCBleGlzdCBhbmQgbm90IGJlIGluIHVzZQorIworIyBSZXR1cm5zOiBOb3RoaW5nIG9uIHN1Y2Nlc3MKKyMKKyMgU2luY2U6IDEuNAorIyMKK3sgJ2NvbW1hbmQnOiAnY2hhcmRldi1yZW1vdmUnLCAnZGF0YSc6IHsnaWQnOiAnc3RyJ30gfQorCisjIworIyBAVHBtTW9kZWw6CisjCisjIEFuIGVudW1lcmF0aW9uIG9mIFRQTSBtb2RlbHMKKyMKKyMgQHRwbS10aXM6IFRQTSBUSVMgbW9kZWwKKyMKKyMgU2luY2U6IDEuNQorIyMKK3sgJ2VudW0nOiAnVHBtTW9kZWwnLCAnZGF0YSc6IFsgJ3RwbS10aXMnIF0gfQorCisjIworIyBAcXVlcnktdHBtLW1vZGVsczoKKyMKKyMgUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgVFBNIG1vZGVscworIworIyBSZXR1cm5zOiBhIGxpc3Qgb2YgVHBtTW9kZWwKKyMKKyMgU2luY2U6IDEuNQorIyMKK3sgJ2NvbW1hbmQnOiAncXVlcnktdHBtLW1vZGVscycsICdyZXR1cm5zJzogWydUcG1Nb2RlbCddIH0KKworIyMKKyMgQFRwbVR5cGU6CisjCisjIEFuIGVudW1lcmF0aW9uIG9mIFRQTSB0eXBlcworIworIyBAcGFzc3Rocm91Z2g6IFRQTSBwYXNzdGhyb3VnaCB0eXBlCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICdlbnVtJzogJ1RwbVR5cGUnLCAnZGF0YSc6IFsgJ3Bhc3N0aHJvdWdoJyBdIH0KKworIyMKKyMgQHF1ZXJ5LXRwbS10eXBlczoKKyMKKyMgUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgVFBNIHR5cGVzCisjCisjIFJldHVybnM6IGEgbGlzdCBvZiBUcG1UeXBlCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LXRwbS10eXBlcycsICdyZXR1cm5zJzogWydUcG1UeXBlJ10gfQorCisjIworIyBAVFBNUGFzc3Rocm91Z2hPcHRpb25zOgorIworIyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgVFBNIHBhc3N0aHJvdWdoIHR5cGUKKyMKKyMgQHBhdGg6ICNvcHRpb25hbCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcGF0aCB1c2VkIGZvciBhY2Nlc3NpbmcgdGhlIFRQTSBkZXZpY2UKKyMKKyMgQGNhbmNlbC1wYXRoOiAjb3B0aW9uYWwgc3RyaW5nIHNob3dpbmcgdGhlIFRQTSdzIHN5c2ZzIGNhbmNlbCBmaWxlCisjICAgICAgICAgICAgICAgZm9yIGNhbmNlbGxhdGlvbiBvZiBUUE0gY29tbWFuZHMgd2hpbGUgdGhleSBhcmUgZXhlY3V0aW5nCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICd0eXBlJzogJ1RQTVBhc3N0aHJvdWdoT3B0aW9ucycsICdkYXRhJzogeyAnKnBhdGgnIDogJ3N0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKmNhbmNlbC1wYXRoJyA6ICdzdHInfSB9CisKKyMjCisjIEBUcG1UeXBlT3B0aW9uczoKKyMKKyMgQSB1bmlvbiByZWZlcmVuY2luZyBkaWZmZXJlbnQgVFBNIGJhY2tlbmQgdHlwZXMnIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIworIyBAcGFzc3Rocm91Z2g6IFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBUUE0gcGFzc3Rocm91Z2ggdHlwZQorIworIyBTaW5jZTogMS41CisjIworeyAndW5pb24nOiAnVHBtVHlwZU9wdGlvbnMnLAorICAgJ2RhdGEnOiB7ICdwYXNzdGhyb3VnaCcgOiAnVFBNUGFzc3Rocm91Z2hPcHRpb25zJyB9IH0KKworIyMKKyMgQFRwbUluZm86CisjCisjIEluZm9ybWF0aW9uIGFib3V0IHRoZSBUUE0KKyMKKyMgQGlkOiBUaGUgSWQgb2YgdGhlIFRQTQorIworIyBAbW9kZWw6IFRoZSBUUE0gZnJvbnRlbmQgbW9kZWwKKyMKKyMgQG9wdGlvbnM6IFRoZSBUUE0gKGJhY2tlbmQpIHR5cGUgY29uZmlndXJhdGlvbiBvcHRpb25zCisjCisjIFNpbmNlOiAxLjUKKyMjCit7ICd0eXBlJzogJ1RQTUluZm8nLAorICAnZGF0YSc6IHsnaWQnOiAnc3RyJywKKyAgICAgICAgICAgJ21vZGVsJzogJ1RwbU1vZGVsJywKKyAgICAgICAgICAgJ29wdGlvbnMnOiAnVHBtVHlwZU9wdGlvbnMnIH0gfQorCisjIworIyBAcXVlcnktdHBtOgorIworIyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRQTSBkZXZpY2UKKyMKKyMgUmV0dXJuczogQFRQTUluZm8gb24gc3VjY2VzcworIworIyBTaW5jZTogMS41CisjIworeyAnY29tbWFuZCc6ICdxdWVyeS10cG0nLCAncmV0dXJucyc6IFsnVFBNSW5mbyddIH0KKworIyMKKyMgQEFjcGlUYWJsZU9wdGlvbnMKKyMKKyMgU3BlY2lmeSBhbiBBQ1BJIHRhYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gbG9hZC4KKyMKKyMgQXQgbW9zdCBvbmUgb2YgQGZpbGUgYW5kIEBkYXRhIGNhbiBiZSBzcGVjaWZpZWQuIFRoZSBsaXN0IG9mIGZpbGVzIHNwZWNpZmllZAorIyBieSBhbnkgb25lIG9mIHRoZW0gaXMgbG9hZGVkIGFuZCBjb25jYXRlbmF0ZWQgaW4gb3JkZXIuIElmIGJvdGggYXJlIG9taXR0ZWQsCisjIEBkYXRhIGlzIGltcGxpZWQuCisjCisjIE90aGVyIGZpZWxkcyAvIG9wdGFyZ3MgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgZmllbGRzIG9mIHRoZSBnZW5lcmljIEFDUEkKKyMgdGFibGUgaGVhZGVyOyByZWZlciB0byB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIDUuMCwgc2VjdGlvbiA1LjIuNiBTeXN0ZW0KKyMgRGVzY3JpcHRpb24gVGFibGUgSGVhZGVyLiBJZiBhIGhlYWRlciBmaWVsZCBpcyBub3Qgb3ZlcnJpZGRlbiwgdGhlbiB0aGUKKyMgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIHRoZSBjb25jYXRlbmF0ZWQgYmxvYiBpcyB1c2VkIChpbiBjYXNlIG9mIEBmaWxlKSwgb3IKKyMgaXQgaXMgZmlsbGVkIGluIHdpdGggYSBoYXJkLWNvZGVkIHZhbHVlIChpbiBjYXNlIG9mIEBkYXRhKS4KKyMKKyMgU3RyaW5nIGZpZWxkcyBhcmUgY29waWVkIGludG8gdGhlIG1hdGNoaW5nIEFDUEkgbWVtYmVyIGZyb20gbG93ZXN0IGFkZHJlc3MKKyMgdXB3YXJkcywgYW5kIHNpbGVudGx5IHRydW5jYXRlZCAvIE5VTC1wYWRkZWQgdG8gbGVuZ3RoLgorIworIyBAc2lnOiAjb3B0aW9uYWwgdGFibGUgc2lnbmF0dXJlIC8gaWRlbnRpZmllciAoNCBieXRlcykKKyMKKyMgQHJldjogI29wdGlvbmFsIHRhYmxlIHJldmlzaW9uIG51bWJlciAoZGVwZW5kZW50IG9uIHNpZ25hdHVyZSwgMSBieXRlKQorIworIyBAb2VtX2lkOiAjb3B0aW9uYWwgT0VNIGlkZW50aWZpZXIgKDYgYnl0ZXMpCisjCisjIEBvZW1fdGFibGVfaWQ6ICNvcHRpb25hbCBPRU0gdGFibGUgaWRlbnRpZmllciAoOCBieXRlcykKKyMKKyMgQG9lbV9yZXY6ICNvcHRpb25hbCBPRU0tc3VwcGxpZWQgcmV2aXNpb24gbnVtYmVyICg0IGJ5dGVzKQorIworIyBAYXNsX2NvbXBpbGVyX2lkOiAjb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgdXRpbGl0eSB0aGF0IGNyZWF0ZWQgdGhlIHRhYmxlCisjICAgICAgICAgICAgICAgICAgICg0IGJ5dGVzKQorIworIyBAYXNsX2NvbXBpbGVyX3JldjogI29wdGlvbmFsIHJldmlzaW9uIG51bWJlciBvZiB0aGUgdXRpbGl0eSB0aGF0IGNyZWF0ZWQgdGhlCisjICAgICAgICAgICAgICAgICAgICB0YWJsZSAoNCBieXRlcykKKyMKKyMgQGZpbGU6ICNvcHRpb25hbCBjb2xvbiAoOikgc2VwYXJhdGVkIGxpc3Qgb2YgcGF0aG5hbWVzIHRvIGxvYWQgYW5kCisjICAgICAgICBjb25jYXRlbmF0ZSBhcyB0YWJsZSBkYXRhLiBUaGUgcmVzdWx0YW50IGJpbmFyeSBibG9iIGlzIGV4cGVjdGVkIHRvCisjICAgICAgICBoYXZlIGFuIEFDUEkgdGFibGUgaGVhZGVyLiBBdCBsZWFzdCBvbmUgZmlsZSBpcyByZXF1aXJlZC4gVGhpcyBmaWVsZAorIyAgICAgICAgZXhjbHVkZXMgQGRhdGEuCisjCisjIEBkYXRhOiAjb3B0aW9uYWwgY29sb24gKDopIHNlcGFyYXRlZCBsaXN0IG9mIHBhdGhuYW1lcyB0byBsb2FkIGFuZAorIyAgICAgICAgY29uY2F0ZW5hdGUgYXMgdGFibGUgZGF0YS4gVGhlIHJlc3VsdGFudCBiaW5hcnkgYmxvYiBtdXN0IG5vdCBoYXZlIGFuCisjICAgICAgICBBQ1BJIHRhYmxlIGhlYWRlci4gQXQgbGVhc3Qgb25lIGZpbGUgaXMgcmVxdWlyZWQuIFRoaXMgZmllbGQgZXhjbHVkZXMKKyMgICAgICAgIEBmaWxlLgorIworIyBTaW5jZSAxLjUKKyMjCit7ICd0eXBlJzogJ0FjcGlUYWJsZU9wdGlvbnMnLAorICAnZGF0YSc6IHsKKyAgICAnKnNpZyc6ICAgICAgICAgICAgICAgJ3N0cicsCisgICAgJypyZXYnOiAgICAgICAgICAgICAgICd1aW50OCcsCisgICAgJypvZW1faWQnOiAgICAgICAgICAgICdzdHInLAorICAgICcqb2VtX3RhYmxlX2lkJzogICAgICAnc3RyJywKKyAgICAnKm9lbV9yZXYnOiAgICAgICAgICAgJ3VpbnQzMicsCisgICAgJyphc2xfY29tcGlsZXJfaWQnOiAgICdzdHInLAorICAgICcqYXNsX2NvbXBpbGVyX3Jldic6ICAndWludDMyJywKKyAgICAnKmZpbGUnOiAgICAgICAgICAgICAgJ3N0cicsCisgICAgJypkYXRhJzogICAgICAgICAgICAgICdzdHInIH19CisKKyMjCisjIEBDb21tYW5kTGluZVBhcmFtZXRlclR5cGU6CisjCisjIFBvc3NpYmxlIHR5cGVzIGZvciBhbiBvcHRpb24gcGFyYW1ldGVyLgorIworIyBAc3RyaW5nOiBhY2NlcHRzIGEgY2hhcmFjdGVyIHN0cmluZworIworIyBAYm9vbGVhbjogYWNjZXB0cyAib24iIG9yICJvZmYiCisjCisjIEBudW1iZXI6IGFjY2VwdHMgYSBudW1iZXIKKyMKKyMgQHNpemU6IGFjY2VwdHMgYSBudW1iZXIgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgc3VmZml4IChLKWlsbywKKyMgICAgICAgIChNKWVnYSwgKEcpaWdhLCAoVCllcmEKKyMKKyMgU2luY2UgMS41CisjIworeyAnZW51bSc6ICdDb21tYW5kTGluZVBhcmFtZXRlclR5cGUnLAorICAnZGF0YSc6IFsnc3RyaW5nJywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3NpemUnXSB9CisKKyMjCisjIEBDb21tYW5kTGluZVBhcmFtZXRlckluZm86CisjCisjIERldGFpbHMgYWJvdXQgYSBzaW5nbGUgcGFyYW1ldGVyIG9mIGEgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyMKKyMgQG5hbWU6IHBhcmFtZXRlciBuYW1lCisjCisjIEB0eXBlOiBwYXJhbWV0ZXIgQENvbW1hbmRMaW5lUGFyYW1ldGVyVHlwZQorIworIyBAaGVscDogI29wdGlvbmFsIGh1bWFuIHJlYWRhYmxlIHRleHQgc3RyaW5nLCBub3Qgc3VpdGFibGUgZm9yIHBhcnNpbmcuCisjCisjIFNpbmNlIDEuNQorIyMKK3sgJ3R5cGUnOiAnQ29tbWFuZExpbmVQYXJhbWV0ZXJJbmZvJywKKyAgJ2RhdGEnOiB7ICduYW1lJzogJ3N0cicsCisgICAgICAgICAgICAndHlwZSc6ICdDb21tYW5kTGluZVBhcmFtZXRlclR5cGUnLAorICAgICAgICAgICAgJypoZWxwJzogJ3N0cicgfSB9CisKKyMjCisjIEBDb21tYW5kTGluZU9wdGlvbkluZm86CisjCisjIERldGFpbHMgYWJvdXQgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBpbmNsdWRpbmcgaXRzIGxpc3Qgb2YgcGFyYW1ldGVyIGRldGFpbHMKKyMKKyMgQG9wdGlvbjogb3B0aW9uIG5hbWUKKyMKKyMgQHBhcmFtZXRlcnM6IGFuIGFycmF5IG9mIEBDb21tYW5kTGluZVBhcmFtZXRlckluZm8KKyMKKyMgU2luY2UgMS41CisjIworeyAndHlwZSc6ICdDb21tYW5kTGluZU9wdGlvbkluZm8nLAorICAnZGF0YSc6IHsgJ29wdGlvbic6ICdzdHInLCAncGFyYW1ldGVycyc6IFsnQ29tbWFuZExpbmVQYXJhbWV0ZXJJbmZvJ10gfSB9CisKKyMjCisjIEBxdWVyeS1jb21tYW5kLWxpbmUtb3B0aW9uczoKKyMKKyMgUXVlcnkgY29tbWFuZCBsaW5lIG9wdGlvbiBzY2hlbWEuCisjCisjIEBvcHRpb246ICNvcHRpb25hbCBvcHRpb24gbmFtZQorIworIyBSZXR1cm5zOiBsaXN0IG9mIEBDb21tYW5kTGluZU9wdGlvbkluZm8gZm9yIGFsbCBvcHRpb25zIChvciBmb3IgdGhlIGdpdmVuCisjICAgICAgICAgIEBvcHRpb24pLiAgUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgZ2l2ZW4gQG9wdGlvbiBkb2Vzbid0IGV4aXN0LgorIworIyBTaW5jZSAxLjUKKyMjCit7J2NvbW1hbmQnOiAncXVlcnktY29tbWFuZC1saW5lLW9wdGlvbnMnLCAnZGF0YSc6IHsgJypvcHRpb24nOiAnc3RyJyB9LAorICdyZXR1cm5zJzogWydDb21tYW5kTGluZU9wdGlvbkluZm8nXSB9CisKKyMjCisjIEBYODZDUFVSZWdpc3RlcjMyCisjCisjIEEgWDg2IDMyLWJpdCByZWdpc3RlcgorIworIyBTaW5jZTogMS41CisjIworeyAnZW51bSc6ICdYODZDUFVSZWdpc3RlcjMyJywKKyAgJ2RhdGEnOiBbICdFQVgnLCAnRUJYJywgJ0VDWCcsICdFRFgnLCAnRVNQJywgJ0VCUCcsICdFU0knLCAnRURJJyBdIH0KKworIyMKKyMgQFg4NkNQVUZlYXR1cmVXb3JkSW5mbworIworIyBJbmZvcm1hdGlvbiBhYm91dCBhIFg4NiBDUFUgZmVhdHVyZSB3b3JkCisjCisjIEBjcHVpZC1pbnB1dC1lYXg6IElucHV0IEVBWCB2YWx1ZSBmb3IgQ1BVSUQgaW5zdHJ1Y3Rpb24gZm9yIHRoYXQgZmVhdHVyZSB3b3JkCisjCisjIEBjcHVpZC1pbnB1dC1lY3g6ICNvcHRpb25hbCBJbnB1dCBFQ1ggdmFsdWUgZm9yIENQVUlEIGluc3RydWN0aW9uIGZvciB0aGF0CisjICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgd29yZAorIworIyBAY3B1aWQtcmVnaXN0ZXI6IE91dHB1dCByZWdpc3RlciBjb250YWluaW5nIHRoZSBmZWF0dXJlIGJpdHMKKyMKKyMgQGZlYXR1cmVzOiB2YWx1ZSBvZiBvdXRwdXQgcmVnaXN0ZXIsIGNvbnRhaW5pbmcgdGhlIGZlYXR1cmUgYml0cworIworIyBTaW5jZTogMS41CisjIworeyAndHlwZSc6ICdYODZDUFVGZWF0dXJlV29yZEluZm8nLAorICAnZGF0YSc6IHsgJ2NwdWlkLWlucHV0LWVheCc6ICdpbnQnLAorICAgICAgICAgICAgJypjcHVpZC1pbnB1dC1lY3gnOiAnaW50JywKKyAgICAgICAgICAgICdjcHVpZC1yZWdpc3Rlcic6ICdYODZDUFVSZWdpc3RlcjMyJywKKyAgICAgICAgICAgICdmZWF0dXJlcyc6ICdpbnQnIH0gfQorCisjIworIyBAUnhTdGF0ZToKKyMKKyMgUGFja2V0cyByZWNlaXZpbmcgc3RhdGUKKyMKKyMgQG5vcm1hbDogZmlsdGVyIGFzc2lnbmVkIHBhY2tldHMgYWNjb3JkaW5nIHRvIHRoZSBtYWMtdGFibGUKKyMKKyMgQG5vbmU6IGRvbid0IHJlY2VpdmUgYW55IGFzc2lnbmVkIHBhY2tldAorIworIyBAYWxsOiByZWNlaXZlIGFsbCBhc3NpZ25lZCBwYWNrZXRzCisjCisjIFNpbmNlOiAxLjYKKyMjCit7ICdlbnVtJzogJ1J4U3RhdGUnLCAnZGF0YSc6IFsgJ25vcm1hbCcsICdub25lJywgJ2FsbCcgXSB9CisKKyMjCisjIEBSeEZpbHRlckluZm86CisjCisjIFJ4LWZpbHRlciBpbmZvcm1hdGlvbiBmb3IgYSBOSUMuCisjCisjIEBuYW1lOiBuZXQgY2xpZW50IG5hbWUKKyMKKyMgQHByb21pc2N1b3VzOiB3aGV0aGVyIHByb21pc2N1b3VzIG1vZGUgaXMgZW5hYmxlZAorIworIyBAbXVsdGljYXN0OiBtdWx0aWNhc3QgcmVjZWl2ZSBzdGF0ZQorIworIyBAdW5pY2FzdDogdW5pY2FzdCByZWNlaXZlIHN0YXRlCisjCisjIEBicm9hZGNhc3QtYWxsb3dlZDogd2hldGhlciB0byByZWNlaXZlIGJyb2FkY2FzdAorIworIyBAbXVsdGljYXN0LW92ZXJmbG93OiBtdWx0aWNhc3QgdGFibGUgaXMgb3ZlcmZsb3dlZCBvciBub3QKKyMKKyMgQHVuaWNhc3Qtb3ZlcmZsb3c6IHVuaWNhc3QgdGFibGUgaXMgb3ZlcmZsb3dlZCBvciBub3QKKyMKKyMgQG1haW4tbWFjOiB0aGUgbWFpbiBtYWNhZGRyIHN0cmluZworIworIyBAdmxhbi10YWJsZTogYSBsaXN0IG9mIGFjdGl2ZSB2bGFuIGlkCisjCisjIEB1bmljYXN0LXRhYmxlOiBhIGxpc3Qgb2YgdW5pY2FzdCBtYWNhZGRyIHN0cmluZworIworIyBAbXVsdGljYXN0LXRhYmxlOiBhIGxpc3Qgb2YgbXVsdGljYXN0IG1hY2FkZHIgc3RyaW5nCisjCisjIFNpbmNlIDEuNgorIyMKKworeyAndHlwZSc6ICdSeEZpbHRlckluZm8nLAorICAnZGF0YSc6IHsKKyAgICAnbmFtZSc6ICAgICAgICAgICAgICAgJ3N0cicsCisgICAgJ3Byb21pc2N1b3VzJzogICAgICAgICdib29sJywKKyAgICAnbXVsdGljYXN0JzogICAgICAgICAgJ1J4U3RhdGUnLAorICAgICd1bmljYXN0JzogICAgICAgICAgICAnUnhTdGF0ZScsCisgICAgJ2Jyb2FkY2FzdC1hbGxvd2VkJzogICdib29sJywKKyAgICAnbXVsdGljYXN0LW92ZXJmbG93JzogJ2Jvb2wnLAorICAgICd1bmljYXN0LW92ZXJmbG93JzogICAnYm9vbCcsCisgICAgJ21haW4tbWFjJzogICAgICAgICAgICdzdHInLAorICAgICd2bGFuLXRhYmxlJzogICAgICAgICBbJ2ludCddLAorICAgICd1bmljYXN0LXRhYmxlJzogICAgICBbJ3N0ciddLAorICAgICdtdWx0aWNhc3QtdGFibGUnOiAgICBbJ3N0ciddIH19CisKKyMjCisjIEBxdWVyeS1yeC1maWx0ZXI6CisjCisjIFJldHVybiByeC1maWx0ZXIgaW5mb3JtYXRpb24gZm9yIGFsbCBOSUNzIChvciBmb3IgdGhlIGdpdmVuIE5JQykuCisjCisjIEBuYW1lOiAjb3B0aW9uYWwgbmV0IGNsaWVudCBuYW1lCisjCisjIFJldHVybnM6IGxpc3Qgb2YgQFJ4RmlsdGVySW5mbyBmb3IgYWxsIE5JQ3MgKG9yIGZvciB0aGUgZ2l2ZW4gTklDKS4KKyMgICAgICAgICAgUmV0dXJucyBhbiBlcnJvciBpZiB0aGUgZ2l2ZW4gQG5hbWUgZG9lc24ndCBleGlzdCwgb3IgZ2l2ZW4KKyMgICAgICAgICAgTklDIGRvZXNuJ3Qgc3VwcG9ydCByeC1maWx0ZXIgcXVlcnlpbmcsIG9yIGdpdmVuIG5ldCBjbGllbnQKKyMgICAgICAgICAgaXNuJ3QgYSBOSUMuCisjCisjIFNpbmNlOiAxLjYKKyMjCit7ICdjb21tYW5kJzogJ3F1ZXJ5LXJ4LWZpbHRlcicsICdkYXRhJzogeyAnKm5hbWUnOiAnc3RyJyB9LAorICAncmV0dXJucyc6IFsnUnhGaWx0ZXJJbmZvJ10gfQorCisKKyMjCisjIEBCbG9ja2RldkRpc2NhcmRPcHRpb25zCisjCisjIERldGVybWluZXMgaG93IHRvIGhhbmRsZSBkaXNjYXJkIHJlcXVlc3RzLgorIworIyBAaWdub3JlOiAgICAgIElnbm9yZSB0aGUgcmVxdWVzdAorIyBAdW5tYXA6ICAgICAgIEZvcndhcmQgYXMgYW4gdW5tYXAgcmVxdWVzdAorIworIyBTaW5jZTogMS43CisjIworeyAnZW51bSc6ICdCbG9ja2RldkRpc2NhcmRPcHRpb25zJywKKyAgJ2RhdGEnOiBbICdpZ25vcmUnLCAndW5tYXAnIF0gfQorCisjIworIyBAQmxvY2tkZXZBaW9PcHRpb25zCisjCisjIFNlbGVjdHMgdGhlIEFJTyBiYWNrZW5kIHRvIGhhbmRsZSBJL08gcmVxdWVzdHMKKyMKKyMgQHRocmVhZHM6ICAgICBVc2UgcWVtdSdzIHRocmVhZCBwb29sCisjIEBuYXRpdmU6ICAgICAgVXNlIG5hdGl2ZSBBSU8gYmFja2VuZCAob25seSBMaW51eCBhbmQgV2luZG93cykKKyMKKyMgU2luY2U6IDEuNworIyMKK3sgJ2VudW0nOiAnQmxvY2tkZXZBaW9PcHRpb25zJywKKyAgJ2RhdGEnOiBbICd0aHJlYWRzJywgJ25hdGl2ZScgXSB9CisKKyMjCisjIEBCbG9ja2RldkNhY2hlT3B0aW9ucworIworIyBJbmNsdWRlcyBjYWNoZS1yZWxhdGVkIG9wdGlvbnMgZm9yIGJsb2NrIGRldmljZXMKKyMKKyMgQHdyaXRlYmFjazogICAjb3B0aW9uYWwgZW5hYmxlcyB3cml0ZWJhY2sgbW9kZSBmb3IgYW55IGNhY2hlcyAoZGVmYXVsdDogdHJ1ZSkKKyMgQGRpcmVjdDogICAgICAjb3B0aW9uYWwgZW5hYmxlcyB1c2Ugb2YgT19ESVJFQ1QgKGJ5cGFzcyB0aGUgaG9zdCBwYWdlIGNhY2hlOworIyAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlKQorIyBAbm8tZmx1c2g6ICAgICNvcHRpb25hbCBpZ25vcmUgYW55IGZsdXNoIHJlcXVlc3RzIGZvciB0aGUgZGV2aWNlIChkZWZhdWx0OgorIyAgICAgICAgICAgICAgIGZhbHNlKQorIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdCbG9ja2RldkNhY2hlT3B0aW9ucycsCisgICdkYXRhJzogeyAnKndyaXRlYmFjayc6ICdib29sJywKKyAgICAgICAgICAgICcqZGlyZWN0JzogJ2Jvb2wnLAorICAgICAgICAgICAgJypuby1mbHVzaCc6ICdib29sJyB9IH0KKworIyMKKyMgQEJsb2NrZGV2T3B0aW9uc0Jhc2UKKyMKKyMgT3B0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIGFsbCBibG9jayBkZXZpY2VzLCBpbmRlcGVuZGVudCBvZiB0aGUgYmxvY2sKKyMgZHJpdmVyLgorIworIyBAZHJpdmVyOiAgICAgIGJsb2NrIGRyaXZlciBuYW1lCisjIEBpZDogICAgICAgICAgI29wdGlvbmFsIGlkIGJ5IHdoaWNoIHRoZSBuZXcgYmxvY2sgZGV2aWNlIGNhbiBiZSByZWZlcnJlZCB0by4KKyMgICAgICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWlyZWQgb3B0aW9uIG9uIHRoZSB0b3AgbGV2ZWwgb2YgYmxvY2tkZXYtYWRkLCBhbmQKKyMgICAgICAgICAgICAgICBjdXJyZW50bHkgbm90IGFsbG93ZWQgb24gYW55IG90aGVyIGxldmVsLgorIyBAZGlzY2FyZDogICAgICNvcHRpb25hbCBkaXNjYXJkLXJlbGF0ZWQgb3B0aW9ucyAoZGVmYXVsdDogaWdub3JlKQorIyBAY2FjaGU6ICAgICAgICNvcHRpb25hbCBjYWNoZS1yZWxhdGVkIG9wdGlvbnMKKyMgQGFpbzogICAgICAgICAjb3B0aW9uYWwgQUlPIGJhY2tlbmQgKGRlZmF1bHQ6IHRocmVhZHMpCisjIEByZXJyb3I6ICAgICAgI29wdGlvbmFsIGhvdyB0byBoYW5kbGUgcmVhZCBlcnJvcnMgb24gdGhlIGRldmljZQorIyAgICAgICAgICAgICAgIChkZWZhdWx0OiByZXBvcnQpCisjIEB3ZXJyb3I6ICAgICAgI29wdGlvbmFsIGhvdyB0byBoYW5kbGUgd3JpdGUgZXJyb3JzIG9uIHRoZSBkZXZpY2UKKyMgICAgICAgICAgICAgICAoZGVmYXVsdDogZW5vc3BjKQorIyBAcmVhZC1vbmx5OiAgICNvcHRpb25hbCB3aGV0aGVyIHRoZSBibG9jayBkZXZpY2Ugc2hvdWxkIGJlIHJlYWQtb25seQorIyAgICAgICAgICAgICAgIChkZWZhdWx0OiBmYWxzZSkKKyMKKyMgU2luY2U6IDEuNworIyMKK3sgJ3R5cGUnOiAnQmxvY2tkZXZPcHRpb25zQmFzZScsCisgICdkYXRhJzogeyAnZHJpdmVyJzogJ3N0cicsCisgICAgICAgICAgICAnKmlkJzogJ3N0cicsCisgICAgICAgICAgICAnKmRpc2NhcmQnOiAnQmxvY2tkZXZEaXNjYXJkT3B0aW9ucycsCisgICAgICAgICAgICAnKmNhY2hlJzogJ0Jsb2NrZGV2Q2FjaGVPcHRpb25zJywKKyAgICAgICAgICAgICcqYWlvJzogJ0Jsb2NrZGV2QWlvT3B0aW9ucycsCisgICAgICAgICAgICAnKnJlcnJvcic6ICdCbG9ja2Rldk9uRXJyb3InLAorICAgICAgICAgICAgJyp3ZXJyb3InOiAnQmxvY2tkZXZPbkVycm9yJywKKyAgICAgICAgICAgICcqcmVhZC1vbmx5JzogJ2Jvb2wnIH0gfQorCisjIworIyBAQmxvY2tkZXZPcHRpb25zRmlsZQorIworIyBEcml2ZXIgc3BlY2lmaWMgYmxvY2sgZGV2aWNlIG9wdGlvbnMgZm9yIHRoZSBmaWxlIGJhY2tlbmQgYW5kIHNpbWlsYXIKKyMgcHJvdG9jb2xzLgorIworIyBAZmlsZW5hbWU6ICAgIHBhdGggdG8gdGhlIGltYWdlIGZpbGUKKyMKKyMgU2luY2U6IDEuNworIyMKK3sgJ3R5cGUnOiAnQmxvY2tkZXZPcHRpb25zRmlsZScsCisgICdkYXRhJzogeyAnZmlsZW5hbWUnOiAnc3RyJyB9IH0KKworIyMKKyMgQEJsb2NrZGV2T3B0aW9uc1ZWRkFUCisjCisjIERyaXZlciBzcGVjaWZpYyBibG9jayBkZXZpY2Ugb3B0aW9ucyBmb3IgdGhlIHZ2ZmF0IHByb3RvY29sLgorIworIyBAZGlyOiAgICAgICAgIGRpcmVjdG9yeSB0byBiZSBleHBvcnRlZCBhcyBGQVQgaW1hZ2UKKyMgQGZhdC10eXBlOiAgICAjb3B0aW9uYWwgRkFUIHR5cGU6IDEyLCAxNiBvciAzMgorIyBAZmxvcHB5OiAgICAgICNvcHRpb25hbCB3aGV0aGVyIHRvIGV4cG9ydCBhIGZsb3BweSBpbWFnZSAodHJ1ZSkgb3IKKyMgICAgICAgICAgICAgICBwYXJ0aXRpb25lZCBoYXJkIGRpc2sgKGZhbHNlOyBkZWZhdWx0KQorIyBAcnc6ICAgICAgICAgICNvcHRpb25hbCB3aGV0aGVyIHRvIGFsbG93IHdyaXRlIG9wZXJhdGlvbnMgKGRlZmF1bHQ6IGZhbHNlKQorIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdCbG9ja2Rldk9wdGlvbnNWVkZBVCcsCisgICdkYXRhJzogeyAnZGlyJzogJ3N0cicsICcqZmF0LXR5cGUnOiAnaW50JywgJypmbG9wcHknOiAnYm9vbCcsCisgICAgICAgICAgICAnKnJ3JzogJ2Jvb2wnIH0gfQorCisjIworIyBAQmxvY2tkZXZPcHRpb25zR2VuZXJpY0Zvcm1hdAorIworIyBEcml2ZXIgc3BlY2lmaWMgYmxvY2sgZGV2aWNlIG9wdGlvbnMgZm9yIGltYWdlIGZvcm1hdCB0aGF0IGhhdmUgbm8gb3B0aW9uCisjIGJlc2lkZXMgdGhlaXIgZGF0YSBzb3VyY2UuCisjCisjIEBmaWxlOiAgICAgICAgcmVmZXJlbmNlIHRvIG9yIGRlZmluaXRpb24gb2YgdGhlIGRhdGEgc291cmNlIGJsb2NrIGRldmljZQorIworIyBTaW5jZTogMS43CisjIworeyAndHlwZSc6ICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljRm9ybWF0JywKKyAgJ2RhdGEnOiB7ICdmaWxlJzogJ0Jsb2NrZGV2UmVmJyB9IH0KKworIyMKKyMgQEJsb2NrZGV2T3B0aW9uc0dlbmVyaWNDT1dGb3JtYXQKKyMKKyMgRHJpdmVyIHNwZWNpZmljIGJsb2NrIGRldmljZSBvcHRpb25zIGZvciBpbWFnZSBmb3JtYXQgdGhhdCBoYXZlIG5vIG9wdGlvbgorIyBiZXNpZGVzIHRoZWlyIGRhdGEgc291cmNlIGFuZCBhbiBvcHRpb25hbCBiYWNraW5nIGZpbGUuCisjCisjIEBiYWNraW5nOiAgICAgI29wdGlvbmFsIHJlZmVyZW5jZSB0byBvciBkZWZpbml0aW9uIG9mIHRoZSBiYWNraW5nIGZpbGUgYmxvY2sKKyMgICAgICAgICAgICAgICBkZXZpY2UgKGlmIG1pc3NpbmcsIHRha2VuIGZyb20gdGhlIGltYWdlIGZpbGUgY29udGVudCkuIEl0IGlzCisjICAgICAgICAgICAgICAgYWxsb3dlZCB0byBwYXNzIGFuIGVtcHR5IHN0cmluZyBoZXJlIGluIG9yZGVyIHRvIGRpc2FibGUgdGhlCisjICAgICAgICAgICAgICAgZGVmYXVsdCBiYWNraW5nIGZpbGUuCisjCisjIFNpbmNlOiAxLjcKKyMjCit7ICd0eXBlJzogJ0Jsb2NrZGV2T3B0aW9uc0dlbmVyaWNDT1dGb3JtYXQnLAorICAnYmFzZSc6ICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljRm9ybWF0JywKKyAgJ2RhdGEnOiB7ICcqYmFja2luZyc6ICdCbG9ja2RldlJlZicgfSB9CisKKyMjCisjIEBCbG9ja2Rldk9wdGlvbnNRY293MgorIworIyBEcml2ZXIgc3BlY2lmaWMgYmxvY2sgZGV2aWNlIG9wdGlvbnMgZm9yIHFjb3cyLgorIworIyBAbGF6eS1yZWZjb3VudHM6ICAgICAgICAjb3B0aW9uYWwgd2hldGhlciB0byBlbmFibGUgdGhlIGxhenkgcmVmY291bnRzCisjICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmUgKGRlZmF1bHQgaXMgdGFrZW4gZnJvbSB0aGUgaW1hZ2UgZmlsZSkKKyMKKyMgQHBhc3MtZGlzY2FyZC1yZXF1ZXN0OiAgI29wdGlvbmFsIHdoZXRoZXIgZGlzY2FyZCByZXF1ZXN0cyB0byB0aGUgcWNvdzIKKyMgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHNob3VsZCBiZSBmb3J3YXJkZWQgdG8gdGhlIGRhdGEgc291cmNlCisjCisjIEBwYXNzLWRpc2NhcmQtc25hcHNob3Q6ICNvcHRpb25hbCB3aGV0aGVyIGRpc2NhcmQgcmVxdWVzdHMgZm9yIHRoZSBkYXRhIHNvdXJjZQorIyAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgaXNzdWVkIHdoZW4gYSBzbmFwc2hvdCBvcGVyYXRpb24gKGUuZy4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpbmcgYSBzbmFwc2hvdCkgZnJlZXMgY2x1c3RlcnMgaW4gdGhlIHFjb3cyIGZpbGUKKyMKKyMgQHBhc3MtZGlzY2FyZC1vdGhlcjogICAgI29wdGlvbmFsIHdoZXRoZXIgZGlzY2FyZCByZXF1ZXN0cyBmb3IgdGhlIGRhdGEgc291cmNlCisjICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpc3N1ZWQgb24gb3RoZXIgb2NjYXNpb25zIHdoZXJlIGEgY2x1c3RlcgorIyAgICAgICAgICAgICAgICAgICAgICAgICBnZXRzIGZyZWVkCisjCisjIFNpbmNlOiAxLjcKKyMjCit7ICd0eXBlJzogJ0Jsb2NrZGV2T3B0aW9uc1Fjb3cyJywKKyAgJ2Jhc2UnOiAnQmxvY2tkZXZPcHRpb25zR2VuZXJpY0NPV0Zvcm1hdCcsCisgICdkYXRhJzogeyAnKmxhenktcmVmY291bnRzJzogJ2Jvb2wnLAorICAgICAgICAgICAgJypwYXNzLWRpc2NhcmQtcmVxdWVzdCc6ICdib29sJywKKyAgICAgICAgICAgICcqcGFzcy1kaXNjYXJkLXNuYXBzaG90JzogJ2Jvb2wnLAorICAgICAgICAgICAgJypwYXNzLWRpc2NhcmQtb3RoZXInOiAnYm9vbCcgfSB9CisKKyMjCisjIEBCbG9ja2Rldk9wdGlvbnMKKyMKKyMgT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBibG9jayBkZXZpY2UuCisjCisjIFNpbmNlOiAxLjcKKyMjCit7ICd1bmlvbic6ICdCbG9ja2Rldk9wdGlvbnMnLAorICAnYmFzZSc6ICdCbG9ja2Rldk9wdGlvbnNCYXNlJywKKyAgJ2Rpc2NyaW1pbmF0b3InOiAnZHJpdmVyJywKKyAgJ2RhdGEnOiB7CisgICAgICAnZmlsZSc6ICAgICAgICdCbG9ja2Rldk9wdGlvbnNGaWxlJywKKyAgICAgICdodHRwJzogICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0ZpbGUnLAorICAgICAgJ2h0dHBzJzogICAgICAnQmxvY2tkZXZPcHRpb25zRmlsZScsCisgICAgICAnZnRwJzogICAgICAgICdCbG9ja2Rldk9wdGlvbnNGaWxlJywKKyAgICAgICdmdHBzJzogICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0ZpbGUnLAorICAgICAgJ3RmdHAnOiAgICAgICAnQmxvY2tkZXZPcHRpb25zRmlsZScsCisjIFRPRE8gZ2x1c3RlcjogV2FpdCBmb3Igc3RydWN0dXJlZCBvcHRpb25zCisjIFRPRE8gaXNjc2k6IFdhaXQgZm9yIHN0cnVjdHVyZWQgb3B0aW9ucworIyBUT0RPIG5iZDogU2hvdWxkIHRha2UgSW5ldFNvY2tldEFkZHJlc3MgZm9yICdob3N0Jz8KKyMgVE9ETyByYmQ6IFdhaXQgZm9yIHN0cnVjdHVyZWQgb3B0aW9ucworIyBUT0RPIHNoZWVwZG9nOiBXYWl0IGZvciBzdHJ1Y3R1cmVkIG9wdGlvbnMKKyMgVE9ETyBzc2g6IFNob3VsZCB0YWtlIEluZXRTb2NrZXRBZGRyZXNzIGZvciAnaG9zdCc/CisgICAgICAndnZmYXQnOiAgICAgICdCbG9ja2Rldk9wdGlvbnNWVkZBVCcsCisKKyMgVE9ETyBibGtkZWJ1ZzogV2FpdCBmb3Igc3RydWN0dXJlZCBvcHRpb25zCisjIFRPRE8gYmxrdmVyaWZ5OiBXYWl0IGZvciBzdHJ1Y3R1cmVkIG9wdGlvbnMKKworICAgICAgJ2JvY2hzJzogICAgICAnQmxvY2tkZXZPcHRpb25zR2VuZXJpY0Zvcm1hdCcsCisgICAgICAnY2xvb3AnOiAgICAgICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljRm9ybWF0JywKKyAgICAgICdjb3cnOiAgICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0dlbmVyaWNDT1dGb3JtYXQnLAorICAgICAgJ2RtZyc6ICAgICAgICAnQmxvY2tkZXZPcHRpb25zR2VuZXJpY0Zvcm1hdCcsCisgICAgICAncGFyYWxsZWxzJzogICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljRm9ybWF0JywKKyAgICAgICdxY293JzogICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0dlbmVyaWNDT1dGb3JtYXQnLAorICAgICAgJ3Fjb3cyJzogICAgICAnQmxvY2tkZXZPcHRpb25zUWNvdzInLAorICAgICAgJ3FlZCc6ICAgICAgICAnQmxvY2tkZXZPcHRpb25zR2VuZXJpY0NPV0Zvcm1hdCcsCisgICAgICAncmF3JzogICAgICAgICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljRm9ybWF0JywKKyAgICAgICd2ZGknOiAgICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0dlbmVyaWNGb3JtYXQnLAorICAgICAgJ3ZoZHgnOiAgICAgICAnQmxvY2tkZXZPcHRpb25zR2VuZXJpY0Zvcm1hdCcsCisgICAgICAndm1kayc6ICAgICAgICdCbG9ja2Rldk9wdGlvbnNHZW5lcmljQ09XRm9ybWF0JywKKyAgICAgICd2cGMnOiAgICAgICAgJ0Jsb2NrZGV2T3B0aW9uc0dlbmVyaWNGb3JtYXQnCisgIH0gfQorCisjIworIyBAQmxvY2tkZXZSZWYKKyMKKyMgUmVmZXJlbmNlIHRvIGEgYmxvY2sgZGV2aWNlLgorIworIyBAZGVmaW5pdGlvbjogICAgICBkZWZpbmVzIGEgbmV3IGJsb2NrIGRldmljZSBpbmxpbmUKKyMgQHJlZmVyZW5jZTogICAgICAgcmVmZXJlbmNlcyB0aGUgSUQgb2YgYW4gZXhpc3RpbmcgYmxvY2sgZGV2aWNlLiBBbgorIyAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgbWVhbnMgdGhhdCBubyBibG9jayBkZXZpY2Ugc2hvdWxkIGJlCisjICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZWQuCisjCisjIFNpbmNlOiAxLjcKKyMjCit7ICd1bmlvbic6ICdCbG9ja2RldlJlZicsCisgICdkaXNjcmltaW5hdG9yJzoge30sCisgICdkYXRhJzogeyAnZGVmaW5pdGlvbic6ICdCbG9ja2Rldk9wdGlvbnMnLAorICAgICAgICAgICAgJ3JlZmVyZW5jZSc6ICdzdHInIH0gfQorCisjIworIyBAYmxvY2tkZXYtYWRkOgorIworIyBDcmVhdGVzIGEgbmV3IGJsb2NrIGRldmljZS4KKyMKKyMgQG9wdGlvbnM6IGJsb2NrIGRldmljZSBvcHRpb25zIGZvciB0aGUgbmV3IGRldmljZQorIworIyBTaW5jZTogMS43CisjIworeyAnY29tbWFuZCc6ICdibG9ja2Rldi1hZGQnLCAnZGF0YSc6IHsgJ29wdGlvbnMnOiAnQmxvY2tkZXZPcHRpb25zJyB9IH0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcWVtdS1jaGFyLmMgYi9hbmRyb2lkL3FlbXUxL3FlbXUtY2hhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOWRmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3FlbXUtY2hhci5jCkBAIC0wLDAgKzEsMjc0NSBAQAorLyoKKyAqIFFFTVUgU3lzdGVtIEVtdWxhdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAidWkvY29uc29sZS5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJibG9jay9ibG9jay5oIgorI2luY2x1ZGUgImh3L21zbW91c2UuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC90eXBlcy5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjaWZkZWYgQ09ORklHX0JTRAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaW5jbHVkZSA8bGlidXRpbC5oPgorI2luY2x1ZGUgPGRldi9wcGJ1cy9wcGkuaD4KKyNpbmNsdWRlIDxkZXYvcHBidXMvcHBiY29uZi5oPgorI2lmIGRlZmluZWQoX19HTElCQ19fKQorI2luY2x1ZGUgPHB0eS5oPgorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjaW5jbHVkZSA8bGlidXRpbC5oPgorI2luY2x1ZGUgPGRldi9taXNjL3BwaS9wcGkuaD4KKyNpbmNsdWRlIDxidXMvcHBidXMvcHBiY29uZi5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8cHR5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNlbmRpZgorI2lmZGVmIF9fc3VuX18KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9ldGhlcm5ldC5oPgorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luX3N5c3RtLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPiAvLyBtdXN0IGNvbWUgYWZ0ZXIgaXAuaAorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKworI2RlZmluZSBSRUFEX0JVRl9MRU4gNDA5NgorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvZW11bGF0aW9uL3NlcmlhbF9saW5lLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9ncHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWttc2cuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LXFlbXVkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC90ZWxlcGhvbnkvbW9kZW1fZHJpdmVyLmgiCisjZW5kaWYgLyogQ09ORklHX0FORFJPSUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY2hhcmFjdGVyIGRldmljZSAqLworCitzdGF0aWMgUVRBSUxRX0hFQUQoQ2hhckRyaXZlclN0YXRlSGVhZCwgQ2hhckRyaXZlclN0YXRlKSBjaGFyZGV2cyA9CisgICAgUVRBSUxRX0hFQURfSU5JVElBTElaRVIoY2hhcmRldnMpOworc3RhdGljIGludCBpbml0aWFsX3Jlc2V0X2lzc3VlZDsKKworc3RhdGljIHZvaWQgcWVtdV9jaHJfZXZlbnQoQ2hhckRyaXZlclN0YXRlICpzLCBpbnQgZXZlbnQpCit7CisgICAgLyogS2VlcCB0cmFjayBpZiB0aGUgY2hhciBkZXZpY2UgaXMgb3BlbiAqLworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICAgY2FzZSBDSFJfRVZFTlRfT1BFTkVEOgorICAgICAgICAgICAgcy0+b3BlbmVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIUl9FVkVOVF9DTE9TRUQ6CisgICAgICAgICAgICBzLT5vcGVuZWQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFzLT5jaHJfZXZlbnQpCisgICAgICAgIHJldHVybjsKKyAgICBzLT5jaHJfZXZlbnQocy0+aGFuZGxlcl9vcGFxdWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgcWVtdV9jaHJfZ2VuZXJpY19vcGVuX2JoKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKnMgPSBvcGFxdWU7CisgICAgcWVtdV9jaHJfZXZlbnQocywgQ0hSX0VWRU5UX09QRU5FRCk7CisgICAgcWVtdV9iaF9kZWxldGUocy0+YmgpOworICAgIHMtPmJoID0gTlVMTDsKK30KKwordm9pZCBxZW11X2Nocl9nZW5lcmljX29wZW4oQ2hhckRyaXZlclN0YXRlICpzKQoreworICAgIGlmIChzLT5iaCA9PSBOVUxMKSB7CisJcy0+YmggPSBxZW11X2JoX25ldyhxZW11X2Nocl9nZW5lcmljX29wZW5fYmgsIHMpOworCXFlbXVfYmhfc2NoZWR1bGUocy0+YmgpOworICAgIH0KK30KKwordm9pZCBxZW11X2Nocl9yZXNldChDaGFyRHJpdmVyU3RhdGUgKnMpCit7CisgICAgaWYgKHMtPmJoID09IE5VTEwgJiYgaW5pdGlhbF9yZXNldF9pc3N1ZWQpIHsKKwlzLT5iaCA9IHFlbXVfYmhfbmV3KHFlbXVfY2hyX2dlbmVyaWNfb3Blbl9iaCwgcyk7CisJcWVtdV9iaF9zY2hlZHVsZShzLT5iaCk7CisgICAgfQorfQorCit2b2lkIHFlbXVfY2hyX2luaXRpYWxfcmVzZXQodm9pZCkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKworICAgIGluaXRpYWxfcmVzZXRfaXNzdWVkID0gMTsKKworICAgIFFUQUlMUV9GT1JFQUNIKGNociwgJmNoYXJkZXZzLCBuZXh0KSB7CisgICAgICAgIHFlbXVfY2hyX3Jlc2V0KGNocik7CisgICAgfQorfQorCitpbnQgcWVtdV9jaHJfd3JpdGUoQ2hhckRyaXZlclN0YXRlICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIHMtPmNocl93cml0ZShzLCBidWYsIGxlbik7Cit9CisKK2ludCBxZW11X2Nocl9pb2N0bChDaGFyRHJpdmVyU3RhdGUgKnMsIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKyAgICBpZiAoIXMtPmNocl9pb2N0bCkKKyAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgIHJldHVybiBzLT5jaHJfaW9jdGwocywgY21kLCBhcmcpOworfQorCitpbnQgcWVtdV9jaHJfY2FuX3JlYWQoQ2hhckRyaXZlclN0YXRlICpzKQoreworICAgIGlmICghcy0+Y2hyX2Nhbl9yZWFkKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcy0+Y2hyX2Nhbl9yZWFkKHMtPmhhbmRsZXJfb3BhcXVlKTsKK30KKwordm9pZCBxZW11X2Nocl9yZWFkKENoYXJEcml2ZXJTdGF0ZSAqcywgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIHMtPmNocl9yZWFkKHMtPmhhbmRsZXJfb3BhcXVlLCBidWYsIGxlbik7Cit9CisKK2ludCBxZW11X2Nocl9nZXRfbXNnZmQoQ2hhckRyaXZlclN0YXRlICpzKQoreworICAgIHJldHVybiBzLT5nZXRfbXNnZmQgPyBzLT5nZXRfbXNnZmQocykgOiAtMTsKK30KKwordm9pZCBxZW11X2Nocl9hY2NlcHRfaW5wdXQoQ2hhckRyaXZlclN0YXRlICpzKQoreworICAgIGlmIChzLT5jaHJfYWNjZXB0X2lucHV0KQorICAgICAgICBzLT5jaHJfYWNjZXB0X2lucHV0KHMpOworfQorCit2b2lkIHFlbXVfY2hyX3ByaW50ZihDaGFyRHJpdmVyU3RhdGUgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGNoYXIgYnVmW1JFQURfQlVGX0xFTl07CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcCk7CisgICAgcWVtdV9jaHJfd3JpdGUocywgKHVpbnQ4X3QgKilidWYsIHN0cmxlbihidWYpKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIHFlbXVfY2hyX3NlbmRfZXZlbnQoQ2hhckRyaXZlclN0YXRlICpzLCBpbnQgZXZlbnQpCit7CisgICAgaWYgKHMtPmNocl9zZW5kX2V2ZW50KQorICAgICAgICBzLT5jaHJfc2VuZF9ldmVudChzLCBldmVudCk7Cit9CisKK3ZvaWQgcWVtdV9jaHJfYWRkX2hhbmRsZXJzKENoYXJEcml2ZXJTdGF0ZSAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElPQ2FuUmVhZEhhbmRsZXIgKmZkX2Nhbl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9SZWFkSGFuZGxlciAqZmRfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElPRXZlbnRIYW5kbGVyICpmZF9ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpZiAoIW9wYXF1ZSAmJiAhZmRfY2FuX3JlYWQgJiYgIWZkX3JlYWQgJiYgIWZkX2V2ZW50KSB7CisgICAgICAgIC8qIGNociBkcml2ZXIgYmVpbmcgcmVsZWFzZWQuICovCisgICAgICAgICsrcy0+YXZhaWxfY29ubmVjdGlvbnM7CisgICAgfQorICAgIHMtPmNocl9jYW5fcmVhZCA9IGZkX2Nhbl9yZWFkOworICAgIHMtPmNocl9yZWFkID0gZmRfcmVhZDsKKyAgICBzLT5jaHJfZXZlbnQgPSBmZF9ldmVudDsKKyAgICBzLT5oYW5kbGVyX29wYXF1ZSA9IG9wYXF1ZTsKKyAgICBpZiAocy0+Y2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIpCisgICAgICAgIHMtPmNocl91cGRhdGVfcmVhZF9oYW5kbGVyKHMpOworCisgICAgLyogV2UncmUgY29ubmVjdGluZyB0byBhbiBhbHJlYWR5IG9wZW5lZCBkZXZpY2UsIHNvIGxldCdzIG1ha2Ugc3VyZSB3ZQorICAgICAgIGFsc28gZ2V0IHRoZSBvcGVuIGV2ZW50ICovCisgICAgaWYgKHMtPm9wZW5lZCkgeworICAgICAgICBxZW11X2Nocl9nZW5lcmljX29wZW4ocyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG51bGxfY2hyX3dyaXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl9udWxsKFFlbXVPcHRzICpvcHRzKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworCisgICAgY2hyID0gZ19tYWxsb2MwKHNpemVvZihDaGFyRHJpdmVyU3RhdGUpKTsKKyAgICBjaHItPmNocl93cml0ZSA9IG51bGxfY2hyX3dyaXRlOworICAgIHJldHVybiBjaHI7Cit9CisKKy8qIE1VWCBkcml2ZXIgZm9yIHNlcmlhbCBJL08gc3BsaXR0aW5nICovCisjZGVmaW5lIE1BWF9NVVggNAorI2RlZmluZSBNVVhfQlVGRkVSX1NJWkUgMzIJLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIuICAqLworI2RlZmluZSBNVVhfQlVGRkVSX01BU0sgKE1VWF9CVUZGRVJfU0laRSAtIDEpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgSU9DYW5SZWFkSGFuZGxlciAqY2hyX2Nhbl9yZWFkW01BWF9NVVhdOworICAgIElPUmVhZEhhbmRsZXIgKmNocl9yZWFkW01BWF9NVVhdOworICAgIElPRXZlbnRIYW5kbGVyICpjaHJfZXZlbnRbTUFYX01VWF07CisgICAgdm9pZCAqZXh0X29wYXF1ZVtNQVhfTVVYXTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmRydjsKKyAgICBpbnQgZm9jdXM7CisgICAgaW50IG11eF9jbnQ7CisgICAgaW50IHRlcm1fZ290X2VzY2FwZTsKKyAgICBpbnQgbWF4X3NpemU7CisgICAgLyogSW50ZXJtZWRpYXRlIGlucHV0IGJ1ZmZlciBhbGxvd3MgdG8gY2F0Y2ggZXNjYXBlIHNlcXVlbmNlcyBldmVuIGlmIHRoZQorICAgICAgIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGlzIG5vdCBhY2NlcHRpbmcgYW55IGlucHV0IC0gYnV0IG9ubHkgdW50aWwgaXQKKyAgICAgICBpcyBmdWxsIGFzIHdlbGwuICovCisgICAgdW5zaWduZWQgY2hhciBidWZmZXJbTUFYX01VWF1bTVVYX0JVRkZFUl9TSVpFXTsKKyAgICBpbnQgcHJvZFtNQVhfTVVYXTsKKyAgICBpbnQgY29uc1tNQVhfTVVYXTsKKyAgICBpbnQgdGltZXN0YW1wczsKKyAgICBpbnQgbGluZXN0YXJ0OworICAgIGludDY0X3QgdGltZXN0YW1wc19zdGFydDsKK30gTXV4RHJpdmVyOworCisKK3N0YXRpYyBpbnQgbXV4X2Nocl93cml0ZShDaGFyRHJpdmVyU3RhdGUgKmNociwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIE11eERyaXZlciAqZCA9IGNoci0+b3BhcXVlOworICAgIGludCByZXQ7CisgICAgaWYgKCFkLT50aW1lc3RhbXBzKSB7CisgICAgICAgIHJldCA9IGQtPmRydi0+Y2hyX3dyaXRlKGQtPmRydiwgYnVmLCBsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKGQtPmxpbmVzdGFydCkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmMVs2NF07CisgICAgICAgICAgICAgICAgaW50NjRfdCB0aTsKKyAgICAgICAgICAgICAgICBpbnQgc2VjczsKKworICAgICAgICAgICAgICAgIHRpID0gcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSk7CisgICAgICAgICAgICAgICAgaWYgKGQtPnRpbWVzdGFtcHNfc3RhcnQgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGQtPnRpbWVzdGFtcHNfc3RhcnQgPSB0aTsKKyAgICAgICAgICAgICAgICB0aSAtPSBkLT50aW1lc3RhbXBzX3N0YXJ0OworICAgICAgICAgICAgICAgIHNlY3MgPSB0aSAvIDEwMDA7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmMSwgc2l6ZW9mKGJ1ZjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbJTAyZDolMDJkOiUwMmQuJTAzZF0gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzIC8gMzYwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VjcyAvIDYwKSAlIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3MgJSA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSh0aSAlIDEwMDApKTsKKyAgICAgICAgICAgICAgICBkLT5kcnYtPmNocl93cml0ZShkLT5kcnYsICh1aW50OF90ICopYnVmMSwgc3RybGVuKGJ1ZjEpKTsKKyAgICAgICAgICAgICAgICBkLT5saW5lc3RhcnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ICs9IGQtPmRydi0+Y2hyX3dyaXRlKGQtPmRydiwgYnVmK2ksIDEpOworICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgZC0+bGluZXN0YXJ0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG11eF9oZWxwW10gPSB7CisgICAgIiUgaCAgICBwcmludCB0aGlzIGhlbHBcblxyIiwKKyAgICAiJSB4ICAgIGV4aXQgZW11bGF0b3JcblxyIiwKKyAgICAiJSBzICAgIHNhdmUgZGlzayBkYXRhIGJhY2sgdG8gZmlsZSAoaWYgLXNuYXBzaG90KVxuXHIiLAorICAgICIlIHQgICAgdG9nZ2xlIGNvbnNvbGUgdGltZXN0YW1wc1xuXHIiCisgICAgIiUgYiAgICBzZW5kIGJyZWFrIChtYWdpYyBzeXNycSlcblxyIiwKKyAgICAiJSBjICAgIHN3aXRjaCBiZXR3ZWVuIGNvbnNvbGUgYW5kIG1vbml0b3JcblxyIiwKKyAgICAiJSAlICBzZW5kcyAlXG5cciIsCisgICAgTlVMTAorfTsKKworaW50IHRlcm1fZXNjYXBlX2NoYXIgPSAweDAxOyAvKiBjdHJsLWEgaXMgdXNlZCBmb3IgZXNjYXBlICovCitzdGF0aWMgdm9pZCBtdXhfcHJpbnRfaGVscChDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBpbnQgaSwgajsKKyAgICBjaGFyIGVidWZbMTVdID0gIkVzY2FwZS1DaGFyIjsKKyAgICBjaGFyIGNidWZbNTBdID0gIlxuXHIiOworCisgICAgaWYgKHRlcm1fZXNjYXBlX2NoYXIgPiAwICYmIHRlcm1fZXNjYXBlX2NoYXIgPCAyNikgeworICAgICAgICBzbnByaW50ZihjYnVmLCBzaXplb2YoY2J1ZiksICJcblxyIik7CisgICAgICAgIHNucHJpbnRmKGVidWYsIHNpemVvZihlYnVmKSwgIkMtJWMiLCB0ZXJtX2VzY2FwZV9jaGFyIC0gMSArICdhJyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc25wcmludGYoY2J1Ziwgc2l6ZW9mKGNidWYpLAorICAgICAgICAgICAgICAgICAiXG5cckVzY2FwZS1DaGFyIHNldCB0byBBc2NpaTogMHglMDJ4XG5cclxuXHIiLAorICAgICAgICAgICAgICAgICB0ZXJtX2VzY2FwZV9jaGFyKTsKKyAgICB9CisgICAgY2hyLT5jaHJfd3JpdGUoY2hyLCAodWludDhfdCAqKWNidWYsIHN0cmxlbihjYnVmKSk7CisgICAgZm9yIChpID0gMDsgbXV4X2hlbHBbaV0gIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIGZvciAoaj0wOyBtdXhfaGVscFtpXVtqXSAhPSAnXDAnOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChtdXhfaGVscFtpXVtqXSA9PSAnJScpCisgICAgICAgICAgICAgICAgY2hyLT5jaHJfd3JpdGUoY2hyLCAodWludDhfdCAqKWVidWYsIHN0cmxlbihlYnVmKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2hyLT5jaHJfd3JpdGUoY2hyLCAodWludDhfdCAqKSZtdXhfaGVscFtpXVtqXSwgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG11eF9jaHJfc2VuZF9ldmVudChNdXhEcml2ZXIgKmQsIGludCBtdXhfbnIsIGludCBldmVudCkKK3sKKyAgICBpZiAoZC0+Y2hyX2V2ZW50W211eF9ucl0pCisgICAgICAgIGQtPmNocl9ldmVudFttdXhfbnJdKGQtPmV4dF9vcGFxdWVbbXV4X25yXSwgZXZlbnQpOworfQorCitzdGF0aWMgaW50IG11eF9wcm9jX2J5dGUoQ2hhckRyaXZlclN0YXRlICpjaHIsIE11eERyaXZlciAqZCwgaW50IGNoKQoreworICAgIGlmIChkLT50ZXJtX2dvdF9lc2NhcGUpIHsKKyAgICAgICAgZC0+dGVybV9nb3RfZXNjYXBlID0gMDsKKyAgICAgICAgaWYgKGNoID09IHRlcm1fZXNjYXBlX2NoYXIpCisgICAgICAgICAgICBnb3RvIHNlbmRfY2hhcjsKKyAgICAgICAgc3dpdGNoKGNoKSB7CisgICAgICAgIGNhc2UgJz8nOgorICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIG11eF9wcmludF9oZWxwKGNocik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlcm0gPSAgIlFFTVU6IFRlcm1pbmF0ZWRcblxyIjsKKyAgICAgICAgICAgICAgICAgY2hyLT5jaHJfd3JpdGUoY2hyLCh1aW50OF90ICopdGVybSxzdHJsZW4odGVybSkpOworICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBiZHJ2X2NvbW1pdF9hbGwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIHFlbXVfY2hyX2V2ZW50KGNociwgQ0hSX0VWRU5UX0JSRUFLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgIC8qIFN3aXRjaCB0byB0aGUgbmV4dCByZWdpc3RlcmVkIGRldmljZSAqLworICAgICAgICAgICAgbXV4X2Nocl9zZW5kX2V2ZW50KGQsIGQtPmZvY3VzLCBDSFJfRVZFTlRfTVVYX09VVCk7CisgICAgICAgICAgICBkLT5mb2N1cysrOworICAgICAgICAgICAgaWYgKGQtPmZvY3VzID49IGQtPm11eF9jbnQpCisgICAgICAgICAgICAgICAgZC0+Zm9jdXMgPSAwOworICAgICAgICAgICAgbXV4X2Nocl9zZW5kX2V2ZW50KGQsIGQtPmZvY3VzLCBDSFJfRVZFTlRfTVVYX0lOKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGQtPnRpbWVzdGFtcHMgPSAhZC0+dGltZXN0YW1wczsKKyAgICAgICAgICAgIGQtPnRpbWVzdGFtcHNfc3RhcnQgPSAtMTsKKyAgICAgICAgICAgIGQtPmxpbmVzdGFydCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2ggPT0gdGVybV9lc2NhcGVfY2hhcikgeworICAgICAgICBkLT50ZXJtX2dvdF9lc2NhcGUgPSAxOworICAgIH0gZWxzZSB7CisgICAgc2VuZF9jaGFyOgorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG11eF9jaHJfYWNjZXB0X2lucHV0KENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIE11eERyaXZlciAqZCA9IGNoci0+b3BhcXVlOworICAgIGludCBtID0gZC0+Zm9jdXM7CisKKyAgICB3aGlsZSAoZC0+cHJvZFttXSAhPSBkLT5jb25zW21dICYmCisgICAgICAgICAgIGQtPmNocl9jYW5fcmVhZFttXSAmJgorICAgICAgICAgICBkLT5jaHJfY2FuX3JlYWRbbV0oZC0+ZXh0X29wYXF1ZVttXSkpIHsKKyAgICAgICAgZC0+Y2hyX3JlYWRbbV0oZC0+ZXh0X29wYXF1ZVttXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmQtPmJ1ZmZlclttXVtkLT5jb25zW21dKysgJiBNVVhfQlVGRkVSX01BU0tdLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbXV4X2Nocl9jYW5fcmVhZCh2b2lkICpvcGFxdWUpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBvcGFxdWU7CisgICAgTXV4RHJpdmVyICpkID0gY2hyLT5vcGFxdWU7CisgICAgaW50IG0gPSBkLT5mb2N1czsKKworICAgIGlmICgoZC0+cHJvZFttXSAtIGQtPmNvbnNbbV0pIDwgTVVYX0JVRkZFUl9TSVpFKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoZC0+Y2hyX2Nhbl9yZWFkW21dKQorICAgICAgICByZXR1cm4gZC0+Y2hyX2Nhbl9yZWFkW21dKGQtPmV4dF9vcGFxdWVbbV0pOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdXhfY2hyX3JlYWQodm9pZCAqb3BhcXVlLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyID0gb3BhcXVlOworICAgIE11eERyaXZlciAqZCA9IGNoci0+b3BhcXVlOworICAgIGludCBtID0gZC0+Zm9jdXM7CisgICAgaW50IGk7CisKKyAgICBtdXhfY2hyX2FjY2VwdF9pbnB1dCAob3BhcXVlKTsKKworICAgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgaWYgKG11eF9wcm9jX2J5dGUoY2hyLCBkLCBidWZbaV0pKSB7CisgICAgICAgICAgICBpZiAoZC0+cHJvZFttXSA9PSBkLT5jb25zW21dICYmCisgICAgICAgICAgICAgICAgZC0+Y2hyX2Nhbl9yZWFkW21dICYmCisgICAgICAgICAgICAgICAgZC0+Y2hyX2Nhbl9yZWFkW21dKGQtPmV4dF9vcGFxdWVbbV0pKQorICAgICAgICAgICAgICAgIGQtPmNocl9yZWFkW21dKGQtPmV4dF9vcGFxdWVbbV0sICZidWZbaV0sIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGQtPmJ1ZmZlclttXVtkLT5wcm9kW21dKysgJiBNVVhfQlVGRkVSX01BU0tdID0gYnVmW2ldOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG11eF9jaHJfZXZlbnQodm9pZCAqb3BhcXVlLCBpbnQgZXZlbnQpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBvcGFxdWU7CisgICAgTXV4RHJpdmVyICpkID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGk7CisKKyAgICAvKiBTZW5kIHRoZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZC0+bXV4X2NudDsgaSsrKQorICAgICAgICBtdXhfY2hyX3NlbmRfZXZlbnQoZCwgaSwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZCBtdXhfY2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIoQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgTXV4RHJpdmVyICpkID0gY2hyLT5vcGFxdWU7CisKKyAgICBpZiAoZC0+bXV4X2NudCA+PSBNQVhfTVVYKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGFkZCBJL08gaGFuZGxlcnMsIE1VWCBhcnJheSBpcyBmdWxsXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkLT5leHRfb3BhcXVlW2QtPm11eF9jbnRdID0gY2hyLT5oYW5kbGVyX29wYXF1ZTsKKyAgICBkLT5jaHJfY2FuX3JlYWRbZC0+bXV4X2NudF0gPSBjaHItPmNocl9jYW5fcmVhZDsKKyAgICBkLT5jaHJfcmVhZFtkLT5tdXhfY250XSA9IGNoci0+Y2hyX3JlYWQ7CisgICAgZC0+Y2hyX2V2ZW50W2QtPm11eF9jbnRdID0gY2hyLT5jaHJfZXZlbnQ7CisgICAgLyogRml4IHVwIHRoZSByZWFsIGRyaXZlciB3aXRoIG11eCByb3V0aW5lcyAqLworICAgIGlmIChkLT5tdXhfY250ID09IDApIHsKKyAgICAgICAgcWVtdV9jaHJfYWRkX2hhbmRsZXJzKGQtPmRydiwgbXV4X2Nocl9jYW5fcmVhZCwgbXV4X2Nocl9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV4X2Nocl9ldmVudCwgY2hyKTsKKyAgICB9CisgICAgaWYgKGQtPmZvY3VzICE9IC0xKSB7CisgICAgICAgIG11eF9jaHJfc2VuZF9ldmVudChkLCBkLT5mb2N1cywgQ0hSX0VWRU5UX01VWF9PVVQpOworICAgIH0KKyAgICBkLT5mb2N1cyA9IGQtPm11eF9jbnQ7CisgICAgZC0+bXV4X2NudCsrOworICAgIG11eF9jaHJfc2VuZF9ldmVudChkLCBkLT5mb2N1cywgQ0hSX0VWRU5UX01VWF9JTik7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fbXV4KENoYXJEcml2ZXJTdGF0ZSAqZHJ2KQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworICAgIE11eERyaXZlciAqZDsKKworICAgIGNociA9IGdfbWFsbG9jMChzaXplb2YoQ2hhckRyaXZlclN0YXRlKSk7CisgICAgZCA9IGdfbWFsbG9jMChzaXplb2YoTXV4RHJpdmVyKSk7CisKKyAgICBjaHItPm9wYXF1ZSA9IGQ7CisgICAgZC0+ZHJ2ID0gZHJ2OworICAgIGQtPmZvY3VzID0gLTE7CisgICAgY2hyLT5jaHJfd3JpdGUgPSBtdXhfY2hyX3dyaXRlOworICAgIGNoci0+Y2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIgPSBtdXhfY2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXI7CisgICAgY2hyLT5jaHJfYWNjZXB0X2lucHV0ID0gbXV4X2Nocl9hY2NlcHRfaW5wdXQ7CisgICAgLyogRnJvbnRlbmQgZ3Vlc3Qtb3BlbiAvIC1jbG9zZSBub3RpZmljYXRpb24gaXMgbm90IHN1cHBvcnQgd2l0aCBtdXhlcyAqLworICAgIGNoci0+Y2hyX2d1ZXN0X29wZW4gPSBOVUxMOworICAgIGNoci0+Y2hyX2d1ZXN0X2Nsb3NlID0gTlVMTDsKKworICAgIC8qIE11eGVzIGFyZSBhbHdheXMgb3BlbiBvbiBjcmVhdGlvbiAqLworICAgIHFlbXVfY2hyX2dlbmVyaWNfb3BlbihjaHIpOworCisgICAgcmV0dXJuIGNocjsKK30KKworCisjaWZkZWYgX1dJTjMyCitpbnQgc2VuZF9hbGwoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4xKQoreworI2lmIDEKKwlyZXR1cm4gc29ja2V0X3NlbmQoZmQsIGJ1ZiwgbGVuMSk7CisjZWxzZQorICAgIGludCByZXQsIGxlbjsKKworICAgIGxlbiA9IGxlbjE7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgcmV0ID0gc2VuZChmZCwgYnVmLCBsZW4sIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZXJybm8gPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnJubyAhPSBXU0FFV09VTERCTE9DSyAmJiBlcnJubyAhPSBXU0FFQUdBSU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjEgLSBsZW47CisjZW5kaWYKK30KKworI2Vsc2UKKworaW50IHNlbmRfYWxsKGludCBmZCwgY29uc3Qgdm9pZCAqX2J1ZiwgaW50IGxlbjEpCit7CisgICAgaW50IHJldCwgbGVuOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IF9idWY7CisKKyAgICBsZW4gPSBsZW4xOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIHJldCA9IHdyaXRlKGZkLCBidWYsIGxlbik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWYgKz0gcmV0OworICAgICAgICAgICAgbGVuIC09IHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuMSAtIGxlbjsKK30KKyNlbmRpZiAvKiAhX1dJTjMyICovCisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fYW5kcm9pZF9tb2RlbShRZW11T3B0cyogb3B0cykKK3sKKyAgICBDU2VyaWFsTGluZSogc2w7CisgICAgYW5kcm9pZF9zZXJpYWxsaW5lX3BpcGVfb3Blbigmc2wsICZhbmRyb2lkX21vZGVtX3NlcmlhbF9saW5lKTsKKyAgICByZXR1cm4gYW5kcm9pZF9zZXJpYWxsaW5lX3JlbGVhc2VfY3Moc2wpOworfQorCitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX2FuZHJvaWRfZ3BzKFFlbXVPcHRzKiBvcHRzKQoreworICAgIENTZXJpYWxMaW5lKiBzbDsKKyAgICBhbmRyb2lkX3NlcmlhbGxpbmVfcGlwZV9vcGVuKCZzbCwgJmFuZHJvaWRfZ3BzX3NlcmlhbF9saW5lKTsKKyAgICByZXR1cm4gYW5kcm9pZF9zZXJpYWxsaW5lX3JlbGVhc2VfY3Moc2wpOworfQorCitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX2FuZHJvaWRfa21zZyhRZW11T3B0cyogb3B0cykKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9zZXJpYWxsaW5lX2dldF9jcyhhbmRyb2lkX2ttc2dfZ2V0X3NlcmlhbF9saW5lKCkpOworfQorCitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX2FuZHJvaWRfcWVtdWQoUWVtdU9wdHMqIG9wdHMpCit7CisgICAgcmV0dXJuIGFuZHJvaWRfc2VyaWFsbGluZV9nZXRfY3MoYW5kcm9pZF9xZW11ZF9nZXRfc2VyaWFsX2xpbmUoKSk7Cit9CisKKworI2lmbmRlZiBfV0lOMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBmZF9pbiwgZmRfb3V0OworICAgIGludCBtYXhfc2l6ZTsKK30gRkRDaGFyRHJpdmVyOworCisjZGVmaW5lIFNURElPX01BWF9DTElFTlRTIDEKK3N0YXRpYyBpbnQgc3RkaW9fbmJfY2xpZW50cyA9IDA7CisKK3N0YXRpYyBpbnQgZmRfY2hyX3dyaXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgRkRDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgcmV0dXJuIHNlbmRfYWxsKHMtPmZkX291dCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IGZkX2Nocl9yZWFkX3BvbGwodm9pZCAqb3BhcXVlKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyID0gb3BhcXVlOworICAgIEZEQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgcy0+bWF4X3NpemUgPSBxZW11X2Nocl9jYW5fcmVhZChjaHIpOworICAgIHJldHVybiBzLT5tYXhfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgZmRfY2hyX3JlYWQodm9pZCAqb3BhcXVlKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyID0gb3BhcXVlOworICAgIEZEQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworICAgIGludCBzaXplLCBsZW47CisgICAgdWludDhfdCBidWZbUkVBRF9CVUZfTEVOXTsKKworICAgIGxlbiA9IHNpemVvZihidWYpOworICAgIGlmIChsZW4gPiBzLT5tYXhfc2l6ZSkKKyAgICAgICAgbGVuID0gcy0+bWF4X3NpemU7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgc2l6ZSA9IHJlYWQocy0+ZmRfaW4sIGJ1ZiwgbGVuKTsKKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIEZEIGhhcyBiZWVuIGNsb3NlZC4gUmVtb3ZlIGl0IGZyb20gdGhlIGFjdGl2ZSBsaXN0LiAgKi8KKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmRfaW4sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBxZW11X2Nocl9ldmVudChjaHIsIENIUl9FVkVOVF9DTE9TRUQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBxZW11X2Nocl9yZWFkKGNociwgYnVmLCBzaXplKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZkX2Nocl91cGRhdGVfcmVhZF9oYW5kbGVyKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIEZEQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgaWYgKHMtPmZkX2luID49IDApIHsKKyAgICAgICAgaWYgKGRpc3BsYXlfdHlwZSA9PSBEVF9OT0dSQVBISUMgJiYgcy0+ZmRfaW4gPT0gMCkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmRfaW4sIGZkX2Nocl9yZWFkX3BvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9jaHJfcmVhZCwgTlVMTCwgY2hyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZmRfY2hyX2Nsb3NlKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBGRENoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKworICAgIGlmIChzLT5mZF9pbiA+PSAwKSB7CisgICAgICAgIGlmIChkaXNwbGF5X3R5cGUgPT0gRFRfTk9HUkFQSElDICYmIHMtPmZkX2luID09IDApIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHMtPmZkX2luLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdfZnJlZShzKTsKKyAgICBxZW11X2Nocl9ldmVudChjaHIsIENIUl9FVkVOVF9DTE9TRUQpOworfQorCisvKiBvcGVuIGEgY2hhcmFjdGVyIGRldmljZSB0byBhIHVuaXggZmQgKi8KK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fZmQoaW50IGZkX2luLCBpbnQgZmRfb3V0KQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworICAgIEZEQ2hhckRyaXZlciAqczsKKworICAgIGNociA9IGdfbWFsbG9jMChzaXplb2YoQ2hhckRyaXZlclN0YXRlKSk7CisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoRkRDaGFyRHJpdmVyKSk7CisgICAgcy0+ZmRfaW4gPSBmZF9pbjsKKyAgICBzLT5mZF9vdXQgPSBmZF9vdXQ7CisgICAgY2hyLT5vcGFxdWUgPSBzOworICAgIGNoci0+Y2hyX3dyaXRlID0gZmRfY2hyX3dyaXRlOworICAgIGNoci0+Y2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIgPSBmZF9jaHJfdXBkYXRlX3JlYWRfaGFuZGxlcjsKKyAgICBjaHItPmNocl9jbG9zZSA9IGZkX2Nocl9jbG9zZTsKKworICAgIHFlbXVfY2hyX2dlbmVyaWNfb3BlbihjaHIpOworCisgICAgcmV0dXJuIGNocjsKK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl9maWxlX291dChRZW11T3B0cyAqb3B0cykKK3sKKyAgICBpbnQgZmRfb3V0OworCisgICAgVEZSKGZkX291dCA9IHFlbXVfb3BlbihxZW11X29wdF9nZXQob3B0cywgInBhdGgiKSwKKyAgICAgICAgICAgICAgICAgICAgICBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUIHwgT19CSU5BUlksIDA2NjYpKTsKKyAgICBpZiAoZmRfb3V0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHFlbXVfY2hyX29wZW5fZmQoLTEsIGZkX291dCk7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fcGlwZShRZW11T3B0cyAqb3B0cykKK3sKKyAgICBpbnQgZmRfaW4sIGZkX291dDsKKyAgICBjaGFyIGZpbGVuYW1lX2luWzI1Nl0sIGZpbGVuYW1lX291dFsyNTZdOworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJwYXRoIik7CisKKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoYXJkZXY6IHBpcGU6IG5vIGZpbGVuYW1lIGdpdmVuXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc25wcmludGYoZmlsZW5hbWVfaW4sIDI1NiwgIiVzLmluIiwgZmlsZW5hbWUpOworICAgIHNucHJpbnRmKGZpbGVuYW1lX291dCwgMjU2LCAiJXMub3V0IiwgZmlsZW5hbWUpOworICAgIFRGUihmZF9pbiA9IHFlbXVfb3BlbihmaWxlbmFtZV9pbiwgT19SRFdSIHwgT19CSU5BUlkpKTsKKyAgICBURlIoZmRfb3V0ID0gcWVtdV9vcGVuKGZpbGVuYW1lX291dCwgT19SRFdSIHwgT19CSU5BUlkpKTsKKyAgICBpZiAoZmRfaW4gPCAwIHx8IGZkX291dCA8IDApIHsKKwlpZiAoZmRfaW4gPj0gMCkKKwkgICAgY2xvc2UoZmRfaW4pOworCWlmIChmZF9vdXQgPj0gMCkKKwkgICAgY2xvc2UoZmRfb3V0KTsKKyAgICAgICAgVEZSKGZkX2luID0gZmRfb3V0ID0gb3BlbihmaWxlbmFtZSwgT19SRFdSIHwgT19CSU5BUlkpKTsKKyAgICAgICAgaWYgKGZkX2luIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcWVtdV9jaHJfb3Blbl9mZChmZF9pbiwgZmRfb3V0KTsKK30KKworI2lmZGVmIENPTkZJR19BTkRST0lECitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX2ZkcGFpcihRZW11T3B0cyogb3B0cykKK3sKKyAgICBpbnQgZmRfaW4gID0gcWVtdV9vcHRfZ2V0X251bWJlcihvcHRzLCAiZmRpbiIsLTEpOworICAgIGludCBmZF9vdXQgPSBxZW11X29wdF9nZXRfbnVtYmVyKG9wdHMsICJmZG91dCIsLTEpOworCisgICAgaWYgKGZkX2luIDwgMCB8fCBmZF9vdXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBxZW11X2Nocl9vcGVuX2ZkKGZkX2luLCBmZF9vdXQpOworfQorI2VuZGlmIC8qIENPTkZJR19BTkRST0lEICovCisKKy8qIGZvciBTVERJTywgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHNldmVyYWwgY2xpZW50cyB1c2UgaXQKKyAgIChub2dyYXBoaWMgbW9kZSkgKi8KKworI2RlZmluZSBURVJNX0ZJRk9fTUFYX1NJWkUgMQorCitzdGF0aWMgdWludDhfdCB0ZXJtX2ZpZm9bVEVSTV9GSUZPX01BWF9TSVpFXTsKK3N0YXRpYyBpbnQgdGVybV9maWZvX3NpemU7CisKK3N0YXRpYyBpbnQgc3RkaW9fcmVhZF9wb2xsKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKworICAgIC8qIHRyeSB0byBmbHVzaCB0aGUgcXVldWUgaWYgbmVlZGVkICovCisgICAgaWYgKHRlcm1fZmlmb19zaXplICE9IDAgJiYgcWVtdV9jaHJfY2FuX3JlYWQoY2hyKSA+IDApIHsKKyAgICAgICAgcWVtdV9jaHJfcmVhZChjaHIsIHRlcm1fZmlmbywgMSk7CisgICAgICAgIHRlcm1fZmlmb19zaXplID0gMDsKKyAgICB9CisgICAgLyogc2VlIGlmIHdlIGNhbiBhYnNvcmIgbW9yZSBjaGFycyAqLworICAgIGlmICh0ZXJtX2ZpZm9fc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdGRpb19yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICB1aW50OF90IGJ1ZlsxXTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKworICAgIHNpemUgPSByZWFkKDAsIGJ1ZiwgMSk7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvKiBzdGRpbiBoYXMgYmVlbiBjbG9zZWQuIFJlbW92ZSBpdCBmcm9tIHRoZSBhY3RpdmUgbGlzdC4gICovCisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBxZW11X2Nocl9ldmVudChjaHIsIENIUl9FVkVOVF9DTE9TRUQpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBpZiAocWVtdV9jaHJfY2FuX3JlYWQoY2hyKSA+IDApIHsKKyAgICAgICAgICAgIHFlbXVfY2hyX3JlYWQoY2hyLCBidWYsIDEpOworICAgICAgICB9IGVsc2UgaWYgKHRlcm1fZmlmb19zaXplID09IDApIHsKKyAgICAgICAgICAgIHRlcm1fZmlmb1t0ZXJtX2ZpZm9fc2l6ZSsrXSA9IGJ1ZlswXTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogaW5pdCB0ZXJtaW5hbCBzbyB0aGF0IHdlIGNhbiBncmFiIGtleXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyBvbGR0dHk7CitzdGF0aWMgaW50IG9sZF9mZDBfZmxhZ3M7CitzdGF0aWMgYm9vbCBzdGRpb19hbGxvd19zaWduYWw7CisKK3N0YXRpYyB2b2lkIHRlcm1fZXhpdCh2b2lkKQoreworICAgIHRjc2V0YXR0ciAoMCwgVENTQU5PVywgJm9sZHR0eSk7CisgICAgZmNudGwoMCwgRl9TRVRGTCwgb2xkX2ZkMF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfY2hyX3NldF9lY2hvX3N0ZGlvKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBib29sIGVjaG8pCit7CisgICAgc3RydWN0IHRlcm1pb3MgdHR5OworCisgICAgdHR5ID0gb2xkdHR5OworICAgIGlmICghZWNobykgeworICAgIHR0eS5jX2lmbGFnICY9IH4oSUdOQlJLfEJSS0lOVHxQQVJNUkt8SVNUUklQCisgICAgICAgICAgICAgICAgICAgICAgICAgIHxJTkxDUnxJR05DUnxJQ1JOTHxJWE9OKTsKKyAgICB0dHkuY19vZmxhZyB8PSBPUE9TVDsKKyAgICB0dHkuY19sZmxhZyAmPSB+KEVDSE98RUNIT05MfElDQU5PTnxJRVhURU4pOworICAgIHR0eS5jX2NmbGFnICY9IH4oQ1NJWkV8UEFSRU5CKTsKKyAgICB0dHkuY19jZmxhZyB8PSBDUzg7CisgICAgdHR5LmNfY2NbVk1JTl0gPSAxOworICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7CisgICAgfQorICAgIC8qIGlmIGdyYXBoaWNhbCBtb2RlLCB3ZSBhbGxvdyBDdHJsLUMgaGFuZGxpbmcgKi8KKyAgICBpZiAoIXN0ZGlvX2FsbG93X3NpZ25hbCkKKyAgICAgICAgdHR5LmNfbGZsYWcgJj0gfklTSUc7CisKKyAgICB0Y3NldGF0dHIgKDAsIFRDU0FOT1csICZ0dHkpOworfQorCitzdGF0aWMgdm9pZCBxZW11X2Nocl9jbG9zZV9zdGRpbyhzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgdGVybV9leGl0KCk7CisgICAgc3RkaW9fbmJfY2xpZW50cy0tOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGZkX2Nocl9jbG9zZShjaHIpOworfQorCitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX3N0ZGlvKFFlbXVPcHRzICpvcHRzKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworCisgICAgaWYgKHN0ZGlvX25iX2NsaWVudHMgPj0gU1RESU9fTUFYX0NMSUVOVFMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdGRpb19uYl9jbGllbnRzID09IDApIHsKKyAgICAgICAgb2xkX2ZkMF9mbGFncyA9IGZjbnRsKDAsIEZfR0VURkwpOworICAgICAgICB0Y2dldGF0dHIgKDAsICZvbGR0dHkpOworICAgICAgICBmY250bCgwLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICAgICAgYXRleGl0KHRlcm1fZXhpdCk7CisgICAgfQorCisgICAgY2hyID0gcWVtdV9jaHJfb3Blbl9mZCgwLCAxKTsKKyAgICBjaHItPmNocl9jbG9zZSA9IHFlbXVfY2hyX2Nsb3NlX3N0ZGlvOworICAgIGNoci0+Y2hyX3NldF9lY2hvID0gcWVtdV9jaHJfc2V0X2VjaG9fc3RkaW87CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIoMCwgc3RkaW9fcmVhZF9wb2xsLCBzdGRpb19yZWFkLCBOVUxMLCBjaHIpOworICAgIHN0ZGlvX25iX2NsaWVudHMrKzsKKyAgICBzdGRpb19hbGxvd19zaWduYWwgPSBxZW11X29wdF9nZXRfYm9vbChvcHRzLCAic2lnbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3R5cGUgIT0gRFRfTk9HUkFQSElDKTsKKyAgICBxZW11X2Nocl9zZXRfZWNobyhjaHIsIGZhbHNlKTsKKworICAgIHJldHVybiBjaHI7Cit9CisKKyNpZmRlZiBfX3N1bl9fCisvKiBPbmNlIFNvbGFyaXMgaGFzIG9wZW5wdHkoKSwgdGhpcyBpcyBnb2luZyB0byBiZSByZW1vdmVkLiAqLworc3RhdGljIGludCBvcGVucHR5KGludCAqYW1hc3RlciwgaW50ICphc2xhdmUsIGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKnRlcm1wLCBzdHJ1Y3Qgd2luc2l6ZSAqd2lucCkKK3sKKyAgICAgICAgY29uc3QgY2hhciAqc2xhdmU7CisgICAgICAgIGludCBtZmQgPSAtMSwgc2ZkID0gLTE7CisKKyAgICAgICAgKmFtYXN0ZXIgPSAqYXNsYXZlID0gLTE7CisKKyAgICAgICAgbWZkID0gb3BlbigiL2Rldi9wdG14IiwgT19SRFdSIHwgT19OT0NUVFkpOworICAgICAgICBpZiAobWZkIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoZ3JhbnRwdChtZmQpID09IC0xIHx8IHVubG9ja3B0KG1mZCkgPT0gLTEpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisKKyAgICAgICAgaWYgKChzbGF2ZSA9IHB0c25hbWUobWZkKSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoKHNmZCA9IG9wZW4oc2xhdmUsIE9fUkRPTkxZIHwgT19OT0NUVFkpKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoaW9jdGwoc2ZkLCBJX1BVU0gsICJwdGVtIikgPT0gLTEgfHwKKyAgICAgICAgICAgICh0ZXJtcCAhPSBOVUxMICYmIHRjZ2V0YXR0cihzZmQsIHRlcm1wKSA8IDApKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyOworCisgICAgICAgIGlmIChhbWFzdGVyKQorICAgICAgICAgICAgICAgICphbWFzdGVyID0gbWZkOworICAgICAgICBpZiAoYXNsYXZlKQorICAgICAgICAgICAgICAgICphc2xhdmUgPSBzZmQ7CisgICAgICAgIGlmICh3aW5wKQorICAgICAgICAgICAgICAgIGlvY3RsKHNmZCwgVElPQ1NXSU5TWiwgd2lucCk7CisKKyAgICAgICAgcmV0dXJuIDA7CisKK2VycjoKKyAgICAgICAgaWYgKHNmZCAhPSAtMSkKKyAgICAgICAgICAgICAgICBjbG9zZShzZmQpOworICAgICAgICBjbG9zZShtZmQpOworICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGNmbWFrZXJhdyAoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCkKK3sKKyAgICAgICAgdGVybWlvc19wLT5jX2lmbGFnICY9CisgICAgICAgICAgICAgICAgfihJR05CUkt8QlJLSU5UfFBBUk1SS3xJU1RSSVB8SU5MQ1J8SUdOQ1J8SUNSTkx8SVhPTik7CisgICAgICAgIHRlcm1pb3NfcC0+Y19vZmxhZyAmPSB+T1BPU1Q7CisgICAgICAgIHRlcm1pb3NfcC0+Y19sZmxhZyAmPSB+KEVDSE98RUNIT05MfElDQU5PTnxJU0lHfElFWFRFTik7CisgICAgICAgIHRlcm1pb3NfcC0+Y19jZmxhZyAmPSB+KENTSVpFfFBBUkVOQik7CisgICAgICAgIHRlcm1pb3NfcC0+Y19jZmxhZyB8PSBDUzg7CisKKyAgICAgICAgdGVybWlvc19wLT5jX2NjW1ZNSU5dID0gMDsKKyAgICAgICAgdGVybWlvc19wLT5jX2NjW1ZUSU1FXSA9IDA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBmZDsKKyAgICBpbnQgY29ubmVjdGVkOworICAgIGludCBwb2xsaW5nOworICAgIGludCByZWFkX2J5dGVzOworICAgIFFFTVVUaW1lciAqdGltZXI7Cit9IFB0eUNoYXJEcml2ZXI7CisKK3N0YXRpYyB2b2lkIHB0eV9jaHJfdXBkYXRlX3JlYWRfaGFuZGxlcihDaGFyRHJpdmVyU3RhdGUgKmNocik7CitzdGF0aWMgdm9pZCBwdHlfY2hyX3N0YXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBpbnQgY29ubmVjdGVkKTsKKworc3RhdGljIGludCBwdHlfY2hyX3dyaXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgUHR5Q2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgaWYgKCFzLT5jb25uZWN0ZWQpIHsKKyAgICAgICAgLyogZ3Vlc3Qgc2VuZHMgZGF0YSwgY2hlY2sgZm9yIChyZS0pY29ubmVjdCAqLworICAgICAgICBwdHlfY2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIoY2hyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBzZW5kX2FsbChzLT5mZCwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgaW50IHB0eV9jaHJfcmVhZF9wb2xsKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBQdHlDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisKKyAgICBzLT5yZWFkX2J5dGVzID0gcWVtdV9jaHJfY2FuX3JlYWQoY2hyKTsKKyAgICByZXR1cm4gcy0+cmVhZF9ieXRlczsKK30KKworc3RhdGljIHZvaWQgcHR5X2Nocl9yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBQdHlDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICB1aW50OF90IGJ1ZltSRUFEX0JVRl9MRU5dOworCisgICAgbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgaWYgKGxlbiA+IHMtPnJlYWRfYnl0ZXMpCisgICAgICAgIGxlbiA9IHMtPnJlYWRfYnl0ZXM7CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgc2l6ZSA9IHJlYWQocy0+ZmQsIGJ1ZiwgbGVuKTsKKyAgICBpZiAoKHNpemUgPT0gLTEgJiYgZXJybm8gPT0gRUlPKSB8fAorICAgICAgICAoc2l6ZSA9PSAwKSkgeworICAgICAgICBwdHlfY2hyX3N0YXRlKGNociwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIHB0eV9jaHJfc3RhdGUoY2hyLCAxKTsKKyAgICAgICAgcWVtdV9jaHJfcmVhZChjaHIsIGJ1Ziwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwdHlfY2hyX3VwZGF0ZV9yZWFkX2hhbmRsZXIoQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgUHR5Q2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmQsIHB0eV9jaHJfcmVhZF9wb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0eV9jaHJfcmVhZCwgTlVMTCwgY2hyKTsKKyAgICBzLT5wb2xsaW5nID0gMTsKKyAgICAvKgorICAgICAqIFNob3J0IHRpbWVvdXQgaGVyZToganVzdCBuZWVkIHdhaXQgbG9uZyBlbm91Z3RoIHRoYXQgcWVtdSBtYWtlcworICAgICAqIGl0IHRocm91Z2ggdGhlIHBvbGwgbG9vcCBvbmNlLiAgV2hlbiByZWNvbm5lY3RlZCB3ZSB3YW50IGEKKyAgICAgKiBzaG9ydCB0aW1lb3V0IHNvIHdlIG5vdGljZSBpdCBhbG1vc3QgaW5zdGFudGx5LiAgT3RoZXJ3aXNlCisgICAgICogcmVhZCgpIGdpdmVzIHVzIC1FSU8gaW5zdGFudGx5LCBtYWtpbmcgcHR5X2Nocl9zdGF0ZSgpIHJlc2V0IHRoZQorICAgICAqIHRpbWVvdXQgdG8gdGhlIG5vcm1hbCAobXVjaCBsb25nZXIpIHBvbGwgaW50ZXJ2YWwgYmVmb3JlIHRoZQorICAgICAqIHRpbWVyIHRyaWdnZXJzLgorICAgICAqLworICAgIHRpbWVyX21vZChzLT50aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkgKyAxMCk7Cit9CisKK3N0YXRpYyB2b2lkIHB0eV9jaHJfc3RhdGUoQ2hhckRyaXZlclN0YXRlICpjaHIsIGludCBjb25uZWN0ZWQpCit7CisgICAgUHR5Q2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgaWYgKCFjb25uZWN0ZWQpIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmQsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBzLT5jb25uZWN0ZWQgPSAwOworICAgICAgICBzLT5wb2xsaW5nID0gMDsKKyAgICAgICAgLyogKHJlLSljb25uZWN0IHBvbGwgaW50ZXJ2YWwgZm9yIGlkbGUgZ3Vlc3RzOiBvbmNlIHBlciBzZWNvbmQuCisgICAgICAgICAqIFdlIGNoZWNrIG1vcmUgZnJlcXVlbnRseSBpbiBjYXNlIHRoZSBndWVzdHMgc2VuZHMgZGF0YSB0bworICAgICAgICAgKiB0aGUgdmlydHVhbCBkZXZpY2UgbGlua2VkIHRvIG91ciBwdHkuICovCisgICAgICAgIHRpbWVyX21vZChzLT50aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkgKyAxMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXMtPmNvbm5lY3RlZCkKKyAgICAgICAgICAgIHFlbXVfY2hyX2dlbmVyaWNfb3BlbihjaHIpOworICAgICAgICBzLT5jb25uZWN0ZWQgPSAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHR5X2Nocl90aW1lcih2b2lkICpvcGFxdWUpCit7CisgICAgc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyID0gb3BhcXVlOworICAgIFB0eUNoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKworICAgIGlmIChzLT5jb25uZWN0ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAocy0+cG9sbGluZykgeworICAgICAgICAvKiBJZiB3ZSBhcnJpdmUgaGVyZSB3aXRob3V0IHBvbGxpbmcgYmVpbmcgY2xlYXJlZCBkdWUKKyAgICAgICAgICogcmVhZCByZXR1cm5pbmcgLUVJTywgdGhlbiB3ZSBhcmUgKHJlLSljb25uZWN0ZWQgKi8KKyAgICAgICAgcHR5X2Nocl9zdGF0ZShjaHIsIDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogTmV4dCBwb2xsIC4uLiAqLworICAgIHB0eV9jaHJfdXBkYXRlX3JlYWRfaGFuZGxlcihjaHIpOworfQorCitzdGF0aWMgdm9pZCBwdHlfY2hyX2Nsb3NlKHN0cnVjdCBDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBQdHlDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisKKyAgICBxZW11X3NldF9mZF9oYW5kbGVyMihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgY2xvc2Uocy0+ZmQpOworICAgIHRpbWVyX2RlbChzLT50aW1lcik7CisgICAgdGltZXJfZnJlZShzLT50aW1lcik7CisgICAgZ19mcmVlKHMpOworICAgIHFlbXVfY2hyX2V2ZW50KGNociwgQ0hSX0VWRU5UX0NMT1NFRCk7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fcHR5KFFlbXVPcHRzICpvcHRzKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworICAgIFB0eUNoYXJEcml2ZXIgKnM7CisgICAgc3RydWN0IHRlcm1pb3MgdHR5OworICAgIGludCBzbGF2ZV9mZCwgbGVuOworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyAgICBjaGFyIHB0eV9uYW1lW1BBVEhfTUFYXTsKKyNkZWZpbmUgcV9wdHNuYW1lKHgpIHB0eV9uYW1lCisjZWxzZQorICAgIGNoYXIgKnB0eV9uYW1lID0gTlVMTDsKKyNkZWZpbmUgcV9wdHNuYW1lKHgpIHB0c25hbWUoeCkKKyAgICAvL2V4dGVybiBjaGFyKiBwdHNuYW1lKGludCk7CisjZW5kaWYKKworICAgIGNociA9IGdfbWFsbG9jMChzaXplb2YoQ2hhckRyaXZlclN0YXRlKSk7CisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoUHR5Q2hhckRyaXZlcikpOworCisgICAgaWYgKG9wZW5wdHkoJnMtPmZkLCAmc2xhdmVfZmQsIHB0eV9uYW1lLCBOVUxMLCBOVUxMKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogU2V0IHJhdyBhdHRyaWJ1dGVzIG9uIHRoZSBwdHkuICovCisgICAgdGNnZXRhdHRyKHNsYXZlX2ZkLCAmdHR5KTsKKyAgICBjZm1ha2VyYXcoJnR0eSk7CisgICAgdGNzZXRhdHRyKHNsYXZlX2ZkLCBUQ1NBRkxVU0gsICZ0dHkpOworICAgIGNsb3NlKHNsYXZlX2ZkKTsKKworICAgIGxlbiA9IHN0cmxlbihxX3B0c25hbWUocy0+ZmQpKSArIDU7CisgICAgY2hyLT5maWxlbmFtZSA9IGdfbWFsbG9jKGxlbik7CisgICAgc25wcmludGYoY2hyLT5maWxlbmFtZSwgbGVuLCAicHR5OiVzIiwgcV9wdHNuYW1lKHMtPmZkKSk7CisgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwYXRoIiwgcV9wdHNuYW1lKHMtPmZkKSk7CisgICAgZnByaW50ZihzdGRlcnIsICJjaGFyIGRldmljZSByZWRpcmVjdGVkIHRvICVzXG4iLCBxX3B0c25hbWUocy0+ZmQpKTsKKworICAgIGNoci0+b3BhcXVlID0gczsKKyAgICBjaHItPmNocl93cml0ZSA9IHB0eV9jaHJfd3JpdGU7CisgICAgY2hyLT5jaHJfdXBkYXRlX3JlYWRfaGFuZGxlciA9IHB0eV9jaHJfdXBkYXRlX3JlYWRfaGFuZGxlcjsKKyAgICBjaHItPmNocl9jbG9zZSA9IHB0eV9jaHJfY2xvc2U7CisKKyAgICBzLT50aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1JFQUxUSU1FLCBTQ0FMRV9NUywgcHR5X2Nocl90aW1lciwgY2hyKTsKKworICAgIHJldHVybiBjaHI7Cit9CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX3N1bl9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSBcCisgICAgfHwgZGVmaW5lZChfX05ldEJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pIFwKKyAgICB8fCBkZWZpbmVkKF9fRnJlZUJTRF9rZXJuZWxfXykKKworc3RhdGljIHZvaWQgdHR5X3NlcmlhbF9pbml0KGludCBmZCwgaW50IHNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJpdHksIGludCBkYXRhX2JpdHMsIGludCBzdG9wX2JpdHMpCit7CisgICAgc3RydWN0IHRlcm1pb3MgdHR5OworICAgIHNwZWVkX3Qgc3BkOworCisjaWYgMAorICAgIHByaW50ZigidHR5X3NlcmlhbF9pbml0OiBzcGVlZD0lZCBwYXJpdHk9JWMgZGF0YT0lZCBzdG9wPSVkXG4iLAorICAgICAgICAgICBzcGVlZCwgcGFyaXR5LCBkYXRhX2JpdHMsIHN0b3BfYml0cyk7CisjZW5kaWYKKyAgICB0Y2dldGF0dHIgKGZkLCAmdHR5KTsKKworI2RlZmluZSBjaGVja19zcGVlZCh2YWwpIGlmIChzcGVlZCA8PSB2YWwpIHsgc3BkID0gQiMjdmFsOyBicmVhazsgfQorICAgIHNwZWVkID0gc3BlZWQgKiAxMCAvIDExOworICAgIGRvIHsKKyAgICAgICAgY2hlY2tfc3BlZWQoNTApOworICAgICAgICBjaGVja19zcGVlZCg3NSk7CisgICAgICAgIGNoZWNrX3NwZWVkKDExMCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDEzNCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDE1MCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDIwMCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDMwMCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDYwMCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDEyMDApOworICAgICAgICBjaGVja19zcGVlZCgxODAwKTsKKyAgICAgICAgY2hlY2tfc3BlZWQoMjQwMCk7CisgICAgICAgIGNoZWNrX3NwZWVkKDQ4MDApOworICAgICAgICBjaGVja19zcGVlZCg5NjAwKTsKKyAgICAgICAgY2hlY2tfc3BlZWQoMTkyMDApOworICAgICAgICBjaGVja19zcGVlZCgzODQwMCk7CisgICAgICAgIC8qIE5vbi1Qb3NpeCB2YWx1ZXMgZm9sbG93LiBUaGV5IG1heSBiZSB1bnN1cHBvcnRlZCBvbiBzb21lIHN5c3RlbXMuICovCisgICAgICAgIGNoZWNrX3NwZWVkKDU3NjAwKTsKKyAgICAgICAgY2hlY2tfc3BlZWQoMTE1MjAwKTsKKyNpZmRlZiBCMjMwNDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDIzMDQwMCk7CisjZW5kaWYKKyNpZmRlZiBCNDYwODAwCisgICAgICAgIGNoZWNrX3NwZWVkKDQ2MDgwMCk7CisjZW5kaWYKKyNpZmRlZiBCNTAwMDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDUwMDAwMCk7CisjZW5kaWYKKyNpZmRlZiBCNTc2MDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDU3NjAwMCk7CisjZW5kaWYKKyNpZmRlZiBCOTIxNjAwCisgICAgICAgIGNoZWNrX3NwZWVkKDkyMTYwMCk7CisjZW5kaWYKKyNpZmRlZiBCMTAwMDAwMAorICAgICAgICBjaGVja19zcGVlZCgxMDAwMDAwKTsKKyNlbmRpZgorI2lmZGVmIEIxMTUyMDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDExNTIwMDApOworI2VuZGlmCisjaWZkZWYgQjE1MDAwMDAKKyAgICAgICAgY2hlY2tfc3BlZWQoMTUwMDAwMCk7CisjZW5kaWYKKyNpZmRlZiBCMjAwMDAwMAorICAgICAgICBjaGVja19zcGVlZCgyMDAwMDAwKTsKKyNlbmRpZgorI2lmZGVmIEIyNTAwMDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDI1MDAwMDApOworI2VuZGlmCisjaWZkZWYgQjMwMDAwMDAKKyAgICAgICAgY2hlY2tfc3BlZWQoMzAwMDAwMCk7CisjZW5kaWYKKyNpZmRlZiBCMzUwMDAwMAorICAgICAgICBjaGVja19zcGVlZCgzNTAwMDAwKTsKKyNlbmRpZgorI2lmZGVmIEI0MDAwMDAwCisgICAgICAgIGNoZWNrX3NwZWVkKDQwMDAwMDApOworI2VuZGlmCisgICAgICAgIHNwZCA9IEIxMTUyMDA7CisgICAgfSB3aGlsZSAoMCk7CisKKyAgICBjZnNldGlzcGVlZCgmdHR5LCBzcGQpOworICAgIGNmc2V0b3NwZWVkKCZ0dHksIHNwZCk7CisKKyAgICB0dHkuY19pZmxhZyAmPSB+KElHTkJSS3xCUktJTlR8UEFSTVJLfElTVFJJUAorICAgICAgICAgICAgICAgICAgICAgICAgICB8SU5MQ1J8SUdOQ1J8SUNSTkx8SVhPTik7CisgICAgdHR5LmNfb2ZsYWcgfD0gT1BPU1Q7CisgICAgdHR5LmNfbGZsYWcgJj0gfihFQ0hPfEVDSE9OTHxJQ0FOT058SUVYVEVOfElTSUcpOworICAgIHR0eS5jX2NmbGFnICY9IH4oQ1NJWkV8UEFSRU5CfFBBUk9ERHxDUlRTQ1RTfENTVE9QQik7CisgICAgc3dpdGNoKGRhdGFfYml0cykgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSA4OgorICAgICAgICB0dHkuY19jZmxhZyB8PSBDUzg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgdHR5LmNfY2ZsYWcgfD0gQ1M3OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHR0eS5jX2NmbGFnIHw9IENTNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB0dHkuY19jZmxhZyB8PSBDUzU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2gocGFyaXR5KSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlICdOJzoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRSc6CisgICAgICAgIHR0eS5jX2NmbGFnIHw9IFBBUkVOQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnTyc6CisgICAgICAgIHR0eS5jX2NmbGFnIHw9IFBBUkVOQiB8IFBBUk9ERDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzdG9wX2JpdHMgPT0gMikKKyAgICAgICAgdHR5LmNfY2ZsYWcgfD0gQ1NUT1BCOworCisgICAgdGNzZXRhdHRyIChmZCwgVENTQU5PVywgJnR0eSk7Cit9CisKK3N0YXRpYyBpbnQgdHR5X3NlcmlhbF9pb2N0bChDaGFyRHJpdmVyU3RhdGUgKmNociwgaW50IGNtZCwgdm9pZCAqYXJnKQoreworICAgIEZEQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ0hSX0lPQ1RMX1NFUklBTF9TRVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICBRRU1VU2VyaWFsU2V0UGFyYW1zICpzc3AgPSBhcmc7CisgICAgICAgICAgICB0dHlfc2VyaWFsX2luaXQocy0+ZmRfaW4sIHNzcC0+c3BlZWQsIHNzcC0+cGFyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzcC0+ZGF0YV9iaXRzLCBzc3AtPnN0b3BfYml0cyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFJfSU9DVExfU0VSSUFMX1NFVF9CUkVBSzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVuYWJsZSA9ICooaW50ICopYXJnOworICAgICAgICAgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgICAgICAgICB0Y3NlbmRicmVhayhzLT5mZF9pbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFJfSU9DVExfU0VSSUFMX0dFVF9USU9DTToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNhcmcgPSAwOworICAgICAgICAgICAgaW50ICp0YXJnID0gKGludCAqKWFyZzsKKyAgICAgICAgICAgIGlvY3RsKHMtPmZkX2luLCBUSU9DTUdFVCwgJnNhcmcpOworICAgICAgICAgICAgKnRhcmcgPSAwOworICAgICAgICAgICAgaWYgKHNhcmcgJiBUSU9DTV9DVFMpCisgICAgICAgICAgICAgICAgKnRhcmcgfD0gQ0hSX1RJT0NNX0NUUzsKKyAgICAgICAgICAgIGlmIChzYXJnICYgVElPQ01fQ0FSKQorICAgICAgICAgICAgICAgICp0YXJnIHw9IENIUl9USU9DTV9DQVI7CisgICAgICAgICAgICBpZiAoc2FyZyAmIFRJT0NNX0RTUikKKyAgICAgICAgICAgICAgICAqdGFyZyB8PSBDSFJfVElPQ01fRFNSOworICAgICAgICAgICAgaWYgKHNhcmcgJiBUSU9DTV9SSSkKKyAgICAgICAgICAgICAgICAqdGFyZyB8PSBDSFJfVElPQ01fUkk7CisgICAgICAgICAgICBpZiAoc2FyZyAmIFRJT0NNX0RUUikKKyAgICAgICAgICAgICAgICAqdGFyZyB8PSBDSFJfVElPQ01fRFRSOworICAgICAgICAgICAgaWYgKHNhcmcgJiBUSU9DTV9SVFMpCisgICAgICAgICAgICAgICAgKnRhcmcgfD0gQ0hSX1RJT0NNX1JUUzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9TRVJJQUxfU0VUX1RJT0NNOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2FyZyA9ICooaW50ICopYXJnOworICAgICAgICAgICAgaW50IHRhcmcgPSAwOworICAgICAgICAgICAgaW9jdGwocy0+ZmRfaW4sIFRJT0NNR0VULCAmdGFyZyk7CisgICAgICAgICAgICB0YXJnICY9IH4oQ0hSX1RJT0NNX0NUUyB8IENIUl9USU9DTV9DQVIgfCBDSFJfVElPQ01fRFNSCisgICAgICAgICAgICAgICAgICAgICB8IENIUl9USU9DTV9SSSB8IENIUl9USU9DTV9EVFIgfCBDSFJfVElPQ01fUlRTKTsKKyAgICAgICAgICAgIGlmIChzYXJnICYgQ0hSX1RJT0NNX0NUUykKKyAgICAgICAgICAgICAgICB0YXJnIHw9IFRJT0NNX0NUUzsKKyAgICAgICAgICAgIGlmIChzYXJnICYgQ0hSX1RJT0NNX0NBUikKKyAgICAgICAgICAgICAgICB0YXJnIHw9IFRJT0NNX0NBUjsKKyAgICAgICAgICAgIGlmIChzYXJnICYgQ0hSX1RJT0NNX0RTUikKKyAgICAgICAgICAgICAgICB0YXJnIHw9IFRJT0NNX0RTUjsKKyAgICAgICAgICAgIGlmIChzYXJnICYgQ0hSX1RJT0NNX1JJKQorICAgICAgICAgICAgICAgIHRhcmcgfD0gVElPQ01fUkk7CisgICAgICAgICAgICBpZiAoc2FyZyAmIENIUl9USU9DTV9EVFIpCisgICAgICAgICAgICAgICAgdGFyZyB8PSBUSU9DTV9EVFI7CisgICAgICAgICAgICBpZiAoc2FyZyAmIENIUl9USU9DTV9SVFMpCisgICAgICAgICAgICAgICAgdGFyZyB8PSBUSU9DTV9SVFM7CisgICAgICAgICAgICBpb2N0bChzLT5mZF9pbiwgVElPQ01TRVQsICZ0YXJnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxZW11X2Nocl9jbG9zZV90dHkoQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgRkRDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGZkID0gLTE7CisKKyAgICBpZiAocykgeworICAgICAgICBmZCA9IHMtPmZkX2luOworICAgIH0KKworICAgIGZkX2Nocl9jbG9zZShjaHIpOworCisgICAgaWYgKGZkID49IDApIHsKKyAgICAgICAgY2xvc2UoZmQpOworICAgIH0KK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl90dHkoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBpbnQgZmQ7CisKKyAgICBURlIoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLKSk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdHR5X3NlcmlhbF9pbml0KGZkLCAxMTUyMDAsICdOJywgOCwgMSk7CisgICAgY2hyID0gcWVtdV9jaHJfb3Blbl9mZChmZCwgZmQpOworICAgIGlmICghY2hyKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNoci0+Y2hyX2lvY3RsID0gdHR5X3NlcmlhbF9pb2N0bDsKKyAgICBjaHItPmNocl9jbG9zZSA9IHFlbXVfY2hyX2Nsb3NlX3R0eTsKKyAgICByZXR1cm4gY2hyOworfQorCisjZW5kaWYgIC8vIF9fbGludXhfXyB8fCBfX2JzZF9fCisKKyNlbHNlICAvKiBfV0lOMzIgKi8KK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fcHR5KFFlbXVPcHRzICpvcHRzKQoreworICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIF9XSU4zMiAqLworCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZkOworICAgIGludCBtb2RlOworfSBQYXJhbGxlbENoYXJEcml2ZXI7CisKK3N0YXRpYyBpbnQgcHBfaHdfbW9kZShQYXJhbGxlbENoYXJEcml2ZXIgKnMsIHVpbnQxNl90IG1vZGUpCit7CisgICAgaWYgKHMtPm1vZGUgIT0gbW9kZSkgeworCWludCBtID0gbW9kZTsKKyAgICAgICAgaWYgKGlvY3RsKHMtPmZkLCBQUFNFVE1PREUsICZtKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKwlzLT5tb2RlID0gbW9kZTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHBfaW9jdGwoQ2hhckRyaXZlclN0YXRlICpjaHIsIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKyAgICBQYXJhbGxlbENoYXJEcml2ZXIgKmRydiA9IGNoci0+b3BhcXVlOworICAgIGludCBmZCA9IGRydi0+ZmQ7CisgICAgdWludDhfdCBiOworCisgICAgc3dpdGNoKGNtZCkgeworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX1JFQURfREFUQToKKyAgICAgICAgaWYgKGlvY3RsKGZkLCBQUFJEQVRBLCAmYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgICAgICAqKHVpbnQ4X3QgKilhcmcgPSBiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9XUklURV9EQVRBOgorICAgICAgICBiID0gKih1aW50OF90ICopYXJnOworICAgICAgICBpZiAoaW9jdGwoZmQsIFBQV0RBVEEsICZiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX1JFQURfQ09OVFJPTDoKKyAgICAgICAgaWYgKGlvY3RsKGZkLCBQUFJDT05UUk9MLCAmYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworCS8qIExpbnV4IGdpdmVzIG9ubHkgdGhlIGxvd2VzdCBiaXRzLCBhbmQgbm8gd2F5IHRvIGtub3cgZGF0YQorCSAgIGRpcmVjdGlvbiEgRm9yIGJldHRlciBjb21wYXRpYmlsaXR5IHNldCB0aGUgZml4ZWQgdXBwZXIKKwkgICBiaXRzLiAqLworICAgICAgICAqKHVpbnQ4X3QgKilhcmcgPSBiIHwgMHhjMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFJfSU9DVExfUFBfV1JJVEVfQ09OVFJPTDoKKyAgICAgICAgYiA9ICoodWludDhfdCAqKWFyZzsKKyAgICAgICAgaWYgKGlvY3RsKGZkLCBQUFdDT05UUk9MLCAmYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9SRUFEX1NUQVRVUzoKKyAgICAgICAgaWYgKGlvY3RsKGZkLCBQUFJTVEFUVVMsICZiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgICoodWludDhfdCAqKWFyZyA9IGI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX0RBVEFfRElSOgorICAgICAgICBpZiAoaW9jdGwoZmQsIFBQREFUQURJUiwgKGludCAqKWFyZykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9FUFBfUkVBRF9BRERSOgorCWlmIChwcF9od19tb2RlKGRydiwgSUVFRTEyODRfTU9ERV9FUFB8SUVFRTEyODRfQUREUikpIHsKKwkgICAgc3RydWN0IFBhcmFsbGVsSU9BcmcgKnBhcmcgPSBhcmc7CisJICAgIGludCBuID0gcmVhZChmZCwgcGFyZy0+YnVmZmVyLCBwYXJnLT5jb3VudCk7CisJICAgIGlmIChuICE9IHBhcmctPmNvdW50KSB7CisJCXJldHVybiAtRUlPOworCSAgICB9CisJfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9FUFBfUkVBRDoKKwlpZiAocHBfaHdfbW9kZShkcnYsIElFRUUxMjg0X01PREVfRVBQKSkgeworCSAgICBzdHJ1Y3QgUGFyYWxsZWxJT0FyZyAqcGFyZyA9IGFyZzsKKwkgICAgaW50IG4gPSByZWFkKGZkLCBwYXJnLT5idWZmZXIsIHBhcmctPmNvdW50KTsKKwkgICAgaWYgKG4gIT0gcGFyZy0+Y291bnQpIHsKKwkJcmV0dXJuIC1FSU87CisJICAgIH0KKwl9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX0VQUF9XUklURV9BRERSOgorCWlmIChwcF9od19tb2RlKGRydiwgSUVFRTEyODRfTU9ERV9FUFB8SUVFRTEyODRfQUREUikpIHsKKwkgICAgc3RydWN0IFBhcmFsbGVsSU9BcmcgKnBhcmcgPSBhcmc7CisJICAgIGludCBuID0gd3JpdGUoZmQsIHBhcmctPmJ1ZmZlciwgcGFyZy0+Y291bnQpOworCSAgICBpZiAobiAhPSBwYXJnLT5jb3VudCkgeworCQlyZXR1cm4gLUVJTzsKKwkgICAgfQorCX0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFJfSU9DVExfUFBfRVBQX1dSSVRFOgorCWlmIChwcF9od19tb2RlKGRydiwgSUVFRTEyODRfTU9ERV9FUFApKSB7CisJICAgIHN0cnVjdCBQYXJhbGxlbElPQXJnICpwYXJnID0gYXJnOworCSAgICBpbnQgbiA9IHdyaXRlKGZkLCBwYXJnLT5idWZmZXIsIHBhcmctPmNvdW50KTsKKwkgICAgaWYgKG4gIT0gcGFyZy0+Y291bnQpIHsKKwkJcmV0dXJuIC1FSU87CisJICAgIH0KKwl9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBwX2Nsb3NlKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIFBhcmFsbGVsQ2hhckRyaXZlciAqZHJ2ID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGZkID0gZHJ2LT5mZDsKKworICAgIHBwX2h3X21vZGUoZHJ2LCBJRUVFMTI4NF9NT0RFX0NPTVBBVCk7CisgICAgaW9jdGwoZmQsIFBQUkVMRUFTRSk7CisgICAgY2xvc2UoZmQpOworICAgIGdfZnJlZShkcnYpOworICAgIHFlbXVfY2hyX2V2ZW50KGNociwgQ0hSX0VWRU5UX0NMT1NFRCk7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fcHAoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBQYXJhbGxlbENoYXJEcml2ZXIgKmRydjsKKyAgICBpbnQgZmQ7CisKKyAgICBURlIoZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1IpKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChpb2N0bChmZCwgUFBDTEFJTSkgPCAwKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZHJ2ID0gZ19tYWxsb2MwKHNpemVvZihQYXJhbGxlbENoYXJEcml2ZXIpKTsKKyAgICBkcnYtPmZkID0gZmQ7CisgICAgZHJ2LT5tb2RlID0gSUVFRTEyODRfTU9ERV9DT01QQVQ7CisKKyAgICBjaHIgPSBnX21hbGxvYzAoc2l6ZW9mKENoYXJEcml2ZXJTdGF0ZSkpOworICAgIGNoci0+Y2hyX3dyaXRlID0gbnVsbF9jaHJfd3JpdGU7CisgICAgY2hyLT5jaHJfaW9jdGwgPSBwcF9pb2N0bDsKKyAgICBjaHItPmNocl9jbG9zZSA9IHBwX2Nsb3NlOworICAgIGNoci0+b3BhcXVlID0gZHJ2OworCisgICAgcWVtdV9jaHJfZ2VuZXJpY19vcGVuKGNocik7CisKKyAgICByZXR1cm4gY2hyOworfQorI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisjaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKK3N0YXRpYyBpbnQgcHBfaW9jdGwoQ2hhckRyaXZlclN0YXRlICpjaHIsIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKyAgICBpbnQgZmQgPSAoaW50KShpbnRwdHJfdCljaHItPm9wYXF1ZTsKKyAgICB1aW50OF90IGI7CisKKyAgICBzd2l0Y2goY21kKSB7CisgICAgY2FzZSBDSFJfSU9DVExfUFBfUkVBRF9EQVRBOgorICAgICAgICBpZiAoaW9jdGwoZmQsIFBQSUdEQVRBLCAmYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgICAgICAqKHVpbnQ4X3QgKilhcmcgPSBiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9XUklURV9EQVRBOgorICAgICAgICBiID0gKih1aW50OF90ICopYXJnOworICAgICAgICBpZiAoaW9jdGwoZmQsIFBQSVNEQVRBLCAmYikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9UU1VQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUl9JT0NUTF9QUF9SRUFEX0NPTlRST0w6CisgICAgICAgIGlmIChpb2N0bChmZCwgUFBJR0NUUkwsICZiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgICoodWludDhfdCAqKWFyZyA9IGI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX1dSSVRFX0NPTlRST0w6CisgICAgICAgIGIgPSAqKHVpbnQ4X3QgKilhcmc7CisgICAgICAgIGlmIChpb2N0bChmZCwgUFBJU0NUUkwsICZiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hSX0lPQ1RMX1BQX1JFQURfU1RBVFVTOgorICAgICAgICBpZiAoaW9jdGwoZmQsIFBQSUdTVEFUVVMsICZiKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgICoodWludDhfdCAqKWFyZyA9IGI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRU5PVFNVUDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fcHAoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBpbnQgZmQ7CisKKyAgICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRXUik7CisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjaHIgPSBnX21hbGxvYzAoc2l6ZW9mKENoYXJEcml2ZXJTdGF0ZSkpOworICAgIGNoci0+b3BhcXVlID0gKHZvaWQgKikoaW50cHRyX3QpZmQ7CisgICAgY2hyLT5jaHJfd3JpdGUgPSBudWxsX2Nocl93cml0ZTsKKyAgICBjaHItPmNocl9pb2N0bCA9IHBwX2lvY3RsOworICAgIHJldHVybiBjaHI7Cit9CisjZW5kaWYKKworI2Vsc2UgLyogX1dJTjMyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbWF4X3NpemU7CisgICAgSEFORExFIGhjb20sIGhyZWN2LCBoc2VuZDsKKyAgICBPVkVSTEFQUEVEIG9yZWN2LCBvc2VuZDsKKyAgICBCT09MIGZwaXBlOworICAgIERXT1JEIGxlbjsKK30gV2luQ2hhclN0YXRlOworCisjZGVmaW5lIE5TRU5EQlVGIDIwNDgKKyNkZWZpbmUgTlJFQ1ZCVUYgMjA0OAorI2RlZmluZSBNQVhDT05ORUNUIDEKKyNkZWZpbmUgTlRJTUVPVVQgNTAwMAorCitzdGF0aWMgaW50IHdpbl9jaHJfcG9sbCh2b2lkICpvcGFxdWUpOworc3RhdGljIGludCB3aW5fY2hyX3BpcGVfcG9sbCh2b2lkICpvcGFxdWUpOworCitzdGF0aWMgdm9pZCB3aW5fY2hyX2Nsb3NlKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIFdpbkNoYXJTdGF0ZSAqcyA9IGNoci0+b3BhcXVlOworCisgICAgaWYgKHMtPmhzZW5kKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHMtPmhzZW5kKTsKKyAgICAgICAgcy0+aHNlbmQgPSBOVUxMOworICAgIH0KKyAgICBpZiAocy0+aHJlY3YpIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUocy0+aHJlY3YpOworICAgICAgICBzLT5ocmVjdiA9IE5VTEw7CisgICAgfQorICAgIGlmIChzLT5oY29tKSB7CisgICAgICAgIENsb3NlSGFuZGxlKHMtPmhjb20pOworICAgICAgICBzLT5oY29tID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHMtPmZwaXBlKQorICAgICAgICBxZW11X2RlbF9wb2xsaW5nX2NiKHdpbl9jaHJfcGlwZV9wb2xsLCBjaHIpOworICAgIGVsc2UKKyAgICAgICAgcWVtdV9kZWxfcG9sbGluZ19jYih3aW5fY2hyX3BvbGwsIGNocik7CisKKyAgICBxZW11X2Nocl9ldmVudChjaHIsIENIUl9FVkVOVF9DTE9TRUQpOworfQorCitzdGF0aWMgaW50IHdpbl9jaHJfaW5pdChDaGFyRHJpdmVyU3RhdGUgKmNociwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgV2luQ2hhclN0YXRlICpzID0gY2hyLT5vcGFxdWU7CisgICAgQ09NTUNPTkZJRyBjb21jZmc7CisgICAgQ09NTVRJTUVPVVRTIGN0byA9IHsgMCwgMCwgMCwgMCwgMH07CisgICAgQ09NU1RBVCBjb21zdGF0OworICAgIERXT1JEIHNpemU7CisgICAgRFdPUkQgZXJyOworCisgICAgcy0+aHNlbmQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKCFzLT5oc2VuZCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBDcmVhdGVFdmVudFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcy0+aHJlY3YgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CisgICAgaWYgKCFzLT5ocmVjdikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBDcmVhdGVFdmVudFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5oY29tID0gQ3JlYXRlRmlsZShmaWxlbmFtZSwgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEUsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgRklMRV9GTEFHX09WRVJMQVBQRUQsIDApOworICAgIGlmIChzLT5oY29tID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIENyZWF0ZUZpbGUgKCVsdSlcbiIsIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgcy0+aGNvbSA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIVNldHVwQ29tbShzLT5oY29tLCBOUkVDVkJVRiwgTlNFTkRCVUYpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIFNldHVwQ29tbVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBaZXJvTWVtb3J5KCZjb21jZmcsIHNpemVvZihDT01NQ09ORklHKSk7CisgICAgc2l6ZSA9IHNpemVvZihDT01NQ09ORklHKTsKKyAgICBHZXREZWZhdWx0Q29tbUNvbmZpZyhmaWxlbmFtZSwgJmNvbWNmZywgJnNpemUpOworICAgIGNvbWNmZy5kY2IuRENCbGVuZ3RoID0gc2l6ZW9mKERDQik7CisgICAgQ29tbUNvbmZpZ0RpYWxvZyhmaWxlbmFtZSwgTlVMTCwgJmNvbWNmZyk7CisKKyAgICBpZiAoIVNldENvbW1TdGF0ZShzLT5oY29tLCAmY29tY2ZnLmRjYikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgU2V0Q29tbVN0YXRlXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICghU2V0Q29tbU1hc2socy0+aGNvbSwgRVZfRVJSKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBTZXRDb21tTWFza1xuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdG8uUmVhZEludGVydmFsVGltZW91dCA9IE1BWERXT1JEOworICAgIGlmICghU2V0Q29tbVRpbWVvdXRzKHMtPmhjb20sICZjdG8pKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIFNldENvbW1UaW1lb3V0c1xuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIUNsZWFyQ29tbUVycm9yKHMtPmhjb20sICZlcnIsICZjb21zdGF0KSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBDbGVhckNvbW1FcnJvclxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcWVtdV9hZGRfcG9sbGluZ19jYih3aW5fY2hyX3BvbGwsIGNocik7CisgICAgcmV0dXJuIDA7CisKKyBmYWlsOgorICAgIHdpbl9jaHJfY2xvc2UoY2hyKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgd2luX2Nocl93cml0ZShDaGFyRHJpdmVyU3RhdGUgKmNociwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuMSkKK3sKKyAgICBXaW5DaGFyU3RhdGUgKnMgPSBjaHItPm9wYXF1ZTsKKyAgICBEV09SRCBsZW4sIHJldCwgc2l6ZSwgZXJyOworCisgICAgbGVuID0gbGVuMTsKKyAgICBaZXJvTWVtb3J5KCZzLT5vc2VuZCwgc2l6ZW9mKHMtPm9zZW5kKSk7CisgICAgcy0+b3NlbmQuaEV2ZW50ID0gcy0+aHNlbmQ7CisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaWYgKHMtPmhzZW5kKQorICAgICAgICAgICAgcmV0ID0gV3JpdGVGaWxlKHMtPmhjb20sIGJ1ZiwgbGVuLCAmc2l6ZSwgJnMtPm9zZW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gV3JpdGVGaWxlKHMtPmhjb20sIGJ1ZiwgbGVuLCAmc2l6ZSwgTlVMTCk7CisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfSU9fUEVORElORykgeworICAgICAgICAgICAgICAgIHJldCA9IEdldE92ZXJsYXBwZWRSZXN1bHQocy0+aGNvbSwgJnMtPm9zZW5kLCAmc2l6ZSwgVFJVRSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICBidWYgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IHNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiArPSBzaXplOworICAgICAgICAgICAgbGVuIC09IHNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxlbjEgLSBsZW47Cit9CisKK3N0YXRpYyBpbnQgd2luX2Nocl9yZWFkX3BvbGwoQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgV2luQ2hhclN0YXRlICpzID0gY2hyLT5vcGFxdWU7CisKKyAgICBzLT5tYXhfc2l6ZSA9IHFlbXVfY2hyX2Nhbl9yZWFkKGNocik7CisgICAgcmV0dXJuIHMtPm1heF9zaXplOworfQorCitzdGF0aWMgdm9pZCB3aW5fY2hyX3JlYWRmaWxlKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIFdpbkNoYXJTdGF0ZSAqcyA9IGNoci0+b3BhcXVlOworICAgIGludCByZXQsIGVycjsKKyAgICB1aW50OF90IGJ1ZltSRUFEX0JVRl9MRU5dOworICAgIERXT1JEIHNpemU7CisKKyAgICBaZXJvTWVtb3J5KCZzLT5vcmVjdiwgc2l6ZW9mKHMtPm9yZWN2KSk7CisgICAgcy0+b3JlY3YuaEV2ZW50ID0gcy0+aHJlY3Y7CisgICAgcmV0ID0gUmVhZEZpbGUocy0+aGNvbSwgYnVmLCBzLT5sZW4sICZzaXplLCAmcy0+b3JlY3YpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICAgICAgICAgIHJldCA9IEdldE92ZXJsYXBwZWRSZXN1bHQocy0+aGNvbSwgJnMtPm9yZWN2LCAmc2l6ZSwgVFJVRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgcWVtdV9jaHJfcmVhZChjaHIsIGJ1Ziwgc2l6ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3aW5fY2hyX3JlYWQoQ2hhckRyaXZlclN0YXRlICpjaHIpCit7CisgICAgV2luQ2hhclN0YXRlICpzID0gY2hyLT5vcGFxdWU7CisKKyAgICBpZiAocy0+bGVuID4gcy0+bWF4X3NpemUpCisgICAgICAgIHMtPmxlbiA9IHMtPm1heF9zaXplOworICAgIGlmIChzLT5sZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgd2luX2Nocl9yZWFkZmlsZShjaHIpOworfQorCitzdGF0aWMgaW50IHdpbl9jaHJfcG9sbCh2b2lkICpvcGFxdWUpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBvcGFxdWU7CisgICAgV2luQ2hhclN0YXRlICpzID0gY2hyLT5vcGFxdWU7CisgICAgQ09NU1RBVCBzdGF0dXM7CisgICAgRFdPUkQgY29tZXJyOworCisgICAgQ2xlYXJDb21tRXJyb3Iocy0+aGNvbSwgJmNvbWVyciwgJnN0YXR1cyk7CisgICAgaWYgKHN0YXR1cy5jYkluUXVlID4gMCkgeworICAgICAgICBzLT5sZW4gPSBzdGF0dXMuY2JJblF1ZTsKKyAgICAgICAgd2luX2Nocl9yZWFkX3BvbGwoY2hyKTsKKyAgICAgICAgd2luX2Nocl9yZWFkKGNocik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl93aW4oUWVtdU9wdHMgKm9wdHMpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBXaW5DaGFyU3RhdGUgKnM7CisKKyAgICBjaHIgPSBnX21hbGxvYzAoc2l6ZW9mKENoYXJEcml2ZXJTdGF0ZSkpOworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFdpbkNoYXJTdGF0ZSkpOworICAgIGNoci0+b3BhcXVlID0gczsKKyAgICBjaHItPmNocl93cml0ZSA9IHdpbl9jaHJfd3JpdGU7CisgICAgY2hyLT5jaHJfY2xvc2UgPSB3aW5fY2hyX2Nsb3NlOworCisgICAgaWYgKHdpbl9jaHJfaW5pdChjaHIsIGZpbGVuYW1lKSA8IDApIHsKKyAgICAgICAgZnJlZShzKTsKKyAgICAgICAgZnJlZShjaHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcWVtdV9jaHJfZ2VuZXJpY19vcGVuKGNocik7CisgICAgcmV0dXJuIGNocjsKK30KKworc3RhdGljIGludCB3aW5fY2hyX3BpcGVfcG9sbCh2b2lkICpvcGFxdWUpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBvcGFxdWU7CisgICAgV2luQ2hhclN0YXRlICpzID0gY2hyLT5vcGFxdWU7CisgICAgRFdPUkQgc2l6ZTsKKworICAgIFBlZWtOYW1lZFBpcGUocy0+aGNvbSwgTlVMTCwgMCwgTlVMTCwgJnNpemUsIE5VTEwpOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBzLT5sZW4gPSBzaXplOworICAgICAgICB3aW5fY2hyX3JlYWRfcG9sbChjaHIpOworICAgICAgICB3aW5fY2hyX3JlYWQoY2hyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdpbl9jaHJfcGlwZV9pbml0KENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBXaW5DaGFyU3RhdGUgKnMgPSBjaHItPm9wYXF1ZTsKKyAgICBPVkVSTEFQUEVEIG92OworICAgIGludCByZXQ7CisgICAgRFdPUkQgc2l6ZTsKKyAgICBjaGFyIG9wZW5uYW1lWzI1Nl07CisKKyAgICBzLT5mcGlwZSA9IFRSVUU7CisKKyAgICBzLT5oc2VuZCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoIXMtPmhzZW5kKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIENyZWF0ZUV2ZW50XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBzLT5ocmVjdiA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICBpZiAoIXMtPmhyZWN2KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIENyZWF0ZUV2ZW50XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHNucHJpbnRmKG9wZW5uYW1lLCBzaXplb2Yob3Blbm5hbWUpLCAiXFxcXC5cXHBpcGVcXCVzIiwgZmlsZW5hbWUpOworICAgIHMtPmhjb20gPSBDcmVhdGVOYW1lZFBpcGUob3Blbm5hbWUsIFBJUEVfQUNDRVNTX0RVUExFWCB8IEZJTEVfRkxBR19PVkVSTEFQUEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX0JZVEUgfCBQSVBFX1JFQURNT0RFX0JZVEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9XQUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYQ09OTkVDVCwgTlNFTkRCVUYsIE5SRUNWQlVGLCBOVElNRU9VVCwgTlVMTCk7CisgICAgaWYgKHMtPmhjb20gPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgQ3JlYXRlTmFtZWRQaXBlICglbHUpXG4iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHMtPmhjb20gPSBOVUxMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgWmVyb01lbW9yeSgmb3YsIHNpemVvZihvdikpOworICAgIG92LmhFdmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKKyAgICByZXQgPSBDb25uZWN0TmFtZWRQaXBlKHMtPmhjb20sICZvdik7CisgICAgaWYgKHJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBDb25uZWN0TmFtZWRQaXBlXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IEdldE92ZXJsYXBwZWRSZXN1bHQocy0+aGNvbSwgJm92LCAmc2l6ZSwgVFJVRSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgR2V0T3ZlcmxhcHBlZFJlc3VsdFxuIik7CisgICAgICAgIGlmIChvdi5oRXZlbnQpIHsKKyAgICAgICAgICAgIENsb3NlSGFuZGxlKG92LmhFdmVudCk7CisgICAgICAgICAgICBvdi5oRXZlbnQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAob3YuaEV2ZW50KSB7CisgICAgICAgIENsb3NlSGFuZGxlKG92LmhFdmVudCk7CisgICAgICAgIG92LmhFdmVudCA9IE5VTEw7CisgICAgfQorICAgIHFlbXVfYWRkX3BvbGxpbmdfY2Iod2luX2Nocl9waXBlX3BvbGwsIGNocik7CisgICAgcmV0dXJuIDA7CisKKyBmYWlsOgorICAgIHdpbl9jaHJfY2xvc2UoY2hyKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl93aW5fcGlwZShRZW11T3B0cyAqb3B0cykKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpOworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworICAgIFdpbkNoYXJTdGF0ZSAqczsKKworICAgIGNociA9IGdfbWFsbG9jMChzaXplb2YoQ2hhckRyaXZlclN0YXRlKSk7CisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoV2luQ2hhclN0YXRlKSk7CisgICAgY2hyLT5vcGFxdWUgPSBzOworICAgIGNoci0+Y2hyX3dyaXRlID0gd2luX2Nocl93cml0ZTsKKyAgICBjaHItPmNocl9jbG9zZSA9IHdpbl9jaHJfY2xvc2U7CisKKyAgICBpZiAod2luX2Nocl9waXBlX2luaXQoY2hyLCBmaWxlbmFtZSkgPCAwKSB7CisgICAgICAgIGZyZWUocyk7CisgICAgICAgIGZyZWUoY2hyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHFlbXVfY2hyX2dlbmVyaWNfb3BlbihjaHIpOworICAgIHJldHVybiBjaHI7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fd2luX2ZpbGUoSEFORExFIGZkX291dCkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNocjsKKyAgICBXaW5DaGFyU3RhdGUgKnM7CisKKyAgICBjaHIgPSBnX21hbGxvYzAoc2l6ZW9mKENoYXJEcml2ZXJTdGF0ZSkpOworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFdpbkNoYXJTdGF0ZSkpOworICAgIHMtPmhjb20gPSBmZF9vdXQ7CisgICAgY2hyLT5vcGFxdWUgPSBzOworICAgIGNoci0+Y2hyX3dyaXRlID0gd2luX2Nocl93cml0ZTsKKyAgICBxZW11X2Nocl9nZW5lcmljX29wZW4oY2hyKTsKKyAgICByZXR1cm4gY2hyOworfQorCitzdGF0aWMgQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX3dpbl9jb24oUWVtdU9wdHMgKm9wdHMpCit7CisgICAgcmV0dXJuIHFlbXVfY2hyX29wZW5fd2luX2ZpbGUoR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSk7Cit9CisKK3N0YXRpYyBDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fd2luX2ZpbGVfb3V0KFFlbXVPcHRzICpvcHRzKQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVfb3V0ID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJwYXRoIik7CisgICAgSEFORExFIGZkX291dDsKKworICAgIGZkX291dCA9IENyZWF0ZUZpbGUoZmlsZV9vdXQsIEdFTkVSSUNfV1JJVEUsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QRU5fQUxXQVlTLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgIGlmIChmZF9vdXQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIHFlbXVfY2hyX29wZW5fd2luX2ZpbGUoZmRfb3V0KTsKK30KKyNlbmRpZiAvKiAhX1dJTjMyICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFVEUCBOZXQgY29uc29sZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZkOworICAgIFNvY2tBZGRyZXNzICBkYWRkcjsKKyAgICB1aW50OF90IGJ1ZltSRUFEX0JVRl9MRU5dOworICAgIGludCBidWZjbnQ7CisgICAgaW50IGJ1ZnB0cjsKKyAgICBpbnQgbWF4X3NpemU7Cit9IE5ldENoYXJEcml2ZXI7CisKK3N0YXRpYyBpbnQgdWRwX2Nocl93cml0ZShDaGFyRHJpdmVyU3RhdGUgKmNociwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIE5ldENoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKworICAgIHJldHVybiBzb2NrZXRfc2VuZHRvKHMtPmZkLCAoY29uc3Qgdm9pZCAqKWJ1ZiwgbGVuLCAmcy0+ZGFkZHIpOworfQorCitzdGF0aWMgaW50IHVkcF9jaHJfcmVhZF9wb2xsKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBOZXRDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisKKyAgICBzLT5tYXhfc2l6ZSA9IHFlbXVfY2hyX2Nhbl9yZWFkKGNocik7CisKKyAgICAvKiBJZiB0aGVyZSB3ZXJlIGFueSBzdHJheSBjaGFyYWN0ZXJzIGluIHRoZSBxdWV1ZSBwcm9jZXNzIHRoZW0KKyAgICAgKiBmaXJzdAorICAgICAqLworICAgIHdoaWxlIChzLT5tYXhfc2l6ZSA+IDAgJiYgcy0+YnVmcHRyIDwgcy0+YnVmY250KSB7CisgICAgICAgIHFlbXVfY2hyX3JlYWQoY2hyLCAmcy0+YnVmW3MtPmJ1ZnB0cl0sIDEpOworICAgICAgICBzLT5idWZwdHIrKzsKKyAgICAgICAgcy0+bWF4X3NpemUgPSBxZW11X2Nocl9jYW5fcmVhZChjaHIpOworICAgIH0KKyAgICByZXR1cm4gcy0+bWF4X3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHVkcF9jaHJfcmVhZCh2b2lkICpvcGFxdWUpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBvcGFxdWU7CisgICAgTmV0Q2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworCisgICAgaWYgKHMtPm1heF9zaXplID09IDApCisgICAgICAgIHJldHVybjsKKyAgICBzLT5idWZjbnQgPSBzb2NrZXRfcmVjdihzLT5mZCwgKHZvaWQgKilzLT5idWYsIHNpemVvZihzLT5idWYpKTsKKyAgICBzLT5idWZwdHIgPSBzLT5idWZjbnQ7CisgICAgaWYgKHMtPmJ1ZmNudCA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBzLT5idWZwdHIgPSAwOworICAgIHdoaWxlIChzLT5tYXhfc2l6ZSA+IDAgJiYgcy0+YnVmcHRyIDwgcy0+YnVmY250KSB7CisgICAgICAgIHFlbXVfY2hyX3JlYWQoY2hyLCAmcy0+YnVmW3MtPmJ1ZnB0cl0sIDEpOworICAgICAgICBzLT5idWZwdHIrKzsKKyAgICAgICAgcy0+bWF4X3NpemUgPSBxZW11X2Nocl9jYW5fcmVhZChjaHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWRwX2Nocl91cGRhdGVfcmVhZF9oYW5kbGVyKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIE5ldENoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKworICAgIGlmIChzLT5mZCA+PSAwKSB7CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHMtPmZkLCB1ZHBfY2hyX3JlYWRfcG9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRwX2Nocl9yZWFkLCBOVUxMLCBjaHIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdWRwX2Nocl9jbG9zZShDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBOZXRDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaWYgKHMtPmZkID49IDApIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHNvY2tldF9jbG9zZShzLT5mZCk7CisgICAgfQorICAgIGdfZnJlZShzKTsKK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl91ZHAoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBOVUxMOworICAgIE5ldENoYXJEcml2ZXIgKnMgPSBOVUxMOworICAgIGludCBmZCA9IC0xOworCisgICAgY2hyID0gZ19tYWxsb2MwKHNpemVvZihDaGFyRHJpdmVyU3RhdGUpKTsKKyAgICBzICAgPSBnX21hbGxvYzAoc2l6ZW9mKE5ldENoYXJEcml2ZXIpKTsKKworICAgIGZkID0gaW5ldF9kZ3JhbV9vcHRzKG9wdHMpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmV0X2RncmFtX29wdHMgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byByZXR1cm5fZXJyOworICAgIH0KKworICAgIHMtPmZkID0gZmQ7CisgICAgcy0+YnVmY250ID0gMDsKKyAgICBzLT5idWZwdHIgPSAwOworICAgIGNoci0+b3BhcXVlID0gczsKKyAgICBjaHItPmNocl93cml0ZSA9IHVkcF9jaHJfd3JpdGU7CisgICAgY2hyLT5jaHJfdXBkYXRlX3JlYWRfaGFuZGxlciA9IHVkcF9jaHJfdXBkYXRlX3JlYWRfaGFuZGxlcjsKKyAgICBjaHItPmNocl9jbG9zZSA9IHVkcF9jaHJfY2xvc2U7CisgICAgcmV0dXJuIGNocjsKKworcmV0dXJuX2VycjoKKyAgICBpZiAoY2hyKQorICAgICAgICBmcmVlKGNocik7CisgICAgaWYgKHMpCisgICAgICAgIGZyZWUocyk7CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVENQIE5ldCBjb25zb2xlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZmQsIGxpc3Rlbl9mZDsKKyAgICBpbnQgY29ubmVjdGVkOworICAgIGludCBtYXhfc2l6ZTsKKyAgICBpbnQgZG9fdGVsbmV0b3B0OworICAgIGludCBkb19ub2RlbGF5OworICAgIGludCBpc191bml4OworICAgIGludCBtc2dmZDsKK30gVENQQ2hhckRyaXZlcjsKKworc3RhdGljIHZvaWQgdGNwX2Nocl9hY2NlcHQodm9pZCAqb3BhcXVlKTsKKworc3RhdGljIGludCB0Y3BfY2hyX3dyaXRlKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgVENQQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworICAgIGlmIChzLT5jb25uZWN0ZWQpIHsKKyAgICAgICAgcmV0dXJuIHNlbmRfYWxsKHMtPmZkLCBidWYsIGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogWFhYOiBpbmRpY2F0ZSBhbiBlcnJvciA/ICovCisgICAgICAgIHJldHVybiBsZW47CisgICAgfQorfQorCitzdGF0aWMgaW50IHRjcF9jaHJfcmVhZF9wb2xsKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBUQ1BDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaWYgKCFzLT5jb25uZWN0ZWQpCisgICAgICAgIHJldHVybiAwOworICAgIHMtPm1heF9zaXplID0gcWVtdV9jaHJfY2FuX3JlYWQoY2hyKTsKKyAgICByZXR1cm4gcy0+bWF4X3NpemU7Cit9CisKKyNkZWZpbmUgSUFDIDI1NQorI2RlZmluZSBJQUNfQlJFQUsgMjQzCitzdGF0aWMgdm9pZCB0Y3BfY2hyX3Byb2Nlc3NfSUFDX2J5dGVzKENoYXJEcml2ZXJTdGF0ZSAqY2hyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1BDaGFyRHJpdmVyICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWYsIGludCAqc2l6ZSkKK3sKKyAgICAvKiBIYW5kbGUgYW55IHRlbG5ldCBjbGllbnQncyBiYXNpYyBJQUMgb3B0aW9ucyB0byBzYXRpc2Z5IGNoYXIgYnkKKyAgICAgKiBjaGFyIG1vZGUgd2l0aCBubyBlY2hvLiAgQWxsIElBQyBvcHRpb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tCisgICAgICogdGhlIGJ1ZiBhbmQgdGhlIGRvX3RlbG5ldG9wdCB2YXJpYWJsZSB3aWxsIGJlIHVzZWQgdG8gdHJhY2sgdGhlCisgICAgICogc3RhdGUgb2YgdGhlIHdpZHRoIG9mIHRoZSBJQUMgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBJQUMgY29tbWFuZHMgY29tZSBpbiBzZXRzIG9mIDMgYnl0ZXMgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQorICAgICAqICJJQUMgQlJFQUsiIGNvbW1hbmQgYW5kIHRoZSBkb3VibGUgSUFDLgorICAgICAqLworCisgICAgaW50IGk7CisgICAgaW50IGogPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8ICpzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmRvX3RlbG5ldG9wdCA+IDEpIHsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilidWZbaV0gPT0gSUFDICYmIHMtPmRvX3RlbG5ldG9wdCA9PSAyKSB7CisgICAgICAgICAgICAgICAgLyogRG91YmxlIElBQyBtZWFucyBzZW5kIGFuIElBQyAqLworICAgICAgICAgICAgICAgIGlmIChqICE9IGkpCisgICAgICAgICAgICAgICAgICAgIGJ1ZltqXSA9IGJ1ZltpXTsKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgICAgcy0+ZG9fdGVsbmV0b3B0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCBjaGFyKWJ1ZltpXSA9PSBJQUNfQlJFQUsgJiYgcy0+ZG9fdGVsbmV0b3B0ID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSGFuZGxlIElBQyBicmVhayBjb21tYW5kcyBieSBzZW5kaW5nIGEgc2VyaWFsIGJyZWFrICovCisgICAgICAgICAgICAgICAgICAgIHFlbXVfY2hyX2V2ZW50KGNociwgQ0hSX0VWRU5UX0JSRUFLKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZG9fdGVsbmV0b3B0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmRvX3RlbG5ldG9wdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmRvX3RlbG5ldG9wdCA+PSA0KSB7CisgICAgICAgICAgICAgICAgcy0+ZG9fdGVsbmV0b3B0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQgY2hhcilidWZbaV0gPT0gSUFDKSB7CisgICAgICAgICAgICAgICAgcy0+ZG9fdGVsbmV0b3B0ID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGogIT0gaSkKKyAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gYnVmW2ldOworICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqc2l6ZSA9IGo7Cit9CisKK3N0YXRpYyBpbnQgdGNwX2dldF9tc2dmZChDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBUQ1BDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGZkID0gcy0+bXNnZmQ7CisgICAgcy0+bXNnZmQgPSAtMTsKKyAgICByZXR1cm4gZmQ7Cit9CisKKyNpZm5kZWYgX1dJTjMyCitzdGF0aWMgdm9pZCB1bml4X3Byb2Nlc3NfbXNnZmQoQ2hhckRyaXZlclN0YXRlICpjaHIsIHN0cnVjdCBtc2doZHIgKm1zZykKK3sKKyAgICBUQ1BDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgc3RydWN0IGNtc2doZHIgKmNtc2c7CisKKyAgICBmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisgICAgICAgIGludCBmZDsKKworICAgICAgICBpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpIHx8CisgICAgICAgICAgICBjbXNnLT5jbXNnX2xldmVsICE9IFNPTF9TT0NLRVQgfHwKKyAgICAgICAgICAgIGNtc2ctPmNtc2dfdHlwZSAhPSBTQ01fUklHSFRTKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZmQgPSAqKChpbnQgKilDTVNHX0RBVEEoY21zZykpOworICAgICAgICBpZiAoZmQgPCAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHMtPm1zZ2ZkICE9IC0xKQorICAgICAgICAgICAgY2xvc2Uocy0+bXNnZmQpOworICAgICAgICBzLT5tc2dmZCA9IGZkOworICAgIH0KK30KKworc3RhdGljIHNzaXplX3QgdGNwX2Nocl9yZWN2KENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgVENQQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworICAgIHN0cnVjdCBtc2doZHIgbXNnID0geyBOVUxMLCB9OworICAgIHN0cnVjdCBpb3ZlYyBpb3ZbMV07CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgY21zZ2hkciBjbXNnOworICAgICAgICBjaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldOworICAgIH0gbXNnX2NvbnRyb2w7CisgICAgc3NpemVfdCByZXQ7CisKKyAgICBpb3ZbMF0uaW92X2Jhc2UgPSBidWY7CisgICAgaW92WzBdLmlvdl9sZW4gPSBsZW47CisKKyAgICBtc2cubXNnX2lvdiA9IGlvdjsKKyAgICBtc2cubXNnX2lvdmxlbiA9IDE7CisgICAgbXNnLm1zZ19jb250cm9sID0gJm1zZ19jb250cm9sOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihtc2dfY29udHJvbCk7CisKKyAgICByZXQgPSByZWN2bXNnKHMtPmZkLCAmbXNnLCAwKTsKKyAgICBpZiAocmV0ID4gMCAmJiBzLT5pc191bml4KQorICAgICAgICB1bml4X3Byb2Nlc3NfbXNnZmQoY2hyLCAmbXNnKTsKKworICAgIHJldHVybiByZXQ7Cit9CisjZWxzZQorc3RhdGljIHNzaXplX3QgdGNwX2Nocl9yZWN2KENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisgICAgVENQQ2hhckRyaXZlciAqcyA9IGNoci0+b3BhcXVlOworICAgIHJldHVybiByZWN2KHMtPmZkLCBidWYsIGxlbiwgMCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGNwX2Nocl9yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBUQ1BDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgdWludDhfdCBidWZbUkVBRF9CVUZfTEVOXTsKKyAgICBpbnQgbGVuLCBzaXplOworCisgICAgaWYgKCFzLT5jb25uZWN0ZWQgfHwgcy0+bWF4X3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIGxlbiA9IHNpemVvZihidWYpOworICAgIGlmIChsZW4gPiBzLT5tYXhfc2l6ZSkKKyAgICAgICAgbGVuID0gcy0+bWF4X3NpemU7CisgICAgc2l6ZSA9IHRjcF9jaHJfcmVjdihjaHIsICh2b2lkICopYnVmLCBsZW4pOworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogY29ubmVjdGlvbiBjbG9zZWQgKi8KKyAgICAgICAgcy0+Y29ubmVjdGVkID0gMDsKKyAgICAgICAgaWYgKHMtPmxpc3Rlbl9mZCA+PSAwKSB7CisgICAgICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmxpc3Rlbl9mZCwgdGNwX2Nocl9hY2NlcHQsIE5VTEwsIGNocik7CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5mZCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHNvY2tldF9jbG9zZShzLT5mZCk7CisgICAgICAgIHMtPmZkID0gLTE7CisgICAgICAgIHFlbXVfY2hyX2V2ZW50KGNociwgQ0hSX0VWRU5UX0NMT1NFRCk7CisgICAgfSBlbHNlIGlmIChzaXplID4gMCkgeworICAgICAgICBpZiAocy0+ZG9fdGVsbmV0b3B0KQorICAgICAgICAgICAgdGNwX2Nocl9wcm9jZXNzX0lBQ19ieXRlcyhjaHIsIHMsIGJ1ZiwgJnNpemUpOworICAgICAgICBpZiAoc2l6ZSA+IDApCisgICAgICAgICAgICBxZW11X2Nocl9yZWFkKGNociwgYnVmLCBzaXplKTsKKyAgICB9Cit9CisKKyNpZm5kZWYgX1dJTjMyCitDaGFyRHJpdmVyU3RhdGUgKnFlbXVfY2hyX29wZW5fZXZlbnRmZChpbnQgZXZlbnRmZCkKK3sKKyAgICByZXR1cm4gcWVtdV9jaHJfb3Blbl9mZChldmVudGZkLCBldmVudGZkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0Y3BfY2hyX2Nvbm5lY3Qodm9pZCAqb3BhcXVlKQoreworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyID0gb3BhcXVlOworICAgIFRDUENoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKworICAgIHMtPmNvbm5lY3RlZCA9IDE7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIocy0+ZmQsIHRjcF9jaHJfcmVhZF9wb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9jaHJfcmVhZCwgTlVMTCwgY2hyKTsKKyAgICBxZW11X2Nocl9nZW5lcmljX29wZW4oY2hyKTsKK30KKworI2RlZmluZSBJQUNTRVQoeCxhLGIsYykgeFswXSA9IGE7IHhbMV0gPSBiOyB4WzJdID0gYzsKK3N0YXRpYyB2b2lkIHRjcF9jaHJfdGVsbmV0X2luaXQoaW50IGZkKQoreworICAgIGNoYXIgYnVmWzNdOworICAgIC8qIFNlbmQgdGhlIHRlbG5ldCBuZWdvdGlvbiB0byBwdXQgdGVsbmV0IGluIGJpbmFyeSwgbm8gZWNobywgc2luZ2xlIGNoYXIgbW9kZSAqLworICAgIElBQ1NFVChidWYsIDB4ZmYsIDB4ZmIsIDB4MDEpOyAgLyogSUFDIFdJTEwgRUNITyAqLworICAgIHNvY2tldF9zZW5kKGZkLCAoY2hhciAqKWJ1ZiwgMyk7CisgICAgSUFDU0VUKGJ1ZiwgMHhmZiwgMHhmYiwgMHgwMyk7ICAvKiBJQUMgV0lMTCBTdXBwcmVzcyBnbyBhaGVhZCAqLworICAgIHNvY2tldF9zZW5kKGZkLCAoY2hhciAqKWJ1ZiwgMyk7CisgICAgSUFDU0VUKGJ1ZiwgMHhmZiwgMHhmYiwgMHgwMCk7ICAvKiBJQUMgV0lMTCBCaW5hcnkgKi8KKyAgICBzb2NrZXRfc2VuZChmZCwgKGNoYXIgKilidWYsIDMpOworICAgIElBQ1NFVChidWYsIDB4ZmYsIDB4ZmQsIDB4MDApOyAgLyogSUFDIERPIEJpbmFyeSAqLworICAgIHNvY2tldF9zZW5kKGZkLCAoY2hhciAqKWJ1ZiwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcF9jaHJfYWNjZXB0KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDaGFyRHJpdmVyU3RhdGUgKmNociA9IG9wYXF1ZTsKKyAgICBUQ1BDaGFyRHJpdmVyICpzID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGZkOworCisgICAgZm9yKDs7KSB7CisgICAgICAgIGZkID0gc29ja2V0X2FjY2VwdChzLT5saXN0ZW5fZmQsIE5VTEwpOworICAgICAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZmQgPj0gMCkgeworICAgICAgICAgICAgaWYgKHMtPmRvX3RlbG5ldG9wdCkKKyAgICAgICAgICAgICAgICB0Y3BfY2hyX3RlbG5ldF9pbml0KGZkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworICAgIGlmIChzLT5kb19ub2RlbGF5KQorICAgICAgICBzb2NrZXRfc2V0X25vZGVsYXkoZmQpOworICAgIHMtPmZkID0gZmQ7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5saXN0ZW5fZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIHRjcF9jaHJfY29ubmVjdChjaHIpOworfQorCitzdGF0aWMgdm9pZCB0Y3BfY2hyX2Nsb3NlKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIFRDUENoYXJEcml2ZXIgKnMgPSBjaHItPm9wYXF1ZTsKKyAgICBpZiAocy0+ZmQgPj0gMCkgeworICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmZkLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgY2xvc2Vzb2NrZXQocy0+ZmQpOworICAgIH0KKyAgICBpZiAocy0+bGlzdGVuX2ZkID49IDApIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcihzLT5saXN0ZW5fZmQsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBjbG9zZXNvY2tldChzLT5saXN0ZW5fZmQpOworICAgIH0KKyAgICBnX2ZyZWUocyk7CisgICAgcWVtdV9jaHJfZXZlbnQoY2hyLCBDSFJfRVZFTlRfQ0xPU0VEKTsKK30KKworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbl9zb2NrZXQoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHIgPSBOVUxMOworICAgIFRDUENoYXJEcml2ZXIgKnMgPSBOVUxMOworICAgIGludCBmZCA9IC0xOworICAgIGludCBpc19saXN0ZW47CisgICAgaW50IGlzX3dhaXRjb25uZWN0OworICAgIGludCBkb19ub2RlbGF5OworICAgIGludCBpc191bml4OworICAgIGludCBpc190ZWxuZXQ7CisKKyAgICBpc19saXN0ZW4gICAgICA9IHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJzZXJ2ZXIiLCAwKTsKKyAgICBpc193YWl0Y29ubmVjdCA9IHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJ3YWl0IiwgMSk7CisgICAgaXNfdGVsbmV0ICAgICAgPSBxZW11X29wdF9nZXRfYm9vbChvcHRzLCAidGVsbmV0IiwgMCk7CisgICAgZG9fbm9kZWxheSAgICAgPSAhcWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgImRlbGF5IiwgMSk7CisgICAgaXNfdW5peCAgICAgICAgPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKSAhPSBOVUxMOworICAgIGlmICghaXNfbGlzdGVuKQorICAgICAgICBpc193YWl0Y29ubmVjdCA9IDA7CisKKyAgICBjaHIgPSBnX21hbGxvYzAoc2l6ZW9mKENoYXJEcml2ZXJTdGF0ZSkpOworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFRDUENoYXJEcml2ZXIpKTsKKworICAgIGlmIChpc191bml4KSB7CisgICAgICAgIGlmIChpc19saXN0ZW4pIHsKKyAgICAgICAgICAgIGZkID0gdW5peF9saXN0ZW5fb3B0cyhvcHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZkID0gdW5peF9jb25uZWN0X29wdHMob3B0cyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNfbGlzdGVuKSB7CisgICAgICAgICAgICBmZCA9IGluZXRfbGlzdGVuX29wdHMob3B0cywgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZCA9IGluZXRfY29ubmVjdF9vcHRzKG9wdHMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmZCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICghaXNfd2FpdGNvbm5lY3QpCisgICAgICAgIHNvY2tldF9zZXRfbm9uYmxvY2soZmQpOworCisgICAgcy0+Y29ubmVjdGVkID0gMDsKKyAgICBzLT5mZCA9IC0xOworICAgIHMtPmxpc3Rlbl9mZCA9IC0xOworICAgIHMtPm1zZ2ZkID0gLTE7CisgICAgcy0+aXNfdW5peCA9IGlzX3VuaXg7CisgICAgcy0+ZG9fbm9kZWxheSA9IGRvX25vZGVsYXkgJiYgIWlzX3VuaXg7CisKKyAgICBjaHItPm9wYXF1ZSA9IHM7CisgICAgY2hyLT5jaHJfd3JpdGUgPSB0Y3BfY2hyX3dyaXRlOworICAgIGNoci0+Y2hyX2Nsb3NlID0gdGNwX2Nocl9jbG9zZTsKKyAgICBjaHItPmdldF9tc2dmZCA9IHRjcF9nZXRfbXNnZmQ7CisKKyAgICBpZiAoaXNfbGlzdGVuKSB7CisgICAgICAgIHMtPmxpc3Rlbl9mZCA9IGZkOworICAgICAgICBxZW11X3NldF9mZF9oYW5kbGVyKHMtPmxpc3Rlbl9mZCwgdGNwX2Nocl9hY2NlcHQsIE5VTEwsIGNocik7CisgICAgICAgIGlmIChpc190ZWxuZXQpCisgICAgICAgICAgICBzLT5kb190ZWxuZXRvcHQgPSAxOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+Y29ubmVjdGVkID0gMTsKKyAgICAgICAgcy0+ZmQgPSBmZDsKKyAgICAgICAgc29ja2V0X3NldF9ub2RlbGF5KGZkKTsKKyAgICAgICAgdGNwX2Nocl9jb25uZWN0KGNocik7CisgICAgfQorCisgICAgLyogZm9yICJpbmZvIGNoYXJkZXYiIG1vbml0b3IgY29tbWFuZCAqLworICAgIGNoci0+ZmlsZW5hbWUgPSBnX21hbGxvYygyNTYpOworICAgIGlmIChpc191bml4KSB7CisgICAgICAgIHNucHJpbnRmKGNoci0+ZmlsZW5hbWUsIDI1NiwgInVuaXg6JXMlcyIsCisgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpLAorICAgICAgICAgICAgICAgICBxZW11X29wdF9nZXRfYm9vbChvcHRzLCAic2VydmVyIiwgMCkgPyAiLHNlcnZlciIgOiAiIik7CisgICAgfSBlbHNlIGlmIChpc190ZWxuZXQpIHsKKyAgICAgICAgc25wcmludGYoY2hyLT5maWxlbmFtZSwgMjU2LCAidGVsbmV0OiVzOiVzJXMiLAorICAgICAgICAgICAgICAgICBxZW11X29wdF9nZXQob3B0cywgImhvc3QiKSwgcWVtdV9vcHRfZ2V0KG9wdHMsICJwb3J0IiksCisgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJzZXJ2ZXIiLCAwKSA/ICIsc2VydmVyIiA6ICIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihjaHItPmZpbGVuYW1lLCAyNTYsICJ0Y3A6JXM6JXMlcyIsCisgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpLCBxZW11X29wdF9nZXQob3B0cywgInBvcnQiKSwKKyAgICAgICAgICAgICAgICAgcWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgInNlcnZlciIsIDApID8gIixzZXJ2ZXIiIDogIiIpOworICAgIH0KKworICAgIGlmIChpc19saXN0ZW4gJiYgaXNfd2FpdGNvbm5lY3QpIHsKKyAgICAgICAgcHJpbnRmKCJRRU1VIHdhaXRpbmcgZm9yIGNvbm5lY3Rpb24gb246ICVzXG4iLAorICAgICAgICAgICAgICAgY2hyLT5maWxlbmFtZSk7CisgICAgICAgIHRjcF9jaHJfYWNjZXB0KGNocik7CisgICAgICAgIHNvY2tldF9zZXRfbm9uYmxvY2socy0+bGlzdGVuX2ZkKTsKKyAgICB9CisgICAgcmV0dXJuIGNocjsKKworIGZhaWw6CisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3Nlc29ja2V0KGZkKTsKKyAgICBnX2ZyZWUocyk7CisgICAgZ19mcmVlKGNocik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1lbW9yeSBjaGFyZGV2ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2l6ZV90IG91dGJ1Zl9zaXplOworICAgIHNpemVfdCBvdXRidWZfY2FwYWNpdHk7CisgICAgdWludDhfdCAqb3V0YnVmOworfSBNZW1vcnlEcml2ZXI7CisKK3N0YXRpYyBpbnQgbWVtX2Nocl93cml0ZShDaGFyRHJpdmVyU3RhdGUgKmNociwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIE1lbW9yeURyaXZlciAqZCA9IGNoci0+b3BhcXVlOworCisgICAgLyogVE9ETzogdGhlIFFTdHJpbmcgaW1wbGVtZW50YXRpb24gaGFzIHRoZSBzYW1lIGNvZGUsIHdlIHNob3VsZAorICAgICAqIGludHJvZHVjZSBhIGdlbmVyaWMgd2F5IHRvIGRvIHRoaXMgaW4gY3V0aWxzLmMgKi8KKyAgICBpZiAoZC0+b3V0YnVmX2NhcGFjaXR5IDwgZC0+b3V0YnVmX3NpemUgKyBsZW4pIHsKKyAgICAgICAgLyogZ3JvdyBvdXRidWYgKi8KKyAgICAgICAgZC0+b3V0YnVmX2NhcGFjaXR5ICs9IGxlbjsKKyAgICAgICAgZC0+b3V0YnVmX2NhcGFjaXR5ICo9IDI7CisgICAgICAgIGQtPm91dGJ1ZiA9IGdfcmVhbGxvYyhkLT5vdXRidWYsIGQtPm91dGJ1Zl9jYXBhY2l0eSk7CisgICAgfQorCisgICAgbWVtY3B5KGQtPm91dGJ1ZiArIGQtPm91dGJ1Zl9zaXplLCBidWYsIGxlbik7CisgICAgZC0+b3V0YnVmX3NpemUgKz0gbGVuOworCisgICAgcmV0dXJuIGxlbjsKK30KKwordm9pZCBxZW11X2Nocl9pbml0X21lbShDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBNZW1vcnlEcml2ZXIgKmQ7CisKKyAgICBkID0gZ19tYWxsb2Moc2l6ZW9mKCpkKSk7CisgICAgZC0+b3V0YnVmX3NpemUgPSAwOworICAgIGQtPm91dGJ1Zl9jYXBhY2l0eSA9IDQwOTY7CisgICAgZC0+b3V0YnVmID0gZ19tYWxsb2MwKGQtPm91dGJ1Zl9jYXBhY2l0eSk7CisKKyAgICBtZW1zZXQoY2hyLCAwLCBzaXplb2YoKmNocikpOworICAgIGNoci0+b3BhcXVlID0gZDsKKyAgICBjaHItPmNocl93cml0ZSA9IG1lbV9jaHJfd3JpdGU7Cit9CisKK1FTdHJpbmcgKnFlbXVfY2hyX21lbV90b19xcyhDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBNZW1vcnlEcml2ZXIgKmQgPSBjaHItPm9wYXF1ZTsKKyAgICByZXR1cm4gcXN0cmluZ19mcm9tX3N1YnN0cigoY2hhciAqKSBkLT5vdXRidWYsIDAsIGQtPm91dGJ1Zl9zaXplIC0gMSk7Cit9CisKKy8qIE5PVEU6IHRoaXMgZHJpdmVyIGNhbiBub3QgYmUgY2xvc2VkIHdpdGggcWVtdV9jaHJfY2xvc2UoKSEgKi8KK3ZvaWQgcWVtdV9jaHJfY2xvc2VfbWVtKENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIE1lbW9yeURyaXZlciAqZCA9IGNoci0+b3BhcXVlOworCisgICAgZ19mcmVlKGQtPm91dGJ1Zik7CisgICAgZ19mcmVlKGNoci0+b3BhcXVlKTsKKyAgICBjaHItPm9wYXF1ZSA9IE5VTEw7CisgICAgY2hyLT5jaHJfd3JpdGUgPSBOVUxMOworfQorCitzaXplX3QgcWVtdV9jaHJfbWVtX29zaXplKGNvbnN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIGNvbnN0IE1lbW9yeURyaXZlciAqZCA9IGNoci0+b3BhcXVlOworICAgIHJldHVybiBkLT5vdXRidWZfc2l6ZTsKK30KKworUWVtdU9wdHMgKnFlbXVfY2hyX3BhcnNlX2NvbXBhdChjb25zdCBjaGFyICpsYWJlbCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgY2hhciBob3N0WzY1XSwgcG9ydFszM10sIHdpZHRoWzhdLCBoZWlnaHRbOF07CisgICAgaW50IHBvczsKKyAgICBjb25zdCBjaGFyICpwOworICAgIFFlbXVPcHRzICpvcHRzOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUocWVtdV9maW5kX29wdHMoImNoYXJkZXYiKSwgbGFiZWwsIDEpOworICAgIGlmIChOVUxMID09IG9wdHMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAibW9uOiIsICZwKSkgeworICAgICAgICBmaWxlbmFtZSA9IHA7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAibXV4IiwgIm9uIik7CisgICAgfQorCisgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgIm51bGwiKSAgICA9PSAwIHx8CisgICAgICAgIHN0cmNtcChmaWxlbmFtZSwgInB0eSIpICAgICA9PSAwIHx8CisgICAgICAgIHN0cmNtcChmaWxlbmFtZSwgIm1zbW91c2UiKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcChmaWxlbmFtZSwgImJyYWlsbGUiKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcChmaWxlbmFtZSwgInN0ZGlvIikgICA9PSAwKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgInZjIiwgJnApKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsICJ2YyIpOworICAgICAgICBpZiAoKnAgPT0gJzonKSB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHArMSwgIiU4WzAtOV14JThbMC05XSIsIHdpZHRoLCBoZWlnaHQpID09IDIpIHsKKyAgICAgICAgICAgICAgICAvKiBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBxZW11X29wdF9zZXQob3B0cywgIndpZHRoIiwgd2lkdGgpOworICAgICAgICAgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaGVpZ2h0IiwgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKHArMSwgIiU4WzAtOV1DeCU4WzAtOV1DIiwgd2lkdGgsIGhlaWdodCkgPT0gMikgeworICAgICAgICAgICAgICAgIC8qIGNoYXJzICovCisgICAgICAgICAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJjb2xzIiwgd2lkdGgpOworICAgICAgICAgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicm93cyIsIGhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0czsKKyAgICB9CisgICAgaWYgKHN0cmNtcChmaWxlbmFtZSwgImNvbjoiKSA9PSAwKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsICJjb25zb2xlIik7CisgICAgICAgIHJldHVybiBvcHRzOworICAgIH0KKyAgICBpZiAoc3Ryc3RhcnQoZmlsZW5hbWUsICJDT00iLCBOVUxMKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAic2VyaWFsIik7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgImZpbGU6IiwgJnApKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsICJmaWxlIik7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHApOworICAgICAgICByZXR1cm4gb3B0czsKKyAgICB9CisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAicGlwZToiLCAmcCkpIHsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJiYWNrZW5kIiwgInBpcGUiKTsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwYXRoIiwgcCk7CisgICAgICAgIHJldHVybiBvcHRzOworICAgIH0KKyAgICBpZiAoc3Ryc3RhcnQoZmlsZW5hbWUsICJ0Y3A6IiwgJnApIHx8CisgICAgICAgIHN0cnN0YXJ0KGZpbGVuYW1lLCAidGVsbmV0OiIsICZwKSkgeworICAgICAgICBpZiAoc3NjYW5mKHAsICIlNjRbXjpdOiUzMlteLF0lbiIsIGhvc3QsIHBvcnQsICZwb3MpIDwgMikgeworICAgICAgICAgICAgaG9zdFswXSA9IDA7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHAsICI6JTMyW14sXSVuIiwgcG9ydCwgJnBvcykgPCAxKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAic29ja2V0Iik7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaG9zdCIsIGhvc3QpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInBvcnQiLCBwb3J0KTsKKyAgICAgICAgaWYgKHBbcG9zXSA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmIChxZW11X29wdHNfZG9fcGFyc2Uob3B0cywgcCtwb3MrMSwgTlVMTCkgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAidGVsbmV0OiIsICZwKSkKKyAgICAgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAidGVsbmV0IiwgIm9uIik7CisgICAgICAgIHJldHVybiBvcHRzOworICAgIH0KKyAgICBpZiAoc3Ryc3RhcnQoZmlsZW5hbWUsICJ1ZHA6IiwgJnApKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsICJ1ZHAiKTsKKyAgICAgICAgaWYgKHNzY2FuZihwLCAiJTY0W146XTolMzJbXkAsXSVuIiwgaG9zdCwgcG9ydCwgJnBvcykgPCAyKSB7CisgICAgICAgICAgICBob3N0WzBdID0gMDsKKyAgICAgICAgICAgIGlmIChzc2NhbmYocCwgIjolMzJbXkAsXSVuIiwgcG9ydCwgJnBvcykgPCAxKSB7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaG9zdCIsIGhvc3QpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInBvcnQiLCBwb3J0KTsKKyAgICAgICAgaWYgKHBbcG9zXSA9PSAnQCcpIHsKKyAgICAgICAgICAgIHAgKz0gcG9zICsgMTsKKyAgICAgICAgICAgIGlmIChzc2NhbmYocCwgIiU2NFteOl06JTMyW14sXSVuIiwgaG9zdCwgcG9ydCwgJnBvcykgPCAyKSB7CisgICAgICAgICAgICAgICAgaG9zdFswXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihwLCAiOiUzMlteLF0lbiIsIHBvcnQsICZwb3MpIDwgMSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJsb2NhbGFkZHIiLCBob3N0KTsKKyAgICAgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAibG9jYWxwb3J0IiwgcG9ydCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorICAgIGlmIChzdHJzdGFydChmaWxlbmFtZSwgInVuaXg6IiwgJnApKSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiYmFja2VuZCIsICJzb2NrZXQiKTsKKyAgICAgICAgaWYgKHFlbXVfb3B0c19kb19wYXJzZShvcHRzLCBwLCAicGF0aCIpICE9IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHJldHVybiBvcHRzOworICAgIH0KKyAgICBpZiAoc3Ryc3RhcnQoZmlsZW5hbWUsICIvZGV2L3BhcnBvcnQiLCBOVUxMKSB8fAorICAgICAgICBzdHJzdGFydChmaWxlbmFtZSwgIi9kZXYvcHBpIiwgTlVMTCkpIHsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJiYWNrZW5kIiwgInBhcnBvcnQiKTsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwYXRoIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gb3B0czsKKyAgICB9CisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiL2Rldi8iLCBOVUxMKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAidHR5Iik7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiZmRwYWlyOiIsICZwKSkgeworICAgICAgICBpbnQgZmRpbiwgZmRvdXQ7CisgICAgICAgIGNoYXIgdGVtcFs4XTsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJiYWNrZW5kIiwgImZkcGFpciIpOworICAgICAgICBpZiAoc3NjYW5mKHAsICIlZCwlZCIsICZmZGluLCAmZmRvdXQpICE9IDIpIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmRpbiA8IDAgfHwgZmRvdXQgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIlZCIsIGZkaW4pOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImZkaW4iLCB0ZW1wKTsKKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIlZCIsIGZkb3V0KTsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJmZG91dCIsIHRlbXApOworICAgICAgICByZXR1cm4gb3B0czsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICJhbmRyb2lkLWttc2ciKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAiYW5kcm9pZC1rbXNnIik7CisgICAgICAgIHJldHVybiBvcHRzOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgImFuZHJvaWQtcWVtdWQiKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAiYW5kcm9pZC1xZW11ZCIpOworICAgICAgICByZXR1cm4gb3B0czsKKyAgICB9CisgICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICJhbmRyb2lkLW1vZGVtIikpIHsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJiYWNrZW5kIiwgImFuZHJvaWQtbW9kZW0iKTsKKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorICAgIGlmICghc3RyY21wKGZpbGVuYW1lLCAiYW5kcm9pZC1ncHMiKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImJhY2tlbmQiLCAiYW5kcm9pZC1ncHMiKTsKKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19BTkRST0lEICovCisKK2ZhaWw6CisgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBDaGFyRHJpdmVyU3RhdGUgKigqb3BlbikoUWVtdU9wdHMgKm9wdHMpOworfSBiYWNrZW5kX3RhYmxlW10gPSB7CisgICAgeyAubmFtZSA9ICJudWxsIiwgICAgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fbnVsbCB9LAorICAgIHsgLm5hbWUgPSAic29ja2V0IiwgICAgLm9wZW4gPSBxZW11X2Nocl9vcGVuX3NvY2tldCB9LAorICAgIHsgLm5hbWUgPSAidWRwIiwgICAgICAgLm9wZW4gPSBxZW11X2Nocl9vcGVuX3VkcCB9LAorICAgIHsgLm5hbWUgPSAibXNtb3VzZSIsICAgLm9wZW4gPSBxZW11X2Nocl9vcGVuX21zbW91c2UgfSwKKyAgICB7IC5uYW1lID0gInZjIiwgICAgICAgIC5vcGVuID0gdGV4dF9jb25zb2xlX2luaXQgfSwKKyNpZmRlZiBfV0lOMzIKKyAgICB7IC5uYW1lID0gImZpbGUiLCAgICAgIC5vcGVuID0gcWVtdV9jaHJfb3Blbl93aW5fZmlsZV9vdXQgfSwKKyAgICB7IC5uYW1lID0gInBpcGUiLCAgICAgIC5vcGVuID0gcWVtdV9jaHJfb3Blbl93aW5fcGlwZSB9LAorICAgIHsgLm5hbWUgPSAiY29uc29sZSIsICAgLm9wZW4gPSBxZW11X2Nocl9vcGVuX3dpbl9jb24gfSwKKyAgICB7IC5uYW1lID0gInNlcmlhbCIsICAgIC5vcGVuID0gcWVtdV9jaHJfb3Blbl93aW4gfSwKKyNlbHNlCisgICAgeyAubmFtZSA9ICJmaWxlIiwgICAgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fZmlsZV9vdXQgfSwKKyAgICB7IC5uYW1lID0gInBpcGUiLCAgICAgIC5vcGVuID0gcWVtdV9jaHJfb3Blbl9waXBlIH0sCisgICAgeyAubmFtZSA9ICJwdHkiLCAgICAgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fcHR5IH0sCisgICAgeyAubmFtZSA9ICJzdGRpbyIsICAgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fc3RkaW8gfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BTkRST0lECisjaWZuZGVmIF9XSU4zMgorICAgIHsgLm5hbWUgPSAiZmRwYWlyIiwgICAgLm9wZW4gPSBxZW11X2Nocl9vcGVuX2ZkcGFpciB9LAorI2VuZGlmCisgICAgeyAubmFtZSA9ICJhbmRyb2lkLXFlbXVkIiwgLm9wZW4gPSBxZW11X2Nocl9vcGVuX2FuZHJvaWRfcWVtdWQgfSwKKyAgICB7IC5uYW1lID0gImFuZHJvaWQta21zZyIsICAub3BlbiA9IHFlbXVfY2hyX29wZW5fYW5kcm9pZF9rbXNnIH0sCisgICAgeyAubmFtZSA9ICJhbmRyb2lkLW1vZGVtIiwgLm9wZW4gPSBxZW11X2Nocl9vcGVuX2FuZHJvaWRfbW9kZW0gfSwKKyAgICB7IC5uYW1lID0gImFuZHJvaWQtZ3BzIiwgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fYW5kcm9pZF9ncHMgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CUkxBUEkKKyAgICB7IC5uYW1lID0gImJyYWlsbGUiLCAgIC5vcGVuID0gY2hyX2JhdW1faW5pdCB9LAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoX19zdW5fXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgXAorICAgIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKSBcCisgICAgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisgICAgeyAubmFtZSA9ICJ0dHkiLCAgICAgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fdHR5IH0sCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKSBcCisgICAgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCisgICAgeyAubmFtZSA9ICJwYXJwb3J0IiwgICAub3BlbiA9IHFlbXVfY2hyX29wZW5fcHAgfSwKKyNlbmRpZgorfTsKKworQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9vcGVuX29wdHMoUWVtdU9wdHMgKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqaW5pdCkoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqcykpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHI7CisgICAgaW50IGk7CisKKyAgICBpZiAocWVtdV9vcHRzX2lkKG9wdHMpID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjaGFyZGV2OiBubyBpZCBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocWVtdV9vcHRfZ2V0KG9wdHMsICJiYWNrZW5kIikgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoYXJkZXY6IFwiJXNcIiBtaXNzaW5nIGJhY2tlbmRcbiIsCisgICAgICAgICAgICAgICAgcWVtdV9vcHRzX2lkKG9wdHMpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUFSUkFZX1NJWkUoYmFja2VuZF90YWJsZSk7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKGJhY2tlbmRfdGFibGVbaV0ubmFtZSwgcWVtdV9vcHRfZ2V0KG9wdHMsICJiYWNrZW5kIikpID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPT0gQVJSQVlfU0laRShiYWNrZW5kX3RhYmxlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoYXJkZXY6IGJhY2tlbmQgXCIlc1wiIG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICBxZW11X29wdF9nZXQob3B0cywgImJhY2tlbmQiKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNociA9IGJhY2tlbmRfdGFibGVbaV0ub3BlbihvcHRzKTsKKyAgICBpZiAoIWNocikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoYXJkZXY6IG9wZW5pbmcgYmFja2VuZCBcIiVzXCIgZmFpbGVkXG4iLAorICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiYmFja2VuZCIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFjaHItPmZpbGVuYW1lKQorICAgICAgICBjaHItPmZpbGVuYW1lID0gZ19zdHJkdXAocWVtdV9vcHRfZ2V0KG9wdHMsICJiYWNrZW5kIikpOworICAgIGNoci0+aW5pdCA9IGluaXQ7CisgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZjaGFyZGV2cywgY2hyLCBuZXh0KTsKKworICAgIGlmIChxZW11X29wdF9nZXRfYm9vbChvcHRzLCAibXV4IiwgMCkpIHsKKyAgICAgICAgQ2hhckRyaXZlclN0YXRlICpiYXNlID0gY2hyOworICAgICAgICBpbnQgbGVuID0gc3RybGVuKHFlbXVfb3B0c19pZChvcHRzKSkgKyA2OworICAgICAgICBiYXNlLT5sYWJlbCA9IGdfbWFsbG9jKGxlbik7CisgICAgICAgIHNucHJpbnRmKGJhc2UtPmxhYmVsLCBsZW4sICIlcy1iYXNlIiwgcWVtdV9vcHRzX2lkKG9wdHMpKTsKKyAgICAgICAgY2hyID0gcWVtdV9jaHJfb3Blbl9tdXgoYmFzZSk7CisgICAgICAgIGNoci0+ZmlsZW5hbWUgPSBiYXNlLT5maWxlbmFtZTsKKyAgICAgICAgY2hyLT5hdmFpbF9jb25uZWN0aW9ucyA9IE1BWF9NVVg7CisgICAgICAgIFFUQUlMUV9JTlNFUlRfVEFJTCgmY2hhcmRldnMsIGNociwgbmV4dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hyLT5hdmFpbF9jb25uZWN0aW9ucyA9IDE7CisgICAgfQorICAgIGNoci0+bGFiZWwgPSBnX3N0cmR1cChxZW11X29wdHNfaWQob3B0cykpOworICAgIHJldHVybiBjaHI7Cit9CisKK0NoYXJEcml2ZXJTdGF0ZSAqcWVtdV9jaHJfb3Blbihjb25zdCBjaGFyICpsYWJlbCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKCppbml0KShzdHJ1Y3QgQ2hhckRyaXZlclN0YXRlICpzKSkKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworICAgIFFlbXVPcHRzICpvcHRzOworCisgICAgaWYgKHN0cnN0YXJ0KGZpbGVuYW1lLCAiY2hhcmRldjoiLCAmcCkpIHsKKyAgICAgICAgcmV0dXJuIHFlbXVfY2hyX2ZpbmQocCk7CisgICAgfQorCisgICAgb3B0cyA9IHFlbXVfY2hyX3BhcnNlX2NvbXBhdChsYWJlbCwgZmlsZW5hbWUpOworICAgIGlmICghb3B0cykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjaHIgPSBxZW11X2Nocl9vcGVuX29wdHMob3B0cywgaW5pdCk7CisgICAgaWYgKGNociAmJiBxZW11X29wdF9nZXRfYm9vbChvcHRzLCAibXV4IiwgMCkpIHsKKyAgICAgICAgbW9uaXRvcl9pbml0KGNociwgTU9OSVRPUl9VU0VfUkVBRExJTkUpOworICAgIH0KKyAgICBxZW11X29wdHNfZGVsKG9wdHMpOworICAgIHJldHVybiBjaHI7Cit9CisKK3ZvaWQgcWVtdV9jaHJfc2V0X2VjaG8oc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBib29sIGVjaG8pCit7CisgICAgaWYgKGNoci0+Y2hyX3NldF9lY2hvKSB7CisgICAgICAgIGNoci0+Y2hyX3NldF9lY2hvKGNociwgZWNobyk7CisgICAgfQorfQorCit2b2lkIHFlbXVfY2hyX2d1ZXN0X29wZW4oc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIGlmIChjaHItPmNocl9ndWVzdF9vcGVuKSB7CisgICAgICAgIGNoci0+Y2hyX2d1ZXN0X29wZW4oY2hyKTsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9jaHJfZ3Vlc3RfY2xvc2Uoc3RydWN0IENoYXJEcml2ZXJTdGF0ZSAqY2hyKQoreworICAgIGlmIChjaHItPmNocl9ndWVzdF9jbG9zZSkgeworICAgICAgICBjaHItPmNocl9ndWVzdF9jbG9zZShjaHIpOworICAgIH0KK30KKwordm9pZCBxZW11X2Nocl9jbG9zZShDaGFyRHJpdmVyU3RhdGUgKmNocikKK3sKKyAgICBRVEFJTFFfUkVNT1ZFKCZjaGFyZGV2cywgY2hyLCBuZXh0KTsKKyAgICBpZiAoY2hyLT5jaHJfY2xvc2UpCisgICAgICAgIGNoci0+Y2hyX2Nsb3NlKGNocik7CisgICAgZ19mcmVlKGNoci0+ZmlsZW5hbWUpOworICAgIGdfZnJlZShjaHItPmxhYmVsKTsKKyAgICBnX2ZyZWUoY2hyKTsKK30KKworc3RhdGljIHZvaWQgcWVtdV9jaHJfcWxpc3RfaXRlcihRT2JqZWN0ICpvYmosIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRGljdCAqY2hyX2RpY3Q7CisgICAgTW9uaXRvciAqbW9uID0gb3BhcXVlOworCisgICAgY2hyX2RpY3QgPSBxb2JqZWN0X3RvX3FkaWN0KG9iaik7CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJXM6IGZpbGVuYW1lPSVzXG4iLCBxZGljdF9nZXRfc3RyKGNocl9kaWN0LCAibGFiZWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWRpY3RfZ2V0X3N0cihjaHJfZGljdCwgImZpbGVuYW1lIikpOworfQorCit2b2lkIHFlbXVfY2hyX2luZm9fcHJpbnQoTW9uaXRvciAqbW9uLCBjb25zdCBRT2JqZWN0ICpyZXRfZGF0YSkKK3sKKyAgICBxbGlzdF9pdGVyKHFvYmplY3RfdG9fcWxpc3QocmV0X2RhdGEpLCBxZW11X2Nocl9xbGlzdF9pdGVyLCBtb24pOworfQorCit2b2lkIHFlbXVfY2hyX2luZm8oTW9uaXRvciAqbW9uLCBRT2JqZWN0ICoqcmV0X2RhdGEpCit7CisgICAgUUxpc3QgKmNocl9saXN0OworICAgIENoYXJEcml2ZXJTdGF0ZSAqY2hyOworCisgICAgY2hyX2xpc3QgPSBxbGlzdF9uZXcoKTsKKworICAgIFFUQUlMUV9GT1JFQUNIKGNociwgJmNoYXJkZXZzLCBuZXh0KSB7CisgICAgICAgIFFPYmplY3QgKm9iaiA9IHFvYmplY3RfZnJvbV9qc29uZigieyAnbGFiZWwnOiAlcywgJ2ZpbGVuYW1lJzogJXMgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHItPmxhYmVsLCBjaHItPmZpbGVuYW1lKTsKKyAgICAgICAgcWxpc3RfYXBwZW5kX29iaihjaHJfbGlzdCwgb2JqKTsKKyAgICB9CisKKyAgICAqcmV0X2RhdGEgPSBRT0JKRUNUKGNocl9saXN0KTsKK30KKworQ2hhckRyaXZlclN0YXRlICpxZW11X2Nocl9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHI7CisKKyAgICBRVEFJTFFfRk9SRUFDSChjaHIsICZjaGFyZGV2cywgbmV4dCkgeworICAgICAgICBpZiAoc3RyY21wKGNoci0+bGFiZWwsIG5hbWUpICE9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIGNocjsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FlbXUtbG9nLmMgYi9hbmRyb2lkL3FlbXUxL3FlbXUtbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2ZjZmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcWVtdS1sb2cuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIExvZ2dpbmcgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvbG9nLmgiCisKK3N0YXRpYyBjaGFyICpsb2dmaWxlbmFtZTsKK0ZJTEUgKnFlbXVfbG9nZmlsZTsKK2ludCBxZW11X2xvZ2xldmVsOworc3RhdGljIGludCBsb2dfYXBwZW5kID0gMDsKKwordm9pZCBxZW11X2xvZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgaWYgKHFlbXVfbG9nZmlsZSkgeworICAgICAgICB2ZnByaW50ZihxZW11X2xvZ2ZpbGUsIGZtdCwgYXApOworICAgIH0KKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIHFlbXVfbG9nX21hc2soaW50IG1hc2ssIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBpZiAoKHFlbXVfbG9nbGV2ZWwgJiBtYXNrKSAmJiBxZW11X2xvZ2ZpbGUpIHsKKyAgICAgICAgdmZwcmludGYocWVtdV9sb2dmaWxlLCBmbXQsIGFwKTsKKyAgICB9CisgICAgdmFfZW5kKGFwKTsKK30KKworLyogZW5hYmxlIG9yIGRpc2FibGUgbG93IGxldmVscyBsb2cgKi8KK3ZvaWQgZG9fcWVtdV9zZXRfbG9nKGludCBsb2dfZmxhZ3MsIGJvb2wgdXNlX293bl9idWZmZXJzKQoreworICAgIHFlbXVfbG9nbGV2ZWwgPSBsb2dfZmxhZ3M7CisgICAgaWYgKHFlbXVfbG9nbGV2ZWwgJiYgIXFlbXVfbG9nZmlsZSkgeworICAgICAgICBpZiAobG9nZmlsZW5hbWUpIHsKKyAgICAgICAgICAgIHFlbXVfbG9nZmlsZSA9IGZvcGVuKGxvZ2ZpbGVuYW1lLCBsb2dfYXBwZW5kID8gImEiIDogInciKTsKKyAgICAgICAgICAgIGlmICghcWVtdV9sb2dmaWxlKSB7CisgICAgICAgICAgICAgICAgcGVycm9yKGxvZ2ZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBfZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gc3RkZXJyIGlmIG5vIGxvZyBmaWxlIHNwZWNpZmllZCAqLworICAgICAgICAgICAgcWVtdV9sb2dmaWxlID0gc3RkZXJyOworICAgICAgICB9CisgICAgICAgIC8qIG11c3QgYXZvaWQgbW1hcCgpIHVzYWdlIG9mIGdsaWJjIGJ5IHNldHRpbmcgYSBidWZmZXIgImJ5IGhhbmQiICovCisgICAgICAgIGlmICh1c2Vfb3duX2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIHN0YXRpYyBjaGFyIGxvZ2ZpbGVfYnVmWzQwOTZdOworCisgICAgICAgICAgICBzZXR2YnVmKHFlbXVfbG9nZmlsZSwgbG9nZmlsZV9idWYsIF9JT0xCRiwgc2l6ZW9mKGxvZ2ZpbGVfYnVmKSk7CisgICAgICAgIH0gZWxzZSB7CisjaWYgZGVmaW5lZChfV0lOMzIpCisgICAgICAgICAgICAvKiBXaW4zMiBkb2Vzbid0IHN1cHBvcnQgbGluZS1idWZmZXJpbmcsIHNvIHVzZSB1bmJ1ZmZlcmVkIG91dHB1dC4gKi8KKyAgICAgICAgICAgIHNldHZidWYocWVtdV9sb2dmaWxlLCBOVUxMLCBfSU9OQkYsIDApOworI2Vsc2UKKyAgICAgICAgICAgIHNldHZidWYocWVtdV9sb2dmaWxlLCBOVUxMLCBfSU9MQkYsIDApOworI2VuZGlmCisgICAgICAgICAgICBsb2dfYXBwZW5kID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXFlbXVfbG9nbGV2ZWwgJiYgcWVtdV9sb2dmaWxlKSB7CisgICAgICAgIHFlbXVfbG9nX2Nsb3NlKCk7CisgICAgfQorfQorCit2b2lkIHFlbXVfc2V0X2xvZ19maWxlbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBnX2ZyZWUobG9nZmlsZW5hbWUpOworICAgIGxvZ2ZpbGVuYW1lID0gZ19zdHJkdXAoZmlsZW5hbWUpOworICAgIHFlbXVfbG9nX2Nsb3NlKCk7CisgICAgcWVtdV9zZXRfbG9nKHFlbXVfbG9nbGV2ZWwpOworfQorCitjb25zdCBRRU1VTG9nSXRlbSBxZW11X2xvZ19pdGVtc1tdID0geworICAgIHsgQ1BVX0xPR19UQl9PVVRfQVNNLCAib3V0X2FzbSIsCisgICAgICAic2hvdyBnZW5lcmF0ZWQgaG9zdCBhc3NlbWJseSBjb2RlIGZvciBlYWNoIGNvbXBpbGVkIFRCIiB9LAorICAgIHsgQ1BVX0xPR19UQl9JTl9BU00sICJpbl9hc20iLAorICAgICAgInNob3cgdGFyZ2V0IGFzc2VtYmx5IGNvZGUgZm9yIGVhY2ggY29tcGlsZWQgVEIiIH0sCisgICAgeyBDUFVfTE9HX1RCX09QLCAib3AiLAorICAgICAgInNob3cgbWljcm8gb3BzIGZvciBlYWNoIGNvbXBpbGVkIFRCIiB9LAorICAgIHsgQ1BVX0xPR19UQl9PUF9PUFQsICJvcF9vcHQiLAorICAgICAgInNob3cgbWljcm8gb3BzICh4ODYgb25seTogYmVmb3JlIGVmbGFncyBvcHRpbWl6YXRpb24pIGFuZFxuIgorICAgICAgImFmdGVyIGxpdmVuZXNzIGFuYWx5c2lzIiB9LAorICAgIHsgQ1BVX0xPR19JTlQsICJpbnQiLAorICAgICAgInNob3cgaW50ZXJydXB0cy9leGNlcHRpb25zIGluIHNob3J0IGZvcm1hdCIgfSwKKyAgICB7IENQVV9MT0dfRVhFQywgImV4ZWMiLAorICAgICAgInNob3cgdHJhY2UgYmVmb3JlIGVhY2ggZXhlY3V0ZWQgVEIgKGxvdHMgb2YgbG9ncykiIH0sCisgICAgeyBDUFVfTE9HX1RCX0NQVSwgImNwdSIsCisgICAgICAic2hvdyBDUFUgc3RhdGUgYmVmb3JlIGJsb2NrIHRyYW5zbGF0aW9uIiB9LAorICAgIHsgQ1BVX0xPR19QQ0FMTCwgInBjYWxsIiwKKyAgICAgICJ4ODYgb25seTogc2hvdyBwcm90ZWN0ZWQgbW9kZSBmYXIgY2FsbHMvcmV0dXJucy9leGNlcHRpb25zIiB9LAorICAgIHsgQ1BVX0xPR19SRVNFVCwgImNwdV9yZXNldCIsCisgICAgICAieDg2IG9ubHk6IHNob3cgQ1BVIHN0YXRlIGJlZm9yZSBDUFUgcmVzZXRzIiB9LAorICAgIHsgQ1BVX0xPR19JT1BPUlQsICJpb3BvcnQiLAorICAgICAgInNob3cgYWxsIGkvbyBwb3J0cyBhY2Nlc3NlcyIgfSwKKyAgICB7IExPR19VTklNUCwgInVuaW1wIiwKKyAgICAgICJsb2cgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbmFsaXR5IiB9LAorICAgIHsgTE9HX0dVRVNUX0VSUk9SLCAiZ3Vlc3RfZXJyb3JzIiwKKyAgICAgICJsb2cgd2hlbiB0aGUgZ3Vlc3QgT1MgZG9lcyBzb21ldGhpbmcgaW52YWxpZCAoZWcgYWNjZXNzaW5nIGFcbiIKKyAgICAgICJub24tZXhpc3RlbnQgcmVnaXN0ZXIpIiB9LAorICAgIHsgMCwgTlVMTCwgTlVMTCB9LAorfTsKKworc3RhdGljIGludCBjbXAxKGNvbnN0IGNoYXIgKnMxLCBpbnQgbiwgY29uc3QgY2hhciAqczIpCit7CisgICAgaWYgKHN0cmxlbihzMikgIT0gKHNpemVfdCluKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbWVtY21wKHMxLCBzMiwgbikgPT0gMDsKK30KKworLyogdGFrZXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBsb2cgbWFza3MuIFJldHVybiAwIGlmIGVycm9yLiAqLworaW50IHFlbXVfc3RyX3RvX2xvZ19tYXNrKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBRRU1VTG9nSXRlbSAqaXRlbTsKKyAgICBpbnQgbWFzazsKKyAgICBjb25zdCBjaGFyICpwLCAqcDE7CisKKyAgICBwID0gc3RyOworICAgIG1hc2sgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgcDEgPSBzdHJjaHIocCwgJywnKTsKKyAgICAgICAgaWYgKCFwMSkgeworICAgICAgICAgICAgcDEgPSBwICsgc3RybGVuKHApOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAxKHAscDEtcCwiYWxsIikpIHsKKyAgICAgICAgICAgIGZvciAoaXRlbSA9IHFlbXVfbG9nX2l0ZW1zOyBpdGVtLT5tYXNrICE9IDA7IGl0ZW0rKykgeworICAgICAgICAgICAgICAgIG1hc2sgfD0gaXRlbS0+bWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaXRlbSA9IHFlbXVfbG9nX2l0ZW1zOyBpdGVtLT5tYXNrICE9IDA7IGl0ZW0rKykgeworICAgICAgICAgICAgICAgIGlmIChjbXAxKHAsIHAxIC0gcCwgaXRlbS0+bmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIGZvdW5kOgorICAgICAgICBtYXNrIHw9IGl0ZW0tPm1hc2s7CisgICAgICAgIGlmICgqcDEgIT0gJywnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwID0gcDEgKyAxOworICAgIH0KKyAgICByZXR1cm4gbWFzazsKK30KKwordm9pZCBxZW11X3ByaW50X2xvZ191c2FnZShGSUxFICpmKQoreworICAgIGNvbnN0IFFFTVVMb2dJdGVtICppdGVtOworICAgIGZwcmludGYoZiwgIkxvZyBpdGVtcyAoY29tbWEgc2VwYXJhdGVkKTpcbiIpOworICAgIGZvciAoaXRlbSA9IHFlbXVfbG9nX2l0ZW1zOyBpdGVtLT5tYXNrICE9IDA7IGl0ZW0rKykgeworICAgICAgICBmcHJpbnRmKGYsICIlLTEwcyAlc1xuIiwgaXRlbS0+bmFtZSwgaXRlbS0+aGVscCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9xZW11LW9wdGlvbnMuaCBiL2FuZHJvaWQvcWVtdTEvcWVtdS1vcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzOGY5MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcWVtdS1vcHRpb25zLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIHFlbXUtb3B0aW9ucy5oCisgKgorICogRGVmaW5lcyBuZWVkZWQgZm9yIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwcm9jZXNzaW5nLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDEwIEplcyBTb3JlbnNlbiA8SmVzLlNvcmVuc2VuQHJlZGhhdC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX1FFTVVfT1BUSU9OU19IXworI2RlZmluZSBfUUVNVV9PUFRJT05TX0hfCisKK2VudW0geworI2RlZmluZSBERUYob3B0aW9uLCBvcHRfYXJnLCBvcHRfZW51bSwgb3B0X2hlbHApICAgICBcCisgICAgb3B0X2VudW0sCisjZGVmaW5lIERFRkhFQURJTkcodGV4dCkKKyNpbmNsdWRlICJxZW11LW9wdGlvbnMuZGVmIgorI3VuZGVmIERFRgorI3VuZGVmIERFRkhFQURJTkcKKyN1bmRlZiBHRU5fRE9DUworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FlbXUtb3B0aW9ucy5oeCBiL2FuZHJvaWQvcWVtdTEvcWVtdS1vcHRpb25zLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzI4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3FlbXUtb3B0aW9ucy5oeApAQCAtMCwwICsxLDE3NjYgQEAKK0hYQ09NTSBVc2UgREVGSEVBRElORygpIHRvIGRlZmluZSBoZWFkaW5ncyBpbiBib3RoIGhlbHAgdGV4dCBhbmQgdGV4aQorSFhDT01NIFRleHQgYmV0d2VlbiBTVEVYSSBhbmQgRVRFWEkgYXJlIGNvcGllZCB0byB0ZXhpIHZlcnNpb24gYW5kCitIWENPTU0gZGlzY2FyZGVkIGZyb20gQyB2ZXJzaW9uCitIWENPTU0gREVGKG9wdGlvbiwgSEFTX0FSRy8wLCBvcHRfZW51bSwgb3B0X2hlbHApIGlzIHVzZWQgdG8gY29uc3RydWN0CitIWENPTU0gb3B0aW9uIHN0cnVjdHVyZXMsIGVudW1zIGFuZCBoZWxwIG1lc3NhZ2UuCitIWENPTU0gSFhDT01NIGNhbiBiZSB1c2VkIGZvciBjb21tZW50cywgZGlzY2FyZGVkIGZyb20gYm90aCB0ZXhpIGFuZCBDCisKK0RFRkhFQURJTkcoU3RhbmRhcmQgb3B0aW9uczopCitTVEVYSQorQHRhYmxlIEBvcHRpb24KK0VURVhJCisKK0RFRigiaGVscCIsIDAsIFFFTVVfT1BUSU9OX2gsCisgICAgIi1oIG9yIC1oZWxwICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIikKK1NURVhJCitAaXRlbSAtaAorRGlzcGxheSBoZWxwIGFuZCBleGl0CitFVEVYSQorCitERUYoInZlcnNpb24iLCAwLCBRRU1VX09QVElPTl92ZXJzaW9uLAorICAgICItdmVyc2lvbiAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0XG4iKQorU1RFWEkKK0BpdGVtIC12ZXJzaW9uCitEaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKK0VURVhJCisKK0RFRigiTSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX00sCisgICAgIi1NIG1hY2hpbmUgICAgICBzZWxlY3QgZW11bGF0ZWQgbWFjaGluZSAoLU0gPyBmb3IgbGlzdClcbiIpCitTVEVYSQorQGl0ZW0gLU0gQHZhcnttYWNoaW5lfQorU2VsZWN0IHRoZSBlbXVsYXRlZCBAdmFye21hY2hpbmV9IChAY29kZXstTSA/fSBmb3IgbGlzdCkKK0VURVhJCisKK0RFRigiY3B1IiwgSEFTX0FSRywgUUVNVV9PUFRJT05fY3B1LAorICAgICItY3B1IGNwdSAgICAgICAgc2VsZWN0IENQVSAoLWNwdSA/IGZvciBsaXN0KVxuIikKK1NURVhJCitAaXRlbSAtY3B1IEB2YXJ7bW9kZWx9CitTZWxlY3QgQ1BVIG1vZGVsICgtY3B1ID8gZm9yIGxpc3QgYW5kIGFkZGl0aW9uYWwgZmVhdHVyZSBzZWxlY3Rpb24pCitFVEVYSQorCitERUYoInNtcCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3NtcCwKKyAgICAiLXNtcCBuICAgICAgICAgIHNldCB0aGUgbnVtYmVyIG9mIENQVXMgdG8gJ24nIFtkZWZhdWx0PTFdXG4iKQorU1RFWEkKK0BpdGVtIC1zbXAgQHZhcntufQorU2ltdWxhdGUgYW4gU01QIHN5c3RlbSB3aXRoIEB2YXJ7bn0gQ1BVcy4gT24gdGhlIFBDIHRhcmdldCwgdXAgdG8gMjU1CitDUFVzIGFyZSBzdXBwb3J0ZWQuIE9uIFNwYXJjMzIgdGFyZ2V0LCBMaW51eCBsaW1pdHMgdGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcwordG8gNC4KK0VURVhJCisKK0RFRigibnVtYSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX251bWEsCisgICAgIi1udW1hIG5vZGVbLG1lbT1zaXplXVssY3B1cz1jcHVbLWNwdV1dWyxub2RlaWQ9bm9kZV1cbiIpCitTVEVYSQorQGl0ZW0gLW51bWEgQHZhcntvcHRzfQorU2ltdWxhdGUgYSBtdWx0aSBub2RlIE5VTUEgc3lzdGVtLiBJZiBtZW0gYW5kIGNwdXMgYXJlIG9taXR0ZWQsIHJlc291cmNlcworYXJlIHNwbGl0IGVxdWFsbHkuCitFVEVYSQorCitERUYoImZkYSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2ZkYSwKKyAgICAiLWZkYS8tZmRiIGZpbGUgIHVzZSAnZmlsZScgYXMgZmxvcHB5IGRpc2sgMC8xIGltYWdlXG4iKQorREVGKCJmZGIiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9mZGIsICIiKQorU1RFWEkKK0BpdGVtIC1mZGEgQHZhcntmaWxlfQorQGl0ZW0gLWZkYiBAdmFye2ZpbGV9CitVc2UgQHZhcntmaWxlfSBhcyBmbG9wcHkgZGlzayAwLzEgaW1hZ2UgKEBweHJlZntkaXNrX2ltYWdlc30pLiBZb3UgY2FuCit1c2UgdGhlIGhvc3QgZmxvcHB5IGJ5IHVzaW5nIEBmaWxley9kZXYvZmQwfSBhcyBmaWxlbmFtZSAoQHB4cmVme2hvc3RfZHJpdmVzfSkuCitFVEVYSQorCitERUYoImhkYSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2hkYSwKKyAgICAiLWhkYS8taGRiIGZpbGUgIHVzZSAnZmlsZScgYXMgSURFIGhhcmQgZGlzayAwLzEgaW1hZ2VcbiIpCitERUYoImhkYiIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2hkYiwgIiIpCitERUYoImhkYyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2hkYywKKyAgICAiLWhkYy8taGRkIGZpbGUgIHVzZSAnZmlsZScgYXMgSURFIGhhcmQgZGlzayAyLzMgaW1hZ2VcbiIpCitERUYoImhkZCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2hkZCwgIiIpCitTVEVYSQorQGl0ZW0gLWhkYSBAdmFye2ZpbGV9CitAaXRlbSAtaGRiIEB2YXJ7ZmlsZX0KK0BpdGVtIC1oZGMgQHZhcntmaWxlfQorQGl0ZW0gLWhkZCBAdmFye2ZpbGV9CitVc2UgQHZhcntmaWxlfSBhcyBoYXJkIGRpc2sgMCwgMSwgMiBvciAzIGltYWdlIChAcHhyZWZ7ZGlza19pbWFnZXN9KS4KK0VURVhJCisKK0RFRigiY2Ryb20iLCBIQVNfQVJHLCBRRU1VX09QVElPTl9jZHJvbSwKKyAgICAiLWNkcm9tIGZpbGUgICAgIHVzZSAnZmlsZScgYXMgSURFIGNkcm9tIGltYWdlIChjZHJvbSBpcyBpZGUxIG1hc3RlcilcbiIpCitTVEVYSQorQGl0ZW0gLWNkcm9tIEB2YXJ7ZmlsZX0KK1VzZSBAdmFye2ZpbGV9IGFzIENELVJPTSBpbWFnZSAoeW91IGNhbm5vdCB1c2UgQG9wdGlvbnstaGRjfSBhbmQKK0BvcHRpb257LWNkcm9tfSBhdCB0aGUgc2FtZSB0aW1lKS4gWW91IGNhbiB1c2UgdGhlIGhvc3QgQ0QtUk9NIGJ5Cit1c2luZyBAZmlsZXsvZGV2L2Nkcm9tfSBhcyBmaWxlbmFtZSAoQHB4cmVme2hvc3RfZHJpdmVzfSkuCitFVEVYSQorCitERUYoImRyaXZlIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fZHJpdmUsCisgICAgIi1kcml2ZSBbZmlsZT1maWxlXVssaWY9dHlwZV1bLGJ1cz1uXVssdW5pdD1tXVssbWVkaWE9ZF1bLGluZGV4PWldXG4iCisgICAgIiAgICAgICBbLGN5bHM9YyxoZWFkcz1oLHNlY3M9c1ssdHJhbnM9dF1dWyxzbmFwc2hvdD1vbnxvZmZdXG4iCisgICAgIiAgICAgICBbLGNhY2hlPXdyaXRldGhyb3VnaHx3cml0ZWJhY2t8bm9uZV1bLGZvcm1hdD1mXVssc2VyaWFsPXNdXG4iCisgICAgIiAgICAgICAgICAgICAgICB1c2UgJ2ZpbGUnIGFzIGEgZHJpdmUgaW1hZ2VcbiIpCitTVEVYSQorQGl0ZW0gLWRyaXZlIEB2YXJ7b3B0aW9ufVssQHZhcntvcHRpb259WyxAdmFye29wdGlvbn1bLC4uLl1dXQorCitEZWZpbmUgYSBuZXcgZHJpdmUuIFZhbGlkIG9wdGlvbnMgYXJlOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIGZpbGU9QHZhcntmaWxlfQorVGhpcyBvcHRpb24gZGVmaW5lcyB3aGljaCBkaXNrIGltYWdlIChAcHhyZWZ7ZGlza19pbWFnZXN9KSB0byB1c2Ugd2l0aAordGhpcyBkcml2ZS4gSWYgdGhlIGZpbGVuYW1lIGNvbnRhaW5zIGNvbW1hLCB5b3UgbXVzdCBkb3VibGUgaXQKKyhmb3IgaW5zdGFuY2UsICJmaWxlPW15LCxmaWxlIiB0byB1c2UgZmlsZSAibXksZmlsZSIpLgorQGl0ZW0gaWY9QHZhcntpbnRlcmZhY2V9CitUaGlzIG9wdGlvbiBkZWZpbmVzIG9uIHdoaWNoIHR5cGUgb24gaW50ZXJmYWNlIHRoZSBkcml2ZSBpcyBjb25uZWN0ZWQuCitBdmFpbGFibGUgdHlwZXMgYXJlOiBpZGUsIHNjc2ksIHNkLCBtdGQsIGZsb3BweSwgcGZsYXNoLCB2aXJ0aW8uCitAaXRlbSBidXM9QHZhcntidXN9LHVuaXQ9QHZhcnt1bml0fQorVGhlc2Ugb3B0aW9ucyBkZWZpbmUgd2hlcmUgaXMgY29ubmVjdGVkIHRoZSBkcml2ZSBieSBkZWZpbmluZyB0aGUgYnVzIG51bWJlciBhbmQKK3RoZSB1bml0IGlkLgorQGl0ZW0gaW5kZXg9QHZhcntpbmRleH0KK1RoaXMgb3B0aW9uIGRlZmluZXMgd2hlcmUgaXMgY29ubmVjdGVkIHRoZSBkcml2ZSBieSB1c2luZyBhbiBpbmRleCBpbiB0aGUgbGlzdAorb2YgYXZhaWxhYmxlIGNvbm5lY3RvcnMgb2YgYSBnaXZlbiBpbnRlcmZhY2UgdHlwZS4KK0BpdGVtIG1lZGlhPUB2YXJ7bWVkaWF9CitUaGlzIG9wdGlvbiBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBtZWRpYTogZGlzayBvciBjZHJvbS4KK0BpdGVtIGN5bHM9QHZhcntjfSxoZWFkcz1AdmFye2h9LHNlY3M9QHZhcntzfVssdHJhbnM9QHZhcnt0fV0KK1RoZXNlIG9wdGlvbnMgaGF2ZSB0aGUgc2FtZSBkZWZpbml0aW9uIGFzIHRoZXkgaGF2ZSBpbiBAb3B0aW9uey1oZGFjaHN9LgorQGl0ZW0gc25hcHNob3Q9QHZhcntzbmFwc2hvdH0KK0B2YXJ7c25hcHNob3R9IGlzICJvbiIgb3IgIm9mZiIgYW5kIGFsbG93cyB0byBlbmFibGUgc25hcHNob3QgZm9yIGdpdmVuIGRyaXZlIChzZWUgQG9wdGlvbnstc25hcHNob3R9KS4KK0BpdGVtIGNhY2hlPUB2YXJ7Y2FjaGV9CitAdmFye2NhY2hlfSBpcyAibm9uZSIsICJ3cml0ZWJhY2siLCBvciAid3JpdGV0aHJvdWdoIiBhbmQgY29udHJvbHMgaG93IHRoZSBob3N0IGNhY2hlIGlzIHVzZWQgdG8gYWNjZXNzIGJsb2NrIGRhdGEuCitAaXRlbSBmb3JtYXQ9QHZhcntmb3JtYXR9CitTcGVjaWZ5IHdoaWNoIGRpc2sgQHZhcntmb3JtYXR9IHdpbGwgYmUgdXNlZCByYXRoZXIgdGhhbiBkZXRlY3RpbmcKK3RoZSBmb3JtYXQuICBDYW4gYmUgdXNlZCB0byBzcGVjaWZpeSBmb3JtYXQ9cmF3IHRvIGF2b2lkIGludGVycHJldGluZworYW4gdW50cnVzdGVkIGZvcm1hdCBoZWFkZXIuCitAaXRlbSBzZXJpYWw9QHZhcntzZXJpYWx9CitUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHNlcmlhbCBudW1iZXIgdG8gYXNzaWduIHRvIHRoZSBkZXZpY2UuCitAZW5kIHRhYmxlCisKK0J5IGRlZmF1bHQsIHdyaXRldGhyb3VnaCBjYWNoaW5nIGlzIHVzZWQgZm9yIGFsbCBibG9jayBkZXZpY2UuICBUaGlzIG1lYW5zIHRoYXQKK3RoZSBob3N0IHBhZ2UgY2FjaGUgd2lsbCBiZSB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGRhdGEgYnV0IHdyaXRlIG5vdGlmaWNhdGlvbgord2lsbCBiZSBzZW50IHRvIHRoZSBndWVzdCBvbmx5IHdoZW4gdGhlIGRhdGEgaGFzIGJlZW4gcmVwb3J0ZWQgYXMgd3JpdHRlbiBieQordGhlIHN0b3JhZ2Ugc3Vic3lzdGVtLgorCitXcml0ZWJhY2sgY2FjaGluZyB3aWxsIHJlcG9ydCBkYXRhIHdyaXRlcyBhcyBjb21wbGV0ZWQgYXMgc29vbiBhcyB0aGUgZGF0YSBpcworcHJlc2VudCBpbiB0aGUgaG9zdCBwYWdlIGNhY2hlLiAgVGhpcyBpcyBzYWZlIGFzIGxvbmcgYXMgeW91IHRydXN0IHlvdXIgaG9zdC4KK0lmIHlvdXIgaG9zdCBjcmFzaGVzIG9yIGxvc2VzIHBvd2VyLCB0aGVuIHRoZSBndWVzdCBtYXkgZXhwZXJpZW5jZSBkYXRhCitjb3JydXB0aW9uLiAgV2hlbiB1c2luZyB0aGUgQG9wdGlvbnstc25hcHNob3R9IG9wdGlvbiwgd3JpdGViYWNrIGNhY2hpbmcgaXMKK3VzZWQgYnkgZGVmYXVsdC4KKworVGhlIGhvc3QgcGFnZSBjYWNoZSBjYW4gYmUgYXZvaWRlZCBlbnRpcmVseSB3aXRoIEBvcHRpb257Y2FjaGU9bm9uZX0uICBUaGlzIHdpbGwKK2F0dGVtcHQgdG8gZG8gZGlzayBJTyBkaXJlY3RseSB0byB0aGUgZ3Vlc3RzIG1lbW9yeS4gIFFFTVUgbWF5IHN0aWxsIHBlcmZvcm0KK2FuIGludGVybmFsIGNvcHkgb2YgdGhlIGRhdGEuCisKK1NvbWUgYmxvY2sgZHJpdmVycyBwZXJmb3JtIGJhZGx5IHdpdGggQG9wdGlvbntjYWNoZT13cml0ZXRocm91Z2h9LCBtb3N0IG5vdGFibHksCitxY293Mi4gIElmIHBlcmZvcm1hbmNlIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gY29ycmVjdG5lc3MsCitAb3B0aW9ue2NhY2hlPXdyaXRlYmFja30gc2hvdWxkIGJlIHVzZWQgd2l0aCBxY293Mi4gIEJ5IGRlZmF1bHQsIGlmIG5vIGV4cGxpY2l0CitjYWNoaW5nIGlzIHNwZWNpZmllZCBmb3IgYSBxY293MiBkaXNrIGltYWdlLCBAb3B0aW9ue2NhY2hlPXdyaXRlYmFja30gd2lsbCBiZQordXNlZC4gIEZvciBhbGwgb3RoZXIgZGlzayB0eXBlcywgQG9wdGlvbntjYWNoZT13cml0ZXRocm91Z2h9IGlzIHRoZSBkZWZhdWx0LgorCitJbnN0ZWFkIG9mIEBvcHRpb257LWNkcm9tfSB5b3UgY2FuIHVzZToKK0BleGFtcGxlCitxZW11IC1kcml2ZSBmaWxlPWZpbGUsaW5kZXg9MixtZWRpYT1jZHJvbQorQGVuZCBleGFtcGxlCisKK0luc3RlYWQgb2YgQG9wdGlvbnstaGRhfSwgQG9wdGlvbnstaGRifSwgQG9wdGlvbnstaGRjfSwgQG9wdGlvbnstaGRkfSwgeW91IGNhbgordXNlOgorQGV4YW1wbGUKK3FlbXUgLWRyaXZlIGZpbGU9ZmlsZSxpbmRleD0wLG1lZGlhPWRpc2sKK3FlbXUgLWRyaXZlIGZpbGU9ZmlsZSxpbmRleD0xLG1lZGlhPWRpc2sKK3FlbXUgLWRyaXZlIGZpbGU9ZmlsZSxpbmRleD0yLG1lZGlhPWRpc2sKK3FlbXUgLWRyaXZlIGZpbGU9ZmlsZSxpbmRleD0zLG1lZGlhPWRpc2sKK0BlbmQgZXhhbXBsZQorCitZb3UgY2FuIGNvbm5lY3QgYSBDRFJPTSB0byB0aGUgc2xhdmUgb2YgaWRlMDoKK0BleGFtcGxlCitxZW11IC1kcml2ZSBmaWxlPWZpbGUsaWY9aWRlLGluZGV4PTEsbWVkaWE9Y2Ryb20KK0BlbmQgZXhhbXBsZQorCitJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUgImZpbGU9IiBhcmd1bWVudCwgeW91IGRlZmluZSBhbiBlbXB0eSBkcml2ZToKK0BleGFtcGxlCitxZW11IC1kcml2ZSBpZj1pZGUsaW5kZXg9MSxtZWRpYT1jZHJvbQorQGVuZCBleGFtcGxlCisKK1lvdSBjYW4gY29ubmVjdCBhIFNDU0kgZGlzayB3aXRoIHVuaXQgSUQgNiBvbiB0aGUgYnVzICMwOgorQGV4YW1wbGUKK3FlbXUgLWRyaXZlIGZpbGU9ZmlsZSxpZj1zY3NpLGJ1cz0wLHVuaXQ9NgorQGVuZCBleGFtcGxlCisKK0luc3RlYWQgb2YgQG9wdGlvbnstZmRhfSwgQG9wdGlvbnstZmRifSwgeW91IGNhbiB1c2U6CitAZXhhbXBsZQorcWVtdSAtZHJpdmUgZmlsZT1maWxlLGluZGV4PTAsaWY9ZmxvcHB5CitxZW11IC1kcml2ZSBmaWxlPWZpbGUsaW5kZXg9MSxpZj1mbG9wcHkKK0BlbmQgZXhhbXBsZQorCitCeSBkZWZhdWx0LCBAdmFye2ludGVyZmFjZX0gaXMgImlkZSIgYW5kIEB2YXJ7aW5kZXh9IGlzIGF1dG9tYXRpY2FsbHkKK2luY3JlbWVudGVkOgorQGV4YW1wbGUKK3FlbXUgLWRyaXZlIGZpbGU9YSAtZHJpdmUgZmlsZT1iIgorQGVuZCBleGFtcGxlCitpcyBpbnRlcnByZXRlZCBsaWtlOgorQGV4YW1wbGUKK3FlbXUgLWhkYSBhIC1oZGIgYgorQGVuZCBleGFtcGxlCitFVEVYSQorCitERUYoIm10ZGJsb2NrIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fbXRkYmxvY2ssCisgICAgIi1tdGRibG9jayBmaWxlICB1c2UgJ2ZpbGUnIGFzIG9uLWJvYXJkIEZsYXNoIG1lbW9yeSBpbWFnZVxuIikKK1NURVhJCisKK0BpdGVtIC1tdGRibG9jayBmaWxlCitVc2UgJ2ZpbGUnIGFzIG9uLWJvYXJkIEZsYXNoIG1lbW9yeSBpbWFnZS4KK0VURVhJCisKK0RFRigic2QiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9zZCwKKyAgICAiLXNkIGZpbGUgICAgICAgIHVzZSAnZmlsZScgYXMgU2VjdXJlRGlnaXRhbCBjYXJkIGltYWdlXG4iKQorU1RFWEkKK0BpdGVtIC1zZCBmaWxlCitVc2UgJ2ZpbGUnIGFzIFNlY3VyZURpZ2l0YWwgY2FyZCBpbWFnZS4KK0VURVhJCisKK0RFRigicGZsYXNoIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fcGZsYXNoLAorICAgICItcGZsYXNoIGZpbGUgICAgdXNlICdmaWxlJyBhcyBhIHBhcmFsbGVsIGZsYXNoIGltYWdlXG4iKQorU1RFWEkKK0BpdGVtIC1wZmxhc2ggZmlsZQorVXNlICdmaWxlJyBhcyBhIHBhcmFsbGVsIGZsYXNoIGltYWdlLgorRVRFWEkKKworREVGKCJib290IiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYm9vdCwKKyAgICAiLWJvb3QgW2F8Y3xkfG5dIGJvb3Qgb24gZmxvcHB5IChhKSwgaGFyZCBkaXNrIChjKSwgQ0QtUk9NIChkKSwgb3IgbmV0d29yayAobilcbiIpCitTVEVYSQorQGl0ZW0gLWJvb3QgW2F8Y3xkfG5dCitCb290IG9uIGZsb3BweSAoYSksIGhhcmQgZGlzayAoYyksIENELVJPTSAoZCksIG9yIEV0aGVyYm9vdCAobikuIEhhcmQgZGlzayBib290CitpcyB0aGUgZGVmYXVsdC4KK0VURVhJCisKK0RFRigic25hcHNob3QiLCAwLCBRRU1VX09QVElPTl9zbmFwc2hvdCwKKyAgICAiLXNuYXBzaG90ICAgICAgIHdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlcyBpbnN0ZWFkIG9mIGRpc2sgaW1hZ2UgZmlsZXNcbiIpCitTVEVYSQorQGl0ZW0gLXNuYXBzaG90CitXcml0ZSB0byB0ZW1wb3JhcnkgZmlsZXMgaW5zdGVhZCBvZiBkaXNrIGltYWdlIGZpbGVzLiBJbiB0aGlzIGNhc2UsCit0aGUgcmF3IGRpc2sgaW1hZ2UgeW91IHVzZSBpcyBub3Qgd3JpdHRlbiBiYWNrLiBZb3UgY2FuIGhvd2V2ZXIgZm9yY2UKK3RoZSB3cml0ZSBiYWNrIGJ5IHByZXNzaW5nIEBrZXl7Qy1hIHN9IChAcHhyZWZ7ZGlza19pbWFnZXN9KS4KK0VURVhJCisKK0RFRigibSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX20sCisgICAgIi1tIG1lZ3MgICAgICAgICBzZXQgdmlydHVhbCBSQU0gc2l6ZSB0byBtZWdzIE1CIFtkZWZhdWx0PSVkXVxuIikKK1NURVhJCitAaXRlbSAtbSBAdmFye21lZ3N9CitTZXQgdmlydHVhbCBSQU0gc2l6ZSB0byBAdmFye21lZ3N9IG1lZ2FieXRlcy4gRGVmYXVsdCBpcyAxMjggTWlCLiAgT3B0aW9uYWxseSwKK2Egc3VmZml4IG9mIGBgTScnIG9yIGBgRycnIGNhbiBiZSB1c2VkIHRvIHNpZ25pZnkgYSB2YWx1ZSBpbiBtZWdhYnl0ZXMgb3IKK2dpZ2FieXRlcyByZXNwZWN0aXZlbHkuCitFVEVYSQorCitERUYoImsiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9rLAorICAgICItayBsYW5ndWFnZSAgICAgdXNlIGtleWJvYXJkIGxheW91dCAoZm9yIGV4YW1wbGUgJ2ZyJyBmb3IgRnJlbmNoKVxuIikKK1NURVhJCitAaXRlbSAtayBAdmFye2xhbmd1YWdlfQorCitVc2Uga2V5Ym9hcmQgbGF5b3V0IEB2YXJ7bGFuZ3VhZ2V9IChmb3IgZXhhbXBsZSBAY29kZXtmcn0gZm9yCitGcmVuY2gpLiBUaGlzIG9wdGlvbiBpcyBvbmx5IG5lZWRlZCB3aGVyZSBpdCBpcyBub3QgZWFzeSB0byBnZXQgcmF3IFBDCitrZXljb2RlcyAoZS5nLiBvbiBNYWNzLCB3aXRoIHNvbWUgWDExIHNlcnZlcnMgb3Igd2l0aCBhIFZOQworZGlzcGxheSkuIFlvdSBkb24ndCBub3JtYWxseSBuZWVkIHRvIHVzZSBpdCBvbiBQQy9MaW51eCBvciBQQy9XaW5kb3dzCitob3N0cy4KKworVGhlIGF2YWlsYWJsZSBsYXlvdXRzIGFyZToKK0BleGFtcGxlCithciAgZGUtY2ggIGVzICBmbyAgICAgZnItY2EgIGh1ICBqYSAgbWsgICAgIG5vICBwdC1iciAgc3YKK2RhICBlbi1nYiAgZXQgIGZyICAgICBmci1jaCAgaXMgIGx0ICBubCAgICAgcGwgIHJ1ICAgICB0aAorZGUgIGVuLXVzICBmaSAgZnItYmUgIGhyICAgICBpdCAgbHYgIG5sLWJlICBwdCAgc2wgICAgIHRyCitAZW5kIGV4YW1wbGUKKworVGhlIGRlZmF1bHQgaXMgQGNvZGV7ZW4tdXN9LgorRVRFWEkKKworCisjaWZkZWYgSEFTX0FVRElPCitERUYoImF1ZGlvLWhlbHAiLCAwLCBRRU1VX09QVElPTl9hdWRpb19oZWxwLAorICAgICItYXVkaW8taGVscCAgICAgcHJpbnQgbGlzdCBvZiBhdWRpbyBkcml2ZXJzIGFuZCB0aGVpciBvcHRpb25zXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLWF1ZGlvLWhlbHAKKworV2lsbCBzaG93IHRoZSBhdWRpbyBzdWJzeXN0ZW0gaGVscDogbGlzdCBvZiBkcml2ZXJzLCB0dW5hYmxlCitwYXJhbWV0ZXJzLgorRVRFWEkKKworI2lmZGVmIEhBU19BVURJTworREVGKCJzb3VuZGh3IiwgSEFTX0FSRywgUUVNVV9PUFRJT05fc291bmRodywKKyAgICAiLXNvdW5kaHcgYzEsLi4uIGVuYWJsZSBhdWRpbyBzdXBwb3J0XG4iCisgICAgIiAgICAgICAgICAgICAgICBhbmQgb25seSBzcGVjaWZpZWQgc291bmQgY2FyZHMgKGNvbW1hIHNlcGFyYXRlZCBsaXN0KVxuIgorICAgICIgICAgICAgICAgICAgICAgdXNlIC1zb3VuZGh3ID8gdG8gZ2V0IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkc1xuIgorICAgICIgICAgICAgICAgICAgICAgdXNlIC1zb3VuZGh3IGFsbCB0byBlbmFibGUgYWxsIG9mIHRoZW1cbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtc291bmRodyBAdmFye2NhcmQxfVssQHZhcntjYXJkMn0sLi4uXSBvciAtc291bmRodyBhbGwKKworRW5hYmxlIGF1ZGlvIGFuZCBzZWxlY3RlZCBzb3VuZCBoYXJkd2FyZS4gVXNlID8gdG8gcHJpbnQgYWxsCithdmFpbGFibGUgc291bmQgaGFyZHdhcmUuCisKK0BleGFtcGxlCitxZW11IC1zb3VuZGh3IHNiMTYsYWRsaWIgZGlzay5pbWcKK3FlbXUgLXNvdW5kaHcgZXMxMzcwIGRpc2suaW1nCitxZW11IC1zb3VuZGh3IGFjOTcgZGlzay5pbWcKK3FlbXUgLXNvdW5kaHcgYWxsIGRpc2suaW1nCitxZW11IC1zb3VuZGh3ID8KK0BlbmQgZXhhbXBsZQorCitOb3RlIHRoYXQgTGludXgncyBpODEwX2F1ZGlvIE9TUyBrZXJuZWwgKGZvciBBQzk3KSBtb2R1bGUgbWlnaHQKK3JlcXVpcmUgbWFudWFsbHkgc3BlY2lmeWluZyBjbG9ja2luZy4KKworQGV4YW1wbGUKK21vZHByb2JlIGk4MTBfYXVkaW8gY2xvY2tpbmc9NDgwMDAKK0BlbmQgZXhhbXBsZQorRVRFWEkKKworU1RFWEkKK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRigidXNiIiwgMCwgUUVNVV9PUFRJT05fdXNiLAorICAgICItdXNiICAgICAgICAgICAgZW5hYmxlIHRoZSBVU0IgZHJpdmVyICh3aWxsIGJlIHRoZSBkZWZhdWx0IHNvb24pXG4iKQorU1RFWEkKK1VTQiBvcHRpb25zOgorQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gLXVzYgorRW5hYmxlIHRoZSBVU0IgZHJpdmVyICh3aWxsIGJlIHRoZSBkZWZhdWx0IHNvb24pCitFVEVYSQorCitERUYoInVzYmRldmljZSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3VzYmRldmljZSwKKyAgICAiLXVzYmRldmljZSBuYW1lIGFkZCB0aGUgaG9zdCBvciBndWVzdCBVU0IgZGV2aWNlICduYW1lJ1xuIikKK1NURVhJCisKK0BpdGVtIC11c2JkZXZpY2UgQHZhcntkZXZuYW1lfQorQWRkIHRoZSBVU0IgZGV2aWNlIEB2YXJ7ZGV2bmFtZX0uIEB4cmVme3VzYl9kZXZpY2VzfS4KKworQHRhYmxlIEBjb2RlCisKK0BpdGVtIG1vdXNlCitWaXJ0dWFsIE1vdXNlLiBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIFBTLzIgbW91c2UgZW11bGF0aW9uIHdoZW4gYWN0aXZhdGVkLgorCitAaXRlbSB0YWJsZXQKK1BvaW50ZXIgZGV2aWNlIHRoYXQgdXNlcyBhYnNvbHV0ZSBjb29yZGluYXRlcyAobGlrZSBhIHRvdWNoc2NyZWVuKS4gVGhpcworbWVhbnMgcWVtdSBpcyBhYmxlIHRvIHJlcG9ydCB0aGUgbW91c2UgcG9zaXRpb24gd2l0aG91dCBoYXZpbmcgdG8gZ3JhYiB0aGUKK21vdXNlLiBBbHNvIG92ZXJyaWRlcyB0aGUgUFMvMiBtb3VzZSBlbXVsYXRpb24gd2hlbiBhY3RpdmF0ZWQuCisKK0BpdGVtIGRpc2s6W2Zvcm1hdD1AdmFye2Zvcm1hdH1dOmZpbGUKK01hc3Mgc3RvcmFnZSBkZXZpY2UgYmFzZWQgb24gZmlsZS4gVGhlIG9wdGlvbmFsIEB2YXJ7Zm9ybWF0fSBhcmd1bWVudAord2lsbCBiZSB1c2VkIHJhdGhlciB0aGFuIGRldGVjdGluZyB0aGUgZm9ybWF0LiBDYW4gYmUgdXNlZCB0byBzcGVjaWZpeQorZm9ybWF0PXJhdyB0byBhdm9pZCBpbnRlcnByZXRpbmcgYW4gdW50cnVzdGVkIGZvcm1hdCBoZWFkZXIuCisKK0BpdGVtIGhvc3Q6YnVzLmFkZHIKK1Bhc3MgdGhyb3VnaCB0aGUgaG9zdCBkZXZpY2UgaWRlbnRpZmllZCBieSBidXMuYWRkciAoTGludXggb25seSkuCisKK0BpdGVtIGhvc3Q6dmVuZG9yX2lkOnByb2R1Y3RfaWQKK1Bhc3MgdGhyb3VnaCB0aGUgaG9zdCBkZXZpY2UgaWRlbnRpZmllZCBieSB2ZW5kb3JfaWQ6cHJvZHVjdF9pZCAoTGludXggb25seSkuCisKK0BpdGVtIHNlcmlhbDpbdmVuZG9yaWQ9QHZhcnt2ZW5kb3JfaWR9XVsscHJvZHVjdGlkPUB2YXJ7cHJvZHVjdF9pZH1dOkB2YXJ7ZGV2fQorU2VyaWFsIGNvbnZlcnRlciB0byBob3N0IGNoYXJhY3RlciBkZXZpY2UgQHZhcntkZXZ9LCBzZWUgQGNvZGV7LXNlcmlhbH0gZm9yIHRoZQorYXZhaWxhYmxlIGRldmljZXMuCisKK0BpdGVtIGJyYWlsbGUKK0JyYWlsbGUgZGV2aWNlLiAgVGhpcyB3aWxsIHVzZSBCcmxBUEkgdG8gZGlzcGxheSB0aGUgYnJhaWxsZSBvdXRwdXQgb24gYSByZWFsCitvciBmYWtlIGRldmljZS4KKworQGl0ZW0gbmV0Om9wdGlvbnMKK05ldHdvcmsgYWRhcHRlciB0aGF0IHN1cHBvcnRzIENEQyBldGhlcm5ldCBhbmQgUk5ESVMgcHJvdG9jb2xzLgorCitAZW5kIHRhYmxlCitFVEVYSQorCitERUYoIm5hbWUiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9uYW1lLAorICAgICItbmFtZSBzdHJpbmcgICAgc2V0IHRoZSBuYW1lIG9mIHRoZSBndWVzdFxuIikKK1NURVhJCitAaXRlbSAtbmFtZSBAdmFye25hbWV9CitTZXRzIHRoZSBAdmFye25hbWV9IG9mIHRoZSBndWVzdC4KK1RoaXMgbmFtZSB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgU0RMIHdpbmRvdyBjYXB0aW9uLgorVGhlIEB2YXJ7bmFtZX0gd2lsbCBhbHNvIGJlIHVzZWQgZm9yIHRoZSBWTkMgc2VydmVyLgorRVRFWEkKKworREVGKCJ1dWlkIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fdXVpZCwKKyAgICAiLXV1aWQgJSUwOHgtJSUwNHgtJSUwNHgtJSUwNHgtJSUwMTJ4XG4iCisgICAgIiAgICAgICAgICAgICAgICBzcGVjaWZ5IG1hY2hpbmUgVVVJRFxuIikKK1NURVhJCitAaXRlbSAtdXVpZCBAdmFye3V1aWR9CitTZXQgc3lzdGVtIFVVSUQuCitFVEVYSQorCitTVEVYSQorQGVuZCB0YWJsZQorRVRFWEkKKworREVGSEVBRElORygpCisKK0RFRkhFQURJTkcoRGlzcGxheSBvcHRpb25zOikKKworU1RFWEkKK0B0YWJsZSBAb3B0aW9uCitFVEVYSQorCitERUYoIm5vZ3JhcGhpYyIsIDAsIFFFTVVfT1BUSU9OX25vZ3JhcGhpYywKKyAgICAiLW5vZ3JhcGhpYyAgICAgIGRpc2FibGUgZ3JhcGhpY2FsIG91dHB1dCBhbmQgcmVkaXJlY3Qgc2VyaWFsIEkvT3MgdG8gY29uc29sZVxuIikKK1NURVhJCitAaXRlbSAtbm9ncmFwaGljCisKK05vcm1hbGx5LCBRRU1VIHVzZXMgU0RMIHRvIGRpc3BsYXkgdGhlIFZHQSBvdXRwdXQuIFdpdGggdGhpcyBvcHRpb24sCit5b3UgY2FuIHRvdGFsbHkgZGlzYWJsZSBncmFwaGljYWwgb3V0cHV0IHNvIHRoYXQgUUVNVSBpcyBhIHNpbXBsZQorY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uLiBUaGUgZW11bGF0ZWQgc2VyaWFsIHBvcnQgaXMgcmVkaXJlY3RlZCBvbgordGhlIGNvbnNvbGUuIFRoZXJlZm9yZSwgeW91IGNhbiBzdGlsbCB1c2UgUUVNVSB0byBkZWJ1ZyBhIExpbnV4IGtlcm5lbAord2l0aCBhIHNlcmlhbCBjb25zb2xlLgorRVRFWEkKKworI2lmZGVmIENPTkZJR19DVVJTRVMKK0RFRigiY3Vyc2VzIiwgMCwgUUVNVV9PUFRJT05fY3Vyc2VzLAorICAgICItY3Vyc2VzICAgICAgICAgdXNlIGEgY3Vyc2VzL25jdXJzZXMgaW50ZXJmYWNlIGluc3RlYWQgb2YgU0RMXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLWN1cnNlcworCitOb3JtYWxseSwgUUVNVSB1c2VzIFNETCB0byBkaXNwbGF5IHRoZSBWR0Egb3V0cHV0LiAgV2l0aCB0aGlzIG9wdGlvbiwKK1FFTVUgY2FuIGRpc3BsYXkgdGhlIFZHQSBvdXRwdXQgd2hlbiBpbiB0ZXh0IG1vZGUgdXNpbmcgYQorY3Vyc2VzL25jdXJzZXMgaW50ZXJmYWNlLiAgTm90aGluZyBpcyBkaXNwbGF5ZWQgaW4gZ3JhcGhpY2FsIG1vZGUuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX1NETAorREVGKCJuby1mcmFtZSIsIDAsIFFFTVVfT1BUSU9OX25vX2ZyYW1lLAorICAgICItbm8tZnJhbWUgICAgICAgb3BlbiBTREwgd2luZG93IHdpdGhvdXQgYSBmcmFtZSBhbmQgd2luZG93IGRlY29yYXRpb25zXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLW5vLWZyYW1lCisKK0RvIG5vdCB1c2UgZGVjb3JhdGlvbnMgZm9yIFNETCB3aW5kb3dzIGFuZCBzdGFydCB0aGVtIHVzaW5nIHRoZSB3aG9sZQorYXZhaWxhYmxlIHNjcmVlbiBzcGFjZS4gVGhpcyBtYWtlcyB0aGUgdXNpbmcgUUVNVSBpbiBhIGRlZGljYXRlZCBkZXNrdG9wCit3b3Jrc3BhY2UgbW9yZSBjb252ZW5pZW50LgorRVRFWEkKKworI2lmZGVmIENPTkZJR19TREwKK0RFRigiYWx0LWdyYWIiLCAwLCBRRU1VX09QVElPTl9hbHRfZ3JhYiwKKyAgICAiLWFsdC1ncmFiICAgICAgIHVzZSBDdHJsLUFsdC1TaGlmdCB0byBncmFiIG1vdXNlIChpbnN0ZWFkIG9mIEN0cmwtQWx0KVxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1hbHQtZ3JhYgorCitVc2UgQ3RybC1BbHQtU2hpZnQgdG8gZ3JhYiBtb3VzZSAoaW5zdGVhZCBvZiBDdHJsLUFsdCkuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX1NETAorREVGKCJuby1xdWl0IiwgMCwgUUVNVV9PUFRJT05fbm9fcXVpdCwKKyAgICAiLW5vLXF1aXQgICAgICAgIGRpc2FibGUgU0RMIHdpbmRvdyBjbG9zZSBjYXBhYmlsaXR5XG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLW5vLXF1aXQKKworRGlzYWJsZSBTREwgd2luZG93IGNsb3NlIGNhcGFiaWxpdHkuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX1NETAorREVGKCJzZGwiLCAwLCBRRU1VX09QVElPTl9zZGwsCisgICAgIi1zZGwgICAgICAgICAgICBlbmFibGUgU0RMXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLXNkbAorCitFbmFibGUgU0RMLgorRVRFWEkKKworREVGKCJwb3J0cmFpdCIsIDAsIFFFTVVfT1BUSU9OX3BvcnRyYWl0LAorICAgICItcG9ydHJhaXQgICAgICAgcm90YXRlIGdyYXBoaWNhbCBvdXRwdXQgOTAgZGVnIGxlZnQgKG9ubHkgUFhBIExDRClcbiIpCitTVEVYSQorQGl0ZW0gLXBvcnRyYWl0CisKK1JvdGF0ZSBncmFwaGljYWwgb3V0cHV0IDkwIGRlZyBsZWZ0IChvbmx5IFBYQSBMQ0QpLgorRVRFWEkKKworREVGKCJ2Z2EiLCBIQVNfQVJHLCBRRU1VX09QVElPTl92Z2EsCisgICAgIi12Z2EgW3N0ZHxjaXJydXN8dm13YXJlfHhlbmZifG5vbmVdXG4iCisgICAgIiAgICAgICAgICAgICAgICBzZWxlY3QgdmlkZW8gY2FyZCB0eXBlXG4iKQorU1RFWEkKK0BpdGVtIC12Z2EgQHZhcnt0eXBlfQorU2VsZWN0IHR5cGUgb2YgVkdBIGNhcmQgdG8gZW11bGF0ZS4gVmFsaWQgdmFsdWVzIGZvciBAdmFye3R5cGV9IGFyZQorQHRhYmxlIEBjb2RlCitAaXRlbSBjaXJydXMKK0NpcnJ1cyBMb2dpYyBHRDU0NDYgVmlkZW8gY2FyZC4gQWxsIFdpbmRvd3MgdmVyc2lvbnMgc3RhcnRpbmcgZnJvbQorV2luZG93cyA5NSBzaG91bGQgcmVjb2duaXplIGFuZCB1c2UgdGhpcyBncmFwaGljIGNhcmQuIEZvciBvcHRpbWFsCitwZXJmb3JtYW5jZXMsIHVzZSAxNiBiaXQgY29sb3IgZGVwdGggaW4gdGhlIGd1ZXN0IGFuZCB0aGUgaG9zdCBPUy4KKyhUaGlzIG9uZSBpcyB0aGUgZGVmYXVsdCkKK0BpdGVtIHN0ZAorU3RhbmRhcmQgVkdBIGNhcmQgd2l0aCBCb2NocyBWQkUgZXh0ZW5zaW9ucy4gIElmIHlvdXIgZ3Vlc3QgT1MKK3N1cHBvcnRzIHRoZSBWRVNBIDIuMCBWQkUgZXh0ZW5zaW9ucyAoZS5nLiBXaW5kb3dzIFhQKSBhbmQgaWYgeW91IHdhbnQKK3RvIHVzZSBoaWdoIHJlc29sdXRpb24gbW9kZXMgKD49IDEyODB4MTAyNHgxNikgdGhlbiB5b3Ugc2hvdWxkIHVzZQordGhpcyBvcHRpb24uCitAaXRlbSB2bXdhcmUKK1ZNV2FyZSBTVkdBLUlJIGNvbXBhdGlibGUgYWRhcHRlci4gVXNlIGl0IGlmIHlvdSBoYXZlIHN1ZmZpY2llbnRseQorcmVjZW50IFhGcmVlODYvWE9yZyBzZXJ2ZXIgb3IgV2luZG93cyBndWVzdCB3aXRoIGEgZHJpdmVyIGZvciB0aGlzCitjYXJkLgorQGl0ZW0gbm9uZQorRGlzYWJsZSBWR0EgY2FyZC4KK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRigiZnVsbC1zY3JlZW4iLCAwLCBRRU1VX09QVElPTl9mdWxsX3NjcmVlbiwKKyAgICAiLWZ1bGwtc2NyZWVuICAgIHN0YXJ0IGluIGZ1bGwgc2NyZWVuXG4iKQorU1RFWEkKK0BpdGVtIC1mdWxsLXNjcmVlbgorU3RhcnQgaW4gZnVsbCBzY3JlZW4uCitFVEVYSQorCisjaWYgZGVmaW5lZChUQVJHRVRfUFBDKSB8fCBkZWZpbmVkKFRBUkdFVF9TUEFSQykKK0RFRigiZyIsIDEsIFFFTVVfT1BUSU9OX2cgLAorICAgICItZyBXeEhbeERFUFRIXSAgU2V0IHRoZSBpbml0aWFsIGdyYXBoaWNhbCByZXNvbHV0aW9uIGFuZCBkZXB0aFxuIikKKyNlbmRpZgorU1RFWEkKK0VURVhJCisKK0RFRigidm5jIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fdm5jICwKKyAgICAiLXZuYyBkaXNwbGF5ICAgIHN0YXJ0IGEgVk5DIHNlcnZlciBvbiBkaXNwbGF5XG4iKQorU1RFWEkKK0BpdGVtIC12bmMgQHZhcntkaXNwbGF5fVssQHZhcntvcHRpb259WyxAdmFye29wdGlvbn1bLC4uLl1dXQorCitOb3JtYWxseSwgUUVNVSB1c2VzIFNETCB0byBkaXNwbGF5IHRoZSBWR0Egb3V0cHV0LiAgV2l0aCB0aGlzIG9wdGlvbiwKK3lvdSBjYW4gaGF2ZSBRRU1VIGxpc3RlbiBvbiBWTkMgZGlzcGxheSBAdmFye2Rpc3BsYXl9IGFuZCByZWRpcmVjdCB0aGUgVkdBCitkaXNwbGF5IG92ZXIgdGhlIFZOQyBzZXNzaW9uLiAgSXQgaXMgdmVyeSB1c2VmdWwgdG8gZW5hYmxlIHRoZSB1c2IKK3RhYmxldCBkZXZpY2Ugd2hlbiB1c2luZyB0aGlzIG9wdGlvbiAob3B0aW9uIEBvcHRpb257LXVzYmRldmljZQordGFibGV0fSkuIFdoZW4gdXNpbmcgdGhlIFZOQyBkaXNwbGF5LCB5b3UgbXVzdCB1c2UgdGhlIEBvcHRpb257LWt9CitwYXJhbWV0ZXIgdG8gc2V0IHRoZSBrZXlib2FyZCBsYXlvdXQgaWYgeW91IGFyZSBub3QgdXNpbmcgZW4tdXMuIFZhbGlkCitzeW50YXggZm9yIHRoZSBAdmFye2Rpc3BsYXl9IGlzCisKK0B0YWJsZSBAY29kZQorCitAaXRlbSBAdmFye2hvc3R9OkB2YXJ7ZH0KKworVENQIGNvbm5lY3Rpb25zIHdpbGwgb25seSBiZSBhbGxvd2VkIGZyb20gQHZhcntob3N0fSBvbiBkaXNwbGF5IEB2YXJ7ZH0uCitCeSBjb252ZW50aW9uIHRoZSBUQ1AgcG9ydCBpcyA1OTAwK0B2YXJ7ZH0uIE9wdGlvbmFsbHksIEB2YXJ7aG9zdH0gY2FuCitiZSBvbWl0dGVkIGluIHdoaWNoIGNhc2UgdGhlIHNlcnZlciB3aWxsIGFjY2VwdCBjb25uZWN0aW9ucyBmcm9tIGFueSBob3N0LgorCitAaXRlbSBAY29kZXt1bml4fTpAdmFye3BhdGh9CisKK0Nvbm5lY3Rpb25zIHdpbGwgYmUgYWxsb3dlZCBvdmVyIFVOSVggZG9tYWluIHNvY2tldHMgd2hlcmUgQHZhcntwYXRofSBpcyB0aGUKK2xvY2F0aW9uIG9mIGEgdW5peCBzb2NrZXQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4KKworQGl0ZW0gbm9uZQorCitWTkMgaXMgaW5pdGlhbGl6ZWQgYnV0IG5vdCBzdGFydGVkLiBUaGUgbW9uaXRvciBAY29kZXtjaGFuZ2V9IGNvbW1hbmQKK2NhbiBiZSB1c2VkIHRvIGxhdGVyIHN0YXJ0IHRoZSBWTkMgc2VydmVyLgorCitAZW5kIHRhYmxlCisKK0ZvbGxvd2luZyB0aGUgQHZhcntkaXNwbGF5fSB2YWx1ZSB0aGVyZSBtYXkgYmUgb25lIG9yIG1vcmUgQHZhcntvcHRpb259IGZsYWdzCitzZXBhcmF0ZWQgYnkgY29tbWFzLiBWYWxpZCBvcHRpb25zIGFyZQorCitAdGFibGUgQGNvZGUKKworQGl0ZW0gcmV2ZXJzZQorCitDb25uZWN0IHRvIGEgbGlzdGVuaW5nIFZOQyBjbGllbnQgdmlhIGEgYGByZXZlcnNlJycgY29ubmVjdGlvbi4gVGhlCitjbGllbnQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBAdmFye2Rpc3BsYXl9LiBGb3IgcmV2ZXJzZSBuZXR3b3JrCitjb25uZWN0aW9ucyAoQHZhcntob3N0fTpAdmFye2R9LEBjb2Rle3JldmVyc2V9KSwgdGhlIEB2YXJ7ZH0gYXJndW1lbnQKK2lzIGEgVENQIHBvcnQgbnVtYmVyLCBub3QgYSBkaXNwbGF5IG51bWJlci4KKworQGl0ZW0gcGFzc3dvcmQKKworUmVxdWlyZSB0aGF0IHBhc3N3b3JkIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgZm9yIGNsaWVudCBjb25uZWN0aW9ucy4KK1RoZSBwYXNzd29yZCBtdXN0IGJlIHNldCBzZXBhcmF0ZWx5IHVzaW5nIHRoZSBAY29kZXtjaGFuZ2V9IGNvbW1hbmQgaW4gdGhlCitAcmVme3Bjc3lzX21vbml0b3J9CisKK0BpdGVtIHRscworCitSZXF1aXJlIHRoYXQgY2xpZW50IHVzZSBUTFMgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFZOQyBzZXJ2ZXIuIFRoaXMKK3VzZXMgYW5vbnltb3VzIFRMUyBjcmVkZW50aWFscyBzbyBpcyBzdXNjZXB0aWJsZSB0byBhIG1hbi1pbi10aGUtbWlkZGxlCithdHRhY2suIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhpcyBvcHRpb24gYmUgY29tYmluZWQgd2l0aCBlaXRoZXIgdGhlCitAdmFye3g1MDl9IG9yIEB2YXJ7eDUwOXZlcmlmeX0gb3B0aW9ucy4KKworQGl0ZW0geDUwOT1AdmFyey9wYXRoL3RvL2NlcnRpZmljYXRlL2Rpcn0KKworVmFsaWQgaWYgQG9wdGlvbnt0bHN9IGlzIHNwZWNpZmllZC4gUmVxdWlyZSB0aGF0IHg1MDkgY3JlZGVudGlhbHMgYXJlIHVzZWQKK2ZvciBuZWdvdGlhdGluZyB0aGUgVExTIHNlc3Npb24uIFRoZSBzZXJ2ZXIgd2lsbCBzZW5kIGl0cyB4NTA5IGNlcnRpZmljYXRlCit0byB0aGUgY2xpZW50LiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGEgcGFzc3dvcmQgYmUgc2V0IG9uIHRoZSBWTkMgc2VydmVyCit0byBwcm92aWRlIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBjbGllbnQgd2hlbiB0aGlzIGlzIHVzZWQuIFRoZSBwYXRoIGZvbGxvd2luZwordGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoZXJlIHRoZSB4NTA5IGNlcnRpZmljYXRlcyBhcmUgdG8gYmUgbG9hZGVkIGZyb20uCitTZWUgdGhlIEByZWZ7dm5jX3NlY3VyaXR5fSBzZWN0aW9uIGZvciBkZXRhaWxzIG9uIGdlbmVyYXRpbmcgY2VydGlmaWNhdGVzLgorCitAaXRlbSB4NTA5dmVyaWZ5PUB2YXJ7L3BhdGgvdG8vY2VydGlmaWNhdGUvZGlyfQorCitWYWxpZCBpZiBAb3B0aW9ue3Rsc30gaXMgc3BlY2lmaWVkLiBSZXF1aXJlIHRoYXQgeDUwOSBjcmVkZW50aWFscyBhcmUgdXNlZAorZm9yIG5lZ290aWF0aW5nIHRoZSBUTFMgc2Vzc2lvbi4gVGhlIHNlcnZlciB3aWxsIHNlbmQgaXRzIHg1MDkgY2VydGlmaWNhdGUKK3RvIHRoZSBjbGllbnQsIGFuZCByZXF1ZXN0IHRoYXQgdGhlIGNsaWVudCBzZW5kIGl0cyBvd24geDUwOSBjZXJ0aWZpY2F0ZS4KK1RoZSBzZXJ2ZXIgd2lsbCB2YWxpZGF0ZSB0aGUgY2xpZW50J3MgY2VydGlmaWNhdGUgYWdhaW5zdCB0aGUgQ0EgY2VydGlmaWNhdGUsCithbmQgcmVqZWN0IGNsaWVudHMgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLiBJZiB0aGUgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGlzCit0cnVzdGVkLCB0aGlzIGlzIGEgc3VmZmljaWVudCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uIFlvdSBtYXkgc3RpbGwgd2lzaAordG8gc2V0IGEgcGFzc3dvcmQgb24gdGhlIFZOQyBzZXJ2ZXIgYXMgYSBzZWNvbmQgYXV0aGVudGljYXRpb24gbGF5ZXIuIFRoZQorcGF0aCBmb2xsb3dpbmcgdGhpcyBvcHRpb24gc3BlY2lmaWVzIHdoZXJlIHRoZSB4NTA5IGNlcnRpZmljYXRlcyBhcmUgdG8KK2JlIGxvYWRlZCBmcm9tLiBTZWUgdGhlIEByZWZ7dm5jX3NlY3VyaXR5fSBzZWN0aW9uIGZvciBkZXRhaWxzIG9uIGdlbmVyYXRpbmcKK2NlcnRpZmljYXRlcy4KKworQGl0ZW0gc2FzbAorCitSZXF1aXJlIHRoYXQgdGhlIGNsaWVudCB1c2UgU0FTTCB0byBhdXRoZW50aWNhdGUgd2l0aCB0aGUgVk5DIHNlcnZlci4KK1RoZSBleGFjdCBjaG9pY2Ugb2YgYXV0aGVudGljYXRpb24gbWV0aG9kIHVzZWQgaXMgY29udHJvbGxlZCBmcm9tIHRoZQorc3lzdGVtIC8gdXNlcidzIFNBU0wgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ3FlbXUnIHNlcnZpY2UuIFRoaXMKK2lzIHR5cGljYWxseSBmb3VuZCBpbiAvZXRjL3Nhc2wyL3FlbXUuY29uZi4gSWYgcnVubmluZyBRRU1VIGFzIGFuCit1bnByaXZpbGVnZWQgdXNlciwgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgU0FTTF9DT05GX1BBVEggY2FuIGJlIHVzZWQKK3RvIG1ha2UgaXQgc2VhcmNoIGFsdGVybmF0ZSBsb2NhdGlvbnMgZm9yIHRoZSBzZXJ2aWNlIGNvbmZpZy4KK1doaWxlIHNvbWUgU0FTTCBhdXRoIG1ldGhvZHMgY2FuIGFsc28gcHJvdmlkZSBkYXRhIGVuY3J5cHRpb24gKGVnIEdTU0FQSSksCitpdCBpcyByZWNvbW1lbmRlZCB0aGF0IFNBU0wgYWx3YXlzIGJlIGNvbWJpbmVkIHdpdGggdGhlICd0bHMnIGFuZAorJ3g1MDknIHNldHRpbmdzIHRvIGVuYWJsZSB1c2Ugb2YgU1NMIGFuZCBzZXJ2ZXIgY2VydGlmaWNhdGVzLiBUaGlzCitlbnN1cmVzIGEgZGF0YSBlbmNyeXB0aW9uIHByZXZlbnRpbmcgY29tcHJvbWlzZSBvZiBhdXRoZW50aWNhdGlvbgorY3JlZGVudGlhbHMuIFNlZSB0aGUgQHJlZnt2bmNfc2VjdXJpdHl9IHNlY3Rpb24gZm9yIGRldGFpbHMgb24gdXNpbmcKK1NBU0wgYXV0aGVudGljYXRpb24uCisKK0BpdGVtIGFjbAorCitUdXJuIG9uIGFjY2VzcyBjb250cm9sIGxpc3RzIGZvciBjaGVja2luZyBvZiB0aGUgeDUwOSBjbGllbnQgY2VydGlmaWNhdGUKK2FuZCBTQVNMIHBhcnR5LiBGb3IgeDUwOSBjZXJ0cywgdGhlIEFDTCBjaGVjayBpcyBtYWRlIGFnYWluc3QgdGhlCitjZXJ0aWZpY2F0ZSdzIGRpc3Rpbmd1aXNoZWQgbmFtZS4gVGhpcyBpcyBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlCitAY29kZXtDPUdCLE89QUNNRSxMPUJvc3RvbixDTj1ib2J9LiBGb3IgU0FTTCBwYXJ0eSwgdGhlIEFDTCBjaGVjayBpcworbWFkZSBhZ2FpbnN0IHRoZSB1c2VybmFtZSwgd2hpY2ggZGVwZW5kaW5nIG9uIHRoZSBTQVNMIHBsdWdpbiwgbWF5CitpbmNsdWRlIGEgcmVhbG0gY29tcG9uZW50LCBlZyBAY29kZXtib2J9IG9yIEBjb2Rle2JvYkBARVhBTVBMRS5DT019LgorV2hlbiB0aGUgQG9wdGlvbnthY2x9IGZsYWcgaXMgc2V0LCB0aGUgaW5pdGlhbCBhY2Nlc3MgbGlzdCB3aWxsIGJlCitlbXB0eSwgd2l0aCBhIEBjb2Rle2Rlbnl9IHBvbGljeS4gVGh1cyBubyBvbmUgd2lsbCBiZSBhbGxvd2VkIHRvCit1c2UgdGhlIFZOQyBzZXJ2ZXIgdW50aWwgdGhlIEFDTHMgaGF2ZSBiZWVuIGxvYWRlZC4gVGhpcyBjYW4gYmUKK2FjaGlldmVkIHVzaW5nIHRoZSBAY29kZXthY2x9IG1vbml0b3IgY29tbWFuZC4KKworQGVuZCB0YWJsZQorRVRFWEkKKworU1RFWEkKK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRkhFQURJTkcoKQorCisjaWZkZWYgVEFSR0VUX0kzODYKK0RFRkhFQURJTkcoaTM4NiB0YXJnZXQgb25seTopCisjZW5kaWYKK1NURVhJCitAdGFibGUgQG9wdGlvbgorRVRFWEkKKworI2lmZGVmIFRBUkdFVF9JMzg2CitERUYoIndpbjJrLWhhY2siLCAwLCBRRU1VX09QVElPTl93aW4ya19oYWNrLAorICAgICItd2luMmstaGFjayAgICAgdXNlIGl0IHdoZW4gaW5zdGFsbGluZyBXaW5kb3dzIDIwMDAgdG8gYXZvaWQgYSBkaXNrIGZ1bGwgYnVnXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLXdpbjJrLWhhY2sKK1VzZSBpdCB3aGVuIGluc3RhbGxpbmcgV2luZG93cyAyMDAwIHRvIGF2b2lkIGEgZGlzayBmdWxsIGJ1Zy4gQWZ0ZXIKK1dpbmRvd3MgMjAwMCBpcyBpbnN0YWxsZWQsIHlvdSBubyBsb25nZXIgbmVlZCB0aGlzIG9wdGlvbiAodGhpcyBvcHRpb24KK3Nsb3dzIGRvd24gdGhlIElERSB0cmFuc2ZlcnMpLgorRVRFWEkKKworI2lmZGVmIFRBUkdFVF9JMzg2CitERUYoInJ0Yy10ZC1oYWNrIiwgMCwgUUVNVV9PUFRJT05fcnRjX3RkX2hhY2ssCisgICAgIi1ydGMtdGQtaGFjayAgICB1c2UgaXQgdG8gZml4IHRpbWUgZHJpZnQgaW4gV2luZG93cyBBQ1BJIEhBTFxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1ydGMtdGQtaGFjaworVXNlIGl0IGlmIHlvdSBleHBlcmllbmNlIHRpbWUgZHJpZnQgcHJvYmxlbSBpbiBXaW5kb3dzIHdpdGggQUNQSSBIQUwuCitUaGlzIG9wdGlvbiB3aWxsIHRyeSB0byBmaWd1cmUgb3V0IGhvdyBtYW55IHRpbWVyIGludGVycnVwdHMgd2VyZSBub3QKK3Byb2Nlc3NlZCBieSB0aGUgV2luZG93cyBndWVzdCBhbmQgd2lsbCByZS1pbmplY3QgdGhlbS4KK0VURVhJCisKKyNpZmRlZiBUQVJHRVRfSTM4NgorREVGKCJuby1mZC1ib290Y2hrIiwgMCwgUUVNVV9PUFRJT05fbm9fZmRfYm9vdGNoaywKKyAgICAiLW5vLWZkLWJvb3RjaGsgIGRpc2FibGUgYm9vdCBzaWduYXR1cmUgY2hlY2tpbmcgZm9yIGZsb3BweSBkaXNrc1xuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1uby1mZC1ib290Y2hrCitEaXNhYmxlIGJvb3Qgc2lnbmF0dXJlIGNoZWNraW5nIGZvciBmbG9wcHkgZGlza3MgaW4gQm9jaHMgQklPUy4gSXQgbWF5CitiZSBuZWVkZWQgdG8gYm9vdCBmcm9tIG9sZCBmbG9wcHkgZGlza3MuCitFVEVYSQorCisjaWZkZWYgVEFSR0VUX0kzODYKK0RFRigibm8tYWNwaSIsIDAsIFFFTVVfT1BUSU9OX25vX2FjcGksCisgICAgICAgICAgICItbm8tYWNwaSAgICAgICAgZGlzYWJsZSBBQ1BJXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLW5vLWFjcGkKK0Rpc2FibGUgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBzdXBwb3J0LiBVc2UKK2l0IGlmIHlvdXIgZ3Vlc3QgT1MgY29tcGxhaW5zIGFib3V0IEFDUEkgcHJvYmxlbXMgKFBDIHRhcmdldCBtYWNoaW5lCitvbmx5KS4KK0VURVhJCisKKyNpZmRlZiBUQVJHRVRfSTM4NgorREVGKCJuby1ocGV0IiwgMCwgUUVNVV9PUFRJT05fbm9faHBldCwKKyAgICAiLW5vLWhwZXQgICAgICAgIGRpc2FibGUgSFBFVFxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1uby1ocGV0CitEaXNhYmxlIEhQRVQgc3VwcG9ydC4KK0VURVhJCisKKyNpZmRlZiBUQVJHRVRfSTM4NgorREVGKCJuby12aXJ0aW8tYmFsbG9vbiIsIDAsIFFFTVVfT1BUSU9OX25vX3ZpcnRpb19iYWxsb29uLAorICAgICItbm8tdmlydGlvLWJhbGxvb24gZGlzYWJsZSB2aXJ0aW8gYmFsbG9vbiBkZXZpY2VcbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtbm8tdmlydGlvLWJhbGxvb24KK0Rpc2FibGUgdmlydGlvLWJhbGxvb24gZGV2aWNlLgorRVRFWEkKKworI2lmZGVmIFRBUkdFVF9JMzg2CitERUYoImFjcGl0YWJsZSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2FjcGl0YWJsZSwKKyAgICAiLWFjcGl0YWJsZSBbc2lnPXN0cl1bLHJldj1uXVssb2VtX2lkPXN0cl1bLG9lbV90YWJsZV9pZD1zdHJdWyxvZW1fcmV2PW5dWyxhc2xfY29tcGlsZXJfaWQ9c3RyXVssYXNsX2NvbXBpbGVyX3Jldj1uXVssZGF0YT1maWxlMVs6ZmlsZTJdLi4uXVxuIgorICAgICIgICAgICAgICAgICAgICAgQUNQSSB0YWJsZSBkZXNjcmlwdGlvblxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1hY3BpdGFibGUgW3NpZz1AdmFye3N0cn1dWyxyZXY9QHZhcntufV1bLG9lbV9pZD1AdmFye3N0cn1dWyxvZW1fdGFibGVfaWQ9QHZhcntzdHJ9XVssb2VtX3Jldj1AdmFye259XSBbLGFzbF9jb21waWxlcl9pZD1AdmFye3N0cn1dWyxhc2xfY29tcGlsZXJfcmV2PUB2YXJ7bn1dWyxkYXRhPUB2YXJ7ZmlsZTF9WzpAdmFye2ZpbGUyfV0uLi5dCitBZGQgQUNQSSB0YWJsZSB3aXRoIHNwZWNpZmllZCBoZWFkZXIgZmllbGRzIGFuZCBjb250ZXh0IGZyb20gc3BlY2lmaWVkIGZpbGVzLgorRVRFWEkKKworI2lmZGVmIFRBUkdFVF9JMzg2CitERUYoInNtYmlvcyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3NtYmlvcywKKyAgICAiLXNtYmlvcyBmaWxlPWJpbmFyeVxuIgorICAgICIgICAgICAgICAgICAgICAgTG9hZCBTTUJJT1MgZW50cnkgZnJvbSBiaW5hcnkgZmlsZVxuIgorICAgICItc21iaW9zIHR5cGU9MFssdmVuZG9yPXN0cl1bLHZlcnNpb249c3RyXVssZGF0ZT1zdHJdWyxyZWxlYXNlPSUlZC4lJWRdXG4iCisgICAgIiAgICAgICAgICAgICAgICBTcGVjaWZ5IFNNQklPUyB0eXBlIDAgZmllbGRzXG4iCisgICAgIi1zbWJpb3MgdHlwZT0xWyxtYW51ZmFjdHVyZXI9c3RyXVsscHJvZHVjdD1zdHJdWyx2ZXJzaW9uPXN0cl1bLHNlcmlhbD1zdHJdXG4iCisgICAgIiAgICAgICAgICAgICAgWyx1dWlkPXV1aWRdWyxza3U9c3RyXVssZmFtaWx5PXN0cl1cbiIKKyAgICAiICAgICAgICAgICAgICAgIFNwZWNpZnkgU01CSU9TIHR5cGUgMSBmaWVsZHNcbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtc21iaW9zIGZpbGU9QHZhcntiaW5hcnl9CitMb2FkIFNNQklPUyBlbnRyeSBmcm9tIGJpbmFyeSBmaWxlLgorCitAaXRlbSAtc21iaW9zIHR5cGU9MFssdmVuZG9yPUB2YXJ7c3RyfV1bLHZlcnNpb249QHZhcntzdHJ9XVssZGF0ZT1AdmFye3N0cn1dWyxyZWxlYXNlPUB2YXJ7JWQuJWR9XQorU3BlY2lmeSBTTUJJT1MgdHlwZSAwIGZpZWxkcworCitAaXRlbSAtc21iaW9zIHR5cGU9MVssbWFudWZhY3R1cmVyPUB2YXJ7c3RyfV1bLHByb2R1Y3Q9QHZhcntzdHJ9XVssdmVyc2lvbj1AdmFye3N0cn1dWyxzZXJpYWw9QHZhcntzdHJ9XVssdXVpZD1AdmFye3V1aWR9XVssc2t1PUB2YXJ7c3RyfV1bLGZhbWlseT1AdmFye3N0cn1dCitTcGVjaWZ5IFNNQklPUyB0eXBlIDEgZmllbGRzCitFVEVYSQorCisjaWZkZWYgVEFSR0VUX0kzODYKK0RFRkhFQURJTkcoKQorI2VuZGlmCitTVEVYSQorQGVuZCB0YWJsZQorRVRFWEkKKworREVGSEVBRElORyhOZXR3b3JrIG9wdGlvbnM6KQorU1RFWEkKK0B0YWJsZSBAb3B0aW9uCitFVEVYSQorCitERUYoIm5ldCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX25ldCwKKyAgICAiLW5ldCBuaWNbLHZsYW49bl1bLG1hY2FkZHI9YWRkcl1bLG1vZGVsPXR5cGVdWyxuYW1lPXN0cl1cbiIKKyAgICAiICAgICAgICAgICAgICAgIGNyZWF0ZSBhIG5ldyBOZXR3b3JrIEludGVyZmFjZSBDYXJkIGFuZCBjb25uZWN0IGl0IHRvIFZMQU4gJ24nXG4iCisjaWZkZWYgQ09ORklHX1NMSVJQCisgICAgIi1uZXQgdXNlclssdmxhbj1uXVssbmFtZT1zdHJdWyxob3N0bmFtZT1ob3N0XVxuIgorICAgICIgICAgICAgICAgICAgICAgY29ubmVjdCB0aGUgdXNlciBtb2RlIG5ldHdvcmsgc3RhY2sgdG8gVkxBTiAnbicgYW5kIHNlbmRcbiIKKyAgICAiICAgICAgICAgICAgICAgIGhvc3RuYW1lICdob3N0JyB0byBESENQIGNsaWVudHNcbiIKKyNlbmRpZgorI2lmZGVmIF9XSU4zMgorICAgICItbmV0IHRhcFssdmxhbj1uXVssbmFtZT1zdHJdLGlmbmFtZT1uYW1lXG4iCisgICAgIiAgICAgICAgICAgICAgICBjb25uZWN0IHRoZSBob3N0IFRBUCBuZXR3b3JrIGludGVyZmFjZSB0byBWTEFOICduJ1xuIgorI2Vsc2UKKyAgICAiLW5ldCB0YXBbLHZsYW49bl1bLG5hbWU9c3RyXVssZmQ9aF1bLGlmbmFtZT1uYW1lXVssc2NyaXB0PWZpbGVdWyxkb3duc2NyaXB0PWRmaWxlXVxuIgorICAgICIgICAgICAgICAgICAgICAgY29ubmVjdCB0aGUgaG9zdCBUQVAgbmV0d29yayBpbnRlcmZhY2UgdG8gVkxBTiAnbicgYW5kIHVzZSB0aGVcbiIKKyAgICAiICAgICAgICAgICAgICAgIG5ldHdvcmsgc2NyaXB0cyAnZmlsZScgKGRlZmF1bHQ9JXMpXG4iCisgICAgIiAgICAgICAgICAgICAgICBhbmQgJ2RmaWxlJyAoZGVmYXVsdD0lcyk7XG4iCisgICAgIiAgICAgICAgICAgICAgICB1c2UgJ1tkb3duXXNjcmlwdD1ubycgdG8gZGlzYWJsZSBzY3JpcHQgZXhlY3V0aW9uO1xuIgorICAgICIgICAgICAgICAgICAgICAgdXNlICdmZD1oJyB0byBjb25uZWN0IHRvIGFuIGFscmVhZHkgb3BlbmVkIFRBUCBpbnRlcmZhY2VcbiIKKyNlbmRpZgorICAgICItbmV0IHNvY2tldFssdmxhbj1uXVssbmFtZT1zdHJdWyxmZD1oXVssbGlzdGVuPVtob3N0XTpwb3J0XVssY29ubmVjdD1ob3N0OnBvcnRdXG4iCisgICAgIiAgICAgICAgICAgICAgICBjb25uZWN0IHRoZSB2bGFuICduJyB0byBhbm90aGVyIFZMQU4gdXNpbmcgYSBzb2NrZXQgY29ubmVjdGlvblxuIgorICAgICItbmV0IHNvY2tldFssdmxhbj1uXVssbmFtZT1zdHJdWyxmZD1oXVssbWNhc3Q9bWFkZHI6cG9ydF1cbiIKKyAgICAiICAgICAgICAgICAgICAgIGNvbm5lY3QgdGhlIHZsYW4gJ24nIHRvIG11bHRpY2FzdCBtYWRkciBhbmQgcG9ydFxuIgorI2lmZGVmIENPTkZJR19WREUKKyAgICAiLW5ldCB2ZGVbLHZsYW49bl1bLG5hbWU9c3RyXVssc29jaz1zb2NrZXRwYXRoXVsscG9ydD1uXVssZ3JvdXA9Z3JvdXBuYW1lXVssbW9kZT1vY3RhbG1vZGVdXG4iCisgICAgIiAgICAgICAgICAgICAgICBjb25uZWN0IHRoZSB2bGFuICduJyB0byBwb3J0ICduJyBvZiBhIHZkZSBzd2l0Y2ggcnVubmluZ1xuIgorICAgICIgICAgICAgICAgICAgICAgb24gaG9zdCBhbmQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBvbiAnc29ja2V0cGF0aCcuXG4iCisgICAgIiAgICAgICAgICAgICAgICBVc2UgZ3JvdXAgJ2dyb3VwbmFtZScgYW5kIG1vZGUgJ29jdGFsbW9kZScgdG8gY2hhbmdlIGRlZmF1bHRcbiIKKyAgICAiICAgICAgICAgICAgICAgIG93bmVyc2hpcCBhbmQgcGVybWlzc2lvbnMgZm9yIGNvbW11bmljYXRpb24gcG9ydC5cbiIKKyNlbmRpZgorICAgICItbmV0IGR1bXBbLHZsYW49bl1bLGZpbGU9Zl1bLGxlbj1uXVxuIgorICAgICIgICAgICAgICAgICAgICAgZHVtcCB0cmFmZmljIG9uIHZsYW4gJ24nIHRvIGZpbGUgJ2YnIChtYXggbiBieXRlcyBwZXIgcGFja2V0KVxuIgorICAgICItbmV0IG5vbmUgICAgICAgdXNlIGl0IGFsb25lIHRvIGhhdmUgemVybyBuZXR3b3JrIGRldmljZXM7IGlmIG5vIC1uZXQgb3B0aW9uXG4iCisgICAgIiAgICAgICAgICAgICAgICBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgJy1uZXQgbmljIC1uZXQgdXNlcidcbiIpCitTVEVYSQorQGl0ZW0gLW5ldCBuaWNbLHZsYW49QHZhcntufV1bLG1hY2FkZHI9QHZhcnthZGRyfV1bLG1vZGVsPUB2YXJ7dHlwZX1dWyxuYW1lPUB2YXJ7bmFtZX1dCitDcmVhdGUgYSBuZXcgTmV0d29yayBJbnRlcmZhY2UgQ2FyZCBhbmQgY29ubmVjdCBpdCB0byBWTEFOIEB2YXJ7bn0gKEB2YXJ7bn0KKz0gMCBpcyB0aGUgZGVmYXVsdCkuIFRoZSBOSUMgaXMgYW4gbmUya19wY2kgYnkgZGVmYXVsdCBvbiB0aGUgUEMKK3RhcmdldC4gT3B0aW9uYWxseSwgdGhlIE1BQyBhZGRyZXNzIGNhbiBiZSBjaGFuZ2VkIHRvIEB2YXJ7YWRkcn0KK2FuZCBhIEB2YXJ7bmFtZX0gY2FuIGJlIGFzc2lnbmVkIGZvciB1c2UgaW4gbW9uaXRvciBjb21tYW5kcy4gSWYgbm8KK0BvcHRpb257LW5ldH0gb3B0aW9uIGlzIHNwZWNpZmllZCwgYSBzaW5nbGUgTklDIGlzIGNyZWF0ZWQuCitRZW11IGNhbiBlbXVsYXRlIHNldmVyYWwgZGlmZmVyZW50IG1vZGVscyBvZiBuZXR3b3JrIGNhcmQuCitWYWxpZCB2YWx1ZXMgZm9yIEB2YXJ7dHlwZX0gYXJlCitAY29kZXtpODI1NTF9LCBAY29kZXtpODI1NTdifSwgQGNvZGV7aTgyNTU5ZXJ9LAorQGNvZGV7bmUya19wY2l9LCBAY29kZXtuZTJrX2lzYX0sIEBjb2Rle3BjbmV0fSwgQGNvZGV7cnRsODEzOX0sCitAY29kZXtlMTAwMH0sIEBjb2Rle3NtYzkxYzExMX0sIEBjb2Rle2xhbmNlfSBhbmQgQGNvZGV7bWNmX2ZlY30uCitOb3QgYWxsIGRldmljZXMgYXJlIHN1cHBvcnRlZCBvbiBhbGwgdGFyZ2V0cy4gIFVzZSAtbmV0IG5pYyxtb2RlbD0/Citmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzIGZvciB5b3VyIHRhcmdldC4KKworQGl0ZW0gLW5ldCB1c2VyWyx2bGFuPUB2YXJ7bn1dWyxob3N0bmFtZT1AdmFye25hbWV9XVssbmFtZT1AdmFye25hbWV9XQorVXNlIHRoZSB1c2VyIG1vZGUgbmV0d29yayBzdGFjayB3aGljaCByZXF1aXJlcyBubyBhZG1pbmlzdHJhdG9yCitwcml2aWxlZ2UgdG8gcnVuLiAgQG9wdGlvbntob3N0bmFtZT1uYW1lfSBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjbGllbnQKK2hvc3RuYW1lIHJlcG9ydGVkIGJ5IHRoZSBidWlsdGluIERIQ1Agc2VydmVyLgorCitAaXRlbSAtbmV0IGNoYW5uZWwsQHZhcntwb3J0fTpAdmFye2Rldn0KK0ZvcndhcmQgQG9wdGlvbnt1c2VyfSBUQ1AgY29ubmVjdGlvbiB0byBwb3J0IEB2YXJ7cG9ydH0gdG8gY2hhcmFjdGVyIGRldmljZSBAdmFye2Rldn0KKworQGl0ZW0gLW5ldCB0YXBbLHZsYW49QHZhcntufV1bLG5hbWU9QHZhcntuYW1lfV1bLGZkPUB2YXJ7aH1dWyxpZm5hbWU9QHZhcntuYW1lfV1bLHNjcmlwdD1AdmFye2ZpbGV9XVssZG93bnNjcmlwdD1AdmFye2RmaWxlfV0KK0Nvbm5lY3QgdGhlIGhvc3QgVEFQIG5ldHdvcmsgaW50ZXJmYWNlIEB2YXJ7bmFtZX0gdG8gVkxBTiBAdmFye259LCB1c2UKK3RoZSBuZXR3b3JrIHNjcmlwdCBAdmFye2ZpbGV9IHRvIGNvbmZpZ3VyZSBpdCBhbmQgdGhlIG5ldHdvcmsgc2NyaXB0CitAdmFye2RmaWxlfSB0byBkZWNvbmZpZ3VyZSBpdC4gSWYgQHZhcntuYW1lfSBpcyBub3QgcHJvdmlkZWQsIHRoZSBPUworYXV0b21hdGljYWxseSBwcm92aWRlcyBvbmUuIEBvcHRpb257ZmR9PUB2YXJ7aH0gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQordGhlIGhhbmRsZSBvZiBhbiBhbHJlYWR5IG9wZW5lZCBob3N0IFRBUCBpbnRlcmZhY2UuIFRoZSBkZWZhdWx0IG5ldHdvcmsKK2NvbmZpZ3VyZSBzY3JpcHQgaXMgQGZpbGV7L2V0Yy9xZW11LWlmdXB9IGFuZCB0aGUgZGVmYXVsdCBuZXR3b3JrCitkZWNvbmZpZ3VyZSBzY3JpcHQgaXMgQGZpbGV7L2V0Yy9xZW11LWlmZG93bn0uIFVzZSBAb3B0aW9ue3NjcmlwdD1ub30KK29yIEBvcHRpb257ZG93bnNjcmlwdD1ub30gdG8gZGlzYWJsZSBzY3JpcHQgZXhlY3V0aW9uLiBFeGFtcGxlOgorCitAZXhhbXBsZQorcWVtdSBsaW51eC5pbWcgLW5ldCBuaWMgLW5ldCB0YXAKK0BlbmQgZXhhbXBsZQorCitNb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUgKHR3byBOSUNzLCBlYWNoIG9uZSBjb25uZWN0ZWQgdG8gYSBUQVAgZGV2aWNlKQorQGV4YW1wbGUKK3FlbXUgbGludXguaW1nIC1uZXQgbmljLHZsYW49MCAtbmV0IHRhcCx2bGFuPTAsaWZuYW1lPXRhcDAgXAorICAgICAgICAgICAgICAgLW5ldCBuaWMsdmxhbj0xIC1uZXQgdGFwLHZsYW49MSxpZm5hbWU9dGFwMQorQGVuZCBleGFtcGxlCisKK0BpdGVtIC1uZXQgc29ja2V0Wyx2bGFuPUB2YXJ7bn1dWyxuYW1lPUB2YXJ7bmFtZX1dWyxmZD1AdmFye2h9XVssbGlzdGVuPVtAdmFye2hvc3R9XTpAdmFye3BvcnR9XVssY29ubmVjdD1AdmFye2hvc3R9OkB2YXJ7cG9ydH1dCisKK0Nvbm5lY3QgdGhlIFZMQU4gQHZhcntufSB0byBhIHJlbW90ZSBWTEFOIGluIGFub3RoZXIgUUVNVSB2aXJ0dWFsCittYWNoaW5lIHVzaW5nIGEgVENQIHNvY2tldCBjb25uZWN0aW9uLiBJZiBAb3B0aW9ue2xpc3Rlbn0gaXMKK3NwZWNpZmllZCwgUUVNVSB3YWl0cyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgb24gQHZhcntwb3J0fQorKEB2YXJ7aG9zdH0gaXMgb3B0aW9uYWwpLiBAb3B0aW9ue2Nvbm5lY3R9IGlzIHVzZWQgdG8gY29ubmVjdCB0bworYW5vdGhlciBRRU1VIGluc3RhbmNlIHVzaW5nIHRoZSBAb3B0aW9ue2xpc3Rlbn0gb3B0aW9uLiBAb3B0aW9ue2ZkfT1AdmFye2h9CitzcGVjaWZpZXMgYW4gYWxyZWFkeSBvcGVuZWQgVENQIHNvY2tldC4KKworRXhhbXBsZToKK0BleGFtcGxlCisjIGxhdW5jaCBhIGZpcnN0IFFFTVUgaW5zdGFuY2UKK3FlbXUgbGludXguaW1nIC1uZXQgbmljLG1hY2FkZHI9NTI6NTQ6MDA6MTI6MzQ6NTYgXAorICAgICAgICAgICAgICAgLW5ldCBzb2NrZXQsbGlzdGVuPToxMjM0CisjIGNvbm5lY3QgdGhlIFZMQU4gMCBvZiB0aGlzIGluc3RhbmNlIHRvIHRoZSBWTEFOIDAKKyMgb2YgdGhlIGZpcnN0IGluc3RhbmNlCitxZW11IGxpbnV4LmltZyAtbmV0IG5pYyxtYWNhZGRyPTUyOjU0OjAwOjEyOjM0OjU3IFwKKyAgICAgICAgICAgICAgIC1uZXQgc29ja2V0LGNvbm5lY3Q9MTI3LjAuMC4xOjEyMzQKK0BlbmQgZXhhbXBsZQorCitAaXRlbSAtbmV0IHNvY2tldFssdmxhbj1AdmFye259XVssbmFtZT1AdmFye25hbWV9XVssZmQ9QHZhcntofV1bLG1jYXN0PUB2YXJ7bWFkZHJ9OkB2YXJ7cG9ydH1dCisKK0NyZWF0ZSBhIFZMQU4gQHZhcntufSBzaGFyZWQgd2l0aCBhbm90aGVyIFFFTVUgdmlydHVhbAorbWFjaGluZXMgdXNpbmcgYSBVRFAgbXVsdGljYXN0IHNvY2tldCwgZWZmZWN0aXZlbHkgbWFraW5nIGEgYnVzIGZvcgorZXZlcnkgUUVNVSB3aXRoIHNhbWUgbXVsdGljYXN0IGFkZHJlc3MgQHZhcnttYWRkcn0gYW5kIEB2YXJ7cG9ydH0uCitOT1RFUzoKK0BlbnVtZXJhdGUKK0BpdGVtCitTZXZlcmFsIFFFTVUgY2FuIGJlIHJ1bm5pbmcgb24gZGlmZmVyZW50IGhvc3RzIGFuZCBzaGFyZSBzYW1lIGJ1cyAoYXNzdW1pbmcKK2NvcnJlY3QgbXVsdGljYXN0IHNldHVwIGZvciB0aGVzZSBob3N0cykuCitAaXRlbQorbWNhc3Qgc3VwcG9ydCBpcyBjb21wYXRpYmxlIHdpdGggVXNlciBNb2RlIExpbnV4IChhcmd1bWVudCBAb3B0aW9ue2V0aEB2YXJ7Tn09bWNhc3R9KSwgc2VlCitAdXJse2h0dHA6Ly91c2VyLW1vZGUtbGludXguc2YubmV0fS4KK0BpdGVtCitVc2UgQG9wdGlvbntmZD1ofSB0byBzcGVjaWZ5IGFuIGFscmVhZHkgb3BlbmVkIFVEUCBtdWx0aWNhc3Qgc29ja2V0LgorQGVuZCBlbnVtZXJhdGUKKworRXhhbXBsZToKK0BleGFtcGxlCisjIGxhdW5jaCBvbmUgUUVNVSBpbnN0YW5jZQorcWVtdSBsaW51eC5pbWcgLW5ldCBuaWMsbWFjYWRkcj01Mjo1NDowMDoxMjozNDo1NiBcCisgICAgICAgICAgICAgICAtbmV0IHNvY2tldCxtY2FzdD0yMzAuMC4wLjE6MTIzNAorIyBsYXVuY2ggYW5vdGhlciBRRU1VIGluc3RhbmNlIG9uIHNhbWUgImJ1cyIKK3FlbXUgbGludXguaW1nIC1uZXQgbmljLG1hY2FkZHI9NTI6NTQ6MDA6MTI6MzQ6NTcgXAorICAgICAgICAgICAgICAgLW5ldCBzb2NrZXQsbWNhc3Q9MjMwLjAuMC4xOjEyMzQKKyMgbGF1bmNoIHlldCBhbm90aGVyIFFFTVUgaW5zdGFuY2Ugb24gc2FtZSAiYnVzIgorcWVtdSBsaW51eC5pbWcgLW5ldCBuaWMsbWFjYWRkcj01Mjo1NDowMDoxMjozNDo1OCBcCisgICAgICAgICAgICAgICAtbmV0IHNvY2tldCxtY2FzdD0yMzAuMC4wLjE6MTIzNAorQGVuZCBleGFtcGxlCisKK0V4YW1wbGUgKFVzZXIgTW9kZSBMaW51eCBjb21wYXQuKToKK0BleGFtcGxlCisjIGxhdW5jaCBRRU1VIGluc3RhbmNlIChub3RlIG1jYXN0IGFkZHJlc3Mgc2VsZWN0ZWQKKyMgaXMgVU1MJ3MgZGVmYXVsdCkKK3FlbXUgbGludXguaW1nIC1uZXQgbmljLG1hY2FkZHI9NTI6NTQ6MDA6MTI6MzQ6NTYgXAorICAgICAgICAgICAgICAgLW5ldCBzb2NrZXQsbWNhc3Q9MjM5LjE5Mi4xNjguMToxMTAyCisjIGxhdW5jaCBVTUwKKy9wYXRoL3RvL2xpbnV4IHViZDA9L3BhdGgvdG8vcm9vdF9mcyBldGgwPW1jYXN0CitAZW5kIGV4YW1wbGUKKworQGl0ZW0gLW5ldCB2ZGVbLHZsYW49QHZhcntufV1bLG5hbWU9QHZhcntuYW1lfV1bLHNvY2s9QHZhcntzb2NrZXRwYXRofV1bLHBvcnQ9QHZhcntufV1bLGdyb3VwPUB2YXJ7Z3JvdXBuYW1lfV1bLG1vZGU9QHZhcntvY3RhbG1vZGV9XQorQ29ubmVjdCBWTEFOIEB2YXJ7bn0gdG8gUE9SVCBAdmFye259IG9mIGEgdmRlIHN3aXRjaCBydW5uaW5nIG9uIGhvc3QgYW5kCitsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIG9uIEB2YXJ7c29ja2V0cGF0aH0uIFVzZSBHUk9VUCBAdmFye2dyb3VwbmFtZX0KK2FuZCBNT0RFIEB2YXJ7b2N0YWxtb2RlfSB0byBjaGFuZ2UgZGVmYXVsdCBvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIGZvcgorY29tbXVuaWNhdGlvbiBwb3J0LiBUaGlzIG9wdGlvbiBpcyBhdmFpbGFibGUgb25seSBpZiBRRU1VIGhhcyBiZWVuIGNvbXBpbGVkCit3aXRoIHZkZSBzdXBwb3J0IGVuYWJsZWQuCisKK0V4YW1wbGU6CitAZXhhbXBsZQorIyBsYXVuY2ggdmRlIHN3aXRjaAordmRlX3N3aXRjaCAtRiAtc29jayAvdG1wL215c3dpdGNoCisjIGxhdW5jaCBRRU1VIGluc3RhbmNlCitxZW11IGxpbnV4LmltZyAtbmV0IG5pYyAtbmV0IHZkZSxzb2NrPS90bXAvbXlzd2l0Y2gKK0BlbmQgZXhhbXBsZQorCitAaXRlbSAtbmV0IGR1bXBbLHZsYW49QHZhcntufV1bLGZpbGU9QHZhcntmaWxlfV1bLGxlbj1AdmFye2xlbn1dCitEdW1wIG5ldHdvcmsgdHJhZmZpYyBvbiBWTEFOIEB2YXJ7bn0gdG8gZmlsZSBAdmFye2ZpbGV9IChAZmlsZXtxZW11LXZsYW4wLnBjYXB9IGJ5IGRlZmF1bHQpLgorQXQgbW9zdCBAdmFye2xlbn0gYnl0ZXMgKDY0ayBieSBkZWZhdWx0KSBwZXIgcGFja2V0IGFyZSBzdG9yZWQuIFRoZSBmaWxlIGZvcm1hdCBpcworbGlicGNhcCwgc28gaXQgY2FuIGJlIGFuYWx5emVkIHdpdGggdG9vbHMgc3VjaCBhcyB0Y3BkdW1wIG9yIFdpcmVzaGFyay4KKworQGl0ZW0gLW5ldCBub25lCitJbmRpY2F0ZSB0aGF0IG5vIG5ldHdvcmsgZGV2aWNlcyBzaG91bGQgYmUgY29uZmlndXJlZC4gSXQgaXMgdXNlZCB0bworb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiAoQG9wdGlvbnstbmV0IG5pYyAtbmV0IHVzZXJ9KSB3aGljaAoraXMgYWN0aXZhdGVkIGlmIG5vIEBvcHRpb257LW5ldH0gb3B0aW9ucyBhcmUgcHJvdmlkZWQuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX1NMSVJQCitERUYoInRmdHAiLCBIQVNfQVJHLCBRRU1VX09QVElPTl90ZnRwLCBcCisgICAgIi10ZnRwIGRpciAgICAgICBhbGxvdyB0ZnRwIGFjY2VzcyB0byBmaWxlcyBpbiBkaXIgWy1uZXQgdXNlcl1cbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtdGZ0cCBAdmFye2Rpcn0KK1doZW4gdXNpbmcgdGhlIHVzZXIgbW9kZSBuZXR3b3JrIHN0YWNrLCBhY3RpdmF0ZSBhIGJ1aWx0LWluIFRGVFAKK3NlcnZlci4gVGhlIGZpbGVzIGluIEB2YXJ7ZGlyfSB3aWxsIGJlIGV4cG9zZWQgYXMgdGhlIHJvb3Qgb2YgYSBURlRQIHNlcnZlci4KK1RoZSBURlRQIGNsaWVudCBvbiB0aGUgZ3Vlc3QgbXVzdCBiZSBjb25maWd1cmVkIGluIGJpbmFyeSBtb2RlICh1c2UgdGhlIGNvbW1hbmQKK0Bjb2Rle2Jpbn0gb2YgdGhlIFVuaXggVEZUUCBjbGllbnQpLiBUaGUgaG9zdCBJUCBhZGRyZXNzIG9uIHRoZSBndWVzdCBpcyBhcwordXN1YWwgMTAuMC4yLjIuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX1NMSVJQCitERUYoImJvb3RwIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYm9vdHAsIFwKKyAgICAiLWJvb3RwIGZpbGUgICAgIGFkdmVydGlzZSBmaWxlIGluIEJPT1RQIHJlcGxpZXNcbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtYm9vdHAgQHZhcntmaWxlfQorV2hlbiB1c2luZyB0aGUgdXNlciBtb2RlIG5ldHdvcmsgc3RhY2ssIGJyb2FkY2FzdCBAdmFye2ZpbGV9IGFzIHRoZSBCT09UUAorZmlsZW5hbWUuICBJbiBjb25qdW5jdGlvbiB3aXRoIEBvcHRpb257LXRmdHB9LCB0aGlzIGNhbiBiZSB1c2VkIHRvIG5ldHdvcmsgYm9vdAorYSBndWVzdCBmcm9tIGEgbG9jYWwgZGlyZWN0b3J5LgorCitFeGFtcGxlICh1c2luZyBweGVsaW51eCk6CitAZXhhbXBsZQorcWVtdSAtaGRhIGxpbnV4LmltZyAtYm9vdCBuIC10ZnRwIC9wYXRoL3RvL3RmdHAvZmlsZXMgLWJvb3RwIC9weGVsaW51eC4wCitAZW5kIGV4YW1wbGUKK0VURVhJCisKKyNpZm5kZWYgX1dJTjMyCitERUYoInNtYiIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3NtYiwgXAorICAgICAgICAgICAiLXNtYiBkaXIgICAgICAgIGFsbG93IFNNQiBhY2Nlc3MgdG8gZmlsZXMgaW4gJ2RpcicgWy1uZXQgdXNlcl1cbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtc21iIEB2YXJ7ZGlyfQorV2hlbiB1c2luZyB0aGUgdXNlciBtb2RlIG5ldHdvcmsgc3RhY2ssIGFjdGl2YXRlIGEgYnVpbHQtaW4gU01CCitzZXJ2ZXIgc28gdGhhdCBXaW5kb3dzIE9TZXMgY2FuIGFjY2VzcyB0byB0aGUgaG9zdCBmaWxlcyBpbiBAZmlsZXtAdmFye2Rpcn19Cit0cmFuc3BhcmVudGx5LgorCitJbiB0aGUgZ3Vlc3QgV2luZG93cyBPUywgdGhlIGxpbmU6CitAZXhhbXBsZQorMTAuMC4yLjQgc21ic2VydmVyCitAZW5kIGV4YW1wbGUKK211c3QgYmUgYWRkZWQgaW4gdGhlIGZpbGUgQGZpbGV7QzpcV0lORE9XU1xMTUhPU1RTfSAoZm9yIHdpbmRvd3MgOXgvTWUpCitvciBAZmlsZXtDOlxXSU5OVFxTWVNURU0zMlxEUklWRVJTXEVUQ1xMTUhPU1RTfSAoV2luZG93cyBOVC8yMDAwKS4KKworVGhlbiBAZmlsZXtAdmFye2Rpcn19IGNhbiBiZSBhY2Nlc3NlZCBpbiBAZmlsZXtcXHNtYnNlcnZlclxxZW11fS4KKworTm90ZSB0aGF0IGEgU0FNQkEgc2VydmVyIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBob3N0IE9TIGluCitAZmlsZXsvdXNyL3NiaW4vc21iZH0uIFFFTVUgd2FzIHRlc3RlZCBzdWNjZXNzZnVsbHkgd2l0aCBzbWJkIHZlcnNpb24KKzIuMi43YSBmcm9tIHRoZSBSZWQgSGF0IDkgYW5kIHZlcnNpb24gMy4wLjEwLTEuZmMzIGZyb20gRmVkb3JhIENvcmUgMy4KK0VURVhJCisKKyNpZmRlZiBDT05GSUdfU0xJUlAKK0RFRigicmVkaXIiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9yZWRpciwgXAorICAgICItcmVkaXIgW3RjcHx1ZHBdOmhvc3QtcG9ydDpbZ3Vlc3QtaG9zdF06Z3Vlc3QtcG9ydFxuIiBcCisgICAgIiAgICAgICAgICAgICAgICByZWRpcmVjdCBUQ1Agb3IgVURQIGNvbm5lY3Rpb25zIGZyb20gaG9zdCB0byBndWVzdCBbLW5ldCB1c2VyXVxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1yZWRpciBbdGNwfHVkcF06QHZhcntob3N0LXBvcnR9OltAdmFye2d1ZXN0LWhvc3R9XTpAdmFye2d1ZXN0LXBvcnR9CisKK1doZW4gdXNpbmcgdGhlIHVzZXIgbW9kZSBuZXR3b3JrIHN0YWNrLCByZWRpcmVjdCBpbmNvbWluZyBUQ1Agb3IgVURQCitjb25uZWN0aW9ucyB0byB0aGUgaG9zdCBwb3J0IEB2YXJ7aG9zdC1wb3J0fSB0byB0aGUgZ3Vlc3QKK0B2YXJ7Z3Vlc3QtaG9zdH0gb24gZ3Vlc3QgcG9ydCBAdmFye2d1ZXN0LXBvcnR9LiBJZiBAdmFye2d1ZXN0LWhvc3R9CitpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgaXMgMTAuMC4yLjE1IChkZWZhdWx0IGFkZHJlc3MgZ2l2ZW4gYnkgdGhlCitidWlsdC1pbiBESENQIHNlcnZlcikuIElmIG5vIGNvbm5lY3Rpb24gdHlwZSBpcyBzcGVjaWZpZWQsIFRDUCBpcyB1c2VkLgorCitGb3IgZXhhbXBsZSwgdG8gcmVkaXJlY3QgaG9zdCBYMTEgY29ubmVjdGlvbiBmcm9tIHNjcmVlbiAxIHRvIGd1ZXN0CitzY3JlZW4gMCwgdXNlIHRoZSBmb2xsb3dpbmc6CisKK0BleGFtcGxlCisjIG9uIHRoZSBob3N0CitxZW11IC1yZWRpciB0Y3A6NjAwMTo6NjAwMCBbLi4uXQorIyB0aGlzIGhvc3QgeHRlcm0gc2hvdWxkIG9wZW4gaW4gdGhlIGd1ZXN0IFgxMSBzZXJ2ZXIKK3h0ZXJtIC1kaXNwbGF5IDoxCitAZW5kIGV4YW1wbGUKKworVG8gcmVkaXJlY3QgdGVsbmV0IGNvbm5lY3Rpb25zIGZyb20gaG9zdCBwb3J0IDU1NTUgdG8gdGVsbmV0IHBvcnQgb24KK3RoZSBndWVzdCwgdXNlIHRoZSBmb2xsb3dpbmc6CisKK0BleGFtcGxlCisjIG9uIHRoZSBob3N0CitxZW11IC1yZWRpciB0Y3A6NTU1NTo6MjMgWy4uLl0KK3RlbG5ldCBsb2NhbGhvc3QgNTU1NQorQGVuZCBleGFtcGxlCisKK1RoZW4gd2hlbiB5b3UgdXNlIG9uIHRoZSBob3N0IEBjb2Rle3RlbG5ldCBsb2NhbGhvc3QgNTU1NX0sIHlvdQorY29ubmVjdCB0byB0aGUgZ3Vlc3QgdGVsbmV0IHNlcnZlci4KKworQGVuZCB0YWJsZQorRVRFWEkKKworREVGKCJidCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2J0LCBcCisgICAgIlxuIiBcCisgICAgIi1idCBoY2ksbnVsbCAgICBkdW1iIGJsdWV0b290aCBIQ0kgLSBkb2Vzbid0IHJlc3BvbmQgdG8gY29tbWFuZHNcbiIgXAorICAgICItYnQgaGNpLGhvc3RbOmlkXVxuIiBcCisgICAgIiAgICAgICAgICAgICAgICB1c2UgaG9zdCdzIEhDSSB3aXRoIHRoZSBnaXZlbiBuYW1lXG4iIFwKKyAgICAiLWJ0IGhjaVssdmxhbj1uXVxuIiBcCisgICAgIiAgICAgICAgICAgICAgICBlbXVsYXRlIGEgc3RhbmRhcmQgSENJIGluIHZpcnR1YWwgc2NhdHRlcm5ldCAnbidcbiIgXAorICAgICItYnQgdmhjaVssdmxhbj1uXVxuIiBcCisgICAgIiAgICAgICAgICAgICAgICBhZGQgaG9zdCBjb21wdXRlciB0byB2aXJ0dWFsIHNjYXR0ZXJuZXQgJ24nIHVzaW5nIFZIQ0lcbiIgXAorICAgICItYnQgZGV2aWNlOmRldlssdmxhbj1uXVxuIiBcCisgICAgIiAgICAgICAgICAgICAgICBlbXVsYXRlIGEgYmx1ZXRvb3RoIGRldmljZSAnZGV2JyBpbiBzY2F0dGVybmV0ICduJ1xuIikKK1NURVhJCitCbHVldG9vdGgoUikgb3B0aW9uczoKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIC1idCBoY2lbLi4uXQorRGVmaW5lcyB0aGUgZnVuY3Rpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgQmx1ZXRvb3RoIEhDSS4gIC1idCBvcHRpb25zCithcmUgbWF0Y2hlZCB3aXRoIHRoZSBIQ0lzIHByZXNlbnQgaW4gdGhlIGNob3NlbiBtYWNoaW5lIHR5cGUuICBGb3IKK2V4YW1wbGUgd2hlbiBlbXVsYXRpbmcgYSBtYWNoaW5lIHdpdGggb25seSBvbmUgSENJIGJ1aWx0IGludG8gaXQsIG9ubHkKK3RoZSBmaXJzdCBAY29kZXstYnQgaGNpWy4uLl19IG9wdGlvbiBpcyB2YWxpZCBhbmQgZGVmaW5lcyB0aGUgSENJJ3MKK2xvZ2ljLiAgVGhlIFRyYW5zcG9ydCBMYXllciBpcyBkZWNpZGVkIGJ5IHRoZSBtYWNoaW5lIHR5cGUuICBDdXJyZW50bHkKK3RoZSBtYWNoaW5lcyBAY29kZXtuODAwfSBhbmQgQGNvZGV7bjgxMH0gaGF2ZSBvbmUgSENJIGFuZCBhbGwgb3RoZXIKK21hY2hpbmVzIGhhdmUgbm9uZS4KKworQGFuY2hvcntidC1oY2lzfQorVGhlIGZvbGxvd2luZyB0aHJlZSB0eXBlcyBhcmUgcmVjb2duaXplZDoKKworQHRhYmxlIEBjb2RlCitAaXRlbSAtYnQgaGNpLG51bGwKKyhkZWZhdWx0KSBUaGUgY29ycmVzcG9uZGluZyBCbHVldG9vdGggSENJIGFzc3VtZXMgbm8gaW50ZXJuYWwgbG9naWMKK2FuZCB3aWxsIG5vdCByZXNwb25kIHRvIGFueSBIQ0kgY29tbWFuZHMgb3IgZW1pdCBldmVudHMuCisKK0BpdGVtIC1idCBoY2ksaG9zdFs6QHZhcntpZH1dCisoQGNvZGV7Ymx1ZXp9IG9ubHkpIFRoZSBjb3JyZXNwb25kaW5nIEhDSSBwYXNzZXMgY29tbWFuZHMgLyBldmVudHMKK3RvIC8gZnJvbSB0aGUgcGh5c2ljYWwgSENJIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgQHZhcntpZH0gKGRlZmF1bHQ6CitAY29kZXtoY2kwfSkgb24gdGhlIGNvbXB1dGVyIHJ1bm5pbmcgUUVNVS4gIE9ubHkgYXZhaWxhYmxlIG9uIEBjb2Rle2JsdWV6fQorY2FwYWJsZSBzeXN0ZW1zIGxpa2UgTGludXguCisKK0BpdGVtIC1idCBoY2lbLHZsYW49QHZhcntufV0KK0FkZCBhIHZpcnR1YWwsIHN0YW5kYXJkIEhDSSB0aGF0IHdpbGwgcGFydGljaXBhdGUgaW4gdGhlIEJsdWV0b290aAorc2NhdHRlcm5ldCBAdmFye259IChkZWZhdWx0IEBjb2RlezB9KS4gIFNpbWlsYXJseSB0byBAb3B0aW9uey1uZXR9CitWTEFOcywgZGV2aWNlcyBpbnNpZGUgYSBibHVldG9vdGggbmV0d29yayBAdmFye259IGNhbiBvbmx5IGNvbW11bmljYXRlCit3aXRoIG90aGVyIGRldmljZXMgaW4gdGhlIHNhbWUgbmV0d29yayAoc2NhdHRlcm5ldCkuCitAZW5kIHRhYmxlCisKK0BpdGVtIC1idCB2aGNpWyx2bGFuPUB2YXJ7bn1dCisoTGludXgtaG9zdCBvbmx5KSBDcmVhdGUgYSBIQ0kgaW4gc2NhdHRlcm5ldCBAdmFye259IChkZWZhdWx0IDApIGF0dGFjaGVkCit0byB0aGUgaG9zdCBibHVldG9vdGggc3RhY2sgaW5zdGVhZCBvZiB0byB0aGUgZW11bGF0ZWQgdGFyZ2V0LiAgVGhpcworYWxsb3dzIHRoZSBob3N0IGFuZCB0YXJnZXQgbWFjaGluZXMgdG8gcGFydGljaXBhdGUgaW4gYSBjb21tb24gc2NhdHRlcm5ldAorYW5kIGNvbW11bmljYXRlLiAgUmVxdWlyZXMgdGhlIExpbnV4IEBjb2Rle3ZoY2l9IGRyaXZlciBpbnN0YWxsZWQuICBDYW4KK2JlIHVzZWQgYXMgZm9sbG93aW5nOgorCitAZXhhbXBsZQorcWVtdSBbLi4uT1BUSU9OUy4uLl0gLWJ0IGhjaSx2bGFuPTUgLWJ0IHZoY2ksdmxhbj01CitAZW5kIGV4YW1wbGUKKworQGl0ZW0gLWJ0IGRldmljZTpAdmFye2Rldn1bLHZsYW49QHZhcntufV0KK0VtdWxhdGUgYSBibHVldG9vdGggZGV2aWNlIEB2YXJ7ZGV2fSBhbmQgcGxhY2UgaXQgaW4gbmV0d29yayBAdmFye259CisoZGVmYXVsdCBAY29kZXswfSkuICBRRU1VIGNhbiBvbmx5IGVtdWxhdGUgb25lIHR5cGUgb2YgYmx1ZXRvb3RoIGRldmljZXMKK2N1cnJlbnRseToKKworQHRhYmxlIEBjb2RlCitAaXRlbSBrZXlib2FyZAorVmlydHVhbCB3aXJlbGVzcyBrZXlib2FyZCBpbXBsZW1lbnRpbmcgdGhlIEhJRFAgYmx1ZXRvb3RoIHByb2ZpbGUuCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCitFVEVYSQorCitERUZIRUFESU5HKCkKKworREVGSEVBRElORyhMaW51eCBib290IHNwZWNpZmljOikKK1NURVhJCitXaGVuIHVzaW5nIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gdXNlIGEgZ2l2ZW4KK0xpbnV4IGtlcm5lbCB3aXRob3V0IGluc3RhbGxpbmcgaXQgaW4gdGhlIGRpc2sgaW1hZ2UuIEl0IGNhbiBiZSB1c2VmdWwKK2ZvciBlYXNpZXIgdGVzdGluZyBvZiB2YXJpb3VzIGtlcm5lbHMuCisKK0B0YWJsZSBAb3B0aW9uCitFVEVYSQorCitERUYoImtlcm5lbCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2tlcm5lbCwgXAorICAgICIta2VybmVsIGJ6SW1hZ2UgdXNlICdiekltYWdlJyBhcyBrZXJuZWwgaW1hZ2VcbiIpCitTVEVYSQorQGl0ZW0gLWtlcm5lbCBAdmFye2J6SW1hZ2V9CitVc2UgQHZhcntiekltYWdlfSBhcyBrZXJuZWwgaW1hZ2UuCitFVEVYSQorCitERUYoImFwcGVuZCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2FwcGVuZCwgXAorICAgICItYXBwZW5kIGNtZGxpbmUgdXNlICdjbWRsaW5lJyBhcyBrZXJuZWwgY29tbWFuZCBsaW5lXG4iKQorU1RFWEkKK0BpdGVtIC1hcHBlbmQgQHZhcntjbWRsaW5lfQorVXNlIEB2YXJ7Y21kbGluZX0gYXMga2VybmVsIGNvbW1hbmQgbGluZQorRVRFWEkKKworREVGKCJpbml0cmQiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9pbml0cmQsIFwKKyAgICAgICAgICAgIi1pbml0cmQgZmlsZSAgICB1c2UgJ2ZpbGUnIGFzIGluaXRpYWwgcmFtIGRpc2tcbiIpCitTVEVYSQorQGl0ZW0gLWluaXRyZCBAdmFye2ZpbGV9CitVc2UgQHZhcntmaWxlfSBhcyBpbml0aWFsIHJhbSBkaXNrLgorRVRFWEkKKworU1RFWEkKK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRkhFQURJTkcoKQorCitERUZIRUFESU5HKERlYnVnL0V4cGVydCBvcHRpb25zOikKKworU1RFWEkKK0B0YWJsZSBAb3B0aW9uCitFVEVYSQorCitERUYoInNlcmlhbCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3NlcmlhbCwgXAorICAgICItc2VyaWFsIGRldiAgICAgcmVkaXJlY3QgdGhlIHNlcmlhbCBwb3J0IHRvIGNoYXIgZGV2aWNlICdkZXYnXG4iKQorU1RFWEkKK0BpdGVtIC1zZXJpYWwgQHZhcntkZXZ9CitSZWRpcmVjdCB0aGUgdmlydHVhbCBzZXJpYWwgcG9ydCB0byBob3N0IGNoYXJhY3RlciBkZXZpY2UKK0B2YXJ7ZGV2fS4gVGhlIGRlZmF1bHQgZGV2aWNlIGlzIEBjb2Rle3ZjfSBpbiBncmFwaGljYWwgbW9kZSBhbmQKK0Bjb2Rle3N0ZGlvfSBpbiBub24gZ3JhcGhpY2FsIG1vZGUuCisKK1RoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHNldmVyYWwgdGltZXMgdG8gc2ltdWxhdGUgdXAgdG8gNCBzZXJpYWwKK3BvcnRzLgorCitVc2UgQGNvZGV7LXNlcmlhbCBub25lfSB0byBkaXNhYmxlIGFsbCBzZXJpYWwgcG9ydHMuCisKK0F2YWlsYWJsZSBjaGFyYWN0ZXIgZGV2aWNlcyBhcmU6CitAdGFibGUgQGNvZGUKK0BpdGVtIHZjWzpXeEhdCitWaXJ0dWFsIGNvbnNvbGUuIE9wdGlvbmFsbHksIGEgd2lkdGggYW5kIGhlaWdodCBjYW4gYmUgZ2l2ZW4gaW4gcGl4ZWwgd2l0aAorQGV4YW1wbGUKK3ZjOjgwMHg2MDAKK0BlbmQgZXhhbXBsZQorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHdpZHRoIG9yIGhlaWdodCBpbiBjaGFyYWN0ZXJzOgorQGV4YW1wbGUKK3ZjOjgwQ3gyNEMKK0BlbmQgZXhhbXBsZQorQGl0ZW0gcHR5CitbTGludXggb25seV0gUHNldWRvIFRUWSAoYSBuZXcgUFRZIGlzIGF1dG9tYXRpY2FsbHkgYWxsb2NhdGVkKQorQGl0ZW0gbm9uZQorTm8gZGV2aWNlIGlzIGFsbG9jYXRlZC4KK0BpdGVtIG51bGwKK3ZvaWQgZGV2aWNlCitAaXRlbSAvZGV2L1hYWAorW0xpbnV4IG9ubHldIFVzZSBob3N0IHR0eSwgZS5nLiBAZmlsZXsvZGV2L3R0eVMwfS4gVGhlIGhvc3Qgc2VyaWFsIHBvcnQKK3BhcmFtZXRlcnMgYXJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIGVtdWxhdGVkIG9uZXMuCitAaXRlbSAvZGV2L3BhcnBvcnRAdmFye059CitbTGludXggb25seSwgcGFyYWxsZWwgcG9ydCBvbmx5XSBVc2UgaG9zdCBwYXJhbGxlbCBwb3J0CitAdmFye059LiBDdXJyZW50bHkgU1BQIGFuZCBFUFAgcGFyYWxsZWwgcG9ydCBmZWF0dXJlcyBjYW4gYmUgdXNlZC4KK0BpdGVtIGZpbGU6QHZhcntmaWxlbmFtZX0KK1dyaXRlIG91dHB1dCB0byBAdmFye2ZpbGVuYW1lfS4gTm8gY2hhcmFjdGVyIGNhbiBiZSByZWFkLgorQGl0ZW0gc3RkaW8KK1tVbml4IG9ubHldIHN0YW5kYXJkIGlucHV0L291dHB1dAorQGl0ZW0gcGlwZTpAdmFye2ZpbGVuYW1lfQorbmFtZSBwaXBlIEB2YXJ7ZmlsZW5hbWV9CitAaXRlbSBDT01AdmFye259CitbV2luZG93cyBvbmx5XSBVc2UgaG9zdCBzZXJpYWwgcG9ydCBAdmFye259CitAaXRlbSB1ZHA6W0B2YXJ7cmVtb3RlX2hvc3R9XTpAdmFye3JlbW90ZV9wb3J0fVtAQFtAdmFye3NyY19pcH1dOkB2YXJ7c3JjX3BvcnR9XQorVGhpcyBpbXBsZW1lbnRzIFVEUCBOZXQgQ29uc29sZS4KK1doZW4gQHZhcntyZW1vdGVfaG9zdH0gb3IgQHZhcntzcmNfaXB9IGFyZSBub3Qgc3BlY2lmaWVkCit0aGV5IGRlZmF1bHQgdG8gQGNvZGV7MC4wLjAuMH0uCitXaGVuIG5vdCB1c2luZyBhIHNwZWNpZmllZCBAdmFye3NyY19wb3J0fSBhIHJhbmRvbSBwb3J0IGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuLgorQGl0ZW0gbXNtb3VzZQorVGhyZWUgYnV0dG9uIHNlcmlhbCBtb3VzZS4gQ29uZmlndXJlIHRoZSBndWVzdCB0byB1c2UgTWljcm9zb2Z0IHByb3RvY29sLgorCitJZiB5b3UganVzdCB3YW50IGEgc2ltcGxlIHJlYWRvbmx5IGNvbnNvbGUgeW91IGNhbiB1c2UgQGNvZGV7bmV0Y2F0fSBvcgorQGNvZGV7bmN9LCBieSBzdGFydGluZyBxZW11IHdpdGg6IEBjb2Rley1zZXJpYWwgdWRwOjo0NTU1fSBhbmQgbmMgYXM6CitAY29kZXtuYyAtdSAtbCAtcCA0NTU1fS4gQW55IHRpbWUgcWVtdSB3cml0ZXMgc29tZXRoaW5nIHRvIHRoYXQgcG9ydCBpdAord2lsbCBhcHBlYXIgaW4gdGhlIG5ldGNvbnNvbGUgc2Vzc2lvbi4KKworSWYgeW91IHBsYW4gdG8gc2VuZCBjaGFyYWN0ZXJzIGJhY2sgdmlhIG5ldGNvbnNvbGUgb3IgeW91IHdhbnQgdG8gc3RvcAorYW5kIHN0YXJ0IHFlbXUgYSBsb3Qgb2YgdGltZXMsIHlvdSBzaG91bGQgaGF2ZSBxZW11IHVzZSB0aGUgc2FtZQorc291cmNlIHBvcnQgZWFjaCB0aW1lIGJ5IHVzaW5nIHNvbWV0aGluZyBsaWtlIEBjb2Rley1zZXJpYWwKK3VkcDo6NDU1NUBAOjQ1NTZ9IHRvIHFlbXUuIEFub3RoZXIgYXBwcm9hY2ggaXMgdG8gdXNlIGEgcGF0Y2hlZAordmVyc2lvbiBvZiBuZXRjYXQgd2hpY2ggY2FuIGxpc3RlbiB0byBhIFRDUCBwb3J0IGFuZCBzZW5kIGFuZCByZWNlaXZlCitjaGFyYWN0ZXJzIHZpYSB1ZHAuICBJZiB5b3UgaGF2ZSBhIHBhdGNoZWQgdmVyc2lvbiBvZiBuZXRjYXQgd2hpY2gKK2FjdGl2YXRlcyB0ZWxuZXQgcmVtb3RlIGVjaG8gYW5kIHNpbmdsZSBjaGFyIHRyYW5zZmVyLCB0aGVuIHlvdSBjYW4KK3VzZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgdG8gc3RlcCB1cCBhIG5ldGNhdCByZWRpcmVjdG9yIHRvIGFsbG93Cit0ZWxuZXQgb24gcG9ydCA1NTU1IHRvIGFjY2VzcyB0aGUgcWVtdSBwb3J0LgorQHRhYmxlIEBjb2RlCitAaXRlbSBRZW11IE9wdGlvbnM6Cistc2VyaWFsIHVkcDo6NDU1NUBAOjQ1NTYKK0BpdGVtIG5ldGNhdCBvcHRpb25zOgorLXUgLVAgNDU1NSAtTCAwLjAuMC4wOjQ1NTYgLXQgLXAgNTU1NSAtSSAtVAorQGl0ZW0gdGVsbmV0IG9wdGlvbnM6Citsb2NhbGhvc3QgNTU1NQorQGVuZCB0YWJsZQorCitAaXRlbSB0Y3A6W0B2YXJ7aG9zdH1dOkB2YXJ7cG9ydH1bLEB2YXJ7c2VydmVyfV1bLG5vd2FpdF1bLG5vZGVsYXldCitUaGUgVENQIE5ldCBDb25zb2xlIGhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLiAgSXQgY2FuIHNlbmQgdGhlIHNlcmlhbAorSS9PIHRvIGEgbG9jYXRpb24gb3Igd2FpdCBmb3IgYSBjb25uZWN0aW9uIGZyb20gYSBsb2NhdGlvbi4gIEJ5IGRlZmF1bHQKK3RoZSBUQ1AgTmV0IENvbnNvbGUgaXMgc2VudCB0byBAdmFye2hvc3R9IGF0IHRoZSBAdmFye3BvcnR9LiAgSWYgeW91IHVzZQordGhlIEB2YXJ7c2VydmVyfSBvcHRpb24gUUVNVSB3aWxsIHdhaXQgZm9yIGEgY2xpZW50IHNvY2tldCBhcHBsaWNhdGlvbgordG8gY29ubmVjdCB0byB0aGUgcG9ydCBiZWZvcmUgY29udGludWluZywgdW5sZXNzIHRoZSBAY29kZXtub3dhaXR9CitvcHRpb24gd2FzIHNwZWNpZmllZC4gIFRoZSBAY29kZXtub2RlbGF5fSBvcHRpb24gZGlzYWJsZXMgdGhlIE5hZ2xlIGJ1ZmZlcmluZworYWxnb3JpdGhtLiAgSWYgQHZhcntob3N0fSBpcyBvbWl0dGVkLCAwLjAuMC4wIGlzIGFzc3VtZWQuIE9ubHkKK29uZSBUQ1AgY29ubmVjdGlvbiBhdCBhIHRpbWUgaXMgYWNjZXB0ZWQuIFlvdSBjYW4gdXNlIEBjb2Rle3RlbG5ldH0gdG8KK2Nvbm5lY3QgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyIGRldmljZS4KK0B0YWJsZSBAY29kZQorQGl0ZW0gRXhhbXBsZSB0byBzZW5kIHRjcCBjb25zb2xlIHRvIDE5Mi4xNjguMC4yIHBvcnQgNDQ0NAorLXNlcmlhbCB0Y3A6MTkyLjE2OC4wLjI6NDQ0NAorQGl0ZW0gRXhhbXBsZSB0byBsaXN0ZW4gYW5kIHdhaXQgb24gcG9ydCA0NDQ0IGZvciBjb25uZWN0aW9uCistc2VyaWFsIHRjcDo6NDQ0NCxzZXJ2ZXIKK0BpdGVtIEV4YW1wbGUgdG8gbm90IHdhaXQgYW5kIGxpc3RlbiBvbiBpcCAxOTIuMTY4LjAuMTAwIHBvcnQgNDQ0NAorLXNlcmlhbCB0Y3A6MTkyLjE2OC4wLjEwMDo0NDQ0LHNlcnZlcixub3dhaXQKK0BlbmQgdGFibGUKKworQGl0ZW0gdGVsbmV0OkB2YXJ7aG9zdH06QHZhcntwb3J0fVssc2VydmVyXVssbm93YWl0XVssbm9kZWxheV0KK1RoZSB0ZWxuZXQgcHJvdG9jb2wgaXMgdXNlZCBpbnN0ZWFkIG9mIHJhdyB0Y3Agc29ja2V0cy4gIFRoZSBvcHRpb25zCit3b3JrIHRoZSBzYW1lIGFzIGlmIHlvdSBoYWQgc3BlY2lmaWVkIEBjb2Rley1zZXJpYWwgdGNwfS4gIFRoZQorZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBwb3J0IGFjdHMgbGlrZSBhIHRlbG5ldCBzZXJ2ZXIgb3IgY2xpZW50IHVzaW5nCit0ZWxuZXQgb3B0aW9uIG5lZ290aWF0aW9uLiAgVGhpcyB3aWxsIGFsc28gYWxsb3cgeW91IHRvIHNlbmQgdGhlCitNQUdJQ19TWVNSUSBzZXF1ZW5jZSBpZiB5b3UgdXNlIGEgdGVsbmV0IHRoYXQgc3VwcG9ydHMgc2VuZGluZyB0aGUgYnJlYWsKK3NlcXVlbmNlLiAgVHlwaWNhbGx5IGluIHVuaXggdGVsbmV0IHlvdSBkbyBpdCB3aXRoIENvbnRyb2wtXSBhbmQgdGhlbgordHlwZSAic2VuZCBicmVhayIgZm9sbG93ZWQgYnkgcHJlc3NpbmcgdGhlIGVudGVyIGtleS4KKworQGl0ZW0gdW5peDpAdmFye3BhdGh9WyxzZXJ2ZXJdWyxub3dhaXRdCitBIHVuaXggZG9tYWluIHNvY2tldCBpcyB1c2VkIGluc3RlYWQgb2YgYSB0Y3Agc29ja2V0LiAgVGhlIG9wdGlvbiB3b3JrcyB0aGUKK3NhbWUgYXMgaWYgeW91IGhhZCBzcGVjaWZpZWQgQGNvZGV7LXNlcmlhbCB0Y3B9IGV4Y2VwdCB0aGUgdW5peCBkb21haW4gc29ja2V0CitAdmFye3BhdGh9IGlzIHVzZWQgZm9yIGNvbm5lY3Rpb25zLgorCitAaXRlbSBtb246QHZhcntkZXZfc3RyaW5nfQorVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHRvIGFsbG93IHRoZSBtb25pdG9yIHRvIGJlIG11bHRpcGxleGVkIG9udG8KK2Fub3RoZXIgc2VyaWFsIHBvcnQuICBUaGUgbW9uaXRvciBpcyBhY2Nlc3NlZCB3aXRoIGtleSBzZXF1ZW5jZSBvZgorQGtleXtDb250cm9sLWF9IGFuZCB0aGVuIHByZXNzaW5nIEBrZXl7Y30uIFNlZSBtb25pdG9yIGFjY2VzcworQHJlZntwY3N5c19rZXlzfSBpbiB0aGUgLW5vZ3JhcGhpYyBzZWN0aW9uIGZvciBtb3JlIGtleXMuCitAdmFye2Rldl9zdHJpbmd9IHNob3VsZCBiZSBhbnkgb25lIG9mIHRoZSBzZXJpYWwgZGV2aWNlcyBzcGVjaWZpZWQKK2Fib3ZlLiAgQW4gZXhhbXBsZSB0byBtdWx0aXBsZXggdGhlIG1vbml0b3Igb250byBhIHRlbG5ldCBzZXJ2ZXIKK2xpc3RlbmluZyBvbiBwb3J0IDQ0NDQgd291bGQgYmU6CitAdGFibGUgQGNvZGUKK0BpdGVtIC1zZXJpYWwgbW9uOnRlbG5ldDo6NDQ0NCxzZXJ2ZXIsbm93YWl0CitAZW5kIHRhYmxlCisKK0BpdGVtIGJyYWlsbGUKK0JyYWlsbGUgZGV2aWNlLiAgVGhpcyB3aWxsIHVzZSBCcmxBUEkgdG8gZGlzcGxheSB0aGUgYnJhaWxsZSBvdXRwdXQgb24gYSByZWFsCitvciBmYWtlIGRldmljZS4KKworQGVuZCB0YWJsZQorRVRFWEkKKworREVGKCJwYXJhbGxlbCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3BhcmFsbGVsLCBcCisgICAgIi1wYXJhbGxlbCBkZXYgICByZWRpcmVjdCB0aGUgcGFyYWxsZWwgcG9ydCB0byBjaGFyIGRldmljZSAnZGV2J1xuIikKK1NURVhJCitAaXRlbSAtcGFyYWxsZWwgQHZhcntkZXZ9CitSZWRpcmVjdCB0aGUgdmlydHVhbCBwYXJhbGxlbCBwb3J0IHRvIGhvc3QgZGV2aWNlIEB2YXJ7ZGV2fSAoc2FtZQorZGV2aWNlcyBhcyB0aGUgc2VyaWFsIHBvcnQpLiBPbiBMaW51eCBob3N0cywgQGZpbGV7L2Rldi9wYXJwb3J0Tn0gY2FuCitiZSB1c2VkIHRvIHVzZSBoYXJkd2FyZSBkZXZpY2VzIGNvbm5lY3RlZCBvbiB0aGUgY29ycmVzcG9uZGluZyBob3N0CitwYXJhbGxlbCBwb3J0LgorCitUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzIHRvIHNpbXVsYXRlIHVwIHRvIDMgcGFyYWxsZWwKK3BvcnRzLgorCitVc2UgQGNvZGV7LXBhcmFsbGVsIG5vbmV9IHRvIGRpc2FibGUgYWxsIHBhcmFsbGVsIHBvcnRzLgorRVRFWEkKKworREVGKCJtb25pdG9yIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fbW9uaXRvciwgXAorICAgICItbW9uaXRvciBkZXYgICAgcmVkaXJlY3QgdGhlIG1vbml0b3IgdG8gY2hhciBkZXZpY2UgJ2RldidcbiIpCitTVEVYSQorQGl0ZW0gLW1vbml0b3IgQHZhcntkZXZ9CitSZWRpcmVjdCB0aGUgbW9uaXRvciB0byBob3N0IGRldmljZSBAdmFye2Rldn0gKHNhbWUgZGV2aWNlcyBhcyB0aGUKK3NlcmlhbCBwb3J0KS4KK1RoZSBkZWZhdWx0IGRldmljZSBpcyBAY29kZXt2Y30gaW4gZ3JhcGhpY2FsIG1vZGUgYW5kIEBjb2Rle3N0ZGlvfSBpbgorbm9uIGdyYXBoaWNhbCBtb2RlLgorRVRFWEkKKworREVGKCJwaWRmaWxlIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fcGlkZmlsZSwgXAorICAgICItcGlkZmlsZSBmaWxlICAgd3JpdGUgUElEIHRvICdmaWxlJ1xuIikKK1NURVhJCitAaXRlbSAtcGlkZmlsZSBAdmFye2ZpbGV9CitTdG9yZSB0aGUgUUVNVSBwcm9jZXNzIFBJRCBpbiBAdmFye2ZpbGV9LiBJdCBpcyB1c2VmdWwgaWYgeW91IGxhdW5jaCBRRU1VCitmcm9tIGEgc2NyaXB0LgorRVRFWEkKKworREVGKCJzaW5nbGVzdGVwIiwgMCwgUUVNVV9PUFRJT05fc2luZ2xlc3RlcCwgXAorICAgICItc2luZ2xlc3RlcCAgIGFsd2F5cyBydW4gaW4gc2luZ2xlc3RlcCBtb2RlXG4iKQorU1RFWEkKK0BpdGVtIC1zaW5nbGVzdGVwCitSdW4gdGhlIGVtdWxhdGlvbiBpbiBzaW5nbGUgc3RlcCBtb2RlLgorRVRFWEkKKworREVGKCJTIiwgMCwgUUVNVV9PUFRJT05fUywgXAorICAgICItUyAgICAgICAgICAgICAgZnJlZXplIENQVSBhdCBzdGFydHVwICh1c2UgJ2MnIHRvIHN0YXJ0IGV4ZWN1dGlvbilcbiIpCitTVEVYSQorQGl0ZW0gLVMKK0RvIG5vdCBzdGFydCBDUFUgYXQgc3RhcnR1cCAoeW91IG11c3QgdHlwZSAnYycgaW4gdGhlIG1vbml0b3IpLgorRVRFWEkKKworREVGKCJnZGIiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9nZGIsIFwKKyAgICAiLWdkYiBkZXYgICAgICAgIHdhaXQgZm9yIGdkYiBjb25uZWN0aW9uIG9uICdkZXYnXG4iKQorU1RFWEkKK0BpdGVtIC1nZGIgQHZhcntkZXZ9CitXYWl0IGZvciBnZGIgY29ubmVjdGlvbiBvbiBkZXZpY2UgQHZhcntkZXZ9IChAcHhyZWZ7Z2RiX3VzYWdlfSkuIFR5cGljYWwKK2Nvbm5lY3Rpb25zIHdpbGwgbGlrZWx5IGJlIFRDUC1iYXNlZCwgYnV0IGFsc28gVURQLCBwc2V1ZG8gVFRZLCBvciBldmVuCitzdGRpbyBhcmUgcmVhc29uYWJsZSB1c2UgY2FzZS4gVGhlIGxhdHRlciBpcyBhbGxvd2luZyB0byBzdGFydCBxZW11IGZyb20KK3dpdGhpbiBnZGIgYW5kIGVzdGFibGlzaCB0aGUgY29ubmVjdGlvbiB2aWEgYSBwaXBlOgorQGV4YW1wbGUKKyhnZGIpIHRhcmdldCByZW1vdGUgfCBleGVjIHFlbXUgLWdkYiBzdGRpbyAuLi4KK0BlbmQgZXhhbXBsZQorRVRFWEkKKworREVGKCJzIiwgMCwgUUVNVV9PUFRJT05fcywgXAorICAgICItcyAgICAgICAgICAgICAgc2hvcnRoYW5kIGZvciAtZ2RiIHRjcDo6JXNcbiIpCitTVEVYSQorQGl0ZW0gLXMKK1Nob3J0aGFuZCBmb3IgLWdkYiB0Y3A6OjEyMzQsIGkuZS4gb3BlbiBhIGdkYnNlcnZlciBvbiBUQ1AgcG9ydCAxMjM0CisoQHB4cmVme2dkYl91c2FnZX0pLgorRVRFWEkKKworREVGKCJkIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fZCwgXAorICAgICItZCBpdGVtMSwuLi4gICAgb3V0cHV0IGxvZyB0byAlcyAodXNlIC1kID8gZm9yIGEgbGlzdCBvZiBsb2cgaXRlbXMpXG4iKQorU1RFWEkKK0BpdGVtIC1kCitPdXRwdXQgbG9nIGluIC90bXAvcWVtdS5sb2cKK0VURVhJCisKK0RFRigiaGRhY2hzIiwgSEFTX0FSRywgUUVNVV9PUFRJT05faGRhY2hzLCBcCisgICAgIi1oZGFjaHMgYyxoLHNbLHRdXG4iIFwKKyAgICAiICAgICAgICAgICAgICAgIGZvcmNlIGhhcmQgZGlzayAwIHBoeXNpY2FsIGdlb21ldHJ5IGFuZCB0aGUgb3B0aW9uYWwgQklPU1xuIiBcCisgICAgIiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiAodD1ub25lIG9yIGxiYSkgKHVzdWFsbHkgcWVtdSBjYW4gZ3Vlc3MgdGhlbSlcbiIpCitTVEVYSQorQGl0ZW0gLWhkYWNocyBAdmFye2N9LEB2YXJ7aH0sQHZhcntzfSxbLEB2YXJ7dH1dCitGb3JjZSBoYXJkIGRpc2sgMCBwaHlzaWNhbCBnZW9tZXRyeSAoMSA8PSBAdmFye2N9IDw9IDE2MzgzLCAxIDw9CitAdmFye2h9IDw9IDE2LCAxIDw9IEB2YXJ7c30gPD0gNjMpIGFuZCBvcHRpb25hbGx5IGZvcmNlIHRoZSBCSU9TCit0cmFuc2xhdGlvbiBtb2RlIChAdmFye3R9PW5vbmUsIGxiYSBvciBhdXRvKS4gVXN1YWxseSBRRU1VIGNhbiBndWVzcworYWxsIHRob3NlIHBhcmFtZXRlcnMuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3Igb2xkIE1TLURPUyBkaXNrCitpbWFnZXMuCitFVEVYSQorCitERUYoIkwiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9MLCBcCisgICAgIi1MIHBhdGggICAgICAgICBzZXQgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIEJJT1MsIFZHQSBCSU9TIGFuZCBrZXltYXBzXG4iKQorU1RFWEkKK0BpdGVtIC1MICBAdmFye3BhdGh9CitTZXQgdGhlIGRpcmVjdG9yeSBmb3IgdGhlIEJJT1MsIFZHQSBCSU9TIGFuZCBrZXltYXBzLgorRVRFWEkKKworREVGKCJiaW9zIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYmlvcywgXAorICAgICItYmlvcyBmaWxlICAgICAgc2V0IHRoZSBmaWxlbmFtZSBmb3IgdGhlIEJJT1NcbiIpCitTVEVYSQorQGl0ZW0gLWJpb3MgQHZhcntmaWxlfQorU2V0IHRoZSBmaWxlbmFtZSBmb3IgdGhlIEJJT1MuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX0tWTQorREVGKCJlbmFibGUta3ZtIiwgMCwgUUVNVV9PUFRJT05fZW5hYmxlX2t2bSwgXAorICAgICItZW5hYmxlLWt2bSAgICAgZW5hYmxlIEtWTSBmdWxsIHZpcnR1YWxpemF0aW9uIHN1cHBvcnRcbiIpCitERUYoImRpc2FibGUta3ZtIiwgMCwgUUVNVV9PUFRJT05fZGlzYWJsZV9rdm0sIFwKKyAgICAiLWRpc2FibGUta3ZtICAgIGRpc2FibGUgS1ZNIGZ1bGwgdmlydHVhbGl6YXRpb24gc3VwcG9ydFxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1lbmFibGUta3ZtCitFbmFibGUgS1ZNIGZ1bGwgdmlydHVhbGl6YXRpb24gc3VwcG9ydC4gVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUKK2lmIEtWTSBzdXBwb3J0IGlzIGVuYWJsZWQgd2hlbiBjb21waWxpbmcuCitFVEVYSQorCisjaWZkZWYgQ09ORklHX0hBWAorREVGKCJlbmFibGUtaGF4IiwgMCwgUUVNVV9PUFRJT05fZW5hYmxlX2hheCwgXAorICAgICItZW5hYmxlLWhheCAgICBFbmFibGUgSEFYIGZ1bGwgdmlydHVhbGl6YXRpb24gc3VwcG9ydFxuIikKK0RFRigiZGlzYWJsZS1oYXgiLCAwLCBRRU1VX09QVElPTl9kaXNhYmxlX2hheCwgXAorICAgICItZGlzYWJsZS1oYXggICBEaXNhYmxlIEhBWCBmdWxsIHZpcnR1YWxpemF0aW9uIHN1cHBvcnRcbiIpCisjZW5kaWYKK1NURVhJCitAaXRlbSAtZW5hYmxlLWhheAorRW5hYmxlIEhBWCAoSGFyZHdhcmUtYmFzZWQgQWNjZWxlcmF0aW9uIGVYZWN1dGlvbikgc3VwcG9ydC4gVGhpcyBvcHRpb24gaXMKK29ubHkgc3VwcG9ydGVkIG9uIE1heCBPUyBYIGFuZCBXaW5kb3dzIHBsYXRmb3JtcywgaWYgeW91IGhhdmUgYW4gSW50ZWwgQ1BVCit3aGljaCBzdXBwb3J0IHRoZSBWVC14IGV4dGVuc2lvbi4gSXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBLVk0uCitFVEVYSQorCitTVEVYSQorQGl0ZW0gLWRpc2FibGUtaGF4CitEaXNhYmxlIEhBWCAoSGFyZHdhcmUtYmFzZWQgQWNjZWxlcmF0aW9uIGVYZWN1dGlvbikgc3VwcG9ydC4gVGhpcworb3B0aW9uIHdpbGwgZGlzYWJsZSB0aGUgZGVmYXVsdCBhY3Rpb24uIEhBWCBpcyBzdXBwb3J0ZWQgb25seSBvbiBNYWMgT1MgWAorYW5kIFdpbmRvd3MgcGxhdGZvcm1zIChpZiBWVCBpcyBwcmVzZW50KSwgYW5kIGl0IGRvZXMgbm90IGNvbmZsaWN0Cit3aXRoIEtWTS4KK0VURVhJCisKKyNpZmRlZiBDT05GSUdfWEVOCitERUYoInhlbi1kb21pZCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3hlbl9kb21pZCwKKyAgICAiLXhlbi1kb21pZCBpZCAgIHNwZWNpZnkgeGVuIGd1ZXN0IGRvbWFpbiBpZFxuIikKK0RFRigieGVuLWNyZWF0ZSIsIDAsIFFFTVVfT1BUSU9OX3hlbl9jcmVhdGUsCisgICAgIi14ZW4tY3JlYXRlICAgICBjcmVhdGUgZG9tYWluIHVzaW5nIHhlbiBoeXBlcmNhbGxzLCBieXBhc3NpbmcgeGVuZFxuIgorICAgICIgICAgICAgICAgICAgICAgd2FybmluZzogc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4geGVuZCBpcyBpbiB1c2VcbiIpCitERUYoInhlbi1hdHRhY2giLCAwLCBRRU1VX09QVElPTl94ZW5fYXR0YWNoLAorICAgICIteGVuLWF0dGFjaCAgICAgYXR0YWNoIHRvIGV4aXN0aW5nIHhlbiBkb21haW5cbiIKKyAgICAiICAgICAgICAgICAgICAgIHhlbmQgd2lsbCB1c2UgdGhpcyB3aGVuIHN0YXJ0aW5nIHFlbXVcbiIpCisjZW5kaWYKKworREVGKCJuby1yZWJvb3QiLCAwLCBRRU1VX09QVElPTl9ub19yZWJvb3QsIFwKKyAgICAiLW5vLXJlYm9vdCAgICAgIGV4aXQgaW5zdGVhZCBvZiByZWJvb3RpbmdcbiIpCitTVEVYSQorQGl0ZW0gLW5vLXJlYm9vdAorRXhpdCBpbnN0ZWFkIG9mIHJlYm9vdGluZy4KK0VURVhJCisKK0RFRigibm8tc2h1dGRvd24iLCAwLCBRRU1VX09QVElPTl9ub19zaHV0ZG93biwgXAorICAgICItbm8tc2h1dGRvd24gICAgc3RvcCBiZWZvcmUgc2h1dGRvd25cbiIpCitTVEVYSQorQGl0ZW0gLW5vLXNodXRkb3duCitEb24ndCBleGl0IFFFTVUgb24gZ3Vlc3Qgc2h1dGRvd24sIGJ1dCBpbnN0ZWFkIG9ubHkgc3RvcCB0aGUgZW11bGF0aW9uLgorVGhpcyBhbGxvd3MgZm9yIGluc3RhbmNlIHN3aXRjaGluZyB0byBtb25pdG9yIHRvIGNvbW1pdCBjaGFuZ2VzIHRvIHRoZQorZGlzayBpbWFnZS4KK0VURVhJCisKK0RFRigibG9hZHZtIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fbG9hZHZtLCBcCisgICAgIi1sb2Fkdm0gW3RhZ3xpZF1cbiIgXAorICAgICIgICAgICAgICAgICAgICAgc3RhcnQgcmlnaHQgYXdheSB3aXRoIGEgc2F2ZWQgc3RhdGUgKGxvYWR2bSBpbiBtb25pdG9yKVxuIikKK1NURVhJCitAaXRlbSAtbG9hZHZtIEB2YXJ7ZmlsZX0KK1N0YXJ0IHJpZ2h0IGF3YXkgd2l0aCBhIHNhdmVkIHN0YXRlIChAY29kZXtsb2Fkdm19IGluIG1vbml0b3IpCitFVEVYSQorCisjaWZuZGVmIF9XSU4zMgorREVGKCJkYWVtb25pemUiLCAwLCBRRU1VX09QVElPTl9kYWVtb25pemUsIFwKKyAgICAiLWRhZW1vbml6ZSAgICAgIGRhZW1vbml6ZSBRRU1VIGFmdGVyIGluaXRpYWxpemluZ1xuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1kYWVtb25pemUKK0RhZW1vbml6ZSB0aGUgUUVNVSBwcm9jZXNzIGFmdGVyIGluaXRpYWxpemF0aW9uLiAgUUVNVSB3aWxsIG5vdCBkZXRhY2ggZnJvbQorc3RhbmRhcmQgSU8gdW50aWwgaXQgaXMgcmVhZHkgdG8gcmVjZWl2ZSBjb25uZWN0aW9ucyBvbiBhbnkgb2YgaXRzIGRldmljZXMuCitUaGlzIG9wdGlvbiBpcyBhIHVzZWZ1bCB3YXkgZm9yIGV4dGVybmFsIHByb2dyYW1zIHRvIGxhdW5jaCBRRU1VIHdpdGhvdXQgaGF2aW5nCit0byBjb3BlIHdpdGggaW5pdGlhbGl6YXRpb24gcmFjZSBjb25kaXRpb25zLgorRVRFWEkKKworREVGKCJvcHRpb24tcm9tIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fb3B0aW9uX3JvbSwgXAorICAgICItb3B0aW9uLXJvbSByb20gbG9hZCBhIGZpbGUsIHJvbSwgaW50byB0aGUgb3B0aW9uIFJPTSBzcGFjZVxuIikKK1NURVhJCitAaXRlbSAtb3B0aW9uLXJvbSBAdmFye2ZpbGV9CitMb2FkIHRoZSBjb250ZW50cyBvZiBAdmFye2ZpbGV9IGFzIGFuIG9wdGlvbiBST00uCitUaGlzIG9wdGlvbiBpcyB1c2VmdWwgdG8gbG9hZCB0aGluZ3MgbGlrZSBFdGhlckJvb3QuCitFVEVYSQorCitERUYoImNsb2NrIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fY2xvY2ssIFwKKyAgICAiLWNsb2NrICAgICAgICAgIGZvcmNlIHRoZSB1c2Ugb2YgdGhlIGdpdmVuIG1ldGhvZHMgZm9yIHRpbWVyIGFsYXJtLlxuIiBcCisgICAgIiAgICAgICAgICAgICAgICBUbyBzZWUgd2hhdCB0aW1lcnMgYXJlIGF2YWlsYWJsZSB1c2UgLWNsb2NrID9cbiIpCitTVEVYSQorQGl0ZW0gLWNsb2NrIEB2YXJ7bWV0aG9kfQorRm9yY2UgdGhlIHVzZSBvZiB0aGUgZ2l2ZW4gbWV0aG9kcyBmb3IgdGltZXIgYWxhcm0uIFRvIHNlZSB3aGF0IHRpbWVycworYXJlIGF2YWlsYWJsZSB1c2UgLWNsb2NrID8uCitFVEVYSQorCitERUYoImxvY2FsdGltZSIsIDAsIFFFTVVfT1BUSU9OX2xvY2FsdGltZSwgXAorICAgICItbG9jYWx0aW1lICAgICAgc2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgdG8gbG9jYWwgdGltZSBbZGVmYXVsdD11dGNdXG4iKQorU1RFWEkKK0BpdGVtIC1sb2NhbHRpbWUKK1NldCB0aGUgcmVhbCB0aW1lIGNsb2NrIHRvIGxvY2FsIHRpbWUgKHRoZSBkZWZhdWx0IGlzIHRvIFVUQwordGltZSkuIFRoaXMgb3B0aW9uIGlzIG5lZWRlZCB0byBoYXZlIGNvcnJlY3QgZGF0ZSBpbiBNUy1ET1Mgb3IKK1dpbmRvd3MuCitFVEVYSQorCitERUYoInN0YXJ0ZGF0ZSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3N0YXJ0ZGF0ZSwgXAorICAgICItc3RhcnRkYXRlICAgICAgc2VsZWN0IGluaXRpYWwgZGF0ZSBvZiB0aGUgY2xvY2tcbiIpCitTVEVYSQorCitAaXRlbSAtc3RhcnRkYXRlIEB2YXJ7ZGF0ZX0KK1NldCB0aGUgaW5pdGlhbCBkYXRlIG9mIHRoZSByZWFsIHRpbWUgY2xvY2suIFZhbGlkIGZvcm1hdHMgZm9yCitAdmFye2RhdGV9IGFyZTogQGNvZGV7bm93fSBvciBAY29kZXsyMDA2LTA2LTE3VDE2OjAxOjIxfSBvcgorQGNvZGV7MjAwNi0wNi0xN30uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEBjb2Rle25vd30uCitFVEVYSQorCisvKiBTdGFydCB1c2VyIG1vZGUgbmV0d29yayBzdGFjayByZXN0cmljdGlvbnMgKi8KK0RFRigiZHJvcC11ZHAiLCAwLCBRRU1VX09QVElPTl9kcm9wX3VkcCwgXAorICAgICItZHJvcC11ZHAgICAgICAgc3RhcnRzIGZpbHRlcmluZyBhbGwgVURQIHBhY2tldHNcbiIpCitTVEVYSQorCitAaXRlbSAtZHJvcC11ZHAKK0VuYWJsZSBkcm9wcGluZyBvZiBhbGwgVURQIHBhY2tldHMuCitFVEVYSQorCisKK0RFRigiZHJvcC10Y3AiLCAwLCBRRU1VX09QVElPTl9kcm9wX3RjcCwgXAorICAgICItZHJvcC10Y3AgICAgICAgc3RhcnRzIGZpbHRlcmluZyBhbGwgVENQIHBhY2tldHNcbiIpCitTVEVYSQorCitAaXRlbSAtZHJvcC10Y3AKK0VuYWJsZSBkcm9wcGluZyBvZiBhbGwgVENQIHBhY2tldHMuCitFVEVYSQorCisKK0RFRigiYWxsb3ctdGNwIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYWxsb3dfdGNwLCBcCisgICAgIi1hbGxvdy10Y3AgICAgICBPbmx5IGFsbG93cyBUQ1AgcGFja2V0cyBmb3IgaG9zdDpwb3J0XG4iKQorU1RFWEkKKworQGl0ZW0gLWFsbG93LXRjcCBAdmFye2hvc3R9OkB2YXJ7cG9ydH0KK0FsbG93cyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGhvc3QgbmFtZWQgQGNvZGV7aG9zdH0gYW5kIHdpdGgKK3RoZSBwb3J0IEBjb2Rle3BvcnR9LgorRVRFWEkKKworCitERUYoImRyb3AtbG9nIiwgMCwgUUVNVV9PUFRJT05fZHJvcF9sb2csIFwKKyAgICAiLWRyb3AtbG9nICAgICAgIENyZWF0ZXMgYSBsb2cgZm9yIGRyb3BwZWQgY29ubmVjdGlvbnNcbiIpCitTVEVYSQorCitAaXRlbSAtZHJvcC1sb2cgQHZhcntmaWxlfQorQ3JlYXRlcyBhIGxvZyBmb3IgZHJvcHBlZCBjb25uZWN0aW9ucyBpbiB0aGUgZmlsZSBAY29kZXtmaWxlfS4KK0VURVhJCisKKy8qIEFkZGl0aW9uYWwgbmV0d29yayByZXN0cmljdGlvbiBvcHRpb25zICovCisKK0RFRigibWF4LWRucy1jb25ucyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX21heF9kbnNfY29ubnMsIFwKKyAgICAiLW1heC1kbnMtY29ubnMgbGltaXQgXG4iCisgICAgIiAgICAgICAgICAgICAgICBMaW1pdHMgdGhlIG1heGltdW0gRE5TIGNvbm5lY3Rpb25zXG4iKQorU1RFWEkKK0BpdGVtIC1tYXgtZG5zLWNvbm5zIEB2YXJ7bGltaXR9CitMaW1pdHMgdGhlIG1heGltdW0gRE5TIGNvbm5lY3Rpb25zIHRvIEB2YXJ7bGltaXR9LgorRVRFWEkKKworREVGKCJhbGxvdy11ZHAiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9hbGxvd191ZHAsIFwKKyAgICAiLWFsbG93LXVkcCBob3N0OnBvcnQgXG4iCisgICAgIiAgICAgICAgICAgICAgICBBbGxvd3MgdWRwIGNvbm5lY3Rpb25zIHRvIGdvIHRocm91Z2ggdG8gaG9zdDpwb3J0XG4iKQorU1RFWEkKK0BpdGVtIC1hbGxvdy11ZHAgQHZhcntob3N0fTpAdmFye3BvcnR9CitBbGxvd3MgdWRwIGNvbm5lY3Rpb25zIHRvIGdvIHRocm91Z2ggdG8gQHZhcntob3N0fTpAdmFye3BvcnR9LgorRVRFWEkKKworREVGKCJkbnMtbG9nIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fZG5zX2xvZywgXAorICAgICItZG5zLWxvZyBmaWxlICAgQ3JlYXRlcyBhIGxvZyBvZiBETlMgbG9va3Vwc1xuIikKK1NURVhJCitAaXRlbSAtZG5zLWxvZyBAdmFye2ZpbGV9CitDcmVhdGVzIGEgbG9nIG9mIEROUyBsb29rdXBzIGFzIEB2YXJ7ZmlsZX0uCitFVEVYSQorCisKK0RFRigibmV0LWZvcndhcmQiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9uZXRfZm9yd2FyZCwgXAorIi1uZXQtZm9yd2FyZCBkc3RfbmV0OmRzdF9tYXNrOmRzdF9wb3J0OnJlZGlyZWN0X2lwOnJlZGlyZWN0X3BvcnQ6XG4iCisiICAgICAgICAgICAgICAgIEZvcndhcmRzIGd1ZXN0IG5ldHdvcmsgdHJhZmZpYyBzZW50IHRvIGRzdF9uZXQoZHN0X21hc2spOmRzdF9wb3J0XG4iCisiICAgICAgICAgICAgICAgIHRvIHJlZGlyZWN0X2lwOnJlZGlyZWN0X3BvcnRcbiIpCisKK1NURVhJCitAaXRlbSAtbmV0LWZvcndhcmQgQHZhcntzZXR0aW5nc30KK0ZvcndhcmRzIG5ldHdvcmsgdHJhZmZpYyB1c2luZyB0aGUgc2V0dGluZ3MgQGNvZGV7c2V0dGluZ3N9LgorRVRFWEkKKworCitERUYoIm5ldC1mb3J3YXJkLXRjcDJzaW5rIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fbmV0X2ZvcndhcmRfdGNwMnNpbmssIFwKKyItbmV0LWZvcndhcmQtdGNwMnNpbmsgc2lua19pcDpzaW5rX3BvcnRcbiIKKyIgICAgICAgICAgICAgICAgRm9yd2FyZHMgYWxsIGRyb3BwZWQgYW5kIG5vbi1mb3J3YXJkZWQgZ3Vlc3QgbmV0d29yayB0cmFmZmljXG4iCisiICAgICAgICAgICAgICAgIHRvIHNwZWNpZmllZCBpcDpwb3J0LiBcbiIpCisKK1NURVhJCitAaXRlbSAtbmV0LWZvcndhcmQtdGNwMnNpbmsgQHZhcntzZXR0aW5nc30KK0ZvcndhcmRzIGFsbCBkcm9wcGVkIGFuZCBub24tZm9yd2FyZGVkIG5ldHdvcmsgdHJhZmZpYyB0byBzaW5rIGlwOnBvcnQuCitFVEVYSQorCisKKworLyogRW5kIFVzZXIgbW9kZSBuZXR3b3JrIHN0YWNrIHJlc3RyaWN0aW9ucyAqLworCisKK0RFRigiaWNvdW50IiwgSEFTX0FSRywgUUVNVV9PUFRJT05faWNvdW50LCBcCisgICAgIi1pY291bnQgW058YXV0b11cbiIgXAorICAgICIgICAgICAgICAgICAgICAgZW5hYmxlIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gY291bnRlciB3aXRoIDJeTiBjbG9jayB0aWNrcyBwZXJcbiIgXAorICAgICIgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25cbiIpCitTVEVYSQorQGl0ZW0gLWljb3VudCBbTnxhdXRvXQorRW5hYmxlIHZpcnR1YWwgaW5zdHJ1Y3Rpb24gY291bnRlci4gIFRoZSB2aXJ0dWFsIGNwdSB3aWxsIGV4ZWN1dGUgb25lCitpbnN0cnVjdGlvbiBldmVyeSAyXk4gbnMgb2YgdmlydHVhbCB0aW1lLiAgSWYgQGNvZGV7YXV0b30gaXMgc3BlY2lmaWVkCit0aGVuIHRoZSB2aXJ0dWFsIGNwdSBzcGVlZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRqdXN0ZWQgdG8ga2VlcCB2aXJ0dWFsCit0aW1lIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIHJlYWwgdGltZS4KKworTm90ZSB0aGF0IHdoaWxlIHRoaXMgb3B0aW9uIGNhbiBnaXZlIGRldGVybWluaXN0aWMgYmVoYXZpb3IsIGl0IGRvZXMgbm90Citwcm92aWRlIGN5Y2xlIGFjY3VyYXRlIGVtdWxhdGlvbi4gIE1vZGVybiBDUFVzIGNvbnRhaW4gc3VwZXJzY2FsYXIgb3V0IG9mCitvcmRlciBjb3JlcyB3aXRoIGNvbXBsZXggY2FjaGUgaGllcmFyY2hpZXMuICBUaGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucworZXhlY3V0ZWQgb2Z0ZW4gaGFzIGxpdHRsZSBvciBubyBjb3JyZWxhdGlvbiB3aXRoIGFjdHVhbCBwZXJmb3JtYW5jZS4KK0VURVhJCisKK0RFRigid2F0Y2hkb2ciLCBIQVNfQVJHLCBRRU1VX09QVElPTl93YXRjaGRvZywgXAorICAgICItd2F0Y2hkb2cgaTYzMDBlc2J8aWI3MDBcbiIgXAorICAgICIgICAgICAgICAgICAgICAgZW5hYmxlIHZpcnR1YWwgaGFyZHdhcmUgd2F0Y2hkb2cgW2RlZmF1bHQ9bm9uZV1cbiIpCitTVEVYSQorQGl0ZW0gLXdhdGNoZG9nIEB2YXJ7bW9kZWx9CitDcmVhdGUgYSB2aXJ0dWFsIGhhcmR3YXJlIHdhdGNoZG9nIGRldmljZS4gIE9uY2UgZW5hYmxlZCAoYnkgYSBndWVzdAorYWN0aW9uKSwgdGhlIHdhdGNoZG9nIG11c3QgYmUgcGVyaW9kaWNhbGx5IHBvbGxlZCBieSBhbiBhZ2VudCBpbnNpZGUKK3RoZSBndWVzdCBvciBlbHNlIHRoZSBndWVzdCB3aWxsIGJlIHJlc3RhcnRlZC4KKworVGhlIEB2YXJ7bW9kZWx9IGlzIHRoZSBtb2RlbCBvZiBoYXJkd2FyZSB3YXRjaGRvZyB0byBlbXVsYXRlLiAgQ2hvaWNlcworZm9yIG1vZGVsIGFyZTogQGNvZGV7aWI3MDB9IChpQkFTRSA3MDApIHdoaWNoIGlzIGEgdmVyeSBzaW1wbGUgSVNBCit3YXRjaGRvZyB3aXRoIGEgc2luZ2xlIHRpbWVyLCBvciBAY29kZXtpNjMwMGVzYn0gKEludGVsIDYzMDBFU0IgSS9PCitjb250cm9sbGVyIGh1Yikgd2hpY2ggaXMgYSBtdWNoIG1vcmUgZmVhdHVyZWZ1bCBQQ0ktYmFzZWQgZHVhbC10aW1lcgord2F0Y2hkb2cuICBDaG9vc2UgYSBtb2RlbCBmb3Igd2hpY2ggeW91ciBndWVzdCBoYXMgZHJpdmVycy4KKworVXNlIEBjb2Rley13YXRjaGRvZyA/fSB0byBsaXN0IGF2YWlsYWJsZSBoYXJkd2FyZSBtb2RlbHMuICBPbmx5IG9uZQord2F0Y2hkb2cgY2FuIGJlIGVuYWJsZWQgZm9yIGEgZ3Vlc3QuCitFVEVYSQorCitERUYoIndhdGNoZG9nLWFjdGlvbiIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3dhdGNoZG9nX2FjdGlvbiwgXAorICAgICItd2F0Y2hkb2ctYWN0aW9uIHJlc2V0fHNodXRkb3dufHBvd2Vyb2ZmfHBhdXNlfGRlYnVnfG5vbmVcbiIgXAorICAgICIgICAgICAgICAgICAgICAgYWN0aW9uIHdoZW4gd2F0Y2hkb2cgZmlyZXMgW2RlZmF1bHQ9cmVzZXRdXG4iKQorU1RFWEkKK0BpdGVtIC13YXRjaGRvZy1hY3Rpb24gQHZhcnthY3Rpb259CisKK1RoZSBAdmFye2FjdGlvbn0gY29udHJvbHMgd2hhdCBRRU1VIHdpbGwgZG8gd2hlbiB0aGUgd2F0Y2hkb2cgdGltZXIKK2V4cGlyZXMuCitUaGUgZGVmYXVsdCBpcworQGNvZGV7cmVzZXR9IChmb3JjZWZ1bGx5IHJlc2V0IHRoZSBndWVzdCkuCitPdGhlciBwb3NzaWJsZSBhY3Rpb25zIGFyZToKK0Bjb2Rle3NodXRkb3dufSAoYXR0ZW1wdCB0byBncmFjZWZ1bGx5IHNodXRkb3duIHRoZSBndWVzdCksCitAY29kZXtwb3dlcm9mZn0gKGZvcmNlZnVsbHkgcG93ZXJvZmYgdGhlIGd1ZXN0KSwKK0Bjb2Rle3BhdXNlfSAocGF1c2UgdGhlIGd1ZXN0KSwKK0Bjb2Rle2RlYnVnfSAocHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIGFuZCBjb250aW51ZSksIG9yCitAY29kZXtub25lfSAoZG8gbm90aGluZykuCisKK05vdGUgdGhhdCB0aGUgQGNvZGV7c2h1dGRvd259IGFjdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBndWVzdCByZXNwb25kcwordG8gQUNQSSBzaWduYWxzLCB3aGljaCBpdCBtYXkgbm90IGJlIGFibGUgdG8gZG8gaW4gdGhlIHNvcnQgb2YKK3NpdHVhdGlvbnMgd2hlcmUgdGhlIHdhdGNoZG9nIHdvdWxkIGhhdmUgZXhwaXJlZCwgYW5kIHRodXMKK0Bjb2Rley13YXRjaGRvZy1hY3Rpb24gc2h1dGRvd259IGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgcHJvZHVjdGlvbiB1c2UuCisKK0V4YW1wbGVzOgorCitAdGFibGUgQGNvZGUKK0BpdGVtIC13YXRjaGRvZyBpNjMwMGVzYiAtd2F0Y2hkb2ctYWN0aW9uIHBhdXNlCitAaXRlbSAtd2F0Y2hkb2cgaWI3MDAKK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRigiZWNociIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2VjaHIsIFwKKyAgICAiLWVjaHIgY2hyICAgICAgIHNldCB0ZXJtaW5hbCBlc2NhcGUgY2hhcmFjdGVyIGluc3RlYWQgb2YgY3RybC1hXG4iKQorU1RFWEkKKworQGl0ZW0gLWVjaHIgbnVtZXJpY19hc2NpaV92YWx1ZQorQ2hhbmdlIHRoZSBlc2NhcGUgY2hhcmFjdGVyIHVzZWQgZm9yIHN3aXRjaGluZyB0byB0aGUgbW9uaXRvciB3aGVuIHVzaW5nCittb25pdG9yIGFuZCBzZXJpYWwgc2hhcmluZy4gIFRoZSBkZWZhdWx0IGlzIEBjb2RlezB4MDF9IHdoZW4gdXNpbmcgdGhlCitAY29kZXstbm9ncmFwaGljfSBvcHRpb24uICBAY29kZXsweDAxfSBpcyBlcXVhbCB0byBwcmVzc2luZworQGNvZGV7Q29udHJvbC1hfS4gIFlvdSBjYW4gc2VsZWN0IGEgZGlmZmVyZW50IGNoYXJhY3RlciBmcm9tIHRoZSBhc2NpaQorY29udHJvbCBrZXlzIHdoZXJlIDEgdGhyb3VnaCAyNiBtYXAgdG8gQ29udHJvbC1hIHRocm91Z2ggQ29udHJvbC16LiAgRm9yCitpbnN0YW5jZSB5b3UgY291bGQgdXNlIHRoZSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0byBjaGFuZ2UgdGhlIGVzY2FwZQorY2hhcmFjdGVyIHRvIENvbnRyb2wtdC4KK0B0YWJsZSBAY29kZQorQGl0ZW0gLWVjaHIgMHgxNAorQGl0ZW0gLWVjaHIgMjAKK0BlbmQgdGFibGUKK0VURVhJCisKK0RFRigidmlydGlvY29uc29sZSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3ZpcnRpb2NvbiwgXAorICAgICItdmlydGlvY29uc29sZSBjXG4iIFwKKyAgICAiICAgICAgICAgICAgICAgIHNldCB2aXJ0aW8gY29uc29sZVxuIikKK1NURVhJCitAaXRlbSAtdmlydGlvY29uc29sZSBAdmFye2N9CitTZXQgdmlydGlvIGNvbnNvbGUuCitFVEVYSQorCitERUYoInNob3ctY3Vyc29yIiwgMCwgUUVNVV9PUFRJT05fc2hvd19jdXJzb3IsIFwKKyAgICAiLXNob3ctY3Vyc29yICAgIHNob3cgY3Vyc29yXG4iKQorU1RFWEkKK0VURVhJCisKK0RFRigidGItc2l6ZSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3RiX3NpemUsIFwKKyAgICAiLXRiLXNpemUgbiAgICAgIHNldCBUQiBzaXplXG4iKQorU1RFWEkKK0VURVhJCisKK0RFRigiaW5jb21pbmciLCBIQVNfQVJHLCBRRU1VX09QVElPTl9pbmNvbWluZywgXAorICAgICItaW5jb21pbmcgcCAgICAgcHJlcGFyZSBmb3IgaW5jb21pbmcgbWlncmF0aW9uLCBsaXN0ZW4gb24gcG9ydCBwXG4iKQorU1RFWEkKK0VURVhJCisKKyNpZm5kZWYgX1dJTjMyCitERUYoImNocm9vdCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2Nocm9vdCwgXAorICAgICItY2hyb290IGRpciAgICAgQ2hyb290IHRvIGRpciBqdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgVk0uXG4iKQorI2VuZGlmCitTVEVYSQorQGl0ZW0gLWNocm9vdCBkaXIKK0ltbWVkaWF0ZWx5IGJlZm9yZSBzdGFydGluZyBndWVzdCBleGVjdXRpb24sIGNocm9vdCB0byB0aGUgc3BlY2lmaWVkCitkaXJlY3RvcnkuICBFc3BlY2lhbGx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIC1ydW5hcy4KK0VURVhJCisKKyNpZm5kZWYgX1dJTjMyCitERUYoInJ1bmFzIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fcnVuYXMsIFwKKyAgICAiLXJ1bmFzIHVzZXIgICAgIENoYW5nZSB0byB1c2VyIGlkIHVzZXIganVzdCBiZWZvcmUgc3RhcnRpbmcgdGhlIFZNLlxuIikKKyNlbmRpZgorU1RFWEkKK0BpdGVtIC1ydW5hcyB1c2VyCitJbW1lZGlhdGVseSBiZWZvcmUgc3RhcnRpbmcgZ3Vlc3QgZXhlY3V0aW9uLCBkcm9wIHJvb3QgcHJpdmlsZWdlcywgc3dpdGNoaW5nCit0byB0aGUgc3BlY2lmaWVkIHVzZXIuCitFVEVYSQorCitTVEVYSQorQGVuZCB0YWJsZQorRVRFWEkKKworI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKSB8fCBkZWZpbmVkKFRBUkdFVF9QUEMpCitERUYoInByb20tZW52IiwgSEFTX0FSRywgUUVNVV9PUFRJT05fcHJvbV9lbnYsCisgICAgIi1wcm9tLWVudiB2YXJpYWJsZT12YWx1ZVxuIgorICAgICIgICAgICAgICAgICAgICAgc2V0IE9wZW5CSU9TIG52cmFtIHZhcmlhYmxlc1xuIikKKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX0FSTSkgfHwgZGVmaW5lZChUQVJHRVRfTTY4SykKK0RFRigic2VtaWhvc3RpbmciLCAwLCBRRU1VX09QVElPTl9zZW1paG9zdGluZywKKyAgICAiLXNlbWlob3N0aW5nICAgIHNlbWlob3N0aW5nIG1vZGVcbiIpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pCitERUYoIm9sZC1wYXJhbSIsIDAsIFFFTVVfT1BUSU9OX29sZF9wYXJhbSwKKyAgICAiLW9sZC1wYXJhbSAgICAgIG9sZCBwYXJhbSBtb2RlXG4iKQorI2VuZGlmCisKK0RFRigibmFuZCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX25hbmQsIFwKKyAgICAiLW5hbmQgPHBhcmFtcz4gIGVuYWJsZSBOQU5EIEZsYXNoIHBhcnRpdGlvblxuIikKKworREVGKCJjb2RlLXByb2ZpbGUiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9jb2RlX3Byb2ZpbGUsIFwKKyAgICAiLWNvZGUtcHJvZmlsZSBuYW1lXG4iIFwKKyAgICAiU2V0IGRpcmVjdG9yeSB0byBzdG9yZSBjb2RlIHByb2ZpbGUgZGF0YS5cbiIgXAorICAgICJUaGUgcHJvZmlsZSBjYW4gYmUgZnVydGhlciBwcm9jZXNzIHRvIGdlbmVyYXRlIGFuIEF1dG9GRE8gcHJvZmlsZSwgIiBcCisgICAgIndoaWNoIGNhbiBiZSB1c2VkIHRvIGRyaXZlIGZlZWRiYWNrIGRpcmVjdGVkIG9wdGltaXphdGlvbnMuICIgXAorICAgICJNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGZyb20gaHR0cHM6Ly9nY2MuZ251Lm9yZy93aWtpL0F1dG9GRE8uXG4iKQorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKK0RFRigic2F2ZXZtLW9uLWV4aXQiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9zYXZldm1fb25fZXhpdCwgXAorICAgICJzYXZldm0tb24tZXhpdCBbdGFnfGlkXVxuIiBcCisgICAgIiAgICAgICAgICAgICAgICBzYXZlIHN0YXRlIGF1dG9tYXRpY2FsbHkgb24gZXhpdFxuIikKK1NURVhJCitAaXRlbSAtc2F2ZXZtLW9uLWV4aXQgQHZhcntmaWxlfQorU2F2ZSBzdGF0ZSBhdXRvbWF0aWNhbGx5IG9uIGV4aXQgKGFzIEBjb2Rle3NhdmV2bX0gaW4gbW9uaXRvcikKK0VURVhJCisKK0RFRigibWljIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fbWljLCBcCisgICAgIi1taWMgPGZpbGU+ICAgICByZWFkIGF1ZGlvIGlucHV0IGZyb20gd2F2IGZpbGVcbiIpCisKK0RFRigiYW5kcm9pZC1wb3J0cyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2FuZHJvaWRfcG9ydHMsIFwKKyAgICAiLWFuZHJvaWQtcG9ydHMgPGNvbnNvbGVwb3J0Piw8YWRicG9ydD4iCisgICAgIiBUQ1AgcG9ydHMgdXNlZCBmb3IgdGhlIGVtdWxhdG9yIGluc3RhbmNlIGFuZCBhZGIgYnJpZGdlXG4iKQorCitERUYoImFuZHJvaWQtcG9ydCIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2FuZHJvaWRfcG9ydCwgXAorICAgICItYW5kcm9pZC1wb3J0IDxjb25zb2xlcG9ydD4iCisgICAgIiBUQ1AgcG9ydCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGVtdWxhdG9yIGluc3RhbmNlXG4iKQorCitERUYoImFuZHJvaWQtcmVwb3J0LWNvbnNvbGUiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9hbmRyb2lkX3JlcG9ydF9jb25zb2xlLCBcCisgICAgIi1hbmRyb2lkLXJlcG9ydC1jb25zb2xlIDxzb2NrZXQ+IgorICAgICIgcmVwb3J0IGNvbnNvbGUgcG9ydCB0byByZW1vdGUgc29ja2V0XG4iKQorCitERUYoImh0dHAtcHJveHkiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9odHRwX3Byb3h5LCBcCisgICAgIi1odHRwLXByb3h5IDxwcm94eT4iCisgICAgIiBtYWtlIFRDUCBjb25uZWN0aW9ucyB0aHJvdWdoIGEgSFRUUC9IVFRQUyBwcm94eVxuIikKKworREVGKCJhbmRyb2lkLWh3IiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYW5kcm9pZF9odywgXAorICAgICItYW5kcm9pZC1odyA8ZmlsZT4gcmVhZCBoYXJkd2FyZSBpbml0aWFsaXphdGlvbiBmcm9tIGluaSBmaWxlXG4iKQorCitERUYoImRucy1zZXJ2ZXIiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9kbnNfc2VydmVyLCBcCisgICAgIi1kbnMtc2VydmVyIDxzZXJ2ZXJzPiB1c2UgdGhpcyBETlMgc2VydmVyKHMpIGluIHRoZSBlbXVsYXRlZCBzeXN0ZW1cbiIpCisKK0RFRigidGltZXpvbmUiLCBIQVNfQVJHLCBRRU1VX09QVElPTl90aW1lem9uZSwgXAorICAgICItdGltZXpvbmUgPHRpbWV6b25lPiB1c2UgdGhpcyB0aW1lem9uZSBpbnN0ZWFkIG9mIHRoZSBob3N0J3MgZGVmYXVsdFxuIikKKworREVGKCJyYWRpbyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3JhZGlvLCBcCisgICAgIi1yYWRpbyA8ZGV2aWNlPiByZWRpcmVjdCByYWRpbyBtb2RlbSBpbnRlcmZhY2UgdG8gY2hhcmFjdGVyIGRldmljZVxuIikKKworREVGKCJncHMiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9ncHMsIFwKKyAgICAiLWdwcyA8ZGV2aWNlPiByZWRpcmVjdCBOTUVBIEdQUyB0byBjaGFyYWN0ZXIgZGV2aWNlXG4iKQorCitERUYoImF1ZGlvIiwgSEFTX0FSRywgUUVNVV9PUFRJT05fYXVkaW8sIFwKKyAgICAiLWF1ZGlvIDxiYWNrZW5kPiB1c2Ugc3BlY2lmaWMgYXVkaW8gYmFja2VuZFxuIikKKworREVGKCJjcHUtZGVsYXkiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9jcHVfZGVsYXksIFwKKyAgICAiLWNwdS1kZWxheSA8Y3B1ZGVsYXk+IHRocm90dGxlIENQVSBlbXVsYXRpb25cbiIpCisKKyNpZmRlZiBDT05GSUdfTkFORF9MSU1JVFMKK0RFRigibmFuZC1saW1pdHMiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9uYW5kX2xpbWl0cywgXAorICAgICItbmFuZC1saW1pdHMgPG5saW1pdHM+IGVuZm9yY2UgTkFORC9GbGFzaCByZWFkL3dyaXRlIHRocmVzaG9sZHNcbiIpCisjZW5kaWYgIC8vIENPTkZJR19OQU5EX0xJTUlUUworCitERUYoInRjcGR1bXAiLCBIQVNfQVJHLCBRRU1VX09QVElPTl90Y3BkdW1wLCBcCisgICAgIi10Y3BkdW1wIDxmaWxlPiBjYXB0dXJlIG5ldHdvcmsgcGFja2V0cyB0byBmaWxlXG4iKQorCitERUYoImJvb3QtcHJvcGVydHkiLCBIQVNfQVJHLCBRRU1VX09QVElPTl9ib290X3Byb3BlcnR5LCBcCisgICAgIi1ib290LXByb3BlcnR5IDxuYW1lPj08dmFsdWU+IHNldCBzeXN0ZW0gcHJvcGVydHkgb24gYm9vdFxuIikKKworREVGKCJsY2QtZGVuc2l0eSIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX2xjZF9kZW5zaXR5LCBcCisgICAgIi1sY2QtZGVuc2l0eSA8ZGVuc2l0eT4gc2V0cyBMQ0QgZGVuc2l0eSBzeXN0ZW0gcHJvcGVydHkgb24gYm9vdFxuIikKKworREVGKCJ1aS1zZXR0aW5ncyIsIEhBU19BUkcsIFFFTVVfT1BUSU9OX3VpX3NldHRpbmdzLCBcCisgICAgIi11aS1zZXR0aW5ncyA8c3RyaW5nPiBvcGFxdWUgc3RyaW5nIGNvbnRhaW5pbmcgcGVyc2l0ZW50IFVJIHNldHRpbmdzXG4iKQorCitERUYoImF1ZGlvLXRlc3Qtb3V0IiwgMCwgUUVNVV9PUFRJT05fYXVkaW9fdGVzdF9vdXQsIFwKKyAgICItYXVkaW8tdGVzdC1vdXQgVGVzdCBhdWRpbyBvdXRwdXRcbiIpCisKK0RFRigic25hcHNob3Qtbm8tdGltZS11cGRhdGUiLCAwLCBRRU1VX09QVElPTl9zbmFwc2hvdF9ub190aW1lX3VwZGF0ZSwgXAorICAgICItc25hcHNob3Qtbm8tdGltZS11cGRhdGUgRGlzYWJsZSB0aW1lIHVwZGF0ZSB3aGVuIHJlc3RvcmluZyBzbmFwc2hvdHNcbiIpCisKK0RFRigic2tpcC1hZGItYXV0aCIsIDAsIFFFTVVfT1BUSU9OX2FuZHJvaWRfc2tpcF9hZGJfYXV0aCwgXAorICAgICItc2tpcC1hZGItYXV0aCBTa2lwIGFkYiBhdXRoZW50aWNhdGlvbiBkaWFsb2d1ZVxuIikKKworI2VuZGlmIC8qIEFORFJPSUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcWVtdS10aW1lci5jIGIvYW5kcm9pZC9xZW11MS9xZW11LXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmNGNiZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcWVtdS10aW1lci5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisKKyNpbmNsdWRlICJody9ody5oIgorCisjaW5jbHVkZSAicWVtdS90aHJlYWQuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaWZkZWYgQ09ORklHX1BPU0lYCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFBPTEwKKyNpbmNsdWRlIDxwb2xsLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUkNUTF9QUl9TRVRfVElNRVJTTEFDSworI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHRpbWVycyAqLworCit0eXBlZGVmIHN0cnVjdCBRRU1VQ2xvY2sgeworICAgIC8qIFdlIHJlbHkgb24gQlFMIHRvIHByb3RlY3QgdGhlIHRpbWVybGlzdHMgKi8KKyAgICBRTElTVF9IRUFEKCwgUUVNVVRpbWVyTGlzdCkgdGltZXJsaXN0czsKKworICAgIE5vdGlmaWVyTGlzdCByZXNldF9ub3RpZmllcnM7CisgICAgaW50NjRfdCBsYXN0OworCisgICAgUUVNVUNsb2NrVHlwZSB0eXBlOworICAgIGJvb2wgZW5hYmxlZDsKK30gUUVNVUNsb2NrOworCitRRU1VVGltZXJMaXN0R3JvdXAgbWFpbl9sb29wX3RsZzsKK1FFTVVDbG9jayBxZW11X2Nsb2Nrc1tRRU1VX0NMT0NLX01BWF07CisKKy8qIEEgUUVNVVRpbWVyTGlzdCBpcyBhIGxpc3Qgb2YgdGltZXJzIGF0dGFjaGVkIHRvIGEgY2xvY2suIE1vcmUKKyAqIHRoYW4gb25lIFFFTVVUaW1lckxpc3QgY2FuIGJlIGF0dGFjaGVkIHRvIGVhY2ggY2xvY2ssIGZvciBpbnN0YW5jZQorICogdXNlZCBieSBkaWZmZXJlbnQgQWlvQ29udGV4dHMgLyB0aHJlYWRzLiBFYWNoIGNsb2NrIGFsc28gaGFzCisgKiBhIGxpc3Qgb2YgdGhlIFFFTVVUaW1lckxpc3RzIGFzc29jaWF0ZWQgd2l0aCBpdCwgaW4gb3JkZXIgdGhhdAorICogcmVlbmFibGluZyB0aGUgY2xvY2sgY2FuIGNhbGwgYWxsIHRoZSBub3RpZmllcnMuCisgKi8KKworc3RydWN0IFFFTVVUaW1lckxpc3QgeworICAgIFFFTVVDbG9jayAqY2xvY2s7CisgICAgUWVtdU11dGV4IGFjdGl2ZV90aW1lcnNfbG9jazsKKyAgICBRRU1VVGltZXIgKmFjdGl2ZV90aW1lcnM7CisgICAgUUxJU1RfRU5UUlkoUUVNVVRpbWVyTGlzdCkgbGlzdDsKKyAgICBRRU1VVGltZXJMaXN0Tm90aWZ5Q0IgKm5vdGlmeV9jYjsKKyAgICB2b2lkICpub3RpZnlfb3BhcXVlOworCisgICAgLyogbGlnaHR3ZWlnaHQgbWV0aG9kIHRvIG1hcmsgdGhlIGVuZCBvZiB0aW1lcmxpc3QncyBydW5uaW5nICovCisgICAgUWVtdUV2ZW50IHRpbWVyc19kb25lX2V2OworfTsKKworLyoqCisgKiBxZW11X2Nsb2NrX3B0cjoKKyAqIEB0eXBlOiB0eXBlIG9mIGNsb2NrCisgKgorICogVHJhbnNsYXRlIGEgY2xvY2sgdHlwZSBpbnRvIGEgcG9pbnRlciB0byBRRU1VQ2xvY2sgb2JqZWN0LgorICoKKyAqIFJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgUUVNVUNsb2NrIG9iamVjdAorICovCitzdGF0aWMgaW5saW5lIFFFTVVDbG9jayAqcWVtdV9jbG9ja19wdHIoUUVNVUNsb2NrVHlwZSB0eXBlKQoreworICAgIHJldHVybiAmcWVtdV9jbG9ja3NbdHlwZV07Cit9CisKK3N0YXRpYyBib29sIHRpbWVyX2V4cGlyZWRfbnMoUUVNVVRpbWVyICp0aW1lcl9oZWFkLCBpbnQ2NF90IGN1cnJlbnRfdGltZSkKK3sKKyAgICByZXR1cm4gdGltZXJfaGVhZCAmJiAodGltZXJfaGVhZC0+ZXhwaXJlX3RpbWUgPD0gY3VycmVudF90aW1lKTsKK30KKworUUVNVVRpbWVyTGlzdCAqdGltZXJsaXN0X25ldyhRRU1VQ2xvY2tUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVUaW1lckxpc3ROb3RpZnlDQiAqY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0OworICAgIFFFTVVDbG9jayAqY2xvY2sgPSBxZW11X2Nsb2NrX3B0cih0eXBlKTsKKworICAgIHRpbWVyX2xpc3QgPSBnX21hbGxvYzAoc2l6ZW9mKFFFTVVUaW1lckxpc3QpKTsKKyAgICBxZW11X2V2ZW50X2luaXQoJnRpbWVyX2xpc3QtPnRpbWVyc19kb25lX2V2LCBmYWxzZSk7CisgICAgdGltZXJfbGlzdC0+Y2xvY2sgPSBjbG9jazsKKyAgICB0aW1lcl9saXN0LT5ub3RpZnlfY2IgPSBjYjsKKyAgICB0aW1lcl9saXN0LT5ub3RpZnlfb3BhcXVlID0gb3BhcXVlOworICAgIHFlbXVfbXV0ZXhfaW5pdCgmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICBRTElTVF9JTlNFUlRfSEVBRCgmY2xvY2stPnRpbWVybGlzdHMsIHRpbWVyX2xpc3QsIGxpc3QpOworICAgIHJldHVybiB0aW1lcl9saXN0OworfQorCit2b2lkIHRpbWVybGlzdF9mcmVlKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpCit7CisgICAgYXNzZXJ0KCF0aW1lcmxpc3RfaGFzX3RpbWVycyh0aW1lcl9saXN0KSk7CisgICAgaWYgKHRpbWVyX2xpc3QtPmNsb2NrKSB7CisgICAgICAgIFFMSVNUX1JFTU9WRSh0aW1lcl9saXN0LCBsaXN0KTsKKyAgICB9CisgICAgcWVtdV9tdXRleF9kZXN0cm95KCZ0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzX2xvY2spOworICAgIGdfZnJlZSh0aW1lcl9saXN0KTsKK30KKworc3RhdGljIHZvaWQgcWVtdV9jbG9ja19pbml0KFFFTVVDbG9ja1R5cGUgdHlwZSkKK3sKKyAgICBRRU1VQ2xvY2sgKmNsb2NrID0gcWVtdV9jbG9ja19wdHIodHlwZSk7CisKKyAgICBjbG9jay0+dHlwZSA9IHR5cGU7CisgICAgY2xvY2stPmVuYWJsZWQgPSB0cnVlOworICAgIGNsb2NrLT5sYXN0ID0gSU5UNjRfTUlOOworICAgIFFMSVNUX0lOSVQoJmNsb2NrLT50aW1lcmxpc3RzKTsKKyAgICBub3RpZmllcl9saXN0X2luaXQoJmNsb2NrLT5yZXNldF9ub3RpZmllcnMpOworICAgIG1haW5fbG9vcF90bGcudGxbdHlwZV0gPSB0aW1lcmxpc3RfbmV3KHR5cGUsIE5VTEwsIE5VTEwpOworfQorCitib29sIHFlbXVfY2xvY2tfdXNlX2Zvcl9kZWFkbGluZShRRU1VQ2xvY2tUeXBlIHR5cGUpCit7CisgICAgcmV0dXJuICEodXNlX2ljb3VudCAmJiAodHlwZSA9PSBRRU1VX0NMT0NLX1ZJUlRVQUwpKTsKK30KKwordm9pZCBxZW11X2Nsb2NrX25vdGlmeShRRU1VQ2xvY2tUeXBlIHR5cGUpCit7CisgICAgUUVNVVRpbWVyTGlzdCAqdGltZXJfbGlzdDsKKyAgICBRRU1VQ2xvY2sgKmNsb2NrID0gcWVtdV9jbG9ja19wdHIodHlwZSk7CisgICAgUUxJU1RfRk9SRUFDSCh0aW1lcl9saXN0LCAmY2xvY2stPnRpbWVybGlzdHMsIGxpc3QpIHsKKyAgICAgICAgdGltZXJsaXN0X25vdGlmeSh0aW1lcl9saXN0KTsKKyAgICB9Cit9CisKKy8qIERpc2FibGluZyB0aGUgY2xvY2sgd2lsbCB3YWl0IGZvciByZWxhdGVkIHRpbWVybGlzdHMgdG8gc3RvcAorICogZXhlY3V0aW5nIHFlbXVfcnVuX3RpbWVycy4gIFRodXMsIHRoaXMgZnVuY3Rpb25zIHNob3VsZCBub3QKKyAqIGJlIHVzZWQgZnJvbSB0aGUgY2FsbGJhY2sgb2YgYSB0aW1lciB0aGF0IGlzIGJhc2VkIG9uIEBjbG9jay4KKyAqIERvaW5nIHNvIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suCisgKgorICogQ2FsbGVyIHNob3VsZCBob2xkIEJRTC4KKyAqLwordm9pZCBxZW11X2Nsb2NrX2VuYWJsZShRRU1VQ2xvY2tUeXBlIHR5cGUsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBRRU1VQ2xvY2sgKmNsb2NrID0gcWVtdV9jbG9ja19wdHIodHlwZSk7CisgICAgUUVNVVRpbWVyTGlzdCAqdGw7CisgICAgYm9vbCBvbGQgPSBjbG9jay0+ZW5hYmxlZDsKKyAgICBjbG9jay0+ZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgaWYgKGVuYWJsZWQgJiYgIW9sZCkgeworICAgICAgICBxZW11X2Nsb2NrX25vdGlmeSh0eXBlKTsKKyAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIG9sZCkgeworICAgICAgICBRTElTVF9GT1JFQUNIKHRsLCAmY2xvY2stPnRpbWVybGlzdHMsIGxpc3QpIHsKKyAgICAgICAgICAgIHFlbXVfZXZlbnRfd2FpdCgmdGwtPnRpbWVyc19kb25lX2V2KTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCB0aW1lcmxpc3RfaGFzX3RpbWVycyhRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0KQoreworICAgIHJldHVybiAhIXRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnM7Cit9CisKK2Jvb2wgcWVtdV9jbG9ja19oYXNfdGltZXJzKFFFTVVDbG9ja1R5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdGltZXJsaXN0X2hhc190aW1lcnMoCisgICAgICAgIG1haW5fbG9vcF90bGcudGxbdHlwZV0pOworfQorCitib29sIHRpbWVybGlzdF9leHBpcmVkKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpCit7CisgICAgaW50NjRfdCBleHBpcmVfdGltZTsKKworICAgIHFlbXVfbXV0ZXhfbG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICBpZiAoIXRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnMpIHsKKyAgICAgICAgcWVtdV9tdXRleF91bmxvY2soJnRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnNfbG9jayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhwaXJlX3RpbWUgPSB0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzLT5leHBpcmVfdGltZTsKKyAgICBxZW11X211dGV4X3VubG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKworICAgIHJldHVybiBleHBpcmVfdGltZSA8IHFlbXVfY2xvY2tfZ2V0X25zKHRpbWVyX2xpc3QtPmNsb2NrLT50eXBlKTsKK30KKworYm9vbCBxZW11X2Nsb2NrX2V4cGlyZWQoUUVNVUNsb2NrVHlwZSB0eXBlKQoreworICAgIHJldHVybiB0aW1lcmxpc3RfZXhwaXJlZCgKKyAgICAgICAgbWFpbl9sb29wX3RsZy50bFt0eXBlXSk7Cit9CisKKy8qCisgKiBBcyBhYm92ZSwgYnV0IHJldHVybiAtMSBmb3Igbm8gZGVhZGxpbmUsIGFuZCBkbyBub3QgY2FwIHRvIDJeMzIKKyAqIGFzIHdlIGtub3cgdGhlIHJlc3VsdCBpcyBhbHdheXMgcG9zaXRpdmUuCisgKi8KKworaW50NjRfdCB0aW1lcmxpc3RfZGVhZGxpbmVfbnMoUUVNVVRpbWVyTGlzdCAqdGltZXJfbGlzdCkKK3sKKyAgICBpbnQ2NF90IGRlbHRhOworICAgIGludDY0X3QgZXhwaXJlX3RpbWU7CisKKyAgICBpZiAoIXRpbWVyX2xpc3QtPmNsb2NrLT5lbmFibGVkKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgYWN0aXZlIHRpbWVycyBsaXN0IG1heSBiZSBtb2RpZmllZCBiZWZvcmUgdGhlIGNhbGxlciB1c2VzIG91ciByZXR1cm4KKyAgICAgKiB2YWx1ZSBidXQgLT5ub3RpZnlfY2IoKSBpcyBjYWxsZWQgd2hlbiB0aGUgZGVhZGxpbmUgY2hhbmdlcy4gIFRoZXJlZm9yZQorICAgICAqIHRoZSBjYWxsZXIgc2hvdWxkIG5vdGljZSB0aGUgY2hhbmdlIGFuZCB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbi4KKyAgICAgKi8KKyAgICBxZW11X211dGV4X2xvY2soJnRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnNfbG9jayk7CisgICAgaWYgKCF0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzKSB7CisgICAgICAgIHFlbXVfbXV0ZXhfdW5sb2NrKCZ0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzX2xvY2spOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV4cGlyZV90aW1lID0gdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVycy0+ZXhwaXJlX3RpbWU7CisgICAgcWVtdV9tdXRleF91bmxvY2soJnRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnNfbG9jayk7CisKKyAgICBkZWx0YSA9IGV4cGlyZV90aW1lIC0gcWVtdV9jbG9ja19nZXRfbnModGltZXJfbGlzdC0+Y2xvY2stPnR5cGUpOworCisgICAgaWYgKGRlbHRhIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIGRlbHRhOworfQorCisvKiBDYWxjdWxhdGUgdGhlIHNvb25lc3QgZGVhZGxpbmUgYWNyb3NzIGFsbCB0aW1lcmxpc3RzIGF0dGFjaGVkCisgKiB0byB0aGUgY2xvY2suIFRoaXMgaXMgdXNlZCBmb3IgdGhlIGljb3VudCB0aW1lb3V0IHNvIHdlCisgKiBpZ25vcmUgd2hldGhlciBvciBub3QgdGhlIGNsb2NrIHNob3VsZCBiZSB1c2VkIGluIGRlYWRsaW5lCisgKiBjYWxjdWxhdGlvbnMuCisgKi8KK2ludDY0X3QgcWVtdV9jbG9ja19kZWFkbGluZV9uc19hbGwoUUVNVUNsb2NrVHlwZSB0eXBlKQoreworICAgIGludDY0X3QgZGVhZGxpbmUgPSAtMTsKKyAgICBRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0OworICAgIFFFTVVDbG9jayAqY2xvY2sgPSBxZW11X2Nsb2NrX3B0cih0eXBlKTsKKyAgICBRTElTVF9GT1JFQUNIKHRpbWVyX2xpc3QsICZjbG9jay0+dGltZXJsaXN0cywgbGlzdCkgeworICAgICAgICBkZWFkbGluZSA9IHFlbXVfc29vbmVzdF90aW1lb3V0KGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVybGlzdF9kZWFkbGluZV9ucyh0aW1lcl9saXN0KSk7CisgICAgfQorICAgIHJldHVybiBkZWFkbGluZTsKK30KKworUUVNVUNsb2NrVHlwZSB0aW1lcmxpc3RfZ2V0X2Nsb2NrKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpCit7CisgICAgcmV0dXJuIHRpbWVyX2xpc3QtPmNsb2NrLT50eXBlOworfQorCitRRU1VVGltZXJMaXN0ICpxZW11X2Nsb2NrX2dldF9tYWluX2xvb3BfdGltZXJsaXN0KFFFTVVDbG9ja1R5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gbWFpbl9sb29wX3RsZy50bFt0eXBlXTsKK30KKwordm9pZCB0aW1lcmxpc3Rfbm90aWZ5KFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpCit7CisgICAgaWYgKHRpbWVyX2xpc3QtPm5vdGlmeV9jYikgeworICAgICAgICB0aW1lcl9saXN0LT5ub3RpZnlfY2IodGltZXJfbGlzdC0+bm90aWZ5X29wYXF1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWVtdV9ub3RpZnlfZXZlbnQoKTsKKyAgICB9Cit9CisKKy8qIFRyYW5zaXRpb24gZnVuY3Rpb24gdG8gY29udmVydCBhIG5hbm9zZWNvbmQgdGltZW91dCB0byBtcworICogVGhpcyBpcyB1c2VkIHdoZXJlIGEgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgcHBvbGwKKyAqLworaW50IHFlbXVfdGltZW91dF9uc190b19tcyhpbnQ2NF90IG5zKQoreworICAgIGludDY0X3QgbXM7CisgICAgaWYgKG5zIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFucykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBBbHdheXMgcm91bmQgdXAsIGJlY2F1c2UgaXQncyBiZXR0ZXIgdG8gd2FpdCB0b28gbG9uZyB0aGFuIHRvIHdhaXQgdG9vCisgICAgICogbGl0dGxlIGFuZCBlZmZlY3RpdmVseSBidXN5LXdhaXQKKyAgICAgKi8KKyAgICBtcyA9IChucyArIFNDQUxFX01TIC0gMSkgLyBTQ0FMRV9NUzsKKworICAgIC8qIFRvIGF2b2lkIG92ZXJmbG93IHByb2JsZW1zLCBsaW1pdCB0aGlzIHRvIDJeMzEsIGkuZS4gYXBwcm94IDI1IGRheXMgKi8KKyAgICBpZiAobXMgPiAoaW50NjRfdCkgSU5UMzJfTUFYKSB7CisgICAgICAgIG1zID0gSU5UMzJfTUFYOworICAgIH0KKworICAgIHJldHVybiAoaW50KSBtczsKK30KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLy8gVE9ETyhkaWdpdCk6IEltcGxlbWVudCBnX3BvbGwoKQorLyogcWVtdSBpbXBsZW1lbnRhdGlvbiBvZiBnX3BvbGwgd2hpY2ggdXNlcyBhIG5hbm9zZWNvbmQgdGltZW91dCBidXQgaXMKKyAqIG90aGVyd2lzZSBpZGVudGljYWwgdG8gZ19wb2xsCisgKi8KK2ludCBxZW11X3BvbGxfbnMoR1BvbGxGRCAqZmRzLCBndWludCBuZmRzLCBpbnQ2NF90IHRpbWVvdXQpCit7CisjaWZkZWYgQ09ORklHX1BQT0xMCisgICAgaWYgKHRpbWVvdXQgPCAwKSB7CisgICAgICAgIHJldHVybiBwcG9sbCgoc3RydWN0IHBvbGxmZCAqKWZkcywgbmZkcywgTlVMTCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgICAgICB0cy50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDAwMDAwMExMOworICAgICAgICB0cy50dl9uc2VjID0gdGltZW91dCAlIDEwMDAwMDAwMDBMTDsKKyAgICAgICAgcmV0dXJuIHBwb2xsKChzdHJ1Y3QgcG9sbGZkICopZmRzLCBuZmRzLCAmdHMsIE5VTEwpOworICAgIH0KKyNlbHNlCisgICAgcmV0dXJuIGdfcG9sbChmZHMsIG5mZHMsIHFlbXVfdGltZW91dF9uc190b19tcyh0aW1lb3V0KSk7CisjZW5kaWYKK30KKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKK3ZvaWQgdGltZXJfaW5pdChRRU1VVGltZXIgKnRzLAorICAgICAgICAgICAgICAgIFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QsIGludCBzY2FsZSwKKyAgICAgICAgICAgICAgICBRRU1VVGltZXJDQiAqY2IsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICB0cy0+dGltZXJfbGlzdCA9IHRpbWVyX2xpc3Q7CisgICAgdHMtPmNiID0gY2I7CisgICAgdHMtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICB0cy0+c2NhbGUgPSBzY2FsZTsKKyAgICB0cy0+ZXhwaXJlX3RpbWUgPSAtMTsKK30KKwordm9pZCB0aW1lcl9mcmVlKFFFTVVUaW1lciAqdHMpCit7CisgICAgZ19mcmVlKHRzKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfZGVsX2xvY2tlZChRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0LCBRRU1VVGltZXIgKnRzKQoreworICAgIFFFTVVUaW1lciAqKnB0LCAqdDsKKworICAgIHRzLT5leHBpcmVfdGltZSA9IC0xOworICAgIHB0ID0gJnRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnM7CisgICAgZm9yKDs7KSB7CisgICAgICAgIHQgPSAqcHQ7CisgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAodCA9PSB0cykgeworICAgICAgICAgICAgKnB0ID0gdC0+bmV4dDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHB0ID0gJnQtPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCB0aW1lcl9tb2RfbnNfbG9ja2VkKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVUaW1lciAqdHMsIGludDY0X3QgZXhwaXJlX3RpbWUpCit7CisgICAgUUVNVVRpbWVyICoqcHQsICp0OworCisgICAgLyogYWRkIHRoZSB0aW1lciBpbiB0aGUgc29ydGVkIGxpc3QgKi8KKyAgICBwdCA9ICZ0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdCA9ICpwdDsKKyAgICAgICAgaWYgKCF0aW1lcl9leHBpcmVkX25zKHQsIGV4cGlyZV90aW1lKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHQgPSAmdC0+bmV4dDsKKyAgICB9CisgICAgdHMtPmV4cGlyZV90aW1lID0gTUFYKGV4cGlyZV90aW1lLCAwKTsKKyAgICB0cy0+bmV4dCA9ICpwdDsKKyAgICAqcHQgPSB0czsKKworICAgIHJldHVybiBwdCA9PSAmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyczsKK30KKworc3RhdGljIHZvaWQgdGltZXJsaXN0X3JlYXJtKFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QpCit7CisgICAgLyogSW50ZXJydXB0IGV4ZWN1dGlvbiB0byBmb3JjZSBkZWFkbGluZSByZWNhbGN1bGF0aW9uLiAgKi8KKyAgICBxZW11X2Nsb2NrX3dhcnAodGltZXJfbGlzdC0+Y2xvY2stPnR5cGUpOworICAgIHRpbWVybGlzdF9ub3RpZnkodGltZXJfbGlzdCk7Cit9CisKKy8qIHN0b3AgYSB0aW1lciwgYnV0IGRvIG5vdCBkZWFsbG9jIGl0ICovCit2b2lkIHRpbWVyX2RlbChRRU1VVGltZXIgKnRzKQoreworICAgIFFFTVVUaW1lckxpc3QgKnRpbWVyX2xpc3QgPSB0cy0+dGltZXJfbGlzdDsKKworICAgIHFlbXVfbXV0ZXhfbG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICB0aW1lcl9kZWxfbG9ja2VkKHRpbWVyX2xpc3QsIHRzKTsKKyAgICBxZW11X211dGV4X3VubG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKK30KKworLyogbW9kaWZ5IHRoZSBjdXJyZW50IHRpbWVyIHNvIHRoYXQgaXQgd2lsbCBiZSBmaXJlZCB3aGVuIGN1cnJlbnRfdGltZQorICAgPj0gZXhwaXJlX3RpbWUuIFRoZSBjb3JyZXNwb25kaW5nIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkLiAqLwordm9pZCB0aW1lcl9tb2RfbnMoUUVNVVRpbWVyICp0cywgaW50NjRfdCBleHBpcmVfdGltZSkKK3sKKyAgICBRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0ID0gdHMtPnRpbWVyX2xpc3Q7CisgICAgYm9vbCByZWFybTsKKworICAgIHFlbXVfbXV0ZXhfbG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICB0aW1lcl9kZWxfbG9ja2VkKHRpbWVyX2xpc3QsIHRzKTsKKyAgICByZWFybSA9IHRpbWVyX21vZF9uc19sb2NrZWQodGltZXJfbGlzdCwgdHMsIGV4cGlyZV90aW1lKTsKKyAgICBxZW11X211dGV4X3VubG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKworICAgIGlmIChyZWFybSkgeworICAgICAgICB0aW1lcmxpc3RfcmVhcm0odGltZXJfbGlzdCk7CisgICAgfQorfQorCisvKiBtb2RpZnkgdGhlIGN1cnJlbnQgdGltZXIgc28gdGhhdCBpdCB3aWxsIGJlIGZpcmVkIHdoZW4gY3VycmVudF90aW1lCisgICA+PSBleHBpcmVfdGltZSBvciB0aGUgY3VycmVudCBkZWFkbGluZSwgd2hpY2hldmVyIGNvbWVzIGVhcmxpZXIuCisgICBUaGUgY29ycmVzcG9uZGluZyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZC4gKi8KK3ZvaWQgdGltZXJfbW9kX2FudGljaXBhdGVfbnMoUUVNVVRpbWVyICp0cywgaW50NjRfdCBleHBpcmVfdGltZSkKK3sKKyAgICBRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0ID0gdHMtPnRpbWVyX2xpc3Q7CisgICAgYm9vbCByZWFybTsKKworICAgIHFlbXVfbXV0ZXhfbG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICBpZiAodHMtPmV4cGlyZV90aW1lID09IC0xIHx8IHRzLT5leHBpcmVfdGltZSA+IGV4cGlyZV90aW1lKSB7CisgICAgICAgIGlmICh0cy0+ZXhwaXJlX3RpbWUgIT0gLTEpIHsKKyAgICAgICAgICAgIHRpbWVyX2RlbF9sb2NrZWQodGltZXJfbGlzdCwgdHMpOworICAgICAgICB9CisgICAgICAgIHJlYXJtID0gdGltZXJfbW9kX25zX2xvY2tlZCh0aW1lcl9saXN0LCB0cywgZXhwaXJlX3RpbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlYXJtID0gZmFsc2U7CisgICAgfQorICAgIHFlbXVfbXV0ZXhfdW5sb2NrKCZ0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzX2xvY2spOworCisgICAgaWYgKHJlYXJtKSB7CisgICAgICAgIHRpbWVybGlzdF9yZWFybSh0aW1lcl9saXN0KTsKKyAgICB9Cit9CisKK3ZvaWQgdGltZXJfbW9kKFFFTVVUaW1lciAqdHMsIGludDY0X3QgZXhwaXJlX3RpbWUpCit7CisgICAgdGltZXJfbW9kX25zKHRzLCBleHBpcmVfdGltZSAqIHRzLT5zY2FsZSk7Cit9CisKK3ZvaWQgdGltZXJfbW9kX2FudGljaXBhdGUoUUVNVVRpbWVyICp0cywgaW50NjRfdCBleHBpcmVfdGltZSkKK3sKKyAgICB0aW1lcl9tb2RfYW50aWNpcGF0ZV9ucyh0cywgZXhwaXJlX3RpbWUgKiB0cy0+c2NhbGUpOworfQorCitib29sIHRpbWVyX3BlbmRpbmcoUUVNVVRpbWVyICp0cykKK3sKKyAgICByZXR1cm4gdHMtPmV4cGlyZV90aW1lID49IDA7Cit9CisKK2Jvb2wgdGltZXJfZXhwaXJlZChRRU1VVGltZXIgKnRpbWVyX2hlYWQsIGludDY0X3QgY3VycmVudF90aW1lKQoreworICAgIHJldHVybiB0aW1lcl9leHBpcmVkX25zKHRpbWVyX2hlYWQsIGN1cnJlbnRfdGltZSAqIHRpbWVyX2hlYWQtPnNjYWxlKTsKK30KKworYm9vbCB0aW1lcmxpc3RfcnVuX3RpbWVycyhRRU1VVGltZXJMaXN0ICp0aW1lcl9saXN0KQoreworICAgIFFFTVVUaW1lciAqdHM7CisgICAgaW50NjRfdCBjdXJyZW50X3RpbWU7CisgICAgYm9vbCBwcm9ncmVzcyA9IGZhbHNlOworICAgIFFFTVVUaW1lckNCICpjYjsKKyAgICB2b2lkICpvcGFxdWU7CisKKyAgICBxZW11X2V2ZW50X3Jlc2V0KCZ0aW1lcl9saXN0LT50aW1lcnNfZG9uZV9ldik7CisgICAgaWYgKCF0aW1lcl9saXN0LT5jbG9jay0+ZW5hYmxlZCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjdXJyZW50X3RpbWUgPSBxZW11X2Nsb2NrX2dldF9ucyh0aW1lcl9saXN0LT5jbG9jay0+dHlwZSk7CisgICAgZm9yKDs7KSB7CisgICAgICAgIHFlbXVfbXV0ZXhfbG9jaygmdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVyc19sb2NrKTsKKyAgICAgICAgdHMgPSB0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzOworICAgICAgICBpZiAoIXRpbWVyX2V4cGlyZWRfbnModHMsIGN1cnJlbnRfdGltZSkpIHsKKyAgICAgICAgICAgIHFlbXVfbXV0ZXhfdW5sb2NrKCZ0aW1lcl9saXN0LT5hY3RpdmVfdGltZXJzX2xvY2spOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiByZW1vdmUgdGltZXIgZnJvbSB0aGUgbGlzdCBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2sgKi8KKyAgICAgICAgdGltZXJfbGlzdC0+YWN0aXZlX3RpbWVycyA9IHRzLT5uZXh0OworICAgICAgICB0cy0+bmV4dCA9IE5VTEw7CisgICAgICAgIHRzLT5leHBpcmVfdGltZSA9IC0xOworICAgICAgICBjYiA9IHRzLT5jYjsKKyAgICAgICAgb3BhcXVlID0gdHMtPm9wYXF1ZTsKKyAgICAgICAgcWVtdV9tdXRleF91bmxvY2soJnRpbWVyX2xpc3QtPmFjdGl2ZV90aW1lcnNfbG9jayk7CisKKyAgICAgICAgLyogcnVuIHRoZSBjYWxsYmFjayAodGhlIHRpbWVyIGxpc3QgY2FuIGJlIG1vZGlmaWVkKSAqLworICAgICAgICBjYihvcGFxdWUpOworICAgICAgICBwcm9ncmVzcyA9IHRydWU7CisgICAgfQorCitvdXQ6CisgICAgcWVtdV9ldmVudF9zZXQoJnRpbWVyX2xpc3QtPnRpbWVyc19kb25lX2V2KTsKKyAgICByZXR1cm4gcHJvZ3Jlc3M7Cit9CisKK2Jvb2wgcWVtdV9jbG9ja19ydW5fdGltZXJzKFFFTVVDbG9ja1R5cGUgdHlwZSkKK3sKKyAgICByZXR1cm4gdGltZXJsaXN0X3J1bl90aW1lcnMobWFpbl9sb29wX3RsZy50bFt0eXBlXSk7Cit9CisKK3ZvaWQgdGltZXJsaXN0Z3JvdXBfaW5pdChRRU1VVGltZXJMaXN0R3JvdXAgKnRsZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBRRU1VVGltZXJMaXN0Tm90aWZ5Q0IgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUNsb2NrVHlwZSB0eXBlOworICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCBRRU1VX0NMT0NLX01BWDsgdHlwZSsrKSB7CisgICAgICAgIHRsZy0+dGxbdHlwZV0gPSB0aW1lcmxpc3RfbmV3KHR5cGUsIGNiLCBvcGFxdWUpOworICAgIH0KK30KKwordm9pZCB0aW1lcmxpc3Rncm91cF9kZWluaXQoUUVNVVRpbWVyTGlzdEdyb3VwICp0bGcpCit7CisgICAgUUVNVUNsb2NrVHlwZSB0eXBlOworICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCBRRU1VX0NMT0NLX01BWDsgdHlwZSsrKSB7CisgICAgICAgIHRpbWVybGlzdF9mcmVlKHRsZy0+dGxbdHlwZV0pOworICAgIH0KK30KKworYm9vbCB0aW1lcmxpc3Rncm91cF9ydW5fdGltZXJzKFFFTVVUaW1lckxpc3RHcm91cCAqdGxnKQoreworICAgIFFFTVVDbG9ja1R5cGUgdHlwZTsKKyAgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IFFFTVVfQ0xPQ0tfTUFYOyB0eXBlKyspIHsKKyAgICAgICAgcHJvZ3Jlc3MgfD0gdGltZXJsaXN0X3J1bl90aW1lcnModGxnLT50bFt0eXBlXSk7CisgICAgfQorICAgIHJldHVybiBwcm9ncmVzczsKK30KKworaW50NjRfdCB0aW1lcmxpc3Rncm91cF9kZWFkbGluZV9ucyhRRU1VVGltZXJMaXN0R3JvdXAgKnRsZykKK3sKKyAgICBpbnQ2NF90IGRlYWRsaW5lID0gLTE7CisgICAgUUVNVUNsb2NrVHlwZSB0eXBlOworICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCBRRU1VX0NMT0NLX01BWDsgdHlwZSsrKSB7CisgICAgICAgIGlmIChxZW11X2Nsb2NrX3VzZV9mb3JfZGVhZGxpbmUodGxnLT50bFt0eXBlXS0+Y2xvY2stPnR5cGUpKSB7CisgICAgICAgICAgICBkZWFkbGluZSA9IHFlbXVfc29vbmVzdF90aW1lb3V0KGRlYWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcmxpc3RfZGVhZGxpbmVfbnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGctPnRsW3R5cGVdKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlYWRsaW5lOworfQorCitpbnQ2NF90IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVDbG9ja1R5cGUgdHlwZSkKK3sKKyAgICBpbnQ2NF90IG5vdywgbGFzdDsKKyAgICBRRU1VQ2xvY2sgKmNsb2NrID0gcWVtdV9jbG9ja19wdHIodHlwZSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFFFTVVfQ0xPQ0tfUkVBTFRJTUU6CisgICAgICAgIHJldHVybiBnZXRfY2xvY2soKTsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgUUVNVV9DTE9DS19WSVJUVUFMOgorICAgICAgICBpZiAodXNlX2ljb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIGNwdV9nZXRfaWNvdW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY3B1X2dldF9jbG9jaygpOworICAgICAgICB9CisgICAgY2FzZSBRRU1VX0NMT0NLX0hPU1Q6CisgICAgICAgIG5vdyA9IGdldF9jbG9ja19yZWFsdGltZSgpOworICAgICAgICBsYXN0ID0gY2xvY2stPmxhc3Q7CisgICAgICAgIGNsb2NrLT5sYXN0ID0gbm93OworICAgICAgICBpZiAobm93IDwgbGFzdCkgeworICAgICAgICAgICAgbm90aWZpZXJfbGlzdF9ub3RpZnkoJmNsb2NrLT5yZXNldF9ub3RpZmllcnMsICZub3cpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub3c7CisgICAgfQorfQorCit2b2lkIHFlbXVfY2xvY2tfcmVnaXN0ZXJfcmVzZXRfbm90aWZpZXIoUUVNVUNsb2NrVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWVyICpub3RpZmllcikKK3sKKyAgICBRRU1VQ2xvY2sgKmNsb2NrID0gcWVtdV9jbG9ja19wdHIodHlwZSk7CisgICAgbm90aWZpZXJfbGlzdF9hZGQoJmNsb2NrLT5yZXNldF9ub3RpZmllcnMsIG5vdGlmaWVyKTsKK30KKwordm9pZCBxZW11X2Nsb2NrX3VucmVnaXN0ZXJfcmVzZXRfbm90aWZpZXIoUUVNVUNsb2NrVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpZXIgKm5vdGlmaWVyKQoreworICAgIG5vdGlmaWVyX3JlbW92ZShub3RpZmllcik7Cit9CisKK3ZvaWQgaW5pdF9jbG9ja3Modm9pZCkKK3sKKyAgICBRRU1VQ2xvY2tUeXBlIHR5cGU7CisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IFFFTVVfQ0xPQ0tfTUFYOyB0eXBlKyspIHsKKyAgICAgICAgcWVtdV9jbG9ja19pbml0KHR5cGUpOworICAgIH0KKworI2lmZGVmIENPTkZJR19QUkNUTF9QUl9TRVRfVElNRVJTTEFDSworICAgIHByY3RsKFBSX1NFVF9USU1FUlNMQUNLLCAxLCAwLCAwLCAwKTsKKyNlbmRpZgorfQorCit1aW50NjRfdCB0aW1lcl9leHBpcmVfdGltZV9ucyhRRU1VVGltZXIgKnRzKQoreworICAgIHJldHVybiB0aW1lcl9wZW5kaW5nKHRzKSA/IHRzLT5leHBpcmVfdGltZSA6IC0xOworfQorCitib29sIHFlbXVfY2xvY2tfcnVuX2FsbF90aW1lcnModm9pZCkKK3sKKyAgICBib29sIHByb2dyZXNzID0gZmFsc2U7CisgICAgUUVNVUNsb2NrVHlwZSB0eXBlOworCisgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IFFFTVVfQ0xPQ0tfTUFYOyB0eXBlKyspIHsKKyAgICAgICAgcHJvZ3Jlc3MgfD0gcWVtdV9jbG9ja19ydW5fdGltZXJzKHR5cGUpOworICAgIH0KKworICAgIHJldHVybiBwcm9ncmVzczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9qc29uLWxleGVyLmMgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvanNvbi1sZXhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzdkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvanNvbi1sZXhlci5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICogSlNPTiBsZXhlcgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDkKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FkaWN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWludC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvanNvbi1sZXhlci5oIgorCisjZGVmaW5lIE1BWF9UT0tFTl9TSVpFICg2NFVMTCA8PCAyMCkKKworLyoKKyAqIFwiKFteXFxcIl18KFxcXCJcXCdcXFxcXFwvXFxiXFxmXFxuXFxyXFx0XFx1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKSpcIgorICogJyhbXlxcJ118KFxcXCJcXCdcXFxcXFwvXFxiXFxmXFxuXFxyXFx0XFx1WzAtOWEtZkEtRl1bMC05YS1mQS1GXVswLTlhLWZBLUZdWzAtOWEtZkEtRl0pKSonCisgKiAwfChbMS05XVswLTldKiguWzAtOV0rKT8oW2VFXShbLStdKT9bMC05XSspKQorICogW3t9XFtcXSw6XQorICogW2Etel0rCisgKgorICovCisKK2VudW0ganNvbl9sZXhlcl9zdGF0ZSB7CisgICAgSU5fRVJST1IgPSAwLAorICAgIElOX0RRX1VDT0RFMywKKyAgICBJTl9EUV9VQ09ERTIsCisgICAgSU5fRFFfVUNPREUxLAorICAgIElOX0RRX1VDT0RFMCwKKyAgICBJTl9EUV9TVFJJTkdfRVNDQVBFLAorICAgIElOX0RRX1NUUklORywKKyAgICBJTl9TUV9VQ09ERTMsCisgICAgSU5fU1FfVUNPREUyLAorICAgIElOX1NRX1VDT0RFMSwKKyAgICBJTl9TUV9VQ09ERTAsCisgICAgSU5fU1FfU1RSSU5HX0VTQ0FQRSwKKyAgICBJTl9TUV9TVFJJTkcsCisgICAgSU5fWkVSTywKKyAgICBJTl9ESUdJVFMsCisgICAgSU5fRElHSVQsCisgICAgSU5fRVhQX0UsCisgICAgSU5fTUFOVElTU0EsCisgICAgSU5fTUFOVElTU0FfRElHSVRTLAorICAgIElOX05PTlpFUk9fTlVNQkVSLAorICAgIElOX05FR19OT05aRVJPX05VTUJFUiwKKyAgICBJTl9LRVlXT1JELAorICAgIElOX0VTQ0FQRSwKKyAgICBJTl9FU0NBUEVfTCwKKyAgICBJTl9FU0NBUEVfTEwsCisgICAgSU5fRVNDQVBFX0ksCisgICAgSU5fRVNDQVBFX0k2LAorICAgIElOX0VTQ0FQRV9JNjQsCisgICAgSU5fV0hJVEVTUEFDRSwKKyAgICBJTl9TVEFSVCwKK307CisKKy8qIEVuc3VyZSBHQ0MgZG9lc24ndCBjb21wbGFpbiB3aGVuIHBhcnNpbmcgdGhlIGluaXRpYWxpemF0aW9uIHZhbHVlcyBiZWxvdy4gKi8KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xb3ZlcnJpZGUtaW5pdCIKKyNlbmRpZiAgLy8gX19HTlVDX18KKworI2RlZmluZSBURVJNSU5BTChzdGF0ZSkgWzAgLi4uIDB4N0ZdID0gKHN0YXRlKQorCisvKiBSZXR1cm4gd2hldGhlciBURVJNSU5BTCBpcyBhIHRlcm1pbmFsIHN0YXRlIGFuZCB0aGUgdHJhbnNpdGlvbiB0byBpdAorICAgZnJvbSBPTERfU1RBVEUgcmVxdWlyZWQgbG9va2FoZWFkLiAgVGhpcyBoYXBwZW5zIHdoZW5ldmVyIHRoZSB0YWJsZQorICAgYmVsb3cgdXNlcyB0aGUgVEVSTUlOQUwgbWFjcm8uICAqLworI2RlZmluZSBURVJNSU5BTF9ORUVERURfTE9PS0FIRUFEKG9sZF9zdGF0ZSwgdGVybWluYWwpIFwKKyAgICAgICAgICAgIChqc29uX2xleGVyWyhvbGRfc3RhdGUpXVswXSA9PSAodGVybWluYWwpKQorCitzdGF0aWMgY29uc3QgdWludDhfdCBqc29uX2xleGVyW11bMjU2XSA9ICB7CisgICAgLyogZG91YmxlIHF1b3RlIHN0cmluZyAqLworICAgIFtJTl9EUV9VQ09ERTNdID0geworICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fRFFfU1RSSU5HLAorICAgICAgICBbJ2EnIC4uLiAnZiddID0gSU5fRFFfU1RSSU5HLAorICAgICAgICBbJ0EnIC4uLiAnRiddID0gSU5fRFFfU1RSSU5HLAorICAgIH0sCisgICAgW0lOX0RRX1VDT0RFMl0gPSB7CisgICAgICAgIFsnMCcgLi4uICc5J10gPSBJTl9EUV9VQ09ERTMsCisgICAgICAgIFsnYScgLi4uICdmJ10gPSBJTl9EUV9VQ09ERTMsCisgICAgICAgIFsnQScgLi4uICdGJ10gPSBJTl9EUV9VQ09ERTMsCisgICAgfSwKKyAgICBbSU5fRFFfVUNPREUxXSA9IHsKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX0RRX1VDT0RFMiwKKyAgICAgICAgWydhJyAuLi4gJ2YnXSA9IElOX0RRX1VDT0RFMiwKKyAgICAgICAgWydBJyAuLi4gJ0YnXSA9IElOX0RRX1VDT0RFMiwKKyAgICB9LAorICAgIFtJTl9EUV9VQ09ERTBdID0geworICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fRFFfVUNPREUxLAorICAgICAgICBbJ2EnIC4uLiAnZiddID0gSU5fRFFfVUNPREUxLAorICAgICAgICBbJ0EnIC4uLiAnRiddID0gSU5fRFFfVUNPREUxLAorICAgIH0sCisgICAgW0lOX0RRX1NUUklOR19FU0NBUEVdID0geworICAgICAgICBbJ2InXSA9IElOX0RRX1NUUklORywKKyAgICAgICAgWydmJ10gPSAgSU5fRFFfU1RSSU5HLAorICAgICAgICBbJ24nXSA9ICBJTl9EUV9TVFJJTkcsCisgICAgICAgIFsnciddID0gIElOX0RRX1NUUklORywKKyAgICAgICAgWyd0J10gPSAgSU5fRFFfU1RSSU5HLAorICAgICAgICBbJy8nXSA9IElOX0RRX1NUUklORywKKyAgICAgICAgWydcXCddID0gSU5fRFFfU1RSSU5HLAorICAgICAgICBbJ1wnJ10gPSBJTl9EUV9TVFJJTkcsCisgICAgICAgIFsnXCInXSA9IElOX0RRX1NUUklORywKKyAgICAgICAgWyd1J10gPSBJTl9EUV9VQ09ERTAsCisgICAgfSwKKyAgICBbSU5fRFFfU1RSSU5HXSA9IHsKKyAgICAgICAgWzEgLi4uIDB4QkZdID0gSU5fRFFfU1RSSU5HLAorICAgICAgICBbMHhDMiAuLi4gMHhGNF0gPSBJTl9EUV9TVFJJTkcsCisgICAgICAgIFsnXFwnXSA9IElOX0RRX1NUUklOR19FU0NBUEUsCisgICAgICAgIFsnIiddID0gSlNPTl9TVFJJTkcsCisgICAgfSwKKworICAgIC8qIHNpbmdsZSBxdW90ZSBzdHJpbmcgKi8KKyAgICBbSU5fU1FfVUNPREUzXSA9IHsKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX1NRX1NUUklORywKKyAgICAgICAgWydhJyAuLi4gJ2YnXSA9IElOX1NRX1NUUklORywKKyAgICAgICAgWydBJyAuLi4gJ0YnXSA9IElOX1NRX1NUUklORywKKyAgICB9LAorICAgIFtJTl9TUV9VQ09ERTJdID0geworICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fU1FfVUNPREUzLAorICAgICAgICBbJ2EnIC4uLiAnZiddID0gSU5fU1FfVUNPREUzLAorICAgICAgICBbJ0EnIC4uLiAnRiddID0gSU5fU1FfVUNPREUzLAorICAgIH0sCisgICAgW0lOX1NRX1VDT0RFMV0gPSB7CisgICAgICAgIFsnMCcgLi4uICc5J10gPSBJTl9TUV9VQ09ERTIsCisgICAgICAgIFsnYScgLi4uICdmJ10gPSBJTl9TUV9VQ09ERTIsCisgICAgICAgIFsnQScgLi4uICdGJ10gPSBJTl9TUV9VQ09ERTIsCisgICAgfSwKKyAgICBbSU5fU1FfVUNPREUwXSA9IHsKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX1NRX1VDT0RFMSwKKyAgICAgICAgWydhJyAuLi4gJ2YnXSA9IElOX1NRX1VDT0RFMSwKKyAgICAgICAgWydBJyAuLi4gJ0YnXSA9IElOX1NRX1VDT0RFMSwKKyAgICB9LAorICAgIFtJTl9TUV9TVFJJTkdfRVNDQVBFXSA9IHsKKyAgICAgICAgWydiJ10gPSBJTl9TUV9TVFJJTkcsCisgICAgICAgIFsnZiddID0gIElOX1NRX1NUUklORywKKyAgICAgICAgWyduJ10gPSAgSU5fU1FfU1RSSU5HLAorICAgICAgICBbJ3InXSA9ICBJTl9TUV9TVFJJTkcsCisgICAgICAgIFsndCddID0gIElOX1NRX1NUUklORywKKyAgICAgICAgWycvJ10gPSBJTl9EUV9TVFJJTkcsCisgICAgICAgIFsnXFwnXSA9IElOX0RRX1NUUklORywKKyAgICAgICAgWydcJyddID0gSU5fU1FfU1RSSU5HLAorICAgICAgICBbJ1wiJ10gPSBJTl9TUV9TVFJJTkcsCisgICAgICAgIFsndSddID0gSU5fU1FfVUNPREUwLAorICAgIH0sCisgICAgW0lOX1NRX1NUUklOR10gPSB7CisgICAgICAgIFsxIC4uLiAweEJGXSA9IElOX1NRX1NUUklORywKKyAgICAgICAgWzB4QzIgLi4uIDB4RjRdID0gSU5fU1FfU1RSSU5HLAorICAgICAgICBbJ1xcJ10gPSBJTl9TUV9TVFJJTkdfRVNDQVBFLAorICAgICAgICBbJ1wnJ10gPSBKU09OX1NUUklORywKKyAgICB9LAorCisgICAgLyogWmVybyAqLworICAgIFtJTl9aRVJPXSA9IHsKKyAgICAgICAgVEVSTUlOQUwoSlNPTl9JTlRFR0VSKSwKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX0VSUk9SLAorICAgICAgICBbJy4nXSA9IElOX01BTlRJU1NBLAorICAgIH0sCisKKyAgICAvKiBGbG9hdCAqLworICAgIFtJTl9ESUdJVFNdID0geworICAgICAgICBURVJNSU5BTChKU09OX0ZMT0FUKSwKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX0RJR0lUUywKKyAgICB9LAorCisgICAgW0lOX0RJR0lUXSA9IHsKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX0RJR0lUUywKKyAgICB9LAorCisgICAgW0lOX0VYUF9FXSA9IHsKKyAgICAgICAgWyctJ10gPSBJTl9ESUdJVCwKKyAgICAgICAgWycrJ10gPSBJTl9ESUdJVCwKKyAgICAgICAgWycwJyAuLi4gJzknXSA9IElOX0RJR0lUUywKKyAgICB9LAorCisgICAgW0lOX01BTlRJU1NBX0RJR0lUU10gPSB7CisgICAgICAgIFRFUk1JTkFMKEpTT05fRkxPQVQpLAorICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fTUFOVElTU0FfRElHSVRTLAorICAgICAgICBbJ2UnXSA9IElOX0VYUF9FLAorICAgICAgICBbJ0UnXSA9IElOX0VYUF9FLAorICAgIH0sCisKKyAgICBbSU5fTUFOVElTU0FdID0geworICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fTUFOVElTU0FfRElHSVRTLAorICAgIH0sCisKKyAgICAvKiBOdW1iZXIgKi8KKyAgICBbSU5fTk9OWkVST19OVU1CRVJdID0geworICAgICAgICBURVJNSU5BTChKU09OX0lOVEVHRVIpLAorICAgICAgICBbJzAnIC4uLiAnOSddID0gSU5fTk9OWkVST19OVU1CRVIsCisgICAgICAgIFsnZSddID0gSU5fRVhQX0UsCisgICAgICAgIFsnRSddID0gSU5fRVhQX0UsCisgICAgICAgIFsnLiddID0gSU5fTUFOVElTU0EsCisgICAgfSwKKworICAgIFtJTl9ORUdfTk9OWkVST19OVU1CRVJdID0geworICAgICAgICBbJzAnXSA9IElOX1pFUk8sCisgICAgICAgIFsnMScgLi4uICc5J10gPSBJTl9OT05aRVJPX05VTUJFUiwKKyAgICB9LAorCisgICAgLyoga2V5d29yZHMgKi8KKyAgICBbSU5fS0VZV09SRF0gPSB7CisgICAgICAgIFRFUk1JTkFMKEpTT05fS0VZV09SRCksCisgICAgICAgIFsnYScgLi4uICd6J10gPSBJTl9LRVlXT1JELAorICAgIH0sCisKKyAgICAvKiB3aGl0ZXNwYWNlICovCisgICAgW0lOX1dISVRFU1BBQ0VdID0geworICAgICAgICBURVJNSU5BTChKU09OX1NLSVApLAorICAgICAgICBbJyAnXSA9IElOX1dISVRFU1BBQ0UsCisgICAgICAgIFsnXHQnXSA9IElOX1dISVRFU1BBQ0UsCisgICAgICAgIFsnXHInXSA9IElOX1dISVRFU1BBQ0UsCisgICAgICAgIFsnXG4nXSA9IElOX1dISVRFU1BBQ0UsCisgICAgfSwKKworICAgIC8qIGVzY2FwZSAqLworICAgIFtJTl9FU0NBUEVfTExdID0geworICAgICAgICBbJ2QnXSA9IEpTT05fRVNDQVBFLAorICAgIH0sCisKKyAgICBbSU5fRVNDQVBFX0xdID0geworICAgICAgICBbJ2QnXSA9IEpTT05fRVNDQVBFLAorICAgICAgICBbJ2wnXSA9IElOX0VTQ0FQRV9MTCwKKyAgICB9LAorCisgICAgW0lOX0VTQ0FQRV9JNjRdID0geworICAgICAgICBbJ2QnXSA9IEpTT05fRVNDQVBFLAorICAgIH0sCisKKyAgICBbSU5fRVNDQVBFX0k2XSA9IHsKKyAgICAgICAgWyc0J10gPSBJTl9FU0NBUEVfSTY0LAorICAgIH0sCisKKyAgICBbSU5fRVNDQVBFX0ldID0geworICAgICAgICBbJzYnXSA9IElOX0VTQ0FQRV9JNiwKKyAgICB9LAorCisgICAgW0lOX0VTQ0FQRV0gPSB7CisgICAgICAgIFsnZCddID0gSlNPTl9FU0NBUEUsCisgICAgICAgIFsnaSddID0gSlNPTl9FU0NBUEUsCisgICAgICAgIFsncCddID0gSlNPTl9FU0NBUEUsCisgICAgICAgIFsncyddID0gSlNPTl9FU0NBUEUsCisgICAgICAgIFsnZiddID0gSlNPTl9FU0NBUEUsCisgICAgICAgIFsnbCddID0gSU5fRVNDQVBFX0wsCisgICAgICAgIFsnSSddID0gSU5fRVNDQVBFX0ksCisgICAgfSwKKworICAgIC8qIHRvcCBsZXZlbCBydWxlICovCisgICAgW0lOX1NUQVJUXSA9IHsKKyAgICAgICAgWyciJ10gPSBJTl9EUV9TVFJJTkcsCisgICAgICAgIFsnXCcnXSA9IElOX1NRX1NUUklORywKKyAgICAgICAgWycwJ10gPSBJTl9aRVJPLAorICAgICAgICBbJzEnIC4uLiAnOSddID0gSU5fTk9OWkVST19OVU1CRVIsCisgICAgICAgIFsnLSddID0gSU5fTkVHX05PTlpFUk9fTlVNQkVSLAorICAgICAgICBbJ3snXSA9IEpTT05fT1BFUkFUT1IsCisgICAgICAgIFsnfSddID0gSlNPTl9PUEVSQVRPUiwKKyAgICAgICAgWydbJ10gPSBKU09OX09QRVJBVE9SLAorICAgICAgICBbJ10nXSA9IEpTT05fT1BFUkFUT1IsCisgICAgICAgIFsnLCddID0gSlNPTl9PUEVSQVRPUiwKKyAgICAgICAgWyc6J10gPSBKU09OX09QRVJBVE9SLAorICAgICAgICBbJ2EnIC4uLiAneiddID0gSU5fS0VZV09SRCwKKyAgICAgICAgWyclJ10gPSBJTl9FU0NBUEUsCisgICAgICAgIFsnICddID0gSU5fV0hJVEVTUEFDRSwKKyAgICAgICAgWydcdCddID0gSU5fV0hJVEVTUEFDRSwKKyAgICAgICAgWydcciddID0gSU5fV0hJVEVTUEFDRSwKKyAgICAgICAgWydcbiddID0gSU5fV0hJVEVTUEFDRSwKKyAgICB9LAorfTsKKworI2lmZGVmIF9fR05VQ19fCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorI2VuZGlmICAvLyBfX0dOVUNfXworCit2b2lkIGpzb25fbGV4ZXJfaW5pdChKU09OTGV4ZXIgKmxleGVyLCBKU09OTGV4ZXJFbWl0dGVyIGZ1bmMpCit7CisgICAgbGV4ZXItPmVtaXQgPSBmdW5jOworICAgIGxleGVyLT5zdGF0ZSA9IElOX1NUQVJUOworICAgIGxleGVyLT50b2tlbiA9IHFzdHJpbmdfbmV3KCk7CisgICAgbGV4ZXItPnggPSBsZXhlci0+eSA9IDA7Cit9CisKK3N0YXRpYyBpbnQganNvbl9sZXhlcl9mZWVkX2NoYXIoSlNPTkxleGVyICpsZXhlciwgY2hhciBjaCwgYm9vbCBmbHVzaCkKK3sKKyAgICBpbnQgY2hhcl9jb25zdW1lZCwgbmV3X3N0YXRlOworCisgICAgbGV4ZXItPngrKzsKKyAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICBsZXhlci0+eCA9IDA7CisgICAgICAgIGxleGVyLT55Kys7CisgICAgfQorCisgICAgZG8geworICAgICAgICBuZXdfc3RhdGUgPSBqc29uX2xleGVyW2xleGVyLT5zdGF0ZV1bKHVpbnQ4X3QpY2hdOworICAgICAgICBjaGFyX2NvbnN1bWVkID0gIVRFUk1JTkFMX05FRURFRF9MT09LQUhFQUQobGV4ZXItPnN0YXRlLCBuZXdfc3RhdGUpOworICAgICAgICBpZiAoY2hhcl9jb25zdW1lZCkgeworICAgICAgICAgICAgcXN0cmluZ19hcHBlbmRfY2hyKGxleGVyLT50b2tlbiwgY2gpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChuZXdfc3RhdGUpIHsKKyAgICAgICAgY2FzZSBKU09OX09QRVJBVE9SOgorICAgICAgICBjYXNlIEpTT05fRVNDQVBFOgorICAgICAgICBjYXNlIEpTT05fSU5URUdFUjoKKyAgICAgICAgY2FzZSBKU09OX0ZMT0FUOgorICAgICAgICBjYXNlIEpTT05fS0VZV09SRDoKKyAgICAgICAgY2FzZSBKU09OX1NUUklORzoKKyAgICAgICAgICAgIGxleGVyLT5lbWl0KGxleGVyLCBsZXhlci0+dG9rZW4sIG5ld19zdGF0ZSwgbGV4ZXItPngsIGxleGVyLT55KTsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIEpTT05fU0tJUDoKKyAgICAgICAgICAgIFFERUNSRUYobGV4ZXItPnRva2VuKTsKKyAgICAgICAgICAgIGxleGVyLT50b2tlbiA9IHFzdHJpbmdfbmV3KCk7CisgICAgICAgICAgICBuZXdfc3RhdGUgPSBJTl9TVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOX0VSUk9SOgorICAgICAgICAgICAgLyogWFhYOiBUbyBhdm9pZCBoYXZpbmcgcHJldmlvdXMgYmFkIGlucHV0IGxlYXZpbmcgdGhlIHBhcnNlciBpbiBhbgorICAgICAgICAgICAgICogdW5yZXNwb25zaXZlIHN0YXRlIHdoZXJlIHdlIGNvbnN1bWUgdW5wcmVkaWN0YWJsZSBhbW91bnRzIG9mCisgICAgICAgICAgICAgKiBzdWJzZXF1ZW50ICJnb29kIiBpbnB1dCwgcGVyY29sYXRlIHRoaXMgZXJyb3Igc3RhdGUgdXAgdG8gdGhlCisgICAgICAgICAgICAgKiB0b2tlbml6ZXIvcGFyc2VyIGJ5IGZvcmNpbmcgYSBOVUxMIG9iamVjdCB0byBiZSBlbWl0dGVkLCB0aGVuCisgICAgICAgICAgICAgKiByZXNldCBzdGF0ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBBbHNvIG5vdGUgdGhhdCB0aGlzIGhhbmRsaW5nIGlzIHJlcXVpcmVkIGZvciByZWxpYWJsZSBjaGFubmVsCisgICAgICAgICAgICAgKiBuZWdvdGlhdGlvbiBiZXR3ZWVuIFFNUCBhbmQgdGhlIGd1ZXN0IGFnZW50LCBzaW5jZSBjaHIoMHhGRikKKyAgICAgICAgICAgICAqIGlzIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNlcnRhaW4gZXZlbnRzIHRvIGVuc3VyZSBwcm9wZXIKKyAgICAgICAgICAgICAqIGRlbGl2ZXJ5IHdoZW4gdGhlIGNoYW5uZWwgaXMgaW4gYW4gdW5rbm93biBzdGF0ZS4gY2hyKDB4RkYpIGlzCisgICAgICAgICAgICAgKiBuZXZlciBhIHZhbGlkIEFTQ0lJL1VURi04IHNlcXVlbmNlLCBzbyB0aGlzIHNob3VsZCByZWxpYWJseQorICAgICAgICAgICAgICogaW5kdWNlIGFuIGVycm9yL2ZsdXNoIHN0YXRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBsZXhlci0+ZW1pdChsZXhlciwgbGV4ZXItPnRva2VuLCBKU09OX0VSUk9SLCBsZXhlci0+eCwgbGV4ZXItPnkpOworICAgICAgICAgICAgUURFQ1JFRihsZXhlci0+dG9rZW4pOworICAgICAgICAgICAgbGV4ZXItPnRva2VuID0gcXN0cmluZ19uZXcoKTsKKyAgICAgICAgICAgIG5ld19zdGF0ZSA9IElOX1NUQVJUOworICAgICAgICAgICAgbGV4ZXItPnN0YXRlID0gbmV3X3N0YXRlOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBsZXhlci0+c3RhdGUgPSBuZXdfc3RhdGU7CisgICAgfSB3aGlsZSAoIWNoYXJfY29uc3VtZWQgJiYgIWZsdXNoKTsKKworICAgIC8qIERvIG5vdCBsZXQgYSBzaW5nbGUgdG9rZW4gZ3JvdyB0byBhbiBhcmJpdHJhcmlseSBsYXJnZSBzaXplLAorICAgICAqIHRoaXMgaXMgYSBzZWN1cml0eSBjb25zaWRlcmF0aW9uLgorICAgICAqLworICAgIGlmIChsZXhlci0+dG9rZW4tPmxlbmd0aCA+IE1BWF9UT0tFTl9TSVpFKSB7CisgICAgICAgIGxleGVyLT5lbWl0KGxleGVyLCBsZXhlci0+dG9rZW4sIGxleGVyLT5zdGF0ZSwgbGV4ZXItPngsIGxleGVyLT55KTsKKyAgICAgICAgUURFQ1JFRihsZXhlci0+dG9rZW4pOworICAgICAgICBsZXhlci0+dG9rZW4gPSBxc3RyaW5nX25ldygpOworICAgICAgICBsZXhlci0+c3RhdGUgPSBJTl9TVEFSVDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGpzb25fbGV4ZXJfZmVlZChKU09OTGV4ZXIgKmxleGVyLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHNpemVfdCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IGpzb25fbGV4ZXJfZmVlZF9jaGFyKGxleGVyLCBidWZmZXJbaV0sIGZhbHNlKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGpzb25fbGV4ZXJfZmx1c2goSlNPTkxleGVyICpsZXhlcikKK3sKKyAgICByZXR1cm4gbGV4ZXItPnN0YXRlID09IElOX1NUQVJUID8gMCA6IGpzb25fbGV4ZXJfZmVlZF9jaGFyKGxleGVyLCAwLCB0cnVlKTsKK30KKwordm9pZCBqc29uX2xleGVyX2Rlc3Ryb3koSlNPTkxleGVyICpsZXhlcikKK3sKKyAgICBRREVDUkVGKGxleGVyLT50b2tlbik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvanNvbi1wYXJzZXIuYyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9qc29uLXBhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDAwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvanNvbi1wYXJzZXIuYwpAQCAtMCwwICsxLDcyNCBAQAorLyoKKyAqIEpTT04gUGFyc2VyCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xaW50LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FmbG9hdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3Fib29sLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvanNvbi1wYXJzZXIuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9qc29uLWxleGVyLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisKK3R5cGVkZWYgc3RydWN0IEpTT05QYXJzZXJDb250ZXh0Cit7CisgICAgRXJyb3IgKmVycjsKKyAgICBzdHJ1Y3QgeworICAgICAgICBRT2JqZWN0ICoqYnVmOworICAgICAgICBzaXplX3QgcG9zOworICAgICAgICBzaXplX3QgY291bnQ7CisgICAgfSB0b2tlbnM7Cit9IEpTT05QYXJzZXJDb250ZXh0OworCisjZGVmaW5lIEJVR19PTihjb25kKSBhc3NlcnQoIShjb25kKSkKKworLyoqCisgKiBUT0RPCisgKgorICogMCkgbWFrZSBlcnJvcnMgbWVhbmluZ2Z1bCBhZ2FpbgorICogMSkgYWRkIGdlb21ldHJ5IGluZm9ybWF0aW9uIHRvIHRva2VucworICogMykgc2hvdWxkIHdlIHJldHVybiBhIHBhcnNlZCBzaXplPworICogNCkgZGVhbCB3aXRoIHByZW1hdHVyZSBFT0kKKyAqLworCitzdGF0aWMgUU9iamVjdCAqcGFyc2VfdmFsdWUoSlNPTlBhcnNlckNvbnRleHQgKmN0eHQsIHZhX2xpc3QgKmFwKTsKKworLyoqCisgKiBUb2tlbiBtYW5pcHVsYXRvcnMKKyAqCisgKiB0b2tlbnMgYXJlIGRpY3Rpb25hcmllcyB0aGF0IGNvbnRhaW4gYSB0eXBlLCBhIHN0cmluZyB2YWx1ZSwgYW5kIGdlb21ldHJ5IGluZm9ybWF0aW9uCisgKiBhYm91dCBhIHRva2VuIGlkZW50aWZpZWQgYnkgdGhlIGxleGVyLiAgVGhlc2UgYXJlIHJvdXRpbmVzIHRoYXQgbWFrZSB3b3JraW5nIHdpdGgKKyAqIHRoZXNlIG9iamVjdHMgYSBiaXQgZWFzaWVyLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqdG9rZW5fZ2V0X3ZhbHVlKFFPYmplY3QgKm9iaikKK3sKKyAgICByZXR1cm4gcWRpY3RfZ2V0X3N0cihxb2JqZWN0X3RvX3FkaWN0KG9iaiksICJ0b2tlbiIpOworfQorCitzdGF0aWMgSlNPTlRva2VuVHlwZSB0b2tlbl9nZXRfdHlwZShRT2JqZWN0ICpvYmopCit7CisgICAgcmV0dXJuIHFkaWN0X2dldF9pbnQocW9iamVjdF90b19xZGljdChvYmopLCAidHlwZSIpOworfQorCitzdGF0aWMgaW50IHRva2VuX2lzX29wZXJhdG9yKFFPYmplY3QgKm9iaiwgY2hhciBvcCkKK3sKKyAgICBjb25zdCBjaGFyICp2YWw7CisKKyAgICBpZiAodG9rZW5fZ2V0X3R5cGUob2JqKSAhPSBKU09OX09QRVJBVE9SKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZhbCA9IHRva2VuX2dldF92YWx1ZShvYmopOworCisgICAgcmV0dXJuICh2YWxbMF0gPT0gb3ApICYmICh2YWxbMV0gPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgdG9rZW5faXNfa2V5d29yZChRT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGlmICh0b2tlbl9nZXRfdHlwZShvYmopICE9IEpTT05fS0VZV09SRCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyY21wKHRva2VuX2dldF92YWx1ZShvYmopLCB2YWx1ZSkgPT0gMDsKK30KKworc3RhdGljIGludCB0b2tlbl9pc19lc2NhcGUoUU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBpZiAodG9rZW5fZ2V0X3R5cGUob2JqKSAhPSBKU09OX0VTQ0FQRSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gKHN0cmNtcCh0b2tlbl9nZXRfdmFsdWUob2JqKSwgdmFsdWUpID09IDApOworfQorCisvKioKKyAqIEVycm9yIGhhbmRsZXIKKyAqLworc3RhdGljIHZvaWQgR0NDX0ZNVF9BVFRSKDMsIDQpIHBhcnNlX2Vycm9yKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPYmplY3QgKnRva2VuLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworICAgIGNoYXIgbWVzc2FnZVsxMDI0XTsKKyAgICB2YV9zdGFydChhcCwgbXNnKTsKKyAgICB2c25wcmludGYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpLCBtc2csIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGlmIChjdHh0LT5lcnIpIHsKKyAgICAgICAgZXJyb3JfZnJlZShjdHh0LT5lcnIpOworICAgICAgICBjdHh0LT5lcnIgPSBOVUxMOworICAgIH0KKyAgICBlcnJvcl9zZXQoJmN0eHQtPmVyciwgUUVSUl9KU09OX1BBUlNFX0VSUk9SLCBtZXNzYWdlKTsKK30KKworLyoqCisgKiBTdHJpbmcgaGVscGVycworICoKKyAqIFRoZXNlIGhlbHBlcnMgYXJlIHVzZWQgdG8gdW5lc2NhcGUgc3RyaW5ncy4KKyAqLworc3RhdGljIHZvaWQgd2NoYXJfdG9fdXRmOCh1aW50MTZfdCB3Y2hhciwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX2xlbmd0aCkKK3sKKyAgICBpZiAod2NoYXIgPD0gMHgwMDdGKSB7CisgICAgICAgIEJVR19PTihidWZmZXJfbGVuZ3RoIDwgMik7CisKKyAgICAgICAgYnVmZmVyWzBdID0gd2NoYXIgJiAweDdGOworICAgICAgICBidWZmZXJbMV0gPSAwOworICAgIH0gZWxzZSBpZiAod2NoYXIgPD0gMHgwN0ZGKSB7CisgICAgICAgIEJVR19PTihidWZmZXJfbGVuZ3RoIDwgMyk7CisKKyAgICAgICAgYnVmZmVyWzBdID0gMHhDMCB8ICgod2NoYXIgPj4gNikgJiAweDFGKTsKKyAgICAgICAgYnVmZmVyWzFdID0gMHg4MCB8ICh3Y2hhciAmIDB4M0YpOworICAgICAgICBidWZmZXJbMl0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIEJVR19PTihidWZmZXJfbGVuZ3RoIDwgNCk7CisKKyAgICAgICAgYnVmZmVyWzBdID0gMHhFMCB8ICgod2NoYXIgPj4gMTIpICYgMHgwRik7CisgICAgICAgIGJ1ZmZlclsxXSA9IDB4ODAgfCAoKHdjaGFyID4+IDYpICYgMHgzRik7CisgICAgICAgIGJ1ZmZlclsyXSA9IDB4ODAgfCAod2NoYXIgJiAweDNGKTsKKyAgICAgICAgYnVmZmVyWzNdID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaGV4MmRlY2ltYWwoY2hhciBjaCkKK3sKKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgICByZXR1cm4gKGNoIC0gJzAnKTsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAnZicpIHsKKyAgICAgICAgcmV0dXJuIDEwICsgKGNoIC0gJ2EnKTsKKyAgICB9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnRicpIHsKKyAgICAgICAgcmV0dXJuIDEwICsgKGNoIC0gJ0EnKTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKgorICogcGFyc2Vfc3RyaW5nKCk6IFBhcnNlIGEganNvbiBzdHJpbmcgYW5kIHJldHVybiBhIFFPYmplY3QKKyAqCisgKiAgc3RyaW5nCisgKiAgICAgICIiCisgKiAgICAgICIgY2hhcnMgIgorICogIGNoYXJzCisgKiAgICAgIGNoYXIKKyAqICAgICAgY2hhciBjaGFycworICogIGNoYXIKKyAqICAgICAgYW55LVVuaWNvZGUtY2hhcmFjdGVyLQorICogICAgICAgICAgZXhjZXB0LSItb3ItXC1vci0KKyAqICAgICAgICAgIGNvbnRyb2wtY2hhcmFjdGVyCisgKiAgICAgIFwiCisgKiAgICAgIFxcCisgKiAgICAgIFwvCisgKiAgICAgIFxiCisgKiAgICAgIFxmCisgKiAgICAgIFxuCisgKiAgICAgIFxyCisgKiAgICAgIFx0CisgKiAgICAgIFx1IGZvdXItaGV4LWRpZ2l0cworICovCitzdGF0aWMgUVN0cmluZyAqcXN0cmluZ19mcm9tX2VzY2FwZWRfc3RyKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0LCBRT2JqZWN0ICp0b2tlbikKK3sKKyAgICBjb25zdCBjaGFyICpwdHIgPSB0b2tlbl9nZXRfdmFsdWUodG9rZW4pOworICAgIFFTdHJpbmcgKnN0cjsKKyAgICBpbnQgZG91YmxlX3F1b3RlID0gMTsKKworICAgIGlmICgqcHRyID09ICciJykgeworICAgICAgICBkb3VibGVfcXVvdGUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZV9xdW90ZSA9IDA7CisgICAgfQorICAgIHB0cisrOworCisgICAgc3RyID0gcXN0cmluZ19uZXcoKTsKKyAgICB3aGlsZSAoKnB0ciAmJgorICAgICAgICAgICAoKGRvdWJsZV9xdW90ZSAmJiAqcHRyICE9ICciJykgfHwgKCFkb3VibGVfcXVvdGUgJiYgKnB0ciAhPSAnXCcnKSkpIHsKKyAgICAgICAgaWYgKCpwdHIgPT0gJ1xcJykgeworICAgICAgICAgICAgcHRyKys7CisKKyAgICAgICAgICAgIHN3aXRjaCAoKnB0cikgeworICAgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiXCIiKTsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICInIik7CisgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiXFwiKTsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIi8iKTsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIlxiIik7CisgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcZiIpOworICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiXG4iKTsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIlxyIik7CisgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcdCIpOworICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndSc6IHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCB1bmljb2RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgIGNoYXIgdXRmOF9jaGFyWzRdOworICAgICAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgICAgIHB0cisrOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocWVtdV9pc3hkaWdpdCgqcHRyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZV9jaGFyIHw9IGhleDJkZWNpbWFsKCpwdHIpIDw8ICgoMyAtIGkpICogNCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGhleCBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3Y2hhcl90b191dGY4KHVuaWNvZGVfY2hhciwgdXRmOF9jaGFyLCBzaXplb2YodXRmOF9jaGFyKSk7CisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCB1dGY4X2NoYXIpOworICAgICAgICAgICAgfSAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCB0b2tlbiwgImludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBkdW1teVsyXTsKKworICAgICAgICAgICAgZHVtbXlbMF0gPSAqcHRyKys7CisgICAgICAgICAgICBkdW1teVsxXSA9IDA7CisKKyAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgZHVtbXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKKworb3V0OgorICAgIFFERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFFPYmplY3QgKnBhcnNlcl9jb250ZXh0X3BvcF90b2tlbihKU09OUGFyc2VyQ29udGV4dCAqY3R4dCkKK3sKKyAgICBRT2JqZWN0ICp0b2tlbjsKKyAgICBnX2Fzc2VydChjdHh0LT50b2tlbnMucG9zIDwgY3R4dC0+dG9rZW5zLmNvdW50KTsKKyAgICB0b2tlbiA9IGN0eHQtPnRva2Vucy5idWZbY3R4dC0+dG9rZW5zLnBvc107CisgICAgY3R4dC0+dG9rZW5zLnBvcysrOworICAgIHJldHVybiB0b2tlbjsKK30KKworLyogTm90ZTogcGFyc2VyX2NvbnRleHRfe3BlZWt8cG9wfV90b2tlbiBkbyBub3QgaW5jcmVtZW50IHRoZQorICogdG9rZW4gb2JqZWN0J3MgcmVmY291bnQuIEluIGJvdGggY2FzZXMgdGhlIHJlZmVyZW5jZXMgd2lsbCBjb250aW51ZQorICogdG8gYmUgdHJhY2tlZCBhbmQgY2xlYW5lZCB1cCBpbiBwYXJzZXJfY29udGV4dF9mcmVlKCksIHNvIGRvIG5vdAorICogYXR0ZW1wdCB0byBmcmVlIHRoZSB0b2tlbiBvYmplY3QuCisgKi8KK3N0YXRpYyBRT2JqZWN0ICpwYXJzZXJfY29udGV4dF9wZWVrX3Rva2VuKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0KQoreworICAgIFFPYmplY3QgKnRva2VuOworICAgIGdfYXNzZXJ0KGN0eHQtPnRva2Vucy5wb3MgPCBjdHh0LT50b2tlbnMuY291bnQpOworICAgIHRva2VuID0gY3R4dC0+dG9rZW5zLmJ1ZltjdHh0LT50b2tlbnMucG9zXTsKKyAgICByZXR1cm4gdG9rZW47Cit9CisKK3N0YXRpYyBKU09OUGFyc2VyQ29udGV4dCBwYXJzZXJfY29udGV4dF9zYXZlKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0KQoreworICAgIEpTT05QYXJzZXJDb250ZXh0IHNhdmVkX2N0eHQgPSB7MH07CisgICAgc2F2ZWRfY3R4dC50b2tlbnMucG9zID0gY3R4dC0+dG9rZW5zLnBvczsKKyAgICBzYXZlZF9jdHh0LnRva2Vucy5jb3VudCA9IGN0eHQtPnRva2Vucy5jb3VudDsKKyAgICBzYXZlZF9jdHh0LnRva2Vucy5idWYgPSBjdHh0LT50b2tlbnMuYnVmOworICAgIHJldHVybiBzYXZlZF9jdHh0OworfQorCitzdGF0aWMgdm9pZCBwYXJzZXJfY29udGV4dF9yZXN0b3JlKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OUGFyc2VyQ29udGV4dCBzYXZlZF9jdHh0KQoreworICAgIGN0eHQtPnRva2Vucy5wb3MgPSBzYXZlZF9jdHh0LnRva2Vucy5wb3M7CisgICAgY3R4dC0+dG9rZW5zLmNvdW50ID0gc2F2ZWRfY3R4dC50b2tlbnMuY291bnQ7CisgICAgY3R4dC0+dG9rZW5zLmJ1ZiA9IHNhdmVkX2N0eHQudG9rZW5zLmJ1ZjsKK30KKworc3RhdGljIHZvaWQgdG9rZW5zX2FwcGVuZF9mcm9tX2l0ZXIoUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpCit7CisgICAgSlNPTlBhcnNlckNvbnRleHQgKmN0eHQgPSBvcGFxdWU7CisgICAgZ19hc3NlcnQoY3R4dC0+dG9rZW5zLnBvcyA8IGN0eHQtPnRva2Vucy5jb3VudCk7CisgICAgY3R4dC0+dG9rZW5zLmJ1ZltjdHh0LT50b2tlbnMucG9zKytdID0gb2JqOworICAgIHFvYmplY3RfaW5jcmVmKG9iaik7Cit9CisKK3N0YXRpYyBKU09OUGFyc2VyQ29udGV4dCAqcGFyc2VyX2NvbnRleHRfbmV3KFFMaXN0ICp0b2tlbnMpCit7CisgICAgSlNPTlBhcnNlckNvbnRleHQgKmN0eHQ7CisgICAgc2l6ZV90IGNvdW50OworCisgICAgaWYgKCF0b2tlbnMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY291bnQgPSBxbGlzdF9zaXplKHRva2Vucyk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY3R4dCA9IGdfbWFsbG9jMChzaXplb2YoSlNPTlBhcnNlckNvbnRleHQpKTsKKyAgICBjdHh0LT50b2tlbnMucG9zID0gMDsKKyAgICBjdHh0LT50b2tlbnMuY291bnQgPSBjb3VudDsKKyAgICBjdHh0LT50b2tlbnMuYnVmID0gZ19tYWxsb2MoY291bnQgKiBzaXplb2YoUU9iamVjdCAqKSk7CisgICAgcWxpc3RfaXRlcih0b2tlbnMsIHRva2Vuc19hcHBlbmRfZnJvbV9pdGVyLCBjdHh0KTsKKyAgICBjdHh0LT50b2tlbnMucG9zID0gMDsKKworICAgIHJldHVybiBjdHh0OworfQorCisvKiB0byBzdXBwb3J0IGVycm9yIHByb3BhZ2F0aW9uLCBjdHh0LT5lcnIgbXVzdCBiZSBmcmVlZCBzZXBhcmF0ZWx5ICovCitzdGF0aWMgdm9pZCBwYXJzZXJfY29udGV4dF9mcmVlKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0KQoreworICAgIGludCBpOworICAgIGlmIChjdHh0KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHh0LT50b2tlbnMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgcW9iamVjdF9kZWNyZWYoY3R4dC0+dG9rZW5zLmJ1ZltpXSk7CisgICAgICAgIH0KKyAgICAgICAgZ19mcmVlKGN0eHQtPnRva2Vucy5idWYpOworICAgICAgICBnX2ZyZWUoY3R4dCk7CisgICAgfQorfQorCisvKioKKyAqIFBhcnNpbmcgcnVsZXMKKyAqLworc3RhdGljIGludCBwYXJzZV9wYWlyKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0LCBRRGljdCAqZGljdCwgdmFfbGlzdCAqYXApCit7CisgICAgUU9iamVjdCAqa2V5ID0gTlVMTCwgKnRva2VuID0gTlVMTCwgKnZhbHVlLCAqcGVlazsKKyAgICBKU09OUGFyc2VyQ29udGV4dCBzYXZlZF9jdHh0ID0gcGFyc2VyX2NvbnRleHRfc2F2ZShjdHh0KTsKKworICAgIHBlZWsgPSBwYXJzZXJfY29udGV4dF9wZWVrX3Rva2VuKGN0eHQpOworICAgIGlmIChwZWVrID09IE5VTEwpIHsKKyAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgTlVMTCwgInByZW1hdHVyZSBFT0kiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAga2V5ID0gcGFyc2VfdmFsdWUoY3R4dCwgYXApOworICAgIGlmICgha2V5IHx8IHFvYmplY3RfdHlwZShrZXkpICE9IFFUWVBFX1FTVFJJTkcpIHsKKyAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgcGVlaywgImtleSBpcyBub3QgYSBzdHJpbmcgaW4gb2JqZWN0Iik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHRva2VuID0gcGFyc2VyX2NvbnRleHRfcG9wX3Rva2VuKGN0eHQpOworICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgIHBhcnNlX2Vycm9yKGN0eHQsIE5VTEwsICJwcmVtYXR1cmUgRU9JIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICghdG9rZW5faXNfb3BlcmF0b3IodG9rZW4sICc6JykpIHsKKyAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgdG9rZW4sICJtaXNzaW5nIDogaW4gb2JqZWN0IHBhaXIiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgdmFsdWUgPSBwYXJzZV92YWx1ZShjdHh0LCBhcCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgdG9rZW4sICJNaXNzaW5nIHZhbHVlIGluIGRpY3QiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgcWRpY3RfcHV0X29iaihkaWN0LCBxc3RyaW5nX2dldF9zdHIocW9iamVjdF90b19xc3RyaW5nKGtleSkpLCB2YWx1ZSk7CisKKyAgICBxb2JqZWN0X2RlY3JlZihrZXkpOworCisgICAgcmV0dXJuIDA7CisKK291dDoKKyAgICBwYXJzZXJfY29udGV4dF9yZXN0b3JlKGN0eHQsIHNhdmVkX2N0eHQpOworICAgIHFvYmplY3RfZGVjcmVmKGtleSk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBRT2JqZWN0ICpwYXJzZV9vYmplY3QoSlNPTlBhcnNlckNvbnRleHQgKmN0eHQsIHZhX2xpc3QgKmFwKQoreworICAgIFFEaWN0ICpkaWN0ID0gTlVMTDsKKyAgICBRT2JqZWN0ICp0b2tlbiwgKnBlZWs7CisgICAgSlNPTlBhcnNlckNvbnRleHQgc2F2ZWRfY3R4dCA9IHBhcnNlcl9jb250ZXh0X3NhdmUoY3R4dCk7CisKKyAgICB0b2tlbiA9IHBhcnNlcl9jb250ZXh0X3BvcF90b2tlbihjdHh0KTsKKyAgICBpZiAodG9rZW4gPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIXRva2VuX2lzX29wZXJhdG9yKHRva2VuLCAneycpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICB0b2tlbiA9IE5VTEw7CisKKyAgICBkaWN0ID0gcWRpY3RfbmV3KCk7CisKKyAgICBwZWVrID0gcGFyc2VyX2NvbnRleHRfcGVla190b2tlbihjdHh0KTsKKyAgICBpZiAocGVlayA9PSBOVUxMKSB7CisgICAgICAgIHBhcnNlX2Vycm9yKGN0eHQsIE5VTEwsICJwcmVtYXR1cmUgRU9JIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICghdG9rZW5faXNfb3BlcmF0b3IocGVlaywgJ30nKSkgeworICAgICAgICBpZiAocGFyc2VfcGFpcihjdHh0LCBkaWN0LCBhcCkgPT0gLTEpIHsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCBOVUxMLCAicHJlbWF0dXJlIEVPSSIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIXRva2VuX2lzX29wZXJhdG9yKHRva2VuLCAnfScpKSB7CisgICAgICAgICAgICBpZiAoIXRva2VuX2lzX29wZXJhdG9yKHRva2VuLCAnLCcpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgdG9rZW4sICJleHBlY3RlZCBzZXBhcmF0b3IgaW4gZGljdCIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9rZW4gPSBOVUxMOworCisgICAgICAgICAgICBpZiAocGFyc2VfcGFpcihjdHh0LCBkaWN0LCBhcCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgICAgICAgICBpZiAodG9rZW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKGN0eHQsIE5VTEwsICJwcmVtYXR1cmUgRU9JIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG9rZW4gPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHRva2VuID0gcGFyc2VyX2NvbnRleHRfcG9wX3Rva2VuKGN0eHQpOworICAgICAgICB0b2tlbiA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIFFPQkpFQ1QoZGljdCk7CisKK291dDoKKyAgICBwYXJzZXJfY29udGV4dF9yZXN0b3JlKGN0eHQsIHNhdmVkX2N0eHQpOworICAgIFFERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBRT2JqZWN0ICpwYXJzZV9hcnJheShKU09OUGFyc2VyQ29udGV4dCAqY3R4dCwgdmFfbGlzdCAqYXApCit7CisgICAgUUxpc3QgKmxpc3QgPSBOVUxMOworICAgIFFPYmplY3QgKnRva2VuLCAqcGVlazsKKyAgICBKU09OUGFyc2VyQ29udGV4dCBzYXZlZF9jdHh0ID0gcGFyc2VyX2NvbnRleHRfc2F2ZShjdHh0KTsKKworICAgIHRva2VuID0gcGFyc2VyX2NvbnRleHRfcG9wX3Rva2VuKGN0eHQpOworICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICghdG9rZW5faXNfb3BlcmF0b3IodG9rZW4sICdbJykpIHsKKyAgICAgICAgdG9rZW4gPSBOVUxMOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgdG9rZW4gPSBOVUxMOworCisgICAgbGlzdCA9IHFsaXN0X25ldygpOworCisgICAgcGVlayA9IHBhcnNlcl9jb250ZXh0X3BlZWtfdG9rZW4oY3R4dCk7CisgICAgaWYgKHBlZWsgPT0gTlVMTCkgeworICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCBOVUxMLCAicHJlbWF0dXJlIEVPSSIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIXRva2VuX2lzX29wZXJhdG9yKHBlZWssICddJykpIHsKKyAgICAgICAgUU9iamVjdCAqb2JqOworCisgICAgICAgIG9iaiA9IHBhcnNlX3ZhbHVlKGN0eHQsIGFwKTsKKyAgICAgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCB0b2tlbiwgImV4cGVjdGluZyB2YWx1ZSIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBxbGlzdF9hcHBlbmRfb2JqKGxpc3QsIG9iaik7CisKKyAgICAgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCBOVUxMLCAicHJlbWF0dXJlIEVPSSIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoIXRva2VuX2lzX29wZXJhdG9yKHRva2VuLCAnXScpKSB7CisgICAgICAgICAgICBpZiAoIXRva2VuX2lzX29wZXJhdG9yKHRva2VuLCAnLCcpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VfZXJyb3IoY3R4dCwgdG9rZW4sICJleHBlY3RlZCBzZXBhcmF0b3IgaW4gbGlzdCIpOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b2tlbiA9IE5VTEw7CisKKyAgICAgICAgICAgIG9iaiA9IHBhcnNlX3ZhbHVlKGN0eHQsIGFwKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKGN0eHQsIHRva2VuLCAiZXhwZWN0aW5nIHZhbHVlIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFsaXN0X2FwcGVuZF9vYmoobGlzdCwgb2JqKTsKKworICAgICAgICAgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgICAgICAgICBpZiAodG9rZW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKGN0eHQsIE5VTEwsICJwcmVtYXR1cmUgRU9JIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0b2tlbiA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgICAgIHRva2VuID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gUU9CSkVDVChsaXN0KTsKKworb3V0OgorICAgIHBhcnNlcl9jb250ZXh0X3Jlc3RvcmUoY3R4dCwgc2F2ZWRfY3R4dCk7CisgICAgUURFQ1JFRihsaXN0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFFPYmplY3QgKnBhcnNlX2tleXdvcmQoSlNPTlBhcnNlckNvbnRleHQgKmN0eHQpCit7CisgICAgUU9iamVjdCAqdG9rZW4sICpyZXQ7CisgICAgSlNPTlBhcnNlckNvbnRleHQgc2F2ZWRfY3R4dCA9IHBhcnNlcl9jb250ZXh0X3NhdmUoY3R4dCk7CisKKyAgICB0b2tlbiA9IHBhcnNlcl9jb250ZXh0X3BvcF90b2tlbihjdHh0KTsKKyAgICBpZiAodG9rZW4gPT0gTlVMTCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAodG9rZW5fZ2V0X3R5cGUodG9rZW4pICE9IEpTT05fS0VZV09SRCkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAodG9rZW5faXNfa2V5d29yZCh0b2tlbiwgInRydWUiKSkgeworICAgICAgICByZXQgPSBRT0JKRUNUKHFib29sX2Zyb21faW50KHRydWUpKTsKKyAgICB9IGVsc2UgaWYgKHRva2VuX2lzX2tleXdvcmQodG9rZW4sICJmYWxzZSIpKSB7CisgICAgICAgIHJldCA9IFFPQkpFQ1QocWJvb2xfZnJvbV9pbnQoZmFsc2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvcihjdHh0LCB0b2tlbiwgImludmFsaWQga2V5d29yZCBgJXMnIiwgdG9rZW5fZ2V0X3ZhbHVlKHRva2VuKSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJldHVybiByZXQ7CisKK291dDoKKyAgICBwYXJzZXJfY29udGV4dF9yZXN0b3JlKGN0eHQsIHNhdmVkX2N0eHQpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBRT2JqZWN0ICpwYXJzZV9lc2NhcGUoSlNPTlBhcnNlckNvbnRleHQgKmN0eHQsIHZhX2xpc3QgKmFwKQoreworICAgIFFPYmplY3QgKnRva2VuID0gTlVMTCwgKm9iajsKKyAgICBKU09OUGFyc2VyQ29udGV4dCBzYXZlZF9jdHh0ID0gcGFyc2VyX2NvbnRleHRfc2F2ZShjdHh0KTsKKworICAgIGlmIChhcCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHRva2VuID0gcGFyc2VyX2NvbnRleHRfcG9wX3Rva2VuKGN0eHQpOworICAgIGlmICh0b2tlbiA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmICh0b2tlbl9pc19lc2NhcGUodG9rZW4sICIlcCIpKSB7CisgICAgICAgIG9iaiA9IHZhX2FyZygqYXAsIFFPYmplY3QgKik7CisgICAgfSBlbHNlIGlmICh0b2tlbl9pc19lc2NhcGUodG9rZW4sICIlaSIpKSB7CisgICAgICAgIG9iaiA9IFFPQkpFQ1QocWJvb2xfZnJvbV9pbnQodmFfYXJnKCphcCwgaW50KSkpOworICAgIH0gZWxzZSBpZiAodG9rZW5faXNfZXNjYXBlKHRva2VuLCAiJWQiKSkgeworICAgICAgICBvYmogPSBRT0JKRUNUKHFpbnRfZnJvbV9pbnQodmFfYXJnKCphcCwgaW50KSkpOworICAgIH0gZWxzZSBpZiAodG9rZW5faXNfZXNjYXBlKHRva2VuLCAiJWxkIikpIHsKKyAgICAgICAgb2JqID0gUU9CSkVDVChxaW50X2Zyb21faW50KHZhX2FyZygqYXAsIGxvbmcpKSk7CisgICAgfSBlbHNlIGlmICh0b2tlbl9pc19lc2NhcGUodG9rZW4sICIlbGxkIikgfHwKKyAgICAgICAgICAgICAgIHRva2VuX2lzX2VzY2FwZSh0b2tlbiwgIiVJNjRkIikpIHsKKyAgICAgICAgb2JqID0gUU9CSkVDVChxaW50X2Zyb21faW50KHZhX2FyZygqYXAsIGxvbmcgbG9uZykpKTsKKyAgICB9IGVsc2UgaWYgKHRva2VuX2lzX2VzY2FwZSh0b2tlbiwgIiVzIikpIHsKKyAgICAgICAgb2JqID0gUU9CSkVDVChxc3RyaW5nX2Zyb21fc3RyKHZhX2FyZygqYXAsIGNvbnN0IGNoYXIgKikpKTsKKyAgICB9IGVsc2UgaWYgKHRva2VuX2lzX2VzY2FwZSh0b2tlbiwgIiVmIikpIHsKKyAgICAgICAgb2JqID0gUU9CSkVDVChxZmxvYXRfZnJvbV9kb3VibGUodmFfYXJnKCphcCwgZG91YmxlKSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJldHVybiBvYmo7CisKK291dDoKKyAgICBwYXJzZXJfY29udGV4dF9yZXN0b3JlKGN0eHQsIHNhdmVkX2N0eHQpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBRT2JqZWN0ICpwYXJzZV9saXRlcmFsKEpTT05QYXJzZXJDb250ZXh0ICpjdHh0KQoreworICAgIFFPYmplY3QgKnRva2VuLCAqb2JqOworICAgIEpTT05QYXJzZXJDb250ZXh0IHNhdmVkX2N0eHQgPSBwYXJzZXJfY29udGV4dF9zYXZlKGN0eHQpOworCisgICAgdG9rZW4gPSBwYXJzZXJfY29udGV4dF9wb3BfdG9rZW4oY3R4dCk7CisgICAgaWYgKHRva2VuID09IE5VTEwpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgc3dpdGNoICh0b2tlbl9nZXRfdHlwZSh0b2tlbikpIHsKKyAgICBjYXNlIEpTT05fU1RSSU5HOgorICAgICAgICBvYmogPSBRT0JKRUNUKHFzdHJpbmdfZnJvbV9lc2NhcGVkX3N0cihjdHh0LCB0b2tlbikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpTT05fSU5URUdFUjogeworICAgICAgICAvKiBBIHBvc3NpYmlsaXR5IGV4aXN0cyB0aGF0IHRoaXMgaXMgYSB3aG9sZS12YWx1ZWQgZmxvYXQgd2hlcmUgdGhlCisgICAgICAgICAqIGZyYWN0aW9uYWwgcGFydCB3YXMgbGVmdCBvdXQgZHVlIHRvIGJlaW5nIDAgKC4wKS4gSXQncyBub3QgYSBiaWcKKyAgICAgICAgICogZGVhbCB0byB0cmVhdCB0aGVzZSBhcyBpbnRzIGluIHRoZSBwYXJzZXIsIHNvIGxvbmcgYXMgdXNlcnMgb2YgdGhlCisgICAgICAgICAqIHJlc3VsdGluZyBRT2JqZWN0IGtub3cgdG8gZXhwZWN0IGEgUUludCBpbiBwbGFjZSBvZiBhIFFGbG9hdCBpbgorICAgICAgICAgKiBjYXNlcyBsaWtlIHRoZXNlLgorICAgICAgICAgKgorICAgICAgICAgKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIHRoZXNlIHZhbHVlcyB3aWxsIG92ZXJmbG93L3VuZGVyZmxvdyBhCisgICAgICAgICAqIFFJbnQvaW50NjQgY29udGFpbmVyLCB0aHVzIHdlIHNob3VsZCBhc3N1bWUgdGhlc2UgYXJlIHRvIGJlIGhhbmRsZWQKKyAgICAgICAgICogYXMgUUZsb2F0cy9kb3VibGVzIHJhdGhlciB0aGFuIHNpbGVudGx5IGNoYW5naW5nIHRoZWlyIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogc3RydG9sbCgpIGluZGljYXRlcyB0aGVzZSBpbnN0YW5jZXMgYnkgc2V0dGluZyBlcnJubyB0byBFUkFOR0UKKyAgICAgICAgICovCisgICAgICAgIGludDY0X3QgdmFsdWU7CisKKyAgICAgICAgZXJybm8gPSAwOyAvKiBzdHJ0b2xsIGRvZXNuJ3Qgc2V0IGVycm5vIG9uIHN1Y2Nlc3MgKi8KKyAgICAgICAgdmFsdWUgPSBzdHJ0b2xsKHRva2VuX2dldF92YWx1ZSh0b2tlbiksIE5VTEwsIDEwKTsKKyAgICAgICAgaWYgKGVycm5vICE9IEVSQU5HRSkgeworICAgICAgICAgICAgb2JqID0gUU9CSkVDVChxaW50X2Zyb21faW50KHZhbHVlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gSlNPTl9GTE9BVCAqLworICAgIH0KKyAgICBjYXNlIEpTT05fRkxPQVQ6CisgICAgICAgIC8qIEZJWE1FIGRlcGVuZGVudCBvbiBsb2NhbGUgKi8KKyAgICAgICAgb2JqID0gUU9CSkVDVChxZmxvYXRfZnJvbV9kb3VibGUoc3RydG9kKHRva2VuX2dldF92YWx1ZSh0b2tlbiksIE5VTEwpKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHJldHVybiBvYmo7CisKK291dDoKKyAgICBwYXJzZXJfY29udGV4dF9yZXN0b3JlKGN0eHQsIHNhdmVkX2N0eHQpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBRT2JqZWN0ICpwYXJzZV92YWx1ZShKU09OUGFyc2VyQ29udGV4dCAqY3R4dCwgdmFfbGlzdCAqYXApCit7CisgICAgUU9iamVjdCAqb2JqOworCisgICAgb2JqID0gcGFyc2Vfb2JqZWN0KGN0eHQsIGFwKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgb2JqID0gcGFyc2VfYXJyYXkoY3R4dCwgYXApOworICAgIH0KKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgb2JqID0gcGFyc2VfZXNjYXBlKGN0eHQsIGFwKTsKKyAgICB9CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIG9iaiA9IHBhcnNlX2tleXdvcmQoY3R4dCk7CisgICAgfQorICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBvYmogPSBwYXJzZV9saXRlcmFsKGN0eHQpOworICAgIH0KKworICAgIHJldHVybiBvYmo7Cit9CisKK1FPYmplY3QgKmpzb25fcGFyc2VyX3BhcnNlKFFMaXN0ICp0b2tlbnMsIHZhX2xpc3QgKmFwKQoreworICAgIHJldHVybiBqc29uX3BhcnNlcl9wYXJzZV9lcnIodG9rZW5zLCBhcCwgTlVMTCk7Cit9CisKK1FPYmplY3QgKmpzb25fcGFyc2VyX3BhcnNlX2VycihRTGlzdCAqdG9rZW5zLCB2YV9saXN0ICphcCwgRXJyb3IgKiplcnJwKQoreworICAgIEpTT05QYXJzZXJDb250ZXh0ICpjdHh0ID0gcGFyc2VyX2NvbnRleHRfbmV3KHRva2Vucyk7CisgICAgUU9iamVjdCAqcmVzdWx0OworCisgICAgaWYgKCFjdHh0KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJlc3VsdCA9IHBhcnNlX3ZhbHVlKGN0eHQsIGFwKTsKKworICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBjdHh0LT5lcnIpOworCisgICAgcGFyc2VyX2NvbnRleHRfZnJlZShjdHh0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvanNvbi1zdHJlYW1lci5jIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L2pzb24tc3RyZWFtZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJmOWIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L2pzb24tc3RyZWFtZXIuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIEpTT04gc3RyZWFtaW5nIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA5CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FpbnQuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xZGljdC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvanNvbi1sZXhlci5oIgorI2luY2x1ZGUgInFhcGkvcW1wL2pzb24tc3RyZWFtZXIuaCIKKworI2RlZmluZSBNQVhfVE9LRU5fU0laRSAoNjRVTEwgPDwgMjApCisjZGVmaW5lIE1BWF9ORVNUSU5HICgxVUxMIDw8IDEwKQorCitzdGF0aWMgdm9pZCBqc29uX21lc3NhZ2VfcHJvY2Vzc190b2tlbihKU09OTGV4ZXIgKmxleGVyLCBRU3RyaW5nICp0b2tlbiwgSlNPTlRva2VuVHlwZSB0eXBlLCBpbnQgeCwgaW50IHkpCit7CisgICAgSlNPTk1lc3NhZ2VQYXJzZXIgKnBhcnNlciA9IGNvbnRhaW5lcl9vZihsZXhlciwgSlNPTk1lc3NhZ2VQYXJzZXIsIGxleGVyKTsKKyAgICBRRGljdCAqZGljdDsKKworICAgIGlmICh0eXBlID09IEpTT05fT1BFUkFUT1IpIHsKKyAgICAgICAgc3dpdGNoIChxc3RyaW5nX2dldF9zdHIodG9rZW4pWzBdKSB7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcGFyc2VyLT5icmFjZV9jb3VudCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ30nOgorICAgICAgICAgICAgcGFyc2VyLT5icmFjZV9jb3VudC0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgcGFyc2VyLT5icmFja2V0X2NvdW50Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXSc6CisgICAgICAgICAgICBwYXJzZXItPmJyYWNrZXRfY291bnQtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkaWN0ID0gcWRpY3RfbmV3KCk7CisgICAgcWRpY3RfcHV0KGRpY3QsICJ0eXBlIiwgcWludF9mcm9tX2ludCh0eXBlKSk7CisgICAgUUlOQ1JFRih0b2tlbik7CisgICAgcWRpY3RfcHV0KGRpY3QsICJ0b2tlbiIsIHRva2VuKTsKKyAgICBxZGljdF9wdXQoZGljdCwgIngiLCBxaW50X2Zyb21faW50KHgpKTsKKyAgICBxZGljdF9wdXQoZGljdCwgInkiLCBxaW50X2Zyb21faW50KHkpKTsKKworICAgIHBhcnNlci0+dG9rZW5fc2l6ZSArPSB0b2tlbi0+bGVuZ3RoOworCisgICAgcWxpc3RfYXBwZW5kKHBhcnNlci0+dG9rZW5zLCBkaWN0KTsKKworICAgIGlmICh0eXBlID09IEpTT05fRVJST1IpIHsKKyAgICAgICAgZ290byBvdXRfZW1pdF9iYWQ7CisgICAgfSBlbHNlIGlmIChwYXJzZXItPmJyYWNlX2NvdW50IDwgMCB8fAorICAgICAgICBwYXJzZXItPmJyYWNrZXRfY291bnQgPCAwIHx8CisgICAgICAgIChwYXJzZXItPmJyYWNlX2NvdW50ID09IDAgJiYKKyAgICAgICAgIHBhcnNlci0+YnJhY2tldF9jb3VudCA9PSAwKSkgeworICAgICAgICBnb3RvIG91dF9lbWl0OworICAgIH0gZWxzZSBpZiAocGFyc2VyLT50b2tlbl9zaXplID4gTUFYX1RPS0VOX1NJWkUgfHwKKyAgICAgICAgICAgICAgIHBhcnNlci0+YnJhY2tldF9jb3VudCA+IE1BWF9ORVNUSU5HIHx8CisgICAgICAgICAgICAgICBwYXJzZXItPmJyYWNlX2NvdW50ID4gTUFYX05FU1RJTkcpIHsKKyAgICAgICAgLyogU2VjdXJpdHkgY29uc2lkZXJhdGlvbiwgd2UgbGltaXQgdG90YWwgbWVtb3J5IGFsbG9jYXRlZCBwZXIgb2JqZWN0CisgICAgICAgICAqIGFuZCB0aGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGggdGhhdCBhIG1lc3NhZ2UgY2FuIGZvcmNlLgorICAgICAgICAgKi8KKyAgICAgICAgZ290byBvdXRfZW1pdDsKKyAgICB9CisKKyAgICByZXR1cm47CisKK291dF9lbWl0X2JhZDoKKyAgICAvKiBjbGVhciBvdXQgdG9rZW4gbGlzdCBhbmQgdGVsbCB0aGUgcGFyc2VyIHRvIGVtaXQgYW5kIGVycm9yCisgICAgICogaW5kaWNhdGlvbiBieSBwYXNzaW5nIGl0IGEgTlVMTCBsaXN0CisgICAgICovCisgICAgUURFQ1JFRihwYXJzZXItPnRva2Vucyk7CisgICAgcGFyc2VyLT50b2tlbnMgPSBOVUxMOworb3V0X2VtaXQ6CisgICAgLyogc2VuZCBjdXJyZW50IGxpc3Qgb2YgdG9rZW5zIHRvIHBhcnNlciBhbmQgcmVzZXQgdG9rZW5pemVyICovCisgICAgcGFyc2VyLT5icmFjZV9jb3VudCA9IDA7CisgICAgcGFyc2VyLT5icmFja2V0X2NvdW50ID0gMDsKKyAgICBwYXJzZXItPmVtaXQocGFyc2VyLCBwYXJzZXItPnRva2Vucyk7CisgICAgaWYgKHBhcnNlci0+dG9rZW5zKSB7CisgICAgICAgIFFERUNSRUYocGFyc2VyLT50b2tlbnMpOworICAgIH0KKyAgICBwYXJzZXItPnRva2VucyA9IHFsaXN0X25ldygpOworICAgIHBhcnNlci0+dG9rZW5fc2l6ZSA9IDA7Cit9CisKK3ZvaWQganNvbl9tZXNzYWdlX3BhcnNlcl9pbml0KEpTT05NZXNzYWdlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykoSlNPTk1lc3NhZ2VQYXJzZXIgKiwgUUxpc3QgKikpCit7CisgICAgcGFyc2VyLT5lbWl0ID0gZnVuYzsKKyAgICBwYXJzZXItPmJyYWNlX2NvdW50ID0gMDsKKyAgICBwYXJzZXItPmJyYWNrZXRfY291bnQgPSAwOworICAgIHBhcnNlci0+dG9rZW5zID0gcWxpc3RfbmV3KCk7CisgICAgcGFyc2VyLT50b2tlbl9zaXplID0gMDsKKworICAgIGpzb25fbGV4ZXJfaW5pdCgmcGFyc2VyLT5sZXhlciwganNvbl9tZXNzYWdlX3Byb2Nlc3NfdG9rZW4pOworfQorCitpbnQganNvbl9tZXNzYWdlX3BhcnNlcl9mZWVkKEpTT05NZXNzYWdlUGFyc2VyICpwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgcmV0dXJuIGpzb25fbGV4ZXJfZmVlZCgmcGFyc2VyLT5sZXhlciwgYnVmZmVyLCBzaXplKTsKK30KKworaW50IGpzb25fbWVzc2FnZV9wYXJzZXJfZmx1c2goSlNPTk1lc3NhZ2VQYXJzZXIgKnBhcnNlcikKK3sKKyAgICByZXR1cm4ganNvbl9sZXhlcl9mbHVzaCgmcGFyc2VyLT5sZXhlcik7Cit9CisKK3ZvaWQganNvbl9tZXNzYWdlX3BhcnNlcl9kZXN0cm95KEpTT05NZXNzYWdlUGFyc2VyICpwYXJzZXIpCit7CisgICAganNvbl9sZXhlcl9kZXN0cm95KCZwYXJzZXItPmxleGVyKTsKKyAgICBRREVDUkVGKHBhcnNlci0+dG9rZW5zKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xYm9vbC5jIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3Fib29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNkMmFmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xYm9vbC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBRQm9vbCBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA5CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJxYXBpL3FtcC9xYm9vbC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FvYmplY3QuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBxYm9vbF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopOworCitzdGF0aWMgY29uc3QgUVR5cGUgcWJvb2xfdHlwZSA9IHsKKyAgICAuY29kZSA9IFFUWVBFX1FCT09MLAorICAgIC5kZXN0cm95ID0gcWJvb2xfZGVzdHJveV9vYmosCit9OworCisvKioKKyAqIHFib29sX2Zyb21faW50KCk6IENyZWF0ZSBhIG5ldyBRQm9vbCBmcm9tIGFuIGludAorICoKKyAqIFJldHVybiBzdHJvbmcgcmVmZXJlbmNlLgorICovCitRQm9vbCAqcWJvb2xfZnJvbV9pbnQoaW50IHZhbHVlKQoreworICAgIFFCb29sICpxYjsKKworICAgIHFiID0gZ19tYWxsb2Moc2l6ZW9mKCpxYikpOworICAgIHFiLT52YWx1ZSA9IHZhbHVlOworICAgIFFPQkpFQ1RfSU5JVChxYiwgJnFib29sX3R5cGUpOworCisgICAgcmV0dXJuIHFiOworfQorCisvKioKKyAqIHFib29sX2dldF9pbnQoKTogR2V0IHRoZSBzdG9yZWQgaW50CisgKi8KK2ludCBxYm9vbF9nZXRfaW50KGNvbnN0IFFCb29sICpxYikKK3sKKyAgICByZXR1cm4gcWItPnZhbHVlOworfQorCisvKioKKyAqIHFvYmplY3RfdG9fcWJvb2woKTogQ29udmVydCBhIFFPYmplY3QgaW50byBhIFFCb29sCisgKi8KK1FCb29sICpxb2JqZWN0X3RvX3Fib29sKGNvbnN0IFFPYmplY3QgKm9iaikKK3sKKyAgICBpZiAocW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUUJPT0wpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIFFCb29sLCBiYXNlKTsKK30KKworLyoqCisgKiBxYm9vbF9kZXN0cm95X29iaigpOiBGcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEKKyAqIFFCb29sIG9iamVjdAorICovCitzdGF0aWMgdm9pZCBxYm9vbF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopCit7CisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBnX2ZyZWUocW9iamVjdF90b19xYm9vbChvYmopKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xZGljdC5jIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FkaWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlMTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xZGljdC5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogUURpY3QgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHVpeiBDYXBpdHVsaW5vIDxsY2FwaXR1bGlub0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSAicWFwaS9xbXAvcWludC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FmbG9hdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FkaWN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWJvb2wuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xc3RyaW5nLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFlbXUvcXVldWUuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBxZGljdF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopOworCitzdGF0aWMgY29uc3QgUVR5cGUgcWRpY3RfdHlwZSA9IHsKKyAgICAuY29kZSA9IFFUWVBFX1FESUNULAorICAgIC5kZXN0cm95ID0gcWRpY3RfZGVzdHJveV9vYmosCit9OworCisvKioKKyAqIHFkaWN0X25ldygpOiBDcmVhdGUgYSBuZXcgUURpY3QKKyAqCisgKiBSZXR1cm4gc3Ryb25nIHJlZmVyZW5jZS4KKyAqLworUURpY3QgKnFkaWN0X25ldyh2b2lkKQoreworICAgIFFEaWN0ICpxZGljdDsKKworICAgIHFkaWN0ID0gZ19tYWxsb2MwKHNpemVvZigqcWRpY3QpKTsKKyAgICBRT0JKRUNUX0lOSVQocWRpY3QsICZxZGljdF90eXBlKTsKKworICAgIHJldHVybiBxZGljdDsKK30KKworLyoqCisgKiBxb2JqZWN0X3RvX3FkaWN0KCk6IENvbnZlcnQgYSBRT2JqZWN0IGludG8gYSBRRGljdAorICovCitRRGljdCAqcW9iamVjdF90b19xZGljdChjb25zdCBRT2JqZWN0ICpvYmopCit7CisgICAgaWYgKHFvYmplY3RfdHlwZShvYmopICE9IFFUWVBFX1FESUNUKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBjb250YWluZXJfb2Yob2JqLCBRRGljdCwgYmFzZSk7Cit9CisKKy8qKgorICogdGRiX2hhc2goKTogYmFzZWQgb24gdGhlIGhhc2ggYWdvcml0aG0gZnJvbSBnZGJtLCB2aWEgdGRiCisgKiAoZnJvbSBtb2R1bGUtaW5pdC10b29scykKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZGJfaGFzaChjb25zdCBjaGFyICpuYW1lKQoreworICAgIHVuc2lnbmVkIHZhbHVlOwkvKiBVc2VkIHRvIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUuICAqLworICAgIHVuc2lnbmVkICAgaTsJLyogVXNlZCB0byBjeWNsZSB0aHJvdWdoIHJhbmRvbSB2YWx1ZXMuICovCisKKyAgICAvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUga2V5IHNpemUuICovCisgICAgZm9yICh2YWx1ZSA9IDB4MjM4RjEzQUYgKiBzdHJsZW4obmFtZSksIGk9MDsgbmFtZVtpXTsgaSsrKQorICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiluYW1lKVtpXSA8PCAoaSo1ICUgMjQpKSk7CisKKyAgICByZXR1cm4gKDExMDM1MTUyNDMgKiB2YWx1ZSArIDEyMzQ1KTsKK30KKworLyoqCisgKiBhbGxvY19lbnRyeSgpOiBhbGxvY2F0ZSBhIG5ldyBRRGljdEVudHJ5CisgKi8KK3N0YXRpYyBRRGljdEVudHJ5ICphbGxvY19lbnRyeShjb25zdCBjaGFyICprZXksIFFPYmplY3QgKnZhbHVlKQoreworICAgIFFEaWN0RW50cnkgKmVudHJ5OworCisgICAgZW50cnkgPSBnX21hbGxvYzAoc2l6ZW9mKCplbnRyeSkpOworICAgIGVudHJ5LT5rZXkgPSBnX3N0cmR1cChrZXkpOworICAgIGVudHJ5LT52YWx1ZSA9IHZhbHVlOworCisgICAgcmV0dXJuIGVudHJ5OworfQorCisvKioKKyAqIHFkaWN0X2VudHJ5X3ZhbHVlKCk6IFJldHVybiBxZGljdCBlbnRyeSB2YWx1ZQorICoKKyAqIFJldHVybiB3ZWFrIHJlZmVyZW5jZS4KKyAqLworUU9iamVjdCAqcWRpY3RfZW50cnlfdmFsdWUoY29uc3QgUURpY3RFbnRyeSAqZW50cnkpCit7CisgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKK30KKworLyoqCisgKiBxZGljdF9lbnRyeV9rZXkoKTogUmV0dXJuIHFkaWN0IGVudHJ5IGtleQorICoKKyAqIFJldHVybiBhICpwb2ludGVyKiB0byB0aGUgc3RyaW5nLCBpdCBoYXMgdG8gYmUgZHVwbGljYXRlZCBiZWZvcmUgYmVpbmcKKyAqIHN0b3JlZC4KKyAqLworY29uc3QgY2hhciAqcWRpY3RfZW50cnlfa2V5KGNvbnN0IFFEaWN0RW50cnkgKmVudHJ5KQoreworICAgIHJldHVybiBlbnRyeS0+a2V5OworfQorCisvKioKKyAqIHFkaWN0X2ZpbmQoKTogTGlzdCBsb29rdXAgZnVuY3Rpb24KKyAqLworc3RhdGljIFFEaWN0RW50cnkgKnFkaWN0X2ZpbmQoY29uc3QgUURpY3QgKnFkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LCB1bnNpZ25lZCBpbnQgYnVja2V0KQoreworICAgIFFEaWN0RW50cnkgKmVudHJ5OworCisgICAgUUxJU1RfRk9SRUFDSChlbnRyeSwgJnFkaWN0LT50YWJsZVtidWNrZXRdLCBuZXh0KQorICAgICAgICBpZiAoIXN0cmNtcChlbnRyeS0+a2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcWRpY3RfcHV0X29iaigpOiBQdXQgYSBuZXcgUU9iamVjdCBpbnRvIHRoZSBkaWN0aW9uYXJ5CisgKgorICogSW5zZXJ0IHRoZSBwYWlyICdrZXk6dmFsdWUnIGludG8gJ3FkaWN0JywgaWYgJ2tleScgYWxyZWFkeSBleGlzdHMKKyAqIGl0cyAndmFsdWUnIHdpbGwgYmUgcmVwbGFjZWQuCisgKgorICogVGhpcyBpcyBkb25lIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIFFPYmplY3QgYW5kCisgKiBzdG9yaW5nIHRoZSBuZXcgb25lIGluIHRoZSBzYW1lIGVudHJ5LgorICoKKyAqIE5PVEU6IG93bmVyc2hpcCBvZiAndmFsdWUnIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBRRGljdAorICovCit2b2lkIHFkaWN0X3B1dF9vYmooUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXksIFFPYmplY3QgKnZhbHVlKQoreworICAgIHVuc2lnbmVkIGludCBidWNrZXQ7CisgICAgUURpY3RFbnRyeSAqZW50cnk7CisKKyAgICBidWNrZXQgPSB0ZGJfaGFzaChrZXkpICUgUURJQ1RfQlVDS0VUX01BWDsKKyAgICBlbnRyeSA9IHFkaWN0X2ZpbmQocWRpY3QsIGtleSwgYnVja2V0KTsKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgLyogcmVwbGFjZSBrZXkncyB2YWx1ZSAqLworICAgICAgICBxb2JqZWN0X2RlY3JlZihlbnRyeS0+dmFsdWUpOworICAgICAgICBlbnRyeS0+dmFsdWUgPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBlbnRyeSAqLworICAgICAgICBlbnRyeSA9IGFsbG9jX2VudHJ5KGtleSwgdmFsdWUpOworICAgICAgICBRTElTVF9JTlNFUlRfSEVBRCgmcWRpY3QtPnRhYmxlW2J1Y2tldF0sIGVudHJ5LCBuZXh0KTsKKyAgICAgICAgcWRpY3QtPnNpemUrKzsKKyAgICB9Cit9CisKKy8qKgorICogcWRpY3RfZ2V0KCk6IExvb2t1cCBmb3IgYSBnaXZlbiAna2V5JworICoKKyAqIFJldHVybiBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBRT2JqZWN0IGFzc29jaWF0ZWQgd2l0aCAna2V5JyBpZgorICogJ2tleScgaXMgcHJlc2VudCBpbiB0aGUgZGljdGlvbmFyeSwgTlVMTCBvdGhlcndpc2UuCisgKi8KK1FPYmplY3QgKnFkaWN0X2dldChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRRGljdEVudHJ5ICplbnRyeTsKKworICAgIGVudHJ5ID0gcWRpY3RfZmluZChxZGljdCwga2V5LCB0ZGJfaGFzaChrZXkpICUgUURJQ1RfQlVDS0VUX01BWCk7CisgICAgcmV0dXJuIChlbnRyeSA9PSBOVUxMID8gTlVMTCA6IGVudHJ5LT52YWx1ZSk7Cit9CisKKy8qKgorICogcWRpY3RfaGFza2V5KCk6IENoZWNrIGlmICdrZXknIGV4aXN0cworICoKKyAqIFJldHVybiAxIGlmICdrZXknIGV4aXN0cyBpbiB0aGUgZGljdCwgMCBvdGhlcndpc2UKKyAqLworaW50IHFkaWN0X2hhc2tleShjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYnVja2V0ID0gdGRiX2hhc2goa2V5KSAlIFFESUNUX0JVQ0tFVF9NQVg7CisgICAgcmV0dXJuIChxZGljdF9maW5kKHFkaWN0LCBrZXksIGJ1Y2tldCkgPT0gTlVMTCA/IDAgOiAxKTsKK30KKworLyoqCisgKiBxZGljdF9zaXplKCk6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZGljdGlvbmFyeQorICovCitzaXplX3QgcWRpY3Rfc2l6ZShjb25zdCBRRGljdCAqcWRpY3QpCit7CisgICAgcmV0dXJuIHFkaWN0LT5zaXplOworfQorCisvKioKKyAqIHFkaWN0X2dldF9vYmooKTogR2V0IGEgUU9iamVjdCBvZiBhIHNwZWNpZmljIHR5cGUKKyAqLworc3RhdGljIFFPYmplY3QgKnFkaWN0X2dldF9vYmooY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdHlwZV9jb2RlIHR5cGUpCit7CisgICAgUU9iamVjdCAqb2JqOworCisgICAgb2JqID0gcWRpY3RfZ2V0KHFkaWN0LCBrZXkpOworICAgIGFzc2VydChvYmogIT0gTlVMTCk7CisgICAgYXNzZXJ0KHFvYmplY3RfdHlwZShvYmopID09IHR5cGUpOworCisgICAgcmV0dXJuIG9iajsKK30KKworLyoqCisgKiBxZGljdF9nZXRfZG91YmxlKCk6IEdldCBhbiBudW1iZXIgbWFwcGVkIGJ5ICdrZXknCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgJ2tleScgZXhpc3RzIGFuZCBpdCBzdG9yZXMgYQorICogUUZsb2F0IG9yIFFJbnQgb2JqZWN0LgorICoKKyAqIFJldHVybiBudW1iZXIgbWFwcGVkIGJ5ICdrZXknLgorICovCitkb3VibGUgcWRpY3RfZ2V0X2RvdWJsZShjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRT2JqZWN0ICpvYmogPSBxZGljdF9nZXQocWRpY3QsIGtleSk7CisKKyAgICBhc3NlcnQob2JqKTsKKyAgICBzd2l0Y2ggKHFvYmplY3RfdHlwZShvYmopKSB7CisgICAgY2FzZSBRVFlQRV9RRkxPQVQ6CisgICAgICAgIHJldHVybiBxZmxvYXRfZ2V0X2RvdWJsZShxb2JqZWN0X3RvX3FmbG9hdChvYmopKTsKKyAgICBjYXNlIFFUWVBFX1FJTlQ6CisgICAgICAgIHJldHVybiBxaW50X2dldF9pbnQocW9iamVjdF90b19xaW50KG9iaikpOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCisvKioKKyAqIHFkaWN0X2dldF9pbnQoKTogR2V0IGFuIGludGVnZXIgbWFwcGVkIGJ5ICdrZXknCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgJ2tleScgZXhpc3RzIGFuZCBpdCBzdG9yZXMgYQorICogUUludCBvYmplY3QuCisgKgorICogUmV0dXJuIGludGVnZXIgbWFwcGVkIGJ5ICdrZXknLgorICovCitpbnQ2NF90IHFkaWN0X2dldF9pbnQoY29uc3QgUURpY3QgKnFkaWN0LCBjb25zdCBjaGFyICprZXkpCit7CisgICAgUU9iamVjdCAqb2JqID0gcWRpY3RfZ2V0X29iaihxZGljdCwga2V5LCBRVFlQRV9RSU5UKTsKKyAgICByZXR1cm4gcWludF9nZXRfaW50KHFvYmplY3RfdG9fcWludChvYmopKTsKK30KKworLyoqCisgKiBxZGljdF9nZXRfYm9vbCgpOiBHZXQgYSBib29sIG1hcHBlZCBieSAna2V5JworICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0ICdrZXknIGV4aXN0cyBhbmQgaXQgc3RvcmVzIGEKKyAqIFFCb29sIG9iamVjdC4KKyAqCisgKiBSZXR1cm4gYm9vbCBtYXBwZWQgYnkgJ2tleScuCisgKi8KK2ludCBxZGljdF9nZXRfYm9vbChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRT2JqZWN0ICpvYmogPSBxZGljdF9nZXRfb2JqKHFkaWN0LCBrZXksIFFUWVBFX1FCT09MKTsKKyAgICByZXR1cm4gcWJvb2xfZ2V0X2ludChxb2JqZWN0X3RvX3Fib29sKG9iaikpOworfQorCisvKioKKyAqIHFkaWN0X2dldF9xbGlzdCgpOiBHZXQgdGhlIFFMaXN0IG1hcHBlZCBieSAna2V5JworICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0ICdrZXknIGV4aXN0cyBhbmQgaXQgc3RvcmVzIGEKKyAqIFFMaXN0IG9iamVjdC4KKyAqCisgKiBSZXR1cm4gUUxpc3QgbWFwcGVkIGJ5ICdrZXknLgorICovCitRTGlzdCAqcWRpY3RfZ2V0X3FsaXN0KGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5KQoreworICAgIHJldHVybiBxb2JqZWN0X3RvX3FsaXN0KHFkaWN0X2dldF9vYmoocWRpY3QsIGtleSwgUVRZUEVfUUxJU1QpKTsKK30KKworLyoqCisgKiBxZGljdF9nZXRfcWRpY3QoKTogR2V0IHRoZSBRRGljdCBtYXBwZWQgYnkgJ2tleScKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCAna2V5JyBleGlzdHMgYW5kIGl0IHN0b3JlcyBhCisgKiBRRGljdCBvYmplY3QuCisgKgorICogUmV0dXJuIFFEaWN0IG1hcHBlZCBieSAna2V5Jy4KKyAqLworUURpY3QgKnFkaWN0X2dldF9xZGljdChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICByZXR1cm4gcW9iamVjdF90b19xZGljdChxZGljdF9nZXRfb2JqKHFkaWN0LCBrZXksIFFUWVBFX1FESUNUKSk7Cit9CisKKy8qKgorICogcWRpY3RfZ2V0X3N0cigpOiBHZXQgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgc3RyaW5nIG1hcHBlZAorICogYnkgJ2tleScKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCAna2V5JyBleGlzdHMgYW5kIGl0IHN0b3JlcyBhCisgKiBRU3RyaW5nIG9iamVjdC4KKyAqCisgKiBSZXR1cm4gcG9pbnRlciB0byB0aGUgc3RyaW5nIG1hcHBlZCBieSAna2V5Jy4KKyAqLworY29uc3QgY2hhciAqcWRpY3RfZ2V0X3N0cihjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRT2JqZWN0ICpvYmogPSBxZGljdF9nZXRfb2JqKHFkaWN0LCBrZXksIFFUWVBFX1FTVFJJTkcpOworICAgIHJldHVybiBxc3RyaW5nX2dldF9zdHIocW9iamVjdF90b19xc3RyaW5nKG9iaikpOworfQorCisvKioKKyAqIHFkaWN0X2dldF90cnlfaW50KCk6IFRyeSB0byBnZXQgaW50ZWdlciBtYXBwZWQgYnkgJ2tleScKKyAqCisgKiBSZXR1cm4gaW50ZWdlciBtYXBwZWQgYnkgJ2tleScsIGlmIGl0IGlzIG5vdCBwcmVzZW50IGluCisgKiB0aGUgZGljdGlvbmFyeSBvciBpZiB0aGUgc3RvcmVkIG9iamVjdCBpcyBub3Qgb2YgUUludCB0eXBlCisgKiAnZGVmX3ZhbHVlJyB3aWxsIGJlIHJldHVybmVkLgorICovCitpbnQ2NF90IHFkaWN0X2dldF90cnlfaW50KGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlZl92YWx1ZSkKK3sKKyAgICBRT2JqZWN0ICpvYmo7CisKKyAgICBvYmogPSBxZGljdF9nZXQocWRpY3QsIGtleSk7CisgICAgaWYgKCFvYmogfHwgcW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUUlOVCkKKyAgICAgICAgcmV0dXJuIGRlZl92YWx1ZTsKKworICAgIHJldHVybiBxaW50X2dldF9pbnQocW9iamVjdF90b19xaW50KG9iaikpOworfQorCisvKioKKyAqIHFkaWN0X2dldF90cnlfYm9vbCgpOiBUcnkgdG8gZ2V0IGEgYm9vbCBtYXBwZWQgYnkgJ2tleScKKyAqCisgKiBSZXR1cm4gYm9vbCBtYXBwZWQgYnkgJ2tleScsIGlmIGl0IGlzIG5vdCBwcmVzZW50IGluIHRoZQorICogZGljdGlvbmFyeSBvciBpZiB0aGUgc3RvcmVkIG9iamVjdCBpcyBub3Qgb2YgUUJvb2wgdHlwZQorICogJ2RlZl92YWx1ZScgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworaW50IHFkaWN0X2dldF90cnlfYm9vbChjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSwgaW50IGRlZl92YWx1ZSkKK3sKKyAgICBRT2JqZWN0ICpvYmo7CisKKyAgICBvYmogPSBxZGljdF9nZXQocWRpY3QsIGtleSk7CisgICAgaWYgKCFvYmogfHwgcW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUUJPT0wpCisgICAgICAgIHJldHVybiBkZWZfdmFsdWU7CisKKyAgICByZXR1cm4gcWJvb2xfZ2V0X2ludChxb2JqZWN0X3RvX3Fib29sKG9iaikpOworfQorCisvKioKKyAqIHFkaWN0X2dldF90cnlfc3RyKCk6IFRyeSB0byBnZXQgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgc3RyaW5nCisgKiBtYXBwZWQgYnkgJ2tleScKKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgbWFwcGVkIGJ5ICdrZXknLCBpZiBpdCBpcyBub3QgcHJlc2VudAorICogaW4gdGhlIGRpY3Rpb25hcnkgb3IgaWYgdGhlIHN0b3JlZCBvYmplY3QgaXMgbm90IG9mIFFTdHJpbmcgdHlwZQorICogTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICovCitjb25zdCBjaGFyICpxZGljdF9nZXRfdHJ5X3N0cihjb25zdCBRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRT2JqZWN0ICpvYmo7CisKKyAgICBvYmogPSBxZGljdF9nZXQocWRpY3QsIGtleSk7CisgICAgaWYgKCFvYmogfHwgcW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUVNUUklORykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gcXN0cmluZ19nZXRfc3RyKHFvYmplY3RfdG9fcXN0cmluZyhvYmopKTsKK30KKworLyoqCisgKiBxZGljdF9pdGVyKCk6IEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGRpY3Rpb25hcnkncyBzdG9yZWQgdmFsdWVzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSB1c2VyIHRvIHByb3ZpZGUgYW4gaXRlcmF0b3IsIHdoaWNoIHdpbGwgYmUKKyAqIGNhbGxlZCBmb3IgZWFjaCBzdG9yZWQgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkuCisgKi8KK3ZvaWQgcWRpY3RfaXRlcihjb25zdCBRRGljdCAqcWRpY3QsCisgICAgICAgICAgICAgICAgdm9pZCAoKml0ZXIpKGNvbnN0IGNoYXIgKmtleSwgUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpLAorICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBRRGljdEVudHJ5ICplbnRyeTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBRRElDVF9CVUNLRVRfTUFYOyBpKyspIHsKKyAgICAgICAgUUxJU1RfRk9SRUFDSChlbnRyeSwgJnFkaWN0LT50YWJsZVtpXSwgbmV4dCkKKyAgICAgICAgICAgIGl0ZXIoZW50cnktPmtleSwgZW50cnktPnZhbHVlLCBvcGFxdWUpOworICAgIH0KK30KKworc3RhdGljIFFEaWN0RW50cnkgKnFkaWN0X25leHRfZW50cnkoY29uc3QgUURpY3QgKnFkaWN0LCBpbnQgZmlyc3RfYnVja2V0KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gZmlyc3RfYnVja2V0OyBpIDwgUURJQ1RfQlVDS0VUX01BWDsgaSsrKSB7CisgICAgICAgIGlmICghUUxJU1RfRU1QVFkoJnFkaWN0LT50YWJsZVtpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBRTElTVF9GSVJTVCgmcWRpY3QtPnRhYmxlW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisvKioKKyAqIHFkaWN0X2ZpcnN0KCk6IFJldHVybiBmaXJzdCBxZGljdCBlbnRyeSBmb3IgaXRlcmF0aW9uLgorICovCitjb25zdCBRRGljdEVudHJ5ICpxZGljdF9maXJzdChjb25zdCBRRGljdCAqcWRpY3QpCit7CisgICAgcmV0dXJuIHFkaWN0X25leHRfZW50cnkocWRpY3QsIDApOworfQorCisvKioKKyAqIHFkaWN0X25leHQoKTogUmV0dXJuIG5leHQgcWRpY3QgZW50cnkgaW4gYW4gaXRlcmF0aW9uLgorICovCitjb25zdCBRRGljdEVudHJ5ICpxZGljdF9uZXh0KGNvbnN0IFFEaWN0ICpxZGljdCwgY29uc3QgUURpY3RFbnRyeSAqZW50cnkpCit7CisgICAgUURpY3RFbnRyeSAqcmV0OworCisgICAgcmV0ID0gUUxJU1RfTkVYVChlbnRyeSwgbmV4dCk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGJ1Y2tldCA9IHRkYl9oYXNoKGVudHJ5LT5rZXkpICUgUURJQ1RfQlVDS0VUX01BWDsKKyAgICAgICAgcmV0ID0gcWRpY3RfbmV4dF9lbnRyeShxZGljdCwgYnVja2V0ICsgMSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBxZGljdF9jbG9uZV9zaGFsbG93KCk6IENsb25lcyBhIGdpdmVuIFFEaWN0LiBJdHMgZW50cmllcyBhcmUgbm90IGNvcGllZCwgYnV0CisgKiBhbm90aGVyIHJlZmVyZW5jZSBpcyBhZGRlZC4KKyAqLworUURpY3QgKnFkaWN0X2Nsb25lX3NoYWxsb3coY29uc3QgUURpY3QgKnNyYykKK3sKKyAgICBRRGljdCAqZGVzdDsKKyAgICBRRGljdEVudHJ5ICplbnRyeTsKKyAgICBpbnQgaTsKKworICAgIGRlc3QgPSBxZGljdF9uZXcoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBRRElDVF9CVUNLRVRfTUFYOyBpKyspIHsKKyAgICAgICAgUUxJU1RfRk9SRUFDSChlbnRyeSwgJnNyYy0+dGFibGVbaV0sIG5leHQpIHsKKyAgICAgICAgICAgIHFvYmplY3RfaW5jcmVmKGVudHJ5LT52YWx1ZSk7CisgICAgICAgICAgICBxZGljdF9wdXRfb2JqKGRlc3QsIGVudHJ5LT5rZXksIGVudHJ5LT52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZGVzdDsKK30KKworLyoqCisgKiBxZW50cnlfZGVzdHJveSgpOiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIFFEaWN0RW50cnkKKyAqLworc3RhdGljIHZvaWQgcWVudHJ5X2Rlc3Ryb3koUURpY3RFbnRyeSAqZSkKK3sKKyAgICBhc3NlcnQoZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZS0+a2V5ICE9IE5VTEwpOworICAgIGFzc2VydChlLT52YWx1ZSAhPSBOVUxMKTsKKworICAgIHFvYmplY3RfZGVjcmVmKGUtPnZhbHVlKTsKKyAgICBnX2ZyZWUoZS0+a2V5KTsKKyAgICBnX2ZyZWUoZSk7Cit9CisKKy8qKgorICogcWRpY3RfZGVsKCk6IERlbGV0ZSBhICdrZXk6dmFsdWUnIHBhaXIgZnJvbSB0aGUgZGljdGlvbmFyeQorICoKKyAqIFRoaXMgd2lsbCBkZXN0cm95IGFsbCBkYXRhIGFsbG9jYXRlZCBieSB0aGlzIGVudHJ5LgorICovCit2b2lkIHFkaWN0X2RlbChRRGljdCAqcWRpY3QsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBRRGljdEVudHJ5ICplbnRyeTsKKworICAgIGVudHJ5ID0gcWRpY3RfZmluZChxZGljdCwga2V5LCB0ZGJfaGFzaChrZXkpICUgUURJQ1RfQlVDS0VUX01BWCk7CisgICAgaWYgKGVudHJ5KSB7CisgICAgICAgIFFMSVNUX1JFTU9WRShlbnRyeSwgbmV4dCk7CisgICAgICAgIHFlbnRyeV9kZXN0cm95KGVudHJ5KTsKKyAgICAgICAgcWRpY3QtPnNpemUtLTsKKyAgICB9Cit9CisKKy8qKgorICogcWRpY3RfZGVzdHJveV9vYmooKTogRnJlZSBhbGwgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBRRGljdAorICovCitzdGF0aWMgdm9pZCBxZGljdF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopCit7CisgICAgaW50IGk7CisgICAgUURpY3QgKnFkaWN0OworCisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBxZGljdCA9IHFvYmplY3RfdG9fcWRpY3Qob2JqKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBRRElDVF9CVUNLRVRfTUFYOyBpKyspIHsKKyAgICAgICAgUURpY3RFbnRyeSAqZW50cnkgPSBRTElTVF9GSVJTVCgmcWRpY3QtPnRhYmxlW2ldKTsKKyAgICAgICAgd2hpbGUgKGVudHJ5KSB7CisgICAgICAgICAgICBRRGljdEVudHJ5ICp0bXAgPSBRTElTVF9ORVhUKGVudHJ5LCBuZXh0KTsKKyAgICAgICAgICAgIFFMSVNUX1JFTU9WRShlbnRyeSwgbmV4dCk7CisgICAgICAgICAgICBxZW50cnlfZGVzdHJveShlbnRyeSk7CisgICAgICAgICAgICBlbnRyeSA9IHRtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdfZnJlZShxZGljdCk7Cit9CisKK3N0YXRpYyB2b2lkIHFkaWN0X2RvX2ZsYXR0ZW4oUURpY3QgKnFkaWN0LCBRRGljdCAqdGFyZ2V0LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisgICAgUU9iamVjdCAqdmFsdWU7CisgICAgY29uc3QgUURpY3RFbnRyeSAqZW50cnksICpuZXh0OworICAgIGNoYXIgKm5ld19rZXk7CisgICAgYm9vbCBkZWxldGU7CisKKyAgICBlbnRyeSA9IHFkaWN0X2ZpcnN0KHFkaWN0KTsKKworICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CisKKyAgICAgICAgbmV4dCA9IHFkaWN0X25leHQocWRpY3QsIGVudHJ5KTsKKyAgICAgICAgdmFsdWUgPSBxZGljdF9lbnRyeV92YWx1ZShlbnRyeSk7CisgICAgICAgIG5ld19rZXkgPSBOVUxMOworICAgICAgICBkZWxldGUgPSBmYWxzZTsKKworICAgICAgICBpZiAocHJlZml4KSB7CisgICAgICAgICAgICBuZXdfa2V5ID0gZ19zdHJkdXBfcHJpbnRmKCIlcy4lcyIsIHByZWZpeCwgZW50cnktPmtleSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocW9iamVjdF90eXBlKHZhbHVlKSA9PSBRVFlQRV9RRElDVCkgeworICAgICAgICAgICAgLyogRW50cmllcyBvZiBRRGljdHMgYXJlIHByb2Nlc3NlZCByZWN1cnNpdmVseSwgdGhlIFFEaWN0IG9iamVjdAorICAgICAgICAgICAgICogaXRzZWxmIGRpc2FwcGVhcnMuICovCisgICAgICAgICAgICBxZGljdF9kb19mbGF0dGVuKHFvYmplY3RfdG9fcWRpY3QodmFsdWUpLCB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19rZXkgPyBuZXdfa2V5IDogZW50cnktPmtleSk7CisgICAgICAgICAgICBkZWxldGUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKHByZWZpeCkgeworICAgICAgICAgICAgLyogQWxsIG90aGVyIG9iamVjdHMgYXJlIG1vdmVkIHRvIHRoZSB0YXJnZXQgdW5jaGFuZ2VkLiAqLworICAgICAgICAgICAgcW9iamVjdF9pbmNyZWYodmFsdWUpOworICAgICAgICAgICAgcWRpY3RfcHV0X29iaih0YXJnZXQsIG5ld19rZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGRlbGV0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUobmV3X2tleSk7CisKKyAgICAgICAgaWYgKGRlbGV0ZSkgeworICAgICAgICAgICAgcWRpY3RfZGVsKHFkaWN0LCBlbnRyeS0+a2V5KTsKKworICAgICAgICAgICAgLyogUmVzdGFydCBsb29wIGFmdGVyIG1vZGlmeWluZyB0aGUgaXRlcmF0ZWQgUURpY3QgKi8KKyAgICAgICAgICAgIGVudHJ5ID0gcWRpY3RfZmlyc3QocWRpY3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgfQorfQorCisvKioKKyAqIHFkaWN0X2ZsYXR0ZW4oKTogRm9yIGVhY2ggbmVzdGVkIFFEaWN0IHdpdGgga2V5IHgsIGFsbCBmaWVsZHMgd2l0aCBrZXkgeQorICogYXJlIG1vdmVkIHRvIHRoaXMgUURpY3QgYW5kIHRoZWlyIGtleSBpcyByZW5hbWVkIHRvICJ4LnkiLiBUaGlzIG9wZXJhdGlvbgorICogaXMgYXBwbGllZCByZWN1cnNpdmVseSBmb3IgbmVzdGVkIFFEaWN0cy4KKyAqLwordm9pZCBxZGljdF9mbGF0dGVuKFFEaWN0ICpxZGljdCkKK3sKKyAgICBxZGljdF9kb19mbGF0dGVuKHFkaWN0LCBxZGljdCwgTlVMTCk7Cit9CisKKy8qIGV4dHJhY3QgYWxsIHRoZSBzcmMgUURpY3QgZW50cmllcyBzdGFydGluZyBieSBzdGFydCBpbnRvIGRzdCAqLwordm9pZCBxZGljdF9leHRyYWN0X3N1YnFkaWN0KFFEaWN0ICpzcmMsIFFEaWN0ICoqZHN0LCBjb25zdCBjaGFyICpzdGFydCkKKworeworICAgIGNvbnN0IFFEaWN0RW50cnkgKmVudHJ5LCAqbmV4dDsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgKmRzdCA9IHFkaWN0X25ldygpOworICAgIGVudHJ5ID0gcWRpY3RfZmlyc3Qoc3JjKTsKKworICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIG5leHQgPSBxZGljdF9uZXh0KHNyYywgZW50cnkpOworICAgICAgICBpZiAoc3Ryc3RhcnQoZW50cnktPmtleSwgc3RhcnQsICZwKSkgeworICAgICAgICAgICAgcW9iamVjdF9pbmNyZWYoZW50cnktPnZhbHVlKTsKKyAgICAgICAgICAgIHFkaWN0X3B1dF9vYmooKmRzdCwgcCwgZW50cnktPnZhbHVlKTsKKyAgICAgICAgICAgIHFkaWN0X2RlbChzcmMsIGVudHJ5LT5rZXkpOworICAgICAgICB9CisgICAgICAgIGVudHJ5ID0gbmV4dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWVycm9yLmMgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM4MzMxYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xZXJyb3IuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIFFFcnJvciBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICBMdWl6IENhcGl0dWxpbm8gPGxjYXBpdHVsaW5vQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xanNvbi5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FlcnJvci5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHFlcnJvcl9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopOworCitzdGF0aWMgY29uc3QgUVR5cGUgcWVycm9yX3R5cGUgPSB7CisgICAgLmNvZGUgPSBRVFlQRV9RRVJST1IsCisgICAgLmRlc3Ryb3kgPSBxZXJyb3JfZGVzdHJveV9vYmosCit9OworCisvKioKKyAqIHFlcnJvcl9uZXcoKTogQ3JlYXRlIGEgbmV3IFFFcnJvcgorICoKKyAqIFJldHVybiBzdHJvbmcgcmVmZXJlbmNlLgorICovCitzdGF0aWMgUUVycm9yICpxZXJyb3JfbmV3KHZvaWQpCit7CisgICAgUUVycm9yICpxZXJyOworCisgICAgcWVyciA9IGdfbWFsbG9jMChzaXplb2YoKnFlcnIpKTsKKyAgICBRT0JKRUNUX0lOSVQocWVyciwgJnFlcnJvcl90eXBlKTsKKworICAgIHJldHVybiBxZXJyOworfQorCisvKioKKyAqIHFlcnJvcl9mcm9tX2luZm8oKTogQ3JlYXRlIGEgbmV3IFFFcnJvciBmcm9tIGVycm9yIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJuIHN0cm9uZyByZWZlcmVuY2UuCisgKi8KK3N0YXRpYyBRRXJyb3IgKiBHQ0NfRk1UX0FUVFIoMiwgMCkKK3FlcnJvcl9mcm9tX2luZm8oRXJyb3JDbGFzcyBlcnJfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCAqdmEpCit7CisgICAgUUVycm9yICpxZXJyOworCisgICAgcWVyciA9IHFlcnJvcl9uZXcoKTsKKyAgICBsb2Nfc2F2ZSgmcWVyci0+bG9jKTsKKworICAgIHFlcnItPmVycl9tc2cgPSBnX3N0cmR1cF92cHJpbnRmKGZtdCwgKnZhKTsKKyAgICBxZXJyLT5lcnJfY2xhc3MgPSBlcnJfY2xhc3M7CisKKyAgICByZXR1cm4gcWVycjsKK30KKworLyoqCisgKiBxZXJyb3JfaHVtYW4oKTogRm9ybWF0IFFFcnJvciBkYXRhIGludG8gaHVtYW4tcmVhZGFibGUgc3RyaW5nLgorICovCitRU3RyaW5nICpxZXJyb3JfaHVtYW4oY29uc3QgUUVycm9yICpxZXJyb3IpCit7CisgICAgcmV0dXJuIHFzdHJpbmdfZnJvbV9zdHIocWVycm9yLT5lcnJfbXNnKTsKK30KKworLyoqCisgKiBxZXJyb3JfcHJpbnQoKTogUHJpbnQgUUVycm9yIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcHJpbnQgdGhlIG1lbWJlciAnZGVzYycgb2YgdGhlIHNwZWNpZmllZCBRRXJyb3Igb2JqZWN0LAorICogaXQgdXNlcyBlcnJvcl9yZXBvcnQoKSBmb3IgdGhpcywgc28gdGhhdCB0aGUgb3V0cHV0IGlzIHJvdXRlZCB0byB0aGUgcmlnaHQKKyAqIHBsYWNlIChpZS4gc3RkZXJyIG9yIE1vbml0b3IncyBkZXZpY2UpLgorICovCitzdGF0aWMgdm9pZCBxZXJyb3JfcHJpbnQoUUVycm9yICpxZXJyb3IpCit7CisgICAgUVN0cmluZyAqcXN0cmluZyA9IHFlcnJvcl9odW1hbihxZXJyb3IpOworICAgIGxvY19wdXNoX3Jlc3RvcmUoJnFlcnJvci0+bG9jKTsKKyAgICBlcnJvcl9yZXBvcnQoIiVzIiwgcXN0cmluZ19nZXRfc3RyKHFzdHJpbmcpKTsKKyAgICBsb2NfcG9wKCZxZXJyb3ItPmxvYyk7CisgICAgUURFQ1JFRihxc3RyaW5nKTsKK30KKwordm9pZCBxZXJyb3JfcmVwb3J0KEVycm9yQ2xhc3MgZWNsYXNzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IHZhOworICAgIFFFcnJvciAqcWVycm9yOworCisgICAgdmFfc3RhcnQodmEsIGZtdCk7CisgICAgcWVycm9yID0gcWVycm9yX2Zyb21faW5mbyhlY2xhc3MsIGZtdCwgJnZhKTsKKyAgICB2YV9lbmQodmEpOworCisgICAgaWYgKG1vbml0b3JfY3VyX2lzX3FtcCgpKSB7CisgICAgICAgIG1vbml0b3Jfc2V0X2Vycm9yKGN1cl9tb24sIHFlcnJvcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWVycm9yX3ByaW50KHFlcnJvcik7CisgICAgICAgIFFERUNSRUYocWVycm9yKTsKKyAgICB9Cit9CisKKy8qIEV2aWwuLi4gKi8KK3N0cnVjdCBFcnJvcgoreworICAgIGNoYXIgKm1zZzsKKyAgICBFcnJvckNsYXNzIGVycl9jbGFzczsKK307CisKK3ZvaWQgcWVycm9yX3JlcG9ydF9lcnIoRXJyb3IgKmVycikKK3sKKyAgICBRRXJyb3IgKnFlcnI7CisKKyAgICBxZXJyID0gcWVycm9yX25ldygpOworICAgIGxvY19zYXZlKCZxZXJyLT5sb2MpOworICAgIHFlcnItPmVycl9tc2cgPSBnX3N0cmR1cChlcnItPm1zZyk7CisgICAgcWVyci0+ZXJyX2NsYXNzID0gZXJyLT5lcnJfY2xhc3M7CisKKyAgICBpZiAobW9uaXRvcl9jdXJfaXNfcW1wKCkpIHsKKyAgICAgICAgbW9uaXRvcl9zZXRfZXJyb3IoY3VyX21vbiwgcWVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWVycm9yX3ByaW50KHFlcnIpOworICAgICAgICBRREVDUkVGKHFlcnIpOworICAgIH0KK30KKwordm9pZCBhc3NlcnRfbm9fZXJyb3IoRXJyb3IgKmVycikKK3sKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnRfZXJyKGVycik7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCisvKioKKyAqIHFvYmplY3RfdG9fcWVycm9yKCk6IENvbnZlcnQgYSBRT2JqZWN0IGludG8gYSBRRXJyb3IKKyAqLworc3RhdGljIFFFcnJvciAqcW9iamVjdF90b19xZXJyb3IoY29uc3QgUU9iamVjdCAqb2JqKQoreworICAgIGlmIChxb2JqZWN0X3R5cGUob2JqKSAhPSBRVFlQRV9RRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIFFFcnJvciwgYmFzZSk7Cit9CisKKy8qKgorICogcWVycm9yX2Rlc3Ryb3lfb2JqKCk6IEZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYSBRRXJyb3IKKyAqLworc3RhdGljIHZvaWQgcWVycm9yX2Rlc3Ryb3lfb2JqKFFPYmplY3QgKm9iaikKK3sKKyAgICBRRXJyb3IgKnFlcnI7CisKKyAgICBhc3NlcnQob2JqICE9IE5VTEwpOworICAgIHFlcnIgPSBxb2JqZWN0X3RvX3FlcnJvcihvYmopOworCisgICAgZ19mcmVlKHFlcnItPmVycl9tc2cpOworICAgIGdfZnJlZShxZXJyKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xZmxvYXQuYyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xZmxvYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUwOTkyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FmbG9hdC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBRRmxvYXQgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaW5jbHVkZSAicWFwaS9xbXAvcWZsb2F0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHFmbG9hdF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopOworCitzdGF0aWMgY29uc3QgUVR5cGUgcWZsb2F0X3R5cGUgPSB7CisgICAgLmNvZGUgPSBRVFlQRV9RRkxPQVQsCisgICAgLmRlc3Ryb3kgPSBxZmxvYXRfZGVzdHJveV9vYmosCit9OworCisvKioKKyAqIHFmbG9hdF9mcm9tX2ludCgpOiBDcmVhdGUgYSBuZXcgUUZsb2F0IGZyb20gYSBmbG9hdAorICoKKyAqIFJldHVybiBzdHJvbmcgcmVmZXJlbmNlLgorICovCitRRmxvYXQgKnFmbG9hdF9mcm9tX2RvdWJsZShkb3VibGUgdmFsdWUpCit7CisgICAgUUZsb2F0ICpxZjsKKworICAgIHFmID0gZ19tYWxsb2Moc2l6ZW9mKCpxZikpOworICAgIHFmLT52YWx1ZSA9IHZhbHVlOworICAgIFFPQkpFQ1RfSU5JVChxZiwgJnFmbG9hdF90eXBlKTsKKworICAgIHJldHVybiBxZjsKK30KKworLyoqCisgKiBxZmxvYXRfZ2V0X2RvdWJsZSgpOiBHZXQgdGhlIHN0b3JlZCBmbG9hdAorICovCitkb3VibGUgcWZsb2F0X2dldF9kb3VibGUoY29uc3QgUUZsb2F0ICpxZikKK3sKKyAgICByZXR1cm4gcWYtPnZhbHVlOworfQorCisvKioKKyAqIHFvYmplY3RfdG9fcWZsb2F0KCk6IENvbnZlcnQgYSBRT2JqZWN0IGludG8gYSBRRmxvYXQKKyAqLworUUZsb2F0ICpxb2JqZWN0X3RvX3FmbG9hdChjb25zdCBRT2JqZWN0ICpvYmopCit7CisgICAgaWYgKHFvYmplY3RfdHlwZShvYmopICE9IFFUWVBFX1FGTE9BVCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY29udGFpbmVyX29mKG9iaiwgUUZsb2F0LCBiYXNlKTsKK30KKworLyoqCisgKiBxZmxvYXRfZGVzdHJveV9vYmooKTogRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBhCisgKiBRRmxvYXQgb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHFmbG9hdF9kZXN0cm95X29iaihRT2JqZWN0ICpvYmopCit7CisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBnX2ZyZWUocW9iamVjdF90b19xZmxvYXQob2JqKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWludC5jIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI5YjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FpbnQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogUUludCBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICBMdWl6IENhcGl0dWxpbm8gPGxjYXBpdHVsaW5vQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlICJxYXBpL3FtcC9xaW50LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKK3N0YXRpYyB2b2lkIHFpbnRfZGVzdHJveV9vYmooUU9iamVjdCAqb2JqKTsKKworc3RhdGljIGNvbnN0IFFUeXBlIHFpbnRfdHlwZSA9IHsKKyAgICAuY29kZSA9IFFUWVBFX1FJTlQsCisgICAgLmRlc3Ryb3kgPSBxaW50X2Rlc3Ryb3lfb2JqLAorfTsKKworLyoqCisgKiBxaW50X2Zyb21faW50KCk6IENyZWF0ZSBhIG5ldyBRSW50IGZyb20gYW4gaW50NjRfdAorICoKKyAqIFJldHVybiBzdHJvbmcgcmVmZXJlbmNlLgorICovCitRSW50ICpxaW50X2Zyb21faW50KGludDY0X3QgdmFsdWUpCit7CisgICAgUUludCAqcWk7CisKKyAgICBxaSA9IGdfbWFsbG9jKHNpemVvZigqcWkpKTsKKyAgICBxaS0+dmFsdWUgPSB2YWx1ZTsKKyAgICBRT0JKRUNUX0lOSVQocWksICZxaW50X3R5cGUpOworCisgICAgcmV0dXJuIHFpOworfQorCisvKioKKyAqIHFpbnRfZ2V0X2ludCgpOiBHZXQgdGhlIHN0b3JlZCBpbnRlZ2VyCisgKi8KK2ludDY0X3QgcWludF9nZXRfaW50KGNvbnN0IFFJbnQgKnFpKQoreworICAgIHJldHVybiBxaS0+dmFsdWU7Cit9CisKKy8qKgorICogcW9iamVjdF90b19xaW50KCk6IENvbnZlcnQgYSBRT2JqZWN0IGludG8gYSBRSW50CisgKi8KK1FJbnQgKnFvYmplY3RfdG9fcWludChjb25zdCBRT2JqZWN0ICpvYmopCit7CisgICAgaWYgKHFvYmplY3RfdHlwZShvYmopICE9IFFUWVBFX1FJTlQpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIFFJbnQsIGJhc2UpOworfQorCisvKioKKyAqIHFpbnRfZGVzdHJveV9vYmooKTogRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSBhCisgKiBRSW50IG9iamVjdAorICovCitzdGF0aWMgdm9pZCBxaW50X2Rlc3Ryb3lfb2JqKFFPYmplY3QgKm9iaikKK3sKKyAgICBhc3NlcnQob2JqICE9IE5VTEwpOworICAgIGdfZnJlZShxb2JqZWN0X3RvX3FpbnQob2JqKSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWpzb24uYyBiL2FuZHJvaWQvcWVtdTEvcW9iamVjdC9xanNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWY0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWpzb24uYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIFFPYmplY3QgSlNPTiBpbnRlZ3JhdGlvbgorICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMDkKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgInFhcGkvcW1wL2pzb24tbGV4ZXIuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9qc29uLXBhcnNlci5oIgorI2luY2x1ZGUgInFhcGkvcW1wL2pzb24tc3RyZWFtZXIuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xanNvbi5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FpbnQuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3Fib29sLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWZsb2F0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSlNPTlBhcnNpbmdTdGF0ZQoreworICAgIEpTT05NZXNzYWdlUGFyc2VyIHBhcnNlcjsKKyAgICB2YV9saXN0ICphcDsKKyAgICBRT2JqZWN0ICpyZXN1bHQ7Cit9IEpTT05QYXJzaW5nU3RhdGU7CisKK3N0YXRpYyB2b2lkIHBhcnNlX2pzb24oSlNPTk1lc3NhZ2VQYXJzZXIgKnBhcnNlciwgUUxpc3QgKnRva2VucykKK3sKKyAgICBKU09OUGFyc2luZ1N0YXRlICpzID0gY29udGFpbmVyX29mKHBhcnNlciwgSlNPTlBhcnNpbmdTdGF0ZSwgcGFyc2VyKTsKKyAgICBzLT5yZXN1bHQgPSBqc29uX3BhcnNlcl9wYXJzZSh0b2tlbnMsIHMtPmFwKTsKK30KKworUU9iamVjdCAqcW9iamVjdF9mcm9tX2pzb252KGNvbnN0IGNoYXIgKnN0cmluZywgdmFfbGlzdCAqYXApCit7CisgICAgSlNPTlBhcnNpbmdTdGF0ZSBzdGF0ZSA9IHt9OworCisgICAgc3RhdGUuYXAgPSBhcDsKKworICAgIGpzb25fbWVzc2FnZV9wYXJzZXJfaW5pdCgmc3RhdGUucGFyc2VyLCBwYXJzZV9qc29uKTsKKyAgICBqc29uX21lc3NhZ2VfcGFyc2VyX2ZlZWQoJnN0YXRlLnBhcnNlciwgc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7CisgICAganNvbl9tZXNzYWdlX3BhcnNlcl9mbHVzaCgmc3RhdGUucGFyc2VyKTsKKyAgICBqc29uX21lc3NhZ2VfcGFyc2VyX2Rlc3Ryb3koJnN0YXRlLnBhcnNlcik7CisKKyAgICByZXR1cm4gc3RhdGUucmVzdWx0OworfQorCitRT2JqZWN0ICpxb2JqZWN0X2Zyb21fanNvbihjb25zdCBjaGFyICpzdHJpbmcpCit7CisgICAgcmV0dXJuIHFvYmplY3RfZnJvbV9qc29udihzdHJpbmcsIE5VTEwpOworfQorCisvKgorICogSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIGFib3J0cyBvbiBlcnJvciwgdGh1cyBpdCBtdXN0IG5vdAorICogYmUgdXNlZCB3aXRoIHVudHJ1c3RlZCBhcmd1bWVudHMuCisgKi8KK1FPYmplY3QgKnFvYmplY3RfZnJvbV9qc29uZihjb25zdCBjaGFyICpzdHJpbmcsIC4uLikKK3sKKyAgICBRT2JqZWN0ICpvYmo7CisgICAgdmFfbGlzdCBhcDsKKworICAgIHZhX3N0YXJ0KGFwLCBzdHJpbmcpOworICAgIG9iaiA9IHFvYmplY3RfZnJvbV9qc29udihzdHJpbmcsICZhcCk7CisgICAgdmFfZW5kKGFwKTsKKworICAgIGFzc2VydChvYmogIT0gTlVMTCk7CisgICAgcmV0dXJuIG9iajsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVG9Kc29uSXRlclN0YXRlCit7CisgICAgaW50IGluZGVudDsKKyAgICBpbnQgcHJldHR5OworICAgIGludCBjb3VudDsKKyAgICBRU3RyaW5nICpzdHI7Cit9IFRvSnNvbkl0ZXJTdGF0ZTsKKworc3RhdGljIHZvaWQgdG9fanNvbihjb25zdCBRT2JqZWN0ICpvYmosIFFTdHJpbmcgKnN0ciwgaW50IHByZXR0eSwgaW50IGluZGVudCk7CisKK3N0YXRpYyB2b2lkIHRvX2pzb25fZGljdF9pdGVyKGNvbnN0IGNoYXIgKmtleSwgUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpCit7CisgICAgVG9Kc29uSXRlclN0YXRlICpzID0gb3BhcXVlOworICAgIFFTdHJpbmcgKnFrZXk7CisgICAgaW50IGo7CisKKyAgICBpZiAocy0+Y291bnQpCisgICAgICAgIHFzdHJpbmdfYXBwZW5kKHMtPnN0ciwgIiwgIik7CisKKyAgICBpZiAocy0+cHJldHR5KSB7CisgICAgICAgIHFzdHJpbmdfYXBwZW5kKHMtPnN0ciwgIlxuIik7CisgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgcy0+aW5kZW50IDsgaisrKQorICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQocy0+c3RyLCAiICAgICIpOworICAgIH0KKworICAgIHFrZXkgPSBxc3RyaW5nX2Zyb21fc3RyKGtleSk7CisgICAgdG9fanNvbihRT0JKRUNUKHFrZXkpLCBzLT5zdHIsIHMtPnByZXR0eSwgcy0+aW5kZW50KTsKKyAgICBRREVDUkVGKHFrZXkpOworCisgICAgcXN0cmluZ19hcHBlbmQocy0+c3RyLCAiOiAiKTsKKyAgICB0b19qc29uKG9iaiwgcy0+c3RyLCBzLT5wcmV0dHksIHMtPmluZGVudCk7CisgICAgcy0+Y291bnQrKzsKK30KKworc3RhdGljIHZvaWQgdG9fanNvbl9saXN0X2l0ZXIoUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpCit7CisgICAgVG9Kc29uSXRlclN0YXRlICpzID0gb3BhcXVlOworICAgIGludCBqOworCisgICAgaWYgKHMtPmNvdW50KQorICAgICAgICBxc3RyaW5nX2FwcGVuZChzLT5zdHIsICIsICIpOworCisgICAgaWYgKHMtPnByZXR0eSkgeworICAgICAgICBxc3RyaW5nX2FwcGVuZChzLT5zdHIsICJcbiIpOworICAgICAgICBmb3IgKGogPSAwIDsgaiA8IHMtPmluZGVudCA7IGorKykKKyAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHMtPnN0ciwgIiAgICAiKTsKKyAgICB9CisKKyAgICB0b19qc29uKG9iaiwgcy0+c3RyLCBzLT5wcmV0dHksIHMtPmluZGVudCk7CisgICAgcy0+Y291bnQrKzsKK30KKworc3RhdGljIHZvaWQgdG9fanNvbihjb25zdCBRT2JqZWN0ICpvYmosIFFTdHJpbmcgKnN0ciwgaW50IHByZXR0eSwgaW50IGluZGVudCkKK3sKKyAgICBzd2l0Y2ggKHFvYmplY3RfdHlwZShvYmopKSB7CisgICAgY2FzZSBRVFlQRV9RSU5UOiB7CisgICAgICAgIFFJbnQgKnZhbCA9IHFvYmplY3RfdG9fcWludChvYmopOworICAgICAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJSIgUFJJZDY0LCBxaW50X2dldF9pbnQodmFsKSk7CisgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgYnVmZmVyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUVRZUEVfUVNUUklORzogeworICAgICAgICBRU3RyaW5nICp2YWwgPSBxb2JqZWN0X3RvX3FzdHJpbmcob2JqKTsKKyAgICAgICAgY29uc3QgY2hhciAqcHRyOworICAgICAgICBpbnQgY3A7CisgICAgICAgIGNoYXIgYnVmWzE2XTsKKyAgICAgICAgY2hhciAqZW5kOworCisgICAgICAgIHB0ciA9IHFzdHJpbmdfZ2V0X3N0cih2YWwpOworICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcIiIpOworCisgICAgICAgIGZvciAoOyAqcHRyOyBwdHIgPSBlbmQpIHsKKyAgICAgICAgICAgIGNwID0gbW9kX3V0ZjhfY29kZXBvaW50KHB0ciwgNiwgJmVuZCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNwKSB7CisgICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiXFxcIiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIlxcXFwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcXGIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcXGYiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcXHIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcXHQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKGNwIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBjcCA9IDB4RkZGRDsgLyogcmVwbGFjZW1lbnQgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjcCA+IDB4RkZGRikgeworICAgICAgICAgICAgICAgICAgICAvKiBiZXlvbmQgQk1QOyBuZWVkIGEgc3Vycm9nYXRlIHBhaXIgKi8KKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlxcdSUwNFhcXHUlMDRYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEODAwICsgKChjcCAtIDB4MTAwMDApID4+IDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhEQzAwICsgKChjcCAtIDB4MTAwMDApICYgMHgzRkYpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNwIDwgMHgyMCB8fCBjcCA+PSAweDdGKSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcXHUlMDRYIiwgY3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IGNwOworICAgICAgICAgICAgICAgICAgICBidWZbMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsIGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiXCIiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUVRZUEVfUURJQ1Q6IHsKKyAgICAgICAgVG9Kc29uSXRlclN0YXRlIHM7CisgICAgICAgIFFEaWN0ICp2YWwgPSBxb2JqZWN0X3RvX3FkaWN0KG9iaik7CisKKyAgICAgICAgcy5jb3VudCA9IDA7CisgICAgICAgIHMuc3RyID0gc3RyOworICAgICAgICBzLmluZGVudCA9IGluZGVudCArIDE7CisgICAgICAgIHMucHJldHR5ID0gcHJldHR5OworICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJ7Iik7CisgICAgICAgIHFkaWN0X2l0ZXIodmFsLCB0b19qc29uX2RpY3RfaXRlciwgJnMpOworICAgICAgICBpZiAocHJldHR5KSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIlxuIik7CisgICAgICAgICAgICBmb3IgKGogPSAwIDsgaiA8IGluZGVudCA7IGorKykKKyAgICAgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICIgICAgIik7CisgICAgICAgIH0KKyAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAifSIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBRVFlQRV9RTElTVDogeworICAgICAgICBUb0pzb25JdGVyU3RhdGUgczsKKyAgICAgICAgUUxpc3QgKnZhbCA9IHFvYmplY3RfdG9fcWxpc3Qob2JqKTsKKworICAgICAgICBzLmNvdW50ID0gMDsKKyAgICAgICAgcy5zdHIgPSBzdHI7CisgICAgICAgIHMuaW5kZW50ID0gaW5kZW50ICsgMTsKKyAgICAgICAgcy5wcmV0dHkgPSBwcmV0dHk7CisgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIlsiKTsKKyAgICAgICAgcWxpc3RfaXRlcih2YWwsICh2b2lkICopdG9fanNvbl9saXN0X2l0ZXIsICZzKTsKKyAgICAgICAgaWYgKHByZXR0eSkgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBxc3RyaW5nX2FwcGVuZChzdHIsICJcbiIpOworICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBpbmRlbnQgOyBqKyspCisgICAgICAgICAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCAiICAgICIpOworICAgICAgICB9CisgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgIl0iKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUVRZUEVfUUZMT0FUOiB7CisgICAgICAgIFFGbG9hdCAqdmFsID0gcW9iamVjdF90b19xZmxvYXQob2JqKTsKKyAgICAgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVmIiwgcWZsb2F0X2dldF9kb3VibGUodmFsKSk7CisgICAgICAgIHdoaWxlIChsZW4gPiAwICYmIGJ1ZmZlcltsZW4gLSAxXSA9PSAnMCcpIHsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxlbiAmJiBidWZmZXJbbGVuIC0gMV0gPT0gJy4nKSB7CisgICAgICAgICAgICBidWZmZXJbbGVuIC0gMV0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgcXN0cmluZ19hcHBlbmQoc3RyLCBidWZmZXIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBRVFlQRV9RQk9PTDogeworICAgICAgICBRQm9vbCAqdmFsID0gcW9iamVjdF90b19xYm9vbChvYmopOworCisgICAgICAgIGlmIChxYm9vbF9nZXRfaW50KHZhbCkpIHsKKyAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgInRydWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFzdHJpbmdfYXBwZW5kKHN0ciwgImZhbHNlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUVRZUEVfUUVSUk9SOgorICAgICAgICAvKiBYWFg6IHNob3VsZCBRRXJyb3IgYmUgZW1pdHRlZD8gKi8KKyAgICBjYXNlIFFUWVBFX05PTkU6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUVRZUEVfTUFYOgorICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworUVN0cmluZyAqcW9iamVjdF90b19qc29uKGNvbnN0IFFPYmplY3QgKm9iaikKK3sKKyAgICBRU3RyaW5nICpzdHIgPSBxc3RyaW5nX25ldygpOworCisgICAgdG9fanNvbihvYmosIHN0ciwgMCwgMCk7CisKKyAgICByZXR1cm4gc3RyOworfQorCitRU3RyaW5nICpxb2JqZWN0X3RvX2pzb25fcHJldHR5KGNvbnN0IFFPYmplY3QgKm9iaikKK3sKKyAgICBRU3RyaW5nICpzdHIgPSBxc3RyaW5nX25ldygpOworCisgICAgdG9fanNvbihvYmosIHN0ciwgMSwgMCk7CisKKyAgICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FsaXN0LmMgYi9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mjc0ODZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FsaXN0LmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBRTGlzdCBNb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICBMdWl6IENhcGl0dWxpbm8gPGxjYXBpdHVsaW5vQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlICJxYXBpL3FtcC9xbGlzdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FvYmplY3QuaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKworc3RhdGljIHZvaWQgcWxpc3RfZGVzdHJveV9vYmooUU9iamVjdCAqb2JqKTsKKworc3RhdGljIGNvbnN0IFFUeXBlIHFsaXN0X3R5cGUgPSB7CisgICAgLmNvZGUgPSBRVFlQRV9RTElTVCwKKyAgICAuZGVzdHJveSA9IHFsaXN0X2Rlc3Ryb3lfb2JqLAorfTsKKworLyoqCisgKiBxbGlzdF9uZXcoKTogQ3JlYXRlIGEgbmV3IFFMaXN0CisgKgorICogUmV0dXJuIHN0cm9uZyByZWZlcmVuY2UuCisgKi8KK1FMaXN0ICpxbGlzdF9uZXcodm9pZCkKK3sKKyAgICBRTGlzdCAqcWxpc3Q7CisKKyAgICBxbGlzdCA9IGdfbWFsbG9jKHNpemVvZigqcWxpc3QpKTsKKyAgICBRVEFJTFFfSU5JVCgmcWxpc3QtPmhlYWQpOworICAgIFFPQkpFQ1RfSU5JVChxbGlzdCwgJnFsaXN0X3R5cGUpOworCisgICAgcmV0dXJuIHFsaXN0OworfQorCitzdGF0aWMgdm9pZCBxbGlzdF9jb3B5X2VsZW0oUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpCit7CisgICAgUUxpc3QgKmRzdCA9IG9wYXF1ZTsKKworICAgIHFvYmplY3RfaW5jcmVmKG9iaik7CisgICAgcWxpc3RfYXBwZW5kX29iaihkc3QsIG9iaik7Cit9CisKK1FMaXN0ICpxbGlzdF9jb3B5KFFMaXN0ICpzcmMpCit7CisgICAgUUxpc3QgKmRzdCA9IHFsaXN0X25ldygpOworCisgICAgcWxpc3RfaXRlcihzcmMsIHFsaXN0X2NvcHlfZWxlbSwgZHN0KTsKKworICAgIHJldHVybiBkc3Q7Cit9CisKKy8qKgorICogcWxpc3RfYXBwZW5kX29iaigpOiBBcHBlbmQgYW4gUU9iamVjdCBpbnRvIFFMaXN0CisgKgorICogTk9URTogb3duZXJzaGlwIG9mICd2YWx1ZScgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIFFMaXN0CisgKi8KK3ZvaWQgcWxpc3RfYXBwZW5kX29iaihRTGlzdCAqcWxpc3QsIFFPYmplY3QgKnZhbHVlKQoreworICAgIFFMaXN0RW50cnkgKmVudHJ5OworCisgICAgZW50cnkgPSBnX21hbGxvYyhzaXplb2YoKmVudHJ5KSk7CisgICAgZW50cnktPnZhbHVlID0gdmFsdWU7CisKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJnFsaXN0LT5oZWFkLCBlbnRyeSwgbmV4dCk7Cit9CisKKy8qKgorICogcWxpc3RfaXRlcigpOiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBsaXN0J3Mgc3RvcmVkIHZhbHVlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgdXNlciB0byBwcm92aWRlIGFuIGl0ZXJhdG9yLCB3aGljaCB3aWxsIGJlCisgKiBjYWxsZWQgZm9yIGVhY2ggc3RvcmVkIHZhbHVlIGluIHRoZSBsaXN0LgorICovCit2b2lkIHFsaXN0X2l0ZXIoY29uc3QgUUxpc3QgKnFsaXN0LAorICAgICAgICAgICAgICAgIHZvaWQgKCppdGVyKShRT2JqZWN0ICpvYmosIHZvaWQgKm9wYXF1ZSksIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRTGlzdEVudHJ5ICplbnRyeTsKKworICAgIFFUQUlMUV9GT1JFQUNIKGVudHJ5LCAmcWxpc3QtPmhlYWQsIG5leHQpCisgICAgICAgIGl0ZXIoZW50cnktPnZhbHVlLCBvcGFxdWUpOworfQorCitRT2JqZWN0ICpxbGlzdF9wb3AoUUxpc3QgKnFsaXN0KQoreworICAgIFFMaXN0RW50cnkgKmVudHJ5OworICAgIFFPYmplY3QgKnJldDsKKworICAgIGlmIChxbGlzdCA9PSBOVUxMIHx8IFFUQUlMUV9FTVBUWSgmcWxpc3QtPmhlYWQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVudHJ5ID0gUVRBSUxRX0ZJUlNUKCZxbGlzdC0+aGVhZCk7CisgICAgUVRBSUxRX1JFTU9WRSgmcWxpc3QtPmhlYWQsIGVudHJ5LCBuZXh0KTsKKworICAgIHJldCA9IGVudHJ5LT52YWx1ZTsKKyAgICBnX2ZyZWUoZW50cnkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworUU9iamVjdCAqcWxpc3RfcGVlayhRTGlzdCAqcWxpc3QpCit7CisgICAgUUxpc3RFbnRyeSAqZW50cnk7CisgICAgUU9iamVjdCAqcmV0OworCisgICAgaWYgKHFsaXN0ID09IE5VTEwgfHwgUVRBSUxRX0VNUFRZKCZxbGlzdC0+aGVhZCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZW50cnkgPSBRVEFJTFFfRklSU1QoJnFsaXN0LT5oZWFkKTsKKworICAgIHJldCA9IGVudHJ5LT52YWx1ZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBxbGlzdF9lbXB0eShjb25zdCBRTGlzdCAqcWxpc3QpCit7CisgICAgcmV0dXJuIFFUQUlMUV9FTVBUWSgmcWxpc3QtPmhlYWQpOworfQorCitzdGF0aWMgdm9pZCBxbGlzdF9zaXplX2l0ZXIoUU9iamVjdCAqb2JqLCB2b2lkICpvcGFxdWUpCit7CisgICAgc2l6ZV90ICpjb3VudCA9IG9wYXF1ZTsKKyAgICAoKmNvdW50KSsrOworfQorCitzaXplX3QgcWxpc3Rfc2l6ZShjb25zdCBRTGlzdCAqcWxpc3QpCit7CisgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICBxbGlzdF9pdGVyKHFsaXN0LCBxbGlzdF9zaXplX2l0ZXIsICZjb3VudCk7CisgICAgcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIHFvYmplY3RfdG9fcWxpc3QoKTogQ29udmVydCBhIFFPYmplY3QgaW50byBhIFFMaXN0CisgKi8KK1FMaXN0ICpxb2JqZWN0X3RvX3FsaXN0KGNvbnN0IFFPYmplY3QgKm9iaikKK3sKKyAgICBpZiAocW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUUxJU1QpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihvYmosIFFMaXN0LCBiYXNlKTsKK30KKworLyoqCisgKiBxbGlzdF9kZXN0cm95X29iaigpOiBGcmVlIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSBhIFFMaXN0CisgKi8KK3N0YXRpYyB2b2lkIHFsaXN0X2Rlc3Ryb3lfb2JqKFFPYmplY3QgKm9iaikKK3sKKyAgICBRTGlzdCAqcWxpc3Q7CisgICAgUUxpc3RFbnRyeSAqZW50cnksICpuZXh0X2VudHJ5OworCisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBxbGlzdCA9IHFvYmplY3RfdG9fcWxpc3Qob2JqKTsKKworICAgIFFUQUlMUV9GT1JFQUNIX1NBRkUoZW50cnksICZxbGlzdC0+aGVhZCwgbmV4dCwgbmV4dF9lbnRyeSkgeworICAgICAgICBRVEFJTFFfUkVNT1ZFKCZxbGlzdC0+aGVhZCwgZW50cnksIG5leHQpOworICAgICAgICBxb2JqZWN0X2RlY3JlZihlbnRyeS0+dmFsdWUpOworICAgICAgICBnX2ZyZWUoZW50cnkpOworICAgIH0KKworICAgIGdfZnJlZShxbGlzdCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvYmplY3QvcXN0cmluZy5jIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FzdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdiN2ExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb2JqZWN0L3FzdHJpbmcuYwpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIFFTdHJpbmcgTW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTHVpeiBDYXBpdHVsaW5vIDxsY2FwaXR1bGlub0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCitzdGF0aWMgdm9pZCBxc3RyaW5nX2Rlc3Ryb3lfb2JqKFFPYmplY3QgKm9iaik7CisKK3N0YXRpYyBjb25zdCBRVHlwZSBxc3RyaW5nX3R5cGUgPSB7CisgICAgLmNvZGUgPSBRVFlQRV9RU1RSSU5HLAorICAgIC5kZXN0cm95ID0gcXN0cmluZ19kZXN0cm95X29iaiwKK307CisKKy8qKgorICogcXN0cmluZ19uZXcoKTogQ3JlYXRlIGEgbmV3IGVtcHR5IFFTdHJpbmcKKyAqCisgKiBSZXR1cm4gc3Ryb25nIHJlZmVyZW5jZS4KKyAqLworUVN0cmluZyAqcXN0cmluZ19uZXcodm9pZCkKK3sKKyAgICByZXR1cm4gcXN0cmluZ19mcm9tX3N0cigiIik7Cit9CisKKy8qKgorICogcXN0cmluZ19nZXRfbGVuZ3RoKCk6IEdldCB0aGUgbGVuZ3RoIG9mIGEgUVN0cmluZworICovCitzaXplX3QgcXN0cmluZ19nZXRfbGVuZ3RoKGNvbnN0IFFTdHJpbmcgKnFzdHJpbmcpCit7CisgICAgcmV0dXJuIHFzdHJpbmctPmxlbmd0aDsKK30KKworLyoqCisgKiBxc3RyaW5nX2Zyb21fc3Vic3RyKCk6IENyZWF0ZSBhIG5ldyBRU3RyaW5nIGZyb20gYSBDIHN0cmluZyBzdWJzdHJpbmcKKyAqCisgKiBSZXR1cm4gc3RyaW5nIHJlZmVyZW5jZQorICovCitRU3RyaW5nICpxc3RyaW5nX2Zyb21fc3Vic3RyKGNvbnN0IGNoYXIgKnN0ciwgaW50IHN0YXJ0LCBpbnQgZW5kKQoreworICAgIFFTdHJpbmcgKnFzdHJpbmc7CisKKyAgICBxc3RyaW5nID0gZ19tYWxsb2Moc2l6ZW9mKCpxc3RyaW5nKSk7CisKKyAgICBxc3RyaW5nLT5sZW5ndGggPSBlbmQgLSBzdGFydCArIDE7CisgICAgcXN0cmluZy0+Y2FwYWNpdHkgPSBxc3RyaW5nLT5sZW5ndGg7CisKKyAgICBxc3RyaW5nLT5zdHJpbmcgPSBnX21hbGxvYyhxc3RyaW5nLT5jYXBhY2l0eSArIDEpOworICAgIG1lbWNweShxc3RyaW5nLT5zdHJpbmcsIHN0ciArIHN0YXJ0LCBxc3RyaW5nLT5sZW5ndGgpOworICAgIHFzdHJpbmctPnN0cmluZ1txc3RyaW5nLT5sZW5ndGhdID0gMDsKKworICAgIFFPQkpFQ1RfSU5JVChxc3RyaW5nLCAmcXN0cmluZ190eXBlKTsKKworICAgIHJldHVybiBxc3RyaW5nOworfQorCisvKioKKyAqIHFzdHJpbmdfZnJvbV9zdHIoKTogQ3JlYXRlIGEgbmV3IFFTdHJpbmcgZnJvbSBhIHJlZ3VsYXIgQyBzdHJpbmcKKyAqCisgKiBSZXR1cm4gc3Ryb25nIHJlZmVyZW5jZS4KKyAqLworUVN0cmluZyAqcXN0cmluZ19mcm9tX3N0cihjb25zdCBjaGFyICpzdHIpCit7CisgICAgcmV0dXJuIHFzdHJpbmdfZnJvbV9zdWJzdHIoc3RyLCAwLCBzdHJsZW4oc3RyKSAtIDEpOworfQorCitzdGF0aWMgdm9pZCBjYXBhY2l0eV9pbmNyZWFzZShRU3RyaW5nICpxc3RyaW5nLCBzaXplX3QgbGVuKQoreworICAgIGlmIChxc3RyaW5nLT5jYXBhY2l0eSA8IChxc3RyaW5nLT5sZW5ndGggKyBsZW4pKSB7CisgICAgICAgIHFzdHJpbmctPmNhcGFjaXR5ICs9IGxlbjsKKyAgICAgICAgcXN0cmluZy0+Y2FwYWNpdHkgKj0gMjsgLyogdXNlIGV4cG9uZW50aWFsIGdyb3d0aCAqLworCisgICAgICAgIHFzdHJpbmctPnN0cmluZyA9IGdfcmVhbGxvYyhxc3RyaW5nLT5zdHJpbmcsIHFzdHJpbmctPmNhcGFjaXR5ICsgMSk7CisgICAgfQorfQorCisvKiBxc3RyaW5nX2FwcGVuZCgpOiBBcHBlbmQgYSBDIHN0cmluZyB0byBhIFFTdHJpbmcKKyAqLwordm9pZCBxc3RyaW5nX2FwcGVuZChRU3RyaW5nICpxc3RyaW5nLCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHIpOworCisgICAgY2FwYWNpdHlfaW5jcmVhc2UocXN0cmluZywgbGVuKTsKKyAgICBtZW1jcHkocXN0cmluZy0+c3RyaW5nICsgcXN0cmluZy0+bGVuZ3RoLCBzdHIsIGxlbik7CisgICAgcXN0cmluZy0+bGVuZ3RoICs9IGxlbjsKKyAgICBxc3RyaW5nLT5zdHJpbmdbcXN0cmluZy0+bGVuZ3RoXSA9IDA7Cit9CisKK3ZvaWQgcXN0cmluZ19hcHBlbmRfaW50KFFTdHJpbmcgKnFzdHJpbmcsIGludDY0X3QgdmFsdWUpCit7CisgICAgY2hhciBudW1bMzJdOworCisgICAgc25wcmludGYobnVtLCBzaXplb2YobnVtKSwgIiUiIFBSSWQ2NCwgdmFsdWUpOworICAgIHFzdHJpbmdfYXBwZW5kKHFzdHJpbmcsIG51bSk7Cit9CisKKy8qKgorICogcXN0cmluZ19hcHBlbmRfY2hyKCk6IEFwcGVuZCBhIEMgY2hhciB0byBhIFFTdHJpbmcKKyAqLwordm9pZCBxc3RyaW5nX2FwcGVuZF9jaHIoUVN0cmluZyAqcXN0cmluZywgaW50IGMpCit7CisgICAgY2FwYWNpdHlfaW5jcmVhc2UocXN0cmluZywgMSk7CisgICAgcXN0cmluZy0+c3RyaW5nW3FzdHJpbmctPmxlbmd0aCsrXSA9IGM7CisgICAgcXN0cmluZy0+c3RyaW5nW3FzdHJpbmctPmxlbmd0aF0gPSAwOworfQorCisvKioKKyAqIHFvYmplY3RfdG9fcXN0cmluZygpOiBDb252ZXJ0IGEgUU9iamVjdCB0byBhIFFTdHJpbmcKKyAqLworUVN0cmluZyAqcW9iamVjdF90b19xc3RyaW5nKGNvbnN0IFFPYmplY3QgKm9iaikKK3sKKyAgICBpZiAocW9iamVjdF90eXBlKG9iaikgIT0gUVRZUEVfUVNUUklORykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY29udGFpbmVyX29mKG9iaiwgUVN0cmluZywgYmFzZSk7Cit9CisKKy8qKgorICogcXN0cmluZ19nZXRfc3RyKCk6IFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHN0b3JlZCBzdHJpbmcKKyAqCisgKiBOT1RFOiBTaG91bGQgYmUgdXNlZCB3aXRoIGNhdXRpb24sIGlmIHRoZSBvYmplY3QgaXMgZGVhbGxvY2F0ZWQKKyAqIHRoaXMgcG9pbnRlciBiZWNvbWVzIGludmFsaWQuCisgKi8KK2NvbnN0IGNoYXIgKnFzdHJpbmdfZ2V0X3N0cihjb25zdCBRU3RyaW5nICpxc3RyaW5nKQoreworICAgIHJldHVybiBxc3RyaW5nLT5zdHJpbmc7Cit9CisKKy8qKgorICogcXN0cmluZ19kZXN0cm95X29iaigpOiBGcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGEgUVN0cmluZworICogb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHFzdHJpbmdfZGVzdHJveV9vYmooUU9iamVjdCAqb2JqKQoreworICAgIFFTdHJpbmcgKnFzOworCisgICAgYXNzZXJ0KG9iaiAhPSBOVUxMKTsKKyAgICBxcyA9IHFvYmplY3RfdG9fcXN0cmluZyhvYmopOworICAgIGdfZnJlZShxcy0+c3RyaW5nKTsKKyAgICBnX2ZyZWUocXMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9xb20vY29udGFpbmVyLmMgYi9hbmRyb2lkL3FlbXUxL3FvbS9jb250YWluZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIxNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb20vY29udGFpbmVyLmMKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIERldmljZSBDb250YWluZXIKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDEyCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSAicW9tL29iamVjdC5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3N0YXRpYyBjb25zdCBUeXBlSW5mbyBjb250YWluZXJfaW5mbyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjb250YWluZXIiLAorICAgIC5pbnN0YW5jZV9zaXplID0gc2l6ZW9mKE9iamVjdCksCisgICAgLnBhcmVudCAgICAgICAgPSBUWVBFX09CSkVDVCwKK307CisKK3N0YXRpYyB2b2lkIGNvbnRhaW5lcl9yZWdpc3Rlcl90eXBlcyh2b2lkKQoreworICAgIHR5cGVfcmVnaXN0ZXJfc3RhdGljKCZjb250YWluZXJfaW5mbyk7Cit9CisKK09iamVjdCAqY29udGFpbmVyX2dldChPYmplY3QgKnJvb3QsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisgICAgT2JqZWN0ICpvYmosICpjaGlsZDsKKyAgICBnY2hhciAqKnBhcnRzOworICAgIGludCBpOworCisgICAgcGFydHMgPSBnX3N0cnNwbGl0KHBhdGgsICIvIiwgMCk7CisgICAgYXNzZXJ0KHBhcnRzICE9IE5VTEwgJiYgcGFydHNbMF0gIT0gTlVMTCAmJiAhcGFydHNbMF1bMF0pOworICAgIG9iaiA9IHJvb3Q7CisKKyAgICBmb3IgKGkgPSAxOyBwYXJ0c1tpXSAhPSBOVUxMOyBpKyssIG9iaiA9IGNoaWxkKSB7CisgICAgICAgIGNoaWxkID0gb2JqZWN0X3Jlc29sdmVfcGF0aF9jb21wb25lbnQob2JqLCBwYXJ0c1tpXSk7CisgICAgICAgIGlmICghY2hpbGQpIHsKKyAgICAgICAgICAgIGNoaWxkID0gb2JqZWN0X25ldygiY29udGFpbmVyIik7CisgICAgICAgICAgICBvYmplY3RfcHJvcGVydHlfYWRkX2NoaWxkKG9iaiwgcGFydHNbaV0sIGNoaWxkLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdfc3RyZnJlZXYocGFydHMpOworCisgICAgcmV0dXJuIG9iajsKK30KKworCit0eXBlX2luaXQoY29udGFpbmVyX3JlZ2lzdGVyX3R5cGVzKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9xb20vb2JqZWN0LmMgYi9hbmRyb2lkL3FlbXUxL3FvbS9vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNmZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb20vb2JqZWN0LmMKQEAgLTAsMCArMSwxNDMyIEBACisvKgorICogUUVNVSBPYmplY3QgTW9kZWwKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSAicW9tL29iamVjdC5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWFwaS92aXNpdG9yLmgiCisjaW5jbHVkZSAicWFwaS9zdHJpbmctaW5wdXQtdmlzaXRvci5oIgorI2luY2x1ZGUgInFhcGkvc3RyaW5nLW91dHB1dC12aXNpdG9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisjaW5jbHVkZSAidHJhY2UuaCIKKworLyogVE9ETzogcmVwbGFjZSBRT2JqZWN0IHdpdGggYSBzaW1wbGVyIHZpc2l0b3IgdG8gYXZvaWQgYSBkZXBlbmRlbmN5CisgKiBvZiB0aGUgUU9NIGNvcmUgb24gUU9iamVjdD8gICovCisjaW5jbHVkZSAicW9tL3FvbS1xb2JqZWN0LmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3Fib29sLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWludC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3FzdHJpbmcuaCIKKworI2RlZmluZSBNQVhfSU5URVJGQUNFUyAzMgorCit0eXBlZGVmIHN0cnVjdCBJbnRlcmZhY2VJbXBsIEludGVyZmFjZUltcGw7Cit0eXBlZGVmIHN0cnVjdCBUeXBlSW1wbCBUeXBlSW1wbDsKKworc3RydWN0IEludGVyZmFjZUltcGwKK3sKKyAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKK307CisKK3N0cnVjdCBUeXBlSW1wbAoreworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICBzaXplX3QgY2xhc3Nfc2l6ZTsKKworICAgIHNpemVfdCBpbnN0YW5jZV9zaXplOworCisgICAgdm9pZCAoKmNsYXNzX2luaXQpKE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqZGF0YSk7CisgICAgdm9pZCAoKmNsYXNzX2Jhc2VfaW5pdCkoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKTsKKyAgICB2b2lkICgqY2xhc3NfZmluYWxpemUpKE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqZGF0YSk7CisKKyAgICB2b2lkICpjbGFzc19kYXRhOworCisgICAgdm9pZCAoKmluc3RhbmNlX2luaXQpKE9iamVjdCAqb2JqKTsKKyAgICB2b2lkICgqaW5zdGFuY2VfcG9zdF9pbml0KShPYmplY3QgKm9iaik7CisgICAgdm9pZCAoKmluc3RhbmNlX2ZpbmFsaXplKShPYmplY3QgKm9iaik7CisKKyAgICBib29sIGFic3RyYWN0OworCisgICAgY29uc3QgY2hhciAqcGFyZW50OworICAgIFR5cGVJbXBsICpwYXJlbnRfdHlwZTsKKworICAgIE9iamVjdENsYXNzICpjbGFzczsKKworICAgIGludCBudW1faW50ZXJmYWNlczsKKyAgICBJbnRlcmZhY2VJbXBsIGludGVyZmFjZXNbTUFYX0lOVEVSRkFDRVNdOworfTsKKworc3RhdGljIFR5cGUgdHlwZV9pbnRlcmZhY2U7CisKK3N0YXRpYyBHSGFzaFRhYmxlICp0eXBlX3RhYmxlX2dldCh2b2lkKQoreworICAgIHN0YXRpYyBHSGFzaFRhYmxlICp0eXBlX3RhYmxlOworCisgICAgaWYgKHR5cGVfdGFibGUgPT0gTlVMTCkgeworICAgICAgICB0eXBlX3RhYmxlID0gZ19oYXNoX3RhYmxlX25ldyhnX3N0cl9oYXNoLCBnX3N0cl9lcXVhbCk7CisgICAgfQorCisgICAgcmV0dXJuIHR5cGVfdGFibGU7Cit9CisKK3N0YXRpYyB2b2lkIHR5cGVfdGFibGVfYWRkKFR5cGVJbXBsICp0aSkKK3sKKyAgICBnX2hhc2hfdGFibGVfaW5zZXJ0KHR5cGVfdGFibGVfZ2V0KCksICh2b2lkICopdGktPm5hbWUsIHRpKTsKK30KKworc3RhdGljIFR5cGVJbXBsICp0eXBlX3RhYmxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBnX2hhc2hfdGFibGVfbG9va3VwKHR5cGVfdGFibGVfZ2V0KCksIG5hbWUpOworfQorCitzdGF0aWMgVHlwZUltcGwgKnR5cGVfcmVnaXN0ZXJfaW50ZXJuYWwoY29uc3QgVHlwZUluZm8gKmluZm8pCit7CisgICAgVHlwZUltcGwgKnRpID0gZ19tYWxsb2MwKHNpemVvZigqdGkpKTsKKyAgICBpbnQgaTsKKworICAgIGdfYXNzZXJ0KGluZm8tPm5hbWUgIT0gTlVMTCk7CisKKyAgICBpZiAodHlwZV90YWJsZV9sb29rdXAoaW5mby0+bmFtZSkgIT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlZ2lzdGVyaW5nIGAlcycgd2hpY2ggYWxyZWFkeSBleGlzdHNcbiIsIGluZm8tPm5hbWUpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIHRpLT5uYW1lID0gZ19zdHJkdXAoaW5mby0+bmFtZSk7CisgICAgdGktPnBhcmVudCA9IGdfc3RyZHVwKGluZm8tPnBhcmVudCk7CisKKyAgICB0aS0+Y2xhc3Nfc2l6ZSA9IGluZm8tPmNsYXNzX3NpemU7CisgICAgdGktPmluc3RhbmNlX3NpemUgPSBpbmZvLT5pbnN0YW5jZV9zaXplOworCisgICAgdGktPmNsYXNzX2luaXQgPSBpbmZvLT5jbGFzc19pbml0OworICAgIHRpLT5jbGFzc19iYXNlX2luaXQgPSBpbmZvLT5jbGFzc19iYXNlX2luaXQ7CisgICAgdGktPmNsYXNzX2ZpbmFsaXplID0gaW5mby0+Y2xhc3NfZmluYWxpemU7CisgICAgdGktPmNsYXNzX2RhdGEgPSBpbmZvLT5jbGFzc19kYXRhOworCisgICAgdGktPmluc3RhbmNlX2luaXQgPSBpbmZvLT5pbnN0YW5jZV9pbml0OworICAgIHRpLT5pbnN0YW5jZV9wb3N0X2luaXQgPSBpbmZvLT5pbnN0YW5jZV9wb3N0X2luaXQ7CisgICAgdGktPmluc3RhbmNlX2ZpbmFsaXplID0gaW5mby0+aW5zdGFuY2VfZmluYWxpemU7CisKKyAgICB0aS0+YWJzdHJhY3QgPSBpbmZvLT5hYnN0cmFjdDsKKworICAgIGZvciAoaSA9IDA7IGluZm8tPmludGVyZmFjZXMgJiYgaW5mby0+aW50ZXJmYWNlc1tpXS50eXBlOyBpKyspIHsKKyAgICAgICAgdGktPmludGVyZmFjZXNbaV0udHlwZW5hbWUgPSBnX3N0cmR1cChpbmZvLT5pbnRlcmZhY2VzW2ldLnR5cGUpOworICAgIH0KKyAgICB0aS0+bnVtX2ludGVyZmFjZXMgPSBpOworCisgICAgdHlwZV90YWJsZV9hZGQodGkpOworCisgICAgcmV0dXJuIHRpOworfQorCitUeXBlSW1wbCAqdHlwZV9yZWdpc3Rlcihjb25zdCBUeXBlSW5mbyAqaW5mbykKK3sKKyAgICBhc3NlcnQoaW5mby0+cGFyZW50KTsKKyAgICByZXR1cm4gdHlwZV9yZWdpc3Rlcl9pbnRlcm5hbChpbmZvKTsKK30KKworVHlwZUltcGwgKnR5cGVfcmVnaXN0ZXJfc3RhdGljKGNvbnN0IFR5cGVJbmZvICppbmZvKQoreworICAgIHJldHVybiB0eXBlX3JlZ2lzdGVyKGluZm8pOworfQorCitzdGF0aWMgVHlwZUltcGwgKnR5cGVfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiB0eXBlX3RhYmxlX2xvb2t1cChuYW1lKTsKK30KKworc3RhdGljIFR5cGVJbXBsICp0eXBlX2dldF9wYXJlbnQoVHlwZUltcGwgKnR5cGUpCit7CisgICAgaWYgKCF0eXBlLT5wYXJlbnRfdHlwZSAmJiB0eXBlLT5wYXJlbnQpIHsKKyAgICAgICAgdHlwZS0+cGFyZW50X3R5cGUgPSB0eXBlX2dldF9ieV9uYW1lKHR5cGUtPnBhcmVudCk7CisgICAgICAgIGdfYXNzZXJ0KHR5cGUtPnBhcmVudF90eXBlICE9IE5VTEwpOworICAgIH0KKworICAgIHJldHVybiB0eXBlLT5wYXJlbnRfdHlwZTsKK30KKworc3RhdGljIGJvb2wgdHlwZV9oYXNfcGFyZW50KFR5cGVJbXBsICp0eXBlKQoreworICAgIHJldHVybiAodHlwZS0+cGFyZW50ICE9IE5VTEwpOworfQorCitzdGF0aWMgc2l6ZV90IHR5cGVfY2xhc3NfZ2V0X3NpemUoVHlwZUltcGwgKnRpKQoreworICAgIGlmICh0aS0+Y2xhc3Nfc2l6ZSkgeworICAgICAgICByZXR1cm4gdGktPmNsYXNzX3NpemU7CisgICAgfQorCisgICAgaWYgKHR5cGVfaGFzX3BhcmVudCh0aSkpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVfY2xhc3NfZ2V0X3NpemUodHlwZV9nZXRfcGFyZW50KHRpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemVvZihPYmplY3RDbGFzcyk7Cit9CisKK3N0YXRpYyBzaXplX3QgdHlwZV9vYmplY3RfZ2V0X3NpemUoVHlwZUltcGwgKnRpKQoreworICAgIGlmICh0aS0+aW5zdGFuY2Vfc2l6ZSkgeworICAgICAgICByZXR1cm4gdGktPmluc3RhbmNlX3NpemU7CisgICAgfQorCisgICAgaWYgKHR5cGVfaGFzX3BhcmVudCh0aSkpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVfb2JqZWN0X2dldF9zaXplKHR5cGVfZ2V0X3BhcmVudCh0aSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCB0eXBlX2lzX2FuY2VzdG9yKFR5cGVJbXBsICp0eXBlLCBUeXBlSW1wbCAqdGFyZ2V0X3R5cGUpCit7CisgICAgYXNzZXJ0KHRhcmdldF90eXBlKTsKKworICAgIC8qIENoZWNrIGlmIHR5cGVuYW1lIGlzIGEgZGlyZWN0IGFuY2VzdG9yIG9mIHR5cGUgKi8KKyAgICB3aGlsZSAodHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSB0YXJnZXRfdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB0eXBlID0gdHlwZV9nZXRfcGFyZW50KHR5cGUpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgdHlwZV9pbml0aWFsaXplKFR5cGVJbXBsICp0aSk7CisKK3N0YXRpYyB2b2lkIHR5cGVfaW5pdGlhbGl6ZV9pbnRlcmZhY2UoVHlwZUltcGwgKnRpLCBjb25zdCBjaGFyICpwYXJlbnQpCit7CisgICAgSW50ZXJmYWNlQ2xhc3MgKm5ld19pZmFjZTsKKyAgICBUeXBlSW5mbyBpbmZvID0geyB9OworICAgIFR5cGVJbXBsICppZmFjZV9pbXBsOworCisgICAgaW5mby5wYXJlbnQgPSBwYXJlbnQ7CisgICAgaW5mby5uYW1lID0gZ19zdHJkdXBfcHJpbnRmKCIlczo6JXMiLCB0aS0+bmFtZSwgaW5mby5wYXJlbnQpOworICAgIGluZm8uYWJzdHJhY3QgPSB0cnVlOworCisgICAgaWZhY2VfaW1wbCA9IHR5cGVfcmVnaXN0ZXIoJmluZm8pOworICAgIHR5cGVfaW5pdGlhbGl6ZShpZmFjZV9pbXBsKTsKKyAgICBnX2ZyZWUoKGNoYXIgKilpbmZvLm5hbWUpOworCisgICAgbmV3X2lmYWNlID0gKEludGVyZmFjZUNsYXNzICopaWZhY2VfaW1wbC0+Y2xhc3M7CisgICAgbmV3X2lmYWNlLT5jb25jcmV0ZV9jbGFzcyA9IHRpLT5jbGFzczsKKworICAgIHRpLT5jbGFzcy0+aW50ZXJmYWNlcyA9IGdfc2xpc3RfYXBwZW5kKHRpLT5jbGFzcy0+aW50ZXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFjZV9pbXBsLT5jbGFzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHR5cGVfaW5pdGlhbGl6ZShUeXBlSW1wbCAqdGkpCit7CisgICAgVHlwZUltcGwgKnBhcmVudDsKKworICAgIGlmICh0aS0+Y2xhc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRpLT5jbGFzc19zaXplID0gdHlwZV9jbGFzc19nZXRfc2l6ZSh0aSk7CisgICAgdGktPmluc3RhbmNlX3NpemUgPSB0eXBlX29iamVjdF9nZXRfc2l6ZSh0aSk7CisKKyAgICB0aS0+Y2xhc3MgPSBnX21hbGxvYzAodGktPmNsYXNzX3NpemUpOworCisgICAgcGFyZW50ID0gdHlwZV9nZXRfcGFyZW50KHRpKTsKKyAgICBpZiAocGFyZW50KSB7CisgICAgICAgIHR5cGVfaW5pdGlhbGl6ZShwYXJlbnQpOworICAgICAgICBHU0xpc3QgKmU7CisgICAgICAgIGludCBpOworCisgICAgICAgIGdfYXNzZXJ0KHBhcmVudC0+Y2xhc3Nfc2l6ZSA8PSB0aS0+Y2xhc3Nfc2l6ZSk7CisgICAgICAgIG1lbWNweSh0aS0+Y2xhc3MsIHBhcmVudC0+Y2xhc3MsIHBhcmVudC0+Y2xhc3Nfc2l6ZSk7CisgICAgICAgIHRpLT5jbGFzcy0+aW50ZXJmYWNlcyA9IE5VTEw7CisKKyAgICAgICAgZm9yIChlID0gcGFyZW50LT5jbGFzcy0+aW50ZXJmYWNlczsgZTsgZSA9IGUtPm5leHQpIHsKKyAgICAgICAgICAgIE9iamVjdENsYXNzICppZmFjZSA9IGUtPmRhdGE7CisgICAgICAgICAgICB0eXBlX2luaXRpYWxpemVfaW50ZXJmYWNlKHRpLCBvYmplY3RfY2xhc3NfZ2V0X25hbWUoaWZhY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aS0+bnVtX2ludGVyZmFjZXM7IGkrKykgeworICAgICAgICAgICAgVHlwZUltcGwgKnQgPSB0eXBlX2dldF9ieV9uYW1lKHRpLT5pbnRlcmZhY2VzW2ldLnR5cGVuYW1lKTsKKyAgICAgICAgICAgIGZvciAoZSA9IHRpLT5jbGFzcy0+aW50ZXJmYWNlczsgZTsgZSA9IGUtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBUeXBlSW1wbCAqdGFyZ2V0X3R5cGUgPSBPQkpFQ1RfQ0xBU1MoZS0+ZGF0YSktPnR5cGU7CisKKyAgICAgICAgICAgICAgICBpZiAodHlwZV9pc19hbmNlc3Rvcih0YXJnZXRfdHlwZSwgdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0eXBlX2luaXRpYWxpemVfaW50ZXJmYWNlKHRpLCB0aS0+aW50ZXJmYWNlc1tpXS50eXBlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aS0+Y2xhc3MtPnR5cGUgPSB0aTsKKworICAgIHdoaWxlIChwYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudC0+Y2xhc3NfYmFzZV9pbml0KSB7CisgICAgICAgICAgICBwYXJlbnQtPmNsYXNzX2Jhc2VfaW5pdCh0aS0+Y2xhc3MsIHRpLT5jbGFzc19kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQgPSB0eXBlX2dldF9wYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICBpZiAodGktPmNsYXNzX2luaXQpIHsKKyAgICAgICAgdGktPmNsYXNzX2luaXQodGktPmNsYXNzLCB0aS0+Y2xhc3NfZGF0YSk7CisgICAgfQorCisKK30KKworc3RhdGljIHZvaWQgb2JqZWN0X2luaXRfd2l0aF90eXBlKE9iamVjdCAqb2JqLCBUeXBlSW1wbCAqdGkpCit7CisgICAgaWYgKHR5cGVfaGFzX3BhcmVudCh0aSkpIHsKKyAgICAgICAgb2JqZWN0X2luaXRfd2l0aF90eXBlKG9iaiwgdHlwZV9nZXRfcGFyZW50KHRpKSk7CisgICAgfQorCisgICAgaWYgKHRpLT5pbnN0YW5jZV9pbml0KSB7CisgICAgICAgIHRpLT5pbnN0YW5jZV9pbml0KG9iaik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvYmplY3RfcG9zdF9pbml0X3dpdGhfdHlwZShPYmplY3QgKm9iaiwgVHlwZUltcGwgKnRpKQoreworICAgIGlmICh0aS0+aW5zdGFuY2VfcG9zdF9pbml0KSB7CisgICAgICAgIHRpLT5pbnN0YW5jZV9wb3N0X2luaXQob2JqKTsKKyAgICB9CisKKyAgICBpZiAodHlwZV9oYXNfcGFyZW50KHRpKSkgeworICAgICAgICBvYmplY3RfcG9zdF9pbml0X3dpdGhfdHlwZShvYmosIHR5cGVfZ2V0X3BhcmVudCh0aSkpOworICAgIH0KK30KKwordm9pZCBvYmplY3RfaW5pdGlhbGl6ZV93aXRoX3R5cGUodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIFR5cGVJbXBsICp0eXBlKQoreworICAgIE9iamVjdCAqb2JqID0gZGF0YTsKKworICAgIGdfYXNzZXJ0KHR5cGUgIT0gTlVMTCk7CisgICAgdHlwZV9pbml0aWFsaXplKHR5cGUpOworCisgICAgZ19hc3NlcnQodHlwZS0+aW5zdGFuY2Vfc2l6ZSA+PSBzaXplb2YoT2JqZWN0KSk7CisgICAgZ19hc3NlcnQodHlwZS0+YWJzdHJhY3QgPT0gZmFsc2UpOworICAgIGdfYXNzZXJ0KHNpemUgPj0gdHlwZS0+aW5zdGFuY2Vfc2l6ZSk7CisKKyAgICBtZW1zZXQob2JqLCAwLCB0eXBlLT5pbnN0YW5jZV9zaXplKTsKKyAgICBvYmotPmNsYXNzID0gdHlwZS0+Y2xhc3M7CisgICAgb2JqZWN0X3JlZihvYmopOworICAgIFFUQUlMUV9JTklUKCZvYmotPnByb3BlcnRpZXMpOworICAgIG9iamVjdF9pbml0X3dpdGhfdHlwZShvYmosIHR5cGUpOworICAgIG9iamVjdF9wb3N0X2luaXRfd2l0aF90eXBlKG9iaiwgdHlwZSk7Cit9CisKK3ZvaWQgb2JqZWN0X2luaXRpYWxpemUodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKnR5cGVuYW1lKQoreworICAgIFR5cGVJbXBsICp0eXBlID0gdHlwZV9nZXRfYnlfbmFtZSh0eXBlbmFtZSk7CisKKyAgICBvYmplY3RfaW5pdGlhbGl6ZV93aXRoX3R5cGUoZGF0YSwgc2l6ZSwgdHlwZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvYmplY3RfcHJvcGVydHlfaXNfY2hpbGQoT2JqZWN0UHJvcGVydHkgKnByb3ApCit7CisgICAgcmV0dXJuIHN0cnN0YXJ0KHByb3AtPnR5cGUsICJjaGlsZDwiLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBib29sIG9iamVjdF9wcm9wZXJ0eV9pc19saW5rKE9iamVjdFByb3BlcnR5ICpwcm9wKQoreworICAgIHJldHVybiBzdHJzdGFydChwcm9wLT50eXBlLCAibGluazwiLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgb2JqZWN0X3Byb3BlcnR5X2RlbF9hbGwoT2JqZWN0ICpvYmopCit7CisgICAgd2hpbGUgKCFRVEFJTFFfRU1QVFkoJm9iai0+cHJvcGVydGllcykpIHsKKyAgICAgICAgT2JqZWN0UHJvcGVydHkgKnByb3AgPSBRVEFJTFFfRklSU1QoJm9iai0+cHJvcGVydGllcyk7CisKKyAgICAgICAgUVRBSUxRX1JFTU9WRSgmb2JqLT5wcm9wZXJ0aWVzLCBwcm9wLCBub2RlKTsKKworICAgICAgICBpZiAocHJvcC0+cmVsZWFzZSkgeworICAgICAgICAgICAgcHJvcC0+cmVsZWFzZShvYmosIHByb3AtPm5hbWUsIHByb3AtPm9wYXF1ZSk7CisgICAgICAgIH0KKworICAgICAgICBnX2ZyZWUocHJvcC0+bmFtZSk7CisgICAgICAgIGdfZnJlZShwcm9wLT50eXBlKTsKKyAgICAgICAgZ19mcmVlKHByb3ApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb2JqZWN0X3Byb3BlcnR5X2RlbF9jaGlsZChPYmplY3QgKm9iaiwgT2JqZWN0ICpjaGlsZCwgRXJyb3IgKiplcnJwKQoreworICAgIE9iamVjdFByb3BlcnR5ICpwcm9wOworCisgICAgUVRBSUxRX0ZPUkVBQ0gocHJvcCwgJm9iai0+cHJvcGVydGllcywgbm9kZSkgeworICAgICAgICBpZiAob2JqZWN0X3Byb3BlcnR5X2lzX2NoaWxkKHByb3ApICYmIHByb3AtPm9wYXF1ZSA9PSBjaGlsZCkgeworICAgICAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2RlbChvYmosIHByb3AtPm5hbWUsIGVycnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgb2JqZWN0X3VucGFyZW50KE9iamVjdCAqb2JqKQoreworICAgIGlmICghb2JqLT5wYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9iamVjdF9yZWYob2JqKTsKKyAgICBpZiAob2JqLT5jbGFzcy0+dW5wYXJlbnQpIHsKKyAgICAgICAgKG9iai0+Y2xhc3MtPnVucGFyZW50KShvYmopOworICAgIH0KKyAgICBpZiAob2JqLT5wYXJlbnQpIHsKKyAgICAgICAgb2JqZWN0X3Byb3BlcnR5X2RlbF9jaGlsZChvYmotPnBhcmVudCwgb2JqLCBOVUxMKTsKKyAgICB9CisgICAgb2JqZWN0X3VucmVmKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIG9iamVjdF9kZWluaXQoT2JqZWN0ICpvYmosIFR5cGVJbXBsICp0eXBlKQoreworICAgIGlmICh0eXBlLT5pbnN0YW5jZV9maW5hbGl6ZSkgeworICAgICAgICB0eXBlLT5pbnN0YW5jZV9maW5hbGl6ZShvYmopOworICAgIH0KKworICAgIGlmICh0eXBlX2hhc19wYXJlbnQodHlwZSkpIHsKKyAgICAgICAgb2JqZWN0X2RlaW5pdChvYmosIHR5cGVfZ2V0X3BhcmVudCh0eXBlKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvYmplY3RfZmluYWxpemUodm9pZCAqZGF0YSkKK3sKKyAgICBPYmplY3QgKm9iaiA9IGRhdGE7CisgICAgVHlwZUltcGwgKnRpID0gb2JqLT5jbGFzcy0+dHlwZTsKKworICAgIG9iamVjdF9kZWluaXQob2JqLCB0aSk7CisgICAgb2JqZWN0X3Byb3BlcnR5X2RlbF9hbGwob2JqKTsKKworICAgIGdfYXNzZXJ0KG9iai0+cmVmID09IDApOworICAgIGlmIChvYmotPmZyZWUpIHsKKyAgICAgICAgb2JqLT5mcmVlKG9iaik7CisgICAgfQorfQorCitPYmplY3QgKm9iamVjdF9uZXdfd2l0aF90eXBlKFR5cGUgdHlwZSkKK3sKKyAgICBPYmplY3QgKm9iajsKKworICAgIGdfYXNzZXJ0KHR5cGUgIT0gTlVMTCk7CisgICAgdHlwZV9pbml0aWFsaXplKHR5cGUpOworCisgICAgb2JqID0gZ19tYWxsb2ModHlwZS0+aW5zdGFuY2Vfc2l6ZSk7CisgICAgb2JqZWN0X2luaXRpYWxpemVfd2l0aF90eXBlKG9iaiwgdHlwZS0+aW5zdGFuY2Vfc2l6ZSwgdHlwZSk7CisgICAgb2JqLT5mcmVlID0gZ19mcmVlOworCisgICAgcmV0dXJuIG9iajsKK30KKworT2JqZWN0ICpvYmplY3RfbmV3KGNvbnN0IGNoYXIgKnR5cGVuYW1lKQoreworICAgIFR5cGVJbXBsICp0aSA9IHR5cGVfZ2V0X2J5X25hbWUodHlwZW5hbWUpOworCisgICAgcmV0dXJuIG9iamVjdF9uZXdfd2l0aF90eXBlKHRpKTsKK30KKworT2JqZWN0ICpvYmplY3RfZHluYW1pY19jYXN0KE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICp0eXBlbmFtZSkKK3sKKyAgICBpZiAob2JqICYmIG9iamVjdF9jbGFzc19keW5hbWljX2Nhc3Qob2JqZWN0X2dldF9jbGFzcyhvYmopLCB0eXBlbmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworT2JqZWN0ICpvYmplY3RfZHluYW1pY19jYXN0X2Fzc2VydChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqdHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jKQoreworICAgIC8vdHJhY2Vfb2JqZWN0X2R5bmFtaWNfY2FzdF9hc3NlcnQob2JqID8gb2JqLT5jbGFzcy0+dHlwZS0+bmFtZSA6ICIobnVsbCkiLAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUsIGZpbGUsIGxpbmUsIGZ1bmMpOworCisjaWZkZWYgQ09ORklHX1FPTV9DQVNUX0RFQlVHCisgICAgaW50IGk7CisgICAgT2JqZWN0ICppbnN0OworCisgICAgZm9yIChpID0gMDsgb2JqICYmIGkgPCBPQkpFQ1RfQ0xBU1NfQ0FTVF9DQUNIRTsgaSsrKSB7CisgICAgICAgIGlmIChvYmotPmNsYXNzLT5jYXN0X2NhY2hlW2ldID09IHR5cGVuYW1lKSB7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluc3QgPSBvYmplY3RfZHluYW1pY19jYXN0KG9iaiwgdHlwZW5hbWUpOworCisgICAgaWYgKCFpbnN0ICYmIG9iaikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiVzOiBPYmplY3QgJXAgaXMgbm90IGFuIGluc3RhbmNlIG9mIHR5cGUgJXNcbiIsCisgICAgICAgICAgICAgICAgZmlsZSwgbGluZSwgZnVuYywgb2JqLCB0eXBlbmFtZSk7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorCisgICAgYXNzZXJ0KG9iaiA9PSBpbnN0KTsKKworICAgIGlmIChvYmogJiYgb2JqID09IGluc3QpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IE9CSkVDVF9DTEFTU19DQVNUX0NBQ0hFOyBpKyspIHsKKyAgICAgICAgICAgIG9iai0+Y2xhc3MtPmNhc3RfY2FjaGVbaSAtIDFdID0gb2JqLT5jbGFzcy0+Y2FzdF9jYWNoZVtpXTsKKyAgICAgICAgfQorICAgICAgICBvYmotPmNsYXNzLT5jYXN0X2NhY2hlW2kgLSAxXSA9IHR5cGVuYW1lOworICAgIH0KKworb3V0OgorI2VuZGlmCisgICAgcmV0dXJuIG9iajsKK30KKworT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzc19keW5hbWljX2Nhc3QoT2JqZWN0Q2xhc3MgKmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZW5hbWUpCit7CisgICAgT2JqZWN0Q2xhc3MgKnJldCA9IE5VTEw7CisgICAgVHlwZUltcGwgKnRhcmdldF90eXBlOworICAgIFR5cGVJbXBsICp0eXBlOworCisgICAgaWYgKCFjbGFzcykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBBIHNpbXBsZSBmYXN0IHBhdGggdGhhdCBjYW4gdHJpZ2dlciBhIGxvdCBmb3IgbGVhZiBjbGFzc2VzLiAgKi8KKyAgICB0eXBlID0gY2xhc3MtPnR5cGU7CisgICAgaWYgKHR5cGUtPm5hbWUgPT0gdHlwZW5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzOworICAgIH0KKworICAgIHRhcmdldF90eXBlID0gdHlwZV9nZXRfYnlfbmFtZSh0eXBlbmFtZSk7CisgICAgaWYgKCF0YXJnZXRfdHlwZSkgeworICAgICAgICAvKiB0YXJnZXQgY2xhc3MgdHlwZSB1bmtub3duLCBzbyBmYWlsIHRoZSBjYXN0ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICh0eXBlLT5jbGFzcy0+aW50ZXJmYWNlcyAmJgorICAgICAgICAgICAgdHlwZV9pc19hbmNlc3Rvcih0YXJnZXRfdHlwZSwgdHlwZV9pbnRlcmZhY2UpKSB7CisgICAgICAgIGludCBmb3VuZCA9IDA7CisgICAgICAgIEdTTGlzdCAqaTsKKworICAgICAgICBmb3IgKGkgPSBjbGFzcy0+aW50ZXJmYWNlczsgaTsgaSA9IGktPm5leHQpIHsKKyAgICAgICAgICAgIE9iamVjdENsYXNzICp0YXJnZXRfY2xhc3MgPSBpLT5kYXRhOworCisgICAgICAgICAgICBpZiAodHlwZV9pc19hbmNlc3Rvcih0YXJnZXRfY2xhc3MtPnR5cGUsIHRhcmdldF90eXBlKSkgeworICAgICAgICAgICAgICAgIHJldCA9IHRhcmdldF9jbGFzczsKKyAgICAgICAgICAgICAgICBmb3VuZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgIC8qIFRoZSBtYXRjaCB3YXMgYW1iaWd1b3VzLCBkb24ndCBhbGxvdyBhIGNhc3QgKi8KKyAgICAgICAgaWYgKGZvdW5kID4gMSkgeworICAgICAgICAgICAgcmV0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZV9pc19hbmNlc3Rvcih0eXBlLCB0YXJnZXRfdHlwZSkpIHsKKyAgICAgICAgcmV0ID0gY2xhc3M7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzc19keW5hbWljX2Nhc3RfYXNzZXJ0KE9iamVjdENsYXNzICpjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jKQoreworICAgIE9iamVjdENsYXNzICpyZXQ7CisKKyAgICAvL3RyYWNlX29iamVjdF9jbGFzc19keW5hbWljX2Nhc3RfYXNzZXJ0KGNsYXNzID8gY2xhc3MtPnR5cGUtPm5hbWUgOiAiKG51bGwpIiwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lLCBmaWxlLCBsaW5lLCBmdW5jKTsKKworI2lmZGVmIENPTkZJR19RT01fQ0FTVF9ERUJVRworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgY2xhc3MgJiYgaSA8IE9CSkVDVF9DTEFTU19DQVNUX0NBQ0hFOyBpKyspIHsKKyAgICAgICAgaWYgKGNsYXNzLT5jYXN0X2NhY2hlW2ldID09IHR5cGVuYW1lKSB7CisgICAgICAgICAgICByZXQgPSBjbGFzczsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoIWNsYXNzIHx8ICFjbGFzcy0+aW50ZXJmYWNlcykgeworICAgICAgICByZXR1cm4gY2xhc3M7CisgICAgfQorI2VuZGlmCisKKyAgICByZXQgPSBvYmplY3RfY2xhc3NfZHluYW1pY19jYXN0KGNsYXNzLCB0eXBlbmFtZSk7CisgICAgaWYgKCFyZXQgJiYgY2xhc3MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolZDolczogT2JqZWN0ICVwIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlICVzXG4iLAorICAgICAgICAgICAgICAgIGZpbGUsIGxpbmUsIGZ1bmMsIGNsYXNzLCB0eXBlbmFtZSk7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorCisjaWZkZWYgQ09ORklHX1FPTV9DQVNUX0RFQlVHCisgICAgaWYgKGNsYXNzICYmIHJldCA9PSBjbGFzcykgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgT0JKRUNUX0NMQVNTX0NBU1RfQ0FDSEU7IGkrKykgeworICAgICAgICAgICAgY2xhc3MtPmNhc3RfY2FjaGVbaSAtIDFdID0gY2xhc3MtPmNhc3RfY2FjaGVbaV07CisgICAgICAgIH0KKyAgICAgICAgY2xhc3MtPmNhc3RfY2FjaGVbaSAtIDFdID0gdHlwZW5hbWU7CisgICAgfQorb3V0OgorI2VuZGlmCisgICAgcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciAqb2JqZWN0X2dldF90eXBlbmFtZShPYmplY3QgKm9iaikKK3sKKyAgICByZXR1cm4gb2JqLT5jbGFzcy0+dHlwZS0+bmFtZTsKK30KKworT2JqZWN0Q2xhc3MgKm9iamVjdF9nZXRfY2xhc3MoT2JqZWN0ICpvYmopCit7CisgICAgcmV0dXJuIG9iai0+Y2xhc3M7Cit9CisKK2Jvb2wgb2JqZWN0X2NsYXNzX2lzX2Fic3RyYWN0KE9iamVjdENsYXNzICprbGFzcykKK3sKKyAgICByZXR1cm4ga2xhc3MtPnR5cGUtPmFic3RyYWN0OworfQorCitjb25zdCBjaGFyICpvYmplY3RfY2xhc3NfZ2V0X25hbWUoT2JqZWN0Q2xhc3MgKmtsYXNzKQoreworICAgIHJldHVybiBrbGFzcy0+dHlwZS0+bmFtZTsKK30KKworT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzc19ieV9uYW1lKGNvbnN0IGNoYXIgKnR5cGVuYW1lKQoreworICAgIFR5cGVJbXBsICp0eXBlID0gdHlwZV9nZXRfYnlfbmFtZSh0eXBlbmFtZSk7CisKKyAgICBpZiAoIXR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdHlwZV9pbml0aWFsaXplKHR5cGUpOworCisgICAgcmV0dXJuIHR5cGUtPmNsYXNzOworfQorCitPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzX2dldF9wYXJlbnQoT2JqZWN0Q2xhc3MgKmNsYXNzKQoreworICAgIFR5cGVJbXBsICp0eXBlID0gdHlwZV9nZXRfcGFyZW50KGNsYXNzLT50eXBlKTsKKworICAgIGlmICghdHlwZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB0eXBlX2luaXRpYWxpemUodHlwZSk7CisKKyAgICByZXR1cm4gdHlwZS0+Y2xhc3M7Cit9CisKK3R5cGVkZWYgc3RydWN0IE9DRkRhdGEKK3sKKyAgICB2b2lkICgqZm4pKE9iamVjdENsYXNzICprbGFzcywgdm9pZCAqb3BhcXVlKTsKKyAgICBjb25zdCBjaGFyICppbXBsZW1lbnRzX3R5cGU7CisgICAgYm9vbCBpbmNsdWRlX2Fic3RyYWN0OworICAgIHZvaWQgKm9wYXF1ZTsKK30gT0NGRGF0YTsKKworc3RhdGljIHZvaWQgb2JqZWN0X2NsYXNzX2ZvcmVhY2hfdHJhbXAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIG9wYXF1ZSkKK3sKKyAgICBPQ0ZEYXRhICpkYXRhID0gb3BhcXVlOworICAgIFR5cGVJbXBsICp0eXBlID0gdmFsdWU7CisgICAgT2JqZWN0Q2xhc3MgKms7CisKKyAgICB0eXBlX2luaXRpYWxpemUodHlwZSk7CisgICAgayA9IHR5cGUtPmNsYXNzOworCisgICAgaWYgKCFkYXRhLT5pbmNsdWRlX2Fic3RyYWN0ICYmIHR5cGUtPmFic3RyYWN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZGF0YS0+aW1wbGVtZW50c190eXBlICYmCisgICAgICAgICFvYmplY3RfY2xhc3NfZHluYW1pY19jYXN0KGssIGRhdGEtPmltcGxlbWVudHNfdHlwZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRhdGEtPmZuKGssIGRhdGEtPm9wYXF1ZSk7Cit9CisKK3ZvaWQgb2JqZWN0X2NsYXNzX2ZvcmVhY2godm9pZCAoKmZuKShPYmplY3RDbGFzcyAqa2xhc3MsIHZvaWQgKm9wYXF1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmltcGxlbWVudHNfdHlwZSwgYm9vbCBpbmNsdWRlX2Fic3RyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgT0NGRGF0YSBkYXRhID0geyBmbiwgaW1wbGVtZW50c190eXBlLCBpbmNsdWRlX2Fic3RyYWN0LCBvcGFxdWUgfTsKKworICAgIGdfaGFzaF90YWJsZV9mb3JlYWNoKHR5cGVfdGFibGVfZ2V0KCksIG9iamVjdF9jbGFzc19mb3JlYWNoX3RyYW1wLCAmZGF0YSk7Cit9CisKK2ludCBvYmplY3RfY2hpbGRfZm9yZWFjaChPYmplY3QgKm9iaiwgaW50ICgqZm4pKE9iamVjdCAqY2hpbGQsIHZvaWQgKm9wYXF1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIE9iamVjdFByb3BlcnR5ICpwcm9wOworICAgIGludCByZXQgPSAwOworCisgICAgUVRBSUxRX0ZPUkVBQ0gocHJvcCwgJm9iai0+cHJvcGVydGllcywgbm9kZSkgeworICAgICAgICBpZiAob2JqZWN0X3Byb3BlcnR5X2lzX2NoaWxkKHByb3ApKSB7CisgICAgICAgICAgICByZXQgPSBmbihwcm9wLT5vcGFxdWUsIG9wYXF1ZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvYmplY3RfY2xhc3NfZ2V0X2xpc3RfdHJhbXAoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpvcGFxdWUpCit7CisgICAgR1NMaXN0ICoqbGlzdCA9IG9wYXF1ZTsKKworICAgICpsaXN0ID0gZ19zbGlzdF9wcmVwZW5kKCpsaXN0LCBrbGFzcyk7Cit9CisKK0dTTGlzdCAqb2JqZWN0X2NsYXNzX2dldF9saXN0KGNvbnN0IGNoYXIgKmltcGxlbWVudHNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9hYnN0cmFjdCkKK3sKKyAgICBHU0xpc3QgKmxpc3QgPSBOVUxMOworCisgICAgb2JqZWN0X2NsYXNzX2ZvcmVhY2gob2JqZWN0X2NsYXNzX2dldF9saXN0X3RyYW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHNfdHlwZSwgaW5jbHVkZV9hYnN0cmFjdCwgJmxpc3QpOworICAgIHJldHVybiBsaXN0OworfQorCit2b2lkIG9iamVjdF9yZWYoT2JqZWN0ICpvYmopCit7CisgICAgIGF0b21pY19pbmMoJm9iai0+cmVmKTsKK30KKwordm9pZCBvYmplY3RfdW5yZWYoT2JqZWN0ICpvYmopCit7CisgICAgZ19hc3NlcnQob2JqLT5yZWYgPiAwKTsKKworICAgIC8qIHBhcmVudCBhbHdheXMgaG9sZHMgYSByZWZlcmVuY2UgdG8gaXRzIGNoaWxkcmVuICovCisgICAgaWYgKGF0b21pY19mZXRjaF9kZWMoJm9iai0+cmVmKSA9PSAxKSB7CisgICAgICAgIG9iamVjdF9maW5hbGl6ZShvYmopOworICAgIH0KK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfYWRkKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFByb3BlcnR5QWNjZXNzb3IgKmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQcm9wZXJ0eUFjY2Vzc29yICpzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0UHJvcGVydHlSZWxlYXNlICpyZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgRXJyb3IgKiplcnJwKQoreworICAgIE9iamVjdFByb3BlcnR5ICpwcm9wOworCisgICAgUVRBSUxRX0ZPUkVBQ0gocHJvcCwgJm9iai0+cHJvcGVydGllcywgbm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKHByb3AtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGVycm9yX3NldGcoZXJycCwgImF0dGVtcHQgdG8gYWRkIGR1cGxpY2F0ZSBwcm9wZXJ0eSAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAiIHRvIG9iamVjdCAodHlwZSAnJXMnKSIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9nZXRfdHlwZW5hbWUob2JqKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm9wID0gZ19tYWxsb2MwKHNpemVvZigqcHJvcCkpOworCisgICAgcHJvcC0+bmFtZSA9IGdfc3RyZHVwKG5hbWUpOworICAgIHByb3AtPnR5cGUgPSBnX3N0cmR1cCh0eXBlKTsKKworICAgIHByb3AtPmdldCA9IGdldDsKKyAgICBwcm9wLT5zZXQgPSBzZXQ7CisgICAgcHJvcC0+cmVsZWFzZSA9IHJlbGVhc2U7CisgICAgcHJvcC0+b3BhcXVlID0gb3BhcXVlOworCisgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZvYmotPnByb3BlcnRpZXMsIHByb3AsIG5vZGUpOworfQorCitPYmplY3RQcm9wZXJ0eSAqb2JqZWN0X3Byb3BlcnR5X2ZpbmQoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIE9iamVjdFByb3BlcnR5ICpwcm9wOworCisgICAgUVRBSUxRX0ZPUkVBQ0gocHJvcCwgJm9iai0+cHJvcGVydGllcywgbm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKHByb3AtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyb3Jfc2V0KGVycnAsIFFFUlJfUFJPUEVSVFlfTk9UX0ZPVU5ELCAiIiwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2RlbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIE9iamVjdFByb3BlcnR5ICpwcm9wID0gb2JqZWN0X3Byb3BlcnR5X2ZpbmQob2JqLCBuYW1lLCBlcnJwKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocHJvcC0+cmVsZWFzZSkgeworICAgICAgICBwcm9wLT5yZWxlYXNlKG9iaiwgbmFtZSwgcHJvcC0+b3BhcXVlKTsKKyAgICB9CisKKyAgICBRVEFJTFFfUkVNT1ZFKCZvYmotPnByb3BlcnRpZXMsIHByb3AsIG5vZGUpOworCisgICAgZ19mcmVlKHByb3AtPm5hbWUpOworICAgIGdfZnJlZShwcm9wLT50eXBlKTsKKyAgICBnX2ZyZWUocHJvcCk7Cit9CisKK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2dldChPYmplY3QgKm9iaiwgVmlzaXRvciAqdiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApCit7CisgICAgT2JqZWN0UHJvcGVydHkgKnByb3AgPSBvYmplY3RfcHJvcGVydHlfZmluZChvYmosIG5hbWUsIGVycnApOworICAgIGlmIChwcm9wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghcHJvcC0+Z2V0KSB7CisgICAgICAgIGVycm9yX3NldChlcnJwLCBRRVJSX1BFUk1JU1NJT05fREVOSUVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm9wLT5nZXQob2JqLCB2LCBwcm9wLT5vcGFxdWUsIG5hbWUsIGVycnApOworICAgIH0KK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfc2V0KE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICBPYmplY3RQcm9wZXJ0eSAqcHJvcCA9IG9iamVjdF9wcm9wZXJ0eV9maW5kKG9iaiwgbmFtZSwgZXJycCk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwcm9wLT5zZXQpIHsKKyAgICAgICAgZXJyb3Jfc2V0KGVycnAsIFFFUlJfUEVSTUlTU0lPTl9ERU5JRUQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByb3AtPnNldChvYmosIHYsIHByb3AtPm9wYXF1ZSwgbmFtZSwgZXJycCk7CisgICAgfQorfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXRfc3RyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIFFTdHJpbmcgKnFzdHIgPSBxc3RyaW5nX2Zyb21fc3RyKHZhbHVlKTsKKyAgICBvYmplY3RfcHJvcGVydHlfc2V0X3FvYmplY3Qob2JqLCBRT0JKRUNUKHFzdHIpLCBuYW1lLCBlcnJwKTsKKworICAgIFFERUNSRUYocXN0cik7Cit9CisKK2NoYXIgKm9iamVjdF9wcm9wZXJ0eV9nZXRfc3RyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIFFPYmplY3QgKnJldCA9IG9iamVjdF9wcm9wZXJ0eV9nZXRfcW9iamVjdChvYmosIG5hbWUsIGVycnApOworICAgIFFTdHJpbmcgKnFzdHJpbmc7CisgICAgY2hhciAqcmV0dmFsOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHFzdHJpbmcgPSBxb2JqZWN0X3RvX3FzdHJpbmcocmV0KTsKKyAgICBpZiAoIXFzdHJpbmcpIHsKKyAgICAgICAgZXJyb3Jfc2V0KGVycnAsIFFFUlJfSU5WQUxJRF9QQVJBTUVURVJfVFlQRSwgbmFtZSwgInN0cmluZyIpOworICAgICAgICByZXR2YWwgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHZhbCA9IGdfc3RyZHVwKHFzdHJpbmdfZ2V0X3N0cihxc3RyaW5nKSk7CisgICAgfQorCisgICAgUURFQ1JFRihxc3RyaW5nKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXRfbGluayhPYmplY3QgKm9iaiwgT2JqZWN0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBnY2hhciAqcGF0aCA9IG9iamVjdF9nZXRfY2Fub25pY2FsX3BhdGgodmFsdWUpOworICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfc3RyKG9iaiwgcGF0aCwgbmFtZSwgZXJycCk7CisgICAgZ19mcmVlKHBhdGgpOworfQorCitPYmplY3QgKm9iamVjdF9wcm9wZXJ0eV9nZXRfbGluayhPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICBjaGFyICpzdHIgPSBvYmplY3RfcHJvcGVydHlfZ2V0X3N0cihvYmosIG5hbWUsIGVycnApOworICAgIE9iamVjdCAqdGFyZ2V0ID0gTlVMTDsKKworICAgIGlmIChzdHIgJiYgKnN0cikgeworICAgICAgICB0YXJnZXQgPSBvYmplY3RfcmVzb2x2ZV9wYXRoKHN0ciwgTlVMTCk7CisgICAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgICAgICBlcnJvcl9zZXQoZXJycCwgUUVSUl9ERVZJQ0VfTk9UX0ZPVU5ELCBzdHIpOworICAgICAgICB9CisgICAgfQorCisgICAgZ19mcmVlKHN0cik7CisgICAgcmV0dXJuIHRhcmdldDsKK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfc2V0X2Jvb2woT2JqZWN0ICpvYmosIGJvb2wgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgUUJvb2wgKnFib29sID0gcWJvb2xfZnJvbV9pbnQodmFsdWUpOworICAgIG9iamVjdF9wcm9wZXJ0eV9zZXRfcW9iamVjdChvYmosIFFPQkpFQ1QocWJvb2wpLCBuYW1lLCBlcnJwKTsKKworICAgIFFERUNSRUYocWJvb2wpOworfQorCitib29sIG9iamVjdF9wcm9wZXJ0eV9nZXRfYm9vbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICBRT2JqZWN0ICpyZXQgPSBvYmplY3RfcHJvcGVydHlfZ2V0X3FvYmplY3Qob2JqLCBuYW1lLCBlcnJwKTsKKyAgICBRQm9vbCAqcWJvb2w7CisgICAgYm9vbCByZXR2YWw7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHFib29sID0gcW9iamVjdF90b19xYm9vbChyZXQpOworICAgIGlmICghcWJvb2wpIHsKKyAgICAgICAgZXJyb3Jfc2V0KGVycnAsIFFFUlJfSU5WQUxJRF9QQVJBTUVURVJfVFlQRSwgbmFtZSwgImJvb2xlYW4iKTsKKyAgICAgICAgcmV0dmFsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gcWJvb2xfZ2V0X2ludChxYm9vbCk7CisgICAgfQorCisgICAgUURFQ1JFRihxYm9vbCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfc2V0X2ludChPYmplY3QgKm9iaiwgaW50NjRfdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIFFJbnQgKnFpbnQgPSBxaW50X2Zyb21faW50KHZhbHVlKTsKKyAgICBvYmplY3RfcHJvcGVydHlfc2V0X3FvYmplY3Qob2JqLCBRT0JKRUNUKHFpbnQpLCBuYW1lLCBlcnJwKTsKKworICAgIFFERUNSRUYocWludCk7Cit9CisKK2ludDY0X3Qgb2JqZWN0X3Byb3BlcnR5X2dldF9pbnQoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICBRT2JqZWN0ICpyZXQgPSBvYmplY3RfcHJvcGVydHlfZ2V0X3FvYmplY3Qob2JqLCBuYW1lLCBlcnJwKTsKKyAgICBRSW50ICpxaW50OworICAgIGludDY0X3QgcmV0dmFsOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBxaW50ID0gcW9iamVjdF90b19xaW50KHJldCk7CisgICAgaWYgKCFxaW50KSB7CisgICAgICAgIGVycm9yX3NldChlcnJwLCBRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1RZUEUsIG5hbWUsICJpbnQiKTsKKyAgICAgICAgcmV0dmFsID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gcWludF9nZXRfaW50KHFpbnQpOworICAgIH0KKworICAgIFFERUNSRUYocWludCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfcGFyc2UoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBTdHJpbmdJbnB1dFZpc2l0b3IgKm1pOworICAgIG1pID0gc3RyaW5nX2lucHV0X3Zpc2l0b3JfbmV3KHN0cmluZyk7CisgICAgb2JqZWN0X3Byb3BlcnR5X3NldChvYmosIHN0cmluZ19pbnB1dF9nZXRfdmlzaXRvcihtaSksIG5hbWUsIGVycnApOworCisgICAgc3RyaW5nX2lucHV0X3Zpc2l0b3JfY2xlYW51cChtaSk7Cit9CisKK2NoYXIgKm9iamVjdF9wcm9wZXJ0eV9wcmludChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApCit7CisgICAgU3RyaW5nT3V0cHV0VmlzaXRvciAqbW87CisgICAgY2hhciAqc3RyaW5nOworCisgICAgbW8gPSBzdHJpbmdfb3V0cHV0X3Zpc2l0b3JfbmV3KCk7CisgICAgb2JqZWN0X3Byb3BlcnR5X2dldChvYmosIHN0cmluZ19vdXRwdXRfZ2V0X3Zpc2l0b3IobW8pLCBuYW1lLCBlcnJwKTsKKyAgICBzdHJpbmcgPSBzdHJpbmdfb3V0cHV0X2dldF9zdHJpbmcobW8pOworICAgIHN0cmluZ19vdXRwdXRfdmlzaXRvcl9jbGVhbnVwKG1vKTsKKyAgICByZXR1cm4gc3RyaW5nOworfQorCitjb25zdCBjaGFyICpvYmplY3RfcHJvcGVydHlfZ2V0X3R5cGUoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBPYmplY3RQcm9wZXJ0eSAqcHJvcCA9IG9iamVjdF9wcm9wZXJ0eV9maW5kKG9iaiwgbmFtZSwgZXJycCk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcHJvcC0+dHlwZTsKK30KKworT2JqZWN0ICpvYmplY3RfZ2V0X3Jvb3Qodm9pZCkKK3sKKyAgICBzdGF0aWMgT2JqZWN0ICpyb290OworCisgICAgaWYgKCFyb290KSB7CisgICAgICAgIHJvb3QgPSBvYmplY3RfbmV3KCJjb250YWluZXIiKTsKKyAgICB9CisKKyAgICByZXR1cm4gcm9vdDsKK30KKworc3RhdGljIHZvaWQgb2JqZWN0X2dldF9jaGlsZF9wcm9wZXJ0eShPYmplY3QgKm9iaiwgVmlzaXRvciAqdiwgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgT2JqZWN0ICpjaGlsZCA9IG9wYXF1ZTsKKyAgICBnY2hhciAqcGF0aDsKKworICAgIHBhdGggPSBvYmplY3RfZ2V0X2Nhbm9uaWNhbF9wYXRoKGNoaWxkKTsKKyAgICB2aXNpdF90eXBlX3N0cih2LCAmcGF0aCwgbmFtZSwgZXJycCk7CisgICAgZ19mcmVlKHBhdGgpOworfQorCitzdGF0aWMgdm9pZCBvYmplY3RfZmluYWxpemVfY2hpbGRfcHJvcGVydHkoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIE9iamVjdCAqY2hpbGQgPSBvcGFxdWU7CisKKyAgICBvYmplY3RfdW5yZWYoY2hpbGQpOworfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfY2hpbGQoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0ICpjaGlsZCwgRXJyb3IgKiplcnJwKQoreworICAgIGdjaGFyICp0eXBlOworCisgICAgdHlwZSA9IGdfc3RyZHVwX3ByaW50ZigiY2hpbGQ8JXM+Iiwgb2JqZWN0X2dldF90eXBlbmFtZShPQkpFQ1QoY2hpbGQpKSk7CisKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkKG9iaiwgbmFtZSwgdHlwZSwgb2JqZWN0X2dldF9jaGlsZF9wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG9iamVjdF9maW5hbGl6ZV9jaGlsZF9wcm9wZXJ0eSwgY2hpbGQsIGVycnApOworCisgICAgb2JqZWN0X3JlZihjaGlsZCk7CisgICAgZ19hc3NlcnQoY2hpbGQtPnBhcmVudCA9PSBOVUxMKTsKKyAgICBjaGlsZC0+cGFyZW50ID0gb2JqOworCisgICAgZ19mcmVlKHR5cGUpOworfQorCitzdGF0aWMgdm9pZCBvYmplY3RfZ2V0X2xpbmtfcHJvcGVydHkoT2JqZWN0ICpvYmosIFZpc2l0b3IgKnYsIHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgT2JqZWN0ICoqY2hpbGQgPSBvcGFxdWU7CisgICAgZ2NoYXIgKnBhdGg7CisKKyAgICBpZiAoKmNoaWxkKSB7CisgICAgICAgIHBhdGggPSBvYmplY3RfZ2V0X2Nhbm9uaWNhbF9wYXRoKCpjaGlsZCk7CisgICAgICAgIHZpc2l0X3R5cGVfc3RyKHYsICZwYXRoLCBuYW1lLCBlcnJwKTsKKyAgICAgICAgZ19mcmVlKHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhdGggPSAoZ2NoYXIgKikiIjsKKyAgICAgICAgdmlzaXRfdHlwZV9zdHIodiwgJnBhdGgsIG5hbWUsIGVycnApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb2JqZWN0X3NldF9saW5rX3Byb3BlcnR5KE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIE9iamVjdCAqKmNoaWxkID0gb3BhcXVlOworICAgIE9iamVjdCAqb2xkX3RhcmdldDsKKyAgICBib29sIGFtYmlndW91cyA9IGZhbHNlOworICAgIGNvbnN0IGNoYXIgKnR5cGU7CisgICAgY2hhciAqcGF0aDsKKyAgICBnY2hhciAqdGFyZ2V0X3R5cGU7CisKKyAgICB0eXBlID0gb2JqZWN0X3Byb3BlcnR5X2dldF90eXBlKG9iaiwgbmFtZSwgTlVMTCk7CisKKyAgICB2aXNpdF90eXBlX3N0cih2LCAmcGF0aCwgbmFtZSwgZXJycCk7CisKKyAgICBvbGRfdGFyZ2V0ID0gKmNoaWxkOworICAgICpjaGlsZCA9IE5VTEw7CisKKyAgICBpZiAoc3RyY21wKHBhdGgsICIiKSAhPSAwKSB7CisgICAgICAgIE9iamVjdCAqdGFyZ2V0OworCisgICAgICAgIC8qIEdvIGZyb20gbGluazxGT08+IHRvIEZPTy4gICovCisgICAgICAgIHRhcmdldF90eXBlID0gZ19zdHJuZHVwKCZ0eXBlWzVdLCBzdHJsZW4odHlwZSkgLSA2KTsKKyAgICAgICAgdGFyZ2V0ID0gb2JqZWN0X3Jlc29sdmVfcGF0aF90eXBlKHBhdGgsIHRhcmdldF90eXBlLCAmYW1iaWd1b3VzKTsKKworICAgICAgICBpZiAoYW1iaWd1b3VzKSB7CisgICAgICAgICAgICBlcnJvcl9zZXQoZXJycCwgUUVSUl9BTUJJR1VPVVNfUEFUSCwgcGF0aCk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7CisgICAgICAgICAgICBvYmplY3RfcmVmKHRhcmdldCk7CisgICAgICAgICAgICAqY2hpbGQgPSB0YXJnZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXQgPSBvYmplY3RfcmVzb2x2ZV9wYXRoKHBhdGgsICZhbWJpZ3VvdXMpOworICAgICAgICAgICAgaWYgKHRhcmdldCB8fCBhbWJpZ3VvdXMpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9zZXQoZXJycCwgUUVSUl9JTlZBTElEX1BBUkFNRVRFUl9UWVBFLCBuYW1lLCB0YXJnZXRfdHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVycm9yX3NldChlcnJwLCBRRVJSX0RFVklDRV9OT1RfRk9VTkQsIHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdfZnJlZSh0YXJnZXRfdHlwZSk7CisgICAgfQorCisgICAgZ19mcmVlKHBhdGgpOworCisgICAgaWYgKG9sZF90YXJnZXQgIT0gTlVMTCkgeworICAgICAgICBvYmplY3RfdW5yZWYob2xkX3RhcmdldCk7CisgICAgfQorfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfbGluayhPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIE9iamVjdCAqKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIGdjaGFyICpmdWxsX3R5cGU7CisKKyAgICBmdWxsX3R5cGUgPSBnX3N0cmR1cF9wcmludGYoImxpbms8JXM+IiwgdHlwZSk7CisKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkKG9iaiwgbmFtZSwgZnVsbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2dldF9saW5rX3Byb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3NldF9saW5rX3Byb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgY2hpbGQsIGVycnApOworCisgICAgZ19mcmVlKGZ1bGxfdHlwZSk7Cit9CisKK2djaGFyICpvYmplY3RfZ2V0X2Nhbm9uaWNhbF9wYXRoKE9iamVjdCAqb2JqKQoreworICAgIE9iamVjdCAqcm9vdCA9IG9iamVjdF9nZXRfcm9vdCgpOworICAgIGNoYXIgKm5ld3BhdGggPSBOVUxMLCAqcGF0aCA9IE5VTEw7CisKKyAgICB3aGlsZSAob2JqICE9IHJvb3QpIHsKKyAgICAgICAgT2JqZWN0UHJvcGVydHkgKnByb3AgPSBOVUxMOworCisgICAgICAgIGdfYXNzZXJ0KG9iai0+cGFyZW50ICE9IE5VTEwpOworCisgICAgICAgIFFUQUlMUV9GT1JFQUNIKHByb3AsICZvYmotPnBhcmVudC0+cHJvcGVydGllcywgbm9kZSkgeworICAgICAgICAgICAgaWYgKCFvYmplY3RfcHJvcGVydHlfaXNfY2hpbGQocHJvcCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByb3AtPm9wYXF1ZSA9PSBvYmopIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aCkgeworICAgICAgICAgICAgICAgICAgICBuZXdwYXRoID0gZ19zdHJkdXBfcHJpbnRmKCIlcy8lcyIsIHByb3AtPm5hbWUsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICBnX2ZyZWUocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBuZXdwYXRoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBnX3N0cmR1cChwcm9wLT5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnX2Fzc2VydChwcm9wICE9IE5VTEwpOworCisgICAgICAgIG9iaiA9IG9iai0+cGFyZW50OworICAgIH0KKworICAgIG5ld3BhdGggPSBnX3N0cmR1cF9wcmludGYoIi8lcyIsIHBhdGgpOworICAgIGdfZnJlZShwYXRoKTsKKworICAgIHJldHVybiBuZXdwYXRoOworfQorCitPYmplY3QgKm9iamVjdF9yZXNvbHZlX3BhdGhfY29tcG9uZW50KE9iamVjdCAqcGFyZW50LCBjb25zdCBnY2hhciAqcGFydCkKK3sKKyAgICBPYmplY3RQcm9wZXJ0eSAqcHJvcCA9IG9iamVjdF9wcm9wZXJ0eV9maW5kKHBhcmVudCwgcGFydCwgTlVMTCk7CisgICAgaWYgKHByb3AgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAob2JqZWN0X3Byb3BlcnR5X2lzX2xpbmsocHJvcCkpIHsKKyAgICAgICAgcmV0dXJuICooT2JqZWN0ICoqKXByb3AtPm9wYXF1ZTsKKyAgICB9IGVsc2UgaWYgKG9iamVjdF9wcm9wZXJ0eV9pc19jaGlsZChwcm9wKSkgeworICAgICAgICByZXR1cm4gcHJvcC0+b3BhcXVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIE9iamVjdCAqb2JqZWN0X3Jlc29sdmVfYWJzX3BhdGgoT2JqZWN0ICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCit7CisgICAgT2JqZWN0ICpjaGlsZDsKKworICAgIGlmIChwYXJ0c1tpbmRleF0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gb2JqZWN0X2R5bmFtaWNfY2FzdChwYXJlbnQsIHR5cGVuYW1lKTsKKyAgICB9CisKKyAgICBpZiAoc3RyY21wKHBhcnRzW2luZGV4XSwgIiIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdF9yZXNvbHZlX2Fic19wYXRoKHBhcmVudCwgcGFydHMsIHR5cGVuYW1lLCBpbmRleCArIDEpOworICAgIH0KKworICAgIGNoaWxkID0gb2JqZWN0X3Jlc29sdmVfcGF0aF9jb21wb25lbnQocGFyZW50LCBwYXJ0c1tpbmRleF0pOworICAgIGlmICghY2hpbGQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG9iamVjdF9yZXNvbHZlX2Fic19wYXRoKGNoaWxkLCBwYXJ0cywgdHlwZW5hbWUsIGluZGV4ICsgMSk7Cit9CisKK3N0YXRpYyBPYmplY3QgKm9iamVjdF9yZXNvbHZlX3BhcnRpYWxfcGF0aChPYmplY3QgKnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmFtYmlndW91cykKK3sKKyAgICBPYmplY3QgKm9iajsKKyAgICBPYmplY3RQcm9wZXJ0eSAqcHJvcDsKKworICAgIG9iaiA9IG9iamVjdF9yZXNvbHZlX2Fic19wYXRoKHBhcmVudCwgcGFydHMsIHR5cGVuYW1lLCAwKTsKKworICAgIFFUQUlMUV9GT1JFQUNIKHByb3AsICZwYXJlbnQtPnByb3BlcnRpZXMsIG5vZGUpIHsKKyAgICAgICAgT2JqZWN0ICpmb3VuZDsKKworICAgICAgICBpZiAoIW9iamVjdF9wcm9wZXJ0eV9pc19jaGlsZChwcm9wKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBmb3VuZCA9IG9iamVjdF9yZXNvbHZlX3BhcnRpYWxfcGF0aChwcm9wLT5vcGFxdWUsIHBhcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSwgYW1iaWd1b3VzKTsKKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBpZiAob2JqKSB7CisgICAgICAgICAgICAgICAgaWYgKGFtYmlndW91cykgeworICAgICAgICAgICAgICAgICAgICAqYW1iaWd1b3VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmogPSBmb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhbWJpZ3VvdXMgJiYgKmFtYmlndW91cykgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb2JqOworfQorCitPYmplY3QgKm9iamVjdF9yZXNvbHZlX3BhdGhfdHlwZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICp0eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKmFtYmlndW91cykKK3sKKyAgICBPYmplY3QgKm9iajsKKyAgICBnY2hhciAqKnBhcnRzOworCisgICAgcGFydHMgPSBnX3N0cnNwbGl0KHBhdGgsICIvIiwgMCk7CisgICAgYXNzZXJ0KHBhcnRzKTsKKworICAgIGlmIChwYXJ0c1swXSA9PSBOVUxMIHx8IHN0cmNtcChwYXJ0c1swXSwgIiIpICE9IDApIHsKKyAgICAgICAgaWYgKGFtYmlndW91cykgeworICAgICAgICAgICAgKmFtYmlndW91cyA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIG9iaiA9IG9iamVjdF9yZXNvbHZlX3BhcnRpYWxfcGF0aChvYmplY3RfZ2V0X3Jvb3QoKSwgcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSwgYW1iaWd1b3VzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvYmogPSBvYmplY3RfcmVzb2x2ZV9hYnNfcGF0aChvYmplY3RfZ2V0X3Jvb3QoKSwgcGFydHMsIHR5cGVuYW1lLCAxKTsKKyAgICB9CisKKyAgICBnX3N0cmZyZWV2KHBhcnRzKTsKKworICAgIHJldHVybiBvYmo7Cit9CisKK09iamVjdCAqb2JqZWN0X3Jlc29sdmVfcGF0aChjb25zdCBjaGFyICpwYXRoLCBib29sICphbWJpZ3VvdXMpCit7CisgICAgcmV0dXJuIG9iamVjdF9yZXNvbHZlX3BhdGhfdHlwZShwYXRoLCBUWVBFX09CSkVDVCwgYW1iaWd1b3VzKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgU3RyaW5nUHJvcGVydHkKK3sKKyAgICBjaGFyICooKmdldCkoT2JqZWN0ICosIEVycm9yICoqKTsKKyAgICB2b2lkICgqc2V0KShPYmplY3QgKiwgY29uc3QgY2hhciAqLCBFcnJvciAqKik7Cit9IFN0cmluZ1Byb3BlcnR5OworCitzdGF0aWMgdm9pZCBwcm9wZXJ0eV9nZXRfc3RyKE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBTdHJpbmdQcm9wZXJ0eSAqcHJvcCA9IG9wYXF1ZTsKKyAgICBjaGFyICp2YWx1ZTsKKworICAgIHZhbHVlID0gcHJvcC0+Z2V0KG9iaiwgZXJycCk7CisgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIHZpc2l0X3R5cGVfc3RyKHYsICZ2YWx1ZSwgbmFtZSwgZXJycCk7CisgICAgICAgIGdfZnJlZSh2YWx1ZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcm9wZXJ0eV9zZXRfc3RyKE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBTdHJpbmdQcm9wZXJ0eSAqcHJvcCA9IG9wYXF1ZTsKKyAgICBjaGFyICp2YWx1ZTsKKyAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKKworICAgIHZpc2l0X3R5cGVfc3RyKHYsICZ2YWx1ZSwgbmFtZSwgJmxvY2FsX2Vycik7CisgICAgaWYgKGxvY2FsX2VycikgeworICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9jYWxfZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3AtPnNldChvYmosIHZhbHVlLCBlcnJwKTsKKyAgICBnX2ZyZWUodmFsdWUpOworfQorCitzdGF0aWMgdm9pZCBwcm9wZXJ0eV9yZWxlYXNlX3N0cihPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBTdHJpbmdQcm9wZXJ0eSAqcHJvcCA9IG9wYXF1ZTsKKyAgICBnX2ZyZWUocHJvcCk7Cit9CisKK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2FkZF9zdHIoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICooKmdldCkoT2JqZWN0ICosIEVycm9yICoqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpzZXQpKE9iamVjdCAqLCBjb25zdCBjaGFyICosIEVycm9yICoqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICBTdHJpbmdQcm9wZXJ0eSAqcHJvcCA9IGdfbWFsbG9jMChzaXplb2YoKnByb3ApKTsKKworICAgIHByb3AtPmdldCA9IGdldDsKKyAgICBwcm9wLT5zZXQgPSBzZXQ7CisKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkKG9iaiwgbmFtZSwgInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXQgPyBwcm9wZXJ0eV9nZXRfc3RyIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldCA/IHByb3BlcnR5X3NldF9zdHIgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfcmVsZWFzZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLCBlcnJwKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgQm9vbFByb3BlcnR5Cit7CisgICAgYm9vbCAoKmdldCkoT2JqZWN0ICosIEVycm9yICoqKTsKKyAgICB2b2lkICgqc2V0KShPYmplY3QgKiwgYm9vbCwgRXJyb3IgKiopOworfSBCb29sUHJvcGVydHk7CisKK3N0YXRpYyB2b2lkIHByb3BlcnR5X2dldF9ib29sKE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgQm9vbFByb3BlcnR5ICpwcm9wID0gb3BhcXVlOworICAgIGJvb2wgdmFsdWU7CisKKyAgICB2YWx1ZSA9IHByb3AtPmdldChvYmosIGVycnApOworICAgIHZpc2l0X3R5cGVfYm9vbCh2LCAmdmFsdWUsIG5hbWUsIGVycnApOworfQorCitzdGF0aWMgdm9pZCBwcm9wZXJ0eV9zZXRfYm9vbChPYmplY3QgKm9iaiwgVmlzaXRvciAqdiwgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIEJvb2xQcm9wZXJ0eSAqcHJvcCA9IG9wYXF1ZTsKKyAgICBib29sIHZhbHVlOworICAgIEVycm9yICpsb2NhbF9lcnIgPSBOVUxMOworCisgICAgdmlzaXRfdHlwZV9ib29sKHYsICZ2YWx1ZSwgbmFtZSwgJmxvY2FsX2Vycik7CisgICAgaWYgKGxvY2FsX2VycikgeworICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgbG9jYWxfZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3AtPnNldChvYmosIHZhbHVlLCBlcnJwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcGVydHlfcmVsZWFzZV9ib29sKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBCb29sUHJvcGVydHkgKnByb3AgPSBvcGFxdWU7CisgICAgZ19mcmVlKHByb3ApOworfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfYm9vbChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCpnZXQpKE9iamVjdCAqLCBFcnJvciAqKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqc2V0KShPYmplY3QgKiwgYm9vbCwgRXJyb3IgKiopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIEJvb2xQcm9wZXJ0eSAqcHJvcCA9IGdfbWFsbG9jMChzaXplb2YoKnByb3ApKTsKKworICAgIHByb3AtPmdldCA9IGdldDsKKyAgICBwcm9wLT5zZXQgPSBzZXQ7CisKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkKG9iaiwgbmFtZSwgImJvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0ID8gcHJvcGVydHlfZ2V0X2Jvb2wgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID8gcHJvcGVydHlfc2V0X2Jvb2wgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfcmVsZWFzZV9ib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCwgZXJycCk7Cit9CisKK3N0YXRpYyBjaGFyICpxZGV2X2dldF90eXBlKE9iamVjdCAqb2JqLCBFcnJvciAqKmVycnApCit7CisgICAgcmV0dXJuIGdfc3RyZHVwKG9iamVjdF9nZXRfdHlwZW5hbWUob2JqKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3BlcnR5X2dldF91aW50OF9wdHIoT2JqZWN0ICpvYmosIFZpc2l0b3IgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIHVpbnQ4X3QgdmFsdWUgPSAqKHVpbnQ4X3QgKilvcGFxdWU7CisgICAgdmlzaXRfdHlwZV91aW50OCh2LCAmdmFsdWUsIG5hbWUsIGVycnApOworfQorCitzdGF0aWMgdm9pZCBwcm9wZXJ0eV9nZXRfdWludDE2X3B0cihPYmplY3QgKm9iaiwgVmlzaXRvciAqdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApCit7CisgICAgdWludDE2X3QgdmFsdWUgPSAqKHVpbnQxNl90ICopb3BhcXVlOworICAgIHZpc2l0X3R5cGVfdWludDE2KHYsICZ2YWx1ZSwgbmFtZSwgZXJycCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb3BlcnR5X2dldF91aW50MzJfcHRyKE9iamVjdCAqb2JqLCBWaXNpdG9yICp2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICoqZXJycCkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZSA9ICoodWludDMyX3QgKilvcGFxdWU7CisgICAgdmlzaXRfdHlwZV91aW50MzIodiwgJnZhbHVlLCBuYW1lLCBlcnJwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcGVydHlfZ2V0X3VpbnQ2NF9wdHIoT2JqZWN0ICpvYmosIFZpc2l0b3IgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3IgKiplcnJwKQoreworICAgIHVpbnQ2NF90IHZhbHVlID0gKih1aW50NjRfdCAqKW9wYXF1ZTsKKyAgICB2aXNpdF90eXBlX3VpbnQ2NCh2LCAmdmFsdWUsIG5hbWUsIGVycnApOworfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfdWludDhfcHRyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2LCBFcnJvciAqKmVycnApCit7CisgICAgb2JqZWN0X3Byb3BlcnR5X2FkZChvYmosIG5hbWUsICJ1aW50OCIsIHByb3BlcnR5X2dldF91aW50OF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAodm9pZCAqKXYsIGVycnApOworfQorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9hZGRfdWludDE2X3B0cihPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp2LCBFcnJvciAqKmVycnApCit7CisgICAgb2JqZWN0X3Byb3BlcnR5X2FkZChvYmosIG5hbWUsICJ1aW50MTYiLCBwcm9wZXJ0eV9nZXRfdWludDE2X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICh2b2lkICopdiwgZXJycCk7Cit9CisKK3ZvaWQgb2JqZWN0X3Byb3BlcnR5X2FkZF91aW50MzJfcHRyKE9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnYsIEVycm9yICoqZXJycCkKK3sKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkKG9iaiwgbmFtZSwgInVpbnQzMiIsIHByb3BlcnR5X2dldF91aW50MzJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgKHZvaWQgKil2LCBlcnJwKTsKK30KKwordm9pZCBvYmplY3RfcHJvcGVydHlfYWRkX3VpbnQ2NF9wdHIoT2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCAqdiwgRXJyb3IgKiplcnJwKQoreworICAgIG9iamVjdF9wcm9wZXJ0eV9hZGQob2JqLCBuYW1lLCAidWludDY0IiwgcHJvcGVydHlfZ2V0X3VpbnQ2NF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAodm9pZCAqKXYsIGVycnApOworfQorCitzdGF0aWMgdm9pZCBvYmplY3RfaW5zdGFuY2VfaW5pdChPYmplY3QgKm9iaikKK3sKKyAgICBvYmplY3RfcHJvcGVydHlfYWRkX3N0cihvYmosICJ0eXBlIiwgcWRldl9nZXRfdHlwZSwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3R5cGVzKHZvaWQpCit7CisgICAgc3RhdGljIFR5cGVJbmZvIGludGVyZmFjZV9pbmZvID0geworICAgICAgICAubmFtZSA9IFRZUEVfSU5URVJGQUNFLAorICAgICAgICAuY2xhc3Nfc2l6ZSA9IHNpemVvZihJbnRlcmZhY2VDbGFzcyksCisgICAgICAgIC5hYnN0cmFjdCA9IHRydWUsCisgICAgfTsKKworICAgIHN0YXRpYyBUeXBlSW5mbyBvYmplY3RfaW5mbyA9IHsKKyAgICAgICAgLm5hbWUgPSBUWVBFX09CSkVDVCwKKyAgICAgICAgLmluc3RhbmNlX3NpemUgPSBzaXplb2YoT2JqZWN0KSwKKyAgICAgICAgLmluc3RhbmNlX2luaXQgPSBvYmplY3RfaW5zdGFuY2VfaW5pdCwKKyAgICAgICAgLmFic3RyYWN0ID0gdHJ1ZSwKKyAgICB9OworCisgICAgdHlwZV9pbnRlcmZhY2UgPSB0eXBlX3JlZ2lzdGVyX2ludGVybmFsKCZpbnRlcmZhY2VfaW5mbyk7CisgICAgdHlwZV9yZWdpc3Rlcl9pbnRlcm5hbCgmb2JqZWN0X2luZm8pOworfQorCit0eXBlX2luaXQocmVnaXN0ZXJfdHlwZXMpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3FvbS9xb20tcW9iamVjdC5jIGIvYW5kcm9pZC9xZW11MS9xb20vcW9tLXFvYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg0YjhlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9xb20vcW9tLXFvYmplY3QuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogUUVNVSBPYmplY3QgTW9kZWwgLSBRT2JqZWN0IHdyYXBwZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBBdXRob3I6IFBhb2xvIEJvbnppbmkgPHBib256aW5pQHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicW9tL29iamVjdC5oIgorI2luY2x1ZGUgInFvbS9xb20tcW9iamVjdC5oIgorI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgorI2luY2x1ZGUgInFhcGkvcW1wLWlucHV0LXZpc2l0b3IuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC1vdXRwdXQtdmlzaXRvci5oIgorCit2b2lkIG9iamVjdF9wcm9wZXJ0eV9zZXRfcW9iamVjdChPYmplY3QgKm9iaiwgUU9iamVjdCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgUW1wSW5wdXRWaXNpdG9yICptaTsKKyAgICBtaSA9IHFtcF9pbnB1dF92aXNpdG9yX25ldyh2YWx1ZSk7CisgICAgb2JqZWN0X3Byb3BlcnR5X3NldChvYmosIHFtcF9pbnB1dF9nZXRfdmlzaXRvcihtaSksIG5hbWUsIGVycnApOworCisgICAgcW1wX2lucHV0X3Zpc2l0b3JfY2xlYW51cChtaSk7Cit9CisKK1FPYmplY3QgKm9iamVjdF9wcm9wZXJ0eV9nZXRfcW9iamVjdChPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAqKmVycnApCit7CisgICAgUU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKKyAgICBRbXBPdXRwdXRWaXNpdG9yICptbzsKKworICAgIG1vID0gcW1wX291dHB1dF92aXNpdG9yX25ldygpOworICAgIG9iamVjdF9wcm9wZXJ0eV9nZXQob2JqLCBxbXBfb3V0cHV0X2dldF92aXNpdG9yKG1vKSwgbmFtZSwgJmxvY2FsX2Vycik7CisgICAgaWYgKCFsb2NhbF9lcnIpIHsKKyAgICAgICAgcmV0ID0gcW1wX291dHB1dF9nZXRfcW9iamVjdChtbyk7CisgICAgfQorICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBsb2NhbF9lcnIpOworICAgIHFtcF9vdXRwdXRfdmlzaXRvcl9jbGVhbnVwKG1vKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zYXZldm0uYyBiL2FuZHJvaWQvcWVtdTEvc2F2ZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2ZDQxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2F2ZXZtLmMKQEAgLTAsMCArMSwyNzIzIEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisvKiBOZWVkZWQgZWFybHkgZm9yIENPTkZJR19CU0QgZXRjLiAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2lmZGVmIENPTkZJR19CU0QKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pCisjaW5jbHVkZSA8bGlidXRpbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDx1dGlsLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxwdHkuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2luY2x1ZGUgPG1tc3lzdGVtLmg+CisjZGVmaW5lIGdldG9wdF9sb25nX29ubHkgZ2V0b3B0X2xvbmcKKyNkZWZpbmUgbWVtYWxpZ24oYWxpZ24sIHNpemUpIG1hbGxvYyhzaXplKQorI2VuZGlmCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvcWRldi5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJzeXNlbXUvYmxvY2tkZXYuaCIKKyNpbmNsdWRlICJibG9jay9ibG9jay5oIgorI2luY2x1ZGUgImF1ZGlvL2F1ZGlvLmgiCisjaW5jbHVkZSAibWlncmF0aW9uL21pZ3JhdGlvbi5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vdm1zdGF0ZS5oIgorI2luY2x1ZGUgInFlbXUvYml0bWFwLmgiCisjaW5jbHVkZSAicWVtdS9pb3YuaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvc25hcHNob3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaCIKKworI2RlZmluZSBTRUxGX0FOTk9VTkNFX1JPVU5EUyA1CisKKyNpZm5kZWYgRVRIX1BfUkFSUAorI2RlZmluZSBFVEhfUF9SQVJQIDB4ODAzNQorI2VuZGlmCisjZGVmaW5lIEFSUF9IVFlQRV9FVEggMHgwMDAxCisjZGVmaW5lIEFSUF9QVFlQRV9JUCAweDA4MDAKKyNkZWZpbmUgQVJQX09QX1JFUVVFU1RfUkVWIDB4MworCitzdGF0aWMgaW50IGFubm91bmNlX3NlbGZfY3JlYXRlKHVpbnQ4X3QgKmJ1ZiwKKwkJCQl1aW50OF90ICptYWNfYWRkcikKK3sKKyAgICAvKiBFdGhlcm5ldCBoZWFkZXIuICovCisgICAgbWVtc2V0KGJ1ZiwgMHhmZiwgNik7ICAgICAgICAgLyogZGVzdGluYXRpb24gTUFDIGFkZHIgKi8KKyAgICBtZW1jcHkoYnVmICsgNiwgbWFjX2FkZHIsIDYpOyAvKiBzb3VyY2UgTUFDIGFkZHIgKi8KKyAgICAqKHVpbnQxNl90ICopKGJ1ZiArIDEyKSA9IGh0b25zKEVUSF9QX1JBUlApOyAvKiBldGhlcnR5cGUgKi8KKworICAgIC8qIFJBUlAgaGVhZGVyLiAqLworICAgICoodWludDE2X3QgKikoYnVmICsgMTQpID0gaHRvbnMoQVJQX0hUWVBFX0VUSCk7IC8qIGhhcmR3YXJlIGFkZHIgc3BhY2UgKi8KKyAgICAqKHVpbnQxNl90ICopKGJ1ZiArIDE2KSA9IGh0b25zKEFSUF9QVFlQRV9JUCk7IC8qIHByb3RvY29sIGFkZHIgc3BhY2UgKi8KKyAgICAqKGJ1ZiArIDE4KSA9IDY7IC8qIGhhcmR3YXJlIGFkZHIgbGVuZ3RoIChldGhlcm5ldCkgKi8KKyAgICAqKGJ1ZiArIDE5KSA9IDQ7IC8qIHByb3RvY29sIGFkZHIgbGVuZ3RoIChJUHY0KSAqLworICAgICoodWludDE2X3QgKikoYnVmICsgMjApID0gaHRvbnMoQVJQX09QX1JFUVVFU1RfUkVWKTsgLyogb3Bjb2RlICovCisgICAgbWVtY3B5KGJ1ZiArIDIyLCBtYWNfYWRkciwgNik7IC8qIHNvdXJjZSBodyBhZGRyICovCisgICAgbWVtc2V0KGJ1ZiArIDI4LCAweDAwLCA0KTsgICAgIC8qIHNvdXJjZSBwcm90b2NvbCBhZGRyICovCisgICAgbWVtY3B5KGJ1ZiArIDMyLCBtYWNfYWRkciwgNik7IC8qIHRhcmdldCBodyBhZGRyICovCisgICAgbWVtc2V0KGJ1ZiArIDM4LCAweDAwLCA0KTsgICAgIC8qIHRhcmdldCBwcm90b2NvbCBhZGRyICovCisKKyAgICAvKiBQYWRkaW5nIHRvIGdldCB1cCB0byA2MCBieXRlcyAoZXRoZXJuZXQgbWluIHBhY2tldCBzaXplLCBtaW51cyBGQ1MpLiAqLworICAgIG1lbXNldChidWYgKyA0MiwgMHgwMCwgMTgpOworCisgICAgcmV0dXJuIDYwOyAvKiBsZW4gKEZDUyB3aWxsIGJlIGFkZGVkIGJ5IGhhcmR3YXJlKSAqLworfQorCitzdGF0aWMgdm9pZCBxZW11X2Fubm91bmNlX3NlbGZfb25jZSh2b2lkICpvcGFxdWUpCit7CisgICAgaW50IGksIGxlbjsKKyAgICBWTEFOU3RhdGUgKnZsYW47CisgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKyAgICB1aW50OF90IGJ1ZlsyNTZdOworICAgIHN0YXRpYyBpbnQgY291bnQgPSBTRUxGX0FOTk9VTkNFX1JPVU5EUzsKKyAgICBRRU1VVGltZXIgKnRpbWVyID0gKihRRU1VVGltZXIgKiopb3BhcXVlOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OSUNTOyBpKyspIHsKKyAgICAgICAgaWYgKCFuZF90YWJsZVtpXS51c2VkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGxlbiA9IGFubm91bmNlX3NlbGZfY3JlYXRlKGJ1ZiwgbmRfdGFibGVbaV0ubWFjYWRkcik7CisgICAgICAgIHZsYW4gPSBuZF90YWJsZVtpXS52bGFuOworCWZvcih2YyA9IHZsYW4tPmZpcnN0X2NsaWVudDsgdmMgIT0gTlVMTDsgdmMgPSB2Yy0+bmV4dCkgeworICAgICAgICAgICAgdmMtPnJlY2VpdmUodmMsIGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoLS1jb3VudCkgeworICAgICAgICAvKiBkZWxheSA1MG1zLCAxNTBtcywgMjUwbXMsIC4uLiAqLworICAgICAgICB0aW1lcl9tb2QodGltZXIsIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgNTAgKyAoU0VMRl9BTk5PVU5DRV9ST1VORFMgLSBjb3VudCAtIDEpICogMTAwKTsKKyAgICB9IGVsc2UgeworCSAgICB0aW1lcl9kZWwodGltZXIpOworCSAgICB0aW1lcl9mcmVlKHRpbWVyKTsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9hbm5vdW5jZV9zZWxmKHZvaWQpCit7CisJc3RhdGljIFFFTVVUaW1lciAqdGltZXI7CisJdGltZXIgPSB0aW1lcl9uZXdfbXMoUUVNVV9DTE9DS19SRUFMVElNRSwgcWVtdV9hbm5vdW5jZV9zZWxmX29uY2UsICZ0aW1lcik7CisJcWVtdV9hbm5vdW5jZV9zZWxmX29uY2UoJnRpbWVyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogc2F2ZXZtL2xvYWR2bSBzdXBwb3J0ICovCisKK3ZvaWQgeWllbGRfdW50aWxfZmRfcmVhZGFibGUoaW50IGZkKTsKKworI2RlZmluZSBJT19CVUZfU0laRSAzMjc2OAorI2RlZmluZSBNQVhfSU9WX1NJWkUgTUlOKElPVl9NQVgsIDY0KQorCitzdHJ1Y3QgUUVNVUZpbGUgeworICAgIGNvbnN0IFFFTVVGaWxlT3BzICpvcHM7CisgICAgdm9pZCAqb3BhcXVlOworCisgICAgaW50NjRfdCBieXRlc194ZmVyOworICAgIGludDY0X3QgeGZlcl9saW1pdDsKKworICAgIGludDY0X3QgcG9zOyAvKiBzdGFydCBvZiBidWZmZXIgd2hlbiB3cml0aW5nLCBlbmQgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHdoZW4gcmVhZGluZyAqLworICAgIGludCBidWZfaW5kZXg7CisgICAgaW50IGJ1Zl9zaXplOyAvKiAwIHdoZW4gd3JpdGluZyAqLworICAgIHVpbnQ4X3QgYnVmW0lPX0JVRl9TSVpFXTsKKworICAgIHN0cnVjdCBpb3ZlYyBpb3ZbTUFYX0lPVl9TSVpFXTsKKyAgICB1bnNpZ25lZCBpbnQgaW92Y250OworCisgICAgaW50IGxhc3RfZXJyb3I7Cit9OworCit0eXBlZGVmIHN0cnVjdCBRRU1VRmlsZVN0ZGlvCit7CisgICAgRklMRSAqc3RkaW9fZmlsZTsKKyAgICBRRU1VRmlsZSAqZmlsZTsKK30gUUVNVUZpbGVTdGRpbzsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVUZpbGVTb2NrZXQKK3sKKyAgICBpbnQgZmQ7CisgICAgUUVNVUZpbGUgKmZpbGU7Cit9IFFFTVVGaWxlU29ja2V0OworCitzdGF0aWMgc3NpemVfdCBzb2NrZXRfd3JpdGV2X2J1ZmZlcih2b2lkICpvcGFxdWUsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MpCit7CisgICAgUUVNVUZpbGVTb2NrZXQgKnMgPSBvcGFxdWU7CisgICAgc3NpemVfdCBsZW47CisgICAgc3NpemVfdCBzaXplID0gaW92X3NpemUoaW92LCBpb3ZjbnQpOworCisgICAgbGVuID0gaW92X3NlbmQocy0+ZmQsIGlvdiwgaW92Y250LCAwLCBzaXplKTsKKyAgICBpZiAobGVuIDwgc2l6ZSkgeworICAgICAgICBsZW4gPSAtc29ja2V0X2Vycm9yKCk7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgc29ja2V0X2dldF9mZCh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVTb2NrZXQgKnMgPSBvcGFxdWU7CisKKyAgICByZXR1cm4gcy0+ZmQ7Cit9CisKK3N0YXRpYyBpbnQgc29ja2V0X2dldF9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludDY0X3QgcG9zLCBpbnQgc2l6ZSkKK3sKKyAgICBRRU1VRmlsZVNvY2tldCAqcyA9IG9wYXF1ZTsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gcWVtdV9yZWN2KHMtPmZkLCBidWYsIHNpemUsIDApOworICAgICAgICBpZiAobGVuICE9IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgICAgICBpZiAoc29ja2V0X2Vycm9yKCkgPT0gRUFHQUlOKSB7CisgICAgICAgICAgICB5aWVsZF91bnRpbF9mZF9yZWFkYWJsZShzLT5mZCk7CisgICAgICAgIH0gZWxzZSBpZiAoc29ja2V0X2Vycm9yKCkgIT0gRUlOVFIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZWxzZQorICAgICAgIGlmIChzb2NrZXRfZXJyb3IoKSAhPSBFSU5UUikKKyAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobGVuID09IC0xKSB7CisgICAgICAgIGxlbiA9IC1zb2NrZXRfZXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBmaWxlX3NvY2tldF9jbG9zZSh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVTb2NrZXQgKnMgPSBvcGFxdWU7CisgICAgaWYgKHMtPmZkID49IDApCisgICAgICAgIHNvY2tldF9jbG9zZShzLT5mZCk7CisgICAgZ19mcmVlKHMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0ZGlvX2dldF9mZCh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVTdGRpbyAqcyA9IG9wYXF1ZTsKKworICAgIHJldHVybiBmaWxlbm8ocy0+c3RkaW9fZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc3RkaW9fcHV0X2J1ZmZlcih2b2lkICpvcGFxdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50NjRfdCBwb3MsIGludCBzaXplKQoreworICAgIFFFTVVGaWxlU3RkaW8gKnMgPSBvcGFxdWU7CisgICAgcmV0dXJuIGZ3cml0ZShidWYsIDEsIHNpemUsIHMtPnN0ZGlvX2ZpbGUpOworfQorCitzdGF0aWMgaW50IHN0ZGlvX2dldF9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludDY0X3QgcG9zLCBpbnQgc2l6ZSkKK3sKKyAgICBRRU1VRmlsZVN0ZGlvICpzID0gb3BhcXVlOworICAgIEZJTEUgKmZwID0gcy0+c3RkaW9fZmlsZTsKKyAgICBpbnQgYnl0ZXM7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgYnl0ZXMgPSBmcmVhZChidWYsIDEsIHNpemUsIGZwKTsKKyAgICAgICAgaWYgKGJ5dGVzICE9IDAgfHwgIWZlcnJvcihmcCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgIHlpZWxkX3VudGlsX2ZkX3JlYWRhYmxlKGZpbGVubyhmcCkpOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKGVycm5vICE9IEVJTlRSKQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIGJ5dGVzOworfQorCitzdGF0aWMgaW50IHN0ZGlvX3BjbG9zZSh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVTdGRpbyAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgcmV0OworICAgIHJldCA9IHBjbG9zZShzLT5zdGRpb19maWxlKTsKKyAgICBpZiAocmV0ID09IC0xKSB7CisgICAgICAgIHJldCA9IC1lcnJubzsKKyAgICB9IGVsc2UgaWYgKCFXSUZFWElURUQocmV0KSB8fCBXRVhJVFNUQVRVUyhyZXQpICE9IDApIHsKKyAgICAgICAgLyogY2xvc2Ugc3VjY2VlZGVkLCBidXQgbm9uLXplcm8gZXhpdCBjb2RlOiAqLworICAgICAgICByZXQgPSAtRUlPOyAvKiBmYWtlIGVycm5vIHZhbHVlICovCisgICAgfQorICAgIGdfZnJlZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0ZGlvX2ZjbG9zZSh2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVUZpbGVTdGRpbyAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChzLT5maWxlLT5vcHMtPnB1dF9idWZmZXIgfHwgcy0+ZmlsZS0+b3BzLT53cml0ZXZfYnVmZmVyKSB7CisgICAgICAgIGludCBmZCA9IGZpbGVubyhzLT5zdGRpb19maWxlKTsKKyAgICAgICAgc3RydWN0IHN0YXQgc3Q7CisKKyAgICAgICAgcmV0ID0gZnN0YXQoZmQsICZzdCk7CisgICAgICAgIGlmIChyZXQgPT0gMCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlIGZpbGUgaGFuZGxlIGlzIGEgcmVndWxhciBmaWxlIG1ha2Ugc3VyZSB0aGUKKyAgICAgICAgICAgICAqIGRhdGEgaXMgZmx1c2hlZCB0byBkaXNrIGJlZm9yZSBzaWduYWxpbmcgc3VjY2Vzcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0ID0gZnN5bmMoZmQpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLWVycm5vOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZjbG9zZShzLT5zdGRpb19maWxlKSA9PSBFT0YpIHsKKyAgICAgICAgcmV0ID0gLWVycm5vOworICAgIH0KKyAgICBnX2ZyZWUocyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IFFFTVVGaWxlT3BzIHN0ZGlvX3BpcGVfcmVhZF9vcHMgPSB7CisgICAgLmdldF9mZCA9ICAgICBzdGRpb19nZXRfZmQsCisgICAgLmdldF9idWZmZXIgPSBzdGRpb19nZXRfYnVmZmVyLAorICAgIC5jbG9zZSA9ICAgICAgc3RkaW9fcGNsb3NlCit9OworCitzdGF0aWMgY29uc3QgUUVNVUZpbGVPcHMgc3RkaW9fcGlwZV93cml0ZV9vcHMgPSB7CisgICAgLmdldF9mZCA9ICAgICBzdGRpb19nZXRfZmQsCisgICAgLnB1dF9idWZmZXIgPSBzdGRpb19wdXRfYnVmZmVyLAorICAgIC5jbG9zZSA9ICAgICAgc3RkaW9fcGNsb3NlCit9OworCitRRU1VRmlsZSAqcWVtdV9wb3Blbl9jbWQoY29uc3QgY2hhciAqY29tbWFuZCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKyAgICBGSUxFICpzdGRpb19maWxlOworICAgIFFFTVVGaWxlU3RkaW8gKnM7CisKKyAgICBpZiAobW9kZSA9PSBOVUxMIHx8IChtb2RlWzBdICE9ICdyJyAmJiBtb2RlWzBdICE9ICd3JykgfHwgbW9kZVsxXSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdV9wb3BlbjogQXJndW1lbnQgdmFsaWRpdHkgY2hlY2sgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RkaW9fZmlsZSA9IGFuZHJvaWRfcG9wZW4oY29tbWFuZCwgbW9kZSk7CisgICAgaWYgKHN0ZGlvX2ZpbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihRRU1VRmlsZVN0ZGlvKSk7CisKKyAgICBzLT5zdGRpb19maWxlID0gc3RkaW9fZmlsZTsKKworICAgIGlmKG1vZGVbMF0gPT0gJ3InKSB7CisgICAgICAgIHMtPmZpbGUgPSBxZW11X2ZvcGVuX29wcyhzLCAmc3RkaW9fcGlwZV9yZWFkX29wcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZmlsZSA9IHFlbXVfZm9wZW5fb3BzKHMsICZzdGRpb19waXBlX3dyaXRlX29wcyk7CisgICAgfQorICAgIHJldHVybiBzLT5maWxlOworfQorCitzdGF0aWMgY29uc3QgUUVNVUZpbGVPcHMgc3RkaW9fZmlsZV9yZWFkX29wcyA9IHsKKyAgICAuZ2V0X2ZkID0gICAgIHN0ZGlvX2dldF9mZCwKKyAgICAuZ2V0X2J1ZmZlciA9IHN0ZGlvX2dldF9idWZmZXIsCisgICAgLmNsb3NlID0gICAgICBzdGRpb19mY2xvc2UKK307CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyBzdGRpb19maWxlX3dyaXRlX29wcyA9IHsKKyAgICAuZ2V0X2ZkID0gICAgIHN0ZGlvX2dldF9mZCwKKyAgICAucHV0X2J1ZmZlciA9IHN0ZGlvX3B1dF9idWZmZXIsCisgICAgLmNsb3NlID0gICAgICBzdGRpb19mY2xvc2UKK307CisKK3N0YXRpYyBzc2l6ZV90IHVuaXhfd3JpdGV2X2J1ZmZlcih2b2lkICpvcGFxdWUsIHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zKQoreworICAgIFFFTVVGaWxlU29ja2V0ICpzID0gb3BhcXVlOworICAgIHNzaXplX3QgbGVuLCBvZmZzZXQ7CisgICAgc3NpemVfdCBzaXplID0gaW92X3NpemUoaW92LCBpb3ZjbnQpOworICAgIHNzaXplX3QgdG90YWwgPSAwOworCisgICAgYXNzZXJ0KGlvdmNudCA+IDApOworICAgIG9mZnNldCA9IDA7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIC8qIEZpbmQgdGhlIG5leHQgc3RhcnQgcG9zaXRpb247IHNraXAgYWxsIGZ1bGwtc2l6ZWQgdmVjdG9yIGVsZW1lbnRzICAqLworICAgICAgICB3aGlsZSAob2Zmc2V0ID49IChzc2l6ZV90KWlvdlswXS5pb3ZfbGVuKSB7CisgICAgICAgICAgICBvZmZzZXQgLT0gaW92WzBdLmlvdl9sZW47CisgICAgICAgICAgICBpb3YrKywgaW92Y250LS07CisgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIGBvZmZzZXQnIGJ5dGVzIGZyb20gdGhlIChub3cpIGZpcnN0IGVsZW1lbnQsIHVuZG8gaXQgb24gZXhpdCAqLworICAgICAgICBhc3NlcnQoaW92Y250ID4gMCk7CisgICAgICAgIGlvdlswXS5pb3ZfYmFzZSArPSBvZmZzZXQ7CisgICAgICAgIGlvdlswXS5pb3ZfbGVuIC09IG9mZnNldDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsZW4gPSB3cml0ZXYocy0+ZmQsIGlvdiwgaW92Y250KTsKKyAgICAgICAgfSB3aGlsZSAobGVuID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKyAgICAgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFVuZG8gdGhlIGNoYW5nZXMgYWJvdmUgKi8KKyAgICAgICAgaW92WzBdLmlvdl9iYXNlIC09IG9mZnNldDsKKyAgICAgICAgaW92WzBdLmlvdl9sZW4gKz0gb2Zmc2V0OworCisgICAgICAgIC8qIFByZXBhcmUgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgICBvZmZzZXQgKz0gbGVuOworICAgICAgICB0b3RhbCArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgIH0KKworICAgIHJldHVybiB0b3RhbDsKK30KKworc3RhdGljIGludCB1bml4X2dldF9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludDY0X3QgcG9zLCBpbnQgc2l6ZSkKK3sKKyAgICBRRU1VRmlsZVNvY2tldCAqcyA9IG9wYXF1ZTsKKyAgICBzc2l6ZV90IGxlbjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgbGVuID0gcmVhZChzLT5mZCwgYnVmLCBzaXplKTsKKyAgICAgICAgaWYgKGxlbiAhPSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTikgeworICAgICAgICAgICAgeWllbGRfdW50aWxfZmRfcmVhZGFibGUocy0+ZmQpOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsZW4gPT0gLTEpIHsKKyAgICAgICAgbGVuID0gLWVycm5vOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHVuaXhfY2xvc2Uodm9pZCAqb3BhcXVlKQoreworICAgIFFFTVVGaWxlU29ja2V0ICpzID0gb3BhcXVlOworICAgIGNsb3NlKHMtPmZkKTsKKyAgICBnX2ZyZWUocyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyB1bml4X3JlYWRfb3BzID0geworICAgIC5nZXRfZmQgPSAgICAgc29ja2V0X2dldF9mZCwKKyAgICAuZ2V0X2J1ZmZlciA9IHVuaXhfZ2V0X2J1ZmZlciwKKyAgICAuY2xvc2UgPSAgICAgIHVuaXhfY2xvc2UKK307CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyB1bml4X3dyaXRlX29wcyA9IHsKKyAgICAuZ2V0X2ZkID0gICAgIHNvY2tldF9nZXRfZmQsCisgICAgLndyaXRldl9idWZmZXIgPSB1bml4X3dyaXRldl9idWZmZXIsCisgICAgLmNsb3NlID0gICAgICB1bml4X2Nsb3NlCit9OworCitRRU1VRmlsZSAqcWVtdV9mZG9wZW4oaW50IGZkLCBjb25zdCBjaGFyICptb2RlKQoreworICAgIFFFTVVGaWxlU29ja2V0ICpzOworCisgICAgaWYgKG1vZGUgPT0gTlVMTCB8fAorCShtb2RlWzBdICE9ICdyJyAmJiBtb2RlWzBdICE9ICd3JykgfHwKKwltb2RlWzFdICE9ICdiJyB8fCBtb2RlWzJdICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11X2Zkb3BlbjogQXJndW1lbnQgdmFsaWRpdHkgY2hlY2sgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoUUVNVUZpbGVTb2NrZXQpKTsKKyAgICBzLT5mZCA9IGZkOworCisgICAgaWYobW9kZVswXSA9PSAncicpIHsKKyAgICAgICAgcy0+ZmlsZSA9IHFlbXVfZm9wZW5fb3BzKHMsICZ1bml4X3JlYWRfb3BzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5maWxlID0gcWVtdV9mb3Blbl9vcHMocywgJnVuaXhfd3JpdGVfb3BzKTsKKyAgICB9CisgICAgcmV0dXJuIHMtPmZpbGU7Cit9CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyBzb2NrZXRfcmVhZF9vcHMgPSB7CisgICAgLmdldF9mZCA9ICAgICBzb2NrZXRfZ2V0X2ZkLAorICAgIC5nZXRfYnVmZmVyID0gc29ja2V0X2dldF9idWZmZXIsCisgICAgLmNsb3NlID0gZmlsZV9zb2NrZXRfY2xvc2UKK307CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyBzb2NrZXRfd3JpdGVfb3BzID0geworICAgIC5nZXRfZmQgPSAgICAgc29ja2V0X2dldF9mZCwKKyAgICAud3JpdGV2X2J1ZmZlciA9IHNvY2tldF93cml0ZXZfYnVmZmVyLAorICAgIC5jbG9zZSA9IGZpbGVfc29ja2V0X2Nsb3NlCit9OworCitib29sIHFlbXVfZmlsZV9tb2RlX2lzX25vdF92YWxpZChjb25zdCBjaGFyICptb2RlKQoreworICAgIGlmIChtb2RlID09IE5VTEwgfHwKKyAgICAgICAgKG1vZGVbMF0gIT0gJ3InICYmIG1vZGVbMF0gIT0gJ3cnKSB8fAorICAgICAgICBtb2RlWzFdICE9ICdiJyB8fCBtb2RlWzJdICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11X2ZvcGVuOiBBcmd1bWVudCB2YWxpZGl0eSBjaGVjayBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1FFTVVGaWxlICpxZW11X2ZvcGVuX3NvY2tldChpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisgICAgUUVNVUZpbGVTb2NrZXQgKnM7CisKKyAgICBpZiAocWVtdV9maWxlX21vZGVfaXNfbm90X3ZhbGlkKG1vZGUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFFFTVVGaWxlU29ja2V0KSk7CisgICAgcy0+ZmQgPSBmZDsKKyAgICBpZiAobW9kZVswXSA9PSAndycpIHsKKyAgICAgICAgcWVtdV9zZXRfYmxvY2socy0+ZmQpOworICAgICAgICBzLT5maWxlID0gcWVtdV9mb3Blbl9vcHMocywgJnNvY2tldF93cml0ZV9vcHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZpbGUgPSBxZW11X2ZvcGVuX29wcyhzLCAmc29ja2V0X3JlYWRfb3BzKTsKKyAgICB9CisgICAgcmV0dXJuIHMtPmZpbGU7Cit9CisKK1FFTVVGaWxlICpxZW11X2ZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKQoreworICAgIFFFTVVGaWxlU3RkaW8gKnM7CisKKyAgICBpZiAocWVtdV9maWxlX21vZGVfaXNfbm90X3ZhbGlkKG1vZGUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFFFTVVGaWxlU3RkaW8pKTsKKworICAgIHMtPnN0ZGlvX2ZpbGUgPSBmb3BlbihmaWxlbmFtZSwgbW9kZSk7CisgICAgaWYgKCFzLT5zdGRpb19maWxlKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZihtb2RlWzBdID09ICd3JykgeworICAgICAgICBzLT5maWxlID0gcWVtdV9mb3Blbl9vcHMocywgJnN0ZGlvX2ZpbGVfd3JpdGVfb3BzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5maWxlID0gcWVtdV9mb3Blbl9vcHMocywgJnN0ZGlvX2ZpbGVfcmVhZF9vcHMpOworICAgIH0KKyAgICByZXR1cm4gcy0+ZmlsZTsKK2ZhaWw6CisgICAgZ19mcmVlKHMpOworICAgIHJldHVybiBOVUxMOworfQorCisjaWZuZGVmIENPTkZJR19BTkRST0lECisvLyBUT0RPKGRpZ2l0KTogT25jZSBiZHJ2X3dyaXRldl92bXN0YXRlKCkgaXMgaW1wbGVtZW50ZWQuCitzdGF0aWMgc3NpemVfdCBibG9ja193cml0ZXZfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zKQoreworICAgIGludCByZXQ7CisgICAgUUVNVUlPVmVjdG9yIHFpb3Y7CisKKyAgICBxZW11X2lvdmVjX2luaXRfZXh0ZXJuYWwoJnFpb3YsIGlvdiwgaW92Y250KTsKKyAgICByZXQgPSBiZHJ2X3dyaXRldl92bXN0YXRlKG9wYXF1ZSwgJnFpb3YsIHBvcyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcWlvdi5zaXplOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYmxvY2tfcHV0X2J1ZmZlcih2b2lkICpvcGFxdWUsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zLCBpbnQgc2l6ZSkKK3sKKyAgICBiZHJ2X3NhdmVfdm1zdGF0ZShvcGFxdWUsIGJ1ZiwgcG9zLCBzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBibG9ja19nZXRfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQ2NF90IHBvcywgaW50IHNpemUpCit7CisgICAgcmV0dXJuIGJkcnZfbG9hZF92bXN0YXRlKG9wYXF1ZSwgYnVmLCBwb3MsIHNpemUpOworfQorCitzdGF0aWMgaW50IGJkcnZfZmNsb3NlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICAvLyBUT0RPKGRpZ2l0KTogYmRydl9mbHVzaCgpIHNob3VsZCByZXR1cm4gZXJyb3IgY29kZS4KKyAgICBiZHJ2X2ZsdXNoKG9wYXF1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBRRU1VRmlsZU9wcyBiZHJ2X3JlYWRfb3BzID0geworICAgIC5nZXRfYnVmZmVyID0gYmxvY2tfZ2V0X2J1ZmZlciwKKyAgICAuY2xvc2UgPSAgICAgIGJkcnZfZmNsb3NlCit9OworCitzdGF0aWMgY29uc3QgUUVNVUZpbGVPcHMgYmRydl93cml0ZV9vcHMgPSB7CisgICAgLnB1dF9idWZmZXIgICAgID0gYmxvY2tfcHV0X2J1ZmZlciwKKyAgICAvLy53cml0ZXZfYnVmZmVyICA9IGJsb2NrX3dyaXRldl9idWZmZXIsCisgICAgLmNsb3NlICAgICAgICAgID0gYmRydl9mY2xvc2UKK307CisKK3N0YXRpYyBRRU1VRmlsZSAqcWVtdV9mb3Blbl9iZHJ2KEJsb2NrRHJpdmVyU3RhdGUgKmJzLCBpbnQgaXNfd3JpdGFibGUpCit7CisgICAgaWYgKGlzX3dyaXRhYmxlKQorICAgICAgICByZXR1cm4gcWVtdV9mb3Blbl9vcHMoYnMsICZiZHJ2X3dyaXRlX29wcyk7CisgICAgcmV0dXJuIHFlbXVfZm9wZW5fb3BzKGJzLCAmYmRydl9yZWFkX29wcyk7Cit9CisKK1FFTVVGaWxlICpxZW11X2ZvcGVuX29wcyh2b2lkICpvcGFxdWUsIGNvbnN0IFFFTVVGaWxlT3BzICpvcHMpCit7CisgICAgUUVNVUZpbGUgKmY7CisKKyAgICBmID0gZ19tYWxsb2MwKHNpemVvZihRRU1VRmlsZSkpOworCisgICAgZi0+b3BhcXVlID0gb3BhcXVlOworICAgIGYtPm9wcyA9IG9wczsKKyAgICByZXR1cm4gZjsKK30KKworLyoKKyAqIEdldCBsYXN0IGVycm9yIGZvciBzdHJlYW0gZgorICoKKyAqIFJldHVybiBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvciBvbiBwcmV2aW91cworICogb3BlcmF0aW9ucywgcmV0dXJuIDAgaWYgbm8gZXJyb3IgaGFwcGVuZWQuCisgKgorICovCitpbnQgcWVtdV9maWxlX2dldF9lcnJvcihRRU1VRmlsZSAqZikKK3sKKyAgICByZXR1cm4gZi0+bGFzdF9lcnJvcjsKK30KKwordm9pZCBxZW11X2ZpbGVfc2V0X2Vycm9yKFFFTVVGaWxlICpmLCBpbnQgcmV0KQoreworICAgIGlmIChmLT5sYXN0X2Vycm9yID09IDApIHsKKyAgICAgICAgZi0+bGFzdF9lcnJvciA9IHJldDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBxZW11X2ZpbGVfaXNfd3JpdGFibGUoUUVNVUZpbGUgKmYpCit7CisgICAgcmV0dXJuIGYtPm9wcy0+d3JpdGV2X2J1ZmZlciB8fCBmLT5vcHMtPnB1dF9idWZmZXI7Cit9CisKKy8qKgorICogRmx1c2hlcyBRRU1VRmlsZSBidWZmZXIKKyAqCisgKiBJZiB0aGVyZSBpcyB3cml0ZXZfYnVmZmVyIFFFTVVGaWxlT3BzIGl0IHVzZXMgaXQgb3RoZXJ3aXNlIHVzZXMKKyAqIHB1dF9idWZmZXIgb3BzLgorICovCit2b2lkIHFlbXVfZmZsdXNoKFFFTVVGaWxlICpmKQoreworICAgIHNzaXplX3QgcmV0ID0gMDsKKworICAgIGlmICghcWVtdV9maWxlX2lzX3dyaXRhYmxlKGYpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZi0+b3BzLT53cml0ZXZfYnVmZmVyKSB7CisgICAgICAgIGlmIChmLT5pb3ZjbnQgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBmLT5vcHMtPndyaXRldl9idWZmZXIoZi0+b3BhcXVlLCBmLT5pb3YsIGYtPmlvdmNudCwgZi0+cG9zKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmLT5idWZfaW5kZXggPiAwKSB7CisgICAgICAgICAgICByZXQgPSBmLT5vcHMtPnB1dF9idWZmZXIoZi0+b3BhcXVlLCBmLT5idWYsIGYtPnBvcywgZi0+YnVmX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgZi0+cG9zICs9IHJldDsKKyAgICB9CisgICAgZi0+YnVmX2luZGV4ID0gMDsKKyAgICBmLT5pb3ZjbnQgPSAwOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHFlbXVfZmlsZV9zZXRfZXJyb3IoZiwgcmV0KTsKKyAgICB9Cit9CisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKy8vIFRPRE8oZGlnaXQpLgordm9pZCByYW1fY29udHJvbF9iZWZvcmVfaXRlcmF0ZShRRU1VRmlsZSAqZiwgdWludDY0X3QgZmxhZ3MpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZi0+b3BzLT5iZWZvcmVfcmFtX2l0ZXJhdGUpIHsKKyAgICAgICAgcmV0ID0gZi0+b3BzLT5iZWZvcmVfcmFtX2l0ZXJhdGUoZiwgZi0+b3BhcXVlLCBmbGFncyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBxZW11X2ZpbGVfc2V0X2Vycm9yKGYsIHJldCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgcmFtX2NvbnRyb2xfYWZ0ZXJfaXRlcmF0ZShRRU1VRmlsZSAqZiwgdWludDY0X3QgZmxhZ3MpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZi0+b3BzLT5hZnRlcl9yYW1faXRlcmF0ZSkgeworICAgICAgICByZXQgPSBmLT5vcHMtPmFmdGVyX3JhbV9pdGVyYXRlKGYsIGYtPm9wYXF1ZSwgZmxhZ3MpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcWVtdV9maWxlX3NldF9lcnJvcihmLCByZXQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHJhbV9jb250cm9sX2xvYWRfaG9vayhRRU1VRmlsZSAqZiwgdWludDY0X3QgZmxhZ3MpCit7CisgICAgaW50IHJldCA9IC1FSU5WQUw7CisKKyAgICBpZiAoZi0+b3BzLT5ob29rX3JhbV9sb2FkKSB7CisgICAgICAgIHJldCA9IGYtPm9wcy0+aG9va19yYW1fbG9hZChmLCBmLT5vcGFxdWUsIGZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHFlbXVfZmlsZV9zZXRfZXJyb3IoZiwgcmV0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHFlbXVfZmlsZV9zZXRfZXJyb3IoZiwgcmV0KTsKKyAgICB9Cit9CisKK3NpemVfdCByYW1fY29udHJvbF9zYXZlX3BhZ2UoUUVNVUZpbGUgKmYsIHJhbV9hZGRyX3QgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgaW50ICpieXRlc19zZW50KQoreworICAgIGlmIChmLT5vcHMtPnNhdmVfcGFnZSkgeworICAgICAgICBpbnQgcmV0ID0gZi0+b3BzLT5zYXZlX3BhZ2UoZiwgZi0+b3BhcXVlLCBibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsIGJ5dGVzX3NlbnQpOworCisgICAgICAgIGlmIChyZXQgIT0gUkFNX1NBVkVfQ09OVFJPTF9ERUxBWUVEKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXNfc2VudCAmJiAqYnl0ZXNfc2VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBxZW11X3VwZGF0ZV9wb3NpdGlvbihmLCAqYnl0ZXNfc2VudCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBxZW11X2ZpbGVfc2V0X2Vycm9yKGYsIHJldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBSQU1fU0FWRV9DT05UUk9MX05PVF9TVVBQOworfQorI2VuZGlmICAvLyAhQ09ORklHX0FORFJPSUQKKworc3RhdGljIHZvaWQgcWVtdV9maWxsX2J1ZmZlcihRRU1VRmlsZSAqZikKK3sKKyAgICBpbnQgbGVuOworICAgIGludCBwZW5kaW5nOworCisgICAgYXNzZXJ0KCFxZW11X2ZpbGVfaXNfd3JpdGFibGUoZikpOworCisgICAgcGVuZGluZyA9IGYtPmJ1Zl9zaXplIC0gZi0+YnVmX2luZGV4OworICAgIGlmIChwZW5kaW5nID4gMCkgeworICAgICAgICBtZW1tb3ZlKGYtPmJ1ZiwgZi0+YnVmICsgZi0+YnVmX2luZGV4LCBwZW5kaW5nKTsKKyAgICB9CisgICAgZi0+YnVmX2luZGV4ID0gMDsKKyAgICBmLT5idWZfc2l6ZSA9IHBlbmRpbmc7CisKKyAgICBsZW4gPSBmLT5vcHMtPmdldF9idWZmZXIoZi0+b3BhcXVlLCBmLT5idWYgKyBwZW5kaW5nLCBmLT5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBJT19CVUZfU0laRSAtIHBlbmRpbmcpOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGYtPmJ1Zl9zaXplICs9IGxlbjsKKyAgICAgICAgZi0+cG9zICs9IGxlbjsKKyAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHFlbXVfZmlsZV9zZXRfZXJyb3IoZiwgLUVJTyk7CisgICAgfSBlbHNlIGlmIChsZW4gIT0gLUVBR0FJTikKKyAgICAgICAgcWVtdV9maWxlX3NldF9lcnJvcihmLCBsZW4pOworfQorCitpbnQgcWVtdV9nZXRfZmQoUUVNVUZpbGUgKmYpCit7CisgICAgaWYgKGYtPm9wcy0+Z2V0X2ZkKSB7CisgICAgICAgIHJldHVybiBmLT5vcHMtPmdldF9mZChmLT5vcGFxdWUpOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgcWVtdV91cGRhdGVfcG9zaXRpb24oUUVNVUZpbGUgKmYsIHNpemVfdCBzaXplKQoreworICAgIGYtPnBvcyArPSBzaXplOworfQorCisvKiogQ2xvc2VzIHRoZSBmaWxlCisgKgorICogUmV0dXJucyBuZWdhdGl2ZSBlcnJvciB2YWx1ZSBpZiBhbnkgZXJyb3IgaGFwcGVuZWQgb24gcHJldmlvdXMgb3BlcmF0aW9ucyBvcgorICogd2hpbGUgY2xvc2luZyB0aGUgZmlsZS4gUmV0dXJucyAwIG9yIHBvc2l0aXZlIG51bWJlciBvbiBzdWNjZXNzLgorICoKKyAqIFRoZSBtZWFuaW5nIG9mIHJldHVybiB2YWx1ZSBvbiBzdWNjZXNzIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGJhY2tlbmQKKyAqIGJlaW5nIHVzZWQuCisgKi8KK2ludCBxZW11X2ZjbG9zZShRRU1VRmlsZSAqZikKK3sKKyAgICBpbnQgcmV0OworICAgIHFlbXVfZmZsdXNoKGYpOworICAgIHJldCA9IHFlbXVfZmlsZV9nZXRfZXJyb3IoZik7CisKKyAgICBpZiAoZi0+b3BzLT5jbG9zZSkgeworICAgICAgICBpbnQgcmV0MiA9IGYtPm9wcy0+Y2xvc2UoZi0+b3BhcXVlKTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZXQgPSByZXQyOworICAgICAgICB9CisgICAgfQorICAgIC8qIElmIGFueSBlcnJvciB3YXMgc3BvdHRlZCBiZWZvcmUgY2xvc2luZywgd2Ugc2hvdWxkIHJlcG9ydCBpdAorICAgICAqIGluc3RlYWQgb2YgdGhlIGNsb3NlKCkgcmV0dXJuIHZhbHVlLgorICAgICAqLworICAgIGlmIChmLT5sYXN0X2Vycm9yKSB7CisgICAgICAgIHJldCA9IGYtPmxhc3RfZXJyb3I7CisgICAgfQorICAgIGdfZnJlZShmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhZGRfdG9faW92ZWMoUUVNVUZpbGUgKmYsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgLyogY2hlY2sgZm9yIGFkamFjZW50IGJ1ZmZlciBhbmQgY29hbGVzY2UgdGhlbSAqLworICAgIGlmIChmLT5pb3ZjbnQgPiAwICYmIGJ1ZiA9PSBmLT5pb3ZbZi0+aW92Y250IC0gMV0uaW92X2Jhc2UgKworICAgICAgICBmLT5pb3ZbZi0+aW92Y250IC0gMV0uaW92X2xlbikgeworICAgICAgICBmLT5pb3ZbZi0+aW92Y250IC0gMV0uaW92X2xlbiArPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGYtPmlvdltmLT5pb3ZjbnRdLmlvdl9iYXNlID0gKHVpbnQ4X3QgKilidWY7CisgICAgICAgIGYtPmlvdltmLT5pb3ZjbnQrK10uaW92X2xlbiA9IHNpemU7CisgICAgfQorCisgICAgaWYgKGYtPmlvdmNudCA+PSBNQVhfSU9WX1NJWkUpIHsKKyAgICAgICAgcWVtdV9mZmx1c2goZik7CisgICAgfQorfQorCit2b2lkIHFlbXVfcHV0X2J1ZmZlcl9hc3luYyhRRU1VRmlsZSAqZiwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoIWYtPm9wcy0+d3JpdGV2X2J1ZmZlcikgeworICAgICAgICBxZW11X3B1dF9idWZmZXIoZiwgYnVmLCBzaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmLT5sYXN0X2Vycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmLT5ieXRlc194ZmVyICs9IHNpemU7CisgICAgYWRkX3RvX2lvdmVjKGYsIGJ1Ziwgc2l6ZSk7Cit9CisKK3ZvaWQgcWVtdV9wdXRfYnVmZmVyKFFFTVVGaWxlICpmLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGludCBsOworCisgICAgaWYgKGYtPmxhc3RfZXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBsID0gSU9fQlVGX1NJWkUgLSBmLT5idWZfaW5kZXg7CisgICAgICAgIGlmIChsID4gc2l6ZSkKKyAgICAgICAgICAgIGwgPSBzaXplOworICAgICAgICBtZW1jcHkoZi0+YnVmICsgZi0+YnVmX2luZGV4LCBidWYsIGwpOworICAgICAgICBmLT5ieXRlc194ZmVyICs9IGw7CisgICAgICAgIGlmIChmLT5vcHMtPndyaXRldl9idWZmZXIpIHsKKyAgICAgICAgICAgIGFkZF90b19pb3ZlYyhmLCBmLT5idWYgKyBmLT5idWZfaW5kZXgsIGwpOworICAgICAgICB9CisgICAgICAgIGYtPmJ1Zl9pbmRleCArPSBsOworICAgICAgICBpZiAoZi0+YnVmX2luZGV4ID09IElPX0JVRl9TSVpFKSB7CisgICAgICAgICAgICBxZW11X2ZmbHVzaChmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocWVtdV9maWxlX2dldF9lcnJvcihmKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmICs9IGw7CisgICAgICAgIHNpemUgLT0gbDsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9wdXRfYnl0ZShRRU1VRmlsZSAqZiwgaW50IHYpCit7CisgICAgaWYgKGYtPmxhc3RfZXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGYtPmJ1ZltmLT5idWZfaW5kZXhdID0gdjsKKyAgICBmLT5ieXRlc194ZmVyKys7CisgICAgaWYgKGYtPm9wcy0+d3JpdGV2X2J1ZmZlcikgeworICAgICAgICBhZGRfdG9faW92ZWMoZiwgZi0+YnVmICsgZi0+YnVmX2luZGV4LCAxKTsKKyAgICB9CisgICAgZi0+YnVmX2luZGV4Kys7CisgICAgaWYgKGYtPmJ1Zl9pbmRleCA9PSBJT19CVUZfU0laRSkgeworICAgICAgICBxZW11X2ZmbHVzaChmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfZmlsZV9za2lwKFFFTVVGaWxlICpmLCBpbnQgc2l6ZSkKK3sKKyAgICBpZiAoZi0+YnVmX2luZGV4ICsgc2l6ZSA8PSBmLT5idWZfc2l6ZSkgeworICAgICAgICBmLT5idWZfaW5kZXggKz0gc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcWVtdV9wZWVrX2J1ZmZlcihRRU1VRmlsZSAqZiwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgc2l6ZV90IG9mZnNldCkKK3sKKyAgICBpbnQgcGVuZGluZzsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBhc3NlcnQoIXFlbXVfZmlsZV9pc193cml0YWJsZShmKSk7CisKKyAgICBpbmRleCA9IGYtPmJ1Zl9pbmRleCArIG9mZnNldDsKKyAgICBwZW5kaW5nID0gZi0+YnVmX3NpemUgLSBpbmRleDsKKyAgICBpZiAocGVuZGluZyA8IHNpemUpIHsKKyAgICAgICAgcWVtdV9maWxsX2J1ZmZlcihmKTsKKyAgICAgICAgaW5kZXggPSBmLT5idWZfaW5kZXggKyBvZmZzZXQ7CisgICAgICAgIHBlbmRpbmcgPSBmLT5idWZfc2l6ZSAtIGluZGV4OworICAgIH0KKworICAgIGlmIChwZW5kaW5nIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzaXplID4gcGVuZGluZykgeworICAgICAgICBzaXplID0gcGVuZGluZzsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmLCBmLT5idWYgKyBpbmRleCwgc2l6ZSk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK2ludCBxZW11X2dldF9idWZmZXIoUUVNVUZpbGUgKmYsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgaW50IHBlbmRpbmcgPSBzaXplOworICAgIGludCBkb25lID0gMDsKKworICAgIHdoaWxlIChwZW5kaW5nID4gMCkgeworICAgICAgICBpbnQgcmVzOworCisgICAgICAgIHJlcyA9IHFlbXVfcGVla19idWZmZXIoZiwgYnVmLCBwZW5kaW5nLCAwKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZG9uZTsKKyAgICAgICAgfQorICAgICAgICBxZW11X2ZpbGVfc2tpcChmLCByZXMpOworICAgICAgICBidWYgKz0gcmVzOworICAgICAgICBwZW5kaW5nIC09IHJlczsKKyAgICAgICAgZG9uZSArPSByZXM7CisgICAgfQorICAgIHJldHVybiBkb25lOworfQorCitzdGF0aWMgaW50IHFlbXVfcGVla19ieXRlKFFFTVVGaWxlICpmLCBpbnQgb2Zmc2V0KQoreworICAgIGludCBpbmRleCA9IGYtPmJ1Zl9pbmRleCArIG9mZnNldDsKKworICAgIGFzc2VydCghcWVtdV9maWxlX2lzX3dyaXRhYmxlKGYpKTsKKworICAgIGlmIChpbmRleCA+PSBmLT5idWZfc2l6ZSkgeworICAgICAgICBxZW11X2ZpbGxfYnVmZmVyKGYpOworICAgICAgICBpbmRleCA9IGYtPmJ1Zl9pbmRleCArIG9mZnNldDsKKyAgICAgICAgaWYgKGluZGV4ID49IGYtPmJ1Zl9zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZi0+YnVmW2luZGV4XTsKK30KKworaW50IHFlbXVfZ2V0X2J5dGUoUUVNVUZpbGUgKmYpCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IHFlbXVfcGVla19ieXRlKGYsIDApOworICAgIHFlbXVfZmlsZV9za2lwKGYsIDEpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAordm9pZCBxZW11X3B1dF9zdHJpbmcoUUVNVUZpbGUgKmYsIGNvbnN0IGNoYXIqIHN0cikKK3sKKyAgICAvKiBXZSB3aWxsIGVuY29kZSBOVUxMIGFuZCB0aGUgZW1wdHkgc3RyaW5nIGluIHRoZSBzYW1lIHdheSAqLworICAgIGludCAgc2xlbjsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgc3RyID0gIiI7CisgICAgfQorICAgIHNsZW4gPSBzdHJsZW4oc3RyKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHNsZW4pOworICAgIHFlbXVfcHV0X2J1ZmZlcihmLCAoY29uc3QgdWludDhfdCopc3RyLCBzbGVuKTsKK30KKworY2hhciogcWVtdV9nZXRfc3RyaW5nKFFFTVVGaWxlICpmKQoreworICAgIGludCBzbGVuID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBjaGFyKiBzdHI7CisgICAgaWYgKHNsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdHIgPSBnX21hbGxvYyhzbGVuKzEpOworICAgIGlmIChxZW11X2dldF9idWZmZXIoZiwgKHVpbnQ4X3QqKXN0ciwgc2xlbikgIT0gc2xlbikgeworICAgICAgICBnX2ZyZWUoc3RyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cltzbGVuXSA9ICdcMCc7CisgICAgcmV0dXJuIHN0cjsKK30KKyNlbmRpZgorCisKK2ludDY0X3QgcWVtdV9mdGVsbChRRU1VRmlsZSAqZikKK3sKKyAgICBxZW11X2ZmbHVzaChmKTsKKyAgICByZXR1cm4gZi0+cG9zOworfQorCitpbnQgcWVtdV9maWxlX3JhdGVfbGltaXQoUUVNVUZpbGUgKmYpCit7CisgICAgaWYgKHFlbXVfZmlsZV9nZXRfZXJyb3IoZikpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChmLT54ZmVyX2xpbWl0ID4gMCAmJiBmLT5ieXRlc194ZmVyID4gZi0+eGZlcl9saW1pdCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDY0X3QgcWVtdV9maWxlX2dldF9yYXRlX2xpbWl0KFFFTVVGaWxlICpmKQoreworICAgIHJldHVybiBmLT54ZmVyX2xpbWl0OworfQorCit2b2lkIHFlbXVfZmlsZV9zZXRfcmF0ZV9saW1pdChRRU1VRmlsZSAqZiwgaW50NjRfdCBsaW1pdCkKK3sKKyAgICBmLT54ZmVyX2xpbWl0ID0gbGltaXQ7Cit9CisKK3ZvaWQgcWVtdV9maWxlX3Jlc2V0X3JhdGVfbGltaXQoUUVNVUZpbGUgKmYpCit7CisgICAgZi0+Ynl0ZXNfeGZlciA9IDA7Cit9CisKK3ZvaWQgcWVtdV9wdXRfYmUxNihRRU1VRmlsZSAqZiwgdW5zaWduZWQgaW50IHYpCit7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB2ID4+IDgpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgdik7Cit9CisKK3ZvaWQgcWVtdV9wdXRfYmUzMihRRU1VRmlsZSAqZiwgdW5zaWduZWQgaW50IHYpCit7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB2ID4+IDI0KTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHYgPj4gMTYpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgdiA+PiA4KTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHYpOworfQorCit2b2lkIHFlbXVfcHV0X2JlNjQoUUVNVUZpbGUgKmYsIHVpbnQ2NF90IHYpCit7CisgICAgcWVtdV9wdXRfYmUzMihmLCB2ID4+IDMyKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHYpOworfQorCit1bnNpZ25lZCBpbnQgcWVtdV9nZXRfYmUxNihRRU1VRmlsZSAqZikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdjsKKyAgICB2ID0gcWVtdV9nZXRfYnl0ZShmKSA8PCA4OworICAgIHYgfD0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICByZXR1cm4gdjsKK30KKwordW5zaWduZWQgaW50IHFlbXVfZ2V0X2JlMzIoUUVNVUZpbGUgKmYpCit7CisgICAgdW5zaWduZWQgaW50IHY7CisgICAgdiA9IHFlbXVfZ2V0X2J5dGUoZikgPDwgMjQ7CisgICAgdiB8PSBxZW11X2dldF9ieXRlKGYpIDw8IDE2OworICAgIHYgfD0gcWVtdV9nZXRfYnl0ZShmKSA8PCA4OworICAgIHYgfD0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICByZXR1cm4gdjsKK30KKwordWludDY0X3QgcWVtdV9nZXRfYmU2NChRRU1VRmlsZSAqZikKK3sKKyAgICB1aW50NjRfdCB2OworICAgIHYgPSAodWludDY0X3QpcWVtdV9nZXRfYmUzMihmKSA8PCAzMjsKKyAgICB2IHw9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgcmV0dXJuIHY7Cit9CisKKwordm9pZCAgcWVtdV9wdXRfc3RydWN0KFFFTVVGaWxlKiAgZiwgY29uc3QgUUZpZWxkKiAgZmllbGRzLCBjb25zdCB2b2lkKiAgcykKK3sKKyAgICBjb25zdCBRRmllbGQqICBxZiA9IGZpZWxkczsKKworICAgIC8qIEl0ZXJhdGUgb3ZlciBzdHJ1Y3QgZmllbGRzICovCisgICAgd2hpbGUgKHFmLT50eXBlICE9IFFfRklFTERfRU5EKSB7CisgICAgICAgIHVpbnQ4X3QqICBwID0gKHVpbnQ4X3QqKXMgKyBxZi0+b2Zmc2V0OworCisgICAgICAgIHN3aXRjaCAocWYtPnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUV9GSUVMRF9CWVRFOgorICAgICAgICAgICAgICAgIHFlbXVfcHV0X2J5dGUoZiwgcFswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfSU5UMTY6CisgICAgICAgICAgICAgICAgcWVtdV9wdXRfYmUxNihmLCAoKHVpbnQxNl90KilwKVswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfSU5UMzI6CisgICAgICAgICAgICAgICAgcWVtdV9wdXRfYmUzMihmLCAoKHVpbnQzMl90KilwKVswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfSU5UNjQ6CisgICAgICAgICAgICAgICAgcWVtdV9wdXRfYmU2NChmLCAoKHVpbnQ2NF90KilwKVswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfQlVGRkVSOgorICAgICAgICAgICAgICAgIGlmIChxZlsxXS50eXBlICE9IFFfRklFTERfQlVGRkVSX1NJWkUgfHwKKyAgICAgICAgICAgICAgICAgICAgcWZbMl0udHlwZSAhPSBRX0ZJRUxEX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBRRklFTERfQlVGRkVSIGl0ZW0gcGFzc2VkIGFzIGFyZ3VtZW50LiBhYm9ydGluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18gKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIHNpemUgPSAoKHVpbnQzMl90KXFmWzFdLm9mZnNldCA8PCAxNikgfCAodWludDMyX3QpcWZbMl0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgIHFlbXVfcHV0X2J1ZmZlcihmLCBwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcWYgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgZmllbGRzIGxpc3QgcGFzc2VkIGFzIGFyZ3VtZW50LiBhYm9ydGluZ1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIHFmKys7CisgICAgfQorfQorCitpbnQgICBxZW11X2dldF9zdHJ1Y3QoUUVNVUZpbGUqICBmLCBjb25zdCBRRmllbGQqICBmaWVsZHMsIHZvaWQqICBzKQoreworICAgIGNvbnN0IFFGaWVsZCogIHFmID0gZmllbGRzOworCisgICAgLyogSXRlcmF0ZSBvdmVyIHN0cnVjdCBmaWVsZHMgKi8KKyAgICB3aGlsZSAocWYtPnR5cGUgIT0gUV9GSUVMRF9FTkQpIHsKKyAgICAgICAgdWludDhfdCogIHAgPSAodWludDhfdCopcyArIHFmLT5vZmZzZXQ7CisKKyAgICAgICAgc3dpdGNoIChxZi0+dHlwZSkgeworICAgICAgICAgICAgY2FzZSBRX0ZJRUxEX0JZVEU6CisgICAgICAgICAgICAgICAgcFswXSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfSU5UMTY6CisgICAgICAgICAgICAgICAgKCh1aW50MTZfdCopcClbMF0gPSBxZW11X2dldF9iZTE2KGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRX0ZJRUxEX0lOVDMyOgorICAgICAgICAgICAgICAgICgodWludDMyX3QqKXApWzBdID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUV9GSUVMRF9JTlQ2NDoKKyAgICAgICAgICAgICAgICAoKHVpbnQ2NF90KilwKVswXSA9IHFlbXVfZ2V0X2JlNjQoZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFfRklFTERfQlVGRkVSOgorICAgICAgICAgICAgICAgIGlmIChxZlsxXS50eXBlICE9IFFfRklFTERfQlVGRkVSX1NJWkUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHFmWzJdLnR5cGUgIT0gUV9GSUVMRF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGludmFsaWQgUUZJRUxEX0JVRkZFUiBpdGVtIHBhc3NlZCBhcyBhcmd1bWVudC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgIHNpemUgPSAoKHVpbnQzMl90KXFmWzFdLm9mZnNldCA8PCAxNikgfCAodWludDMyX3QpcWZbMl0ub2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgcmV0ICA9IHFlbXVfZ2V0X2J1ZmZlcihmLCBwLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IChpbnQpc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbm90IGVub3VnaCBieXRlcyB0byBsb2FkIHN0cnVjdHVyZVxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBxZiArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogaW52YWxpZCBmaWVsZHMgbGlzdCBwYXNzZWQgYXMgYXJndW1lbnQuIGFib3J0aW5nXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcWYrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHdyaXRlIGEgZmxvYXQgdG8gZmlsZSAqLwordm9pZCBxZW11X3B1dF9mbG9hdChRRU1VRmlsZSAqZiwgZmxvYXQgdikKK3sKKyAgICB1aW50OF90ICpieXRlcyA9ICh1aW50OF90KikgJnY7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsIGJ5dGVzLCBzaXplb2YoZmxvYXQpKTsKK30KKworLyogcmVhZCBhIGZsb2F0IGZyb20gZmlsZSAqLworZmxvYXQgcWVtdV9nZXRfZmxvYXQoUUVNVUZpbGUgKmYpCit7CisgICAgdWludDhfdCBieXRlc1tzaXplb2YoZmxvYXQpXTsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgYnl0ZXMsIHNpemVvZihmbG9hdCkpOworCisgICAgcmV0dXJuICooKGZsb2F0KikgYnl0ZXMpOworfQorCisvKiB0aW1lciAqLworCit2b2lkIHRpbWVyX3B1dChRRU1VRmlsZSAqZiwgUUVNVVRpbWVyICp0cykKK3sKKyAgICB1aW50NjRfdCBleHBpcmVfdGltZTsKKworICAgIGV4cGlyZV90aW1lID0gdGltZXJfZXhwaXJlX3RpbWVfbnModHMpOworICAgIHFlbXVfcHV0X2JlNjQoZiwgZXhwaXJlX3RpbWUpOworfQorCit2b2lkIHRpbWVyX2dldChRRU1VRmlsZSAqZiwgUUVNVVRpbWVyICp0cykKK3sKKyAgICB1aW50NjRfdCBleHBpcmVfdGltZTsKKworICAgIGV4cGlyZV90aW1lID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICBpZiAoZXhwaXJlX3RpbWUgIT0gKHVpbnQ2NF90KSgtMSkpIHsKKyAgICAgICAgdGltZXJfbW9kX25zKHRzLCBleHBpcmVfdGltZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZXJfZGVsKHRzKTsKKyAgICB9Cit9CisKKworLyogYm9vbCAqLworCitzdGF0aWMgaW50IGdldF9ib29sKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgYm9vbCAqdiA9IHB2OworICAgICp2ID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2Jvb2woUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBib29sICp2ID0gcHY7CisgICAgcWVtdV9wdXRfYnl0ZShmLCAqdik7Cit9CisKK2NvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb19ib29sID0geworICAgIC5uYW1lID0gImJvb2wiLAorICAgIC5nZXQgID0gZ2V0X2Jvb2wsCisgICAgLnB1dCAgPSBwdXRfYm9vbCwKK307CisKKy8qIDggYml0IGludCAqLworCitzdGF0aWMgaW50IGdldF9pbnQ4KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgaW50OF90ICp2ID0gcHY7CisgICAgcWVtdV9nZXRfczhzKGYsIHYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfaW50OChRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIGludDhfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0X3M4cyhmLCB2KTsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDggPSB7CisgICAgLm5hbWUgPSAiaW50OCIsCisgICAgLmdldCAgPSBnZXRfaW50OCwKKyAgICAucHV0ICA9IHB1dF9pbnQ4LAorfTsKKworLyogMTYgYml0IGludCAqLworCitzdGF0aWMgaW50IGdldF9pbnQxNihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIGludDE2X3QgKnYgPSBwdjsKKyAgICBxZW11X2dldF9zYmUxNnMoZiwgdik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9pbnQxNihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIGludDE2X3QgKnYgPSBwdjsKKyAgICBxZW11X3B1dF9zYmUxNnMoZiwgdik7Cit9CisKK2NvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb19pbnQxNiA9IHsKKyAgICAubmFtZSA9ICJpbnQxNiIsCisgICAgLmdldCAgPSBnZXRfaW50MTYsCisgICAgLnB1dCAgPSBwdXRfaW50MTYsCit9OworCisvKiAzMiBiaXQgaW50ICovCisKK3N0YXRpYyBpbnQgZ2V0X2ludDMyKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgaW50MzJfdCAqdiA9IHB2OworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCB2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2ludDMyKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgaW50MzJfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0X3NiZTMycyhmLCB2KTsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDMyID0geworICAgIC5uYW1lID0gImludDMyIiwKKyAgICAuZ2V0ICA9IGdldF9pbnQzMiwKKyAgICAucHV0ICA9IHB1dF9pbnQzMiwKK307CisKKy8qIDMyIGJpdCBpbnQuIFNlZSB0aGF0IHRoZSByZWNlaXZlZCB2YWx1ZSBpcyB0aGUgc2FtZSB0aGFuIHRoZSBvbmUKKyAgIGluIHRoZSBmaWVsZCAqLworCitzdGF0aWMgaW50IGdldF9pbnQzMl9lcXVhbChRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIGludDMyX3QgKnYgPSBwdjsKKyAgICBpbnQzMl90IHYyOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmdjIpOworCisgICAgaWYgKCp2ID09IHYyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDMyX2VxdWFsID0geworICAgIC5uYW1lID0gImludDMyIGVxdWFsIiwKKyAgICAuZ2V0ICA9IGdldF9pbnQzMl9lcXVhbCwKKyAgICAucHV0ICA9IHB1dF9pbnQzMiwKK307CisKKy8qIDMyIGJpdCBpbnQuIFNlZSB0aGF0IHRoZSByZWNlaXZlZCB2YWx1ZSBpcyB0aGUgbGVzcyBvciB0aGUgc2FtZQorICAgdGhhbiB0aGUgb25lIGluIHRoZSBmaWVsZCAqLworCitzdGF0aWMgaW50IGdldF9pbnQzMl9sZShRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIGludDMyX3QgKm9sZCA9IHB2OworICAgIGludDMyX3QgbmV3OworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmbmV3KTsKKworICAgIGlmICgqb2xkIDw9IG5ldykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK2NvbnN0IFZNU3RhdGVJbmZvIHZtc3RhdGVfaW5mb19pbnQzMl9sZSA9IHsKKyAgICAubmFtZSA9ICJpbnQzMiBlcXVhbCIsCisgICAgLmdldCAgPSBnZXRfaW50MzJfbGUsCisgICAgLnB1dCAgPSBwdXRfaW50MzIsCit9OworCisvKiA2NCBiaXQgaW50ICovCisKK3N0YXRpYyBpbnQgZ2V0X2ludDY0KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgaW50NjRfdCAqdiA9IHB2OworICAgIHFlbXVfZ2V0X3NiZTY0cyhmLCB2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2ludDY0KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgaW50NjRfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0X3NiZTY0cyhmLCB2KTsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2ludDY0ID0geworICAgIC5uYW1lID0gImludDY0IiwKKyAgICAuZ2V0ICA9IGdldF9pbnQ2NCwKKyAgICAucHV0ICA9IHB1dF9pbnQ2NCwKK307CisKKy8qIDggYml0IHVuc2lnbmVkIGludCAqLworCitzdGF0aWMgaW50IGdldF91aW50OChRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHVpbnQ4X3QgKnYgPSBwdjsKKyAgICBxZW11X2dldF84cyhmLCB2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X3VpbnQ4KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgdWludDhfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0XzhzKGYsIHYpOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDggPSB7CisgICAgLm5hbWUgPSAidWludDgiLAorICAgIC5nZXQgID0gZ2V0X3VpbnQ4LAorICAgIC5wdXQgID0gcHV0X3VpbnQ4LAorfTsKKworLyogMTYgYml0IHVuc2lnbmVkIGludCAqLworCitzdGF0aWMgaW50IGdldF91aW50MTYoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50MTZfdCAqdiA9IHB2OworICAgIHFlbXVfZ2V0X2JlMTZzKGYsIHYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfdWludDE2KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgdWludDE2X3QgKnYgPSBwdjsKKyAgICBxZW11X3B1dF9iZTE2cyhmLCB2KTsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQxNiA9IHsKKyAgICAubmFtZSA9ICJ1aW50MTYiLAorICAgIC5nZXQgID0gZ2V0X3VpbnQxNiwKKyAgICAucHV0ICA9IHB1dF91aW50MTYsCit9OworCisvKiAzMiBiaXQgdW5zaWduZWQgaW50ICovCisKK3N0YXRpYyBpbnQgZ2V0X3VpbnQzMihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHVpbnQzMl90ICp2ID0gcHY7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgdik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF91aW50MzIoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50MzJfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0X2JlMzJzKGYsIHYpOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDMyID0geworICAgIC5uYW1lID0gInVpbnQzMiIsCisgICAgLmdldCAgPSBnZXRfdWludDMyLAorICAgIC5wdXQgID0gcHV0X3VpbnQzMiwKK307CisKKy8qIDMyIGJpdCB1aW50LiBTZWUgdGhhdCB0aGUgcmVjZWl2ZWQgdmFsdWUgaXMgdGhlIHNhbWUgdGhhbiB0aGUgb25lCisgICBpbiB0aGUgZmllbGQgKi8KKworc3RhdGljIGludCBnZXRfdWludDMyX2VxdWFsKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgdWludDMyX3QgKnYgPSBwdjsKKyAgICB1aW50MzJfdCB2MjsKKyAgICBxZW11X2dldF9iZTMycyhmLCAmdjIpOworCisgICAgaWYgKCp2ID09IHYyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQzMl9lcXVhbCA9IHsKKyAgICAubmFtZSA9ICJ1aW50MzIgZXF1YWwiLAorICAgIC5nZXQgID0gZ2V0X3VpbnQzMl9lcXVhbCwKKyAgICAucHV0ICA9IHB1dF91aW50MzIsCit9OworCisvKiA2NCBiaXQgdW5zaWduZWQgaW50ICovCisKK3N0YXRpYyBpbnQgZ2V0X3VpbnQ2NChRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHVpbnQ2NF90ICp2ID0gcHY7CisgICAgcWVtdV9nZXRfYmU2NHMoZiwgdik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF91aW50NjQoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50NjRfdCAqdiA9IHB2OworICAgIHFlbXVfcHV0X2JlNjRzKGYsIHYpOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDY0ID0geworICAgIC5uYW1lID0gInVpbnQ2NCIsCisgICAgLmdldCAgPSBnZXRfdWludDY0LAorICAgIC5wdXQgID0gcHV0X3VpbnQ2NCwKK307CisKKy8qIDY0IGJpdCB1bnNpZ25lZCBpbnQuIFNlZSB0aGF0IHRoZSByZWNlaXZlZCB2YWx1ZSBpcyB0aGUgc2FtZSB0aGFuIHRoZSBvbmUKKyAgIGluIHRoZSBmaWVsZCAqLworCitzdGF0aWMgaW50IGdldF91aW50NjRfZXF1YWwoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50NjRfdCAqdiA9IHB2OworICAgIHVpbnQ2NF90IHYyOworICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZ2Mik7CisKKyAgICBpZiAoKnYgPT0gdjIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdWludDY0X2VxdWFsID0geworICAgIC5uYW1lID0gImludDY0IGVxdWFsIiwKKyAgICAuZ2V0ICA9IGdldF91aW50NjRfZXF1YWwsCisgICAgLnB1dCAgPSBwdXRfdWludDY0LAorfTsKKworLyogOCBiaXQgaW50LiBTZWUgdGhhdCB0aGUgcmVjZWl2ZWQgdmFsdWUgaXMgdGhlIHNhbWUgdGhhbiB0aGUgb25lCisgICBpbiB0aGUgZmllbGQgKi8KKworc3RhdGljIGludCBnZXRfdWludDhfZXF1YWwoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50OF90ICp2ID0gcHY7CisgICAgdWludDhfdCB2MjsKKyAgICBxZW11X2dldF84cyhmLCAmdjIpOworCisgICAgaWYgKCp2ID09IHYyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQ4X2VxdWFsID0geworICAgIC5uYW1lID0gInVpbnQ4IGVxdWFsIiwKKyAgICAuZ2V0ICA9IGdldF91aW50OF9lcXVhbCwKKyAgICAucHV0ICA9IHB1dF91aW50OCwKK307CisKKy8qIDE2IGJpdCB1bnNpZ25lZCBpbnQgaW50LiBTZWUgdGhhdCB0aGUgcmVjZWl2ZWQgdmFsdWUgaXMgdGhlIHNhbWUgdGhhbiB0aGUgb25lCisgICBpbiB0aGUgZmllbGQgKi8KKworc3RhdGljIGludCBnZXRfdWludDE2X2VxdWFsKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgdWludDE2X3QgKnYgPSBwdjsKKyAgICB1aW50MTZfdCB2MjsKKyAgICBxZW11X2dldF9iZTE2cyhmLCAmdjIpOworCisgICAgaWYgKCp2ID09IHYyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VpbnQxNl9lcXVhbCA9IHsKKyAgICAubmFtZSA9ICJ1aW50MTYgZXF1YWwiLAorICAgIC5nZXQgID0gZ2V0X3VpbnQxNl9lcXVhbCwKKyAgICAucHV0ICA9IHB1dF91aW50MTYsCit9OworCisvKiBmbG9hdGluZyBwb2ludCAqLworCitzdGF0aWMgaW50IGdldF9mbG9hdDY0KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgZmxvYXQ2NCAqdiA9IHB2OworCisgICAgKnYgPSBtYWtlX2Zsb2F0NjQocWVtdV9nZXRfYmU2NChmKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9mbG9hdDY0KFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgdWludDY0X3QgKnYgPSBwdjsKKworICAgIHFlbXVfcHV0X2JlNjQoZiwgZmxvYXQ2NF92YWwoKnYpKTsKK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX2Zsb2F0NjQgPSB7CisgICAgLm5hbWUgPSAiZmxvYXQ2NCIsCisgICAgLmdldCAgPSBnZXRfZmxvYXQ2NCwKKyAgICAucHV0ICA9IHB1dF9mbG9hdDY0LAorfTsKKworLyogdGltZXJzICAqLworCitzdGF0aWMgaW50IGdldF90aW1lcihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIFFFTVVUaW1lciAqdiA9IHB2OworICAgIHRpbWVyX2dldChmLCB2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X3RpbWVyKFFFTVVGaWxlICpmLCB2b2lkICpwdiwgc2l6ZV90IHNpemUpCit7CisgICAgUUVNVVRpbWVyICp2ID0gcHY7CisgICAgdGltZXJfcHV0KGYsIHYpOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fdGltZXIgPSB7CisgICAgLm5hbWUgPSAidGltZXIiLAorICAgIC5nZXQgID0gZ2V0X3RpbWVyLAorICAgIC5wdXQgID0gcHV0X3RpbWVyLAorfTsKKworLyogdWludDhfdCBidWZmZXJzICovCisKK3N0YXRpYyBpbnQgZ2V0X2J1ZmZlcihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHVpbnQ4X3QgKnYgPSBwdjsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgdiwgc2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9idWZmZXIoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50OF90ICp2ID0gcHY7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsIHYsIHNpemUpOworfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fYnVmZmVyID0geworICAgIC5uYW1lID0gImJ1ZmZlciIsCisgICAgLmdldCAgPSBnZXRfYnVmZmVyLAorICAgIC5wdXQgID0gcHV0X2J1ZmZlciwKK307CisKKy8qIHVudXNlZCBidWZmZXJzOiBzcGFjZSB0aGF0IHdhcyB1c2VkIGZvciBzb21lIGZpZWxkcyB0aGF0IGFyZQorICAgbm90IHVzZWZ1bCBhbnltb3JlICovCisKK3N0YXRpYyBpbnQgZ2V0X3VudXNlZF9idWZmZXIoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1aW50OF90IGJ1ZlsxMDI0XTsKKyAgICBpbnQgYmxvY2tfbGVuOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGJsb2NrX2xlbiA9IE1JTihzaXplb2YoYnVmKSwgc2l6ZSk7CisgICAgICAgIHNpemUgLT0gYmxvY2tfbGVuOworICAgICAgICBxZW11X2dldF9idWZmZXIoZiwgYnVmLCBibG9ja19sZW4pOworICAgIH0KKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfdW51c2VkX2J1ZmZlcihRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJ1ZlsxMDI0XTsKKyAgICBpbnQgYmxvY2tfbGVuOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGJsb2NrX2xlbiA9IE1JTihzaXplb2YoYnVmKSwgc2l6ZSk7CisgICAgICAgIHNpemUgLT0gYmxvY2tfbGVuOworICAgICAgICBxZW11X3B1dF9idWZmZXIoZiwgYnVmLCBibG9ja19sZW4pOworICAgIH0KK30KKworY29uc3QgVk1TdGF0ZUluZm8gdm1zdGF0ZV9pbmZvX3VudXNlZF9idWZmZXIgPSB7CisgICAgLm5hbWUgPSAidW51c2VkX2J1ZmZlciIsCisgICAgLmdldCAgPSBnZXRfdW51c2VkX2J1ZmZlciwKKyAgICAucHV0ICA9IHB1dF91bnVzZWRfYnVmZmVyLAorfTsKKworLyogYml0bWFwcyAoYXMgZGVmaW5lZCBieSBiaXRtYXAuaCkuIE5vdGUgdGhhdCBzaXplIGhlcmUgaXMgdGhlIHNpemUKKyAqIG9mIHRoZSBiaXRtYXAgaW4gYml0cy4gVGhlIG9uLXRoZS13aXJlIGZvcm1hdCBvZiBhIGJpdG1hcCBpcyA2NAorICogYml0IHdvcmRzIHdpdGggdGhlIGJpdHMgaW4gYmlnIGVuZGlhbiBvcmRlci4gVGhlIGluLW1lbW9yeSBmb3JtYXQKKyAqIGlzIGFuIGFycmF5IG9mICd1bnNpZ25lZCBsb25nJywgd2hpY2ggbWF5IGJlIGVpdGhlciAzMiBvciA2NCBiaXRzLgorICovCisvKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgNjQgYml0IHdvcmRzIHNlbnQgb3ZlciB0aGUgd2lyZSAqLworI2RlZmluZSBCSVRTX1RPX1U2NFMobnIpIERJVl9ST1VORF9VUChuciwgNjQpCitzdGF0aWMgaW50IGdldF9iaXRtYXAoUUVNVUZpbGUgKmYsIHZvaWQgKnB2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nICpibXAgPSBwdjsKKyAgICBpbnQgaSwgaWR4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGludClCSVRTX1RPX1U2NFMoc2l6ZSk7IGkrKykgeworICAgICAgICB1aW50NjRfdCB3ID0gcWVtdV9nZXRfYmU2NChmKTsKKyAgICAgICAgYm1wW2lkeCsrXSA9IHc7CisgICAgICAgIGlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gNCAmJiBpZHggPCBCSVRTX1RPX0xPTkdTKHNpemUpKSB7CisgICAgICAgICAgICBibXBbaWR4KytdID0gdyA+PiAzMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2JpdG1hcChRRU1VRmlsZSAqZiwgdm9pZCAqcHYsIHNpemVfdCBzaXplKQoreworICAgIHVuc2lnbmVkIGxvbmcgKmJtcCA9IHB2OworICAgIGludCBpLCBpZHggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KUJJVFNfVE9fVTY0UyhzaXplKTsgaSsrKSB7CisgICAgICAgIHVpbnQ2NF90IHcgPSBibXBbaWR4KytdOworICAgICAgICBpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQgJiYgaWR4IDwgQklUU19UT19MT05HUyhzaXplKSkgeworICAgICAgICAgICAgdyB8PSAoKHVpbnQ2NF90KWJtcFtpZHgrK10pIDw8IDMyOworICAgICAgICB9CisgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgdyk7CisgICAgfQorfQorCitjb25zdCBWTVN0YXRlSW5mbyB2bXN0YXRlX2luZm9fYml0bWFwID0geworICAgIC5uYW1lID0gImJpdG1hcCIsCisgICAgLmdldCA9IGdldF9iaXRtYXAsCisgICAgLnB1dCA9IHB1dF9iaXRtYXAsCit9OworCit0eXBlZGVmIHN0cnVjdCBDb21wYXRFbnRyeSB7CisgICAgY2hhciBpZHN0clsyNTZdOworICAgIGludCBpbnN0YW5jZV9pZDsKK30gQ29tcGF0RW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFNhdmVTdGF0ZUVudHJ5IHsKKyAgICBRVEFJTFFfRU5UUlkoU2F2ZVN0YXRlRW50cnkpIGVudHJ5OworICAgIGNoYXIgaWRzdHJbMjU2XTsKKyAgICBpbnQgaW5zdGFuY2VfaWQ7CisgICAgaW50IGFsaWFzX2lkOworICAgIGludCB2ZXJzaW9uX2lkOworICAgIGludCBzZWN0aW9uX2lkOworICAgIFNhdmVWTUhhbmRsZXJzICpvcHM7CisgICAgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkOworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICBDb21wYXRFbnRyeSAqY29tcGF0OworICAgIGludCBub19taWdyYXRlOworICAgIGludCBpc19yYW07Cit9IFNhdmVTdGF0ZUVudHJ5OworCisKK3N0YXRpYyBRVEFJTFFfSEVBRChzYXZldm1faGFuZGxlcnMsIFNhdmVTdGF0ZUVudHJ5KSBzYXZldm1faGFuZGxlcnMgPQorICAgIFFUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKHNhdmV2bV9oYW5kbGVycyk7CitzdGF0aWMgaW50IGdsb2JhbF9zZWN0aW9uX2lkOworCitzdGF0aWMgaW50IGNhbGN1bGF0ZV9uZXdfaW5zdGFuY2VfaWQoY29uc3QgY2hhciAqaWRzdHIpCit7CisgICAgU2F2ZVN0YXRlRW50cnkgKnNlOworICAgIGludCBpbnN0YW5jZV9pZCA9IDA7CisKKyAgICBRVEFJTFFfRk9SRUFDSChzZSwgJnNhdmV2bV9oYW5kbGVycywgZW50cnkpIHsKKyAgICAgICAgaWYgKHN0cmNtcChpZHN0ciwgc2UtPmlkc3RyKSA9PSAwCisgICAgICAgICAgICAmJiBpbnN0YW5jZV9pZCA8PSBzZS0+aW5zdGFuY2VfaWQpIHsKKyAgICAgICAgICAgIGluc3RhbmNlX2lkID0gc2UtPmluc3RhbmNlX2lkICsgMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5zdGFuY2VfaWQ7Cit9CisKK3N0YXRpYyBpbnQgY2FsY3VsYXRlX2NvbXBhdF9pbnN0YW5jZV9pZChjb25zdCBjaGFyICppZHN0cikKK3sKKyAgICBTYXZlU3RhdGVFbnRyeSAqc2U7CisgICAgaW50IGluc3RhbmNlX2lkID0gMDsKKworICAgIFFUQUlMUV9GT1JFQUNIKHNlLCAmc2F2ZXZtX2hhbmRsZXJzLCBlbnRyeSkgeworICAgICAgICBpZiAoIXNlLT5jb21wYXQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoc3RyY21wKGlkc3RyLCBzZS0+Y29tcGF0LT5pZHN0cikgPT0gMAorICAgICAgICAgICAgJiYgaW5zdGFuY2VfaWQgPD0gc2UtPmNvbXBhdC0+aW5zdGFuY2VfaWQpIHsKKyAgICAgICAgICAgIGluc3RhbmNlX2lkID0gc2UtPmNvbXBhdC0+aW5zdGFuY2VfaWQgKyAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnN0YW5jZV9pZDsKK30KKworLyogVE9ETzogSW5kaXZpZHVhbCBkZXZpY2VzIGdlbmVyYWxseSBoYXZlIHZlcnkgbGl0dGxlIGlkZWEgYWJvdXQgdGhlIHJlc3QKKyAgIG9mIHRoZSBzeXN0ZW0sIHNvIGluc3RhbmNlX2lkIHNob3VsZCBiZSByZW1vdmVkL3JlcGxhY2VkLgorICAgTWVhbndoaWxlIHBhc3MgLTEgYXMgaW5zdGFuY2VfaWQgaWYgeW91IGRvIG5vdCBhbHJlYWR5IGhhdmUgYSBjbGVhcmx5CisgICBkaXN0aW5ndWlzaGluZyBpZCBmb3IgYWxsIGluc3RhbmNlcyBvZiB5b3VyIGRldmljZSBjbGFzcy4gKi8KK2ludCByZWdpc3Rlcl9zYXZldm1fbGl2ZShEZXZpY2VTdGF0ZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbl9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlVk1IYW5kbGVycyAqb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBTYXZlU3RhdGVFbnRyeSAqc2U7CisKKyAgICBzZSA9IGdfbWFsbG9jMChzaXplb2YoU2F2ZVN0YXRlRW50cnkpKTsKKyAgICBzZS0+dmVyc2lvbl9pZCA9IHZlcnNpb25faWQ7CisgICAgc2UtPnNlY3Rpb25faWQgPSBnbG9iYWxfc2VjdGlvbl9pZCsrOworICAgIHNlLT5vcHMgPSBvcHM7CisgICAgc2UtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICBzZS0+dm1zZCA9IE5VTEw7CisgICAgc2UtPm5vX21pZ3JhdGUgPSAwOworICAgIC8qIGlmIHRoaXMgaXMgYSBsaXZlX3NhdmVtIHRoZW4gc2V0IGlzX3JhbSAqLworICAgIGlmIChvcHMtPnNhdmVfbGl2ZV9zdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHNlLT5pc19yYW0gPSAxOworICAgIH0KKworICAgIGlmIChkZXYpIHsKKyAgICAgICAgY2hhciAqaWQgPSBxZGV2X2dldF9kZXZfcGF0aChkZXYpOworICAgICAgICBpZiAoaWQpIHsKKyAgICAgICAgICAgIHBzdHJjcHkoc2UtPmlkc3RyLCBzaXplb2Yoc2UtPmlkc3RyKSwgaWQpOworICAgICAgICAgICAgcHN0cmNhdChzZS0+aWRzdHIsIHNpemVvZihzZS0+aWRzdHIpLCAiLyIpOworICAgICAgICAgICAgZ19mcmVlKGlkKTsKKworICAgICAgICAgICAgc2UtPmNvbXBhdCA9IGdfbWFsbG9jMChzaXplb2YoQ29tcGF0RW50cnkpKTsKKyAgICAgICAgICAgIHBzdHJjcHkoc2UtPmNvbXBhdC0+aWRzdHIsIHNpemVvZihzZS0+Y29tcGF0LT5pZHN0ciksIGlkc3RyKTsKKyAgICAgICAgICAgIHNlLT5jb21wYXQtPmluc3RhbmNlX2lkID0gaW5zdGFuY2VfaWQgPT0gLTEgPworICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZV9jb21wYXRfaW5zdGFuY2VfaWQoaWRzdHIpIDogaW5zdGFuY2VfaWQ7CisgICAgICAgICAgICBpbnN0YW5jZV9pZCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHBzdHJjYXQoc2UtPmlkc3RyLCBzaXplb2Yoc2UtPmlkc3RyKSwgaWRzdHIpOworCisgICAgaWYgKGluc3RhbmNlX2lkID09IC0xKSB7CisgICAgICAgIHNlLT5pbnN0YW5jZV9pZCA9IGNhbGN1bGF0ZV9uZXdfaW5zdGFuY2VfaWQoc2UtPmlkc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZS0+aW5zdGFuY2VfaWQgPSBpbnN0YW5jZV9pZDsKKyAgICB9CisgICAgYXNzZXJ0KCFzZS0+Y29tcGF0IHx8IHNlLT5pbnN0YW5jZV9pZCA9PSAwKTsKKyAgICAvKiBhZGQgYXQgdGhlIGVuZCBvZiBsaXN0ICovCisgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZzYXZldm1faGFuZGxlcnMsIHNlLCBlbnRyeSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCByZWdpc3Rlcl9zYXZldm0oRGV2aWNlU3RhdGUgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaWRzdHIsCisgICAgICAgICAgICAgICAgICAgIGludCBpbnN0YW5jZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb25faWQsCisgICAgICAgICAgICAgICAgICAgIFNhdmVTdGF0ZUhhbmRsZXIgKnNhdmVfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIExvYWRTdGF0ZUhhbmRsZXIgKmxvYWRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBTYXZlVk1IYW5kbGVycyAqb3BzID0gZ19tYWxsb2MwKHNpemVvZihTYXZlVk1IYW5kbGVycykpOworICAgIG9wcy0+c2F2ZV9zdGF0ZSA9IHNhdmVfc3RhdGU7CisgICAgb3BzLT5sb2FkX3N0YXRlID0gbG9hZF9zdGF0ZTsKKyAgICByZXR1cm4gcmVnaXN0ZXJfc2F2ZXZtX2xpdmUoZGV2LCBpZHN0ciwgaW5zdGFuY2VfaWQsIHZlcnNpb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcywgb3BhcXVlKTsKK30KKwordm9pZCB1bnJlZ2lzdGVyX3NhdmV2bShEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBjaGFyICppZHN0ciwgdm9pZCAqb3BhcXVlKQoreworICAgIFNhdmVTdGF0ZUVudHJ5ICpzZSwgKm5ld19zZTsKKyAgICBjaGFyIGlkWzI1Nl0gPSAiIjsKKworICAgIGlmIChkZXYpIHsKKyAgICAgICAgY2hhciAqcGF0aCA9IHFkZXZfZ2V0X2Rldl9wYXRoKGRldik7CisgICAgICAgIGlmIChwYXRoKSB7CisgICAgICAgICAgICBwc3RyY3B5KGlkLCBzaXplb2YoaWQpLCBwYXRoKTsKKyAgICAgICAgICAgIHBzdHJjYXQoaWQsIHNpemVvZihpZCksICIvIik7CisgICAgICAgICAgICBnX2ZyZWUocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHN0cmNhdChpZCwgc2l6ZW9mKGlkKSwgaWRzdHIpOworCisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShzZSwgJnNhdmV2bV9oYW5kbGVycywgZW50cnksIG5ld19zZSkgeworICAgICAgICBpZiAoc3RyY21wKHNlLT5pZHN0ciwgaWQpID09IDAgJiYgc2UtPm9wYXF1ZSA9PSBvcGFxdWUpIHsKKyAgICAgICAgICAgIFFUQUlMUV9SRU1PVkUoJnNhdmV2bV9oYW5kbGVycywgc2UsIGVudHJ5KTsKKyAgICAgICAgICAgIGlmIChzZS0+Y29tcGF0KSB7CisgICAgICAgICAgICAgICAgZ19mcmVlKHNlLT5jb21wYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ19mcmVlKHNlLT5vcHMpOworICAgICAgICAgICAgZ19mcmVlKHNlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IHZtc3RhdGVfcmVnaXN0ZXJfd2l0aF9hbGlhc19pZChEZXZpY2VTdGF0ZSAqZGV2LCBpbnQgaW5zdGFuY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiAqdm1zZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlLCBpbnQgYWxpYXNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1aXJlZF9mb3JfdmVyc2lvbikKK3sKKyAgICBTYXZlU3RhdGVFbnRyeSAqc2U7CisKKyAgICAvKiBJZiB0aGlzIHRyaWdnZXJzLCBhbGlhcyBzdXBwb3J0IGNhbiBiZSBkcm9wcGVkIGZvciB0aGUgdm1zZC4gKi8KKyAgICBhc3NlcnQoYWxpYXNfaWQgPT0gLTEgfHwgcmVxdWlyZWRfZm9yX3ZlcnNpb24gPj0gdm1zZC0+bWluaW11bV92ZXJzaW9uX2lkKTsKKworICAgIHNlID0gZ19tYWxsb2MwKHNpemVvZihTYXZlU3RhdGVFbnRyeSkpOworICAgIHNlLT52ZXJzaW9uX2lkID0gdm1zZC0+dmVyc2lvbl9pZDsKKyAgICBzZS0+c2VjdGlvbl9pZCA9IGdsb2JhbF9zZWN0aW9uX2lkKys7CisgICAgc2UtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICBzZS0+dm1zZCA9IHZtc2Q7CisgICAgc2UtPmFsaWFzX2lkID0gYWxpYXNfaWQ7CisgICAgc2UtPm5vX21pZ3JhdGUgPSB2bXNkLT51bm1pZ3JhdGFibGU7CisKKyAgICBpZiAoZGV2KSB7CisgICAgICAgIGNoYXIgKmlkID0gcWRldl9nZXRfZGV2X3BhdGgoZGV2KTsKKyAgICAgICAgaWYgKGlkKSB7CisgICAgICAgICAgICBwc3RyY3B5KHNlLT5pZHN0ciwgc2l6ZW9mKHNlLT5pZHN0ciksIGlkKTsKKyAgICAgICAgICAgIHBzdHJjYXQoc2UtPmlkc3RyLCBzaXplb2Yoc2UtPmlkc3RyKSwgIi8iKTsKKyAgICAgICAgICAgIGdfZnJlZShpZCk7CisKKyAgICAgICAgICAgIHNlLT5jb21wYXQgPSBnX21hbGxvYzAoc2l6ZW9mKENvbXBhdEVudHJ5KSk7CisgICAgICAgICAgICBwc3RyY3B5KHNlLT5jb21wYXQtPmlkc3RyLCBzaXplb2Yoc2UtPmNvbXBhdC0+aWRzdHIpLCB2bXNkLT5uYW1lKTsKKyAgICAgICAgICAgIHNlLT5jb21wYXQtPmluc3RhbmNlX2lkID0gaW5zdGFuY2VfaWQgPT0gLTEgPworICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZV9jb21wYXRfaW5zdGFuY2VfaWQodm1zZC0+bmFtZSkgOiBpbnN0YW5jZV9pZDsKKyAgICAgICAgICAgIGluc3RhbmNlX2lkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcHN0cmNhdChzZS0+aWRzdHIsIHNpemVvZihzZS0+aWRzdHIpLCB2bXNkLT5uYW1lKTsKKworICAgIGlmIChpbnN0YW5jZV9pZCA9PSAtMSkgeworICAgICAgICBzZS0+aW5zdGFuY2VfaWQgPSBjYWxjdWxhdGVfbmV3X2luc3RhbmNlX2lkKHNlLT5pZHN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2UtPmluc3RhbmNlX2lkID0gaW5zdGFuY2VfaWQ7CisgICAgfQorICAgIGFzc2VydCghc2UtPmNvbXBhdCB8fCBzZS0+aW5zdGFuY2VfaWQgPT0gMCk7CisgICAgLyogYWRkIGF0IHRoZSBlbmQgb2YgbGlzdCAqLworICAgIFFUQUlMUV9JTlNFUlRfVEFJTCgmc2F2ZXZtX2hhbmRsZXJzLCBzZSwgZW50cnkpOworICAgIHJldHVybiAwOworfQorCit2b2lkIHZtc3RhdGVfdW5yZWdpc3RlcihEZXZpY2VTdGF0ZSAqZGV2LCBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnZtc2QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgU2F2ZVN0YXRlRW50cnkgKnNlLCAqbmV3X3NlOworCisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShzZSwgJnNhdmV2bV9oYW5kbGVycywgZW50cnksIG5ld19zZSkgeworICAgICAgICBpZiAoc2UtPnZtc2QgPT0gdm1zZCAmJiBzZS0+b3BhcXVlID09IG9wYXF1ZSkgeworICAgICAgICAgICAgUVRBSUxRX1JFTU9WRSgmc2F2ZXZtX2hhbmRsZXJzLCBzZSwgZW50cnkpOworICAgICAgICAgICAgaWYgKHNlLT5jb21wYXQpIHsKKyAgICAgICAgICAgICAgICBnX2ZyZWUoc2UtPmNvbXBhdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnX2ZyZWUoc2UpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2bXN0YXRlX3N1YnNlY3Rpb25fc2F2ZShRRU1VRmlsZSAqZiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK3N0YXRpYyBpbnQgdm1zdGF0ZV9zdWJzZWN0aW9uX2xvYWQoUUVNVUZpbGUgKmYsIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiAqdm1zZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKworaW50IHZtc3RhdGVfbG9hZF9zdGF0ZShRRU1VRmlsZSAqZiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIFZNU3RhdGVGaWVsZCAqZmllbGQgPSB2bXNkLT5maWVsZHM7CisgICAgaW50IHJldDsKKworICAgIGlmICh2ZXJzaW9uX2lkID4gdm1zZC0+dmVyc2lvbl9pZCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgaWYgKHZlcnNpb25faWQgPCB2bXNkLT5taW5pbXVtX3ZlcnNpb25faWRfb2xkKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAgKHZlcnNpb25faWQgPCB2bXNkLT5taW5pbXVtX3ZlcnNpb25faWQpIHsKKyAgICAgICAgcmV0dXJuIHZtc2QtPmxvYWRfc3RhdGVfb2xkKGYsIG9wYXF1ZSwgdmVyc2lvbl9pZCk7CisgICAgfQorICAgIGlmICh2bXNkLT5wcmVfbG9hZCkgeworICAgICAgICBpbnQgcmV0ID0gdm1zZC0+cHJlX2xvYWQob3BhcXVlKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHdoaWxlKGZpZWxkLT5uYW1lKSB7CisgICAgICAgIGlmICgoZmllbGQtPmZpZWxkX2V4aXN0cyAmJgorICAgICAgICAgICAgIGZpZWxkLT5maWVsZF9leGlzdHMob3BhcXVlLCB2ZXJzaW9uX2lkKSkgfHwKKyAgICAgICAgICAgICghZmllbGQtPmZpZWxkX2V4aXN0cyAmJgorICAgICAgICAgICAgIGZpZWxkLT52ZXJzaW9uX2lkIDw9IHZlcnNpb25faWQpKSB7CisgICAgICAgICAgICB2b2lkICpiYXNlX2FkZHIgPSBvcGFxdWUgKyBmaWVsZC0+b2Zmc2V0OworICAgICAgICAgICAgaW50IGksIG5fZWxlbXMgPSAxOworICAgICAgICAgICAgaW50IHNpemUgPSBmaWVsZC0+c2l6ZTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19WQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9ICooaW50MzJfdCAqKShvcGFxdWUrZmllbGQtPnNpemVfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQtPmZsYWdzICYgVk1TX01VTFRJUExZKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgKj0gZmllbGQtPnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19BUlJBWSkgeworICAgICAgICAgICAgICAgIG5fZWxlbXMgPSBmaWVsZC0+bnVtOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfVkFSUkFZX0lOVDMyKSB7CisgICAgICAgICAgICAgICAgbl9lbGVtcyA9ICooaW50MzJfdCAqKShvcGFxdWUrZmllbGQtPm51bV9vZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfVkFSUkFZX1VJTlQzMikgeworICAgICAgICAgICAgICAgIG5fZWxlbXMgPSAqKHVpbnQzMl90ICopKG9wYXF1ZStmaWVsZC0+bnVtX29mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19WQVJSQVlfVUlOVDE2KSB7CisgICAgICAgICAgICAgICAgbl9lbGVtcyA9ICoodWludDE2X3QgKikob3BhcXVlK2ZpZWxkLT5udW1fb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmZsYWdzICYgVk1TX1ZBUlJBWV9VSU5UOCkgeworICAgICAgICAgICAgICAgIG5fZWxlbXMgPSAqKHVpbnQ4X3QgKikob3BhcXVlK2ZpZWxkLT5udW1fb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfUE9JTlRFUikgeworICAgICAgICAgICAgICAgIGJhc2VfYWRkciA9ICoodm9pZCAqKiliYXNlX2FkZHIgKyBmaWVsZC0+c3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9lbGVtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqYWRkciA9IGJhc2VfYWRkciArIHNpemUgKiBpOworCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19BUlJBWV9PRl9QT0lOVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAqKHZvaWQgKiopYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdm1zdGF0ZV9sb2FkX3N0YXRlKGYsIGZpZWxkLT52bXNkLCBhZGRyLCBmaWVsZC0+dm1zZC0+dmVyc2lvbl9pZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmllbGQtPmluZm8tPmdldChmLCBhZGRyLCBzaXplKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWVsZCsrOworICAgIH0KKyAgICByZXQgPSB2bXN0YXRlX3N1YnNlY3Rpb25fbG9hZChmLCB2bXNkLCBvcGFxdWUpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAodm1zZC0+cG9zdF9sb2FkKSB7CisgICAgICAgIHJldHVybiB2bXNkLT5wb3N0X2xvYWQob3BhcXVlLCB2ZXJzaW9uX2lkKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgdm1zdGF0ZV9zYXZlX3N0YXRlKFFFTVVGaWxlICpmLCBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnZtc2QsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgVk1TdGF0ZUZpZWxkICpmaWVsZCA9IHZtc2QtPmZpZWxkczsKKworICAgIGlmICh2bXNkLT5wcmVfc2F2ZSkgeworICAgICAgICB2bXNkLT5wcmVfc2F2ZShvcGFxdWUpOworICAgIH0KKyAgICB3aGlsZShmaWVsZC0+bmFtZSkgeworICAgICAgICBpZiAoIWZpZWxkLT5maWVsZF9leGlzdHMgfHwKKyAgICAgICAgICAgIGZpZWxkLT5maWVsZF9leGlzdHMob3BhcXVlLCB2bXNkLT52ZXJzaW9uX2lkKSkgeworICAgICAgICAgICAgdm9pZCAqYmFzZV9hZGRyID0gb3BhcXVlICsgZmllbGQtPm9mZnNldDsKKyAgICAgICAgICAgIGludCBpLCBuX2VsZW1zID0gMTsKKyAgICAgICAgICAgIGludCBzaXplID0gZmllbGQtPnNpemU7CisKKyAgICAgICAgICAgIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfVkJVRkZFUikgeworICAgICAgICAgICAgICAgIHNpemUgPSAqKGludDMyX3QgKikob3BhcXVlK2ZpZWxkLT5zaXplX29mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19NVUxUSVBMWSkgeworICAgICAgICAgICAgICAgICAgICBzaXplICo9IGZpZWxkLT5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfQVJSQVkpIHsKKyAgICAgICAgICAgICAgICBuX2VsZW1zID0gZmllbGQtPm51bTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmZsYWdzICYgVk1TX1ZBUlJBWV9JTlQzMikgeworICAgICAgICAgICAgICAgIG5fZWxlbXMgPSAqKGludDMyX3QgKikob3BhcXVlK2ZpZWxkLT5udW1fb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmZsYWdzICYgVk1TX1ZBUlJBWV9VSU5UMzIpIHsKKyAgICAgICAgICAgICAgICBuX2VsZW1zID0gKih1aW50MzJfdCAqKShvcGFxdWUrZmllbGQtPm51bV9vZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfVkFSUkFZX1VJTlQxNikgeworICAgICAgICAgICAgICAgIG5fZWxlbXMgPSAqKHVpbnQxNl90ICopKG9wYXF1ZStmaWVsZC0+bnVtX29mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5mbGFncyAmIFZNU19WQVJSQVlfVUlOVDgpIHsKKyAgICAgICAgICAgICAgICBuX2VsZW1zID0gKih1aW50OF90ICopKG9wYXF1ZStmaWVsZC0+bnVtX29mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmllbGQtPmZsYWdzICYgVk1TX1BPSU5URVIpIHsKKyAgICAgICAgICAgICAgICBiYXNlX2FkZHIgPSAqKHZvaWQgKiopYmFzZV9hZGRyICsgZmllbGQtPnN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fZWxlbXM7IGkrKykgeworICAgICAgICAgICAgICAgIHZvaWQgKmFkZHIgPSBiYXNlX2FkZHIgKyBzaXplICogaTsKKworICAgICAgICAgICAgICAgIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfQVJSQVlfT0ZfUE9JTlRFUikgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gKih2b2lkICoqKWFkZHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC0+ZmxhZ3MgJiBWTVNfU1RSVUNUKSB7CisgICAgICAgICAgICAgICAgICAgIHZtc3RhdGVfc2F2ZV9zdGF0ZShmLCBmaWVsZC0+dm1zZCwgYWRkcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQtPmluZm8tPnB1dChmLCBhZGRyLCBzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmllbGQrKzsKKyAgICB9CisgICAgdm1zdGF0ZV9zdWJzZWN0aW9uX3NhdmUoZiwgdm1zZCwgb3BhcXVlKTsKK30KKworc3RhdGljIGludCB2bXN0YXRlX2xvYWQoUUVNVUZpbGUgKmYsIFNhdmVTdGF0ZUVudHJ5ICpzZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgaWYgKCFzZS0+dm1zZCkgeyAgICAgICAgIC8qIE9sZCBzdHlsZSAqLworICAgICAgICByZXR1cm4gc2UtPm9wcy0+bG9hZF9zdGF0ZShmLCBzZS0+b3BhcXVlLCB2ZXJzaW9uX2lkKTsKKyAgICB9CisgICAgcmV0dXJuIHZtc3RhdGVfbG9hZF9zdGF0ZShmLCBzZS0+dm1zZCwgc2UtPm9wYXF1ZSwgdmVyc2lvbl9pZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZtc3RhdGVfc2F2ZShRRU1VRmlsZSAqZiwgU2F2ZVN0YXRlRW50cnkgKnNlKQoreworICAgIGlmICghc2UtPnZtc2QpIHsgICAgICAgICAvKiBPbGQgc3R5bGUgKi8KKyAgICAgICAgc2UtPm9wcy0+c2F2ZV9zdGF0ZShmLCBzZS0+b3BhcXVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2bXN0YXRlX3NhdmVfc3RhdGUoZixzZS0+dm1zZCwgc2UtPm9wYXF1ZSk7Cit9CisKKyNkZWZpbmUgUUVNVV9WTV9GSUxFX01BR0lDICAgICAgICAgICAweDUxNDU1NjRkCisjZGVmaW5lIFFFTVVfVk1fRklMRV9WRVJTSU9OX0NPTVBBVCAgMHgwMDAwMDAwMgorI2RlZmluZSBRRU1VX1ZNX0ZJTEVfVkVSU0lPTiAgICAgICAgIDB4MDAwMDAwMDQKKworI2RlZmluZSBRRU1VX1ZNX0VPRiAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUUVNVV9WTV9TRUNUSU9OX1NUQVJUICAgICAgICAweDAxCisjZGVmaW5lIFFFTVVfVk1fU0VDVElPTl9QQVJUICAgICAgICAgMHgwMgorI2RlZmluZSBRRU1VX1ZNX1NFQ1RJT05fRU5EICAgICAgICAgIDB4MDMKKyNkZWZpbmUgUUVNVV9WTV9TRUNUSU9OX0ZVTEwgICAgICAgICAweDA0CisjZGVmaW5lIFFFTVVfVk1fU1VCU0VDVElPTiAgICAgICAgICAgMHgwNQorCitib29sIHFlbXVfc2F2ZXZtX3N0YXRlX2Jsb2NrZWQoRXJyb3IgKiplcnJwKQoreworICAgIFNhdmVTdGF0ZUVudHJ5ICpzZTsKKworICAgIFFUQUlMUV9GT1JFQUNIKHNlLCAmc2F2ZXZtX2hhbmRsZXJzLCBlbnRyeSkgeworICAgICAgICBpZiAoc2UtPm5vX21pZ3JhdGUpIHsKKyAgICAgICAgICAgIGVycm9yX3NldChlcnJwLCBRRVJSX01JR1JBVElPTl9OT1RfU1VQUE9SVEVELCBzZS0+aWRzdHIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgcWVtdV9zYXZldm1fc3RhdGVfYmVnaW4oUUVNVUZpbGUgKmYpCit7CisgICAgU2F2ZVN0YXRlRW50cnkgKnNlOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBRRU1VX1ZNX0ZJTEVfTUFHSUMpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgUUVNVV9WTV9GSUxFX1ZFUlNJT04pOworCisgICAgUVRBSUxRX0ZPUkVBQ0goc2UsICZzYXZldm1faGFuZGxlcnMsIGVudHJ5KSB7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgaWYgKCFzZS0+b3BzIHx8ICFzZS0+b3BzLT5zYXZlX2xpdmVfc3RhdGUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjaWYgMAorICAgICAgICBpZiAoc2UtPm9wcyAmJiBzZS0+b3BzLT5pc19hY3RpdmUpIHsKKyAgICAgICAgICAgIGlmICghc2UtPm9wcy0+aXNfYWN0aXZlKHNlLT5vcGFxdWUpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBTZWN0aW9uIHR5cGUgKi8KKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBRRU1VX1ZNX1NFQ1RJT05fU1RBUlQpOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHNlLT5zZWN0aW9uX2lkKTsKKworICAgICAgICAvKiBJRCBzdHJpbmcgKi8KKyAgICAgICAgbGVuID0gc3RybGVuKHNlLT5pZHN0cik7CisgICAgICAgIHFlbXVfcHV0X2J5dGUoZiwgbGVuKTsKKyAgICAgICAgcWVtdV9wdXRfYnVmZmVyKGYsICh1aW50OF90ICopc2UtPmlkc3RyLCBsZW4pOworCisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgc2UtPmluc3RhbmNlX2lkKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzZS0+dmVyc2lvbl9pZCk7CisKKyAgICAgICAgc2UtPm9wcy0+c2F2ZV9saXZlX3N0YXRlKGYsIFFFTVVfVk1fU0VDVElPTl9TVEFSVCwgc2UtPm9wYXF1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHFlbXVfZmlsZV9nZXRfZXJyb3IoZik7Cit9CisKK2ludCBxZW11X3NhdmV2bV9zdGF0ZV9pdGVyYXRlKFFFTVVGaWxlICpmKQoreworICAgIFNhdmVTdGF0ZUVudHJ5ICpzZTsKKyAgICBpbnQgcmV0ID0gMTsKKworICAgIFFUQUlMUV9GT1JFQUNIKHNlLCAmc2F2ZXZtX2hhbmRsZXJzLCBlbnRyeSkgeworICAgICAgICBpZiAoIXNlLT5vcHMgfHwgIXNlLT5vcHMtPnNhdmVfbGl2ZV9zdGF0ZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNpZiAwCisgICAgICAgIGlmIChzZS0+b3BzICYmIHNlLT5vcHMtPmlzX2FjdGl2ZSkgeworICAgICAgICAgICAgaWYgKCFzZS0+b3BzLT5pc19hY3RpdmUoc2UtPm9wYXF1ZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChxZW11X2ZpbGVfcmF0ZV9saW1pdChmKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLy90cmFjZV9zYXZldm1fc2VjdGlvbl9zdGFydCgpOworICAgICAgICAvKiBTZWN0aW9uIHR5cGUgKi8KKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBRRU1VX1ZNX1NFQ1RJT05fUEFSVCk7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgc2UtPnNlY3Rpb25faWQpOworCisgICAgICAgIHJldCAmPSAhIXNlLT5vcHMtPnNhdmVfbGl2ZV9zdGF0ZShmLCBRRU1VX1ZNX1NFQ1RJT05fUEFSVCwgc2UtPm9wYXF1ZSk7CisgICAgfQorCisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gcWVtdV9maWxlX2dldF9lcnJvcihmKTsKK30KKworaW50IHFlbXVfc2F2ZXZtX3N0YXRlX2NvbXBsZXRlKFFFTVVGaWxlICpmKQoreworICAgIFNhdmVTdGF0ZUVudHJ5ICpzZTsKKworICAgIC8vIGNwdV9zeW5jaHJvbml6ZV9hbGxfc3RhdGVzKCk7CisKKyAgICBRVEFJTFFfRk9SRUFDSChzZSwgJnNhdmV2bV9oYW5kbGVycywgZW50cnkpIHsKKyAgICAgICAgaWYgKCFzZS0+b3BzIHx8IHNlLT5vcHMtPnNhdmVfbGl2ZV9zdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgaWYgKHNlLT5vcHMgJiYgc2UtPm9wcy0+aXNfYWN0aXZlKSB7CisgICAgICAgICAgICBpZiAoIXNlLT5vcHMtPmlzX2FjdGl2ZShzZS0+b3BhcXVlKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLy90cmFjZV9zYXZldm1fc2VjdGlvbl9zdGFydCgpOworICAgICAgICAvKiBTZWN0aW9uIHR5cGUgKi8KKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBRRU1VX1ZNX1NFQ1RJT05fRU5EKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzZS0+c2VjdGlvbl9pZCk7CisKKyAgICAgICAgc2UtPm9wcy0+c2F2ZV9saXZlX3N0YXRlKGYsIFFFTVVfVk1fU0VDVElPTl9FTkQsIHNlLT5vcGFxdWUpOworICAgIH0KKworICAgIFFUQUlMUV9GT1JFQUNIKHNlLCAmc2F2ZXZtX2hhbmRsZXJzLCBlbnRyeSkgeworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGlmICgoIXNlLT5vcHMgfHwgIXNlLT5vcHMtPnNhdmVfc3RhdGUpICYmICFzZS0+dm1zZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBTZWN0aW9uIHR5cGUgKi8KKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBRRU1VX1ZNX1NFQ1RJT05fRlVMTCk7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgc2UtPnNlY3Rpb25faWQpOworCisgICAgICAgIC8qIElEIHN0cmluZyAqLworICAgICAgICBsZW4gPSBzdHJsZW4oc2UtPmlkc3RyKTsKKyAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCBsZW4pOworICAgICAgICBxZW11X3B1dF9idWZmZXIoZiwgKHVpbnQ4X3QgKilzZS0+aWRzdHIsIGxlbik7CisKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBzZS0+aW5zdGFuY2VfaWQpOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHNlLT52ZXJzaW9uX2lkKTsKKworICAgICAgICB2bXN0YXRlX3NhdmUoZiwgc2UpOworICAgIH0KKworICAgIHFlbXVfcHV0X2J5dGUoZiwgUUVNVV9WTV9FT0YpOworICAgIHFlbXVfZmZsdXNoKGYpOworCisgICAgcmV0dXJuIHFlbXVfZmlsZV9nZXRfZXJyb3IoZik7Cit9CisKK2ludCBxZW11X3NhdmV2bV9zdGF0ZShRRU1VRmlsZSAqZikKK3sKKyAgICBpbnQgc2F2ZWRfdm1fcnVubmluZzsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHFlbXVfc2F2ZXZtX3N0YXRlX2Jsb2NrZWQoTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgc2F2ZWRfdm1fcnVubmluZyA9IHZtX3J1bm5pbmc7CisgICAgdm1fc3RvcCgwKTsKKworICAgIGJkcnZfZmx1c2hfYWxsKCk7CisKKyAgICByZXQgPSBxZW11X3NhdmV2bV9zdGF0ZV9iZWdpbihmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IHFlbXVfc2F2ZXZtX3N0YXRlX2l0ZXJhdGUoZik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgfSB3aGlsZSAocmV0ID09IDApOworCisgICAgcmV0ID0gcWVtdV9zYXZldm1fc3RhdGVfY29tcGxldGUoZik7CisKK291dDoKKyAgICByZXQgPSBxZW11X2ZpbGVfZ2V0X2Vycm9yKGYpOworCisgICAgaWYgKCFyZXQgJiYgc2F2ZWRfdm1fcnVubmluZykKKyAgICAgICAgdm1fc3RhcnQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBTYXZlU3RhdGVFbnRyeSAqZmluZF9zZShjb25zdCBjaGFyICppZHN0ciwgaW50IGluc3RhbmNlX2lkKQoreworICAgIFNhdmVTdGF0ZUVudHJ5ICpzZTsKKworICAgIFFUQUlMUV9GT1JFQUNIKHNlLCAmc2F2ZXZtX2hhbmRsZXJzLCBlbnRyeSkgeworICAgICAgICBpZiAoIXN0cmNtcChzZS0+aWRzdHIsIGlkc3RyKSAmJgorICAgICAgICAgICAgKGluc3RhbmNlX2lkID09IHNlLT5pbnN0YW5jZV9pZCB8fAorICAgICAgICAgICAgIGluc3RhbmNlX2lkID09IHNlLT5hbGlhc19pZCkpCisgICAgICAgICAgICByZXR1cm4gc2U7CisgICAgICAgIC8qIE1pZ3JhdGluZyBmcm9tIGFuIG9sZGVyIHZlcnNpb24/ICovCisgICAgICAgIGlmIChzdHJzdHIoc2UtPmlkc3RyLCBpZHN0cikgJiYgc2UtPmNvbXBhdCkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoc2UtPmNvbXBhdC0+aWRzdHIsIGlkc3RyKSAmJgorICAgICAgICAgICAgICAgIChpbnN0YW5jZV9pZCA9PSBzZS0+Y29tcGF0LT5pbnN0YW5jZV9pZCB8fAorICAgICAgICAgICAgICAgICBpbnN0YW5jZV9pZCA9PSBzZS0+YWxpYXNfaWQpKQorICAgICAgICAgICAgICAgIHJldHVybiBzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiAqdm1zdGF0ZV9nZXRfc3Vic2VjdGlvbihjb25zdCBWTVN0YXRlU3Vic2VjdGlvbiAqc3ViLCBjaGFyICppZHN0cikKK3sKKyAgICB3aGlsZShzdWIgJiYgc3ViLT5uZWVkZWQpIHsKKyAgICAgICAgaWYgKHN0cmNtcChpZHN0ciwgc3ViLT52bXNkLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViLT52bXNkOworICAgICAgICB9CisgICAgICAgIHN1YisrOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB2bXN0YXRlX3N1YnNlY3Rpb25fbG9hZChRRU1VRmlsZSAqZiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgd2hpbGUgKHFlbXVfcGVla19ieXRlKGYsIDApID09IFFFTVVfVk1fU1VCU0VDVElPTikgeworICAgICAgICBjaGFyIGlkc3RyWzI1Nl07CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHVpbnQ4X3QgdmVyc2lvbl9pZCwgbGVuLCBzaXplOworICAgICAgICBjb25zdCBWTVN0YXRlRGVzY3JpcHRpb24gKnN1Yl92bXNkOworCisgICAgICAgIGxlbiA9IHFlbXVfcGVla19ieXRlKGYsIDEpOworICAgICAgICBpZiAobGVuIDwgc3RybGVuKHZtc2QtPm5hbWUpICsgMSkgeworICAgICAgICAgICAgLyogc3Vic2VjdGlvbiBuYW1lIGhhcyBiZSBiZSAic2VjdGlvbl9uYW1lL2EiICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzaXplID0gcWVtdV9wZWVrX2J1ZmZlcihmLCAodWludDhfdCAqKWlkc3RyLCBsZW4sIDIpOworICAgICAgICBpZiAoc2l6ZSAhPSBsZW4pIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlkc3RyW3NpemVdID0gMDsKKworICAgICAgICBpZiAoc3RybmNtcCh2bXNkLT5uYW1lLCBpZHN0ciwgc3RybGVuKHZtc2QtPm5hbWUpKSAhPSAwKSB7CisgICAgICAgICAgICAvKiBpdCBkb24ndCBoYXZlIGEgdmFsaWQgc3Vic2VjdGlvbiBuYW1lICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBzdWJfdm1zZCA9IHZtc3RhdGVfZ2V0X3N1YnNlY3Rpb24odm1zZC0+c3Vic2VjdGlvbnMsIGlkc3RyKTsKKyAgICAgICAgaWYgKHN1Yl92bXNkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIHFlbXVfZmlsZV9za2lwKGYsIDEpOyAvKiBzdWJzZWN0aW9uICovCisgICAgICAgIHFlbXVfZmlsZV9za2lwKGYsIDEpOyAvKiBsZW4gKi8KKyAgICAgICAgcWVtdV9maWxlX3NraXAoZiwgbGVuKTsgLyogaWRzdHIgKi8KKyAgICAgICAgdmVyc2lvbl9pZCA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICAgICAgcmV0ID0gdm1zdGF0ZV9sb2FkX3N0YXRlKGYsIHN1Yl92bXNkLCBvcGFxdWUsIHZlcnNpb25faWQpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bXN0YXRlX3N1YnNlY3Rpb25fc2F2ZShRRU1VRmlsZSAqZiwgY29uc3QgVk1TdGF0ZURlc2NyaXB0aW9uICp2bXNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIGNvbnN0IFZNU3RhdGVTdWJzZWN0aW9uICpzdWIgPSB2bXNkLT5zdWJzZWN0aW9uczsKKworICAgIHdoaWxlIChzdWIgJiYgc3ViLT5uZWVkZWQpIHsKKyAgICAgICAgaWYgKHN1Yi0+bmVlZGVkKG9wYXF1ZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IFZNU3RhdGVEZXNjcmlwdGlvbiAqdm1zZCA9IHN1Yi0+dm1zZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGVuOworCisgICAgICAgICAgICBxZW11X3B1dF9ieXRlKGYsIFFFTVVfVk1fU1VCU0VDVElPTik7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4odm1zZC0+bmFtZSk7CisgICAgICAgICAgICBxZW11X3B1dF9ieXRlKGYsIGxlbik7CisgICAgICAgICAgICBxZW11X3B1dF9idWZmZXIoZiwgKHVpbnQ4X3QgKil2bXNkLT5uYW1lLCBsZW4pOworICAgICAgICAgICAgcWVtdV9wdXRfYmUzMihmLCB2bXNkLT52ZXJzaW9uX2lkKTsKKyAgICAgICAgICAgIHZtc3RhdGVfc2F2ZV9zdGF0ZShmLCB2bXNkLCBvcGFxdWUpOworICAgICAgICB9CisgICAgICAgIHN1YisrOworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QgTG9hZFN0YXRlRW50cnkgeworICAgIFFMSVNUX0VOVFJZKExvYWRTdGF0ZUVudHJ5KSBlbnRyeTsKKyAgICBTYXZlU3RhdGVFbnRyeSAqc2U7CisgICAgaW50IHNlY3Rpb25faWQ7CisgICAgaW50IHZlcnNpb25faWQ7Cit9IExvYWRTdGF0ZUVudHJ5OworCitpbnQgcWVtdV9sb2Fkdm1fc3RhdGUoUUVNVUZpbGUgKmYpCit7CisgICAgUUxJU1RfSEVBRCgsIExvYWRTdGF0ZUVudHJ5KSBsb2Fkdm1faGFuZGxlcnMgPQorICAgICAgICBRTElTVF9IRUFEX0lOSVRJQUxJWkVSKGxvYWR2bV9oYW5kbGVycyk7CisgICAgTG9hZFN0YXRlRW50cnkgKmxlLCAqbmV3X2xlOworICAgIHVpbnQ4X3Qgc2VjdGlvbl90eXBlOworICAgIHVuc2lnbmVkIGludCB2OworICAgIGludCByZXQ7CisKKyAgICBpZiAocWVtdV9zYXZldm1fc3RhdGVfYmxvY2tlZChOVUxMKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB2ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBpZiAodiAhPSBRRU1VX1ZNX0ZJTEVfTUFHSUMpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgdiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgaWYgKHYgPCBRRU1VX1ZNX0ZJTEVfVkVSU0lPTikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNuYXBzaG90IGZvcm1hdCAlZCBpcyB0b28gb2xkIGZvciB0aGlzIHZlcnNpb24gb2YgdGhlIGVtdWxhdG9yLCBwbGVhc2UgY3JlYXRlIGEgbmV3IG9uZS5cbiIsIHYpOworICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgfSBlbHNlIGlmICh2ID4gUUVNVV9WTV9GSUxFX1ZFUlNJT04pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTbmFwc2hvdCBmb3JtYXQgJWQgaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgZW11bGF0b3IsIHBsZWFzZSB1cGRhdGUgeW91ciBBbmRyb2lkIFNESyBUb29scy5cbiIsIHYpOworICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgfQorCisgICAgd2hpbGUgKChzZWN0aW9uX3R5cGUgPSBxZW11X2dldF9ieXRlKGYpKSAhPSBRRU1VX1ZNX0VPRikgeworICAgICAgICB1aW50MzJfdCBpbnN0YW5jZV9pZCwgdmVyc2lvbl9pZCwgc2VjdGlvbl9pZDsKKyAgICAgICAgU2F2ZVN0YXRlRW50cnkgKnNlOworICAgICAgICBjaGFyIGlkc3RyWzI1N107CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgc3dpdGNoIChzZWN0aW9uX3R5cGUpIHsKKyAgICAgICAgY2FzZSBRRU1VX1ZNX1NFQ1RJT05fU1RBUlQ6CisgICAgICAgIGNhc2UgUUVNVV9WTV9TRUNUSU9OX0ZVTEw6CisgICAgICAgICAgICAvKiBSZWFkIHNlY3Rpb24gc3RhcnQgKi8KKyAgICAgICAgICAgIHNlY3Rpb25faWQgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICAgICAgbGVuID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICAgICAgICAgIHFlbXVfZ2V0X2J1ZmZlcihmLCAodWludDhfdCAqKWlkc3RyLCBsZW4pOworICAgICAgICAgICAgaWRzdHJbbGVuXSA9IDA7CisgICAgICAgICAgICBpbnN0YW5jZV9pZCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICAgICB2ZXJzaW9uX2lkID0gcWVtdV9nZXRfYmUzMihmKTsKKworICAgICAgICAgICAgLyogRmluZCBzYXZldm0gc2VjdGlvbiAqLworICAgICAgICAgICAgc2UgPSBmaW5kX3NlKGlkc3RyLCBpbnN0YW5jZV9pZCk7CisgICAgICAgICAgICBpZiAoc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBzYXZldm0gc2VjdGlvbiBvciBpbnN0YW5jZSAnJXMnICVkXG4iLCBpZHN0ciwgaW5zdGFuY2VfaWQpOworICAgICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFZhbGlkYXRlIHZlcnNpb24gKi8KKyAgICAgICAgICAgIGlmICh2ZXJzaW9uX2lkID4gKHVpbnQzMl90KXNlLT52ZXJzaW9uX2lkKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzYXZldm06IHVuc3VwcG9ydGVkIHZlcnNpb24gJWQgZm9yICclcycgdiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9pZCwgaWRzdHIsIHNlLT52ZXJzaW9uX2lkKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBBZGQgZW50cnkgKi8KKyAgICAgICAgICAgIGxlID0gZ19tYWxsb2MwKHNpemVvZigqbGUpKTsKKworICAgICAgICAgICAgbGUtPnNlID0gc2U7CisgICAgICAgICAgICBsZS0+c2VjdGlvbl9pZCA9IHNlY3Rpb25faWQ7CisgICAgICAgICAgICBsZS0+dmVyc2lvbl9pZCA9IHZlcnNpb25faWQ7CisgICAgICAgICAgICBRTElTVF9JTlNFUlRfSEVBRCgmbG9hZHZtX2hhbmRsZXJzLCBsZSwgZW50cnkpOworCisgICAgICAgICAgICByZXQgPSB2bXN0YXRlX2xvYWQoZiwgbGUtPnNlLCBsZS0+dmVyc2lvbl9pZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogd2FybmluZzogZXJyb3Igd2hpbGUgbG9hZGluZyBzdGF0ZSBmb3IgaW5zdGFuY2UgMHgleCBvZiBkZXZpY2UgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlX2lkLCBpZHN0cik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBRRU1VX1ZNX1NFQ1RJT05fUEFSVDoKKyAgICAgICAgY2FzZSBRRU1VX1ZNX1NFQ1RJT05fRU5EOgorICAgICAgICAgICAgc2VjdGlvbl9pZCA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICAgICAgICAgIFFMSVNUX0ZPUkVBQ0gobGUsICZsb2Fkdm1faGFuZGxlcnMsIGVudHJ5KSB7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50MzJfdClsZS0+c2VjdGlvbl9pZCA9PSBzZWN0aW9uX2lkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHNhdmV2bSBzZWN0aW9uICVkXG4iLCBzZWN0aW9uX2lkKTsKKyAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSB2bXN0YXRlX2xvYWQoZiwgbGUtPnNlLCBsZS0+dmVyc2lvbl9pZCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogd2FybmluZzogZXJyb3Igd2hpbGUgbG9hZGluZyBzdGF0ZSBzZWN0aW9uIGlkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbl9pZCk7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBzYXZldm0gc2VjdGlvbiB0eXBlICVkXG4iLCBzZWN0aW9uX3R5cGUpOworICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLy9jcHVfc3luY2hyb25pemVfYWxsX3Bvc3RfaW5pdCgpOworCisgICAgcmV0ID0gMDsKKworb3V0OgorICAgIFFMSVNUX0ZPUkVBQ0hfU0FGRShsZSwgJmxvYWR2bV9oYW5kbGVycywgZW50cnksIG5ld19sZSkgeworICAgICAgICBRTElTVF9SRU1PVkUobGUsIGVudHJ5KTsKKyAgICAgICAgZ19mcmVlKGxlKTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgcmV0ID0gcWVtdV9maWxlX2dldF9lcnJvcihmKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorI2lmIDAKK3N0YXRpYyBCbG9ja0RyaXZlclN0YXRlICpnZXRfYnNfc25hcHNob3RzKHZvaWQpCit7CisgICAgQmxvY2tEcml2ZXJTdGF0ZSAqYnM7CisgICAgaW50IGk7CisKKyAgICBpZiAoYnNfc25hcHNob3RzKQorICAgICAgICByZXR1cm4gYnNfc25hcHNob3RzOworICAgIGZvcihpID0gMDsgaSA8PSBuYl9kcml2ZXM7IGkrKykgeworICAgICAgICBicyA9IGRyaXZlc190YWJsZVtpXS5iZHJ2OworICAgICAgICBpZiAoYmRydl9jYW5fc25hcHNob3QoYnMpKQorICAgICAgICAgICAgZ290byBvazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cisgb2s6CisgICAgYnNfc25hcHNob3RzID0gYnM7CisgICAgcmV0dXJuIGJzOworfQorI2VuZGlmCitzdGF0aWMgaW50IGJkcnZfc25hcHNob3RfZmluZChCbG9ja0RyaXZlclN0YXRlICpicywgUUVNVVNuYXBzaG90SW5mbyAqc25faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUUVNVVNuYXBzaG90SW5mbyAqc25fdGFiLCAqc247CisgICAgaW50IG5iX3NucywgaSwgcmV0OworCisgICAgcmV0ID0gLUVOT0VOVDsKKyAgICBuYl9zbnMgPSBiZHJ2X3NuYXBzaG90X2xpc3QoYnMsICZzbl90YWIpOworICAgIGlmIChuYl9zbnMgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGZvcihpID0gMDsgaSA8IG5iX3NuczsgaSsrKSB7CisgICAgICAgIHNuID0gJnNuX3RhYltpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoc24tPmlkX3N0ciwgbmFtZSkgfHwgIXN0cmNtcChzbi0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgICpzbl9pbmZvID0gKnNuOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGdfZnJlZShzbl90YWIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZG9fc2F2ZXZtKE1vbml0b3IgKmVyciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpicywgKmJzMTsKKyAgICBRRU1VU25hcHNob3RJbmZvIHNuMSwgKnNuID0gJnNuMSwgb2xkX3NuMSwgKm9sZF9zbiA9ICZvbGRfc24xOworICAgIGludCBtdXN0X2RlbGV0ZSwgcmV0OworICAgIEJsb2NrRHJpdmVySW5mbyBiZGkxLCAqYmRpID0gJmJkaTE7CisgICAgUUVNVUZpbGUgKmY7CisgICAgaW50IHNhdmVkX3ZtX3J1bm5pbmc7CisgICAgdWludDMyX3Qgdm1fc3RhdGVfc2l6ZTsKKyNpZmRlZiBfV0lOMzIKKyAgICBzdHJ1Y3QgX3RpbWViIHRiOworI2Vsc2UKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyNlbmRpZgorCisgICAgYnMgPSBiZHJ2X3NuYXBzaG90cygpOworICAgIGlmICghYnMpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiTm8gYmxvY2sgZGV2aWNlIGNhbiBhY2NlcHQgc25hcHNob3RzXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qID8/PyBTaG91bGQgdGhpcyBvY2N1ciBhZnRlciB2bV9zdG9wPyAgKi8KKyAgICBxZW11X2Fpb19mbHVzaCgpOworCisgICAgc2F2ZWRfdm1fcnVubmluZyA9IHZtX3J1bm5pbmc7CisgICAgdm1fc3RvcCgwKTsKKworICAgIG11c3RfZGVsZXRlID0gMDsKKyAgICBpZiAobmFtZSkgeworICAgICAgICByZXQgPSBiZHJ2X3NuYXBzaG90X2ZpbmQoYnMsIG9sZF9zbiwgbmFtZSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgbXVzdF9kZWxldGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIG1lbXNldChzbiwgMCwgc2l6ZW9mKCpzbikpOworICAgIGlmIChtdXN0X2RlbGV0ZSkgeworICAgICAgICBwc3RyY3B5KHNuLT5uYW1lLCBzaXplb2Yoc24tPm5hbWUpLCBvbGRfc24tPm5hbWUpOworICAgICAgICBwc3RyY3B5KHNuLT5pZF9zdHIsIHNpemVvZihzbi0+aWRfc3RyKSwgb2xkX3NuLT5pZF9zdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChuYW1lKQorICAgICAgICAgICAgcHN0cmNweShzbi0+bmFtZSwgc2l6ZW9mKHNuLT5uYW1lKSwgbmFtZSk7CisgICAgfQorCisgICAgLyogZmlsbCBhdXhpbGlhcnkgZmllbGRzICovCisjaWZkZWYgX1dJTjMyCisgICAgX2Z0aW1lKCZ0Yik7CisgICAgc24tPmRhdGVfc2VjID0gdGIudGltZTsKKyAgICBzbi0+ZGF0ZV9uc2VjID0gdGIubWlsbGl0bSAqIDEwMDAwMDA7CisjZWxzZQorICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHNuLT5kYXRlX3NlYyA9IHR2LnR2X3NlYzsKKyAgICBzbi0+ZGF0ZV9uc2VjID0gdHYudHZfdXNlYyAqIDEwMDA7CisjZW5kaWYKKyAgICBzbi0+dm1fY2xvY2tfbnNlYyA9IHFlbXVfY2xvY2tfZ2V0X25zKFFFTVVfQ0xPQ0tfVklSVFVBTCk7CisKKyAgICBpZiAoYmRydl9nZXRfaW5mbyhicywgYmRpKSA8IDAgfHwgYmRpLT52bV9zdGF0ZV9vZmZzZXQgPD0gMCkgeworICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsICJEZXZpY2UgJXMgZG9lcyBub3Qgc3VwcG9ydCBWTSBzdGF0ZSBzbmFwc2hvdHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHJ2X2dldF9kZXZpY2VfbmFtZShicykpOworICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgfQorCisgICAgLyogc2F2ZSB0aGUgVk0gc3RhdGUgKi8KKyAgICBmID0gcWVtdV9mb3Blbl9iZHJ2KGJzLCAxKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiQ291bGQgbm90IG9wZW4gVk0gc3RhdGUgZmlsZVxuIik7CisgICAgICAgIGdvdG8gdGhlX2VuZDsKKyAgICB9CisgICAgcmV0ID0gcWVtdV9zYXZldm1fc3RhdGUoZik7CisgICAgdm1fc3RhdGVfc2l6ZSA9IHFlbXVfZnRlbGwoZik7CisgICAgcWVtdV9mY2xvc2UoZik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiRXJyb3IgJWQgd2hpbGUgd3JpdGluZyBWTVxuIiwgcmV0KTsKKyAgICAgICAgZ290byB0aGVfZW5kOworICAgIH0KKworICAgIC8qIGNyZWF0ZSB0aGUgc25hcHNob3RzICovCisKKyAgICBiczEgPSBOVUxMOworICAgIHdoaWxlICgoYnMxID0gYmRydl9uZXh0KGJzMSkpKSB7CisgICAgICAgIGlmIChiZHJ2X2Nhbl9zbmFwc2hvdChiczEpKSB7CisgICAgICAgICAgICBpZiAobXVzdF9kZWxldGUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBiZHJ2X3NuYXBzaG90X2RlbGV0ZShiczEsIG9sZF9zbi0+aWRfc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgc25hcHNob3Qgb24gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJkcnZfZ2V0X2RldmljZV9uYW1lKGJzMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdyaXRlIFZNIHN0YXRlIHNpemUgb25seSB0byB0aGUgaW1hZ2UgdGhhdCBjb250YWlucyB0aGUgc3RhdGUgKi8KKyAgICAgICAgICAgIHNuLT52bV9zdGF0ZV9zaXplID0gKGJzID09IGJzMSA/IHZtX3N0YXRlX3NpemUgOiAwKTsKKyAgICAgICAgICAgIHJldCA9IGJkcnZfc25hcHNob3RfY3JlYXRlKGJzMSwgc24pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsICJFcnJvciB3aGlsZSBjcmVhdGluZyBzbmFwc2hvdCBvbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHJ2X2dldF9kZXZpY2VfbmFtZShiczEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworIHRoZV9lbmQ6CisgICAgaWYgKHNhdmVkX3ZtX3J1bm5pbmcpCisgICAgICAgIHZtX3N0YXJ0KCk7Cit9CisKK3ZvaWQgZG9fbG9hZHZtKE1vbml0b3IgKmVyciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpicywgKmJzMTsKKyAgICBCbG9ja0RyaXZlckluZm8gYmRpMSwgKmJkaSA9ICZiZGkxOworICAgIFFFTVVTbmFwc2hvdEluZm8gc247CisgICAgUUVNVUZpbGUgKmY7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2F2ZWRfdm1fcnVubmluZzsKKworICAgIGJzID0gYmRydl9zbmFwc2hvdHMoKTsKKyAgICBpZiAoIWJzKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKGVyciwgIk5vIGJsb2NrIGRldmljZSBzdXBwb3J0cyBzbmFwc2hvdHNcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogRmx1c2ggYWxsIElPIHJlcXVlc3RzIHNvIHRoZXkgZG9uJ3QgaW50ZXJmZXJlIHdpdGggdGhlIG5ldyBzdGF0ZS4gICovCisgICAgcWVtdV9haW9fZmx1c2goKTsKKworICAgIHNhdmVkX3ZtX3J1bm5pbmcgPSB2bV9ydW5uaW5nOworICAgIHZtX3N0b3AoMCk7CisKKyAgICBiczEgPSBiczsKKyAgICBkbyB7CisgICAgICAgIGlmIChiZHJ2X2Nhbl9zbmFwc2hvdChiczEpKSB7CisgICAgICAgICAgICByZXQgPSBiZHJ2X3NuYXBzaG90X2dvdG8oYnMxLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJzICE9IGJzMSkKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiV2FybmluZzogIik7CisgICAgICAgICAgICAgICAgc3dpdGNoKHJldCkgeworICAgICAgICAgICAgICAgIGNhc2UgLUVOT1RTVVA6CisgICAgICAgICAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNuYXBzaG90cyBub3Qgc3VwcG9ydGVkIG9uIGRldmljZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHJ2X2dldF9kZXZpY2VfbmFtZShiczEpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtRU5PRU5UOgorICAgICAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsICJDb3VsZCBub3QgZmluZCBzbmFwc2hvdCAnJXMnIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRldmljZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBiZHJ2X2dldF9kZXZpY2VfbmFtZShiczEpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiRXJyb3IgJWQgd2hpbGUgYWN0aXZhdGluZyBzbmFwc2hvdCBvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnJXMnXG4iLCByZXQsIGJkcnZfZ2V0X2RldmljZV9uYW1lKGJzMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmF0YWwgb24gc25hcHNob3QgYmxvY2sgZGV2aWNlICovCisgICAgICAgICAgICAgICAgaWYgKGJzID09IGJzMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoKGJzMSA9IGJkcnZfbmV4dChicykpKTsKKworICAgIGlmIChiZHJ2X2dldF9pbmZvKGJzLCBiZGkpIDwgMCB8fCBiZGktPnZtX3N0YXRlX29mZnNldCA8PSAwKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKGVyciwgIkRldmljZSAlcyBkb2VzIG5vdCBzdXBwb3J0IFZNIHN0YXRlIHNuYXBzaG90c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYmRydl9nZXRfZGV2aWNlX25hbWUoYnMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIERvbid0IGV2ZW4gdHJ5IHRvIGxvYWQgZW1wdHkgVk0gc3RhdGVzICovCisgICAgcmV0ID0gYmRydl9zbmFwc2hvdF9maW5kKGJzLCAmc24sIG5hbWUpOworICAgIGlmICgocmV0ID49IDApICYmIChzbi52bV9zdGF0ZV9zaXplID09IDApKQorICAgICAgICBnb3RvIHRoZV9lbmQ7CisKKyAgICAvKiByZXN0b3JlIHRoZSBWTSBzdGF0ZSAqLworICAgIGYgPSBxZW11X2ZvcGVuX2JkcnYoYnMsIDApOworICAgIGlmICghZikgeworICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsICJDb3VsZCBub3Qgb3BlbiBWTSBzdGF0ZSBmaWxlXG4iKTsKKyAgICAgICAgZ290byB0aGVfZW5kOworICAgIH0KKyAgICByZXQgPSBxZW11X2xvYWR2bV9zdGF0ZShmKTsKKyAgICBxZW11X2ZjbG9zZShmKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsICJFcnJvciAlZCB3aGlsZSBsb2FkaW5nIFZNIHN0YXRlXG4iLCByZXQpOworICAgIH0KKyB0aGVfZW5kOgorICAgIGlmIChzYXZlZF92bV9ydW5uaW5nKQorICAgICAgICB2bV9zdGFydCgpOworfQorCit2b2lkIGRvX2RlbHZtKE1vbml0b3IgKmVyciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBCbG9ja0RyaXZlclN0YXRlICpicywgKmJzMTsKKyAgICBpbnQgcmV0OworCisgICAgYnMgPSBiZHJ2X3NuYXBzaG90cygpOworICAgIGlmICghYnMpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiTm8gYmxvY2sgZGV2aWNlIHN1cHBvcnRzIHNuYXBzaG90c1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBiczEgPSBOVUxMOworICAgIHdoaWxlICgoYnMxID0gYmRydl9uZXh0KGJzMSkpKSB7CisgICAgICAgIGlmIChiZHJ2X2Nhbl9zbmFwc2hvdChiczEpKSB7CisgICAgICAgICAgICByZXQgPSBiZHJ2X3NuYXBzaG90X2RlbGV0ZShiczEsIG5hbWUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC1FTk9UU1VQKQorICAgICAgICAgICAgICAgICAgICBtb25pdG9yX3ByaW50ZihlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU25hcHNob3RzIG5vdCBzdXBwb3J0ZWQgb24gZGV2aWNlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZHJ2X2dldF9kZXZpY2VfbmFtZShiczEpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKGVyciwgIkVycm9yICVkIHdoaWxlIGRlbGV0aW5nIHNuYXBzaG90IG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnXG4iLCByZXQsIGJkcnZfZ2V0X2RldmljZV9uYW1lKGJzMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGRvX2luZm9fc25hcHNob3RzKE1vbml0b3IqIG91dCwgTW9uaXRvciogZXJyKQoreworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJzLCAqYnMxOworICAgIFFFTVVTbmFwc2hvdEluZm8gKnNuX3RhYiwgKnNuOworICAgIGludCBuYl9zbnMsIGk7CisgICAgY2hhciBidWZbMjU2XTsKKworICAgIGJzID0gYmRydl9zbmFwc2hvdHMoKTsKKyAgICBpZiAoIWJzKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKGVyciwgIk5vIGF2YWlsYWJsZSBibG9jayBkZXZpY2Ugc3VwcG9ydHMgc25hcHNob3RzXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtb25pdG9yX3ByaW50ZihvdXQsICJTbmFwc2hvdCBkZXZpY2VzOiIpOworICAgIGJzMSA9IE5VTEw7CisgICAgd2hpbGUgKChiczEgPSBiZHJ2X25leHQoYnMxKSkpIHsKKyAgICAgICAgaWYgKGJkcnZfY2FuX3NuYXBzaG90KGJzMSkpIHsKKyAgICAgICAgICAgIGlmIChicyA9PSBiczEpCisgICAgICAgICAgICAgICAgbW9uaXRvcl9wcmludGYob3V0LCAiICVzIiwgYmRydl9nZXRfZGV2aWNlX25hbWUoYnMxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbW9uaXRvcl9wcmludGYob3V0LCAiXG4iKTsKKworICAgIG5iX3NucyA9IGJkcnZfc25hcHNob3RfbGlzdChicywgJnNuX3RhYik7CisgICAgaWYgKG5iX3NucyA8IDApIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYoZXJyLCAiYmRydl9zbmFwc2hvdF9saXN0OiBlcnJvciAlZFxuIiwgbmJfc25zKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtb25pdG9yX3ByaW50ZihvdXQsICJTbmFwc2hvdCBsaXN0IChmcm9tICVzKTpcbiIsCisgICAgICAgICAgICAgICAgICAgYmRydl9nZXRfZGV2aWNlX25hbWUoYnMpKTsKKyAgICBtb25pdG9yX3ByaW50ZihvdXQsICIlc1xuIiwgYmRydl9zbmFwc2hvdF9kdW1wKGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwpKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuYl9zbnM7IGkrKykgeworICAgICAgICBzbiA9ICZzbl90YWJbaV07CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG91dCwgIiVzXG4iLCBiZHJ2X3NuYXBzaG90X2R1bXAoYnVmLCBzaXplb2YoYnVmKSwgc24pKTsKKyAgICB9CisgICAgZ19mcmVlKHNuX3RhYik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvYm9vdHRpbWUucHkgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvYm9vdHRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTQzNDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9ib290dGltZS5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL3B5dGhvbgorIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIG1lYXN1cmUgdGhlIGJvb3QgdGltZSBvZiBhbiBBbmRyb2lkIGRldmljZSBvciBBVkQKKyMgaW4gYSBwcmVjaXNpb24gb2YgMC4xIHNlY29uZC4gSXQgd29ya3Mgb24gT1MgWCwgTGludXgsIGFuZCBXaW5kb3dzLgorIworIyBVc2FnZTogUnVuIHRoaXMgc2NyaXB0IHdoZW4gYm9vdCBzdGFydHMuIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZgorIyBob3cgdG8gdXNlIHRoaXMgdXRpbGl0eS4KKyMKKyMgT24gT1MgWCwgTGludXg6CisjCisjICAgJCB+L2Jpbi9ib290dGltZS5weSAmIGVtdWxhdG9yIC1hdmQgTmV4dXNfNV9BUElfMjNfeDg2CisjCisjIE9uIFdpbmRvd3M6CisjCisjICAgc3RhcnQgY21kIC9rIHB5dGhvbiAuXGJvb3R0aW1lLnB5ICYgZW11bGF0b3IuZXhlIC1hdmQgTmV4dXNfNV9BUElfMjNfeDg2CisjCisjIFRoZSBzY3JpcHQgd2lsbCBraWxsIGl0c2VsZiBpZiBpdCBkb2VzIG5vdCBkZXRlY3QgYW55IGNvbXBsZXRlZCBib290IGFmdGVyCisjIDEwIG1pbnV0ZXMuIFRoZSBsZW5ndGggb2Ygd2FpdGluZyBpcyBjb25maWd1cmFibGUgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mCisjIFRJTUVPVVRfSU5fTUlOVVRFUy4gVGhpcyBjb3VsZCBiZSB1c2VmdWwgaW4gY2FzZXMgc3VjaCBhcyB0aGUgc3lzdGVtIG5ldmVyCisjIGJvb3RzIG9yIGdldHMga2lsbGVkIGJlZm9yZSBib290IGNvbXBsZXRlcy4KKyMKKyMgSWYgeW91IHJ1biB0aGUgc2NyaXB0IGluIHRoZSBiYWNrZ3JvdW5kIChhcyBpbiB0aGUgT1MgWC9MaW51eCBleGFtcGxlIGFib3ZlKSwKKyMgeW91IGNhbiBzdG9wIHRoZSBzY3JpcHQgaW1tZWRpYXRlbHkgYnkgcnVubmluZyAia2lsbCAkISIgLgorIworIyBUaGUgc2NyaXB0IGFzc3VtZXMgYWRiIGlzIG9uIHRoZSBwYXRoIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiB0aGUKKyMgb3V0cHV0IG9mICJhZGIiIGNvbW1hbmQKKyMKKyMgICAgIGFkYiBzaGVsbCBnZXRwcm9wIHN5cy5ib290X2NvbXBsZXRlZAorIworIyBUaGVyZSBhcmUgb25saW5lIGRpc2N1c3Npb24gYWJvdXQgdXNpbmcgInN5cy5ib290X2NvbXBsZXRlZCIgdmVyc3VzCisjICJpbml0LnN2Yy5ib290YW5pbSIgKGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzYzNDA0MS9kZXRlY3Qtd2hlbi1hbmRyb2lkLWVtdWxhdG9yLWlzLWZ1bGx5LWJvb3RlZCkKKyMgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc3VmZmljaWVudCBmb3IgYmVuY2htYXJraW5nIHB1cnBvc2UuCisKK2ltcG9ydCB0aW1lCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK1RJTUVPVVRfSU5fTUlOVVRFUyA9IDEwCisKK0RFVEVDVElPTl9DT01NQU5EX0xJTkUgPSAnYWRiIHNoZWxsIGdldHByb3Agc3lzLmJvb3RfY29tcGxldGVkJworCitTSUdOQUxTID0gWycxXHJcbicsICAjIE9uIE9TIFggYW5kIExpbnV4LgorICAgICAgICAgICAnMVxyXHJcbicgICMgT24gV2luZG93cy4KKyAgICAgICAgICBdCisKKworZGVmIFRpbWVCb290KCk6CisgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgdGltZW91dF9pbl9taW4gPSBUSU1FT1VUX0lOX01JTlVURVMKKyAgYXJncyA9IHNobGV4LnNwbGl0KERFVEVDVElPTl9DT01NQU5EX0xJTkUpCisgIHdoaWxlIFRydWU6CisgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICBpZiAobm93IC0gc3RhcnQgPiB0aW1lb3V0X2luX21pbiAqIDYwKToKKyAgICAgIHByaW50ICdObyBjb21wbGV0ZWQgYm9vdCBkZXRlY3RlZCBmb3InLCB0aW1lb3V0X2luX21pbiwgKAorICAgICAgICAgICdtaW51dGVzLiBib290dGltZS5weSBoYXMgcXVpdHRlZCBhdXRvbWF0aWNhbGx5LicpCisgICAgICBxdWl0KCkKKworICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIGZvciBsaW5lIGluIHByb2Muc3Rkb3V0OgorICAgICAgaWYgbGluZSBpbiBTSUdOQUxTOgorICAgICAgICBwcmludCAnQm9vdCBjb21wbGV0ZWQuIEJvb3QgdGltZTonLCAnJS4xZicgJSAobm93IC0gc3RhcnQpLCAnc2Vjb25kcy4nCisgICAgICAgIHF1aXQoKQorICAgIHRpbWUuc2xlZXAoMC4xKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIFRpbWVCb290KCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9vcmRlcmVkZGljdC5weSBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9vcmRlcmVkZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjQyYjUwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zY3JpcHRzL29yZGVyZWRkaWN0LnB5CkBAIC0wLDAgKzEsMTI3IEBACisjIENvcHlyaWdodCAoYykgMjAwOSBSYXltb25kIEhldHRpbmdlcgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworIyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorIyBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorIyBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorIyBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisjICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisjICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyMgICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorIyAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisjICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisKK2Zyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbgorCitjbGFzcyBPcmRlcmVkRGljdChkaWN0LCBEaWN0TWl4aW4pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fZW5kCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuY2xlYXIoKQorICAgICAgICBzZWxmLnVwZGF0ZSgqYXJncywgKiprd2RzKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLl9fZW5kID0gZW5kID0gW10KKyAgICAgICAgZW5kICs9IFtOb25lLCBlbmQsIGVuZF0gICAgICAgICAjIHNlbnRpbmVsIG5vZGUgZm9yIGRvdWJseSBsaW5rZWQgbGlzdAorICAgICAgICBzZWxmLl9fbWFwID0ge30gICAgICAgICAgICAgICAgICMga2V5IC0tPiBba2V5LCBwcmV2LCBuZXh0XQorICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuX19lbmQKKyAgICAgICAgICAgIGN1cnIgPSBlbmRbMV0KKyAgICAgICAgICAgIGN1cnJbMl0gPSBlbmRbMV0gPSBzZWxmLl9fbWFwW2tleV0gPSBba2V5LCBjdXJyLCBlbmRdCisgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBkaWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAga2V5LCBwcmV2LCBuZXh0ID0gc2VsZi5fX21hcC5wb3Aoa2V5KQorICAgICAgICBwcmV2WzJdID0gbmV4dAorICAgICAgICBuZXh0WzFdID0gcHJldgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCisgICAgICAgIGN1cnIgPSBlbmRbMl0KKyAgICAgICAgd2hpbGUgY3VyciBpcyBub3QgZW5kOgorICAgICAgICAgICAgeWllbGQgY3VyclswXQorICAgICAgICAgICAgY3VyciA9IGN1cnJbMl0KKworICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CisgICAgICAgIGVuZCA9IHNlbGYuX19lbmQKKyAgICAgICAgY3VyciA9IGVuZFsxXQorICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCBlbmQ6CisgICAgICAgICAgICB5aWVsZCBjdXJyWzBdCisgICAgICAgICAgICBjdXJyID0gY3VyclsxXQorCisgICAgZGVmIHBvcGl0ZW0oc2VsZiwgbGFzdD1UcnVlKToKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCisgICAgICAgIGlmIGxhc3Q6CisgICAgICAgICAgICBrZXkgPSByZXZlcnNlZChzZWxmKS5uZXh0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleSA9IGl0ZXIoc2VsZikubmV4dCgpCisgICAgICAgIHZhbHVlID0gc2VsZi5wb3Aoa2V5KQorICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQorICAgICAgICB0bXAgPSBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kCisgICAgICAgIGRlbCBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kCisgICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCisgICAgICAgIHNlbGYuX19tYXAsIHNlbGYuX19lbmQgPSB0bXAKKyAgICAgICAgaWYgaW5zdF9kaWN0OgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCisKKyAgICBzZXRkZWZhdWx0ID0gRGljdE1peGluLnNldGRlZmF1bHQKKyAgICB1cGRhdGUgPSBEaWN0TWl4aW4udXBkYXRlCisgICAgcG9wID0gRGljdE1peGluLnBvcAorICAgIHZhbHVlcyA9IERpY3RNaXhpbi52YWx1ZXMKKyAgICBpdGVtcyA9IERpY3RNaXhpbi5pdGVtcworICAgIGl0ZXJrZXlzID0gRGljdE1peGluLml0ZXJrZXlzCisgICAgaXRlcnZhbHVlcyA9IERpY3RNaXhpbi5pdGVydmFsdWVzCisgICAgaXRlcml0ZW1zID0gRGljdE1peGluLml0ZXJpdGVtcworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQorICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgZCA9IGNscygpCisgICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CisgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmKSAhPSBsZW4ob3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZm9yIHAsIHEgaW4gIHppcChzZWxmLml0ZW1zKCksIG90aGVyLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIGlmIHAgIT0gcToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvb3JkZXJlZGRpY3QucHljIGIvYW5kcm9pZC9xZW11MS9zY3JpcHRzL29yZGVyZWRkaWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zY3JpcHRzL29yZGVyZWRkaWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS1jb21tYW5kcy5weSBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9xYXBpLWNvbW1hbmRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMmI2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS1jb21tYW5kcy5weQpAQCAtMCwwICsxLDQ4MyBAQAorIworIyBRQVBJIGNvbW1hbmQgbWFyc2hhbGxlciBnZW5lcmF0b3IKKyMKKyMgQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorIworIyBBdXRob3JzOgorIyAgQW50aG9ueSBMaWd1b3JpIDxhbGlndW9yaUB1cy5pYm0uY29tPgorIyAgTWljaGFlbCBSb3RoICAgIDxtZHJvdGhAbGludXgudm5ldC5pYm0uY29tPgorIworIyBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMdjIuCisjIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKworZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKK2Zyb20gcWFwaSBpbXBvcnQgKgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgZXJybm8KKworZGVmIHR5cGVfdmlzaXRvcihuYW1lKToKKyAgICBpZiB0eXBlKG5hbWUpID09IGxpc3Q6CisgICAgICAgIHJldHVybiAndmlzaXRfdHlwZV8lc0xpc3QnICUgbmFtZVswXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAndmlzaXRfdHlwZV8lcycgJSBuYW1lCisKK2RlZiBnZW5lcmF0ZV9kZWNsX2VudW0obmFtZSwgbWVtYmVycywgZ2VubGlzdD1UcnVlKToKKyAgICByZXR1cm4gbWNnZW4oJycnCisKK3ZvaWQgJSh2aXNpdG9yKXMoVmlzaXRvciAqbSwgJShuYW1lKXMgKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisnJycsCisgICAgICAgICAgICAgICAgIHZpc2l0b3I9dHlwZV92aXNpdG9yKG5hbWUpKQorCitkZWYgZ2VuZXJhdGVfY29tbWFuZF9kZWNsKG5hbWUsIGFyZ3MsIHJldF90eXBlKToKKyAgICBhcmdsaXN0PSIiCisgICAgZm9yIGFyZ25hbWUsIGFyZ3R5cGUsIG9wdGlvbmFsLCBzdHJ1Y3R1cmVkIGluIHBhcnNlX2FyZ3MoYXJncyk6CisgICAgICAgIGFyZ3R5cGUgPSBjX3R5cGUoYXJndHlwZSkKKyAgICAgICAgaWYgYXJndHlwZSA9PSAiY2hhciAqIjoKKyAgICAgICAgICAgIGFyZ3R5cGUgPSAiY29uc3QgY2hhciAqIgorICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIGFyZ2xpc3QgKz0gImJvb2wgaGFzXyVzLCAiICUgY192YXIoYXJnbmFtZSkKKyAgICAgICAgYXJnbGlzdCArPSAiJXMgJXMsICIgJSAoYXJndHlwZSwgY192YXIoYXJnbmFtZSkpCisgICAgcmV0dXJuIG1jZ2VuKCcnJworJShyZXRfdHlwZSlzIHFtcF8lKG5hbWUpcyglKGFyZ3Mpc0Vycm9yICoqZXJycCk7CisnJycsCisgICAgICAgICAgICAgICAgIHJldF90eXBlPWNfdHlwZShyZXRfdHlwZSksIG5hbWU9Y19mdW4obmFtZSksIGFyZ3M9YXJnbGlzdCkuc3RyaXAoKQorCitkZWYgZ2VuX3N5bmNfY2FsbChuYW1lLCBhcmdzLCByZXRfdHlwZSwgaW5kZW50PTApOgorICAgIHJldCA9ICIiCisgICAgYXJnbGlzdD0iIgorICAgIHJldHZhbD0iIgorICAgIGlmIHJldF90eXBlOgorICAgICAgICByZXR2YWwgPSAicmV0dmFsID0gIgorICAgIGZvciBhcmduYW1lLCBhcmd0eXBlLCBvcHRpb25hbCwgc3RydWN0dXJlZCBpbiBwYXJzZV9hcmdzKGFyZ3MpOgorICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIGFyZ2xpc3QgKz0gImhhc18lcywgIiAlIGNfdmFyKGFyZ25hbWUpCisgICAgICAgIGFyZ2xpc3QgKz0gIiVzLCAiICUgKGNfdmFyKGFyZ25hbWUpKQorICAgIHB1c2hfaW5kZW50KGluZGVudCkKKyAgICByZXQgPSBtY2dlbignJycKKyUocmV0dmFsKXNxbXBfJShuYW1lKXMoJShhcmdzKXNlcnJwKTsKKworJycnLAorICAgICAgICAgICAgICAgIG5hbWU9Y19mdW4obmFtZSksIGFyZ3M9YXJnbGlzdCwgcmV0dmFsPXJldHZhbCkucnN0cmlwKCkKKyAgICBpZiByZXRfdHlwZToKKyAgICAgICAgcmV0ICs9ICJcbiIgKyBtY2dlbignJycnCitpZiAoIWVycm9yX2lzX3NldChlcnJwKSkgeworICAgICUobWFyc2hhbF9vdXRwdXRfY2FsbClzCit9CisnJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyc2hhbF9vdXRwdXRfY2FsbD1nZW5fbWFyc2hhbF9vdXRwdXRfY2FsbChuYW1lLCByZXRfdHlwZSkpLnJzdHJpcCgpCisgICAgcG9wX2luZGVudChpbmRlbnQpCisgICAgcmV0dXJuIHJldC5yc3RyaXAoKQorCisKK2RlZiBnZW5fbWFyc2hhbF9vdXRwdXRfY2FsbChuYW1lLCByZXRfdHlwZSk6CisgICAgaWYgbm90IHJldF90eXBlOgorICAgICAgICByZXR1cm4gIiIKKyAgICByZXR1cm4gInFtcF9tYXJzaGFsX291dHB1dF8lcyhyZXR2YWwsIHJldCwgZXJycCk7IiAlIGNfZnVuKG5hbWUpCisKK2RlZiBnZW5fdmlzaXRvcl9vdXRwdXRfY29udGFpbmVyc19kZWNsKHJldF90eXBlKToKKyAgICByZXQgPSAiIgorICAgIHB1c2hfaW5kZW50KCkKKyAgICBpZiByZXRfdHlwZToKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworUW1wT3V0cHV0VmlzaXRvciAqbW87CitRYXBpRGVhbGxvY1Zpc2l0b3IgKm1kOworVmlzaXRvciAqdjsKKycnJykKKyAgICBwb3BfaW5kZW50KCkKKworICAgIHJldHVybiByZXQKKworZGVmIGdlbl92aXNpdG9yX2lucHV0X2NvbnRhaW5lcnNfZGVjbChhcmdzKToKKyAgICByZXQgPSAiIgorCisgICAgcHVzaF9pbmRlbnQoKQorICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgIHJldCArPSBtY2dlbignJycKK1FtcElucHV0VmlzaXRvciAqbWk7CitRYXBpRGVhbGxvY1Zpc2l0b3IgKm1kOworVmlzaXRvciAqdjsKKycnJykKKyAgICBwb3BfaW5kZW50KCkKKworICAgIHJldHVybiByZXQucnN0cmlwKCkKKworZGVmIGdlbl92aXNpdG9yX2lucHV0X3ZhcnNfZGVjbChhcmdzKToKKyAgICByZXQgPSAiIgorICAgIHB1c2hfaW5kZW50KCkKKyAgICBmb3IgYXJnbmFtZSwgYXJndHlwZSwgb3B0aW9uYWwsIHN0cnVjdHVyZWQgaW4gcGFyc2VfYXJncyhhcmdzKToKKyAgICAgICAgaWYgb3B0aW9uYWw6CisgICAgICAgICAgICByZXQgKz0gbWNnZW4oJycnCitib29sIGhhc18lKGFyZ25hbWUpcyA9IGZhbHNlOworJycnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ25hbWU9Y192YXIoYXJnbmFtZSkpCisgICAgICAgIGlmIGNfdHlwZShhcmd0eXBlKS5lbmRzd2l0aCgiKiIpOgorICAgICAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworJShhcmd0eXBlKXMgJShhcmduYW1lKXMgPSBOVUxMOworJycnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ25hbWU9Y192YXIoYXJnbmFtZSksIGFyZ3R5cGU9Y190eXBlKGFyZ3R5cGUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworJShhcmd0eXBlKXMgJShhcmduYW1lKXM7CisnJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbmFtZT1jX3ZhcihhcmduYW1lKSwgYXJndHlwZT1jX3R5cGUoYXJndHlwZSkpCisKKyAgICBwb3BfaW5kZW50KCkKKyAgICByZXR1cm4gcmV0LnJzdHJpcCgpCisKK2RlZiBnZW5fdmlzaXRvcl9pbnB1dF9ibG9jayhhcmdzLCBvYmosIGRlYWxsb2M9RmFsc2UpOgorICAgIHJldCA9ICIiCisgICAgZXJycGFyZyA9ICdlcnJwJworCisgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgIHJldHVybiByZXQKKworICAgIHB1c2hfaW5kZW50KCkKKworICAgIGlmIGRlYWxsb2M6CisgICAgICAgIGVycnBhcmcgPSAnTlVMTCcKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworbWQgPSBxYXBpX2RlYWxsb2NfdmlzaXRvcl9uZXcoKTsKK3YgPSBxYXBpX2RlYWxsb2NfZ2V0X3Zpc2l0b3IobWQpOworJycnKQorICAgIGVsc2U6CisgICAgICAgIHJldCArPSBtY2dlbignJycKK21pID0gcW1wX2lucHV0X3Zpc2l0b3JfbmV3X3N0cmljdCglKG9iailzKTsKK3YgPSBxbXBfaW5wdXRfZ2V0X3Zpc2l0b3IobWkpOworJycnLAorICAgICAgICAgICAgICAgICAgICAgb2JqPW9iaikKKworICAgIGZvciBhcmduYW1lLCBhcmd0eXBlLCBvcHRpb25hbCwgc3RydWN0dXJlZCBpbiBwYXJzZV9hcmdzKGFyZ3MpOgorICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIHJldCArPSBtY2dlbignJycKK3Zpc2l0X3N0YXJ0X29wdGlvbmFsKHYsICZoYXNfJShjX25hbWUpcywgIiUobmFtZSlzIiwgJShlcnJwKXMpOworaWYgKGhhc18lKGNfbmFtZSlzKSB7CisnJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgY19uYW1lPWNfdmFyKGFyZ25hbWUpLCBuYW1lPWFyZ25hbWUsIGVycnA9ZXJycGFyZykKKyAgICAgICAgICAgIHB1c2hfaW5kZW50KCkKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworJSh2aXNpdG9yKXModiwgJiUoY19uYW1lKXMsICIlKG5hbWUpcyIsICUoZXJycClzKTsKKycnJywKKyAgICAgICAgICAgICAgICAgICAgIGNfbmFtZT1jX3ZhcihhcmduYW1lKSwgbmFtZT1hcmduYW1lLCBhcmd0eXBlPWFyZ3R5cGUsCisgICAgICAgICAgICAgICAgICAgICB2aXNpdG9yPXR5cGVfdmlzaXRvcihhcmd0eXBlKSwgZXJycD1lcnJwYXJnKQorICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIHBvcF9pbmRlbnQoKQorICAgICAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworfQordmlzaXRfZW5kX29wdGlvbmFsKHYsICUoZXJycClzKTsKKycnJywgZXJycD1lcnJwYXJnKQorCisgICAgaWYgZGVhbGxvYzoKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworcWFwaV9kZWFsbG9jX3Zpc2l0b3JfY2xlYW51cChtZCk7CisnJycpCisgICAgZWxzZToKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworcW1wX2lucHV0X3Zpc2l0b3JfY2xlYW51cChtaSk7CisnJycpCisgICAgcG9wX2luZGVudCgpCisgICAgcmV0dXJuIHJldC5yc3RyaXAoKQorCitkZWYgZ2VuX21hcnNoYWxfb3V0cHV0KG5hbWUsIGFyZ3MsIHJldF90eXBlLCBtaWRkbGVfbW9kZSk6CisgICAgaWYgbm90IHJldF90eXBlOgorICAgICAgICByZXR1cm4gIiIKKworICAgIHJldCA9IG1jZ2VuKCcnJworc3RhdGljIHZvaWQgcW1wX21hcnNoYWxfb3V0cHV0XyUoY19uYW1lKXMoJShjX3JldF90eXBlKXMgcmV0X2luLCBRT2JqZWN0ICoqcmV0X291dCwgRXJyb3IgKiplcnJwKQoreworICAgIFFhcGlEZWFsbG9jVmlzaXRvciAqbWQgPSBxYXBpX2RlYWxsb2NfdmlzaXRvcl9uZXcoKTsKKyAgICBRbXBPdXRwdXRWaXNpdG9yICptbyA9IHFtcF9vdXRwdXRfdmlzaXRvcl9uZXcoKTsKKyAgICBWaXNpdG9yICp2OworCisgICAgdiA9IHFtcF9vdXRwdXRfZ2V0X3Zpc2l0b3IobW8pOworICAgICUodmlzaXRvcilzKHYsICZyZXRfaW4sICJ1bnVzZWQiLCBlcnJwKTsKKyAgICBpZiAoIWVycm9yX2lzX3NldChlcnJwKSkgeworICAgICAgICAqcmV0X291dCA9IHFtcF9vdXRwdXRfZ2V0X3FvYmplY3QobW8pOworICAgIH0KKyAgICBxbXBfb3V0cHV0X3Zpc2l0b3JfY2xlYW51cChtbyk7CisgICAgdiA9IHFhcGlfZGVhbGxvY19nZXRfdmlzaXRvcihtZCk7CisgICAgJSh2aXNpdG9yKXModiwgJnJldF9pbiwgInVudXNlZCIsIE5VTEwpOworICAgIHFhcGlfZGVhbGxvY192aXNpdG9yX2NsZWFudXAobWQpOworfQorJycnLAorICAgICAgICAgICAgICAgIGNfcmV0X3R5cGU9Y190eXBlKHJldF90eXBlKSwgY19uYW1lPWNfZnVuKG5hbWUpLAorICAgICAgICAgICAgICAgIHZpc2l0b3I9dHlwZV92aXNpdG9yKHJldF90eXBlKSkKKworICAgIHJldHVybiByZXQKKworZGVmIGdlbl9tYXJzaGFsX2lucHV0X2RlY2wobmFtZSwgYXJncywgcmV0X3R5cGUsIG1pZGRsZV9tb2RlKToKKyAgICBpZiBtaWRkbGVfbW9kZToKKyAgICAgICAgcmV0dXJuICdpbnQgcW1wX21hcnNoYWxfaW5wdXRfJXMoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QsIFFPYmplY3QgKipyZXQpJyAlIGNfZnVuKG5hbWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICdzdGF0aWMgdm9pZCBxbXBfbWFyc2hhbF9pbnB1dF8lcyhRRGljdCAqYXJncywgUU9iamVjdCAqKnJldCwgRXJyb3IgKiplcnJwKScgJSBjX2Z1bihuYW1lKQorCisKKworZGVmIGdlbl9tYXJzaGFsX2lucHV0KG5hbWUsIGFyZ3MsIHJldF90eXBlLCBtaWRkbGVfbW9kZSk6CisgICAgaGRyID0gZ2VuX21hcnNoYWxfaW5wdXRfZGVjbChuYW1lLCBhcmdzLCByZXRfdHlwZSwgbWlkZGxlX21vZGUpCisKKyAgICByZXQgPSBtY2dlbignJycKKyUoaGVhZGVyKXMKK3sKKycnJywKKyAgICAgICAgICAgICAgICBoZWFkZXI9aGRyKQorCisgICAgaWYgbWlkZGxlX21vZGU6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICBFcnJvciAqbG9jYWxfZXJyID0gTlVMTDsKKyAgICBFcnJvciAqKmVycnAgPSAmbG9jYWxfZXJyOworICAgIFFEaWN0ICphcmdzID0gKFFEaWN0ICopcWRpY3Q7CisnJycpCisKKyAgICBpZiByZXRfdHlwZToKKyAgICAgICAgaWYgY190eXBlKHJldF90eXBlKS5lbmRzd2l0aCgiKiIpOgorICAgICAgICAgICAgcmV0dmFsID0gIiAgICAlcyByZXR2YWwgPSBOVUxMOyIgJSBjX3R5cGUocmV0X3R5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR2YWwgPSAiICAgICVzIHJldHZhbDsiICUgY190eXBlKHJldF90eXBlKQorICAgICAgICByZXQgKz0gbWNnZW4oJycnCislKHJldHZhbClzCisnJycsCisgICAgICAgICAgICAgICAgICAgICByZXR2YWw9cmV0dmFsKQorCisgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworJSh2aXNpdG9yX2lucHV0X2NvbnRhaW5lcnNfZGVjbClzCislKHZpc2l0b3JfaW5wdXRfdmFyc19kZWNsKXMKKworJSh2aXNpdG9yX2lucHV0X2Jsb2NrKXMKKworJycnLAorICAgICAgICAgICAgICAgICAgICAgdmlzaXRvcl9pbnB1dF9jb250YWluZXJzX2RlY2w9Z2VuX3Zpc2l0b3JfaW5wdXRfY29udGFpbmVyc19kZWNsKGFyZ3MpLAorICAgICAgICAgICAgICAgICAgICAgdmlzaXRvcl9pbnB1dF92YXJzX2RlY2w9Z2VuX3Zpc2l0b3JfaW5wdXRfdmFyc19kZWNsKGFyZ3MpLAorICAgICAgICAgICAgICAgICAgICAgdmlzaXRvcl9pbnB1dF9ibG9jaz1nZW5fdmlzaXRvcl9pbnB1dF9ibG9jayhhcmdzLCAiUU9CSkVDVChhcmdzKSIpKQorICAgIGVsc2U6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICAodm9pZClhcmdzOworJycnKQorCisgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgIGlmIChlcnJvcl9pc19zZXQoZXJycCkpIHsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorJShzeW5jX2NhbGwpcworJycnLAorICAgICAgICAgICAgICAgICBzeW5jX2NhbGw9Z2VuX3N5bmNfY2FsbChuYW1lLCBhcmdzLCByZXRfdHlwZSwgaW5kZW50PTQpKQorICAgIHJldCArPSBtY2dlbignJycKKworb3V0OgorJycnKQorICAgIHJldCArPSBtY2dlbignJycKKyUodmlzaXRvcl9pbnB1dF9ibG9ja19jbGVhbnVwKXMKKycnJywKKyAgICAgICAgICAgICAgICAgdmlzaXRvcl9pbnB1dF9ibG9ja19jbGVhbnVwPWdlbl92aXNpdG9yX2lucHV0X2Jsb2NrKGFyZ3MsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsbG9jPVRydWUpKQorCisgICAgaWYgbWlkZGxlX21vZGU6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKworICAgIGlmIChsb2NhbF9lcnIpIHsKKyAgICAgICAgcWVycm9yX3JlcG9ydF9lcnIobG9jYWxfZXJyKTsKKyAgICAgICAgZXJyb3JfZnJlZShsb2NhbF9lcnIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworJycnKQorICAgIGVsc2U6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICByZXR1cm47CisnJycpCisKKyAgICByZXQgKz0gbWNnZW4oJycnCit9CisnJycpCisKKyAgICByZXR1cm4gcmV0CisKK2RlZiBvcHRpb25fdmFsdWVfbWF0Y2hlcyhvcHQsIHZhbCwgY21kKToKKyAgICBpZiBvcHQgaW4gY21kIGFuZCBjbWRbb3B0XSA9PSB2YWw6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBnZW5fcmVnaXN0cnkoY29tbWFuZHMpOgorICAgIHJlZ2lzdHJ5PSIiCisgICAgcHVzaF9pbmRlbnQoKQorICAgIGZvciBjbWQgaW4gY29tbWFuZHM6CisgICAgICAgIG9wdGlvbnMgPSAnUUNPX05PX09QVElPTlMnCisgICAgICAgIGlmIG9wdGlvbl92YWx1ZV9tYXRjaGVzKCdzdWNjZXNzLXJlc3BvbnNlJywgJ25vJywgY21kKToKKyAgICAgICAgICAgIG9wdGlvbnMgPSAnUUNPX05PX1NVQ0NFU1NfUkVTUCcKKworICAgICAgICByZWdpc3RyeSArPSBtY2dlbignJycKK3FtcF9yZWdpc3Rlcl9jb21tYW5kKCIlKG5hbWUpcyIsIHFtcF9tYXJzaGFsX2lucHV0XyUoY19uYW1lKXMsICUob3B0cylzKTsKKycnJywKKyAgICAgICAgICAgICAgICAgICAgIG5hbWU9Y21kWydjb21tYW5kJ10sIGNfbmFtZT1jX2Z1bihjbWRbJ2NvbW1hbmQnXSksCisgICAgICAgICAgICAgICAgICAgICBvcHRzPW9wdGlvbnMpCisgICAgcG9wX2luZGVudCgpCisgICAgcmV0ID0gbWNnZW4oJycnCitzdGF0aWMgdm9pZCBxbXBfaW5pdF9tYXJzaGFsKHZvaWQpCit7CislKHJlZ2lzdHJ5KXMKK30KKworcWFwaV9pbml0KHFtcF9pbml0X21hcnNoYWwpOworJycnLAorICAgICAgICAgICAgICAgIHJlZ2lzdHJ5PXJlZ2lzdHJ5LnJzdHJpcCgpKQorICAgIHJldHVybiByZXQKKworZGVmIGdlbl9jb21tYW5kX2RlY2xfcHJvbG9ndWUoaGVhZGVyLCBndWFyZCwgcHJlZml4PSIiKToKKyAgICByZXQgPSBtY2dlbignJycKKy8qIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCwgRE8gTk9UIE1PRElGWSAqLworCisvKgorICogc2NoZW1hLWRlZmluZWQgUUFQSSBmdW5jdGlvbiBwcm90b3R5cGVzCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmICUoZ3VhcmQpcworI2RlZmluZSAlKGd1YXJkKXMKKworI2luY2x1ZGUgIiUocHJlZml4KXNxYXBpLXR5cGVzLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpL2Vycm9yLmgiCisKKycnJywKKyAgICAgICAgICAgICAgICAgaGVhZGVyPWJhc2VuYW1lKGhlYWRlciksIGd1YXJkPWd1YXJkbmFtZShoZWFkZXIpLCBwcmVmaXg9cHJlZml4KQorICAgIHJldHVybiByZXQKKworZGVmIGdlbl9jb21tYW5kX2RlZl9wcm9sb2d1ZShwcmVmaXg9IiIsIHByb3h5PUZhbHNlKToKKyAgICByZXQgPSBtY2dlbignJycKKy8qIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCwgRE8gTk9UIE1PRElGWSAqLworCisvKgorICogc2NoZW1hLWRlZmluZWQgUU1QLT5RQVBJIGNvbW1hbmQgZGlzcGF0Y2gKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEdQTCwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvdHlwZXMuaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9kaXNwYXRjaC5oIgorI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgorI2luY2x1ZGUgInFhcGkvcW1wLW91dHB1dC12aXNpdG9yLmgiCisjaW5jbHVkZSAicWFwaS9xbXAtaW5wdXQtdmlzaXRvci5oIgorI2luY2x1ZGUgInFhcGkvZGVhbGxvYy12aXNpdG9yLmgiCisjaW5jbHVkZSAiJShwcmVmaXgpc3FhcGktdHlwZXMuaCIKKyNpbmNsdWRlICIlKHByZWZpeClzcWFwaS12aXNpdC5oIgorCisnJycsCisgICAgICAgICAgICAgICAgcHJlZml4PXByZWZpeCkKKyAgICBpZiBub3QgcHJveHk6CisgICAgICAgIHJldCArPSAnI2luY2x1ZGUgIiVzcW1wLWNvbW1hbmRzLmgiJyAlIHByZWZpeAorICAgIHJldHVybiByZXQgKyAiXG5cbiIKKworCit0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImNocDpvOm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbInNvdXJjZSIsICJoZWFkZXIiLCAicHJlZml4PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0LWRpcj0iLCAidHlwZT0iLCAibWlkZGxlIl0pCitleGNlcHQgZ2V0b3B0LkdldG9wdEVycm9yLCBlcnI6CisgICAgcHJpbnQgc3RyKGVycikKKyAgICBzeXMuZXhpdCgxKQorCitvdXRwdXRfZGlyID0gIiIKK3ByZWZpeCA9ICIiCitkaXNwYXRjaF90eXBlID0gInN5bmMiCitjX2ZpbGUgPSAncW1wLW1hcnNoYWwuYycKK2hfZmlsZSA9ICdxbXAtY29tbWFuZHMuaCcKK21pZGRsZV9tb2RlID0gRmFsc2UKKworZG9fYyA9IEZhbHNlCitkb19oID0gRmFsc2UKKworZm9yIG8sIGEgaW4gb3B0czoKKyAgICBpZiBvIGluICgiLXAiLCAiLS1wcmVmaXgiKToKKyAgICAgICAgcHJlZml4ID0gYQorICAgIGVsaWYgbyBpbiAoIi1vIiwgIi0tb3V0cHV0LWRpciIpOgorICAgICAgICBvdXRwdXRfZGlyID0gYSArICIvIgorICAgIGVsaWYgbyBpbiAoIi10IiwgIi0tdHlwZSIpOgorICAgICAgICBkaXNwYXRjaF90eXBlID0gYQorICAgIGVsaWYgbyBpbiAoIi1tIiwgIi0tbWlkZGxlIik6CisgICAgICAgIG1pZGRsZV9tb2RlID0gVHJ1ZQorICAgIGVsaWYgbyBpbiAoIi1jIiwgIi0tc291cmNlIik6CisgICAgICAgIGRvX2MgPSBUcnVlCisgICAgZWxpZiBvIGluICgiLWgiLCAiLS1oZWFkZXIiKToKKyAgICAgICAgZG9faCA9IFRydWUKKworaWYgbm90IGRvX2MgYW5kIG5vdCBkb19oOgorICAgIGRvX2MgPSBUcnVlCisgICAgZG9faCA9IFRydWUKKworY19maWxlID0gb3V0cHV0X2RpciArIHByZWZpeCArIGNfZmlsZQoraF9maWxlID0gb3V0cHV0X2RpciArIHByZWZpeCArIGhfZmlsZQorCitkZWYgbWF5YmVfb3BlbihyZWFsbHksIG5hbWUsIG9wdCk6CisgICAgaWYgcmVhbGx5OgorICAgICAgICByZXR1cm4gb3BlbihuYW1lLCBvcHQpCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTygpCisKK3RyeToKKyAgICBvcy5tYWtlZGlycyhvdXRwdXRfZGlyKQorZXhjZXB0IG9zLmVycm9yLCBlOgorICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICByYWlzZQorCitleHBycyA9IHBhcnNlX3NjaGVtYShzeXMuc3RkaW4pCitjb21tYW5kcyA9IGZpbHRlcihsYW1iZGEgZXhwcjogZXhwci5oYXNfa2V5KCdjb21tYW5kJyksIGV4cHJzKQorY29tbWFuZHMgPSBmaWx0ZXIobGFtYmRhIGV4cHI6IG5vdCBleHByLmhhc19rZXkoJ2dlbicpLCBjb21tYW5kcykKKworaWYgZGlzcGF0Y2hfdHlwZSA9PSAic3luYyI6CisgICAgZmRlY2wgPSBtYXliZV9vcGVuKGRvX2gsIGhfZmlsZSwgJ3cnKQorICAgIGZkZWYgPSBtYXliZV9vcGVuKGRvX2MsIGNfZmlsZSwgJ3cnKQorICAgIHJldCA9IGdlbl9jb21tYW5kX2RlY2xfcHJvbG9ndWUoaGVhZGVyPWJhc2VuYW1lKGhfZmlsZSksIGd1YXJkPWd1YXJkbmFtZShoX2ZpbGUpLCBwcmVmaXg9cHJlZml4KQorICAgIGZkZWNsLndyaXRlKHJldCkKKyAgICByZXQgPSBnZW5fY29tbWFuZF9kZWZfcHJvbG9ndWUocHJlZml4PXByZWZpeCkKKyAgICBmZGVmLndyaXRlKHJldCkKKworICAgIGZvciBjbWQgaW4gY29tbWFuZHM6CisgICAgICAgIGFyZ2xpc3QgPSBbXQorICAgICAgICByZXRfdHlwZSA9IE5vbmUKKyAgICAgICAgaWYgY21kLmhhc19rZXkoJ2RhdGEnKToKKyAgICAgICAgICAgIGFyZ2xpc3QgPSBjbWRbJ2RhdGEnXQorICAgICAgICBpZiBjbWQuaGFzX2tleSgncmV0dXJucycpOgorICAgICAgICAgICAgcmV0X3R5cGUgPSBjbWRbJ3JldHVybnMnXQorICAgICAgICByZXQgPSBnZW5lcmF0ZV9jb21tYW5kX2RlY2woY21kWydjb21tYW5kJ10sIGFyZ2xpc3QsIHJldF90eXBlKSArICJcbiIKKyAgICAgICAgZmRlY2wud3JpdGUocmV0KQorICAgICAgICBpZiByZXRfdHlwZToKKyAgICAgICAgICAgIHJldCA9IGdlbl9tYXJzaGFsX291dHB1dChjbWRbJ2NvbW1hbmQnXSwgYXJnbGlzdCwgcmV0X3R5cGUsIG1pZGRsZV9tb2RlKSArICJcbiIKKyAgICAgICAgICAgIGZkZWYud3JpdGUocmV0KQorCisgICAgICAgIGlmIG1pZGRsZV9tb2RlOgorICAgICAgICAgICAgZmRlY2wud3JpdGUoJyVzO1xuJyAlIGdlbl9tYXJzaGFsX2lucHV0X2RlY2woY21kWydjb21tYW5kJ10sIGFyZ2xpc3QsIHJldF90eXBlLCBtaWRkbGVfbW9kZSkpCisKKyAgICAgICAgcmV0ID0gZ2VuX21hcnNoYWxfaW5wdXQoY21kWydjb21tYW5kJ10sIGFyZ2xpc3QsIHJldF90eXBlLCBtaWRkbGVfbW9kZSkgKyAiXG4iCisgICAgICAgIGZkZWYud3JpdGUocmV0KQorCisgICAgZmRlY2wud3JpdGUoIlxuI2VuZGlmXG4iKTsKKworICAgIGlmIG5vdCBtaWRkbGVfbW9kZToKKyAgICAgICAgcmV0ID0gZ2VuX3JlZ2lzdHJ5KGNvbW1hbmRzKQorICAgICAgICBmZGVmLndyaXRlKHJldCkKKworICAgIGZkZWYuZmx1c2goKQorICAgIGZkZWYuY2xvc2UoKQorICAgIGZkZWNsLmZsdXNoKCkKKyAgICBmZGVjbC5jbG9zZSgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS10eXBlcy5weSBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9xYXBpLXR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTY1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS10eXBlcy5weQpAQCAtMCwwICsxLDQ1NSBAQAorIworIyBRQVBJIHR5cGVzIGdlbmVyYXRvcgorIworIyBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisjCisjIEF1dGhvcnM6CisjICBBbnRob255IExpZ3VvcmkgPGFsaWd1b3JpQHVzLmlibS5jb20+CisjCisjIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEx2Mi4KKyMgU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorCitmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBxYXBpIGltcG9ydCAqCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBlcnJubworCitkZWYgZ2VuZXJhdGVfZndkX3N0cnVjdChuYW1lLCBtZW1iZXJzLCBidWlsdGluX3R5cGU9RmFsc2UpOgorICAgIGlmIGJ1aWx0aW5fdHlwZToKKyAgICAgICAgcmV0dXJuIG1jZ2VuKCcnJworCit0eXBlZGVmIHN0cnVjdCAlKG5hbWUpc0xpc3QKK3sKKyAgICB1bmlvbiB7CisgICAgICAgICUodHlwZSlzIHZhbHVlOworICAgICAgICB1aW50NjRfdCBwYWRkaW5nOworICAgIH07CisgICAgc3RydWN0ICUobmFtZSlzTGlzdCAqbmV4dDsKK30gJShuYW1lKXNMaXN0OworJycnLAorICAgICAgICAgICAgICAgICAgICAgdHlwZT1jX3R5cGUobmFtZSksCisgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKKyAgICByZXR1cm4gbWNnZW4oJycnCisKK3R5cGVkZWYgc3RydWN0ICUobmFtZSlzICUobmFtZSlzOworCit0eXBlZGVmIHN0cnVjdCAlKG5hbWUpc0xpc3QKK3sKKyAgICB1bmlvbiB7CisgICAgICAgICUobmFtZSlzICp2YWx1ZTsKKyAgICAgICAgdWludDY0X3QgcGFkZGluZzsKKyAgICB9OworICAgIHN0cnVjdCAlKG5hbWUpc0xpc3QgKm5leHQ7Cit9ICUobmFtZSlzTGlzdDsKKycnJywKKyAgICAgICAgICAgICAgICAgbmFtZT1uYW1lKQorCitkZWYgZ2VuZXJhdGVfZndkX2VudW1fc3RydWN0KG5hbWUsIG1lbWJlcnMpOgorICAgIHJldHVybiBtY2dlbignJycKK3R5cGVkZWYgc3RydWN0ICUobmFtZSlzTGlzdAoreworICAgIHVuaW9uIHsKKyAgICAgICAgJShuYW1lKXMgdmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHBhZGRpbmc7CisgICAgfTsKKyAgICBzdHJ1Y3QgJShuYW1lKXNMaXN0ICpuZXh0OworfSAlKG5hbWUpc0xpc3Q7CisnJycsCisgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKworZGVmIGdlbmVyYXRlX3N0cnVjdF9maWVsZHMobWVtYmVycyk6CisgICAgcmV0ID0gJycKKworICAgIGZvciBhcmduYW1lLCBhcmdlbnRyeSwgb3B0aW9uYWwsIHN0cnVjdHVyZWQgaW4gcGFyc2VfYXJncyhtZW1iZXJzKToKKyAgICAgICAgaWYgb3B0aW9uYWw6CisgICAgICAgICAgICByZXQgKz0gbWNnZW4oJycnCisgICAgYm9vbCBoYXNfJShjX25hbWUpczsKKycnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjX25hbWU9Y192YXIoYXJnbmFtZSkpCisgICAgICAgIGlmIHN0cnVjdHVyZWQ6CisgICAgICAgICAgICBwdXNoX2luZGVudCgpCisgICAgICAgICAgICByZXQgKz0gZ2VuZXJhdGVfc3RydWN0KHsgImZpZWxkIjogYXJnbmFtZSwgImRhdGEiOiBhcmdlbnRyeX0pCisgICAgICAgICAgICBwb3BfaW5kZW50KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICAlKGNfdHlwZSlzICUoY19uYW1lKXM7CisnJycsCisgICAgICAgICAgICAgICAgICAgICBjX3R5cGU9Y190eXBlKGFyZ2VudHJ5KSwgY19uYW1lPWNfdmFyKGFyZ25hbWUpKQorCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfc3RydWN0KGV4cHIpOgorCisgICAgc3RydWN0bmFtZSA9IGV4cHIuZ2V0KCd0eXBlJywgIiIpCisgICAgZmllbGRuYW1lID0gZXhwci5nZXQoJ2ZpZWxkJywgIiIpCisgICAgbWVtYmVycyA9IGV4cHJbJ2RhdGEnXQorICAgIGJhc2UgPSBleHByLmdldCgnYmFzZScpCisKKyAgICByZXQgPSBtY2dlbignJycKK3N0cnVjdCAlKG5hbWUpcworeworJycnLAorICAgICAgICAgIG5hbWU9c3RydWN0bmFtZSkKKworICAgIGlmIGJhc2U6CisgICAgICAgIHJldCArPSBnZW5lcmF0ZV9zdHJ1Y3RfZmllbGRzKHsnYmFzZSc6IGJhc2V9KQorCisgICAgcmV0ICs9IGdlbmVyYXRlX3N0cnVjdF9maWVsZHMobWVtYmVycykKKworICAgIGlmIGxlbihmaWVsZG5hbWUpOgorICAgICAgICBmaWVsZG5hbWUgPSAiICIgKyBmaWVsZG5hbWUKKyAgICByZXQgKz0gbWNnZW4oJycnCit9JShmaWVsZClzOworJycnLAorICAgICAgICAgICAgZmllbGQ9ZmllbGRuYW1lKQorCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfZW51bV9sb29rdXAobmFtZSwgdmFsdWVzKToKKyAgICByZXQgPSBtY2dlbignJycKK2NvbnN0IGNoYXIgKiUobmFtZSlzX2xvb2t1cFtdID0geworJycnLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKyAgICBpID0gMAorICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICAiJSh2YWx1ZSlzIiwKKycnJywKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXZhbHVlKQorCisgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgIE5VTEwsCit9OworCisnJycpCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfZW51bV9uYW1lKG5hbWUpOgorICAgIGlmIG5hbWUuaXN1cHBlcigpOgorICAgICAgICByZXR1cm4gY19mdW4obmFtZSwgRmFsc2UpCisgICAgbmV3X25hbWUgPSAnJworICAgIGZvciBjIGluIGNfZnVuKG5hbWUsIEZhbHNlKToKKyAgICAgICAgaWYgYy5pc3VwcGVyKCk6CisgICAgICAgICAgICBuZXdfbmFtZSArPSAnXycKKyAgICAgICAgbmV3X25hbWUgKz0gYworICAgIHJldHVybiBuZXdfbmFtZS5sc3RyaXAoJ18nKS51cHBlcigpCisKK2RlZiBnZW5lcmF0ZV9lbnVtKG5hbWUsIHZhbHVlcyk6CisgICAgbG9va3VwX2RlY2wgPSBtY2dlbignJycKK2V4dGVybiBjb25zdCBjaGFyIColKG5hbWUpc19sb29rdXBbXTsKKycnJywKKyAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKKyAgICBlbnVtX2RlY2wgPSBtY2dlbignJycKK3R5cGVkZWYgZW51bSAlKG5hbWUpcworeworJycnLAorICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKworICAgICMgYXBwZW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIF9NQVggdmFsdWUKKyAgICBlbnVtX3ZhbHVlcyA9IHZhbHVlcyArIFsgJ01BWCcgXQorCisgICAgaSA9IDAKKyAgICBmb3IgdmFsdWUgaW4gZW51bV92YWx1ZXM6CisgICAgICAgIGVudW1fZGVjbCArPSBtY2dlbignJycKKyAgICAlKGFiYnJldilzXyUodmFsdWUpcyA9ICUoaSlkLAorJycnLAorICAgICAgICAgICAgICAgICAgICAgYWJicmV2PWRlX2NhbWVsX2Nhc2UobmFtZSkudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlPWdlbmVyYXRlX2VudW1fbmFtZSh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICBpPWkpCisgICAgICAgIGkgKz0gMQorCisgICAgZW51bV9kZWNsICs9IG1jZ2VuKCcnJworfSAlKG5hbWUpczsKKycnJywKKyAgICAgICAgICAgICAgICAgbmFtZT1uYW1lKQorCisgICAgcmV0dXJuIGxvb2t1cF9kZWNsICsgZW51bV9kZWNsCisKK2RlZiBnZW5lcmF0ZV9hbm9uX3VuaW9uX3F0eXBlcyhleHByKToKKworICAgIG5hbWUgPSBleHByWyd1bmlvbiddCisgICAgbWVtYmVycyA9IGV4cHJbJ2RhdGEnXQorCisgICAgcmV0ID0gbWNnZW4oJycnCitjb25zdCBpbnQgJShuYW1lKXNfcXR5cGVzW1FUWVBFX01BWF0gPSB7CisnJycsCisgICAgbmFtZT1uYW1lKQorCisgICAgZm9yIGtleSBpbiBtZW1iZXJzOgorICAgICAgICBxYXBpX3R5cGUgPSBtZW1iZXJzW2tleV0KKyAgICAgICAgaWYgYnVpbHRpbl90eXBlX3F0eXBlcy5oYXNfa2V5KHFhcGlfdHlwZSk6CisgICAgICAgICAgICBxdHlwZSA9IGJ1aWx0aW5fdHlwZV9xdHlwZXNbcWFwaV90eXBlXQorICAgICAgICBlbGlmIGZpbmRfc3RydWN0KHFhcGlfdHlwZSk6CisgICAgICAgICAgICBxdHlwZSA9ICJRVFlQRV9RRElDVCIKKyAgICAgICAgZWxpZiBmaW5kX3VuaW9uKHFhcGlfdHlwZSk6CisgICAgICAgICAgICBxdHlwZSA9ICJRVFlQRV9RRElDVCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIkludmFsaWQgYW5vbnltb3VzIHVuaW9uIG1lbWJlciIKKworICAgICAgICByZXQgKz0gbWNnZW4oJycnCisgICAgWyAlKHF0eXBlKXMgXSA9ICUoYWJicmV2KXNfS0lORF8lKGVudW0pcywKKycnJywKKyAgICAgICAgcXR5cGUgPSBxdHlwZSwKKyAgICAgICAgYWJicmV2ID0gZGVfY2FtZWxfY2FzZShuYW1lKS51cHBlcigpLAorICAgICAgICBlbnVtID0gY19mdW4oZGVfY2FtZWxfY2FzZShrZXkpLEZhbHNlKS51cHBlcigpKQorCisgICAgcmV0ICs9IG1jZ2VuKCcnJworfTsKKycnJykKKyAgICByZXR1cm4gcmV0CisKKworZGVmIGdlbmVyYXRlX3VuaW9uKGV4cHIpOgorCisgICAgbmFtZSA9IGV4cHJbJ3VuaW9uJ10KKyAgICB0eXBlaW5mbyA9IGV4cHJbJ2RhdGEnXQorCisgICAgYmFzZSA9IGV4cHIuZ2V0KCdiYXNlJykKKyAgICBkaXNjcmltaW5hdG9yID0gZXhwci5nZXQoJ2Rpc2NyaW1pbmF0b3InKQorCisgICAgcmV0ID0gbWNnZW4oJycnCitzdHJ1Y3QgJShuYW1lKXMKK3sKKyAgICAlKG5hbWUpc0tpbmQga2luZDsKKyAgICB1bmlvbiB7CisgICAgICAgIHZvaWQgKmRhdGE7CisnJycsCisgICAgICAgICAgICAgICAgbmFtZT1uYW1lKQorCisgICAgZm9yIGtleSBpbiB0eXBlaW5mbzoKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgICAgICAlKGNfdHlwZSlzICUoY19uYW1lKXM7CisnJycsCisgICAgICAgICAgICAgICAgICAgICBjX3R5cGU9Y190eXBlKHR5cGVpbmZvW2tleV0pLAorICAgICAgICAgICAgICAgICAgICAgY19uYW1lPWNfZnVuKGtleSkpCisKKyAgICByZXQgKz0gbWNnZW4oJycnCisgICAgfTsKKycnJykKKworICAgIGlmIGJhc2U6CisgICAgICAgIGJhc2VfZmllbGRzID0gZmluZF9zdHJ1Y3QoYmFzZSlbJ2RhdGEnXQorICAgICAgICBpZiBkaXNjcmltaW5hdG9yOgorICAgICAgICAgICAgYmFzZV9maWVsZHMgPSBiYXNlX2ZpZWxkcy5jb3B5KCkKKyAgICAgICAgICAgIGRlbCBiYXNlX2ZpZWxkc1tkaXNjcmltaW5hdG9yXQorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfc3RydWN0X2ZpZWxkcyhiYXNlX2ZpZWxkcykKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgbm90IGRpc2NyaW1pbmF0b3IKKworICAgIHJldCArPSBtY2dlbignJycKK307CisnJycpCisgICAgaWYgZGlzY3JpbWluYXRvciA9PSB7fToKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworZXh0ZXJuIGNvbnN0IGludCAlKG5hbWUpc19xdHlwZXNbXTsKKycnJywKKyAgICAgICAgICAgIG5hbWU9bmFtZSkKKworCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfdHlwZV9jbGVhbnVwX2RlY2wobmFtZSk6CisgICAgcmV0ID0gbWNnZW4oJycnCit2b2lkIHFhcGlfZnJlZV8lKHR5cGUpcyglKGNfdHlwZSlzIG9iaik7CisnJycsCisgICAgICAgICAgICAgICAgY190eXBlPWNfdHlwZShuYW1lKSx0eXBlPW5hbWUpCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfdHlwZV9jbGVhbnVwKG5hbWUpOgorICAgIHJldCA9IG1jZ2VuKCcnJworCit2b2lkIHFhcGlfZnJlZV8lKHR5cGUpcyglKGNfdHlwZSlzIG9iaikKK3sKKyAgICBRYXBpRGVhbGxvY1Zpc2l0b3IgKm1kOworICAgIFZpc2l0b3IgKnY7CisKKyAgICBpZiAoIW9iaikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWQgPSBxYXBpX2RlYWxsb2NfdmlzaXRvcl9uZXcoKTsKKyAgICB2ID0gcWFwaV9kZWFsbG9jX2dldF92aXNpdG9yKG1kKTsKKyAgICB2aXNpdF90eXBlXyUodHlwZSlzKHYsICZvYmosIE5VTEwsIE5VTEwpOworICAgIHFhcGlfZGVhbGxvY192aXNpdG9yX2NsZWFudXAobWQpOworfQorJycnLAorICAgICAgICAgICAgICAgIGNfdHlwZT1jX3R5cGUobmFtZSksdHlwZT1uYW1lKQorICAgIHJldHVybiByZXQKKworCit0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImNoYnA6bzoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbInNvdXJjZSIsICJoZWFkZXIiLCAiYnVpbHRpbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeD0iLCAib3V0cHV0LWRpcj0iXSkKK2V4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3IsIGVycjoKKyAgICBwcmludCBzdHIoZXJyKQorICAgIHN5cy5leGl0KDEpCisKK291dHB1dF9kaXIgPSAiIgorcHJlZml4ID0gIiIKK2NfZmlsZSA9ICdxYXBpLXR5cGVzLmMnCitoX2ZpbGUgPSAncWFwaS10eXBlcy5oJworCitkb19jID0gRmFsc2UKK2RvX2ggPSBGYWxzZQorZG9fYnVpbHRpbnMgPSBGYWxzZQorCitmb3IgbywgYSBpbiBvcHRzOgorICAgIGlmIG8gaW4gKCItcCIsICItLXByZWZpeCIpOgorICAgICAgICBwcmVmaXggPSBhCisgICAgZWxpZiBvIGluICgiLW8iLCAiLS1vdXRwdXQtZGlyIik6CisgICAgICAgIG91dHB1dF9kaXIgPSBhICsgIi8iCisgICAgZWxpZiBvIGluICgiLWMiLCAiLS1zb3VyY2UiKToKKyAgICAgICAgZG9fYyA9IFRydWUKKyAgICBlbGlmIG8gaW4gKCItaCIsICItLWhlYWRlciIpOgorICAgICAgICBkb19oID0gVHJ1ZQorICAgIGVsaWYgbyBpbiAoIi1iIiwgIi0tYnVpbHRpbnMiKToKKyAgICAgICAgZG9fYnVpbHRpbnMgPSBUcnVlCisKK2lmIG5vdCBkb19jIGFuZCBub3QgZG9faDoKKyAgICBkb19jID0gVHJ1ZQorICAgIGRvX2ggPSBUcnVlCisKK2NfZmlsZSA9IG91dHB1dF9kaXIgKyBwcmVmaXggKyBjX2ZpbGUKK2hfZmlsZSA9IG91dHB1dF9kaXIgKyBwcmVmaXggKyBoX2ZpbGUKKwordHJ5OgorICAgIG9zLm1ha2VkaXJzKG91dHB1dF9kaXIpCitleGNlcHQgb3MuZXJyb3IsIGU6CisgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgIHJhaXNlCisKK2RlZiBtYXliZV9vcGVuKHJlYWxseSwgbmFtZSwgb3B0KToKKyAgICBpZiByZWFsbHk6CisgICAgICAgIHJldHVybiBvcGVuKG5hbWUsIG9wdCkKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPKCkKKworZmRlZiA9IG1heWJlX29wZW4oZG9fYywgY19maWxlLCAndycpCitmZGVjbCA9IG1heWJlX29wZW4oZG9faCwgaF9maWxlLCAndycpCisKK2ZkZWYud3JpdGUobWNnZW4oJycnCisvKiBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCwgRE8gTk9UIE1PRElGWSAqLworCisvKgorICogZGVhbGxvY2F0aW9uIGZ1bmN0aW9ucyBmb3Igc2NoZW1hLWRlZmluZWQgUUFQSSB0eXBlcworICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTEKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICogIE1pY2hhZWwgUm90aCAgICAgIDxtZHJvdGhAbGludXgudm5ldC5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgInFhcGkvZGVhbGxvYy12aXNpdG9yLmgiCisjaW5jbHVkZSAiJShwcmVmaXgpc3FhcGktdHlwZXMuaCIKKyNpbmNsdWRlICIlKHByZWZpeClzcWFwaS12aXNpdC5oIgorCisnJycsICAgICAgICAgICAgIHByZWZpeD1wcmVmaXgpKQorCitmZGVjbC53cml0ZShtY2dlbignJycKKy8qIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVELCBETyBOT1QgTU9ESUZZICovCisKKy8qCisgKiBzY2hlbWEtZGVmaW5lZCBRQVBJIHR5cGVzCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmICUoZ3VhcmQpcworI2RlZmluZSAlKGd1YXJkKXMKKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworJycnLAorICAgICAgICAgICAgICAgICAgZ3VhcmQ9Z3VhcmRuYW1lKGhfZmlsZSkpKQorCitleHBycyA9IHBhcnNlX3NjaGVtYShzeXMuc3RkaW4pCitleHBycyA9IGZpbHRlcihsYW1iZGEgZXhwcjogbm90IGV4cHIuaGFzX2tleSgnZ2VuJyksIGV4cHJzKQorCitmZGVjbC53cml0ZShndWFyZHN0YXJ0KCJRQVBJX1RZUEVTX0JVSUxUSU5fU1RSVUNUX0RFQ0wiKSkKK2ZvciB0eXBlbmFtZSBpbiBidWlsdGluX3R5cGVzOgorICAgIGZkZWNsLndyaXRlKGdlbmVyYXRlX2Z3ZF9zdHJ1Y3QodHlwZW5hbWUsIE5vbmUsIGJ1aWx0aW5fdHlwZT1UcnVlKSkKK2ZkZWNsLndyaXRlKGd1YXJkZW5kKCJRQVBJX1RZUEVTX0JVSUxUSU5fU1RSVUNUX0RFQ0wiKSkKKworZm9yIGV4cHIgaW4gZXhwcnM6CisgICAgcmV0ID0gIlxuIgorICAgIGlmIGV4cHIuaGFzX2tleSgndHlwZScpOgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfZndkX3N0cnVjdChleHByWyd0eXBlJ10sIGV4cHJbJ2RhdGEnXSkKKyAgICBlbGlmIGV4cHIuaGFzX2tleSgnZW51bScpOgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfZW51bShleHByWydlbnVtJ10sIGV4cHJbJ2RhdGEnXSkgKyAiXG4iCisgICAgICAgIHJldCArPSBnZW5lcmF0ZV9md2RfZW51bV9zdHJ1Y3QoZXhwclsnZW51bSddLCBleHByWydkYXRhJ10pCisgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfZW51bV9sb29rdXAoZXhwclsnZW51bSddLCBleHByWydkYXRhJ10pKQorICAgIGVsaWYgZXhwci5oYXNfa2V5KCd1bmlvbicpOgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfZndkX3N0cnVjdChleHByWyd1bmlvbiddLCBleHByWydkYXRhJ10pICsgIlxuIgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfZW51bSgnJXNLaW5kJyAlIGV4cHJbJ3VuaW9uJ10sIGV4cHJbJ2RhdGEnXS5rZXlzKCkpCisgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfZW51bV9sb29rdXAoJyVzS2luZCcgJSBleHByWyd1bmlvbiddLCBleHByWydkYXRhJ10ua2V5cygpKSkKKyAgICAgICAgaWYgZXhwci5nZXQoJ2Rpc2NyaW1pbmF0b3InKSA9PSB7fToKKyAgICAgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfYW5vbl91bmlvbl9xdHlwZXMoZXhwcikpCisgICAgZWxzZToKKyAgICAgICAgY29udGludWUKKyAgICBmZGVjbC53cml0ZShyZXQpCisKKyMgdG8gYXZvaWQgaGVhZGVyIGRlcGVuZGVuY3kgaGVsbCwgd2UgYWx3YXlzIGdlbmVyYXRlIGRlY2xhcmF0aW9ucworIyBmb3IgYnVpbHQtaW4gdHlwZXMgaW4gb3VyIGhlYWRlciBmaWxlcyBhbmQgc2ltcGx5IGd1YXJkIHRoZW0KK2ZkZWNsLndyaXRlKGd1YXJkc3RhcnQoIlFBUElfVFlQRVNfQlVJTFRJTl9DTEVBTlVQX0RFQ0wiKSkKK2ZvciB0eXBlbmFtZSBpbiBidWlsdGluX3R5cGVzOgorICAgIGZkZWNsLndyaXRlKGdlbmVyYXRlX3R5cGVfY2xlYW51cF9kZWNsKHR5cGVuYW1lICsgIkxpc3QiKSkKK2ZkZWNsLndyaXRlKGd1YXJkZW5kKCJRQVBJX1RZUEVTX0JVSUxUSU5fQ0xFQU5VUF9ERUNMIikpCisKKyMgLi4udGhpcyBkb2Vzbid0IHdvcmsgZm9yIGNhc2VzIHdoZXJlIHdlIGxpbmsgaW4gbXVsdGlwbGUgb2JqZWN0cyB0aGF0CisjIGhhdmUgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkLCBzbyB3ZSB1c2UgLWIgb3B0aW9uIHRvIHByb3ZpZGUgY29udHJvbAorIyBvdmVyIHRoZXNlIGNhc2VzCitpZiBkb19idWlsdGluczoKKyAgICBmZGVmLndyaXRlKGd1YXJkc3RhcnQoIlFBUElfVFlQRVNfQlVJTFRJTl9DTEVBTlVQX0RFRiIpKQorICAgIGZvciB0eXBlbmFtZSBpbiBidWlsdGluX3R5cGVzOgorICAgICAgICBmZGVmLndyaXRlKGdlbmVyYXRlX3R5cGVfY2xlYW51cCh0eXBlbmFtZSArICJMaXN0IikpCisgICAgZmRlZi53cml0ZShndWFyZGVuZCgiUUFQSV9UWVBFU19CVUlMVElOX0NMRUFOVVBfREVGIikpCisKK2ZvciBleHByIGluIGV4cHJzOgorICAgIHJldCA9ICJcbiIKKyAgICBpZiBleHByLmhhc19rZXkoJ3R5cGUnKToKKyAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3N0cnVjdChleHByKSArICJcbiIKKyAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3R5cGVfY2xlYW51cF9kZWNsKGV4cHJbJ3R5cGUnXSArICJMaXN0IikKKyAgICAgICAgZmRlZi53cml0ZShnZW5lcmF0ZV90eXBlX2NsZWFudXAoZXhwclsndHlwZSddICsgIkxpc3QiKSArICJcbiIpCisgICAgICAgIHJldCArPSBnZW5lcmF0ZV90eXBlX2NsZWFudXBfZGVjbChleHByWyd0eXBlJ10pCisgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfdHlwZV9jbGVhbnVwKGV4cHJbJ3R5cGUnXSkgKyAiXG4iKQorICAgIGVsaWYgZXhwci5oYXNfa2V5KCd1bmlvbicpOgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfdW5pb24oZXhwcikKKyAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3R5cGVfY2xlYW51cF9kZWNsKGV4cHJbJ3VuaW9uJ10gKyAiTGlzdCIpCisgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfdHlwZV9jbGVhbnVwKGV4cHJbJ3VuaW9uJ10gKyAiTGlzdCIpICsgIlxuIikKKyAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3R5cGVfY2xlYW51cF9kZWNsKGV4cHJbJ3VuaW9uJ10pCisgICAgICAgIGZkZWYud3JpdGUoZ2VuZXJhdGVfdHlwZV9jbGVhbnVwKGV4cHJbJ3VuaW9uJ10pICsgIlxuIikKKyAgICBlbGlmIGV4cHIuaGFzX2tleSgnZW51bScpOgorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfdHlwZV9jbGVhbnVwX2RlY2woZXhwclsnZW51bSddICsgIkxpc3QiKQorICAgICAgICBmZGVmLndyaXRlKGdlbmVyYXRlX3R5cGVfY2xlYW51cChleHByWydlbnVtJ10gKyAiTGlzdCIpICsgIlxuIikKKyAgICBlbHNlOgorICAgICAgICBjb250aW51ZQorICAgIGZkZWNsLndyaXRlKHJldCkKKworZmRlY2wud3JpdGUoJycnCisjZW5kaWYKKycnJykKKworZmRlY2wuZmx1c2goKQorZmRlY2wuY2xvc2UoKQorCitmZGVmLmZsdXNoKCkKK2ZkZWYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zY3JpcHRzL3FhcGktdmlzaXQucHkgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS12aXNpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWYxYTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zY3JpcHRzL3FhcGktdmlzaXQucHkKQEAgLTAsMCArMSw1MzUgQEAKKyMKKyMgUUFQSSB2aXNpdG9yIGdlbmVyYXRvcgorIworIyBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDExCisjCisjIEF1dGhvcnM6CisjICBBbnRob255IExpZ3VvcmkgPGFsaWd1b3JpQHVzLmlibS5jb20+CisjICBNaWNoYWVsIFJvdGggICAgPG1kcm90aEBsaW51eC52bmV0LmlibS5jb20+CisjCisjIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEx2Mi4KKyMgU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorCitmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBxYXBpIGltcG9ydCAqCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBlcnJubworCitkZWYgZ2VuZXJhdGVfdmlzaXRfc3RydWN0X2ZpZWxkcyhuYW1lLCBmaWVsZF9wcmVmaXgsIGZuX3ByZWZpeCwgbWVtYmVycywgYmFzZSA9IE5vbmUpOgorICAgIHN1YnN0cnVjdHMgPSBbXQorICAgIHJldCA9ICcnCisgICAgaWYgbm90IGZuX3ByZWZpeDoKKyAgICAgICAgZnVsbF9uYW1lID0gbmFtZQorICAgIGVsc2U6CisgICAgICAgIGZ1bGxfbmFtZSA9ICIlc18lcyIgJSAobmFtZSwgZm5fcHJlZml4KQorCisgICAgZm9yIGFyZ25hbWUsIGFyZ2VudHJ5LCBvcHRpb25hbCwgc3RydWN0dXJlZCBpbiBwYXJzZV9hcmdzKG1lbWJlcnMpOgorICAgICAgICBpZiBzdHJ1Y3R1cmVkOgorICAgICAgICAgICAgaWYgbm90IGZuX3ByZWZpeDoKKyAgICAgICAgICAgICAgICBuZXN0ZWRfZm5fcHJlZml4ID0gYXJnbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXN0ZWRfZm5fcHJlZml4ID0gIiVzXyVzIiAlIChmbl9wcmVmaXgsIGFyZ25hbWUpCisKKyAgICAgICAgICAgIG5lc3RlZF9maWVsZF9wcmVmaXggPSAiJXMlcy4iICUgKGZpZWxkX3ByZWZpeCwgYXJnbmFtZSkKKyAgICAgICAgICAgIHJldCArPSBnZW5lcmF0ZV92aXNpdF9zdHJ1Y3RfZmllbGRzKG5hbWUsIG5lc3RlZF9maWVsZF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfZm5fcHJlZml4LCBhcmdlbnRyeSkKKworICAgIHJldCArPSBtY2dlbignJycKKworc3RhdGljIHZvaWQgdmlzaXRfdHlwZV8lKGZ1bGxfbmFtZSlzX2ZpZWxkcyhWaXNpdG9yICptLCAlKG5hbWUpcyAqKiBvYmosIEVycm9yICoqZXJycCkKK3sKKyAgICBFcnJvciAqZXJyID0gTlVMTDsKKycnJywKKyAgICAgICAgbmFtZT1uYW1lLCBmdWxsX25hbWU9ZnVsbF9uYW1lKQorICAgIHB1c2hfaW5kZW50KCkKKworICAgIGlmIGJhc2U6CisgICAgICAgIHJldCArPSBtY2dlbignJycKK3Zpc2l0X3N0YXJ0X2ltcGxpY2l0X3N0cnVjdChtLCBvYmogPyAodm9pZCoqKSAmKCpvYmopLT4lKGNfbmFtZSlzIDogTlVMTCwgc2l6ZW9mKCUodHlwZSlzKSwgJmVycik7CitpZiAoIWVycikgeworICAgIHZpc2l0X3R5cGVfJSh0eXBlKXNfZmllbGRzKG0sIG9iaiA/ICYoKm9iaiktPiUoY19wcmVmaXgpcyUoY19uYW1lKXMgOiBOVUxMLCAmZXJyKTsKKyAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKKyAgICBlcnIgPSBOVUxMOworICAgIHZpc2l0X2VuZF9pbXBsaWNpdF9zdHJ1Y3QobSwgJmVycik7Cit9CisnJycsCisgICAgICAgICAgICAgICAgICAgICBjX3ByZWZpeD1jX3ZhcihmaWVsZF9wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlX25hbWUoYmFzZSksIGNfbmFtZT1jX3ZhcignYmFzZScpKQorCisgICAgZm9yIGFyZ25hbWUsIGFyZ2VudHJ5LCBvcHRpb25hbCwgc3RydWN0dXJlZCBpbiBwYXJzZV9hcmdzKG1lbWJlcnMpOgorICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIHJldCArPSBtY2dlbignJycKK3Zpc2l0X3N0YXJ0X29wdGlvbmFsKG0sIG9iaiA/ICYoKm9iaiktPiUoY19wcmVmaXgpc2hhc18lKGNfbmFtZSlzIDogTlVMTCwgIiUobmFtZSlzIiwgJmVycik7CitpZiAob2JqICYmICgqb2JqKS0+JShwcmVmaXgpc2hhc18lKGNfbmFtZSlzKSB7CisnJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgY19wcmVmaXg9Y192YXIoZmllbGRfcHJlZml4KSwgcHJlZml4PWZpZWxkX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjX25hbWU9Y192YXIoYXJnbmFtZSksIG5hbWU9YXJnbmFtZSkKKyAgICAgICAgICAgIHB1c2hfaW5kZW50KCkKKworICAgICAgICBpZiBzdHJ1Y3R1cmVkOgorICAgICAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3Zpc2l0X3N0cnVjdF9ib2R5KGZ1bGxfbmFtZSwgYXJnbmFtZSwgYXJnZW50cnkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXQgKz0gbWNnZW4oJycnCit2aXNpdF90eXBlXyUodHlwZSlzKG0sIG9iaiA/ICYoKm9iaiktPiUoY19wcmVmaXgpcyUoY19uYW1lKXMgOiBOVUxMLCAiJShuYW1lKXMiLCAmZXJyKTsKKycnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjX3ByZWZpeD1jX3ZhcihmaWVsZF9wcmVmaXgpLCBwcmVmaXg9ZmllbGRfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9dHlwZV9uYW1lKGFyZ2VudHJ5KSwgY19uYW1lPWNfdmFyKGFyZ25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9YXJnbmFtZSkKKworICAgICAgICBpZiBvcHRpb25hbDoKKyAgICAgICAgICAgIHBvcF9pbmRlbnQoKQorICAgICAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworfQordmlzaXRfZW5kX29wdGlvbmFsKG0sICZlcnIpOworJycnKQorCisgICAgcG9wX2luZGVudCgpCisgICAgcmV0ICs9IG1jZ2VuKCcnJworCisgICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGVycik7Cit9CisnJycpCisgICAgcmV0dXJuIHJldAorCisKK2RlZiBnZW5lcmF0ZV92aXNpdF9zdHJ1Y3RfYm9keShmaWVsZF9wcmVmaXgsIG5hbWUsIG1lbWJlcnMpOgorICAgIHJldCA9IG1jZ2VuKCcnJworaWYgKCFlcnJvcl9pc19zZXQoZXJycCkpIHsKKycnJykKKyAgICBwdXNoX2luZGVudCgpCisKKyAgICBpZiBub3QgZmllbGRfcHJlZml4OgorICAgICAgICBmdWxsX25hbWUgPSBuYW1lCisgICAgZWxzZToKKyAgICAgICAgZnVsbF9uYW1lID0gIiVzXyVzIiAlIChmaWVsZF9wcmVmaXgsIG5hbWUpCisKKyAgICBpZiBsZW4oZmllbGRfcHJlZml4KToKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworRXJyb3IgKiplcnJwID0gJmVycjsgLyogZnJvbSBvdXRlciBzY29wZSAqLworRXJyb3IgKmVyciA9IE5VTEw7Cit2aXNpdF9zdGFydF9zdHJ1Y3QobSwgTlVMTCwgIiIsICIlKG5hbWUpcyIsIDAsICZlcnIpOworJycnLAorICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKyAgICBlbHNlOgorICAgICAgICByZXQgKz0gbWNnZW4oJycnCitFcnJvciAqZXJyID0gTlVMTDsKK3Zpc2l0X3N0YXJ0X3N0cnVjdChtLCAodm9pZCAqKilvYmosICIlKG5hbWUpcyIsIG5hbWUsIHNpemVvZiglKG5hbWUpcyksICZlcnIpOworJycnLAorICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKworICAgIHJldCArPSBtY2dlbignJycKK2lmICghZXJyKSB7CisgICAgaWYgKCFvYmogfHwgKm9iaikgeworICAgICAgICB2aXNpdF90eXBlXyUobmFtZSlzX2ZpZWxkcyhtLCBvYmosICZlcnIpOworICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKKyAgICAgICAgZXJyID0gTlVMTDsKKyAgICB9CisnJycsCisgICAgICAgIG5hbWU9ZnVsbF9uYW1lKQorCisgICAgcG9wX2luZGVudCgpCisgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgICAgICAvKiBBbHdheXMgY2FsbCBlbmRfc3RydWN0IGlmIHN0YXJ0X3N0cnVjdCBzdWNjZWVkZWQuICAqLworICAgICAgICB2aXNpdF9lbmRfc3RydWN0KG0sICZlcnIpOworICAgIH0KKyAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKK30KKycnJykKKyAgICByZXR1cm4gcmV0CisKK2RlZiBnZW5lcmF0ZV92aXNpdF9zdHJ1Y3QoZXhwcik6CisKKyAgICBuYW1lID0gZXhwclsndHlwZSddCisgICAgbWVtYmVycyA9IGV4cHJbJ2RhdGEnXQorICAgIGJhc2UgPSBleHByLmdldCgnYmFzZScpCisKKyAgICByZXQgPSBnZW5lcmF0ZV92aXNpdF9zdHJ1Y3RfZmllbGRzKG5hbWUsICIiLCAiIiwgbWVtYmVycywgYmFzZSkKKworICAgIHJldCArPSBtY2dlbignJycKKwordm9pZCB2aXNpdF90eXBlXyUobmFtZSlzKFZpc2l0b3IgKm0sICUobmFtZSlzICoqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworJycnLAorICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKworICAgIHB1c2hfaW5kZW50KCkKKyAgICByZXQgKz0gZ2VuZXJhdGVfdmlzaXRfc3RydWN0X2JvZHkoIiIsIG5hbWUsIG1lbWJlcnMpCisgICAgcG9wX2luZGVudCgpCisKKyAgICByZXQgKz0gbWNnZW4oJycnCit9CisnJycpCisgICAgcmV0dXJuIHJldAorCitkZWYgZ2VuZXJhdGVfdmlzaXRfbGlzdChuYW1lLCBtZW1iZXJzKToKKyAgICByZXR1cm4gbWNnZW4oJycnCisKK3ZvaWQgdmlzaXRfdHlwZV8lKG5hbWUpc0xpc3QoVmlzaXRvciAqbSwgJShuYW1lKXNMaXN0ICoqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIEdlbmVyaWNMaXN0ICppLCAqKnByZXYgPSAoR2VuZXJpY0xpc3QgKiopb2JqOworICAgIEVycm9yICplcnIgPSBOVUxMOworCisgICAgaWYgKCFlcnJvcl9pc19zZXQoZXJycCkpIHsKKyAgICAgICAgdmlzaXRfc3RhcnRfbGlzdChtLCBuYW1lLCAmZXJyKTsKKyAgICAgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgICAgIGZvciAoOyAoaSA9IHZpc2l0X25leHRfbGlzdChtLCBwcmV2LCAmZXJyKSkgIT0gTlVMTDsgcHJldiA9ICZpKSB7CisgICAgICAgICAgICAgICAgJShuYW1lKXNMaXN0ICpuYXRpdmVfaSA9ICglKG5hbWUpc0xpc3QgKilpOworICAgICAgICAgICAgICAgIHZpc2l0X3R5cGVfJShuYW1lKXMobSwgJm5hdGl2ZV9pLT52YWx1ZSwgTlVMTCwgJmVycik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKKyAgICAgICAgICAgIGVyciA9IE5VTEw7CisKKyAgICAgICAgICAgIC8qIEFsd2F5cyBjYWxsIGVuZF9saXN0IGlmIHN0YXJ0X2xpc3Qgc3VjY2VlZGVkLiAgKi8KKyAgICAgICAgICAgIHZpc2l0X2VuZF9saXN0KG0sICZlcnIpOworICAgICAgICB9CisgICAgICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnIpOworICAgIH0KK30KKycnJywKKyAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKK2RlZiBnZW5lcmF0ZV92aXNpdF9lbnVtKG5hbWUsIG1lbWJlcnMpOgorICAgIHJldHVybiBtY2dlbignJycKKwordm9pZCB2aXNpdF90eXBlXyUobmFtZSlzKFZpc2l0b3IgKm0sICUobmFtZSlzICogb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApCit7CisgICAgdmlzaXRfdHlwZV9lbnVtKG0sIChpbnQgKilvYmosICUobmFtZSlzX2xvb2t1cCwgIiUobmFtZSlzIiwgbmFtZSwgZXJycCk7Cit9CisnJycsCisgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSkKKworZGVmIGdlbmVyYXRlX3Zpc2l0X2Fub25fdW5pb24obmFtZSwgbWVtYmVycyk6CisgICAgcmV0ID0gbWNnZW4oJycnCisKK3ZvaWQgdmlzaXRfdHlwZV8lKG5hbWUpcyhWaXNpdG9yICptLCAlKG5hbWUpcyAqKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCkKK3sKKyAgICBFcnJvciAqZXJyID0gTlVMTDsKKworICAgIGlmICghZXJyb3JfaXNfc2V0KGVycnApKSB7CisgICAgICAgIHZpc2l0X3N0YXJ0X2ltcGxpY2l0X3N0cnVjdChtLCAodm9pZCoqKSBvYmosIHNpemVvZiglKG5hbWUpcyksICZlcnIpOworICAgICAgICB2aXNpdF9nZXRfbmV4dF90eXBlKG0sIChpbnQqKSAmKCpvYmopLT5raW5kLCAlKG5hbWUpc19xdHlwZXMsIG5hbWUsICZlcnIpOworICAgICAgICBzd2l0Y2ggKCgqb2JqKS0+a2luZCkgeworJycnLAorICAgIG5hbWU9bmFtZSkKKworICAgIGZvciBrZXkgaW4gbWVtYmVyczoKKyAgICAgICAgYXNzZXJ0IChtZW1iZXJzW2tleV0gaW4gYnVpbHRpbl90eXBlcworICAgICAgICAgICAgb3IgZmluZF9zdHJ1Y3QobWVtYmVyc1trZXldKQorICAgICAgICAgICAgb3IgZmluZF91bmlvbihtZW1iZXJzW2tleV0pKSwgIkludmFsaWQgYW5vbnltb3VzIHVuaW9uIG1lbWJlciIKKworICAgICAgICByZXQgKz0gbWNnZW4oJycnCisgICAgICAgIGNhc2UgJShhYmJyZXYpc19LSU5EXyUoZW51bSlzOgorICAgICAgICAgICAgdmlzaXRfdHlwZV8lKGNfdHlwZSlzKG0sICYoKm9iaiktPiUoY19uYW1lKXMsIG5hbWUsICZlcnIpOworICAgICAgICAgICAgYnJlYWs7CisnJycsCisgICAgICAgICAgICAgICAgYWJicmV2ID0gZGVfY2FtZWxfY2FzZShuYW1lKS51cHBlcigpLAorICAgICAgICAgICAgICAgIGVudW0gPSBjX2Z1bihkZV9jYW1lbF9jYXNlKGtleSksRmFsc2UpLnVwcGVyKCksCisgICAgICAgICAgICAgICAgY190eXBlID0gdHlwZV9uYW1lKG1lbWJlcnNba2V5XSksCisgICAgICAgICAgICAgICAgY19uYW1lID0gY19mdW4oa2V5KSkKKworICAgIHJldCArPSBtY2dlbignJycKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JfcHJvcGFnYXRlKGVycnAsIGVycik7CisgICAgICAgIGVyciA9IE5VTEw7CisgICAgICAgIHZpc2l0X2VuZF9pbXBsaWNpdF9zdHJ1Y3QobSwgJmVycik7CisgICAgfQorfQorJycnKQorCisgICAgcmV0dXJuIHJldAorCisKK2RlZiBnZW5lcmF0ZV92aXNpdF91bmlvbihleHByKToKKworICAgIG5hbWUgPSBleHByWyd1bmlvbiddCisgICAgbWVtYmVycyA9IGV4cHJbJ2RhdGEnXQorCisgICAgYmFzZSA9IGV4cHIuZ2V0KCdiYXNlJykKKyAgICBkaXNjcmltaW5hdG9yID0gZXhwci5nZXQoJ2Rpc2NyaW1pbmF0b3InKQorCisgICAgaWYgZGlzY3JpbWluYXRvciA9PSB7fToKKyAgICAgICAgYXNzZXJ0IG5vdCBiYXNlCisgICAgICAgIHJldHVybiBnZW5lcmF0ZV92aXNpdF9hbm9uX3VuaW9uKG5hbWUsIG1lbWJlcnMpCisKKyAgICByZXQgPSBnZW5lcmF0ZV92aXNpdF9lbnVtKCclc0tpbmQnICUgbmFtZSwgbWVtYmVycy5rZXlzKCkpCisKKyAgICBpZiBiYXNlOgorICAgICAgICBiYXNlX2ZpZWxkcyA9IGZpbmRfc3RydWN0KGJhc2UpWydkYXRhJ10KKyAgICAgICAgaWYgZGlzY3JpbWluYXRvcjoKKyAgICAgICAgICAgIGJhc2VfZmllbGRzID0gYmFzZV9maWVsZHMuY29weSgpCisgICAgICAgICAgICBkZWwgYmFzZV9maWVsZHNbZGlzY3JpbWluYXRvcl0KKyAgICAgICAgcmV0ICs9IGdlbmVyYXRlX3Zpc2l0X3N0cnVjdF9maWVsZHMobmFtZSwgIiIsICIiLCBiYXNlX2ZpZWxkcykKKworICAgIHJldCArPSBtY2dlbignJycKKwordm9pZCB2aXNpdF90eXBlXyUobmFtZSlzKFZpc2l0b3IgKm0sICUobmFtZSlzICoqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKQoreworICAgIEVycm9yICplcnIgPSBOVUxMOworCisgICAgaWYgKCFlcnJvcl9pc19zZXQoZXJycCkpIHsKKyAgICAgICAgdmlzaXRfc3RhcnRfc3RydWN0KG0sICh2b2lkICoqKW9iaiwgIiUobmFtZSlzIiwgbmFtZSwgc2l6ZW9mKCUobmFtZSlzKSwgJmVycik7CisgICAgICAgIGlmICghZXJyKSB7CisgICAgICAgICAgICBpZiAob2JqICYmICpvYmopIHsKKycnJywKKyAgICAgICAgICAgICAgICAgbmFtZT1uYW1lKQorCisKKyAgICBwdXNoX2luZGVudCgpCisgICAgcHVzaF9pbmRlbnQoKQorICAgIHB1c2hfaW5kZW50KCkKKworICAgIGlmIGJhc2U6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKyAgICB2aXNpdF90eXBlXyUobmFtZSlzX2ZpZWxkcyhtLCBvYmosICZlcnIpOworJycnLAorICAgICAgICAgICAgbmFtZT1uYW1lKQorCisgICAgcG9wX2luZGVudCgpCisKKyAgICBpZiBub3QgZGlzY3JpbWluYXRvcjoKKyAgICAgICAgZGVzY190eXBlID0gInR5cGUiCisgICAgZWxzZToKKyAgICAgICAgZGVzY190eXBlID0gZGlzY3JpbWluYXRvcgorICAgIHJldCArPSBtY2dlbignJycKKyAgICAgICAgdmlzaXRfdHlwZV8lKG5hbWUpc0tpbmQobSwgJigqb2JqKS0+a2luZCwgIiUodHlwZSlzIiwgJmVycik7CisgICAgICAgIGlmICghZXJyKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCgqb2JqKS0+a2luZCkgeworJycnLAorICAgICAgICAgICAgICAgICBuYW1lPW5hbWUsIHR5cGU9ZGVzY190eXBlKQorCisgICAgZm9yIGtleSBpbiBtZW1iZXJzOgorICAgICAgICBpZiBub3QgZGlzY3JpbWluYXRvcjoKKyAgICAgICAgICAgIGZtdCA9ICd2aXNpdF90eXBlXyUoY190eXBlKXMobSwgJigqb2JqKS0+JShjX25hbWUpcywgImRhdGEiLCAmZXJyKTsnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbXQgPSAnJyd2aXNpdF9zdGFydF9pbXBsaWNpdF9zdHJ1Y3QobSwgKHZvaWQqKikgJigqb2JqKS0+JShjX25hbWUpcywgc2l6ZW9mKCUoY190eXBlKXMpLCAmZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWVycikgeworICAgICAgICAgICAgICAgICAgICB2aXNpdF90eXBlXyUoY190eXBlKXNfZmllbGRzKG0sICYoKm9iaiktPiUoY19uYW1lKXMsICZlcnIpOworICAgICAgICAgICAgICAgICAgICBlcnJvcl9wcm9wYWdhdGUoZXJycCwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRfZW5kX2ltcGxpY2l0X3N0cnVjdChtLCAmZXJyKTsKKyAgICAgICAgICAgICAgICB9JycnCisKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgICAgICAgICAgY2FzZSAlKGFiYnJldilzX0tJTkRfJShlbnVtKXM6CisgICAgICAgICAgICAgICAgJycnICsgZm10ICsgJycnCisgICAgICAgICAgICAgICAgYnJlYWs7CisnJycsCisgICAgICAgICAgICAgICAgYWJicmV2ID0gZGVfY2FtZWxfY2FzZShuYW1lKS51cHBlcigpLAorICAgICAgICAgICAgICAgIGVudW0gPSBjX2Z1bihkZV9jYW1lbF9jYXNlKGtleSksRmFsc2UpLnVwcGVyKCksCisgICAgICAgICAgICAgICAgY190eXBlPXR5cGVfbmFtZShtZW1iZXJzW2tleV0pLAorICAgICAgICAgICAgICAgIGNfbmFtZT1jX2Z1bihrZXkpKQorCisgICAgcmV0ICs9IG1jZ2VuKCcnJworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnIpOworICAgICAgICBlcnIgPSBOVUxMOworICAgIH0KKycnJykKKyAgICBwb3BfaW5kZW50KCkKKyAgICByZXQgKz0gbWNnZW4oJycnCisgICAgICAgIC8qIEFsd2F5cyBjYWxsIGVuZF9zdHJ1Y3QgaWYgc3RhcnRfc3RydWN0IHN1Y2NlZWRlZC4gICovCisgICAgICAgIHZpc2l0X2VuZF9zdHJ1Y3QobSwgJmVycik7CisgICAgfQorICAgIGVycm9yX3Byb3BhZ2F0ZShlcnJwLCBlcnIpOworfQorJycnKQorCisgICAgcG9wX2luZGVudCgpOworICAgIHJldCArPSBtY2dlbignJycKK30KKycnJykKKworICAgIHJldHVybiByZXQKKworZGVmIGdlbmVyYXRlX2RlY2xhcmF0aW9uKG5hbWUsIG1lbWJlcnMsIGdlbmxpc3Q9VHJ1ZSwgYnVpbHRpbl90eXBlPUZhbHNlKToKKyAgICByZXQgPSAiIgorICAgIGlmIG5vdCBidWlsdGluX3R5cGU6CisgICAgICAgIHJldCArPSBtY2dlbignJycKKwordm9pZCB2aXNpdF90eXBlXyUobmFtZSlzKFZpc2l0b3IgKm0sICUobmFtZSlzICoqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKycnJywKKyAgICAgICAgICAgICAgICAgICAgbmFtZT1uYW1lKQorCisgICAgaWYgZ2VubGlzdDoKKyAgICAgICAgcmV0ICs9IG1jZ2VuKCcnJwordm9pZCB2aXNpdF90eXBlXyUobmFtZSlzTGlzdChWaXNpdG9yICptLCAlKG5hbWUpc0xpc3QgKiogb2JqLCBjb25zdCBjaGFyICpuYW1lLCBFcnJvciAqKmVycnApOworJycnLAorICAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKKyAgICByZXR1cm4gcmV0CisKK2RlZiBnZW5lcmF0ZV9lbnVtX2RlY2xhcmF0aW9uKG5hbWUsIG1lbWJlcnMsIGdlbmxpc3Q9VHJ1ZSk6CisgICAgcmV0ID0gIiIKKyAgICBpZiBnZW5saXN0OgorICAgICAgICByZXQgKz0gbWNnZW4oJycnCit2b2lkIHZpc2l0X3R5cGVfJShuYW1lKXNMaXN0KFZpc2l0b3IgKm0sICUobmFtZSlzTGlzdCAqKiBvYmosIGNvbnN0IGNoYXIgKm5hbWUsIEVycm9yICoqZXJycCk7CisnJycsCisgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKKyAgICByZXR1cm4gcmV0CisKK2RlZiBnZW5lcmF0ZV9kZWNsX2VudW0obmFtZSwgbWVtYmVycywgZ2VubGlzdD1UcnVlKToKKyAgICByZXR1cm4gbWNnZW4oJycnCisKK3ZvaWQgdmlzaXRfdHlwZV8lKG5hbWUpcyhWaXNpdG9yICptLCAlKG5hbWUpcyAqIG9iaiwgY29uc3QgY2hhciAqbmFtZSwgRXJyb3IgKiplcnJwKTsKKycnJywKKyAgICAgICAgICAgICAgICBuYW1lPW5hbWUpCisKK3RyeToKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdudV9nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiY2hicDpvOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsic291cmNlIiwgImhlYWRlciIsICJidWlsdGlucyIsICJwcmVmaXg9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQtZGlyPSJdKQorZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciwgZXJyOgorICAgIHByaW50IHN0cihlcnIpCisgICAgc3lzLmV4aXQoMSkKKworb3V0cHV0X2RpciA9ICIiCitwcmVmaXggPSAiIgorY19maWxlID0gJ3FhcGktdmlzaXQuYycKK2hfZmlsZSA9ICdxYXBpLXZpc2l0LmgnCisKK2RvX2MgPSBGYWxzZQorZG9faCA9IEZhbHNlCitkb19idWlsdGlucyA9IEZhbHNlCisKK2ZvciBvLCBhIGluIG9wdHM6CisgICAgaWYgbyBpbiAoIi1wIiwgIi0tcHJlZml4Iik6CisgICAgICAgIHByZWZpeCA9IGEKKyAgICBlbGlmIG8gaW4gKCItbyIsICItLW91dHB1dC1kaXIiKToKKyAgICAgICAgb3V0cHV0X2RpciA9IGEgKyAiLyIKKyAgICBlbGlmIG8gaW4gKCItYyIsICItLXNvdXJjZSIpOgorICAgICAgICBkb19jID0gVHJ1ZQorICAgIGVsaWYgbyBpbiAoIi1oIiwgIi0taGVhZGVyIik6CisgICAgICAgIGRvX2ggPSBUcnVlCisgICAgZWxpZiBvIGluICgiLWIiLCAiLS1idWlsdGlucyIpOgorICAgICAgICBkb19idWlsdGlucyA9IFRydWUKKworaWYgbm90IGRvX2MgYW5kIG5vdCBkb19oOgorICAgIGRvX2MgPSBUcnVlCisgICAgZG9faCA9IFRydWUKKworY19maWxlID0gb3V0cHV0X2RpciArIHByZWZpeCArIGNfZmlsZQoraF9maWxlID0gb3V0cHV0X2RpciArIHByZWZpeCArIGhfZmlsZQorCit0cnk6CisgICAgb3MubWFrZWRpcnMob3V0cHV0X2RpcikKK2V4Y2VwdCBvcy5lcnJvciwgZToKKyAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgcmFpc2UKKworZGVmIG1heWJlX29wZW4ocmVhbGx5LCBuYW1lLCBvcHQpOgorICAgIGlmIHJlYWxseToKKyAgICAgICAgcmV0dXJuIG9wZW4obmFtZSwgb3B0KQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBTdHJpbmdJTworICAgICAgICByZXR1cm4gU3RyaW5nSU8uU3RyaW5nSU8oKQorCitmZGVmID0gbWF5YmVfb3Blbihkb19jLCBjX2ZpbGUsICd3JykKK2ZkZWNsID0gbWF5YmVfb3Blbihkb19oLCBoX2ZpbGUsICd3JykKKworZmRlZi53cml0ZShtY2dlbignJycKKy8qIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCwgRE8gTk9UIE1PRElGWSAqLworCisvKgorICogc2NoZW1hLWRlZmluZWQgUUFQSSB2aXNpdG9yIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTEKKyAqCisgKiBBdXRob3JzOgorICogIEFudGhvbnkgTGlndW9yaSAgIDxhbGlndW9yaUB1cy5pYm0uY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMR1BMLCB2ZXJzaW9uIDIuMSBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiJShoZWFkZXIpcyIKKycnJywKKyAgICAgICAgICAgICAgICAgaGVhZGVyPWJhc2VuYW1lKGhfZmlsZSkpKQorCitmZGVjbC53cml0ZShtY2dlbignJycKKy8qIFRISVMgRklMRSBJUyBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCwgRE8gTk9UIE1PRElGWSAqLworCisvKgorICogc2NoZW1hLWRlZmluZWQgUUFQSSB2aXNpdG9yIGZ1bmN0aW9uCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4xIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HLkxJQiBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworCisjaWZuZGVmICUoZ3VhcmQpcworI2RlZmluZSAlKGd1YXJkKXMKKworI2luY2x1ZGUgInFhcGkvdmlzaXRvci5oIgorI2luY2x1ZGUgIiUocHJlZml4KXNxYXBpLXR5cGVzLmgiCisKKycnJywKKyAgICAgICAgICAgICAgICAgIHByZWZpeD1wcmVmaXgsIGd1YXJkPWd1YXJkbmFtZShoX2ZpbGUpKSkKKworZXhwcnMgPSBwYXJzZV9zY2hlbWEoc3lzLnN0ZGluKQorCisjIHRvIGF2b2lkIGhlYWRlciBkZXBlbmRlbmN5IGhlbGwsIHdlIGFsd2F5cyBnZW5lcmF0ZSBkZWNsYXJhdGlvbnMKKyMgZm9yIGJ1aWx0LWluIHR5cGVzIGluIG91ciBoZWFkZXIgZmlsZXMgYW5kIHNpbXBseSBndWFyZCB0aGVtCitmZGVjbC53cml0ZShndWFyZHN0YXJ0KCJRQVBJX1ZJU0lUX0JVSUxUSU5fVklTSVRPUl9ERUNMIikpCitmb3IgdHlwZW5hbWUgaW4gYnVpbHRpbl90eXBlczoKKyAgICBmZGVjbC53cml0ZShnZW5lcmF0ZV9kZWNsYXJhdGlvbih0eXBlbmFtZSwgTm9uZSwgZ2VubGlzdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fdHlwZT1UcnVlKSkKK2ZkZWNsLndyaXRlKGd1YXJkZW5kKCJRQVBJX1ZJU0lUX0JVSUxUSU5fVklTSVRPUl9ERUNMIikpCisKKyMgLi4udGhpcyBkb2Vzbid0IHdvcmsgZm9yIGNhc2VzIHdoZXJlIHdlIGxpbmsgaW4gbXVsdGlwbGUgb2JqZWN0cyB0aGF0CisjIGhhdmUgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkLCBzbyB3ZSB1c2UgLWIgb3B0aW9uIHRvIHByb3ZpZGUgY29udHJvbAorIyBvdmVyIHRoZXNlIGNhc2VzCitpZiBkb19idWlsdGluczoKKyAgICBmZGVmLndyaXRlKGd1YXJkc3RhcnQoIlFBUElfVklTSVRfQlVJTFRJTl9WSVNJVE9SX0RFRiIpKQorICAgIGZvciB0eXBlbmFtZSBpbiBidWlsdGluX3R5cGVzOgorICAgICAgICBmZGVmLndyaXRlKGdlbmVyYXRlX3Zpc2l0X2xpc3QodHlwZW5hbWUsIE5vbmUpKQorICAgIGZkZWYud3JpdGUoZ3VhcmRlbmQoIlFBUElfVklTSVRfQlVJTFRJTl9WSVNJVE9SX0RFRiIpKQorCitmb3IgZXhwciBpbiBleHByczoKKyAgICBpZiBleHByLmhhc19rZXkoJ3R5cGUnKToKKyAgICAgICAgcmV0ID0gZ2VuZXJhdGVfdmlzaXRfc3RydWN0KGV4cHIpCisgICAgICAgIHJldCArPSBnZW5lcmF0ZV92aXNpdF9saXN0KGV4cHJbJ3R5cGUnXSwgZXhwclsnZGF0YSddKQorICAgICAgICBmZGVmLndyaXRlKHJldCkKKworICAgICAgICByZXQgPSBnZW5lcmF0ZV9kZWNsYXJhdGlvbihleHByWyd0eXBlJ10sIGV4cHJbJ2RhdGEnXSkKKyAgICAgICAgZmRlY2wud3JpdGUocmV0KQorICAgIGVsaWYgZXhwci5oYXNfa2V5KCd1bmlvbicpOgorICAgICAgICByZXQgPSBnZW5lcmF0ZV92aXNpdF91bmlvbihleHByKQorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfdmlzaXRfbGlzdChleHByWyd1bmlvbiddLCBleHByWydkYXRhJ10pCisgICAgICAgIGZkZWYud3JpdGUocmV0KQorCisgICAgICAgIHJldCA9IGdlbmVyYXRlX2RlY2xfZW51bSgnJXNLaW5kJyAlIGV4cHJbJ3VuaW9uJ10sIGV4cHJbJ2RhdGEnXS5rZXlzKCkpCisgICAgICAgIHJldCArPSBnZW5lcmF0ZV9kZWNsYXJhdGlvbihleHByWyd1bmlvbiddLCBleHByWydkYXRhJ10pCisgICAgICAgIGZkZWNsLndyaXRlKHJldCkKKyAgICBlbGlmIGV4cHIuaGFzX2tleSgnZW51bScpOgorICAgICAgICByZXQgPSBnZW5lcmF0ZV92aXNpdF9saXN0KGV4cHJbJ2VudW0nXSwgZXhwclsnZGF0YSddKQorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfdmlzaXRfZW51bShleHByWydlbnVtJ10sIGV4cHJbJ2RhdGEnXSkKKyAgICAgICAgZmRlZi53cml0ZShyZXQpCisKKyAgICAgICAgcmV0ID0gZ2VuZXJhdGVfZGVjbF9lbnVtKGV4cHJbJ2VudW0nXSwgZXhwclsnZGF0YSddKQorICAgICAgICByZXQgKz0gZ2VuZXJhdGVfZW51bV9kZWNsYXJhdGlvbihleHByWydlbnVtJ10sIGV4cHJbJ2RhdGEnXSkKKyAgICAgICAgZmRlY2wud3JpdGUocmV0KQorCitmZGVjbC53cml0ZSgnJycKKyNlbmRpZgorJycnKQorCitmZGVjbC5mbHVzaCgpCitmZGVjbC5jbG9zZSgpCisKK2ZkZWYuZmx1c2goKQorZmRlZi5jbG9zZSgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS5weSBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9xYXBpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MGU5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS5weQpAQCAtMCwwICsxLDM3NSBAQAorIworIyBRQVBJIGhlbHBlciBsaWJyYXJ5CisjCisjIENvcHlyaWdodCBJQk0sIENvcnAuIDIwMTEKKyMgQ29weXJpZ2h0IChjKSAyMDEzIFJlZCBIYXQgSW5jLgorIworIyBBdXRob3JzOgorIyAgQW50aG9ueSBMaWd1b3JpIDxhbGlndW9yaUB1cy5pYm0uY29tPgorIyAgTWFya3VzIEFybWJydXN0ZXIgPGFybWJydUByZWRoYXQuY29tPgorIworIyBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMdjIuCisjIFNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKworZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBzeXMKKworYnVpbHRpbl90eXBlcyA9IFsKKyAgICAnc3RyJywgJ2ludCcsICdudW1iZXInLCAnYm9vbCcsCisgICAgJ2ludDgnLCAnaW50MTYnLCAnaW50MzInLCAnaW50NjQnLAorICAgICd1aW50OCcsICd1aW50MTYnLCAndWludDMyJywgJ3VpbnQ2NCcKK10KKworYnVpbHRpbl90eXBlX3F0eXBlcyA9IHsKKyAgICAnc3RyJzogICAgICAnUVRZUEVfUVNUUklORycsCisgICAgJ2ludCc6ICAgICAgJ1FUWVBFX1FJTlQnLAorICAgICdudW1iZXInOiAgICdRVFlQRV9RRkxPQVQnLAorICAgICdib29sJzogICAgICdRVFlQRV9RQk9PTCcsCisgICAgJ2ludDgnOiAgICAgJ1FUWVBFX1FJTlQnLAorICAgICdpbnQxNic6ICAgICdRVFlQRV9RSU5UJywKKyAgICAnaW50MzInOiAgICAnUVRZUEVfUUlOVCcsCisgICAgJ2ludDY0JzogICAgJ1FUWVBFX1FJTlQnLAorICAgICd1aW50OCc6ICAgICdRVFlQRV9RSU5UJywKKyAgICAndWludDE2JzogICAnUVRZUEVfUUlOVCcsCisgICAgJ3VpbnQzMic6ICAgJ1FUWVBFX1FJTlQnLAorICAgICd1aW50NjQnOiAgICdRVFlQRV9RSU5UJywKK30KKworY2xhc3MgUUFQSVNjaGVtYUVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjaGVtYSwgbXNnKToKKyAgICAgICAgc2VsZi5mcCA9IHNjaGVtYS5mcAorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLmxpbmUgPSBzZWxmLmNvbCA9IDEKKyAgICAgICAgZm9yIGNoIGluIHNjaGVtYS5zcmNbMDpzY2hlbWEucG9zXToKKyAgICAgICAgICAgIGlmIGNoID09ICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5saW5lICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLmNvbCA9IDEKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJ1x0JzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbCA9IChzZWxmLmNvbCArIDcpICUgOCArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jb2wgKz0gMQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXM6JXM6JXM6ICVzIiAlIChzZWxmLmZwLm5hbWUsIHNlbGYubGluZSwgc2VsZi5jb2wsIHNlbGYubXNnKQorCitjbGFzcyBRQVBJU2NoZW1hOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwKToKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYuc3JjID0gZnAucmVhZCgpCisgICAgICAgIGlmIHNlbGYuc3JjID09ICcnIG9yIHNlbGYuc3JjWy0xXSAhPSAnXG4nOgorICAgICAgICAgICAgc2VsZi5zcmMgKz0gJ1xuJworICAgICAgICBzZWxmLmN1cnNvciA9IDAKKyAgICAgICAgc2VsZi5leHBycyA9IFtdCisgICAgICAgIHNlbGYuYWNjZXB0KCkKKworICAgICAgICB3aGlsZSBzZWxmLnRvayAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoc2VsZi5nZXRfZXhwcihGYWxzZSkpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc2VsZi50b2sgPSBzZWxmLnNyY1tzZWxmLmN1cnNvcl0KKyAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5jdXJzb3IKKyAgICAgICAgICAgIHNlbGYuY3Vyc29yICs9IDEKKyAgICAgICAgICAgIHNlbGYudmFsID0gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLnRvayA9PSAnIyc6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJzb3IgPSBzZWxmLnNyYy5maW5kKCdcbicsIHNlbGYuY3Vyc29yKQorICAgICAgICAgICAgZWxpZiBzZWxmLnRvayBpbiBbJ3snLCAnfScsICc6JywgJywnLCAnWycsICddJ106CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIHNlbGYudG9rID09ICInIjoKKyAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJworICAgICAgICAgICAgICAgIGVzYyA9IEZhbHNlCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgY2ggPSBzZWxmLnNyY1tzZWxmLmN1cnNvcl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJzb3IgKz0gMQorICAgICAgICAgICAgICAgICAgICBpZiBjaCA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUUFQSVNjaGVtYUVycm9yKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01pc3NpbmcgdGVybWluYXRpbmcgIlwnIicpCisgICAgICAgICAgICAgICAgICAgIGlmIGVzYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaAorICAgICAgICAgICAgICAgICAgICAgICAgZXNjID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjaCA9PSAiXFwiOgorICAgICAgICAgICAgICAgICAgICAgICAgZXNjID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIGNoID09ICInIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsID0gc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaAorICAgICAgICAgICAgZWxpZiBzZWxmLnRvayA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY3Vyc29yID09IGxlbihzZWxmLnNyYyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rID0gTm9uZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgbm90IHNlbGYudG9rLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICByYWlzZSBRQVBJU2NoZW1hRXJyb3Ioc2VsZiwgJ1N0cmF5ICIlcyInICUgc2VsZi50b2spCisKKyAgICBkZWYgZ2V0X21lbWJlcnMoc2VsZik6CisgICAgICAgIGV4cHIgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIGlmIHNlbGYudG9rID09ICd9JzoKKyAgICAgICAgICAgIHNlbGYuYWNjZXB0KCkKKyAgICAgICAgICAgIHJldHVybiBleHByCisgICAgICAgIGlmIHNlbGYudG9rICE9ICInIjoKKyAgICAgICAgICAgIHJhaXNlIFFBUElTY2hlbWFFcnJvcihzZWxmLCAnRXhwZWN0ZWQgc3RyaW5nIG9yICJ9IicpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnZhbAorICAgICAgICAgICAgc2VsZi5hY2NlcHQoKQorICAgICAgICAgICAgaWYgc2VsZi50b2sgIT0gJzonOgorICAgICAgICAgICAgICAgIHJhaXNlIFFBUElTY2hlbWFFcnJvcihzZWxmLCAnRXhwZWN0ZWQgIjoiJykKKyAgICAgICAgICAgIHNlbGYuYWNjZXB0KCkKKyAgICAgICAgICAgIGV4cHJba2V5XSA9IHNlbGYuZ2V0X2V4cHIoVHJ1ZSkKKyAgICAgICAgICAgIGlmIHNlbGYudG9rID09ICd9JzoKKyAgICAgICAgICAgICAgICBzZWxmLmFjY2VwdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHIKKyAgICAgICAgICAgIGlmIHNlbGYudG9rICE9ICcsJzoKKyAgICAgICAgICAgICAgICByYWlzZSBRQVBJU2NoZW1hRXJyb3Ioc2VsZiwgJ0V4cGVjdGVkICIsIiBvciAifSInKQorICAgICAgICAgICAgc2VsZi5hY2NlcHQoKQorICAgICAgICAgICAgaWYgc2VsZi50b2sgIT0gIiciOgorICAgICAgICAgICAgICAgIHJhaXNlIFFBUElTY2hlbWFFcnJvcihzZWxmLCAnRXhwZWN0ZWQgc3RyaW5nJykKKworICAgIGRlZiBnZXRfdmFsdWVzKHNlbGYpOgorICAgICAgICBleHByID0gW10KKyAgICAgICAgaWYgc2VsZi50b2sgPT0gJ10nOgorICAgICAgICAgICAgc2VsZi5hY2NlcHQoKQorICAgICAgICAgICAgcmV0dXJuIGV4cHIKKyAgICAgICAgaWYgbm90IHNlbGYudG9rIGluIFsgJ3snLCAnWycsICInIiBdOgorICAgICAgICAgICAgcmFpc2UgUUFQSVNjaGVtYUVycm9yKHNlbGYsICdFeHBlY3RlZCAieyIsICJbIiwgIl0iIG9yIHN0cmluZycpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBleHByLmFwcGVuZChzZWxmLmdldF9leHByKFRydWUpKQorICAgICAgICAgICAgaWYgc2VsZi50b2sgPT0gJ10nOgorICAgICAgICAgICAgICAgIHNlbGYuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhwcgorICAgICAgICAgICAgaWYgc2VsZi50b2sgIT0gJywnOgorICAgICAgICAgICAgICAgIHJhaXNlIFFBUElTY2hlbWFFcnJvcihzZWxmLCAnRXhwZWN0ZWQgIiwiIG9yICJdIicpCisgICAgICAgICAgICBzZWxmLmFjY2VwdCgpCisKKyAgICBkZWYgZ2V0X2V4cHIoc2VsZiwgbmVzdGVkKToKKyAgICAgICAgaWYgc2VsZi50b2sgIT0gJ3snIGFuZCBub3QgbmVzdGVkOgorICAgICAgICAgICAgcmFpc2UgUUFQSVNjaGVtYUVycm9yKHNlbGYsICdFeHBlY3RlZCAieyInKQorICAgICAgICBpZiBzZWxmLnRvayA9PSAneyc6CisgICAgICAgICAgICBzZWxmLmFjY2VwdCgpCisgICAgICAgICAgICBleHByID0gc2VsZi5nZXRfbWVtYmVycygpCisgICAgICAgIGVsaWYgc2VsZi50b2sgPT0gJ1snOgorICAgICAgICAgICAgc2VsZi5hY2NlcHQoKQorICAgICAgICAgICAgZXhwciA9IHNlbGYuZ2V0X3ZhbHVlcygpCisgICAgICAgIGVsaWYgc2VsZi50b2sgPT0gIiciOgorICAgICAgICAgICAgZXhwciA9IHNlbGYudmFsCisgICAgICAgICAgICBzZWxmLmFjY2VwdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBRQVBJU2NoZW1hRXJyb3Ioc2VsZiwgJ0V4cGVjdGVkICJ7IiwgIlsiIG9yIHN0cmluZycpCisgICAgICAgIHJldHVybiBleHByCisKK2RlZiBwYXJzZV9zY2hlbWEoZnApOgorICAgIHRyeToKKyAgICAgICAgc2NoZW1hID0gUUFQSVNjaGVtYShmcCkKKyAgICBleGNlcHQgUUFQSVNjaGVtYUVycm9yLCBlOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIGUKKyAgICAgICAgZXhpdCgxKQorCisgICAgZXhwcnMgPSBbXQorCisgICAgZm9yIGV4cHIgaW4gc2NoZW1hLmV4cHJzOgorICAgICAgICBpZiBleHByLmhhc19rZXkoJ2VudW0nKToKKyAgICAgICAgICAgIGFkZF9lbnVtKGV4cHJbJ2VudW0nXSkKKyAgICAgICAgZWxpZiBleHByLmhhc19rZXkoJ3VuaW9uJyk6CisgICAgICAgICAgICBhZGRfdW5pb24oZXhwcikKKyAgICAgICAgICAgIGFkZF9lbnVtKCclc0tpbmQnICUgZXhwclsndW5pb24nXSkKKyAgICAgICAgZWxpZiBleHByLmhhc19rZXkoJ3R5cGUnKToKKyAgICAgICAgICAgIGFkZF9zdHJ1Y3QoZXhwcikKKyAgICAgICAgZXhwcnMuYXBwZW5kKGV4cHIpCisKKyAgICByZXR1cm4gZXhwcnMKKworZGVmIHBhcnNlX2FyZ3ModHlwZWluZm8pOgorICAgIGlmIGlzaW5zdGFuY2UodHlwZWluZm8sIGJhc2VzdHJpbmcpOgorICAgICAgICBzdHJ1Y3QgPSBmaW5kX3N0cnVjdCh0eXBlaW5mbykKKyAgICAgICAgYXNzZXJ0IHN0cnVjdCAhPSBOb25lCisgICAgICAgIHR5cGVpbmZvID0gc3RydWN0WydkYXRhJ10KKworICAgIGZvciBtZW1iZXIgaW4gdHlwZWluZm86CisgICAgICAgIGFyZ25hbWUgPSBtZW1iZXIKKyAgICAgICAgYXJnZW50cnkgPSB0eXBlaW5mb1ttZW1iZXJdCisgICAgICAgIG9wdGlvbmFsID0gRmFsc2UKKyAgICAgICAgc3RydWN0dXJlZCA9IEZhbHNlCisgICAgICAgIGlmIG1lbWJlci5zdGFydHN3aXRoKCcqJyk6CisgICAgICAgICAgICBhcmduYW1lID0gbWVtYmVyWzE6XQorICAgICAgICAgICAgb3B0aW9uYWwgPSBUcnVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnZW50cnksIE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIHN0cnVjdHVyZWQgPSBUcnVlCisgICAgICAgIHlpZWxkIChhcmduYW1lLCBhcmdlbnRyeSwgb3B0aW9uYWwsIHN0cnVjdHVyZWQpCisKK2RlZiBkZV9jYW1lbF9jYXNlKG5hbWUpOgorICAgIG5ld19uYW1lID0gJycKKyAgICBmb3IgY2ggaW4gbmFtZToKKyAgICAgICAgaWYgY2guaXN1cHBlcigpIGFuZCBuZXdfbmFtZToKKyAgICAgICAgICAgIG5ld19uYW1lICs9ICdfJworICAgICAgICBpZiBjaCA9PSAnLSc6CisgICAgICAgICAgICBuZXdfbmFtZSArPSAnXycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19uYW1lICs9IGNoLmxvd2VyKCkKKyAgICByZXR1cm4gbmV3X25hbWUKKworZGVmIGNhbWVsX2Nhc2UobmFtZSk6CisgICAgbmV3X25hbWUgPSAnJworICAgIGZpcnN0ID0gVHJ1ZQorICAgIGZvciBjaCBpbiBuYW1lOgorICAgICAgICBpZiBjaCBpbiBbJ18nLCAnLSddOgorICAgICAgICAgICAgZmlyc3QgPSBUcnVlCisgICAgICAgIGVsaWYgZmlyc3Q6CisgICAgICAgICAgICBuZXdfbmFtZSArPSBjaC51cHBlcigpCisgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdfbmFtZSArPSBjaC5sb3dlcigpCisgICAgcmV0dXJuIG5ld19uYW1lCisKK2RlZiBjX3ZhcihuYW1lLCBwcm90ZWN0PVRydWUpOgorICAgICMgQU5TSSBYM0oxMS84OC0wOTAsIDMuMS4xCisgICAgYzg5X3dvcmRzID0gc2V0KFsnYXV0bycsICdicmVhaycsICdjYXNlJywgJ2NoYXInLCAnY29uc3QnLCAnY29udGludWUnLAorICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnLCAnZG8nLCAnZG91YmxlJywgJ2Vsc2UnLCAnZW51bScsICdleHRlcm4nLCAnZmxvYXQnLAorICAgICAgICAgICAgICAgICAgICAgJ2ZvcicsICdnb3RvJywgJ2lmJywgJ2ludCcsICdsb25nJywgJ3JlZ2lzdGVyJywgJ3JldHVybicsCisgICAgICAgICAgICAgICAgICAgICAnc2hvcnQnLCAnc2lnbmVkJywgJ3NpemVvZicsICdzdGF0aWMnLCAnc3RydWN0JywgJ3N3aXRjaCcsCisgICAgICAgICAgICAgICAgICAgICAndHlwZWRlZicsICd1bmlvbicsICd1bnNpZ25lZCcsICd2b2lkJywgJ3ZvbGF0aWxlJywgJ3doaWxlJ10pCisgICAgIyBJU08vSUVDIDk4OTk6MTk5OSwgNi40LjEKKyAgICBjOTlfd29yZHMgPSBzZXQoWydpbmxpbmUnLCAncmVzdHJpY3QnLCAnX0Jvb2wnLCAnX0NvbXBsZXgnLCAnX0ltYWdpbmFyeSddKQorICAgICMgSVNPL0lFQyA5ODk5OjIwMTEsIDYuNC4xCisgICAgYzExX3dvcmRzID0gc2V0KFsnX0FsaWduYXMnLCAnX0FsaWdub2YnLCAnX0F0b21pYycsICdfR2VuZXJpYycsICdfTm9yZXR1cm4nLAorICAgICAgICAgICAgICAgICAgICAgJ19TdGF0aWNfYXNzZXJ0JywgJ19UaHJlYWRfbG9jYWwnXSkKKyAgICAjIEdDQyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC43LjEvZ2NjL0MtRXh0ZW5zaW9ucy5odG1sCisgICAgIyBleGNsdWRpbmcgXy4qCisgICAgZ2NjX3dvcmRzID0gc2V0KFsnYXNtJywgJ3R5cGVvZiddKQorICAgICMgQysrIElTTy9JRUMgMTQ4ODI6MjAwMyAyLjExCisgICAgY3BwX3dvcmRzID0gc2V0KFsnYm9vbCcsICdjYXRjaCcsICdjbGFzcycsICdjb25zdF9jYXN0JywgJ2RlbGV0ZScsCisgICAgICAgICAgICAgICAgICAgICAnZHluYW1pY19jYXN0JywgJ2V4cGxpY2l0JywgJ2ZhbHNlJywgJ2ZyaWVuZCcsICdtdXRhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICduYW1lc3BhY2UnLCAnbmV3JywgJ29wZXJhdG9yJywgJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICdwdWJsaWMnLCAncmVpbnRlcnByZXRfY2FzdCcsICdzdGF0aWNfY2FzdCcsICd0ZW1wbGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAndGhpcycsICd0aHJvdycsICd0cnVlJywgJ3RyeScsICd0eXBlaWQnLCAndHlwZW5hbWUnLAorICAgICAgICAgICAgICAgICAgICAgJ3VzaW5nJywgJ3ZpcnR1YWwnLCAnd2NoYXJfdCcsCisgICAgICAgICAgICAgICAgICAgICAjIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgJ2FuZCcsICdhbmRfZXEnLCAnYml0YW5kJywgJ2JpdG9yJywgJ2NvbXBsJywgJ25vdCcsCisgICAgICAgICAgICAgICAgICAgICAnbm90X2VxJywgJ29yJywgJ29yX2VxJywgJ3hvcicsICd4b3JfZXEnXSkKKyAgICAjIG5hbWVzcGFjZSBwb2xsdXRpb246CisgICAgcG9sbHV0ZWRfd29yZHMgPSBzZXQoWyd1bml4J10pCisgICAgaWYgcHJvdGVjdCBhbmQgKG5hbWUgaW4gYzg5X3dvcmRzIHwgYzk5X3dvcmRzIHwgYzExX3dvcmRzIHwgZ2NjX3dvcmRzIHwgY3BwX3dvcmRzIHwgcG9sbHV0ZWRfd29yZHMpOgorICAgICAgICByZXR1cm4gInFfIiArIG5hbWUKKyAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywgJ18nKS5sc3RyaXAoIioiKQorCitkZWYgY19mdW4obmFtZSwgcHJvdGVjdD1UcnVlKToKKyAgICByZXR1cm4gY192YXIobmFtZSwgcHJvdGVjdCkucmVwbGFjZSgnLicsICdfJykKKworZGVmIGNfbGlzdF90eXBlKG5hbWUpOgorICAgIHJldHVybiAnJXNMaXN0JyAlIG5hbWUKKworZGVmIHR5cGVfbmFtZShuYW1lKToKKyAgICBpZiB0eXBlKG5hbWUpID09IGxpc3Q6CisgICAgICAgIHJldHVybiBjX2xpc3RfdHlwZShuYW1lWzBdKQorICAgIHJldHVybiBuYW1lCisKK2VudW1fdHlwZXMgPSBbXQorc3RydWN0X3R5cGVzID0gW10KK3VuaW9uX3R5cGVzID0gW10KKworZGVmIGFkZF9zdHJ1Y3QoZGVmaW5pdGlvbik6CisgICAgZ2xvYmFsIHN0cnVjdF90eXBlcworICAgIHN0cnVjdF90eXBlcy5hcHBlbmQoZGVmaW5pdGlvbikKKworZGVmIGZpbmRfc3RydWN0KG5hbWUpOgorICAgIGdsb2JhbCBzdHJ1Y3RfdHlwZXMKKyAgICBmb3Igc3RydWN0IGluIHN0cnVjdF90eXBlczoKKyAgICAgICAgaWYgc3RydWN0Wyd0eXBlJ10gPT0gbmFtZToKKyAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QKKyAgICByZXR1cm4gTm9uZQorCitkZWYgYWRkX3VuaW9uKGRlZmluaXRpb24pOgorICAgIGdsb2JhbCB1bmlvbl90eXBlcworICAgIHVuaW9uX3R5cGVzLmFwcGVuZChkZWZpbml0aW9uKQorCitkZWYgZmluZF91bmlvbihuYW1lKToKKyAgICBnbG9iYWwgdW5pb25fdHlwZXMKKyAgICBmb3IgdW5pb24gaW4gdW5pb25fdHlwZXM6CisgICAgICAgIGlmIHVuaW9uWyd1bmlvbiddID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gdW5pb24KKyAgICByZXR1cm4gTm9uZQorCitkZWYgYWRkX2VudW0obmFtZSk6CisgICAgZ2xvYmFsIGVudW1fdHlwZXMKKyAgICBlbnVtX3R5cGVzLmFwcGVuZChuYW1lKQorCitkZWYgaXNfZW51bShuYW1lKToKKyAgICBnbG9iYWwgZW51bV90eXBlcworICAgIHJldHVybiAobmFtZSBpbiBlbnVtX3R5cGVzKQorCitkZWYgY190eXBlKG5hbWUpOgorICAgIGlmIG5hbWUgPT0gJ3N0cic6CisgICAgICAgIHJldHVybiAnY2hhciAqJworICAgIGVsaWYgbmFtZSA9PSAnaW50JzoKKyAgICAgICAgcmV0dXJuICdpbnQ2NF90JworICAgIGVsaWYgKG5hbWUgPT0gJ2ludDgnIG9yIG5hbWUgPT0gJ2ludDE2JyBvciBuYW1lID09ICdpbnQzMicgb3IKKyAgICAgICAgICBuYW1lID09ICdpbnQ2NCcgb3IgbmFtZSA9PSAndWludDgnIG9yIG5hbWUgPT0gJ3VpbnQxNicgb3IKKyAgICAgICAgICBuYW1lID09ICd1aW50MzInIG9yIG5hbWUgPT0gJ3VpbnQ2NCcpOgorICAgICAgICByZXR1cm4gbmFtZSArICdfdCcKKyAgICBlbGlmIG5hbWUgPT0gJ3NpemUnOgorICAgICAgICByZXR1cm4gJ3VpbnQ2NF90JworICAgIGVsaWYgbmFtZSA9PSAnYm9vbCc6CisgICAgICAgIHJldHVybiAnYm9vbCcKKyAgICBlbGlmIG5hbWUgPT0gJ251bWJlcic6CisgICAgICAgIHJldHVybiAnZG91YmxlJworICAgIGVsaWYgdHlwZShuYW1lKSA9PSBsaXN0OgorICAgICAgICByZXR1cm4gJyVzIConICUgY19saXN0X3R5cGUobmFtZVswXSkKKyAgICBlbGlmIGlzX2VudW0obmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lCisgICAgZWxpZiBuYW1lID09IE5vbmUgb3IgbGVuKG5hbWUpID09IDA6CisgICAgICAgIHJldHVybiAndm9pZCcKKyAgICBlbGlmIG5hbWUgPT0gbmFtZS51cHBlcigpOgorICAgICAgICByZXR1cm4gJyVzRXZlbnQgKicgJSBjYW1lbF9jYXNlKG5hbWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICclcyAqJyAlIG5hbWUKKworZGVmIGdlbmluZGVudChjb3VudCk6CisgICAgcmV0ID0gIiIKKyAgICBmb3IgaSBpbiByYW5nZShjb3VudCk6CisgICAgICAgIHJldCArPSAiICIKKyAgICByZXR1cm4gcmV0CisKK2luZGVudF9sZXZlbCA9IDAKKworZGVmIHB1c2hfaW5kZW50KGluZGVudF9hbW91bnQ9NCk6CisgICAgZ2xvYmFsIGluZGVudF9sZXZlbAorICAgIGluZGVudF9sZXZlbCArPSBpbmRlbnRfYW1vdW50CisKK2RlZiBwb3BfaW5kZW50KGluZGVudF9hbW91bnQ9NCk6CisgICAgZ2xvYmFsIGluZGVudF9sZXZlbAorICAgIGluZGVudF9sZXZlbCAtPSBpbmRlbnRfYW1vdW50CisKK2RlZiBjZ2VuKGNvZGUsICoqa3dkcyk6CisgICAgaW5kZW50ID0gZ2VuaW5kZW50KGluZGVudF9sZXZlbCkKKyAgICBsaW5lcyA9IGNvZGUuc3BsaXQoJ1xuJykKKyAgICBsaW5lcyA9IG1hcChsYW1iZGEgeDogaW5kZW50ICsgeCwgbGluZXMpCisgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykgJSBrd2RzICsgJ1xuJworCitkZWYgbWNnZW4oY29kZSwgKiprd2RzKToKKyAgICByZXR1cm4gY2dlbignXG4nLmpvaW4oY29kZS5zcGxpdCgnXG4nKVsxOi0xXSksICoqa3dkcykKKworZGVmIGJhc2VuYW1lKGZpbGVuYW1lKToKKyAgICByZXR1cm4gZmlsZW5hbWUuc3BsaXQoIi8iKVstMV0KKworZGVmIGd1YXJkbmFtZShmaWxlbmFtZSk6CisgICAgZ3VhcmQgPSBiYXNlbmFtZShmaWxlbmFtZSkucnNwbGl0KCIuIiwgMSlbMF0KKyAgICBmb3Igc3Vic3RyIGluIFsiLiIsICIgIiwgIi0iXToKKyAgICAgICAgZ3VhcmQgPSBndWFyZC5yZXBsYWNlKHN1YnN0ciwgIl8iKQorICAgIHJldHVybiBndWFyZC51cHBlcigpICsgJ19IJworCitkZWYgZ3VhcmRzdGFydChuYW1lKToKKyAgICByZXR1cm4gbWNnZW4oJycnCisKKyNpZm5kZWYgJShuYW1lKXMKKyNkZWZpbmUgJShuYW1lKXMKKworJycnLAorICAgICAgICAgICAgICAgICBuYW1lPWd1YXJkbmFtZShuYW1lKSkKKworZGVmIGd1YXJkZW5kKG5hbWUpOgorICAgIHJldHVybiBtY2dlbignJycKKworI2VuZGlmIC8qICUobmFtZSlzICovCisKKycnJywKKyAgICAgICAgICAgICAgICAgbmFtZT1ndWFyZG5hbWUobmFtZSkpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS5weWMgYi9hbmRyb2lkL3FlbXUxL3NjcmlwdHMvcWFwaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2Zjc3NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2NyaXB0cy9xYXBpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvQ09QWVJJR0hUIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL0NPUFlSSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL0NPUFlSSUdIVApAQCAtMCwwICsxLDYxIEBACitTbGlycCB3YXMgd3JpdHRlbiBieSBEYW5ueSBHYXNwYXJvdnNraS4KK0NvcHlyaWdodCAoYyksIDE5OTUsMTk5NiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitTbGlycCBpcyBtYWludGFpbmVkIGJ5IEtlbGx5IFByaWNlIDx0eWdyaXMrc2xpcnBAZXJvbHMuY29tPgorCitTbGlycCBpcyBmcmVlIHNvZnR3YXJlOyAiZnJlZSIgYXMgaW4geW91IGRvbid0IGhhdmUgdG8gcGF5IGZvciBpdCwgYW5kIHlvdQorYXJlIGZyZWUgdG8gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCBpdC4gIEkgZG8gbm90IGFjY2VwdCBhbnkgZG9uYXRpb25zLAorbW9uZXRhcnkgb3Igb3RoZXJ3aXNlLCBmb3IgU2xpcnAuICBJbnN0ZWFkLCBJIHdvdWxkIGFzayB5b3UgdG8gcGFzcyB0aGlzCitwb3RlbnRpYWwgZG9uYXRpb24gdG8geW91ciBmYXZvcml0ZSBjaGFyaXR5LiAgSW4gZmFjdCwgSSBlbmNvdXJhZ2UKKypldmVyeW9uZSogd2hvIGZpbmRzIFNsaXJwIHVzZWZ1bCB0byBtYWtlIGEgc21hbGwgZG9uYXRpb24gdG8gdGhlaXIKK2Zhdm9yaXRlIGNoYXJpdHkgKGZvciBleGFtcGxlLCBHcmVlblBlYWNlKS4gIFRoaXMgaXMgbm90IGEgcmVxdWlyZW1lbnQsIGJ1dAorYSBzdWdnZXN0aW9uIGZyb20gc29tZW9uZSB3aG8gaGlnaGx5IHZhbHVlcyB0aGUgc2VydmljZSB0aGV5IHByb3ZpZGUuCisKK1RoZSBjb3B5cmlnaHQgdGVybXMgYW5kIGNvbmRpdGlvbnM6CisKKy0tLUJFR0lOLS0tCisKKyBDb3B5cmlnaHQgKGMpIDE5OTUsMTk5NiBEYW5ueSBHYXNwYXJvdnNraS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyBhcmUgbWV0OgorIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQorIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCisgREFOTlkgR0FTUEFST1ZTS0kgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCistLS1FTkQtLS0KKworVGhpcyBiYXNpY2FsbHkgbWVhbnMgeW91IGNhbiBkbyBhbnl0aGluZyB5b3Ugd2FudCB3aXRoIHRoZSBzb2Z0d2FyZSwgZXhjZXB0CisxKSBjYWxsIGl0IHlvdXIgb3duLCBhbmQgMikgY2xhaW0gd2FycmFudHkgb24gaXQuICBUaGVyZSBpcyBubyB3YXJyYW50eSBmb3IKK3RoaXMgc29mdHdhcmUuICBOb25lLiAgTmFkYS4gIElmIHlvdSBsb3NlIGEgbWlsbGlvbiBkb2xsYXJzIHdoaWxlIHVzaW5nCitTbGlycCwgdGhhdCdzIHlvdXIgbG9zcyBub3QgbWluZS4gIFNvLCAqKipVU0UgQVQgWU9VUiBPV04gUklTSyEqKiouCisKK0lmIHRoZXNlIGNvbmRpdGlvbnMgY2Fubm90IGJlIG1ldCBkdWUgdG8gbGVnYWwgcmVzdHJpY3Rpb25zIChFLmcuIHdoZXJlIGl0CitpcyBhZ2FpbnN0IHRoZSBsYXcgdG8gZ2l2ZSBvdXQgU29mdHdhcmUgd2l0aG91dCB3YXJyYW50eSksIHlvdSBtdXN0IGNlYXNlCit1c2luZyB0aGUgc29mdHdhcmUgYW5kIGRlbGV0ZSBhbGwgY29waWVzIHlvdSBoYXZlLgorCitTbGlycCB1c2VzIGNvZGUgdGhhdCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgZm9sbG93aW5nIHBlb3BsZS9vcmdhbml6YXRpb25zOgorCitKdWhhIFBpcmtvbGEuCitHcmVnb3J5IE0uIENocmlzdHkuCitUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkuCitUaGUgQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5LgorUlNBIERhdGEgU2VjdXJpdHksIEluYy4KKworUGxlYXNlIHJlYWQgdGhlIHRvcCBvZiBlYWNoIHNvdXJjZSBmaWxlIGZvciB0aGUgZGV0YWlscyBvbiB0aGUgdmFyaW91cworY29weXJpZ2h0cy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9ib290cC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2Jvb3RwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmNzQwZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9ib290cC5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogUUVNVSBCT09UUC9ESENQIHNlcnZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgImhlbHBlci5oIgorCisvKiBYWFg6IG9ubHkgREhDUCBpcyBzdXBwb3J0ZWQgKi8KKworI2RlZmluZSBOQl9BRERSIDE2CisKKyNkZWZpbmUgU1RBUlRfQUREUiAxNQorCisjZGVmaW5lIExFQVNFX1RJTUUgKDI0ICogMzYwMCkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgYWxsb2NhdGVkOworICAgIHVpbnQ4X3QgbWFjYWRkcls2XTsKK30gQk9PVFBDbGllbnQ7CisKK3N0YXRpYyBCT09UUENsaWVudCBib290cF9jbGllbnRzW05CX0FERFJdOworCitjb25zdCBjaGFyICpib290cF9maWxlbmFtZTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmZjMTUzM19jb29raWVbXSA9IHsgUkZDMTUzM19DT09LSUUgfTsKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGYoZm10LCAuLi4pIFwKK2lmIChzbGlycF9kZWJ1ZyAmIERCR19DQUxMKSB7IGZwcmludGYoZGZkLCBmbXQsICMjICBfX1ZBX0FSR1NfXyk7IGZmbHVzaChkZmQpOyB9CisjZWxzZQorI2RlZmluZSBkcHJpbnRmKGZtdCwgLi4uKQorI2VuZGlmCisKK3N0YXRpYyBCT09UUENsaWVudCAqZ2V0X25ld19hZGRyKFNvY2tBZGRyZXNzKiAgcGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptYWNhZGRyKQoreworICAgIEJPT1RQQ2xpZW50ICpiYzsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IE5CX0FERFI7IGkrKykgeworICAgICAgICBiYyA9ICZib290cF9jbGllbnRzW2ldOworICAgICAgICBpZiAoIWJjLT5hbGxvY2F0ZWQgfHwgIW1lbWNtcChtYWNhZGRyLCBiYy0+bWFjYWRkciwgNikpCisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyBmb3VuZDoKKyAgICBiYyA9ICZib290cF9jbGllbnRzW2ldOworICAgIGJjLT5hbGxvY2F0ZWQgPSAxOworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoIHBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfYWRkcl9pcCB8IChpK1NUQVJUX0FERFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1RQX0NMSUVOVCApOworICAgIHJldHVybiBiYzsKK30KKworc3RhdGljIEJPT1RQQ2xpZW50ICpyZXF1ZXN0X2FkZHIoY29uc3QgaXBhZGRyX3QgKnBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFjYWRkcikKK3sKKyAgICB1aW50MzJfdCByZXFfYWRkciAgPSBpcF9nZXRoKCpwYWRkcik7CisgICAgdWludDMyX3Qgc3BlY19hZGRyID0gc3BlY2lhbF9hZGRyX2lwOworICAgIEJPT1RQQ2xpZW50ICpiYzsKKworICAgIGlmIChyZXFfYWRkciA+PSAoc3BlY19hZGRyIHwgU1RBUlRfQUREUikgJiYKKyAgICAgICAgcmVxX2FkZHIgPCAoc3BlY19hZGRyIHwgKE5CX0FERFIgKyBTVEFSVF9BRERSKSkpIHsKKyAgICAgICAgYmMgPSAmYm9vdHBfY2xpZW50c1socmVxX2FkZHIgJiAweGZmKSAtIFNUQVJUX0FERFJdOworICAgICAgICBpZiAoIWJjLT5hbGxvY2F0ZWQgfHwgIW1lbWNtcChtYWNhZGRyLCBiYy0+bWFjYWRkciwgNikpIHsKKyAgICAgICAgICAgIGJjLT5hbGxvY2F0ZWQgPSAxOworICAgICAgICAgICAgcmV0dXJuIGJjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgQk9PVFBDbGllbnQgKmZpbmRfYWRkcihTb2NrQWRkcmVzcyAqcGFkZHIsIGNvbnN0IHVpbnQ4X3QgKm1hY2FkZHIpCit7CisgICAgQk9PVFBDbGllbnQgKmJjOworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgTkJfQUREUjsgaSsrKSB7CisgICAgICAgIGlmICghbWVtY21wKG1hY2FkZHIsIGJvb3RwX2NsaWVudHNbaV0ubWFjYWRkciwgNikpCisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyBmb3VuZDoKKyAgICBiYyA9ICZib290cF9jbGllbnRzW2ldOworICAgIGJjLT5hbGxvY2F0ZWQgPSAxOworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoIHBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfYWRkcl9pcCB8IChpICsgU1RBUlRfQUREUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PVFBfQ0xJRU5UICk7CisgICAgcmV0dXJuIGJjOworfQorCitzdGF0aWMgdm9pZCBkaGNwX2RlY29kZShjb25zdCBzdHJ1Y3QgYm9vdHBfdCAqYnAsIGludCAqcG1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXBhZGRyX3QgKipwcmVxX2FkZHIpCit7CisgICAgY29uc3QgdWludDhfdCAqcCwgKnBfZW5kOworICAgIGludCBsZW4sIHRhZzsKKworICAgICpwbXNnX3R5cGUgPSAwOworICAgICpwcmVxX2FkZHIgPSBOVUxMOworCisgICAgcCA9IGJwLT5icF92ZW5kOworICAgIHBfZW5kID0gcCArIERIQ1BfT1BUX0xFTjsKKyAgICBpZiAobWVtY21wKHAsIHJmYzE1MzNfY29va2llLCA0KSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgcCArPSA0OworICAgIHdoaWxlIChwIDwgcF9lbmQpIHsKKyAgICAgICAgdGFnID0gcFswXTsKKyAgICAgICAgaWYgKHRhZyA9PSBSRkMxNTMzX1BBRCkgeworICAgICAgICAgICAgcCsrOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBSRkMxNTMzX0VORCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBpZiAocCA+PSBwX2VuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGxlbiA9ICpwKys7CisgICAgICAgICAgICBkcHJpbnRmKCJkaGNwOiB0YWc9JWQgbGVuPSVkXG4iLCB0YWcsIGxlbik7CisKKyAgICAgICAgICAgIHN3aXRjaCh0YWcpIHsKKyAgICAgICAgICAgIGNhc2UgUkZDMjEzMl9NU0dfVFlQRToKKyAgICAgICAgICAgICAgICBpZiAobGVuID49IDEpCisgICAgICAgICAgICAgICAgICAgICpwbXNnX3R5cGUgPSBwWzBdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRkMyMTMyX1JFUV9BRERSOgorICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgKnByZXFfYWRkciA9IChjb25zdCBpcGFkZHJfdCAqKXA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCArPSBsZW47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCpwbXNnX3R5cGUgPT0gREhDUFJFUVVFU1QgJiYgISpwcmVxX2FkZHIgJiYgYnAtPmJwX2NpYWRkcikgeworICAgICAgICAqcHJlcV9hZGRyID0gKGNvbnN0IGlwYWRkcl90KikmYnAtPmJwX2NpYWRkcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RwX3JlcGx5KGNvbnN0IHN0cnVjdCBib290cF90ICpicCkKK3sKKyAgICBCT09UUENsaWVudCAqYmMgPSBOVUxMOworICAgIHN0cnVjdCBtYnVmICptOworICAgIHN0cnVjdCBib290cF90ICpyYnA7CisgICAgU29ja0FkZHJlc3MgIHNhZGRyLCBkYWRkcjsKKyAgICB1aW50MzJfdCAgICAgZG5zX2FkZHI7CisgICAgY29uc3QgaXBhZGRyX3QgKnByZXFfYWRkcjsKKyAgICBpbnQgZGhjcF9tc2dfdHlwZSwgdmFsOworICAgIHVpbnQ4X3QgKnE7CisKKyAgICAvKiBleHRyYWN0IGV4YWN0IERIQ1AgbXNnIHR5cGUgKi8KKyAgICBkaGNwX2RlY29kZShicCwgJmRoY3BfbXNnX3R5cGUsICZwcmVxX2FkZHIpOworICAgIGRwcmludGYoImJvb3RwIHBhY2tldCBvcD0lZCBtc2d0eXBlPSVkIiwgYnAtPmJwX29wLCBkaGNwX21zZ190eXBlKTsKKyAgICBpZiAocHJlcV9hZGRyKSB7CisgICAgICAgIGRwcmludGYoIiByZXFfYWRkcj0lMDh4XG4iLCBudG9obCgqKHVpbnQzMl90KilwcmVxX2FkZHIpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBpZiAoZGhjcF9tc2dfdHlwZSA9PSAwKQorICAgICAgICBkaGNwX21zZ190eXBlID0gREhDUFJFUVVFU1Q7IC8qIEZvcmNlIHJlcGx5IGZvciBvbGQgQk9PVFAgY2xpZW50cyAqLworCisgICAgaWYgKGRoY3BfbXNnX3R5cGUgIT0gREhDUERJU0NPVkVSICYmCisgICAgICAgIGRoY3BfbXNnX3R5cGUgIT0gREhDUFJFUVVFU1QpCisgICAgICAgIHJldHVybjsKKyAgICAvKiBYWFg6IHRoaXMgaXMgYSBoYWNrIHRvIGdldCB0aGUgY2xpZW50IG1hYyBhZGRyZXNzICovCisgICAgbWVtY3B5KGNsaWVudF9ldGhhZGRyLCBicC0+YnBfaHdhZGRyLCA2KTsKKworICAgIGlmICgobSA9IG1fZ2V0KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKyAgICByYnAgPSAoc3RydWN0IGJvb3RwX3QgKiltLT5tX2RhdGE7CisgICAgbS0+bV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworICAgIG1lbXNldChyYnAsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfdCkpOworCisgICAgaWYgKGRoY3BfbXNnX3R5cGUgPT0gREhDUERJU0NPVkVSKSB7CisgICAgICAgIGlmIChwcmVxX2FkZHIpIHsKKyAgICAgICAgICAgIGJjID0gcmVxdWVzdF9hZGRyKHByZXFfYWRkciwgY2xpZW50X2V0aGFkZHIpOworICAgICAgICAgICAgaWYgKGJjKSB7CisJCQkJc29ja19hZGRyZXNzX2luaXRfaW5ldCgmZGFkZHIsIGlwX2dldGgoKnByZXFfYWRkciksIEJPT1RQX0NMSUVOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFiYykgeworICAgICAgICAgbmV3X2FkZHI6CisJICAgICAgICBiYyA9IGdldF9uZXdfYWRkcigmZGFkZHIsIGNsaWVudF9ldGhhZGRyKTsKKyAgICAgICAgICAgIGlmICghYmMpIHsKKyAgICAgICAgICAgICAgICBkcHJpbnRmKCJubyBhZGRyZXNzIGxlZnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYmMtPm1hY2FkZHIsIGNsaWVudF9ldGhhZGRyLCA2KTsKKyAgICB9IGVsc2UgaWYgKHByZXFfYWRkcikgeworICAgICAgICBiYyA9IHJlcXVlc3RfYWRkcihwcmVxX2FkZHIsIGNsaWVudF9ldGhhZGRyKTsKKyAgICAgICAgaWYgKGJjKSB7CisJCQlzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KCZkYWRkciwgaXBfZ2V0aCgqcHJlcV9hZGRyKSwgQk9PVFBfQ0xJRU5UKTsKKyAgICAgICAgICAgIG1lbWNweShiYy0+bWFjYWRkciwgY2xpZW50X2V0aGFkZHIsIDYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc29ja19hZGRyZXNzX2luaXRfaW5ldCgmZGFkZHIsIDAsIEJPT1RQX0NMSUVOVCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBiYyA9IGZpbmRfYWRkcigmZGFkZHIsIGJwLT5icF9od2FkZHIpOworICAgICAgICBpZiAoIWJjKSB7CisgICAgICAgICAgICAvKiBpZiBuZXZlciBhc3NpZ25lZCwgYmVoYXZlcyBhcyBpZiBpdCB3YXMgYWxyZWFkeQorICAgICAgICAgICAgICAgYXNzaWduZWQgKHdpbmRvd3MgZml4IGJlY2F1c2UgaXQgcmVtZW1iZXJzIGl0cyBhZGRyZXNzKSAqLworICAgICAgICAgICAgZ290byBuZXdfYWRkcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZzYWRkciwgc3BlY2lhbF9hZGRyX2lwIHwgQ1RMX0FMSUFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1RQX1NFUlZFUiApOworCisgICAgcmJwLT5icF9vcCA9IEJPT1RQX1JFUExZOworICAgIHJicC0+YnBfeGlkID0gYnAtPmJwX3hpZDsKKyAgICByYnAtPmJwX2h0eXBlID0gMTsKKyAgICByYnAtPmJwX2hsZW4gPSA2OworICAgIG1lbWNweShyYnAtPmJwX2h3YWRkciwgYnAtPmJwX2h3YWRkciwgNik7CisKKyAgICByYnAtPmJwX3lpYWRkciA9IGh0b25sKHNvY2tfYWRkcmVzc19nZXRfaXAoJmRhZGRyKSk7IC8qIENsaWVudCBJUCBhZGRyZXNzICovCisgICAgcmJwLT5icF9zaWFkZHIgPSBodG9ubChzb2NrX2FkZHJlc3NfZ2V0X2lwKCZzYWRkcikpOyAvKiBTZXJ2ZXIgSVAgYWRkcmVzcyAqLworCisgICAgcSA9IHJicC0+YnBfdmVuZDsKKyAgICBtZW1jcHkocSwgcmZjMTUzM19jb29raWUsIDQpOworICAgIHEgKz0gNDsKKworICAgIGlmIChiYykgeworICAgICAgICB1aW50MzJfdCAgc2FkZHJfaXAgPSBodG9ubChzb2NrX2FkZHJlc3NfZ2V0X2lwKCZzYWRkcikpOworICAgICAgICBkcHJpbnRmKCIlcyBhZGRyPSUwOHhcbiIsCisgICAgICAgICAgICAgICAgKGRoY3BfbXNnX3R5cGUgPT0gREhDUERJU0NPVkVSKSA/ICJvZmZlcmVkIiA6ICJhY2snZWQiLAorICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19nZXRfaXAoJmRhZGRyKSk7CisKKyAgICAgICAgaWYgKGRoY3BfbXNnX3R5cGUgPT0gREhDUERJU0NPVkVSKSB7CisgICAgICAgICAgICAqcSsrID0gUkZDMjEzMl9NU0dfVFlQRTsKKyAgICAgICAgICAgICpxKysgPSAxOworICAgICAgICAgICAgKnErKyA9IERIQ1BPRkZFUjsKKyAgICAgICAgfSBlbHNlIC8qIERIQ1BSRVFVRVNUICovIHsKKyAgICAgICAgICAgICpxKysgPSBSRkMyMTMyX01TR19UWVBFOworICAgICAgICAgICAgKnErKyA9IDE7CisgICAgICAgICAgICAqcSsrID0gREhDUEFDSzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChib290cF9maWxlbmFtZSkKKyAgICAgICAgICAgIHNucHJpbnRmKChjaGFyICopcmJwLT5icF9maWxlLCBzaXplb2YocmJwLT5icF9maWxlKSwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGJvb3RwX2ZpbGVuYW1lKTsKKworICAgICAgICAqcSsrID0gUkZDMjEzMl9TUlZfSUQ7CisgICAgICAgICpxKysgPSA0OworICAgICAgICBtZW1jcHkocSwgJnNhZGRyX2lwLCA0KTsKKyAgICAgICAgcSArPSA0OworCisgICAgICAgICpxKysgPSBSRkMxNTMzX05FVE1BU0s7CisgICAgICAgICpxKysgPSA0OworICAgICAgICAqcSsrID0gMHhmZjsKKyAgICAgICAgKnErKyA9IDB4ZmY7CisgICAgICAgICpxKysgPSAweGZmOworICAgICAgICAqcSsrID0gMHgwMDsKKworICAgICAgICBpZiAoIXNsaXJwX3Jlc3RyaWN0KSB7CisgICAgICAgICAgICAqcSsrID0gUkZDMTUzM19HQVRFV0FZOworICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICBtZW1jcHkocSwgJnNhZGRyX2lwLCA0KTsKKyAgICAgICAgICAgIHEgKz0gNDsKKworICAgICAgICAgICAgKnErKyA9IFJGQzE1MzNfRE5TOworICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICBkbnNfYWRkciA9IGh0b25sKHNwZWNpYWxfYWRkcl9pcCB8IENUTF9ETlMpOworICAgICAgICAgICAgbWVtY3B5KHEsICZkbnNfYWRkciwgNCk7CisgICAgICAgICAgICBxICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICAqcSsrID0gUkZDMjEzMl9MRUFTRV9USU1FOworICAgICAgICAqcSsrID0gNDsKKyAgICAgICAgdmFsID0gaHRvbmwoTEVBU0VfVElNRSk7CisgICAgICAgIG1lbWNweShxLCAmdmFsLCA0KTsKKyAgICAgICAgcSArPSA0OworCisgICAgICAgIGlmICgqc2xpcnBfaG9zdG5hbWUpIHsKKyAgICAgICAgICAgIHZhbCA9IHN0cmxlbihzbGlycF9ob3N0bmFtZSk7CisgICAgICAgICAgICAqcSsrID0gUkZDMTUzM19IT1NUTkFNRTsKKyAgICAgICAgICAgICpxKysgPSB2YWw7CisgICAgICAgICAgICBtZW1jcHkocSwgc2xpcnBfaG9zdG5hbWUsIHZhbCk7CisgICAgICAgICAgICBxICs9IHZhbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5ha19tc2dbXSA9ICJyZXF1ZXN0ZWQgYWRkcmVzcyBub3QgYXZhaWxhYmxlIjsKKworICAgICAgICBkcHJpbnRmKCJuYWsnZWQgYWRkcj0lMDh4XG4iLCBpcF9nZXRoKCpwcmVxX2FkZHIpKTsKKworICAgICAgICAqcSsrID0gUkZDMjEzMl9NU0dfVFlQRTsKKyAgICAgICAgKnErKyA9IDE7CisgICAgICAgICpxKysgPSBESENQTkFLOworCisgICAgICAgICpxKysgPSBSRkMyMTMyX01FU1NBR0U7CisgICAgICAgICpxKysgPSBzaXplb2YobmFrX21zZykgLSAxOworICAgICAgICBtZW1jcHkocSwgbmFrX21zZywgc2l6ZW9mKG5ha19tc2cpIC0gMSk7CisgICAgICAgIHEgKz0gc2l6ZW9mKG5ha19tc2cpIC0gMTsKKyAgICB9CisgICAgKnErKyA9IFJGQzE1MzNfRU5EOworCisJc29ja19hZGRyZXNzX2luaXRfaW5ldCgmZGFkZHIsIDB4ZmZmZmZmZmZ1LCBCT09UUF9DTElFTlQpOworCisgICAgbS0+bV9sZW4gPSBzaXplb2Yoc3RydWN0IGJvb3RwX3QpIC0KKyAgICAgICAgc2l6ZW9mKHN0cnVjdCBpcCkgLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisgICAgdWRwX291dHB1dDJfKE5VTEwsIG0sICZzYWRkciwgJmRhZGRyLCBJUFRPU19MT1dERUxBWSk7Cit9CisKK3ZvaWQgYm9vdHBfaW5wdXQoc3RydWN0IG1idWYgKm0pCit7CisgICAgc3RydWN0IGJvb3RwX3QgKmJwID0gbXRvZChtLCBzdHJ1Y3QgYm9vdHBfdCAqKTsKKworICAgIGlmIChicC0+YnBfb3AgPT0gQk9PVFBfUkVRVUVTVCkgeworICAgICAgICBib290cF9yZXBseShicCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2Jvb3RwLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvYm9vdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODkwNjZmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2Jvb3RwLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIGJvb3RwL2RoY3AgZGVmaW5lcyAqLworCisjZGVmaW5lIEJPT1RQX1NFUlZFUgk2NworI2RlZmluZSBCT09UUF9DTElFTlQJNjgKKworI2RlZmluZSBCT09UUF9SRVFVRVNUCTEKKyNkZWZpbmUgQk9PVFBfUkVQTFkJMgorCisjZGVmaW5lIFJGQzE1MzNfQ09PS0lFCQk5OSwgMTMwLCA4MywgOTkKKyNkZWZpbmUgUkZDMTUzM19QQUQJCTAKKyNkZWZpbmUgUkZDMTUzM19ORVRNQVNLCQkxCisjZGVmaW5lIFJGQzE1MzNfVElNRU9GRlNFVAkyCisjZGVmaW5lIFJGQzE1MzNfR0FURVdBWQkJMworI2RlZmluZSBSRkMxNTMzX1RJTUVTRVJWRVIJNAorI2RlZmluZSBSRkMxNTMzX0lFTjExNk5TCTUKKyNkZWZpbmUgUkZDMTUzM19ETlMJCTYKKyNkZWZpbmUgUkZDMTUzM19MT0dTRVJWRVIJNworI2RlZmluZSBSRkMxNTMzX0NPT0tJRVNFUlZFUgk4CisjZGVmaW5lIFJGQzE1MzNfTFBSU0VSVkVSCTkKKyNkZWZpbmUgUkZDMTUzM19JTVBSRVNTU0VSVkVSCTEwCisjZGVmaW5lIFJGQzE1MzNfUkVTT1VSQ0VTRVJWRVIJMTEKKyNkZWZpbmUgUkZDMTUzM19IT1NUTkFNRQkxMgorI2RlZmluZSBSRkMxNTMzX0JPT1RGSUxFU0laRQkxMworI2RlZmluZSBSRkMxNTMzX01FUklURFVNUEZJTEUJMTQKKyNkZWZpbmUgUkZDMTUzM19ET01BSU5OQU1FCTE1CisjZGVmaW5lIFJGQzE1MzNfU1dBUFNFUlZFUgkxNgorI2RlZmluZSBSRkMxNTMzX1JPT1RQQVRICTE3CisjZGVmaW5lIFJGQzE1MzNfRVhURU5TSU9OUEFUSAkxOAorI2RlZmluZSBSRkMxNTMzX0lQRk9SV0FSRElORwkxOQorI2RlZmluZSBSRkMxNTMzX0lQU09VUkNFUk9VVElORwkyMAorI2RlZmluZSBSRkMxNTMzX0lQUE9MSUNZRklMVEVSCTIxCisjZGVmaW5lIFJGQzE1MzNfSVBNQVhSRUFTU0VNQkxZCTIyCisjZGVmaW5lIFJGQzE1MzNfSVBUVEwJCTIzCisjZGVmaW5lIFJGQzE1MzNfSVBNVFUJCTI0CisjZGVmaW5lIFJGQzE1MzNfSVBNVFVQTEFURUFVCTI1CisjZGVmaW5lIFJGQzE1MzNfSU5UTVRVCQkyNgorI2RlZmluZSBSRkMxNTMzX0lOVExPQ0FMU1VCTkVUUwkyNworI2RlZmluZSBSRkMxNTMzX0lOVEJST0FEQ0FTVAkyOAorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBESVNDT1ZFUgkyOQorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBSRVNQT05ECTMwCisjZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVESVNDT1ZFUiAzMQorI2RlZmluZSBSRkMxNTMzX0lOVFJPVVRFU09MSUNJVAkzMgorI2RlZmluZSBSRkMxNTMzX0lOVFNUQVRJQ1JPVVRFUwkzMworI2RlZmluZSBSRkMxNTMzX0xMVFJBSUxFUkVOQ0FQCTM0CisjZGVmaW5lIFJGQzE1MzNfTExBUlBDQUNIRVRNTwkzNQorI2RlZmluZSBSRkMxNTMzX0xMRVRIRVJORVRFTkNBUAkzNgorI2RlZmluZSBSRkMxNTMzX1RDUFRUTAkJMzcKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVUTU8JMzgKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVHQgkzOQorI2RlZmluZSBSRkMxNTMzX05JU0RPTUFJTgk0MAorI2RlZmluZSBSRkMxNTMzX05JU1NFUlZFUgk0MQorI2RlZmluZSBSRkMxNTMzX05UUFNFUlZFUgk0MgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUgkJNDMKKyNkZWZpbmUgUkZDMTUzM19OQk5TCQk0NAorI2RlZmluZSBSRkMxNTMzX05CREQJCTQ1CisjZGVmaW5lIFJGQzE1MzNfTkJOVAkJNDYKKyNkZWZpbmUgUkZDMTUzM19OQlNDT1BFCQk0NworI2RlZmluZSBSRkMxNTMzX1hGUwkJNDgKKyNkZWZpbmUgUkZDMTUzM19YRE0JCTQ5CisKKyNkZWZpbmUgUkZDMjEzMl9SRVFfQUREUgk1MAorI2RlZmluZSBSRkMyMTMyX0xFQVNFX1RJTUUgICAgICA1MQorI2RlZmluZSBSRkMyMTMyX01TR19UWVBFCTUzCisjZGVmaW5lIFJGQzIxMzJfU1JWX0lECQk1NAorI2RlZmluZSBSRkMyMTMyX1BBUkFNX0xJU1QJNTUKKyNkZWZpbmUgUkZDMjEzMl9NRVNTQUdFCQk1NgorI2RlZmluZSBSRkMyMTMyX01BWF9TSVpFCTU3CisjZGVmaW5lIFJGQzIxMzJfUkVORVdBTF9USU1FICAgIDU4CisjZGVmaW5lIFJGQzIxMzJfUkVCSU5EX1RJTUUgICAgIDU5CisKKyNkZWZpbmUgREhDUERJU0NPVkVSCQkxCisjZGVmaW5lIERIQ1BPRkZFUgkJMgorI2RlZmluZSBESENQUkVRVUVTVAkJMworI2RlZmluZSBESENQQUNLCQkJNQorI2RlZmluZSBESENQTkFLCQkJNgorCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01BSk9SCTAKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUlOT1IJMAorCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01BR0lDCTEyOAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9BRERQQVJNCTEyOQorI2RlZmluZQlSRkMxNTMzX1ZFTkRPUl9FVEhERVYJMTMwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0hPV1RPICAgIDEzMgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NTlVPUFRTCTE2MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9TRUxFQ1RJT04gMTc2CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01PVEQJMTg0CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX05VTU9GTU9URCA4CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0lNRwkxOTIKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTlVNT0ZJTUcJMTYKKworI2RlZmluZSBSRkMxNTMzX0VORAkJMjU1CisjZGVmaW5lIEJPT1RQX1ZFTkRPUl9MRU4JNjQKKyNkZWZpbmUgREhDUF9PUFRfTEVOCQkzMTIKKworc3RydWN0IGJvb3RwX3QgeworICAgIHN0cnVjdCBpcCBpcDsKKyAgICBzdHJ1Y3QgdWRwaGRyIHVkcDsKKyAgICB1aW50OF90IGJwX29wOworICAgIHVpbnQ4X3QgYnBfaHR5cGU7CisgICAgdWludDhfdCBicF9obGVuOworICAgIHVpbnQ4X3QgYnBfaG9wczsKKyAgICB1aW50MzJfdCBicF94aWQ7CisgICAgdWludDE2X3QgYnBfc2VjczsKKyAgICB1aW50MTZfdCB1bnVzZWQ7CisgICAgdWludDMyX3QgYnBfY2lhZGRyOworICAgIHVpbnQzMl90IGJwX3lpYWRkcjsKKyAgICB1aW50MzJfdCBicF9zaWFkZHI7CisgICAgdWludDMyX3QgYnBfZ2lhZGRyOworICAgIHVpbnQ4X3QgYnBfaHdhZGRyWzE2XTsKKyAgICB1aW50OF90IGJwX3NuYW1lWzY0XTsKKyAgICB1aW50OF90IGJwX2ZpbGVbMTI4XTsKKyAgICB1aW50OF90IGJwX3ZlbmRbREhDUF9PUFRfTEVOXTsKK307CisKK3ZvaWQgYm9vdHBfaW5wdXQoc3RydWN0IG1idWYgKm0pOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2Nrc3VtLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvY2tzdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTFlZWNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2Nrc3VtLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaW5fY2tzdW0uYwk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpbl9ja3N1bS5jLHYgMS4yIDE5OTQvMDgvMDIgMDc6NDg6MTYgZGF2aWRnIEV4cAorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCisvKgorICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKFBvcnRhYmxlIFZlcnNpb24pLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB2ZXJ5IGhlYXZpbHkgdXNlZCBpbiB0aGUgbmV0d29yaworICogY29kZSBhbmQgc2hvdWxkIGJlIG1vZGlmaWVkIGZvciBlYWNoIENQVSB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICoKKyAqIFhYWCBTaW5jZSB3ZSB3aWxsIG5ldmVyIHNwYW4gbW9yZSB0aGFuIDEgbWJ1Ziwgd2UgY2FuIG9wdGltaXNlIHRoaXMKKyAqLworCisjZGVmaW5lIEFERENBUlJZKHgpICAoeCA+IDY1NTM1ID8geCAtPSA2NTUzNSA6IHgpCisjZGVmaW5lIFJFRFVDRSB7bF91dGlsLmwgPSBzdW07IHN1bSA9IGxfdXRpbC5zWzBdICsgbF91dGlsLnNbMV07IEFERENBUlJZKHN1bSk7fQorCitpbnQgY2tzdW0oc3RydWN0IG1idWYgKm0sIGludCBsZW4pCit7CisJcmVnaXN0ZXIgdV9pbnQxNl90ICp3OworCXJlZ2lzdGVyIGludCBzdW0gPSAwOworCXJlZ2lzdGVyIGludCBtbGVuID0gMDsKKwlpbnQgYnl0ZV9zd2FwcGVkID0gMDsKKworCXVuaW9uIHsKKwkJdV9pbnQ4X3QJY1syXTsKKwkJdV9pbnQxNl90CXM7CisJfSBzX3V0aWw7CisJdW5pb24geworCQl1X2ludDE2X3Qgc1syXTsKKwkJdV9pbnQzMl90IGw7CisJfSBsX3V0aWw7CisKKwlpZiAobS0+bV9sZW4gPT0gMCkKKwkgICBnb3RvIGNvbnQ7CisJdyA9IG10b2QobSwgdV9pbnQxNl90ICopOworCisJbWxlbiA9IG0tPm1fbGVuOworCisJaWYgKGxlbiA8IG1sZW4pCisJICAgbWxlbiA9IGxlbjsKKwlsZW4gLT0gbWxlbjsKKwkvKgorCSAqIEZvcmNlIHRvIGV2ZW4gYm91bmRhcnkuCisJICovCisJaWYgKCgxICYgKGludHB0cl90KSB3KSAmJiAobWxlbiA+IDApKSB7CisJCVJFRFVDRTsKKwkJc3VtIDw8PSA4OworCQlzX3V0aWwuY1swXSA9ICoodV9pbnQ4X3QgKil3OworCQl3ID0gKHVfaW50MTZfdCAqKSgoaW50OF90ICopdyArIDEpOworCQltbGVuLS07CisJCWJ5dGVfc3dhcHBlZCA9IDE7CisJfQorCS8qCisJICogVW5yb2xsIHRoZSBsb29wIHRvIG1ha2Ugb3ZlcmhlYWQgZnJvbQorCSAqIGJyYW5jaGVzICZjIHNtYWxsLgorCSAqLworCXdoaWxlICgobWxlbiAtPSAzMikgPj0gMCkgeworCQlzdW0gKz0gd1swXTsgc3VtICs9IHdbMV07IHN1bSArPSB3WzJdOyBzdW0gKz0gd1szXTsKKwkJc3VtICs9IHdbNF07IHN1bSArPSB3WzVdOyBzdW0gKz0gd1s2XTsgc3VtICs9IHdbN107CisJCXN1bSArPSB3WzhdOyBzdW0gKz0gd1s5XTsgc3VtICs9IHdbMTBdOyBzdW0gKz0gd1sxMV07CisJCXN1bSArPSB3WzEyXTsgc3VtICs9IHdbMTNdOyBzdW0gKz0gd1sxNF07IHN1bSArPSB3WzE1XTsKKwkJdyArPSAxNjsKKwl9CisJbWxlbiArPSAzMjsKKwl3aGlsZSAoKG1sZW4gLT0gOCkgPj0gMCkgeworCQlzdW0gKz0gd1swXTsgc3VtICs9IHdbMV07IHN1bSArPSB3WzJdOyBzdW0gKz0gd1szXTsKKwkJdyArPSA0OworCX0KKwltbGVuICs9IDg7CisJaWYgKG1sZW4gPT0gMCAmJiBieXRlX3N3YXBwZWQgPT0gMCkKKwkgICBnb3RvIGNvbnQ7CisJUkVEVUNFOworCXdoaWxlICgobWxlbiAtPSAyKSA+PSAwKSB7CisJCXN1bSArPSAqdysrOworCX0KKworCWlmIChieXRlX3N3YXBwZWQpIHsKKwkJUkVEVUNFOworCQlzdW0gPDw9IDg7CisJCWJ5dGVfc3dhcHBlZCA9IDA7CisJCWlmIChtbGVuID09IC0xKSB7CisJCQlzX3V0aWwuY1sxXSA9ICoodV9pbnQ4X3QgKil3OworCQkJc3VtICs9IHNfdXRpbC5zOworCQkJbWxlbiA9IDA7CisJCX0gZWxzZQorCisJCSAgIG1sZW4gPSAtMTsKKwl9IGVsc2UgaWYgKG1sZW4gPT0gLTEpCisJICAgc191dGlsLmNbMF0gPSAqKHVfaW50OF90ICopdzsKKworY29udDoKKyNpZmRlZiBERUJVRworCWlmIChsZW4pIHsKKwkJREVCVUdfRVJST1IoKGRmZCwgImNrc3VtOiBvdXQgb2YgZGF0YVxuIikpOworCQlERUJVR19FUlJPUigoZGZkLCAiIGxlbiA9ICVkXG4iLCBsZW4pKTsKKwl9CisjZW5kaWYKKwlpZiAobWxlbiA9PSAtMSkgeworCQkvKiBUaGUgbGFzdCBtYnVmIGhhcyBvZGQgIyBvZiBieXRlcy4gRm9sbG93IHRoZQorCQkgc3RhbmRhcmQgKHRoZSBvZGQgYnl0ZSBtYXkgYmUgc2hpZnRlZCBsZWZ0IGJ5IDggYml0cworCQkJICAgb3Igbm90IGFzIGRldGVybWluZWQgYnkgZW5kaWFuLW5lc3Mgb2YgdGhlIG1hY2hpbmUpICovCisJCXNfdXRpbC5jWzFdID0gMDsKKwkJc3VtICs9IHNfdXRpbC5zOworCX0KKwlSRURVQ0U7CisJcmV0dXJuICh+c3VtICYgMHhmZmZmKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9jdGwuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTRhZTlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2N0bC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNkZWZpbmUgQ1RMX0NNRAkJMAorI2RlZmluZSBDVExfRVhFQwkxCisjZGVmaW5lIENUTF9BTElBUwkyCisjZGVmaW5lIENUTF9ETlMJCTMKKy8qIE5PVEU6IEROU19BRERSX01BWCBhZGRyZXNzZXMsIHN0YXJ0aW5nIGZyb20gQ1RMX0ROUywgYXJlIHJlc2VydmVkICovCisKKyNkZWZpbmUgQ1RMX0lTX0ROUyh4KSAgICgodW5zaWduZWQpKCh4KS1DVExfRE5TKSA8ICh1bnNpZ25lZClkbnNfYWRkcl9jb3VudCkKKworI2RlZmluZSBDVExfU1BFQ0lBTAkiMTAuMC4yLjAiCisjZGVmaW5lIENUTF9MT0NBTAkiMTAuMC4yLjE1IgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2RlYnVnLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFjZjk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2RlYnVnLmMKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKiBQb3J0aW9ucyBjb3B5cmlnaHQgKGMpIDIwMDAgS2VsbHkgUHJpY2UuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2lwYWRkci5oIgorCitGSUxFICpkZmQgPSBOVUxMOworI2lmZGVmIERFQlVHCitpbnQgZG9zdGF0cyA9IDE7CisjZWxzZQoraW50IGRvc3RhdHMgPSAwOworI2VuZGlmCitpbnQgc2xpcnBfZGVidWcgPSAwOworCitleHRlcm4gY2hhciAqc3RyZXJyb3IgX1AoKGludCkpOworCisvKiBDYXJyeSBvdmVyIG9uZSBpdGVtIGZyb20gbWFpbi5jIHNvIHRoYXQgdGhlIHR0eSdzIHJlc3RvcmVkLgorICogT25seSBkb25lIHdoZW4gdGhlIHR0eSBiZWluZyB1c2VkIGlzIC9kZXYvdHR5IC0tUmVkV29sZiAqLworZXh0ZXJuIHN0cnVjdCB0ZXJtaW9zIHNsaXJwX3R0eV9zZXR0aW5nczsKK2V4dGVybiBpbnQgc2xpcnBfdHR5X3Jlc3RvcmU7CisKKwordm9pZAorZGVidWdfaW5pdChmaWxlLCBkYmcpCisJY2hhciAqZmlsZTsKKwlpbnQgZGJnOworeworCS8qIENsb3NlIHRoZSBvbGQgZGVidWdnaW5nIGZpbGUgKi8KKwlpZiAoZGZkKQorCSAgIGZjbG9zZShkZmQpOworCisJZGZkID0gZm9wZW4oZmlsZSwidyIpOworCWlmIChkZmQgIT0gTlVMTCkgeworI2lmIDAKKwkJZnByaW50ZihkZmQsIlNsaXJwICVzIC0gRGVidWdnaW5nIFN0YXJ0ZWQuXG4iLCBTTElSUF9WRVJTSU9OKTsKKyNlbmRpZgorCQlmcHJpbnRmKGRmZCwiRGVidWdnaW5nIFN0YXJ0ZWQgbGV2ZWwgJWkuXHJcbiIsZGJnKTsKKwkJZmZsdXNoKGRmZCk7CisJCXNsaXJwX2RlYnVnID0gZGJnOworCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IERlYnVnZ2luZyBmaWxlIFwiJXNcIiBjb3VsZCBub3QgYmUgb3BlbmVkOiAlc1xyXG4iLAorCQkJZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKKy8qCisgKiBEdW1wIGEgcGFja2V0IGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0Y3BkdW1wIC14CisgKi8KKyNpZmRlZiBERUJVRwordm9pZAorZHVtcF9wYWNrZXQoZGF0LCBuKQorCXZvaWQgKmRhdDsKKwlpbnQgbjsKK3sKKwl1X2NoYXIgKnBwdHIgPSAodV9jaGFyICopZGF0OworCWludCBqLGs7CisKKwluIC89IDE2OworCW4rKzsKKwlERUJVR19NSVNDKChkZmQsICJQQUNLRVQgRFVNUEVEOiBcbiIpKTsKKwlmb3IoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJZm9yKGsgPSAwOyBrIDwgNjsgaysrKQorCQkJREVCVUdfTUlTQygoZGZkLCAiJTAyeCAiLCAqcHB0cisrKSk7CisJCURFQlVHX01JU0MoKGRmZCwgIlxuIikpOworCQlmZmx1c2goZGZkKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIDAKKy8qCisgKiBTdGF0aXN0aWMgcm91dGluZXMKKyAqCisgKiBUaGVzZSB3aWxsIHByaW50IHN0YXRpc3RpY3MgdG8gdGhlIHNjcmVlbiwgdGhlIGRlYnVnIGZpbGUgKGRmZCksIG9yCisgKiBhIGJ1ZmZlciwgZGVwZW5kaW5nIG9uICJ0eXBlIiwgc28gdGhhdCB0aGUgc3RhdHMgY2FuIGJlIHNlbnQgb3ZlcgorICogdGhlIGxpbmsgYXMgd2VsbC4KKyAqLworCitzdGF0aWMgdm9pZAordHR5c3RhdHModHR5cCkKKwlzdHJ1Y3QgdHR5cyAqdHR5cDsKK3sKKwlzdHJ1Y3Qgc2xpcnBfaWZzdGF0cyAqaXMgPSAmdHR5cC0+aWZzdGF0czsKKwljaGFyIGJ1ZmZbNTEyXTsKKworCWxwcmludCgiIFxyXG4iKTsKKworCWlmIChJRl9DT01QICYgSUZfQ09NUFJFU1MpCisJICAgc3RyY3B5KGJ1ZmYsICJvbiIpOworCWVsc2UgaWYgKElGX0NPTVAgJiBJRl9OT0NPTVBSRVNTKQorCSAgIHN0cmNweShidWZmLCAib2ZmIik7CisJZWxzZQorCSAgIHN0cmNweShidWZmLCAib2ZmIChmb3Igbm93KSIpOworCWxwcmludCgiVW5pdCAlZDpcclxuIiwgdHR5cC0+dW5pdCk7CisJbHByaW50KCIgIHVzaW5nICVzIGVuY2Fwc3VsYXRpb24gKFZKIGNvbXByZXNzaW9uIGlzICVzKVxyXG4iLCAoCisjaWZkZWYgVVNFX1BQUAorCSAgICAgICB0dHlwLT5wcm90bz09UFJPVE9fUFBQPyJQUFAiOgorI2VuZGlmCisJICAgICAgICJTTElQIiksIGJ1ZmYpOworCWxwcmludCgiICAlZCBiYXVkcmF0ZVxyXG4iLCB0dHlwLT5iYXVkKTsKKwlscHJpbnQoIiAgaW50ZXJmYWNlIGlzICVzXHJcbiIsIHR0eXAtPnVwPyJ1cCI6ImRvd24iKTsKKwlscHJpbnQoIiAgdXNpbmcgZmQgJWQsIGd1YXJkaWFuIHBpZCBpcyAlZFxyXG4iLCB0dHlwLT5mZCwgdHR5cC0+cGlkKTsKKyNpZm5kZWYgRlVMTF9CT0xUCisJbHByaW50KCIgIHRvd3JpdGUgaXMgJWQgYnl0ZXNcclxuIiwgdHR5cC0+dG93cml0ZSk7CisjZW5kaWYKKwlpZiAodHR5cC0+emVyb3MpCisJICAgbHByaW50KCIgICVkIHplcm9zIGhhdmUgYmVlbiB0eXBlZFxyXG4iLCB0dHlwLT56ZXJvcyk7CisJZWxzZSBpZiAodHR5cC0+b25lcykKKwkgICBscHJpbnQoIiAgJWQgb25lcyBoYXZlIGJlZW4gdHlwZWRcclxuIiwgdHR5cC0+b25lcyk7CisJbHByaW50KCJJbnRlcmZhY2Ugc3RhdHM6XHJcbiIpOworCWxwcmludCgiICAlNmQgb3V0cHV0IHBhY2tldHMgc2VudCAoJWQgYnl0ZXMpXHJcbiIsIGlzLT5vdXRfcGt0cywgaXMtPm91dF9ieXRlcyk7CisJbHByaW50KCIgICU2ZCBvdXRwdXQgcGFja2V0cyBkcm9wcGVkICglZCBieXRlcylcclxuIiwgaXMtPm91dF9lcnJwa3RzLCBpcy0+b3V0X2VycmJ5dGVzKTsKKwlscHJpbnQoIiAgJTZkIGlucHV0IHBhY2tldHMgcmVjZWl2ZWQgKCVkIGJ5dGVzKVxyXG4iLCBpcy0+aW5fcGt0cywgaXMtPmluX2J5dGVzKTsKKwlscHJpbnQoIiAgJTZkIGlucHV0IHBhY2tldHMgZHJvcHBlZCAoJWQgYnl0ZXMpXHJcbiIsIGlzLT5pbl9lcnJwa3RzLCBpcy0+aW5fZXJyYnl0ZXMpOworCWxwcmludCgiICAlNmQgYmFkIGlucHV0IHBhY2tldHNcclxuIiwgaXMtPmluX21iYWQpOworfQorCitzdGF0aWMgdm9pZAorYWxsdHR5c3RhdHModm9pZCkKK3sKKwlzdHJ1Y3QgdHR5cyAqdHR5cDsKKworCWZvciAodHR5cCA9IHR0eXM7IHR0eXA7IHR0eXAgPSB0dHlwLT5uZXh0KQorCSAgIHR0eXN0YXRzKHR0eXApOworfQorCitzdGF0aWMgdm9pZAoraXBzdGF0cyh2b2lkKQoreworCWxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgiSVAgc3RhdHM6XHJcbiIpOworCWxwcmludCgiICAlNmQgdG90YWwgcGFja2V0cyByZWNlaXZlZCAoJWQgd2VyZSB1bmFsaWduZWQpXHJcbiIsCisJCQlpcHN0YXQuaXBzX3RvdGFsLCBpcHN0YXQuaXBzX3VuYWxpZ25lZCk7CisJbHByaW50KCIgICU2ZCB3aXRoIGluY29ycmVjdCB2ZXJzaW9uXHJcbiIsIGlwc3RhdC5pcHNfYmFkdmVycyk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBoZWFkZXIgY2hlY2tzdW1cclxuIiwgaXBzdGF0Lmlwc19iYWRzdW0pOworCWxwcmludCgiICAlNmQgd2l0aCBsZW5ndGggdG9vIHNob3J0IChsZW4gPCBzaXplb2YoaXBoZHIpKVxyXG4iLCBpcHN0YXQuaXBzX3Rvb3Nob3J0KTsKKwlscHJpbnQoIiAgJTZkIHdpdGggbGVuZ3RoIHRvbyBzbWFsbCAobGVuIDwgaXAtPmxlbilcclxuIiwgaXBzdGF0Lmlwc190b29zbWFsbCk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBoZWFkZXIgbGVuZ3RoXHJcbiIsIGlwc3RhdC5pcHNfYmFkaGxlbik7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBwYWNrZXQgbGVuZ3RoXHJcbiIsIGlwc3RhdC5pcHNfYmFkbGVuKTsKKwlscHJpbnQoIiAgJTZkIGZyYWdtZW50cyByZWNlaXZlZFxyXG4iLCBpcHN0YXQuaXBzX2ZyYWdtZW50cyk7CisJbHByaW50KCIgICU2ZCBmcmFnbWVudHMgZHJvcHBlZFxyXG4iLCBpcHN0YXQuaXBzX2ZyYWdkcm9wcGVkKTsKKwlscHJpbnQoIiAgJTZkIGZyYWdtZW50cyB0aW1lZCBvdXRcclxuIiwgaXBzdGF0Lmlwc19mcmFndGltZW91dCk7CisJbHByaW50KCIgICU2ZCBwYWNrZXRzIHJlYXNzZW1ibGVkIG9rXHJcbiIsIGlwc3RhdC5pcHNfcmVhc3NlbWJsZWQpOworCWxwcmludCgiICAlNmQgb3V0Z29pbmcgcGFja2V0cyBmcmFnbWVudGVkXHJcbiIsIGlwc3RhdC5pcHNfZnJhZ21lbnRlZCk7CisJbHByaW50KCIgICU2ZCB0b3RhbCBvdXRnb2luZyBmcmFnbWVudHNcclxuIiwgaXBzdGF0Lmlwc19vZnJhZ21lbnRzKTsKKwlscHJpbnQoIiAgJTZkIHdpdGggYmFkIHByb3RvY29sIGZpZWxkXHJcbiIsIGlwc3RhdC5pcHNfbm9wcm90byk7CisJbHByaW50KCIgICU2ZCB0b3RhbCBwYWNrZXRzIGRlbGl2ZXJlZFxyXG4iLCBpcHN0YXQuaXBzX2RlbGl2ZXJlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit2anN0YXRzKHZvaWQpCit7CisJbHByaW50KCIgXHJcbiIpOworCisJbHByaW50KCJWSiBjb21wcmVzc2lvbiBzdGF0czpcclxuIik7CisKKwlscHJpbnQoIiAgJTZkIG91dGJvdW5kIHBhY2tldHMgKCVkIGNvbXByZXNzZWQpXHJcbiIsCisJICAgICAgIGNvbXBfcy5zbHNfcGFja2V0cywgY29tcF9zLnNsc19jb21wcmVzc2VkKTsKKwlscHJpbnQoIiAgJTZkIHNlYXJjaGVzIGZvciBjb25uZWN0aW9uIHN0YXRzICglZCBtaXNzZXMpXHJcbiIsCisJICAgICAgIGNvbXBfcy5zbHNfc2VhcmNoZXMsIGNvbXBfcy5zbHNfbWlzc2VzKTsKKwlscHJpbnQoIiAgJTZkIGluYm91bmQgdW5jb21wcmVzc2VkIHBhY2tldHNcclxuIiwgY29tcF9zLnNsc191bmNvbXByZXNzZWRpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0c1xyXG4iLCBjb21wX3Muc2xzX2NvbXByZXNzZWRpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIHVua25vd24gdHlwZSBwYWNrZXRzXHJcbiIsIGNvbXBfcy5zbHNfZXJyb3Jpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIHBhY2tldHMgdG9zc2VkIGR1ZSB0byBlcnJvclxyXG4iLCBjb21wX3Muc2xzX3Rvc3NlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit0Y3BzdGF0cyh2b2lkKQoreworCWxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgiVENQIHN0YXRzOlxyXG4iKTsKKworCWxwcmludCgiICAlNmQgcGFja2V0cyBzZW50XHJcbiIsIHRjcHN0YXQudGNwc19zbmR0b3RhbCk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGRhdGEgcGFja2V0cyAoJWQgYnl0ZXMpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfc25kcGFjaywgdGNwc3RhdC50Y3BzX3NuZGJ5dGUpOworCWxwcmludCgiICAgICAgICAgICU2ZCBkYXRhIHBhY2tldHMgcmV0cmFuc21pdHRlZCAoJWQgYnl0ZXMpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfc25kcmV4bWl0cGFjaywgdGNwc3RhdC50Y3BzX3NuZHJleG1pdGJ5dGUpOworCWxwcmludCgiICAgICAgICAgICU2ZCBhY2stb25seSBwYWNrZXRzICglZCBkZWxheWVkKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3NuZGFja3MsIHRjcHN0YXQudGNwc19kZWxhY2spOworCWxwcmludCgiICAgICAgICAgICU2ZCBVUkcgb25seSBwYWNrZXRzXHJcbiIsIHRjcHN0YXQudGNwc19zbmR1cmcpOworCWxwcmludCgiICAgICAgICAgICU2ZCB3aW5kb3cgcHJvYmUgcGFja2V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfc25kcHJvYmUpOworCWxwcmludCgiICAgICAgICAgICU2ZCB3aW5kb3cgdXBkYXRlIHBhY2tldHNcclxuIiwgdGNwc3RhdC50Y3BzX3NuZHdpbnVwKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgY29udHJvbCAoU1lOL0ZJTi9SU1QpIHBhY2tldHNcclxuIiwgdGNwc3RhdC50Y3BzX3NuZGN0cmwpOworCWxwcmludCgiICAgICAgICAgICU2ZCB0aW1lcyB0Y3Bfb3V0cHV0IGRpZCBub3RoaW5nXHJcbiIsIHRjcHN0YXQudGNwc19kaWRudXR0aW4pOworCisJbHByaW50KCIgICU2ZCBwYWNrZXRzIHJlY2VpdmVkXHJcbiIsIHRjcHN0YXQudGNwc19yY3Z0b3RhbCk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGFja3MgKGZvciAlZCBieXRlcylcclxuIiwKKwkJCXRjcHN0YXQudGNwc19yY3ZhY2twYWNrLCB0Y3BzdGF0LnRjcHNfcmN2YWNrYnl0ZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGR1cGxpY2F0ZSBhY2tzXHJcbiIsIHRjcHN0YXQudGNwc19yY3ZkdXBhY2spOworCWxwcmludCgiICAgICAgICAgICU2ZCBhY2tzIGZvciB1bnNlbnQgZGF0YVxyXG4iLCB0Y3BzdGF0LnRjcHNfcmN2YWNrdG9vbXVjaCk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHBhY2tldHMgcmVjZWl2ZWQgaW4gc2VxdWVuY2UgKCVkIGJ5dGVzKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3JjdnBhY2ssIHRjcHN0YXQudGNwc19yY3ZieXRlKTsKKyAgICAgICAgbHByaW50KCIgICAgICAgICAgJTZkIGNvbXBsZXRlbHkgZHVwbGljYXRlIHBhY2tldHMgKCVkIGJ5dGVzKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3JjdmR1cHBhY2ssIHRjcHN0YXQudGNwc19yY3ZkdXBieXRlKTsKKworCWxwcmludCgiICAgICAgICAgICU2ZCBwYWNrZXRzIHdpdGggc29tZSBkdXBsaWNhdGUgZGF0YSAoJWQgYnl0ZXMgZHVwZWQpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfcmN2cGFydGR1cHBhY2ssIHRjcHN0YXQudGNwc19yY3ZwYXJ0ZHVwYnl0ZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIG91dC1vZi1vcmRlciBwYWNrZXRzICglZCBieXRlcylcclxuIiwKKwkJCXRjcHN0YXQudGNwc19yY3Zvb3BhY2ssIHRjcHN0YXQudGNwc19yY3Zvb2J5dGUpOworCWxwcmludCgiICAgICAgICAgICU2ZCBwYWNrZXRzIG9mIGRhdGEgYWZ0ZXIgd2luZG93ICglZCBieXRlcylcclxuIiwKKwkJCXRjcHN0YXQudGNwc19yY3ZwYWNrYWZ0ZXJ3aW4sIHRjcHN0YXQudGNwc19yY3ZieXRlYWZ0ZXJ3aW4pOworCWxwcmludCgiICAgICAgICAgICU2ZCB3aW5kb3cgcHJvYmVzXHJcbiIsIHRjcHN0YXQudGNwc19yY3Z3aW5wcm9iZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHdpbmRvdyB1cGRhdGUgcGFja2V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfcmN2d2ludXBkKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgcGFja2V0cyByZWNlaXZlZCBhZnRlciBjbG9zZVxyXG4iLCB0Y3BzdGF0LnRjcHNfcmN2YWZ0ZXJjbG9zZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGRpc2NhcmRlZCBmb3IgYmFkIGNoZWNrc3Vtc1xyXG4iLCB0Y3BzdGF0LnRjcHNfcmN2YmFkc3VtKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgZGlzY2FyZGVkIGZvciBiYWQgaGVhZGVyIG9mZnNldCBmaWVsZHNcclxuIiwKKwkJCXRjcHN0YXQudGNwc19yY3ZiYWRvZmYpOworCisJbHByaW50KCIgICU2ZCBjb25uZWN0aW9uIHJlcXVlc3RzXHJcbiIsIHRjcHN0YXQudGNwc19jb25uYXR0ZW1wdCk7CisJbHByaW50KCIgICU2ZCBjb25uZWN0aW9uIGFjY2VwdHNcclxuIiwgdGNwc3RhdC50Y3BzX2FjY2VwdHMpOworCWxwcmludCgiICAlNmQgY29ubmVjdGlvbnMgZXN0YWJsaXNoZWQgKGluY2x1ZGluZyBhY2NlcHRzKVxyXG4iLCB0Y3BzdGF0LnRjcHNfY29ubmVjdHMpOworCWxwcmludCgiICAlNmQgY29ubmVjdGlvbnMgY2xvc2VkIChpbmNsdWRpbmcgJWQgZHJvcClcclxuIiwKKwkJCXRjcHN0YXQudGNwc19jbG9zZWQsIHRjcHN0YXQudGNwc19kcm9wcyk7CisJbHByaW50KCIgICU2ZCBlbWJyeW9uaWMgY29ubmVjdGlvbnMgZHJvcHBlZFxyXG4iLCB0Y3BzdGF0LnRjcHNfY29ubmRyb3BzKTsKKwlscHJpbnQoIiAgJTZkIHNlZ21lbnRzIHdlIHRyaWVkIHRvIGdldCBydHQgKCVkIHN1Y2NlZWRlZClcclxuIiwKKwkJCXRjcHN0YXQudGNwc19zZWdzdGltZWQsIHRjcHN0YXQudGNwc19ydHR1cGRhdGVkKTsKKwlscHJpbnQoIiAgJTZkIHJldHJhbnNtaXQgdGltZW91dHNcclxuIiwgdGNwc3RhdC50Y3BzX3JleG10dGltZW8pOworCWxwcmludCgiICAgICAgICAgICU2ZCBjb25uZWN0aW9ucyBkcm9wcGVkIGJ5IHJ4bXQgdGltZW91dFxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3RpbWVvdXRkcm9wKTsKKwlscHJpbnQoIiAgJTZkIHBlcnNpc3QgdGltZW91dHNcclxuIiwgdGNwc3RhdC50Y3BzX3BlcnNpc3R0aW1lbyk7CisJbHByaW50KCIgICU2ZCBrZWVwYWxpdmUgdGltZW91dHNcclxuIiwgdGNwc3RhdC50Y3BzX2tlZXB0aW1lbyk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGtlZXBhbGl2ZSBwcm9iZXMgc2VudFxyXG4iLCB0Y3BzdGF0LnRjcHNfa2VlcHByb2JlKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgY29ubmVjdGlvbnMgZHJvcHBlZCBieSBrZWVwYWxpdmVcclxuIiwgdGNwc3RhdC50Y3BzX2tlZXBkcm9wcyk7CisJbHByaW50KCIgICU2ZCBjb3JyZWN0IEFDSyBoZWFkZXIgcHJlZGljdGlvbnNcclxuIiwgdGNwc3RhdC50Y3BzX3ByZWRhY2spOworCWxwcmludCgiICAlNmQgY29ycmVjdCBkYXRhIHBhY2tldCBoZWFkZXIgcHJlZGljdGlvbnNcbiIsIHRjcHN0YXQudGNwc19wcmVkZGF0KTsKKwlscHJpbnQoIiAgJTZkIFRDUCBjYWNoZSBtaXNzZXNcclxuIiwgdGNwc3RhdC50Y3BzX3NvY2FjaGVtaXNzKTsKKworCisvKglscHJpbnQoIiAgICBQYWNrZXRzIHJlY2VpdmVkIHRvbyBzaG9ydDoJCSVkXHJcbiIsIHRjcHN0YXQudGNwc19yY3ZzaG9ydCk7ICovCisvKglscHJpbnQoIiAgICBTZWdtZW50cyBkcm9wcGVkIGR1ZSB0byBQQVdTOgklZFxyXG4iLCB0Y3BzdGF0LnRjcHNfcGF3c2Ryb3ApOyAqLworCit9CisKK3N0YXRpYyB2b2lkCit1ZHBzdGF0cyh2b2lkKQoreworICAgICAgICBscHJpbnQoIiBcclxuIik7CisKKwlscHJpbnQoIlVEUCBzdGF0czpcclxuIik7CisJbHByaW50KCIgICU2ZCBkYXRhZ3JhbXMgcmVjZWl2ZWRcclxuIiwgdWRwc3RhdC51ZHBzX2lwYWNrZXRzKTsKKwlscHJpbnQoIiAgJTZkIHdpdGggcGFja2V0cyBzaG9ydGVyIHRoYW4gaGVhZGVyXHJcbiIsIHVkcHN0YXQudWRwc19oZHJvcHMpOworCWxwcmludCgiICAlNmQgd2l0aCBiYWQgY2hlY2tzdW1zXHJcbiIsIHVkcHN0YXQudWRwc19iYWRzdW0pOworCWxwcmludCgiICAlNmQgd2l0aCBkYXRhIGxlbmd0aCBsYXJnZXIgdGhhbiBwYWNrZXRcclxuIiwgdWRwc3RhdC51ZHBzX2JhZGxlbik7CisJbHByaW50KCIgICU2ZCBVRFAgc29ja2V0IGNhY2hlIG1pc3Nlc1xyXG4iLCB1ZHBzdGF0LnVkcHBzX3BjYmNhY2hlbWlzcyk7CisJbHByaW50KCIgICU2ZCBkYXRhZ3JhbXMgc2VudFxyXG4iLCB1ZHBzdGF0LnVkcHNfb3BhY2tldHMpOworfQorCitzdGF0aWMgdm9pZAoraWNtcHN0YXRzKHZvaWQpCit7CisJbHByaW50KCIgXHJcbiIpOworCWxwcmludCgiSUNNUCBzdGF0czpcclxuIik7CisJbHByaW50KCIgICU2ZCBJQ01QIHBhY2tldHMgcmVjZWl2ZWRcclxuIiwgaWNtcHN0YXQuaWNwc19yZWNlaXZlZCk7CisJbHByaW50KCIgICU2ZCB3ZXJlIHRvbyBzaG9ydFxyXG4iLCBpY21wc3RhdC5pY3BzX3Rvb3Nob3J0KTsKKwlscHJpbnQoIiAgJTZkIHdpdGggYmFkIGNoZWNrc3Vtc1xyXG4iLCBpY21wc3RhdC5pY3BzX2NoZWNrc3VtKTsKKwlscHJpbnQoIiAgJTZkIHdpdGggdHlwZSBub3Qgc3VwcG9ydGVkXHJcbiIsIGljbXBzdGF0LmljcHNfbm90c3VwcCk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCB0eXBlIGZlaWxkc1xyXG4iLCBpY21wc3RhdC5pY3BzX2JhZHR5cGUpOworCWxwcmludCgiICAlNmQgSUNNUCBwYWNrZXRzIHNlbnQgaW4gcmVwbHlcclxuIiwgaWNtcHN0YXQuaWNwc19yZWZsZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3NvY2tzdGF0cyh2b2lkKQoreworCWNoYXIgYnVmZlsyNTZdOworCWludCBuOworCXN0cnVjdCBzb2NrZXQgKnNvOworCisgICAgICAgIGxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgKKwkgICAiUHJvdG9bc3RhdGVdICAgICBTb2NrICAgICBMb2NhbCBBZGRyZXNzLCBQb3J0ICBSZW1vdGUgQWRkcmVzcywgUG9ydCBSZWN2USBTZW5kUVxyXG4iKTsKKworCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzby0+c29fbmV4dCkgeworCisJCW4gPSBzcHJpbnRmKGJ1ZmYsICJ0Y3BbJXNdIiwgc28tPnNvX3RjcGNiP3RjcHN0YXRlc1tzby0+c29fdGNwY2ItPnRfc3RhdGVdOiJOT05FIik7CisJCXdoaWxlIChuIDwgMTcpCisJCSAgIGJ1ZmZbbisrXSA9ICcgJzsKKwkJYnVmZlsxN10gPSAwOworCQlscHJpbnQoIiVzICUzZCAgICUxNXMgJTVkICIsCisJCQkJYnVmZiwgc28tPnMsCisJCQkJaW5ldF9pcHRvc3RyKHNvLT5zb19sYWRkcl9pcCksIHNvLT5zb19sYWRkcl9wb3J0KTsKKwkJbHByaW50KCIlMTVzICU1ZCAlNWQgJTVkXHJcbiIsCisJCQkJaW5ldF9pcHRvc3RyKHNvLT5zb19mYWRkcl9pcCksIHNvLT5zb19mYWRkcl9wb3J0LAorCQkJCXNvLT5zb19yY3Yuc2JfY2MsIHNvLT5zb19zbmQuc2JfY2MpOworCX0KKworCWZvciAoc28gPSB1ZGIuc29fbmV4dDsgc28gIT0gJnVkYjsgc28gPSBzby0+c29fbmV4dCkgeworCisJCW4gPSBzcHJpbnRmKGJ1ZmYsICJ1ZHBbJWQgc2VjXSIsIChzby0+c29fZXhwaXJlIC0gY3VydGltZSkgLyAxMDAwKTsKKwkJd2hpbGUgKG4gPCAxNykKKwkJICAgYnVmZltuKytdID0gJyAnOworCQlidWZmWzE3XSA9IDA7CisJCWxwcmludCgiJXMgJTNkICAlMTVzICU1ZCAgIiwKKwkJCQlidWZmLCBzby0+cywKKwkJCQlpbmV0X2lwdG9zdHIoc28tPnNvX2xhZGRyX2lwKSwgc28tPnNvX2xhZGRyX3BvcnQpOworCQlscHJpbnQoIiUxNXMgJTVkICU1ZCAlNWRcclxuIiwKKwkJCQlpbmV0X2lwdG9zdHIoc28tPnNvX2ZhZGRyX2lwKSwgc28tPnNvX2ZhZGRyX3BvcnQsCisJCQkJc28tPnNvX3Jjdi5zYl9jYywgc28tPnNvX3NuZC5zYl9jYyk7CisJfQorfQorI2VuZGlmCisKKyNpZiAwCit2b2lkCitzbGlycF9leGl0KGV4aXRfc3RhdHVzKQorCWludCBleGl0X3N0YXR1czsKK3sKKwlzdHJ1Y3QgdHR5cyAqdHR5cDsKKworCURFQlVHX0NBTEwoInNsaXJwX2V4aXQiKTsKKwlERUJVR19BUkcoImV4aXRfc3RhdHVzID0gJWQiLCBleGl0X3N0YXR1cyk7CisKKwlpZiAoZG9zdGF0cykgeworCQlscHJpbnRfcHJpbnQgPSAoaW50ICgqKSBfUCgodm9pZCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKSl2ZnByaW50ZjsKKwkJaWYgKCFkZmQpCisJCSAgIGRlYnVnX2luaXQoInNsaXJwX3N0YXRzIiwgMHhmKTsKKwkJbHByaW50X2FyZyA9IChjaGFyICoqKSZkZmQ7CisKKwkJaXBzdGF0cygpOworCQl0Y3BzdGF0cygpOworCQl1ZHBzdGF0cygpOworCQlpY21wc3RhdHMoKTsKKwkJbWJ1ZnN0YXRzKCk7CisJCXNvY2tzdGF0cygpOworCQlhbGx0dHlzdGF0cygpOworCQl2anN0YXRzKCk7CisJfQorCisJZm9yICh0dHlwID0gdHR5czsgdHR5cDsgdHR5cCA9IHR0eXAtPm5leHQpCisJICAgdHR5X2RldGFjaGVkKHR0eXAsIDEpOworCisJaWYgKHNsaXJwX2ZvcmtlZCkgeworCQkvKiBNZW5lbmRleiB0aW1lICovCisJCWlmIChraWxsKGdldHBwaWQoKSwgU0lHUVVJVCkgPCAwKQorCQkJbHByaW50KCJDb3VsZG4ndCBraWxsIHBhcmVudCBwcm9jZXNzICVsZCFcbiIsCisJCQkgICAgKGxvbmcpIGdldHBwaWQoKSk7CisgICAgCX0KKworCS8qIFJlc3RvcmUgdGhlIHRlcm1pbmFsIGlmIHdlIGdvdHRhICovCisJaWYoc2xpcnBfdHR5X3Jlc3RvcmUpCisJICB0Y3NldGF0dHIoMCxUQ1NBTk9XLCAmc2xpcnBfdHR5X3NldHRpbmdzKTsgIC8qIE5PVyBEQU1NSVQhICovCisJZXhpdChleGl0X3N0YXR1cyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9kZWJ1Zy5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzZWZmNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9kZWJ1Zy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2RlZmluZSBQUk5fU1RERVJSCTEKKyNkZWZpbmUgUFJOX1NQUklOVEYJMgorCitleHRlcm4gRklMRSAqZGZkOworZXh0ZXJuIEZJTEUgKmxmZDsKK2V4dGVybiBpbnQgZG9zdGF0czsKK2V4dGVybiBpbnQgc2xpcnBfZGVidWc7CisKKyNkZWZpbmUgREJHX0NBTEwgMHgxCisjZGVmaW5lIERCR19NSVNDIDB4MgorI2RlZmluZSBEQkdfRVJST1IgMHg0CisjZGVmaW5lIERFQlVHX0RFRkFVTFQgREJHX0NBTEx8REJHX01JU0N8REJHX0VSUk9SCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBERUJVR19DQUxMKHgpIGlmIChzbGlycF9kZWJ1ZyAmIERCR19DQUxMKSB7IGZwcmludGYoZGZkLCAiJXMuLi5cbiIsIHgpOyBmZmx1c2goZGZkKTsgfQorI2RlZmluZSBERUJVR19BUkcoeCwgeSkgaWYgKHNsaXJwX2RlYnVnICYgREJHX0NBTEwpIHsgZnB1dGMoJyAnLCBkZmQpOyBmcHJpbnRmKGRmZCwgeCwgeSk7IGZwdXRjKCdcbicsIGRmZCk7IGZmbHVzaChkZmQpOyB9CisjZGVmaW5lIERFQlVHX0FSR1MoeCkgaWYgKHNsaXJwX2RlYnVnICYgREJHX0NBTEwpIHsgZnByaW50ZiB4IDsgZmZsdXNoKGRmZCk7IH0KKyNkZWZpbmUgREVCVUdfTUlTQyh4KSBpZiAoc2xpcnBfZGVidWcgJiBEQkdfTUlTQykgeyBmcHJpbnRmIHggOyBmZmx1c2goZGZkKTsgfQorI2RlZmluZSBERUJVR19FUlJPUih4KSBpZiAoc2xpcnBfZGVidWcgJiBEQkdfRVJST1IpIHtmcHJpbnRmIHggOyBmZmx1c2goZGZkKTsgfQorCisKKyNlbHNlCisKKyNkZWZpbmUgREVCVUdfQ0FMTCh4KQorI2RlZmluZSBERUJVR19BUkcoeCwgeSkKKyNkZWZpbmUgREVCVUdfQVJHUyh4KQorI2RlZmluZSBERUJVR19NSVNDKHgpCisjZGVmaW5lIERFQlVHX0VSUk9SKHgpCisKKyNlbmRpZgorCit2b2lkIGRlYnVnX2luaXQgX1AoKGNoYXIgKiwgaW50KSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaGVscGVyLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzY2RmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9oZWxwZXIuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfU0xJUlBfSEVMUEVSX0gKKyNkZWZpbmUgX1NMSVJQX0hFTFBFUl9ICisKKyNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+ICAvKiBmb3IgbnRvaGwgKi8KKyMgIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICB1X2ludDMyX3QgICBhZGRyOworICAgIHVfaW50OF90ICAgIGRhdGFbNF07Cit9IGlwYWRkcl90OworCisvKiByZXR1cm4gaXAgYWRkcmVzcyBpbiBuZXR3b3JrIG9yZGVyICovCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdAoraXBfZ2V0biggaXBhZGRyX3QgIGlwICkKK3sKKyAgICByZXR1cm4gaXAuYWRkcjsKK30KKworLyogcmV0dXJuIGlwIGFkZHJlc3MgaW4gaG9zdCBvcmRlciAqLworc3RhdGljIF9faW5saW5lX18gdWludDMyX3QKK2lwX2dldGgoIGlwYWRkcl90ICBpcCApCit7CisgICAgcmV0dXJuIG50b2hsKGlwLmFkZHIpOworfQorCisvKiBzZXQgaXAgYWRkcmVzcyBpbiBuZXR3b3JrIG9yZGVyICovCitzdGF0aWMgX19pbmxpbmVfXyBpcGFkZHJfdAoraXBfc2V0biggdWludDMyX3QgIHZhbCApCit7CisgICAgaXBhZGRyX3QgIGlwOworICAgIGlwLmFkZHIgPSB2YWw7CisgICAgcmV0dXJuIGlwOworfQorCisvKiBzZXQgaXAgYWRkcmVzcyBpbiBob3N0IG9yZGVyICovCitzdGF0aWMgX19pbmxpbmVfXyBpcGFkZHJfdAoraXBfc2V0aCggdWludDMyX3QgIHZhbCApCit7CisgICAgaXBhZGRyX3QgIGlwOworICAgIGlwLmFkZHIgPSBodG9ubCh2YWwpOworICAgIHJldHVybiBpcDsKK30KKworc3RhdGljIF9faW5saW5lX18gaXBhZGRyX3QKK2lwX3JlYWQoIGNvbnN0IHZvaWQqICBidWYgKQoreworICAgIGlwYWRkcl90ICBpcDsKKyAgICBtZW1jcHkoaXAuZGF0YSwgYnVmLCA0KTsKKyAgICByZXR1cm4gaXA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK2lwX3dyaXRlKCBpcGFkZHJfdCAgaXAsIHZvaWQqICBidWYgKQoreworICAgIG1lbWNweShidWYsIGlwLmRhdGEsIDQpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1aW50MzJfdAoraXBfcmVhZDMyaCggY29uc3Qgdm9pZCogYnVmICkKK3sKKyAgICBpcGFkZHJfdCAgYWRkciA9IGlwX3JlYWQoYnVmKTsKKyAgICByZXR1cm4gaXBfZ2V0aChhZGRyKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZAoraXBfd3JpdGUzMmgoIHVpbnQzMl90ICBpcCwgdm9pZCogIGJ1ZiApCit7CisgICAgaXBhZGRyX3QgIGFkZHIgPSBpcF9zZXRoKGlwKTsKKyAgICBpcF93cml0ZShhZGRyLCBidWYpOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQKK2lwX2VxdWFsKCBpcGFkZHJfdCAgaXAxLCBpcGFkZHJfdCAgaXAyICkKK3sKKyAgICByZXR1cm4gaXAxLmFkZHIgPT0gaXAyLmFkZHI7Cit9CisKK3R5cGVkZWYgdW5pb24geworICAgIHVfaW50MTZfdCAgcG9ydDsKKyAgICB1X2ludDhfdCAgIGRhdGFbMl07Cit9IHBvcnRfdDsKKworc3RhdGljIF9faW5saW5lX18gdWludDE2X3QKK3BvcnRfZ2V0biggcG9ydF90ICAgcCApCit7CisgICAgcmV0dXJuIHAucG9ydDsKK30KKworc3RhdGljIF9faW5saW5lX18gdWludDE2X3QKK3BvcnRfZ2V0aCggcG9ydF90ICBwICkKK3sKKyAgICByZXR1cm4gbnRvaHMocC5wb3J0KTsKK30KKworc3RhdGljIF9faW5saW5lX18gcG9ydF90Citwb3J0X3NldG4oIHVpbnQxNl90ICB2YWwgKQoreworICAgIHBvcnRfdCAgcDsKKyAgICBwLnBvcnQgPSB2YWw7CisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHBvcnRfdAorcG9ydF9zZXRoKCB1aW50MTZfdCAgdmFsICkKK3sKKyAgICBwb3J0X3QgIHA7CisgICAgcC5wb3J0ID0gaHRvbnModmFsKTsKKyAgICByZXR1cm4gcDsKK30KKworI2VuZGlmIC8qIF9TTElSUF9IRUxQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2ljbXBfdmFyLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaWNtcF92YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ0YzllCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2ljbXBfdmFyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpY21wX3Zhci5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqIGljbXBfdmFyLmgsdiAxLjQgMTk5NS8wMi8xNiAwMDoyNzo0MCB3b2xsbWFuIEV4cAorICovCisKKyNpZm5kZWYgX05FVElORVRfSUNNUF9WQVJfSF8KKyNkZWZpbmUgX05FVElORVRfSUNNUF9WQVJfSF8KKworLyoKKyAqIFZhcmlhYmxlcyByZWxhdGVkIHRvIHRoaXMgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBpbnRlcm5ldCBjb250cm9sIG1lc3NhZ2UgcHJvdG9jb2wuCisgKi8KK3N0cnVjdCBpY21wc3RhdCB7CisvKiBzdGF0aXN0aWNzIHJlbGF0ZWQgdG8gaW5wdXQgbWVzc2FnZXMgcHJvY2Vzc2VkICovCisJdV9sb25nICBpY3BzX3JlY2VpdmVkOwkJLyogI0lDTVAgcGFja2V0cyByZWNlaXZlZCAqLworCXVfbG9uZwlpY3BzX3Rvb3Nob3J0OwkJLyogcGFja2V0IDwgSUNNUF9NSU5MRU4gKi8KKwl1X2xvbmcJaWNwc19jaGVja3N1bTsJCS8qIGJhZCBjaGVja3N1bSAqLworCXVfbG9uZwlpY3BzX25vdHN1cHA7CQkvKiAjSUNNUCBwYWNrZXRzIG5vdCBzdXBwb3J0ZWQgKi8KKwl1X2xvbmcgIGljcHNfYmFkdHlwZTsJCS8qICN3aXRoIGJhZCB0eXBlIGZlaWxkICovCisJdV9sb25nCWljcHNfcmVmbGVjdDsJCS8qIG51bWJlciBvZiByZXNwb25zZXMgKi8KK307CisKKy8qCisgKiBOYW1lcyBmb3IgSUNNUCBzeXNjdGwgb2JqZWN0cworICovCisjZGVmaW5lCUlDTVBDVExfTUFTS1JFUEwJMQkvKiBhbGxvdyByZXBsaWVzIHRvIG5ldG1hc2sgcmVxdWVzdHMgKi8KKyNkZWZpbmUJSUNNUENUTF9TVEFUUwkJMgkvKiBzdGF0aXN0aWNzIChyZWFkLW9ubHkpICovCisjZGVmaW5lIElDTVBDVExfTUFYSUQJCTMKKworI2RlZmluZSBJQ01QQ1RMX05BTUVTIHsgXAorCXsgMCwgMCB9LCBcCisJeyAibWFza3JlcGwiLCBDVExUWVBFX0lOVCB9LCBcCisJeyAic3RhdHMiLCBDVExUWVBFX1NUUlVDVCB9LCBcCit9CisKKyNpZmRlZiBMT0dfRU5BQkxFRAorZXh0ZXJuIHN0cnVjdCBpY21wc3RhdCBpY21wc3RhdDsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pZi5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBkNWI1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pZi5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCitpbnQgICAgIGlmX3F1ZXVlZCA9IDA7ICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIHNvIGZhciAqLworCitzdHJ1Y3QgIG1idWYgaWZfZmFzdHE7ICAgICAgICAgICAgICAgICAgLyogZmFzdCBxdWV1ZSAoZm9yIGludGVyYWN0aXZlIGRhdGEpICovCitzdHJ1Y3QgIG1idWYgaWZfYmF0Y2hxOyAgICAgICAgICAgICAgICAgLyogcXVldWUgZm9yIG5vbi1pbnRlcmFjdGl2ZSBkYXRhICovCitzdHJ1Y3QJbWJ1ZiAqbmV4dF9tOwkJCS8qIFBvaW50ZXIgdG8gbmV4dCBtYnVmIHRvIG91dHB1dCAqLworCisjZGVmaW5lIGlmc19pbml0KGlmbSkgKChpZm0pLT5pZnNfbmV4dCA9IChpZm0pLT5pZnNfcHJldiA9IChpZm0pKQorCitzdGF0aWMgdm9pZAoraWZzX2luc3F1ZShzdHJ1Y3QgbWJ1ZiAqaWZtLCBzdHJ1Y3QgbWJ1ZiAqaWZtaGVhZCkKK3sKKwlpZm0tPmlmc19uZXh0ID0gaWZtaGVhZC0+aWZzX25leHQ7CisJaWZtaGVhZC0+aWZzX25leHQgPSBpZm07CisJaWZtLT5pZnNfcHJldiA9IGlmbWhlYWQ7CisJaWZtLT5pZnNfbmV4dC0+aWZzX3ByZXYgPSBpZm07Cit9CisKK3N0YXRpYyB2b2lkCitpZnNfcmVtcXVlKHN0cnVjdCBtYnVmICppZm0pCit7CisJaWZtLT5pZnNfcHJldi0+aWZzX25leHQgPSBpZm0tPmlmc19uZXh0OworCWlmbS0+aWZzX25leHQtPmlmc19wcmV2ID0gaWZtLT5pZnNfcHJldjsKK30KKwordm9pZAoraWZfaW5pdCh2b2lkKQoreworCWlmX2Zhc3RxLmlmcV9uZXh0ID0gaWZfZmFzdHEuaWZxX3ByZXYgPSAmaWZfZmFzdHE7CisJaWZfYmF0Y2hxLmlmcV9uZXh0ID0gaWZfYmF0Y2hxLmlmcV9wcmV2ID0gJmlmX2JhdGNocTsKKyAgICAgICAgLy8Jc2xfY29tcHJlc3NfaW5pdCgmY29tcF9zKTsKKwluZXh0X20gPSAmaWZfYmF0Y2hxOworfQorCisjaWYgMAorLyoKKyAqIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZCBzaW5jZSB0aGUgbW9kZW0gaXMgYmxvY2tpbmcgYW5kCisgKiB3ZSBkb24ndCBleHBlY3QgYW55IHNpZ25hbHMsIGJ1dCB3aGF0IHRoZSBoZWxsLi4KKyAqLworaW5saW5lIGludAord3JpdGVuKGZkLCBicHRyLCBuKQorCWludCBmZDsKKwljaGFyICpicHRyOworCWludCBuOworeworCWludCByZXQ7CisJaW50IHRvdGFsOworCisJLyogVGhpcyBzaG91bGQgc3VjY2VlZCBtb3N0IG9mIHRoZSB0aW1lICovCisJcmV0ID0gc29ja2V0X3NlbmQoZmQsIGJwdHIsIG4pOworCWlmIChyZXQgPT0gbiB8fCByZXQgPD0gMCkKKwkgICByZXR1cm4gcmV0OworCisJLyogRGlkbid0IHdyaXRlIGV2ZXJ5dGhpbmcsIGdvIGludG8gdGhlIGxvb3AgKi8KKwl0b3RhbCA9IHJldDsKKwl3aGlsZSAobiA+IHRvdGFsKSB7CisJCXJldCA9IHNvY2tldF9zZW5kKGZkLCBicHRyK3RvdGFsLCBuLXRvdGFsKTsKKwkJaWYgKHJldCA8PSAwKQorCQkgICByZXR1cm4gcmV0OworCQl0b3RhbCArPSByZXQ7CisJfQorCXJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIGlmX2lucHV0IC0gcmVhZCgpIHRoZSB0dHksIGRvICJ0b3AgbGV2ZWwiIHByb2Nlc3NpbmcgKGllOiBjaGVjayBmb3IgYW55IGVzY2FwZXMpLAorICogYW5kIHBhc3Mgb250byAoKnR0eXAtPmlmX2lucHV0KQorICoKKyAqIFhYWFhYIEFueSB6ZXJvcyBhcnJpdmluZyBieSB0aGVtc2VsdmVzIGFyZSBOT1QgcGxhY2VkIGludG8gdGhlIGFycml2aW5nIHBhY2tldC4KKyAqLworI2RlZmluZSBJTkJVRkZfU0laRSAyMDQ4IC8qIFhYWCAqLwordm9pZAoraWZfaW5wdXQodHR5cCkKKwlzdHJ1Y3QgdHR5cyAqdHR5cDsKK3sKKwl1X2NoYXIgaWZfaW5idWZmW0lOQlVGRl9TSVpFXTsKKwlpbnQgaWZfbjsKKworCURFQlVHX0NBTEwoImlmX2lucHV0Iik7CisJREVCVUdfQVJHKCJ0dHlwID0gJWx4IiwgKGxvbmcpdHR5cCk7CisKKwlpZl9uID0gc29ja2V0X3JlY3YodHR5cC0+ZmQsIChjaGFyICopaWZfaW5idWZmLCBJTkJVRkZfU0laRSk7CisKKwlERUJVR19NSVNDKChkZmQsICIgcmVhZCAlZCBieXRlc1xuIiwgaWZfbikpOworCisJaWYgKGlmX24gPD0gMCkgeworCQlpZiAoaWZfbiA9PSAwIHx8IChlcnJubyAhPSBFSU5UUiAmJiBlcnJubyAhPSBFQUdBSU4pKSB7CisJCQlpZiAodHR5cC0+dXApCisJCQkgICBsaW5rX3VwLS07CisJCQl0dHlfZGV0YWNoZWQodHR5cCwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoaWZfbiA9PSAxKSB7CisJCWlmICgqaWZfaW5idWZmID09ICcwJykgeworCQkJdHR5cC0+b25lcyA9IDA7CisJCQlpZiAoKyt0dHlwLT56ZXJvcyA+PSA1KQorCQkJICAgc2xpcnBfZXhpdCgwKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoKmlmX2luYnVmZiA9PSAnMScpIHsKKwkJCXR0eXAtPnplcm9zID0gMDsKKwkJCWlmICgrK3R0eXAtPm9uZXMgPj0gNSkKKwkJCSAgIHR0eV9kZXRhY2hlZCh0dHlwLCAwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl0dHlwLT5vbmVzID0gdHR5cC0+emVyb3MgPSAwOworCisJKCp0dHlwLT5pZl9pbnB1dCkodHR5cCwgaWZfaW5idWZmLCBpZl9uKTsKK30KKyNlbmRpZgorCisvKgorICogaWZfb3V0cHV0OiBRdWV1ZSBwYWNrZXQgaW50byBhbiBvdXRwdXQgcXVldWUuCisgKiBUaGVyZSBhcmUgMiBvdXRwdXQgcXVldWUncywgaWZfZmFzdHEgYW5kIGlmX2JhdGNocS4KKyAqIEVhY2ggb3V0cHV0IHF1ZXVlIGlzIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGRvdWJsZSBsaW5rZWQgbGlzdHMKKyAqIG9mIG1idWZzLCBlYWNoIGxpc3QgYmVsb25naW5nIHRvIG9uZSAic2Vzc2lvbiIgKHNvY2tldCkuICBUaGlzCisgKiB3YXksIHdlIGNhbiBvdXRwdXQgcGFja2V0cyBmYWlybHkgYnkgc2VuZGluZyBvbmUgcGFja2V0IGZyb20gZWFjaAorICogc2Vzc2lvbiwgaW5zdGVhZCBvZiBhbGwgdGhlIHBhY2tldHMgZnJvbSBvbmUgc2Vzc2lvbiwgdGhlbiBhbGwgcGFja2V0cworICogZnJvbSB0aGUgbmV4dCBzZXNzaW9uLCBldGMuICBQYWNrZXRzIG9uIHRoZSBpZl9mYXN0cSBnZXQgYWJzb2x1dGUKKyAqIHByaW9yaXR5LCBidXQgaWYgb25lIHNlc3Npb24gaG9ncyB0aGUgbGluaywgaXQgZ2V0cyAiZG93bmdyYWRlZCIKKyAqIHRvIHRoZSBiYXRjaHEgdW50aWwgaXQgcnVucyBvdXQgb2YgcGFja2V0cywgdGhlbiBpdCdsbCByZXR1cm4KKyAqIHRvIHRoZSBmYXN0cSAoZWcuIGlmIHRoZSB1c2VyIGRvZXMgYW4gbHMgLWFsUiBpbiBhIHRlbG5ldCBzZXNzaW9uLAorICogaXQnbGwgdGVtcG9yYXJpbHkgZ2V0IGRvd25ncmFkZWQgdG8gdGhlIGJhdGNocSkKKyAqLwordm9pZAoraWZfb3V0cHV0KHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqaWZtKQoreworCXN0cnVjdCBtYnVmICppZnE7CisJaW50IG9uX2Zhc3RxID0gMTsKKworCURFQlVHX0NBTEwoImlmX291dHB1dCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJpZm0gPSAlbHgiLCAobG9uZylpZm0pOworCisJLyoKKwkgKiBGaXJzdCByZW1vdmUgdGhlIG1idWYgZnJvbSBtX3VzZWRsaXN0LAorCSAqIHNpbmNlIHdlJ3JlIGdvbm5hIHVzZSBtX25leHQgYW5kIG1fcHJldiBvdXJzZWx2ZXMKKwkgKiBYWFggU2hvdWxkbid0IG5lZWQgdGhpcywgZ290dGEgY2hhbmdlIGR0b20oKSBldGMuCisJICovCisJaWYgKGlmbS0+bV9mbGFncyAmIE1fVVNFRExJU1QpIHsKKwkJcmVtcXVlKGlmbSk7CisJCWlmbS0+bV9mbGFncyAmPSB+TV9VU0VETElTVDsKKwl9CisKKwkvKgorCSAqIFNlZSBpZiB0aGVyZSdzIGFscmVhZHkgYSBiYXRjaHEgbGlzdCBmb3IgdGhpcyBzZXNzaW9uLgorCSAqIFRoaXMgY2FuIGluY2x1ZGUgYW4gaW50ZXJhY3RpdmUgc2Vzc2lvbiwgd2hpY2ggc2hvdWxkIGdvIG9uIGZhc3RxLAorCSAqIGJ1dCBnZXRzIHRvbyBncmVlZHkuLi4gaGVuY2UgaXQnbGwgYmUgZG93bmdyYWRlZCBmcm9tIGZhc3RxIHRvIGJhdGNocS4KKwkgKiBXZSBtdXN0bid0IHB1dCB0aGlzIHBhY2tldCBiYWNrIG9uIHRoZSBmYXN0cSAob3Igd2UnbGwgc2VuZCBpdCBvdXQgb2Ygb3JkZXIpCisJICogWFhYIGFkZCBjYWNoZSBoZXJlPworCSAqLworCWZvciAoaWZxID0gaWZfYmF0Y2hxLmlmcV9wcmV2OyBpZnEgIT0gJmlmX2JhdGNocTsgaWZxID0gaWZxLT5pZnFfcHJldikgeworCQlpZiAoc28gPT0gaWZxLT5pZnFfc28pIHsKKwkJCS8qIEEgbWF0Y2ghICovCisJCQlpZm0tPmlmcV9zbyA9IHNvOworCQkJaWZzX2luc3F1ZShpZm0sIGlmcS0+aWZzX3ByZXYpOworCQkJZ290byBkaWRkaXQ7CisJCX0KKwl9CisKKwkvKiBObyBtYXRjaCwgY2hlY2sgd2hpY2ggcXVldWUgdG8gcHV0IGl0IG9uICovCisJaWYgKHNvICYmIChzby0+c29faXB0b3MgJiBJUFRPU19MT1dERUxBWSkpIHsKKwkJaWZxID0gaWZfZmFzdHEuaWZxX3ByZXY7CisJCW9uX2Zhc3RxID0gMTsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhpcyBwYWNrZXQgaXMgYSBwYXJ0IG9mIHRoZSBsYXN0CisJCSAqIHBhY2tldCdzIHNlc3Npb24KKwkJICovCisJCWlmIChpZnEtPmlmcV9zbyA9PSBzbykgeworCQkJaWZtLT5pZnFfc28gPSBzbzsKKwkJCWlmc19pbnNxdWUoaWZtLCBpZnEtPmlmc19wcmV2KTsKKwkJCWdvdG8gZGlkZGl0OworCQl9CisJfSBlbHNlCisJCWlmcSA9IGlmX2JhdGNocS5pZnFfcHJldjsKKworCS8qIENyZWF0ZSBhIG5ldyBkb3VibHkgbGlua2VkIGxpc3QgZm9yIHRoaXMgc2Vzc2lvbiAqLworCWlmbS0+aWZxX3NvID0gc287CisJaWZzX2luaXQoaWZtKTsKKwlpbnNxdWUoaWZtLCBpZnEpOworCitkaWRkaXQ6CisJKytpZl9xdWV1ZWQ7CisKKwlpZiAoc28pIHsKKwkJLyogVXBkYXRlICpfcXVldWVkICovCisJCXNvLT5zb19xdWV1ZWQrKzsKKwkJc28tPnNvX25xdWV1ZWQrKzsKKwkJLyoKKwkJICogQ2hlY2sgaWYgdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc2hvdWxkIGJlIGRvd25ncmFkZWQgdG8KKwkJICogdGhlIGJhdGNocS4gIEEgc2Vzc2lvbiBpcyBkb3duZ3JhZGVkIGlmIGl0IGhhcyBxdWV1ZWQgNgorCQkgKiBwYWNrZXRzIHdpdGhvdXQgcGF1c2luZywgYW5kIGF0IGxlYXN0IDMgb2YgdGhvc2UgcGFja2V0cworCQkgKiBoYXZlIGJlZW4gc2VudCBvdmVyIHRoZSBsaW5rCisJCSAqIChYWFggVGhlc2UgYXJlIGFyYml0cmFyeSBudW1iZXJzLCBwcm9iYWJseSBub3Qgb3B0aW1hbC4uKQorCQkgKi8KKwkJaWYgKG9uX2Zhc3RxICYmICgoc28tPnNvX25xdWV1ZWQgPj0gNikgJiYKKwkJCQkgKHNvLT5zb19ucXVldWVkIC0gc28tPnNvX3F1ZXVlZCkgPj0gMykpIHsKKworCQkJLyogUmVtb3ZlIGZyb20gY3VycmVudCBxdWV1ZS4uLiAqLworCQkJcmVtcXVlKGlmbS0+aWZzX25leHQpOworCisJCQkvKiAuLi5BbmQgaW5zZXJ0IGluIHRoZSBuZXcuICBUaGF0J2xsIHRlYWNoIHlhISAqLworCQkJaW5zcXVlKGlmbS0+aWZzX25leHQsICZpZl9iYXRjaHEpOworCQl9CisJfQorCisjaWZuZGVmIEZVTExfQk9MVAorCS8qCisJICogVGhpcyBwcmV2ZW50cyB1cyBmcm9tIG1hbGxvYygpaW5nIHRvbyBtYW55IG1idWZzCisJICovCisJaWYgKGxpbmtfdXApIHsKKwkJLyogaWZfc3RhcnQgd2lsbCBjaGVjayB0b3dyaXRlICovCisJCWlmX3N0YXJ0KCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBTZW5kIGEgcGFja2V0CisgKiBXZSBjaG9vc2UgYSBwYWNrZXQgYmFzZWQgb24gaXQncyBwb3NpdGlvbiBpbiB0aGUgb3V0cHV0IHF1ZXVlczsKKyAqIElmIHRoZXJlIGFyZSBwYWNrZXRzIG9uIHRoZSBmYXN0cSwgdGhleSBhcmUgc2VudCBGSUZPLCBiZWZvcmUKKyAqIGV2ZXJ5dGhpbmcgZWxzZS4gIE90aGVyd2lzZSB3ZSBjaG9vc2UgdGhlIGZpcnN0IHBhY2tldCBmcm9tIHRoZQorICogYmF0Y2hxIGFuZCBzZW5kIGl0LiAgdGhlIG5leHQgcGFja2V0IGNob3NlbiB3aWxsIGJlIGZyb20gdGhlIHNlc3Npb24KKyAqIGFmdGVyIHRoaXMgb25lLCB0aGVuIHRoZSBzZXNzaW9uIGFmdGVyIHRoYXQgb25lLCBhbmQgc28gb24uLiAgU28sCisgKiBmb3IgZXhhbXBsZSwgaWYgdGhlcmUgYXJlIDMgZnRwIHNlc3Npb24ncyBmaWdodGluZyBmb3IgYmFuZHdpZHRoLAorICogb25lIHBhY2tldCB3aWxsIGJlIHNlbnQgZnJvbSB0aGUgZmlyc3Qgc2Vzc2lvbiwgdGhlbiBvbmUgcGFja2V0CisgKiBmcm9tIHRoZSBzZWNvbmQgc2Vzc2lvbiwgdGhlbiBvbmUgcGFja2V0IGZyb20gdGhlIHRoaXJkLCB0aGVuIGJhY2sKKyAqIHRvIHRoZSBmaXJzdCwgZXRjLiBldGMuCisgKi8KK3ZvaWQKK2lmX3N0YXJ0KHZvaWQpCit7CisJc3RydWN0IG1idWYgKmlmbSwgKmlmcXQ7CisKKwlERUJVR19DQUxMKCJpZl9zdGFydCIpOworCisJaWYgKGlmX3F1ZXVlZCA9PSAwKQorCSAgIHJldHVybjsgLyogTm90aGluZyB0byBkbyAqLworCisgYWdhaW46CisgICAgICAgIC8qIGNoZWNrIGlmIHdlIGNhbiByZWFsbHkgb3V0cHV0ICovCisgICAgICAgIGlmICghc2xpcnBfY2FuX291dHB1dCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisJLyoKKwkgKiBTZWUgd2hpY2ggcXVldWUgdG8gZ2V0IG5leHQgcGFja2V0IGZyb20KKwkgKiBJZiB0aGVyZSdzIHNvbWV0aGluZyBpbiB0aGUgZmFzdHEsIHNlbGVjdCBpdCBpbW1lZGlhdGVseQorCSAqLworCWlmIChpZl9mYXN0cS5pZnFfbmV4dCAhPSAmaWZfZmFzdHEpIHsKKwkJaWZtID0gaWZfZmFzdHEuaWZxX25leHQ7CisJfSBlbHNlIHsKKwkJLyogTm90aGluZyBvbiBmYXN0cSwgc2VlIGlmIG5leHRfbSBpcyB2YWxpZCAqLworCQlpZiAobmV4dF9tICE9ICZpZl9iYXRjaHEpCisJCSAgIGlmbSA9IG5leHRfbTsKKwkJZWxzZQorCQkgICBpZm0gPSBpZl9iYXRjaHEuaWZxX25leHQ7CisKKwkJLyogU2V0IHdoaWNoIHBhY2tldCB0byBzZW5kIG9uIG5leHQgaXRlcmF0aW9uICovCisJCW5leHRfbSA9IGlmbS0+aWZxX25leHQ7CisJfQorCS8qIFJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZSAqLworCWlmcXQgPSBpZm0tPmlmcV9wcmV2OworCXJlbXF1ZShpZm0pOworCS0taWZfcXVldWVkOworCisJLyogSWYgdGhlcmUgYXJlIG1vcmUgcGFja2V0cyBmb3IgdGhpcyBzZXNzaW9uLCByZS1xdWV1ZSB0aGVtICovCisJaWYgKGlmbS0+aWZzX25leHQgIT0gLyogaWZtLT5pZnNfcHJldiAhPSAqLyBpZm0pIHsKKwkJaW5zcXVlKGlmbS0+aWZzX25leHQsIGlmcXQpOworCQlpZnNfcmVtcXVlKGlmbSk7CisJfQorCisJLyogVXBkYXRlIHNvX3F1ZXVlZCAqLworCWlmIChpZm0tPmlmcV9zbykgeworCQlpZiAoLS1pZm0tPmlmcV9zby0+c29fcXVldWVkID09IDApCisJCSAgIC8qIElmIHRoZXJlJ3Mgbm8gbW9yZSBxdWV1ZWQsIHJlc2V0IG5xdWV1ZWQgKi8KKwkJICAgaWZtLT5pZnFfc28tPnNvX25xdWV1ZWQgPSAwOworCX0KKworCS8qIEVuY2Fwc3VsYXRlIHRoZSBwYWNrZXQgZm9yIHNlbmRpbmcgKi8KKyAgICAgICAgaWZfZW5jYXAoKHVpbnQ4X3QgKilpZm0tPm1fZGF0YSwgaWZtLT5tX2xlbik7CisKKyAgICAgICAgbV9mcmVlKGlmbSk7CisKKwlpZiAoaWZfcXVldWVkKQorCSAgIGdvdG8gYWdhaW47Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaWYuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaWYuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpZm5kZWYgX0lGX0hfCisjZGVmaW5lIF9JRl9IXworCisjZGVmaW5lIElGX0NPTVBSRVNTCTB4MDEJLyogV2Ugd2FudCBjb21wcmVzc2lvbiAqLworI2RlZmluZSBJRl9OT0NPTVBSRVNTCTB4MDIJLyogRG8gbm90IGRvIGNvbXByZXNzaW9uICovCisjZGVmaW5lIElGX0FVVE9DT01QCTB4MDQJLyogQXV0b2RldGVjdCAoZGVmYXVsdCkgKi8KKyNkZWZpbmUgSUZfTk9DSURDT01QCTB4MDgJLyogQ0lEIGNvbXByZXNzaW9uICovCisKKyNkZWZpbmUgSUZfTVRVIDE1MDAKKyNkZWZpbmUgSUZfTVJVIDE1MDAKKyNkZWZpbmUJSUZfQ09NUCBJRl9BVVRPQ09NUAkvKiBGbGFncyBmb3IgY29tcHJlc3Npb24gKi8KKworI2lmIDAKKy8qCisgKiBTZXQgaWZfbWF4bGlua2hkciB0byA0OCBiZWNhdXNlIGl0J3MgNDAgYnl0ZXMgZm9yIFRDUC9JUCwKKyAqIGFuZCA4IGJ5dGVzIGZvciBQUFAsIGJ1dCBuZWVkIHRvIGhhdmUgaXQgb24gYW4gOGJ5dGUgYm91bmRhcnkKKyAqLworI2lmZGVmIFVTRV9QUFAKKyNkZWZpbmUgSUZfTUFYTElOS0hEUiA0OAorI2Vsc2UKKyNkZWZpbmUgSUZfTUFYTElOS0hEUiA0MAorI2VuZGlmCisjZWxzZQorICAgICAgICAvKiAyIGZvciBhbGlnbm1lbnQsIDE0IGZvciBldGhlcm5ldCwgNDAgZm9yIFRDUC9JUCAqLworI2RlZmluZSBJRl9NQVhMSU5LSERSICgyICsgMTQgKyA0MCkKKyNlbmRpZgorCitleHRlcm4gaW50CWlmX3F1ZXVlZDsJLyogTnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIHNvIGZhciAqLworCitleHRlcm4Jc3RydWN0IG1idWYgaWZfZmFzdHE7ICAgICAgICAgICAgICAgICAgLyogZmFzdCBxdWV1ZSAoZm9yIGludGVyYWN0aXZlIGRhdGEpICovCitleHRlcm4Jc3RydWN0IG1idWYgaWZfYmF0Y2hxOyAgICAgICAgICAgICAgICAgLyogcXVldWUgZm9yIG5vbi1pbnRlcmFjdGl2ZSBkYXRhICovCitleHRlcm4Jc3RydWN0IG1idWYgKm5leHRfbTsKKworI2RlZmluZSBpZnNfaW5pdChpZm0pICgoaWZtKS0+aWZzX25leHQgPSAoaWZtKS0+aWZzX3ByZXYgPSAoaWZtKSkKKworI2lmZGVmIExPR19FTkFCTEVECisvKiBJbnRlcmZhY2Ugc3RhdGlzdGljcyAqLworc3RydWN0IHNsaXJwX2lmc3RhdHMgeworCXVfaW50IG91dF9wa3RzOwkJLyogT3V0cHV0IHBhY2tldHMgKi8KKwl1X2ludCBvdXRfYnl0ZXM7CQkvKiBPdXRwdXQgYnl0ZXMgKi8KKwl1X2ludCBvdXRfZXJycGt0czsJLyogT3V0cHV0IEVycm9yIFBhY2tldHMgKi8KKwl1X2ludCBvdXRfZXJyYnl0ZXM7CS8qIE91dHB1dCBFcnJvciBCeXRlcyAqLworCXVfaW50IGluX3BrdHM7CQkvKiBJbnB1dCBwYWNrZXRzICovCisJdV9pbnQgaW5fYnl0ZXM7CQkvKiBJbnB1dCBieXRlcyAqLworCXVfaW50IGluX2VycnBrdHM7CQkvKiBJbnB1dCBFcnJvciBQYWNrZXRzICovCisJdV9pbnQgaW5fZXJyYnl0ZXM7CS8qIElucHV0IEVycm9yIEJ5dGVzICovCisKKwl1X2ludCBieXRlc19zYXZlZDsJLyogTnVtYmVyIG9mIGJ5dGVzIHRoYXQgY29tcHJlc3Npb24gInNhdmVkIiAqLworCQkJCS8qIGllOiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBkaWRuJ3QgbmVlZCB0byBiZSBzZW50IG92ZXIgdGhlIGxpbmsKKwkJCQkgKiBiZWNhdXNlIG9mIGNvbXByZXNzaW9uICovCisKKwl1X2ludCBpbl9tYmFkOwkJLyogQmFkIGluY29taW5nIHBhY2tldHMgKi8KK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGQ2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXAuaApAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqIGlwLmgsdiAxLjMgMTk5NC8wOC8yMSAwNToyNzozMCBwYXVsIEV4cAorICovCisKKyNpZm5kZWYgX0lQX0hfCisjZGVmaW5lIF9JUF9IXworCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorIyBpZm5kZWYgTlRPSEwKKyMgIGRlZmluZSBOVE9ITChkKQorIyBlbmRpZgorIyBpZm5kZWYgTlRPSFMKKyMgIGRlZmluZSBOVE9IUyhkKQorIyBlbmRpZgorIyBpZm5kZWYgSFRPTkwKKyMgIGRlZmluZSBIVE9OTChkKQorIyBlbmRpZgorIyBpZm5kZWYgSFRPTlMKKyMgIGRlZmluZSBIVE9OUyhkKQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIE5UT0hMCisjICBkZWZpbmUgTlRPSEwoZCkgKChkKSA9IG50b2hsKChkKSkpCisjIGVuZGlmCisjIGlmbmRlZiBOVE9IUworIyAgZGVmaW5lIE5UT0hTKGQpICgoZCkgPSBudG9ocygodV9pbnQxNl90KShkKSkpCisjIGVuZGlmCisjIGlmbmRlZiBIVE9OTAorIyAgZGVmaW5lIEhUT05MKGQpICgoZCkgPSBodG9ubCgoZCkpKQorIyBlbmRpZgorIyBpZm5kZWYgSFRPTlMKKyMgIGRlZmluZSBIVE9OUyhkKSAoKGQpID0gaHRvbnMoKHVfaW50MTZfdCkoZCkpKQorIyBlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgdV9pbnQzMl90IG5fbG9uZzsgICAgICAgICAgICAgICAgIC8qIGxvbmcgYXMgcmVjZWl2ZWQgZnJvbSB0aGUgbmV0ICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgaW50ZXJuZXQgcHJvdG9jb2wgdmVyc2lvbiA0LgorICogUGVyIFJGQyA3OTEsIFNlcHRlbWJlciAxOTgxLgorICovCisjZGVmaW5lCUlQVkVSU0lPTgk0CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuZXQgaGVhZGVyLCBuYWtlZCBvZiBvcHRpb25zLgorICovCitzdHJ1Y3QgaXAgeworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisJdV9pbnQ4X3QgaXBfdjo0OwkJLyogdmVyc2lvbiAqLworCXVfaW50OF90IGlwX2hsOjQ7CQkvKiBoZWFkZXIgbGVuZ3RoICovCisjZWxzZQorCXVfaW50OF90IGlwX2hsOjQ7CQkvKiBoZWFkZXIgbGVuZ3RoICovCisJdV9pbnQ4X3QgaXBfdjo0OwkJLyogdmVyc2lvbiAqLworI2VuZGlmCisJdV9pbnQ4X3QgIGlwX3RvczsJCQkvKiB0eXBlIG9mIHNlcnZpY2UgKi8KKwl1X2ludDE2X3QJaXBfbGVuOwkJCS8qIHRvdGFsIGxlbmd0aCAqLworCXVfaW50MTZfdAlpcF9pZDsJCQkvKiBpZGVudGlmaWNhdGlvbiAqLworCXVfaW50MTZfdAlpcF9vZmY7CQkJLyogZnJhZ21lbnQgb2Zmc2V0IGZpZWxkICovCisjZGVmaW5lCUlQX0RGIDB4NDAwMAkJCS8qIGRvbid0IGZyYWdtZW50IGZsYWcgKi8KKyNkZWZpbmUJSVBfTUYgMHgyMDAwCQkJLyogbW9yZSBmcmFnbWVudHMgZmxhZyAqLworI2RlZmluZQlJUF9PRkZNQVNLIDB4MWZmZgkJLyogbWFzayBmb3IgZnJhZ21lbnRpbmcgYml0cyAqLworCXVfaW50OF90IGlwX3R0bDsJCQkvKiB0aW1lIHRvIGxpdmUgKi8KKwl1X2ludDhfdCBpcF9wOwkJCS8qIHByb3RvY29sICovCisJdV9pbnQxNl90CWlwX3N1bTsJCQkvKiBjaGVja3N1bSAqLworICAgIGlwYWRkcl90ICAgICAgICBpcF9zcmMsIGlwX2RzdDsgLyogc291cmNlIGFuZCBkZXN0IGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUJSVBfTUFYUEFDS0VUCTY1NTM1CQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSVAgdHlwZSBvZiBzZXJ2aWNlIChpcF90b3MpCisgKi8KKyNkZWZpbmUJSVBUT1NfTE9XREVMQVkJCTB4MTAKKyNkZWZpbmUJSVBUT1NfVEhST1VHSFBVVAkweDA4CisjZGVmaW5lCUlQVE9TX1JFTElBQklMSVRZCTB4MDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBvcHRpb25zLgorICovCisjZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSYweDgwKQorI2RlZmluZQlJUE9QVF9DTEFTUyhvKQkJKChvKSYweDYwKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykmMHgxZikKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9ERUJNRUFTCQkweDQwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lCUlQT1BUX0VPTAkJMAkJLyogZW5kIG9mIG9wdGlvbiBsaXN0ICovCisjZGVmaW5lCUlQT1BUX05PUAkJMQkJLyogbm8gb3BlcmF0aW9uICovCisKKyNkZWZpbmUJSVBPUFRfUlIJCTcJCS8qIHJlY29yZCBwYWNrZXQgcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfVFMJCTY4CQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSVBPUFRfU0VDVVJJVFkJCTEzMAkJLyogcHJvdmlkZSBzLGMsaCx0Y2MgKi8KKyNkZWZpbmUJSVBPUFRfTFNSUgkJMTMxCQkvKiBsb29zZSBzb3VyY2Ugcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfU0FUSUQJCTEzNgkJLyogc2F0bmV0IGlkICovCisjZGVmaW5lCUlQT1BUX1NTUlIJCTEzNwkJLyogc3RyaWN0IHNvdXJjZSByb3V0ZSAqLworCisvKgorICogT2Zmc2V0cyB0byBmaWVsZHMgaW4gb3B0aW9ucyBvdGhlciB0aGFuIEVPTCBhbmQgTk9QLgorICovCisjZGVmaW5lCUlQT1BUX09QVFZBTAkJMAkJLyogb3B0aW9uIElEICovCisjZGVmaW5lCUlQT1BUX09MRU4JCTEJCS8qIG9wdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgSVBPUFRfT0ZGU0VUCQkyCQkvKiBvZmZzZXQgd2l0aGluIG9wdGlvbiAqLworI2RlZmluZQlJUE9QVF9NSU5PRkYJCTQJCS8qIG1pbiB2YWx1ZSBvZiBhYm92ZSAqLworCisvKgorICogVGltZSBzdGFtcCBvcHRpb24gc3RydWN0dXJlLgorICovCitzdHJ1Y3QJaXBfdGltZXN0YW1wIHsKKwl1X2ludDhfdAlpcHRfY29kZTsJCS8qIElQT1BUX1RTICovCisJdV9pbnQ4X3QJaXB0X2xlbjsJCS8qIHNpemUgb2Ygc3RydWN0dXJlICh2YXJpYWJsZSkgKi8KKwl1X2ludDhfdAlpcHRfcHRyOwkJLyogaW5kZXggb2YgY3VycmVudCBlbnRyeSAqLworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisJdV9pbnQ4X3QJaXB0X29mbHc6NCwJCS8qIG92ZXJmbG93IGNvdW50ZXIgKi8KKwkJCWlwdF9mbGc6NDsJCS8qIGZsYWdzLCBzZWUgYmVsb3cgKi8KKyNlbHNlCisJdV9pbnQ4X3QJaXB0X2ZsZzo0LAkJLyogZmxhZ3MsIHNlZSBiZWxvdyAqLworCQkJaXB0X29mbHc6NDsJCS8qIG92ZXJmbG93IGNvdW50ZXIgKi8KKyNlbmRpZgorCXVuaW9uIGlwdF90aW1lc3RhbXAgeworCQluX2xvbmcJaXB0X3RpbWVbMV07CisJCXN0cnVjdAlpcHRfdGEgeworCQkJaXBhZGRyX3QgaXB0X2FkZHI7CisJCQluX2xvbmcgICBpcHRfdGltZTsKKwkJfSBpcHRfdGFbMV07CisJfSBpcHRfdGltZXN0YW1wOworfTsKKworLyogZmxhZyBiaXRzIGZvciBpcHRfZmxnICovCisjZGVmaW5lCUlQT1BUX1RTX1RTT05MWQkJMAkJLyogdGltZXN0YW1wcyBvbmx5ICovCisjZGVmaW5lCUlQT1BUX1RTX1RTQU5EQUREUgkxCQkvKiB0aW1lc3RhbXBzIGFuZCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUJSVBPUFRfVFNfUFJFU1BFQwkzCQkvKiBzcGVjaWZpZWQgbW9kdWxlcyBvbmx5ICovCisKKy8qIGJpdHMgZm9yIHNlY3VyaXR5IChub3QgYnl0ZSBzd2FwcGVkKSAqLworI2RlZmluZQlJUE9QVF9TRUNVUl9VTkNMQVNTCTB4MDAwMAorI2RlZmluZQlJUE9QVF9TRUNVUl9DT05GSUQJMHhmMTM1CisjZGVmaW5lCUlQT1BUX1NFQ1VSX0VGVE8JMHg3ODlhCisjZGVmaW5lCUlQT1BUX1NFQ1VSX01NTU0JMHhiYzRkCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1JFU1RSCTB4YWYxMworI2RlZmluZQlJUE9QVF9TRUNVUl9TRUNSRVQJMHhkNzg4CisjZGVmaW5lCUlQT1BUX1NFQ1VSX1RPUFNFQ1JFVAkweDZiYzUKKworLyoKKyAqIEludGVybmV0IGltcGxlbWVudGF0aW9uIHBhcmFtZXRlcnMuCisgKi8KKyNkZWZpbmUJTUFYVFRMCQkyNTUJCS8qIG1heGltdW0gdGltZSB0byBsaXZlIChzZWNvbmRzKSAqLworI2RlZmluZQlJUERFRlRUTAk2NAkJLyogZGVmYXVsdCB0dGwsIGZyb20gUkZDIDEzNDAgKi8KKyNkZWZpbmUJSVBGUkFHVFRMCTYwCQkvKiB0aW1lIHRvIGxpdmUgZm9yIGZyYWdzLCBzbG93aHogKi8KKyNkZWZpbmUJSVBUVExERUMJMQkJLyogc3VidHJhY3RlZCB3aGVuIGZvcndhcmRpbmcgKi8KKworI2RlZmluZQlJUF9NU1MJCTU3NgkJLyogZGVmYXVsdCBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworCisjaWYgU0laRU9GX0NIQVJfUCA9PSA0CitzdHJ1Y3QgbWJ1Zl9wdHIgeworCXN0cnVjdCBtYnVmICptcHRyOworCXVpbnQzMl90IGR1bW15OworfTsKKyNlbHNlCitzdHJ1Y3QgbWJ1Zl9wdHIgeworCXN0cnVjdCBtYnVmICptcHRyOworfTsKKyNlbmRpZgorc3RydWN0IHFsaW5rIHsKKwl2b2lkICpuZXh0LCAqcHJldjsKK307CisKKy8qCisgKiBPdmVybGF5IGZvciBpcCBoZWFkZXIgdXNlZCBieSBvdGhlciBwcm90b2NvbHMgKHRjcCwgdWRwKS4KKyAqLworc3RydWN0IGlwb3ZseSB7CisJc3RydWN0IG1idWZfcHRyIGloX21idWY7CS8qIGJhY2twb2ludGVyIHRvIG1idWYgKi8KKwl1X2ludDhfdAlpaF94MTsJCQkvKiAodW51c2VkKSAqLworCXVfaW50OF90CWloX3ByOwkJCS8qIHByb3RvY29sICovCisJdV9pbnQxNl90CWloX2xlbjsJCQkvKiBwcm90b2NvbCBsZW5ndGggKi8KKwlpcGFkZHJfdCAgICAgICAgaWhfc3JjOwkJLyogc291cmNlIGludGVybmV0IGFkZHJlc3MgKi8KKwlpcGFkZHJfdCAgICAgICAgaWhfZHN0OwkJLyogZGVzdGluYXRpb24gaW50ZXJuZXQgYWRkcmVzcyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIElwIHJlYXNzZW1ibHkgcXVldWUgc3RydWN0dXJlLiAgRWFjaCBmcmFnbWVudAorICogYmVpbmcgcmVhc3NlbWJsZWQgaXMgYXR0YWNoZWQgdG8gb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKiBUaGV5IGFyZSB0aW1lZCBvdXQgYWZ0ZXIgaXBxX3R0bCBkcm9wcyB0byAwLCBhbmQgbWF5IGFsc28KKyAqIGJlIHJlY2xhaW1lZCBpZiBtZW1vcnkgYmVjb21lcyB0aWdodC4KKyAqIHNpemUgMjggYnl0ZXMKKyAqLworc3RydWN0IGlwcSB7CisgICAgICAgIHN0cnVjdCBxbGluayBmcmFnX2xpbms7CQkJLyogdG8gaXAgaGVhZGVycyBvZiBmcmFnbWVudHMgKi8KKwlzdHJ1Y3QgcWxpbmsgaXBfbGluazsJCQkJLyogdG8gb3RoZXIgcmVhc3MgaGVhZGVycyAqLworCXVfaW50OF90CWlwcV90dGw7CQkvKiB0aW1lIGZvciByZWFzcyBxIHRvIGxpdmUgKi8KKwl1X2ludDhfdAlpcHFfcDsJCQkvKiBwcm90b2NvbCBvZiB0aGlzIGZyYWdtZW50ICovCisJdV9pbnQxNl90CWlwcV9pZDsJCQkvKiBzZXF1ZW5jZSBpZCBmb3IgcmVhc3NlbWJseSAqLworCWlwYWRkcl90ICAgICAgICBpcHFfc3JjLGlwcV9kc3Q7Cit9OworCisvKgorICogSXAgaGVhZGVyLCB3aGVuIGhvbGRpbmcgYSBmcmFnbWVudC4KKyAqCisgKiBOb3RlOiBpcGZfbGluayBtdXN0IGJlIGF0IHNhbWUgb2Zmc2V0IGFzIGZyYWdfbGluayBhYm92ZQorICovCitzdHJ1Y3QJaXBhc2ZyYWcgeworCXN0cnVjdCBxbGluayBpcGZfbGluazsKKwlzdHJ1Y3QgaXAgaXBmX2lwOworfTsKKworI2RlZmluZSBpcGZfb2ZmICAgICAgaXBmX2lwLmlwX29mZgorI2RlZmluZSBpcGZfdG9zICAgICAgaXBmX2lwLmlwX3RvcworI2RlZmluZSBpcGZfbGVuICAgICAgaXBmX2lwLmlwX2xlbgorI2RlZmluZSBpcGZfbmV4dCAgICAgaXBmX2xpbmsubmV4dAorI2RlZmluZSBpcGZfcHJldiAgICAgaXBmX2xpbmsucHJldgorCisvKgorICogU3RydWN0dXJlIHN0b3JlZCBpbiBtYnVmIGluIGlucGNiLmlwX29wdGlvbnMKKyAqIGFuZCBwYXNzZWQgdG8gaXBfb3V0cHV0IHdoZW4gaXAgb3B0aW9ucyBhcmUgaW4gdXNlLgorICogVGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIG9wdGlvbnMgKGluY2x1ZGluZyBpcG9wdF9kc3QpCisgKiBpcyBpbiBtX2xlbi4KKyAqLworI2RlZmluZSBNQVhfSVBPUFRMRU4JNDAKKworc3RydWN0IGlwb3B0aW9uIHsKKwl1X2ludDMyX3QgaXBvcHRfZHN0OwkvKiBmaXJzdC1ob3AgZHN0IGlmIHNvdXJjZSByb3V0ZWQgKi8KKwlpbnQ4X3QJICBpcG9wdF9saXN0W01BWF9JUE9QVExFTl07CS8qIG9wdGlvbnMgcHJvcGVyICovCit9OworCisjaWZkZWYgTE9HX0VOQUJMRUQKKy8qCisgKiBTdHJ1Y3R1cmUgYXR0YWNoZWQgdG8gaW5wY2IuaXBfbW9wdGlvbnMgYW5kCisgKiBwYXNzZWQgdG8gaXBfb3V0cHV0IHdoZW4gSVAgbXVsdGljYXN0IG9wdGlvbnMgYXJlIGluIHVzZS4KKyAqLworCitzdHJ1Y3QJaXBzdGF0IHsKKwl1X2xvbmcJaXBzX3RvdGFsOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAqLworCXVfbG9uZwlpcHNfYmFkc3VtOwkJLyogY2hlY2tzdW0gYmFkICovCisJdV9sb25nCWlwc190b29zaG9ydDsJCS8qIHBhY2tldCB0b28gc2hvcnQgKi8KKwl1X2xvbmcJaXBzX3Rvb3NtYWxsOwkJLyogbm90IGVub3VnaCBkYXRhICovCisJdV9sb25nCWlwc19iYWRobGVuOwkJLyogaXAgaGVhZGVyIGxlbmd0aCA8IGRhdGEgc2l6ZSAqLworCXVfbG9uZwlpcHNfYmFkbGVuOwkJLyogaXAgbGVuZ3RoIDwgaXAgaGVhZGVyIGxlbmd0aCAqLworCXVfbG9uZwlpcHNfZnJhZ21lbnRzOwkJLyogZnJhZ21lbnRzIHJlY2VpdmVkICovCisJdV9sb25nCWlwc19mcmFnZHJvcHBlZDsJLyogZnJhZ3MgZHJvcHBlZCAoZHVwcywgb3V0IG9mIHNwYWNlKSAqLworCXVfbG9uZwlpcHNfZnJhZ3RpbWVvdXQ7CS8qIGZyYWdtZW50cyB0aW1lZCBvdXQgKi8KKwl1X2xvbmcJaXBzX2ZvcndhcmQ7CQkvKiBwYWNrZXRzIGZvcndhcmRlZCAqLworCXVfbG9uZwlpcHNfY2FudGZvcndhcmQ7CS8qIHBhY2tldHMgcmN2ZCBmb3IgdW5yZWFjaGFibGUgZGVzdCAqLworCXVfbG9uZwlpcHNfcmVkaXJlY3RzZW50OwkvKiBwYWNrZXRzIGZvcndhcmRlZCBvbiBzYW1lIG5ldCAqLworCXVfbG9uZwlpcHNfbm9wcm90bzsJCS8qIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wgKi8KKwl1X2xvbmcJaXBzX2RlbGl2ZXJlZDsJCS8qIGRhdGFncmFtcyBkZWxpdmVyZWQgdG8gdXBwZXIgbGV2ZWwqLworCXVfbG9uZwlpcHNfbG9jYWxvdXQ7CQkvKiB0b3RhbCBpcCBwYWNrZXRzIGdlbmVyYXRlZCBoZXJlICovCisJdV9sb25nCWlwc19vZHJvcHBlZDsJCS8qIGxvc3QgcGFja2V0cyBkdWUgdG8gbm9idWZzLCBldGMuICovCisJdV9sb25nCWlwc19yZWFzc2VtYmxlZDsJLyogdG90YWwgcGFja2V0cyByZWFzc2VtYmxlZCBvayAqLworCXVfbG9uZwlpcHNfZnJhZ21lbnRlZDsJCS8qIGRhdGFncmFtcyBzdWNjZXNzZnVsbHkgZnJhZ21lbnRlZCAqLworCXVfbG9uZwlpcHNfb2ZyYWdtZW50czsJCS8qIG91dHB1dCBmcmFnbWVudHMgY3JlYXRlZCAqLworCXVfbG9uZwlpcHNfY2FudGZyYWc7CQkvKiBkb24ndCBmcmFnbWVudCBmbGFnIHdhcyBzZXQsIGV0Yy4gKi8KKwl1X2xvbmcJaXBzX2JhZG9wdGlvbnM7CQkvKiBlcnJvciBpbiBvcHRpb24gcHJvY2Vzc2luZyAqLworCXVfbG9uZwlpcHNfbm9yb3V0ZTsJCS8qIHBhY2tldHMgZGlzY2FyZGVkIGR1ZSB0byBubyByb3V0ZSAqLworCXVfbG9uZwlpcHNfYmFkdmVyczsJCS8qIGlwIHZlcnNpb24gIT0gNCAqLworCXVfbG9uZwlpcHNfcmF3b3V0OwkJLyogdG90YWwgcmF3IGlwIHBhY2tldHMgZ2VuZXJhdGVkICovCisJdV9sb25nCWlwc191bmFsaWduZWQ7CQkvKiB0aW1lcyB0aGUgaXAgcGFja2V0IHdhcyBub3QgYWxpZ25lZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdAlpcHN0YXQJaXBzdGF0OworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QJaXBxCWlwcTsJCQkvKiBpcCByZWFzcy4gcXVldWUgKi8KK2V4dGVybiB1X2ludDE2X3QJaXBfaWQ7CQkJCS8qIGlwIHBhY2tldCBjdHIsIGZvciBpZHMgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXBfaWNtcC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lwX2ljbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M3M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lwX2ljbXAuYwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpcF9pY21wLmMJOC4yIChCZXJrZWxleSkgMS80Lzk0CisgKiBpcF9pY21wLmMsdiAxLjcgMTk5NS8wNS8zMCAwODowOTo0MiByZ3JpbWVzIEV4cAorICovCisKKyNpbmNsdWRlICJzbGlycC5oIgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaXBhZGRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisKKyNpZmRlZiBMT0dfRU5BQkxFRAorc3RydWN0IGljbXBzdGF0IGljbXBzdGF0OworI2VuZGlmCisKKy8qIFRoZSBtZXNzYWdlIHNlbnQgd2hlbiBlbXVsYXRpbmcgUElORyAqLworLyogQmUgbmljZSBhbmQgdGVsbCB0aGVtIGl0J3MganVzdCBhIHBzZXVkby1waW5nIHBhY2tldCAqLworc3RhdGljIGNvbnN0IGNoYXIgaWNtcF9waW5nX21zZ1tdID0gIlRoaXMgaXMgYSBwc2V1ZG8tUElORyBwYWNrZXQgdXNlZCBieSBTbGlycCB0byBlbXVsYXRlIElDTVAgRUNITy1SRVFVRVNUIHBhY2tldHMuXG4iOworCisvKiBsaXN0IG9mIGFjdGlvbnMgZm9yIGljbXBfZXJyb3IoKSBvbiBSWCBvZiBhbiBpY21wIG1lc3NhZ2UgKi8KK3N0YXRpYyBjb25zdCBpbnQgaWNtcF9mbHVzaFsxOV0gPSB7CisvKiAgRUNITyBSRVBMWSAoMCkgICovICAgMCwKKwkJICAgICAgICAgMSwKKwkJICAgICAgICAgMSwKKy8qIERFU1QgVU5SRUFDSCAoMykgKi8gICAxLAorLyogU09VUkNFIFFVRU5DSCAoNCkqLyAgIDEsCisvKiBSRURJUkVDVCAoNSkgKi8gICAgICAgMSwKKwkJICAgICAgICAgMSwKKwkJICAgICAgICAgMSwKKy8qIEVDSE8gKDgpICovICAgICAgICAgICAwLAorLyogUk9VVEVSQURWRVJUICg5KSAqLyAgIDEsCisvKiBST1VURVJTT0xJQ0lUICgxMCkgKi8gMSwKKy8qIFRJTUUgRVhDRUVERUQgKDExKSAqLyAxLAorLyogUEFSQU1FVEVSIFBST0JMRU0gKDEyKSAqLyAxLAorLyogVElNRVNUQU1QICgxMykgKi8gICAgIDAsCisvKiBUSU1FU1RBTVAgUkVQTFkgKDE0KSAqLyAwLAorLyogSU5GTyAoMTUpICovICAgICAgICAgIDAsCisvKiBJTkZPIFJFUExZICgxNikgKi8gICAgMCwKKy8qIEFERFIgTUFTSyAoMTcpICovICAgICAwLAorLyogQUREUiBNQVNLIFJFUExZICgxOCkgKi8gMAorfTsKKworLyoKKyAqIFByb2Nlc3MgYSByZWNlaXZlZCBJQ01QIG1lc3NhZ2UuCisgKi8KK3ZvaWQKK2ljbXBfaW5wdXQoc3RydWN0IG1idWYgKm0sIGludCBobGVuKQoreworICByZWdpc3RlciBzdHJ1Y3QgaWNtcCAqaWNwOworICByZWdpc3RlciBzdHJ1Y3QgaXAgKmlwPW10b2QobSwgc3RydWN0IGlwICopOworICBpbnQgaWNtcGxlbj1pcC0+aXBfbGVuOworICAvKiBpbnQgY29kZTsgKi8KKworICBERUJVR19DQUxMKCJpY21wX2lucHV0Iik7CisgIERFQlVHX0FSRygibSA9ICVseCIsIChsb25nICltKTsKKyAgREVCVUdfQVJHKCJtX2xlbiA9ICVkIiwgbS0+bV9sZW4pOworCisgIFNUQVQoaWNtcHN0YXQuaWNwc19yZWNlaXZlZCsrKTsKKworICAvKgorICAgKiBMb2NhdGUgaWNtcCBzdHJ1Y3R1cmUgaW4gbWJ1ZiwgYW5kIGNoZWNrCisgICAqIHRoYXQgaXRzIG5vdCBjb3JydXB0ZWQgYW5kIG9mIGF0IGxlYXN0IG1pbmltdW0gbGVuZ3RoLgorICAgKi8KKyAgaWYgKGljbXBsZW4gPCBJQ01QX01JTkxFTikgeyAgICAgICAgICAvKiBtaW4gOCBieXRlcyBwYXlsb2FkICovCisgICAgU1RBVChpY21wc3RhdC5pY3BzX3Rvb3Nob3J0KyspOworICBmcmVlaXQ6CisgICAgbV9mcmVlbShtKTsKKyAgICBnb3RvIGVuZF9lcnJvcjsKKyAgfQorCisgIG0tPm1fbGVuIC09IGhsZW47CisgIG0tPm1fZGF0YSArPSBobGVuOworICBpY3AgPSBtdG9kKG0sIHN0cnVjdCBpY21wICopOworICBpZiAoY2tzdW0obSwgaWNtcGxlbikpIHsKKyAgICBTVEFUKGljbXBzdGF0LmljcHNfY2hlY2tzdW0rKyk7CisgICAgZ290byBmcmVlaXQ7CisgIH0KKyAgbS0+bV9sZW4gKz0gaGxlbjsKKyAgbS0+bV9kYXRhIC09IGhsZW47CisKKyAgLyoJaWNtcHN0YXQuaWNwc19pbmhpc3RbaWNwLT5pY21wX3R5cGVdKys7ICovCisgIC8qIGNvZGUgPSBpY3AtPmljbXBfY29kZTsgKi8KKworICBERUJVR19BUkcoImljbXBfdHlwZSA9ICVkIiwgaWNwLT5pY21wX3R5cGUpOworICBzd2l0Y2ggKGljcC0+aWNtcF90eXBlKSB7CisgIGNhc2UgSUNNUF9FQ0hPOgorICAgIGljcC0+aWNtcF90eXBlID0gSUNNUF9FQ0hPUkVQTFk7CisgICAgaXAtPmlwX2xlbiArPSBobGVuOwkgICAgICAgICAgICAgLyogc2luY2UgaXBfaW5wdXQgc3VidHJhY3RzIHRoaXMgKi8KKyAgICBpZiAoaXBfZ2V0aChpcC0+aXBfZHN0KSA9PSBhbGlhc19hZGRyX2lwKSB7CisgICAgICBpY21wX3JlZmxlY3QobSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBzb2NrZXQgKnNvOworICAgICAgU29ja0FkZHJlc3MgIGFkZHI7CisgICAgICB1aW50MzJfdCAgICAgYWRkcl9pcDsKKyAgICAgIHVpbnQxNl90ICAgICBhZGRyX3BvcnQ7CisKKyAgICAgIGlmICgoc28gPSBzb2NyZWF0ZSgpKSA9PSBOVUxMKSBnb3RvIGZyZWVpdDsKKyAgICAgIGlmKHVkcF9hdHRhY2goc28pID09IC0xKSB7CisJREVCVUdfTUlTQygoZGZkLCJpY21wX2lucHV0IHVkcF9hdHRhY2ggZXJybm8gPSAlZC0lc1xuIiwKKwkJICAgIGVycm5vLGVycm5vX3N0cikpOworCXNvZnJlZShzbyk7CisJbV9mcmVlKG0pOworCWdvdG8gZW5kX2Vycm9yOworICAgICAgfQorICAgICAgc28tPnNvX20gPSBtOworICAgICAgc28tPnNvX2ZhZGRyX2lwICAgPSBpcF9nZXRoKGlwLT5pcF9kc3QpOworICAgICAgc28tPnNvX2ZhZGRyX3BvcnQgPSA3OworICAgICAgc28tPnNvX2xhZGRyX2lwICAgPSBpcF9nZXRoKGlwLT5pcF9zcmMpOworICAgICAgc28tPnNvX2xhZGRyX3BvcnQgPSA5OworICAgICAgc28tPnNvX2lwdG9zID0gaXAtPmlwX3RvczsKKyAgICAgIHNvLT5zb190eXBlID0gSVBQUk9UT19JQ01QOworICAgICAgc28tPnNvX3N0YXRlID0gU1NfSVNGQ09OTkVDVEVEOworCisgICAgICAvKiBTZW5kIHRoZSBwYWNrZXQgKi8KKyAgICAgIGlmICgoc28tPnNvX2ZhZGRyX2lwICYgMHhmZmZmZmYwMCkgPT0gc3BlY2lhbF9hZGRyX2lwKSB7CisgICAgICAgIC8qIEl0J3MgYW4gYWxpYXMgKi8KKyAgICAgICAgaW50ICBsb3cgPSBzby0+c29fZmFkZHJfaXAgJiAweGZmOworCisgICAgICAgIGlmIChsb3cgPj0gQ1RMX0ROUyAmJiBsb3cgPCBDVExfRE5TICsgZG5zX2FkZHJfY291bnQpCisgICAgICAgICAgICBhZGRyX2lwID0gZG5zX2FkZHJbbG93IC0gQ1RMX0ROU107CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFkZHJfaXAgPSBsb29wYmFja19hZGRyX2lwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZHJfaXAgPSBzby0+c29fZmFkZHJfaXA7CisgICAgICB9CisgICAgICBhZGRyX3BvcnQgPSBzby0+c29fZmFkZHJfcG9ydDsKKworICAgICAgc29ja19hZGRyZXNzX2luaXRfaW5ldCggJmFkZHIsIGFkZHJfaXAsIGFkZHJfcG9ydCApOworCisgICAgICBpZihzb2NrZXRfc2VuZHRvKHNvLT5zLCBpY21wX3BpbmdfbXNnLCBzdHJsZW4oaWNtcF9waW5nX21zZyksICZhZGRyKSA8IDApIHsKKyAgICAgICAgREVCVUdfTUlTQygoZGZkLCJpY21wX2lucHV0IHVkcCBzZW5kdG8gdHggZXJybm8gPSAlZC0lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZXJybm8sZXJybm9fc3RyKSk7CisgICAgICAgIGljbXBfZXJyb3IobSwgSUNNUF9VTlJFQUNILElDTVBfVU5SRUFDSF9ORVQsIDAsZXJybm9fc3RyKTsKKyAgICAgICAgdWRwX2RldGFjaChzbyk7CisgICAgICB9CisgICAgfSAvKiBpZiBpcC0+aXBfZHN0LnNfYWRkciA9PSBhbGlhc19hZGRyLnNfYWRkciAqLworICAgIGJyZWFrOworICBjYXNlIElDTVBfVU5SRUFDSDoKKyAgICAvKiBYWFg/IHJlcG9ydCBlcnJvcj8gY2xvc2Ugc29ja2V0PyAqLworICBjYXNlIElDTVBfVElNWENFRUQ6CisgIGNhc2UgSUNNUF9QQVJBTVBST0I6CisgIGNhc2UgSUNNUF9TT1VSQ0VRVUVOQ0g6CisgIGNhc2UgSUNNUF9UU1RBTVA6CisgIGNhc2UgSUNNUF9NQVNLUkVROgorICBjYXNlIElDTVBfUkVESVJFQ1Q6CisgICAgU1RBVChpY21wc3RhdC5pY3BzX25vdHN1cHArKyk7CisgICAgbV9mcmVlbShtKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIFNUQVQoaWNtcHN0YXQuaWNwc19iYWR0eXBlKyspOworICAgIG1fZnJlZW0obSk7CisgIH0gLyogc3dpdGggKi8KKworZW5kX2Vycm9yOgorICAvKiBtIGlzIG1fZnJlZSgpJ2QgeG9yIHB1dCBpbiBhIHNvY2tldCB4b3Igb3IgZ2l2ZW4gdG8gaXBfc2VuZCAqLworICByZXR1cm47Cit9CisKKworLyoKKyAqCVNlbmQgYW4gSUNNUCBtZXNzYWdlIGluIHJlc3BvbnNlIHRvIGEgc2l0dWF0aW9uCisgKgorICoJUkZDIDExMjI6IDMuMi4yCU1VU1Qgc2VuZCBhdCBsZWFzdCB0aGUgSVAgaGVhZGVyIGFuZCA4IGJ5dGVzIG9mIGhlYWRlci4gTUFZIHNlbmQgbW9yZSAod2UgZG8pLgorICoJCQlNVVNUIE5PVCBjaGFuZ2UgdGhpcyBoZWFkZXIgaW5mb3JtYXRpb24uCisgKgkJCU1VU1QgTk9UIHJlcGx5IHRvIGEgbXVsdGljYXN0L2Jyb2FkY2FzdCBJUCBhZGRyZXNzLgorICoJCQlNVVNUIE5PVCByZXBseSB0byBhIG11bHRpY2FzdC9icm9hZGNhc3QgTUFDIGFkZHJlc3MuCisgKgkJCU1VU1QgcmVwbHkgdG8gb25seSB0aGUgZmlyc3QgZnJhZ21lbnQuCisgKi8KKy8qCisgKiBTZW5kIElDTVBfVU5SRUFDSCBiYWNrIHRvIHRoZSBzb3VyY2UgcmVnYXJkaW5nIG1zcmMuCisgKiBtYnVmICptc3JjIGlzIHVzZWQgYXMgYSB0ZW1wbGF0ZSwgYnV0IGlzIE5PVCBtX2ZyZWUoKSdkLgorICogSXQgaXMgcmVwb3J0ZWQgYXMgdGhlIGJhZCBpcCBwYWNrZXQuICBUaGUgaGVhZGVyIHNob3VsZAorICogYmUgZnVsbHkgY29ycmVjdCBhbmQgaW4gaG9zdCBieXRlIG9yZGVyLgorICogSUNNUCBmcmFnbWVudGF0aW9uIGlzIGlsbGVnYWwuICBBbGwgbWFjaGluZXMgbXVzdCBhY2NlcHQgNTc2IGJ5dGVzIGluIG9uZQorICogcGFja2V0LiAgVGhlIG1heGltdW0gcGF5bG9hZCBpcyA1NzYtMjAoaXAgaGRyKS04KGljbXAgaGRyKT01NDgKKyAqLworCisjZGVmaW5lIElDTVBfTUFYREFUQUxFTiAoSVBfTVNTLTI4KQordm9pZAoraWNtcF9lcnJvcihzdHJ1Y3QgbWJ1ZiAqbXNyYywgdV9jaGFyIHR5cGUsIHVfY2hhciBjb2RlLCBpbnQgbWluc2l6ZSwKKyAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKK3sKKyAgdW5zaWduZWQgaGxlbiwgc2hsZW4sIHNfaXBfbGVuOworICByZWdpc3RlciBzdHJ1Y3QgaXAgKmlwOworICByZWdpc3RlciBzdHJ1Y3QgaWNtcCAqaWNwOworICByZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTsKKworICBERUJVR19DQUxMKCJpY21wX2Vycm9yIik7CisgIERFQlVHX0FSRygibXNyYyA9ICVseCIsIChsb25nICltc3JjKTsKKyAgREVCVUdfQVJHKCJtc3JjX2xlbiA9ICVkIiwgbXNyYy0+bV9sZW4pOworCisgIGlmKHR5cGUhPUlDTVBfVU5SRUFDSCAmJiB0eXBlIT1JQ01QX1RJTVhDRUVEKSBnb3RvIGVuZF9lcnJvcjsKKworICAvKiBjaGVjayBtc3JjICovCisgIGlmKCFtc3JjKSBnb3RvIGVuZF9lcnJvcjsKKyAgaXAgPSBtdG9kKG1zcmMsIHN0cnVjdCBpcCAqKTsKKyNpZmRlZiBERUJVRworICB7IGNoYXIgYnVmYVsyMF0sIGJ1ZmJbMjBdOworICAgIHN0cmNweShidWZhLCBpbmV0X2lwdG9zdHIoaXBfZ2V0aChpcC0+aXBfc3JjKSkpOworICAgIHN0cmNweShidWZiLCBpbmV0X2lwdG9zdHIoaXBfZ2V0aChpcC0+aXBfZHN0KSkpOworICAgIERFQlVHX01JU0MoKGRmZCwgIiAlLjE2cyB0byAlLjE2c1xuIiwgYnVmYSwgYnVmYikpOworICB9CisjZW5kaWYKKyAgaWYoaXAtPmlwX29mZiAmIElQX09GRk1BU0spIGdvdG8gZW5kX2Vycm9yOyAgICAvKiBPbmx5IHJlcGx5IHRvIGZyYWdtZW50IDAgKi8KKworICBzaGxlbj1pcC0+aXBfaGwgPDwgMjsKKyAgc19pcF9sZW49aXAtPmlwX2xlbjsKKyAgaWYoaXAtPmlwX3AgPT0gSVBQUk9UT19JQ01QKSB7CisgICAgaWNwID0gKHN0cnVjdCBpY21wICopKChjaGFyICopaXAgKyBzaGxlbik7CisgICAgLyoKKyAgICAgKglBc3N1bWUgYW55IHVua25vd24gSUNNUCB0eXBlIGlzIGFuIGVycm9yLiBUaGlzIGlzbid0CisgICAgICoJc3BlY2lmaWVkIGJ5IHRoZSBSRkMsIGJ1dCB0aGluayBhYm91dCBpdC4uCisgICAgICovCisgICAgaWYoaWNwLT5pY21wX3R5cGU+MTggfHwgaWNtcF9mbHVzaFtpY3AtPmljbXBfdHlwZV0pIGdvdG8gZW5kX2Vycm9yOworICB9CisKKyAgLyogbWFrZSBhIGNvcHkgKi8KKyAgaWYoIShtPW1fZ2V0KCkpKSBnb3RvIGVuZF9lcnJvcjsgICAgICAgICAgICAgICAvKiBnZXQgbWJ1ZiAqLworICB7IGludCBuZXdfbV9zaXplOworICAgIG5ld19tX3NpemU9c2l6ZW9mKHN0cnVjdCBpcCApK0lDTVBfTUlOTEVOK21zcmMtPm1fbGVuK0lDTVBfTUFYREFUQUxFTjsKKyAgICBpZihuZXdfbV9zaXplPm0tPm1fc2l6ZSkgbV9pbmMobSwgbmV3X21fc2l6ZSk7CisgIH0KKyAgbWVtY3B5KG0tPm1fZGF0YSwgbXNyYy0+bV9kYXRhLCBtc3JjLT5tX2xlbik7CisgIG0tPm1fbGVuID0gbXNyYy0+bV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBtc3JjIHRvIG0gKi8KKworICAvKiBtYWtlIHRoZSBoZWFkZXIgb2YgdGhlIHJlcGx5IHBhY2tldCAqLworICBpcCAgPSBtdG9kKG0sIHN0cnVjdCBpcCAqKTsKKyAgaGxlbj0gc2l6ZW9mKHN0cnVjdCBpcCApOyAgICAgLyogbm8gb3B0aW9ucyBpbiByZXBseSAqLworCisgIC8qIGZpbGwgaW4gaWNtcCAqLworICBtLT5tX2RhdGEgKz0gaGxlbjsKKyAgbS0+bV9sZW4gLT0gaGxlbjsKKworICBpY3AgPSBtdG9kKG0sIHN0cnVjdCBpY21wICopOworCisgIGlmKG1pbnNpemUpIHNfaXBfbGVuPXNobGVuK0lDTVBfTUlOTEVOOyAgIC8qIHJldHVybiBoZWFkZXIrOGIgb25seSAqLworICBlbHNlIGlmKHNfaXBfbGVuPklDTVBfTUFYREFUQUxFTikgICAgICAgICAvKiBtYXhpbXVtIHNpemUgKi8KKyAgICBzX2lwX2xlbj1JQ01QX01BWERBVEFMRU47CisKKyAgbS0+bV9sZW49SUNNUF9NSU5MRU4rc19pcF9sZW47ICAgICAgICAvKiA4IGJ5dGVzIElDTVAgaGVhZGVyICovCisKKyAgLyogbWluLiBzaXplID0gOCtzaXplb2Yoc3RydWN0IGlwKSs4ICovCisKKyAgaWNwLT5pY21wX3R5cGUgPSB0eXBlOworICBpY3AtPmljbXBfY29kZSA9IGNvZGU7CisgIGljcC0+aWNtcF9pZCA9IDA7CisgIGljcC0+aWNtcF9zZXEgPSAwOworCisgIG1lbWNweSgmaWNwLT5pY21wX2lwLCBtc3JjLT5tX2RhdGEsIHNfaXBfbGVuKTsgICAvKiByZXBvcnQgdGhlIGlwIHBhY2tldCAqLworICBIVE9OUyhpY3AtPmljbXBfaXAuaXBfbGVuKTsKKyAgSFRPTlMoaWNwLT5pY21wX2lwLmlwX2lkKTsKKyAgSFRPTlMoaWNwLT5pY21wX2lwLmlwX29mZik7CisKKyNpZmRlZiBERUJVRworICBpZihtZXNzYWdlKSB7ICAgICAgICAgICAvKiBERUJVRyA6IGFwcGVuZCBtZXNzYWdlIHRvIElDTVAgcGFja2V0ICovCisgICAgaW50IG1lc3NhZ2VfbGVuOworICAgIGNoYXIgKmNwbnQ7CisgICAgbWVzc2FnZV9sZW49c3RybGVuKG1lc3NhZ2UpOworICAgIGlmKG1lc3NhZ2VfbGVuPklDTVBfTUFYREFUQUxFTikgbWVzc2FnZV9sZW49SUNNUF9NQVhEQVRBTEVOOworICAgIGNwbnQ9KGNoYXIgKiltLT5tX2RhdGErbS0+bV9sZW47CisgICAgbWVtY3B5KGNwbnQsIG1lc3NhZ2UsIG1lc3NhZ2VfbGVuKTsKKyAgICBtLT5tX2xlbis9bWVzc2FnZV9sZW47CisgIH0KKyNlbmRpZgorCisgIGljcC0+aWNtcF9ja3N1bSA9IDA7CisgIGljcC0+aWNtcF9ja3N1bSA9IGNrc3VtKG0sIG0tPm1fbGVuKTsKKworICBtLT5tX2RhdGEgLT0gaGxlbjsKKyAgbS0+bV9sZW4gKz0gaGxlbjsKKworICAvKiBmaWxsIGluIGlwICovCisgIGlwLT5pcF9obCA9IGhsZW4gPj4gMjsKKyAgaXAtPmlwX2xlbiA9IG0tPm1fbGVuOworCisgIGlwLT5pcF90b3M9KChpcC0+aXBfdG9zICYgMHgxRSkgfCAweEMwKTsgIC8qIGhpZ2ggcHJpb3JpdHkgZm9yIGVycm9ycyAqLworCisgIGlwLT5pcF90dGwgPSBNQVhUVEw7CisgIGlwLT5pcF9wID0gSVBQUk9UT19JQ01QOworICBpcC0+aXBfZHN0ID0gaXAtPmlwX3NyYzsgICAgLyogaXAgYWRyZXNzZXMgKi8KKyAgaXAtPmlwX3NyYyA9IGlwX3NldG4oYWxpYXNfYWRkcl9pcCk7CisKKyAgKHZvaWQgKSBpcF9vdXRwdXQoKHN0cnVjdCBzb2NrZXQgKilOVUxMLCBtKTsKKworICBTVEFUKGljbXBzdGF0LmljcHNfcmVmbGVjdCsrKTsKKworZW5kX2Vycm9yOgorICByZXR1cm47Cit9CisjdW5kZWYgSUNNUF9NQVhEQVRBTEVOCisKKy8qCisgKiBSZWZsZWN0IHRoZSBpcCBwYWNrZXQgYmFjayB0byB0aGUgc291cmNlCisgKi8KK3ZvaWQKK2ljbXBfcmVmbGVjdChzdHJ1Y3QgbWJ1ZiAqbSkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IG10b2QobSwgc3RydWN0IGlwICopOworICBpbnQgaGxlbiA9IGlwLT5pcF9obCA8PCAyOworICBpbnQgb3B0bGVuID0gaGxlbiAtIHNpemVvZihzdHJ1Y3QgaXAgKTsKKyAgcmVnaXN0ZXIgc3RydWN0IGljbXAgKmljcDsKKworICAvKgorICAgKiBTZW5kIGFuIGljbXAgcGFja2V0IGJhY2sgdG8gdGhlIGlwIGxldmVsLAorICAgKiBhZnRlciBzdXBwbHlpbmcgYSBjaGVja3N1bS4KKyAgICovCisgIG0tPm1fZGF0YSArPSBobGVuOworICBtLT5tX2xlbiAtPSBobGVuOworICBpY3AgPSBtdG9kKG0sIHN0cnVjdCBpY21wICopOworCisgIGljcC0+aWNtcF9ja3N1bSA9IDA7CisgIGljcC0+aWNtcF9ja3N1bSA9IGNrc3VtKG0sIGlwLT5pcF9sZW4gLSBobGVuKTsKKworICBtLT5tX2RhdGEgLT0gaGxlbjsKKyAgbS0+bV9sZW4gKz0gaGxlbjsKKworICAvKiBmaWxsIGluIGlwICovCisgIGlmIChvcHRsZW4gPiAwKSB7CisgICAgLyoKKyAgICAgKiBTdHJpcCBvdXQgb3JpZ2luYWwgb3B0aW9ucyBieSBjb3B5aW5nIHJlc3Qgb2YgZmlyc3QKKyAgICAgKiBtYnVmJ3MgZGF0YSBiYWNrLCBhbmQgYWRqdXN0IHRoZSBJUCBsZW5ndGguCisgICAgICovCisgICAgbWVtbW92ZSgoY2FkZHJfdCkoaXAgKyAxKSwgKGNhZGRyX3QpaXAgKyBobGVuLAorCSAgICAodW5zaWduZWQgKShtLT5tX2xlbiAtIGhsZW4pKTsKKyAgICBobGVuIC09IG9wdGxlbjsKKyAgICBpcC0+aXBfaGwgPSBobGVuID4+IDI7CisgICAgaXAtPmlwX2xlbiAtPSBvcHRsZW47CisgICAgbS0+bV9sZW4gLT0gb3B0bGVuOworICB9CisKKyAgaXAtPmlwX3R0bCA9IE1BWFRUTDsKKyAgeyAvKiBzd2FwICovCisgICAgaXBhZGRyX3QgaWNtcF9kc3Q7CisgICAgaWNtcF9kc3QgICA9IGlwLT5pcF9kc3Q7CisgICAgaXAtPmlwX2RzdCA9IGlwLT5pcF9zcmM7CisgICAgaXAtPmlwX3NyYyA9IGljbXBfZHN0OworICB9CisKKyAgKHZvaWQgKSBpcF9vdXRwdXQoKHN0cnVjdCBzb2NrZXQgKilOVUxMLCBtKTsKKworICBTVEFUKGljbXBzdGF0LmljcHNfcmVmbGVjdCsrKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pcF9pY21wLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXBfaWNtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZTQ3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXBfaWNtcC5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwX2ljbXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpcF9pY21wLmgsdiAxLjQgMTk5NS8wNS8zMCAwODowOTo0MyByZ3JpbWVzIEV4cAorICovCisKKyNpZm5kZWYgX05FVElORVRfSVBfSUNNUF9IXworI2RlZmluZSBfTkVUSU5FVF9JUF9JQ01QX0hfCisKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworLyoKKyAqIEludGVyZmFjZSBDb250cm9sIE1lc3NhZ2UgUHJvdG9jb2wgRGVmaW5pdGlvbnMuCisgKiBQZXIgUkZDIDc5MiwgU2VwdGVtYmVyIDE5ODEuCisgKi8KKwordHlwZWRlZiB1X2ludDMyX3Qgbl90aW1lOworCisvKgorICogU3RydWN0dXJlIG9mIGFuIGljbXAgaGVhZGVyLgorICovCitzdHJ1Y3QgaWNtcCB7CisJdV9jaGFyCWljbXBfdHlwZTsJCS8qIHR5cGUgb2YgbWVzc2FnZSwgc2VlIGJlbG93ICovCisJdV9jaGFyCWljbXBfY29kZTsJCS8qIHR5cGUgc3ViIGNvZGUgKi8KKwl1X3Nob3J0CWljbXBfY2tzdW07CQkvKiBvbmVzIGNvbXBsZW1lbnQgY2tzdW0gb2Ygc3RydWN0ICovCisJdW5pb24geworCQl1X2NoYXIgICAgaWhfcHB0cjsJCQkvKiBJQ01QX1BBUkFNUFJPQiAqLworCQlpcGFkZHJfdCAgaWhfZ3dhZGRyOwkvKiBJQ01QX1JFRElSRUNUICovCisJCXN0cnVjdCBpaF9pZHNlcSB7CisJCQl1X3Nob3J0CWljZF9pZDsKKwkJCXVfc2hvcnQJaWNkX3NlcTsKKwkJfSBpaF9pZHNlcTsKKwkJaW50IGloX3ZvaWQ7CisKKwkJLyogSUNNUF9VTlJFQUNIX05FRURGUkFHIC0tIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KKwkJc3RydWN0IGloX3BtdHUgeworCQkJdV9zaG9ydCBpcG1fdm9pZDsKKwkJCXVfc2hvcnQgaXBtX25leHRtdHU7CisJCX0gaWhfcG10dTsKKwl9IGljbXBfaHVuOworI2RlZmluZQlpY21wX3BwdHIJaWNtcF9odW4uaWhfcHB0cgorI2RlZmluZQlpY21wX2d3YWRkcglpY21wX2h1bi5paF9nd2FkZHIKKyNkZWZpbmUJaWNtcF9pZAkJaWNtcF9odW4uaWhfaWRzZXEuaWNkX2lkCisjZGVmaW5lCWljbXBfc2VxCWljbXBfaHVuLmloX2lkc2VxLmljZF9zZXEKKyNkZWZpbmUJaWNtcF92b2lkCWljbXBfaHVuLmloX3ZvaWQKKyNkZWZpbmUJaWNtcF9wbXZvaWQJaWNtcF9odW4uaWhfcG10dS5pcG1fdm9pZAorI2RlZmluZQlpY21wX25leHRtdHUJaWNtcF9odW4uaWhfcG10dS5pcG1fbmV4dG10dQorCXVuaW9uIHsKKwkJc3RydWN0IGlkX3RzIHsKKwkJCW5fdGltZSBpdHNfb3RpbWU7CisJCQluX3RpbWUgaXRzX3J0aW1lOworCQkJbl90aW1lIGl0c190dGltZTsKKwkJfSBpZF90czsKKwkJc3RydWN0IGlkX2lwICB7CisJCQlzdHJ1Y3QgaXAgaWRpX2lwOworCQkJLyogb3B0aW9ucyBhbmQgdGhlbiA2NCBiaXRzIG9mIGRhdGEgKi8KKwkJfSBpZF9pcDsKKwkJdWludDMyX3QJaWRfbWFzazsKKwkJY2hhcgkJaWRfZGF0YVsxXTsKKwl9IGljbXBfZHVuOworI2RlZmluZQlpY21wX290aW1lCWljbXBfZHVuLmlkX3RzLml0c19vdGltZQorI2RlZmluZQlpY21wX3J0aW1lCWljbXBfZHVuLmlkX3RzLml0c19ydGltZQorI2RlZmluZQlpY21wX3R0aW1lCWljbXBfZHVuLmlkX3RzLml0c190dGltZQorI2RlZmluZQlpY21wX2lwCQlpY21wX2R1bi5pZF9pcC5pZGlfaXAKKyNkZWZpbmUJaWNtcF9tYXNrCWljbXBfZHVuLmlkX21hc2sKKyNkZWZpbmUJaWNtcF9kYXRhCWljbXBfZHVuLmlkX2RhdGEKK307CisKKy8qCisgKiBMb3dlciBib3VuZHMgb24gcGFja2V0IGxlbmd0aHMgZm9yIHZhcmlvdXMgdHlwZXMuCisgKiBGb3IgdGhlIGVycm9yIGFkdmljZSBwYWNrZXRzIG11c3QgZmlyc3QgaW5zdXJlIHRoYXQgdGhlCisgKiBwYWNrZXQgaXMgbGFyZ2UgZW5vdWdodCB0byBjb250YWluIHRoZSByZXR1cm5lZCBpcCBoZWFkZXIuCisgKiBPbmx5IHRoZW4gY2FuIHdlIGRvIHRoZSBjaGVjayB0byBzZWUgaWYgNjQgYml0cyBvZiBwYWNrZXQKKyAqIGRhdGEgaGF2ZSBiZWVuIHJldHVybmVkLCBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZAorICogaXAgaGVhZGVyIGxlbmd0aC4KKyAqLworI2RlZmluZQlJQ01QX01JTkxFTgk4CQkJCS8qIGFicyBtaW5pbXVtICovCisjZGVmaW5lCUlDTVBfVFNMRU4JKDggKyAzICogc2l6ZW9mIChuX3RpbWUpKQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSUNNUF9NQVNLTEVOCTEyCQkJCS8qIGFkZHJlc3MgbWFzayAqLworI2RlZmluZQlJQ01QX0FEVkxFTk1JTgkoOCArIHNpemVvZiAoc3RydWN0IGlwKSArIDgpCS8qIG1pbiAqLworI2RlZmluZQlJQ01QX0FEVkxFTihwKQkoOCArICgocCktPmljbXBfaXAuaXBfaGwgPDwgMikgKyA4KQorCS8qIE4uQi46IG11c3Qgc2VwYXJhdGVseSBjaGVjayB0aGF0IGlwX2hsID49IDUgKi8KKworLyoKKyAqIERlZmluaXRpb24gb2YgdHlwZSBhbmQgY29kZSBmaWVsZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJSUNNUF9FQ0hPUkVQTFkJCTAJCS8qIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNICQkzCQkvKiBkZXN0IHVucmVhY2hhYmxlLCBjb2RlczogKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVQJMAkJLyogYmFkIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1QJMQkJLyogYmFkIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QUk9UT0NPTAkyCQkvKiBiYWQgcHJvdG9jb2wgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QT1JUCTMJCS8qIGJhZCBwb3J0ICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfTkVFREZSQUcJNAkJLyogSVBfREYgY2F1c2VkIGRyb3AgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9TUkNGQUlMCTUJCS8qIHNyYyByb3V0ZSBmYWlsZWQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVRfVU5LTk9XTiA2CQkvKiB1bmtub3duIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiA3CQkvKiB1bmtub3duIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9JU09MQVRFRAk4CQkvKiBzcmMgaG9zdCBpc29sYXRlZCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX05FVF9QUk9ISUIJOQkJLyogcHJvaGliaXRlZCBhY2Nlc3MgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiAxMAkJLyogZGl0dG8gKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9UT1NORVQJMTEJCS8qIGJhZCB0b3MgZm9yIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX1RPU0hPU1QJMTIJCS8qIGJhZCB0b3MgZm9yIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9TT1VSQ0VRVUVOQ0gJNAkJLyogcGFja2V0IGxvc3QsIHNsb3cgZG93biAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUCQk1CQkvKiBzaG9ydGVyIHJvdXRlLCBjb2RlczogKi8KKyNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfTkVUCTAJCS8qIGZvciBuZXR3b3JrICovCisjZGVmaW5lCQlJQ01QX1JFRElSRUNUX0hPU1QJMQkJLyogZm9yIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfVE9TTkVUCTIJCS8qIGZvciB0b3MgYW5kIG5ldCAqLworI2RlZmluZQkJSUNNUF9SRURJUkVDVF9UT1NIT1NUCTMJCS8qIGZvciB0b3MgYW5kIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9FQ0hPCQk4CQkvKiBlY2hvIHNlcnZpY2UgKi8KKyNkZWZpbmUJSUNNUF9ST1VURVJBRFZFUlQJOQkJLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUJSUNNUF9ST1VURVJTT0xJQ0lUCTEwCQkvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCisjZGVmaW5lCUlDTVBfVElNWENFRUQJCTExCQkvKiB0aW1lIGV4Y2VlZGVkLCBjb2RlOiAqLworI2RlZmluZQkJSUNNUF9USU1YQ0VFRF9JTlRSQU5TCTAJCS8qIHR0bD09MCBpbiB0cmFuc2l0ICovCisjZGVmaW5lCQlJQ01QX1RJTVhDRUVEX1JFQVNTCTEJCS8qIHR0bD09MCBpbiByZWFzcyAqLworI2RlZmluZQlJQ01QX1BBUkFNUFJPQgkJMTIJCS8qIGlwIGhlYWRlciBiYWQgKi8KKyNkZWZpbmUJCUlDTVBfUEFSQU1QUk9CX09QVEFCU0VOVCAxCQkvKiByZXEuIG9wdC4gYWJzZW50ICovCisjZGVmaW5lCUlDTVBfVFNUQU1QCQkxMwkJLyogdGltZXN0YW1wIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9UU1RBTVBSRVBMWQkxNAkJLyogdGltZXN0YW1wIHJlcGx5ICovCisjZGVmaW5lCUlDTVBfSVJFUQkJMTUJCS8qIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9JUkVRUkVQTFkJCTE2CQkvKiBpbmZvcm1hdGlvbiByZXBseSAqLworI2RlZmluZQlJQ01QX01BU0tSRVEJCTE3CQkvKiBhZGRyZXNzIG1hc2sgcmVxdWVzdCAqLworI2RlZmluZQlJQ01QX01BU0tSRVBMWQkJMTgJCS8qIGFkZHJlc3MgbWFzayByZXBseSAqLworCisjZGVmaW5lCUlDTVBfTUFYVFlQRQkJMTgKKworI2RlZmluZQlJQ01QX0lORk9UWVBFKHR5cGUpIFwKKwkoKHR5cGUpID09IElDTVBfRUNIT1JFUExZIHx8ICh0eXBlKSA9PSBJQ01QX0VDSE8gfHwgXAorCSh0eXBlKSA9PSBJQ01QX1JPVVRFUkFEVkVSVCB8fCAodHlwZSkgPT0gSUNNUF9ST1VURVJTT0xJQ0lUIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9UU1RBTVAgfHwgKHR5cGUpID09IElDTVBfVFNUQU1QUkVQTFkgfHwgXAorCSh0eXBlKSA9PSBJQ01QX0lSRVEgfHwgKHR5cGUpID09IElDTVBfSVJFUVJFUExZIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9NQVNLUkVRIHx8ICh0eXBlKSA9PSBJQ01QX01BU0tSRVBMWSkKKwordm9pZCBpY21wX2lucHV0IF9QKChzdHJ1Y3QgbWJ1ZiAqLCBpbnQpKTsKK3ZvaWQgaWNtcF9lcnJvcihzdHJ1Y3QgbWJ1ZiAqbXNyYywgdV9jaGFyIHR5cGUsIHVfY2hhciBjb2RlLCBpbnQgbWluc2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlKTsKK3ZvaWQgaWNtcF9yZWZsZWN0IF9QKChzdHJ1Y3QgbWJ1ZiAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lwX2lucHV0LmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvaXBfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM1MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lwX2lucHV0LmMKQEAgLTAsMCArMSw3MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXBfaW5wdXQuYwk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqIGlwX2lucHV0LmMsdiAxLjExIDE5OTQvMTEvMTYgMTA6MTc6MDggamtoIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisjaW5jbHVkZSA8cWVtdS9vc2RlcC5oPgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKworI2lmZGVmIExPR19FTkFCTEVECitzdHJ1Y3QgaXBzdGF0IGlwc3RhdDsKKyNlbmRpZgorCitzdHJ1Y3QgaXBxIGlwcTsKKworc3RhdGljIHN0cnVjdCBpcCAqaXBfcmVhc3MocmVnaXN0ZXIgc3RydWN0IGlwICppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcHEgKmZwKTsKK3N0YXRpYyB2b2lkIGlwX2ZyZWVmKHN0cnVjdCBpcHEgKmZwKTsKK3N0YXRpYyB2b2lkIGlwX2VucShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnAsCisgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwYXNmcmFnICpwcmV2KTsKK3N0YXRpYyB2b2lkIGlwX2RlcShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnApOworCisvKgorICogSVAgaW5pdGlhbGl6YXRpb246IGZpbGwgaW4gSVAgcHJvdG9jb2wgc3dpdGNoIHRhYmxlLgorICogQWxsIHByb3RvY29scyBub3QgaW1wbGVtZW50ZWQgaW4ga2VybmVsIGdvIHRvIHJhdyBJUCBwcm90b2NvbCBoYW5kbGVyLgorICovCit2b2lkCitpcF9pbml0KHZvaWQpCit7CisJaXBxLmlwX2xpbmsubmV4dCA9IGlwcS5pcF9saW5rLnByZXYgPSAmaXBxLmlwX2xpbms7CisJaXBfaWQgPSB0dC50dl9zZWMgJiAweGZmZmY7CisJdWRwX2luaXQoKTsKKwl0Y3BfaW5pdCgpOworfQorCisvKgorICogSXAgaW5wdXQgcm91dGluZS4gIENoZWNrc3VtIGFuZCBieXRlIHN3YXAgaGVhZGVyLiAgSWYgZnJhZ21lbnRlZAorICogdHJ5IHRvIHJlYXNzZW1ibGUuICBQcm9jZXNzIG9wdGlvbnMuICBQYXNzIHRvIG5leHQgbGV2ZWwuCisgKi8KK3ZvaWQKK2lwX2lucHV0KHN0cnVjdCBtYnVmICptKQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CisJaW50IGhsZW47CisKKwlERUJVR19DQUxMKCJpcF9pbnB1dCIpOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygibV9sZW4gPSAlZCIsIG0tPm1fbGVuKTsKKworCVNUQVQoaXBzdGF0Lmlwc190b3RhbCsrKTsKKworCWlmIChtLT5tX2xlbiA8IChpbnQpc2l6ZW9mIChzdHJ1Y3QgaXApKSB7CisJCVNUQVQoaXBzdGF0Lmlwc190b29zbWFsbCsrKTsKKwkJcmV0dXJuOworCX0KKworCWlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisKKwlpZiAoaXAtPmlwX3YgIT0gSVBWRVJTSU9OKSB7CisJCVNUQVQoaXBzdGF0Lmlwc19iYWR2ZXJzKyspOworCQlnb3RvIGJhZDsKKwl9CisKKwlobGVuID0gaXAtPmlwX2hsIDw8IDI7CisJaWYgKGhsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaXAgKSB8fCBobGVuPm0tPm1fbGVuKSB7LyogbWluIGhlYWRlciBsZW5ndGggKi8KKwkgIFNUQVQoaXBzdGF0Lmlwc19iYWRobGVuKyspOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yIHBhY2tldCB0b28gc2hvcnQgKi8KKwkgIGdvdG8gYmFkOworCX0KKworICAgICAgICAvKiBrZWVwIGlwIGhlYWRlciBpbnRhY3QgZm9yIElDTVAgcmVwbHkKKwkgKiBpcC0+aXBfc3VtID0gY2tzdW0obSwgaGxlbik7CisJICogaWYgKGlwLT5pcF9zdW0pIHsKKwkgKi8KKwlpZihja3N1bShtLGhsZW4pKSB7CisJICBTVEFUKGlwc3RhdC5pcHNfYmFkc3VtKyspOworCSAgZ290byBiYWQ7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IGZpZWxkcyB0byBob3N0IHJlcHJlc2VudGF0aW9uLgorCSAqLworCU5UT0hTKGlwLT5pcF9sZW4pOworCWlmIChpcC0+aXBfbGVuIDwgaGxlbikgeworCQlTVEFUKGlwc3RhdC5pcHNfYmFkbGVuKyspOworCQlnb3RvIGJhZDsKKwl9CisJTlRPSFMoaXAtPmlwX2lkKTsKKwlOVE9IUyhpcC0+aXBfb2ZmKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlcnMKKwkgKiBpcyBhcyBhdCBsZWFzdCBtdWNoIGFzIHRoZSBJUCBoZWFkZXIgd291bGQgaGF2ZSB1cyBleHBlY3QuCisJICogVHJpbSBtYnVmcyBpZiBsb25nZXIgdGhhbiB3ZSBleHBlY3QuCisJICogRHJvcCBwYWNrZXQgaWYgc2hvcnRlciB0aGFuIHdlIGV4cGVjdC4KKwkgKi8KKwlpZiAobS0+bV9sZW4gPCBpcC0+aXBfbGVuKSB7CisJCVNUQVQoaXBzdGF0Lmlwc190b29zaG9ydCsrKTsKKwkJZ290byBiYWQ7CisJfQorCisgICAgaWYgKHNsaXJwX3Jlc3RyaWN0KSB7CisgICAgICAgIGlmIChpcF9nZXRoKGlwLT5pcF9kc3QpICE9IHNwZWNpYWxfYWRkcl9pcCkgeworICAgICAgICAgICAgaWYgKGlwX2dldG4oaXAtPmlwX2RzdCkgPT0gMHhmZmZmZmZmZnUgJiYgaXAtPmlwX3AgIT0gSVBQUk9UT19VRFApCisgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaG9zdCA9IGlwX2dldGgoaXAtPmlwX2RzdCkgJiAweGZmOworICAgICAgICAgICAgc3RydWN0IGV4X2xpc3QgKmV4X3B0cjsKKworICAgICAgICAgICAgaWYgKGhvc3QgPT0gMHhmZikKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKworICAgICAgICAgICAgZm9yIChleF9wdHIgPSBleGVjX2xpc3Q7IGV4X3B0cjsgZXhfcHRyID0gZXhfcHRyLT5leF9uZXh0KQorICAgICAgICAgICAgICAgIGlmIChleF9wdHItPmV4X2FkZHIgPT0gaG9zdCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmICghZXhfcHRyKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisgICAgfQorCisJLyogU2hvdWxkIGRyb3AgcGFja2V0IGlmIG1idWYgdG9vIGxvbmc/IGhtbW0uLi4gKi8KKwlpZiAobS0+bV9sZW4gPiBpcC0+aXBfbGVuKQorCSAgIG1fYWRqKG0sIGlwLT5pcF9sZW4gLSBtLT5tX2xlbik7CisKKwkvKiBjaGVjayBpcF90dGwgZm9yIGEgY29ycmVjdCBJQ01QIHJlcGx5ICovCisJaWYoaXAtPmlwX3R0bD09MCB8fCBpcC0+aXBfdHRsPT0xKSB7CisJICBpY21wX2Vycm9yKG0sIElDTVBfVElNWENFRUQsSUNNUF9USU1YQ0VFRF9JTlRSQU5TLCAwLCJ0dGwiKTsKKwkgIGdvdG8gYmFkOworCX0KKworCS8qCisJICogUHJvY2VzcyBvcHRpb25zIGFuZCwgaWYgbm90IGRlc3RpbmVkIGZvciB1cywKKwkgKiBzaGlwIGl0IG9uLiAgaXBfZG9vcHRpb25zIHJldHVybnMgMSB3aGVuIGFuCisJICogZXJyb3Igd2FzIGRldGVjdGVkIChjYXVzaW5nIGFuIGljbXAgbWVzc2FnZQorCSAqIHRvIGJlIHNlbnQgYW5kIHRoZSBvcmlnaW5hbCBwYWNrZXQgdG8gYmUgZnJlZWQpLgorCSAqLworLyogV2UgZG8gbm8gSVAgb3B0aW9ucyAqLworLyoJaWYgKGhsZW4gPiBzaXplb2YgKHN0cnVjdCBpcCkgJiYgaXBfZG9vcHRpb25zKG0pKQorICoJCWdvdG8gbmV4dDsKKyAqLworCS8qCisJICogSWYgb2Zmc2V0IG9yIElQX01GIGFyZSBzZXQsIG11c3QgcmVhc3NlbWJsZS4KKwkgKiBPdGhlcndpc2UsIG5vdGhpbmcgbmVlZCBiZSBkb25lLgorCSAqIChXZSBjb3VsZCBsb29rIGluIHRoZSByZWFzc2VtYmx5IHF1ZXVlIHRvIHNlZQorCSAqIGlmIHRoZSBwYWNrZXQgd2FzIHByZXZpb3VzbHkgZnJhZ21lbnRlZCwKKwkgKiBidXQgaXQncyBub3Qgd29ydGggdGhlIHRpbWU7IGp1c3QgbGV0IHRoZW0gdGltZSBvdXQuKQorCSAqCisJICogWFhYIFRoaXMgc2hvdWxkIGZhaWwsIGRvbid0IGZyYWdtZW50IHlldAorCSAqLworCWlmIChpcC0+aXBfb2ZmICZ+IElQX0RGKSB7CisJICByZWdpc3RlciBzdHJ1Y3QgaXBxICpmcDsKKyAgICAgIHN0cnVjdCBxbGluayAqbDsKKwkJLyoKKwkJICogTG9vayBmb3IgcXVldWUgb2YgZnJhZ21lbnRzCisJCSAqIG9mIHRoaXMgZGF0YWdyYW0uCisJCSAqLworCQlmb3IgKGwgPSBpcHEuaXBfbGluay5uZXh0OyBsICE9ICZpcHEuaXBfbGluazsgbCA9IGwtPm5leHQpIHsKKyAgICAgICAgICAgIGZwID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBpcHEsIGlwX2xpbmspOworICAgICAgICAgICAgaWYgKGlwLT5pcF9pZCA9PSBmcC0+aXBxX2lkICYmCisJCSAgICAgIGlwX2VxdWFsKGlwLT5pcF9zcmMsIGZwLT5pcHFfc3JjKSAmJgorCQkgICAgICBpcF9lcXVhbChpcC0+aXBfZHN0LCBmcC0+aXBxX2RzdCkgJiYKKwkJICAgICAgaXAtPmlwX3AgPT0gZnAtPmlwcV9wKQorCQkgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgICAgICBmcCA9IE5VTEw7CisJZm91bmQ6CisKKwkJLyoKKwkJICogQWRqdXN0IGlwX2xlbiB0byBub3QgcmVmbGVjdCBoZWFkZXIsCisJCSAqIHNldCBpcF9tZmYgaWYgbW9yZSBmcmFnbWVudHMgYXJlIGV4cGVjdGVkLAorCQkgKiBjb252ZXJ0IG9mZnNldCBvZiB0aGlzIHRvIGJ5dGVzLgorCQkgKi8KKwkJaXAtPmlwX2xlbiAtPSBobGVuOworCQlpZiAoaXAtPmlwX29mZiAmIElQX01GKQorCQkgIGlwLT5pcF90b3MgfD0gMTsKKwkJZWxzZQorCQkgIGlwLT5pcF90b3MgJj0gfjE7CisKKwkJaXAtPmlwX29mZiA8PD0gMzsKKworCQkvKgorCQkgKiBJZiBkYXRhZ3JhbSBtYXJrZWQgYXMgaGF2aW5nIG1vcmUgZnJhZ21lbnRzCisJCSAqIG9yIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdCBmcmFnbWVudCwKKwkJICogYXR0ZW1wdCByZWFzc2VtYmx5OyBpZiBpdCBzdWNjZWVkcywgcHJvY2VlZC4KKwkJICovCisJCWlmIChpcC0+aXBfdG9zICYgMSB8fCBpcC0+aXBfb2ZmKSB7CisJCQlTVEFUKGlwc3RhdC5pcHNfZnJhZ21lbnRzKyspOworCQkJaXAgPSBpcF9yZWFzcyhpcCwgZnApOworCQkJaWYgKGlwID09IE5VTEwpCisJCQkJcmV0dXJuOworCQkJU1RBVChpcHN0YXQuaXBzX3JlYXNzZW1ibGVkKyspOworCQkJbSA9IGR0b20oaXApOworCQl9IGVsc2UKKwkJCWlmIChmcCkKKwkJICAgCSAgIGlwX2ZyZWVmKGZwKTsKKworCX0gZWxzZQorCQlpcC0+aXBfbGVuIC09IGhsZW47CisKKwkvKgorCSAqIFN3aXRjaCBvdXQgdG8gcHJvdG9jb2wncyBpbnB1dCByb3V0aW5lLgorCSAqLworCVNUQVQoaXBzdGF0Lmlwc19kZWxpdmVyZWQrKyk7CisJc3dpdGNoIChpcC0+aXBfcCkgeworCSBjYXNlIElQUFJPVE9fVENQOgorCQl0Y3BfaW5wdXQobSwgaGxlbiwgKHN0cnVjdCBzb2NrZXQgKilOVUxMKTsKKwkJYnJlYWs7CisJIGNhc2UgSVBQUk9UT19VRFA6CisJCXVkcF9pbnB1dChtLCBobGVuKTsKKwkJYnJlYWs7CisJIGNhc2UgSVBQUk9UT19JQ01QOgorCQlpY21wX2lucHV0KG0sIGhsZW4pOworCQlicmVhazsKKwkgZGVmYXVsdDoKKwkJU1RBVChpcHN0YXQuaXBzX25vcHJvdG8rKyk7CisJCW1fZnJlZShtKTsKKwl9CisJcmV0dXJuOworYmFkOgorCW1fZnJlZW0obSk7CisJcmV0dXJuOworfQorCisjZGVmaW5lIGlwdG9mcmFnKFApICgoc3RydWN0IGlwYXNmcmFnICopKCgoY2hhciopKFApKSAtIHNpemVvZihzdHJ1Y3QgcWxpbmspKSkKKyNkZWZpbmUgZnJhZ3RvaXAoUCkgKChzdHJ1Y3QgaXAqKSgoKGNoYXIqKShQKSkgKyBzaXplb2Yoc3RydWN0IHFsaW5rKSkpCisvKgorICogVGFrZSBpbmNvbWluZyBkYXRhZ3JhbSBmcmFnbWVudCBhbmQgdHJ5IHRvCisgKiByZWFzc2VtYmxlIGl0IGludG8gd2hvbGUgZGF0YWdyYW0uICBJZiBhIGNoYWluIGZvcgorICogcmVhc3NlbWJseSBvZiB0aGlzIGRhdGFncmFtIGFscmVhZHkgZXhpc3RzLCB0aGVuIGl0CisgKiBpcyBnaXZlbiBhcyBmcDsgb3RoZXJ3aXNlIGhhdmUgdG8gbWFrZSBhIGNoYWluLgorICovCitzdGF0aWMgc3RydWN0IGlwICoKK2lwX3JlYXNzKHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXAsIHJlZ2lzdGVyIHN0cnVjdCBpcHEgKmZwKQoreworCXJlZ2lzdGVyIHN0cnVjdCBtYnVmICptID0gZHRvbShpcCk7CisJcmVnaXN0ZXIgc3RydWN0IGlwYXNmcmFnICpxOworCWludCBobGVuID0gaXAtPmlwX2hsIDw8IDI7CisJaW50IGksIG5leHQ7CisKKwlERUJVR19DQUxMKCJpcF9yZWFzcyIpOworCURFQlVHX0FSRygiaXAgPSAlbHgiLCAobG9uZylpcCk7CisJREVCVUdfQVJHKCJmcCA9ICVseCIsIChsb25nKWZwKTsKKwlERUJVR19BUkcoIm0gPSAlbHgiLCAobG9uZyltKTsKKworCS8qCisJICogUHJlc2VuY2Ugb2YgaGVhZGVyIHNpemVzIGluIG1idWZzCisJICogd291bGQgY29uZnVzZSBjb2RlIGJlbG93LgorICAgICAgICAgKiBGcmFnbWVudCBtX2RhdGEgaXMgY29uY2F0ZW5hdGVkLgorCSAqLworCW0tPm1fZGF0YSArPSBobGVuOworCW0tPm1fbGVuIC09IGhsZW47CisKKwkvKgorCSAqIElmIGZpcnN0IGZyYWdtZW50IHRvIGFycml2ZSwgY3JlYXRlIGEgcmVhc3NlbWJseSBxdWV1ZS4KKwkgKi8KKyAgICBpZiAoZnAgPT0gTlVMTCkgeworCSAgc3RydWN0IG1idWYgKnQ7CisJICBpZiAoKHQgPSBtX2dldCgpKSA9PSBOVUxMKSBnb3RvIGRyb3BmcmFnOworCSAgZnAgPSBtdG9kKHQsIHN0cnVjdCBpcHEgKik7CisJICBpbnNxdWUoJmZwLT5pcF9saW5rLCAmaXBxLmlwX2xpbmspOworCSAgZnAtPmlwcV90dGwgPSBJUEZSQUdUVEw7CisJICBmcC0+aXBxX3AgPSBpcC0+aXBfcDsKKwkgIGZwLT5pcHFfaWQgPSBpcC0+aXBfaWQ7CisJICBmcC0+ZnJhZ19saW5rLm5leHQgPSBmcC0+ZnJhZ19saW5rLnByZXYgPSAmZnAtPmZyYWdfbGluazsKKwkgIGZwLT5pcHFfc3JjID0gaXAtPmlwX3NyYzsKKwkgIGZwLT5pcHFfZHN0ID0gaXAtPmlwX2RzdDsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopZnA7CisJICBnb3RvIGluc2VydDsKKwl9CisKKwkvKgorCSAqIEZpbmQgYSBzZWdtZW50IHdoaWNoIGJlZ2lucyBhZnRlciB0aGlzIG9uZSBkb2VzLgorCSAqLworCWZvciAocSA9IGZwLT5mcmFnX2xpbmsubmV4dDsgcSAhPSAoc3RydWN0IGlwYXNmcmFnICopJmZwLT5mcmFnX2xpbms7CisgICAgICAgICAgICBxID0gcS0+aXBmX25leHQpCisJCWlmIChxLT5pcGZfb2ZmID4gaXAtPmlwX29mZikKKwkJCWJyZWFrOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHByZWNlZGluZyBzZWdtZW50LCBpdCBtYXkgcHJvdmlkZSBzb21lIG9mCisJICogb3VyIGRhdGEgYWxyZWFkeS4gIElmIHNvLCBkcm9wIHRoZSBkYXRhIGZyb20gdGhlIGluY29taW5nCisJICogc2VnbWVudC4gIElmIGl0IHByb3ZpZGVzIGFsbCBvZiBvdXIgZGF0YSwgZHJvcCB1cy4KKwkgKi8KKwlpZiAocS0+aXBmX3ByZXYgIT0gJmZwLT5mcmFnX2xpbmspIHsKKyAgICAgICAgc3RydWN0IGlwYXNmcmFnICpwcSA9IHEtPmlwZl9wcmV2OworCQlpID0gcHEtPmlwZl9vZmYgKyBwcS0+aXBmX2xlbiAtIGlwLT5pcF9vZmY7CisJCWlmIChpID4gMCkgeworCQkJaWYgKGkgPj0gaXAtPmlwX2xlbikKKwkJCQlnb3RvIGRyb3BmcmFnOworCQkJbV9hZGooZHRvbShpcCksIGkpOworCQkJaXAtPmlwX29mZiArPSBpOworCQkJaXAtPmlwX2xlbiAtPSBpOworCQl9CisJfQorCisJLyoKKwkgKiBXaGlsZSB3ZSBvdmVybGFwIHN1Y2NlZWRpbmcgc2VnbWVudHMgdHJpbSB0aGVtIG9yLAorCSAqIGlmIHRoZXkgYXJlIGNvbXBsZXRlbHkgY292ZXJlZCwgZGVxdWV1ZSB0aGVtLgorCSAqLworCXdoaWxlIChxICE9IChzdHJ1Y3QgaXBhc2ZyYWcqKSZmcC0+ZnJhZ19saW5rICYmCisgICAgICAgICAgICBpcC0+aXBfb2ZmICsgaXAtPmlwX2xlbiA+IHEtPmlwZl9vZmYpIHsKKwkJaSA9IChpcC0+aXBfb2ZmICsgaXAtPmlwX2xlbikgLSBxLT5pcGZfb2ZmOworCQlpZiAoaSA8IHEtPmlwZl9sZW4pIHsKKwkJCXEtPmlwZl9sZW4gLT0gaTsKKwkJCXEtPmlwZl9vZmYgKz0gaTsKKwkJCW1fYWRqKGR0b20ocSksIGkpOworCQkJYnJlYWs7CisJCX0KKwkJcSA9IHEtPmlwZl9uZXh0OworCQltX2ZyZWVtKGR0b20ocS0+aXBmX3ByZXYpKTsKKwkJaXBfZGVxKHEtPmlwZl9wcmV2KTsKKwl9CisKK2luc2VydDoKKwkvKgorCSAqIFN0aWNrIG5ldyBzZWdtZW50IGluIGl0cyBwbGFjZTsKKwkgKiBjaGVjayBmb3IgY29tcGxldGUgcmVhc3NlbWJseS4KKwkgKi8KKwlpcF9lbnEoaXB0b2ZyYWcoaXApLCBxLT5pcGZfcHJldik7CisJbmV4dCA9IDA7CisJZm9yIChxID0gZnAtPmZyYWdfbGluay5uZXh0OyBxICE9IChzdHJ1Y3QgaXBhc2ZyYWcqKSZmcC0+ZnJhZ19saW5rOworICAgICAgICAgICAgcSA9IHEtPmlwZl9uZXh0KSB7CisJCWlmIChxLT5pcGZfb2ZmICE9IG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkJbmV4dCArPSBxLT5pcGZfbGVuOworCX0KKwlpZiAoKChzdHJ1Y3QgaXBhc2ZyYWcgKikocS0+aXBmX3ByZXYpKS0+aXBmX3RvcyAmIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIFJlYXNzZW1ibHkgaXMgY29tcGxldGU7IGNvbmNhdGVuYXRlIGZyYWdtZW50cy4KKwkgKi8KKyAgICBxID0gZnAtPmZyYWdfbGluay5uZXh0OworCW0gPSBkdG9tKHEpOworCisJcSA9IChzdHJ1Y3QgaXBhc2ZyYWcgKikgcS0+aXBmX25leHQ7CisJd2hpbGUgKHEgIT0gKHN0cnVjdCBpcGFzZnJhZyopJmZwLT5mcmFnX2xpbmspIHsKKwkgIHN0cnVjdCBtYnVmICp0ID0gZHRvbShxKTsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopIHEtPmlwZl9uZXh0OworCSAgbV9jYXQobSwgdCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgaGVhZGVyIGZvciBuZXcgaXAgcGFja2V0IGJ5CisJICogbW9kaWZ5aW5nIGhlYWRlciBvZiBmaXJzdCBwYWNrZXQ7CisJICogZGVxdWV1ZSBhbmQgZGlzY2FyZCBmcmFnbWVudCByZWFzc2VtYmx5IGhlYWRlci4KKwkgKiBNYWtlIGhlYWRlciB2aXNpYmxlLgorCSAqLworCXEgPSBmcC0+ZnJhZ19saW5rLm5leHQ7CisKKwkvKgorCSAqIElmIHRoZSBmcmFnbWVudHMgY29uY2F0ZW5hdGVkIHRvIGFuIG1idWYgdGhhdCdzCisJICogYmlnZ2VyIHRoYW4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZyYWdtZW50LCB0aGVuIGFuZAorCSAqIG1fZXh0IGJ1ZmZlciB3YXMgYWxsb2NlZC4gQnV0IGZwLT5pcHFfbmV4dCBwb2ludHMgdG8KKwkgKiB0aGUgb2xkIGJ1ZmZlciAoaW4gdGhlIG1idWYpLCBzbyB3ZSBtdXN0IHBvaW50IGlwCisJICogaW50byB0aGUgbmV3IGJ1ZmZlci4KKwkgKi8KKwlpZiAobS0+bV9mbGFncyAmIE1fRVhUKSB7CisJICBpbnQgZGVsdGEgPSAoY2hhciAqKXEgLSBtLT5tX2RhdDsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopKG0tPm1fZXh0ICsgZGVsdGEpOworCX0KKworCS8qIERFQlVHX0FSRygiaXAgPSAlbHgiLCAobG9uZylpcCk7CisJICogaXA9KHN0cnVjdCBpcGFzZnJhZyAqKW0tPm1fZGF0YTsgKi8KKworICAgIGlwID0gZnJhZ3RvaXAocSk7CisJaXAtPmlwX2xlbiA9IG5leHQ7CisJaXAtPmlwX3RvcyAmPSB+MTsKKwlpcC0+aXBfc3JjID0gZnAtPmlwcV9zcmM7CisJaXAtPmlwX2RzdCA9IGZwLT5pcHFfZHN0OworCXJlbXF1ZSgmZnAtPmlwX2xpbmspOworCSh2b2lkKSBtX2ZyZWUoZHRvbShmcCkpOworCW0tPm1fbGVuICs9IChpcC0+aXBfaGwgPDwgMik7CisJbS0+bV9kYXRhIC09IChpcC0+aXBfaGwgPDwgMik7CisKKwlyZXR1cm4gaXA7CisKK2Ryb3BmcmFnOgorCVNUQVQoaXBzdGF0Lmlwc19mcmFnZHJvcHBlZCsrKTsKKwltX2ZyZWVtKG0pOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogRnJlZSBhIGZyYWdtZW50IHJlYXNzZW1ibHkgaGVhZGVyIGFuZCBhbGwKKyAqIGFzc29jaWF0ZWQgZGF0YWdyYW1zLgorICovCitzdGF0aWMgdm9pZAoraXBfZnJlZWYoc3RydWN0IGlwcSAqZnApCit7CisJcmVnaXN0ZXIgc3RydWN0IGlwYXNmcmFnICpxLCAqcDsKKworCWZvciAocSA9IGZwLT5mcmFnX2xpbmsubmV4dDsgcSAhPSAoc3RydWN0IGlwYXNmcmFnKikmZnAtPmZyYWdfbGluazsgcSA9IHApIHsKKwkJcCA9IHEtPmlwZl9uZXh0OworCQlpcF9kZXEocSk7CisJCW1fZnJlZW0oZHRvbShxKSk7CisJfQorCXJlbXF1ZSgmZnAtPmlwX2xpbmspOworCSh2b2lkKSBtX2ZyZWUoZHRvbShmcCkpOworfQorCisvKgorICogUHV0IGFuIGlwIGZyYWdtZW50IG9uIGEgcmVhc3NlbWJseSBjaGFpbi4KKyAqIExpa2UgaW5zcXVlLCBidXQgcG9pbnRlcnMgaW4gbWlkZGxlIG9mIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2lwX2VucShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnAsIHJlZ2lzdGVyIHN0cnVjdCBpcGFzZnJhZyAqcHJldikKK3sKKwlERUJVR19DQUxMKCJpcF9lbnEiKTsKKwlERUJVR19BUkcoInByZXYgPSAlbHgiLCAobG9uZylwcmV2KTsKKwlwLT5pcGZfcHJldiA9ICBwcmV2OworCXAtPmlwZl9uZXh0ID0gcHJldi0+aXBmX25leHQ7CisJKChzdHJ1Y3QgaXBhc2ZyYWcgKikocHJldi0+aXBmX25leHQpKS0+aXBmX3ByZXYgPSBwOworCXByZXYtPmlwZl9uZXh0ID0gcDsKK30KKworLyoKKyAqIFRvIGlwX2VucSBhcyByZW1xdWUgaXMgdG8gaW5zcXVlLgorICovCitzdGF0aWMgdm9pZAoraXBfZGVxKHJlZ2lzdGVyIHN0cnVjdCBpcGFzZnJhZyAqcCkKK3sKKwkoKHN0cnVjdCBpcGFzZnJhZyAqKShwLT5pcGZfcHJldikpLT5pcGZfbmV4dCA9IHAtPmlwZl9uZXh0OworCSgoc3RydWN0IGlwYXNmcmFnICopKHAtPmlwZl9uZXh0KSktPmlwZl9wcmV2ID0gcC0+aXBmX3ByZXY7Cit9CisKKy8qCisgKiBJUCB0aW1lciBwcm9jZXNzaW5nOworICogaWYgYSB0aW1lciBleHBpcmVzIG9uIGEgcmVhc3NlbWJseQorICogcXVldWUsIGRpc2NhcmQgaXQuCisgKi8KK3ZvaWQKK2lwX3Nsb3d0aW1vKHZvaWQpCit7CisgICAgc3RydWN0IHFsaW5rICpsOworCisJREVCVUdfQ0FMTCgiaXBfc2xvd3RpbW8iKTsKKworICAgIGwgPSBpcHEuaXBfbGluay5uZXh0OworCisgICAgaWYgKGwgPT0gTlVMTCkKKwkgICByZXR1cm47CisKKwl3aGlsZSAobCAhPSAmaXBxLmlwX2xpbmspIHsKKyAgICAgICAgc3RydWN0IGlwcSAqZnAgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGlwcSwgaXBfbGluayk7CisgICAgICAgIGwgPSBsLT5uZXh0OworCQlpZiAoLS1mcC0+aXBxX3R0bCA9PSAwKSB7CisJCQlTVEFUKGlwc3RhdC5pcHNfZnJhZ3RpbWVvdXQrKyk7CisJCQlpcF9mcmVlZihmcCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBEbyBvcHRpb24gcHJvY2Vzc2luZyBvbiBhIGRhdGFncmFtLAorICogcG9zc2libHkgZGlzY2FyZGluZyBpdCBpZiBiYWQgb3B0aW9ucyBhcmUgZW5jb3VudGVyZWQsCisgKiBvciBmb3J3YXJkaW5nIGl0IGlmIHNvdXJjZS1yb3V0ZWQuCisgKiBSZXR1cm5zIDEgaWYgcGFja2V0IGhhcyBiZWVuIGZvcndhcmRlZC9mcmVlZCwKKyAqIDAgaWYgdGhlIHBhY2tldCBzaG91bGQgYmUgcHJvY2Vzc2VkIGZ1cnRoZXIuCisgKi8KKworI2lmZGVmIG5vdGRlZgorCitpbnQKK2lwX2Rvb3B0aW9ucyhtKQorCXN0cnVjdCBtYnVmICptOworeworCXJlZ2lzdGVyIHN0cnVjdCBpcCAqaXAgPSBtdG9kKG0sIHN0cnVjdCBpcCAqKTsKKwlyZWdpc3RlciB1X2NoYXIgKmNwOworCXJlZ2lzdGVyIHN0cnVjdCBpcF90aW1lc3RhbXAgKmlwdDsKKwlyZWdpc3RlciBzdHJ1Y3QgaW5faWZhZGRyICppYTsKKy8qCWludCBvcHQsIG9wdGxlbiwgY250LCBvZmYsIGNvZGUsIHR5cGUgPSBJQ01QX1BBUkFNUFJPQiwgZm9yd2FyZCA9IDA7ICovCisJaW50IG9wdCwgb3B0bGVuLCBjbnQsIG9mZiwgY29kZSwgdHlwZSwgZm9yd2FyZCA9IDA7CisJaXBhZGRyX3QgKnNpbiwgZHN0OwordHlwZWRlZiB1X2ludDMyX3Qgbl90aW1lOworCW5fdGltZSBudGltZTsKKworCWRzdCA9IGlwLT5pcF9kc3Q7CisJY3AgPSAodV9jaGFyICopKGlwICsgMSk7CisJY250ID0gKGlwLT5pcF9obCA8PCAyKSAtIHNpemVvZiAoc3RydWN0IGlwKTsKKwlmb3IgKDsgY250ID4gMDsgY250IC09IG9wdGxlbiwgY3AgKz0gb3B0bGVuKSB7CisJCW9wdCA9IGNwW0lQT1BUX09QVFZBTF07CisJCWlmIChvcHQgPT0gSVBPUFRfRU9MKQorCQkJYnJlYWs7CisJCWlmIChvcHQgPT0gSVBPUFRfTk9QKQorCQkJb3B0bGVuID0gMTsKKwkJZWxzZSB7CisJCQlvcHRsZW4gPSBjcFtJUE9QVF9PTEVOXTsKKwkJCWlmIChvcHRsZW4gPD0gMCB8fCBvcHRsZW4gPiBjbnQpIHsKKwkJCQljb2RlID0gJmNwW0lQT1BUX09MRU5dIC0gKHVfY2hhciAqKWlwOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisJCXN3aXRjaCAob3B0KSB7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFNvdXJjZSByb3V0aW5nIHdpdGggcmVjb3JkLgorCQkgKiBGaW5kIGludGVyZmFjZSB3aXRoIGN1cnJlbnQgZGVzdGluYXRpb24gYWRkcmVzcy4KKwkJICogSWYgbm9uZSBvbiB0aGlzIG1hY2hpbmUgdGhlbiBkcm9wIGlmIHN0cmljdGx5IHJvdXRlZCwKKwkJICogb3IgZG8gbm90aGluZyBpZiBsb29zZWx5IHJvdXRlZC4KKwkJICogUmVjb3JkIGludGVyZmFjZSBhZGRyZXNzIGFuZCBicmluZyB1cCBuZXh0IGFkZHJlc3MKKwkJICogY29tcG9uZW50LiAgSWYgc3RyaWN0bHkgcm91dGVkIG1ha2Ugc3VyZSBuZXh0CisJCSAqIGFkZHJlc3MgaXMgb24gZGlyZWN0bHkgYWNjZXNzaWJsZSBuZXQuCisJCSAqLworCQljYXNlIElQT1BUX0xTUlI6CisJCWNhc2UgSVBPUFRfU1NSUjoKKwkJCWlmICgob2ZmID0gY3BbSVBPUFRfT0ZGU0VUXSkgPCBJUE9QVF9NSU5PRkYpIHsKKwkJCQljb2RlID0gJmNwW0lQT1BUX09GRlNFVF0gLSAodV9jaGFyICopaXA7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpcGFkZHIuc2luX2FkZHIgPSBpcC0+aXBfZHN0OworCQkJaWEgPSAoc3RydWN0IGluX2lmYWRkciAqKQorCQkJCWlmYV9pZndpdGhhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmaXBhZGRyKTsKKwkJCWlmIChpYSA9PSAwKSB7CisJCQkJaWYgKG9wdCA9PSBJUE9QVF9TU1JSKSB7CisJCQkJCXR5cGUgPSBJQ01QX1VOUkVBQ0g7CisJCQkJCWNvZGUgPSBJQ01QX1VOUkVBQ0hfU1JDRkFJTDsKKwkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJCS8qCisJCQkJICogTG9vc2Ugcm91dGluZywgYW5kIG5vdCBhdCBuZXh0IGRlc3RpbmF0aW9uCisJCQkJICogeWV0OyBub3RoaW5nIHRvIGRvIGV4Y2VwdCBmb3J3YXJkLgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJb2ZmLS07CQkJLyAqIDAgb3JpZ2luICogIC8KKwkJCWlmIChvZmYgPiBvcHRsZW4gLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCQkJLyoKKwkJCQkgKiBFbmQgb2Ygc291cmNlIHJvdXRlLiAgU2hvdWxkIGJlIGZvciB1cy4KKwkJCQkgKi8KKwkJCQlzYXZlX3J0ZShjcCwgaXAtPmlwX3NyYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogbG9jYXRlIG91dGdvaW5nIGludGVyZmFjZQorCQkJICovCisJCQliY29weSgoY2FkZHJfdCkoY3AgKyBvZmYpLCAoY2FkZHJfdCkmaXBhZGRyLnNpbl9hZGRyLAorCQkJICAgIHNpemVvZihpcGFkZHIuc2luX2FkZHIpKTsKKwkJCWlmIChvcHQgPT0gSVBPUFRfU1NSUikgeworI2RlZmluZQlJTkEJc3RydWN0IGluX2lmYWRkciAqCisjZGVmaW5lCVNBCXN0cnVjdCBzb2NrYWRkciAqCisgCQkJICAgIGlmICgoaWEgPSAoSU5BKWlmYV9pZndpdGhkc3RhZGRyKChTQSkmaXBhZGRyKSkgPT0gMCkKKwkJCQlpYSA9IChJTkEpaWZhX2lmd2l0aG5ldCgoU0EpJmlwYWRkcik7CisJCQl9IGVsc2UKKwkJCQlpYSA9IGlwX3J0YWRkcihpcGFkZHIuc2luX2FkZHIpOworCQkJaWYgKGlhID09IDApIHsKKwkJCQl0eXBlID0gSUNNUF9VTlJFQUNIOworCQkJCWNvZGUgPSBJQ01QX1VOUkVBQ0hfU1JDRkFJTDsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlwLT5pcF9kc3QgPSBpcGFkZHIuc2luX2FkZHI7CisJCQliY29weSgoY2FkZHJfdCkmKElBX1NJTihpYSktPnNpbl9hZGRyKSwKKwkJCSAgICAoY2FkZHJfdCkoY3AgKyBvZmYpLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCWNwW0lQT1BUX09GRlNFVF0gKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCS8qCisJCQkgKiBMZXQgaXBfaW50cidzIG1jYXN0IHJvdXRpbmcgY2hlY2sgaGFuZGxlIG1jYXN0IHBrdHMKKwkJCSAqLworCQkJZm9yd2FyZCA9ICFJTl9NVUxUSUNBU1QobnRvaGwoaXAtPmlwX2RzdC5zX2FkZHIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBPUFRfUlI6CisJCQlpZiAoKG9mZiA9IGNwW0lQT1BUX09GRlNFVF0pIDwgSVBPUFRfTUlOT0ZGKSB7CisJCQkJY29kZSA9ICZjcFtJUE9QVF9PRkZTRVRdIC0gKHVfY2hhciAqKWlwOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJLyoKKwkJCSAqIElmIG5vIHNwYWNlIHJlbWFpbnMsIGlnbm9yZS4KKwkJCSAqLworCQkJb2ZmLS07CQkJICogMCBvcmlnaW4gKgorCQkJaWYgKG9mZiA+IG9wdGxlbiAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCisJCQkJYnJlYWs7CisJCQliY29weSgoY2FkZHJfdCkoJmlwLT5pcF9kc3QpLCAoY2FkZHJfdCkmaXBhZGRyLnNpbl9hZGRyLAorCQkJICAgIHNpemVvZihpcGFkZHIuc2luX2FkZHIpKTsKKwkJCS8qCisJCQkgKiBsb2NhdGUgb3V0Z29pbmcgaW50ZXJmYWNlOyBpZiB3ZSdyZSB0aGUgZGVzdGluYXRpb24sCisJCQkgKiB1c2UgdGhlIGluY29taW5nIGludGVyZmFjZSAoc2hvdWxkIGJlIHNhbWUpLgorCQkJICovCisJCQlpZiAoKGlhID0gKElOQSlpZmFfaWZ3aXRoYWRkcigoU0EpJmlwYWRkcikpID09IDAgJiYKKwkJCSAgICAoaWEgPSBpcF9ydGFkZHIoaXBhZGRyLnNpbl9hZGRyKSkgPT0gMCkgeworCQkJCXR5cGUgPSBJQ01QX1VOUkVBQ0g7CisJCQkJY29kZSA9IElDTVBfVU5SRUFDSF9IT1NUOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJYmNvcHkoKGNhZGRyX3QpJihJQV9TSU4oaWEpLT5zaW5fYWRkciksCisJCQkgICAgKGNhZGRyX3QpKGNwICsgb2ZmKSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQljcFtJUE9QVF9PRkZTRVRdICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCQlicmVhazsKKworCQljYXNlIElQT1BUX1RTOgorCQkJY29kZSA9IGNwIC0gKHVfY2hhciAqKWlwOworCQkJaXB0ID0gKHN0cnVjdCBpcF90aW1lc3RhbXAgKiljcDsKKwkJCWlmIChpcHQtPmlwdF9sZW4gPCA1KQorCQkJCWdvdG8gYmFkOworCQkJaWYgKGlwdC0+aXB0X3B0ciA+IGlwdC0+aXB0X2xlbiAtIHNpemVvZiAoaW50MzJfdCkpIHsKKwkJCQlpZiAoKytpcHQtPmlwdF9vZmx3ID09IDApCisJCQkJCWdvdG8gYmFkOworCQkJCWJyZWFrOworCQkJfQorCQkJc2luID0gKHN0cnVjdCBpbl9hZGRyICopKGNwICsgaXB0LT5pcHRfcHRyIC0gMSk7CisJCQlzd2l0Y2ggKGlwdC0+aXB0X2ZsZykgeworCisJCQljYXNlIElQT1BUX1RTX1RTT05MWToKKwkJCQlicmVhazsKKworCQkJY2FzZSBJUE9QVF9UU19UU0FOREFERFI6CisJCQkJaWYgKGlwdC0+aXB0X3B0ciArIHNpemVvZihuX3RpbWUpICsKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSA+IGlwdC0+aXB0X2xlbikKKwkJCQkJZ290byBiYWQ7CisJCQkJaXBhZGRyLnNpbl9hZGRyID0gZHN0OworCQkJCWlhID0gKElOQSlpZmFvZl8gaSBmIHAgZm9yYWRkcigoU0EpJmlwYWRkciwKKwkJCQkJCQkgICAgbS0+bV9wa3RoZHIucmN2aWYpOworCQkJCWlmIChpYSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQliY29weSgoY2FkZHJfdCkmSUFfU0lOKGlhKS0+c2luX2FkZHIsCisJCQkJICAgIChjYWRkcl90KXNpbiwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQkJaXB0LT5pcHRfcHRyICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSVBPUFRfVFNfUFJFU1BFQzoKKwkJCQlpZiAoaXB0LT5pcHRfcHRyICsgc2l6ZW9mKG5fdGltZSkgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpID4gaXB0LT5pcHRfbGVuKQorCQkJCQlnb3RvIGJhZDsKKwkJCQliY29weSgoY2FkZHJfdClzaW4sIChjYWRkcl90KSZpcGFkZHIuc2luX2FkZHIsCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQkJCWlmIChpZmFfaWZ3aXRoYWRkcigoU0EpJmlwYWRkcikgPT0gMCkKKwkJCQkJY29udGludWU7CisJCQkJaXB0LT5pcHRfcHRyICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQludGltZSA9IGlwdGltZSgpOworCQkJYmNvcHkoKGNhZGRyX3QpJm50aW1lLCAoY2FkZHJfdCljcCArIGlwdC0+aXB0X3B0ciAtIDEsCisJCQkgICAgc2l6ZW9mKG5fdGltZSkpOworCQkJaXB0LT5pcHRfcHRyICs9IHNpemVvZihuX3RpbWUpOworCQl9CisJfQorCWlmIChmb3J3YXJkKSB7CisJCWlwX2ZvcndhcmQobSwgMSk7CisJCXJldHVybiAoMSk7CisJfQorCQl9CisJfQorCXJldHVybiAoMCk7CitiYWQ6CisJLyogaXAtPmlwX2xlbiAtPSBpcC0+aXBfaGwgPDwgMjsgICBYWFggaWNtcF9lcnJvciBhZGRzIGluIGhkciBsZW5ndGggKi8KKworLyogTm90IHlldCAqLworIAlpY21wX2Vycm9yKG0sIHR5cGUsIGNvZGUsIDAsIDApOworCisJU1RBVChpcHN0YXQuaXBzX2JhZG9wdGlvbnMrKyk7CisJcmV0dXJuICgxKTsKK30KKworI2VuZGlmIC8qIG5vdGRlZiAqLworCisvKgorICogU3RyaXAgb3V0IElQIG9wdGlvbnMsIGF0IGhpZ2hlcgorICogbGV2ZWwgcHJvdG9jb2wgaW4gdGhlIGtlcm5lbC4KKyAqIFNlY29uZCBhcmd1bWVudCBpcyBidWZmZXIgdG8gd2hpY2ggb3B0aW9ucworICogd2lsbCBiZSBtb3ZlZCwgYW5kIHJldHVybiB2YWx1ZSBpcyB0aGVpciBsZW5ndGguCisgKiAoWFhYKSBzaG91bGQgYmUgZGVsZXRlZDsgbGFzdCBhcmcgY3VycmVudGx5IGlnbm9yZWQuCisgKi8KK3ZvaWQKK2lwX3N0cmlwb3B0aW9ucyhyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbSwgc3RydWN0IG1idWYgKm1vcHQpCit7CisJcmVnaXN0ZXIgaW50IGk7CisJc3RydWN0IGlwICppcCA9IG10b2QobSwgc3RydWN0IGlwICopOworCXJlZ2lzdGVyIGNhZGRyX3Qgb3B0czsKKwlpbnQgb2xlbjsKKworCW9sZW4gPSAoaXAtPmlwX2hsPDwyKSAtIHNpemVvZiAoc3RydWN0IGlwKTsKKwlvcHRzID0gKGNhZGRyX3QpKGlwICsgMSk7CisJaSA9IG0tPm1fbGVuIC0gKHNpemVvZiAoc3RydWN0IGlwKSArIG9sZW4pOworCW1lbWNweShvcHRzLCBvcHRzICArIG9sZW4sICh1bnNpZ25lZClpKTsKKwltLT5tX2xlbiAtPSBvbGVuOworCisJaXAtPmlwX2hsID0gc2l6ZW9mKHN0cnVjdCBpcCkgPj4gMjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pcF9vdXRwdXQuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9pcF9vdXRwdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNlNTIwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL2lwX291dHB1dC5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwX291dHB1dC5jCTguMyAoQmVya2VsZXkpIDEvMjEvOTQKKyAqIGlwX291dHB1dC5jLHYgMS45IDE5OTQvMTEvMTYgMTA6MTc6MTAgamtoIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKK3VfaW50MTZfdCBpcF9pZDsKKworLyogTnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIGJlZm9yZSB3ZSBzdGFydCBzZW5kaW5nCisgKiAodG8gcHJldmVudCBhbGxvY2luZyB0b28gbWFueSBtYnVmcykgKi8KKyNkZWZpbmUgSUZfVEhSRVNIIDEwCisKKy8qCisgKiBJUCBvdXRwdXQuICBUaGUgcGFja2V0IGluIG1idWYgY2hhaW4gbSBjb250YWlucyBhIHNrZWxldGFsIElQCisgKiBoZWFkZXIgKHdpdGggbGVuLCBvZmYsIHR0bCwgcHJvdG8sIHRvcywgc3JjLCBkc3QpLgorICogVGhlIG1idWYgY2hhaW4gY29udGFpbmluZyB0aGUgcGFja2V0IHdpbGwgYmUgZnJlZWQuCisgKiBUaGUgbWJ1ZiBvcHQsIGlmIHByZXNlbnQsIHdpbGwgbm90IGJlIGZyZWVkLgorICovCitpbnQKK2lwX291dHB1dChzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IG1idWYgKm0wKQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm0gPSBtMDsKKwlyZWdpc3RlciBpbnQgaGxlbiA9IHNpemVvZihzdHJ1Y3QgaXAgKTsKKwlpbnQgbGVuLCBvZmYsIGVycm9yID0gMDsKKworCURFQlVHX0NBTEwoImlwX291dHB1dCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtMCA9ICVseCIsIChsb25nKW0wKTsKKworCS8qIFdlIGRvIG5vIG9wdGlvbnMgKi8KKy8qCWlmIChvcHQpIHsKKyAqCQltID0gaXBfaW5zZXJ0b3B0aW9ucyhtLCBvcHQsICZsZW4pOworICoJCWhsZW4gPSBsZW47CisgKgl9CisgKi8KKwlpcCA9IG10b2QobSwgc3RydWN0IGlwICopOworCS8qCisJICogRmlsbCBpbiBJUCBoZWFkZXIuCisJICovCisJaXAtPmlwX3YgPSBJUFZFUlNJT047CisJaXAtPmlwX29mZiAmPSBJUF9ERjsKKwlpcC0+aXBfaWQgPSBodG9ucyhpcF9pZCsrKTsKKwlpcC0+aXBfaGwgPSBobGVuID4+IDI7CisJU1RBVChpcHN0YXQuaXBzX2xvY2Fsb3V0KyspOworCisJLyoKKwkgKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGFueSBjaGFuY2UgYXQgYWxsIG9mIGJlaW5nIGFibGUgdG8gcXVldWUKKwkgKiAgICAgIHRoZSBwYWNrZXQgb3IgcGFja2V0IGZyYWdtZW50cworCSAqLworCS8qIFhYWCBIbW1tLi4uICovCisvKglpZiAoaWZfcXVldWVkID4gSUZfVEhSRVNIICYmIHRvd3JpdGUgPD0gMCkgeworICoJCWVycm9yID0gRU5PQlVGUzsKKyAqCQlnb3RvIGJhZDsKKyAqCX0KKyAqLworCisJLyoKKwkgKiBJZiBzbWFsbCBlbm91Z2ggZm9yIGludGVyZmFjZSwgY2FuIGp1c3Qgc2VuZCBkaXJlY3RseS4KKwkgKi8KKwlpZiAoKHVfaW50MTZfdClpcC0+aXBfbGVuIDw9IElGX01UVSkgeworCQlpcC0+aXBfbGVuID0gaHRvbnMoKHVfaW50MTZfdClpcC0+aXBfbGVuKTsKKwkJaXAtPmlwX29mZiA9IGh0b25zKCh1X2ludDE2X3QpaXAtPmlwX29mZik7CisJCWlwLT5pcF9zdW0gPSAwOworCQlpcC0+aXBfc3VtID0gY2tzdW0obSwgaGxlbik7CisKKwkJaWZfb3V0cHV0KHNvLCBtKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogVG9vIGxhcmdlIGZvciBpbnRlcmZhY2U7IGZyYWdtZW50IGlmIHBvc3NpYmxlLgorCSAqIE11c3QgYmUgYWJsZSB0byBwdXQgYXQgbGVhc3QgOCBieXRlcyBwZXIgZnJhZ21lbnQuCisJICovCisJaWYgKGlwLT5pcF9vZmYgJiBJUF9ERikgeworCQllcnJvciA9IC0xOworCQlTVEFUKGlwc3RhdC5pcHNfY2FudGZyYWcrKyk7CisJCWdvdG8gYmFkOworCX0KKworCWxlbiA9IChJRl9NVFUgLSBobGVuKSAmfiA3OyAgICAgICAvKiBpcCBkYXRhYnl0ZXMgcGVyIHBhY2tldCAqLworCWlmIChsZW4gPCA4KSB7CisJCWVycm9yID0gLTE7CisJCWdvdG8gYmFkOworCX0KKworICAgIHsKKwlpbnQgbWhsZW4sIGZpcnN0bGVuID0gbGVuOworCXN0cnVjdCBtYnVmICoqbW5leHQgPSAmbS0+bV9uZXh0cGt0OworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggbGVuZ3RoIG9mIHNlZ21lbnQgYWZ0ZXIgZmlyc3QgZnJhZ21lbnQsCisJICogbWFrZSBuZXcgaGVhZGVyIGFuZCBjb3B5IGRhdGEgb2YgZWFjaCBwYXJ0IGFuZCBsaW5rIG9udG8gY2hhaW4uCisJICovCisJbTAgPSBtOworCW1obGVuID0gc2l6ZW9mIChzdHJ1Y3QgaXApOworCWZvciAob2ZmID0gaGxlbiArIGxlbjsgb2ZmIDwgKHVfaW50MTZfdClpcC0+aXBfbGVuOyBvZmYgKz0gbGVuKSB7CisJICByZWdpc3RlciBzdHJ1Y3QgaXAgKm1oaXA7CisJICBtID0gbV9nZXQoKTsKKyAgICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisJICAgIGVycm9yID0gLTE7CisJICAgIFNUQVQoaXBzdGF0Lmlwc19vZHJvcHBlZCsrKTsKKwkgICAgZ290byBzZW5kb3JmcmVlOworCSAgfQorCSAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisJICBtaGlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJICAqbWhpcCA9ICppcDsKKworCQkvKiBObyBvcHRpb25zICovCisvKgkJaWYgKGhsZW4gPiBzaXplb2YgKHN0cnVjdCBpcCkpIHsKKyAqCQkJbWhsZW4gPSBpcF9vcHRjb3B5KGlwLCBtaGlwKSArIHNpemVvZiAoc3RydWN0IGlwKTsKKyAqCQkJbWhpcC0+aXBfaGwgPSBtaGxlbiA+PiAyOworICoJCX0KKyAqLworCSAgbS0+bV9sZW4gPSBtaGxlbjsKKwkgIG1oaXAtPmlwX29mZiA9ICgob2ZmIC0gaGxlbikgPj4gMykgKyAoaXAtPmlwX29mZiAmIH5JUF9NRik7CisJICBpZiAoaXAtPmlwX29mZiAmIElQX01GKQorCSAgICBtaGlwLT5pcF9vZmYgfD0gSVBfTUY7CisJICBpZiAob2ZmICsgbGVuID49ICh1X2ludDE2X3QpaXAtPmlwX2xlbikKKwkgICAgbGVuID0gKHVfaW50MTZfdClpcC0+aXBfbGVuIC0gb2ZmOworCSAgZWxzZQorCSAgICBtaGlwLT5pcF9vZmYgfD0gSVBfTUY7CisJICBtaGlwLT5pcF9sZW4gPSBodG9ucygodV9pbnQxNl90KShsZW4gKyBtaGxlbikpOworCisJICBpZiAobV9jb3B5KG0sIG0wLCBvZmYsIGxlbikgPCAwKSB7CisJICAgIGVycm9yID0gLTE7CisJICAgIGdvdG8gc2VuZG9yZnJlZTsKKwkgIH0KKworCSAgbWhpcC0+aXBfb2ZmID0gaHRvbnMoKHVfaW50MTZfdCltaGlwLT5pcF9vZmYpOworCSAgbWhpcC0+aXBfc3VtID0gMDsKKwkgIG1oaXAtPmlwX3N1bSA9IGNrc3VtKG0sIG1obGVuKTsKKwkgICptbmV4dCA9IG07CisJICBtbmV4dCA9ICZtLT5tX25leHRwa3Q7CisJICBTVEFUKGlwc3RhdC5pcHNfb2ZyYWdtZW50cysrKTsKKwl9CisJLyoKKwkgKiBVcGRhdGUgZmlyc3QgZnJhZ21lbnQgYnkgdHJpbW1pbmcgd2hhdCdzIGJlZW4gY29waWVkIG91dAorCSAqIGFuZCB1cGRhdGluZyBoZWFkZXIsIHRoZW4gc2VuZCBlYWNoIGZyYWdtZW50IChpbiBvcmRlcikuCisJICovCisJbSA9IG0wOworCW1fYWRqKG0sIGhsZW4gKyBmaXJzdGxlbiAtICh1X2ludDE2X3QpaXAtPmlwX2xlbik7CisJaXAtPmlwX2xlbiA9IGh0b25zKCh1X2ludDE2X3QpbS0+bV9sZW4pOworCWlwLT5pcF9vZmYgPSBodG9ucygodV9pbnQxNl90KShpcC0+aXBfb2ZmIHwgSVBfTUYpKTsKKwlpcC0+aXBfc3VtID0gMDsKKwlpcC0+aXBfc3VtID0gY2tzdW0obSwgaGxlbik7CitzZW5kb3JmcmVlOgorCWZvciAobSA9IG0wOyBtOyBtID0gbTApIHsKKwkJbTAgPSBtLT5tX25leHRwa3Q7CisgICAgICAgICAgICAgICAgbS0+bV9uZXh0cGt0ID0gTlVMTDsKKwkJaWYgKGVycm9yID09IDApCisJCQlpZl9vdXRwdXQoc28sIG0pOworCQllbHNlCisJCQltX2ZyZWVtKG0pOworCX0KKworCWlmIChlcnJvciA9PSAwKQorCQlTVEFUKGlwc3RhdC5pcHNfZnJhZ21lbnRlZCsrKTsKKyAgICB9CisKK2RvbmU6CisJcmV0dXJuIChlcnJvcik7CisKK2JhZDoKKwltX2ZyZWVtKG0wKTsKKwlnb3RvIGRvbmU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbGlic2xpcnAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9saWJzbGlycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWFjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbGlic2xpcnAuaApAQCAtMCwwICsxLDEyNSBAQAorI2lmbmRlZiBfTElCU0xJUlBfSAorI2RlZmluZSBfTElCU0xJUlBfSAorCisjaW5jbHVkZSAic2xpcnAuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZmRlZiBfV0lOMzIKKyMgIGlmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjICAgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjICBlbmRpZgorIyAgZGVmaW5lIHNvY2tldF9jbG9zZSAgd2luc29jazJfc29ja2V0X2Nsb3NlMworIyAgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgIHVuZGVmIHNvY2tldF9jbG9zZQorI2Vsc2UKKyMgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBtYnVmOworCit2b2lkIHNsaXJwX2luaXQoaW50IHJlc3RyaWN0ZWQsIGNvbnN0IGNoYXIgKnNwZWNpYWxfaXApOworCit2b2lkIHNsaXJwX3NlbGVjdF9maWxsKGludCAqcG5mZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICp4ZmRzKTsKKwordm9pZCBzbGlycF9zZWxlY3RfcG9sbChmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcyk7CisKK3ZvaWQgc2xpcnBfaW5wdXQoY29uc3QgdWludDhfdCAqcGt0LCBpbnQgcGt0X2xlbik7CisKKy8qIHlvdSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6ICovCitpbnQgc2xpcnBfY2FuX291dHB1dCh2b2lkKTsKK3ZvaWQgc2xpcnBfb3V0cHV0KGNvbnN0IHVpbnQ4X3QgKnBrdCwgaW50IHBrdF9sZW4pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVXNlciBtb2RlIG5ldHdvcmsgc3RhY2sgcmVzdHJpY3Rpb25zICovCit2b2lkIHNsaXJwX2Ryb3BfdWRwKCk7Cit2b2lkIHNsaXJwX2Ryb3BfdGNwKCk7Cit2b2lkIHNsaXJwX2FkZF9hbGxvdyh1bnNpZ25lZCBsb25nIGRzdF9hZGRyLCBpbnQgZHN0X2xwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9ocG9ydCwgdV9pbnQ4X3QgcHJvdG8pOwordm9pZCBzbGlycF9kcm9wX2xvZ19mZChGSUxFKiBmZCk7CisKKy8qKiBHZXQgdGhlIGRyb3AgbG9nIGZkICovCitGSUxFKiBnZXRfc2xpcnBfZHJvcF9sb2dfZmQodm9pZCk7CitpbnQgc2xpcnBfc2hvdWxkX2Ryb3AodW5zaWduZWQgbG9uZyBkc3RfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG8pOworaW50IHNsaXJwX2Ryb3BfbG9nKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKTsKKworLyogZm9yIG5ldHdvcmsgZm9yd2FyZHMgKi8KK3ZvaWQgc2xpcnBfYWRkX25ldF9mb3J3YXJkKHVuc2lnbmVkIGxvbmcgZGVzdF9pcCwgdW5zaWduZWQgbG9uZyBkZXN0X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9scG9ydCwgaW50IGRlc3RfaHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHJlZGlyZWN0X2lwLCBpbnQgcmVkaXJlY3RfcG9ydCk7CisKK2ludCBzbGlycF9zaG91bGRfbmV0X2ZvcndhcmQodW5zaWduZWQgbG9uZyByZW1vdGVfaXAsIGludCByZW1vdGVfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqcmVkaXJlY3RfaXAsIGludCAqcmVkaXJlY3RfcG9ydCk7CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKioKKyAqIEFkZGl0aW9uYWwgbmV0d29yayBzdGFjayBtb2RpZmljYXRpb25zLCBhaW1pbmcgdG8gZGV0ZWN0IGFuZCBsb2cKKyAqIGFueSBuZXR3b3JrIGFjdGl2aXR5IGluaXRpYXRlZCBieSBhbnkgYmluYXJ5IG91dGlzZGUgdGhlIGNvbnRleHQgb2YKKyAqIHRoZSBydW5uaW5nIGJyb3dzZXIuCisgKi8KKwordm9pZCBzbGlycF9kbnNfbG9nX2ZkKEZJTEUqIGZkKTsKKy8qKiBHZXQgdGhlIGRucyBsb2cgZmQgKi8KK0ZJTEUqIGdldF9zbGlycF9kbnNfbG9nX2ZkKHZvaWQpOworLyoqIExvZ3MgdGhlIEROUyBuYW1lIGluIEROUyBxdWVyeSBpc3N1ZWQgYnkgdGhlIFZNLiAqLworaW50IHNsaXJwX2xvZ19kbnMoc3RydWN0IG1idWYqIG0sIGludCBkcm9wcGVkKTsKKy8qKiBJUCBwYWNrZXQgZHVtcCBvZiBETlMgcXVlcmlzIGFuZCByZXNwb25zZXMuICovCitpbnQgc2xpcnBfZHVtcF9kbnMoc3RydWN0IG1idWYqIG0pOworLyoqIFNldHMgYW4gdXBwZXIgbGltaXQgZm9yIHRoZSBudW1iZXIgb2YgYWxsb3dlZCBETlMgcmVxdWVzdHMgZnJvbQorICogdGhlIFZNLgorICovCit2b2lkIHNsaXJwX3NldF9tYXhfZG5zX2Nvbm5zKGludCBtYXhfZG5zX2Nvbm5zKTsKKy8qIFJldHVybnMgdGhlIG1heCBudW1iZXIgb2YgYWxsb3dlZCBETlMgcmVxdWVzdHMuKi8KK2ludCBzbGlycF9nZXRfbWF4X2Ruc19jb25ucygpOworCisvKioKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGltcGxlbWVudGluZyAiLW5ldC1mb3J3YXJkLXRjcDJzaW5rJyBvcHRpb24uCisgKi8KKwordm9pZCBzbGlycF9mb3J3YXJkX2Ryb3BwZWRfdGNwMnNpbmsodW5zaWduZWQgbG9uZyBzaW5rX2lwLCAgaW50IHNpbmtfcG9ydCk7CitpbnQgc2xpcnBfc2hvdWxkX2ZvcndhcmRfZHJvcHBlZF90Y3Ayc2luaygpOwordW5zaWduZWQgbG9uZyBzbGlycF9nZXRfdGNwX3NpbmtfaXAoKTsKK2ludCBzbGlycF9nZXRfdGNwX3NpbmtfcG9ydCgpOworCisKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit2b2lkIHNsaXJwX3JlZGlyX2xvb3Aodm9pZCAoKmZ1bmMpKHZvaWQgKm9wYXF1ZSwgaW50IGlzX3VkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MgKmxhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2NrQWRkcmVzcyAqZmFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2ludCBzbGlycF9yZWRpcl9ybShpbnQgaXNfdWRwLCBpbnQgaG9zdF9wb3J0KTsKK2ludCBzbGlycF9yZWRpcihpbnQgaXNfdWRwLCBpbnQgaG9zdF9wb3J0LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGd1ZXN0X2FkZHIsIGludCBndWVzdF9wb3J0KTsKKworaW50IHNsaXJwX3VucmVkaXIoaW50IGlzX3VkcCwgaW50IGhvc3RfcG9ydCk7CisKK2ludCBzbGlycF9pbml0X2Ruc19zZXJ2ZXJzKGNvbnN0IGNoYXIqIHNlcnZlcnMpOworaW50IHNsaXJwX2FkZF9leGVjKGludCBkb19wdHksIGNvbnN0IHZvaWQgKmFyZ3MsIGludCBhZGRyX2xvd19ieXRlLAorICAgICAgICAgICAgICAgICAgIGludCBndWVzdF9wb3J0KTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnRmdHBfcHJlZml4OworZXh0ZXJuIGNoYXIgc2xpcnBfaG9zdG5hbWVbMzNdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmJvb3RwX2ZpbGVuYW1lOworCit2b2lkIHNsaXJwX3N0YXRzKHZvaWQpOwordm9pZCBzbGlycF9zb2NrZXRfcmVjdihpbnQgYWRkcl9sb3dfYnl0ZSwgaW50IGd1ZXN0X3BvcnQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKwkJaW50IHNpemUpOworc2l6ZV90IHNsaXJwX3NvY2tldF9jYW5fcmVjdihpbnQgYWRkcl9sb3dfYnl0ZSwgaW50IGd1ZXN0X3BvcnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9tYWluLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzQ2MmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWFpbi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNkZWZpbmUgVE9XUklURU1BWCA1MTIKKworZXh0ZXJuIHN0cnVjdCB0aW1ldmFsIHR0OworZXh0ZXJuIGludCBsaW5rX3VwOworZXh0ZXJuIGludCBzbGlycF9zb2NrZXQ7CitleHRlcm4gaW50IHNsaXJwX3NvY2tldF91bml0OworZXh0ZXJuIGludCBzbGlycF9zb2NrZXRfcG9ydDsKK2V4dGVybiB1X2ludDMyX3Qgc2xpcnBfc29ja2V0X2FkZHI7CitleHRlcm4gY2hhciAqc2xpcnBfc29ja2V0X3Bhc3N3ZDsKK2V4dGVybiBpbnQgY3R0eV9jbG9zZWQ7CitleHRlcm4gaW50IHNsaXJwX3Jlc3RyaWN0OworCisvKgorICogR2V0IHRoZSBkaWZmZXJlbmNlIGluIDIgdGltZXMgZnJvbSB1cGR0aW0oKQorICogQWxsb3cgZm9yIHdyYXBhcm91bmQgdGltZXMsICJqdXN0IGluIGNhc2UiCisgKiB4IGlzIHRoZSBncmVhdGVyIG9mIHRoZSAyIChjdXJyZW50IHRpbWUpIGFuZCB5IGlzCisgKiB3aGF0IGl0J3MgYmVpbmcgY29tcGFyZWQgYWdhaW5zdC4KKyAqLworI2RlZmluZSBUSU1FX0RJRkYoeCx5KSAoeCktKHkpIDwgMCA/IH4wLSh5KSsoeCkgOiAoeCktKHkpCisKKyNkZWZpbmUgIEROU19BRERSX01BWCAgNAorCitleHRlcm4gY2hhciAqc2xpcnBfdHR5OworZXh0ZXJuIGNoYXIgKmV4ZWNfc2hlbGw7CitleHRlcm4gdV9pbnQgY3VydGltZTsKK2V4dGVybiBmZF9zZXQgKmdsb2JhbF9yZWFkZmRzLCAqZ2xvYmFsX3dyaXRlZmRzLCAqZ2xvYmFsX3hmZHM7CitleHRlcm4gdWludDMyX3QgY3RsX2FkZHJfaXA7CitleHRlcm4gdWludDMyX3Qgc3BlY2lhbF9hZGRyX2lwOworZXh0ZXJuIHVpbnQzMl90IGFsaWFzX2FkZHJfaXA7CitleHRlcm4gdWludDMyX3Qgb3VyX2FkZHJfaXA7CitleHRlcm4gdWludDMyX3QgbG9vcGJhY2tfYWRkcl9pcDsKK2V4dGVybiB1aW50MzJfdCBkbnNfYWRkcltETlNfQUREUl9NQVhdOworZXh0ZXJuIGludCAgICAgIGRuc19hZGRyX2NvdW50OworZXh0ZXJuIGNoYXIgKnVzZXJuYW1lOworZXh0ZXJuIGNoYXIgKnNvY2tldF9wYXRoOworZXh0ZXJuIGludCB0b3dyaXRlX21heDsKK2V4dGVybiBpbnQgcHBwX2V4aXQ7CitleHRlcm4gaW50IHRjcF9rZWVwaW50dmw7CitleHRlcm4gdWludDhfdCBjbGllbnRfZXRoYWRkcls2XTsKK2V4dGVybiBjb25zdCBjaGFyICpzbGlycF9zcGVjaWFsX2lwOworZXh0ZXJuIGludCBzbGlycF9yZXN0cmljdDsKKworI2RlZmluZSBQUk9UT19TTElQIDB4MQorI2lmZGVmIFVTRV9QUFAKKyNkZWZpbmUgUFJPVE9fUFBQIDB4MgorI2VuZGlmCisKK3ZvaWQgaWZfZW5jYXAoY29uc3QgdWludDhfdCAqaXBfZGF0YSwgaW50IGlwX2RhdGFfbGVuKTsKK3NzaXplX3Qgc2xpcnBfc2VuZChzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL21idWYuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9tYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzMGE2MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9tYnVmLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kKKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisvKgorICogbWJ1ZidzIGluIFNMaVJQIGFyZSBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgcmVhbCBtYnVmcyBpbgorICogRnJlZUJTRC4gIFRoZXkgYXJlIGZpeGVkIHNpemUsIGRldGVybWluZWQgYnkgdGhlIE1UVSwKKyAqIHNvIHRoYXQgb25lIHdob2xlIHBhY2tldCBjYW4gZml0LiAgTWJ1ZidzIGNhbm5vdCBiZQorICogY2hhaW5lZCB0b2dldGhlci4gIElmIHRoZXJlJ3MgbW9yZSBkYXRhIHRoYW4gdGhlIG1idWYKKyAqIGNvdWxkIGhvbGQsIGFuIGV4dGVybmFsIG1hbGxvY2VkIGJ1ZmZlciBpcyBwb2ludGVkIHRvCisgKiBieSBtX2V4dCAoYW5kIHRoZSBkYXRhIHBvaW50ZXJzKSBhbmQgTV9FWFQgaXMgc2V0IGluCisgKiB0aGUgZmxhZ3MKKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKworaW50IG1idWZfYWxsb2NlZCA9IDA7CitzdHJ1Y3QgbWJ1ZiBtX2ZyZWVsaXN0LCBtX3VzZWRsaXN0OworI2RlZmluZSBNQlVGX1RIUkVTSCAzMAoraW50IG1idWZfbWF4ID0gMDsKKworLyoKKyAqIEZpbmQgYSBuaWNlIHZhbHVlIGZvciBtc2l6ZQorICogWFhYIGlmX21heGxpbmtoZHIgYWxyZWFkeSBpbiBtdHUKKyAqLworI2RlZmluZSBTTElSUF9NU0laRSAoSUZfTVRVICsgSUZfTUFYTElOS0hEUiArIHNpemVvZihzdHJ1Y3QgbV9oZHIgKSArIDYpCisKK3ZvaWQKK21faW5pdCh2b2lkKQoreworCW1fZnJlZWxpc3QubV9uZXh0ID0gbV9mcmVlbGlzdC5tX3ByZXYgPSAmbV9mcmVlbGlzdDsKKwltX3VzZWRsaXN0Lm1fbmV4dCA9IG1fdXNlZGxpc3QubV9wcmV2ID0gJm1fdXNlZGxpc3Q7Cit9CisKKy8qCisgKiBHZXQgYW4gbWJ1ZiBmcm9tIHRoZSBmcmVlIGxpc3QsIGlmIHRoZXJlIGFyZSBub25lCisgKiBtYWxsb2Mgb25lCisgKgorICogQmVjYXVzZSBmcmFnbWVudGF0aW9uIGNhbiBvY2N1ciBpZiB3ZSBhbGxvYyBuZXcgbWJ1ZnMgYW5kCisgKiBmcmVlIG9sZCBtYnVmcywgd2UgbWFyayBhbGwgbWJ1ZnMgYWJvdmUgbWJ1Zl90aHJlc2ggYXMgTV9ET0ZSRUUsCisgKiB3aGljaCB0ZWxscyBtX2ZyZWUgdG8gYWN0dWFsbHkgZnJlZSgpIGl0CisgKi8KK3N0cnVjdCBtYnVmICoKK21fZ2V0KHZvaWQpCit7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07CisJaW50IGZsYWdzID0gMDsKKworCURFQlVHX0NBTEwoIm1fZ2V0Iik7CisKKwlpZiAobV9mcmVlbGlzdC5tX25leHQgPT0gJm1fZnJlZWxpc3QpIHsKKwkJbSA9IChzdHJ1Y3QgbWJ1ZiAqKW1hbGxvYyhTTElSUF9NU0laRSk7CisJCWlmIChtID09IE5VTEwpIGdvdG8gZW5kX2Vycm9yOworCQltYnVmX2FsbG9jZWQrKzsKKwkJaWYgKG1idWZfYWxsb2NlZCA+IE1CVUZfVEhSRVNIKQorCQkJZmxhZ3MgPSBNX0RPRlJFRTsKKwkJaWYgKG1idWZfYWxsb2NlZCA+IG1idWZfbWF4KQorCQkJbWJ1Zl9tYXggPSBtYnVmX2FsbG9jZWQ7CisJfSBlbHNlIHsKKwkJbSA9IG1fZnJlZWxpc3QubV9uZXh0OworCQlyZW1xdWUobSk7CisJfQorCisJLyogSW5zZXJ0IGl0IGluIHRoZSB1c2VkIGxpc3QgKi8KKwlpbnNxdWUobSwmbV91c2VkbGlzdCk7CisJbS0+bV9mbGFncyA9IChmbGFncyB8IE1fVVNFRExJU1QpOworCisJLyogSW5pdGlhbGlzZSBpdCAqLworCW0tPm1fc2l6ZSA9IFNMSVJQX01TSVpFIC0gc2l6ZW9mKHN0cnVjdCBtX2hkcik7CisJbS0+bV9kYXRhID0gbS0+bV9kYXQ7CisJbS0+bV9sZW4gPSAwOworICAgICAgICBtLT5tX25leHRwa3QgPSBOVUxMOworICAgICAgICBtLT5tX3ByZXZwa3QgPSBOVUxMOworZW5kX2Vycm9yOgorCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nICltKTsKKwlyZXR1cm4gbTsKK30KKwordm9pZAorbV9mcmVlKHN0cnVjdCBtYnVmICptKQoreworCisgIERFQlVHX0NBTEwoIm1fZnJlZSIpOworICBERUJVR19BUkcoIm0gPSAlbHgiLCAobG9uZyApbSk7CisKKyAgaWYobSkgeworCS8qIFJlbW92ZSBmcm9tIG1fdXNlZGxpc3QgKi8KKwlpZiAobS0+bV9mbGFncyAmIE1fVVNFRExJU1QpCisJICAgcmVtcXVlKG0pOworCisJLyogSWYgaXQncyBNX0VYVCwgZnJlZSgpIGl0ICovCisJaWYgKG0tPm1fZmxhZ3MgJiBNX0VYVCkKKwkgICBmcmVlKG0tPm1fZXh0KTsKKworCS8qCisJICogRWl0aGVyIGZyZWUoKSBpdCBvciBwdXQgaXQgb24gdGhlIGZyZWUgbGlzdAorCSAqLworCWlmIChtLT5tX2ZsYWdzICYgTV9ET0ZSRUUpIHsKKwkJZnJlZShtKTsKKwkJbWJ1Zl9hbGxvY2VkLS07CisJfSBlbHNlIGlmICgobS0+bV9mbGFncyAmIE1fRlJFRUxJU1QpID09IDApIHsKKwkJaW5zcXVlKG0sJm1fZnJlZWxpc3QpOworCQltLT5tX2ZsYWdzID0gTV9GUkVFTElTVDsgLyogQ2xvYmJlciBvdGhlciBmbGFncyAqLworCX0KKyAgfSAvKiBpZihtKSAqLworfQorCisvKgorICogQ29weSBkYXRhIGZyb20gb25lIG1idWYgdG8gdGhlIGVuZCBvZgorICogdGhlIG90aGVyLi4gaWYgcmVzdWx0IGlzIHRvbyBiaWcgZm9yIG9uZSBtYnVmLCBtYWxsb2MoKQorICogYW4gTV9FWFQgZGF0YSBzZWdtZW50CisgKi8KK3ZvaWQKK21fY2F0KHN0cnVjdCBtYnVmICptLCBzdHJ1Y3QgbWJ1ZiAqbikKK3sKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gcm9vbSwgcmVhbGxvYworCSAqLworCWlmIChNX0ZSRUVST09NKG0pIDwgbi0+bV9sZW4pCisJCW1faW5jKG0sbS0+bV9zaXplK01JTkNTSVpFKTsKKworCW1lbWNweShtLT5tX2RhdGErbS0+bV9sZW4sIG4tPm1fZGF0YSwgbi0+bV9sZW4pOworCW0tPm1fbGVuICs9IG4tPm1fbGVuOworCisJbV9mcmVlKG4pOworfQorCisKKy8qIG1ha2UgbSBzaXplIGJ5dGVzIGxhcmdlICovCit2b2lkCittX2luYyhzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHNpemUpCit7CisJaW50IGRhdGFzaXplOworCisJLyogc29tZSBjb21waWxlcyB0aHJvdyB1cCBvbiBnb3Rvcy4gIFRoaXMgb25lIHdlIGNhbiBmYWtlLiAqLworICAgICAgICBpZihtLT5tX3NpemU+c2l6ZSkgcmV0dXJuOworCisgICAgICAgIGlmIChtLT5tX2ZsYWdzICYgTV9FWFQpIHsKKwkgIGRhdGFzaXplID0gbS0+bV9kYXRhIC0gbS0+bV9leHQ7CisJICBtLT5tX2V4dCA9IChjaGFyICopcmVhbGxvYyhtLT5tX2V4dCxzaXplKTsKKy8qCQlpZiAobS0+bV9leHQgPT0gTlVMTCkKKyAqCQkJcmV0dXJuIChzdHJ1Y3QgbWJ1ZiAqKU5VTEw7CisgKi8KKwkgIG0tPm1fZGF0YSA9IG0tPm1fZXh0ICsgZGF0YXNpemU7CisgICAgICAgIH0gZWxzZSB7CisJICBjaGFyICpkYXQ7CisJICBkYXRhc2l6ZSA9IG0tPm1fZGF0YSAtIG0tPm1fZGF0OworCSAgZGF0ID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisvKgkJaWYgKGRhdCA9PSBOVUxMKQorICoJCQlyZXR1cm4gKHN0cnVjdCBtYnVmICopTlVMTDsKKyAqLworCSAgbWVtY3B5KGRhdCwgbS0+bV9kYXQsIG0tPm1fc2l6ZSk7CisKKwkgIG0tPm1fZXh0ID0gZGF0OworCSAgbS0+bV9kYXRhID0gbS0+bV9leHQgKyBkYXRhc2l6ZTsKKwkgIG0tPm1fZmxhZ3MgfD0gTV9FWFQ7CisgICAgICAgIH0KKworICAgICAgICBtLT5tX3NpemUgPSBzaXplOworCit9CisKKworCit2b2lkCittX2FkaihzdHJ1Y3QgbWJ1ZiAqbSwgaW50IGxlbikKK3sKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGxlbiA+PSAwKSB7CisJCS8qIFRyaW0gZnJvbSBoZWFkICovCisJCW0tPm1fZGF0YSArPSBsZW47CisJCW0tPm1fbGVuIC09IGxlbjsKKwl9IGVsc2UgeworCQkvKiBUcmltIGZyb20gdGFpbCAqLworCQlsZW4gPSAtbGVuOworCQltLT5tX2xlbiAtPSBsZW47CisJfQorfQorCisKKy8qCisgKiBDb3B5IGxlbiBieXRlcyBmcm9tIG0sIHN0YXJ0aW5nIG9mZiBieXRlcyBpbnRvIG4KKyAqLworaW50CittX2NvcHkoc3RydWN0IG1idWYgKm4sIHN0cnVjdCBtYnVmICptLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCWlmIChsZW4gPiBNX0ZSRUVST09NKG4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoKG4tPm1fZGF0YSArIG4tPm1fbGVuKSwgKG0tPm1fZGF0YSArIG9mZiksIGxlbik7CisJbi0+bV9sZW4gKz0gbGVuOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBHaXZlbiBhIHBvaW50ZXIgaW50byBhbiBtYnVmLCByZXR1cm4gdGhlIG1idWYKKyAqIFhYWCBUaGlzIGlzIGEga2x1ZGdlLCBJIHNob3VsZCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIGl0CisgKiBGb3J0dW5hdGVseSwgaXQncyBub3QgdXNlZCBvZnRlbgorICovCitzdHJ1Y3QgbWJ1ZiAqCitkdG9tKHZvaWQgKmRhdCkKK3sKKwlzdHJ1Y3QgbWJ1ZiAqbTsKKworCURFQlVHX0NBTEwoImR0b20iKTsKKwlERUJVR19BUkcoImRhdCA9ICVseCIsIChsb25nIClkYXQpOworCisJLyogYnVnIGNvcnJlY3RlZCBmb3IgTV9FWFQgYnVmZmVycyAqLworCWZvciAobSA9IG1fdXNlZGxpc3QubV9uZXh0OyBtICE9ICZtX3VzZWRsaXN0OyBtID0gbS0+bV9uZXh0KSB7CisJICBpZiAobS0+bV9mbGFncyAmIE1fRVhUKSB7CisJICAgIGlmKCAoY2hhciAqKWRhdD49bS0+bV9leHQgJiYgKGNoYXIgKilkYXQ8KG0tPm1fZXh0ICsgbS0+bV9zaXplKSApCisJICAgICAgcmV0dXJuIG07CisJICB9IGVsc2UgeworCSAgICBpZiggKGNoYXIgKilkYXQgPj0gbS0+bV9kYXQgJiYgKGNoYXIgKilkYXQ8KG0tPm1fZGF0ICsgbS0+bV9zaXplKSApCisJICAgICAgcmV0dXJuIG07CisJICB9CisJfQorCisJREVCVUdfRVJST1IoKGRmZCwgImR0b20gZmFpbGVkIikpOworCisJcmV0dXJuIChzdHJ1Y3QgbWJ1ZiAqKTA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWJ1Zi5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL21idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI3MzczCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL21idWYuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltYnVmLmgJOC4zIChCZXJrZWxleSkgMS8yMS85NAorICogbWJ1Zi5oLHYgMS45IDE5OTQvMTEvMTQgMTM6NTQ6MjAgYmRlIEV4cAorICovCisKKyNpZm5kZWYgX01CVUZfSF8KKyNkZWZpbmUgX01CVUZfSF8KKworI2RlZmluZSBtX2ZyZWVtIG1fZnJlZQorCisKKyNkZWZpbmUgTUlOQ1NJWkUgNDA5NgkvKiBBbW91bnQgdG8gaW5jcmVhc2UgbWJ1ZiBpZiB0b28gc21hbGwgKi8KKworLyoKKyAqIE1hY3JvcyBmb3IgdHlwZSBjb252ZXJzaW9uCisgKiBtdG9kKG0sdCkgLQljb252ZXJ0IG1idWYgcG9pbnRlciB0byBkYXRhIHBvaW50ZXIgb2YgY29ycmVjdCB0eXBlCisgKiBkdG9tKHgpIC0JY29udmVydCBkYXRhIHBvaW50ZXIgd2l0aGluIG1idWYgdG8gbWJ1ZiBwb2ludGVyIChYWFgpCisgKi8KKyNkZWZpbmUgbXRvZChtLHQpCSgodCkobSktPm1fZGF0YSkKKy8qICNkZWZpbmUJZHRvbSh4KQkJKChzdHJ1Y3QgbWJ1ZiAqKSgoaW50KSh4KSAmIH4oTV9TSVpFLTEpKSkgKi8KKworLyogWFhYIEFib3V0IG1idWZzIGZvciBzbGlycDoKKyAqIE9ubHkgb25lIG1idWYgaXMgZXZlciB1c2VkIGluIGEgY2hhaW4sIGZvciBlYWNoICJjZWxsIiBvZiBkYXRhLgorICogbV9uZXh0cGt0IHBvaW50cyB0byB0aGUgbmV4dCBwYWNrZXQsIGlmIGZyYWdtZW50ZWQuCisgKiBJZiB0aGUgZGF0YSBpcyB0b28gbGFyZ2UsIHRoZSBNX0VYVCBpcyB1c2VkLCBhbmQgYSBsYXJnZXIgYmxvY2sKKyAqIGlzIGFsbG9jZWQuICBUaGVyZWZvcmUsIG1fZnJlZVttXSBtdXN0IGNoZWNrIGZvciBNX0VYVCBhbmQgaWYgc2V0CisgKiBmcmVlIHRoZSBtX2V4dC4gIFRoaXMgaXMgaW5lZmZpY2llbnQgbWVtb3J5LXdpc2UsIGJ1dCB3aG8gY2FyZXMuCisgKi8KKworLyogWFhYIHNob3VsZCB1bmlvbiBzb21lIG9mIHRoZXNlISAqLworLyogaGVhZGVyIGF0IGJlZ2lubmluZyBvZiBlYWNoIG1idWY6ICovCitzdHJ1Y3QgbV9oZHIgeworCXN0cnVjdAltYnVmICptaF9uZXh0OwkJLyogTGlua2VkIGxpc3Qgb2YgbWJ1ZnMgKi8KKwlzdHJ1Y3QJbWJ1ZiAqbWhfcHJldjsKKwlzdHJ1Y3QJbWJ1ZiAqbWhfbmV4dHBrdDsJLyogTmV4dCBwYWNrZXQgaW4gcXVldWUvcmVjb3JkICovCisJc3RydWN0CW1idWYgKm1oX3ByZXZwa3Q7IC8qIEZsYWdzIGFyZW4ndCB1c2VkIGluIHRoZSBvdXRwdXQgcXVldWUgKi8KKwlpbnQJbWhfZmxhZ3M7CSAgLyogTWlzYyBmbGFncyAqLworCisJaW50CW1oX3NpemU7CQkvKiBTaXplIG9mIGRhdGEgKi8KKwlzdHJ1Y3QJc29ja2V0ICptaF9zbzsKKworCWNhZGRyX3QJbWhfZGF0YTsJCS8qIExvY2F0aW9uIG9mIGRhdGEgKi8KKwlpbnQJbWhfbGVuOwkJCS8qIEFtb3VudCBvZiBkYXRhIGluIHRoaXMgbWJ1ZiAqLworfTsKKworLyoKKyAqIEhvdyBtdWNoIHJvb20gaXMgaW4gdGhlIG1idWYsIGZyb20gbV9kYXRhIHRvIHRoZSBlbmQgb2YgdGhlIG1idWYKKyAqLworI2RlZmluZSBNX1JPT00obSkgKChtLT5tX2ZsYWdzICYgTV9FWFQpPyBcCisJCQkoKChtKS0+bV9leHQgKyAobSktPm1fc2l6ZSkgLSAobSktPm1fZGF0YSkgXAorCQkgICA6IFwKKwkJCSgoKG0pLT5tX2RhdCArIChtKS0+bV9zaXplKSAtIChtKS0+bV9kYXRhKSkKKworLyoKKyAqIEhvdyBtdWNoIGZyZWUgcm9vbSB0aGVyZSBpcworICovCisjZGVmaW5lIE1fRlJFRVJPT00obSkgKE1fUk9PTShtKSAtIChtKS0+bV9sZW4pCisjZGVmaW5lIE1fVFJBSUxJTkdTUEFDRSBNX0ZSRUVST09NCisKK3N0cnVjdCBtYnVmIHsKKwlzdHJ1Y3QJbV9oZHIgbV9oZHI7CisJdW5pb24gTV9kYXQgeworCQljaGFyCW1fZGF0X1sxXTsgLyogQU5TSSBkb24ndCBsaWtlIDAgc2l6ZWQgYXJyYXlzICovCisJCWNoYXIJKm1fZXh0XzsKKwl9IE1fZGF0OworfTsKKworI2RlZmluZSBtX25leHQJCW1faGRyLm1oX25leHQKKyNkZWZpbmUgbV9wcmV2CQltX2hkci5taF9wcmV2CisjZGVmaW5lIG1fbmV4dHBrdAltX2hkci5taF9uZXh0cGt0CisjZGVmaW5lIG1fcHJldnBrdAltX2hkci5taF9wcmV2cGt0CisjZGVmaW5lIG1fZmxhZ3MJCW1faGRyLm1oX2ZsYWdzCisjZGVmaW5lCW1fbGVuCQltX2hkci5taF9sZW4KKyNkZWZpbmUJbV9kYXRhCQltX2hkci5taF9kYXRhCisjZGVmaW5lIG1fc2l6ZQkJbV9oZHIubWhfc2l6ZQorI2RlZmluZSBtX2RhdAkJTV9kYXQubV9kYXRfCisjZGVmaW5lIG1fZXh0CQlNX2RhdC5tX2V4dF8KKyNkZWZpbmUgbV9zbwkJbV9oZHIubWhfc28KKworI2RlZmluZSBpZnFfcHJldiBtX3ByZXYKKyNkZWZpbmUgaWZxX25leHQgbV9uZXh0CisjZGVmaW5lIGlmc19wcmV2IG1fcHJldnBrdAorI2RlZmluZSBpZnNfbmV4dCBtX25leHRwa3QKKyNkZWZpbmUgaWZxX3NvIG1fc28KKworI2RlZmluZSBNX0VYVAkJCTB4MDEJLyogbV9leHQgcG9pbnRzIHRvIG1vcmUgKG1hbGxvY2VkKSBkYXRhICovCisjZGVmaW5lIE1fRlJFRUxJU1QJCTB4MDIJLyogbWJ1ZiBpcyBvbiBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgTV9VU0VETElTVAkJMHgwNAkvKiBYWFggbWJ1ZiBpcyBvbiB1c2VkIGxpc3QgKGZvciBkdG9tKCkpICovCisjZGVmaW5lIE1fRE9GUkVFCQkweDA4CS8qIHdoZW4gbV9mcmVlIGlzIGNhbGxlZCBvbiB0aGUgbWJ1ZiwgZnJlZSgpCisJCQkJCSAqIGl0IHJhdGhlciB0aGFuIHB1dHRpbmcgaXQgb24gdGhlIGZyZWUgbGlzdCAqLworCisvKgorICogTWJ1ZiBzdGF0aXN0aWNzLiBYWFgKKyAqLworCitzdHJ1Y3QgbWJzdGF0IHsKKwlpbnQgbWJzX2FsbG9jZWQ7CQkvKiBOdW1iZXIgb2YgbWJ1ZnMgYWxsb2NhdGVkICovCisKK307CisKK2V4dGVybiBzdHJ1Y3QJbWJzdGF0IG1ic3RhdDsKK2V4dGVybiBpbnQgbWJ1Zl9hbGxvY2VkOworZXh0ZXJuIHN0cnVjdCBtYnVmIG1fZnJlZWxpc3QsIG1fdXNlZGxpc3Q7CitleHRlcm4gaW50IG1idWZfbWF4OworCit2b2lkIG1faW5pdCBfUCgodm9pZCkpOworc3RydWN0IG1idWYgKiBtX2dldCBfUCgodm9pZCkpOwordm9pZCBtX2ZyZWUgX1AoKHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgbV9jYXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIHJlZ2lzdGVyIHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgbV9pbmMgX1AoKHN0cnVjdCBtYnVmICosIGludCkpOwordm9pZCBtX2FkaiBfUCgoc3RydWN0IG1idWYgKiwgaW50KSk7CitpbnQgbV9jb3B5IF9QKChzdHJ1Y3QgbWJ1ZiAqLCBzdHJ1Y3QgbWJ1ZiAqLCBpbnQsIGludCkpOworc3RydWN0IG1idWYgKiBkdG9tIF9QKCh2b2lkICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWlzYy5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzcyNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL21pc2MuYwpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjZGVmaW5lIFdBTlRfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlICJzbGlycC5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK3VfaW50IGN1cnRpbWUsIHRpbWVfZmFzdHRpbW8sIGxhc3Rfc2xvd3RpbW8sIGRldGFjaF90aW1lOwordV9pbnQgZGV0YWNoX3dhaXQgPSA2MDAwMDA7CS8qIDEwIG1pbnV0ZXMgKi8KK3N0cnVjdCBlbXVfdCAqdGNwZW11OworCisvKgorICogR2V0IG91ciBJUCBhZGRyZXNzIGFuZCBwdXQgaXQgaW4gb3VyX2FkZHIKKyAqLwordm9pZAorZ2V0b3VyYWRkcigpCit7CisgICAgY2hhciogICAgICAgIGhvc3RuYW1lID0gaG9zdF9uYW1lKCk7CisgICAgU29ja0FkZHJlc3MgIGhvc3RhZGRyOworCisgICAgb3VyX2FkZHJfaXAgPSBsb29wYmFja19hZGRyX2lwOworCisgICAgaWYgKHNvY2tfYWRkcmVzc19pbml0X3Jlc29sdmUoICZob3N0YWRkciwgaG9zdG5hbWUsIDAsIDAgKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIG91cl9hZGRyX2lwID0gc29ja19hZGRyZXNzX2dldF9pcCgmaG9zdGFkZHIpOworICAgIGlmIChvdXJfYWRkcl9pcCA9PSAodWludDMyX3QpLTEpCisgICAgICAgIG91cl9hZGRyX2lwID0gbG9vcGJhY2tfYWRkcl9pcDsKK30KKworc3RydWN0IHF1ZWhlYWQgeworCXN0cnVjdCBxdWVoZWFkICpxaF9saW5rOworCXN0cnVjdCBxdWVoZWFkICpxaF9ybGluazsKK307CisKK2lubGluZSB2b2lkCitpbnNxdWUodm9pZCAqYSwgdm9pZCAqYikKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgcXVlaGVhZCAqZWxlbWVudCA9IChzdHJ1Y3QgcXVlaGVhZCAqKSBhOworCXJlZ2lzdGVyIHN0cnVjdCBxdWVoZWFkICpoZWFkID0gKHN0cnVjdCBxdWVoZWFkICopIGI7CisJZWxlbWVudC0+cWhfbGluayA9IGhlYWQtPnFoX2xpbms7CisJaGVhZC0+cWhfbGluayA9IChzdHJ1Y3QgcXVlaGVhZCAqKWVsZW1lbnQ7CisJZWxlbWVudC0+cWhfcmxpbmsgPSAoc3RydWN0IHF1ZWhlYWQgKiloZWFkOworCSgoc3RydWN0IHF1ZWhlYWQgKikoZWxlbWVudC0+cWhfbGluaykpLT5xaF9ybGluaworCT0gKHN0cnVjdCBxdWVoZWFkICopZWxlbWVudDsKK30KKworaW5saW5lIHZvaWQKK3JlbXF1ZSh2b2lkICphKQoreworICByZWdpc3RlciBzdHJ1Y3QgcXVlaGVhZCAqZWxlbWVudCA9IChzdHJ1Y3QgcXVlaGVhZCAqKSBhOworICAoKHN0cnVjdCBxdWVoZWFkICopKGVsZW1lbnQtPnFoX2xpbmspKS0+cWhfcmxpbmsgPSBlbGVtZW50LT5xaF9ybGluazsKKyAgKChzdHJ1Y3QgcXVlaGVhZCAqKShlbGVtZW50LT5xaF9ybGluaykpLT5xaF9saW5rID0gZWxlbWVudC0+cWhfbGluazsKKyAgZWxlbWVudC0+cWhfcmxpbmsgPSBOVUxMOworICAvKiAgZWxlbWVudC0+cWhfbGluayA9IE5VTEw7ICBUQ1AgRklOMSBjcmFzaGVzIGlmIHlvdSBkbyB0aGlzLiAgV2h5ID8gKi8KK30KKworLyogI2VuZGlmICovCisKKworaW50CithZGRfZXhlYyhzdHJ1Y3QgZXhfbGlzdCAqKmV4X3B0ciwgaW50IGRvX3B0eSwgY2hhciAqZXhlYywgaW50IGFkZHIsIGludCBwb3J0KQoreworCXN0cnVjdCBleF9saXN0ICp0bXBfcHRyOworCisJLyogRmlyc3QsIGNoZWNrIGlmIHRoZSBwb3J0IGlzICJib3VuZCIgKi8KKwlmb3IgKHRtcF9wdHIgPSAqZXhfcHRyOyB0bXBfcHRyOyB0bXBfcHRyID0gdG1wX3B0ci0+ZXhfbmV4dCkgeworCQlpZiAocG9ydCA9PSB0bXBfcHRyLT5leF9mcG9ydCAmJiBhZGRyID09IHRtcF9wdHItPmV4X2FkZHIpCisJCSAgIHJldHVybiAtMTsKKwl9CisKKwl0bXBfcHRyID0gKmV4X3B0cjsKKwkqZXhfcHRyID0gKHN0cnVjdCBleF9saXN0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXhfbGlzdCkpOworCSgqZXhfcHRyKS0+ZXhfZnBvcnQgPSBwb3J0OworCSgqZXhfcHRyKS0+ZXhfYWRkciA9IGFkZHI7CisJKCpleF9wdHIpLT5leF9wdHkgPSBkb19wdHk7CisJKCpleF9wdHIpLT5leF9leGVjID0gKGRvX3B0eSA9PSAzKSA/IGV4ZWMgOiBzdHJkdXAoZXhlYyk7CisJKCpleF9wdHIpLT5leF9uZXh0ID0gdG1wX3B0cjsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qCisgKiBGb3Igc3lzdGVtcyB3aXRoIG5vIHN0cmVycm9yCisgKi8KKworZXh0ZXJuIGludCBzeXNfbmVycjsKK2V4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOworCitjaGFyICoKK3N0cmVycm9yKGVycm9yKQorCWludCBlcnJvcjsKK3sKKwlpZiAoZXJyb3IgPCBzeXNfbmVycikKKwkgICByZXR1cm4gc3lzX2Vycmxpc3RbZXJyb3JdOworCWVsc2UKKwkgICByZXR1cm4gIlVua25vd24gZXJyb3IuIjsKK30KKworI2VuZGlmCisKKworI2lmZGVmIF9XSU4zMgorCitpbnQKK2ZvcmtfZXhlYyhzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqZXgsIGludCBkb19wdHkpCit7CisgICAgLyogbm90IGltcGxlbWVudGVkICovCisgICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKKyNpZm5kZWYgQ09ORklHX1FFTVUKK2ludAorc2xpcnBfb3BlbnB0eShhbWFzdGVyLCBhc2xhdmUpCisgICAgIGludCAqYW1hc3RlciwgKmFzbGF2ZTsKK3sKKwlyZWdpc3RlciBpbnQgbWFzdGVyLCBzbGF2ZTsKKworI2lmZGVmIEhBVkVfR1JBTlRQVAorCWNoYXIgKnB0cjsKKworCWlmICgobWFzdGVyID0gb3BlbigiL2Rldi9wdG14IiwgT19SRFdSKSkgPCAwIHx8CisJICAgIGdyYW50cHQobWFzdGVyKSA8IDAgfHwKKwkgICAgdW5sb2NrcHQobWFzdGVyKSA8IDAgfHwKKwkgICAgKHB0ciA9IHB0c25hbWUobWFzdGVyKSkgPT0gTlVMTCkgIHsKKwkJY2xvc2UobWFzdGVyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgoc2xhdmUgPSBvcGVuKHB0ciwgT19SRFdSKSkgPCAwIHx8CisJICAgIGlvY3RsKHNsYXZlLCBJX1BVU0gsICJwdGVtIikgPCAwIHx8CisJICAgIGlvY3RsKHNsYXZlLCBJX1BVU0gsICJsZHRlcm0iKSA8IDAgfHwKKwkgICAgaW9jdGwoc2xhdmUsIElfUFVTSCwgInR0Y29tcGF0IikgPCAwKSB7CisJCWNsb3NlKG1hc3Rlcik7CisJCWNsb3NlKHNsYXZlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSphbWFzdGVyID0gbWFzdGVyOworCSphc2xhdmUgPSBzbGF2ZTsKKwlyZXR1cm4gMDsKKworI2Vsc2UKKworCXN0YXRpYyBjaGFyIGxpbmVbXSA9ICIvZGV2L3B0eVhYIjsKKwlyZWdpc3RlciBjb25zdCBjaGFyICpjcDEsICpjcDI7CisKKwlmb3IgKGNwMSA9ICJwcXJzUFFSUyI7ICpjcDE7IGNwMSsrKSB7CisJCWxpbmVbOF0gPSAqY3AxOworCQlmb3IgKGNwMiA9ICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1diI7ICpjcDI7IGNwMisrKSB7CisJCQlsaW5lWzldID0gKmNwMjsKKwkJCWlmICgobWFzdGVyID0gb3BlbihsaW5lLCBPX1JEV1IsIDApKSA9PSAtMSkgeworCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQkJICAgcmV0dXJuICgtMSk7ICAgIC8qIG91dCBvZiBwdHlzICovCisJCQl9IGVsc2UgeworCQkJCWxpbmVbNV0gPSAndCc7CisJCQkJLyogVGhlc2Ugd2lsbCBmYWlsICovCisJCQkJKHZvaWQpIGNob3duKGxpbmUsIGdldHVpZCgpLCAwKTsKKwkJCQkodm9pZCkgY2htb2QobGluZSwgU19JUlVTUnxTX0lXVVNSfFNfSVdHUlApOworI2lmZGVmIEhBVkVfUkVWT0tFCisJCQkJKHZvaWQpIHJldm9rZShsaW5lKTsKKyNlbmRpZgorCQkJCWlmICgoc2xhdmUgPSBvcGVuKGxpbmUsIE9fUkRXUiwgMCkpICE9IC0xKSB7CisJCQkJCSphbWFzdGVyID0gbWFzdGVyOworCQkJCQkqYXNsYXZlID0gc2xhdmU7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQkodm9pZCkgY2xvc2UobWFzdGVyKTsKKwkJCQlsaW5lWzVdID0gJ3AnOworCQkJfQorCQl9CisJfQorCWVycm5vID0gRU5PRU5UOyAvKiBvdXQgb2YgcHR5cyAqLworCXJldHVybiAoLTEpOworI2VuZGlmCit9CisjZW5kaWYKKworLyoKKyAqIFhYWCBUaGlzIGlzIHVnbHkKKyAqIFdlIGNyZWF0ZSBhbmQgYmluZCBhIHNvY2tldCwgdGhlbiBmb3JrIG9mZiB0byBhbm90aGVyCisgKiBwcm9jZXNzLCB3aGljaCBjb25uZWN0cyB0byB0aGlzIHNvY2tldCwgYWZ0ZXIgd2hpY2ggd2UKKyAqIGV4ZWMgdGhlIHdhbnRlZCBwcm9ncmFtLiAgSWYgc29tZXRoaW5nIChzdHJhbmdlKSBoYXBwZW5zLAorICogdGhlIGFjY2VwdCgpIGNhbGwgY291bGQgYmxvY2sgdXMgZm9yZXZlci4KKyAqCisgKiBkb19wdHkgPSAwICAgRm9yay9leGVjIGluZXRkIHN0eWxlCisgKiBkb19wdHkgPSAxICAgRm9yay9leGVjIHVzaW5nIHNsaXJwLnRlbG5ldGQKKyAqIGRvX3B0ciA9IDIgICBGb3JrL2V4ZWMgdXNpbmcgcHR5CisgKi8KK2ludAorZm9ya19leGVjKHN0cnVjdCBzb2NrZXQgKnNvLCBjb25zdCBjaGFyICpleCwgaW50IGRvX3B0eSkKK3sKKwlpbnQgczsKKyAgICAgICAgaW50IG1hc3RlciA9IC0xOworCWNvbnN0IGNoYXIgKmFyZ3ZbMjU2XTsKKyNpZiAwCisJY2hhciBidWZmWzI1Nl07CisjZW5kaWYKKwkvKiBkb24ndCB3YW50IHRvIGNsb2JiZXIgdGhlIG9yaWdpbmFsICovCisJY2hhciAqYnB0cjsKKwljb25zdCBjaGFyICpjdXJhcmc7CisJaW50IGMsIGk7CisKKwlERUJVR19DQUxMKCJmb3JrX2V4ZWMiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcpc28pOworCURFQlVHX0FSRygiZXggPSAlbHgiLCAobG9uZylleCk7CisJREVCVUdfQVJHKCJkb19wdHkgPSAlbHgiLCAobG9uZylkb19wdHkpOworCisJaWYgKGRvX3B0eSA9PSAyKSB7CisjaWYgMAorCQlpZiAoc2xpcnBfb3BlbnB0eSgmbWFzdGVyLCAmcykgPT0gLTEpIHsKKwkJCWxwcmludCgiRXJyb3I6IG9wZW5wdHkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAwOworCQl9CisjZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaWYgKChzID0gc29ja2V0X2FueWFkZHJfc2VydmVyKDAsIFNPQ0tFVF9TVFJFQU0pKSA8IDApIHsKKwkJCWxwcmludCgiRXJyb3I6IGluZXQgc29ja2V0OiAlc1xuIiwgZXJybm9fc3RyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3dpdGNoKGZvcmsoKSkgeworCSBjYXNlIC0xOgorCQlscHJpbnQoIkVycm9yOiBmb3JrIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHMpOworCQlpZiAoZG9fcHR5ID09IDIpCisJCSAgIGNsb3NlKG1hc3Rlcik7CisJCXJldHVybiAwOworCisJIGNhc2UgMDoKKwkJLyogU2V0IHRoZSBESVNQTEFZICovCisJCWlmIChkb19wdHkgPT0gMikgeworCQkJKHZvaWQpIGNsb3NlKG1hc3Rlcik7CisjaWZkZWYgVElPQ1NDVFRZIC8qIFhYWFhYICovCisJCQkodm9pZCkgc2V0c2lkKCk7CisJCQlpb2N0bChzLCBUSU9DU0NUVFksIChjaGFyICopTlVMTCk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCVNvY2tBZGRyZXNzICBhZGRyOworCQkJc29ja2V0X2dldF9hZGRyZXNzKHMsICZhZGRyKTsKKwkJCXNvY2tldF9jbG9zZShzKTsKKwkJCS8qCisJCQkgKiBDb25uZWN0IHRvIHRoZSBzb2NrZXQKKwkJCSAqIFhYWCBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UncmUgaW4gdHJvdWJsZSEKKwkgCQkgKi8KKyAgICAgICAgICAgIHMgPSBzb2NrZXRfbG9vcGJhY2s0X2NsaWVudChzb2NrX2FkZHJlc3NfZ2V0X3BvcnQoJmFkZHIpLCBTT0NLRVRfU1RSRUFNKTsKKwkJfQorCisjaWYgMAorCQlpZiAoeF9wb3J0ID49IDApIHsKKyNpZmRlZiBIQVZFX1NFVEVOVgorCQkJc3ByaW50ZihidWZmLCAiJXM6JWQuJWQiLCBpbmV0X250b2Eob3VyX2FkZHIpLCB4X3BvcnQsIHhfc2NyZWVuKTsKKwkJCXNldGVudigiRElTUExBWSIsIGJ1ZmYsIDEpOworI2Vsc2UKKwkJCXNwcmludGYoYnVmZiwgIkRJU1BMQVk9JXM6JWQuJWQiLCBpbmV0X250b2Eob3VyX2FkZHIpLCB4X3BvcnQsIHhfc2NyZWVuKTsKKwkJCXB1dGVudihidWZmKTsKKyNlbmRpZgorCQl9CisjZW5kaWYKKwkJZHVwMihzLCAwKTsKKwkJZHVwMihzLCAxKTsKKwkJZHVwMihzLCAyKTsKKwkJZm9yIChzID0gc3lzY29uZihfU0NfT1BFTl9NQVgpIC0gMTsgcyA+PSAzOyBzLS0pCisJCSAgIGNsb3NlKHMpOworCisJCWkgPSAwOworCQlicHRyID0gc3RyZHVwKGV4KTsgLyogTm8gbmVlZCB0byBmcmVlKCkgdGhpcyAqLworCQlpZiAoZG9fcHR5ID09IDEpIHsKKwkJCS8qIFNldHVwICJzbGlycC50ZWxuZXRkIC14IiAqLworCQkJYXJndltpKytdID0gInNsaXJwLnRlbG5ldGQiOworCQkJYXJndltpKytdID0gIi14IjsKKwkJCWFyZ3ZbaSsrXSA9IGJwdHI7CisJCX0gZWxzZQorCQkgICBkbyB7CisJCQkvKiBDaGFuZ2UgdGhlIHN0cmluZyBpbnRvIGFyZ3ZbXSAqLworCQkJY3VyYXJnID0gYnB0cjsKKwkJCXdoaWxlICgqYnB0ciAhPSAnICcgJiYgKmJwdHIgIT0gKGNoYXIpMCkKKwkJCSAgIGJwdHIrKzsKKwkJCWMgPSAqYnB0cjsKKwkJCSpicHRyKysgPSAoY2hhcikwOworCQkJYXJndltpKytdID0gc3RyZHVwKGN1cmFyZyk7CisJCSAgIH0gd2hpbGUgKGMpOworCisgICAgICAgICAgICAgICAgYXJndltpXSA9IE5VTEw7CisJCWV4ZWN2cChhcmd2WzBdLCAoY2hhciAqKilhcmd2KTsKKworCQkvKiBPb29wcywgZmFpbGVkLCBsZXQncyB0ZWxsIHRoZSB1c2VyIHdoeSAqLworCQkgIHsKKwkJCSAgY2hhciBidWZmWzI1Nl07CisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQ7CisKKwkJCSAgc25wcmludGYoYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3I6IGV4ZWN2cCBvZiAlcyBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBzdHJlcnJvcihlcnJubykpOworCQkJICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9d3JpdGUoMiwgYnVmZiwgc3RybGVuKGJ1ZmYpKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKwkJICB9CisJCWNsb3NlKDApOyBjbG9zZSgxKTsgY2xvc2UoMik7IC8qIFhYWCAqLworCQlleGl0KDEpOworCisJIGRlZmF1bHQ6CisJCWlmIChkb19wdHkgPT0gMikgeworCQkJY2xvc2Uocyk7CisJCQlzby0+cyA9IG1hc3RlcjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggdGhpcyBjb3VsZCBibG9jayB1cy4uLgorCQkJICogWFhYIFNob3VsZCBzZXQgYSB0aW1lciBoZXJlLCBhbmQgaWYgYWNjZXB0KCkgZG9lc24ndAorCQkgCSAqIHJldHVybiBhZnRlciBYIHNlY29uZHMsIGRlY2xhcmUgaXQgYSBmYWlsdXJlCisJCSAJICogVGhlIG9ubHkgcmVhc29uIHRoaXMgd2lsbCBibG9jayBmb3JldmVyIGlzIGlmIHNvY2tldCgpCisJCSAJICogb2YgY29ubmVjdCgpIGZhaWwgaW4gdGhlIGNoaWxkIHByb2Nlc3MKKwkJIAkgKi8KKyAgICAgICAgICAgICBzby0+cyA9IHNvY2tldF9hY2NlcHQocywgTlVMTCk7CisJCQkgc29ja2V0X3NldF94cmV1c2VhZGRyKHNvLT5zKTsKKyAgICAgICAgICAgICBzb2NrZXRfc2V0X29vYmlubGluZShzby0+cyk7CisJCX0KKwkJc29ja2V0X3NldF9ub25ibG9jayhzby0+cyk7CisKKwkJLyogQXBwZW5kIHRoZSB0ZWxuZXQgb3B0aW9ucyBub3cgKi8KKyAgICAgICAgICAgICAgICBpZiAoc28tPnNvX20gIT0gTlVMTCAmJiBkb19wdHkgPT0gMSkgIHsKKwkJCXNiYXBwZW5kKHNvLCBzby0+c29fbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzby0+c29fbSA9IE5VTEw7CisJCX0KKworCQlyZXR1cm4gMTsKKwl9Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkRVUAorY2hhciAqCitzdHJkdXAoY29uc3QgY2hhciogIHN0cikKK3sKKwljaGFyICpicHRyOworCWludCAgIGxlbiA9IHN0cmxlbihzdHIpOworCisJYnB0ciA9IChjaGFyICopbWFsbG9jKGxlbisxKTsKKwltZW1jcHkoYnB0ciwgc3RyLCBsZW4rMSk7CisKKwlyZXR1cm4gYnB0cjsKK30KKyNlbmRpZgorCisjaWYgMAordm9pZAorc25vb3plX2h1cChudW0pCisJaW50IG51bTsKK3sKKwlpbnQgcywgcmV0OworI2lmbmRlZiBOT19VTklYX1NPQ0tFVFMKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja191bjsKKyNlbmRpZgorCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2luOworCWNoYXIgYnVmZlsyNTZdOworCisJcmV0ID0gLTE7CisJaWYgKHNsaXJwX3NvY2tldF9wYXNzd2QpIHsKKwkJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJCWlmIChzIDwgMCkKKwkJICAgc2xpcnBfZXhpdCgxKTsKKwkJc29ja19pbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc29ja19pbi5zaW5fYWRkci5zX2FkZHIgPSBzbGlycF9zb2NrZXRfYWRkcjsKKwkJc29ja19pbi5zaW5fcG9ydCA9IGh0b25zKHNsaXJwX3NvY2tldF9wb3J0KTsKKwkJaWYgKGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2luLCBzaXplb2Yoc29ja19pbikpICE9IDApCisJCSAgIHNsaXJwX2V4aXQoMSk7IC8qIGp1c3QgZXhpdC4uLiovCisJCXNwcmludGYoYnVmZiwgImtpbGwgJXM6JWQiLCBzbGlycF9zb2NrZXRfcGFzc3dkLCBzbGlycF9zb2NrZXRfdW5pdCk7CisJCXdyaXRlKHMsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKwl9CisjaWZuZGVmIE5PX1VOSVhfU09DS0VUUworCSAgZWxzZSB7CisJCXMgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCQlpZiAocyA8IDApCisJCSAgIHNsaXJwX2V4aXQoMSk7CisJCXNvY2tfdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJCXN0cmNweShzb2NrX3VuLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCk7CisJCWlmIChjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja191biwKKwkJCSAgICAgIHNpemVvZihzb2NrX3VuLnN1bl9mYW1pbHkpICsgc2l6ZW9mKHNvY2tfdW4uc3VuX3BhdGgpKSAhPSAwKQorCQkgICBzbGlycF9leGl0KDEpOworCQlzcHJpbnRmKGJ1ZmYsICJraWxsIG5vbmU6JWQiLCBzbGlycF9zb2NrZXRfdW5pdCk7CisJCXdyaXRlKHMsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKwl9CisjZW5kaWYKKwlzbGlycF9leGl0KDApOworfQorCisKK3ZvaWQKK3Nub296ZSgpCit7CisJc2lnc2V0X3QgczsKKwlpbnQgaTsKKworCS8qIERvbid0IG5lZWQgb3VyIGRhdGEgYW55bW9yZSAqLworCS8qIFhYWCBUaGlzIG1ha2VzIFN1bk9TIGJhcmYgKi8KKy8qCWJyaygwKTsgKi8KKworCS8qIENsb3NlIGFsbCBmZCdzICovCisJZm9yIChpID0gMjU1OyBpID49IDA7IGktLSkKKwkgICBjbG9zZShpKTsKKworCXNpZ25hbChTSUdRVUlULCBzbGlycF9leGl0KTsKKwlzaWduYWwoU0lHSFVQLCBzbm9vemVfaHVwKTsKKwlzaWdlbXB0eXNldCgmcyk7CisKKwkvKiBXYWl0IGZvciBhbnkgc2lnbmFsICovCisJc2lnc3VzcGVuZCgmcyk7CisKKwkvKiBKdXN0IGluIGNhc2UgLi4uICovCisJZXhpdCgyNTUpOworfQorCit2b2lkCityZWxheShzKQorCWludCBzOworeworCWNoYXIgYnVmWzgxOTJdOworCWludCBuOworCWZkX3NldCByZWFkZmRzOworCXN0cnVjdCB0dHlzICp0dHlwOworCisJLyogRG9uJ3QgbmVlZCBvdXIgZGF0YSBhbnltb3JlICovCisJLyogWFhYIFRoaXMgbWFrZXMgU3VuT1MgYmFyZiAqLworLyoJYnJrKDApOyAqLworCisJc2lnbmFsKFNJR1FVSVQsIHNsaXJwX2V4aXQpOworCXNpZ25hbChTSUdIVVAsIHNsaXJwX2V4aXQpOworICAgICAgICBzaWduYWwoU0lHSU5ULCBzbGlycF9leGl0KTsKKwlzaWduYWwoU0lHVEVSTSwgc2xpcnBfZXhpdCk7CisKKwkvKiBGdWRnZSB0byBnZXQgdGVybV9yYXcgYW5kIHRlcm1fcmVzdG9yZSB0byB3b3JrICovCisJaWYgKE5VTEwgPT0gKHR0eXAgPSB0dHlfYXR0YWNoICgwLCBzbGlycF90dHkpKSkgeworICAgICAgICAgbHByaW50ICgiRXJyb3I6IHR0eV9hdHRhY2ggZmFpbGVkIGluIG1pc2MuYzpyZWxheSgpXHJcbiIpOworICAgICAgICAgc2xpcnBfZXhpdCAoMSk7CisgICAgfQorCXR0eXAtPmZkID0gMDsKKwl0dHlwLT5mbGFncyB8PSBUVFlfQ1RUWTsKKwl0ZXJtX3Jhdyh0dHlwKTsKKworCXdoaWxlICgxKSB7CisJCUZEX1pFUk8oJnJlYWRmZHMpOworCisJCUZEX1NFVCgwLCAmcmVhZGZkcyk7CisJCUZEX1NFVChzLCAmcmVhZGZkcyk7CisKKwkJbiA9IHNlbGVjdChzKzEsICZyZWFkZmRzLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChzdHJ1Y3QgdGltZXZhbCAqKTApOworCisJCWlmIChuIDw9IDApCisJCSAgIHNsaXJwX2V4aXQoMCk7CisKKwkJaWYgKEZEX0lTU0VUKDAsICZyZWFkZmRzKSkgeworCQkJbiA9IHJlYWQoMCwgYnVmLCA4MTkyKTsKKwkJCWlmIChuIDw9IDApCisJCQkgICBzbGlycF9leGl0KDApOworCQkJbiA9IHdyaXRlbihzLCBidWYsIG4pOworCQkJaWYgKG4gPD0gMCkKKwkJCSAgIHNsaXJwX2V4aXQoMCk7CisJCX0KKworCQlpZiAoRkRfSVNTRVQocywgJnJlYWRmZHMpKSB7CisJCQluID0gcmVhZChzLCBidWYsIDgxOTIpOworCQkJaWYgKG4gPD0gMCkKKwkJCSAgIHNsaXJwX2V4aXQoMCk7CisJCQluID0gd3JpdGVuKDAsIGJ1Ziwgbik7CisJCQlpZiAobiA8PSAwKQorCQkJICAgc2xpcnBfZXhpdCgwKTsKKwkJfQorCX0KKworCS8qIEp1c3QgaW4gY2FzZS4uLi4gKi8KKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUUVNVQorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorCit2b2lkIGxwcmludChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIG1vbml0b3JfdnByaW50ZihjdXJfbW9uLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKyNlbHNlCitpbnQgKCpscHJpbnRfcHJpbnQpIF9QKCh2b2lkICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworY2hhciAqbHByaW50X3B0ciwgKmxwcmludF9wdHIyLCAqKmxwcmludF9hcmc7CisKK3ZvaWQKKyNpZmRlZiBfX1NURENfXworbHByaW50KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2Vsc2UKK2xwcmludCh2YV9hbGlzdCkgdmFfZGNsCisjZW5kaWYKK3sKKwl2YV9saXN0IGFyZ3M7CisKKyNpZmRlZiBfX1NURENfXworICAgICAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgICAgICAgY2hhciAqZm9ybWF0OworICAgICAgICB2YV9zdGFydChhcmdzKTsKKyAgICAgICAgZm9ybWF0ID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKyNpZiAwCisJLyogSWYgd2UncmUgcHJpbnRpbmcgdG8gYW4gc2J1ZiwgbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHJvb20gKi8KKwkvKiBYWFggKzEwMD8gKi8KKwlpZiAobHByaW50X3NiKSB7CisJCWlmICgobHByaW50X3B0ciAtIGxwcmludF9zYi0+c2Jfd3B0cikgPj0KKwkJICAgIChscHJpbnRfc2ItPnNiX2RhdGFsZW4gLSAoc3RybGVuKGZvcm1hdCkgKyAxMDApKSkgeworCQkJaW50IGRlbHRhdyA9IGxwcmludF9zYi0+c2Jfd3B0ciAtIGxwcmludF9zYi0+c2JfZGF0YTsKKwkJCWludCBkZWx0YXIgPSBscHJpbnRfc2ItPnNiX3JwdHIgLSBscHJpbnRfc2ItPnNiX2RhdGE7CisJCQlpbnQgZGVsdGFwID0gbHByaW50X3B0ciAtICAgICAgICAgbHByaW50X3NiLT5zYl9kYXRhOworCisJCQlscHJpbnRfc2ItPnNiX2RhdGEgPSAoY2hhciAqKXJlYWxsb2MobHByaW50X3NiLT5zYl9kYXRhLAorCQkJCQkJCSAgICAgbHByaW50X3NiLT5zYl9kYXRhbGVuICsgVENQX1NORFNQQUNFKTsKKworCQkJLyogQWRqdXN0IGFsbCB2YWx1ZXMgKi8KKwkJCWxwcmludF9zYi0+c2Jfd3B0ciA9IGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhdzsKKwkJCWxwcmludF9zYi0+c2JfcnB0ciA9IGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhcjsKKwkJCWxwcmludF9wdHIgPSAgICAgICAgIGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhcDsKKworCQkJbHByaW50X3NiLT5zYl9kYXRhbGVuICs9IFRDUF9TTkRTUEFDRTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChscHJpbnRfcHJpbnQpCisJICAgbHByaW50X3B0ciArPSAoKmxwcmludF9wcmludCkoKmxwcmludF9hcmcsIGZvcm1hdCwgYXJncyk7CisKKwkvKiBDaGVjayBpZiB0aGV5IHdhbnQgb3V0cHV0IHRvIGJlIGxvZ2dlZCB0byBmaWxlIGFzIHdlbGwgKi8KKwlpZiAobGZkKSB7CisJCS8qCisJCSAqIFJlbW92ZSBccidzCisJCSAqIG90aGVyd2lzZSB5b3UnbGwgZ2V0IF5NIGFsbCBvdmVyIHRoZSBmaWxlCisJCSAqLworCQlpbnQgbGVuID0gc3RybGVuKGZvcm1hdCk7CisJCWNoYXIgKmJwdHIxLCAqYnB0cjI7CisKKwkJYnB0cjEgPSBicHRyMiA9IHN0cmR1cChmb3JtYXQpOworCisJCXdoaWxlIChsZW4tLSkgeworCQkJaWYgKCpicHRyMSA9PSAnXHInKQorCQkJICAgbWVtY3B5KGJwdHIxLCBicHRyMSsxLCBsZW4rMSk7CisJCQllbHNlCisJCQkgICBicHRyMSsrOworCQl9CisJCXZmcHJpbnRmKGxmZCwgYnB0cjIsIGFyZ3MpOworCQlmcmVlKGJwdHIyKTsKKwl9CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkCithZGRfZW11KGJ1ZmYpCisJY2hhciAqYnVmZjsKK3sKKwl1X2ludCBscG9ydCwgZnBvcnQ7CisJdV9pbnQ4X3QgdG9zID0gMCwgZW11ID0gMDsKKwljaGFyIGJ1ZmYxWzI1Nl0sIGJ1ZmYyWzI1Nl0sIGJ1ZmY0WzEyOF07CisJY2hhciAqYnVmZjMgPSBidWZmNDsKKwlzdHJ1Y3QgZW11X3QgKmVtdXA7CisJc3RydWN0IHNvY2tldCAqc287CisKKwlpZiAoc3NjYW5mKGJ1ZmYsICIlMjU2cyAlMjU2cyIsIGJ1ZmYyLCBidWZmMSkgIT0gMikgeworCQlscHJpbnQoIkVycm9yOiBCYWQgYXJndW1lbnRzXHJcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNzY2FuZihidWZmMSwgIiVkOiVkIiwgJmxwb3J0LCAmZnBvcnQpICE9IDIpIHsKKwkJbHBvcnQgPSAwOworCQlpZiAoc3NjYW5mKGJ1ZmYxLCAiJWQiLCAmZnBvcnQpICE9IDEpIHsKKwkJCWxwcmludCgiRXJyb3I6IEJhZCBmaXJzdCBhcmd1bWVudFxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChzc2NhbmYoYnVmZjIsICIlMTI4W146XTolMTI4cyIsIGJ1ZmYxLCBidWZmMykgIT0gMikgeworCQlidWZmMyA9IDA7CisJCWlmIChzc2NhbmYoYnVmZjIsICIlMjU2cyIsIGJ1ZmYxKSAhPSAxKSB7CisJCQlscHJpbnQoIkVycm9yOiBCYWQgc2Vjb25kIGFyZ3VtZW50XHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGJ1ZmYzKSB7CisJCWlmIChzdHJjbXAoYnVmZjMsICJsb3dkZWxheSIpID09IDApCisJCSAgIHRvcyA9IElQVE9TX0xPV0RFTEFZOworCQllbHNlIGlmIChzdHJjbXAoYnVmZjMsICJ0aHJvdWdocHV0IikgPT0gMCkKKwkJICAgdG9zID0gSVBUT1NfVEhST1VHSFBVVDsKKwkJZWxzZSB7CisJCQlscHJpbnQoIkVycm9yOiBFeHBlY3RpbmcgXCJsb3dkZWxheVwiL1widGhyb3VnaHB1dFwiXHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHN0cmNtcChidWZmMSwgImZ0cCIpID09IDApCisJICAgZW11ID0gRU1VX0ZUUDsKKwllbHNlIGlmIChzdHJjbXAoYnVmZjEsICJpcmMiKSA9PSAwKQorCSAgIGVtdSA9IEVNVV9JUkM7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZmYxLCAibm9uZSIpID09IDApCisJICAgZW11ID0gRU1VX05PTkU7IC8qIGllOiBubyBlbXVsYXRpb24gKi8KKwllbHNlIHsKKwkJbHByaW50KCJFcnJvcjogVW5rbm93biBzZXJ2aWNlXHJcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogRmlyc3QsIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYWxyZWFkeSBlbXVsYXRlZCAqLworCWZvciAoZW11cCA9IHRjcGVtdTsgZW11cDsgZW11cCA9IGVtdXAtPm5leHQpIHsKKwkJaWYgKGVtdXAtPmxwb3J0ID09IGxwb3J0ICYmIGVtdXAtPmZwb3J0ID09IGZwb3J0KSB7CisJCQlscHJpbnQoIkVycm9yOiBwb3J0IGFscmVhZHkgZW11bGF0ZWRcclxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBsaW5rIGl0ICovCisJZW11cCA9IChzdHJ1Y3QgZW11X3QgKiltYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgZW11X3QpKTsKKwllbXVwLT5scG9ydCA9ICh1X2ludDE2X3QpbHBvcnQ7CisJZW11cC0+ZnBvcnQgPSAodV9pbnQxNl90KWZwb3J0OworCWVtdXAtPnRvcyA9IHRvczsKKwllbXVwLT5lbXUgPSBlbXU7CisJZW11cC0+bmV4dCA9IHRjcGVtdTsKKwl0Y3BlbXUgPSBlbXVwOworCisJLyogQW5kIGZpbmFsbHksIG1hcmsgYWxsIGN1cnJlbnQgc2Vzc2lvbnMsIGlmIGFueSwgYXMgYmVpbmcgZW11bGF0ZWQgKi8KKwlmb3IgKHNvID0gdGNiLnNvX25leHQ7IHNvICE9ICZ0Y2I7IHNvID0gc28tPnNvX25leHQpIHsKKwkJaWYgKChscG9ydCAmJiBscG9ydCA9PSBzby0+c29fbGFkZHJfcG9ydCkgfHwKKwkJICAgIChmcG9ydCAmJiBmcG9ydCA9PSBzby0+c29fZmFkZHJfcG9ydCkpIHsKKwkJCWlmIChlbXUpCisJCQkgICBzby0+c29fZW11ID0gZW11OworCQkJaWYgKHRvcykKKwkJCSAgIHNvLT5zb19pcHRvcyA9IHRvczsKKwkJfQorCX0KKworCWxwcmludCgiQWRkaW5nIGVtdWxhdGlvbiBmb3IgJXMgdG8gcG9ydCAlZC8lZFxyXG4iLCBidWZmMSwgZW11cC0+bHBvcnQsIGVtdXAtPmZwb3J0KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQkFEX1NQUklOVEYKKworI3VuZGVmIHZzcHJpbnRmCisjdW5kZWYgc3ByaW50ZgorCisvKgorICogU29tZSBCU0QtZGVyaXZlZCBzeXN0ZW1zIGhhdmUgYSBzcHJpbnRmIHdoaWNoIHJldHVybnMgY2hhciAqCisgKi8KKworaW50Cit2c3ByaW50Zl9sZW4oc3RyaW5nLCBmb3JtYXQsIGFyZ3MpCisJY2hhciAqc3RyaW5nOworCWNvbnN0IGNoYXIgKmZvcm1hdDsKKwl2YV9saXN0IGFyZ3M7Cit7CisJdnNwcmludGYoc3RyaW5nLCBmb3JtYXQsIGFyZ3MpOworCXJldHVybiBzdHJsZW4oc3RyaW5nKTsKK30KKworaW50CisjaWZkZWYgX19TVERDX18KK3NwcmludGZfbGVuKGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisjZWxzZQorc3ByaW50Zl9sZW4odmFfYWxpc3QpIHZhX2RjbAorI2VuZGlmCit7CisJdmFfbGlzdCBhcmdzOworI2lmZGVmIF9fU1REQ19fCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyNlbHNlCisJY2hhciAqc3RyaW5nOworCWNoYXIgKmZvcm1hdDsKKwl2YV9zdGFydChhcmdzKTsKKwlzdHJpbmcgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwlmb3JtYXQgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKyNlbmRpZgorCXZzcHJpbnRmKHN0cmluZywgZm9ybWF0LCBhcmdzKTsKKwlyZXR1cm4gc3RybGVuKHN0cmluZyk7Cit9CisKKyNlbmRpZgorCisjaWYgMAordm9pZAordV9zbGVlcChpbnQgdXNlYykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0OworCWZkX3NldCBmZHNldDsKKworCUZEX1pFUk8oJmZkc2V0KTsKKworCXQudHZfc2VjID0gMDsKKwl0LnR2X3VzZWMgPSB1c2VjICogMTAwMDsKKworCXNlbGVjdCgwLCAmZmRzZXQsICZmZHNldCwgJmZkc2V0LCAmdCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFNldCBmZCBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nCisgKi8KKwordm9pZAorZmRfbm9uYmxvY2soaW50IGZkKQoreworI2lmZGVmIEZJT05CSU8KKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgdW5zaWduZWQgbG9uZyBvcHQgPSAxOworI2Vsc2UKKyAgICAgICAgaW50IG9wdCA9IDE7CisjZW5kaWYKKworCWlvY3Rsc29ja2V0KGZkLCBGSU9OQklPLCAmb3B0KTsKKyNlbHNlCisJaW50IG9wdDsKKworCW9wdCA9IGZjbnRsKGZkLCBGX0dFVEZMLCAwKTsKKwlvcHQgfD0gT19OT05CTE9DSzsKKwlmY250bChmZCwgRl9TRVRGTCwgb3B0KTsKKyNlbmRpZgorfQorCit2b2lkCitmZF9ibG9jayhpbnQgZmQpCit7CisjaWZkZWYgRklPTkJJTworI2lmZGVmIF9XSU4zMgorICAgICAgICB1bnNpZ25lZCBsb25nIG9wdCA9IDA7CisjZWxzZQorCWludCBvcHQgPSAwOworI2VuZGlmCisKKwlpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7CisjZWxzZQorCWludCBvcHQ7CisKKwlvcHQgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisJb3B0ICY9IH5PX05PTkJMT0NLOworCWZjbnRsKGZkLCBGX1NFVEZMLCBvcHQpOworI2VuZGlmCit9CisKKworI2lmIDAKKy8qCisgKiBpbnZva2UgUlNICisgKi8KK2ludAorcnNoX2V4ZWMoc28sbnMsIHVzZXIsIGhvc3QsIGFyZ3MpCisJc3RydWN0IHNvY2tldCAqc287CisJc3RydWN0IHNvY2tldCAqbnM7CisJY2hhciAqdXNlcjsKKwljaGFyICpob3N0OworCWNoYXIgKmFyZ3M7Cit7CisJaW50IGZkWzJdOworCWludCBmZDBbMl07CisJaW50IHM7CisJY2hhciBidWZmWzI1Nl07CisKKwlERUJVR19DQUxMKCJyc2hfZXhlYyIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisKKwlpZiAocGlwZShmZCk8MCkgeworICAgICAgICAgIGxwcmludCgiRXJyb3I6IHBpcGUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gMDsKKwl9CisvKiAjaWZkZWYgSEFWRV9TT0NLRVRQQUlSICovCisjaWYgMQorICAgICAgICBpZiAoc29ja2V0cGFpcihQRl9VTklYLFNPQ0tfU1RSRUFNLDAsIGZkMCkgPT0gLTEpIHsKKyAgICAgICAgICBjbG9zZShmZFswXSk7CisgICAgICAgICAgY2xvc2UoZmRbMV0pOworICAgICAgICAgIGxwcmludCgiRXJyb3I6IG9wZW5wdHkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaWYgKHNsaXJwX29wZW5wdHkoJmZkMFswXSwgJmZkMFsxXSkgPT0gLTEpIHsKKyAgICAgICAgICBjbG9zZShmZFswXSk7CisgICAgICAgICAgY2xvc2UoZmRbMV0pOworICAgICAgICAgIGxwcmludCgiRXJyb3I6IG9wZW5wdHkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmCisKKwlzd2l0Y2goZm9yaygpKSB7CisJIGNhc2UgLTE6CisgICAgICAgICAgIGxwcmludCgiRXJyb3I6IGZvcmsgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgY2xvc2UoZmRbMF0pOworICAgICAgICAgICBjbG9zZShmZFsxXSk7CisgICAgICAgICAgIGNsb3NlKGZkMFswXSk7CisgICAgICAgICAgIGNsb3NlKGZkMFsxXSk7CisgICAgICAgICAgIHJldHVybiAwOworCisJIGNhc2UgMDoKKyAgICAgICAgICAgY2xvc2UoZmRbMF0pOworICAgICAgICAgICBjbG9zZShmZDBbMF0pOworCisJCS8qIFNldCB0aGUgRElTUExBWSAqLworICAgICAgICAgICBpZiAoeF9wb3J0ID49IDApIHsKKyNpZmRlZiBIQVZFX1NFVEVOVgorICAgICAgICAgICAgIHNwcmludGYoYnVmZiwgIiVzOiVkLiVkIiwgaW5ldF9udG9hKG91cl9hZGRyKSwgeF9wb3J0LCB4X3NjcmVlbik7CisgICAgICAgICAgICAgc2V0ZW52KCJESVNQTEFZIiwgYnVmZiwgMSk7CisjZWxzZQorICAgICAgICAgICAgIHNwcmludGYoYnVmZiwgIkRJU1BMQVk9JXM6JWQuJWQiLCBpbmV0X250b2Eob3VyX2FkZHIpLCB4X3BvcnQsIHhfc2NyZWVuKTsKKyAgICAgICAgICAgICBwdXRlbnYoYnVmZik7CisjZW5kaWYKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIGR1cDIoZmQwWzFdLCAwKTsKKyAgICAgICAgICAgZHVwMihmZDBbMV0sIDEpOworICAgICAgICAgICBkdXAyKGZkWzFdLCAyKTsKKyAgICAgICAgICAgZm9yIChzID0gMzsgcyA8PSAyNTU7IHMrKykKKyAgICAgICAgICAgICBjbG9zZShzKTsKKworICAgICAgICAgICBleGVjbHAoInJzaCIsInJzaCIsIi1sIiwgdXNlciwgaG9zdCwgYXJncywgTlVMTCk7CisKKyAgICAgICAgICAgLyogT29vcHMsIGZhaWxlZCwgbGV0J3MgdGVsbCB0aGUgdXNlciB3aHkgKi8KKworICAgICAgICAgICBzcHJpbnRmKGJ1ZmYsICJFcnJvcjogZXhlY2xwIG9mICVzIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgInJzaCIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgIHdyaXRlKDIsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKyAgICAgICAgICAgY2xvc2UoMCk7IGNsb3NlKDEpOyBjbG9zZSgyKTsgLyogWFhYICovCisgICAgICAgICAgIGV4aXQoMSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjbG9zZShmZFsxXSk7CisgICAgICAgICAgY2xvc2UoZmQwWzFdKTsKKyAgICAgICAgICBucy0+cz1mZFswXTsKKyAgICAgICAgICBzby0+cz1mZDBbMF07CisKKyAgICAgICAgICByZXR1cm4gMTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9taXNjLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjQ0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvbWlzYy5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2lmbmRlZiBfTUlTQ19IXworI2RlZmluZSBfTUlTQ19IXworCitzdHJ1Y3QgZXhfbGlzdCB7CisJaW50IGV4X3B0eTsJCQkvKiBEbyB3ZSB3YW50IGEgcHR5PyAqLworCWludCBleF9hZGRyOwkJCS8qIFRoZSBsYXN0IGJ5dGUgb2YgdGhlIGFkZHJlc3MgKi8KKwlpbnQgZXhfZnBvcnQ7ICAgICAgICAgICAgICAgICAgIC8qIFBvcnQgdG8gdGVsbmV0IHRvICovCisJY29uc3QgY2hhciAqZXhfZXhlYzsgICAgICAgICAgICAvKiBDb21tYW5kIGxpbmUgb2Ygd2hhdCB0byBleGVjICovCisJc3RydWN0IGV4X2xpc3QgKmV4X25leHQ7Cit9OworCitleHRlcm4gc3RydWN0IGV4X2xpc3QgKmV4ZWNfbGlzdDsKK2V4dGVybiB1X2ludCB0aW1lX2Zhc3R0aW1vLCBsYXN0X3Nsb3d0aW1vOworCitleHRlcm4gaW50ICgqbHByaW50X3ByaW50KSBfUCgodm9pZCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKK2V4dGVybiBjaGFyICpscHJpbnRfcHRyLCAqbHByaW50X3B0cjIsICoqbHByaW50X2FyZzsKK2V4dGVybiBzdHJ1Y3Qgc2J1ZiAqbHByaW50X3NiOworCisjaWZuZGVmIEhBVkVfU1RSRFVQCitjaGFyICpzdHJkdXAgX1AoKGNvbnN0IGNoYXIgKikpOworI2VuZGlmCisKK3ZvaWQgZG9fd2FpdCBfUCgoaW50KSk7CisKKyNkZWZpbmUgRU1VX05PTkUgMHgwCisKKy8qIFRDUCBlbXVsYXRpb25zICovCisjZGVmaW5lIEVNVV9DVEwgMHgxCisjZGVmaW5lIEVNVV9GVFAgMHgyCisjZGVmaW5lIEVNVV9LU0ggMHgzCisjZGVmaW5lIEVNVV9JUkMgMHg0CisjZGVmaW5lIEVNVV9SRUFMQVVESU8gMHg1CisjZGVmaW5lIEVNVV9STE9HSU4gMHg2CisjZGVmaW5lIEVNVV9JREVOVCAweDcKKyNkZWZpbmUgRU1VX1JTSCAweDgKKworI2RlZmluZSBFTVVfTk9DT05ORUNUIDB4MTAJLyogRG9uJ3QgY29ubmVjdCAqLworCisvKiBVRFAgZW11bGF0aW9ucyAqLworI2RlZmluZSBFTVVfVEFMSwkweDEKKyNkZWZpbmUgRU1VX05UQUxLCTB4MgorI2RlZmluZSBFTVVfQ1VTRUVNRQkweDMKKworc3RydWN0IHRvc190IHsKKwl1X2ludDE2X3QgbHBvcnQ7CisJdV9pbnQxNl90IGZwb3J0OworCXVfaW50OF90IHRvczsKKwl1X2ludDhfdCBlbXU7Cit9OworCitzdHJ1Y3QgZW11X3QgeworCXVfaW50MTZfdCBscG9ydDsKKwl1X2ludDE2X3QgZnBvcnQ7CisJdV9pbnQ4X3QgdG9zOworCXVfaW50OF90IGVtdTsKKwlzdHJ1Y3QgZW11X3QgKm5leHQ7Cit9OworCisjaWZuZGVmIENPTkZJR19RRU1VCitleHRlcm4gc3RydWN0IGVtdV90ICp0Y3BlbXU7CisjZW5kaWYKKwordm9pZCBnZXRvdXJhZGRyIF9QKCh2b2lkKSk7Cit2b2lkIHNsaXJwX2luc3F1ZSBfUCgodm9pZCAqLCB2b2lkICopKTsKK3ZvaWQgc2xpcnBfcmVtcXVlIF9QKCh2b2lkICopKTsKK2ludCBhZGRfZXhlYyBfUCgoc3RydWN0IGV4X2xpc3QgKiosIGludCwgY2hhciAqLCBpbnQsIGludCkpOworaW50IHNsaXJwX29wZW5wdHkgX1AoKGludCAqLCBpbnQgKikpOworaW50IGZvcmtfZXhlYyhzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqZXgsIGludCBkb19wdHkpOwordm9pZCBzbm9vemVfaHVwIF9QKChpbnQpKTsKK3ZvaWQgc25vb3plIF9QKCh2b2lkKSk7Cit2b2lkIHJlbGF5IF9QKChpbnQpKTsKK3ZvaWQgYWRkX2VtdSBfUCgoY2hhciAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NidWYuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4ZmUyOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zYnVmLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKK3N0YXRpYyB2b2lkIHNiYXBwZW5kc2Ioc3RydWN0IHNidWYgKnNiLCBzdHJ1Y3QgbWJ1ZiAqbSk7CisKKy8qIERvbmUgYXMgYSBtYWNybyBpbiBzb2NrZXQuaCAqLworLyogaW50CisgKiBzYnNwYWNlKHN0cnVjdCBzb2NrYnVmZiAqc2IpCisgKiB7CisgKglyZXR1cm4gU0JfREFUQUxFTiAtIHNiLT5zYl9jYzsKKyAqIH0KKyAqLworCit2b2lkCitzYmZyZWUoc3RydWN0IHNidWYgKnNiKQoreworCWZyZWUoc2ItPnNiX2RhdGEpOworfQorCit2b2lkCitzYmRyb3Aoc3RydWN0IHNidWYgKnNiLCBpbnQgbnVtKQoreworCS8qCisJICogV2UgY2FuIG9ubHkgZHJvcCBob3cgbXVjaCB3ZSBoYXZlCisJICogVGhpcyBzaG91bGQgbmV2ZXIgc3VjY2VlZAorCSAqLworCWlmKCh1bnNpZ25lZCBsb25nKW51bSA+IHNiLT5zYl9jYykKKwkJbnVtID0gKGludClzYi0+c2JfY2M7CisJc2ItPnNiX2NjIC09IG51bTsKKwlzYi0+c2JfcnB0ciArPSBudW07CisJaWYoc2ItPnNiX3JwdHIgPj0gc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikKKwkJc2ItPnNiX3JwdHIgLT0gc2ItPnNiX2RhdGFsZW47CisKK30KKwordm9pZAorc2JyZXNlcnZlKHN0cnVjdCBzYnVmICpzYiwgaW50IHNpemUpCit7CisJaWYgKHNiLT5zYl9kYXRhKSB7CisJCS8qIEFscmVhZHkgYWxsb2NlZCwgcmVhbGxvYyBpZiBuZWNlc3NhcnkgKi8KKwkJaWYgKHNiLT5zYl9kYXRhbGVuICE9ICh1bnNpZ25lZClzaXplKSB7CisJCQlzYi0+c2Jfd3B0ciA9IHNiLT5zYl9ycHRyID0gc2ItPnNiX2RhdGEgPSAoY2hhciAqKXJlYWxsb2Moc2ItPnNiX2RhdGEsIHNpemUpOworCQkJc2ItPnNiX2NjID0gMDsKKwkJCWlmIChzYi0+c2Jfd3B0cikKKwkJCSAgIHNiLT5zYl9kYXRhbGVuID0gc2l6ZTsKKwkJCWVsc2UKKwkJCSAgIHNiLT5zYl9kYXRhbGVuID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNiLT5zYl93cHRyID0gc2ItPnNiX3JwdHIgPSBzYi0+c2JfZGF0YSA9IChjaGFyICopbWFsbG9jKHNpemUpOworCQlzYi0+c2JfY2MgPSAwOworCQlpZiAoc2ItPnNiX3dwdHIpCisJCSAgIHNiLT5zYl9kYXRhbGVuID0gc2l6ZTsKKwkJZWxzZQorCQkgICBzYi0+c2JfZGF0YWxlbiA9IDA7CisJfQorfQorCisvKgorICogVHJ5IGFuZCB3cml0ZSgpIHRvIHRoZSBzb2NrZXQsIHdoYXRldmVyIGRvZXNuJ3QgZ2V0IHdyaXR0ZW4KKyAqIGFwcGVuZCB0byB0aGUgYnVmZmVyLi4uIGZvciBhIGhvc3Qgd2l0aCBhIGZhc3QgbmV0IGNvbm5lY3Rpb24sCisgKiB0aGlzIHByZXZlbnRzIGFuIHVubmVjZXNzYXJ5IGNvcHkgb2YgdGhlIGRhdGEKKyAqICh0aGUgc29ja2V0IGlzIG5vbi1ibG9ja2luZywgc28gd2Ugd29uJ3QgaGFuZykKKyAqLwordm9pZAorc2JhcHBlbmQoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCWludCByZXQgPSAwOworCisJREVCVUdfQ0FMTCgic2JhcHBlbmQiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcpc28pOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygibS0+bV9sZW4gPSAlZCIsIG0tPm1fbGVuKTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLiAgZS5nLiBmb3JlaWduIGhvc3QgY2xvc2VzIGNvbm5lY3Rpb24gKi8KKwlpZiAobS0+bV9sZW4gPD0gMCkgeworCQltX2ZyZWUobSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIHVyZ2VudCBkYXRhLCBjYWxsIHNvc2VuZG9vYgorCSAqIGlmIG5vdCBhbGwgd2FzIHNlbnQsIHNvd3JpdGUgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QKKwkgKiAoVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGFuIG9wdGltaXNhdGlvbikKKwkgKi8KKwlpZiAoc28tPnNvX3VyZ2MpIHsKKwkJc2JhcHBlbmRzYigmc28tPnNvX3JjdiwgbSk7CisJCW1fZnJlZShtKTsKKwkJc29zZW5kb29iKHNvKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2Ugb25seSB3cml0ZSBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwKKwkgKiBvdHRoZXJ3aXNlIGl0J2xsIGFycml2ZSBvdXQgb2Ygb3JkZXIsIGFuZCBoZW5jZSBjb3JydXB0CisJICovCisJaWYgKCFzby0+c29fcmN2LnNiX2NjKQorCSAgIHJldCA9IHNsaXJwX3NlbmQoc28sIG0tPm1fZGF0YSwgbS0+bV9sZW4sIDApOworCisJaWYgKHJldCA8PSAwKSB7CisJCS8qCisJCSAqIE5vdGhpbmcgd2FzIHdyaXR0ZW4KKwkJICogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzb2NrZXQgaGFzIGNsb3NlZCwgYnV0CisJCSAqIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZSBpZiBpdCBoYXMgY2xvc2VkLAorCQkgKiBpdCB3aWxsIGJlIGRldGVjdGVkIGluIHRoZSBub3JtYWwgd2F5IGJ5IHNvcmVhZCgpCisJCSAqLworCQlzYmFwcGVuZHNiKCZzby0+c29fcmN2LCBtKTsKKwl9IGVsc2UgaWYgKHJldCAhPSBtLT5tX2xlbikgeworCQkvKgorCQkgKiBTb21ldGhpbmcgd2FzIHdyaXR0ZW4sIGJ1dCBub3QgZXZlcnl0aGluZy4uCisJCSAqIHNiYXBwZW5kc2IgdGhlIHJlc3QKKwkJICovCisJCW0tPm1fbGVuIC09IHJldDsKKwkJbS0+bV9kYXRhICs9IHJldDsKKwkJc2JhcHBlbmRzYigmc28tPnNvX3JjdiwgbSk7CisJfSAvKiBlbHNlICovCisJLyogV2hhdGV2ZXIgaGFwcGVuZWQsIHdlIGZyZWUgdGhlIG1idWYgKi8KKwltX2ZyZWUobSk7Cit9CisKKy8qCisgKiBDb3B5IHRoZSBkYXRhIGZyb20gbSBpbnRvIHNiCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tCisgKi8KK3N0YXRpYyB2b2lkCitzYmFwcGVuZHNiKHN0cnVjdCBzYnVmICpzYiwgc3RydWN0IG1idWYgKm0pCit7CisJaW50IGxlbiwgbiwgIG5uOworCisJbGVuID0gbS0+bV9sZW47CisKKwlpZiAoc2ItPnNiX3dwdHIgPCBzYi0+c2JfcnB0cikgeworCQluID0gc2ItPnNiX3JwdHIgLSBzYi0+c2Jfd3B0cjsKKwkJaWYgKG4gPiBsZW4pIG4gPSBsZW47CisJCW1lbWNweShzYi0+c2Jfd3B0ciwgbS0+bV9kYXRhLCBuKTsKKwl9IGVsc2UgeworCQkvKiBEbyB0aGUgcmlnaHQgZWRnZSBmaXJzdCAqLworCQluID0gc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbiAtIHNiLT5zYl93cHRyOworCQlpZiAobiA+IGxlbikgbiA9IGxlbjsKKwkJbWVtY3B5KHNiLT5zYl93cHRyLCBtLT5tX2RhdGEsIG4pOworCQlsZW4gLT0gbjsKKwkJaWYgKGxlbikgeworCQkJLyogTm93IHRoZSBsZWZ0IGVkZ2UgKi8KKwkJCW5uID0gc2ItPnNiX3JwdHIgLSBzYi0+c2JfZGF0YTsKKwkJCWlmIChubiA+IGxlbikgbm4gPSBsZW47CisJCQltZW1jcHkoc2ItPnNiX2RhdGEsbS0+bV9kYXRhK24sbm4pOworCQkJbiArPSBubjsKKwkJfQorCX0KKworCXNiLT5zYl9jYyArPSBuOworCXNiLT5zYl93cHRyICs9IG47CisJaWYgKHNiLT5zYl93cHRyID49IHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pCisJCXNiLT5zYl93cHRyIC09IHNiLT5zYl9kYXRhbGVuOworfQorCisvKgorICogQ29weSBkYXRhIGZyb20gc2J1ZiB0byBhIG5vcm1hbCwgc3RyYWlnaHQgYnVmZmVyCisgKiBEb24ndCB1cGRhdGUgdGhlIHNidWYgcnB0ciwgdGhpcyB3aWxsIGJlCisgKiBkb25lIGluIHNiZHJvcCB3aGVuIHRoZSBkYXRhIGlzIGFja2VkCisgKi8KK3ZvaWQKK3NiY29weShzdHJ1Y3Qgc2J1ZiAqc2IsIGludCBvZmYsIGludCBsZW4sIGNoYXIgKnRvKQoreworCWNoYXIgKmZyb207CisKKwlmcm9tID0gc2ItPnNiX3JwdHIgKyBvZmY7CisJaWYgKGZyb20gPj0gc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikKKwkJZnJvbSAtPSBzYi0+c2JfZGF0YWxlbjsKKworCWlmIChmcm9tIDwgc2ItPnNiX3dwdHIpIHsKKwkJaWYgKCh1bnNpZ25lZClsZW4gPiBzYi0+c2JfY2MpIGxlbiA9IChpbnQpc2ItPnNiX2NjOworCQltZW1jcHkodG8sZnJvbSxsZW4pOworCX0gZWxzZSB7CisJCS8qIHJlLXVzZSBvZmYgKi8KKwkJb2ZmID0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pIC0gZnJvbTsKKwkJaWYgKG9mZiA+IGxlbikgb2ZmID0gbGVuOworCQltZW1jcHkodG8sZnJvbSxvZmYpOworCQlsZW4gLT0gb2ZmOworCQlpZiAobGVuKQorCQkgICBtZW1jcHkodG8rb2ZmLHNiLT5zYl9kYXRhLGxlbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NidWYuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRmMTAzNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zYnVmLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaWZuZGVmIF9TQlVGX0hfCisjZGVmaW5lIF9TQlVGX0hfCisKKyNkZWZpbmUgc2JmbHVzaChzYikgc2Jkcm9wKChzYiksKHNiKS0+c2JfY2MpCisjZGVmaW5lIHNic3BhY2Uoc2IpICgoc2IpLT5zYl9kYXRhbGVuIC0gKHNiKS0+c2JfY2MpCisKK3N0cnVjdCBzYnVmIHsKKwl1X2ludAlzYl9jYzsJCS8qIGFjdHVhbCBjaGFycyBpbiBidWZmZXIgKi8KKwl1X2ludAlzYl9kYXRhbGVuOwkvKiBMZW5ndGggb2YgZGF0YSAgKi8KKwljaGFyCSpzYl93cHRyOwkvKiB3cml0ZSBwb2ludGVyLiBwb2ludHMgdG8gd2hlcmUgdGhlIG5leHQKKwkJCQkgKiBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBpbiB0aGUgc2J1ZiAqLworCWNoYXIJKnNiX3JwdHI7CS8qIHJlYWQgcG9pbnRlci4gcG9pbnRzIHRvIHdoZXJlIHRoZSBuZXh0CisJCQkJICogYnl0ZSBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBzYnVmICovCisJY2hhcgkqc2JfZGF0YTsJLyogQWN0dWFsIGRhdGEgKi8KK307CisKK3ZvaWQgc2JmcmVlIF9QKChzdHJ1Y3Qgc2J1ZiAqKSk7Cit2b2lkIHNiZHJvcCBfUCgoc3RydWN0IHNidWYgKiwgaW50KSk7Cit2b2lkIHNicmVzZXJ2ZSBfUCgoc3RydWN0IHNidWYgKiwgaW50KSk7Cit2b2lkIHNiYXBwZW5kIF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgc2Jjb3B5IF9QKChzdHJ1Y3Qgc2J1ZiAqLCBpbnQsIGludCwgY2hhciAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NsaXJwLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvc2xpcnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTBkY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NsaXJwLmMKQEAgLTAsMCArMSwxMzkxIEBACisvKgorICogbGlic2xpcnAgZ2x1ZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgInNsaXJwLmgiCisKKyNpbmNsdWRlICJhbmRyb2lkL2FuZHJvaWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIiAgLyogZm9yIGRwcmludCAqLworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZG5zLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9pcGFkZHIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKworI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uLmgiCisKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisKKy8qIHByb3RvIHR5cGVzICovCitzdGF0aWMgdm9pZCBzbGlycF9uZXRfZm9yd2FyZF9pbml0KHZvaWQpOworCisjZGVmaW5lICBEKC4uLikgICBWRVJCT1NFX1BSSU5UKHNsaXJwLF9fVkFfQVJHU19fKQorI2RlZmluZSAgRE4oLi4uKSAgZG8geyBpZiAoVkVSQk9TRV9DSEVDSyhzbGlycCkpIGRwcmludG4oX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorCisvKiBob3N0IGFkZHJlc3MgKi8KK3VpbnQzMl90IG91cl9hZGRyX2lwOworLyogaG9zdCBkbnMgYWRkcmVzcyAqLwordWludDMyX3QgZG5zX2FkZHJbRE5TX0FERFJfTUFYXTsKK2ludCAgICAgIGRuc19hZGRyX2NvdW50OworCisvKiBTYW5pdHkgY2hlY2sgKi8KKyNpZiBETlNfQUREUl9NQVggIT0gQU5EUk9JRF9NQVhfRE5TX1NFUlZFUlMKKyNlcnJvciBJbnZhbGlkIEROU19BRERSX01BWCBkZWZpbml0aW9uICEhIFBsZWFzZSB1cGRhdGUgc2xpcnAtYW5kcm9pZC9tYWluLmgKKyNlbmRpZgorCisvKiBob3N0IGxvb3BiYWNrIGFkZHJlc3MgKi8KK3VpbnQzMl90IGxvb3BiYWNrX2FkZHJfaXA7CisKKy8qIGFkZHJlc3MgZm9yIHNsaXJwIHZpcnR1YWwgYWRkcmVzc2VzICovCit1aW50MzJfdCAgc3BlY2lhbF9hZGRyX2lwOworCisvKiB2aXJ0dWFsIGFkZHJlc3MgYWxpYXMgZm9yIGhvc3QgKi8KK3VpbnQzMl90IGFsaWFzX2FkZHJfaXA7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHNwZWNpYWxfZXRoYWRkcls2XSA9IHsKKyAgICAweDUyLCAweDU0LCAweDAwLCAweDEyLCAweDM1LCAweDAwCit9OworCisvKiBBUlAgY2FjaGUgZm9yIHRoZSBndWVzdCBJUCBhZGRyZXNzZXMgKFhYWDogYWxsb3cgbWFueSBlbnRyaWVzKSAqLwordWludDhfdCBjbGllbnRfZXRoYWRkcls2XTsKK3N0YXRpYyBpcGFkZHJfdCAgY2xpZW50X2lwOworCitzdGF0aWMgY29uc3QgdWludDhfdCB6ZXJvX2V0aGFkZHJbNl0gPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKKworY29uc3QgY2hhciAqc2xpcnBfc3BlY2lhbF9pcCA9IENUTF9TUEVDSUFMOworaW50IHNsaXJwX3Jlc3RyaWN0Oworc3RhdGljIGludCBkb19zbG93dGltbzsKK2ludCBsaW5rX3VwOworc3RydWN0IHRpbWV2YWwgdHQ7CitGSUxFICpsZmQ7CitzdHJ1Y3QgZXhfbGlzdCAqZXhlY19saXN0OworCisvKiBYWFg6IHN1cHByZXNzIHRob3NlIHNlbGVjdCBnbG9iYWxzICovCitmZF9zZXQgKmdsb2JhbF9yZWFkZmRzLCAqZ2xvYmFsX3dyaXRlZmRzLCAqZ2xvYmFsX3hmZHM7CisKK2NoYXIgc2xpcnBfaG9zdG5hbWVbMzNdOworCisKK2ludCBzbGlycF9pbml0X2Ruc19zZXJ2ZXJzKGNvbnN0IGNoYXIqIHNlcnZlcnMpCit7CisgICAgZG5zX2FkZHJfY291bnQgPSBhbmRyb2lkX2Ruc19nZXRfc2VydmVycyhzZXJ2ZXJzLCBkbnNfYWRkcik7CisgICAgaWYgKGRuc19hZGRyX2NvdW50IDwgMCkgeworICAgICAgICBkbnNfYWRkclswXSAgICA9IGxvb3BiYWNrX2FkZHJfaXA7CisgICAgICAgIGRuc19hZGRyX2NvdW50ID0gMTsKKyAgICB9CisgICAgcmV0dXJuIGRuc19hZGRyX2NvdW50OworfQorCitpbnQgc2xpcnBfZ2V0X3N5c3RlbV9kbnNfc2VydmVycyh2b2lkKQoreworICAgIGludCBudW1fc2VydmVycyA9IGFuZHJvaWRfZG5zX2dldF9zeXN0ZW1fc2VydmVycyhkbnNfYWRkciwgRE5TX0FERFJfTUFYKTsKKyAgICBpZiAobnVtX3NlcnZlcnMgPj0gMCkKKyAgICAgICAgZG5zX2FkZHJfY291bnQgPSBudW1fc2VydmVyczsKKyAgICByZXR1cm4gbnVtX3NlcnZlcnM7Cit9CisKK2ludCBzbGlycF9wYXJzZV9kbnNfc2VydmVycyhjb25zdCBjaGFyKiBzZXJ2ZXJzKSB7CisgICAgaW50IG51bV9zZXJ2ZXJzID0gYW5kcm9pZF9kbnNfcGFyc2Vfc2VydmVycyhzZXJ2ZXJzLCBkbnNfYWRkciwgRE5TX0FERFJfTUFYKTsKKyAgICBpZiAobnVtX3NlcnZlcnMgPj0gMCkKKyAgICAgICAgZG5zX2FkZHJfY291bnQgPSBudW1fc2VydmVyczsKKyAgICByZXR1cm4gbnVtX3NlcnZlcnM7Cit9CisKK2ludCBzbGlycF9nZXRfbWF4X2Ruc19zZXJ2ZXJzKHZvaWQpIHsKKyAgICByZXR1cm4gRE5TX0FERFJfTUFYOworfQorCitzdGF0aWMgdm9pZCBzbGlycF9zdGF0ZV9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpOworc3RhdGljIGludCBzbGlycF9zdGF0ZV9sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKTsKKwordm9pZCBzbGlycF9pbml0KGludCByZXN0cmljdGVkLCBjb25zdCBjaGFyICpzcGVjaWFsX2lwKQoreworI2lmIERFQlVHCisgICAgaW50ICAgc2xpcnBfbG9nbWFzayA9IDA7CisgICAgY2hhciAgc2xpcnBfbG9nZmlsZVs1MTJdOworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogIGVudiA9IGdldGVudiggIkFORFJPSURfU0xJUlBfTE9HTUFTSyIgKTsKKyAgICAgICAgaWYgKGVudiAhPSBOVUxMKQorICAgICAgICAgICAgc2xpcnBfbG9nbWFzayA9IGF0b2koZW52KTsKKyAgICAgICAgIGVsc2UgaWYgKFZFUkJPU0VfQ0hFQ0soc2xpcnApKQorICAgICAgICAgICAgc2xpcnBfbG9nbWFzayA9IERFQlVHX0RFRkFVTFQ7CisgICAgfQorCisgICAgeworICAgICAgICBjaGFyKiAgcCAgID0gc2xpcnBfbG9nZmlsZTsKKyAgICAgICAgY2hhciogIGVuZCA9IHAgKyBzaXplb2Yoc2xpcnBfbG9nZmlsZSk7CisKKyAgICAgICAgcCA9IGJ1ZnByaW50X3RlbXBfZmlsZSggcCwgZW5kLCAic2xpcnAubG9nIiApOworICAgICAgICBpZiAocCA+PSBlbmQpIHsKKyAgICAgICAgICAgIGRwcmludCggImNhbm5vdCBjcmVhdGUgc2xpcnAgbG9nIGZpbGUgaW4gdGVtcG9yYXJ5IGRpcmVjdG9yeSIgKTsKKyAgICAgICAgICAgIHNsaXJwX2xvZ21hc2sgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzbGlycF9sb2dtYXNrKSB7CisgICAgICAgIGRwcmludCggInNlbmRpbmcgc2xpcnAgbG9ncyB3aXRoIG1hc2sgJXggdG8gJXMiLCBzbGlycF9sb2dtYXNrLCBzbGlycF9sb2dmaWxlICk7CisgICAgICAgIGRlYnVnX2luaXQoIHNsaXJwX2xvZ2ZpbGUsIHNsaXJwX2xvZ21hc2sgKTsKKyAgICB9CisjZW5kaWYKKworICAgIGxpbmtfdXAgPSAxOworICAgIHNsaXJwX3Jlc3RyaWN0ID0gcmVzdHJpY3RlZDsKKworICAgIGlmX2luaXQoKTsKKyAgICBpcF9pbml0KCk7CisKKyAgICAvKiBJbml0aWFsaXNlIG1idWZzICphZnRlciogc2V0dGluZyB0aGUgTVRVICovCisgICAgbV9pbml0KCk7CisKKyAgICAvKiBzZXQgZGVmYXVsdCBhZGRyZXNzZXMgKi8KKyAgICBpbmV0X3N0cnRvaXAoIjEyNy4wLjAuMSIsICZsb29wYmFja19hZGRyX2lwKTsKKworICAgIGlmIChkbnNfYWRkcl9jb3VudCA9PSAwKSB7CisgICAgICAgIHNsaXJwX2luaXRfZG5zX3NlcnZlcnMoTlVMTCk7CisgICAgfQorCisgICAgaW5ldF9zdHJ0b2lwKENUTF9TUEVDSUFMLCAmc3BlY2lhbF9hZGRyX2lwKTsKKworICAgIGFsaWFzX2FkZHJfaXAgPSBzcGVjaWFsX2FkZHJfaXAgfCBDVExfQUxJQVM7CisgICAgZ2V0b3VyYWRkcigpOworICAgIHJlZ2lzdGVyX3NhdmV2bShOVUxMLCAic2xpcnAiLCAwLCAxLCBzbGlycF9zdGF0ZV9zYXZlLCBzbGlycF9zdGF0ZV9sb2FkLCBOVUxMKTsKKworICAgIHNsaXJwX25ldF9mb3J3YXJkX2luaXQoKTsKK30KKworI2RlZmluZSBDT05OX0NBTkZTRU5EKHNvKSAoKChzbyktPnNvX3N0YXRlICYgKFNTX0ZDQU5UU0VORE1PUkV8U1NfSVNGQ09OTkVDVEVEKSkgPT0gU1NfSVNGQ09OTkVDVEVEKQorI2RlZmluZSBDT05OX0NBTkZSQ1Yoc28pICgoKHNvKS0+c29fc3RhdGUgJiAoU1NfRkNBTlRSQ1ZNT1JFfFNTX0lTRkNPTk5FQ1RFRCkpID09IFNTX0lTRkNPTk5FQ1RFRCkKKyNkZWZpbmUgVVBEX05GRFMoeCkgaWYgKG5mZHMgPCAoeCkpIG5mZHMgPSAoeCkKKworLyoKKyAqIGN1cnRpbWUga2VwdCB0byBhbiBhY2N1cmFjeSBvZiAxbXMKKyAqLworI2lmZGVmIF9XSU4zMgorc3RhdGljIHZvaWQgdXBkdGltZSh2b2lkKQoreworICAgIHN0cnVjdCBfdGltZWIgdGI7CisKKyAgICBfZnRpbWUoJnRiKTsKKyAgICBjdXJ0aW1lID0gKHVfaW50KXRiLnRpbWUgKiAodV9pbnQpMTAwMDsKKyAgICBjdXJ0aW1lICs9ICh1X2ludCl0Yi5taWxsaXRtOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHVwZHRpbWUodm9pZCkKK3sKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0dCwgTlVMTCk7CisKKwljdXJ0aW1lID0gKHVfaW50KXR0LnR2X3NlYyAqICh1X2ludCkxMDAwOworCWN1cnRpbWUgKz0gKHVfaW50KXR0LnR2X3VzZWMgLyAodV9pbnQpMTAwMDsKKworCWlmICgodHQudHZfdXNlYyAlIDEwMDApID49IDUwMCkKKwkgICBjdXJ0aW1lKys7Cit9CisjZW5kaWYKKwordm9pZCBzbGlycF9zZWxlY3RfZmlsbChpbnQgKnBuZmRzLAorICAgICAgICAgICAgICAgICAgICAgICBmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcykKK3sKKyAgICBzdHJ1Y3Qgc29ja2V0ICpzbywgKnNvX25leHQ7CisgICAgc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyAgICBpbnQgbmZkczsKKyAgICBpbnQgdG1wX3RpbWU7CisKKyAgICAvKiBmYWlsIHNhZmUgKi8KKyAgICBnbG9iYWxfcmVhZGZkcyA9IE5VTEw7CisgICAgZ2xvYmFsX3dyaXRlZmRzID0gTlVMTDsKKyAgICBnbG9iYWxfeGZkcyA9IE5VTEw7CisKKyAgICBuZmRzID0gKnBuZmRzOworCS8qCisJICogRmlyc3QsIFRDUCBzb2NrZXRzCisJICovCisJZG9fc2xvd3RpbW8gPSAwOworCWlmIChsaW5rX3VwKSB7CisJCS8qCisJCSAqICpfc2xvd3RpbW8gbmVlZHMgY2FsbGluZyBpZiB0aGVyZSBhcmUgSVAgZnJhZ21lbnRzCisJCSAqIGluIHRoZSBmcmFnbWVudCBxdWV1ZSwgb3IgdGhlcmUgYXJlIFRDUCBjb25uZWN0aW9ucyBhY3RpdmUKKwkJICovCisJCWRvX3Nsb3d0aW1vID0gKCh0Y2Iuc29fbmV4dCAhPSAmdGNiKSB8fAorICAgICAgICAgICAgICAgICgmaXBxLmlwX2xpbmsgIT0gaXBxLmlwX2xpbmsubmV4dCkpOworCisJCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzb19uZXh0KSB7CisJCQlzb19uZXh0ID0gc28tPnNvX25leHQ7CisKKwkJCS8qCisJCQkgKiBTZWUgaWYgd2UgbmVlZCBhIHRjcF9mYXN0dGltbworCQkJICovCisJCQlpZiAodGltZV9mYXN0dGltbyA9PSAwICYmIHNvLT5zb190Y3BjYi0+dF9mbGFncyAmIFRGX0RFTEFDSykKKwkJCSAgIHRpbWVfZmFzdHRpbW8gPSBjdXJ0aW1lOyAvKiBGbGFnIHdoZW4gd2Ugd2FudCBhIGZhc3R0aW1vICovCisKKwkJCS8qCisJCQkgKiBOT0ZEUkVGIGNhbiBpbmNsdWRlIHN0aWxsIGNvbm5lY3RpbmcgdG8gbG9jYWwtaG9zdCwKKwkJCSAqIG5ld2x5IHNvY3JlYXRlZCgpIHNvY2tldHMgZXRjLiBEb24ndCB3YW50IHRvIHNlbGVjdCB0aGVzZS4KKwkgCQkgKi8KKwkJCWlmIChzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGIHx8IHNvLT5zID09IC0xKQorCQkJICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBkb24ndCByZWdpc3RlciBwcm94aWZpZWQgc29ja2VkIGNvbm5lY3Rpb25zIGhlcmUKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChzby0+c29fc3RhdGUgJiBTU19QUk9YSUZJRUQpICE9IDApCisJICAgICAgICAgICAgY29udGludWU7CisKKwkJCS8qCisJCQkgKiBTZXQgZm9yIHJlYWRpbmcgc29ja2V0cyB3aGljaCBhcmUgYWNjZXB0aW5nCisJCQkgKi8KKwkJCWlmIChzby0+c29fc3RhdGUgJiBTU19GQUNDRVBUQ09OTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRF9TRVQoc28tPnMsIHJlYWRmZHMpOworCQkJCVVQRF9ORkRTKHNvLT5zKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCBmb3Igd3JpdGluZyBzb2NrZXRzIHdoaWNoIGFyZSBjb25uZWN0aW5nCisJCQkgKi8KKwkJCWlmIChzby0+c29fc3RhdGUgJiBTU19JU0ZDT05ORUNUSU5HKSB7CisJCQkJRkRfU0VUKHNvLT5zLCB3cml0ZWZkcyk7CisJCQkJVVBEX05GRFMoc28tPnMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogU2V0IGZvciB3cml0aW5nIGlmIHdlIGFyZSBjb25uZWN0ZWQsIGNhbiBzZW5kIG1vcmUsIGFuZAorCQkJICogd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VuZAorCQkJICovCisJCQlpZiAoQ09OTl9DQU5GU0VORChzbykgJiYgc28tPnNvX3Jjdi5zYl9jYykgeworCQkJCUZEX1NFVChzby0+cywgd3JpdGVmZHMpOworCQkJCVVQRF9ORkRTKHNvLT5zKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCBmb3IgcmVhZGluZyAoYW5kIHVyZ2VudCBkYXRhKSBpZiB3ZSBhcmUgY29ubmVjdGVkLCBjYW4KKwkJCSAqIHJlY2VpdmUgbW9yZSwgYW5kIHdlIGhhdmUgcm9vbSBmb3IgaXQgWFhYIC8yID8KKwkJCSAqLworCQkJaWYgKENPTk5fQ0FORlJDVihzbykgJiYgKHNvLT5zb19zbmQuc2JfY2MgPCAoc28tPnNvX3NuZC5zYl9kYXRhbGVuLzIpKSkgeworCQkJCUZEX1NFVChzby0+cywgcmVhZGZkcyk7CisJCQkJRkRfU0VUKHNvLT5zLCB4ZmRzKTsKKwkJCQlVUERfTkZEUyhzby0+cyk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBVRFAgc29ja2V0cworCQkgKi8KKwkJZm9yIChzbyA9IHVkYi5zb19uZXh0OyBzbyAhPSAmdWRiOyBzbyA9IHNvX25leHQpIHsKKwkJCXNvX25leHQgPSBzby0+c29fbmV4dDsKKworICAgICAgICAgICAgaWYgKChzby0+c29fc3RhdGUgJiBTU19QUk9YSUZJRUQpICE9IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKwkJCS8qCisJCQkgKiBTZWUgaWYgaXQncyB0aW1lZCBvdXQKKwkJCSAqLworCQkJaWYgKHNvLT5zb19leHBpcmUpIHsKKwkJCQlpZiAoc28tPnNvX2V4cGlyZSA8PSBjdXJ0aW1lKSB7CisJCQkJCXVkcF9kZXRhY2goc28pOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UKKwkJCQkJZG9fc2xvd3RpbW8gPSAxOyAvKiBMZXQgc29ja2V0IGV4cGlyZSAqLworCQkJfQorCisJCQkvKgorCQkJICogV2hlbiBVRFAgcGFja2V0cyBhcmUgcmVjZWl2ZWQgZnJvbSBvdmVyIHRoZQorCQkJICogbGluaywgdGhleSdyZSBzZW5kdG8oKSdkIHN0cmFpZ2h0IGF3YXksIHNvCisJCQkgKiBubyBuZWVkIGZvciBzZXR0aW5nIGZvciB3cml0aW5nCisJCQkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIGJ5IHRoaXMgc2Vzc2lvbgorCQkJICogdG8gNC4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCB3ZSB0cnkgYW5kIGxpbWl0IHRoaXMKKwkJCSAqIHRvIDQgcGFja2V0cywgdGhlIHNlc3Npb24gY291bGQgaGF2ZSBtb3JlIHF1ZXVlZAorCQkJICogaWYgdGhlIHBhY2tldHMgbmVlZGVkIHRvIGJlIGZyYWdtZW50ZWQKKwkJCSAqIChYWFggPD0gNCA/KQorCQkJICovCisJCQlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0lTRkNPTk5FQ1RFRCkgJiYgc28tPnNvX3F1ZXVlZCA8PSA0KSB7CisJCQkJRkRfU0VUKHNvLT5zLCByZWFkZmRzKTsKKwkJCQlVUERfTkZEUyhzby0+cyk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFNldHVwIHRpbWVvdXQgdG8gdXNlIG1pbmltdW0gQ1BVIHVzYWdlLCBlc3BlY2lhbGx5IHdoZW4gaWRsZQorCSAqLworCisJLyoKKwkgKiBGaXJzdCwgc2VlIHRoZSB0aW1lb3V0IG5lZWRlZCBieSAqdGltbworCSAqLworCXRpbWVvdXQudHZfc2VjID0gMDsKKwl0aW1lb3V0LnR2X3VzZWMgPSAtMTsKKwkvKgorCSAqIElmIGEgc2xvd3RpbW8gaXMgbmVlZGVkLCBzZXQgdGltZW91dCB0byA1MDBtcyBmcm9tIHRoZSBsYXN0CisJICogc2xvdyB0aW1lb3V0LiBJZiBhIGZhc3QgdGltZW91dCBpcyBuZWVkZWQsIHNldCB0aW1lb3V0IHdpdGhpbgorCSAqIDIwMG1zIG9mIHdoZW4gaXQgd2FzIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAoZG9fc2xvd3RpbW8pIHsKKwkJLyogWFhYICsgMTAwMDAgYmVjYXVzZSBzb21lIHNlbGVjdCgpJ3MgYXJlbid0IHRoYXQgYWNjdXJhdGUgKi8KKwkJdGltZW91dC50dl91c2VjID0gKCg1MDAgLSAoY3VydGltZSAtIGxhc3Rfc2xvd3RpbW8pKSAqIDEwMDApICsgMTAwMDA7CisJCWlmICh0aW1lb3V0LnR2X3VzZWMgPCAwKQorCQkgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworCQllbHNlIGlmICh0aW1lb3V0LnR2X3VzZWMgPiA1MTAwMDApCisJCSAgIHRpbWVvdXQudHZfdXNlYyA9IDUxMDAwMDsKKworCQkvKiBDYW4gb25seSBmYXN0dGltbyBpZiB3ZSBhbHNvIHNsb3d0aW1vICovCisJCWlmICh0aW1lX2Zhc3R0aW1vKSB7CisJCQl0bXBfdGltZSA9ICgyMDAgLSAoY3VydGltZSAtIHRpbWVfZmFzdHRpbW8pKSAqIDEwMDA7CisJCQlpZiAodG1wX3RpbWUgPCAwKQorCQkJICAgdG1wX3RpbWUgPSAwOworCisJCQkvKiBDaG9vc2UgdGhlIHNtYWxsZXN0IG9mIHRoZSAyICovCisJCQlpZiAodG1wX3RpbWUgPCB0aW1lb3V0LnR2X3VzZWMpCisJCQkgICB0aW1lb3V0LnR2X3VzZWMgPSAodV9pbnQpdG1wX3RpbWU7CisJCX0KKwl9CisgICAgKnBuZmRzID0gbmZkczsKK30KKwordm9pZCBzbGlycF9zZWxlY3RfcG9sbChmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcykKK3sKKyAgICBzdHJ1Y3Qgc29ja2V0ICpzbywgKnNvX25leHQ7CisgICAgaW50IHJldDsKKworICAgIGdsb2JhbF9yZWFkZmRzID0gcmVhZGZkczsKKyAgICBnbG9iYWxfd3JpdGVmZHMgPSB3cml0ZWZkczsKKyAgICBnbG9iYWxfeGZkcyA9IHhmZHM7CisKKwkvKiBVcGRhdGUgdGltZSAqLworCXVwZHRpbWUoKTsKKworCS8qCisJICogU2VlIGlmIGFueXRoaW5nIGhhcyB0aW1lZCBvdXQKKwkgKi8KKwlpZiAobGlua191cCkgeworCQlpZiAodGltZV9mYXN0dGltbyAmJiAoKGN1cnRpbWUgLSB0aW1lX2Zhc3R0aW1vKSA+PSAyKSkgeworCQkJdGNwX2Zhc3R0aW1vKCk7CisJCQl0aW1lX2Zhc3R0aW1vID0gMDsKKwkJfQorCQlpZiAoZG9fc2xvd3RpbW8gJiYgKChjdXJ0aW1lIC0gbGFzdF9zbG93dGltbykgPj0gNDk5KSkgeworCQkJaXBfc2xvd3RpbW8oKTsKKwkJCXRjcF9zbG93dGltbygpOworCQkJbGFzdF9zbG93dGltbyA9IGN1cnRpbWU7CisJCX0KKwl9CisKKwkvKgorCSAqIENoZWNrIHNvY2tldHMKKwkgKi8KKwlpZiAobGlua191cCkgeworCQkvKgorCQkgKiBDaGVjayBUQ1Agc29ja2V0cworCQkgKi8KKwkJZm9yIChzbyA9IHRjYi5zb19uZXh0OyBzbyAhPSAmdGNiOyBzbyA9IHNvX25leHQpIHsKKwkJCXNvX25leHQgPSBzby0+c29fbmV4dDsKKworCQkJLyoKKwkJCSAqIEZEX0lTU0VUIGlzIG1lYW5pbmdsZXNzIG9uIHRoZXNlIHNvY2tldHMKKwkJCSAqIChhbmQgdGhleSBjYW4gY3Jhc2ggdGhlIHByb2dyYW0pCisJCQkgKi8KKwkJCWlmIChzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGIHx8IHNvLT5zID09IC0xKQorCQkJICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBwcm94aWZpZWQgc29ja2V0cyBhcmUgcG9sbGVkIGxhdGVyIGluIHRoaXMKKyAgICAgICAgICAgICAqIGZ1bmN0aW9uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX1BST1hJRklFRCkgIT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBVUkcgZGF0YQorCQkJICogVGhpcyB3aWxsIHNvcmVhZCBhcyB3ZWxsLCBzbyBubyBuZWVkIHRvCisJCQkgKiB0ZXN0IGZvciByZWFkZmRzIGJlbG93IGlmIHRoaXMgc3VjY2VlZHMKKwkJCSAqLworCQkJaWYgKEZEX0lTU0VUKHNvLT5zLCB4ZmRzKSkKKwkJCSAgIHNvcmVjdm9vYihzbyk7CisJCQkvKgorCQkJICogQ2hlY2sgc29ja2V0cyBmb3IgcmVhZGluZworCQkJICovCisJCQllbHNlIGlmIChGRF9JU1NFVChzby0+cywgcmVhZGZkcykpIHsKKwkJCQkvKgorCQkJCSAqIENoZWNrIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworCQkJCSAqLworCQkJCWlmIChzby0+c29fc3RhdGUgJiBTU19GQUNDRVBUQ09OTikgeworCQkJCQl0Y3BfY29ubmVjdChzbyk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gLyogZWxzZSAqLworCQkJCXJldCA9IHNvcmVhZChzbyk7CisKKwkJCQkvKiBPdXRwdXQgaXQgaWYgd2UgcmVhZCBzb21ldGhpbmcgKi8KKwkJCQlpZiAocmV0ID4gMCkKKwkJCQkgICB0Y3Bfb3V0cHV0KHNvdG90Y3BjYihzbykpOworCQkJfQorCisJCQkvKgorCQkJICogQ2hlY2sgc29ja2V0cyBmb3Igd3JpdGluZworCQkJICovCisJCQlpZiAoRkRfSVNTRVQoc28tPnMsIHdyaXRlZmRzKSkgeworCQkJICAvKgorCQkJICAgKiBDaGVjayBmb3Igbm9uLWJsb2NraW5nLCBzdGlsbC1jb25uZWN0aW5nIHNvY2tldHMKKwkJCSAgICovCisJCQkgIGlmIChzby0+c29fc3RhdGUgJiBTU19JU0ZDT05ORUNUSU5HKSB7CisJCQkgICAgLyogQ29ubmVjdGVkICovCisJCQkgICAgc28tPnNvX3N0YXRlICY9IH5TU19JU0ZDT05ORUNUSU5HOworCisJCQkgICAgcmV0ID0gc29ja2V0X3NlbmQoc28tPnMsIChjb25zdCB2b2lkICopJnJldCwgMCk7CisJCQkgICAgaWYgKHJldCA8IDApIHsKKwkJCSAgICAgIC8qIFhYWFhYIE11c3QgZml4LCB6ZXJvIGJ5dGVzIGlzIGEgTk9QICovCisJCQkgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLIHx8CisJCQkJICBlcnJubyA9PSBFSU5QUk9HUkVTUyB8fCBlcnJubyA9PSBFTk9UQ09OTikKKwkJCQljb250aW51ZTsKKworCQkJICAgICAgLyogZWxzZSBmYWlsZWQgKi8KKwkJCSAgICAgIHNvLT5zb19zdGF0ZSA9IFNTX05PRkRSRUY7CisJCQkgICAgfQorCQkJICAgIC8qIGVsc2Ugc28tPnNvX3N0YXRlICY9IH5TU19JU0ZDT05ORUNUSU5HOyAqLworCisJCQkgICAgLyoKKwkJCSAgICAgKiBDb250aW51ZSB0Y3BfaW5wdXQKKwkJCSAgICAgKi8KKwkJCSAgICB0Y3BfaW5wdXQoKHN0cnVjdCBtYnVmICopTlVMTCwgc2l6ZW9mKHN0cnVjdCBpcCksIHNvKTsKKwkJCSAgICAvKiBjb250aW51ZTsgKi8KKwkJCSAgfSBlbHNlCisJCQkgICAgcmV0ID0gc293cml0ZShzbyk7CisJCQkgIC8qCisJCQkgICAqIFhYWFhYIElmIHdlIHdyb3RlIHNvbWV0aGluZyAoYSBsb3QpLCB0aGVyZQorCQkJICAgKiBjb3VsZCBiZSBhIG5lZWQgZm9yIGEgd2luZG93IHVwZGF0ZS4KKwkJCSAgICogSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSByZW1vdGUgd2lsbCBzZW5kCisJCQkgICAqIGEgd2luZG93IHByb2JlIHRvIGdldCB0aGluZ3MgZ29pbmcgYWdhaW4KKwkJCSAgICovCisJCQl9CisKKwkJCS8qCisJCQkgKiBQcm9iZSBhIHN0aWxsLWNvbm5lY3RpbmcsIG5vbi1ibG9ja2luZyBzb2NrZXQKKwkJCSAqIHRvIGNoZWNrIGlmIGl0J3Mgc3RpbGwgYWxpdmUKKwkgCSAJICovCisjaWZkZWYgUFJPQkVfQ09OTgorCQkJaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0lTRkNPTk5FQ1RJTkcpIHsKKwkJCSAgcmV0ID0gc29ja2V0X3JlY3Yoc28tPnMsIChjaGFyICopJnJldCwgMCk7CisKKwkJCSAgaWYgKHJldCA8IDApIHsKKwkJCSAgICAvKiBYWFggKi8KKwkJCSAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLIHx8CisJCQkJZXJybm8gPT0gRUlOUFJPR1JFU1MgfHwgZXJybm8gPT0gRU5PVENPTk4pCisJCQkgICAgICBjb250aW51ZTsgLyogU3RpbGwgY29ubmVjdGluZywgY29udGludWUgKi8KKworCQkJICAgIC8qIGVsc2UgZmFpbGVkICovCisJCQkgICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsKKworCQkJICAgIC8qIHRjcF9pbnB1dCB3aWxsIHRha2UgY2FyZSBvZiBpdCAqLworCQkJICB9IGVsc2UgeworCQkJICAgIHJldCA9IHNvY2tldF9zZW5kKHNvLT5zLCAmcmV0LCAwKTsKKwkJCSAgICBpZiAocmV0IDwgMCkgeworCQkJICAgICAgLyogWFhYICovCisJCQkgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLIHx8CisJCQkJICBlcnJubyA9PSBFSU5QUk9HUkVTUyB8fCBlcnJubyA9PSBFTk9UQ09OTikKKwkJCQljb250aW51ZTsKKwkJCSAgICAgIC8qIGVsc2UgZmFpbGVkICovCisJCQkgICAgICBzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOworCQkJICAgIH0gZWxzZQorCQkJICAgICAgc28tPnNvX3N0YXRlICY9IH5TU19JU0ZDT05ORUNUSU5HOworCisJCQkgIH0KKwkJCSAgdGNwX2lucHV0KChzdHJ1Y3QgbWJ1ZiAqKU5VTEwsIHNpemVvZihzdHJ1Y3QgaXApLHNvKTsKKwkJCX0gLyogU1NfSVNGQ09OTkVDVElORyAqLworI2VuZGlmCisJCX0KKworCQkvKgorCQkgKiBOb3cgVURQIHNvY2tldHMuCisJCSAqIEluY29taW5nIHBhY2tldHMgYXJlIHNlbnQgc3RyYWlnaHQgYXdheSwgdGhleSdyZSBub3QgYnVmZmVyZWQuCisJCSAqIEluY29taW5nIFVEUCBkYXRhIGlzbid0IGJ1ZmZlcmVkIGVpdGhlci4KKwkJICovCisJCWZvciAoc28gPSB1ZGIuc29fbmV4dDsgc28gIT0gJnVkYjsgc28gPSBzb19uZXh0KSB7CisJCQlzb19uZXh0ID0gc28tPnNvX25leHQ7CisKKyAgICAgICAgICAgIGlmICgoc28tPnNvX3N0YXRlICYgU1NfUFJPWElGSUVEKSAhPSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisJCQlpZiAoc28tPnMgIT0gLTEgJiYgRkRfSVNTRVQoc28tPnMsIHJlYWRmZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29yZWN2ZnJvbShzbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwl9CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gc3RhcnQgb3V0cHV0dGluZworCSAqLworCWlmIChpZl9xdWV1ZWQgJiYgbGlua191cCkKKwkgICBpZl9zdGFydCgpOworCisJLyogY2xlYXIgZ2xvYmFsIGZpbGUgZGVzY3JpcHRvciBzZXRzLgorCSAqIHRoZXNlIHJlc2lkZSBvbiB0aGUgc3RhY2sgaW4gdmwuYworCSAqIHNvIHRoZXkncmUgdW51c2FibGUgaWYgd2UncmUgbm90IGluCisJICogc2xpcnBfc2VsZWN0X2ZpbGwgb3Igc2xpcnBfc2VsZWN0X3BvbGwuCisJICovCisJIGdsb2JhbF9yZWFkZmRzID0gTlVMTDsKKwkgZ2xvYmFsX3dyaXRlZmRzID0gTlVMTDsKKwkgZ2xvYmFsX3hmZHMgPSBOVUxMOworfQorCisjZGVmaW5lIEVUSF9BTEVOIDYKKyNkZWZpbmUgRVRIX0hMRU4gMTQKKworI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9BUlAJMHgwODA2CQkvKiBBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0CSovCisKKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCQkvKiBBUlAgcmVxdWVzdAkJCSovCisjZGVmaW5lCUFSUE9QX1JFUExZCTIJCS8qIEFSUCByZXBseQkJCSovCisKK3N0cnVjdCBldGhoZHIKK3sKKwl1bnNpZ25lZCBjaGFyCWhfZGVzdFtFVEhfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aCBhZGRyCSovCisJdW5zaWduZWQgY2hhcgloX3NvdXJjZVtFVEhfQUxFTl07CS8qIHNvdXJjZSBldGhlciBhZGRyCSovCisJdW5zaWduZWQgc2hvcnQJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9OworCitzdHJ1Y3QgYXJwaGRyCit7CisJdW5zaWduZWQgc2hvcnQJYXJfaHJkOwkJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBzaG9ydAlhcl9wcm87CQkvKiBmb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJYXJfaGxuOwkJLyogbGVuZ3RoIG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWFyX3BsbjsJCS8qIGxlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzCSovCisJdW5zaWduZWQgc2hvcnQJYXJfb3A7CQkvKiBBUlAgb3Bjb2RlIChjb21tYW5kKQkJKi8KKworCSAvKgorCSAgKgkgRXRoZXJuZXQgbG9va3MgbGlrZSB0aGlzIDogVGhpcyBiaXQgaXMgdmFyaWFibGUgc2l6ZWQgaG93ZXZlci4uLgorCSAgKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl9zaGFbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3NpcFs0XTsJCS8qIHNlbmRlciBJUCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgkJYXJfdGlwWzRdOwkJLyogdGFyZ2V0IElQIGFkZHJlc3MJCSovCit9OworCitzdGF0aWMgdm9pZCBhcnBfaW5wdXQoY29uc3QgdWludDhfdCAqcGt0LCBpbnQgcGt0X2xlbikKK3sKKyAgICBzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopcGt0OworICAgIHN0cnVjdCBhcnBoZHIgKmFoID0gKHN0cnVjdCBhcnBoZHIgKikocGt0ICsgRVRIX0hMRU4pOworICAgIHVpbnQ4X3QgYXJwX3JlcGx5W0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpXTsKKyAgICBzdHJ1Y3QgZXRoaGRyICpyZWggPSAoc3RydWN0IGV0aGhkciAqKWFycF9yZXBseTsKKyAgICBzdHJ1Y3QgYXJwaGRyICpyYWggPSAoc3RydWN0IGFycGhkciAqKShhcnBfcmVwbHkgKyBFVEhfSExFTik7CisgICAgaW50IGFyX29wOworICAgIHN0cnVjdCBleF9saXN0ICpleF9wdHI7CisKKyAgICBhcl9vcCA9IG50b2hzKGFoLT5hcl9vcCk7CisgICAgc3dpdGNoKGFyX29wKSB7CisgICAgICAgIHVpbnQzMl90ICAgIGFyX3RpcF9pcDsKKworICAgIGNhc2UgQVJQT1BfUkVRVUVTVDoKKyAgICAgICAgYXJfdGlwX2lwID0gaXBfcmVhZDMyaChhaC0+YXJfdGlwKTsKKyAgICAgICAgaWYgKChhcl90aXBfaXAgJiAweGZmZmZmZjAwKSA9PSBzcGVjaWFsX2FkZHJfaXApIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICBhcl90aXBfbG93ID0gYXJfdGlwX2lwICYgMHhmZjsKKyAgICAgICAgICAgIGlmICggQ1RMX0lTX0ROUyhhcl90aXBfbG93KSB8fCBhcl90aXBfbG93ID09IENUTF9BTElBUykKKyAgICAgICAgICAgICAgICBnb3RvIGFycF9vazsKKyAgICAgICAgICAgIGZvciAoZXhfcHRyID0gZXhlY19saXN0OyBleF9wdHI7IGV4X3B0ciA9IGV4X3B0ci0+ZXhfbmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgodWludDMyX3QpZXhfcHRyLT5leF9hZGRyID09IGFyX3RpcF9sb3cpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYXJwX29rOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhcnBfb2s6CisgICAgICAgICAgICAvKiBYWFg6IG1ha2UgYW4gQVJQIHJlcXVlc3QgdG8gaGF2ZSB0aGUgY2xpZW50IGFkZHJlc3MgKi8KKyAgICAgICAgICAgIG1lbWNweShjbGllbnRfZXRoYWRkciwgZWgtPmhfc291cmNlLCBFVEhfQUxFTik7CisKKyAgICAgICAgICAgIC8qIEFSUCByZXF1ZXN0IGZvciBhbGlhcy9kbnMgbWFjIGFkZHJlc3MgKi8KKyAgICAgICAgICAgIG1lbWNweShyZWgtPmhfZGVzdCwgcGt0ICsgRVRIX0FMRU4sIEVUSF9BTEVOKTsKKyAgICAgICAgICAgIG1lbWNweShyZWgtPmhfc291cmNlLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgICAgICByZWgtPmhfc291cmNlWzVdID0gYXJfdGlwX2xvdzsKKyAgICAgICAgICAgIHJlaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CisKKyAgICAgICAgICAgIHJhaC0+YXJfaHJkID0gaHRvbnMoMSk7CisgICAgICAgICAgICByYWgtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgICAgIHJhaC0+YXJfaGxuID0gRVRIX0FMRU47CisgICAgICAgICAgICByYWgtPmFyX3BsbiA9IDQ7CisgICAgICAgICAgICByYWgtPmFyX29wID0gaHRvbnMoQVJQT1BfUkVQTFkpOworICAgICAgICAgICAgbWVtY3B5KHJhaC0+YXJfc2hhLCByZWgtPmhfc291cmNlLCBFVEhfQUxFTik7CisgICAgICAgICAgICBtZW1jcHkocmFoLT5hcl9zaXAsIGFoLT5hcl90aXAsIDQpOworICAgICAgICAgICAgbWVtY3B5KHJhaC0+YXJfdGhhLCBhaC0+YXJfc2hhLCBFVEhfQUxFTik7CisgICAgICAgICAgICBtZW1jcHkocmFoLT5hcl90aXAsIGFoLT5hcl9zaXAsIDQpOworICAgICAgICAgICAgc2xpcnBfb3V0cHV0KGFycF9yZXBseSwgc2l6ZW9mKGFycF9yZXBseSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJQT1BfUkVQTFk6CisgICAgICAgIC8qIHJlcGx5IHRvIHJlcXVlc3Qgb2YgY2xpZW50IG1hYyBhZGRyZXNzID8gKi8KKyAgICAgICAgaWYgKCFtZW1jbXAoY2xpZW50X2V0aGFkZHIsIHplcm9fZXRoYWRkciwgRVRIX0FMRU4pICYmCisgICAgICAgICAgICBpcF9lcXVhbCggaXBfcmVhZChhaC0+YXJfc2lwKSwgY2xpZW50X2lwICkpIHsKKyAgICAgICAgICAgIG1lbWNweShjbGllbnRfZXRoYWRkciwgYWgtPmFyX3NoYSwgRVRIX0FMRU4pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBzbGlycF9pbnB1dChjb25zdCB1aW50OF90ICpwa3QsIGludCBwa3RfbGVuKQoreworICAgIHN0cnVjdCBtYnVmICptOworICAgIGludCBwcm90bzsKKworICAgIGlmIChwa3RfbGVuIDwgRVRIX0hMRU4pCisgICAgICAgIHJldHVybjsKKworICAgIHByb3RvID0gbnRvaHMoKih1aW50MTZfdCAqKShwa3QgKyAxMikpOworICAgIHN3aXRjaChwcm90bykgeworICAgIGNhc2UgRVRIX1BfQVJQOgorICAgICAgICBhcnBfaW5wdXQocGt0LCBwa3RfbGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFVEhfUF9JUDoKKyAgICAgICAgbSA9IG1fZ2V0KCk7CisgICAgICAgIGlmICghbSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLyogTm90ZTogd2UgYWRkIHRvIGFsaWduIHRoZSBJUCBoZWFkZXIgKi8KKyAgICAgICAgaWYgKE1fRlJFRVJPT00obSkgPCBwa3RfbGVuICsgMikgeworICAgICAgICAgICAgbV9pbmMobSwgcGt0X2xlbiArIDIpOworICAgICAgICB9CisgICAgICAgIG0tPm1fbGVuID0gcGt0X2xlbiArIDI7CisgICAgICAgIG1lbWNweShtLT5tX2RhdGEgKyAyLCBwa3QsIHBrdF9sZW4pOworCisgICAgICAgIG0tPm1fZGF0YSArPSAyICsgRVRIX0hMRU47CisgICAgICAgIG0tPm1fbGVuIC09IDIgKyBFVEhfSExFTjsKKworICAgICAgICBpcF9pbnB1dChtKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBvdXRwdXQgdGhlIElQIHBhY2tldCB0byB0aGUgZXRoZXJuZXQgZGV2aWNlICovCit2b2lkIGlmX2VuY2FwKGNvbnN0IHVpbnQ4X3QgKmlwX2RhdGEsIGludCBpcF9kYXRhX2xlbikKK3sKKyAgICB1aW50OF90IGJ1ZlsxNjAwXTsKKyAgICBzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopYnVmOworCisgICAgaWYgKGlwX2RhdGFfbGVuICsgRVRIX0hMRU4gPiAoaW50KXNpemVvZihidWYpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1lbWNtcChjbGllbnRfZXRoYWRkciwgemVyb19ldGhhZGRyLCBFVEhfQUxFTikpIHsKKyAgICAgICAgdWludDhfdCBhcnBfcmVxW0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpXTsKKyAgICAgICAgc3RydWN0IGV0aGhkciAqcmVoID0gKHN0cnVjdCBldGhoZHIgKilhcnBfcmVxOworICAgICAgICBzdHJ1Y3QgYXJwaGRyICpyYWggPSAoc3RydWN0IGFycGhkciAqKShhcnBfcmVxICsgRVRIX0hMRU4pOworICAgICAgICBjb25zdCBzdHJ1Y3QgaXAgKmlwaCA9IChjb25zdCBzdHJ1Y3QgaXAgKilpcF9kYXRhOworCisgICAgICAgIC8qIElmIHRoZSBjbGllbnQgYWRkciBpcyBub3Qga25vd24sIHRoZXJlIGlzIG5vIHBvaW50IGluCisgICAgICAgICAgIHNlbmRpbmcgdGhlIHBhY2tldCB0byBpdC4gTm9ybWFsbHkgdGhlIHNlbmRlciBzaG91bGQgaGF2ZQorICAgICAgICAgICBkb25lIGFuIEFSUCByZXF1ZXN0IHRvIGdldCBpdHMgTUFDIGFkZHJlc3MuIEhlcmUgd2UgZG8gaXQKKyAgICAgICAgICAgaW4gcGxhY2Ugb2Ygc2VuZGluZyB0aGUgcGFja2V0IGFuZCB3ZSBob3BlIHRoYXQgdGhlIHNlbmRlcgorICAgICAgICAgICB3aWxsIHJldHJ5IHNlbmRpbmcgaXRzIHBhY2tldC4gKi8KKyAgICAgICAgbWVtc2V0KHJlaC0+aF9kZXN0LCAweGZmLCBFVEhfQUxFTik7CisgICAgICAgIG1lbWNweShyZWgtPmhfc291cmNlLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgIHJlaC0+aF9zb3VyY2VbNV0gPSBDVExfQUxJQVM7CisgICAgICAgIHJlaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CisgICAgICAgIHJhaC0+YXJfaHJkID0gaHRvbnMoMSk7CisgICAgICAgIHJhaC0+YXJfcHJvID0gaHRvbnMoRVRIX1BfSVApOworICAgICAgICByYWgtPmFyX2hsbiA9IEVUSF9BTEVOOworICAgICAgICByYWgtPmFyX3BsbiA9IDQ7CisgICAgICAgIHJhaC0+YXJfb3AgPSBodG9ucyhBUlBPUF9SRVFVRVNUKTsKKyAgICAgICAgLyogc291cmNlIGh3IGFkZHIgKi8KKyAgICAgICAgbWVtY3B5KHJhaC0+YXJfc2hhLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgIHJhaC0+YXJfc2hhWzVdID0gQ1RMX0FMSUFTOworICAgICAgICAvKiBzb3VyY2UgSVAgKi8KKyAgICAgICAgaXBfd3JpdGUzMmgoYWxpYXNfYWRkcl9pcCwgcmFoLT5hcl9zaXApOworICAgICAgICAvKiB0YXJnZXQgaHcgYWRkciAobm9uZSkgKi8KKyAgICAgICAgbWVtc2V0KHJhaC0+YXJfdGhhLCAwLCBFVEhfQUxFTik7CisgICAgICAgIC8qIHRhcmdldCBJUCAqLworICAgICAgICBpcF93cml0ZSggaXBoLT5pcF9kc3QsIHJhaC0+YXJfdGlwICk7CisgICAgICAgIGNsaWVudF9pcCAgID0gaXBoLT5pcF9kc3Q7CisgICAgICAgIHNsaXJwX291dHB1dChhcnBfcmVxLCBzaXplb2YoYXJwX3JlcSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShlaC0+aF9kZXN0LCBjbGllbnRfZXRoYWRkciwgRVRIX0FMRU4pOworICAgICAgICBtZW1jcHkoZWgtPmhfc291cmNlLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgIC8qIFhYWDogbm90IGNvcnJlY3QgKi8KKyAgICAgICAgZWgtPmhfc291cmNlWzVdID0gQ1RMX0FMSUFTOworICAgICAgICBlaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKyAgICAgICAgbWVtY3B5KGJ1ZiArIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSwgaXBfZGF0YSwgaXBfZGF0YV9sZW4pOworICAgICAgICBzbGlycF9vdXRwdXQoYnVmLCBpcF9kYXRhX2xlbiArIEVUSF9ITEVOKTsKKyAgICB9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogVXNlciBtb2RlIG5ldHdvcmsgc3RhY2sgcmVzdHJpY3Rpb25zICovCitzdHJ1Y3QgZndfYWxsb3dfZW50cnkgeworICAgIHN0cnVjdCBmd19hbGxvd19lbnRyeSogbmV4dDsKKyAgICB1bnNpZ25lZCBsb25nIGRzdF9hZGRyOyAgIC8qIGhvc3QgYnl0ZSBvcmRlciAqLworICAgIC8qIEFsbG93ZWQgcG9ydCByYW5nZS4gZHN0X2xwb3J0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyBkc3RfaHBvcnQgZm9yIGEKKyAgICAgKiBzaW5nbGUgcG9ydC4gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBkc3RfbHBvcnQ7IC8qIGhvc3QgYnl0ZSBvcmRlciAqLworICAgIHVuc2lnbmVkIHNob3J0IGRzdF9ocG9ydDsgLyogaG9zdCBieXRlIG9yZGVyICovCit9OworCitzdGF0aWMgaW50IGRyb3BfdWRwID0gMDsKK3N0YXRpYyBpbnQgZHJvcF90Y3AgPSAwOworc3RhdGljIHN0cnVjdCBmd19hbGxvd19lbnRyeSogYWxsb3dfdGNwX2VudHJpZXMgPSBOVUxMOworc3RhdGljIHN0cnVjdCBmd19hbGxvd19lbnRyeSogYWxsb3dfdWRwX2VudHJpZXMgPSBOVUxMOworc3RhdGljIEZJTEUqIGRyb3BfbG9nX2ZkID0gTlVMTDsKK3N0YXRpYyBGSUxFKiBkbnNfbG9nX2ZkID0gTlVMTDsKK3N0YXRpYyBpbnQgbWF4X2Ruc19jb25ucyA9IC0xOyAgIC8qIHVubGltaXRlZCBtYXggRE5TIGNvbm5lY3Rpb25zIGJ5IGRlZmF1bHQgKi8KK3N0YXRpYyBpbnQgc2xpcnBfbmV0X2ZvcndhcmRfaW5pdGVkID0gMDsKKwordm9pZCBzbGlycF9kcm9wX3VkcCgpIHsKKyAgICBkcm9wX3VkcCA9IDE7Cit9CisKK3ZvaWQgc2xpcnBfZHJvcF90Y3AoKSB7CisgICAgZHJvcF90Y3AgPSAxOworfQorCisvKiBUQ1AgdHJhZmZpYyBmb3J3YXJkaW5nIHRvIGEgc2luayAtIElmIGVuYWJsZWQsIGFsbCBUQ1AgdHJhZmZpYyB0byBhbnkKKyAqIGlwL3BvcnQgdGhhdCBpcyBub3QgZXhwbGljaXRseSBmb3J3YXJlZCB1c2luZyAnLW5ldC1mb3J3YXJkJywgYW5kIHdoaWNoIHdvdWxkCisgKiBvdGhlcndpc2UgYmUgZHJvcHBlZCBpZiAnLWRyb3AtdGNwJyBoYXMgYmVlbiBzcGVjaWZpZWQsIGlzIHJlZGlyZWN0ZWQgdG8gdGhlCisgKiBzcGVjaWZpZWQgaXA6cG9ydAorICovCitpbnQgZm9yd2FyZF9kcm9wcGVkX3RjcDJzaW5rID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRjcF9zaW5rX2lwOworaW50IHRjcF9zaW5rX3BvcnQ7CisKK3ZvaWQgc2xpcnBfZm9yd2FyZF9kcm9wcGVkX3RjcDJzaW5rKHVuc2lnbmVkIGxvbmcgc2lua19pcCwgaW50IHNpbmtfcG9ydCkgeworICAgIHRjcF9zaW5rX2lwID0gc2lua19pcDsKKyAgICB0Y3Bfc2lua19wb3J0ID0gc2lua19wb3J0OworICAgIGZvcndhcmRfZHJvcHBlZF90Y3Ayc2luayA9IDE7Cit9CisKK2ludCBzbGlycF9zaG91bGRfZm9yd2FyZF9kcm9wcGVkX3RjcDJzaW5rKCkgeworICAgIHJldHVybiBmb3J3YXJkX2Ryb3BwZWRfdGNwMnNpbms7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc2xpcnBfZ2V0X3RjcF9zaW5rX2lwKCkgeworICAgIHJldHVybiB0Y3Bfc2lua19pcDsKK30KK2ludCBzbGlycF9nZXRfdGNwX3NpbmtfcG9ydCgpIHsKKyAgICByZXR1cm4gdGNwX3NpbmtfcG9ydDsKK30KKworLyogRmlsbCBpbiB0aGUgZmlyZXdhbGwgcnVsZXMuIGRzdF9scG9ydCBhbmQgZHN0X2hwb3J0IGFyZSBpbiBob3N0IGJ5dGUgb3JkZXIgKi8KK3ZvaWQgc2xpcnBfYWRkX2FsbG93KHVuc2lnbmVkIGxvbmcgZHN0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X2xwb3J0LCBpbnQgZHN0X2hwb3J0LAorICAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3QgcHJvdG8pIHsKKworICAgIHN0cnVjdCBmd19hbGxvd19lbnRyeSoqIGF0ZTsKKyAgICBzd2l0Y2ggKHByb3RvKSB7CisgICAgICBjYXNlIElQUFJPVE9fVENQOgorICAgICAgICAgIGF0ZSA9ICZhbGxvd190Y3BfZW50cmllczsKKyAgICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSVBQUk9UT19VRFA6CisgICAgICAgICAgYXRlID0gJmFsbG93X3VkcF9lbnRyaWVzOworICAgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm47IC8vIHVua25vd24gcHJvdG9jb2wgZm9yIHRoZSBGVworICAgIH0KKworICAgIHdoaWxlKCphdGUgIT0gTlVMTCkKKyAgICAgICAgYXRlID0gJigqYXRlKS0+bmV4dDsKKworICAgICphdGUgPSBtYWxsb2Moc2l6ZW9mKCoqYXRlKSk7CisgICAgaWYgKCphdGUgPT0gTlVMTCkgeworICAgICAgICBERUJVR19NSVNDKChkZmQsCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gY3JlYXRlIG5ldyBmaXJld2FsbCByZWNvcmQsIG1hbGxvYyBmYWlsZWRcbiIpKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfQorCisgICAgKCphdGUpLT5uZXh0ID0gTlVMTDsKKyAgICAoKmF0ZSktPmRzdF9hZGRyID0gZHN0X2FkZHI7CisgICAgKCphdGUpLT5kc3RfbHBvcnQgPSBkc3RfbHBvcnQ7CisgICAgKCphdGUpLT5kc3RfaHBvcnQgPSBkc3RfaHBvcnQ7Cit9CisKK3ZvaWQgc2xpcnBfZHJvcF9sb2dfZmQoRklMRSogZmQpIHsKKyAgICBkcm9wX2xvZ19mZCA9IGZkOworfQorCit2b2lkIHNsaXJwX2Ruc19sb2dfZmQoRklMRSogZmQpIHsKKyAgICBkbnNfbG9nX2ZkID0gZmQ7Cit9CisKK0ZJTEUqIGdldF9zbGlycF9kcm9wX2xvZ19mZCh2b2lkKSB7CisgIHJldHVybiBkcm9wX2xvZ19mZDsKK30KKworRklMRSogZ2V0X3NsaXJwX2Ruc19sb2dfZmQodm9pZCkgeworICByZXR1cm4gZG5zX2xvZ19mZDsKK30KKworLyogQWRkcmVzcyBhbmQgcG9ydHMgYXJlIGluIGhvc3QgYnl0ZSBvcmRlciAqLworaW50IHNsaXJwX3Nob3VsZF9kcm9wKHVuc2lnbmVkIGxvbmcgZHN0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90IHByb3RvKSB7CisKKyAgICBzdHJ1Y3QgZndfYWxsb3dfZW50cnkqIGF0ZTsKKworICAgIHN3aXRjaCAocHJvdG8pIHsKKyAgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICAgICAgICAgIGlmIChkcm9wX3RjcCAhPSAwKQorICAgICAgICAgICAgICAgIGF0ZSA9IGFsbG93X3RjcF9lbnRyaWVzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVBQUk9UT19VRFA6CisgICAgICAgICAgICBpZiAoZHJvcF91ZHAgIT0gMCkKKyAgICAgICAgICAgICAgICBhdGUgPSBhbGxvd191ZHBfZW50cmllczsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDE7ICAvLyB1bmtub3duIHByb3RvY29sIGZvciB0aGUgRlcKKyAgICB9CisKKyAgICB3aGlsZShhdGUpIHsKKyAgICAgICAgaWYgKChhdGUtPmRzdF9scG9ydCA8PSBkc3RfcG9ydCkgJiYgKGRzdF9wb3J0IDw9IGF0ZS0+ZHN0X2hwb3J0KSkgeworICAgICAgICAgICAgLy8gYWxsb3cgYW55IGRlc3RpbmF0aW9uIGlmIDAKKyAgICAgICAgICAgIGlmIChhdGUtPmRzdF9hZGRyID09IDAgfHwgYXRlLT5kc3RfYWRkciA9PSBkc3RfYWRkcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBhdGUgPSBhdGUtPm5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBsb2cgRE5TIHJlcXVlc3RzIGluIGEgc2VwYXJhdGUgbG9nCisgKi8KK2ludAorc2xpcnBfbG9nX2RucyhzdHJ1Y3QgbWJ1ZiogbSwgaW50IGRyb3BwZWQpIHsKKyAgICBjaGFyIGRuc19xdWVyeVsyNTZdOyAgLy8gbWF4IGFsbG93YWJsZSBkbnMgbmFtZSBzaXplCisgICAgaW50IGMgPSAwOworICAgIGludCBpPSAwOworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IG9mZnNldCA9IDQwICsgMTsgIC8vIHVkcC9pcCBoZWFkZXJzIGxlbmd0aCArIDE7CisgICAgaW50IHRyaW1fYnl0ZXMgPSA0OworCisgICAgaWYgKCFkbnNfbG9nX2ZkKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBXZSBhc3N1bWUgb25lIEROUyBuYW1lIHBlciBxdWVyeTogMzAwID0gMjU1IChtYXggZG5zIG5hbWUgbGVuZ3RoKQorICAgICAqICsgNDAgKHVkcC9pcCBoZHIpICsgMSBieXRlIEROUyBwZWFtYmxlICsgNCBieXRlcyBETlMgc3VmZml4CisgICAgICovCisgICAgaWYgKG0tPm1fbGVuIDwgb2Zmc2V0IHx8IG0tPm1fbGVuID4gMzAwKSB7CisgICAgICAgIERFQlVHX01JU0MoKGRmZCwiTWFsZm9ybWVkIEROUyBxZXVyeSwgbGVuZ3RoICVkIFxuIiwgKGludCltLT5tX2xlbikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaSA9IG9mZnNldDsgaSA8IG0tPm1fbGVuIC0gdHJpbV9ieXRlcyAmJiBpbmRleCA8IChpbnQpc2l6ZW9mKGRuc19xdWVyeSk7IGkrKywgaW5kZXgrKykgeworICAgICAgICBjID0gbS0+bV9kYXRhW2ldOworICAgICAgICBpZiAoYyA8ICcgJyB8fCBjID4gJ34nKQorICAgICAgICAgICAgYyA9ICcuJzsKKworICAgICAgICBkbnNfcXVlcnlbaW5kZXhdID0gKGNoYXIpYzsKKyAgICB9CisgICAgZG5zX3F1ZXJ5W2luZGV4XSA9ICdcMCc7CisgICAgaWYgKCFkcm9wcGVkKSB7CisgICAgICAgIGZwcmludGYoZG5zX2xvZ19mZCwgIlNlbnQgRE5TIHF1ZXJ5IGZvciwgJXNcbiIgLCBkbnNfcXVlcnkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoZG5zX2xvZ19mZCwgIkRyb3BwZWQgRE5TIHF1ZXJ5IGZvciwgJXNcbiIgLCBkbnNfcXVlcnkpOworICAgIH0KKyAgICBmZmx1c2goZG5zX2xvZ19mZCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBsb2cgRE5TIHJlcXVlc3RzIGluIGEgc2VwYXJhdGUgbG9nCisgKi8KK2ludAorc2xpcnBfZHVtcF9kbnMoc3RydWN0IG1idWYqIG0pIHsKKworICAgIGlmICghZG5zX2xvZ19mZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gZmlyc3Qgd2Ugd3JpdGUgdGhlIGxlbmd0aCBvZiB0aGUgcmVjb3JkIHRoZW4gdGhlIHJlY29yZCAoSVAgcGFja2V0KQorICAgIGlmICghZndyaXRlKCYobS0+bV9sZW4pLCBzaXplb2YoaW50KSwgMSwgZG5zX2xvZ19mZCkgfHwKKyAgICAgICAgIWZ3cml0ZShtLT5tX2RhdGEsIG0tPm1fbGVuLCAxLCBkbnNfbG9nX2ZkKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmZmx1c2goZG5zX2xvZ19mZCk7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIExvZyBkcm9wcGVkL2FjY2VwdGVkIHBhY2tldCBpbmZvICovCitpbnQgc2xpcnBfZHJvcF9sb2coY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICBpZiAoIWRyb3BfbG9nX2ZkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisgICAgdmZwcmludGYoZHJvcF9sb2dfZmQsIGZvcm1hdCwgYXJncyk7CisgICAgdmFfZW5kKGFyZ3MpOworCisgICAgZmZsdXNoKGRyb3BfbG9nX2ZkKTsKKworICAgIHJldHVybiAxOworfQorCisKKy8qIFNldCBtYXggRE5TIHJlcXVlc3RzIGFsbG93ZWQgdG8gYmUgaXNzdWVkIGZyb20gdGhlIFZNICovCit2b2lkIHNsaXJwX3NldF9tYXhfZG5zX2Nvbm5zKGludCBudW1fY29ubnMpIHsKKyAgICBtYXhfZG5zX2Nvbm5zID0gbnVtX2Nvbm5zOworfQorCitpbnQgc2xpcnBfZ2V0X21heF9kbnNfY29ubnMoKSB7CisgICAgcmV0dXJuIG1heF9kbnNfY29ubnM7Cit9CisKKy8qIGdlbmVyaWMgZ3Vlc3QgbmV0d29yayByZWRpcmVjdGlvbiBmdW5jdGlvbmFsaXR5IGZvciBpcHY0ICovCitzdHJ1Y3QgbmV0X2ZvcndhcmRfZW50cnkgeworICAgIFFUQUlMUV9FTlRSWShuZXRfZm9yd2FyZF9lbnRyeSkgbmV4dDsKKyAgICAvKiBpcCBhZGRyZXNzZXMgYXJlIGFsc28gaW4gaG9zdCBieXRlIG9yZGVyICovCisgICAgdW5zaWduZWQgbG9uZyBkZXN0X2lwOyAgICAgICAgICAgIC8qIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHRoZXkgdHJ5IHRvIGNvbnRhY3QgKi8KKyAgICB1bnNpZ25lZCBsb25nIGRlc3RfbWFzazsgICAgICAgICAgLyogdGhlIG1hc2sgdG8gYXBwbHkgdG8gdGhlIGFkZHJlc3MgZm9yIG1hdGNoaW5nICovCisgICAgLyogUmFuZ2Ugb2YgcG9ydHMgdGhleSB3ZXJlIHRyeWluZyB0byBjb250YWN0LiBJbiBjYXNlIG9mIGEgc2luZ2xlIHBvcnQsCisgICAgICogZGVzdF9scG9ydCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZGVzdF9ocG9ydCAqLworICAgIGludCBkZXN0X2xwb3J0OyAvKiBIb3N0IGJ5dGUgb3JkZXIgKi8KKyAgICBpbnQgZGVzdF9ocG9ydDsgLyogSG9zdCBieXRlIG9yZGVyICovCisKKyAgICB1bnNpZ25lZCBsb25nICByZWRpcmVjdF9pcDsKKyAgICBpbnQgcmVkaXJlY3RfcG9ydDsgLyogSG9zdCBieXRlIG9yZGVyICovCit9OworCitzdGF0aWMgUVRBSUxRX0hFQUQobmV0X2ZvcndhcmRxLCBuZXRfZm9yd2FyZF9lbnRyeSkgbmV0X2ZvcndhcmRzOworCitzdGF0aWMgdm9pZCBzbGlycF9uZXRfZm9yd2FyZF9pbml0KHZvaWQpCit7CisgICAgaWYgKCFzbGlycF9uZXRfZm9yd2FyZF9pbml0ZWQpIHsKKyAgICAgIFFUQUlMUV9JTklUKCZuZXRfZm9yd2FyZHMpOworICAgICAgc2xpcnBfbmV0X2ZvcndhcmRfaW5pdGVkID0gMTsKKyAgICB9Cit9CisKKy8qIGFsbCBhZGRyZXNzZXMgYW5kIHBvcnRzIGFlIGluIGhvc3QgYnl0ZSBvcmRlciAqLwordm9pZCBzbGlycF9hZGRfbmV0X2ZvcndhcmQodW5zaWduZWQgbG9uZyBkZXN0X2lwLCB1bnNpZ25lZCBsb25nIGRlc3RfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xwb3J0LCBpbnQgZGVzdF9ocG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcmVkaXJlY3RfaXAsIGludCByZWRpcmVjdF9wb3J0KQoreworICAgIHNsaXJwX25ldF9mb3J3YXJkX2luaXQoKTsKKworICAgIHN0cnVjdCBuZXRfZm9yd2FyZF9lbnRyeSAqZW50cnkgPSBtYWxsb2Moc2l6ZW9mKCplbnRyeSkpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisgICAgICAgIERFQlVHX01JU0MoKGRmZCwgIlVuYWJsZSB0byBjcmVhdGUgbmV3IGZvcndhcmRpbmcgZW50cnksIG1hbGxvYyBmYWlsZWRcbiIpKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgfQorCisgICAgZW50cnktPmRlc3RfaXAgPSBkZXN0X2lwOworICAgIGVudHJ5LT5kZXN0X21hc2sgPSBkZXN0X21hc2s7CisgICAgZW50cnktPmRlc3RfbHBvcnQgPSBkZXN0X2xwb3J0OworICAgIGVudHJ5LT5kZXN0X2hwb3J0ID0gZGVzdF9ocG9ydDsKKyAgICBlbnRyeS0+cmVkaXJlY3RfaXAgPSByZWRpcmVjdF9pcDsKKyAgICBlbnRyeS0+cmVkaXJlY3RfcG9ydCA9IHJlZGlyZWN0X3BvcnQ7CisKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJm5ldF9mb3J3YXJkcywgZW50cnksIG5leHQpOworfQorCisvKiByZW1vdGVfcG9ydCBhbmQgcmVkaXJfcG9ydCBhcmd1bWVudHMKKyAqIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKHRjcF9zdWJyLmMpICovCitpbnQgc2xpcnBfc2hvdWxkX25ldF9mb3J3YXJkKHVuc2lnbmVkIGxvbmcgcmVtb3RlX2lwLCBpbnQgcmVtb3RlX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnJlZGlyZWN0X2lwLCBpbnQgKnJlZGlyZWN0X3BvcnQpCit7CisgICAgc3RydWN0IG5ldF9mb3J3YXJkX2VudHJ5ICplbnRyeTsKKworICAgIGZvciAoZW50cnkgPSBuZXRfZm9yd2FyZHMudHFoX2ZpcnN0OworICAgICAgICAgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBlbnRyeS0+bmV4dC50cWVfbmV4dCkgeworCisgICAgICAgIGlmICgoZW50cnktPmRlc3RfbHBvcnQgPD0gcmVtb3RlX3BvcnQpCisgICAgICAgICAgICAmJiAocmVtb3RlX3BvcnQgPD0gZW50cnktPmRlc3RfaHBvcnQpKSB7CisgICAgICAgICAgICBpZiAoKGVudHJ5LT5kZXN0X2lwICYgZW50cnktPmRlc3RfbWFzaykKKyAgICAgICAgICAgICAgICA9PSAocmVtb3RlX2lwICYgZW50cnktPmRlc3RfbWFzaykpIHsKKyAgICAgICAgICAgICAgKnJlZGlyZWN0X2lwID0gZW50cnktPnJlZGlyZWN0X2lwOworICAgICAgICAgICAgICAqcmVkaXJlY3RfcG9ydCA9IGVudHJ5LT5yZWRpcmVjdF9wb3J0OworICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCisKK3N0YXRpYyB2b2lkIF9zbGlycF9yZWRpcl9sb29wKHZvaWQgKCpmdW5jKSh2b2lkICpvcGFxdWUsIGludCBpc191ZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MgKmxhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzICpmYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBpc191ZHApCit7CisgICAgc3RydWN0IHNvY2tldCAqaGVhZCA9IChpc191ZHAgPyAmdWRiIDogJnRjYik7CisgICAgc3RydWN0IHNvY2tldCAqc287CisKKyAgICBmb3IgKHNvID0gaGVhZC0+c29fbmV4dDsgc28gIT0gaGVhZDsgc28gPSBzby0+c29fbmV4dCkgeworICAgICAgICBTb2NrQWRkcmVzcyAgbG9jYWwsIGZvcmVpZ247CisKKwkJc29ja19hZGRyZXNzX2luaXRfaW5ldCgmbG9jYWwsIHNvLT5zb19sYWRkcl9pcCwgc28tPnNvX2xhZGRyX3BvcnQpOworCQlzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KCZmb3JlaWduLCBzby0+c29fZmFkZHJfaXAsIHNvLT5zb19mYWRkcl9wb3J0KTsKKyAgICAgICAgZnVuYyhvcGFxdWUsIGlzX3VkcCwKKyAgICAgICAgICAgICAmbG9jYWwsICZmb3JlaWduKTsKKyAgICB9Cit9CisKK3ZvaWQgc2xpcnBfcmVkaXJfbG9vcCh2b2lkICgqZnVuYykodm9pZCAqb3BhcXVlLCBpbnQgaXNfdWRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2NrQWRkcmVzcyAqbGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzICpmYWRkciksCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUpCit7CisgICAgX3NsaXJwX3JlZGlyX2xvb3AoZnVuYywgb3BhcXVlLCAwKTsKKyAgICBfc2xpcnBfcmVkaXJfbG9vcChmdW5jLCBvcGFxdWUsIDEpOworfQorCisvKiBVbmxpc3RlbnMgYSByZWRpcmVjdGlvbgorICoKKyAqIFJldHVybiB2YWx1ZTogbnVtYmVyIG9mIHJlZGlycyByZW1vdmVkICovCitpbnQgc2xpcnBfcmVkaXJfcm0oaW50IGlzX3VkcCwgaW50IGhvc3RfcG9ydCkKK3sKKyAgICBzdHJ1Y3Qgc29ja2V0ICpzbzsKKyAgICBzdHJ1Y3Qgc29ja2V0ICpoZWFkID0gKGlzX3VkcCA/ICZ1ZGIgOiAmdGNiKTsKKyAgICBpbnQgbiA9IDA7CisKKyBsb29wX2FnYWluOgorICAgIGZvciAoc28gPSBoZWFkLT5zb19uZXh0OyBzbyAhPSBoZWFkOyBzbyA9IHNvLT5zb19uZXh0KSB7CisgICAgICAgIGlmIChzby0+c29fZmFkZHJfcG9ydCA9PSBob3N0X3BvcnQpIHsKKyAgICAgICAgICAgIGNsb3NlKHNvLT5zKTsKKyAgICAgICAgICAgIHNvZnJlZShzbyk7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBnb3RvIGxvb3BfYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworaW50IHNsaXJwX3JlZGlyKGludCBpc191ZHAsIGludCBob3N0X3BvcnQsCisgICAgICAgICAgICAgICAgdWludDMyX3QgIGd1ZXN0X2lwLCBpbnQgZ3Vlc3RfcG9ydCkKK3sKKyAgICBpZiAoaXNfdWRwKSB7CisgICAgICAgIGlmICghdWRwX2xpc3Rlbihob3N0X3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBndWVzdF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXN0X3BvcnQsIDApKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCBzb2NrZXQqIHM0ID0gc29saXN0ZW4oaG9zdF9wb3J0LCBndWVzdF9pcCwgZ3Vlc3RfcG9ydCwgMCk7CisgICAgICAgIHN0cnVjdCBzb2NrZXQqIHM2ID0gc29saXN0ZW4oaG9zdF9wb3J0LCBndWVzdF9pcCwgZ3Vlc3RfcG9ydCwgU1NfSVBWNik7CisgICAgICAgIGlmICghczQgJiYgIXM2KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50ICBzbGlycF91bnJlZGlyKGludCAgaXNfdWRwLCBpbnQgIGhvc3RfcG9ydCkKK3sKKyAgICBpZiAoaXNfdWRwKQorICAgICAgICByZXR1cm4gdWRwX3VubGlzdGVuKCBob3N0X3BvcnQgKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNvdW5saXN0ZW4oIGhvc3RfcG9ydCApKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHdlIGFyZSBsaXN0ZW5pbmcgb24gYm90aCBpcHY0L2lwdjYgcG9ydHMuCisgICAgICAgIC8vIEp1c3QgdHJ5IHVubGlzdGVuIGFnYWluLgorICAgICAgICBzb3VubGlzdGVuKCBob3N0X3BvcnQgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitpbnQgc2xpcnBfYWRkX2V4ZWMoaW50IGRvX3B0eSwgY29uc3Qgdm9pZCAqYXJncywgaW50IGFkZHJfbG93X2J5dGUsCisgICAgICAgICAgICAgICAgICBpbnQgZ3Vlc3RfcG9ydCkKK3sKKyAgICByZXR1cm4gYWRkX2V4ZWMoJmV4ZWNfbGlzdCwgZG9fcHR5LCAoY2hhciAqKWFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGFkZHJfbG93X2J5dGUsIGh0b25zKGd1ZXN0X3BvcnQpKTsKK30KKworc3NpemVfdCBzbGlycF9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlpZiAoc28tPnMgPT0gLTEgJiYgc28tPmV4dHJhKSB7CisJCXFlbXVfY2hyX3dyaXRlKHNvLT5leHRyYSwgYnVmLCBsZW4pOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiBzZW5kKHNvLT5zLCBidWYsIGxlbiwgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNvY2tldCAqc2xpcnBfZmluZF9jdGxfc29ja2V0KGludCBhZGRyX2xvd19ieXRlLCBpbnQgZ3Vlc3RfcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKKworCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzby0+c29fbmV4dCkgeworCQlpZiAoKHNvLT5zb19mYWRkcl9pcCAmIDB4ZmZmZmZmMDApID09CisJCQkJc3BlY2lhbF9hZGRyX2lwCisJCQkJJiYgKChzby0+c29fZmFkZHJfcG9ydCAmIDB4ZmYpID09CisJCQkJYWRkcl9sb3dfYnl0ZSkKKwkJCQkmJiBzby0+c29fZmFkZHJfcG9ydCA9PSBndWVzdF9wb3J0KQorCQkJcmV0dXJuIHNvOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzaXplX3Qgc2xpcnBfc29ja2V0X2Nhbl9yZWN2KGludCBhZGRyX2xvd19ieXRlLCBpbnQgZ3Vlc3RfcG9ydCkKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdOworCXN0cnVjdCBzb2NrZXQgKnNvOworCisgICAgaWYgKCFsaW5rX3VwKQorICAgICAgICByZXR1cm4gMDsKKworCXNvID0gc2xpcnBfZmluZF9jdGxfc29ja2V0KGFkZHJfbG93X2J5dGUsIGd1ZXN0X3BvcnQpOworCisJaWYgKCFzbyB8fCBzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGKQorCQlyZXR1cm4gMDsKKworCWlmICghQ09OTl9DQU5GUkNWKHNvKSB8fCBzby0+c29fc25kLnNiX2NjID49IChzby0+c29fc25kLnNiX2RhdGFsZW4vMikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNvcHJlcHJidWYoc28sIGlvdiwgTlVMTCk7Cit9CisKK3ZvaWQgc2xpcnBfc29ja2V0X3JlY3YoaW50IGFkZHJfbG93X2J5dGUsIGludCBndWVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgIGludCBzaXplKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHNvY2tldCAqc28gPSBzbGlycF9maW5kX2N0bF9zb2NrZXQoYWRkcl9sb3dfYnl0ZSwgZ3Vlc3RfcG9ydCk7CisKKyAgICBpZiAoIXNvKQorICAgICAgICByZXR1cm47CisKKyAgICByZXQgPSBzb3JlYWRidWYoc28sIChjb25zdCBjaGFyICopYnVmLCBzaXplKTsKKworICAgIGlmIChyZXQgPiAwKQorICAgICAgICB0Y3Bfb3V0cHV0KHNvdG90Y3BjYihzbykpOworfQorCitzdGF0aWMgdm9pZCBzbGlycF90Y3Bfc2F2ZShRRU1VRmlsZSAqZiwgc3RydWN0IHRjcGNiICp0cCkKK3sKKyAgICBpbnQgaTsKKworICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3N0YXRlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVENQVF9OVElNRVJTOyBpKyspCisgICAgICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3RpbWVyW2ldKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9yeHRzaGlmdCk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfcnh0Y3VyKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9kdXBhY2tzKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHRwLT50X21heHNlZyk7CisgICAgcWVtdV9wdXRfc2J5dGUoZiwgdHAtPnRfZm9yY2UpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgdHAtPnRfZmxhZ3MpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF91bmEpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF9ueHQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF91cCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX3dsMSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX3dsMik7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+aXNzKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5zbmRfd25kKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3Zfd25kKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3Zfbnh0KTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3ZfdXApOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPmlycyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+cmN2X2Fkdik7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX21heCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX2N3bmQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF9zc3RocmVzaCk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfaWRsZSk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfcnR0KTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT50X3J0c2VxKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9zcnR0KTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9ydHR2YXIpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgdHAtPnRfcnR0bWluKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5tYXhfc25kd25kKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT50X29vYmZsYWdzKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT50X2lvYmMpOworICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3NvZnRlcnJvcik7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB0cC0+c25kX3NjYWxlKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT5yY3Zfc2NhbGUpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgdHAtPnJlcXVlc3Rfcl9zY2FsZSk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB0cC0+cmVxdWVzdGVkX3Nfc2NhbGUpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnRzX3JlY2VudCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+dHNfcmVjZW50X2FnZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+bGFzdF9hY2tfc2VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaXJwX3NidWZfc2F2ZShRRU1VRmlsZSAqZiwgc3RydWN0IHNidWYgKnNidWYpCit7CisgICAgdWludDMyX3Qgb2ZmOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBzYnVmLT5zYl9jYyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzYnVmLT5zYl9kYXRhbGVuKTsKKyAgICBvZmYgPSAodWludDMyX3QpKHNidWYtPnNiX3dwdHIgLSBzYnVmLT5zYl9kYXRhKTsKKyAgICBxZW11X3B1dF9zYmUzMihmLCBvZmYpOworICAgIG9mZiA9ICh1aW50MzJfdCkoc2J1Zi0+c2JfcnB0ciAtIHNidWYtPnNiX2RhdGEpOworICAgIHFlbXVfcHV0X3NiZTMyKGYsIG9mZik7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsICh1bnNpZ25lZCBjaGFyKilzYnVmLT5zYl9kYXRhLCBzYnVmLT5zYl9kYXRhbGVuKTsKK30KKworc3RhdGljIHZvaWQgc2xpcnBfc29ja2V0X3NhdmUoUUVNVUZpbGUgKmYsIHN0cnVjdCBzb2NrZXQgKnNvKQoreworICAgIHFlbXVfcHV0X2JlMzIoZiwgc28tPnNvX3VyZ2MpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgc28tPnNvX2ZhZGRyX2lwKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHNvLT5zb19sYWRkcl9pcCk7CisgICAgcWVtdV9wdXRfYmUxNihmLCBzby0+c29fZmFkZHJfcG9ydCk7CisgICAgcWVtdV9wdXRfYmUxNihmLCBzby0+c29fbGFkZHJfcG9ydCk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzby0+c29faXB0b3MpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgc28tPnNvX2VtdSk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCBzby0+c29fdHlwZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzby0+c29fc3RhdGUpOworICAgIHNsaXJwX3NidWZfc2F2ZShmLCAmc28tPnNvX3Jjdik7CisgICAgc2xpcnBfc2J1Zl9zYXZlKGYsICZzby0+c29fc25kKTsKKyAgICBzbGlycF90Y3Bfc2F2ZShmLCBzby0+c29fdGNwY2IpOworfQorCitzdGF0aWMgdm9pZCBzbGlycF9zdGF0ZV9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgc3RydWN0IGV4X2xpc3QgKmV4X3B0cjsKKworICAgIGZvciAoZXhfcHRyID0gZXhlY19saXN0OyBleF9wdHI7IGV4X3B0ciA9IGV4X3B0ci0+ZXhfbmV4dCkKKyAgICAgICAgaWYgKGV4X3B0ci0+ZXhfcHR5ID09IDMpIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrZXQgKnNvOworICAgICAgICAgICAgc28gPSBzbGlycF9maW5kX2N0bF9zb2NrZXQoZXhfcHRyLT5leF9hZGRyLCBudG9ocyhleF9wdHItPmV4X2Zwb3J0KSk7CisgICAgICAgICAgICBpZiAoIXNvKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBxZW11X3B1dF9ieXRlKGYsIDQyKTsKKyAgICAgICAgICAgIHNsaXJwX3NvY2tldF9zYXZlKGYsIHNvKTsKKyAgICAgICAgfQorICAgIHFlbXVfcHV0X2J5dGUoZiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaXJwX3RjcF9sb2FkKFFFTVVGaWxlICpmLCBzdHJ1Y3QgdGNwY2IgKnRwKQoreworICAgIGludCBpOworCisgICAgdHAtPnRfc3RhdGUgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVENQVF9OVElNRVJTOyBpKyspCisgICAgICAgIHRwLT50X3RpbWVyW2ldID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfcnh0c2hpZnQgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9yeHRjdXIgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9kdXBhY2tzID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfbWF4c2VnID0gcWVtdV9nZXRfYmUxNihmKTsKKyAgICB0cC0+dF9mb3JjZSA9IHFlbXVfZ2V0X3NieXRlKGYpOworICAgIHRwLT50X2ZsYWdzID0gcWVtdV9nZXRfYmUxNihmKTsKKyAgICB0cC0+c25kX3VuYSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnNuZF9ueHQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfdXAgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfd2wxID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX3dsMiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPmlzcyA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnNuZF93bmQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5yY3Zfd25kID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+cmN2X254dCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnJjdl91cCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPmlycyA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnJjdl9hZHYgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfbWF4ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX2N3bmQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfc3N0aHJlc2ggPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT50X2lkbGUgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9ydHQgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9ydHNlcSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnRfc3J0dCA9IHFlbXVfZ2V0X3NiZTE2KGYpOworICAgIHRwLT50X3J0dHZhciA9IHFlbXVfZ2V0X3NiZTE2KGYpOworICAgIHRwLT50X3J0dG1pbiA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgdHAtPm1heF9zbmR3bmQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT50X29vYmZsYWdzID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+dF9pb2JjID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+dF9zb2Z0ZXJyb3IgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+c25kX3NjYWxlID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+cmN2X3NjYWxlID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+cmVxdWVzdF9yX3NjYWxlID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+cmVxdWVzdGVkX3Nfc2NhbGUgPSBxZW11X2dldF9ieXRlKGYpOworICAgIHRwLT50c19yZWNlbnQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT50c19yZWNlbnRfYWdlID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+bGFzdF9hY2tfc2VudCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdGNwX3RlbXBsYXRlKHRwKTsKK30KKworc3RhdGljIGludCBzbGlycF9zYnVmX2xvYWQoUUVNVUZpbGUgKmYsIHN0cnVjdCBzYnVmICpzYnVmKQoreworICAgIHVpbnQzMl90IG9mZiwgc2JfY2MsIHNiX2RhdGFsZW47CisKKyAgICBzYl9jYyA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgc2JfZGF0YWxlbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICBzYnJlc2VydmUoc2J1Ziwgc2JfZGF0YWxlbik7CisKKyAgICBpZiAoc2J1Zi0+c2JfZGF0YWxlbiAhPSBzYl9kYXRhbGVuKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIHNidWYtPnNiX2NjID0gc2JfY2M7CisKKyAgICBvZmYgPSBxZW11X2dldF9zYmUzMihmKTsKKyAgICBzYnVmLT5zYl93cHRyID0gc2J1Zi0+c2JfZGF0YSArIG9mZjsKKyAgICBvZmYgPSBxZW11X2dldF9zYmUzMihmKTsKKyAgICBzYnVmLT5zYl9ycHRyID0gc2J1Zi0+c2JfZGF0YSArIG9mZjsKKyAgICBxZW11X2dldF9idWZmZXIoZiwgKHVuc2lnbmVkIGNoYXIqKXNidWYtPnNiX2RhdGEsIHNidWYtPnNiX2RhdGFsZW4pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xpcnBfc29ja2V0X2xvYWQoUUVNVUZpbGUgKmYsIHN0cnVjdCBzb2NrZXQgKnNvKQoreworICAgIGlmICh0Y3BfYXR0YWNoKHNvKSA8IDApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgc28tPnNvX3VyZ2MgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHNvLT5zb19mYWRkcl9pcCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgc28tPnNvX2xhZGRyX2lwID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzby0+c29fZmFkZHJfcG9ydCA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgc28tPnNvX2xhZGRyX3BvcnQgPSBxZW11X2dldF9iZTE2KGYpOworICAgIHNvLT5zb19pcHRvcyA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgc28tPnNvX2VtdSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgc28tPnNvX3R5cGUgPSBxZW11X2dldF9ieXRlKGYpOworICAgIHNvLT5zb19zdGF0ZSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgaWYgKHNsaXJwX3NidWZfbG9hZChmLCAmc28tPnNvX3JjdikgPCAwKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICBpZiAoc2xpcnBfc2J1Zl9sb2FkKGYsICZzby0+c29fc25kKSA8IDApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIHNsaXJwX3RjcF9sb2FkKGYsIHNvLT5zb190Y3BjYik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbGlycF9zdGF0ZV9sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIHN0cnVjdCBleF9saXN0ICpleF9wdHI7CisgICAgaW50IHI7CisKKyAgICB3aGlsZSAoKHIgPSBxZW11X2dldF9ieXRlKGYpKSkgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBzdHJ1Y3Qgc29ja2V0ICpzbyA9IHNvY3JlYXRlKCk7CisKKyAgICAgICAgaWYgKCFzbykKKyAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworCisgICAgICAgIHJldCA9IHNsaXJwX3NvY2tldF9sb2FkKGYsIHNvKTsKKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKChzby0+c29fZmFkZHJfaXAgJiAweGZmZmZmZjAwKSAhPSBzcGVjaWFsX2FkZHJfaXApCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBmb3IgKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpCisgICAgICAgICAgICBpZiAoZXhfcHRyLT5leF9wdHkgPT0gMyAmJgorICAgICAgICAgICAgICAgICAgICAoc28tPnNvX2ZhZGRyX2lwICYgMHhmZikgPT0gZXhfcHRyLT5leF9hZGRyICYmCisgICAgICAgICAgICAgICAgICAgIHNvLT5zb19mYWRkcl9wb3J0ID09IGV4X3B0ci0+ZXhfZnBvcnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFleF9wdHIpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBzby0+ZXh0cmEgPSAodm9pZCAqKWV4X3B0ci0+ZXhfZXhlYzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zbGlycC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NsaXJwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmYWU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zbGlycC5oCkBAIC0wLDAgKzEsMjgyIEBACisjaWZuZGVmIF9fQ09NTU9OX0hfXworI2RlZmluZSBfX0NPTU1PTl9IX18KKworI2RlZmluZSBDT05GSUdfUUVNVQorCisvLyNkZWZpbmUgREVCVUcgMQorCisvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIGVuYWJsZSBTTElSUCBzdGF0aXN0aWNzIHByaW50aW5nIGluIFFlbXUKKy8vI2RlZmluZSBMT0dfRU5BQkxFRAorCisjaWZkZWYgTE9HX0VOQUJMRUQKKyNkZWZpbmUgU1RBVChleHByKSBleHByCisjZWxzZQorI2RlZmluZSBTVEFUKGV4cHIpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZm5kZWYgQ09ORklHX1FFTVUKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc29ja2V0cy5oIgorCisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJzbGlycF9jb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWZkZWYgX1dJTjMyCisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisKK3R5cGVkZWYgdWludDhfdCB1X2ludDhfdDsKK3R5cGVkZWYgdWludDE2X3QgdV9pbnQxNl90OwordHlwZWRlZiB1aW50MzJfdCB1X2ludDMyX3Q7Cit0eXBlZGVmIHVpbnQ2NF90IHVfaW50NjRfdDsKK3R5cGVkZWYgY2hhciAqY2FkZHJfdDsKKworIyBpbmNsdWRlIDx3aW5zb2NrMi5oPgorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjIGluY2x1ZGUgPHN5cy90aW1lYi5oPgorIyBpbmNsdWRlIDxpcGhscGFwaS5oPgorI2Vsc2UKKyMgZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpZmRlZiBORUVEX1RZUEVERUZTCit0eXBlZGVmIGNoYXIgaW50OF90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfaW50OF90OworCisjIGlmIFNJWkVPRl9TSE9SVCA9PSAyCisgICAgdHlwZWRlZiBzaG9ydCBpbnQxNl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQxNl90OworIyBlbHNlCisjICBpZiBTSVpFT0ZfSU5UID09IDIKKyAgICB0eXBlZGVmIGludCBpbnQxNl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MTZfdDsKKyMgIGVsc2UKKyAgICAjZXJyb3IgQ2Fubm90IGZpbmQgYSB0eXBlIHdpdGggc2l6ZW9mKCkgPT0gMgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZiBTSVpFT0ZfU0hPUlQgPT0gNAorICAgdHlwZWRlZiBzaG9ydCBpbnQzMl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDMyX3Q7CisjIGVsc2UKKyMgIGlmIFNJWkVPRl9JTlQgPT0gNAorICAgIHR5cGVkZWYgaW50IGludDMyX3Q7CisgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90OworIyAgZWxzZQorICAgICNlcnJvciBDYW5ub3QgZmluZCBhIHR5cGUgd2l0aCBzaXplb2YoKSA9PSA0CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIE5FRURfVFlQRURFRlMgKi8KKworI2lmZGVmIEhBVkVfVU5JU1REX0gKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RETElCX0gKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmbmRlZiBIQVZFX01FTU1PVkUKKyNkZWZpbmUgbWVtbW92ZSh4LCB5LCB6KSBiY29weSh5LCB4LCB6KQorI2VuZGlmCisKKyNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKKyMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgaW5jbHVkZSA8dGltZS5oPgorI2Vsc2UKKyMgaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjICBpbmNsdWRlIDxzeXMvdGltZS5oPgorIyBlbHNlCisjICBpbmNsdWRlIDx0aW1lLmg+CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjZW5kaWYKKworI3VuZGVmIF9QCisjaWZuZGVmIE5PX1BST1RPVFlQRVMKKyMgIGRlZmluZSAgIF9QKHgpICAgeAorI2Vsc2UKKyMgIGRlZmluZSAgIF9QKHgpICAgKCkKKyNlbmRpZgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpZmRlZiBHRVRUSU1FT0ZEQVlfT05FX0FSRworI2RlZmluZSBnZXR0aW1lb2ZkYXkoeCwgeSkgZ2V0dGltZW9mZGF5KHgpCisjZW5kaWYKKworLyogU3lzdGVtcyBsYWNraW5nIHN0cmR1cCgpIGRlZmluaXRpb24gaW4gPHN0cmluZy5oPi4gKi8KKyNpZiBkZWZpbmVkKHVsdHJpeCkKK2NoYXIgKnN0cmR1cCBfUCgoY29uc3QgY2hhciAqKSk7CisjZW5kaWYKKworLyogU3lzdGVtcyBsYWNraW5nIG1hbGxvYygpIGRlZmluaXRpb24gaW4gPHN0ZGxpYi5oPi4gKi8KKyNpZiBkZWZpbmVkKHVsdHJpeCkgfHwgZGVmaW5lZChoY3gpCit2b2lkICptYWxsb2MgX1AoKHNpemVfdCBhcmcpKTsKK3ZvaWQgZnJlZSBfUCgodm9pZCAqcHRyKSk7CisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisvKiBBdm9pZCBjb25mbGljdGluZyB3aXRoIHRoZSBsaWJjIGluc3F1ZSgpIGFuZCByZW1xdWUoKSwgd2hpY2gKKyAgIGhhdmUgZGlmZmVyZW50IHByb3RvdHlwZXMuICovCisjZGVmaW5lIGluc3F1ZSBzbGlycF9pbnNxdWUKKyNkZWZpbmUgcmVtcXVlIHNsaXJwX3JlbXF1ZQorCisjaWZkZWYgSEFWRV9TWVNfU1RST1BUU19ICisjaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2luY2x1ZGUgImlwLmgiCisjaW5jbHVkZSAidGNwLmgiCisjaW5jbHVkZSAidGNwX3RpbWVyLmgiCisjaW5jbHVkZSAidGNwX3Zhci5oIgorI2luY2x1ZGUgInRjcGlwLmgiCisjaW5jbHVkZSAidWRwLmgiCisjaW5jbHVkZSAiaWNtcF92YXIuaCIKKyNpbmNsdWRlICJtYnVmLmgiCisjaW5jbHVkZSAic2J1Zi5oIgorI2luY2x1ZGUgInNvY2tldC5oIgorI2luY2x1ZGUgImlmLmgiCisjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgIm1pc2MuaCIKKyNpbmNsdWRlICJjdGwuaCIKKyNpZmRlZiBVU0VfUFBQCisjaW5jbHVkZSAicHBwL3BwcGQuaCIKKyNpbmNsdWRlICJwcHAvcHBwLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImJvb3RwLmgiCisjaW5jbHVkZSAidGZ0cC5oIgorI2luY2x1ZGUgImxpYnNsaXJwLmgiCisKK2V4dGVybiBzdHJ1Y3QgdHR5cyAqdHR5c191bml0W01BWF9JTlRFUkZBQ0VTXTsKKworI2lmbmRlZiBOVUxMCisjZGVmaW5lIE5VTEwgKHZvaWQgKikwCisjZW5kaWYKKworI2lmbmRlZiBGVUxMX0JPTFQKK3ZvaWQgaWZfc3RhcnQgX1AoKHZvaWQpKTsKKyNlbHNlCit2b2lkIGlmX3N0YXJ0IF9QKChzdHJ1Y3QgdHR5cyAqKSk7CisjZW5kaWYKKworI2lmZGVmIEJBRF9TUFJJTlRGCisjIGRlZmluZSB2c3ByaW50ZiB2c3ByaW50Zl9sZW4KKyMgZGVmaW5lIHNwcmludGYgc3ByaW50Zl9sZW4KKyBleHRlcm4gaW50IHZzcHJpbnRmX2xlbiBfUCgoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyBleHRlcm4gaW50IHNwcmludGZfbGVuIF9QKChjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7CisjZW5kaWYKKworI2lmZGVmIERFQ0xBUkVfU1BSSU5URgorIyBpZm5kZWYgQkFEX1NQUklOVEYKKyBleHRlcm4gaW50IHZzcHJpbnRmIF9QKChjaGFyICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworIyBlbmRpZgorIGV4dGVybiBpbnQgdmZwcmludGYgX1AoKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUkVSUk9SCisgZXh0ZXJuIGNoYXIgKnN0cmVycm9yIF9QKChpbnQgZXJyb3IpKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSU5ERVgKKyBjaGFyICppbmRleCBfUCgoY29uc3QgY2hhciAqLCBpbnQpKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUSE9TVElECisgbG9uZyBnZXRob3N0aWQgX1AoKHZvaWQpKTsKKyNlbmRpZgorCit2b2lkIGxwcmludCBfUCgoY29uc3QgY2hhciAqLCAuLi4pKTsKKworCisjZGVmaW5lIERFRkFVTFRfQkFVRCAxMTUyMDAKKworI2RlZmluZSBTT19PUFRJT05TIERPX0tFRVBBTElWRQorI2RlZmluZSBUQ1BfTUFYSURMRSAoVENQVFZfS0VFUENOVCAqIFRDUFRWX0tFRVBJTlRWTCkKKworLyogY2tzdW0uYyAqLworaW50IGNrc3VtKHN0cnVjdCBtYnVmICptLCBpbnQgbGVuKTsKKworLyogaWYuYyAqLwordm9pZCBpZl9pbml0IF9QKCh2b2lkKSk7Cit2b2lkIGlmX291dHB1dCBfUCgoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbWJ1ZiAqKSk7CisKKy8qIGlwX2lucHV0LmMgKi8KK3ZvaWQgaXBfaW5pdCBfUCgodm9pZCkpOwordm9pZCBpcF9pbnB1dCBfUCgoc3RydWN0IG1idWYgKikpOwordm9pZCBpcF9zbG93dGltbyBfUCgodm9pZCkpOwordm9pZCBpcF9zdHJpcG9wdGlvbnMgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIHN0cnVjdCBtYnVmICopKTsKKworLyogaXBfb3V0cHV0LmMgKi8KK2ludCBpcF9vdXRwdXQgX1AoKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1idWYgKikpOworCisvKiB0Y3BfaW5wdXQuYyAqLwordm9pZCB0Y3BfaW5wdXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIGludCwgc3RydWN0IHNvY2tldCAqKSk7CitpbnQgdGNwX21zcyBfUCgocmVnaXN0ZXIgc3RydWN0IHRjcGNiICosIHVfaW50KSk7CisKKy8qIHRjcF9vdXRwdXQuYyAqLworaW50IHRjcF9vdXRwdXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqKSk7Cit2b2lkIHRjcF9zZXRwZXJzaXN0IF9QKChyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKikpOworCisvKiB0Y3Bfc3Vici5jICovCit2b2lkIHRjcF9pbml0IF9QKCh2b2lkKSk7Cit2b2lkIHRjcF90ZW1wbGF0ZSBfUCgoc3RydWN0IHRjcGNiICopKTsKK3ZvaWQgdGNwX3Jlc3BvbmQgX1AoKHN0cnVjdCB0Y3BjYiAqLCByZWdpc3RlciBzdHJ1Y3QgdGNwaXBoZHIgKiwgcmVnaXN0ZXIgc3RydWN0IG1idWYgKiwgdGNwX3NlcSwgdGNwX3NlcSwgaW50KSk7CitzdHJ1Y3QgdGNwY2IgKiB0Y3BfbmV3dGNwY2IgX1AoKHN0cnVjdCBzb2NrZXQgKikpOworc3RydWN0IHRjcGNiICogdGNwX2Nsb3NlIF9QKChyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKikpOwordm9pZCB0Y3Bfc29ja2Nsb3NlZCBfUCgoc3RydWN0IHRjcGNiICopKTsKK2ludCB0Y3BfZmNvbm5lY3QgX1AoKHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCB0Y3BfY29ubmVjdCBfUCgoc3RydWN0IHNvY2tldCAqKSk7CitpbnQgdGNwX2F0dGFjaCBfUCgoc3RydWN0IHNvY2tldCAqKSk7Cit1X2ludDhfdCB0Y3BfdG9zIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK2ludCB0Y3BfZW11IF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtYnVmICopKTsKK2ludCB0Y3BfY3RsIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3N0cnVjdCB0Y3BjYiAqdGNwX2Ryb3Aoc3RydWN0IHRjcGNiICp0cCwgaW50IGVycik7CisKKyNpZmRlZiBVU0VfUFBQCisjZGVmaW5lIE1JTl9NUlUgTUlOTVJVCisjZGVmaW5lIE1BWF9NUlUgTUFYTVJVCisjZWxzZQorI2RlZmluZSBNSU5fTVJVIDEyOAorI2RlZmluZSBNQVhfTVJVIDE2Mzg0CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgbWF4KHgseSkgKCh4KSA+ICh5KSA/ICh4KSA6ICh5KSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zbGlycF9jb25maWcuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zbGlycF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjJmNTBkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NsaXJwX2NvbmZpZy5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogVXNlciBkZWZpbmFibGUgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKi8KKworLyogVW5kZWZpbmUgaWYgeW91IGRvbid0IHdhbnQgdGFsayBlbXVsYXRpb24gKi8KKyN1bmRlZiBFTVVMQVRFX1RBTEsKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRoZSBjb25uZWN0aW9uIHRvIGJlIHByb2JlZCAqLworLyogWFhYIE5vdCB3b3JraW5nIHlldCwgc28gaWdub3JlIHRoaXMgZm9yIG5vdyAqLworI3VuZGVmIFBST0JFX0NPTk4KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IHdhbnQgS0VFUEFMSVZFIHRpbWVycyAqLworI2RlZmluZSBET19LRUVQQUxJVkUgMAorCisvKiBEZWZpbmUgdG8gTUFYIGludGVyZmFjZXMgeW91IGV4cGVjdCB0byB1c2UgYXQgb25jZSAqLworLyogTUFYX0lOVEVSRkFDRVMgZGV0ZXJtaW5lcyB0aGUgbWF4LiBUT1RBTCBudW1iZXIgb2YgaW50ZXJmYWNlcyAoU0xJUCBhbmQgUFBQKSAqLworLyogTUFYX1BQUF9JTlRFUkZBQ0VTIGRldGVybWluZXMgbWF4LiBudW1iZXIgb2YgUFBQIGludGVyZmFjZXMgKi8KKyNkZWZpbmUgTUFYX0lOVEVSRkFDRVMgMQorI2RlZmluZSBNQVhfUFBQX0lOVEVSRkFDRVMgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgc2xpcnAncyBzb2NrZXQgaW4gL3RtcCAqLworLyogWFhYWFhYIERvIHRoaXMgaW4gLi9jb25maWd1cmUgKi8KKyN1bmRlZiBVU0VfVE1QU09DS0VUCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBzbGlycCB0byB1c2UgY2ZzZXRYc3BlZWQoKSBvbiB0aGUgdGVybWluYWwgKi8KKyN1bmRlZiBET19DRlNFVFNQRUVECisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHNsaXJwIHRvIHdyaXRlIHRvIHRoZSB0dHkgYXMgZmFzdCBhcyBpdCBjYW4gKi8KKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IGlmIHlvdSBhcmUgdXNpbmcgbG9hZC1iYWxhbmNpbmcsIHNsaXJwIGRvZXMgYSAqLworLyogcHJldHR5IGdvb2Qgam9iIG9uIHNpbmdsZSBtb2RlbXMgYWxyZWFkeSwgYW5kIHNldGluZyB0aGlzIHdpbGwgbWFrZSAqLworLyogaW50ZXJhY3RpdmUgc2Vzc2lvbnMgbGVzcyByZXNwb25zaXZlICovCisvKiBYWFhYWCBUYWxrIGFib3V0IGhhdmluZyBmYXN0IG1vZGVtIGFzIHVuaXQgMCAqLworI3VuZGVmIEZVTExfQk9MVAorCisvKgorICogRGVmaW5lIGlmIHlvdSB3YW50IHNsaXJwIHRvIHVzZSBsZXNzIENQVQorICogWW91IHdpbGwgbm90aWNlIGEgc21hbGwgbGFnIGluIGludGVyYWN0aXZlIHNlc3Npb25zLCBidXQgaXQncyBub3QgdGhhdCBiYWQKKyAqIFRoaW5ncyBsaWtlIE5ldHNjYXBlL2Z0cC9ldGMuIGFyZSBjb21wbGV0ZWx5IHVuYWZmZWN0ZWQKKyAqIFRoaXMgaXMgbWFpbmx5IGZvciBzeXNhZG1pbnMgd2hvIGhhdmUgbWFueSBzbGlycCB1c2VycworICovCisjdW5kZWYgVVNFX0xPV0NQVQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBwcm90b3R5cGVzICovCisjaWZuZGVmIF9fU1REQ19fCisjZGVmaW5lIE5PX1BST1RPVFlQRVMKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEF1dG9jb25mIGRlZmluZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisgKiBZb3Ugc2hvdWxkbid0IG5lZWQgdG8gdG91Y2ggYW55IG9mIHRoZXNlCisgKi8KKworLyogSWdub3JlIHRoaXMgKi8KKyN1bmRlZiBEVU1NWV9QUFAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHVuaXN0ZC5oICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0ZGxpYi5oICovCisjZGVmaW5lIEhBVkVfU1RETElCX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5cy9pb2N0bC5oICovCisjdW5kZWYgSEFWRV9TWVNfSU9DVExfSAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgSEFWRV9TWVNfSU9DVExfSAorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzeXMvZmlsaW8uaCAqLworI3VuZGVmIEhBVkVfU1lTX0ZJTElPX0gKKyNpZmRlZiBfX0FQUExFX18KKyNkZWZpbmUgSEFWRV9TWVNfRklMSU9fSAorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzdHJlcnJvciAqLworI2RlZmluZSBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzdHJkdXAoKSAqLworI2RlZmluZSBIQVZFX1NUUkRVUAorCisvKiBEZWZpbmUgYWNjb3JkaW5nIHRvIGhvdyB0aW1lLmggc2hvdWxkIGJlIGluY2x1ZGVkICovCisjZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAwCisjdW5kZWYgSEFWRV9TWVNfVElNRV9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzeXMvYml0eXBlcy5oICovCisjdW5kZWYgSEFWRV9TWVNfQklUWVBFU19ICisKKy8qIERlZmluZSBpZiB0aGUgbWFjaGluZSBpcyBiaWcgZW5kaWFuICovCisvLyN1bmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorCisvKiBEZWZpbmUgaWYgeW91ciBzcHJpbnRmIHJldHVybnMgY2hhciAqIGluc3RlYWQgb2YgaW50ICovCisjdW5kZWYgQkFEX1NQUklOVEYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHJlYWR2ICovCisjdW5kZWYgSEFWRV9SRUFEVgorCisvKiBEZWZpbmUgaWYgaW92ZWMgbmVlZHMgdG8gYmUgZGVjbGFyZWQgKi8KKyN1bmRlZiBERUNMQVJFX0lPVkVDCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIERFQ0xBUkVfSU9WRUMKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgYSBkZWNsYXJhdGlvbiBvZiBzcHJpbnRmL2ZwcmludGYgaXMgbmVlZGVkICovCisjdW5kZWYgREVDTEFSRV9TUFJJTlRGCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIFBPU0lYLjEgc3lzL3dhaXQuaCAqLworI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3lzL3NlbGVjdC5oICovCisjdW5kZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9ICisjZW5kaWYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cmluZ3MuaCAqLworI2RlZmluZSBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBhcnBhL2luZXQuaCAqLworI3VuZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0gKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3lzL3NpZ25hbC5oICovCisjdW5kZWYgSEFWRV9TWVNfU0lHTkFMX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5cy9zdHJvcHRzLmggKi8KKyN1bmRlZiBIQVZFX1NZU19TVFJPUFRTX0gKKworLyogRGVmaW5lIHRvIHdoYXRldmVyIHlvdXIgY29tcGlsZXIgdGhpbmtzIGlubGluZSBzaG91bGQgYmUgKi8KKy8vI2RlZmluZSBpbmxpbmUgaW5saW5lCisKKy8qIERlZmluZSB0byB3aGF0ZXZlciB5b3VyIGNvbXBpbGVyIHRoaW5rcyBjb25zdCBzaG91bGQgYmUgKi8KKy8vI2RlZmluZSBjb25zdCBjb25zdAorCisvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgcHJvdG90eXBlcyAqLworI3VuZGVmIE5PX1BST1RPVFlQRVMKKworLyogRGVmaW5lIGlmIHlvdSBkb24ndCBoYXZlIHVfaW50MzJfdCBldGMuIHR5cGVkZWYnZCAqLworI3VuZGVmIE5FRURfVFlQRURFRlMKKyNpZmRlZiBfX3N1bl9fCisjZGVmaW5lIE5FRURfVFlQRURFRlMKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gc2l6ZW9mKGNoYXIpICovCisjZGVmaW5lIFNJWkVPRl9DSEFSIDEKKworLyogRGVmaW5lIHRvIHNpemVvZihzaG9ydCkgKi8KKyNkZWZpbmUgU0laRU9GX1NIT1JUIDIKKworLyogRGVmaW5lIHRvIHNpemVvZihpbnQpICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBTaG91bGQgY29tZSBmcm9tIHFlbXUtY29tbW9uLmggLSBob3d2ZXIgdGhlcmUncyBhbG90IG9mIHN0dWZmIHRoZXJlLiAqLworI2lmbmRlZiBIT1NUX0xPTkdfQklUUworI2lmIFVJTlRQVFJfTUFYID09IFVJTlQzMl9NQVgKKyMgZGVmaW5lIEhPU1RfTE9OR19CSVRTIDMyCisjZWxpZiBVSU5UUFRSX01BWCA9PSBVSU5UNjRfTUFYCisjIGRlZmluZSBIT1NUX0xPTkdfQklUUyA2NAorI2Vsc2UKKyMgZXJyb3IgVW5rbm93biBwb2ludGVyIHNpemUKKyNlbmRpZgorI2VuZGlmCisKKy8qIERlZmluZSB0byBzaXplb2YoY2hhciAqKSAqLworI2RlZmluZSBTSVpFT0ZfQ0hBUl9QIChIT1NUX0xPTkdfQklUUyAvIDgpCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByYW5kb20oKSAqLworI3VuZGVmIEhBVkVfUkFORE9NCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzcmFuZG9tKCkgKi8KKyN1bmRlZiBIQVZFX1NSQU5ET00KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGluZXRfYXRvbiAqLworI3VuZGVmIEhBVkVfSU5FVF9BVE9OCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBIQVZFX0lORVRfQVRPTgorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzZXRlbnYgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgaW5kZXgoKSAqLworI3VuZGVmIEhBVkVfSU5ERVgKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGJjbXAoKSAqLworI3VuZGVmIEhBVkVfQkNNUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgZHJhbmQ0OCAqLworI3VuZGVmIEhBVkVfRFJBTkQ0OAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgbWVtbW92ZSAqLworI2RlZmluZSBIQVZFX01FTU1PVkUKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGdldGhvc3RpZCAqLworI3VuZGVmIEhBVkVfR0VUSE9TVElECisKKy8qIERlZmluZSBpZiB5b3UgRE9OJ1QgaGF2ZSB1bml4LWRvbWFpbiBzb2NrZXRzICovCisjdW5kZWYgTk9fVU5JWF9TT0NLRVRTCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIE5PX1VOSVhfU09DS0VUUworI2VuZGlmCisKKy8qIERlZmluZSBpZiBnZXR0aW1lb2ZkYXkgb25seSB0YWtlcyBvbmUgYXJndW1lbnQgKi8KKyN1bmRlZiBHRVRUSU1FT0ZEQVlfT05FX0FSRworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgcmV2b2tlKCkgKi8KKyN1bmRlZiBIQVZFX1JFVk9LRQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c3YgbWV0aG9kIG9mIG9wZW5pbmcgcHR5J3MgKC9kZXYvcHRteCwgZXRjLikgKi8KKyN1bmRlZiBIQVZFX0dSQU5UUFQKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGZjaG1vZCAqLworI3VuZGVmIEhBVkVfRkNITU9ECisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3R5cGUzMi5oPiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTMzJfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NvY2tldC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGE4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvc29ja2V0LmMKQEAgLTAsMCArMSw3OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2RlZmluZSBXQU5UX1NZU19JT0NUTF9ICisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKyNpbmNsdWRlICJtYWluLmgiCisjaWZkZWYgX19zdW5fXworI2luY2x1ZGUgPHN5cy9maWxpby5oPgorI2VuZGlmCisjZGVmaW5lICBTTElSUF9DT01QSUxBVElPTiAxCisjaW5jbHVkZSAiYW5kcm9pZC9wcm94eS9wcm94eV9jb21tb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3NvY2tldHMuaCIKKworc3RhdGljIHZvaWQgc29mY2FudHJjdm1vcmUoc3RydWN0IHNvY2tldCAqc28pOworc3RhdGljIHZvaWQgc29mY2FudHNlbmRtb3JlKHN0cnVjdCBzb2NrZXQgKnNvKTsKKworI2lmIDAKK3N0YXRpYyB2b2lkCitzb19pbml0KCkKK3sKKwkvKiBOb3RoaW5nIHlldCAqLworfQorI2VuZGlmCisKK3N0cnVjdCBzb2NrZXQgKgorc29sb29rdXAoc3RydWN0IHNvY2tldCAqaGVhZCwgdWludDMyX3QgbGFkZHIsIHVfaW50IGxwb3J0LAorICAgICAgICAgdWludDMyX3QgZmFkZHIsIHVfaW50IGZwb3J0KQoreworCXN0cnVjdCBzb2NrZXQgKnNvOworCisJZm9yIChzbyA9IGhlYWQtPnNvX25leHQ7IHNvICE9IGhlYWQ7IHNvID0gc28tPnNvX25leHQpIHsKKwkJaWYgKHNvLT5zb19sYWRkcl9wb3J0ID09IGxwb3J0ICYmCisJCSAgICBzby0+c29fbGFkZHJfaXAgICA9PSBsYWRkciAmJgorCQkgICAgc28tPnNvX2ZhZGRyX2lwICAgPT0gZmFkZHIgJiYKKwkJICAgIHNvLT5zb19mYWRkcl9wb3J0ID09IGZwb3J0KQorCQkgICBicmVhazsKKwl9CisKKwlpZiAoc28gPT0gaGVhZCkKKwkgICByZXR1cm4gKHN0cnVjdCBzb2NrZXQgKilOVUxMOworCXJldHVybiBzbzsKKworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IHNvY2tldCwgaW5pdGlhbGlzZSB0aGUgZmllbGRzCisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0bworICogaW5zcXVlKCkgaXQgaW50byB0aGUgY29ycmVjdCBsaW5rZWQtbGlzdAorICovCitzdHJ1Y3Qgc29ja2V0ICoKK3NvY3JlYXRlKHZvaWQpCit7CisgIHN0cnVjdCBzb2NrZXQgKnNvOworCisgIHNvID0gKHN0cnVjdCBzb2NrZXQgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrZXQpKTsKKyAgaWYoc28pIHsKKyAgICBtZW1zZXQoc28sIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2V0KSk7CisgICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsKKyAgICBzby0+cyA9IC0xOworICB9CisgIHJldHVybihzbyk7Cit9CisKKy8qCisgKiByZW1xdWUgYW5kIGZyZWUgYSBzb2NrZXQsIGNsb2JiZXIgY2FjaGUKKyAqLwordm9pZAorc29mcmVlKHN0cnVjdCBzb2NrZXQgKnNvKQoreworICBpZiAoc28tPnNvX3N0YXRlICYgU1NfUFJPWElGSUVEKQorICAgIHByb3h5X21hbmFnZXJfZGVsKHNvKTsKKworICBpZiAoc28tPnNvX2VtdT09RU1VX1JTSCAmJiBzby0+ZXh0cmEpIHsKKwlzb2ZyZWUoc28tPmV4dHJhKTsKKwlzby0+ZXh0cmE9TlVMTDsKKyAgfQorICBpZiAoc28gPT0gdGNwX2xhc3Rfc28pCisgICAgdGNwX2xhc3Rfc28gPSAmdGNiOworICBlbHNlIGlmIChzbyA9PSB1ZHBfbGFzdF9zbykKKyAgICB1ZHBfbGFzdF9zbyA9ICZ1ZGI7CisKKyAgbV9mcmVlKHNvLT5zb19tKTsKKworICBpZihzby0+c29fbmV4dCAmJiBzby0+c29fcHJldikKKyAgICByZW1xdWUoc28pOyAgLyogY3Jhc2hlcyBpZiBzbyBpcyBub3QgaW4gYSBxdWV1ZSAqLworCisgIGZyZWUoc28pOworfQorCitzaXplX3Qgc29wcmVwcmJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IGlvdmVjICppb3YsIGludCAqbnApCit7CisJaW50IG4sIGxzcywgdG90YWw7CisJc3RydWN0IHNidWYgKnNiID0gJnNvLT5zb19zbmQ7CisJaW50IGxlbiA9IHNiLT5zYl9kYXRhbGVuIC0gc2ItPnNiX2NjOworCWludCBtc3MgPSBzby0+c29fdGNwY2ItPnRfbWF4c2VnOworCisJREVCVUdfQ0FMTCgic29wcmVwcmJ1ZiIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisJbGVuID0gc2ItPnNiX2RhdGFsZW4gLSBzYi0+c2JfY2M7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybiAwOworCisJaW92WzBdLmlvdl9iYXNlID0gc2ItPnNiX3dwdHI7CisgICAgICAgIGlvdlsxXS5pb3ZfYmFzZSA9IE5VTEw7CisgICAgICAgIGlvdlsxXS5pb3ZfbGVuID0gMDsKKwlpZiAoc2ItPnNiX3dwdHIgPCBzYi0+c2JfcnB0cikgeworCQlpb3ZbMF0uaW92X2xlbiA9IHNiLT5zYl9ycHRyIC0gc2ItPnNiX3dwdHI7CisJCS8qIFNob3VsZCBuZXZlciBzdWNjZWVkLCBidXQuLi4gKi8KKwkJaWYgKGlvdlswXS5pb3ZfbGVuID4gKHNpemVfdClsZW4pCisJCSAgIGlvdlswXS5pb3ZfbGVuID0gKHNpemVfdClsZW47CisJCWlmIChpb3ZbMF0uaW92X2xlbiA+IChzaXplX3QpbXNzKQorCQkgICBpb3ZbMF0uaW92X2xlbiAtPSBpb3ZbMF0uaW92X2xlbiVtc3M7CisJCW4gPSAxOworCX0gZWxzZSB7CisJCWlvdlswXS5pb3ZfbGVuID0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pIC0gc2ItPnNiX3dwdHI7CisJCS8qIFNob3VsZCBuZXZlciBzdWNjZWVkLCBidXQuLi4gKi8KKwkJaWYgKGlvdlswXS5pb3ZfbGVuID4gKHNpemVfdClsZW4pIGlvdlswXS5pb3ZfbGVuID0gKHNpemVfdClsZW47CisJCWxlbiAtPSBpb3ZbMF0uaW92X2xlbjsKKwkJaWYgKGxlbikgeworCQkJaW92WzFdLmlvdl9iYXNlID0gc2ItPnNiX2RhdGE7CisJCQlpb3ZbMV0uaW92X2xlbiA9IHNiLT5zYl9ycHRyIC0gc2ItPnNiX2RhdGE7CisJCQlpZihpb3ZbMV0uaW92X2xlbiA+IChzaXplX3QpbGVuKQorCQkJICAgaW92WzFdLmlvdl9sZW4gPSAoc2l6ZV90KWxlbjsKKwkJCXRvdGFsID0gaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbjsKKwkJCWlmICh0b3RhbCA+IG1zcykgeworCQkJCWxzcyA9IHRvdGFsJW1zczsKKwkJCQlpZiAoaW92WzFdLmlvdl9sZW4gPiAoc2l6ZV90KWxzcykgeworCQkJCQlpb3ZbMV0uaW92X2xlbiAtPSAoc2l6ZV90KWxzczsKKwkJCQkJbiA9IDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJbHNzIC09IGlvdlsxXS5pb3ZfbGVuOworCQkJCQlpb3ZbMF0uaW92X2xlbiAtPSBsc3M7CisJCQkJCW4gPSAxOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW4gPSAyOworCQl9IGVsc2UgeworCQkJaWYgKGlvdlswXS5pb3ZfbGVuID4gKHNpemVfdCltc3MpCisJCQkgICBpb3ZbMF0uaW92X2xlbiAtPSBpb3ZbMF0uaW92X2xlbiVtc3M7CisJCQluID0gMTsKKwkJfQorCX0KKwlpZiAobnApCisJCSpucCA9IG47CisKKwlyZXR1cm4gaW92WzBdLmlvdl9sZW4gKyAobiAtIDEpICogaW92WzFdLmlvdl9sZW47Cit9CisKKy8qCisgKiBSZWFkIGZyb20gc28ncyBzb2NrZXQgaW50byBzYl9zbmQsIHVwZGF0aW5nIGFsbCByZWxldmFudCBzYnVmIGZpZWxkcworICogTk9URTogVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGl0IGlzIHNlbGVjdCgpZWQgZm9yIHJlYWRpbmcsIHNvCisgKiBhIHJlYWQoKSBvZiAwIChvciBsZXNzKSBtZWFucyBpdCdzIGRpc2Nvbm5lY3RlZAorICovCitpbnQKK3NvcmVhZChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKyAgICBpbnQgbiA9IDAsIG5uOworCXN0cnVjdCBzYnVmICpzYiA9ICZzby0+c29fc25kOworICAgIHN0cnVjdCBpb3ZlYyBpb3ZbMl0gPSB7fTsKKworCURFQlVHX0NBTEwoInNvcmVhZCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisJLyoKKwkgKiBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gdG8gcmVhZC4KKwkgKiBzb3JlYWQgd291bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZCBpZiB0aGVyZSB3ZXJlbid0CisJICovCisJc29wcmVwcmJ1ZihzbywgaW92LCAmbik7CisKKyNpZmRlZiBIQVZFX1JFQURWCisJbm4gPSByZWFkdihzby0+cywgKHN0cnVjdCBpb3ZlYyAqKWlvdiwgbik7CisJREVCVUdfTUlTQygoZGZkLCAiIC4uLiByZWFkIG5uID0gJWQgYnl0ZXNcbiIsIG5uKSk7CisjZWxzZQorCW5uID0gc29ja2V0X3JlY3Yoc28tPnMsIGlvdlswXS5pb3ZfYmFzZSwgaW92WzBdLmlvdl9sZW4pOworI2VuZGlmCisJaWYgKG5uIDw9IDApIHsKKwkJaWYgKG5uIDwgMCAmJiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKSkKKwkJCXJldHVybiAwOworCQllbHNlIHsKKwkJCURFQlVHX01JU0MoKGRmZCwgIiAtLS0gc29yZWFkKCkgZGlzY29ubmVjdGVkLCBubiA9ICVkLCBlcnJubyA9ICVkLSVzXG4iLCBubiwgZXJybm8sZXJybm9fc3RyKSk7CisJCQlzb2ZjYW50cmN2bW9yZShzbyk7CisJCQl0Y3Bfc29ja2Nsb3NlZChzb3RvdGNwY2Ioc28pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworI2lmbmRlZiBIQVZFX1JFQURWCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgbm8gZXJyb3IsIHRyeSBhbmQgcmVhZCB0aGUgc2Vjb25kIHRpbWUgcm91bmQKKwkgKiBXZSByZWFkIGFnYWluIGlmIG4gPSAyIChpZSwgdGhlcmUncyBhbm90aGVyIHBhcnQgb2YgdGhlIGJ1ZmZlcikKKwkgKiBhbmQgd2UgcmVhZCBhcyBtdWNoIGFzIHdlIGNvdWxkIGluIHRoZSBmaXJzdCByZWFkCisJICogV2UgZG9uJ3QgdGVzdCBmb3IgPD0gMCB0aGlzIHRpbWUsIGJlY2F1c2UgdGhlcmUgbGVnaXRpbWF0ZWx5CisJICogbWlnaHQgbm90IGJlIGFueSBtb3JlIGRhdGEgKHNpbmNlIHRoZSBzb2NrZXQgaXMgbm9uLWJsb2NraW5nKSwKKwkgKiBhIGNsb3NlIHdpbGwgYmUgZGV0ZWN0ZWQgb24gbmV4dCBpdGVyYXRpb24uCisJICogQSByZXR1cm4gb2YgLTEgd29udCAoc2hvdWxkbid0KSBoYXBwZW4sIHNpbmNlIGl0IGRpZG4ndCBoYXBwZW4gYWJvdmUKKwkgKi8KKwlpZiAobiA9PSAyICYmIChzaXplX3Qpbm4gPT0gaW92WzBdLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICByZXQgPSBzb2NrZXRfcmVjdihzby0+cywgaW92WzFdLmlvdl9iYXNlLCBpb3ZbMV0uaW92X2xlbik7CisgICAgICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgICAgICBubiArPSByZXQ7CisgICAgICAgIH0KKworCURFQlVHX01JU0MoKGRmZCwgIiAuLi4gcmVhZCBubiA9ICVkIGJ5dGVzXG4iLCBubikpOworI2VuZGlmCisKKwkvKiBVcGRhdGUgZmllbGRzICovCisJc2ItPnNiX2NjICs9IG5uOworCXNiLT5zYl93cHRyICs9IG5uOworCWlmIChzYi0+c2Jfd3B0ciA+PSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikpCisJCXNiLT5zYl93cHRyIC09IHNiLT5zYl9kYXRhbGVuOworCXJldHVybiBubjsKK30KKworaW50IHNvcmVhZGJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbiA9IDAsIG5uLCBjb3B5ID0gc2l6ZTsKKwlzdHJ1Y3Qgc2J1ZiAqc2IgPSAmc28tPnNvX3NuZDsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92WzJdID0ge307CisKKwlERUJVR19DQUxMKCJzb3JlYWRidWYiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcgKXNvKTsKKworCS8qCisJICogTm8gbmVlZCB0byBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCByb29tIHRvIHJlYWQuCisJICogc29yZWFkIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQgaWYgdGhlcmUgd2VyZW4ndAorCSAqLworCWlmIChzb3ByZXByYnVmKHNvLCBpb3YsICZuKSA8IChzaXplX3Qpc2l6ZSkKKyAKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBubiA9IE1JTihpb3ZbMF0uaW92X2xlbiwgKHNpemVfdCljb3B5KTsKKyAgICBtZW1jcHkoaW92WzBdLmlvdl9iYXNlLCBidWYsIG5uKTsKKworICAgIGNvcHkgLT0gbm47CisgICAgYnVmICs9IG5uOworCisgICAgaWYgKGNvcHkgPT0gMCkKKyAgICAgICAgZ290byBkb25lOworCisgICAgbWVtY3B5KGlvdlsxXS5pb3ZfYmFzZSwgYnVmLCBjb3B5KTsKKworZG9uZToKKyAgICAvKiBVcGRhdGUgZmllbGRzICovCisJc2ItPnNiX2NjICs9IHNpemU7CisJc2ItPnNiX3dwdHIgKz0gc2l6ZTsKKwlpZiAoc2ItPnNiX3dwdHIgPj0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pKQorCQlzYi0+c2Jfd3B0ciAtPSBzYi0+c2JfZGF0YWxlbjsKKyAgICByZXR1cm4gc2l6ZTsKK2VycjoKKworICAgIHNvZmNhbnRyY3Ztb3JlKHNvKTsKKyAgICB0Y3Bfc29ja2Nsb3NlZChzb3RvdGNwY2Ioc28pKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInNvcmVhZGJ1ZiBidWZmZXIgdG8gc21hbGwiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBHZXQgdXJnZW50IGRhdGEKKyAqCisgKiBXaGVuIHRoZSBzb2NrZXQgaXMgY3JlYXRlZCwgd2Ugc2V0IGl0IFNPX09PQklOTElORSwKKyAqIHNvIHdoZW4gT09CIGRhdGEgYXJyaXZlcywgd2Ugc29yZWFkKCkgaXQgYW5kIGV2ZXJ5dGhpbmcKKyAqIGluIHRoZSBzZW5kIGJ1ZmZlciBpcyBzZW50IGFzIHVyZ2VudCBkYXRhCisgKi8KK3ZvaWQKK3NvcmVjdm9vYihzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlzdHJ1Y3QgdGNwY2IgKnRwID0gc290b3RjcGNiKHNvKTsKKworCURFQlVHX0NBTEwoInNvcmVjdm9vYiIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisKKwkvKgorCSAqIFdlIHRha2UgYSBndWVzcyBhdCBob3cgbXVjaCB1cmdlbnQgZGF0YSBoYXMgYXJyaXZlZC4KKwkgKiBJbiBtb3N0IHNpdHVhdGlvbnMsIHdoZW4gdXJnZW50IGRhdGEgYXJyaXZlcywgdGhlIG5leHQKKwkgKiByZWFkKCkgc2hvdWxkIGdldCBhbGwgdGhlIHVyZ2VudCBkYXRhLiAgVGhpcyBndWVzcyB3aWxsCisJICogYmUgd3JvbmcgaG93ZXZlciBpZiBtb3JlIGRhdGEgYXJyaXZlcyBqdXN0IGFmdGVyIHRoZQorCSAqIHVyZ2VudCBkYXRhLCBvciB0aGUgcmVhZCgpIGRvZXNuJ3QgcmV0dXJuIGFsbCB0aGUKKwkgKiB1cmdlbnQgZGF0YS4KKwkgKi8KKwlzb3JlYWQoc28pOworCXRwLT5zbmRfdXAgPSB0cC0+c25kX3VuYSArIHNvLT5zb19zbmQuc2JfY2M7CisJdHAtPnRfZm9yY2UgPSAxOworCXRjcF9vdXRwdXQodHApOworCXRwLT50X2ZvcmNlID0gMDsKK30KKworLyoKKyAqIFNlbmQgdXJnZW50IGRhdGEKKyAqIFRoZXJlJ3MgYSBsb3QgZHVwbGljYXRlZCBjb2RlIGhlcmUsIGJ1dC4uLgorICovCitpbnQKK3Nvc2VuZG9vYihzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlzdHJ1Y3Qgc2J1ZiAqc2IgPSAmc28tPnNvX3JjdjsKKwljaGFyIGJ1ZmZbMjA0OF07IC8qIFhYWCBTaG91bGRuJ3QgYmUgc2VuZGluZyBtb3JlIG9vYiBkYXRhIHRoYW4gdGhpcyAqLworCisJaW50IG4sIGxlbjsKKworCURFQlVHX0NBTEwoInNvc2VuZG9vYiIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJzYi0+c2JfY2MgPSAlZCIsIHNiLT5zYl9jYyk7CisKKwlpZiAoc28tPnNvX3VyZ2MgPiAyMDQ4KQorCSAgIHNvLT5zb191cmdjID0gMjA0ODsgLyogWFhYWCAqLworCisJaWYgKHNiLT5zYl9ycHRyIDwgc2ItPnNiX3dwdHIpIHsKKwkJLyogV2UgY2FuIHNlbmQgaXQgZGlyZWN0bHkgKi8KKwkJbiA9IHNvY2tldF9zZW5kX29vYihzby0+cywgc2ItPnNiX3JwdHIsIHNvLT5zb191cmdjKTsgLyogfE1TR19ET05UV0FJVCkpOyAqLworCQlzby0+c29fdXJnYyAtPSBuOworCisJCURFQlVHX01JU0MoKGRmZCwgIiAtLS0gc2VudCAlZCBieXRlcyB1cmdlbnQgZGF0YSwgJWQgdXJnZW50IGJ5dGVzIGxlZnRcbiIsIG4sIHNvLT5zb191cmdjKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2luY2UgdGhlcmUncyBubyBzZW5kdiBvciBzZW5kdG92IGxpa2Ugd3JpdGV2LAorCQkgKiB3ZSBtdXN0IGNvcHkgYWxsIGRhdGEgdG8gYSBsaW5lYXIgYnVmZmVyIHRoZW4KKwkJICogc2VuZCBpdCBhbGwKKwkJICovCisJCWxlbiA9IChzYi0+c2JfZGF0YSArIHNiLT5zYl9kYXRhbGVuKSAtIHNiLT5zYl9ycHRyOworCQlpZiAobGVuID4gc28tPnNvX3VyZ2MpIGxlbiA9IHNvLT5zb191cmdjOworCQltZW1jcHkoYnVmZiwgc2ItPnNiX3JwdHIsIGxlbik7CisJCXNvLT5zb191cmdjIC09IGxlbjsKKwkJaWYgKHNvLT5zb191cmdjKSB7CisJCQluID0gc2ItPnNiX3dwdHIgLSBzYi0+c2JfZGF0YTsKKwkJCWlmIChuID4gc28tPnNvX3VyZ2MpIG4gPSBzby0+c29fdXJnYzsKKwkJCW1lbWNweSgoYnVmZiArIGxlbiksIHNiLT5zYl9kYXRhLCBuKTsKKwkJCXNvLT5zb191cmdjIC09IG47CisJCQlsZW4gKz0gbjsKKwkJfQorCQluID0gc29ja2V0X3NlbmRfb29iKHNvLT5zLCBidWZmLCBsZW4pOyAvKiB8TVNHX0RPTlRXQUlUKSk7ICovCisjaWZkZWYgREVCVUcKKwkJaWYgKG4gIT0gbGVuKQorCQkgICBERUJVR19FUlJPUigoZGZkLCAiRGlkbid0IHNlbmQgYWxsIGRhdGEgdXJnZW50bHkgWFhYWFhcbiIpKTsKKyNlbmRpZgorCQlERUJVR19NSVNDKChkZmQsICIgLS0tMiBzZW50ICVkIGJ5dGVzIHVyZ2VudCBkYXRhLCAlZCB1cmdlbnQgYnl0ZXMgbGVmdFxuIiwgbiwgc28tPnNvX3VyZ2MpKTsKKwl9CisKKwlzYi0+c2JfY2MgLT0gbjsKKwlzYi0+c2JfcnB0ciArPSBuOworCWlmIChzYi0+c2JfcnB0ciA+PSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikpCisJCXNiLT5zYl9ycHRyIC09IHNiLT5zYl9kYXRhbGVuOworCisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBXcml0ZSBkYXRhIGZyb20gc29fcmN2IHRvIHNvJ3Mgc29ja2V0LAorICogdXBkYXRpbmcgYWxsIHNidWYgZmllbGQgYXMgbmVjZXNzYXJ5CisgKi8KK2ludAorc293cml0ZShzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpbnQgIG4sbm47CisJc3RydWN0IHNidWYgKnNiID0gJnNvLT5zb19yY3Y7CisJaW50IGxlbiA9IHNiLT5zYl9jYzsKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdOworCisJREVCVUdfQ0FMTCgic293cml0ZSIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisKKwlpZiAoc28tPnNvX3VyZ2MpIHsKKwkJc29zZW5kb29iKHNvKTsKKwkJaWYgKHNiLT5zYl9jYyA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIHRvIHdyaXRlLAorCSAqIHNvd3JpdGUgd291bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZCBvdGhlcndpc2UKKwkgKi8KKworICAgICAgICBsZW4gPSBzYi0+c2JfY2M7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSBzYi0+c2JfcnB0cjsKKyAgICAgICAgaW92WzFdLmlvdl9iYXNlID0gTlVMTDsKKyAgICAgICAgaW92WzFdLmlvdl9sZW4gPSAwOworCWlmIChzYi0+c2JfcnB0ciA8IHNiLT5zYl93cHRyKSB7CisJCWlvdlswXS5pb3ZfbGVuID0gc2ItPnNiX3dwdHIgLSBzYi0+c2JfcnB0cjsKKwkJLyogU2hvdWxkIG5ldmVyIHN1Y2NlZWQsIGJ1dC4uLiAqLworCQlpZiAoaW92WzBdLmlvdl9sZW4gPiAoc2l6ZV90KWxlbikgaW92WzBdLmlvdl9sZW4gPSAoc2l6ZV90KWxlbjsKKwkJbiA9IDE7CisJfSBlbHNlIHsKKwkJaW92WzBdLmlvdl9sZW4gPSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikgLSBzYi0+c2JfcnB0cjsKKwkJaWYgKGlvdlswXS5pb3ZfbGVuID4gKHNpemVfdClsZW4pIGlvdlswXS5pb3ZfbGVuID0gKHNpemVfdClsZW47CisJCWxlbiAtPSBpb3ZbMF0uaW92X2xlbjsKKwkJaWYgKGxlbikgeworCQkJaW92WzFdLmlvdl9iYXNlID0gc2ItPnNiX2RhdGE7CisJCQlpb3ZbMV0uaW92X2xlbiA9IHNiLT5zYl93cHRyIC0gc2ItPnNiX2RhdGE7CisJCQlpZiAoaW92WzFdLmlvdl9sZW4gPiAoc2l6ZV90KWxlbikgaW92WzFdLmlvdl9sZW4gPSAoc2l6ZV90KWxlbjsKKwkJCW4gPSAyOworCQl9IGVsc2UKKwkJCW4gPSAxOworCX0KKwkvKiBDaGVjayBpZiB0aGVyZSdzIHVyZ2VudCBkYXRhIHRvIHNlbmQsIGFuZCBpZiBzbywgc2VuZCBpdCAqLworCisjaWZkZWYgSEFWRV9SRUFEVgorCW5uID0gd3JpdGV2KHNvLT5zLCAoY29uc3Qgc3RydWN0IGlvdmVjICopaW92LCBuKTsKKworCURFQlVHX01JU0MoKGRmZCwgIiAgLi4uIHdyb3RlIG5uID0gJWQgYnl0ZXNcbiIsIG5uKSk7CisjZWxzZQorCW5uID0gc29ja2V0X3NlbmQoc28tPnMsIGlvdlswXS5pb3ZfYmFzZSwgaW92WzBdLmlvdl9sZW4pOworI2VuZGlmCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgcGVvcGxlIHRlbGwgbWUgaXQgZG9lcyAqc2hydWcqICovCisJaWYgKG5uIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobm4gPD0gMCkgeworCQlERUJVR19NSVNDKChkZmQsICIgLS0tIHNvd3JpdGUgZGlzY29ubmVjdGVkLCBzby0+c29fc3RhdGUgPSAleCwgZXJybm8gPSAlZFxuIiwKKwkJCXNvLT5zb19zdGF0ZSwgZXJybm8pKTsKKwkJc29mY2FudHNlbmRtb3JlKHNvKTsKKwkJdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgSEFWRV9SRUFEVgorCWlmIChuID09IDIgJiYgKHNpemVfdClubiA9PSBpb3ZbMF0uaW92X2xlbikgeworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIHJldCA9IHNvY2tldF9zZW5kKHNvLT5zLCBpb3ZbMV0uaW92X2Jhc2UsIGlvdlsxXS5pb3ZfbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXQgPiAwKQorICAgICAgICAgICAgICAgIG5uICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBERUJVR19NSVNDKChkZmQsICIgIC4uLiB3cm90ZSBubiA9ICVkIGJ5dGVzXG4iLCBubikpOworI2VuZGlmCisKKwkvKiBVcGRhdGUgc2J1ZiAqLworCXNiLT5zYl9jYyAtPSBubjsKKwlzYi0+c2JfcnB0ciArPSBubjsKKwlpZiAoc2ItPnNiX3JwdHIgPj0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pKQorCQlzYi0+c2JfcnB0ciAtPSBzYi0+c2JfZGF0YWxlbjsKKworCS8qCisJICogSWYgaW4gRFJBSU4gbW9kZSwgYW5kIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhLCBzZXQKKwkgKiBpdCBDQU5UU0VORE1PUkUKKwkgKi8KKwlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0ZXRFJBSU4pICYmIHNiLT5zYl9jYyA9PSAwKQorCQlzb2ZjYW50c2VuZG1vcmUoc28pOworCisJcmV0dXJuIG5uOworfQorCisvKgorICogcmVjdmZyb20oKSBhIFVEUCBzb2NrZXQKKyAqLwordm9pZAorc29yZWN2ZnJvbShzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKyAgICAgICAgU29ja0FkZHJlc3MgIGFkZHI7CisKKwlERUJVR19DQUxMKCJzb3JlY3Zmcm9tIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKworCWlmIChzby0+c29fdHlwZSA9PSBJUFBST1RPX0lDTVApIHsgICAvKiBUaGlzIGlzIGEgInBpbmciIHJlcGx5ICovCisJICBjaGFyIGJ1ZmZbMjU2XTsKKwkgIGludCBsZW47CisKKwkgIGxlbiA9IHNvY2tldF9yZWN2ZnJvbShzby0+cywgYnVmZiwgMjU2LCAmYWRkcik7CisJICAvKiBYWFggQ2hlY2sgaWYgcmVwbHkgaXMgImNvcnJlY3QiPyAqLworCisJICBpZihsZW4gPT0gLTEgfHwgbGVuID09IDApIHsKKwkgICAgdV9jaGFyIGNvZGU9SUNNUF9VTlJFQUNIX1BPUlQ7CisKKwkgICAgaWYoZXJybm8gPT0gRUhPU1RVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9IT1NUOworCSAgICBlbHNlIGlmKGVycm5vID09IEVORVRVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9ORVQ7CisKKwkgICAgREVCVUdfTUlTQygoZGZkLCIgdWRwIGljbXAgcnggZXJybm8gPSAlZC0lc1xuIiwKKwkJCWVycm5vLGVycm5vX3N0cikpOworCSAgICBpY21wX2Vycm9yKHNvLT5zb19tLCBJQ01QX1VOUkVBQ0gsY29kZSwgMCxlcnJub19zdHIpOworCSAgfSBlbHNlIHsKKwkgICAgaWNtcF9yZWZsZWN0KHNvLT5zb19tKTsKKwkgICAgc28tPnNvX20gPSAwOyAvKiBEb24ndCBtYnVmX2ZyZWUoKSBpdCBhZ2FpbiEgKi8KKwkgIH0KKwkgIC8qIE5vIG5lZWQgZm9yIHRoaXMgc29ja2V0IGFueW1vcmUsIHVkcF9kZXRhY2ggaXQgKi8KKwkgIHVkcF9kZXRhY2goc28pOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBBICJub3JtYWwiIFVEUCBwYWNrZXQgKi8KKwkgIHN0cnVjdCBtYnVmICptOworICAgICAgICAgIGludCBsZW47CisJCSAgaW50IG47CisKKwkgIGlmICghKG0gPSBtX2dldCgpKSkgcmV0dXJuOworCSAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisKKwkgIC8qCisJICAgKiBYWFggU2hvdWxkbid0IEZJT05SRUFEIHBhY2tldHMgZGVzdGluZWQgZm9yIHBvcnQgNTMsCisJICAgKiBidXQgSSBkb24ndCBrbm93IHRoZSBtYXggcGFja2V0IHNpemUgZm9yIEROUyBsb29rdXBzCisJICAgKi8KKwkgIGxlbiA9IE1fRlJFRVJPT00obSk7CisJICAvKiBpZiAoc28tPnNvX2Zwb3J0ICE9IGh0b25zKDUzKSkgeyAqLworCSAgbiA9IHNvY2tldF9jYW5fcmVhZChzby0+cyk7CisKKwkgIGlmIChuID4gbGVuKSB7CisJICAgIG4gPSAobS0+bV9kYXRhIC0gbS0+bV9kYXQpICsgbS0+bV9sZW4gKyBuICsgMTsKKwkgICAgbV9pbmMobSwgbik7CisJICAgIGxlbiA9IE1fRlJFRVJPT00obSk7CisJICB9CisJICAvKiB9ICovCisKKwkgIG0tPm1fbGVuID0gc29ja2V0X3JlY3Zmcm9tKHNvLT5zLCBtLT5tX2RhdGEsIGxlbiwgJmFkZHIpOworCSAgREVCVUdfTUlTQygoZGZkLCAiIGRpZCByZWN2ZnJvbSAlZCwgZXJybm8gPSAlZC0lc1xuIiwKKwkJICAgICAgbS0+bV9sZW4sIGVycm5vLGVycm5vX3N0cikpOworCSAgaWYobS0+bV9sZW48MCkgeworCSAgICB1X2NoYXIgY29kZT1JQ01QX1VOUkVBQ0hfUE9SVDsKKworCSAgICBpZihlcnJubyA9PSBFSE9TVFVOUkVBQ0gpIGNvZGU9SUNNUF9VTlJFQUNIX0hPU1Q7CisJICAgIGVsc2UgaWYoZXJybm8gPT0gRU5FVFVOUkVBQ0gpIGNvZGU9SUNNUF9VTlJFQUNIX05FVDsKKworCSAgICBERUJVR19NSVNDKChkZmQsIiByeCBlcnJvciwgdHggaWNtcCBJQ01QX1VOUkVBQ0g6JWlcbiIsIGNvZGUpKTsKKwkgICAgaWNtcF9lcnJvcihzby0+c29fbSwgSUNNUF9VTlJFQUNILGNvZGUsIDAsZXJybm9fc3RyKTsKKwkgICAgbV9mcmVlKG0pOworCSAgfSBlbHNlIHsKKwkgIC8qCisJICAgKiBIYWNrOiBkb21haW4gbmFtZSBsb29rdXAgd2lsbCBiZSB1c2VkIHRoZSBtb3N0IGZvciBVRFAsCisJICAgKiBhbmQgc2luY2UgdGhleSdsbCBvbmx5IGJlIHVzZWQgb25jZSB0aGVyZSdzIG5vIG5lZWQKKwkgICAqIGZvciB0aGUgNCBtaW51dGUgKG9yIHdoYXRldmVyKSB0aW1lb3V0Li4uIFNvIHdlIHRpbWUgdGhlbQorCSAgICogb3V0IG11Y2ggcXVpY2tlciAoMTAgc2Vjb25kcyAgZm9yIG5vdy4uLikKKwkgICAqLworCSAgICBpZiAoc28tPnNvX2V4cGlyZSkgeworCSAgICAgIGlmIChzby0+c29fZmFkZHJfcG9ydCA9PSA1MykKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkVGQVNUOworCSAgICAgIGVsc2UKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisJICAgIH0KKworCSAgICAvKgkJaWYgKG0tPm1fbGVuID09IGxlbikgeworCSAgICAgKgkJCW1faW5jKG0sIE1JTkNTSVpFKTsKKwkgICAgICoJCQltLT5tX2xlbiA9IDA7CisJICAgICAqCQl9CisJICAgICAqLworCisJICAgIC8qCisJICAgICAqIElmIHRoaXMgcGFja2V0IHdhcyBkZXN0aW5lZCBmb3IgQ1RMX0FERFIsCisJICAgICAqIG1ha2UgaXQgbG9vayBsaWtlIHRoYXQncyB3aGVyZSBpdCBjYW1lIGZyb20sIGRvbmUgYnkgdWRwX291dHB1dAorCSAgICAgKi8KKwkgICAgdWRwX291dHB1dF8oc28sIG0sICZhZGRyKTsKKwkgIH0gLyogcnggZXJyb3IgKi8KKwl9IC8qIGlmIHBpbmcgcGFja2V0ICovCit9CisKKy8qCisgKiBzZW5kdG8oKSBhIHNvY2tldAorICovCitpbnQKK3Nvc2VuZHRvKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSkKK3sKKwlpbnQgcmV0OworICAgIFNvY2tBZGRyZXNzICAgYWRkcjsKKyAgICB1aW50MzJfdCAgICAgIGFkZHJfaXA7CisgICAgdWludDE2X3QgICAgICBhZGRyX3BvcnQ7CisKKwlERUJVR19DQUxMKCJzb3NlbmR0byIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisKKwlpZiAoKHNvLT5zb19mYWRkcl9pcCAmIDB4ZmZmZmZmMDApID09IHNwZWNpYWxfYWRkcl9pcCkgeworICAgICAgICAvKiBJdCdzIGFuIGFsaWFzICovCisgICAgICAJaW50ICBsb3cgPSBzby0+c29fZmFkZHJfaXAgJiAweGZmOworCisgICAgICAgIGlmICggQ1RMX0lTX0ROUyhsb3cpICkKKyAgICAgICAgICAgIGFkZHJfaXAgPSBkbnNfYWRkcltsb3cgLSBDVExfRE5TXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkcl9pcCA9IGxvb3BiYWNrX2FkZHJfaXA7CisJfSBlbHNlCisJICAgIGFkZHJfaXAgPSBzby0+c29fZmFkZHJfaXA7CisKKwlhZGRyX3BvcnQgPSBzby0+c29fZmFkZHJfcG9ydDsKKworCS8qCisJICogdGVzdCBmb3IgZ2VuZXJpYyBmb3J3YXJkaW5nOyB0aGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBhcmd1bWVudHMKKwkgKiBvbmx5IG9uIHN1Y2Nlc3MKKwkgKi8KKwl1bnNpZ25lZCBsb25nIGZhZGRyID0gYWRkcl9pcDsKKyAgICAgICAgaW50IGZwb3J0ID0gYWRkcl9wb3J0OworCisJaWYgKHNsaXJwX3Nob3VsZF9uZXRfZm9yd2FyZChmYWRkciwgZnBvcnQsICZmYWRkciwgJmZwb3J0KSkgeworICAgICAgdGltZV90IHRpbWVzdGFtcCA9IHRpbWUoTlVMTCk7CisgICAgICBzbGlycF9kcm9wX2xvZygKKwkgICAgICAgIlJlZGlyZWN0ZWQgVURQOiBzcmM6IDB4JTA4bHg6MHglMDR4IG9yZyBkc3Q6IDB4JTA4bHg6MHglMDR4ICIKKwkgICAgICAgIm5ldyBkc3Q6IDB4JTA4bHg6MHglMDR4ICVsZFxuIiwKKwkgICAgICAgIHNvLT5zb19sYWRkcl9pcCwgc28tPnNvX2xhZGRyX3BvcnQsCisJICAgICAgICBhZGRyX2lwLCBhZGRyX3BvcnQsCisJICAgICAgICBmYWRkciwgZnBvcnQsIHRpbWVzdGFtcAorCSAgICApOworCX0KKwlhZGRyX2lwID0gZmFkZHI7CisJYWRkcl9wb3J0ID0gZnBvcnQ7CisKKworICAgICAgICBzb2NrX2FkZHJlc3NfaW5pdF9pbmV0KCZhZGRyLCBhZGRyX2lwLCBhZGRyX3BvcnQpOworCisJREVCVUdfTUlTQygoZGZkLCAiIHNlbmR0bygpaW5nLCBhZGRyLnNpbl9wb3J0PSVkLCBhZGRyLnNpbl9hZGRyLnNfYWRkcj0lMDh4XG4iLCBhZGRyX3BvcnQsIGFkZHJfaXApKTsKKworCS8qIERvbid0IGNhcmUgd2hhdCBwb3J0IHdlIGdldCAqLworCXJldCA9IHNvY2tldF9zZW5kdG8oc28tPnMsIG0tPm1fZGF0YSwgbS0+bV9sZW4sJmFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEtpbGwgdGhlIHNvY2tldCBpZiB0aGVyZSdzIG5vIHJlcGx5IGluIDQgbWludXRlcywKKwkgKiBidXQgb25seSBpZiBpdCdzIGFuIGV4cGlyYWJsZSBzb2NrZXQKKwkgKi8KKwlpZiAoc28tPnNvX2V4cGlyZSkKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisJc28tPnNvX3N0YXRlID0gU1NfSVNGQ09OTkVDVEVEOyAvKiBTbyB0aGF0IGl0IGdldHMgc2VsZWN0KCllZCAqLworCXJldHVybiAwOworfQorCisvKgorICogWFhYIFRoaXMgc2hvdWxkIHJlYWxseSBiZSB0Y3BfbGlzdGVuCisgKi8KK3N0cnVjdCBzb2NrZXQgKgorc29saXN0ZW4odV9pbnQgcG9ydCwgdV9pbnQzMl90IGxhZGRyLCB1X2ludCBscG9ydCwgaW50IGZsYWdzKQoreworCVNvY2tBZGRyZXNzICBhZGRyOworCXN0cnVjdCBzb2NrZXQgKnNvOworCWludCBzOworCisJREVCVUdfQ0FMTCgic29saXN0ZW4iKTsKKwlERUJVR19BUkcoInBvcnQgPSAlZCIsIHBvcnQpOworCURFQlVHX0FSRygibGFkZHIgPSAleCIsIGxhZGRyKTsKKwlERUJVR19BUkcoImxwb3J0ID0gJWQiLCBscG9ydCk7CisJREVCVUdfQVJHKCJmbGFncyA9ICV4IiwgZmxhZ3MpOworCisJaWYgKChzbyA9IHNvY3JlYXRlKCkpID09IE5VTEwpIHsKKwkgIC8qIGZyZWUoc28pOyAgICAgIE5vdCBzb2ZyZWUoKSA/Pz8gZnJlZShOVUxMKSA9PSBOT1AgKi8KKwkgIHJldHVybiBOVUxMOworCX0KKworCS8qIERvbid0IHRjcF9hdHRhY2guLi4gd2UgZG9uJ3QgbmVlZCBzb19zbmQgbm9yIHNvX3JjdiAqLworCWlmICgoc28tPnNvX3RjcGNiID0gdGNwX25ld3RjcGNiKHNvKSkgPT0gTlVMTCkgeworCQlmcmVlKHNvKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWluc3F1ZShzbywmdGNiKTsKKworCS8qCisJICogU1NfRkFDQ0VQVE9OQ0Ugc29ja2V0cyBtdXN0IHRpbWUgb3V0LgorCSAqLworCWlmIChmbGFncyAmIFNTX0ZBQ0NFUFRPTkNFKQorCSAgIHNvLT5zb190Y3BjYi0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUKjI7CisKKwlzby0+c29fc3RhdGUgICAgICA9IChTU19GQUNDRVBUQ09OTnxmbGFncyk7CisJc28tPnNvX2xhZGRyX3BvcnQgPSBscG9ydDsgLyogS2VwdCBpbiBob3N0IGZvcm1hdCAqLworICAgIHNvLT5zb19sYWRkcl9pcCAgID0gbGFkZHI7IC8qIERpdHRvICovCisgICAgc28tPnNvX2hhZGRyX3BvcnQgPSBwb3J0OworCisgICAgaWYgKGZsYWdzICYgU1NfSVBWNikKKyAgICAgICAgcyA9IHNvY2tldF9sb29wYmFjazZfc2VydmVyKHBvcnQsIFNPQ0tFVF9TVFJFQU0pOworICAgIGVsc2UKKyAgICAgICAgcyA9IHNvY2tldF9sb29wYmFjazRfc2VydmVyKHBvcnQsIFNPQ0tFVF9TVFJFQU0pOworICAgIGlmIChzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzb2NrZXRfZ2V0X2FkZHJlc3MocywgJmFkZHIpOworICAgIHNvLT5zb19mYWRkcl9wb3J0ID0gc29ja19hZGRyZXNzX2dldF9wb3J0KCZhZGRyKTsKKyAgICBzby0+c29fZmFkZHJfaXAgPSBhbGlhc19hZGRyX2lwOworICAgIHNvLT5zID0gczsKKyAgICByZXR1cm4gc287Cit9CisKKworaW50Citzb3VubGlzdGVuKHVfaW50ICBwb3J0KQoreworICAgIHN0cnVjdCBzb2NrZXQgKnNvOworCisgICAgZm9yIChzbyA9IHRjYi5zb19uZXh0OyBzbyAhPSAmdGNiOyBzbyA9IHNvLT5zb19uZXh0KSB7CisgICAgICAgIGlmIChzby0+c29faGFkZHJfcG9ydCA9PSBwb3J0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzbyA9PSAmdGNiKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzb2ZjYW50cmN2bW9yZSggc28gKTsKKyAgICBzb2ZjYW50c2VuZG1vcmUoIHNvICk7CisgICAgY2xvc2UoIHNvLT5zICk7CisgICAgc28tPnMgPSAtMTsKKyAgICBzb2ZyZWUoIHNvICk7CisgICAgcmV0dXJuIDA7Cit9CisKKworI2lmIDAKKy8qCisgKiBEYXRhIGlzIGF2YWlsYWJsZSBpbiBzb19yY3YKKyAqIEp1c3Qgd3JpdGUoKSB0aGUgZGF0YSB0byB0aGUgc29ja2V0CisgKiBYWFggbm90IHlldC4uLgorICovCitzdGF0aWMgdm9pZAorc29yd2FrZXVwKHNvKQorCXN0cnVjdCBzb2NrZXQgKnNvOworeworLyoJc293cml0ZShzbyk7ICovCisvKglGRF9DTFIoc28tPnMsJndyaXRlZmRzKTsgKi8KK30KKworLyoKKyAqIERhdGEgaGFzIGJlZW4gZnJlZWQgaW4gc29fc25kCisgKiBXZSBoYXZlIHJvb20gZm9yIGEgcmVhZCgpIGlmIHdlIHdhbnQgdG8KKyAqIEZvciBub3csIGRvbid0IHJlYWQsIGl0J2xsIGJlIGRvbmUgaW4gdGhlIG1haW4gbG9vcAorICovCitzdGF0aWMgdm9pZAorc293d2FrZXVwKHNvKQorCXN0cnVjdCBzb2NrZXQgKnNvOworeworCS8qIE5vdGhpbmcsIHlldCAqLworfQorI2VuZGlmCisKKy8qCisgKiBWYXJpb3VzIHNlc3Npb24gc3RhdGUgY2FsbHMKKyAqIFhYWCBTaG91bGQgYmUgI2RlZmluZSdzCisgKiBUaGUgc29ja2V0IHN0YXRlIHN0dWZmIG5lZWRzIHdvcmssIHRoZXNlIG9mdGVuIGdldCBjYWxsIDIgb3IgMworICogdGltZXMgZWFjaCB3aGVuIG9ubHkgMSB3YXMgbmVlZGVkCisgKi8KK3ZvaWQKK3NvaXNmY29ubmVjdGluZyhzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlzby0+c29fc3RhdGUgJj0gfihTU19OT0ZEUkVGfFNTX0lTRkNPTk5FQ1RFRHxTU19GQ0FOVFJDVk1PUkV8CisJCQkgIFNTX0ZDQU5UU0VORE1PUkV8U1NfRldEUkFJTik7CisJc28tPnNvX3N0YXRlIHw9IFNTX0lTRkNPTk5FQ1RJTkc7IC8qIENsb2JiZXIgb3RoZXIgc3RhdGVzICovCit9CisKK3ZvaWQKK3NvaXNmY29ubmVjdGVkKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXNvLT5zb19zdGF0ZSAmPSB+KFNTX0lTRkNPTk5FQ1RJTkd8U1NfRldEUkFJTnxTU19OT0ZEUkVGKTsKKwlzby0+c29fc3RhdGUgfD0gU1NfSVNGQ09OTkVDVEVEOyAvKiBDbG9iYmVyIG90aGVyIHN0YXRlcyAqLworfQorCitzdGF0aWMgdm9pZAorc29mY2FudHJjdm1vcmUoc3RydWN0IHNvY2tldCAqc28pCit7CisJaWYgKChzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGKSA9PSAwKSB7CisJCXNodXRkb3duKHNvLT5zLDApOworCQlpZihnbG9iYWxfd3JpdGVmZHMpIHsKKwkJICBGRF9DTFIoc28tPnMsZ2xvYmFsX3dyaXRlZmRzKTsKKwkJfQorCX0KKwlzby0+c29fc3RhdGUgJj0gfihTU19JU0ZDT05ORUNUSU5HKTsKKwlpZiAoc28tPnNvX3N0YXRlICYgU1NfRkNBTlRTRU5ETU9SRSkKKwkgICBzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOyAvKiBEb24ndCBzZWxlY3QgaXQgKi8gLyogWFhYIGNsb3NlKCkgaGVyZSBhcyB3ZWxsPyAqLworCWVsc2UKKwkgICBzby0+c29fc3RhdGUgfD0gU1NfRkNBTlRSQ1ZNT1JFOworfQorCitzdGF0aWMgdm9pZAorc29mY2FudHNlbmRtb3JlKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWlmICgoc28tPnNvX3N0YXRlICYgU1NfTk9GRFJFRikgPT0gMCkgeworICAgICAgICAgICAgc2h1dGRvd24oc28tPnMsMSk7ICAgICAgICAgICAvKiBzZW5kIEZJTiB0byBmaG9zdCAqLworICAgICAgICAgICAgaWYgKGdsb2JhbF9yZWFkZmRzKSB7CisgICAgICAgICAgICAgICAgRkRfQ0xSKHNvLT5zLGdsb2JhbF9yZWFkZmRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnbG9iYWxfeGZkcykgeworICAgICAgICAgICAgICAgIEZEX0NMUihzby0+cyxnbG9iYWxfeGZkcyk7CisgICAgICAgICAgICB9CisJfQorCXNvLT5zb19zdGF0ZSAmPSB+KFNTX0lTRkNPTk5FQ1RJTkcpOworCWlmIChzby0+c29fc3RhdGUgJiBTU19GQ0FOVFJDVk1PUkUpCisJICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsgLyogYXMgYWJvdmUgKi8KKwllbHNlCisJICAgc28tPnNvX3N0YXRlIHw9IFNTX0ZDQU5UU0VORE1PUkU7Cit9CisKK3ZvaWQKK3NvaXNmZGlzY29ubmVjdGVkKHN0cnVjdCBzb2NrZXQgKnNvKQoreworLyoJc28tPnNvX3N0YXRlICY9IH4oU1NfSVNGQ09OTkVDVElOR3xTU19JU0ZDT05ORUNURUQpOyAqLworLyoJY2xvc2Uoc28tPnMpOyAqLworLyoJc28tPnNvX3N0YXRlID0gU1NfSVNGRElTQ09OTkVDVEVEOyAqLworCS8qCisJICogWFhYIERvIG5vdGhpbmcgLi4uID8KKwkgKi8KK30KKworLyoKKyAqIFNldCB3cml0ZSBkcmFpbiBtb2RlCisgKiBTZXQgQ0FOVFNFTkRNT1JFIG9uY2UgYWxsIGRhdGEgaGFzIGJlZW4gd3JpdGUoKW4KKyAqLwordm9pZAorc29md2RyYWluKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWlmIChzby0+c29fcmN2LnNiX2NjKQorCQlzby0+c29fc3RhdGUgfD0gU1NfRldEUkFJTjsKKwllbHNlCisJCXNvZmNhbnRzZW5kbW9yZShzbyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvc29ja2V0LmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwZjkzMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC9zb2NrZXQuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisvKiBNSU5FICovCisKKyNpZm5kZWYgX1NMSVJQX1NPQ0tFVF9IXworI2RlZmluZSBfU0xJUlBfU09DS0VUX0hfCisKKyNkZWZpbmUgU09fRVhQSVJFIDI0MDAwMAorI2RlZmluZSBTT19FWFBJUkVGQVNUIDEwMDAwCisKKy8qCisgKiBPdXIgc29ja2V0IHN0cnVjdHVyZQorICovCisKK3N0cnVjdCBzb2NrZXQgeworICBzdHJ1Y3Qgc29ja2V0ICpzb19uZXh0LCpzb19wcmV2OyAgICAgIC8qIEZvciBhIGxpbmtlZCBsaXN0IG9mIHNvY2tldHMgKi8KKworICBpbnQgczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYWN0dWFsIHNvY2tldCAqLworCisJCQkvKiBYWFggdW5pb24gdGhlc2Ugd2l0aCBub3QteWV0LXVzZWQgc2J1ZiBwYXJhbXMgKi8KKyAgc3RydWN0IG1idWYgKnNvX207CSAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgU1lOIHBhY2tldCwKKwkJCQkgICAgKiBmb3Igbm9uLWJsb2NraW5nIGNvbm5lY3QoKSdzLCBhbmQKKwkJCQkgICAgKiBQSU5HIHJlcGx5J3MgKi8KKyAgc3RydWN0IHRjcGlwaGRyICpzb190aTsJICAgLyogUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgdGkgd2l0aGluCisJCQkJICAgICogc29fbWNvbm4sIGZvciBub24tYmxvY2tpbmcgY29ubmVjdGlvbnMgKi8KKyAgaW50IHNvX3VyZ2M7CisgIHVpbnQzMl90ICAgc29fZmFkZHJfaXA7CisgIHVpbnQzMl90ICAgc29fbGFkZHJfaXA7CisgIHVpbnQxNl90ICAgc29fZmFkZHJfcG9ydDsKKyAgdWludDE2X3QgICBzb19sYWRkcl9wb3J0OworICB1aW50MTZfdCAgIHNvX2hhZGRyX3BvcnQ7CisKKyAgdV9pbnQ4X3QJc29faXB0b3M7CS8qIFR5cGUgb2Ygc2VydmljZSAqLworICB1X2ludDhfdAlzb19lbXU7CQkvKiBJcyB0aGUgc29ja2V0IGVtdWxhdGVkPyAqLworCisgIHVfY2hhcglzb190eXBlOwkJLyogVHlwZSBvZiBzb2NrZXQsIFVEUCBvciBUQ1AgKi8KKyAgaW50CXNvX3N0YXRlOwkJLyogaW50ZXJuYWwgc3RhdGUgZmxhZ3MgU1NfKiwgYmVsb3cgKi8KKworICBzdHJ1Y3QgCXRjcGNiICpzb190Y3BjYjsJLyogcG9pbnRlciB0byBUQ1AgcHJvdG9jb2wgY29udHJvbCBibG9jayAqLworICB1X2ludAlzb19leHBpcmU7CQkvKiBXaGVuIHRoZSBzb2NrZXQgd2lsbCBleHBpcmUgKi8KKworICBpbnQJc29fcXVldWVkOwkJLyogTnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIGZyb20gdGhpcyBzb2NrZXQgKi8KKyAgaW50CXNvX25xdWV1ZWQ7CQkvKiBOdW1iZXIgb2YgcGFja2V0cyBxdWV1ZWQgaW4gYSByb3cKKwkJCQkgKiBVc2VkIHRvIGRldGVybWluZSB3aGVuIHRvICJkb3duZ3JhZGUiIGEgc2Vzc2lvbgorCQkJCQkgKiBmcm9tIGZhc3RxIHRvIGJhdGNocSAqLworCisgIHN0cnVjdCBzYnVmIHNvX3JjdjsJCS8qIFJlY2VpdmUgYnVmZmVyICovCisgIHN0cnVjdCBzYnVmIHNvX3NuZDsJCS8qIFNlbmQgYnVmZmVyICovCisgIHZvaWQgKiBleHRyYTsJCQkvKiBFeHRyYSBwb2ludGVyICovCit9OworCisKKy8qCisgKiBTb2NrZXQgc3RhdGUgYml0cy4gKHBlZXIgbWVhbnMgdGhlIGhvc3Qgb24gdGhlIEludGVybmV0LAorICogbG9jYWwgaG9zdCBtZWFucyB0aGUgaG9zdCBvbiB0aGUgb3RoZXIgZW5kIG9mIHRoZSBtb2RlbSkKKyAqLworI2RlZmluZSBTU19OT0ZEUkVGCQkweDAwMQkvKiBObyBmZCByZWZlcmVuY2UgKi8KKworI2RlZmluZSBTU19JU0ZDT05ORUNUSU5HCTB4MDAyCS8qIFNvY2tldCBpcyBjb25uZWN0aW5nIHRvIHBlZXIgKG5vbi1ibG9ja2luZyBjb25uZWN0KCkncykgKi8KKyNkZWZpbmUgU1NfSVNGQ09OTkVDVEVECQkweDAwNAkvKiBTb2NrZXQgaXMgY29ubmVjdGVkIHRvIHBlZXIgKi8KKyNkZWZpbmUgU1NfRkNBTlRSQ1ZNT1JFCQkweDAwOAkvKiBTb2NrZXQgY2FuJ3QgcmVjZWl2ZSBtb3JlIGZyb20gcGVlciAoZm9yIGhhbGYtY2xvc2VzKSAqLworI2RlZmluZSBTU19GQ0FOVFNFTkRNT1JFCTB4MDEwCS8qIFNvY2tldCBjYW4ndCBzZW5kIG1vcmUgdG8gcGVlciAoZm9yIGhhbGYtY2xvc2VzKSAqLworLyogI2RlZmluZSBTU19JU0ZESVNDT05ORUNURUQJMHgwMjAqLwkvKiBTb2NrZXQgaGFzIGRpc2Nvbm5lY3RlZCBmcm9tIHBlZXIsIGluIDJNU0wgc3RhdGUgKi8KKyNkZWZpbmUgU1NfRldEUkFJTgkJMHgwNDAJLyogV2UgcmVjZWl2ZWQgYSBGSU4sIGRyYWluIGRhdGEgYW5kIHNldCBTU19GQ0FOVFNFTkRNT1JFICovCisKKyNkZWZpbmUgU1NfQ1RMCQkJMHgwODAKKyNkZWZpbmUgU1NfRkFDQ0VQVENPTk4JCTB4MTAwCS8qIFNvY2tldCBpcyBhY2NlcHRpbmcgY29ubmVjdGlvbnMgZnJvbSBhIGhvc3Qgb24gdGhlIGludGVybmV0ICovCisjZGVmaW5lIFNTX0ZBQ0NFUFRPTkNFCQkweDIwMAkvKiBJZiBzZXQsIHRoZSBTU19GQUNDRVBUQ09OTiBzb2NrZXQgd2lsbCBkaWUgYWZ0ZXIgb25lIGFjY2VwdCAqLworI2RlZmluZSBTU19QUk9YSUZJRUQgICAgICAgICAgICAweDQwMCAgIC8qIFNvY2tldCBpcyB0cnlpbmcgdG8gY29ubmVjdCB0aHJvdWdoIGEgcHJveHksIG9ubHkgbWFrZXMgc2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIFNTX0lTRkNPTk5FQ1RJTkcgaXMgYWxzbyBzZXQgKi8KKworI2RlZmluZSBTU19JUFY2ICAgICAgICAgICAgICAgICAweDgwMCAgIC8qIExpc3RlbiBvbiBJUFY2IGFkZHJlc3MgKi8KKworZXh0ZXJuIHN0cnVjdCBzb2NrZXQgdGNiOworCit2b2lkIHNvX2luaXQgX1AoKHZvaWQpKTsKK3N0cnVjdCBzb2NrZXQgKiBzb2xvb2t1cCBfUCgoc3RydWN0IHNvY2tldCAqLCB1aW50MzJfdCwgdV9pbnQsIHVpbnQzMl90LCB1X2ludCkpOworc3RydWN0IHNvY2tldCAqIHNvY3JlYXRlIF9QKCh2b2lkKSk7Cit2b2lkIHNvZnJlZSBfUCgoc3RydWN0IHNvY2tldCAqKSk7CitpbnQgc29yZWFkIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3ZvaWQgc29yZWN2b29iIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK2ludCBzb3NlbmRvb2IgX1AoKHN0cnVjdCBzb2NrZXQgKikpOworaW50IHNvd3JpdGUgX1AoKHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCBzb3JlY3Zmcm9tIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK2ludCBzb3NlbmR0byBfUCgoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbWJ1ZiAqKSk7CitzdHJ1Y3Qgc29ja2V0ICogc29saXN0ZW4gX1AoKHVfaW50LCB1X2ludDMyX3QsIHVfaW50LCBpbnQpKTsKK2ludCAgc291bmxpc3RlbiBfUCgodV9pbnQgcG9ydCkpOwordm9pZCBzb2lzZmNvbm5lY3RpbmcgX1AoKHJlZ2lzdGVyIHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCBzb2lzZmNvbm5lY3RlZCBfUCgocmVnaXN0ZXIgc3RydWN0IHNvY2tldCAqKSk7Cit2b2lkIHNvaXNmZGlzY29ubmVjdGVkIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3ZvaWQgc29md2RyYWluIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3N0cnVjdCBpb3ZlYzsgLyogRm9yIHdpbjMyICovCitzaXplX3Qgc29wcmVwcmJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IGlvdmVjICppb3YsIGludCAqbnApOworaW50IHNvcmVhZGJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBfU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NDhmNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3AuaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICogdGNwLmgsdiAxLjMgMTk5NC8wOC8yMSAwNToyNzozNCBwYXVsIEV4cAorICovCisKKyNpZm5kZWYgX1RDUF9IXworI2RlZmluZSBfVENQX0hfCisKKyNpbmNsdWRlICJoZWxwZXIuaCIKKwordHlwZWRlZgl1X2ludDMyX3QJdGNwX3NlcTsKKworI2RlZmluZSAgICAgIFBSX1NMT1dIWiAgICAgICAyICAgICAgICAgICAgICAgLyogMiBzbG93IHRpbWVvdXRzIHBlciBzZWNvbmQgKGFwcHJveCkgKi8KKyNkZWZpbmUgICAgICBQUl9GQVNUSFogICAgICAgNSAgICAgICAgICAgICAgIC8qIDUgZmFzdCB0aW1lb3V0cyBwZXIgc2Vjb25kIChub3QgaW1wb3J0YW50KSAqLworCitleHRlcm4gc3RydWN0IHNvY2tldCAqdGNwX2xhc3Rfc287CisKKyNkZWZpbmUgVENQX1NORFNQQUNFIDgxOTIKKyNkZWZpbmUgVENQX1JDVlNQQUNFIDgxOTIKKworLyoKKyAqIFRDUCBoZWFkZXIuCisgKiBQZXIgUkZDIDc5MywgU2VwdGVtYmVyLCAxOTgxLgorICovCitzdHJ1Y3QgdGNwaGRyIHsKKwlwb3J0X3QJdGhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworCXBvcnRfdAl0aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwl0Y3Bfc2VxCXRoX3NlcTsJCQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl0Y3Bfc2VxCXRoX2FjazsJCQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKwl1X2ludDhfdAl0aF9vZmY6NCwJLyogZGF0YSBvZmZzZXQgKi8KKwkJCXRoX3gyOjQ7CS8qICh1bnVzZWQpICovCisjZWxzZQorCXVfaW50OF90CXRoX3gyOjQsCS8qICh1bnVzZWQpICovCisJCQl0aF9vZmY6NDsJLyogZGF0YSBvZmZzZXQgKi8KKyNlbmRpZgorCXVfaW50OF90CXRoX2ZsYWdzOworI2RlZmluZQlUSF9GSU4JMHgwMQorI2RlZmluZQlUSF9TWU4JMHgwMgorI2RlZmluZQlUSF9SU1QJMHgwNAorI2RlZmluZQlUSF9QVVNICTB4MDgKKyNkZWZpbmUJVEhfQUNLCTB4MTAKKyNkZWZpbmUJVEhfVVJHCTB4MjAKKwl1X2ludDE2X3QJdGhfd2luOwkJCS8qIHdpbmRvdyAqLworCXVfaW50MTZfdAl0aF9zdW07CQkJLyogY2hlY2tzdW0gKi8KKwl1X2ludDE2X3QJdGhfdXJwOwkJCS8qIHVyZ2VudCBwb2ludGVyICovCit9OworCisjaW5jbHVkZSAidGNwX3Zhci5oIgorCisjZGVmaW5lCVRDUE9QVF9FT0wJCTAKKyNkZWZpbmUJVENQT1BUX05PUAkJMQorI2RlZmluZQlUQ1BPUFRfTUFYU0VHCQkyCisjZGVmaW5lICAgIFRDUE9MRU5fTUFYU0VHCQk0CisjZGVmaW5lIFRDUE9QVF9XSU5ET1cJCTMKKyNkZWZpbmUgICAgVENQT0xFTl9XSU5ET1cJCTMKKyNkZWZpbmUgVENQT1BUX1NBQ0tfUEVSTUlUVEVECTQJCS8qIEV4cGVyaW1lbnRhbCAqLworI2RlZmluZSAgICBUQ1BPTEVOX1NBQ0tfUEVSTUlUVEVECTIKKyNkZWZpbmUgVENQT1BUX1NBQ0sJCTUJCS8qIEV4cGVyaW1lbnRhbCAqLworI2RlZmluZSBUQ1BPUFRfVElNRVNUQU1QCTgKKyNkZWZpbmUgICAgVENQT0xFTl9USU1FU1RBTVAJCTEwCisjZGVmaW5lICAgIFRDUE9MRU5fVFNUQU1QX0FQUEEJCShUQ1BPTEVOX1RJTUVTVEFNUCsyKSAvKiBhcHBlbmRpeCBBICovCisKKyNkZWZpbmUgVENQT1BUX1RTVEFNUF9IRFIJXAorICAgIChUQ1BPUFRfTk9QPDwyNHxUQ1BPUFRfTk9QPDwxNnxUQ1BPUFRfVElNRVNUQU1QPDw4fFRDUE9MRU5fVElNRVNUQU1QKQorCisvKgorICogRGVmYXVsdCBtYXhpbXVtIHNlZ21lbnQgc2l6ZSBmb3IgVENQLgorICogV2l0aCBhbiBJUCBNU1Mgb2YgNTc2LCB0aGlzIGlzIDUzNiwKKyAqIGJ1dCA1MTIgaXMgcHJvYmFibHkgbW9yZSBjb252ZW5pZW50LgorICogVGhpcyBzaG91bGQgYmUgZGVmaW5lZCBhcyBNSU4oNTEyLCBJUF9NU1MgLSBzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcikpLgorICoKKyAqIFdlIG1ha2UgdGhpcyAxNDYwIGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IEV0aGVybmV0IGluIHRoZSBxZW11IGNvbnRleHQuCisgKi8KKyNkZWZpbmUJVENQX01TUwkxNDYwCisKKyNkZWZpbmUJVENQX01BWFdJTgk2NTUzNQkvKiBsYXJnZXN0IHZhbHVlIGZvciAodW5zY2FsZWQpIHdpbmRvdyAqLworCisjZGVmaW5lIFRDUF9NQVhfV0lOU0hJRlQJMTQJLyogbWF4aW11bSB3aW5kb3cgc2hpZnQgKi8KKworLyoKKyAqIFVzZXItc2V0dGFibGUgb3B0aW9ucyAodXNlZCB3aXRoIHNldHNvY2tvcHQpLgorICovCisjdW5kZWYgIFRDUF9OT0RFTEFZCisjZGVmaW5lCVRDUF9OT0RFTEFZCTB4MDEJLyogZG9uJ3QgZGVsYXkgc2VuZCB0byBjb2FsZXNjZSBwYWNrZXRzICovCisjdW5kZWYgIFRDUF9NQVhTRUcKKy8qICNkZWZpbmUJVENQX01BWFNFRwkweDAyICovCS8qIHNldCBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLworCisvKgorICogVENQIEZTTSBzdGF0ZSBkZWZpbml0aW9ucy4KKyAqIFBlciBSRkM3OTMsIFNlcHRlbWJlciwgMTk4MS4KKyAqLworCisjZGVmaW5lIFRDUF9OU1RBVEVTICAgICAxMQorCisjZGVmaW5lIFRDUFNfQ0xPU0VEICAgICAgICAgICAgIDAgICAgICAgLyogY2xvc2VkICovCisjZGVmaW5lIFRDUFNfTElTVEVOICAgICAgICAgICAgIDEgICAgICAgLyogbGlzdGVuaW5nIGZvciBjb25uZWN0aW9uICovCisjZGVmaW5lIFRDUFNfU1lOX1NFTlQgICAgICAgICAgIDIgICAgICAgLyogYWN0aXZlLCBoYXZlIHNlbnQgc3luICovCisjZGVmaW5lIFRDUFNfU1lOX1JFQ0VJVkVEICAgICAgIDMgICAgICAgLyogaGF2ZSBzZW5kIGFuZCByZWNlaXZlZCBzeW4gKi8KKy8qIHN0YXRlcyA8IFRDUFNfRVNUQUJMSVNIRUQgYXJlIHRob3NlIHdoZXJlIGNvbm5lY3Rpb25zIG5vdCBlc3RhYmxpc2hlZCAqLworI2RlZmluZSBUQ1BTX0VTVEFCTElTSEVEICAgICAgICA0ICAgICAgIC8qIGVzdGFibGlzaGVkICovCisjZGVmaW5lIFRDUFNfQ0xPU0VfV0FJVCAgICAgICAgIDUgICAgICAgLyogcmN2ZCBmaW4sIHdhaXRpbmcgZm9yIGNsb3NlICovCisvKiBzdGF0ZXMgPiBUQ1BTX0NMT1NFX1dBSVQgYXJlIHRob3NlIHdoZXJlIHVzZXIgaGFzIGNsb3NlZCAqLworI2RlZmluZSBUQ1BTX0ZJTl9XQUlUXzEgICAgICAgICA2ICAgICAgIC8qIGhhdmUgY2xvc2VkLCBzZW50IGZpbiAqLworI2RlZmluZSBUQ1BTX0NMT1NJTkcgICAgICAgICAgICA3ICAgICAgIC8qIGNsb3NlZCB4Y2hkIEZJTjsgYXdhaXQgRklOIEFDSyAqLworI2RlZmluZSBUQ1BTX0xBU1RfQUNLICAgICAgICAgICA4ICAgICAgIC8qIGhhZCBmaW4gYW5kIGNsb3NlOyBhd2FpdCBGSU4gQUNLICovCisvKiBzdGF0ZXMgPiBUQ1BTX0NMT1NFX1dBSVQgJiYgPCBUQ1BTX0ZJTl9XQUlUXzIgYXdhaXQgQUNLIG9mIEZJTiAqLworI2RlZmluZSBUQ1BTX0ZJTl9XQUlUXzIgICAgICAgICA5ICAgICAgIC8qIGhhdmUgY2xvc2VkLCBmaW4gaXMgYWNrZWQgKi8KKyNkZWZpbmUgVENQU19USU1FX1dBSVQgICAgICAgICAgMTAgICAgICAvKiBpbiAyKm1zbCBxdWlldCB3YWl0IGFmdGVyIGNsb3NlICovCisKKyNkZWZpbmUgVENQU19IQVZFUkNWRFNZTihzKSAgICAgKChzKSA+PSBUQ1BTX1NZTl9SRUNFSVZFRCkKKyNkZWZpbmUgVENQU19IQVZFRVNUQUJMSVNIRUQocykgKChzKSA+PSBUQ1BTX0VTVEFCTElTSEVEKQorI2RlZmluZSBUQ1BTX0hBVkVSQ1ZERklOKHMpICAgICAoKHMpID49IFRDUFNfVElNRV9XQUlUKQorCisvKgorICogVENQIHNlcXVlbmNlIG51bWJlcnMgYXJlIDMyIGJpdCBpbnRlZ2VycyBvcGVyYXRlZAorICogb24gd2l0aCBtb2R1bGFyIGFyaXRobWV0aWMuICBUaGVzZSBtYWNyb3MgY2FuIGJlCisgKiB1c2VkIHRvIGNvbXBhcmUgc3VjaCBpbnRlZ2Vycy4KKyAqLworI2RlZmluZSBTRVFfTFQoYSxiKSAgICAgKChpbnQpKChhKS0oYikpIDwgMCkKKyNkZWZpbmUgU0VRX0xFUShhLGIpICAgICgoaW50KSgoYSktKGIpKSA8PSAwKQorI2RlZmluZSBTRVFfR1QoYSxiKSAgICAgKChpbnQpKChhKS0oYikpID4gMCkKKyNkZWZpbmUgU0VRX0dFUShhLGIpICAgICgoaW50KSgoYSktKGIpKSA+PSAwKQorCisvKgorICogTWFjcm9zIHRvIGluaXRpYWxpemUgdGNwIHNlcXVlbmNlIG51bWJlcnMgZm9yCisgKiBzZW5kIGFuZCByZWNlaXZlIGZyb20gaW5pdGlhbCBzZW5kIGFuZCByZWNlaXZlCisgKiBzZXF1ZW5jZSBudW1iZXJzLgorICovCisjZGVmaW5lIHRjcF9yY3ZzZXFpbml0KHRwKSBcCisgICAgICh0cCktPnJjdl9hZHYgPSAodHApLT5yY3Zfbnh0ID0gKHRwKS0+aXJzICsgMQorCisjZGVmaW5lIHRjcF9zZW5kc2VxaW5pdCh0cCkgXAorICAgICh0cCktPnNuZF91bmEgPSAodHApLT5zbmRfbnh0ID0gKHRwKS0+c25kX21heCA9ICh0cCktPnNuZF91cCA9ICh0cCktPmlzcworCisjZGVmaW5lIFRDUF9JU1NJTkNSICAgICAoMTI1KjEwMjQpICAgICAgLyogaW5jcmVtZW50IGZvciB0Y3BfaXNzIGVhY2ggc2Vjb25kICovCisKK2V4dGVybiB0Y3Bfc2VxIHRjcF9pc3M7ICAgICAgICAgICAgICAgIC8qIHRjcCBpbml0aWFsIHNlbmQgc2VxICMgKi8KKworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCB0Y3BzdGF0ZXNbXTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX2lucHV0LmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX2lucHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOWRjYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BfaW5wdXQuYwpAQCAtMCwwICsxLDE3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwX2lucHV0LmMJOC41IChCZXJrZWxleSkgNC8xMC85NAorICogdGNwX2lucHV0LmMsdiAxLjEwIDE5OTQvMTAvMTMgMTg6MzY6MzIgd29sbG1hbiBFeHAKKyAqLworCisvKgorICogQ2hhbmdlcyBhbmQgYWRkaXRpb25zIHJlbGF0aW5nIHRvIFNMaVJQCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisjaW5jbHVkZSAiaXBfaWNtcC5oIgorCitzdHJ1Y3Qgc29ja2V0IHRjYjsKKworI2RlZmluZQlUQ1BSRVhNVFRIUkVTSCAzCitzdHJ1Y3QJc29ja2V0ICp0Y3BfbGFzdF9zbyA9ICZ0Y2I7CisKK3RjcF9zZXEgdGNwX2lzczsgICAgICAgICAgICAgICAgLyogdGNwIGluaXRpYWwgc2VuZCBzZXEgIyAqLworCisjZGVmaW5lIFRDUF9QQVdTX0lETEUJKDI0ICogMjQgKiA2MCAqIDYwICogUFJfU0xPV0haKQorCisvKiBmb3IgbW9kdWxvIGNvbXBhcmlzb25zIG9mIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgVFNUTVBfTFQoYSxiKQkoKGludCkoKGEpLShiKSkgPCAwKQorI2RlZmluZSBUU1RNUF9HRVEoYSxiKQkoKGludCkoKGEpLShiKSkgPj0gMCkKKworLyoKKyAqIEluc2VydCBzZWdtZW50IHRpIGludG8gcmVhc3NlbWJseSBxdWV1ZSBvZiB0Y3Agd2l0aAorICogY29udHJvbCBibG9jayB0cC4gIFJldHVybiBUSF9GSU4gaWYgcmVhc3NlbWJseSBub3cgaW5jbHVkZXMKKyAqIGEgc2VnbWVudCB3aXRoIEZJTi4gIFRoZSBtYWNybyBmb3JtIGRvZXMgdGhlIGNvbW1vbiBjYXNlIGlubGluZQorICogKHNlZ21lbnQgaXMgdGhlIG5leHQgdG8gYmUgcmVjZWl2ZWQgb24gYW4gZXN0YWJsaXNoZWQgY29ubmVjdGlvbiwKKyAqIGFuZCB0aGUgcXVldWUgaXMgZW1wdHkpLCBhdm9pZGluZyBsaW5rYWdlIGludG8gYW5kIHJlbW92YWwKKyAqIGZyb20gdGhlIHF1ZXVlIGFuZCByZXBldGl0aW9uIG9mIHZhcmlvdXMgY29udmVyc2lvbnMuCisgKiBTZXQgREVMQUNLIGZvciBzZWdtZW50cyByZWNlaXZlZCBpbiBvcmRlciwgYnV0IGFjayBpbW1lZGlhdGVseQorICogd2hlbiBzZWdtZW50cyBhcmUgb3V0IG9mIG9yZGVyIChzbyBmYXN0IHJldHJhbnNtaXQgY2FuIHdvcmspLgorICovCisjaWZkZWYgVENQX0FDS19IQUNLCisjZGVmaW5lIFRDUF9SRUFTUyh0cCwgdGksIG0sIHNvLCBmbGFncykge1wKKyAgICAgICBpZiAoKHRpKS0+dGlfc2VxID09ICh0cCktPnJjdl9ueHQgJiYgXAorICAgICAgICAgICB0Y3BmcmFnX2xpc3RfZW1wdHkodHApICYmIFwKKyAgICAgICAgICAgKHRwKS0+dF9zdGF0ZSA9PSBUQ1BTX0VTVEFCTElTSEVEKSB7XAorICAgICAgICAgICAgICAgaWYgKHRpLT50aV9mbGFncyAmIFRIX1BVU0gpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOyBcCisgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdHAtPnRfZmxhZ3MgfD0gVEZfREVMQUNLOyBcCisgICAgICAgICAgICAgICAodHApLT5yY3Zfbnh0ICs9ICh0aSktPnRpX2xlbjsgXAorICAgICAgICAgICAgICAgZmxhZ3MgPSAodGkpLT50aV9mbGFncyAmIFRIX0ZJTjsgXAorICAgICAgICAgICAgICAgU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFjaysrKTsgICAgICAgICBcCisgICAgICAgICAgICAgICBTVEFUKHRjcHN0YXQudGNwc19yY3ZieXRlICs9ICh0aSktPnRpX2xlbik7ICAgXAorICAgICAgICAgICAgICAgaWYgKHNvLT5zb19lbXUpIHsgXAorCQkgICAgICAgaWYgKHRjcF9lbXUoKHNvKSwobSkpKSBzYmFwcGVuZCgoc28pLCAobSkpOyBcCisJICAgICAgIH0gZWxzZSBcCisJICAgICAgIAkgICAgICAgc2JhcHBlbmQoKHNvKSwgKG0pKTsgXAorLyogICAgICAgICAgICAgICBzb3J3YWtldXAoc28pOyAqLyBcCisJfSBlbHNlIHtcCisgICAgICAgICAgICAgICAoZmxhZ3MpID0gdGNwX3JlYXNzKCh0cCksICh0aSksIChtKSk7IFwKKyAgICAgICAgICAgICAgIHRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsgXAorICAgICAgIH0gXAorfQorI2Vsc2UKKyNkZWZpbmUJVENQX1JFQVNTKHRwLCB0aSwgbSwgc28sIGZsYWdzKSB7IFwKKwlpZiAoKHRpKS0+dGlfc2VxID09ICh0cCktPnJjdl9ueHQgJiYgXAorICAgICAgICB0Y3BmcmFnX2xpc3RfZW1wdHkodHApICYmIFwKKwkgICAgKHRwKS0+dF9zdGF0ZSA9PSBUQ1BTX0VTVEFCTElTSEVEKSB7IFwKKwkJdHAtPnRfZmxhZ3MgfD0gVEZfREVMQUNLOyBcCisJCSh0cCktPnJjdl9ueHQgKz0gKHRpKS0+dGlfbGVuOyBcCisJCWZsYWdzID0gKHRpKS0+dGlfZmxhZ3MgJiBUSF9GSU47IFwKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFjaysrKTsgICAgICAgIFwKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2Ynl0ZSArPSAodGkpLT50aV9sZW4pOyAgXAorCQlpZiAoc28tPnNvX2VtdSkgeyBcCisJCQlpZiAodGNwX2VtdSgoc28pLChtKSkpIHNiYXBwZW5kKHNvLCAobSkpOyBcCisJCX0gZWxzZSBcCisJCQlzYmFwcGVuZCgoc28pLCAobSkpOyBcCisvKgkJc29yd2FrZXVwKHNvKTsgKi8gXAorCX0gZWxzZSB7IFwKKwkJKGZsYWdzKSA9IHRjcF9yZWFzcygodHApLCAodGkpLCAobSkpOyBcCisJCXRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsgXAorCX0gXAorfQorI2VuZGlmCitzdGF0aWMgdm9pZCB0Y3BfZG9vcHRpb25zKHN0cnVjdCB0Y3BjYiAqdHAsIHVfY2hhciAqY3AsIGludCBjbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0Y3BpcGhkciAqdGkpOworc3RhdGljIHZvaWQgdGNwX3htaXRfdGltZXIocmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cCwgaW50IHJ0dCk7CisKK3N0YXRpYyBpbnQKK3RjcF9yZWFzcyhyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwLCByZWdpc3RlciBzdHJ1Y3QgdGNwaXBoZHIgKnRpLAorICAgICAgICAgIHN0cnVjdCBtYnVmICptKQoreworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BpcGhkciAqcTsKKwlzdHJ1Y3Qgc29ja2V0ICpzbyA9IHRwLT50X3NvY2tldDsKKwlpbnQgZmxhZ3M7CisKKwkvKgorCSAqIENhbGwgd2l0aCB0aT09TlVMTCBhZnRlciBiZWNvbWUgZXN0YWJsaXNoZWQgdG8KKwkgKiBmb3JjZSBwcmUtRVNUQUJMSVNIRUQgZGF0YSB1cCB0byB1c2VyIHNvY2tldC4KKwkgKi8KKyAgICAgICAgaWYgKHRpID09IE5VTEwpCisJCWdvdG8gcHJlc2VudDsKKworCS8qCisJICogRmluZCBhIHNlZ21lbnQgd2hpY2ggYmVnaW5zIGFmdGVyIHRoaXMgb25lIGRvZXMuCisJICovCisJZm9yIChxID0gdGNwZnJhZ19saXN0X2ZpcnN0KHRwKTsgIXRjcGZyYWdfbGlzdF9lbmQocSwgdHApOworICAgICAgICAgICAgcSA9IHRjcGlwaGRyX25leHQocSkpCisJCWlmIChTRVFfR1QocS0+dGlfc2VxLCB0aS0+dGlfc2VxKSkKKwkJCWJyZWFrOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHByZWNlZGluZyBzZWdtZW50LCBpdCBtYXkgcHJvdmlkZSBzb21lIG9mCisJICogb3VyIGRhdGEgYWxyZWFkeS4gIElmIHNvLCBkcm9wIHRoZSBkYXRhIGZyb20gdGhlIGluY29taW5nCisJICogc2VnbWVudC4gIElmIGl0IHByb3ZpZGVzIGFsbCBvZiBvdXIgZGF0YSwgZHJvcCB1cy4KKwkgKi8KKwlpZiAoIXRjcGZyYWdfbGlzdF9lbmQodGNwaXBoZHJfcHJldihxKSwgdHApKSB7CisJCXJlZ2lzdGVyIGludCBpOworCQlxID0gdGNwaXBoZHJfcHJldihxKTsKKwkJLyogY29udmVyc2lvbiB0byBpbnQgKGluIGkpIGhhbmRsZXMgc2VxIHdyYXBhcm91bmQgKi8KKwkJaSA9IHEtPnRpX3NlcSArIHEtPnRpX2xlbiAtIHRpLT50aV9zZXE7CisJCWlmIChpID4gMCkgeworCQkJaWYgKGkgPj0gdGktPnRpX2xlbikgeworCQkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmR1cHBhY2srKyk7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2ZHVwYnl0ZSArPSB0aS0+dGlfbGVuKTsKKwkJCQltX2ZyZWVtKG0pOworCQkJCS8qCisJCQkJICogVHJ5IHRvIHByZXNlbnQgYW55IHF1ZXVlZCBkYXRhCisJCQkJICogYXQgdGhlIGxlZnQgd2luZG93IGVkZ2UgdG8gdGhlIHVzZXIuCisJCQkJICogVGhpcyBpcyBuZWVkZWQgYWZ0ZXIgdGhlIDMtV0hTCisJCQkJICogY29tcGxldGVzLgorCQkJCSAqLworCQkJCWdvdG8gcHJlc2VudDsgICAvKiA/Pz8gKi8KKwkJCX0KKwkJCW1fYWRqKG0sIGkpOworCQkJdGktPnRpX2xlbiAtPSBpOworCQkJdGktPnRpX3NlcSArPSBpOworCQl9CisJCXEgPSB0Y3BpcGhkcl9uZXh0KHEpOworCX0KKwlTVEFUKHRjcHN0YXQudGNwc19yY3Zvb3BhY2srKyk7CisJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2b29ieXRlICs9IHRpLT50aV9sZW4pOworCXRpLT50aV9tYnVmID0gbTsKKworCS8qCisJICogV2hpbGUgd2Ugb3ZlcmxhcCBzdWNjZWVkaW5nIHNlZ21lbnRzIHRyaW0gdGhlbSBvciwKKwkgKiBpZiB0aGV5IGFyZSBjb21wbGV0ZWx5IGNvdmVyZWQsIGRlcXVldWUgdGhlbS4KKwkgKi8KKwl3aGlsZSAoIXRjcGZyYWdfbGlzdF9lbmQocSwgdHApKSB7CisJCXJlZ2lzdGVyIGludCBpID0gKHRpLT50aV9zZXEgKyB0aS0+dGlfbGVuKSAtIHEtPnRpX3NlcTsKKwkJaWYgKGkgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoaSA8IHEtPnRpX2xlbikgeworCQkJcS0+dGlfc2VxICs9IGk7CisJCQlxLT50aV9sZW4gLT0gaTsKKwkJCW1fYWRqKHEtPnRpX21idWYsIGkpOworCQkJYnJlYWs7CisJCX0KKwkJcSA9IHRjcGlwaGRyX25leHQocSk7CisJCW0gPSB0Y3BpcGhkcl9wcmV2KHEpLT50aV9tYnVmOworCQlyZW1xdWUodGNwaXBoZHIycWxpbmsodGNwaXBoZHJfcHJldihxKSkpOworCQltX2ZyZWVtKG0pOworCX0KKworCS8qCisJICogU3RpY2sgbmV3IHNlZ21lbnQgaW4gaXRzIHBsYWNlLgorCSAqLworCWluc3F1ZSh0Y3BpcGhkcjJxbGluayh0aSksIHRjcGlwaGRyMnFsaW5rKHRjcGlwaGRyX3ByZXYocSkpKTsKKworcHJlc2VudDoKKwkvKgorCSAqIFByZXNlbnQgZGF0YSB0byB1c2VyLCBhZHZhbmNpbmcgcmN2X254dCB0aHJvdWdoCisJICogY29tcGxldGVkIHNlcXVlbmNlIHNwYWNlLgorCSAqLworCWlmICghVENQU19IQVZFRVNUQUJMSVNIRUQodHAtPnRfc3RhdGUpKQorCQlyZXR1cm4gKDApOworCXRpID0gdGNwZnJhZ19saXN0X2ZpcnN0KHRwKTsKKwlpZiAodGNwZnJhZ19saXN0X2VuZCh0aSwgdHApIHx8IHRpLT50aV9zZXEgIT0gdHAtPnJjdl9ueHQpCisJCXJldHVybiAoMCk7CisJaWYgKHRwLT50X3N0YXRlID09IFRDUFNfU1lOX1JFQ0VJVkVEICYmIHRpLT50aV9sZW4pCisJCXJldHVybiAoMCk7CisJZG8geworCQl0cC0+cmN2X254dCArPSB0aS0+dGlfbGVuOworCQlmbGFncyA9IHRpLT50aV9mbGFncyAmIFRIX0ZJTjsKKwkJcmVtcXVlKHRjcGlwaGRyMnFsaW5rKHRpKSk7CisJCW0gPSB0aS0+dGlfbWJ1ZjsKKwkJdGkgPSB0Y3BpcGhkcl9uZXh0KHRpKTsKKy8qCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfRkNBTlRSQ1ZNT1JFKSAqLworCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfRkNBTlRTRU5ETU9SRSkKKwkJCW1fZnJlZW0obSk7CisJCWVsc2UgeworCQkJaWYgKHNvLT5zb19lbXUpIHsKKwkJCQlpZiAodGNwX2VtdShzbyxtKSkgc2JhcHBlbmQoc28sIG0pOworCQkJfSBlbHNlCisJCQkJc2JhcHBlbmQoc28sIG0pOworCQl9CisJfSB3aGlsZSAodGkgIT0gKHN0cnVjdCB0Y3BpcGhkciAqKXRwICYmIHRpLT50aV9zZXEgPT0gdHAtPnJjdl9ueHQpOworLyoJc29yd2FrZXVwKHNvKTsgKi8KKwlyZXR1cm4gKGZsYWdzKTsKK30KKworLyoKKyAqIFRDUCBpbnB1dCByb3V0aW5lLCBmb2xsb3dzIHBhZ2VzIDY1LTc2IG9mIHRoZQorICogcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBkYXRlZCBTZXB0ZW1iZXIsIDE5ODEgdmVyeSBjbG9zZWx5LgorICovCit2b2lkCit0Y3BfaW5wdXQoc3RydWN0IG1idWYgKm0sIGludCBpcGhsZW4sIHN0cnVjdCBzb2NrZXQgKmluc28pCit7CisgIAlzdHJ1Y3QgaXAgc2F2ZV9pcCwgKmlwOworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BpcGhkciAqdGk7CisJY2FkZHJfdCBvcHRwID0gTlVMTDsKKwlpbnQgb3B0bGVuID0gMDsKKwlpbnQgbGVuLCB0bGVuLCBvZmY7CisgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHAgPSBOVUxMOworCXJlZ2lzdGVyIGludCB0aWZsYWdzOworICAgICAgICBzdHJ1Y3Qgc29ja2V0ICpzbyA9IE5VTEw7CisJaW50IHRvZHJvcCwgYWNrZWQsIG91cmZpbmlzYWNrZWQsIG5lZWRvdXRwdXQgPSAwOworLyoJaW50IGRyb3Bzb2NrZXQgPSAwOyAqLworCWludCBpc3MgPSAwOworCXVfbG9uZyB0aXdpbjsKKwlpbnQgcmV0OworLyoJaW50IHRzX3ByZXNlbnQgPSAwOyAqLworICAgIHN0cnVjdCBleF9saXN0ICpleF9wdHI7CisKKwlERUJVR19DQUxMKCJ0Y3BfaW5wdXQiKTsKKwlERUJVR19BUkdTKChkZmQsIiBtID0gJThseCAgaXBobGVuID0gJTJkICBpbnNvID0gJWx4XG4iLAorCQkgICAgKGxvbmcgKW0sIGlwaGxlbiwgKGxvbmcgKWluc28gKSk7CisKKwkvKgorCSAqIElmIGNhbGxlZCB3aXRoIG0gPT0gMCwgdGhlbiB3ZSdyZSBjb250aW51aW5nIHRoZSBjb25uZWN0CisJICovCisJaWYgKG0gPT0gTlVMTCkgeworCQlzbyA9IGluc287CisKKwkJLyogUmUtc2V0IGEgZmV3IHZhcmlhYmxlcyAqLworCQl0cCA9IHNvdG90Y3BjYihzbyk7CisJCW0gPSBzby0+c29fbTsKKyAgICAgICAgICAgICAgICBzby0+c29fbSA9IE5VTEw7CisJCXRpID0gc28tPnNvX3RpOworCQl0aXdpbiA9IHRpLT50aV93aW47CisJCXRpZmxhZ3MgPSB0aS0+dGlfZmxhZ3M7CisKKwkJZ290byBjb250X2Nvbm47CisJfQorCisKKwlTVEFUKHRjcHN0YXQudGNwc19yY3Z0b3RhbCsrKTsKKwkvKgorCSAqIEdldCBJUCBhbmQgVENQIGhlYWRlciB0b2dldGhlciBpbiBmaXJzdCBtYnVmLgorCSAqIE5vdGU6IElQIGxlYXZlcyBJUCBoZWFkZXIgaW4gZmlyc3QgbWJ1Zi4KKwkgKi8KKwl0aSA9IG10b2QobSwgc3RydWN0IHRjcGlwaGRyICopOworCWlmIChpcGhsZW4gPiAoaW50KXNpemVvZihzdHJ1Y3QgaXAgKSkgeworCSAgaXBfc3RyaXBvcHRpb25zKG0sIChzdHJ1Y3QgbWJ1ZiAqKTApOworCSAgaXBobGVuPXNpemVvZihzdHJ1Y3QgaXAgKTsKKwl9CisJLyogWFhYIENoZWNrIGlmIHRvbyBzaG9ydCAqLworCisKKwkvKgorCSAqIFNhdmUgYSBjb3B5IG9mIHRoZSBJUCBoZWFkZXIgaW4gY2FzZSB3ZSB3YW50IHJlc3RvcmUgaXQKKwkgKiBmb3Igc2VuZGluZyBhbiBJQ01QIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UuCisJICovCisJaXA9bXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJc2F2ZV9pcCA9ICppcDsKKwlzYXZlX2lwLmlwX2xlbis9IGlwaGxlbjsKKworCS8qCisJICogQ2hlY2tzdW0gZXh0ZW5kZWQgVENQIGhlYWRlciBhbmQgZGF0YS4KKwkgKi8KKwl0bGVuID0gKChzdHJ1Y3QgaXAgKil0aSktPmlwX2xlbjsKKyAgICAgICAgdGNwaXBoZHIycWxpbmsodGkpLT5uZXh0ID0gdGNwaXBoZHIycWxpbmsodGkpLT5wcmV2ID0gTlVMTDsKKyAgICAgICAgbWVtc2V0KCZ0aS0+dGlfaS5paF9tYnVmLCAwICwgc2l6ZW9mKHN0cnVjdCBtYnVmX3B0cikpOworCXRpLT50aV94MSA9IDA7CisJdGktPnRpX2xlbiA9IGh0b25zKCh1X2ludDE2X3QpdGxlbik7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpcCApICsgdGxlbjsKKwkvKiBrZWVwIGNoZWNrc3VtIGZvciBJQ01QIHJlcGx5CisJICogdGktPnRpX3N1bSA9IGNrc3VtKG0sIGxlbik7CisJICogaWYgKHRpLT50aV9zdW0pIHsgKi8KKwlpZihja3N1bShtLCBsZW4pKSB7CisJICBTVEFUKHRjcHN0YXQudGNwc19yY3ZiYWRzdW0rKyk7CisJICBnb3RvIGRyb3A7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGF0IFRDUCBvZmZzZXQgbWFrZXMgc2Vuc2UsCisJICogcHVsbCBvdXQgVENQIG9wdGlvbnMgYW5kIGFkanVzdCBsZW5ndGguCQlYWFgKKwkgKi8KKwlvZmYgPSB0aS0+dGlfb2ZmIDw8IDI7CisJaWYgKG9mZiA8IChpbnQpc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSB8fCBvZmYgPiB0bGVuKSB7CisJICBTVEFUKHRjcHN0YXQudGNwc19yY3ZiYWRvZmYrKyk7CisJICBnb3RvIGRyb3A7CisJfQorCXRsZW4gLT0gb2ZmOworCXRpLT50aV9sZW4gPSB0bGVuOworCWlmIChvZmYgPiAoaW50KXNpemVvZiAoc3RydWN0IHRjcGhkcikpIHsKKwkgIG9wdGxlbiA9IG9mZiAtIHNpemVvZiAoc3RydWN0IHRjcGhkcik7CisJICBvcHRwID0gbXRvZChtLCBjYWRkcl90KSArIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKTsKKworCQkvKgorCQkgKiBEbyBxdWljayByZXRyaWV2YWwgb2YgdGltZXN0YW1wIG9wdGlvbnMgKCJvcHRpb25zCisJCSAqIHByZWRpY3Rpb24/IikuICBJZiB0aW1lc3RhbXAgaXMgdGhlIG9ubHkgb3B0aW9uIGFuZCBpdCdzCisJCSAqIGZvcm1hdHRlZCBhcyByZWNvbW1lbmRlZCBpbiBSRkMgMTMyMyBhcHBlbmRpeCBBLCB3ZQorCQkgKiBxdWlja2x5IGdldCB0aGUgdmFsdWVzIG5vdyBhbmQgbm90IGJvdGhlciBjYWxsaW5nCisJCSAqIHRjcF9kb29wdGlvbnMoKSwgZXRjLgorCQkgKi8KKy8qCQlpZiAoKG9wdGxlbiA9PSBUQ1BPTEVOX1RTVEFNUF9BUFBBIHx8CisgKgkJICAgICAob3B0bGVuID4gVENQT0xFTl9UU1RBTVBfQVBQQSAmJgorICoJCQlvcHRwW1RDUE9MRU5fVFNUQU1QX0FQUEFdID09IFRDUE9QVF9FT0wpKSAmJgorICoJCSAgICAgKih1X2ludDMyX3QgKilvcHRwID09IGh0b25sKFRDUE9QVF9UU1RBTVBfSERSKSAmJgorICoJCSAgICAgKHRpLT50aV9mbGFncyAmIFRIX1NZTikgPT0gMCkgeworICoJCQl0c19wcmVzZW50ID0gMTsKKyAqCQkJdHNfdmFsID0gbnRvaGwoKih1X2ludDMyX3QgKikob3B0cCArIDQpKTsKKyAqCQkJdHNfZWNyID0gbnRvaGwoKih1X2ludDMyX3QgKikob3B0cCArIDgpKTsKKyAqCQkJb3B0cCA9IE5VTEw7ICAgLyAqIHdlJ3ZlIHBhcnNlZCB0aGUgb3B0aW9ucyAqIC8KKyAqCQl9CisgKi8KKwl9CisJdGlmbGFncyA9IHRpLT50aV9mbGFnczsKKworCS8qCisJICogQ29udmVydCBUQ1AgcHJvdG9jb2wgc3BlY2lmaWMgZmllbGRzIHRvIGhvc3QgZm9ybWF0LgorCSAqLworCU5UT0hMKHRpLT50aV9zZXEpOworCU5UT0hMKHRpLT50aV9hY2spOworCU5UT0hTKHRpLT50aV93aW4pOworCU5UT0hTKHRpLT50aV91cnApOworCisJLyoKKwkgKiBEcm9wIFRDUCwgSVAgaGVhZGVycyBhbmQgVENQIG9wdGlvbnMuCisJICovCisJbS0+bV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdGNwaXBoZHIpK29mZi1zaXplb2Yoc3RydWN0IHRjcGhkcik7CisJbS0+bV9sZW4gIC09IHNpemVvZihzdHJ1Y3QgdGNwaXBoZHIpK29mZi1zaXplb2Yoc3RydWN0IHRjcGhkcik7CisKKyAgICBpZiAoc2xpcnBfcmVzdHJpY3QpIHsKKyAgICAgICAgZm9yIChleF9wdHIgPSBleGVjX2xpc3Q7IGV4X3B0cjsgZXhfcHRyID0gZXhfcHRyLT5leF9uZXh0KQorICAgICAgICAgICAgaWYgKGV4X3B0ci0+ZXhfZnBvcnQgPT0gcG9ydF9nZXRoKHRpLT50aV9kcG9ydCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGlwX2dldGgodGktPnRpX2RzdCkgJiAweGZmKSA9PSBleF9wdHItPmV4X2FkZHIpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCFleF9wdHIpCisgICAgICAgICAgICBnb3RvIGRyb3A7CisgICAgfQorCS8qCisJICogTG9jYXRlIHBjYiBmb3Igc2VnbWVudC4KKwkgKi8KK2ZpbmRzbzoKKwlzbyA9IHRjcF9sYXN0X3NvOworICAgIHsKKyAgICAgICAgdWludDMyX3QgIHNyY2lwICAgPSBpcF9nZXRoKHRpLT50aV9zcmMpOworICAgICAgICB1aW50MzJfdCAgZHN0aXAgICA9IGlwX2dldGgodGktPnRpX2RzdCk7CisgICAgICAgIHVpbnQxNl90ICBkc3Rwb3J0ID0gcG9ydF9nZXRoKHRpLT50aV9kcG9ydCk7CisgICAgICAgIHVpbnQxNl90ICBzcmNwb3J0ID0gcG9ydF9nZXRoKHRpLT50aV9zcG9ydCk7CisKKwkJaWYgKHNvLT5zb19mYWRkcl9wb3J0ICE9IGRzdHBvcnQgfHwKKwkJCXNvLT5zb19sYWRkcl9wb3J0ICE9IHNyY3BvcnQgfHwKKwkJCXNvLT5zb19sYWRkcl9pcCAgICE9IHNyY2lwIHx8CisJCQlzby0+c29fZmFkZHJfaXAgICAhPSBkc3RpcCkgeworCQkJc28gPSBzb2xvb2t1cCgmdGNiLCBzcmNpcCwgc3JjcG9ydCwgZHN0aXAsIGRzdHBvcnQpOworCQkJaWYgKHNvKQorCQkJCXRjcF9sYXN0X3NvID0gc287CisJCQlTVEFUKHRjcHN0YXQudGNwc19zb2NhY2hlbWlzcysrKTsKKwkJfQorICAgIH0KKwkvKgorCSAqIElmIHRoZSBzdGF0ZSBpcyBDTE9TRUQgKGkuZS4sIFRDQiBkb2VzIG5vdCBleGlzdCkgdGhlbgorCSAqIGFsbCBkYXRhIGluIHRoZSBpbmNvbWluZyBzZWdtZW50IGlzIGRpc2NhcmRlZC4KKwkgKiBJZiB0aGUgVENCIGV4aXN0cyBidXQgaXMgaW4gQ0xPU0VEIHN0YXRlLCBpdCBpcyBlbWJyeW9uaWMsCisJICogYnV0IHNob3VsZCBlaXRoZXIgZG8gYSBsaXN0ZW4gb3IgYSBjb25uZWN0IHNvb24uCisJICoKKwkgKiBzdGF0ZSA9PSBDTE9TRUQgbWVhbnMgd2UndmUgZG9uZSBzb2NyZWF0ZSgpIGJ1dCBoYXZlbid0CisJICogYXR0YWNoZWQgaXQgdG8gYSBwcm90b2NvbCB5ZXQuLi4KKwkgKgorCSAqIFhYWCBJZiBhIFRDQiBkb2VzIG5vdCBleGlzdCwgYW5kIHRoZSBUSF9TWU4gZmxhZyBpcworCSAqIHRoZSBvbmx5IGZsYWcgc2V0LCB0aGVuIGNyZWF0ZSBhIHNlc3Npb24sIG1hcmsgaXQKKwkgKiBhcyBpZiBpdCB3YXMgTElTVEVOSU5HLCBhbmQgY29udGludWUuLi4KKwkgKi8KKyAgICAgICAgaWYgKHNvID09IE5VTEwpIHsKKwkgIGlmICgodGlmbGFncyAmIChUSF9TWU58VEhfRklOfFRIX1JTVHxUSF9VUkd8VEhfQUNLKSkgIT0gVEhfU1lOKQorCSAgICBnb3RvIGRyb3B3aXRocmVzZXQ7CisKKwkgIGlmICgoc28gPSBzb2NyZWF0ZSgpKSA9PSBOVUxMKQorCSAgICBnb3RvIGRyb3B3aXRocmVzZXQ7CisJICBpZiAodGNwX2F0dGFjaChzbykgPCAwKSB7CisJICAgIGZyZWUoc28pOyAvKiBOb3Qgc29mcmVlIChpZiBpdCBmYWlsZWQsIGl0J3Mgbm90IGluc3F1ZWQpICovCisJICAgIGdvdG8gZHJvcHdpdGhyZXNldDsKKwkgIH0KKworCSAgc2JyZXNlcnZlKCZzby0+c29fc25kLCBUQ1BfU05EU1BBQ0UpOworCSAgc2JyZXNlcnZlKCZzby0+c29fcmN2LCBUQ1BfUkNWU1BBQ0UpOworCisJICAvKgkJdGNwX2xhc3Rfc28gPSBzbzsgKi8gIC8qIFhYWCA/ICovCisJICAvKgkJdHAgPSBzb3RvdGNwY2Ioc28pOyAgICAqLworCisJICBzby0+c29fbGFkZHJfaXAgICA9IGlwX2dldGgodGktPnRpX3NyYyk7CisJICBzby0+c29fbGFkZHJfcG9ydCA9IHBvcnRfZ2V0aCh0aS0+dGlfc3BvcnQpOworCSAgc28tPnNvX2ZhZGRyX2lwICAgPSBpcF9nZXRoKHRpLT50aV9kc3QpOworCSAgc28tPnNvX2ZhZGRyX3BvcnQgPSBwb3J0X2dldGgodGktPnRpX2Rwb3J0KTsKKworCSAgaWYgKChzby0+c29faXB0b3MgPSB0Y3BfdG9zKHNvKSkgPT0gMCkKKwkgICAgc28tPnNvX2lwdG9zID0gKChzdHJ1Y3QgaXAgKil0aSktPmlwX3RvczsKKworCSAgdHAgPSBzb3RvdGNwY2Ioc28pOworCSAgdHAtPnRfc3RhdGUgPSBUQ1BTX0xJU1RFTjsKKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyBpcyBhIHN0aWxsLWNvbm5lY3Rpbmcgc29ja2V0LCB0aGlzIHByb2JhYmx5CisgICAgICAgICAqIGEgcmV0cmFuc21pdCBvZiB0aGUgU1lOLiAgV2hldGhlciBpdCdzIGEgcmV0cmFuc21pdCBTWU4KKwkgKiBvciBzb21ldGhpbmcgZWxzZSwgd2UgbnVrZSBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzby0+c29fc3RhdGUgJiBTU19JU0ZDT05ORUNUSU5HKQorICAgICAgICAgICAgICAgIGdvdG8gZHJvcDsKKworCXRwID0gc290b3RjcGNiKHNvKTsKKworCS8qIFhYWCBTaG91bGQgbmV2ZXIgZmFpbCAqLworICAgICAgICBpZiAodHAgPT0gTlVMTCkKKwkJZ290byBkcm9wd2l0aHJlc2V0OworCWlmICh0cC0+dF9zdGF0ZSA9PSBUQ1BTX0NMT1NFRCkKKwkJZ290byBkcm9wOworCisJLyogVW5zY2FsZSB0aGUgd2luZG93IGludG8gYSAzMi1iaXQgdmFsdWUuICovCisvKglpZiAoKHRpZmxhZ3MgJiBUSF9TWU4pID09IDApCisgKgkJdGl3aW4gPSB0aS0+dGlfd2luIDw8IHRwLT5zbmRfc2NhbGU7CisgKgllbHNlCisgKi8KKwkJdGl3aW4gPSB0aS0+dGlfd2luOworCisJLyoKKwkgKiBTZWdtZW50IHJlY2VpdmVkIG9uIGNvbm5lY3Rpb24uCisJICogUmVzZXQgaWRsZSB0aW1lIGFuZCBrZWVwLWFsaXZlIHRpbWVyLgorCSAqLworCXRwLT50X2lkbGUgPSAwOworCWlmIChTT19PUFRJT05TKQorCSAgIHRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQSU5UVkw7CisJZWxzZQorCSAgIHRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQX0lETEU7CisKKwkvKgorCSAqIFByb2Nlc3Mgb3B0aW9ucyBpZiBub3QgaW4gTElTVEVOIHN0YXRlLAorCSAqIGVsc2UgZG8gaXQgYmVsb3cgKGFmdGVyIGdldHRpbmcgcmVtb3RlIGFkZHJlc3MpLgorCSAqLworCWlmIChvcHRwICYmIHRwLT50X3N0YXRlICE9IFRDUFNfTElTVEVOKQorCQl0Y3BfZG9vcHRpb25zKHRwLCAodV9jaGFyICopb3B0cCwgb3B0bGVuLCB0aSk7CisvKiAsICovCisvKgkJCSZ0c19wcmVzZW50LCAmdHNfdmFsLCAmdHNfZWNyKTsgKi8KKworCS8qCisJICogSGVhZGVyIHByZWRpY3Rpb246IGNoZWNrIGZvciB0aGUgdHdvIGNvbW1vbiBjYXNlcworCSAqIG9mIGEgdW5pLWRpcmVjdGlvbmFsIGRhdGEgeGZlci4gIElmIHRoZSBwYWNrZXQgaGFzCisJICogbm8gY29udHJvbCBmbGFncywgaXMgaW4tc2VxdWVuY2UsIHRoZSB3aW5kb3cgZGlkbid0CisJICogY2hhbmdlIGFuZCB3ZSdyZSBub3QgcmV0cmFuc21pdHRpbmcsIGl0J3MgYQorCSAqIGNhbmRpZGF0ZS4gIElmIHRoZSBsZW5ndGggaXMgemVybyBhbmQgdGhlIGFjayBtb3ZlZAorCSAqIGZvcndhcmQsIHdlJ3JlIHRoZSBzZW5kZXIgc2lkZSBvZiB0aGUgeGZlci4gIEp1c3QKKwkgKiBmcmVlIHRoZSBkYXRhIGFja2VkICYgd2FrZSBhbnkgaGlnaGVyIGxldmVsIHByb2Nlc3MKKwkgKiB0aGF0IHdhcyBibG9ja2VkIHdhaXRpbmcgZm9yIHNwYWNlLiAgSWYgdGhlIGxlbmd0aAorCSAqIGlzIG5vbi16ZXJvIGFuZCB0aGUgYWNrIGRpZG4ndCBtb3ZlLCB3ZSdyZSB0aGUKKwkgKiByZWNlaXZlciBzaWRlLiAgSWYgd2UncmUgZ2V0dGluZyBwYWNrZXRzIGluLW9yZGVyCisJICogKHRoZSByZWFzc2VtYmx5IHF1ZXVlIGlzIGVtcHR5KSwgYWRkIHRoZSBkYXRhIHRvCisJICogdGhlIHNvY2tldCBidWZmZXIgYW5kIG5vdGUgdGhhdCB3ZSBuZWVkIGEgZGVsYXllZCBhY2suCisJICoKKwkgKiBYWFggU29tZSBvZiB0aGVzZSB0ZXN0cyBhcmUgbm90IG5lZWRlZAorCSAqIGVnOiB0aGUgdGl3aW4gPT0gdHAtPnNuZF93bmQgcHJldmVudHMgbWFueSBtb3JlCisJICogcHJlZGljdGlvbnMuLiB3aXRoIG5vICpyZWFsKiBhZHZhbnRhZ2UuLgorCSAqLworCWlmICh0cC0+dF9zdGF0ZSA9PSBUQ1BTX0VTVEFCTElTSEVEICYmCisJICAgICh0aWZsYWdzICYgKFRIX1NZTnxUSF9GSU58VEhfUlNUfFRIX1VSR3xUSF9BQ0spKSA9PSBUSF9BQ0sgJiYKKy8qCSAgICAoIXRzX3ByZXNlbnQgfHwgVFNUTVBfR0VRKHRzX3ZhbCwgdHAtPnRzX3JlY2VudCkpICYmICovCisJICAgIHRpLT50aV9zZXEgPT0gdHAtPnJjdl9ueHQgJiYKKwkgICAgdGl3aW4gJiYgdGl3aW4gPT0gdHAtPnNuZF93bmQgJiYKKwkgICAgdHAtPnNuZF9ueHQgPT0gdHAtPnNuZF9tYXgpIHsKKwkJLyoKKwkJICogSWYgbGFzdCBBQ0sgZmFsbHMgd2l0aGluIHRoaXMgc2VnbWVudCdzIHNlcXVlbmNlIG51bWJlcnMsCisJCSAqICByZWNvcmQgdGhlIHRpbWVzdGFtcC4KKwkJICovCisvKgkJaWYgKHRzX3ByZXNlbnQgJiYgU0VRX0xFUSh0aS0+dGlfc2VxLCB0cC0+bGFzdF9hY2tfc2VudCkgJiYKKyAqCQkgICBTRVFfTFQodHAtPmxhc3RfYWNrX3NlbnQsIHRpLT50aV9zZXEgKyB0aS0+dGlfbGVuKSkgeworICoJCQl0cC0+dHNfcmVjZW50X2FnZSA9IHRjcF9ub3c7CisgKgkJCXRwLT50c19yZWNlbnQgPSB0c192YWw7CisgKgkJfQorICovCisJCWlmICh0aS0+dGlfbGVuID09IDApIHsKKwkJCWlmIChTRVFfR1QodGktPnRpX2FjaywgdHAtPnNuZF91bmEpICYmCisJCQkgICAgU0VRX0xFUSh0aS0+dGlfYWNrLCB0cC0+c25kX21heCkgJiYKKwkJCSAgICB0cC0+c25kX2N3bmQgPj0gdHAtPnNuZF93bmQpIHsKKwkJCQkvKgorCQkJCSAqIHRoaXMgaXMgYSBwdXJlIGFjayBmb3Igb3V0c3RhbmRpbmcgZGF0YS4KKwkJCQkgKi8KKwkJCQlTVEFUKHRjcHN0YXQudGNwc19wcmVkYWNrKyspOworLyoJCQkJaWYgKHRzX3ByZXNlbnQpCisgKgkJCQkJdGNwX3htaXRfdGltZXIodHAsIHRjcF9ub3ctdHNfZWNyKzEpOworICoJCQkJZWxzZQorICovCQkJCSAgICAgaWYgKHRwLT50X3J0dCAmJgorCQkJCQkgICAgU0VRX0dUKHRpLT50aV9hY2ssIHRwLT50X3J0c2VxKSkKKwkJCQkJdGNwX3htaXRfdGltZXIodHAsIHRwLT50X3J0dCk7CisJCQkJYWNrZWQgPSB0aS0+dGlfYWNrIC0gdHAtPnNuZF91bmE7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2YWNrcGFjaysrKTsKKwkJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZhY2tieXRlICs9IGFja2VkKTsKKwkJCQlzYmRyb3AoJnNvLT5zb19zbmQsIGFja2VkKTsKKwkJCQl0cC0+c25kX3VuYSA9IHRpLT50aV9hY2s7CisJCQkJbV9mcmVlbShtKTsKKworCQkJCS8qCisJCQkJICogSWYgYWxsIG91dHN0YW5kaW5nIGRhdGEgYXJlIGFja2VkLCBzdG9wCisJCQkJICogcmV0cmFuc21pdCB0aW1lciwgb3RoZXJ3aXNlIHJlc3RhcnQgdGltZXIKKwkJCQkgKiB1c2luZyBjdXJyZW50IChwb3NzaWJseSBiYWNrZWQtb2ZmKSB2YWx1ZS4KKwkJCQkgKiBJZiBwcm9jZXNzIGlzIHdhaXRpbmcgZm9yIHNwYWNlLAorCQkJCSAqIHdha2V1cC9zZWx3YWtldXAvc2lnbmFsLiAgSWYgZGF0YQorCQkJCSAqIGFyZSByZWFkeSB0byBzZW5kLCBsZXQgdGNwX291dHB1dAorCQkJCSAqIGRlY2lkZSBiZXR3ZWVuIG1vcmUgb3V0cHV0IG9yIHBlcnNpc3QuCisJCQkJICovCisJCQkJaWYgKHRwLT5zbmRfdW5hID09IHRwLT5zbmRfbWF4KQorCQkJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IDA7CisJCQkJZWxzZSBpZiAodHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXSA9PSAwKQorCQkJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IHRwLT50X3J4dGN1cjsKKworCQkJCS8qCisJCQkJICogVGhlcmUncyByb29tIGluIHNvX3NuZCwgc293d2FrdXAgd2lsbCByZWFkKCkKKwkJCQkgKiBmcm9tIHRoZSBzb2NrZXQgaWYgd2UgY2FuCisJCQkJICovCisvKgkJCQlpZiAoc28tPnNvX3NuZC5zYl9mbGFncyAmIFNCX05PVElGWSkKKyAqCQkJCQlzb3d3YWtldXAoc28pOworICovCisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIGNhbGxlZCBiZWNhdXNlIHNvd3dha2V1cCBtaWdodCBoYXZlCisJCQkJICogcHV0IGRhdGEgaW50byBzb19zbmQuICBTaW5jZSB3ZSBkb24ndCBzbyBzb3d3YWtldXAsCisJCQkJICogd2UgZG9uJ3QgbmVlZCB0aGlzLi4gWFhYPz8/CisJCQkJICovCisJCQkJaWYgKHNvLT5zb19zbmQuc2JfY2MpCisJCQkJCSh2b2lkKSB0Y3Bfb3V0cHV0KHRwKTsKKworCQkJCXJldHVybjsKKwkJCX0KKwkJfSBlbHNlIGlmICh0aS0+dGlfYWNrID09IHRwLT5zbmRfdW5hICYmCisJCSAgICB0Y3BmcmFnX2xpc3RfZW1wdHkodHApICYmCisJCSAgICB0aS0+dGlfbGVuIDw9IHNic3BhY2UoJnNvLT5zb19yY3YpKSB7CisJCQkvKgorCQkJICogdGhpcyBpcyBhIHB1cmUsIGluLXNlcXVlbmNlIGRhdGEgcGFja2V0CisJCQkgKiB3aXRoIG5vdGhpbmcgb24gdGhlIHJlYXNzZW1ibHkgcXVldWUgYW5kCisJCQkgKiB3ZSBoYXZlIGVub3VnaCBidWZmZXIgc3BhY2UgdG8gdGFrZSBpdC4KKwkJCSAqLworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcHJlZGRhdCsrKTsKKwkJCXRwLT5yY3Zfbnh0ICs9IHRpLT50aV9sZW47CisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZwYWNrKyspOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2Ynl0ZSArPSB0aS0+dGlfbGVuKTsKKwkJCS8qCisJCQkgKiBBZGQgZGF0YSB0byBzb2NrZXQgYnVmZmVyLgorCQkJICovCisJCQlpZiAoc28tPnNvX2VtdSkgeworCQkJCWlmICh0Y3BfZW11KHNvLG0pKSBzYmFwcGVuZChzbywgbSk7CisJCQl9IGVsc2UKKwkJCQlzYmFwcGVuZChzbywgbSk7CisKKwkJCS8qCisJCQkgKiBYWFggVGhpcyBpcyBjYWxsZWQgd2hlbiBkYXRhIGFycml2ZXMuICBMYXRlciwgY2hlY2sKKwkJCSAqIGlmIHdlIGNhbiBhY3R1YWxseSB3cml0ZSgpIHRvIHRoZSBzb2NrZXQKKwkJCSAqIFhYWCBOZWVkIHRvIGNoZWNrPyBJdCdzIGJlIE5PTl9CTE9DS0lORworCQkJICovCisvKgkJCXNvcndha2V1cChzbyk7ICovCisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIGEgc2hvcnQgcGFja2V0LCB0aGVuIEFDSyBub3cgLSB3aXRoIE5hZ2VsCisJCQkgKgljb25nZXN0aW9uIGF2b2lkYW5jZSBzZW5kZXIgd29uJ3Qgc2VuZCBtb3JlIHVudGlsCisJCQkgKgloZSBnZXRzIGFuIEFDSy4KKwkJCSAqCisJCQkgKiBJdCBpcyBiZXR0ZXIgdG8gbm90IGRlbGF5IGFja3MgYXQgYWxsIHRvIG1heGltaXplCisJCQkgKiBUQ1AgdGhyb3VnaHB1dC4gIFNlZSBSRkMgMjU4MS4KKwkJCSAqLworCQkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCQkJdGNwX291dHB1dCh0cCk7CisJCQlyZXR1cm47CisJCX0KKwl9IC8qIGhlYWRlciBwcmVkaWN0aW9uICovCisJLyoKKwkgKiBDYWxjdWxhdGUgYW1vdW50IG9mIHNwYWNlIGluIHJlY2VpdmUgd2luZG93LAorCSAqIGFuZCB0aGVuIGRvIFRDUCBpbnB1dCBwcm9jZXNzaW5nLgorCSAqIFJlY2VpdmUgd2luZG93IGlzIGFtb3VudCBvZiBzcGFjZSBpbiByY3YgcXVldWUsCisJICogYnV0IG5vdCBsZXNzIHRoYW4gYWR2ZXJ0aXNlZCB3aW5kb3cuCisJICovCisJeyBpbnQgd2luOworICAgICAgICAgIHdpbiA9IHNic3BhY2UoJnNvLT5zb19yY3YpOworCSAgaWYgKHdpbiA8IDApCisJICAgIHdpbiA9IDA7CisJICB0cC0+cmN2X3duZCA9IG1heCh3aW4sIChpbnQpKHRwLT5yY3ZfYWR2IC0gdHAtPnJjdl9ueHQpKTsKKwl9CisKKwlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwkvKgorCSAqIElmIHRoZSBzdGF0ZSBpcyBMSVNURU4gdGhlbiBpZ25vcmUgc2VnbWVudCBpZiBpdCBjb250YWlucyBhbiBSU1QuCisJICogSWYgdGhlIHNlZ21lbnQgY29udGFpbnMgYW4gQUNLIHRoZW4gaXQgaXMgYmFkIGFuZCBzZW5kIGEgUlNULgorCSAqIElmIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBTWU4gdGhlbiBpdCBpcyBub3QgaW50ZXJlc3Rpbmc7IGRyb3AgaXQuCisJICogRG9uJ3QgYm90aGVyIHJlc3BvbmRpbmcgaWYgdGhlIGRlc3RpbmF0aW9uIHdhcyBhIGJyb2FkY2FzdC4KKwkgKiBPdGhlcndpc2UgaW5pdGlhbGl6ZSB0cC0+cmN2X254dCwgYW5kIHRwLT5pcnMsIHNlbGVjdCBhbiBpbml0aWFsCisJICogdHAtPmlzcywgYW5kIHNlbmQgYSBzZWdtZW50OgorCSAqICAgICA8U0VRPUlTUz48QUNLPVJDVl9OWFQ+PENUTD1TWU4sQUNLPgorCSAqIEFsc28gaW5pdGlhbGl6ZSB0cC0+c25kX254dCB0byB0cC0+aXNzKzEgYW5kIHRwLT5zbmRfdW5hIHRvIHRwLT5pc3MuCisJICogRmlsbCBpbiByZW1vdGUgcGVlciBhZGRyZXNzIGZpZWxkcyBpZiBub3QgcHJldmlvdXNseSBzcGVjaWZpZWQuCisJICogRW50ZXIgU1lOX1JFQ0VJVkVEIHN0YXRlLCBhbmQgcHJvY2VzcyBhbnkgb3RoZXIgZmllbGRzIG9mIHRoaXMKKwkgKiBzZWdtZW50IGluIHRoaXMgc3RhdGUuCisJICovCisJY2FzZSBUQ1BTX0xJU1RFTjogeworCisJICBpZiAodGlmbGFncyAmIFRIX1JTVCkKKwkgICAgZ290byBkcm9wOworCSAgaWYgKHRpZmxhZ3MgJiBUSF9BQ0spCisJICAgIGdvdG8gZHJvcHdpdGhyZXNldDsKKwkgIGlmICgodGlmbGFncyAmIFRIX1NZTikgPT0gMCkKKwkgICAgZ290byBkcm9wOworCisJICAvKgorCSAgICogVGhpcyBoYXMgd2F5IHRvbyBtYW55IGdvdG9zLi4uCisJICAgKiBCdXQgYSBiaXQgb2Ygc3BhZ2hldHRpIGNvZGUgbmV2ZXIgaHVydCBhbnlib2R5IDopCisJICAgKi8KKworCSAgLyoKKwkgICAqIElmIHRoaXMgaXMgZGVzdGluZWQgZm9yIHRoZSBjb250cm9sIGFkZHJlc3MsIHRoZW4gZmxhZyB0bworCSAgICogdGNwX2N0bCBvbmNlIGNvbm5lY3RlZCwgb3RoZXJ3aXNlIGNvbm5lY3QKKwkgICAqLworCSAgaWYgKChzby0+c29fZmFkZHJfaXAgJiAweGZmZmZmZjAwKSA9PSBzcGVjaWFsX2FkZHJfaXApIHsKKwkgICAgaW50IGxhc3RieXRlPXNvLT5zb19mYWRkcl9pcCAmIDB4ZmY7CisJICAgIGlmIChsYXN0Ynl0ZSE9Q1RMX0FMSUFTICYmIGxhc3RieXRlIT1DVExfRE5TKSB7CisjaWYgMAorCSAgICAgIGlmKGxhc3RieXRlPT1DVExfQ01EIHx8IGxhc3RieXRlPT1DVExfRVhFQykgeworCQkvKiBDb21tYW5kIG9yIGV4ZWMgYWRyZXNzICovCisJCXNvLT5zb19zdGF0ZSB8PSBTU19DVEw7CisJICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgeworCQkvKiBNYXkgYmUgYW4gYWRkIGV4ZWMgKi8KKwkJZm9yKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpIHsKKwkJICBpZihleF9wdHItPmV4X2Zwb3J0ID09IHNvLT5zb19mYWRkcl9wb3J0ICYmCisJCSAgICAgbGFzdGJ5dGUgPT0gZXhfcHRyLT5leF9hZGRyKSB7CisJCSAgICBzby0+c29fc3RhdGUgfD0gU1NfQ1RMOworCQkgICAgYnJlYWs7CisJCSAgfQorCQl9CisJICAgICAgfQorCSAgICAgIGlmKHNvLT5zb19zdGF0ZSAmIFNTX0NUTCkgZ290byBjb250X2lucHV0OworCSAgICB9CisJICAgIC8qIENUTF9BTElBUzogRG8gbm90aGluZywgdGNwX2Zjb25uZWN0IHdpbGwgYmUgY2FsbGVkIG9uIGl0ICovCisJICB9CisKKwkgIGlmIChzby0+c29fZW11ICYgRU1VX05PQ09OTkVDVCkgeworCSAgICBzby0+c29fZW11ICY9IH5FTVVfTk9DT05ORUNUOworCSAgICBnb3RvIGNvbnRfaW5wdXQ7CisJICB9CisKKwkgIGlmKCh0Y3BfZmNvbm5lY3Qoc28pID09IC0xKSAmJiAoZXJybm8gIT0gRUlOUFJPR1JFU1MpICYmCisJICAgICAoZXJybm8gIT0gRVdPVUxEQkxPQ0spICYmIChlcnJubyAhPSBFQUdBSU4pKSB7CisJICAgIHVfY2hhciBjb2RlPUlDTVBfVU5SRUFDSF9ORVQ7CisJICAgIERFQlVHX01JU0MoKGRmZCwiIHRjcCBmY29ubmVjdCBlcnJubyA9ICVkLSVzXG4iLAorCQkJZXJybm8sZXJybm9fc3RyKSk7CisJICAgIGlmKGVycm5vID09IEVDT05OUkVGVVNFRCkgeworCSAgICAgIC8qIEFDSyB0aGUgU1lOLCBzZW5kIFJTVCB0byByZWZ1c2UgdGhlIGNvbm5lY3Rpb24gKi8KKwkgICAgICB0Y3BfcmVzcG9uZCh0cCwgdGksIG0sIHRpLT50aV9zZXErMSwgKHRjcF9zZXEpMCwKKwkJCSAgVEhfUlNUfFRIX0FDSyk7CisJICAgIH0gZWxzZSB7CisJICAgICAgaWYoZXJybm8gPT0gRUhPU1RVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9IT1NUOworCSAgICAgIEhUT05MKHRpLT50aV9zZXEpOyAgICAgICAgICAgICAvKiByZXN0b3JlIHRjcCBoZWFkZXIgKi8KKwkgICAgICBIVE9OTCh0aS0+dGlfYWNrKTsKKwkgICAgICBIVE9OUyh0aS0+dGlfd2luKTsKKwkgICAgICBIVE9OUyh0aS0+dGlfdXJwKTsKKwkgICAgICBtLT5tX2RhdGEgLT0gc2l6ZW9mKHN0cnVjdCB0Y3BpcGhkcikrb2ZmLXNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwkgICAgICBtLT5tX2xlbiAgKz0gc2l6ZW9mKHN0cnVjdCB0Y3BpcGhkcikrb2ZmLXNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwkgICAgICAqaXA9c2F2ZV9pcDsKKwkgICAgICBpY21wX2Vycm9yKG0sIElDTVBfVU5SRUFDSCxjb2RlLCAwLGVycm5vX3N0cik7CisJICAgIH0KKwkgICAgdHAgPSB0Y3BfY2xvc2UodHApOworCSAgICBtX2ZyZWUobSk7CisJICB9IGVsc2UgeworCSAgICAvKgorCSAgICAgKiBIYXZlbid0IGNvbm5lY3RlZCB5ZXQsIHNhdmUgdGhlIGN1cnJlbnQgbWJ1ZgorCSAgICAgKiBhbmQgdGksIGFuZCByZXR1cm4KKwkgICAgICogWFhYIFNvbWUgT1MncyBkb24ndCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGNvbm5lY3QoKQorCSAgICAgKiBzdWNjZWVkZWQgb3Igbm90LiAgU28gd2UgbXVzdCB0aW1lIGl0IG91dC4KKwkgICAgICovCisJICAgIHNvLT5zb19tID0gbTsKKwkgICAgc28tPnNvX3RpID0gdGk7CisJICAgIHRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQX0lOSVQ7CisJICAgIHRwLT50X3N0YXRlID0gVENQU19TWU5fUkVDRUlWRUQ7CisJICB9CisJICByZXR1cm47CisKKwljb250X2Nvbm46CisJICAvKiBtPT1OVUxMCisJICAgKiBDaGVjayBpZiB0aGUgY29ubmVjdCBzdWNjZWVkZWQKKwkgICAqLworCSAgaWYgKHNvLT5zb19zdGF0ZSAmIFNTX05PRkRSRUYpIHsKKwkgICAgdHAgPSB0Y3BfY2xvc2UodHApOworCSAgICBnb3RvIGRyb3B3aXRocmVzZXQ7CisJICB9CisJY29udF9pbnB1dDoKKwkgIHRjcF90ZW1wbGF0ZSh0cCk7CisKKwkgIGlmIChvcHRwKQorCSAgICB0Y3BfZG9vcHRpb25zKHRwLCAodV9jaGFyICopb3B0cCwgb3B0bGVuLCB0aSk7CisJICAvKiAsICovCisJICAvKgkJCQkmdHNfcHJlc2VudCwgJnRzX3ZhbCwgJnRzX2Vjcik7ICovCisKKwkgIGlmIChpc3MpCisJICAgIHRwLT5pc3MgPSBpc3M7CisJICBlbHNlCisJICAgIHRwLT5pc3MgPSB0Y3BfaXNzOworCSAgdGNwX2lzcyArPSBUQ1BfSVNTSU5DUi8yOworCSAgdHAtPmlycyA9IHRpLT50aV9zZXE7CisJICB0Y3Bfc2VuZHNlcWluaXQodHApOworCSAgdGNwX3JjdnNlcWluaXQodHApOworCSAgdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCSAgdHAtPnRfc3RhdGUgPSBUQ1BTX1NZTl9SRUNFSVZFRDsKKwkgIHRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQX0lOSVQ7CisJICBTVEFUKHRjcHN0YXQudGNwc19hY2NlcHRzKyspOworCSAgZ290byB0cmltdGhlbnN0ZXA2OworCX0gLyogY2FzZSBUQ1BTX0xJU1RFTiAqLworCisJLyoKKwkgKiBJZiB0aGUgc3RhdGUgaXMgU1lOX1NFTlQ6CisJICoJaWYgc2VnIGNvbnRhaW5zIGFuIEFDSywgYnV0IG5vdCBmb3Igb3VyIFNZTiwgZHJvcCB0aGUgaW5wdXQuCisJICoJaWYgc2VnIGNvbnRhaW5zIGEgUlNULCB0aGVuIGRyb3AgdGhlIGNvbm5lY3Rpb24uCisJICoJaWYgc2VnIGRvZXMgbm90IGNvbnRhaW4gU1lOLCB0aGVuIGRyb3AgaXQuCisJICogT3RoZXJ3aXNlIHRoaXMgaXMgYW4gYWNjZXB0YWJsZSBTWU4gc2VnbWVudAorCSAqCWluaXRpYWxpemUgdHAtPnJjdl9ueHQgYW5kIHRwLT5pcnMKKwkgKglpZiBzZWcgY29udGFpbnMgYWNrIHRoZW4gYWR2YW5jZSB0cC0+c25kX3VuYQorCSAqCWlmIFNZTiBoYXMgYmVlbiBhY2tlZCBjaGFuZ2UgdG8gRVNUQUJMSVNIRUQgZWxzZSBTWU5fUkNWRCBzdGF0ZQorCSAqCWFycmFuZ2UgZm9yIHNlZ21lbnQgdG8gYmUgYWNrZWQgKGV2ZW50dWFsbHkpCisJICoJY29udGludWUgcHJvY2Vzc2luZyByZXN0IG9mIGRhdGEvY29udHJvbHMsIGJlZ2lubmluZyB3aXRoIFVSRworCSAqLworCWNhc2UgVENQU19TWU5fU0VOVDoKKwkJaWYgKCh0aWZsYWdzICYgVEhfQUNLKSAmJgorCQkgICAgKFNFUV9MRVEodGktPnRpX2FjaywgdHAtPmlzcykgfHwKKwkJICAgICBTRVFfR1QodGktPnRpX2FjaywgdHAtPnNuZF9tYXgpKSkKKwkJCWdvdG8gZHJvcHdpdGhyZXNldDsKKworCQlpZiAodGlmbGFncyAmIFRIX1JTVCkgeworCQkJaWYgKHRpZmxhZ3MgJiBUSF9BQ0spCisJCQkJdHAgPSB0Y3BfZHJvcCh0cCwwKTsgLyogWFhYIENoZWNrIHRfc29mdGVycm9yISAqLworCQkJZ290byBkcm9wOworCQl9CisKKwkJaWYgKCh0aWZsYWdzICYgVEhfU1lOKSA9PSAwKQorCQkJZ290byBkcm9wOworCQlpZiAodGlmbGFncyAmIFRIX0FDSykgeworCQkJdHAtPnNuZF91bmEgPSB0aS0+dGlfYWNrOworCQkJaWYgKFNFUV9MVCh0cC0+c25kX254dCwgdHAtPnNuZF91bmEpKQorCQkJCXRwLT5zbmRfbnh0ID0gdHAtPnNuZF91bmE7CisJCX0KKworCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IDA7CisJCXRwLT5pcnMgPSB0aS0+dGlfc2VxOworCQl0Y3BfcmN2c2VxaW5pdCh0cCk7CisJCXRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsKKwkJaWYgKHRpZmxhZ3MgJiBUSF9BQ0sgJiYgU0VRX0dUKHRwLT5zbmRfdW5hLCB0cC0+aXNzKSkgeworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfY29ubmVjdHMrKyk7CisJCQlzb2lzZmNvbm5lY3RlZChzbyk7CisJCQl0cC0+dF9zdGF0ZSA9IFRDUFNfRVNUQUJMSVNIRUQ7CisKKwkJCS8qIERvIHdpbmRvdyBzY2FsaW5nIG9uIHRoaXMgY29ubmVjdGlvbj8gKi8KKy8qCQkJaWYgKCh0cC0+dF9mbGFncyAmIChURl9SQ1ZEX1NDQUxFfFRGX1JFUV9TQ0FMRSkpID09CisgKgkJCQkoVEZfUkNWRF9TQ0FMRXxURl9SRVFfU0NBTEUpKSB7CisgKiAJCQkJdHAtPnNuZF9zY2FsZSA9IHRwLT5yZXF1ZXN0ZWRfc19zY2FsZTsKKyAqCQkJCXRwLT5yY3Zfc2NhbGUgPSB0cC0+cmVxdWVzdF9yX3NjYWxlOworICoJCQl9CisgKi8KKwkJCSh2b2lkKSB0Y3BfcmVhc3ModHAsIChzdHJ1Y3QgdGNwaXBoZHIgKikwLAorCQkJCShzdHJ1Y3QgbWJ1ZiAqKTApOworCQkJLyoKKwkJCSAqIGlmIHdlIGRpZG4ndCBoYXZlIHRvIHJldHJhbnNtaXQgdGhlIFNZTiwKKwkJCSAqIHVzZSBpdHMgcnR0IGFzIG91ciBpbml0aWFsIHNydHQgJiBydHQgdmFyLgorCQkJICovCisJCQlpZiAodHAtPnRfcnR0KQorCQkJCXRjcF94bWl0X3RpbWVyKHRwLCB0cC0+dF9ydHQpOworCQl9IGVsc2UKKwkJCXRwLT50X3N0YXRlID0gVENQU19TWU5fUkVDRUlWRUQ7CisKK3RyaW10aGVuc3RlcDY6CisJCS8qCisJCSAqIEFkdmFuY2UgdGktPnRpX3NlcSB0byBjb3JyZXNwb25kIHRvIGZpcnN0IGRhdGEgYnl0ZS4KKwkJICogSWYgZGF0YSwgdHJpbSB0byBzdGF5IHdpdGhpbiB3aW5kb3csCisJCSAqIGRyb3BwaW5nIEZJTiBpZiBuZWNlc3NhcnkuCisJCSAqLworCQl0aS0+dGlfc2VxKys7CisJCWlmICh0aS0+dGlfbGVuID4gdHAtPnJjdl93bmQpIHsKKwkJCXRvZHJvcCA9IHRpLT50aV9sZW4gLSB0cC0+cmN2X3duZDsKKwkJCW1fYWRqKG0sIC10b2Ryb3ApOworCQkJdGktPnRpX2xlbiA9IHRwLT5yY3Zfd25kOworCQkJdGlmbGFncyAmPSB+VEhfRklOOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFja2FmdGVyd2luKyspOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2Ynl0ZWFmdGVyd2luICs9IHRvZHJvcCk7CisJCX0KKwkJdHAtPnNuZF93bDEgPSB0aS0+dGlfc2VxIC0gMTsKKwkJdHAtPnJjdl91cCA9IHRpLT50aV9zZXE7CisJCWdvdG8gc3RlcDY7CisJfSAvKiBzd2l0Y2ggdHAtPnRfc3RhdGUgKi8KKwkvKgorCSAqIFN0YXRlcyBvdGhlciB0aGFuIExJU1RFTiBvciBTWU5fU0VOVC4KKwkgKiBGaXJzdCBjaGVjayB0aW1lc3RhbXAsIGlmIHByZXNlbnQuCisJICogVGhlbiBjaGVjayB0aGF0IGF0IGxlYXN0IHNvbWUgYnl0ZXMgb2Ygc2VnbWVudCBhcmUgd2l0aGluCisJICogcmVjZWl2ZSB3aW5kb3cuICBJZiBzZWdtZW50IGJlZ2lucyBiZWZvcmUgcmN2X254dCwKKwkgKiBkcm9wIGxlYWRpbmcgZGF0YSAoYW5kIFNZTik7IGlmIG5vdGhpbmcgbGVmdCwganVzdCBhY2suCisJICoKKwkgKiBSRkMgMTMyMyBQQVdTOiBJZiB3ZSBoYXZlIGEgdGltZXN0YW1wIHJlcGx5IG9uIHRoaXMgc2VnbWVudAorCSAqIGFuZCBpdCdzIGxlc3MgdGhhbiB0c19yZWNlbnQsIGRyb3AgaXQuCisJICovCisvKglpZiAodHNfcHJlc2VudCAmJiAodGlmbGFncyAmIFRIX1JTVCkgPT0gMCAmJiB0cC0+dHNfcmVjZW50ICYmCisgKgkgICAgVFNUTVBfTFQodHNfdmFsLCB0cC0+dHNfcmVjZW50KSkgeworICoKKyAqLwkJLyogQ2hlY2sgdG8gc2VlIGlmIHRzX3JlY2VudCBpcyBvdmVyIDI0IGRheXMgb2xkLiAgKi8KKy8qCQlpZiAoKGludCkodGNwX25vdyAtIHRwLT50c19yZWNlbnRfYWdlKSA+IFRDUF9QQVdTX0lETEUpIHsKKyAqLwkJCS8qCisgKgkJCSAqIEludmFsaWRhdGUgdHNfcmVjZW50LiAgSWYgdGhpcyBzZWdtZW50IHVwZGF0ZXMKKyAqCQkJICogdHNfcmVjZW50LCB0aGUgYWdlIHdpbGwgYmUgcmVzZXQgbGF0ZXIgYW5kIHRzX3JlY2VudAorICoJCQkgKiB3aWxsIGdldCBhIHZhbGlkIHZhbHVlLiAgSWYgaXQgZG9lcyBub3QsIHNldHRpbmcKKyAqCQkJICogdHNfcmVjZW50IHRvIHplcm8gd2lsbCBhdCBsZWFzdCBzYXRpc2Z5IHRoZQorICoJCQkgKiByZXF1aXJlbWVudCB0aGF0IHplcm8gYmUgcGxhY2VkIGluIHRoZSB0aW1lc3RhbXAKKyAqCQkJICogZWNobyByZXBseSB3aGVuIHRzX3JlY2VudCBpc24ndCB2YWxpZC4gIFRoZQorICoJCQkgKiBhZ2UgaXNuJ3QgcmVzZXQgdW50aWwgd2UgZ2V0IGEgdmFsaWQgdHNfcmVjZW50CisgKgkJCSAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBvdXQtb2Ytb3JkZXIgc2VnbWVudHMgdG8gYmUKKyAqCQkJICogZHJvcHBlZCB3aGVuIHRzX3JlY2VudCBpcyBvbGQuCisgKgkJCSAqLworLyoJCQl0cC0+dHNfcmVjZW50ID0gMDsKKyAqCQl9IGVsc2UgeworICoJCQl0Y3BzdGF0LnRjcHNfcmN2ZHVwcGFjaysrOworICoJCQl0Y3BzdGF0LnRjcHNfcmN2ZHVwYnl0ZSArPSB0aS0+dGlfbGVuOworICoJCQl0Y3BzdGF0LnRjcHNfcGF3c2Ryb3ArKzsKKyAqCQkJZ290byBkcm9wYWZ0ZXJhY2s7CisgKgkJfQorICoJfQorICovCisKKwl0b2Ryb3AgPSB0cC0+cmN2X254dCAtIHRpLT50aV9zZXE7CisJaWYgKHRvZHJvcCA+IDApIHsKKwkJaWYgKHRpZmxhZ3MgJiBUSF9TWU4pIHsKKwkJCXRpZmxhZ3MgJj0gflRIX1NZTjsKKwkJCXRpLT50aV9zZXErKzsKKwkJCWlmICh0aS0+dGlfdXJwID4gMSkKKwkJCQl0aS0+dGlfdXJwLS07CisJCQllbHNlCisJCQkJdGlmbGFncyAmPSB+VEhfVVJHOworCQkJdG9kcm9wLS07CisJCX0KKwkJLyoKKwkJICogRm9sbG93aW5nIGlmIHN0YXRlbWVudCBmcm9tIFN0ZXZlbnMsIHZvbC4gMiwgcC4gOTYwLgorCQkgKi8KKwkJaWYgKHRvZHJvcCA+IHRpLT50aV9sZW4KKwkJICAgIHx8ICh0b2Ryb3AgPT0gdGktPnRpX2xlbiAmJiAodGlmbGFncyAmIFRIX0ZJTikgPT0gMCkpIHsKKwkJCS8qCisJCQkgKiBBbnkgdmFsaWQgRklOIG11c3QgYmUgdG8gdGhlIGxlZnQgb2YgdGhlIHdpbmRvdy4KKwkJCSAqIEF0IHRoaXMgcG9pbnQgdGhlIEZJTiBtdXN0IGJlIGEgZHVwbGljYXRlIG9yIG91dAorCQkJICogb2Ygc2VxdWVuY2U7IGRyb3AgaXQuCisJCQkgKi8KKwkJCXRpZmxhZ3MgJj0gflRIX0ZJTjsKKworCQkJLyoKKwkJCSAqIFNlbmQgYW4gQUNLIHRvIHJlc3luY2hyb25pemUgYW5kIGRyb3AgYW55IGRhdGEuCisJCQkgKiBCdXQga2VlcCBvbiBwcm9jZXNzaW5nIGZvciBSU1Qgb3IgQUNLLgorCQkJICovCisJCQl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJCQl0b2Ryb3AgPSB0aS0+dGlfbGVuOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2ZHVwcGFjaysrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmR1cGJ5dGUgKz0gdG9kcm9wKTsKKwkJfSBlbHNlIHsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdnBhcnRkdXBwYWNrKyspOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFydGR1cGJ5dGUgKz0gdG9kcm9wKTsKKwkJfQorCQltX2FkaihtLCB0b2Ryb3ApOworCQl0aS0+dGlfc2VxICs9IHRvZHJvcDsKKwkJdGktPnRpX2xlbiAtPSB0b2Ryb3A7CisJCWlmICh0aS0+dGlfdXJwID4gdG9kcm9wKQorCQkJdGktPnRpX3VycCAtPSB0b2Ryb3A7CisJCWVsc2UgeworCQkJdGlmbGFncyAmPSB+VEhfVVJHOworCQkJdGktPnRpX3VycCA9IDA7CisJCX0KKwl9CisJLyoKKwkgKiBJZiBuZXcgZGF0YSBhcmUgcmVjZWl2ZWQgb24gYSBjb25uZWN0aW9uIGFmdGVyIHRoZQorCSAqIHVzZXIgcHJvY2Vzc2VzIGFyZSBnb25lLCB0aGVuIFJTVCB0aGUgb3RoZXIgZW5kLgorCSAqLworCWlmICgoc28tPnNvX3N0YXRlICYgU1NfTk9GRFJFRikgJiYKKwkgICAgdHAtPnRfc3RhdGUgPiBUQ1BTX0NMT1NFX1dBSVQgJiYgdGktPnRpX2xlbikgeworCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmFmdGVyY2xvc2UrKyk7CisJCWdvdG8gZHJvcHdpdGhyZXNldDsKKwl9CisKKwkvKgorCSAqIElmIHNlZ21lbnQgZW5kcyBhZnRlciB3aW5kb3csIGRyb3AgdHJhaWxpbmcgZGF0YQorCSAqIChhbmQgUFVTSCBhbmQgRklOKTsgaWYgbm90aGluZyBsZWZ0LCBqdXN0IEFDSy4KKwkgKi8KKwl0b2Ryb3AgPSAodGktPnRpX3NlcSt0aS0+dGlfbGVuKSAtICh0cC0+cmN2X254dCt0cC0+cmN2X3duZCk7CisJaWYgKHRvZHJvcCA+IDApIHsKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFja2FmdGVyd2luKyspOworCQlpZiAodG9kcm9wID49IHRpLT50aV9sZW4pIHsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmJ5dGVhZnRlcndpbiArPSB0aS0+dGlfbGVuKTsKKwkJCS8qCisJCQkgKiBJZiBhIG5ldyBjb25uZWN0aW9uIHJlcXVlc3QgaXMgcmVjZWl2ZWQKKwkJCSAqIHdoaWxlIGluIFRJTUVfV0FJVCwgZHJvcCB0aGUgb2xkIGNvbm5lY3Rpb24KKwkJCSAqIGFuZCBzdGFydCBvdmVyIGlmIHRoZSBzZXF1ZW5jZSBudW1iZXJzCisJCQkgKiBhcmUgYWJvdmUgdGhlIHByZXZpb3VzIG9uZXMuCisJCQkgKi8KKwkJCWlmICh0aWZsYWdzICYgVEhfU1lOICYmCisJCQkgICAgdHAtPnRfc3RhdGUgPT0gVENQU19USU1FX1dBSVQgJiYKKwkJCSAgICBTRVFfR1QodGktPnRpX3NlcSwgdHAtPnJjdl9ueHQpKSB7CisJCQkJaXNzID0gdHAtPnJjdl9ueHQgKyBUQ1BfSVNTSU5DUjsKKwkJCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCQkJZ290byBmaW5kc287CisJCQl9CisJCQkvKgorCQkJICogSWYgd2luZG93IGlzIGNsb3NlZCBjYW4gb25seSB0YWtlIHNlZ21lbnRzIGF0CisJCQkgKiB3aW5kb3cgZWRnZSwgYW5kIGhhdmUgdG8gZHJvcCBkYXRhIGFuZCBQVVNIIGZyb20KKwkJCSAqIGluY29taW5nIHNlZ21lbnRzLiAgQ29udGludWUgcHJvY2Vzc2luZywgYnV0CisJCQkgKiByZW1lbWJlciB0byBhY2suICBPdGhlcndpc2UsIGRyb3Agc2VnbWVudAorCQkJICogYW5kIGFjay4KKwkJCSAqLworCQkJaWYgKHRwLT5yY3Zfd25kID09IDAgJiYgdGktPnRpX3NlcSA9PSB0cC0+cmN2X254dCkgeworCQkJCXRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsKKwkJCQlTVEFUKHRjcHN0YXQudGNwc19yY3Z3aW5wcm9iZSsrKTsKKwkJCX0gZWxzZQorCQkJCWdvdG8gZHJvcGFmdGVyYWNrOworCQl9IGVsc2UKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmJ5dGVhZnRlcndpbiArPSB0b2Ryb3ApOworCQltX2FkaihtLCAtdG9kcm9wKTsKKwkJdGktPnRpX2xlbiAtPSB0b2Ryb3A7CisJCXRpZmxhZ3MgJj0gfihUSF9QVVNIfFRIX0ZJTik7CisJfQorCisJLyoKKwkgKiBJZiBsYXN0IEFDSyBmYWxscyB3aXRoaW4gdGhpcyBzZWdtZW50J3Mgc2VxdWVuY2UgbnVtYmVycywKKwkgKiByZWNvcmQgaXRzIHRpbWVzdGFtcC4KKwkgKi8KKy8qCWlmICh0c19wcmVzZW50ICYmIFNFUV9MRVEodGktPnRpX3NlcSwgdHAtPmxhc3RfYWNrX3NlbnQpICYmCisgKgkgICAgU0VRX0xUKHRwLT5sYXN0X2Fja19zZW50LCB0aS0+dGlfc2VxICsgdGktPnRpX2xlbiArCisgKgkJICAgKCh0aWZsYWdzICYgKFRIX1NZTnxUSF9GSU4pKSAhPSAwKSkpIHsKKyAqCQl0cC0+dHNfcmVjZW50X2FnZSA9IHRjcF9ub3c7CisgKgkJdHAtPnRzX3JlY2VudCA9IHRzX3ZhbDsKKyAqCX0KKyAqLworCisJLyoKKwkgKiBJZiB0aGUgUlNUIGJpdCBpcyBzZXQgZXhhbWluZSB0aGUgc3RhdGU6CisJICogICAgU1lOX1JFQ0VJVkVEIFNUQVRFOgorCSAqCUlmIHBhc3NpdmUgb3BlbiwgcmV0dXJuIHRvIExJU1RFTiBzdGF0ZS4KKwkgKglJZiBhY3RpdmUgb3BlbiwgaW5mb3JtIHVzZXIgdGhhdCBjb25uZWN0aW9uIHdhcyByZWZ1c2VkLgorCSAqICAgIEVTVEFCTElTSEVELCBGSU5fV0FJVF8xLCBGSU5fV0FJVDIsIENMT1NFX1dBSVQgU1RBVEVTOgorCSAqCUluZm9ybSB1c2VyIHRoYXQgY29ubmVjdGlvbiB3YXMgcmVzZXQsIGFuZCBjbG9zZSB0Y2IuCisJICogICAgQ0xPU0lORywgTEFTVF9BQ0ssIFRJTUVfV0FJVCBTVEFURVMKKwkgKglDbG9zZSB0aGUgdGNiLgorCSAqLworCWlmICh0aWZsYWdzJlRIX1JTVCkgc3dpdGNoICh0cC0+dF9zdGF0ZSkgeworCisJY2FzZSBUQ1BTX1NZTl9SRUNFSVZFRDoKKy8qCQlzby0+c29fZXJyb3IgPSBFQ09OTlJFRlVTRUQ7ICovCisJCWdvdG8gY2xvc2U7CisKKwljYXNlIFRDUFNfRVNUQUJMSVNIRUQ6CisJY2FzZSBUQ1BTX0ZJTl9XQUlUXzE6CisJY2FzZSBUQ1BTX0ZJTl9XQUlUXzI6CisJY2FzZSBUQ1BTX0NMT1NFX1dBSVQ6CisvKgkJc28tPnNvX2Vycm9yID0gRUNPTk5SRVNFVDsgKi8KKwljbG9zZToKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfZHJvcHMrKyk7CisJCXRwID0gdGNwX2Nsb3NlKHRwKTsKKwkJZ290byBkcm9wOworCisJY2FzZSBUQ1BTX0NMT1NJTkc6CisJY2FzZSBUQ1BTX0xBU1RfQUNLOgorCWNhc2UgVENQU19USU1FX1dBSVQ6CisJCXRwID0gdGNwX2Nsb3NlKHRwKTsKKwkJZ290byBkcm9wOworCX0KKworCS8qCisJICogSWYgYSBTWU4gaXMgaW4gdGhlIHdpbmRvdywgdGhlbiB0aGlzIGlzIGFuCisJICogZXJyb3IgYW5kIHdlIHNlbmQgYW4gUlNUIGFuZCBkcm9wIHRoZSBjb25uZWN0aW9uLgorCSAqLworCWlmICh0aWZsYWdzICYgVEhfU1lOKSB7CisJCXRwID0gdGNwX2Ryb3AodHAsMCk7CisJCWdvdG8gZHJvcHdpdGhyZXNldDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBBQ0sgYml0IGlzIG9mZiB3ZSBkcm9wIHRoZSBzZWdtZW50IGFuZCByZXR1cm4uCisJICovCisJaWYgKCh0aWZsYWdzICYgVEhfQUNLKSA9PSAwKSBnb3RvIGRyb3A7CisKKwkvKgorCSAqIEFjayBwcm9jZXNzaW5nLgorCSAqLworCXN3aXRjaCAodHAtPnRfc3RhdGUpIHsKKwkvKgorCSAqIEluIFNZTl9SRUNFSVZFRCBzdGF0ZSBpZiB0aGUgYWNrIEFDS3Mgb3VyIFNZTiB0aGVuIGVudGVyCisJICogRVNUQUJMSVNIRUQgc3RhdGUgYW5kIGNvbnRpbnVlIHByb2Nlc3NpbmcsIG90aGVyd2lzZQorCSAqIHNlbmQgYW4gUlNULiAgdW5hPD1hY2s8PW1heAorCSAqLworCWNhc2UgVENQU19TWU5fUkVDRUlWRUQ6CisKKwkJaWYgKFNFUV9HVCh0cC0+c25kX3VuYSwgdGktPnRpX2FjaykgfHwKKwkJICAgIFNFUV9HVCh0aS0+dGlfYWNrLCB0cC0+c25kX21heCkpCisJCQlnb3RvIGRyb3B3aXRocmVzZXQ7CisJCVNUQVQodGNwc3RhdC50Y3BzX2Nvbm5lY3RzKyspOworCQl0cC0+dF9zdGF0ZSA9IFRDUFNfRVNUQUJMSVNIRUQ7CisJCS8qCisJCSAqIFRoZSBzZW50IFNZTiBpcyBhY2snZWQgd2l0aCBvdXIgc2VxdWVuY2UgbnVtYmVyICsxCisJCSAqIFRoZSBmaXJzdCBkYXRhIGJ5dGUgYWxyZWFkeSBpbiB0aGUgYnVmZmVyIHdpbGwgZ2V0CisJCSAqIGxvc3QgaWYgbm8gY29ycmVjdGlvbiBpcyBtYWRlLiAgVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IKKwkJICogU1NfQ1RMIHNpbmNlIHRoZSBidWZmZXIgaXMgZW1wdHkgb3RoZXJ3aXNlLgorCQkgKiB0cC0+c25kX3VuYSsrOyBvcjoKKwkJICovCisJCXRwLT5zbmRfdW5hPXRpLT50aV9hY2s7CisJCWlmIChzby0+c29fc3RhdGUgJiBTU19DVEwpIHsKKwkJICAvKiBTbyB0Y3BfY3RsIHJlcG9ydHMgdGhlIHJpZ2h0IHN0YXRlICovCisJCSAgcmV0ID0gdGNwX2N0bChzbyk7CisJCSAgaWYgKHJldCA9PSAxKSB7CisJCSAgICBzb2lzZmNvbm5lY3RlZChzbyk7CisJCSAgICBzby0+c29fc3RhdGUgJj0gflNTX0NUTDsgICAvKiBzdWNjZXNzIFhYWCAqLworCQkgIH0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJICAgIHNvLT5zb19zdGF0ZSA9IFNTX05PRkRSRUY7IC8qIENUTF9DTUQgKi8KKwkJICB9IGVsc2UgeworCQkgICAgbmVlZG91dHB1dCA9IDE7CisJCSAgICB0cC0+dF9zdGF0ZSA9IFRDUFNfRklOX1dBSVRfMTsKKwkJICB9CisJCX0gZWxzZSB7CisJCSAgc29pc2Zjb25uZWN0ZWQoc28pOworCQl9CisKKwkJLyogRG8gd2luZG93IHNjYWxpbmc/ICovCisvKgkJaWYgKCh0cC0+dF9mbGFncyAmIChURl9SQ1ZEX1NDQUxFfFRGX1JFUV9TQ0FMRSkpID09CisgKgkJCShURl9SQ1ZEX1NDQUxFfFRGX1JFUV9TQ0FMRSkpIHsKKyAqCQkJdHAtPnNuZF9zY2FsZSA9IHRwLT5yZXF1ZXN0ZWRfc19zY2FsZTsKKyAqCQkJdHAtPnJjdl9zY2FsZSA9IHRwLT5yZXF1ZXN0X3Jfc2NhbGU7CisgKgkJfQorICovCisJCSh2b2lkKSB0Y3BfcmVhc3ModHAsIChzdHJ1Y3QgdGNwaXBoZHIgKikwLCAoc3RydWN0IG1idWYgKikwKTsKKwkJdHAtPnNuZF93bDEgPSB0aS0+dGlfc2VxIC0gMTsKKwkJLyogQXZvaWQgYWNrIHByb2Nlc3Npbmc7IHNuZF91bmE9PXRpX2FjayAgPT4gIGR1cCBhY2sgKi8KKwkJZ290byBzeW5yeF90b19lc3Q7CisJCS8qIGZhbGwgaW50byAuLi4gKi8KKworCS8qCisJICogSW4gRVNUQUJMSVNIRUQgc3RhdGU6IGRyb3AgZHVwbGljYXRlIEFDS3M7IEFDSyBvdXQgb2YgcmFuZ2UKKwkgKiBBQ0tzLiAgSWYgdGhlIGFjayBpcyBpbiB0aGUgcmFuZ2UKKwkgKgl0cC0+c25kX3VuYSA8IHRpLT50aV9hY2sgPD0gdHAtPnNuZF9tYXgKKwkgKiB0aGVuIGFkdmFuY2UgdHAtPnNuZF91bmEgdG8gdGktPnRpX2FjayBhbmQgZHJvcAorCSAqIGRhdGEgZnJvbSB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUuICBJZiB0aGlzIEFDSyByZWZsZWN0cworCSAqIG1vcmUgdXAgdG8gZGF0ZSB3aW5kb3cgaW5mb3JtYXRpb24gd2UgdXBkYXRlIG91ciB3aW5kb3cgaW5mb3JtYXRpb24uCisJICovCisJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgorCWNhc2UgVENQU19GSU5fV0FJVF8xOgorCWNhc2UgVENQU19GSU5fV0FJVF8yOgorCWNhc2UgVENQU19DTE9TRV9XQUlUOgorCWNhc2UgVENQU19DTE9TSU5HOgorCWNhc2UgVENQU19MQVNUX0FDSzoKKwljYXNlIFRDUFNfVElNRV9XQUlUOgorCisJCWlmIChTRVFfTEVRKHRpLT50aV9hY2ssIHRwLT5zbmRfdW5hKSkgeworCQkJaWYgKHRpLT50aV9sZW4gPT0gMCAmJiB0aXdpbiA9PSB0cC0+c25kX3duZCkgeworCQkJICBTVEFUKHRjcHN0YXQudGNwc19yY3ZkdXBhY2srKyk7CisJCQkgIERFQlVHX01JU0MoKGRmZCwiIGR1cCBhY2sgIG0gPSAlbHggIHNvID0gJWx4IFxuIiwKKwkJCQkgICAgICAobG9uZyApbSwgKGxvbmcgKXNvKSk7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBoYXZlIG91dHN0YW5kaW5nIGRhdGEgKG90aGVyIHRoYW4KKwkJCQkgKiBhIHdpbmRvdyBwcm9iZSksIHRoaXMgaXMgYSBjb21wbGV0ZWx5CisJCQkJICogZHVwbGljYXRlIGFjayAoaWUsIHdpbmRvdyBpbmZvIGRpZG4ndAorCQkJCSAqIGNoYW5nZSksIHRoZSBhY2sgaXMgdGhlIGJpZ2dlc3Qgd2UndmUKKwkJCQkgKiBzZWVuIGFuZCB3ZSd2ZSBzZWVuIGV4YWN0bHkgb3VyIHJleG10CisJCQkJICogdGhyZXNob2xkIG9mIHRoZW0sIGFzc3VtZSBhIHBhY2tldAorCQkJCSAqIGhhcyBiZWVuIGRyb3BwZWQgYW5kIHJldHJhbnNtaXQgaXQuCisJCQkJICogS2x1ZGdlIHNuZF9ueHQgJiB0aGUgY29uZ2VzdGlvbgorCQkJCSAqIHdpbmRvdyBzbyB3ZSBzZW5kIG9ubHkgdGhpcyBvbmUKKwkJCQkgKiBwYWNrZXQuCisJCQkJICoKKwkJCQkgKiBXZSBrbm93IHdlJ3JlIGxvc2luZyBhdCB0aGUgY3VycmVudAorCQkJCSAqIHdpbmRvdyBzaXplIHNvIGRvIGNvbmdlc3Rpb24gYXZvaWRhbmNlCisJCQkJICogKHNldCBzc3RocmVzaCB0byBoYWxmIHRoZSBjdXJyZW50IHdpbmRvdworCQkJCSAqIGFuZCBwdWxsIG91ciBjb25nZXN0aW9uIHdpbmRvdyBiYWNrIHRvCisJCQkJICogdGhlIG5ldyBzc3RocmVzaCkuCisJCQkJICoKKwkJCQkgKiBEdXAgYWNrcyBtZWFuIHRoYXQgcGFja2V0cyBoYXZlIGxlZnQgdGhlCisJCQkJICogbmV0d29yayAodGhleSdyZSBub3cgY2FjaGVkIGF0IHRoZSByZWNlaXZlcikKKwkJCQkgKiBzbyBidW1wIGN3bmQgYnkgdGhlIGFtb3VudCBpbiB0aGUgcmVjZWl2ZXIKKwkJCQkgKiB0byBrZWVwIGEgY29uc3RhbnQgY3duZCBwYWNrZXRzIGluIHRoZQorCQkJCSAqIG5ldHdvcmsuCisJCQkJICovCisJCQkJaWYgKHRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID09IDAgfHwKKwkJCQkgICAgdGktPnRpX2FjayAhPSB0cC0+c25kX3VuYSkKKwkJCQkJdHAtPnRfZHVwYWNrcyA9IDA7CisJCQkJZWxzZSBpZiAoKyt0cC0+dF9kdXBhY2tzID09IFRDUFJFWE1UVEhSRVNIKSB7CisJCQkJCXRjcF9zZXEgb254dCA9IHRwLT5zbmRfbnh0OworCQkJCQl1X2ludCB3aW4gPQorCQkJCQkgICAgbWluKHRwLT5zbmRfd25kLCB0cC0+c25kX2N3bmQpIC8gMiAvCisJCQkJCQl0cC0+dF9tYXhzZWc7CisKKwkJCQkJaWYgKHdpbiA8IDIpCisJCQkJCQl3aW4gPSAyOworCQkJCQl0cC0+c25kX3NzdGhyZXNoID0gd2luICogdHAtPnRfbWF4c2VnOworCQkJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IDA7CisJCQkJCXRwLT50X3J0dCA9IDA7CisJCQkJCXRwLT5zbmRfbnh0ID0gdGktPnRpX2FjazsKKwkJCQkJdHAtPnNuZF9jd25kID0gdHAtPnRfbWF4c2VnOworCQkJCQkodm9pZCkgdGNwX291dHB1dCh0cCk7CisJCQkJCXRwLT5zbmRfY3duZCA9IHRwLT5zbmRfc3N0aHJlc2ggKworCQkJCQkgICAgICAgdHAtPnRfbWF4c2VnICogdHAtPnRfZHVwYWNrczsKKwkJCQkJaWYgKFNFUV9HVChvbnh0LCB0cC0+c25kX254dCkpCisJCQkJCQl0cC0+c25kX254dCA9IG9ueHQ7CisJCQkJCWdvdG8gZHJvcDsKKwkJCQl9IGVsc2UgaWYgKHRwLT50X2R1cGFja3MgPiBUQ1BSRVhNVFRIUkVTSCkgeworCQkJCQl0cC0+c25kX2N3bmQgKz0gdHAtPnRfbWF4c2VnOworCQkJCQkodm9pZCkgdGNwX291dHB1dCh0cCk7CisJCQkJCWdvdG8gZHJvcDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl0cC0+dF9kdXBhY2tzID0gMDsKKwkJCWJyZWFrOworCQl9CisJc3lucnhfdG9fZXN0OgorCQkvKgorCQkgKiBJZiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgd2FzIGluZmxhdGVkIHRvIGFjY291bnQKKwkJICogZm9yIHRoZSBvdGhlciBzaWRlJ3MgY2FjaGVkIHBhY2tldHMsIHJldHJhY3QgaXQuCisJCSAqLworCQlpZiAodHAtPnRfZHVwYWNrcyA+IFRDUFJFWE1UVEhSRVNIICYmCisJCSAgICB0cC0+c25kX2N3bmQgPiB0cC0+c25kX3NzdGhyZXNoKQorCQkJdHAtPnNuZF9jd25kID0gdHAtPnNuZF9zc3RocmVzaDsKKwkJdHAtPnRfZHVwYWNrcyA9IDA7CisJCWlmIChTRVFfR1QodGktPnRpX2FjaywgdHAtPnNuZF9tYXgpKSB7CisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZhY2t0b29tdWNoKyspOworCQkJZ290byBkcm9wYWZ0ZXJhY2s7CisJCX0KKwkJYWNrZWQgPSB0aS0+dGlfYWNrIC0gdHAtPnNuZF91bmE7CisJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmFja3BhY2srKyk7CisJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmFja2J5dGUgKz0gYWNrZWQpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSB0aW1lc3RhbXAgcmVwbHksIHVwZGF0ZSBzbW9vdGhlZAorCQkgKiByb3VuZCB0cmlwIHRpbWUuICBJZiBubyB0aW1lc3RhbXAgaXMgcHJlc2VudCBidXQKKwkJICogdHJhbnNtaXQgdGltZXIgaXMgcnVubmluZyBhbmQgdGltZWQgc2VxdWVuY2UKKwkJICogbnVtYmVyIHdhcyBhY2tlZCwgdXBkYXRlIHNtb290aGVkIHJvdW5kIHRyaXAgdGltZS4KKwkJICogU2luY2Ugd2Ugbm93IGhhdmUgYW4gcnR0IG1lYXN1cmVtZW50LCBjYW5jZWwgdGhlCisJCSAqIHRpbWVyIGJhY2tvZmYgKGNmLiwgUGhpbCBLYXJuJ3MgcmV0cmFuc21pdCBhbGcuKS4KKwkJICogUmVjb21wdXRlIHRoZSBpbml0aWFsIHJldHJhbnNtaXQgdGltZXIuCisJCSAqLworLyoJCWlmICh0c19wcmVzZW50KQorICoJCQl0Y3BfeG1pdF90aW1lcih0cCwgdGNwX25vdy10c19lY3IrMSk7CisgKgkJZWxzZQorICovCisJCSAgICAgaWYgKHRwLT50X3J0dCAmJiBTRVFfR1QodGktPnRpX2FjaywgdHAtPnRfcnRzZXEpKQorCQkJdGNwX3htaXRfdGltZXIodHAsdHAtPnRfcnR0KTsKKworCQkvKgorCQkgKiBJZiBhbGwgb3V0c3RhbmRpbmcgZGF0YSBpcyBhY2tlZCwgc3RvcCByZXRyYW5zbWl0CisJCSAqIHRpbWVyIGFuZCByZW1lbWJlciB0byByZXN0YXJ0IChtb3JlIG91dHB1dCBvciBwZXJzaXN0KS4KKwkJICogSWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGJlIGFja2VkLCByZXN0YXJ0IHJldHJhbnNtaXQKKwkJICogdGltZXIsIHVzaW5nIGN1cnJlbnQgKHBvc3NpYmx5IGJhY2tlZC1vZmYpIHZhbHVlLgorCQkgKi8KKwkJaWYgKHRpLT50aV9hY2sgPT0gdHAtPnNuZF9tYXgpIHsKKwkJCXRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID0gMDsKKwkJCW5lZWRvdXRwdXQgPSAxOworCQl9IGVsc2UgaWYgKHRwLT50X3RpbWVyW1RDUFRfUEVSU0lTVF0gPT0gMCkKKwkJCXRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID0gdHAtPnRfcnh0Y3VyOworCQkvKgorCQkgKiBXaGVuIG5ldyBkYXRhIGlzIGFja2VkLCBvcGVuIHRoZSBjb25nZXN0aW9uIHdpbmRvdy4KKwkJICogSWYgdGhlIHdpbmRvdyBnaXZlcyB1cyBsZXNzIHRoYW4gc3N0aHJlc2ggcGFja2V0cworCQkgKiBpbiBmbGlnaHQsIG9wZW4gZXhwb25lbnRpYWxseSAobWF4c2VnIHBlciBwYWNrZXQpLgorCQkgKiBPdGhlcndpc2Ugb3BlbiBsaW5lYXJseTogbWF4c2VnIHBlciB3aW5kb3cKKwkJICogKG1heHNlZ14yIC8gY3duZCBwZXIgcGFja2V0KS4KKwkJICovCisJCXsKKwkJICByZWdpc3RlciB1X2ludCBjdyA9IHRwLT5zbmRfY3duZDsKKwkJICByZWdpc3RlciB1X2ludCBpbmNyID0gdHAtPnRfbWF4c2VnOworCisJCSAgaWYgKGN3ID4gdHAtPnNuZF9zc3RocmVzaCkKKwkJICAgIGluY3IgPSBpbmNyICogaW5jciAvIGN3OworCQkgIHRwLT5zbmRfY3duZCA9IG1pbihjdyArIGluY3IsICh1bnNpZ25lZClUQ1BfTUFYV0lOIDw8IHRwLT5zbmRfc2NhbGUpOworCQl9CisJCWlmICgodW5zaWduZWQpYWNrZWQgPiBzby0+c29fc25kLnNiX2NjKSB7CisJCQl0cC0+c25kX3duZCAtPSBzby0+c29fc25kLnNiX2NjOworCQkJc2Jkcm9wKCZzby0+c29fc25kLCAoaW50IClzby0+c29fc25kLnNiX2NjKTsKKwkJCW91cmZpbmlzYWNrZWQgPSAxOworCQl9IGVsc2UgeworCQkJc2Jkcm9wKCZzby0+c29fc25kLCBhY2tlZCk7CisJCQl0cC0+c25kX3duZCAtPSBhY2tlZDsKKwkJCW91cmZpbmlzYWNrZWQgPSAwOworCQl9CisJCS8qCisJCSAqIFhYWCBzb3d3YWt1cCBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIGFja2VkIGFuZCB0aGVyZSdzIHJvb20gZm9yCisJCSAqIGZvciBtb3JlIGRhdGEuLi4gaXQgc2hvdWxkIHJlYWQoKSB0aGUgc29ja2V0CisJCSAqLworLyoJCWlmIChzby0+c29fc25kLnNiX2ZsYWdzICYgU0JfTk9USUZZKQorICoJCQlzb3d3YWtldXAoc28pOworICovCisJCXRwLT5zbmRfdW5hID0gdGktPnRpX2FjazsKKwkJaWYgKFNFUV9MVCh0cC0+c25kX254dCwgdHAtPnNuZF91bmEpKQorCQkJdHAtPnNuZF9ueHQgPSB0cC0+c25kX3VuYTsKKworCQlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwkJLyoKKwkJICogSW4gRklOX1dBSVRfMSBTVEFURSBpbiBhZGRpdGlvbiB0byB0aGUgcHJvY2Vzc2luZworCQkgKiBmb3IgdGhlIEVTVEFCTElTSEVEIHN0YXRlIGlmIG91ciBGSU4gaXMgbm93IGFja25vd2xlZGdlZAorCQkgKiB0aGVuIGVudGVyIEZJTl9XQUlUXzIuCisJCSAqLworCQljYXNlIFRDUFNfRklOX1dBSVRfMToKKwkJCWlmIChvdXJmaW5pc2Fja2VkKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBjYW4ndCByZWNlaXZlIGFueSBtb3JlCisJCQkJICogZGF0YSwgdGhlbiBjbG9zaW5nIHVzZXIgY2FuIHByb2NlZWQuCisJCQkJICogU3RhcnRpbmcgdGhlIHRpbWVyIGlzIGNvbnRyYXJ5IHRvIHRoZQorCQkJCSAqIHNwZWNpZmljYXRpb24sIGJ1dCBpZiB3ZSBkb24ndCBnZXQgYSBGSU4KKwkJCQkgKiB3ZSdsbCBoYW5nIGZvcmV2ZXIuCisJCQkJICovCisJCQkJaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0ZDQU5UUkNWTU9SRSkgeworCQkJCQlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJCQkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSBUQ1BfTUFYSURMRTsKKwkJCQl9CisJCQkJdHAtPnRfc3RhdGUgPSBUQ1BTX0ZJTl9XQUlUXzI7CisJCQl9CisJCQlicmVhazsKKworCSAJLyoKKwkJICogSW4gQ0xPU0lORyBTVEFURSBpbiBhZGRpdGlvbiB0byB0aGUgcHJvY2Vzc2luZyBmb3IKKwkJICogdGhlIEVTVEFCTElTSEVEIHN0YXRlIGlmIHRoZSBBQ0sgYWNrbm93bGVkZ2VzIG91ciBGSU4KKwkJICogdGhlbiBlbnRlciB0aGUgVElNRS1XQUlUIHN0YXRlLCBvdGhlcndpc2UgaWdub3JlCisJCSAqIHRoZSBzZWdtZW50LgorCQkgKi8KKwkJY2FzZSBUQ1BTX0NMT1NJTkc6CisJCQlpZiAob3VyZmluaXNhY2tlZCkgeworCQkJCXRwLT50X3N0YXRlID0gVENQU19USU1FX1dBSVQ7CisJCQkJdGNwX2NhbmNlbHRpbWVycyh0cCk7CisJCQkJdHAtPnRfdGltZXJbVENQVF8yTVNMXSA9IDIgKiBUQ1BUVl9NU0w7CisJCQkJc29pc2ZkaXNjb25uZWN0ZWQoc28pOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSW4gTEFTVF9BQ0ssIHdlIG1heSBzdGlsbCBiZSB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluCisJCSAqIGFuZC9vciB0byBiZSBhY2tlZCwgYXMgd2VsbCBhcyBmb3IgdGhlIGFjayBvZiBvdXIgRklOLgorCQkgKiBJZiBvdXIgRklOIGlzIG5vdyBhY2tub3dsZWRnZWQsIGRlbGV0ZSB0aGUgVENCLAorCQkgKiBlbnRlciB0aGUgY2xvc2VkIHN0YXRlIGFuZCByZXR1cm4uCisJCSAqLworCQljYXNlIFRDUFNfTEFTVF9BQ0s6CisJCQlpZiAob3VyZmluaXNhY2tlZCkgeworCQkJCXRwID0gdGNwX2Nsb3NlKHRwKTsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CisJCQlicmVhazsKKworCQkvKgorCQkgKiBJbiBUSU1FX1dBSVQgc3RhdGUgdGhlIG9ubHkgdGhpbmcgdGhhdCBzaG91bGQgYXJyaXZlCisJCSAqIGlzIGEgcmV0cmFuc21pc3Npb24gb2YgdGhlIHJlbW90ZSBGSU4uICBBY2tub3dsZWRnZQorCQkgKiBpdCBhbmQgcmVzdGFydCB0aGUgZmluYWNrIHRpbWVyLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1RJTUVfV0FJVDoKKwkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSAyICogVENQVFZfTVNMOworCQkJZ290byBkcm9wYWZ0ZXJhY2s7CisJCX0KKwl9IC8qIHN3aXRjaCh0cC0+dF9zdGF0ZSkgKi8KKworc3RlcDY6CisJLyoKKwkgKiBVcGRhdGUgd2luZG93IGluZm9ybWF0aW9uLgorCSAqIERvbid0IGxvb2sgYXQgd2luZG93IGlmIG5vIEFDSzogVEFDJ3Mgc2VuZCBnYXJiYWdlIG9uIGZpcnN0IFNZTi4KKwkgKi8KKwlpZiAoKHRpZmxhZ3MgJiBUSF9BQ0spICYmCisJICAgIChTRVFfTFQodHAtPnNuZF93bDEsIHRpLT50aV9zZXEpIHx8CisJICAgICh0cC0+c25kX3dsMSA9PSB0aS0+dGlfc2VxICYmIChTRVFfTFQodHAtPnNuZF93bDIsIHRpLT50aV9hY2spIHx8CisJICAgICh0cC0+c25kX3dsMiA9PSB0aS0+dGlfYWNrICYmIHRpd2luID4gdHAtPnNuZF93bmQpKSkpKSB7CisJCS8qIGtlZXAgdHJhY2sgb2YgcHVyZSB3aW5kb3cgdXBkYXRlcyAqLworCQlpZiAodGktPnRpX2xlbiA9PSAwICYmCisJCSAgICB0cC0+c25kX3dsMiA9PSB0aS0+dGlfYWNrICYmIHRpd2luID4gdHAtPnNuZF93bmQpCisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3Z3aW51cGQrKyk7CisJCXRwLT5zbmRfd25kID0gdGl3aW47CisJCXRwLT5zbmRfd2wxID0gdGktPnRpX3NlcTsKKwkJdHAtPnNuZF93bDIgPSB0aS0+dGlfYWNrOworCQlpZiAodHAtPnNuZF93bmQgPiB0cC0+bWF4X3NuZHduZCkKKwkJCXRwLT5tYXhfc25kd25kID0gdHAtPnNuZF93bmQ7CisJCW5lZWRvdXRwdXQgPSAxOworCX0KKworCS8qCisJICogUHJvY2VzcyBzZWdtZW50cyB3aXRoIFVSRy4KKwkgKi8KKwlpZiAoKHRpZmxhZ3MgJiBUSF9VUkcpICYmIHRpLT50aV91cnAgJiYKKwkgICAgVENQU19IQVZFUkNWREZJTih0cC0+dF9zdGF0ZSkgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEga2x1ZGdlLCBidXQgaWYgd2UgcmVjZWl2ZSBhbmQgYWNjZXB0CisJCSAqIHJhbmRvbSB1cmdlbnQgcG9pbnRlcnMsIHdlJ2xsIGNyYXNoIGluCisJCSAqIHNvcmVjZWl2ZS4gIEl0J3MgaGFyZCB0byBpbWFnaW5lIHNvbWVvbmUKKwkJICogYWN0dWFsbHkgd2FudGluZyB0byBzZW5kIHRoaXMgbXVjaCB1cmdlbnQgZGF0YS4KKwkJICovCisJCWlmICh0aS0+dGlfdXJwICsgc28tPnNvX3Jjdi5zYl9jYyA+IHNvLT5zb19yY3Yuc2JfZGF0YWxlbikgeworCQkJdGktPnRpX3VycCA9IDA7CisJCQl0aWZsYWdzICY9IH5USF9VUkc7CisJCQlnb3RvIGRvZGF0YTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGlzIHNlZ21lbnQgYWR2YW5jZXMgdGhlIGtub3duIHVyZ2VudCBwb2ludGVyLAorCQkgKiB0aGVuIG1hcmsgdGhlIGRhdGEgc3RyZWFtLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQkgKiBpbiBDTE9TRV9XQUlULCBDTE9TSU5HLCBMQVNUX0FDSyBvciBUSU1FX1dBSVQgU1RBVEVTIHNpbmNlCisJCSAqIGEgRklOIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBzaWRlLgorCQkgKiBJbiB0aGVzZSBzdGF0ZXMgd2UgaWdub3JlIHRoZSBVUkcuCisJCSAqCisJCSAqIEFjY29yZGluZyB0byBSRkM5NjEgKEFzc2lnbmVkIFByb3RvY29scyksCisJCSAqIHRoZSB1cmdlbnQgcG9pbnRlciBwb2ludHMgdG8gdGhlIGxhc3Qgb2N0ZXQKKwkJICogb2YgdXJnZW50IGRhdGEuICBXZSBjb250aW51ZSwgaG93ZXZlciwKKwkJICogdG8gY29uc2lkZXIgaXQgdG8gaW5kaWNhdGUgdGhlIGZpcnN0IG9jdGV0CisJCSAqIG9mIGRhdGEgcGFzdCB0aGUgdXJnZW50IHNlY3Rpb24gYXMgdGhlIG9yaWdpbmFsCisJCSAqIHNwZWMgc3RhdGVzIChpbiBvbmUgb2YgdHdvIHBsYWNlcykuCisJCSAqLworCQlpZiAoU0VRX0dUKHRpLT50aV9zZXErdGktPnRpX3VycCwgdHAtPnJjdl91cCkpIHsKKwkJCXRwLT5yY3ZfdXAgPSB0aS0+dGlfc2VxICsgdGktPnRpX3VycDsKKwkJCXNvLT5zb191cmdjID0gIHNvLT5zb19yY3Yuc2JfY2MgKworCQkJCSh0cC0+cmN2X3VwIC0gdHAtPnJjdl9ueHQpOyAvKiAtMTsgKi8KKwkJCXRwLT5yY3ZfdXAgPSB0aS0+dGlfc2VxICsgdGktPnRpX3VycDsKKworCQl9CisJfSBlbHNlCisJCS8qCisJCSAqIElmIG5vIG91dCBvZiBiYW5kIGRhdGEgaXMgZXhwZWN0ZWQsCisJCSAqIHB1bGwgcmVjZWl2ZSB1cmdlbnQgcG9pbnRlciBhbG9uZworCQkgKiB3aXRoIHRoZSByZWNlaXZlIHdpbmRvdy4KKwkJICovCisJCWlmIChTRVFfR1QodHAtPnJjdl9ueHQsIHRwLT5yY3ZfdXApKQorCQkJdHAtPnJjdl91cCA9IHRwLT5yY3Zfbnh0OworZG9kYXRhOgorCisJLyoKKwkgKiBQcm9jZXNzIHRoZSBzZWdtZW50IHRleHQsIG1lcmdpbmcgaXQgaW50byB0aGUgVENQIHNlcXVlbmNpbmcgcXVldWUsCisJICogYW5kIGFycmFuZ2luZyBmb3IgYWNrbm93bGVkZ21lbnQgb2YgcmVjZWlwdCBpZiBuZWNlc3NhcnkuCisJICogVGhpcyBwcm9jZXNzIGxvZ2ljYWxseSBpbnZvbHZlcyBhZGp1c3RpbmcgdHAtPnJjdl93bmQgYXMgZGF0YQorCSAqIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciAodGhpcyBoYXBwZW5zIGluIHRjcF91c3JyZXEuYywKKwkgKiBjYXNlIFBSVV9SQ1ZEKS4gIElmIGEgRklOIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgb24gdGhpcworCSAqIGNvbm5lY3Rpb24gdGhlbiB3ZSBqdXN0IGlnbm9yZSB0aGUgdGV4dC4KKwkgKi8KKwlpZiAoKHRpLT50aV9sZW4gfHwgKHRpZmxhZ3MmVEhfRklOKSkgJiYKKwkgICAgVENQU19IQVZFUkNWREZJTih0cC0+dF9zdGF0ZSkgPT0gMCkgeworCQlUQ1BfUkVBU1ModHAsIHRpLCBtLCBzbywgdGlmbGFncyk7CisJCS8qCisJCSAqIE5vdGUgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgcGVlciBoYXMgc2VudCBpbnRvCisJCSAqIG91ciB3aW5kb3csIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBzZW5kZXIncworCQkgKiBidWZmZXIgc2l6ZS4KKwkJICovCisJCWxlbiA9IHNvLT5zb19yY3Yuc2JfZGF0YWxlbiAtICh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KTsKKwl9IGVsc2UgeworCQltX2ZyZWUobSk7CisJCXRpZmxhZ3MgJj0gflRIX0ZJTjsKKwl9CisKKwkvKgorCSAqIElmIEZJTiBpcyByZWNlaXZlZCBBQ0sgdGhlIEZJTiBhbmQgbGV0IHRoZSB1c2VyIGtub3cKKwkgKiB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmcuCisJICovCisJaWYgKHRpZmxhZ3MgJiBUSF9GSU4pIHsKKwkJaWYgKFRDUFNfSEFWRVJDVkRGSU4odHAtPnRfc3RhdGUpID09IDApIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSByZWNlaXZlIGEgRklOIHdlIGNhbid0IHNlbmQgbW9yZSBkYXRhLAorCQkJICogc2V0IGl0IFNTX0ZEUkFJTgorICAgICAgICAgICAgICAgICAgICAgICAgICogU2h1dGRvd24gdGhlIHNvY2tldCBpZiB0aGVyZSBpcyBubyByeCBkYXRhIGluIHRoZQorCQkJICogYnVmZmVyLgorCQkJICogc29yZWFkKCkgaXMgY2FsbGVkIG9uIGNvbXBsZXRpb24gb2Ygc2h1dGRvd24oKSBhbmQKKwkJCSAqIHdpbGwgZ290IHRvIFRDUFNfTEFTVF9BQ0ssIGFuZCB1c2UgdGNwX291dHB1dCgpCisJCQkgKiB0byBzZW5kIHRoZSBGSU4uCisJCQkgKi8KKy8qCQkJc29mY2FudHJjdm1vcmUoc28pOyAqLworCQkJc29md2RyYWluKHNvKTsKKworCQkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCQkJdHAtPnJjdl9ueHQrKzsKKwkJfQorCQlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwkgCS8qCisJCSAqIEluIFNZTl9SRUNFSVZFRCBhbmQgRVNUQUJMSVNIRUQgU1RBVEVTCisJCSAqIGVudGVyIHRoZSBDTE9TRV9XQUlUIHN0YXRlLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1NZTl9SRUNFSVZFRDoKKwkJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgorCQkgIGlmKHNvLT5zb19lbXUgPT0gRU1VX0NUTCkgICAgICAgIC8qIG5vIHNodXRkb3duIG9uIHNvY2tldCAqLworCQkgICAgdHAtPnRfc3RhdGUgPSBUQ1BTX0xBU1RfQUNLOworCQkgIGVsc2UKKwkJICAgIHRwLT50X3N0YXRlID0gVENQU19DTE9TRV9XQUlUOworCQkgIGJyZWFrOworCisJIAkvKgorCQkgKiBJZiBzdGlsbCBpbiBGSU5fV0FJVF8xIFNUQVRFIEZJTiBoYXMgbm90IGJlZW4gYWNrZWQgc28KKwkJICogZW50ZXIgdGhlIENMT1NJTkcgc3RhdGUuCisJCSAqLworCQljYXNlIFRDUFNfRklOX1dBSVRfMToKKwkJCXRwLT50X3N0YXRlID0gVENQU19DTE9TSU5HOworCQkJYnJlYWs7CisKKwkgCS8qCisJCSAqIEluIEZJTl9XQUlUXzIgc3RhdGUgZW50ZXIgdGhlIFRJTUVfV0FJVCBzdGF0ZSwKKwkJICogc3RhcnRpbmcgdGhlIHRpbWUtd2FpdCB0aW1lciwgdHVybmluZyBvZmYgdGhlIG90aGVyCisJCSAqIHN0YW5kYXJkIHRpbWVycy4KKwkJICovCisJCWNhc2UgVENQU19GSU5fV0FJVF8yOgorCQkJdHAtPnRfc3RhdGUgPSBUQ1BTX1RJTUVfV0FJVDsKKwkJCXRjcF9jYW5jZWx0aW1lcnModHApOworCQkJdHAtPnRfdGltZXJbVENQVF8yTVNMXSA9IDIgKiBUQ1BUVl9NU0w7CisJCQlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBJbiBUSU1FX1dBSVQgc3RhdGUgcmVzdGFydCB0aGUgMiBNU0wgdGltZV93YWl0IHRpbWVyLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1RJTUVfV0FJVDoKKwkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSAyICogVENQVFZfTVNMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzbWFsbCBwYWNrZXQsIHRoZW4gQUNLIG5vdyAtIHdpdGggTmFnZWwKKwkgKiAgICAgIGNvbmdlc3Rpb24gYXZvaWRhbmNlIHNlbmRlciB3b24ndCBzZW5kIG1vcmUgdW50aWwKKwkgKiAgICAgIGhlIGdldHMgYW4gQUNLLgorCSAqCisJICogU2VlIGFib3ZlLgorCSAqLworLyoJaWYgKHRpLT50aV9sZW4gJiYgKHVuc2lnbmVkKXRpLT50aV9sZW4gPCB0cC0+dF9tYXhzZWcpIHsKKyAqLworLyoJaWYgKCh0aS0+dGlfbGVuICYmICh1bnNpZ25lZCl0aS0+dGlfbGVuIDwgdHAtPnRfbWF4c2VnICYmCisgKgkJKHNvLT5zb19pcHRvcyAmIElQVE9TX0xPV0RFTEFZKSA9PSAwKSB8fAorICoJICAgICAgICgoc28tPnNvX2lwdG9zICYgSVBUT1NfTE9XREVMQVkpICYmCisgKgkgICAgICAgKChzdHJ1Y3QgdGNwaXBoZHJfMiAqKXRpKS0+Zmlyc3RfY2hhciA9PSAoY2hhcikyNykpIHsKKyAqLworCWlmICh0aS0+dGlfbGVuICYmICh1bnNpZ25lZCl0aS0+dGlfbGVuIDw9IDUgJiYKKwkgICAgKChzdHJ1Y3QgdGNwaXBoZHJfMiAqKXRpKS0+Zmlyc3RfY2hhciA9PSAoY2hhcikyNykgeworCQl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gYW55IGRlc2lyZWQgb3V0cHV0LgorCSAqLworCWlmIChuZWVkb3V0cHV0IHx8ICh0cC0+dF9mbGFncyAmIFRGX0FDS05PVykpIHsKKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCX0KKwlyZXR1cm47CisKK2Ryb3BhZnRlcmFjazoKKwkvKgorCSAqIEdlbmVyYXRlIGFuIEFDSyBkcm9wcGluZyBpbmNvbWluZyBzZWdtZW50IGlmIGl0IG9jY3VwaWVzCisJICogc2VxdWVuY2Ugc3BhY2UsIHdoZXJlIHRoZSBBQ0sgcmVmbGVjdHMgb3VyIHN0YXRlLgorCSAqLworCWlmICh0aWZsYWdzICYgVEhfUlNUKQorCQlnb3RvIGRyb3A7CisJbV9mcmVlbShtKTsKKwl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCXJldHVybjsKKworZHJvcHdpdGhyZXNldDoKKwkvKiByZXVzZXMgbSBpZiBtIT1OVUxMLCBtX2ZyZWUoKSB1bm5lY2Vzc2FyeSAqLworCWlmICh0aWZsYWdzICYgVEhfQUNLKQorCQl0Y3BfcmVzcG9uZCh0cCwgdGksIG0sICh0Y3Bfc2VxKTAsIHRpLT50aV9hY2ssIFRIX1JTVCk7CisJZWxzZSB7CisJCWlmICh0aWZsYWdzICYgVEhfU1lOKSB0aS0+dGlfbGVuKys7CisJCXRjcF9yZXNwb25kKHRwLCB0aSwgbSwgdGktPnRpX3NlcSt0aS0+dGlfbGVuLCAodGNwX3NlcSkwLAorCQkgICAgVEhfUlNUfFRIX0FDSyk7CisJfQorCisJcmV0dXJuOworCitkcm9wOgorCS8qCisJICogRHJvcCBzcGFjZSBoZWxkIGJ5IGluY29taW5nIHNlZ21lbnQgYW5kIHJldHVybi4KKwkgKi8KKwltX2ZyZWUobSk7CisKKwlyZXR1cm47Cit9CisKKyAvKiAsIHRzX3ByZXNlbnQsIHRzX3ZhbCwgdHNfZWNyKSAqLworLyoJaW50ICp0c19wcmVzZW50OworICoJdV9pbnQzMl90ICp0c192YWwsICp0c19lY3I7CisgKi8KK3N0YXRpYyB2b2lkCit0Y3BfZG9vcHRpb25zKHN0cnVjdCB0Y3BjYiAqdHAsIHVfY2hhciAqY3AsIGludCBjbnQsIHN0cnVjdCB0Y3BpcGhkciAqdGkpCit7CisJdV9pbnQxNl90IG1zczsKKwlpbnQgb3B0LCBvcHRsZW47CisKKwlERUJVR19DQUxMKCJ0Y3BfZG9vcHRpb25zIik7CisJREVCVUdfQVJHUygoZGZkLCIgdHAgPSAlbHggIGNudD0laSBcbiIsIChsb25nICl0cCwgY250KSk7CisKKwlmb3IgKDsgY250ID4gMDsgY250IC09IG9wdGxlbiwgY3AgKz0gb3B0bGVuKSB7CisJCW9wdCA9IGNwWzBdOworCQlpZiAob3B0ID09IFRDUE9QVF9FT0wpCisJCQlicmVhazsKKwkJaWYgKG9wdCA9PSBUQ1BPUFRfTk9QKQorCQkJb3B0bGVuID0gMTsKKwkJZWxzZSB7CisJCQlvcHRsZW4gPSBjcFsxXTsKKwkJCWlmIChvcHRsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKG9wdCkgeworCisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKworCQljYXNlIFRDUE9QVF9NQVhTRUc6CisJCQlpZiAob3B0bGVuICE9IFRDUE9MRU5fTUFYU0VHKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEodGktPnRpX2ZsYWdzICYgVEhfU1lOKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweSgoY2hhciAqKSAmbXNzLCAoY2hhciAqKSBjcCArIDIsIHNpemVvZihtc3MpKTsKKwkJCU5UT0hTKG1zcyk7CisJCQkodm9pZCkgdGNwX21zcyh0cCwgbXNzKTsJLyogc2V0cyB0X21heHNlZyAqLworCQkJYnJlYWs7CisKKy8qCQljYXNlIFRDUE9QVF9XSU5ET1c6CisgKgkJCWlmIChvcHRsZW4gIT0gVENQT0xFTl9XSU5ET1cpCisgKgkJCQljb250aW51ZTsKKyAqCQkJaWYgKCEodGktPnRpX2ZsYWdzICYgVEhfU1lOKSkKKyAqCQkJCWNvbnRpbnVlOworICoJCQl0cC0+dF9mbGFncyB8PSBURl9SQ1ZEX1NDQUxFOworICoJCQl0cC0+cmVxdWVzdGVkX3Nfc2NhbGUgPSBtaW4oY3BbMl0sIFRDUF9NQVhfV0lOU0hJRlQpOworICoJCQlicmVhazsKKyAqLworLyoJCWNhc2UgVENQT1BUX1RJTUVTVEFNUDoKKyAqCQkJaWYgKG9wdGxlbiAhPSBUQ1BPTEVOX1RJTUVTVEFNUCkKKyAqCQkJCWNvbnRpbnVlOworICoJCQkqdHNfcHJlc2VudCA9IDE7CisgKgkJCW1lbWNweSgoY2hhciAqKSB0c192YWwsIChjaGFyICopY3AgKyAyLCBzaXplb2YoKnRzX3ZhbCkpOworICoJCQlOVE9ITCgqdHNfdmFsKTsKKyAqCQkJbWVtY3B5KChjaGFyICopIHRzX2VjciwgKGNoYXIgKiljcCArIDYsIHNpemVvZigqdHNfZWNyKSk7CisgKgkJCU5UT0hMKCp0c19lY3IpOworICoKKyAqLwkJCS8qCisgKgkJCSAqIEEgdGltZXN0YW1wIHJlY2VpdmVkIGluIGEgU1lOIG1ha2VzCisgKgkJCSAqIGl0IG9rIHRvIHNlbmQgdGltZXN0YW1wIHJlcXVlc3RzIGFuZCByZXBsaWVzLgorICoJCQkgKi8KKy8qCQkJaWYgKHRpLT50aV9mbGFncyAmIFRIX1NZTikgeworICoJCQkJdHAtPnRfZmxhZ3MgfD0gVEZfUkNWRF9UU1RNUDsKKyAqCQkJCXRwLT50c19yZWNlbnQgPSAqdHNfdmFsOworICoJCQkJdHAtPnRzX3JlY2VudF9hZ2UgPSB0Y3Bfbm93OworICoJCQl9CisgKi8JCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogUHVsbCBvdXQgb2YgYmFuZCBieXRlIG91dCBvZiBhIHNlZ21lbnQgc28KKyAqIGl0IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSB1c2VyJ3MgZGF0YSBxdWV1ZS4KKyAqIEl0IGlzIHN0aWxsIHJlZmxlY3RlZCBpbiB0aGUgc2VnbWVudCBsZW5ndGggZm9yCisgKiBzZXF1ZW5jaW5nIHB1cnBvc2VzLgorICovCisKKyNpZmRlZiBub3RkZWYKKwordm9pZAordGNwX3B1bGxvdXRvZmJhbmQoc28sIHRpLCBtKQorCXN0cnVjdCBzb2NrZXQgKnNvOworCXN0cnVjdCB0Y3BpcGhkciAqdGk7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07Cit7CisJaW50IGNudCA9IHRpLT50aV91cnAgLSAxOworCisJd2hpbGUgKGNudCA+PSAwKSB7CisJCWlmIChtLT5tX2xlbiA+IGNudCkgeworCQkJY2hhciAqY3AgPSBtdG9kKG0sIGNhZGRyX3QpICsgY250OworCQkJc3RydWN0IHRjcGNiICp0cCA9IHNvdG90Y3BjYihzbyk7CisKKwkJCXRwLT50X2lvYmMgPSAqY3A7CisJCQl0cC0+dF9vb2JmbGFncyB8PSBUQ1BPT0JfSEFWRURBVEE7CisJCQltZW1jcHkoc3AsIGNwKzEsICh1bnNpZ25lZCkobS0+bV9sZW4gLSBjbnQgLSAxKSk7CisJCQltLT5tX2xlbi0tOworCQkJcmV0dXJuOworCQl9CisJCWNudCAtPSBtLT5tX2xlbjsKKwkJbSA9IG0tPm1fbmV4dDsgLyogWFhYIFdST05HISBGaXggaXQhICovCisJCWlmIChtID09IDApCisJCQlicmVhazsKKwl9CisJcGFuaWMoInRjcF9wdWxsb3V0b2ZiYW5kIik7Cit9CisKKyNlbmRpZiAvKiBub3RkZWYgKi8KKworLyoKKyAqIENvbGxlY3QgbmV3IHJvdW5kLXRyaXAgdGltZSBlc3RpbWF0ZQorICogYW5kIHVwZGF0ZSBhdmVyYWdlcyBhbmQgY3VycmVudCB0aW1lb3V0LgorICovCisKK3N0YXRpYyB2b2lkCit0Y3BfeG1pdF90aW1lcihyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgcnR0KQoreworCXJlZ2lzdGVyIHNob3J0IGRlbHRhOworCisJREVCVUdfQ0FMTCgidGNwX3htaXRfdGltZXIiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOworCURFQlVHX0FSRygicnR0ID0gJWQiLCBydHQpOworCisJU1RBVCh0Y3BzdGF0LnRjcHNfcnR0dXBkYXRlZCsrKTsKKwlpZiAodHAtPnRfc3J0dCAhPSAwKSB7CisJCS8qCisJCSAqIHNydHQgaXMgc3RvcmVkIGFzIGZpeGVkIHBvaW50IHdpdGggMyBiaXRzIGFmdGVyIHRoZQorCQkgKiBiaW5hcnkgcG9pbnQgKGkuZS4sIHNjYWxlZCBieSA4KS4gIFRoZSBmb2xsb3dpbmcgbWFnaWMKKwkJICogaXMgZXF1aXZhbGVudCB0byB0aGUgc21vb3RoaW5nIGFsZ29yaXRobSBpbiByZmM3OTMgd2l0aAorCQkgKiBhbiBhbHBoYSBvZiAuODc1IChzcnR0ID0gcnR0LzggKyBzcnR0KjcvOCBpbiBmaXhlZAorCQkgKiBwb2ludCkuICBBZGp1c3QgcnR0IHRvIG9yaWdpbiAwLgorCQkgKi8KKwkJZGVsdGEgPSBydHQgLSAxIC0gKHRwLT50X3NydHQgPj4gVENQX1JUVF9TSElGVCk7CisJCWlmICgodHAtPnRfc3J0dCArPSBkZWx0YSkgPD0gMCkKKwkJCXRwLT50X3NydHQgPSAxOworCQkvKgorCQkgKiBXZSBhY2N1bXVsYXRlIGEgc21vb3RoZWQgcnR0IHZhcmlhbmNlIChhY3R1YWxseSwgYQorCQkgKiBzbW9vdGhlZCBtZWFuIGRpZmZlcmVuY2UpLCB0aGVuIHNldCB0aGUgcmV0cmFuc21pdAorCQkgKiB0aW1lciB0byBzbW9vdGhlZCBydHQgKyA0IHRpbWVzIHRoZSBzbW9vdGhlZCB2YXJpYW5jZS4KKwkJICogcnR0dmFyIGlzIHN0b3JlZCBhcyBmaXhlZCBwb2ludCB3aXRoIDIgYml0cyBhZnRlciB0aGUKKwkJICogYmluYXJ5IHBvaW50IChzY2FsZWQgYnkgNCkuICBUaGUgZm9sbG93aW5nIGlzCisJCSAqIGVxdWl2YWxlbnQgdG8gcmZjNzkzIHNtb290aGluZyB3aXRoIGFuIGFscGhhIG9mIC43NQorCQkgKiAocnR0dmFyID0gcnR0dmFyKjMvNCArIHxkZWx0YXwgLyA0KS4gIFRoaXMgcmVwbGFjZXMKKwkJICogcmZjNzkzJ3Mgd2lyZWQtaW4gYmV0YS4KKwkJICovCisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSA9IC1kZWx0YTsKKwkJZGVsdGEgLT0gKHRwLT50X3J0dHZhciA+PiBUQ1BfUlRUVkFSX1NISUZUKTsKKwkJaWYgKCh0cC0+dF9ydHR2YXIgKz0gZGVsdGEpIDw9IDApCisJCQl0cC0+dF9ydHR2YXIgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vIHJ0dCBtZWFzdXJlbWVudCB5ZXQgLSB1c2UgdGhlIHVuc21vb3RoZWQgcnR0LgorCQkgKiBTZXQgdGhlIHZhcmlhbmNlIHRvIGhhbGYgdGhlIHJ0dCAoc28gb3VyIGZpcnN0CisJCSAqIHJldHJhbnNtaXQgaGFwcGVucyBhdCAzKnJ0dCkuCisJCSAqLworCQl0cC0+dF9zcnR0ID0gcnR0IDw8IFRDUF9SVFRfU0hJRlQ7CisJCXRwLT50X3J0dHZhciA9IHJ0dCA8PCAoVENQX1JUVFZBUl9TSElGVCAtIDEpOworCX0KKwl0cC0+dF9ydHQgPSAwOworCXRwLT50X3J4dHNoaWZ0ID0gMDsKKworCS8qCisJICogdGhlIHJldHJhbnNtaXQgc2hvdWxkIGhhcHBlbiBhdCBydHQgKyA0ICogcnR0dmFyLgorCSAqIEJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyB0aGUgc21vb3RoaW5nLCBzcnR0IGFuZCBydHR2YXIKKwkgKiB3aWxsIGVhY2ggYXZlcmFnZSArMS8yIHRpY2sgb2YgYmlhcy4gIFdoZW4gd2UgY29tcHV0ZQorCSAqIHRoZSByZXRyYW5zbWl0IHRpbWVyLCB3ZSB3YW50IDEvMiB0aWNrIG9mIHJvdW5kaW5nIGFuZAorCSAqIDEgZXh0cmEgdGljayBiZWNhdXNlIG9mICstMS8yIHRpY2sgdW5jZXJ0YWludHkgaW4gdGhlCisJICogZmlyaW5nIG9mIHRoZSB0aW1lci4gIFRoZSBiaWFzIHdpbGwgZ2l2ZSB1cyBleGFjdGx5IHRoZQorCSAqIDEuNSB0aWNrIHdlIG5lZWQuICBCdXQsIGJlY2F1c2UgdGhlIGJpYXMgaXMKKwkgKiBzdGF0aXN0aWNhbCwgd2UgaGF2ZSB0byB0ZXN0IHRoYXQgd2UgZG9uJ3QgZHJvcCBiZWxvdworCSAqIHRoZSBtaW5pbXVtIGZlYXNpYmxlIHRpbWVyICh3aGljaCBpcyAyIHRpY2tzKS4KKwkgKi8KKwlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwgVENQX1JFWE1UVkFMKHRwKSwKKwkgICAgKHNob3J0KXRwLT50X3J0dG1pbiwgVENQVFZfUkVYTVRNQVgpOyAvKiBYWFggKi8KKworCS8qCisJICogV2UgcmVjZWl2ZWQgYW4gYWNrIGZvciBhIHBhY2tldCB0aGF0IHdhc24ndCByZXRyYW5zbWl0dGVkOworCSAqIGl0IGlzIHByb2JhYmx5IHNhZmUgdG8gZGlzY2FyZCBhbnkgZXJyb3IgaW5kaWNhdGlvbnMgd2UndmUKKwkgKiByZWNlaXZlZCByZWNlbnRseS4gIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQsIGJ1dCBjbG9zZSBlbm91Z2gKKwkgKiBmb3Igbm93IChhIHJvdXRlIG1pZ2h0IGhhdmUgZmFpbGVkIGFmdGVyIHdlIHNlbnQgYSBzZWdtZW50LAorCSAqIGFuZCB0aGUgcmV0dXJuIHBhdGggbWlnaHQgbm90IGJlIHN5bW1ldHJpY2FsKS4KKwkgKi8KKwl0cC0+dF9zb2Z0ZXJyb3IgPSAwOworfQorCisvKgorICogRGV0ZXJtaW5lIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgbWF4c2VnIHNpemUuCisgKiBJZiB0aGUgcm91dGUgaXMga25vd24sIGNoZWNrIHJvdXRlIGZvciBtdHUuCisgKiBJZiBub25lLCB1c2UgYW4gbXNzIHRoYXQgY2FuIGJlIGhhbmRsZWQgb24gdGhlIG91dGdvaW5nCisgKiBpbnRlcmZhY2Ugd2l0aG91dCBmb3JjaW5nIElQIHRvIGZyYWdtZW50OyBpZiBiaWdnZXIgdGhhbgorICogYW4gbWJ1ZiBjbHVzdGVyIChNQ0xCWVRFUyksIHJvdW5kIGRvd24gdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiBNQ0xCWVRFUworICogdG8gdXRpbGl6ZSBsYXJnZSBtYnVmcy4gIElmIG5vIHJvdXRlIGlzIGZvdW5kLCByb3V0ZSBoYXMgbm8gbXR1LAorICogb3IgdGhlIGRlc3RpbmF0aW9uIGlzbid0IGxvY2FsLCB1c2UgYSBkZWZhdWx0LCBob3BlZnVsbHkgY29uc2VydmF0aXZlCisgKiBzaXplICh1c3VhbGx5IDUxMiBvciB0aGUgZGVmYXVsdCBJUCBtYXggc2l6ZSwgYnV0IG5vIG1vcmUgdGhhbiB0aGUgbXR1CisgKiBvZiB0aGUgaW50ZXJmYWNlKSwgYXMgd2UgY2FuJ3QgZGlzY292ZXIgYW55dGhpbmcgYWJvdXQgaW50ZXJ2ZW5pbmcKKyAqIGdhdGV3YXlzIG9yIG5ldHdvcmtzLiAgV2UgYWxzbyBpbml0aWFsaXplIHRoZSBjb25nZXN0aW9uL3Nsb3cgc3RhcnQKKyAqIHdpbmRvdyB0byBiZSBhIHNpbmdsZSBzZWdtZW50IGlmIHRoZSBkZXN0aW5hdGlvbiBpc24ndCBsb2NhbC4KKyAqIFdoaWxlIGxvb2tpbmcgYXQgdGhlIHJvdXRpbmcgZW50cnksIHdlIGFsc28gaW5pdGlhbGl6ZSBvdGhlciBwYXRoLWRlcGVuZGVudAorICogcGFyYW1ldGVycyBmcm9tIHByZS1zZXQgb3IgY2FjaGVkIHZhbHVlcyBpbiB0aGUgcm91dGluZyBlbnRyeS4KKyAqLworCitpbnQKK3RjcF9tc3Moc3RydWN0IHRjcGNiICp0cCwgdV9pbnQgb2ZmZXIpCit7CisJc3RydWN0IHNvY2tldCAqc28gPSB0cC0+dF9zb2NrZXQ7CisJaW50IG1zczsKKworCURFQlVHX0NBTEwoInRjcF9tc3MiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOworCURFQlVHX0FSRygib2ZmZXIgPSAlZCIsIG9mZmVyKTsKKworCW1zcyA9IG1pbihJRl9NVFUsIElGX01SVSkgLSBzaXplb2Yoc3RydWN0IHRjcGlwaGRyKTsKKwlpZiAob2ZmZXIpCisJCW1zcyA9IG1pbihtc3MsIChpbnQpb2ZmZXIpOworCW1zcyA9IG1heChtc3MsIDMyKTsKKwlpZiAobXNzIDwgdHAtPnRfbWF4c2VnIHx8IG9mZmVyICE9IDApCisJICAgdHAtPnRfbWF4c2VnID0gbXNzOworCisJdHAtPnNuZF9jd25kID0gbXNzOworCisJc2JyZXNlcnZlKCZzby0+c29fc25kLCBUQ1BfU05EU1BBQ0UgKyAoKFRDUF9TTkRTUEFDRSAlIG1zcykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobXNzIC0gKFRDUF9TTkRTUEFDRSAlIG1zcykpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOworCXNicmVzZXJ2ZSgmc28tPnNvX3JjdiwgVENQX1JDVlNQQUNFICsgKChUQ1BfUkNWU1BBQ0UgJSBtc3MpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1zcyAtIChUQ1BfUkNWU1BBQ0UgJSBtc3MpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKworCURFQlVHX01JU0MoKGRmZCwgIiByZXR1cm5pbmcgbXNzID0gJWRcbiIsIG1zcykpOworCisJcmV0dXJuIG1zczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3Bfb3V0cHV0LmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWZiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX291dHB1dC5jCkBAIC0wLDAgKzEsNjA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcF9vdXRwdXQuYwk4LjMgKEJlcmtlbGV5KSAxMi8zMC85MworICogdGNwX291dHB1dC5jLHYgMS4zIDE5OTQvMDkvMTUgMTA6MzY6NTUgZGF2aWRnIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgiCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCisvKgorICogU2luY2UgdGhpcyBpcyBvbmx5IHVzZWQgaW4gInN0YXRzIHNvY2tldCIsIHdlIGdpdmUgbWVhbmluZworICogbmFtZXMgaW5zdGVhZCBvZiB0aGUgUkVBTCBuYW1lcworICovCitjb25zdCBjaGFyICogY29uc3QgdGNwc3RhdGVzW10gPSB7CisvKgkiQ0xPU0VEIiwgICAgICAgIkxJU1RFTiIsICAgICAgICJTWU5fU0VOVCIsICAgICAiU1lOX1JDVkQiLCAqLworCSJSRURJUkVDVCIsCSJMSVNURU4iLAkiU1lOX1NFTlQiLCAgICAgIlNZTl9SQ1ZEIiwKKwkiRVNUQUJMSVNIRUQiLCAgIkNMT1NFX1dBSVQiLCAgICJGSU5fV0FJVF8xIiwgICAiQ0xPU0lORyIsCisJIkxBU1RfQUNLIiwgICAgICJGSU5fV0FJVF8yIiwgICAiVElNRV9XQUlUIiwKK307CisKK3N0YXRpYyBjb25zdCB1X2NoYXIgIHRjcF9vdXRmbGFnc1tUQ1BfTlNUQVRFU10gPSB7CisJVEhfUlNUfFRIX0FDSywgMCwgICAgICBUSF9TWU4sICAgICAgICBUSF9TWU58VEhfQUNLLAorCVRIX0FDSywgICAgICAgIFRIX0FDSywgVEhfRklOfFRIX0FDSywgVEhfRklOfFRIX0FDSywKKwlUSF9GSU58VEhfQUNLLCBUSF9BQ0ssIFRIX0FDSywKK307CisKKworI2RlZmluZSBNQVhfVENQT1BUTEVOCTMyCS8qIG1heCAjIGJ5dGVzIHRoYXQgZ28gaW4gb3B0aW9ucyAqLworCisvKgorICogVGNwIG91dHB1dCByb3V0aW5lOiBmaWd1cmUgb3V0IHdoYXQgc2hvdWxkIGJlIHNlbnQgYW5kIHNlbmQgaXQuCisgKi8KK2ludAordGNwX291dHB1dChzdHJ1Y3QgdGNwY2IgKnRwKQoreworCXJlZ2lzdGVyIHN0cnVjdCBzb2NrZXQgKnNvOworCXJlZ2lzdGVyIGxvbmcgbGVuLCB3aW47CisJaW50IG9mZiwgZmxhZ3MsIGVycm9yOworCXJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BpcGhkciAqdGk7CisJdV9jaGFyIG9wdFtNQVhfVENQT1BUTEVOXTsKKwl1bnNpZ25lZCBvcHRsZW4sIGhkcmxlbjsKKwlpbnQgaWRsZSwgc2VuZGFsb3Q7CisKKwlERUJVR19DQUxMKCJ0Y3Bfb3V0cHV0Iik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nICl0cCk7CisKKwlpZiAodHAgPT0gTlVMTCkgeworICAgICAgICAgICAgY3Jhc2hoYW5kbGVyX2RpZSgiUUVNVS0xIHRjcF9vdXRwdXQoKSBpbnZva2VkIHdpdGggdHA9PU5VTEwiKTsKKyAgICAgICAgfQorCXNvID0gdHAtPnRfc29ja2V0OworCWlmIChzbyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjcmFzaGhhbmRsZXJfZGllKCJRRU1VLTEgdGNwX291dHB1dCgpIGludm9rZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0cC0+dF9zb2NrZXQ9PU5VTEwiKTsKKyAgICAgICAgfQorCS8qCisJICogRGV0ZXJtaW5lIGxlbmd0aCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHRyYW5zbWl0dGVkLAorCSAqIGFuZCBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZC4KKwkgKiBJZiB0aGVyZSBpcyBzb21lIGRhdGEgb3IgY3JpdGljYWwgY29udHJvbHMgKFNZTiwgUlNUKQorCSAqIHRvIHNlbmQsIHRoZW4gdHJhbnNtaXQ7IG90aGVyd2lzZSwgaW52ZXN0aWdhdGUgZnVydGhlci4KKwkgKi8KKwlpZGxlID0gKHRwLT5zbmRfbWF4ID09IHRwLT5zbmRfdW5hKTsKKwlpZiAoaWRsZSAmJiB0cC0+dF9pZGxlID49IHRwLT50X3J4dGN1cikKKwkJLyoKKwkJICogV2UgaGF2ZSBiZWVuIGlkbGUgZm9yICJhIHdoaWxlIiBhbmQgbm8gYWNrcyBhcmUKKwkJICogZXhwZWN0ZWQgdG8gY2xvY2sgb3V0IGFueSBkYXRhIHdlIHNlbmQgLS0KKwkJICogc2xvdyBzdGFydCB0byBnZXQgYWNrICJjbG9jayIgcnVubmluZyBhZ2Fpbi4KKwkJICovCisJCXRwLT5zbmRfY3duZCA9IHRwLT50X21heHNlZzsKK2FnYWluOgorCXNlbmRhbG90ID0gMDsKKwlvZmYgPSB0cC0+c25kX254dCAtIHRwLT5zbmRfdW5hOworCXdpbiA9IG1pbih0cC0+c25kX3duZCwgdHAtPnNuZF9jd25kKTsKKworCWZsYWdzID0gdGNwX291dGZsYWdzW3RwLT50X3N0YXRlXTsKKworCURFQlVHX01JU0MoKGRmZCwgIiAtLS0gdGNwX291dHB1dCBmbGFncyA9IDB4JXhcbiIsZmxhZ3MpKTsKKworCS8qCisJICogSWYgaW4gcGVyc2lzdCB0aW1lb3V0IHdpdGggd2luZG93IG9mIDAsIHNlbmQgMSBieXRlLgorCSAqIE90aGVyd2lzZSwgaWYgd2luZG93IGlzIHNtYWxsIGJ1dCBub256ZXJvCisJICogYW5kIHRpbWVyIGV4cGlyZWQsIHdlIHdpbGwgc2VuZCB3aGF0IHdlIGNhbgorCSAqIGFuZCBnbyB0byB0cmFuc21pdCBzdGF0ZS4KKwkgKi8KKwlpZiAodHAtPnRfZm9yY2UpIHsKKwkJaWYgKHdpbiA9PSAwKSB7CisJCQkvKgorCQkJICogSWYgd2Ugc3RpbGwgaGF2ZSBzb21lIGRhdGEgdG8gc2VuZCwgdGhlbgorCQkJICogY2xlYXIgdGhlIEZJTiBiaXQuICBVc3VhbGx5IHRoaXMgd291bGQKKwkJCSAqIGhhcHBlbiBiZWxvdyB3aGVuIGl0IHJlYWxpemVzIHRoYXQgd2UKKwkJCSAqIGFyZW4ndCBzZW5kaW5nIGFsbCB0aGUgZGF0YS4gIEhvd2V2ZXIsCisJCQkgKiBpZiB3ZSBoYXZlIGV4YWN0bHkgMSBieXRlIG9mIHVuc2V0IGRhdGEsCisJCQkgKiB0aGVuIGl0IHdvbid0IGNsZWFyIHRoZSBGSU4gYml0IGJlbG93LAorCQkJICogYW5kIGlmIHdlIGFyZSBpbiBwZXJzaXN0IHN0YXRlLCB3ZSB3aW5kCisJCQkgKiB1cCBzZW5kaW5nIHRoZSBwYWNrZXQgd2l0aG91dCByZWNvcmRpbmcKKwkJCSAqIHRoYXQgd2Ugc2VudCB0aGUgRklOIGJpdC4KKwkJCSAqCisJCQkgKiBXZSBjYW4ndCBqdXN0IGJsaW5kbHkgY2xlYXIgdGhlIEZJTiBiaXQsCisJCQkgKiBiZWNhdXNlIGlmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZGF0YQorCQkJICogdG8gc2VuZCB0aGVuIHRoZSBwcm9iZSB3aWxsIGJlIHRoZSBGSU4KKwkJCSAqIGl0c2VsZi4KKwkJCSAqLworCQkJaWYgKG9mZiA8IHNvLT5zb19zbmQuc2JfY2MpCisJCQkJZmxhZ3MgJj0gflRIX0ZJTjsKKwkJCXdpbiA9IDE7CisJCX0gZWxzZSB7CisJCQl0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdID0gMDsKKwkJCXRwLT50X3J4dHNoaWZ0ID0gMDsKKwkJfQorCX0KKworCWxlbiA9IG1pbihzby0+c29fc25kLnNiX2NjLCB3aW4pIC0gb2ZmOworCisJaWYgKGxlbiA8IDApIHsKKwkJLyoKKwkJICogSWYgRklOIGhhcyBiZWVuIHNlbnQgYnV0IG5vdCBhY2tlZCwKKwkJICogYnV0IHdlIGhhdmVuJ3QgYmVlbiBjYWxsZWQgdG8gcmV0cmFuc21pdCwKKwkJICogbGVuIHdpbGwgYmUgLTEuICBPdGhlcndpc2UsIHdpbmRvdyBzaHJhbmsKKwkJICogYWZ0ZXIgd2Ugc2VudCBpbnRvIGl0LiAgSWYgd2luZG93IHNocmFuayB0byAwLAorCQkgKiBjYW5jZWwgcGVuZGluZyByZXRyYW5zbWl0IGFuZCBwdWxsIHNuZF9ueHQKKwkJICogYmFjayB0byAoY2xvc2VkKSB3aW5kb3cuICBXZSB3aWxsIGVudGVyIHBlcnNpc3QKKwkJICogc3RhdGUgYmVsb3cuICBJZiB0aGUgd2luZG93IGRpZG4ndCBjbG9zZSBjb21wbGV0ZWx5LAorCQkgKiBqdXN0IHdhaXQgZm9yIGFuIEFDSy4KKwkJICovCisJCWxlbiA9IDA7CisJCWlmICh3aW4gPT0gMCkgeworCQkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSAwOworCQkJdHAtPnNuZF9ueHQgPSB0cC0+c25kX3VuYTsKKwkJfQorCX0KKworCWlmIChsZW4gPiB0cC0+dF9tYXhzZWcpIHsKKwkJbGVuID0gdHAtPnRfbWF4c2VnOworCQlzZW5kYWxvdCA9IDE7CisJfQorCWlmIChTRVFfTFQodHAtPnNuZF9ueHQgKyBsZW4sIHRwLT5zbmRfdW5hICsgc28tPnNvX3NuZC5zYl9jYykpCisJCWZsYWdzICY9IH5USF9GSU47CisKKwl3aW4gPSBzYnNwYWNlKCZzby0+c29fcmN2KTsKKworCS8qCisJICogU2VuZGVyIHNpbGx5IHdpbmRvdyBhdm9pZGFuY2UuICBJZiBjb25uZWN0aW9uIGlzIGlkbGUKKwkgKiBhbmQgY2FuIHNlbmQgYWxsIGRhdGEsIGEgbWF4aW11bSBzZWdtZW50LAorCSAqIGF0IGxlYXN0IGEgbWF4aW11bSBkZWZhdWx0LXNpemUgc2VnbWVudCBkbyBpdCwKKwkgKiBvciBhcmUgZm9yY2VkLCBkbyBpdDsgb3RoZXJ3aXNlIGRvbid0IGJvdGhlci4KKwkgKiBJZiBwZWVyJ3MgYnVmZmVyIGlzIHRpbnksIHRoZW4gc2VuZAorCSAqIHdoZW4gd2luZG93IGlzIGF0IGxlYXN0IGhhbGYgb3Blbi4KKwkgKiBJZiByZXRyYW5zbWl0dGluZyAocG9zc2libHkgYWZ0ZXIgcGVyc2lzdCB0aW1lciBmb3JjZWQgdXMKKwkgKiB0byBzZW5kIGludG8gYSBzbWFsbCB3aW5kb3cpLCB0aGVuIG11c3QgcmVzZW5kLgorCSAqLworCWlmIChsZW4pIHsKKwkJaWYgKGxlbiA9PSB0cC0+dF9tYXhzZWcpCisJCQlnb3RvIHNlbmQ7CisJCWlmICgoMSB8fCBpZGxlIHx8IHRwLT50X2ZsYWdzICYgVEZfTk9ERUxBWSkgJiYKKwkJICAgIGxlbiArIG9mZiA+PSBzby0+c29fc25kLnNiX2NjKQorCQkJZ290byBzZW5kOworCQlpZiAodHAtPnRfZm9yY2UpCisJCQlnb3RvIHNlbmQ7CisJCWlmIChsZW4gPj0gdHAtPm1heF9zbmR3bmQgLyAyICYmIHRwLT5tYXhfc25kd25kID4gMCkKKwkJCWdvdG8gc2VuZDsKKwkJaWYgKFNFUV9MVCh0cC0+c25kX254dCwgdHAtPnNuZF9tYXgpKQorCQkJZ290byBzZW5kOworCX0KKworCS8qCisJICogQ29tcGFyZSBhdmFpbGFibGUgd2luZG93IHRvIGFtb3VudCBvZiB3aW5kb3cKKwkgKiBrbm93biB0byBwZWVyIChhcyBhZHZlcnRpc2VkIHdpbmRvdyBsZXNzCisJICogbmV4dCBleHBlY3RlZCBpbnB1dCkuICBJZiB0aGUgZGlmZmVyZW5jZSBpcyBhdCBsZWFzdCB0d28KKwkgKiBtYXggc2l6ZSBzZWdtZW50cywgb3IgYXQgbGVhc3QgNTAlIG9mIHRoZSBtYXhpbXVtIHBvc3NpYmxlCisJICogd2luZG93LCB0aGVuIHdhbnQgdG8gc2VuZCBhIHdpbmRvdyB1cGRhdGUgdG8gcGVlci4KKwkgKi8KKwlpZiAod2luID4gMCkgeworCQkvKgorCQkgKiAiYWR2IiBpcyB0aGUgYW1vdW50IHdlIGNhbiBpbmNyZWFzZSB0aGUgd2luZG93LAorCQkgKiB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgd2UgYXJlIGxpbWl0ZWQgYnkKKwkJICogVENQX01BWFdJTiA8PCB0cC0+cmN2X3NjYWxlLgorCQkgKi8KKwkJbG9uZyBhZHYgPSBtaW4od2luLCAobG9uZylUQ1BfTUFYV0lOIDw8IHRwLT5yY3Zfc2NhbGUpIC0KKwkJCSh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KTsKKworCQlpZiAoYWR2ID49IChsb25nKSAoMiAqIHRwLT50X21heHNlZykpCisJCQlnb3RvIHNlbmQ7CisJCWlmICgyICogYWR2ID49IChsb25nKSBzby0+c29fcmN2LnNiX2RhdGFsZW4pCisJCQlnb3RvIHNlbmQ7CisJfQorCisJLyoKKwkgKiBTZW5kIGlmIHdlIG93ZSBwZWVyIGFuIEFDSy4KKwkgKi8KKwlpZiAodHAtPnRfZmxhZ3MgJiBURl9BQ0tOT1cpCisJCWdvdG8gc2VuZDsKKwlpZiAoZmxhZ3MgJiAoVEhfU1lOfFRIX1JTVCkpCisJCWdvdG8gc2VuZDsKKwlpZiAoU0VRX0dUKHRwLT5zbmRfdXAsIHRwLT5zbmRfdW5hKSkKKwkJZ290byBzZW5kOworCS8qCisJICogSWYgb3VyIHN0YXRlIGluZGljYXRlcyB0aGF0IEZJTiBzaG91bGQgYmUgc2VudAorCSAqIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgZG9uZSBzbywgb3Igd2UncmUgcmV0cmFuc21pdHRpbmcgdGhlIEZJTiwKKwkgKiB0aGVuIHdlIG5lZWQgdG8gc2VuZC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBUSF9GSU4gJiYKKwkgICAgKCh0cC0+dF9mbGFncyAmIFRGX1NFTlRGSU4pID09IDAgfHwgdHAtPnNuZF9ueHQgPT0gdHAtPnNuZF91bmEpKQorCQlnb3RvIHNlbmQ7CisKKwkvKgorCSAqIFRDUCB3aW5kb3cgdXBkYXRlcyBhcmUgbm90IHJlbGlhYmxlLCByYXRoZXIgYSBwb2xsaW5nIHByb3RvY29sCisJICogdXNpbmcgYGBwZXJzaXN0JycgcGFja2V0cyBpcyB1c2VkIHRvIGluc3VyZSByZWNlaXB0IG9mIHdpbmRvdworCSAqIHVwZGF0ZXMuICBUaGUgdGhyZWUgYGBzdGF0ZXMnJyBmb3IgdGhlIG91dHB1dCBzaWRlIGFyZToKKwkgKglpZGxlCQkJbm90IGRvaW5nIHJldHJhbnNtaXRzIG9yIHBlcnNpc3RzCisJICoJcGVyc2lzdGluZwkJdG8gbW92ZSBhIHNtYWxsIG9yIHplcm8gd2luZG93CisJICoJKHJlKXRyYW5zbWl0dGluZwlhbmQgdGhlcmVieSBub3QgcGVyc2lzdGluZworCSAqCisJICogdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXQorCSAqCWlzIHNldCB3aGVuIHdlIGFyZSBpbiBwZXJzaXN0IHN0YXRlLgorCSAqIHRwLT50X2ZvcmNlCisJICoJaXMgc2V0IHdoZW4gd2UgYXJlIGNhbGxlZCB0byBzZW5kIGEgcGVyc2lzdCBwYWNrZXQuCisJICogdHAtPnRfdGltZXJbVENQVF9SRVhNVF0KKwkgKglpcyBzZXQgd2hlbiB3ZSBhcmUgcmV0cmFuc21pdHRpbmcKKwkgKiBUaGUgb3V0cHV0IHNpZGUgaXMgaWRsZSB3aGVuIGJvdGggdGltZXJzIGFyZSB6ZXJvLgorCSAqCisJICogSWYgc2VuZCB3aW5kb3cgaXMgdG9vIHNtYWxsLCB0aGVyZSBpcyBkYXRhIHRvIHRyYW5zbWl0LCBhbmQgbm8KKwkgKiByZXRyYW5zbWl0IG9yIHBlcnNpc3QgaXMgcGVuZGluZywgdGhlbiBnbyB0byBwZXJzaXN0IHN0YXRlLgorCSAqIElmIG5vdGhpbmcgaGFwcGVucyBzb29uLCBzZW5kIHdoZW4gdGltZXIgZXhwaXJlczoKKwkgKiBpZiB3aW5kb3cgaXMgbm9uemVybywgdHJhbnNtaXQgd2hhdCB3ZSBjYW4sCisJICogb3RoZXJ3aXNlIGZvcmNlIG91dCBhIGJ5dGUuCisJICovCisJaWYgKHNvLT5zb19zbmQuc2JfY2MgJiYgdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPT0gMCAmJgorCSAgICB0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdID09IDApIHsKKwkJdHAtPnRfcnh0c2hpZnQgPSAwOworCQl0Y3Bfc2V0cGVyc2lzdCh0cCk7CisJfQorCisJLyoKKwkgKiBObyByZWFzb24gdG8gc2VuZCBhIHNlZ21lbnQsIGp1c3QgcmV0dXJuLgorCSAqLworCVNUQVQodGNwc3RhdC50Y3BzX2RpZG51dHRpbisrKTsKKworCXJldHVybiAoMCk7CisKK3NlbmQ6CisJLyoKKwkgKiBCZWZvcmUgRVNUQUJMSVNIRUQsIGZvcmNlIHNlbmRpbmcgb2YgaW5pdGlhbCBvcHRpb25zCisJICogdW5sZXNzIFRDUCBzZXQgbm90IHRvIGRvIGFueSBvcHRpb25zLgorCSAqIE5PVEU6IHdlIGFzc3VtZSB0aGF0IHRoZSBJUC9UQ1AgaGVhZGVyIHBsdXMgVENQIG9wdGlvbnMKKwkgKiBhbHdheXMgZml0IGluIGEgc2luZ2xlIG1idWYsIGxlYXZpbmcgcm9vbSBmb3IgYSBtYXhpbXVtCisJICogbGluayBoZWFkZXIsIGkuZS4KKwkgKgltYXhfbGlua2hkciArIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSArIG9wdGxlbiA8PSBNSExFTgorCSAqLworCW9wdGxlbiA9IDA7CisJaGRybGVuID0gc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpOworCWlmIChmbGFncyAmIFRIX1NZTikgeworCQl0cC0+c25kX254dCA9IHRwLT5pc3M7CisJCWlmICgodHAtPnRfZmxhZ3MgJiBURl9OT09QVCkgPT0gMCkgeworCQkJdV9pbnQxNl90IG1zczsKKworCQkJb3B0WzBdID0gVENQT1BUX01BWFNFRzsKKwkJCW9wdFsxXSA9IDQ7CisJCQltc3MgPSBodG9ucygodV9pbnQxNl90KSB0Y3BfbXNzKHRwLCAwKSk7CisJCQltZW1jcHkoKGNhZGRyX3QpKG9wdCArIDIpLCAoY2FkZHJfdCkmbXNzLCBzaXplb2YobXNzKSk7CisJCQlvcHRsZW4gPSA0OworCisvKgkJCWlmICgodHAtPnRfZmxhZ3MgJiBURl9SRVFfU0NBTEUpICYmCisgKgkJCSAgICAoKGZsYWdzICYgVEhfQUNLKSA9PSAwIHx8CisgKgkJCSAgICAodHAtPnRfZmxhZ3MgJiBURl9SQ1ZEX1NDQUxFKSkpIHsKKyAqCQkJCSooKHVfaW50MzJfdCAqKSAob3B0ICsgb3B0bGVuKSkgPSBodG9ubCgKKyAqCQkJCQlUQ1BPUFRfTk9QIDw8IDI0IHwKKyAqCQkJCQlUQ1BPUFRfV0lORE9XIDw8IDE2IHwKKyAqCQkJCQlUQ1BPTEVOX1dJTkRPVyA8PCA4IHwKKyAqCQkJCQl0cC0+cmVxdWVzdF9yX3NjYWxlKTsKKyAqCQkJCW9wdGxlbiArPSA0OworICoJCQl9CisgKi8KKwkJfQorIAl9CisKKyAJLyoKKwkgKiBTZW5kIGEgdGltZXN0YW1wIGFuZCBlY2hvLXJlcGx5IGlmIHRoaXMgaXMgYSBTWU4gYW5kIG91ciBzaWRlCisJICogd2FudHMgdG8gdXNlIHRpbWVzdGFtcHMgKFRGX1JFUV9UU1RNUCBpcyBzZXQpIG9yIGJvdGggb3VyIHNpZGUKKwkgKiBhbmQgb3VyIHBlZXIgaGF2ZSBzZW50IHRpbWVzdGFtcHMgaW4gb3VyIFNZTidzLgorIAkgKi8KKy8qIAlpZiAoKHRwLT50X2ZsYWdzICYgKFRGX1JFUV9UU1RNUHxURl9OT09QVCkpID09IFRGX1JFUV9UU1RNUCAmJgorICoJICAgICAoZmxhZ3MgJiBUSF9SU1QpID09IDAgJiYKKyAqCSAgICAoKGZsYWdzICYgKFRIX1NZTnxUSF9BQ0spKSA9PSBUSF9TWU4gfHwKKyAqCSAgICAgKHRwLT50X2ZsYWdzICYgVEZfUkNWRF9UU1RNUCkpKSB7CisgKgkJdV9pbnQzMl90ICpscCA9ICh1X2ludDMyX3QgKikob3B0ICsgb3B0bGVuKTsKKyAqCisgKgkJLyAqIEZvcm0gdGltZXN0YW1wIG9wdGlvbiBhcyBzaG93biBpbiBhcHBlbmRpeCBBIG9mIFJGQyAxMzIzLiAqICAvCisgKgkJKmxwKysgPSBodG9ubChUQ1BPUFRfVFNUQU1QX0hEUik7CisgKgkJKmxwKysgPSBodG9ubCh0Y3Bfbm93KTsKKyAqCQkqbHAgICA9IGh0b25sKHRwLT50c19yZWNlbnQpOworICoJCW9wdGxlbiArPSBUQ1BPTEVOX1RTVEFNUF9BUFBBOworICoJfQorICovCisgCWhkcmxlbiArPSBvcHRsZW47CisKKwkvKgorCSAqIEFkanVzdCBkYXRhIGxlbmd0aCBpZiBpbnNlcnRpb24gb2Ygb3B0aW9ucyB3aWxsCisJICogYnVtcCB0aGUgcGFja2V0IGxlbmd0aCBiZXlvbmQgdGhlIHRfbWF4c2VnIGxlbmd0aC4KKwkgKi8KKwkgaWYgKGxlbiA+IHRwLT50X21heHNlZyAtIG9wdGxlbikgeworCQlsZW4gPSB0cC0+dF9tYXhzZWcgLSBvcHRsZW47CisJCXNlbmRhbG90ID0gMTsKKwkgfQorCisJLyoKKwkgKiBHcmFiIGEgaGVhZGVyIG1idWYsIGF0dGFjaGluZyBhIGNvcHkgb2YgZGF0YSB0bworCSAqIGJlIHRyYW5zbWl0dGVkLCBhbmQgaW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGZyb20KKwkgKiB0aGUgdGVtcGxhdGUgZm9yIHNlbmRzIG9uIHRoaXMgY29ubmVjdGlvbi4KKwkgKi8KKwlpZiAobGVuKSB7CisJCWlmICh0cC0+dF9mb3JjZSAmJiBsZW4gPT0gMSkKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHByb2JlKyspOworCQllbHNlIGlmIChTRVFfTFQodHAtPnNuZF9ueHQsIHRwLT5zbmRfbWF4KSkgeworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfc25kcmV4bWl0cGFjaysrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHJleG1pdGJ5dGUgKz0gbGVuKTsKKwkJfSBlbHNlIHsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHBhY2srKyk7CisJCQlTVEFUKHRjcHN0YXQudGNwc19zbmRieXRlICs9IGxlbik7CisJCX0KKworCQltID0gbV9nZXQoKTsKKwkJaWYgKG0gPT0gTlVMTCkgeworLyoJCQllcnJvciA9IEVOT0JVRlM7ICovCisJCQllcnJvciA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQltLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKwkJbS0+bV9sZW4gPSBoZHJsZW47CisKKwkJLyoKKwkJICogVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZSBtYWtlIHN1cmUgb3VyIG1idWZzCisJCSAqIGFyZSBiaWcgZW5vdWdoIHRvIGhvbGQgb25lIE1TUyBwYWNrZXQgKyBoZWFkZXIgKyAuLi4gZXRjLgorCQkgKi8KKy8qCQlpZiAobGVuIDw9IE1ITEVOIC0gaGRybGVuIC0gbWF4X2xpbmtoZHIpIHsgKi8KKworCQkJc2Jjb3B5KCZzby0+c29fc25kLCBvZmYsIChpbnQpIGxlbiwgbXRvZChtLCBjYWRkcl90KSArIGhkcmxlbik7CisJCQltLT5tX2xlbiArPSBsZW47CisKKy8qCQl9IGVsc2UgeworICoJCQltLT5tX25leHQgPSBtX2NvcHkoc28tPnNvX3NuZC5zYl9tYiwgb2ZmLCAoaW50KSBsZW4pOworICoJCQlpZiAobS0+bV9uZXh0ID09IDApCisgKgkJCQlsZW4gPSAwOworICoJCX0KKyAqLworCQkvKgorCQkgKiBJZiB3ZSdyZSBzZW5kaW5nIGV2ZXJ5dGhpbmcgd2UndmUgZ290LCBzZXQgUFVTSC4KKwkJICogKFRoaXMgd2lsbCBrZWVwIGhhcHB5IHRob3NlIGltcGxlbWVudGF0aW9ucyB3aGljaCBvbmx5CisJCSAqIGdpdmUgZGF0YSB0byB0aGUgdXNlciB3aGVuIGEgYnVmZmVyIGZpbGxzIG9yCisJCSAqIGEgUFVTSCBjb21lcyBpbi4pCisJCSAqLworCQlpZiAob2ZmICsgbGVuID09IHNvLT5zb19zbmQuc2JfY2MpCisJCQlmbGFncyB8PSBUSF9QVVNIOworCX0gZWxzZSB7CisJCWlmICh0cC0+dF9mbGFncyAmIFRGX0FDS05PVykKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZGFja3MrKyk7CisJCWVsc2UgaWYgKGZsYWdzICYgKFRIX1NZTnxUSF9GSU58VEhfUlNUKSkKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZGN0cmwrKyk7CisJCWVsc2UgaWYgKFNFUV9HVCh0cC0+c25kX3VwLCB0cC0+c25kX3VuYSkpCisJCQlTVEFUKHRjcHN0YXQudGNwc19zbmR1cmcrKyk7CisJCWVsc2UKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHdpbnVwKyspOworCisJCW0gPSBtX2dldCgpOworCQlpZiAobSA9PSBOVUxMKSB7CisvKgkJCWVycm9yID0gRU5PQlVGUzsgKi8KKwkJCWVycm9yID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW0tPm1fZGF0YSArPSBJRl9NQVhMSU5LSERSOworCQltLT5tX2xlbiA9IGhkcmxlbjsKKwl9CisKKwl0aSA9IG10b2QobSwgc3RydWN0IHRjcGlwaGRyICopOworCisJbWVtY3B5KChjYWRkcl90KXRpLCAmdHAtPnRfdGVtcGxhdGUsIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSk7CisKKwkvKgorCSAqIEZpbGwgaW4gZmllbGRzLCByZW1lbWJlcmluZyBtYXhpbXVtIGFkdmVydGlzZWQKKwkgKiB3aW5kb3cgZm9yIHVzZSBpbiBkZWxheWluZyBtZXNzYWdlcyBhYm91dCB3aW5kb3cgc2l6ZXMuCisJICogSWYgcmVzZW5kaW5nIGEgRklOLCBiZSBzdXJlIG5vdCB0byB1c2UgYSBuZXcgc2VxdWVuY2UgbnVtYmVyLgorCSAqLworCWlmIChmbGFncyAmIFRIX0ZJTiAmJiB0cC0+dF9mbGFncyAmIFRGX1NFTlRGSU4gJiYKKwkgICAgdHAtPnNuZF9ueHQgPT0gdHAtPnNuZF9tYXgpCisJCXRwLT5zbmRfbnh0LS07CisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgcmV0cmFuc21pc3Npb25zLCB0aGVuIHNuZF9ueHQgd2lsbAorCSAqIG5vdCByZWZsZWN0IHRoZSBmaXJzdCB1bnNlbnQgb2N0ZXQuICBGb3IgQUNLIG9ubHkKKwkgKiBwYWNrZXRzLCB3ZSBkbyBub3Qgd2FudCB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorCSAqIHJldHJhbnNtaXR0ZWQgcGFja2V0LCB3ZSB3YW50IHRoZSBzZXF1ZW5jZSBudW1iZXIKKwkgKiBvZiB0aGUgbmV4dCB1bnNlbnQgb2N0ZXQuICBTbywgaWYgdGhlcmUgaXMgbm8gZGF0YQorCSAqIChhbmQgbm8gU1lOIG9yIEZJTiksIHVzZSBzbmRfbWF4IGluc3RlYWQgb2Ygc25kX254dAorCSAqIHdoZW4gZmlsbGluZyBpbiB0aV9zZXEuICBCdXQgaWYgd2UgYXJlIGluIHBlcnNpc3QKKwkgKiBzdGF0ZSwgc25kX21heCBtaWdodCByZWZsZWN0IG9uZSBieXRlIGJleW9uZCB0aGUKKwkgKiByaWdodCBlZGdlIG9mIHRoZSB3aW5kb3csIHNvIHVzZSBzbmRfbnh0IGluIHRoYXQKKwkgKiBjYXNlLCBzaW5jZSB3ZSBrbm93IHdlIGFyZW4ndCBkb2luZyBhIHJldHJhbnNtaXNzaW9uLgorCSAqIChyZXRyYW5zbWl0IGFuZCBwZXJzaXN0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuLi4pCisJICovCisJaWYgKGxlbiB8fCAoZmxhZ3MgJiAoVEhfU1lOfFRIX0ZJTikpIHx8IHRwLT50X3RpbWVyW1RDUFRfUEVSU0lTVF0pCisJCXRpLT50aV9zZXEgPSBodG9ubCh0cC0+c25kX254dCk7CisJZWxzZQorCQl0aS0+dGlfc2VxID0gaHRvbmwodHAtPnNuZF9tYXgpOworCXRpLT50aV9hY2sgPSBodG9ubCh0cC0+cmN2X254dCk7CisJaWYgKG9wdGxlbikgeworCQltZW1jcHkoKGNhZGRyX3QpKHRpICsgMSksIChjYWRkcl90KW9wdCwgb3B0bGVuKTsKKwkJdGktPnRpX29mZiA9IChzaXplb2YgKHN0cnVjdCB0Y3BoZHIpICsgb3B0bGVuKSA+PiAyOworCX0KKwl0aS0+dGlfZmxhZ3MgPSBmbGFnczsKKwkvKgorCSAqIENhbGN1bGF0ZSByZWNlaXZlIHdpbmRvdy4gIERvbid0IHNocmluayB3aW5kb3csCisJICogYnV0IGF2b2lkIHNpbGx5IHdpbmRvdyBzeW5kcm9tZS4KKwkgKi8KKwlpZiAod2luIDwgKGxvbmcpKHNvLT5zb19yY3Yuc2JfZGF0YWxlbiAvIDQpICYmIHdpbiA8IChsb25nKXRwLT50X21heHNlZykKKwkJd2luID0gMDsKKwlpZiAod2luID4gKGxvbmcpVENQX01BWFdJTiA8PCB0cC0+cmN2X3NjYWxlKQorCQl3aW4gPSAobG9uZylUQ1BfTUFYV0lOIDw8IHRwLT5yY3Zfc2NhbGU7CisJaWYgKHdpbiA8IChsb25nKSh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KSkKKwkJd2luID0gKGxvbmcpKHRwLT5yY3ZfYWR2IC0gdHAtPnJjdl9ueHQpOworCXRpLT50aV93aW4gPSBodG9ucygodV9pbnQxNl90KSAod2luPj50cC0+cmN2X3NjYWxlKSk7CisKKwlpZiAoU0VRX0dUKHRwLT5zbmRfdXAsIHRwLT5zbmRfdW5hKSkgeworCQl0aS0+dGlfdXJwID0gaHRvbnMoKHVfaW50MTZfdCkodHAtPnNuZF91cCAtIG50b2hsKHRpLT50aV9zZXEpKSk7CisjaWZkZWYgbm90ZGVmCisJaWYgKFNFUV9HVCh0cC0+c25kX3VwLCB0cC0+c25kX254dCkpIHsKKwkJdGktPnRpX3VycCA9IGh0b25zKCh1X2ludDE2X3QpKHRwLT5zbmRfdXAgLSB0cC0+c25kX254dCkpOworI2VuZGlmCisJCXRpLT50aV9mbGFncyB8PSBUSF9VUkc7CisJfSBlbHNlCisJCS8qCisJCSAqIElmIG5vIHVyZ2VudCBwb2ludGVyIHRvIHNlbmQsIHRoZW4gd2UgcHVsbAorCQkgKiB0aGUgdXJnZW50IHBvaW50ZXIgdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGUgc2VuZCB3aW5kb3cKKwkJICogc28gdGhhdCBpdCBkb2Vzbid0IGRyaWZ0IGludG8gdGhlIHNlbmQgd2luZG93IG9uIHNlcXVlbmNlCisJCSAqIG51bWJlciB3cmFwYXJvdW5kLgorCQkgKi8KKwkJdHAtPnNuZF91cCA9IHRwLT5zbmRfdW5hOwkJLyogZHJhZyBpdCBhbG9uZyAqLworCisJLyoKKwkgKiBQdXQgVENQIGxlbmd0aCBpbiBleHRlbmRlZCBoZWFkZXIsIGFuZCB0aGVuCisJICogY2hlY2tzdW0gZXh0ZW5kZWQgaGVhZGVyIGFuZCBkYXRhLgorCSAqLworCWlmIChsZW4gKyBvcHRsZW4pCisJCXRpLT50aV9sZW4gPSBodG9ucygodV9pbnQxNl90KShzaXplb2YgKHN0cnVjdCB0Y3BoZHIpICsKKwkJICAgIG9wdGxlbiArIGxlbikpOworCXRpLT50aV9zdW0gPSBja3N1bShtLCAoaW50KShoZHJsZW4gKyBsZW4pKTsKKworCS8qCisJICogSW4gdHJhbnNtaXQgc3RhdGUsIHRpbWUgdGhlIHRyYW5zbWlzc2lvbiBhbmQgYXJyYW5nZSBmb3IKKwkgKiB0aGUgcmV0cmFuc21pdC4gIEluIHBlcnNpc3Qgc3RhdGUsIGp1c3Qgc2V0IHNuZF9tYXguCisJICovCisJaWYgKHRwLT50X2ZvcmNlID09IDAgfHwgdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXSA9PSAwKSB7CisJCXRjcF9zZXEgc3RhcnRzZXEgPSB0cC0+c25kX254dDsKKworCQkvKgorCQkgKiBBZHZhbmNlIHNuZF9ueHQgb3ZlciBzZXF1ZW5jZSBzcGFjZSBvZiB0aGlzIHNlZ21lbnQuCisJCSAqLworCQlpZiAoZmxhZ3MgJiAoVEhfU1lOfFRIX0ZJTikpIHsKKwkJCWlmIChmbGFncyAmIFRIX1NZTikKKwkJCQl0cC0+c25kX254dCsrOworCQkJaWYgKGZsYWdzICYgVEhfRklOKSB7CisJCQkJdHAtPnNuZF9ueHQrKzsKKwkJCQl0cC0+dF9mbGFncyB8PSBURl9TRU5URklOOworCQkJfQorCQl9CisJCXRwLT5zbmRfbnh0ICs9IGxlbjsKKwkJaWYgKFNFUV9HVCh0cC0+c25kX254dCwgdHAtPnNuZF9tYXgpKSB7CisJCQl0cC0+c25kX21heCA9IHRwLT5zbmRfbnh0OworCQkJLyoKKwkJCSAqIFRpbWUgdGhpcyB0cmFuc21pc3Npb24gaWYgbm90IGEgcmV0cmFuc21pc3Npb24gYW5kCisJCQkgKiBub3QgY3VycmVudGx5IHRpbWluZyBhbnl0aGluZy4KKwkJCSAqLworCQkJaWYgKHRwLT50X3J0dCA9PSAwKSB7CisJCQkJdHAtPnRfcnR0ID0gMTsKKwkJCQl0cC0+dF9ydHNlcSA9IHN0YXJ0c2VxOworCQkJCVNUQVQodGNwc3RhdC50Y3BzX3NlZ3N0aW1lZCsrKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFNldCByZXRyYW5zbWl0IHRpbWVyIGlmIG5vdCBjdXJyZW50bHkgc2V0LAorCQkgKiBhbmQgbm90IGRvaW5nIGFuIGFjayBvciBhIGtlZXAtYWxpdmUgcHJvYmUuCisJCSAqIEluaXRpYWwgdmFsdWUgZm9yIHJldHJhbnNtaXQgdGltZXIgaXMgc21vb3RoZWQKKwkJICogcm91bmQtdHJpcCB0aW1lICsgMiAqIHJvdW5kLXRyaXAgdGltZSB2YXJpYW5jZS4KKwkJICogSW5pdGlhbGl6ZSBzaGlmdCBjb3VudGVyIHdoaWNoIGlzIHVzZWQgZm9yIGJhY2tvZmYKKwkJICogb2YgcmV0cmFuc21pdCB0aW1lLgorCQkgKi8KKwkJaWYgKHRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID09IDAgJiYKKwkJICAgIHRwLT5zbmRfbnh0ICE9IHRwLT5zbmRfdW5hKSB7CisJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IHRwLT50X3J4dGN1cjsKKwkJCWlmICh0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdKSB7CisJCQkJdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXSA9IDA7CisJCQkJdHAtPnRfcnh0c2hpZnQgPSAwOworCQkJfQorCQl9CisJfSBlbHNlCisJCWlmIChTRVFfR1QodHAtPnNuZF9ueHQgKyBsZW4sIHRwLT5zbmRfbWF4KSkKKwkJCXRwLT5zbmRfbWF4ID0gdHAtPnNuZF9ueHQgKyBsZW47CisKKwkvKgorCSAqIEZpbGwgaW4gSVAgbGVuZ3RoIGFuZCBkZXNpcmVkIHRpbWUgdG8gbGl2ZSBhbmQKKwkgKiBzZW5kIHRvIElQIGxldmVsLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheQorCSAqIHRvIGhhbmRsZSB0dGwgYW5kIHRvczsgd2UgY291bGQga2VlcCB0aGVtIGluCisJICogdGhlIHRlbXBsYXRlLCBidXQgbmVlZCBhIHdheSB0byBjaGVja3N1bSB3aXRob3V0IHRoZW0uCisJICovCisJbS0+bV9sZW4gPSBoZHJsZW4gKyBsZW47IC8qIFhYWCBOZWVkZWQ/IG1fbGVuIHNob3VsZCBiZSBjb3JyZWN0ICovCisKKyAgICB7CisKKwkoKHN0cnVjdCBpcCAqKXRpKS0+aXBfbGVuID0gbS0+bV9sZW47CisKKwkoKHN0cnVjdCBpcCAqKXRpKS0+aXBfdHRsID0gSVBERUZUVEw7CisJKChzdHJ1Y3QgaXAgKil0aSktPmlwX3RvcyA9IHNvLT5zb19pcHRvczsKKworLyogI2lmIEJTRCA+PSA0MyAqLworCS8qIERvbid0IGRvIElQIG9wdGlvbnMuLi4gKi8KKy8qCWVycm9yID0gaXBfb3V0cHV0KG0sIHRwLT50X2lucGNiLT5pbnBfb3B0aW9ucywgJnRwLT50X2lucGNiLT5pbnBfcm91dGUsCisgKgkgICAgc28tPnNvX29wdGlvbnMgJiBTT19ET05UUk9VVEUsIDApOworICovCisJZXJyb3IgPSBpcF9vdXRwdXQoc28sIG0pOworCisvKiAjZWxzZQorICoJZXJyb3IgPSBpcF9vdXRwdXQobSwgKHN0cnVjdCBtYnVmICopMCwgJnRwLT50X2lucGNiLT5pbnBfcm91dGUsCisgKgkgICAgc28tPnNvX29wdGlvbnMgJiBTT19ET05UUk9VVEUpOworICogI2VuZGlmCisgKi8KKyAgICB9CisJaWYgKGVycm9yKSB7CitvdXQ6CisvKgkJaWYgKGVycm9yID09IEVOT0JVRlMpIHsKKyAqCQkJdGNwX3F1ZW5jaCh0cC0+dF9pbnBjYiwgMCk7CisgKgkJCXJldHVybiAoMCk7CisgKgkJfQorICovCisvKgkJaWYgKChlcnJvciA9PSBFSE9TVFVOUkVBQ0ggfHwgZXJyb3IgPT0gRU5FVERPV04pCisgKgkJICAgICYmIFRDUFNfSEFWRVJDVkRTWU4odHAtPnRfc3RhdGUpKSB7CisgKgkJCXRwLT50X3NvZnRlcnJvciA9IGVycm9yOworICoJCQlyZXR1cm4gKDApOworICoJCX0KKyAqLworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJU1RBVCh0Y3BzdGF0LnRjcHNfc25kdG90YWwrKyk7CisKKwkvKgorCSAqIERhdGEgc2VudCAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKS4KKwkgKiBJZiB0aGlzIGFkdmVydGlzZXMgYSBsYXJnZXIgd2luZG93IHRoYW4gYW55IG90aGVyIHNlZ21lbnQsCisJICogdGhlbiByZW1lbWJlciB0aGUgc2l6ZSBvZiB0aGUgYWR2ZXJ0aXNlZCB3aW5kb3cuCisJICogQW55IHBlbmRpbmcgQUNLIGhhcyBub3cgYmVlbiBzZW50LgorCSAqLworCWlmICh3aW4gPiAwICYmIFNFUV9HVCh0cC0+cmN2X254dCt3aW4sIHRwLT5yY3ZfYWR2KSkKKwkJdHAtPnJjdl9hZHYgPSB0cC0+cmN2X254dCArIHdpbjsKKwl0cC0+bGFzdF9hY2tfc2VudCA9IHRwLT5yY3Zfbnh0OworCXRwLT50X2ZsYWdzICY9IH4oVEZfQUNLTk9XfFRGX0RFTEFDSyk7CisJaWYgKHNlbmRhbG90KQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZAordGNwX3NldHBlcnNpc3Qoc3RydWN0IHRjcGNiICp0cCkKK3sKKyAgICBpbnQgdCA9ICgodHAtPnRfc3J0dCA+PiAyKSArIHRwLT50X3J0dHZhcikgPj4gMTsKKworLyoJaWYgKHRwLT50X3RpbWVyW1RDUFRfUkVYTVRdKQorICoJCXBhbmljKCJ0Y3Bfb3V0cHV0IFJFWE1UIik7CisgKi8KKwkvKgorCSAqIFN0YXJ0L3Jlc3RhcnQgcGVyc2lzdGVuY2UgdGltZXIuCisJICovCisJVENQVF9SQU5HRVNFVCh0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdLAorCSAgICB0ICogdGNwX2JhY2tvZmZbdHAtPnRfcnh0c2hpZnRdLAorCSAgICBUQ1BUVl9QRVJTTUlOLCBUQ1BUVl9QRVJTTUFYKTsKKwlpZiAodHAtPnRfcnh0c2hpZnQgPCBUQ1BfTUFYUlhUU0hJRlQpCisJCXRwLT50X3J4dHNoaWZ0Kys7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX3N1YnIuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3Bfc3Vici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MjljNTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX3N1YnIuYwpAQCAtMCwwICsxLDExNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwX3N1YnIuYwk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiB0Y3Bfc3Vici5jLHYgMS41IDE5OTQvMTAvMDggMjI6Mzk6NTggcGhrIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjZGVmaW5lIFdBTlRfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgImFuZHJvaWQvcHJveHkvcHJveHlfY29tbW9uLmgiCisKKy8qIHBhdGNoYWJsZS9zZXR0YWJsZSBwYXJhbWV0ZXJzIGZvciB0Y3AgKi8KKy8qIERvbid0IGRvIHJmYzEzMjMgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzICovCisjZGVmaW5lIFRDUF9ET19SRkMxMzIzIDAKKworLyoKKyAqIFRjcCBpbml0aWFsaXphdGlvbgorICovCit2b2lkCit0Y3BfaW5pdCh2b2lkKQoreworCXRjcF9pc3MgPSAxOwkJLyogd3JvbmcgKi8KKwl0Y2Iuc29fbmV4dCA9IHRjYi5zb19wcmV2ID0gJnRjYjsKK30KKworLyoKKyAqIENyZWF0ZSB0ZW1wbGF0ZSB0byBiZSB1c2VkIHRvIHNlbmQgdGNwIHBhY2tldHMgb24gYSBjb25uZWN0aW9uLgorICogQ2FsbCBhZnRlciBob3N0IGVudHJ5IGNyZWF0ZWQsIGZpbGxzCisgKiBpbiBhIHNrZWxldGFsIHRjcC9pcCBoZWFkZXIsIG1pbmltaXppbmcgdGhlIGFtb3VudCBvZiB3b3JrCisgKiBuZWNlc3Nhcnkgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyB1c2VkLgorICovCisvKiBzdHJ1Y3QgdGNwaXBoZHIgKiAqLwordm9pZAordGNwX3RlbXBsYXRlKHN0cnVjdCB0Y3BjYiAqdHApCit7CisJc3RydWN0IHNvY2tldCAqc28gPSB0cC0+dF9zb2NrZXQ7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICpuID0gJnRwLT50X3RlbXBsYXRlOworCisJbi0+dGlfbWJ1ZiA9IE5VTEw7CisJbi0+dGlfeDEgPSAwOworCW4tPnRpX3ByID0gSVBQUk9UT19UQ1A7CisJbi0+dGlfbGVuID0gaHRvbnMoc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpIC0gc2l6ZW9mIChzdHJ1Y3QgaXApKTsKKwluLT50aV9zcmMgPSBpcF9zZXRoKHNvLT5zb19mYWRkcl9pcCk7CisJbi0+dGlfZHN0ID0gaXBfc2V0aChzby0+c29fbGFkZHJfaXApOworCW4tPnRpX3Nwb3J0ID0gcG9ydF9zZXRoKHNvLT5zb19mYWRkcl9wb3J0KTsKKwluLT50aV9kcG9ydCA9IHBvcnRfc2V0aChzby0+c29fbGFkZHJfcG9ydCk7CisKKwluLT50aV9zZXEgPSAwOworCW4tPnRpX2FjayA9IDA7CisJbi0+dGlfeDIgPSAwOworCW4tPnRpX29mZiA9IDU7CisJbi0+dGlfZmxhZ3MgPSAwOworCW4tPnRpX3dpbiA9IDA7CisJbi0+dGlfc3VtID0gMDsKKwluLT50aV91cnAgPSAwOworfQorCisvKgorICogU2VuZCBhIHNpbmdsZSBtZXNzYWdlIHRvIHRoZSBUQ1AgYXQgYWRkcmVzcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSBnaXZlbiBUQ1AvSVAgaGVhZGVyLiAgSWYgbSA9PSAwLCB0aGVuIHdlIG1ha2UgYSBjb3B5CisgKiBvZiB0aGUgdGNwaXBoZHIgYXQgdGkgYW5kIHNlbmQgZGlyZWN0bHkgdG8gdGhlIGFkZHJlc3NlZCBob3N0LgorICogVGhpcyBpcyB1c2VkIHRvIGZvcmNlIGtlZXAgYWxpdmUgbWVzc2FnZXMgb3V0IHVzaW5nIHRoZSBUQ1AKKyAqIHRlbXBsYXRlIGZvciBhIGNvbm5lY3Rpb24gdHAtPnRfdGVtcGxhdGUuICBJZiBmbGFncyBhcmUgZ2l2ZW4KKyAqIHRoZW4gd2Ugc2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgVENQIHdoaWNoIG9yaWdpbmF0ZWQgdGhlCisgKiBzZWdtZW50IHRpLCBhbmQgZGlzY2FyZCB0aGUgbWJ1ZiBjb250YWluaW5nIGl0IGFuZCBhbnkgb3RoZXIKKyAqIGF0dGFjaGVkIG1idWZzLgorICoKKyAqIEluIGFueSBjYXNlIHRoZSBhY2sgYW5kIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgdHJhbnNtaXR0ZWQKKyAqIHNlZ21lbnQgYXJlIGFzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVycy4KKyAqLwordm9pZAordGNwX3Jlc3BvbmQoc3RydWN0IHRjcGNiICp0cCwgc3RydWN0IHRjcGlwaGRyICp0aSwgc3RydWN0IG1idWYgKm0sCisgICAgICAgICAgICB0Y3Bfc2VxIGFjaywgdGNwX3NlcSBzZXEsIGludCBmbGFncykKK3sKKwlyZWdpc3RlciBpbnQgdGxlbjsKKwlpbnQgd2luID0gMDsKKworCURFQlVHX0NBTEwoInRjcF9yZXNwb25kIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nKXRwKTsKKwlERUJVR19BUkcoInRpID0gJWx4IiwgKGxvbmcpdGkpOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygiYWNrID0gJXUiLCBhY2spOworCURFQlVHX0FSRygic2VxID0gJXUiLCBzZXEpOworCURFQlVHX0FSRygiZmxhZ3MgPSAleCIsIGZsYWdzKTsKKworCWlmICh0cCkKKwkJd2luID0gc2JzcGFjZSgmdHAtPnRfc29ja2V0LT5zb19yY3YpOworICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisJCWlmICgobSA9IG1fZ2V0KCkpID09IE5VTEwpCisJCQlyZXR1cm47CisjaWZkZWYgVENQX0NPTVBBVF80MgorCQl0bGVuID0gMTsKKyNlbHNlCisJCXRsZW4gPSAwOworI2VuZGlmCisJCW0tPm1fZGF0YSArPSBJRl9NQVhMSU5LSERSOworCQkqbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKikgPSAqdGk7CisJCXRpID0gbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKik7CisJCWZsYWdzID0gVEhfQUNLOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHRpIHBvaW50cyBpbnRvIG0gc28gdGhlIG5leHQgbGluZSBpcyBqdXN0IG1ha2luZworCQkgKiB0aGUgbWJ1ZiBwb2ludCB0byB0aQorCQkgKi8KKwkJbS0+bV9kYXRhID0gKGNhZGRyX3QpdGk7CisKKwkJbS0+bV9sZW4gPSBzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcik7CisJCXRsZW4gPSAwOworI2RlZmluZSB4Y2hnKGEsYix0eXBlKSB7IHR5cGUgdDsgdD1hOyBhPWI7IGI9dDsgfQorCQl4Y2hnKHRpLT50aV9kc3QsIHRpLT50aV9zcmMsIGlwYWRkcl90KTsKKwkJeGNoZyh0aS0+dGlfZHBvcnQsIHRpLT50aV9zcG9ydCwgcG9ydF90KTsKKyN1bmRlZiB4Y2hnCisJfQorCXRpLT50aV9sZW4gPSBodG9ucygodV9zaG9ydCkoc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSArIHRsZW4pKTsKKwl0bGVuICs9IHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKTsKKwltLT5tX2xlbiA9IHRsZW47CisKKyAgICAgICAgdGktPnRpX21idWYgPSBOVUxMOworCXRpLT50aV94MSA9IDA7CisJdGktPnRpX3NlcSA9IGh0b25sKHNlcSk7CisJdGktPnRpX2FjayA9IGh0b25sKGFjayk7CisJdGktPnRpX3gyID0gMDsKKwl0aS0+dGlfb2ZmID0gc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSA+PiAyOworCXRpLT50aV9mbGFncyA9IGZsYWdzOworCWlmICh0cCkKKwkJdGktPnRpX3dpbiA9IGh0b25zKCh1X2ludDE2X3QpICh3aW4gPj4gdHAtPnJjdl9zY2FsZSkpOworCWVsc2UKKwkJdGktPnRpX3dpbiA9IGh0b25zKCh1X2ludDE2X3Qpd2luKTsKKwl0aS0+dGlfdXJwID0gMDsKKwl0aS0+dGlfc3VtID0gMDsKKwl0aS0+dGlfc3VtID0gY2tzdW0obSwgdGxlbik7CisJKChzdHJ1Y3QgaXAgKil0aSktPmlwX2xlbiA9IHRsZW47CisKKwlpZihmbGFncyAmIFRIX1JTVCkKKwkgICgoc3RydWN0IGlwICopdGkpLT5pcF90dGwgPSBNQVhUVEw7CisJZWxzZQorCSAgKChzdHJ1Y3QgaXAgKil0aSktPmlwX3R0bCA9IElQREVGVFRMOworCisJKHZvaWQpIGlwX291dHB1dCgoc3RydWN0IHNvY2tldCAqKTAsIG0pOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IFRDUCBjb250cm9sIGJsb2NrLCBtYWtpbmcgYW4KKyAqIGVtcHR5IHJlYXNzZW1ibHkgcXVldWUgYW5kIGhvb2tpbmcgaXQgdG8gdGhlIGFyZ3VtZW50CisgKiBwcm90b2NvbCBjb250cm9sIGJsb2NrLgorICovCitzdHJ1Y3QgdGNwY2IgKgordGNwX25ld3RjcGNiKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHA7CisKKwl0cCA9IChzdHJ1Y3QgdGNwY2IgKiltYWxsb2Moc2l6ZW9mKCp0cCkpOworCWlmICh0cCA9PSBOVUxMKQorCQlyZXR1cm4gKChzdHJ1Y3QgdGNwY2IgKikwKTsKKworCW1lbXNldCgoY2hhciAqKSB0cCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpOworCXRwLT5zZWdfbmV4dCA9IHRwLT5zZWdfcHJldiA9IChzdHJ1Y3QgdGNwaXBoZHIqKXRwOworCXRwLT50X21heHNlZyA9IFRDUF9NU1M7CisKKwl0cC0+dF9mbGFncyA9IFRDUF9ET19SRkMxMzIzID8gKFRGX1JFUV9TQ0FMRXxURl9SRVFfVFNUTVApIDogMDsKKwl0cC0+dF9zb2NrZXQgPSBzbzsKKworCS8qCisJICogSW5pdCBzcnR0IHRvIFRDUFRWX1NSVFRCQVNFICgwKSwgc28gd2UgY2FuIHRlbGwgdGhhdCB3ZSBoYXZlIG5vCisJICogcnR0IGVzdGltYXRlLiAgU2V0IHJ0dHZhciBzbyB0aGF0IHNydHQgKyAyICogcnR0dmFyIGdpdmVzCisJICogcmVhc29uYWJsZSBpbml0aWFsIHJldHJhbnNtaXQgdGltZS4KKwkgKi8KKwl0cC0+dF9zcnR0ID0gVENQVFZfU1JUVEJBU0U7CisJdHAtPnRfcnR0dmFyID0gVENQVFZfU1JUVERGTFQgPDwgMjsKKwl0cC0+dF9ydHRtaW4gPSBUQ1BUVl9NSU47CisKKwlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwKKwkgICAgKChUQ1BUVl9TUlRUQkFTRSA+PiAyKSArIChUQ1BUVl9TUlRUREZMVCA8PCAyKSkgPj4gMSwKKwkgICAgVENQVFZfTUlOLCBUQ1BUVl9SRVhNVE1BWCk7CisKKwl0cC0+c25kX2N3bmQgPSBUQ1BfTUFYV0lOIDw8IFRDUF9NQVhfV0lOU0hJRlQ7CisJdHAtPnNuZF9zc3RocmVzaCA9IFRDUF9NQVhXSU4gPDwgVENQX01BWF9XSU5TSElGVDsKKwl0cC0+dF9zdGF0ZSA9IFRDUFNfQ0xPU0VEOworCisJc28tPnNvX3RjcGNiID0gdHA7CisKKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIERyb3AgYSBUQ1AgY29ubmVjdGlvbiwgcmVwb3J0aW5nCisgKiB0aGUgc3BlY2lmaWVkIGVycm9yLiAgSWYgY29ubmVjdGlvbiBpcyBzeW5jaHJvbml6ZWQsCisgKiB0aGVuIHNlbmQgYSBSU1QgdG8gcGVlci4KKyAqLworc3RydWN0IHRjcGNiICp0Y3BfZHJvcChzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgZXJyKQoreworLyogdGNwX2Ryb3AodHAsIGVycm5vKQorCXJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHA7CisJaW50IGVycm5vOworeworKi8KKworCURFQlVHX0NBTEwoInRjcF9kcm9wIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nKXRwKTsKKwlERUJVR19BUkcoImVycm5vID0gJWQiLCBlcnJubyk7CisKKwlpZiAoVENQU19IQVZFUkNWRFNZTih0cC0+dF9zdGF0ZSkpIHsKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQlTVEFUKHRjcHN0YXQudGNwc19kcm9wcysrKTsKKwl9IGVsc2UKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfY29ubmRyb3BzKyspOworLyoJaWYgKGVycm5vID09IEVUSU1FRE9VVCAmJiB0cC0+dF9zb2Z0ZXJyb3IpCisgKgkJZXJybm8gPSB0cC0+dF9zb2Z0ZXJyb3I7CisgKi8KKy8qCXNvLT5zb19lcnJvciA9IGVycm5vOyAqLworCXJldHVybiAodGNwX2Nsb3NlKHRwKSk7Cit9CisKKy8qCisgKiBDbG9zZSBhIFRDUCBjb250cm9sIGJsb2NrOgorICoJZGlzY2FyZCBhbGwgc3BhY2UgaGVsZCBieSB0aGUgdGNwCisgKglkaXNjYXJkIGludGVybmV0IHByb3RvY29sIGJsb2NrCisgKgl3YWtlIHVwIGFueSBzbGVlcGVycworICovCitzdHJ1Y3QgdGNwY2IgKgordGNwX2Nsb3NlKHN0cnVjdCB0Y3BjYiAqdHApCit7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICp0OworCXN0cnVjdCBzb2NrZXQgKnNvID0gdHAtPnRfc29ja2V0OworCXJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOworCisJREVCVUdfQ0FMTCgidGNwX2Nsb3NlIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nICl0cCk7CisKKwkvKiBmcmVlIHRoZSByZWFzc2VtYmx5IHF1ZXVlLCBpZiBhbnkgKi8KKwl0ID0gdGNwZnJhZ19saXN0X2ZpcnN0KHRwKTsKKwl3aGlsZSAoIXRjcGZyYWdfbGlzdF9lbmQodCwgdHApKSB7CisJCXQgPSB0Y3BpcGhkcl9uZXh0KHQpOworCQltID0gdGNwaXBoZHJfcHJldih0KS0+dGlfbWJ1ZjsKKwkJcmVtcXVlKHRjcGlwaGRyMnFsaW5rKHRjcGlwaGRyX3ByZXYodCkpKTsKKwkJbV9mcmVlbShtKTsKKwl9CisJLyogSXQncyBzdGF0aWMgKi8KKy8qCWlmICh0cC0+dF90ZW1wbGF0ZSkKKyAqCQkodm9pZCkgbV9mcmVlKGR0b20odHAtPnRfdGVtcGxhdGUpKTsKKyAqLworLyoJZnJlZSh0cCwgTV9QQ0IpOyAgKi8KKwlmcmVlKHRwKTsKKyAgICAgICAgc28tPnNvX3RjcGNiID0gTlVMTDsKKwlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJLyogY2xvYmJlciBpbnB1dCBzb2NrZXQgY2FjaGUgaWYgd2UncmUgY2xvc2luZyB0aGUgY2FjaGVkIGNvbm5lY3Rpb24gKi8KKwlpZiAoc28gPT0gdGNwX2xhc3Rfc28pCisJCXRjcF9sYXN0X3NvID0gJnRjYjsKKwlzb2NrZXRfY2xvc2Uoc28tPnMpOworCXNiZnJlZSgmc28tPnNvX3Jjdik7CisJc2JmcmVlKCZzby0+c29fc25kKTsKKwlzb2ZyZWUoc28pOworCVNUQVQodGNwc3RhdC50Y3BzX2Nsb3NlZCsrKTsKKwlyZXR1cm4gKChzdHJ1Y3QgdGNwY2IgKikwKTsKK30KKworI2lmZGVmIG5vdGRlZgordm9pZAordGNwX2RyYWluKCkKK3sKKwkvKiBYWFggKi8KK30KKworLyoKKyAqIFdoZW4gYSBzb3VyY2UgcXVlbmNoIGlzIHJlY2VpdmVkLCBjbG9zZSBjb25nZXN0aW9uIHdpbmRvdworICogdG8gb25lIHNlZ21lbnQuICBXZSB3aWxsIGdyYWR1YWxseSBvcGVuIGl0IGFnYWluIGFzIHdlIHByb2NlZWQuCisgKi8KK3ZvaWQKK3RjcF9xdWVuY2goaSwgZXJybm8pCisKKwlpbnQgZXJybm87Cit7CisJc3RydWN0IHRjcGNiICp0cCA9IGludG90Y3BjYihpbnApOworCisJaWYgKHRwKQorCQl0cC0+c25kX2N3bmQgPSB0cC0+dF9tYXhzZWc7Cit9CisKKyNlbmRpZiAvKiBub3RkZWYgKi8KKworLyoKKyAqIFRDUCBwcm90b2NvbCBpbnRlcmZhY2UgdG8gc29ja2V0IGFic3RyYWN0aW9uLgorICovCisKKy8qCisgKiBVc2VyIGlzc3VlZCBjbG9zZSwgYW5kIHdpc2ggdG8gdHJhaWwgdGhyb3VnaCBzaHV0ZG93biBzdGF0ZXM6CisgKiBpZiBuZXZlciByZWNlaXZlZCBTWU4sIGp1c3QgZm9yZ2V0IGl0LiAgSWYgZ290IGEgU1lOIGZyb20gcGVlciwKKyAqIGJ1dCBoYXZlbid0IHNlbnQgRklOLCB0aGVuIGdvIHRvIEZJTl9XQUlUXzEgc3RhdGUgdG8gc2VuZCBwZWVyIGEgRklOLgorICogSWYgYWxyZWFkeSBnb3QgYSBGSU4gZnJvbSBwZWVyLCB0aGVuIGFsbW9zdCBkb25lOyBnbyB0byBMQVNUX0FDSworICogc3RhdGUuICBJbiBhbGwgb3RoZXIgY2FzZXMsIGhhdmUgYWxyZWFkeSBzZW50IEZJTiB0byBwZWVyIChlLmcuCisgKiBhZnRlciBQUlVfU0hVVERPV04pLCBhbmQganVzdCBoYXZlIHRvIHBsYXkgdGVkaW91cyBnYW1lIHdhaXRpbmcKKyAqIGZvciBwZWVyIHRvIHNlbmQgRklOIG9yIG5vdCByZXNwb25kIHRvIGtlZXAtYWxpdmVzLCBldGMuCisgKiBXZSBjYW4gbGV0IHRoZSB1c2VyIGV4aXQgZnJvbSB0aGUgY2xvc2UgYXMgc29vbiBhcyB0aGUgRklOIGlzIGFja2VkLgorICovCit2b2lkCit0Y3Bfc29ja2Nsb3NlZChzdHJ1Y3QgdGNwY2IgKnRwKQoreworCisJREVCVUdfQ0FMTCgidGNwX3NvY2tjbG9zZWQiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOworCisJc3dpdGNoICh0cC0+dF9zdGF0ZSkgeworCisJY2FzZSBUQ1BTX0NMT1NFRDoKKwljYXNlIFRDUFNfTElTVEVOOgorCWNhc2UgVENQU19TWU5fU0VOVDoKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKKwkJdHAgPSB0Y3BfY2xvc2UodHApOworCQlicmVhazsKKworCWNhc2UgVENQU19TWU5fUkVDRUlWRUQ6CisJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgorCQl0cC0+dF9zdGF0ZSA9IFRDUFNfRklOX1dBSVRfMTsKKwkJYnJlYWs7CisKKwljYXNlIFRDUFNfQ0xPU0VfV0FJVDoKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0xBU1RfQUNLOworCQlicmVhazsKKwl9CisvKglzb2lzZmRpc2Nvbm5lY3RpbmcodHAtPnRfc29ja2V0KTsgKi8KKwlpZiAodHAgJiYgdHAtPnRfc3RhdGUgPj0gVENQU19GSU5fV0FJVF8yKQorCQlzb2lzZmRpc2Nvbm5lY3RlZCh0cC0+dF9zb2NrZXQpOworCWlmICh0cCkKKwkJdGNwX291dHB1dCh0cCk7Cit9CisKK3N0YXRpYyB2b2lkCit0Y3BfcHJveHlfZXZlbnQoIHN0cnVjdCBzb2NrZXQqICBzbywKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgIFByb3h5RXZlbnQgICAgICBldmVudCApCit7CisgICAgc28tPnNvX3N0YXRlICY9IH5TU19QUk9YSUZJRUQ7CisKKyAgICBpZiAoZXZlbnQgPT0gUFJPWFlfRVZFTlRfQ09OTkVDVEVEKSB7CisgICAgICAgIHNvLT5zICAgICAgICAgPSBzOworICAgICAgICBzby0+c29fc3RhdGUgJj0gfihTU19JU0ZDT05ORUNUSU5HKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNvLT5zb19zdGF0ZSA9IFNTX05PRkRSRUY7CisgICAgfQorCisgICAgLyogY29udGludWUgdGhlIGNvbm5lY3QgKi8KKyAgICB0Y3BfaW5wdXQoTlVMTCwgc2l6ZW9mKHN0cnVjdCBpcCksIHNvKTsKK30KKworCisvKiBUZXN0cyBpZiBhbiBJUCBhZGRyZXNzIGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lhbCBRZW11IHNlcnZpY2UgKGVnLCB0aGUgRE5TCisgKiBzZXJ2ZXIgb3IgdGhlIGdhdGV3YXkgLSBzZWUgY3RsLmgpIGFuZCBpZiBzbywgcmV3cml0ZXMgaXQgd2l0aCB0aGUgcmVhbAorICogYWRkcmVzcyBvZiB0aGUgc2VydmljZS4KKyAqLworaW50IGlzX3FlbXVfc3BlY2lhbF9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgZHN0X2FkZHIsIHVuc2lnbmVkIGxvbmcgKnJlZGlyX2FkZHIpCit7CisgIGlmICgoZHN0X2FkZHIgJiAweGZmZmZmZjAwKSA9PSBzcGVjaWFsX2FkZHJfaXApIHsKKyAgICAvKiBJdCdzIGFuIGFsaWFzICovCisKKyAgICBpbnQgIGxhc3RfYnl0ZSA9IGRzdF9hZGRyICYgMHhmZjsKKworICAgIGlmIChDVExfSVNfRE5TKGxhc3RfYnl0ZSkpCisgICAgICAqcmVkaXJfYWRkciA9IGRuc19hZGRyW2xhc3RfYnl0ZSAtIENUTF9ETlNdOworICAgIGVsc2UKKyAgICAgICpyZWRpcl9hZGRyID0gbG9vcGJhY2tfYWRkcl9pcDsKKworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCisKKy8qCisgKiBDb25uZWN0IHRvIGEgaG9zdCBvbiB0aGUgSW50ZXJuZXQKKyAqIENhbGxlZCBieSB0Y3BfaW5wdXQKKyAqIE9ubHkgZG8gYSBjb25uZWN0LCB0aGUgdGNwIGZpZWxkcyB3aWxsIGJlIHNldCBpbiB0Y3BfaW5wdXQKKyAqIHJldHVybiAwIGlmIHRoZXJlJ3MgYSByZXN1bHQgb2YgdGhlIGNvbm5lY3QsCisgKiBlbHNlIHJldHVybiAtMSBtZWFucyB3ZSdyZSBzdGlsbCBjb25uZWN0aW5nCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFsbW9zdCBhbHdheXMgLTEgc2luY2UgdGhlIHNvY2tldCBpcworICogbm9uYmxvY2tpbmcuICBDb25uZWN0IHJldHVybnMgYWZ0ZXIgdGhlIFNZTiBpcyBzZW50LCBhbmQgZG9lcworICogbm90IHdhaXQgZm9yIEFDSytTWU4uCisgKi8KK2ludCB0Y3BfZmNvbm5lY3Qoc3RydWN0IHNvY2tldCAqc28pCit7CisgIGludCByZXQ9MDsKKyAgICBpbnQgdHJ5X3Byb3h5ID0gMDsKKyAgICBTb2NrQWRkcmVzcyAgICBzb2NrYWRkcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgIHNvY2tfaXA7CisgICAgaW50ICAgICAgICAgICAgICAgICBzb2NrX3BvcnQ7CisgICAgaW50IHJlZGlyZWN0X2hhcHBlbmVkID0gMDsgLyogZm9yIGxvZ2dpbmcgbmV3IHNyYyBpcC9wb3J0IGFmdGVyIGNvbm5lY3QgKi8KKworICAgIERFQlVHX0NBTEwoInRjcF9mY29ubmVjdCIpOworICAgIERFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisgICAgLyogd2hlbiB0cnVlLCBhIGNvbm5lY3Rpb24gdGhhdCBvdGhlcndpc2Ugd291bGQgYmUgZHJvcHBlZCB3aWxsIGluc3RlYWQgYmUKKyAgICAgKiByZWRpcmVjdGVkIHRvIHRoZSBzaW5rICgnLW5ldC1mb3J3YXJkLXRjcDJzaW5rJykgKi8KKyAgICBpbnQgZm9yd2FyZF9kcm9wcGVkX3RvX3NpbmsgPSAwOworICAgIHRpbWVfdCB0aW1lc3RhbXAgPSB0aW1lKE5VTEwpOworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiBVc2VyIG1vZGUgbmV0d29yayBzdGFjayByZXN0cmljdGlvbnMgKi8KKyAgICBpZiAoc2xpcnBfc2hvdWxkX2Ryb3Aoc28tPnNvX2ZhZGRyX2lwLCBzby0+c29fZmFkZHJfcG9ydCwgSVBQUk9UT19UQ1ApKSB7CisKKyAgICAgIC8qIElmIGZvcndhcmRpbmcgdG8gc2luayBpcyBlbmFibGVkLCBkb24ndCBhY3R1YWxseSBkcm9wIGl0ICovCisgICAgICBpZiAoc2xpcnBfc2hvdWxkX2ZvcndhcmRfZHJvcHBlZF90Y3Ayc2luaygpKSB7CisgICAgICAgIHNsaXJwX2Ryb3BfbG9nKAorICAgICAgICAgICAgIkFib3V0IHRvIGJlIGRyb3BwZWQgVENQIGFsbG93ZWQgdG8gc2luazogIgorICAgICAgICAgICAgIjB4JTA4bHg6MHglMDR4IC0+IDB4JTA4bHg6MHglMDR4ICVsZFxuIiwKKyAgICAgICAgICAgICAgc28tPnNvX2xhZGRyX2lwLAorICAgICAgICAgICAgICBzby0+c29fbGFkZHJfcG9ydCwKKyAgICAgICAgICAgICAgc28tPnNvX2ZhZGRyX2lwLAorICAgICAgICAgICAgICBzby0+c29fZmFkZHJfcG9ydCwKKyAgICAgICAgICAgICAgdGltZXN0YW1wCisgICAgICAgICk7CisgICAgICAgIGZvcndhcmRfZHJvcHBlZF90b19zaW5rID0gMTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBzbGlycF9kcm9wX2xvZygKKyAgICAgICAgICAgICJEcm9wcGVkIFRDUDogMHglMDhseDoweCUwNHggLT4gMHglMDhseDoweCUwNHggJWxkXG4iLAorICAgICAgICAgICAgc28tPnNvX2xhZGRyX2lwLAorICAgICAgICAgICAgc28tPnNvX2xhZGRyX3BvcnQsCisgICAgICAgICAgICBzby0+c29fZmFkZHJfaXAsCisgICAgICAgICAgICBzby0+c29fZmFkZHJfcG9ydCwKKyAgICAgICAgICAgIHRpbWVzdGFtcAorICAgICAgICApOworICAgICAgICAvL2Vycm5vID0gRU5FVFVOUkVBQ0g7CisgICAgICAgIGVycm5vID0gRUNPTk5SRUZVU0VEOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNsaXJwX2Ryb3BfbG9nKAorICAgICAgICAgICJBbGxvd2VkIFRDUDogMHglMDhseDoweCUwNHggLT4gMHglMDhseDoweCUwNHggJWxkXG4iLAorICAgICAgICAgIHNvLT5zb19sYWRkcl9pcCwKKyAgICAgICAgICBzby0+c29fbGFkZHJfcG9ydCwKKyAgICAgICAgICBzby0+c29fZmFkZHJfaXAsCisgICAgICAgICAgc28tPnNvX2ZhZGRyX3BvcnQsCisgICAgICAgICAgdGltZXN0YW1wCisgICAgICApOworICAgIH0KKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgaWYgKChyZXQ9c28tPnM9c29ja2V0X2NyZWF0ZV9pbmV0KFNPQ0tFVF9TVFJFQU0pKSA+PSAwKQorICAgIHsKKyAgICAgICAgaW50ICBzID0gc28tPnM7CisKKyAgICAgICAgc29ja2V0X3NldF9ub25ibG9jayhzKTsKKyAgICAgICAgc29ja2V0X3NldF94cmV1c2VhZGRyKHMpOworICAgICAgICBzb2NrZXRfc2V0X29vYmlubGluZShzKTsKKworCisgICAgICAgIGlmIChmb3J3YXJkX2Ryb3BwZWRfdG9fc2luaykgeworCisgICAgICAgICAgLyogVGhpcyBjb25uZWN0aW9uIHdvdWxkIG5vcm1hbGx5IGJlIGRyb3BwZWQsIGJ1dCBzaW5jZSBmb3J3YXJkaW5nIG9mCisgICAgICAgICAgICogZHJvcHBlZCBjb25uZWN0aW9ucyBpcyBlbmFibGVkLCByZWRpcmVjdCBpdCB0byB0aGUgc2luayAqLworICAgICAgICAgIHNvY2tfaXAgPSBzbGlycF9nZXRfdGNwX3NpbmtfaXAoKTsKKyAgICAgICAgICBzb2NrX3BvcnQ9IHNsaXJwX2dldF90Y3Bfc2lua19wb3J0KCk7CisgICAgICAgICAgcmVkaXJlY3RfaGFwcGVuZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgIC8qIEFuIGFsbG93ZWQgY29ubmVjdGlvbiAqLworCisgICAgICAgICAgdW5zaWduZWQgbG9uZyBmYWRkcjsKKyAgICAgICAgICBpbnQgZnBvcnQ7CisKKyAgICAgICAgICAvKiBEZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHJlZGlyZWN0ZWQKKyAgICAgICAgICAgKiBkdWUgdG8gYSAtbmV0LWZvcndhcmQgcnVsZSAqLworICAgICAgICAgIC8qIGZhZGRyIGFuZCBmcG9ydCBhcmUgbW9kaWZpZWQgb25seSBvbiBzdWNjZXNzICovCisgICAgICAgICAgaWYgKHNsaXJwX3Nob3VsZF9uZXRfZm9yd2FyZChzby0+c29fZmFkZHJfaXAsIHNvLT5zb19mYWRkcl9wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhZGRyLCAmZnBvcnQpKSB7CisgICAgICAgICAgICByZWRpcmVjdF9oYXBwZW5lZCA9IDE7CisgICAgICAgICAgICBzb2NrX2lwID0gZmFkZHI7ICAgICAgICAgICAgICAvKiBmb3JjZWQgZHN0IGFkZHIgKi8KKyAgICAgICAgICAgIHNvY2tfcG9ydD0gZnBvcnQ7ICAgICAgICAgICAgICAgICAvKiBmb3JjZWQgZHN0IHBvcnQgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBjb25uZWN0aW9uIHRvIGEgc3BlY2lhbCBxZW11IHNlcnZpY2UsCisgICAgICAgICAgICogYW5kIGNoYW5nZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgKiAnZmFkZHInIGlzIG1vZGlmaWVkIG9ubHkgb24gc3VjY2VzcyAgKi8KKyAgICAgICAgICBlbHNlIGlmIChpc19xZW11X3NwZWNpYWxfYWRkcmVzcyhzby0+c29fZmFkZHJfaXAsICZmYWRkcikpIHsKKworICAgICAgICAgIC8qIFdlIGtlZXAgdGhlIG9yaWdpbmFsIGRlc3RpbmF0aW9uIHBvcnQuIElmIGEgc3BlY2lhbCBzZXJ2aWNlCisgICAgICAgICAgICogbGlzdGVucyBvbiBhIGRpZmZlcmVudCBwb3J0IHRoYW4gdGhlIHN0YW5kYXJkLCB0aGVuIGFwcHJvcHJpYXRlCisgICAgICAgICAgICogZm9yd2FyZGluZyBzaG91bGQgYmUgc2V0IHVwIHVzaW5nIC1uZXQtZm9yd2FyZCwgZS5nLiwgYXMgaXQgaXMKKyAgICAgICAgICAgKiB0aGUgY2FzZSB3aXRoIE1hd2xlcidzIEROUyB0cmFmZmljLCB3aGljaCBpcyByZWRpcmVjdGVkIHRvIHRoZQorICAgICAgICAgICAqIHNwZWNpYWwgRE5TIHBvcnQ6CisgICAgICAgICAgICogLW5ldC1mb3J3YXJkIDAuMC4wLjA6MC4wLjAuMDo1MzoxMjcuMC4wLjE6MjE3MzcgKi8KKworICAgICAgICAgICAgc29ja19pcCA9IGZhZGRyOyAgICAgICAgIC8qIHJlYWwgRE5TL2dhdGV3YXkgYWRkciAqLworICAgICAgICAgICAgc29ja19wb3J0PSBzby0+c29fZmFkZHJfcG9ydDsvKiBvcmlnaW5hbCBkc3QgcG9ydCAqLworCisgICAgICAgICAgfQorICAgICAgICAgIC8qIEEgbm9ybWFsIGNvbm5lY3Rpb24gLSBrZWVwIHRoZSBvcmlnaW5hbCBkZXN0aW5hdGlvbiBhZGRyL3BvcnQgKi8KKyAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgdHJ5X3Byb3h5ID0gMTsKKworICAgICAgICAgICAgc29ja19pcCA9IHNvLT5zb19mYWRkcl9pcDsgIC8qIG9yaWdpbmFsIGRzdCBhZGRyICovCisgICAgICAgICAgICBzb2NrX3BvcnQ9IHNvLT5zb19mYWRkcl9wb3J0OyAgIC8qIG9yaWdpbmFsIGRzdCBwb3J0ICovCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgREVCVUdfTUlTQygoZGZkLCAiIGNvbm5lY3QoKWluZywgYWRkcj0lcywgcHJveHk9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc190b19zdHJpbmcoJnNvY2thZGRyKSwgdHJ5X3Byb3h5KSk7CisKKyAgICAgICAgc29ja19hZGRyZXNzX2luaXRfaW5ldCggJnNvY2thZGRyLCBzb2NrX2lwLCBzb2NrX3BvcnQgKTsKKworICAgICAgICBpZiAodHJ5X3Byb3h5KSB7CisgICAgICAgICAgICBpZiAoIXByb3h5X21hbmFnZXJfYWRkKCZzb2NrYWRkciwgU09DS0VUX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFByb3h5RXZlbnRGdW5jKSB0Y3BfcHJveHlfZXZlbnQsIHNvKSkgeworICAgICAgICAgICAgICAgIHNvaXNmY29ubmVjdGluZyhzbyk7CisgICAgICAgICAgICAgICAgc28tPnMgICAgICAgICA9IC0xOworICAgICAgICAgICAgICAgIHNvLT5zb19zdGF0ZSB8PSBTU19QUk9YSUZJRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBkb24ndCBjYXJlIHdoYXQgcG9ydCB3ZSBnZXQgKi8KKyAgICAgICAgc29ja2V0X2Nvbm5lY3QocywgJnNvY2thZGRyKTsKKworICAgICAgICBpZiAocmVkaXJlY3RfaGFwcGVuZWQpIHsKKyAgICAgICAgICBTb2NrQWRkcmVzcyBsb2NhbF9hZGRyOworICAgICAgICAgIGlmIChzb2NrZXRfZ2V0X2FkZHJlc3MocywgJmxvY2FsX2FkZHIpKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogdGNwX2Zjb25uZWN0OiBjb3VsZCBub3QgZ2V0IHNvY2tldCBuYW1lXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc2xpcnBfZHJvcF9sb2coCisgICAgICAgICAgICAgICJSZWRpcmVjdGVkIFRDUDogb3JpZyAweCUwOGx4OjB4JTA0eCAtPiAweCUwOGx4OjB4JTA0eCAiCisgICAgICAgICAgICAgICJuZXcgMHglMDhseDoweCUwNHggLT4gMHglMDhseDoweCUwNHggJWxkXG4iLAorICAgICAgICAgICAgICBzby0+c29fbGFkZHJfaXAsIHNvLT5zb19sYWRkcl9wb3J0LAorICAgICAgICAgICAgICBzby0+c29fZmFkZHJfaXAsIHNvLT5zb19sYWRkcl9wb3J0LAorICAgICAgICAgICAgICBzb2NrX2FkZHJlc3NfZ2V0X2lwKCZsb2NhbF9hZGRyKSwKKyAgICAgICAgICAgICAgc29ja19hZGRyZXNzX2dldF9wb3J0KCZsb2NhbF9hZGRyKSwKKyAgICAgICAgICAgICAgc29ja19pcCwgc29ja19wb3J0LCB0aW1lc3RhbXAKKyAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAvKgorICAgICAgICAqIElmIGl0J3Mgbm90IGluIHByb2dyZXNzLCBpdCBmYWlsZWQsIHNvIHdlIGp1c3QgcmV0dXJuIDAsCisgICAgICAgICogd2l0aG91dCBjbGVhcmluZyBTU19OT0ZEUkVGCisgICAgICAgICovCisgICAgICAgIHNvaXNmY29ubmVjdGluZyhzbyk7CisgIH0KKworICByZXR1cm4ocmV0KTsKK30KKworLyoKKyAqIEFjY2VwdCB0aGUgc29ja2V0IGFuZCBjb25uZWN0IHRvIHRoZSBsb2NhbC1ob3N0CisgKgorICogV2UgaGF2ZSBhIHByb2JsZW0uIFRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIHdvdWxkIGJlCisgKiB0byBmaXJzdCBjb25uZWN0IHRvIHRoZSBsb2NhbC1ob3N0LCBhbmQgb25seSBpZiB0aGUKKyAqIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIHRoZW4gZG8gYW4gYWNjZXB0KCkgaGVyZS4KKyAqIEJ1dCwgYSkgd2UgbmVlZCB0byBrbm93IHdobydzIHRyeWluZyB0byBjb25uZWN0CisgKiB0byB0aGUgc29ja2V0IHRvIGJlIGFibGUgdG8gU1lOIHRoZSBsb2NhbC1ob3N0LCBhbmQKKyAqIGIpIHdlIGFyZSBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgZm9yZWlnbiBob3N0IGJ5CisgKiB0aGUgdGltZSBpdCBnZXRzIHRvIGFjY2VwdCgpLCBzby4uLiBXZSBzaW1wbHkgYWNjZXB0CisgKiBoZXJlIGFuZCBTWU4gdGhlIGxvY2FsLWhvc3QuCisgKi8KK3ZvaWQKK3RjcF9jb25uZWN0KHN0cnVjdCBzb2NrZXQgKmluc28pCit7CisJc3RydWN0IHNvY2tldCAqc287CisJU29ja0FkZHJlc3MgICBhZGRyOworCXVpbnQzMl90ICAgICAgYWRkcl9pcDsKKwlzdHJ1Y3QgdGNwY2IgKnRwOworCWludCBzOworCisJREVCVUdfQ0FMTCgidGNwX2Nvbm5lY3QiKTsKKwlERUJVR19BUkcoImluc28gPSAlbHgiLCAobG9uZylpbnNvKTsKKworCS8qCisJICogSWYgaXQncyBhbiBTU19BQ0NFUFRPTkNFIHNvY2tldCwgbm8gbmVlZCB0byBzb2NyZWF0ZSgpCisJICogYW5vdGhlciBzb2NrZXQsIGp1c3QgdXNlIHRoZSBhY2NlcHQoKSBzb2NrZXQuCisJICovCisJaWYgKGluc28tPnNvX3N0YXRlICYgU1NfRkFDQ0VQVE9OQ0UpIHsKKwkJLyogRkFDQ0VQVE9OQ0UgYWxyZWFkeSBoYXZlIGEgdGNwY2IgKi8KKwkJc28gPSBpbnNvOworCX0gZWxzZSB7CisJCWlmICgoc28gPSBzb2NyZWF0ZSgpKSA9PSBOVUxMKSB7CisJCQkvKiBJZiBpdCBmYWlsZWQsIGdldCByaWQgb2YgdGhlIHBlbmRpbmcgY29ubmVjdGlvbiAqLworCQkJc29ja2V0X2Nsb3NlKHNvY2tldF9hY2NlcHQoaW5zby0+cywgTlVMTCkpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0Y3BfYXR0YWNoKHNvKSA8IDApIHsKKwkJCWZyZWUoc28pOyAvKiBOT1Qgc29mcmVlICovCisJCQlyZXR1cm47CisJCX0KKwkJc28tPnNvX2xhZGRyX2lwICAgPSBpbnNvLT5zb19sYWRkcl9pcDsKKwkJc28tPnNvX2xhZGRyX3BvcnQgPSBpbnNvLT5zb19sYWRkcl9wb3J0OworCX0KKworCSh2b2lkKSB0Y3BfbXNzKHNvdG90Y3BjYihzbyksIDApOworCisJaWYgKChzID0gc29ja2V0X2FjY2VwdChpbnNvLT5zLCAmYWRkcikpIDwgMCkgeworCQl0Y3BfY2xvc2Uoc290b3RjcGNiKHNvKSk7IC8qIFRoaXMgd2lsbCBzb2ZyZWUoKSBhcyB3ZWxsICovCisJCXJldHVybjsKKwl9CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtMb29wYmFjazZbMTZdID0KKwkJeyAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwxIH07CisJLyogSWYgdGhpcyBpcyBmcm9tIGEgbG9jYWwgY29ubmVjdGlvbiB0byBJUHY2IGxpc3RlbiBzb2NrZXQsIGp1c3QKKwkgKiBwcmV0ZW5kIGl0IHRvIElQdjQgc2luY2Ugd2UgaGF2ZSBubyBzdXBwb3J0IGZvciBJUHY2IGluIHFlbXUxIG5vdy4gKi8KKwlpZiAoc29ja19hZGRyZXNzX2dldF9mYW1pbHkoJmFkZHIpID09IFNPQ0tFVF9JTjYKKwkgICAgJiYgIW1lbWNtcChhZGRyLnUuaW42LmFkZHJlc3MsIGtMb29wYmFjazYsIHNpemVvZihrTG9vcGJhY2s2KSkpIHsKKwkJc29ja19hZGRyZXNzX2luaXRfaW5ldCgmYWRkciwgU09DS19BRERSRVNTX0lORVRfTE9PUEJBQ0ssCisJCQkJICAgICAgIHNvY2tfYWRkcmVzc19nZXRfcG9ydCgmYWRkcikpOworCX0KKwlzb2NrZXRfc2V0X25vbmJsb2NrKHMpOworCXNvY2tldF9zZXRfeHJldXNlYWRkcihzKTsKKwlzb2NrZXRfc2V0X29vYmlubGluZShzKTsKKwlzb2NrZXRfc2V0X25vZGVsYXkocyk7CisKKwlzby0+c29fZmFkZHJfcG9ydCA9IHNvY2tfYWRkcmVzc19nZXRfcG9ydCgmYWRkcik7CisKKwlhZGRyX2lwID0gc29ja19hZGRyZXNzX2dldF9pcCgmYWRkcik7CisKKwlzby0+c29fZmFkZHJfaXAgPSBhZGRyX2lwOworCS8qIFRyYW5zbGF0ZSBjb25uZWN0aW9ucyBmcm9tIGxvY2FsaG9zdCB0byB0aGUgcmVhbCBob3N0bmFtZSAqLworCWlmIChhZGRyX2lwID09IDAgfHwgYWRkcl9pcCA9PSBsb29wYmFja19hZGRyX2lwKQorCSAgIHNvLT5zb19mYWRkcl9pcCA9IGFsaWFzX2FkZHJfaXA7CisKKwkvKiBDbG9zZSB0aGUgYWNjZXB0KCkgc29ja2V0LCBzZXQgcmlnaHQgc3RhdGUgKi8KKwlpZiAoaW5zby0+c29fc3RhdGUgJiBTU19GQUNDRVBUT05DRSkgeworCQlzb2NrZXRfY2xvc2Uoc28tPnMpOyAvKiBJZiB3ZSBvbmx5IGFjY2VwdCBvbmNlLCBjbG9zZSB0aGUgYWNjZXB0KCkgc29ja2V0ICovCisJCXNvLT5zb19zdGF0ZSA9IFNTX05PRkRSRUY7IC8qIERvbid0IHNlbGVjdCBpdCB5ZXQsIGV2ZW4gdGhvdWdoIHdlIGhhdmUgYW4gRkQgKi8KKwkJCQkJICAgLyogaWYgaXQncyBub3QgRkFDQ0VQVE9OQ0UsIGl0J3MgYWxyZWFkeSBOT0ZEUkVGICovCisJfQorCXNvLT5zID0gczsKKworCXNvLT5zb19pcHRvcyA9IHRjcF90b3Moc28pOworCXRwID0gc290b3RjcGNiKHNvKTsKKworCXRjcF90ZW1wbGF0ZSh0cCk7CisKKwkvKiBDb21wdXRlIHdpbmRvdyBzY2FsaW5nIHRvIHJlcXVlc3QuICAqLworLyoJd2hpbGUgKHRwLT5yZXF1ZXN0X3Jfc2NhbGUgPCBUQ1BfTUFYX1dJTlNISUZUICYmCisgKgkJKFRDUF9NQVhXSU4gPDwgdHAtPnJlcXVlc3Rfcl9zY2FsZSkgPCBzby0+c29fcmN2LnNiX2hpd2F0KQorICoJCXRwLT5yZXF1ZXN0X3Jfc2NhbGUrKzsKKyAqLworCisvKglzb2lzY29ubmVjdGluZyhzbyk7ICovIC8qIE5PRkRSRUYgdXNlZCBpbnN0ZWFkICovCisJU1RBVCh0Y3BzdGF0LnRjcHNfY29ubmF0dGVtcHQrKyk7CisKKwl0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1NFTlQ7CisJdHAtPnRfdGltZXJbVENQVF9LRUVQXSA9IFRDUFRWX0tFRVBfSU5JVDsKKwl0cC0+aXNzID0gdGNwX2lzczsKKwl0Y3BfaXNzICs9IFRDUF9JU1NJTkNSLzI7CisJdGNwX3NlbmRzZXFpbml0KHRwKTsKKwl0Y3Bfb3V0cHV0KHRwKTsKK30KKworLyoKKyAqIEF0dGFjaCBhIFRDUENCIHRvIGEgc29ja2V0LgorICovCitpbnQKK3RjcF9hdHRhY2goc3RydWN0IHNvY2tldCAqc28pCit7CisJaWYgKChzby0+c29fdGNwY2IgPSB0Y3BfbmV3dGNwY2Ioc28pKSA9PSBOVUxMKQorCSAgIHJldHVybiAtMTsKKworCWluc3F1ZShzbywgJnRjYik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgc29ja2V0J3MgdHlwZSBvZiBzZXJ2aWNlIGZpZWxkCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9zX3QgdGNwdG9zW10gPSB7CisJICB7MCwgMjAsIElQVE9TX1RIUk9VR0hQVVQsIDB9LAkvKiBmdHAgZGF0YSAqLworCSAgezIxLCAyMSwgSVBUT1NfTE9XREVMQVksICBFTVVfRlRQfSwJLyogZnRwIGNvbnRyb2wgKi8KKwkgIHswLCAyMywgSVBUT1NfTE9XREVMQVksIDB9LAkvKiB0ZWxuZXQgKi8KKwkgIHswLCA4MCwgSVBUT1NfVEhST1VHSFBVVCwgMH0sCS8qIFdXVyAqLworCSAgezAsIDUxMywgSVBUT1NfTE9XREVMQVksIEVNVV9STE9HSU58RU1VX05PQ09OTkVDVH0sCS8qIHJsb2dpbiAqLworCSAgezAsIDUxNCwgSVBUT1NfTE9XREVMQVksIEVNVV9SU0h8RU1VX05PQ09OTkVDVH0sCS8qIHNoZWxsICovCisJICB7MCwgNTQ0LCBJUFRPU19MT1dERUxBWSwgRU1VX0tTSH0sCQkvKiBrc2hlbGwgKi8KKwkgIHswLCA1NDMsIElQVE9TX0xPV0RFTEFZLCAwfSwJLyoga2xvZ2luICovCisJICB7MCwgNjY2NywgSVBUT1NfVEhST1VHSFBVVCwgRU1VX0lSQ30sCS8qIElSQyAqLworCSAgezAsIDY2NjgsIElQVE9TX1RIUk9VR0hQVVQsIEVNVV9JUkN9LAkvKiBJUkMgdW5kZXJuZXQgKi8KKwkgIHswLCA3MDcwLCBJUFRPU19MT1dERUxBWSwgRU1VX1JFQUxBVURJTyB9LCAvKiBSZWFsQXVkaW8gY29udHJvbCAqLworCSAgezAsIDExMywgSVBUT1NfTE9XREVMQVksIEVNVV9JREVOVCB9LCAvKiBpZGVudGQgcHJvdG9jb2wgKi8KKwkgIHswLCAwLCAwLCAwfQorfTsKKworI2lmZGVmIENPTkZJR19RRU1VCitzdGF0aWMKKyNlbmRpZgorc3RydWN0IGVtdV90ICp0Y3BlbXUgPSBOVUxMOworCisvKgorICogUmV0dXJuIFRPUyBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHRhYmxlCisgKi8KK3VfaW50OF90Cit0Y3BfdG9zKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgZW11X3QgKmVtdXA7CisKKwl3aGlsZSh0Y3B0b3NbaV0udG9zKSB7CisJCWlmICgodGNwdG9zW2ldLmZwb3J0ICYmIHNvLT5zb19mYWRkcl9wb3J0ID09IHRjcHRvc1tpXS5mcG9ydCkgfHwKKwkJICAgICh0Y3B0b3NbaV0ubHBvcnQgJiYgc28tPnNvX2xhZGRyX3BvcnQgPT0gdGNwdG9zW2ldLmxwb3J0KSkgeworCQkJc28tPnNvX2VtdSA9IHRjcHRvc1tpXS5lbXU7CisJCQlyZXR1cm4gdGNwdG9zW2ldLnRvczsKKwkJfQorCQlpKys7CisJfQorCisJLyogTm9wZSwgbGV0cyBzZWUgaWYgdGhlcmUncyBhIHVzZXItYWRkZWQgb25lICovCisJZm9yIChlbXVwID0gdGNwZW11OyBlbXVwOyBlbXVwID0gZW11cC0+bmV4dCkgeworCQlpZiAoKGVtdXAtPmZwb3J0ICYmIChzby0+c29fZmFkZHJfcG9ydCA9PSBlbXVwLT5mcG9ydCkpIHx8CisJCSAgICAoZW11cC0+bHBvcnQgJiYgKHNvLT5zb19sYWRkcl9wb3J0ID09IGVtdXAtPmxwb3J0KSkpIHsKKwkJCXNvLT5zb19lbXUgPSBlbXVwLT5lbXU7CisJCQlyZXR1cm4gZW11cC0+dG9zOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWYgMAoraW50IGRvX2VjaG8gPSAtMTsKKyNlbmRpZgorCisvKgorICogRW11bGF0ZSBwcm9ncmFtcyB0aGF0IHRyeSBhbmQgY29ubmVjdCB0byB1cworICogVGhpcyBpbmNsdWRlcyBmdHAgKHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMKKyAqIGluaXRpYXRlZCBieSB0aGUgc2VydmVyKSBhbmQgSVJDIChEQ0MgQ0hBVCBhbmQKKyAqIERDQyBTRU5EKSBmb3Igbm93CisgKgorICogTk9URTogSXQncyBwb3NzaWJsZSB0byBjcmFzaCBTTGlSUCBieSBzZW5kaW5nIGl0CisgKiB1bnN0YW5kYXJkIHN0cmluZ3MgdG8gZW11bGF0ZS4uLiBpZiB0aGlzIGlzIGEgcHJvYmxlbSwKKyAqIG1vcmUgY2hlY2tzIGFyZSBuZWVkZWQgaGVyZQorICoKKyAqIFhYWCBBc3N1bWVzIHRoZSB3aG9sZSBjb21tYW5kIGNhbWUgaW4gb25lIHBhY2tldAorICoKKyAqIFhYWCBTb21lIGZ0cCBjbGllbnRzIHdpbGwgaGF2ZSB0aGVpciBUT1Mgc2V0IHRvCisgKiBMT1dERUxBWSBhbmQgc28gTmFnZWwgd2lsbCBraWNrIGluLiAgQmVjYXVzZSBvZiB0aGlzLAorICogd2UnbGwgZ2V0IHRoZSBmaXJzdCBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHRoZSByZXN0LCBzbworICogd2Ugc2ltcGx5IHNjYW4gZm9yIE9SVCBpbnN0ZWFkIG9mIFBPUlQuLi4KKyAqIERDQyBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtIGJlY2F1c2UgdGhlcmUncyBvdGhlciBzdHVmZgorICogaW4gdGhlIHBhY2tldCBiZWZvcmUgdGhlIERDQyBjb21tYW5kLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBtYnVmIG0gaXMgc3RpbGwgdmFsaWQgYW5kIHNob3VsZCBiZQorICogc2JhcHBlbmQoKWVkCisgKgorICogTk9URTogaWYgeW91IHJldHVybiAwIHlvdSBNVVNUIG1fZnJlZSgpIHRoZSBtYnVmIQorICovCitpbnQKK3RjcF9lbXUoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCXVfaW50IG4xLCBuMiwgbjMsIG40LCBuNSwgbjY7CisgICAgICAgIGNoYXIgYnVmZlsyNTddOworCXVfaW50MzJfdCBsYWRkcjsKKwl1X2ludCBscG9ydDsKKwljaGFyICpicHRyOworCisJREVCVUdfQ0FMTCgidGNwX2VtdSIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisKKwlzd2l0Y2goc28tPnNvX2VtdSkgeworCQlpbnQgeCwgaTsKKworCSBjYXNlIEVNVV9JREVOVDoKKwkJLyoKKwkJICogSWRlbnRpZmljYXRpb24gcHJvdG9jb2wgYXMgcGVyIHJmYy0xNDEzCisJCSAqLworCisJCXsKKwkJCXN0cnVjdCBzb2NrZXQgKnRtcHNvOworCQkJU29ja0FkZHJlc3MgICAgYWRkcjsKKwkJCXN0cnVjdCBzYnVmICpzb19yY3YgPSAmc28tPnNvX3JjdjsKKworCQkJbWVtY3B5KHNvX3Jjdi0+c2Jfd3B0ciwgbS0+bV9kYXRhLCBtLT5tX2xlbik7CisJCQlzb19yY3YtPnNiX3dwdHIgKz0gbS0+bV9sZW47CisJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CisJCQltLT5tX2RhdGFbbS0+bV9sZW5dID0gMDsgLyogTlVMTCB0ZXJtaW5hdGUgKi8KKwkJCWlmIChzdHJjaHIobS0+bV9kYXRhLCAnXHInKSB8fCBzdHJjaHIobS0+bV9kYXRhLCAnXG4nKSkgeworCQkJCWlmIChzc2NhbmYoc29fcmN2LT5zYl9kYXRhLCAiJXUlKlsgLF0ldSIsICZuMSwgJm4yKSA9PSAyKSB7CisJCQkJCS8qIG4yIGlzIHRoZSBvbmUgb24gb3VyIGhvc3QgKi8KKwkJCQkJZm9yICh0bXBzbyA9IHRjYi5zb19uZXh0OyB0bXBzbyAhPSAmdGNiOyB0bXBzbyA9IHRtcHNvLT5zb19uZXh0KSB7CisJCQkJCQlpZiAodG1wc28tPnNvX2xhZGRyX2lwID09IHNvLT5zb19sYWRkcl9pcCAmJgorCQkJCQkJICAgIHRtcHNvLT5zb19sYWRkcl9wb3J0ID09IG4yICYmCisJCQkJCQkgICAgdG1wc28tPnNvX2ZhZGRyX2lwID09IHNvLT5zb19mYWRkcl9pcCAmJgorCQkJCQkJICAgIHRtcHNvLT5zb19mYWRkcl9wb3J0ID09IG4xKSB7CisJCQkJCQkJaWYgKHNvY2tldF9nZXRfYWRkcmVzcyh0bXBzby0+cywgJmFkZHIpID09IDApCisJCQkJCQkJICAgbjIgPSBzb2NrX2FkZHJlc3NfZ2V0X3BvcnQoJmFkZHIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb19yY3YtPnNiX2NjID0gc25wcmludGYoc29fcmN2LT5zYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29fcmN2LT5zYl9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkLCVkXHJcbiIsIG4xLCBuMik7CisJCQkJc29fcmN2LT5zYl9ycHRyID0gc29fcmN2LT5zYl9kYXRhOworCQkJCXNvX3Jjdi0+c2Jfd3B0ciA9IHNvX3Jjdi0+c2JfZGF0YSArIHNvX3Jjdi0+c2JfY2M7CisJCQl9CisJCQltX2ZyZWUobSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisgICAgICAgIGNhc2UgRU1VX0ZUUDogLyogZnRwICovCisgICAgICAgICAgICAgICAgKihtLT5tX2RhdGErbS0+bV9sZW4pID0gMDsgLyogTlVMIHRlcm1pbmF0ZSBmb3Igc3Ryc3RyICovCisJCWlmICgoYnB0ciA9IChjaGFyICopc3Ryc3RyKG0tPm1fZGF0YSwgIk9SVCIpKSAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBlbXVsYXRlIHRoZSBQT1JUIGNvbW1hbmQKKwkJCSAqLworCQkJeCA9IHNzY2FuZihicHRyLCAiT1JUICV1LCV1LCV1LCV1LCV1LCV1XHJcbiUyNTZbXlwxNzddIiwKKwkJCQkgICAmbjEsICZuMiwgJm4zLCAmbjQsICZuNSwgJm42LCBidWZmKTsKKwkJCWlmICh4IDwgNikKKwkJCSAgIHJldHVybiAxOworCisJCQlsYWRkciA9IChuMSA8PCAyNCkgfCAobjIgPDwgMTYpIHwgKG4zIDw8IDgpIHwgKG40KTsKKwkJCWxwb3J0ID0gKG41IDw8IDgpIHwgKG42KTsKKworCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGxhZGRyLCBscG9ydCwgU1NfRkFDQ0VQVE9OQ0UpKSA9PSBOVUxMKQorCQkJICAgcmV0dXJuIDE7CisKKwkJCW42ID0gc28tPnNvX2ZhZGRyX3BvcnQ7CisKKwkJCW41ID0gKG42ID4+IDgpICYgMHhmZjsKKwkJCW42ICY9IDB4ZmY7CisKKwkJCWxhZGRyID0gc28tPnNvX2ZhZGRyX2lwOworCisJCQluMSA9ICgobGFkZHIgPj4gMjQpICYgMHhmZik7CisJCQluMiA9ICgobGFkZHIgPj4gMTYpICYgMHhmZik7CisJCQluMyA9ICgobGFkZHIgPj4gOCkgICYgMHhmZik7CisJCQluNCA9ICAobGFkZHIgJiAweGZmKTsKKworCQkJbS0+bV9sZW4gPSBicHRyIC0gbS0+bV9kYXRhOyAvKiBBZGp1c3QgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplIC0gbS0+bV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1JUICVkLCVkLCVkLCVkLCVkLCVkXHJcbiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4xLCBuMiwgbjMsIG40LCBuNSwgbjYsIHg9PTc/YnVmZjoiIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmICgoYnB0ciA9IChjaGFyICopc3Ryc3RyKG0tPm1fZGF0YSwgIjI3IEVudGVyaW5nIikpICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGVtdWxhdGUgdGhlIFBBU1YgcmVzcG9uc2UKKwkJCSAqLworCQkJeCA9IHNzY2FuZihicHRyLCAiMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICgldSwldSwldSwldSwldSwldSlcclxuJTI1NlteXDE3N10iLAorCQkJCSAgICZuMSwgJm4yLCAmbjMsICZuNCwgJm41LCAmbjYsIGJ1ZmYpOworCQkJaWYgKHggPCA2KQorCQkJICAgcmV0dXJuIDE7CisKKwkJCWxhZGRyID0gKG4xIDw8IDI0KSB8IChuMiA8PCAxNikgfCAobjMgPDwgOCkgfCAobjQpOworCQkJbHBvcnQgPSAobjUgPDwgOCkgfCAobjYpOworCisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgbGFkZHIsIGxwb3J0LCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCisJCQkgICByZXR1cm4gMTsKKworCQkJbjYgPSBzby0+c29fZmFkZHJfcG9ydDsKKworCQkJbjUgPSAobjYgPj4gOCkgJiAweGZmOworCQkJbjYgJj0gMHhmZjsKKworCQkJbGFkZHIgPSBzby0+c29fZmFkZHJfaXA7CisKKwkJCW4xID0gKChsYWRkciA+PiAyNCkgJiAweGZmKTsKKwkJCW4yID0gKChsYWRkciA+PiAxNikgJiAweGZmKTsKKwkJCW4zID0gKChsYWRkciA+PiA4KSAgJiAweGZmKTsKKwkJCW40ID0gIChsYWRkciAmIDB4ZmYpOworCisJCQltLT5tX2xlbiA9IGJwdHIgLSBtLT5tX2RhdGE7IC8qIEFkanVzdCBsZW5ndGggKi8KKwkJCW0tPm1fbGVuICs9IHNucHJpbnRmKGJwdHIsIG0tPm1faGRyLm1oX3NpemUgLSBtLT5tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKCVkLCVkLCVkLCVkLCVkLCVkKVxyXG4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMSwgbjIsIG4zLCBuNCwgbjUsIG42LCB4PT03P2J1ZmY6IiIpOworCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXJldHVybiAxOworCisJIGNhc2UgRU1VX0tTSDoKKwkJLyoKKwkJICogVGhlIGtzaGVsbCAoS2VyYmVyb3MgcnNoKSBhbmQgc2hlbGwgc2VydmljZXMgYm90aCBwYXNzCisJCSAqIGEgbG9jYWwgcG9ydCBwb3J0IG51bWJlciB0byBjYXJyeSBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIKKwkJICogYW5kIHN0ZGVyciB0byB0aGUgY2xpZW50LiAgSXQgaXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcKKwkJICogb2YgdGhlIGNvbm5lY3Rpb24gYXMgYSBOVUwtdGVybWluYXRlZCBkZWNpbWFsIEFTQ0lJIHN0cmluZy4KKwkJICovCisJCXNvLT5zb19lbXUgPSAwOworCQlmb3IgKGxwb3J0ID0gMCwgaSA9IDA7IGkgPCBtLT5tX2xlbi0xOyArK2kpIHsKKwkJCWlmIChtLT5tX2RhdGFbaV0gPCAnMCcgfHwgbS0+bV9kYXRhW2ldID4gJzknKQorCQkJCXJldHVybiAxOyAgICAgICAvKiBpbnZhbGlkIG51bWJlciAqLworCQkJbHBvcnQgKj0gMTA7CisJCQlscG9ydCArPSBtLT5tX2RhdGFbaV0gLSAnMCc7CisJCX0KKwkJaWYgKG0tPm1fZGF0YVttLT5tX2xlbi0xXSA9PSAnXDAnICYmIGxwb3J0ICE9IDAgJiYKKwkJICAgIChzbyA9IHNvbGlzdGVuKDAsIHNvLT5zb19sYWRkcl9pcCwgbHBvcnQsIFNTX0ZBQ0NFUFRPTkNFKSkgIT0gTlVMTCkKKwkJCW0tPm1fbGVuID0gc25wcmludGYobS0+bV9kYXRhLCBtLT5tX2hkci5taF9zaXplLCAiJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzby0+c29fZmFkZHJfcG9ydCkgKyAxOworCQlyZXR1cm4gMTsKKworCSBjYXNlIEVNVV9JUkM6CisJCS8qCisJCSAqIE5lZWQgdG8gZW11bGF0ZSBEQ0MgQ0hBVCwgRENDIFNFTkQgYW5kIERDQyBNT1ZFCisJCSAqLworCQkqKG0tPm1fZGF0YSttLT5tX2xlbikgPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIGZvciBzdHJzdHIgKi8KKwkJaWYgKChicHRyID0gKGNoYXIgKilzdHJzdHIobS0+bV9kYXRhLCAiRENDIikpID09IE5VTEwpCisJCQkgcmV0dXJuIDE7CisKKwkJLyogVGhlICUyNTZzIGlzIGZvciB0aGUgYnJva2VuIG1JUkMgKi8KKwkJaWYgKHNzY2FuZihicHRyLCAiRENDIENIQVQgJTI1NnMgJXUgJXUiLCBidWZmLCAmbGFkZHIsICZscG9ydCkgPT0gMykgeworCQkJaWYgKChzbyA9IHNvbGlzdGVuKDAsIGxhZGRyLCBscG9ydCwgU1NfRkFDQ0VQVE9OQ0UpKSA9PSBOVUxMKQorCQkJCXJldHVybiAxOworCisJCQltLT5tX2xlbiA9IGJwdHIgLSBtLT5tX2RhdGE7IC8qIEFkanVzdCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbGVuICs9IHNucHJpbnRmKGJwdHIsIG0tPm1faGRyLm1oX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRENDIENIQVQgY2hhdCAlbHUgJXUlY1xuIiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHNvLT5zb19mYWRkcl9pcCwKKwkJCSAgICAgc28tPnNvX2ZhZGRyX3BvcnQsIDEpOworCQl9IGVsc2UgaWYgKHNzY2FuZihicHRyLCAiRENDIFNFTkQgJTI1NnMgJXUgJXUgJXUiLCBidWZmLCAmbGFkZHIsICZscG9ydCwgJm4xKSA9PSA0KSB7CisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgbGFkZHIsIGxwb3J0LCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCisJCQkJcmV0dXJuIDE7CisKKwkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbS0+bV9sZW4gKz0gc25wcmludGYoYnB0ciwgbS0+bV9oZHIubWhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQ0MgU0VORCAlcyAldSAldSAldSVjXG4iLCBidWZmLAorCQkJICAgICAgc28tPnNvX2ZhZGRyX2lwLCBzby0+c29fZmFkZHJfcG9ydCwgbjEsIDEpOworCQl9IGVsc2UgaWYgKHNzY2FuZihicHRyLCAiRENDIE1PVkUgJTI1NnMgJXUgJXUgJXUiLCBidWZmLCAmbGFkZHIsICZscG9ydCwgJm4xKSA9PSA0KSB7CisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgbGFkZHIsIGxwb3J0LCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCisJCQkJcmV0dXJuIDE7CisKKwkJCW0tPm1fbGVuID0gYnB0ciAtIG0tPm1fZGF0YTsgLyogQWRqdXN0IGxlbmd0aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbS0+bV9sZW4gKz0gc25wcmludGYoYnB0ciwgbS0+bV9oZHIubWhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQ0MgTU9WRSAlcyAlbHUgJXUgJXUlY1xuIiwgYnVmZiwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKXNvLT5zb19mYWRkcl9pcCwKKwkJCSAgICAgIHNvLT5zb19mYWRkcl9wb3J0LCBuMSwgMSk7CisJCX0KKwkJcmV0dXJuIDE7CisKKwkgY2FzZSBFTVVfUkVBTEFVRElPOgorICAgICAgICAgICAgICAgIC8qCisJCSAqIFJlYWxBdWRpbyBlbXVsYXRpb24gLSBKUC4gV2UgbXVzdCB0cnkgdG8gcGFyc2UgdGhlIGluY29taW5nCisJCSAqIGRhdGEgYW5kIHRyeSB0byBmaW5kIHRoZSB0d28gY2hhcmFjdGVycyB0aGF0IGNvbnRhaW4gdGhlCisJCSAqIHBvcnQgbnVtYmVyLiBUaGVuIHdlIHJlZGlyZWN0IGFuIHVkcCBwb3J0IGFuZCByZXBsYWNlIHRoZQorCQkgKiBudW1iZXIgd2l0aCB0aGUgcmVhbCBwb3J0IHdlIGdvdC4KKwkJICoKKwkJICogVGhlIDEuMCBiZXRhIHZlcnNpb25zIG9mIHRoZSBwbGF5ZXIgYXJlIG5vdCBzdXBwb3J0ZWQKKwkJICogYW55IG1vcmUuCisJCSAqCisJCSAqIEEgdHlwaWNhbCBwYWNrZXQgZm9yIHBsYXllciB2ZXJzaW9uIDEuMCAocmVsZWFzZSB2ZXJzaW9uKToKKwkJICoKKwkJICogMDAwMDo1MCA0RSA0MSAwMCAwNQorCQkgKiAwMDAwOjAwIDAxIDAwIDAyIDFCIEQ3IDAwIDAwIDY3IEU2IDZDIERDIDYzIDAwIDEyIDUwIC4uLi4uw5cuLmfDpmzDnGMuLlAKKwkJICogMDAxMDo0RSA0MyA0QyA0OSA0NSA0RSA1NCAyMCAzMSAzMCAzMSAyMCA0MSA0QyA1MCA0OCBOQ0xJRU5UIDEwMSBBTFBICisJCSAqIDAwMjA6NDEgNkMgMDAgMDAgNTIgMDAgMTcgNzIgNjEgNjYgNjkgNkMgNjUgNzMgMkYgNzYgQWwuLlIuLnJhZmlsZXMvdgorCQkgKiAwMDMwOjZGIDYxIDJGIDY1IDZFIDY3IDZDIDY5IDczIDY4IDVGIDJFIDcyIDYxIDc5IDQyIG9hL2VuZ2xpc2hfLnJheUIKKwkJICoKKwkJICogTm93IHRoZSBwb3J0IG51bWJlciAweDFCRDcgaXMgZm91bmQgYXQgb2Zmc2V0IDB4MDQgb2YgdGhlCisJCSAqIE5vdyB0aGUgcG9ydCBudW1iZXIgMHgxQkQ3IGlzIGZvdW5kIGF0IG9mZnNldCAweDA0IG9mIHRoZQorCQkgKiBzZWNvbmQgcGFja2V0LiBUaGlzIHRpbWUgd2UgcmVjZWl2ZWQgZml2ZSBieXRlcyBmaXJzdCBhbmQKKwkJICogdGhlbiB0aGUgcmVzdC4gWW91IG5ldmVyIGtub3cgaG93IG1hbnkgYnl0ZXMgeW91IGdldC4KKwkJICoKKwkJICogQSB0eXBpY2FsIHBhY2tldCBmb3IgcGxheWVyIHZlcnNpb24gMi4wIChiZXRhKToKKwkJICoKKwkJICogMDAwMDo1MCA0RSA0MSAwMCAwNiAwMCAwMiAwMCAwMCAwMCAwMSAwMCAwMiAxQiBDMSAwMCBQTkEuLi4uLi4uLi4uLsOBLgorCQkgKiAwMDEwOjAwIDY3IDc1IDc4IEY1IDYzIDAwIDBBIDU3IDY5IDZFIDMyIDJFIDMwIDJFIDMwIC5ndXjDtWMuLldpbjIuMC4wCisJCSAqIDAwMjA6MkUgMzUgNkMgMDAgMDAgNTIgMDAgMUMgNzIgNjEgNjYgNjkgNkMgNjUgNzMgMkYgLjVsLi5SLi5yYWZpbGVzLworCQkgKiAwMDMwOjc3IDY1IDYyIDczIDY5IDc0IDY1IDJGIDMyIDMwIDcyIDY1IDZDIDY1IDYxIDczIHdlYnNpdGUvMjByZWxlYXMKKwkJICogMDA0MDo2NSAyRSA3MiA2MSA3OSA1MyAwMCAwMCAwNiAzNiA0MiAgICAgICAgICAgICAgICBlLnJheVMuLi42QgorCQkgKgorCQkgKiBQb3J0IG51bWJlciAweDFCQzEgaXMgZm91bmQgYXQgb2Zmc2V0IDB4MGQuCisJCSAqCisJCSAqIFRoaXMgaXMganVzdCBhIGhvcnJpYmxlIHN3aXRjaCBzdGF0ZW1lbnQuIFZhcmlhYmxlIHJhIHRlbGxzCisJCSAqIHVzIHdoZXJlIHdlJ3JlIGdvaW5nLgorCQkgKi8KKworCQlicHRyID0gbS0+bV9kYXRhOworCQl3aGlsZSAoYnB0ciA8IG0tPm1fZGF0YSArIG0tPm1fbGVuKSB7CisJCQl1X3Nob3J0IHA7CisJCQlzdGF0aWMgaW50IHJhID0gMDsKKwkJCWNoYXIgcmFfdGJsWzRdOworCisJCQlyYV90YmxbMF0gPSAweDUwOworCQkJcmFfdGJsWzFdID0gMHg0ZTsKKwkJCXJhX3RibFsyXSA9IDB4NDE7CisJCQlyYV90YmxbM10gPSAwOworCisJCQlzd2l0Y2ggKHJhKSB7CisJCQkgY2FzZSAwOgorCQkJIGNhc2UgMjoKKwkJCSBjYXNlIDM6CisJCQkJaWYgKCpicHRyKysgIT0gcmFfdGJsW3JhXSkgeworCQkJCQlyYSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJIGNhc2UgMToKKwkJCQkvKgorCQkJCSAqIFdlIG1heSBnZXQgMHg1MCBzZXZlcmFsIHRpbWVzLCBpZ25vcmUgdGhlbQorCQkJCSAqLworCQkJCWlmICgqYnB0ciA9PSAweDUwKSB7CisJCQkJCXJhID0gMTsKKwkJCQkJYnB0cisrOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKCpicHRyKysgIT0gcmFfdGJsW3JhXSkgeworCQkJCQlyYSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJIGNhc2UgNDoKKwkJCQkvKgorCQkJCSAqIHNraXAgdmVyc2lvbiBudW1iZXIKKwkJCQkgKi8KKwkJCQlicHRyKys7CisJCQkJYnJlYWs7CisKKwkJCSBjYXNlIDU6CisJCQkJLyoKKwkJCQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZlcnNpb25zIDEuMCBhbmQKKwkJCQkgKiAyLjAgaXMgaGVyZS4gRm9yIGZ1dHVyZSB2ZXJzaW9ucyBvZgorCQkJCSAqIHRoZSBwbGF5ZXIgdGhpcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KKwkJCQkgKi8KKwkJCQlpZiAoKihicHRyICsgMSkgPT0gMHgwMikKKwkJCQkgICBicHRyICs9IDg7CisJCQkJZWxzZQorCQkJCSAgIGJwdHIgKz0gNDsKKwkJCQlicmVhazsKKworCQkJIGNhc2UgNjoKKwkJCQkvKiBUaGlzIGlzIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBwb3J0CisJCQkJICogbnVtYmVyIHRoYXQgUkEtcGxheWVyIGlzIGxpc3RlbmluZyB0by4KKwkJCQkgKi8KKwkJCQlscG9ydCA9ICgoKHVfY2hhciopYnB0cilbMF0gPDwgOCkKKwkJCQkrICgodV9jaGFyICopYnB0cilbMV07CisJCQkJaWYgKGxwb3J0IDwgNjk3MCkKKwkJCQkgICBscG9ydCArPSAyNTY7ICAgLyogZG9uJ3Qga25vdyB3aHkgKi8KKwkJCQlpZiAobHBvcnQgPCA2OTcwIHx8IGxwb3J0ID4gNzE3MCkKKwkJCQkgICByZXR1cm4gMTsgICAgICAgLyogZmFpbGVkICovCisKKwkJCQkvKiB0cnkgdG8gZ2V0IHVkcCBwb3J0IGJldHdlZW4gNjk3MCAtIDcxNzAgKi8KKwkJCQlmb3IgKHAgPSA2OTcwOyBwIDwgNzA3MTsgcCsrKSB7CisJCQkJCWlmICh1ZHBfbGlzdGVuKCBwLAorCQkJCQkJICAgICAgIHNvLT5zb19sYWRkcl9pcCwKKwkJCQkJCSAgICAgICBscG9ydCwKKwkJCQkJCSAgICAgICBTU19GQUNDRVBUT05DRSkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwID09IDcwNzEpCisJCQkJICAgcCA9IDA7CisJCQkJKih1X2NoYXIgKilicHRyKysgPSAocCA+PiA4KSAmIDB4ZmY7CisJCQkJKih1X2NoYXIgKilicHRyKysgPSBwICYgMHhmZjsKKwkJCQlyYSA9IDA7CisJCQkJcmV0dXJuIDE7ICAgLyogcG9ydCByZWRpcmVjdGVkLCB3ZSdyZSBkb25lICovCisJCQkJYnJlYWs7CisKKwkJCSBkZWZhdWx0OgorCQkJCXJhID0gMDsKKwkJCX0KKwkJCXJhKys7CisJCX0KKwkJcmV0dXJuIDE7CisKKwkgZGVmYXVsdDoKKwkJLyogT29vcHMsIG5vdCBlbXVsYXRlZCwgd29uJ3QgY2FsbCB0Y3BfZW11IGFnYWluICovCisJCXNvLT5zb19lbXUgPSAwOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qCisgKiBEbyBtaXNjLiBjb25maWcgb2YgU0xpUlAgd2hpbGUgaXRzIHJ1bm5pbmcuCisgKiBSZXR1cm4gMCBpZiB0aGlzIGNvbm5lY3Rpb25zIGlzIHRvIGJlIGNsb3NlZCwgMSBvdGhlcndpc2UsCisgKiByZXR1cm4gMiBpZiB0aGlzIGlzIGEgY29tbWFuZC1saW5lIGNvbm5lY3Rpb24KKyAqLworaW50Cit0Y3BfY3RsKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXN0cnVjdCBzYnVmICpzYiA9ICZzby0+c29fc25kOworCWludCBjb21tYW5kOworIAlzdHJ1Y3QgZXhfbGlzdCAqZXhfcHRyOworCWludCBkb19wdHk7CisgICAgICAgIC8vCXN0cnVjdCBzb2NrZXQgKnRtcHNvOworCisJREVCVUdfQ0FMTCgidGNwX2N0bCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisjaWYgMAorCS8qCisJICogQ2hlY2sgaWYgdGhleSdyZSBhdXRob3Jpc2VkCisJICovCisJaWYgKGN0bF9hZGRyX2lwICYmIChjdGxfYWRkcl9pcCA9PSAtMSB8fCAoc28tPnNvX2xhZGRyX2lwICE9IGN0bF9hZGRyX2lwKSkpIHsKKwkJc2ItPnNiX2NjID0gc3ByaW50ZihzYi0+c2Jfd3B0ciwiRXJyb3I6IFBlcm1pc3Npb24gZGVuaWVkLlxyXG4iKTsKKwkJc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwljb21tYW5kID0gKHNvLT5zb19mYWRkcl9pcCAmIDB4ZmYpOworCisJc3dpdGNoKGNvbW1hbmQpIHsKKwlkZWZhdWx0OiAvKiBDaGVjayBmb3IgZXhlYydzICovCisKKwkJLyoKKwkJICogQ2hlY2sgaWYgaXQncyBwdHlfZXhlYworCQkgKi8KKwkJZm9yIChleF9wdHIgPSBleGVjX2xpc3Q7IGV4X3B0cjsgZXhfcHRyID0gZXhfcHRyLT5leF9uZXh0KSB7CisJCQlpZiAoZXhfcHRyLT5leF9mcG9ydCA9PSBzby0+c29fZmFkZHJfcG9ydCAmJgorCQkJICAgIGNvbW1hbmQgPT0gZXhfcHRyLT5leF9hZGRyKSB7CisJCQkJaWYgKGV4X3B0ci0+ZXhfcHR5ID09IDMpIHsKKwkJCQkJc28tPnMgPSAtMTsKKwkJCQkJc28tPmV4dHJhID0gKHZvaWQgKilleF9wdHItPmV4X2V4ZWM7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCQlkb19wdHkgPSBleF9wdHItPmV4X3B0eTsKKwkJCQlnb3RvIGRvX2V4ZWM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBOb3RoaW5nIGJvdW5kLi4KKwkJICovCisJCS8qIHRjcF9mY29ubmVjdChzbyk7ICovCisKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIENUTF9BTElBUzoKKyAgICAgICAgICBzYi0+c2JfY2MgPSBzbnByaW50ZihzYi0+c2Jfd3B0ciwgc2ItPnNiX2RhdGFsZW4gLSAoc2ItPnNiX3dwdHIgLSBzYi0+c2JfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yOiBObyBhcHBsaWNhdGlvbiBjb25maWd1cmVkLlxyXG4iKTsKKwkgIHNiLT5zYl93cHRyICs9IHNiLT5zYl9jYzsKKwkgIHJldHVybigwKTsKKworCWRvX2V4ZWM6CisJCURFQlVHX01JU0MoKGRmZCwgIiBleGVjdXRpbmcgJXMgXG4iLGV4X3B0ci0+ZXhfZXhlYykpOworCQlyZXR1cm4oZm9ya19leGVjKHNvLCBleF9wdHItPmV4X2V4ZWMsIGRvX3B0eSkpOworCisjaWYgMAorCWNhc2UgQ1RMX0NNRDoKKwkgICBmb3IgKHRtcHNvID0gdGNiLnNvX25leHQ7IHRtcHNvICE9ICZ0Y2I7IHRtcHNvID0gdG1wc28tPnNvX25leHQpIHsKKwkgICAgIGlmICh0bXBzby0+c29fZW11ID09IEVNVV9DVEwgJiYKKwkJICEodG1wc28tPnNvX3RjcGNiPworCQkgICAodG1wc28tPnNvX3RjcGNiLT50X3N0YXRlICYgKFRDUFNfVElNRV9XQUlUfFRDUFNfTEFTVF9BQ0spKQorCQkgICA6MCkpIHsKKwkgICAgICAgLyogT29vcHMsIGNvbnRyb2wgY29ubmVjdGlvbiBhbHJlYWR5IGFjdGl2ZSAqLworCSAgICAgICBzYi0+c2JfY2MgPSBzcHJpbnRmKHNiLT5zYl93cHRyLCJTb3JyeSwgYWxyZWFkeSBjb25uZWN0ZWQuXHJcbiIpOworCSAgICAgICBzYi0+c2Jfd3B0ciArPSBzYi0+c2JfY2M7CisJICAgICAgIHJldHVybiAwOworCSAgICAgfQorCSAgIH0KKwkgICBzby0+c29fZW11ID0gRU1VX0NUTDsKKwkgICBjdGxfcGFzc3dvcmRfb2sgPSAwOworCSAgIHNiLT5zYl9jYyA9IHNwcmludGYoc2ItPnNiX3dwdHIsICJTbGlycCBjb21tYW5kLWxpbmUgcmVhZHkgKHR5cGUgXCJoZWxwXCIgZm9yIGhlbHApLlxyXG5TbGlycD4gIik7CisJICAgc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOworCSAgIGRvX2VjaG89LTE7CisJICAgcmV0dXJuKDIpOworI2VuZGlmCisJfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RjcF90aW1lci5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RjcF90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTVlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX3RpbWVyLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwX3RpbWVyLmMJOC4xIChCZXJrZWxleSkgNi8xMC85MworICogdGNwX3RpbWVyLmMsdiAxLjIgMTk5NC8wOC8wMiAwNzo0OToxMCBkYXZpZGcgRXhwCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKKyNpZmRlZiBMT0dfRU5BQkxFRAorc3RydWN0ICAgdGNwc3RhdCB0Y3BzdGF0OyAgICAgICAgLyogdGNwIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCit1X2ludDMyX3QgICAgICAgIHRjcF9ub3c7ICAgICAgICAgICAgICAgIC8qIGZvciBSRkMgMTMyMyB0aW1lc3RhbXBzICovCisKK3N0YXRpYyBzdHJ1Y3QgdGNwY2IgKnRjcF90aW1lcnMocmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cCwgaW50IHRpbWVyKTsKKworLyoKKyAqIEZhc3QgdGltZW91dCByb3V0aW5lIGZvciBwcm9jZXNzaW5nIGRlbGF5ZWQgYWNrcworICovCit2b2lkCit0Y3BfZmFzdHRpbW8odm9pZCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3Qgc29ja2V0ICpzbzsKKwlyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwOworCisJREVCVUdfQ0FMTCgidGNwX2Zhc3R0aW1vIik7CisKKwlzbyA9IHRjYi5zb19uZXh0OworCWlmIChzbykKKwlmb3IgKDsgc28gIT0gJnRjYjsgc28gPSBzby0+c29fbmV4dCkKKwkJaWYgKCh0cCA9IChzdHJ1Y3QgdGNwY2IgKilzby0+c29fdGNwY2IpICYmCisJCSAgICAodHAtPnRfZmxhZ3MgJiBURl9ERUxBQ0spKSB7CisJCQl0cC0+dF9mbGFncyAmPSB+VEZfREVMQUNLOworCQkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfZGVsYWNrKyspOworCQkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQl9Cit9CisKKy8qCisgKiBUY3AgcHJvdG9jb2wgdGltZW91dCByb3V0aW5lIGNhbGxlZCBldmVyeSA1MDAgbXMuCisgKiBVcGRhdGVzIHRoZSB0aW1lcnMgaW4gYWxsIGFjdGl2ZSB0Y2IncyBhbmQKKyAqIGNhdXNlcyBmaW5pdGUgc3RhdGUgbWFjaGluZSBhY3Rpb25zIGlmIHRpbWVycyBleHBpcmUuCisgKi8KK3ZvaWQKK3RjcF9zbG93dGltbyh2b2lkKQoreworCXJlZ2lzdGVyIHN0cnVjdCBzb2NrZXQgKmlwLCAqaXBueHQ7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cDsKKwlyZWdpc3RlciBpbnQgaTsKKworCURFQlVHX0NBTEwoInRjcF9zbG93dGltbyIpOworCisJLyoKKwkgKiBTZWFyY2ggdGhyb3VnaCB0Y2IncyBhbmQgdXBkYXRlIGFjdGl2ZSB0aW1lcnMuCisJICovCisJaXAgPSB0Y2Iuc29fbmV4dDsKKwlpZiAoaXAgPT0gMCkKKwkgICByZXR1cm47CisJZm9yICg7IGlwICE9ICZ0Y2I7IGlwID0gaXBueHQpIHsKKwkJaXBueHQgPSBpcC0+c29fbmV4dDsKKwkJdHAgPSBzb3RvdGNwY2IoaXApOworCQlpZiAodHAgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgVENQVF9OVElNRVJTOyBpKyspIHsKKwkJCWlmICh0cC0+dF90aW1lcltpXSAmJiAtLXRwLT50X3RpbWVyW2ldID09IDApIHsKKwkJCQl0Y3BfdGltZXJzKHRwLGkpOworCQkJCWlmIChpcG54dC0+c29fcHJldiAhPSBpcCkKKwkJCQkJZ290byB0cGdvbmU7CisJCQl9CisJCX0KKwkJdHAtPnRfaWRsZSsrOworCQlpZiAodHAtPnRfcnR0KQorCQkgICB0cC0+dF9ydHQrKzsKK3RwZ29uZToKKwkJOworCX0KKwl0Y3BfaXNzICs9IFRDUF9JU1NJTkNSL1BSX1NMT1dIWjsJCS8qIGluY3JlbWVudCBpc3MgKi8KKyNpZmRlZiBUQ1BfQ09NUEFUXzQyCisJaWYgKChpbnQpdGNwX2lzcyA8IDApCisJCXRjcF9pc3MgPSAwOwkJCQkvKiBYWFggKi8KKyNlbmRpZgorCXRjcF9ub3crKzsJCQkJCS8qIGZvciB0aW1lc3RhbXBzICovCit9CisKKy8qCisgKiBDYW5jZWwgYWxsIHRpbWVycyBmb3IgVENQIHRwLgorICovCit2b2lkCit0Y3BfY2FuY2VsdGltZXJzKHN0cnVjdCB0Y3BjYiAqdHApCit7CisJcmVnaXN0ZXIgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVENQVF9OVElNRVJTOyBpKyspCisJCXRwLT50X3RpbWVyW2ldID0gMDsKK30KKworY29uc3QgaW50IHRjcF9iYWNrb2ZmW1RDUF9NQVhSWFRTSElGVCArIDFdID0KKyAgIHsgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCB9OworCisvKgorICogVENQIHRpbWVyIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGNwY2IgKgordGNwX3RpbWVycyhyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgdGltZXIpCit7CisJcmVnaXN0ZXIgaW50IHJleG10OworCisJREVCVUdfQ0FMTCgidGNwX3RpbWVycyIpOworCisJc3dpdGNoICh0aW1lcikgeworCisJLyoKKwkgKiAyIE1TTCB0aW1lb3V0IGluIHNodXRkb3duIHdlbnQgb2ZmLiAgSWYgd2UncmUgY2xvc2VkIGJ1dAorCSAqIHN0aWxsIHdhaXRpbmcgZm9yIHBlZXIgdG8gY2xvc2UgYW5kIGNvbm5lY3Rpb24gaGFzIGJlZW4gaWRsZQorCSAqIHRvbyBsb25nLCBvciBpZiAyTVNMIHRpbWUgaXMgdXAgZnJvbSBUSU1FX1dBSVQsIGRlbGV0ZSBjb25uZWN0aW9uCisJICogY29udHJvbCBibG9jay4gIE90aGVyd2lzZSwgY2hlY2sgYWdhaW4gaW4gYSBiaXQuCisJICovCisJY2FzZSBUQ1BUXzJNU0w6CisJCWlmICh0cC0+dF9zdGF0ZSAhPSBUQ1BTX1RJTUVfV0FJVCAmJgorCQkgICAgdHAtPnRfaWRsZSA8PSBUQ1BfTUFYSURMRSkKKwkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSBUQ1BUVl9LRUVQSU5UVkw7CisJCWVsc2UKKwkJCXRwID0gdGNwX2Nsb3NlKHRwKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFJldHJhbnNtaXNzaW9uIHRpbWVyIHdlbnQgb2ZmLiAgTWVzc2FnZSBoYXMgbm90CisJICogYmVlbiBhY2tlZCB3aXRoaW4gcmV0cmFuc21pdCBpbnRlcnZhbC4gIEJhY2sgb2ZmCisJICogdG8gYSBsb25nZXIgcmV0cmFuc21pdCBpbnRlcnZhbCBhbmQgcmV0cmFuc21pdCBvbmUgc2VnbWVudC4KKwkgKi8KKwljYXNlIFRDUFRfUkVYTVQ6CisKKwkJLyoKKwkJICogWFhYWFggSWYgYSBwYWNrZXQgaGFzIHRpbWVkIG91dCwgdGhlbiByZW1vdmUgYWxsIHRoZSBxdWV1ZWQKKwkJICogcGFja2V0cyBmb3IgdGhhdCBzZXNzaW9uLgorCQkgKi8KKworCQlpZiAoKyt0cC0+dF9yeHRzaGlmdCA+IFRDUF9NQVhSWFRTSElGVCkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgYSBoYWNrIHRvIHN1aXQgb3VyIHRlcm1pbmFsIHNlcnZlciBoZXJlIGF0IHRoZSB1bmkgb2YgY2FuYmVycmEKKwkJCSAqIHNpbmNlIHRoZXkgaGF2ZSB0cm91YmxlIHdpdGggemVyb2VzLi4uIEl0IHVzdWFsbHkgbGV0cyB0aGVtIHRocm91Z2gKKwkJCSAqIHVuaGFybWVkLCBidXQgdW5kZXIgc29tZSBjb25kaXRpb25zLCBpdCdsbCBlYXQgdGhlIHplcm9zLiAgSWYgd2UKKwkJCSAqIGtlZXAgcmV0cmFuc21pdHRpbmcgaXQsIGl0J2xsIGtlZXAgZWF0aW5nIHRoZSB6ZXJvZXMsIHNvIHdlIGtlZXAKKwkJCSAqIHJldHJhbnNtaXR0aW5nLCBhbmQgZXZlbnR1YWxseSB0aGUgY29ubmVjdGlvbiBkaWVzLi4uCisJCQkgKiAodGhpcyBvbmx5IGhhcHBlbnMgb24gaW5jb21pbmcgZGF0YSkKKwkJCSAqCisJCQkgKiBTbywgaWYgd2Ugd2VyZSBnb25uYSBkcm9wIHRoZSBjb25uZWN0aW9uIGZyb20gdG9vIG1hbnkgcmV0cmFuc21pdHMsCisJCQkgKiBkb24ndC4uLiBpbnN0ZWFkIGhhbHZlIHRoZSB0X21heHNlZywgd2hpY2ggbWlnaHQgYnJlYWsgdXAgdGhlIE5VTExzIGFuZAorCQkJICogbGV0IHRoZW0gdGhyb3VnaAorCQkJICoKKwkJCSAqICpzaWdoKgorCQkJICovCisKKwkJCXRwLT50X21heHNlZyA+Pj0gMTsKKwkJCWlmICh0cC0+dF9tYXhzZWcgPCAzMikgeworCQkJCS8qCisJCQkJICogV2UgdHJpZWQgb3VyIGJlc3QsIG5vdyB0aGUgY29ubmVjdGlvbiBtdXN0IGRpZSEKKwkJCQkgKi8KKwkJCQl0cC0+dF9yeHRzaGlmdCA9IFRDUF9NQVhSWFRTSElGVDsKKwkJCQlTVEFUKHRjcHN0YXQudGNwc190aW1lb3V0ZHJvcCsrKTsKKwkJCQl0cCA9IHRjcF9kcm9wKHRwLCB0cC0+dF9zb2Z0ZXJyb3IpOworCQkJCS8qIHRwLT50X3NvZnRlcnJvciA6IEVUSU1FRE9VVCk7ICovIC8qIFhYWCAqLworCQkJCXJldHVybiAodHApOyAvKiBYWFggKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCByeHRzaGlmdCB0byA2LCB3aGljaCBpcyBzdGlsbCBhdCB0aGUgbWF4aW11bQorCQkJICogYmFja29mZiB0aW1lCisJCQkgKi8KKwkJCXRwLT50X3J4dHNoaWZ0ID0gNjsKKwkJfQorCQlTVEFUKHRjcHN0YXQudGNwc19yZXhtdHRpbWVvKyspOworCQlyZXhtdCA9IFRDUF9SRVhNVFZBTCh0cCkgKiB0Y3BfYmFja29mZlt0cC0+dF9yeHRzaGlmdF07CisJCVRDUFRfUkFOR0VTRVQodHAtPnRfcnh0Y3VyLCByZXhtdCwKKwkJICAgIChzaG9ydCl0cC0+dF9ydHRtaW4sIFRDUFRWX1JFWE1UTUFYKTsgLyogWFhYICovCisJCXRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID0gdHAtPnRfcnh0Y3VyOworCQkvKgorCQkgKiBJZiBsb3NpbmcsIGxldCB0aGUgbG93ZXIgbGV2ZWwga25vdyBhbmQgdHJ5IGZvcgorCQkgKiBhIGJldHRlciByb3V0ZS4gIEFsc28sIGlmIHdlIGJhY2tlZCBvZmYgdGhpcyBmYXIsCisJCSAqIG91ciBzcnR0IGVzdGltYXRlIGlzIHByb2JhYmx5IGJvZ3VzLiAgQ2xvYmJlciBpdAorCQkgKiBzbyB3ZSdsbCB0YWtlIHRoZSBuZXh0IHJ0dCBtZWFzdXJlbWVudCBhcyBvdXIgc3J0dDsKKwkJICogbW92ZSB0aGUgY3VycmVudCBzcnR0IGludG8gcnR0dmFyIHRvIGtlZXAgdGhlIGN1cnJlbnQKKwkJICogcmV0cmFuc21pdCB0aW1lcyB1bnRpbCB0aGVuLgorCQkgKi8KKwkJaWYgKHRwLT50X3J4dHNoaWZ0ID4gVENQX01BWFJYVFNISUZUIC8gNCkgeworLyoJCQlpbl9sb3NpbmcodHAtPnRfaW5wY2IpOyAqLworCQkJdHAtPnRfcnR0dmFyICs9ICh0cC0+dF9zcnR0ID4+IFRDUF9SVFRfU0hJRlQpOworCQkJdHAtPnRfc3J0dCA9IDA7CisJCX0KKwkJdHAtPnNuZF9ueHQgPSB0cC0+c25kX3VuYTsKKwkJLyoKKwkJICogSWYgdGltaW5nIGEgc2VnbWVudCBpbiB0aGlzIHdpbmRvdywgc3RvcCB0aGUgdGltZXIuCisJCSAqLworCQl0cC0+dF9ydHQgPSAwOworCQkvKgorCQkgKiBDbG9zZSB0aGUgY29uZ2VzdGlvbiB3aW5kb3cgZG93biB0byBvbmUgc2VnbWVudAorCQkgKiAod2UnbGwgb3BlbiBpdCBieSBvbmUgc2VnbWVudCBmb3IgZWFjaCBhY2sgd2UgZ2V0KS4KKwkJICogU2luY2Ugd2UgcHJvYmFibHkgaGF2ZSBhIHdpbmRvdydzIHdvcnRoIG9mIHVuYWNrZWQKKwkJICogZGF0YSBhY2N1bXVsYXRlZCwgdGhpcyAic2xvdyBzdGFydCIga2VlcHMgdXMgZnJvbQorCQkgKiBkdW1waW5nIGFsbCB0aGF0IGRhdGEgYXMgYmFjay10by1iYWNrIHBhY2tldHMgKHdoaWNoCisJCSAqIG1pZ2h0IG92ZXJ3aGVsbSBhbiBpbnRlcm1lZGlhdGUgZ2F0ZXdheSkuCisJCSAqCisJCSAqIFRoZXJlIGFyZSB0d28gcGhhc2VzIHRvIHRoZSBvcGVuaW5nOiBJbml0aWFsbHkgd2UKKwkJICogb3BlbiBieSBvbmUgbXNzIG9uIGVhY2ggYWNrLiAgVGhpcyBtYWtlcyB0aGUgd2luZG93CisJCSAqIHNpemUgaW5jcmVhc2UgZXhwb25lbnRpYWxseSB3aXRoIHRpbWUuICBJZiB0aGUKKwkJICogd2luZG93IGlzIGxhcmdlciB0aGFuIHRoZSBwYXRoIGNhbiBoYW5kbGUsIHRoaXMKKwkJICogZXhwb25lbnRpYWwgZ3Jvd3RoIHJlc3VsdHMgaW4gZHJvcHBlZCBwYWNrZXQocykKKwkJICogYWxtb3N0IGltbWVkaWF0ZWx5LiAgVG8gZ2V0IG1vcmUgdGltZSBiZXR3ZWVuCisJCSAqIGRyb3BzIGJ1dCBzdGlsbCAicHVzaCIgdGhlIG5ldHdvcmsgdG8gdGFrZSBhZHZhbnRhZ2UKKwkJICogb2YgaW1wcm92aW5nIGNvbmRpdGlvbnMsIHdlIHN3aXRjaCBmcm9tIGV4cG9uZW50aWFsCisJCSAqIHRvIGxpbmVhciB3aW5kb3cgb3BlbmluZyBhdCBzb21lIHRocmVzaG9sZCBzaXplLgorCQkgKiBGb3IgYSB0aHJlc2hvbGQsIHdlIHVzZSBoYWxmIHRoZSBjdXJyZW50IHdpbmRvdworCQkgKiBzaXplLCB0cnVuY2F0ZWQgdG8gYSBtdWx0aXBsZSBvZiB0aGUgbXNzLgorCQkgKgorCQkgKiAodGhlIG1pbmltdW0gY3duZCB0aGF0IHdpbGwgZ2l2ZSB1cyBleHBvbmVudGlhbAorCQkgKiBncm93dGggaXMgMiBtc3MuICBXZSBkb24ndCBhbGxvdyB0aGUgdGhyZXNob2xkCisJCSAqIHRvIGdvIGJlbG93IHRoaXMuKQorCQkgKi8KKwkJeworCQl1X2ludCB3aW4gPSBtaW4odHAtPnNuZF93bmQsIHRwLT5zbmRfY3duZCkgLyAyIC8gdHAtPnRfbWF4c2VnOworCQlpZiAod2luIDwgMikKKwkJCXdpbiA9IDI7CisJCXRwLT5zbmRfY3duZCA9IHRwLT50X21heHNlZzsKKwkJdHAtPnNuZF9zc3RocmVzaCA9IHdpbiAqIHRwLT50X21heHNlZzsKKwkJdHAtPnRfZHVwYWNrcyA9IDA7CisJCX0KKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQlicmVhazsKKworCS8qCisJICogUGVyc2lzdGVuY2UgdGltZXIgaW50byB6ZXJvIHdpbmRvdy4KKwkgKiBGb3JjZSBhIGJ5dGUgdG8gYmUgb3V0cHV0LCBpZiBwb3NzaWJsZS4KKwkgKi8KKwljYXNlIFRDUFRfUEVSU0lTVDoKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfcGVyc2lzdHRpbWVvKyspOworCQl0Y3Bfc2V0cGVyc2lzdCh0cCk7CisJCXRwLT50X2ZvcmNlID0gMTsKKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQl0cC0+dF9mb3JjZSA9IDA7CisJCWJyZWFrOworCisJLyoKKwkgKiBLZWVwLWFsaXZlIHRpbWVyIHdlbnQgb2ZmOyBzZW5kIHNvbWV0aGluZworCSAqIG9yIGRyb3AgY29ubmVjdGlvbiBpZiBpZGxlIGZvciB0b28gbG9uZy4KKwkgKi8KKwljYXNlIFRDUFRfS0VFUDoKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfa2VlcHRpbWVvKyspOworCQlpZiAodHAtPnRfc3RhdGUgPCBUQ1BTX0VTVEFCTElTSEVEKQorCQkJZ290byBkcm9waXQ7CisKKy8qCQlpZiAodHAtPnRfc29ja2V0LT5zb19vcHRpb25zICYgU09fS0VFUEFMSVZFICYmICovCisJCWlmICgoU09fT1BUSU9OUykgJiYgdHAtPnRfc3RhdGUgPD0gVENQU19DTE9TRV9XQUlUKSB7CisJCSAgICAJaWYgKHRwLT50X2lkbGUgPj0gVENQVFZfS0VFUF9JRExFICsgVENQX01BWElETEUpCisJCQkJZ290byBkcm9waXQ7CisJCQkvKgorCQkJICogU2VuZCBhIHBhY2tldCBkZXNpZ25lZCB0byBmb3JjZSBhIHJlc3BvbnNlCisJCQkgKiBpZiB0aGUgcGVlciBpcyB1cCBhbmQgcmVhY2hhYmxlOgorCQkJICogZWl0aGVyIGFuIEFDSyBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZSwKKwkJCSAqIG9yIGFuIFJTVCBpZiB0aGUgcGVlciBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uCisJCQkgKiBkdWUgdG8gdGltZW91dCBvciByZWJvb3QuCisJCQkgKiBVc2luZyBzZXF1ZW5jZSBudW1iZXIgdHAtPnNuZF91bmEtMQorCQkJICogY2F1c2VzIHRoZSB0cmFuc21pdHRlZCB6ZXJvLWxlbmd0aCBzZWdtZW50CisJCQkgKiB0byBsaWUgb3V0c2lkZSB0aGUgcmVjZWl2ZSB3aW5kb3c7CisJCQkgKiBieSB0aGUgcHJvdG9jb2wgc3BlYywgdGhpcyByZXF1aXJlcyB0aGUKKwkJCSAqIGNvcnJlc3BvbmRlbnQgVENQIHRvIHJlc3BvbmQuCisJCQkgKi8KKwkJCVNUQVQodGNwc3RhdC50Y3BzX2tlZXBwcm9iZSsrKTsKKyNpZmRlZiBUQ1BfQ09NUEFUXzQyCisJCQkvKgorCQkJICogVGhlIGtlZXBhbGl2ZSBwYWNrZXQgbXVzdCBoYXZlIG5vbnplcm8gbGVuZ3RoCisJCQkgKiB0byBnZXQgYSA0LjIgaG9zdCB0byByZXNwb25kLgorCQkJICovCisJCQl0Y3BfcmVzcG9uZCh0cCwgJnRwLT50X3RlbXBsYXRlLCAoc3RydWN0IG1idWYgKilOVUxMLAorCQkJICAgIHRwLT5yY3Zfbnh0IC0gMSwgdHAtPnNuZF91bmEgLSAxLCAwKTsKKyNlbHNlCisJCQl0Y3BfcmVzcG9uZCh0cCwgJnRwLT50X3RlbXBsYXRlLCAoc3RydWN0IG1idWYgKilOVUxMLAorCQkJICAgIHRwLT5yY3Zfbnh0LCB0cC0+c25kX3VuYSAtIDEsIDApOworI2VuZGlmCisJCQl0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUElOVFZMOworCQl9IGVsc2UKKwkJCXRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQX0lETEU7CisJCWJyZWFrOworCisJZHJvcGl0OgorCQlTVEFUKHRjcHN0YXQudGNwc19rZWVwZHJvcHMrKyk7CisJCXRwID0gdGNwX2Ryb3AodHAsIDApOyAvKiBFVElNRURPVVQpOyAqLworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHRwKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BfdGltZXIuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFlZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RjcF90aW1lci5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcF90aW1lci5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqIHRjcF90aW1lci5oLHYgMS40IDE5OTQvMDgvMjEgMDU6Mjc6MzggcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9UQ1BfVElNRVJfSF8KKyNkZWZpbmUgX1RDUF9USU1FUl9IXworCisvKgorICogRGVmaW5pdGlvbnMgb2YgdGhlIFRDUCB0aW1lcnMuICBUaGVzZSB0aW1lcnMgYXJlIGNvdW50ZWQKKyAqIGRvd24gUFJfU0xPV0haIHRpbWVzIGEgc2Vjb25kLgorICovCisjZGVmaW5lCVRDUFRfTlRJTUVSUwk0CisKKyNkZWZpbmUJVENQVF9SRVhNVAkwCQkvKiByZXRyYW5zbWl0ICovCisjZGVmaW5lCVRDUFRfUEVSU0lTVAkxCQkvKiByZXRyYW5zbWl0IHBlcnNpc3RlbmNlICovCisjZGVmaW5lCVRDUFRfS0VFUAkyCQkvKiBrZWVwIGFsaXZlICovCisjZGVmaW5lCVRDUFRfMk1TTAkzCQkvKiAyKm1zbCBxdWlldCB0aW1lIHRpbWVyICovCisKKy8qCisgKiBUaGUgVENQVF9SRVhNVCB0aW1lciBpcyB1c2VkIHRvIGZvcmNlIHJldHJhbnNtaXNzaW9ucy4KKyAqIFRoZSBUQ1AgaGFzIHRoZSBUQ1BUX1JFWE1UIHRpbWVyIHNldCB3aGVuZXZlciBzZWdtZW50cworICogaGF2ZSBiZWVuIHNlbnQgZm9yIHdoaWNoIEFDS3MgYXJlIGV4cGVjdGVkIGJ1dCBub3QgeWV0CisgKiByZWNlaXZlZC4gIElmIGFuIEFDSyBpcyByZWNlaXZlZCB3aGljaCBhZHZhbmNlcyB0cC0+c25kX3VuYSwKKyAqIHRoZW4gdGhlIHJldHJhbnNtaXQgdGltZXIgaXMgY2xlYXJlZCAoaWYgdGhlcmUgYXJlIG5vIG1vcmUKKyAqIG91dHN0YW5kaW5nIHNlZ21lbnRzKSBvciByZXNldCB0byB0aGUgYmFzZSB2YWx1ZSAoaWYgdGhlcmUKKyAqIGFyZSBtb3JlIEFDS3MgZXhwZWN0ZWQpLiAgV2hlbmV2ZXIgdGhlIHJldHJhbnNtaXQgdGltZXIgZ29lcyBvZmYsCisgKiB3ZSByZXRyYW5zbWl0IG9uZSB1bmFja25vd2xlZGdlZCBzZWdtZW50LCBhbmQgZG8gYSBiYWNrb2ZmCisgKiBvbiB0aGUgcmV0cmFuc21pdCB0aW1lci4KKyAqCisgKiBUaGUgVENQVF9QRVJTSVNUIHRpbWVyIGlzIHVzZWQgdG8ga2VlcCB3aW5kb3cgc2l6ZSBpbmZvcm1hdGlvbgorICogZmxvd2luZyBldmVuIGlmIHRoZSB3aW5kb3cgZ29lcyBzaHV0LiAgSWYgYWxsIHByZXZpb3VzIHRyYW5zbWlzc2lvbnMKKyAqIGhhdmUgYmVlbiBhY2tub3dsZWRnZWQgKHNvIHRoYXQgdGhlcmUgYXJlIG5vIHJldHJhbnNtaXNzaW9ucyBpbiBwcm9ncmVzcyksCisgKiBhbmQgdGhlIHdpbmRvdyBpcyB0b28gc21hbGwgdG8gYm90aGVyIHNlbmRpbmcgYW55dGhpbmcsIHRoZW4gd2Ugc3RhcnQKKyAqIHRoZSBUQ1BUX1BFUlNJU1QgdGltZXIuICBXaGVuIGl0IGV4cGlyZXMsIGlmIHRoZSB3aW5kb3cgaXMgbm9uemVybywKKyAqIHdlIGdvIHRvIHRyYW5zbWl0IHN0YXRlLiAgT3RoZXJ3aXNlLCBhdCBpbnRlcnZhbHMgc2VuZCBhIHNpbmdsZSBieXRlCisgKiBpbnRvIHRoZSBwZWVyJ3Mgd2luZG93IHRvIGZvcmNlIGhpbSB0byB1cGRhdGUgb3VyIHdpbmRvdyBpbmZvcm1hdGlvbi4KKyAqIFdlIGRvIHRoaXMgYXQgbW9zdCBhcyBvZnRlbiBhcyBUQ1BUX1BFUlNNSU4gdGltZSBpbnRlcnZhbHMsCisgKiBidXQgbm8gbW9yZSBmcmVxdWVudGx5IHRoYW4gdGhlIGN1cnJlbnQgZXN0aW1hdGUgb2Ygcm91bmQtdHJpcAorICogcGFja2V0IHRpbWUuICBUaGUgVENQVF9QRVJTSVNUIHRpbWVyIGlzIGNsZWFyZWQgd2hlbmV2ZXIgd2UgcmVjZWl2ZQorICogYSB3aW5kb3cgdXBkYXRlIGZyb20gdGhlIHBlZXIuCisgKgorICogVGhlIFRDUFRfS0VFUCB0aW1lciBpcyB1c2VkIHRvIGtlZXAgY29ubmVjdGlvbnMgYWxpdmUuICBJZiBhbgorICogY29ubmVjdGlvbiBpcyBpZGxlIChubyBzZWdtZW50cyByZWNlaXZlZCkgZm9yIFRDUFRWX0tFRVBfSU5JVCBhbW91bnQgb2YgdGltZSwKKyAqIGJ1dCBub3QgeWV0IGVzdGFibGlzaGVkLCB0aGVuIHdlIGRyb3AgdGhlIGNvbm5lY3Rpb24uICBPbmNlIHRoZSBjb25uZWN0aW9uCisgKiBpcyBlc3RhYmxpc2hlZCwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaWRsZSBmb3IgVENQVFZfS0VFUF9JRExFIHRpbWUKKyAqIChhbmQga2VlcGFsaXZlcyBoYXZlIGJlZW4gZW5hYmxlZCBvbiB0aGUgc29ja2V0KSwgd2UgYmVnaW4gdG8gcHJvYmUKKyAqIHRoZSBjb25uZWN0aW9uLiAgV2UgZm9yY2UgdGhlIHBlZXIgdG8gc2VuZCB1cyBhIHNlZ21lbnQgYnkgc2VuZGluZzoKKyAqCTxTRVE9U05ELlVOQS0xPjxBQ0s9UkNWLk5YVD48Q1RMPUFDSz4KKyAqIFRoaXMgc2VnbWVudCBpcyAoZGVsaWJlcmF0ZWx5KSBvdXRzaWRlIHRoZSB3aW5kb3csIGFuZCBzaG91bGQgZWxpY2l0CisgKiBhbiBhY2sgc2VnbWVudCBpbiByZXNwb25zZSBmcm9tIHRoZSBwZWVyLiAgSWYsIGRlc3BpdGUgdGhlIFRDUFRfS0VFUAorICogaW5pdGlhdGVkIHNlZ21lbnRzIHdlIGNhbm5vdCBlbGljaXQgYSByZXNwb25zZSBmcm9tIGEgcGVlciBpbiBUQ1BUX01BWElETEUKKyAqIGFtb3VudCBvZiB0aW1lIHByb2JpbmcsIHRoZW4gd2UgZHJvcCB0aGUgY29ubmVjdGlvbi4KKyAqLworCisvKgorICogVGltZSBjb25zdGFudHMuCisgKi8KKyNkZWZpbmUgVENQVFZfTVNMICAgICAgICggNSpQUl9TTE9XSFopICAgICAgICAgIC8qIG1heCBzZWcgbGlmZXRpbWUgKGhhaCEpICovCisKKyNkZWZpbmUJVENQVFZfU1JUVEJBU0UJMAkJCS8qIGJhc2Ugcm91bmR0cmlwIHRpbWU7CisJCQkJCQkgICBpZiAwLCBubyBpZGVhIHlldCAqLworI2RlZmluZQlUQ1BUVl9TUlRUREZMVAkoICAzKlBSX1NMT1dIWikJCS8qIGFzc3VtZWQgUlRUIGlmIG5vIGluZm8gKi8KKworI2RlZmluZQlUQ1BUVl9QRVJTTUlOCSggIDUqUFJfU0xPV0haKQkJLyogcmV0cmFuc21pdCBwZXJzaXN0ZW5jZSAqLworI2RlZmluZQlUQ1BUVl9QRVJTTUFYCSggNjAqUFJfU0xPV0haKQkJLyogbWF4aW11bSBwZXJzaXN0IGludGVydmFsICovCisKKyNkZWZpbmUJVENQVFZfS0VFUF9JTklUCSggNzUqUFJfU0xPV0haKQkJLyogaW5pdGlhbCBjb25uZWN0IGtlZXAgYWxpdmUgKi8KKyNkZWZpbmUJVENQVFZfS0VFUF9JRExFCSgxMjAqNjAqUFJfU0xPV0haKQkvKiBkZmx0IHRpbWUgYmVmb3JlIHByb2JpbmcgKi8KKyNkZWZpbmUJVENQVFZfS0VFUElOVFZMCSggNzUqUFJfU0xPV0haKQkJLyogZGVmYXVsdCBwcm9iZSBpbnRlcnZhbCAqLworI2RlZmluZQlUQ1BUVl9LRUVQQ05UCTgJCQkvKiBtYXggcHJvYmVzIGJlZm9yZSBkcm9wICovCisKKyNkZWZpbmUJVENQVFZfTUlOCSggIDEqUFJfU0xPV0haKQkJLyogbWluaW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKy8qICNkZWZpbmUJVENQVFZfUkVYTVRNQVgJKCA2NCpQUl9TTE9XSFopCSovCS8qIG1heCBhbGxvd2FibGUgUkVYTVQgdmFsdWUgKi8KKyNkZWZpbmUgVENQVFZfUkVYTVRNQVggICggMTIqUFJfU0xPV0haKQkJLyogbWF4IGFsbG93YWJsZSBSRVhNVCB2YWx1ZSAqLworCisjZGVmaW5lCVRDUF9MSU5HRVJUSU1FCTEyMAkJCS8qIGxpbmdlciBhdCBtb3N0IDIgbWludXRlcyAqLworCisjZGVmaW5lIFRDUF9NQVhSWFRTSElGVCAxMiAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHJldHJhbnNtaXRzICovCisKKworI2lmZGVmCVRDUFRJTUVSUworY2hhciAqdGNwdGltZXJzW10gPQorICAgIHsgIlJFWE1UIiwgIlBFUlNJU1QiLCAiS0VFUCIsICIyTVNMIiB9OworI2VuZGlmCisKKy8qCisgKiBGb3JjZSBhIHRpbWUgdmFsdWUgdG8gYmUgaW4gYSBjZXJ0YWluIHJhbmdlLgorICovCisjZGVmaW5lCVRDUFRfUkFOR0VTRVQodHYsIHZhbHVlLCB0dm1pbiwgdHZtYXgpIHsgXAorCSh0dikgPSAodmFsdWUpOyBcCisJaWYgKCh0dikgPCAodHZtaW4pKSBcCisJCSh0dikgPSAodHZtaW4pOyBcCisJZWxzZSBpZiAoKHR2KSA+ICh0dm1heCkpIFwKKwkJKHR2KSA9ICh0dm1heCk7IFwKK30KKworZXh0ZXJuIGNvbnN0IGludCB0Y3BfYmFja29mZltdOworCitzdHJ1Y3QgdGNwY2I7CisKK3ZvaWQgdGNwX2Zhc3R0aW1vIF9QKCh2b2lkKSk7Cit2b2lkIHRjcF9zbG93dGltbyBfUCgodm9pZCkpOwordm9pZCB0Y3BfY2FuY2VsdGltZXJzIF9QKChzdHJ1Y3QgdGNwY2IgKikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BfdmFyLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX3Zhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDllYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGNwX3Zhci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3BfdmFyLmgJOC4zIChCZXJrZWxleSkgNC8xMC85NAorICogdGNwX3Zhci5oLHYgMS4zIDE5OTQvMDgvMjEgMDU6Mjc6MzkgcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9UQ1BfVkFSX0hfCisjZGVmaW5lIF9UQ1BfVkFSX0hfCisKKyNpbmNsdWRlICJtYnVmLmgiCisjaW5jbHVkZSAidGNwaXAuaCIKKyNpbmNsdWRlICJ0Y3BfdGltZXIuaCIKKworLyoKKyAqIFRjcCBjb250cm9sIGJsb2NrLCBvbmUgcGVyIHRjcDsgZmllbGRzOgorICovCitzdHJ1Y3QgdGNwY2IgeworCXN0cnVjdCB0Y3BpcGhkciAgKnNlZ19uZXh0OwkvKiBzZXF1ZW5jaW5nIHF1ZXVlICovCisJc3RydWN0IHRjcGlwaGRyICAqc2VnX3ByZXY7CisJc2hvcnQJdF9zdGF0ZTsJCS8qIHN0YXRlIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCXNob3J0CXRfdGltZXJbVENQVF9OVElNRVJTXTsJLyogdGNwIHRpbWVycyAqLworCXNob3J0CXRfcnh0c2hpZnQ7CQkvKiBsb2coMikgb2YgcmV4bXQgZXhwLiBiYWNrb2ZmICovCisJc2hvcnQJdF9yeHRjdXI7CQkvKiBjdXJyZW50IHJldHJhbnNtaXQgdmFsdWUgKi8KKwlzaG9ydAl0X2R1cGFja3M7CQkvKiBjb25zZWN1dGl2ZSBkdXAgYWNrcyByZWNkICovCisJdV9zaG9ydAl0X21heHNlZzsJCS8qIG1heGltdW0gc2VnbWVudCBzaXplICovCisJY2hhcgl0X2ZvcmNlOwkJLyogMSBpZiBmb3JjaW5nIG91dCBhIGJ5dGUgKi8KKwl1X3Nob3J0CXRfZmxhZ3M7CisjZGVmaW5lCVRGX0FDS05PVwkweDAwMDEJCS8qIGFjayBwZWVyIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lCVRGX0RFTEFDSwkweDAwMDIJCS8qIGFjaywgYnV0IHRyeSB0byBkZWxheSBpdCAqLworI2RlZmluZQlURl9OT0RFTEFZCTB4MDAwNAkJLyogZG9uJ3QgZGVsYXkgcGFja2V0cyB0byBjb2FsZXNjZSAqLworI2RlZmluZQlURl9OT09QVAkweDAwMDgJCS8qIGRvbid0IHVzZSB0Y3Agb3B0aW9ucyAqLworI2RlZmluZQlURl9TRU5URklOCTB4MDAxMAkJLyogaGF2ZSBzZW50IEZJTiAqLworI2RlZmluZQlURl9SRVFfU0NBTEUJMHgwMDIwCQkvKiBoYXZlL3dpbGwgcmVxdWVzdCB3aW5kb3cgc2NhbGluZyAqLworI2RlZmluZQlURl9SQ1ZEX1NDQUxFCTB4MDA0MAkJLyogb3RoZXIgc2lkZSBoYXMgcmVxdWVzdGVkIHNjYWxpbmcgKi8KKyNkZWZpbmUJVEZfUkVRX1RTVE1QCTB4MDA4MAkJLyogaGF2ZS93aWxsIHJlcXVlc3QgdGltZXN0YW1wcyAqLworI2RlZmluZQlURl9SQ1ZEX1RTVE1QCTB4MDEwMAkJLyogYSB0aW1lc3RhbXAgd2FzIHJlY2VpdmVkIGluIFNZTiAqLworI2RlZmluZQlURl9TQUNLX1BFUk1JVAkweDAyMDAJCS8qIG90aGVyIHNpZGUgc2FpZCBJIGNvdWxkIFNBQ0sgKi8KKworCS8qIE1ha2UgaXQgc3RhdGljICBmb3Igbm93ICovCisvKglzdHJ1Y3QJdGNwaXBoZHIgKnRfdGVtcGxhdGU7CS8gKiBza2VsZXRhbCBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCisJc3RydWN0CXRjcGlwaGRyIHRfdGVtcGxhdGU7CisKKwlzdHJ1Y3QJc29ja2V0ICp0X3NvY2tldDsJCS8qIGJhY2sgcG9pbnRlciB0byBzb2NrZXQgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCBhcyBpbiB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbi4KKyAqIFNlZSBSRkM3ODMsIERlYy4gMTk4MSwgcGFnZSAyMS4KKyAqLworLyogc2VuZCBzZXF1ZW5jZSB2YXJpYWJsZXMgKi8KKwl0Y3Bfc2VxCXNuZF91bmE7CQkvKiBzZW5kIHVuYWNrbm93bGVkZ2VkICovCisJdGNwX3NlcQlzbmRfbnh0OwkJLyogc2VuZCBuZXh0ICovCisJdGNwX3NlcQlzbmRfdXA7CQkJLyogc2VuZCB1cmdlbnQgcG9pbnRlciAqLworCXRjcF9zZXEJc25kX3dsMTsJCS8qIHdpbmRvdyB1cGRhdGUgc2VnIHNlcSBudW1iZXIgKi8KKwl0Y3Bfc2VxCXNuZF93bDI7CQkvKiB3aW5kb3cgdXBkYXRlIHNlZyBhY2sgbnVtYmVyICovCisJdGNwX3NlcQlpc3M7CQkJLyogaW5pdGlhbCBzZW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVfaW50MzJfdCBzbmRfd25kOwkJLyogc2VuZCB3aW5kb3cgKi8KKy8qIHJlY2VpdmUgc2VxdWVuY2UgdmFyaWFibGVzICovCisJdV9pbnQzMl90IHJjdl93bmQ7CQkvKiByZWNlaXZlIHdpbmRvdyAqLworCXRjcF9zZXEJcmN2X254dDsJCS8qIHJlY2VpdmUgbmV4dCAqLworCXRjcF9zZXEJcmN2X3VwOwkJCS8qIHJlY2VpdmUgdXJnZW50IHBvaW50ZXIgKi8KKwl0Y3Bfc2VxCWlyczsJCQkvKiBpbml0aWFsIHJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyICovCisvKgorICogQWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KKy8qIHJlY2VpdmUgdmFyaWFibGVzICovCisJdGNwX3NlcQlyY3ZfYWR2OwkJLyogYWR2ZXJ0aXNlZCB3aW5kb3cgKi8KKy8qIHJldHJhbnNtaXQgdmFyaWFibGVzICovCisJdGNwX3NlcQlzbmRfbWF4OwkJLyogaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgc2VudDsKKwkJCQkJICogdXNlZCB0byByZWNvZ25pemUgcmV0cmFuc21pdHMKKwkJCQkJICovCisvKiBjb25nZXN0aW9uIGNvbnRyb2wgKGZvciBzbG93IHN0YXJ0LCBzb3VyY2UgcXVlbmNoLCByZXRyYW5zbWl0IGFmdGVyIGxvc3MpICovCisJdV9pbnQzMl90IHNuZF9jd25kOwkJLyogY29uZ2VzdGlvbi1jb250cm9sbGVkIHdpbmRvdyAqLworCXVfaW50MzJfdCBzbmRfc3N0aHJlc2g7CQkvKiBzbmRfY3duZCBzaXplIHRocmVzaG9sZCBmb3IKKwkJCQkJICogZm9yIHNsb3cgc3RhcnQgZXhwb25lbnRpYWwgdG8KKwkJCQkJICogbGluZWFyIHN3aXRjaAorCQkJCQkgKi8KKy8qCisgKiB0cmFuc21pdCB0aW1pbmcgc3R1ZmYuICBTZWUgYmVsb3cgZm9yIHNjYWxlIG9mIHNydHQgYW5kIHJ0dHZhci4KKyAqICJWYXJpYW5jZSIgaXMgYWN0dWFsbHkgc21vb3RoZWQgZGlmZmVyZW5jZS4KKyAqLworCXNob3J0CXRfaWRsZTsJCQkvKiBpbmFjdGl2aXR5IHRpbWUgKi8KKwlzaG9ydAl0X3J0dDsJCQkvKiByb3VuZCB0cmlwIHRpbWUgKi8KKwl0Y3Bfc2VxCXRfcnRzZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgYmVpbmcgdGltZWQgKi8KKwlzaG9ydAl0X3NydHQ7CQkJLyogc21vb3RoZWQgcm91bmQtdHJpcCB0aW1lICovCisJc2hvcnQJdF9ydHR2YXI7CQkvKiB2YXJpYW5jZSBpbiByb3VuZC10cmlwIHRpbWUgKi8KKwl1X3Nob3J0CXRfcnR0bWluOwkJLyogbWluaW11bSBydHQgYWxsb3dlZCAqLworCXVfaW50MzJfdCBtYXhfc25kd25kOwkJLyogbGFyZ2VzdCB3aW5kb3cgcGVlciBoYXMgb2ZmZXJlZCAqLworCisvKiBvdXQtb2YtYmFuZCBkYXRhICovCisJY2hhcgl0X29vYmZsYWdzOwkJLyogaGF2ZSBzb21lICovCisJY2hhcgl0X2lvYmM7CQkJLyogaW5wdXQgY2hhcmFjdGVyICovCisjZGVmaW5lCVRDUE9PQl9IQVZFREFUQQkweDAxCisjZGVmaW5lCVRDUE9PQl9IQUREQVRBCTB4MDIKKwlzaG9ydAl0X3NvZnRlcnJvcjsJCS8qIHBvc3NpYmxlIGVycm9yIG5vdCB5ZXQgcmVwb3J0ZWQgKi8KKworLyogUkZDIDEzMjMgdmFyaWFibGVzICovCisJdV9jaGFyCXNuZF9zY2FsZTsJCS8qIHdpbmRvdyBzY2FsaW5nIGZvciBzZW5kIHdpbmRvdyAqLworCXVfY2hhcglyY3Zfc2NhbGU7CQkvKiB3aW5kb3cgc2NhbGluZyBmb3IgcmVjdiB3aW5kb3cgKi8KKwl1X2NoYXIJcmVxdWVzdF9yX3NjYWxlOwkvKiBwZW5kaW5nIHdpbmRvdyBzY2FsaW5nICovCisJdV9jaGFyCXJlcXVlc3RlZF9zX3NjYWxlOworCXVfaW50MzJfdAl0c19yZWNlbnQ7CQkvKiB0aW1lc3RhbXAgZWNobyBkYXRhICovCisJdV9pbnQzMl90CXRzX3JlY2VudF9hZ2U7CQkvKiB3aGVuIGxhc3QgdXBkYXRlZCAqLworCXRjcF9zZXEJbGFzdF9hY2tfc2VudDsKKworfTsKKworI2RlZmluZQlzb3RvdGNwY2Ioc28pCSgoc28pLT5zb190Y3BjYikKKworLyoKKyAqIFRoZSBzbW9vdGhlZCByb3VuZC10cmlwIHRpbWUgYW5kIGVzdGltYXRlZCB2YXJpYW5jZQorICogYXJlIHN0b3JlZCBhcyBmaXhlZCBwb2ludCBudW1iZXJzIHNjYWxlZCBieSB0aGUgdmFsdWVzIGJlbG93LgorICogRm9yIGNvbnZlbmllbmNlLCB0aGVzZSBzY2FsZXMgYXJlIGFsc28gdXNlZCBpbiBzbW9vdGhpbmcgdGhlIGF2ZXJhZ2UKKyAqIChzbW9vdGhlZCA9ICgxL3NjYWxlKXNhbXBsZSArICgoc2NhbGUtMSkvc2NhbGUpc21vb3RoZWQpLgorICogV2l0aCB0aGVzZSBzY2FsZXMsIHNydHQgaGFzIDMgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludCwKKyAqIGFuZCB0aHVzIGFuICJBTFBIQSIgb2YgMC44NzUuICBydHR2YXIgaGFzIDIgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlCisgKiBiaW5hcnkgcG9pbnQsIGFuZCBpcyBzbW9vdGhlZCB3aXRoIGFuIEFMUEhBIG9mIDAuNzUuCisgKi8KKyNkZWZpbmUJVENQX1JUVF9TQ0FMRQkJOAkvKiBtdWx0aXBsaWVyIGZvciBzcnR0OyAzIGJpdHMgZnJhYy4gKi8KKyNkZWZpbmUJVENQX1JUVF9TSElGVAkJMwkvKiBzaGlmdCBmb3Igc3J0dDsgMyBiaXRzIGZyYWMuICovCisjZGVmaW5lCVRDUF9SVFRWQVJfU0NBTEUJNAkvKiBtdWx0aXBsaWVyIGZvciBydHR2YXI7IDIgYml0cyAqLworI2RlZmluZQlUQ1BfUlRUVkFSX1NISUZUCTIJLyogbXVsdGlwbGllciBmb3IgcnR0dmFyOyAyIGJpdHMgKi8KKworLyoKKyAqIFRoZSBpbml0aWFsIHJldHJhbnNtaXNzaW9uIHNob3VsZCBoYXBwZW4gYXQgcnR0ICsgNCAqIHJ0dHZhci4KKyAqIEJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyB0aGUgc21vb3RoaW5nLCBzcnR0IGFuZCBydHR2YXIKKyAqIHdpbGwgZWFjaCBhdmVyYWdlICsxLzIgdGljayBvZiBiaWFzLiAgV2hlbiB3ZSBjb21wdXRlCisgKiB0aGUgcmV0cmFuc21pdCB0aW1lciwgd2Ugd2FudCAxLzIgdGljayBvZiByb3VuZGluZyBhbmQKKyAqIDEgZXh0cmEgdGljayBiZWNhdXNlIG9mICstMS8yIHRpY2sgdW5jZXJ0YWludHkgaW4gdGhlCisgKiBmaXJpbmcgb2YgdGhlIHRpbWVyLiAgVGhlIGJpYXMgd2lsbCBnaXZlIHVzIGV4YWN0bHkgdGhlCisgKiAxLjUgdGljayB3ZSBuZWVkLiAgQnV0LCBiZWNhdXNlIHRoZSBiaWFzIGlzCisgKiBzdGF0aXN0aWNhbCwgd2UgaGF2ZSB0byB0ZXN0IHRoYXQgd2UgZG9uJ3QgZHJvcCBiZWxvdworICogdGhlIG1pbmltdW0gZmVhc2libGUgdGltZXIgKHdoaWNoIGlzIDIgdGlja3MpLgorICogVGhpcyBtYWNybyBhc3N1bWVzIHRoYXQgdGhlIHZhbHVlIG9mIFRDUF9SVFRWQVJfU0NBTEUKKyAqIGlzIHRoZSBzYW1lIGFzIHRoZSBtdWx0aXBsaWVyIGZvciBydHR2YXIuCisgKi8KKyNkZWZpbmUJVENQX1JFWE1UVkFMKHRwKSBcCisJKCgodHApLT50X3NydHQgPj4gVENQX1JUVF9TSElGVCkgKyAodHApLT50X3J0dHZhcikKKworLyoKKyAqIFRDUCBzdGF0aXN0aWNzLgorICogTWFueSBvZiB0aGVzZSBzaG91bGQgYmUga2VwdCBwZXIgY29ubmVjdGlvbiwKKyAqIGJ1dCB0aGF0J3MgaW5jb252ZW5pZW50IGF0IHRoZSBtb21lbnQuCisgKi8KK3N0cnVjdCB0Y3BzdGF0IHsKKwl1X2xvbmcJdGNwc19jb25uYXR0ZW1wdDsJLyogY29ubmVjdGlvbnMgaW5pdGlhdGVkICovCisJdV9sb25nCXRjcHNfYWNjZXB0czsJCS8qIGNvbm5lY3Rpb25zIGFjY2VwdGVkICovCisJdV9sb25nCXRjcHNfY29ubmVjdHM7CQkvKiBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCAqLworCXVfbG9uZwl0Y3BzX2Ryb3BzOwkJLyogY29ubmVjdGlvbnMgZHJvcHBlZCAqLworCXVfbG9uZwl0Y3BzX2Nvbm5kcm9wczsJCS8qIGVtYnJ5b25pYyBjb25uZWN0aW9ucyBkcm9wcGVkICovCisJdV9sb25nCXRjcHNfY2xvc2VkOwkJLyogY29ubi4gY2xvc2VkIChpbmNsdWRlcyBkcm9wcykgKi8KKwl1X2xvbmcJdGNwc19zZWdzdGltZWQ7CQkvKiBzZWdzIHdoZXJlIHdlIHRyaWVkIHRvIGdldCBydHQgKi8KKwl1X2xvbmcJdGNwc19ydHR1cGRhdGVkOwkvKiB0aW1lcyB3ZSBzdWNjZWVkZWQgKi8KKwl1X2xvbmcJdGNwc19kZWxhY2s7CQkvKiBkZWxheWVkIGFja3Mgc2VudCAqLworCXVfbG9uZwl0Y3BzX3RpbWVvdXRkcm9wOwkvKiBjb25uLiBkcm9wcGVkIGluIHJ4bXQgdGltZW91dCAqLworCXVfbG9uZwl0Y3BzX3JleG10dGltZW87CS8qIHJldHJhbnNtaXQgdGltZW91dHMgKi8KKwl1X2xvbmcJdGNwc19wZXJzaXN0dGltZW87CS8qIHBlcnNpc3QgdGltZW91dHMgKi8KKwl1X2xvbmcJdGNwc19rZWVwdGltZW87CQkvKiBrZWVwYWxpdmUgdGltZW91dHMgKi8KKwl1X2xvbmcJdGNwc19rZWVwcHJvYmU7CQkvKiBrZWVwYWxpdmUgcHJvYmVzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19rZWVwZHJvcHM7CQkvKiBjb25uZWN0aW9ucyBkcm9wcGVkIGluIGtlZXBhbGl2ZSAqLworCisJdV9sb25nCXRjcHNfc25kdG90YWw7CQkvKiB0b3RhbCBwYWNrZXRzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19zbmRwYWNrOwkJLyogZGF0YSBwYWNrZXRzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19zbmRieXRlOwkJLyogZGF0YSBieXRlcyBzZW50ICovCisJdV9sb25nCXRjcHNfc25kcmV4bWl0cGFjazsJLyogZGF0YSBwYWNrZXRzIHJldHJhbnNtaXR0ZWQgKi8KKwl1X2xvbmcJdGNwc19zbmRyZXhtaXRieXRlOwkvKiBkYXRhIGJ5dGVzIHJldHJhbnNtaXR0ZWQgKi8KKwl1X2xvbmcJdGNwc19zbmRhY2tzOwkJLyogYWNrLW9ubHkgcGFja2V0cyBzZW50ICovCisJdV9sb25nCXRjcHNfc25kcHJvYmU7CQkvKiB3aW5kb3cgcHJvYmVzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19zbmR1cmc7CQkvKiBwYWNrZXRzIHNlbnQgd2l0aCBVUkcgb25seSAqLworCXVfbG9uZwl0Y3BzX3NuZHdpbnVwOwkJLyogd2luZG93IHVwZGF0ZS1vbmx5IHBhY2tldHMgc2VudCAqLworCXVfbG9uZwl0Y3BzX3NuZGN0cmw7CQkvKiBjb250cm9sIChTWU58RklOfFJTVCkgcGFja2V0cyBzZW50ICovCisKKwl1X2xvbmcJdGNwc19yY3Z0b3RhbDsJCS8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJdGNwc19yY3ZwYWNrOwkJLyogcGFja2V0cyByZWNlaXZlZCBpbiBzZXF1ZW5jZSAqLworCXVfbG9uZwl0Y3BzX3JjdmJ5dGU7CQkvKiBieXRlcyByZWNlaXZlZCBpbiBzZXF1ZW5jZSAqLworCXVfbG9uZwl0Y3BzX3JjdmJhZHN1bTsJCS8qIHBhY2tldHMgcmVjZWl2ZWQgd2l0aCBjY2tzdW0gZXJycyAqLworCXVfbG9uZwl0Y3BzX3JjdmJhZG9mZjsJCS8qIHBhY2tldHMgcmVjZWl2ZWQgd2l0aCBiYWQgb2Zmc2V0ICovCisvKgl1X2xvbmcJdGNwc19yY3ZzaG9ydDsJKi8JLyogcGFja2V0cyByZWNlaXZlZCB0b28gc2hvcnQgKi8KKwl1X2xvbmcJdGNwc19yY3ZkdXBwYWNrOwkvKiBkdXBsaWNhdGUtb25seSBwYWNrZXRzIHJlY2VpdmVkICovCisJdV9sb25nCXRjcHNfcmN2ZHVwYnl0ZTsJLyogZHVwbGljYXRlLW9ubHkgYnl0ZXMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJdGNwc19yY3ZwYXJ0ZHVwcGFjazsJLyogcGFja2V0cyB3aXRoIHNvbWUgZHVwbGljYXRlIGRhdGEgKi8KKwl1X2xvbmcJdGNwc19yY3ZwYXJ0ZHVwYnl0ZTsJLyogZHVwLiBieXRlcyBpbiBwYXJ0LWR1cC4gcGFja2V0cyAqLworCXVfbG9uZwl0Y3BzX3Jjdm9vcGFjazsJCS8qIG91dC1vZi1vcmRlciBwYWNrZXRzIHJlY2VpdmVkICovCisJdV9sb25nCXRjcHNfcmN2b29ieXRlOwkJLyogb3V0LW9mLW9yZGVyIGJ5dGVzIHJlY2VpdmVkICovCisJdV9sb25nCXRjcHNfcmN2cGFja2FmdGVyd2luOwkvKiBwYWNrZXRzIHdpdGggZGF0YSBhZnRlciB3aW5kb3cgKi8KKwl1X2xvbmcJdGNwc19yY3ZieXRlYWZ0ZXJ3aW47CS8qIGJ5dGVzIHJjdmQgYWZ0ZXIgd2luZG93ICovCisJdV9sb25nCXRjcHNfcmN2YWZ0ZXJjbG9zZTsJLyogcGFja2V0cyByY3ZkIGFmdGVyICJjbG9zZSIgKi8KKwl1X2xvbmcJdGNwc19yY3Z3aW5wcm9iZTsJLyogcmN2ZCB3aW5kb3cgcHJvYmUgcGFja2V0cyAqLworCXVfbG9uZwl0Y3BzX3JjdmR1cGFjazsJCS8qIHJjdmQgZHVwbGljYXRlIGFja3MgKi8KKwl1X2xvbmcJdGNwc19yY3ZhY2t0b29tdWNoOwkvKiByY3ZkIGFja3MgZm9yIHVuc2VudCBkYXRhICovCisJdV9sb25nCXRjcHNfcmN2YWNrcGFjazsJLyogcmN2ZCBhY2sgcGFja2V0cyAqLworCXVfbG9uZwl0Y3BzX3JjdmFja2J5dGU7CS8qIGJ5dGVzIGFja2VkIGJ5IHJjdmQgYWNrcyAqLworCXVfbG9uZwl0Y3BzX3JjdndpbnVwZDsJCS8qIHJjdmQgd2luZG93IHVwZGF0ZSBwYWNrZXRzICovCisvKgl1X2xvbmcJdGNwc19wYXdzZHJvcDsJKi8JLyogc2VnbWVudHMgZHJvcHBlZCBkdWUgdG8gUEFXUyAqLworCXVfbG9uZwl0Y3BzX3ByZWRhY2s7CQkvKiB0aW1lcyBoZHIgcHJlZGljdCBvayBmb3IgYWNrcyAqLworCXVfbG9uZwl0Y3BzX3ByZWRkYXQ7CQkvKiB0aW1lcyBoZHIgcHJlZGljdCBvayBmb3IgZGF0YSBwa3RzICovCisJdV9sb25nCXRjcHNfc29jYWNoZW1pc3M7CS8qIHRjcF9sYXN0X3NvIG1pc3NlcyAqLworCXVfbG9uZwl0Y3BzX2RpZG51dHRpbjsJCS8qIFRpbWVzIHRjcF9vdXRwdXQgZGlkbid0IGRvIGFueXRoaW5nIFhYWCAqLworfTsKKworZXh0ZXJuIHN0cnVjdAl0Y3BzdGF0IHRjcHN0YXQ7CS8qIHRjcCBzdGF0aXN0aWNzICovCitleHRlcm4gdV9pbnQzMl90CXRjcF9ub3c7CQkvKiBmb3IgUkZDIDEzMjMgdGltZXN0YW1wcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BpcC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RjcGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxZDY5OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90Y3BpcC5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcGlwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICogdGNwaXAuaCx2IDEuMyAxOTk0LzA4LzIxIDA1OjI3OjQwIHBhdWwgRXhwCisgKi8KKworI2lmbmRlZiBfVENQSVBfSF8KKyNkZWZpbmUgX1RDUElQX0hfCisKKy8qCisgKiBUY3AraXAgaGVhZGVyLCBhZnRlciBpcCBvcHRpb25zIHJlbW92ZWQuCisgKi8KK3N0cnVjdCB0Y3BpcGhkciB7CisJc3RydWN0IAlpcG92bHkgdGlfaTsJCS8qIG92ZXJsYWlkIGlwIHN0cnVjdHVyZSAqLworCXN0cnVjdAl0Y3BoZHIgdGlfdDsJCS8qIHRjcCBoZWFkZXIgKi8KK307CisjZGVmaW5lIHRpX21idWYgICAgICAgICB0aV9pLmloX21idWYubXB0cgorI2RlZmluZQl0aV94MQkJdGlfaS5paF94MQorI2RlZmluZQl0aV9wcgkJdGlfaS5paF9wcgorI2RlZmluZQl0aV9sZW4JCXRpX2kuaWhfbGVuCisjZGVmaW5lCXRpX3NyYwkJdGlfaS5paF9zcmMKKyNkZWZpbmUJdGlfZHN0CQl0aV9pLmloX2RzdAorI2RlZmluZQl0aV9zcG9ydAl0aV90LnRoX3Nwb3J0CisjZGVmaW5lCXRpX2Rwb3J0CXRpX3QudGhfZHBvcnQKKyNkZWZpbmUJdGlfc2VxCQl0aV90LnRoX3NlcQorI2RlZmluZQl0aV9hY2sJCXRpX3QudGhfYWNrCisjZGVmaW5lCXRpX3gyCQl0aV90LnRoX3gyCisjZGVmaW5lCXRpX29mZgkJdGlfdC50aF9vZmYKKyNkZWZpbmUJdGlfZmxhZ3MJdGlfdC50aF9mbGFncworI2RlZmluZQl0aV93aW4JCXRpX3QudGhfd2luCisjZGVmaW5lCXRpX3N1bQkJdGlfdC50aF9zdW0KKyNkZWZpbmUJdGlfdXJwCQl0aV90LnRoX3VycAorCisjZGVmaW5lIHRjcGlwaGRyMnFsaW5rKFQpICgoc3RydWN0IHFsaW5rKikoKChjaGFyKikoVCkpIC0gc2l6ZW9mKHN0cnVjdCBxbGluaykpKQorI2RlZmluZSBxbGluazJ0Y3BpcGhkcihRKSAoKHN0cnVjdCB0Y3BpcGhkciopKCgoY2hhciopKFEpKSArIHNpemVvZihzdHJ1Y3QgcWxpbmspKSkKKyNkZWZpbmUgdGNwaXBoZHJfbmV4dChUKSBxbGluazJ0Y3BpcGhkcih0Y3BpcGhkcjJxbGluayhUKS0+bmV4dCkKKyNkZWZpbmUgdGNwaXBoZHJfcHJldihUKSBxbGluazJ0Y3BpcGhkcih0Y3BpcGhkcjJxbGluayhUKS0+cHJldikKKyNkZWZpbmUgdGNwZnJhZ19saXN0X2ZpcnN0KFQpIHFsaW5rMnRjcGlwaGRyKChUKS0+c2VnX25leHQpCisjZGVmaW5lIHRjcGZyYWdfbGlzdF9lbmQoRiwgVCkgKHRjcGlwaGRyMnFsaW5rKEYpID09IChzdHJ1Y3QgcWxpbmsqKShUKSkKKyNkZWZpbmUgdGNwZnJhZ19saXN0X2VtcHR5KFQpICgoVCktPnNlZ19uZXh0ID09IChzdHJ1Y3QgdGNwaXBoZHIqKShUKSkKKworLyoKKyAqIEp1c3QgYSBjbGVhbiB3YXkgdG8gZ2V0IHRvIHRoZSBmaXJzdCBieXRlCisgKiBvZiB0aGUgcGFja2V0CisgKi8KK3N0cnVjdCB0Y3BpcGhkcl8yIHsKKwlzdHJ1Y3QgdGNwaXBoZHIgZHVtbXk7CisJY2hhciBmaXJzdF9jaGFyOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdGZ0cC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFhNDFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RmdHAuYwpAQCAtMCwwICsxLDQyOCBAQAorLyoKKyAqIHRmdHAuYyAtIGEgc2ltcGxlLCByZWFkLW9ubHkgdGZ0cCBzZXJ2ZXIgZm9yIHFlbXUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIgLy8gZm9yIHBzdHJjcHkKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2ZpbGVfaW8uaCIKKworc3RydWN0IHRmdHBfc2Vzc2lvbiB7CisgICAgaW50IGluX3VzZTsKKyAgICB1bnNpZ25lZCBjaGFyIGZpbGVuYW1lW1RGVFBfRklMRU5BTUVfTUFYXTsKKworICAgIHVpbnQzMl90IGNsaWVudF9pcDsKKyAgICB1aW50MTZfdCBjbGllbnRfcG9ydDsKKworICAgIGludCB0aW1lc3RhbXA7Cit9OworCitzdGF0aWMgc3RydWN0IHRmdHBfc2Vzc2lvbiB0ZnRwX3Nlc3Npb25zW1RGVFBfU0VTU0lPTlNfTUFYXTsKKworY29uc3QgY2hhciAqdGZ0cF9wcmVmaXg7CisKK3N0YXRpYyB2b2lkIHRmdHBfc2Vzc2lvbl91cGRhdGUoc3RydWN0IHRmdHBfc2Vzc2lvbiAqc3B0KQoreworICAgIHNwdC0+dGltZXN0YW1wID0gY3VydGltZTsKKyAgICBzcHQtPmluX3VzZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHRmdHBfc2Vzc2lvbl90ZXJtaW5hdGUoc3RydWN0IHRmdHBfc2Vzc2lvbiAqc3B0KQoreworICBzcHQtPmluX3VzZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgdGZ0cF9zZXNzaW9uX2FsbG9jYXRlKHN0cnVjdCB0ZnRwX3QgKnRwKQoreworICBzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQ7CisgIGludCBrOworCisgIGZvciAoayA9IDA7IGsgPCBURlRQX1NFU1NJT05TX01BWDsgaysrKSB7CisgICAgc3B0ID0gJnRmdHBfc2Vzc2lvbnNba107CisKKyAgICBpZiAoIXNwdC0+aW5fdXNlKQorICAgICAgICBnb3RvIGZvdW5kOworCisgICAgLyogc2Vzc2lvbnMgdGltZSBvdXQgYWZ0ZXIgNSBpbmFjdGl2ZSBzZWNvbmRzICovCisgICAgaWYgKChpbnQpKGN1cnRpbWUgLSBzcHQtPnRpbWVzdGFtcCkgPiA1MDAwKQorICAgICAgICBnb3RvIGZvdW5kOworICB9CisKKyAgcmV0dXJuIC0xOworCisgZm91bmQ6CisgIG1lbXNldChzcHQsIDAsIHNpemVvZigqc3B0KSk7CisgIHNwdC0+Y2xpZW50X2lwICAgPSBpcF9nZXRoKHRwLT5pcC5pcF9zcmMpOworICBzcHQtPmNsaWVudF9wb3J0ID0gcG9ydF9nZXRoKHRwLT51ZHAudWhfc3BvcnQpOworCisgIHRmdHBfc2Vzc2lvbl91cGRhdGUoc3B0KTsKKworICByZXR1cm4gazsKK30KKworc3RhdGljIGludCB0ZnRwX3Nlc3Npb25fZmluZChzdHJ1Y3QgdGZ0cF90ICp0cCkKK3sKKyAgc3RydWN0IHRmdHBfc2Vzc2lvbiAqc3B0OworICBpbnQgazsKKworICBmb3IgKGsgPSAwOyBrIDwgVEZUUF9TRVNTSU9OU19NQVg7IGsrKykgeworICAgIHNwdCA9ICZ0ZnRwX3Nlc3Npb25zW2tdOworCisgICAgaWYgKHNwdC0+aW5fdXNlKSB7CisgICAgICBpZiAoc3B0LT5jbGllbnRfaXAgPT0gaXBfZ2V0aCh0cC0+aXAuaXBfc3JjKSkgeworCQlpZiAoc3B0LT5jbGllbnRfcG9ydCA9PSBwb3J0X2dldGgodHAtPnVkcC51aF9zcG9ydCkpIHsKKwkJICByZXR1cm4gazsKKwkJfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0ZnRwX3JlYWRfZGF0YShzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQsIHVfaW50MTZfdCBibG9ja19uciwKKwkJCSAgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgaW50IGZkOworICBpbnQgYnl0ZXNfcmVhZCA9IDA7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgbjsKKworICBuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzLyVzIiwKKwkgICAgICAgdGZ0cF9wcmVmaXgsIHNwdC0+ZmlsZW5hbWUpOworICBpZiAobiA+PSAoaW50KXNpemVvZihidWZmZXIpKQorICAgIHJldHVybiAtMTsKKworICBmZCA9IG9wZW4oYnVmZmVyLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKworICBpZiAoZmQgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGxlbikgeworICAgIGxzZWVrKGZkLCBibG9ja19uciAqIDUxMiwgU0VFS19TRVQpOworCisgICAgYnl0ZXNfcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIGNsb3NlKGZkKTsKKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworc3RhdGljIGludCB0ZnRwX3NlbmRfb2FjayhzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZnRwX3QgKnJlY3ZfdHApCit7CisgICAgU29ja0FkZHJlc3MgIHNhZGRyLCBkYWRkcjsKKyAgICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgICBzdHJ1Y3QgdGZ0cF90ICp0cDsKKyAgICBpbnQgbiA9IDA7CisKKyAgICBtID0gbV9nZXQoKTsKKworICAgIGlmICghbSkKKwlyZXR1cm4gLTE7CisKKyAgICBtZW1zZXQobS0+bV9kYXRhLCAwLCBtLT5tX3NpemUpOworCisgICAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisgICAgdHAgPSAodm9pZCAqKW0tPm1fZGF0YTsKKyAgICBtLT5tX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCB1ZHBpcGhkcik7CisKKyAgICB0cC0+dHBfb3AgPSBodG9ucyhURlRQX09BQ0spOworICAgIG4gKz0gc25wcmludGYoKGNoYXIgKil0cC0+eC50cF9idWYgKyBuLCBzaXplb2YodHAtPngudHBfYnVmKSAtIG4sICIlcyIsCisgICAgICAgICAgICAgICAgICBrZXkpICsgMTsKKyAgICBuICs9IHNucHJpbnRmKChjaGFyICopdHAtPngudHBfYnVmICsgbiwgc2l6ZW9mKHRwLT54LnRwX2J1ZikgLSBuLCAiJXUiLAorICAgICAgICAgICAgICAgICAgdmFsdWUpICsgMTsKKworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZzYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcF9nZXRoKHJlY3ZfdHAtPmlwLmlwX2RzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9nZXRoKHJlY3ZfdHAtPnVkcC51aF9kcG9ydCkgKTsKKworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZkYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHQtPmNsaWVudF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHQtPmNsaWVudF9wb3J0ICk7CisKKyAgICBtLT5tX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGZ0cF90KSAtIDUxNCArIG4gLQorICAgICAgICBzaXplb2Yoc3RydWN0IGlwKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKyAgICB1ZHBfb3V0cHV0Ml8oTlVMTCwgbSwgJnNhZGRyLCAmZGFkZHIsIElQVE9TX0xPV0RFTEFZKTsKKworICAgIHJldHVybiAwOworfQorCisKKworc3RhdGljIGludCB0ZnRwX3NlbmRfZXJyb3Ioc3RydWN0IHRmdHBfc2Vzc2lvbiAqc3B0LAorCQkJICAgdV9pbnQxNl90IGVycm9yY29kZSwgY29uc3QgY2hhciAqbXNnLAorCQkJICAgc3RydWN0IHRmdHBfdCAqcmVjdl90cCkKK3sKKyAgU29ja0FkZHJlc3Mgc2FkZHIsIGRhZGRyOworICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgc3RydWN0IHRmdHBfdCAqdHA7CisKKyAgbSA9IG1fZ2V0KCk7CisKKyAgaWYgKCFtKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbWVtc2V0KG0tPm1fZGF0YSwgMCwgbS0+bV9zaXplKTsKKworICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKyAgdHAgPSAodm9pZCAqKW0tPm1fZGF0YTsKKyAgbS0+bV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworCisgIHRwLT50cF9vcCA9IGh0b25zKFRGVFBfRVJST1IpOworICB0cC0+eC50cF9lcnJvci50cF9lcnJvcl9jb2RlID0gaHRvbnMoZXJyb3Jjb2RlKTsKKyAgcHN0cmNweSgoY2hhciAqKXRwLT54LnRwX2Vycm9yLnRwX21zZywgc2l6ZW9mKHRwLT54LnRwX2Vycm9yLnRwX21zZyksIG1zZyk7CisKKyAgc29ja19hZGRyZXNzX2luaXRfaW5ldCggJnNhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpcF9nZXRoKHJlY3ZfdHAtPmlwLmlwX2RzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfZ2V0aChyZWN2X3RwLT51ZHAudWhfZHBvcnQpICk7CisKKyAgc29ja19hZGRyZXNzX2luaXRfaW5ldCggJmRhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHQtPmNsaWVudF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3B0LT5jbGllbnRfcG9ydCApOworCisgIG0tPm1fbGVuID0gc2l6ZW9mKHN0cnVjdCB0ZnRwX3QpIC0gNTE0ICsgMyArIHN0cmxlbihtc2cpIC0KKyAgICAgICAgc2l6ZW9mKHN0cnVjdCBpcCkgLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisKKyAgdWRwX291dHB1dDJfKE5VTEwsIG0sICZzYWRkciwgJmRhZGRyLCBJUFRPU19MT1dERUxBWSk7CisKKyAgdGZ0cF9zZXNzaW9uX3Rlcm1pbmF0ZShzcHQpOworCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRmdHBfc2VuZF9kYXRhKHN0cnVjdCB0ZnRwX3Nlc3Npb24gKnNwdCwKKwkJCSAgdV9pbnQxNl90IGJsb2NrX25yLAorCQkJICBzdHJ1Y3QgdGZ0cF90ICpyZWN2X3RwKQoreworICBTb2NrQWRkcmVzcyBzYWRkciwgZGFkZHI7CisgIHN0cnVjdCBtYnVmICptOworICBzdHJ1Y3QgdGZ0cF90ICp0cDsKKyAgaW50IG5vYnl0ZXM7CisKKyAgaWYgKGJsb2NrX25yIDwgMSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG0gPSBtX2dldCgpOworCisgIGlmICghbSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1lbXNldChtLT5tX2RhdGEsIDAsIG0tPm1fc2l6ZSk7CisKKyAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisgIHRwID0gKHZvaWQgKiltLT5tX2RhdGE7CisgIG0tPm1fZGF0YSArPSBzaXplb2Yoc3RydWN0IHVkcGlwaGRyKTsKKworICB0cC0+dHBfb3AgPSBodG9ucyhURlRQX0RBVEEpOworICB0cC0+eC50cF9kYXRhLnRwX2Jsb2NrX25yID0gaHRvbnMoYmxvY2tfbnIpOworCisgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZzYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXBfZ2V0aChyZWN2X3RwLT5pcC5pcF9kc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0X2dldGgocmVjdl90cC0+dWRwLnVoX2Rwb3J0KSApOworCisgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZkYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3B0LT5jbGllbnRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwdC0+Y2xpZW50X3BvcnQgKTsKKworICBub2J5dGVzID0gdGZ0cF9yZWFkX2RhdGEoc3B0LCBibG9ja19uciAtIDEsIHRwLT54LnRwX2RhdGEudHBfYnVmLCA1MTIpOworCisgIGlmIChub2J5dGVzIDwgMCkgeworICAgIG1fZnJlZShtKTsKKworICAgIC8qIHNlbmQgImZpbGUgbm90IGZvdW5kIiBlcnJvciBiYWNrICovCisKKyAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAxLCAiRmlsZSBub3QgZm91bmQiLCB0cCk7CisKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBtLT5tX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGZ0cF90KSAtICg1MTIgLSBub2J5dGVzKSAtCisgICAgICAgIHNpemVvZihzdHJ1Y3QgaXApIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCisgIHVkcF9vdXRwdXQyXyhOVUxMLCBtLCAmc2FkZHIsICZkYWRkciwgSVBUT1NfTE9XREVMQVkpOworCisgIGlmIChub2J5dGVzID09IDUxMikgeworICAgIHRmdHBfc2Vzc2lvbl91cGRhdGUoc3B0KTsKKyAgfQorICBlbHNlIHsKKyAgICB0ZnRwX3Nlc3Npb25fdGVybWluYXRlKHNwdCk7CisgIH0KKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGZ0cF9oYW5kbGVfcnJxKHN0cnVjdCB0ZnRwX3QgKnRwLCBpbnQgcGt0bGVuKQoreworICBzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQ7CisgIGludCBzLCBrLCBuOworICB1X2ludDhfdCAqc3JjLCAqZHN0OworCisgIHMgPSB0ZnRwX3Nlc3Npb25fYWxsb2NhdGUodHApOworCisgIGlmIChzIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNwdCA9ICZ0ZnRwX3Nlc3Npb25zW3NdOworCisgIHNyYyA9IHRwLT54LnRwX2J1ZjsKKyAgZHN0ID0gc3B0LT5maWxlbmFtZTsKKyAgbiA9IHBrdGxlbiAtICgodWludDhfdCAqKSZ0cC0+eC50cF9idWZbMF0gLSAodWludDhfdCAqKXRwKTsKKworICAvKiBnZXQgbmFtZSAqLworCisgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKKyAgICBpZiAoayA8IFRGVFBfRklMRU5BTUVfTUFYKSB7CisgICAgICBkc3Rba10gPSBzcmNba107CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzcmNba10gPT0gJ1wwJykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGsgPj0gbikgeworICAgIHJldHVybjsKKyAgfQorCisgIGsrKzsKKworICAvKiBjaGVjayBtb2RlICovCisgIGlmICgobiAtIGspIDwgNikgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtZW1jbXAoJnNyY1trXSwgIm9jdGV0XDAiLCA2KSAhPSAwKSB7CisgICAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCA0LCAiVW5zdXBwb3J0ZWQgdHJhbnNmZXIgbW9kZSIsIHRwKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGsgKz0gNjsgLyogc2tpcHBpbmcgb2N0ZXQgKi8KKworICAvKiBkbyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBmaWxlbmFtZSAqLworCisgIGlmICgoc3B0LT5maWxlbmFtZVswXSAhPSAnLycpCisgICAgICB8fCAoc3B0LT5maWxlbmFtZVtzdHJsZW4oKGNoYXIgKilzcHQtPmZpbGVuYW1lKSAtIDFdID09ICcvJykKKyAgICAgIHx8ICBzdHJzdHIoKGNoYXIgKilzcHQtPmZpbGVuYW1lLCAiLy4uLyIpKSB7CisgICAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAyLCAiQWNjZXNzIHZpb2xhdGlvbiIsIHRwKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8qIG9ubHkgYWxsb3cgZXhwb3J0ZWQgcHJlZml4ZXMgKi8KKworICBpZiAoIXRmdHBfcHJlZml4KSB7CisgICAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAyLCAiQWNjZXNzIHZpb2xhdGlvbiIsIHRwKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyAqLworCisgIGlmICh0ZnRwX3JlYWRfZGF0YShzcHQsIDAsIHNwdC0+ZmlsZW5hbWUsIDApIDwgMCkgeworICAgICAgdGZ0cF9zZW5kX2Vycm9yKHNwdCwgMSwgIkZpbGUgbm90IGZvdW5kIiwgdHApOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNyY1tuIC0gMV0gIT0gMCkgeworICAgICAgdGZ0cF9zZW5kX2Vycm9yKHNwdCwgMiwgIkFjY2VzcyB2aW9sYXRpb24iLCB0cCk7CisgICAgICByZXR1cm47CisgIH0KKworICB3aGlsZSAoayA8IG4pIHsKKyAgICAgIGNvbnN0IGNoYXIgKmtleSwgKnZhbHVlOworCisgICAgICBrZXkgPSAoY2hhciAqKXNyYyArIGs7CisgICAgICBrICs9IHN0cmxlbihrZXkpICsgMTsKKworICAgICAgaWYgKGsgPj0gbikgeworCSAgdGZ0cF9zZW5kX2Vycm9yKHNwdCwgMiwgIkFjY2VzcyB2aW9sYXRpb24iLCB0cCk7CisJICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHZhbHVlID0gKGNoYXIgKilzcmMgKyBrOworICAgICAgayArPSBzdHJsZW4odmFsdWUpICsgMTsKKworICAgICAgaWYgKHN0cmNtcChrZXksICJ0c2l6ZSIpID09IDApIHsKKwkgIGludCB0c2l6ZSA9IGF0b2kodmFsdWUpOworCSAgc3RydWN0IHN0YXQgc3RhdF9wOworCisJICBpZiAodHNpemUgPT0gMCAmJiB0ZnRwX3ByZWZpeCkgeworCSAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOworCisJICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGZ0cF9wcmVmaXgsIHNwdC0+ZmlsZW5hbWUpOworCisJICAgICAgaWYgKGFuZHJvaWRfc3RhdChidWZmZXIsICZzdGF0X3ApID09IDApCisJCSAgdHNpemUgPSBzdGF0X3Auc3Rfc2l6ZTsKKwkgICAgICBlbHNlIHsKKwkJICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAxLCAiRmlsZSBub3QgZm91bmQiLCB0cCk7CisJCSAgcmV0dXJuOworCSAgICAgIH0KKwkgIH0KKworCSAgdGZ0cF9zZW5kX29hY2soc3B0LCAidHNpemUiLCB0c2l6ZSwgdHApOworICAgICAgfQorICB9CisKKyAgdGZ0cF9zZW5kX2RhdGEoc3B0LCAxLCB0cCk7Cit9CisKK3N0YXRpYyB2b2lkIHRmdHBfaGFuZGxlX2FjayhzdHJ1Y3QgdGZ0cF90ICp0cCwgaW50IHBrdGxlbikKK3sKKyAgaW50IHM7CisKKyAgcyA9IHRmdHBfc2Vzc2lvbl9maW5kKHRwKTsKKworICBpZiAocyA8IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGZ0cF9zZW5kX2RhdGEoJnRmdHBfc2Vzc2lvbnNbc10sCisJCSAgICAgbnRvaHModHAtPngudHBfZGF0YS50cF9ibG9ja19ucikgKyAxLAorCQkgICAgIHRwKSA8IDApIHsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCB0ZnRwX2lucHV0KHN0cnVjdCBtYnVmICptKQoreworICBzdHJ1Y3QgdGZ0cF90ICp0cCA9IChzdHJ1Y3QgdGZ0cF90ICopbS0+bV9kYXRhOworCisgIHN3aXRjaChudG9ocyh0cC0+dHBfb3ApKSB7CisgIGNhc2UgVEZUUF9SUlE6CisgICAgdGZ0cF9oYW5kbGVfcnJxKHRwLCBtLT5tX2xlbik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBURlRQX0FDSzoKKyAgICB0ZnRwX2hhbmRsZV9hY2sodHAsIG0tPm1fbGVuKTsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3RmdHAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90ZnRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNjc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC90ZnRwLmgKQEAgLTAsMCArMSwzMyBAQAorLyogdGZ0cCBkZWZpbmVzICovCisKKyNkZWZpbmUgVEZUUF9TRVNTSU9OU19NQVggMworCisjZGVmaW5lIFRGVFBfU0VSVkVSCTY5CisKKyNkZWZpbmUgVEZUUF9SUlEgICAgMQorI2RlZmluZSBURlRQX1dSUSAgICAyCisjZGVmaW5lIFRGVFBfREFUQSAgIDMKKyNkZWZpbmUgVEZUUF9BQ0sgICAgNAorI2RlZmluZSBURlRQX0VSUk9SICA1CisjZGVmaW5lIFRGVFBfT0FDSyAgIDYKKworI2RlZmluZSBURlRQX0ZJTEVOQU1FX01BWCA1MTIKKworc3RydWN0IHRmdHBfdCB7CisgIHN0cnVjdCBpcCBpcDsKKyAgc3RydWN0IHVkcGhkciB1ZHA7CisgIHVfaW50MTZfdCB0cF9vcDsKKyAgdW5pb24geworICAgIHN0cnVjdCB7CisgICAgICB1X2ludDE2X3QgdHBfYmxvY2tfbnI7CisgICAgICB1X2ludDhfdCB0cF9idWZbNTEyXTsKKyAgICB9IHRwX2RhdGE7CisgICAgc3RydWN0IHsKKyAgICAgIHVfaW50MTZfdCB0cF9lcnJvcl9jb2RlOworICAgICAgdV9pbnQ4X3QgdHBfbXNnWzUxMl07CisgICAgfSB0cF9lcnJvcjsKKyAgICB1X2ludDhfdCB0cF9idWZbNTEyICsgMl07CisgIH0geDsKK307CisKK3ZvaWQgdGZ0cF9pbnB1dChzdHJ1Y3QgbWJ1ZiAqbSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdWRwLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwLWFuZHJvaWQvdWRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0MTAzYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC91ZHAuYwpAQCAtMCwwICsxLDUyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl1ZHBfdXNycmVxLmMJOC40IChCZXJrZWxleSkgMS8yMS85NAorICogdWRwX3VzcnJlcS5jLHYgMS40IDE5OTQvMTAvMDIgMTc6NDg6NDUgcGhrIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKyNpbmNsdWRlICJpcF9pY21wLmgiCisjZGVmaW5lIFNMSVJQX0NPTVBJTEFUSU9OICAxCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRzLmgiCisKKyNpZmRlZiBMT0dfRU5BQkxFRAorc3RydWN0IHVkcHN0YXQgdWRwc3RhdDsKKyNlbmRpZgorCisvKiBLZWVwcyB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIEROUyByZXF1ZXN0cy4gIFVzZWQgdG8gaW1wbGVtZW50IHRoZSBmaXJld2FsbAorICogb3B0aW9uIHRoYXQgcmVzdHJpY3RzIHRoZSBudW1iZXIgb2YgRE5TIHJlcXVlc3RzICgtbWF4X2Ruc19jb25ucykuICovCit1X2ludCBkbnNfbnVtX2Nvbm5zOworCitzdHJ1Y3Qgc29ja2V0IHVkYjsKKworc3RhdGljIHVfaW50OF90IHVkcF90b3Moc3RydWN0IHNvY2tldCAqc28pOworc3RhdGljIHZvaWQgdWRwX2VtdShzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IG1idWYgKm0pOworCisvKgorICogVURQIHByb3RvY29sIGltcGxlbWVudGF0aW9uLgorICogUGVyIFJGQyA3NjgsIEF1Z3VzdCwgMTk4MC4KKyAqLworI2lmbmRlZglDT01QQVRfNDIKKyNkZWZpbmUgVURQQ0tTVU0gMQorI2Vsc2UKKyNkZWZpbmUgVURQQ0tTVU0gMCAvKiBYWFggKi8KKyNlbmRpZgorCitzdHJ1Y3QJc29ja2V0ICp1ZHBfbGFzdF9zbyA9ICZ1ZGI7CisKK3ZvaWQKK3VkcF9pbml0KHZvaWQpCit7CisJdWRiLnNvX25leHQgPSB1ZGIuc29fcHJldiA9ICZ1ZGI7CisJZG5zX251bV9jb25ucyA9IDA7Cit9CisvKiBtLT5tX2RhdGEgIHBvaW50cyBhdCBpcCBwYWNrZXQgaGVhZGVyCisgKiBtLT5tX2xlbiAgIGxlbmd0aCBpcCBwYWNrZXQKKyAqIGlwLT5pcF9sZW4gbGVuZ3RoIGRhdGEgKElQRFUpCisgKi8KK3ZvaWQKK3VkcF9pbnB1dChyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbSwgaW50IGlwaGxlbikKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgaXAgKmlwOworCXJlZ2lzdGVyIHN0cnVjdCB1ZHBoZHIgKnVoOworLyoJc3RydWN0IG1idWYgKm9wdHMgPSAwOyovCisJaW50IGxlbjsKKwlzdHJ1Y3QgaXAgc2F2ZV9pcDsKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKKworCURFQlVHX0NBTEwoInVkcF9pbnB1dCIpOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygiaXBobGVuID0gJWQiLCBpcGhsZW4pOworCisJU1RBVCh1ZHBzdGF0LnVkcHNfaXBhY2tldHMrKyk7CisKKwkvKgorCSAqIFN0cmlwIElQIG9wdGlvbnMsIGlmIGFueTsgc2hvdWxkIHNraXAgdGhpcywKKwkgKiBtYWtlIGF2YWlsYWJsZSB0byB1c2VyLCBhbmQgdXNlIG9uIHJldHVybmVkIHBhY2tldHMsCisJICogYnV0IHdlIGRvbid0IHlldCBoYXZlIGEgd2F5IHRvIGNoZWNrIHRoZSBjaGVja3N1bQorCSAqIHdpdGggb3B0aW9ucyBzdGlsbCBwcmVzZW50LgorCSAqLworCWlmKGlwaGxlbiA+IChpbnQpc2l6ZW9mKHN0cnVjdCBpcCkpIHsKKwkJaXBfc3RyaXBvcHRpb25zKG0sIChzdHJ1Y3QgbWJ1ZiAqKTApOworCQlpcGhsZW4gPSBzaXplb2Yoc3RydWN0IGlwKTsKKwl9CisKKwkvKgorCSAqIEdldCBJUCBhbmQgVURQIGhlYWRlciB0b2dldGhlciBpbiBmaXJzdCBtYnVmLgorCSAqLworCWlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJdWggPSAoc3RydWN0IHVkcGhkciAqKSgoY2FkZHJfdClpcCArIGlwaGxlbik7CisKKwkvKgorCSAqIE1ha2UgbWJ1ZiBkYXRhIGxlbmd0aCByZWZsZWN0IFVEUCBsZW5ndGguCisJICogSWYgbm90IGVub3VnaCBkYXRhIHRvIHJlZmxlY3QgVURQIGxlbmd0aCwgZHJvcC4KKwkgKi8KKwlsZW4gPSBudG9ocygodV9pbnQxNl90KXVoLT51aF91bGVuKTsKKworCWlmIChpcC0+aXBfbGVuICE9IGxlbikgeworCQlpZiAobGVuID4gaXAtPmlwX2xlbikgeworCQkJU1RBVCh1ZHBzdGF0LnVkcHNfYmFkbGVuKyspOworCQkJZ290byBiYWQ7CisJCX0KKwkJbV9hZGoobSwgbGVuIC0gaXAtPmlwX2xlbik7CisJCWlwLT5pcF9sZW4gPSBsZW47CisJfQorCisJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwkvKiBVc2VyIG1vZGUgbmV0d29yayBzdGFjayByZXN0cmljdGlvbnMgKi8KKwkvKiBzbGlycF9zaG91bGRfZHJvcCByZXF1aXJlcyBob3N0IGJ5dGUgb3JkZXJpbmcgaW4gYXJndW1lbnRzICovCisJdGltZV90IHRpbWVzdGFtcCA9IHRpbWUoTlVMTCk7CisKKwlpZiAoc2xpcnBfc2hvdWxkX2Ryb3AobnRvaGwoaXAtPmlwX2RzdC5hZGRyKSwgbnRvaHModWgtPnVoX2Rwb3J0LnBvcnQpLAorCSAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1VEUCkpIHsKKwkgIHNsaXJwX2Ryb3BfbG9nKAorCSAgICAiRHJvcHBlZCBVRFA6IHNyYzogMHglMDhseDoweCUwNHggZHN0OiAweCUwOGx4OjB4JTA0eCAlbGRcbiIsCisJICAgIG50b2hsKGlwLT5pcF9zcmMuYWRkciksCisJICAgIG50b2hzKHVoLT51aF9zcG9ydC5wb3J0KSwKKwkgICAgbnRvaGwoaXAtPmlwX2RzdC5hZGRyKSwKKwkgICAgbnRvaHModWgtPnVoX2Rwb3J0LnBvcnQpLAorCSAgICB0aW1lc3RhbXAKKwkgICk7CisJICBnb3RvIGJhZDsgLyogZHJvcCB0aGUgcGFja2V0ICovCisJfQorCWVsc2UgeworCSAgc2xpcnBfZHJvcF9sb2coCisJICAgICJBbGxvd2VkIFVEUDogc3JjOiAweCUwOGx4OjB4JTA0eCBkc3Q6IDB4JTA4bHg6MHglMDR4ICVsZFxuIiwKKwkgICAgbnRvaGwoaXAtPmlwX3NyYy5hZGRyKSwKKwkgICAgbnRvaHModWgtPnVoX3Nwb3J0LnBvcnQpLAorCSAgICBudG9obChpcC0+aXBfZHN0LmFkZHIpLAorCSAgICBudG9ocyh1aC0+dWhfZHBvcnQucG9ydCksCisJICAgIHRpbWVzdGFtcAorCSAgKTsKKwl9CisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCisJLyoKKwkgKiBTYXZlIGEgY29weSBvZiB0aGUgSVAgaGVhZGVyIGluIGNhc2Ugd2Ugd2FudCByZXN0b3JlIGl0CisJICogZm9yIHNlbmRpbmcgYW4gSUNNUCBlcnJvciBtZXNzYWdlIGluIHJlc3BvbnNlLgorCSAqLworCXNhdmVfaXAgPSAqaXA7CisJc2F2ZV9pcC5pcF9sZW4rPSBpcGhsZW47ICAgICAgICAgLyogdGNwX2lucHV0IHN1YnRyYWN0cyB0aGlzICovCisKKwkvKgorCSAqIENoZWNrc3VtIGV4dGVuZGVkIFVEUCBoZWFkZXIgYW5kIGRhdGEuCisJICovCisJaWYgKFVEUENLU1VNICYmIHVoLT51aF9zdW0pIHsKKyAgICAgIG1lbXNldCgmKChzdHJ1Y3QgaXBvdmx5ICopaXApLT5paF9tYnVmLCAwLCBzaXplb2Yoc3RydWN0IG1idWZfcHRyKSk7CisJICAoKHN0cnVjdCBpcG92bHkgKilpcCktPmloX3gxID0gMDsKKwkgICgoc3RydWN0IGlwb3ZseSAqKWlwKS0+aWhfbGVuID0gdWgtPnVoX3VsZW47CisJICAvKiBrZWVwIHVoX3N1bSBmb3IgSUNNUCByZXBseQorCSAgICogdWgtPnVoX3N1bSA9IGNrc3VtKG0sIGxlbiArIHNpemVvZiAoc3RydWN0IGlwKSk7CisJICAgKiBpZiAodWgtPnVoX3N1bSkgeworCSAgICovCisJICBpZihja3N1bShtLCBsZW4gKyBzaXplb2Yoc3RydWN0IGlwKSkpIHsKKwkgICAgU1RBVCh1ZHBzdGF0LnVkcHNfYmFkc3VtKyspOworCSAgICBnb3RvIGJhZDsKKwkgIH0KKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIGhhbmRsZSBESENQL0JPT1RQCisgICAgICAgICAqLworICAgICAgICBpZiAocG9ydF9nZXRoKHVoLT51aF9kcG9ydCkgPT0gQk9PVFBfU0VSVkVSKSB7CisgICAgICAgICAgICBib290cF9pbnB1dChtKTsKKyAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNsaXJwX3Jlc3RyaWN0KQorICAgICAgICAgICAgZ290byBiYWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIGhhbmRsZSBURlRQCisgICAgICAgICAqLworICAgICAgICBpZiAocG9ydF9nZXRoKHVoLT51aF9kcG9ydCkgPT0gVEZUUF9TRVJWRVIpIHsKKyAgICAgICAgICAgIHRmdHBfaW5wdXQobSk7CisgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEROUyBsb2dnaW5nIGFuZCBGVyBydWxlcworICAgICAgICBpZiAobnRvaHModWgtPnVoX2Rwb3J0LnBvcnQpID09IDUzKSB7CisgICAgICAgICAgICBpZiAoIXNsaXJwX2R1bXBfZG5zKG0pKSB7CisgICAgICAgICAgICAgICAgREVCVUdfTUlTQygoZGZkLCJFcnJvciBsb2dnaW5nIEROUyBwYWNrZXQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkbnNfbnVtX2Nvbm5zKys7CisgICAgICAgICAgICBpZiAoc2xpcnBfZ2V0X21heF9kbnNfY29ubnMoKSAhPSAtMSAmJgorICAgICAgICAgICAgICAgIGRuc19udW1fY29ubnMgPiAodW5zaWduZWQpc2xpcnBfZ2V0X21heF9kbnNfY29ubnMoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgfQorCisKKwkvKgorCSAqIExvY2F0ZSBwY2IgZm9yIGRhdGFncmFtLgorCSAqLworCXNvID0gdWRwX2xhc3Rfc287CisJaWYgKHNvLT5zb19sYWRkcl9wb3J0ICE9IHBvcnRfZ2V0aCh1aC0+dWhfc3BvcnQpIHx8CisJICAgIHNvLT5zb19sYWRkcl9pcCAgICE9IGlwX2dldGgoaXAtPmlwX3NyYykpIHsKKwkJc3RydWN0IHNvY2tldCAqdG1wOworCisJCWZvciAodG1wID0gdWRiLnNvX25leHQ7IHRtcCAhPSAmdWRiOyB0bXAgPSB0bXAtPnNvX25leHQpIHsKKwkJCWlmICh0bXAtPnNvX2xhZGRyX3BvcnQgPT0gcG9ydF9nZXRoKHVoLT51aF9zcG9ydCkgJiYKKwkJCSAgICB0bXAtPnNvX2xhZGRyX2lwICAgPT0gaXBfZ2V0aChpcC0+aXBfc3JjKSkgeworCQkJCXRtcC0+c29fZmFkZHJfaXAgICA9IGlwX2dldGgoaXAtPmlwX2RzdCk7CisJCQkJdG1wLT5zb19mYWRkcl9wb3J0ID0gcG9ydF9nZXRoKHVoLT51aF9kcG9ydCk7CisJCQkJc28gPSB0bXA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKHRtcCA9PSAmdWRiKSB7CisJCSAgc28gPSBOVUxMOworCQl9IGVsc2UgeworCQkgIFNUQVQodWRwc3RhdC51ZHBwc19wY2JjYWNoZW1pc3MrKyk7CisJCSAgdWRwX2xhc3Rfc28gPSBzbzsKKwkJfQorCX0KKworCWlmIChzbyA9PSBOVUxMKSB7CisJICAvKgorCSAgICogSWYgdGhlcmUncyBubyBzb2NrZXQgZm9yIHRoaXMgcGFja2V0LAorCSAgICogY3JlYXRlIG9uZQorCSAgICovCisJICBpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkgZ290byBiYWQ7CisJICBpZih1ZHBfYXR0YWNoKHNvKSA9PSAtMSkgeworCSAgICBERUJVR19NSVNDKChkZmQsIiB1ZHBfYXR0YWNoIGVycm5vID0gJWQtJXNcbiIsCisJCQllcnJubyxlcnJub19zdHIpKTsKKwkgICAgc29mcmVlKHNvKTsKKwkgICAgZ290byBiYWQ7CisJICB9CisKKwkgIC8qCisJICAgKiBTZXR1cCBmaWVsZHMKKwkgICAqLworCSAgLyogdWRwX2xhc3Rfc28gPSBzbzsgKi8KKwkgIHNvLT5zb19sYWRkcl9pcCAgID0gaXBfZ2V0aChpcC0+aXBfc3JjKTsKKwkgIHNvLT5zb19sYWRkcl9wb3J0ID0gcG9ydF9nZXRoKHVoLT51aF9zcG9ydCk7CisKKwkgIGlmICgoc28tPnNvX2lwdG9zID0gdWRwX3RvcyhzbykpID09IDApCisJICAgIHNvLT5zb19pcHRvcyA9IGlwLT5pcF90b3M7CisKKwkgIC8qCisJICAgKiBYWFhYWCBIZXJlLCBjaGVjayBpZiBpdCdzIGluIHVkcGV4ZWNfbGlzdCwKKwkgICAqIGFuZCBpZiBpdCBpcywgZG8gdGhlIGZvcmtfZXhlYygpIGV0Yy4KKwkgICAqLworCX0KKworICAgICAgICBzby0+c29fZmFkZHJfaXAgICA9IGlwX2dldGgoaXAtPmlwX2RzdCk7IC8qIFhYWCAqLworICAgICAgICBzby0+c29fZmFkZHJfcG9ydCA9IHBvcnRfZ2V0aCh1aC0+dWhfZHBvcnQpOyAvKiBYWFggKi8KKworCWlwaGxlbiArPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJbS0+bV9sZW4gLT0gaXBobGVuOworCW0tPm1fZGF0YSArPSBpcGhsZW47CisKKwkvKgorCSAqIE5vdyB3ZSBzZW5kdG8oKSB0aGUgcGFja2V0LgorCSAqLworCWlmIChzby0+c29fZW11KQorCSAgIHVkcF9lbXUoc28sIG0pOworCisJaWYoc29zZW5kdG8oc28sbSkgPT0gLTEpIHsKKwkgIG0tPm1fbGVuICs9IGlwaGxlbjsKKwkgIG0tPm1fZGF0YSAtPSBpcGhsZW47CisJICAqaXA9c2F2ZV9pcDsKKwkgIERFQlVHX01JU0MoKGRmZCwidWRwIHR4IGVycm5vID0gJWQtJXNcbiIsZXJybm8sIGVycm5vX3N0cikpOworCSAgaWNtcF9lcnJvcihtLCBJQ01QX1VOUkVBQ0gsSUNNUF9VTlJFQUNIX05FVCwgMCxlcnJub19zdHIpOworCX0KKworCW1fZnJlZShzby0+c29fbSk7ICAgLyogdXNlZCBmb3IgSUNNUCBpZiBlcnJvciBvbiBzb3JlY3Zmcm9tICovCisKKwkvKiByZXN0b3JlIHRoZSBvcmlnIG1idWYgcGFja2V0ICovCisJbS0+bV9sZW4gKz0gaXBobGVuOworCW0tPm1fZGF0YSAtPSBpcGhsZW47CisJKmlwPXNhdmVfaXA7CisJc28tPnNvX209bTsgICAgICAgICAvKiBJQ01QIGJhY2t1cCAqLworCisJcmV0dXJuOworYmFkOgorCW1fZnJlZW0obSk7CisJLyogaWYgKG9wdHMpIG1fZnJlZW0ob3B0cyk7ICovCisJcmV0dXJuOworfQorCitpbnQgdWRwX291dHB1dDJfKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSwKKyAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MqICBzYWRkciwKKyAgICAgICAgICAgICAgICAgY29uc3QgU29ja0FkZHJlc3MqICBkYWRkciwKKyAgICAgICAgICAgICAgICAgaW50IGlwdG9zKQoreworICAgIHJlZ2lzdGVyIHN0cnVjdCB1ZHBpcGhkciAqdWk7CisgICAgdWludDMyX3QgIHNhZGRyX2lwID0gc29ja19hZGRyZXNzX2dldF9pcChzYWRkcik7CisgICAgdWludDMyX3QgIGRhZGRyX2lwID0gc29ja19hZGRyZXNzX2dldF9pcChkYWRkcik7CisgICAgaW50ICAgICAgIHNhZGRyX3BvcnQgPSBzb2NrX2FkZHJlc3NfZ2V0X3BvcnQoc2FkZHIpOworICAgIGludCAgICAgICBkYWRkcl9wb3J0ID0gc29ja19hZGRyZXNzX2dldF9wb3J0KGRhZGRyKTsKKyAgICBpbnQgZXJyb3IgPSAwOworCisgICAgREVCVUdfQ0FMTCgidWRwX291dHB1dCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisgICAgREVCVUdfQVJHKCJzYWRkciA9ICVseCIsIChsb25nKSBzYWRkcl9pcCk7CisgICAgREVCVUdfQVJHKCJkYWRkciA9ICVseCIsIChsb25nKSBkYWRkcl9pcCk7CisKKwkvKgorCSAqIEFkanVzdCBmb3IgaGVhZGVyCisJICovCisJbS0+bV9kYXRhIC09IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworCW0tPm1fbGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworCisJLyoKKwkgKiBGaWxsIGluIG1idWYgd2l0aCBleHRlbmRlZCBVRFAgaGVhZGVyCisJICogYW5kIGFkZHJlc3NlcyBhbmQgbGVuZ3RoIHB1dCBpbnRvIG5ldHdvcmsgZm9ybWF0LgorCSAqLworCXVpID0gbXRvZChtLCBzdHJ1Y3QgdWRwaXBoZHIgKik7CisgICAgbWVtc2V0KCZ1aS0+dWlfaS5paF9tYnVmLCAwICwgc2l6ZW9mKHN0cnVjdCBtYnVmX3B0cikpOworCXVpLT51aV94MSA9IDA7CisJdWktPnVpX3ByID0gSVBQUk9UT19VRFA7CisJdWktPnVpX2xlbiA9IGh0b25zKG0tPm1fbGVuIC0gc2l6ZW9mKHN0cnVjdCBpcCkpOyAvKiArIHNpemVvZiAoc3RydWN0IHVkcGhkcikpOyAqLworCS8qIFhYWFhYIENoZWNrIGZvciBmcm9tLW9uZS1sb2NhdGlvbiBzb2NrZXRzLCBvciBmcm9tLWFueS1sb2NhdGlvbiBzb2NrZXRzICovCisgICAgdWktPnVpX3NyYyAgID0gaXBfc2V0aChzYWRkcl9pcCk7CisgICAgdWktPnVpX2RzdCAgID0gaXBfc2V0aChkYWRkcl9pcCk7CisgICAgdWktPnVpX3Nwb3J0ID0gcG9ydF9zZXRoKHNhZGRyX3BvcnQpOworICAgIHVpLT51aV9kcG9ydCA9IHBvcnRfc2V0aChkYWRkcl9wb3J0KTsKKwl1aS0+dWlfdWxlbiA9IHVpLT51aV9sZW47CisKKwkvKgorCSAqIFN0dWZmIGNoZWNrc3VtIGFuZCBvdXRwdXQgZGF0YWdyYW0uCisJICovCisJdWktPnVpX3N1bSA9IDA7CisJaWYgKFVEUENLU1VNKSB7CisJICAgIGlmICgodWktPnVpX3N1bSA9IGNrc3VtKG0sIC8qIHNpemVvZiAoc3RydWN0IHVkcGlwaGRyKSArICovIG0tPm1fbGVuKSkgPT0gMCkKKwkJdWktPnVpX3N1bSA9IDB4ZmZmZjsKKwl9CisJKChzdHJ1Y3QgaXAgKil1aSktPmlwX2xlbiA9IG0tPm1fbGVuOworCisJKChzdHJ1Y3QgaXAgKil1aSktPmlwX3R0bCA9IElQREVGVFRMOworCSgoc3RydWN0IGlwICopdWkpLT5pcF90b3MgPSBpcHRvczsKKworCVNUQVQodWRwc3RhdC51ZHBzX29wYWNrZXRzKyspOworCisJLy8gIEROUyBsb2dnaW5nCisJaWYgKHNvICE9IE5VTEwgJiYgc28tPnNvX2ZhZGRyX3BvcnQgPT0gNTMpIHsgIC8qc28gaGFzIGhvc3QgYnl0ZSBvcmRlciAqLworCSAgaWYgKCFzbGlycF9kdW1wX2RucyhtKSkgeworCSAgICBERUJVR19NSVNDKChkZmQsIkVycm9yIGxvZ2dpbmcgRE5TIHBhY2tldCIpKTsKKwkgIH0KKwl9CisKKwllcnJvciA9IGlwX291dHB1dChzbywgbSk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworaW50IHVkcF9vdXRwdXRfKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSwKKyAgICAgICAgICAgICAgIFNvY2tBZGRyZXNzKiBmcm9tKQoreworICAgIFNvY2tBZGRyZXNzICBzYWRkciwgZGFkZHI7CisgICAgdWludDMyX3QgICAgIHNhZGRyX2lwOworICAgIHVpbnQxNl90ICAgICBzYWRkcl9wb3J0OworCisgICAgc2FkZHJfaXAgICA9IHNvY2tfYWRkcmVzc19nZXRfaXAoZnJvbSk7CisgICAgc2FkZHJfcG9ydCA9IHNvY2tfYWRkcmVzc19nZXRfcG9ydChmcm9tKTsKKworICAgIGlmICgoc28tPnNvX2ZhZGRyX2lwICYgMHhmZmZmZmYwMCkgPT0gc3BlY2lhbF9hZGRyX2lwKSB7CisgICAgICAgIHNhZGRyX2lwID0gc28tPnNvX2ZhZGRyX2lwOworICAgICAgICBpZiAoKHNvLT5zb19mYWRkcl9pcCAmIDB4MDAwMDAwZmYpID09IDB4ZmYpCisgICAgICAgICAgICBzYWRkcl9pcCA9IGFsaWFzX2FkZHJfaXA7CisgICAgfQorCisgICAgc29ja19hZGRyZXNzX2luaXRfaW5ldCggJnNhZGRyLCBzYWRkcl9pcCwgc2FkZHJfcG9ydCApOworICAgIHNvY2tfYWRkcmVzc19pbml0X2luZXQoICZkYWRkciwgc28tPnNvX2xhZGRyX2lwLCBzby0+c29fbGFkZHJfcG9ydCApOworCisgICAgcmV0dXJuIHVkcF9vdXRwdXQyXyhzbywgbSwgJnNhZGRyLCAmZGFkZHIsIHNvLT5zb19pcHRvcyk7Cit9CisKK2ludAordWRwX2F0dGFjaChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKyAgc28tPnMgPSBzb2NrZXRfYW55YWRkcl9zZXJ2ZXIoIDAsIFNPQ0tFVF9ER1JBTSApOworICBpZiAoc28tPnMgIT0gLTEpIHsKKyAgICAgIC8qIHN1Y2Nlc3MsIGluc2VydCBpbiBxdWV1ZSAqLworICAgICAgc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisgICAgICBpbnNxdWUoc28sJnVkYik7CisgIH0KKyAgcmV0dXJuKHNvLT5zKTsKK30KKwordm9pZAordWRwX2RldGFjaChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlzb2NrZXRfY2xvc2Uoc28tPnMpOworCS8qIGlmIChzby0+c29fbSkgbV9mcmVlKHNvLT5zb19tKTsgICAgZG9uZSBieSBzb2ZyZWUgKi8KKworCXNvZnJlZShzbyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9zX3QgdWRwdG9zW10gPSB7CisJezAsIDUzLCBJUFRPU19MT1dERUxBWSwgMH0sCQkJLyogRE5TICovCisJezUxNywgNTE3LCBJUFRPU19MT1dERUxBWSwgRU1VX1RBTEt9LAkvKiB0YWxrICovCisJezUxOCwgNTE4LCBJUFRPU19MT1dERUxBWSwgRU1VX05UQUxLfSwJLyogbnRhbGsgKi8KKwl7MCwgNzY0OCwgSVBUT1NfTE9XREVMQVksIEVNVV9DVVNFRU1FfSwJLyogQ3UtU2VlbWUgKi8KKwl7MCwgMCwgMCwgMH0KK307CisKK3N0YXRpYyB1X2ludDhfdAordWRwX3RvcyhzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSh1ZHB0b3NbaV0udG9zKSB7CisJCWlmICgodWRwdG9zW2ldLmZwb3J0ICYmIHNvLT5zb19mYWRkcl9wb3J0ID09IHVkcHRvc1tpXS5mcG9ydCkgfHwKKwkJICAgICh1ZHB0b3NbaV0ubHBvcnQgJiYgc28tPnNvX2xhZGRyX3BvcnQgPT0gdWRwdG9zW2ldLmxwb3J0KSkgeworCQkgICAgCXNvLT5zb19lbXUgPSB1ZHB0b3NbaV0uZW11OworCQkJcmV0dXJuIHVkcHRvc1tpXS50b3M7CisJCX0KKwkJaSsrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBIZXJlLCB0YWxrL3l0YWxrL250YWxrIHJlcXVlc3RzIG11c3QgYmUgZW11bGF0ZWQKKyAqLworc3RhdGljIHZvaWQKK3VkcF9lbXUoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworICAgICAgICBTb2NrQWRkcmVzcyAgc29ja2FkZHI7CisKK3N0cnVjdCBjdV9oZWFkZXIgeworCXVpbnQxNl90CWRfZmFtaWx5OwkJLy8gZGVzdGluYXRpb24gZmFtaWx5CisJdWludDE2X3QJZF9wb3J0OwkJCS8vIGRlc3RpbmF0aW9uIHBvcnQKKwl1aW50MzJfdAlkX2FkZHI7CQkJLy8gZGVzdGluYXRpb24gYWRkcmVzcworCXVpbnQxNl90CXNfZmFtaWx5OwkJLy8gc291cmNlIGZhbWlseQorCXVpbnQxNl90CXNfcG9ydDsJCQkvLyBzb3VyY2UgcG9ydAorCXVpbnQzMl90CXNvX2FkZHI7CQkvLyBzb3VyY2UgYWRkcmVzcworCXVpbnQzMl90CXNlcW47CQkJLy8gc2VxdWVuY2UgbnVtYmVyCisJdWludDE2X3QJbWVzc2FnZTsJCS8vIG1lc3NhZ2UKKwl1aW50MTZfdAlkYXRhX3R5cGU7CQkvLyBkYXRhIHR5cGUKKwl1aW50MTZfdAlwa3RfbGVuOwkJLy8gcGFja2V0IGxlbmd0aAorfSAqY3VfaGVhZDsKKworCXN3aXRjaChzby0+c29fZW11KSB7CisKKwljYXNlIEVNVV9DVVNFRU1FOgorCisJCS8qCisJCSAqIEN1LVNlZU1lIGVtdWxhdGlvbi4KKwkJICogSG9wZWZ1bGx5IHRoZSBwYWNrZXQgaXMgbW9yZSB0aGF0IDE2IGJ5dGVzIGxvbmcuIFdlIGRvbid0CisJCSAqIGRvIGFueSBvdGhlciB0ZXN0cywganVzdCByZXBsYWNlIHRoZSBhZGRyZXNzIGFuZCBwb3J0CisJCSAqIGZpZWxkcy4KKwkJICovCisJCWlmIChtLT5tX2xlbiA+PSAoaW50KXNpemVvZiAoKmN1X2hlYWQpKSB7CisJCQlpZiAoc29ja2V0X2dldF9hZGRyZXNzKHNvLT5zLCAmc29ja2FkZHIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKwkJCWN1X2hlYWQgPSBtdG9kKG0sIHN0cnVjdCBjdV9oZWFkZXIgKik7CisJCQljdV9oZWFkLT5zX3BvcnQgID0gaHRvbnMoIHNvY2tfYWRkcmVzc19nZXRfcG9ydCgmc29ja2FkZHIpKTsKKwkJCWN1X2hlYWQtPnNvX2FkZHIgPSBodG9ubCggc29ja19hZGRyZXNzX2dldF9pcCgmc29ja2FkZHIpKTsKKwkJfQorCisJCXJldHVybjsKKwl9Cit9CisKK3N0cnVjdCBzb2NrZXQgKgordWRwX2xpc3Rlbih1X2ludCBwb3J0LCB1X2ludDMyX3QgbGFkZHIsIHVfaW50IGxwb3J0LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2tldCAqc287CisJU29ja0FkZHJlc3MgICAgYWRkcjsKKwl1aW50MzJfdCAgICAgICBhZGRyX2lwOworCisJaWYgKChzbyA9IHNvY3JlYXRlKCkpID09IE5VTEwpIHsKKwkJZnJlZShzbyk7CisJCXJldHVybiBOVUxMOworCX0KKwlzby0+cyA9IHNvY2tldF9hbnlhZGRyX3NlcnZlciggcG9ydCwgU09DS0VUX0RHUkFNICk7CisJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisgICAgc28tPnNvX2hhZGRyX3BvcnQgPSBwb3J0OworCWluc3F1ZShzbywmdWRiKTsKKworCWlmIChzby0+cyA8IDApIHsKKwkJdWRwX2RldGFjaChzbyk7CisJCXJldHVybiBOVUxMOworCX0KKworICAgICAgICBzb2NrZXRfZ2V0X2FkZHJlc3Moc28tPnMsICZhZGRyKTsKKworCXNvLT5zb19mYWRkcl9wb3J0ID0gc29ja19hZGRyZXNzX2dldF9wb3J0KCZhZGRyKTsKKwlhZGRyX2lwID0gc29ja19hZGRyZXNzX2dldF9pcCgmYWRkcik7CisKKwlpZiAoYWRkcl9pcCA9PSAwIHx8IGFkZHJfaXAgPT0gbG9vcGJhY2tfYWRkcl9pcCkKKwkgICBzby0+c29fZmFkZHJfaXAgPSBhbGlhc19hZGRyX2lwOworCWVsc2UKKwkgICBzby0+c29fZmFkZHJfaXAgPSBhZGRyX2lwOworCisJc28tPnNvX2xhZGRyX3BvcnQgPSBscG9ydDsKKwlzby0+c29fbGFkZHJfaXAgICA9IGxhZGRyOworCWlmIChmbGFncyAhPSBTU19GQUNDRVBUT05DRSkKKwkgICBzby0+c29fZXhwaXJlID0gMDsKKworCXNvLT5zb19zdGF0ZSA9IFNTX0lTRkNPTk5FQ1RFRDsKKworCXJldHVybiBzbzsKK30KKworaW50IHVkcF91bmxpc3RlbiAodV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gc2xpcnBfdW5yZWRpcigxLCBwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC91ZHAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAtYW5kcm9pZC91ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI0MTgxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC1hbmRyb2lkL3VkcC5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXVkcC5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqIHVkcC5oLHYgMS4zIDE5OTQvMDgvMjEgMDU6Mjc6NDEgcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9VRFBfSF8KKyNkZWZpbmUgX1VEUF9IXworCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNkZWZpbmUgVURQX1RUTCAweDYwCisjZGVmaW5lIFVEUF9VRFBEQVRBTEVOIDE2MTkyCisKK2V4dGVybiBzdHJ1Y3Qgc29ja2V0ICp1ZHBfbGFzdF9zbzsKKworLyoKKyAqIFVkcCBwcm90b2NvbCBoZWFkZXIuCisgKiBQZXIgUkZDIDc2OCwgU2VwdGVtYmVyLCAxOTgxLgorICovCitzdHJ1Y3QgdWRwaGRyIHsKKwlwb3J0X3QJdWhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworCXBvcnRfdAl1aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwlpbnQxNl90CXVoX3VsZW47CQkvKiB1ZHAgbGVuZ3RoICovCisJdV9pbnQxNl90CXVoX3N1bTsJCQkvKiB1ZHAgY2hlY2tzdW0gKi8KK307CisKKy8qCisgKiBVRFAga2VybmVsIHN0cnVjdHVyZXMgYW5kIHZhcmlhYmxlcy4KKyAqLworc3RydWN0IHVkcGlwaGRyIHsKKwkgICAgICAgIHN0cnVjdCAgaXBvdmx5IHVpX2k7ICAgICAgICAgICAgLyogb3ZlcmxhaWQgaXAgc3RydWN0dXJlICovCisJICAgICAgICBzdHJ1Y3QgIHVkcGhkciB1aV91OyAgICAgICAgICAgIC8qIHVkcCBoZWFkZXIgKi8KK307CisjZGVmaW5lIHVpX21idWYgICAgICAgICB1aV9pLmloX21idWYubXB0cgorI2RlZmluZSB1aV94MSAgICAgICAgICAgdWlfaS5paF94MQorI2RlZmluZSB1aV9wciAgICAgICAgICAgdWlfaS5paF9wcgorI2RlZmluZSB1aV9sZW4gICAgICAgICAgdWlfaS5paF9sZW4KKyNkZWZpbmUgdWlfc3JjICAgICAgICAgIHVpX2kuaWhfc3JjCisjZGVmaW5lIHVpX2RzdCAgICAgICAgICB1aV9pLmloX2RzdAorI2RlZmluZSB1aV9zcG9ydCAgICAgICAgdWlfdS51aF9zcG9ydAorI2RlZmluZSB1aV9kcG9ydCAgICAgICAgdWlfdS51aF9kcG9ydAorI2RlZmluZSB1aV91bGVuICAgICAgICAgdWlfdS51aF91bGVuCisjZGVmaW5lIHVpX3N1bSAgICAgICAgICB1aV91LnVoX3N1bQorCitzdHJ1Y3QgdWRwc3RhdCB7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBzdGF0aXN0aWNzOiAqLworCSAgICAgICAgdV9sb25nICB1ZHBzX2lwYWNrZXRzOyAgICAgICAgICAvKiB0b3RhbCBpbnB1dCBwYWNrZXRzICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfaGRyb3BzOyAgICAgICAgICAgIC8qIHBhY2tldCBzaG9ydGVyIHRoYW4gaGVhZGVyICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfYmFkc3VtOyAgICAgICAgICAgIC8qIGNoZWNrc3VtIGVycm9yICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfYmFkbGVuOyAgICAgICAgICAgIC8qIGRhdGEgbGVuZ3RoIGxhcmdlciB0aGFuIHBhY2tldCAqLworCSAgICAgICAgdV9sb25nICB1ZHBzX25vcG9ydDsgICAgICAgICAgICAvKiBubyBzb2NrZXQgb24gcG9ydCAqLworCSAgICAgICAgdV9sb25nICB1ZHBzX25vcG9ydGJjYXN0OyAgICAgICAvKiBvZiBhYm92ZSwgYXJyaXZlZCBhcyBicm9hZGNhc3QgKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwc19mdWxsc29jazsgICAgICAgICAgLyogbm90IGRlbGl2ZXJlZCwgaW5wdXQgc29ja2V0IGZ1bGwgKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwcHNfcGNiY2FjaGVtaXNzOyAgICAgLyogaW5wdXQgcGFja2V0cyBtaXNzaW5nIHBjYiBjYWNoZSAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0cHV0IHN0YXRpc3RpY3M6ICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfb3BhY2tldHM7ICAgICAgICAgIC8qIHRvdGFsIG91dHB1dCBwYWNrZXRzICovCit9OworCisvKgorICogTmFtZXMgZm9yIFVEUCBzeXNjdGwgb2JqZWN0cworICovCisjZGVmaW5lIFVEUENUTF9DSEVDS1NVTSAgICAgICAgIDEgICAgICAgLyogY2hlY2tzdW0gVURQIHBhY2tldHMgKi8KKyNkZWZpbmUgVURQQ1RMX01BWElEICAgICAgICAgICAgMgorCitleHRlcm4gc3RydWN0IHVkcHN0YXQgdWRwc3RhdDsKKworZXh0ZXJuIHN0cnVjdCBzb2NrZXQgdWRiOworc3RydWN0IG1idWY7CisKK3ZvaWQgdWRwX2luaXQgX1AoKHZvaWQpKTsKK3ZvaWQgdWRwX2lucHV0IF9QKChyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqLCBpbnQpKTsKK2ludCB1ZHBfb3V0cHV0XyBfUCgoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbWJ1ZiAqLCBTb2NrQWRkcmVzcyAqKSk7CitpbnQgdWRwX2F0dGFjaCBfUCgoc3RydWN0IHNvY2tldCAqKSk7Cit2b2lkIHVkcF9kZXRhY2ggX1AoKHN0cnVjdCBzb2NrZXQgKikpOworc3RydWN0IHNvY2tldCAqIHVkcF9saXN0ZW4gX1AoKHVfaW50LCB1X2ludDMyX3QsIHVfaW50LCBpbnQpKTsKK2ludCB1ZHBfdW5saXN0ZW4gX1AoKHVfaW50KSk7CisKK2ludCB1ZHBfb3V0cHV0Ml8oc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptLAorICAgICAgICAgICAgICAgIGNvbnN0IFNvY2tBZGRyZXNzICpzYWRkciwgY29uc3QgU29ja0FkZHJlc3MgKmRhZGRyLAorICAgICAgICAgICAgICAgIGludCBpcHRvcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvQ09QWVJJR0hUIGIvYW5kcm9pZC9xZW11MS9zbGlycC9DT1BZUklHSFQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjODNkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvQ09QWVJJR0hUCkBAIC0wLDAgKzEsNjEgQEAKK1NsaXJwIHdhcyB3cml0dGVuIGJ5IERhbm55IEdhc3Bhcm92c2tpLgorQ29weXJpZ2h0IChjKSwgMTk5NSwxOTk2IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK1NsaXJwIGlzIG1haW50YWluZWQgYnkgS2VsbHkgUHJpY2UgPHR5Z3JpcytzbGlycEBlcm9scy5jb20+CisKK1NsaXJwIGlzIGZyZWUgc29mdHdhcmU7ICJmcmVlIiBhcyBpbiB5b3UgZG9uJ3QgaGF2ZSB0byBwYXkgZm9yIGl0LCBhbmQgeW91CithcmUgZnJlZSB0byBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIGl0LiAgSSBkbyBub3QgYWNjZXB0IGFueSBkb25hdGlvbnMsCittb25ldGFyeSBvciBvdGhlcndpc2UsIGZvciBTbGlycC4gIEluc3RlYWQsIEkgd291bGQgYXNrIHlvdSB0byBwYXNzIHRoaXMKK3BvdGVudGlhbCBkb25hdGlvbiB0byB5b3VyIGZhdm9yaXRlIGNoYXJpdHkuICBJbiBmYWN0LCBJIGVuY291cmFnZQorKmV2ZXJ5b25lKiB3aG8gZmluZHMgU2xpcnAgdXNlZnVsIHRvIG1ha2UgYSBzbWFsbCBkb25hdGlvbiB0byB0aGVpcgorZmF2b3JpdGUgY2hhcml0eSAoZm9yIGV4YW1wbGUsIEdyZWVuUGVhY2UpLiAgVGhpcyBpcyBub3QgYSByZXF1aXJlbWVudCwgYnV0CithIHN1Z2dlc3Rpb24gZnJvbSBzb21lb25lIHdobyBoaWdobHkgdmFsdWVzIHRoZSBzZXJ2aWNlIHRoZXkgcHJvdmlkZS4KKworVGhlIGNvcHlyaWdodCB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKworLS0tQkVHSU4tLS0KKworIENvcHlyaWdodCAoYykgMTk5NSwxOTk2IERhbm55IEdhc3Bhcm92c2tpLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIGFyZSBtZXQ6CisgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwKKyBEQU5OWSBHQVNQQVJPVlNLSSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy0tLUVORC0tLQorCitUaGlzIGJhc2ljYWxseSBtZWFucyB5b3UgY2FuIGRvIGFueXRoaW5nIHlvdSB3YW50IHdpdGggdGhlIHNvZnR3YXJlLCBleGNlcHQKKzEpIGNhbGwgaXQgeW91ciBvd24sIGFuZCAyKSBjbGFpbSB3YXJyYW50eSBvbiBpdC4gIFRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvcgordGhpcyBzb2Z0d2FyZS4gIE5vbmUuICBOYWRhLiAgSWYgeW91IGxvc2UgYSBtaWxsaW9uIGRvbGxhcnMgd2hpbGUgdXNpbmcKK1NsaXJwLCB0aGF0J3MgeW91ciBsb3NzIG5vdCBtaW5lLiAgU28sICoqKlVTRSBBVCBZT1VSIE9XTiBSSVNLISoqKi4KKworSWYgdGhlc2UgY29uZGl0aW9ucyBjYW5ub3QgYmUgbWV0IGR1ZSB0byBsZWdhbCByZXN0cmljdGlvbnMgKEUuZy4gd2hlcmUgaXQKK2lzIGFnYWluc3QgdGhlIGxhdyB0byBnaXZlIG91dCBTb2Z0d2FyZSB3aXRob3V0IHdhcnJhbnR5KSwgeW91IG11c3QgY2Vhc2UKK3VzaW5nIHRoZSBzb2Z0d2FyZSBhbmQgZGVsZXRlIGFsbCBjb3BpZXMgeW91IGhhdmUuCisKK1NsaXJwIHVzZXMgY29kZSB0aGF0IGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBmb2xsb3dpbmcgcGVvcGxlL29yZ2FuaXphdGlvbnM6CisKK0p1aGEgUGlya29sYS4KK0dyZWdvcnkgTS4gQ2hyaXN0eS4KK1RoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCitDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eS4KK1RoZSBBdXN0cmFsaWFuIE5hdGlvbmFsIFVuaXZlcnNpdHkuCitSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorCitQbGVhc2UgcmVhZCB0aGUgdG9wIG9mIGVhY2ggc291cmNlIGZpbGUgZm9yIHRoZSBkZXRhaWxzIG9uIHRoZSB2YXJpb3VzCitjb3B5cmlnaHRzLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9ib290cC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9ib290cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDA4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2Jvb3RwLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBRRU1VIEJPT1RQL0RIQ1Agc2VydmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgPHNsaXJwLmg+CisKKy8qIFhYWDogb25seSBESENQIGlzIHN1cHBvcnRlZCAqLworCisjZGVmaW5lIE5CX0FERFIgMTYKKworI2RlZmluZSBTVEFSVF9BRERSIDE1CisKKyNkZWZpbmUgTEVBU0VfVElNRSAoMjQgKiAzNjAwKQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBhbGxvY2F0ZWQ7CisgICAgdWludDhfdCBtYWNhZGRyWzZdOworfSBCT09UUENsaWVudDsKKworc3RhdGljIEJPT1RQQ2xpZW50IGJvb3RwX2NsaWVudHNbTkJfQUREUl07CisKK2NvbnN0IGNoYXIgKmJvb3RwX2ZpbGVuYW1lOworCitzdGF0aWMgY29uc3QgdWludDhfdCByZmMxNTMzX2Nvb2tpZVtdID0geyBSRkMxNTMzX0NPT0tJRSB9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50ZihmbXQsIC4uLikgXAoraWYgKHNsaXJwX2RlYnVnICYgREJHX0NBTEwpIHsgZnByaW50ZihkZmQsIGZtdCwgIyMgIF9fVkFfQVJHU19fKTsgZmZsdXNoKGRmZCk7IH0KKyNlbHNlCisjZGVmaW5lIGRwcmludGYoZm10LCAuLi4pCisjZW5kaWYKKworc3RhdGljIEJPT1RQQ2xpZW50ICpnZXRfbmV3X2FkZHIoc3RydWN0IGluX2FkZHIgKnBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFjYWRkcikKK3sKKyAgICBCT09UUENsaWVudCAqYmM7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBOQl9BRERSOyBpKyspIHsKKyAgICAgICAgYmMgPSAmYm9vdHBfY2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFiYy0+YWxsb2NhdGVkIHx8ICFtZW1jbXAobWFjYWRkciwgYmMtPm1hY2FkZHIsIDYpKQorICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgZm91bmQ6CisgICAgYmMgPSAmYm9vdHBfY2xpZW50c1tpXTsKKyAgICBiYy0+YWxsb2NhdGVkID0gMTsKKyAgICBwYWRkci0+c19hZGRyID0gaHRvbmwobnRvaGwoc3BlY2lhbF9hZGRyLnNfYWRkcikgfCAoaSArIFNUQVJUX0FERFIpKTsKKyAgICByZXR1cm4gYmM7Cit9CisKK3N0YXRpYyBCT09UUENsaWVudCAqcmVxdWVzdF9hZGRyKGNvbnN0IHN0cnVjdCBpbl9hZGRyICpwYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1hY2FkZHIpCit7CisgICAgdWludDMyX3QgcmVxX2FkZHIgPSBudG9obChwYWRkci0+c19hZGRyKTsKKyAgICB1aW50MzJfdCBzcGVjX2FkZHIgPSBudG9obChzcGVjaWFsX2FkZHIuc19hZGRyKTsKKyAgICBCT09UUENsaWVudCAqYmM7CisKKyAgICBpZiAocmVxX2FkZHIgPj0gKHNwZWNfYWRkciB8IFNUQVJUX0FERFIpICYmCisgICAgICAgIHJlcV9hZGRyIDwgKHNwZWNfYWRkciB8IChOQl9BRERSICsgU1RBUlRfQUREUikpKSB7CisgICAgICAgIGJjID0gJmJvb3RwX2NsaWVudHNbKHJlcV9hZGRyICYgMHhmZikgLSBTVEFSVF9BRERSXTsKKyAgICAgICAgaWYgKCFiYy0+YWxsb2NhdGVkIHx8ICFtZW1jbXAobWFjYWRkciwgYmMtPm1hY2FkZHIsIDYpKSB7CisgICAgICAgICAgICBiYy0+YWxsb2NhdGVkID0gMTsKKyAgICAgICAgICAgIHJldHVybiBiYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEJPT1RQQ2xpZW50ICpmaW5kX2FkZHIoc3RydWN0IGluX2FkZHIgKnBhZGRyLCBjb25zdCB1aW50OF90ICptYWNhZGRyKQoreworICAgIEJPT1RQQ2xpZW50ICpiYzsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IE5CX0FERFI7IGkrKykgeworICAgICAgICBpZiAoIW1lbWNtcChtYWNhZGRyLCBib290cF9jbGllbnRzW2ldLm1hY2FkZHIsIDYpKQorICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgZm91bmQ6CisgICAgYmMgPSAmYm9vdHBfY2xpZW50c1tpXTsKKyAgICBiYy0+YWxsb2NhdGVkID0gMTsKKyAgICBwYWRkci0+c19hZGRyID0gaHRvbmwobnRvaGwoc3BlY2lhbF9hZGRyLnNfYWRkcikgfCAoaSArIFNUQVJUX0FERFIpKTsKKyAgICByZXR1cm4gYmM7Cit9CisKK3N0YXRpYyB2b2lkIGRoY3BfZGVjb2RlKGNvbnN0IHN0cnVjdCBib290cF90ICpicCwgaW50ICpwbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqKnByZXFfYWRkcikKK3sKKyAgICBjb25zdCB1aW50OF90ICpwLCAqcF9lbmQ7CisgICAgaW50IGxlbiwgdGFnOworCisgICAgKnBtc2dfdHlwZSA9IDA7CisgICAgKnByZXFfYWRkciA9IE5VTEw7CisKKyAgICBwID0gYnAtPmJwX3ZlbmQ7CisgICAgcF9lbmQgPSBwICsgREhDUF9PUFRfTEVOOworICAgIGlmIChtZW1jbXAocCwgcmZjMTUzM19jb29raWUsIDQpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBwICs9IDQ7CisgICAgd2hpbGUgKHAgPCBwX2VuZCkgeworICAgICAgICB0YWcgPSBwWzBdOworICAgICAgICBpZiAodGFnID09IFJGQzE1MzNfUEFEKSB7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IFJGQzE1MzNfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGlmIChwID49IHBfZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGVuID0gKnArKzsKKyAgICAgICAgICAgIGRwcmludGYoImRoY3A6IHRhZz0lZCBsZW49JWRcbiIsIHRhZywgbGVuKTsKKworICAgICAgICAgICAgc3dpdGNoKHRhZykgeworICAgICAgICAgICAgY2FzZSBSRkMyMTMyX01TR19UWVBFOgorICAgICAgICAgICAgICAgIGlmIChsZW4gPj0gMSkKKyAgICAgICAgICAgICAgICAgICAgKnBtc2dfdHlwZSA9IHBbMF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJGQzIxMzJfUkVRX0FERFI6CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSA0KQorICAgICAgICAgICAgICAgICAgICAqcHJlcV9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwICs9IGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKnBtc2dfdHlwZSA9PSBESENQUkVRVUVTVCAmJiAhKnByZXFfYWRkciAmJiBicC0+YnBfY2lhZGRyLnNfYWRkcikgeworICAgICAgICAqcHJlcV9hZGRyID0gJmJwLT5icF9jaWFkZHI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBib290cF9yZXBseShjb25zdCBzdHJ1Y3QgYm9vdHBfdCAqYnApCit7CisgICAgQk9PVFBDbGllbnQgKmJjID0gTlVMTDsKKyAgICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgICBzdHJ1Y3QgYm9vdHBfdCAqcmJwOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkciwgZGFkZHI7CisgICAgc3RydWN0IGluX2FkZHIgZG5zX2FkZHI7CisgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKnByZXFfYWRkcjsKKyAgICBpbnQgZGhjcF9tc2dfdHlwZSwgdmFsOworICAgIHVpbnQ4X3QgKnE7CisKKyAgICAvKiBleHRyYWN0IGV4YWN0IERIQ1AgbXNnIHR5cGUgKi8KKyAgICBkaGNwX2RlY29kZShicCwgJmRoY3BfbXNnX3R5cGUsICZwcmVxX2FkZHIpOworICAgIGRwcmludGYoImJvb3RwIHBhY2tldCBvcD0lZCBtc2d0eXBlPSVkIiwgYnAtPmJwX29wLCBkaGNwX21zZ190eXBlKTsKKyAgICBpZiAocHJlcV9hZGRyKQorICAgICAgICBkcHJpbnRmKCIgcmVxX2FkZHI9JTA4eFxuIiwgbnRvaGwocHJlcV9hZGRyLT5zX2FkZHIpKTsKKyAgICBlbHNlCisgICAgICAgIGRwcmludGYoIlxuIik7CisKKyAgICBpZiAoZGhjcF9tc2dfdHlwZSA9PSAwKQorICAgICAgICBkaGNwX21zZ190eXBlID0gREhDUFJFUVVFU1Q7IC8qIEZvcmNlIHJlcGx5IGZvciBvbGQgQk9PVFAgY2xpZW50cyAqLworCisgICAgaWYgKGRoY3BfbXNnX3R5cGUgIT0gREhDUERJU0NPVkVSICYmCisgICAgICAgIGRoY3BfbXNnX3R5cGUgIT0gREhDUFJFUVVFU1QpCisgICAgICAgIHJldHVybjsKKyAgICAvKiBYWFg6IHRoaXMgaXMgYSBoYWNrIHRvIGdldCB0aGUgY2xpZW50IG1hYyBhZGRyZXNzICovCisgICAgbWVtY3B5KGNsaWVudF9ldGhhZGRyLCBicC0+YnBfaHdhZGRyLCA2KTsKKworICAgIGlmICgobSA9IG1fZ2V0KCkpID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKyAgICByYnAgPSAoc3RydWN0IGJvb3RwX3QgKiltLT5tX2RhdGE7CisgICAgbS0+bV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworICAgIG1lbXNldChyYnAsIDAsIHNpemVvZihzdHJ1Y3QgYm9vdHBfdCkpOworCisgICAgaWYgKGRoY3BfbXNnX3R5cGUgPT0gREhDUERJU0NPVkVSKSB7CisgICAgICAgIGlmIChwcmVxX2FkZHIpIHsKKyAgICAgICAgICAgIGJjID0gcmVxdWVzdF9hZGRyKHByZXFfYWRkciwgY2xpZW50X2V0aGFkZHIpOworICAgICAgICAgICAgaWYgKGJjKSB7CisgICAgICAgICAgICAgICAgZGFkZHIuc2luX2FkZHIgPSAqcHJlcV9hZGRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghYmMpIHsKKyAgICAgICAgIG5ld19hZGRyOgorICAgICAgICAgICAgYmMgPSBnZXRfbmV3X2FkZHIoJmRhZGRyLnNpbl9hZGRyLCBjbGllbnRfZXRoYWRkcik7CisgICAgICAgICAgICBpZiAoIWJjKSB7CisgICAgICAgICAgICAgICAgZHByaW50Zigibm8gYWRkcmVzcyBsZWZ0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJjLT5tYWNhZGRyLCBjbGllbnRfZXRoYWRkciwgNik7CisgICAgfSBlbHNlIGlmIChwcmVxX2FkZHIpIHsKKyAgICAgICAgYmMgPSByZXF1ZXN0X2FkZHIocHJlcV9hZGRyLCBjbGllbnRfZXRoYWRkcik7CisgICAgICAgIGlmIChiYykgeworICAgICAgICAgICAgZGFkZHIuc2luX2FkZHIgPSAqcHJlcV9hZGRyOworICAgICAgICAgICAgbWVtY3B5KGJjLT5tYWNhZGRyLCBjbGllbnRfZXRoYWRkciwgNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmMgPSBmaW5kX2FkZHIoJmRhZGRyLnNpbl9hZGRyLCBicC0+YnBfaHdhZGRyKTsKKyAgICAgICAgaWYgKCFiYykgeworICAgICAgICAgICAgLyogaWYgbmV2ZXIgYXNzaWduZWQsIGJlaGF2ZXMgYXMgaWYgaXQgd2FzIGFscmVhZHkKKyAgICAgICAgICAgICAgIGFzc2lnbmVkICh3aW5kb3dzIGZpeCBiZWNhdXNlIGl0IHJlbWVtYmVycyBpdHMgYWRkcmVzcykgKi8KKyAgICAgICAgICAgIGdvdG8gbmV3X2FkZHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChudG9obChzcGVjaWFsX2FkZHIuc19hZGRyKSB8IENUTF9BTElBUyk7CisgICAgc2FkZHIuc2luX3BvcnQgPSBodG9ucyhCT09UUF9TRVJWRVIpOworCisgICAgZGFkZHIuc2luX3BvcnQgPSBodG9ucyhCT09UUF9DTElFTlQpOworCisgICAgcmJwLT5icF9vcCA9IEJPT1RQX1JFUExZOworICAgIHJicC0+YnBfeGlkID0gYnAtPmJwX3hpZDsKKyAgICByYnAtPmJwX2h0eXBlID0gMTsKKyAgICByYnAtPmJwX2hsZW4gPSA2OworICAgIG1lbWNweShyYnAtPmJwX2h3YWRkciwgYnAtPmJwX2h3YWRkciwgNik7CisKKyAgICByYnAtPmJwX3lpYWRkciA9IGRhZGRyLnNpbl9hZGRyOyAvKiBDbGllbnQgSVAgYWRkcmVzcyAqLworICAgIHJicC0+YnBfc2lhZGRyID0gc2FkZHIuc2luX2FkZHI7IC8qIFNlcnZlciBJUCBhZGRyZXNzICovCisKKyAgICBxID0gcmJwLT5icF92ZW5kOworICAgIG1lbWNweShxLCByZmMxNTMzX2Nvb2tpZSwgNCk7CisgICAgcSArPSA0OworCisgICAgaWYgKGJjKSB7CisgICAgICAgIGRwcmludGYoIiVzIGFkZHI9JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAoZGhjcF9tc2dfdHlwZSA9PSBESENQRElTQ09WRVIpID8gIm9mZmVyZWQiIDogImFjaydlZCIsCisgICAgICAgICAgICAgICAgbnRvaGwoZGFkZHIuc2luX2FkZHIuc19hZGRyKSk7CisKKyAgICAgICAgaWYgKGRoY3BfbXNnX3R5cGUgPT0gREhDUERJU0NPVkVSKSB7CisgICAgICAgICAgICAqcSsrID0gUkZDMjEzMl9NU0dfVFlQRTsKKyAgICAgICAgICAgICpxKysgPSAxOworICAgICAgICAgICAgKnErKyA9IERIQ1BPRkZFUjsKKyAgICAgICAgfSBlbHNlIC8qIERIQ1BSRVFVRVNUICovIHsKKyAgICAgICAgICAgICpxKysgPSBSRkMyMTMyX01TR19UWVBFOworICAgICAgICAgICAgKnErKyA9IDE7CisgICAgICAgICAgICAqcSsrID0gREhDUEFDSzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChib290cF9maWxlbmFtZSkKKyAgICAgICAgICAgIHNucHJpbnRmKChjaGFyICopcmJwLT5icF9maWxlLCBzaXplb2YocmJwLT5icF9maWxlKSwgIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGJvb3RwX2ZpbGVuYW1lKTsKKworICAgICAgICAqcSsrID0gUkZDMjEzMl9TUlZfSUQ7CisgICAgICAgICpxKysgPSA0OworICAgICAgICBtZW1jcHkocSwgJnNhZGRyLnNpbl9hZGRyLCA0KTsKKyAgICAgICAgcSArPSA0OworCisgICAgICAgICpxKysgPSBSRkMxNTMzX05FVE1BU0s7CisgICAgICAgICpxKysgPSA0OworICAgICAgICAqcSsrID0gMHhmZjsKKyAgICAgICAgKnErKyA9IDB4ZmY7CisgICAgICAgICpxKysgPSAweGZmOworICAgICAgICAqcSsrID0gMHgwMDsKKworICAgICAgICBpZiAoIXNsaXJwX3Jlc3RyaWN0KSB7CisgICAgICAgICAgICAqcSsrID0gUkZDMTUzM19HQVRFV0FZOworICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICBtZW1jcHkocSwgJnNhZGRyLnNpbl9hZGRyLCA0KTsKKyAgICAgICAgICAgIHEgKz0gNDsKKworICAgICAgICAgICAgKnErKyA9IFJGQzE1MzNfRE5TOworICAgICAgICAgICAgKnErKyA9IDQ7CisgICAgICAgICAgICBkbnNfYWRkci5zX2FkZHIgPSBodG9ubChudG9obChzcGVjaWFsX2FkZHIuc19hZGRyKSB8IENUTF9ETlMpOworICAgICAgICAgICAgbWVtY3B5KHEsICZkbnNfYWRkciwgNCk7CisgICAgICAgICAgICBxICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICAqcSsrID0gUkZDMjEzMl9MRUFTRV9USU1FOworICAgICAgICAqcSsrID0gNDsKKyAgICAgICAgdmFsID0gaHRvbmwoTEVBU0VfVElNRSk7CisgICAgICAgIG1lbWNweShxLCAmdmFsLCA0KTsKKyAgICAgICAgcSArPSA0OworCisgICAgICAgIGlmICgqc2xpcnBfaG9zdG5hbWUpIHsKKyAgICAgICAgICAgIHZhbCA9IHN0cmxlbihzbGlycF9ob3N0bmFtZSk7CisgICAgICAgICAgICAqcSsrID0gUkZDMTUzM19IT1NUTkFNRTsKKyAgICAgICAgICAgICpxKysgPSB2YWw7CisgICAgICAgICAgICBtZW1jcHkocSwgc2xpcnBfaG9zdG5hbWUsIHZhbCk7CisgICAgICAgICAgICBxICs9IHZhbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5ha19tc2dbXSA9ICJyZXF1ZXN0ZWQgYWRkcmVzcyBub3QgYXZhaWxhYmxlIjsKKworICAgICAgICBkcHJpbnRmKCJuYWsnZWQgYWRkcj0lMDh4XG4iLCBudG9obChwcmVxX2FkZHItPnNfYWRkcikpOworCisgICAgICAgICpxKysgPSBSRkMyMTMyX01TR19UWVBFOworICAgICAgICAqcSsrID0gMTsKKyAgICAgICAgKnErKyA9IERIQ1BOQUs7CisKKyAgICAgICAgKnErKyA9IFJGQzIxMzJfTUVTU0FHRTsKKyAgICAgICAgKnErKyA9IHNpemVvZihuYWtfbXNnKSAtIDE7CisgICAgICAgIG1lbWNweShxLCBuYWtfbXNnLCBzaXplb2YobmFrX21zZykgLSAxKTsKKyAgICAgICAgcSArPSBzaXplb2YobmFrX21zZykgLSAxOworICAgIH0KKyAgICAqcSsrID0gUkZDMTUzM19FTkQ7CisKKyAgICBkYWRkci5zaW5fYWRkci5zX2FkZHIgPSAweGZmZmZmZmZmdTsKKworICAgIG0tPm1fbGVuID0gc2l6ZW9mKHN0cnVjdCBib290cF90KSAtCisgICAgICAgIHNpemVvZihzdHJ1Y3QgaXApIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworICAgIHVkcF9vdXRwdXQyKE5VTEwsIG0sICZzYWRkciwgJmRhZGRyLCBJUFRPU19MT1dERUxBWSk7Cit9CisKK3ZvaWQgYm9vdHBfaW5wdXQoc3RydWN0IG1idWYgKm0pCit7CisgICAgc3RydWN0IGJvb3RwX3QgKmJwID0gbXRvZChtLCBzdHJ1Y3QgYm9vdHBfdCAqKTsKKworICAgIGlmIChicC0+YnBfb3AgPT0gQk9PVFBfUkVRVUVTVCkgeworICAgICAgICBib290cF9yZXBseShicCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9ib290cC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9ib290cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkODA1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2Jvb3RwLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qIGJvb3RwL2RoY3AgZGVmaW5lcyAqLworCisjZGVmaW5lIEJPT1RQX1NFUlZFUgk2NworI2RlZmluZSBCT09UUF9DTElFTlQJNjgKKworI2RlZmluZSBCT09UUF9SRVFVRVNUCTEKKyNkZWZpbmUgQk9PVFBfUkVQTFkJMgorCisjZGVmaW5lIFJGQzE1MzNfQ09PS0lFCQk5OSwgMTMwLCA4MywgOTkKKyNkZWZpbmUgUkZDMTUzM19QQUQJCTAKKyNkZWZpbmUgUkZDMTUzM19ORVRNQVNLCQkxCisjZGVmaW5lIFJGQzE1MzNfVElNRU9GRlNFVAkyCisjZGVmaW5lIFJGQzE1MzNfR0FURVdBWQkJMworI2RlZmluZSBSRkMxNTMzX1RJTUVTRVJWRVIJNAorI2RlZmluZSBSRkMxNTMzX0lFTjExNk5TCTUKKyNkZWZpbmUgUkZDMTUzM19ETlMJCTYKKyNkZWZpbmUgUkZDMTUzM19MT0dTRVJWRVIJNworI2RlZmluZSBSRkMxNTMzX0NPT0tJRVNFUlZFUgk4CisjZGVmaW5lIFJGQzE1MzNfTFBSU0VSVkVSCTkKKyNkZWZpbmUgUkZDMTUzM19JTVBSRVNTU0VSVkVSCTEwCisjZGVmaW5lIFJGQzE1MzNfUkVTT1VSQ0VTRVJWRVIJMTEKKyNkZWZpbmUgUkZDMTUzM19IT1NUTkFNRQkxMgorI2RlZmluZSBSRkMxNTMzX0JPT1RGSUxFU0laRQkxMworI2RlZmluZSBSRkMxNTMzX01FUklURFVNUEZJTEUJMTQKKyNkZWZpbmUgUkZDMTUzM19ET01BSU5OQU1FCTE1CisjZGVmaW5lIFJGQzE1MzNfU1dBUFNFUlZFUgkxNgorI2RlZmluZSBSRkMxNTMzX1JPT1RQQVRICTE3CisjZGVmaW5lIFJGQzE1MzNfRVhURU5TSU9OUEFUSAkxOAorI2RlZmluZSBSRkMxNTMzX0lQRk9SV0FSRElORwkxOQorI2RlZmluZSBSRkMxNTMzX0lQU09VUkNFUk9VVElORwkyMAorI2RlZmluZSBSRkMxNTMzX0lQUE9MSUNZRklMVEVSCTIxCisjZGVmaW5lIFJGQzE1MzNfSVBNQVhSRUFTU0VNQkxZCTIyCisjZGVmaW5lIFJGQzE1MzNfSVBUVEwJCTIzCisjZGVmaW5lIFJGQzE1MzNfSVBNVFUJCTI0CisjZGVmaW5lIFJGQzE1MzNfSVBNVFVQTEFURUFVCTI1CisjZGVmaW5lIFJGQzE1MzNfSU5UTVRVCQkyNgorI2RlZmluZSBSRkMxNTMzX0lOVExPQ0FMU1VCTkVUUwkyNworI2RlZmluZSBSRkMxNTMzX0lOVEJST0FEQ0FTVAkyOAorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBESVNDT1ZFUgkyOQorI2RlZmluZSBSRkMxNTMzX0lOVElDTVBSRVNQT05ECTMwCisjZGVmaW5lIFJGQzE1MzNfSU5UUk9VVEVESVNDT1ZFUiAzMQorI2RlZmluZSBSRkMxNTMzX0lOVFJPVVRFU09MSUNJVAkzMgorI2RlZmluZSBSRkMxNTMzX0lOVFNUQVRJQ1JPVVRFUwkzMworI2RlZmluZSBSRkMxNTMzX0xMVFJBSUxFUkVOQ0FQCTM0CisjZGVmaW5lIFJGQzE1MzNfTExBUlBDQUNIRVRNTwkzNQorI2RlZmluZSBSRkMxNTMzX0xMRVRIRVJORVRFTkNBUAkzNgorI2RlZmluZSBSRkMxNTMzX1RDUFRUTAkJMzcKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVUTU8JMzgKKyNkZWZpbmUgUkZDMTUzM19UQ1BLRUVQQUxJVkVHQgkzOQorI2RlZmluZSBSRkMxNTMzX05JU0RPTUFJTgk0MAorI2RlZmluZSBSRkMxNTMzX05JU1NFUlZFUgk0MQorI2RlZmluZSBSRkMxNTMzX05UUFNFUlZFUgk0MgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUgkJNDMKKyNkZWZpbmUgUkZDMTUzM19OQk5TCQk0NAorI2RlZmluZSBSRkMxNTMzX05CREQJCTQ1CisjZGVmaW5lIFJGQzE1MzNfTkJOVAkJNDYKKyNkZWZpbmUgUkZDMTUzM19OQlNDT1BFCQk0NworI2RlZmluZSBSRkMxNTMzX1hGUwkJNDgKKyNkZWZpbmUgUkZDMTUzM19YRE0JCTQ5CisKKyNkZWZpbmUgUkZDMjEzMl9SRVFfQUREUgk1MAorI2RlZmluZSBSRkMyMTMyX0xFQVNFX1RJTUUgICAgICA1MQorI2RlZmluZSBSRkMyMTMyX01TR19UWVBFCTUzCisjZGVmaW5lIFJGQzIxMzJfU1JWX0lECQk1NAorI2RlZmluZSBSRkMyMTMyX1BBUkFNX0xJU1QJNTUKKyNkZWZpbmUgUkZDMjEzMl9NRVNTQUdFCQk1NgorI2RlZmluZSBSRkMyMTMyX01BWF9TSVpFCTU3CisjZGVmaW5lIFJGQzIxMzJfUkVORVdBTF9USU1FICAgIDU4CisjZGVmaW5lIFJGQzIxMzJfUkVCSU5EX1RJTUUgICAgIDU5CisKKyNkZWZpbmUgREhDUERJU0NPVkVSCQkxCisjZGVmaW5lIERIQ1BPRkZFUgkJMgorI2RlZmluZSBESENQUkVRVUVTVAkJMworI2RlZmluZSBESENQQUNLCQkJNQorI2RlZmluZSBESENQTkFLCQkJNgorCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01BSk9SCTAKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTUlOT1IJMAorCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01BR0lDCTEyOAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9BRERQQVJNCTEyOQorI2RlZmluZQlSRkMxNTMzX1ZFTkRPUl9FVEhERVYJMTMwCisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0hPV1RPICAgIDEzMgorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9NTlVPUFRTCTE2MAorI2RlZmluZSBSRkMxNTMzX1ZFTkRPUl9TRUxFQ1RJT04gMTc2CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX01PVEQJMTg0CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX05VTU9GTU9URCA4CisjZGVmaW5lIFJGQzE1MzNfVkVORE9SX0lNRwkxOTIKKyNkZWZpbmUgUkZDMTUzM19WRU5ET1JfTlVNT0ZJTUcJMTYKKworI2RlZmluZSBSRkMxNTMzX0VORAkJMjU1CisjZGVmaW5lIEJPT1RQX1ZFTkRPUl9MRU4JNjQKKyNkZWZpbmUgREhDUF9PUFRfTEVOCQkzMTIKKworc3RydWN0IGJvb3RwX3QgeworICAgIHN0cnVjdCBpcCBpcDsKKyAgICBzdHJ1Y3QgdWRwaGRyIHVkcDsKKyAgICB1aW50OF90IGJwX29wOworICAgIHVpbnQ4X3QgYnBfaHR5cGU7CisgICAgdWludDhfdCBicF9obGVuOworICAgIHVpbnQ4X3QgYnBfaG9wczsKKyAgICB1aW50MzJfdCBicF94aWQ7CisgICAgdWludDE2X3QgYnBfc2VjczsKKyAgICB1aW50MTZfdCB1bnVzZWQ7CisgICAgc3RydWN0IGluX2FkZHIgYnBfY2lhZGRyOworICAgIHN0cnVjdCBpbl9hZGRyIGJwX3lpYWRkcjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBicF9zaWFkZHI7CisgICAgc3RydWN0IGluX2FkZHIgYnBfZ2lhZGRyOworICAgIHVpbnQ4X3QgYnBfaHdhZGRyWzE2XTsKKyAgICB1aW50OF90IGJwX3NuYW1lWzY0XTsKKyAgICB1aW50OF90IGJwX2ZpbGVbMTI4XTsKKyAgICB1aW50OF90IGJwX3ZlbmRbREhDUF9PUFRfTEVOXTsKK307CisKK3ZvaWQgYm9vdHBfaW5wdXQoc3RydWN0IG1idWYgKm0pOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9ja3N1bS5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9ja3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTc3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2Nrc3VtLmMKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaW5fY2tzdW0uYwk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpbl9ja3N1bS5jLHYgMS4yIDE5OTQvMDgvMDIgMDc6NDg6MTYgZGF2aWRnIEV4cAorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCisvKgorICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKFBvcnRhYmxlIFZlcnNpb24pLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyB2ZXJ5IGhlYXZpbHkgdXNlZCBpbiB0aGUgbmV0d29yaworICogY29kZSBhbmQgc2hvdWxkIGJlIG1vZGlmaWVkIGZvciBlYWNoIENQVSB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICoKKyAqIFhYWCBTaW5jZSB3ZSB3aWxsIG5ldmVyIHNwYW4gbW9yZSB0aGFuIDEgbWJ1Ziwgd2UgY2FuIG9wdGltaXNlIHRoaXMKKyAqLworCisjZGVmaW5lIEFERENBUlJZKHgpICAoeCA+IDY1NTM1ID8geCAtPSA2NTUzNSA6IHgpCisjZGVmaW5lIFJFRFVDRSB7bF91dGlsLmwgPSBzdW07IHN1bSA9IGxfdXRpbC5zWzBdICsgbF91dGlsLnNbMV07IEFERENBUlJZKHN1bSk7fQorCitpbnQgY2tzdW0oc3RydWN0IG1idWYgKm0sIGludCBsZW4pCit7CisJcmVnaXN0ZXIgdV9pbnQxNl90ICp3OworCXJlZ2lzdGVyIGludCBzdW0gPSAwOworCXJlZ2lzdGVyIGludCBtbGVuID0gMDsKKwlpbnQgYnl0ZV9zd2FwcGVkID0gMDsKKworCXVuaW9uIHsKKwkJdV9pbnQ4X3QJY1syXTsKKwkJdV9pbnQxNl90CXM7CisJfSBzX3V0aWw7CisJdW5pb24geworCQl1X2ludDE2X3Qgc1syXTsKKwkJdV9pbnQzMl90IGw7CisJfSBsX3V0aWw7CisKKwlpZiAobS0+bV9sZW4gPT0gMCkKKwkgICBnb3RvIGNvbnQ7CisJdyA9IG10b2QobSwgdV9pbnQxNl90ICopOworCisJbWxlbiA9IG0tPm1fbGVuOworCisJaWYgKGxlbiA8IG1sZW4pCisJICAgbWxlbiA9IGxlbjsKKwlsZW4gLT0gbWxlbjsKKwkvKgorCSAqIEZvcmNlIHRvIGV2ZW4gYm91bmRhcnkuCisJICovCisJaWYgKCgxICYgKGxvbmcpIHcpICYmIChtbGVuID4gMCkpIHsKKwkJUkVEVUNFOworCQlzdW0gPDw9IDg7CisJCXNfdXRpbC5jWzBdID0gKih1X2ludDhfdCAqKXc7CisJCXcgPSAodV9pbnQxNl90ICopKChpbnQ4X3QgKil3ICsgMSk7CisJCW1sZW4tLTsKKwkJYnl0ZV9zd2FwcGVkID0gMTsKKwl9CisJLyoKKwkgKiBVbnJvbGwgdGhlIGxvb3AgdG8gbWFrZSBvdmVyaGVhZCBmcm9tCisJICogYnJhbmNoZXMgJmMgc21hbGwuCisJICovCisJd2hpbGUgKChtbGVuIC09IDMyKSA+PSAwKSB7CisJCXN1bSArPSB3WzBdOyBzdW0gKz0gd1sxXTsgc3VtICs9IHdbMl07IHN1bSArPSB3WzNdOworCQlzdW0gKz0gd1s0XTsgc3VtICs9IHdbNV07IHN1bSArPSB3WzZdOyBzdW0gKz0gd1s3XTsKKwkJc3VtICs9IHdbOF07IHN1bSArPSB3WzldOyBzdW0gKz0gd1sxMF07IHN1bSArPSB3WzExXTsKKwkJc3VtICs9IHdbMTJdOyBzdW0gKz0gd1sxM107IHN1bSArPSB3WzE0XTsgc3VtICs9IHdbMTVdOworCQl3ICs9IDE2OworCX0KKwltbGVuICs9IDMyOworCXdoaWxlICgobWxlbiAtPSA4KSA+PSAwKSB7CisJCXN1bSArPSB3WzBdOyBzdW0gKz0gd1sxXTsgc3VtICs9IHdbMl07IHN1bSArPSB3WzNdOworCQl3ICs9IDQ7CisJfQorCW1sZW4gKz0gODsKKwlpZiAobWxlbiA9PSAwICYmIGJ5dGVfc3dhcHBlZCA9PSAwKQorCSAgIGdvdG8gY29udDsKKwlSRURVQ0U7CisJd2hpbGUgKChtbGVuIC09IDIpID49IDApIHsKKwkJc3VtICs9ICp3Kys7CisJfQorCisJaWYgKGJ5dGVfc3dhcHBlZCkgeworCQlSRURVQ0U7CisJCXN1bSA8PD0gODsKKwkJYnl0ZV9zd2FwcGVkID0gMDsKKwkJaWYgKG1sZW4gPT0gLTEpIHsKKwkJCXNfdXRpbC5jWzFdID0gKih1X2ludDhfdCAqKXc7CisJCQlzdW0gKz0gc191dGlsLnM7CisJCQltbGVuID0gMDsKKwkJfSBlbHNlCisKKwkJICAgbWxlbiA9IC0xOworCX0gZWxzZSBpZiAobWxlbiA9PSAtMSkKKwkgICBzX3V0aWwuY1swXSA9ICoodV9pbnQ4X3QgKil3OworCitjb250OgorI2lmZGVmIERFQlVHCisJaWYgKGxlbikgeworCQlERUJVR19FUlJPUigoZGZkLCAiY2tzdW06IG91dCBvZiBkYXRhXG4iKSk7CisJCURFQlVHX0VSUk9SKChkZmQsICIgbGVuID0gJWRcbiIsIGxlbikpOworCX0KKyNlbmRpZgorCWlmIChtbGVuID09IC0xKSB7CisJCS8qIFRoZSBsYXN0IG1idWYgaGFzIG9kZCAjIG9mIGJ5dGVzLiBGb2xsb3cgdGhlCisJCSBzdGFuZGFyZCAodGhlIG9kZCBieXRlIG1heSBiZSBzaGlmdGVkIGxlZnQgYnkgOCBiaXRzCisJCQkgICBvciBub3QgYXMgZGV0ZXJtaW5lZCBieSBlbmRpYW4tbmVzcyBvZiB0aGUgbWFjaGluZSkgKi8KKwkJc191dGlsLmNbMV0gPSAwOworCQlzdW0gKz0gc191dGlsLnM7CisJfQorCVJFRFVDRTsKKwlyZXR1cm4gKH5zdW0gJiAweGZmZmYpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9jdGwuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4NTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvY3RsLmgKQEAgLTAsMCArMSw3IEBACisjZGVmaW5lIENUTF9DTUQJCTAKKyNkZWZpbmUgQ1RMX0VYRUMJMQorI2RlZmluZSBDVExfQUxJQVMJMgorI2RlZmluZSBDVExfRE5TCQkzCisKKyNkZWZpbmUgQ1RMX1NQRUNJQUwJIjEwLjAuMi4wIgorI2RlZmluZSBDVExfTE9DQUwJIjEwLjAuMi4xNSIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvZGVidWcuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmVmNTgwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9kZWJ1Zy5jCkBAIC0wLDAgKzEsMzkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICogUG9ydGlvbnMgY29weXJpZ2h0IChjKSAyMDAwIEtlbGx5IFByaWNlLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCitGSUxFICpkZmQgPSBOVUxMOworI2lmZGVmIERFQlVHCitpbnQgZG9zdGF0cyA9IDE7CisjZWxzZQoraW50IGRvc3RhdHMgPSAwOworI2VuZGlmCitpbnQgc2xpcnBfZGVidWcgPSAwOworCisvKiBDYXJyeSBvdmVyIG9uZSBpdGVtIGZyb20gbWFpbi5jIHNvIHRoYXQgdGhlIHR0eSdzIHJlc3RvcmVkLgorICogT25seSBkb25lIHdoZW4gdGhlIHR0eSBiZWluZyB1c2VkIGlzIC9kZXYvdHR5IC0tUmVkV29sZiAqLworI2lmbmRlZiBDT05GSUdfUUVNVQorZXh0ZXJuIHN0cnVjdCB0ZXJtaW9zIHNsaXJwX3R0eV9zZXR0aW5nczsKK2V4dGVybiBpbnQgc2xpcnBfdHR5X3Jlc3RvcmU7CisKKwordm9pZAorZGVidWdfaW5pdChmaWxlLCBkYmcpCisJY2hhciAqZmlsZTsKKwlpbnQgZGJnOworeworCS8qIENsb3NlIHRoZSBvbGQgZGVidWdnaW5nIGZpbGUgKi8KKwlpZiAoZGZkKQorCSAgIGZjbG9zZShkZmQpOworCisJZGZkID0gZm9wZW4oZmlsZSwidyIpOworCWlmIChkZmQgIT0gTlVMTCkgeworI2lmIDAKKwkJZnByaW50ZihkZmQsIlNsaXJwICVzIC0gRGVidWdnaW5nIFN0YXJ0ZWQuXG4iLCBTTElSUF9WRVJTSU9OKTsKKyNlbmRpZgorCQlmcHJpbnRmKGRmZCwiRGVidWdnaW5nIFN0YXJ0ZWQgbGV2ZWwgJWkuXHJcbiIsZGJnKTsKKwkJZmZsdXNoKGRmZCk7CisJCXNsaXJwX2RlYnVnID0gZGJnOworCX0gZWxzZSB7CisJCWxwcmludCgiRXJyb3I6IERlYnVnZ2luZyBmaWxlIFwiJXNcIiBjb3VsZCBub3QgYmUgb3BlbmVkOiAlc1xyXG4iLAorCQkJZmlsZSwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKKy8qCisgKiBEdW1wIGEgcGFja2V0IGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0Y3BkdW1wIC14CisgKi8KKyNpZmRlZiBERUJVRwordm9pZAorZHVtcF9wYWNrZXQoZGF0LCBuKQorCXZvaWQgKmRhdDsKKwlpbnQgbjsKK3sKKwl1X2NoYXIgKnBwdHIgPSAodV9jaGFyICopZGF0OworCWludCBqLGs7CisKKwluIC89IDE2OworCW4rKzsKKwlERUJVR19NSVNDKChkZmQsICJQQUNLRVQgRFVNUEVEOiBcbiIpKTsKKwlmb3IoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJZm9yKGsgPSAwOyBrIDwgNjsgaysrKQorCQkJREVCVUdfTUlTQygoZGZkLCAiJTAyeCAiLCAqcHB0cisrKSk7CisJCURFQlVHX01JU0MoKGRmZCwgIlxuIikpOworCQlmZmx1c2goZGZkKTsKKwl9Cit9CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgTE9HX0VOQUJMRUQKKyNpZiAwCisvKgorICogU3RhdGlzdGljIHJvdXRpbmVzCisgKgorICogVGhlc2Ugd2lsbCBwcmludCBzdGF0aXN0aWNzIHRvIHRoZSBzY3JlZW4sIHRoZSBkZWJ1ZyBmaWxlIChkZmQpLCBvcgorICogYSBidWZmZXIsIGRlcGVuZGluZyBvbiAidHlwZSIsIHNvIHRoYXQgdGhlIHN0YXRzIGNhbiBiZSBzZW50IG92ZXIKKyAqIHRoZSBsaW5rIGFzIHdlbGwuCisgKi8KKworc3RhdGljIHZvaWQKK3R0eXN0YXRzKHR0eXApCisJc3RydWN0IHR0eXMgKnR0eXA7Cit7CisJc3RydWN0IHNsaXJwX2lmc3RhdHMgKmlzID0gJnR0eXAtPmlmc3RhdHM7CisJY2hhciBidWZmWzUxMl07CisKKwlscHJpbnQoIiBcclxuIik7CisKKwlpZiAoSUZfQ09NUCAmIElGX0NPTVBSRVNTKQorCSAgIHN0cmNweShidWZmLCAib24iKTsKKwllbHNlIGlmIChJRl9DT01QICYgSUZfTk9DT01QUkVTUykKKwkgICBzdHJjcHkoYnVmZiwgIm9mZiIpOworCWVsc2UKKwkgICBzdHJjcHkoYnVmZiwgIm9mZiAoZm9yIG5vdykiKTsKKwlscHJpbnQoIlVuaXQgJWQ6XHJcbiIsIHR0eXAtPnVuaXQpOworCWxwcmludCgiICB1c2luZyAlcyBlbmNhcHN1bGF0aW9uIChWSiBjb21wcmVzc2lvbiBpcyAlcylcclxuIiwgKAorI2lmZGVmIFVTRV9QUFAKKwkgICAgICAgdHR5cC0+cHJvdG89PVBST1RPX1BQUD8iUFBQIjoKKyNlbmRpZgorCSAgICAgICAiU0xJUCIpLCBidWZmKTsKKwlscHJpbnQoIiAgJWQgYmF1ZHJhdGVcclxuIiwgdHR5cC0+YmF1ZCk7CisJbHByaW50KCIgIGludGVyZmFjZSBpcyAlc1xyXG4iLCB0dHlwLT51cD8idXAiOiJkb3duIik7CisJbHByaW50KCIgIHVzaW5nIGZkICVkLCBndWFyZGlhbiBwaWQgaXMgJWRcclxuIiwgdHR5cC0+ZmQsIHR0eXAtPnBpZCk7CisjaWZuZGVmIEZVTExfQk9MVAorCWxwcmludCgiICB0b3dyaXRlIGlzICVkIGJ5dGVzXHJcbiIsIHR0eXAtPnRvd3JpdGUpOworI2VuZGlmCisJaWYgKHR0eXAtPnplcm9zKQorCSAgIGxwcmludCgiICAlZCB6ZXJvcyBoYXZlIGJlZW4gdHlwZWRcclxuIiwgdHR5cC0+emVyb3MpOworCWVsc2UgaWYgKHR0eXAtPm9uZXMpCisJICAgbHByaW50KCIgICVkIG9uZXMgaGF2ZSBiZWVuIHR5cGVkXHJcbiIsIHR0eXAtPm9uZXMpOworCWxwcmludCgiSW50ZXJmYWNlIHN0YXRzOlxyXG4iKTsKKwlscHJpbnQoIiAgJTZkIG91dHB1dCBwYWNrZXRzIHNlbnQgKCVkIGJ5dGVzKVxyXG4iLCBpcy0+b3V0X3BrdHMsIGlzLT5vdXRfYnl0ZXMpOworCWxwcmludCgiICAlNmQgb3V0cHV0IHBhY2tldHMgZHJvcHBlZCAoJWQgYnl0ZXMpXHJcbiIsIGlzLT5vdXRfZXJycGt0cywgaXMtPm91dF9lcnJieXRlcyk7CisJbHByaW50KCIgICU2ZCBpbnB1dCBwYWNrZXRzIHJlY2VpdmVkICglZCBieXRlcylcclxuIiwgaXMtPmluX3BrdHMsIGlzLT5pbl9ieXRlcyk7CisJbHByaW50KCIgICU2ZCBpbnB1dCBwYWNrZXRzIGRyb3BwZWQgKCVkIGJ5dGVzKVxyXG4iLCBpcy0+aW5fZXJycGt0cywgaXMtPmluX2VycmJ5dGVzKTsKKwlscHJpbnQoIiAgJTZkIGJhZCBpbnB1dCBwYWNrZXRzXHJcbiIsIGlzLT5pbl9tYmFkKTsKK30KKworc3RhdGljIHZvaWQKK2FsbHR0eXN0YXRzKHZvaWQpCit7CisJc3RydWN0IHR0eXMgKnR0eXA7CisKKwlmb3IgKHR0eXAgPSB0dHlzOyB0dHlwOyB0dHlwID0gdHR5cC0+bmV4dCkKKwkgICB0dHlzdGF0cyh0dHlwKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraXBzdGF0cyh2b2lkKQoreworCWxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgiSVAgc3RhdHM6XHJcbiIpOworCWxwcmludCgiICAlNmQgdG90YWwgcGFja2V0cyByZWNlaXZlZCAoJWQgd2VyZSB1bmFsaWduZWQpXHJcbiIsCisJCQlpcHN0YXQuaXBzX3RvdGFsLCBpcHN0YXQuaXBzX3VuYWxpZ25lZCk7CisJbHByaW50KCIgICU2ZCB3aXRoIGluY29ycmVjdCB2ZXJzaW9uXHJcbiIsIGlwc3RhdC5pcHNfYmFkdmVycyk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBoZWFkZXIgY2hlY2tzdW1cclxuIiwgaXBzdGF0Lmlwc19iYWRzdW0pOworCWxwcmludCgiICAlNmQgd2l0aCBsZW5ndGggdG9vIHNob3J0IChsZW4gPCBzaXplb2YoaXBoZHIpKVxyXG4iLCBpcHN0YXQuaXBzX3Rvb3Nob3J0KTsKKwlscHJpbnQoIiAgJTZkIHdpdGggbGVuZ3RoIHRvbyBzbWFsbCAobGVuIDwgaXAtPmxlbilcclxuIiwgaXBzdGF0Lmlwc190b29zbWFsbCk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBoZWFkZXIgbGVuZ3RoXHJcbiIsIGlwc3RhdC5pcHNfYmFkaGxlbik7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBwYWNrZXQgbGVuZ3RoXHJcbiIsIGlwc3RhdC5pcHNfYmFkbGVuKTsKKwlscHJpbnQoIiAgJTZkIGZyYWdtZW50cyByZWNlaXZlZFxyXG4iLCBpcHN0YXQuaXBzX2ZyYWdtZW50cyk7CisJbHByaW50KCIgICU2ZCBmcmFnbWVudHMgZHJvcHBlZFxyXG4iLCBpcHN0YXQuaXBzX2ZyYWdkcm9wcGVkKTsKKwlscHJpbnQoIiAgJTZkIGZyYWdtZW50cyB0aW1lZCBvdXRcclxuIiwgaXBzdGF0Lmlwc19mcmFndGltZW91dCk7CisJbHByaW50KCIgICU2ZCBwYWNrZXRzIHJlYXNzZW1ibGVkIG9rXHJcbiIsIGlwc3RhdC5pcHNfcmVhc3NlbWJsZWQpOworCWxwcmludCgiICAlNmQgb3V0Z29pbmcgcGFja2V0cyBmcmFnbWVudGVkXHJcbiIsIGlwc3RhdC5pcHNfZnJhZ21lbnRlZCk7CisJbHByaW50KCIgICU2ZCB0b3RhbCBvdXRnb2luZyBmcmFnbWVudHNcclxuIiwgaXBzdGF0Lmlwc19vZnJhZ21lbnRzKTsKKwlscHJpbnQoIiAgJTZkIHdpdGggYmFkIHByb3RvY29sIGZpZWxkXHJcbiIsIGlwc3RhdC5pcHNfbm9wcm90byk7CisJbHByaW50KCIgICU2ZCB0b3RhbCBwYWNrZXRzIGRlbGl2ZXJlZFxyXG4iLCBpcHN0YXQuaXBzX2RlbGl2ZXJlZCk7Cit9CisKKyNpZm5kZWYgQ09ORklHX1FFTVUKK3N0YXRpYyB2b2lkCit2anN0YXRzKHZvaWQpCit7CisJbHByaW50KCIgXHJcbiIpOworCisJbHByaW50KCJWSiBjb21wcmVzc2lvbiBzdGF0czpcclxuIik7CisKKwlscHJpbnQoIiAgJTZkIG91dGJvdW5kIHBhY2tldHMgKCVkIGNvbXByZXNzZWQpXHJcbiIsCisJICAgICAgIGNvbXBfcy5zbHNfcGFja2V0cywgY29tcF9zLnNsc19jb21wcmVzc2VkKTsKKwlscHJpbnQoIiAgJTZkIHNlYXJjaGVzIGZvciBjb25uZWN0aW9uIHN0YXRzICglZCBtaXNzZXMpXHJcbiIsCisJICAgICAgIGNvbXBfcy5zbHNfc2VhcmNoZXMsIGNvbXBfcy5zbHNfbWlzc2VzKTsKKwlscHJpbnQoIiAgJTZkIGluYm91bmQgdW5jb21wcmVzc2VkIHBhY2tldHNcclxuIiwgY29tcF9zLnNsc191bmNvbXByZXNzZWRpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIGNvbXByZXNzZWQgcGFja2V0c1xyXG4iLCBjb21wX3Muc2xzX2NvbXByZXNzZWRpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIHVua25vd24gdHlwZSBwYWNrZXRzXHJcbiIsIGNvbXBfcy5zbHNfZXJyb3Jpbik7CisJbHByaW50KCIgICU2ZCBpbmJvdW5kIHBhY2tldHMgdG9zc2VkIGR1ZSB0byBlcnJvclxyXG4iLCBjb21wX3Muc2xzX3Rvc3NlZCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3RjcHN0YXRzKHZvaWQpCit7CisJbHByaW50KCIgXHJcbiIpOworCisJbHByaW50KCJUQ1Agc3RhdHM6XHJcbiIpOworCisJbHByaW50KCIgICU2ZCBwYWNrZXRzIHNlbnRcclxuIiwgdGNwc3RhdC50Y3BzX3NuZHRvdGFsKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgZGF0YSBwYWNrZXRzICglZCBieXRlcylcclxuIiwKKwkJCXRjcHN0YXQudGNwc19zbmRwYWNrLCB0Y3BzdGF0LnRjcHNfc25kYnl0ZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGRhdGEgcGFja2V0cyByZXRyYW5zbWl0dGVkICglZCBieXRlcylcclxuIiwKKwkJCXRjcHN0YXQudGNwc19zbmRyZXhtaXRwYWNrLCB0Y3BzdGF0LnRjcHNfc25kcmV4bWl0Ynl0ZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGFjay1vbmx5IHBhY2tldHMgKCVkIGRlbGF5ZWQpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfc25kYWNrcywgdGNwc3RhdC50Y3BzX2RlbGFjayk7CisJbHByaW50KCIgICAgICAgICAgJTZkIFVSRyBvbmx5IHBhY2tldHNcclxuIiwgdGNwc3RhdC50Y3BzX3NuZHVyZyk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHdpbmRvdyBwcm9iZSBwYWNrZXRzXHJcbiIsIHRjcHN0YXQudGNwc19zbmRwcm9iZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHdpbmRvdyB1cGRhdGUgcGFja2V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfc25kd2ludXApOworCWxwcmludCgiICAgICAgICAgICU2ZCBjb250cm9sIChTWU4vRklOL1JTVCkgcGFja2V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfc25kY3RybCk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHRpbWVzIHRjcF9vdXRwdXQgZGlkIG5vdGhpbmdcclxuIiwgdGNwc3RhdC50Y3BzX2RpZG51dHRpbik7CisKKwlscHJpbnQoIiAgJTZkIHBhY2tldHMgcmVjZWl2ZWRcclxuIiwgdGNwc3RhdC50Y3BzX3JjdnRvdGFsKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgYWNrcyAoZm9yICVkIGJ5dGVzKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3JjdmFja3BhY2ssIHRjcHN0YXQudGNwc19yY3ZhY2tieXRlKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgZHVwbGljYXRlIGFja3NcclxuIiwgdGNwc3RhdC50Y3BzX3JjdmR1cGFjayk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGFja3MgZm9yIHVuc2VudCBkYXRhXHJcbiIsIHRjcHN0YXQudGNwc19yY3ZhY2t0b29tdWNoKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgcGFja2V0cyByZWNlaXZlZCBpbiBzZXF1ZW5jZSAoJWQgYnl0ZXMpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfcmN2cGFjaywgdGNwc3RhdC50Y3BzX3JjdmJ5dGUpOworICAgICAgICBscHJpbnQoIiAgICAgICAgICAlNmQgY29tcGxldGVseSBkdXBsaWNhdGUgcGFja2V0cyAoJWQgYnl0ZXMpXHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfcmN2ZHVwcGFjaywgdGNwc3RhdC50Y3BzX3JjdmR1cGJ5dGUpOworCisJbHByaW50KCIgICAgICAgICAgJTZkIHBhY2tldHMgd2l0aCBzb21lIGR1cGxpY2F0ZSBkYXRhICglZCBieXRlcyBkdXBlZClcclxuIiwKKwkJCXRjcHN0YXQudGNwc19yY3ZwYXJ0ZHVwcGFjaywgdGNwc3RhdC50Y3BzX3JjdnBhcnRkdXBieXRlKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgb3V0LW9mLW9yZGVyIHBhY2tldHMgKCVkIGJ5dGVzKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3Jjdm9vcGFjaywgdGNwc3RhdC50Y3BzX3Jjdm9vYnl0ZSk7CisJbHByaW50KCIgICAgICAgICAgJTZkIHBhY2tldHMgb2YgZGF0YSBhZnRlciB3aW5kb3cgKCVkIGJ5dGVzKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3JjdnBhY2thZnRlcndpbiwgdGNwc3RhdC50Y3BzX3JjdmJ5dGVhZnRlcndpbik7CisJbHByaW50KCIgICAgICAgICAgJTZkIHdpbmRvdyBwcm9iZXNcclxuIiwgdGNwc3RhdC50Y3BzX3JjdndpbnByb2JlKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgd2luZG93IHVwZGF0ZSBwYWNrZXRzXHJcbiIsIHRjcHN0YXQudGNwc19yY3Z3aW51cGQpOworCWxwcmludCgiICAgICAgICAgICU2ZCBwYWNrZXRzIHJlY2VpdmVkIGFmdGVyIGNsb3NlXHJcbiIsIHRjcHN0YXQudGNwc19yY3ZhZnRlcmNsb3NlKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQgZGlzY2FyZGVkIGZvciBiYWQgY2hlY2tzdW1zXHJcbiIsIHRjcHN0YXQudGNwc19yY3ZiYWRzdW0pOworCWxwcmludCgiICAgICAgICAgICU2ZCBkaXNjYXJkZWQgZm9yIGJhZCBoZWFkZXIgb2Zmc2V0IGZpZWxkc1xyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3JjdmJhZG9mZik7CisKKwlscHJpbnQoIiAgJTZkIGNvbm5lY3Rpb24gcmVxdWVzdHNcclxuIiwgdGNwc3RhdC50Y3BzX2Nvbm5hdHRlbXB0KTsKKwlscHJpbnQoIiAgJTZkIGNvbm5lY3Rpb24gYWNjZXB0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfYWNjZXB0cyk7CisJbHByaW50KCIgICU2ZCBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCAoaW5jbHVkaW5nIGFjY2VwdHMpXHJcbiIsIHRjcHN0YXQudGNwc19jb25uZWN0cyk7CisJbHByaW50KCIgICU2ZCBjb25uZWN0aW9ucyBjbG9zZWQgKGluY2x1ZGluZyAlZCBkcm9wKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX2Nsb3NlZCwgdGNwc3RhdC50Y3BzX2Ryb3BzKTsKKwlscHJpbnQoIiAgJTZkIGVtYnJ5b25pYyBjb25uZWN0aW9ucyBkcm9wcGVkXHJcbiIsIHRjcHN0YXQudGNwc19jb25uZHJvcHMpOworCWxwcmludCgiICAlNmQgc2VnbWVudHMgd2UgdHJpZWQgdG8gZ2V0IHJ0dCAoJWQgc3VjY2VlZGVkKVxyXG4iLAorCQkJdGNwc3RhdC50Y3BzX3NlZ3N0aW1lZCwgdGNwc3RhdC50Y3BzX3J0dHVwZGF0ZWQpOworCWxwcmludCgiICAlNmQgcmV0cmFuc21pdCB0aW1lb3V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfcmV4bXR0aW1lbyk7CisJbHByaW50KCIgICAgICAgICAgJTZkIGNvbm5lY3Rpb25zIGRyb3BwZWQgYnkgcnhtdCB0aW1lb3V0XHJcbiIsCisJCQl0Y3BzdGF0LnRjcHNfdGltZW91dGRyb3ApOworCWxwcmludCgiICAlNmQgcGVyc2lzdCB0aW1lb3V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfcGVyc2lzdHRpbWVvKTsKKwlscHJpbnQoIiAgJTZkIGtlZXBhbGl2ZSB0aW1lb3V0c1xyXG4iLCB0Y3BzdGF0LnRjcHNfa2VlcHRpbWVvKTsKKwlscHJpbnQoIiAgICAgICAgICAlNmQga2VlcGFsaXZlIHByb2JlcyBzZW50XHJcbiIsIHRjcHN0YXQudGNwc19rZWVwcHJvYmUpOworCWxwcmludCgiICAgICAgICAgICU2ZCBjb25uZWN0aW9ucyBkcm9wcGVkIGJ5IGtlZXBhbGl2ZVxyXG4iLCB0Y3BzdGF0LnRjcHNfa2VlcGRyb3BzKTsKKwlscHJpbnQoIiAgJTZkIGNvcnJlY3QgQUNLIGhlYWRlciBwcmVkaWN0aW9uc1xyXG4iLCB0Y3BzdGF0LnRjcHNfcHJlZGFjayk7CisJbHByaW50KCIgICU2ZCBjb3JyZWN0IGRhdGEgcGFja2V0IGhlYWRlciBwcmVkaWN0aW9uc1xuIiwgdGNwc3RhdC50Y3BzX3ByZWRkYXQpOworCWxwcmludCgiICAlNmQgVENQIGNhY2hlIG1pc3Nlc1xyXG4iLCB0Y3BzdGF0LnRjcHNfc29jYWNoZW1pc3MpOworCisKKy8qCWxwcmludCgiICAgIFBhY2tldHMgcmVjZWl2ZWQgdG9vIHNob3J0OgkJJWRcclxuIiwgdGNwc3RhdC50Y3BzX3JjdnNob3J0KTsgKi8KKy8qCWxwcmludCgiICAgIFNlZ21lbnRzIGRyb3BwZWQgZHVlIHRvIFBBV1M6CSVkXHJcbiIsIHRjcHN0YXQudGNwc19wYXdzZHJvcCk7ICovCisKK30KKworc3RhdGljIHZvaWQKK3VkcHN0YXRzKHZvaWQpCit7CisgICAgICAgIGxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgiVURQIHN0YXRzOlxyXG4iKTsKKwlscHJpbnQoIiAgJTZkIGRhdGFncmFtcyByZWNlaXZlZFxyXG4iLCB1ZHBzdGF0LnVkcHNfaXBhY2tldHMpOworCWxwcmludCgiICAlNmQgd2l0aCBwYWNrZXRzIHNob3J0ZXIgdGhhbiBoZWFkZXJcclxuIiwgdWRwc3RhdC51ZHBzX2hkcm9wcyk7CisJbHByaW50KCIgICU2ZCB3aXRoIGJhZCBjaGVja3N1bXNcclxuIiwgdWRwc3RhdC51ZHBzX2JhZHN1bSk7CisJbHByaW50KCIgICU2ZCB3aXRoIGRhdGEgbGVuZ3RoIGxhcmdlciB0aGFuIHBhY2tldFxyXG4iLCB1ZHBzdGF0LnVkcHNfYmFkbGVuKTsKKwlscHJpbnQoIiAgJTZkIFVEUCBzb2NrZXQgY2FjaGUgbWlzc2VzXHJcbiIsIHVkcHN0YXQudWRwcHNfcGNiY2FjaGVtaXNzKTsKKwlscHJpbnQoIiAgJTZkIGRhdGFncmFtcyBzZW50XHJcbiIsIHVkcHN0YXQudWRwc19vcGFja2V0cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpY21wc3RhdHModm9pZCkKK3sKKwlscHJpbnQoIiBcclxuIik7CisJbHByaW50KCJJQ01QIHN0YXRzOlxyXG4iKTsKKwlscHJpbnQoIiAgJTZkIElDTVAgcGFja2V0cyByZWNlaXZlZFxyXG4iLCBpY21wc3RhdC5pY3BzX3JlY2VpdmVkKTsKKwlscHJpbnQoIiAgJTZkIHdlcmUgdG9vIHNob3J0XHJcbiIsIGljbXBzdGF0LmljcHNfdG9vc2hvcnQpOworCWxwcmludCgiICAlNmQgd2l0aCBiYWQgY2hlY2tzdW1zXHJcbiIsIGljbXBzdGF0LmljcHNfY2hlY2tzdW0pOworCWxwcmludCgiICAlNmQgd2l0aCB0eXBlIG5vdCBzdXBwb3J0ZWRcclxuIiwgaWNtcHN0YXQuaWNwc19ub3RzdXBwKTsKKwlscHJpbnQoIiAgJTZkIHdpdGggYmFkIHR5cGUgZmVpbGRzXHJcbiIsIGljbXBzdGF0LmljcHNfYmFkdHlwZSk7CisJbHByaW50KCIgICU2ZCBJQ01QIHBhY2tldHMgc2VudCBpbiByZXBseVxyXG4iLCBpY21wc3RhdC5pY3BzX3JlZmxlY3QpOworfQorCitzdGF0aWMgdm9pZAorbWJ1ZnN0YXRzKHZvaWQpCit7CisJc3RydWN0IG1idWYgKm07CisJaW50IGk7CisKKyAgICAgICAgbHByaW50KCIgXHJcbiIpOworCisJbHByaW50KCJNYnVmIHN0YXRzOlxyXG4iKTsKKworCWxwcmludCgiICAlNmQgbWJ1ZnMgYWxsb2NhdGVkICglZCBtYXgpXHJcbiIsIG1idWZfYWxsb2NlZCwgbWJ1Zl9tYXgpOworCisJaSA9IDA7CisJZm9yIChtID0gbV9mcmVlbGlzdC5tX25leHQ7IG0gIT0gJm1fZnJlZWxpc3Q7IG0gPSBtLT5tX25leHQpCisJCWkrKzsKKwlscHJpbnQoIiAgJTZkIG1idWZzIG9uIGZyZWUgbGlzdFxyXG4iLCAgaSk7CisKKwlpID0gMDsKKwlmb3IgKG0gPSBtX3VzZWRsaXN0Lm1fbmV4dDsgbSAhPSAmbV91c2VkbGlzdDsgbSA9IG0tPm1fbmV4dCkKKwkJaSsrOworCWxwcmludCgiICAlNmQgbWJ1ZnMgb24gdXNlZCBsaXN0XHJcbiIsICBpKTsKKyAgICAgICAgbHByaW50KCIgICU2ZCBtYnVmcyBxdWV1ZWQgYXMgcGFja2V0c1xyXG5cclxuIiwgaWZfcXVldWVkKTsKK30KKworc3RhdGljIHZvaWQKK3NvY2tzdGF0cyh2b2lkKQoreworCWNoYXIgYnVmZlsyNTZdOworCWludCBuOworCXN0cnVjdCBzb2NrZXQgKnNvOworCisgICAgICAgIGxwcmludCgiIFxyXG4iKTsKKworCWxwcmludCgKKwkgICAiUHJvdG9bc3RhdGVdICAgICBTb2NrICAgICBMb2NhbCBBZGRyZXNzLCBQb3J0ICBSZW1vdGUgQWRkcmVzcywgUG9ydCBSZWN2USBTZW5kUVxyXG4iKTsKKworCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzby0+c29fbmV4dCkgeworCisJCW4gPSBzcHJpbnRmKGJ1ZmYsICJ0Y3BbJXNdIiwgc28tPnNvX3RjcGNiP3RjcHN0YXRlc1tzby0+c29fdGNwY2ItPnRfc3RhdGVdOiJOT05FIik7CisJCXdoaWxlIChuIDwgMTcpCisJCSAgIGJ1ZmZbbisrXSA9ICcgJzsKKwkJYnVmZlsxN10gPSAwOworCQlscHJpbnQoIiVzICUzZCAgICUxNXMgJTVkICIsCisJCQkJYnVmZiwgc28tPnMsCisJCQkJaW5ldF9udG9hKHNvLT5zb19sYWRkciksIG50b2hzKHNvLT5zb19scG9ydCkpOworCQlscHJpbnQoIiUxNXMgJTVkICU1ZCAlNWRcclxuIiwKKwkJCQlpbmV0X250b2Eoc28tPnNvX2ZhZGRyKSwgbnRvaHMoc28tPnNvX2Zwb3J0KSwKKwkJCQlzby0+c29fcmN2LnNiX2NjLCBzby0+c29fc25kLnNiX2NjKTsKKwl9CisKKwlmb3IgKHNvID0gdWRiLnNvX25leHQ7IHNvICE9ICZ1ZGI7IHNvID0gc28tPnNvX25leHQpIHsKKworCQluID0gc3ByaW50ZihidWZmLCAidWRwWyVkIHNlY10iLCAoc28tPnNvX2V4cGlyZSAtIGN1cnRpbWUpIC8gMTAwMCk7CisJCXdoaWxlIChuIDwgMTcpCisJCSAgIGJ1ZmZbbisrXSA9ICcgJzsKKwkJYnVmZlsxN10gPSAwOworCQlscHJpbnQoIiVzICUzZCAgJTE1cyAlNWQgICIsCisJCQkJYnVmZiwgc28tPnMsCisJCQkJaW5ldF9udG9hKHNvLT5zb19sYWRkciksIG50b2hzKHNvLT5zb19scG9ydCkpOworCQlscHJpbnQoIiUxNXMgJTVkICU1ZCAlNWRcclxuIiwKKwkJCQlpbmV0X250b2Eoc28tPnNvX2ZhZGRyKSwgbnRvaHMoc28tPnNvX2Zwb3J0KSwKKwkJCQlzby0+c29fcmN2LnNiX2NjLCBzby0+c29fc25kLnNiX2NjKTsKKwl9Cit9CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfUUVNVQordm9pZAorc2xpcnBfZXhpdChleGl0X3N0YXR1cykKKwlpbnQgZXhpdF9zdGF0dXM7Cit7CisJc3RydWN0IHR0eXMgKnR0eXA7CisKKwlERUJVR19DQUxMKCJzbGlycF9leGl0Iik7CisJREVCVUdfQVJHKCJleGl0X3N0YXR1cyA9ICVkIiwgZXhpdF9zdGF0dXMpOworCisJaWYgKGRvc3RhdHMpIHsKKwkJbHByaW50X3ByaW50ID0gKGludCAoKikgX1AoKHZvaWQgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSkpdmZwcmludGY7CisJCWlmICghZGZkKQorCQkgICBkZWJ1Z19pbml0KCJzbGlycF9zdGF0cyIsIDB4Zik7CisJCWxwcmludF9hcmcgPSAoY2hhciAqKikmZGZkOworCisJCWlwc3RhdHMoKTsKKwkJdGNwc3RhdHMoKTsKKwkJdWRwc3RhdHMoKTsKKwkJaWNtcHN0YXRzKCk7CisJCW1idWZzdGF0cygpOworCQlzb2Nrc3RhdHMoKTsKKwkJYWxsdHR5c3RhdHMoKTsKKwkJdmpzdGF0cygpOworCX0KKworCWZvciAodHR5cCA9IHR0eXM7IHR0eXA7IHR0eXAgPSB0dHlwLT5uZXh0KQorCSAgIHR0eV9kZXRhY2hlZCh0dHlwLCAxKTsKKworCWlmIChzbGlycF9mb3JrZWQpIHsKKwkJLyogTWVuZW5kZXogdGltZSAqLworCQlpZiAoa2lsbChnZXRwcGlkKCksIFNJR1FVSVQpIDwgMCkKKwkJCWxwcmludCgiQ291bGRuJ3Qga2lsbCBwYXJlbnQgcHJvY2VzcyAlbGQhXG4iLAorCQkJICAgIChsb25nKSBnZXRwcGlkKCkpOworICAgIAl9CisKKwkvKiBSZXN0b3JlIHRoZSB0ZXJtaW5hbCBpZiB3ZSBnb3R0YSAqLworCWlmKHNsaXJwX3R0eV9yZXN0b3JlKQorCSAgdGNzZXRhdHRyKDAsVENTQU5PVywgJnNsaXJwX3R0eV9zZXR0aW5ncyk7ICAvKiBOT1cgREFNTUlUISAqLworCWV4aXQoZXhpdF9zdGF0dXMpOworfQorI2VuZGlmCisKK3ZvaWQKK3NsaXJwX3N0YXRzKHZvaWQpCit7CisjaWZkZWYgTE9HX0VOQUJMRUQKKyAgICBpcHN0YXRzKCk7CisgICAgdGNwc3RhdHMoKTsKKyAgICB1ZHBzdGF0cygpOworICAgIGljbXBzdGF0cygpOworICAgIG1idWZzdGF0cygpOworICAgIHNvY2tzdGF0cygpOworI2Vsc2UKKyAgICBscHJpbnQoIlNMSVJQIHN0YXRpc3RpY3MgY29kZSBub3QgY29tcGlsZWQuXG4iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9kZWJ1Zy5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2VmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2RlYnVnLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjZGVmaW5lIFBSTl9TVERFUlIJMQorI2RlZmluZSBQUk5fU1BSSU5URgkyCisKK2V4dGVybiBGSUxFICpkZmQ7CitleHRlcm4gRklMRSAqbGZkOworZXh0ZXJuIGludCBkb3N0YXRzOworZXh0ZXJuIGludCBzbGlycF9kZWJ1ZzsKKworI2RlZmluZSBEQkdfQ0FMTCAweDEKKyNkZWZpbmUgREJHX01JU0MgMHgyCisjZGVmaW5lIERCR19FUlJPUiAweDQKKyNkZWZpbmUgREVCVUdfREVGQVVMVCBEQkdfQ0FMTHxEQkdfTUlTQ3xEQkdfRVJST1IKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERFQlVHX0NBTEwoeCkgaWYgKHNsaXJwX2RlYnVnICYgREJHX0NBTEwpIHsgZnByaW50ZihkZmQsICIlcy4uLlxuIiwgeCk7IGZmbHVzaChkZmQpOyB9CisjZGVmaW5lIERFQlVHX0FSRyh4LCB5KSBpZiAoc2xpcnBfZGVidWcgJiBEQkdfQ0FMTCkgeyBmcHV0YygnICcsIGRmZCk7IGZwcmludGYoZGZkLCB4LCB5KTsgZnB1dGMoJ1xuJywgZGZkKTsgZmZsdXNoKGRmZCk7IH0KKyNkZWZpbmUgREVCVUdfQVJHUyh4KSBpZiAoc2xpcnBfZGVidWcgJiBEQkdfQ0FMTCkgeyBmcHJpbnRmIHggOyBmZmx1c2goZGZkKTsgfQorI2RlZmluZSBERUJVR19NSVNDKHgpIGlmIChzbGlycF9kZWJ1ZyAmIERCR19NSVNDKSB7IGZwcmludGYgeCA7IGZmbHVzaChkZmQpOyB9CisjZGVmaW5lIERFQlVHX0VSUk9SKHgpIGlmIChzbGlycF9kZWJ1ZyAmIERCR19FUlJPUikge2ZwcmludGYgeCA7IGZmbHVzaChkZmQpOyB9CisKKworI2Vsc2UKKworI2RlZmluZSBERUJVR19DQUxMKHgpCisjZGVmaW5lIERFQlVHX0FSRyh4LCB5KQorI2RlZmluZSBERUJVR19BUkdTKHgpCisjZGVmaW5lIERFQlVHX01JU0MoeCkKKyNkZWZpbmUgREVCVUdfRVJST1IoeCkKKworI2VuZGlmCisKK3ZvaWQgZGVidWdfaW5pdCBfUCgoY2hhciAqLCBpbnQpKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvaWNtcF92YXIuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaWNtcF92YXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ0YzllCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pY21wX3Zhci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaWNtcF92YXIuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpY21wX3Zhci5oLHYgMS40IDE5OTUvMDIvMTYgMDA6Mjc6NDAgd29sbG1hbiBFeHAKKyAqLworCisjaWZuZGVmIF9ORVRJTkVUX0lDTVBfVkFSX0hfCisjZGVmaW5lIF9ORVRJTkVUX0lDTVBfVkFSX0hfCisKKy8qCisgKiBWYXJpYWJsZXMgcmVsYXRlZCB0byB0aGlzIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgaW50ZXJuZXQgY29udHJvbCBtZXNzYWdlIHByb3RvY29sLgorICovCitzdHJ1Y3QgaWNtcHN0YXQgeworLyogc3RhdGlzdGljcyByZWxhdGVkIHRvIGlucHV0IG1lc3NhZ2VzIHByb2Nlc3NlZCAqLworCXVfbG9uZyAgaWNwc19yZWNlaXZlZDsJCS8qICNJQ01QIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJaWNwc190b29zaG9ydDsJCS8qIHBhY2tldCA8IElDTVBfTUlOTEVOICovCisJdV9sb25nCWljcHNfY2hlY2tzdW07CQkvKiBiYWQgY2hlY2tzdW0gKi8KKwl1X2xvbmcJaWNwc19ub3RzdXBwOwkJLyogI0lDTVAgcGFja2V0cyBub3Qgc3VwcG9ydGVkICovCisJdV9sb25nICBpY3BzX2JhZHR5cGU7CQkvKiAjd2l0aCBiYWQgdHlwZSBmZWlsZCAqLworCXVfbG9uZwlpY3BzX3JlZmxlY3Q7CQkvKiBudW1iZXIgb2YgcmVzcG9uc2VzICovCit9OworCisvKgorICogTmFtZXMgZm9yIElDTVAgc3lzY3RsIG9iamVjdHMKKyAqLworI2RlZmluZQlJQ01QQ1RMX01BU0tSRVBMCTEJLyogYWxsb3cgcmVwbGllcyB0byBuZXRtYXNrIHJlcXVlc3RzICovCisjZGVmaW5lCUlDTVBDVExfU1RBVFMJCTIJLyogc3RhdGlzdGljcyAocmVhZC1vbmx5KSAqLworI2RlZmluZSBJQ01QQ1RMX01BWElECQkzCisKKyNkZWZpbmUgSUNNUENUTF9OQU1FUyB7IFwKKwl7IDAsIDAgfSwgXAorCXsgIm1hc2tyZXBsIiwgQ1RMVFlQRV9JTlQgfSwgXAorCXsgInN0YXRzIiwgQ1RMVFlQRV9TVFJVQ1QgfSwgXAorfQorCisjaWZkZWYgTE9HX0VOQUJMRUQKK2V4dGVybiBzdHJ1Y3QgaWNtcHN0YXQgaWNtcHN0YXQ7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL2lmLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmOGE3MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaWYuYwpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKworaW50ICAgICBpZl9xdWV1ZWQgPSAwOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBzbyBmYXIgKi8KKworc3RydWN0ICBtYnVmIGlmX2Zhc3RxOyAgICAgICAgICAgICAgICAgIC8qIGZhc3QgcXVldWUgKGZvciBpbnRlcmFjdGl2ZSBkYXRhKSAqLworc3RydWN0ICBtYnVmIGlmX2JhdGNocTsgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIGZvciBub24taW50ZXJhY3RpdmUgZGF0YSAqLworc3RydWN0CW1idWYgKm5leHRfbTsJCQkvKiBQb2ludGVyIHRvIG5leHQgbWJ1ZiB0byBvdXRwdXQgKi8KKworI2RlZmluZSBpZnNfaW5pdChpZm0pICgoaWZtKS0+aWZzX25leHQgPSAoaWZtKS0+aWZzX3ByZXYgPSAoaWZtKSkKKworc3RhdGljIHZvaWQKK2lmc19pbnNxdWUoc3RydWN0IG1idWYgKmlmbSwgc3RydWN0IG1idWYgKmlmbWhlYWQpCit7CisJaWZtLT5pZnNfbmV4dCA9IGlmbWhlYWQtPmlmc19uZXh0OworCWlmbWhlYWQtPmlmc19uZXh0ID0gaWZtOworCWlmbS0+aWZzX3ByZXYgPSBpZm1oZWFkOworCWlmbS0+aWZzX25leHQtPmlmc19wcmV2ID0gaWZtOworfQorCitzdGF0aWMgdm9pZAoraWZzX3JlbXF1ZShzdHJ1Y3QgbWJ1ZiAqaWZtKQoreworCWlmbS0+aWZzX3ByZXYtPmlmc19uZXh0ID0gaWZtLT5pZnNfbmV4dDsKKwlpZm0tPmlmc19uZXh0LT5pZnNfcHJldiA9IGlmbS0+aWZzX3ByZXY7Cit9CisKK3ZvaWQKK2lmX2luaXQodm9pZCkKK3sKKwlpZl9mYXN0cS5pZnFfbmV4dCA9IGlmX2Zhc3RxLmlmcV9wcmV2ID0gJmlmX2Zhc3RxOworCWlmX2JhdGNocS5pZnFfbmV4dCA9IGlmX2JhdGNocS5pZnFfcHJldiA9ICZpZl9iYXRjaHE7CisgICAgICAgIC8vCXNsX2NvbXByZXNzX2luaXQoJmNvbXBfcyk7CisJbmV4dF9tID0gJmlmX2JhdGNocTsKK30KKworI2lmIDAKKy8qCisgKiBUaGlzIHNob3VsZG4ndCBiZSBuZWVkZWQgc2luY2UgdGhlIG1vZGVtIGlzIGJsb2NraW5nIGFuZAorICogd2UgZG9uJ3QgZXhwZWN0IGFueSBzaWduYWxzLCBidXQgd2hhdCB0aGUgaGVsbC4uCisgKi8KK2lubGluZSBpbnQKK3dyaXRlbihmZCwgYnB0ciwgbikKKwlpbnQgZmQ7CisJY2hhciAqYnB0cjsKKwlpbnQgbjsKK3sKKwlpbnQgcmV0OworCWludCB0b3RhbDsKKworCS8qIFRoaXMgc2hvdWxkIHN1Y2NlZWQgbW9zdCBvZiB0aGUgdGltZSAqLworCXJldCA9IHNlbmQoZmQsIGJwdHIsIG4sMCk7CisJaWYgKHJldCA9PSBuIHx8IHJldCA8PSAwKQorCSAgIHJldHVybiByZXQ7CisKKwkvKiBEaWRuJ3Qgd3JpdGUgZXZlcnl0aGluZywgZ28gaW50byB0aGUgbG9vcCAqLworCXRvdGFsID0gcmV0OworCXdoaWxlIChuID4gdG90YWwpIHsKKwkJcmV0ID0gc2VuZChmZCwgYnB0cit0b3RhbCwgbi10b3RhbCwwKTsKKwkJaWYgKHJldCA8PSAwKQorCQkgICByZXR1cm4gcmV0OworCQl0b3RhbCArPSByZXQ7CisJfQorCXJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIGlmX2lucHV0IC0gcmVhZCgpIHRoZSB0dHksIGRvICJ0b3AgbGV2ZWwiIHByb2Nlc3NpbmcgKGllOiBjaGVjayBmb3IgYW55IGVzY2FwZXMpLAorICogYW5kIHBhc3Mgb250byAoKnR0eXAtPmlmX2lucHV0KQorICoKKyAqIFhYWFhYIEFueSB6ZXJvcyBhcnJpdmluZyBieSB0aGVtc2VsdmVzIGFyZSBOT1QgcGxhY2VkIGludG8gdGhlIGFycml2aW5nIHBhY2tldC4KKyAqLworI2RlZmluZSBJTkJVRkZfU0laRSAyMDQ4IC8qIFhYWCAqLwordm9pZAoraWZfaW5wdXQodHR5cCkKKwlzdHJ1Y3QgdHR5cyAqdHR5cDsKK3sKKwl1X2NoYXIgaWZfaW5idWZmW0lOQlVGRl9TSVpFXTsKKwlpbnQgaWZfbjsKKworCURFQlVHX0NBTEwoImlmX2lucHV0Iik7CisJREVCVUdfQVJHKCJ0dHlwID0gJWx4IiwgKGxvbmcpdHR5cCk7CisKKwlpZl9uID0gcmVjdih0dHlwLT5mZCwgKGNoYXIgKilpZl9pbmJ1ZmYsIElOQlVGRl9TSVpFLDApOworCisJREVCVUdfTUlTQygoZGZkLCAiIHJlYWQgJWQgYnl0ZXNcbiIsIGlmX24pKTsKKworCWlmIChpZl9uIDw9IDApIHsKKwkJaWYgKGlmX24gPT0gMCB8fCAoZXJybm8gIT0gRUlOVFIgJiYgZXJybm8gIT0gRUFHQUlOKSkgeworCQkJaWYgKHR0eXAtPnVwKQorCQkJICAgbGlua191cC0tOworCQkJdHR5X2RldGFjaGVkKHR0eXAsIDApOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKGlmX24gPT0gMSkgeworCQlpZiAoKmlmX2luYnVmZiA9PSAnMCcpIHsKKwkJCXR0eXAtPm9uZXMgPSAwOworCQkJaWYgKCsrdHR5cC0+emVyb3MgPj0gNSkKKwkJCSAgIHNsaXJwX2V4aXQoMCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKCppZl9pbmJ1ZmYgPT0gJzEnKSB7CisJCQl0dHlwLT56ZXJvcyA9IDA7CisJCQlpZiAoKyt0dHlwLT5vbmVzID49IDUpCisJCQkgICB0dHlfZGV0YWNoZWQodHR5cCwgMCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJdHR5cC0+b25lcyA9IHR0eXAtPnplcm9zID0gMDsKKworCSgqdHR5cC0+aWZfaW5wdXQpKHR0eXAsIGlmX2luYnVmZiwgaWZfbik7Cit9CisjZW5kaWYKKworLyoKKyAqIGlmX291dHB1dDogUXVldWUgcGFja2V0IGludG8gYW4gb3V0cHV0IHF1ZXVlLgorICogVGhlcmUgYXJlIDIgb3V0cHV0IHF1ZXVlJ3MsIGlmX2Zhc3RxIGFuZCBpZl9iYXRjaHEuCisgKiBFYWNoIG91dHB1dCBxdWV1ZSBpcyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBkb3VibGUgbGlua2VkIGxpc3RzCisgKiBvZiBtYnVmcywgZWFjaCBsaXN0IGJlbG9uZ2luZyB0byBvbmUgInNlc3Npb24iIChzb2NrZXQpLiAgVGhpcworICogd2F5LCB3ZSBjYW4gb3V0cHV0IHBhY2tldHMgZmFpcmx5IGJ5IHNlbmRpbmcgb25lIHBhY2tldCBmcm9tIGVhY2gKKyAqIHNlc3Npb24sIGluc3RlYWQgb2YgYWxsIHRoZSBwYWNrZXRzIGZyb20gb25lIHNlc3Npb24sIHRoZW4gYWxsIHBhY2tldHMKKyAqIGZyb20gdGhlIG5leHQgc2Vzc2lvbiwgZXRjLiAgUGFja2V0cyBvbiB0aGUgaWZfZmFzdHEgZ2V0IGFic29sdXRlCisgKiBwcmlvcml0eSwgYnV0IGlmIG9uZSBzZXNzaW9uIGhvZ3MgdGhlIGxpbmssIGl0IGdldHMgImRvd25ncmFkZWQiCisgKiB0byB0aGUgYmF0Y2hxIHVudGlsIGl0IHJ1bnMgb3V0IG9mIHBhY2tldHMsIHRoZW4gaXQnbGwgcmV0dXJuCisgKiB0byB0aGUgZmFzdHEgKGVnLiBpZiB0aGUgdXNlciBkb2VzIGFuIGxzIC1hbFIgaW4gYSB0ZWxuZXQgc2Vzc2lvbiwKKyAqIGl0J2xsIHRlbXBvcmFyaWx5IGdldCBkb3duZ3JhZGVkIHRvIHRoZSBiYXRjaHEpCisgKi8KK3ZvaWQKK2lmX291dHB1dChzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IG1idWYgKmlmbSkKK3sKKwlzdHJ1Y3QgbWJ1ZiAqaWZxOworCWludCBvbl9mYXN0cSA9IDE7CisKKwlERUJVR19DQUxMKCJpZl9vdXRwdXQiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcpc28pOworCURFQlVHX0FSRygiaWZtID0gJWx4IiwgKGxvbmcpaWZtKTsKKworCS8qCisJICogRmlyc3QgcmVtb3ZlIHRoZSBtYnVmIGZyb20gbV91c2VkbGlzdCwKKwkgKiBzaW5jZSB3ZSdyZSBnb25uYSB1c2UgbV9uZXh0IGFuZCBtX3ByZXYgb3Vyc2VsdmVzCisJICogWFhYIFNob3VsZG4ndCBuZWVkIHRoaXMsIGdvdHRhIGNoYW5nZSBkdG9tKCkgZXRjLgorCSAqLworCWlmIChpZm0tPm1fZmxhZ3MgJiBNX1VTRURMSVNUKSB7CisJCXJlbXF1ZShpZm0pOworCQlpZm0tPm1fZmxhZ3MgJj0gfk1fVVNFRExJU1Q7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgdGhlcmUncyBhbHJlYWR5IGEgYmF0Y2hxIGxpc3QgZm9yIHRoaXMgc2Vzc2lvbi4KKwkgKiBUaGlzIGNhbiBpbmNsdWRlIGFuIGludGVyYWN0aXZlIHNlc3Npb24sIHdoaWNoIHNob3VsZCBnbyBvbiBmYXN0cSwKKwkgKiBidXQgZ2V0cyB0b28gZ3JlZWR5Li4uIGhlbmNlIGl0J2xsIGJlIGRvd25ncmFkZWQgZnJvbSBmYXN0cSB0byBiYXRjaHEuCisJICogV2UgbXVzdG4ndCBwdXQgdGhpcyBwYWNrZXQgYmFjayBvbiB0aGUgZmFzdHEgKG9yIHdlJ2xsIHNlbmQgaXQgb3V0IG9mIG9yZGVyKQorCSAqIFhYWCBhZGQgY2FjaGUgaGVyZT8KKwkgKi8KKwlmb3IgKGlmcSA9IGlmX2JhdGNocS5pZnFfcHJldjsgaWZxICE9ICZpZl9iYXRjaHE7IGlmcSA9IGlmcS0+aWZxX3ByZXYpIHsKKwkJaWYgKHNvID09IGlmcS0+aWZxX3NvKSB7CisJCQkvKiBBIG1hdGNoISAqLworCQkJaWZtLT5pZnFfc28gPSBzbzsKKwkJCWlmc19pbnNxdWUoaWZtLCBpZnEtPmlmc19wcmV2KTsKKwkJCWdvdG8gZGlkZGl0OworCQl9CisJfQorCisJLyogTm8gbWF0Y2gsIGNoZWNrIHdoaWNoIHF1ZXVlIHRvIHB1dCBpdCBvbiAqLworCWlmIChzbyAmJiAoc28tPnNvX2lwdG9zICYgSVBUT1NfTE9XREVMQVkpKSB7CisJCWlmcSA9IGlmX2Zhc3RxLmlmcV9wcmV2OworCQlvbl9mYXN0cSA9IDE7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoaXMgcGFja2V0IGlzIGEgcGFydCBvZiB0aGUgbGFzdAorCQkgKiBwYWNrZXQncyBzZXNzaW9uCisJCSAqLworCQlpZiAoaWZxLT5pZnFfc28gPT0gc28pIHsKKwkJCWlmbS0+aWZxX3NvID0gc287CisJCQlpZnNfaW5zcXVlKGlmbSwgaWZxLT5pZnNfcHJldik7CisJCQlnb3RvIGRpZGRpdDsKKwkJfQorCX0gZWxzZQorCQlpZnEgPSBpZl9iYXRjaHEuaWZxX3ByZXY7CisKKwkvKiBDcmVhdGUgYSBuZXcgZG91Ymx5IGxpbmtlZCBsaXN0IGZvciB0aGlzIHNlc3Npb24gKi8KKwlpZm0tPmlmcV9zbyA9IHNvOworCWlmc19pbml0KGlmbSk7CisJaW5zcXVlKGlmbSwgaWZxKTsKKworZGlkZGl0OgorCSsraWZfcXVldWVkOworCisJaWYgKHNvKSB7CisJCS8qIFVwZGF0ZSAqX3F1ZXVlZCAqLworCQlzby0+c29fcXVldWVkKys7CisJCXNvLT5zb19ucXVldWVkKys7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHNob3VsZCBiZSBkb3duZ3JhZGVkIHRvCisJCSAqIHRoZSBiYXRjaHEuICBBIHNlc3Npb24gaXMgZG93bmdyYWRlZCBpZiBpdCBoYXMgcXVldWVkIDYKKwkJICogcGFja2V0cyB3aXRob3V0IHBhdXNpbmcsIGFuZCBhdCBsZWFzdCAzIG9mIHRob3NlIHBhY2tldHMKKwkJICogaGF2ZSBiZWVuIHNlbnQgb3ZlciB0aGUgbGluaworCQkgKiAoWFhYIFRoZXNlIGFyZSBhcmJpdHJhcnkgbnVtYmVycywgcHJvYmFibHkgbm90IG9wdGltYWwuLikKKwkJICovCisJCWlmIChvbl9mYXN0cSAmJiAoKHNvLT5zb19ucXVldWVkID49IDYpICYmCisJCQkJIChzby0+c29fbnF1ZXVlZCAtIHNvLT5zb19xdWV1ZWQpID49IDMpKSB7CisKKwkJCS8qIFJlbW92ZSBmcm9tIGN1cnJlbnQgcXVldWUuLi4gKi8KKwkJCXJlbXF1ZShpZm0tPmlmc19uZXh0KTsKKworCQkJLyogLi4uQW5kIGluc2VydCBpbiB0aGUgbmV3LiAgVGhhdCdsbCB0ZWFjaCB5YSEgKi8KKwkJCWluc3F1ZShpZm0tPmlmc19uZXh0LCAmaWZfYmF0Y2hxKTsKKwkJfQorCX0KKworI2lmbmRlZiBGVUxMX0JPTFQKKwkvKgorCSAqIFRoaXMgcHJldmVudHMgdXMgZnJvbSBtYWxsb2MoKWluZyB0b28gbWFueSBtYnVmcworCSAqLworCWlmIChsaW5rX3VwKSB7CisJCS8qIGlmX3N0YXJ0IHdpbGwgY2hlY2sgdG93cml0ZSAqLworCQlpZl9zdGFydCgpOworCX0KKyNlbmRpZgorfQorCisvKgorICogU2VuZCBhIHBhY2tldAorICogV2UgY2hvb3NlIGEgcGFja2V0IGJhc2VkIG9uIGl0J3MgcG9zaXRpb24gaW4gdGhlIG91dHB1dCBxdWV1ZXM7CisgKiBJZiB0aGVyZSBhcmUgcGFja2V0cyBvbiB0aGUgZmFzdHEsIHRoZXkgYXJlIHNlbnQgRklGTywgYmVmb3JlCisgKiBldmVyeXRoaW5nIGVsc2UuICBPdGhlcndpc2Ugd2UgY2hvb3NlIHRoZSBmaXJzdCBwYWNrZXQgZnJvbSB0aGUKKyAqIGJhdGNocSBhbmQgc2VuZCBpdC4gIHRoZSBuZXh0IHBhY2tldCBjaG9zZW4gd2lsbCBiZSBmcm9tIHRoZSBzZXNzaW9uCisgKiBhZnRlciB0aGlzIG9uZSwgdGhlbiB0aGUgc2Vzc2lvbiBhZnRlciB0aGF0IG9uZSwgYW5kIHNvIG9uLi4gIFNvLAorICogZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGFyZSAzIGZ0cCBzZXNzaW9uJ3MgZmlnaHRpbmcgZm9yIGJhbmR3aWR0aCwKKyAqIG9uZSBwYWNrZXQgd2lsbCBiZSBzZW50IGZyb20gdGhlIGZpcnN0IHNlc3Npb24sIHRoZW4gb25lIHBhY2tldAorICogZnJvbSB0aGUgc2Vjb25kIHNlc3Npb24sIHRoZW4gb25lIHBhY2tldCBmcm9tIHRoZSB0aGlyZCwgdGhlbiBiYWNrCisgKiB0byB0aGUgZmlyc3QsIGV0Yy4gZXRjLgorICovCit2b2lkCitpZl9zdGFydCh2b2lkKQoreworCXN0cnVjdCBtYnVmICppZm0sICppZnF0OworCisJREVCVUdfQ0FMTCgiaWZfc3RhcnQiKTsKKworCWlmIChpZl9xdWV1ZWQgPT0gMCkKKwkgICByZXR1cm47IC8qIE5vdGhpbmcgdG8gZG8gKi8KKworIGFnYWluOgorICAgICAgICAvKiBjaGVjayBpZiB3ZSBjYW4gcmVhbGx5IG91dHB1dCAqLworICAgICAgICBpZiAoIXNsaXJwX2Nhbl9vdXRwdXQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworCS8qCisJICogU2VlIHdoaWNoIHF1ZXVlIHRvIGdldCBuZXh0IHBhY2tldCBmcm9tCisJICogSWYgdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIGZhc3RxLCBzZWxlY3QgaXQgaW1tZWRpYXRlbHkKKwkgKi8KKwlpZiAoaWZfZmFzdHEuaWZxX25leHQgIT0gJmlmX2Zhc3RxKSB7CisJCWlmbSA9IGlmX2Zhc3RxLmlmcV9uZXh0OworCX0gZWxzZSB7CisJCS8qIE5vdGhpbmcgb24gZmFzdHEsIHNlZSBpZiBuZXh0X20gaXMgdmFsaWQgKi8KKwkJaWYgKG5leHRfbSAhPSAmaWZfYmF0Y2hxKQorCQkgICBpZm0gPSBuZXh0X207CisJCWVsc2UKKwkJICAgaWZtID0gaWZfYmF0Y2hxLmlmcV9uZXh0OworCisJCS8qIFNldCB3aGljaCBwYWNrZXQgdG8gc2VuZCBvbiBuZXh0IGl0ZXJhdGlvbiAqLworCQluZXh0X20gPSBpZm0tPmlmcV9uZXh0OworCX0KKwkvKiBSZW1vdmUgaXQgZnJvbSB0aGUgcXVldWUgKi8KKwlpZnF0ID0gaWZtLT5pZnFfcHJldjsKKwlyZW1xdWUoaWZtKTsKKwktLWlmX3F1ZXVlZDsKKworCS8qIElmIHRoZXJlIGFyZSBtb3JlIHBhY2tldHMgZm9yIHRoaXMgc2Vzc2lvbiwgcmUtcXVldWUgdGhlbSAqLworCWlmIChpZm0tPmlmc19uZXh0ICE9IC8qIGlmbS0+aWZzX3ByZXYgIT0gKi8gaWZtKSB7CisJCWluc3F1ZShpZm0tPmlmc19uZXh0LCBpZnF0KTsKKwkJaWZzX3JlbXF1ZShpZm0pOworCX0KKworCS8qIFVwZGF0ZSBzb19xdWV1ZWQgKi8KKwlpZiAoaWZtLT5pZnFfc28pIHsKKwkJaWYgKC0taWZtLT5pZnFfc28tPnNvX3F1ZXVlZCA9PSAwKQorCQkgICAvKiBJZiB0aGVyZSdzIG5vIG1vcmUgcXVldWVkLCByZXNldCBucXVldWVkICovCisJCSAgIGlmbS0+aWZxX3NvLT5zb19ucXVldWVkID0gMDsKKwl9CisKKwkvKiBFbmNhcHN1bGF0ZSB0aGUgcGFja2V0IGZvciBzZW5kaW5nICovCisgICAgICAgIGlmX2VuY2FwKCh1aW50OF90ICopaWZtLT5tX2RhdGEsIGlmbS0+bV9sZW4pOworCisgICAgICAgIG1fZnJlZShpZm0pOworCisJaWYgKGlmX3F1ZXVlZCkKKwkgICBnb3RvIGFnYWluOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9pZi5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2lmLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaWZuZGVmIF9JRl9IXworI2RlZmluZSBfSUZfSF8KKworI2RlZmluZSBJRl9DT01QUkVTUwkweDAxCS8qIFdlIHdhbnQgY29tcHJlc3Npb24gKi8KKyNkZWZpbmUgSUZfTk9DT01QUkVTUwkweDAyCS8qIERvIG5vdCBkbyBjb21wcmVzc2lvbiAqLworI2RlZmluZSBJRl9BVVRPQ09NUAkweDA0CS8qIEF1dG9kZXRlY3QgKGRlZmF1bHQpICovCisjZGVmaW5lIElGX05PQ0lEQ09NUAkweDA4CS8qIENJRCBjb21wcmVzc2lvbiAqLworCisjZGVmaW5lIElGX01UVSAxNTAwCisjZGVmaW5lIElGX01SVSAxNTAwCisjZGVmaW5lCUlGX0NPTVAgSUZfQVVUT0NPTVAJLyogRmxhZ3MgZm9yIGNvbXByZXNzaW9uICovCisKKyNpZiAwCisvKgorICogU2V0IGlmX21heGxpbmtoZHIgdG8gNDggYmVjYXVzZSBpdCdzIDQwIGJ5dGVzIGZvciBUQ1AvSVAsCisgKiBhbmQgOCBieXRlcyBmb3IgUFBQLCBidXQgbmVlZCB0byBoYXZlIGl0IG9uIGFuIDhieXRlIGJvdW5kYXJ5CisgKi8KKyNpZmRlZiBVU0VfUFBQCisjZGVmaW5lIElGX01BWExJTktIRFIgNDgKKyNlbHNlCisjZGVmaW5lIElGX01BWExJTktIRFIgNDAKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgLyogMiBmb3IgYWxpZ25tZW50LCAxNCBmb3IgZXRoZXJuZXQsIDQwIGZvciBUQ1AvSVAgKi8KKyNkZWZpbmUgSUZfTUFYTElOS0hEUiAoMiArIDE0ICsgNDApCisjZW5kaWYKKworZXh0ZXJuIGludAlpZl9xdWV1ZWQ7CS8qIE51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBzbyBmYXIgKi8KKworZXh0ZXJuCXN0cnVjdCBtYnVmIGlmX2Zhc3RxOyAgICAgICAgICAgICAgICAgIC8qIGZhc3QgcXVldWUgKGZvciBpbnRlcmFjdGl2ZSBkYXRhKSAqLworZXh0ZXJuCXN0cnVjdCBtYnVmIGlmX2JhdGNocTsgICAgICAgICAgICAgICAgIC8qIHF1ZXVlIGZvciBub24taW50ZXJhY3RpdmUgZGF0YSAqLworZXh0ZXJuCXN0cnVjdCBtYnVmICpuZXh0X207CisKKyNkZWZpbmUgaWZzX2luaXQoaWZtKSAoKGlmbSktPmlmc19uZXh0ID0gKGlmbSktPmlmc19wcmV2ID0gKGlmbSkpCisKKyNpZmRlZiBMT0dfRU5BQkxFRAorLyogSW50ZXJmYWNlIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBzbGlycF9pZnN0YXRzIHsKKwl1X2ludCBvdXRfcGt0czsJCS8qIE91dHB1dCBwYWNrZXRzICovCisJdV9pbnQgb3V0X2J5dGVzOwkJLyogT3V0cHV0IGJ5dGVzICovCisJdV9pbnQgb3V0X2VycnBrdHM7CS8qIE91dHB1dCBFcnJvciBQYWNrZXRzICovCisJdV9pbnQgb3V0X2VycmJ5dGVzOwkvKiBPdXRwdXQgRXJyb3IgQnl0ZXMgKi8KKwl1X2ludCBpbl9wa3RzOwkJLyogSW5wdXQgcGFja2V0cyAqLworCXVfaW50IGluX2J5dGVzOwkJLyogSW5wdXQgYnl0ZXMgKi8KKwl1X2ludCBpbl9lcnJwa3RzOwkJLyogSW5wdXQgRXJyb3IgUGFja2V0cyAqLworCXVfaW50IGluX2VycmJ5dGVzOwkvKiBJbnB1dCBFcnJvciBCeXRlcyAqLworCisJdV9pbnQgYnl0ZXNfc2F2ZWQ7CS8qIE51bWJlciBvZiBieXRlcyB0aGF0IGNvbXByZXNzaW9uICJzYXZlZCIgKi8KKwkJCQkvKiBpZTogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgZGlkbid0IG5lZWQgdG8gYmUgc2VudCBvdmVyIHRoZSBsaW5rCisJCQkJICogYmVjYXVzZSBvZiBjb21wcmVzc2lvbiAqLworCisJdV9pbnQgaW5fbWJhZDsJCS8qIEJhZCBpbmNvbWluZyBwYWNrZXRzICovCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9pcC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMDcxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2lwLmgKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpcC5oLHYgMS4zIDE5OTQvMDgvMjEgMDU6Mjc6MzAgcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9JUF9IXworI2RlZmluZSBfSVBfSF8KKworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisjIGlmbmRlZiBOVE9ITAorIyAgZGVmaW5lIE5UT0hMKGQpCisjIGVuZGlmCisjIGlmbmRlZiBOVE9IUworIyAgZGVmaW5lIE5UT0hTKGQpCisjIGVuZGlmCisjIGlmbmRlZiBIVE9OTAorIyAgZGVmaW5lIEhUT05MKGQpCisjIGVuZGlmCisjIGlmbmRlZiBIVE9OUworIyAgZGVmaW5lIEhUT05TKGQpCisjIGVuZGlmCisjZWxzZQorIyBpZm5kZWYgTlRPSEwKKyMgIGRlZmluZSBOVE9ITChkKSAoKGQpID0gbnRvaGwoKGQpKSkKKyMgZW5kaWYKKyMgaWZuZGVmIE5UT0hTCisjICBkZWZpbmUgTlRPSFMoZCkgKChkKSA9IG50b2hzKCh1X2ludDE2X3QpKGQpKSkKKyMgZW5kaWYKKyMgaWZuZGVmIEhUT05MCisjICBkZWZpbmUgSFRPTkwoZCkgKChkKSA9IGh0b25sKChkKSkpCisjIGVuZGlmCisjIGlmbmRlZiBIVE9OUworIyAgZGVmaW5lIEhUT05TKGQpICgoZCkgPSBodG9ucygodV9pbnQxNl90KShkKSkpCisjIGVuZGlmCisjZW5kaWYKKwordHlwZWRlZiB1X2ludDMyX3Qgbl9sb25nOyAgICAgICAgICAgICAgICAgLyogbG9uZyBhcyByZWNlaXZlZCBmcm9tIHRoZSBuZXQgKi8KKworLyoKKyAqIERlZmluaXRpb25zIGZvciBpbnRlcm5ldCBwcm90b2NvbCB2ZXJzaW9uIDQuCisgKiBQZXIgUkZDIDc5MSwgU2VwdGVtYmVyIDE5ODEuCisgKi8KKyNkZWZpbmUJSVBWRVJTSU9OCTQKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpbnRlcm5ldCBoZWFkZXIsIG5ha2VkIG9mIG9wdGlvbnMuCisgKi8KK3N0cnVjdCBpcCB7CisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKwl1X2ludCBpcF92OjQsCQkJLyogdmVyc2lvbiAqLworCQlpcF9obDo0OwkJLyogaGVhZGVyIGxlbmd0aCAqLworI2Vsc2UKKwl1X2ludCBpcF9obDo0LAkJLyogaGVhZGVyIGxlbmd0aCAqLworCQlpcF92OjQ7CQkJLyogdmVyc2lvbiAqLworI2VuZGlmCisJdV9pbnQ4X3QgaXBfdG9zOwkJCS8qIHR5cGUgb2Ygc2VydmljZSAqLworCXVfaW50MTZfdAlpcF9sZW47CQkJLyogdG90YWwgbGVuZ3RoICovCisJdV9pbnQxNl90CWlwX2lkOwkJCS8qIGlkZW50aWZpY2F0aW9uICovCisJdV9pbnQxNl90CWlwX29mZjsJCQkvKiBmcmFnbWVudCBvZmZzZXQgZmllbGQgKi8KKyNkZWZpbmUJSVBfREYgMHg0MDAwCQkJLyogZG9uJ3QgZnJhZ21lbnQgZmxhZyAqLworI2RlZmluZQlJUF9NRiAweDIwMDAJCQkvKiBtb3JlIGZyYWdtZW50cyBmbGFnICovCisjZGVmaW5lCUlQX09GRk1BU0sgMHgxZmZmCQkvKiBtYXNrIGZvciBmcmFnbWVudGluZyBiaXRzICovCisJdV9pbnQ4X3QgaXBfdHRsOwkJCS8qIHRpbWUgdG8gbGl2ZSAqLworCXVfaW50OF90IGlwX3A7CQkJLyogcHJvdG9jb2wgKi8KKwl1X2ludDE2X3QJaXBfc3VtOwkJCS8qIGNoZWNrc3VtICovCisJc3RydWN0CWluX2FkZHIgaXBfc3JjLGlwX2RzdDsJLyogc291cmNlIGFuZCBkZXN0IGFkZHJlc3MgKi8KK307CisKKyNkZWZpbmUJSVBfTUFYUEFDS0VUCTY1NTM1CQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCisKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgSVAgdHlwZSBvZiBzZXJ2aWNlIChpcF90b3MpCisgKi8KKyNkZWZpbmUJSVBUT1NfTE9XREVMQVkJCTB4MTAKKyNkZWZpbmUJSVBUT1NfVEhST1VHSFBVVAkweDA4CisjZGVmaW5lCUlQVE9TX1JFTElBQklMSVRZCTB4MDQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBvcHRpb25zLgorICovCisjZGVmaW5lCUlQT1BUX0NPUElFRChvKQkJKChvKSYweDgwKQorI2RlZmluZQlJUE9QVF9DTEFTUyhvKQkJKChvKSYweDYwKQorI2RlZmluZQlJUE9QVF9OVU1CRVIobykJCSgobykmMHgxZikKKworI2RlZmluZQlJUE9QVF9DT05UUk9MCQkweDAwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMQkJMHgyMAorI2RlZmluZQlJUE9QVF9ERUJNRUFTCQkweDQwCisjZGVmaW5lCUlQT1BUX1JFU0VSVkVEMgkJMHg2MAorCisjZGVmaW5lCUlQT1BUX0VPTAkJMAkJLyogZW5kIG9mIG9wdGlvbiBsaXN0ICovCisjZGVmaW5lCUlQT1BUX05PUAkJMQkJLyogbm8gb3BlcmF0aW9uICovCisKKyNkZWZpbmUJSVBPUFRfUlIJCTcJCS8qIHJlY29yZCBwYWNrZXQgcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfVFMJCTY4CQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSVBPUFRfU0VDVVJJVFkJCTEzMAkJLyogcHJvdmlkZSBzLGMsaCx0Y2MgKi8KKyNkZWZpbmUJSVBPUFRfTFNSUgkJMTMxCQkvKiBsb29zZSBzb3VyY2Ugcm91dGUgKi8KKyNkZWZpbmUJSVBPUFRfU0FUSUQJCTEzNgkJLyogc2F0bmV0IGlkICovCisjZGVmaW5lCUlQT1BUX1NTUlIJCTEzNwkJLyogc3RyaWN0IHNvdXJjZSByb3V0ZSAqLworCisvKgorICogT2Zmc2V0cyB0byBmaWVsZHMgaW4gb3B0aW9ucyBvdGhlciB0aGFuIEVPTCBhbmQgTk9QLgorICovCisjZGVmaW5lCUlQT1BUX09QVFZBTAkJMAkJLyogb3B0aW9uIElEICovCisjZGVmaW5lCUlQT1BUX09MRU4JCTEJCS8qIG9wdGlvbiBsZW5ndGggKi8KKyNkZWZpbmUgSVBPUFRfT0ZGU0VUCQkyCQkvKiBvZmZzZXQgd2l0aGluIG9wdGlvbiAqLworI2RlZmluZQlJUE9QVF9NSU5PRkYJCTQJCS8qIG1pbiB2YWx1ZSBvZiBhYm92ZSAqLworCisvKgorICogVGltZSBzdGFtcCBvcHRpb24gc3RydWN0dXJlLgorICovCitzdHJ1Y3QJaXBfdGltZXN0YW1wIHsKKwl1X2ludDhfdAlpcHRfY29kZTsJCS8qIElQT1BUX1RTICovCisJdV9pbnQ4X3QJaXB0X2xlbjsJCS8qIHNpemUgb2Ygc3RydWN0dXJlICh2YXJpYWJsZSkgKi8KKwl1X2ludDhfdAlpcHRfcHRyOwkJLyogaW5kZXggb2YgY3VycmVudCBlbnRyeSAqLworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisJdV9pbnQJaXB0X29mbHc6NCwJCS8qIG92ZXJmbG93IGNvdW50ZXIgKi8KKwkJaXB0X2ZsZzo0OwkJLyogZmxhZ3MsIHNlZSBiZWxvdyAqLworI2Vsc2UKKwl1X2ludAlpcHRfZmxnOjQsCQkvKiBmbGFncywgc2VlIGJlbG93ICovCisJCWlwdF9vZmx3OjQ7CQkvKiBvdmVyZmxvdyBjb3VudGVyICovCisjZW5kaWYKKwl1bmlvbiBpcHRfdGltZXN0YW1wIHsKKwkJbl9sb25nCWlwdF90aW1lWzFdOworCQlzdHJ1Y3QJaXB0X3RhIHsKKwkJCXN0cnVjdCBpbl9hZGRyIGlwdF9hZGRyOworCQkJbl9sb25nIGlwdF90aW1lOworCQl9IGlwdF90YVsxXTsKKwl9IGlwdF90aW1lc3RhbXA7Cit9OworCisvKiBmbGFnIGJpdHMgZm9yIGlwdF9mbGcgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCQkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KKyNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLworI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KKworLyogYml0cyBmb3Igc2VjdXJpdHkgKG5vdCBieXRlIHN3YXBwZWQpICovCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1VOQ0xBU1MJMHgwMDAwCisjZGVmaW5lCUlQT1BUX1NFQ1VSX0NPTkZJRAkweGYxMzUKKyNkZWZpbmUJSVBPUFRfU0VDVVJfRUZUTwkweDc4OWEKKyNkZWZpbmUJSVBPUFRfU0VDVVJfTU1NTQkweGJjNGQKKyNkZWZpbmUJSVBPUFRfU0VDVVJfUkVTVFIJMHhhZjEzCisjZGVmaW5lCUlQT1BUX1NFQ1VSX1NFQ1JFVAkweGQ3ODgKKyNkZWZpbmUJSVBPUFRfU0VDVVJfVE9QU0VDUkVUCTB4NmJjNQorCisvKgorICogSW50ZXJuZXQgaW1wbGVtZW50YXRpb24gcGFyYW1ldGVycy4KKyAqLworI2RlZmluZQlNQVhUVEwJCTI1NQkJLyogbWF4aW11bSB0aW1lIHRvIGxpdmUgKHNlY29uZHMpICovCisjZGVmaW5lCUlQREVGVFRMCTY0CQkvKiBkZWZhdWx0IHR0bCwgZnJvbSBSRkMgMTM0MCAqLworI2RlZmluZQlJUEZSQUdUVEwJNjAJCS8qIHRpbWUgdG8gbGl2ZSBmb3IgZnJhZ3MsIHNsb3doeiAqLworI2RlZmluZQlJUFRUTERFQwkxCQkvKiBzdWJ0cmFjdGVkIHdoZW4gZm9yd2FyZGluZyAqLworCisjZGVmaW5lCUlQX01TUwkJNTc2CQkvKiBkZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplICovCisKKyNpZiBTSVpFT0ZfQ0hBUl9QID09IDQKK3N0cnVjdCBtYnVmX3B0ciB7CisJc3RydWN0IG1idWYgKm1wdHI7CisJdWludDMyX3QgZHVtbXk7Cit9OworI2Vsc2UKK3N0cnVjdCBtYnVmX3B0ciB7CisJc3RydWN0IG1idWYgKm1wdHI7Cit9OworI2VuZGlmCitzdHJ1Y3QgcWxpbmsgeworCXZvaWQgKm5leHQsICpwcmV2OworfTsKKworLyoKKyAqIE92ZXJsYXkgZm9yIGlwIGhlYWRlciB1c2VkIGJ5IG90aGVyIHByb3RvY29scyAodGNwLCB1ZHApLgorICovCitzdHJ1Y3QgaXBvdmx5IHsKKwlzdHJ1Y3QgbWJ1Zl9wdHIgaWhfbWJ1ZjsJLyogYmFja3BvaW50ZXIgdG8gbWJ1ZiAqLworCXVfaW50OF90CWloX3gxOwkJCS8qICh1bnVzZWQpICovCisJdV9pbnQ4X3QJaWhfcHI7CQkJLyogcHJvdG9jb2wgKi8KKwl1X2ludDE2X3QJaWhfbGVuOwkJCS8qIHByb3RvY29sIGxlbmd0aCAqLworCXN0cnVjdAlpbl9hZGRyIGloX3NyYzsJCS8qIHNvdXJjZSBpbnRlcm5ldCBhZGRyZXNzICovCisJc3RydWN0CWluX2FkZHIgaWhfZHN0OwkJLyogZGVzdGluYXRpb24gaW50ZXJuZXQgYWRkcmVzcyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIElwIHJlYXNzZW1ibHkgcXVldWUgc3RydWN0dXJlLiAgRWFjaCBmcmFnbWVudAorICogYmVpbmcgcmVhc3NlbWJsZWQgaXMgYXR0YWNoZWQgdG8gb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMuCisgKiBUaGV5IGFyZSB0aW1lZCBvdXQgYWZ0ZXIgaXBxX3R0bCBkcm9wcyB0byAwLCBhbmQgbWF5IGFsc28KKyAqIGJlIHJlY2xhaW1lZCBpZiBtZW1vcnkgYmVjb21lcyB0aWdodC4KKyAqIHNpemUgMjggYnl0ZXMKKyAqLworc3RydWN0IGlwcSB7CisgICAgICAgIHN0cnVjdCBxbGluayBmcmFnX2xpbms7CQkJLyogdG8gaXAgaGVhZGVycyBvZiBmcmFnbWVudHMgKi8KKwlzdHJ1Y3QgcWxpbmsgaXBfbGluazsJCQkJLyogdG8gb3RoZXIgcmVhc3MgaGVhZGVycyAqLworCXVfaW50OF90CWlwcV90dGw7CQkvKiB0aW1lIGZvciByZWFzcyBxIHRvIGxpdmUgKi8KKwl1X2ludDhfdAlpcHFfcDsJCQkvKiBwcm90b2NvbCBvZiB0aGlzIGZyYWdtZW50ICovCisJdV9pbnQxNl90CWlwcV9pZDsJCQkvKiBzZXF1ZW5jZSBpZCBmb3IgcmVhc3NlbWJseSAqLworCXN0cnVjdAlpbl9hZGRyIGlwcV9zcmMsaXBxX2RzdDsKK307CisKKy8qCisgKiBJcCBoZWFkZXIsIHdoZW4gaG9sZGluZyBhIGZyYWdtZW50LgorICoKKyAqIE5vdGU6IGlwZl9saW5rIG11c3QgYmUgYXQgc2FtZSBvZmZzZXQgYXMgZnJhZ19saW5rIGFib3ZlCisgKi8KK3N0cnVjdAlpcGFzZnJhZyB7CisJc3RydWN0IHFsaW5rIGlwZl9saW5rOworCXN0cnVjdCBpcCBpcGZfaXA7Cit9OworCisjZGVmaW5lIGlwZl9vZmYgICAgICBpcGZfaXAuaXBfb2ZmCisjZGVmaW5lIGlwZl90b3MgICAgICBpcGZfaXAuaXBfdG9zCisjZGVmaW5lIGlwZl9sZW4gICAgICBpcGZfaXAuaXBfbGVuCisjZGVmaW5lIGlwZl9uZXh0ICAgICBpcGZfbGluay5uZXh0CisjZGVmaW5lIGlwZl9wcmV2ICAgICBpcGZfbGluay5wcmV2CisKKy8qCisgKiBTdHJ1Y3R1cmUgc3RvcmVkIGluIG1idWYgaW4gaW5wY2IuaXBfb3B0aW9ucworICogYW5kIHBhc3NlZCB0byBpcF9vdXRwdXQgd2hlbiBpcCBvcHRpb25zIGFyZSBpbiB1c2UuCisgKiBUaGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUgb3B0aW9ucyAoaW5jbHVkaW5nIGlwb3B0X2RzdCkKKyAqIGlzIGluIG1fbGVuLgorICovCisjZGVmaW5lIE1BWF9JUE9QVExFTgk0MAorCitzdHJ1Y3QgaXBvcHRpb24geworCXN0cnVjdAlpbl9hZGRyIGlwb3B0X2RzdDsJLyogZmlyc3QtaG9wIGRzdCBpZiBzb3VyY2Ugcm91dGVkICovCisJaW50OF90CWlwb3B0X2xpc3RbTUFYX0lQT1BUTEVOXTsJLyogb3B0aW9ucyBwcm9wZXIgKi8KK307CisKKyNpZmRlZiBMT0dfRU5BQkxFRAorLyoKKyAqIFN0cnVjdHVyZSBhdHRhY2hlZCB0byBpbnBjYi5pcF9tb3B0aW9ucyBhbmQKKyAqIHBhc3NlZCB0byBpcF9vdXRwdXQgd2hlbiBJUCBtdWx0aWNhc3Qgb3B0aW9ucyBhcmUgaW4gdXNlLgorICovCisKK3N0cnVjdAlpcHN0YXQgeworCXVfbG9uZwlpcHNfdG90YWw7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkICovCisJdV9sb25nCWlwc19iYWRzdW07CQkvKiBjaGVja3N1bSBiYWQgKi8KKwl1X2xvbmcJaXBzX3Rvb3Nob3J0OwkJLyogcGFja2V0IHRvbyBzaG9ydCAqLworCXVfbG9uZwlpcHNfdG9vc21hbGw7CQkvKiBub3QgZW5vdWdoIGRhdGEgKi8KKwl1X2xvbmcJaXBzX2JhZGhsZW47CQkvKiBpcCBoZWFkZXIgbGVuZ3RoIDwgZGF0YSBzaXplICovCisJdV9sb25nCWlwc19iYWRsZW47CQkvKiBpcCBsZW5ndGggPCBpcCBoZWFkZXIgbGVuZ3RoICovCisJdV9sb25nCWlwc19mcmFnbWVudHM7CQkvKiBmcmFnbWVudHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJaXBzX2ZyYWdkcm9wcGVkOwkvKiBmcmFncyBkcm9wcGVkIChkdXBzLCBvdXQgb2Ygc3BhY2UpICovCisJdV9sb25nCWlwc19mcmFndGltZW91dDsJLyogZnJhZ21lbnRzIHRpbWVkIG91dCAqLworCXVfbG9uZwlpcHNfZm9yd2FyZDsJCS8qIHBhY2tldHMgZm9yd2FyZGVkICovCisJdV9sb25nCWlwc19jYW50Zm9yd2FyZDsJLyogcGFja2V0cyByY3ZkIGZvciB1bnJlYWNoYWJsZSBkZXN0ICovCisJdV9sb25nCWlwc19yZWRpcmVjdHNlbnQ7CS8qIHBhY2tldHMgZm9yd2FyZGVkIG9uIHNhbWUgbmV0ICovCisJdV9sb25nCWlwc19ub3Byb3RvOwkJLyogdW5rbm93biBvciB1bnN1cHBvcnRlZCBwcm90b2NvbCAqLworCXVfbG9uZwlpcHNfZGVsaXZlcmVkOwkJLyogZGF0YWdyYW1zIGRlbGl2ZXJlZCB0byB1cHBlciBsZXZlbCovCisJdV9sb25nCWlwc19sb2NhbG91dDsJCS8qIHRvdGFsIGlwIHBhY2tldHMgZ2VuZXJhdGVkIGhlcmUgKi8KKwl1X2xvbmcJaXBzX29kcm9wcGVkOwkJLyogbG9zdCBwYWNrZXRzIGR1ZSB0byBub2J1ZnMsIGV0Yy4gKi8KKwl1X2xvbmcJaXBzX3JlYXNzZW1ibGVkOwkvKiB0b3RhbCBwYWNrZXRzIHJlYXNzZW1ibGVkIG9rICovCisJdV9sb25nCWlwc19mcmFnbWVudGVkOwkJLyogZGF0YWdyYW1zIHN1Y2Nlc3NmdWxseSBmcmFnbWVudGVkICovCisJdV9sb25nCWlwc19vZnJhZ21lbnRzOwkJLyogb3V0cHV0IGZyYWdtZW50cyBjcmVhdGVkICovCisJdV9sb25nCWlwc19jYW50ZnJhZzsJCS8qIGRvbid0IGZyYWdtZW50IGZsYWcgd2FzIHNldCwgZXRjLiAqLworCXVfbG9uZwlpcHNfYmFkb3B0aW9uczsJCS8qIGVycm9yIGluIG9wdGlvbiBwcm9jZXNzaW5nICovCisJdV9sb25nCWlwc19ub3JvdXRlOwkJLyogcGFja2V0cyBkaXNjYXJkZWQgZHVlIHRvIG5vIHJvdXRlICovCisJdV9sb25nCWlwc19iYWR2ZXJzOwkJLyogaXAgdmVyc2lvbiAhPSA0ICovCisJdV9sb25nCWlwc19yYXdvdXQ7CQkvKiB0b3RhbCByYXcgaXAgcGFja2V0cyBnZW5lcmF0ZWQgKi8KKwl1X2xvbmcJaXBzX3VuYWxpZ25lZDsJCS8qIHRpbWVzIHRoZSBpcCBwYWNrZXQgd2FzIG5vdCBhbGlnbmVkICovCit9OworCitleHRlcm4gc3RydWN0CWlwc3RhdAlpcHN0YXQ7CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdAlpcHEJaXBxOwkJCS8qIGlwIHJlYXNzLiBxdWV1ZSAqLworZXh0ZXJuIHVfaW50MTZfdAlpcF9pZDsJCQkJLyogaXAgcGFja2V0IGN0ciwgZm9yIGlkcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfaWNtcC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pcF9pY21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkY2FmOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfaWNtcC5jCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwX2ljbXAuYwk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqIGlwX2ljbXAuYyx2IDEuNyAxOTk1LzA1LzMwIDA4OjA5OjQyIHJncmltZXMgRXhwCisgKi8KKworI2luY2x1ZGUgInNsaXJwLmgiCisjaW5jbHVkZSAiaXBfaWNtcC5oIgorCisjaWZkZWYgTE9HX0VOQUJMRUQKK3N0cnVjdCBpY21wc3RhdCBpY21wc3RhdDsKKyNlbmRpZgorCisvKiBUaGUgbWVzc2FnZSBzZW50IHdoZW4gZW11bGF0aW5nIFBJTkcgKi8KKy8qIEJlIG5pY2UgYW5kIHRlbGwgdGhlbSBpdCdzIGp1c3QgYSBwc2V1ZG8tcGluZyBwYWNrZXQgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGljbXBfcGluZ19tc2dbXSA9ICJUaGlzIGlzIGEgcHNldWRvLVBJTkcgcGFja2V0IHVzZWQgYnkgU2xpcnAgdG8gZW11bGF0ZSBJQ01QIEVDSE8tUkVRVUVTVCBwYWNrZXRzLlxuIjsKKworLyogbGlzdCBvZiBhY3Rpb25zIGZvciBpY21wX2Vycm9yKCkgb24gUlggb2YgYW4gaWNtcCBtZXNzYWdlICovCitzdGF0aWMgY29uc3QgaW50IGljbXBfZmx1c2hbMTldID0geworLyogIEVDSE8gUkVQTFkgKDApICAqLyAgIDAsCisJCSAgICAgICAgIDEsCisJCSAgICAgICAgIDEsCisvKiBERVNUIFVOUkVBQ0ggKDMpICovICAgMSwKKy8qIFNPVVJDRSBRVUVOQ0ggKDQpKi8gICAxLAorLyogUkVESVJFQ1QgKDUpICovICAgICAgIDEsCisJCSAgICAgICAgIDEsCisJCSAgICAgICAgIDEsCisvKiBFQ0hPICg4KSAqLyAgICAgICAgICAgMCwKKy8qIFJPVVRFUkFEVkVSVCAoOSkgKi8gICAxLAorLyogUk9VVEVSU09MSUNJVCAoMTApICovIDEsCisvKiBUSU1FIEVYQ0VFREVEICgxMSkgKi8gMSwKKy8qIFBBUkFNRVRFUiBQUk9CTEVNICgxMikgKi8gMSwKKy8qIFRJTUVTVEFNUCAoMTMpICovICAgICAwLAorLyogVElNRVNUQU1QIFJFUExZICgxNCkgKi8gMCwKKy8qIElORk8gKDE1KSAqLyAgICAgICAgICAwLAorLyogSU5GTyBSRVBMWSAoMTYpICovICAgIDAsCisvKiBBRERSIE1BU0sgKDE3KSAqLyAgICAgMCwKKy8qIEFERFIgTUFTSyBSRVBMWSAoMTgpICovIDAKK307CisKKy8qCisgKiBQcm9jZXNzIGEgcmVjZWl2ZWQgSUNNUCBtZXNzYWdlLgorICovCit2b2lkCitpY21wX2lucHV0KHN0cnVjdCBtYnVmICptLCBpbnQgaGxlbikKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IGljbXAgKmljcDsKKyAgcmVnaXN0ZXIgc3RydWN0IGlwICppcD1tdG9kKG0sIHN0cnVjdCBpcCAqKTsKKyAgaW50IGljbXBsZW49aXAtPmlwX2xlbjsKKyAgLyogaW50IGNvZGU7ICovCisKKyAgREVCVUdfQ0FMTCgiaWNtcF9pbnB1dCIpOworICBERUJVR19BUkcoIm0gPSAlbHgiLCAobG9uZyApbSk7CisgIERFQlVHX0FSRygibV9sZW4gPSAlZCIsIG0tPm1fbGVuKTsKKworICBTVEFUKGljbXBzdGF0LmljcHNfcmVjZWl2ZWQrKyk7CisKKyAgLyoKKyAgICogTG9jYXRlIGljbXAgc3RydWN0dXJlIGluIG1idWYsIGFuZCBjaGVjaworICAgKiB0aGF0IGl0cyBub3QgY29ycnVwdGVkIGFuZCBvZiBhdCBsZWFzdCBtaW5pbXVtIGxlbmd0aC4KKyAgICovCisgIGlmIChpY21wbGVuIDwgSUNNUF9NSU5MRU4pIHsgICAgICAgICAgLyogbWluIDggYnl0ZXMgcGF5bG9hZCAqLworICAgIFNUQVQoaWNtcHN0YXQuaWNwc190b29zaG9ydCsrKTsKKyAgZnJlZWl0OgorICAgIG1fZnJlZW0obSk7CisgICAgZ290byBlbmRfZXJyb3I7CisgIH0KKworICBtLT5tX2xlbiAtPSBobGVuOworICBtLT5tX2RhdGEgKz0gaGxlbjsKKyAgaWNwID0gbXRvZChtLCBzdHJ1Y3QgaWNtcCAqKTsKKyAgaWYgKGNrc3VtKG0sIGljbXBsZW4pKSB7CisgICAgU1RBVChpY21wc3RhdC5pY3BzX2NoZWNrc3VtKyspOworICAgIGdvdG8gZnJlZWl0OworICB9CisgIG0tPm1fbGVuICs9IGhsZW47CisgIG0tPm1fZGF0YSAtPSBobGVuOworCisgIC8qCWljbXBzdGF0LmljcHNfaW5oaXN0W2ljcC0+aWNtcF90eXBlXSsrOyAqLworICAvKiBjb2RlID0gaWNwLT5pY21wX2NvZGU7ICovCisKKyAgREVCVUdfQVJHKCJpY21wX3R5cGUgPSAlZCIsIGljcC0+aWNtcF90eXBlKTsKKyAgc3dpdGNoIChpY3AtPmljbXBfdHlwZSkgeworICBjYXNlIElDTVBfRUNITzoKKyAgICBpY3AtPmljbXBfdHlwZSA9IElDTVBfRUNIT1JFUExZOworICAgIGlwLT5pcF9sZW4gKz0gaGxlbjsJICAgICAgICAgICAgIC8qIHNpbmNlIGlwX2lucHV0IHN1YnRyYWN0cyB0aGlzICovCisgICAgaWYgKGlwLT5pcF9kc3Quc19hZGRyID09IGFsaWFzX2FkZHIuc19hZGRyKSB7CisgICAgICBpY21wX3JlZmxlY3QobSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBzb2NrZXQgKnNvOworICAgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisgICAgICBpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkgZ290byBmcmVlaXQ7CisgICAgICBpZih1ZHBfYXR0YWNoKHNvKSA9PSAtMSkgeworCURFQlVHX01JU0MoKGRmZCwiaWNtcF9pbnB1dCB1ZHBfYXR0YWNoIGVycm5vID0gJWQtJXNcbiIsCisJCSAgICBlcnJubyxzdHJlcnJvcihlcnJubykpKTsKKwlzb2ZyZWUoc28pOworCW1fZnJlZShtKTsKKwlnb3RvIGVuZF9lcnJvcjsKKyAgICAgIH0KKyAgICAgIHNvLT5zb19tID0gbTsKKyAgICAgIHNvLT5zb19mYWRkciA9IGlwLT5pcF9kc3Q7CisgICAgICBzby0+c29fZnBvcnQgPSBodG9ucyg3KTsKKyAgICAgIHNvLT5zb19sYWRkciA9IGlwLT5pcF9zcmM7CisgICAgICBzby0+c29fbHBvcnQgPSBodG9ucyg5KTsKKyAgICAgIHNvLT5zb19pcHRvcyA9IGlwLT5pcF90b3M7CisgICAgICBzby0+c29fdHlwZSA9IElQUFJPVE9fSUNNUDsKKyAgICAgIHNvLT5zb19zdGF0ZSA9IFNTX0lTRkNPTk5FQ1RFRDsKKworICAgICAgLyogU2VuZCB0aGUgcGFja2V0ICovCisgICAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgaWYgKChzby0+c29fZmFkZHIuc19hZGRyICYgaHRvbmwoMHhmZmZmZmYwMCkpID09IHNwZWNpYWxfYWRkci5zX2FkZHIpIHsKKwkvKiBJdCdzIGFuIGFsaWFzICovCisJc3dpdGNoKG50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpICYgMHhmZikgeworCWNhc2UgQ1RMX0ROUzoKKwkgIGFkZHIuc2luX2FkZHIgPSBkbnNfYWRkcjsKKwkgIGJyZWFrOworCWNhc2UgQ1RMX0FMSUFTOgorCWRlZmF1bHQ6CisJICBhZGRyLnNpbl9hZGRyID0gbG9vcGJhY2tfYWRkcjsKKwkgIGJyZWFrOworCX0KKyAgICAgIH0gZWxzZSB7CisJYWRkci5zaW5fYWRkciA9IHNvLT5zb19mYWRkcjsKKyAgICAgIH0KKyAgICAgIGFkZHIuc2luX3BvcnQgPSBzby0+c29fZnBvcnQ7CisgICAgICBpZihzZW5kdG8oc28tPnMsIGljbXBfcGluZ19tc2csIHN0cmxlbihpY21wX3BpbmdfbXNnKSwgMCwKKwkJKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpID09IC0xKSB7CisJREVCVUdfTUlTQygoZGZkLCJpY21wX2lucHV0IHVkcCBzZW5kdG8gdHggZXJybm8gPSAlZC0lc1xuIiwKKwkJICAgIGVycm5vLHN0cmVycm9yKGVycm5vKSkpOworCWljbXBfZXJyb3IobSwgSUNNUF9VTlJFQUNILElDTVBfVU5SRUFDSF9ORVQsIDAsc3RyZXJyb3IoZXJybm8pKTsKKwl1ZHBfZGV0YWNoKHNvKTsKKyAgICAgIH0KKyAgICB9IC8qIGlmIGlwLT5pcF9kc3Quc19hZGRyID09IGFsaWFzX2FkZHIuc19hZGRyICovCisgICAgYnJlYWs7CisgIGNhc2UgSUNNUF9VTlJFQUNIOgorICAgIC8qIFhYWD8gcmVwb3J0IGVycm9yPyBjbG9zZSBzb2NrZXQ/ICovCisgIGNhc2UgSUNNUF9USU1YQ0VFRDoKKyAgY2FzZSBJQ01QX1BBUkFNUFJPQjoKKyAgY2FzZSBJQ01QX1NPVVJDRVFVRU5DSDoKKyAgY2FzZSBJQ01QX1RTVEFNUDoKKyAgY2FzZSBJQ01QX01BU0tSRVE6CisgIGNhc2UgSUNNUF9SRURJUkVDVDoKKyAgICBTVEFUKGljbXBzdGF0LmljcHNfbm90c3VwcCsrKTsKKyAgICBtX2ZyZWVtKG0pOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgU1RBVChpY21wc3RhdC5pY3BzX2JhZHR5cGUrKyk7CisgICAgbV9mcmVlbShtKTsKKyAgfSAvKiBzd2l0aCAqLworCitlbmRfZXJyb3I6CisgIC8qIG0gaXMgbV9mcmVlKCknZCB4b3IgcHV0IGluIGEgc29ja2V0IHhvciBvciBnaXZlbiB0byBpcF9zZW5kICovCisgIHJldHVybjsKK30KKworCisvKgorICoJU2VuZCBhbiBJQ01QIG1lc3NhZ2UgaW4gcmVzcG9uc2UgdG8gYSBzaXR1YXRpb24KKyAqCisgKglSRkMgMTEyMjogMy4yLjIJTVVTVCBzZW5kIGF0IGxlYXN0IHRoZSBJUCBoZWFkZXIgYW5kIDggYnl0ZXMgb2YgaGVhZGVyLiBNQVkgc2VuZCBtb3JlICh3ZSBkbykuCisgKgkJCU1VU1QgTk9UIGNoYW5nZSB0aGlzIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAqCQkJTVVTVCBOT1QgcmVwbHkgdG8gYSBtdWx0aWNhc3QvYnJvYWRjYXN0IElQIGFkZHJlc3MuCisgKgkJCU1VU1QgTk9UIHJlcGx5IHRvIGEgbXVsdGljYXN0L2Jyb2FkY2FzdCBNQUMgYWRkcmVzcy4KKyAqCQkJTVVTVCByZXBseSB0byBvbmx5IHRoZSBmaXJzdCBmcmFnbWVudC4KKyAqLworLyoKKyAqIFNlbmQgSUNNUF9VTlJFQUNIIGJhY2sgdG8gdGhlIHNvdXJjZSByZWdhcmRpbmcgbXNyYy4KKyAqIG1idWYgKm1zcmMgaXMgdXNlZCBhcyBhIHRlbXBsYXRlLCBidXQgaXMgTk9UIG1fZnJlZSgpJ2QuCisgKiBJdCBpcyByZXBvcnRlZCBhcyB0aGUgYmFkIGlwIHBhY2tldC4gIFRoZSBoZWFkZXIgc2hvdWxkCisgKiBiZSBmdWxseSBjb3JyZWN0IGFuZCBpbiBob3N0IGJ5dGUgb3JkZXIuCisgKiBJQ01QIGZyYWdtZW50YXRpb24gaXMgaWxsZWdhbC4gIEFsbCBtYWNoaW5lcyBtdXN0IGFjY2VwdCA1NzYgYnl0ZXMgaW4gb25lCisgKiBwYWNrZXQuICBUaGUgbWF4aW11bSBwYXlsb2FkIGlzIDU3Ni0yMChpcCBoZHIpLTgoaWNtcCBoZHIpPTU0OAorICovCisKKyNkZWZpbmUgSUNNUF9NQVhEQVRBTEVOIChJUF9NU1MtMjgpCit2b2lkCitpY21wX2Vycm9yKHN0cnVjdCBtYnVmICptc3JjLCB1X2NoYXIgdHlwZSwgdV9jaGFyIGNvZGUsIGludCBtaW5zaXplLAorICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlKQoreworICB1bnNpZ25lZCBobGVuLCBzaGxlbiwgc19pcF9sZW47CisgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CisgIHJlZ2lzdGVyIHN0cnVjdCBpY21wICppY3A7CisgIHJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOworCisgIERFQlVHX0NBTEwoImljbXBfZXJyb3IiKTsKKyAgREVCVUdfQVJHKCJtc3JjID0gJWx4IiwgKGxvbmcgKW1zcmMpOworICBERUJVR19BUkcoIm1zcmNfbGVuID0gJWQiLCBtc3JjLT5tX2xlbik7CisKKyAgaWYodHlwZSE9SUNNUF9VTlJFQUNIICYmIHR5cGUhPUlDTVBfVElNWENFRUQpIGdvdG8gZW5kX2Vycm9yOworCisgIC8qIGNoZWNrIG1zcmMgKi8KKyAgaWYoIW1zcmMpIGdvdG8gZW5kX2Vycm9yOworICBpcCA9IG10b2QobXNyYywgc3RydWN0IGlwICopOworI2lmZGVmIERFQlVHCisgIHsgY2hhciBidWZhWzIwXSwgYnVmYlsyMF07CisgICAgc3RyY3B5KGJ1ZmEsIGluZXRfbnRvYShpcC0+aXBfc3JjKSk7CisgICAgc3RyY3B5KGJ1ZmIsIGluZXRfbnRvYShpcC0+aXBfZHN0KSk7CisgICAgREVCVUdfTUlTQygoZGZkLCAiICUuMTZzIHRvICUuMTZzXG4iLCBidWZhLCBidWZiKSk7CisgIH0KKyNlbmRpZgorICBpZihpcC0+aXBfb2ZmICYgSVBfT0ZGTUFTSykgZ290byBlbmRfZXJyb3I7ICAgIC8qIE9ubHkgcmVwbHkgdG8gZnJhZ21lbnQgMCAqLworCisgIHNobGVuPWlwLT5pcF9obCA8PCAyOworICBzX2lwX2xlbj1pcC0+aXBfbGVuOworICBpZihpcC0+aXBfcCA9PSBJUFBST1RPX0lDTVApIHsKKyAgICBpY3AgPSAoc3RydWN0IGljbXAgKikoKGNoYXIgKilpcCArIHNobGVuKTsKKyAgICAvKgorICAgICAqCUFzc3VtZSBhbnkgdW5rbm93biBJQ01QIHR5cGUgaXMgYW4gZXJyb3IuIFRoaXMgaXNuJ3QKKyAgICAgKglzcGVjaWZpZWQgYnkgdGhlIFJGQywgYnV0IHRoaW5rIGFib3V0IGl0Li4KKyAgICAgKi8KKyAgICBpZihpY3AtPmljbXBfdHlwZT4xOCB8fCBpY21wX2ZsdXNoW2ljcC0+aWNtcF90eXBlXSkgZ290byBlbmRfZXJyb3I7CisgIH0KKworICAvKiBtYWtlIGEgY29weSAqLworICBpZighKG09bV9nZXQoKSkpIGdvdG8gZW5kX2Vycm9yOyAgICAgICAgICAgICAgIC8qIGdldCBtYnVmICovCisgIHsgaW50IG5ld19tX3NpemU7CisgICAgbmV3X21fc2l6ZT1zaXplb2Yoc3RydWN0IGlwICkrSUNNUF9NSU5MRU4rbXNyYy0+bV9sZW4rSUNNUF9NQVhEQVRBTEVOOworICAgIGlmKG5ld19tX3NpemU+bS0+bV9zaXplKSBtX2luYyhtLCBuZXdfbV9zaXplKTsKKyAgfQorICBtZW1jcHkobS0+bV9kYXRhLCBtc3JjLT5tX2RhdGEsIG1zcmMtPm1fbGVuKTsKKyAgbS0+bV9sZW4gPSBtc3JjLT5tX2xlbjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IG1zcmMgdG8gbSAqLworCisgIC8qIG1ha2UgdGhlIGhlYWRlciBvZiB0aGUgcmVwbHkgcGFja2V0ICovCisgIGlwICA9IG10b2QobSwgc3RydWN0IGlwICopOworICBobGVuPSBzaXplb2Yoc3RydWN0IGlwICk7ICAgICAvKiBubyBvcHRpb25zIGluIHJlcGx5ICovCisKKyAgLyogZmlsbCBpbiBpY21wICovCisgIG0tPm1fZGF0YSArPSBobGVuOworICBtLT5tX2xlbiAtPSBobGVuOworCisgIGljcCA9IG10b2QobSwgc3RydWN0IGljbXAgKik7CisKKyAgaWYobWluc2l6ZSkgc19pcF9sZW49c2hsZW4rSUNNUF9NSU5MRU47ICAgLyogcmV0dXJuIGhlYWRlcis4YiBvbmx5ICovCisgIGVsc2UgaWYoc19pcF9sZW4+SUNNUF9NQVhEQVRBTEVOKSAgICAgICAgIC8qIG1heGltdW0gc2l6ZSAqLworICAgIHNfaXBfbGVuPUlDTVBfTUFYREFUQUxFTjsKKworICBtLT5tX2xlbj1JQ01QX01JTkxFTitzX2lwX2xlbjsgICAgICAgIC8qIDggYnl0ZXMgSUNNUCBoZWFkZXIgKi8KKworICAvKiBtaW4uIHNpemUgPSA4K3NpemVvZihzdHJ1Y3QgaXApKzggKi8KKworICBpY3AtPmljbXBfdHlwZSA9IHR5cGU7CisgIGljcC0+aWNtcF9jb2RlID0gY29kZTsKKyAgaWNwLT5pY21wX2lkID0gMDsKKyAgaWNwLT5pY21wX3NlcSA9IDA7CisKKyAgbWVtY3B5KCZpY3AtPmljbXBfaXAsIG1zcmMtPm1fZGF0YSwgc19pcF9sZW4pOyAgIC8qIHJlcG9ydCB0aGUgaXAgcGFja2V0ICovCisgIEhUT05TKGljcC0+aWNtcF9pcC5pcF9sZW4pOworICBIVE9OUyhpY3AtPmljbXBfaXAuaXBfaWQpOworICBIVE9OUyhpY3AtPmljbXBfaXAuaXBfb2ZmKTsKKworI2lmZGVmIERFQlVHCisgIGlmKG1lc3NhZ2UpIHsgICAgICAgICAgIC8qIERFQlVHIDogYXBwZW5kIG1lc3NhZ2UgdG8gSUNNUCBwYWNrZXQgKi8KKyAgICBpbnQgbWVzc2FnZV9sZW47CisgICAgY2hhciAqY3BudDsKKyAgICBtZXNzYWdlX2xlbj1zdHJsZW4obWVzc2FnZSk7CisgICAgaWYobWVzc2FnZV9sZW4+SUNNUF9NQVhEQVRBTEVOKSBtZXNzYWdlX2xlbj1JQ01QX01BWERBVEFMRU47CisgICAgY3BudD0oY2hhciAqKW0tPm1fZGF0YSttLT5tX2xlbjsKKyAgICBtZW1jcHkoY3BudCwgbWVzc2FnZSwgbWVzc2FnZV9sZW4pOworICAgIG0tPm1fbGVuKz1tZXNzYWdlX2xlbjsKKyAgfQorI2VuZGlmCisKKyAgaWNwLT5pY21wX2Nrc3VtID0gMDsKKyAgaWNwLT5pY21wX2Nrc3VtID0gY2tzdW0obSwgbS0+bV9sZW4pOworCisgIG0tPm1fZGF0YSAtPSBobGVuOworICBtLT5tX2xlbiArPSBobGVuOworCisgIC8qIGZpbGwgaW4gaXAgKi8KKyAgaXAtPmlwX2hsID0gaGxlbiA+PiAyOworICBpcC0+aXBfbGVuID0gbS0+bV9sZW47CisKKyAgaXAtPmlwX3Rvcz0oKGlwLT5pcF90b3MgJiAweDFFKSB8IDB4QzApOyAgLyogaGlnaCBwcmlvcml0eSBmb3IgZXJyb3JzICovCisKKyAgaXAtPmlwX3R0bCA9IE1BWFRUTDsKKyAgaXAtPmlwX3AgPSBJUFBST1RPX0lDTVA7CisgIGlwLT5pcF9kc3QgPSBpcC0+aXBfc3JjOyAgICAvKiBpcCBhZHJlc3NlcyAqLworICBpcC0+aXBfc3JjID0gYWxpYXNfYWRkcjsKKworICAodm9pZCApIGlwX291dHB1dCgoc3RydWN0IHNvY2tldCAqKU5VTEwsIG0pOworCisgIFNUQVQoaWNtcHN0YXQuaWNwc19yZWZsZWN0KyspOworCitlbmRfZXJyb3I6CisgIHJldHVybjsKK30KKyN1bmRlZiBJQ01QX01BWERBVEFMRU4KKworLyoKKyAqIFJlZmxlY3QgdGhlIGlwIHBhY2tldCBiYWNrIHRvIHRoZSBzb3VyY2UKKyAqLwordm9pZAoraWNtcF9yZWZsZWN0KHN0cnVjdCBtYnVmICptKQoreworICByZWdpc3RlciBzdHJ1Y3QgaXAgKmlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisgIGludCBobGVuID0gaXAtPmlwX2hsIDw8IDI7CisgIGludCBvcHRsZW4gPSBobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcCApOworICByZWdpc3RlciBzdHJ1Y3QgaWNtcCAqaWNwOworCisgIC8qCisgICAqIFNlbmQgYW4gaWNtcCBwYWNrZXQgYmFjayB0byB0aGUgaXAgbGV2ZWwsCisgICAqIGFmdGVyIHN1cHBseWluZyBhIGNoZWNrc3VtLgorICAgKi8KKyAgbS0+bV9kYXRhICs9IGhsZW47CisgIG0tPm1fbGVuIC09IGhsZW47CisgIGljcCA9IG10b2QobSwgc3RydWN0IGljbXAgKik7CisKKyAgaWNwLT5pY21wX2Nrc3VtID0gMDsKKyAgaWNwLT5pY21wX2Nrc3VtID0gY2tzdW0obSwgaXAtPmlwX2xlbiAtIGhsZW4pOworCisgIG0tPm1fZGF0YSAtPSBobGVuOworICBtLT5tX2xlbiArPSBobGVuOworCisgIC8qIGZpbGwgaW4gaXAgKi8KKyAgaWYgKG9wdGxlbiA+IDApIHsKKyAgICAvKgorICAgICAqIFN0cmlwIG91dCBvcmlnaW5hbCBvcHRpb25zIGJ5IGNvcHlpbmcgcmVzdCBvZiBmaXJzdAorICAgICAqIG1idWYncyBkYXRhIGJhY2ssIGFuZCBhZGp1c3QgdGhlIElQIGxlbmd0aC4KKyAgICAgKi8KKyAgICBtZW1tb3ZlKChjYWRkcl90KShpcCArIDEpLCAoY2FkZHJfdClpcCArIGhsZW4sCisJICAgICh1bnNpZ25lZCApKG0tPm1fbGVuIC0gaGxlbikpOworICAgIGhsZW4gLT0gb3B0bGVuOworICAgIGlwLT5pcF9obCA9IGhsZW4gPj4gMjsKKyAgICBpcC0+aXBfbGVuIC09IG9wdGxlbjsKKyAgICBtLT5tX2xlbiAtPSBvcHRsZW47CisgIH0KKworICBpcC0+aXBfdHRsID0gTUFYVFRMOworICB7IC8qIHN3YXAgKi8KKyAgICBzdHJ1Y3QgaW5fYWRkciBpY21wX2RzdDsKKyAgICBpY21wX2RzdCA9IGlwLT5pcF9kc3Q7CisgICAgaXAtPmlwX2RzdCA9IGlwLT5pcF9zcmM7CisgICAgaXAtPmlwX3NyYyA9IGljbXBfZHN0OworICB9CisKKyAgKHZvaWQgKSBpcF9vdXRwdXQoKHN0cnVjdCBzb2NrZXQgKilOVUxMLCBtKTsKKworICBTVEFUKGljbXBzdGF0LmljcHNfcmVmbGVjdCsrKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfaWNtcC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pcF9pY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzMDEzMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfaWNtcC5oCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWlwX2ljbXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiBpcF9pY21wLmgsdiAxLjQgMTk5NS8wNS8zMCAwODowOTo0MyByZ3JpbWVzIEV4cAorICovCisKKyNpZm5kZWYgX05FVElORVRfSVBfSUNNUF9IXworI2RlZmluZSBfTkVUSU5FVF9JUF9JQ01QX0hfCisKKy8qCisgKiBJbnRlcmZhY2UgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sIERlZmluaXRpb25zLgorICogUGVyIFJGQyA3OTIsIFNlcHRlbWJlciAxOTgxLgorICovCisKK3R5cGVkZWYgdV9pbnQzMl90IG5fdGltZTsKKworLyoKKyAqIFN0cnVjdHVyZSBvZiBhbiBpY21wIGhlYWRlci4KKyAqLworc3RydWN0IGljbXAgeworCXVfY2hhcglpY21wX3R5cGU7CQkvKiB0eXBlIG9mIG1lc3NhZ2UsIHNlZSBiZWxvdyAqLworCXVfY2hhcglpY21wX2NvZGU7CQkvKiB0eXBlIHN1YiBjb2RlICovCisJdV9zaG9ydAlpY21wX2Nrc3VtOwkJLyogb25lcyBjb21wbGVtZW50IGNrc3VtIG9mIHN0cnVjdCAqLworCXVuaW9uIHsKKwkJdV9jaGFyIGloX3BwdHI7CQkJLyogSUNNUF9QQVJBTVBST0IgKi8KKwkJc3RydWN0IGluX2FkZHIgaWhfZ3dhZGRyOwkvKiBJQ01QX1JFRElSRUNUICovCisJCXN0cnVjdCBpaF9pZHNlcSB7CisJCQl1X3Nob3J0CWljZF9pZDsKKwkJCXVfc2hvcnQJaWNkX3NlcTsKKwkJfSBpaF9pZHNlcTsKKwkJaW50IGloX3ZvaWQ7CisKKwkJLyogSUNNUF9VTlJFQUNIX05FRURGUkFHIC0tIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgKi8KKwkJc3RydWN0IGloX3BtdHUgeworCQkJdV9zaG9ydCBpcG1fdm9pZDsKKwkJCXVfc2hvcnQgaXBtX25leHRtdHU7CisJCX0gaWhfcG10dTsKKwl9IGljbXBfaHVuOworI2RlZmluZQlpY21wX3BwdHIJaWNtcF9odW4uaWhfcHB0cgorI2RlZmluZQlpY21wX2d3YWRkcglpY21wX2h1bi5paF9nd2FkZHIKKyNkZWZpbmUJaWNtcF9pZAkJaWNtcF9odW4uaWhfaWRzZXEuaWNkX2lkCisjZGVmaW5lCWljbXBfc2VxCWljbXBfaHVuLmloX2lkc2VxLmljZF9zZXEKKyNkZWZpbmUJaWNtcF92b2lkCWljbXBfaHVuLmloX3ZvaWQKKyNkZWZpbmUJaWNtcF9wbXZvaWQJaWNtcF9odW4uaWhfcG10dS5pcG1fdm9pZAorI2RlZmluZQlpY21wX25leHRtdHUJaWNtcF9odW4uaWhfcG10dS5pcG1fbmV4dG10dQorCXVuaW9uIHsKKwkJc3RydWN0IGlkX3RzIHsKKwkJCW5fdGltZSBpdHNfb3RpbWU7CisJCQluX3RpbWUgaXRzX3J0aW1lOworCQkJbl90aW1lIGl0c190dGltZTsKKwkJfSBpZF90czsKKwkJc3RydWN0IGlkX2lwICB7CisJCQlzdHJ1Y3QgaXAgaWRpX2lwOworCQkJLyogb3B0aW9ucyBhbmQgdGhlbiA2NCBiaXRzIG9mIGRhdGEgKi8KKwkJfSBpZF9pcDsKKwkJdWludDMyX3QJaWRfbWFzazsKKwkJY2hhcgkJaWRfZGF0YVsxXTsKKwl9IGljbXBfZHVuOworI2RlZmluZQlpY21wX290aW1lCWljbXBfZHVuLmlkX3RzLml0c19vdGltZQorI2RlZmluZQlpY21wX3J0aW1lCWljbXBfZHVuLmlkX3RzLml0c19ydGltZQorI2RlZmluZQlpY21wX3R0aW1lCWljbXBfZHVuLmlkX3RzLml0c190dGltZQorI2RlZmluZQlpY21wX2lwCQlpY21wX2R1bi5pZF9pcC5pZGlfaXAKKyNkZWZpbmUJaWNtcF9tYXNrCWljbXBfZHVuLmlkX21hc2sKKyNkZWZpbmUJaWNtcF9kYXRhCWljbXBfZHVuLmlkX2RhdGEKK307CisKKy8qCisgKiBMb3dlciBib3VuZHMgb24gcGFja2V0IGxlbmd0aHMgZm9yIHZhcmlvdXMgdHlwZXMuCisgKiBGb3IgdGhlIGVycm9yIGFkdmljZSBwYWNrZXRzIG11c3QgZmlyc3QgaW5zdXJlIHRoYXQgdGhlCisgKiBwYWNrZXQgaXMgbGFyZ2UgZW5vdWdodCB0byBjb250YWluIHRoZSByZXR1cm5lZCBpcCBoZWFkZXIuCisgKiBPbmx5IHRoZW4gY2FuIHdlIGRvIHRoZSBjaGVjayB0byBzZWUgaWYgNjQgYml0cyBvZiBwYWNrZXQKKyAqIGRhdGEgaGF2ZSBiZWVuIHJldHVybmVkLCBzaW5jZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZAorICogaXAgaGVhZGVyIGxlbmd0aC4KKyAqLworI2RlZmluZQlJQ01QX01JTkxFTgk4CQkJCS8qIGFicyBtaW5pbXVtICovCisjZGVmaW5lCUlDTVBfVFNMRU4JKDggKyAzICogc2l6ZW9mIChuX3RpbWUpKQkvKiB0aW1lc3RhbXAgKi8KKyNkZWZpbmUJSUNNUF9NQVNLTEVOCTEyCQkJCS8qIGFkZHJlc3MgbWFzayAqLworI2RlZmluZQlJQ01QX0FEVkxFTk1JTgkoOCArIHNpemVvZiAoc3RydWN0IGlwKSArIDgpCS8qIG1pbiAqLworI2RlZmluZQlJQ01QX0FEVkxFTihwKQkoOCArICgocCktPmljbXBfaXAuaXBfaGwgPDwgMikgKyA4KQorCS8qIE4uQi46IG11c3Qgc2VwYXJhdGVseSBjaGVjayB0aGF0IGlwX2hsID49IDUgKi8KKworLyoKKyAqIERlZmluaXRpb24gb2YgdHlwZSBhbmQgY29kZSBmaWVsZCB2YWx1ZXMuCisgKi8KKyNkZWZpbmUJSUNNUF9FQ0hPUkVQTFkJCTAJCS8qIGVjaG8gcmVwbHkgKi8KKyNkZWZpbmUJSUNNUF9VTlJFQUNICQkzCQkvKiBkZXN0IHVucmVhY2hhYmxlLCBjb2RlczogKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVQJMAkJLyogYmFkIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1QJMQkJLyogYmFkIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QUk9UT0NPTAkyCQkvKiBiYWQgcHJvdG9jb2wgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QT1JUCTMJCS8qIGJhZCBwb3J0ICovCisjZGVmaW5lCQlJQ01QX1VOUkVBQ0hfTkVFREZSQUcJNAkJLyogSVBfREYgY2F1c2VkIGRyb3AgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9TUkNGQUlMCTUJCS8qIHNyYyByb3V0ZSBmYWlsZWQgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVRfVU5LTk9XTiA2CQkvKiB1bmtub3duIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiA3CQkvKiB1bmtub3duIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9JU09MQVRFRAk4CQkvKiBzcmMgaG9zdCBpc29sYXRlZCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX05FVF9QUk9ISUIJOQkJLyogcHJvaGliaXRlZCBhY2Nlc3MgKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiAxMAkJLyogZGl0dG8gKi8KKyNkZWZpbmUJCUlDTVBfVU5SRUFDSF9UT1NORVQJMTEJCS8qIGJhZCB0b3MgZm9yIG5ldCAqLworI2RlZmluZQkJSUNNUF9VTlJFQUNIX1RPU0hPU1QJMTIJCS8qIGJhZCB0b3MgZm9yIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9TT1VSQ0VRVUVOQ0gJNAkJLyogcGFja2V0IGxvc3QsIHNsb3cgZG93biAqLworI2RlZmluZQlJQ01QX1JFRElSRUNUCQk1CQkvKiBzaG9ydGVyIHJvdXRlLCBjb2RlczogKi8KKyNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfTkVUCTAJCS8qIGZvciBuZXR3b3JrICovCisjZGVmaW5lCQlJQ01QX1JFRElSRUNUX0hPU1QJMQkJLyogZm9yIGhvc3QgKi8KKyNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfVE9TTkVUCTIJCS8qIGZvciB0b3MgYW5kIG5ldCAqLworI2RlZmluZQkJSUNNUF9SRURJUkVDVF9UT1NIT1NUCTMJCS8qIGZvciB0b3MgYW5kIGhvc3QgKi8KKyNkZWZpbmUJSUNNUF9FQ0hPCQk4CQkvKiBlY2hvIHNlcnZpY2UgKi8KKyNkZWZpbmUJSUNNUF9ST1VURVJBRFZFUlQJOQkJLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KKyNkZWZpbmUJSUNNUF9ST1VURVJTT0xJQ0lUCTEwCQkvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCisjZGVmaW5lCUlDTVBfVElNWENFRUQJCTExCQkvKiB0aW1lIGV4Y2VlZGVkLCBjb2RlOiAqLworI2RlZmluZQkJSUNNUF9USU1YQ0VFRF9JTlRSQU5TCTAJCS8qIHR0bD09MCBpbiB0cmFuc2l0ICovCisjZGVmaW5lCQlJQ01QX1RJTVhDRUVEX1JFQVNTCTEJCS8qIHR0bD09MCBpbiByZWFzcyAqLworI2RlZmluZQlJQ01QX1BBUkFNUFJPQgkJMTIJCS8qIGlwIGhlYWRlciBiYWQgKi8KKyNkZWZpbmUJCUlDTVBfUEFSQU1QUk9CX09QVEFCU0VOVCAxCQkvKiByZXEuIG9wdC4gYWJzZW50ICovCisjZGVmaW5lCUlDTVBfVFNUQU1QCQkxMwkJLyogdGltZXN0YW1wIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9UU1RBTVBSRVBMWQkxNAkJLyogdGltZXN0YW1wIHJlcGx5ICovCisjZGVmaW5lCUlDTVBfSVJFUQkJMTUJCS8qIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KKyNkZWZpbmUJSUNNUF9JUkVRUkVQTFkJCTE2CQkvKiBpbmZvcm1hdGlvbiByZXBseSAqLworI2RlZmluZQlJQ01QX01BU0tSRVEJCTE3CQkvKiBhZGRyZXNzIG1hc2sgcmVxdWVzdCAqLworI2RlZmluZQlJQ01QX01BU0tSRVBMWQkJMTgJCS8qIGFkZHJlc3MgbWFzayByZXBseSAqLworCisjZGVmaW5lCUlDTVBfTUFYVFlQRQkJMTgKKworI2RlZmluZQlJQ01QX0lORk9UWVBFKHR5cGUpIFwKKwkoKHR5cGUpID09IElDTVBfRUNIT1JFUExZIHx8ICh0eXBlKSA9PSBJQ01QX0VDSE8gfHwgXAorCSh0eXBlKSA9PSBJQ01QX1JPVVRFUkFEVkVSVCB8fCAodHlwZSkgPT0gSUNNUF9ST1VURVJTT0xJQ0lUIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9UU1RBTVAgfHwgKHR5cGUpID09IElDTVBfVFNUQU1QUkVQTFkgfHwgXAorCSh0eXBlKSA9PSBJQ01QX0lSRVEgfHwgKHR5cGUpID09IElDTVBfSVJFUVJFUExZIHx8IFwKKwkodHlwZSkgPT0gSUNNUF9NQVNLUkVRIHx8ICh0eXBlKSA9PSBJQ01QX01BU0tSRVBMWSkKKwordm9pZCBpY21wX2lucHV0IF9QKChzdHJ1Y3QgbWJ1ZiAqLCBpbnQpKTsKK3ZvaWQgaWNtcF9lcnJvcihzdHJ1Y3QgbWJ1ZiAqbXNyYywgdV9jaGFyIHR5cGUsIHVfY2hhciBjb2RlLCBpbnQgbWluc2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXNzYWdlKTsKK3ZvaWQgaWNtcF9yZWZsZWN0IF9QKChzdHJ1Y3QgbWJ1ZiAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9pcF9pbnB1dC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9pcF9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2VmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL2lwX2lucHV0LmMKQEAgLTAsMCArMSw3MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXBfaW5wdXQuYwk4LjIgKEJlcmtlbGV5KSAxLzQvOTQKKyAqIGlwX2lucHV0LmMsdiAxLjExIDE5OTQvMTEvMTYgMTA6MTc6MDggamtoIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAgYXJlCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisjaW5jbHVkZSA8cWVtdS9vc2RlcC5oPgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKworI2lmZGVmIExPR19FTkFCTEVECitzdHJ1Y3QgaXBzdGF0IGlwc3RhdDsKKyNlbmRpZgorCitzdHJ1Y3QgaXBxIGlwcTsKKworc3RhdGljIHN0cnVjdCBpcCAqaXBfcmVhc3MocmVnaXN0ZXIgc3RydWN0IGlwICppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcHEgKmZwKTsKK3N0YXRpYyB2b2lkIGlwX2ZyZWVmKHN0cnVjdCBpcHEgKmZwKTsKK3N0YXRpYyB2b2lkIGlwX2VucShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnAsCisgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwYXNmcmFnICpwcmV2KTsKK3N0YXRpYyB2b2lkIGlwX2RlcShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnApOworCisvKgorICogSVAgaW5pdGlhbGl6YXRpb246IGZpbGwgaW4gSVAgcHJvdG9jb2wgc3dpdGNoIHRhYmxlLgorICogQWxsIHByb3RvY29scyBub3QgaW1wbGVtZW50ZWQgaW4ga2VybmVsIGdvIHRvIHJhdyBJUCBwcm90b2NvbCBoYW5kbGVyLgorICovCit2b2lkCitpcF9pbml0KHZvaWQpCit7CisJaXBxLmlwX2xpbmsubmV4dCA9IGlwcS5pcF9saW5rLnByZXYgPSAmaXBxLmlwX2xpbms7CisJaXBfaWQgPSB0dC50dl9zZWMgJiAweGZmZmY7CisJdWRwX2luaXQoKTsKKwl0Y3BfaW5pdCgpOworfQorCisvKgorICogSXAgaW5wdXQgcm91dGluZS4gIENoZWNrc3VtIGFuZCBieXRlIHN3YXAgaGVhZGVyLiAgSWYgZnJhZ21lbnRlZAorICogdHJ5IHRvIHJlYXNzZW1ibGUuICBQcm9jZXNzIG9wdGlvbnMuICBQYXNzIHRvIG5leHQgbGV2ZWwuCisgKi8KK3ZvaWQKK2lwX2lucHV0KHN0cnVjdCBtYnVmICptKQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CisJaW50IGhsZW47CisKKwlERUJVR19DQUxMKCJpcF9pbnB1dCIpOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygibV9sZW4gPSAlZCIsIG0tPm1fbGVuKTsKKworCVNUQVQoaXBzdGF0Lmlwc190b3RhbCsrKTsKKworCWlmIChtLT5tX2xlbiA8IHNpemVvZiAoc3RydWN0IGlwKSkgeworCQlTVEFUKGlwc3RhdC5pcHNfdG9vc21hbGwrKyk7CisJCXJldHVybjsKKwl9CisKKwlpcCA9IG10b2QobSwgc3RydWN0IGlwICopOworCisJaWYgKGlwLT5pcF92ICE9IElQVkVSU0lPTikgeworCQlTVEFUKGlwc3RhdC5pcHNfYmFkdmVycysrKTsKKwkJZ290byBiYWQ7CisJfQorCisJaGxlbiA9IGlwLT5pcF9obCA8PCAyOworCWlmIChobGVuPHNpemVvZihzdHJ1Y3QgaXAgKSB8fCBobGVuPm0tPm1fbGVuKSB7LyogbWluIGhlYWRlciBsZW5ndGggKi8KKwkgIFNUQVQoaXBzdGF0Lmlwc19iYWRobGVuKyspOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yIHBhY2tldCB0b28gc2hvcnQgKi8KKwkgIGdvdG8gYmFkOworCX0KKworICAgICAgICAvKiBrZWVwIGlwIGhlYWRlciBpbnRhY3QgZm9yIElDTVAgcmVwbHkKKwkgKiBpcC0+aXBfc3VtID0gY2tzdW0obSwgaGxlbik7CisJICogaWYgKGlwLT5pcF9zdW0pIHsKKwkgKi8KKwlpZihja3N1bShtLGhsZW4pKSB7CisJICBTVEFUKGlwc3RhdC5pcHNfYmFkc3VtKyspOworCSAgZ290byBiYWQ7CisJfQorCisJLyoKKwkgKiBDb252ZXJ0IGZpZWxkcyB0byBob3N0IHJlcHJlc2VudGF0aW9uLgorCSAqLworCU5UT0hTKGlwLT5pcF9sZW4pOworCWlmIChpcC0+aXBfbGVuIDwgaGxlbikgeworCQlTVEFUKGlwc3RhdC5pcHNfYmFkbGVuKyspOworCQlnb3RvIGJhZDsKKwl9CisJTlRPSFMoaXAtPmlwX2lkKTsKKwlOVE9IUyhpcC0+aXBfb2ZmKTsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIGJ1ZmZlcnMKKwkgKiBpcyBhcyBhdCBsZWFzdCBtdWNoIGFzIHRoZSBJUCBoZWFkZXIgd291bGQgaGF2ZSB1cyBleHBlY3QuCisJICogVHJpbSBtYnVmcyBpZiBsb25nZXIgdGhhbiB3ZSBleHBlY3QuCisJICogRHJvcCBwYWNrZXQgaWYgc2hvcnRlciB0aGFuIHdlIGV4cGVjdC4KKwkgKi8KKwlpZiAobS0+bV9sZW4gPCBpcC0+aXBfbGVuKSB7CisJCVNUQVQoaXBzdGF0Lmlwc190b29zaG9ydCsrKTsKKwkJZ290byBiYWQ7CisJfQorCisgICAgaWYgKHNsaXJwX3Jlc3RyaWN0KSB7CisgICAgICAgIGlmIChtZW1jbXAoJmlwLT5pcF9kc3Quc19hZGRyLCAmc3BlY2lhbF9hZGRyLCAzKSkgeworICAgICAgICAgICAgaWYgKGlwLT5pcF9kc3Quc19hZGRyID09IDB4ZmZmZmZmZmYgJiYgaXAtPmlwX3AgIT0gSVBQUk9UT19VRFApCisgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaG9zdCA9IG50b2hsKGlwLT5pcF9kc3Quc19hZGRyKSAmIDB4ZmY7CisgICAgICAgICAgICBzdHJ1Y3QgZXhfbGlzdCAqZXhfcHRyOworCisgICAgICAgICAgICBpZiAoaG9zdCA9PSAweGZmKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkOworCisgICAgICAgICAgICBmb3IgKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpCisgICAgICAgICAgICAgICAgaWYgKGV4X3B0ci0+ZXhfYWRkciA9PSBob3N0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKCFleF9wdHIpCisgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKyAgICB9CisKKwkvKiBTaG91bGQgZHJvcCBwYWNrZXQgaWYgbWJ1ZiB0b28gbG9uZz8gaG1tbS4uLiAqLworCWlmIChtLT5tX2xlbiA+IGlwLT5pcF9sZW4pCisJICAgbV9hZGoobSwgaXAtPmlwX2xlbiAtIG0tPm1fbGVuKTsKKworCS8qIGNoZWNrIGlwX3R0bCBmb3IgYSBjb3JyZWN0IElDTVAgcmVwbHkgKi8KKwlpZihpcC0+aXBfdHRsPT0wIHx8IGlwLT5pcF90dGw9PTEpIHsKKwkgIGljbXBfZXJyb3IobSwgSUNNUF9USU1YQ0VFRCxJQ01QX1RJTVhDRUVEX0lOVFJBTlMsIDAsInR0bCIpOworCSAgZ290byBiYWQ7CisJfQorCisJLyoKKwkgKiBQcm9jZXNzIG9wdGlvbnMgYW5kLCBpZiBub3QgZGVzdGluZWQgZm9yIHVzLAorCSAqIHNoaXAgaXQgb24uICBpcF9kb29wdGlvbnMgcmV0dXJucyAxIHdoZW4gYW4KKwkgKiBlcnJvciB3YXMgZGV0ZWN0ZWQgKGNhdXNpbmcgYW4gaWNtcCBtZXNzYWdlCisJICogdG8gYmUgc2VudCBhbmQgdGhlIG9yaWdpbmFsIHBhY2tldCB0byBiZSBmcmVlZCkuCisJICovCisvKiBXZSBkbyBubyBJUCBvcHRpb25zICovCisvKglpZiAoaGxlbiA+IHNpemVvZiAoc3RydWN0IGlwKSAmJiBpcF9kb29wdGlvbnMobSkpCisgKgkJZ290byBuZXh0OworICovCisJLyoKKwkgKiBJZiBvZmZzZXQgb3IgSVBfTUYgYXJlIHNldCwgbXVzdCByZWFzc2VtYmxlLgorCSAqIE90aGVyd2lzZSwgbm90aGluZyBuZWVkIGJlIGRvbmUuCisJICogKFdlIGNvdWxkIGxvb2sgaW4gdGhlIHJlYXNzZW1ibHkgcXVldWUgdG8gc2VlCisJICogaWYgdGhlIHBhY2tldCB3YXMgcHJldmlvdXNseSBmcmFnbWVudGVkLAorCSAqIGJ1dCBpdCdzIG5vdCB3b3J0aCB0aGUgdGltZTsganVzdCBsZXQgdGhlbSB0aW1lIG91dC4pCisJICoKKwkgKiBYWFggVGhpcyBzaG91bGQgZmFpbCwgZG9uJ3QgZnJhZ21lbnQgeWV0CisJICovCisJaWYgKGlwLT5pcF9vZmYgJn4gSVBfREYpIHsKKwkgIHJlZ2lzdGVyIHN0cnVjdCBpcHEgKmZwOworICAgICAgc3RydWN0IHFsaW5rICpsOworCQkvKgorCQkgKiBMb29rIGZvciBxdWV1ZSBvZiBmcmFnbWVudHMKKwkJICogb2YgdGhpcyBkYXRhZ3JhbS4KKwkJICovCisJCWZvciAobCA9IGlwcS5pcF9saW5rLm5leHQ7IGwgIT0gJmlwcS5pcF9saW5rOyBsID0gbC0+bmV4dCkgeworICAgICAgICAgICAgZnAgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGlwcSwgaXBfbGluayk7CisgICAgICAgICAgICBpZiAoaXAtPmlwX2lkID09IGZwLT5pcHFfaWQgJiYKKyAgICAgICAgICAgICAgICAgICAgaXAtPmlwX3NyYy5zX2FkZHIgPT0gZnAtPmlwcV9zcmMuc19hZGRyICYmCisgICAgICAgICAgICAgICAgICAgIGlwLT5pcF9kc3Quc19hZGRyID09IGZwLT5pcHFfZHN0LnNfYWRkciAmJgorICAgICAgICAgICAgICAgICAgICBpcC0+aXBfcCA9PSBmcC0+aXBxX3ApCisJCSAgICBnb3RvIGZvdW5kOworICAgICAgICB9CisgICAgICAgIGZwID0gTlVMTDsKKwlmb3VuZDoKKworCQkvKgorCQkgKiBBZGp1c3QgaXBfbGVuIHRvIG5vdCByZWZsZWN0IGhlYWRlciwKKwkJICogc2V0IGlwX21mZiBpZiBtb3JlIGZyYWdtZW50cyBhcmUgZXhwZWN0ZWQsCisJCSAqIGNvbnZlcnQgb2Zmc2V0IG9mIHRoaXMgdG8gYnl0ZXMuCisJCSAqLworCQlpcC0+aXBfbGVuIC09IGhsZW47CisJCWlmIChpcC0+aXBfb2ZmICYgSVBfTUYpCisJCSAgaXAtPmlwX3RvcyB8PSAxOworCQllbHNlCisJCSAgaXAtPmlwX3RvcyAmPSB+MTsKKworCQlpcC0+aXBfb2ZmIDw8PSAzOworCisJCS8qCisJCSAqIElmIGRhdGFncmFtIG1hcmtlZCBhcyBoYXZpbmcgbW9yZSBmcmFnbWVudHMKKwkJICogb3IgaWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGZyYWdtZW50LAorCQkgKiBhdHRlbXB0IHJlYXNzZW1ibHk7IGlmIGl0IHN1Y2NlZWRzLCBwcm9jZWVkLgorCQkgKi8KKwkJaWYgKGlwLT5pcF90b3MgJiAxIHx8IGlwLT5pcF9vZmYpIHsKKwkJCVNUQVQoaXBzdGF0Lmlwc19mcmFnbWVudHMrKyk7CisJCQlpcCA9IGlwX3JlYXNzKGlwLCBmcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAgPT0gTlVMTCkKKwkJCQlyZXR1cm47CisJCQlTVEFUKGlwc3RhdC5pcHNfcmVhc3NlbWJsZWQrKyk7CisJCQltID0gZHRvbShpcCk7CisJCX0gZWxzZQorCQkJaWYgKGZwKQorCQkgICAJICAgaXBfZnJlZWYoZnApOworCisJfSBlbHNlCisJCWlwLT5pcF9sZW4gLT0gaGxlbjsKKworCS8qCisJICogU3dpdGNoIG91dCB0byBwcm90b2NvbCdzIGlucHV0IHJvdXRpbmUuCisJICovCisJU1RBVChpcHN0YXQuaXBzX2RlbGl2ZXJlZCsrKTsKKwlzd2l0Y2ggKGlwLT5pcF9wKSB7CisJIGNhc2UgSVBQUk9UT19UQ1A6CisJCXRjcF9pbnB1dChtLCBobGVuLCAoc3RydWN0IHNvY2tldCAqKU5VTEwpOworCQlicmVhazsKKwkgY2FzZSBJUFBST1RPX1VEUDoKKwkJdWRwX2lucHV0KG0sIGhsZW4pOworCQlicmVhazsKKwkgY2FzZSBJUFBST1RPX0lDTVA6CisJCWljbXBfaW5wdXQobSwgaGxlbik7CisJCWJyZWFrOworCSBkZWZhdWx0OgorCQlTVEFUKGlwc3RhdC5pcHNfbm9wcm90bysrKTsKKwkJbV9mcmVlKG0pOworCX0KKwlyZXR1cm47CitiYWQ6CisJbV9mcmVlbShtKTsKKwlyZXR1cm47Cit9CisKKyNkZWZpbmUgaXB0b2ZyYWcoUCkgKChzdHJ1Y3QgaXBhc2ZyYWcgKikoKChjaGFyKikoUCkpIC0gc2l6ZW9mKHN0cnVjdCBxbGluaykpKQorI2RlZmluZSBmcmFndG9pcChQKSAoKHN0cnVjdCBpcCopKCgoY2hhciopKFApKSArIHNpemVvZihzdHJ1Y3QgcWxpbmspKSkKKy8qCisgKiBUYWtlIGluY29taW5nIGRhdGFncmFtIGZyYWdtZW50IGFuZCB0cnkgdG8KKyAqIHJlYXNzZW1ibGUgaXQgaW50byB3aG9sZSBkYXRhZ3JhbS4gIElmIGEgY2hhaW4gZm9yCisgKiByZWFzc2VtYmx5IG9mIHRoaXMgZGF0YWdyYW0gYWxyZWFkeSBleGlzdHMsIHRoZW4gaXQKKyAqIGlzIGdpdmVuIGFzIGZwOyBvdGhlcndpc2UgaGF2ZSB0byBtYWtlIGEgY2hhaW4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaXAgKgoraXBfcmVhc3MocmVnaXN0ZXIgc3RydWN0IGlwICppcCwgcmVnaXN0ZXIgc3RydWN0IGlwcSAqZnApCit7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm0gPSBkdG9tKGlwKTsKKwlyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnE7CisJaW50IGhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKKwlpbnQgaSwgbmV4dDsKKworCURFQlVHX0NBTEwoImlwX3JlYXNzIik7CisJREVCVUdfQVJHKCJpcCA9ICVseCIsIChsb25nKWlwKTsKKwlERUJVR19BUkcoImZwID0gJWx4IiwgKGxvbmcpZnApOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCisJLyoKKwkgKiBQcmVzZW5jZSBvZiBoZWFkZXIgc2l6ZXMgaW4gbWJ1ZnMKKwkgKiB3b3VsZCBjb25mdXNlIGNvZGUgYmVsb3cuCisgICAgICAgICAqIEZyYWdtZW50IG1fZGF0YSBpcyBjb25jYXRlbmF0ZWQuCisJICovCisJbS0+bV9kYXRhICs9IGhsZW47CisJbS0+bV9sZW4gLT0gaGxlbjsKKworCS8qCisJICogSWYgZmlyc3QgZnJhZ21lbnQgdG8gYXJyaXZlLCBjcmVhdGUgYSByZWFzc2VtYmx5IHF1ZXVlLgorCSAqLworICAgICAgICBpZiAoZnAgPT0gTlVMTCkgeworCSAgc3RydWN0IG1idWYgKnQ7CisJICBpZiAoKHQgPSBtX2dldCgpKSA9PSBOVUxMKSBnb3RvIGRyb3BmcmFnOworCSAgZnAgPSBtdG9kKHQsIHN0cnVjdCBpcHEgKik7CisJICBpbnNxdWUoJmZwLT5pcF9saW5rLCAmaXBxLmlwX2xpbmspOworCSAgZnAtPmlwcV90dGwgPSBJUEZSQUdUVEw7CisJICBmcC0+aXBxX3AgPSBpcC0+aXBfcDsKKwkgIGZwLT5pcHFfaWQgPSBpcC0+aXBfaWQ7CisJICBmcC0+ZnJhZ19saW5rLm5leHQgPSBmcC0+ZnJhZ19saW5rLnByZXYgPSAmZnAtPmZyYWdfbGluazsKKwkgIGZwLT5pcHFfc3JjID0gaXAtPmlwX3NyYzsKKwkgIGZwLT5pcHFfZHN0ID0gaXAtPmlwX2RzdDsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopZnA7CisJICBnb3RvIGluc2VydDsKKwl9CisKKwkvKgorCSAqIEZpbmQgYSBzZWdtZW50IHdoaWNoIGJlZ2lucyBhZnRlciB0aGlzIG9uZSBkb2VzLgorCSAqLworCWZvciAocSA9IGZwLT5mcmFnX2xpbmsubmV4dDsgcSAhPSAoc3RydWN0IGlwYXNmcmFnICopJmZwLT5mcmFnX2xpbms7CisgICAgICAgICAgICBxID0gcS0+aXBmX25leHQpCisJCWlmIChxLT5pcGZfb2ZmID4gaXAtPmlwX29mZikKKwkJCWJyZWFrOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIHByZWNlZGluZyBzZWdtZW50LCBpdCBtYXkgcHJvdmlkZSBzb21lIG9mCisJICogb3VyIGRhdGEgYWxyZWFkeS4gIElmIHNvLCBkcm9wIHRoZSBkYXRhIGZyb20gdGhlIGluY29taW5nCisJICogc2VnbWVudC4gIElmIGl0IHByb3ZpZGVzIGFsbCBvZiBvdXIgZGF0YSwgZHJvcCB1cy4KKwkgKi8KKwlpZiAocS0+aXBmX3ByZXYgIT0gJmZwLT5mcmFnX2xpbmspIHsKKyAgICAgICAgc3RydWN0IGlwYXNmcmFnICpwcSA9IHEtPmlwZl9wcmV2OworCQlpID0gcHEtPmlwZl9vZmYgKyBwcS0+aXBmX2xlbiAtIGlwLT5pcF9vZmY7CisJCWlmIChpID4gMCkgeworCQkJaWYgKGkgPj0gaXAtPmlwX2xlbikKKwkJCQlnb3RvIGRyb3BmcmFnOworCQkJbV9hZGooZHRvbShpcCksIGkpOworCQkJaXAtPmlwX29mZiArPSBpOworCQkJaXAtPmlwX2xlbiAtPSBpOworCQl9CisJfQorCisJLyoKKwkgKiBXaGlsZSB3ZSBvdmVybGFwIHN1Y2NlZWRpbmcgc2VnbWVudHMgdHJpbSB0aGVtIG9yLAorCSAqIGlmIHRoZXkgYXJlIGNvbXBsZXRlbHkgY292ZXJlZCwgZGVxdWV1ZSB0aGVtLgorCSAqLworCXdoaWxlIChxICE9IChzdHJ1Y3QgaXBhc2ZyYWcqKSZmcC0+ZnJhZ19saW5rICYmCisgICAgICAgICAgICBpcC0+aXBfb2ZmICsgaXAtPmlwX2xlbiA+IHEtPmlwZl9vZmYpIHsKKwkJaSA9IChpcC0+aXBfb2ZmICsgaXAtPmlwX2xlbikgLSBxLT5pcGZfb2ZmOworCQlpZiAoaSA8IHEtPmlwZl9sZW4pIHsKKwkJCXEtPmlwZl9sZW4gLT0gaTsKKwkJCXEtPmlwZl9vZmYgKz0gaTsKKwkJCW1fYWRqKGR0b20ocSksIGkpOworCQkJYnJlYWs7CisJCX0KKwkJcSA9IHEtPmlwZl9uZXh0OworCQltX2ZyZWVtKGR0b20ocS0+aXBmX3ByZXYpKTsKKwkJaXBfZGVxKHEtPmlwZl9wcmV2KTsKKwl9CisKK2luc2VydDoKKwkvKgorCSAqIFN0aWNrIG5ldyBzZWdtZW50IGluIGl0cyBwbGFjZTsKKwkgKiBjaGVjayBmb3IgY29tcGxldGUgcmVhc3NlbWJseS4KKwkgKi8KKwlpcF9lbnEoaXB0b2ZyYWcoaXApLCBxLT5pcGZfcHJldik7CisJbmV4dCA9IDA7CisJZm9yIChxID0gZnAtPmZyYWdfbGluay5uZXh0OyBxICE9IChzdHJ1Y3QgaXBhc2ZyYWcqKSZmcC0+ZnJhZ19saW5rOworICAgICAgICAgICAgcSA9IHEtPmlwZl9uZXh0KSB7CisJCWlmIChxLT5pcGZfb2ZmICE9IG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwkJbmV4dCArPSBxLT5pcGZfbGVuOworCX0KKwlpZiAoKChzdHJ1Y3QgaXBhc2ZyYWcgKikocS0+aXBmX3ByZXYpKS0+aXBmX3RvcyAmIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIFJlYXNzZW1ibHkgaXMgY29tcGxldGU7IGNvbmNhdGVuYXRlIGZyYWdtZW50cy4KKwkgKi8KKyAgICBxID0gZnAtPmZyYWdfbGluay5uZXh0OworCW0gPSBkdG9tKHEpOworCisJcSA9IChzdHJ1Y3QgaXBhc2ZyYWcgKikgcS0+aXBmX25leHQ7CisJd2hpbGUgKHEgIT0gKHN0cnVjdCBpcGFzZnJhZyopJmZwLT5mcmFnX2xpbmspIHsKKwkgIHN0cnVjdCBtYnVmICp0ID0gZHRvbShxKTsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopIHEtPmlwZl9uZXh0OworCSAgbV9jYXQobSwgdCk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgaGVhZGVyIGZvciBuZXcgaXAgcGFja2V0IGJ5CisJICogbW9kaWZ5aW5nIGhlYWRlciBvZiBmaXJzdCBwYWNrZXQ7CisJICogZGVxdWV1ZSBhbmQgZGlzY2FyZCBmcmFnbWVudCByZWFzc2VtYmx5IGhlYWRlci4KKwkgKiBNYWtlIGhlYWRlciB2aXNpYmxlLgorCSAqLworCXEgPSBmcC0+ZnJhZ19saW5rLm5leHQ7CisKKwkvKgorCSAqIElmIHRoZSBmcmFnbWVudHMgY29uY2F0ZW5hdGVkIHRvIGFuIG1idWYgdGhhdCdzCisJICogYmlnZ2VyIHRoYW4gdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZyYWdtZW50LCB0aGVuIGFuZAorCSAqIG1fZXh0IGJ1ZmZlciB3YXMgYWxsb2NlZC4gQnV0IGZwLT5pcHFfbmV4dCBwb2ludHMgdG8KKwkgKiB0aGUgb2xkIGJ1ZmZlciAoaW4gdGhlIG1idWYpLCBzbyB3ZSBtdXN0IHBvaW50IGlwCisJICogaW50byB0aGUgbmV3IGJ1ZmZlci4KKwkgKi8KKwlpZiAobS0+bV9mbGFncyAmIE1fRVhUKSB7CisJICBpbnQgZGVsdGEgPSAoY2hhciAqKXEgLSBtLT5tX2RhdDsKKwkgIHEgPSAoc3RydWN0IGlwYXNmcmFnICopKG0tPm1fZXh0ICsgZGVsdGEpOworCX0KKworCS8qIERFQlVHX0FSRygiaXAgPSAlbHgiLCAobG9uZylpcCk7CisJICogaXA9KHN0cnVjdCBpcGFzZnJhZyAqKW0tPm1fZGF0YTsgKi8KKworICAgIGlwID0gZnJhZ3RvaXAocSk7CisJaXAtPmlwX2xlbiA9IG5leHQ7CisJaXAtPmlwX3RvcyAmPSB+MTsKKwlpcC0+aXBfc3JjID0gZnAtPmlwcV9zcmM7CisJaXAtPmlwX2RzdCA9IGZwLT5pcHFfZHN0OworCXJlbXF1ZSgmZnAtPmlwX2xpbmspOworCSh2b2lkKSBtX2ZyZWUoZHRvbShmcCkpOworCW0tPm1fbGVuICs9IChpcC0+aXBfaGwgPDwgMik7CisJbS0+bV9kYXRhIC09IChpcC0+aXBfaGwgPDwgMik7CisKKwlyZXR1cm4gaXA7CisKK2Ryb3BmcmFnOgorCVNUQVQoaXBzdGF0Lmlwc19mcmFnZHJvcHBlZCsrKTsKKwltX2ZyZWVtKG0pOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZyZWUgYSBmcmFnbWVudCByZWFzc2VtYmx5IGhlYWRlciBhbmQgYWxsCisgKiBhc3NvY2lhdGVkIGRhdGFncmFtcy4KKyAqLworc3RhdGljIHZvaWQKK2lwX2ZyZWVmKHN0cnVjdCBpcHEgKmZwKQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcGFzZnJhZyAqcSwgKnA7CisKKwlmb3IgKHEgPSBmcC0+ZnJhZ19saW5rLm5leHQ7IHEgIT0gKHN0cnVjdCBpcGFzZnJhZyopJmZwLT5mcmFnX2xpbms7IHEgPSBwKSB7CisJCXAgPSBxLT5pcGZfbmV4dDsKKwkJaXBfZGVxKHEpOworCQltX2ZyZWVtKGR0b20ocSkpOworCX0KKwlyZW1xdWUoJmZwLT5pcF9saW5rKTsKKwkodm9pZCkgbV9mcmVlKGR0b20oZnApKTsKK30KKworLyoKKyAqIFB1dCBhbiBpcCBmcmFnbWVudCBvbiBhIHJlYXNzZW1ibHkgY2hhaW4uCisgKiBMaWtlIGluc3F1ZSwgYnV0IHBvaW50ZXJzIGluIG1pZGRsZSBvZiBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCitpcF9lbnEocmVnaXN0ZXIgc3RydWN0IGlwYXNmcmFnICpwLCByZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnByZXYpCit7CisJREVCVUdfQ0FMTCgiaXBfZW5xIik7CisJREVCVUdfQVJHKCJwcmV2ID0gJWx4IiwgKGxvbmcpcHJldik7CisJcC0+aXBmX3ByZXYgPSAgcHJldjsKKwlwLT5pcGZfbmV4dCA9IHByZXYtPmlwZl9uZXh0OworCSgoc3RydWN0IGlwYXNmcmFnICopKHByZXYtPmlwZl9uZXh0KSktPmlwZl9wcmV2ID0gcDsKKwlwcmV2LT5pcGZfbmV4dCA9IHA7Cit9CisKKy8qCisgKiBUbyBpcF9lbnEgYXMgcmVtcXVlIGlzIHRvIGluc3F1ZS4KKyAqLworc3RhdGljIHZvaWQKK2lwX2RlcShyZWdpc3RlciBzdHJ1Y3QgaXBhc2ZyYWcgKnApCit7CisJKChzdHJ1Y3QgaXBhc2ZyYWcgKikocC0+aXBmX3ByZXYpKS0+aXBmX25leHQgPSBwLT5pcGZfbmV4dDsKKwkoKHN0cnVjdCBpcGFzZnJhZyAqKShwLT5pcGZfbmV4dCkpLT5pcGZfcHJldiA9IHAtPmlwZl9wcmV2OworfQorCisvKgorICogSVAgdGltZXIgcHJvY2Vzc2luZzsKKyAqIGlmIGEgdGltZXIgZXhwaXJlcyBvbiBhIHJlYXNzZW1ibHkKKyAqIHF1ZXVlLCBkaXNjYXJkIGl0LgorICovCit2b2lkCitpcF9zbG93dGltbyh2b2lkKQoreworICAgIHN0cnVjdCBxbGluayAqbDsKKworCURFQlVHX0NBTEwoImlwX3Nsb3d0aW1vIik7CisKKyAgICBsID0gaXBxLmlwX2xpbmsubmV4dDsKKworICAgICAgICBpZiAobCA9PSBOVUxMKQorCSAgIHJldHVybjsKKworCXdoaWxlIChsICE9ICZpcHEuaXBfbGluaykgeworICAgICAgICBzdHJ1Y3QgaXBxICpmcCA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaXBxLCBpcF9saW5rKTsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisJCWlmICgtLWZwLT5pcHFfdHRsID09IDApIHsKKwkJCVNUQVQoaXBzdGF0Lmlwc19mcmFndGltZW91dCsrKTsKKwkJCWlwX2ZyZWVmKGZwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIERvIG9wdGlvbiBwcm9jZXNzaW5nIG9uIGEgZGF0YWdyYW0sCisgKiBwb3NzaWJseSBkaXNjYXJkaW5nIGl0IGlmIGJhZCBvcHRpb25zIGFyZSBlbmNvdW50ZXJlZCwKKyAqIG9yIGZvcndhcmRpbmcgaXQgaWYgc291cmNlLXJvdXRlZC4KKyAqIFJldHVybnMgMSBpZiBwYWNrZXQgaGFzIGJlZW4gZm9yd2FyZGVkL2ZyZWVkLAorICogMCBpZiB0aGUgcGFja2V0IHNob3VsZCBiZSBwcm9jZXNzZWQgZnVydGhlci4KKyAqLworCisjaWZkZWYgbm90ZGVmCisKK2ludAoraXBfZG9vcHRpb25zKG0pCisJc3RydWN0IG1idWYgKm07Cit7CisJcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IG10b2QobSwgc3RydWN0IGlwICopOworCXJlZ2lzdGVyIHVfY2hhciAqY3A7CisJcmVnaXN0ZXIgc3RydWN0IGlwX3RpbWVzdGFtcCAqaXB0OworCXJlZ2lzdGVyIHN0cnVjdCBpbl9pZmFkZHIgKmlhOworLyoJaW50IG9wdCwgb3B0bGVuLCBjbnQsIG9mZiwgY29kZSwgdHlwZSA9IElDTVBfUEFSQU1QUk9CLCBmb3J3YXJkID0gMDsgKi8KKwlpbnQgb3B0LCBvcHRsZW4sIGNudCwgb2ZmLCBjb2RlLCB0eXBlLCBmb3J3YXJkID0gMDsKKwlzdHJ1Y3QgaW5fYWRkciAqc2luLCBkc3Q7Cit0eXBlZGVmIHVfaW50MzJfdCBuX3RpbWU7CisJbl90aW1lIG50aW1lOworCisJZHN0ID0gaXAtPmlwX2RzdDsKKwljcCA9ICh1X2NoYXIgKikoaXAgKyAxKTsKKwljbnQgPSAoaXAtPmlwX2hsIDw8IDIpIC0gc2l6ZW9mIChzdHJ1Y3QgaXApOworCWZvciAoOyBjbnQgPiAwOyBjbnQgLT0gb3B0bGVuLCBjcCArPSBvcHRsZW4pIHsKKwkJb3B0ID0gY3BbSVBPUFRfT1BUVkFMXTsKKwkJaWYgKG9wdCA9PSBJUE9QVF9FT0wpCisJCQlicmVhazsKKwkJaWYgKG9wdCA9PSBJUE9QVF9OT1ApCisJCQlvcHRsZW4gPSAxOworCQllbHNlIHsKKwkJCW9wdGxlbiA9IGNwW0lQT1BUX09MRU5dOworCQkJaWYgKG9wdGxlbiA8PSAwIHx8IG9wdGxlbiA+IGNudCkgeworCQkJCWNvZGUgPSAmY3BbSVBPUFRfT0xFTl0gLSAodV9jaGFyICopaXA7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCX0KKwkJc3dpdGNoIChvcHQpIHsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogU291cmNlIHJvdXRpbmcgd2l0aCByZWNvcmQuCisJCSAqIEZpbmQgaW50ZXJmYWNlIHdpdGggY3VycmVudCBkZXN0aW5hdGlvbiBhZGRyZXNzLgorCQkgKiBJZiBub25lIG9uIHRoaXMgbWFjaGluZSB0aGVuIGRyb3AgaWYgc3RyaWN0bHkgcm91dGVkLAorCQkgKiBvciBkbyBub3RoaW5nIGlmIGxvb3NlbHkgcm91dGVkLgorCQkgKiBSZWNvcmQgaW50ZXJmYWNlIGFkZHJlc3MgYW5kIGJyaW5nIHVwIG5leHQgYWRkcmVzcworCQkgKiBjb21wb25lbnQuICBJZiBzdHJpY3RseSByb3V0ZWQgbWFrZSBzdXJlIG5leHQKKwkJICogYWRkcmVzcyBpcyBvbiBkaXJlY3RseSBhY2Nlc3NpYmxlIG5ldC4KKwkJICovCisJCWNhc2UgSVBPUFRfTFNSUjoKKwkJY2FzZSBJUE9QVF9TU1JSOgorCQkJaWYgKChvZmYgPSBjcFtJUE9QVF9PRkZTRVRdKSA8IElQT1BUX01JTk9GRikgeworCQkJCWNvZGUgPSAmY3BbSVBPUFRfT0ZGU0VUXSAtICh1X2NoYXIgKilpcDsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlwYWRkci5zaW5fYWRkciA9IGlwLT5pcF9kc3Q7CisJCQlpYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopCisJCQkJaWZhX2lmd2l0aGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZpcGFkZHIpOworCQkJaWYgKGlhID09IDApIHsKKwkJCQlpZiAob3B0ID09IElQT1BUX1NTUlIpIHsKKwkJCQkJdHlwZSA9IElDTVBfVU5SRUFDSDsKKwkJCQkJY29kZSA9IElDTVBfVU5SRUFDSF9TUkNGQUlMOworCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBMb29zZSByb3V0aW5nLCBhbmQgbm90IGF0IG5leHQgZGVzdGluYXRpb24KKwkJCQkgKiB5ZXQ7IG5vdGhpbmcgdG8gZG8gZXhjZXB0IGZvcndhcmQuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlvZmYtLTsJCQkvICogMCBvcmlnaW4gKiAgLworCQkJaWYgKG9mZiA+IG9wdGxlbiAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJCQkvKgorCQkJCSAqIEVuZCBvZiBzb3VyY2Ugcm91dGUuICBTaG91bGQgYmUgZm9yIHVzLgorCQkJCSAqLworCQkJCXNhdmVfcnRlKGNwLCBpcC0+aXBfc3JjKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBsb2NhdGUgb3V0Z29pbmcgaW50ZXJmYWNlCisJCQkgKi8KKwkJCWJjb3B5KChjYWRkcl90KShjcCArIG9mZiksIChjYWRkcl90KSZpcGFkZHIuc2luX2FkZHIsCisJCQkgICAgc2l6ZW9mKGlwYWRkci5zaW5fYWRkcikpOworCQkJaWYgKG9wdCA9PSBJUE9QVF9TU1JSKSB7CisjZGVmaW5lCUlOQQlzdHJ1Y3QgaW5faWZhZGRyICoKKyNkZWZpbmUJU0EJc3RydWN0IHNvY2thZGRyICoKKyAJCQkgICAgaWYgKChpYSA9IChJTkEpaWZhX2lmd2l0aGRzdGFkZHIoKFNBKSZpcGFkZHIpKSA9PSAwKQorCQkJCWlhID0gKElOQSlpZmFfaWZ3aXRobmV0KChTQSkmaXBhZGRyKTsKKwkJCX0gZWxzZQorCQkJCWlhID0gaXBfcnRhZGRyKGlwYWRkci5zaW5fYWRkcik7CisJCQlpZiAoaWEgPT0gMCkgeworCQkJCXR5cGUgPSBJQ01QX1VOUkVBQ0g7CisJCQkJY29kZSA9IElDTVBfVU5SRUFDSF9TUkNGQUlMOworCQkJCWdvdG8gYmFkOworCQkJfQorCQkJaXAtPmlwX2RzdCA9IGlwYWRkci5zaW5fYWRkcjsKKwkJCWJjb3B5KChjYWRkcl90KSYoSUFfU0lOKGlhKS0+c2luX2FkZHIpLAorCQkJICAgIChjYWRkcl90KShjcCArIG9mZiksIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCQkJY3BbSVBPUFRfT0ZGU0VUXSArPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworCQkJLyoKKwkJCSAqIExldCBpcF9pbnRyJ3MgbWNhc3Qgcm91dGluZyBjaGVjayBoYW5kbGUgbWNhc3QgcGt0cworCQkJICovCisJCQlmb3J3YXJkID0gIUlOX01VTFRJQ0FTVChudG9obChpcC0+aXBfZHN0LnNfYWRkcikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJUE9QVF9SUjoKKwkJCWlmICgob2ZmID0gY3BbSVBPUFRfT0ZGU0VUXSkgPCBJUE9QVF9NSU5PRkYpIHsKKwkJCQljb2RlID0gJmNwW0lQT1BUX09GRlNFVF0gLSAodV9jaGFyICopaXA7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQkvKgorCQkJICogSWYgbm8gc3BhY2UgcmVtYWlucywgaWdub3JlLgorCQkJICovCisJCQlvZmYtLTsJCQkgKiAwIG9yaWdpbiAqCisJCQlpZiAob2ZmID4gb3B0bGVuIC0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkKKwkJCQlicmVhazsKKwkJCWJjb3B5KChjYWRkcl90KSgmaXAtPmlwX2RzdCksIChjYWRkcl90KSZpcGFkZHIuc2luX2FkZHIsCisJCQkgICAgc2l6ZW9mKGlwYWRkci5zaW5fYWRkcikpOworCQkJLyoKKwkJCSAqIGxvY2F0ZSBvdXRnb2luZyBpbnRlcmZhY2U7IGlmIHdlJ3JlIHRoZSBkZXN0aW5hdGlvbiwKKwkJCSAqIHVzZSB0aGUgaW5jb21pbmcgaW50ZXJmYWNlIChzaG91bGQgYmUgc2FtZSkuCisJCQkgKi8KKwkJCWlmICgoaWEgPSAoSU5BKWlmYV9pZndpdGhhZGRyKChTQSkmaXBhZGRyKSkgPT0gMCAmJgorCQkJICAgIChpYSA9IGlwX3J0YWRkcihpcGFkZHIuc2luX2FkZHIpKSA9PSAwKSB7CisJCQkJdHlwZSA9IElDTVBfVU5SRUFDSDsKKwkJCQljb2RlID0gSUNNUF9VTlJFQUNIX0hPU1Q7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQliY29weSgoY2FkZHJfdCkmKElBX1NJTihpYSktPnNpbl9hZGRyKSwKKwkJCSAgICAoY2FkZHJfdCkoY3AgKyBvZmYpLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCWNwW0lQT1BUX09GRlNFVF0gKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSVBPUFRfVFM6CisJCQljb2RlID0gY3AgLSAodV9jaGFyICopaXA7CisJCQlpcHQgPSAoc3RydWN0IGlwX3RpbWVzdGFtcCAqKWNwOworCQkJaWYgKGlwdC0+aXB0X2xlbiA8IDUpCisJCQkJZ290byBiYWQ7CisJCQlpZiAoaXB0LT5pcHRfcHRyID4gaXB0LT5pcHRfbGVuIC0gc2l6ZW9mIChpbnQzMl90KSkgeworCQkJCWlmICgrK2lwdC0+aXB0X29mbHcgPT0gMCkKKwkJCQkJZ290byBiYWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzaW4gPSAoc3RydWN0IGluX2FkZHIgKikoY3AgKyBpcHQtPmlwdF9wdHIgLSAxKTsKKwkJCXN3aXRjaCAoaXB0LT5pcHRfZmxnKSB7CisKKwkJCWNhc2UgSVBPUFRfVFNfVFNPTkxZOgorCQkJCWJyZWFrOworCisJCQljYXNlIElQT1BUX1RTX1RTQU5EQUREUjoKKwkJCQlpZiAoaXB0LT5pcHRfcHRyICsgc2l6ZW9mKG5fdGltZSkgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpID4gaXB0LT5pcHRfbGVuKQorCQkJCQlnb3RvIGJhZDsKKwkJCQlpcGFkZHIuc2luX2FkZHIgPSBkc3Q7CisJCQkJaWEgPSAoSU5BKWlmYW9mXyBpIGYgcCBmb3JhZGRyKChTQSkmaXBhZGRyLAorCQkJCQkJCSAgICBtLT5tX3BrdGhkci5yY3ZpZik7CisJCQkJaWYgKGlhID09IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWJjb3B5KChjYWRkcl90KSZJQV9TSU4oaWEpLT5zaW5fYWRkciwKKwkJCQkgICAgKGNhZGRyX3Qpc2luLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCQlpcHQtPmlwdF9wdHIgKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJUE9QVF9UU19QUkVTUEVDOgorCQkJCWlmIChpcHQtPmlwdF9wdHIgKyBzaXplb2Yobl90aW1lKSArCisJCQkJICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikgPiBpcHQtPmlwdF9sZW4pCisJCQkJCWdvdG8gYmFkOworCQkJCWJjb3B5KChjYWRkcl90KXNpbiwgKGNhZGRyX3QpJmlwYWRkci5zaW5fYWRkciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQkJaWYgKGlmYV9pZndpdGhhZGRyKChTQSkmaXBhZGRyKSA9PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlpcHQtPmlwdF9wdHIgKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCW50aW1lID0gaXB0aW1lKCk7CisJCQliY29weSgoY2FkZHJfdCkmbnRpbWUsIChjYWRkcl90KWNwICsgaXB0LT5pcHRfcHRyIC0gMSwKKwkJCSAgICBzaXplb2Yobl90aW1lKSk7CisJCQlpcHQtPmlwdF9wdHIgKz0gc2l6ZW9mKG5fdGltZSk7CisJCX0KKwl9CisJaWYgKGZvcndhcmQpIHsKKwkJaXBfZm9yd2FyZChtLCAxKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJCX0KKwl9CisJcmV0dXJuICgwKTsKK2JhZDoKKwkvKiBpcC0+aXBfbGVuIC09IGlwLT5pcF9obCA8PCAyOyAgIFhYWCBpY21wX2Vycm9yIGFkZHMgaW4gaGRyIGxlbmd0aCAqLworCisvKiBOb3QgeWV0ICovCisgCWljbXBfZXJyb3IobSwgdHlwZSwgY29kZSwgMCwgMCk7CisKKwlTVEFUKGlwc3RhdC5pcHNfYmFkb3B0aW9ucysrKTsKKwlyZXR1cm4gKDEpOworfQorCisjZW5kaWYgLyogbm90ZGVmICovCisKKy8qCisgKiBTdHJpcCBvdXQgSVAgb3B0aW9ucywgYXQgaGlnaGVyCisgKiBsZXZlbCBwcm90b2NvbCBpbiB0aGUga2VybmVsLgorICogU2Vjb25kIGFyZ3VtZW50IGlzIGJ1ZmZlciB0byB3aGljaCBvcHRpb25zCisgKiB3aWxsIGJlIG1vdmVkLCBhbmQgcmV0dXJuIHZhbHVlIGlzIHRoZWlyIGxlbmd0aC4KKyAqIChYWFgpIHNob3VsZCBiZSBkZWxldGVkOyBsYXN0IGFyZyBjdXJyZW50bHkgaWdub3JlZC4KKyAqLwordm9pZAoraXBfc3RyaXBvcHRpb25zKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICptLCBzdHJ1Y3QgbWJ1ZiAqbW9wdCkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKwlzdHJ1Y3QgaXAgKmlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJcmVnaXN0ZXIgY2FkZHJfdCBvcHRzOworCWludCBvbGVuOworCisJb2xlbiA9IChpcC0+aXBfaGw8PDIpIC0gc2l6ZW9mIChzdHJ1Y3QgaXApOworCW9wdHMgPSAoY2FkZHJfdCkoaXAgKyAxKTsKKwlpID0gbS0+bV9sZW4gLSAoc2l6ZW9mIChzdHJ1Y3QgaXApICsgb2xlbik7CisJbWVtY3B5KG9wdHMsIG9wdHMgICsgb2xlbiwgKHVuc2lnbmVkKWkpOworCW0tPm1fbGVuIC09IG9sZW47CisKKwlpcC0+aXBfaGwgPSBzaXplb2Yoc3RydWN0IGlwKSA+PiAyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9pcF9vdXRwdXQuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfb3V0cHV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjZTUyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvaXBfb3V0cHV0LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpaXBfb3V0cHV0LmMJOC4zIChCZXJrZWxleSkgMS8yMS85NAorICogaXBfb3V0cHV0LmMsdiAxLjkgMTk5NC8xMS8xNiAxMDoxNzoxMCBqa2ggRXhwCisgKi8KKworLyoKKyAqIENoYW5nZXMgYW5kIGFkZGl0aW9ucyByZWxhdGluZyB0byBTTGlSUCBhcmUKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKwordV9pbnQxNl90IGlwX2lkOworCisvKiBOdW1iZXIgb2YgcGFja2V0cyBxdWV1ZWQgYmVmb3JlIHdlIHN0YXJ0IHNlbmRpbmcKKyAqICh0byBwcmV2ZW50IGFsbG9jaW5nIHRvbyBtYW55IG1idWZzKSAqLworI2RlZmluZSBJRl9USFJFU0ggMTAKKworLyoKKyAqIElQIG91dHB1dC4gIFRoZSBwYWNrZXQgaW4gbWJ1ZiBjaGFpbiBtIGNvbnRhaW5zIGEgc2tlbGV0YWwgSVAKKyAqIGhlYWRlciAod2l0aCBsZW4sIG9mZiwgdHRsLCBwcm90bywgdG9zLCBzcmMsIGRzdCkuCisgKiBUaGUgbWJ1ZiBjaGFpbiBjb250YWluaW5nIHRoZSBwYWNrZXQgd2lsbCBiZSBmcmVlZC4KKyAqIFRoZSBtYnVmIG9wdCwgaWYgcHJlc2VudCwgd2lsbCBub3QgYmUgZnJlZWQuCisgKi8KK2ludAoraXBfb3V0cHV0KHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbTApCit7CisJcmVnaXN0ZXIgc3RydWN0IGlwICppcDsKKwlyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbSA9IG0wOworCXJlZ2lzdGVyIGludCBobGVuID0gc2l6ZW9mKHN0cnVjdCBpcCApOworCWludCBsZW4sIG9mZiwgZXJyb3IgPSAwOworCisJREVCVUdfQ0FMTCgiaXBfb3V0cHV0Iik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKwlERUJVR19BUkcoIm0wID0gJWx4IiwgKGxvbmcpbTApOworCisJLyogV2UgZG8gbm8gb3B0aW9ucyAqLworLyoJaWYgKG9wdCkgeworICoJCW0gPSBpcF9pbnNlcnRvcHRpb25zKG0sIG9wdCwgJmxlbik7CisgKgkJaGxlbiA9IGxlbjsKKyAqCX0KKyAqLworCWlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJLyoKKwkgKiBGaWxsIGluIElQIGhlYWRlci4KKwkgKi8KKwlpcC0+aXBfdiA9IElQVkVSU0lPTjsKKwlpcC0+aXBfb2ZmICY9IElQX0RGOworCWlwLT5pcF9pZCA9IGh0b25zKGlwX2lkKyspOworCWlwLT5pcF9obCA9IGhsZW4gPj4gMjsKKwlTVEFUKGlwc3RhdC5pcHNfbG9jYWxvdXQrKyk7CisKKwkvKgorCSAqIFZlcmlmeSB0aGF0IHdlIGhhdmUgYW55IGNoYW5jZSBhdCBhbGwgb2YgYmVpbmcgYWJsZSB0byBxdWV1ZQorCSAqICAgICAgdGhlIHBhY2tldCBvciBwYWNrZXQgZnJhZ21lbnRzCisJICovCisJLyogWFhYIEhtbW0uLi4gKi8KKy8qCWlmIChpZl9xdWV1ZWQgPiBJRl9USFJFU0ggJiYgdG93cml0ZSA8PSAwKSB7CisgKgkJZXJyb3IgPSBFTk9CVUZTOworICoJCWdvdG8gYmFkOworICoJfQorICovCisKKwkvKgorCSAqIElmIHNtYWxsIGVub3VnaCBmb3IgaW50ZXJmYWNlLCBjYW4ganVzdCBzZW5kIGRpcmVjdGx5LgorCSAqLworCWlmICgodV9pbnQxNl90KWlwLT5pcF9sZW4gPD0gSUZfTVRVKSB7CisJCWlwLT5pcF9sZW4gPSBodG9ucygodV9pbnQxNl90KWlwLT5pcF9sZW4pOworCQlpcC0+aXBfb2ZmID0gaHRvbnMoKHVfaW50MTZfdClpcC0+aXBfb2ZmKTsKKwkJaXAtPmlwX3N1bSA9IDA7CisJCWlwLT5pcF9zdW0gPSBja3N1bShtLCBobGVuKTsKKworCQlpZl9vdXRwdXQoc28sIG0pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBUb28gbGFyZ2UgZm9yIGludGVyZmFjZTsgZnJhZ21lbnQgaWYgcG9zc2libGUuCisJICogTXVzdCBiZSBhYmxlIHRvIHB1dCBhdCBsZWFzdCA4IGJ5dGVzIHBlciBmcmFnbWVudC4KKwkgKi8KKwlpZiAoaXAtPmlwX29mZiAmIElQX0RGKSB7CisJCWVycm9yID0gLTE7CisJCVNUQVQoaXBzdGF0Lmlwc19jYW50ZnJhZysrKTsKKwkJZ290byBiYWQ7CisJfQorCisJbGVuID0gKElGX01UVSAtIGhsZW4pICZ+IDc7ICAgICAgIC8qIGlwIGRhdGFieXRlcyBwZXIgcGFja2V0ICovCisJaWYgKGxlbiA8IDgpIHsKKwkJZXJyb3IgPSAtMTsKKwkJZ290byBiYWQ7CisJfQorCisgICAgeworCWludCBtaGxlbiwgZmlyc3RsZW4gPSBsZW47CisJc3RydWN0IG1idWYgKiptbmV4dCA9ICZtLT5tX25leHRwa3Q7CisKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBsZW5ndGggb2Ygc2VnbWVudCBhZnRlciBmaXJzdCBmcmFnbWVudCwKKwkgKiBtYWtlIG5ldyBoZWFkZXIgYW5kIGNvcHkgZGF0YSBvZiBlYWNoIHBhcnQgYW5kIGxpbmsgb250byBjaGFpbi4KKwkgKi8KKwltMCA9IG07CisJbWhsZW4gPSBzaXplb2YgKHN0cnVjdCBpcCk7CisJZm9yIChvZmYgPSBobGVuICsgbGVuOyBvZmYgPCAodV9pbnQxNl90KWlwLT5pcF9sZW47IG9mZiArPSBsZW4pIHsKKwkgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqbWhpcDsKKwkgIG0gPSBtX2dldCgpOworICAgICAgICAgIGlmIChtID09IE5VTEwpIHsKKwkgICAgZXJyb3IgPSAtMTsKKwkgICAgU1RBVChpcHN0YXQuaXBzX29kcm9wcGVkKyspOworCSAgICBnb3RvIHNlbmRvcmZyZWU7CisJICB9CisJICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKwkgIG1oaXAgPSBtdG9kKG0sIHN0cnVjdCBpcCAqKTsKKwkgICptaGlwID0gKmlwOworCisJCS8qIE5vIG9wdGlvbnMgKi8KKy8qCQlpZiAoaGxlbiA+IHNpemVvZiAoc3RydWN0IGlwKSkgeworICoJCQltaGxlbiA9IGlwX29wdGNvcHkoaXAsIG1oaXApICsgc2l6ZW9mIChzdHJ1Y3QgaXApOworICoJCQltaGlwLT5pcF9obCA9IG1obGVuID4+IDI7CisgKgkJfQorICovCisJICBtLT5tX2xlbiA9IG1obGVuOworCSAgbWhpcC0+aXBfb2ZmID0gKChvZmYgLSBobGVuKSA+PiAzKSArIChpcC0+aXBfb2ZmICYgfklQX01GKTsKKwkgIGlmIChpcC0+aXBfb2ZmICYgSVBfTUYpCisJICAgIG1oaXAtPmlwX29mZiB8PSBJUF9NRjsKKwkgIGlmIChvZmYgKyBsZW4gPj0gKHVfaW50MTZfdClpcC0+aXBfbGVuKQorCSAgICBsZW4gPSAodV9pbnQxNl90KWlwLT5pcF9sZW4gLSBvZmY7CisJICBlbHNlCisJICAgIG1oaXAtPmlwX29mZiB8PSBJUF9NRjsKKwkgIG1oaXAtPmlwX2xlbiA9IGh0b25zKCh1X2ludDE2X3QpKGxlbiArIG1obGVuKSk7CisKKwkgIGlmIChtX2NvcHkobSwgbTAsIG9mZiwgbGVuKSA8IDApIHsKKwkgICAgZXJyb3IgPSAtMTsKKwkgICAgZ290byBzZW5kb3JmcmVlOworCSAgfQorCisJICBtaGlwLT5pcF9vZmYgPSBodG9ucygodV9pbnQxNl90KW1oaXAtPmlwX29mZik7CisJICBtaGlwLT5pcF9zdW0gPSAwOworCSAgbWhpcC0+aXBfc3VtID0gY2tzdW0obSwgbWhsZW4pOworCSAgKm1uZXh0ID0gbTsKKwkgIG1uZXh0ID0gJm0tPm1fbmV4dHBrdDsKKwkgIFNUQVQoaXBzdGF0Lmlwc19vZnJhZ21lbnRzKyspOworCX0KKwkvKgorCSAqIFVwZGF0ZSBmaXJzdCBmcmFnbWVudCBieSB0cmltbWluZyB3aGF0J3MgYmVlbiBjb3BpZWQgb3V0CisJICogYW5kIHVwZGF0aW5nIGhlYWRlciwgdGhlbiBzZW5kIGVhY2ggZnJhZ21lbnQgKGluIG9yZGVyKS4KKwkgKi8KKwltID0gbTA7CisJbV9hZGoobSwgaGxlbiArIGZpcnN0bGVuIC0gKHVfaW50MTZfdClpcC0+aXBfbGVuKTsKKwlpcC0+aXBfbGVuID0gaHRvbnMoKHVfaW50MTZfdCltLT5tX2xlbik7CisJaXAtPmlwX29mZiA9IGh0b25zKCh1X2ludDE2X3QpKGlwLT5pcF9vZmYgfCBJUF9NRikpOworCWlwLT5pcF9zdW0gPSAwOworCWlwLT5pcF9zdW0gPSBja3N1bShtLCBobGVuKTsKK3NlbmRvcmZyZWU6CisJZm9yIChtID0gbTA7IG07IG0gPSBtMCkgeworCQltMCA9IG0tPm1fbmV4dHBrdDsKKyAgICAgICAgICAgICAgICBtLT5tX25leHRwa3QgPSBOVUxMOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWlmX291dHB1dChzbywgbSk7CisJCWVsc2UKKwkJCW1fZnJlZW0obSk7CisJfQorCisJaWYgKGVycm9yID09IDApCisJCVNUQVQoaXBzdGF0Lmlwc19mcmFnbWVudGVkKyspOworICAgIH0KKworZG9uZToKKwlyZXR1cm4gKGVycm9yKTsKKworYmFkOgorCW1fZnJlZW0obTApOworCWdvdG8gZG9uZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvbGlic2xpcnAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvbGlic2xpcnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU0MGRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9saWJzbGlycC5oCkBAIC0wLDAgKzEsNDQgQEAKKyNpZm5kZWYgX0xJQlNMSVJQX0gKKyNkZWZpbmUgX0xJQlNMSVJQX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIHNsaXJwX2luaXQoaW50IHJlc3RyaWN0ZWQsIGNvbnN0IGNoYXIgKnNwZWNpYWxfaXApOworCit2b2lkIHNsaXJwX3NlbGVjdF9maWxsKGludCAqcG5mZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZkX3NldCAqcmVhZGZkcywgZmRfc2V0ICp3cml0ZWZkcywgZmRfc2V0ICp4ZmRzKTsKKwordm9pZCBzbGlycF9zZWxlY3RfcG9sbChmZF9zZXQgKnJlYWRmZHMsIGZkX3NldCAqd3JpdGVmZHMsIGZkX3NldCAqeGZkcyk7CisKK3ZvaWQgc2xpcnBfaW5wdXQoY29uc3QgdWludDhfdCAqcGt0LCBpbnQgcGt0X2xlbik7CisKKy8qIHlvdSBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6ICovCitpbnQgc2xpcnBfY2FuX291dHB1dCh2b2lkKTsKK3ZvaWQgc2xpcnBfb3V0cHV0KGNvbnN0IHVpbnQ4X3QgKnBrdCwgaW50IHBrdF9sZW4pOworCit2b2lkIHNsaXJwX3JlZGlyX2xvb3Aodm9pZCAoKmZ1bmMpKHZvaWQgKm9wYXF1ZSwgaW50IGlzX3VkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fYWRkciAqbGFkZHIsIHVfaW50IGxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyICpmYWRkciwgdV9pbnQgZnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKK2ludCBzbGlycF9yZWRpcl9ybShpbnQgaXNfdWRwLCBpbnQgaG9zdF9wb3J0KTsKK2ludCBzbGlycF9yZWRpcihpbnQgaXNfdWRwLCBpbnQgaG9zdF9wb3J0LAorICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyIGd1ZXN0X2FkZHIsIGludCBndWVzdF9wb3J0KTsKK2ludCBzbGlycF9hZGRfZXhlYyhpbnQgZG9fcHR5LCBjb25zdCB2b2lkICphcmdzLCBpbnQgYWRkcl9sb3dfYnl0ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgZ3Vlc3RfcG9ydCk7CisKK2V4dGVybiBjb25zdCBjaGFyICp0ZnRwX3ByZWZpeDsKK2V4dGVybiBjaGFyIHNsaXJwX2hvc3RuYW1lWzMzXTsKK2V4dGVybiBjb25zdCBjaGFyICpib290cF9maWxlbmFtZTsKKwordm9pZCBzbGlycF9zdGF0cyh2b2lkKTsKK3ZvaWQgc2xpcnBfc29ja2V0X3JlY3YoaW50IGFkZHJfbG93X2J5dGUsIGludCBndWVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpidWYsCisJCWludCBzaXplKTsKK3NpemVfdCBzbGlycF9zb2NrZXRfY2FuX3JlY3YoaW50IGFkZHJfbG93X2J5dGUsIGludCBndWVzdF9wb3J0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL21haW4uaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTEzODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL21haW4uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNlbmRpZgorCisjZGVmaW5lIFRPV1JJVEVNQVggNTEyCisKK2V4dGVybiBzdHJ1Y3QgdGltZXZhbCB0dDsKK2V4dGVybiBpbnQgbGlua191cDsKK2V4dGVybiBpbnQgc2xpcnBfc29ja2V0OworZXh0ZXJuIGludCBzbGlycF9zb2NrZXRfdW5pdDsKK2V4dGVybiBpbnQgc2xpcnBfc29ja2V0X3BvcnQ7CitleHRlcm4gdV9pbnQzMl90IHNsaXJwX3NvY2tldF9hZGRyOworZXh0ZXJuIGNoYXIgKnNsaXJwX3NvY2tldF9wYXNzd2Q7CitleHRlcm4gaW50IGN0dHlfY2xvc2VkOworCisvKgorICogR2V0IHRoZSBkaWZmZXJlbmNlIGluIDIgdGltZXMgZnJvbSB1cGR0aW0oKQorICogQWxsb3cgZm9yIHdyYXBhcm91bmQgdGltZXMsICJqdXN0IGluIGNhc2UiCisgKiB4IGlzIHRoZSBncmVhdGVyIG9mIHRoZSAyIChjdXJyZW50IHRpbWUpIGFuZCB5IGlzCisgKiB3aGF0IGl0J3MgYmVpbmcgY29tcGFyZWQgYWdhaW5zdC4KKyAqLworI2RlZmluZSBUSU1FX0RJRkYoeCx5KSAoeCktKHkpIDwgMCA/IH4wLSh5KSsoeCkgOiAoeCktKHkpCisKK2V4dGVybiBjaGFyICpzbGlycF90dHk7CitleHRlcm4gY2hhciAqZXhlY19zaGVsbDsKK2V4dGVybiB1X2ludCBjdXJ0aW1lOworZXh0ZXJuIGZkX3NldCAqZ2xvYmFsX3JlYWRmZHMsICpnbG9iYWxfd3JpdGVmZHMsICpnbG9iYWxfeGZkczsKK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBjdGxfYWRkcjsKK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBzcGVjaWFsX2FkZHI7CitleHRlcm4gc3RydWN0IGluX2FkZHIgYWxpYXNfYWRkcjsKK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBvdXJfYWRkcjsKK2V4dGVybiBzdHJ1Y3QgaW5fYWRkciBsb29wYmFja19hZGRyOworZXh0ZXJuIHN0cnVjdCBpbl9hZGRyIGRuc19hZGRyOworZXh0ZXJuIGNoYXIgKnVzZXJuYW1lOworZXh0ZXJuIGNoYXIgKnNvY2tldF9wYXRoOworZXh0ZXJuIGludCB0b3dyaXRlX21heDsKK2V4dGVybiBpbnQgcHBwX2V4aXQ7CitleHRlcm4gaW50IHRjcF9rZWVwaW50dmw7CitleHRlcm4gdWludDhfdCBjbGllbnRfZXRoYWRkcls2XTsKK2V4dGVybiBjb25zdCBjaGFyICpzbGlycF9zcGVjaWFsX2lwOworZXh0ZXJuIGludCBzbGlycF9yZXN0cmljdDsKKworI2RlZmluZSBQUk9UT19TTElQIDB4MQorI2lmZGVmIFVTRV9QUFAKKyNkZWZpbmUgUFJPVE9fUFBQIDB4MgorI2VuZGlmCisKK3ZvaWQgaWZfZW5jYXAoY29uc3QgdWludDhfdCAqaXBfZGF0YSwgaW50IGlwX2RhdGFfbGVuKTsKK3NzaXplX3Qgc2xpcnBfc2VuZChzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9tYnVmLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL21idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMwYTYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9tYnVmLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kKKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisvKgorICogbWJ1ZidzIGluIFNMaVJQIGFyZSBtdWNoIHNpbXBsZXIgdGhhbiB0aGUgcmVhbCBtYnVmcyBpbgorICogRnJlZUJTRC4gIFRoZXkgYXJlIGZpeGVkIHNpemUsIGRldGVybWluZWQgYnkgdGhlIE1UVSwKKyAqIHNvIHRoYXQgb25lIHdob2xlIHBhY2tldCBjYW4gZml0LiAgTWJ1ZidzIGNhbm5vdCBiZQorICogY2hhaW5lZCB0b2dldGhlci4gIElmIHRoZXJlJ3MgbW9yZSBkYXRhIHRoYW4gdGhlIG1idWYKKyAqIGNvdWxkIGhvbGQsIGFuIGV4dGVybmFsIG1hbGxvY2VkIGJ1ZmZlciBpcyBwb2ludGVkIHRvCisgKiBieSBtX2V4dCAoYW5kIHRoZSBkYXRhIHBvaW50ZXJzKSBhbmQgTV9FWFQgaXMgc2V0IGluCisgKiB0aGUgZmxhZ3MKKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKworaW50IG1idWZfYWxsb2NlZCA9IDA7CitzdHJ1Y3QgbWJ1ZiBtX2ZyZWVsaXN0LCBtX3VzZWRsaXN0OworI2RlZmluZSBNQlVGX1RIUkVTSCAzMAoraW50IG1idWZfbWF4ID0gMDsKKworLyoKKyAqIEZpbmQgYSBuaWNlIHZhbHVlIGZvciBtc2l6ZQorICogWFhYIGlmX21heGxpbmtoZHIgYWxyZWFkeSBpbiBtdHUKKyAqLworI2RlZmluZSBTTElSUF9NU0laRSAoSUZfTVRVICsgSUZfTUFYTElOS0hEUiArIHNpemVvZihzdHJ1Y3QgbV9oZHIgKSArIDYpCisKK3ZvaWQKK21faW5pdCh2b2lkKQoreworCW1fZnJlZWxpc3QubV9uZXh0ID0gbV9mcmVlbGlzdC5tX3ByZXYgPSAmbV9mcmVlbGlzdDsKKwltX3VzZWRsaXN0Lm1fbmV4dCA9IG1fdXNlZGxpc3QubV9wcmV2ID0gJm1fdXNlZGxpc3Q7Cit9CisKKy8qCisgKiBHZXQgYW4gbWJ1ZiBmcm9tIHRoZSBmcmVlIGxpc3QsIGlmIHRoZXJlIGFyZSBub25lCisgKiBtYWxsb2Mgb25lCisgKgorICogQmVjYXVzZSBmcmFnbWVudGF0aW9uIGNhbiBvY2N1ciBpZiB3ZSBhbGxvYyBuZXcgbWJ1ZnMgYW5kCisgKiBmcmVlIG9sZCBtYnVmcywgd2UgbWFyayBhbGwgbWJ1ZnMgYWJvdmUgbWJ1Zl90aHJlc2ggYXMgTV9ET0ZSRUUsCisgKiB3aGljaCB0ZWxscyBtX2ZyZWUgdG8gYWN0dWFsbHkgZnJlZSgpIGl0CisgKi8KK3N0cnVjdCBtYnVmICoKK21fZ2V0KHZvaWQpCit7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07CisJaW50IGZsYWdzID0gMDsKKworCURFQlVHX0NBTEwoIm1fZ2V0Iik7CisKKwlpZiAobV9mcmVlbGlzdC5tX25leHQgPT0gJm1fZnJlZWxpc3QpIHsKKwkJbSA9IChzdHJ1Y3QgbWJ1ZiAqKW1hbGxvYyhTTElSUF9NU0laRSk7CisJCWlmIChtID09IE5VTEwpIGdvdG8gZW5kX2Vycm9yOworCQltYnVmX2FsbG9jZWQrKzsKKwkJaWYgKG1idWZfYWxsb2NlZCA+IE1CVUZfVEhSRVNIKQorCQkJZmxhZ3MgPSBNX0RPRlJFRTsKKwkJaWYgKG1idWZfYWxsb2NlZCA+IG1idWZfbWF4KQorCQkJbWJ1Zl9tYXggPSBtYnVmX2FsbG9jZWQ7CisJfSBlbHNlIHsKKwkJbSA9IG1fZnJlZWxpc3QubV9uZXh0OworCQlyZW1xdWUobSk7CisJfQorCisJLyogSW5zZXJ0IGl0IGluIHRoZSB1c2VkIGxpc3QgKi8KKwlpbnNxdWUobSwmbV91c2VkbGlzdCk7CisJbS0+bV9mbGFncyA9IChmbGFncyB8IE1fVVNFRExJU1QpOworCisJLyogSW5pdGlhbGlzZSBpdCAqLworCW0tPm1fc2l6ZSA9IFNMSVJQX01TSVpFIC0gc2l6ZW9mKHN0cnVjdCBtX2hkcik7CisJbS0+bV9kYXRhID0gbS0+bV9kYXQ7CisJbS0+bV9sZW4gPSAwOworICAgICAgICBtLT5tX25leHRwa3QgPSBOVUxMOworICAgICAgICBtLT5tX3ByZXZwa3QgPSBOVUxMOworZW5kX2Vycm9yOgorCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nICltKTsKKwlyZXR1cm4gbTsKK30KKwordm9pZAorbV9mcmVlKHN0cnVjdCBtYnVmICptKQoreworCisgIERFQlVHX0NBTEwoIm1fZnJlZSIpOworICBERUJVR19BUkcoIm0gPSAlbHgiLCAobG9uZyApbSk7CisKKyAgaWYobSkgeworCS8qIFJlbW92ZSBmcm9tIG1fdXNlZGxpc3QgKi8KKwlpZiAobS0+bV9mbGFncyAmIE1fVVNFRExJU1QpCisJICAgcmVtcXVlKG0pOworCisJLyogSWYgaXQncyBNX0VYVCwgZnJlZSgpIGl0ICovCisJaWYgKG0tPm1fZmxhZ3MgJiBNX0VYVCkKKwkgICBmcmVlKG0tPm1fZXh0KTsKKworCS8qCisJICogRWl0aGVyIGZyZWUoKSBpdCBvciBwdXQgaXQgb24gdGhlIGZyZWUgbGlzdAorCSAqLworCWlmIChtLT5tX2ZsYWdzICYgTV9ET0ZSRUUpIHsKKwkJZnJlZShtKTsKKwkJbWJ1Zl9hbGxvY2VkLS07CisJfSBlbHNlIGlmICgobS0+bV9mbGFncyAmIE1fRlJFRUxJU1QpID09IDApIHsKKwkJaW5zcXVlKG0sJm1fZnJlZWxpc3QpOworCQltLT5tX2ZsYWdzID0gTV9GUkVFTElTVDsgLyogQ2xvYmJlciBvdGhlciBmbGFncyAqLworCX0KKyAgfSAvKiBpZihtKSAqLworfQorCisvKgorICogQ29weSBkYXRhIGZyb20gb25lIG1idWYgdG8gdGhlIGVuZCBvZgorICogdGhlIG90aGVyLi4gaWYgcmVzdWx0IGlzIHRvbyBiaWcgZm9yIG9uZSBtYnVmLCBtYWxsb2MoKQorICogYW4gTV9FWFQgZGF0YSBzZWdtZW50CisgKi8KK3ZvaWQKK21fY2F0KHN0cnVjdCBtYnVmICptLCBzdHJ1Y3QgbWJ1ZiAqbikKK3sKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gcm9vbSwgcmVhbGxvYworCSAqLworCWlmIChNX0ZSRUVST09NKG0pIDwgbi0+bV9sZW4pCisJCW1faW5jKG0sbS0+bV9zaXplK01JTkNTSVpFKTsKKworCW1lbWNweShtLT5tX2RhdGErbS0+bV9sZW4sIG4tPm1fZGF0YSwgbi0+bV9sZW4pOworCW0tPm1fbGVuICs9IG4tPm1fbGVuOworCisJbV9mcmVlKG4pOworfQorCisKKy8qIG1ha2UgbSBzaXplIGJ5dGVzIGxhcmdlICovCit2b2lkCittX2luYyhzdHJ1Y3QgbWJ1ZiAqbSwgaW50IHNpemUpCit7CisJaW50IGRhdGFzaXplOworCisJLyogc29tZSBjb21waWxlcyB0aHJvdyB1cCBvbiBnb3Rvcy4gIFRoaXMgb25lIHdlIGNhbiBmYWtlLiAqLworICAgICAgICBpZihtLT5tX3NpemU+c2l6ZSkgcmV0dXJuOworCisgICAgICAgIGlmIChtLT5tX2ZsYWdzICYgTV9FWFQpIHsKKwkgIGRhdGFzaXplID0gbS0+bV9kYXRhIC0gbS0+bV9leHQ7CisJICBtLT5tX2V4dCA9IChjaGFyICopcmVhbGxvYyhtLT5tX2V4dCxzaXplKTsKKy8qCQlpZiAobS0+bV9leHQgPT0gTlVMTCkKKyAqCQkJcmV0dXJuIChzdHJ1Y3QgbWJ1ZiAqKU5VTEw7CisgKi8KKwkgIG0tPm1fZGF0YSA9IG0tPm1fZXh0ICsgZGF0YXNpemU7CisgICAgICAgIH0gZWxzZSB7CisJICBjaGFyICpkYXQ7CisJICBkYXRhc2l6ZSA9IG0tPm1fZGF0YSAtIG0tPm1fZGF0OworCSAgZGF0ID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisvKgkJaWYgKGRhdCA9PSBOVUxMKQorICoJCQlyZXR1cm4gKHN0cnVjdCBtYnVmICopTlVMTDsKKyAqLworCSAgbWVtY3B5KGRhdCwgbS0+bV9kYXQsIG0tPm1fc2l6ZSk7CisKKwkgIG0tPm1fZXh0ID0gZGF0OworCSAgbS0+bV9kYXRhID0gbS0+bV9leHQgKyBkYXRhc2l6ZTsKKwkgIG0tPm1fZmxhZ3MgfD0gTV9FWFQ7CisgICAgICAgIH0KKworICAgICAgICBtLT5tX3NpemUgPSBzaXplOworCit9CisKKworCit2b2lkCittX2FkaihzdHJ1Y3QgbWJ1ZiAqbSwgaW50IGxlbikKK3sKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGxlbiA+PSAwKSB7CisJCS8qIFRyaW0gZnJvbSBoZWFkICovCisJCW0tPm1fZGF0YSArPSBsZW47CisJCW0tPm1fbGVuIC09IGxlbjsKKwl9IGVsc2UgeworCQkvKiBUcmltIGZyb20gdGFpbCAqLworCQlsZW4gPSAtbGVuOworCQltLT5tX2xlbiAtPSBsZW47CisJfQorfQorCisKKy8qCisgKiBDb3B5IGxlbiBieXRlcyBmcm9tIG0sIHN0YXJ0aW5nIG9mZiBieXRlcyBpbnRvIG4KKyAqLworaW50CittX2NvcHkoc3RydWN0IG1idWYgKm4sIHN0cnVjdCBtYnVmICptLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCWlmIChsZW4gPiBNX0ZSRUVST09NKG4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1jcHkoKG4tPm1fZGF0YSArIG4tPm1fbGVuKSwgKG0tPm1fZGF0YSArIG9mZiksIGxlbik7CisJbi0+bV9sZW4gKz0gbGVuOworCXJldHVybiAwOworfQorCisKKy8qCisgKiBHaXZlbiBhIHBvaW50ZXIgaW50byBhbiBtYnVmLCByZXR1cm4gdGhlIG1idWYKKyAqIFhYWCBUaGlzIGlzIGEga2x1ZGdlLCBJIHNob3VsZCBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIGl0CisgKiBGb3J0dW5hdGVseSwgaXQncyBub3QgdXNlZCBvZnRlbgorICovCitzdHJ1Y3QgbWJ1ZiAqCitkdG9tKHZvaWQgKmRhdCkKK3sKKwlzdHJ1Y3QgbWJ1ZiAqbTsKKworCURFQlVHX0NBTEwoImR0b20iKTsKKwlERUJVR19BUkcoImRhdCA9ICVseCIsIChsb25nIClkYXQpOworCisJLyogYnVnIGNvcnJlY3RlZCBmb3IgTV9FWFQgYnVmZmVycyAqLworCWZvciAobSA9IG1fdXNlZGxpc3QubV9uZXh0OyBtICE9ICZtX3VzZWRsaXN0OyBtID0gbS0+bV9uZXh0KSB7CisJICBpZiAobS0+bV9mbGFncyAmIE1fRVhUKSB7CisJICAgIGlmKCAoY2hhciAqKWRhdD49bS0+bV9leHQgJiYgKGNoYXIgKilkYXQ8KG0tPm1fZXh0ICsgbS0+bV9zaXplKSApCisJICAgICAgcmV0dXJuIG07CisJICB9IGVsc2UgeworCSAgICBpZiggKGNoYXIgKilkYXQgPj0gbS0+bV9kYXQgJiYgKGNoYXIgKilkYXQ8KG0tPm1fZGF0ICsgbS0+bV9zaXplKSApCisJICAgICAgcmV0dXJuIG07CisJICB9CisJfQorCisJREVCVUdfRVJST1IoKGRmZCwgImR0b20gZmFpbGVkIikpOworCisJcmV0dXJuIChzdHJ1Y3QgbWJ1ZiAqKTA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL21idWYuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvbWJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjczNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL21idWYuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyltYnVmLmgJOC4zIChCZXJrZWxleSkgMS8yMS85NAorICogbWJ1Zi5oLHYgMS45IDE5OTQvMTEvMTQgMTM6NTQ6MjAgYmRlIEV4cAorICovCisKKyNpZm5kZWYgX01CVUZfSF8KKyNkZWZpbmUgX01CVUZfSF8KKworI2RlZmluZSBtX2ZyZWVtIG1fZnJlZQorCisKKyNkZWZpbmUgTUlOQ1NJWkUgNDA5NgkvKiBBbW91bnQgdG8gaW5jcmVhc2UgbWJ1ZiBpZiB0b28gc21hbGwgKi8KKworLyoKKyAqIE1hY3JvcyBmb3IgdHlwZSBjb252ZXJzaW9uCisgKiBtdG9kKG0sdCkgLQljb252ZXJ0IG1idWYgcG9pbnRlciB0byBkYXRhIHBvaW50ZXIgb2YgY29ycmVjdCB0eXBlCisgKiBkdG9tKHgpIC0JY29udmVydCBkYXRhIHBvaW50ZXIgd2l0aGluIG1idWYgdG8gbWJ1ZiBwb2ludGVyIChYWFgpCisgKi8KKyNkZWZpbmUgbXRvZChtLHQpCSgodCkobSktPm1fZGF0YSkKKy8qICNkZWZpbmUJZHRvbSh4KQkJKChzdHJ1Y3QgbWJ1ZiAqKSgoaW50KSh4KSAmIH4oTV9TSVpFLTEpKSkgKi8KKworLyogWFhYIEFib3V0IG1idWZzIGZvciBzbGlycDoKKyAqIE9ubHkgb25lIG1idWYgaXMgZXZlciB1c2VkIGluIGEgY2hhaW4sIGZvciBlYWNoICJjZWxsIiBvZiBkYXRhLgorICogbV9uZXh0cGt0IHBvaW50cyB0byB0aGUgbmV4dCBwYWNrZXQsIGlmIGZyYWdtZW50ZWQuCisgKiBJZiB0aGUgZGF0YSBpcyB0b28gbGFyZ2UsIHRoZSBNX0VYVCBpcyB1c2VkLCBhbmQgYSBsYXJnZXIgYmxvY2sKKyAqIGlzIGFsbG9jZWQuICBUaGVyZWZvcmUsIG1fZnJlZVttXSBtdXN0IGNoZWNrIGZvciBNX0VYVCBhbmQgaWYgc2V0CisgKiBmcmVlIHRoZSBtX2V4dC4gIFRoaXMgaXMgaW5lZmZpY2llbnQgbWVtb3J5LXdpc2UsIGJ1dCB3aG8gY2FyZXMuCisgKi8KKworLyogWFhYIHNob3VsZCB1bmlvbiBzb21lIG9mIHRoZXNlISAqLworLyogaGVhZGVyIGF0IGJlZ2lubmluZyBvZiBlYWNoIG1idWY6ICovCitzdHJ1Y3QgbV9oZHIgeworCXN0cnVjdAltYnVmICptaF9uZXh0OwkJLyogTGlua2VkIGxpc3Qgb2YgbWJ1ZnMgKi8KKwlzdHJ1Y3QJbWJ1ZiAqbWhfcHJldjsKKwlzdHJ1Y3QJbWJ1ZiAqbWhfbmV4dHBrdDsJLyogTmV4dCBwYWNrZXQgaW4gcXVldWUvcmVjb3JkICovCisJc3RydWN0CW1idWYgKm1oX3ByZXZwa3Q7IC8qIEZsYWdzIGFyZW4ndCB1c2VkIGluIHRoZSBvdXRwdXQgcXVldWUgKi8KKwlpbnQJbWhfZmxhZ3M7CSAgLyogTWlzYyBmbGFncyAqLworCisJaW50CW1oX3NpemU7CQkvKiBTaXplIG9mIGRhdGEgKi8KKwlzdHJ1Y3QJc29ja2V0ICptaF9zbzsKKworCWNhZGRyX3QJbWhfZGF0YTsJCS8qIExvY2F0aW9uIG9mIGRhdGEgKi8KKwlpbnQJbWhfbGVuOwkJCS8qIEFtb3VudCBvZiBkYXRhIGluIHRoaXMgbWJ1ZiAqLworfTsKKworLyoKKyAqIEhvdyBtdWNoIHJvb20gaXMgaW4gdGhlIG1idWYsIGZyb20gbV9kYXRhIHRvIHRoZSBlbmQgb2YgdGhlIG1idWYKKyAqLworI2RlZmluZSBNX1JPT00obSkgKChtLT5tX2ZsYWdzICYgTV9FWFQpPyBcCisJCQkoKChtKS0+bV9leHQgKyAobSktPm1fc2l6ZSkgLSAobSktPm1fZGF0YSkgXAorCQkgICA6IFwKKwkJCSgoKG0pLT5tX2RhdCArIChtKS0+bV9zaXplKSAtIChtKS0+bV9kYXRhKSkKKworLyoKKyAqIEhvdyBtdWNoIGZyZWUgcm9vbSB0aGVyZSBpcworICovCisjZGVmaW5lIE1fRlJFRVJPT00obSkgKE1fUk9PTShtKSAtIChtKS0+bV9sZW4pCisjZGVmaW5lIE1fVFJBSUxJTkdTUEFDRSBNX0ZSRUVST09NCisKK3N0cnVjdCBtYnVmIHsKKwlzdHJ1Y3QJbV9oZHIgbV9oZHI7CisJdW5pb24gTV9kYXQgeworCQljaGFyCW1fZGF0X1sxXTsgLyogQU5TSSBkb24ndCBsaWtlIDAgc2l6ZWQgYXJyYXlzICovCisJCWNoYXIJKm1fZXh0XzsKKwl9IE1fZGF0OworfTsKKworI2RlZmluZSBtX25leHQJCW1faGRyLm1oX25leHQKKyNkZWZpbmUgbV9wcmV2CQltX2hkci5taF9wcmV2CisjZGVmaW5lIG1fbmV4dHBrdAltX2hkci5taF9uZXh0cGt0CisjZGVmaW5lIG1fcHJldnBrdAltX2hkci5taF9wcmV2cGt0CisjZGVmaW5lIG1fZmxhZ3MJCW1faGRyLm1oX2ZsYWdzCisjZGVmaW5lCW1fbGVuCQltX2hkci5taF9sZW4KKyNkZWZpbmUJbV9kYXRhCQltX2hkci5taF9kYXRhCisjZGVmaW5lIG1fc2l6ZQkJbV9oZHIubWhfc2l6ZQorI2RlZmluZSBtX2RhdAkJTV9kYXQubV9kYXRfCisjZGVmaW5lIG1fZXh0CQlNX2RhdC5tX2V4dF8KKyNkZWZpbmUgbV9zbwkJbV9oZHIubWhfc28KKworI2RlZmluZSBpZnFfcHJldiBtX3ByZXYKKyNkZWZpbmUgaWZxX25leHQgbV9uZXh0CisjZGVmaW5lIGlmc19wcmV2IG1fcHJldnBrdAorI2RlZmluZSBpZnNfbmV4dCBtX25leHRwa3QKKyNkZWZpbmUgaWZxX3NvIG1fc28KKworI2RlZmluZSBNX0VYVAkJCTB4MDEJLyogbV9leHQgcG9pbnRzIHRvIG1vcmUgKG1hbGxvY2VkKSBkYXRhICovCisjZGVmaW5lIE1fRlJFRUxJU1QJCTB4MDIJLyogbWJ1ZiBpcyBvbiBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgTV9VU0VETElTVAkJMHgwNAkvKiBYWFggbWJ1ZiBpcyBvbiB1c2VkIGxpc3QgKGZvciBkdG9tKCkpICovCisjZGVmaW5lIE1fRE9GUkVFCQkweDA4CS8qIHdoZW4gbV9mcmVlIGlzIGNhbGxlZCBvbiB0aGUgbWJ1ZiwgZnJlZSgpCisJCQkJCSAqIGl0IHJhdGhlciB0aGFuIHB1dHRpbmcgaXQgb24gdGhlIGZyZWUgbGlzdCAqLworCisvKgorICogTWJ1ZiBzdGF0aXN0aWNzLiBYWFgKKyAqLworCitzdHJ1Y3QgbWJzdGF0IHsKKwlpbnQgbWJzX2FsbG9jZWQ7CQkvKiBOdW1iZXIgb2YgbWJ1ZnMgYWxsb2NhdGVkICovCisKK307CisKK2V4dGVybiBzdHJ1Y3QJbWJzdGF0IG1ic3RhdDsKK2V4dGVybiBpbnQgbWJ1Zl9hbGxvY2VkOworZXh0ZXJuIHN0cnVjdCBtYnVmIG1fZnJlZWxpc3QsIG1fdXNlZGxpc3Q7CitleHRlcm4gaW50IG1idWZfbWF4OworCit2b2lkIG1faW5pdCBfUCgodm9pZCkpOworc3RydWN0IG1idWYgKiBtX2dldCBfUCgodm9pZCkpOwordm9pZCBtX2ZyZWUgX1AoKHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgbV9jYXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIHJlZ2lzdGVyIHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgbV9pbmMgX1AoKHN0cnVjdCBtYnVmICosIGludCkpOwordm9pZCBtX2FkaiBfUCgoc3RydWN0IG1idWYgKiwgaW50KSk7CitpbnQgbV9jb3B5IF9QKChzdHJ1Y3QgbWJ1ZiAqLCBzdHJ1Y3QgbWJ1ZiAqLCBpbnQsIGludCkpOworc3RydWN0IG1idWYgKiBkdG9tIF9QKCh2b2lkICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL21pc2MuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDMyYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL21pc2MuYwpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKwordV9pbnQgY3VydGltZSwgdGltZV9mYXN0dGltbywgbGFzdF9zbG93dGltbzsKKworI2lmIDAKK2ludCB4X3BvcnQgPSAtMTsKK2ludCB4X2Rpc3BsYXkgPSAwOworaW50IHhfc2NyZWVuID0gMDsKKworaW50CitzaG93X3goYnVmZiwgaW5zbykKKwljaGFyICpidWZmOworCXN0cnVjdCBzb2NrZXQgKmluc287Cit7CisJaWYgKHhfcG9ydCA8IDApIHsKKwkJbHByaW50KCJYIFJlZGlyOiBYIG5vdCBiZWluZyByZWRpcmVjdGVkLlxyXG4iKTsKKwl9IGVsc2UgeworCQlscHJpbnQoIlggUmVkaXI6IEluIHNoL2Jhc2gvenNoL2V0Yy4gdHlwZTogRElTUExBWT0lczolZC4lZDsgZXhwb3J0IERJU1BMQVlcclxuIiwKKwkJICAgICAgaW5ldF9udG9hKG91cl9hZGRyKSwgeF9wb3J0LCB4X3NjcmVlbik7CisJCWxwcmludCgiWCBSZWRpcjogSW4gY3NoL3Rjc2gvZXRjLiB0eXBlOiAgICBzZXRlbnYgRElTUExBWSAlczolZC4lZFxyXG4iLAorCQkgICAgICBpbmV0X250b2Eob3VyX2FkZHIpLCB4X3BvcnQsIHhfc2NyZWVuKTsKKwkJaWYgKHhfZGlzcGxheSkKKwkJICAgbHByaW50KCJYIFJlZGlyOiBSZWRpcmVjdGluZyB0byBkaXNwbGF5ICVkXHJcbiIsIHhfZGlzcGxheSk7CisJfQorCisJcmV0dXJuIENGR19PSzsKK30KKworCisvKgorICogWFhYIEFsbG93IG1vcmUgdGhhbiBvbmUgWCByZWRpcmVjdGlvbj8KKyAqLwordm9pZAorcmVkaXJfeChpbmFkZHIsIHN0YXJ0X3BvcnQsIGRpc3BsYXksIHNjcmVlbikKKwl1X2ludDMyX3QgaW5hZGRyOworCWludCBzdGFydF9wb3J0OworCWludCBkaXNwbGF5OworCWludCBzY3JlZW47Cit7CisJaW50IGk7CisKKwlpZiAoeF9wb3J0ID49IDApIHsKKwkJbHByaW50KCJYIFJlZGlyOiBYIGFscmVhZHkgYmVpbmcgcmVkaXJlY3RlZC5cclxuIik7CisJCXNob3dfeCgwLCAwKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSA2MDAxICsgKHN0YXJ0X3BvcnQtMSk7IGkgPD0gNjEwMDsgaSsrKSB7CisJCQlpZiAoc29saXN0ZW4oaHRvbnMoaSksIGluYWRkciwgaHRvbnMoNjAwMCArIGRpc3BsYXkpLCAwKSkgeworCQkJCS8qIFN1Y2Nlc3MgKi8KKwkJCQl4X3BvcnQgPSBpIC0gNjAwMDsKKwkJCQl4X2Rpc3BsYXkgPSBkaXNwbGF5OworCQkJCXhfc2NyZWVuID0gc2NyZWVuOworCQkJCXNob3dfeCgwLCAwKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbHByaW50KCJYIFJlZGlyOiBFcnJvcjogQ291bGRuJ3QgcmVkaXJlY3QgYSBwb3J0IGZvciBYLiBXZWlyZC5cclxuIik7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBHZXQgb3VyIElQIGFkZHJlc3MgYW5kIHB1dCBpdCBpbiBvdXJfYWRkcgorICovCit2b2lkCitnZXRvdXJhZGRyKHZvaWQpCit7CisJY2hhciBidWZmWzI1Nl07CisJc3RydWN0IGhvc3RlbnQgKmhlID0gTlVMTDsKKworCWlmIChnZXRob3N0bmFtZShidWZmLDI1NikgPT0gMCkKKyAgICAgICAgICAgIGhlID0gZ2V0aG9zdGJ5bmFtZShidWZmKTsKKyAgICAgICAgaWYgKGhlKQorICAgICAgICAgICAgb3VyX2FkZHIgPSAqKHN0cnVjdCBpbl9hZGRyICopaGUtPmhfYWRkcjsKKyAgICAgICAgaWYgKG91cl9hZGRyLnNfYWRkciA9PSAwKQorICAgICAgICAgICAgb3VyX2FkZHIuc19hZGRyID0gbG9vcGJhY2tfYWRkci5zX2FkZHI7Cit9CisKK3N0cnVjdCBxdWVoZWFkIHsKKwlzdHJ1Y3QgcXVlaGVhZCAqcWhfbGluazsKKwlzdHJ1Y3QgcXVlaGVhZCAqcWhfcmxpbms7Cit9OworCitpbmxpbmUgdm9pZAoraW5zcXVlKHZvaWQgKmEsIHZvaWQgKmIpCit7CisJcmVnaXN0ZXIgc3RydWN0IHF1ZWhlYWQgKmVsZW1lbnQgPSAoc3RydWN0IHF1ZWhlYWQgKikgYTsKKwlyZWdpc3RlciBzdHJ1Y3QgcXVlaGVhZCAqaGVhZCA9IChzdHJ1Y3QgcXVlaGVhZCAqKSBiOworCWVsZW1lbnQtPnFoX2xpbmsgPSBoZWFkLT5xaF9saW5rOworCWhlYWQtPnFoX2xpbmsgPSAoc3RydWN0IHF1ZWhlYWQgKillbGVtZW50OworCWVsZW1lbnQtPnFoX3JsaW5rID0gKHN0cnVjdCBxdWVoZWFkICopaGVhZDsKKwkoKHN0cnVjdCBxdWVoZWFkICopKGVsZW1lbnQtPnFoX2xpbmspKS0+cWhfcmxpbmsKKwk9IChzdHJ1Y3QgcXVlaGVhZCAqKWVsZW1lbnQ7Cit9CisKK2lubGluZSB2b2lkCityZW1xdWUodm9pZCAqYSkKK3sKKyAgcmVnaXN0ZXIgc3RydWN0IHF1ZWhlYWQgKmVsZW1lbnQgPSAoc3RydWN0IHF1ZWhlYWQgKikgYTsKKyAgKChzdHJ1Y3QgcXVlaGVhZCAqKShlbGVtZW50LT5xaF9saW5rKSktPnFoX3JsaW5rID0gZWxlbWVudC0+cWhfcmxpbms7CisgICgoc3RydWN0IHF1ZWhlYWQgKikoZWxlbWVudC0+cWhfcmxpbmspKS0+cWhfbGluayA9IGVsZW1lbnQtPnFoX2xpbms7CisgIGVsZW1lbnQtPnFoX3JsaW5rID0gTlVMTDsKKyAgLyogIGVsZW1lbnQtPnFoX2xpbmsgPSBOVUxMOyAgVENQIEZJTjEgY3Jhc2hlcyBpZiB5b3UgZG8gdGhpcy4gIFdoeSA/ICovCit9CisKKy8qICNlbmRpZiAqLworCisKK2ludAorYWRkX2V4ZWMoc3RydWN0IGV4X2xpc3QgKipleF9wdHIsIGludCBkb19wdHksIGNoYXIgKmV4ZWMsIGludCBhZGRyLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgZXhfbGlzdCAqdG1wX3B0cjsKKworCS8qIEZpcnN0LCBjaGVjayBpZiB0aGUgcG9ydCBpcyAiYm91bmQiICovCisJZm9yICh0bXBfcHRyID0gKmV4X3B0cjsgdG1wX3B0cjsgdG1wX3B0ciA9IHRtcF9wdHItPmV4X25leHQpIHsKKwkJaWYgKHBvcnQgPT0gdG1wX3B0ci0+ZXhfZnBvcnQgJiYgYWRkciA9PSB0bXBfcHRyLT5leF9hZGRyKQorCQkgICByZXR1cm4gLTE7CisJfQorCisJdG1wX3B0ciA9ICpleF9wdHI7CisJKmV4X3B0ciA9IChzdHJ1Y3QgZXhfbGlzdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGV4X2xpc3QpKTsKKwkoKmV4X3B0ciktPmV4X2Zwb3J0ID0gcG9ydDsKKwkoKmV4X3B0ciktPmV4X2FkZHIgPSBhZGRyOworCSgqZXhfcHRyKS0+ZXhfcHR5ID0gZG9fcHR5OworCSgqZXhfcHRyKS0+ZXhfZXhlYyA9IChkb19wdHkgPT0gMykgPyBleGVjIDogc3RyZHVwKGV4ZWMpOworCSgqZXhfcHRyKS0+ZXhfbmV4dCA9IHRtcF9wdHI7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgSEFWRV9TVFJFUlJPUgorCisvKgorICogRm9yIHN5c3RlbXMgd2l0aCBubyBzdHJlcnJvcgorICovCisKK2V4dGVybiBpbnQgc3lzX25lcnI7CitleHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKKworY2hhciAqCitzdHJlcnJvcihlcnJvcikKKwlpbnQgZXJyb3I7Cit7CisJaWYgKGVycm9yIDwgc3lzX25lcnIpCisJICAgcmV0dXJuIHN5c19lcnJsaXN0W2Vycm9yXTsKKwllbHNlCisJICAgcmV0dXJuICJVbmtub3duIGVycm9yLiI7Cit9CisKKyNlbmRpZgorCisKKyNpZmRlZiBfV0lOMzIKKworaW50Citmb3JrX2V4ZWMoc3RydWN0IHNvY2tldCAqc28sIGNvbnN0IGNoYXIgKmV4LCBpbnQgZG9fcHR5KQoreworICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIHJldHVybiAwOworfQorCisjZWxzZQorCisjaWZuZGVmIENPTkZJR19RRU1VCitpbnQKK3NsaXJwX29wZW5wdHkoYW1hc3RlciwgYXNsYXZlKQorICAgICBpbnQgKmFtYXN0ZXIsICphc2xhdmU7Cit7CisJcmVnaXN0ZXIgaW50IG1hc3Rlciwgc2xhdmU7CisKKyNpZmRlZiBIQVZFX0dSQU5UUFQKKwljaGFyICpwdHI7CisKKwlpZiAoKG1hc3RlciA9IG9wZW4oIi9kZXYvcHRteCIsIE9fUkRXUikpIDwgMCB8fAorCSAgICBncmFudHB0KG1hc3RlcikgPCAwIHx8CisJICAgIHVubG9ja3B0KG1hc3RlcikgPCAwIHx8CisJICAgIChwdHIgPSBwdHNuYW1lKG1hc3RlcikpID09IE5VTEwpICB7CisJCWNsb3NlKG1hc3Rlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKHNsYXZlID0gb3BlbihwdHIsIE9fUkRXUikpIDwgMCB8fAorCSAgICBpb2N0bChzbGF2ZSwgSV9QVVNILCAicHRlbSIpIDwgMCB8fAorCSAgICBpb2N0bChzbGF2ZSwgSV9QVVNILCAibGR0ZXJtIikgPCAwIHx8CisJICAgIGlvY3RsKHNsYXZlLCBJX1BVU0gsICJ0dGNvbXBhdCIpIDwgMCkgeworCQljbG9zZShtYXN0ZXIpOworCQljbG9zZShzbGF2ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkqYW1hc3RlciA9IG1hc3RlcjsKKwkqYXNsYXZlID0gc2xhdmU7CisJcmV0dXJuIDA7CisKKyNlbHNlCisKKwlzdGF0aWMgY2hhciBsaW5lW10gPSAiL2Rldi9wdHlYWCI7CisJcmVnaXN0ZXIgY29uc3QgY2hhciAqY3AxLCAqY3AyOworCisJZm9yIChjcDEgPSAicHFyc1BRUlMiOyAqY3AxOyBjcDErKykgeworCQlsaW5lWzhdID0gKmNwMTsKKwkJZm9yIChjcDIgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXYiOyAqY3AyOyBjcDIrKykgeworCQkJbGluZVs5XSA9ICpjcDI7CisJCQlpZiAoKG1hc3RlciA9IG9wZW4obGluZSwgT19SRFdSLCAwKSkgPT0gLTEpIHsKKwkJCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJCSAgIHJldHVybiAoLTEpOyAgICAvKiBvdXQgb2YgcHR5cyAqLworCQkJfSBlbHNlIHsKKwkJCQlsaW5lWzVdID0gJ3QnOworCQkJCS8qIFRoZXNlIHdpbGwgZmFpbCAqLworCQkJCSh2b2lkKSBjaG93bihsaW5lLCBnZXR1aWQoKSwgMCk7CisJCQkJKHZvaWQpIGNobW9kKGxpbmUsIFNfSVJVU1J8U19JV1VTUnxTX0lXR1JQKTsKKyNpZmRlZiBIQVZFX1JFVk9LRQorCQkJCSh2b2lkKSByZXZva2UobGluZSk7CisjZW5kaWYKKwkJCQlpZiAoKHNsYXZlID0gb3BlbihsaW5lLCBPX1JEV1IsIDApKSAhPSAtMSkgeworCQkJCQkqYW1hc3RlciA9IG1hc3RlcjsKKwkJCQkJKmFzbGF2ZSA9IHNsYXZlOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJKHZvaWQpIGNsb3NlKG1hc3Rlcik7CisJCQkJbGluZVs1XSA9ICdwJzsKKwkJCX0KKwkJfQorCX0KKwllcnJubyA9IEVOT0VOVDsgLyogb3V0IG9mIHB0eXMgKi8KKwlyZXR1cm4gKC0xKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBYWFggVGhpcyBpcyB1Z2x5CisgKiBXZSBjcmVhdGUgYW5kIGJpbmQgYSBzb2NrZXQsIHRoZW4gZm9yayBvZmYgdG8gYW5vdGhlcgorICogcHJvY2Vzcywgd2hpY2ggY29ubmVjdHMgdG8gdGhpcyBzb2NrZXQsIGFmdGVyIHdoaWNoIHdlCisgKiBleGVjIHRoZSB3YW50ZWQgcHJvZ3JhbS4gIElmIHNvbWV0aGluZyAoc3RyYW5nZSkgaGFwcGVucywKKyAqIHRoZSBhY2NlcHQoKSBjYWxsIGNvdWxkIGJsb2NrIHVzIGZvcmV2ZXIuCisgKgorICogZG9fcHR5ID0gMCAgIEZvcmsvZXhlYyBpbmV0ZCBzdHlsZQorICogZG9fcHR5ID0gMSAgIEZvcmsvZXhlYyB1c2luZyBzbGlycC50ZWxuZXRkCisgKiBkb19wdHIgPSAyICAgRm9yay9leGVjIHVzaW5nIHB0eQorICovCitpbnQKK2ZvcmtfZXhlYyhzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqZXgsIGludCBkb19wdHkpCit7CisJaW50IHM7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CisJaW50IG9wdDsKKyAgICAgICAgaW50IG1hc3RlciA9IC0xOworCWNvbnN0IGNoYXIgKmFyZ3ZbMjU2XTsKKyNpZiAwCisJY2hhciBidWZmWzI1Nl07CisjZW5kaWYKKwkvKiBkb24ndCB3YW50IHRvIGNsb2JiZXIgdGhlIG9yaWdpbmFsICovCisJY2hhciAqYnB0cjsKKwljb25zdCBjaGFyICpjdXJhcmc7CisJaW50IGMsIGksIHJldDsKKworCURFQlVHX0NBTEwoImZvcmtfZXhlYyIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJleCA9ICVseCIsIChsb25nKWV4KTsKKwlERUJVR19BUkcoImRvX3B0eSA9ICVseCIsIChsb25nKWRvX3B0eSk7CisKKwlpZiAoZG9fcHR5ID09IDIpIHsKKyNpZiAwCisJCWlmIChzbGlycF9vcGVucHR5KCZtYXN0ZXIsICZzKSA9PSAtMSkgeworCQkJbHByaW50KCJFcnJvcjogb3BlbnB0eSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIDA7CisJCX0KKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKwl9IGVsc2UgeworCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlhZGRyLnNpbl9wb3J0ID0gMDsKKwkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJCWlmICgocyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCB8fAorCQkgICAgYmluZChzLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIGFkZHJsZW4pIDwgMCB8fAorCQkgICAgbGlzdGVuKHMsIDEpIDwgMCkgeworCQkJbHByaW50KCJFcnJvcjogaW5ldCBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJY2xvc2Vzb2NrZXQocyk7CisKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJc3dpdGNoKGZvcmsoKSkgeworCSBjYXNlIC0xOgorCQlscHJpbnQoIkVycm9yOiBmb3JrIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHMpOworCQlpZiAoZG9fcHR5ID09IDIpCisJCSAgIGNsb3NlKG1hc3Rlcik7CisJCXJldHVybiAwOworCisJIGNhc2UgMDoKKwkJLyogU2V0IHRoZSBESVNQTEFZICovCisJCWlmIChkb19wdHkgPT0gMikgeworCQkJKHZvaWQpIGNsb3NlKG1hc3Rlcik7CisjaWZkZWYgVElPQ1NDVFRZIC8qIFhYWFhYICovCisJCQkodm9pZCkgc2V0c2lkKCk7CisJCQlpb2N0bChzLCBUSU9DU0NUVFksIChjaGFyICopTlVMTCk7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWdldHNvY2tuYW1lKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pOworCQkJY2xvc2Uocyk7CisJCQkvKgorCQkJICogQ29ubmVjdCB0byB0aGUgc29ja2V0CisJCQkgKiBYWFggSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlJ3JlIGluIHRyb3VibGUhCisJIAkJICovCisJCQlzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKwkJCWFkZHIuc2luX2FkZHIgPSBsb29wYmFja19hZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBhZGRybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCQl9CisKKyNpZiAwCisJCWlmICh4X3BvcnQgPj0gMCkgeworI2lmZGVmIEhBVkVfU0VURU5WCisJCQlzcHJpbnRmKGJ1ZmYsICIlczolZC4lZCIsIGluZXRfbnRvYShvdXJfYWRkciksIHhfcG9ydCwgeF9zY3JlZW4pOworCQkJc2V0ZW52KCJESVNQTEFZIiwgYnVmZiwgMSk7CisjZWxzZQorCQkJc3ByaW50ZihidWZmLCAiRElTUExBWT0lczolZC4lZCIsIGluZXRfbnRvYShvdXJfYWRkciksIHhfcG9ydCwgeF9zY3JlZW4pOworCQkJcHV0ZW52KGJ1ZmYpOworI2VuZGlmCisJCX0KKyNlbmRpZgorCQlkdXAyKHMsIDApOworCQlkdXAyKHMsIDEpOworCQlkdXAyKHMsIDIpOworCQlmb3IgKHMgPSBnZXRkdGFibGVzaXplKCkgLSAxOyBzID49IDM7IHMtLSkKKwkJICAgY2xvc2Uocyk7CisKKwkJaSA9IDA7CisJCWJwdHIgPSBzdHJkdXAoZXgpOyAvKiBObyBuZWVkIHRvIGZyZWUoKSB0aGlzICovCisJCWlmIChkb19wdHkgPT0gMSkgeworCQkJLyogU2V0dXAgInNsaXJwLnRlbG5ldGQgLXgiICovCisJCQlhcmd2W2krK10gPSAic2xpcnAudGVsbmV0ZCI7CisJCQlhcmd2W2krK10gPSAiLXgiOworCQkJYXJndltpKytdID0gYnB0cjsKKwkJfSBlbHNlCisJCSAgIGRvIHsKKwkJCS8qIENoYW5nZSB0aGUgc3RyaW5nIGludG8gYXJndltdICovCisJCQljdXJhcmcgPSBicHRyOworCQkJd2hpbGUgKCpicHRyICE9ICcgJyAmJiAqYnB0ciAhPSAoY2hhcikwKQorCQkJICAgYnB0cisrOworCQkJYyA9ICpicHRyOworCQkJKmJwdHIrKyA9IChjaGFyKTA7CisJCQlhcmd2W2krK10gPSBzdHJkdXAoY3VyYXJnKTsKKwkJICAgfSB3aGlsZSAoYyk7CisKKyAgICAgICAgICAgICAgICBhcmd2W2ldID0gTlVMTDsKKwkJZXhlY3ZwKGFyZ3ZbMF0sIChjaGFyICoqKWFyZ3YpOworCisJCS8qIE9vb3BzLCBmYWlsZWQsIGxldCdzIHRlbGwgdGhlIHVzZXIgd2h5ICovCisJCSAgeworCQkJICBjaGFyIGJ1ZmZbMjU2XTsKKworCQkJICBzbnByaW50ZihidWZmLCBzaXplb2YoYnVmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogZXhlY3ZwIG9mICVzIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIHN0cmVycm9yKGVycm5vKSk7CisJCQkgIHdyaXRlKDIsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKwkJICB9CisJCWNsb3NlKDApOyBjbG9zZSgxKTsgY2xvc2UoMik7IC8qIFhYWCAqLworCQlleGl0KDEpOworCisJIGRlZmF1bHQ6CisJCWlmIChkb19wdHkgPT0gMikgeworCQkJY2xvc2Uocyk7CisJCQlzby0+cyA9IG1hc3RlcjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggdGhpcyBjb3VsZCBibG9jayB1cy4uLgorCQkJICogWFhYIFNob3VsZCBzZXQgYSB0aW1lciBoZXJlLCBhbmQgaWYgYWNjZXB0KCkgZG9lc24ndAorCQkgCSAqIHJldHVybiBhZnRlciBYIHNlY29uZHMsIGRlY2xhcmUgaXQgYSBmYWlsdXJlCisJCSAJICogVGhlIG9ubHkgcmVhc29uIHRoaXMgd2lsbCBibG9jayBmb3JldmVyIGlzIGlmIHNvY2tldCgpCisJCSAJICogb2YgY29ubmVjdCgpIGZhaWwgaW4gdGhlIGNoaWxkIHByb2Nlc3MKKwkJIAkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzby0+cyA9IGFjY2VwdChzLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHNvLT5zIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXNvY2tldChzKTsKKwkJCW9wdCA9IDE7CisJCQlzZXRzb2Nrb3B0KHNvLT5zLFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLChjaGFyICopJm9wdCxzaXplb2YoaW50KSk7CisJCQlvcHQgPSAxOworCQkJc2V0c29ja29wdChzby0+cyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOworCQl9CisJCWZkX25vbmJsb2NrKHNvLT5zKTsKKworCQkvKiBBcHBlbmQgdGhlIHRlbG5ldCBvcHRpb25zIG5vdyAqLworICAgICAgICAgICAgICAgIGlmIChzby0+c29fbSAhPSBOVUxMICYmIGRvX3B0eSA9PSAxKSAgeworCQkJc2JhcHBlbmQoc28sIHNvLT5zb19tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvLT5zb19tID0gTlVMTDsKKwkJfQorCisJCXJldHVybiAxOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSRFVQCitjaGFyICoKK3N0cmR1cChzdHIpCisJY29uc3QgY2hhciAqc3RyOworeworCWNoYXIgKmJwdHI7CisKKwlicHRyID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikrMSk7CisJc3RyY3B5KGJwdHIsIHN0cik7CisKKwlyZXR1cm4gYnB0cjsKK30KKyNlbmRpZgorCisjaWYgMAordm9pZAorc25vb3plX2h1cChudW0pCisJaW50IG51bTsKK3sKKwlpbnQgcywgcmV0OworI2lmbmRlZiBOT19VTklYX1NPQ0tFVFMKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc29ja191bjsKKyNlbmRpZgorCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrX2luOworCWNoYXIgYnVmZlsyNTZdOworCisJcmV0ID0gLTE7CisJaWYgKHNsaXJwX3NvY2tldF9wYXNzd2QpIHsKKwkJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJCWlmIChzIDwgMCkKKwkJICAgc2xpcnBfZXhpdCgxKTsKKwkJc29ja19pbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc29ja19pbi5zaW5fYWRkci5zX2FkZHIgPSBzbGlycF9zb2NrZXRfYWRkcjsKKwkJc29ja19pbi5zaW5fcG9ydCA9IGh0b25zKHNsaXJwX3NvY2tldF9wb3J0KTsKKwkJaWYgKGNvbm5lY3QocywgKHN0cnVjdCBzb2NrYWRkciAqKSZzb2NrX2luLCBzaXplb2Yoc29ja19pbikpICE9IDApCisJCSAgIHNsaXJwX2V4aXQoMSk7IC8qIGp1c3QgZXhpdC4uLiovCisJCXNwcmludGYoYnVmZiwgImtpbGwgJXM6JWQiLCBzbGlycF9zb2NrZXRfcGFzc3dkLCBzbGlycF9zb2NrZXRfdW5pdCk7CisJCXdyaXRlKHMsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKwl9CisjaWZuZGVmIE5PX1VOSVhfU09DS0VUUworCSAgZWxzZSB7CisJCXMgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApOworCQlpZiAocyA8IDApCisJCSAgIHNsaXJwX2V4aXQoMSk7CisJCXNvY2tfdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisJCXN0cmNweShzb2NrX3VuLnN1bl9wYXRoLCBzb2NrZXRfcGF0aCk7CisJCWlmIChjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc29ja191biwKKwkJCSAgICAgIHNpemVvZihzb2NrX3VuLnN1bl9mYW1pbHkpICsgc2l6ZW9mKHNvY2tfdW4uc3VuX3BhdGgpKSAhPSAwKQorCQkgICBzbGlycF9leGl0KDEpOworCQlzcHJpbnRmKGJ1ZmYsICJraWxsIG5vbmU6JWQiLCBzbGlycF9zb2NrZXRfdW5pdCk7CisJCXdyaXRlKHMsIGJ1ZmYsIHN0cmxlbihidWZmKSsxKTsKKwl9CisjZW5kaWYKKwlzbGlycF9leGl0KDApOworfQorCisKK3ZvaWQKK3Nub296ZSgpCit7CisJc2lnc2V0X3QgczsKKwlpbnQgaTsKKworCS8qIERvbid0IG5lZWQgb3VyIGRhdGEgYW55bW9yZSAqLworCS8qIFhYWCBUaGlzIG1ha2VzIFN1bk9TIGJhcmYgKi8KKy8qCWJyaygwKTsgKi8KKworCS8qIENsb3NlIGFsbCBmZCdzICovCisJZm9yIChpID0gMjU1OyBpID49IDA7IGktLSkKKwkgICBjbG9zZShpKTsKKworCXNpZ25hbChTSUdRVUlULCBzbGlycF9leGl0KTsKKwlzaWduYWwoU0lHSFVQLCBzbm9vemVfaHVwKTsKKwlzaWdlbXB0eXNldCgmcyk7CisKKwkvKiBXYWl0IGZvciBhbnkgc2lnbmFsICovCisJc2lnc3VzcGVuZCgmcyk7CisKKwkvKiBKdXN0IGluIGNhc2UgLi4uICovCisJZXhpdCgyNTUpOworfQorCit2b2lkCityZWxheShzKQorCWludCBzOworeworCWNoYXIgYnVmWzgxOTJdOworCWludCBuOworCWZkX3NldCByZWFkZmRzOworCXN0cnVjdCB0dHlzICp0dHlwOworCisJLyogRG9uJ3QgbmVlZCBvdXIgZGF0YSBhbnltb3JlICovCisJLyogWFhYIFRoaXMgbWFrZXMgU3VuT1MgYmFyZiAqLworLyoJYnJrKDApOyAqLworCisJc2lnbmFsKFNJR1FVSVQsIHNsaXJwX2V4aXQpOworCXNpZ25hbChTSUdIVVAsIHNsaXJwX2V4aXQpOworICAgICAgICBzaWduYWwoU0lHSU5ULCBzbGlycF9leGl0KTsKKwlzaWduYWwoU0lHVEVSTSwgc2xpcnBfZXhpdCk7CisKKwkvKiBGdWRnZSB0byBnZXQgdGVybV9yYXcgYW5kIHRlcm1fcmVzdG9yZSB0byB3b3JrICovCisJaWYgKE5VTEwgPT0gKHR0eXAgPSB0dHlfYXR0YWNoICgwLCBzbGlycF90dHkpKSkgeworICAgICAgICAgbHByaW50ICgiRXJyb3I6IHR0eV9hdHRhY2ggZmFpbGVkIGluIG1pc2MuYzpyZWxheSgpXHJcbiIpOworICAgICAgICAgc2xpcnBfZXhpdCAoMSk7CisgICAgfQorCXR0eXAtPmZkID0gMDsKKwl0dHlwLT5mbGFncyB8PSBUVFlfQ1RUWTsKKwl0ZXJtX3Jhdyh0dHlwKTsKKworCXdoaWxlICgxKSB7CisJCUZEX1pFUk8oJnJlYWRmZHMpOworCisJCUZEX1NFVCgwLCAmcmVhZGZkcyk7CisJCUZEX1NFVChzLCAmcmVhZGZkcyk7CisKKwkJbiA9IHNlbGVjdChzKzEsICZyZWFkZmRzLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChzdHJ1Y3QgdGltZXZhbCAqKTApOworCisJCWlmIChuIDw9IDApCisJCSAgIHNsaXJwX2V4aXQoMCk7CisKKwkJaWYgKEZEX0lTU0VUKDAsICZyZWFkZmRzKSkgeworCQkJbiA9IHJlYWQoMCwgYnVmLCA4MTkyKTsKKwkJCWlmIChuIDw9IDApCisJCQkgICBzbGlycF9leGl0KDApOworCQkJbiA9IHdyaXRlbihzLCBidWYsIG4pOworCQkJaWYgKG4gPD0gMCkKKwkJCSAgIHNsaXJwX2V4aXQoMCk7CisJCX0KKworCQlpZiAoRkRfSVNTRVQocywgJnJlYWRmZHMpKSB7CisJCQluID0gcmVhZChzLCBidWYsIDgxOTIpOworCQkJaWYgKG4gPD0gMCkKKwkJCSAgIHNsaXJwX2V4aXQoMCk7CisJCQluID0gd3JpdGVuKDAsIGJ1Ziwgbik7CisJCQlpZiAobiA8PSAwKQorCQkJICAgc2xpcnBfZXhpdCgwKTsKKwkJfQorCX0KKworCS8qIEp1c3QgaW4gY2FzZS4uLi4gKi8KKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUUVNVQorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorCit2b2lkIGxwcmludChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIG1vbml0b3JfdnByaW50ZihjdXJfbW9uLCBmb3JtYXQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKK30KKyNlbHNlCitpbnQgKCpscHJpbnRfcHJpbnQpIF9QKCh2b2lkICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworY2hhciAqbHByaW50X3B0ciwgKmxwcmludF9wdHIyLCAqKmxwcmludF9hcmc7CisKK3ZvaWQKKyNpZmRlZiBfX1NURENfXworbHByaW50KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2Vsc2UKK2xwcmludCh2YV9hbGlzdCkgdmFfZGNsCisjZW5kaWYKK3sKKwl2YV9saXN0IGFyZ3M7CisKKyNpZmRlZiBfX1NURENfXworICAgICAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworI2Vsc2UKKyAgICAgICAgY2hhciAqZm9ybWF0OworICAgICAgICB2YV9zdGFydChhcmdzKTsKKyAgICAgICAgZm9ybWF0ID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKyNpZiAwCisJLyogSWYgd2UncmUgcHJpbnRpbmcgdG8gYW4gc2J1ZiwgbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIHJvb20gKi8KKwkvKiBYWFggKzEwMD8gKi8KKwlpZiAobHByaW50X3NiKSB7CisJCWlmICgobHByaW50X3B0ciAtIGxwcmludF9zYi0+c2Jfd3B0cikgPj0KKwkJICAgIChscHJpbnRfc2ItPnNiX2RhdGFsZW4gLSAoc3RybGVuKGZvcm1hdCkgKyAxMDApKSkgeworCQkJaW50IGRlbHRhdyA9IGxwcmludF9zYi0+c2Jfd3B0ciAtIGxwcmludF9zYi0+c2JfZGF0YTsKKwkJCWludCBkZWx0YXIgPSBscHJpbnRfc2ItPnNiX3JwdHIgLSBscHJpbnRfc2ItPnNiX2RhdGE7CisJCQlpbnQgZGVsdGFwID0gbHByaW50X3B0ciAtICAgICAgICAgbHByaW50X3NiLT5zYl9kYXRhOworCisJCQlscHJpbnRfc2ItPnNiX2RhdGEgPSAoY2hhciAqKXJlYWxsb2MobHByaW50X3NiLT5zYl9kYXRhLAorCQkJCQkJCSAgICAgbHByaW50X3NiLT5zYl9kYXRhbGVuICsgVENQX1NORFNQQUNFKTsKKworCQkJLyogQWRqdXN0IGFsbCB2YWx1ZXMgKi8KKwkJCWxwcmludF9zYi0+c2Jfd3B0ciA9IGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhdzsKKwkJCWxwcmludF9zYi0+c2JfcnB0ciA9IGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhcjsKKwkJCWxwcmludF9wdHIgPSAgICAgICAgIGxwcmludF9zYi0+c2JfZGF0YSArIGRlbHRhcDsKKworCQkJbHByaW50X3NiLT5zYl9kYXRhbGVuICs9IFRDUF9TTkRTUEFDRTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChscHJpbnRfcHJpbnQpCisJICAgbHByaW50X3B0ciArPSAoKmxwcmludF9wcmludCkoKmxwcmludF9hcmcsIGZvcm1hdCwgYXJncyk7CisKKwkvKiBDaGVjayBpZiB0aGV5IHdhbnQgb3V0cHV0IHRvIGJlIGxvZ2dlZCB0byBmaWxlIGFzIHdlbGwgKi8KKwlpZiAobGZkKSB7CisJCS8qCisJCSAqIFJlbW92ZSBccidzCisJCSAqIG90aGVyd2lzZSB5b3UnbGwgZ2V0IF5NIGFsbCBvdmVyIHRoZSBmaWxlCisJCSAqLworCQlpbnQgbGVuID0gc3RybGVuKGZvcm1hdCk7CisJCWNoYXIgKmJwdHIxLCAqYnB0cjI7CisKKwkJYnB0cjEgPSBicHRyMiA9IHN0cmR1cChmb3JtYXQpOworCisJCXdoaWxlIChsZW4tLSkgeworCQkJaWYgKCpicHRyMSA9PSAnXHInKQorCQkJICAgbWVtY3B5KGJwdHIxLCBicHRyMSsxLCBsZW4rMSk7CisJCQllbHNlCisJCQkgICBicHRyMSsrOworCQl9CisJCXZmcHJpbnRmKGxmZCwgYnB0cjIsIGFyZ3MpOworCQlmcmVlKGJwdHIyKTsKKwl9CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkCithZGRfZW11KGJ1ZmYpCisJY2hhciAqYnVmZjsKK3sKKwl1X2ludCBscG9ydCwgZnBvcnQ7CisJdV9pbnQ4X3QgdG9zID0gMCwgZW11ID0gMDsKKwljaGFyIGJ1ZmYxWzI1Nl0sIGJ1ZmYyWzI1Nl0sIGJ1ZmY0WzEyOF07CisJY2hhciAqYnVmZjMgPSBidWZmNDsKKwlzdHJ1Y3QgZW11X3QgKmVtdXA7CisJc3RydWN0IHNvY2tldCAqc287CisKKwlpZiAoc3NjYW5mKGJ1ZmYsICIlMjU2cyAlMjU2cyIsIGJ1ZmYyLCBidWZmMSkgIT0gMikgeworCQlscHJpbnQoIkVycm9yOiBCYWQgYXJndW1lbnRzXHJcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHNzY2FuZihidWZmMSwgIiVkOiVkIiwgJmxwb3J0LCAmZnBvcnQpICE9IDIpIHsKKwkJbHBvcnQgPSAwOworCQlpZiAoc3NjYW5mKGJ1ZmYxLCAiJWQiLCAmZnBvcnQpICE9IDEpIHsKKwkJCWxwcmludCgiRXJyb3I6IEJhZCBmaXJzdCBhcmd1bWVudFxyXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWlmIChzc2NhbmYoYnVmZjIsICIlMTI4W146XTolMTI4cyIsIGJ1ZmYxLCBidWZmMykgIT0gMikgeworCQlidWZmMyA9IDA7CisJCWlmIChzc2NhbmYoYnVmZjIsICIlMjU2cyIsIGJ1ZmYxKSAhPSAxKSB7CisJCQlscHJpbnQoIkVycm9yOiBCYWQgc2Vjb25kIGFyZ3VtZW50XHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGJ1ZmYzKSB7CisJCWlmIChzdHJjbXAoYnVmZjMsICJsb3dkZWxheSIpID09IDApCisJCSAgIHRvcyA9IElQVE9TX0xPV0RFTEFZOworCQllbHNlIGlmIChzdHJjbXAoYnVmZjMsICJ0aHJvdWdocHV0IikgPT0gMCkKKwkJICAgdG9zID0gSVBUT1NfVEhST1VHSFBVVDsKKwkJZWxzZSB7CisJCQlscHJpbnQoIkVycm9yOiBFeHBlY3RpbmcgXCJsb3dkZWxheVwiL1widGhyb3VnaHB1dFwiXHJcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKHN0cmNtcChidWZmMSwgImZ0cCIpID09IDApCisJICAgZW11ID0gRU1VX0ZUUDsKKwllbHNlIGlmIChzdHJjbXAoYnVmZjEsICJpcmMiKSA9PSAwKQorCSAgIGVtdSA9IEVNVV9JUkM7CisJZWxzZSBpZiAoc3RyY21wKGJ1ZmYxLCAibm9uZSIpID09IDApCisJICAgZW11ID0gRU1VX05PTkU7IC8qIGllOiBubyBlbXVsYXRpb24gKi8KKwllbHNlIHsKKwkJbHByaW50KCJFcnJvcjogVW5rbm93biBzZXJ2aWNlXHJcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogRmlyc3QsIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYWxyZWFkeSBlbXVsYXRlZCAqLworCWZvciAoZW11cCA9IHRjcGVtdTsgZW11cDsgZW11cCA9IGVtdXAtPm5leHQpIHsKKwkJaWYgKGVtdXAtPmxwb3J0ID09IGxwb3J0ICYmIGVtdXAtPmZwb3J0ID09IGZwb3J0KSB7CisJCQlscHJpbnQoIkVycm9yOiBwb3J0IGFscmVhZHkgZW11bGF0ZWRcclxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBsaW5rIGl0ICovCisJZW11cCA9IChzdHJ1Y3QgZW11X3QgKiltYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgZW11X3QpKTsKKwllbXVwLT5scG9ydCA9ICh1X2ludDE2X3QpbHBvcnQ7CisJZW11cC0+ZnBvcnQgPSAodV9pbnQxNl90KWZwb3J0OworCWVtdXAtPnRvcyA9IHRvczsKKwllbXVwLT5lbXUgPSBlbXU7CisJZW11cC0+bmV4dCA9IHRjcGVtdTsKKwl0Y3BlbXUgPSBlbXVwOworCisJLyogQW5kIGZpbmFsbHksIG1hcmsgYWxsIGN1cnJlbnQgc2Vzc2lvbnMsIGlmIGFueSwgYXMgYmVpbmcgZW11bGF0ZWQgKi8KKwlmb3IgKHNvID0gdGNiLnNvX25leHQ7IHNvICE9ICZ0Y2I7IHNvID0gc28tPnNvX25leHQpIHsKKwkJaWYgKChscG9ydCAmJiBscG9ydCA9PSBudG9ocyhzby0+c29fbHBvcnQpKSB8fAorCQkgICAgKGZwb3J0ICYmIGZwb3J0ID09IG50b2hzKHNvLT5zb19mcG9ydCkpKSB7CisJCQlpZiAoZW11KQorCQkJICAgc28tPnNvX2VtdSA9IGVtdTsKKwkJCWlmICh0b3MpCisJCQkgICBzby0+c29faXB0b3MgPSB0b3M7CisJCX0KKwl9CisKKwlscHJpbnQoIkFkZGluZyBlbXVsYXRpb24gZm9yICVzIHRvIHBvcnQgJWQvJWRcclxuIiwgYnVmZjEsIGVtdXAtPmxwb3J0LCBlbXVwLT5mcG9ydCk7Cit9CisjZW5kaWYKKworI2lmZGVmIEJBRF9TUFJJTlRGCisKKyN1bmRlZiB2c3ByaW50ZgorI3VuZGVmIHNwcmludGYKKworLyoKKyAqIFNvbWUgQlNELWRlcml2ZWQgc3lzdGVtcyBoYXZlIGEgc3ByaW50ZiB3aGljaCByZXR1cm5zIGNoYXIgKgorICovCisKK2ludAordnNwcmludGZfbGVuKHN0cmluZywgZm9ybWF0LCBhcmdzKQorCWNoYXIgKnN0cmluZzsKKwljb25zdCBjaGFyICpmb3JtYXQ7CisJdmFfbGlzdCBhcmdzOworeworCXZzcHJpbnRmKHN0cmluZywgZm9ybWF0LCBhcmdzKTsKKwlyZXR1cm4gc3RybGVuKHN0cmluZyk7Cit9CisKK2ludAorI2lmZGVmIF9fU1REQ19fCitzcHJpbnRmX2xlbihjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorI2Vsc2UKK3NwcmludGZfbGVuKHZhX2FsaXN0KSB2YV9kY2wKKyNlbmRpZgoreworCXZhX2xpc3QgYXJnczsKKyNpZmRlZiBfX1NURENfXworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisjZWxzZQorCWNoYXIgKnN0cmluZzsKKwljaGFyICpmb3JtYXQ7CisJdmFfc3RhcnQoYXJncyk7CisJc3RyaW5nID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisJZm9ybWF0ID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisjZW5kaWYKKwl2c3ByaW50ZihzdHJpbmcsIGZvcm1hdCwgYXJncyk7CisJcmV0dXJuIHN0cmxlbihzdHJpbmcpOworfQorCisjZW5kaWYKKwordm9pZAordV9zbGVlcChpbnQgdXNlYykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0OworCWZkX3NldCBmZHNldDsKKworCUZEX1pFUk8oJmZkc2V0KTsKKworCXQudHZfc2VjID0gMDsKKwl0LnR2X3VzZWMgPSB1c2VjICogMTAwMDsKKworCXNlbGVjdCgwLCAmZmRzZXQsICZmZHNldCwgJmZkc2V0LCAmdCk7Cit9CisKKy8qCisgKiBTZXQgZmQgYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZworICovCisKK3ZvaWQKK2ZkX25vbmJsb2NrKGludCBmZCkKK3sKKyNpZmRlZiBGSU9OQklPCisjaWZkZWYgX1dJTjMyCisgICAgICAgIHVuc2lnbmVkIGxvbmcgb3B0ID0gMTsKKyNlbHNlCisgICAgICAgIGludCBvcHQgPSAxOworI2VuZGlmCisKKwlpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7CisjZWxzZQorCWludCBvcHQ7CisKKwlvcHQgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CisJb3B0IHw9IE9fTk9OQkxPQ0s7CisJZmNudGwoZmQsIEZfU0VURkwsIG9wdCk7CisjZW5kaWYKK30KKwordm9pZAorZmRfYmxvY2soaW50IGZkKQoreworI2lmZGVmIEZJT05CSU8KKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgdW5zaWduZWQgbG9uZyBvcHQgPSAwOworI2Vsc2UKKwlpbnQgb3B0ID0gMDsKKyNlbmRpZgorCisJaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sICZvcHQpOworI2Vsc2UKKwlpbnQgb3B0OworCisJb3B0ID0gZmNudGwoZmQsIEZfR0VURkwsIDApOworCW9wdCAmPSB+T19OT05CTE9DSzsKKwlmY250bChmZCwgRl9TRVRGTCwgb3B0KTsKKyNlbmRpZgorfQorCisKKyNpZiAwCisvKgorICogaW52b2tlIFJTSAorICovCitpbnQKK3JzaF9leGVjKHNvLG5zLCB1c2VyLCBob3N0LCBhcmdzKQorCXN0cnVjdCBzb2NrZXQgKnNvOworCXN0cnVjdCBzb2NrZXQgKm5zOworCWNoYXIgKnVzZXI7CisJY2hhciAqaG9zdDsKKwljaGFyICphcmdzOworeworCWludCBmZFsyXTsKKwlpbnQgZmQwWzJdOworCWludCBzOworCWNoYXIgYnVmZlsyNTZdOworCisJREVCVUdfQ0FMTCgicnNoX2V4ZWMiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcpc28pOworCisJaWYgKHBpcGUoZmQpPDApIHsKKyAgICAgICAgICBscHJpbnQoIkVycm9yOiBwaXBlIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgcmV0dXJuIDA7CisJfQorLyogI2lmZGVmIEhBVkVfU09DS0VUUEFJUiAqLworI2lmIDEKKyAgICAgICAgaWYgKHNvY2tldHBhaXIoUEZfVU5JWCxTT0NLX1NUUkVBTSwwLCBmZDApID09IC0xKSB7CisgICAgICAgICAgY2xvc2UoZmRbMF0pOworICAgICAgICAgIGNsb3NlKGZkWzFdKTsKKyAgICAgICAgICBscHJpbnQoIkVycm9yOiBvcGVucHR5IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChzbGlycF9vcGVucHR5KCZmZDBbMF0sICZmZDBbMV0pID09IC0xKSB7CisgICAgICAgICAgY2xvc2UoZmRbMF0pOworICAgICAgICAgIGNsb3NlKGZkWzFdKTsKKyAgICAgICAgICBscHJpbnQoIkVycm9yOiBvcGVucHR5IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyNlbmRpZgorCisJc3dpdGNoKGZvcmsoKSkgeworCSBjYXNlIC0xOgorICAgICAgICAgICBscHJpbnQoIkVycm9yOiBmb3JrIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgIGNsb3NlKGZkWzBdKTsKKyAgICAgICAgICAgY2xvc2UoZmRbMV0pOworICAgICAgICAgICBjbG9zZShmZDBbMF0pOworICAgICAgICAgICBjbG9zZShmZDBbMV0pOworICAgICAgICAgICByZXR1cm4gMDsKKworCSBjYXNlIDA6CisgICAgICAgICAgIGNsb3NlKGZkWzBdKTsKKyAgICAgICAgICAgY2xvc2UoZmQwWzBdKTsKKworCQkvKiBTZXQgdGhlIERJU1BMQVkgKi8KKyAgICAgICAgICAgaWYgKHhfcG9ydCA+PSAwKSB7CisjaWZkZWYgSEFWRV9TRVRFTlYKKyAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmYsICIlczolZC4lZCIsIGluZXRfbnRvYShvdXJfYWRkciksIHhfcG9ydCwgeF9zY3JlZW4pOworICAgICAgICAgICAgIHNldGVudigiRElTUExBWSIsIGJ1ZmYsIDEpOworI2Vsc2UKKyAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmYsICJESVNQTEFZPSVzOiVkLiVkIiwgaW5ldF9udG9hKG91cl9hZGRyKSwgeF9wb3J0LCB4X3NjcmVlbik7CisgICAgICAgICAgICAgcHV0ZW52KGJ1ZmYpOworI2VuZGlmCisgICAgICAgICAgIH0KKworICAgICAgICAgICBkdXAyKGZkMFsxXSwgMCk7CisgICAgICAgICAgIGR1cDIoZmQwWzFdLCAxKTsKKyAgICAgICAgICAgZHVwMihmZFsxXSwgMik7CisgICAgICAgICAgIGZvciAocyA9IDM7IHMgPD0gMjU1OyBzKyspCisgICAgICAgICAgICAgY2xvc2Uocyk7CisKKyAgICAgICAgICAgZXhlY2xwKCJyc2giLCJyc2giLCItbCIsIHVzZXIsIGhvc3QsIGFyZ3MsIE5VTEwpOworCisgICAgICAgICAgIC8qIE9vb3BzLCBmYWlsZWQsIGxldCdzIHRlbGwgdGhlIHVzZXIgd2h5ICovCisKKyAgICAgICAgICAgc3ByaW50ZihidWZmLCAiRXJyb3I6IGV4ZWNscCBvZiAlcyBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICJyc2giLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICB3cml0ZSgyLCBidWZmLCBzdHJsZW4oYnVmZikrMSk7CisgICAgICAgICAgIGNsb3NlKDApOyBjbG9zZSgxKTsgY2xvc2UoMik7IC8qIFhYWCAqLworICAgICAgICAgICBleGl0KDEpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgY2xvc2UoZmRbMV0pOworICAgICAgICAgIGNsb3NlKGZkMFsxXSk7CisgICAgICAgICAgbnMtPnM9ZmRbMF07CisgICAgICAgICAgc28tPnM9ZmQwWzBdOworCisgICAgICAgICAgcmV0dXJuIDE7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL21pc2MuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvbWlzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOGUzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL21pc2MuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpZm5kZWYgX01JU0NfSF8KKyNkZWZpbmUgX01JU0NfSF8KKworc3RydWN0IGV4X2xpc3QgeworCWludCBleF9wdHk7CQkJLyogRG8gd2Ugd2FudCBhIHB0eT8gKi8KKwlpbnQgZXhfYWRkcjsJCQkvKiBUaGUgbGFzdCBieXRlIG9mIHRoZSBhZGRyZXNzICovCisJaW50IGV4X2Zwb3J0OyAgICAgICAgICAgICAgICAgICAvKiBQb3J0IHRvIHRlbG5ldCB0byAqLworCWNvbnN0IGNoYXIgKmV4X2V4ZWM7ICAgICAgICAgICAgLyogQ29tbWFuZCBsaW5lIG9mIHdoYXQgdG8gZXhlYyAqLworCXN0cnVjdCBleF9saXN0ICpleF9uZXh0OworfTsKKworZXh0ZXJuIHN0cnVjdCBleF9saXN0ICpleGVjX2xpc3Q7CitleHRlcm4gdV9pbnQgdGltZV9mYXN0dGltbywgbGFzdF9zbG93dGltbzsKKworZXh0ZXJuIGludCAoKmxwcmludF9wcmludCkgX1AoKHZvaWQgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CitleHRlcm4gY2hhciAqbHByaW50X3B0ciwgKmxwcmludF9wdHIyLCAqKmxwcmludF9hcmc7CitleHRlcm4gc3RydWN0IHNidWYgKmxwcmludF9zYjsKKworI2lmbmRlZiBIQVZFX1NUUkRVUAorY2hhciAqc3RyZHVwIF9QKChjb25zdCBjaGFyICopKTsKKyNlbmRpZgorCit2b2lkIGRvX3dhaXQgX1AoKGludCkpOworCisjZGVmaW5lIEVNVV9OT05FIDB4MAorCisvKiBUQ1AgZW11bGF0aW9ucyAqLworI2RlZmluZSBFTVVfQ1RMIDB4MQorI2RlZmluZSBFTVVfRlRQIDB4MgorI2RlZmluZSBFTVVfS1NIIDB4MworI2RlZmluZSBFTVVfSVJDIDB4NAorI2RlZmluZSBFTVVfUkVBTEFVRElPIDB4NQorI2RlZmluZSBFTVVfUkxPR0lOIDB4NgorI2RlZmluZSBFTVVfSURFTlQgMHg3CisjZGVmaW5lIEVNVV9SU0ggMHg4CisKKyNkZWZpbmUgRU1VX05PQ09OTkVDVCAweDEwCS8qIERvbid0IGNvbm5lY3QgKi8KKworLyogVURQIGVtdWxhdGlvbnMgKi8KKyNkZWZpbmUgRU1VX1RBTEsJMHgxCisjZGVmaW5lIEVNVV9OVEFMSwkweDIKKyNkZWZpbmUgRU1VX0NVU0VFTUUJMHgzCisKK3N0cnVjdCB0b3NfdCB7CisJdV9pbnQxNl90IGxwb3J0OworCXVfaW50MTZfdCBmcG9ydDsKKwl1X2ludDhfdCB0b3M7CisJdV9pbnQ4X3QgZW11OworfTsKKworc3RydWN0IGVtdV90IHsKKwl1X2ludDE2X3QgbHBvcnQ7CisJdV9pbnQxNl90IGZwb3J0OworCXVfaW50OF90IHRvczsKKwl1X2ludDhfdCBlbXU7CisJc3RydWN0IGVtdV90ICpuZXh0OworfTsKKworI2lmbmRlZiBDT05GSUdfUUVNVQorZXh0ZXJuIHN0cnVjdCBlbXVfdCAqdGNwZW11OworI2VuZGlmCisKK2V4dGVybiBpbnQgeF9wb3J0LCB4X3NlcnZlciwgeF9kaXNwbGF5OworCitpbnQgc2hvd194IF9QKChjaGFyICosIHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCByZWRpcl94IF9QKCh1X2ludDMyX3QsIGludCwgaW50LCBpbnQpKTsKK3ZvaWQgZ2V0b3VyYWRkciBfUCgodm9pZCkpOwordm9pZCBzbGlycF9pbnNxdWUgX1AoKHZvaWQgKiwgdm9pZCAqKSk7Cit2b2lkIHNsaXJwX3JlbXF1ZSBfUCgodm9pZCAqKSk7CitpbnQgYWRkX2V4ZWMgX1AoKHN0cnVjdCBleF9saXN0ICoqLCBpbnQsIGNoYXIgKiwgaW50LCBpbnQpKTsKK2ludCBzbGlycF9vcGVucHR5IF9QKChpbnQgKiwgaW50ICopKTsKK2ludCBmb3JrX2V4ZWMoc3RydWN0IHNvY2tldCAqc28sIGNvbnN0IGNoYXIgKmV4LCBpbnQgZG9fcHR5KTsKK3ZvaWQgc25vb3plX2h1cCBfUCgoaW50KSk7Cit2b2lkIHNub296ZSBfUCgodm9pZCkpOwordm9pZCByZWxheSBfUCgoaW50KSk7Cit2b2lkIGFkZF9lbXUgX1AoKGNoYXIgKikpOwordm9pZCB1X3NsZWVwIF9QKChpbnQpKTsKK3ZvaWQgZmRfbm9uYmxvY2sgX1AoKGludCkpOwordm9pZCBmZF9ibG9jayBfUCgoaW50KSk7CitpbnQgcnNoX2V4ZWMgX1AoKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHNvY2tldCAqLCBjaGFyICosIGNoYXIgKiwgY2hhciAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zYnVmLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3NidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzc1NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zYnVmLmMKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKK3N0YXRpYyB2b2lkIHNiYXBwZW5kc2Ioc3RydWN0IHNidWYgKnNiLCBzdHJ1Y3QgbWJ1ZiAqbSk7CisKKy8qIERvbmUgYXMgYSBtYWNybyBpbiBzb2NrZXQuaCAqLworLyogaW50CisgKiBzYnNwYWNlKHN0cnVjdCBzb2NrYnVmZiAqc2IpCisgKiB7CisgKglyZXR1cm4gU0JfREFUQUxFTiAtIHNiLT5zYl9jYzsKKyAqIH0KKyAqLworCit2b2lkCitzYmZyZWUoc3RydWN0IHNidWYgKnNiKQoreworCWZyZWUoc2ItPnNiX2RhdGEpOworfQorCit2b2lkCitzYmRyb3Aoc3RydWN0IHNidWYgKnNiLCBpbnQgbnVtKQoreworCS8qCisJICogV2UgY2FuIG9ubHkgZHJvcCBob3cgbXVjaCB3ZSBoYXZlCisJICogVGhpcyBzaG91bGQgbmV2ZXIgc3VjY2VlZAorCSAqLworCWlmKG51bSA+IHNiLT5zYl9jYykKKwkJbnVtID0gc2ItPnNiX2NjOworCXNiLT5zYl9jYyAtPSBudW07CisJc2ItPnNiX3JwdHIgKz0gbnVtOworCWlmKHNiLT5zYl9ycHRyID49IHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pCisJCXNiLT5zYl9ycHRyIC09IHNiLT5zYl9kYXRhbGVuOworCit9CisKK3ZvaWQKK3NicmVzZXJ2ZShzdHJ1Y3Qgc2J1ZiAqc2IsIGludCBzaXplKQoreworCWlmIChzYi0+c2JfZGF0YSkgeworCQkvKiBBbHJlYWR5IGFsbG9jZWQsIHJlYWxsb2MgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChzYi0+c2JfZGF0YWxlbiAhPSBzaXplKSB7CisJCQlzYi0+c2Jfd3B0ciA9IHNiLT5zYl9ycHRyID0gc2ItPnNiX2RhdGEgPSAoY2hhciAqKXJlYWxsb2Moc2ItPnNiX2RhdGEsIHNpemUpOworCQkJc2ItPnNiX2NjID0gMDsKKwkJCWlmIChzYi0+c2Jfd3B0cikKKwkJCSAgIHNiLT5zYl9kYXRhbGVuID0gc2l6ZTsKKwkJCWVsc2UKKwkJCSAgIHNiLT5zYl9kYXRhbGVuID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNiLT5zYl93cHRyID0gc2ItPnNiX3JwdHIgPSBzYi0+c2JfZGF0YSA9IChjaGFyICopbWFsbG9jKHNpemUpOworCQlzYi0+c2JfY2MgPSAwOworCQlpZiAoc2ItPnNiX3dwdHIpCisJCSAgIHNiLT5zYl9kYXRhbGVuID0gc2l6ZTsKKwkJZWxzZQorCQkgICBzYi0+c2JfZGF0YWxlbiA9IDA7CisJfQorfQorCisvKgorICogVHJ5IGFuZCB3cml0ZSgpIHRvIHRoZSBzb2NrZXQsIHdoYXRldmVyIGRvZXNuJ3QgZ2V0IHdyaXR0ZW4KKyAqIGFwcGVuZCB0byB0aGUgYnVmZmVyLi4uIGZvciBhIGhvc3Qgd2l0aCBhIGZhc3QgbmV0IGNvbm5lY3Rpb24sCisgKiB0aGlzIHByZXZlbnRzIGFuIHVubmVjZXNzYXJ5IGNvcHkgb2YgdGhlIGRhdGEKKyAqICh0aGUgc29ja2V0IGlzIG5vbi1ibG9ja2luZywgc28gd2Ugd29uJ3QgaGFuZykKKyAqLwordm9pZAorc2JhcHBlbmQoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCWludCByZXQgPSAwOworCisJREVCVUdfQ0FMTCgic2JhcHBlbmQiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcpc28pOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygibS0+bV9sZW4gPSAlZCIsIG0tPm1fbGVuKTsKKworCS8qIFNob3VsZG4ndCBoYXBwZW4sIGJ1dC4uLiAgZS5nLiBmb3JlaWduIGhvc3QgY2xvc2VzIGNvbm5lY3Rpb24gKi8KKwlpZiAobS0+bV9sZW4gPD0gMCkgeworCQltX2ZyZWUobSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIHVyZ2VudCBkYXRhLCBjYWxsIHNvc2VuZG9vYgorCSAqIGlmIG5vdCBhbGwgd2FzIHNlbnQsIHNvd3JpdGUgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIHJlc3QKKwkgKiAoVGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbiBpcyBqdXN0IGFuIG9wdGltaXNhdGlvbikKKwkgKi8KKwlpZiAoc28tPnNvX3VyZ2MpIHsKKwkJc2JhcHBlbmRzYigmc28tPnNvX3JjdiwgbSk7CisJCW1fZnJlZShtKTsKKwkJc29zZW5kb29iKHNvKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2Ugb25seSB3cml0ZSBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlIGJ1ZmZlciwKKwkgKiBvdHRoZXJ3aXNlIGl0J2xsIGFycml2ZSBvdXQgb2Ygb3JkZXIsIGFuZCBoZW5jZSBjb3JydXB0CisJICovCisJaWYgKCFzby0+c29fcmN2LnNiX2NjKQorCSAgIHJldCA9IHNsaXJwX3NlbmQoc28sIG0tPm1fZGF0YSwgbS0+bV9sZW4sIDApOworCisJaWYgKHJldCA8PSAwKSB7CisJCS8qCisJCSAqIE5vdGhpbmcgd2FzIHdyaXR0ZW4KKwkJICogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzb2NrZXQgaGFzIGNsb3NlZCwgYnV0CisJCSAqIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYmVjYXVzZSBpZiBpdCBoYXMgY2xvc2VkLAorCQkgKiBpdCB3aWxsIGJlIGRldGVjdGVkIGluIHRoZSBub3JtYWwgd2F5IGJ5IHNvcmVhZCgpCisJCSAqLworCQlzYmFwcGVuZHNiKCZzby0+c29fcmN2LCBtKTsKKwl9IGVsc2UgaWYgKHJldCAhPSBtLT5tX2xlbikgeworCQkvKgorCQkgKiBTb21ldGhpbmcgd2FzIHdyaXR0ZW4sIGJ1dCBub3QgZXZlcnl0aGluZy4uCisJCSAqIHNiYXBwZW5kc2IgdGhlIHJlc3QKKwkJICovCisJCW0tPm1fbGVuIC09IHJldDsKKwkJbS0+bV9kYXRhICs9IHJldDsKKwkJc2JhcHBlbmRzYigmc28tPnNvX3JjdiwgbSk7CisJfSAvKiBlbHNlICovCisJLyogV2hhdGV2ZXIgaGFwcGVuZWQsIHdlIGZyZWUgdGhlIG1idWYgKi8KKwltX2ZyZWUobSk7Cit9CisKKy8qCisgKiBDb3B5IHRoZSBkYXRhIGZyb20gbSBpbnRvIHNiCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tCisgKi8KK3N0YXRpYyB2b2lkCitzYmFwcGVuZHNiKHN0cnVjdCBzYnVmICpzYiwgc3RydWN0IG1idWYgKm0pCit7CisJaW50IGxlbiwgbiwgIG5uOworCisJbGVuID0gbS0+bV9sZW47CisKKwlpZiAoc2ItPnNiX3dwdHIgPCBzYi0+c2JfcnB0cikgeworCQluID0gc2ItPnNiX3JwdHIgLSBzYi0+c2Jfd3B0cjsKKwkJaWYgKG4gPiBsZW4pIG4gPSBsZW47CisJCW1lbWNweShzYi0+c2Jfd3B0ciwgbS0+bV9kYXRhLCBuKTsKKwl9IGVsc2UgeworCQkvKiBEbyB0aGUgcmlnaHQgZWRnZSBmaXJzdCAqLworCQluID0gc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbiAtIHNiLT5zYl93cHRyOworCQlpZiAobiA+IGxlbikgbiA9IGxlbjsKKwkJbWVtY3B5KHNiLT5zYl93cHRyLCBtLT5tX2RhdGEsIG4pOworCQlsZW4gLT0gbjsKKwkJaWYgKGxlbikgeworCQkJLyogTm93IHRoZSBsZWZ0IGVkZ2UgKi8KKwkJCW5uID0gc2ItPnNiX3JwdHIgLSBzYi0+c2JfZGF0YTsKKwkJCWlmIChubiA+IGxlbikgbm4gPSBsZW47CisJCQltZW1jcHkoc2ItPnNiX2RhdGEsbS0+bV9kYXRhK24sbm4pOworCQkJbiArPSBubjsKKwkJfQorCX0KKworCXNiLT5zYl9jYyArPSBuOworCXNiLT5zYl93cHRyICs9IG47CisJaWYgKHNiLT5zYl93cHRyID49IHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pCisJCXNiLT5zYl93cHRyIC09IHNiLT5zYl9kYXRhbGVuOworfQorCisvKgorICogQ29weSBkYXRhIGZyb20gc2J1ZiB0byBhIG5vcm1hbCwgc3RyYWlnaHQgYnVmZmVyCisgKiBEb24ndCB1cGRhdGUgdGhlIHNidWYgcnB0ciwgdGhpcyB3aWxsIGJlCisgKiBkb25lIGluIHNiZHJvcCB3aGVuIHRoZSBkYXRhIGlzIGFja2VkCisgKi8KK3ZvaWQKK3NiY29weShzdHJ1Y3Qgc2J1ZiAqc2IsIGludCBvZmYsIGludCBsZW4sIGNoYXIgKnRvKQoreworCWNoYXIgKmZyb207CisKKwlmcm9tID0gc2ItPnNiX3JwdHIgKyBvZmY7CisJaWYgKGZyb20gPj0gc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikKKwkJZnJvbSAtPSBzYi0+c2JfZGF0YWxlbjsKKworCWlmIChmcm9tIDwgc2ItPnNiX3dwdHIpIHsKKwkJaWYgKGxlbiA+IHNiLT5zYl9jYykgbGVuID0gc2ItPnNiX2NjOworCQltZW1jcHkodG8sZnJvbSxsZW4pOworCX0gZWxzZSB7CisJCS8qIHJlLXVzZSBvZmYgKi8KKwkJb2ZmID0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pIC0gZnJvbTsKKwkJaWYgKG9mZiA+IGxlbikgb2ZmID0gbGVuOworCQltZW1jcHkodG8sZnJvbSxvZmYpOworCQlsZW4gLT0gb2ZmOworCQlpZiAobGVuKQorCQkgICBtZW1jcHkodG8rb2ZmLHNiLT5zYl9kYXRhLGxlbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zYnVmLmggYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3NidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGYxMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zYnVmLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaWZuZGVmIF9TQlVGX0hfCisjZGVmaW5lIF9TQlVGX0hfCisKKyNkZWZpbmUgc2JmbHVzaChzYikgc2Jkcm9wKChzYiksKHNiKS0+c2JfY2MpCisjZGVmaW5lIHNic3BhY2Uoc2IpICgoc2IpLT5zYl9kYXRhbGVuIC0gKHNiKS0+c2JfY2MpCisKK3N0cnVjdCBzYnVmIHsKKwl1X2ludAlzYl9jYzsJCS8qIGFjdHVhbCBjaGFycyBpbiBidWZmZXIgKi8KKwl1X2ludAlzYl9kYXRhbGVuOwkvKiBMZW5ndGggb2YgZGF0YSAgKi8KKwljaGFyCSpzYl93cHRyOwkvKiB3cml0ZSBwb2ludGVyLiBwb2ludHMgdG8gd2hlcmUgdGhlIG5leHQKKwkJCQkgKiBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBpbiB0aGUgc2J1ZiAqLworCWNoYXIJKnNiX3JwdHI7CS8qIHJlYWQgcG9pbnRlci4gcG9pbnRzIHRvIHdoZXJlIHRoZSBuZXh0CisJCQkJICogYnl0ZSBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBzYnVmICovCisJY2hhcgkqc2JfZGF0YTsJLyogQWN0dWFsIGRhdGEgKi8KK307CisKK3ZvaWQgc2JmcmVlIF9QKChzdHJ1Y3Qgc2J1ZiAqKSk7Cit2b2lkIHNiZHJvcCBfUCgoc3RydWN0IHNidWYgKiwgaW50KSk7Cit2b2lkIHNicmVzZXJ2ZSBfUCgoc3RydWN0IHNidWYgKiwgaW50KSk7Cit2b2lkIHNiYXBwZW5kIF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtYnVmICopKTsKK3ZvaWQgc2Jjb3B5IF9QKChzdHJ1Y3Qgc2J1ZiAqLCBpbnQsIGludCwgY2hhciAqKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zbGlycC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zbGlycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTg0M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3NsaXJwLmMKQEAgLTAsMCArMSwxMDg2IEBACisvKgorICogbGlic2xpcnAgZ2x1ZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJzbGlycC5oIgorI2luY2x1ZGUgImh3L2h3LmgiCisKKy8qIGhvc3QgYWRkcmVzcyAqLworc3RydWN0IGluX2FkZHIgb3VyX2FkZHI7CisvKiBob3N0IGRucyBhZGRyZXNzICovCitzdHJ1Y3QgaW5fYWRkciBkbnNfYWRkcjsKKy8qIGhvc3QgbG9vcGJhY2sgYWRkcmVzcyAqLworc3RydWN0IGluX2FkZHIgbG9vcGJhY2tfYWRkcjsKKworLyogYWRkcmVzcyBmb3Igc2xpcnAgdmlydHVhbCBhZGRyZXNzZXMgKi8KK3N0cnVjdCBpbl9hZGRyIHNwZWNpYWxfYWRkcjsKKy8qIHZpcnR1YWwgYWRkcmVzcyBhbGlhcyBmb3IgaG9zdCAqLworc3RydWN0IGluX2FkZHIgYWxpYXNfYWRkcjsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3BlY2lhbF9ldGhhZGRyWzZdID0geworICAgIDB4NTIsIDB4NTQsIDB4MDAsIDB4MTIsIDB4MzUsIDB4MDAKK307CisKKy8qIEFSUCBjYWNoZSBmb3IgdGhlIGd1ZXN0IElQIGFkZHJlc3NlcyAoWFhYOiBhbGxvdyBtYW55IGVudHJpZXMpICovCit1aW50OF90IGNsaWVudF9ldGhhZGRyWzZdOworc3RhdGljIHN0cnVjdCBpbl9hZGRyIGNsaWVudF9pcGFkZHI7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHplcm9fZXRoYWRkcls2XSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworCitjb25zdCBjaGFyICpzbGlycF9zcGVjaWFsX2lwID0gQ1RMX1NQRUNJQUw7CitpbnQgc2xpcnBfcmVzdHJpY3Q7CitzdGF0aWMgaW50IGRvX3Nsb3d0aW1vOworaW50IGxpbmtfdXA7CitzdHJ1Y3QgdGltZXZhbCB0dDsKK0ZJTEUgKmxmZDsKK3N0cnVjdCBleF9saXN0ICpleGVjX2xpc3Q7CisKKy8qIFhYWDogc3VwcHJlc3MgdGhvc2Ugc2VsZWN0IGdsb2JhbHMgKi8KK2ZkX3NldCAqZ2xvYmFsX3JlYWRmZHMsICpnbG9iYWxfd3JpdGVmZHMsICpnbG9iYWxfeGZkczsKKworY2hhciBzbGlycF9ob3N0bmFtZVszM107CisKKyNpZmRlZiBfV0lOMzIKKworc3RhdGljIGludCBnZXRfZG5zX2FkZHIoc3RydWN0IGluX2FkZHIgKnBkbnNfYWRkcikKK3sKKyAgICBGSVhFRF9JTkZPICpGaXhlZEluZm89TlVMTDsKKyAgICBVTE9ORyAgICBCdWZMZW47CisgICAgRFdPUkQgICAgcmV0OworICAgIElQX0FERFJfU1RSSU5HICpwSVBBZGRyOworICAgIHN0cnVjdCBpbl9hZGRyIHRtcF9hZGRyOworCisgICAgRml4ZWRJbmZvID0gKEZJWEVEX0lORk8gKilHbG9iYWxBbGxvYyhHUFRSLCBzaXplb2YoRklYRURfSU5GTykpOworICAgIEJ1ZkxlbiA9IHNpemVvZihGSVhFRF9JTkZPKTsKKworICAgIGlmIChFUlJPUl9CVUZGRVJfT1ZFUkZMT1cgPT0gR2V0TmV0d29ya1BhcmFtcyhGaXhlZEluZm8sICZCdWZMZW4pKSB7CisgICAgICAgIGlmIChGaXhlZEluZm8pIHsKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoRml4ZWRJbmZvKTsKKyAgICAgICAgICAgIEZpeGVkSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgRml4ZWRJbmZvID0gR2xvYmFsQWxsb2MoR1BUUiwgQnVmTGVuKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IEdldE5ldHdvcmtQYXJhbXMoRml4ZWRJbmZvLCAmQnVmTGVuKSkgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBwcmludGYoIkdldE5ldHdvcmtQYXJhbXMgZmFpbGVkLiByZXQgPSAlMDh4XG4iLCAodV9pbnQpcmV0ICk7CisgICAgICAgIGlmIChGaXhlZEluZm8pIHsKKyAgICAgICAgICAgIEdsb2JhbEZyZWUoRml4ZWRJbmZvKTsKKyAgICAgICAgICAgIEZpeGVkSW5mbyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBJUEFkZHIgPSAmKEZpeGVkSW5mby0+RG5zU2VydmVyTGlzdCk7CisgICAgaW5ldF9hdG9uKHBJUEFkZHItPklwQWRkcmVzcy5TdHJpbmcsICZ0bXBfYWRkcik7CisgICAgKnBkbnNfYWRkciA9IHRtcF9hZGRyOworI2lmIDAKKyAgICBwcmludGYoICJETlMgU2VydmVyczpcbiIgKTsKKyAgICBwcmludGYoICJETlMgQWRkcjolc1xuIiwgcElQQWRkci0+SXBBZGRyZXNzLlN0cmluZyApOworCisgICAgcElQQWRkciA9IEZpeGVkSW5mbyAtPiBEbnNTZXJ2ZXJMaXN0Lk5leHQ7CisgICAgd2hpbGUgKCBwSVBBZGRyICkgeworICAgICAgICAgICAgcHJpbnRmKCAiRE5TIEFkZHI6JXNcbiIsIHBJUEFkZHIgLT5JcEFkZHJlc3MuU3RyaW5nICk7CisgICAgICAgICAgICBwSVBBZGRyID0gcElQQWRkciAtPk5leHQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKEZpeGVkSW5mbykgeworICAgICAgICBHbG9iYWxGcmVlKEZpeGVkSW5mbyk7CisgICAgICAgIEZpeGVkSW5mbyA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IGdldF9kbnNfYWRkcihzdHJ1Y3QgaW5fYWRkciAqcGRuc19hZGRyKQoreworICAgIGNoYXIgYnVmZls1MTJdOworICAgIGNoYXIgYnVmZjJbMjU3XTsKKyAgICBGSUxFICpmOworICAgIGludCBmb3VuZCA9IDA7CisgICAgc3RydWN0IGluX2FkZHIgdG1wX2FkZHI7CisKKyAgICBmID0gZm9wZW4oIi9ldGMvcmVzb2x2LmNvbmYiLCAiciIpOworICAgIGlmICghZikKKyAgICAgICAgcmV0dXJuIC0xOworCisjaWZkZWYgREVCVUcKKyAgICBscHJpbnQoIklQIGFkZHJlc3Mgb2YgeW91ciBETlMocyk6ICIpOworI2VuZGlmCisgICAgd2hpbGUgKGZnZXRzKGJ1ZmYsIDUxMiwgZikgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3NjYW5mKGJ1ZmYsICJuYW1lc2VydmVyJSpbIFx0XSUyNTZzIiwgYnVmZjIpID09IDEpIHsKKyAgICAgICAgICAgIGlmICghaW5ldF9hdG9uKGJ1ZmYyLCAmdG1wX2FkZHIpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHRtcF9hZGRyLnNfYWRkciA9PSBsb29wYmFja19hZGRyLnNfYWRkcikKKyAgICAgICAgICAgICAgICB0bXBfYWRkciA9IG91cl9hZGRyOworICAgICAgICAgICAgLyogSWYgaXQncyB0aGUgZmlyc3Qgb25lLCBzZXQgaXQgdG8gZG5zX2FkZHIgKi8KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAgKnBkbnNfYWRkciA9IHRtcF9hZGRyOworI2lmZGVmIERFQlVHCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbHByaW50KCIsICIpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoKytmb3VuZCA+IDMpIHsKKyNpZmRlZiBERUJVRworICAgICAgICAgICAgICAgIGxwcmludCgiKG1vcmUpIik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBERUJVRworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxwcmludCgiJXMiLCBpbmV0X250b2EodG1wX2FkZHIpKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShmKTsKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCitzdGF0aWMgdm9pZCBzbGlycF9jbGVhbnVwKHZvaWQpCit7CisgICAgV1NBQ2xlYW51cCgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNsaXJwX3N0YXRlX3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSk7CitzdGF0aWMgaW50IHNsaXJwX3N0YXRlX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpOworCit2b2lkIHNsaXJwX2luaXQoaW50IHJlc3RyaWN0ZWQsIGNvbnN0IGNoYXIgKnNwZWNpYWxfaXApCit7CisgICAgLy8gICAgZGVidWdfaW5pdCgiL3RtcC9zbGlycC5sb2ciLCBERUJVR19ERUZBVUxUKTsKKworI2lmZGVmIF9XSU4zMgorICAgIHsKKyAgICAgICAgV1NBREFUQSBEYXRhOworICAgICAgICBXU0FTdGFydHVwKE1BS0VXT1JEKDIsMCksICZEYXRhKTsKKwlhdGV4aXQoc2xpcnBfY2xlYW51cCk7CisgICAgfQorI2VuZGlmCisKKyAgICBsaW5rX3VwID0gMTsKKyAgICBzbGlycF9yZXN0cmljdCA9IHJlc3RyaWN0ZWQ7CisKKyAgICBpZl9pbml0KCk7CisgICAgaXBfaW5pdCgpOworCisgICAgLyogSW5pdGlhbGlzZSBtYnVmcyAqYWZ0ZXIqIHNldHRpbmcgdGhlIE1UVSAqLworICAgIG1faW5pdCgpOworCisgICAgLyogc2V0IGRlZmF1bHQgYWRkcmVzc2VzICovCisgICAgaW5ldF9hdG9uKCIxMjcuMC4wLjEiLCAmbG9vcGJhY2tfYWRkcik7CisKKyAgICBpZiAoZ2V0X2Ruc19hZGRyKCZkbnNfYWRkcikgPCAwKSB7CisgICAgICAgIGRuc19hZGRyID0gbG9vcGJhY2tfYWRkcjsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiV2FybmluZzogTm8gRE5TIHNlcnZlcnMgZm91bmRcbiIpOworICAgIH0KKworICAgIGlmIChzcGVjaWFsX2lwKQorICAgICAgICBzbGlycF9zcGVjaWFsX2lwID0gc3BlY2lhbF9pcDsKKworICAgIGluZXRfYXRvbihzbGlycF9zcGVjaWFsX2lwLCAmc3BlY2lhbF9hZGRyKTsKKyAgICBhbGlhc19hZGRyLnNfYWRkciA9IHNwZWNpYWxfYWRkci5zX2FkZHIgfCBodG9ubChDVExfQUxJQVMpOworICAgIGdldG91cmFkZHIoKTsKKyAgICByZWdpc3Rlcl9zYXZldm0oInNsaXJwIiwgMCwgMSwgc2xpcnBfc3RhdGVfc2F2ZSwgc2xpcnBfc3RhdGVfbG9hZCwgTlVMTCk7Cit9CisKKyNkZWZpbmUgQ09OTl9DQU5GU0VORChzbykgKCgoc28pLT5zb19zdGF0ZSAmIChTU19GQ0FOVFNFTkRNT1JFfFNTX0lTRkNPTk5FQ1RFRCkpID09IFNTX0lTRkNPTk5FQ1RFRCkKKyNkZWZpbmUgQ09OTl9DQU5GUkNWKHNvKSAoKChzbyktPnNvX3N0YXRlICYgKFNTX0ZDQU5UUkNWTU9SRXxTU19JU0ZDT05ORUNURUQpKSA9PSBTU19JU0ZDT05ORUNURUQpCisjZGVmaW5lIFVQRF9ORkRTKHgpIGlmIChuZmRzIDwgKHgpKSBuZmRzID0gKHgpCisKKy8qCisgKiBjdXJ0aW1lIGtlcHQgdG8gYW4gYWNjdXJhY3kgb2YgMW1zCisgKi8KKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkIHVwZHRpbWUodm9pZCkKK3sKKyAgICBzdHJ1Y3QgX3RpbWViIHRiOworCisgICAgX2Z0aW1lKCZ0Yik7CisgICAgY3VydGltZSA9ICh1X2ludCl0Yi50aW1lICogKHVfaW50KTEwMDA7CisgICAgY3VydGltZSArPSAodV9pbnQpdGIubWlsbGl0bTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB1cGR0aW1lKHZvaWQpCit7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHQsIE5VTEwpOworCisJY3VydGltZSA9ICh1X2ludCl0dC50dl9zZWMgKiAodV9pbnQpMTAwMDsKKwljdXJ0aW1lICs9ICh1X2ludCl0dC50dl91c2VjIC8gKHVfaW50KTEwMDA7CisKKwlpZiAoKHR0LnR2X3VzZWMgJSAxMDAwKSA+PSA1MDApCisJICAgY3VydGltZSsrOworfQorI2VuZGlmCisKK3ZvaWQgc2xpcnBfc2VsZWN0X2ZpbGwoaW50ICpwbmZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgZmRfc2V0ICpyZWFkZmRzLCBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKnhmZHMpCit7CisgICAgc3RydWN0IHNvY2tldCAqc28sICpzb19uZXh0OworICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisgICAgaW50IG5mZHM7CisgICAgaW50IHRtcF90aW1lOworCisgICAgLyogZmFpbCBzYWZlICovCisgICAgZ2xvYmFsX3JlYWRmZHMgPSBOVUxMOworICAgIGdsb2JhbF93cml0ZWZkcyA9IE5VTEw7CisgICAgZ2xvYmFsX3hmZHMgPSBOVUxMOworCisgICAgbmZkcyA9ICpwbmZkczsKKwkvKgorCSAqIEZpcnN0LCBUQ1Agc29ja2V0cworCSAqLworCWRvX3Nsb3d0aW1vID0gMDsKKwlpZiAobGlua191cCkgeworCQkvKgorCQkgKiAqX3Nsb3d0aW1vIG5lZWRzIGNhbGxpbmcgaWYgdGhlcmUgYXJlIElQIGZyYWdtZW50cworCQkgKiBpbiB0aGUgZnJhZ21lbnQgcXVldWUsIG9yIHRoZXJlIGFyZSBUQ1AgY29ubmVjdGlvbnMgYWN0aXZlCisJCSAqLworCQlkb19zbG93dGltbyA9ICgodGNiLnNvX25leHQgIT0gJnRjYikgfHwKKyAgICAgICAgICAgICAgICAoJmlwcS5pcF9saW5rICE9IGlwcS5pcF9saW5rLm5leHQpKTsKKworCQlmb3IgKHNvID0gdGNiLnNvX25leHQ7IHNvICE9ICZ0Y2I7IHNvID0gc29fbmV4dCkgeworCQkJc29fbmV4dCA9IHNvLT5zb19uZXh0OworCisJCQkvKgorCQkJICogU2VlIGlmIHdlIG5lZWQgYSB0Y3BfZmFzdHRpbW8KKwkJCSAqLworCQkJaWYgKHRpbWVfZmFzdHRpbW8gPT0gMCAmJiBzby0+c29fdGNwY2ItPnRfZmxhZ3MgJiBURl9ERUxBQ0spCisJCQkgICB0aW1lX2Zhc3R0aW1vID0gY3VydGltZTsgLyogRmxhZyB3aGVuIHdlIHdhbnQgYSBmYXN0dGltbyAqLworCisJCQkvKgorCQkJICogTk9GRFJFRiBjYW4gaW5jbHVkZSBzdGlsbCBjb25uZWN0aW5nIHRvIGxvY2FsLWhvc3QsCisJCQkgKiBuZXdseSBzb2NyZWF0ZWQoKSBzb2NrZXRzIGV0Yy4gRG9uJ3Qgd2FudCB0byBzZWxlY3QgdGhlc2UuCisJIAkJICovCisJCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfTk9GRFJFRiB8fCBzby0+cyA9PSAtMSkKKwkJCSAgIGNvbnRpbnVlOworCisJCQkvKgorCQkJICogU2V0IGZvciByZWFkaW5nIHNvY2tldHMgd2hpY2ggYXJlIGFjY2VwdGluZworCQkJICovCisJCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfRkFDQ0VQVENPTk4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRfU0VUKHNvLT5zLCByZWFkZmRzKTsKKwkJCQlVUERfTkZEUyhzby0+cyk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZXQgZm9yIHdyaXRpbmcgc29ja2V0cyB3aGljaCBhcmUgY29ubmVjdGluZworCQkJICovCisJCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfSVNGQ09OTkVDVElORykgeworCQkJCUZEX1NFVChzby0+cywgd3JpdGVmZHMpOworCQkJCVVQRF9ORkRTKHNvLT5zKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFNldCBmb3Igd3JpdGluZyBpZiB3ZSBhcmUgY29ubmVjdGVkLCBjYW4gc2VuZCBtb3JlLCBhbmQKKwkJCSAqIHdlIGhhdmUgc29tZXRoaW5nIHRvIHNlbmQKKwkJCSAqLworCQkJaWYgKENPTk5fQ0FORlNFTkQoc28pICYmIHNvLT5zb19yY3Yuc2JfY2MpIHsKKwkJCQlGRF9TRVQoc28tPnMsIHdyaXRlZmRzKTsKKwkJCQlVUERfTkZEUyhzby0+cyk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBTZXQgZm9yIHJlYWRpbmcgKGFuZCB1cmdlbnQgZGF0YSkgaWYgd2UgYXJlIGNvbm5lY3RlZCwgY2FuCisJCQkgKiByZWNlaXZlIG1vcmUsIGFuZCB3ZSBoYXZlIHJvb20gZm9yIGl0IFhYWCAvMiA/CisJCQkgKi8KKwkJCWlmIChDT05OX0NBTkZSQ1Yoc28pICYmIChzby0+c29fc25kLnNiX2NjIDwgKHNvLT5zb19zbmQuc2JfZGF0YWxlbi8yKSkpIHsKKwkJCQlGRF9TRVQoc28tPnMsIHJlYWRmZHMpOworCQkJCUZEX1NFVChzby0+cywgeGZkcyk7CisJCQkJVVBEX05GRFMoc28tPnMpOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVURQIHNvY2tldHMKKwkJICovCisJCWZvciAoc28gPSB1ZGIuc29fbmV4dDsgc28gIT0gJnVkYjsgc28gPSBzb19uZXh0KSB7CisJCQlzb19uZXh0ID0gc28tPnNvX25leHQ7CisKKwkJCS8qCisJCQkgKiBTZWUgaWYgaXQncyB0aW1lZCBvdXQKKwkJCSAqLworCQkJaWYgKHNvLT5zb19leHBpcmUpIHsKKwkJCQlpZiAoc28tPnNvX2V4cGlyZSA8PSBjdXJ0aW1lKSB7CisJCQkJCXVkcF9kZXRhY2goc28pOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UKKwkJCQkJZG9fc2xvd3RpbW8gPSAxOyAvKiBMZXQgc29ja2V0IGV4cGlyZSAqLworCQkJfQorCisJCQkvKgorCQkJICogV2hlbiBVRFAgcGFja2V0cyBhcmUgcmVjZWl2ZWQgZnJvbSBvdmVyIHRoZQorCQkJICogbGluaywgdGhleSdyZSBzZW5kdG8oKSdkIHN0cmFpZ2h0IGF3YXksIHNvCisJCQkgKiBubyBuZWVkIGZvciBzZXR0aW5nIGZvciB3cml0aW5nCisJCQkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcXVldWVkIGJ5IHRoaXMgc2Vzc2lvbgorCQkJICogdG8gNC4gIE5vdGUgdGhhdCBldmVuIHRob3VnaCB3ZSB0cnkgYW5kIGxpbWl0IHRoaXMKKwkJCSAqIHRvIDQgcGFja2V0cywgdGhlIHNlc3Npb24gY291bGQgaGF2ZSBtb3JlIHF1ZXVlZAorCQkJICogaWYgdGhlIHBhY2tldHMgbmVlZGVkIHRvIGJlIGZyYWdtZW50ZWQKKwkJCSAqIChYWFggPD0gNCA/KQorCQkJICovCisJCQlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX0lTRkNPTk5FQ1RFRCkgJiYgc28tPnNvX3F1ZXVlZCA8PSA0KSB7CisJCQkJRkRfU0VUKHNvLT5zLCByZWFkZmRzKTsKKwkJCQlVUERfTkZEUyhzby0+cyk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFNldHVwIHRpbWVvdXQgdG8gdXNlIG1pbmltdW0gQ1BVIHVzYWdlLCBlc3BlY2lhbGx5IHdoZW4gaWRsZQorCSAqLworCisJLyoKKwkgKiBGaXJzdCwgc2VlIHRoZSB0aW1lb3V0IG5lZWRlZCBieSAqdGltbworCSAqLworCXRpbWVvdXQudHZfc2VjID0gMDsKKwl0aW1lb3V0LnR2X3VzZWMgPSAtMTsKKwkvKgorCSAqIElmIGEgc2xvd3RpbW8gaXMgbmVlZGVkLCBzZXQgdGltZW91dCB0byA1MDBtcyBmcm9tIHRoZSBsYXN0CisJICogc2xvdyB0aW1lb3V0LiBJZiBhIGZhc3QgdGltZW91dCBpcyBuZWVkZWQsIHNldCB0aW1lb3V0IHdpdGhpbgorCSAqIDIwMG1zIG9mIHdoZW4gaXQgd2FzIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAoZG9fc2xvd3RpbW8pIHsKKwkJLyogWFhYICsgMTAwMDAgYmVjYXVzZSBzb21lIHNlbGVjdCgpJ3MgYXJlbid0IHRoYXQgYWNjdXJhdGUgKi8KKwkJdGltZW91dC50dl91c2VjID0gKCg1MDAgLSAoY3VydGltZSAtIGxhc3Rfc2xvd3RpbW8pKSAqIDEwMDApICsgMTAwMDA7CisJCWlmICh0aW1lb3V0LnR2X3VzZWMgPCAwKQorCQkgICB0aW1lb3V0LnR2X3VzZWMgPSAwOworCQllbHNlIGlmICh0aW1lb3V0LnR2X3VzZWMgPiA1MTAwMDApCisJCSAgIHRpbWVvdXQudHZfdXNlYyA9IDUxMDAwMDsKKworCQkvKiBDYW4gb25seSBmYXN0dGltbyBpZiB3ZSBhbHNvIHNsb3d0aW1vICovCisJCWlmICh0aW1lX2Zhc3R0aW1vKSB7CisJCQl0bXBfdGltZSA9ICgyMDAgLSAoY3VydGltZSAtIHRpbWVfZmFzdHRpbW8pKSAqIDEwMDA7CisJCQlpZiAodG1wX3RpbWUgPCAwKQorCQkJICAgdG1wX3RpbWUgPSAwOworCisJCQkvKiBDaG9vc2UgdGhlIHNtYWxsZXN0IG9mIHRoZSAyICovCisJCQlpZiAodG1wX3RpbWUgPCB0aW1lb3V0LnR2X3VzZWMpCisJCQkgICB0aW1lb3V0LnR2X3VzZWMgPSAodV9pbnQpdG1wX3RpbWU7CisJCX0KKwl9CisgICAgICAgICpwbmZkcyA9IG5mZHM7Cit9CisKK3ZvaWQgc2xpcnBfc2VsZWN0X3BvbGwoZmRfc2V0ICpyZWFkZmRzLCBmZF9zZXQgKndyaXRlZmRzLCBmZF9zZXQgKnhmZHMpCit7CisgICAgc3RydWN0IHNvY2tldCAqc28sICpzb19uZXh0OworICAgIGludCByZXQ7CisKKyAgICBnbG9iYWxfcmVhZGZkcyA9IHJlYWRmZHM7CisgICAgZ2xvYmFsX3dyaXRlZmRzID0gd3JpdGVmZHM7CisgICAgZ2xvYmFsX3hmZHMgPSB4ZmRzOworCisJLyogVXBkYXRlIHRpbWUgKi8KKwl1cGR0aW1lKCk7CisKKwkvKgorCSAqIFNlZSBpZiBhbnl0aGluZyBoYXMgdGltZWQgb3V0CisJICovCisJaWYgKGxpbmtfdXApIHsKKwkJaWYgKHRpbWVfZmFzdHRpbW8gJiYgKChjdXJ0aW1lIC0gdGltZV9mYXN0dGltbykgPj0gMikpIHsKKwkJCXRjcF9mYXN0dGltbygpOworCQkJdGltZV9mYXN0dGltbyA9IDA7CisJCX0KKwkJaWYgKGRvX3Nsb3d0aW1vICYmICgoY3VydGltZSAtIGxhc3Rfc2xvd3RpbW8pID49IDQ5OSkpIHsKKwkJCWlwX3Nsb3d0aW1vKCk7CisJCQl0Y3Bfc2xvd3RpbW8oKTsKKwkJCWxhc3Rfc2xvd3RpbW8gPSBjdXJ0aW1lOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBzb2NrZXRzCisJICovCisJaWYgKGxpbmtfdXApIHsKKwkJLyoKKwkJICogQ2hlY2sgVENQIHNvY2tldHMKKwkJICovCisJCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzb19uZXh0KSB7CisJCQlzb19uZXh0ID0gc28tPnNvX25leHQ7CisKKwkJCS8qCisJCQkgKiBGRF9JU1NFVCBpcyBtZWFuaW5nbGVzcyBvbiB0aGVzZSBzb2NrZXRzCisJCQkgKiAoYW5kIHRoZXkgY2FuIGNyYXNoIHRoZSBwcm9ncmFtKQorCQkJICovCisJCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfTk9GRFJFRiB8fCBzby0+cyA9PSAtMSkKKwkJCSAgIGNvbnRpbnVlOworCisJCQkvKgorCQkJICogQ2hlY2sgZm9yIFVSRyBkYXRhCisJCQkgKiBUaGlzIHdpbGwgc29yZWFkIGFzIHdlbGwsIHNvIG5vIG5lZWQgdG8KKwkJCSAqIHRlc3QgZm9yIHJlYWRmZHMgYmVsb3cgaWYgdGhpcyBzdWNjZWVkcworCQkJICovCisJCQlpZiAoRkRfSVNTRVQoc28tPnMsIHhmZHMpKQorCQkJICAgc29yZWN2b29iKHNvKTsKKwkJCS8qCisJCQkgKiBDaGVjayBzb2NrZXRzIGZvciByZWFkaW5nCisJCQkgKi8KKwkJCWVsc2UgaWYgKEZEX0lTU0VUKHNvLT5zLCByZWFkZmRzKSkgeworCQkJCS8qCisJCQkJICogQ2hlY2sgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zCisJCQkJICovCisJCQkJaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0ZBQ0NFUFRDT05OKSB7CisJCQkJCXRjcF9jb25uZWN0KHNvKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAvKiBlbHNlICovCisJCQkJcmV0ID0gc29yZWFkKHNvKTsKKworCQkJCS8qIE91dHB1dCBpdCBpZiB3ZSByZWFkIHNvbWV0aGluZyAqLworCQkJCWlmIChyZXQgPiAwKQorCQkJCSAgIHRjcF9vdXRwdXQoc290b3RjcGNiKHNvKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDaGVjayBzb2NrZXRzIGZvciB3cml0aW5nCisJCQkgKi8KKwkJCWlmIChGRF9JU1NFVChzby0+cywgd3JpdGVmZHMpKSB7CisJCQkgIC8qCisJCQkgICAqIENoZWNrIGZvciBub24tYmxvY2tpbmcsIHN0aWxsLWNvbm5lY3Rpbmcgc29ja2V0cworCQkJICAgKi8KKwkJCSAgaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0lTRkNPTk5FQ1RJTkcpIHsKKwkJCSAgICAvKiBDb25uZWN0ZWQgKi8KKwkJCSAgICBzby0+c29fc3RhdGUgJj0gflNTX0lTRkNPTk5FQ1RJTkc7CisKKwkJCSAgICByZXQgPSBzZW5kKHNvLT5zLCAoY29uc3Qgdm9pZCAqKSAmcmV0LCAwLCAwKTsKKwkJCSAgICBpZiAocmV0IDwgMCkgeworCQkJICAgICAgLyogWFhYWFggTXVzdCBmaXgsIHplcm8gYnl0ZXMgaXMgYSBOT1AgKi8KKwkJCSAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwKKwkJCQkgIGVycm5vID09IEVJTlBST0dSRVNTIHx8IGVycm5vID09IEVOT1RDT05OKQorCQkJCWNvbnRpbnVlOworCisJCQkgICAgICAvKiBlbHNlIGZhaWxlZCAqLworCQkJICAgICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsKKwkJCSAgICB9CisJCQkgICAgLyogZWxzZSBzby0+c29fc3RhdGUgJj0gflNTX0lTRkNPTk5FQ1RJTkc7ICovCisKKwkJCSAgICAvKgorCQkJICAgICAqIENvbnRpbnVlIHRjcF9pbnB1dAorCQkJICAgICAqLworCQkJICAgIHRjcF9pbnB1dCgoc3RydWN0IG1idWYgKilOVUxMLCBzaXplb2Yoc3RydWN0IGlwKSwgc28pOworCQkJICAgIC8qIGNvbnRpbnVlOyAqLworCQkJICB9IGVsc2UKKwkJCSAgICByZXQgPSBzb3dyaXRlKHNvKTsKKwkJCSAgLyoKKwkJCSAgICogWFhYWFggSWYgd2Ugd3JvdGUgc29tZXRoaW5nIChhIGxvdCksIHRoZXJlCisJCQkgICAqIGNvdWxkIGJlIGEgbmVlZCBmb3IgYSB3aW5kb3cgdXBkYXRlLgorCQkJICAgKiBJbiB0aGUgd29yc3QgY2FzZSwgdGhlIHJlbW90ZSB3aWxsIHNlbmQKKwkJCSAgICogYSB3aW5kb3cgcHJvYmUgdG8gZ2V0IHRoaW5ncyBnb2luZyBhZ2FpbgorCQkJICAgKi8KKwkJCX0KKworCQkJLyoKKwkJCSAqIFByb2JlIGEgc3RpbGwtY29ubmVjdGluZywgbm9uLWJsb2NraW5nIHNvY2tldAorCQkJICogdG8gY2hlY2sgaWYgaXQncyBzdGlsbCBhbGl2ZQorCSAJIAkgKi8KKyNpZmRlZiBQUk9CRV9DT05OCisJCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfSVNGQ09OTkVDVElORykgeworCQkJICByZXQgPSByZWN2KHNvLT5zLCAoY2hhciAqKSZyZXQsIDAsMCk7CisKKwkJCSAgaWYgKHJldCA8IDApIHsKKwkJCSAgICAvKiBYWFggKi8KKwkJCSAgICBpZiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVXT1VMREJMT0NLIHx8CisJCQkJZXJybm8gPT0gRUlOUFJPR1JFU1MgfHwgZXJybm8gPT0gRU5PVENPTk4pCisJCQkgICAgICBjb250aW51ZTsgLyogU3RpbGwgY29ubmVjdGluZywgY29udGludWUgKi8KKworCQkJICAgIC8qIGVsc2UgZmFpbGVkICovCisJCQkgICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsKKworCQkJICAgIC8qIHRjcF9pbnB1dCB3aWxsIHRha2UgY2FyZSBvZiBpdCAqLworCQkJICB9IGVsc2UgeworCQkJICAgIHJldCA9IHNlbmQoc28tPnMsICZyZXQsIDAsMCk7CisJCQkgICAgaWYgKHJldCA8IDApIHsKKwkJCSAgICAgIC8qIFhYWCAqLworCQkJICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFV09VTERCTE9DSyB8fAorCQkJCSAgZXJybm8gPT0gRUlOUFJPR1JFU1MgfHwgZXJybm8gPT0gRU5PVENPTk4pCisJCQkJY29udGludWU7CisJCQkgICAgICAvKiBlbHNlIGZhaWxlZCAqLworCQkJICAgICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsKKwkJCSAgICB9IGVsc2UKKwkJCSAgICAgIHNvLT5zb19zdGF0ZSAmPSB+U1NfSVNGQ09OTkVDVElORzsKKworCQkJICB9CisJCQkgIHRjcF9pbnB1dCgoc3RydWN0IG1idWYgKilOVUxMLCBzaXplb2Yoc3RydWN0IGlwKSxzbyk7CisJCQl9IC8qIFNTX0lTRkNPTk5FQ1RJTkcgKi8KKyNlbmRpZgorCQl9CisKKwkJLyoKKwkJICogTm93IFVEUCBzb2NrZXRzLgorCQkgKiBJbmNvbWluZyBwYWNrZXRzIGFyZSBzZW50IHN0cmFpZ2h0IGF3YXksIHRoZXkncmUgbm90IGJ1ZmZlcmVkLgorCQkgKiBJbmNvbWluZyBVRFAgZGF0YSBpc24ndCBidWZmZXJlZCBlaXRoZXIuCisJCSAqLworCQlmb3IgKHNvID0gdWRiLnNvX25leHQ7IHNvICE9ICZ1ZGI7IHNvID0gc29fbmV4dCkgeworCQkJc29fbmV4dCA9IHNvLT5zb19uZXh0OworCisJCQlpZiAoc28tPnMgIT0gLTEgJiYgRkRfSVNTRVQoc28tPnMsIHJlYWRmZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29yZWN2ZnJvbShzbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCX0KKwl9CisKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gc3RhcnQgb3V0cHV0dGluZworCSAqLworCWlmIChpZl9xdWV1ZWQgJiYgbGlua191cCkKKwkgICBpZl9zdGFydCgpOworCisJLyogY2xlYXIgZ2xvYmFsIGZpbGUgZGVzY3JpcHRvciBzZXRzLgorCSAqIHRoZXNlIHJlc2lkZSBvbiB0aGUgc3RhY2sgaW4gdmwuYworCSAqIHNvIHRoZXkncmUgdW51c2FibGUgaWYgd2UncmUgbm90IGluCisJICogc2xpcnBfc2VsZWN0X2ZpbGwgb3Igc2xpcnBfc2VsZWN0X3BvbGwuCisJICovCisJIGdsb2JhbF9yZWFkZmRzID0gTlVMTDsKKwkgZ2xvYmFsX3dyaXRlZmRzID0gTlVMTDsKKwkgZ2xvYmFsX3hmZHMgPSBOVUxMOworfQorCisjZGVmaW5lIEVUSF9BTEVOIDYKKyNkZWZpbmUgRVRIX0hMRU4gMTQKKworI2RlZmluZSBFVEhfUF9JUAkweDA4MDAJCS8qIEludGVybmV0IFByb3RvY29sIHBhY2tldAkqLworI2RlZmluZSBFVEhfUF9BUlAJMHgwODA2CQkvKiBBZGRyZXNzIFJlc29sdXRpb24gcGFja2V0CSovCisKKyNkZWZpbmUJQVJQT1BfUkVRVUVTVAkxCQkvKiBBUlAgcmVxdWVzdAkJCSovCisjZGVmaW5lCUFSUE9QX1JFUExZCTIJCS8qIEFSUCByZXBseQkJCSovCisKK3N0cnVjdCBldGhoZHIKK3sKKwl1bnNpZ25lZCBjaGFyCWhfZGVzdFtFVEhfQUxFTl07CS8qIGRlc3RpbmF0aW9uIGV0aCBhZGRyCSovCisJdW5zaWduZWQgY2hhcgloX3NvdXJjZVtFVEhfQUxFTl07CS8qIHNvdXJjZSBldGhlciBhZGRyCSovCisJdW5zaWduZWQgc2hvcnQJaF9wcm90bzsJCS8qIHBhY2tldCB0eXBlIElEIGZpZWxkCSovCit9OworCitzdHJ1Y3QgYXJwaGRyCit7CisJdW5zaWduZWQgc2hvcnQJYXJfaHJkOwkJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBzaG9ydAlhcl9wcm87CQkvKiBmb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJYXJfaGxuOwkJLyogbGVuZ3RoIG9mIGhhcmR3YXJlIGFkZHJlc3MJKi8KKwl1bnNpZ25lZCBjaGFyCWFyX3BsbjsJCS8qIGxlbmd0aCBvZiBwcm90b2NvbCBhZGRyZXNzCSovCisJdW5zaWduZWQgc2hvcnQJYXJfb3A7CQkvKiBBUlAgb3Bjb2RlIChjb21tYW5kKQkJKi8KKworCSAvKgorCSAgKgkgRXRoZXJuZXQgbG9va3MgbGlrZSB0aGlzIDogVGhpcyBiaXQgaXMgdmFyaWFibGUgc2l6ZWQgaG93ZXZlci4uLgorCSAgKi8KKwl1bnNpZ25lZCBjaGFyCQlhcl9zaGFbRVRIX0FMRU5dOwkvKiBzZW5kZXIgaGFyZHdhcmUgYWRkcmVzcwkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3NpcFs0XTsJCS8qIHNlbmRlciBJUCBhZGRyZXNzCQkqLworCXVuc2lnbmVkIGNoYXIJCWFyX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzCSovCisJdW5zaWduZWQgY2hhcgkJYXJfdGlwWzRdOwkJLyogdGFyZ2V0IElQIGFkZHJlc3MJCSovCit9OworCitzdGF0aWMgdm9pZCBhcnBfaW5wdXQoY29uc3QgdWludDhfdCAqcGt0LCBpbnQgcGt0X2xlbikKK3sKKyAgICBzdHJ1Y3QgZXRoaGRyICplaCA9IChzdHJ1Y3QgZXRoaGRyICopcGt0OworICAgIHN0cnVjdCBhcnBoZHIgKmFoID0gKHN0cnVjdCBhcnBoZHIgKikocGt0ICsgRVRIX0hMRU4pOworICAgIHVpbnQ4X3QgYXJwX3JlcGx5W0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpXTsKKyAgICBzdHJ1Y3QgZXRoaGRyICpyZWggPSAoc3RydWN0IGV0aGhkciAqKWFycF9yZXBseTsKKyAgICBzdHJ1Y3QgYXJwaGRyICpyYWggPSAoc3RydWN0IGFycGhkciAqKShhcnBfcmVwbHkgKyBFVEhfSExFTik7CisgICAgaW50IGFyX29wOworICAgIHN0cnVjdCBleF9saXN0ICpleF9wdHI7CisKKyAgICBhcl9vcCA9IG50b2hzKGFoLT5hcl9vcCk7CisgICAgc3dpdGNoKGFyX29wKSB7CisgICAgY2FzZSBBUlBPUF9SRVFVRVNUOgorICAgICAgICBpZiAoIW1lbWNtcChhaC0+YXJfdGlwLCAmc3BlY2lhbF9hZGRyLCAzKSkgeworICAgICAgICAgICAgaWYgKGFoLT5hcl90aXBbM10gPT0gQ1RMX0ROUyB8fCBhaC0+YXJfdGlwWzNdID09IENUTF9BTElBUykKKyAgICAgICAgICAgICAgICBnb3RvIGFycF9vazsKKyAgICAgICAgICAgIGZvciAoZXhfcHRyID0gZXhlY19saXN0OyBleF9wdHI7IGV4X3B0ciA9IGV4X3B0ci0+ZXhfbmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChleF9wdHItPmV4X2FkZHIgPT0gYWgtPmFyX3RpcFszXSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBhcnBfb2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGFycF9vazoKKyAgICAgICAgICAgIC8qIFhYWDogbWFrZSBhbiBBUlAgcmVxdWVzdCB0byBoYXZlIHRoZSBjbGllbnQgYWRkcmVzcyAqLworICAgICAgICAgICAgbWVtY3B5KGNsaWVudF9ldGhhZGRyLCBlaC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKKworICAgICAgICAgICAgLyogQVJQIHJlcXVlc3QgZm9yIGFsaWFzL2RucyBtYWMgYWRkcmVzcyAqLworICAgICAgICAgICAgbWVtY3B5KHJlaC0+aF9kZXN0LCBwa3QgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOworICAgICAgICAgICAgbWVtY3B5KHJlaC0+aF9zb3VyY2UsIHNwZWNpYWxfZXRoYWRkciwgRVRIX0FMRU4gLSAxKTsKKyAgICAgICAgICAgIHJlaC0+aF9zb3VyY2VbNV0gPSBhaC0+YXJfdGlwWzNdOworICAgICAgICAgICAgcmVoLT5oX3Byb3RvID0gaHRvbnMoRVRIX1BfQVJQKTsKKworICAgICAgICAgICAgcmFoLT5hcl9ocmQgPSBodG9ucygxKTsKKyAgICAgICAgICAgIHJhaC0+YXJfcHJvID0gaHRvbnMoRVRIX1BfSVApOworICAgICAgICAgICAgcmFoLT5hcl9obG4gPSBFVEhfQUxFTjsKKyAgICAgICAgICAgIHJhaC0+YXJfcGxuID0gNDsKKyAgICAgICAgICAgIHJhaC0+YXJfb3AgPSBodG9ucyhBUlBPUF9SRVBMWSk7CisgICAgICAgICAgICBtZW1jcHkocmFoLT5hcl9zaGEsIHJlaC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgIG1lbWNweShyYWgtPmFyX3NpcCwgYWgtPmFyX3RpcCwgNCk7CisgICAgICAgICAgICBtZW1jcHkocmFoLT5hcl90aGEsIGFoLT5hcl9zaGEsIEVUSF9BTEVOKTsKKyAgICAgICAgICAgIG1lbWNweShyYWgtPmFyX3RpcCwgYWgtPmFyX3NpcCwgNCk7CisgICAgICAgICAgICBzbGlycF9vdXRwdXQoYXJwX3JlcGx5LCBzaXplb2YoYXJwX3JlcGx5KSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUlBPUF9SRVBMWToKKyAgICAgICAgLyogcmVwbHkgdG8gcmVxdWVzdCBvZiBjbGllbnQgbWFjIGFkZHJlc3MgPyAqLworICAgICAgICBpZiAoIW1lbWNtcChjbGllbnRfZXRoYWRkciwgemVyb19ldGhhZGRyLCBFVEhfQUxFTikgJiYKKyAgICAgICAgICAgICFtZW1jbXAoYWgtPmFyX3NpcCwgJmNsaWVudF9pcGFkZHIuc19hZGRyLCA0KSkgeworICAgICAgICAgICAgbWVtY3B5KGNsaWVudF9ldGhhZGRyLCBhaC0+YXJfc2hhLCBFVEhfQUxFTik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHNsaXJwX2lucHV0KGNvbnN0IHVpbnQ4X3QgKnBrdCwgaW50IHBrdF9sZW4pCit7CisgICAgc3RydWN0IG1idWYgKm07CisgICAgaW50IHByb3RvOworCisgICAgaWYgKHBrdF9sZW4gPCBFVEhfSExFTikKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJvdG8gPSBudG9ocygqKHVpbnQxNl90ICopKHBrdCArIDEyKSk7CisgICAgc3dpdGNoKHByb3RvKSB7CisgICAgY2FzZSBFVEhfUF9BUlA6CisgICAgICAgIGFycF9pbnB1dChwa3QsIHBrdF9sZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVUSF9QX0lQOgorICAgICAgICBtID0gbV9nZXQoKTsKKyAgICAgICAgaWYgKCFtKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKiBOb3RlOiB3ZSBhZGQgdG8gYWxpZ24gdGhlIElQIGhlYWRlciAqLworICAgICAgICBpZiAoTV9GUkVFUk9PTShtKSA8IHBrdF9sZW4gKyAyKSB7CisgICAgICAgICAgICBtX2luYyhtLCBwa3RfbGVuICsgMik7CisgICAgICAgIH0KKyAgICAgICAgbS0+bV9sZW4gPSBwa3RfbGVuICsgMjsKKyAgICAgICAgbWVtY3B5KG0tPm1fZGF0YSArIDIsIHBrdCwgcGt0X2xlbik7CisKKyAgICAgICAgbS0+bV9kYXRhICs9IDIgKyBFVEhfSExFTjsKKyAgICAgICAgbS0+bV9sZW4gLT0gMiArIEVUSF9ITEVOOworCisgICAgICAgIGlwX2lucHV0KG0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIG91dHB1dCB0aGUgSVAgcGFja2V0IHRvIHRoZSBldGhlcm5ldCBkZXZpY2UgKi8KK3ZvaWQgaWZfZW5jYXAoY29uc3QgdWludDhfdCAqaXBfZGF0YSwgaW50IGlwX2RhdGFfbGVuKQoreworICAgIHVpbnQ4X3QgYnVmWzE2MDBdOworICAgIHN0cnVjdCBldGhoZHIgKmVoID0gKHN0cnVjdCBldGhoZHIgKilidWY7CisKKyAgICBpZiAoaXBfZGF0YV9sZW4gKyBFVEhfSExFTiA+IHNpemVvZihidWYpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1lbWNtcChjbGllbnRfZXRoYWRkciwgemVyb19ldGhhZGRyLCBFVEhfQUxFTikpIHsKKyAgICAgICAgdWludDhfdCBhcnBfcmVxW0VUSF9ITEVOICsgc2l6ZW9mKHN0cnVjdCBhcnBoZHIpXTsKKyAgICAgICAgc3RydWN0IGV0aGhkciAqcmVoID0gKHN0cnVjdCBldGhoZHIgKilhcnBfcmVxOworICAgICAgICBzdHJ1Y3QgYXJwaGRyICpyYWggPSAoc3RydWN0IGFycGhkciAqKShhcnBfcmVxICsgRVRIX0hMRU4pOworICAgICAgICBjb25zdCBzdHJ1Y3QgaXAgKmlwaCA9IChjb25zdCBzdHJ1Y3QgaXAgKilpcF9kYXRhOworCisgICAgICAgIC8qIElmIHRoZSBjbGllbnQgYWRkciBpcyBub3Qga25vd24sIHRoZXJlIGlzIG5vIHBvaW50IGluCisgICAgICAgICAgIHNlbmRpbmcgdGhlIHBhY2tldCB0byBpdC4gTm9ybWFsbHkgdGhlIHNlbmRlciBzaG91bGQgaGF2ZQorICAgICAgICAgICBkb25lIGFuIEFSUCByZXF1ZXN0IHRvIGdldCBpdHMgTUFDIGFkZHJlc3MuIEhlcmUgd2UgZG8gaXQKKyAgICAgICAgICAgaW4gcGxhY2Ugb2Ygc2VuZGluZyB0aGUgcGFja2V0IGFuZCB3ZSBob3BlIHRoYXQgdGhlIHNlbmRlcgorICAgICAgICAgICB3aWxsIHJldHJ5IHNlbmRpbmcgaXRzIHBhY2tldC4gKi8KKyAgICAgICAgbWVtc2V0KHJlaC0+aF9kZXN0LCAweGZmLCBFVEhfQUxFTik7CisgICAgICAgIG1lbWNweShyZWgtPmhfc291cmNlLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgIHJlaC0+aF9zb3VyY2VbNV0gPSBDVExfQUxJQVM7CisgICAgICAgIHJlaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0FSUCk7CisgICAgICAgIHJhaC0+YXJfaHJkID0gaHRvbnMoMSk7CisgICAgICAgIHJhaC0+YXJfcHJvID0gaHRvbnMoRVRIX1BfSVApOworICAgICAgICByYWgtPmFyX2hsbiA9IEVUSF9BTEVOOworICAgICAgICByYWgtPmFyX3BsbiA9IDQ7CisgICAgICAgIHJhaC0+YXJfb3AgPSBodG9ucyhBUlBPUF9SRVFVRVNUKTsKKyAgICAgICAgLyogc291cmNlIGh3IGFkZHIgKi8KKyAgICAgICAgbWVtY3B5KHJhaC0+YXJfc2hhLCBzcGVjaWFsX2V0aGFkZHIsIEVUSF9BTEVOIC0gMSk7CisgICAgICAgIHJhaC0+YXJfc2hhWzVdID0gQ1RMX0FMSUFTOworICAgICAgICAvKiBzb3VyY2UgSVAgKi8KKyAgICAgICAgbWVtY3B5KHJhaC0+YXJfc2lwLCAmYWxpYXNfYWRkciwgNCk7CisgICAgICAgIC8qIHRhcmdldCBodyBhZGRyIChub25lKSAqLworICAgICAgICBtZW1zZXQocmFoLT5hcl90aGEsIDAsIEVUSF9BTEVOKTsKKyAgICAgICAgLyogdGFyZ2V0IElQICovCisgICAgICAgIG1lbWNweShyYWgtPmFyX3RpcCwgJmlwaC0+aXBfZHN0LCA0KTsKKyAgICAgICAgY2xpZW50X2lwYWRkciA9IGlwaC0+aXBfZHN0OworICAgICAgICBzbGlycF9vdXRwdXQoYXJwX3JlcSwgc2l6ZW9mKGFycF9yZXEpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkoZWgtPmhfZGVzdCwgY2xpZW50X2V0aGFkZHIsIEVUSF9BTEVOKTsKKyAgICAgICAgbWVtY3B5KGVoLT5oX3NvdXJjZSwgc3BlY2lhbF9ldGhhZGRyLCBFVEhfQUxFTiAtIDEpOworICAgICAgICAvKiBYWFg6IG5vdCBjb3JyZWN0ICovCisgICAgICAgIGVoLT5oX3NvdXJjZVs1XSA9IENUTF9BTElBUzsKKyAgICAgICAgZWgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisgICAgICAgIG1lbWNweShidWYgKyBzaXplb2Yoc3RydWN0IGV0aGhkciksIGlwX2RhdGEsIGlwX2RhdGFfbGVuKTsKKyAgICAgICAgc2xpcnBfb3V0cHV0KGJ1ZiwgaXBfZGF0YV9sZW4gKyBFVEhfSExFTik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfc2xpcnBfcmVkaXJfbG9vcCh2b2lkICgqZnVuYykodm9pZCAqb3BhcXVlLCBpbnQgaXNfdWRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyICpsYWRkciwgdV9pbnQgbHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIgKmZhZGRyLCB1X2ludCBmcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBpc191ZHApCit7CisgICAgc3RydWN0IHNvY2tldCAqaGVhZCA9IChpc191ZHAgPyAmdWRiIDogJnRjYik7CisgICAgc3RydWN0IHNvY2tldCAqc287CisKKyAgICBmb3IgKHNvID0gaGVhZC0+c29fbmV4dDsgc28gIT0gaGVhZDsgc28gPSBzby0+c29fbmV4dCkgeworICAgICAgICBmdW5jKG9wYXF1ZSwgaXNfdWRwLAorICAgICAgICAgICAgICZzby0+c29fbGFkZHIsIG50b2hzKHNvLT5zb19scG9ydCksCisgICAgICAgICAgICAgJnNvLT5zb19mYWRkciwgbnRvaHMoc28tPnNvX2Zwb3J0KSk7CisgICAgfQorfQorCit2b2lkIHNsaXJwX3JlZGlyX2xvb3Aodm9pZCAoKmZ1bmMpKHZvaWQgKm9wYXF1ZSwgaW50IGlzX3VkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fYWRkciAqbGFkZHIsIHVfaW50IGxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyICpmYWRkciwgdV9pbnQgZnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIF9zbGlycF9yZWRpcl9sb29wKGZ1bmMsIG9wYXF1ZSwgMCk7CisgICAgX3NsaXJwX3JlZGlyX2xvb3AoZnVuYywgb3BhcXVlLCAxKTsKK30KKworLyogVW5saXN0ZW5zIGEgcmVkaXJlY3Rpb24KKyAqCisgKiBSZXR1cm4gdmFsdWU6IG51bWJlciBvZiByZWRpcnMgcmVtb3ZlZCAqLworaW50IHNsaXJwX3JlZGlyX3JtKGludCBpc191ZHAsIGludCBob3N0X3BvcnQpCit7CisgICAgc3RydWN0IHNvY2tldCAqc287CisgICAgc3RydWN0IHNvY2tldCAqaGVhZCA9IChpc191ZHAgPyAmdWRiIDogJnRjYik7CisgICAgaW50IGZwb3J0ID0gaHRvbnMoaG9zdF9wb3J0KTsKKyAgICBpbnQgbiA9IDA7CisKKyBsb29wX2FnYWluOgorICAgIGZvciAoc28gPSBoZWFkLT5zb19uZXh0OyBzbyAhPSBoZWFkOyBzbyA9IHNvLT5zb19uZXh0KSB7CisgICAgICAgIGlmIChzby0+c29fZnBvcnQgPT0gZnBvcnQpIHsKKyAgICAgICAgICAgIGNsb3NlKHNvLT5zKTsKKyAgICAgICAgICAgIHNvZnJlZShzbyk7CisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBnb3RvIGxvb3BfYWdhaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworaW50IHNsaXJwX3JlZGlyKGludCBpc191ZHAsIGludCBob3N0X3BvcnQsCisgICAgICAgICAgICAgICAgc3RydWN0IGluX2FkZHIgZ3Vlc3RfYWRkciwgaW50IGd1ZXN0X3BvcnQpCit7CisgICAgaWYgKGlzX3VkcCkgeworICAgICAgICBpZiAoIXVkcF9saXN0ZW4oaHRvbnMoaG9zdF9wb3J0KSwgZ3Vlc3RfYWRkci5zX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICBodG9ucyhndWVzdF9wb3J0KSwgMCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzb2xpc3RlbihodG9ucyhob3N0X3BvcnQpLCBndWVzdF9hZGRyLnNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICBodG9ucyhndWVzdF9wb3J0KSwgMCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgc2xpcnBfYWRkX2V4ZWMoaW50IGRvX3B0eSwgY29uc3Qgdm9pZCAqYXJncywgaW50IGFkZHJfbG93X2J5dGUsCisgICAgICAgICAgICAgICAgICBpbnQgZ3Vlc3RfcG9ydCkKK3sKKyAgICByZXR1cm4gYWRkX2V4ZWMoJmV4ZWNfbGlzdCwgZG9fcHR5LCAoY2hhciAqKWFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGFkZHJfbG93X2J5dGUsIGh0b25zKGd1ZXN0X3BvcnQpKTsKK30KKworc3NpemVfdCBzbGlycF9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlpZiAoc28tPnMgPT0gLTEgJiYgc28tPmV4dHJhKSB7CisJCXFlbXVfY2hyX3dyaXRlKHNvLT5leHRyYSwgYnVmLCBsZW4pOworCQlyZXR1cm4gbGVuOworCX0KKworCXJldHVybiBzZW5kKHNvLT5zLCBidWYsIGxlbiwgZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNvY2tldCAqc2xpcnBfZmluZF9jdGxfc29ja2V0KGludCBhZGRyX2xvd19ieXRlLCBpbnQgZ3Vlc3RfcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKKworCWZvciAoc28gPSB0Y2Iuc29fbmV4dDsgc28gIT0gJnRjYjsgc28gPSBzby0+c29fbmV4dCkgeworCQlpZiAoKHNvLT5zb19mYWRkci5zX2FkZHIgJiBodG9ubCgweGZmZmZmZjAwKSkgPT0KKwkJCQlzcGVjaWFsX2FkZHIuc19hZGRyCisJCQkJJiYgKG50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpICYgMHhmZikgPT0KKwkJCQlhZGRyX2xvd19ieXRlCisJCQkJJiYgaHRvbnMoc28tPnNvX2Zwb3J0KSA9PSBndWVzdF9wb3J0KQorCQkJcmV0dXJuIHNvOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzaXplX3Qgc2xpcnBfc29ja2V0X2Nhbl9yZWN2KGludCBhZGRyX2xvd19ieXRlLCBpbnQgZ3Vlc3RfcG9ydCkKK3sKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdOworCXN0cnVjdCBzb2NrZXQgKnNvOworCisgICAgaWYgKCFsaW5rX3VwKQorICAgICAgICByZXR1cm4gMDsKKworCXNvID0gc2xpcnBfZmluZF9jdGxfc29ja2V0KGFkZHJfbG93X2J5dGUsIGd1ZXN0X3BvcnQpOworCisJaWYgKCFzbyB8fCBzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGKQorCQlyZXR1cm4gMDsKKworCWlmICghQ09OTl9DQU5GUkNWKHNvKSB8fCBzby0+c29fc25kLnNiX2NjID49IChzby0+c29fc25kLnNiX2RhdGFsZW4vMikpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNvcHJlcHJidWYoc28sIGlvdiwgTlVMTCk7Cit9CisKK3ZvaWQgc2xpcnBfc29ja2V0X3JlY3YoaW50IGFkZHJfbG93X2J5dGUsIGludCBndWVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgIGludCBzaXplKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHNvY2tldCAqc28gPSBzbGlycF9maW5kX2N0bF9zb2NrZXQoYWRkcl9sb3dfYnl0ZSwgZ3Vlc3RfcG9ydCk7CisKKyAgICBpZiAoIXNvKQorICAgICAgICByZXR1cm47CisKKyAgICByZXQgPSBzb3JlYWRidWYoc28sIChjb25zdCBjaGFyICopYnVmLCBzaXplKTsKKworICAgIGlmIChyZXQgPiAwKQorICAgICAgICB0Y3Bfb3V0cHV0KHNvdG90Y3BjYihzbykpOworfQorCitzdGF0aWMgdm9pZCBzbGlycF90Y3Bfc2F2ZShRRU1VRmlsZSAqZiwgc3RydWN0IHRjcGNiICp0cCkKK3sKKyAgICBpbnQgaTsKKworICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3N0YXRlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVENQVF9OVElNRVJTOyBpKyspCisgICAgICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3RpbWVyW2ldKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9yeHRzaGlmdCk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfcnh0Y3VyKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9kdXBhY2tzKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHRwLT50X21heHNlZyk7CisgICAgcWVtdV9wdXRfc2J5dGUoZiwgdHAtPnRfZm9yY2UpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgdHAtPnRfZmxhZ3MpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF91bmEpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF9ueHQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF91cCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX3dsMSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX3dsMik7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+aXNzKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5zbmRfd25kKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3Zfd25kKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3Zfbnh0KTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5yY3ZfdXApOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPmlycyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+cmN2X2Fkdik7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX21heCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+c25kX2N3bmQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnNuZF9zc3RocmVzaCk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfaWRsZSk7CisgICAgcWVtdV9wdXRfc2JlMTYoZiwgdHAtPnRfcnR0KTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT50X3J0c2VxKTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9zcnR0KTsKKyAgICBxZW11X3B1dF9zYmUxNihmLCB0cC0+dF9ydHR2YXIpOworICAgIHFlbXVfcHV0X2JlMTYoZiwgdHAtPnRfcnR0bWluKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIHRwLT5tYXhfc25kd25kKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT50X29vYmZsYWdzKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT50X2lvYmMpOworICAgIHFlbXVfcHV0X3NiZTE2KGYsIHRwLT50X3NvZnRlcnJvcik7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB0cC0+c25kX3NjYWxlKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHRwLT5yY3Zfc2NhbGUpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgdHAtPnJlcXVlc3Rfcl9zY2FsZSk7CisgICAgcWVtdV9wdXRfYnl0ZShmLCB0cC0+cmVxdWVzdGVkX3Nfc2NhbGUpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgdHAtPnRzX3JlY2VudCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+dHNfcmVjZW50X2FnZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCB0cC0+bGFzdF9hY2tfc2VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHNsaXJwX3NidWZfc2F2ZShRRU1VRmlsZSAqZiwgc3RydWN0IHNidWYgKnNidWYpCit7CisgICAgdWludDMyX3Qgb2ZmOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBzYnVmLT5zYl9jYyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzYnVmLT5zYl9kYXRhbGVuKTsKKyAgICBvZmYgPSAodWludDMyX3QpKHNidWYtPnNiX3dwdHIgLSBzYnVmLT5zYl9kYXRhKTsKKyAgICBxZW11X3B1dF9zYmUzMihmLCBvZmYpOworICAgIG9mZiA9ICh1aW50MzJfdCkoc2J1Zi0+c2JfcnB0ciAtIHNidWYtPnNiX2RhdGEpOworICAgIHFlbXVfcHV0X3NiZTMyKGYsIG9mZik7CisgICAgcWVtdV9wdXRfYnVmZmVyKGYsICh1bnNpZ25lZCBjaGFyKilzYnVmLT5zYl9kYXRhLCBzYnVmLT5zYl9kYXRhbGVuKTsKK30KKworc3RhdGljIHZvaWQgc2xpcnBfc29ja2V0X3NhdmUoUUVNVUZpbGUgKmYsIHN0cnVjdCBzb2NrZXQgKnNvKQoreworICAgIHFlbXVfcHV0X2JlMzIoZiwgc28tPnNvX3VyZ2MpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgc28tPnNvX2ZhZGRyLnNfYWRkcik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBzby0+c29fbGFkZHIuc19hZGRyKTsKKyAgICBxZW11X3B1dF9iZTE2KGYsIHNvLT5zb19mcG9ydCk7CisgICAgcWVtdV9wdXRfYmUxNihmLCBzby0+c29fbHBvcnQpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgc28tPnNvX2lwdG9zKTsKKyAgICBxZW11X3B1dF9ieXRlKGYsIHNvLT5zb19lbXUpOworICAgIHFlbXVfcHV0X2J5dGUoZiwgc28tPnNvX3R5cGUpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgc28tPnNvX3N0YXRlKTsKKyAgICBzbGlycF9zYnVmX3NhdmUoZiwgJnNvLT5zb19yY3YpOworICAgIHNsaXJwX3NidWZfc2F2ZShmLCAmc28tPnNvX3NuZCk7CisgICAgc2xpcnBfdGNwX3NhdmUoZiwgc28tPnNvX3RjcGNiKTsKK30KKworc3RhdGljIHZvaWQgc2xpcnBfc3RhdGVfc2F2ZShRRU1VRmlsZSAqZiwgdm9pZCAqb3BhcXVlKQoreworICAgIHN0cnVjdCBleF9saXN0ICpleF9wdHI7CisKKyAgICBmb3IgKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpCisgICAgICAgIGlmIChleF9wdHItPmV4X3B0eSA9PSAzKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2V0ICpzbzsKKyAgICAgICAgICAgIHNvID0gc2xpcnBfZmluZF9jdGxfc29ja2V0KGV4X3B0ci0+ZXhfYWRkciwgbnRvaHMoZXhfcHRyLT5leF9mcG9ydCkpOworICAgICAgICAgICAgaWYgKCFzbykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcWVtdV9wdXRfYnl0ZShmLCA0Mik7CisgICAgICAgICAgICBzbGlycF9zb2NrZXRfc2F2ZShmLCBzbyk7CisgICAgICAgIH0KKyAgICBxZW11X3B1dF9ieXRlKGYsIDApOworfQorCitzdGF0aWMgdm9pZCBzbGlycF90Y3BfbG9hZChRRU1VRmlsZSAqZiwgc3RydWN0IHRjcGNiICp0cCkKK3sKKyAgICBpbnQgaTsKKworICAgIHRwLT50X3N0YXRlID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgZm9yIChpID0gMDsgaSA8IFRDUFRfTlRJTUVSUzsgaSsrKQorICAgICAgICB0cC0+dF90aW1lcltpXSA9IHFlbXVfZ2V0X3NiZTE2KGYpOworICAgIHRwLT50X3J4dHNoaWZ0ID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfcnh0Y3VyID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfZHVwYWNrcyA9IHFlbXVfZ2V0X3NiZTE2KGYpOworICAgIHRwLT50X21heHNlZyA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgdHAtPnRfZm9yY2UgPSBxZW11X2dldF9zYnl0ZShmKTsKKyAgICB0cC0+dF9mbGFncyA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgdHAtPnNuZF91bmEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfbnh0ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX3VwID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX3dsMSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnNuZF93bDIgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5pc3MgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5zbmRfd25kID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+cmN2X3duZCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnJjdl9ueHQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5yY3ZfdXAgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5pcnMgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT5yY3ZfYWR2ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX21heCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPnNuZF9jd25kID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+c25kX3NzdGhyZXNoID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+dF9pZGxlID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfcnR0ID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnRfcnRzZXEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRwLT50X3NydHQgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9ydHR2YXIgPSBxZW11X2dldF9zYmUxNihmKTsKKyAgICB0cC0+dF9ydHRtaW4gPSBxZW11X2dldF9iZTE2KGYpOworICAgIHRwLT5tYXhfc25kd25kID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+dF9vb2JmbGFncyA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgdHAtPnRfaW9iYyA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgdHAtPnRfc29mdGVycm9yID0gcWVtdV9nZXRfc2JlMTYoZik7CisgICAgdHAtPnNuZF9zY2FsZSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgdHAtPnJjdl9zY2FsZSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgdHAtPnJlcXVlc3Rfcl9zY2FsZSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgdHAtPnJlcXVlc3RlZF9zX3NjYWxlID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICB0cC0+dHNfcmVjZW50ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB0cC0+dHNfcmVjZW50X2FnZSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgdHAtPmxhc3RfYWNrX3NlbnQgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHRjcF90ZW1wbGF0ZSh0cCk7Cit9CisKK3N0YXRpYyBpbnQgc2xpcnBfc2J1Zl9sb2FkKFFFTVVGaWxlICpmLCBzdHJ1Y3Qgc2J1ZiAqc2J1ZikKK3sKKyAgICB1aW50MzJfdCBvZmYsIHNiX2NjLCBzYl9kYXRhbGVuOworCisgICAgc2JfY2MgPSBxZW11X2dldF9iZTMyKGYpOworICAgIHNiX2RhdGFsZW4gPSBxZW11X2dldF9iZTMyKGYpOworCisgICAgc2JyZXNlcnZlKHNidWYsIHNiX2RhdGFsZW4pOworCisgICAgaWYgKHNidWYtPnNiX2RhdGFsZW4gIT0gc2JfZGF0YWxlbikKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICBzYnVmLT5zYl9jYyA9IHNiX2NjOworCisgICAgb2ZmID0gcWVtdV9nZXRfc2JlMzIoZik7CisgICAgc2J1Zi0+c2Jfd3B0ciA9IHNidWYtPnNiX2RhdGEgKyBvZmY7CisgICAgb2ZmID0gcWVtdV9nZXRfc2JlMzIoZik7CisgICAgc2J1Zi0+c2JfcnB0ciA9IHNidWYtPnNiX2RhdGEgKyBvZmY7CisgICAgcWVtdV9nZXRfYnVmZmVyKGYsICh1bnNpZ25lZCBjaGFyKilzYnVmLT5zYl9kYXRhLCBzYnVmLT5zYl9kYXRhbGVuKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaXJwX3NvY2tldF9sb2FkKFFFTVVGaWxlICpmLCBzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKyAgICBpZiAodGNwX2F0dGFjaChzbykgPCAwKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIHNvLT5zb191cmdjID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzby0+c29fZmFkZHIuc19hZGRyID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzby0+c29fbGFkZHIuc19hZGRyID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBzby0+c29fZnBvcnQgPSBxZW11X2dldF9iZTE2KGYpOworICAgIHNvLT5zb19scG9ydCA9IHFlbXVfZ2V0X2JlMTYoZik7CisgICAgc28tPnNvX2lwdG9zID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBzby0+c29fZW11ID0gcWVtdV9nZXRfYnl0ZShmKTsKKyAgICBzby0+c29fdHlwZSA9IHFlbXVfZ2V0X2J5dGUoZik7CisgICAgc28tPnNvX3N0YXRlID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBpZiAoc2xpcnBfc2J1Zl9sb2FkKGYsICZzby0+c29fcmN2KSA8IDApCisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIGlmIChzbGlycF9zYnVmX2xvYWQoZiwgJnNvLT5zb19zbmQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgc2xpcnBfdGNwX2xvYWQoZiwgc28tPnNvX3RjcGNiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsaXJwX3N0YXRlX2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgc3RydWN0IGV4X2xpc3QgKmV4X3B0cjsKKyAgICBpbnQgcjsKKworICAgIHdoaWxlICgociA9IHFlbXVfZ2V0X2J5dGUoZikpKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHN0cnVjdCBzb2NrZXQgKnNvID0gc29jcmVhdGUoKTsKKworICAgICAgICBpZiAoIXNvKQorICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICAgcmV0ID0gc2xpcnBfc29ja2V0X2xvYWQoZiwgc28pOworCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoKHNvLT5zb19mYWRkci5zX2FkZHIgJiBodG9ubCgweGZmZmZmZjAwKSkgIT0gc3BlY2lhbF9hZGRyLnNfYWRkcikKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGZvciAoZXhfcHRyID0gZXhlY19saXN0OyBleF9wdHI7IGV4X3B0ciA9IGV4X3B0ci0+ZXhfbmV4dCkKKyAgICAgICAgICAgIGlmIChleF9wdHItPmV4X3B0eSA9PSAzICYmCisgICAgICAgICAgICAgICAgICAgIChudG9obChzby0+c29fZmFkZHIuc19hZGRyKSAmIDB4ZmYpID09IGV4X3B0ci0+ZXhfYWRkciAmJgorICAgICAgICAgICAgICAgICAgICBzby0+c29fZnBvcnQgPT0gZXhfcHRyLT5leF9mcG9ydCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWV4X3B0cikKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIHNvLT5leHRyYSA9ICh2b2lkICopZXhfcHRyLT5leF9leGVjOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zbGlycC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zbGlycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDlmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3NsaXJwLmgKQEAgLTAsMCArMSwzMzMgQEAKKyNpZm5kZWYgX19DT01NT05fSF9fCisjZGVmaW5lIF9fQ09NTU9OX0hfXworCisjZGVmaW5lIENPTkZJR19RRU1VCisKKy8vI2RlZmluZSBERUJVRyAxCisKKy8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZW5hYmxlIFNMSVJQIHN0YXRpc3RpY3MgcHJpbnRpbmcgaW4gUWVtdQorLy8jZGVmaW5lIExPR19FTkFCTEVECisKKyNpZmRlZiBMT0dfRU5BQkxFRAorI2RlZmluZSBTVEFUKGV4cHIpIGV4cHIKKyNlbHNlCisjZGVmaW5lIFNUQVQoZXhwcikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfUUVNVQorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNlbmRpZgorI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisjaW5jbHVkZSAic2xpcnBfY29uZmlnLmgiCisKKyNpZmRlZiBfV0lOMzIKKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKwordHlwZWRlZiB1aW50OF90IHVfaW50OF90OwordHlwZWRlZiB1aW50MTZfdCB1X2ludDE2X3Q7Cit0eXBlZGVmIHVpbnQzMl90IHVfaW50MzJfdDsKK3R5cGVkZWYgdWludDY0X3QgdV9pbnQ2NF90OwordHlwZWRlZiBjaGFyICpjYWRkcl90OworCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgaW5jbHVkZSA8d2luc29jazIuaD4KKyMgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyMgaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjIGluY2x1ZGUgPGlwaGxwYXBpLmg+CisKKyMgZGVmaW5lIEVXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjIGRlZmluZSBFSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyBkZWZpbmUgRU5PVENPTk4gV1NBRU5PVENPTk4KKyMgZGVmaW5lIEVIT1NUVU5SRUFDSCBXU0FFSE9TVFVOUkVBQ0gKKyMgZGVmaW5lIEVORVRVTlJFQUNIIFdTQUVORVRVTlJFQUNICisjIGRlZmluZSBFQ09OTlJFRlVTRUQgV1NBRUNPTk5SRUZVU0VECisjZWxzZQorIyBkZWZpbmUgaW9jdGxzb2NrZXQgaW9jdGwKKyMgZGVmaW5lIGNsb3Nlc29ja2V0KHMpIGNsb3NlKHMpCisjIGRlZmluZSBPX0JJTkFSWSAwCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaWZkZWYgTkVFRF9UWVBFREVGUwordHlwZWRlZiBjaGFyIGludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDhfdDsKKworIyBpZiBTSVpFT0ZfU0hPUlQgPT0gMgorICAgIHR5cGVkZWYgc2hvcnQgaW50MTZfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVfaW50MTZfdDsKKyMgZWxzZQorIyAgaWYgU0laRU9GX0lOVCA9PSAyCisgICAgdHlwZWRlZiBpbnQgaW50MTZfdDsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDE2X3Q7CisjICBlbHNlCisgICAgI2Vycm9yIENhbm5vdCBmaW5kIGEgdHlwZSB3aXRoIHNpemVvZigpID09IDIKKyMgIGVuZGlmCisjIGVuZGlmCisKKyMgaWYgU0laRU9GX1NIT1JUID09IDQKKyAgIHR5cGVkZWYgc2hvcnQgaW50MzJfdDsKKyAgIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQzMl90OworIyBlbHNlCisjICBpZiBTSVpFT0ZfSU5UID09IDQKKyAgICB0eXBlZGVmIGludCBpbnQzMl90OworICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MzJfdDsKKyMgIGVsc2UKKyAgICAjZXJyb3IgQ2Fubm90IGZpbmQgYSB0eXBlIHdpdGggc2l6ZW9mKCkgPT0gNAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZiAvKiBORUVEX1RZUEVERUZTICovCisKKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZm5kZWYgSEFWRV9NRU1NT1ZFCisjZGVmaW5lIG1lbW1vdmUoeCwgeSwgeikgYmNvcHkoeSwgeCwgeikKKyNlbmRpZgorCisjaWYgVElNRV9XSVRIX1NZU19USU1FCisjIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjIGluY2x1ZGUgPHRpbWUuaD4KKyNlbHNlCisjIGlmZGVmIEhBVkVfU1lTX1RJTUVfSAorIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyMgZWxzZQorIyAgaW5jbHVkZSA8dGltZS5oPgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NUUklOR19ICisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2VuZGlmCisKKyN1bmRlZiBfUAorI2lmbmRlZiBOT19QUk9UT1RZUEVTCisjICBkZWZpbmUgICBfUCh4KSAgIHgKKyNlbHNlCisjICBkZWZpbmUgICBfUCh4KSAgICgpCisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYKKworI2lmZGVmIEdFVFRJTUVPRkRBWV9PTkVfQVJHCisjZGVmaW5lIGdldHRpbWVvZmRheSh4LCB5KSBnZXR0aW1lb2ZkYXkoeCkKKyNlbmRpZgorCisvKiBTeXN0ZW1zIGxhY2tpbmcgc3RyZHVwKCkgZGVmaW5pdGlvbiBpbiA8c3RyaW5nLmg+LiAqLworI2lmIGRlZmluZWQodWx0cml4KQorY2hhciAqc3RyZHVwIF9QKChjb25zdCBjaGFyICopKTsKKyNlbmRpZgorCisvKiBTeXN0ZW1zIGxhY2tpbmcgbWFsbG9jKCkgZGVmaW5pdGlvbiBpbiA8c3RkbGliLmg+LiAqLworI2lmIGRlZmluZWQodWx0cml4KSB8fCBkZWZpbmVkKGhjeCkKK3ZvaWQgKm1hbGxvYyBfUCgoc2l6ZV90IGFyZykpOwordm9pZCBmcmVlIF9QKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSU5FVF9BVE9OCitpbnQgaW5ldF9hdG9uIF9QKChjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmlhKSk7CisjZW5kaWYKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZuZGVmIE5PX1VOSVhfU09DS0VUUworI2luY2x1ZGUgPHN5cy91bi5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9TWVNfU0lHTkFMX0gKKyMgaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2VuZGlmCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX1NZU19JT0NUTF9IKQorIyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyMgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19XQUlUX0gKKyMgaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfRklMSU9fSAorIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgVVNFX1BQUAorI2luY2x1ZGUgPHBwcC9zbGlycHBwLmg+CisjZW5kaWYKKworI2lmZGVmIF9fU1REQ19fCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjZWxzZQorI2luY2x1ZGUgPHZhcmFyZ3MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworLyogQXZvaWQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgbGliYyBpbnNxdWUoKSBhbmQgcmVtcXVlKCksIHdoaWNoCisgICBoYXZlIGRpZmZlcmVudCBwcm90b3R5cGVzLiAqLworI2RlZmluZSBpbnNxdWUgc2xpcnBfaW5zcXVlCisjZGVmaW5lIHJlbXF1ZSBzbGlycF9yZW1xdWUKKworI2lmZGVmIEhBVkVfU1lTX1NUUk9QVFNfSAorI2luY2x1ZGUgPHN5cy9zdHJvcHRzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImRlYnVnLmgiCisKKyNpbmNsdWRlICJpcC5oIgorI2luY2x1ZGUgInRjcC5oIgorI2luY2x1ZGUgInRjcF90aW1lci5oIgorI2luY2x1ZGUgInRjcF92YXIuaCIKKyNpbmNsdWRlICJ0Y3BpcC5oIgorI2luY2x1ZGUgInVkcC5oIgorI2luY2x1ZGUgImljbXBfdmFyLmgiCisjaW5jbHVkZSAibWJ1Zi5oIgorI2luY2x1ZGUgInNidWYuaCIKKyNpbmNsdWRlICJzb2NrZXQuaCIKKyNpbmNsdWRlICJpZi5oIgorI2luY2x1ZGUgIm1haW4uaCIKKyNpbmNsdWRlICJtaXNjLmgiCisjaW5jbHVkZSAiY3RsLmgiCisjaWZkZWYgVVNFX1BQUAorI2luY2x1ZGUgInBwcC9wcHBkLmgiCisjaW5jbHVkZSAicHBwL3BwcC5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJib290cC5oIgorI2luY2x1ZGUgInRmdHAuaCIKKyNpbmNsdWRlICJsaWJzbGlycC5oIgorCitleHRlcm4gc3RydWN0IHR0eXMgKnR0eXNfdW5pdFtNQVhfSU5URVJGQUNFU107CisKKyNpZm5kZWYgTlVMTAorI2RlZmluZSBOVUxMICh2b2lkICopMAorI2VuZGlmCisKKyNpZm5kZWYgRlVMTF9CT0xUCit2b2lkIGlmX3N0YXJ0IF9QKCh2b2lkKSk7CisjZWxzZQordm9pZCBpZl9zdGFydCBfUCgoc3RydWN0IHR0eXMgKikpOworI2VuZGlmCisKKyNpZmRlZiBCQURfU1BSSU5URgorIyBkZWZpbmUgdnNwcmludGYgdnNwcmludGZfbGVuCisjIGRlZmluZSBzcHJpbnRmIHNwcmludGZfbGVuCisgZXh0ZXJuIGludCB2c3ByaW50Zl9sZW4gX1AoKGNoYXIgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KSk7CisgZXh0ZXJuIGludCBzcHJpbnRmX2xlbiBfUCgoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikpOworI2VuZGlmCisKKyNpZmRlZiBERUNMQVJFX1NQUklOVEYKKyMgaWZuZGVmIEJBRF9TUFJJTlRGCisgZXh0ZXJuIGludCB2c3ByaW50ZiBfUCgoY2hhciAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKKyMgZW5kaWYKKyBleHRlcm4gaW50IHZmcHJpbnRmIF9QKChGSUxFICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJFUlJPUgorIGV4dGVybiBjaGFyICpzdHJlcnJvciBfUCgoaW50IGVycm9yKSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0lOREVYCisgY2hhciAqaW5kZXggX1AoKGNvbnN0IGNoYXIgKiwgaW50KSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0dFVEhPU1RJRAorIGxvbmcgZ2V0aG9zdGlkIF9QKCh2b2lkKSk7CisjZW5kaWYKKwordm9pZCBscHJpbnQgX1AoKGNvbnN0IGNoYXIgKiwgLi4uKSk7CisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfQkFVRCAxMTUyMDAKKworI2RlZmluZSBTT19PUFRJT05TIERPX0tFRVBBTElWRQorI2RlZmluZSBUQ1BfTUFYSURMRSAoVENQVFZfS0VFUENOVCAqIFRDUFRWX0tFRVBJTlRWTCkKKworLyogY2tzdW0uYyAqLworaW50IGNrc3VtKHN0cnVjdCBtYnVmICptLCBpbnQgbGVuKTsKKworLyogaWYuYyAqLwordm9pZCBpZl9pbml0IF9QKCh2b2lkKSk7Cit2b2lkIGlmX291dHB1dCBfUCgoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbWJ1ZiAqKSk7CisKKy8qIGlwX2lucHV0LmMgKi8KK3ZvaWQgaXBfaW5pdCBfUCgodm9pZCkpOwordm9pZCBpcF9pbnB1dCBfUCgoc3RydWN0IG1idWYgKikpOwordm9pZCBpcF9zbG93dGltbyBfUCgodm9pZCkpOwordm9pZCBpcF9zdHJpcG9wdGlvbnMgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIHN0cnVjdCBtYnVmICopKTsKKworLyogaXBfb3V0cHV0LmMgKi8KK2ludCBpcF9vdXRwdXQgX1AoKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1idWYgKikpOworCisvKiB0Y3BfaW5wdXQuYyAqLwordm9pZCB0Y3BfaW5wdXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIGludCwgc3RydWN0IHNvY2tldCAqKSk7CitpbnQgdGNwX21zcyBfUCgocmVnaXN0ZXIgc3RydWN0IHRjcGNiICosIHVfaW50KSk7CisKKy8qIHRjcF9vdXRwdXQuYyAqLworaW50IHRjcF9vdXRwdXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqKSk7Cit2b2lkIHRjcF9zZXRwZXJzaXN0IF9QKChyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKikpOworCisvKiB0Y3Bfc3Vici5jICovCit2b2lkIHRjcF9pbml0IF9QKCh2b2lkKSk7Cit2b2lkIHRjcF90ZW1wbGF0ZSBfUCgoc3RydWN0IHRjcGNiICopKTsKK3ZvaWQgdGNwX3Jlc3BvbmQgX1AoKHN0cnVjdCB0Y3BjYiAqLCByZWdpc3RlciBzdHJ1Y3QgdGNwaXBoZHIgKiwgcmVnaXN0ZXIgc3RydWN0IG1idWYgKiwgdGNwX3NlcSwgdGNwX3NlcSwgaW50KSk7CitzdHJ1Y3QgdGNwY2IgKiB0Y3BfbmV3dGNwY2IgX1AoKHN0cnVjdCBzb2NrZXQgKikpOworc3RydWN0IHRjcGNiICogdGNwX2Nsb3NlIF9QKChyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKikpOwordm9pZCB0Y3Bfc29ja2Nsb3NlZCBfUCgoc3RydWN0IHRjcGNiICopKTsKK2ludCB0Y3BfZmNvbm5lY3QgX1AoKHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCB0Y3BfY29ubmVjdCBfUCgoc3RydWN0IHNvY2tldCAqKSk7CitpbnQgdGNwX2F0dGFjaCBfUCgoc3RydWN0IHNvY2tldCAqKSk7Cit1X2ludDhfdCB0Y3BfdG9zIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK2ludCB0Y3BfZW11IF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtYnVmICopKTsKK2ludCB0Y3BfY3RsIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3N0cnVjdCB0Y3BjYiAqdGNwX2Ryb3Aoc3RydWN0IHRjcGNiICp0cCwgaW50IGVycik7CisKKyNpZmRlZiBVU0VfUFBQCisjZGVmaW5lIE1JTl9NUlUgTUlOTVJVCisjZGVmaW5lIE1BWF9NUlUgTUFYTVJVCisjZWxzZQorI2RlZmluZSBNSU5fTVJVIDEyOAorI2RlZmluZSBNQVhfTVJVIDE2Mzg0CisjZW5kaWYKKworI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKyNkZWZpbmUgbWF4KHgseSkgKCh4KSA+ICh5KSA/ICh4KSA6ICh5KSkKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjdW5kZWYgZXJybm8KKyNkZWZpbmUgZXJybm8gKFdTQUdldExhc3RFcnJvcigpKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zbGlycF9jb25maWcuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvc2xpcnBfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlM2M5YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvc2xpcnBfY29uZmlnLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBVc2VyIGRlZmluYWJsZSBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqLworCisvKiBVbmRlZmluZSBpZiB5b3UgZG9uJ3Qgd2FudCB0YWxrIGVtdWxhdGlvbiAqLworI3VuZGVmIEVNVUxBVEVfVEFMSworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdGhlIGNvbm5lY3Rpb24gdG8gYmUgcHJvYmVkICovCisvKiBYWFggTm90IHdvcmtpbmcgeWV0LCBzbyBpZ25vcmUgdGhpcyBmb3Igbm93ICovCisjdW5kZWYgUFJPQkVfQ09OTgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3Ugd2FudCBLRUVQQUxJVkUgdGltZXJzICovCisjZGVmaW5lIERPX0tFRVBBTElWRSAwCisKKy8qIERlZmluZSB0byBNQVggaW50ZXJmYWNlcyB5b3UgZXhwZWN0IHRvIHVzZSBhdCBvbmNlICovCisvKiBNQVhfSU5URVJGQUNFUyBkZXRlcm1pbmVzIHRoZSBtYXguIFRPVEFMIG51bWJlciBvZiBpbnRlcmZhY2VzIChTTElQIGFuZCBQUFApICovCisvKiBNQVhfUFBQX0lOVEVSRkFDRVMgZGV0ZXJtaW5lcyBtYXguIG51bWJlciBvZiBQUFAgaW50ZXJmYWNlcyAqLworI2RlZmluZSBNQVhfSU5URVJGQUNFUyAxCisjZGVmaW5lIE1BWF9QUFBfSU5URVJGQUNFUyAxCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCBzbGlycCdzIHNvY2tldCBpbiAvdG1wICovCisvKiBYWFhYWFggRG8gdGhpcyBpbiAuL2NvbmZpZ3VyZSAqLworI3VuZGVmIFVTRV9UTVBTT0NLRVQKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHNsaXJwIHRvIHVzZSBjZnNldFhzcGVlZCgpIG9uIHRoZSB0ZXJtaW5hbCAqLworI3VuZGVmIERPX0NGU0VUU1BFRUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IHdhbnQgc2xpcnAgdG8gd3JpdGUgdG8gdGhlIHR0eSBhcyBmYXN0IGFzIGl0IGNhbiAqLworLyogVGhpcyBzaG91bGQgb25seSBiZSBzZXQgaWYgeW91IGFyZSB1c2luZyBsb2FkLWJhbGFuY2luZywgc2xpcnAgZG9lcyBhICovCisvKiBwcmV0dHkgZ29vZCBqb2Igb24gc2luZ2xlIG1vZGVtcyBhbHJlYWR5LCBhbmQgc2V0aW5nIHRoaXMgd2lsbCBtYWtlICovCisvKiBpbnRlcmFjdGl2ZSBzZXNzaW9ucyBsZXNzIHJlc3BvbnNpdmUgKi8KKy8qIFhYWFhYIFRhbGsgYWJvdXQgaGF2aW5nIGZhc3QgbW9kZW0gYXMgdW5pdCAwICovCisjdW5kZWYgRlVMTF9CT0xUCisKKy8qCisgKiBEZWZpbmUgaWYgeW91IHdhbnQgc2xpcnAgdG8gdXNlIGxlc3MgQ1BVCisgKiBZb3Ugd2lsbCBub3RpY2UgYSBzbWFsbCBsYWcgaW4gaW50ZXJhY3RpdmUgc2Vzc2lvbnMsIGJ1dCBpdCdzIG5vdCB0aGF0IGJhZAorICogVGhpbmdzIGxpa2UgTmV0c2NhcGUvZnRwL2V0Yy4gYXJlIGNvbXBsZXRlbHkgdW5hZmZlY3RlZAorICogVGhpcyBpcyBtYWlubHkgZm9yIHN5c2FkbWlucyB3aG8gaGF2ZSBtYW55IHNsaXJwIHVzZXJzCisgKi8KKyN1bmRlZiBVU0VfTE9XQ1BVCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBsaWtlIHByb3RvdHlwZXMgKi8KKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgTk9fUFJPVE9UWVBFUworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQXV0b2NvbmYgZGVmaW5lZCBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIFlvdSBzaG91bGRuJ3QgbmVlZCB0byB0b3VjaCBhbnkgb2YgdGhlc2UKKyAqLworCisvKiBJZ25vcmUgdGhpcyAqLworI3VuZGVmIERVTU1ZX1BQUAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdW5pc3RkLmggKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3RkbGliLmggKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3lzL2lvY3RsLmggKi8KKyN1bmRlZiBIQVZFX1NZU19JT0NUTF9ICisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBIQVZFX1NZU19JT0NUTF9ICisjZW5kaWYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5cy9maWxpby5oICovCisjdW5kZWYgSEFWRV9TWVNfRklMSU9fSAorI2lmZGVmIF9fQVBQTEVfXworI2RlZmluZSBIQVZFX1NZU19GSUxJT19ICisjZW5kaWYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cmVycm9yICovCisjZGVmaW5lIEhBVkVfU1RSRVJST1IKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cmR1cCgpICovCisjZGVmaW5lIEhBVkVfU1RSRFVQCisKKy8qIERlZmluZSBhY2NvcmRpbmcgdG8gaG93IHRpbWUuaCBzaG91bGQgYmUgaW5jbHVkZWQgKi8KKyNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDAKKyN1bmRlZiBIQVZFX1NZU19USU1FX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN5cy9iaXR5cGVzLmggKi8KKyN1bmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKworLyogRGVmaW5lIGlmIHRoZSBtYWNoaW5lIGlzIGJpZyBlbmRpYW4gKi8KKy8vI3VuZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSBpZiB5b3VyIHNwcmludGYgcmV0dXJucyBjaGFyICogaW5zdGVhZCBvZiBpbnQgKi8KKyN1bmRlZiBCQURfU1BSSU5URgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgcmVhZHYgKi8KKyN1bmRlZiBIQVZFX1JFQURWCisKKy8qIERlZmluZSBpZiBpb3ZlYyBuZWVkcyB0byBiZSBkZWNsYXJlZCAqLworI3VuZGVmIERFQ0xBUkVfSU9WRUMKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgREVDTEFSRV9JT1ZFQworI2VuZGlmCisKKy8qIERlZmluZSBpZiBhIGRlY2xhcmF0aW9uIG9mIHNwcmludGYvZnByaW50ZiBpcyBuZWVkZWQgKi8KKyN1bmRlZiBERUNMQVJFX1NQUklOVEYKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgUE9TSVguMSBzeXMvd2FpdC5oICovCisjdW5kZWYgSEFWRV9TWVNfV0FJVF9ICisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzeXMvc2VsZWN0LmggKi8KKyN1bmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0gKKyNlbmRpZgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3RyaW5ncy5oICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFycGEvaW5ldC5oICovCisjdW5kZWYgSEFWRV9BUlBBX0lORVRfSAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgSEFWRV9BUlBBX0lORVRfSAorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzeXMvc2lnbmFsLmggKi8KKyN1bmRlZiBIQVZFX1NZU19TSUdOQUxfSAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3lzL3N0cm9wdHMuaCAqLworI3VuZGVmIEhBVkVfU1lTX1NUUk9QVFNfSAorCisvKiBEZWZpbmUgdG8gd2hhdGV2ZXIgeW91ciBjb21waWxlciB0aGlua3MgaW5saW5lIHNob3VsZCBiZSAqLworLy8jZGVmaW5lIGlubGluZSBpbmxpbmUKKworLyogRGVmaW5lIHRvIHdoYXRldmVyIHlvdXIgY29tcGlsZXIgdGhpbmtzIGNvbnN0IHNob3VsZCBiZSAqLworLy8jZGVmaW5lIGNvbnN0IGNvbnN0CisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBwcm90b3R5cGVzICovCisjdW5kZWYgTk9fUFJPVE9UWVBFUworCisvKiBEZWZpbmUgaWYgeW91IGRvbid0IGhhdmUgdV9pbnQzMl90IGV0Yy4gdHlwZWRlZidkICovCisjdW5kZWYgTkVFRF9UWVBFREVGUworI2lmZGVmIF9fc3VuX18KKyNkZWZpbmUgTkVFRF9UWVBFREVGUworI2VuZGlmCisKKy8qIERlZmluZSB0byBzaXplb2YoY2hhcikgKi8KKyNkZWZpbmUgU0laRU9GX0NIQVIgMQorCisvKiBEZWZpbmUgdG8gc2l6ZW9mKHNob3J0KSAqLworI2RlZmluZSBTSVpFT0ZfU0hPUlQgMgorCisvKiBEZWZpbmUgdG8gc2l6ZW9mKGludCkgKi8KKyNkZWZpbmUgU0laRU9GX0lOVCA0CisKKy8qIERlZmluZSB0byBzaXplb2YoY2hhciAqKSAqLworI2RlZmluZSBTSVpFT0ZfQ0hBUl9QIChIT1NUX0xPTkdfQklUUyAvIDgpCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByYW5kb20oKSAqLworI3VuZGVmIEhBVkVfUkFORE9NCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzcmFuZG9tKCkgKi8KKyN1bmRlZiBIQVZFX1NSQU5ET00KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGluZXRfYXRvbiAqLworI3VuZGVmIEhBVkVfSU5FVF9BVE9OCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBIQVZFX0lORVRfQVRPTgorI2VuZGlmCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzZXRlbnYgKi8KKyN1bmRlZiBIQVZFX1NFVEVOVgorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgaW5kZXgoKSAqLworI2RlZmluZSBIQVZFX0lOREVYCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBiY21wKCkgKi8KKyN1bmRlZiBIQVZFX0JDTVAKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGRyYW5kNDggKi8KKyN1bmRlZiBIQVZFX0RSQU5ENDgKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIG1lbW1vdmUgKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBnZXRob3N0aWQgKi8KKyNkZWZpbmUgSEFWRV9HRVRIT1NUSUQKKworLyogRGVmaW5lIGlmIHlvdSBET04nVCBoYXZlIHVuaXgtZG9tYWluIHNvY2tldHMgKi8KKyN1bmRlZiBOT19VTklYX1NPQ0tFVFMKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgTk9fVU5JWF9TT0NLRVRTCisjZW5kaWYKKworLyogRGVmaW5lIGlmIGdldHRpbWVvZmRheSBvbmx5IHRha2VzIG9uZSBhcmd1bWVudCAqLworI3VuZGVmIEdFVFRJTUVPRkRBWV9PTkVfQVJHCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZXZva2UoKSAqLworI3VuZGVmIEhBVkVfUkVWT0tFCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzdiBtZXRob2Qgb2Ygb3BlbmluZyBwdHkncyAoL2Rldi9wdG14LCBldGMuKSAqLworI3VuZGVmIEhBVkVfR1JBTlRQVAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgZmNobW9kICovCisjdW5kZWYgSEFWRV9GQ0hNT0QKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvdHlwZTMyLmg+ICovCisjdW5kZWYgSEFWRV9TWVNfVFlQRVMzMl9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3NvY2tldC5jIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQwMjZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC9zb2NrZXQuYwpAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKyNpZmRlZiBfX3N1bl9fCisjaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgc29mY2FudHJjdm1vcmUoc3RydWN0IHNvY2tldCAqc28pOworc3RhdGljIHZvaWQgc29mY2FudHNlbmRtb3JlKHN0cnVjdCBzb2NrZXQgKnNvKTsKKworI2lmIDAKK3N0YXRpYyB2b2lkCitzb19pbml0KCkKK3sKKwkvKiBOb3RoaW5nIHlldCAqLworfQorI2VuZGlmCisKK3N0cnVjdCBzb2NrZXQgKgorc29sb29rdXAoc3RydWN0IHNvY2tldCAqaGVhZCwgc3RydWN0IGluX2FkZHIgbGFkZHIsIHVfaW50IGxwb3J0LAorICAgICAgICAgc3RydWN0IGluX2FkZHIgZmFkZHIsIHVfaW50IGZwb3J0KQoreworCXN0cnVjdCBzb2NrZXQgKnNvOworCisJZm9yIChzbyA9IGhlYWQtPnNvX25leHQ7IHNvICE9IGhlYWQ7IHNvID0gc28tPnNvX25leHQpIHsKKwkJaWYgKHNvLT5zb19scG9ydCA9PSBscG9ydCAmJgorCQkgICAgc28tPnNvX2xhZGRyLnNfYWRkciA9PSBsYWRkci5zX2FkZHIgJiYKKwkJICAgIHNvLT5zb19mYWRkci5zX2FkZHIgPT0gZmFkZHIuc19hZGRyICYmCisJCSAgICBzby0+c29fZnBvcnQgPT0gZnBvcnQpCisJCSAgIGJyZWFrOworCX0KKworCWlmIChzbyA9PSBoZWFkKQorCSAgIHJldHVybiAoc3RydWN0IHNvY2tldCAqKU5VTEw7CisJcmV0dXJuIHNvOworCit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgc29ja2V0LCBpbml0aWFsaXNlIHRoZSBmaWVsZHMKKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvCisgKiBpbnNxdWUoKSBpdCBpbnRvIHRoZSBjb3JyZWN0IGxpbmtlZC1saXN0CisgKi8KK3N0cnVjdCBzb2NrZXQgKgorc29jcmVhdGUodm9pZCkKK3sKKyAgc3RydWN0IHNvY2tldCAqc287CisKKyAgc28gPSAoc3RydWN0IHNvY2tldCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2tldCkpOworICBpZihzbykgeworICAgIG1lbXNldChzbywgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrZXQpKTsKKyAgICBzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOworICAgIHNvLT5zID0gLTE7CisgIH0KKyAgcmV0dXJuKHNvKTsKK30KKworLyoKKyAqIHJlbXF1ZSBhbmQgZnJlZSBhIHNvY2tldCwgY2xvYmJlciBjYWNoZQorICovCit2b2lkCitzb2ZyZWUoc3RydWN0IHNvY2tldCAqc28pCit7CisgIGlmIChzby0+c29fZW11PT1FTVVfUlNIICYmIHNvLT5leHRyYSkgeworCXNvZnJlZShzby0+ZXh0cmEpOworCXNvLT5leHRyYT1OVUxMOworICB9CisgIGlmIChzbyA9PSB0Y3BfbGFzdF9zbykKKyAgICB0Y3BfbGFzdF9zbyA9ICZ0Y2I7CisgIGVsc2UgaWYgKHNvID09IHVkcF9sYXN0X3NvKQorICAgIHVkcF9sYXN0X3NvID0gJnVkYjsKKworICBtX2ZyZWUoc28tPnNvX20pOworCisgIGlmKHNvLT5zb19uZXh0ICYmIHNvLT5zb19wcmV2KQorICAgIHJlbXF1ZShzbyk7ICAvKiBjcmFzaGVzIGlmIHNvIGlzIG5vdCBpbiBhIHF1ZXVlICovCisKKyAgZnJlZShzbyk7Cit9CisKK3NpemVfdCBzb3ByZXByYnVmKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50ICpucCkKK3sKKwlpbnQgbiwgbHNzLCB0b3RhbDsKKwlzdHJ1Y3Qgc2J1ZiAqc2IgPSAmc28tPnNvX3NuZDsKKwlpbnQgbGVuID0gc2ItPnNiX2RhdGFsZW4gLSBzYi0+c2JfY2M7CisJaW50IG1zcyA9IHNvLT5zb190Y3BjYi0+dF9tYXhzZWc7CisKKwlERUJVR19DQUxMKCJzb3ByZXByYnVmIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nIClzbyk7CisKKwlsZW4gPSBzYi0+c2JfZGF0YWxlbiAtIHNiLT5zYl9jYzsKKworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSBzYi0+c2Jfd3B0cjsKKyAgICAgICAgaW92WzFdLmlvdl9iYXNlID0gTlVMTDsKKyAgICAgICAgaW92WzFdLmlvdl9sZW4gPSAwOworCWlmIChzYi0+c2Jfd3B0ciA8IHNiLT5zYl9ycHRyKSB7CisJCWlvdlswXS5pb3ZfbGVuID0gc2ItPnNiX3JwdHIgLSBzYi0+c2Jfd3B0cjsKKwkJLyogU2hvdWxkIG5ldmVyIHN1Y2NlZWQsIGJ1dC4uLiAqLworCQlpZiAoaW92WzBdLmlvdl9sZW4gPiBsZW4pCisJCSAgIGlvdlswXS5pb3ZfbGVuID0gbGVuOworCQlpZiAoaW92WzBdLmlvdl9sZW4gPiBtc3MpCisJCSAgIGlvdlswXS5pb3ZfbGVuIC09IGlvdlswXS5pb3ZfbGVuJW1zczsKKwkJbiA9IDE7CisJfSBlbHNlIHsKKwkJaW92WzBdLmlvdl9sZW4gPSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikgLSBzYi0+c2Jfd3B0cjsKKwkJLyogU2hvdWxkIG5ldmVyIHN1Y2NlZWQsIGJ1dC4uLiAqLworCQlpZiAoaW92WzBdLmlvdl9sZW4gPiBsZW4pIGlvdlswXS5pb3ZfbGVuID0gbGVuOworCQlsZW4gLT0gaW92WzBdLmlvdl9sZW47CisJCWlmIChsZW4pIHsKKwkJCWlvdlsxXS5pb3ZfYmFzZSA9IHNiLT5zYl9kYXRhOworCQkJaW92WzFdLmlvdl9sZW4gPSBzYi0+c2JfcnB0ciAtIHNiLT5zYl9kYXRhOworCQkJaWYoaW92WzFdLmlvdl9sZW4gPiBsZW4pCisJCQkgICBpb3ZbMV0uaW92X2xlbiA9IGxlbjsKKwkJCXRvdGFsID0gaW92WzBdLmlvdl9sZW4gKyBpb3ZbMV0uaW92X2xlbjsKKwkJCWlmICh0b3RhbCA+IG1zcykgeworCQkJCWxzcyA9IHRvdGFsJW1zczsKKwkJCQlpZiAoaW92WzFdLmlvdl9sZW4gPiBsc3MpIHsKKwkJCQkJaW92WzFdLmlvdl9sZW4gLT0gbHNzOworCQkJCQluID0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQlsc3MgLT0gaW92WzFdLmlvdl9sZW47CisJCQkJCWlvdlswXS5pb3ZfbGVuIC09IGxzczsKKwkJCQkJbiA9IDE7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJbiA9IDI7CisJCX0gZWxzZSB7CisJCQlpZiAoaW92WzBdLmlvdl9sZW4gPiBtc3MpCisJCQkgICBpb3ZbMF0uaW92X2xlbiAtPSBpb3ZbMF0uaW92X2xlbiVtc3M7CisJCQluID0gMTsKKwkJfQorCX0KKwlpZiAobnApCisJCSpucCA9IG47CisKKwlyZXR1cm4gaW92WzBdLmlvdl9sZW4gKyAobiAtIDEpICogaW92WzFdLmlvdl9sZW47Cit9CisKKy8qCisgKiBSZWFkIGZyb20gc28ncyBzb2NrZXQgaW50byBzYl9zbmQsIHVwZGF0aW5nIGFsbCByZWxldmFudCBzYnVmIGZpZWxkcworICogTk9URTogVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIGl0IGlzIHNlbGVjdCgpZWQgZm9yIHJlYWRpbmcsIHNvCisgKiBhIHJlYWQoKSBvZiAwIChvciBsZXNzKSBtZWFucyBpdCdzIGRpc2Nvbm5lY3RlZAorICovCitpbnQKK3NvcmVhZChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpbnQgbiwgbm47CisJc3RydWN0IHNidWYgKnNiID0gJnNvLT5zb19zbmQ7CisJc3RydWN0IGlvdmVjIGlvdlsyXTsKKworCURFQlVHX0NBTEwoInNvcmVhZCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisJLyoKKwkgKiBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gdG8gcmVhZC4KKwkgKiBzb3JlYWQgd291bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZCBpZiB0aGVyZSB3ZXJlbid0CisJICovCisJc29wcmVwcmJ1ZihzbywgaW92LCAmbik7CisKKyNpZmRlZiBIQVZFX1JFQURWCisJbm4gPSByZWFkdihzby0+cywgKHN0cnVjdCBpb3ZlYyAqKWlvdiwgbik7CisJREVCVUdfTUlTQygoZGZkLCAiIC4uLiByZWFkIG5uID0gJWQgYnl0ZXNcbiIsIG5uKSk7CisjZWxzZQorCW5uID0gcmVjdihzby0+cywgaW92WzBdLmlvdl9iYXNlLCBpb3ZbMF0uaW92X2xlbiwwKTsKKyNlbmRpZgorCWlmIChubiA8PSAwKSB7CisJCWlmIChubiA8IDAgJiYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVBR0FJTikpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSB7CisJCQlERUJVR19NSVNDKChkZmQsICIgLS0tIHNvcmVhZCgpIGRpc2Nvbm5lY3RlZCwgbm4gPSAlZCwgZXJybm8gPSAlZC0lc1xuIiwgbm4sIGVycm5vLHN0cmVycm9yKGVycm5vKSkpOworCQkJc29mY2FudHJjdm1vcmUoc28pOworCQkJdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKyNpZm5kZWYgSEFWRV9SRUFEVgorCS8qCisJICogSWYgdGhlcmUgd2FzIG5vIGVycm9yLCB0cnkgYW5kIHJlYWQgdGhlIHNlY29uZCB0aW1lIHJvdW5kCisJICogV2UgcmVhZCBhZ2FpbiBpZiBuID0gMiAoaWUsIHRoZXJlJ3MgYW5vdGhlciBwYXJ0IG9mIHRoZSBidWZmZXIpCisJICogYW5kIHdlIHJlYWQgYXMgbXVjaCBhcyB3ZSBjb3VsZCBpbiB0aGUgZmlyc3QgcmVhZAorCSAqIFdlIGRvbid0IHRlc3QgZm9yIDw9IDAgdGhpcyB0aW1lLCBiZWNhdXNlIHRoZXJlIGxlZ2l0aW1hdGVseQorCSAqIG1pZ2h0IG5vdCBiZSBhbnkgbW9yZSBkYXRhIChzaW5jZSB0aGUgc29ja2V0IGlzIG5vbi1ibG9ja2luZyksCisJICogYSBjbG9zZSB3aWxsIGJlIGRldGVjdGVkIG9uIG5leHQgaXRlcmF0aW9uLgorCSAqIEEgcmV0dXJuIG9mIC0xIHdvbnQgKHNob3VsZG4ndCkgaGFwcGVuLCBzaW5jZSBpdCBkaWRuJ3QgaGFwcGVuIGFib3ZlCisJICovCisJaWYgKG4gPT0gMiAmJiBubiA9PSBpb3ZbMF0uaW92X2xlbikgeworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIHJldCA9IHJlY3Yoc28tPnMsIGlvdlsxXS5pb3ZfYmFzZSwgaW92WzFdLmlvdl9sZW4sMCk7CisgICAgICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgICAgICBubiArPSByZXQ7CisgICAgICAgIH0KKworCURFQlVHX01JU0MoKGRmZCwgIiAuLi4gcmVhZCBubiA9ICVkIGJ5dGVzXG4iLCBubikpOworI2VuZGlmCisKKwkvKiBVcGRhdGUgZmllbGRzICovCisJc2ItPnNiX2NjICs9IG5uOworCXNiLT5zYl93cHRyICs9IG5uOworCWlmIChzYi0+c2Jfd3B0ciA+PSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikpCisJCXNiLT5zYl93cHRyIC09IHNiLT5zYl9kYXRhbGVuOworCXJldHVybiBubjsKK30KKworaW50IHNvcmVhZGJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgbiwgbm4sIGNvcHkgPSBzaXplOworCXN0cnVjdCBzYnVmICpzYiA9ICZzby0+c29fc25kOworCXN0cnVjdCBpb3ZlYyBpb3ZbMl07CisKKwlERUJVR19DQUxMKCJzb3JlYWRidWYiKTsKKwlERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcgKXNvKTsKKworCS8qCisJICogTm8gbmVlZCB0byBjaGVjayBpZiB0aGVyZSdzIGVub3VnaCByb29tIHRvIHJlYWQuCisJICogc29yZWFkIHdvdWxkbid0IGhhdmUgYmVlbiBjYWxsZWQgaWYgdGhlcmUgd2VyZW4ndAorCSAqLworCWlmIChzb3ByZXByYnVmKHNvLCBpb3YsICZuKSA8IHNpemUpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgbm4gPSBNSU4oaW92WzBdLmlvdl9sZW4sIGNvcHkpOworICAgIG1lbWNweShpb3ZbMF0uaW92X2Jhc2UsIGJ1Ziwgbm4pOworCisgICAgY29weSAtPSBubjsKKyAgICBidWYgKz0gbm47CisKKyAgICBpZiAoY29weSA9PSAwKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICBtZW1jcHkoaW92WzFdLmlvdl9iYXNlLCBidWYsIGNvcHkpOworCitkb25lOgorICAgIC8qIFVwZGF0ZSBmaWVsZHMgKi8KKwlzYi0+c2JfY2MgKz0gc2l6ZTsKKwlzYi0+c2Jfd3B0ciArPSBzaXplOworCWlmIChzYi0+c2Jfd3B0ciA+PSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikpCisJCXNiLT5zYl93cHRyIC09IHNiLT5zYl9kYXRhbGVuOworICAgIHJldHVybiBzaXplOworZXJyOgorCisgICAgc29mY2FudHJjdm1vcmUoc28pOworICAgIHRjcF9zb2NrY2xvc2VkKHNvdG90Y3BjYihzbykpOworICAgIGZwcmludGYoc3RkZXJyLCAic29yZWFkYnVmIGJ1ZmZlciB0byBzbWFsbCIpOworICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqIEdldCB1cmdlbnQgZGF0YQorICoKKyAqIFdoZW4gdGhlIHNvY2tldCBpcyBjcmVhdGVkLCB3ZSBzZXQgaXQgU09fT09CSU5MSU5FLAorICogc28gd2hlbiBPT0IgZGF0YSBhcnJpdmVzLCB3ZSBzb3JlYWQoKSBpdCBhbmQgZXZlcnl0aGluZworICogaW4gdGhlIHNlbmQgYnVmZmVyIGlzIHNlbnQgYXMgdXJnZW50IGRhdGEKKyAqLwordm9pZAorc29yZWN2b29iKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXN0cnVjdCB0Y3BjYiAqdHAgPSBzb3RvdGNwY2Ioc28pOworCisJREVCVUdfQ0FMTCgic29yZWN2b29iIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKworCS8qCisJICogV2UgdGFrZSBhIGd1ZXNzIGF0IGhvdyBtdWNoIHVyZ2VudCBkYXRhIGhhcyBhcnJpdmVkLgorCSAqIEluIG1vc3Qgc2l0dWF0aW9ucywgd2hlbiB1cmdlbnQgZGF0YSBhcnJpdmVzLCB0aGUgbmV4dAorCSAqIHJlYWQoKSBzaG91bGQgZ2V0IGFsbCB0aGUgdXJnZW50IGRhdGEuICBUaGlzIGd1ZXNzIHdpbGwKKwkgKiBiZSB3cm9uZyBob3dldmVyIGlmIG1vcmUgZGF0YSBhcnJpdmVzIGp1c3QgYWZ0ZXIgdGhlCisJICogdXJnZW50IGRhdGEsIG9yIHRoZSByZWFkKCkgZG9lc24ndCByZXR1cm4gYWxsIHRoZQorCSAqIHVyZ2VudCBkYXRhLgorCSAqLworCXNvcmVhZChzbyk7CisJdHAtPnNuZF91cCA9IHRwLT5zbmRfdW5hICsgc28tPnNvX3NuZC5zYl9jYzsKKwl0cC0+dF9mb3JjZSA9IDE7CisJdGNwX291dHB1dCh0cCk7CisJdHAtPnRfZm9yY2UgPSAwOworfQorCisvKgorICogU2VuZCB1cmdlbnQgZGF0YQorICogVGhlcmUncyBhIGxvdCBkdXBsaWNhdGVkIGNvZGUgaGVyZSwgYnV0Li4uCisgKi8KK2ludAorc29zZW5kb29iKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXN0cnVjdCBzYnVmICpzYiA9ICZzby0+c29fcmN2OworCWNoYXIgYnVmZlsyMDQ4XTsgLyogWFhYIFNob3VsZG4ndCBiZSBzZW5kaW5nIG1vcmUgb29iIGRhdGEgdGhhbiB0aGlzICovCisKKwlpbnQgbiwgbGVuOworCisJREVCVUdfQ0FMTCgic29zZW5kb29iIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKwlERUJVR19BUkcoInNiLT5zYl9jYyA9ICVkIiwgc2ItPnNiX2NjKTsKKworCWlmIChzby0+c29fdXJnYyA+IDIwNDgpCisJICAgc28tPnNvX3VyZ2MgPSAyMDQ4OyAvKiBYWFhYICovCisKKwlpZiAoc2ItPnNiX3JwdHIgPCBzYi0+c2Jfd3B0cikgeworCQkvKiBXZSBjYW4gc2VuZCBpdCBkaXJlY3RseSAqLworCQluID0gc2xpcnBfc2VuZChzbywgc2ItPnNiX3JwdHIsIHNvLT5zb191cmdjLCAoTVNHX09PQikpOyAvKiB8TVNHX0RPTlRXQUlUKSk7ICovCisJCXNvLT5zb191cmdjIC09IG47CisKKwkJREVCVUdfTUlTQygoZGZkLCAiIC0tLSBzZW50ICVkIGJ5dGVzIHVyZ2VudCBkYXRhLCAlZCB1cmdlbnQgYnl0ZXMgbGVmdFxuIiwgbiwgc28tPnNvX3VyZ2MpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTaW5jZSB0aGVyZSdzIG5vIHNlbmR2IG9yIHNlbmR0b3YgbGlrZSB3cml0ZXYsCisJCSAqIHdlIG11c3QgY29weSBhbGwgZGF0YSB0byBhIGxpbmVhciBidWZmZXIgdGhlbgorCQkgKiBzZW5kIGl0IGFsbAorCQkgKi8KKwkJbGVuID0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pIC0gc2ItPnNiX3JwdHI7CisJCWlmIChsZW4gPiBzby0+c29fdXJnYykgbGVuID0gc28tPnNvX3VyZ2M7CisJCW1lbWNweShidWZmLCBzYi0+c2JfcnB0ciwgbGVuKTsKKwkJc28tPnNvX3VyZ2MgLT0gbGVuOworCQlpZiAoc28tPnNvX3VyZ2MpIHsKKwkJCW4gPSBzYi0+c2Jfd3B0ciAtIHNiLT5zYl9kYXRhOworCQkJaWYgKG4gPiBzby0+c29fdXJnYykgbiA9IHNvLT5zb191cmdjOworCQkJbWVtY3B5KChidWZmICsgbGVuKSwgc2ItPnNiX2RhdGEsIG4pOworCQkJc28tPnNvX3VyZ2MgLT0gbjsKKwkJCWxlbiArPSBuOworCQl9CisJCW4gPSBzbGlycF9zZW5kKHNvLCBidWZmLCBsZW4sIChNU0dfT09CKSk7IC8qIHxNU0dfRE9OVFdBSVQpKTsgKi8KKyNpZmRlZiBERUJVRworCQlpZiAobiAhPSBsZW4pCisJCSAgIERFQlVHX0VSUk9SKChkZmQsICJEaWRuJ3Qgc2VuZCBhbGwgZGF0YSB1cmdlbnRseSBYWFhYWFxuIikpOworI2VuZGlmCisJCURFQlVHX01JU0MoKGRmZCwgIiAtLS0yIHNlbnQgJWQgYnl0ZXMgdXJnZW50IGRhdGEsICVkIHVyZ2VudCBieXRlcyBsZWZ0XG4iLCBuLCBzby0+c29fdXJnYykpOworCX0KKworCXNiLT5zYl9jYyAtPSBuOworCXNiLT5zYl9ycHRyICs9IG47CisJaWYgKHNiLT5zYl9ycHRyID49IChzYi0+c2JfZGF0YSArIHNiLT5zYl9kYXRhbGVuKSkKKwkJc2ItPnNiX3JwdHIgLT0gc2ItPnNiX2RhdGFsZW47CisKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgZnJvbSBzb19yY3YgdG8gc28ncyBzb2NrZXQsCisgKiB1cGRhdGluZyBhbGwgc2J1ZiBmaWVsZCBhcyBuZWNlc3NhcnkKKyAqLworaW50Citzb3dyaXRlKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWludCAgbixubjsKKwlzdHJ1Y3Qgc2J1ZiAqc2IgPSAmc28tPnNvX3JjdjsKKwlpbnQgbGVuID0gc2ItPnNiX2NjOworCXN0cnVjdCBpb3ZlYyBpb3ZbMl07CisKKwlERUJVR19DQUxMKCJzb3dyaXRlIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKworCWlmIChzby0+c29fdXJnYykgeworCQlzb3NlbmRvb2Ioc28pOworCQlpZiAoc2ItPnNiX2NjID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gY2hlY2sgaWYgdGhlcmUncyBzb21ldGhpbmcgdG8gd3JpdGUsCisJICogc293cml0ZSB3b3VsZG4ndCBoYXZlIGJlZW4gY2FsbGVkIG90aGVyd2lzZQorCSAqLworCisgICAgICAgIGxlbiA9IHNiLT5zYl9jYzsKKworCWlvdlswXS5pb3ZfYmFzZSA9IHNiLT5zYl9ycHRyOworICAgICAgICBpb3ZbMV0uaW92X2Jhc2UgPSBOVUxMOworICAgICAgICBpb3ZbMV0uaW92X2xlbiA9IDA7CisJaWYgKHNiLT5zYl9ycHRyIDwgc2ItPnNiX3dwdHIpIHsKKwkJaW92WzBdLmlvdl9sZW4gPSBzYi0+c2Jfd3B0ciAtIHNiLT5zYl9ycHRyOworCQkvKiBTaG91bGQgbmV2ZXIgc3VjY2VlZCwgYnV0Li4uICovCisJCWlmIChpb3ZbMF0uaW92X2xlbiA+IGxlbikgaW92WzBdLmlvdl9sZW4gPSBsZW47CisJCW4gPSAxOworCX0gZWxzZSB7CisJCWlvdlswXS5pb3ZfbGVuID0gKHNiLT5zYl9kYXRhICsgc2ItPnNiX2RhdGFsZW4pIC0gc2ItPnNiX3JwdHI7CisJCWlmIChpb3ZbMF0uaW92X2xlbiA+IGxlbikgaW92WzBdLmlvdl9sZW4gPSBsZW47CisJCWxlbiAtPSBpb3ZbMF0uaW92X2xlbjsKKwkJaWYgKGxlbikgeworCQkJaW92WzFdLmlvdl9iYXNlID0gc2ItPnNiX2RhdGE7CisJCQlpb3ZbMV0uaW92X2xlbiA9IHNiLT5zYl93cHRyIC0gc2ItPnNiX2RhdGE7CisJCQlpZiAoaW92WzFdLmlvdl9sZW4gPiBsZW4pIGlvdlsxXS5pb3ZfbGVuID0gbGVuOworCQkJbiA9IDI7CisJCX0gZWxzZQorCQkJbiA9IDE7CisJfQorCS8qIENoZWNrIGlmIHRoZXJlJ3MgdXJnZW50IGRhdGEgdG8gc2VuZCwgYW5kIGlmIHNvLCBzZW5kIGl0ICovCisKKyNpZmRlZiBIQVZFX1JFQURWCisJbm4gPSB3cml0ZXYoc28tPnMsIChjb25zdCBzdHJ1Y3QgaW92ZWMgKilpb3YsIG4pOworCisJREVCVUdfTUlTQygoZGZkLCAiICAuLi4gd3JvdGUgbm4gPSAlZCBieXRlc1xuIiwgbm4pKTsKKyNlbHNlCisJbm4gPSBzbGlycF9zZW5kKHNvLCBpb3ZbMF0uaW92X2Jhc2UsIGlvdlswXS5pb3ZfbGVuLDApOworI2VuZGlmCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgcGVvcGxlIHRlbGwgbWUgaXQgZG9lcyAqc2hydWcqICovCisJaWYgKG5uIDwgMCAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobm4gPD0gMCkgeworCQlERUJVR19NSVNDKChkZmQsICIgLS0tIHNvd3JpdGUgZGlzY29ubmVjdGVkLCBzby0+c29fc3RhdGUgPSAleCwgZXJybm8gPSAlZFxuIiwKKwkJCXNvLT5zb19zdGF0ZSwgZXJybm8pKTsKKwkJc29mY2FudHNlbmRtb3JlKHNvKTsKKwkJdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZm5kZWYgSEFWRV9SRUFEVgorCWlmIChuID09IDIgJiYgbm4gPT0gaW92WzBdLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICByZXQgPSBzbGlycF9zZW5kKHNvLCBpb3ZbMV0uaW92X2Jhc2UsIGlvdlsxXS5pb3ZfbGVuLDApOworICAgICAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICAgICAgbm4gKz0gcmV0OworICAgICAgICB9CisgICAgICAgIERFQlVHX01JU0MoKGRmZCwgIiAgLi4uIHdyb3RlIG5uID0gJWQgYnl0ZXNcbiIsIG5uKSk7CisjZW5kaWYKKworCS8qIFVwZGF0ZSBzYnVmICovCisJc2ItPnNiX2NjIC09IG5uOworCXNiLT5zYl9ycHRyICs9IG5uOworCWlmIChzYi0+c2JfcnB0ciA+PSAoc2ItPnNiX2RhdGEgKyBzYi0+c2JfZGF0YWxlbikpCisJCXNiLT5zYl9ycHRyIC09IHNiLT5zYl9kYXRhbGVuOworCisJLyoKKwkgKiBJZiBpbiBEUkFJTiBtb2RlLCBhbmQgdGhlcmUncyBubyBtb3JlIGRhdGEsIHNldAorCSAqIGl0IENBTlRTRU5ETU9SRQorCSAqLworCWlmICgoc28tPnNvX3N0YXRlICYgU1NfRldEUkFJTikgJiYgc2ItPnNiX2NjID09IDApCisJCXNvZmNhbnRzZW5kbW9yZShzbyk7CisKKwlyZXR1cm4gbm47Cit9CisKKy8qCisgKiByZWN2ZnJvbSgpIGEgVURQIHNvY2tldAorICovCit2b2lkCitzb3JlY3Zmcm9tKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisKKwlERUJVR19DQUxMKCJzb3JlY3Zmcm9tIik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKworCWlmIChzby0+c29fdHlwZSA9PSBJUFBST1RPX0lDTVApIHsgICAvKiBUaGlzIGlzIGEgInBpbmciIHJlcGx5ICovCisJICBjaGFyIGJ1ZmZbMjU2XTsKKwkgIGludCBsZW47CisKKwkgIGxlbiA9IHJlY3Zmcm9tKHNvLT5zLCBidWZmLCAyNTYsIDAsCisJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7CisJICAvKiBYWFggQ2hlY2sgaWYgcmVwbHkgaXMgImNvcnJlY3QiPyAqLworCisJICBpZihsZW4gPT0gLTEgfHwgbGVuID09IDApIHsKKwkgICAgdV9jaGFyIGNvZGU9SUNNUF9VTlJFQUNIX1BPUlQ7CisKKwkgICAgaWYoZXJybm8gPT0gRUhPU1RVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9IT1NUOworCSAgICBlbHNlIGlmKGVycm5vID09IEVORVRVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9ORVQ7CisKKwkgICAgREVCVUdfTUlTQygoZGZkLCIgdWRwIGljbXAgcnggZXJybm8gPSAlZC0lc1xuIiwKKwkJCWVycm5vLHN0cmVycm9yKGVycm5vKSkpOworCSAgICBpY21wX2Vycm9yKHNvLT5zb19tLCBJQ01QX1VOUkVBQ0gsY29kZSwgMCxzdHJlcnJvcihlcnJubykpOworCSAgfSBlbHNlIHsKKwkgICAgaWNtcF9yZWZsZWN0KHNvLT5zb19tKTsKKyAgICAgICAgICAgIHNvLT5zb19tID0gTlVMTDsgLyogRG9uJ3QgbV9mcmVlKCkgaXQgYWdhaW4hICovCisJICB9CisJICAvKiBObyBuZWVkIGZvciB0aGlzIHNvY2tldCBhbnltb3JlLCB1ZHBfZGV0YWNoIGl0ICovCisJICB1ZHBfZGV0YWNoKHNvKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLyogQSAibm9ybWFsIiBVRFAgcGFja2V0ICovCisJICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgICAgICAgICBpbnQgbGVuOworI2lmZGVmIF9XSU4zMgorICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKyNlbHNlCisgICAgICAgICAgaW50IG47CisjZW5kaWYKKworCSAgaWYgKCEobSA9IG1fZ2V0KCkpKSByZXR1cm47CisJICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKworCSAgLyoKKwkgICAqIFhYWCBTaG91bGRuJ3QgRklPTlJFQUQgcGFja2V0cyBkZXN0aW5lZCBmb3IgcG9ydCA1MywKKwkgICAqIGJ1dCBJIGRvbid0IGtub3cgdGhlIG1heCBwYWNrZXQgc2l6ZSBmb3IgRE5TIGxvb2t1cHMKKwkgICAqLworCSAgbGVuID0gTV9GUkVFUk9PTShtKTsKKwkgIC8qIGlmIChzby0+c29fZnBvcnQgIT0gaHRvbnMoNTMpKSB7ICovCisJICBpb2N0bHNvY2tldChzby0+cywgRklPTlJFQUQsICZuKTsKKworCSAgaWYgKG4gPiBsZW4pIHsKKwkgICAgbiA9IChtLT5tX2RhdGEgLSBtLT5tX2RhdCkgKyBtLT5tX2xlbiArIG4gKyAxOworCSAgICBtX2luYyhtLCBuKTsKKwkgICAgbGVuID0gTV9GUkVFUk9PTShtKTsKKwkgIH0KKwkgIC8qIH0gKi8KKworCSAgbS0+bV9sZW4gPSByZWN2ZnJvbShzby0+cywgbS0+bV9kYXRhLCBsZW4sIDAsCisJCQkgICAgICAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKTsKKwkgIERFQlVHX01JU0MoKGRmZCwgIiBkaWQgcmVjdmZyb20gJWQsIGVycm5vID0gJWQtJXNcbiIsCisJCSAgICAgIG0tPm1fbGVuLCBlcnJubyxzdHJlcnJvcihlcnJubykpKTsKKwkgIGlmKG0tPm1fbGVuPDApIHsKKwkgICAgdV9jaGFyIGNvZGU9SUNNUF9VTlJFQUNIX1BPUlQ7CisKKwkgICAgaWYoZXJybm8gPT0gRUhPU1RVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9IT1NUOworCSAgICBlbHNlIGlmKGVycm5vID09IEVORVRVTlJFQUNIKSBjb2RlPUlDTVBfVU5SRUFDSF9ORVQ7CisKKwkgICAgREVCVUdfTUlTQygoZGZkLCIgcnggZXJyb3IsIHR4IGljbXAgSUNNUF9VTlJFQUNIOiVpXG4iLCBjb2RlKSk7CisJICAgIGljbXBfZXJyb3Ioc28tPnNvX20sIElDTVBfVU5SRUFDSCxjb2RlLCAwLHN0cmVycm9yKGVycm5vKSk7CisJICAgIG1fZnJlZShtKTsKKwkgIH0gZWxzZSB7CisJICAvKgorCSAgICogSGFjazogZG9tYWluIG5hbWUgbG9va3VwIHdpbGwgYmUgdXNlZCB0aGUgbW9zdCBmb3IgVURQLAorCSAgICogYW5kIHNpbmNlIHRoZXknbGwgb25seSBiZSB1c2VkIG9uY2UgdGhlcmUncyBubyBuZWVkCisJICAgKiBmb3IgdGhlIDQgbWludXRlIChvciB3aGF0ZXZlcikgdGltZW91dC4uLiBTbyB3ZSB0aW1lIHRoZW0KKwkgICAqIG91dCBtdWNoIHF1aWNrZXIgKDEwIHNlY29uZHMgIGZvciBub3cuLi4pCisJICAgKi8KKwkgICAgaWYgKHNvLT5zb19leHBpcmUpIHsKKwkgICAgICBpZiAoc28tPnNvX2Zwb3J0ID09IGh0b25zKDUzKSkKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkVGQVNUOworCSAgICAgIGVsc2UKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisJICAgIH0KKworCSAgICAvKgkJaWYgKG0tPm1fbGVuID09IGxlbikgeworCSAgICAgKgkJCW1faW5jKG0sIE1JTkNTSVpFKTsKKwkgICAgICoJCQltLT5tX2xlbiA9IDA7CisJICAgICAqCQl9CisJICAgICAqLworCisJICAgIC8qCisJICAgICAqIElmIHRoaXMgcGFja2V0IHdhcyBkZXN0aW5lZCBmb3IgQ1RMX0FERFIsCisJICAgICAqIG1ha2UgaXQgbG9vayBsaWtlIHRoYXQncyB3aGVyZSBpdCBjYW1lIGZyb20sIGRvbmUgYnkgdWRwX291dHB1dAorCSAgICAgKi8KKwkgICAgdWRwX291dHB1dChzbywgbSwgJmFkZHIpOworCSAgfSAvKiByeCBlcnJvciAqLworCX0gLyogaWYgcGluZyBwYWNrZXQgKi8KK30KKworLyoKKyAqIHNlbmR0bygpIGEgc29ja2V0CisgKi8KK2ludAorc29zZW5kdG8oc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCWludCByZXQ7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisKKwlERUJVR19DQUxMKCJzb3NlbmR0byIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisKKyAgICAgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpZiAoKHNvLT5zb19mYWRkci5zX2FkZHIgJiBodG9ubCgweGZmZmZmZjAwKSkgPT0gc3BlY2lhbF9hZGRyLnNfYWRkcikgeworCSAgLyogSXQncyBhbiBhbGlhcyAqLworCSAgc3dpdGNoKG50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpICYgMHhmZikgeworCSAgY2FzZSBDVExfRE5TOgorCSAgICBhZGRyLnNpbl9hZGRyID0gZG5zX2FkZHI7CisJICAgIGJyZWFrOworCSAgY2FzZSBDVExfQUxJQVM6CisJICBkZWZhdWx0OgorCSAgICBhZGRyLnNpbl9hZGRyID0gbG9vcGJhY2tfYWRkcjsKKwkgICAgYnJlYWs7CisJICB9CisJfSBlbHNlCisJICBhZGRyLnNpbl9hZGRyID0gc28tPnNvX2ZhZGRyOworCWFkZHIuc2luX3BvcnQgPSBzby0+c29fZnBvcnQ7CisKKwlERUJVR19NSVNDKChkZmQsICIgc2VuZHRvKClpbmcsIGFkZHIuc2luX3BvcnQ9JWQsIGFkZHIuc2luX2FkZHIuc19hZGRyPSUuMTZzXG4iLCBudG9ocyhhZGRyLnNpbl9wb3J0KSwgaW5ldF9udG9hKGFkZHIuc2luX2FkZHIpKSk7CisKKwkvKiBEb24ndCBjYXJlIHdoYXQgcG9ydCB3ZSBnZXQgKi8KKwlyZXQgPSBzZW5kdG8oc28tPnMsIG0tPm1fZGF0YSwgbS0+bV9sZW4sIDAsCisJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEtpbGwgdGhlIHNvY2tldCBpZiB0aGVyZSdzIG5vIHJlcGx5IGluIDQgbWludXRlcywKKwkgKiBidXQgb25seSBpZiBpdCdzIGFuIGV4cGlyYWJsZSBzb2NrZXQKKwkgKi8KKwlpZiAoc28tPnNvX2V4cGlyZSkKKwkJc28tPnNvX2V4cGlyZSA9IGN1cnRpbWUgKyBTT19FWFBJUkU7CisJc28tPnNvX3N0YXRlID0gU1NfSVNGQ09OTkVDVEVEOyAvKiBTbyB0aGF0IGl0IGdldHMgc2VsZWN0KCllZCAqLworCXJldHVybiAwOworfQorCisvKgorICogWFhYIFRoaXMgc2hvdWxkIHJlYWxseSBiZSB0Y3BfbGlzdGVuCisgKi8KK3N0cnVjdCBzb2NrZXQgKgorc29saXN0ZW4odV9pbnQgcG9ydCwgdV9pbnQzMl90IGxhZGRyLCB1X2ludCBscG9ydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXN0cnVjdCBzb2NrZXQgKnNvOworCWludCBzLCBvcHQgPSAxOworCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworCisJREVCVUdfQ0FMTCgic29saXN0ZW4iKTsKKwlERUJVR19BUkcoInBvcnQgPSAlZCIsIHBvcnQpOworCURFQlVHX0FSRygibGFkZHIgPSAleCIsIGxhZGRyKTsKKwlERUJVR19BUkcoImxwb3J0ID0gJWQiLCBscG9ydCk7CisJREVCVUdfQVJHKCJmbGFncyA9ICV4IiwgZmxhZ3MpOworCisJaWYgKChzbyA9IHNvY3JlYXRlKCkpID09IE5VTEwpIHsKKwkgIC8qIGZyZWUoc28pOyAgICAgIE5vdCBzb2ZyZWUoKSA/Pz8gZnJlZShOVUxMKSA9PSBOT1AgKi8KKwkgIHJldHVybiBOVUxMOworCX0KKworCS8qIERvbid0IHRjcF9hdHRhY2guLi4gd2UgZG9uJ3QgbmVlZCBzb19zbmQgbm9yIHNvX3JjdiAqLworCWlmICgoc28tPnNvX3RjcGNiID0gdGNwX25ld3RjcGNiKHNvKSkgPT0gTlVMTCkgeworCQlmcmVlKHNvKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWluc3F1ZShzbywmdGNiKTsKKworCS8qCisJICogU1NfRkFDQ0VQVE9OQ0Ugc29ja2V0cyBtdXN0IHRpbWUgb3V0LgorCSAqLworCWlmIChmbGFncyAmIFNTX0ZBQ0NFUFRPTkNFKQorCSAgIHNvLT5zb190Y3BjYi0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUKjI7CisKKwlzby0+c29fc3RhdGUgPSAoU1NfRkFDQ0VQVENPTk58ZmxhZ3MpOworCXNvLT5zb19scG9ydCA9IGxwb3J0OyAvKiBLZXB0IGluIG5ldHdvcmsgZm9ybWF0ICovCisJc28tPnNvX2xhZGRyLnNfYWRkciA9IGxhZGRyOyAvKiBEaXR0byAqLworCisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJYWRkci5zaW5fcG9ydCA9IHBvcnQ7CisKKwlpZiAoKChzID0gc29ja2V0KEFGX0lORVQsU09DS19TVFJFQU0sMCkpIDwgMCkgfHwKKwkgICAgKHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpIDwgMCkgfHwKKwkgICAgKGJpbmQocywoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB8fAorCSAgICAobGlzdGVuKHMsMSkgPCAwKSkgeworCQlpbnQgdG1wZXJybm8gPSBlcnJubzsgLyogRG9uJ3QgY2xvYmJlciB0aGUgcmVhbCByZWFzb24gd2UgZmFpbGVkICovCisKKwkJY2xvc2Uocyk7CisJCXNvZnJlZShzbyk7CisJCS8qIFJlc3RvcmUgdGhlIHJlYWwgZXJybm8gKi8KKyNpZmRlZiBfV0lOMzIKKwkJV1NBU2V0TGFzdEVycm9yKHRtcGVycm5vKTsKKyNlbHNlCisJCWVycm5vID0gdG1wZXJybm87CisjZW5kaWYKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOworCisJZ2V0c29ja25hbWUocywoc3RydWN0IHNvY2thZGRyICopJmFkZHIsJmFkZHJsZW4pOworCXNvLT5zb19mcG9ydCA9IGFkZHIuc2luX3BvcnQ7CisJaWYgKGFkZHIuc2luX2FkZHIuc19hZGRyID09IDAgfHwgYWRkci5zaW5fYWRkci5zX2FkZHIgPT0gbG9vcGJhY2tfYWRkci5zX2FkZHIpCisJICAgc28tPnNvX2ZhZGRyID0gYWxpYXNfYWRkcjsKKwllbHNlCisJICAgc28tPnNvX2ZhZGRyID0gYWRkci5zaW5fYWRkcjsKKworCXNvLT5zID0gczsKKwlyZXR1cm4gc287Cit9CisKKyNpZiAwCisvKgorICogRGF0YSBpcyBhdmFpbGFibGUgaW4gc29fcmN2CisgKiBKdXN0IHdyaXRlKCkgdGhlIGRhdGEgdG8gdGhlIHNvY2tldAorICogWFhYIG5vdCB5ZXQuLi4KKyAqLworc3RhdGljIHZvaWQKK3Nvcndha2V1cChzbykKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKK3sKKy8qCXNvd3JpdGUoc28pOyAqLworLyoJRkRfQ0xSKHNvLT5zLCZ3cml0ZWZkcyk7ICovCit9CisKKy8qCisgKiBEYXRhIGhhcyBiZWVuIGZyZWVkIGluIHNvX3NuZAorICogV2UgaGF2ZSByb29tIGZvciBhIHJlYWQoKSBpZiB3ZSB3YW50IHRvCisgKiBGb3Igbm93LCBkb24ndCByZWFkLCBpdCdsbCBiZSBkb25lIGluIHRoZSBtYWluIGxvb3AKKyAqLworc3RhdGljIHZvaWQKK3Nvd3dha2V1cChzbykKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKK3sKKwkvKiBOb3RoaW5nLCB5ZXQgKi8KK30KKyNlbmRpZgorCisvKgorICogVmFyaW91cyBzZXNzaW9uIHN0YXRlIGNhbGxzCisgKiBYWFggU2hvdWxkIGJlICNkZWZpbmUncworICogVGhlIHNvY2tldCBzdGF0ZSBzdHVmZiBuZWVkcyB3b3JrLCB0aGVzZSBvZnRlbiBnZXQgY2FsbCAyIG9yIDMKKyAqIHRpbWVzIGVhY2ggd2hlbiBvbmx5IDEgd2FzIG5lZWRlZAorICovCit2b2lkCitzb2lzZmNvbm5lY3Rpbmcoc3RydWN0IHNvY2tldCAqc28pCit7CisJc28tPnNvX3N0YXRlICY9IH4oU1NfTk9GRFJFRnxTU19JU0ZDT05ORUNURUR8U1NfRkNBTlRSQ1ZNT1JFfAorCQkJICBTU19GQ0FOVFNFTkRNT1JFfFNTX0ZXRFJBSU4pOworCXNvLT5zb19zdGF0ZSB8PSBTU19JU0ZDT05ORUNUSU5HOyAvKiBDbG9iYmVyIG90aGVyIHN0YXRlcyAqLworfQorCit2b2lkCitzb2lzZmNvbm5lY3RlZChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlzby0+c29fc3RhdGUgJj0gfihTU19JU0ZDT05ORUNUSU5HfFNTX0ZXRFJBSU58U1NfTk9GRFJFRik7CisJc28tPnNvX3N0YXRlIHw9IFNTX0lTRkNPTk5FQ1RFRDsgLyogQ2xvYmJlciBvdGhlciBzdGF0ZXMgKi8KK30KKworc3RhdGljIHZvaWQKK3NvZmNhbnRyY3Ztb3JlKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWlmICgoc28tPnNvX3N0YXRlICYgU1NfTk9GRFJFRikgPT0gMCkgeworCQlzaHV0ZG93bihzby0+cywwKTsKKwkJaWYoZ2xvYmFsX3dyaXRlZmRzKSB7CisJCSAgRkRfQ0xSKHNvLT5zLGdsb2JhbF93cml0ZWZkcyk7CisJCX0KKwl9CisJc28tPnNvX3N0YXRlICY9IH4oU1NfSVNGQ09OTkVDVElORyk7CisJaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0ZDQU5UU0VORE1PUkUpCisJICAgc28tPnNvX3N0YXRlID0gU1NfTk9GRFJFRjsgLyogRG9uJ3Qgc2VsZWN0IGl0ICovIC8qIFhYWCBjbG9zZSgpIGhlcmUgYXMgd2VsbD8gKi8KKwllbHNlCisJICAgc28tPnNvX3N0YXRlIHw9IFNTX0ZDQU5UUkNWTU9SRTsKK30KKworc3RhdGljIHZvaWQKK3NvZmNhbnRzZW5kbW9yZShzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX05PRkRSRUYpID09IDApIHsKKyAgICAgICAgICAgIHNodXRkb3duKHNvLT5zLDEpOyAgICAgICAgICAgLyogc2VuZCBGSU4gdG8gZmhvc3QgKi8KKyAgICAgICAgICAgIGlmIChnbG9iYWxfcmVhZGZkcykgeworICAgICAgICAgICAgICAgIEZEX0NMUihzby0+cyxnbG9iYWxfcmVhZGZkcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2xvYmFsX3hmZHMpIHsKKyAgICAgICAgICAgICAgICBGRF9DTFIoc28tPnMsZ2xvYmFsX3hmZHMpOworICAgICAgICAgICAgfQorCX0KKwlzby0+c29fc3RhdGUgJj0gfihTU19JU0ZDT05ORUNUSU5HKTsKKwlpZiAoc28tPnNvX3N0YXRlICYgU1NfRkNBTlRSQ1ZNT1JFKQorCSAgIHNvLT5zb19zdGF0ZSA9IFNTX05PRkRSRUY7IC8qIGFzIGFib3ZlICovCisJZWxzZQorCSAgIHNvLT5zb19zdGF0ZSB8PSBTU19GQ0FOVFNFTkRNT1JFOworfQorCit2b2lkCitzb2lzZmRpc2Nvbm5lY3RlZChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKy8qCXNvLT5zb19zdGF0ZSAmPSB+KFNTX0lTRkNPTk5FQ1RJTkd8U1NfSVNGQ09OTkVDVEVEKTsgKi8KKy8qCWNsb3NlKHNvLT5zKTsgKi8KKy8qCXNvLT5zb19zdGF0ZSA9IFNTX0lTRkRJU0NPTk5FQ1RFRDsgKi8KKwkvKgorCSAqIFhYWCBEbyBub3RoaW5nIC4uLiA/CisJICovCit9CisKKy8qCisgKiBTZXQgd3JpdGUgZHJhaW4gbW9kZQorICogU2V0IENBTlRTRU5ETU9SRSBvbmNlIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXRlKCluCisgKi8KK3ZvaWQKK3NvZndkcmFpbihzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpZiAoc28tPnNvX3Jjdi5zYl9jYykKKwkJc28tPnNvX3N0YXRlIHw9IFNTX0ZXRFJBSU47CisJZWxzZQorCQlzb2ZjYW50c2VuZG1vcmUoc28pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC9zb2NrZXQuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhZGFiYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvc29ja2V0LmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisvKiBNSU5FICovCisKKyNpZm5kZWYgX1NMSVJQX1NPQ0tFVF9IXworI2RlZmluZSBfU0xJUlBfU09DS0VUX0hfCisKKyNkZWZpbmUgU09fRVhQSVJFIDI0MDAwMAorI2RlZmluZSBTT19FWFBJUkVGQVNUIDEwMDAwCisKKy8qCisgKiBPdXIgc29ja2V0IHN0cnVjdHVyZQorICovCisKK3N0cnVjdCBzb2NrZXQgeworICBzdHJ1Y3Qgc29ja2V0ICpzb19uZXh0LCpzb19wcmV2OyAgICAgIC8qIEZvciBhIGxpbmtlZCBsaXN0IG9mIHNvY2tldHMgKi8KKworICBpbnQgczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgYWN0dWFsIHNvY2tldCAqLworCisJCQkvKiBYWFggdW5pb24gdGhlc2Ugd2l0aCBub3QteWV0LXVzZWQgc2J1ZiBwYXJhbXMgKi8KKyAgc3RydWN0IG1idWYgKnNvX207CSAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgU1lOIHBhY2tldCwKKwkJCQkgICAgKiBmb3Igbm9uLWJsb2NraW5nIGNvbm5lY3QoKSdzLCBhbmQKKwkJCQkgICAgKiBQSU5HIHJlcGx5J3MgKi8KKyAgc3RydWN0IHRjcGlwaGRyICpzb190aTsJICAgLyogUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgdGkgd2l0aGluCisJCQkJICAgICogc29fbWNvbm4sIGZvciBub24tYmxvY2tpbmcgY29ubmVjdGlvbnMgKi8KKyAgaW50IHNvX3VyZ2M7CisgIHN0cnVjdCBpbl9hZGRyIHNvX2ZhZGRyOwkgICAvKiBmb3JlaWduIGhvc3QgdGFibGUgZW50cnkgKi8KKyAgc3RydWN0IGluX2FkZHIgc29fbGFkZHI7CSAgIC8qIGxvY2FsIGhvc3QgdGFibGUgZW50cnkgKi8KKyAgdV9pbnQxNl90IHNvX2Zwb3J0OwkJICAgLyogZm9yZWlnbiBwb3J0ICovCisgIHVfaW50MTZfdCBzb19scG9ydDsJCSAgIC8qIGxvY2FsIHBvcnQgKi8KKworICB1X2ludDhfdAlzb19pcHRvczsJLyogVHlwZSBvZiBzZXJ2aWNlICovCisgIHVfaW50OF90CXNvX2VtdTsJCS8qIElzIHRoZSBzb2NrZXQgZW11bGF0ZWQ/ICovCisKKyAgdV9jaGFyCXNvX3R5cGU7CQkvKiBUeXBlIG9mIHNvY2tldCwgVURQIG9yIFRDUCAqLworICBpbnQJc29fc3RhdGU7CQkvKiBpbnRlcm5hbCBzdGF0ZSBmbGFncyBTU18qLCBiZWxvdyAqLworCisgIHN0cnVjdCAJdGNwY2IgKnNvX3RjcGNiOwkvKiBwb2ludGVyIHRvIFRDUCBwcm90b2NvbCBjb250cm9sIGJsb2NrICovCisgIHVfaW50CXNvX2V4cGlyZTsJCS8qIFdoZW4gdGhlIHNvY2tldCB3aWxsIGV4cGlyZSAqLworCisgIGludAlzb19xdWV1ZWQ7CQkvKiBOdW1iZXIgb2YgcGFja2V0cyBxdWV1ZWQgZnJvbSB0aGlzIHNvY2tldCAqLworICBpbnQJc29fbnF1ZXVlZDsJCS8qIE51bWJlciBvZiBwYWNrZXRzIHF1ZXVlZCBpbiBhIHJvdworCQkJCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gImRvd25ncmFkZSIgYSBzZXNzaW9uCisJCQkJCSAqIGZyb20gZmFzdHEgdG8gYmF0Y2hxICovCisKKyAgc3RydWN0IHNidWYgc29fcmN2OwkJLyogUmVjZWl2ZSBidWZmZXIgKi8KKyAgc3RydWN0IHNidWYgc29fc25kOwkJLyogU2VuZCBidWZmZXIgKi8KKyAgdm9pZCAqIGV4dHJhOwkJCS8qIEV4dHJhIHBvaW50ZXIgKi8KK307CisKKworLyoKKyAqIFNvY2tldCBzdGF0ZSBiaXRzLiAocGVlciBtZWFucyB0aGUgaG9zdCBvbiB0aGUgSW50ZXJuZXQsCisgKiBsb2NhbCBob3N0IG1lYW5zIHRoZSBob3N0IG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlIG1vZGVtKQorICovCisjZGVmaW5lIFNTX05PRkRSRUYJCTB4MDAxCS8qIE5vIGZkIHJlZmVyZW5jZSAqLworCisjZGVmaW5lIFNTX0lTRkNPTk5FQ1RJTkcJMHgwMDIJLyogU29ja2V0IGlzIGNvbm5lY3RpbmcgdG8gcGVlciAobm9uLWJsb2NraW5nIGNvbm5lY3QoKSdzKSAqLworI2RlZmluZSBTU19JU0ZDT05ORUNURUQJCTB4MDA0CS8qIFNvY2tldCBpcyBjb25uZWN0ZWQgdG8gcGVlciAqLworI2RlZmluZSBTU19GQ0FOVFJDVk1PUkUJCTB4MDA4CS8qIFNvY2tldCBjYW4ndCByZWNlaXZlIG1vcmUgZnJvbSBwZWVyIChmb3IgaGFsZi1jbG9zZXMpICovCisjZGVmaW5lIFNTX0ZDQU5UU0VORE1PUkUJMHgwMTAJLyogU29ja2V0IGNhbid0IHNlbmQgbW9yZSB0byBwZWVyIChmb3IgaGFsZi1jbG9zZXMpICovCisvKiAjZGVmaW5lIFNTX0lTRkRJU0NPTk5FQ1RFRAkweDAyMCovCS8qIFNvY2tldCBoYXMgZGlzY29ubmVjdGVkIGZyb20gcGVlciwgaW4gMk1TTCBzdGF0ZSAqLworI2RlZmluZSBTU19GV0RSQUlOCQkweDA0MAkvKiBXZSByZWNlaXZlZCBhIEZJTiwgZHJhaW4gZGF0YSBhbmQgc2V0IFNTX0ZDQU5UU0VORE1PUkUgKi8KKworI2RlZmluZSBTU19DVEwJCQkweDA4MAorI2RlZmluZSBTU19GQUNDRVBUQ09OTgkJMHgxMDAJLyogU29ja2V0IGlzIGFjY2VwdGluZyBjb25uZWN0aW9ucyBmcm9tIGEgaG9zdCBvbiB0aGUgaW50ZXJuZXQgKi8KKyNkZWZpbmUgU1NfRkFDQ0VQVE9OQ0UJCTB4MjAwCS8qIElmIHNldCwgdGhlIFNTX0ZBQ0NFUFRDT05OIHNvY2tldCB3aWxsIGRpZSBhZnRlciBvbmUgYWNjZXB0ICovCisKK2V4dGVybiBzdHJ1Y3Qgc29ja2V0IHRjYjsKKworc3RydWN0IHNvY2tldCAqIHNvbG9va3VwIF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBpbl9hZGRyLCB1X2ludCwgc3RydWN0IGluX2FkZHIsIHVfaW50KSk7CitzdHJ1Y3Qgc29ja2V0ICogc29jcmVhdGUgX1AoKHZvaWQpKTsKK3ZvaWQgc29mcmVlIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK2ludCBzb3JlYWQgX1AoKHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCBzb3JlY3Zvb2IgX1AoKHN0cnVjdCBzb2NrZXQgKikpOworaW50IHNvc2VuZG9vYiBfUCgoc3RydWN0IHNvY2tldCAqKSk7CitpbnQgc293cml0ZSBfUCgoc3RydWN0IHNvY2tldCAqKSk7Cit2b2lkIHNvcmVjdmZyb20gX1AoKHN0cnVjdCBzb2NrZXQgKikpOworaW50IHNvc2VuZHRvIF9QKChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtYnVmICopKTsKK3N0cnVjdCBzb2NrZXQgKiBzb2xpc3RlbiBfUCgodV9pbnQsIHVfaW50MzJfdCwgdV9pbnQsIGludCkpOwordm9pZCBzb2lzZmNvbm5lY3RpbmcgX1AoKHJlZ2lzdGVyIHN0cnVjdCBzb2NrZXQgKikpOwordm9pZCBzb2lzZmNvbm5lY3RlZCBfUCgocmVnaXN0ZXIgc3RydWN0IHNvY2tldCAqKSk7Cit2b2lkIHNvaXNmZGlzY29ubmVjdGVkIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3ZvaWQgc29md2RyYWluIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3N0cnVjdCBpb3ZlYzsgLyogRm9yIHdpbjMyICovCitzaXplX3Qgc29wcmVwcmJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgc3RydWN0IGlvdmVjICppb3YsIGludCAqbnApOworaW50IHNvcmVhZGJ1ZihzdHJ1Y3Qgc29ja2V0ICpzbywgY29uc3QgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisKKyNlbmRpZiAvKiBfU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcC5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC90Y3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBjNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC90Y3AuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3AuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiB0Y3AuaCx2IDEuMyAxOTk0LzA4LzIxIDA1OjI3OjM0IHBhdWwgRXhwCisgKi8KKworI2lmbmRlZiBfVENQX0hfCisjZGVmaW5lIF9UQ1BfSF8KKwordHlwZWRlZgl1X2ludDMyX3QJdGNwX3NlcTsKKworI2RlZmluZSAgICAgIFBSX1NMT1dIWiAgICAgICAyICAgICAgICAgICAgICAgLyogMiBzbG93IHRpbWVvdXRzIHBlciBzZWNvbmQgKGFwcHJveCkgKi8KKyNkZWZpbmUgICAgICBQUl9GQVNUSFogICAgICAgNSAgICAgICAgICAgICAgIC8qIDUgZmFzdCB0aW1lb3V0cyBwZXIgc2Vjb25kIChub3QgaW1wb3J0YW50KSAqLworCitleHRlcm4gc3RydWN0IHNvY2tldCAqdGNwX2xhc3Rfc287CisKKyNkZWZpbmUgVENQX1NORFNQQUNFIDgxOTIKKyNkZWZpbmUgVENQX1JDVlNQQUNFIDgxOTIKKworLyoKKyAqIFRDUCBoZWFkZXIuCisgKiBQZXIgUkZDIDc5MywgU2VwdGVtYmVyLCAxOTgxLgorICovCitzdHJ1Y3QgdGNwaGRyIHsKKwl1X2ludDE2X3QJdGhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworCXVfaW50MTZfdAl0aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwl0Y3Bfc2VxCXRoX3NlcTsJCQkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl0Y3Bfc2VxCXRoX2FjazsJCQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKwl1X2ludAl0aF9vZmY6NCwJCS8qIGRhdGEgb2Zmc2V0ICovCisJCXRoX3gyOjQ7CQkvKiAodW51c2VkKSAqLworI2Vsc2UKKwl1X2ludAl0aF94Mjo0LAkJLyogKHVudXNlZCkgKi8KKwkJdGhfb2ZmOjQ7CQkvKiBkYXRhIG9mZnNldCAqLworI2VuZGlmCisJdV9pbnQ4X3QJdGhfZmxhZ3M7CisjZGVmaW5lCVRIX0ZJTgkweDAxCisjZGVmaW5lCVRIX1NZTgkweDAyCisjZGVmaW5lCVRIX1JTVAkweDA0CisjZGVmaW5lCVRIX1BVU0gJMHgwOAorI2RlZmluZQlUSF9BQ0sJMHgxMAorI2RlZmluZQlUSF9VUkcJMHgyMAorCXVfaW50MTZfdAl0aF93aW47CQkJLyogd2luZG93ICovCisJdV9pbnQxNl90CXRoX3N1bTsJCQkvKiBjaGVja3N1bSAqLworCXVfaW50MTZfdAl0aF91cnA7CQkJLyogdXJnZW50IHBvaW50ZXIgKi8KK307CisKKyNpbmNsdWRlICJ0Y3BfdmFyLmgiCisKKyNkZWZpbmUJVENQT1BUX0VPTAkJMAorI2RlZmluZQlUQ1BPUFRfTk9QCQkxCisjZGVmaW5lCVRDUE9QVF9NQVhTRUcJCTIKKyNkZWZpbmUgICAgVENQT0xFTl9NQVhTRUcJCTQKKyNkZWZpbmUgVENQT1BUX1dJTkRPVwkJMworI2RlZmluZSAgICBUQ1BPTEVOX1dJTkRPVwkJMworI2RlZmluZSBUQ1BPUFRfU0FDS19QRVJNSVRURUQJNAkJLyogRXhwZXJpbWVudGFsICovCisjZGVmaW5lICAgIFRDUE9MRU5fU0FDS19QRVJNSVRURUQJMgorI2RlZmluZSBUQ1BPUFRfU0FDSwkJNQkJLyogRXhwZXJpbWVudGFsICovCisjZGVmaW5lIFRDUE9QVF9USU1FU1RBTVAJOAorI2RlZmluZSAgICBUQ1BPTEVOX1RJTUVTVEFNUAkJMTAKKyNkZWZpbmUgICAgVENQT0xFTl9UU1RBTVBfQVBQQQkJKFRDUE9MRU5fVElNRVNUQU1QKzIpIC8qIGFwcGVuZGl4IEEgKi8KKworI2RlZmluZSBUQ1BPUFRfVFNUQU1QX0hEUglcCisgICAgKFRDUE9QVF9OT1A8PDI0fFRDUE9QVF9OT1A8PDE2fFRDUE9QVF9USU1FU1RBTVA8PDh8VENQT0xFTl9USU1FU1RBTVApCisKKy8qCisgKiBEZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplIGZvciBUQ1AuCisgKiBXaXRoIGFuIElQIE1TUyBvZiA1NzYsIHRoaXMgaXMgNTM2LAorICogYnV0IDUxMiBpcyBwcm9iYWJseSBtb3JlIGNvbnZlbmllbnQuCisgKiBUaGlzIHNob3VsZCBiZSBkZWZpbmVkIGFzIE1JTig1MTIsIElQX01TUyAtIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSkuCisgKgorICogV2UgbWFrZSB0aGlzIDE0NjAgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgRXRoZXJuZXQgaW4gdGhlIHFlbXUgY29udGV4dC4KKyAqLworI2RlZmluZQlUQ1BfTVNTCTE0NjAKKworI2RlZmluZQlUQ1BfTUFYV0lOCTY1NTM1CS8qIGxhcmdlc3QgdmFsdWUgZm9yICh1bnNjYWxlZCkgd2luZG93ICovCisKKyNkZWZpbmUgVENQX01BWF9XSU5TSElGVAkxNAkvKiBtYXhpbXVtIHdpbmRvdyBzaGlmdCAqLworCisvKgorICogVXNlci1zZXR0YWJsZSBvcHRpb25zICh1c2VkIHdpdGggc2V0c29ja29wdCkuCisgKgorICogV2UgZG9uJ3QgdXNlIHRoZSBzeXN0ZW0gaGVhZGVycyBvbiB1bml4IGJlY2F1c2Ugd2UgaGF2ZSBjb25mbGljdGluZworICogbG9jYWwgc3RydWN0dXJlcy4gV2UgY2FuJ3QgYXZvaWQgdGhlIHN5c3RlbSBkZWZpbml0aW9ucyBvbiBXaW5kb3dzLAorICogc28gd2UgdW5kZWZpbmUgdGhlbS4KKyAqLworI3VuZGVmIFRDUF9OT0RFTEFZCisjZGVmaW5lCVRDUF9OT0RFTEFZCTB4MDEJLyogZG9uJ3QgZGVsYXkgc2VuZCB0byBjb2FsZXNjZSBwYWNrZXRzICovCisjdW5kZWYgVENQX01BWFNFRworLyogI2RlZmluZQlUQ1BfTUFYU0VHCTB4MDIgKi8JLyogc2V0IG1heGltdW0gc2VnbWVudCBzaXplICovCisKKy8qCisgKiBUQ1AgRlNNIHN0YXRlIGRlZmluaXRpb25zLgorICogUGVyIFJGQzc5MywgU2VwdGVtYmVyLCAxOTgxLgorICovCisKKyNkZWZpbmUgVENQX05TVEFURVMgICAgIDExCisKKyNkZWZpbmUgVENQU19DTE9TRUQgICAgICAgICAgICAgMCAgICAgICAvKiBjbG9zZWQgKi8KKyNkZWZpbmUgVENQU19MSVNURU4gICAgICAgICAgICAgMSAgICAgICAvKiBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgVENQU19TWU5fU0VOVCAgICAgICAgICAgMiAgICAgICAvKiBhY3RpdmUsIGhhdmUgc2VudCBzeW4gKi8KKyNkZWZpbmUgVENQU19TWU5fUkVDRUlWRUQgICAgICAgMyAgICAgICAvKiBoYXZlIHNlbmQgYW5kIHJlY2VpdmVkIHN5biAqLworLyogc3RhdGVzIDwgVENQU19FU1RBQkxJU0hFRCBhcmUgdGhvc2Ugd2hlcmUgY29ubmVjdGlvbnMgbm90IGVzdGFibGlzaGVkICovCisjZGVmaW5lIFRDUFNfRVNUQUJMSVNIRUQgICAgICAgIDQgICAgICAgLyogZXN0YWJsaXNoZWQgKi8KKyNkZWZpbmUgVENQU19DTE9TRV9XQUlUICAgICAgICAgNSAgICAgICAvKiByY3ZkIGZpbiwgd2FpdGluZyBmb3IgY2xvc2UgKi8KKy8qIHN0YXRlcyA+IFRDUFNfQ0xPU0VfV0FJVCBhcmUgdGhvc2Ugd2hlcmUgdXNlciBoYXMgY2xvc2VkICovCisjZGVmaW5lIFRDUFNfRklOX1dBSVRfMSAgICAgICAgIDYgICAgICAgLyogaGF2ZSBjbG9zZWQsIHNlbnQgZmluICovCisjZGVmaW5lIFRDUFNfQ0xPU0lORyAgICAgICAgICAgIDcgICAgICAgLyogY2xvc2VkIHhjaGQgRklOOyBhd2FpdCBGSU4gQUNLICovCisjZGVmaW5lIFRDUFNfTEFTVF9BQ0sgICAgICAgICAgIDggICAgICAgLyogaGFkIGZpbiBhbmQgY2xvc2U7IGF3YWl0IEZJTiBBQ0sgKi8KKy8qIHN0YXRlcyA+IFRDUFNfQ0xPU0VfV0FJVCAmJiA8IFRDUFNfRklOX1dBSVRfMiBhd2FpdCBBQ0sgb2YgRklOICovCisjZGVmaW5lIFRDUFNfRklOX1dBSVRfMiAgICAgICAgIDkgICAgICAgLyogaGF2ZSBjbG9zZWQsIGZpbiBpcyBhY2tlZCAqLworI2RlZmluZSBUQ1BTX1RJTUVfV0FJVCAgICAgICAgICAxMCAgICAgIC8qIGluIDIqbXNsIHF1aWV0IHdhaXQgYWZ0ZXIgY2xvc2UgKi8KKworI2RlZmluZSBUQ1BTX0hBVkVSQ1ZEU1lOKHMpICAgICAoKHMpID49IFRDUFNfU1lOX1JFQ0VJVkVEKQorI2RlZmluZSBUQ1BTX0hBVkVFU1RBQkxJU0hFRChzKSAoKHMpID49IFRDUFNfRVNUQUJMSVNIRUQpCisjZGVmaW5lIFRDUFNfSEFWRVJDVkRGSU4ocykgICAgICgocykgPj0gVENQU19USU1FX1dBSVQpCisKKy8qCisgKiBUQ1Agc2VxdWVuY2UgbnVtYmVycyBhcmUgMzIgYml0IGludGVnZXJzIG9wZXJhdGVkCisgKiBvbiB3aXRoIG1vZHVsYXIgYXJpdGhtZXRpYy4gIFRoZXNlIG1hY3JvcyBjYW4gYmUKKyAqIHVzZWQgdG8gY29tcGFyZSBzdWNoIGludGVnZXJzLgorICovCisjZGVmaW5lIFNFUV9MVChhLGIpICAgICAoKGludCkoKGEpLShiKSkgPCAwKQorI2RlZmluZSBTRVFfTEVRKGEsYikgICAgKChpbnQpKChhKS0oYikpIDw9IDApCisjZGVmaW5lIFNFUV9HVChhLGIpICAgICAoKGludCkoKGEpLShiKSkgPiAwKQorI2RlZmluZSBTRVFfR0VRKGEsYikgICAgKChpbnQpKChhKS0oYikpID49IDApCisKKy8qCisgKiBNYWNyb3MgdG8gaW5pdGlhbGl6ZSB0Y3Agc2VxdWVuY2UgbnVtYmVycyBmb3IKKyAqIHNlbmQgYW5kIHJlY2VpdmUgZnJvbSBpbml0aWFsIHNlbmQgYW5kIHJlY2VpdmUKKyAqIHNlcXVlbmNlIG51bWJlcnMuCisgKi8KKyNkZWZpbmUgdGNwX3JjdnNlcWluaXQodHApIFwKKyAgICAgKHRwKS0+cmN2X2FkdiA9ICh0cCktPnJjdl9ueHQgPSAodHApLT5pcnMgKyAxCisKKyNkZWZpbmUgdGNwX3NlbmRzZXFpbml0KHRwKSBcCisgICAgKHRwKS0+c25kX3VuYSA9ICh0cCktPnNuZF9ueHQgPSAodHApLT5zbmRfbWF4ID0gKHRwKS0+c25kX3VwID0gKHRwKS0+aXNzCisKKyNkZWZpbmUgVENQX0lTU0lOQ1IgICAgICgxMjUqMTAyNCkgICAgICAvKiBpbmNyZW1lbnQgZm9yIHRjcF9pc3MgZWFjaCBzZWNvbmQgKi8KKworZXh0ZXJuIHRjcF9zZXEgdGNwX2lzczsgICAgICAgICAgICAgICAgLyogdGNwIGluaXRpYWwgc2VuZCBzZXEgIyAqLworCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHRjcHN0YXRlc1tdOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwX2lucHV0LmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmVkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9pbnB1dC5jCkBAIC0wLDAgKzEsMTcyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MCwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3BfaW5wdXQuYwk4LjUgKEJlcmtlbGV5KSA0LzEwLzk0CisgKiB0Y3BfaW5wdXQuYyx2IDEuMTAgMTk5NC8xMC8xMyAxODozNjozMiB3b2xsbWFuIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKyNpbmNsdWRlICJpcF9pY21wLmgiCisKK3N0cnVjdCBzb2NrZXQgdGNiOworCisjZGVmaW5lCVRDUFJFWE1UVEhSRVNIIDMKK3N0cnVjdAlzb2NrZXQgKnRjcF9sYXN0X3NvID0gJnRjYjsKKwordGNwX3NlcSB0Y3BfaXNzOyAgICAgICAgICAgICAgICAvKiB0Y3AgaW5pdGlhbCBzZW5kIHNlcSAjICovCisKKyNkZWZpbmUgVENQX1BBV1NfSURMRQkoMjQgKiAyNCAqIDYwICogNjAgKiBQUl9TTE9XSFopCisKKy8qIGZvciBtb2R1bG8gY29tcGFyaXNvbnMgb2YgdGltZXN0YW1wcyAqLworI2RlZmluZSBUU1RNUF9MVChhLGIpCSgoaW50KSgoYSktKGIpKSA8IDApCisjZGVmaW5lIFRTVE1QX0dFUShhLGIpCSgoaW50KSgoYSktKGIpKSA+PSAwKQorCisvKgorICogSW5zZXJ0IHNlZ21lbnQgdGkgaW50byByZWFzc2VtYmx5IHF1ZXVlIG9mIHRjcCB3aXRoCisgKiBjb250cm9sIGJsb2NrIHRwLiAgUmV0dXJuIFRIX0ZJTiBpZiByZWFzc2VtYmx5IG5vdyBpbmNsdWRlcworICogYSBzZWdtZW50IHdpdGggRklOLiAgVGhlIG1hY3JvIGZvcm0gZG9lcyB0aGUgY29tbW9uIGNhc2UgaW5saW5lCisgKiAoc2VnbWVudCBpcyB0aGUgbmV4dCB0byBiZSByZWNlaXZlZCBvbiBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLAorICogYW5kIHRoZSBxdWV1ZSBpcyBlbXB0eSksIGF2b2lkaW5nIGxpbmthZ2UgaW50byBhbmQgcmVtb3ZhbAorICogZnJvbSB0aGUgcXVldWUgYW5kIHJlcGV0aXRpb24gb2YgdmFyaW91cyBjb252ZXJzaW9ucy4KKyAqIFNldCBERUxBQ0sgZm9yIHNlZ21lbnRzIHJlY2VpdmVkIGluIG9yZGVyLCBidXQgYWNrIGltbWVkaWF0ZWx5CisgKiB3aGVuIHNlZ21lbnRzIGFyZSBvdXQgb2Ygb3JkZXIgKHNvIGZhc3QgcmV0cmFuc21pdCBjYW4gd29yaykuCisgKi8KKyNpZmRlZiBUQ1BfQUNLX0hBQ0sKKyNkZWZpbmUgVENQX1JFQVNTKHRwLCB0aSwgbSwgc28sIGZsYWdzKSB7XAorICAgICAgIGlmICgodGkpLT50aV9zZXEgPT0gKHRwKS0+cmN2X254dCAmJiBcCisgICAgICAgICAgIHRjcGZyYWdfbGlzdF9lbXB0eSh0cCkgJiYgXAorICAgICAgICAgICAodHApLT50X3N0YXRlID09IFRDUFNfRVNUQUJMSVNIRUQpIHtcCisgICAgICAgICAgICAgICBpZiAodGktPnRpX2ZsYWdzICYgVEhfUFVTSCkgXAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7IFwKKyAgICAgICAgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgICAgICAgICAgICB0cC0+dF9mbGFncyB8PSBURl9ERUxBQ0s7IFwKKyAgICAgICAgICAgICAgICh0cCktPnJjdl9ueHQgKz0gKHRpKS0+dGlfbGVuOyBcCisgICAgICAgICAgICAgICBmbGFncyA9ICh0aSktPnRpX2ZsYWdzICYgVEhfRklOOyBcCisgICAgICAgICAgICAgICBTVEFUKHRjcHN0YXQudGNwc19yY3ZwYWNrKyspOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgIFNUQVQodGNwc3RhdC50Y3BzX3JjdmJ5dGUgKz0gKHRpKS0+dGlfbGVuKTsgICBcCisgICAgICAgICAgICAgICBpZiAoc28tPnNvX2VtdSkgeyBcCisJCSAgICAgICBpZiAodGNwX2VtdSgoc28pLChtKSkpIHNiYXBwZW5kKChzbyksIChtKSk7IFwKKwkgICAgICAgfSBlbHNlIFwKKwkgICAgICAgCSAgICAgICBzYmFwcGVuZCgoc28pLCAobSkpOyBcCisvKiAgICAgICAgICAgICAgIHNvcndha2V1cChzbyk7ICovIFwKKwl9IGVsc2Uge1wKKyAgICAgICAgICAgICAgIChmbGFncykgPSB0Y3BfcmVhc3MoKHRwKSwgKHRpKSwgKG0pKTsgXAorICAgICAgICAgICAgICAgdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOyBcCisgICAgICAgfSBcCit9CisjZWxzZQorI2RlZmluZQlUQ1BfUkVBU1ModHAsIHRpLCBtLCBzbywgZmxhZ3MpIHsgXAorCWlmICgodGkpLT50aV9zZXEgPT0gKHRwKS0+cmN2X254dCAmJiBcCisgICAgICAgIHRjcGZyYWdfbGlzdF9lbXB0eSh0cCkgJiYgXAorCSAgICAodHApLT50X3N0YXRlID09IFRDUFNfRVNUQUJMSVNIRUQpIHsgXAorCQl0cC0+dF9mbGFncyB8PSBURl9ERUxBQ0s7IFwKKwkJKHRwKS0+cmN2X254dCArPSAodGkpLT50aV9sZW47IFwKKwkJZmxhZ3MgPSAodGkpLT50aV9mbGFncyAmIFRIX0ZJTjsgXAorCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZwYWNrKyspOyAgICAgICAgXAorCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZieXRlICs9ICh0aSktPnRpX2xlbik7ICBcCisJCWlmIChzby0+c29fZW11KSB7IFwKKwkJCWlmICh0Y3BfZW11KChzbyksKG0pKSkgc2JhcHBlbmQoc28sIChtKSk7IFwKKwkJfSBlbHNlIFwKKwkJCXNiYXBwZW5kKChzbyksIChtKSk7IFwKKy8qCQlzb3J3YWtldXAoc28pOyAqLyBcCisJfSBlbHNlIHsgXAorCQkoZmxhZ3MpID0gdGNwX3JlYXNzKCh0cCksICh0aSksIChtKSk7IFwKKwkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOyBcCisJfSBcCit9CisjZW5kaWYKK3N0YXRpYyB2b2lkIHRjcF9kb29wdGlvbnMoc3RydWN0IHRjcGNiICp0cCwgdV9jaGFyICpjcCwgaW50IGNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRjcGlwaGRyICp0aSk7CitzdGF0aWMgdm9pZCB0Y3BfeG1pdF90aW1lcihyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgcnR0KTsKKworc3RhdGljIGludAordGNwX3JlYXNzKHJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHAsIHJlZ2lzdGVyIHN0cnVjdCB0Y3BpcGhkciAqdGksCisgICAgICAgICAgc3RydWN0IG1idWYgKm0pCit7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICpxOworCXN0cnVjdCBzb2NrZXQgKnNvID0gdHAtPnRfc29ja2V0OworCWludCBmbGFnczsKKworCS8qCisJICogQ2FsbCB3aXRoIHRpPT1OVUxMIGFmdGVyIGJlY29tZSBlc3RhYmxpc2hlZCB0bworCSAqIGZvcmNlIHByZS1FU1RBQkxJU0hFRCBkYXRhIHVwIHRvIHVzZXIgc29ja2V0LgorCSAqLworICAgICAgICBpZiAodGkgPT0gTlVMTCkKKwkJZ290byBwcmVzZW50OworCisJLyoKKwkgKiBGaW5kIGEgc2VnbWVudCB3aGljaCBiZWdpbnMgYWZ0ZXIgdGhpcyBvbmUgZG9lcy4KKwkgKi8KKwlmb3IgKHEgPSB0Y3BmcmFnX2xpc3RfZmlyc3QodHApOyAhdGNwZnJhZ19saXN0X2VuZChxLCB0cCk7CisgICAgICAgICAgICBxID0gdGNwaXBoZHJfbmV4dChxKSkKKwkJaWYgKFNFUV9HVChxLT50aV9zZXEsIHRpLT50aV9zZXEpKQorCQkJYnJlYWs7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgcHJlY2VkaW5nIHNlZ21lbnQsIGl0IG1heSBwcm92aWRlIHNvbWUgb2YKKwkgKiBvdXIgZGF0YSBhbHJlYWR5LiAgSWYgc28sIGRyb3AgdGhlIGRhdGEgZnJvbSB0aGUgaW5jb21pbmcKKwkgKiBzZWdtZW50LiAgSWYgaXQgcHJvdmlkZXMgYWxsIG9mIG91ciBkYXRhLCBkcm9wIHVzLgorCSAqLworCWlmICghdGNwZnJhZ19saXN0X2VuZCh0Y3BpcGhkcl9wcmV2KHEpLCB0cCkpIHsKKwkJcmVnaXN0ZXIgaW50IGk7CisJCXEgPSB0Y3BpcGhkcl9wcmV2KHEpOworCQkvKiBjb252ZXJzaW9uIHRvIGludCAoaW4gaSkgaGFuZGxlcyBzZXEgd3JhcGFyb3VuZCAqLworCQlpID0gcS0+dGlfc2VxICsgcS0+dGlfbGVuIC0gdGktPnRpX3NlcTsKKwkJaWYgKGkgPiAwKSB7CisJCQlpZiAoaSA+PSB0aS0+dGlfbGVuKSB7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2ZHVwcGFjaysrKTsKKwkJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZkdXBieXRlICs9IHRpLT50aV9sZW4pOworCQkJCW1fZnJlZW0obSk7CisJCQkJLyoKKwkJCQkgKiBUcnkgdG8gcHJlc2VudCBhbnkgcXVldWVkIGRhdGEKKwkJCQkgKiBhdCB0aGUgbGVmdCB3aW5kb3cgZWRnZSB0byB0aGUgdXNlci4KKwkJCQkgKiBUaGlzIGlzIG5lZWRlZCBhZnRlciB0aGUgMy1XSFMKKwkJCQkgKiBjb21wbGV0ZXMuCisJCQkJICovCisJCQkJZ290byBwcmVzZW50OyAgIC8qID8/PyAqLworCQkJfQorCQkJbV9hZGoobSwgaSk7CisJCQl0aS0+dGlfbGVuIC09IGk7CisJCQl0aS0+dGlfc2VxICs9IGk7CisJCX0KKwkJcSA9IHRjcGlwaGRyX25leHQocSk7CisJfQorCVNUQVQodGNwc3RhdC50Y3BzX3Jjdm9vcGFjaysrKTsKKwlTVEFUKHRjcHN0YXQudGNwc19yY3Zvb2J5dGUgKz0gdGktPnRpX2xlbik7CisJdGktPnRpX21idWYgPSBtOworCisJLyoKKwkgKiBXaGlsZSB3ZSBvdmVybGFwIHN1Y2NlZWRpbmcgc2VnbWVudHMgdHJpbSB0aGVtIG9yLAorCSAqIGlmIHRoZXkgYXJlIGNvbXBsZXRlbHkgY292ZXJlZCwgZGVxdWV1ZSB0aGVtLgorCSAqLworCXdoaWxlICghdGNwZnJhZ19saXN0X2VuZChxLCB0cCkpIHsKKwkJcmVnaXN0ZXIgaW50IGkgPSAodGktPnRpX3NlcSArIHRpLT50aV9sZW4pIC0gcS0+dGlfc2VxOworCQlpZiAoaSA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChpIDwgcS0+dGlfbGVuKSB7CisJCQlxLT50aV9zZXEgKz0gaTsKKwkJCXEtPnRpX2xlbiAtPSBpOworCQkJbV9hZGoocS0+dGlfbWJ1ZiwgaSk7CisJCQlicmVhazsKKwkJfQorCQlxID0gdGNwaXBoZHJfbmV4dChxKTsKKwkJbSA9IHRjcGlwaGRyX3ByZXYocSktPnRpX21idWY7CisJCXJlbXF1ZSh0Y3BpcGhkcjJxbGluayh0Y3BpcGhkcl9wcmV2KHEpKSk7CisJCW1fZnJlZW0obSk7CisJfQorCisJLyoKKwkgKiBTdGljayBuZXcgc2VnbWVudCBpbiBpdHMgcGxhY2UuCisJICovCisJaW5zcXVlKHRjcGlwaGRyMnFsaW5rKHRpKSwgdGNwaXBoZHIycWxpbmsodGNwaXBoZHJfcHJldihxKSkpOworCitwcmVzZW50OgorCS8qCisJICogUHJlc2VudCBkYXRhIHRvIHVzZXIsIGFkdmFuY2luZyByY3Zfbnh0IHRocm91Z2gKKwkgKiBjb21wbGV0ZWQgc2VxdWVuY2Ugc3BhY2UuCisJICovCisJaWYgKCFUQ1BTX0hBVkVFU1RBQkxJU0hFRCh0cC0+dF9zdGF0ZSkpCisJCXJldHVybiAoMCk7CisJdGkgPSB0Y3BmcmFnX2xpc3RfZmlyc3QodHApOworCWlmICh0Y3BmcmFnX2xpc3RfZW5kKHRpLCB0cCkgfHwgdGktPnRpX3NlcSAhPSB0cC0+cmN2X254dCkKKwkJcmV0dXJuICgwKTsKKwlpZiAodHAtPnRfc3RhdGUgPT0gVENQU19TWU5fUkVDRUlWRUQgJiYgdGktPnRpX2xlbikKKwkJcmV0dXJuICgwKTsKKwlkbyB7CisJCXRwLT5yY3Zfbnh0ICs9IHRpLT50aV9sZW47CisJCWZsYWdzID0gdGktPnRpX2ZsYWdzICYgVEhfRklOOworCQlyZW1xdWUodGNwaXBoZHIycWxpbmsodGkpKTsKKwkJbSA9IHRpLT50aV9tYnVmOworCQl0aSA9IHRjcGlwaGRyX25leHQodGkpOworLyoJCWlmIChzby0+c29fc3RhdGUgJiBTU19GQ0FOVFJDVk1PUkUpICovCisJCWlmIChzby0+c29fc3RhdGUgJiBTU19GQ0FOVFNFTkRNT1JFKQorCQkJbV9mcmVlbShtKTsKKwkJZWxzZSB7CisJCQlpZiAoc28tPnNvX2VtdSkgeworCQkJCWlmICh0Y3BfZW11KHNvLG0pKSBzYmFwcGVuZChzbywgbSk7CisJCQl9IGVsc2UKKwkJCQlzYmFwcGVuZChzbywgbSk7CisJCX0KKwl9IHdoaWxlICh0aSAhPSAoc3RydWN0IHRjcGlwaGRyICopdHAgJiYgdGktPnRpX3NlcSA9PSB0cC0+cmN2X254dCk7CisvKglzb3J3YWtldXAoc28pOyAqLworCXJldHVybiAoZmxhZ3MpOworfQorCisvKgorICogVENQIGlucHV0IHJvdXRpbmUsIGZvbGxvd3MgcGFnZXMgNjUtNzYgb2YgdGhlCisgKiBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIGRhdGVkIFNlcHRlbWJlciwgMTk4MSB2ZXJ5IGNsb3NlbHkuCisgKi8KK3ZvaWQKK3RjcF9pbnB1dChzdHJ1Y3QgbWJ1ZiAqbSwgaW50IGlwaGxlbiwgc3RydWN0IHNvY2tldCAqaW5zbykKK3sKKyAgCXN0cnVjdCBpcCBzYXZlX2lwLCAqaXA7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICp0aTsKKwljYWRkcl90IG9wdHAgPSBOVUxMOworCWludCBvcHRsZW4gPSAwOworCWludCBsZW4sIHRsZW4sIG9mZjsKKyAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cCA9IE5VTEw7CisJcmVnaXN0ZXIgaW50IHRpZmxhZ3M7CisgICAgICAgIHN0cnVjdCBzb2NrZXQgKnNvID0gTlVMTDsKKwlpbnQgdG9kcm9wLCBhY2tlZCwgb3VyZmluaXNhY2tlZCwgbmVlZG91dHB1dCA9IDA7CisvKglpbnQgZHJvcHNvY2tldCA9IDA7ICovCisJaW50IGlzcyA9IDA7CisJdV9sb25nIHRpd2luOworCWludCByZXQ7CisvKglpbnQgdHNfcHJlc2VudCA9IDA7ICovCisgICAgc3RydWN0IGV4X2xpc3QgKmV4X3B0cjsKKworCURFQlVHX0NBTEwoInRjcF9pbnB1dCIpOworCURFQlVHX0FSR1MoKGRmZCwiIG0gPSAlOGx4ICBpcGhsZW4gPSAlMmQgIGluc28gPSAlbHhcbiIsCisJCSAgICAobG9uZyApbSwgaXBobGVuLCAobG9uZyApaW5zbyApKTsKKworCS8qCisJICogSWYgY2FsbGVkIHdpdGggbSA9PSAwLCB0aGVuIHdlJ3JlIGNvbnRpbnVpbmcgdGhlIGNvbm5lY3QKKwkgKi8KKwlpZiAobSA9PSBOVUxMKSB7CisJCXNvID0gaW5zbzsKKworCQkvKiBSZS1zZXQgYSBmZXcgdmFyaWFibGVzICovCisJCXRwID0gc290b3RjcGNiKHNvKTsKKwkJbSA9IHNvLT5zb19tOworICAgICAgICAgICAgICAgIHNvLT5zb19tID0gTlVMTDsKKwkJdGkgPSBzby0+c29fdGk7CisJCXRpd2luID0gdGktPnRpX3dpbjsKKwkJdGlmbGFncyA9IHRpLT50aV9mbGFnczsKKworCQlnb3RvIGNvbnRfY29ubjsKKwl9CisKKworCVNUQVQodGNwc3RhdC50Y3BzX3JjdnRvdGFsKyspOworCS8qCisJICogR2V0IElQIGFuZCBUQ1AgaGVhZGVyIHRvZ2V0aGVyIGluIGZpcnN0IG1idWYuCisJICogTm90ZTogSVAgbGVhdmVzIElQIGhlYWRlciBpbiBmaXJzdCBtYnVmLgorCSAqLworCXRpID0gbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKik7CisJaWYgKGlwaGxlbiA+IHNpemVvZihzdHJ1Y3QgaXAgKSkgeworCSAgaXBfc3RyaXBvcHRpb25zKG0sIChzdHJ1Y3QgbWJ1ZiAqKTApOworCSAgaXBobGVuPXNpemVvZihzdHJ1Y3QgaXAgKTsKKwl9CisJLyogWFhYIENoZWNrIGlmIHRvbyBzaG9ydCAqLworCisKKwkvKgorCSAqIFNhdmUgYSBjb3B5IG9mIHRoZSBJUCBoZWFkZXIgaW4gY2FzZSB3ZSB3YW50IHJlc3RvcmUgaXQKKwkgKiBmb3Igc2VuZGluZyBhbiBJQ01QIGVycm9yIG1lc3NhZ2UgaW4gcmVzcG9uc2UuCisJICovCisJaXA9bXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJc2F2ZV9pcCA9ICppcDsKKwlzYXZlX2lwLmlwX2xlbis9IGlwaGxlbjsKKworCS8qCisJICogQ2hlY2tzdW0gZXh0ZW5kZWQgVENQIGhlYWRlciBhbmQgZGF0YS4KKwkgKi8KKwl0bGVuID0gKChzdHJ1Y3QgaXAgKil0aSktPmlwX2xlbjsKKyAgICAgICAgdGNwaXBoZHIycWxpbmsodGkpLT5uZXh0ID0gdGNwaXBoZHIycWxpbmsodGkpLT5wcmV2ID0gTlVMTDsKKyAgICAgICAgbWVtc2V0KCZ0aS0+dGlfaS5paF9tYnVmLCAwICwgc2l6ZW9mKHN0cnVjdCBtYnVmX3B0cikpOworCXRpLT50aV94MSA9IDA7CisJdGktPnRpX2xlbiA9IGh0b25zKCh1X2ludDE2X3QpdGxlbik7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpcCApICsgdGxlbjsKKwkvKiBrZWVwIGNoZWNrc3VtIGZvciBJQ01QIHJlcGx5CisJICogdGktPnRpX3N1bSA9IGNrc3VtKG0sIGxlbik7CisJICogaWYgKHRpLT50aV9zdW0pIHsgKi8KKwlpZihja3N1bShtLCBsZW4pKSB7CisJICBTVEFUKHRjcHN0YXQudGNwc19yY3ZiYWRzdW0rKyk7CisJICBnb3RvIGRyb3A7CisJfQorCisJLyoKKwkgKiBDaGVjayB0aGF0IFRDUCBvZmZzZXQgbWFrZXMgc2Vuc2UsCisJICogcHVsbCBvdXQgVENQIG9wdGlvbnMgYW5kIGFkanVzdCBsZW5ndGguCQlYWFgKKwkgKi8KKwlvZmYgPSB0aS0+dGlfb2ZmIDw8IDI7CisJaWYgKG9mZiA8IHNpemVvZiAoc3RydWN0IHRjcGhkcikgfHwgb2ZmID4gdGxlbikgeworCSAgU1RBVCh0Y3BzdGF0LnRjcHNfcmN2YmFkb2ZmKyspOworCSAgZ290byBkcm9wOworCX0KKwl0bGVuIC09IG9mZjsKKwl0aS0+dGlfbGVuID0gdGxlbjsKKwlpZiAob2ZmID4gc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSkgeworCSAgb3B0bGVuID0gb2ZmIC0gc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKTsKKwkgIG9wdHAgPSBtdG9kKG0sIGNhZGRyX3QpICsgc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpOworCisJCS8qCisJCSAqIERvIHF1aWNrIHJldHJpZXZhbCBvZiB0aW1lc3RhbXAgb3B0aW9ucyAoIm9wdGlvbnMKKwkJICogcHJlZGljdGlvbj8iKS4gIElmIHRpbWVzdGFtcCBpcyB0aGUgb25seSBvcHRpb24gYW5kIGl0J3MKKwkJICogZm9ybWF0dGVkIGFzIHJlY29tbWVuZGVkIGluIFJGQyAxMzIzIGFwcGVuZGl4IEEsIHdlCisJCSAqIHF1aWNrbHkgZ2V0IHRoZSB2YWx1ZXMgbm93IGFuZCBub3QgYm90aGVyIGNhbGxpbmcKKwkJICogdGNwX2Rvb3B0aW9ucygpLCBldGMuCisJCSAqLworLyoJCWlmICgob3B0bGVuID09IFRDUE9MRU5fVFNUQU1QX0FQUEEgfHwKKyAqCQkgICAgIChvcHRsZW4gPiBUQ1BPTEVOX1RTVEFNUF9BUFBBICYmCisgKgkJCW9wdHBbVENQT0xFTl9UU1RBTVBfQVBQQV0gPT0gVENQT1BUX0VPTCkpICYmCisgKgkJICAgICAqKHVfaW50MzJfdCAqKW9wdHAgPT0gaHRvbmwoVENQT1BUX1RTVEFNUF9IRFIpICYmCisgKgkJICAgICAodGktPnRpX2ZsYWdzICYgVEhfU1lOKSA9PSAwKSB7CisgKgkJCXRzX3ByZXNlbnQgPSAxOworICoJCQl0c192YWwgPSBudG9obCgqKHVfaW50MzJfdCAqKShvcHRwICsgNCkpOworICoJCQl0c19lY3IgPSBudG9obCgqKHVfaW50MzJfdCAqKShvcHRwICsgOCkpOworICoJCQlvcHRwID0gTlVMTDsgICAvICogd2UndmUgcGFyc2VkIHRoZSBvcHRpb25zICogLworICoJCX0KKyAqLworCX0KKwl0aWZsYWdzID0gdGktPnRpX2ZsYWdzOworCisJLyoKKwkgKiBDb252ZXJ0IFRDUCBwcm90b2NvbCBzcGVjaWZpYyBmaWVsZHMgdG8gaG9zdCBmb3JtYXQuCisJICovCisJTlRPSEwodGktPnRpX3NlcSk7CisJTlRPSEwodGktPnRpX2Fjayk7CisJTlRPSFModGktPnRpX3dpbik7CisJTlRPSFModGktPnRpX3VycCk7CisKKwkvKgorCSAqIERyb3AgVENQLCBJUCBoZWFkZXJzIGFuZCBUQ1Agb3B0aW9ucy4KKwkgKi8KKwltLT5tX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCB0Y3BpcGhkcikrb2ZmLXNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKwltLT5tX2xlbiAgLT0gc2l6ZW9mKHN0cnVjdCB0Y3BpcGhkcikrb2ZmLXNpemVvZihzdHJ1Y3QgdGNwaGRyKTsKKworICAgIGlmIChzbGlycF9yZXN0cmljdCkgeworICAgICAgICBmb3IgKGV4X3B0ciA9IGV4ZWNfbGlzdDsgZXhfcHRyOyBleF9wdHIgPSBleF9wdHItPmV4X25leHQpCisgICAgICAgICAgICBpZiAoZXhfcHRyLT5leF9mcG9ydCA9PSB0aS0+dGlfZHBvcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgKG50b2hsKHRpLT50aV9kc3Quc19hZGRyKSAmIDB4ZmYpID09IGV4X3B0ci0+ZXhfYWRkcikKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIWV4X3B0cikKKyAgICAgICAgICAgIGdvdG8gZHJvcDsKKyAgICB9CisJLyoKKwkgKiBMb2NhdGUgcGNiIGZvciBzZWdtZW50LgorCSAqLworZmluZHNvOgorCXNvID0gdGNwX2xhc3Rfc287CisJaWYgKHNvLT5zb19mcG9ydCAhPSB0aS0+dGlfZHBvcnQgfHwKKwkgICAgc28tPnNvX2xwb3J0ICE9IHRpLT50aV9zcG9ydCB8fAorCSAgICBzby0+c29fbGFkZHIuc19hZGRyICE9IHRpLT50aV9zcmMuc19hZGRyIHx8CisJICAgIHNvLT5zb19mYWRkci5zX2FkZHIgIT0gdGktPnRpX2RzdC5zX2FkZHIpIHsKKwkJc28gPSBzb2xvb2t1cCgmdGNiLCB0aS0+dGlfc3JjLCB0aS0+dGlfc3BvcnQsCisJCQkgICAgICAgdGktPnRpX2RzdCwgdGktPnRpX2Rwb3J0KTsKKwkJaWYgKHNvKQorCQkJdGNwX2xhc3Rfc28gPSBzbzsKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfc29jYWNoZW1pc3MrKyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgc3RhdGUgaXMgQ0xPU0VEIChpLmUuLCBUQ0IgZG9lcyBub3QgZXhpc3QpIHRoZW4KKwkgKiBhbGwgZGF0YSBpbiB0aGUgaW5jb21pbmcgc2VnbWVudCBpcyBkaXNjYXJkZWQuCisJICogSWYgdGhlIFRDQiBleGlzdHMgYnV0IGlzIGluIENMT1NFRCBzdGF0ZSwgaXQgaXMgZW1icnlvbmljLAorCSAqIGJ1dCBzaG91bGQgZWl0aGVyIGRvIGEgbGlzdGVuIG9yIGEgY29ubmVjdCBzb29uLgorCSAqCisJICogc3RhdGUgPT0gQ0xPU0VEIG1lYW5zIHdlJ3ZlIGRvbmUgc29jcmVhdGUoKSBidXQgaGF2ZW4ndAorCSAqIGF0dGFjaGVkIGl0IHRvIGEgcHJvdG9jb2wgeWV0Li4uCisJICoKKwkgKiBYWFggSWYgYSBUQ0IgZG9lcyBub3QgZXhpc3QsIGFuZCB0aGUgVEhfU1lOIGZsYWcgaXMKKwkgKiB0aGUgb25seSBmbGFnIHNldCwgdGhlbiBjcmVhdGUgYSBzZXNzaW9uLCBtYXJrIGl0CisJICogYXMgaWYgaXQgd2FzIExJU1RFTklORywgYW5kIGNvbnRpbnVlLi4uCisJICovCisgICAgICAgIGlmIChzbyA9PSBOVUxMKSB7CisJICBpZiAoKHRpZmxhZ3MgJiAoVEhfU1lOfFRIX0ZJTnxUSF9SU1R8VEhfVVJHfFRIX0FDSykpICE9IFRIX1NZTikKKwkgICAgZ290byBkcm9wd2l0aHJlc2V0OworCisJICBpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkKKwkgICAgZ290byBkcm9wd2l0aHJlc2V0OworCSAgaWYgKHRjcF9hdHRhY2goc28pIDwgMCkgeworCSAgICBmcmVlKHNvKTsgLyogTm90IHNvZnJlZSAoaWYgaXQgZmFpbGVkLCBpdCdzIG5vdCBpbnNxdWVkKSAqLworCSAgICBnb3RvIGRyb3B3aXRocmVzZXQ7CisJICB9CisKKwkgIHNicmVzZXJ2ZSgmc28tPnNvX3NuZCwgVENQX1NORFNQQUNFKTsKKwkgIHNicmVzZXJ2ZSgmc28tPnNvX3JjdiwgVENQX1JDVlNQQUNFKTsKKworCSAgLyoJCXRjcF9sYXN0X3NvID0gc287ICovICAvKiBYWFggPyAqLworCSAgLyoJCXRwID0gc290b3RjcGNiKHNvKTsgICAgKi8KKworCSAgc28tPnNvX2xhZGRyID0gdGktPnRpX3NyYzsKKwkgIHNvLT5zb19scG9ydCA9IHRpLT50aV9zcG9ydDsKKwkgIHNvLT5zb19mYWRkciA9IHRpLT50aV9kc3Q7CisJICBzby0+c29fZnBvcnQgPSB0aS0+dGlfZHBvcnQ7CisKKwkgIGlmICgoc28tPnNvX2lwdG9zID0gdGNwX3RvcyhzbykpID09IDApCisJICAgIHNvLT5zb19pcHRvcyA9ICgoc3RydWN0IGlwICopdGkpLT5pcF90b3M7CisKKwkgIHRwID0gc290b3RjcGNiKHNvKTsKKwkgIHRwLT50X3N0YXRlID0gVENQU19MSVNURU47CisJfQorCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoaXMgaXMgYSBzdGlsbC1jb25uZWN0aW5nIHNvY2tldCwgdGhpcyBwcm9iYWJseQorICAgICAgICAgKiBhIHJldHJhbnNtaXQgb2YgdGhlIFNZTi4gIFdoZXRoZXIgaXQncyBhIHJldHJhbnNtaXQgU1lOCisJICogb3Igc29tZXRoaW5nIGVsc2UsIHdlIG51a2UgaXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoc28tPnNvX3N0YXRlICYgU1NfSVNGQ09OTkVDVElORykKKyAgICAgICAgICAgICAgICBnb3RvIGRyb3A7CisKKwl0cCA9IHNvdG90Y3BjYihzbyk7CisKKwkvKiBYWFggU2hvdWxkIG5ldmVyIGZhaWwgKi8KKyAgICAgICAgaWYgKHRwID09IE5VTEwpCisJCWdvdG8gZHJvcHdpdGhyZXNldDsKKwlpZiAodHAtPnRfc3RhdGUgPT0gVENQU19DTE9TRUQpCisJCWdvdG8gZHJvcDsKKworCS8qIFVuc2NhbGUgdGhlIHdpbmRvdyBpbnRvIGEgMzItYml0IHZhbHVlLiAqLworLyoJaWYgKCh0aWZsYWdzICYgVEhfU1lOKSA9PSAwKQorICoJCXRpd2luID0gdGktPnRpX3dpbiA8PCB0cC0+c25kX3NjYWxlOworICoJZWxzZQorICovCisJCXRpd2luID0gdGktPnRpX3dpbjsKKworCS8qCisJICogU2VnbWVudCByZWNlaXZlZCBvbiBjb25uZWN0aW9uLgorCSAqIFJlc2V0IGlkbGUgdGltZSBhbmQga2VlcC1hbGl2ZSB0aW1lci4KKwkgKi8KKwl0cC0+dF9pZGxlID0gMDsKKwlpZiAoU09fT1BUSU9OUykKKwkgICB0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUElOVFZMOworCWVsc2UKKwkgICB0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JRExFOworCisJLyoKKwkgKiBQcm9jZXNzIG9wdGlvbnMgaWYgbm90IGluIExJU1RFTiBzdGF0ZSwKKwkgKiBlbHNlIGRvIGl0IGJlbG93IChhZnRlciBnZXR0aW5nIHJlbW90ZSBhZGRyZXNzKS4KKwkgKi8KKwlpZiAob3B0cCAmJiB0cC0+dF9zdGF0ZSAhPSBUQ1BTX0xJU1RFTikKKwkJdGNwX2Rvb3B0aW9ucyh0cCwgKHVfY2hhciAqKW9wdHAsIG9wdGxlbiwgdGkpOworLyogLCAqLworLyoJCQkmdHNfcHJlc2VudCwgJnRzX3ZhbCwgJnRzX2Vjcik7ICovCisKKwkvKgorCSAqIEhlYWRlciBwcmVkaWN0aW9uOiBjaGVjayBmb3IgdGhlIHR3byBjb21tb24gY2FzZXMKKwkgKiBvZiBhIHVuaS1kaXJlY3Rpb25hbCBkYXRhIHhmZXIuICBJZiB0aGUgcGFja2V0IGhhcworCSAqIG5vIGNvbnRyb2wgZmxhZ3MsIGlzIGluLXNlcXVlbmNlLCB0aGUgd2luZG93IGRpZG4ndAorCSAqIGNoYW5nZSBhbmQgd2UncmUgbm90IHJldHJhbnNtaXR0aW5nLCBpdCdzIGEKKwkgKiBjYW5kaWRhdGUuICBJZiB0aGUgbGVuZ3RoIGlzIHplcm8gYW5kIHRoZSBhY2sgbW92ZWQKKwkgKiBmb3J3YXJkLCB3ZSdyZSB0aGUgc2VuZGVyIHNpZGUgb2YgdGhlIHhmZXIuICBKdXN0CisJICogZnJlZSB0aGUgZGF0YSBhY2tlZCAmIHdha2UgYW55IGhpZ2hlciBsZXZlbCBwcm9jZXNzCisJICogdGhhdCB3YXMgYmxvY2tlZCB3YWl0aW5nIGZvciBzcGFjZS4gIElmIHRoZSBsZW5ndGgKKwkgKiBpcyBub24temVybyBhbmQgdGhlIGFjayBkaWRuJ3QgbW92ZSwgd2UncmUgdGhlCisJICogcmVjZWl2ZXIgc2lkZS4gIElmIHdlJ3JlIGdldHRpbmcgcGFja2V0cyBpbi1vcmRlcgorCSAqICh0aGUgcmVhc3NlbWJseSBxdWV1ZSBpcyBlbXB0eSksIGFkZCB0aGUgZGF0YSB0bworCSAqIHRoZSBzb2NrZXQgYnVmZmVyIGFuZCBub3RlIHRoYXQgd2UgbmVlZCBhIGRlbGF5ZWQgYWNrLgorCSAqCisJICogWFhYIFNvbWUgb2YgdGhlc2UgdGVzdHMgYXJlIG5vdCBuZWVkZWQKKwkgKiBlZzogdGhlIHRpd2luID09IHRwLT5zbmRfd25kIHByZXZlbnRzIG1hbnkgbW9yZQorCSAqIHByZWRpY3Rpb25zLi4gd2l0aCBubyAqcmVhbCogYWR2YW50YWdlLi4KKwkgKi8KKwlpZiAodHAtPnRfc3RhdGUgPT0gVENQU19FU1RBQkxJU0hFRCAmJgorCSAgICAodGlmbGFncyAmIChUSF9TWU58VEhfRklOfFRIX1JTVHxUSF9VUkd8VEhfQUNLKSkgPT0gVEhfQUNLICYmCisvKgkgICAgKCF0c19wcmVzZW50IHx8IFRTVE1QX0dFUSh0c192YWwsIHRwLT50c19yZWNlbnQpKSAmJiAqLworCSAgICB0aS0+dGlfc2VxID09IHRwLT5yY3Zfbnh0ICYmCisJICAgIHRpd2luICYmIHRpd2luID09IHRwLT5zbmRfd25kICYmCisJICAgIHRwLT5zbmRfbnh0ID09IHRwLT5zbmRfbWF4KSB7CisJCS8qCisJCSAqIElmIGxhc3QgQUNLIGZhbGxzIHdpdGhpbiB0aGlzIHNlZ21lbnQncyBzZXF1ZW5jZSBudW1iZXJzLAorCQkgKiAgcmVjb3JkIHRoZSB0aW1lc3RhbXAuCisJCSAqLworLyoJCWlmICh0c19wcmVzZW50ICYmIFNFUV9MRVEodGktPnRpX3NlcSwgdHAtPmxhc3RfYWNrX3NlbnQpICYmCisgKgkJICAgU0VRX0xUKHRwLT5sYXN0X2Fja19zZW50LCB0aS0+dGlfc2VxICsgdGktPnRpX2xlbikpIHsKKyAqCQkJdHAtPnRzX3JlY2VudF9hZ2UgPSB0Y3Bfbm93OworICoJCQl0cC0+dHNfcmVjZW50ID0gdHNfdmFsOworICoJCX0KKyAqLworCQlpZiAodGktPnRpX2xlbiA9PSAwKSB7CisJCQlpZiAoU0VRX0dUKHRpLT50aV9hY2ssIHRwLT5zbmRfdW5hKSAmJgorCQkJICAgIFNFUV9MRVEodGktPnRpX2FjaywgdHAtPnNuZF9tYXgpICYmCisJCQkgICAgdHAtPnNuZF9jd25kID49IHRwLT5zbmRfd25kKSB7CisJCQkJLyoKKwkJCQkgKiB0aGlzIGlzIGEgcHVyZSBhY2sgZm9yIG91dHN0YW5kaW5nIGRhdGEuCisJCQkJICovCisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcHJlZGFjaysrKTsKKy8qCQkJCWlmICh0c19wcmVzZW50KQorICoJCQkJCXRjcF94bWl0X3RpbWVyKHRwLCB0Y3Bfbm93LXRzX2VjcisxKTsKKyAqCQkJCWVsc2UKKyAqLwkJCQkgICAgIGlmICh0cC0+dF9ydHQgJiYKKwkJCQkJICAgIFNFUV9HVCh0aS0+dGlfYWNrLCB0cC0+dF9ydHNlcSkpCisJCQkJCXRjcF94bWl0X3RpbWVyKHRwLCB0cC0+dF9ydHQpOworCQkJCWFja2VkID0gdGktPnRpX2FjayAtIHRwLT5zbmRfdW5hOworCQkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmFja3BhY2srKyk7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2YWNrYnl0ZSArPSBhY2tlZCk7CisJCQkJc2Jkcm9wKCZzby0+c29fc25kLCBhY2tlZCk7CisJCQkJdHAtPnNuZF91bmEgPSB0aS0+dGlfYWNrOworCQkJCW1fZnJlZW0obSk7CisKKwkJCQkvKgorCQkJCSAqIElmIGFsbCBvdXRzdGFuZGluZyBkYXRhIGFyZSBhY2tlZCwgc3RvcAorCQkJCSAqIHJldHJhbnNtaXQgdGltZXIsIG90aGVyd2lzZSByZXN0YXJ0IHRpbWVyCisJCQkJICogdXNpbmcgY3VycmVudCAocG9zc2libHkgYmFja2VkLW9mZikgdmFsdWUuCisJCQkJICogSWYgcHJvY2VzcyBpcyB3YWl0aW5nIGZvciBzcGFjZSwKKwkJCQkgKiB3YWtldXAvc2Vsd2FrZXVwL3NpZ25hbC4gIElmIGRhdGEKKwkJCQkgKiBhcmUgcmVhZHkgdG8gc2VuZCwgbGV0IHRjcF9vdXRwdXQKKwkJCQkgKiBkZWNpZGUgYmV0d2VlbiBtb3JlIG91dHB1dCBvciBwZXJzaXN0LgorCQkJCSAqLworCQkJCWlmICh0cC0+c25kX3VuYSA9PSB0cC0+c25kX21heCkKKwkJCQkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSAwOworCQkJCWVsc2UgaWYgKHRwLT50X3RpbWVyW1RDUFRfUEVSU0lTVF0gPT0gMCkKKwkJCQkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSB0cC0+dF9yeHRjdXI7CisKKwkJCQkvKgorCQkJCSAqIFRoZXJlJ3Mgcm9vbSBpbiBzb19zbmQsIHNvd3dha3VwIHdpbGwgcmVhZCgpCisJCQkJICogZnJvbSB0aGUgc29ja2V0IGlmIHdlIGNhbgorCQkJCSAqLworLyoJCQkJaWYgKHNvLT5zb19zbmQuc2JfZmxhZ3MgJiBTQl9OT1RJRlkpCisgKgkJCQkJc293d2FrZXVwKHNvKTsKKyAqLworCQkJCS8qCisJCQkJICogVGhpcyBpcyBjYWxsZWQgYmVjYXVzZSBzb3d3YWtldXAgbWlnaHQgaGF2ZQorCQkJCSAqIHB1dCBkYXRhIGludG8gc29fc25kLiAgU2luY2Ugd2UgZG9uJ3Qgc28gc293d2FrZXVwLAorCQkJCSAqIHdlIGRvbid0IG5lZWQgdGhpcy4uIFhYWD8/PworCQkJCSAqLworCQkJCWlmIChzby0+c29fc25kLnNiX2NjKQorCQkJCQkodm9pZCkgdGNwX291dHB1dCh0cCk7CisKKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSBpZiAodGktPnRpX2FjayA9PSB0cC0+c25kX3VuYSAmJgorCQkgICAgdGNwZnJhZ19saXN0X2VtcHR5KHRwKSAmJgorCQkgICAgdGktPnRpX2xlbiA8PSBzYnNwYWNlKCZzby0+c29fcmN2KSkgeworCQkJLyoKKwkJCSAqIHRoaXMgaXMgYSBwdXJlLCBpbi1zZXF1ZW5jZSBkYXRhIHBhY2tldAorCQkJICogd2l0aCBub3RoaW5nIG9uIHRoZSByZWFzc2VtYmx5IHF1ZXVlIGFuZAorCQkJICogd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIHNwYWNlIHRvIHRha2UgaXQuCisJCQkgKi8KKwkJCVNUQVQodGNwc3RhdC50Y3BzX3ByZWRkYXQrKyk7CisJCQl0cC0+cmN2X254dCArPSB0aS0+dGlfbGVuOworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2cGFjaysrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmJ5dGUgKz0gdGktPnRpX2xlbik7CisJCQkvKgorCQkJICogQWRkIGRhdGEgdG8gc29ja2V0IGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKHNvLT5zb19lbXUpIHsKKwkJCQlpZiAodGNwX2VtdShzbyxtKSkgc2JhcHBlbmQoc28sIG0pOworCQkJfSBlbHNlCisJCQkJc2JhcHBlbmQoc28sIG0pOworCisJCQkvKgorCQkJICogWFhYIFRoaXMgaXMgY2FsbGVkIHdoZW4gZGF0YSBhcnJpdmVzLiAgTGF0ZXIsIGNoZWNrCisJCQkgKiBpZiB3ZSBjYW4gYWN0dWFsbHkgd3JpdGUoKSB0byB0aGUgc29ja2V0CisJCQkgKiBYWFggTmVlZCB0byBjaGVjaz8gSXQncyBiZSBOT05fQkxPQ0tJTkcKKwkJCSAqLworLyoJCQlzb3J3YWtldXAoc28pOyAqLworCisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBhIHNob3J0IHBhY2tldCwgdGhlbiBBQ0sgbm93IC0gd2l0aCBOYWdlbAorCQkJICoJY29uZ2VzdGlvbiBhdm9pZGFuY2Ugc2VuZGVyIHdvbid0IHNlbmQgbW9yZSB1bnRpbAorCQkJICoJaGUgZ2V0cyBhbiBBQ0suCisJCQkgKgorCQkJICogSXQgaXMgYmV0dGVyIHRvIG5vdCBkZWxheSBhY2tzIGF0IGFsbCB0byBtYXhpbWl6ZQorCQkJICogVENQIHRocm91Z2hwdXQuICBTZWUgUkZDIDI1ODEuCisJCQkgKi8KKwkJCXRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsKKwkJCXRjcF9vdXRwdXQodHApOworCQkJcmV0dXJuOworCQl9CisJfSAvKiBoZWFkZXIgcHJlZGljdGlvbiAqLworCS8qCisJICogQ2FsY3VsYXRlIGFtb3VudCBvZiBzcGFjZSBpbiByZWNlaXZlIHdpbmRvdywKKwkgKiBhbmQgdGhlbiBkbyBUQ1AgaW5wdXQgcHJvY2Vzc2luZy4KKwkgKiBSZWNlaXZlIHdpbmRvdyBpcyBhbW91bnQgb2Ygc3BhY2UgaW4gcmN2IHF1ZXVlLAorCSAqIGJ1dCBub3QgbGVzcyB0aGFuIGFkdmVydGlzZWQgd2luZG93LgorCSAqLworCXsgaW50IHdpbjsKKyAgICAgICAgICB3aW4gPSBzYnNwYWNlKCZzby0+c29fcmN2KTsKKwkgIGlmICh3aW4gPCAwKQorCSAgICB3aW4gPSAwOworCSAgdHAtPnJjdl93bmQgPSBtYXgod2luLCAoaW50KSh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KSk7CisJfQorCisJc3dpdGNoICh0cC0+dF9zdGF0ZSkgeworCisJLyoKKwkgKiBJZiB0aGUgc3RhdGUgaXMgTElTVEVOIHRoZW4gaWdub3JlIHNlZ21lbnQgaWYgaXQgY29udGFpbnMgYW4gUlNULgorCSAqIElmIHRoZSBzZWdtZW50IGNvbnRhaW5zIGFuIEFDSyB0aGVuIGl0IGlzIGJhZCBhbmQgc2VuZCBhIFJTVC4KKwkgKiBJZiBpdCBkb2VzIG5vdCBjb250YWluIGEgU1lOIHRoZW4gaXQgaXMgbm90IGludGVyZXN0aW5nOyBkcm9wIGl0LgorCSAqIERvbid0IGJvdGhlciByZXNwb25kaW5nIGlmIHRoZSBkZXN0aW5hdGlvbiB3YXMgYSBicm9hZGNhc3QuCisJICogT3RoZXJ3aXNlIGluaXRpYWxpemUgdHAtPnJjdl9ueHQsIGFuZCB0cC0+aXJzLCBzZWxlY3QgYW4gaW5pdGlhbAorCSAqIHRwLT5pc3MsIGFuZCBzZW5kIGEgc2VnbWVudDoKKwkgKiAgICAgPFNFUT1JU1M+PEFDSz1SQ1ZfTlhUPjxDVEw9U1lOLEFDSz4KKwkgKiBBbHNvIGluaXRpYWxpemUgdHAtPnNuZF9ueHQgdG8gdHAtPmlzcysxIGFuZCB0cC0+c25kX3VuYSB0byB0cC0+aXNzLgorCSAqIEZpbGwgaW4gcmVtb3RlIHBlZXIgYWRkcmVzcyBmaWVsZHMgaWYgbm90IHByZXZpb3VzbHkgc3BlY2lmaWVkLgorCSAqIEVudGVyIFNZTl9SRUNFSVZFRCBzdGF0ZSwgYW5kIHByb2Nlc3MgYW55IG90aGVyIGZpZWxkcyBvZiB0aGlzCisJICogc2VnbWVudCBpbiB0aGlzIHN0YXRlLgorCSAqLworCWNhc2UgVENQU19MSVNURU46IHsKKworCSAgaWYgKHRpZmxhZ3MgJiBUSF9SU1QpCisJICAgIGdvdG8gZHJvcDsKKwkgIGlmICh0aWZsYWdzICYgVEhfQUNLKQorCSAgICBnb3RvIGRyb3B3aXRocmVzZXQ7CisJICBpZiAoKHRpZmxhZ3MgJiBUSF9TWU4pID09IDApCisJICAgIGdvdG8gZHJvcDsKKworCSAgLyoKKwkgICAqIFRoaXMgaGFzIHdheSB0b28gbWFueSBnb3Rvcy4uLgorCSAgICogQnV0IGEgYml0IG9mIHNwYWdoZXR0aSBjb2RlIG5ldmVyIGh1cnQgYW55Ym9keSA6KQorCSAgICovCisKKwkgIC8qCisJICAgKiBJZiB0aGlzIGlzIGRlc3RpbmVkIGZvciB0aGUgY29udHJvbCBhZGRyZXNzLCB0aGVuIGZsYWcgdG8KKwkgICAqIHRjcF9jdGwgb25jZSBjb25uZWN0ZWQsIG90aGVyd2lzZSBjb25uZWN0CisJICAgKi8KKwkgIGlmICgoc28tPnNvX2ZhZGRyLnNfYWRkciZodG9ubCgweGZmZmZmZjAwKSkgPT0gc3BlY2lhbF9hZGRyLnNfYWRkcikgeworCSAgICBpbnQgbGFzdGJ5dGU9bnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcikgJiAweGZmOworCSAgICBpZiAobGFzdGJ5dGUhPUNUTF9BTElBUyAmJiBsYXN0Ynl0ZSE9Q1RMX0ROUykgeworI2lmIDAKKwkgICAgICBpZihsYXN0Ynl0ZT09Q1RMX0NNRCB8fCBsYXN0Ynl0ZT09Q1RMX0VYRUMpIHsKKwkJLyogQ29tbWFuZCBvciBleGVjIGFkcmVzcyAqLworCQlzby0+c29fc3RhdGUgfD0gU1NfQ1RMOworCSAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgIHsKKwkJLyogTWF5IGJlIGFuIGFkZCBleGVjICovCisJCWZvcihleF9wdHIgPSBleGVjX2xpc3Q7IGV4X3B0cjsgZXhfcHRyID0gZXhfcHRyLT5leF9uZXh0KSB7CisJCSAgaWYoZXhfcHRyLT5leF9mcG9ydCA9PSBzby0+c29fZnBvcnQgJiYKKwkJICAgICBsYXN0Ynl0ZSA9PSBleF9wdHItPmV4X2FkZHIpIHsKKwkJICAgIHNvLT5zb19zdGF0ZSB8PSBTU19DVEw7CisJCSAgICBicmVhazsKKwkJICB9CisJCX0KKwkgICAgICB9CisJICAgICAgaWYoc28tPnNvX3N0YXRlICYgU1NfQ1RMKSBnb3RvIGNvbnRfaW5wdXQ7CisJICAgIH0KKwkgICAgLyogQ1RMX0FMSUFTOiBEbyBub3RoaW5nLCB0Y3BfZmNvbm5lY3Qgd2lsbCBiZSBjYWxsZWQgb24gaXQgKi8KKwkgIH0KKworCSAgaWYgKHNvLT5zb19lbXUgJiBFTVVfTk9DT05ORUNUKSB7CisJICAgIHNvLT5zb19lbXUgJj0gfkVNVV9OT0NPTk5FQ1Q7CisJICAgIGdvdG8gY29udF9pbnB1dDsKKwkgIH0KKworCSAgaWYoKHRjcF9mY29ubmVjdChzbykgPT0gLTEpICYmIChlcnJubyAhPSBFSU5QUk9HUkVTUykgJiYgKGVycm5vICE9IEVXT1VMREJMT0NLKSkgeworCSAgICB1X2NoYXIgY29kZT1JQ01QX1VOUkVBQ0hfTkVUOworCSAgICBERUJVR19NSVNDKChkZmQsIiB0Y3AgZmNvbm5lY3QgZXJybm8gPSAlZC0lc1xuIiwKKwkJCWVycm5vLHN0cmVycm9yKGVycm5vKSkpOworCSAgICBpZihlcnJubyA9PSBFQ09OTlJFRlVTRUQpIHsKKwkgICAgICAvKiBBQ0sgdGhlIFNZTiwgc2VuZCBSU1QgdG8gcmVmdXNlIHRoZSBjb25uZWN0aW9uICovCisJICAgICAgdGNwX3Jlc3BvbmQodHAsIHRpLCBtLCB0aS0+dGlfc2VxKzEsICh0Y3Bfc2VxKTAsCisJCQkgIFRIX1JTVHxUSF9BQ0spOworCSAgICB9IGVsc2UgeworCSAgICAgIGlmKGVycm5vID09IEVIT1NUVU5SRUFDSCkgY29kZT1JQ01QX1VOUkVBQ0hfSE9TVDsKKwkgICAgICBIVE9OTCh0aS0+dGlfc2VxKTsgICAgICAgICAgICAgLyogcmVzdG9yZSB0Y3AgaGVhZGVyICovCisJICAgICAgSFRPTkwodGktPnRpX2Fjayk7CisJICAgICAgSFRPTlModGktPnRpX3dpbik7CisJICAgICAgSFRPTlModGktPnRpX3VycCk7CisJICAgICAgbS0+bV9kYXRhIC09IHNpemVvZihzdHJ1Y3QgdGNwaXBoZHIpK29mZi1zaXplb2Yoc3RydWN0IHRjcGhkcik7CisJICAgICAgbS0+bV9sZW4gICs9IHNpemVvZihzdHJ1Y3QgdGNwaXBoZHIpK29mZi1zaXplb2Yoc3RydWN0IHRjcGhkcik7CisJICAgICAgKmlwPXNhdmVfaXA7CisJICAgICAgaWNtcF9lcnJvcihtLCBJQ01QX1VOUkVBQ0gsY29kZSwgMCxzdHJlcnJvcihlcnJubykpOworCSAgICB9CisJICAgIHRwID0gdGNwX2Nsb3NlKHRwKTsKKwkgICAgbV9mcmVlKG0pOworCSAgfSBlbHNlIHsKKwkgICAgLyoKKwkgICAgICogSGF2ZW4ndCBjb25uZWN0ZWQgeWV0LCBzYXZlIHRoZSBjdXJyZW50IG1idWYKKwkgICAgICogYW5kIHRpLCBhbmQgcmV0dXJuCisJICAgICAqIFhYWCBTb21lIE9TJ3MgZG9uJ3QgdGVsbCB1cyB3aGV0aGVyIHRoZSBjb25uZWN0KCkKKwkgICAgICogc3VjY2VlZGVkIG9yIG5vdC4gIFNvIHdlIG11c3QgdGltZSBpdCBvdXQuCisJICAgICAqLworCSAgICBzby0+c29fbSA9IG07CisJICAgIHNvLT5zb190aSA9IHRpOworCSAgICB0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUOworCSAgICB0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1JFQ0VJVkVEOworCSAgfQorCSAgcmV0dXJuOworCisJY29udF9jb25uOgorCSAgLyogbT09TlVMTAorCSAgICogQ2hlY2sgaWYgdGhlIGNvbm5lY3Qgc3VjY2VlZGVkCisJICAgKi8KKwkgIGlmIChzby0+c29fc3RhdGUgJiBTU19OT0ZEUkVGKSB7CisJICAgIHRwID0gdGNwX2Nsb3NlKHRwKTsKKwkgICAgZ290byBkcm9wd2l0aHJlc2V0OworCSAgfQorCWNvbnRfaW5wdXQ6CisJICB0Y3BfdGVtcGxhdGUodHApOworCisJICBpZiAob3B0cCkKKwkgICAgdGNwX2Rvb3B0aW9ucyh0cCwgKHVfY2hhciAqKW9wdHAsIG9wdGxlbiwgdGkpOworCSAgLyogLCAqLworCSAgLyoJCQkJJnRzX3ByZXNlbnQsICZ0c192YWwsICZ0c19lY3IpOyAqLworCisJICBpZiAoaXNzKQorCSAgICB0cC0+aXNzID0gaXNzOworCSAgZWxzZQorCSAgICB0cC0+aXNzID0gdGNwX2lzczsKKwkgIHRjcF9pc3MgKz0gVENQX0lTU0lOQ1IvMjsKKwkgIHRwLT5pcnMgPSB0aS0+dGlfc2VxOworCSAgdGNwX3NlbmRzZXFpbml0KHRwKTsKKwkgIHRjcF9yY3ZzZXFpbml0KHRwKTsKKwkgIHRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsKKwkgIHRwLT50X3N0YXRlID0gVENQU19TWU5fUkVDRUlWRUQ7CisJICB0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JTklUOworCSAgU1RBVCh0Y3BzdGF0LnRjcHNfYWNjZXB0cysrKTsKKwkgIGdvdG8gdHJpbXRoZW5zdGVwNjsKKwl9IC8qIGNhc2UgVENQU19MSVNURU4gKi8KKworCS8qCisJICogSWYgdGhlIHN0YXRlIGlzIFNZTl9TRU5UOgorCSAqCWlmIHNlZyBjb250YWlucyBhbiBBQ0ssIGJ1dCBub3QgZm9yIG91ciBTWU4sIGRyb3AgdGhlIGlucHV0LgorCSAqCWlmIHNlZyBjb250YWlucyBhIFJTVCwgdGhlbiBkcm9wIHRoZSBjb25uZWN0aW9uLgorCSAqCWlmIHNlZyBkb2VzIG5vdCBjb250YWluIFNZTiwgdGhlbiBkcm9wIGl0LgorCSAqIE90aGVyd2lzZSB0aGlzIGlzIGFuIGFjY2VwdGFibGUgU1lOIHNlZ21lbnQKKwkgKglpbml0aWFsaXplIHRwLT5yY3Zfbnh0IGFuZCB0cC0+aXJzCisJICoJaWYgc2VnIGNvbnRhaW5zIGFjayB0aGVuIGFkdmFuY2UgdHAtPnNuZF91bmEKKwkgKglpZiBTWU4gaGFzIGJlZW4gYWNrZWQgY2hhbmdlIHRvIEVTVEFCTElTSEVEIGVsc2UgU1lOX1JDVkQgc3RhdGUKKwkgKglhcnJhbmdlIGZvciBzZWdtZW50IHRvIGJlIGFja2VkIChldmVudHVhbGx5KQorCSAqCWNvbnRpbnVlIHByb2Nlc3NpbmcgcmVzdCBvZiBkYXRhL2NvbnRyb2xzLCBiZWdpbm5pbmcgd2l0aCBVUkcKKwkgKi8KKwljYXNlIFRDUFNfU1lOX1NFTlQ6CisJCWlmICgodGlmbGFncyAmIFRIX0FDSykgJiYKKwkJICAgIChTRVFfTEVRKHRpLT50aV9hY2ssIHRwLT5pc3MpIHx8CisJCSAgICAgU0VRX0dUKHRpLT50aV9hY2ssIHRwLT5zbmRfbWF4KSkpCisJCQlnb3RvIGRyb3B3aXRocmVzZXQ7CisKKwkJaWYgKHRpZmxhZ3MgJiBUSF9SU1QpIHsKKwkJCWlmICh0aWZsYWdzICYgVEhfQUNLKQorCQkJCXRwID0gdGNwX2Ryb3AodHAsMCk7IC8qIFhYWCBDaGVjayB0X3NvZnRlcnJvciEgKi8KKwkJCWdvdG8gZHJvcDsKKwkJfQorCisJCWlmICgodGlmbGFncyAmIFRIX1NZTikgPT0gMCkKKwkJCWdvdG8gZHJvcDsKKwkJaWYgKHRpZmxhZ3MgJiBUSF9BQ0spIHsKKwkJCXRwLT5zbmRfdW5hID0gdGktPnRpX2FjazsKKwkJCWlmIChTRVFfTFQodHAtPnNuZF9ueHQsIHRwLT5zbmRfdW5hKSkKKwkJCQl0cC0+c25kX254dCA9IHRwLT5zbmRfdW5hOworCQl9CisKKwkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSAwOworCQl0cC0+aXJzID0gdGktPnRpX3NlcTsKKwkJdGNwX3JjdnNlcWluaXQodHApOworCQl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJCWlmICh0aWZsYWdzICYgVEhfQUNLICYmIFNFUV9HVCh0cC0+c25kX3VuYSwgdHAtPmlzcykpIHsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX2Nvbm5lY3RzKyspOworCQkJc29pc2Zjb25uZWN0ZWQoc28pOworCQkJdHAtPnRfc3RhdGUgPSBUQ1BTX0VTVEFCTElTSEVEOworCisJCQkvKiBEbyB3aW5kb3cgc2NhbGluZyBvbiB0aGlzIGNvbm5lY3Rpb24/ICovCisvKgkJCWlmICgodHAtPnRfZmxhZ3MgJiAoVEZfUkNWRF9TQ0FMRXxURl9SRVFfU0NBTEUpKSA9PQorICoJCQkJKFRGX1JDVkRfU0NBTEV8VEZfUkVRX1NDQUxFKSkgeworICogCQkJCXRwLT5zbmRfc2NhbGUgPSB0cC0+cmVxdWVzdGVkX3Nfc2NhbGU7CisgKgkJCQl0cC0+cmN2X3NjYWxlID0gdHAtPnJlcXVlc3Rfcl9zY2FsZTsKKyAqCQkJfQorICovCisJCQkodm9pZCkgdGNwX3JlYXNzKHRwLCAoc3RydWN0IHRjcGlwaGRyICopMCwKKwkJCQkoc3RydWN0IG1idWYgKikwKTsKKwkJCS8qCisJCQkgKiBpZiB3ZSBkaWRuJ3QgaGF2ZSB0byByZXRyYW5zbWl0IHRoZSBTWU4sCisJCQkgKiB1c2UgaXRzIHJ0dCBhcyBvdXIgaW5pdGlhbCBzcnR0ICYgcnR0IHZhci4KKwkJCSAqLworCQkJaWYgKHRwLT50X3J0dCkKKwkJCQl0Y3BfeG1pdF90aW1lcih0cCwgdHAtPnRfcnR0KTsKKwkJfSBlbHNlCisJCQl0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1JFQ0VJVkVEOworCit0cmltdGhlbnN0ZXA2OgorCQkvKgorCQkgKiBBZHZhbmNlIHRpLT50aV9zZXEgdG8gY29ycmVzcG9uZCB0byBmaXJzdCBkYXRhIGJ5dGUuCisJCSAqIElmIGRhdGEsIHRyaW0gdG8gc3RheSB3aXRoaW4gd2luZG93LAorCQkgKiBkcm9wcGluZyBGSU4gaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJdGktPnRpX3NlcSsrOworCQlpZiAodGktPnRpX2xlbiA+IHRwLT5yY3Zfd25kKSB7CisJCQl0b2Ryb3AgPSB0aS0+dGlfbGVuIC0gdHAtPnJjdl93bmQ7CisJCQltX2FkaihtLCAtdG9kcm9wKTsKKwkJCXRpLT50aV9sZW4gPSB0cC0+cmN2X3duZDsKKwkJCXRpZmxhZ3MgJj0gflRIX0ZJTjsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdnBhY2thZnRlcndpbisrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmJ5dGVhZnRlcndpbiArPSB0b2Ryb3ApOworCQl9CisJCXRwLT5zbmRfd2wxID0gdGktPnRpX3NlcSAtIDE7CisJCXRwLT5yY3ZfdXAgPSB0aS0+dGlfc2VxOworCQlnb3RvIHN0ZXA2OworCX0gLyogc3dpdGNoIHRwLT50X3N0YXRlICovCisJLyoKKwkgKiBTdGF0ZXMgb3RoZXIgdGhhbiBMSVNURU4gb3IgU1lOX1NFTlQuCisJICogRmlyc3QgY2hlY2sgdGltZXN0YW1wLCBpZiBwcmVzZW50LgorCSAqIFRoZW4gY2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIGJ5dGVzIG9mIHNlZ21lbnQgYXJlIHdpdGhpbgorCSAqIHJlY2VpdmUgd2luZG93LiAgSWYgc2VnbWVudCBiZWdpbnMgYmVmb3JlIHJjdl9ueHQsCisJICogZHJvcCBsZWFkaW5nIGRhdGEgKGFuZCBTWU4pOyBpZiBub3RoaW5nIGxlZnQsIGp1c3QgYWNrLgorCSAqCisJICogUkZDIDEzMjMgUEFXUzogSWYgd2UgaGF2ZSBhIHRpbWVzdGFtcCByZXBseSBvbiB0aGlzIHNlZ21lbnQKKwkgKiBhbmQgaXQncyBsZXNzIHRoYW4gdHNfcmVjZW50LCBkcm9wIGl0LgorCSAqLworLyoJaWYgKHRzX3ByZXNlbnQgJiYgKHRpZmxhZ3MgJiBUSF9SU1QpID09IDAgJiYgdHAtPnRzX3JlY2VudCAmJgorICoJICAgIFRTVE1QX0xUKHRzX3ZhbCwgdHAtPnRzX3JlY2VudCkpIHsKKyAqCisgKi8JCS8qIENoZWNrIHRvIHNlZSBpZiB0c19yZWNlbnQgaXMgb3ZlciAyNCBkYXlzIG9sZC4gICovCisvKgkJaWYgKChpbnQpKHRjcF9ub3cgLSB0cC0+dHNfcmVjZW50X2FnZSkgPiBUQ1BfUEFXU19JRExFKSB7CisgKi8JCQkvKgorICoJCQkgKiBJbnZhbGlkYXRlIHRzX3JlY2VudC4gIElmIHRoaXMgc2VnbWVudCB1cGRhdGVzCisgKgkJCSAqIHRzX3JlY2VudCwgdGhlIGFnZSB3aWxsIGJlIHJlc2V0IGxhdGVyIGFuZCB0c19yZWNlbnQKKyAqCQkJICogd2lsbCBnZXQgYSB2YWxpZCB2YWx1ZS4gIElmIGl0IGRvZXMgbm90LCBzZXR0aW5nCisgKgkJCSAqIHRzX3JlY2VudCB0byB6ZXJvIHdpbGwgYXQgbGVhc3Qgc2F0aXNmeSB0aGUKKyAqCQkJICogcmVxdWlyZW1lbnQgdGhhdCB6ZXJvIGJlIHBsYWNlZCBpbiB0aGUgdGltZXN0YW1wCisgKgkJCSAqIGVjaG8gcmVwbHkgd2hlbiB0c19yZWNlbnQgaXNuJ3QgdmFsaWQuICBUaGUKKyAqCQkJICogYWdlIGlzbid0IHJlc2V0IHVudGlsIHdlIGdldCBhIHZhbGlkIHRzX3JlY2VudAorICoJCQkgKiBiZWNhdXNlIHdlIGRvbid0IHdhbnQgb3V0LW9mLW9yZGVyIHNlZ21lbnRzIHRvIGJlCisgKgkJCSAqIGRyb3BwZWQgd2hlbiB0c19yZWNlbnQgaXMgb2xkLgorICoJCQkgKi8KKy8qCQkJdHAtPnRzX3JlY2VudCA9IDA7CisgKgkJfSBlbHNlIHsKKyAqCQkJdGNwc3RhdC50Y3BzX3JjdmR1cHBhY2srKzsKKyAqCQkJdGNwc3RhdC50Y3BzX3JjdmR1cGJ5dGUgKz0gdGktPnRpX2xlbjsKKyAqCQkJdGNwc3RhdC50Y3BzX3Bhd3Nkcm9wKys7CisgKgkJCWdvdG8gZHJvcGFmdGVyYWNrOworICoJCX0KKyAqCX0KKyAqLworCisJdG9kcm9wID0gdHAtPnJjdl9ueHQgLSB0aS0+dGlfc2VxOworCWlmICh0b2Ryb3AgPiAwKSB7CisJCWlmICh0aWZsYWdzICYgVEhfU1lOKSB7CisJCQl0aWZsYWdzICY9IH5USF9TWU47CisJCQl0aS0+dGlfc2VxKys7CisJCQlpZiAodGktPnRpX3VycCA+IDEpCisJCQkJdGktPnRpX3VycC0tOworCQkJZWxzZQorCQkJCXRpZmxhZ3MgJj0gflRIX1VSRzsKKwkJCXRvZHJvcC0tOworCQl9CisJCS8qCisJCSAqIEZvbGxvd2luZyBpZiBzdGF0ZW1lbnQgZnJvbSBTdGV2ZW5zLCB2b2wuIDIsIHAuIDk2MC4KKwkJICovCisJCWlmICh0b2Ryb3AgPiB0aS0+dGlfbGVuCisJCSAgICB8fCAodG9kcm9wID09IHRpLT50aV9sZW4gJiYgKHRpZmxhZ3MgJiBUSF9GSU4pID09IDApKSB7CisJCQkvKgorCQkJICogQW55IHZhbGlkIEZJTiBtdXN0IGJlIHRvIHRoZSBsZWZ0IG9mIHRoZSB3aW5kb3cuCisJCQkgKiBBdCB0aGlzIHBvaW50IHRoZSBGSU4gbXVzdCBiZSBhIGR1cGxpY2F0ZSBvciBvdXQKKwkJCSAqIG9mIHNlcXVlbmNlOyBkcm9wIGl0LgorCQkJICovCisJCQl0aWZsYWdzICY9IH5USF9GSU47CisKKwkJCS8qCisJCQkgKiBTZW5kIGFuIEFDSyB0byByZXN5bmNocm9uaXplIGFuZCBkcm9wIGFueSBkYXRhLgorCQkJICogQnV0IGtlZXAgb24gcHJvY2Vzc2luZyBmb3IgUlNUIG9yIEFDSy4KKwkJCSAqLworCQkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCQkJdG9kcm9wID0gdGktPnRpX2xlbjsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdmR1cHBhY2srKyk7CisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZkdXBieXRlICs9IHRvZHJvcCk7CisJCX0gZWxzZSB7CisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZwYXJ0ZHVwcGFjaysrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3JjdnBhcnRkdXBieXRlICs9IHRvZHJvcCk7CisJCX0KKwkJbV9hZGoobSwgdG9kcm9wKTsKKwkJdGktPnRpX3NlcSArPSB0b2Ryb3A7CisJCXRpLT50aV9sZW4gLT0gdG9kcm9wOworCQlpZiAodGktPnRpX3VycCA+IHRvZHJvcCkKKwkJCXRpLT50aV91cnAgLT0gdG9kcm9wOworCQllbHNlIHsKKwkJCXRpZmxhZ3MgJj0gflRIX1VSRzsKKwkJCXRpLT50aV91cnAgPSAwOworCQl9CisJfQorCS8qCisJICogSWYgbmV3IGRhdGEgYXJlIHJlY2VpdmVkIG9uIGEgY29ubmVjdGlvbiBhZnRlciB0aGUKKwkgKiB1c2VyIHByb2Nlc3NlcyBhcmUgZ29uZSwgdGhlbiBSU1QgdGhlIG90aGVyIGVuZC4KKwkgKi8KKwlpZiAoKHNvLT5zb19zdGF0ZSAmIFNTX05PRkRSRUYpICYmCisJICAgIHRwLT50X3N0YXRlID4gVENQU19DTE9TRV9XQUlUICYmIHRpLT50aV9sZW4pIHsKKwkJdHAgPSB0Y3BfY2xvc2UodHApOworCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZhZnRlcmNsb3NlKyspOworCQlnb3RvIGRyb3B3aXRocmVzZXQ7CisJfQorCisJLyoKKwkgKiBJZiBzZWdtZW50IGVuZHMgYWZ0ZXIgd2luZG93LCBkcm9wIHRyYWlsaW5nIGRhdGEKKwkgKiAoYW5kIFBVU0ggYW5kIEZJTik7IGlmIG5vdGhpbmcgbGVmdCwganVzdCBBQ0suCisJICovCisJdG9kcm9wID0gKHRpLT50aV9zZXErdGktPnRpX2xlbikgLSAodHAtPnJjdl9ueHQrdHAtPnJjdl93bmQpOworCWlmICh0b2Ryb3AgPiAwKSB7CisJCVNUQVQodGNwc3RhdC50Y3BzX3JjdnBhY2thZnRlcndpbisrKTsKKwkJaWYgKHRvZHJvcCA+PSB0aS0+dGlfbGVuKSB7CisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZieXRlYWZ0ZXJ3aW4gKz0gdGktPnRpX2xlbik7CisJCQkvKgorCQkJICogSWYgYSBuZXcgY29ubmVjdGlvbiByZXF1ZXN0IGlzIHJlY2VpdmVkCisJCQkgKiB3aGlsZSBpbiBUSU1FX1dBSVQsIGRyb3AgdGhlIG9sZCBjb25uZWN0aW9uCisJCQkgKiBhbmQgc3RhcnQgb3ZlciBpZiB0aGUgc2VxdWVuY2UgbnVtYmVycworCQkJICogYXJlIGFib3ZlIHRoZSBwcmV2aW91cyBvbmVzLgorCQkJICovCisJCQlpZiAodGlmbGFncyAmIFRIX1NZTiAmJgorCQkJICAgIHRwLT50X3N0YXRlID09IFRDUFNfVElNRV9XQUlUICYmCisJCQkgICAgU0VRX0dUKHRpLT50aV9zZXEsIHRwLT5yY3Zfbnh0KSkgeworCQkJCWlzcyA9IHRwLT5yY3Zfbnh0ICsgVENQX0lTU0lOQ1I7CisJCQkJdHAgPSB0Y3BfY2xvc2UodHApOworCQkJCWdvdG8gZmluZHNvOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHdpbmRvdyBpcyBjbG9zZWQgY2FuIG9ubHkgdGFrZSBzZWdtZW50cyBhdAorCQkJICogd2luZG93IGVkZ2UsIGFuZCBoYXZlIHRvIGRyb3AgZGF0YSBhbmQgUFVTSCBmcm9tCisJCQkgKiBpbmNvbWluZyBzZWdtZW50cy4gIENvbnRpbnVlIHByb2Nlc3NpbmcsIGJ1dAorCQkJICogcmVtZW1iZXIgdG8gYWNrLiAgT3RoZXJ3aXNlLCBkcm9wIHNlZ21lbnQKKwkJCSAqIGFuZCBhY2suCisJCQkgKi8KKwkJCWlmICh0cC0+cmN2X3duZCA9PSAwICYmIHRpLT50aV9zZXEgPT0gdHAtPnJjdl9ueHQpIHsKKwkJCQl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2d2lucHJvYmUrKyk7CisJCQl9IGVsc2UKKwkJCQlnb3RvIGRyb3BhZnRlcmFjazsKKwkJfSBlbHNlCisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZieXRlYWZ0ZXJ3aW4gKz0gdG9kcm9wKTsKKwkJbV9hZGoobSwgLXRvZHJvcCk7CisJCXRpLT50aV9sZW4gLT0gdG9kcm9wOworCQl0aWZsYWdzICY9IH4oVEhfUFVTSHxUSF9GSU4pOworCX0KKworCS8qCisJICogSWYgbGFzdCBBQ0sgZmFsbHMgd2l0aGluIHRoaXMgc2VnbWVudCdzIHNlcXVlbmNlIG51bWJlcnMsCisJICogcmVjb3JkIGl0cyB0aW1lc3RhbXAuCisJICovCisvKglpZiAodHNfcHJlc2VudCAmJiBTRVFfTEVRKHRpLT50aV9zZXEsIHRwLT5sYXN0X2Fja19zZW50KSAmJgorICoJICAgIFNFUV9MVCh0cC0+bGFzdF9hY2tfc2VudCwgdGktPnRpX3NlcSArIHRpLT50aV9sZW4gKworICoJCSAgICgodGlmbGFncyAmIChUSF9TWU58VEhfRklOKSkgIT0gMCkpKSB7CisgKgkJdHAtPnRzX3JlY2VudF9hZ2UgPSB0Y3Bfbm93OworICoJCXRwLT50c19yZWNlbnQgPSB0c192YWw7CisgKgl9CisgKi8KKworCS8qCisJICogSWYgdGhlIFJTVCBiaXQgaXMgc2V0IGV4YW1pbmUgdGhlIHN0YXRlOgorCSAqICAgIFNZTl9SRUNFSVZFRCBTVEFURToKKwkgKglJZiBwYXNzaXZlIG9wZW4sIHJldHVybiB0byBMSVNURU4gc3RhdGUuCisJICoJSWYgYWN0aXZlIG9wZW4sIGluZm9ybSB1c2VyIHRoYXQgY29ubmVjdGlvbiB3YXMgcmVmdXNlZC4KKwkgKiAgICBFU1RBQkxJU0hFRCwgRklOX1dBSVRfMSwgRklOX1dBSVQyLCBDTE9TRV9XQUlUIFNUQVRFUzoKKwkgKglJbmZvcm0gdXNlciB0aGF0IGNvbm5lY3Rpb24gd2FzIHJlc2V0LCBhbmQgY2xvc2UgdGNiLgorCSAqICAgIENMT1NJTkcsIExBU1RfQUNLLCBUSU1FX1dBSVQgU1RBVEVTCisJICoJQ2xvc2UgdGhlIHRjYi4KKwkgKi8KKwlpZiAodGlmbGFncyZUSF9SU1QpIHN3aXRjaCAodHAtPnRfc3RhdGUpIHsKKworCWNhc2UgVENQU19TWU5fUkVDRUlWRUQ6CisvKgkJc28tPnNvX2Vycm9yID0gRUNPTk5SRUZVU0VEOyAqLworCQlnb3RvIGNsb3NlOworCisJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgorCWNhc2UgVENQU19GSU5fV0FJVF8xOgorCWNhc2UgVENQU19GSU5fV0FJVF8yOgorCWNhc2UgVENQU19DTE9TRV9XQUlUOgorLyoJCXNvLT5zb19lcnJvciA9IEVDT05OUkVTRVQ7ICovCisJY2xvc2U6CisJCXRwLT50X3N0YXRlID0gVENQU19DTE9TRUQ7CisJCVNUQVQodGNwc3RhdC50Y3BzX2Ryb3BzKyspOworCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCWdvdG8gZHJvcDsKKworCWNhc2UgVENQU19DTE9TSU5HOgorCWNhc2UgVENQU19MQVNUX0FDSzoKKwljYXNlIFRDUFNfVElNRV9XQUlUOgorCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKgorCSAqIElmIGEgU1lOIGlzIGluIHRoZSB3aW5kb3csIHRoZW4gdGhpcyBpcyBhbgorCSAqIGVycm9yIGFuZCB3ZSBzZW5kIGFuIFJTVCBhbmQgZHJvcCB0aGUgY29ubmVjdGlvbi4KKwkgKi8KKwlpZiAodGlmbGFncyAmIFRIX1NZTikgeworCQl0cCA9IHRjcF9kcm9wKHRwLDApOworCQlnb3RvIGRyb3B3aXRocmVzZXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgQUNLIGJpdCBpcyBvZmYgd2UgZHJvcCB0aGUgc2VnbWVudCBhbmQgcmV0dXJuLgorCSAqLworCWlmICgodGlmbGFncyAmIFRIX0FDSykgPT0gMCkgZ290byBkcm9wOworCisJLyoKKwkgKiBBY2sgcHJvY2Vzc2luZy4KKwkgKi8KKwlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisJLyoKKwkgKiBJbiBTWU5fUkVDRUlWRUQgc3RhdGUgaWYgdGhlIGFjayBBQ0tzIG91ciBTWU4gdGhlbiBlbnRlcgorCSAqIEVTVEFCTElTSEVEIHN0YXRlIGFuZCBjb250aW51ZSBwcm9jZXNzaW5nLCBvdGhlcndpc2UKKwkgKiBzZW5kIGFuIFJTVC4gIHVuYTw9YWNrPD1tYXgKKwkgKi8KKwljYXNlIFRDUFNfU1lOX1JFQ0VJVkVEOgorCisJCWlmIChTRVFfR1QodHAtPnNuZF91bmEsIHRpLT50aV9hY2spIHx8CisJCSAgICBTRVFfR1QodGktPnRpX2FjaywgdHAtPnNuZF9tYXgpKQorCQkJZ290byBkcm9wd2l0aHJlc2V0OworCQlTVEFUKHRjcHN0YXQudGNwc19jb25uZWN0cysrKTsKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0VTVEFCTElTSEVEOworCQkvKgorCQkgKiBUaGUgc2VudCBTWU4gaXMgYWNrJ2VkIHdpdGggb3VyIHNlcXVlbmNlIG51bWJlciArMQorCQkgKiBUaGUgZmlyc3QgZGF0YSBieXRlIGFscmVhZHkgaW4gdGhlIGJ1ZmZlciB3aWxsIGdldAorCQkgKiBsb3N0IGlmIG5vIGNvcnJlY3Rpb24gaXMgbWFkZS4gIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yCisJCSAqIFNTX0NUTCBzaW5jZSB0aGUgYnVmZmVyIGlzIGVtcHR5IG90aGVyd2lzZS4KKwkJICogdHAtPnNuZF91bmErKzsgb3I6CisJCSAqLworCQl0cC0+c25kX3VuYT10aS0+dGlfYWNrOworCQlpZiAoc28tPnNvX3N0YXRlICYgU1NfQ1RMKSB7CisJCSAgLyogU28gdGNwX2N0bCByZXBvcnRzIHRoZSByaWdodCBzdGF0ZSAqLworCQkgIHJldCA9IHRjcF9jdGwoc28pOworCQkgIGlmIChyZXQgPT0gMSkgeworCQkgICAgc29pc2Zjb25uZWN0ZWQoc28pOworCQkgICAgc28tPnNvX3N0YXRlICY9IH5TU19DVEw7ICAgLyogc3VjY2VzcyBYWFggKi8KKwkJICB9IGVsc2UgaWYgKHJldCA9PSAyKSB7CisJCSAgICBzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOyAvKiBDVExfQ01EICovCisJCSAgfSBlbHNlIHsKKwkJICAgIG5lZWRvdXRwdXQgPSAxOworCQkgICAgdHAtPnRfc3RhdGUgPSBUQ1BTX0ZJTl9XQUlUXzE7CisJCSAgfQorCQl9IGVsc2UgeworCQkgIHNvaXNmY29ubmVjdGVkKHNvKTsKKwkJfQorCisJCS8qIERvIHdpbmRvdyBzY2FsaW5nPyAqLworLyoJCWlmICgodHAtPnRfZmxhZ3MgJiAoVEZfUkNWRF9TQ0FMRXxURl9SRVFfU0NBTEUpKSA9PQorICoJCQkoVEZfUkNWRF9TQ0FMRXxURl9SRVFfU0NBTEUpKSB7CisgKgkJCXRwLT5zbmRfc2NhbGUgPSB0cC0+cmVxdWVzdGVkX3Nfc2NhbGU7CisgKgkJCXRwLT5yY3Zfc2NhbGUgPSB0cC0+cmVxdWVzdF9yX3NjYWxlOworICoJCX0KKyAqLworCQkodm9pZCkgdGNwX3JlYXNzKHRwLCAoc3RydWN0IHRjcGlwaGRyICopMCwgKHN0cnVjdCBtYnVmICopMCk7CisJCXRwLT5zbmRfd2wxID0gdGktPnRpX3NlcSAtIDE7CisJCS8qIEF2b2lkIGFjayBwcm9jZXNzaW5nOyBzbmRfdW5hPT10aV9hY2sgID0+ICBkdXAgYWNrICovCisJCWdvdG8gc3lucnhfdG9fZXN0OworCQkvKiBmYWxsIGludG8gLi4uICovCisKKwkvKgorCSAqIEluIEVTVEFCTElTSEVEIHN0YXRlOiBkcm9wIGR1cGxpY2F0ZSBBQ0tzOyBBQ0sgb3V0IG9mIHJhbmdlCisJICogQUNLcy4gIElmIHRoZSBhY2sgaXMgaW4gdGhlIHJhbmdlCisJICoJdHAtPnNuZF91bmEgPCB0aS0+dGlfYWNrIDw9IHRwLT5zbmRfbWF4CisJICogdGhlbiBhZHZhbmNlIHRwLT5zbmRfdW5hIHRvIHRpLT50aV9hY2sgYW5kIGRyb3AKKwkgKiBkYXRhIGZyb20gdGhlIHJldHJhbnNtaXNzaW9uIHF1ZXVlLiAgSWYgdGhpcyBBQ0sgcmVmbGVjdHMKKwkgKiBtb3JlIHVwIHRvIGRhdGUgd2luZG93IGluZm9ybWF0aW9uIHdlIHVwZGF0ZSBvdXIgd2luZG93IGluZm9ybWF0aW9uLgorCSAqLworCWNhc2UgVENQU19FU1RBQkxJU0hFRDoKKwljYXNlIFRDUFNfRklOX1dBSVRfMToKKwljYXNlIFRDUFNfRklOX1dBSVRfMjoKKwljYXNlIFRDUFNfQ0xPU0VfV0FJVDoKKwljYXNlIFRDUFNfQ0xPU0lORzoKKwljYXNlIFRDUFNfTEFTVF9BQ0s6CisJY2FzZSBUQ1BTX1RJTUVfV0FJVDoKKworCQlpZiAoU0VRX0xFUSh0aS0+dGlfYWNrLCB0cC0+c25kX3VuYSkpIHsKKwkJCWlmICh0aS0+dGlfbGVuID09IDAgJiYgdGl3aW4gPT0gdHAtPnNuZF93bmQpIHsKKwkJCSAgU1RBVCh0Y3BzdGF0LnRjcHNfcmN2ZHVwYWNrKyspOworCQkJICBERUJVR19NSVNDKChkZmQsIiBkdXAgYWNrICBtID0gJWx4ICBzbyA9ICVseCBcbiIsCisJCQkJICAgICAgKGxvbmcgKW0sIChsb25nIClzbykpOworCQkJCS8qCisJCQkJICogSWYgd2UgaGF2ZSBvdXRzdGFuZGluZyBkYXRhIChvdGhlciB0aGFuCisJCQkJICogYSB3aW5kb3cgcHJvYmUpLCB0aGlzIGlzIGEgY29tcGxldGVseQorCQkJCSAqIGR1cGxpY2F0ZSBhY2sgKGllLCB3aW5kb3cgaW5mbyBkaWRuJ3QKKwkJCQkgKiBjaGFuZ2UpLCB0aGUgYWNrIGlzIHRoZSBiaWdnZXN0IHdlJ3ZlCisJCQkJICogc2VlbiBhbmQgd2UndmUgc2VlbiBleGFjdGx5IG91ciByZXhtdAorCQkJCSAqIHRocmVzaG9sZCBvZiB0aGVtLCBhc3N1bWUgYSBwYWNrZXQKKwkJCQkgKiBoYXMgYmVlbiBkcm9wcGVkIGFuZCByZXRyYW5zbWl0IGl0LgorCQkJCSAqIEtsdWRnZSBzbmRfbnh0ICYgdGhlIGNvbmdlc3Rpb24KKwkJCQkgKiB3aW5kb3cgc28gd2Ugc2VuZCBvbmx5IHRoaXMgb25lCisJCQkJICogcGFja2V0LgorCQkJCSAqCisJCQkJICogV2Uga25vdyB3ZSdyZSBsb3NpbmcgYXQgdGhlIGN1cnJlbnQKKwkJCQkgKiB3aW5kb3cgc2l6ZSBzbyBkbyBjb25nZXN0aW9uIGF2b2lkYW5jZQorCQkJCSAqIChzZXQgc3N0aHJlc2ggdG8gaGFsZiB0aGUgY3VycmVudCB3aW5kb3cKKwkJCQkgKiBhbmQgcHVsbCBvdXIgY29uZ2VzdGlvbiB3aW5kb3cgYmFjayB0bworCQkJCSAqIHRoZSBuZXcgc3N0aHJlc2gpLgorCQkJCSAqCisJCQkJICogRHVwIGFja3MgbWVhbiB0aGF0IHBhY2tldHMgaGF2ZSBsZWZ0IHRoZQorCQkJCSAqIG5ldHdvcmsgKHRoZXkncmUgbm93IGNhY2hlZCBhdCB0aGUgcmVjZWl2ZXIpCisJCQkJICogc28gYnVtcCBjd25kIGJ5IHRoZSBhbW91bnQgaW4gdGhlIHJlY2VpdmVyCisJCQkJICogdG8ga2VlcCBhIGNvbnN0YW50IGN3bmQgcGFja2V0cyBpbiB0aGUKKwkJCQkgKiBuZXR3b3JrLgorCQkJCSAqLworCQkJCWlmICh0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9PSAwIHx8CisJCQkJICAgIHRpLT50aV9hY2sgIT0gdHAtPnNuZF91bmEpCisJCQkJCXRwLT50X2R1cGFja3MgPSAwOworCQkJCWVsc2UgaWYgKCsrdHAtPnRfZHVwYWNrcyA9PSBUQ1BSRVhNVFRIUkVTSCkgeworCQkJCQl0Y3Bfc2VxIG9ueHQgPSB0cC0+c25kX254dDsKKwkJCQkJdV9pbnQgd2luID0KKwkJCQkJICAgIG1pbih0cC0+c25kX3duZCwgdHAtPnNuZF9jd25kKSAvIDIgLworCQkJCQkJdHAtPnRfbWF4c2VnOworCisJCQkJCWlmICh3aW4gPCAyKQorCQkJCQkJd2luID0gMjsKKwkJCQkJdHAtPnNuZF9zc3RocmVzaCA9IHdpbiAqIHRwLT50X21heHNlZzsKKwkJCQkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSAwOworCQkJCQl0cC0+dF9ydHQgPSAwOworCQkJCQl0cC0+c25kX254dCA9IHRpLT50aV9hY2s7CisJCQkJCXRwLT5zbmRfY3duZCA9IHRwLT50X21heHNlZzsKKwkJCQkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQkJCQl0cC0+c25kX2N3bmQgPSB0cC0+c25kX3NzdGhyZXNoICsKKwkJCQkJICAgICAgIHRwLT50X21heHNlZyAqIHRwLT50X2R1cGFja3M7CisJCQkJCWlmIChTRVFfR1Qob254dCwgdHAtPnNuZF9ueHQpKQorCQkJCQkJdHAtPnNuZF9ueHQgPSBvbnh0OworCQkJCQlnb3RvIGRyb3A7CisJCQkJfSBlbHNlIGlmICh0cC0+dF9kdXBhY2tzID4gVENQUkVYTVRUSFJFU0gpIHsKKwkJCQkJdHAtPnNuZF9jd25kICs9IHRwLT50X21heHNlZzsKKwkJCQkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQkJCQlnb3RvIGRyb3A7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJdHAtPnRfZHVwYWNrcyA9IDA7CisJCQlicmVhazsKKwkJfQorCXN5bnJ4X3RvX2VzdDoKKwkJLyoKKwkJICogSWYgdGhlIGNvbmdlc3Rpb24gd2luZG93IHdhcyBpbmZsYXRlZCB0byBhY2NvdW50CisJCSAqIGZvciB0aGUgb3RoZXIgc2lkZSdzIGNhY2hlZCBwYWNrZXRzLCByZXRyYWN0IGl0LgorCQkgKi8KKwkJaWYgKHRwLT50X2R1cGFja3MgPiBUQ1BSRVhNVFRIUkVTSCAmJgorCQkgICAgdHAtPnNuZF9jd25kID4gdHAtPnNuZF9zc3RocmVzaCkKKwkJCXRwLT5zbmRfY3duZCA9IHRwLT5zbmRfc3N0aHJlc2g7CisJCXRwLT50X2R1cGFja3MgPSAwOworCQlpZiAoU0VRX0dUKHRpLT50aV9hY2ssIHRwLT5zbmRfbWF4KSkgeworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfcmN2YWNrdG9vbXVjaCsrKTsKKwkJCWdvdG8gZHJvcGFmdGVyYWNrOworCQl9CisJCWFja2VkID0gdGktPnRpX2FjayAtIHRwLT5zbmRfdW5hOworCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZhY2twYWNrKyspOworCQlTVEFUKHRjcHN0YXQudGNwc19yY3ZhY2tieXRlICs9IGFja2VkKTsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgdGltZXN0YW1wIHJlcGx5LCB1cGRhdGUgc21vb3RoZWQKKwkJICogcm91bmQgdHJpcCB0aW1lLiAgSWYgbm8gdGltZXN0YW1wIGlzIHByZXNlbnQgYnV0CisJCSAqIHRyYW5zbWl0IHRpbWVyIGlzIHJ1bm5pbmcgYW5kIHRpbWVkIHNlcXVlbmNlCisJCSAqIG51bWJlciB3YXMgYWNrZWQsIHVwZGF0ZSBzbW9vdGhlZCByb3VuZCB0cmlwIHRpbWUuCisJCSAqIFNpbmNlIHdlIG5vdyBoYXZlIGFuIHJ0dCBtZWFzdXJlbWVudCwgY2FuY2VsIHRoZQorCQkgKiB0aW1lciBiYWNrb2ZmIChjZi4sIFBoaWwgS2FybidzIHJldHJhbnNtaXQgYWxnLikuCisJCSAqIFJlY29tcHV0ZSB0aGUgaW5pdGlhbCByZXRyYW5zbWl0IHRpbWVyLgorCQkgKi8KKy8qCQlpZiAodHNfcHJlc2VudCkKKyAqCQkJdGNwX3htaXRfdGltZXIodHAsIHRjcF9ub3ctdHNfZWNyKzEpOworICoJCWVsc2UKKyAqLworCQkgICAgIGlmICh0cC0+dF9ydHQgJiYgU0VRX0dUKHRpLT50aV9hY2ssIHRwLT50X3J0c2VxKSkKKwkJCXRjcF94bWl0X3RpbWVyKHRwLHRwLT50X3J0dCk7CisKKwkJLyoKKwkJICogSWYgYWxsIG91dHN0YW5kaW5nIGRhdGEgaXMgYWNrZWQsIHN0b3AgcmV0cmFuc21pdAorCQkgKiB0aW1lciBhbmQgcmVtZW1iZXIgdG8gcmVzdGFydCAobW9yZSBvdXRwdXQgb3IgcGVyc2lzdCkuCisJCSAqIElmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBiZSBhY2tlZCwgcmVzdGFydCByZXRyYW5zbWl0CisJCSAqIHRpbWVyLCB1c2luZyBjdXJyZW50IChwb3NzaWJseSBiYWNrZWQtb2ZmKSB2YWx1ZS4KKwkJICovCisJCWlmICh0aS0+dGlfYWNrID09IHRwLT5zbmRfbWF4KSB7CisJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IDA7CisJCQluZWVkb3V0cHV0ID0gMTsKKwkJfSBlbHNlIGlmICh0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdID09IDApCisJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IHRwLT50X3J4dGN1cjsKKwkJLyoKKwkJICogV2hlbiBuZXcgZGF0YSBpcyBhY2tlZCwgb3BlbiB0aGUgY29uZ2VzdGlvbiB3aW5kb3cuCisJCSAqIElmIHRoZSB3aW5kb3cgZ2l2ZXMgdXMgbGVzcyB0aGFuIHNzdGhyZXNoIHBhY2tldHMKKwkJICogaW4gZmxpZ2h0LCBvcGVuIGV4cG9uZW50aWFsbHkgKG1heHNlZyBwZXIgcGFja2V0KS4KKwkJICogT3RoZXJ3aXNlIG9wZW4gbGluZWFybHk6IG1heHNlZyBwZXIgd2luZG93CisJCSAqIChtYXhzZWdeMiAvIGN3bmQgcGVyIHBhY2tldCkuCisJCSAqLworCQl7CisJCSAgcmVnaXN0ZXIgdV9pbnQgY3cgPSB0cC0+c25kX2N3bmQ7CisJCSAgcmVnaXN0ZXIgdV9pbnQgaW5jciA9IHRwLT50X21heHNlZzsKKworCQkgIGlmIChjdyA+IHRwLT5zbmRfc3N0aHJlc2gpCisJCSAgICBpbmNyID0gaW5jciAqIGluY3IgLyBjdzsKKwkJICB0cC0+c25kX2N3bmQgPSBtaW4oY3cgKyBpbmNyLCBUQ1BfTUFYV0lOPDx0cC0+c25kX3NjYWxlKTsKKwkJfQorCQlpZiAoYWNrZWQgPiBzby0+c29fc25kLnNiX2NjKSB7CisJCQl0cC0+c25kX3duZCAtPSBzby0+c29fc25kLnNiX2NjOworCQkJc2Jkcm9wKCZzby0+c29fc25kLCAoaW50IClzby0+c29fc25kLnNiX2NjKTsKKwkJCW91cmZpbmlzYWNrZWQgPSAxOworCQl9IGVsc2UgeworCQkJc2Jkcm9wKCZzby0+c29fc25kLCBhY2tlZCk7CisJCQl0cC0+c25kX3duZCAtPSBhY2tlZDsKKwkJCW91cmZpbmlzYWNrZWQgPSAwOworCQl9CisJCS8qCisJCSAqIFhYWCBzb3d3YWt1cCBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIGFja2VkIGFuZCB0aGVyZSdzIHJvb20gZm9yCisJCSAqIGZvciBtb3JlIGRhdGEuLi4gaXQgc2hvdWxkIHJlYWQoKSB0aGUgc29ja2V0CisJCSAqLworLyoJCWlmIChzby0+c29fc25kLnNiX2ZsYWdzICYgU0JfTk9USUZZKQorICoJCQlzb3d3YWtldXAoc28pOworICovCisJCXRwLT5zbmRfdW5hID0gdGktPnRpX2FjazsKKwkJaWYgKFNFUV9MVCh0cC0+c25kX254dCwgdHAtPnNuZF91bmEpKQorCQkJdHAtPnNuZF9ueHQgPSB0cC0+c25kX3VuYTsKKworCQlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwkJLyoKKwkJICogSW4gRklOX1dBSVRfMSBTVEFURSBpbiBhZGRpdGlvbiB0byB0aGUgcHJvY2Vzc2luZworCQkgKiBmb3IgdGhlIEVTVEFCTElTSEVEIHN0YXRlIGlmIG91ciBGSU4gaXMgbm93IGFja25vd2xlZGdlZAorCQkgKiB0aGVuIGVudGVyIEZJTl9XQUlUXzIuCisJCSAqLworCQljYXNlIFRDUFNfRklOX1dBSVRfMToKKwkJCWlmIChvdXJmaW5pc2Fja2VkKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBjYW4ndCByZWNlaXZlIGFueSBtb3JlCisJCQkJICogZGF0YSwgdGhlbiBjbG9zaW5nIHVzZXIgY2FuIHByb2NlZWQuCisJCQkJICogU3RhcnRpbmcgdGhlIHRpbWVyIGlzIGNvbnRyYXJ5IHRvIHRoZQorCQkJCSAqIHNwZWNpZmljYXRpb24sIGJ1dCBpZiB3ZSBkb24ndCBnZXQgYSBGSU4KKwkJCQkgKiB3ZSdsbCBoYW5nIGZvcmV2ZXIuCisJCQkJICovCisJCQkJaWYgKHNvLT5zb19zdGF0ZSAmIFNTX0ZDQU5UUkNWTU9SRSkgeworCQkJCQlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJCQkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSBUQ1BfTUFYSURMRTsKKwkJCQl9CisJCQkJdHAtPnRfc3RhdGUgPSBUQ1BTX0ZJTl9XQUlUXzI7CisJCQl9CisJCQlicmVhazsKKworCSAJLyoKKwkJICogSW4gQ0xPU0lORyBTVEFURSBpbiBhZGRpdGlvbiB0byB0aGUgcHJvY2Vzc2luZyBmb3IKKwkJICogdGhlIEVTVEFCTElTSEVEIHN0YXRlIGlmIHRoZSBBQ0sgYWNrbm93bGVkZ2VzIG91ciBGSU4KKwkJICogdGhlbiBlbnRlciB0aGUgVElNRS1XQUlUIHN0YXRlLCBvdGhlcndpc2UgaWdub3JlCisJCSAqIHRoZSBzZWdtZW50LgorCQkgKi8KKwkJY2FzZSBUQ1BTX0NMT1NJTkc6CisJCQlpZiAob3VyZmluaXNhY2tlZCkgeworCQkJCXRwLT50X3N0YXRlID0gVENQU19USU1FX1dBSVQ7CisJCQkJdGNwX2NhbmNlbHRpbWVycyh0cCk7CisJCQkJdHAtPnRfdGltZXJbVENQVF8yTVNMXSA9IDIgKiBUQ1BUVl9NU0w7CisJCQkJc29pc2ZkaXNjb25uZWN0ZWQoc28pOworCQkJfQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogSW4gTEFTVF9BQ0ssIHdlIG1heSBzdGlsbCBiZSB3YWl0aW5nIGZvciBkYXRhIHRvIGRyYWluCisJCSAqIGFuZC9vciB0byBiZSBhY2tlZCwgYXMgd2VsbCBhcyBmb3IgdGhlIGFjayBvZiBvdXIgRklOLgorCQkgKiBJZiBvdXIgRklOIGlzIG5vdyBhY2tub3dsZWRnZWQsIGRlbGV0ZSB0aGUgVENCLAorCQkgKiBlbnRlciB0aGUgY2xvc2VkIHN0YXRlIGFuZCByZXR1cm4uCisJCSAqLworCQljYXNlIFRDUFNfTEFTVF9BQ0s6CisJCQlpZiAob3VyZmluaXNhY2tlZCkgeworCQkJCXRwID0gdGNwX2Nsb3NlKHRwKTsKKwkJCQlnb3RvIGRyb3A7CisJCQl9CisJCQlicmVhazsKKworCQkvKgorCQkgKiBJbiBUSU1FX1dBSVQgc3RhdGUgdGhlIG9ubHkgdGhpbmcgdGhhdCBzaG91bGQgYXJyaXZlCisJCSAqIGlzIGEgcmV0cmFuc21pc3Npb24gb2YgdGhlIHJlbW90ZSBGSU4uICBBY2tub3dsZWRnZQorCQkgKiBpdCBhbmQgcmVzdGFydCB0aGUgZmluYWNrIHRpbWVyLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1RJTUVfV0FJVDoKKwkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSAyICogVENQVFZfTVNMOworCQkJZ290byBkcm9wYWZ0ZXJhY2s7CisJCX0KKwl9IC8qIHN3aXRjaCh0cC0+dF9zdGF0ZSkgKi8KKworc3RlcDY6CisJLyoKKwkgKiBVcGRhdGUgd2luZG93IGluZm9ybWF0aW9uLgorCSAqIERvbid0IGxvb2sgYXQgd2luZG93IGlmIG5vIEFDSzogVEFDJ3Mgc2VuZCBnYXJiYWdlIG9uIGZpcnN0IFNZTi4KKwkgKi8KKwlpZiAoKHRpZmxhZ3MgJiBUSF9BQ0spICYmCisJICAgIChTRVFfTFQodHAtPnNuZF93bDEsIHRpLT50aV9zZXEpIHx8CisJICAgICh0cC0+c25kX3dsMSA9PSB0aS0+dGlfc2VxICYmIChTRVFfTFQodHAtPnNuZF93bDIsIHRpLT50aV9hY2spIHx8CisJICAgICh0cC0+c25kX3dsMiA9PSB0aS0+dGlfYWNrICYmIHRpd2luID4gdHAtPnNuZF93bmQpKSkpKSB7CisJCS8qIGtlZXAgdHJhY2sgb2YgcHVyZSB3aW5kb3cgdXBkYXRlcyAqLworCQlpZiAodGktPnRpX2xlbiA9PSAwICYmCisJCSAgICB0cC0+c25kX3dsMiA9PSB0aS0+dGlfYWNrICYmIHRpd2luID4gdHAtPnNuZF93bmQpCisJCQlTVEFUKHRjcHN0YXQudGNwc19yY3Z3aW51cGQrKyk7CisJCXRwLT5zbmRfd25kID0gdGl3aW47CisJCXRwLT5zbmRfd2wxID0gdGktPnRpX3NlcTsKKwkJdHAtPnNuZF93bDIgPSB0aS0+dGlfYWNrOworCQlpZiAodHAtPnNuZF93bmQgPiB0cC0+bWF4X3NuZHduZCkKKwkJCXRwLT5tYXhfc25kd25kID0gdHAtPnNuZF93bmQ7CisJCW5lZWRvdXRwdXQgPSAxOworCX0KKworCS8qCisJICogUHJvY2VzcyBzZWdtZW50cyB3aXRoIFVSRy4KKwkgKi8KKwlpZiAoKHRpZmxhZ3MgJiBUSF9VUkcpICYmIHRpLT50aV91cnAgJiYKKwkgICAgVENQU19IQVZFUkNWREZJTih0cC0+dF9zdGF0ZSkgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIGlzIGEga2x1ZGdlLCBidXQgaWYgd2UgcmVjZWl2ZSBhbmQgYWNjZXB0CisJCSAqIHJhbmRvbSB1cmdlbnQgcG9pbnRlcnMsIHdlJ2xsIGNyYXNoIGluCisJCSAqIHNvcmVjZWl2ZS4gIEl0J3MgaGFyZCB0byBpbWFnaW5lIHNvbWVvbmUKKwkJICogYWN0dWFsbHkgd2FudGluZyB0byBzZW5kIHRoaXMgbXVjaCB1cmdlbnQgZGF0YS4KKwkJICovCisJCWlmICh0aS0+dGlfdXJwICsgc28tPnNvX3Jjdi5zYl9jYyA+IHNvLT5zb19yY3Yuc2JfZGF0YWxlbikgeworCQkJdGktPnRpX3VycCA9IDA7CisJCQl0aWZsYWdzICY9IH5USF9VUkc7CisJCQlnb3RvIGRvZGF0YTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGlzIHNlZ21lbnQgYWR2YW5jZXMgdGhlIGtub3duIHVyZ2VudCBwb2ludGVyLAorCQkgKiB0aGVuIG1hcmsgdGhlIGRhdGEgc3RyZWFtLiAgVGhpcyBzaG91bGQgbm90IGhhcHBlbgorCQkgKiBpbiBDTE9TRV9XQUlULCBDTE9TSU5HLCBMQVNUX0FDSyBvciBUSU1FX1dBSVQgU1RBVEVTIHNpbmNlCisJCSAqIGEgRklOIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIHJlbW90ZSBzaWRlLgorCQkgKiBJbiB0aGVzZSBzdGF0ZXMgd2UgaWdub3JlIHRoZSBVUkcuCisJCSAqCisJCSAqIEFjY29yZGluZyB0byBSRkM5NjEgKEFzc2lnbmVkIFByb3RvY29scyksCisJCSAqIHRoZSB1cmdlbnQgcG9pbnRlciBwb2ludHMgdG8gdGhlIGxhc3Qgb2N0ZXQKKwkJICogb2YgdXJnZW50IGRhdGEuICBXZSBjb250aW51ZSwgaG93ZXZlciwKKwkJICogdG8gY29uc2lkZXIgaXQgdG8gaW5kaWNhdGUgdGhlIGZpcnN0IG9jdGV0CisJCSAqIG9mIGRhdGEgcGFzdCB0aGUgdXJnZW50IHNlY3Rpb24gYXMgdGhlIG9yaWdpbmFsCisJCSAqIHNwZWMgc3RhdGVzIChpbiBvbmUgb2YgdHdvIHBsYWNlcykuCisJCSAqLworCQlpZiAoU0VRX0dUKHRpLT50aV9zZXErdGktPnRpX3VycCwgdHAtPnJjdl91cCkpIHsKKwkJCXRwLT5yY3ZfdXAgPSB0aS0+dGlfc2VxICsgdGktPnRpX3VycDsKKwkJCXNvLT5zb191cmdjID0gIHNvLT5zb19yY3Yuc2JfY2MgKworCQkJCSh0cC0+cmN2X3VwIC0gdHAtPnJjdl9ueHQpOyAvKiAtMTsgKi8KKwkJCXRwLT5yY3ZfdXAgPSB0aS0+dGlfc2VxICsgdGktPnRpX3VycDsKKworCQl9CisJfSBlbHNlCisJCS8qCisJCSAqIElmIG5vIG91dCBvZiBiYW5kIGRhdGEgaXMgZXhwZWN0ZWQsCisJCSAqIHB1bGwgcmVjZWl2ZSB1cmdlbnQgcG9pbnRlciBhbG9uZworCQkgKiB3aXRoIHRoZSByZWNlaXZlIHdpbmRvdy4KKwkJICovCisJCWlmIChTRVFfR1QodHAtPnJjdl9ueHQsIHRwLT5yY3ZfdXApKQorCQkJdHAtPnJjdl91cCA9IHRwLT5yY3Zfbnh0OworZG9kYXRhOgorCisJLyoKKwkgKiBQcm9jZXNzIHRoZSBzZWdtZW50IHRleHQsIG1lcmdpbmcgaXQgaW50byB0aGUgVENQIHNlcXVlbmNpbmcgcXVldWUsCisJICogYW5kIGFycmFuZ2luZyBmb3IgYWNrbm93bGVkZ21lbnQgb2YgcmVjZWlwdCBpZiBuZWNlc3NhcnkuCisJICogVGhpcyBwcm9jZXNzIGxvZ2ljYWxseSBpbnZvbHZlcyBhZGp1c3RpbmcgdHAtPnJjdl93bmQgYXMgZGF0YQorCSAqIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciAodGhpcyBoYXBwZW5zIGluIHRjcF91c3JyZXEuYywKKwkgKiBjYXNlIFBSVV9SQ1ZEKS4gIElmIGEgRklOIGhhcyBhbHJlYWR5IGJlZW4gcmVjZWl2ZWQgb24gdGhpcworCSAqIGNvbm5lY3Rpb24gdGhlbiB3ZSBqdXN0IGlnbm9yZSB0aGUgdGV4dC4KKwkgKi8KKwlpZiAoKHRpLT50aV9sZW4gfHwgKHRpZmxhZ3MmVEhfRklOKSkgJiYKKwkgICAgVENQU19IQVZFUkNWREZJTih0cC0+dF9zdGF0ZSkgPT0gMCkgeworCQlUQ1BfUkVBU1ModHAsIHRpLCBtLCBzbywgdGlmbGFncyk7CisJCS8qCisJCSAqIE5vdGUgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgcGVlciBoYXMgc2VudCBpbnRvCisJCSAqIG91ciB3aW5kb3csIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBzZW5kZXIncworCQkgKiBidWZmZXIgc2l6ZS4KKwkJICovCisJCWxlbiA9IHNvLT5zb19yY3Yuc2JfZGF0YWxlbiAtICh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KTsKKwl9IGVsc2UgeworCQltX2ZyZWUobSk7CisJCXRpZmxhZ3MgJj0gflRIX0ZJTjsKKwl9CisKKwkvKgorCSAqIElmIEZJTiBpcyByZWNlaXZlZCBBQ0sgdGhlIEZJTiBhbmQgbGV0IHRoZSB1c2VyIGtub3cKKwkgKiB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmcuCisJICovCisJaWYgKHRpZmxhZ3MgJiBUSF9GSU4pIHsKKwkJaWYgKFRDUFNfSEFWRVJDVkRGSU4odHAtPnRfc3RhdGUpID09IDApIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSByZWNlaXZlIGEgRklOIHdlIGNhbid0IHNlbmQgbW9yZSBkYXRhLAorCQkJICogc2V0IGl0IFNTX0ZEUkFJTgorICAgICAgICAgICAgICAgICAgICAgICAgICogU2h1dGRvd24gdGhlIHNvY2tldCBpZiB0aGVyZSBpcyBubyByeCBkYXRhIGluIHRoZQorCQkJICogYnVmZmVyLgorCQkJICogc29yZWFkKCkgaXMgY2FsbGVkIG9uIGNvbXBsZXRpb24gb2Ygc2h1dGRvd24oKSBhbmQKKwkJCSAqIHdpbGwgZ290IHRvIFRDUFNfTEFTVF9BQ0ssIGFuZCB1c2UgdGNwX291dHB1dCgpCisJCQkgKiB0byBzZW5kIHRoZSBGSU4uCisJCQkgKi8KKy8qCQkJc29mY2FudHJjdm1vcmUoc28pOyAqLworCQkJc29md2RyYWluKHNvKTsKKworCQkJdHAtPnRfZmxhZ3MgfD0gVEZfQUNLTk9XOworCQkJdHAtPnJjdl9ueHQrKzsKKwkJfQorCQlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwkgCS8qCisJCSAqIEluIFNZTl9SRUNFSVZFRCBhbmQgRVNUQUJMSVNIRUQgU1RBVEVTCisJCSAqIGVudGVyIHRoZSBDTE9TRV9XQUlUIHN0YXRlLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1NZTl9SRUNFSVZFRDoKKwkJY2FzZSBUQ1BTX0VTVEFCTElTSEVEOgorCQkgIGlmKHNvLT5zb19lbXUgPT0gRU1VX0NUTCkgICAgICAgIC8qIG5vIHNodXRkb3duIG9uIHNvY2tldCAqLworCQkgICAgdHAtPnRfc3RhdGUgPSBUQ1BTX0xBU1RfQUNLOworCQkgIGVsc2UKKwkJICAgIHRwLT50X3N0YXRlID0gVENQU19DTE9TRV9XQUlUOworCQkgIGJyZWFrOworCisJIAkvKgorCQkgKiBJZiBzdGlsbCBpbiBGSU5fV0FJVF8xIFNUQVRFIEZJTiBoYXMgbm90IGJlZW4gYWNrZWQgc28KKwkJICogZW50ZXIgdGhlIENMT1NJTkcgc3RhdGUuCisJCSAqLworCQljYXNlIFRDUFNfRklOX1dBSVRfMToKKwkJCXRwLT50X3N0YXRlID0gVENQU19DTE9TSU5HOworCQkJYnJlYWs7CisKKwkgCS8qCisJCSAqIEluIEZJTl9XQUlUXzIgc3RhdGUgZW50ZXIgdGhlIFRJTUVfV0FJVCBzdGF0ZSwKKwkJICogc3RhcnRpbmcgdGhlIHRpbWUtd2FpdCB0aW1lciwgdHVybmluZyBvZmYgdGhlIG90aGVyCisJCSAqIHN0YW5kYXJkIHRpbWVycy4KKwkJICovCisJCWNhc2UgVENQU19GSU5fV0FJVF8yOgorCQkJdHAtPnRfc3RhdGUgPSBUQ1BTX1RJTUVfV0FJVDsKKwkJCXRjcF9jYW5jZWx0aW1lcnModHApOworCQkJdHAtPnRfdGltZXJbVENQVF8yTVNMXSA9IDIgKiBUQ1BUVl9NU0w7CisJCQlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJCQlicmVhazsKKworCQkvKgorCQkgKiBJbiBUSU1FX1dBSVQgc3RhdGUgcmVzdGFydCB0aGUgMiBNU0wgdGltZV93YWl0IHRpbWVyLgorCQkgKi8KKwkJY2FzZSBUQ1BTX1RJTUVfV0FJVDoKKwkJCXRwLT50X3RpbWVyW1RDUFRfMk1TTF0gPSAyICogVENQVFZfTVNMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzbWFsbCBwYWNrZXQsIHRoZW4gQUNLIG5vdyAtIHdpdGggTmFnZWwKKwkgKiAgICAgIGNvbmdlc3Rpb24gYXZvaWRhbmNlIHNlbmRlciB3b24ndCBzZW5kIG1vcmUgdW50aWwKKwkgKiAgICAgIGhlIGdldHMgYW4gQUNLLgorCSAqCisJICogU2VlIGFib3ZlLgorCSAqLworLyoJaWYgKHRpLT50aV9sZW4gJiYgKHVuc2lnbmVkKXRpLT50aV9sZW4gPCB0cC0+dF9tYXhzZWcpIHsKKyAqLworLyoJaWYgKCh0aS0+dGlfbGVuICYmICh1bnNpZ25lZCl0aS0+dGlfbGVuIDwgdHAtPnRfbWF4c2VnICYmCisgKgkJKHNvLT5zb19pcHRvcyAmIElQVE9TX0xPV0RFTEFZKSA9PSAwKSB8fAorICoJICAgICAgICgoc28tPnNvX2lwdG9zICYgSVBUT1NfTE9XREVMQVkpICYmCisgKgkgICAgICAgKChzdHJ1Y3QgdGNwaXBoZHJfMiAqKXRpKS0+Zmlyc3RfY2hhciA9PSAoY2hhcikyNykpIHsKKyAqLworCWlmICh0aS0+dGlfbGVuICYmICh1bnNpZ25lZCl0aS0+dGlfbGVuIDw9IDUgJiYKKwkgICAgKChzdHJ1Y3QgdGNwaXBoZHJfMiAqKXRpKS0+Zmlyc3RfY2hhciA9PSAoY2hhcikyNykgeworCQl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gYW55IGRlc2lyZWQgb3V0cHV0LgorCSAqLworCWlmIChuZWVkb3V0cHV0IHx8ICh0cC0+dF9mbGFncyAmIFRGX0FDS05PVykpIHsKKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCX0KKwlyZXR1cm47CisKK2Ryb3BhZnRlcmFjazoKKwkvKgorCSAqIEdlbmVyYXRlIGFuIEFDSyBkcm9wcGluZyBpbmNvbWluZyBzZWdtZW50IGlmIGl0IG9jY3VwaWVzCisJICogc2VxdWVuY2Ugc3BhY2UsIHdoZXJlIHRoZSBBQ0sgcmVmbGVjdHMgb3VyIHN0YXRlLgorCSAqLworCWlmICh0aWZsYWdzICYgVEhfUlNUKQorCQlnb3RvIGRyb3A7CisJbV9mcmVlbShtKTsKKwl0cC0+dF9mbGFncyB8PSBURl9BQ0tOT1c7CisJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCXJldHVybjsKKworZHJvcHdpdGhyZXNldDoKKwkvKiByZXVzZXMgbSBpZiBtIT1OVUxMLCBtX2ZyZWUoKSB1bm5lY2Vzc2FyeSAqLworCWlmICh0aWZsYWdzICYgVEhfQUNLKQorCQl0Y3BfcmVzcG9uZCh0cCwgdGksIG0sICh0Y3Bfc2VxKTAsIHRpLT50aV9hY2ssIFRIX1JTVCk7CisJZWxzZSB7CisJCWlmICh0aWZsYWdzICYgVEhfU1lOKSB0aS0+dGlfbGVuKys7CisJCXRjcF9yZXNwb25kKHRwLCB0aSwgbSwgdGktPnRpX3NlcSt0aS0+dGlfbGVuLCAodGNwX3NlcSkwLAorCQkgICAgVEhfUlNUfFRIX0FDSyk7CisJfQorCisJcmV0dXJuOworCitkcm9wOgorCS8qCisJICogRHJvcCBzcGFjZSBoZWxkIGJ5IGluY29taW5nIHNlZ21lbnQgYW5kIHJldHVybi4KKwkgKi8KKwltX2ZyZWUobSk7CisKKwlyZXR1cm47Cit9CisKKyAvKiAsIHRzX3ByZXNlbnQsIHRzX3ZhbCwgdHNfZWNyKSAqLworLyoJaW50ICp0c19wcmVzZW50OworICoJdV9pbnQzMl90ICp0c192YWwsICp0c19lY3I7CisgKi8KK3N0YXRpYyB2b2lkCit0Y3BfZG9vcHRpb25zKHN0cnVjdCB0Y3BjYiAqdHAsIHVfY2hhciAqY3AsIGludCBjbnQsIHN0cnVjdCB0Y3BpcGhkciAqdGkpCit7CisJdV9pbnQxNl90IG1zczsKKwlpbnQgb3B0LCBvcHRsZW47CisKKwlERUJVR19DQUxMKCJ0Y3BfZG9vcHRpb25zIik7CisJREVCVUdfQVJHUygoZGZkLCIgdHAgPSAlbHggIGNudD0laSBcbiIsIChsb25nICl0cCwgY250KSk7CisKKwlmb3IgKDsgY250ID4gMDsgY250IC09IG9wdGxlbiwgY3AgKz0gb3B0bGVuKSB7CisJCW9wdCA9IGNwWzBdOworCQlpZiAob3B0ID09IFRDUE9QVF9FT0wpCisJCQlicmVhazsKKwkJaWYgKG9wdCA9PSBUQ1BPUFRfTk9QKQorCQkJb3B0bGVuID0gMTsKKwkJZWxzZSB7CisJCQlvcHRsZW4gPSBjcFsxXTsKKwkJCWlmIChvcHRsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKG9wdCkgeworCisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKworCQljYXNlIFRDUE9QVF9NQVhTRUc6CisJCQlpZiAob3B0bGVuICE9IFRDUE9MRU5fTUFYU0VHKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEodGktPnRpX2ZsYWdzICYgVEhfU1lOKSkKKwkJCQljb250aW51ZTsKKwkJCW1lbWNweSgoY2hhciAqKSAmbXNzLCAoY2hhciAqKSBjcCArIDIsIHNpemVvZihtc3MpKTsKKwkJCU5UT0hTKG1zcyk7CisJCQkodm9pZCkgdGNwX21zcyh0cCwgbXNzKTsJLyogc2V0cyB0X21heHNlZyAqLworCQkJYnJlYWs7CisKKy8qCQljYXNlIFRDUE9QVF9XSU5ET1c6CisgKgkJCWlmIChvcHRsZW4gIT0gVENQT0xFTl9XSU5ET1cpCisgKgkJCQljb250aW51ZTsKKyAqCQkJaWYgKCEodGktPnRpX2ZsYWdzICYgVEhfU1lOKSkKKyAqCQkJCWNvbnRpbnVlOworICoJCQl0cC0+dF9mbGFncyB8PSBURl9SQ1ZEX1NDQUxFOworICoJCQl0cC0+cmVxdWVzdGVkX3Nfc2NhbGUgPSBtaW4oY3BbMl0sIFRDUF9NQVhfV0lOU0hJRlQpOworICoJCQlicmVhazsKKyAqLworLyoJCWNhc2UgVENQT1BUX1RJTUVTVEFNUDoKKyAqCQkJaWYgKG9wdGxlbiAhPSBUQ1BPTEVOX1RJTUVTVEFNUCkKKyAqCQkJCWNvbnRpbnVlOworICoJCQkqdHNfcHJlc2VudCA9IDE7CisgKgkJCW1lbWNweSgoY2hhciAqKSB0c192YWwsIChjaGFyICopY3AgKyAyLCBzaXplb2YoKnRzX3ZhbCkpOworICoJCQlOVE9ITCgqdHNfdmFsKTsKKyAqCQkJbWVtY3B5KChjaGFyICopIHRzX2VjciwgKGNoYXIgKiljcCArIDYsIHNpemVvZigqdHNfZWNyKSk7CisgKgkJCU5UT0hMKCp0c19lY3IpOworICoKKyAqLwkJCS8qCisgKgkJCSAqIEEgdGltZXN0YW1wIHJlY2VpdmVkIGluIGEgU1lOIG1ha2VzCisgKgkJCSAqIGl0IG9rIHRvIHNlbmQgdGltZXN0YW1wIHJlcXVlc3RzIGFuZCByZXBsaWVzLgorICoJCQkgKi8KKy8qCQkJaWYgKHRpLT50aV9mbGFncyAmIFRIX1NZTikgeworICoJCQkJdHAtPnRfZmxhZ3MgfD0gVEZfUkNWRF9UU1RNUDsKKyAqCQkJCXRwLT50c19yZWNlbnQgPSAqdHNfdmFsOworICoJCQkJdHAtPnRzX3JlY2VudF9hZ2UgPSB0Y3Bfbm93OworICoJCQl9CisgKi8JCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogUHVsbCBvdXQgb2YgYmFuZCBieXRlIG91dCBvZiBhIHNlZ21lbnQgc28KKyAqIGl0IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSB1c2VyJ3MgZGF0YSBxdWV1ZS4KKyAqIEl0IGlzIHN0aWxsIHJlZmxlY3RlZCBpbiB0aGUgc2VnbWVudCBsZW5ndGggZm9yCisgKiBzZXF1ZW5jaW5nIHB1cnBvc2VzLgorICovCisKKyNpZmRlZiBub3RkZWYKKwordm9pZAordGNwX3B1bGxvdXRvZmJhbmQoc28sIHRpLCBtKQorCXN0cnVjdCBzb2NrZXQgKnNvOworCXN0cnVjdCB0Y3BpcGhkciAqdGk7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07Cit7CisJaW50IGNudCA9IHRpLT50aV91cnAgLSAxOworCisJd2hpbGUgKGNudCA+PSAwKSB7CisJCWlmIChtLT5tX2xlbiA+IGNudCkgeworCQkJY2hhciAqY3AgPSBtdG9kKG0sIGNhZGRyX3QpICsgY250OworCQkJc3RydWN0IHRjcGNiICp0cCA9IHNvdG90Y3BjYihzbyk7CisKKwkJCXRwLT50X2lvYmMgPSAqY3A7CisJCQl0cC0+dF9vb2JmbGFncyB8PSBUQ1BPT0JfSEFWRURBVEE7CisJCQltZW1jcHkoc3AsIGNwKzEsICh1bnNpZ25lZCkobS0+bV9sZW4gLSBjbnQgLSAxKSk7CisJCQltLT5tX2xlbi0tOworCQkJcmV0dXJuOworCQl9CisJCWNudCAtPSBtLT5tX2xlbjsKKwkJbSA9IG0tPm1fbmV4dDsgLyogWFhYIFdST05HISBGaXggaXQhICovCisJCWlmIChtID09IDApCisJCQlicmVhazsKKwl9CisJcGFuaWMoInRjcF9wdWxsb3V0b2ZiYW5kIik7Cit9CisKKyNlbmRpZiAvKiBub3RkZWYgKi8KKworLyoKKyAqIENvbGxlY3QgbmV3IHJvdW5kLXRyaXAgdGltZSBlc3RpbWF0ZQorICogYW5kIHVwZGF0ZSBhdmVyYWdlcyBhbmQgY3VycmVudCB0aW1lb3V0LgorICovCisKK3N0YXRpYyB2b2lkCit0Y3BfeG1pdF90aW1lcihyZWdpc3RlciBzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgcnR0KQoreworCXJlZ2lzdGVyIHNob3J0IGRlbHRhOworCisJREVCVUdfQ0FMTCgidGNwX3htaXRfdGltZXIiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOworCURFQlVHX0FSRygicnR0ID0gJWQiLCBydHQpOworCisJU1RBVCh0Y3BzdGF0LnRjcHNfcnR0dXBkYXRlZCsrKTsKKwlpZiAodHAtPnRfc3J0dCAhPSAwKSB7CisJCS8qCisJCSAqIHNydHQgaXMgc3RvcmVkIGFzIGZpeGVkIHBvaW50IHdpdGggMyBiaXRzIGFmdGVyIHRoZQorCQkgKiBiaW5hcnkgcG9pbnQgKGkuZS4sIHNjYWxlZCBieSA4KS4gIFRoZSBmb2xsb3dpbmcgbWFnaWMKKwkJICogaXMgZXF1aXZhbGVudCB0byB0aGUgc21vb3RoaW5nIGFsZ29yaXRobSBpbiByZmM3OTMgd2l0aAorCQkgKiBhbiBhbHBoYSBvZiAuODc1IChzcnR0ID0gcnR0LzggKyBzcnR0KjcvOCBpbiBmaXhlZAorCQkgKiBwb2ludCkuICBBZGp1c3QgcnR0IHRvIG9yaWdpbiAwLgorCQkgKi8KKwkJZGVsdGEgPSBydHQgLSAxIC0gKHRwLT50X3NydHQgPj4gVENQX1JUVF9TSElGVCk7CisJCWlmICgodHAtPnRfc3J0dCArPSBkZWx0YSkgPD0gMCkKKwkJCXRwLT50X3NydHQgPSAxOworCQkvKgorCQkgKiBXZSBhY2N1bXVsYXRlIGEgc21vb3RoZWQgcnR0IHZhcmlhbmNlIChhY3R1YWxseSwgYQorCQkgKiBzbW9vdGhlZCBtZWFuIGRpZmZlcmVuY2UpLCB0aGVuIHNldCB0aGUgcmV0cmFuc21pdAorCQkgKiB0aW1lciB0byBzbW9vdGhlZCBydHQgKyA0IHRpbWVzIHRoZSBzbW9vdGhlZCB2YXJpYW5jZS4KKwkJICogcnR0dmFyIGlzIHN0b3JlZCBhcyBmaXhlZCBwb2ludCB3aXRoIDIgYml0cyBhZnRlciB0aGUKKwkJICogYmluYXJ5IHBvaW50IChzY2FsZWQgYnkgNCkuICBUaGUgZm9sbG93aW5nIGlzCisJCSAqIGVxdWl2YWxlbnQgdG8gcmZjNzkzIHNtb290aGluZyB3aXRoIGFuIGFscGhhIG9mIC43NQorCQkgKiAocnR0dmFyID0gcnR0dmFyKjMvNCArIHxkZWx0YXwgLyA0KS4gIFRoaXMgcmVwbGFjZXMKKwkJICogcmZjNzkzJ3Mgd2lyZWQtaW4gYmV0YS4KKwkJICovCisJCWlmIChkZWx0YSA8IDApCisJCQlkZWx0YSA9IC1kZWx0YTsKKwkJZGVsdGEgLT0gKHRwLT50X3J0dHZhciA+PiBUQ1BfUlRUVkFSX1NISUZUKTsKKwkJaWYgKCh0cC0+dF9ydHR2YXIgKz0gZGVsdGEpIDw9IDApCisJCQl0cC0+dF9ydHR2YXIgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vIHJ0dCBtZWFzdXJlbWVudCB5ZXQgLSB1c2UgdGhlIHVuc21vb3RoZWQgcnR0LgorCQkgKiBTZXQgdGhlIHZhcmlhbmNlIHRvIGhhbGYgdGhlIHJ0dCAoc28gb3VyIGZpcnN0CisJCSAqIHJldHJhbnNtaXQgaGFwcGVucyBhdCAzKnJ0dCkuCisJCSAqLworCQl0cC0+dF9zcnR0ID0gcnR0IDw8IFRDUF9SVFRfU0hJRlQ7CisJCXRwLT50X3J0dHZhciA9IHJ0dCA8PCAoVENQX1JUVFZBUl9TSElGVCAtIDEpOworCX0KKwl0cC0+dF9ydHQgPSAwOworCXRwLT50X3J4dHNoaWZ0ID0gMDsKKworCS8qCisJICogdGhlIHJldHJhbnNtaXQgc2hvdWxkIGhhcHBlbiBhdCBydHQgKyA0ICogcnR0dmFyLgorCSAqIEJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyB0aGUgc21vb3RoaW5nLCBzcnR0IGFuZCBydHR2YXIKKwkgKiB3aWxsIGVhY2ggYXZlcmFnZSArMS8yIHRpY2sgb2YgYmlhcy4gIFdoZW4gd2UgY29tcHV0ZQorCSAqIHRoZSByZXRyYW5zbWl0IHRpbWVyLCB3ZSB3YW50IDEvMiB0aWNrIG9mIHJvdW5kaW5nIGFuZAorCSAqIDEgZXh0cmEgdGljayBiZWNhdXNlIG9mICstMS8yIHRpY2sgdW5jZXJ0YWludHkgaW4gdGhlCisJICogZmlyaW5nIG9mIHRoZSB0aW1lci4gIFRoZSBiaWFzIHdpbGwgZ2l2ZSB1cyBleGFjdGx5IHRoZQorCSAqIDEuNSB0aWNrIHdlIG5lZWQuICBCdXQsIGJlY2F1c2UgdGhlIGJpYXMgaXMKKwkgKiBzdGF0aXN0aWNhbCwgd2UgaGF2ZSB0byB0ZXN0IHRoYXQgd2UgZG9uJ3QgZHJvcCBiZWxvdworCSAqIHRoZSBtaW5pbXVtIGZlYXNpYmxlIHRpbWVyICh3aGljaCBpcyAyIHRpY2tzKS4KKwkgKi8KKwlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwgVENQX1JFWE1UVkFMKHRwKSwKKwkgICAgKHNob3J0KXRwLT50X3J0dG1pbiwgVENQVFZfUkVYTVRNQVgpOyAvKiBYWFggKi8KKworCS8qCisJICogV2UgcmVjZWl2ZWQgYW4gYWNrIGZvciBhIHBhY2tldCB0aGF0IHdhc24ndCByZXRyYW5zbWl0dGVkOworCSAqIGl0IGlzIHByb2JhYmx5IHNhZmUgdG8gZGlzY2FyZCBhbnkgZXJyb3IgaW5kaWNhdGlvbnMgd2UndmUKKwkgKiByZWNlaXZlZCByZWNlbnRseS4gIFRoaXMgaXNuJ3QgcXVpdGUgcmlnaHQsIGJ1dCBjbG9zZSBlbm91Z2gKKwkgKiBmb3Igbm93IChhIHJvdXRlIG1pZ2h0IGhhdmUgZmFpbGVkIGFmdGVyIHdlIHNlbnQgYSBzZWdtZW50LAorCSAqIGFuZCB0aGUgcmV0dXJuIHBhdGggbWlnaHQgbm90IGJlIHN5bW1ldHJpY2FsKS4KKwkgKi8KKwl0cC0+dF9zb2Z0ZXJyb3IgPSAwOworfQorCisvKgorICogRGV0ZXJtaW5lIGEgcmVhc29uYWJsZSB2YWx1ZSBmb3IgbWF4c2VnIHNpemUuCisgKiBJZiB0aGUgcm91dGUgaXMga25vd24sIGNoZWNrIHJvdXRlIGZvciBtdHUuCisgKiBJZiBub25lLCB1c2UgYW4gbXNzIHRoYXQgY2FuIGJlIGhhbmRsZWQgb24gdGhlIG91dGdvaW5nCisgKiBpbnRlcmZhY2Ugd2l0aG91dCBmb3JjaW5nIElQIHRvIGZyYWdtZW50OyBpZiBiaWdnZXIgdGhhbgorICogYW4gbWJ1ZiBjbHVzdGVyIChNQ0xCWVRFUyksIHJvdW5kIGRvd24gdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiBNQ0xCWVRFUworICogdG8gdXRpbGl6ZSBsYXJnZSBtYnVmcy4gIElmIG5vIHJvdXRlIGlzIGZvdW5kLCByb3V0ZSBoYXMgbm8gbXR1LAorICogb3IgdGhlIGRlc3RpbmF0aW9uIGlzbid0IGxvY2FsLCB1c2UgYSBkZWZhdWx0LCBob3BlZnVsbHkgY29uc2VydmF0aXZlCisgKiBzaXplICh1c3VhbGx5IDUxMiBvciB0aGUgZGVmYXVsdCBJUCBtYXggc2l6ZSwgYnV0IG5vIG1vcmUgdGhhbiB0aGUgbXR1CisgKiBvZiB0aGUgaW50ZXJmYWNlKSwgYXMgd2UgY2FuJ3QgZGlzY292ZXIgYW55dGhpbmcgYWJvdXQgaW50ZXJ2ZW5pbmcKKyAqIGdhdGV3YXlzIG9yIG5ldHdvcmtzLiAgV2UgYWxzbyBpbml0aWFsaXplIHRoZSBjb25nZXN0aW9uL3Nsb3cgc3RhcnQKKyAqIHdpbmRvdyB0byBiZSBhIHNpbmdsZSBzZWdtZW50IGlmIHRoZSBkZXN0aW5hdGlvbiBpc24ndCBsb2NhbC4KKyAqIFdoaWxlIGxvb2tpbmcgYXQgdGhlIHJvdXRpbmcgZW50cnksIHdlIGFsc28gaW5pdGlhbGl6ZSBvdGhlciBwYXRoLWRlcGVuZGVudAorICogcGFyYW1ldGVycyBmcm9tIHByZS1zZXQgb3IgY2FjaGVkIHZhbHVlcyBpbiB0aGUgcm91dGluZyBlbnRyeS4KKyAqLworCitpbnQKK3RjcF9tc3Moc3RydWN0IHRjcGNiICp0cCwgdV9pbnQgb2ZmZXIpCit7CisJc3RydWN0IHNvY2tldCAqc28gPSB0cC0+dF9zb2NrZXQ7CisJaW50IG1zczsKKworCURFQlVHX0NBTEwoInRjcF9tc3MiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcpdHApOworCURFQlVHX0FSRygib2ZmZXIgPSAlZCIsIG9mZmVyKTsKKworCW1zcyA9IG1pbihJRl9NVFUsIElGX01SVSkgLSBzaXplb2Yoc3RydWN0IHRjcGlwaGRyKTsKKwlpZiAob2ZmZXIpCisJCW1zcyA9IG1pbihtc3MsIG9mZmVyKTsKKwltc3MgPSBtYXgobXNzLCAzMik7CisJaWYgKG1zcyA8IHRwLT50X21heHNlZyB8fCBvZmZlciAhPSAwKQorCSAgIHRwLT50X21heHNlZyA9IG1zczsKKworCXRwLT5zbmRfY3duZCA9IG1zczsKKworCXNicmVzZXJ2ZSgmc28tPnNvX3NuZCwgVENQX1NORFNQQUNFICsgKChUQ1BfU05EU1BBQ0UgJSBtc3MpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1zcyAtIChUQ1BfU05EU1BBQ0UgJSBtc3MpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKKwlzYnJlc2VydmUoJnNvLT5zb19yY3YsIFRDUF9SQ1ZTUEFDRSArICgoVENQX1JDVlNQQUNFICUgbXNzKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtc3MgLSAoVENQX1JDVlNQQUNFICUgbXNzKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSk7CisKKwlERUJVR19NSVNDKChkZmQsICIgcmV0dXJuaW5nIG1zcyA9ICVkXG4iLCBtc3MpKTsKKworCXJldHVybiBtc3M7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9vdXRwdXQuYyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwX291dHB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDUwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9vdXRwdXQuYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk4OCwgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3Bfb3V0cHV0LmMJOC4zIChCZXJrZWxleSkgMTIvMzAvOTMKKyAqIHRjcF9vdXRwdXQuYyx2IDEuMyAxOTk0LzA5LzE1IDEwOjM2OjU1IGRhdmlkZyBFeHAKKyAqLworCisvKgorICogQ2hhbmdlcyBhbmQgYWRkaXRpb25zIHJlbGF0aW5nIHRvIFNMaVJQCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgRGFubnkgR2FzcGFyb3Zza2kuCisgKgorICogUGxlYXNlIHJlYWQgdGhlIGZpbGUgQ09QWVJJR0hUIGZvciB0aGUKKyAqIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBjb3B5cmlnaHQuCisgKi8KKworI2luY2x1ZGUgPHNsaXJwLmg+CisKKy8qCisgKiBTaW5jZSB0aGlzIGlzIG9ubHkgdXNlZCBpbiAic3RhdHMgc29ja2V0Iiwgd2UgZ2l2ZSBtZWFuaW5nCisgKiBuYW1lcyBpbnN0ZWFkIG9mIHRoZSBSRUFMIG5hbWVzCisgKi8KK2NvbnN0IGNoYXIgKiBjb25zdCB0Y3BzdGF0ZXNbXSA9IHsKKy8qCSJDTE9TRUQiLCAgICAgICAiTElTVEVOIiwgICAgICAgIlNZTl9TRU5UIiwgICAgICJTWU5fUkNWRCIsICovCisJIlJFRElSRUNUIiwJIkxJU1RFTiIsCSJTWU5fU0VOVCIsICAgICAiU1lOX1JDVkQiLAorCSJFU1RBQkxJU0hFRCIsICAiQ0xPU0VfV0FJVCIsICAgIkZJTl9XQUlUXzEiLCAgICJDTE9TSU5HIiwKKwkiTEFTVF9BQ0siLCAgICAgIkZJTl9XQUlUXzIiLCAgICJUSU1FX1dBSVQiLAorfTsKKworc3RhdGljIGNvbnN0IHVfY2hhciAgdGNwX291dGZsYWdzW1RDUF9OU1RBVEVTXSA9IHsKKwlUSF9SU1R8VEhfQUNLLCAwLCAgICAgIFRIX1NZTiwgICAgICAgIFRIX1NZTnxUSF9BQ0ssCisJVEhfQUNLLCAgICAgICAgVEhfQUNLLCBUSF9GSU58VEhfQUNLLCBUSF9GSU58VEhfQUNLLAorCVRIX0ZJTnxUSF9BQ0ssIFRIX0FDSywgVEhfQUNLLAorfTsKKworCisjZGVmaW5lIE1BWF9UQ1BPUFRMRU4JMzIJLyogbWF4ICMgYnl0ZXMgdGhhdCBnbyBpbiBvcHRpb25zICovCisKKy8qCisgKiBUY3Agb3V0cHV0IHJvdXRpbmU6IGZpZ3VyZSBvdXQgd2hhdCBzaG91bGQgYmUgc2VudCBhbmQgc2VuZCBpdC4KKyAqLworaW50Cit0Y3Bfb3V0cHV0KHN0cnVjdCB0Y3BjYiAqdHApCit7CisJcmVnaXN0ZXIgc3RydWN0IHNvY2tldCAqc28gPSB0cC0+dF9zb2NrZXQ7CisJcmVnaXN0ZXIgbG9uZyBsZW4sIHdpbjsKKwlpbnQgb2ZmLCBmbGFncywgZXJyb3I7CisJcmVnaXN0ZXIgc3RydWN0IG1idWYgKm07CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICp0aTsKKwl1X2NoYXIgb3B0W01BWF9UQ1BPUFRMRU5dOworCXVuc2lnbmVkIG9wdGxlbiwgaGRybGVuOworCWludCBpZGxlLCBzZW5kYWxvdDsKKworCURFQlVHX0NBTEwoInRjcF9vdXRwdXQiKTsKKwlERUJVR19BUkcoInRwID0gJWx4IiwgKGxvbmcgKXRwKTsKKworCS8qCisJICogRGV0ZXJtaW5lIGxlbmd0aCBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHRyYW5zbWl0dGVkLAorCSAqIGFuZCBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZC4KKwkgKiBJZiB0aGVyZSBpcyBzb21lIGRhdGEgb3IgY3JpdGljYWwgY29udHJvbHMgKFNZTiwgUlNUKQorCSAqIHRvIHNlbmQsIHRoZW4gdHJhbnNtaXQ7IG90aGVyd2lzZSwgaW52ZXN0aWdhdGUgZnVydGhlci4KKwkgKi8KKwlpZGxlID0gKHRwLT5zbmRfbWF4ID09IHRwLT5zbmRfdW5hKTsKKwlpZiAoaWRsZSAmJiB0cC0+dF9pZGxlID49IHRwLT50X3J4dGN1cikKKwkJLyoKKwkJICogV2UgaGF2ZSBiZWVuIGlkbGUgZm9yICJhIHdoaWxlIiBhbmQgbm8gYWNrcyBhcmUKKwkJICogZXhwZWN0ZWQgdG8gY2xvY2sgb3V0IGFueSBkYXRhIHdlIHNlbmQgLS0KKwkJICogc2xvdyBzdGFydCB0byBnZXQgYWNrICJjbG9jayIgcnVubmluZyBhZ2Fpbi4KKwkJICovCisJCXRwLT5zbmRfY3duZCA9IHRwLT50X21heHNlZzsKK2FnYWluOgorCXNlbmRhbG90ID0gMDsKKwlvZmYgPSB0cC0+c25kX254dCAtIHRwLT5zbmRfdW5hOworCXdpbiA9IG1pbih0cC0+c25kX3duZCwgdHAtPnNuZF9jd25kKTsKKworCWZsYWdzID0gdGNwX291dGZsYWdzW3RwLT50X3N0YXRlXTsKKworCURFQlVHX01JU0MoKGRmZCwgIiAtLS0gdGNwX291dHB1dCBmbGFncyA9IDB4JXhcbiIsZmxhZ3MpKTsKKworCS8qCisJICogSWYgaW4gcGVyc2lzdCB0aW1lb3V0IHdpdGggd2luZG93IG9mIDAsIHNlbmQgMSBieXRlLgorCSAqIE90aGVyd2lzZSwgaWYgd2luZG93IGlzIHNtYWxsIGJ1dCBub256ZXJvCisJICogYW5kIHRpbWVyIGV4cGlyZWQsIHdlIHdpbGwgc2VuZCB3aGF0IHdlIGNhbgorCSAqIGFuZCBnbyB0byB0cmFuc21pdCBzdGF0ZS4KKwkgKi8KKwlpZiAodHAtPnRfZm9yY2UpIHsKKwkJaWYgKHdpbiA9PSAwKSB7CisJCQkvKgorCQkJICogSWYgd2Ugc3RpbGwgaGF2ZSBzb21lIGRhdGEgdG8gc2VuZCwgdGhlbgorCQkJICogY2xlYXIgdGhlIEZJTiBiaXQuICBVc3VhbGx5IHRoaXMgd291bGQKKwkJCSAqIGhhcHBlbiBiZWxvdyB3aGVuIGl0IHJlYWxpemVzIHRoYXQgd2UKKwkJCSAqIGFyZW4ndCBzZW5kaW5nIGFsbCB0aGUgZGF0YS4gIEhvd2V2ZXIsCisJCQkgKiBpZiB3ZSBoYXZlIGV4YWN0bHkgMSBieXRlIG9mIHVuc2V0IGRhdGEsCisJCQkgKiB0aGVuIGl0IHdvbid0IGNsZWFyIHRoZSBGSU4gYml0IGJlbG93LAorCQkJICogYW5kIGlmIHdlIGFyZSBpbiBwZXJzaXN0IHN0YXRlLCB3ZSB3aW5kCisJCQkgKiB1cCBzZW5kaW5nIHRoZSBwYWNrZXQgd2l0aG91dCByZWNvcmRpbmcKKwkJCSAqIHRoYXQgd2Ugc2VudCB0aGUgRklOIGJpdC4KKwkJCSAqCisJCQkgKiBXZSBjYW4ndCBqdXN0IGJsaW5kbHkgY2xlYXIgdGhlIEZJTiBiaXQsCisJCQkgKiBiZWNhdXNlIGlmIHdlIGRvbid0IGhhdmUgYW55IG1vcmUgZGF0YQorCQkJICogdG8gc2VuZCB0aGVuIHRoZSBwcm9iZSB3aWxsIGJlIHRoZSBGSU4KKwkJCSAqIGl0c2VsZi4KKwkJCSAqLworCQkJaWYgKG9mZiA8IHNvLT5zb19zbmQuc2JfY2MpCisJCQkJZmxhZ3MgJj0gflRIX0ZJTjsKKwkJCXdpbiA9IDE7CisJCX0gZWxzZSB7CisJCQl0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdID0gMDsKKwkJCXRwLT50X3J4dHNoaWZ0ID0gMDsKKwkJfQorCX0KKworCWxlbiA9IG1pbihzby0+c29fc25kLnNiX2NjLCB3aW4pIC0gb2ZmOworCisJaWYgKGxlbiA8IDApIHsKKwkJLyoKKwkJICogSWYgRklOIGhhcyBiZWVuIHNlbnQgYnV0IG5vdCBhY2tlZCwKKwkJICogYnV0IHdlIGhhdmVuJ3QgYmVlbiBjYWxsZWQgdG8gcmV0cmFuc21pdCwKKwkJICogbGVuIHdpbGwgYmUgLTEuICBPdGhlcndpc2UsIHdpbmRvdyBzaHJhbmsKKwkJICogYWZ0ZXIgd2Ugc2VudCBpbnRvIGl0LiAgSWYgd2luZG93IHNocmFuayB0byAwLAorCQkgKiBjYW5jZWwgcGVuZGluZyByZXRyYW5zbWl0IGFuZCBwdWxsIHNuZF9ueHQKKwkJICogYmFjayB0byAoY2xvc2VkKSB3aW5kb3cuICBXZSB3aWxsIGVudGVyIHBlcnNpc3QKKwkJICogc3RhdGUgYmVsb3cuICBJZiB0aGUgd2luZG93IGRpZG4ndCBjbG9zZSBjb21wbGV0ZWx5LAorCQkgKiBqdXN0IHdhaXQgZm9yIGFuIEFDSy4KKwkJICovCisJCWxlbiA9IDA7CisJCWlmICh3aW4gPT0gMCkgeworCQkJdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPSAwOworCQkJdHAtPnNuZF9ueHQgPSB0cC0+c25kX3VuYTsKKwkJfQorCX0KKworCWlmIChsZW4gPiB0cC0+dF9tYXhzZWcpIHsKKwkJbGVuID0gdHAtPnRfbWF4c2VnOworCQlzZW5kYWxvdCA9IDE7CisJfQorCWlmIChTRVFfTFQodHAtPnNuZF9ueHQgKyBsZW4sIHRwLT5zbmRfdW5hICsgc28tPnNvX3NuZC5zYl9jYykpCisJCWZsYWdzICY9IH5USF9GSU47CisKKwl3aW4gPSBzYnNwYWNlKCZzby0+c29fcmN2KTsKKworCS8qCisJICogU2VuZGVyIHNpbGx5IHdpbmRvdyBhdm9pZGFuY2UuICBJZiBjb25uZWN0aW9uIGlzIGlkbGUKKwkgKiBhbmQgY2FuIHNlbmQgYWxsIGRhdGEsIGEgbWF4aW11bSBzZWdtZW50LAorCSAqIGF0IGxlYXN0IGEgbWF4aW11bSBkZWZhdWx0LXNpemUgc2VnbWVudCBkbyBpdCwKKwkgKiBvciBhcmUgZm9yY2VkLCBkbyBpdDsgb3RoZXJ3aXNlIGRvbid0IGJvdGhlci4KKwkgKiBJZiBwZWVyJ3MgYnVmZmVyIGlzIHRpbnksIHRoZW4gc2VuZAorCSAqIHdoZW4gd2luZG93IGlzIGF0IGxlYXN0IGhhbGYgb3Blbi4KKwkgKiBJZiByZXRyYW5zbWl0dGluZyAocG9zc2libHkgYWZ0ZXIgcGVyc2lzdCB0aW1lciBmb3JjZWQgdXMKKwkgKiB0byBzZW5kIGludG8gYSBzbWFsbCB3aW5kb3cpLCB0aGVuIG11c3QgcmVzZW5kLgorCSAqLworCWlmIChsZW4pIHsKKwkJaWYgKGxlbiA9PSB0cC0+dF9tYXhzZWcpCisJCQlnb3RvIHNlbmQ7CisJCWlmICgoMSB8fCBpZGxlIHx8IHRwLT50X2ZsYWdzICYgVEZfTk9ERUxBWSkgJiYKKwkJICAgIGxlbiArIG9mZiA+PSBzby0+c29fc25kLnNiX2NjKQorCQkJZ290byBzZW5kOworCQlpZiAodHAtPnRfZm9yY2UpCisJCQlnb3RvIHNlbmQ7CisJCWlmIChsZW4gPj0gdHAtPm1heF9zbmR3bmQgLyAyICYmIHRwLT5tYXhfc25kd25kID4gMCkKKwkJCWdvdG8gc2VuZDsKKwkJaWYgKFNFUV9MVCh0cC0+c25kX254dCwgdHAtPnNuZF9tYXgpKQorCQkJZ290byBzZW5kOworCX0KKworCS8qCisJICogQ29tcGFyZSBhdmFpbGFibGUgd2luZG93IHRvIGFtb3VudCBvZiB3aW5kb3cKKwkgKiBrbm93biB0byBwZWVyIChhcyBhZHZlcnRpc2VkIHdpbmRvdyBsZXNzCisJICogbmV4dCBleHBlY3RlZCBpbnB1dCkuICBJZiB0aGUgZGlmZmVyZW5jZSBpcyBhdCBsZWFzdCB0d28KKwkgKiBtYXggc2l6ZSBzZWdtZW50cywgb3IgYXQgbGVhc3QgNTAlIG9mIHRoZSBtYXhpbXVtIHBvc3NpYmxlCisJICogd2luZG93LCB0aGVuIHdhbnQgdG8gc2VuZCBhIHdpbmRvdyB1cGRhdGUgdG8gcGVlci4KKwkgKi8KKwlpZiAod2luID4gMCkgeworCQkvKgorCQkgKiAiYWR2IiBpcyB0aGUgYW1vdW50IHdlIGNhbiBpbmNyZWFzZSB0aGUgd2luZG93LAorCQkgKiB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgd2UgYXJlIGxpbWl0ZWQgYnkKKwkJICogVENQX01BWFdJTiA8PCB0cC0+cmN2X3NjYWxlLgorCQkgKi8KKwkJbG9uZyBhZHYgPSBtaW4od2luLCAobG9uZylUQ1BfTUFYV0lOIDw8IHRwLT5yY3Zfc2NhbGUpIC0KKwkJCSh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KTsKKworCQlpZiAoYWR2ID49IChsb25nKSAoMiAqIHRwLT50X21heHNlZykpCisJCQlnb3RvIHNlbmQ7CisJCWlmICgyICogYWR2ID49IChsb25nKSBzby0+c29fcmN2LnNiX2RhdGFsZW4pCisJCQlnb3RvIHNlbmQ7CisJfQorCisJLyoKKwkgKiBTZW5kIGlmIHdlIG93ZSBwZWVyIGFuIEFDSy4KKwkgKi8KKwlpZiAodHAtPnRfZmxhZ3MgJiBURl9BQ0tOT1cpCisJCWdvdG8gc2VuZDsKKwlpZiAoZmxhZ3MgJiAoVEhfU1lOfFRIX1JTVCkpCisJCWdvdG8gc2VuZDsKKwlpZiAoU0VRX0dUKHRwLT5zbmRfdXAsIHRwLT5zbmRfdW5hKSkKKwkJZ290byBzZW5kOworCS8qCisJICogSWYgb3VyIHN0YXRlIGluZGljYXRlcyB0aGF0IEZJTiBzaG91bGQgYmUgc2VudAorCSAqIGFuZCB3ZSBoYXZlIG5vdCB5ZXQgZG9uZSBzbywgb3Igd2UncmUgcmV0cmFuc21pdHRpbmcgdGhlIEZJTiwKKwkgKiB0aGVuIHdlIG5lZWQgdG8gc2VuZC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBUSF9GSU4gJiYKKwkgICAgKCh0cC0+dF9mbGFncyAmIFRGX1NFTlRGSU4pID09IDAgfHwgdHAtPnNuZF9ueHQgPT0gdHAtPnNuZF91bmEpKQorCQlnb3RvIHNlbmQ7CisKKwkvKgorCSAqIFRDUCB3aW5kb3cgdXBkYXRlcyBhcmUgbm90IHJlbGlhYmxlLCByYXRoZXIgYSBwb2xsaW5nIHByb3RvY29sCisJICogdXNpbmcgYGBwZXJzaXN0JycgcGFja2V0cyBpcyB1c2VkIHRvIGluc3VyZSByZWNlaXB0IG9mIHdpbmRvdworCSAqIHVwZGF0ZXMuICBUaGUgdGhyZWUgYGBzdGF0ZXMnJyBmb3IgdGhlIG91dHB1dCBzaWRlIGFyZToKKwkgKglpZGxlCQkJbm90IGRvaW5nIHJldHJhbnNtaXRzIG9yIHBlcnNpc3RzCisJICoJcGVyc2lzdGluZwkJdG8gbW92ZSBhIHNtYWxsIG9yIHplcm8gd2luZG93CisJICoJKHJlKXRyYW5zbWl0dGluZwlhbmQgdGhlcmVieSBub3QgcGVyc2lzdGluZworCSAqCisJICogdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXQorCSAqCWlzIHNldCB3aGVuIHdlIGFyZSBpbiBwZXJzaXN0IHN0YXRlLgorCSAqIHRwLT50X2ZvcmNlCisJICoJaXMgc2V0IHdoZW4gd2UgYXJlIGNhbGxlZCB0byBzZW5kIGEgcGVyc2lzdCBwYWNrZXQuCisJICogdHAtPnRfdGltZXJbVENQVF9SRVhNVF0KKwkgKglpcyBzZXQgd2hlbiB3ZSBhcmUgcmV0cmFuc21pdHRpbmcKKwkgKiBUaGUgb3V0cHV0IHNpZGUgaXMgaWRsZSB3aGVuIGJvdGggdGltZXJzIGFyZSB6ZXJvLgorCSAqCisJICogSWYgc2VuZCB3aW5kb3cgaXMgdG9vIHNtYWxsLCB0aGVyZSBpcyBkYXRhIHRvIHRyYW5zbWl0LCBhbmQgbm8KKwkgKiByZXRyYW5zbWl0IG9yIHBlcnNpc3QgaXMgcGVuZGluZywgdGhlbiBnbyB0byBwZXJzaXN0IHN0YXRlLgorCSAqIElmIG5vdGhpbmcgaGFwcGVucyBzb29uLCBzZW5kIHdoZW4gdGltZXIgZXhwaXJlczoKKwkgKiBpZiB3aW5kb3cgaXMgbm9uemVybywgdHJhbnNtaXQgd2hhdCB3ZSBjYW4sCisJICogb3RoZXJ3aXNlIGZvcmNlIG91dCBhIGJ5dGUuCisJICovCisJaWYgKHNvLT5zb19zbmQuc2JfY2MgJiYgdHAtPnRfdGltZXJbVENQVF9SRVhNVF0gPT0gMCAmJgorCSAgICB0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdID09IDApIHsKKwkJdHAtPnRfcnh0c2hpZnQgPSAwOworCQl0Y3Bfc2V0cGVyc2lzdCh0cCk7CisJfQorCisJLyoKKwkgKiBObyByZWFzb24gdG8gc2VuZCBhIHNlZ21lbnQsIGp1c3QgcmV0dXJuLgorCSAqLworCVNUQVQodGNwc3RhdC50Y3BzX2RpZG51dHRpbisrKTsKKworCXJldHVybiAoMCk7CisKK3NlbmQ6CisJLyoKKwkgKiBCZWZvcmUgRVNUQUJMSVNIRUQsIGZvcmNlIHNlbmRpbmcgb2YgaW5pdGlhbCBvcHRpb25zCisJICogdW5sZXNzIFRDUCBzZXQgbm90IHRvIGRvIGFueSBvcHRpb25zLgorCSAqIE5PVEU6IHdlIGFzc3VtZSB0aGF0IHRoZSBJUC9UQ1AgaGVhZGVyIHBsdXMgVENQIG9wdGlvbnMKKwkgKiBhbHdheXMgZml0IGluIGEgc2luZ2xlIG1idWYsIGxlYXZpbmcgcm9vbSBmb3IgYSBtYXhpbXVtCisJICogbGluayBoZWFkZXIsIGkuZS4KKwkgKgltYXhfbGlua2hkciArIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSArIG9wdGxlbiA8PSBNSExFTgorCSAqLworCW9wdGxlbiA9IDA7CisJaGRybGVuID0gc2l6ZW9mIChzdHJ1Y3QgdGNwaXBoZHIpOworCWlmIChmbGFncyAmIFRIX1NZTikgeworCQl0cC0+c25kX254dCA9IHRwLT5pc3M7CisJCWlmICgodHAtPnRfZmxhZ3MgJiBURl9OT09QVCkgPT0gMCkgeworCQkJdV9pbnQxNl90IG1zczsKKworCQkJb3B0WzBdID0gVENQT1BUX01BWFNFRzsKKwkJCW9wdFsxXSA9IDQ7CisJCQltc3MgPSBodG9ucygodV9pbnQxNl90KSB0Y3BfbXNzKHRwLCAwKSk7CisJCQltZW1jcHkoKGNhZGRyX3QpKG9wdCArIDIpLCAoY2FkZHJfdCkmbXNzLCBzaXplb2YobXNzKSk7CisJCQlvcHRsZW4gPSA0OworCisvKgkJCWlmICgodHAtPnRfZmxhZ3MgJiBURl9SRVFfU0NBTEUpICYmCisgKgkJCSAgICAoKGZsYWdzICYgVEhfQUNLKSA9PSAwIHx8CisgKgkJCSAgICAodHAtPnRfZmxhZ3MgJiBURl9SQ1ZEX1NDQUxFKSkpIHsKKyAqCQkJCSooKHVfaW50MzJfdCAqKSAob3B0ICsgb3B0bGVuKSkgPSBodG9ubCgKKyAqCQkJCQlUQ1BPUFRfTk9QIDw8IDI0IHwKKyAqCQkJCQlUQ1BPUFRfV0lORE9XIDw8IDE2IHwKKyAqCQkJCQlUQ1BPTEVOX1dJTkRPVyA8PCA4IHwKKyAqCQkJCQl0cC0+cmVxdWVzdF9yX3NjYWxlKTsKKyAqCQkJCW9wdGxlbiArPSA0OworICoJCQl9CisgKi8KKwkJfQorIAl9CisKKyAJLyoKKwkgKiBTZW5kIGEgdGltZXN0YW1wIGFuZCBlY2hvLXJlcGx5IGlmIHRoaXMgaXMgYSBTWU4gYW5kIG91ciBzaWRlCisJICogd2FudHMgdG8gdXNlIHRpbWVzdGFtcHMgKFRGX1JFUV9UU1RNUCBpcyBzZXQpIG9yIGJvdGggb3VyIHNpZGUKKwkgKiBhbmQgb3VyIHBlZXIgaGF2ZSBzZW50IHRpbWVzdGFtcHMgaW4gb3VyIFNZTidzLgorIAkgKi8KKy8qIAlpZiAoKHRwLT50X2ZsYWdzICYgKFRGX1JFUV9UU1RNUHxURl9OT09QVCkpID09IFRGX1JFUV9UU1RNUCAmJgorICoJICAgICAoZmxhZ3MgJiBUSF9SU1QpID09IDAgJiYKKyAqCSAgICAoKGZsYWdzICYgKFRIX1NZTnxUSF9BQ0spKSA9PSBUSF9TWU4gfHwKKyAqCSAgICAgKHRwLT50X2ZsYWdzICYgVEZfUkNWRF9UU1RNUCkpKSB7CisgKgkJdV9pbnQzMl90ICpscCA9ICh1X2ludDMyX3QgKikob3B0ICsgb3B0bGVuKTsKKyAqCisgKgkJLyAqIEZvcm0gdGltZXN0YW1wIG9wdGlvbiBhcyBzaG93biBpbiBhcHBlbmRpeCBBIG9mIFJGQyAxMzIzLiAqICAvCisgKgkJKmxwKysgPSBodG9ubChUQ1BPUFRfVFNUQU1QX0hEUik7CisgKgkJKmxwKysgPSBodG9ubCh0Y3Bfbm93KTsKKyAqCQkqbHAgICA9IGh0b25sKHRwLT50c19yZWNlbnQpOworICoJCW9wdGxlbiArPSBUQ1BPTEVOX1RTVEFNUF9BUFBBOworICoJfQorICovCisgCWhkcmxlbiArPSBvcHRsZW47CisKKwkvKgorCSAqIEFkanVzdCBkYXRhIGxlbmd0aCBpZiBpbnNlcnRpb24gb2Ygb3B0aW9ucyB3aWxsCisJICogYnVtcCB0aGUgcGFja2V0IGxlbmd0aCBiZXlvbmQgdGhlIHRfbWF4c2VnIGxlbmd0aC4KKwkgKi8KKwkgaWYgKGxlbiA+IHRwLT50X21heHNlZyAtIG9wdGxlbikgeworCQlsZW4gPSB0cC0+dF9tYXhzZWcgLSBvcHRsZW47CisJCXNlbmRhbG90ID0gMTsKKwkgfQorCisJLyoKKwkgKiBHcmFiIGEgaGVhZGVyIG1idWYsIGF0dGFjaGluZyBhIGNvcHkgb2YgZGF0YSB0bworCSAqIGJlIHRyYW5zbWl0dGVkLCBhbmQgaW5pdGlhbGl6ZSB0aGUgaGVhZGVyIGZyb20KKwkgKiB0aGUgdGVtcGxhdGUgZm9yIHNlbmRzIG9uIHRoaXMgY29ubmVjdGlvbi4KKwkgKi8KKwlpZiAobGVuKSB7CisJCWlmICh0cC0+dF9mb3JjZSAmJiBsZW4gPT0gMSkKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHByb2JlKyspOworCQllbHNlIGlmIChTRVFfTFQodHAtPnNuZF9ueHQsIHRwLT5zbmRfbWF4KSkgeworCQkJU1RBVCh0Y3BzdGF0LnRjcHNfc25kcmV4bWl0cGFjaysrKTsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHJleG1pdGJ5dGUgKz0gbGVuKTsKKwkJfSBlbHNlIHsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHBhY2srKyk7CisJCQlTVEFUKHRjcHN0YXQudGNwc19zbmRieXRlICs9IGxlbik7CisJCX0KKworCQltID0gbV9nZXQoKTsKKwkJaWYgKG0gPT0gTlVMTCkgeworLyoJCQllcnJvciA9IEVOT0JVRlM7ICovCisJCQllcnJvciA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQltLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKwkJbS0+bV9sZW4gPSBoZHJsZW47CisKKwkJLyoKKwkJICogVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZSBtYWtlIHN1cmUgb3VyIG1idWZzCisJCSAqIGFyZSBiaWcgZW5vdWdoIHRvIGhvbGQgb25lIE1TUyBwYWNrZXQgKyBoZWFkZXIgKyAuLi4gZXRjLgorCQkgKi8KKy8qCQlpZiAobGVuIDw9IE1ITEVOIC0gaGRybGVuIC0gbWF4X2xpbmtoZHIpIHsgKi8KKworCQkJc2Jjb3B5KCZzby0+c29fc25kLCBvZmYsIChpbnQpIGxlbiwgbXRvZChtLCBjYWRkcl90KSArIGhkcmxlbik7CisJCQltLT5tX2xlbiArPSBsZW47CisKKy8qCQl9IGVsc2UgeworICoJCQltLT5tX25leHQgPSBtX2NvcHkoc28tPnNvX3NuZC5zYl9tYiwgb2ZmLCAoaW50KSBsZW4pOworICoJCQlpZiAobS0+bV9uZXh0ID09IDApCisgKgkJCQlsZW4gPSAwOworICoJCX0KKyAqLworCQkvKgorCQkgKiBJZiB3ZSdyZSBzZW5kaW5nIGV2ZXJ5dGhpbmcgd2UndmUgZ290LCBzZXQgUFVTSC4KKwkJICogKFRoaXMgd2lsbCBrZWVwIGhhcHB5IHRob3NlIGltcGxlbWVudGF0aW9ucyB3aGljaCBvbmx5CisJCSAqIGdpdmUgZGF0YSB0byB0aGUgdXNlciB3aGVuIGEgYnVmZmVyIGZpbGxzIG9yCisJCSAqIGEgUFVTSCBjb21lcyBpbi4pCisJCSAqLworCQlpZiAob2ZmICsgbGVuID09IHNvLT5zb19zbmQuc2JfY2MpCisJCQlmbGFncyB8PSBUSF9QVVNIOworCX0gZWxzZSB7CisJCWlmICh0cC0+dF9mbGFncyAmIFRGX0FDS05PVykKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZGFja3MrKyk7CisJCWVsc2UgaWYgKGZsYWdzICYgKFRIX1NZTnxUSF9GSU58VEhfUlNUKSkKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZGN0cmwrKyk7CisJCWVsc2UgaWYgKFNFUV9HVCh0cC0+c25kX3VwLCB0cC0+c25kX3VuYSkpCisJCQlTVEFUKHRjcHN0YXQudGNwc19zbmR1cmcrKyk7CisJCWVsc2UKKwkJCVNUQVQodGNwc3RhdC50Y3BzX3NuZHdpbnVwKyspOworCisJCW0gPSBtX2dldCgpOworCQlpZiAobSA9PSBOVUxMKSB7CisvKgkJCWVycm9yID0gRU5PQlVGUzsgKi8KKwkJCWVycm9yID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW0tPm1fZGF0YSArPSBJRl9NQVhMSU5LSERSOworCQltLT5tX2xlbiA9IGhkcmxlbjsKKwl9CisKKwl0aSA9IG10b2QobSwgc3RydWN0IHRjcGlwaGRyICopOworCisJbWVtY3B5KChjYWRkcl90KXRpLCAmdHAtPnRfdGVtcGxhdGUsIHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKSk7CisKKwkvKgorCSAqIEZpbGwgaW4gZmllbGRzLCByZW1lbWJlcmluZyBtYXhpbXVtIGFkdmVydGlzZWQKKwkgKiB3aW5kb3cgZm9yIHVzZSBpbiBkZWxheWluZyBtZXNzYWdlcyBhYm91dCB3aW5kb3cgc2l6ZXMuCisJICogSWYgcmVzZW5kaW5nIGEgRklOLCBiZSBzdXJlIG5vdCB0byB1c2UgYSBuZXcgc2VxdWVuY2UgbnVtYmVyLgorCSAqLworCWlmIChmbGFncyAmIFRIX0ZJTiAmJiB0cC0+dF9mbGFncyAmIFRGX1NFTlRGSU4gJiYKKwkgICAgdHAtPnNuZF9ueHQgPT0gdHAtPnNuZF9tYXgpCisJCXRwLT5zbmRfbnh0LS07CisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgcmV0cmFuc21pc3Npb25zLCB0aGVuIHNuZF9ueHQgd2lsbAorCSAqIG5vdCByZWZsZWN0IHRoZSBmaXJzdCB1bnNlbnQgb2N0ZXQuICBGb3IgQUNLIG9ubHkKKwkgKiBwYWNrZXRzLCB3ZSBkbyBub3Qgd2FudCB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZQorCSAqIHJldHJhbnNtaXR0ZWQgcGFja2V0LCB3ZSB3YW50IHRoZSBzZXF1ZW5jZSBudW1iZXIKKwkgKiBvZiB0aGUgbmV4dCB1bnNlbnQgb2N0ZXQuICBTbywgaWYgdGhlcmUgaXMgbm8gZGF0YQorCSAqIChhbmQgbm8gU1lOIG9yIEZJTiksIHVzZSBzbmRfbWF4IGluc3RlYWQgb2Ygc25kX254dAorCSAqIHdoZW4gZmlsbGluZyBpbiB0aV9zZXEuICBCdXQgaWYgd2UgYXJlIGluIHBlcnNpc3QKKwkgKiBzdGF0ZSwgc25kX21heCBtaWdodCByZWZsZWN0IG9uZSBieXRlIGJleW9uZCB0aGUKKwkgKiByaWdodCBlZGdlIG9mIHRoZSB3aW5kb3csIHNvIHVzZSBzbmRfbnh0IGluIHRoYXQKKwkgKiBjYXNlLCBzaW5jZSB3ZSBrbm93IHdlIGFyZW4ndCBkb2luZyBhIHJldHJhbnNtaXNzaW9uLgorCSAqIChyZXRyYW5zbWl0IGFuZCBwZXJzaXN0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuLi4pCisJICovCisJaWYgKGxlbiB8fCAoZmxhZ3MgJiAoVEhfU1lOfFRIX0ZJTikpIHx8IHRwLT50X3RpbWVyW1RDUFRfUEVSU0lTVF0pCisJCXRpLT50aV9zZXEgPSBodG9ubCh0cC0+c25kX254dCk7CisJZWxzZQorCQl0aS0+dGlfc2VxID0gaHRvbmwodHAtPnNuZF9tYXgpOworCXRpLT50aV9hY2sgPSBodG9ubCh0cC0+cmN2X254dCk7CisJaWYgKG9wdGxlbikgeworCQltZW1jcHkoKGNhZGRyX3QpKHRpICsgMSksIChjYWRkcl90KW9wdCwgb3B0bGVuKTsKKwkJdGktPnRpX29mZiA9IChzaXplb2YgKHN0cnVjdCB0Y3BoZHIpICsgb3B0bGVuKSA+PiAyOworCX0KKwl0aS0+dGlfZmxhZ3MgPSBmbGFnczsKKwkvKgorCSAqIENhbGN1bGF0ZSByZWNlaXZlIHdpbmRvdy4gIERvbid0IHNocmluayB3aW5kb3csCisJICogYnV0IGF2b2lkIHNpbGx5IHdpbmRvdyBzeW5kcm9tZS4KKwkgKi8KKwlpZiAod2luIDwgKGxvbmcpKHNvLT5zb19yY3Yuc2JfZGF0YWxlbiAvIDQpICYmIHdpbiA8IChsb25nKXRwLT50X21heHNlZykKKwkJd2luID0gMDsKKwlpZiAod2luID4gKGxvbmcpVENQX01BWFdJTiA8PCB0cC0+cmN2X3NjYWxlKQorCQl3aW4gPSAobG9uZylUQ1BfTUFYV0lOIDw8IHRwLT5yY3Zfc2NhbGU7CisJaWYgKHdpbiA8IChsb25nKSh0cC0+cmN2X2FkdiAtIHRwLT5yY3Zfbnh0KSkKKwkJd2luID0gKGxvbmcpKHRwLT5yY3ZfYWR2IC0gdHAtPnJjdl9ueHQpOworCXRpLT50aV93aW4gPSBodG9ucygodV9pbnQxNl90KSAod2luPj50cC0+cmN2X3NjYWxlKSk7CisKKwlpZiAoU0VRX0dUKHRwLT5zbmRfdXAsIHRwLT5zbmRfdW5hKSkgeworCQl0aS0+dGlfdXJwID0gaHRvbnMoKHVfaW50MTZfdCkodHAtPnNuZF91cCAtIG50b2hsKHRpLT50aV9zZXEpKSk7CisjaWZkZWYgbm90ZGVmCisJaWYgKFNFUV9HVCh0cC0+c25kX3VwLCB0cC0+c25kX254dCkpIHsKKwkJdGktPnRpX3VycCA9IGh0b25zKCh1X2ludDE2X3QpKHRwLT5zbmRfdXAgLSB0cC0+c25kX254dCkpOworI2VuZGlmCisJCXRpLT50aV9mbGFncyB8PSBUSF9VUkc7CisJfSBlbHNlCisJCS8qCisJCSAqIElmIG5vIHVyZ2VudCBwb2ludGVyIHRvIHNlbmQsIHRoZW4gd2UgcHVsbAorCQkgKiB0aGUgdXJnZW50IHBvaW50ZXIgdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGUgc2VuZCB3aW5kb3cKKwkJICogc28gdGhhdCBpdCBkb2Vzbid0IGRyaWZ0IGludG8gdGhlIHNlbmQgd2luZG93IG9uIHNlcXVlbmNlCisJCSAqIG51bWJlciB3cmFwYXJvdW5kLgorCQkgKi8KKwkJdHAtPnNuZF91cCA9IHRwLT5zbmRfdW5hOwkJLyogZHJhZyBpdCBhbG9uZyAqLworCisJLyoKKwkgKiBQdXQgVENQIGxlbmd0aCBpbiBleHRlbmRlZCBoZWFkZXIsIGFuZCB0aGVuCisJICogY2hlY2tzdW0gZXh0ZW5kZWQgaGVhZGVyIGFuZCBkYXRhLgorCSAqLworCWlmIChsZW4gKyBvcHRsZW4pCisJCXRpLT50aV9sZW4gPSBodG9ucygodV9pbnQxNl90KShzaXplb2YgKHN0cnVjdCB0Y3BoZHIpICsKKwkJICAgIG9wdGxlbiArIGxlbikpOworCXRpLT50aV9zdW0gPSBja3N1bShtLCAoaW50KShoZHJsZW4gKyBsZW4pKTsKKworCS8qCisJICogSW4gdHJhbnNtaXQgc3RhdGUsIHRpbWUgdGhlIHRyYW5zbWlzc2lvbiBhbmQgYXJyYW5nZSBmb3IKKwkgKiB0aGUgcmV0cmFuc21pdC4gIEluIHBlcnNpc3Qgc3RhdGUsIGp1c3Qgc2V0IHNuZF9tYXguCisJICovCisJaWYgKHRwLT50X2ZvcmNlID09IDAgfHwgdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXSA9PSAwKSB7CisJCXRjcF9zZXEgc3RhcnRzZXEgPSB0cC0+c25kX254dDsKKworCQkvKgorCQkgKiBBZHZhbmNlIHNuZF9ueHQgb3ZlciBzZXF1ZW5jZSBzcGFjZSBvZiB0aGlzIHNlZ21lbnQuCisJCSAqLworCQlpZiAoZmxhZ3MgJiAoVEhfU1lOfFRIX0ZJTikpIHsKKwkJCWlmIChmbGFncyAmIFRIX1NZTikKKwkJCQl0cC0+c25kX254dCsrOworCQkJaWYgKGZsYWdzICYgVEhfRklOKSB7CisJCQkJdHAtPnNuZF9ueHQrKzsKKwkJCQl0cC0+dF9mbGFncyB8PSBURl9TRU5URklOOworCQkJfQorCQl9CisJCXRwLT5zbmRfbnh0ICs9IGxlbjsKKwkJaWYgKFNFUV9HVCh0cC0+c25kX254dCwgdHAtPnNuZF9tYXgpKSB7CisJCQl0cC0+c25kX21heCA9IHRwLT5zbmRfbnh0OworCQkJLyoKKwkJCSAqIFRpbWUgdGhpcyB0cmFuc21pc3Npb24gaWYgbm90IGEgcmV0cmFuc21pc3Npb24gYW5kCisJCQkgKiBub3QgY3VycmVudGx5IHRpbWluZyBhbnl0aGluZy4KKwkJCSAqLworCQkJaWYgKHRwLT50X3J0dCA9PSAwKSB7CisJCQkJdHAtPnRfcnR0ID0gMTsKKwkJCQl0cC0+dF9ydHNlcSA9IHN0YXJ0c2VxOworCQkJCVNUQVQodGNwc3RhdC50Y3BzX3NlZ3N0aW1lZCsrKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFNldCByZXRyYW5zbWl0IHRpbWVyIGlmIG5vdCBjdXJyZW50bHkgc2V0LAorCQkgKiBhbmQgbm90IGRvaW5nIGFuIGFjayBvciBhIGtlZXAtYWxpdmUgcHJvYmUuCisJCSAqIEluaXRpYWwgdmFsdWUgZm9yIHJldHJhbnNtaXQgdGltZXIgaXMgc21vb3RoZWQKKwkJICogcm91bmQtdHJpcCB0aW1lICsgMiAqIHJvdW5kLXRyaXAgdGltZSB2YXJpYW5jZS4KKwkJICogSW5pdGlhbGl6ZSBzaGlmdCBjb3VudGVyIHdoaWNoIGlzIHVzZWQgZm9yIGJhY2tvZmYKKwkJICogb2YgcmV0cmFuc21pdCB0aW1lLgorCQkgKi8KKwkJaWYgKHRwLT50X3RpbWVyW1RDUFRfUkVYTVRdID09IDAgJiYKKwkJICAgIHRwLT5zbmRfbnh0ICE9IHRwLT5zbmRfdW5hKSB7CisJCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IHRwLT50X3J4dGN1cjsKKwkJCWlmICh0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdKSB7CisJCQkJdHAtPnRfdGltZXJbVENQVF9QRVJTSVNUXSA9IDA7CisJCQkJdHAtPnRfcnh0c2hpZnQgPSAwOworCQkJfQorCQl9CisJfSBlbHNlCisJCWlmIChTRVFfR1QodHAtPnNuZF9ueHQgKyBsZW4sIHRwLT5zbmRfbWF4KSkKKwkJCXRwLT5zbmRfbWF4ID0gdHAtPnNuZF9ueHQgKyBsZW47CisKKwkvKgorCSAqIEZpbGwgaW4gSVAgbGVuZ3RoIGFuZCBkZXNpcmVkIHRpbWUgdG8gbGl2ZSBhbmQKKwkgKiBzZW5kIHRvIElQIGxldmVsLiAgVGhlcmUgc2hvdWxkIGJlIGEgYmV0dGVyIHdheQorCSAqIHRvIGhhbmRsZSB0dGwgYW5kIHRvczsgd2UgY291bGQga2VlcCB0aGVtIGluCisJICogdGhlIHRlbXBsYXRlLCBidXQgbmVlZCBhIHdheSB0byBjaGVja3N1bSB3aXRob3V0IHRoZW0uCisJICovCisJbS0+bV9sZW4gPSBoZHJsZW4gKyBsZW47IC8qIFhYWCBOZWVkZWQ/IG1fbGVuIHNob3VsZCBiZSBjb3JyZWN0ICovCisKKyAgICB7CisKKwkoKHN0cnVjdCBpcCAqKXRpKS0+aXBfbGVuID0gbS0+bV9sZW47CisKKwkoKHN0cnVjdCBpcCAqKXRpKS0+aXBfdHRsID0gSVBERUZUVEw7CisJKChzdHJ1Y3QgaXAgKil0aSktPmlwX3RvcyA9IHNvLT5zb19pcHRvczsKKworLyogI2lmIEJTRCA+PSA0MyAqLworCS8qIERvbid0IGRvIElQIG9wdGlvbnMuLi4gKi8KKy8qCWVycm9yID0gaXBfb3V0cHV0KG0sIHRwLT50X2lucGNiLT5pbnBfb3B0aW9ucywgJnRwLT50X2lucGNiLT5pbnBfcm91dGUsCisgKgkgICAgc28tPnNvX29wdGlvbnMgJiBTT19ET05UUk9VVEUsIDApOworICovCisJZXJyb3IgPSBpcF9vdXRwdXQoc28sIG0pOworCisvKiAjZWxzZQorICoJZXJyb3IgPSBpcF9vdXRwdXQobSwgKHN0cnVjdCBtYnVmICopMCwgJnRwLT50X2lucGNiLT5pbnBfcm91dGUsCisgKgkgICAgc28tPnNvX29wdGlvbnMgJiBTT19ET05UUk9VVEUpOworICogI2VuZGlmCisgKi8KKyAgICB9CisJaWYgKGVycm9yKSB7CitvdXQ6CisvKgkJaWYgKGVycm9yID09IEVOT0JVRlMpIHsKKyAqCQkJdGNwX3F1ZW5jaCh0cC0+dF9pbnBjYiwgMCk7CisgKgkJCXJldHVybiAoMCk7CisgKgkJfQorICovCisvKgkJaWYgKChlcnJvciA9PSBFSE9TVFVOUkVBQ0ggfHwgZXJyb3IgPT0gRU5FVERPV04pCisgKgkJICAgICYmIFRDUFNfSEFWRVJDVkRTWU4odHAtPnRfc3RhdGUpKSB7CisgKgkJCXRwLT50X3NvZnRlcnJvciA9IGVycm9yOworICoJCQlyZXR1cm4gKDApOworICoJCX0KKyAqLworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJU1RBVCh0Y3BzdGF0LnRjcHNfc25kdG90YWwrKyk7CisKKwkvKgorCSAqIERhdGEgc2VudCAoYXMgZmFyIGFzIHdlIGNhbiB0ZWxsKS4KKwkgKiBJZiB0aGlzIGFkdmVydGlzZXMgYSBsYXJnZXIgd2luZG93IHRoYW4gYW55IG90aGVyIHNlZ21lbnQsCisJICogdGhlbiByZW1lbWJlciB0aGUgc2l6ZSBvZiB0aGUgYWR2ZXJ0aXNlZCB3aW5kb3cuCisJICogQW55IHBlbmRpbmcgQUNLIGhhcyBub3cgYmVlbiBzZW50LgorCSAqLworCWlmICh3aW4gPiAwICYmIFNFUV9HVCh0cC0+cmN2X254dCt3aW4sIHRwLT5yY3ZfYWR2KSkKKwkJdHAtPnJjdl9hZHYgPSB0cC0+cmN2X254dCArIHdpbjsKKwl0cC0+bGFzdF9hY2tfc2VudCA9IHRwLT5yY3Zfbnh0OworCXRwLT50X2ZsYWdzICY9IH4oVEZfQUNLTk9XfFRGX0RFTEFDSyk7CisJaWYgKHNlbmRhbG90KQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuICgwKTsKK30KKwordm9pZAordGNwX3NldHBlcnNpc3Qoc3RydWN0IHRjcGNiICp0cCkKK3sKKyAgICBpbnQgdCA9ICgodHAtPnRfc3J0dCA+PiAyKSArIHRwLT50X3J0dHZhcikgPj4gMTsKKworLyoJaWYgKHRwLT50X3RpbWVyW1RDUFRfUkVYTVRdKQorICoJCXBhbmljKCJ0Y3Bfb3V0cHV0IFJFWE1UIik7CisgKi8KKwkvKgorCSAqIFN0YXJ0L3Jlc3RhcnQgcGVyc2lzdGVuY2UgdGltZXIuCisJICovCisJVENQVF9SQU5HRVNFVCh0cC0+dF90aW1lcltUQ1BUX1BFUlNJU1RdLAorCSAgICB0ICogdGNwX2JhY2tvZmZbdHAtPnRfcnh0c2hpZnRdLAorCSAgICBUQ1BUVl9QRVJTTUlOLCBUQ1BUVl9QRVJTTUFYKTsKKwlpZiAodHAtPnRfcnh0c2hpZnQgPCBUQ1BfTUFYUlhUU0hJRlQpCisJCXRwLT50X3J4dHNoaWZ0Kys7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9zdWJyLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF9zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwMjBhNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwX3N1YnIuYwpAQCAtMCwwICsxLDEzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5ODgsIDE5OTAsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwX3N1YnIuYwk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiB0Y3Bfc3Vici5jLHYgMS41IDE5OTQvMTAvMDggMjI6Mzk6NTggcGhrIEV4cAorICovCisKKy8qCisgKiBDaGFuZ2VzIGFuZCBhZGRpdGlvbnMgcmVsYXRpbmcgdG8gU0xpUlAKKyAqIENvcHlyaWdodCAoYykgMTk5NSBEYW5ueSBHYXNwYXJvdnNraS4KKyAqCisgKiBQbGVhc2UgcmVhZCB0aGUgZmlsZSBDT1BZUklHSFQgZm9yIHRoZQorICogdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGNvcHlyaWdodC4KKyAqLworCisjaW5jbHVkZSA8c2xpcnAuaD4KKworLyogcGF0Y2hhYmxlL3NldHRhYmxlIHBhcmFtZXRlcnMgZm9yIHRjcCAqLworLyogRG9uJ3QgZG8gcmZjMTMyMyBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMgKi8KKyNkZWZpbmUgVENQX0RPX1JGQzEzMjMgMAorCisvKgorICogVGNwIGluaXRpYWxpemF0aW9uCisgKi8KK3ZvaWQKK3RjcF9pbml0KHZvaWQpCit7CisJdGNwX2lzcyA9IDE7CQkvKiB3cm9uZyAqLworCXRjYi5zb19uZXh0ID0gdGNiLnNvX3ByZXYgPSAmdGNiOworfQorCisvKgorICogQ3JlYXRlIHRlbXBsYXRlIHRvIGJlIHVzZWQgdG8gc2VuZCB0Y3AgcGFja2V0cyBvbiBhIGNvbm5lY3Rpb24uCisgKiBDYWxsIGFmdGVyIGhvc3QgZW50cnkgY3JlYXRlZCwgZmlsbHMKKyAqIGluIGEgc2tlbGV0YWwgdGNwL2lwIGhlYWRlciwgbWluaW1pemluZyB0aGUgYW1vdW50IG9mIHdvcmsKKyAqIG5lY2Vzc2FyeSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQuCisgKi8KKy8qIHN0cnVjdCB0Y3BpcGhkciAqICovCit2b2lkCit0Y3BfdGVtcGxhdGUoc3RydWN0IHRjcGNiICp0cCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzbyA9IHRwLT50X3NvY2tldDsKKwlyZWdpc3RlciBzdHJ1Y3QgdGNwaXBoZHIgKm4gPSAmdHAtPnRfdGVtcGxhdGU7CisKKwluLT50aV9tYnVmID0gTlVMTDsKKwluLT50aV94MSA9IDA7CisJbi0+dGlfcHIgPSBJUFBST1RPX1RDUDsKKwluLT50aV9sZW4gPSBodG9ucyhzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcikgLSBzaXplb2YgKHN0cnVjdCBpcCkpOworCW4tPnRpX3NyYyA9IHNvLT5zb19mYWRkcjsKKwluLT50aV9kc3QgPSBzby0+c29fbGFkZHI7CisJbi0+dGlfc3BvcnQgPSBzby0+c29fZnBvcnQ7CisJbi0+dGlfZHBvcnQgPSBzby0+c29fbHBvcnQ7CisKKwluLT50aV9zZXEgPSAwOworCW4tPnRpX2FjayA9IDA7CisJbi0+dGlfeDIgPSAwOworCW4tPnRpX29mZiA9IDU7CisJbi0+dGlfZmxhZ3MgPSAwOworCW4tPnRpX3dpbiA9IDA7CisJbi0+dGlfc3VtID0gMDsKKwluLT50aV91cnAgPSAwOworfQorCisvKgorICogU2VuZCBhIHNpbmdsZSBtZXNzYWdlIHRvIHRoZSBUQ1AgYXQgYWRkcmVzcyBzcGVjaWZpZWQgYnkKKyAqIHRoZSBnaXZlbiBUQ1AvSVAgaGVhZGVyLiAgSWYgbSA9PSAwLCB0aGVuIHdlIG1ha2UgYSBjb3B5CisgKiBvZiB0aGUgdGNwaXBoZHIgYXQgdGkgYW5kIHNlbmQgZGlyZWN0bHkgdG8gdGhlIGFkZHJlc3NlZCBob3N0LgorICogVGhpcyBpcyB1c2VkIHRvIGZvcmNlIGtlZXAgYWxpdmUgbWVzc2FnZXMgb3V0IHVzaW5nIHRoZSBUQ1AKKyAqIHRlbXBsYXRlIGZvciBhIGNvbm5lY3Rpb24gdHAtPnRfdGVtcGxhdGUuICBJZiBmbGFncyBhcmUgZ2l2ZW4KKyAqIHRoZW4gd2Ugc2VuZCBhIG1lc3NhZ2UgYmFjayB0byB0aGUgVENQIHdoaWNoIG9yaWdpbmF0ZWQgdGhlCisgKiBzZWdtZW50IHRpLCBhbmQgZGlzY2FyZCB0aGUgbWJ1ZiBjb250YWluaW5nIGl0IGFuZCBhbnkgb3RoZXIKKyAqIGF0dGFjaGVkIG1idWZzLgorICoKKyAqIEluIGFueSBjYXNlIHRoZSBhY2sgYW5kIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgdHJhbnNtaXR0ZWQKKyAqIHNlZ21lbnQgYXJlIGFzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVycy4KKyAqLwordm9pZAordGNwX3Jlc3BvbmQoc3RydWN0IHRjcGNiICp0cCwgc3RydWN0IHRjcGlwaGRyICp0aSwgc3RydWN0IG1idWYgKm0sCisgICAgICAgICAgICB0Y3Bfc2VxIGFjaywgdGNwX3NlcSBzZXEsIGludCBmbGFncykKK3sKKwlyZWdpc3RlciBpbnQgdGxlbjsKKwlpbnQgd2luID0gMDsKKworCURFQlVHX0NBTEwoInRjcF9yZXNwb25kIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nKXRwKTsKKwlERUJVR19BUkcoInRpID0gJWx4IiwgKGxvbmcpdGkpOworCURFQlVHX0FSRygibSA9ICVseCIsIChsb25nKW0pOworCURFQlVHX0FSRygiYWNrID0gJXUiLCBhY2spOworCURFQlVHX0FSRygic2VxID0gJXUiLCBzZXEpOworCURFQlVHX0FSRygiZmxhZ3MgPSAleCIsIGZsYWdzKTsKKworCWlmICh0cCkKKwkJd2luID0gc2JzcGFjZSgmdHAtPnRfc29ja2V0LT5zb19yY3YpOworICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisJCWlmICgobSA9IG1fZ2V0KCkpID09IE5VTEwpCisJCQlyZXR1cm47CisjaWZkZWYgVENQX0NPTVBBVF80MgorCQl0bGVuID0gMTsKKyNlbHNlCisJCXRsZW4gPSAwOworI2VuZGlmCisJCW0tPm1fZGF0YSArPSBJRl9NQVhMSU5LSERSOworCQkqbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKikgPSAqdGk7CisJCXRpID0gbXRvZChtLCBzdHJ1Y3QgdGNwaXBoZHIgKik7CisJCWZsYWdzID0gVEhfQUNLOworCX0gZWxzZSB7CisJCS8qCisJCSAqIHRpIHBvaW50cyBpbnRvIG0gc28gdGhlIG5leHQgbGluZSBpcyBqdXN0IG1ha2luZworCQkgKiB0aGUgbWJ1ZiBwb2ludCB0byB0aQorCQkgKi8KKwkJbS0+bV9kYXRhID0gKGNhZGRyX3QpdGk7CisKKwkJbS0+bV9sZW4gPSBzaXplb2YgKHN0cnVjdCB0Y3BpcGhkcik7CisJCXRsZW4gPSAwOworI2RlZmluZSB4Y2hnKGEsYix0eXBlKSB7IHR5cGUgdDsgdD1hOyBhPWI7IGI9dDsgfQorCQl4Y2hnKHRpLT50aV9kc3Quc19hZGRyLCB0aS0+dGlfc3JjLnNfYWRkciwgdV9pbnQzMl90KTsKKwkJeGNoZyh0aS0+dGlfZHBvcnQsIHRpLT50aV9zcG9ydCwgdV9pbnQxNl90KTsKKyN1bmRlZiB4Y2hnCisJfQorCXRpLT50aV9sZW4gPSBodG9ucygodV9zaG9ydCkoc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSArIHRsZW4pKTsKKwl0bGVuICs9IHNpemVvZiAoc3RydWN0IHRjcGlwaGRyKTsKKwltLT5tX2xlbiA9IHRsZW47CisKKyAgICAgICAgdGktPnRpX21idWYgPSBOVUxMOworCXRpLT50aV94MSA9IDA7CisJdGktPnRpX3NlcSA9IGh0b25sKHNlcSk7CisJdGktPnRpX2FjayA9IGh0b25sKGFjayk7CisJdGktPnRpX3gyID0gMDsKKwl0aS0+dGlfb2ZmID0gc2l6ZW9mIChzdHJ1Y3QgdGNwaGRyKSA+PiAyOworCXRpLT50aV9mbGFncyA9IGZsYWdzOworCWlmICh0cCkKKwkJdGktPnRpX3dpbiA9IGh0b25zKCh1X2ludDE2X3QpICh3aW4gPj4gdHAtPnJjdl9zY2FsZSkpOworCWVsc2UKKwkJdGktPnRpX3dpbiA9IGh0b25zKCh1X2ludDE2X3Qpd2luKTsKKwl0aS0+dGlfdXJwID0gMDsKKwl0aS0+dGlfc3VtID0gMDsKKwl0aS0+dGlfc3VtID0gY2tzdW0obSwgdGxlbik7CisJKChzdHJ1Y3QgaXAgKil0aSktPmlwX2xlbiA9IHRsZW47CisKKwlpZihmbGFncyAmIFRIX1JTVCkKKwkgICgoc3RydWN0IGlwICopdGkpLT5pcF90dGwgPSBNQVhUVEw7CisJZWxzZQorCSAgKChzdHJ1Y3QgaXAgKil0aSktPmlwX3R0bCA9IElQREVGVFRMOworCisJKHZvaWQpIGlwX291dHB1dCgoc3RydWN0IHNvY2tldCAqKTAsIG0pOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IFRDUCBjb250cm9sIGJsb2NrLCBtYWtpbmcgYW4KKyAqIGVtcHR5IHJlYXNzZW1ibHkgcXVldWUgYW5kIGhvb2tpbmcgaXQgdG8gdGhlIGFyZ3VtZW50CisgKiBwcm90b2NvbCBjb250cm9sIGJsb2NrLgorICovCitzdHJ1Y3QgdGNwY2IgKgordGNwX25ld3RjcGNiKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHA7CisKKwl0cCA9IChzdHJ1Y3QgdGNwY2IgKiltYWxsb2Moc2l6ZW9mKCp0cCkpOworCWlmICh0cCA9PSBOVUxMKQorCQlyZXR1cm4gKChzdHJ1Y3QgdGNwY2IgKikwKTsKKworCW1lbXNldCgoY2hhciAqKSB0cCwgMCwgc2l6ZW9mKHN0cnVjdCB0Y3BjYikpOworCXRwLT5zZWdfbmV4dCA9IHRwLT5zZWdfcHJldiA9IChzdHJ1Y3QgdGNwaXBoZHIqKXRwOworCXRwLT50X21heHNlZyA9IFRDUF9NU1M7CisKKwl0cC0+dF9mbGFncyA9IFRDUF9ET19SRkMxMzIzID8gKFRGX1JFUV9TQ0FMRXxURl9SRVFfVFNUTVApIDogMDsKKwl0cC0+dF9zb2NrZXQgPSBzbzsKKworCS8qCisJICogSW5pdCBzcnR0IHRvIFRDUFRWX1NSVFRCQVNFICgwKSwgc28gd2UgY2FuIHRlbGwgdGhhdCB3ZSBoYXZlIG5vCisJICogcnR0IGVzdGltYXRlLiAgU2V0IHJ0dHZhciBzbyB0aGF0IHNydHQgKyAyICogcnR0dmFyIGdpdmVzCisJICogcmVhc29uYWJsZSBpbml0aWFsIHJldHJhbnNtaXQgdGltZS4KKwkgKi8KKwl0cC0+dF9zcnR0ID0gVENQVFZfU1JUVEJBU0U7CisJdHAtPnRfcnR0dmFyID0gVENQVFZfU1JUVERGTFQgPDwgMjsKKwl0cC0+dF9ydHRtaW4gPSBUQ1BUVl9NSU47CisKKwlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwKKwkgICAgKChUQ1BUVl9TUlRUQkFTRSA+PiAyKSArIChUQ1BUVl9TUlRUREZMVCA8PCAyKSkgPj4gMSwKKwkgICAgVENQVFZfTUlOLCBUQ1BUVl9SRVhNVE1BWCk7CisKKwl0cC0+c25kX2N3bmQgPSBUQ1BfTUFYV0lOIDw8IFRDUF9NQVhfV0lOU0hJRlQ7CisJdHAtPnNuZF9zc3RocmVzaCA9IFRDUF9NQVhXSU4gPDwgVENQX01BWF9XSU5TSElGVDsKKwl0cC0+dF9zdGF0ZSA9IFRDUFNfQ0xPU0VEOworCisJc28tPnNvX3RjcGNiID0gdHA7CisKKwlyZXR1cm4gKHRwKTsKK30KKworLyoKKyAqIERyb3AgYSBUQ1AgY29ubmVjdGlvbiwgcmVwb3J0aW5nCisgKiB0aGUgc3BlY2lmaWVkIGVycm9yLiAgSWYgY29ubmVjdGlvbiBpcyBzeW5jaHJvbml6ZWQsCisgKiB0aGVuIHNlbmQgYSBSU1QgdG8gcGVlci4KKyAqLworc3RydWN0IHRjcGNiICp0Y3BfZHJvcChzdHJ1Y3QgdGNwY2IgKnRwLCBpbnQgZXJyKQoreworLyogdGNwX2Ryb3AodHAsIGVycm5vKQorCXJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHA7CisJaW50IGVycm5vOworeworKi8KKworCURFQlVHX0NBTEwoInRjcF9kcm9wIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nKXRwKTsKKwlERUJVR19BUkcoImVycm5vID0gJWQiLCBlcnJubyk7CisKKwlpZiAoVENQU19IQVZFUkNWRFNZTih0cC0+dF9zdGF0ZSkpIHsKKwkJdHAtPnRfc3RhdGUgPSBUQ1BTX0NMT1NFRDsKKwkJKHZvaWQpIHRjcF9vdXRwdXQodHApOworCQlTVEFUKHRjcHN0YXQudGNwc19kcm9wcysrKTsKKwl9IGVsc2UKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfY29ubmRyb3BzKyspOworLyoJaWYgKGVycm5vID09IEVUSU1FRE9VVCAmJiB0cC0+dF9zb2Z0ZXJyb3IpCisgKgkJZXJybm8gPSB0cC0+dF9zb2Z0ZXJyb3I7CisgKi8KKy8qCXNvLT5zb19lcnJvciA9IGVycm5vOyAqLworCXJldHVybiAodGNwX2Nsb3NlKHRwKSk7Cit9CisKKy8qCisgKiBDbG9zZSBhIFRDUCBjb250cm9sIGJsb2NrOgorICoJZGlzY2FyZCBhbGwgc3BhY2UgaGVsZCBieSB0aGUgdGNwCisgKglkaXNjYXJkIGludGVybmV0IHByb3RvY29sIGJsb2NrCisgKgl3YWtlIHVwIGFueSBzbGVlcGVycworICovCitzdHJ1Y3QgdGNwY2IgKgordGNwX2Nsb3NlKHN0cnVjdCB0Y3BjYiAqdHApCit7CisJcmVnaXN0ZXIgc3RydWN0IHRjcGlwaGRyICp0OworCXN0cnVjdCBzb2NrZXQgKnNvID0gdHAtPnRfc29ja2V0OworCXJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOworCisJREVCVUdfQ0FMTCgidGNwX2Nsb3NlIik7CisJREVCVUdfQVJHKCJ0cCA9ICVseCIsIChsb25nICl0cCk7CisKKwkvKiBmcmVlIHRoZSByZWFzc2VtYmx5IHF1ZXVlLCBpZiBhbnkgKi8KKwl0ID0gdGNwZnJhZ19saXN0X2ZpcnN0KHRwKTsKKwl3aGlsZSAoIXRjcGZyYWdfbGlzdF9lbmQodCwgdHApKSB7CisJCXQgPSB0Y3BpcGhkcl9uZXh0KHQpOworCQltID0gdGNwaXBoZHJfcHJldih0KS0+dGlfbWJ1ZjsKKwkJcmVtcXVlKHRjcGlwaGRyMnFsaW5rKHRjcGlwaGRyX3ByZXYodCkpKTsKKwkJbV9mcmVlbShtKTsKKwl9CisJLyogSXQncyBzdGF0aWMgKi8KKy8qCWlmICh0cC0+dF90ZW1wbGF0ZSkKKyAqCQkodm9pZCkgbV9mcmVlKGR0b20odHAtPnRfdGVtcGxhdGUpKTsKKyAqLworLyoJZnJlZSh0cCwgTV9QQ0IpOyAgKi8KKwlmcmVlKHRwKTsKKyAgICAgICAgc28tPnNvX3RjcGNiID0gTlVMTDsKKwlzb2lzZmRpc2Nvbm5lY3RlZChzbyk7CisJLyogY2xvYmJlciBpbnB1dCBzb2NrZXQgY2FjaGUgaWYgd2UncmUgY2xvc2luZyB0aGUgY2FjaGVkIGNvbm5lY3Rpb24gKi8KKwlpZiAoc28gPT0gdGNwX2xhc3Rfc28pCisJCXRjcF9sYXN0X3NvID0gJnRjYjsKKwljbG9zZXNvY2tldChzby0+cyk7CisJc2JmcmVlKCZzby0+c29fcmN2KTsKKwlzYmZyZWUoJnNvLT5zb19zbmQpOworCXNvZnJlZShzbyk7CisJU1RBVCh0Y3BzdGF0LnRjcHNfY2xvc2VkKyspOworCXJldHVybiAoKHN0cnVjdCB0Y3BjYiAqKTApOworfQorCisjaWZkZWYgbm90ZGVmCit2b2lkCit0Y3BfZHJhaW4oKQoreworCS8qIFhYWCAqLworfQorCisvKgorICogV2hlbiBhIHNvdXJjZSBxdWVuY2ggaXMgcmVjZWl2ZWQsIGNsb3NlIGNvbmdlc3Rpb24gd2luZG93CisgKiB0byBvbmUgc2VnbWVudC4gIFdlIHdpbGwgZ3JhZHVhbGx5IG9wZW4gaXQgYWdhaW4gYXMgd2UgcHJvY2VlZC4KKyAqLwordm9pZAordGNwX3F1ZW5jaChpLCBlcnJubykKKworCWludCBlcnJubzsKK3sKKwlzdHJ1Y3QgdGNwY2IgKnRwID0gaW50b3RjcGNiKGlucCk7CisKKwlpZiAodHApCisJCXRwLT5zbmRfY3duZCA9IHRwLT50X21heHNlZzsKK30KKworI2VuZGlmIC8qIG5vdGRlZiAqLworCisvKgorICogVENQIHByb3RvY29sIGludGVyZmFjZSB0byBzb2NrZXQgYWJzdHJhY3Rpb24uCisgKi8KKworLyoKKyAqIFVzZXIgaXNzdWVkIGNsb3NlLCBhbmQgd2lzaCB0byB0cmFpbCB0aHJvdWdoIHNodXRkb3duIHN0YXRlczoKKyAqIGlmIG5ldmVyIHJlY2VpdmVkIFNZTiwganVzdCBmb3JnZXQgaXQuICBJZiBnb3QgYSBTWU4gZnJvbSBwZWVyLAorICogYnV0IGhhdmVuJ3Qgc2VudCBGSU4sIHRoZW4gZ28gdG8gRklOX1dBSVRfMSBzdGF0ZSB0byBzZW5kIHBlZXIgYSBGSU4uCisgKiBJZiBhbHJlYWR5IGdvdCBhIEZJTiBmcm9tIHBlZXIsIHRoZW4gYWxtb3N0IGRvbmU7IGdvIHRvIExBU1RfQUNLCisgKiBzdGF0ZS4gIEluIGFsbCBvdGhlciBjYXNlcywgaGF2ZSBhbHJlYWR5IHNlbnQgRklOIHRvIHBlZXIgKGUuZy4KKyAqIGFmdGVyIFBSVV9TSFVURE9XTiksIGFuZCBqdXN0IGhhdmUgdG8gcGxheSB0ZWRpb3VzIGdhbWUgd2FpdGluZworICogZm9yIHBlZXIgdG8gc2VuZCBGSU4gb3Igbm90IHJlc3BvbmQgdG8ga2VlcC1hbGl2ZXMsIGV0Yy4KKyAqIFdlIGNhbiBsZXQgdGhlIHVzZXIgZXhpdCBmcm9tIHRoZSBjbG9zZSBhcyBzb29uIGFzIHRoZSBGSU4gaXMgYWNrZWQuCisgKi8KK3ZvaWQKK3RjcF9zb2NrY2xvc2VkKHN0cnVjdCB0Y3BjYiAqdHApCit7CisKKwlERUJVR19DQUxMKCJ0Y3Bfc29ja2Nsb3NlZCIpOworCURFQlVHX0FSRygidHAgPSAlbHgiLCAobG9uZyl0cCk7CisKKwlzd2l0Y2ggKHRwLT50X3N0YXRlKSB7CisKKwljYXNlIFRDUFNfQ0xPU0VEOgorCWNhc2UgVENQU19MSVNURU46CisJY2FzZSBUQ1BTX1NZTl9TRU5UOgorCQl0cC0+dF9zdGF0ZSA9IFRDUFNfQ0xPU0VEOworCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCWJyZWFrOworCisJY2FzZSBUQ1BTX1NZTl9SRUNFSVZFRDoKKwljYXNlIFRDUFNfRVNUQUJMSVNIRUQ6CisJCXRwLT50X3N0YXRlID0gVENQU19GSU5fV0FJVF8xOworCQlicmVhazsKKworCWNhc2UgVENQU19DTE9TRV9XQUlUOgorCQl0cC0+dF9zdGF0ZSA9IFRDUFNfTEFTVF9BQ0s7CisJCWJyZWFrOworCX0KKy8qCXNvaXNmZGlzY29ubmVjdGluZyh0cC0+dF9zb2NrZXQpOyAqLworCWlmICh0cCAmJiB0cC0+dF9zdGF0ZSA+PSBUQ1BTX0ZJTl9XQUlUXzIpCisJCXNvaXNmZGlzY29ubmVjdGVkKHRwLT50X3NvY2tldCk7CisJaWYgKHRwKQorCQl0Y3Bfb3V0cHV0KHRwKTsKK30KKworLyoKKyAqIENvbm5lY3QgdG8gYSBob3N0IG9uIHRoZSBJbnRlcm5ldAorICogQ2FsbGVkIGJ5IHRjcF9pbnB1dAorICogT25seSBkbyBhIGNvbm5lY3QsIHRoZSB0Y3AgZmllbGRzIHdpbGwgYmUgc2V0IGluIHRjcF9pbnB1dAorICogcmV0dXJuIDAgaWYgdGhlcmUncyBhIHJlc3VsdCBvZiB0aGUgY29ubmVjdCwKKyAqIGVsc2UgcmV0dXJuIC0xIG1lYW5zIHdlJ3JlIHN0aWxsIGNvbm5lY3RpbmcKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYWxtb3N0IGFsd2F5cyAtMSBzaW5jZSB0aGUgc29ja2V0IGlzCisgKiBub25ibG9ja2luZy4gIENvbm5lY3QgcmV0dXJucyBhZnRlciB0aGUgU1lOIGlzIHNlbnQsIGFuZCBkb2VzCisgKiBub3Qgd2FpdCBmb3IgQUNLK1NZTi4KKyAqLworaW50IHRjcF9mY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKyAgaW50IHJldD0wOworCisgIERFQlVHX0NBTEwoInRjcF9mY29ubmVjdCIpOworICBERUJVR19BUkcoInNvID0gJWx4IiwgKGxvbmcgKXNvKTsKKworICBpZiggKHJldD1zby0+cz1zb2NrZXQoQUZfSU5FVCxTT0NLX1NUUkVBTSwwKSkgPj0gMCkgeworICAgIGludCBvcHQsIHM9c28tPnM7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisKKyAgICBmZF9ub25ibG9jayhzKTsKKyAgICBvcHQgPSAxOworICAgIHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwoY2hhciAqKSZvcHQsc2l6ZW9mKG9wdCApKTsKKyAgICBvcHQgPSAxOworICAgIHNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKG9wdCApKTsKKworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgaWYgKChzby0+c29fZmFkZHIuc19hZGRyICYgaHRvbmwoMHhmZmZmZmYwMCkpID09IHNwZWNpYWxfYWRkci5zX2FkZHIpIHsKKyAgICAgIC8qIEl0J3MgYW4gYWxpYXMgKi8KKyAgICAgIHN3aXRjaChudG9obChzby0+c29fZmFkZHIuc19hZGRyKSAmIDB4ZmYpIHsKKyAgICAgIGNhc2UgQ1RMX0ROUzoKKwlhZGRyLnNpbl9hZGRyID0gZG5zX2FkZHI7CisJYnJlYWs7CisgICAgICBjYXNlIENUTF9BTElBUzoKKyAgICAgIGRlZmF1bHQ6CisJYWRkci5zaW5fYWRkciA9IGxvb3BiYWNrX2FkZHI7CisJYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlCisgICAgICBhZGRyLnNpbl9hZGRyID0gc28tPnNvX2ZhZGRyOworICAgIGFkZHIuc2luX3BvcnQgPSBzby0+c29fZnBvcnQ7CisKKyAgICBERUJVR19NSVNDKChkZmQsICIgY29ubmVjdCgpaW5nLCBhZGRyLnNpbl9wb3J0PSVkLCAiCisJCSJhZGRyLnNpbl9hZGRyLnNfYWRkcj0lLjE2c1xuIiwKKwkJbnRvaHMoYWRkci5zaW5fcG9ydCksIGluZXRfbnRvYShhZGRyLnNpbl9hZGRyKSkpOworICAgIC8qIFdlIGRvbid0IGNhcmUgd2hhdCBwb3J0IHdlIGdldCAqLworICAgIHJldCA9IGNvbm5lY3Qocywoc3RydWN0IHNvY2thZGRyICopJmFkZHIsc2l6ZW9mIChhZGRyKSk7CisKKyAgICAvKgorICAgICAqIElmIGl0J3Mgbm90IGluIHByb2dyZXNzLCBpdCBmYWlsZWQsIHNvIHdlIGp1c3QgcmV0dXJuIDAsCisgICAgICogd2l0aG91dCBjbGVhcmluZyBTU19OT0ZEUkVGCisgICAgICovCisgICAgc29pc2Zjb25uZWN0aW5nKHNvKTsKKyAgfQorCisgIHJldHVybihyZXQpOworfQorCisvKgorICogQWNjZXB0IHRoZSBzb2NrZXQgYW5kIGNvbm5lY3QgdG8gdGhlIGxvY2FsLWhvc3QKKyAqCisgKiBXZSBoYXZlIGEgcHJvYmxlbS4gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gd291bGQgYmUKKyAqIHRvIGZpcnN0IGNvbm5lY3QgdG8gdGhlIGxvY2FsLWhvc3QsIGFuZCBvbmx5IGlmIHRoZQorICogY29ubmVjdGlvbiBpcyBhY2NlcHRlZCwgdGhlbiBkbyBhbiBhY2NlcHQoKSBoZXJlLgorICogQnV0LCBhKSB3ZSBuZWVkIHRvIGtub3cgd2hvJ3MgdHJ5aW5nIHRvIGNvbm5lY3QKKyAqIHRvIHRoZSBzb2NrZXQgdG8gYmUgYWJsZSB0byBTWU4gdGhlIGxvY2FsLWhvc3QsIGFuZAorICogYikgd2UgYXJlIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZSBmb3JlaWduIGhvc3QgYnkKKyAqIHRoZSB0aW1lIGl0IGdldHMgdG8gYWNjZXB0KCksIHNvLi4uIFdlIHNpbXBseSBhY2NlcHQKKyAqIGhlcmUgYW5kIFNZTiB0aGUgbG9jYWwtaG9zdC4KKyAqLwordm9pZAordGNwX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqaW5zbykKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCXN0cnVjdCB0Y3BjYiAqdHA7CisJaW50IHMsIG9wdDsKKworCURFQlVHX0NBTEwoInRjcF9jb25uZWN0Iik7CisJREVCVUdfQVJHKCJpbnNvID0gJWx4IiwgKGxvbmcpaW5zbyk7CisKKwkvKgorCSAqIElmIGl0J3MgYW4gU1NfQUNDRVBUT05DRSBzb2NrZXQsIG5vIG5lZWQgdG8gc29jcmVhdGUoKQorCSAqIGFub3RoZXIgc29ja2V0LCBqdXN0IHVzZSB0aGUgYWNjZXB0KCkgc29ja2V0LgorCSAqLworCWlmIChpbnNvLT5zb19zdGF0ZSAmIFNTX0ZBQ0NFUFRPTkNFKSB7CisJCS8qIEZBQ0NFUFRPTkNFIGFscmVhZHkgaGF2ZSBhIHRjcGNiICovCisJCXNvID0gaW5zbzsKKwl9IGVsc2UgeworCQlpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkgeworCQkJLyogSWYgaXQgZmFpbGVkLCBnZXQgcmlkIG9mIHRoZSBwZW5kaW5nIGNvbm5lY3Rpb24gKi8KKwkJCWNsb3Nlc29ja2V0KGFjY2VwdChpbnNvLT5zLChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwmYWRkcmxlbikpOworCQkJcmV0dXJuOworCQl9CisJCWlmICh0Y3BfYXR0YWNoKHNvKSA8IDApIHsKKwkJCWZyZWUoc28pOyAvKiBOT1Qgc29mcmVlICovCisJCQlyZXR1cm47CisJCX0KKwkJc28tPnNvX2xhZGRyID0gaW5zby0+c29fbGFkZHI7CisJCXNvLT5zb19scG9ydCA9IGluc28tPnNvX2xwb3J0OworCX0KKworCSh2b2lkKSB0Y3BfbXNzKHNvdG90Y3BjYihzbyksIDApOworCisJaWYgKChzID0gYWNjZXB0KGluc28tPnMsKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCZhZGRybGVuKSkgPCAwKSB7CisJCXRjcF9jbG9zZShzb3RvdGNwY2Ioc28pKTsgLyogVGhpcyB3aWxsIHNvZnJlZSgpIGFzIHdlbGwgKi8KKwkJcmV0dXJuOworCX0KKwlmZF9ub25ibG9jayhzKTsKKwlvcHQgPSAxOworCXNldHNvY2tvcHQocyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOworCW9wdCA9IDE7CisJc2V0c29ja29wdChzLFNPTF9TT0NLRVQsU09fT09CSU5MSU5FLChjaGFyICopJm9wdCxzaXplb2YoaW50KSk7CisJb3B0ID0gMTsKKwlzZXRzb2Nrb3B0KHMsSVBQUk9UT19UQ1AsVENQX05PREVMQVksKGNoYXIgKikmb3B0LHNpemVvZihpbnQpKTsKKworCXNvLT5zb19mcG9ydCA9IGFkZHIuc2luX3BvcnQ7CisJc28tPnNvX2ZhZGRyID0gYWRkci5zaW5fYWRkcjsKKwkvKiBUcmFuc2xhdGUgY29ubmVjdGlvbnMgZnJvbSBsb2NhbGhvc3QgdG8gdGhlIHJlYWwgaG9zdG5hbWUgKi8KKwlpZiAoc28tPnNvX2ZhZGRyLnNfYWRkciA9PSAwIHx8IHNvLT5zb19mYWRkci5zX2FkZHIgPT0gbG9vcGJhY2tfYWRkci5zX2FkZHIpCisJICAgc28tPnNvX2ZhZGRyID0gYWxpYXNfYWRkcjsKKworCS8qIENsb3NlIHRoZSBhY2NlcHQoKSBzb2NrZXQsIHNldCByaWdodCBzdGF0ZSAqLworCWlmIChpbnNvLT5zb19zdGF0ZSAmIFNTX0ZBQ0NFUFRPTkNFKSB7CisJCWNsb3Nlc29ja2V0KHNvLT5zKTsgLyogSWYgd2Ugb25seSBhY2NlcHQgb25jZSwgY2xvc2UgdGhlIGFjY2VwdCgpIHNvY2tldCAqLworCQlzby0+c29fc3RhdGUgPSBTU19OT0ZEUkVGOyAvKiBEb24ndCBzZWxlY3QgaXQgeWV0LCBldmVuIHRob3VnaCB3ZSBoYXZlIGFuIEZEICovCisJCQkJCSAgIC8qIGlmIGl0J3Mgbm90IEZBQ0NFUFRPTkNFLCBpdCdzIGFscmVhZHkgTk9GRFJFRiAqLworCX0KKwlzby0+cyA9IHM7CisKKwlzby0+c29faXB0b3MgPSB0Y3BfdG9zKHNvKTsKKwl0cCA9IHNvdG90Y3BjYihzbyk7CisKKwl0Y3BfdGVtcGxhdGUodHApOworCisJLyogQ29tcHV0ZSB3aW5kb3cgc2NhbGluZyB0byByZXF1ZXN0LiAgKi8KKy8qCXdoaWxlICh0cC0+cmVxdWVzdF9yX3NjYWxlIDwgVENQX01BWF9XSU5TSElGVCAmJgorICoJCShUQ1BfTUFYV0lOIDw8IHRwLT5yZXF1ZXN0X3Jfc2NhbGUpIDwgc28tPnNvX3Jjdi5zYl9oaXdhdCkKKyAqCQl0cC0+cmVxdWVzdF9yX3NjYWxlKys7CisgKi8KKworLyoJc29pc2Nvbm5lY3Rpbmcoc28pOyAqLyAvKiBOT0ZEUkVGIHVzZWQgaW5zdGVhZCAqLworCVNUQVQodGNwc3RhdC50Y3BzX2Nvbm5hdHRlbXB0KyspOworCisJdHAtPnRfc3RhdGUgPSBUQ1BTX1NZTl9TRU5UOworCXRwLT50X3RpbWVyW1RDUFRfS0VFUF0gPSBUQ1BUVl9LRUVQX0lOSVQ7CisJdHAtPmlzcyA9IHRjcF9pc3M7CisJdGNwX2lzcyArPSBUQ1BfSVNTSU5DUi8yOworCXRjcF9zZW5kc2VxaW5pdCh0cCk7CisJdGNwX291dHB1dCh0cCk7Cit9CisKKy8qCisgKiBBdHRhY2ggYSBUQ1BDQiB0byBhIHNvY2tldC4KKyAqLworaW50Cit0Y3BfYXR0YWNoKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWlmICgoc28tPnNvX3RjcGNiID0gdGNwX25ld3RjcGNiKHNvKSkgPT0gTlVMTCkKKwkgICByZXR1cm4gLTE7CisKKwlpbnNxdWUoc28sICZ0Y2IpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdGhlIHNvY2tldCdzIHR5cGUgb2Ygc2VydmljZSBmaWVsZAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvc190IHRjcHRvc1tdID0geworCSAgezAsIDIwLCBJUFRPU19USFJPVUdIUFVULCAwfSwJLyogZnRwIGRhdGEgKi8KKwkgIHsyMSwgMjEsIElQVE9TX0xPV0RFTEFZLCAgRU1VX0ZUUH0sCS8qIGZ0cCBjb250cm9sICovCisJICB7MCwgMjMsIElQVE9TX0xPV0RFTEFZLCAwfSwJLyogdGVsbmV0ICovCisJICB7MCwgODAsIElQVE9TX1RIUk9VR0hQVVQsIDB9LAkvKiBXV1cgKi8KKwkgIHswLCA1MTMsIElQVE9TX0xPV0RFTEFZLCBFTVVfUkxPR0lOfEVNVV9OT0NPTk5FQ1R9LAkvKiBybG9naW4gKi8KKwkgIHswLCA1MTQsIElQVE9TX0xPV0RFTEFZLCBFTVVfUlNIfEVNVV9OT0NPTk5FQ1R9LAkvKiBzaGVsbCAqLworCSAgezAsIDU0NCwgSVBUT1NfTE9XREVMQVksIEVNVV9LU0h9LAkJLyoga3NoZWxsICovCisJICB7MCwgNTQzLCBJUFRPU19MT1dERUxBWSwgMH0sCS8qIGtsb2dpbiAqLworCSAgezAsIDY2NjcsIElQVE9TX1RIUk9VR0hQVVQsIEVNVV9JUkN9LAkvKiBJUkMgKi8KKwkgIHswLCA2NjY4LCBJUFRPU19USFJPVUdIUFVULCBFTVVfSVJDfSwJLyogSVJDIHVuZGVybmV0ICovCisJICB7MCwgNzA3MCwgSVBUT1NfTE9XREVMQVksIEVNVV9SRUFMQVVESU8gfSwgLyogUmVhbEF1ZGlvIGNvbnRyb2wgKi8KKwkgIHswLCAxMTMsIElQVE9TX0xPV0RFTEFZLCBFTVVfSURFTlQgfSwgLyogaWRlbnRkIHByb3RvY29sICovCisJICB7MCwgMCwgMCwgMH0KK307CisKKyNpZmRlZiBDT05GSUdfUUVNVQorc3RhdGljCisjZW5kaWYKK3N0cnVjdCBlbXVfdCAqdGNwZW11ID0gTlVMTDsKKworLyoKKyAqIFJldHVybiBUT1MgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSB0YWJsZQorICovCit1X2ludDhfdAordGNwX3RvcyhzdHJ1Y3Qgc29ja2V0ICpzbykKK3sKKwlpbnQgaSA9IDA7CisJc3RydWN0IGVtdV90ICplbXVwOworCisJd2hpbGUodGNwdG9zW2ldLnRvcykgeworCQlpZiAoKHRjcHRvc1tpXS5mcG9ydCAmJiAobnRvaHMoc28tPnNvX2Zwb3J0KSA9PSB0Y3B0b3NbaV0uZnBvcnQpKSB8fAorCQkgICAgKHRjcHRvc1tpXS5scG9ydCAmJiAobnRvaHMoc28tPnNvX2xwb3J0KSA9PSB0Y3B0b3NbaV0ubHBvcnQpKSkgeworCQkJc28tPnNvX2VtdSA9IHRjcHRvc1tpXS5lbXU7CisJCQlyZXR1cm4gdGNwdG9zW2ldLnRvczsKKwkJfQorCQlpKys7CisJfQorCisJLyogTm9wZSwgbGV0cyBzZWUgaWYgdGhlcmUncyBhIHVzZXItYWRkZWQgb25lICovCisJZm9yIChlbXVwID0gdGNwZW11OyBlbXVwOyBlbXVwID0gZW11cC0+bmV4dCkgeworCQlpZiAoKGVtdXAtPmZwb3J0ICYmIChudG9ocyhzby0+c29fZnBvcnQpID09IGVtdXAtPmZwb3J0KSkgfHwKKwkJICAgIChlbXVwLT5scG9ydCAmJiAobnRvaHMoc28tPnNvX2xwb3J0KSA9PSBlbXVwLT5scG9ydCkpKSB7CisJCQlzby0+c29fZW11ID0gZW11cC0+ZW11OworCQkJcmV0dXJuIGVtdXAtPnRvczsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjaWYgMAoraW50IGRvX2VjaG8gPSAtMTsKKyNlbmRpZgorCisvKgorICogRW11bGF0ZSBwcm9ncmFtcyB0aGF0IHRyeSBhbmQgY29ubmVjdCB0byB1cworICogVGhpcyBpbmNsdWRlcyBmdHAgKHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMKKyAqIGluaXRpYXRlZCBieSB0aGUgc2VydmVyKSBhbmQgSVJDIChEQ0MgQ0hBVCBhbmQKKyAqIERDQyBTRU5EKSBmb3Igbm93CisgKgorICogTk9URTogSXQncyBwb3NzaWJsZSB0byBjcmFzaCBTTGlSUCBieSBzZW5kaW5nIGl0CisgKiB1bnN0YW5kYXJkIHN0cmluZ3MgdG8gZW11bGF0ZS4uLiBpZiB0aGlzIGlzIGEgcHJvYmxlbSwKKyAqIG1vcmUgY2hlY2tzIGFyZSBuZWVkZWQgaGVyZQorICoKKyAqIFhYWCBBc3N1bWVzIHRoZSB3aG9sZSBjb21tYW5kIGNhbWUgaW4gb25lIHBhY2tldAorICoKKyAqIFhYWCBTb21lIGZ0cCBjbGllbnRzIHdpbGwgaGF2ZSB0aGVpciBUT1Mgc2V0IHRvCisgKiBMT1dERUxBWSBhbmQgc28gTmFnZWwgd2lsbCBraWNrIGluLiAgQmVjYXVzZSBvZiB0aGlzLAorICogd2UnbGwgZ2V0IHRoZSBmaXJzdCBsZXR0ZXIsIGZvbGxvd2VkIGJ5IHRoZSByZXN0LCBzbworICogd2Ugc2ltcGx5IHNjYW4gZm9yIE9SVCBpbnN0ZWFkIG9mIFBPUlQuLi4KKyAqIERDQyBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtIGJlY2F1c2UgdGhlcmUncyBvdGhlciBzdHVmZgorICogaW4gdGhlIHBhY2tldCBiZWZvcmUgdGhlIERDQyBjb21tYW5kLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBtYnVmIG0gaXMgc3RpbGwgdmFsaWQgYW5kIHNob3VsZCBiZQorICogc2JhcHBlbmQoKWVkCisgKgorICogTk9URTogaWYgeW91IHJldHVybiAwIHlvdSBNVVNUIG1fZnJlZSgpIHRoZSBtYnVmIQorICovCitpbnQKK3RjcF9lbXUoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCXVfaW50IG4xLCBuMiwgbjMsIG40LCBuNSwgbjY7CisgICAgICAgIGNoYXIgYnVmZlsyNTddOworCXVfaW50MzJfdCBsYWRkcjsKKwl1X2ludCBscG9ydDsKKwljaGFyICpicHRyOworCisJREVCVUdfQ0FMTCgidGNwX2VtdSIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZylzbyk7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisKKwlzd2l0Y2goc28tPnNvX2VtdSkgeworCQlpbnQgeCwgaTsKKworCSBjYXNlIEVNVV9JREVOVDoKKwkJLyoKKwkJICogSWRlbnRpZmljYXRpb24gcHJvdG9jb2wgYXMgcGVyIHJmYy0xNDEzCisJCSAqLworCisJCXsKKwkJCXN0cnVjdCBzb2NrZXQgKnRtcHNvOworCQkJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJCQlzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJc3RydWN0IHNidWYgKnNvX3JjdiA9ICZzby0+c29fcmN2OworCisJCQltZW1jcHkoc29fcmN2LT5zYl93cHRyLCBtLT5tX2RhdGEsIG0tPm1fbGVuKTsKKwkJCXNvX3Jjdi0+c2Jfd3B0ciArPSBtLT5tX2xlbjsKKwkJCXNvX3Jjdi0+c2JfcnB0ciArPSBtLT5tX2xlbjsKKwkJCW0tPm1fZGF0YVttLT5tX2xlbl0gPSAwOyAvKiBOVUxMIHRlcm1pbmF0ZSAqLworCQkJaWYgKHN0cmNocihtLT5tX2RhdGEsICdccicpIHx8IHN0cmNocihtLT5tX2RhdGEsICdcbicpKSB7CisJCQkJaWYgKHNzY2FuZihzb19yY3YtPnNiX2RhdGEsICIldSUqWyAsXSV1IiwgJm4xLCAmbjIpID09IDIpIHsKKwkJCQkJSFRPTlMobjEpOworCQkJCQlIVE9OUyhuMik7CisJCQkJCS8qIG4yIGlzIHRoZSBvbmUgb24gb3VyIGhvc3QgKi8KKwkJCQkJZm9yICh0bXBzbyA9IHRjYi5zb19uZXh0OyB0bXBzbyAhPSAmdGNiOyB0bXBzbyA9IHRtcHNvLT5zb19uZXh0KSB7CisJCQkJCQlpZiAodG1wc28tPnNvX2xhZGRyLnNfYWRkciA9PSBzby0+c29fbGFkZHIuc19hZGRyICYmCisJCQkJCQkgICAgdG1wc28tPnNvX2xwb3J0ID09IG4yICYmCisJCQkJCQkgICAgdG1wc28tPnNvX2ZhZGRyLnNfYWRkciA9PSBzby0+c29fZmFkZHIuc19hZGRyICYmCisJCQkJCQkgICAgdG1wc28tPnNvX2Zwb3J0ID09IG4xKSB7CisJCQkJCQkJaWYgKGdldHNvY2tuYW1lKHRtcHNvLT5zLAorCQkJCQkJCQkoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZhZGRybGVuKSA9PSAwKQorCQkJCQkJCSAgIG4yID0gbnRvaHMoYWRkci5zaW5fcG9ydCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvX3Jjdi0+c2JfY2MgPSBzbnByaW50Zihzb19yY3YtPnNiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb19yY3YtPnNiX2RhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQsJWRcclxuIiwgbjEsIG4yKTsKKwkJCQlzb19yY3YtPnNiX3JwdHIgPSBzb19yY3YtPnNiX2RhdGE7CisJCQkJc29fcmN2LT5zYl93cHRyID0gc29fcmN2LT5zYl9kYXRhICsgc29fcmN2LT5zYl9jYzsKKwkJCX0KKwkJCW1fZnJlZShtKTsKKwkJCXJldHVybiAwOworCQl9CisKKyNpZiAwCisJIGNhc2UgRU1VX1JMT0dJTjoKKwkJLyoKKwkJICogUmxvZ2luIGVtdWxhdGlvbgorCQkgKiBGaXJzdCB3ZSBhY2N1bXVsYXRlIGFsbCB0aGUgaW5pdGlhbCBvcHRpb24gbmVnb3RpYXRpb24sCisJCSAqIHRoZW4gZm9ya19leGVjKCkgcmxvZ2luIGFjY29yZGluZyB0byB0aGUgIG9wdGlvbnMKKwkJICovCisJCXsKKwkJCWludCBpLCBpMiwgbjsKKwkJCWNoYXIgKnB0cjsKKwkJCWNoYXIgYXJnc1sxMDBdOworCQkJY2hhciB0ZXJtWzEwMF07CisJCQlzdHJ1Y3Qgc2J1ZiAqc29fc25kID0gJnNvLT5zb19zbmQ7CisJCQlzdHJ1Y3Qgc2J1ZiAqc29fcmN2ID0gJnNvLT5zb19yY3Y7CisKKwkJCS8qIEZpcnN0IGNoZWNrIGlmIHRoZXkgaGF2ZSBhIHByaXZlbGFkZ2VkIHBvcnQsIG9yIHRvbyBtdWNoIGRhdGEgaGFzIGFycml2ZWQgKi8KKwkJCWlmIChudG9ocyhzby0+c29fbHBvcnQpID4gMTAyMyB8fCBudG9ocyhzby0+c29fbHBvcnQpIDwgNTEyIHx8CisJCQkgICAgKG0tPm1fbGVuICsgc29fcmN2LT5zYl93cHRyKSA+IChzb19yY3YtPnNiX2RhdGEgKyBzb19yY3YtPnNiX2RhdGFsZW4pKSB7CisJCQkJbWVtY3B5KHNvX3NuZC0+c2Jfd3B0ciwgIlBlcm1pc3Npb24gZGVuaWVkXG4iLCAxOCk7CisJCQkJc29fc25kLT5zYl93cHRyICs9IDE4OworCQkJCXNvX3NuZC0+c2JfY2MgKz0gMTg7CisJCQkJdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisJCQkJbV9mcmVlKG0pOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBBcHBlbmQgdGhlIGN1cnJlbnQgZGF0YSAqLworCQkJbWVtY3B5KHNvX3Jjdi0+c2Jfd3B0ciwgbS0+bV9kYXRhLCBtLT5tX2xlbik7CisJCQlzb19yY3YtPnNiX3dwdHIgKz0gbS0+bV9sZW47CisJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CisJCQltX2ZyZWUobSk7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB3ZSBoYXZlIGFsbCB0aGUgaW5pdGlhbCBvcHRpb25zLAorCQkJICogYW5kIGJ1aWxkIGFyZ3VtZW50IGxpc3QgdG8gcmxvZ2luIHdoaWxlIHdlJ3JlIGhlcmUKKwkJCSAqLworCQkJbiA9IDA7CisJCQlwdHIgPSBzb19yY3YtPnNiX2RhdGE7CisJCQlhcmdzWzBdID0gMDsKKwkJCXRlcm1bMF0gPSAwOworCQkJd2hpbGUgKHB0ciA8IHNvX3Jjdi0+c2Jfd3B0cikgeworCQkJCWlmICgqcHRyKysgPT0gMCkgeworCQkJCQluKys7CisJCQkJCWlmIChuID09IDIpIHsKKwkJCQkJCXNwcmludGYoYXJncywgInJsb2dpbiAtbCAlcyAlcyIsCisJCQkJCQkJcHRyLCBpbmV0X250b2Eoc28tPnNvX2ZhZGRyKSk7CisJCQkJCX0gZWxzZSBpZiAobiA9PSAzKSB7CisJCQkJCQlpMiA9IHNvX3Jjdi0+c2Jfd3B0ciAtIHB0cjsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBpMjsgaSsrKSB7CisJCQkJCQkJaWYgKHB0cltpXSA9PSAnLycpIHsKKwkJCQkJCQkJcHRyW2ldID0gMDsKKyNpZmRlZiBIQVZFX1NFVEVOVgorCQkJCQkJCQlzcHJpbnRmKHRlcm0sICIlcyIsIHB0cik7CisjZWxzZQorCQkJCQkJCQlzcHJpbnRmKHRlcm0sICJURVJNPSVzIiwgcHRyKTsKKyNlbmRpZgorCQkJCQkJCQlwdHJbaV0gPSAnLyc7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJaWYgKG4gIT0gNCkKKwkJCSAgIHJldHVybiAwOworCisJCQkvKiBXZSBoYXZlIGl0LCBzZXQgb3VyIHRlcm0gdmFyaWFibGUgYW5kIGZvcmtfZXhlYygpICovCisjaWZkZWYgSEFWRV9TRVRFTlYKKwkJCXNldGVudigiVEVSTSIsIHRlcm0sIDEpOworI2Vsc2UKKwkJCXB1dGVudih0ZXJtKTsKKyNlbmRpZgorCQkJZm9ya19leGVjKHNvLCBhcmdzLCAyKTsKKwkJCXRlcm1bMF0gPSAwOworCQkJc28tPnNvX2VtdSA9IDA7CisKKwkJCS8qIEFuZCBmaW5hbGx5LCBzZW5kIHRoZSBjbGllbnQgYSAwIGNoYXJhY3RlciAqLworCQkJc29fc25kLT5zYl93cHRyWzBdID0gMDsKKwkJCXNvX3NuZC0+c2Jfd3B0cisrOworCQkJc29fc25kLT5zYl9jYysrOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJIGNhc2UgRU1VX1JTSDoKKwkJLyoKKwkJICogcnNoIGVtdWxhdGlvbgorCQkgKiBGaXJzdCB3ZSBhY2N1bXVsYXRlIGFsbCB0aGUgaW5pdGlhbCBvcHRpb24gbmVnb3RpYXRpb24sCisJCSAqIHRoZW4gcnNoX2V4ZWMoKSByc2ggYWNjb3JkaW5nIHRvIHRoZSAgb3B0aW9ucworCQkgKi8KKwkJeworCQkJaW50ICBuOworCQkJY2hhciAqcHRyOworCQkJY2hhciAqdXNlcjsKKwkJCWNoYXIgKmFyZ3M7CisJCQlzdHJ1Y3Qgc2J1ZiAqc29fc25kID0gJnNvLT5zb19zbmQ7CisJCQlzdHJ1Y3Qgc2J1ZiAqc29fcmN2ID0gJnNvLT5zb19yY3Y7CisKKwkJCS8qIEZpcnN0IGNoZWNrIGlmIHRoZXkgaGF2ZSBhIHByaXZlbGFkZ2VkIHBvcnQsIG9yIHRvbyBtdWNoIGRhdGEgaGFzIGFycml2ZWQgKi8KKwkJCWlmIChudG9ocyhzby0+c29fbHBvcnQpID4gMTAyMyB8fCBudG9ocyhzby0+c29fbHBvcnQpIDwgNTEyIHx8CisJCQkgICAgKG0tPm1fbGVuICsgc29fcmN2LT5zYl93cHRyKSA+IChzb19yY3YtPnNiX2RhdGEgKyBzb19yY3YtPnNiX2RhdGFsZW4pKSB7CisJCQkJbWVtY3B5KHNvX3NuZC0+c2Jfd3B0ciwgIlBlcm1pc3Npb24gZGVuaWVkXG4iLCAxOCk7CisJCQkJc29fc25kLT5zYl93cHRyICs9IDE4OworCQkJCXNvX3NuZC0+c2JfY2MgKz0gMTg7CisJCQkJdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisJCQkJbV9mcmVlKG0pOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBBcHBlbmQgdGhlIGN1cnJlbnQgZGF0YSAqLworCQkJbWVtY3B5KHNvX3Jjdi0+c2Jfd3B0ciwgbS0+bV9kYXRhLCBtLT5tX2xlbik7CisJCQlzb19yY3YtPnNiX3dwdHIgKz0gbS0+bV9sZW47CisJCQlzb19yY3YtPnNiX3JwdHIgKz0gbS0+bV9sZW47CisJCQltX2ZyZWUobSk7CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB3ZSBoYXZlIGFsbCB0aGUgaW5pdGlhbCBvcHRpb25zLAorCQkJICogYW5kIGJ1aWxkIGFyZ3VtZW50IGxpc3QgdG8gcmxvZ2luIHdoaWxlIHdlJ3JlIGhlcmUKKwkJCSAqLworCQkJbiA9IDA7CisJCQlwdHIgPSBzb19yY3YtPnNiX2RhdGE7CisJCQl1c2VyPSIiOworCQkJYXJncz0iIjsKKwkJCWlmIChzby0+ZXh0cmE9PU5VTEwpIHsKKwkJCQlzdHJ1Y3Qgc29ja2V0ICpuczsKKwkJCQlzdHJ1Y3QgdGNwY2IqIHRwOworCQkJCWludCBwb3J0PWF0b2kocHRyKTsKKwkJCQlpZiAocG9ydCA8PSAwKSByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpZiAocG9ydCA+IDEwMjMgfHwgcG9ydCA8IDUxMikgeworICAgICAgICAgICAgICAgICAgbWVtY3B5KHNvX3NuZC0+c2Jfd3B0ciwgIlBlcm1pc3Npb24gZGVuaWVkXG4iLCAxOCk7CisgICAgICAgICAgICAgICAgICBzb19zbmQtPnNiX3dwdHIgKz0gMTg7CisgICAgICAgICAgICAgICAgICBzb19zbmQtPnNiX2NjICs9IDE4OworICAgICAgICAgICAgICAgICAgdGNwX3NvY2tjbG9zZWQoc290b3RjcGNiKHNvKSk7CisgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisJCQkJaWYgKChucz1zb2NyZWF0ZSgpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCQkJaWYgKHRjcF9hdHRhY2gobnMpPDApIHsKKyAgICAgICAgICAgICAgICAgIGZyZWUobnMpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCQkJfQorCisJCQkJbnMtPnNvX2xhZGRyPXNvLT5zb19sYWRkcjsKKwkJCQlucy0+c29fbHBvcnQ9aHRvbnMocG9ydCk7CisKKwkJCQkodm9pZCkgdGNwX21zcyhzb3RvdGNwY2IobnMpLCAwKTsKKworCQkJCW5zLT5zb19mYWRkcj1zby0+c29fZmFkZHI7CisJCQkJbnMtPnNvX2Zwb3J0PWh0b25zKElQUE9SVF9SRVNFUlZFRC0xKTsgLyogVXNlIGEgZmFrZSBwb3J0LiAqLworCisJCQkJaWYgKG5zLT5zb19mYWRkci5zX2FkZHIgPT0gMCB8fAorCQkJCQlucy0+c29fZmFkZHIuc19hZGRyID09IGxvb3BiYWNrX2FkZHIuc19hZGRyKQorICAgICAgICAgICAgICAgICAgbnMtPnNvX2ZhZGRyID0gYWxpYXNfYWRkcjsKKworCQkJCW5zLT5zb19pcHRvcyA9IHRjcF90b3MobnMpOworCQkJCXRwID0gc290b3RjcGNiKG5zKTsKKworCQkJCXRjcF90ZW1wbGF0ZSh0cCk7CisKKwkJCQkvKiBDb21wdXRlIHdpbmRvdyBzY2FsaW5nIHRvIHJlcXVlc3QuICAqLworCQkJCS8qCXdoaWxlICh0cC0+cmVxdWVzdF9yX3NjYWxlIDwgVENQX01BWF9XSU5TSElGVCAmJgorCQkJCSAqCQkoVENQX01BWFdJTiA8PCB0cC0+cmVxdWVzdF9yX3NjYWxlKSA8IHNvLT5zb19yY3Yuc2JfaGl3YXQpCisJCQkJICoJCXRwLT5yZXF1ZXN0X3Jfc2NhbGUrKzsKKwkJCQkgKi8KKworICAgICAgICAgICAgICAgIC8qc29pc2Zjb25uZWN0aW5nKG5zKTsqLworCisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfY29ubmF0dGVtcHQrKyk7CisKKwkJCQl0cC0+dF9zdGF0ZSA9IFRDUFNfU1lOX1NFTlQ7CisJCQkJdHAtPnRfdGltZXJbVENQVF9LRUVQXSA9IFRDUFRWX0tFRVBfSU5JVDsKKwkJCQl0cC0+aXNzID0gdGNwX2lzczsKKwkJCQl0Y3BfaXNzICs9IFRDUF9JU1NJTkNSLzI7CisJCQkJdGNwX3NlbmRzZXFpbml0KHRwKTsKKwkJCQl0Y3Bfb3V0cHV0KHRwKTsKKwkJCQlzby0+ZXh0cmE9bnM7CisJCQl9CisJCQl3aGlsZSAocHRyIDwgc29fcmN2LT5zYl93cHRyKSB7CisgICAgICAgICAgICAgIGlmICgqcHRyKysgPT0gMCkgeworICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICB1c2VyPXB0cjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMykgeworICAgICAgICAgICAgICAgICAgYXJncz1wdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisJCQl9CisKKwkJCWlmIChuICE9IDQpCisgICAgICAgICAgICAgIHJldHVybiAwOworCisJCQlyc2hfZXhlYyhzbyxzby0+ZXh0cmEsIHVzZXIsIGluZXRfbnRvYShzby0+c29fZmFkZHIpLCBhcmdzKTsKKwkJCXNvLT5zb19lbXUgPSAwOworCQkJc28tPmV4dHJhPU5VTEw7CisKKwkJCS8qIEFuZCBmaW5hbGx5LCBzZW5kIHRoZSBjbGllbnQgYSAwIGNoYXJhY3RlciAqLworCQkJc29fc25kLT5zYl93cHRyWzBdID0gMDsKKwkJCXNvX3NuZC0+c2Jfd3B0cisrOworCQkJc29fc25kLT5zYl9jYysrOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJIGNhc2UgRU1VX0NUTDoKKwkJeworCQkJaW50IG51bTsKKwkJCXN0cnVjdCBzYnVmICpzb19zbmQgPSAmc28tPnNvX3NuZDsKKwkJCXN0cnVjdCBzYnVmICpzb19yY3YgPSAmc28tPnNvX3JjdjsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGlzIGJpbmFyeSBkYXRhIGhlcmUsIHdlIHNhdmUgaXQgaW4gc28tPnNvX20KKwkJCSAqLworCQkJaWYgKCFzby0+c29fbSkgeworCQkJICBpbnQgcnhsZW47CisJCQkgIGNoYXIgKnJ4ZGF0YTsKKwkJCSAgcnhkYXRhPW10b2QobSwgY2hhciAqKTsKKwkJCSAgZm9yIChyeGxlbj1tLT5tX2xlbjsgcnhsZW47IHJ4bGVuLS0pIHsKKwkJCSAgICBpZiAoKnJ4ZGF0YSsrICYgMHg4MCkgeworCQkJICAgICAgc28tPnNvX20gPSBtOworCQkJICAgICAgcmV0dXJuIDA7CisJCQkgICAgfQorCQkJICB9CisJCQl9IC8qIGlmKHNvLT5zb19tPT1OVUxMKSAqLworCisJCQkvKgorCQkJICogQXBwZW5kIHRoZSBsaW5lCisJCQkgKi8KKwkJCXNiYXBwZW5kc2Ioc29fcmN2LCBtKTsKKworCQkJLyogVG8gYXZvaWQgZ29pbmcgb3ZlciB0aGUgZWRnZSBvZiB0aGUgYnVmZmVyLCB3ZSByZXNldCBpdCAqLworCQkJaWYgKHNvX3NuZC0+c2JfY2MgPT0gMCkKKwkJCSAgIHNvX3NuZC0+c2Jfd3B0ciA9IHNvX3NuZC0+c2JfcnB0ciA9IHNvX3NuZC0+c2JfZGF0YTsKKworCQkJLyoKKwkJCSAqIEEgYml0IG9mIGEgaGFjazoKKwkJCSAqIElmIHRoZSBmaXJzdCBwYWNrZXQgd2UgZ2V0IGhlcmUgaXMgMSBieXRlIGxvbmcsIHRoZW4gaXQKKwkJCSAqIHdhcyBkb25lIGluIHRlbG5ldCBjaGFyYWN0ZXIgbW9kZSwgdGhlcmVmb3JlIHdlIG11c3QgZWNobworCQkJICogdGhlIGNoYXJhY3RlcnMgYXMgdGhleSBjb21lLiAgT3RoZXJ3aXNlLCB3ZSBlY2hvIG5vdGhpbmcsCisJCQkgKiBiZWNhdXNlIGluIGxpbmVtb2RlLCB0aGUgbGluZSBpcyBhbHJlYWR5IGVjaG9lZAorCQkJICogWFhYIHR3byBvciBtb3JlIGNvbnRyb2wgY29ubmVjdGlvbnMgd29uJ3Qgd29yaworCQkJICovCisJCQlpZiAoZG9fZWNobyA9PSAtMSkgeworCQkJCWlmIChtLT5tX2xlbiA9PSAxKSBkb19lY2hvID0gMTsKKwkJCQllbHNlIGRvX2VjaG8gPSAwOworCQkJfQorCQkJaWYgKGRvX2VjaG8pIHsKKwkJCSAgc2JhcHBlbmRzYihzb19zbmQsIG0pOworCQkJICBtX2ZyZWUobSk7CisJCQkgIHRjcF9vdXRwdXQoc290b3RjcGNiKHNvKSk7IC8qIFhYWCAqLworCQkJfSBlbHNlCisJCQkgIG1fZnJlZShtKTsKKworCQkJbnVtID0gMDsKKwkJCXdoaWxlIChudW0gPCBzby0+c29fcmN2LnNiX2NjKSB7CisJCQkJaWYgKCooc28tPnNvX3Jjdi5zYl9ycHRyICsgbnVtKSA9PSAnXG4nIHx8CisJCQkJICAgICooc28tPnNvX3Jjdi5zYl9ycHRyICsgbnVtKSA9PSAnXHInKSB7CisJCQkJCWludCBuOworCisJCQkJCSooc29fcmN2LT5zYl9ycHRyICsgbnVtKSA9IDA7CisJCQkJCWlmIChjdGxfcGFzc3dvcmQgJiYgIWN0bF9wYXNzd29yZF9vaykgeworCQkJCQkJLyogTmVlZCBhIHBhc3N3b3JkICovCisJCQkJCQlpZiAoc3NjYW5mKHNvX3Jjdi0+c2JfcnB0ciwgInBhc3MgJTI1NnMiLCBidWZmKSA9PSAxKSB7CisJCQkJCQkJaWYgKHN0cmNtcChidWZmLCBjdGxfcGFzc3dvcmQpID09IDApIHsKKwkJCQkJCQkJY3RsX3Bhc3N3b3JkX29rID0gMTsKKwkJCQkJCQkJbiA9IHNwcmludGYoc29fc25kLT5zYl93cHRyLAorCQkJCQkJCQkJICAgICJQYXNzd29yZCBPSy5cclxuIik7CisJCQkJCQkJCWdvdG8gZG9fcHJvbXB0OworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCW4gPSBzcHJpbnRmKHNvX3NuZC0+c2Jfd3B0ciwKKwkJCQkJICJFcnJvcjogUGFzc3dvcmQgcmVxdWlyZWQsIGxvZyBvbiB3aXRoIFwicGFzcyBQQVNTV09SRFwiXHJcbiIpOworCQkJCQkJZ290byBkb19wcm9tcHQ7CisJCQkJCX0KKwkJCQkJY2ZnX3F1aXR0aW5nID0gMDsKKwkJCQkJbiA9IGRvX2NvbmZpZyhzb19yY3YtPnNiX3JwdHIsIHNvLCBQUk5fU1BSSU5URik7CisJCQkJCWlmICghY2ZnX3F1aXR0aW5nKSB7CisJCQkJCQkvKiBSZWdpc3RlciB0aGUgcHJpbnRlZCBkYXRhICovCitkb19wcm9tcHQ6CisJCQkJCQlzb19zbmQtPnNiX2NjICs9IG47CisJCQkJCQlzb19zbmQtPnNiX3dwdHIgKz0gbjsKKwkJCQkJCS8qIEFkZCBwcm9tcHQgKi8KKwkJCQkJCW4gPSBzcHJpbnRmKHNvX3NuZC0+c2Jfd3B0ciwgIlNsaXJwPiAiKTsKKwkJCQkJCXNvX3NuZC0+c2JfY2MgKz0gbjsKKwkJCQkJCXNvX3NuZC0+c2Jfd3B0ciArPSBuOworCQkJCQl9CisJCQkJCS8qIERyb3Agc29fcmN2IGRhdGEgKi8KKwkJCQkJc29fcmN2LT5zYl9jYyA9IDA7CisJCQkJCXNvX3Jjdi0+c2Jfd3B0ciA9IHNvX3Jjdi0+c2JfcnB0ciA9IHNvX3Jjdi0+c2JfZGF0YTsKKwkJCQkJdGNwX291dHB1dChzb3RvdGNwY2Ioc28pKTsgLyogU2VuZCB0aGUgcmVwbHkgKi8KKwkJCQl9CisJCQkJbnVtKys7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisgICAgICAgIGNhc2UgRU1VX0ZUUDogLyogZnRwICovCisgICAgICAgICAgICAgICAgKihtLT5tX2RhdGErbS0+bV9sZW4pID0gMDsgLyogTlVMIHRlcm1pbmF0ZSBmb3Igc3Ryc3RyICovCisJCWlmICgoYnB0ciA9IChjaGFyICopc3Ryc3RyKG0tPm1fZGF0YSwgIk9SVCIpKSAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogTmVlZCB0byBlbXVsYXRlIHRoZSBQT1JUIGNvbW1hbmQKKwkJCSAqLworCQkJeCA9IHNzY2FuZihicHRyLCAiT1JUICV1LCV1LCV1LCV1LCV1LCV1XHJcbiUyNTZbXlwxNzddIiwKKwkJCQkgICAmbjEsICZuMiwgJm4zLCAmbjQsICZuNSwgJm42LCBidWZmKTsKKwkJCWlmICh4IDwgNikKKwkJCSAgIHJldHVybiAxOworCisJCQlsYWRkciA9IGh0b25sKChuMSA8PCAyNCkgfCAobjIgPDwgMTYpIHwgKG4zIDw8IDgpIHwgKG40KSk7CisJCQlscG9ydCA9IGh0b25zKChuNSA8PCA4KSB8IChuNikpOworCisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgbGFkZHIsIGxwb3J0LCBTU19GQUNDRVBUT05DRSkpID09IE5VTEwpCisJCQkgICByZXR1cm4gMTsKKworCQkJbjYgPSBudG9ocyhzby0+c29fZnBvcnQpOworCisJCQluNSA9IChuNiA+PiA4KSAmIDB4ZmY7CisJCQluNiAmPSAweGZmOworCisJCQlsYWRkciA9IG50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpOworCisJCQluMSA9ICgobGFkZHIgPj4gMjQpICYgMHhmZik7CisJCQluMiA9ICgobGFkZHIgPj4gMTYpICYgMHhmZik7CisJCQluMyA9ICgobGFkZHIgPj4gOCkgICYgMHhmZik7CisJCQluNCA9ICAobGFkZHIgJiAweGZmKTsKKworCQkJbS0+bV9sZW4gPSBicHRyIC0gbS0+bV9kYXRhOyAvKiBBZGp1c3QgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplIC0gbS0+bV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1JUICVkLCVkLCVkLCVkLCVkLCVkXHJcbiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4xLCBuMiwgbjMsIG40LCBuNSwgbjYsIHg9PTc/YnVmZjoiIik7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmICgoYnB0ciA9IChjaGFyICopc3Ryc3RyKG0tPm1fZGF0YSwgIjI3IEVudGVyaW5nIikpICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGVtdWxhdGUgdGhlIFBBU1YgcmVzcG9uc2UKKwkJCSAqLworCQkJeCA9IHNzY2FuZihicHRyLCAiMjcgRW50ZXJpbmcgUGFzc2l2ZSBNb2RlICgldSwldSwldSwldSwldSwldSlcclxuJTI1NlteXDE3N10iLAorCQkJCSAgICZuMSwgJm4yLCAmbjMsICZuNCwgJm41LCAmbjYsIGJ1ZmYpOworCQkJaWYgKHggPCA2KQorCQkJICAgcmV0dXJuIDE7CisKKwkJCWxhZGRyID0gaHRvbmwoKG4xIDw8IDI0KSB8IChuMiA8PCAxNikgfCAobjMgPDwgOCkgfCAobjQpKTsKKwkJCWxwb3J0ID0gaHRvbnMoKG41IDw8IDgpIHwgKG42KSk7CisKKwkJCWlmICgoc28gPSBzb2xpc3RlbigwLCBsYWRkciwgbHBvcnQsIFNTX0ZBQ0NFUFRPTkNFKSkgPT0gTlVMTCkKKwkJCSAgIHJldHVybiAxOworCisJCQluNiA9IG50b2hzKHNvLT5zb19mcG9ydCk7CisKKwkJCW41ID0gKG42ID4+IDgpICYgMHhmZjsKKwkJCW42ICY9IDB4ZmY7CisKKwkJCWxhZGRyID0gbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkcik7CisKKwkJCW4xID0gKChsYWRkciA+PiAyNCkgJiAweGZmKTsKKwkJCW4yID0gKChsYWRkciA+PiAxNikgJiAweGZmKTsKKwkJCW4zID0gKChsYWRkciA+PiA4KSAgJiAweGZmKTsKKwkJCW40ID0gIChsYWRkciAmIDB4ZmYpOworCisJCQltLT5tX2xlbiA9IGJwdHIgLSBtLT5tX2RhdGE7IC8qIEFkanVzdCBsZW5ndGggKi8KKwkJCW0tPm1fbGVuICs9IHNucHJpbnRmKGJwdHIsIG0tPm1faGRyLm1oX3NpemUgLSBtLT5tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNyBFbnRlcmluZyBQYXNzaXZlIE1vZGUgKCVkLCVkLCVkLCVkLCVkLCVkKVxyXG4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuMSwgbjIsIG4zLCBuNCwgbjUsIG42LCB4PT03P2J1ZmY6IiIpOworCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXJldHVybiAxOworCisJIGNhc2UgRU1VX0tTSDoKKwkJLyoKKwkJICogVGhlIGtzaGVsbCAoS2VyYmVyb3MgcnNoKSBhbmQgc2hlbGwgc2VydmljZXMgYm90aCBwYXNzCisJCSAqIGEgbG9jYWwgcG9ydCBwb3J0IG51bWJlciB0byBjYXJyeSBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIKKwkJICogYW5kIHN0ZGVyciB0byB0aGUgY2xpZW50LiAgSXQgaXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcKKwkJICogb2YgdGhlIGNvbm5lY3Rpb24gYXMgYSBOVUwtdGVybWluYXRlZCBkZWNpbWFsIEFTQ0lJIHN0cmluZy4KKwkJICovCisJCXNvLT5zb19lbXUgPSAwOworCQlmb3IgKGxwb3J0ID0gMCwgaSA9IDA7IGkgPCBtLT5tX2xlbi0xOyArK2kpIHsKKwkJCWlmIChtLT5tX2RhdGFbaV0gPCAnMCcgfHwgbS0+bV9kYXRhW2ldID4gJzknKQorCQkJCXJldHVybiAxOyAgICAgICAvKiBpbnZhbGlkIG51bWJlciAqLworCQkJbHBvcnQgKj0gMTA7CisJCQlscG9ydCArPSBtLT5tX2RhdGFbaV0gLSAnMCc7CisJCX0KKwkJaWYgKG0tPm1fZGF0YVttLT5tX2xlbi0xXSA9PSAnXDAnICYmIGxwb3J0ICE9IDAgJiYKKwkJICAgIChzbyA9IHNvbGlzdGVuKDAsIHNvLT5zb19sYWRkci5zX2FkZHIsIGh0b25zKGxwb3J0KSwgU1NfRkFDQ0VQVE9OQ0UpKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiA9IHNucHJpbnRmKG0tPm1fZGF0YSwgbS0+bV9oZHIubWhfc2l6ZSwgIiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhzby0+c29fZnBvcnQpKSArIDE7CisJCXJldHVybiAxOworCisJIGNhc2UgRU1VX0lSQzoKKwkJLyoKKwkJICogTmVlZCB0byBlbXVsYXRlIERDQyBDSEFULCBEQ0MgU0VORCBhbmQgRENDIE1PVkUKKwkJICovCisJCSoobS0+bV9kYXRhK20tPm1fbGVuKSA9IDA7IC8qIE5VTEwgdGVybWluYXRlIHRoZSBzdHJpbmcgZm9yIHN0cnN0ciAqLworCQlpZiAoKGJwdHIgPSAoY2hhciAqKXN0cnN0cihtLT5tX2RhdGEsICJEQ0MiKSkgPT0gTlVMTCkKKwkJCSByZXR1cm4gMTsKKworCQkvKiBUaGUgJTI1NnMgaXMgZm9yIHRoZSBicm9rZW4gbUlSQyAqLworCQlpZiAoc3NjYW5mKGJwdHIsICJEQ0MgQ0hBVCAlMjU2cyAldSAldSIsIGJ1ZmYsICZsYWRkciwgJmxwb3J0KSA9PSAzKSB7CisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgaHRvbmwobGFkZHIpLCBodG9ucyhscG9ydCksIFNTX0ZBQ0NFUFRPTkNFKSkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gMTsKKworCQkJbS0+bV9sZW4gPSBicHRyIC0gbS0+bV9kYXRhOyAvKiBBZGp1c3QgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRDQyBDSEFUIGNoYXQgJWx1ICV1JWNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyludG9obChzby0+c29fZmFkZHIuc19hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNvLT5zb19mcG9ydCksIDEpOworCQl9IGVsc2UgaWYgKHNzY2FuZihicHRyLCAiRENDIFNFTkQgJTI1NnMgJXUgJXUgJXUiLCBidWZmLCAmbGFkZHIsICZscG9ydCwgJm4xKSA9PSA0KSB7CisJCQlpZiAoKHNvID0gc29saXN0ZW4oMCwgaHRvbmwobGFkZHIpLCBodG9ucyhscG9ydCksIFNTX0ZBQ0NFUFRPTkNFKSkgPT0gTlVMTCkKKwkJCQlyZXR1cm4gMTsKKworCQkJbS0+bV9sZW4gPSBicHRyIC0gbS0+bV9kYXRhOyAvKiBBZGp1c3QgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgICAgICBtLT5tX2xlbiArPSBzbnByaW50ZihicHRyLCBtLT5tX2hkci5taF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRDQyBTRU5EICVzICVsdSAldSAldSVjXG4iLCBidWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbnRvaGwoc28tPnNvX2ZhZGRyLnNfYWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhzby0+c29fZnBvcnQpLCBuMSwgMSk7CisJCX0gZWxzZSBpZiAoc3NjYW5mKGJwdHIsICJEQ0MgTU9WRSAlMjU2cyAldSAldSAldSIsIGJ1ZmYsICZsYWRkciwgJmxwb3J0LCAmbjEpID09IDQpIHsKKwkJCWlmICgoc28gPSBzb2xpc3RlbigwLCBodG9ubChsYWRkciksIGh0b25zKGxwb3J0KSwgU1NfRkFDQ0VQVE9OQ0UpKSA9PSBOVUxMKQorCQkJCXJldHVybiAxOworCisJCQltLT5tX2xlbiA9IGJwdHIgLSBtLT5tX2RhdGE7IC8qIEFkanVzdCBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbGVuICs9IHNucHJpbnRmKGJwdHIsIG0tPm1faGRyLm1oX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRENDIE1PVkUgJXMgJWx1ICV1ICV1JWNcbiIsIGJ1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyludG9obChzby0+c29fZmFkZHIuc19hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKHNvLT5zb19mcG9ydCksIG4xLCAxKTsKKwkJfQorCQlyZXR1cm4gMTsKKworCSBjYXNlIEVNVV9SRUFMQVVESU86CisgICAgICAgICAgICAgICAgLyoKKwkJICogUmVhbEF1ZGlvIGVtdWxhdGlvbiAtIEpQLiBXZSBtdXN0IHRyeSB0byBwYXJzZSB0aGUgaW5jb21pbmcKKwkJICogZGF0YSBhbmQgdHJ5IHRvIGZpbmQgdGhlIHR3byBjaGFyYWN0ZXJzIHRoYXQgY29udGFpbiB0aGUKKwkJICogcG9ydCBudW1iZXIuIFRoZW4gd2UgcmVkaXJlY3QgYW4gdWRwIHBvcnQgYW5kIHJlcGxhY2UgdGhlCisJCSAqIG51bWJlciB3aXRoIHRoZSByZWFsIHBvcnQgd2UgZ290LgorCQkgKgorCQkgKiBUaGUgMS4wIGJldGEgdmVyc2lvbnMgb2YgdGhlIHBsYXllciBhcmUgbm90IHN1cHBvcnRlZAorCQkgKiBhbnkgbW9yZS4KKwkJICoKKwkJICogQSB0eXBpY2FsIHBhY2tldCBmb3IgcGxheWVyIHZlcnNpb24gMS4wIChyZWxlYXNlIHZlcnNpb24pOgorCQkgKgorCQkgKiAwMDAwOjUwIDRFIDQxIDAwIDA1CisJCSAqIDAwMDA6MDAgMDEgMDAgMDIgMUIgRDcgMDAgMDAgNjcgRTYgNkMgREMgNjMgMDAgMTIgNTAgLi4uLi7XLi5n5mzcYy4uUAorCQkgKiAwMDEwOjRFIDQzIDRDIDQ5IDQ1IDRFIDU0IDIwIDMxIDMwIDMxIDIwIDQxIDRDIDUwIDQ4IE5DTElFTlQgMTAxIEFMUEgKKwkJICogMDAyMDo0MSA2QyAwMCAwMCA1MiAwMCAxNyA3MiA2MSA2NiA2OSA2QyA2NSA3MyAyRiA3NiBBbC4uUi4ucmFmaWxlcy92CisJCSAqIDAwMzA6NkYgNjEgMkYgNjUgNkUgNjcgNkMgNjkgNzMgNjggNUYgMkUgNzIgNjEgNzkgNDIgb2EvZW5nbGlzaF8ucmF5QgorCQkgKgorCQkgKiBOb3cgdGhlIHBvcnQgbnVtYmVyIDB4MUJENyBpcyBmb3VuZCBhdCBvZmZzZXQgMHgwNCBvZiB0aGUKKwkJICogTm93IHRoZSBwb3J0IG51bWJlciAweDFCRDcgaXMgZm91bmQgYXQgb2Zmc2V0IDB4MDQgb2YgdGhlCisJCSAqIHNlY29uZCBwYWNrZXQuIFRoaXMgdGltZSB3ZSByZWNlaXZlZCBmaXZlIGJ5dGVzIGZpcnN0IGFuZAorCQkgKiB0aGVuIHRoZSByZXN0LiBZb3UgbmV2ZXIga25vdyBob3cgbWFueSBieXRlcyB5b3UgZ2V0LgorCQkgKgorCQkgKiBBIHR5cGljYWwgcGFja2V0IGZvciBwbGF5ZXIgdmVyc2lvbiAyLjAgKGJldGEpOgorCQkgKgorCQkgKiAwMDAwOjUwIDRFIDQxIDAwIDA2IDAwIDAyIDAwIDAwIDAwIDAxIDAwIDAyIDFCIEMxIDAwIFBOQS4uLi4uLi4uLi4uwS4KKwkJICogMDAxMDowMCA2NyA3NSA3OCBGNSA2MyAwMCAwQSA1NyA2OSA2RSAzMiAyRSAzMCAyRSAzMCAuZ3V49WMuLldpbjIuMC4wCisJCSAqIDAwMjA6MkUgMzUgNkMgMDAgMDAgNTIgMDAgMUMgNzIgNjEgNjYgNjkgNkMgNjUgNzMgMkYgLjVsLi5SLi5yYWZpbGVzLworCQkgKiAwMDMwOjc3IDY1IDYyIDczIDY5IDc0IDY1IDJGIDMyIDMwIDcyIDY1IDZDIDY1IDYxIDczIHdlYnNpdGUvMjByZWxlYXMKKwkJICogMDA0MDo2NSAyRSA3MiA2MSA3OSA1MyAwMCAwMCAwNiAzNiA0MiAgICAgICAgICAgICAgICBlLnJheVMuLi42QgorCQkgKgorCQkgKiBQb3J0IG51bWJlciAweDFCQzEgaXMgZm91bmQgYXQgb2Zmc2V0IDB4MGQuCisJCSAqCisJCSAqIFRoaXMgaXMganVzdCBhIGhvcnJpYmxlIHN3aXRjaCBzdGF0ZW1lbnQuIFZhcmlhYmxlIHJhIHRlbGxzCisJCSAqIHVzIHdoZXJlIHdlJ3JlIGdvaW5nLgorCQkgKi8KKworCQlicHRyID0gbS0+bV9kYXRhOworCQl3aGlsZSAoYnB0ciA8IG0tPm1fZGF0YSArIG0tPm1fbGVuKSB7CisJCQl1X3Nob3J0IHA7CisJCQlzdGF0aWMgaW50IHJhID0gMDsKKwkJCWNoYXIgcmFfdGJsWzRdOworCisJCQlyYV90YmxbMF0gPSAweDUwOworCQkJcmFfdGJsWzFdID0gMHg0ZTsKKwkJCXJhX3RibFsyXSA9IDB4NDE7CisJCQlyYV90YmxbM10gPSAwOworCisJCQlzd2l0Y2ggKHJhKSB7CisJCQkgY2FzZSAwOgorCQkJIGNhc2UgMjoKKwkJCSBjYXNlIDM6CisJCQkJaWYgKCpicHRyKysgIT0gcmFfdGJsW3JhXSkgeworCQkJCQlyYSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJIGNhc2UgMToKKwkJCQkvKgorCQkJCSAqIFdlIG1heSBnZXQgMHg1MCBzZXZlcmFsIHRpbWVzLCBpZ25vcmUgdGhlbQorCQkJCSAqLworCQkJCWlmICgqYnB0ciA9PSAweDUwKSB7CisJCQkJCXJhID0gMTsKKwkJCQkJYnB0cisrOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKCpicHRyKysgIT0gcmFfdGJsW3JhXSkgeworCQkJCQlyYSA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJIGNhc2UgNDoKKwkJCQkvKgorCQkJCSAqIHNraXAgdmVyc2lvbiBudW1iZXIKKwkJCQkgKi8KKwkJCQlicHRyKys7CisJCQkJYnJlYWs7CisKKwkJCSBjYXNlIDU6CisJCQkJLyoKKwkJCQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZlcnNpb25zIDEuMCBhbmQKKwkJCQkgKiAyLjAgaXMgaGVyZS4gRm9yIGZ1dHVyZSB2ZXJzaW9ucyBvZgorCQkJCSAqIHRoZSBwbGF5ZXIgdGhpcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KKwkJCQkgKi8KKwkJCQlpZiAoKihicHRyICsgMSkgPT0gMHgwMikKKwkJCQkgICBicHRyICs9IDg7CisJCQkJZWxzZQorCQkJCSAgIGJwdHIgKz0gNDsKKwkJCQlicmVhazsKKworCQkJIGNhc2UgNjoKKwkJCQkvKiBUaGlzIGlzIHRoZSBmaWVsZCBjb250YWluaW5nIHRoZSBwb3J0CisJCQkJICogbnVtYmVyIHRoYXQgUkEtcGxheWVyIGlzIGxpc3RlbmluZyB0by4KKwkJCQkgKi8KKwkJCQlscG9ydCA9ICgoKHVfY2hhciopYnB0cilbMF0gPDwgOCkKKwkJCQkrICgodV9jaGFyICopYnB0cilbMV07CisJCQkJaWYgKGxwb3J0IDwgNjk3MCkKKwkJCQkgICBscG9ydCArPSAyNTY7ICAgLyogZG9uJ3Qga25vdyB3aHkgKi8KKwkJCQlpZiAobHBvcnQgPCA2OTcwIHx8IGxwb3J0ID4gNzE3MCkKKwkJCQkgICByZXR1cm4gMTsgICAgICAgLyogZmFpbGVkICovCisKKwkJCQkvKiB0cnkgdG8gZ2V0IHVkcCBwb3J0IGJldHdlZW4gNjk3MCAtIDcxNzAgKi8KKwkJCQlmb3IgKHAgPSA2OTcwOyBwIDwgNzA3MTsgcCsrKSB7CisJCQkJCWlmICh1ZHBfbGlzdGVuKCBodG9ucyhwKSwKKwkJCQkJCSAgICAgICBzby0+c29fbGFkZHIuc19hZGRyLAorCQkJCQkJICAgICAgIGh0b25zKGxwb3J0KSwKKwkJCQkJCSAgICAgICBTU19GQUNDRVBUT05DRSkpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwID09IDcwNzEpCisJCQkJICAgcCA9IDA7CisJCQkJKih1X2NoYXIgKilicHRyKysgPSAocCA+PiA4KSAmIDB4ZmY7CisJCQkJKih1X2NoYXIgKilicHRyKysgPSBwICYgMHhmZjsKKwkJCQlyYSA9IDA7CisJCQkJcmV0dXJuIDE7ICAgLyogcG9ydCByZWRpcmVjdGVkLCB3ZSdyZSBkb25lICovCisJCQkJYnJlYWs7CisKKwkJCSBkZWZhdWx0OgorCQkJCXJhID0gMDsKKwkJCX0KKwkJCXJhKys7CisJCX0KKwkJcmV0dXJuIDE7CisKKwkgZGVmYXVsdDoKKwkJLyogT29vcHMsIG5vdCBlbXVsYXRlZCwgd29uJ3QgY2FsbCB0Y3BfZW11IGFnYWluICovCisJCXNvLT5zb19lbXUgPSAwOworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qCisgKiBEbyBtaXNjLiBjb25maWcgb2YgU0xpUlAgd2hpbGUgaXRzIHJ1bm5pbmcuCisgKiBSZXR1cm4gMCBpZiB0aGlzIGNvbm5lY3Rpb25zIGlzIHRvIGJlIGNsb3NlZCwgMSBvdGhlcndpc2UsCisgKiByZXR1cm4gMiBpZiB0aGlzIGlzIGEgY29tbWFuZC1saW5lIGNvbm5lY3Rpb24KKyAqLworaW50Cit0Y3BfY3RsKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCXN0cnVjdCBzYnVmICpzYiA9ICZzby0+c29fc25kOworCWludCBjb21tYW5kOworIAlzdHJ1Y3QgZXhfbGlzdCAqZXhfcHRyOworCWludCBkb19wdHk7CisgICAgICAgIC8vCXN0cnVjdCBzb2NrZXQgKnRtcHNvOworCisJREVCVUdfQ0FMTCgidGNwX2N0bCIpOworCURFQlVHX0FSRygic28gPSAlbHgiLCAobG9uZyApc28pOworCisjaWYgMAorCS8qCisJICogQ2hlY2sgaWYgdGhleSdyZSBhdXRob3Jpc2VkCisJICovCisJaWYgKGN0bF9hZGRyLnNfYWRkciAmJiAoY3RsX2FkZHIuc19hZGRyID09IC0xIHx8IChzby0+c29fbGFkZHIuc19hZGRyICE9IGN0bF9hZGRyLnNfYWRkcikpKSB7CisJCXNiLT5zYl9jYyA9IHNwcmludGYoc2ItPnNiX3dwdHIsIkVycm9yOiBQZXJtaXNzaW9uIGRlbmllZC5cclxuIik7CisJCXNiLT5zYl93cHRyICs9IHNiLT5zYl9jYzsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisJY29tbWFuZCA9IChudG9obChzby0+c29fZmFkZHIuc19hZGRyKSAmIDB4ZmYpOworCisJc3dpdGNoKGNvbW1hbmQpIHsKKwlkZWZhdWx0OiAvKiBDaGVjayBmb3IgZXhlYydzICovCisKKwkJLyoKKwkJICogQ2hlY2sgaWYgaXQncyBwdHlfZXhlYworCQkgKi8KKwkJZm9yIChleF9wdHIgPSBleGVjX2xpc3Q7IGV4X3B0cjsgZXhfcHRyID0gZXhfcHRyLT5leF9uZXh0KSB7CisJCQlpZiAoZXhfcHRyLT5leF9mcG9ydCA9PSBzby0+c29fZnBvcnQgJiYKKwkJCSAgICBjb21tYW5kID09IGV4X3B0ci0+ZXhfYWRkcikgeworCQkJCWlmIChleF9wdHItPmV4X3B0eSA9PSAzKSB7CisJCQkJCXNvLT5zID0gLTE7CisJCQkJCXNvLT5leHRyYSA9ICh2b2lkICopZXhfcHRyLT5leF9leGVjOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQkJZG9fcHR5ID0gZXhfcHRyLT5leF9wdHk7CisJCQkJZ290byBkb19leGVjOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogTm90aGluZyBib3VuZC4uCisJCSAqLworCQkvKiB0Y3BfZmNvbm5lY3Qoc28pOyAqLworCisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBDVExfQUxJQVM6CisgICAgICAgICAgc2ItPnNiX2NjID0gc25wcmludGYoc2ItPnNiX3dwdHIsIHNiLT5zYl9kYXRhbGVuIC0gKHNiLT5zYl93cHRyIC0gc2ItPnNiX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvcjogTm8gYXBwbGljYXRpb24gY29uZmlndXJlZC5cclxuIik7CisJICBzYi0+c2Jfd3B0ciArPSBzYi0+c2JfY2M7CisJICByZXR1cm4oMCk7CisKKwlkb19leGVjOgorCQlERUJVR19NSVNDKChkZmQsICIgZXhlY3V0aW5nICVzIFxuIixleF9wdHItPmV4X2V4ZWMpKTsKKwkJcmV0dXJuKGZvcmtfZXhlYyhzbywgZXhfcHRyLT5leF9leGVjLCBkb19wdHkpKTsKKworI2lmIDAKKwljYXNlIENUTF9DTUQ6CisJICAgZm9yICh0bXBzbyA9IHRjYi5zb19uZXh0OyB0bXBzbyAhPSAmdGNiOyB0bXBzbyA9IHRtcHNvLT5zb19uZXh0KSB7CisJICAgICBpZiAodG1wc28tPnNvX2VtdSA9PSBFTVVfQ1RMICYmCisJCSAhKHRtcHNvLT5zb190Y3BjYj8KKwkJICAgKHRtcHNvLT5zb190Y3BjYi0+dF9zdGF0ZSAmIChUQ1BTX1RJTUVfV0FJVHxUQ1BTX0xBU1RfQUNLKSkKKwkJICAgOjApKSB7CisJICAgICAgIC8qIE9vb3BzLCBjb250cm9sIGNvbm5lY3Rpb24gYWxyZWFkeSBhY3RpdmUgKi8KKwkgICAgICAgc2ItPnNiX2NjID0gc3ByaW50ZihzYi0+c2Jfd3B0ciwiU29ycnksIGFscmVhZHkgY29ubmVjdGVkLlxyXG4iKTsKKwkgICAgICAgc2ItPnNiX3dwdHIgKz0gc2ItPnNiX2NjOworCSAgICAgICByZXR1cm4gMDsKKwkgICAgIH0KKwkgICB9CisJICAgc28tPnNvX2VtdSA9IEVNVV9DVEw7CisJICAgY3RsX3Bhc3N3b3JkX29rID0gMDsKKwkgICBzYi0+c2JfY2MgPSBzcHJpbnRmKHNiLT5zYl93cHRyLCAiU2xpcnAgY29tbWFuZC1saW5lIHJlYWR5ICh0eXBlIFwiaGVscFwiIGZvciBoZWxwKS5cclxuU2xpcnA+ICIpOworCSAgIHNiLT5zYl93cHRyICs9IHNiLT5zYl9jYzsKKwkgICBkb19lY2hvPS0xOworCSAgIHJldHVybigyKTsKKyNlbmRpZgorCX0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwX3RpbWVyLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTVlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF90aW1lci5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXRjcF90aW1lci5jCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqIHRjcF90aW1lci5jLHYgMS4yIDE5OTQvMDgvMDIgMDc6NDk6MTAgZGF2aWRnIEV4cAorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorCisjaWZkZWYgTE9HX0VOQUJMRUQKK3N0cnVjdCAgIHRjcHN0YXQgdGNwc3RhdDsgICAgICAgIC8qIHRjcCBzdGF0aXN0aWNzICovCisjZW5kaWYKKwordV9pbnQzMl90ICAgICAgICB0Y3Bfbm93OyAgICAgICAgICAgICAgICAvKiBmb3IgUkZDIDEzMjMgdGltZXN0YW1wcyAqLworCitzdGF0aWMgc3RydWN0IHRjcGNiICp0Y3BfdGltZXJzKHJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHAsIGludCB0aW1lcik7CisKKy8qCisgKiBGYXN0IHRpbWVvdXQgcm91dGluZSBmb3IgcHJvY2Vzc2luZyBkZWxheWVkIGFja3MKKyAqLwordm9pZAordGNwX2Zhc3R0aW1vKHZvaWQpCit7CisJcmVnaXN0ZXIgc3RydWN0IHNvY2tldCAqc287CisJcmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cDsKKworCURFQlVHX0NBTEwoInRjcF9mYXN0dGltbyIpOworCisJc28gPSB0Y2Iuc29fbmV4dDsKKwlpZiAoc28pCisJZm9yICg7IHNvICE9ICZ0Y2I7IHNvID0gc28tPnNvX25leHQpCisJCWlmICgodHAgPSAoc3RydWN0IHRjcGNiICopc28tPnNvX3RjcGNiKSAmJgorCQkgICAgKHRwLT50X2ZsYWdzICYgVEZfREVMQUNLKSkgeworCQkJdHAtPnRfZmxhZ3MgJj0gflRGX0RFTEFDSzsKKwkJCXRwLT50X2ZsYWdzIHw9IFRGX0FDS05PVzsKKwkJCVNUQVQodGNwc3RhdC50Y3BzX2RlbGFjaysrKTsKKwkJCSh2b2lkKSB0Y3Bfb3V0cHV0KHRwKTsKKwkJfQorfQorCisvKgorICogVGNwIHByb3RvY29sIHRpbWVvdXQgcm91dGluZSBjYWxsZWQgZXZlcnkgNTAwIG1zLgorICogVXBkYXRlcyB0aGUgdGltZXJzIGluIGFsbCBhY3RpdmUgdGNiJ3MgYW5kCisgKiBjYXVzZXMgZmluaXRlIHN0YXRlIG1hY2hpbmUgYWN0aW9ucyBpZiB0aW1lcnMgZXhwaXJlLgorICovCit2b2lkCit0Y3Bfc2xvd3RpbW8odm9pZCkKK3sKKwlyZWdpc3RlciBzdHJ1Y3Qgc29ja2V0ICppcCwgKmlwbnh0OworCXJlZ2lzdGVyIHN0cnVjdCB0Y3BjYiAqdHA7CisJcmVnaXN0ZXIgaW50IGk7CisKKwlERUJVR19DQUxMKCJ0Y3Bfc2xvd3RpbW8iKTsKKworCS8qCisJICogU2VhcmNoIHRocm91Z2ggdGNiJ3MgYW5kIHVwZGF0ZSBhY3RpdmUgdGltZXJzLgorCSAqLworCWlwID0gdGNiLnNvX25leHQ7CisJaWYgKGlwID09IDApCisJICAgcmV0dXJuOworCWZvciAoOyBpcCAhPSAmdGNiOyBpcCA9IGlwbnh0KSB7CisJCWlwbnh0ID0gaXAtPnNvX25leHQ7CisJCXRwID0gc290b3RjcGNiKGlwKTsKKwkJaWYgKHRwID09IDApCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IFRDUFRfTlRJTUVSUzsgaSsrKSB7CisJCQlpZiAodHAtPnRfdGltZXJbaV0gJiYgLS10cC0+dF90aW1lcltpXSA9PSAwKSB7CisJCQkJdGNwX3RpbWVycyh0cCxpKTsKKwkJCQlpZiAoaXBueHQtPnNvX3ByZXYgIT0gaXApCisJCQkJCWdvdG8gdHBnb25lOworCQkJfQorCQl9CisJCXRwLT50X2lkbGUrKzsKKwkJaWYgKHRwLT50X3J0dCkKKwkJICAgdHAtPnRfcnR0Kys7Cit0cGdvbmU6CisJCTsKKwl9CisJdGNwX2lzcyArPSBUQ1BfSVNTSU5DUi9QUl9TTE9XSFo7CQkvKiBpbmNyZW1lbnQgaXNzICovCisjaWZkZWYgVENQX0NPTVBBVF80MgorCWlmICgoaW50KXRjcF9pc3MgPCAwKQorCQl0Y3BfaXNzID0gMDsJCQkJLyogWFhYICovCisjZW5kaWYKKwl0Y3Bfbm93Kys7CQkJCQkvKiBmb3IgdGltZXN0YW1wcyAqLworfQorCisvKgorICogQ2FuY2VsIGFsbCB0aW1lcnMgZm9yIFRDUCB0cC4KKyAqLwordm9pZAordGNwX2NhbmNlbHRpbWVycyhzdHJ1Y3QgdGNwY2IgKnRwKQoreworCXJlZ2lzdGVyIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRDUFRfTlRJTUVSUzsgaSsrKQorCQl0cC0+dF90aW1lcltpXSA9IDA7Cit9CisKK2NvbnN0IGludCB0Y3BfYmFja29mZltUQ1BfTUFYUlhUU0hJRlQgKyAxXSA9CisgICB7IDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQgfTsKKworLyoKKyAqIFRDUCB0aW1lciBwcm9jZXNzaW5nLgorICovCitzdGF0aWMgc3RydWN0IHRjcGNiICoKK3RjcF90aW1lcnMocmVnaXN0ZXIgc3RydWN0IHRjcGNiICp0cCwgaW50IHRpbWVyKQoreworCXJlZ2lzdGVyIGludCByZXhtdDsKKworCURFQlVHX0NBTEwoInRjcF90aW1lcnMiKTsKKworCXN3aXRjaCAodGltZXIpIHsKKworCS8qCisJICogMiBNU0wgdGltZW91dCBpbiBzaHV0ZG93biB3ZW50IG9mZi4gIElmIHdlJ3JlIGNsb3NlZCBidXQKKwkgKiBzdGlsbCB3YWl0aW5nIGZvciBwZWVyIHRvIGNsb3NlIGFuZCBjb25uZWN0aW9uIGhhcyBiZWVuIGlkbGUKKwkgKiB0b28gbG9uZywgb3IgaWYgMk1TTCB0aW1lIGlzIHVwIGZyb20gVElNRV9XQUlULCBkZWxldGUgY29ubmVjdGlvbgorCSAqIGNvbnRyb2wgYmxvY2suICBPdGhlcndpc2UsIGNoZWNrIGFnYWluIGluIGEgYml0LgorCSAqLworCWNhc2UgVENQVF8yTVNMOgorCQlpZiAodHAtPnRfc3RhdGUgIT0gVENQU19USU1FX1dBSVQgJiYKKwkJICAgIHRwLT50X2lkbGUgPD0gVENQX01BWElETEUpCisJCQl0cC0+dF90aW1lcltUQ1BUXzJNU0xdID0gVENQVFZfS0VFUElOVFZMOworCQllbHNlCisJCQl0cCA9IHRjcF9jbG9zZSh0cCk7CisJCWJyZWFrOworCisJLyoKKwkgKiBSZXRyYW5zbWlzc2lvbiB0aW1lciB3ZW50IG9mZi4gIE1lc3NhZ2UgaGFzIG5vdAorCSAqIGJlZW4gYWNrZWQgd2l0aGluIHJldHJhbnNtaXQgaW50ZXJ2YWwuICBCYWNrIG9mZgorCSAqIHRvIGEgbG9uZ2VyIHJldHJhbnNtaXQgaW50ZXJ2YWwgYW5kIHJldHJhbnNtaXQgb25lIHNlZ21lbnQuCisJICovCisJY2FzZSBUQ1BUX1JFWE1UOgorCisJCS8qCisJCSAqIFhYWFhYIElmIGEgcGFja2V0IGhhcyB0aW1lZCBvdXQsIHRoZW4gcmVtb3ZlIGFsbCB0aGUgcXVldWVkCisJCSAqIHBhY2tldHMgZm9yIHRoYXQgc2Vzc2lvbi4KKwkJICovCisKKwkJaWYgKCsrdHAtPnRfcnh0c2hpZnQgPiBUQ1BfTUFYUlhUU0hJRlQpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgaGFjayB0byBzdWl0IG91ciB0ZXJtaW5hbCBzZXJ2ZXIgaGVyZSBhdCB0aGUgdW5pIG9mIGNhbmJlcnJhCisJCQkgKiBzaW5jZSB0aGV5IGhhdmUgdHJvdWJsZSB3aXRoIHplcm9lcy4uLiBJdCB1c3VhbGx5IGxldHMgdGhlbSB0aHJvdWdoCisJCQkgKiB1bmhhcm1lZCwgYnV0IHVuZGVyIHNvbWUgY29uZGl0aW9ucywgaXQnbGwgZWF0IHRoZSB6ZXJvcy4gIElmIHdlCisJCQkgKiBrZWVwIHJldHJhbnNtaXR0aW5nIGl0LCBpdCdsbCBrZWVwIGVhdGluZyB0aGUgemVyb2VzLCBzbyB3ZSBrZWVwCisJCQkgKiByZXRyYW5zbWl0dGluZywgYW5kIGV2ZW50dWFsbHkgdGhlIGNvbm5lY3Rpb24gZGllcy4uLgorCQkJICogKHRoaXMgb25seSBoYXBwZW5zIG9uIGluY29taW5nIGRhdGEpCisJCQkgKgorCQkJICogU28sIGlmIHdlIHdlcmUgZ29ubmEgZHJvcCB0aGUgY29ubmVjdGlvbiBmcm9tIHRvbyBtYW55IHJldHJhbnNtaXRzLAorCQkJICogZG9uJ3QuLi4gaW5zdGVhZCBoYWx2ZSB0aGUgdF9tYXhzZWcsIHdoaWNoIG1pZ2h0IGJyZWFrIHVwIHRoZSBOVUxMcyBhbmQKKwkJCSAqIGxldCB0aGVtIHRocm91Z2gKKwkJCSAqCisJCQkgKiAqc2lnaCoKKwkJCSAqLworCisJCQl0cC0+dF9tYXhzZWcgPj49IDE7CisJCQlpZiAodHAtPnRfbWF4c2VnIDwgMzIpIHsKKwkJCQkvKgorCQkJCSAqIFdlIHRyaWVkIG91ciBiZXN0LCBub3cgdGhlIGNvbm5lY3Rpb24gbXVzdCBkaWUhCisJCQkJICovCisJCQkJdHAtPnRfcnh0c2hpZnQgPSBUQ1BfTUFYUlhUU0hJRlQ7CisJCQkJU1RBVCh0Y3BzdGF0LnRjcHNfdGltZW91dGRyb3ArKyk7CisJCQkJdHAgPSB0Y3BfZHJvcCh0cCwgdHAtPnRfc29mdGVycm9yKTsKKwkJCQkvKiB0cC0+dF9zb2Z0ZXJyb3IgOiBFVElNRURPVVQpOyAqLyAvKiBYWFggKi8KKwkJCQlyZXR1cm4gKHRwKTsgLyogWFhYICovCisJCQl9CisKKwkJCS8qCisJCQkgKiBTZXQgcnh0c2hpZnQgdG8gNiwgd2hpY2ggaXMgc3RpbGwgYXQgdGhlIG1heGltdW0KKwkJCSAqIGJhY2tvZmYgdGltZQorCQkJICovCisJCQl0cC0+dF9yeHRzaGlmdCA9IDY7CisJCX0KKwkJU1RBVCh0Y3BzdGF0LnRjcHNfcmV4bXR0aW1lbysrKTsKKwkJcmV4bXQgPSBUQ1BfUkVYTVRWQUwodHApICogdGNwX2JhY2tvZmZbdHAtPnRfcnh0c2hpZnRdOworCQlUQ1BUX1JBTkdFU0VUKHRwLT50X3J4dGN1ciwgcmV4bXQsCisJCSAgICAoc2hvcnQpdHAtPnRfcnR0bWluLCBUQ1BUVl9SRVhNVE1BWCk7IC8qIFhYWCAqLworCQl0cC0+dF90aW1lcltUQ1BUX1JFWE1UXSA9IHRwLT50X3J4dGN1cjsKKwkJLyoKKwkJICogSWYgbG9zaW5nLCBsZXQgdGhlIGxvd2VyIGxldmVsIGtub3cgYW5kIHRyeSBmb3IKKwkJICogYSBiZXR0ZXIgcm91dGUuICBBbHNvLCBpZiB3ZSBiYWNrZWQgb2ZmIHRoaXMgZmFyLAorCQkgKiBvdXIgc3J0dCBlc3RpbWF0ZSBpcyBwcm9iYWJseSBib2d1cy4gIENsb2JiZXIgaXQKKwkJICogc28gd2UnbGwgdGFrZSB0aGUgbmV4dCBydHQgbWVhc3VyZW1lbnQgYXMgb3VyIHNydHQ7CisJCSAqIG1vdmUgdGhlIGN1cnJlbnQgc3J0dCBpbnRvIHJ0dHZhciB0byBrZWVwIHRoZSBjdXJyZW50CisJCSAqIHJldHJhbnNtaXQgdGltZXMgdW50aWwgdGhlbi4KKwkJICovCisJCWlmICh0cC0+dF9yeHRzaGlmdCA+IFRDUF9NQVhSWFRTSElGVCAvIDQpIHsKKy8qCQkJaW5fbG9zaW5nKHRwLT50X2lucGNiKTsgKi8KKwkJCXRwLT50X3J0dHZhciArPSAodHAtPnRfc3J0dCA+PiBUQ1BfUlRUX1NISUZUKTsKKwkJCXRwLT50X3NydHQgPSAwOworCQl9CisJCXRwLT5zbmRfbnh0ID0gdHAtPnNuZF91bmE7CisJCS8qCisJCSAqIElmIHRpbWluZyBhIHNlZ21lbnQgaW4gdGhpcyB3aW5kb3csIHN0b3AgdGhlIHRpbWVyLgorCQkgKi8KKwkJdHAtPnRfcnR0ID0gMDsKKwkJLyoKKwkJICogQ2xvc2UgdGhlIGNvbmdlc3Rpb24gd2luZG93IGRvd24gdG8gb25lIHNlZ21lbnQKKwkJICogKHdlJ2xsIG9wZW4gaXQgYnkgb25lIHNlZ21lbnQgZm9yIGVhY2ggYWNrIHdlIGdldCkuCisJCSAqIFNpbmNlIHdlIHByb2JhYmx5IGhhdmUgYSB3aW5kb3cncyB3b3J0aCBvZiB1bmFja2VkCisJCSAqIGRhdGEgYWNjdW11bGF0ZWQsIHRoaXMgInNsb3cgc3RhcnQiIGtlZXBzIHVzIGZyb20KKwkJICogZHVtcGluZyBhbGwgdGhhdCBkYXRhIGFzIGJhY2stdG8tYmFjayBwYWNrZXRzICh3aGljaAorCQkgKiBtaWdodCBvdmVyd2hlbG0gYW4gaW50ZXJtZWRpYXRlIGdhdGV3YXkpLgorCQkgKgorCQkgKiBUaGVyZSBhcmUgdHdvIHBoYXNlcyB0byB0aGUgb3BlbmluZzogSW5pdGlhbGx5IHdlCisJCSAqIG9wZW4gYnkgb25lIG1zcyBvbiBlYWNoIGFjay4gIFRoaXMgbWFrZXMgdGhlIHdpbmRvdworCQkgKiBzaXplIGluY3JlYXNlIGV4cG9uZW50aWFsbHkgd2l0aCB0aW1lLiAgSWYgdGhlCisJCSAqIHdpbmRvdyBpcyBsYXJnZXIgdGhhbiB0aGUgcGF0aCBjYW4gaGFuZGxlLCB0aGlzCisJCSAqIGV4cG9uZW50aWFsIGdyb3d0aCByZXN1bHRzIGluIGRyb3BwZWQgcGFja2V0KHMpCisJCSAqIGFsbW9zdCBpbW1lZGlhdGVseS4gIFRvIGdldCBtb3JlIHRpbWUgYmV0d2VlbgorCQkgKiBkcm9wcyBidXQgc3RpbGwgInB1c2giIHRoZSBuZXR3b3JrIHRvIHRha2UgYWR2YW50YWdlCisJCSAqIG9mIGltcHJvdmluZyBjb25kaXRpb25zLCB3ZSBzd2l0Y2ggZnJvbSBleHBvbmVudGlhbAorCQkgKiB0byBsaW5lYXIgd2luZG93IG9wZW5pbmcgYXQgc29tZSB0aHJlc2hvbGQgc2l6ZS4KKwkJICogRm9yIGEgdGhyZXNob2xkLCB3ZSB1c2UgaGFsZiB0aGUgY3VycmVudCB3aW5kb3cKKwkJICogc2l6ZSwgdHJ1bmNhdGVkIHRvIGEgbXVsdGlwbGUgb2YgdGhlIG1zcy4KKwkJICoKKwkJICogKHRoZSBtaW5pbXVtIGN3bmQgdGhhdCB3aWxsIGdpdmUgdXMgZXhwb25lbnRpYWwKKwkJICogZ3Jvd3RoIGlzIDIgbXNzLiAgV2UgZG9uJ3QgYWxsb3cgdGhlIHRocmVzaG9sZAorCQkgKiB0byBnbyBiZWxvdyB0aGlzLikKKwkJICovCisJCXsKKwkJdV9pbnQgd2luID0gbWluKHRwLT5zbmRfd25kLCB0cC0+c25kX2N3bmQpIC8gMiAvIHRwLT50X21heHNlZzsKKwkJaWYgKHdpbiA8IDIpCisJCQl3aW4gPSAyOworCQl0cC0+c25kX2N3bmQgPSB0cC0+dF9tYXhzZWc7CisJCXRwLT5zbmRfc3N0aHJlc2ggPSB3aW4gKiB0cC0+dF9tYXhzZWc7CisJCXRwLT50X2R1cGFja3MgPSAwOworCQl9CisJCSh2b2lkKSB0Y3Bfb3V0cHV0KHRwKTsKKwkJYnJlYWs7CisKKwkvKgorCSAqIFBlcnNpc3RlbmNlIHRpbWVyIGludG8gemVybyB3aW5kb3cuCisJICogRm9yY2UgYSBieXRlIHRvIGJlIG91dHB1dCwgaWYgcG9zc2libGUuCisJICovCisJY2FzZSBUQ1BUX1BFUlNJU1Q6CisJCVNUQVQodGNwc3RhdC50Y3BzX3BlcnNpc3R0aW1lbysrKTsKKwkJdGNwX3NldHBlcnNpc3QodHApOworCQl0cC0+dF9mb3JjZSA9IDE7CisJCSh2b2lkKSB0Y3Bfb3V0cHV0KHRwKTsKKwkJdHAtPnRfZm9yY2UgPSAwOworCQlicmVhazsKKworCS8qCisJICogS2VlcC1hbGl2ZSB0aW1lciB3ZW50IG9mZjsgc2VuZCBzb21ldGhpbmcKKwkgKiBvciBkcm9wIGNvbm5lY3Rpb24gaWYgaWRsZSBmb3IgdG9vIGxvbmcuCisJICovCisJY2FzZSBUQ1BUX0tFRVA6CisJCVNUQVQodGNwc3RhdC50Y3BzX2tlZXB0aW1lbysrKTsKKwkJaWYgKHRwLT50X3N0YXRlIDwgVENQU19FU1RBQkxJU0hFRCkKKwkJCWdvdG8gZHJvcGl0OworCisvKgkJaWYgKHRwLT50X3NvY2tldC0+c29fb3B0aW9ucyAmIFNPX0tFRVBBTElWRSAmJiAqLworCQlpZiAoKFNPX09QVElPTlMpICYmIHRwLT50X3N0YXRlIDw9IFRDUFNfQ0xPU0VfV0FJVCkgeworCQkgICAgCWlmICh0cC0+dF9pZGxlID49IFRDUFRWX0tFRVBfSURMRSArIFRDUF9NQVhJRExFKQorCQkJCWdvdG8gZHJvcGl0OworCQkJLyoKKwkJCSAqIFNlbmQgYSBwYWNrZXQgZGVzaWduZWQgdG8gZm9yY2UgYSByZXNwb25zZQorCQkJICogaWYgdGhlIHBlZXIgaXMgdXAgYW5kIHJlYWNoYWJsZToKKwkJCSAqIGVpdGhlciBhbiBBQ0sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgYWxpdmUsCisJCQkgKiBvciBhbiBSU1QgaWYgdGhlIHBlZXIgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbgorCQkJICogZHVlIHRvIHRpbWVvdXQgb3IgcmVib290LgorCQkJICogVXNpbmcgc2VxdWVuY2UgbnVtYmVyIHRwLT5zbmRfdW5hLTEKKwkJCSAqIGNhdXNlcyB0aGUgdHJhbnNtaXR0ZWQgemVyby1sZW5ndGggc2VnbWVudAorCQkJICogdG8gbGllIG91dHNpZGUgdGhlIHJlY2VpdmUgd2luZG93OworCQkJICogYnkgdGhlIHByb3RvY29sIHNwZWMsIHRoaXMgcmVxdWlyZXMgdGhlCisJCQkgKiBjb3JyZXNwb25kZW50IFRDUCB0byByZXNwb25kLgorCQkJICovCisJCQlTVEFUKHRjcHN0YXQudGNwc19rZWVwcHJvYmUrKyk7CisjaWZkZWYgVENQX0NPTVBBVF80MgorCQkJLyoKKwkJCSAqIFRoZSBrZWVwYWxpdmUgcGFja2V0IG11c3QgaGF2ZSBub256ZXJvIGxlbmd0aAorCQkJICogdG8gZ2V0IGEgNC4yIGhvc3QgdG8gcmVzcG9uZC4KKwkJCSAqLworCQkJdGNwX3Jlc3BvbmQodHAsICZ0cC0+dF90ZW1wbGF0ZSwgKHN0cnVjdCBtYnVmICopTlVMTCwKKwkJCSAgICB0cC0+cmN2X254dCAtIDEsIHRwLT5zbmRfdW5hIC0gMSwgMCk7CisjZWxzZQorCQkJdGNwX3Jlc3BvbmQodHAsICZ0cC0+dF90ZW1wbGF0ZSwgKHN0cnVjdCBtYnVmICopTlVMTCwKKwkJCSAgICB0cC0+cmN2X254dCwgdHAtPnNuZF91bmEgLSAxLCAwKTsKKyNlbmRpZgorCQkJdHAtPnRfdGltZXJbVENQVF9LRUVQXSA9IFRDUFRWX0tFRVBJTlRWTDsKKwkJfSBlbHNlCisJCQl0cC0+dF90aW1lcltUQ1BUX0tFRVBdID0gVENQVFZfS0VFUF9JRExFOworCQlicmVhazsKKworCWRyb3BpdDoKKwkJU1RBVCh0Y3BzdGF0LnRjcHNfa2VlcGRyb3BzKyspOworCQl0cCA9IHRjcF9kcm9wKHRwLCAwKTsgLyogRVRJTUVET1VUKTsgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuICh0cCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF90aW1lci5oIGIvYW5kcm9pZC9xZW11MS9zbGlycC90Y3BfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFlZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC90Y3BfdGltZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3BfdGltZXIuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiB0Y3BfdGltZXIuaCx2IDEuNCAxOTk0LzA4LzIxIDA1OjI3OjM4IHBhdWwgRXhwCisgKi8KKworI2lmbmRlZiBfVENQX1RJTUVSX0hfCisjZGVmaW5lIF9UQ1BfVElNRVJfSF8KKworLyoKKyAqIERlZmluaXRpb25zIG9mIHRoZSBUQ1AgdGltZXJzLiAgVGhlc2UgdGltZXJzIGFyZSBjb3VudGVkCisgKiBkb3duIFBSX1NMT1dIWiB0aW1lcyBhIHNlY29uZC4KKyAqLworI2RlZmluZQlUQ1BUX05USU1FUlMJNAorCisjZGVmaW5lCVRDUFRfUkVYTVQJMAkJLyogcmV0cmFuc21pdCAqLworI2RlZmluZQlUQ1BUX1BFUlNJU1QJMQkJLyogcmV0cmFuc21pdCBwZXJzaXN0ZW5jZSAqLworI2RlZmluZQlUQ1BUX0tFRVAJMgkJLyoga2VlcCBhbGl2ZSAqLworI2RlZmluZQlUQ1BUXzJNU0wJMwkJLyogMiptc2wgcXVpZXQgdGltZSB0aW1lciAqLworCisvKgorICogVGhlIFRDUFRfUkVYTVQgdGltZXIgaXMgdXNlZCB0byBmb3JjZSByZXRyYW5zbWlzc2lvbnMuCisgKiBUaGUgVENQIGhhcyB0aGUgVENQVF9SRVhNVCB0aW1lciBzZXQgd2hlbmV2ZXIgc2VnbWVudHMKKyAqIGhhdmUgYmVlbiBzZW50IGZvciB3aGljaCBBQ0tzIGFyZSBleHBlY3RlZCBidXQgbm90IHlldAorICogcmVjZWl2ZWQuICBJZiBhbiBBQ0sgaXMgcmVjZWl2ZWQgd2hpY2ggYWR2YW5jZXMgdHAtPnNuZF91bmEsCisgKiB0aGVuIHRoZSByZXRyYW5zbWl0IHRpbWVyIGlzIGNsZWFyZWQgKGlmIHRoZXJlIGFyZSBubyBtb3JlCisgKiBvdXRzdGFuZGluZyBzZWdtZW50cykgb3IgcmVzZXQgdG8gdGhlIGJhc2UgdmFsdWUgKGlmIHRoZXJlCisgKiBhcmUgbW9yZSBBQ0tzIGV4cGVjdGVkKS4gIFdoZW5ldmVyIHRoZSByZXRyYW5zbWl0IHRpbWVyIGdvZXMgb2ZmLAorICogd2UgcmV0cmFuc21pdCBvbmUgdW5hY2tub3dsZWRnZWQgc2VnbWVudCwgYW5kIGRvIGEgYmFja29mZgorICogb24gdGhlIHJldHJhbnNtaXQgdGltZXIuCisgKgorICogVGhlIFRDUFRfUEVSU0lTVCB0aW1lciBpcyB1c2VkIHRvIGtlZXAgd2luZG93IHNpemUgaW5mb3JtYXRpb24KKyAqIGZsb3dpbmcgZXZlbiBpZiB0aGUgd2luZG93IGdvZXMgc2h1dC4gIElmIGFsbCBwcmV2aW91cyB0cmFuc21pc3Npb25zCisgKiBoYXZlIGJlZW4gYWNrbm93bGVkZ2VkIChzbyB0aGF0IHRoZXJlIGFyZSBubyByZXRyYW5zbWlzc2lvbnMgaW4gcHJvZ3Jlc3MpLAorICogYW5kIHRoZSB3aW5kb3cgaXMgdG9vIHNtYWxsIHRvIGJvdGhlciBzZW5kaW5nIGFueXRoaW5nLCB0aGVuIHdlIHN0YXJ0CisgKiB0aGUgVENQVF9QRVJTSVNUIHRpbWVyLiAgV2hlbiBpdCBleHBpcmVzLCBpZiB0aGUgd2luZG93IGlzIG5vbnplcm8sCisgKiB3ZSBnbyB0byB0cmFuc21pdCBzdGF0ZS4gIE90aGVyd2lzZSwgYXQgaW50ZXJ2YWxzIHNlbmQgYSBzaW5nbGUgYnl0ZQorICogaW50byB0aGUgcGVlcidzIHdpbmRvdyB0byBmb3JjZSBoaW0gdG8gdXBkYXRlIG91ciB3aW5kb3cgaW5mb3JtYXRpb24uCisgKiBXZSBkbyB0aGlzIGF0IG1vc3QgYXMgb2Z0ZW4gYXMgVENQVF9QRVJTTUlOIHRpbWUgaW50ZXJ2YWxzLAorICogYnV0IG5vIG1vcmUgZnJlcXVlbnRseSB0aGFuIHRoZSBjdXJyZW50IGVzdGltYXRlIG9mIHJvdW5kLXRyaXAKKyAqIHBhY2tldCB0aW1lLiAgVGhlIFRDUFRfUEVSU0lTVCB0aW1lciBpcyBjbGVhcmVkIHdoZW5ldmVyIHdlIHJlY2VpdmUKKyAqIGEgd2luZG93IHVwZGF0ZSBmcm9tIHRoZSBwZWVyLgorICoKKyAqIFRoZSBUQ1BUX0tFRVAgdGltZXIgaXMgdXNlZCB0byBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlLiAgSWYgYW4KKyAqIGNvbm5lY3Rpb24gaXMgaWRsZSAobm8gc2VnbWVudHMgcmVjZWl2ZWQpIGZvciBUQ1BUVl9LRUVQX0lOSVQgYW1vdW50IG9mIHRpbWUsCisgKiBidXQgbm90IHlldCBlc3RhYmxpc2hlZCwgdGhlbiB3ZSBkcm9wIHRoZSBjb25uZWN0aW9uLiAgT25jZSB0aGUgY29ubmVjdGlvbgorICogaXMgZXN0YWJsaXNoZWQsIGlmIHRoZSBjb25uZWN0aW9uIGlzIGlkbGUgZm9yIFRDUFRWX0tFRVBfSURMRSB0aW1lCisgKiAoYW5kIGtlZXBhbGl2ZXMgaGF2ZSBiZWVuIGVuYWJsZWQgb24gdGhlIHNvY2tldCksIHdlIGJlZ2luIHRvIHByb2JlCisgKiB0aGUgY29ubmVjdGlvbi4gIFdlIGZvcmNlIHRoZSBwZWVyIHRvIHNlbmQgdXMgYSBzZWdtZW50IGJ5IHNlbmRpbmc6CisgKgk8U0VRPVNORC5VTkEtMT48QUNLPVJDVi5OWFQ+PENUTD1BQ0s+CisgKiBUaGlzIHNlZ21lbnQgaXMgKGRlbGliZXJhdGVseSkgb3V0c2lkZSB0aGUgd2luZG93LCBhbmQgc2hvdWxkIGVsaWNpdAorICogYW4gYWNrIHNlZ21lbnQgaW4gcmVzcG9uc2UgZnJvbSB0aGUgcGVlci4gIElmLCBkZXNwaXRlIHRoZSBUQ1BUX0tFRVAKKyAqIGluaXRpYXRlZCBzZWdtZW50cyB3ZSBjYW5ub3QgZWxpY2l0IGEgcmVzcG9uc2UgZnJvbSBhIHBlZXIgaW4gVENQVF9NQVhJRExFCisgKiBhbW91bnQgb2YgdGltZSBwcm9iaW5nLCB0aGVuIHdlIGRyb3AgdGhlIGNvbm5lY3Rpb24uCisgKi8KKworLyoKKyAqIFRpbWUgY29uc3RhbnRzLgorICovCisjZGVmaW5lIFRDUFRWX01TTCAgICAgICAoIDUqUFJfU0xPV0haKSAgICAgICAgICAvKiBtYXggc2VnIGxpZmV0aW1lIChoYWghKSAqLworCisjZGVmaW5lCVRDUFRWX1NSVFRCQVNFCTAJCQkvKiBiYXNlIHJvdW5kdHJpcCB0aW1lOworCQkJCQkJICAgaWYgMCwgbm8gaWRlYSB5ZXQgKi8KKyNkZWZpbmUJVENQVFZfU1JUVERGTFQJKCAgMypQUl9TTE9XSFopCQkvKiBhc3N1bWVkIFJUVCBpZiBubyBpbmZvICovCisKKyNkZWZpbmUJVENQVFZfUEVSU01JTgkoICA1KlBSX1NMT1dIWikJCS8qIHJldHJhbnNtaXQgcGVyc2lzdGVuY2UgKi8KKyNkZWZpbmUJVENQVFZfUEVSU01BWAkoIDYwKlBSX1NMT1dIWikJCS8qIG1heGltdW0gcGVyc2lzdCBpbnRlcnZhbCAqLworCisjZGVmaW5lCVRDUFRWX0tFRVBfSU5JVAkoIDc1KlBSX1NMT1dIWikJCS8qIGluaXRpYWwgY29ubmVjdCBrZWVwIGFsaXZlICovCisjZGVmaW5lCVRDUFRWX0tFRVBfSURMRQkoMTIwKjYwKlBSX1NMT1dIWikJLyogZGZsdCB0aW1lIGJlZm9yZSBwcm9iaW5nICovCisjZGVmaW5lCVRDUFRWX0tFRVBJTlRWTAkoIDc1KlBSX1NMT1dIWikJCS8qIGRlZmF1bHQgcHJvYmUgaW50ZXJ2YWwgKi8KKyNkZWZpbmUJVENQVFZfS0VFUENOVAk4CQkJLyogbWF4IHByb2JlcyBiZWZvcmUgZHJvcCAqLworCisjZGVmaW5lCVRDUFRWX01JTgkoICAxKlBSX1NMT1dIWikJCS8qIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlICovCisvKiAjZGVmaW5lCVRDUFRWX1JFWE1UTUFYCSggNjQqUFJfU0xPV0haKQkqLwkvKiBtYXggYWxsb3dhYmxlIFJFWE1UIHZhbHVlICovCisjZGVmaW5lIFRDUFRWX1JFWE1UTUFYICAoIDEyKlBSX1NMT1dIWikJCS8qIG1heCBhbGxvd2FibGUgUkVYTVQgdmFsdWUgKi8KKworI2RlZmluZQlUQ1BfTElOR0VSVElNRQkxMjAJCQkvKiBsaW5nZXIgYXQgbW9zdCAyIG1pbnV0ZXMgKi8KKworI2RlZmluZSBUQ1BfTUFYUlhUU0hJRlQgMTIgICAgICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSByZXRyYW5zbWl0cyAqLworCisKKyNpZmRlZglUQ1BUSU1FUlMKK2NoYXIgKnRjcHRpbWVyc1tdID0KKyAgICB7ICJSRVhNVCIsICJQRVJTSVNUIiwgIktFRVAiLCAiMk1TTCIgfTsKKyNlbmRpZgorCisvKgorICogRm9yY2UgYSB0aW1lIHZhbHVlIHRvIGJlIGluIGEgY2VydGFpbiByYW5nZS4KKyAqLworI2RlZmluZQlUQ1BUX1JBTkdFU0VUKHR2LCB2YWx1ZSwgdHZtaW4sIHR2bWF4KSB7IFwKKwkodHYpID0gKHZhbHVlKTsgXAorCWlmICgodHYpIDwgKHR2bWluKSkgXAorCQkodHYpID0gKHR2bWluKTsgXAorCWVsc2UgaWYgKCh0dikgPiAodHZtYXgpKSBcCisJCSh0dikgPSAodHZtYXgpOyBcCit9CisKK2V4dGVybiBjb25zdCBpbnQgdGNwX2JhY2tvZmZbXTsKKworc3RydWN0IHRjcGNiOworCit2b2lkIHRjcF9mYXN0dGltbyBfUCgodm9pZCkpOwordm9pZCB0Y3Bfc2xvd3RpbW8gX1AoKHZvaWQpKTsKK3ZvaWQgdGNwX2NhbmNlbHRpbWVycyBfUCgoc3RydWN0IHRjcGNiICopKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF92YXIuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwX3Zhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWYxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RjcF92YXIuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl0Y3BfdmFyLmgJOC4zIChCZXJrZWxleSkgNC8xMC85NAorICogdGNwX3Zhci5oLHYgMS4zIDE5OTQvMDgvMjEgMDU6Mjc6MzkgcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9UQ1BfVkFSX0hfCisjZGVmaW5lIF9UQ1BfVkFSX0hfCisKKyNpbmNsdWRlICJ0Y3BpcC5oIgorI2luY2x1ZGUgInRjcF90aW1lci5oIgorCisvKgorICogVGNwIGNvbnRyb2wgYmxvY2ssIG9uZSBwZXIgdGNwOyBmaWVsZHM6CisgKi8KK3N0cnVjdCB0Y3BjYiB7CisJc3RydWN0IHRjcGlwaGRyICpzZWdfbmV4dDsJLyogc2VxdWVuY2luZyBxdWV1ZSAqLworCXN0cnVjdCB0Y3BpcGhkciAqc2VnX3ByZXY7CisJc2hvcnQJdF9zdGF0ZTsJCS8qIHN0YXRlIG9mIHRoaXMgY29ubmVjdGlvbiAqLworCXNob3J0CXRfdGltZXJbVENQVF9OVElNRVJTXTsJLyogdGNwIHRpbWVycyAqLworCXNob3J0CXRfcnh0c2hpZnQ7CQkvKiBsb2coMikgb2YgcmV4bXQgZXhwLiBiYWNrb2ZmICovCisJc2hvcnQJdF9yeHRjdXI7CQkvKiBjdXJyZW50IHJldHJhbnNtaXQgdmFsdWUgKi8KKwlzaG9ydAl0X2R1cGFja3M7CQkvKiBjb25zZWN1dGl2ZSBkdXAgYWNrcyByZWNkICovCisJdV9zaG9ydAl0X21heHNlZzsJCS8qIG1heGltdW0gc2VnbWVudCBzaXplICovCisJY2hhcgl0X2ZvcmNlOwkJLyogMSBpZiBmb3JjaW5nIG91dCBhIGJ5dGUgKi8KKwl1X3Nob3J0CXRfZmxhZ3M7CisjZGVmaW5lCVRGX0FDS05PVwkweDAwMDEJCS8qIGFjayBwZWVyIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lCVRGX0RFTEFDSwkweDAwMDIJCS8qIGFjaywgYnV0IHRyeSB0byBkZWxheSBpdCAqLworI2RlZmluZQlURl9OT0RFTEFZCTB4MDAwNAkJLyogZG9uJ3QgZGVsYXkgcGFja2V0cyB0byBjb2FsZXNjZSAqLworI2RlZmluZQlURl9OT09QVAkweDAwMDgJCS8qIGRvbid0IHVzZSB0Y3Agb3B0aW9ucyAqLworI2RlZmluZQlURl9TRU5URklOCTB4MDAxMAkJLyogaGF2ZSBzZW50IEZJTiAqLworI2RlZmluZQlURl9SRVFfU0NBTEUJMHgwMDIwCQkvKiBoYXZlL3dpbGwgcmVxdWVzdCB3aW5kb3cgc2NhbGluZyAqLworI2RlZmluZQlURl9SQ1ZEX1NDQUxFCTB4MDA0MAkJLyogb3RoZXIgc2lkZSBoYXMgcmVxdWVzdGVkIHNjYWxpbmcgKi8KKyNkZWZpbmUJVEZfUkVRX1RTVE1QCTB4MDA4MAkJLyogaGF2ZS93aWxsIHJlcXVlc3QgdGltZXN0YW1wcyAqLworI2RlZmluZQlURl9SQ1ZEX1RTVE1QCTB4MDEwMAkJLyogYSB0aW1lc3RhbXAgd2FzIHJlY2VpdmVkIGluIFNZTiAqLworI2RlZmluZQlURl9TQUNLX1BFUk1JVAkweDAyMDAJCS8qIG90aGVyIHNpZGUgc2FpZCBJIGNvdWxkIFNBQ0sgKi8KKworCS8qIE1ha2UgaXQgc3RhdGljICBmb3Igbm93ICovCisvKglzdHJ1Y3QJdGNwaXBoZHIgKnRfdGVtcGxhdGU7CS8gKiBza2VsZXRhbCBwYWNrZXQgZm9yIHRyYW5zbWl0ICovCisJc3RydWN0CXRjcGlwaGRyIHRfdGVtcGxhdGU7CisKKwlzdHJ1Y3QJc29ja2V0ICp0X3NvY2tldDsJCS8qIGJhY2sgcG9pbnRlciB0byBzb2NrZXQgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdXNlZCBhcyBpbiB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbi4KKyAqIFNlZSBSRkM3ODMsIERlYy4gMTk4MSwgcGFnZSAyMS4KKyAqLworLyogc2VuZCBzZXF1ZW5jZSB2YXJpYWJsZXMgKi8KKwl0Y3Bfc2VxCXNuZF91bmE7CQkvKiBzZW5kIHVuYWNrbm93bGVkZ2VkICovCisJdGNwX3NlcQlzbmRfbnh0OwkJLyogc2VuZCBuZXh0ICovCisJdGNwX3NlcQlzbmRfdXA7CQkJLyogc2VuZCB1cmdlbnQgcG9pbnRlciAqLworCXRjcF9zZXEJc25kX3dsMTsJCS8qIHdpbmRvdyB1cGRhdGUgc2VnIHNlcSBudW1iZXIgKi8KKwl0Y3Bfc2VxCXNuZF93bDI7CQkvKiB3aW5kb3cgdXBkYXRlIHNlZyBhY2sgbnVtYmVyICovCisJdGNwX3NlcQlpc3M7CQkJLyogaW5pdGlhbCBzZW5kIHNlcXVlbmNlIG51bWJlciAqLworCXVfaW50MzJfdCBzbmRfd25kOwkJLyogc2VuZCB3aW5kb3cgKi8KKy8qIHJlY2VpdmUgc2VxdWVuY2UgdmFyaWFibGVzICovCisJdV9pbnQzMl90IHJjdl93bmQ7CQkvKiByZWNlaXZlIHdpbmRvdyAqLworCXRjcF9zZXEJcmN2X254dDsJCS8qIHJlY2VpdmUgbmV4dCAqLworCXRjcF9zZXEJcmN2X3VwOwkJCS8qIHJlY2VpdmUgdXJnZW50IHBvaW50ZXIgKi8KKwl0Y3Bfc2VxCWlyczsJCQkvKiBpbml0aWFsIHJlY2VpdmUgc2VxdWVuY2UgbnVtYmVyICovCisvKgorICogQWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24uCisgKi8KKy8qIHJlY2VpdmUgdmFyaWFibGVzICovCisJdGNwX3NlcQlyY3ZfYWR2OwkJLyogYWR2ZXJ0aXNlZCB3aW5kb3cgKi8KKy8qIHJldHJhbnNtaXQgdmFyaWFibGVzICovCisJdGNwX3NlcQlzbmRfbWF4OwkJLyogaGlnaGVzdCBzZXF1ZW5jZSBudW1iZXIgc2VudDsKKwkJCQkJICogdXNlZCB0byByZWNvZ25pemUgcmV0cmFuc21pdHMKKwkJCQkJICovCisvKiBjb25nZXN0aW9uIGNvbnRyb2wgKGZvciBzbG93IHN0YXJ0LCBzb3VyY2UgcXVlbmNoLCByZXRyYW5zbWl0IGFmdGVyIGxvc3MpICovCisJdV9pbnQzMl90IHNuZF9jd25kOwkJLyogY29uZ2VzdGlvbi1jb250cm9sbGVkIHdpbmRvdyAqLworCXVfaW50MzJfdCBzbmRfc3N0aHJlc2g7CQkvKiBzbmRfY3duZCBzaXplIHRocmVzaG9sZCBmb3IKKwkJCQkJICogZm9yIHNsb3cgc3RhcnQgZXhwb25lbnRpYWwgdG8KKwkJCQkJICogbGluZWFyIHN3aXRjaAorCQkJCQkgKi8KKy8qCisgKiB0cmFuc21pdCB0aW1pbmcgc3R1ZmYuICBTZWUgYmVsb3cgZm9yIHNjYWxlIG9mIHNydHQgYW5kIHJ0dHZhci4KKyAqICJWYXJpYW5jZSIgaXMgYWN0dWFsbHkgc21vb3RoZWQgZGlmZmVyZW5jZS4KKyAqLworCXNob3J0CXRfaWRsZTsJCQkvKiBpbmFjdGl2aXR5IHRpbWUgKi8KKwlzaG9ydAl0X3J0dDsJCQkvKiByb3VuZCB0cmlwIHRpbWUgKi8KKwl0Y3Bfc2VxCXRfcnRzZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgYmVpbmcgdGltZWQgKi8KKwlzaG9ydAl0X3NydHQ7CQkJLyogc21vb3RoZWQgcm91bmQtdHJpcCB0aW1lICovCisJc2hvcnQJdF9ydHR2YXI7CQkvKiB2YXJpYW5jZSBpbiByb3VuZC10cmlwIHRpbWUgKi8KKwl1X3Nob3J0CXRfcnR0bWluOwkJLyogbWluaW11bSBydHQgYWxsb3dlZCAqLworCXVfaW50MzJfdCBtYXhfc25kd25kOwkJLyogbGFyZ2VzdCB3aW5kb3cgcGVlciBoYXMgb2ZmZXJlZCAqLworCisvKiBvdXQtb2YtYmFuZCBkYXRhICovCisJY2hhcgl0X29vYmZsYWdzOwkJLyogaGF2ZSBzb21lICovCisJY2hhcgl0X2lvYmM7CQkJLyogaW5wdXQgY2hhcmFjdGVyICovCisjZGVmaW5lCVRDUE9PQl9IQVZFREFUQQkweDAxCisjZGVmaW5lCVRDUE9PQl9IQUREQVRBCTB4MDIKKwlzaG9ydAl0X3NvZnRlcnJvcjsJCS8qIHBvc3NpYmxlIGVycm9yIG5vdCB5ZXQgcmVwb3J0ZWQgKi8KKworLyogUkZDIDEzMjMgdmFyaWFibGVzICovCisJdV9jaGFyCXNuZF9zY2FsZTsJCS8qIHdpbmRvdyBzY2FsaW5nIGZvciBzZW5kIHdpbmRvdyAqLworCXVfY2hhcglyY3Zfc2NhbGU7CQkvKiB3aW5kb3cgc2NhbGluZyBmb3IgcmVjdiB3aW5kb3cgKi8KKwl1X2NoYXIJcmVxdWVzdF9yX3NjYWxlOwkvKiBwZW5kaW5nIHdpbmRvdyBzY2FsaW5nICovCisJdV9jaGFyCXJlcXVlc3RlZF9zX3NjYWxlOworCXVfaW50MzJfdAl0c19yZWNlbnQ7CQkvKiB0aW1lc3RhbXAgZWNobyBkYXRhICovCisJdV9pbnQzMl90CXRzX3JlY2VudF9hZ2U7CQkvKiB3aGVuIGxhc3QgdXBkYXRlZCAqLworCXRjcF9zZXEJbGFzdF9hY2tfc2VudDsKKworfTsKKworI2RlZmluZQlzb3RvdGNwY2Ioc28pCSgoc28pLT5zb190Y3BjYikKKworLyoKKyAqIFRoZSBzbW9vdGhlZCByb3VuZC10cmlwIHRpbWUgYW5kIGVzdGltYXRlZCB2YXJpYW5jZQorICogYXJlIHN0b3JlZCBhcyBmaXhlZCBwb2ludCBudW1iZXJzIHNjYWxlZCBieSB0aGUgdmFsdWVzIGJlbG93LgorICogRm9yIGNvbnZlbmllbmNlLCB0aGVzZSBzY2FsZXMgYXJlIGFsc28gdXNlZCBpbiBzbW9vdGhpbmcgdGhlIGF2ZXJhZ2UKKyAqIChzbW9vdGhlZCA9ICgxL3NjYWxlKXNhbXBsZSArICgoc2NhbGUtMSkvc2NhbGUpc21vb3RoZWQpLgorICogV2l0aCB0aGVzZSBzY2FsZXMsIHNydHQgaGFzIDMgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlIGJpbmFyeSBwb2ludCwKKyAqIGFuZCB0aHVzIGFuICJBTFBIQSIgb2YgMC44NzUuICBydHR2YXIgaGFzIDIgYml0cyB0byB0aGUgcmlnaHQgb2YgdGhlCisgKiBiaW5hcnkgcG9pbnQsIGFuZCBpcyBzbW9vdGhlZCB3aXRoIGFuIEFMUEhBIG9mIDAuNzUuCisgKi8KKyNkZWZpbmUJVENQX1JUVF9TQ0FMRQkJOAkvKiBtdWx0aXBsaWVyIGZvciBzcnR0OyAzIGJpdHMgZnJhYy4gKi8KKyNkZWZpbmUJVENQX1JUVF9TSElGVAkJMwkvKiBzaGlmdCBmb3Igc3J0dDsgMyBiaXRzIGZyYWMuICovCisjZGVmaW5lCVRDUF9SVFRWQVJfU0NBTEUJNAkvKiBtdWx0aXBsaWVyIGZvciBydHR2YXI7IDIgYml0cyAqLworI2RlZmluZQlUQ1BfUlRUVkFSX1NISUZUCTIJLyogbXVsdGlwbGllciBmb3IgcnR0dmFyOyAyIGJpdHMgKi8KKworLyoKKyAqIFRoZSBpbml0aWFsIHJldHJhbnNtaXNzaW9uIHNob3VsZCBoYXBwZW4gYXQgcnR0ICsgNCAqIHJ0dHZhci4KKyAqIEJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBkbyB0aGUgc21vb3RoaW5nLCBzcnR0IGFuZCBydHR2YXIKKyAqIHdpbGwgZWFjaCBhdmVyYWdlICsxLzIgdGljayBvZiBiaWFzLiAgV2hlbiB3ZSBjb21wdXRlCisgKiB0aGUgcmV0cmFuc21pdCB0aW1lciwgd2Ugd2FudCAxLzIgdGljayBvZiByb3VuZGluZyBhbmQKKyAqIDEgZXh0cmEgdGljayBiZWNhdXNlIG9mICstMS8yIHRpY2sgdW5jZXJ0YWludHkgaW4gdGhlCisgKiBmaXJpbmcgb2YgdGhlIHRpbWVyLiAgVGhlIGJpYXMgd2lsbCBnaXZlIHVzIGV4YWN0bHkgdGhlCisgKiAxLjUgdGljayB3ZSBuZWVkLiAgQnV0LCBiZWNhdXNlIHRoZSBiaWFzIGlzCisgKiBzdGF0aXN0aWNhbCwgd2UgaGF2ZSB0byB0ZXN0IHRoYXQgd2UgZG9uJ3QgZHJvcCBiZWxvdworICogdGhlIG1pbmltdW0gZmVhc2libGUgdGltZXIgKHdoaWNoIGlzIDIgdGlja3MpLgorICogVGhpcyBtYWNybyBhc3N1bWVzIHRoYXQgdGhlIHZhbHVlIG9mIFRDUF9SVFRWQVJfU0NBTEUKKyAqIGlzIHRoZSBzYW1lIGFzIHRoZSBtdWx0aXBsaWVyIGZvciBydHR2YXIuCisgKi8KKyNkZWZpbmUJVENQX1JFWE1UVkFMKHRwKSBcCisJKCgodHApLT50X3NydHQgPj4gVENQX1JUVF9TSElGVCkgKyAodHApLT50X3J0dHZhcikKKworI2lmZGVmIExPR19FTkFCTEVECisvKgorICogVENQIHN0YXRpc3RpY3MuCisgKiBNYW55IG9mIHRoZXNlIHNob3VsZCBiZSBrZXB0IHBlciBjb25uZWN0aW9uLAorICogYnV0IHRoYXQncyBpbmNvbnZlbmllbnQgYXQgdGhlIG1vbWVudC4KKyAqLworc3RydWN0IHRjcHN0YXQgeworCXVfbG9uZwl0Y3BzX2Nvbm5hdHRlbXB0OwkvKiBjb25uZWN0aW9ucyBpbml0aWF0ZWQgKi8KKwl1X2xvbmcJdGNwc19hY2NlcHRzOwkJLyogY29ubmVjdGlvbnMgYWNjZXB0ZWQgKi8KKwl1X2xvbmcJdGNwc19jb25uZWN0czsJCS8qIGNvbm5lY3Rpb25zIGVzdGFibGlzaGVkICovCisJdV9sb25nCXRjcHNfZHJvcHM7CQkvKiBjb25uZWN0aW9ucyBkcm9wcGVkICovCisJdV9sb25nCXRjcHNfY29ubmRyb3BzOwkJLyogZW1icnlvbmljIGNvbm5lY3Rpb25zIGRyb3BwZWQgKi8KKwl1X2xvbmcJdGNwc19jbG9zZWQ7CQkvKiBjb25uLiBjbG9zZWQgKGluY2x1ZGVzIGRyb3BzKSAqLworCXVfbG9uZwl0Y3BzX3NlZ3N0aW1lZDsJCS8qIHNlZ3Mgd2hlcmUgd2UgdHJpZWQgdG8gZ2V0IHJ0dCAqLworCXVfbG9uZwl0Y3BzX3J0dHVwZGF0ZWQ7CS8qIHRpbWVzIHdlIHN1Y2NlZWRlZCAqLworCXVfbG9uZwl0Y3BzX2RlbGFjazsJCS8qIGRlbGF5ZWQgYWNrcyBzZW50ICovCisJdV9sb25nCXRjcHNfdGltZW91dGRyb3A7CS8qIGNvbm4uIGRyb3BwZWQgaW4gcnhtdCB0aW1lb3V0ICovCisJdV9sb25nCXRjcHNfcmV4bXR0aW1lbzsJLyogcmV0cmFuc21pdCB0aW1lb3V0cyAqLworCXVfbG9uZwl0Y3BzX3BlcnNpc3R0aW1lbzsJLyogcGVyc2lzdCB0aW1lb3V0cyAqLworCXVfbG9uZwl0Y3BzX2tlZXB0aW1lbzsJCS8qIGtlZXBhbGl2ZSB0aW1lb3V0cyAqLworCXVfbG9uZwl0Y3BzX2tlZXBwcm9iZTsJCS8qIGtlZXBhbGl2ZSBwcm9iZXMgc2VudCAqLworCXVfbG9uZwl0Y3BzX2tlZXBkcm9wczsJCS8qIGNvbm5lY3Rpb25zIGRyb3BwZWQgaW4ga2VlcGFsaXZlICovCisKKwl1X2xvbmcJdGNwc19zbmR0b3RhbDsJCS8qIHRvdGFsIHBhY2tldHMgc2VudCAqLworCXVfbG9uZwl0Y3BzX3NuZHBhY2s7CQkvKiBkYXRhIHBhY2tldHMgc2VudCAqLworCXVfbG9uZwl0Y3BzX3NuZGJ5dGU7CQkvKiBkYXRhIGJ5dGVzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19zbmRyZXhtaXRwYWNrOwkvKiBkYXRhIHBhY2tldHMgcmV0cmFuc21pdHRlZCAqLworCXVfbG9uZwl0Y3BzX3NuZHJleG1pdGJ5dGU7CS8qIGRhdGEgYnl0ZXMgcmV0cmFuc21pdHRlZCAqLworCXVfbG9uZwl0Y3BzX3NuZGFja3M7CQkvKiBhY2stb25seSBwYWNrZXRzIHNlbnQgKi8KKwl1X2xvbmcJdGNwc19zbmRwcm9iZTsJCS8qIHdpbmRvdyBwcm9iZXMgc2VudCAqLworCXVfbG9uZwl0Y3BzX3NuZHVyZzsJCS8qIHBhY2tldHMgc2VudCB3aXRoIFVSRyBvbmx5ICovCisJdV9sb25nCXRjcHNfc25kd2ludXA7CQkvKiB3aW5kb3cgdXBkYXRlLW9ubHkgcGFja2V0cyBzZW50ICovCisJdV9sb25nCXRjcHNfc25kY3RybDsJCS8qIGNvbnRyb2wgKFNZTnxGSU58UlNUKSBwYWNrZXRzIHNlbnQgKi8KKworCXVfbG9uZwl0Y3BzX3JjdnRvdGFsOwkJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAqLworCXVfbG9uZwl0Y3BzX3JjdnBhY2s7CQkvKiBwYWNrZXRzIHJlY2VpdmVkIGluIHNlcXVlbmNlICovCisJdV9sb25nCXRjcHNfcmN2Ynl0ZTsJCS8qIGJ5dGVzIHJlY2VpdmVkIGluIHNlcXVlbmNlICovCisJdV9sb25nCXRjcHNfcmN2YmFkc3VtOwkJLyogcGFja2V0cyByZWNlaXZlZCB3aXRoIGNja3N1bSBlcnJzICovCisJdV9sb25nCXRjcHNfcmN2YmFkb2ZmOwkJLyogcGFja2V0cyByZWNlaXZlZCB3aXRoIGJhZCBvZmZzZXQgKi8KKy8qCXVfbG9uZwl0Y3BzX3JjdnNob3J0OwkqLwkvKiBwYWNrZXRzIHJlY2VpdmVkIHRvbyBzaG9ydCAqLworCXVfbG9uZwl0Y3BzX3JjdmR1cHBhY2s7CS8qIGR1cGxpY2F0ZS1vbmx5IHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJdGNwc19yY3ZkdXBieXRlOwkvKiBkdXBsaWNhdGUtb25seSBieXRlcyByZWNlaXZlZCAqLworCXVfbG9uZwl0Y3BzX3JjdnBhcnRkdXBwYWNrOwkvKiBwYWNrZXRzIHdpdGggc29tZSBkdXBsaWNhdGUgZGF0YSAqLworCXVfbG9uZwl0Y3BzX3JjdnBhcnRkdXBieXRlOwkvKiBkdXAuIGJ5dGVzIGluIHBhcnQtZHVwLiBwYWNrZXRzICovCisJdV9sb25nCXRjcHNfcmN2b29wYWNrOwkJLyogb3V0LW9mLW9yZGVyIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJdGNwc19yY3Zvb2J5dGU7CQkvKiBvdXQtb2Ytb3JkZXIgYnl0ZXMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJdGNwc19yY3ZwYWNrYWZ0ZXJ3aW47CS8qIHBhY2tldHMgd2l0aCBkYXRhIGFmdGVyIHdpbmRvdyAqLworCXVfbG9uZwl0Y3BzX3JjdmJ5dGVhZnRlcndpbjsJLyogYnl0ZXMgcmN2ZCBhZnRlciB3aW5kb3cgKi8KKwl1X2xvbmcJdGNwc19yY3ZhZnRlcmNsb3NlOwkvKiBwYWNrZXRzIHJjdmQgYWZ0ZXIgImNsb3NlIiAqLworCXVfbG9uZwl0Y3BzX3JjdndpbnByb2JlOwkvKiByY3ZkIHdpbmRvdyBwcm9iZSBwYWNrZXRzICovCisJdV9sb25nCXRjcHNfcmN2ZHVwYWNrOwkJLyogcmN2ZCBkdXBsaWNhdGUgYWNrcyAqLworCXVfbG9uZwl0Y3BzX3JjdmFja3Rvb211Y2g7CS8qIHJjdmQgYWNrcyBmb3IgdW5zZW50IGRhdGEgKi8KKwl1X2xvbmcJdGNwc19yY3ZhY2twYWNrOwkvKiByY3ZkIGFjayBwYWNrZXRzICovCisJdV9sb25nCXRjcHNfcmN2YWNrYnl0ZTsJLyogYnl0ZXMgYWNrZWQgYnkgcmN2ZCBhY2tzICovCisJdV9sb25nCXRjcHNfcmN2d2ludXBkOwkJLyogcmN2ZCB3aW5kb3cgdXBkYXRlIHBhY2tldHMgKi8KKy8qCXVfbG9uZwl0Y3BzX3Bhd3Nkcm9wOwkqLwkvKiBzZWdtZW50cyBkcm9wcGVkIGR1ZSB0byBQQVdTICovCisJdV9sb25nCXRjcHNfcHJlZGFjazsJCS8qIHRpbWVzIGhkciBwcmVkaWN0IG9rIGZvciBhY2tzICovCisJdV9sb25nCXRjcHNfcHJlZGRhdDsJCS8qIHRpbWVzIGhkciBwcmVkaWN0IG9rIGZvciBkYXRhIHBrdHMgKi8KKwl1X2xvbmcJdGNwc19zb2NhY2hlbWlzczsJLyogdGNwX2xhc3Rfc28gbWlzc2VzICovCisJdV9sb25nCXRjcHNfZGlkbnV0dGluOwkJLyogVGltZXMgdGNwX291dHB1dCBkaWRuJ3QgZG8gYW55dGhpbmcgWFhYICovCit9OworCitleHRlcm4gc3RydWN0CXRjcHN0YXQgdGNwc3RhdDsJLyogdGNwIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCitleHRlcm4gdV9pbnQzMl90CXRjcF9ub3c7CQkvKiBmb3IgUkZDIDEzMjMgdGltZXN0YW1wcyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwaXAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGNwaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0Y2UzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC90Y3BpcC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdGNwaXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCisgKiB0Y3BpcC5oLHYgMS4zIDE5OTQvMDgvMjEgMDU6Mjc6NDAgcGF1bCBFeHAKKyAqLworCisjaWZuZGVmIF9UQ1BJUF9IXworI2RlZmluZSBfVENQSVBfSF8KKworLyoKKyAqIFRjcCtpcCBoZWFkZXIsIGFmdGVyIGlwIG9wdGlvbnMgcmVtb3ZlZC4KKyAqLworc3RydWN0IHRjcGlwaGRyIHsKKwlzdHJ1Y3QgCWlwb3ZseSB0aV9pOwkJLyogb3ZlcmxhaWQgaXAgc3RydWN0dXJlICovCisJc3RydWN0CXRjcGhkciB0aV90OwkJLyogdGNwIGhlYWRlciAqLworfTsKKyNkZWZpbmUJdGlfbWJ1ZgkJdGlfaS5paF9tYnVmLm1wdHIKKyNkZWZpbmUJdGlfeDEJCXRpX2kuaWhfeDEKKyNkZWZpbmUJdGlfcHIJCXRpX2kuaWhfcHIKKyNkZWZpbmUJdGlfbGVuCQl0aV9pLmloX2xlbgorI2RlZmluZQl0aV9zcmMJCXRpX2kuaWhfc3JjCisjZGVmaW5lCXRpX2RzdAkJdGlfaS5paF9kc3QKKyNkZWZpbmUJdGlfc3BvcnQJdGlfdC50aF9zcG9ydAorI2RlZmluZQl0aV9kcG9ydAl0aV90LnRoX2Rwb3J0CisjZGVmaW5lCXRpX3NlcQkJdGlfdC50aF9zZXEKKyNkZWZpbmUJdGlfYWNrCQl0aV90LnRoX2FjaworI2RlZmluZQl0aV94MgkJdGlfdC50aF94MgorI2RlZmluZQl0aV9vZmYJCXRpX3QudGhfb2ZmCisjZGVmaW5lCXRpX2ZsYWdzCXRpX3QudGhfZmxhZ3MKKyNkZWZpbmUJdGlfd2luCQl0aV90LnRoX3dpbgorI2RlZmluZQl0aV9zdW0JCXRpX3QudGhfc3VtCisjZGVmaW5lCXRpX3VycAkJdGlfdC50aF91cnAKKworI2RlZmluZSB0Y3BpcGhkcjJxbGluayhUKSAoKHN0cnVjdCBxbGluayopKCgoY2hhciopKFQpKSAtIHNpemVvZihzdHJ1Y3QgcWxpbmspKSkKKyNkZWZpbmUgcWxpbmsydGNwaXBoZHIoUSkgKChzdHJ1Y3QgdGNwaXBoZHIqKSgoKGNoYXIqKShRKSkgKyBzaXplb2Yoc3RydWN0IHFsaW5rKSkpCisjZGVmaW5lIHRjcGlwaGRyX25leHQoVCkgcWxpbmsydGNwaXBoZHIodGNwaXBoZHIycWxpbmsoVCktPm5leHQpCisjZGVmaW5lIHRjcGlwaGRyX3ByZXYoVCkgcWxpbmsydGNwaXBoZHIodGNwaXBoZHIycWxpbmsoVCktPnByZXYpCisjZGVmaW5lIHRjcGZyYWdfbGlzdF9maXJzdChUKSBxbGluazJ0Y3BpcGhkcigoVCktPnNlZ19uZXh0KQorI2RlZmluZSB0Y3BmcmFnX2xpc3RfZW5kKEYsIFQpICh0Y3BpcGhkcjJxbGluayhGKSA9PSAoc3RydWN0IHFsaW5rKikoVCkpCisjZGVmaW5lIHRjcGZyYWdfbGlzdF9lbXB0eShUKSAoKFQpLT5zZWdfbmV4dCA9PSAoc3RydWN0IHRjcGlwaGRyKikoVCkpCisKKy8qCisgKiBKdXN0IGEgY2xlYW4gd2F5IHRvIGdldCB0byB0aGUgZmlyc3QgYnl0ZQorICogb2YgdGhlIHBhY2tldAorICovCitzdHJ1Y3QgdGNwaXBoZHJfMiB7CisJc3RydWN0IHRjcGlwaGRyIGR1bW15OworCWNoYXIgZmlyc3RfY2hhcjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC90ZnRwLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ1NTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zbGlycC90ZnRwLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiB0ZnRwLmMgLSBhIHNpbXBsZSwgcmVhZC1vbmx5IHRmdHAgc2VydmVyIGZvciBxZW11CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiIC8vIGZvciBwc3RyY3B5CisKK3N0cnVjdCB0ZnRwX3Nlc3Npb24geworICAgIGludCBpbl91c2U7CisgICAgdW5zaWduZWQgY2hhciBmaWxlbmFtZVtURlRQX0ZJTEVOQU1FX01BWF07CisKKyAgICBzdHJ1Y3QgaW5fYWRkciBjbGllbnRfaXA7CisgICAgdV9pbnQxNl90IGNsaWVudF9wb3J0OworCisgICAgaW50IHRpbWVzdGFtcDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGZ0cF9zZXNzaW9uIHRmdHBfc2Vzc2lvbnNbVEZUUF9TRVNTSU9OU19NQVhdOworCitjb25zdCBjaGFyICp0ZnRwX3ByZWZpeDsKKworc3RhdGljIHZvaWQgdGZ0cF9zZXNzaW9uX3VwZGF0ZShzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQpCit7CisgICAgc3B0LT50aW1lc3RhbXAgPSBjdXJ0aW1lOworICAgIHNwdC0+aW5fdXNlID0gMTsKK30KKworc3RhdGljIHZvaWQgdGZ0cF9zZXNzaW9uX3Rlcm1pbmF0ZShzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQpCit7CisgIHNwdC0+aW5fdXNlID0gMDsKK30KKworc3RhdGljIGludCB0ZnRwX3Nlc3Npb25fYWxsb2NhdGUoc3RydWN0IHRmdHBfdCAqdHApCit7CisgIHN0cnVjdCB0ZnRwX3Nlc3Npb24gKnNwdDsKKyAgaW50IGs7CisKKyAgZm9yIChrID0gMDsgayA8IFRGVFBfU0VTU0lPTlNfTUFYOyBrKyspIHsKKyAgICBzcHQgPSAmdGZ0cF9zZXNzaW9uc1trXTsKKworICAgIGlmICghc3B0LT5pbl91c2UpCisgICAgICAgIGdvdG8gZm91bmQ7CisKKyAgICAvKiBzZXNzaW9ucyB0aW1lIG91dCBhZnRlciA1IGluYWN0aXZlIHNlY29uZHMgKi8KKyAgICBpZiAoKGludCkoY3VydGltZSAtIHNwdC0+dGltZXN0YW1wKSA+IDUwMDApCisgICAgICAgIGdvdG8gZm91bmQ7CisgIH0KKworICByZXR1cm4gLTE7CisKKyBmb3VuZDoKKyAgbWVtc2V0KHNwdCwgMCwgc2l6ZW9mKCpzcHQpKTsKKyAgbWVtY3B5KCZzcHQtPmNsaWVudF9pcCwgJnRwLT5pcC5pcF9zcmMsIHNpemVvZihzcHQtPmNsaWVudF9pcCkpOworICBzcHQtPmNsaWVudF9wb3J0ID0gdHAtPnVkcC51aF9zcG9ydDsKKworICB0ZnRwX3Nlc3Npb25fdXBkYXRlKHNwdCk7CisKKyAgcmV0dXJuIGs7Cit9CisKK3N0YXRpYyBpbnQgdGZ0cF9zZXNzaW9uX2ZpbmQoc3RydWN0IHRmdHBfdCAqdHApCit7CisgIHN0cnVjdCB0ZnRwX3Nlc3Npb24gKnNwdDsKKyAgaW50IGs7CisKKyAgZm9yIChrID0gMDsgayA8IFRGVFBfU0VTU0lPTlNfTUFYOyBrKyspIHsKKyAgICBzcHQgPSAmdGZ0cF9zZXNzaW9uc1trXTsKKworICAgIGlmIChzcHQtPmluX3VzZSkgeworICAgICAgaWYgKCFtZW1jbXAoJnNwdC0+Y2xpZW50X2lwLCAmdHAtPmlwLmlwX3NyYywgc2l6ZW9mKHNwdC0+Y2xpZW50X2lwKSkpIHsKKwlpZiAoc3B0LT5jbGllbnRfcG9ydCA9PSB0cC0+dWRwLnVoX3Nwb3J0KSB7CisJICByZXR1cm4gazsKKwl9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRmdHBfcmVhZF9kYXRhKHN0cnVjdCB0ZnRwX3Nlc3Npb24gKnNwdCwgdV9pbnQxNl90IGJsb2NrX25yLAorCQkJICB1X2ludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICBpbnQgZmQ7CisgIGludCBieXRlc19yZWFkID0gMDsKKyAgY2hhciBidWZmZXJbMTAyNF07CisgIGludCBuOworCisgIG4gPSBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMvJXMiLAorCSAgICAgICB0ZnRwX3ByZWZpeCwgc3B0LT5maWxlbmFtZSk7CisgIGlmIChuID49IHNpemVvZihidWZmZXIpKQorICAgIHJldHVybiAtMTsKKworICBmZCA9IG9wZW4oYnVmZmVyLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKworICBpZiAoZmQgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGxlbikgeworICAgIGxzZWVrKGZkLCBibG9ja19uciAqIDUxMiwgU0VFS19TRVQpOworCisgICAgYnl0ZXNfcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIGNsb3NlKGZkKTsKKworICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworc3RhdGljIGludCB0ZnRwX3NlbmRfb2FjayhzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0ZnRwX3QgKnJlY3ZfdHApCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyLCBkYWRkcjsKKyAgICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgICBzdHJ1Y3QgdGZ0cF90ICp0cDsKKyAgICBpbnQgbiA9IDA7CisKKyAgICBtID0gbV9nZXQoKTsKKworICAgIGlmICghbSkKKwlyZXR1cm4gLTE7CisKKyAgICBtZW1zZXQobS0+bV9kYXRhLCAwLCBtLT5tX3NpemUpOworCisgICAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisgICAgdHAgPSAodm9pZCAqKW0tPm1fZGF0YTsKKyAgICBtLT5tX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCB1ZHBpcGhkcik7CisKKyAgICB0cC0+dHBfb3AgPSBodG9ucyhURlRQX09BQ0spOworICAgIG4gKz0gc25wcmludGYoKGNoYXIgKil0cC0+eC50cF9idWYgKyBuLCBzaXplb2YodHAtPngudHBfYnVmKSAtIG4sICIlcyIsCisgICAgICAgICAgICAgICAgICBrZXkpICsgMTsKKyAgICBuICs9IHNucHJpbnRmKChjaGFyICopdHAtPngudHBfYnVmICsgbiwgc2l6ZW9mKHRwLT54LnRwX2J1ZikgLSBuLCAiJXUiLAorICAgICAgICAgICAgICAgICAgdmFsdWUpICsgMTsKKworICAgIHNhZGRyLnNpbl9hZGRyID0gcmVjdl90cC0+aXAuaXBfZHN0OworICAgIHNhZGRyLnNpbl9wb3J0ID0gcmVjdl90cC0+dWRwLnVoX2Rwb3J0OworCisgICAgZGFkZHIuc2luX2FkZHIgPSBzcHQtPmNsaWVudF9pcDsKKyAgICBkYWRkci5zaW5fcG9ydCA9IHNwdC0+Y2xpZW50X3BvcnQ7CisKKyAgICBtLT5tX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGZ0cF90KSAtIDUxNCArIG4gLQorICAgICAgICBzaXplb2Yoc3RydWN0IGlwKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKyAgICB1ZHBfb3V0cHV0MihOVUxMLCBtLCAmc2FkZHIsICZkYWRkciwgSVBUT1NfTE9XREVMQVkpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IHRmdHBfc2VuZF9lcnJvcihzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQsCisJCQkgICB1X2ludDE2X3QgZXJyb3Jjb2RlLCBjb25zdCBjaGFyICptc2csCisJCQkgICBzdHJ1Y3QgdGZ0cF90ICpyZWN2X3RwKQoreworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHIsIGRhZGRyOworICBzdHJ1Y3QgbWJ1ZiAqbTsKKyAgc3RydWN0IHRmdHBfdCAqdHA7CisgIGludCBub2J5dGVzOworCisgIG0gPSBtX2dldCgpOworCisgIGlmICghbSkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1lbXNldChtLT5tX2RhdGEsIDAsIG0tPm1fc2l6ZSk7CisKKyAgbS0+bV9kYXRhICs9IElGX01BWExJTktIRFI7CisgIHRwID0gKHZvaWQgKiltLT5tX2RhdGE7CisgIG0tPm1fZGF0YSArPSBzaXplb2Yoc3RydWN0IHVkcGlwaGRyKTsKKworICB0cC0+dHBfb3AgPSBodG9ucyhURlRQX0VSUk9SKTsKKyAgdHAtPngudHBfZXJyb3IudHBfZXJyb3JfY29kZSA9IGh0b25zKGVycm9yY29kZSk7CisgIHBzdHJjcHkoKGNoYXIgKil0cC0+eC50cF9lcnJvci50cF9tc2csIHNpemVvZih0cC0+eC50cF9lcnJvci50cF9tc2cpLCBtc2cpOworCisgIHNhZGRyLnNpbl9hZGRyID0gcmVjdl90cC0+aXAuaXBfZHN0OworICBzYWRkci5zaW5fcG9ydCA9IHJlY3ZfdHAtPnVkcC51aF9kcG9ydDsKKworICBkYWRkci5zaW5fYWRkciA9IHNwdC0+Y2xpZW50X2lwOworICBkYWRkci5zaW5fcG9ydCA9IHNwdC0+Y2xpZW50X3BvcnQ7CisKKyAgbm9ieXRlcyA9IDI7CisKKyAgbS0+bV9sZW4gPSBzaXplb2Yoc3RydWN0IHRmdHBfdCkgLSA1MTQgKyAzICsgc3RybGVuKG1zZykgLQorICAgICAgICBzaXplb2Yoc3RydWN0IGlwKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKworICB1ZHBfb3V0cHV0MihOVUxMLCBtLCAmc2FkZHIsICZkYWRkciwgSVBUT1NfTE9XREVMQVkpOworCisgIHRmdHBfc2Vzc2lvbl90ZXJtaW5hdGUoc3B0KTsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZnRwX3NlbmRfZGF0YShzdHJ1Y3QgdGZ0cF9zZXNzaW9uICpzcHQsCisJCQkgIHVfaW50MTZfdCBibG9ja19uciwKKwkJCSAgc3RydWN0IHRmdHBfdCAqcmVjdl90cCkKK3sKKyAgc3RydWN0IHNvY2thZGRyX2luIHNhZGRyLCBkYWRkcjsKKyAgc3RydWN0IG1idWYgKm07CisgIHN0cnVjdCB0ZnRwX3QgKnRwOworICBpbnQgbm9ieXRlczsKKworICBpZiAoYmxvY2tfbnIgPCAxKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbSA9IG1fZ2V0KCk7CisKKyAgaWYgKCFtKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbWVtc2V0KG0tPm1fZGF0YSwgMCwgbS0+bV9zaXplKTsKKworICBtLT5tX2RhdGEgKz0gSUZfTUFYTElOS0hEUjsKKyAgdHAgPSAodm9pZCAqKW0tPm1fZGF0YTsKKyAgbS0+bV9kYXRhICs9IHNpemVvZihzdHJ1Y3QgdWRwaXBoZHIpOworCisgIHRwLT50cF9vcCA9IGh0b25zKFRGVFBfREFUQSk7CisgIHRwLT54LnRwX2RhdGEudHBfYmxvY2tfbnIgPSBodG9ucyhibG9ja19ucik7CisKKyAgc2FkZHIuc2luX2FkZHIgPSByZWN2X3RwLT5pcC5pcF9kc3Q7CisgIHNhZGRyLnNpbl9wb3J0ID0gcmVjdl90cC0+dWRwLnVoX2Rwb3J0OworCisgIGRhZGRyLnNpbl9hZGRyID0gc3B0LT5jbGllbnRfaXA7CisgIGRhZGRyLnNpbl9wb3J0ID0gc3B0LT5jbGllbnRfcG9ydDsKKworICBub2J5dGVzID0gdGZ0cF9yZWFkX2RhdGEoc3B0LCBibG9ja19uciAtIDEsIHRwLT54LnRwX2RhdGEudHBfYnVmLCA1MTIpOworCisgIGlmIChub2J5dGVzIDwgMCkgeworICAgIG1fZnJlZShtKTsKKworICAgIC8qIHNlbmQgImZpbGUgbm90IGZvdW5kIiBlcnJvciBiYWNrICovCisKKyAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAxLCAiRmlsZSBub3QgZm91bmQiLCB0cCk7CisKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBtLT5tX2xlbiA9IHNpemVvZihzdHJ1Y3QgdGZ0cF90KSAtICg1MTIgLSBub2J5dGVzKSAtCisgICAgICAgIHNpemVvZihzdHJ1Y3QgaXApIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCisgIHVkcF9vdXRwdXQyKE5VTEwsIG0sICZzYWRkciwgJmRhZGRyLCBJUFRPU19MT1dERUxBWSk7CisKKyAgaWYgKG5vYnl0ZXMgPT0gNTEyKSB7CisgICAgdGZ0cF9zZXNzaW9uX3VwZGF0ZShzcHQpOworICB9CisgIGVsc2UgeworICAgIHRmdHBfc2Vzc2lvbl90ZXJtaW5hdGUoc3B0KTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZnRwX2hhbmRsZV9ycnEoc3RydWN0IHRmdHBfdCAqdHAsIGludCBwa3RsZW4pCit7CisgIHN0cnVjdCB0ZnRwX3Nlc3Npb24gKnNwdDsKKyAgaW50IHMsIGssIG47CisgIHVfaW50OF90ICpzcmMsICpkc3Q7CisKKyAgcyA9IHRmdHBfc2Vzc2lvbl9hbGxvY2F0ZSh0cCk7CisKKyAgaWYgKHMgPCAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3B0ID0gJnRmdHBfc2Vzc2lvbnNbc107CisKKyAgc3JjID0gdHAtPngudHBfYnVmOworICBkc3QgPSBzcHQtPmZpbGVuYW1lOworICBuID0gcGt0bGVuIC0gKCh1aW50OF90ICopJnRwLT54LnRwX2J1ZlswXSAtICh1aW50OF90ICopdHApOworCisgIC8qIGdldCBuYW1lICovCisKKyAgZm9yIChrID0gMDsgayA8IG47IGsrKykgeworICAgIGlmIChrIDwgVEZUUF9GSUxFTkFNRV9NQVgpIHsKKyAgICAgIGRzdFtrXSA9IHNyY1trXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNyY1trXSA9PSAnXDAnKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoayA+PSBuKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaysrOworCisgIC8qIGNoZWNrIG1vZGUgKi8KKyAgaWYgKChuIC0gaykgPCA2KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1lbWNtcCgmc3JjW2tdLCAib2N0ZXRcMCIsIDYpICE9IDApIHsKKyAgICAgIHRmdHBfc2VuZF9lcnJvcihzcHQsIDQsICJVbnN1cHBvcnRlZCB0cmFuc2ZlciBtb2RlIiwgdHApOworICAgICAgcmV0dXJuOworICB9CisKKyAgayArPSA2OyAvKiBza2lwcGluZyBvY3RldCAqLworCisgIC8qIGRvIHNhbml0eSBjaGVja3Mgb24gdGhlIGZpbGVuYW1lICovCisKKyAgaWYgKChzcHQtPmZpbGVuYW1lWzBdICE9ICcvJykKKyAgICAgIHx8IChzcHQtPmZpbGVuYW1lW3N0cmxlbigoY2hhciAqKXNwdC0+ZmlsZW5hbWUpIC0gMV0gPT0gJy8nKQorICAgICAgfHwgIHN0cnN0cigoY2hhciAqKXNwdC0+ZmlsZW5hbWUsICIvLi4vIikpIHsKKyAgICAgIHRmdHBfc2VuZF9lcnJvcihzcHQsIDIsICJBY2Nlc3MgdmlvbGF0aW9uIiwgdHApOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyogb25seSBhbGxvdyBleHBvcnRlZCBwcmVmaXhlcyAqLworCisgIGlmICghdGZ0cF9wcmVmaXgpIHsKKyAgICAgIHRmdHBfc2VuZF9lcnJvcihzcHQsIDIsICJBY2Nlc3MgdmlvbGF0aW9uIiwgdHApOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyogY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzICovCisKKyAgaWYgKHRmdHBfcmVhZF9kYXRhKHNwdCwgMCwgc3B0LT5maWxlbmFtZSwgMCkgPCAwKSB7CisgICAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAxLCAiRmlsZSBub3QgZm91bmQiLCB0cCk7CisgICAgICByZXR1cm47CisgIH0KKworICBpZiAoc3JjW24gLSAxXSAhPSAwKSB7CisgICAgICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAyLCAiQWNjZXNzIHZpb2xhdGlvbiIsIHRwKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlIChrIDwgbikgeworICAgICAgY29uc3QgY2hhciAqa2V5LCAqdmFsdWU7CisKKyAgICAgIGtleSA9IChjaGFyICopc3JjICsgazsKKyAgICAgIGsgKz0gc3RybGVuKGtleSkgKyAxOworCisgICAgICBpZiAoayA+PSBuKSB7CisJICB0ZnRwX3NlbmRfZXJyb3Ioc3B0LCAyLCAiQWNjZXNzIHZpb2xhdGlvbiIsIHRwKTsKKwkgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFsdWUgPSAoY2hhciAqKXNyYyArIGs7CisgICAgICBrICs9IHN0cmxlbih2YWx1ZSkgKyAxOworCisgICAgICBpZiAoc3RyY21wKGtleSwgInRzaXplIikgPT0gMCkgeworCSAgaW50IHRzaXplID0gYXRvaSh2YWx1ZSk7CisJICBzdHJ1Y3Qgc3RhdCBzdGF0X3A7CisKKwkgIGlmICh0c2l6ZSA9PSAwICYmIHRmdHBfcHJlZml4KSB7CisJICAgICAgY2hhciBidWZmZXJbMTAyNF07CisJICAgICAgaW50IGxlbjsKKworCSAgICAgIGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcy8lcyIsCisJCQkgICAgIHRmdHBfcHJlZml4LCBzcHQtPmZpbGVuYW1lKTsKKworCSAgICAgIGlmIChzdGF0KGJ1ZmZlciwgJnN0YXRfcCkgPT0gMCkKKwkJICB0c2l6ZSA9IHN0YXRfcC5zdF9zaXplOworCSAgICAgIGVsc2UgeworCQkgIHRmdHBfc2VuZF9lcnJvcihzcHQsIDEsICJGaWxlIG5vdCBmb3VuZCIsIHRwKTsKKwkJICByZXR1cm47CisJICAgICAgfQorCSAgfQorCisJICB0ZnRwX3NlbmRfb2FjayhzcHQsICJ0c2l6ZSIsIHRzaXplLCB0cCk7CisgICAgICB9CisgIH0KKworICB0ZnRwX3NlbmRfZGF0YShzcHQsIDEsIHRwKTsKK30KKworc3RhdGljIHZvaWQgdGZ0cF9oYW5kbGVfYWNrKHN0cnVjdCB0ZnRwX3QgKnRwLCBpbnQgcGt0bGVuKQoreworICBpbnQgczsKKworICBzID0gdGZ0cF9zZXNzaW9uX2ZpbmQodHApOworCisgIGlmIChzIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0ZnRwX3NlbmRfZGF0YSgmdGZ0cF9zZXNzaW9uc1tzXSwKKwkJICAgICBudG9ocyh0cC0+eC50cF9kYXRhLnRwX2Jsb2NrX25yKSArIDEsCisJCSAgICAgdHApIDwgMCkgeworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIHRmdHBfaW5wdXQoc3RydWN0IG1idWYgKm0pCit7CisgIHN0cnVjdCB0ZnRwX3QgKnRwID0gKHN0cnVjdCB0ZnRwX3QgKiltLT5tX2RhdGE7CisKKyAgc3dpdGNoKG50b2hzKHRwLT50cF9vcCkpIHsKKyAgY2FzZSBURlRQX1JSUToKKyAgICB0ZnRwX2hhbmRsZV9ycnEodHAsIG0tPm1fbGVuKTsKKyAgICBicmVhazsKKworICBjYXNlIFRGVFBfQUNLOgorICAgIHRmdHBfaGFuZGxlX2Fjayh0cCwgbS0+bV9sZW4pOworICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3NsaXJwL3RmdHAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdGZ0cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjY3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3RmdHAuaApAQCAtMCwwICsxLDMzIEBACisvKiB0ZnRwIGRlZmluZXMgKi8KKworI2RlZmluZSBURlRQX1NFU1NJT05TX01BWCAzCisKKyNkZWZpbmUgVEZUUF9TRVJWRVIJNjkKKworI2RlZmluZSBURlRQX1JSUSAgICAxCisjZGVmaW5lIFRGVFBfV1JRICAgIDIKKyNkZWZpbmUgVEZUUF9EQVRBICAgMworI2RlZmluZSBURlRQX0FDSyAgICA0CisjZGVmaW5lIFRGVFBfRVJST1IgIDUKKyNkZWZpbmUgVEZUUF9PQUNLICAgNgorCisjZGVmaW5lIFRGVFBfRklMRU5BTUVfTUFYIDUxMgorCitzdHJ1Y3QgdGZ0cF90IHsKKyAgc3RydWN0IGlwIGlwOworICBzdHJ1Y3QgdWRwaGRyIHVkcDsKKyAgdV9pbnQxNl90IHRwX29wOworICB1bmlvbiB7CisgICAgc3RydWN0IHsKKyAgICAgIHVfaW50MTZfdCB0cF9ibG9ja19ucjsKKyAgICAgIHVfaW50OF90IHRwX2J1Zls1MTJdOworICAgIH0gdHBfZGF0YTsKKyAgICBzdHJ1Y3QgeworICAgICAgdV9pbnQxNl90IHRwX2Vycm9yX2NvZGU7CisgICAgICB1X2ludDhfdCB0cF9tc2dbNTEyXTsKKyAgICB9IHRwX2Vycm9yOworICAgIHVfaW50OF90IHRwX2J1Zls1MTIgKyAyXTsKKyAgfSB4OworfTsKKwordm9pZCB0ZnRwX2lucHV0KHN0cnVjdCBtYnVmICptKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc2xpcnAvdWRwLmMgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3VkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZTc4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3NsaXJwL3VkcC5jCkBAIC0wLDAgKzEsNjcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg4LCAxOTkwLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXVkcF91c3JyZXEuYwk4LjQgKEJlcmtlbGV5KSAxLzIxLzk0CisgKiB1ZHBfdXNycmVxLmMsdiAxLjQgMTk5NC8xMC8wMiAxNzo0ODo0NSBwaGsgRXhwCisgKi8KKworLyoKKyAqIENoYW5nZXMgYW5kIGFkZGl0aW9ucyByZWxhdGluZyB0byBTTGlSUAorICogQ29weXJpZ2h0IChjKSAxOTk1IERhbm55IEdhc3Bhcm92c2tpLgorICoKKyAqIFBsZWFzZSByZWFkIHRoZSBmaWxlIENPUFlSSUdIVCBmb3IgdGhlCisgKiB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgY29weXJpZ2h0LgorICovCisKKyNpbmNsdWRlIDxzbGlycC5oPgorI2luY2x1ZGUgImlwX2ljbXAuaCIKKworI2lmZGVmIExPR19FTkFCTEVECitzdHJ1Y3QgdWRwc3RhdCB1ZHBzdGF0OworI2VuZGlmCisKK3N0cnVjdCBzb2NrZXQgdWRiOworCitzdGF0aWMgdV9pbnQ4X3QgdWRwX3RvcyhzdHJ1Y3Qgc29ja2V0ICpzbyk7CitzdGF0aWMgdm9pZCB1ZHBfZW11KHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSk7CisKKy8qCisgKiBVRFAgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24uCisgKiBQZXIgUkZDIDc2OCwgQXVndXN0LCAxOTgwLgorICovCisjaWZuZGVmCUNPTVBBVF80MgorI2RlZmluZSBVRFBDS1NVTSAxCisjZWxzZQorI2RlZmluZSBVRFBDS1NVTSAwIC8qIFhYWCAqLworI2VuZGlmCisKK3N0cnVjdAlzb2NrZXQgKnVkcF9sYXN0X3NvID0gJnVkYjsKKwordm9pZAordWRwX2luaXQodm9pZCkKK3sKKwl1ZGIuc29fbmV4dCA9IHVkYi5zb19wcmV2ID0gJnVkYjsKK30KKy8qIG0tPm1fZGF0YSAgcG9pbnRzIGF0IGlwIHBhY2tldCBoZWFkZXIKKyAqIG0tPm1fbGVuICAgbGVuZ3RoIGlwIHBhY2tldAorICogaXAtPmlwX2xlbiBsZW5ndGggZGF0YSAoSVBEVSkKKyAqLwordm9pZAordWRwX2lucHV0KHJlZ2lzdGVyIHN0cnVjdCBtYnVmICptLCBpbnQgaXBobGVuKQoreworCXJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CisJcmVnaXN0ZXIgc3RydWN0IHVkcGhkciAqdWg7CisvKglzdHJ1Y3QgbWJ1ZiAqb3B0cyA9IDA7Ki8KKwlpbnQgbGVuOworCXN0cnVjdCBpcCBzYXZlX2lwOworCXN0cnVjdCBzb2NrZXQgKnNvOworCisJREVCVUdfQ0FMTCgidWRwX2lucHV0Iik7CisJREVCVUdfQVJHKCJtID0gJWx4IiwgKGxvbmcpbSk7CisJREVCVUdfQVJHKCJpcGhsZW4gPSAlZCIsIGlwaGxlbik7CisKKwlTVEFUKHVkcHN0YXQudWRwc19pcGFja2V0cysrKTsKKworCS8qCisJICogU3RyaXAgSVAgb3B0aW9ucywgaWYgYW55OyBzaG91bGQgc2tpcCB0aGlzLAorCSAqIG1ha2UgYXZhaWxhYmxlIHRvIHVzZXIsIGFuZCB1c2Ugb24gcmV0dXJuZWQgcGFja2V0cywKKwkgKiBidXQgd2UgZG9uJ3QgeWV0IGhhdmUgYSB3YXkgdG8gY2hlY2sgdGhlIGNoZWNrc3VtCisJICogd2l0aCBvcHRpb25zIHN0aWxsIHByZXNlbnQuCisJICovCisJaWYoaXBobGVuID4gc2l6ZW9mKHN0cnVjdCBpcCkpIHsKKwkJaXBfc3RyaXBvcHRpb25zKG0sIChzdHJ1Y3QgbWJ1ZiAqKTApOworCQlpcGhsZW4gPSBzaXplb2Yoc3RydWN0IGlwKTsKKwl9CisKKwkvKgorCSAqIEdldCBJUCBhbmQgVURQIGhlYWRlciB0b2dldGhlciBpbiBmaXJzdCBtYnVmLgorCSAqLworCWlwID0gbXRvZChtLCBzdHJ1Y3QgaXAgKik7CisJdWggPSAoc3RydWN0IHVkcGhkciAqKSgoY2FkZHJfdClpcCArIGlwaGxlbik7CisKKwkvKgorCSAqIE1ha2UgbWJ1ZiBkYXRhIGxlbmd0aCByZWZsZWN0IFVEUCBsZW5ndGguCisJICogSWYgbm90IGVub3VnaCBkYXRhIHRvIHJlZmxlY3QgVURQIGxlbmd0aCwgZHJvcC4KKwkgKi8KKwlsZW4gPSBudG9ocygodV9pbnQxNl90KXVoLT51aF91bGVuKTsKKworCWlmIChpcC0+aXBfbGVuICE9IGxlbikgeworCQlpZiAobGVuID4gaXAtPmlwX2xlbikgeworCQkJU1RBVCh1ZHBzdGF0LnVkcHNfYmFkbGVuKyspOworCQkJZ290byBiYWQ7CisJCX0KKwkJbV9hZGoobSwgbGVuIC0gaXAtPmlwX2xlbik7CisJCWlwLT5pcF9sZW4gPSBsZW47CisJfQorCisJLyoKKwkgKiBTYXZlIGEgY29weSBvZiB0aGUgSVAgaGVhZGVyIGluIGNhc2Ugd2Ugd2FudCByZXN0b3JlIGl0CisJICogZm9yIHNlbmRpbmcgYW4gSUNNUCBlcnJvciBtZXNzYWdlIGluIHJlc3BvbnNlLgorCSAqLworCXNhdmVfaXAgPSAqaXA7CisJc2F2ZV9pcC5pcF9sZW4rPSBpcGhsZW47ICAgICAgICAgLyogdGNwX2lucHV0IHN1YnRyYWN0cyB0aGlzICovCisKKwkvKgorCSAqIENoZWNrc3VtIGV4dGVuZGVkIFVEUCBoZWFkZXIgYW5kIGRhdGEuCisJICovCisJaWYgKFVEUENLU1VNICYmIHVoLT51aF9zdW0pIHsKKyAgICAgIG1lbXNldCgmKChzdHJ1Y3QgaXBvdmx5ICopaXApLT5paF9tYnVmLCAwLCBzaXplb2Yoc3RydWN0IG1idWZfcHRyKSk7CisJICAoKHN0cnVjdCBpcG92bHkgKilpcCktPmloX3gxID0gMDsKKwkgICgoc3RydWN0IGlwb3ZseSAqKWlwKS0+aWhfbGVuID0gdWgtPnVoX3VsZW47CisJICAvKiBrZWVwIHVoX3N1bSBmb3IgSUNNUCByZXBseQorCSAgICogdWgtPnVoX3N1bSA9IGNrc3VtKG0sIGxlbiArIHNpemVvZiAoc3RydWN0IGlwKSk7CisJICAgKiBpZiAodWgtPnVoX3N1bSkgeworCSAgICovCisJICBpZihja3N1bShtLCBsZW4gKyBzaXplb2Yoc3RydWN0IGlwKSkpIHsKKwkgICAgU1RBVCh1ZHBzdGF0LnVkcHNfYmFkc3VtKyspOworCSAgICBnb3RvIGJhZDsKKwkgIH0KKwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIGhhbmRsZSBESENQL0JPT1RQCisgICAgICAgICAqLworICAgICAgICBpZiAobnRvaHModWgtPnVoX2Rwb3J0KSA9PSBCT09UUF9TRVJWRVIpIHsKKyAgICAgICAgICAgIGJvb3RwX2lucHV0KG0pOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2xpcnBfcmVzdHJpY3QpCisgICAgICAgICAgICBnb3RvIGJhZDsKKworICAgICAgICAvKgorICAgICAgICAgKiAgaGFuZGxlIFRGVFAKKyAgICAgICAgICovCisgICAgICAgIGlmIChudG9ocyh1aC0+dWhfZHBvcnQpID09IFRGVFBfU0VSVkVSKSB7CisgICAgICAgICAgICB0ZnRwX2lucHV0KG0pOworICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgIH0KKworCS8qCisJICogTG9jYXRlIHBjYiBmb3IgZGF0YWdyYW0uCisJICovCisJc28gPSB1ZHBfbGFzdF9zbzsKKwlpZiAoc28tPnNvX2xwb3J0ICE9IHVoLT51aF9zcG9ydCB8fAorCSAgICBzby0+c29fbGFkZHIuc19hZGRyICE9IGlwLT5pcF9zcmMuc19hZGRyKSB7CisJCXN0cnVjdCBzb2NrZXQgKnRtcDsKKworCQlmb3IgKHRtcCA9IHVkYi5zb19uZXh0OyB0bXAgIT0gJnVkYjsgdG1wID0gdG1wLT5zb19uZXh0KSB7CisJCQlpZiAodG1wLT5zb19scG9ydCA9PSB1aC0+dWhfc3BvcnQgJiYKKwkJCSAgICB0bXAtPnNvX2xhZGRyLnNfYWRkciA9PSBpcC0+aXBfc3JjLnNfYWRkcikgeworCQkJCXRtcC0+c29fZmFkZHIuc19hZGRyID0gaXAtPmlwX2RzdC5zX2FkZHI7CisJCQkJdG1wLT5zb19mcG9ydCA9IHVoLT51aF9kcG9ydDsKKwkJCQlzbyA9IHRtcDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodG1wID09ICZ1ZGIpIHsKKwkJICBzbyA9IE5VTEw7CisJCX0gZWxzZSB7CisJCSAgU1RBVCh1ZHBzdGF0LnVkcHBzX3BjYmNhY2hlbWlzcysrKTsKKwkJICB1ZHBfbGFzdF9zbyA9IHNvOworCQl9CisJfQorCisJaWYgKHNvID09IE5VTEwpIHsKKwkgIC8qCisJICAgKiBJZiB0aGVyZSdzIG5vIHNvY2tldCBmb3IgdGhpcyBwYWNrZXQsCisJICAgKiBjcmVhdGUgb25lCisJICAgKi8KKwkgIGlmICgoc28gPSBzb2NyZWF0ZSgpKSA9PSBOVUxMKSBnb3RvIGJhZDsKKwkgIGlmKHVkcF9hdHRhY2goc28pID09IC0xKSB7CisJICAgIERFQlVHX01JU0MoKGRmZCwiIHVkcF9hdHRhY2ggZXJybm8gPSAlZC0lc1xuIiwKKwkJCWVycm5vLHN0cmVycm9yKGVycm5vKSkpOworCSAgICBzb2ZyZWUoc28pOworCSAgICBnb3RvIGJhZDsKKwkgIH0KKworCSAgLyoKKwkgICAqIFNldHVwIGZpZWxkcworCSAgICovCisJICAvKiB1ZHBfbGFzdF9zbyA9IHNvOyAqLworCSAgc28tPnNvX2xhZGRyID0gaXAtPmlwX3NyYzsKKwkgIHNvLT5zb19scG9ydCA9IHVoLT51aF9zcG9ydDsKKworCSAgaWYgKChzby0+c29faXB0b3MgPSB1ZHBfdG9zKHNvKSkgPT0gMCkKKwkgICAgc28tPnNvX2lwdG9zID0gaXAtPmlwX3RvczsKKworCSAgLyoKKwkgICAqIFhYWFhYIEhlcmUsIGNoZWNrIGlmIGl0J3MgaW4gdWRwZXhlY19saXN0LAorCSAgICogYW5kIGlmIGl0IGlzLCBkbyB0aGUgZm9ya19leGVjKCkgZXRjLgorCSAgICovCisJfQorCisgICAgICAgIHNvLT5zb19mYWRkciA9IGlwLT5pcF9kc3Q7IC8qIFhYWCAqLworICAgICAgICBzby0+c29fZnBvcnQgPSB1aC0+dWhfZHBvcnQ7IC8qIFhYWCAqLworCisJaXBobGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwltLT5tX2xlbiAtPSBpcGhsZW47CisJbS0+bV9kYXRhICs9IGlwaGxlbjsKKworCS8qCisJICogTm93IHdlIHNlbmR0bygpIHRoZSBwYWNrZXQuCisJICovCisJaWYgKHNvLT5zb19lbXUpCisJICAgdWRwX2VtdShzbywgbSk7CisKKwlpZihzb3NlbmR0byhzbyxtKSA9PSAtMSkgeworCSAgbS0+bV9sZW4gKz0gaXBobGVuOworCSAgbS0+bV9kYXRhIC09IGlwaGxlbjsKKwkgICppcD1zYXZlX2lwOworCSAgREVCVUdfTUlTQygoZGZkLCJ1ZHAgdHggZXJybm8gPSAlZC0lc1xuIixlcnJubyxzdHJlcnJvcihlcnJubykpKTsKKwkgIGljbXBfZXJyb3IobSwgSUNNUF9VTlJFQUNILElDTVBfVU5SRUFDSF9ORVQsIDAsc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwltX2ZyZWUoc28tPnNvX20pOyAgIC8qIHVzZWQgZm9yIElDTVAgaWYgZXJyb3Igb24gc29yZWN2ZnJvbSAqLworCisJLyogcmVzdG9yZSB0aGUgb3JpZyBtYnVmIHBhY2tldCAqLworCW0tPm1fbGVuICs9IGlwaGxlbjsKKwltLT5tX2RhdGEgLT0gaXBobGVuOworCSppcD1zYXZlX2lwOworCXNvLT5zb19tPW07ICAgICAgICAgLyogSUNNUCBiYWNrdXAgKi8KKworCXJldHVybjsKK2JhZDoKKwltX2ZyZWVtKG0pOworCS8qIGlmIChvcHRzKSBtX2ZyZWVtKG9wdHMpOyAqLworCXJldHVybjsKK30KKworaW50IHVkcF9vdXRwdXQyKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRhZGRyLAorICAgICAgICAgICAgICAgIGludCBpcHRvcykKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgdWRwaXBoZHIgKnVpOworCWludCBlcnJvciA9IDA7CisKKwlERUJVR19DQUxMKCJ1ZHBfb3V0cHV0Iik7CisJREVCVUdfQVJHKCJzbyA9ICVseCIsIChsb25nKXNvKTsKKwlERUJVR19BUkcoIm0gPSAlbHgiLCAobG9uZyltKTsKKwlERUJVR19BUkcoInNhZGRyID0gJWx4IiwgKGxvbmcpc2FkZHItPnNpbl9hZGRyLnNfYWRkcik7CisJREVCVUdfQVJHKCJkYWRkciA9ICVseCIsIChsb25nKWRhZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCisJLyoKKwkgKiBBZGp1c3QgZm9yIGhlYWRlcgorCSAqLworCW0tPm1fZGF0YSAtPSBzaXplb2Yoc3RydWN0IHVkcGlwaGRyKTsKKwltLT5tX2xlbiArPSBzaXplb2Yoc3RydWN0IHVkcGlwaGRyKTsKKworCS8qCisJICogRmlsbCBpbiBtYnVmIHdpdGggZXh0ZW5kZWQgVURQIGhlYWRlcgorCSAqIGFuZCBhZGRyZXNzZXMgYW5kIGxlbmd0aCBwdXQgaW50byBuZXR3b3JrIGZvcm1hdC4KKwkgKi8KKwl1aSA9IG10b2QobSwgc3RydWN0IHVkcGlwaGRyICopOworICAgIG1lbXNldCgmdWktPnVpX2kuaWhfbWJ1ZiwgMCAsIHNpemVvZihzdHJ1Y3QgbWJ1Zl9wdHIpKTsKKwl1aS0+dWlfeDEgPSAwOworCXVpLT51aV9wciA9IElQUFJPVE9fVURQOworCXVpLT51aV9sZW4gPSBodG9ucyhtLT5tX2xlbiAtIHNpemVvZihzdHJ1Y3QgaXApKTsgLyogKyBzaXplb2YgKHN0cnVjdCB1ZHBoZHIpKTsgKi8KKwkvKiBYWFhYWCBDaGVjayBmb3IgZnJvbS1vbmUtbG9jYXRpb24gc29ja2V0cywgb3IgZnJvbS1hbnktbG9jYXRpb24gc29ja2V0cyAqLworICAgICAgICB1aS0+dWlfc3JjID0gc2FkZHItPnNpbl9hZGRyOworCXVpLT51aV9kc3QgPSBkYWRkci0+c2luX2FkZHI7CisJdWktPnVpX3Nwb3J0ID0gc2FkZHItPnNpbl9wb3J0OworCXVpLT51aV9kcG9ydCA9IGRhZGRyLT5zaW5fcG9ydDsKKwl1aS0+dWlfdWxlbiA9IHVpLT51aV9sZW47CisKKwkvKgorCSAqIFN0dWZmIGNoZWNrc3VtIGFuZCBvdXRwdXQgZGF0YWdyYW0uCisJICovCisJdWktPnVpX3N1bSA9IDA7CisJaWYgKFVEUENLU1VNKSB7CisJICAgIGlmICgodWktPnVpX3N1bSA9IGNrc3VtKG0sIC8qIHNpemVvZiAoc3RydWN0IHVkcGlwaGRyKSArICovIG0tPm1fbGVuKSkgPT0gMCkKKwkJdWktPnVpX3N1bSA9IDB4ZmZmZjsKKwl9CisJKChzdHJ1Y3QgaXAgKil1aSktPmlwX2xlbiA9IG0tPm1fbGVuOworCisJKChzdHJ1Y3QgaXAgKil1aSktPmlwX3R0bCA9IElQREVGVFRMOworCSgoc3RydWN0IGlwICopdWkpLT5pcF90b3MgPSBpcHRvczsKKworCVNUQVQodWRwc3RhdC51ZHBzX29wYWNrZXRzKyspOworCisJZXJyb3IgPSBpcF9vdXRwdXQoc28sIG0pOworCisJcmV0dXJuIChlcnJvcik7Cit9CisKK2ludCB1ZHBfb3V0cHV0KHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSwKKyAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcikKKworeworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBzYWRkciwgZGFkZHI7CisKKyAgICBzYWRkciA9ICphZGRyOworICAgIGlmICgoc28tPnNvX2ZhZGRyLnNfYWRkciAmIGh0b25sKDB4ZmZmZmZmMDApKSA9PSBzcGVjaWFsX2FkZHIuc19hZGRyKSB7CisgICAgICAgIGlmICgoc28tPnNvX2ZhZGRyLnNfYWRkciAmIGh0b25sKDB4MDAwMDAwZmYpKSA9PSBodG9ubCgweGZmKSkKKyAgICAgICAgICAgIHNhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGFsaWFzX2FkZHIuc19hZGRyOworICAgICAgICBlbHNlIGlmIChhZGRyLT5zaW5fYWRkci5zX2FkZHIgPT0gbG9vcGJhY2tfYWRkci5zX2FkZHIgfHwKKyAgICAgICAgICAgICAgICAgKG50b2hsKHNvLT5zb19mYWRkci5zX2FkZHIpICYgMHhmZikgIT0gQ1RMX0FMSUFTKQorICAgICAgICAgICAgc2FkZHIuc2luX2FkZHIuc19hZGRyID0gc28tPnNvX2ZhZGRyLnNfYWRkcjsKKyAgICB9CisgICAgZGFkZHIuc2luX2FkZHIgPSBzby0+c29fbGFkZHI7CisgICAgZGFkZHIuc2luX3BvcnQgPSBzby0+c29fbHBvcnQ7CisKKyAgICByZXR1cm4gdWRwX291dHB1dDIoc28sIG0sICZzYWRkciwgJmRhZGRyLCBzby0+c29faXB0b3MpOworfQorCitpbnQKK3VkcF9hdHRhY2goc3RydWN0IHNvY2tldCAqc28pCit7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCisgIGlmKChzby0+cyA9IHNvY2tldChBRl9JTkVULFNPQ0tfREdSQU0sMCkpICE9IC0xKSB7CisgICAgLyoKKyAgICAgKiBIZXJlLCB3ZSBiaW5kKCkgdGhlIHNvY2tldC4gIEFsdGhvdWdoIG5vdCByZWFsbHkgbmVlZGVkCisgICAgICogKHNlbmR0bygpIG9uIGFuIHVuYm91bmQgc29ja2V0IHdpbGwgYmluZCBpdCksIGl0J3MgZG9uZQorICAgICAqIGhlcmUgc28gdGhhdCBlbXVsYXRpb24gb2YgeXRhbGsgZXRjLiBkb24ndCBoYXZlIHRvIGRvIGl0CisgICAgICovCisgICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBhZGRyLnNpbl9wb3J0ID0gMDsKKyAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgICAgaWYoYmluZChzby0+cywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpPDApIHsKKyAgICAgIGludCBsYXN0ZXJybm89ZXJybm87CisgICAgICBjbG9zZXNvY2tldChzby0+cyk7CisgICAgICBzby0+cz0tMTsKKyNpZmRlZiBfV0lOMzIKKyAgICAgIFdTQVNldExhc3RFcnJvcihsYXN0ZXJybm8pOworI2Vsc2UKKyAgICAgIGVycm5vPWxhc3RlcnJubzsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAvKiBzdWNjZXNzLCBpbnNlcnQgaW4gcXVldWUgKi8KKyAgICAgIHNvLT5zb19leHBpcmUgPSBjdXJ0aW1lICsgU09fRVhQSVJFOworICAgICAgaW5zcXVlKHNvLCZ1ZGIpOworICAgIH0KKyAgfQorICByZXR1cm4oc28tPnMpOworfQorCit2b2lkCit1ZHBfZGV0YWNoKHN0cnVjdCBzb2NrZXQgKnNvKQoreworCWNsb3Nlc29ja2V0KHNvLT5zKTsKKwkvKiBpZiAoc28tPnNvX20pIG1fZnJlZShzby0+c29fbSk7ICAgIGRvbmUgYnkgc29mcmVlICovCisKKwlzb2ZyZWUoc28pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRvc190IHVkcHRvc1tdID0geworCXswLCA1MywgSVBUT1NfTE9XREVMQVksIDB9LAkJCS8qIEROUyAqLworCXs1MTcsIDUxNywgSVBUT1NfTE9XREVMQVksIEVNVV9UQUxLfSwJLyogdGFsayAqLworCXs1MTgsIDUxOCwgSVBUT1NfTE9XREVMQVksIEVNVV9OVEFMS30sCS8qIG50YWxrICovCisJezAsIDc2NDgsIElQVE9TX0xPV0RFTEFZLCBFTVVfQ1VTRUVNRX0sCS8qIEN1LVNlZW1lICovCisJezAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgdV9pbnQ4X3QKK3VkcF90b3Moc3RydWN0IHNvY2tldCAqc28pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUodWRwdG9zW2ldLnRvcykgeworCQlpZiAoKHVkcHRvc1tpXS5mcG9ydCAmJiBudG9ocyhzby0+c29fZnBvcnQpID09IHVkcHRvc1tpXS5mcG9ydCkgfHwKKwkJICAgICh1ZHB0b3NbaV0ubHBvcnQgJiYgbnRvaHMoc28tPnNvX2xwb3J0KSA9PSB1ZHB0b3NbaV0ubHBvcnQpKSB7CisJCSAgICAJc28tPnNvX2VtdSA9IHVkcHRvc1tpXS5lbXU7CisJCQlyZXR1cm4gdWRwdG9zW2ldLnRvczsKKwkJfQorCQlpKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBFTVVMQVRFX1RBTEsKKyNpbmNsdWRlICJ0YWxrZC5oIgorI2VuZGlmCisKKy8qCisgKiBIZXJlLCB0YWxrL3l0YWxrL250YWxrIHJlcXVlc3RzIG11c3QgYmUgZW11bGF0ZWQKKyAqLworc3RhdGljIHZvaWQKK3VkcF9lbXUoc3RydWN0IHNvY2tldCAqc28sIHN0cnVjdCBtYnVmICptKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworI2lmZGVmIEVNVUxBVEVfVEFMSworCUNUTF9NU0dfT0xEICpvbXNnOworCUNUTF9NU0cgKm5tc2c7CisJY2hhciBidWZmW3NpemVvZihDVExfTVNHKV07CisJdV9jaGFyIHR5cGU7CisKK3N0cnVjdCB0YWxrX3JlcXVlc3QgeworCXN0cnVjdCB0YWxrX3JlcXVlc3QgKm5leHQ7CisJc3RydWN0IHNvY2tldCAqdWRwX3NvOworCXN0cnVjdCBzb2NrZXQgKnRjcF9zbzsKK30gKnJlcTsKKworCXN0YXRpYyBzdHJ1Y3QgdGFsa19yZXF1ZXN0ICpyZXFfdGJsID0gMDsKKworI2VuZGlmCisKK3N0cnVjdCBjdV9oZWFkZXIgeworCXVpbnQxNl90CWRfZmFtaWx5OwkJLy8gZGVzdGluYXRpb24gZmFtaWx5CisJdWludDE2X3QJZF9wb3J0OwkJCS8vIGRlc3RpbmF0aW9uIHBvcnQKKwl1aW50MzJfdAlkX2FkZHI7CQkJLy8gZGVzdGluYXRpb24gYWRkcmVzcworCXVpbnQxNl90CXNfZmFtaWx5OwkJLy8gc291cmNlIGZhbWlseQorCXVpbnQxNl90CXNfcG9ydDsJCQkvLyBzb3VyY2UgcG9ydAorCXVpbnQzMl90CXNvX2FkZHI7CQkvLyBzb3VyY2UgYWRkcmVzcworCXVpbnQzMl90CXNlcW47CQkJLy8gc2VxdWVuY2UgbnVtYmVyCisJdWludDE2X3QJbWVzc2FnZTsJCS8vIG1lc3NhZ2UKKwl1aW50MTZfdAlkYXRhX3R5cGU7CQkvLyBkYXRhIHR5cGUKKwl1aW50MTZfdAlwa3RfbGVuOwkJLy8gcGFja2V0IGxlbmd0aAorfSAqY3VfaGVhZDsKKworCXN3aXRjaChzby0+c29fZW11KSB7CisKKyNpZmRlZiBFTVVMQVRFX1RBTEsKKwkgY2FzZSBFTVVfVEFMSzoKKwkgY2FzZSBFTVVfTlRBTEs6CisJCS8qCisJCSAqIFRhbGsgZW11bGF0aW9uLiBXZSBhbHdheXMgY2hhbmdlIHRoZSBjdGxfYWRkciB0byBnZXQKKwkJICogc29tZSBhbnN3ZXJzIGZyb20gdGhlIGRhZW1vbi4gV2hlbiBhbiBBTk5PVU5DRSBjb21lcywKKwkJICogd2Ugc2VuZCBMRUFWRV9JTlZJVEUgdG8gdGhlIGxvY2FsIGRhZW1vbnMuIEFsc28gd2hlbiBhCisJCSAqIERFTEVURSBjb21lcywgd2Ugc2VuZCBjb3BpZXMgdG8gdGhlIGxvY2FsIGRhZW1vbnMuCisJCSAqLworCQlpZiAoZ2V0c29ja25hbWUoc28tPnMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pIDwgMCkKKwkJCXJldHVybjsKKworI2RlZmluZQlJU19PTEQJKHNvLT5zb19lbXUgPT0gRU1VX1RBTEspCisKKyNkZWZpbmUgQ09QWV9NU0coZGVzdCwgc3JjKSB7IGRlc3QtPnR5cGUgPSBzcmMtPnR5cGU7IFwKKwkJCSAgICAgIGRlc3QtPmlkX251bSA9IHNyYy0+aWRfbnVtOyBcCisJCQkgICAgICBkZXN0LT5waWQgPSBzcmMtPnBpZDsgXAorCQkJICAgICAgZGVzdC0+YWRkciA9IHNyYy0+YWRkcjsgXAorCQkJICAgICAgZGVzdC0+Y3RsX2FkZHIgPSBzcmMtPmN0bF9hZGRyOyBcCisJCQkgICAgICBtZW1jcHkoJmRlc3QtPmxfbmFtZSwgJnNyYy0+bF9uYW1lLCBOQU1FX1NJWkVfT0xEKTsgXAorCQkJICAgICAgbWVtY3B5KCZkZXN0LT5yX25hbWUsICZzcmMtPnJfbmFtZSwgTkFNRV9TSVpFX09MRCk7IFwKKwkgICAgICAgICAJICAgICAgbWVtY3B5KCZkZXN0LT5yX3R0eSwgJnNyYy0+cl90dHksIFRUWV9TSVpFKTsgfQorCisjZGVmaW5lIE9UT1NJTihwdHIsIGZpZWxkKSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZwdHItPmZpZWxkKQorLyogb2xkX3NvY2thZGRyIHRvIHNvY2thZGRyX2luICovCisKKworCQlpZiAoSVNfT0xEKSB7ICAJCS8qIG9sZCB0YWxrICovCisJCQlvbXNnID0gbXRvZChtLCBDVExfTVNHX09MRCopOworCQkJbm1zZyA9IChDVExfTVNHICopIGJ1ZmY7CisJCQl0eXBlID0gb21zZy0+dHlwZTsKKwkJCU9UT1NJTihvbXNnLCBjdGxfYWRkciktPnNpbl9wb3J0ID0gYWRkci5zaW5fcG9ydDsKKwkJCU9UT1NJTihvbXNnLCBjdGxfYWRkciktPnNpbl9hZGRyID0gb3VyX2FkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwc3RyY3B5KG9tc2ctPmxfbmFtZSwgTkFNRV9TSVpFX09MRCwgZ2V0bG9naW4oKSk7CisJCX0gZWxzZSB7CQkvKiBuZXcgdGFsayAqLworCQkJb21zZyA9IChDVExfTVNHX09MRCAqKSBidWZmOworCQkJbm1zZyA9IG10b2QobSwgQ1RMX01TRyAqKTsKKwkJCXR5cGUgPSBubXNnLT50eXBlOworCQkJT1RPU0lOKG5tc2csIGN0bF9hZGRyKS0+c2luX3BvcnQgPSBhZGRyLnNpbl9wb3J0OworCQkJT1RPU0lOKG5tc2csIGN0bF9hZGRyKS0+c2luX2FkZHIgPSBvdXJfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzdHJjcHkobm1zZy0+bF9uYW1lLCBOQU1FX1NJWkVfT0xELCBnZXRsb2dpbigpKTsKKwkJfQorCisJCWlmICh0eXBlID09IExPT0tfVVApCisJCQlyZXR1cm47CQkvKiBmb3IgTE9PS19VUCB0aGlzIGlzIGVub3VnaCAqLworCisJCWlmIChJU19PTEQpIHsJCS8qIG1ha2UgYSBjb3B5IG9mIHRoZSBtZXNzYWdlICovCisJCQlDT1BZX01TRyhubXNnLCBvbXNnKTsKKwkJCW5tc2ctPnZlcnMgPSAxOworCQkJbm1zZy0+YW5zd2VyID0gMDsKKwkJfSBlbHNlCisJCQlDT1BZX01TRyhvbXNnLCBubXNnKTsKKworCQkvKgorCQkgKiBJZiBpZiBpcyBhbiBBTk5PVU5DRSBtZXNzYWdlLCB3ZSBnbyB0aHJvdWdoIHRoZQorCQkgKiByZXF1ZXN0IHRhYmxlIHRvIHNlZSBpZiBhIHRjcCBwb3J0IGhhcyBhbHJlYWR5CisJCSAqIGJlZW4gcmVkaXJlY3RlZCBmb3IgdGhpcyBzb2NrZXQuIElmIG5vdCwgd2Ugc29saXN0ZW4oKQorCQkgKiBhIG5ldyBzb2NrZXQgYW5kIGFkZCB0aGlzIGVudHJ5IHRvIHRoZSB0YWJsZS4KKwkJICogVGhlIHBvcnQgbnVtYmVyIG9mIHRoZSB0Y3Agc29ja2V0IGFuZCBvdXIgSVAKKwkJICogYXJlIHB1dCB0byB0aGUgYWRkciBmaWVsZCBvZiB0aGUgbWVzc2FnZSBzdHJ1Y3R1cmVzLgorCQkgKiBUaGVuIGEgTEVBVkVfSU5WSVRFIGlzIHNlbnQgdG8gYm90aCBsb2NhbCBkYWVtb24KKwkJICogcG9ydHMsIDUxNyBhbmQgNTE4LiBUaGlzIGlzIHdoeSB3ZSBoYXZlIHR3byBjb3BpZXMKKwkJICogb2YgdGhlIG1lc3NhZ2UsIG9uZSBpbiBvbGQgdGFsayBhbmQgb25lIGluIG5ldyB0YWxrCisJCSAqIGZvcm1hdC4KKwkJICovCisKKwkJaWYgKHR5cGUgPT0gQU5OT1VOQ0UpIHsKKwkJCWludCBzOworCQkJdV9zaG9ydCB0ZW1wX3BvcnQ7CisKKwkJCWZvcihyZXEgPSByZXFfdGJsOyByZXE7IHJlcSA9IHJlcS0+bmV4dCkKKwkJCQlpZiAoc28gPT0gcmVxLT51ZHBfc28pCisJCQkJCWJyZWFrOyAgCS8qIGZvdW5kIGl0ICovCisKKwkJCWlmICghcmVxKSB7CS8qIG5vIGVudHJ5IGZvciBzbywgY3JlYXRlIG5ldyAqLworCQkJCXJlcSA9IChzdHJ1Y3QgdGFsa19yZXF1ZXN0ICopCisJCQkJCW1hbGxvYyhzaXplb2Yoc3RydWN0IHRhbGtfcmVxdWVzdCkpOworCQkJCXJlcS0+dWRwX3NvID0gc287CisJCQkJcmVxLT50Y3Bfc28gPSBzb2xpc3RlbigwLAorCQkJCQlPVE9TSU4ob21zZywgYWRkciktPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJT1RPU0lOKG9tc2csIGFkZHIpLT5zaW5fcG9ydCwKKwkJCQkJU1NfRkFDQ0VQVE9OQ0UpOworCQkJCXJlcS0+bmV4dCA9IHJlcV90Ymw7CisJCQkJcmVxX3RibCA9IHJlcTsKKwkJCX0KKworCQkJLyogcmVwbGFjZSBwb3J0IG51bWJlciBpbiBhZGRyIGZpZWxkICovCisJCQlhZGRybGVuID0gc2l6ZW9mKGFkZHIpOworCQkJZ2V0c29ja25hbWUocmVxLT50Y3Bfc28tPnMsCisJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsCisJCQkJCSZhZGRybGVuKTsKKwkJCU9UT1NJTihvbXNnLCBhZGRyKS0+c2luX3BvcnQgPSBhZGRyLnNpbl9wb3J0OworCQkJT1RPU0lOKG9tc2csIGFkZHIpLT5zaW5fYWRkciA9IG91cl9hZGRyOworCQkJT1RPU0lOKG5tc2csIGFkZHIpLT5zaW5fcG9ydCA9IGFkZHIuc2luX3BvcnQ7CisJCQlPVE9TSU4obm1zZywgYWRkciktPnNpbl9hZGRyID0gb3VyX2FkZHI7CisKKwkJCS8qIHNlbmQgTEVBVkVfSU5WSVRFcyAqLworCQkJdGVtcF9wb3J0ID0gT1RPU0lOKG9tc2csIGN0bF9hZGRyKS0+c2luX3BvcnQ7CisJCQlPVE9TSU4ob21zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IDA7CisJCQlPVE9TSU4obm1zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IDA7CisJCQlvbXNnLT50eXBlID0gbm1zZy0+dHlwZSA9IExFQVZFX0lOVklURTsKKworCQkJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX0lQKTsKKwkJCWFkZHIuc2luX2FkZHIgPSBvdXJfYWRkcjsKKwkJCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoNTE3KTsKKwkJCXNlbmR0byhzLCAoY2hhciAqKW9tc2csIHNpemVvZigqb21zZyksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOworCQkJYWRkci5zaW5fcG9ydCA9IGh0b25zKDUxOCk7CisJCQlzZW5kdG8ocywgKGNoYXIgKilubXNnLCBzaXplb2YoKm5tc2cpLCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCQljbG9zZXNvY2tldChzKSA7CisKKwkJCW9tc2ctPnR5cGUgPSBubXNnLT50eXBlID0gQU5OT1VOQ0U7CisJCQlPVE9TSU4ob21zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IHRlbXBfcG9ydDsKKwkJCU9UT1NJTihubXNnLCBjdGxfYWRkciktPnNpbl9wb3J0ID0gdGVtcF9wb3J0OworCQl9CisKKwkJLyoKKwkJICogSWYgaXQgaXMgYSBERUxFVEUgbWVzc2FnZSwgd2Ugc2VuZCBhIGNvcHkgdG8gdGhlCisJCSAqIGxvY2FsIGRhZW1vbnMuIFRoZW4gd2UgZGVsZXRlIHRoZSBlbnRyeSBjb3JyZXNwb25kaW5nCisJCSAqIHRvIG91ciBzb2NrZXQgZnJvbSB0aGUgcmVxdWVzdCB0YWJsZS4KKwkJICovCisKKwkJaWYgKHR5cGUgPT0gREVMRVRFKSB7CisJCQlzdHJ1Y3QgdGFsa19yZXF1ZXN0ICp0ZW1wX3JlcSwgKnJlcV9uZXh0OworCQkJaW50IHM7CisJCQl1X3Nob3J0IHRlbXBfcG9ydDsKKworCQkJdGVtcF9wb3J0ID0gT1RPU0lOKG9tc2csIGN0bF9hZGRyKS0+c2luX3BvcnQ7CisJCQlPVE9TSU4ob21zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IDA7CisJCQlPVE9TSU4obm1zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IDA7CisKKwkJCXMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JUCk7CisJCQlhZGRyLnNpbl9hZGRyID0gb3VyX2FkZHI7CisJCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJYWRkci5zaW5fcG9ydCA9IGh0b25zKDUxNyk7CisJCQlzZW5kdG8ocywgKGNoYXIgKilvbXNnLCBzaXplb2YoKm9tc2cpLCAwLAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJCWFkZHIuc2luX3BvcnQgPSBodG9ucyg1MTgpOworCQkJc2VuZHRvKHMsIChjaGFyICopbm1zZywgc2l6ZW9mKCpubXNnKSwgMCwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisJCQljbG9zZXNvY2tldChzKTsKKworCQkJT1RPU0lOKG9tc2csIGN0bF9hZGRyKS0+c2luX3BvcnQgPSB0ZW1wX3BvcnQ7CisJCQlPVE9TSU4obm1zZywgY3RsX2FkZHIpLT5zaW5fcG9ydCA9IHRlbXBfcG9ydDsKKworCQkJLyogZGVsZXRlIHRhYmxlIGVudHJ5ICovCisJCQlpZiAoc28gPT0gcmVxX3RibC0+dWRwX3NvKSB7CisJCQkJdGVtcF9yZXEgPSByZXFfdGJsOworCQkJCXJlcV90YmwgPSByZXFfdGJsLT5uZXh0OworCQkJCWZyZWUodGVtcF9yZXEpOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wX3JlcSA9IHJlcV90Ymw7CisJCQkJZm9yKHJlcSA9IHJlcV90YmwtPm5leHQ7IHJlcTsgcmVxID0gcmVxX25leHQpIHsKKwkJCQkJcmVxX25leHQgPSByZXEtPm5leHQ7CisJCQkJCWlmIChzbyA9PSByZXEtPnVkcF9zbykgeworCQkJCQkJdGVtcF9yZXEtPm5leHQgPSByZXFfbmV4dDsKKwkJCQkJCWZyZWUocmVxKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJdGVtcF9yZXEgPSByZXE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXR1cm47CisjZW5kaWYKKworCWNhc2UgRU1VX0NVU0VFTUU6CisKKwkJLyoKKwkJICogQ3UtU2VlTWUgZW11bGF0aW9uLgorCQkgKiBIb3BlZnVsbHkgdGhlIHBhY2tldCBpcyBtb3JlIHRoYXQgMTYgYnl0ZXMgbG9uZy4gV2UgZG9uJ3QKKwkJICogZG8gYW55IG90aGVyIHRlc3RzLCBqdXN0IHJlcGxhY2UgdGhlIGFkZHJlc3MgYW5kIHBvcnQKKwkJICogZmllbGRzLgorCQkgKi8KKwkJaWYgKG0tPm1fbGVuID49IHNpemVvZiAoKmN1X2hlYWQpKSB7CisJCQlpZiAoZ2V0c29ja25hbWUoc28tPnMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJmFkZHJsZW4pIDwgMCkKKwkJCQlyZXR1cm47CisJCQljdV9oZWFkID0gbXRvZChtLCBzdHJ1Y3QgY3VfaGVhZGVyICopOworCQkJY3VfaGVhZC0+c19wb3J0ID0gYWRkci5zaW5fcG9ydDsKKwkJCWN1X2hlYWQtPnNvX2FkZHIgPSBvdXJfYWRkci5zX2FkZHI7CisJCX0KKworCQlyZXR1cm47CisJfQorfQorCitzdHJ1Y3Qgc29ja2V0ICoKK3VkcF9saXN0ZW4odV9pbnQgcG9ydCwgdV9pbnQzMl90IGxhZGRyLCB1X2ludCBscG9ydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXN0cnVjdCBzb2NrZXQgKnNvOworCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksIG9wdCA9IDE7CisKKwlpZiAoKHNvID0gc29jcmVhdGUoKSkgPT0gTlVMTCkgeworCQlmcmVlKHNvKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNvLT5zID0gc29ja2V0KEFGX0lORVQsU09DS19ER1JBTSwwKTsKKwlzby0+c29fZXhwaXJlID0gY3VydGltZSArIFNPX0VYUElSRTsKKwlpbnNxdWUoc28sJnVkYik7CisKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwlhZGRyLnNpbl9wb3J0ID0gcG9ydDsKKworCWlmIChiaW5kKHNvLT5zLChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgYWRkcmxlbikgPCAwKSB7CisJCXVkcF9kZXRhY2goc28pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc2V0c29ja29wdChzby0+cyxTT0xfU09DS0VULFNPX1JFVVNFQUREUiwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOworLyoJc2V0c29ja29wdChzby0+cyxTT0xfU09DS0VULFNPX09PQklOTElORSwoY2hhciAqKSZvcHQsc2l6ZW9mKGludCkpOyAqLworCisJZ2V0c29ja25hbWUoc28tPnMsKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCZhZGRybGVuKTsKKwlzby0+c29fZnBvcnQgPSBhZGRyLnNpbl9wb3J0OworCWlmIChhZGRyLnNpbl9hZGRyLnNfYWRkciA9PSAwIHx8IGFkZHIuc2luX2FkZHIuc19hZGRyID09IGxvb3BiYWNrX2FkZHIuc19hZGRyKQorCSAgIHNvLT5zb19mYWRkciA9IGFsaWFzX2FkZHI7CisJZWxzZQorCSAgIHNvLT5zb19mYWRkciA9IGFkZHIuc2luX2FkZHI7CisKKwlzby0+c29fbHBvcnQgPSBscG9ydDsKKwlzby0+c29fbGFkZHIuc19hZGRyID0gbGFkZHI7CisJaWYgKGZsYWdzICE9IFNTX0ZBQ0NFUFRPTkNFKQorCSAgIHNvLT5zb19leHBpcmUgPSAwOworCisJc28tPnNvX3N0YXRlID0gU1NfSVNGQ09OTkVDVEVEOworCisJcmV0dXJuIHNvOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS9zbGlycC91ZHAuaCBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhMDdhMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvc2xpcnAvdWRwLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpdWRwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MworICogdWRwLmgsdiAxLjMgMTk5NC8wOC8yMSAwNToyNzo0MSBwYXVsIEV4cAorICovCisKKyNpZm5kZWYgX1VEUF9IXworI2RlZmluZSBfVURQX0hfCisKKyNkZWZpbmUgVURQX1RUTCAweDYwCisjZGVmaW5lIFVEUF9VRFBEQVRBTEVOIDE2MTkyCisKK2V4dGVybiBzdHJ1Y3Qgc29ja2V0ICp1ZHBfbGFzdF9zbzsKKworLyoKKyAqIFVkcCBwcm90b2NvbCBoZWFkZXIuCisgKiBQZXIgUkZDIDc2OCwgU2VwdGVtYmVyLCAxOTgxLgorICovCitzdHJ1Y3QgdWRwaGRyIHsKKwl1X2ludDE2X3QJdWhfc3BvcnQ7CQkvKiBzb3VyY2UgcG9ydCAqLworCXVfaW50MTZfdAl1aF9kcG9ydDsJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwlpbnQxNl90CXVoX3VsZW47CQkvKiB1ZHAgbGVuZ3RoICovCisJdV9pbnQxNl90CXVoX3N1bTsJCQkvKiB1ZHAgY2hlY2tzdW0gKi8KK307CisKKy8qCisgKiBVRFAga2VybmVsIHN0cnVjdHVyZXMgYW5kIHZhcmlhYmxlcy4KKyAqLworc3RydWN0IHVkcGlwaGRyIHsKKwkgICAgICAgIHN0cnVjdCAgaXBvdmx5IHVpX2k7ICAgICAgICAgICAgLyogb3ZlcmxhaWQgaXAgc3RydWN0dXJlICovCisJICAgICAgICBzdHJ1Y3QgIHVkcGhkciB1aV91OyAgICAgICAgICAgIC8qIHVkcCBoZWFkZXIgKi8KK307CisjZGVmaW5lIHVpX21idWYgICAgICAgICB1aV9pLmloX21idWYubXB0cgorI2RlZmluZSB1aV94MSAgICAgICAgICAgdWlfaS5paF94MQorI2RlZmluZSB1aV9wciAgICAgICAgICAgdWlfaS5paF9wcgorI2RlZmluZSB1aV9sZW4gICAgICAgICAgdWlfaS5paF9sZW4KKyNkZWZpbmUgdWlfc3JjICAgICAgICAgIHVpX2kuaWhfc3JjCisjZGVmaW5lIHVpX2RzdCAgICAgICAgICB1aV9pLmloX2RzdAorI2RlZmluZSB1aV9zcG9ydCAgICAgICAgdWlfdS51aF9zcG9ydAorI2RlZmluZSB1aV9kcG9ydCAgICAgICAgdWlfdS51aF9kcG9ydAorI2RlZmluZSB1aV91bGVuICAgICAgICAgdWlfdS51aF91bGVuCisjZGVmaW5lIHVpX3N1bSAgICAgICAgICB1aV91LnVoX3N1bQorCisjaWZkZWYgTE9HX0VOQUJMRUQKK3N0cnVjdCB1ZHBzdGF0IHsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHN0YXRpc3RpY3M6ICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfaXBhY2tldHM7ICAgICAgICAgIC8qIHRvdGFsIGlucHV0IHBhY2tldHMgKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwc19oZHJvcHM7ICAgICAgICAgICAgLyogcGFja2V0IHNob3J0ZXIgdGhhbiBoZWFkZXIgKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwc19iYWRzdW07ICAgICAgICAgICAgLyogY2hlY2tzdW0gZXJyb3IgKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwc19iYWRsZW47ICAgICAgICAgICAgLyogZGF0YSBsZW5ndGggbGFyZ2VyIHRoYW4gcGFja2V0ICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfbm9wb3J0OyAgICAgICAgICAgIC8qIG5vIHNvY2tldCBvbiBwb3J0ICovCisJICAgICAgICB1X2xvbmcgIHVkcHNfbm9wb3J0YmNhc3Q7ICAgICAgIC8qIG9mIGFib3ZlLCBhcnJpdmVkIGFzIGJyb2FkY2FzdCAqLworCSAgICAgICAgdV9sb25nICB1ZHBzX2Z1bGxzb2NrOyAgICAgICAgICAvKiBub3QgZGVsaXZlcmVkLCBpbnB1dCBzb2NrZXQgZnVsbCAqLworCSAgICAgICAgdV9sb25nICB1ZHBwc19wY2JjYWNoZW1pc3M7ICAgICAvKiBpbnB1dCBwYWNrZXRzIG1pc3NpbmcgcGNiIGNhY2hlICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRwdXQgc3RhdGlzdGljczogKi8KKwkgICAgICAgIHVfbG9uZyAgdWRwc19vcGFja2V0czsgICAgICAgICAgLyogdG90YWwgb3V0cHV0IHBhY2tldHMgKi8KK307CisjZW5kaWYKKworLyoKKyAqIE5hbWVzIGZvciBVRFAgc3lzY3RsIG9iamVjdHMKKyAqLworI2RlZmluZSBVRFBDVExfQ0hFQ0tTVU0gICAgICAgICAxICAgICAgIC8qIGNoZWNrc3VtIFVEUCBwYWNrZXRzICovCisjZGVmaW5lIFVEUENUTF9NQVhJRCAgICAgICAgICAgIDIKKworI2lmZGVmIExPR19FTkFCTEVECitleHRlcm4gc3RydWN0IHVkcHN0YXQgdWRwc3RhdDsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHNvY2tldCB1ZGI7CitzdHJ1Y3QgbWJ1ZjsKKwordm9pZCB1ZHBfaW5pdCBfUCgodm9pZCkpOwordm9pZCB1ZHBfaW5wdXQgX1AoKHJlZ2lzdGVyIHN0cnVjdCBtYnVmICosIGludCkpOworaW50IHVkcF9vdXRwdXQgX1AoKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1idWYgKiwgc3RydWN0IHNvY2thZGRyX2luICopKTsKK2ludCB1ZHBfYXR0YWNoIF9QKChzdHJ1Y3Qgc29ja2V0ICopKTsKK3ZvaWQgdWRwX2RldGFjaCBfUCgoc3RydWN0IHNvY2tldCAqKSk7CitzdHJ1Y3Qgc29ja2V0ICogdWRwX2xpc3RlbiBfUCgodV9pbnQsIHVfaW50MzJfdCwgdV9pbnQsIGludCkpOworaW50IHVkcF9vdXRwdXQyKHN0cnVjdCBzb2NrZXQgKnNvLCBzdHJ1Y3QgbWJ1ZiAqbSwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRhZGRyLAorICAgICAgICAgICAgICAgIGludCBpcHRvcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvc3lzLXRyZWUuaCBiL2FuZHJvaWQvcWVtdTEvc3lzLXRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QwNDlmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS9zeXMtdHJlZS5oCkBAIC0wLDAgKzEsNzcxIEBACisvKiAgJE5ldEJTRDogdHJlZS5oLHYgMS44IDIwMDQvMDMvMjggMTk6Mzg6MzAgcHJvdm9zIEV4cCAkICAqLworLyogICRPcGVuQlNEOiB0cmVlLmgsdiAxLjcgMjAwMi8xMC8xNyAyMTo1MTo1NCBhcnQgRXhwICQgICAgKi8KKy8qICRGcmVlQlNEOiBzcmMvc3lzL3N5cy90cmVlLmgsdiAxLjkuMi4xLjIuMSAyMDA5LzEwLzI1IDAxOjEwOjI5IGtlbnNtaXRoIEV4cCAkICovCisKKy8qLQorICogQ29weXJpZ2h0IDIwMDIgTmllbHMgUHJvdm9zIDxwcm92b3NAY2l0aS51bWljaC5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9TWVNfVFJFRV9IXworI2RlZmluZSBfU1lTX1RSRUVfSF8KKworLyogT21taXQgInN0cnVjdCIgcHJlZml4IGlmIHRoaXMgY29kZSBpcyBidWlsdCB3aXRoIEMrKywKKyAqIHNvIGl0IGNhbiBidWlsZC4gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBTWVNfVFJFRV9TVFJVQ1QKKyNlbHNlCisjZGVmaW5lIFNZU19UUkVFX1NUUlVDVCAgc3RydWN0CisjZW5kaWYKKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGRhdGEgc3RydWN0dXJlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHRyZWVzOgorICogc3BsYXkgdHJlZXMgYW5kIHJlZC1ibGFjayB0cmVlcy4KKyAqCisgKiBBIHNwbGF5IHRyZWUgaXMgYSBzZWxmLW9yZ2FuaXppbmcgZGF0YSBzdHJ1Y3R1cmUuICBFdmVyeSBvcGVyYXRpb24KKyAqIG9uIHRoZSB0cmVlIGNhdXNlcyBhIHNwbGF5IHRvIGhhcHBlbi4gIFRoZSBzcGxheSBtb3ZlcyB0aGUgcmVxdWVzdGVkCisgKiBub2RlIHRvIHRoZSByb290IG9mIHRoZSB0cmVlIGFuZCBwYXJ0bHkgcmViYWxhbmNlcyBpdC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgYmVuZWZpdCB0aGF0IHJlcXVlc3QgbG9jYWxpdHkgY2F1c2VzIGZhc3RlciBsb29rdXBzIGFzCisgKiB0aGUgcmVxdWVzdGVkIG5vZGVzIG1vdmUgdG8gdGhlIHRvcCBvZiB0aGUgdHJlZS4gIE9uIHRoZSBvdGhlciBoYW5kLAorICogZXZlcnkgbG9va3VwIGNhdXNlcyBtZW1vcnkgd3JpdGVzLgorICoKKyAqIFRoZSBCYWxhbmNlIFRoZW9yZW0gYm91bmRzIHRoZSB0b3RhbCBhY2Nlc3MgdGltZSBmb3IgbSBvcGVyYXRpb25zCisgKiBhbmQgbiBpbnNlcnRzIG9uIGFuIGluaXRpYWxseSBlbXB0eSB0cmVlIGFzIE8oKG0gKyBuKWxnIG4pLiAgVGhlCisgKiBhbW9ydGl6ZWQgY29zdCBmb3IgYSBzZXF1ZW5jZSBvZiBtIGFjY2Vzc2VzIHRvIGEgc3BsYXkgdHJlZSBpcyBPKGxnIG4pOworICoKKyAqIEEgcmVkLWJsYWNrIHRyZWUgaXMgYSBiaW5hcnkgc2VhcmNoIHRyZWUgd2l0aCB0aGUgbm9kZSBjb2xvciBhcyBhbgorICogZXh0cmEgYXR0cmlidXRlLiAgSXQgZnVsZmlsbHMgYSBzZXQgb2YgY29uZGl0aW9uczoKKyAqICAtIGV2ZXJ5IHNlYXJjaCBwYXRoIGZyb20gdGhlIHJvb3QgdG8gYSBsZWFmIGNvbnNpc3RzIG9mIHRoZQorICogICAgc2FtZSBudW1iZXIgb2YgYmxhY2sgbm9kZXMsCisgKiAgLSBlYWNoIHJlZCBub2RlIChleGNlcHQgZm9yIHRoZSByb290KSBoYXMgYSBibGFjayBwYXJlbnQsCisgKiAgLSBlYWNoIGxlYWYgbm9kZSBpcyBibGFjay4KKyAqCisgKiBFdmVyeSBvcGVyYXRpb24gb24gYSByZWQtYmxhY2sgdHJlZSBpcyBib3VuZGVkIGFzIE8obGcgbikuCisgKiBUaGUgbWF4aW11bSBoZWlnaHQgb2YgYSByZWQtYmxhY2sgdHJlZSBpcyAybGcgKG4rMSkuCisgKi8KKworI2RlZmluZSBTUExBWV9IRUFEKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCBuYW1lIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpzcGhfcm9vdDsgLyogcm9vdCBvZiB0aGUgdHJlZSAqLyAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNQTEFZX0lOSVRJQUxJWkVSKHJvb3QpICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgTlVMTCB9CisKKyNkZWZpbmUgU1BMQVlfSU5JVChyb290KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJvb3QpLT5zcGhfcm9vdCA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgU1BMQVlfRU5UUlkodHlwZSkgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0cnVjdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnNwZV9sZWZ0OyAvKiBsZWZ0IGVsZW1lbnQgKi8gICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqc3BlX3JpZ2h0OyAvKiByaWdodCBlbGVtZW50ICovICAgICAgICAgXAorfQorCisjZGVmaW5lIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgICAgICAoZWxtKS0+ZmllbGQuc3BlX2xlZnQKKyNkZWZpbmUgU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgICAgIChlbG0pLT5maWVsZC5zcGVfcmlnaHQKKyNkZWZpbmUgU1BMQVlfUk9PVChoZWFkKSAgICAgICAgKGhlYWQpLT5zcGhfcm9vdAorI2RlZmluZSBTUExBWV9FTVBUWShoZWFkKSAgICAgICAoU1BMQVlfUk9PVChoZWFkKSA9PSBOVUxMKQorCisvKiBTUExBWV9ST1RBVEVfe0xFRlQsUklHSFR9IGV4cGVjdCB0aGF0IHRtcCBob2xkIFNQTEFZX3tSSUdIVCxMRUZUfSAqLworI2RlZmluZSBTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgdG1wLCBmaWVsZCkgZG8geyAgICAgICAgICAgXAorICAgIFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gU1BMQVlfUklHSFQodG1wLCBmaWVsZCk7ICBcCisgICAgU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OyAgICAgICAgIFwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gdG1wOyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBTUExBWV9ST1RBVEVfTEVGVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7ICAgICAgICAgICAgXAorICAgIFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IFNQTEFZX0xFRlQodG1wLCBmaWVsZCk7ICBcCisgICAgU1BMQVlfTEVGVCh0bXAsIGZpZWxkKSA9IChoZWFkKS0+c3BoX3Jvb3Q7ICAgICAgICAgIFwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gdG1wOyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBTUExBWV9MSU5LTEVGVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgXAorICAgIFNQTEFZX0xFRlQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OyAgICAgICAgICBcCisgICAgdG1wID0gKGhlYWQpLT5zcGhfcm9vdDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGhlYWQpLT5zcGhfcm9vdCA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFNQTEFZX0xJTktSSUdIVChoZWFkLCB0bXAsIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICBcCisgICAgU1BMQVlfUklHSFQodG1wLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OyAgICAgICAgIFwKKyAgICB0bXAgPSAoaGVhZCktPnNwaF9yb290OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKyNkZWZpbmUgU1BMQVlfQVNTRU1CTEUoaGVhZCwgbm9kZSwgbGVmdCwgcmlnaHQsIGZpZWxkKSBkbyB7ICAgICBcCisgICAgU1BMQVlfUklHSFQobGVmdCwgZmllbGQpID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7IFwKKyAgICBTUExBWV9MRUZUKHJpZ2h0LCBmaWVsZCkgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorICAgIFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gU1BMQVlfUklHSFQobm9kZSwgZmllbGQpOyBcCisgICAgU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID0gU1BMQVlfTEVGVChub2RlLCBmaWVsZCk7IFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworLyogR2VuZXJhdGVzIHByb3RvdHlwZXMgYW5kIGlubGluZSBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBTUExBWV9QUk9UT1RZUEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkgICAgICAgICAgICAgXAordm9pZCBuYW1lIyNfU1BMQVkoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgICAgICAgICAgXAordm9pZCBuYW1lIyNfU1BMQVlfTUlOTUFYKFNZU19UUkVFX1NUUlVDVCBuYW1lICosIGludCk7ICAgICAgICAgICAgICAgXAorU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm5hbWUjI19TUExBWV9JTlNFUlQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgICBcCitTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqbmFtZSMjX1NQTEFZX1JFTU9WRShTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLyAgICAgICAgICAgICAgIFwKK3N0YXRpYyBfX2lubGluZSBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lIyNfU1BMQVlfRklORChTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChTUExBWV9FTVBUWShoZWFkKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4oTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCkgPT0gMCkgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIChoZWFkLT5zcGhfcm9vdCk7ICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIF9faW5saW5lIFNZU19UUkVFX1NUUlVDVCB0eXBlICogICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUjI19TUExBWV9ORVhUKFNZU19UUkVFX1NUUlVDVCBuYW1lICpoZWFkLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqZWxtKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxtID0gU1BMQVlfUklHSFQoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChTUExBWV9MRUZUKGVsbSwgZmllbGQpICE9IE5VTEwpIHsgICAgICAgIFwKKyAgICAgICAgICAgIGVsbSA9IFNQTEFZX0xFRlQoZWxtLCBmaWVsZCk7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbG0gPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIF9faW5saW5lIFNZU19UUkVFX1NUUlVDVCB0eXBlICogICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUjI19TUExBWV9NSU5fTUFYKFNZU19UUkVFX1NUUlVDVCBuYW1lICpoZWFkLCBpbnQgdmFsKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lIyNfU1BMQVlfTUlOTUFYKGhlYWQsIHZhbCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAoU1BMQVlfUk9PVChoZWFkKSk7ICAgICAgICAgICAgICAgICAgXAorfQorCisvKiBNYWluIHNwbGF5IG9wZXJhdGlvbi4KKyAqIE1vdmVzIG5vZGUgY2xvc2UgdG8gdGhlIGtleSBvZiBlbG0gdG8gdG9wCisgKi8KKyNkZWZpbmUgU1BMQVlfR0VORVJBVEUobmFtZSwgdHlwZSwgZmllbGQsIGNtcCkgICAgICAgICAgICAgIFwKK1NZU19UUkVFX1NUUlVDVCB0eXBlICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1NQTEFZX0lOU0VSVChTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoU1BMQVlfRU1QVFkoaGVhZCkpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSBTUExBWV9SSUdIVChlbG0sIGZpZWxkKSA9IE5VTEw7ICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgX19jb21wOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5hbWUjI19TUExBWShoZWFkLCBlbG0pOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2NvbXAgPSAoY21wKShlbG0sIChoZWFkKS0+c3BoX3Jvb3QpOyAgICAgICAgICBcCisgICAgICAgIGlmKF9fY29tcCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTUExBWV9MRUZUKGVsbSwgZmllbGQpID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorICAgICAgICAgICAgU1BMQVlfUklHSFQoZWxtLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OyAgICAgXAorICAgICAgICAgICAgU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBOVUxMOyAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKF9fY29tcCA+IDApIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFNQTEFZX1JJR0hUKGVsbSwgZmllbGQpID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpO1wKKyAgICAgICAgICAgIFNQTEFZX0xFRlQoZWxtLCBmaWVsZCkgPSAoaGVhZCktPnNwaF9yb290OyAgICAgIFwKKyAgICAgICAgICAgIFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9IE5VTEw7ICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gKChoZWFkKS0+c3BoX3Jvb3QpOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoaGVhZCktPnNwaF9yb290ID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIChOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1NZU19UUkVFX1NUUlVDVCB0eXBlICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1NQTEFZX1JFTU9WRShTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqX190bXA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChTUExBWV9FTVBUWShoZWFkKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gKE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZSMjX1NQTEFZKGhlYWQsIGVsbSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCkgPT0gMCkgeyAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpID09IE5VTEwpIHsgIFwKKyAgICAgICAgICAgIChoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7XAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgIFwKKyAgICAgICAgICAgIChoZWFkKS0+c3BoX3Jvb3QgPSBTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKTtcCisgICAgICAgICAgICBuYW1lIyNfU1BMQVkoaGVhZCwgZWxtKTsgICAgICAgICAgICBcCisgICAgICAgICAgICBTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPSBfX3RtcDsgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUjI19TUExBWShTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSBfX25vZGUsICpfX2xlZnQsICpfX3JpZ2h0LCAqX190bXA7ICAgICAgICAgIFwKKyAgICBpbnQgX19jb21wOyAgICAgICAgICAgICAgICAgICAgICAgICBcCitcCisgICAgU1BMQVlfTEVGVCgmX19ub2RlLCBmaWVsZCkgPSBTUExBWV9SSUdIVCgmX19ub2RlLCBmaWVsZCkgPSBOVUxMO1wKKyAgICBfX2xlZnQgPSBfX3JpZ2h0ID0gJl9fbm9kZTsgICAgICAgICAgICAgICAgIFwKK1wKKyAgICB3aGlsZSAoKF9fY29tcCA9IChjbXApKGVsbSwgKGhlYWQpLT5zcGhfcm9vdCkpICE9IDApIHsgICAgICBcCisgICAgICAgIGlmIChfX2NvbXAgPCAwKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fdG1wID0gU1BMQVlfTEVGVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCk7ICAgIFwKKyAgICAgICAgICAgIGlmIChfX3RtcCA9PSBOVUxMKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoY21wKShlbG0sIF9fdG1wKSA8IDApeyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsgXAorICAgICAgICAgICAgICAgIGlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7ICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgIFwKKyAgICAgICAgICAgIGlmIChfX3RtcCA9PSBOVUxMKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoY21wKShlbG0sIF9fdG1wKSA+IDApeyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBTUExBWV9ST1RBVEVfTEVGVChoZWFkLCBfX3RtcCwgZmllbGQpOyAgXAorICAgICAgICAgICAgICAgIGlmIChTUExBWV9SSUdIVCgoaGVhZCktPnNwaF9yb290LCBmaWVsZCkgPT0gTlVMTClcCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU1BMQVlfTElOS1JJR0hUKGhlYWQsIF9fbGVmdCwgZmllbGQpOyAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1BMQVlfQVNTRU1CTEUoaGVhZCwgJl9fbm9kZSwgX19sZWZ0LCBfX3JpZ2h0LCBmaWVsZCk7ICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorLyogU3BsYXkgd2l0aCBlaXRoZXIgdGhlIG1pbmltdW0gb3IgdGhlIG1heGltdW0gZWxlbWVudCAgICAgICAgIFwKKyAqIFVzZWQgdG8gZmluZCBtaW5pbXVtIG9yIG1heGltdW0gZWxlbWVudCBpbiB0cmVlLiAgICAgICAgIFwKKyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgbmFtZSMjX1NQTEFZX01JTk1BWChTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgaW50IF9fY29tcCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlIF9fbm9kZSwgKl9fbGVmdCwgKl9fcmlnaHQsICpfX3RtcDsgICAgICAgICAgXAorXAorICAgIFNQTEFZX0xFRlQoJl9fbm9kZSwgZmllbGQpID0gU1BMQVlfUklHSFQoJl9fbm9kZSwgZmllbGQpID0gTlVMTDtcCisgICAgX19sZWZ0ID0gX19yaWdodCA9ICZfX25vZGU7ICAgICAgICAgICAgICAgICBcCitcCisgICAgd2hpbGUgKDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoX19jb21wIDwgMCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX3RtcCA9IFNQTEFZX0xFRlQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgICBcCisgICAgICAgICAgICBpZiAoX190bXAgPT0gTlVMTCkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoX19jb21wIDwgMCl7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBTUExBWV9ST1RBVEVfUklHSFQoaGVhZCwgX190bXAsIGZpZWxkKTsgXAorICAgICAgICAgICAgICAgIGlmIChTUExBWV9MRUZUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTUExBWV9MSU5LTEVGVChoZWFkLCBfX3JpZ2h0LCBmaWVsZCk7ICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmIChfX2NvbXAgPiAwKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fdG1wID0gU1BMQVlfUklHSFQoKGhlYWQpLT5zcGhfcm9vdCwgZmllbGQpOyAgIFwKKyAgICAgICAgICAgIGlmIChfX3RtcCA9PSBOVUxMKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfX2NvbXAgPiAwKSB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFNQTEFZX1JPVEFURV9MRUZUKGhlYWQsIF9fdG1wLCBmaWVsZCk7ICBcCisgICAgICAgICAgICAgICAgaWYgKFNQTEFZX1JJR0hUKChoZWFkKS0+c3BoX3Jvb3QsIGZpZWxkKSA9PSBOVUxMKVwKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBTUExBWV9MSU5LUklHSFQoaGVhZCwgX19sZWZ0LCBmaWVsZCk7ICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTUExBWV9BU1NFTUJMRShoZWFkLCAmX19ub2RlLCBfX2xlZnQsIF9fcmlnaHQsIGZpZWxkKTsgICAgICBcCit9CisKKyNkZWZpbmUgU1BMQVlfTkVHSU5GICAgIC0xCisjZGVmaW5lIFNQTEFZX0lORiAgIDEKKworI2RlZmluZSBTUExBWV9JTlNFUlQobmFtZSwgeCwgeSkgICAgbmFtZSMjX1NQTEFZX0lOU0VSVCh4LCB5KQorI2RlZmluZSBTUExBWV9SRU1PVkUobmFtZSwgeCwgeSkgICAgbmFtZSMjX1NQTEFZX1JFTU9WRSh4LCB5KQorI2RlZmluZSBTUExBWV9GSU5EKG5hbWUsIHgsIHkpICAgICAgbmFtZSMjX1NQTEFZX0ZJTkQoeCwgeSkKKyNkZWZpbmUgU1BMQVlfTkVYVChuYW1lLCB4LCB5KSAgICAgIG5hbWUjI19TUExBWV9ORVhUKHgsIHkpCisjZGVmaW5lIFNQTEFZX01JTihuYW1lLCB4KSAgICAgIChTUExBWV9FTVBUWSh4KSA/IE5VTEwgIFwKKyAgICAgICAgICAgICAgICAgICAgOiBuYW1lIyNfU1BMQVlfTUlOX01BWCh4LCBTUExBWV9ORUdJTkYpKQorI2RlZmluZSBTUExBWV9NQVgobmFtZSwgeCkgICAgICAoU1BMQVlfRU1QVFkoeCkgPyBOVUxMICBcCisgICAgICAgICAgICAgICAgICAgIDogbmFtZSMjX1NQTEFZX01JTl9NQVgoeCwgU1BMQVlfSU5GKSkKKworI2RlZmluZSBTUExBWV9GT1JFQUNIKHgsIG5hbWUsIGhlYWQpICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICgoeCkgPSBTUExBWV9NSU4obmFtZSwgaGVhZCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgKHgpICE9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoeCkgPSBTUExBWV9ORVhUKG5hbWUsIGhlYWQsIHgpKQorCisvKiBNYWNyb3MgdGhhdCBkZWZpbmUgYSByZWQtYmxhY2sgdHJlZSAqLworI2RlZmluZSBSQl9IRUFEKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IG5hbWUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnJiaF9yb290OyAvKiByb290IG9mIHRoZSB0cmVlICovICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgUkJfSU5JVElBTElaRVIocm9vdCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBOVUxMIH0KKworI2RlZmluZSBSQl9JTklUKHJvb3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChyb290KS0+cmJoX3Jvb3QgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFJCX0JMQUNLICAgIDAKKyNkZWZpbmUgUkJfUkVEICAgICAgMQorI2RlZmluZSBSQl9FTlRSWSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RydWN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqcmJlX2xlZnQ7ICAgICAgLyogbGVmdCBlbGVtZW50ICovICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpyYmVfcmlnaHQ7ICAgICAvKiByaWdodCBlbGVtZW50ICovICAgICBcCisgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnJiZV9wYXJlbnQ7ICAgIC8qIHBhcmVudCBlbGVtZW50ICovICAgICAgICBcCisgICAgaW50IHJiZV9jb2xvcjsgICAgICAgICAgLyogbm9kZSBjb2xvciAqLyAgICAgICAgXAorfQorCisjZGVmaW5lIFJCX0xFRlQoZWxtLCBmaWVsZCkgICAgIChlbG0pLT5maWVsZC5yYmVfbGVmdAorI2RlZmluZSBSQl9SSUdIVChlbG0sIGZpZWxkKSAgICAgICAgKGVsbSktPmZpZWxkLnJiZV9yaWdodAorI2RlZmluZSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkgICAgICAgKGVsbSktPmZpZWxkLnJiZV9wYXJlbnQKKyNkZWZpbmUgUkJfQ09MT1IoZWxtLCBmaWVsZCkgICAgICAgIChlbG0pLT5maWVsZC5yYmVfY29sb3IKKyNkZWZpbmUgUkJfUk9PVChoZWFkKSAgICAgICAgICAgKGhlYWQpLT5yYmhfcm9vdAorI2RlZmluZSBSQl9FTVBUWShoZWFkKSAgICAgICAgICAoUkJfUk9PVChoZWFkKSA9PSBOVUxMKQorCisjZGVmaW5lIFJCX1NFVChlbG0sIHBhcmVudCwgZmllbGQpIGRvIHsgICAgICAgICAgICAgICAgIFwKKyAgICBSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPSBwYXJlbnQ7ICAgICAgICAgICAgICAgICBcCisgICAgUkJfTEVGVChlbG0sIGZpZWxkKSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpID0gTlVMTDsgICAgICBcCisgICAgUkJfQ09MT1IoZWxtLCBmaWVsZCkgPSBSQl9SRUQ7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoLypDT05TVENPTkQqLyAwKQorCisjZGVmaW5lIFJCX1NFVF9CTEFDS1JFRChibGFjaywgcmVkLCBmaWVsZCkgZG8geyAgICAgICAgICAgICBcCisgICAgUkJfQ09MT1IoYmxhY2ssIGZpZWxkKSA9IFJCX0JMQUNLOyAgICAgICAgICAgICAgXAorICAgIFJCX0NPTE9SKHJlZCwgZmllbGQpID0gUkJfUkVEOyAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2lmbmRlZiBSQl9BVUdNRU5UCisjZGVmaW5lIFJCX0FVR01FTlQoeCkgICBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIFJCX1JPVEFURV9MRUZUKGhlYWQsIGVsbSwgdG1wLCBmaWVsZCkgZG8geyAgICAgICAgICBcCisgICAgKHRtcCkgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoUkJfUklHSFQoZWxtLCBmaWVsZCkgPSBSQl9MRUZUKHRtcCwgZmllbGQpKSAhPSBOVUxMKSB7IFwKKyAgICAgICAgUkJfUEFSRU5UKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9IChlbG0pOyAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSQl9BVUdNRU5UKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpKSAhPSBOVUxMKSB7ICBcCisgICAgICAgIGlmICgoZWxtKSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSBcCisgICAgICAgICAgICBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7ICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkJfUklHSFQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkgPSAodG1wKTsgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGhlYWQpLT5yYmhfcm9vdCA9ICh0bXApOyAgICAgICAgICAgICAgIFwKKyAgICBSQl9MRUZUKHRtcCwgZmllbGQpID0gKGVsbSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgUkJfUEFSRU5UKGVsbSwgZmllbGQpID0gKHRtcCk7ICAgICAgICAgICAgICAgICAgXAorICAgIFJCX0FVR01FTlQodG1wKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChSQl9QQVJFTlQodG1wLCBmaWVsZCkpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSQl9BVUdNRU5UKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSk7ICAgICAgICAgIFwKK30gd2hpbGUgKC8qQ09OU1RDT05EKi8gMCkKKworI2RlZmluZSBSQl9ST1RBVEVfUklHSFQoaGVhZCwgZWxtLCB0bXAsIGZpZWxkKSBkbyB7ICAgICAgICAgXAorICAgICh0bXApID0gUkJfTEVGVChlbG0sIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKFJCX0xFRlQoZWxtLCBmaWVsZCkgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKSkgIT0gTlVMTCkgeyBcCisgICAgICAgIFJCX1BBUkVOVChSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID0gKGVsbSk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkJfQVVHTUVOVChlbG0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKFJCX1BBUkVOVCh0bXAsIGZpZWxkKSA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKSkgIT0gTlVMTCkgeyAgXAorICAgICAgICBpZiAoKGVsbSkgPT0gUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSkgXAorICAgICAgICAgICAgUkJfTEVGVChSQl9QQVJFTlQoZWxtLCBmaWVsZCksIGZpZWxkKSA9ICh0bXApOyAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJCX1JJR0hUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpID0gKHRtcCk7IFwKKyAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChoZWFkKS0+cmJoX3Jvb3QgPSAodG1wKTsgICAgICAgICAgICAgICBcCisgICAgUkJfUklHSFQodG1wLCBmaWVsZCkgPSAoZWxtKTsgICAgICAgICAgICAgICAgICAgXAorICAgIFJCX1BBUkVOVChlbG0sIGZpZWxkKSA9ICh0bXApOyAgICAgICAgICAgICAgICAgIFwKKyAgICBSQl9BVUdNRU5UKHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoUkJfUEFSRU5UKHRtcCwgZmllbGQpKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUkJfQVVHTUVOVChSQl9QQVJFTlQodG1wLCBmaWVsZCkpOyAgICAgICAgICBcCit9IHdoaWxlICgvKkNPTlNUQ09ORCovIDApCisKKy8qIEdlbmVyYXRlcyBwcm90b3R5cGVzIGFuZCBpbmxpbmUgZnVuY3Rpb25zICovCisjZGVmaW5lIFJCX1BST1RPVFlQRShuYW1lLCB0eXBlLCBmaWVsZCwgY21wKSAgICAgICAgICAgICAgICBcCisgICAgUkJfUFJPVE9UWVBFX0lOVEVSTkFMKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXAsKQorI2RlZmluZSBSQl9QUk9UT1RZUEVfU1RBVElDKG5hbWUsIHR5cGUsIGZpZWxkLCBjbXApICAgICAgICAgXAorICAgIFJCX1BST1RPVFlQRV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCBfX3VudXNlZCBzdGF0aWMpCisjZGVmaW5lIFJCX1BST1RPVFlQRV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCBhdHRyKSAgICAgXAorYXR0ciB2b2lkIG5hbWUjI19SQl9JTlNFUlRfQ09MT1IoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgICBcCithdHRyIHZvaWQgbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqKTtcCithdHRyIFNZU19UUkVFX1NUUlVDVCB0eXBlICpuYW1lIyNfUkJfUkVNT1ZFKFNZU19UUkVFX1NUUlVDVCBuYW1lICosIFNZU19UUkVFX1NUUlVDVCB0eXBlICopOyAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm5hbWUjI19SQl9JTlNFUlQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgXAorYXR0ciBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqbmFtZSMjX1JCX0ZJTkQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgICBcCithdHRyIFNZU19UUkVFX1NUUlVDVCB0eXBlICpuYW1lIyNfUkJfTkZJTkQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKik7ICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm5hbWUjI19SQl9ORVhUKFNZU19UUkVFX1NUUlVDVCB0eXBlICopOyAgICAgICAgICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm5hbWUjI19SQl9QUkVWKFNZU19UUkVFX1NUUlVDVCB0eXBlICopOyAgICAgICAgICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm5hbWUjI19SQl9NSU5NQVgoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKiwgaW50KTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKy8qIE1haW4gcmIgb3BlcmF0aW9uLgorICogTW92ZXMgbm9kZSBjbG9zZSB0byB0aGUga2V5IG9mIGVsbSB0byB0b3AKKyAqLworI2RlZmluZSBSQl9HRU5FUkFURShuYW1lLCB0eXBlLCBmaWVsZCwgY21wKSAgICAgICAgICAgICBcCisgICAgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwpCisjZGVmaW5lIFJCX0dFTkVSQVRFX1NUQVRJQyhuYW1lLCB0eXBlLCBmaWVsZCwgY21wKSAgICAgICAgICBcCisgICAgUkJfR0VORVJBVEVfSU5URVJOQUwobmFtZSwgdHlwZSwgZmllbGQsIGNtcCwgX191bnVzZWQgc3RhdGljKQorI2RlZmluZSBSQl9HRU5FUkFURV9JTlRFUk5BTChuYW1lLCB0eXBlLCBmaWVsZCwgY21wLCBhdHRyKSAgICAgIFwKK2F0dHIgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lIyNfUkJfSU5TRVJUX0NPTE9SKFNZU19UUkVFX1NUUlVDVCBuYW1lICpoZWFkLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqZWxtKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpwYXJlbnQsICpncGFyZW50LCAqdG1wOyAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKChwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCkpICE9IE5VTEwgJiYgICAgICBcCisgICAgICAgIFJCX0NPTE9SKHBhcmVudCwgZmllbGQpID09IFJCX1JFRCkgeyAgICAgICAgICAgIFwKKyAgICAgICAgZ3BhcmVudCA9IFJCX1BBUkVOVChwYXJlbnQsIGZpZWxkKTsgICAgICAgICBcCisgICAgICAgIGlmIChwYXJlbnQgPT0gUkJfTEVGVChncGFyZW50LCBmaWVsZCkpIHsgICAgICAgIFwKKyAgICAgICAgICAgIHRtcCA9IFJCX1JJR0hUKGdwYXJlbnQsIGZpZWxkKTsgICAgICAgICBcCisgICAgICAgICAgICBpZiAodG1wICYmIFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgeyAgICBcCisgICAgICAgICAgICAgICAgUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9CTEFDSzsgICAgXAorICAgICAgICAgICAgICAgIFJCX1NFVF9CTEFDS1JFRChwYXJlbnQsIGdwYXJlbnQsIGZpZWxkKTtcCisgICAgICAgICAgICAgICAgZWxtID0gZ3BhcmVudDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoUkJfUklHSFQocGFyZW50LCBmaWVsZCkgPT0gZWxtKSB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSBwYXJlbnQ7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBhcmVudCA9IGVsbTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxtID0gdG1wOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkJfU0VUX0JMQUNLUkVEKHBhcmVudCwgZ3BhcmVudCwgZmllbGQpOyAgICBcCisgICAgICAgICAgICBSQl9ST1RBVEVfUklHSFQoaGVhZCwgZ3BhcmVudCwgdG1wLCBmaWVsZCk7IFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0bXAgPSBSQl9MRUZUKGdwYXJlbnQsIGZpZWxkKTsgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHRtcCAmJiBSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsgICAgXAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQkxBQ0s7ICAgIFwKKyAgICAgICAgICAgICAgICBSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7XAorICAgICAgICAgICAgICAgIGVsbSA9IGdwYXJlbnQ7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKFJCX0xFRlQocGFyZW50LCBmaWVsZCkgPT0gZWxtKSB7ICAgICAgICBcCisgICAgICAgICAgICAgICAgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorICAgICAgICAgICAgICAgIHRtcCA9IHBhcmVudDsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcGFyZW50ID0gZWxtOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbG0gPSB0bXA7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSQl9TRVRfQkxBQ0tSRUQocGFyZW50LCBncGFyZW50LCBmaWVsZCk7ICAgIFwKKyAgICAgICAgICAgIFJCX1JPVEFURV9MRUZUKGhlYWQsIGdwYXJlbnQsIHRtcCwgZmllbGQpOyAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJCX0NPTE9SKGhlYWQtPnJiaF9yb290LCBmaWVsZCkgPSBSQl9CTEFDSzsgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCithdHRyIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihTWVNfVFJFRV9TVFJVQ1QgbmFtZSAqaGVhZCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnBhcmVudCwgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICp0bXA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKChlbG0gPT0gTlVMTCB8fCBSQl9DT0xPUihlbG0sIGZpZWxkKSA9PSBSQl9CTEFDSykgJiYgXAorICAgICAgICBlbG0gIT0gUkJfUk9PVChoZWFkKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9PSBlbG0pIHsgICAgICAgICAgICBcCisgICAgICAgICAgICB0bXAgPSBSQl9SSUdIVChwYXJlbnQsIGZpZWxkKTsgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKFJCX0NPTE9SKHRtcCwgZmllbGQpID09IFJCX1JFRCkgeyAgICAgICBcCisgICAgICAgICAgICAgICAgUkJfU0VUX0JMQUNLUkVEKHRtcCwgcGFyZW50LCBmaWVsZCk7ICAgIFwKKyAgICAgICAgICAgICAgICBSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSBSQl9SSUdIVChwYXJlbnQsIGZpZWxkKTsgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoKFJCX0xFRlQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fCAgICAgXAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKFJCX0xFRlQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykgJiZcCisgICAgICAgICAgICAgICAgKFJCX1JJR0hUKHRtcCwgZmllbGQpID09IE5VTEwgfHwgICAgICAgIFwKKyAgICAgICAgICAgICAgICBSQl9DT0xPUihSQl9SSUdIVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSkge1wKKyAgICAgICAgICAgICAgICBSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsgICAgICBcCisgICAgICAgICAgICAgICAgZWxtID0gcGFyZW50OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7ICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChSQl9SSUdIVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9PSBSQl9CTEFDSykge1wKKyAgICAgICAgICAgICAgICAgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKm9sZWZ0OyAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiAoKG9sZWZ0ID0gUkJfTEVGVCh0bXAsIGZpZWxkKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgIT0gTlVMTCkgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBSQl9DT0xPUihvbGVmdCwgZmllbGQpID0gUkJfQkxBQ0s7XAorICAgICAgICAgICAgICAgICAgICBSQl9DT0xPUih0bXAsIGZpZWxkKSA9IFJCX1JFRDsgIFwKKyAgICAgICAgICAgICAgICAgICAgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHRtcCwgb2xlZnQsIGZpZWxkKTtcCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IFJCX1JJR0hUKHBhcmVudCwgZmllbGQpOyAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfQ09MT1IocGFyZW50LCBmaWVsZCk7XAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKHBhcmVudCwgZmllbGQpID0gUkJfQkxBQ0s7IFwKKyAgICAgICAgICAgICAgICBpZiAoUkJfUklHSFQodG1wLCBmaWVsZCkpICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgUkJfQ09MT1IoUkJfUklHSFQodG1wLCBmaWVsZCksIGZpZWxkKSA9IFJCX0JMQUNLO1wKKyAgICAgICAgICAgICAgICBSQl9ST1RBVEVfTEVGVChoZWFkLCBwYXJlbnQsIHRtcCwgZmllbGQpO1wKKyAgICAgICAgICAgICAgICBlbG0gPSBSQl9ST09UKGhlYWQpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChSQl9DT0xPUih0bXAsIGZpZWxkKSA9PSBSQl9SRUQpIHsgICAgICAgXAorICAgICAgICAgICAgICAgIFJCX1NFVF9CTEFDS1JFRCh0bXAsIHBhcmVudCwgZmllbGQpOyAgICBcCisgICAgICAgICAgICAgICAgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorICAgICAgICAgICAgICAgIHRtcCA9IFJCX0xFRlQocGFyZW50LCBmaWVsZCk7ICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoUkJfTEVGVCh0bXAsIGZpZWxkKSA9PSBOVUxMIHx8ICAgICBcCisgICAgICAgICAgICAgICAgUkJfQ09MT1IoUkJfTEVGVCh0bXAsIGZpZWxkKSwgZmllbGQpID09IFJCX0JMQUNLKSAmJlwKKyAgICAgICAgICAgICAgICAoUkJfUklHSFQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fCAgICAgICAgXAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKFJCX1JJR0hUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spKSB7XAorICAgICAgICAgICAgICAgIFJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOyAgICAgIFwKKyAgICAgICAgICAgICAgICBlbG0gPSBwYXJlbnQ7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBhcmVudCA9IFJCX1BBUkVOVChlbG0sIGZpZWxkKTsgICAgIFwKKyAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKFJCX0xFRlQodG1wLCBmaWVsZCkgPT0gTlVMTCB8fCAgXAorICAgICAgICAgICAgICAgICAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPT0gUkJfQkxBQ0spIHtcCisgICAgICAgICAgICAgICAgICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpvcmlnaHQ7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmICgob3JpZ2h0ID0gUkJfUklHSFQodG1wLCBmaWVsZCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE5VTEwpICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgUkJfQ09MT1Iob3JpZ2h0LCBmaWVsZCkgPSBSQl9CTEFDSztcCisgICAgICAgICAgICAgICAgICAgIFJCX0NPTE9SKHRtcCwgZmllbGQpID0gUkJfUkVEOyAgXAorICAgICAgICAgICAgICAgICAgICBSQl9ST1RBVEVfTEVGVChoZWFkLCB0bXAsIG9yaWdodCwgZmllbGQpO1wKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gUkJfTEVGVChwYXJlbnQsIGZpZWxkKTsgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUkJfQ09MT1IodG1wLCBmaWVsZCkgPSBSQl9DT0xPUihwYXJlbnQsIGZpZWxkKTtcCisgICAgICAgICAgICAgICAgUkJfQ09MT1IocGFyZW50LCBmaWVsZCkgPSBSQl9CTEFDSzsgXAorICAgICAgICAgICAgICAgIGlmIChSQl9MRUZUKHRtcCwgZmllbGQpKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBSQl9DT0xPUihSQl9MRUZUKHRtcCwgZmllbGQpLCBmaWVsZCkgPSBSQl9CTEFDSztcCisgICAgICAgICAgICAgICAgUkJfUk9UQVRFX1JJR0hUKGhlYWQsIHBhcmVudCwgdG1wLCBmaWVsZCk7XAorICAgICAgICAgICAgICAgIGVsbSA9IFJCX1JPT1QoaGVhZCk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZWxtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJCX0NPTE9SKGVsbSwgZmllbGQpID0gUkJfQkxBQ0s7ICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYXR0ciBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lIyNfUkJfUkVNT1ZFKFNZU19UUkVFX1NUUlVDVCBuYW1lICpoZWFkLCBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqZWxtKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpjaGlsZCwgKnBhcmVudCwgKm9sZCA9IGVsbTsgICAgICAgICAgICBcCisgICAgaW50IGNvbG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChSQl9MRUZUKGVsbSwgZmllbGQpID09IE5VTEwpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hpbGQgPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkgPT0gTlVMTCkgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hpbGQgPSBSQl9MRUZUKGVsbSwgZmllbGQpOyAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqbGVmdDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsbSA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOyAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICgobGVmdCA9IFJCX0xFRlQoZWxtLCBmaWVsZCkpICE9IE5VTEwpICAgICAgICBcCisgICAgICAgICAgICBlbG0gPSBsZWZ0OyAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGlsZCA9IFJCX1JJR0hUKGVsbSwgZmllbGQpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOyAgICAgICAgICAgICBcCisgICAgICAgIGNvbG9yID0gUkJfQ09MT1IoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoY2hpbGQpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJCX1BBUkVOVChjaGlsZCwgZmllbGQpID0gcGFyZW50OyAgICAgICBcCisgICAgICAgIGlmIChwYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgICAgICBcCisgICAgICAgICAgICAgICAgUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOyAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOyAgICBcCisgICAgICAgICAgICBSQl9BVUdNRU5UKHBhcmVudCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSQl9ST09UKGhlYWQpID0gY2hpbGQ7ICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgPT0gb2xkKSAgICAgICAgICAgXAorICAgICAgICAgICAgcGFyZW50ID0gZWxtOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChlbG0pLT5maWVsZCA9IChvbGQpLT5maWVsZDsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoUkJfUEFSRU5UKG9sZCwgZmllbGQpKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChSQl9MRUZUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID09IG9sZClcCisgICAgICAgICAgICAgICAgUkJfTEVGVChSQl9QQVJFTlQob2xkLCBmaWVsZCksIGZpZWxkKSA9IGVsbTtcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFJCX1JJR0hUKFJCX1BBUkVOVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtO1wKKyAgICAgICAgICAgIFJCX0FVR01FTlQoUkJfUEFSRU5UKG9sZCwgZmllbGQpKTsgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkJfUk9PVChoZWFkKSA9IGVsbTsgICAgICAgICAgICAgICAgXAorICAgICAgICBSQl9QQVJFTlQoUkJfTEVGVChvbGQsIGZpZWxkKSwgZmllbGQpID0gZWxtOyAgICAgICAgXAorICAgICAgICBpZiAoUkJfUklHSFQob2xkLCBmaWVsZCkpICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkJfUEFSRU5UKFJCX1JJR0hUKG9sZCwgZmllbGQpLCBmaWVsZCkgPSBlbG07ICAgXAorICAgICAgICBpZiAocGFyZW50KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsZWZ0ID0gcGFyZW50OyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUkJfQVVHTUVOVChsZWZ0KTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gd2hpbGUgKChsZWZ0ID0gUkJfUEFSRU5UKGxlZnQsIGZpZWxkKSkgIT0gTlVMTCk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBjb2xvcjsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGFyZW50ID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOyAgICAgICAgICAgICAgICAgXAorICAgIGNvbG9yID0gUkJfQ09MT1IoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY2hpbGQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJCX1BBUkVOVChjaGlsZCwgZmllbGQpID0gcGFyZW50OyAgICAgICAgICAgXAorICAgIGlmIChwYXJlbnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChSQl9MRUZUKHBhcmVudCwgZmllbGQpID09IGVsbSkgICAgICAgICAgXAorICAgICAgICAgICAgUkJfTEVGVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOyAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBSQl9SSUdIVChwYXJlbnQsIGZpZWxkKSA9IGNoaWxkOyAgICAgICAgXAorICAgICAgICBSQl9BVUdNRU5UKHBhcmVudCk7ICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSQl9ST09UKGhlYWQpID0gY2hpbGQ7ICAgICAgICAgICAgICAgICAgXAorY29sb3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29sb3IgPT0gUkJfQkxBQ0spICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmFtZSMjX1JCX1JFTU9WRV9DT0xPUihoZWFkLCBwYXJlbnQsIGNoaWxkKTsgICAgICAgIFwKKyAgICByZXR1cm4gKG9sZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorLyogSW5zZXJ0cyBhIG5vZGUgaW50byB0aGUgUkIgdHJlZSAqLyAgICAgICAgICAgICAgICAgICBcCithdHRyIFNZU19UUkVFX1NUUlVDVCB0eXBlICogICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUjI19SQl9JTlNFUlQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKmhlYWQsIFNZU19UUkVFX1NUUlVDVCB0eXBlICplbG0pICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnRtcDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqcGFyZW50ID0gTlVMTDsgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY29tcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcCA9IFJCX1JPT1QoaGVhZCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICh0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBhcmVudCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29tcCA9IChjbXApKGVsbSwgcGFyZW50KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbXAgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChjb21wID4gMCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuICh0bXApOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkJfU0VUKGVsbSwgcGFyZW50LCBmaWVsZCk7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb21wIDwgMCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFJCX0xFRlQocGFyZW50LCBmaWVsZCkgPSBlbG07ICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkJfUklHSFQocGFyZW50LCBmaWVsZCkgPSBlbG07ICAgICAgICAgIFwKKyAgICAgICAgUkJfQVVHTUVOVChwYXJlbnQpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUkJfUk9PVChoZWFkKSA9IGVsbTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lIyNfUkJfSU5TRVJUX0NPTE9SKGhlYWQsIGVsbSk7ICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIChOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy8qIEZpbmRzIHRoZSBub2RlIHdpdGggdGhlIHNhbWUga2V5IGFzIGVsbSAqLyAgICAgICAgICAgICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1JCX0ZJTkQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKmhlYWQsIFNZU19UUkVFX1NUUlVDVCB0eXBlICplbG0pICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICp0bXAgPSBSQl9ST09UKGhlYWQpOyAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY29tcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHRtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29tcCA9IGNtcChlbG0sIHRtcCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbXAgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChjb21wID4gMCkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0bXAgPSBSQl9SSUdIVCh0bXAsIGZpZWxkKTsgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuICh0bXApOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIChOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKy8qIEZpbmRzIHRoZSBmaXJzdCBub2RlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VhcmNoIGtleSAqLyAgXAorYXR0ciBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lIyNfUkJfTkZJTkQoU1lTX1RSRUVfU1RSVUNUIG5hbWUgKmhlYWQsIFNZU19UUkVFX1NUUlVDVCB0eXBlICplbG0pICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICp0bXAgPSBSQl9ST09UKGhlYWQpOyAgICAgICAgICAgICAgIFwKKyAgICBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqcmVzID0gTlVMTDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY29tcDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHRtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29tcCA9IGNtcChlbG0sIHRtcCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNvbXAgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmVzID0gdG1wOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRtcCA9IFJCX0xFRlQodG1wLCBmaWVsZCk7ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBpZiAoY29tcCA+IDApICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdG1wID0gUkJfUklHSFQodG1wLCBmaWVsZCk7ICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiAodG1wKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisvKiBBUkdTVVNFRCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1JCX05FWFQoU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUkJfUklHSFQoZWxtLCBmaWVsZCkpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxtID0gUkJfUklHSFQoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKFJCX0xFRlQoZWxtLCBmaWVsZCkpICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsbSA9IFJCX0xFRlQoZWxtLCBmaWVsZCk7ICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSkgXAorICAgICAgICAgICAgZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOyAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoUkJfUEFSRU5UKGVsbSwgZmllbGQpICYmICAgICAgICAgXAorICAgICAgICAgICAgICAgIChlbG0gPT0gUkJfUklHSFQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkpKVwKKyAgICAgICAgICAgICAgICBlbG0gPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7ICAgICAgICBcCisgICAgICAgICAgICBlbG0gPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoZWxtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisvKiBBUkdTVVNFRCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2F0dHIgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSMjX1JCX1BSRVYoU1lTX1RSRUVfU1RSVUNUIHR5cGUgKmVsbSkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUkJfTEVGVChlbG0sIGZpZWxkKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxtID0gUkJfTEVGVChlbG0sIGZpZWxkKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKFJCX1JJR0hUKGVsbSwgZmllbGQpKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbG0gPSBSQl9SSUdIVChlbG0sIGZpZWxkKTsgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoUkJfUEFSRU5UKGVsbSwgZmllbGQpICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChlbG0gPT0gUkJfUklHSFQoUkJfUEFSRU5UKGVsbSwgZmllbGQpLCBmaWVsZCkpKSAgICBcCisgICAgICAgICAgICBlbG0gPSBSQl9QQVJFTlQoZWxtLCBmaWVsZCk7ICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlIChSQl9QQVJFTlQoZWxtLCBmaWVsZCkgJiYgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGVsbSA9PSBSQl9MRUZUKFJCX1BBUkVOVChlbG0sIGZpZWxkKSwgZmllbGQpKSlcCisgICAgICAgICAgICAgICAgZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOyAgICAgICAgXAorICAgICAgICAgICAgZWxtID0gUkJfUEFSRU5UKGVsbSwgZmllbGQpOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKGVsbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorYXR0ciBTWVNfVFJFRV9TVFJVQ1QgdHlwZSAqICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lIyNfUkJfTUlOTUFYKFNZU19UUkVFX1NUUlVDVCBuYW1lICpoZWFkLCBpbnQgdmFsKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1lTX1RSRUVfU1RSVUNUIHR5cGUgKnRtcCA9IFJCX1JPT1QoaGVhZCk7ICAgICAgICAgICAgICAgXAorICAgIFNZU19UUkVFX1NUUlVDVCB0eXBlICpwYXJlbnQgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICh0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBhcmVudCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHZhbCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdG1wID0gUkJfTEVGVCh0bXAsIGZpZWxkKTsgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRtcCA9IFJCX1JJR0hUKHRtcCwgZmllbGQpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHBhcmVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFJCX05FR0lORiAgIC0xCisjZGVmaW5lIFJCX0lORiAgMQorCisjZGVmaW5lIFJCX0lOU0VSVChuYW1lLCB4LCB5KSAgIG5hbWUjI19SQl9JTlNFUlQoeCwgeSkKKyNkZWZpbmUgUkJfUkVNT1ZFKG5hbWUsIHgsIHkpICAgbmFtZSMjX1JCX1JFTU9WRSh4LCB5KQorI2RlZmluZSBSQl9GSU5EKG5hbWUsIHgsIHkpIG5hbWUjI19SQl9GSU5EKHgsIHkpCisjZGVmaW5lIFJCX05GSU5EKG5hbWUsIHgsIHkpICAgIG5hbWUjI19SQl9ORklORCh4LCB5KQorI2RlZmluZSBSQl9ORVhUKG5hbWUsIHgsIHkpIG5hbWUjI19SQl9ORVhUKHkpCisjZGVmaW5lIFJCX1BSRVYobmFtZSwgeCwgeSkgbmFtZSMjX1JCX1BSRVYoeSkKKyNkZWZpbmUgUkJfTUlOKG5hbWUsIHgpICAgICBuYW1lIyNfUkJfTUlOTUFYKHgsIFJCX05FR0lORikKKyNkZWZpbmUgUkJfTUFYKG5hbWUsIHgpICAgICBuYW1lIyNfUkJfTUlOTUFYKHgsIFJCX0lORikKKworI2RlZmluZSBSQl9GT1JFQUNIKHgsIG5hbWUsIGhlYWQpICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKCh4KSA9IFJCX01JTihuYW1lLCBoZWFkKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAoeCkgIT0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh4KSA9IG5hbWUjI19SQl9ORVhUKHgpKQorCisjZGVmaW5lIFJCX0ZPUkVBQ0hfRlJPTSh4LCBuYW1lLCB5KSAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoKHgpID0gKHkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9ORVhUKHgpLCAoeCkgIT0gTlVMTCk7ICAgIFwKKyAgICAgICAgICh4KSA9ICh5KSkKKworI2RlZmluZSBSQl9GT1JFQUNIX1NBRkUoeCwgbmFtZSwgaGVhZCwgeSkgICAgICAgICAgICAgICBcCisgICAgZm9yICgoeCkgPSBSQl9NSU4obmFtZSwgaGVhZCk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHgpICE9IE5VTEwpICYmICgoeSkgPSBuYW1lIyNfUkJfTkVYVCh4KSwgKHgpICE9IE5VTEwpOyAgICBcCisgICAgICAgICAoeCkgPSAoeSkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFKHgsIG5hbWUsIGhlYWQpICAgICAgICAgICAgICAgXAorICAgIGZvciAoKHgpID0gUkJfTUFYKG5hbWUsIGhlYWQpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICh4KSAhPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgKHgpID0gbmFtZSMjX1JCX1BSRVYoeCkpCisKKyNkZWZpbmUgUkJfRk9SRUFDSF9SRVZFUlNFX0ZST00oeCwgbmFtZSwgeSkgICAgICAgICAgICAgXAorICAgIGZvciAoKHgpID0gKHkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoeCkgIT0gTlVMTCkgJiYgKCh5KSA9IG5hbWUjI19SQl9QUkVWKHgpLCAoeCkgIT0gTlVMTCk7ICAgIFwKKyAgICAgICAgICh4KSA9ICh5KSkKKworI2RlZmluZSBSQl9GT1JFQUNIX1JFVkVSU0VfU0FGRSh4LCBuYW1lLCBoZWFkLCB5KSAgICAgICAgICAgXAorICAgIGZvciAoKHgpID0gUkJfTUFYKG5hbWUsIGhlYWQpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh4KSAhPSBOVUxMKSAmJiAoKHkpID0gbmFtZSMjX1JCX1BSRVYoeCksICh4KSAhPSBOVUxMKTsgICAgXAorICAgICAgICAgKHgpID0gKHkpKQorCisjZW5kaWYgIC8qIF9TWVNfVFJFRV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXAtd2luMzIuYyBiL2FuZHJvaWQvcWVtdTEvdGFwLXdpbjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNmJkNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFwLXdpbjMyLmMKQEAgLTAsMCArMSw2ODggQEAKKy8qCisgKiAgVEFQLVdpbjMyIC0tIEEga2VybmVsIGRyaXZlciB0byBwcm92aWRlIHZpcnR1YWwgdGFwIGRldmljZSBmdW5jdGlvbmFsaXR5CisgKiAgICAgICAgICAgICAgIG9uIFdpbmRvd3MuICBPcmlnaW5hbGx5IGRlcml2ZWQgZnJvbSB0aGUgQ0lQRS1XaW4zMgorICogICAgICAgICAgICAgICBwcm9qZWN0IGJ5IERhbWlvbiBLLiBXaWxzb24sIHdpdGggZXh0ZW5zaXZlIG1vZGlmaWNhdGlvbnMgYnkKKyAqICAgICAgICAgICAgICAgSmFtZXMgWW9uYW4uCisgKgorICogIEFsbCBzb3VyY2UgY29kZSB3aGljaCBkZXJpdmVzIGZyb20gdGhlIENJUEUtV2luMzIgcHJvamVjdCBpcworICogIENvcHlyaWdodCAoQykgRGFtaW9uIEsuIFdpbHNvbiwgMjAwMywgYW5kIGlzIHJlbGVhc2VkIHVuZGVyIHRoZQorICogIEdQTCB2ZXJzaW9uIDIgKHNlZSBiZWxvdykuCisgKgorICogIEFsbCBvdGhlciBzb3VyY2UgY29kZSBpcyBDb3B5cmlnaHQgKEMpIEphbWVzIFlvbmFuLCAyMDAzLTIwMDQsCisgKiAgYW5kIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyIChzZWUgYmVsb3cpLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChzZWUgdGhlIGZpbGUgQ09QWUlORyBpbmNsdWRlZCB3aXRoIHRoaXMKKyAqICBkaXN0cmlidXRpb24pOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAibmV0L25ldC5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5pb2N0bC5oPgorCisvLz09PT09PT09PT09PT0KKy8vIFRBUCBJT0NUTHMKKy8vPT09PT09PT09PT09PQorCisjZGVmaW5lIFRBUF9DT05UUk9MX0NPREUocmVxdWVzdCxtZXRob2QpIFwKKyAgQ1RMX0NPREUgKEZJTEVfREVWSUNFX1VOS05PV04sIHJlcXVlc3QsIG1ldGhvZCwgRklMRV9BTllfQUNDRVNTKQorCisjZGVmaW5lIFRBUF9JT0NUTF9HRVRfTUFDICAgICAgICAgICAgICAgVEFQX0NPTlRST0xfQ09ERSAoMSwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBUQVBfSU9DVExfR0VUX1ZFUlNJT04gICAgICAgICAgIFRBUF9DT05UUk9MX0NPREUgKDIsIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgVEFQX0lPQ1RMX0dFVF9NVFUgICAgICAgICAgICAgICBUQVBfQ09OVFJPTF9DT0RFICgzLCBNRVRIT0RfQlVGRkVSRUQpCisjZGVmaW5lIFRBUF9JT0NUTF9HRVRfSU5GTyAgICAgICAgICAgICAgVEFQX0NPTlRST0xfQ09ERSAoNCwgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBUQVBfSU9DVExfQ09ORklHX1BPSU5UX1RPX1BPSU5UIFRBUF9DT05UUk9MX0NPREUgKDUsIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgVEFQX0lPQ1RMX1NFVF9NRURJQV9TVEFUVVMgICAgICBUQVBfQ09OVFJPTF9DT0RFICg2LCBNRVRIT0RfQlVGRkVSRUQpCisjZGVmaW5lIFRBUF9JT0NUTF9DT05GSUdfREhDUF9NQVNRICAgICAgVEFQX0NPTlRST0xfQ09ERSAoNywgTUVUSE9EX0JVRkZFUkVEKQorI2RlZmluZSBUQVBfSU9DVExfR0VUX0xPR19MSU5FICAgICAgICAgIFRBUF9DT05UUk9MX0NPREUgKDgsIE1FVEhPRF9CVUZGRVJFRCkKKyNkZWZpbmUgVEFQX0lPQ1RMX0NPTkZJR19ESENQX1NFVF9PUFQgICBUQVBfQ09OVFJPTF9DT0RFICg5LCBNRVRIT0RfQlVGRkVSRUQpCisKKy8vPT09PT09PT09PT09PT09PT0KKy8vIFJlZ2lzdHJ5IGtleXMKKy8vPT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBBREFQVEVSX0tFWSAiU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcQ2xhc3NcXHs0RDM2RTk3Mi1FMzI1LTExQ0UtQkZDMS0wODAwMkJFMTAzMTh9IgorCisjZGVmaW5lIE5FVFdPUktfQ09OTkVDVElPTlNfS0VZICJTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxOZXR3b3JrXFx7NEQzNkU5NzItRTMyNS0xMUNFLUJGQzEtMDgwMDJCRTEwMzE4fSIKKworLy89PT09PT09PT09PT09PT09PT09PT09CisvLyBGaWxlc3lzdGVtIHByZWZpeGVzCisvLz09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBVU0VSTU9ERURFVklDRURJUiAiXFxcXC5cXEdsb2JhbFxcIgorI2RlZmluZSBUQVBTVUZGSVggICAgICAgICAiLnRhcCIKKworCisvLz09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbXBpbGUgdGltZSBjb25maWd1cmF0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT0KKworLy8jZGVmaW5lIERFQlVHX1RBUF9XSU4zMgorCisjZGVmaW5lIFRVTl9BU1lOQ0hST05PVVNfV1JJVEVTIDEKKworI2RlZmluZSBUVU5fQlVGRkVSX1NJWkUgMTU2MAorI2RlZmluZSBUVU5fTUFYX0JVRkZFUl9DT1VOVCAzMgorCisvKgorICogVGhlIGRhdGEgbWVtYmVyICJidWZmZXIiIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHR1bl9idWZmZXIKKyAqIHN0cnVjdHVyZS4gU2VlIHRoZSBmdW5jdGlvbiwgdGFwX3dpbjMyX2ZyZWVfYnVmZmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB0dW5fYnVmZmVyX3MgeworICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyIFtUVU5fQlVGRkVSX1NJWkVdOworICAgIHVuc2lnbmVkIGxvbmcgcmVhZF9zaXplOworICAgIHN0cnVjdCB0dW5fYnVmZmVyX3MqIG5leHQ7Cit9IHR1bl9idWZmZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFwX3dpbjMyX292ZXJsYXBwZWQgeworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgSEFORExFIHJlYWRfZXZlbnQ7CisgICAgSEFORExFIHdyaXRlX2V2ZW50OworICAgIEhBTkRMRSBvdXRwdXRfcXVldWVfc2VtYXBob3JlOworICAgIEhBTkRMRSBmcmVlX2xpc3Rfc2VtYXBob3JlOworICAgIEhBTkRMRSB0YXBfc2VtYXBob3JlOworICAgIENSSVRJQ0FMX1NFQ1RJT04gb3V0cHV0X3F1ZXVlX2NzOworICAgIENSSVRJQ0FMX1NFQ1RJT04gZnJlZV9saXN0X2NzOworICAgIE9WRVJMQVBQRUQgcmVhZF9vdmVybGFwcGVkOworICAgIE9WRVJMQVBQRUQgd3JpdGVfb3ZlcmxhcHBlZDsKKyAgICB0dW5fYnVmZmVyX3QgYnVmZmVyc1tUVU5fTUFYX0JVRkZFUl9DT1VOVF07CisgICAgdHVuX2J1ZmZlcl90KiBmcmVlX2xpc3Q7CisgICAgdHVuX2J1ZmZlcl90KiBvdXRwdXRfcXVldWVfZnJvbnQ7CisgICAgdHVuX2J1ZmZlcl90KiBvdXRwdXRfcXVldWVfYmFjazsKK30gdGFwX3dpbjMyX292ZXJsYXBwZWRfdDsKKworc3RhdGljIHRhcF93aW4zMl9vdmVybGFwcGVkX3QgdGFwX292ZXJsYXBwZWQ7CisKK3N0YXRpYyB0dW5fYnVmZmVyX3QqIGdldF9idWZmZXJfZnJvbV9mcmVlX2xpc3QodGFwX3dpbjMyX292ZXJsYXBwZWRfdCogY29uc3Qgb3ZlcmxhcHBlZCkKK3sKKyAgICB0dW5fYnVmZmVyX3QqIGJ1ZmZlciA9IE5VTEw7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdChvdmVybGFwcGVkLT5mcmVlX2xpc3Rfc2VtYXBob3JlLCBJTkZJTklURSk7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm92ZXJsYXBwZWQtPmZyZWVfbGlzdF9jcyk7CisgICAgYnVmZmVyID0gb3ZlcmxhcHBlZC0+ZnJlZV9saXN0OworLy8gICAgYXNzZXJ0KGJ1ZmZlciAhPSBOVUxMKTsKKyAgICBvdmVybGFwcGVkLT5mcmVlX2xpc3QgPSBidWZmZXItPm5leHQ7CisgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJm92ZXJsYXBwZWQtPmZyZWVfbGlzdF9jcyk7CisgICAgYnVmZmVyLT5uZXh0ID0gTlVMTDsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCBwdXRfYnVmZmVyX29uX2ZyZWVfbGlzdCh0YXBfd2luMzJfb3ZlcmxhcHBlZF90KiBjb25zdCBvdmVybGFwcGVkLCB0dW5fYnVmZmVyX3QqIGNvbnN0IGJ1ZmZlcikKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmb3ZlcmxhcHBlZC0+ZnJlZV9saXN0X2NzKTsKKyAgICBidWZmZXItPm5leHQgPSBvdmVybGFwcGVkLT5mcmVlX2xpc3Q7CisgICAgb3ZlcmxhcHBlZC0+ZnJlZV9saXN0ID0gYnVmZmVyOworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZvdmVybGFwcGVkLT5mcmVlX2xpc3RfY3MpOworICAgIFJlbGVhc2VTZW1hcGhvcmUob3ZlcmxhcHBlZC0+ZnJlZV9saXN0X3NlbWFwaG9yZSwgMSwgTlVMTCk7Cit9CisKK3N0YXRpYyB0dW5fYnVmZmVyX3QqIGdldF9idWZmZXJfZnJvbV9vdXRwdXRfcXVldWUodGFwX3dpbjMyX292ZXJsYXBwZWRfdCogY29uc3Qgb3ZlcmxhcHBlZCwgY29uc3QgaW50IGJsb2NrKQoreworICAgIHR1bl9idWZmZXJfdCogYnVmZmVyID0gTlVMTDsKKyAgICBEV09SRCByZXN1bHQsIHRpbWVvdXQgPSBibG9jayA/IElORklOSVRFIDogMEw7CisKKyAgICAvLyBOb24tYmxvY2tpbmcgY2FsbAorICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3Qob3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX3NlbWFwaG9yZSwgdGltZW91dCk7CisKKyAgICBzd2l0Y2ggKHJlc3VsdCkKKyAgICB7CisgICAgICAgIC8vIFRoZSBzZW1hcGhvcmUgb2JqZWN0IHdhcyBzaWduYWxlZC4KKyAgICAgICAgY2FzZSBXQUlUX09CSkVDVF8wOgorICAgICAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9jcyk7CisKKyAgICAgICAgICAgIGJ1ZmZlciA9IG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9mcm9udDsKKyAgICAgICAgICAgIG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9mcm9udCA9IGJ1ZmZlci0+bmV4dDsKKworICAgICAgICAgICAgaWYob3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX2Zyb250ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBvdmVybGFwcGVkLT5vdXRwdXRfcXVldWVfYmFjayA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZvdmVybGFwcGVkLT5vdXRwdXRfcXVldWVfY3MpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gU2VtYXBob3JlIHdhcyBub25zaWduYWxlZCwgc28gYSB0aW1lLW91dCBvY2N1cnJlZC4KKyAgICAgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgICAgICAvLyBDYW5ub3Qgb3BlbiBhbm90aGVyIHdpbmRvdy4KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB0dW5fYnVmZmVyX3QqIGdldF9idWZmZXJfZnJvbV9vdXRwdXRfcXVldWVfaW1tZWRpYXRlICh0YXBfd2luMzJfb3ZlcmxhcHBlZF90KiBjb25zdCBvdmVybGFwcGVkKQoreworICAgIHJldHVybiBnZXRfYnVmZmVyX2Zyb21fb3V0cHV0X3F1ZXVlKG92ZXJsYXBwZWQsIDApOworfQorCitzdGF0aWMgdm9pZCBwdXRfYnVmZmVyX29uX291dHB1dF9xdWV1ZSh0YXBfd2luMzJfb3ZlcmxhcHBlZF90KiBjb25zdCBvdmVybGFwcGVkLCB0dW5fYnVmZmVyX3QqIGNvbnN0IGJ1ZmZlcikKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmb3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX2NzKTsKKworICAgIGlmKG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9mcm9udCA9PSBOVUxMICYmIG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9iYWNrID09IE5VTEwpIHsKKyAgICAgICAgb3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX2Zyb250ID0gb3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX2JhY2sgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgb3ZlcmxhcHBlZC0+b3V0cHV0X3F1ZXVlX2JhY2stPm5leHQgPSBidWZmZXI7CisgICAgICAgIG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9iYWNrID0gYnVmZmVyOworICAgIH0KKworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZvdmVybGFwcGVkLT5vdXRwdXRfcXVldWVfY3MpOworCisgICAgUmVsZWFzZVNlbWFwaG9yZShvdmVybGFwcGVkLT5vdXRwdXRfcXVldWVfc2VtYXBob3JlLCAxLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IGlzX3RhcF93aW4zMl9kZXYoY29uc3QgY2hhciAqZ3VpZCkKK3sKKyAgICBIS0VZIG5ldGNhcmRfa2V5OworICAgIExPTkcgc3RhdHVzOworICAgIERXT1JEIGxlbjsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBzdGF0dXMgPSBSZWdPcGVuS2V5RXgoCisgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgQURBUFRFUl9LRVksCisgICAgICAgIDAsCisgICAgICAgIEtFWV9SRUFELAorICAgICAgICAmbmV0Y2FyZF9rZXkpOworCisgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGNoYXIgZW51bV9uYW1lWzI1Nl07CisgICAgICAgIGNoYXIgdW5pdF9zdHJpbmdbMjU2XTsKKyAgICAgICAgSEtFWSB1bml0X2tleTsKKyAgICAgICAgY2hhciBjb21wb25lbnRfaWRfc3RyaW5nW10gPSAiQ29tcG9uZW50SWQiOworICAgICAgICBjaGFyIGNvbXBvbmVudF9pZFsyNTZdOworICAgICAgICBjaGFyIG5ldF9jZmdfaW5zdGFuY2VfaWRfc3RyaW5nW10gPSAiTmV0Q2ZnSW5zdGFuY2VJZCI7CisgICAgICAgIGNoYXIgbmV0X2NmZ19pbnN0YW5jZV9pZFsyNTZdOworICAgICAgICBEV09SRCBkYXRhX3R5cGU7CisKKyAgICAgICAgbGVuID0gc2l6ZW9mIChlbnVtX25hbWUpOworICAgICAgICBzdGF0dXMgPSBSZWdFbnVtS2V5RXgoCisgICAgICAgICAgICBuZXRjYXJkX2tleSwKKyAgICAgICAgICAgIGksCisgICAgICAgICAgICBlbnVtX25hbWUsCisgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9OT19NT1JFX0lURU1TKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50ZiAodW5pdF9zdHJpbmcsIHNpemVvZih1bml0X3N0cmluZyksICIlc1xcJXMiLAorICAgICAgICAgICAgICAgICAgQURBUFRFUl9LRVksIGVudW1fbmFtZSk7CisKKyAgICAgICAgc3RhdHVzID0gUmVnT3BlbktleUV4KAorICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgdW5pdF9zdHJpbmcsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgS0VZX1JFQUQsCisgICAgICAgICAgICAmdW5pdF9rZXkpOworCisgICAgICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVuID0gc2l6ZW9mIChjb21wb25lbnRfaWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVnUXVlcnlWYWx1ZUV4KAorICAgICAgICAgICAgICAgIHVuaXRfa2V5LAorICAgICAgICAgICAgICAgIGNvbXBvbmVudF9pZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAmZGF0YV90eXBlLAorICAgICAgICAgICAgICAgIChMUEJZVEUpY29tcG9uZW50X2lkLAorICAgICAgICAgICAgICAgICZsZW4pOworCisgICAgICAgICAgICBpZiAoIShzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUyB8fCBkYXRhX3R5cGUgIT0gUkVHX1NaKSkgeworICAgICAgICAgICAgICAgIGxlbiA9IHNpemVvZiAobmV0X2NmZ19pbnN0YW5jZV9pZCk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVnUXVlcnlWYWx1ZUV4KAorICAgICAgICAgICAgICAgICAgICB1bml0X2tleSwKKyAgICAgICAgICAgICAgICAgICAgbmV0X2NmZ19pbnN0YW5jZV9pZF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICZkYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpbmV0X2NmZ19pbnN0YW5jZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgJmxlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX1NVQ0NFU1MgJiYgZGF0YV90eXBlID09IFJFR19TWikgeworICAgICAgICAgICAgICAgICAgICBpZiAoLyogIXN0cmNtcCAoY29tcG9uZW50X2lkLCBUQVBfQ09NUE9ORU5UX0lEKSAmJiovCisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wIChuZXRfY2ZnX2luc3RhbmNlX2lkLCBndWlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVnQ2xvc2VLZXkgKHVuaXRfa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5IChuZXRjYXJkX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlZ0Nsb3NlS2V5ICh1bml0X2tleSk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIFJlZ0Nsb3NlS2V5IChuZXRjYXJkX2tleSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IGdldF9kZXZpY2VfZ3VpZCgKKyAgICBjaGFyICpuYW1lLAorICAgIGludCBuYW1lX3NpemUsCisgICAgY2hhciAqYWN0dWFsX25hbWUsCisgICAgaW50IGFjdHVhbF9uYW1lX3NpemUpCit7CisgICAgTE9ORyBzdGF0dXM7CisgICAgSEtFWSBjb250cm9sX25ldF9rZXk7CisgICAgRFdPUkQgbGVuOworICAgIGludCBpID0gMDsKKyAgICBpbnQgc3RvcCA9IDA7CisKKyAgICBzdGF0dXMgPSBSZWdPcGVuS2V5RXgoCisgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgTkVUV09SS19DT05ORUNUSU9OU19LRVksCisgICAgICAgIDAsCisgICAgICAgIEtFWV9SRUFELAorICAgICAgICAmY29udHJvbF9uZXRfa2V5KTsKKworICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgd2hpbGUgKCFzdG9wKQorICAgIHsKKyAgICAgICAgY2hhciBlbnVtX25hbWVbMjU2XTsKKyAgICAgICAgY2hhciBjb25uZWN0aW9uX3N0cmluZ1syNTZdOworICAgICAgICBIS0VZIGNvbm5lY3Rpb25fa2V5OworICAgICAgICBjaGFyIG5hbWVfZGF0YVsyNTZdOworICAgICAgICBEV09SRCBuYW1lX3R5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgbmFtZV9zdHJpbmdbXSA9ICJOYW1lIjsKKworICAgICAgICBsZW4gPSBzaXplb2YgKGVudW1fbmFtZSk7CisgICAgICAgIHN0YXR1cyA9IFJlZ0VudW1LZXlFeCgKKyAgICAgICAgICAgIGNvbnRyb2xfbmV0X2tleSwKKyAgICAgICAgICAgIGksCisgICAgICAgICAgICBlbnVtX25hbWUsCisgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9OT19NT1JFX0lURU1TKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50Zihjb25uZWN0aW9uX3N0cmluZywKKyAgICAgICAgICAgICBzaXplb2YoY29ubmVjdGlvbl9zdHJpbmcpLAorICAgICAgICAgICAgICIlc1xcJXNcXENvbm5lY3Rpb24iLAorICAgICAgICAgICAgIE5FVFdPUktfQ09OTkVDVElPTlNfS0VZLCBlbnVtX25hbWUpOworCisgICAgICAgIHN0YXR1cyA9IFJlZ09wZW5LZXlFeCgKKyAgICAgICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgIGNvbm5lY3Rpb25fc3RyaW5nLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIEtFWV9SRUFELAorICAgICAgICAgICAgJmNvbm5lY3Rpb25fa2V5KTsKKworICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGxlbiA9IHNpemVvZiAobmFtZV9kYXRhKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlZ1F1ZXJ5VmFsdWVFeCgKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uX2tleSwKKyAgICAgICAgICAgICAgICBuYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICZuYW1lX3R5cGUsCisgICAgICAgICAgICAgICAgKExQQllURSluYW1lX2RhdGEsCisgICAgICAgICAgICAgICAgJmxlbik7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUyB8fCBuYW1lX3R5cGUgIT0gUkVHX1NaKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc190YXBfd2luMzJfZGV2KGVudW1fbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYobmFtZSwgbmFtZV9zaXplLCAiJXMiLCBlbnVtX25hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsX25hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoYWN0dWFsX25hbWUsICIiKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lX2RhdGEsIGFjdHVhbF9uYW1lKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5IChjb25uZWN0aW9uX2tleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYWN0dWFsX25hbWUsIGFjdHVhbF9uYW1lX3NpemUsICIlcyIsIG5hbWVfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSZWdDbG9zZUtleSAoY29ubmVjdGlvbl9rZXkpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICB9CisKKyAgICBSZWdDbG9zZUtleSAoY29udHJvbF9uZXRfa2V5KTsKKworICAgIGlmIChzdG9wID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhcF93aW4zMl9zZXRfc3RhdHVzKEhBTkRMRSBoYW5kbGUsIGludCBzdGF0dXMpCit7CisgICAgdW5zaWduZWQgbG9uZyBsZW4gPSAwOworCisgICAgcmV0dXJuIERldmljZUlvQ29udHJvbChoYW5kbGUsIFRBUF9JT0NUTF9TRVRfTUVESUFfU1RBVFVTLAorICAgICAgICAgICAgICAgICZzdGF0dXMsIHNpemVvZiAoc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAmc3RhdHVzLCBzaXplb2YgKHN0YXR1cyksICZsZW4sIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB0YXBfd2luMzJfb3ZlcmxhcHBlZF9pbml0KHRhcF93aW4zMl9vdmVybGFwcGVkX3QqIGNvbnN0IG92ZXJsYXBwZWQsIGNvbnN0IEhBTkRMRSBoYW5kbGUpCit7CisgICAgb3ZlcmxhcHBlZC0+aGFuZGxlID0gaGFuZGxlOworCisgICAgb3ZlcmxhcHBlZC0+cmVhZF9ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCk7CisgICAgb3ZlcmxhcHBlZC0+d3JpdGVfZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworCisgICAgb3ZlcmxhcHBlZC0+cmVhZF9vdmVybGFwcGVkLk9mZnNldCA9IDA7CisgICAgb3ZlcmxhcHBlZC0+cmVhZF9vdmVybGFwcGVkLk9mZnNldEhpZ2ggPSAwOworICAgIG92ZXJsYXBwZWQtPnJlYWRfb3ZlcmxhcHBlZC5oRXZlbnQgPSBvdmVybGFwcGVkLT5yZWFkX2V2ZW50OworCisgICAgb3ZlcmxhcHBlZC0+d3JpdGVfb3ZlcmxhcHBlZC5PZmZzZXQgPSAwOworICAgIG92ZXJsYXBwZWQtPndyaXRlX292ZXJsYXBwZWQuT2Zmc2V0SGlnaCA9IDA7CisgICAgb3ZlcmxhcHBlZC0+d3JpdGVfb3ZlcmxhcHBlZC5oRXZlbnQgPSBvdmVybGFwcGVkLT53cml0ZV9ldmVudDsKKworICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJm92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9jcyk7CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmb3ZlcmxhcHBlZC0+ZnJlZV9saXN0X2NzKTsKKworICAgIG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9zZW1hcGhvcmUgPSBDcmVhdGVTZW1hcGhvcmUoCisgICAgICAgIE5VTEwsICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgIDAsICAgLy8gaW5pdGlhbCBjb3VudAorICAgICAgICBUVU5fTUFYX0JVRkZFUl9DT1VOVCwgICAvLyBtYXhpbXVtIGNvdW50CisgICAgICAgIE5VTEwpOyAgLy8gdW5uYW1lZCBzZW1hcGhvcmUKKworICAgIGlmKCFvdmVybGFwcGVkLT5vdXRwdXRfcXVldWVfc2VtYXBob3JlKSAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGNyZWF0aW5nIG91dHB1dCBxdWV1ZSBzZW1hcGhvcmUhXG4iKTsKKyAgICB9CisKKyAgICBvdmVybGFwcGVkLT5mcmVlX2xpc3Rfc2VtYXBob3JlID0gQ3JlYXRlU2VtYXBob3JlKAorICAgICAgICBOVUxMLCAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICBUVU5fTUFYX0JVRkZFUl9DT1VOVCwgICAvLyBpbml0aWFsIGNvdW50CisgICAgICAgIFRVTl9NQVhfQlVGRkVSX0NPVU5ULCAgIC8vIG1heGltdW0gY291bnQKKyAgICAgICAgTlVMTCk7ICAvLyB1bm5hbWVkIHNlbWFwaG9yZQorCisgICAgaWYoIW92ZXJsYXBwZWQtPmZyZWVfbGlzdF9zZW1hcGhvcmUpICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgY3JlYXRpbmcgZnJlZSBsaXN0IHNlbWFwaG9yZSFcbiIpOworICAgIH0KKworICAgIG92ZXJsYXBwZWQtPmZyZWVfbGlzdCA9IG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9mcm9udCA9IG92ZXJsYXBwZWQtPm91dHB1dF9xdWV1ZV9iYWNrID0gTlVMTDsKKworICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW5kZXg7CisgICAgICAgIGZvcihpbmRleCA9IDA7IGluZGV4IDwgVFVOX01BWF9CVUZGRVJfQ09VTlQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgIHR1bl9idWZmZXJfdCogZWxlbWVudCA9ICZvdmVybGFwcGVkLT5idWZmZXJzW2luZGV4XTsKKyAgICAgICAgICAgIGVsZW1lbnQtPm5leHQgPSBvdmVybGFwcGVkLT5mcmVlX2xpc3Q7CisgICAgICAgICAgICBvdmVybGFwcGVkLT5mcmVlX2xpc3QgPSBlbGVtZW50OworICAgICAgICB9CisgICAgfQorICAgIC8qIFRvIGNvdW50IGJ1ZmZlcnMsIGluaXRpYWxseSBuby1zaWduYWwuICovCisgICAgb3ZlcmxhcHBlZC0+dGFwX3NlbWFwaG9yZSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCBUVU5fTUFYX0JVRkZFUl9DT1VOVCwgTlVMTCk7CisgICAgaWYoIW92ZXJsYXBwZWQtPnRhcF9zZW1hcGhvcmUpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgY3JlYXRpbmcgdGFwX3NlbWFwaG9yZS5cbiIpOworfQorCitzdGF0aWMgaW50IHRhcF93aW4zMl93cml0ZSh0YXBfd2luMzJfb3ZlcmxhcHBlZF90ICpvdmVybGFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgdW5zaWduZWQgbG9uZyB3cml0ZV9zaXplOworICAgIEJPT0wgcmVzdWx0OworICAgIERXT1JEIGVycm9yOworCisgICAgcmVzdWx0ID0gR2V0T3ZlcmxhcHBlZFJlc3VsdCggb3ZlcmxhcHBlZC0+aGFuZGxlLCAmb3ZlcmxhcHBlZC0+d3JpdGVfb3ZlcmxhcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVfc2l6ZSwgRkFMU0UpOworCisgICAgaWYgKCFyZXN1bHQgJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfSU9fSU5DT01QTEVURSkKKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChvdmVybGFwcGVkLT53cml0ZV9ldmVudCwgSU5GSU5JVEUpOworCisgICAgcmVzdWx0ID0gV3JpdGVGaWxlKG92ZXJsYXBwZWQtPmhhbmRsZSwgYnVmZmVyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVfc2l6ZSwgJm92ZXJsYXBwZWQtPndyaXRlX292ZXJsYXBwZWQpOworCisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgc3dpdGNoIChlcnJvciA9IEdldExhc3RFcnJvcigpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgRVJST1JfSU9fUEVORElORzoKKyNpZm5kZWYgVFVOX0FTWU5DSFJPTk9VU19XUklURVMKKyAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qob3ZlcmxhcHBlZC0+d3JpdGVfZXZlbnQsIElORklOSVRFKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSB0YXBfd2luMzJfdGhyZWFkX2VudHJ5KExQVk9JRCBwYXJhbSkKK3sKKyAgICB0YXBfd2luMzJfb3ZlcmxhcHBlZF90ICpvdmVybGFwcGVkID0gKHRhcF93aW4zMl9vdmVybGFwcGVkX3QqKXBhcmFtOworICAgIHVuc2lnbmVkIGxvbmcgcmVhZF9zaXplOworICAgIEJPT0wgcmVzdWx0OworICAgIERXT1JEIGR3RXJyb3I7CisgICAgdHVuX2J1ZmZlcl90KiBidWZmZXIgPSBnZXRfYnVmZmVyX2Zyb21fZnJlZV9saXN0KG92ZXJsYXBwZWQpOworCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJlc3VsdCA9IFJlYWRGaWxlKG92ZXJsYXBwZWQtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXItPmJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmVybGFwcGVkLT5yZWFkX292ZXJsYXBwZWQpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgZHdFcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGR3RXJyb3IgPT0gRVJST1JfSU9fUEVORElORykgeworICAgICAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3Qob3ZlcmxhcHBlZC0+cmVhZF9ldmVudCwgSU5GSU5JVEUpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEdldE92ZXJsYXBwZWRSZXN1bHQoIG92ZXJsYXBwZWQtPmhhbmRsZSwgJm92ZXJsYXBwZWQtPnJlYWRfb3ZlcmxhcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZF9zaXplLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyNpZmRlZiBERUJVR19UQVBfV0lOMzIKKyAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyOworICAgICAgICAgICAgICAgICAgICBkd0Vycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIEZvcm1hdE1lc3NhZ2UoIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBkd0Vycm9yLCBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVFNUUikgJiBscEJ1ZmZlciwgMCwgTlVMTCApOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRhcC1XaW4zMjogRXJyb3IgR2V0T3ZlcmxhcHBlZFJlc3VsdCAlZCAtICVzXG4iLCBkd0Vycm9yLCBscEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIExvY2FsRnJlZSggbHBCdWZmZXIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjaWZkZWYgREVCVUdfVEFQX1dJTjMyCisgICAgICAgICAgICAgICAgTFBWT0lEIGxwQnVmZmVyOworICAgICAgICAgICAgICAgIEZvcm1hdE1lc3NhZ2UoIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGR3RXJyb3IsIE1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFRTVFIpICYgbHBCdWZmZXIsIDAsIE5VTEwgKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRhcC1XaW4zMjogRXJyb3IgUmVhZEZpbGUgJWQgLSAlc1xuIiwgZHdFcnJvciwgbHBCdWZmZXIpOworICAgICAgICAgICAgICAgIExvY2FsRnJlZSggbHBCdWZmZXIgKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYocmVhZF9zaXplID4gMCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWFkX3NpemUgPSByZWFkX3NpemU7CisgICAgICAgICAgICBwdXRfYnVmZmVyX29uX291dHB1dF9xdWV1ZShvdmVybGFwcGVkLCBidWZmZXIpOworICAgICAgICAgICAgUmVsZWFzZVNlbWFwaG9yZShvdmVybGFwcGVkLT50YXBfc2VtYXBob3JlLCAxLCBOVUxMKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IGdldF9idWZmZXJfZnJvbV9mcmVlX2xpc3Qob3ZlcmxhcHBlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXBfd2luMzJfcmVhZCh0YXBfd2luMzJfb3ZlcmxhcHBlZF90ICpvdmVybGFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcGJ1ZiwgaW50IG1heF9zaXplKQoreworICAgIGludCBzaXplID0gMDsKKworICAgIHR1bl9idWZmZXJfdCogYnVmZmVyID0gZ2V0X2J1ZmZlcl9mcm9tX291dHB1dF9xdWV1ZV9pbW1lZGlhdGUob3ZlcmxhcHBlZCk7CisKKyAgICBpZihidWZmZXIgIT0gTlVMTCkgeworICAgICAgICAqcGJ1ZiA9IGJ1ZmZlci0+YnVmZmVyOworICAgICAgICBzaXplID0gKGludClidWZmZXItPnJlYWRfc2l6ZTsKKyAgICAgICAgaWYoc2l6ZSA+IG1heF9zaXplKSB7CisgICAgICAgICAgICBzaXplID0gbWF4X3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQgdGFwX3dpbjMyX2ZyZWVfYnVmZmVyKHRhcF93aW4zMl9vdmVybGFwcGVkX3QgKm92ZXJsYXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGJ1ZikKK3sKKyAgICB0dW5fYnVmZmVyX3QqIGJ1ZmZlciA9ICh0dW5fYnVmZmVyX3QqKXBidWY7CisgICAgcHV0X2J1ZmZlcl9vbl9mcmVlX2xpc3Qob3ZlcmxhcHBlZCwgYnVmZmVyKTsKK30KKworc3RhdGljIGludCB0YXBfd2luMzJfb3Blbih0YXBfd2luMzJfb3ZlcmxhcHBlZF90ICoqcGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlZmVyZWRfbmFtZSkKK3sKKyAgICBjaGFyIGRldmljZV9wYXRoWzI1Nl07CisgICAgY2hhciBkZXZpY2VfZ3VpZFsweDEwMF07CisgICAgaW50IHJjOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgQk9PTCBicmV0OworICAgIGNoYXIgbmFtZV9idWZmZXJbMHgxMDBdID0gezAsIH07CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtYWpvcjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBtaW5vcjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBkZWJ1ZzsKKyAgICB9IHZlcnNpb247CisgICAgRFdPUkQgdmVyc2lvbl9sZW47CisgICAgRFdPUkQgaWRUaHJlYWQ7CisKKyAgICBpZiAocHJlZmVyZWRfbmFtZSAhPSBOVUxMKQorICAgICAgICBzbnByaW50ZihuYW1lX2J1ZmZlciwgc2l6ZW9mKG5hbWVfYnVmZmVyKSwgIiVzIiwgcHJlZmVyZWRfbmFtZSk7CisKKyAgICByYyA9IGdldF9kZXZpY2VfZ3VpZChkZXZpY2VfZ3VpZCwgc2l6ZW9mKGRldmljZV9ndWlkKSwgbmFtZV9idWZmZXIsIHNpemVvZihuYW1lX2J1ZmZlcikpOworICAgIGlmIChyYykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgc25wcmludGYgKGRldmljZV9wYXRoLCBzaXplb2YoZGV2aWNlX3BhdGgpLCAiJXMlcyVzIiwKKyAgICAgICAgICAgICAgVVNFUk1PREVERVZJQ0VESVIsCisgICAgICAgICAgICAgIGRldmljZV9ndWlkLAorICAgICAgICAgICAgICBUQVBTVUZGSVgpOworCisgICAgaGFuZGxlID0gQ3JlYXRlRmlsZSAoCisgICAgICAgIGRldmljZV9wYXRoLAorICAgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICBPUEVOX0VYSVNUSU5HLAorICAgICAgICBGSUxFX0FUVFJJQlVURV9TWVNURU0gfCBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCwKKyAgICAgICAgMCApOworCisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgYnJldCA9IERldmljZUlvQ29udHJvbChoYW5kbGUsIFRBUF9JT0NUTF9HRVRfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJzaW9uLCBzaXplb2YgKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnNpb24sIHNpemVvZiAodmVyc2lvbiksICZ2ZXJzaW9uX2xlbiwgTlVMTCk7CisKKyAgICBpZiAoYnJldCA9PSBGQUxTRSkgeworICAgICAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCF0YXBfd2luMzJfc2V0X3N0YXR1cyhoYW5kbGUsIFRSVUUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB0YXBfd2luMzJfb3ZlcmxhcHBlZF9pbml0KCZ0YXBfb3ZlcmxhcHBlZCwgaGFuZGxlKTsKKworICAgICpwaGFuZGxlID0gJnRhcF9vdmVybGFwcGVkOworCisgICAgKHZvaWQpIENyZWF0ZVRocmVhZChOVUxMLCAwLCB0YXBfd2luMzJfdGhyZWFkX2VudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkmdGFwX292ZXJsYXBwZWQsIDAsICZpZFRocmVhZCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworIHR5cGVkZWYgc3RydWN0IFRBUFN0YXRlIHsKKyAgICAgVkxBTkNsaWVudFN0YXRlICp2YzsKKyAgICAgdGFwX3dpbjMyX292ZXJsYXBwZWRfdCAqaGFuZGxlOworIH0gVEFQU3RhdGU7CisKK3N0YXRpYyB2b2lkIHRhcF9jbGVhbnVwKFZMQU5DbGllbnRTdGF0ZSAqdmMpCit7CisgICAgVEFQU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworCisgICAgcWVtdV9kZWxfd2FpdF9vYmplY3Qocy0+aGFuZGxlLT50YXBfc2VtYXBob3JlLCBOVUxMLCBOVUxMKTsKKworICAgIC8qIEZJWE1FOiBuZWVkIHRvIGtpbGwgdGhyZWFkIGFuZCBjbG9zZSBmaWxlIGhhbmRsZToKKyAgICAgICB0YXBfd2luMzJfY2xvc2Uocyk7CisgICAgKi8KKyAgICBnX2ZyZWUocyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRhcF9yZWNlaXZlKFZMQU5DbGllbnRTdGF0ZSAqdmMsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisgICAgVEFQU3RhdGUgKnMgPSB2Yy0+b3BhcXVlOworCisgICAgcmV0dXJuIHRhcF93aW4zMl93cml0ZShzLT5oYW5kbGUsIGJ1Ziwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhcF93aW4zMl9zZW5kKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBUQVBTdGF0ZSAqcyA9IG9wYXF1ZTsKKyAgICB1aW50OF90ICpidWY7CisgICAgaW50IG1heF9zaXplID0gNDA5NjsKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSB0YXBfd2luMzJfcmVhZChzLT5oYW5kbGUsICZidWYsIG1heF9zaXplKTsKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgcWVtdV9zZW5kX3BhY2tldChzLT52YywgYnVmLCBzaXplKTsKKyAgICAgICAgdGFwX3dpbjMyX2ZyZWVfYnVmZmVyKHMtPmhhbmRsZSwgYnVmKTsKKyAgICB9Cit9CisKK2ludCB0YXBfd2luMzJfaW5pdChWTEFOU3RhdGUgKnZsYW4sIGNvbnN0IGNoYXIgKm1vZGVsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKyAgICBUQVBTdGF0ZSAqczsKKworICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFRBUFN0YXRlKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHRhcF93aW4zMl9vcGVuKCZzLT5oYW5kbGUsIGlmbmFtZSkgPCAwKSB7CisgICAgICAgIHByaW50ZigidGFwOiBDb3VsZCBub3Qgb3BlbiAnJXMnXG4iLCBpZm5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcy0+dmMgPSBxZW11X25ld192bGFuX2NsaWVudCh2bGFuLCBtb2RlbCwgbmFtZSwgTlVMTCwgdGFwX3JlY2VpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0YXBfY2xlYW51cCwgcyk7CisKKyAgICBzbnByaW50ZihzLT52Yy0+aW5mb19zdHIsIHNpemVvZihzLT52Yy0+aW5mb19zdHIpLAorICAgICAgICAgICAgICJ0YXA6IGlmbmFtZT0lcyIsIGlmbmFtZSk7CisKKyAgICBxZW11X2FkZF93YWl0X29iamVjdChzLT5oYW5kbGUtPnRhcF9zZW1hcGhvcmUsIHRhcF93aW4zMl9zZW5kLCBzKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9hcm0tc2VtaS5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2FybS1zZW1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZDc0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9hcm0tc2VtaS5jCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogIEFybSAiQW5nZWwiIHNlbWlob3N0aW5nIHN5c2NhbGxzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBDb2RlU291cmNlcnkuCisgKiAgV3JpdHRlbiBieSBQYXVsIEJyb29rLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNwdS5oIgorI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKyNpbmNsdWRlICJxZW11LmgiCisKKyNkZWZpbmUgQVJNX0FOR0VMX0hFQVBfU0laRSAoMTI4ICogMTAyNCAqIDEwMjQpCisjZWxzZQorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAiZXhlYy9nZGJzdHViLmgiCisjaW5jbHVkZSAiaHcvYXJtL2FybS5oIgorI2VuZGlmCisKKyNkZWZpbmUgVEFSR0VUX1NZU19PUEVOICAgICAgICAweDAxCisjZGVmaW5lIFRBUkdFVF9TWVNfQ0xPU0UgICAgICAgMHgwMgorI2RlZmluZSBUQVJHRVRfU1lTX1dSSVRFQyAgICAgIDB4MDMKKyNkZWZpbmUgVEFSR0VUX1NZU19XUklURTAgICAgICAweDA0CisjZGVmaW5lIFRBUkdFVF9TWVNfV1JJVEUgICAgICAgMHgwNQorI2RlZmluZSBUQVJHRVRfU1lTX1JFQUQgICAgICAgIDB4MDYKKyNkZWZpbmUgVEFSR0VUX1NZU19SRUFEQyAgICAgICAweDA3CisjZGVmaW5lIFRBUkdFVF9TWVNfSVNUVFkgICAgICAgMHgwOQorI2RlZmluZSBUQVJHRVRfU1lTX1NFRUsgICAgICAgIDB4MGEKKyNkZWZpbmUgVEFSR0VUX1NZU19GTEVOICAgICAgICAweDBjCisjZGVmaW5lIFRBUkdFVF9TWVNfVE1QTkFNICAgICAgMHgwZAorI2RlZmluZSBUQVJHRVRfU1lTX1JFTU9WRSAgICAgIDB4MGUKKyNkZWZpbmUgVEFSR0VUX1NZU19SRU5BTUUgICAgICAweDBmCisjZGVmaW5lIFRBUkdFVF9TWVNfQ0xPQ0sgICAgICAgMHgxMAorI2RlZmluZSBUQVJHRVRfU1lTX1RJTUUgICAgICAgIDB4MTEKKyNkZWZpbmUgVEFSR0VUX1NZU19TWVNURU0gICAgICAweDEyCisjZGVmaW5lIFRBUkdFVF9TWVNfRVJSTk8gICAgICAgMHgxMworI2RlZmluZSBUQVJHRVRfU1lTX0dFVF9DTURMSU5FIDB4MTUKKyNkZWZpbmUgVEFSR0VUX1NZU19IRUFQSU5GTyAgICAweDE2CisjZGVmaW5lIFRBUkdFVF9TWVNfRVhJVCAgICAgICAgMHgxOAorCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCisjZGVmaW5lIEdEQl9PX1JET05MWSAgMHgwMDAKKyNkZWZpbmUgR0RCX09fV1JPTkxZICAweDAwMQorI2RlZmluZSBHREJfT19SRFdSICAgIDB4MDAyCisjZGVmaW5lIEdEQl9PX0FQUEVORCAgMHgwMDgKKyNkZWZpbmUgR0RCX09fQ1JFQVQgICAweDIwMAorI2RlZmluZSBHREJfT19UUlVOQyAgIDB4NDAwCisjZGVmaW5lIEdEQl9PX0JJTkFSWSAgMAorCitzdGF0aWMgaW50IGdkYl9vcGVuX21vZGVmbGFnc1sxMl0gPSB7CisgICAgR0RCX09fUkRPTkxZLAorICAgIEdEQl9PX1JET05MWSB8IEdEQl9PX0JJTkFSWSwKKyAgICBHREJfT19SRFdSLAorICAgIEdEQl9PX1JEV1IgfCBHREJfT19CSU5BUlksCisgICAgR0RCX09fV1JPTkxZIHwgR0RCX09fQ1JFQVQgfCBHREJfT19UUlVOQywKKyAgICBHREJfT19XUk9OTFkgfCBHREJfT19DUkVBVCB8IEdEQl9PX1RSVU5DIHwgR0RCX09fQklOQVJZLAorICAgIEdEQl9PX1JEV1IgfCBHREJfT19DUkVBVCB8IEdEQl9PX1RSVU5DLAorICAgIEdEQl9PX1JEV1IgfCBHREJfT19DUkVBVCB8IEdEQl9PX1RSVU5DIHwgR0RCX09fQklOQVJZLAorICAgIEdEQl9PX1dST05MWSB8IEdEQl9PX0NSRUFUIHwgR0RCX09fQVBQRU5ELAorICAgIEdEQl9PX1dST05MWSB8IEdEQl9PX0NSRUFUIHwgR0RCX09fQVBQRU5EIHwgR0RCX09fQklOQVJZLAorICAgIEdEQl9PX1JEV1IgfCBHREJfT19DUkVBVCB8IEdEQl9PX0FQUEVORCwKKyAgICBHREJfT19SRFdSIHwgR0RCX09fQ1JFQVQgfCBHREJfT19BUFBFTkQgfCBHREJfT19CSU5BUlkKK307CisKK3N0YXRpYyBpbnQgb3Blbl9tb2RlZmxhZ3NbMTJdID0geworICAgIE9fUkRPTkxZLAorICAgIE9fUkRPTkxZIHwgT19CSU5BUlksCisgICAgT19SRFdSLAorICAgIE9fUkRXUiB8IE9fQklOQVJZLAorICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsCisgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLAorICAgIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLAorICAgIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksCisgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQsCisgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQgfCBPX0JJTkFSWSwKKyAgICBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQsCisgICAgT19SRFdSIHwgT19DUkVBVCB8IE9fQVBQRU5EIHwgT19CSU5BUlkKK307CisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHNldF9zd2lfZXJybm8oVGFza1N0YXRlICp0cywgdWludDMyX3QgY29kZSkKK3sKKyAgICBpZiAoY29kZSA9PSAodWludDMyX3QpLTEpCisgICAgICAgIHRzLT5zd2lfZXJybm8gPSBlcnJubzsKKyAgICByZXR1cm4gY29kZTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHNldF9zd2lfZXJybm8oQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgY29kZSkKK3sKKyAgICByZXR1cm4gY29kZTsKK30KKworI2luY2x1ZGUgImV4ZWMvc29mdG1tdS1zZW1pLmgiCisjZW5kaWYKKworc3RhdGljIHRhcmdldF91bG9uZyBhcm1fc2VtaV9zeXNjYWxsX2xlbjsKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCitzdGF0aWMgdGFyZ2V0X3Vsb25nIHN5c2NhbGxfZXJyOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFybV9zZW1pX2NiKENQVVN0YXRlICpjcHUsIHRhcmdldF91bG9uZyByZXQsIHRhcmdldF91bG9uZyBlcnIpCit7CisgICAgQ1BVQVJNU3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgVGFza1N0YXRlICp0cyA9IGVudi0+b3BhcXVlOworI2VuZGlmCisKKyAgICBpZiAocmV0ID09ICh0YXJnZXRfdWxvbmcpLTEpIHsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIHRzLT5zd2lfZXJybm8gPSBlcnI7CisjZWxzZQorCXN5c2NhbGxfZXJyID0gZXJyOworI2VuZGlmCisgICAgICAgIGVudi0+cmVnc1swXSA9IHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBGaXh1cCBzeXNjYWxscyB0aGF0IHVzZSBub25zdGFyZGFyZCByZXR1cm4gY29udmVudGlvbnMuICAqLworICAgICAgICBzd2l0Y2ggKGVudi0+cmVnc1swXSkgeworICAgICAgICBjYXNlIFRBUkdFVF9TWVNfV1JJVEU6CisgICAgICAgIGNhc2UgVEFSR0VUX1NZU19SRUFEOgorICAgICAgICAgICAgZW52LT5yZWdzWzBdID0gYXJtX3NlbWlfc3lzY2FsbF9sZW4gLSByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQVJHRVRfU1lTX1NFRUs6CisgICAgICAgICAgICBlbnYtPnJlZ3NbMF0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlbnYtPnJlZ3NbMF0gPSByZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYXJtX3NlbWlfZmxlbl9jYihDUFVTdGF0ZSAqY3B1LCB0YXJnZXRfdWxvbmcgcmV0LCB0YXJnZXRfdWxvbmcgZXJyKQoreworICAgIC8qIFRoZSBzaXplIGlzIGFsd2F5cyBzdG9yZWQgaW4gYmlnLWVuZGlhbiBvcmRlciwgZXh0cmFjdAorICAgICAgIHRoZSB2YWx1ZS4gV2UgYXNzdW1lIHRoZSBzaXplIGFsd2F5cyBmaXQgaW4gMzIgYml0cy4gICovCisgICAgQ1BVQVJNU3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICB1aW50MzJfdCBzaXplOworICAgIGNwdV9tZW1vcnlfcndfZGVidWcoY3B1LCBlbnYtPnJlZ3NbMTNdLTY0KzMyLCAodWludDhfdCAqKSZzaXplLCA0LCAwKTsKKyAgICBlbnYtPnJlZ3NbMF0gPSBiZTMyX3RvX2NwdShzaXplKTsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgKChUYXNrU3RhdGUgKillbnYtPm9wYXF1ZSktPnN3aV9lcnJubyA9IGVycjsKKyNlbHNlCisgICAgc3lzY2FsbF9lcnIgPSBlcnI7CisjZW5kaWYKK30KKworLyogUmVhZCB0aGUgaW5wdXQgdmFsdWUgZnJvbSB0aGUgYXJndW1lbnQgYmxvY2s7IGZhaWwgdGhlIHNlbWlob3N0aW5nCisgKiBjYWxsIGlmIHRoZSBtZW1vcnkgcmVhZCBmYWlscy4KKyAqLworI2RlZmluZSBHRVRfQVJHKG4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGdldF91c2VyX3VhbChhcmcgIyMgbiwgYXJncyArIChuKSAqIDQpKSB7ICAgICAgIFwKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCktMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVF9BUkcobiwgdmFsKSBwdXRfdXNlcl91YWwodmFsLCBhcmdzICsgKG4pICogNCkKK3VpbnQzMl90IGRvX2FybV9zZW1paG9zdGluZyhDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHRhcmdldF91bG9uZyBhcmdzOworICAgIHRhcmdldF91bG9uZyBhcmcwLCBhcmcxLCBhcmcyLCBhcmczOworICAgIGNoYXIgKiBzOworICAgIGludCBucjsKKyAgICB1aW50MzJfdCByZXQ7CisgICAgdWludDMyX3QgbGVuOworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICBUYXNrU3RhdGUgKnRzID0gZW52LT5vcGFxdWU7CisjZWxzZQorICAgIENQVUFSTVN0YXRlICp0cyA9IGVudjsKKyNlbmRpZgorCisgICAgbnIgPSBlbnYtPnJlZ3NbMF07CisgICAgYXJncyA9IGVudi0+cmVnc1sxXTsKKyAgICBzd2l0Y2ggKG5yKSB7CisgICAgY2FzZSBUQVJHRVRfU1lTX09QRU46CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIEdFVF9BUkcoMik7CisgICAgICAgIHMgPSBsb2NrX3VzZXJfc3RyaW5nKGFyZzApOworICAgICAgICBpZiAoIXMpIHsKKyAgICAgICAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIHRoaXMgZXJyb3IgY29kZSBiZSAtVEFSR0VUX0VGQVVMVCA/ICovCisgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KS0xOworICAgICAgICB9CisgICAgICAgIGlmIChhcmcxID49IDEyKSB7CisgICAgICAgICAgICB1bmxvY2tfdXNlcihzLCBhcmcwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChzLCAiOnR0IikgPT0gMCkgeworICAgICAgICAgICAgaW50IHJlc3VsdF9maWxlbm8gPSBhcmcxIDwgNCA/IFNURElOX0ZJTEVOTyA6IFNURE9VVF9GSUxFTk87CisgICAgICAgICAgICB1bmxvY2tfdXNlcihzLCBhcmcwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRfZmlsZW5vOworICAgICAgICB9CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGdkYl9kb19zeXNjYWxsKGFybV9zZW1pX2NiLCAib3BlbiwlcywleCwxYTQiLCBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClhcmcyKzEsIGdkYl9vcGVuX21vZGVmbGFnc1thcmcxXSk7CisgICAgICAgICAgICByZXQgPSBlbnYtPnJlZ3NbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBzZXRfc3dpX2Vycm5vKHRzLCBvcGVuKHMsIG9wZW5fbW9kZWZsYWdzW2FyZzFdLCAwNjQ0KSk7CisgICAgICAgIH0KKyAgICAgICAgdW5sb2NrX3VzZXIocywgYXJnMCwgMCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBUQVJHRVRfU1lTX0NMT1NFOgorICAgICAgICBHRVRfQVJHKDApOworICAgICAgICBpZiAodXNlX2dkYl9zeXNjYWxscygpKSB7CisgICAgICAgICAgICBnZGJfZG9fc3lzY2FsbChhcm1fc2VtaV9jYiwgImNsb3NlLCV4IiwgYXJnMCk7CisgICAgICAgICAgICByZXR1cm4gZW52LT5yZWdzWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHNldF9zd2lfZXJybm8odHMsIGNsb3NlKGFyZzApKTsKKyAgICAgICAgfQorICAgIGNhc2UgVEFSR0VUX1NZU19XUklURUM6CisgICAgICAgIHsKKyAgICAgICAgICBjaGFyIGM7CisKKyAgICAgICAgICBpZiAoZ2V0X3VzZXJfdTgoYywgYXJncykpCisgICAgICAgICAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIHRoaXMgZXJyb3IgY29kZSBiZSAtVEFSR0VUX0VGQVVMVCA/ICovCisgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICAgICAgLyogV3JpdGUgdG8gZGVidWcgY29uc29sZS4gIHN0ZGVyciBpcyBuZWFyIGVub3VnaC4gICovCisgICAgICAgICAgaWYgKHVzZV9nZGJfc3lzY2FsbHMoKSkgeworICAgICAgICAgICAgICAgIGdkYl9kb19zeXNjYWxsKGFybV9zZW1pX2NiLCAid3JpdGUsMiwleCwxIiwgYXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+cmVnc1swXTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZShTVERFUlJfRklMRU5PLCAmYywgMSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgY2FzZSBUQVJHRVRfU1lTX1dSSVRFMDoKKyAgICAgICAgaWYgKCEocyA9IGxvY2tfdXNlcl9zdHJpbmcoYXJncykpKQorICAgICAgICAgICAgLyogRklYTUUgLSBzaG91bGQgdGhpcyBlcnJvciBjb2RlIGJlIC1UQVJHRVRfRUZBVUxUID8gKi8KKyAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICAgICAgaWYgKHVzZV9nZGJfc3lzY2FsbHMoKSkgeworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfY2IsICJ3cml0ZSwyLCV4LCV4XG4iLCBhcmdzLCBsZW4pOworICAgICAgICAgICAgcmV0ID0gZW52LT5yZWdzWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gd3JpdGUoU1RERVJSX0ZJTEVOTywgcywgbGVuKTsKKyAgICAgICAgfQorICAgICAgICB1bmxvY2tfdXNlcihzLCBhcmdzLCAwKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIFRBUkdFVF9TWVNfV1JJVEU6CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIEdFVF9BUkcoMik7CisgICAgICAgIGxlbiA9IGFyZzI7CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGFybV9zZW1pX3N5c2NhbGxfbGVuID0gbGVuOworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfY2IsICJ3cml0ZSwleCwleCwleCIsIGFyZzAsIGFyZzEsIGxlbik7CisgICAgICAgICAgICByZXR1cm4gZW52LT5yZWdzWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IGxvY2tfdXNlcihWRVJJRllfUkVBRCwgYXJnMSwgbGVuLCAxKTsKKyAgICAgICAgICAgIGlmICghcykgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIHRoaXMgZXJyb3IgY29kZSBiZSAtVEFSR0VUX0VGQVVMVCA/ICovCisgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdCktMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHNldF9zd2lfZXJybm8odHMsIHdyaXRlKGFyZzAsIHMsIGxlbikpOworICAgICAgICAgICAgdW5sb2NrX3VzZXIocywgYXJnMSwgMCk7CisgICAgICAgICAgICBpZiAocmV0ID09ICh1aW50MzJfdCktMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gbGVuIC0gcmV0OworICAgICAgICB9CisgICAgY2FzZSBUQVJHRVRfU1lTX1JFQUQ6CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIEdFVF9BUkcoMik7CisgICAgICAgIGxlbiA9IGFyZzI7CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGFybV9zZW1pX3N5c2NhbGxfbGVuID0gbGVuOworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfY2IsICJyZWFkLCV4LCV4LCV4IiwgYXJnMCwgYXJnMSwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBlbnYtPnJlZ3NbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzID0gbG9ja191c2VyKFZFUklGWV9XUklURSwgYXJnMSwgbGVuLCAwKTsKKyAgICAgICAgICAgIGlmICghcykgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIHRoaXMgZXJyb3IgY29kZSBiZSAtVEFSR0VUX0VGQVVMVCA/ICovCisgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdCktMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXQgPSBzZXRfc3dpX2Vycm5vKHRzLCByZWFkKGFyZzAsIHMsIGxlbikpOworICAgICAgICAgICAgfSB3aGlsZSAocmV0ID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKyAgICAgICAgICAgIHVubG9ja191c2VyKHMsIGFyZzEsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0ID09ICh1aW50MzJfdCktMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gbGVuIC0gcmV0OworICAgICAgICB9CisgICAgY2FzZSBUQVJHRVRfU1lTX1JFQURDOgorICAgICAgIC8qIFhYWDogUmVhZCBmcm9tIGRlYnVnIGNvbnNvbGUuIE5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgVEFSR0VUX1NZU19JU1RUWToKKyAgICAgICAgR0VUX0FSRygwKTsKKyAgICAgICAgaWYgKHVzZV9nZGJfc3lzY2FsbHMoKSkgeworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfY2IsICJpc2F0dHksJXgiLCBhcmcwKTsKKyAgICAgICAgICAgIHJldHVybiBlbnYtPnJlZ3NbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaXNhdHR5KGFyZzApOworICAgICAgICB9CisgICAgY2FzZSBUQVJHRVRfU1lTX1NFRUs6CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGdkYl9kb19zeXNjYWxsKGFybV9zZW1pX2NiLCAibHNlZWssJXgsJXgsMCIsIGFyZzAsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuIGVudi0+cmVnc1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHNldF9zd2lfZXJybm8odHMsIGxzZWVrKGFyZzAsIGFyZzEsIFNFRUtfU0VUKSk7CisgICAgICAgICAgICBpZiAocmV0ID09ICh1aW50MzJfdCktMSkKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICBjYXNlIFRBUkdFVF9TWVNfRkxFTjoKKyAgICAgICAgR0VUX0FSRygwKTsKKyAgICAgICAgaWYgKHVzZV9nZGJfc3lzY2FsbHMoKSkgeworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfZmxlbl9jYiwgImZzdGF0LCV4LCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzAsIGVudi0+cmVnc1sxM10tNjQpOworICAgICAgICAgICAgcmV0dXJuIGVudi0+cmVnc1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgICAgIHJldCA9IHNldF9zd2lfZXJybm8odHMsIGZzdGF0KGFyZzAsICZidWYpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gKHVpbnQzMl90KS0xKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBidWYuc3Rfc2l6ZTsKKyAgICAgICAgfQorICAgIGNhc2UgVEFSR0VUX1NZU19UTVBOQU06CisgICAgICAgIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIGNhc2UgVEFSR0VUX1NZU19SRU1PVkU6CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGdkYl9kb19zeXNjYWxsKGFybV9zZW1pX2NiLCAidW5saW5rLCVzIiwgYXJnMCwgKGludClhcmcxKzEpOworICAgICAgICAgICAgcmV0ID0gZW52LT5yZWdzWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IGxvY2tfdXNlcl9zdHJpbmcoYXJnMCk7CisgICAgICAgICAgICBpZiAoIXMpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSAtIHNob3VsZCB0aGlzIGVycm9yIGNvZGUgYmUgLVRBUkdFVF9FRkFVTFQgPyAqLworICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSAgc2V0X3N3aV9lcnJubyh0cywgcmVtb3ZlKHMpKTsKKyAgICAgICAgICAgIHVubG9ja191c2VyKHMsIGFyZzAsIDApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgY2FzZSBUQVJHRVRfU1lTX1JFTkFNRToKKyAgICAgICAgR0VUX0FSRygwKTsKKyAgICAgICAgR0VUX0FSRygxKTsKKyAgICAgICAgR0VUX0FSRygyKTsKKyAgICAgICAgR0VUX0FSRygzKTsKKyAgICAgICAgaWYgKHVzZV9nZGJfc3lzY2FsbHMoKSkgeworICAgICAgICAgICAgZ2RiX2RvX3N5c2NhbGwoYXJtX3NlbWlfY2IsICJyZW5hbWUsJXMsJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMCwgKGludClhcmcxKzEsIGFyZzIsIChpbnQpYXJnMysxKTsKKyAgICAgICAgICAgIHJldHVybiBlbnYtPnJlZ3NbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzMjsKKyAgICAgICAgICAgIHMgPSBsb2NrX3VzZXJfc3RyaW5nKGFyZzApOworICAgICAgICAgICAgczIgPSBsb2NrX3VzZXJfc3RyaW5nKGFyZzIpOworICAgICAgICAgICAgaWYgKCFzIHx8ICFzMikKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSAtIHNob3VsZCB0aGlzIGVycm9yIGNvZGUgYmUgLVRBUkdFVF9FRkFVTFQgPyAqLworICAgICAgICAgICAgICAgIHJldCA9ICh1aW50MzJfdCktMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBzZXRfc3dpX2Vycm5vKHRzLCByZW5hbWUocywgczIpKTsKKyAgICAgICAgICAgIGlmIChzMikKKyAgICAgICAgICAgICAgICB1bmxvY2tfdXNlcihzMiwgYXJnMiwgMCk7CisgICAgICAgICAgICBpZiAocykKKyAgICAgICAgICAgICAgICB1bmxvY2tfdXNlcihzLCBhcmcwLCAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICBjYXNlIFRBUkdFVF9TWVNfQ0xPQ0s6CisgICAgICAgIHJldHVybiBjbG9jaygpIC8gKENMT0NLU19QRVJfU0VDIC8gMTAwKTsKKyAgICBjYXNlIFRBUkdFVF9TWVNfVElNRToKKyAgICAgICAgcmV0dXJuIHNldF9zd2lfZXJybm8odHMsIHRpbWUoTlVMTCkpOworICAgIGNhc2UgVEFSR0VUX1NZU19TWVNURU06CisgICAgICAgIEdFVF9BUkcoMCk7CisgICAgICAgIEdFVF9BUkcoMSk7CisgICAgICAgIGlmICh1c2VfZ2RiX3N5c2NhbGxzKCkpIHsKKyAgICAgICAgICAgIGdkYl9kb19zeXNjYWxsKGFybV9zZW1pX2NiLCAic3lzdGVtLCVzIiwgYXJnMCwgKGludClhcmcxKzEpOworICAgICAgICAgICAgcmV0dXJuIGVudi0+cmVnc1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMgPSBsb2NrX3VzZXJfc3RyaW5nKGFyZzApOworICAgICAgICAgICAgaWYgKCFzKSB7CisgICAgICAgICAgICAgICAgLyogRklYTUUgLSBzaG91bGQgdGhpcyBlcnJvciBjb2RlIGJlIC1UQVJHRVRfRUZBVUxUID8gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KS0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gc2V0X3N3aV9lcnJubyh0cywgc3lzdGVtKHMpKTsKKyAgICAgICAgICAgIHVubG9ja191c2VyKHMsIGFyZzAsIDApOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIGNhc2UgVEFSR0VUX1NZU19FUlJOTzoKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIHJldHVybiB0cy0+c3dpX2Vycm5vOworI2Vsc2UKKyAgICAgICAgcmV0dXJuIHN5c2NhbGxfZXJyOworI2VuZGlmCisgICAgY2FzZSBUQVJHRVRfU1lTX0dFVF9DTURMSU5FOgorICAgICAgICB7CisgICAgICAgICAgICAvKiBCdWlsZCBhIGNvbW1hbmQtbGluZSBmcm9tIHRoZSBvcmlnaW5hbCBhcmd2LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoZSBpbnB1dHMgYXJlOgorICAgICAgICAgICAgICogICAgICogYXJnMCwgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiBhdCBsZWFzdCB0aGUgc2l6ZQorICAgICAgICAgICAgICogICAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gYXJnMS4KKyAgICAgICAgICAgICAqICAgICAqIGFyZzEsIHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGFyZzAgaW4KKyAgICAgICAgICAgICAqICAgICAgICAgICAgICAgYnl0ZXMuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogVGhlIG91dHB1dHMgYXJlOgorICAgICAgICAgICAgICogICAgICogYXJnMCwgcG9pbnRlciB0byBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgICAgICAgICBjb21tYW5kIGxpbmUuCisgICAgICAgICAgICAgKiAgICAgKiBhcmcxLCBsZW5ndGggb2YgdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IGFyZzAuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgY2hhciAqb3V0cHV0X2J1ZmZlcjsKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dF9zaXplOworICAgICAgICAgICAgc2l6ZV90IG91dHB1dF9zaXplOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IDA7CisgICAgICAgICAgICBHRVRfQVJHKDApOworICAgICAgICAgICAgR0VUX0FSRygxKTsKKyAgICAgICAgICAgIGlucHV0X3NpemUgPSBhcmcxOworICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmluZy4gICovCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAgICAgICAgIG91dHB1dF9zaXplID0gc3RybGVuKHRzLT5ib290X2luZm8tPmtlcm5lbF9maWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMSAgLyogU2VwYXJhdGluZyBzcGFjZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbih0cy0+Ym9vdF9pbmZvLT5rZXJuZWxfY21kbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgMTsgLyogVGVybWluYXRpbmcgbnVsbCBieXRlLiAgKi8KKyNlbHNlCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAgICAgb3V0cHV0X3NpemUgPSB0cy0+aW5mby0+YXJnX2VuZCAtIHRzLT5pbmZvLT5hcmdfc3RhcnQ7CisgICAgICAgICAgICBpZiAoIW91dHB1dF9zaXplKSB7CisgICAgICAgICAgICAgICAgLyogV2Ugc3BlY2lhbC1jYXNlIHRoZSAiZW1wdHkgY29tbWFuZCBsaW5lIiBjYXNlIChhcmdjPT0wKS4KKyAgICAgICAgICAgICAgICAgICBKdXN0IHByb3ZpZGUgdGhlIHRlcm1pbmF0aW5nIDAuICovCisgICAgICAgICAgICAgICAgb3V0cHV0X3NpemUgPSAxOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChvdXRwdXRfc2l6ZSA+IGlucHV0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgLyogTm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEFkanVzdCB0aGUgY29tbWFuZC1saW5lIGxlbmd0aC4gICovCisgICAgICAgICAgICBpZiAoU0VUX0FSRygxLCBvdXRwdXRfc2l6ZSAtIDEpKSB7CisgICAgICAgICAgICAgICAgLyogQ291bGRuJ3Qgd3JpdGUgYmFjayB0byBhcmd1bWVudCBibG9jayAqLworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogTG9jayB0aGUgYnVmZmVyIG9uIHRoZSBBUk0gc2lkZS4gICovCisgICAgICAgICAgICBvdXRwdXRfYnVmZmVyID0gbG9ja191c2VyKFZFUklGWV9XUklURSwgYXJnMCwgb3V0cHV0X3NpemUsIDApOworICAgICAgICAgICAgaWYgKCFvdXRwdXRfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb3B5IHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgICAgICAgICAgcHN0cmNweShvdXRwdXRfYnVmZmVyLCBvdXRwdXRfc2l6ZSwgdHMtPmJvb3RfaW5mby0+a2VybmVsX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIHBzdHJjYXQob3V0cHV0X2J1ZmZlciwgb3V0cHV0X3NpemUsICIgIik7CisgICAgICAgICAgICBwc3RyY2F0KG91dHB1dF9idWZmZXIsIG91dHB1dF9zaXplLCB0cy0+Ym9vdF9pbmZvLT5rZXJuZWxfY21kbGluZSk7CisjZWxzZQorICAgICAgICAgICAgaWYgKG91dHB1dF9zaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBFbXB0eSBjb21tYW5kLWxpbmUuICAqLworICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXJbMF0gPSAnXDAnOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIob3V0cHV0X2J1ZmZlciwgdHMtPmluZm8tPmFyZ19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU2VwYXJhdGUgYXJndW1lbnRzIGJ5IHdoaXRlIHNwYWNlcy4gICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X3NpemUgLSAxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2J1ZmZlcltpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXJbaV0gPSAnICc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBvdXQ6CisjZW5kaWYKKyAgICAgICAgICAgIC8qIFVubG9jayB0aGUgYnVmZmVyIG9uIHRoZSBBUk0gc2lkZS4gICovCisgICAgICAgICAgICB1bmxvY2tfdXNlcihvdXRwdXRfYnVmZmVyLCBhcmcwLCBvdXRwdXRfc2l6ZSk7CisKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICBjYXNlIFRBUkdFVF9TWVNfSEVBUElORk86CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICpwdHI7CisgICAgICAgICAgICB1aW50MzJfdCBsaW1pdDsKKyAgICAgICAgICAgIEdFVF9BUkcoMCk7CisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgICAgICAvKiBTb21lIEMgbGlicmFyaWVzIGFzc3VtZSB0aGUgaGVhcCBpbW1lZGlhdGVseSBmb2xsb3dzIC5ic3MsIHNvCisgICAgICAgICAgICAgICBhbGxvY2F0ZSBpdCB1c2luZyBzYnJrLiAgKi8KKyAgICAgICAgICAgIGlmICghdHMtPmhlYXBfbGltaXQpIHsKKyAgICAgICAgICAgICAgICBhYmlfdWxvbmcgcmV0OworCisgICAgICAgICAgICAgICAgdHMtPmhlYXBfYmFzZSA9IGRvX2JyaygwKTsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IHRzLT5oZWFwX2Jhc2UgKyBBUk1fQU5HRUxfSEVBUF9TSVpFOworICAgICAgICAgICAgICAgIC8qIFRyeSBhIGJpZyBoZWFwLCBhbmQgcmVkdWNlIHRoZSBzaXplIGlmIHRoYXQgZmFpbHMuICAqLworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZG9fYnJrKGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSAodHMtPmhlYXBfYmFzZSA+PiAxKSArIChsaW1pdCA+PiAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHMtPmhlYXBfbGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHRyID0gbG9ja191c2VyKFZFUklGWV9XUklURSwgYXJnMCwgMTYsIDApOworICAgICAgICAgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSAtIHNob3VsZCB0aGlzIGVycm9yIGNvZGUgYmUgLVRBUkdFVF9FRkFVTFQgPyAqLworICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdHJbMF0gPSB0c3dhcDMyKHRzLT5oZWFwX2Jhc2UpOworICAgICAgICAgICAgcHRyWzFdID0gdHN3YXAzMih0cy0+aGVhcF9saW1pdCk7CisgICAgICAgICAgICBwdHJbMl0gPSB0c3dhcDMyKHRzLT5zdGFja19iYXNlKTsKKyAgICAgICAgICAgIHB0clszXSA9IHRzd2FwMzIoMCk7IC8qIFN0YWNrIGxpbWl0LiAgKi8KKyAgICAgICAgICAgIHVubG9ja191c2VyKHB0ciwgYXJnMCwgMTYpOworI2Vsc2UKKyAgICAgICAgICAgIGxpbWl0ID0gcmFtX3NpemU7CisgICAgICAgICAgICBwdHIgPSBsb2NrX3VzZXIoVkVSSUZZX1dSSVRFLCBhcmcwLCAxNiwgMCk7CisgICAgICAgICAgICBpZiAoIXB0cikgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIC0gc2hvdWxkIHRoaXMgZXJyb3IgY29kZSBiZSAtVEFSR0VUX0VGQVVMVCA/ICovCisgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdCktMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRPRE86IE1ha2UgdGhpcyB1c2UgdGhlIGxpbWl0IG9mIHRoZSBsb2FkZWQgYXBwbGljYXRpb24uICAqLworICAgICAgICAgICAgcHRyWzBdID0gdHN3YXAzMihsaW1pdCAvIDIpOworICAgICAgICAgICAgcHRyWzFdID0gdHN3YXAzMihsaW1pdCk7CisgICAgICAgICAgICBwdHJbMl0gPSB0c3dhcDMyKGxpbWl0KTsgLyogU3RhY2sgYmFzZSAqLworICAgICAgICAgICAgcHRyWzNdID0gdHN3YXAzMigwKTsgLyogU3RhY2sgbGltaXQuICAqLworICAgICAgICAgICAgdW5sb2NrX3VzZXIocHRyLCBhcmcwLCAxNik7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgY2FzZSBUQVJHRVRfU1lTX0VYSVQ6CisgICAgICAgIC8vZ2RiX2V4aXQoZW52LCAwKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6IFVuc3VwcG9ydGVkIFNlbWlIb3N0aW5nIFNXSSAweCUwMnhcbiIsIG5yKTsKKyAgICAgICAgY3B1X2R1bXBfc3RhdGUoRU5WX0dFVF9DUFUoZW52KSwgc3RkZXJyLCBmcHJpbnRmLCAwKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vY3B1LXFvbS5oIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2NwdS1xb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I1YzFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2NwdS1xb20uaApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIFFFTVVfQVJNX0NQVV9RT01fSAorI2RlZmluZSBRRU1VX0FSTV9DUFVfUU9NX0gKKworI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKKyNpbmNsdWRlICJxb20vY3B1LmgiCisKK3R5cGVkZWYgc3RydWN0IEFSTUNQVSB7CisgICAgQ1BVU3RhdGUgcGFyZW50X29iajsKKworICAgIENQVUFSTVN0YXRlIGVudjsKK30gQVJNQ1BVOworCitzdGF0aWMgaW5saW5lIEFSTUNQVSAqYXJtX2Vudl9nZXRfY3B1KENQVUFSTVN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihlbnYsIEFSTUNQVSwgZW52KTsKK30KKworI2RlZmluZSBFTlZfR0VUX0NQVShlKSAgQ1BVKGFybV9lbnZfZ2V0X2NwdShlKSkKKyNkZWZpbmUgRU5WX09GRlNFVCBvZmZzZXRvZihBUk1DUFUsIGVudikKKworI2VuZGlmICAvLyBRRU1VX0FSTV9DUFVfUU9NX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9jcHUuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9jcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc1NGU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2NwdS5oCkBAIC0wLDAgKzEsOTE4IEBACisvKgorICogQVJNIHZpcnR1YWwgQ1BVIGhlYWRlcgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIENQVV9BUk1fSAorI2RlZmluZSBDUFVfQVJNX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAia3ZtLWNvbnN0cy5oIgorCisjaWYgZGVmaW5lZChUQVJHRVRfQUFSQ0g2NCkKKyAgLyogQUFyY2g2NCBkZWZpbml0aW9ucyAqLworIyAgZGVmaW5lIFRBUkdFVF9MT05HX0JJVFMgNjQKKyMgIGRlZmluZSBFTEZfTUFDSElORSBFTV9BQVJDSDY0CisjZWxzZQorIyAgZGVmaW5lIFRBUkdFVF9MT05HX0JJVFMgMzIKKyMgIGRlZmluZSBFTEZfTUFDSElORSBFTV9BUk0KKyNlbmRpZgorCisvLyBUT0RPKGRpZ2l0KTogUmVtb3ZlIHRoaXMgbGluZS4KKyNkZWZpbmUgQ1BVT2xkU3RhdGUgc3RydWN0IENQVUFSTVN0YXRlCisKKyNkZWZpbmUgQ1BVQXJjaFN0YXRlIHN0cnVjdCBDUFVBUk1TdGF0ZQorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJleGVjL2NwdS1kZWZzLmgiCisKKyNpbmNsdWRlICJmcHUvc29mdGZsb2F0LmgiCisKKyNkZWZpbmUgVEFSR0VUX0hBU19JQ0UgMQorCisjZGVmaW5lIEVYQ1BfVURFRiAgICAgICAgICAgIDEgICAvKiB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgRVhDUF9TV0kgICAgICAgICAgICAgMiAgIC8qIHNvZnR3YXJlIGludGVycnVwdCAqLworI2RlZmluZSBFWENQX1BSRUZFVENIX0FCT1JUICAzCisjZGVmaW5lIEVYQ1BfREFUQV9BQk9SVCAgICAgIDQKKyNkZWZpbmUgRVhDUF9JUlEgICAgICAgICAgICAgNQorI2RlZmluZSBFWENQX0ZJUSAgICAgICAgICAgICA2CisjZGVmaW5lIEVYQ1BfQktQVCAgICAgICAgICAgIDcKKyNkZWZpbmUgRVhDUF9FWENFUFRJT05fRVhJVCAgOCAgIC8qIFJldHVybiBmcm9tIHY3TSBleGNlcHRpb24uICAqLworI2RlZmluZSBFWENQX0tFUk5FTF9UUkFQICAgICA5ICAgLyogSnVtcGVkIHRvIGtlcm5lbCBjb2RlIHBhZ2UuICAqLworI2RlZmluZSBFWENQX1NUUkVYICAgICAgICAgIDEwCisjZGVmaW5lIEVYQ1BfU01DICAgICAgICAgICAgMTEgICAvKiBzZWN1cmUgbW9uaXRvciBjYWxsICovCisKKyNkZWZpbmUgQVJNVjdNX0VYQ1BfUkVTRVQgICAxCisjZGVmaW5lIEFSTVY3TV9FWENQX05NSSAgICAgMgorI2RlZmluZSBBUk1WN01fRVhDUF9IQVJEICAgIDMKKyNkZWZpbmUgQVJNVjdNX0VYQ1BfTUVNICAgICA0CisjZGVmaW5lIEFSTVY3TV9FWENQX0JVUyAgICAgNQorI2RlZmluZSBBUk1WN01fRVhDUF9VU0FHRSAgIDYKKyNkZWZpbmUgQVJNVjdNX0VYQ1BfU1ZDICAgICAxMQorI2RlZmluZSBBUk1WN01fRVhDUF9ERUJVRyAgIDEyCisjZGVmaW5lIEFSTVY3TV9FWENQX1BFTkRTViAgMTQKKyNkZWZpbmUgQVJNVjdNX0VYQ1BfU1lTVElDSyAxNQorCisvKiBBUk0tc3BlY2lmaWMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4gICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfRklRICAgQ1BVX0lOVEVSUlVQVF9UR1RfRVhUXzEKKworLyogTWVhbmluZ3Mgb2YgdGhlIEFSTUNQVSBvYmplY3QncyB0d28gaW5ib3VuZCBHUElPIGxpbmVzICovCisjZGVmaW5lIEFSTV9DUFVfSVJRIDAKKyNkZWZpbmUgQVJNX0NQVV9GSVEgMQorCit0eXBlZGVmIHZvaWQgQVJNV3JpdGVDUEZ1bmModm9pZCAqb3BhcXVlLCBpbnQgY3BfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjcmVnLCBpbnQgb3BlcmFuZCwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmV0YWRkcik7Cit0eXBlZGVmIHVpbnQzMl90IEFSTVJlYWRDUEZ1bmModm9pZCAqb3BhcXVlLCBpbnQgY3BfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0cmVnLCBpbnQgb3BlcmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXRhZGRyKTsKKworc3RydWN0IGFybV9ib290X2luZm87CisKKyNkZWZpbmUgTkJfTU1VX01PREVTIDIKKworLyogV2UgY3VycmVudGx5IGFzc3VtZSBmbG9hdCBhbmQgZG91YmxlIGFyZSBJRUVFIHNpbmdsZSBhbmQgZG91YmxlCisgICBwcmVjaXNpb24gcmVzcGVjdGl2ZWx5LgorICAgRG9pbmcgcnVudGltZSBjb252ZXJzaW9ucyBpcyB0cmlja3kgYmVjYXVzZSBWRlAgcmVnaXN0ZXJzIG1heSBjb250YWluCisgICBpbnRlZ2VyIHZhbHVlcyAoZWcuIGFzIHRoZSByZXN1bHQgb2YgYSBGVE9TSSBpbnN0cnVjdGlvbikuCisgICBzPDJuPiBtYXBzIHRvIHRoZSBsZWFzdCBzaWduaWZpY2FudCBoYWxmIG9mIGQ8bj4KKyAgIHM8Mm4rMT4gbWFwcyB0byB0aGUgbW9zdCBzaWduaWZpY2FudCBoYWxmIG9mIGQ8bj4KKyAqLworCisvKiBDUFUgc3RhdGUgZm9yIGVhY2ggaW5zdGFuY2Ugb2YgYSBnZW5lcmljIHRpbWVyIChpbiBjcDE1IGMxNCkgKi8KK3R5cGVkZWYgc3RydWN0IEFSTUdlbmVyaWNUaW1lciB7CisgICAgdWludDY0X3QgY3ZhbDsgLyogVGltZXIgQ29tcGFyZVZhbHVlIHJlZ2lzdGVyICovCisgICAgdWludDMyX3QgY3RsOyAvKiBUaW1lciBDb250cm9sIHJlZ2lzdGVyICovCit9IEFSTUdlbmVyaWNUaW1lcjsKKworI2RlZmluZSBHVElNRVJfUEhZUyAwCisjZGVmaW5lIEdUSU1FUl9WSVJUIDEKKyNkZWZpbmUgTlVNX0dUSU1FUlMgMgorCisvKiBTY2FsZSBmYWN0b3IgZm9yIGdlbmVyaWMgdGltZXJzLCBpZSBudW1iZXIgb2YgbnMgcGVyIHRpY2suCisgKiBUaGlzIGdpdmVzIGEgNjIuNU1IeiB0aW1lci4KKyAqLworI2RlZmluZSBHVElNRVJfU0NBTEUgMTYKKwordHlwZWRlZiBzdHJ1Y3QgQ1BVQVJNU3RhdGUgeworICAgIC8qIFJlZ3MgZm9yIGN1cnJlbnQgbW9kZS4gICovCisgICAgdWludDMyX3QgcmVnc1sxNl07CisgICAgLyogRnJlcXVlbnRseSBhY2Nlc3NlZCBDUFNSIGJpdHMgYXJlIHN0b3JlZCBzZXBhcmF0ZWx5IGZvciBlZmZpY2llbnRseS4KKyAgICAgICBUaGlzIGNvbnRhaW5zIGFsbCB0aGUgb3RoZXIgYml0cy4gIFVzZSBjcHNyX3tyZWFkLHdyaXRlfSB0byBhY2Nlc3MKKyAgICAgICB0aGUgd2hvbGUgQ1BTUi4gICovCisgICAgdWludDMyX3QgdW5jYWNoZWRfY3BzcjsKKyAgICB1aW50MzJfdCBzcHNyOworCisgICAgLyogQmFua2VkIHJlZ2lzdGVycy4gICovCisgICAgdWludDMyX3QgYmFua2VkX3Nwc3JbN107CisgICAgdWludDMyX3QgYmFua2VkX3IxM1s3XTsKKyAgICB1aW50MzJfdCBiYW5rZWRfcjE0WzddOworCisgICAgLyogVGhlc2UgaG9sZCByOC1yMTIuICAqLworICAgIHVpbnQzMl90IHVzcl9yZWdzWzVdOworICAgIHVpbnQzMl90IGZpcV9yZWdzWzVdOworCisgICAgLyogY3BzciBmbGFnIGNhY2hlIGZvciBmYXN0ZXIgZXhlY3V0aW9uICovCisgICAgdWludDMyX3QgQ0Y7IC8qIDAgb3IgMSAqLworICAgIHVpbnQzMl90IFZGOyAvKiBWIGlzIHRoZSBiaXQgMzEuIEFsbCBvdGhlciBiaXRzIGFyZSB1bmRlZmluZWQgKi8KKyAgICB1aW50MzJfdCBORjsgLyogTiBpcyBiaXQgMzEuIEFsbCBvdGhlciBiaXRzIGFyZSB1bmRlZmluZWQuICAqLworICAgIHVpbnQzMl90IFpGOyAvKiBaIHNldCBpZiB6ZXJvLiAgKi8KKyAgICB1aW50MzJfdCBRRjsgLyogMCBvciAxICovCisgICAgdWludDMyX3QgR0U7IC8qIGNwc3JbMTk6MTZdICovCisgICAgdWludDMyX3QgdGh1bWI7IC8qIGNwc3JbNV0uIDAgPSBhcm0gbW9kZSwgMSA9IHRodW1iIG1vZGUuICovCisgICAgdWludDMyX3QgY29uZGV4ZWNfYml0czsgLyogSVQgYml0cy4gIGNwc3JbMTU6MTAsMjY6MjVdLiAgKi8KKworICAgIC8qIFN5c3RlbSBjb250cm9sIGNvcHJvY2Vzc29yIChjcDE1KSAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IGMwX2NwdWlkOworICAgICAgICB1aW50MzJfdCBjMF9jYWNoZXR5cGU7CisgICAgICAgIHVpbnQzMl90IGMwX2Njc2lkWzE2XTsgLyogQ2FjaGUgc2l6ZS4gICovCisgICAgICAgIHVpbnQzMl90IGMwX2NsaWQ7IC8qIENhY2hlIGxldmVsLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzBfY3NzZWw7IC8qIENhY2hlIHNpemUgc2VsZWN0aW9uLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzBfYzFbOF07IC8qIEZlYXR1cmUgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzBfYzJbOF07IC8qIEluc3RydWN0aW9uIHNldCByZWdpc3RlcnMuICAqLworICAgICAgICB1aW50MzJfdCBjMV9zeXM7IC8qIFN5c3RlbSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzFfY29wcm9jOyAvKiBDb3Byb2Nlc3NvciBhY2Nlc3MgcmVnaXN0ZXIuICAqLworICAgICAgICB1aW50MzJfdCBjMV94c2NhbGVhdXhjcjsgLyogWFNjYWxlIGF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzFfc2VjZmc7IC8qIFNlY3VyZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLiAqLworICAgICAgICB1aW50MzJfdCBjMV9zZWRiZzsgLyogU2VjdXJlIGRlYnVnIGVuYWJsZSByZWdpc3Rlci4gKi8KKyAgICAgICAgdWludDMyX3QgYzFfbnNlYWM7IC8qIE5vbi1zZWN1cmUgYWNjZXNzIGNvbnRyb2wgcmVnaXN0ZXIuICovCisgICAgICAgIHVpbnQzMl90IGMyX2Jhc2UwOyAvKiBNTVUgdHJhbnNsYXRpb24gdGFibGUgYmFzZSAwLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzJfYmFzZTE7IC8qIE1NVSB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIDEuICAqLworICAgICAgICB1aW50MzJfdCBjMl9jb250cm9sOyAvKiBNTVUgdHJhbnNsYXRpb24gdGFibGUgYmFzZSBjb250cm9sLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzJfbWFzazsgLyogTU1VIHRyYW5zbGF0aW9uIHRhYmxlIGJhc2Ugc2VsZWN0aW9uIG1hc2suICAqLworICAgICAgICB1aW50MzJfdCBjMl9iYXNlX21hc2s7IC8qIE1NVSB0cmFuc2xhdGlvbiB0YWJsZSBiYXNlIDAgbWFzay4gKi8KKyAgICAgICAgdWludDMyX3QgYzJfZGF0YTsgLyogTVBVIGRhdGEgY2FjaGFibGUgYml0cy4gICovCisgICAgICAgIHVpbnQzMl90IGMyX2luc247IC8qIE1QVSBpbnN0cnVjdGlvbiBjYWNoYWJsZSBiaXRzLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzM7IC8qIE1NVSBkb21haW4gYWNjZXNzIGNvbnRyb2wgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIE1QVSB3cml0ZSBidWZmZXIgY29udHJvbC4gICovCisgICAgICAgIHVpbnQzMl90IGM1X2luc247IC8qIEZhdWx0IHN0YXR1cyByZWdpc3RlcnMuICAqLworICAgICAgICB1aW50MzJfdCBjNV9kYXRhOworICAgICAgICB1aW50MzJfdCBjNl9yZWdpb25bOF07IC8qIE1QVSBiYXNlL3NpemUgcmVnaXN0ZXJzLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzZfaW5zbjsgLyogRmF1bHQgYWRkcmVzcyByZWdpc3RlcnMuICAqLworICAgICAgICB1aW50MzJfdCBjNl9kYXRhOworICAgICAgICB1aW50MzJfdCBjN19wYXI7ICAvKiBUcmFuc2xhdGlvbiByZXN1bHQuICovCisgICAgICAgIHVpbnQzMl90IGM5X2luc247IC8qIENhY2hlIGxvY2tkb3duIHJlZ2lzdGVycy4gICovCisgICAgICAgIHVpbnQzMl90IGM5X2RhdGE7CisgICAgICAgIHVpbnQzMl90IGM5X3BtY3I7IC8qIHBlcmZvcm1hbmNlIG1vbml0b3IgY29udHJvbCByZWdpc3RlciAqLworICAgICAgICB1aW50MzJfdCBjOV9wbWNudGVuOyAvKiBwZXJmIG1vbml0b3IgY291bnRlciBlbmFibGVzICovCisgICAgICAgIHVpbnQzMl90IGM5X3Btb3ZzcjsgLyogcGVyZiBtb25pdG9yIG92ZXJmbG93IHN0YXR1cyAqLworICAgICAgICB1aW50MzJfdCBjOV9wbXhldnR5cGVyOyAvKiBwZXJmIG1vbml0b3IgZXZlbnQgdHlwZSAqLworICAgICAgICB1aW50MzJfdCBjOV9wbXVzZXJlbnI7IC8qIHBlcmYgbW9uaXRvciB1c2VyIGVuYWJsZSAqLworICAgICAgICB1aW50MzJfdCBjOV9wbWludGVuOyAvKiBwZXJmIG1vbml0b3IgaW50ZXJydXB0IGVuYWJsZXMgKi8KKyAgICAgICAgdWludDMyX3QgYzEyX3ZiYXI7IC8qIHNlY3VyZS9ub25zZWN1cmUgdmVjdG9yIGJhc2UgYWRkcmVzcyByZWdpc3Rlci4gKi8KKyAgICAgICAgdWludDMyX3QgYzEyX212YmFyOyAvKiBtb25pdG9yIHZlY3RvciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIuICovCisgICAgICAgIHVpbnQzMl90IGMxM19mY3NlOyAvKiBGQ1NFIFBJRC4gICovCisgICAgICAgIHVpbnQzMl90IGMxM19jb250ZXh0OyAvKiBDb250ZXh0IElELiAgKi8KKyAgICAgICAgdWludDMyX3QgYzEzX3RsczE7IC8qIFVzZXIgUlcgVGhyZWFkIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzEzX3RsczI7IC8qIFVzZXIgUk8gVGhyZWFkIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzEzX3RsczM7IC8qIFByaXZpbGVnZWQgVGhyZWFkIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzE1X2NwYXI7IC8qIFhTY2FsZSBDb3Byb2Nlc3NvciBBY2Nlc3MgUmVnaXN0ZXIgKi8KKyAgICAgICAgdWludDMyX3QgYzE1X3RpY29uZmlnOyAvKiBUSTkyNVQgY29uZmlndXJhdGlvbiBieXRlLiAgKi8KKyAgICAgICAgdWludDMyX3QgYzE1X2lfbWF4OyAvKiBNYXhpbXVtIEQtY2FjaGUgZGlydHkgbGluZSBpbmRleC4gICovCisgICAgICAgIHVpbnQzMl90IGMxNV9pX21pbjsgLyogTWluaW11bSBELWNhY2hlIGRpcnR5IGxpbmUgaW5kZXguICAqLworICAgICAgICB1aW50MzJfdCBjMTVfdGhyZWFkaWQ7IC8qIFRJIGRlYnVnZ2VyIHRocmVhZC1JRC4gICovCisgICAgfSBjcDE1OworCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDMyX3Qgb3RoZXJfc3A7CisgICAgICAgIHVpbnQzMl90IHZlY2Jhc2U7CisgICAgICAgIHVpbnQzMl90IGJhc2Vwcmk7CisgICAgICAgIHVpbnQzMl90IGNvbnRyb2w7CisgICAgICAgIGludCBjdXJyZW50X3NwOworICAgICAgICBpbnQgZXhjZXB0aW9uOworICAgICAgICBpbnQgcGVuZGluZ19leGNlcHRpb247CisgICAgfSB2N207CisKKyAgICAvKiBNaW5pbWFsIHNldCBvZiBkZWJ1ZyBjb3Byb2Nlc3NvciBzdGF0ZSAoY3AxNCkgKi8KKyAgICB1aW50MzJfdCBjcDE0X2RiZ2RpZHI7CisKKyAgICAvKiBUaHVtYi0yIEVFIHN0YXRlLiAgKi8KKyAgICB1aW50MzJfdCB0ZWVjcjsKKyAgICB1aW50MzJfdCB0ZWVoYnI7CisKKyAgICAvKiBJbnRlcm5hbCBDUFUgZmVhdHVyZSBmbGFncy4gICovCisgICAgdWludDMyX3QgZmVhdHVyZXM7CisKKyAgICAvKiBWRlAgY29wcm9jZXNzb3Igc3RhdGUuICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIGZsb2F0NjQgcmVnc1szMl07CisKKyAgICAgICAgdWludDMyX3QgeHJlZ3NbMTZdOworICAgICAgICAvKiBXZSBzdG9yZSB0aGVzZSBmcGNzciBmaWVsZHMgc2VwYXJhdGVseSBmb3IgY29udmVuaWVuY2UuICAqLworICAgICAgICBpbnQgdmVjX2xlbjsKKyAgICAgICAgaW50IHZlY19zdHJpZGU7CisKKyAgICAgICAgLyogc2NyYXRjaCBzcGFjZSB3aGVuIFRuIGFyZSBub3Qgc3VmZmljaWVudC4gICovCisgICAgICAgIHVpbnQzMl90IHNjcmF0Y2hbOF07CisKKyAgICAgICAgLyogZnBfc3RhdHVzIGlzIHRoZSAibm9ybWFsIiBmcCBzdGF0dXMuIHN0YW5kYXJkX2ZwX3N0YXR1cyByZXRhaW5zCisgICAgICAgICAqIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBUk0gIlN0YW5kYXJkIEZQU0NSIFZhbHVlIiwgaWUKKyAgICAgICAgICogZGVmYXVsdC1OYU4sIGZsdXNoLXRvLXplcm8sIHJvdW5kLXRvLW5lYXJlc3QgYW5kIGlzIHVzZWQgYnkKKyAgICAgICAgICogYW55IG9wZXJhdGlvbnMgKGdlbmVyYWxseSBOZW9uKSB3aGljaCB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluZXMKKyAgICAgICAgICogYXMgY29udHJvbGxlZCBieSB0aGUgc3RhbmRhcmQgRlBTQ1IgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIEZQU0NSLgorICAgICAgICAgKgorICAgICAgICAgKiBUbyBhdm9pZCBoYXZpbmcgdG8gdHJhbnNmZXIgZXhjZXB0aW9uIGJpdHMgYXJvdW5kLCB3ZSBzaW1wbHkKKyAgICAgICAgICogc2F5IHRoYXQgdGhlIEZQU0NSIGN1bXVsYXRpdmUgZXhjZXB0aW9uIGZsYWdzIGFyZSB0aGUgbG9naWNhbAorICAgICAgICAgKiBPUiBvZiB0aGUgZmxhZ3MgaW4gdGhlIHR3byBmcCBzdGF0dXNlcy4gVGhpcyByZWxpZXMgb24gdGhlCisgICAgICAgICAqIG9ubHkgdGhpbmcgd2hpY2ggbmVlZHMgdG8gcmVhZCB0aGUgZXhjZXB0aW9uIGZsYWdzIGJlaW5nCisgICAgICAgICAqIGFuIGV4cGxpY2l0IEZQU0NSIHJlYWQuCisgICAgICAgICAqLworICAgICAgICBmbG9hdF9zdGF0dXMgZnBfc3RhdHVzOworICAgICAgICBmbG9hdF9zdGF0dXMgc3RhbmRhcmRfZnBfc3RhdHVzOworICAgIH0gdmZwOworICAgIHVpbnQzMl90IGV4Y2x1c2l2ZV9hZGRyOworICAgIHVpbnQzMl90IGV4Y2x1c2l2ZV92YWw7CisgICAgdWludDMyX3QgZXhjbHVzaXZlX2hpZ2g7CisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIHVpbnQzMl90IGV4Y2x1c2l2ZV90ZXN0OworICAgIHVpbnQzMl90IGV4Y2x1c2l2ZV9pbmZvOworI2VuZGlmCisKKyAgICAvKiBpd01NWHQgY29wcm9jZXNzb3Igc3RhdGUuICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHJlZ3NbMTZdOworICAgICAgICB1aW50NjRfdCB2YWw7CisKKyAgICAgICAgdWludDMyX3QgY3JlZ3NbMTZdOworICAgIH0gaXdtbXh0OworCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIC8qIEZvciB1c2VybW9kZSBzeXNjYWxsIHRyYW5zbGF0aW9uLiAgKi8KKyAgICBpbnQgZWFiaTsKKyNlbmRpZgorCisgICAgQ1BVX0NPTU1PTgorCisgICAgLyogVGhlc2UgZmllbGRzIGFmdGVyIHRoZSBjb21tb24gb25lcyBzbyB0aGV5IGFyZSBwcmVzZXJ2ZWQgb24gcmVzZXQuICAqLworCisgICAgLyogQ29wcm9jZXNzb3IgSU8gdXNlZCBieSBwZXJpcGhlcmFscyAqLworICAgIHN0cnVjdCB7CisgICAgICAgIEFSTVJlYWRDUEZ1bmMgKmNwX3JlYWQ7CisgICAgICAgIEFSTVdyaXRlQ1BGdW5jICpjcF93cml0ZTsKKyAgICAgICAgdm9pZCAqb3BhcXVlOworICAgIH0gY3BbMTVdOworICAgIHZvaWQgKm52aWM7CisgICAgY29uc3Qgc3RydWN0IGFybV9ib290X2luZm8gKmJvb3RfaW5mbzsKK30gQ1BVQVJNU3RhdGU7CisKKyNpbmNsdWRlICJjcHUtcW9tLmgiCisKK0NQVUFSTVN0YXRlICpjcHVfYXJtX2luaXQoY29uc3QgY2hhciAqY3B1X21vZGVsKTsKK3ZvaWQgYXJtX3RyYW5zbGF0ZV9pbml0KHZvaWQpOworaW50IGNwdV9hcm1fZXhlYyhDUFVBUk1TdGF0ZSAqcyk7Cit2b2lkIGNwdV9hcm1fY2xvc2UoQ1BVQVJNU3RhdGUgKnMpOwordm9pZCBkb19pbnRlcnJ1cHQoQ1BVQVJNU3RhdGUgKik7Cit2b2lkIHN3aXRjaF9tb2RlKENQVUFSTVN0YXRlICosIGludCk7Cit1aW50MzJfdCBkb19hcm1fc2VtaWhvc3RpbmcoQ1BVQVJNU3RhdGUgKmVudik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19hNjQoQ1BVQVJNU3RhdGUgKmVudikKK3sKKyNpZmRlZiBDT05GSUdfQU5EUk9JRCAvLyBUT0RPKGRpZ2l0KQorICAgIHJldHVybiAwOworI2Vsc2UKKyAgICByZXR1cm4gZW52LT5hYXJjaDY0OworI2VuZGlmCit9CisKKyNkZWZpbmUgUFNUQVRFX05fU0hJRlQgMworI2RlZmluZSBQU1RBVEVfTiAgKDEgPDwgUFNUQVRFX05fU0hJRlQpCisjZGVmaW5lIFBTVEFURV9aX1NISUZUIDIKKyNkZWZpbmUgUFNUQVRFX1ogICgxIDw8IFBTVEFURV9aX1NISUZUKQorI2RlZmluZSBQU1RBVEVfQ19TSElGVCAxCisjZGVmaW5lIFBTVEFURV9DICAoMSA8PCBQU1RBVEVfQ19TSElGVCkKKyNkZWZpbmUgUFNUQVRFX1ZfU0hJRlQgMAorI2RlZmluZSBQU1RBVEVfViAgKDEgPDwgUFNUQVRFX1ZfU0hJRlQpCisKKy8qIHlvdSBjYW4gY2FsbCB0aGlzIHNpZ25hbCBoYW5kbGVyIGZyb20geW91ciBTSUdCVVMgYW5kIFNJR1NFR1YKKyAgIHNpZ25hbCBoYW5kbGVycyB0byBpbmZvcm0gdGhlIHZpcnR1YWwgQ1BVIG9mIGV4Y2VwdGlvbnMuIG5vbiB6ZXJvCisgICBpcyByZXR1cm5lZCBpZiB0aGUgc2lnbmFsIHdhcyBoYW5kbGVkIGJ5IHRoZSB2aXJ0dWFsIENQVS4gICovCitpbnQgY3B1X2FybV9zaWduYWxfaGFuZGxlcihpbnQgaG9zdF9zaWdudW0sIHZvaWQgKnBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHVjKTsKK2ludCBjcHVfYXJtX2hhbmRsZV9tbXVfZmF1bHQgKENQVUFSTVN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCk7CisjZGVmaW5lIGNwdV9oYW5kbGVfbW11X2ZhdWx0IGNwdV9hcm1faGFuZGxlX21tdV9mYXVsdAorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3NldF90bHMoQ1BVQVJNU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIG5ld3RscykKK3sKKyAgZW52LT5jcDE1LmMxM190bHMyID0gbmV3dGxzOworfQorCisjZGVmaW5lIENQU1JfTSAoMHgxZlUpCisjZGVmaW5lIENQU1JfVCAoMVUgPDwgNSkKKyNkZWZpbmUgQ1BTUl9GICgxVSA8PCA2KQorI2RlZmluZSBDUFNSX0kgKDFVIDw8IDcpCisjZGVmaW5lIENQU1JfQSAoMVUgPDwgOCkKKyNkZWZpbmUgQ1BTUl9FICgxVSA8PCA5KQorI2RlZmluZSBDUFNSX0lUXzJfNyAoMHhmYzAwVSkKKyNkZWZpbmUgQ1BTUl9HRSAoMHhmVSA8PCAxNikKKyNkZWZpbmUgQ1BTUl9SRVNFUlZFRCAoMHhmVSA8PCAyMCkKKyNkZWZpbmUgQ1BTUl9KICgxVSA8PCAyNCkKKyNkZWZpbmUgQ1BTUl9JVF8wXzEgKDNVIDw8IDI1KQorI2RlZmluZSBDUFNSX1EgKDFVIDw8IDI3KQorI2RlZmluZSBDUFNSX1YgKDFVIDw8IDI4KQorI2RlZmluZSBDUFNSX0MgKDFVIDw8IDI5KQorI2RlZmluZSBDUFNSX1ogKDFVIDw8IDMwKQorI2RlZmluZSBDUFNSX04gKDFVIDw8IDMxKQorI2RlZmluZSBDUFNSX05aQ1YgKENQU1JfTiB8IENQU1JfWiB8IENQU1JfQyB8IENQU1JfVikKKworI2RlZmluZSBDUFNSX0lUIChDUFNSX0lUXzBfMSB8IENQU1JfSVRfMl83KQorI2RlZmluZSBDQUNIRURfQ1BTUl9CSVRTIChDUFNSX1QgfCBDUFNSX0dFIHwgQ1BTUl9JVCB8IENQU1JfUSB8IENQU1JfTlpDVikKKy8qIEJpdHMgd3JpdGFibGUgaW4gdXNlciBtb2RlLiAgKi8KKyNkZWZpbmUgQ1BTUl9VU0VSIChDUFNSX05aQ1YgfCBDUFNSX1EgfCBDUFNSX0dFKQorLyogRXhlY3V0aW9uIHN0YXRlIGJpdHMuICBNUlMgcmVhZCBhcyB6ZXJvLCBNU1Igd3JpdGVzIGlnbm9yZWQuICAqLworI2RlZmluZSBDUFNSX0VYRUMgKENQU1JfVCB8IENQU1JfSVQgfCBDUFNSX0opCisKKy8qIFJldHVybiB0aGUgY3VycmVudCBDUFNSIHZhbHVlLiAgKi8KK3VpbnQzMl90IGNwc3JfcmVhZChDUFVBUk1TdGF0ZSAqZW52KTsKKy8qIFNldCB0aGUgQ1BTUi4gIE5vdGUgdGhhdCBzb21lIGJpdHMgb2YgbWFzayBtdXN0IGJlIGFsbC1zZXQgb3IgYWxsLWNsZWFyLiAgKi8KK3ZvaWQgY3Bzcl93cml0ZShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwsIHVpbnQzMl90IG1hc2spOworCisvKiBSZXR1cm4gdGhlIGN1cnJlbnQgeFBTUiB2YWx1ZS4gICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHhwc3JfcmVhZChDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIGludCBaRjsKKyAgICBaRiA9IChlbnYtPlpGID09IDApOworICAgIHJldHVybiAoZW52LT5ORiAmIDB4ODAwMDAwMDApIHwgKFpGIDw8IDMwKQorICAgICAgICB8IChlbnYtPkNGIDw8IDI5KSB8ICgoZW52LT5WRiAmIDB4ODAwMDAwMDApID4+IDMpIHwgKGVudi0+UUYgPDwgMjcpCisgICAgICAgIHwgKGVudi0+dGh1bWIgPDwgMjQpIHwgKChlbnYtPmNvbmRleGVjX2JpdHMgJiAzKSA8PCAyNSkKKyAgICAgICAgfCAoKGVudi0+Y29uZGV4ZWNfYml0cyAmIDB4ZmMpIDw8IDgpCisgICAgICAgIHwgZW52LT52N20uZXhjZXB0aW9uOworfQorCisvKiBTZXQgdGhlIHhQU1IuICBOb3RlIHRoYXQgc29tZSBiaXRzIG9mIG1hc2sgbXVzdCBiZSBhbGwtc2V0IG9yIGFsbC1jbGVhci4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgeHBzcl93cml0ZShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwsIHVpbnQzMl90IG1hc2spCit7CisgICAgaWYgKG1hc2sgJiBDUFNSX05aQ1YpIHsKKyAgICAgICAgZW52LT5aRiA9ICh+dmFsKSAmIENQU1JfWjsKKyAgICAgICAgZW52LT5ORiA9IHZhbDsKKyAgICAgICAgZW52LT5DRiA9ICh2YWwgPj4gMjkpICYgMTsKKyAgICAgICAgZW52LT5WRiA9ICh2YWwgPDwgMykgJiAweDgwMDAwMDAwOworICAgIH0KKyAgICBpZiAobWFzayAmIENQU1JfUSkKKyAgICAgICAgZW52LT5RRiA9ICgodmFsICYgQ1BTUl9RKSAhPSAwKTsKKyAgICBpZiAobWFzayAmICgxIDw8IDI0KSkKKyAgICAgICAgZW52LT50aHVtYiA9ICgodmFsICYgKDEgPDwgMjQpKSAhPSAwKTsKKyAgICBpZiAobWFzayAmIENQU1JfSVRfMF8xKSB7CisgICAgICAgIGVudi0+Y29uZGV4ZWNfYml0cyAmPSB+MzsKKyAgICAgICAgZW52LT5jb25kZXhlY19iaXRzIHw9ICh2YWwgPj4gMjUpICYgMzsKKyAgICB9CisgICAgaWYgKG1hc2sgJiBDUFNSX0lUXzJfNykgeworICAgICAgICBlbnYtPmNvbmRleGVjX2JpdHMgJj0gMzsKKyAgICAgICAgZW52LT5jb25kZXhlY19iaXRzIHw9ICh2YWwgPj4gOCkgJiAweGZjOworICAgIH0KKyAgICBpZiAobWFzayAmIDB4MWZmKSB7CisgICAgICAgIGVudi0+djdtLmV4Y2VwdGlvbiA9IHZhbCAmIDB4MWZmOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBjdXJyZW50IEZQU0NSIHZhbHVlLiAgKi8KK3VpbnQzMl90IHZmcF9nZXRfZnBzY3IoQ1BVQVJNU3RhdGUgKmVudik7Cit2b2lkIHZmcF9zZXRfZnBzY3IoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgdmFsKTsKKworZW51bSBhcm1fY3B1X21vZGUgeworICBBUk1fQ1BVX01PREVfVVNSID0gMHgxMCwKKyAgQVJNX0NQVV9NT0RFX0ZJUSA9IDB4MTEsCisgIEFSTV9DUFVfTU9ERV9JUlEgPSAweDEyLAorICBBUk1fQ1BVX01PREVfU1ZDID0gMHgxMywKKyAgQVJNX0NQVV9NT0RFX1NNQyA9IDB4MTYsCisgIEFSTV9DUFVfTU9ERV9BQlQgPSAweDE3LAorICBBUk1fQ1BVX01PREVfVU5EID0gMHgxYiwKKyAgQVJNX0NQVV9NT0RFX1NZUyA9IDB4MWYKK307CisKKy8qIFZGUCBzeXN0ZW0gcmVnaXN0ZXJzLiAgKi8KKyNkZWZpbmUgQVJNX1ZGUF9GUFNJRCAgIDAKKyNkZWZpbmUgQVJNX1ZGUF9GUFNDUiAgIDEKKyNkZWZpbmUgQVJNX1ZGUF9NVkZSMSAgIDYKKyNkZWZpbmUgQVJNX1ZGUF9NVkZSMCAgIDcKKyNkZWZpbmUgQVJNX1ZGUF9GUEVYQyAgIDgKKyNkZWZpbmUgQVJNX1ZGUF9GUElOU1QgIDkKKyNkZWZpbmUgQVJNX1ZGUF9GUElOU1QyIDEwCisKKy8qIGl3TU1YdCBjb3Byb2Nlc3NvciBjb250cm9sIHJlZ2lzdGVycy4gICovCisjZGVmaW5lIEFSTV9JV01NWFRfd0NJRAkJMAorI2RlZmluZSBBUk1fSVdNTVhUX3dDb24JCTEKKyNkZWZpbmUgQVJNX0lXTU1YVF93Q1NTRgkyCisjZGVmaW5lIEFSTV9JV01NWFRfd0NBU0YJMworI2RlZmluZSBBUk1fSVdNTVhUX3dDR1IwCTgKKyNkZWZpbmUgQVJNX0lXTU1YVF93Q0dSMQk5CisjZGVmaW5lIEFSTV9JV01NWFRfd0NHUjIJMTAKKyNkZWZpbmUgQVJNX0lXTU1YVF93Q0dSMwkxMQorCisvKiBJZiBhZGRpbmcgYSBmZWF0dXJlIGJpdCB3aGljaCBjb3JyZXNwb25kcyB0byBhIExpbnV4IEVMRgorICogSFdDQVAgYml0LCByZW1lbWJlciB0byB1cGRhdGUgdGhlIGZlYXR1cmUtYml0LXRvLWh3Y2FwCisgKiBtYXBwaW5nIGluIGxpbnV4LXVzZXIvZWxmbG9hZC5jOmdldF9lbGZfaHdjYXAoKS4KKyAqLworZW51bSBhcm1fZmVhdHVyZXMgeworICAgIEFSTV9GRUFUVVJFX1ZGUCwKKyAgICBBUk1fRkVBVFVSRV9BVVhDUiwgIC8qIEFSTTEwMjYgQXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIuICAqLworICAgIEFSTV9GRUFUVVJFX1hTQ0FMRSwgLyogSW50ZWwgWFNjYWxlIGV4dGVuc2lvbnMuICAqLworICAgIEFSTV9GRUFUVVJFX0lXTU1YVCwgLyogSW50ZWwgaXdNTVh0IGV4dGVuc2lvbi4gICovCisgICAgQVJNX0ZFQVRVUkVfVjYsCisgICAgQVJNX0ZFQVRVUkVfVjZLLAorICAgIEFSTV9GRUFUVVJFX1Y3LAorICAgIEFSTV9GRUFUVVJFX1RIVU1CMiwKKyAgICBBUk1fRkVBVFVSRV9NUFUsICAgIC8qIE9ubHkgaGFzIE1lbW9yeSBQcm90ZWN0aW9uIFVuaXQsIG5vdCBmdWxsIE1NVS4gICovCisgICAgQVJNX0ZFQVRVUkVfVkZQMywKKyAgICBBUk1fRkVBVFVSRV9WRlBfRlAxNiwKKyAgICBBUk1fRkVBVFVSRV9ORU9OLAorICAgIEFSTV9GRUFUVVJFX0RJViwKKyAgICBBUk1fRkVBVFVSRV9NLCAvKiBNaWNyb2NvbnRyb2xsZXIgcHJvZmlsZS4gICovCisgICAgQVJNX0ZFQVRVUkVfT01BUENQLCAvKiBPTUFQIHNwZWNpZmljIENQMTUgb3BzIGhhbmRsaW5nLiAgKi8KKyAgICBBUk1fRkVBVFVSRV9USFVNQjJFRSwKKyAgICBBUk1fRkVBVFVSRV9WN01QLCAgICAvKiB2NyBNdWx0aXByb2Nlc3NpbmcgRXh0ZW5zaW9ucyAqLworICAgIEFSTV9GRUFUVVJFX1Y0VCwKKyAgICBBUk1fRkVBVFVSRV9WNSwKKyAgICBBUk1fRkVBVFVSRV9TVFJPTkdBUk0sCisgICAgQVJNX0ZFQVRVUkVfVkFQQSwgLyogY3AxNSBWQSB0byBQQSBsb29rdXBzICovCisgICAgQVJNX0ZFQVRVUkVfVFJVU1RaT05FLCAvKiBUcnVzdFpvbmUgU2VjdXJpdHkgRXh0ZW5zaW9ucy4gKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGFybV9mZWF0dXJlKENQVUFSTVN0YXRlICplbnYsIGludCBmZWF0dXJlKQoreworICAgIHJldHVybiAoZW52LT5mZWF0dXJlcyAmICgxVUxMIDw8IGZlYXR1cmUpKSAhPSAwOworfQorCit2b2lkIGFybV9jcHVfbGlzdChGSUxFICpmLCBmcHJpbnRmX2Z1bmN0aW9uIGNwdV9mcHJpbnRmKTsKKworLyogSW50ZXJmYWNlIGJldHdlZW4gQ1BVIGFuZCBJbnRlcnJ1cHQgY29udHJvbGxlci4gICovCit2b2lkIGFybXY3bV9udmljX3NldF9wZW5kaW5nKHZvaWQgKm9wYXF1ZSwgaW50IGlycSk7CitpbnQgYXJtdjdtX252aWNfYWNrbm93bGVkZ2VfaXJxKHZvaWQgKm9wYXF1ZSk7Cit2b2lkIGFybXY3bV9udmljX2NvbXBsZXRlX2lycSh2b2lkICpvcGFxdWUsIGludCBpcnEpOworCisvKiBJbnRlcmZhY2UgZm9yIGRlZmluaW5nIGNvcHJvY2Vzc29yIHJlZ2lzdGVycy4KKyAqIFJlZ2lzdGVycyBhcmUgZGVmaW5lZCBpbiB0YWJsZXMgb2YgYXJtX2NwX3JlZ2luZm8gc3RydWN0cworICogd2hpY2ggYXJlIHBhc3NlZCB0byBkZWZpbmVfYXJtX2NwX3JlZ3MoKS4KKyAqLworCisvKiBXaGVuIGxvb2tpbmcgdXAgYSBjb3Byb2Nlc3NvciByZWdpc3RlciB3ZSBsb29rIGZvciBpdAorICogdmlhIGFuIGludGVnZXIgd2hpY2ggZW5jb2RlcyBhbGwgb2Y6CisgKiAgY29wcm9jZXNzb3IgbnVtYmVyCisgKiAgQ3JuLCBDcm0sIG9wYzEsIG9wYzIgZmllbGRzCisgKiAgMzIgb3IgNjQgYml0IHJlZ2lzdGVyIChpZSBpcyBpdCBhY2Nlc3NlZCB2aWEgTVJDL01DUgorICogICAgb3IgdmlhIE1SUkMvTUNSUj8pCisgKiBXZSBhbGxvdyA0IGJpdHMgZm9yIG9wYzEgYmVjYXVzZSBNUlJDL01DUlIgaGF2ZSBhIDQgYml0IGZpZWxkLgorICogKEluIHRoaXMgY2FzZSBjcm4gYW5kIG9wYzIgc2hvdWxkIGJlIHplcm8uKQorICovCisjZGVmaW5lIEVOQ09ERV9DUF9SRUcoY3AsIGlzNjQsIGNybiwgY3JtLCBvcGMxLCBvcGMyKSAgIFwKKyAgICAoKChjcCkgPDwgMTYpIHwgKChpczY0KSA8PCAxNSkgfCAoKGNybikgPDwgMTEpIHwgICAgXAorICAgICAoKGNybSkgPDwgNykgfCAoKG9wYzEpIDw8IDMpIHwgKG9wYzIpKQorCisvKiBDb252ZXJ0IGEgZnVsbCA2NCBiaXQgS1ZNIHJlZ2lzdGVyIElEIHRvIHRoZSB0cnVuY2F0ZWQgMzIgYml0CisgKiB2ZXJzaW9uIHVzZWQgYXMgYSBrZXkgZm9yIHRoZSBjb3Byb2Nlc3NvciByZWdpc3RlciBoYXNodGFibGUKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBrdm1fdG9fY3ByZWdfaWQodWludDY0X3Qga3ZtaWQpCit7CisgICAgdWludDMyX3QgY3ByZWdpZCA9IGt2bWlkOworICAgIGlmICgoa3ZtaWQgJiBDUF9SRUdfU0laRV9NQVNLKSA9PSBDUF9SRUdfU0laRV9VNjQpIHsKKyAgICAgICAgY3ByZWdpZCB8PSAoMSA8PCAxNSk7CisgICAgfQorICAgIHJldHVybiBjcHJlZ2lkOworfQorCisvKiBDb252ZXJ0IGEgdHJ1bmNhdGVkIDMyIGJpdCBoYXNodGFibGUga2V5IGludG8gdGhlIGZ1bGwKKyAqIDY0IGJpdCBLVk0gcmVnaXN0ZXIgSUQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgY3ByZWdfdG9fa3ZtX2lkKHVpbnQzMl90IGNwcmVnaWQpCit7CisgICAgdWludDY0X3Qga3ZtaWQgPSBjcHJlZ2lkICYgfigxIDw8IDE1KTsKKyAgICBpZiAoY3ByZWdpZCAmICgxIDw8IDE1KSkgeworICAgICAgICBrdm1pZCB8PSBDUF9SRUdfU0laRV9VNjQgfCBDUF9SRUdfQVJNOworICAgIH0gZWxzZSB7CisgICAgICAgIGt2bWlkIHw9IENQX1JFR19TSVpFX1UzMiB8IENQX1JFR19BUk07CisgICAgfQorICAgIHJldHVybiBrdm1pZDsKK30KKworLyogQVJNQ1BSZWdJbmZvIHR5cGUgZmllbGQgYml0cy4gSWYgdGhlIFNQRUNJQUwgYml0IGlzIHNldCB0aGlzIGlzIGEKKyAqIHNwZWNpYWwtYmVoYXZpb3VyIGNwIHJlZyBhbmQgYml0cyBbMTUuLjhdIGluZGljYXRlIHdoYXQgYmVoYXZpb3VyCisgKiBpdCBoYXMuIE90aGVyd2lzZSBpdCBpcyBhIHNpbXBsZSBjcCByZWcsIHdoZXJlIENPTlNUIGluZGljYXRlcyB0aGF0CisgKiBUQ0cgY2FuIGFzc3VtZSB0aGUgdmFsdWUgdG8gYmUgY29uc3RhbnQgKGllIGxvYWQgYXQgdHJhbnNsYXRlIHRpbWUpCisgKiBhbmQgNjRCSVQgaW5kaWNhdGVzIGEgNjQgYml0IHdpZGUgY29wcm9jZXNzb3IgcmVnaXN0ZXIuIFNVUFBSRVNTX1RCX0VORAorICogaW5kaWNhdGVzIHRoYXQgdGhlIFRCIHNob3VsZCBub3QgYmUgZW5kZWQgYWZ0ZXIgYSB3cml0ZSB0byB0aGlzIHJlZ2lzdGVyCisgKiAodGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgVEIgZW5kcyBhZnRlciBjcCB3cml0ZXMpLiBPVkVSUklERSBwZXJtaXRzCisgKiBhIHJlZ2lzdGVyIGRlZmluaXRpb24gdG8gb3ZlcnJpZGUgYSBwcmV2aW91cyBkZWZpbml0aW9uIGZvciB0aGUKKyAqIHNhbWUgKGNwLCBpczY0LCBjcm4sIGNybSwgb3BjMSwgb3BjMikgdHVwbGU6IGVpdGhlciB0aGUgbmV3IG9yIHRoZQorICogb2xkIG11c3QgaGF2ZSB0aGUgT1ZFUlJJREUgYml0IHNldC4KKyAqIE5PX01JR1JBVEUgaW5kaWNhdGVzIHRoYXQgdGhpcyByZWdpc3RlciBzaG91bGQgYmUgaWdub3JlZCBmb3IgbWlncmF0aW9uOworICogKGVnIGJlY2F1c2UgYW55IHN0YXRlIGlzIGFjY2Vzc2VkIHZpYSBzb21lIG90aGVyIGNvcHJvY2Vzc29yIHJlZ2lzdGVyKS4KKyAqIElPIGluZGljYXRlcyB0aGF0IHRoaXMgcmVnaXN0ZXIgZG9lcyBJL08gYW5kIHRoZXJlZm9yZSBpdHMgYWNjZXNzZXMKKyAqIG5lZWQgdG8gYmUgc3Vycm91bmRlZCBieSBnZW5faW9fc3RhcnQoKS9nZW5faW9fZW5kKCkuIEluIHBhcnRpY3VsYXIsCisgKiByZWdpc3RlcnMgd2hpY2ggaW1wbGVtZW50IGNsb2NrcyBvciB0aW1lcnMgcmVxdWlyZSB0aGlzLgorICovCisjZGVmaW5lIEFSTV9DUF9TUEVDSUFMIDEKKyNkZWZpbmUgQVJNX0NQX0NPTlNUIDIKKyNkZWZpbmUgQVJNX0NQXzY0QklUIDQKKyNkZWZpbmUgQVJNX0NQX1NVUFBSRVNTX1RCX0VORCA4CisjZGVmaW5lIEFSTV9DUF9PVkVSUklERSAxNgorI2RlZmluZSBBUk1fQ1BfTk9fTUlHUkFURSAzMgorI2RlZmluZSBBUk1fQ1BfSU8gNjQKKyNkZWZpbmUgQVJNX0NQX05PUCAoQVJNX0NQX1NQRUNJQUwgfCAoMSA8PCA4KSkKKyNkZWZpbmUgQVJNX0NQX1dGSSAoQVJNX0NQX1NQRUNJQUwgfCAoMiA8PCA4KSkKKyNkZWZpbmUgQVJNX0xBU1RfU1BFQ0lBTCBBUk1fQ1BfV0ZJCisvKiBVc2VkIG9ubHkgYXMgYSB0ZXJtaW5hdG9yIGZvciBBUk1DUFJlZ0luZm8gbGlzdHMgKi8KKyNkZWZpbmUgQVJNX0NQX1NFTlRJTkVMIDB4ZmZmZgorLyogTWFzayBvZiBvbmx5IHRoZSBmbGFnIGJpdHMgaW4gYSB0eXBlIGZpZWxkICovCisjZGVmaW5lIEFSTV9DUF9GTEFHX01BU0sgMHg3ZgorCisvKiBSZXR1cm4gdHJ1ZSBpZiBjcHR5cGUgaXMgYSB2YWxpZCB0eXBlIGZpZWxkLiBUaGlzIGlzIHVzZWQgdG8gdHJ5IHRvCisgKiBjYXRjaCBlcnJvcnMgd2hlcmUgdGhlIHNlbnRpbmVsIGhhcyBiZWVuIGFjY2lkZW50YWxseSBsZWZ0IG9mZiB0aGUgZW5kCisgKiBvZiBhIGxpc3Qgb2YgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgY3B0eXBlX3ZhbGlkKGludCBjcHR5cGUpCit7CisgICAgcmV0dXJuICgoY3B0eXBlICYgfkFSTV9DUF9GTEFHX01BU0spID09IDApCisgICAgICAgIHx8ICgoY3B0eXBlICYgQVJNX0NQX1NQRUNJQUwpICYmCisgICAgICAgICAgICAoKGNwdHlwZSAmIH5BUk1fQ1BfRkxBR19NQVNLKSA8PSBBUk1fTEFTVF9TUEVDSUFMKSk7Cit9CisKKy8qIEFjY2VzcyByaWdodHM6CisgKiBXZSBkZWZpbmUgYml0cyBmb3IgUmVhZCBhbmQgV3JpdGUgYWNjZXNzIGZvciB3aGF0IHJldiBDIG9mIHRoZSB2Ny1BUiBBUk0gQVJNCisgKiBkZWZpbmVzIGFzIFBMMCAodXNlciksIFBMMSAoZmlxL2lycS9zdmMvYWJ0L3VuZC9zeXMsIGllIHByaXZpbGVnZWQpLCBhbmQKKyAqIFBMMiAoaHlwKS4gVGhlIG90aGVyIGxldmVsIHdoaWNoIGhhcyBSZWFkIGFuZCBXcml0ZSBiaXRzIGlzIFNlY3VyZSBQTDEKKyAqIChpZSBhbnkgb2YgdGhlIHByaXZpbGVnZWQgbW9kZXMgaW4gU2VjdXJlIHN0YXRlLCBvciBNb25pdG9yIG1vZGUpLgorICogSWYgYSByZWdpc3RlciBpcyBhY2Nlc3NpYmxlIGluIG9uZSBwcml2aWxlZ2UgbGV2ZWwgaXQncyBhbHdheXMgYWNjZXNzaWJsZQorICogaW4gaGlnaGVyIHByaXZpbGVnZSBsZXZlbHMgdG9vLiBTaW5jZSAiU2VjdXJlIFBMMSIgYWxzbyBmb2xsb3dzIHRoaXMgcnVsZQorICogKGllIGFueXRoaW5nIHZpc2libGUgaW4gUEwyIGlzIHZpc2libGUgaW4gUy1QTDEsIHNvbWUgdGhpbmdzIGFyZSBvbmx5CisgKiB2aXNpYmxlIGluIFMtUEwxKSBidXQgIlNlY3VyZSBQTDEiIGlzIGEgYml0IG9mIGEgbW91dGhmdWwsIHdlIGJlbmQgdGhlCisgKiB0ZXJtaW5vbG9neSBhIGxpdHRsZSBhbmQgY2FsbCB0aGlzIFBMMy4KKyAqCisgKiBJZiBhY2Nlc3MgcGVybWlzc2lvbnMgZm9yIGEgcmVnaXN0ZXIgYXJlIG1vcmUgY29tcGxleCB0aGFuIGNhbiBiZQorICogZGVzY3JpYmVkIHdpdGggdGhlc2UgYml0cywgdGhlbiB1c2UgYSBsYXhlciBzZXQgb2YgcmVzdHJpY3Rpb25zLCBhbmQKKyAqIGRvIHRoZSBtb3JlIHJlc3RyaWN0aXZlL2NvbXBsZXggY2hlY2sgaW5zaWRlIGEgaGVscGVyIGZ1bmN0aW9uLgorICovCisjZGVmaW5lIFBMM19SIDB4ODAKKyNkZWZpbmUgUEwzX1cgMHg0MAorI2RlZmluZSBQTDJfUiAoMHgyMCB8IFBMM19SKQorI2RlZmluZSBQTDJfVyAoMHgxMCB8IFBMM19XKQorI2RlZmluZSBQTDFfUiAoMHgwOCB8IFBMMl9SKQorI2RlZmluZSBQTDFfVyAoMHgwNCB8IFBMMl9XKQorI2RlZmluZSBQTDBfUiAoMHgwMiB8IFBMMV9SKQorI2RlZmluZSBQTDBfVyAoMHgwMSB8IFBMMV9XKQorCisjZGVmaW5lIFBMM19SVyAoUEwzX1IgfCBQTDNfVykKKyNkZWZpbmUgUEwyX1JXIChQTDJfUiB8IFBMMl9XKQorI2RlZmluZSBQTDFfUlcgKFBMMV9SIHwgUEwxX1cpCisjZGVmaW5lIFBMMF9SVyAoUEwwX1IgfCBQTDBfVykKKworc3RhdGljIGlubGluZSBpbnQgYXJtX2N1cnJlbnRfcGwoQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICBpZiAoKGVudi0+dW5jYWNoZWRfY3BzciAmIDB4MWYpID09IEFSTV9DUFVfTU9ERV9VU1IpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIFdlIGRvbid0IGN1cnJlbnRseSBpbXBsZW1lbnQgdGhlIFZpcnR1YWxpemF0aW9uIG9yIFRydXN0Wm9uZQorICAgICAqIGV4dGVuc2lvbnMsIHNvIFBMMiBhbmQgUEwzIGRvbid0IGV4aXN0IGZvciB1cy4KKyAgICAgKi8KKyAgICByZXR1cm4gMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgQVJNQ1BSZWdJbmZvIEFSTUNQUmVnSW5mbzsKKworLyogQWNjZXNzIGZ1bmN0aW9ucyBmb3IgY29wcm9jZXNzb3IgcmVnaXN0ZXJzLiBUaGVzZSBzaG91bGQgcmV0dXJuCisgKiAwIG9uIHN1Y2Nlc3MsIG9yIG9uZSBvZiB0aGUgRVhDUF8qIGNvbnN0YW50cyBpZiBhY2Nlc3Mgc2hvdWxkIGNhdXNlCisgKiBhbiBleGNlcHRpb24gKGluIHdoaWNoIGNhc2UgKnZhbHVlIGlzIG5vdCB3cml0dGVuKS4KKyAqLwordHlwZWRlZiBpbnQgQ1BSZWFkRm4oQ1BVQVJNU3RhdGUgKmVudiwgY29uc3QgQVJNQ1BSZWdJbmZvICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqdmFsdWUpOwordHlwZWRlZiBpbnQgQ1BXcml0ZUZuKENQVUFSTVN0YXRlICplbnYsIGNvbnN0IEFSTUNQUmVnSW5mbyAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlKTsKKy8qIEhvb2sgZnVuY3Rpb24gZm9yIHJlZ2lzdGVyIHJlc2V0ICovCit0eXBlZGVmIHZvaWQgQ1BSZXNldEZuKENQVUFSTVN0YXRlICplbnYsIGNvbnN0IEFSTUNQUmVnSW5mbyAqb3BhcXVlKTsKKworI2RlZmluZSBDUF9BTlkgMHhmZgorCisvKiBEZWZpbml0aW9uIG9mIGFuIEFSTSBjb3Byb2Nlc3NvciByZWdpc3RlciAqLworc3RydWN0IEFSTUNQUmVnSW5mbyB7CisgICAgLyogTmFtZSBvZiByZWdpc3RlciAodXNlZnVsIG1haW5seSBmb3IgZGVidWdnaW5nLCBuZWVkIG5vdCBiZSB1bmlxdWUpICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAvKiBMb2NhdGlvbiBvZiByZWdpc3RlcjogY29wcm9jZXNzb3IgbnVtYmVyIGFuZCAoY3JuLGNybSxvcGMxLG9wYzIpCisgICAgICogdHVwbGUuIEFueSBvZiBjcm0sIG9wYzEgYW5kIG9wYzIgbWF5IGJlIENQX0FOWSB0byBpbmRpY2F0ZSBhCisgICAgICogJ3dpbGRjYXJkJyBmaWVsZCAtLSBhbnkgdmFsdWUgb2YgdGhhdCBmaWVsZCBpbiB0aGUgTVJDL01DUiBpbnNuCisgICAgICogd2lsbCBiZSBkZWNvZGVkIHRvIHRoaXMgcmVnaXN0ZXIuIFRoZSByZWdpc3RlciByZWFkIGFuZCB3cml0ZQorICAgICAqIGNhbGxiYWNrcyB3aWxsIGJlIHBhc3NlZCBhbiBBUk1DUFJlZ0luZm8gd2l0aCB0aGUgY3JuL2NybS9vcGMxL29wYzIKKyAgICAgKiB1c2VkIGJ5IHRoZSBwcm9ncmFtLCBzbyBpdCBpcyBwb3NzaWJsZSB0byByZWdpc3RlciBhIHdpbGRjYXJkIGFuZAorICAgICAqIHRoZW4gYmVoYXZlIGRpZmZlcmVudGx5IG9uIHJlYWQvd3JpdGUgaWYgbmVjZXNzYXJ5LgorICAgICAqIEZvciA2NCBiaXQgcmVnaXN0ZXJzLCBvbmx5IGNybSBhbmQgb3BjMSBhcmUgcmVsZXZhbnQ7IGNybiBhbmQgb3BjMgorICAgICAqIG11c3QgYm90aCBiZSB6ZXJvLgorICAgICAqLworICAgIHVpbnQ4X3QgY3A7CisgICAgdWludDhfdCBjcm47CisgICAgdWludDhfdCBjcm07CisgICAgdWludDhfdCBvcGMxOworICAgIHVpbnQ4X3Qgb3BjMjsKKyAgICAvKiBSZWdpc3RlciB0eXBlOiBBUk1fQ1BfKiBiaXRzL3ZhbHVlcyAqLworICAgIGludCB0eXBlOworICAgIC8qIEFjY2VzcyByaWdodHM6IFBMKl9bUlddICovCisgICAgaW50IGFjY2VzczsKKyAgICAvKiBUaGUgb3BhcXVlIHBvaW50ZXIgcGFzc2VkIHRvIGRlZmluZV9hcm1fY3BfcmVnc193aXRoX29wYXF1ZSgpIHdoZW4KKyAgICAgKiB0aGlzIHJlZ2lzdGVyIHdhcyBkZWZpbmVkOiBjYW4gYmUgdXNlZCB0byBoYW5kIGRhdGEgdGhyb3VnaCB0byB0aGUKKyAgICAgKiByZWdpc3RlciByZWFkL3dyaXRlIGZ1bmN0aW9ucywgc2luY2UgdGhleSBhcmUgcGFzc2VkIHRoZSBBUk1DUFJlZ0luZm8qLgorICAgICAqLworICAgIHZvaWQgKm9wYXF1ZTsKKyAgICAvKiBWYWx1ZSBvZiB0aGlzIHJlZ2lzdGVyLCBpZiBpdCBpcyBBUk1fQ1BfQ09OU1QuIE90aGVyd2lzZSwgaWYKKyAgICAgKiBmaWVsZG9mZnNldCBpcyBub24temVybywgdGhlIHJlc2V0IHZhbHVlIG9mIHRoZSByZWdpc3Rlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCByZXNldHZhbHVlOworICAgIC8qIE9mZnNldCBvZiB0aGUgZmllbGQgaW4gQ1BVQVJNU3RhdGUgZm9yIHRoaXMgcmVnaXN0ZXIuIFRoaXMgaXMgbm90CisgICAgICogbmVlZGVkIGlmIGVpdGhlcjoKKyAgICAgKiAgMS4gdHlwZSBpcyBBUk1fQ1BfQ09OU1Qgb3Igb25lIG9mIHRoZSBBUk1fQ1BfU1BFQ0lBTHMKKyAgICAgKiAgMi4gYm90aCByZWFkZm4gYW5kIHdyaXRlZm4gYXJlIHNwZWNpZmllZAorICAgICAqLworICAgIHB0cmRpZmZfdCBmaWVsZG9mZnNldDsgLyogb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIGZpZWxkKSAqLworICAgIC8qIEZ1bmN0aW9uIGZvciBoYW5kbGluZyByZWFkcyBvZiB0aGlzIHJlZ2lzdGVyLiBJZiBOVUxMLCB0aGVuIHJlYWRzCisgICAgICogd2lsbCBiZSBkb25lIGJ5IGxvYWRpbmcgZnJvbSB0aGUgb2Zmc2V0IGludG8gQ1BVQVJNU3RhdGUgc3BlY2lmaWVkCisgICAgICogYnkgZmllbGRvZmZzZXQuCisgICAgICovCisgICAgQ1BSZWFkRm4gKnJlYWRmbjsKKyAgICAvKiBGdW5jdGlvbiBmb3IgaGFuZGxpbmcgd3JpdGVzIG9mIHRoaXMgcmVnaXN0ZXIuIElmIE5VTEwsIHRoZW4gd3JpdGVzCisgICAgICogd2lsbCBiZSBkb25lIGJ5IHdyaXRpbmcgdG8gdGhlIG9mZnNldCBpbnRvIENQVUFSTVN0YXRlIHNwZWNpZmllZAorICAgICAqIGJ5IGZpZWxkb2Zmc2V0LgorICAgICAqLworICAgIENQV3JpdGVGbiAqd3JpdGVmbjsKKyAgICAvKiBGdW5jdGlvbiBmb3IgZG9pbmcgYSAicmF3IiByZWFkOyB1c2VkIHdoZW4gd2UgbmVlZCB0byBjb3B5CisgICAgICogY29wcm9jZXNzb3Igc3RhdGUgdG8gdGhlIGtlcm5lbCBmb3IgS1ZNIG9yIG91dCBmb3IKKyAgICAgKiBtaWdyYXRpb24uIFRoaXMgb25seSBuZWVkcyB0byBiZSBwcm92aWRlZCBpZiB0aGVyZSBpcyBhbHNvIGEKKyAgICAgKiByZWFkZm4gYW5kIGl0IG1ha2VzIGFuIGFjY2VzcyBwZXJtaXNzaW9uIGNoZWNrLgorICAgICAqLworICAgIENQUmVhZEZuICpyYXdfcmVhZGZuOworICAgIC8qIEZ1bmN0aW9uIGZvciBkb2luZyBhICJyYXciIHdyaXRlOyB1c2VkIHdoZW4gd2UgbmVlZCB0byBjb3B5IEtWTQorICAgICAqIGtlcm5lbCBjb3Byb2Nlc3NvciBzdGF0ZSBpbnRvIHVzZXJzcGFjZSwgb3IgZm9yIGluYm91bmQKKyAgICAgKiBtaWdyYXRpb24uIFRoaXMgb25seSBuZWVkcyB0byBiZSBwcm92aWRlZCBpZiB0aGVyZSBpcyBhbHNvIGEKKyAgICAgKiB3cml0ZWZuIGFuZCBpdCBtYWtlcyBhbiBhY2Nlc3MgcGVybWlzc2lvbiBjaGVjayBvciBtYXNrcyBvdXQKKyAgICAgKiAidW53cml0YWJsZSIgYml0cyBvciBoYXMgd3JpdGUtb25lLXRvLWNsZWFyIG9yIHNpbWlsYXIgYmVoYXZpb3VyLgorICAgICAqLworICAgIENQV3JpdGVGbiAqcmF3X3dyaXRlZm47CisgICAgLyogRnVuY3Rpb24gZm9yIHJlc2V0dGluZyB0aGUgcmVnaXN0ZXIuIElmIE5VTEwsIHRoZW4gcmVzZXQgd2lsbCBiZSBkb25lCisgICAgICogYnkgd3JpdGluZyByZXNldHZhbHVlIHRvIHRoZSBmaWVsZCBzcGVjaWZpZWQgaW4gZmllbGRvZmZzZXQuIElmCisgICAgICogZmllbGRvZmZzZXQgaXMgMCB0aGVuIG5vIHJlc2V0IHdpbGwgYmUgZG9uZS4KKyAgICAgKi8KKyAgICBDUFJlc2V0Rm4gKnJlc2V0Zm47Cit9OworCisvKiBNYWNyb3Mgd2hpY2ggYXJlIGx2YWx1ZXMgZm9yIHRoZSBmaWVsZCBpbiBDUFVBUk1TdGF0ZSBmb3IgdGhlCisgKiBBUk1DUFJlZ0luZm8gKnJpLgorICovCisjZGVmaW5lIENQUkVHX0ZJRUxEMzIoZW52LCByaSkgXAorICAgICgqKHVpbnQzMl90ICopKChjaGFyICopKGVudikgKyAocmkpLT5maWVsZG9mZnNldCkpCisjZGVmaW5lIENQUkVHX0ZJRUxENjQoZW52LCByaSkgXAorICAgICgqKHVpbnQ2NF90ICopKChjaGFyICopKGVudikgKyAocmkpLT5maWVsZG9mZnNldCkpCisKKyNkZWZpbmUgUkVHSU5GT19TRU5USU5FTCB7IC50eXBlID0gQVJNX0NQX1NFTlRJTkVMIH0KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLy8gVE9ETyhkaWdpdCk6IEltcGxlbWVudCBBUk1DUFUKK3ZvaWQgZGVmaW5lX2FybV9jcF9yZWdzX3dpdGhfb3BhcXVlKEFSTUNQVSAqY3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVJNQ1BSZWdJbmZvICpyZWdzLCB2b2lkICpvcGFxdWUpOwordm9pZCBkZWZpbmVfb25lX2FybV9jcF9yZWdfd2l0aF9vcGFxdWUoQVJNQ1BVICpjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1DUFJlZ0luZm8gKnJlZ3MsIHZvaWQgKm9wYXF1ZSk7CitzdGF0aWMgaW5saW5lIHZvaWQgZGVmaW5lX2FybV9jcF9yZWdzKEFSTUNQVSAqY3B1LCBjb25zdCBBUk1DUFJlZ0luZm8gKnJlZ3MpCit7CisgICAgZGVmaW5lX2FybV9jcF9yZWdzX3dpdGhfb3BhcXVlKGNwdSwgcmVncywgMCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZGVmaW5lX29uZV9hcm1fY3BfcmVnKEFSTUNQVSAqY3B1LCBjb25zdCBBUk1DUFJlZ0luZm8gKnJlZ3MpCit7CisgICAgZGVmaW5lX29uZV9hcm1fY3BfcmVnX3dpdGhfb3BhcXVlKGNwdSwgcmVncywgMCk7Cit9Citjb25zdCBBUk1DUFJlZ0luZm8gKmdldF9hcm1fY3BfcmVnaW5mbyhBUk1DUFUgKmNwdSwgdWludDMyX3QgZW5jb2RlZF9jcCk7CisjZW5kaWYgIC8vICFDT05GSUdfQU5EUk9JRAorCisvKiBDUFdyaXRlRm4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgd3JpdGVzLWlnbm9yZWQgYmVoYXZpb3VyICovCitpbnQgYXJtX2NwX3dyaXRlX2lnbm9yZShDUFVBUk1TdGF0ZSAqZW52LCBjb25zdCBBUk1DUFJlZ0luZm8gKnJpLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpOworLyogQ1BSZWFkRm4gdGhhdCBjYW4gYmUgdXNlZCBmb3IgcmVhZC1hcy16ZXJvIGJlaGF2aW91ciAqLworaW50IGFybV9jcF9yZWFkX3plcm8oQ1BVQVJNU3RhdGUgKmVudiwgY29uc3QgQVJNQ1BSZWdJbmZvICpyaSwgdWludDY0X3QgKnZhbHVlKTsKKworc3RhdGljIGlubGluZSBib29sIGNwX2FjY2Vzc19vayhDUFVBUk1TdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUk1DUFJlZ0luZm8gKnJpLCBpbnQgaXNyZWFkKQoreworICAgIHJldHVybiAocmktPmFjY2VzcyA+PiAoKGFybV9jdXJyZW50X3BsKGVudikgKiAyKSArIGlzcmVhZCkpICYgMTsKK30KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLy8gVE9ETyhkaWdpdCk6IEltcGxlbWVudCBBUk1DUFUKKy8qKgorICogd3JpdGVfbGlzdF90b19jcHVzdGF0ZQorICogQGNwdTogQVJNQ1BVCisgKgorICogRm9yIGVhY2ggcmVnaXN0ZXIgbGlzdGVkIGluIHRoZSBBUk1DUFUgY3ByZWdfaW5kZXhlcyBsaXN0LCB3cml0ZQorICogaXRzIHZhbHVlIGZyb20gdGhlIGNwcmVnX3ZhbHVlcyBsaXN0IGludG8gdGhlIEFSTUNQVUFSTVN0YXRlIHN0cnVjdHVyZS4KKyAqIFRoaXMgdXBkYXRlcyBUQ0cncyB3b3JraW5nIGRhdGEgc3RydWN0dXJlcyBmcm9tIEtWTSBkYXRhIG9yCisgKiBmcm9tIGluY29taW5nIG1pZ3JhdGlvbiBzdGF0ZS4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIGFsbCByZWdpc3RlciB2YWx1ZXMgd2VyZSB1cGRhdGVkIGNvcnJlY3RseSwKKyAqIGZhbHNlIGlmIHNvbWUgcmVnaXN0ZXIgd2FzIHVua25vd24gb3IgY291bGQgbm90IGJlIHdyaXR0ZW4uCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN0b3AgZWFybHkgb24gZmFpbHVyZSAtLSB3ZSB3aWxsIGF0dGVtcHQKKyAqIHdyaXRpbmcgYWxsIHJlZ2lzdGVycyBpbiB0aGUgbGlzdC4KKyAqLworYm9vbCB3cml0ZV9saXN0X3RvX2NwdXN0YXRlKEFSTUNQVSAqY3B1KTsKKworLyoqCisgKiB3cml0ZV9jcHVzdGF0ZV90b19saXN0OgorICogQGNwdTogQVJNQ1BVCisgKgorICogRm9yIGVhY2ggcmVnaXN0ZXIgbGlzdGVkIGluIHRoZSBBUk1DUFUgY3ByZWdfaW5kZXhlcyBsaXN0LCB3cml0ZQorICogaXRzIHZhbHVlIGZyb20gdGhlIEFSTUNQVUFSTVN0YXRlIHN0cnVjdHVyZSBpbnRvIHRoZSBjcHJlZ192YWx1ZXMgbGlzdC4KKyAqIFRoaXMgaXMgdXNlZCB0byBjb3B5IGluZm8gZnJvbSBUQ0cncyB3b3JraW5nIGRhdGEgc3RydWN0dXJlcyBpbnRvCisgKiBLVk0gb3IgZm9yIG91dGJvdW5kIG1pZ3JhdGlvbi4KKyAqCisgKiBSZXR1cm5zOiB0cnVlIGlmIGFsbCByZWdpc3RlciB2YWx1ZXMgd2VyZSByZWFkIGNvcnJlY3RseSwKKyAqIGZhbHNlIGlmIHNvbWUgcmVnaXN0ZXIgd2FzIHVua25vd24gb3IgY291bGQgbm90IGJlIHJlYWQuCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN0b3AgZWFybHkgb24gZmFpbHVyZSAtLSB3ZSB3aWxsIGF0dGVtcHQKKyAqIHJlYWRpbmcgYWxsIHJlZ2lzdGVycyBpbiB0aGUgbGlzdC4KKyAqLworYm9vbCB3cml0ZV9jcHVzdGF0ZV90b19saXN0KEFSTUNQVSAqY3B1KTsKKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKK3ZvaWQgY3B1X2FybV9zZXRfY3BfaW8oQ1BVQVJNU3RhdGUgKmVudiwgaW50IGNwbnVtLAorICAgICAgICAgICAgICAgICAgICAgICBBUk1SZWFkQ1BGdW5jICpjcF9yZWFkLCBBUk1Xcml0ZUNQRnVuYyAqY3Bfd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSk7CisKKy8qIERvZXMgdGhlIGNvcmUgY29uZm9ybSB0byB0aGUgdGhlICJNaWNyb0NvbnRyb2xsZXIiIHByb2ZpbGUuIGUuZy4gQ29ydGV4LU0zLgorICAgTm90ZSB0aGUgTSBpbiBvbGRlciBjb3JlcyAoZWcuIEFSTTdURE1JKSBzdGFuZHMgZm9yIE11bHRpcGx5LiBUaGVzZSBhcmUKKyAgIGNvbnZlbnRpb25hbCBjb3JlcyAoaWUuIEFwcGxpY2F0aW9uIG9yIFJlYWx0aW1lIHByb2ZpbGUpLiAgKi8KKworI2RlZmluZSBJU19NKGVudikgYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NKQorI2RlZmluZSBBUk1fQ1BVSUQoZW52KSAoZW52LT5jcDE1LmMwX2NwdWlkKQorCisjZGVmaW5lIEFSTV9DUFVJRF9BUk0xMDI2ICAgICAweDQxMDZhMjYyCisjZGVmaW5lIEFSTV9DUFVJRF9BUk05MjYgICAgICAweDQxMDY5MjY1CisjZGVmaW5lIEFSTV9DUFVJRF9BUk05NDYgICAgICAweDQxMDU5NDYxCisjZGVmaW5lIEFSTV9DUFVJRF9USTkxNVQgICAgICAweDU0MDI5MTUyCisjZGVmaW5lIEFSTV9DUFVJRF9USTkyNVQgICAgICAweDU0MDI5MjUyCisjZGVmaW5lIEFSTV9DUFVJRF9TQTExMDAgICAgICAweDQ0MDFBMTFCCisjZGVmaW5lIEFSTV9DUFVJRF9TQTExMTAgICAgICAweDY5MDFCMTE5CisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNTAgICAgICAweDY5MDUyMTAwCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNTUgICAgICAweDY5MDUyZDAwCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNjAgICAgICAweDY5MDUyOTAzCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNjEgICAgICAweDY5MDUyZDA1CisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNjIgICAgICAweDY5MDUyZDA2CisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzAgICAgICAweDY5MDU0MTEwCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQTAgICAweDY5MDU0MTEwCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQTEgICAweDY5MDU0MTExCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQjAgICAweDY5MDU0MTEyCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQjEgICAweDY5MDU0MTEzCisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQzAgICAweDY5MDU0MTE0CisjZGVmaW5lIEFSTV9DUFVJRF9QWEEyNzBfQzUgICAweDY5MDU0MTE3CisjZGVmaW5lIEFSTV9DUFVJRF9BUk0xMTM2ICAgICAweDQxMTdiMzYzCisjZGVmaW5lIEFSTV9DUFVJRF9BUk0xMTM2X1IyICAweDQxMDdiMzYyCisjZGVmaW5lIEFSTV9DUFVJRF9BUk0xMTc2ICAgICAweDQxMGZiNzY3CisjZGVmaW5lIEFSTV9DUFVJRF9BUk0xMU1QQ09SRSAweDQxMGZiMDIyCisjZGVmaW5lIEFSTV9DUFVJRF9DT1JURVhBOCAgICAweDQxMGZjMDgwCisjZGVmaW5lIEFSTV9DUFVJRF9DT1JURVhBOF9SMiAweDQxMmZjMDgzCisjZGVmaW5lIEFSTV9DUFVJRF9DT1JURVhBOSAgICAweDQxMGZjMDkwCisjZGVmaW5lIEFSTV9DUFVJRF9DT1JURVhNMyAgICAweDQxMGZjMjMxCisjZGVmaW5lIEFSTV9DUFVJRF9BTlkgICAgICAgICAweGZmZmZmZmZmCisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjZGVmaW5lIFRBUkdFVF9QQUdFX0JJVFMgMTIKKyNlbHNlCisvKiBUaGUgQVJNIE1NVSBhbGxvd3MgMWsgcGFnZXMuICAqLworLyogPz8/IExpbnV4IGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoZXNlLCBhbmQgdGhleSdyZSBkZXByZWNhdGVkIGluIHJlY2VudAorICAgYXJjaGl0ZWN0dXJlIHJldmlzaW9ucy4gIE1heWJlIGEgY29uZmlndXJlIG9wdGlvbiB0byBkaXNhYmxlIHRoZW0uICAqLworI2RlZmluZSBUQVJHRVRfUEFHRV9CSVRTIDEwCisjZW5kaWYKKworI2lmIGRlZmluZWQoVEFSR0VUX0FBUkNINjQpCisjICBkZWZpbmUgVEFSR0VUX1BIWVNfQUREUl9TUEFDRV9CSVRTIDQ4CisjICBkZWZpbmUgVEFSR0VUX1ZJUlRfQUREUl9TUEFDRV9CSVRTIDY0CisjZWxzZQorIyAgZGVmaW5lIFRBUkdFVF9QSFlTX0FERFJfU1BBQ0VfQklUUyA0MAorIyAgZGVmaW5lIFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUyAzMgorI2VuZGlmCisKKyNkZWZpbmUgY3B1X2luaXQgY3B1X2FybV9pbml0CisjZGVmaW5lIGNwdV9leGVjIGNwdV9hcm1fZXhlYworI2RlZmluZSBjcHVfZ2VuX2NvZGUgY3B1X2FybV9nZW5fY29kZQorI2RlZmluZSBjcHVfc2lnbmFsX2hhbmRsZXIgY3B1X2FybV9zaWduYWxfaGFuZGxlcgorI2RlZmluZSBjcHVfbGlzdCBhcm1fY3B1X2xpc3QKKworI2RlZmluZSBDUFVfU0FWRV9WRVJTSU9OIDQKKworLyogTU1VIG1vZGVzIGRlZmluaXRpb25zICovCisjZGVmaW5lIE1NVV9NT0RFMF9TVUZGSVggX2tlcm5lbAorI2RlZmluZSBNTVVfTU9ERTFfU1VGRklYIF91c2VyCisjZGVmaW5lIE1NVV9VU0VSX0lEWCAxCitzdGF0aWMgaW5saW5lIGludCBjcHVfbW11X2luZGV4IChDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHJldHVybiAoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NKSA9PSBBUk1fQ1BVX01PREVfVVNSID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2NwdV91c2VyIChDUFVBUk1TdGF0ZSAqZW52KQoreworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICByZXR1cm4gMTsKKyNlbHNlCisgICAgcmV0dXJuIChlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX00pID09IEFSTV9DUFVfTU9ERV9VU1I7CisjZW5kaWYgIC8vIENPTkZJR19VU0VSX09OTFkKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfY2xvbmVfcmVncyhDUFVBUk1TdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgbmV3c3ApCit7CisgICAgaWYgKG5ld3NwKQorICAgICAgICBlbnYtPnJlZ3NbMTNdID0gbmV3c3A7CisgICAgZW52LT5yZWdzWzBdID0gMDsKK30KKyNlbmRpZgorCisjaW5jbHVkZSAiZXhlYy9jcHUtYWxsLmgiCisKKy8qIEJpdCB1c2FnZSBpbiB0aGUgVEIgZmxhZ3MgZmllbGQ6IGJpdCAzMSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBhcmUKKyAqIGluIDMyIG9yIDY0IGJpdCBtb2RlLiBUaGUgbWVhbmluZyBvZiB0aGUgb3RoZXIgYml0cyBkZXBlbmRzIG9uIHRoYXQuCisgKi8KKyNkZWZpbmUgQVJNX1RCRkxBR19BQVJDSDY0X1NUQVRFX1NISUZUIDMxCisjZGVmaW5lIEFSTV9UQkZMQUdfQUFSQ0g2NF9TVEFURV9NQVNLICAoMVUgPDwgQVJNX1RCRkxBR19BQVJDSDY0X1NUQVRFX1NISUZUKQorCisvKiBCaXQgdXNhZ2Ugd2hlbiBpbiBBQXJjaDMyIHN0YXRlOiAqLworI2RlZmluZSBBUk1fVEJGTEFHX1RIVU1CX1NISUZUICAgICAgMAorI2RlZmluZSBBUk1fVEJGTEFHX1RIVU1CX01BU0sgICAgICAgKDEgPDwgQVJNX1RCRkxBR19USFVNQl9TSElGVCkKKyNkZWZpbmUgQVJNX1RCRkxBR19WRUNMRU5fU0hJRlQgICAgIDEKKyNkZWZpbmUgQVJNX1RCRkxBR19WRUNMRU5fTUFTSyAgICAgICgweDcgPDwgQVJNX1RCRkxBR19WRUNMRU5fU0hJRlQpCisjZGVmaW5lIEFSTV9UQkZMQUdfVkVDU1RSSURFX1NISUZUICA0CisjZGVmaW5lIEFSTV9UQkZMQUdfVkVDU1RSSURFX01BU0sgICAoMHgzIDw8IEFSTV9UQkZMQUdfVkVDU1RSSURFX1NISUZUKQorI2RlZmluZSBBUk1fVEJGTEFHX1BSSVZfU0hJRlQgICAgICAgNgorI2RlZmluZSBBUk1fVEJGTEFHX1BSSVZfTUFTSyAgICAgICAgKDEgPDwgQVJNX1RCRkxBR19QUklWX1NISUZUKQorI2RlZmluZSBBUk1fVEJGTEFHX1ZGUEVOX1NISUZUICAgICAgNworI2RlZmluZSBBUk1fVEJGTEFHX1ZGUEVOX01BU0sgICAgICAgKDEgPDwgQVJNX1RCRkxBR19WRlBFTl9TSElGVCkKKyNkZWZpbmUgQVJNX1RCRkxBR19DT05ERVhFQ19TSElGVCAgIDgKKyNkZWZpbmUgQVJNX1RCRkxBR19DT05ERVhFQ19NQVNLICAgICgweGZmIDw8IEFSTV9UQkZMQUdfQ09OREVYRUNfU0hJRlQpCisjZGVmaW5lIEFSTV9UQkZMQUdfQlNXQVBfQ09ERV9TSElGVCAxNgorI2RlZmluZSBBUk1fVEJGTEFHX0JTV0FQX0NPREVfTUFTSyAgKDEgPDwgQVJNX1RCRkxBR19CU1dBUF9DT0RFX1NISUZUKQorCisvKiBCaXQgdXNhZ2Ugd2hlbiBpbiBBQXJjaDY0IHN0YXRlOiBjdXJyZW50bHkgbm8gYml0cyBkZWZpbmVkICovCisKKy8qIHNvbWUgY29udmVuaWVuY2UgYWNjZXNzb3IgbWFjcm9zICovCisjZGVmaW5lIEFSTV9UQkZMQUdfQUFSQ0g2NF9TVEFURShGKSBcCisgICAgKCgoRikgJiBBUk1fVEJGTEFHX0FBUkNINjRfU1RBVEVfTUFTSykgPj4gQVJNX1RCRkxBR19BQVJDSDY0X1NUQVRFX1NISUZUKQorI2RlZmluZSBBUk1fVEJGTEFHX1RIVU1CKEYpIFwKKyAgICAoKChGKSAmIEFSTV9UQkZMQUdfVEhVTUJfTUFTSykgPj4gQVJNX1RCRkxBR19USFVNQl9TSElGVCkKKyNkZWZpbmUgQVJNX1RCRkxBR19WRUNMRU4oRikgXAorICAgICgoKEYpICYgQVJNX1RCRkxBR19WRUNMRU5fTUFTSykgPj4gQVJNX1RCRkxBR19WRUNMRU5fU0hJRlQpCisjZGVmaW5lIEFSTV9UQkZMQUdfVkVDU1RSSURFKEYpIFwKKyAgICAoKChGKSAmIEFSTV9UQkZMQUdfVkVDU1RSSURFX01BU0spID4+IEFSTV9UQkZMQUdfVkVDU1RSSURFX1NISUZUKQorI2RlZmluZSBBUk1fVEJGTEFHX1BSSVYoRikgXAorICAgICgoKEYpICYgQVJNX1RCRkxBR19QUklWX01BU0spID4+IEFSTV9UQkZMQUdfUFJJVl9TSElGVCkKKyNkZWZpbmUgQVJNX1RCRkxBR19WRlBFTihGKSBcCisgICAgKCgoRikgJiBBUk1fVEJGTEFHX1ZGUEVOX01BU0spID4+IEFSTV9UQkZMQUdfVkZQRU5fU0hJRlQpCisjZGVmaW5lIEFSTV9UQkZMQUdfQ09OREVYRUMoRikgXAorICAgICgoKEYpICYgQVJNX1RCRkxBR19DT05ERVhFQ19NQVNLKSA+PiBBUk1fVEJGTEFHX0NPTkRFWEVDX1NISUZUKQorI2RlZmluZSBBUk1fVEJGTEFHX0JTV0FQX0NPREUoRikgXAorICAgICgoKEYpICYgQVJNX1RCRkxBR19CU1dBUF9DT0RFX01BU0spID4+IEFSTV9UQkZMQUdfQlNXQVBfQ09ERV9TSElGVCkKKworc3RhdGljIGlubGluZSB2b2lkIGNwdV9nZXRfdGJfY3B1X3N0YXRlKENQVUFSTVN0YXRlICplbnYsIHRhcmdldF91bG9uZyAqcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nICpjc19iYXNlLCBpbnQgKmZsYWdzKQoreworICAgIGlmIChpc19hNjQoZW52KSkgeworICAgICAgICAqcGMgPSBlbnYtPnJlZ3NbMTVdOworICAgICAgICAqZmxhZ3MgPSBBUk1fVEJGTEFHX0FBUkNINjRfU1RBVEVfTUFTSzsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJpdm1vZGU7CisgICAgICAgICpwYyA9IGVudi0+cmVnc1sxNV07CisgICAgICAgICpmbGFncyA9IChlbnYtPnRodW1iIDw8IEFSTV9UQkZMQUdfVEhVTUJfU0hJRlQpCisgICAgICAgICAgICB8IChlbnYtPnZmcC52ZWNfbGVuIDw8IEFSTV9UQkZMQUdfVkVDTEVOX1NISUZUKQorICAgICAgICAgICAgfCAoZW52LT52ZnAudmVjX3N0cmlkZSA8PCBBUk1fVEJGTEFHX1ZFQ1NUUklERV9TSElGVCkKKyAgICAgICAgICAgIHwgKGVudi0+Y29uZGV4ZWNfYml0cyA8PCBBUk1fVEJGTEFHX0NPTkRFWEVDX1NISUZUKTsKKyAgICAgICAgICAgIC8vIHwgKGVudi0+YnN3YXBfY29kZSA8PCBBUk1fVEJGTEFHX0JTV0FQX0NPREVfU0hJRlQpOworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NKSkgeworICAgICAgICAgICAgcHJpdm1vZGUgPSAhKChlbnYtPnY3bS5leGNlcHRpb24gPT0gMCkgJiYgKGVudi0+djdtLmNvbnRyb2wgJiAxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcml2bW9kZSA9IChlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX00pICE9IEFSTV9DUFVfTU9ERV9VU1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByaXZtb2RlKSB7CisgICAgICAgICAgICAqZmxhZ3MgfD0gQVJNX1RCRkxBR19QUklWX01BU0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBFWENdICYgKDEgPDwgMzApKSB7CisgICAgICAgICAgICAqZmxhZ3MgfD0gQVJNX1RCRkxBR19WRlBFTl9NQVNLOworICAgICAgICB9CisgICAgfQorCisgICAgKmNzX2Jhc2UgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY3B1X2hhc193b3JrKENQVVN0YXRlICpjcHUpCit7CisgICAgcmV0dXJuIChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYKKyAgICAgICAgICAgIChDUFVfSU5URVJSVVBUX0ZJUSB8IENQVV9JTlRFUlJVUFRfSEFSRCB8IENQVV9JTlRFUlJVUFRfRVhJVFRCKSk7Cit9CisKKyNpbmNsdWRlICJleGVjL2V4ZWMtYWxsLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcGNfZnJvbV90YihDUFVBUk1TdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBlbnYtPnJlZ3NbMTVdID0gdGItPnBjOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9oZWxwZXIuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ5OWNhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2hlbHBlci5jCkBAIC0wLDAgKzEsMzI0MiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2NvZGUtcHJvZmlsZS5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNpbmNsdWRlICJleGVjL2dkYnN0dWIuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisvLyNpbmNsdWRlICJody9sb2FkZXIuaCIKKyNlbmRpZgorCitzdGF0aWMgdWludDMyX3QgY29ydGV4YTlfY3AxNV9jMF9jMVs4XSA9Cit7IDB4MTAzMSwgMHgxMSwgMHgwMDAsIDAsIDB4MDAxMDAxMDMsIDB4MjAwMDAwMDAsIDB4MDEyMzAwMDAsIDB4MDAwMDIxMTEgfTsKKworc3RhdGljIHVpbnQzMl90IGNvcnRleGE5X2NwMTVfYzBfYzJbOF0gPQoreyAweDAwMTAxMTExLCAweDEzMTEyMTExLCAweDIxMjMyMDQxLCAweDExMTEyMTMxLCAweDAwMTExMTQyLCAwLCAwLCAwIH07CisKK3N0YXRpYyB1aW50MzJfdCBjb3J0ZXhhOF9jcDE1X2MwX2MxWzhdID0KK3sgMHgxMDMxLCAweDExLCAweDQwMCwgMCwgMHgzMTEwMDAwMywgMHgyMDAwMDAwMCwgMHgwMTIwMjAwMCwgMHgxMSB9OworCitzdGF0aWMgdWludDMyX3QgY29ydGV4YThfY3AxNV9jMF9jMls4XSA9Cit7IDB4MDAxMDExMTEsIDB4MTIxMTIxMTEsIDB4MjEyMzIwMzEsIDB4MTExMTIxMzEsIDB4MDAxMTExNDIsIDAsIDAsIDAgfTsKKworc3RhdGljIHVpbnQzMl90IGNvcnRleGE4cjJfY3AxNV9jMF9jMls4XSA9Cit7IDB4MDAxMDExMTEsIDB4MTIxMTIxMTEsIDB4MjEyMzIwMzEsIDB4MTExMTIxMzEsIDB4MDAwMTExNDIsIDAsIDAsIDAgfTsKKworc3RhdGljIHVpbnQzMl90IG1wY29yZV9jcDE1X2MwX2MxWzhdID0KK3sgMHgxMTEsIDB4MSwgMCwgMHgyLCAweDAxMTAwMTAzLCAweDEwMDIwMzAyLCAweDAxMjIyMDAwLCAwIH07CisKK3N0YXRpYyB1aW50MzJfdCBtcGNvcmVfY3AxNV9jMF9jMls4XSA9Cit7IDB4MDAxMDAwMTEsIDB4MTIwMDIxMTEsIDB4MTEyMjEwMTEsIDB4MDExMDIxMzEsIDB4MTQxLCAwLCAwLCAwIH07CisKK3N0YXRpYyB1aW50MzJfdCBhcm0xMTM2X2NwMTVfYzBfYzFbOF0gPQoreyAweDExMSwgMHgxLCAweDIsIDB4MywgMHgwMTEzMDAwMywgMHgxMDAzMDMwMiwgMHgwMTIyMjExMCwgMCB9OworCitzdGF0aWMgdWludDMyX3QgYXJtMTEzNl9jcDE1X2MwX2MyWzhdID0KK3sgMHgwMDE0MDAxMSwgMHgxMjAwMjExMSwgMHgxMTIzMTExMSwgMHgwMTEwMjEzMSwgMHgxNDEsIDAsIDAsIDAgfTsKKworc3RhdGljIHVpbnQzMl90IGFybTExNzZfY3AxNV9jMF9jMVs4XSA9Cit7IDB4MTExLCAweDExLCAweDMzLCAwLCAweDAxMTMwMDAzLCAweDEwMDMwMzAyLCAweDAxMjIyMTAwLCAwIH07CisKK3N0YXRpYyB1aW50MzJfdCBhcm0xMTc2X2NwMTVfYzBfYzJbOF0gPQoreyAweDAxNDAwMTEsIDB4MTIwMDIxMTEsIDB4MTEyMzExMjEsIDB4MDExMDIxMzEsIDB4MDExNDEsIDAsIDAsIDAgfTsKKworc3RhdGljIHVpbnQzMl90IGNwdV9hcm1fZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZlYXR1cmUoQ1BVQVJNU3RhdGUgKmVudiwgaW50IGZlYXR1cmUpCit7CisgICAgZW52LT5mZWF0dXJlcyB8PSAxdSA8PCBmZWF0dXJlOworfQorCitzdGF0aWMgdm9pZCBjcHVfcmVzZXRfbW9kZWxfaWQoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgaWQpCit7CisgICAgZW52LT5jcDE1LmMwX2NwdWlkID0gaWQ7CisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQVJNX0NQVUlEX0FSTTkyNjoKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlApOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0lEXSA9IDB4NDEwMTEwOTA7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jYWNoZXR5cGUgPSAweDFkZDIwZDI7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDkwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BUk05NDY6CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjRUKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfTVBVKTsKKyAgICAgICAgZW52LT5jcDE1LmMwX2NhY2hldHlwZSA9IDB4MGYwMDQwMDY7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDAwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BUk0xMDI2OgorICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y0VCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjUpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfQVVYQ1IpOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0lEXSA9IDB4NDEwMTEwYTA7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jYWNoZXR5cGUgPSAweDFkZDIwZDI7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDkwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BUk0xMTM2OgorICAgICAgICAvKiBUaGlzIGlzIHRoZSAxMTM2IHIxLCB3aGljaCBpcyBhIHY2SyBjb3JlICovCisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjZLKTsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgY2FzZSBBUk1fQ1BVSURfQVJNMTEzNl9SMjoKKyAgICAgICAgLyogV2hhdCBxZW11IGNhbGxzICJhcm0xMTM2X3IyIiBpcyBhY3R1YWxseSB0aGUgMTEzNiByMHAyLCBpZSBhbgorICAgICAgICAgKiBvbGRlciBjb3JlIHRoYW4gcGxhaW4gImFybTExMzYiLiBJbiBwYXJ0aWN1bGFyIHRoaXMgZG9lcyBub3QKKyAgICAgICAgICogaGF2ZSB0aGUgdjZLIGZlYXR1cmVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9BVVhDUik7CisgICAgICAgIC8qIFRoZXNlIElEIHJlZ2lzdGVyIHZhbHVlcyBhcmUgY29ycmVjdCBmb3IgMTEzNiBidXQgbWF5IGJlIHdyb25nCisgICAgICAgICAqIGZvciAxMTM2X3IyIChpbiBwYXJ0aWN1bGFyIHIwcDIgZG9lcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50IG1vc3QKKyAgICAgICAgICogb2YgdGhlIElEIHJlZ2lzdGVycykuCisgICAgICAgICAqLworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0lEXSA9IDB4NDEwMTIwYjQ7CisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfTVZGUjBdID0gMHgxMTExMTExMTsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9NVkZSMV0gPSAweDAwMDAwMDAwOworICAgICAgICBtZW1jcHkoZW52LT5jcDE1LmMwX2MxLCBhcm0xMTM2X2NwMTVfYzBfYzEsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMiwgYXJtMTEzNl9jcDE1X2MwX2MyLCA4ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jYWNoZXR5cGUgPSAweDFkZDIwZDI7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDUwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BUk0xMTc2OgorICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y0VCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjUpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNkspOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfQVVYQ1IpOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0lEXSA9IDB4NDEwMTIwYjU7CisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfTVZGUjBdID0gMHgxMTExMTExMTsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9NVkZSMV0gPSAweDAwMDAwMDAwOworICAgICAgICBtZW1jcHkoZW52LT5jcDE1LmMwX2MxLCBhcm0xMTc2X2NwMTVfYzBfYzEsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMiwgYXJtMTE3Nl9jcDE1X2MwX2MyLCA4ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jYWNoZXR5cGUgPSAweDFkZDIwZDI7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDUwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BUk0xMU1QQ09SRToKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjZLKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlApOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX0FVWENSKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WQVBBKTsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUFNJRF0gPSAweDQxMDEyMGI0OworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX01WRlIwXSA9IDB4MTExMTExMTE7CisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfTVZGUjFdID0gMHgwMDAwMDAwMDsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMSwgbXBjb3JlX2NwMTVfYzBfYzEsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMiwgbXBjb3JlX2NwMTVfYzBfYzIsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZW52LT5jcDE1LmMwX2NhY2hldHlwZSA9IDB4MWRkMjBkMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fQ1BVSURfQ09SVEVYQTg6CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjRUKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2Syk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjcpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX0FVWENSKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9USFVNQjIpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMyk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfTkVPTik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyRUUpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RSVVNUWk9ORSk7CisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTSURdID0gMHg0MTAzMzBjMDsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9NVkZSMF0gPSAweDExMTEwMjIyOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX01WRlIxXSA9IDB4MDAwMTExMDA7CisgICAgICAgIG1lbWNweShlbnYtPmNwMTUuYzBfYzEsIGNvcnRleGE4X2NwMTVfYzBfYzEsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMiwgY29ydGV4YThfY3AxNV9jMF9jMiwgOCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBlbnYtPmNwMTUuYzBfY2FjaGV0eXBlID0gMHg4MjA0ODAwNDsKKyAgICAgICAgZW52LT5jcDE1LmMwX2NsaWQgPSAoMSA8PCAyNykgfCAoMiA8PCAyNCkgfCAzOworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMF0gPSAweGUwMDdlMDFhOyAvKiAxNmsgTDEgZGNhY2hlLiAqLworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMV0gPSAweDIwMDdlMDFhOyAvKiAxNmsgTDEgaWNhY2hlLiAqLworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMl0gPSAweGYwMDAwMDAwOyAvKiBObyBMMiBpY2FjaGUuICovCisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwYzUwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9DT1JURVhBOF9SMjoKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjZLKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNyk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfQVVYQ1IpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RIVU1CMik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9ORU9OKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9USFVNQjJFRSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVFJVU1RaT05FKTsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUFNJRF0gPSAweDQxMDMzMGMyOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX01WRlIwXSA9IDB4MTExMTAyMjI7CisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfTVZGUjFdID0gMHgwMDAxMTExMTsKKyAgICAgICAgbWVtY3B5KGVudi0+Y3AxNS5jMF9jMSwgY29ydGV4YThfY3AxNV9jMF9jMSwgOCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBtZW1jcHkoZW52LT5jcDE1LmMwX2MyLCBjb3J0ZXhhOHIyX2NwMTVfYzBfYzIsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZW52LT5jcDE1LmMwX2NhY2hldHlwZSA9IDB4ODIwNDgwMDQ7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jbGlkID0gKDEgPDwgMjcpIHwgKDIgPDwgMjQpIHwgKDQgPDwgMykgfCAzOworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMF0gPSAweGUwMDdlMDFhOyAvKiAxNmsgTDEgZGNhY2hlLiAqLworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMV0gPSAweDIwMDdlMDFhOyAvKiAxNmsgTDEgaWNhY2hlLiAqLworICAgICAgICBlbnYtPmNwMTUuYzBfY2NzaWRbMl0gPSAweGYwM2ZlMDNhOyAvKiAyNTZrIEwyIGNhY2hlLiAqLworICAgICAgICBlbnYtPmNwMTUuYzFfc3lzID0gMHgwMGM1MDA3ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fQ1BVSURfQ09SVEVYQTk6CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjRUKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2Syk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjcpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX0FVWENSKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9USFVNQjIpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMyk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQX0ZQMTYpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX05FT04pOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RIVU1CMkVFKTsKKyAgICAgICAgLyogTm90ZSB0aGF0IEE5IHN1cHBvcnRzIHRoZSBNUCBleHRlbnNpb25zIGV2ZW4gZm9yCisgICAgICAgICAqIEE5VVAgYW5kIHNpbmdsZS1jb3JlIEE5TVAgKHdoaWNoIGFyZSBib3RoIGRpZmZlcmVudAorICAgICAgICAgKiBhbmQgdmFsaWQgY29uZmlndXJhdGlvbnM7IHdlIGRvbid0IG1vZGVsIEE5VVApLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WN01QKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9UUlVTVFpPTkUpOworICAgICAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0lEXSA9IDB4NDEwMzQwMDA7IC8qIEd1ZXNzICovCisgICAgICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfTVZGUjBdID0gMHgxMTExMDIyMjsKKyAgICAgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9NVkZSMV0gPSAweDAxMTExMTExOworICAgICAgICBtZW1jcHkoZW52LT5jcDE1LmMwX2MxLCBjb3J0ZXhhOV9jcDE1X2MwX2MxLCA4ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIG1lbWNweShlbnYtPmNwMTUuYzBfYzIsIGNvcnRleGE5X2NwMTVfYzBfYzIsIDggKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZW52LT5jcDE1LmMwX2NhY2hldHlwZSA9IDB4ODAwMzgwMDM7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jbGlkID0gKDEgPDwgMjcpIHwgKDEgPDwgMjQpIHwgMzsKKyAgICAgICAgZW52LT5jcDE1LmMwX2Njc2lkWzBdID0gMHhlMDBmZTAxNTsgLyogMTZrIEwxIGRjYWNoZS4gKi8KKyAgICAgICAgZW52LT5jcDE1LmMwX2Njc2lkWzFdID0gMHgyMDBmZTAxNTsgLyogMTZrIEwxIGljYWNoZS4gKi8KKyAgICAgICAgZW52LT5jcDE1LmMxX3N5cyA9IDB4MDBjNTAwNzg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVJNX0NQVUlEX0NPUlRFWE0zOgorICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y0VCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjUpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9USFVNQjIpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9ESVYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9BTlk6IC8qIEZvciB1c2Vyc3BhY2UgZW11bGF0aW9uLiAgKi8KKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNik7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjZLKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNyk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlApOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUF9GUDE2KTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9ORU9OKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9USFVNQjJFRSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfRElWKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WN01QKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fQ1BVSURfVEk5MTVUOgorICAgIGNhc2UgQVJNX0NQVUlEX1RJOTI1VDoKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX09NQVBDUCk7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jcHVpZCA9IEFSTV9DUFVJRF9USTkyNVQ7IC8qIERlcGVuZHMgb24gd2lyaW5nLiAgKi8KKyAgICAgICAgZW52LT5jcDE1LmMwX2NhY2hldHlwZSA9IDB4NTEwOTE0OTsKKyAgICAgICAgZW52LT5jcDE1LmMxX3N5cyA9IDB4MDAwMDAwNzA7CisgICAgICAgIGVudi0+Y3AxNS5jMTVfaV9tYXggPSAweDAwMDsKKyAgICAgICAgZW52LT5jcDE1LmMxNV9pX21pbiA9IDB4ZmYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9QWEEyNTA6CisgICAgY2FzZSBBUk1fQ1BVSURfUFhBMjU1OgorICAgIGNhc2UgQVJNX0NQVUlEX1BYQTI2MDoKKyAgICBjYXNlIEFSTV9DUFVJRF9QWEEyNjE6CisgICAgY2FzZSBBUk1fQ1BVSURfUFhBMjYyOgorICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y0VCk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjUpOworICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1hTQ0FMRSk7CisgICAgICAgIC8qIEpUQUdfSUQgaXMgKChpZCA8PCAyOCkgfCAweDA5MjY1MDEzKSAqLworICAgICAgICBlbnYtPmNwMTUuYzBfY2FjaGV0eXBlID0gMHhkMTcyMTcyOworICAgICAgICBlbnYtPmNwMTUuYzFfc3lzID0gMHgwMDAwMDA3ODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBUk1fQ1BVSURfUFhBMjcwX0EwOgorICAgIGNhc2UgQVJNX0NQVUlEX1BYQTI3MF9BMToKKyAgICBjYXNlIEFSTV9DUFVJRF9QWEEyNzBfQjA6CisgICAgY2FzZSBBUk1fQ1BVSURfUFhBMjcwX0IxOgorICAgIGNhc2UgQVJNX0NQVUlEX1BYQTI3MF9DMDoKKyAgICBjYXNlIEFSTV9DUFVJRF9QWEEyNzBfQzU6CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjRUKTsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNSk7CisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKTsKKyAgICAgICAgLyogSlRBR19JRCBpcyAoKGlkIDw8IDI4KSB8IDB4MDkyNjUwMTMpICovCisgICAgICAgIHNldF9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfSVdNTVhUKTsKKyAgICAgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0lEXSA9IDB4NjkwNTEwMDAgfCAnUSc7CisgICAgICAgIGVudi0+Y3AxNS5jMF9jYWNoZXR5cGUgPSAweGQxNzIxNzI7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDAwMDc4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFSTV9DUFVJRF9TQTExMDA6CisgICAgY2FzZSBBUk1fQ1BVSURfU0ExMTEwOgorICAgICAgICBzZXRfZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1NUUk9OR0FSTSk7CisgICAgICAgIGVudi0+Y3AxNS5jMV9zeXMgPSAweDAwMDAwMDcwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjcHVfYWJvcnQoZW52LCAiQmFkIENQVSBJRDogJXhcbiIsIGlkKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogU29tZSBmZWF0dXJlcyBhdXRvbWF0aWNhbGx5IGltcGx5IG90aGVyczogKi8KKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgc2V0X2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WQVBBKTsKKyAgICB9Cit9CisKK3ZvaWQgY3B1X3Jlc2V0KENQVVN0YXRlICpjcHUpCit7CisgICAgQ1BVQVJNU3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICB1aW50MzJfdCBpZDsKKworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19SRVNFVCkpIHsKKyAgICAgICAgcWVtdV9sb2coIkNQVSBSZXNldCAoQ1BVICVkKVxuIiwgY3B1LT5jcHVfaW5kZXgpOworICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgMCk7CisgICAgfQorCisgICAgaWQgPSBlbnYtPmNwMTUuYzBfY3B1aWQ7CisgICAgbWVtc2V0KGVudiwgMCwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIGJyZWFrcG9pbnRzKSk7CisgICAgaWYgKGlkKQorICAgICAgICBjcHVfcmVzZXRfbW9kZWxfaWQoZW52LCBpZCk7CisgICAgLyogREJHRElEUiA6IHdlIGltcGxlbWVudCBub3RoaW5nLCBhbmQganVzdCBtaXJyb3IgdGhlIG1haW4gSUQKKyAgICAgKiByZWdpc3RlcidzIFZhcmlhbnQgYW5kIFJldmlzaW9uIGZpZWxkcy4KKyAgICAgKi8KKyAgICBlbnYtPmNwMTRfZGJnZGlkciA9IChpZCA+PiAxNiAmIDB4ZjApIHwgMHhmOworI2lmIGRlZmluZWQgKENPTkZJR19VU0VSX09OTFkpCisgICAgZW52LT51bmNhY2hlZF9jcHNyID0gQVJNX0NQVV9NT0RFX1VTUjsKKyAgICAvKiBGb3IgdXNlciBtb2RlIHdlIG11c3QgZW5hYmxlIGFjY2VzcyB0byBjb3Byb2Nlc3NvcnMgKi8KKyAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQRVhDXSA9IDEgPDwgMzA7CisgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfSVdNTVhUKSkgeworICAgICAgICBlbnYtPmNwMTUuYzE1X2NwYXIgPSAzOworICAgIH0gZWxzZSBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9YU0NBTEUpKSB7CisgICAgICAgIGVudi0+Y3AxNS5jMTVfY3BhciA9IDE7CisgICAgfQorI2Vsc2UKKyAgICAvKiBTVkMgbW9kZSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuICAqLworICAgIGVudi0+dW5jYWNoZWRfY3BzciA9IEFSTV9DUFVfTU9ERV9TVkMgfCBDUFNSX0EgfCBDUFNSX0YgfCBDUFNSX0k7CisgICAgLyogT24gQVJNdjctTSB0aGUgQ1BTUl9JIGlzIHRoZSB2YWx1ZSBvZiB0aGUgUFJJTUFTSyByZWdpc3RlciwgYW5kIGlzCisgICAgICAgY2xlYXIgYXQgcmVzZXQuICBJbml0aWFsIFNQIGFuZCBQQyBhcmUgbG9hZGVkIGZyb20gUk9NLiAgKi8KKyAgICBpZiAoSVNfTShlbnYpKSB7CisgICAgICAgIGVudi0+dW5jYWNoZWRfY3BzciAmPSB+Q1BTUl9JOworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLyogTm8gaHcvbG9hZGVyLmggYW5kIG5vIFJPTSBzdXBwb3J0IGZvciBub3cgb24gQW5kcm9pZCAqLworICAgICAgICB1aW50MzJfdCBwYzsKKyAgICAgICAgdWludDhfdCAqcm9tOworICAgICAgICByb20gPSByb21fcHRyKDApOworICAgICAgICBpZiAocm9tKSB7CisgICAgICAgICAgICAvKiBXZSBzaG91bGQgcmVhbGx5IHVzZSBsZGxfcGh5cyBoZXJlLCBpbiBjYXNlIHRoZSBndWVzdAorICAgICAgICAgICAgICAgbW9kaWZpZWQgZmxhc2ggYW5kIHJlc2V0IGl0c2VsZi4gIEhvd2V2ZXIgaW1hZ2VzCisgICAgICAgICAgICAgICBsb2FkZWQgdmlhIC1rZW5yZWwgaGF2ZSBub3QgYmVlbiBjb3BpZWQgeWV0LCBzbyBsb2FkIHRoZQorICAgICAgICAgICAgICAgdmFsdWVzIGRpcmVjdGx5IGZyb20gdGhlcmUuICAqLworICAgICAgICAgICAgZW52LT5yZWdzWzEzXSA9IGxkbF9wKHJvbSk7CisgICAgICAgICAgICBwYyA9IGxkbF9wKHJvbSArIDQpOworICAgICAgICAgICAgZW52LT50aHVtYiA9IHBjICYgMTsKKyAgICAgICAgICAgIGVudi0+cmVnc1sxNV0gPSBwYyAmIH4xOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUEVYQ10gPSAwOworICAgIGVudi0+Y3AxNS5jMl9iYXNlX21hc2sgPSAweGZmZmZjMDAwdTsKKyAgICAvKiB2NyBwZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgcmVnaXN0ZXI6IHNhbWUgaW1wbGVtZW50b3IKKyAgICAgKiBmaWVsZCBhcyBtYWluIElEIHJlZ2lzdGVyLCBhbmQgd2UgaW1wbGVtZW50IG5vIGV2ZW50IGNvdW50ZXJzLgorICAgICAqLworICAgIGVudi0+Y3AxNS5jOV9wbWNyID0gKGlkICYgMHhmZjAwMDAwMCk7CisjZW5kaWYKKyAgICBzZXRfZmx1c2hfdG9femVybygxLCAmZW52LT52ZnAuc3RhbmRhcmRfZnBfc3RhdHVzKTsKKyAgICBzZXRfZmx1c2hfaW5wdXRzX3RvX3plcm8oMSwgJmVudi0+dmZwLnN0YW5kYXJkX2ZwX3N0YXR1cyk7CisgICAgc2V0X2RlZmF1bHRfbmFuX21vZGUoMSwgJmVudi0+dmZwLnN0YW5kYXJkX2ZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X2RldGVjdF90aW5pbmVzcyhmbG9hdF90aW5pbmVzc19iZWZvcmVfcm91bmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT52ZnAuZnBfc3RhdHVzKTsKKyAgICBzZXRfZmxvYXRfZGV0ZWN0X3RpbmluZXNzKGZsb2F0X3RpbmluZXNzX2JlZm9yZV9yb3VuZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnZmcC5zdGFuZGFyZF9mcF9zdGF0dXMpOworICAgIHRsYl9mbHVzaChlbnYsIDEpOworfQorCitzdGF0aWMgaW50IHZmcF9nZGJfZ2V0X3JlZyhDUFVBUk1TdGF0ZSAqZW52LCB1aW50OF90ICpidWYsIGludCByZWcpCit7CisgICAgaW50IG5yZWdzOworCisgICAgLyogVkZQIGRhdGEgcmVnaXN0ZXJzIGFyZSBhbHdheXMgbGl0dGxlLWVuZGlhbi4gICovCisgICAgbnJlZ3MgPSBhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpID8gMzIgOiAxNjsKKyAgICBpZiAocmVnIDwgbnJlZ3MpIHsKKyAgICAgICAgc3RmcV9sZV9wKGJ1ZiwgZW52LT52ZnAucmVnc1tyZWddKTsKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX05FT04pKSB7CisgICAgICAgIC8qIEFsaWFzZXMgZm9yIFEgcmVncy4gICovCisgICAgICAgIG5yZWdzICs9IDE2OworICAgICAgICBpZiAocmVnIDwgbnJlZ3MpIHsKKyAgICAgICAgICAgIHN0ZnFfbGVfcChidWYsIGVudi0+dmZwLnJlZ3NbKHJlZyAtIDMyKSAqIDJdKTsKKyAgICAgICAgICAgIHN0ZnFfbGVfcChidWYgKyA4LCBlbnYtPnZmcC5yZWdzWyhyZWcgLSAzMikgKiAyICsgMV0pOworICAgICAgICAgICAgcmV0dXJuIDE2OworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAocmVnIC0gbnJlZ3MpIHsKKyAgICBjYXNlIDA6IHN0bF9wKGJ1ZiwgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUFNJRF0pOyByZXR1cm4gNDsKKyAgICBjYXNlIDE6IHN0bF9wKGJ1ZiwgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUFNDUl0pOyByZXR1cm4gNDsKKyAgICBjYXNlIDI6IHN0bF9wKGJ1ZiwgZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUEVYQ10pOyByZXR1cm4gNDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZwX2dkYl9zZXRfcmVnKENQVUFSTVN0YXRlICplbnYsIHVpbnQ4X3QgKmJ1ZiwgaW50IHJlZykKK3sKKyAgICBpbnQgbnJlZ3M7CisKKyAgICBucmVncyA9IGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykgPyAzMiA6IDE2OworICAgIGlmIChyZWcgPCBucmVncykgeworICAgICAgICBlbnYtPnZmcC5yZWdzW3JlZ10gPSBsZGZxX2xlX3AoYnVmKTsKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX05FT04pKSB7CisgICAgICAgIG5yZWdzICs9IDE2OworICAgICAgICBpZiAocmVnIDwgbnJlZ3MpIHsKKyAgICAgICAgICAgIGVudi0+dmZwLnJlZ3NbKHJlZyAtIDMyKSAqIDJdID0gbGRmcV9sZV9wKGJ1Zik7CisgICAgICAgICAgICBlbnYtPnZmcC5yZWdzWyhyZWcgLSAzMikgKiAyICsgMV0gPSBsZGZxX2xlX3AoYnVmICsgOCk7CisgICAgICAgICAgICByZXR1cm4gMTY7CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChyZWcgLSBucmVncykgeworICAgIGNhc2UgMDogZW52LT52ZnAueHJlZ3NbQVJNX1ZGUF9GUFNJRF0gPSBsZGxfcChidWYpOyByZXR1cm4gNDsKKyAgICBjYXNlIDE6IGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdID0gbGRsX3AoYnVmKTsgcmV0dXJuIDQ7CisgICAgY2FzZSAyOiBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQRVhDXSA9IGxkbF9wKGJ1ZikgJiAoMSA8PCAzMCk7IHJldHVybiA0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworQ1BVQVJNU3RhdGUgKmNwdV9hcm1faW5pdChjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgQVJNQ1BVICphcm1fY3B1OworICAgIENQVUFSTVN0YXRlICplbnY7CisgICAgdWludDMyX3QgaWQ7CisgICAgc3RhdGljIGludCBpbml0ZWQgPSAwOworCisgICAgaWQgPSBjcHVfYXJtX2ZpbmRfYnlfbmFtZShjcHVfbW9kZWwpOworICAgIGlmIChpZCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcm1fY3B1ID0gZ19tYWxsb2MwKHNpemVvZihBUk1DUFUpKTsKKyAgICBlbnYgPSAmYXJtX2NwdS0+ZW52OworICAgIEVOVl9HRVRfQ1BVKGVudiktPmVudl9wdHIgPSBlbnY7CisKKyAgICBDUFVTdGF0ZSAqY3B1ID0gRU5WX0dFVF9DUFUoZW52KTsKKyAgICBjcHVfZXhlY19pbml0KGVudik7CisgICAgaWYgKCFpbml0ZWQpIHsKKyAgICAgICAgaW5pdGVkID0gMTsKKyAgICAgICAgYXJtX3RyYW5zbGF0ZV9pbml0KCk7CisgICAgfQorCisgICAgY3B1LT5jcHVfbW9kZWxfc3RyID0gY3B1X21vZGVsOworICAgIGVudi0+Y3AxNS5jMF9jcHVpZCA9IGlkOworICAgIGNwdV9yZXNldChjcHUpOworICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX05FT04pKSB7CisgICAgICAgIGdkYl9yZWdpc3Rlcl9jb3Byb2Nlc3NvcihjcHUsIHZmcF9nZGJfZ2V0X3JlZywgdmZwX2dkYl9zZXRfcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEsICJhcm0tbmVvbi54bWwiLCAwKTsKKyAgICB9IGVsc2UgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykpIHsKKyAgICAgICAgZ2RiX3JlZ2lzdGVyX2NvcHJvY2Vzc29yKGNwdSwgdmZwX2dkYl9nZXRfcmVnLCB2ZnBfZ2RiX3NldF9yZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNSwgImFybS12ZnAzLnhtbCIsIDApOworICAgIH0gZWxzZSBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlApKSB7CisgICAgICAgIGdkYl9yZWdpc3Rlcl9jb3Byb2Nlc3NvcihjcHUsIHZmcF9nZGJfZ2V0X3JlZywgdmZwX2dkYl9zZXRfcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksICJhcm0tdmZwLnhtbCIsIDApOworICAgIH0KKyAgICBxZW11X2luaXRfdmNwdShjcHUpOworICAgIHJldHVybiBlbnY7Cit9CisKK3N0cnVjdCBhcm1fY3B1X3QgeworICAgIHVpbnQzMl90IGlkOworICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFybV9jcHVfdCBhcm1fY3B1X25hbWVzW10gPSB7CisgICAgeyBBUk1fQ1BVSURfQVJNOTI2LCAiYXJtOTI2In0sCisgICAgeyBBUk1fQ1BVSURfQVJNOTQ2LCAiYXJtOTQ2In0sCisgICAgeyBBUk1fQ1BVSURfQVJNMTAyNiwgImFybTEwMjYifSwKKyAgICB7IEFSTV9DUFVJRF9BUk0xMTM2LCAiYXJtMTEzNiJ9LAorICAgIHsgQVJNX0NQVUlEX0FSTTExMzZfUjIsICJhcm0xMTM2LXIyIn0sCisgICAgeyBBUk1fQ1BVSURfQVJNMTE3NiwgImFybTExNzYifSwKKyAgICB7IEFSTV9DUFVJRF9BUk0xMU1QQ09SRSwgImFybTExbXBjb3JlIn0sCisgICAgeyBBUk1fQ1BVSURfQ09SVEVYTTMsICJjb3J0ZXgtbTMifSwKKyAgICB7IEFSTV9DUFVJRF9DT1JURVhBOCwgImNvcnRleC1hOCJ9LAorICAgIHsgQVJNX0NQVUlEX0NPUlRFWEE4X1IyLCAiY29ydGV4LWE4LXIyIn0sCisgICAgeyBBUk1fQ1BVSURfQ09SVEVYQTksICJjb3J0ZXgtYTkifSwKKyAgICB7IEFSTV9DUFVJRF9USTkyNVQsICJ0aTkyNXQiIH0sCisgICAgeyBBUk1fQ1BVSURfUFhBMjUwLCAicHhhMjUwIiB9LAorICAgIHsgQVJNX0NQVUlEX1NBMTEwMCwgICAgInNhMTEwMCIgfSwKKyAgICB7IEFSTV9DUFVJRF9TQTExMTAsICAgICJzYTExMTAiIH0sCisgICAgeyBBUk1fQ1BVSURfUFhBMjU1LCAicHhhMjU1IiB9LAorICAgIHsgQVJNX0NQVUlEX1BYQTI2MCwgInB4YTI2MCIgfSwKKyAgICB7IEFSTV9DUFVJRF9QWEEyNjEsICJweGEyNjEiIH0sCisgICAgeyBBUk1fQ1BVSURfUFhBMjYyLCAicHhhMjYyIiB9LAorICAgIHsgQVJNX0NQVUlEX1BYQTI3MCwgInB4YTI3MCIgfSwKKyAgICB7IEFSTV9DUFVJRF9QWEEyNzBfQTAsICJweGEyNzAtYTAiIH0sCisgICAgeyBBUk1fQ1BVSURfUFhBMjcwX0ExLCAicHhhMjcwLWExIiB9LAorICAgIHsgQVJNX0NQVUlEX1BYQTI3MF9CMCwgInB4YTI3MC1iMCIgfSwKKyAgICB7IEFSTV9DUFVJRF9QWEEyNzBfQjEsICJweGEyNzAtYjEiIH0sCisgICAgeyBBUk1fQ1BVSURfUFhBMjcwX0MwLCAicHhhMjcwLWMwIiB9LAorICAgIHsgQVJNX0NQVUlEX1BYQTI3MF9DNSwgInB4YTI3MC1jNSIgfSwKKyAgICB7IEFSTV9DUFVJRF9BTlksICJhbnkifSwKKyAgICB7IDAsIE5VTEx9Cit9OworCit2b2lkIGFybV9jcHVfbGlzdChGSUxFICpmLCBmcHJpbnRmX2Z1bmN0aW9uIGNwdV9mcHJpbnRmKQoreworICAgIGludCBpOworCisgICAgKCpjcHVfZnByaW50ZikoZiwgIkF2YWlsYWJsZSBDUFVzOlxuIik7CisgICAgZm9yIChpID0gMDsgYXJtX2NwdV9uYW1lc1tpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgKCpjcHVfZnByaW50ZikoZiwgIiAgJXNcbiIsIGFybV9jcHVfbmFtZXNbaV0ubmFtZSk7CisgICAgfQorfQorCisvKiByZXR1cm4gMCBpZiBub3QgZm91bmQgKi8KK3N0YXRpYyB1aW50MzJfdCBjcHVfYXJtX2ZpbmRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworICAgIHVpbnQzMl90IGlkOworCisgICAgaWQgPSAwOworICAgIGZvciAoaSA9IDA7IGFybV9jcHVfbmFtZXNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgYXJtX2NwdV9uYW1lc1tpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBpZCA9IGFybV9jcHVfbmFtZXNbaV0uaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaWQ7Cit9CisKK3ZvaWQgY3B1X2FybV9jbG9zZShDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIGZyZWUoZW52KTsKK30KKwordWludDMyX3QgY3Bzcl9yZWFkKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgaW50IFpGOworICAgIFpGID0gKGVudi0+WkYgPT0gMCk7CisgICAgcmV0dXJuIGVudi0+dW5jYWNoZWRfY3BzciB8IChlbnYtPk5GICYgMHg4MDAwMDAwMCkgfCAoWkYgPDwgMzApIHwKKyAgICAgICAgKGVudi0+Q0YgPDwgMjkpIHwgKChlbnYtPlZGICYgMHg4MDAwMDAwMCkgPj4gMykgfCAoZW52LT5RRiA8PCAyNykKKyAgICAgICAgfCAoZW52LT50aHVtYiA8PCA1KSB8ICgoZW52LT5jb25kZXhlY19iaXRzICYgMykgPDwgMjUpCisgICAgICAgIHwgKChlbnYtPmNvbmRleGVjX2JpdHMgJiAweGZjKSA8PCA4KQorICAgICAgICB8IChlbnYtPkdFIDw8IDE2KTsKK30KKwordm9pZCBjcHNyX3dyaXRlKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHZhbCwgdWludDMyX3QgbWFzaykKK3sKKyAgICBpZiAobWFzayAmIENQU1JfTlpDVikgeworICAgICAgICBlbnYtPlpGID0gKH52YWwpICYgQ1BTUl9aOworICAgICAgICBlbnYtPk5GID0gdmFsOworICAgICAgICBlbnYtPkNGID0gKHZhbCA+PiAyOSkgJiAxOworICAgICAgICBlbnYtPlZGID0gKHZhbCA8PCAzKSAmIDB4ODAwMDAwMDA7CisgICAgfQorICAgIGlmIChtYXNrICYgQ1BTUl9RKQorICAgICAgICBlbnYtPlFGID0gKCh2YWwgJiBDUFNSX1EpICE9IDApOworICAgIGlmIChtYXNrICYgQ1BTUl9UKQorICAgICAgICBlbnYtPnRodW1iID0gKCh2YWwgJiBDUFNSX1QpICE9IDApOworICAgIGlmIChtYXNrICYgQ1BTUl9JVF8wXzEpIHsKKyAgICAgICAgZW52LT5jb25kZXhlY19iaXRzICY9IH4zOworICAgICAgICBlbnYtPmNvbmRleGVjX2JpdHMgfD0gKHZhbCA+PiAyNSkgJiAzOworICAgIH0KKyAgICBpZiAobWFzayAmIENQU1JfSVRfMl83KSB7CisgICAgICAgIGVudi0+Y29uZGV4ZWNfYml0cyAmPSAzOworICAgICAgICBlbnYtPmNvbmRleGVjX2JpdHMgfD0gKHZhbCA+PiA4KSAmIDB4ZmM7CisgICAgfQorICAgIGlmIChtYXNrICYgQ1BTUl9HRSkgeworICAgICAgICBlbnYtPkdFID0gKHZhbCA+PiAxNikgJiAweGY7CisgICAgfQorCisgICAgaWYgKChlbnYtPnVuY2FjaGVkX2Nwc3IgXiB2YWwpICYgbWFzayAmIENQU1JfTSkgeworICAgICAgICBzd2l0Y2hfbW9kZShlbnYsIHZhbCAmIENQU1JfTSk7CisgICAgfQorICAgIG1hc2sgJj0gfkNBQ0hFRF9DUFNSX0JJVFM7CisgICAgZW52LT51bmNhY2hlZF9jcHNyID0gKGVudi0+dW5jYWNoZWRfY3BzciAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKK30KKworLyogU2lnbi96ZXJvIGV4dGVuZCAqLwordWludDMyX3QgSEVMUEVSKHN4dGIxNikodWludDMyX3QgeCkKK3sKKyAgICB1aW50MzJfdCByZXM7CisgICAgcmVzID0gKHVpbnQxNl90KShpbnQ4X3QpeDsKKyAgICByZXMgfD0gKHVpbnQzMl90KShpbnQ4X3QpKHggPj4gMTYpIDw8IDE2OworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUih1eHRiMTYpKHVpbnQzMl90IHgpCit7CisgICAgdWludDMyX3QgcmVzOworICAgIHJlcyA9ICh1aW50MTZfdCkodWludDhfdCl4OworICAgIHJlcyB8PSAodWludDMyX3QpKHVpbnQ4X3QpKHggPj4gMTYpIDw8IDE2OworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihjbHopKHVpbnQzMl90IHgpCit7CisgICAgcmV0dXJuIGNsejMyKHgpOworfQorCitpbnQzMl90IEhFTFBFUihzZGl2KShpbnQzMl90IG51bSwgaW50MzJfdCBkZW4pCit7CisgICAgaWYgKGRlbiA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG51bSA9PSBJTlRfTUlOICYmIGRlbiA9PSAtMSkKKyAgICAgIHJldHVybiBJTlRfTUlOOworICAgIHJldHVybiBudW0gLyBkZW47Cit9CisKK3VpbnQzMl90IEhFTFBFUih1ZGl2KSh1aW50MzJfdCBudW0sIHVpbnQzMl90IGRlbikKK3sKKyAgICBpZiAoZGVuID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbnVtIC8gZGVuOworfQorCit1aW50MzJfdCBIRUxQRVIocmJpdCkodWludDMyX3QgeCkKK3sKKyAgICB4ID0gICgoeCAmIDB4ZmYwMDAwMDApID4+IDI0KQorICAgICAgIHwgKCh4ICYgMHgwMGZmMDAwMCkgPj4gOCkKKyAgICAgICB8ICgoeCAmIDB4MDAwMGZmMDApIDw8IDgpCisgICAgICAgfCAoKHggJiAweDAwMDAwMGZmKSA8PCAyNCk7CisgICAgeCA9ICAoKHggJiAweGYwZjBmMGYwKSA+PiA0KQorICAgICAgIHwgKCh4ICYgMHgwZjBmMGYwZikgPDwgNCk7CisgICAgeCA9ICAoKHggJiAweDg4ODg4ODg4KSA+PiAzKQorICAgICAgIHwgKCh4ICYgMHg0NDQ0NDQ0NCkgPj4gMSkKKyAgICAgICB8ICgoeCAmIDB4MjIyMjIyMjIpIDw8IDEpCisgICAgICAgfCAoKHggJiAweDExMTExMTExKSA8PCAzKTsKKyAgICByZXR1cm4geDsKK30KKwordWludDMyX3QgSEVMUEVSKGFicykodWludDMyX3QgeCkKK3sKKyAgICByZXR1cm4gKChpbnQzMl90KXggPCAwKSA/IC14IDogeDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKwordm9pZCBkb19pbnRlcnJ1cHQgKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSAtMTsKK30KKworaW50IGNwdV9hcm1faGFuZGxlX21tdV9mYXVsdCAoQ1BVQVJNU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsIGludCBydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4KQoreworICAgIGlmIChydyA9PSAyKSB7CisgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9QUkVGRVRDSF9BQk9SVDsKKyAgICAgICAgZW52LT5jcDE1LmM2X2luc24gPSBhZGRyZXNzOworICAgIH0gZWxzZSB7CisgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9EQVRBX0FCT1JUOworICAgICAgICBlbnYtPmNwMTUuYzZfZGF0YSA9IGFkZHJlc3M7CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKiBUaGVzZSBzaG91bGQgcHJvYmFibHkgcmFpc2UgdW5kZWZpbmVkIGluc24gZXhjZXB0aW9ucy4gICovCit2b2lkIEhFTFBFUihzZXRfY3AxNSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgaW5zbiwgdWludDMyX3QgdmFsKQoreworICAgIGNwdV9hYm9ydChlbnYsICJjcDE1IGluc24gJTA4eFxuIiwgaW5zbik7Cit9CisKK3VpbnQzMl90IEhFTFBFUihnZXRfY3AxNSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgaW5zbikKK3sKKyAgICBjcHVfYWJvcnQoZW52LCAiY3AxNSBpbnNuICUwOHhcbiIsIGluc24pOworICAgIHJldHVybiAwOworfQorCisvKiBUaGVzZSBzaG91bGQgcHJvYmFibHkgcmFpc2UgdW5kZWZpbmVkIGluc24gZXhjZXB0aW9ucy4gICovCit2b2lkIEhFTFBFUih2N21fbXNyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBjcHVfYWJvcnQoZW52LCAidjdtX21ycyAlZFxuIiwgcmVnKTsKK30KKwordWludDMyX3QgSEVMUEVSKHY3bV9tcnMpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHJlZykKK3sKKyAgICBjcHVfYWJvcnQoZW52LCAidjdtX21ycyAlZFxuIiwgcmVnKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzd2l0Y2hfbW9kZShDUFVBUk1TdGF0ZSAqZW52LCBpbnQgbW9kZSkKK3sKKyAgICBpZiAobW9kZSAhPSBBUk1fQ1BVX01PREVfVVNSKQorICAgICAgICBjcHVfYWJvcnQoZW52LCAiVHJpZWQgdG8gc3dpdGNoIG91dCBvZiB1c2VyIG1vZGVcbiIpOworfQorCit2b2lkIEhFTFBFUihzZXRfcjEzX2JhbmtlZCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgbW9kZSwgdWludDMyX3QgdmFsKQoreworICAgIGNwdV9hYm9ydChlbnYsICJiYW5rZWQgcjEzIHdyaXRlXG4iKTsKK30KKwordWludDMyX3QgSEVMUEVSKGdldF9yMTNfYmFua2VkKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBtb2RlKQoreworICAgIGNwdV9hYm9ydChlbnYsICJiYW5rZWQgcjEzIHJlYWRcbiIpOworICAgIHJldHVybiAwOworfQorCisjZWxzZQorCitleHRlcm4gaW50IHNlbWlob3N0aW5nX2VuYWJsZWQ7CisKKy8qIE1hcCBDUFUgbW9kZXMgb250byBzYXZlZCByZWdpc3RlciBiYW5rcy4gICovCitzdGF0aWMgaW5saW5lIGludCBiYW5rX251bWJlciAoQ1BVQVJNU3RhdGUgKmVudiwgaW50IG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBBUk1fQ1BVX01PREVfVVNSOgorICAgIGNhc2UgQVJNX0NQVV9NT0RFX1NZUzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBUk1fQ1BVX01PREVfU1ZDOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEFSTV9DUFVfTU9ERV9BQlQ6CisgICAgICAgIHJldHVybiAyOworICAgIGNhc2UgQVJNX0NQVV9NT0RFX1VORDoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgY2FzZSBBUk1fQ1BVX01PREVfSVJROgorICAgICAgICByZXR1cm4gNDsKKyAgICBjYXNlIEFSTV9DUFVfTU9ERV9GSVE6CisgICAgICAgIHJldHVybiA1OworICAgIGNhc2UgQVJNX0NQVV9NT0RFX1NNQzoKKyAgICAgICAgcmV0dXJuIDY7CisgICAgfQorICAgIGNwdV9hYm9ydChlbnYsICJCYWQgbW9kZSAleFxuIiwgbW9kZSk7CisgICAgcmV0dXJuIC0xOworfQorCit2b2lkIHN3aXRjaF9tb2RlKENQVUFSTVN0YXRlICplbnYsIGludCBtb2RlKQoreworICAgIGludCBvbGRfbW9kZTsKKyAgICBpbnQgaTsKKworICAgIG9sZF9tb2RlID0gZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NOworICAgIGlmIChtb2RlID09IG9sZF9tb2RlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAob2xkX21vZGUgPT0gQVJNX0NQVV9NT0RFX0ZJUSkgeworICAgICAgICBtZW1jcHkgKGVudi0+ZmlxX3JlZ3MsIGVudi0+cmVncyArIDgsIDUgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgbWVtY3B5IChlbnYtPnJlZ3MgKyA4LCBlbnYtPnVzcl9yZWdzLCA1ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgfSBlbHNlIGlmIChtb2RlID09IEFSTV9DUFVfTU9ERV9GSVEpIHsKKyAgICAgICAgbWVtY3B5IChlbnYtPnVzcl9yZWdzLCBlbnYtPnJlZ3MgKyA4LCA1ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIG1lbWNweSAoZW52LT5yZWdzICsgOCwgZW52LT5maXFfcmVncywgNSAqIHNpemVvZih1aW50MzJfdCkpOworICAgIH0KKworICAgIGkgPSBiYW5rX251bWJlcihlbnYsIG9sZF9tb2RlKTsKKyAgICBlbnYtPmJhbmtlZF9yMTNbaV0gPSBlbnYtPnJlZ3NbMTNdOworICAgIGVudi0+YmFua2VkX3IxNFtpXSA9IGVudi0+cmVnc1sxNF07CisgICAgZW52LT5iYW5rZWRfc3BzcltpXSA9IGVudi0+c3BzcjsKKworICAgIGkgPSBiYW5rX251bWJlcihlbnYsIG1vZGUpOworICAgIGVudi0+cmVnc1sxM10gPSBlbnYtPmJhbmtlZF9yMTNbaV07CisgICAgZW52LT5yZWdzWzE0XSA9IGVudi0+YmFua2VkX3IxNFtpXTsKKyAgICBlbnYtPnNwc3IgPSBlbnYtPmJhbmtlZF9zcHNyW2ldOworfQorCitzdGF0aWMgdm9pZCB2N21fcHVzaChDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwpCit7CisgICAgZW52LT5yZWdzWzEzXSAtPSA0OworICAgIHN0bF9waHlzKGVudi0+cmVnc1sxM10sIHZhbCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCB2N21fcG9wKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHZhbCA9IGxkbF9waHlzKGVudi0+cmVnc1sxM10pOworICAgIGVudi0+cmVnc1sxM10gKz0gNDsKKyAgICByZXR1cm4gdmFsOworfQorCisvKiBTd2l0Y2ggdG8gVjdNIG1haW4gb3IgcHJvY2VzcyBzdGFjayBwb2ludGVyLiAgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF92N21fc3AoQ1BVQVJNU3RhdGUgKmVudiwgaW50IHByb2Nlc3MpCit7CisgICAgdWludDMyX3QgdG1wOworICAgIGlmIChlbnYtPnY3bS5jdXJyZW50X3NwICE9IHByb2Nlc3MpIHsKKyAgICAgICAgdG1wID0gZW52LT52N20ub3RoZXJfc3A7CisgICAgICAgIGVudi0+djdtLm90aGVyX3NwID0gZW52LT5yZWdzWzEzXTsKKyAgICAgICAgZW52LT5yZWdzWzEzXSA9IHRtcDsKKyAgICAgICAgZW52LT52N20uY3VycmVudF9zcCA9IHByb2Nlc3M7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkb192N21fZXhjZXB0aW9uX2V4aXQoQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCB0eXBlOworICAgIHVpbnQzMl90IHhwc3I7CisKKyAgICB0eXBlID0gZW52LT5yZWdzWzE1XTsKKyAgICBpZiAoZW52LT52N20uZXhjZXB0aW9uICE9IDApCisgICAgICAgIGFybXY3bV9udmljX2NvbXBsZXRlX2lycShlbnYtPm52aWMsIGVudi0+djdtLmV4Y2VwdGlvbik7CisKKyAgICAvKiBTd2l0Y2ggdG8gdGhlIHRhcmdldCBzdGFjay4gICovCisgICAgc3dpdGNoX3Y3bV9zcChlbnYsICh0eXBlICYgNCkgIT0gMCk7CisgICAgLyogUG9wIHJlZ2lzdGVycy4gICovCisgICAgZW52LT5yZWdzWzBdID0gdjdtX3BvcChlbnYpOworICAgIGVudi0+cmVnc1sxXSA9IHY3bV9wb3AoZW52KTsKKyAgICBlbnYtPnJlZ3NbMl0gPSB2N21fcG9wKGVudik7CisgICAgZW52LT5yZWdzWzNdID0gdjdtX3BvcChlbnYpOworICAgIGVudi0+cmVnc1sxMl0gPSB2N21fcG9wKGVudik7CisgICAgZW52LT5yZWdzWzE0XSA9IHY3bV9wb3AoZW52KTsKKyAgICBlbnYtPnJlZ3NbMTVdID0gdjdtX3BvcChlbnYpOworICAgIHhwc3IgPSB2N21fcG9wKGVudik7CisgICAgeHBzcl93cml0ZShlbnYsIHhwc3IsIDB4ZmZmZmZkZmYpOworICAgIC8qIFVuZG8gc3RhY2sgYWxpZ25tZW50LiAgKi8KKyAgICBpZiAoeHBzciAmIDB4MjAwKQorICAgICAgICBlbnYtPnJlZ3NbMTNdIHw9IDQ7CisgICAgLyogPz8/IFRoZSBleGNlcHRpb24gcmV0dXJuIHR5cGUgc3BlY2lmaWVzIFRocmVhZC9IYW5kbGVyIG1vZGUuICBIb3dldmVyCisgICAgICAgdGhpcyBpcyBhbHNvIGltcGxpZWQgYnkgdGhlIHhQU1IgdmFsdWUuIE5vdCBzdXJlIHdoYXQgdG8gZG8KKyAgICAgICBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLiAgKi8KKyAgICAvKiA/Pz8gTGlrZXdpc2UgZm9yIG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgQ09OVFJPTCByZWdpc3RlciBhbmQgdGhlIHN0YWNrCisgICAgICAgcG9pbnRlci4gICovCit9CisKK3N0YXRpYyB2b2lkIGRvX2ludGVycnVwdF92N20oQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCB4cHNyID0geHBzcl9yZWFkKGVudik7CisgICAgdWludDMyX3QgbHI7CisgICAgdWludDMyX3QgYWRkcjsKKworICAgIGxyID0gMHhmZmZmZmZmMTsKKyAgICBpZiAoZW52LT52N20uY3VycmVudF9zcCkKKyAgICAgICAgbHIgfD0gNDsKKyAgICBpZiAoZW52LT52N20uZXhjZXB0aW9uID09IDApCisgICAgICAgIGxyIHw9IDg7CisKKyAgICAvKiBGb3IgZXhjZXB0aW9ucyB3ZSBqdXN0IG1hcmsgYXMgcGVuZGluZyBvbiB0aGUgTlZJQywgYW5kIGxldCB0aGF0CisgICAgICAgaGFuZGxlIGl0LiAgKi8KKyAgICAvKiBUT0RPOiBOZWVkIHRvIGVzY2FsYXRlIGlmIHRoZSBjdXJyZW50IHByaW9yaXR5IGlzIGhpZ2hlciB0aGFuIHRoZQorICAgICAgIG9uZSB3ZSdyZSByYWlzaW5nLiAgKi8KKyAgICBzd2l0Y2ggKGVudi0+ZXhjZXB0aW9uX2luZGV4KSB7CisgICAgY2FzZSBFWENQX1VERUY6CisgICAgICAgIGFybXY3bV9udmljX3NldF9wZW5kaW5nKGVudi0+bnZpYywgQVJNVjdNX0VYQ1BfVVNBR0UpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBFWENQX1NXSToKKyAgICAgICAgZW52LT5yZWdzWzE1XSArPSAyOworICAgICAgICBhcm12N21fbnZpY19zZXRfcGVuZGluZyhlbnYtPm52aWMsIEFSTVY3TV9FWENQX1NWQyk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIEVYQ1BfUFJFRkVUQ0hfQUJPUlQ6CisgICAgY2FzZSBFWENQX0RBVEFfQUJPUlQ6CisgICAgICAgIGFybXY3bV9udmljX3NldF9wZW5kaW5nKGVudi0+bnZpYywgQVJNVjdNX0VYQ1BfTUVNKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgRVhDUF9CS1BUOgorICAgICAgICBpZiAoc2VtaWhvc3RpbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgaW50IG5yOworICAgICAgICAgICAgbnIgPSBjcHVfbGR1d19jb2RlKGVudiwgZW52LT5yZWdzWzE1XSkgJiAweGZmOworICAgICAgICAgICAgaWYgKG5yID09IDB4YWIpIHsKKyAgICAgICAgICAgICAgICBlbnYtPnJlZ3NbMTVdICs9IDI7CisgICAgICAgICAgICAgICAgZW52LT5yZWdzWzBdID0gZG9fYXJtX3NlbWlob3N0aW5nKGVudik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFybXY3bV9udmljX3NldF9wZW5kaW5nKGVudi0+bnZpYywgQVJNVjdNX0VYQ1BfREVCVUcpOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBFWENQX0lSUToKKyAgICAgICAgZW52LT52N20uZXhjZXB0aW9uID0gYXJtdjdtX252aWNfYWNrbm93bGVkZ2VfaXJxKGVudi0+bnZpYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhDUF9FWENFUFRJT05fRVhJVDoKKyAgICAgICAgZG9fdjdtX2V4Y2VwdGlvbl9leGl0KGVudik7CisgICAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgICBjcHVfYWJvcnQoZW52LCAiVW5oYW5kbGVkIGV4Y2VwdGlvbiAweCV4XG4iLCBlbnYtPmV4Y2VwdGlvbl9pbmRleCk7CisgICAgICAgIHJldHVybjsgLyogTmV2ZXIgaGFwcGVucy4gIEtlZXAgY29tcGlsZXIgaGFwcHkuICAqLworICAgIH0KKworICAgIC8qIEFsaWduIHN0YWNrIHBvaW50ZXIuICAqLworICAgIC8qID8/PyBTaG91bGQgb25seSBkbyB0aGlzIGlmIENvbmZpZ3VyYXRpb24gQ29udHJvbCBSZWdpc3RlcgorICAgICAgIFNUQUNLQUxJR04gYml0IGlzIHNldC4gICovCisgICAgaWYgKGVudi0+cmVnc1sxM10gJiA0KSB7CisgICAgICAgIGVudi0+cmVnc1sxM10gLT0gNDsKKyAgICAgICAgeHBzciB8PSAweDIwMDsKKyAgICB9CisgICAgLyogU3dpdGNoIHRvIHRoZSBoYW5kbGVyIG1vZGUuICAqLworICAgIHY3bV9wdXNoKGVudiwgeHBzcik7CisgICAgdjdtX3B1c2goZW52LCBlbnYtPnJlZ3NbMTVdKTsKKyAgICB2N21fcHVzaChlbnYsIGVudi0+cmVnc1sxNF0pOworICAgIHY3bV9wdXNoKGVudiwgZW52LT5yZWdzWzEyXSk7CisgICAgdjdtX3B1c2goZW52LCBlbnYtPnJlZ3NbM10pOworICAgIHY3bV9wdXNoKGVudiwgZW52LT5yZWdzWzJdKTsKKyAgICB2N21fcHVzaChlbnYsIGVudi0+cmVnc1sxXSk7CisgICAgdjdtX3B1c2goZW52LCBlbnYtPnJlZ3NbMF0pOworICAgIHN3aXRjaF92N21fc3AoZW52LCAwKTsKKyAgICBlbnYtPnVuY2FjaGVkX2Nwc3IgJj0gfkNQU1JfSVQ7CisgICAgZW52LT5yZWdzWzE0XSA9IGxyOworICAgIGFkZHIgPSBsZGxfcGh5cyhlbnYtPnY3bS52ZWNiYXNlICsgZW52LT52N20uZXhjZXB0aW9uICogNCk7CisgICAgZW52LT5yZWdzWzE1XSA9IGFkZHIgJiAweGZmZmZmZmZlOworICAgIGVudi0+dGh1bWIgPSBhZGRyICYgMTsKK30KKworLyogSGFuZGxlIGEgQ1BVIGV4Y2VwdGlvbi4gICovCit2b2lkIGRvX2ludGVycnVwdChDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHVpbnQzMl90IGFkZHI7CisgICAgdWludDMyX3QgbWFzazsKKyAgICBpbnQgbmV3X21vZGU7CisgICAgdWludDMyX3Qgb2Zmc2V0OworCisgICAgaWYgKElTX00oZW52KSkgeworICAgICAgICBkb19pbnRlcnJ1cHRfdjdtKGVudik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogVE9ETzogVmVjdG9yZWQgaW50ZXJydXB0IGNvbnRyb2xsZXIuICAqLworICAgIHN3aXRjaCAoZW52LT5leGNlcHRpb25faW5kZXgpIHsKKyAgICBjYXNlIEVYQ1BfVURFRjoKKyAgICAgICAgbmV3X21vZGUgPSBBUk1fQ1BVX01PREVfVU5EOworICAgICAgICBhZGRyID0gMHgwNDsKKyAgICAgICAgbWFzayA9IENQU1JfSTsKKyAgICAgICAgaWYgKGVudi0+dGh1bWIpCisgICAgICAgICAgICBvZmZzZXQgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ1BfU1dJOgorICAgICAgICBpZiAoc2VtaWhvc3RpbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIHNlbWlob3N0aW5nIGludGVycnVwdC4gICovCisgICAgICAgICAgICBpZiAoZW52LT50aHVtYikgeworICAgICAgICAgICAgICAgIG1hc2sgPSBjcHVfbGR1d19jb2RlKGVudiwgZW52LT5yZWdzWzE1XSAtIDIpICYgMHhmZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFzayA9IGNwdV9sZGxfY29kZShlbnYsIGVudi0+cmVnc1sxNV0gLSA0KSAmIDB4ZmZmZmZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogT25seSBpbnRlcmNlcHQgY2FsbHMgZnJvbSBwcml2aWxlZ2VkIG1vZGVzLCB0byBwcm92aWRlIHNvbWUKKyAgICAgICAgICAgICAgIHNlbWJsYW5jZSBvZiBzZWN1cml0eS4gICovCisgICAgICAgICAgICBpZiAoKChtYXNrID09IDB4MTIzNDU2ICYmICFlbnYtPnRodW1iKQorICAgICAgICAgICAgICAgICAgICB8fCAobWFzayA9PSAweGFiICYmIGVudi0+dGh1bWIpKQorICAgICAgICAgICAgICAgICAgJiYgKGVudi0+dW5jYWNoZWRfY3BzciAmIENQU1JfTSkgIT0gQVJNX0NQVV9NT0RFX1VTUikgeworICAgICAgICAgICAgICAgIGVudi0+cmVnc1swXSA9IGRvX2FybV9zZW1paG9zdGluZyhlbnYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdfbW9kZSA9IEFSTV9DUFVfTU9ERV9TVkM7CisgICAgICAgIGFkZHIgPSAweDA4OworICAgICAgICBtYXNrID0gQ1BTUl9JOworICAgICAgICAvKiBUaGUgUEMgYWxyZWFkeSBwb2ludHMgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ1BfQktQVDoKKyAgICAgICAgLyogU2VlIGlmIHRoaXMgaXMgYSBzZW1paG9zdGluZyBzeXNjYWxsLiAgKi8KKyAgICAgICAgaWYgKGVudi0+dGh1bWIgJiYgc2VtaWhvc3RpbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgbWFzayA9IGNwdV9sZHV3X2NvZGUoZW52LCBlbnYtPnJlZ3NbMTVdKSAmIDB4ZmY7CisgICAgICAgICAgICBpZiAobWFzayA9PSAweGFiCisgICAgICAgICAgICAgICAgICAmJiAoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NKSAhPSBBUk1fQ1BVX01PREVfVVNSKSB7CisgICAgICAgICAgICAgICAgZW52LT5yZWdzWzE1XSArPSAyOworICAgICAgICAgICAgICAgIGVudi0+cmVnc1swXSA9IGRvX2FybV9zZW1paG9zdGluZyhlbnYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gcHJlZmV0Y2ggYWJvcnQuICAqLworICAgIGNhc2UgRVhDUF9QUkVGRVRDSF9BQk9SVDoKKyAgICAgICAgbmV3X21vZGUgPSBBUk1fQ1BVX01PREVfQUJUOworICAgICAgICBhZGRyID0gMHgwYzsKKyAgICAgICAgbWFzayA9IENQU1JfQSB8IENQU1JfSTsKKyAgICAgICAgb2Zmc2V0ID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWENQX0RBVEFfQUJPUlQ6CisgICAgICAgIG5ld19tb2RlID0gQVJNX0NQVV9NT0RFX0FCVDsKKyAgICAgICAgYWRkciA9IDB4MTA7CisgICAgICAgIG1hc2sgPSBDUFNSX0EgfCBDUFNSX0k7CisgICAgICAgIG9mZnNldCA9IDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhDUF9JUlE6CisgICAgICAgIG5ld19tb2RlID0gQVJNX0NQVV9NT0RFX0lSUTsKKyAgICAgICAgYWRkciA9IDB4MTg7CisgICAgICAgIC8qIERpc2FibGUgSVJRIGFuZCBpbXByZWNpc2UgZGF0YSBhYm9ydHMuICAqLworICAgICAgICBtYXNrID0gQ1BTUl9BIHwgQ1BTUl9JOworICAgICAgICBvZmZzZXQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ1BfRklROgorICAgICAgICBuZXdfbW9kZSA9IEFSTV9DUFVfTU9ERV9GSVE7CisgICAgICAgIGFkZHIgPSAweDFjOworICAgICAgICAvKiBEaXNhYmxlIEZJUSwgSVJRIGFuZCBpbXByZWNpc2UgZGF0YSBhYm9ydHMuICAqLworICAgICAgICBtYXNrID0gQ1BTUl9BIHwgQ1BTUl9JIHwgQ1BTUl9GOworICAgICAgICBvZmZzZXQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ1BfU01DOgorICAgICAgICBpZiAoc2VtaWhvc3RpbmdfZW5hYmxlZCkgeworICAgICAgICAgICAgY3B1X2Fib3J0KGVudiwgIlNNQyBoYW5kbGluZyB1bmRlciBzZW1paG9zdGluZyBub3QgaW1wbGVtZW50ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NKSA9PSBBUk1fQ1BVX01PREVfU01DKSB7CisgICAgICAgICAgICBlbnYtPmNwMTUuYzFfc2VjZmcgJj0gfjE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ID0gZW52LT50aHVtYiA/IDIgOiAwOworICAgICAgICBuZXdfbW9kZSA9IEFSTV9DUFVfTU9ERV9TTUM7CisgICAgICAgIGFkZHIgPSAweDA4OworICAgICAgICBtYXNrID0gQ1BTUl9BIHwgQ1BTUl9JIHwgQ1BTUl9GOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjcHVfYWJvcnQoZW52LCAiVW5oYW5kbGVkIGV4Y2VwdGlvbiAweCV4XG4iLCBlbnYtPmV4Y2VwdGlvbl9pbmRleCk7CisgICAgICAgIHJldHVybjsgLyogTmV2ZXIgaGFwcGVucy4gIEtlZXAgY29tcGlsZXIgaGFwcHkuICAqLworICAgIH0KKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9UUlVTVFpPTkUpKSB7CisgICAgICAgIGlmIChuZXdfbW9kZSA9PSBBUk1fQ1BVX01PREVfU01DIHx8CisgICAgICAgICAgICAoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NKSA9PSBBUk1fQ1BVX01PREVfU01DKSB7CisgICAgICAgICAgICBhZGRyICs9IGVudi0+Y3AxNS5jMTJfbXZiYXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZW52LT5jcDE1LmMxX3N5cyAmICgxIDw8IDEzKSkgeworICAgICAgICAgICAgICAgIGFkZHIgKz0gMHhmZmZmMDAwMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkciArPSBlbnYtPmNwMTUuYzEyX3ZiYXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgIC8qIEhpZ2ggdmVjdG9ycy4gICovCisgICAgaWYgKGVudi0+Y3AxNS5jMV9zeXMgJiAoMSA8PCAxMykpIHsKKyAgICAgICAgYWRkciArPSAweGZmZmYwMDAwOworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaF9tb2RlIChlbnYsIG5ld19tb2RlKTsKKyAgICBlbnYtPnNwc3IgPSBjcHNyX3JlYWQoZW52KTsKKyAgICAvKiBDbGVhciBJVCBiaXRzLiAgKi8KKyAgICBlbnYtPmNvbmRleGVjX2JpdHMgPSAwOworICAgIC8qIFN3aXRjaCB0byB0aGUgbmV3IG1vZGUsIGFuZCB0byB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbiBzZXQuICAqLworICAgIGVudi0+dW5jYWNoZWRfY3BzciA9IChlbnYtPnVuY2FjaGVkX2Nwc3IgJiB+Q1BTUl9NKSB8IG5ld19tb2RlOworICAgIGVudi0+dW5jYWNoZWRfY3BzciB8PSBtYXNrOworICAgIC8qIHRoaXMgaXMgYSBsaWUsIGFzIHRoZSB3YXMgbm8gYzFfc3lzIG9uIFY0VC9WNSwgYnV0IHdobyBjYXJlcworICAgICAqIGFuZCB3ZSBzaG91bGQganVzdCBndWFyZCB0aGUgdGh1bWIgbW9kZSBvbiBWNCAqLworICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y0VCkpIHsKKyAgICAgICAgZW52LT50aHVtYiA9IChlbnYtPmNwMTUuYzFfc3lzICYgKDEgPDwgMzApKSAhPSAwOworICAgIH0KKyAgICBlbnYtPnJlZ3NbMTRdID0gZW52LT5yZWdzWzE1XSArIG9mZnNldDsKKyAgICBlbnYtPnJlZ3NbMTVdID0gYWRkcjsKKyAgICBFTlZfR0VUX0NQVShlbnYpLT5pbnRlcnJ1cHRfcmVxdWVzdCB8PSBDUFVfSU5URVJSVVBUX0VYSVRUQjsKK30KKworLyogQ2hlY2sgc2VjdGlvbi9wYWdlIGFjY2VzcyBwZXJtaXNzaW9ucy4KKyAgIFJldHVybnMgdGhlIHBhZ2UgcHJvdGVjdGlvbiBmbGFncywgb3IgemVybyBpZiB0aGUgYWNjZXNzIGlzIG5vdAorICAgcGVybWl0dGVkLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2FwKENQVUFSTVN0YXRlICplbnYsIGludCBhcCwgaW50IGRvbWFpbiwgaW50IGFjY2Vzc190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3VzZXIpCit7CisgIGludCBwcm90X3JvOworCisgIGlmIChkb21haW4gPT0gMykKKyAgICByZXR1cm4gUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKworICBpZiAoYWNjZXNzX3R5cGUgPT0gMSkKKyAgICAgIHByb3Rfcm8gPSAwOworICBlbHNlCisgICAgICBwcm90X3JvID0gUEFHRV9SRUFEOworCisgIHN3aXRjaCAoYXApIHsKKyAgY2FzZSAwOgorICAgICAgaWYgKGFjY2Vzc190eXBlID09IDEpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICBzd2l0Y2ggKChlbnYtPmNwMTUuYzFfc3lzID4+IDgpICYgMykgeworICAgICAgY2FzZSAxOgorICAgICAgICAgIHJldHVybiBpc191c2VyID8gMCA6IFBBR0VfUkVBRDsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgICByZXR1cm4gUEFHRV9SRUFEOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgY2FzZSAxOgorICAgICAgcmV0dXJuIGlzX3VzZXIgPyAwIDogUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKyAgY2FzZSAyOgorICAgICAgaWYgKGlzX3VzZXIpCisgICAgICAgICAgcmV0dXJuIHByb3Rfcm87CisgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuIFBBR0VfUkVBRCB8IFBBR0VfV1JJVEU7CisgIGNhc2UgMzoKKyAgICAgIHJldHVybiBQQUdFX1JFQUQgfCBQQUdFX1dSSVRFOworICBjYXNlIDQ6IC8qIFJlc2VydmVkLiAgKi8KKyAgICAgIHJldHVybiAwOworICBjYXNlIDU6CisgICAgICByZXR1cm4gaXNfdXNlciA/IDAgOiBwcm90X3JvOworICBjYXNlIDY6CisgICAgICByZXR1cm4gcHJvdF9ybzsKKyAgY2FzZSA3OgorICAgICAgaWYgKCFhcm1fZmVhdHVyZSAoZW52LCBBUk1fRkVBVFVSRV9WNkspKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgcmV0dXJuIHByb3Rfcm87CisgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICB9Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfbGV2ZWwxX3RhYmxlX2FkZHJlc3MoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYWRkcmVzcykKK3sKKyAgICB1aW50MzJfdCB0YWJsZTsKKworICAgIGlmIChhZGRyZXNzICYgZW52LT5jcDE1LmMyX21hc2spCisgICAgICAgIHRhYmxlID0gZW52LT5jcDE1LmMyX2Jhc2UxICYgMHhmZmZmYzAwMDsKKyAgICBlbHNlCisgICAgICAgIHRhYmxlID0gZW52LT5jcDE1LmMyX2Jhc2UwICYgZW52LT5jcDE1LmMyX2Jhc2VfbWFzazsKKworICAgIHRhYmxlIHw9IChhZGRyZXNzID4+IDE4KSAmIDB4M2ZmYzsKKyAgICByZXR1cm4gdGFibGU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3BoeXNfYWRkcl92NShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhZGRyZXNzLCBpbnQgYWNjZXNzX3R5cGUsCisJCQkgICAgaW50IGlzX3VzZXIsIHVpbnQzMl90ICpwaHlzX3B0ciwgaW50ICpwcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyAqcGFnZV9zaXplKQoreworICAgIGludCBjb2RlOworICAgIHVpbnQzMl90IHRhYmxlOworICAgIHVpbnQzMl90IGRlc2M7CisgICAgaW50IHR5cGU7CisgICAgaW50IGFwOworICAgIGludCBkb21haW47CisgICAgdWludDMyX3QgcGh5c19hZGRyOworCisgICAgLyogUGFnZXRhYmxlIHdhbGsuICAqLworICAgIC8qIExvb2t1cCBsMSBkZXNjcmlwdG9yLiAgKi8KKyAgICB0YWJsZSA9IGdldF9sZXZlbDFfdGFibGVfYWRkcmVzcyhlbnYsIGFkZHJlc3MpOworICAgIGRlc2MgPSBsZGxfcGh5cyh0YWJsZSk7CisgICAgdHlwZSA9IChkZXNjICYgMyk7CisgICAgZG9tYWluID0gKGVudi0+Y3AxNS5jMyA+PiAoKGRlc2MgPj4gNCkgJiAweDFlKSkgJiAzOworICAgIGlmICh0eXBlID09IDApIHsKKyAgICAgICAgLyogU2VjdGlvbiB0cmFuc2xhdGlvbiBmYXVsdC4gICovCisgICAgICAgIGNvZGUgPSA1OworICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgIH0KKyAgICBpZiAoZG9tYWluID09IDAgfHwgZG9tYWluID09IDIpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gMikKKyAgICAgICAgICAgIGNvZGUgPSA5OyAvKiBTZWN0aW9uIGRvbWFpbiBmYXVsdC4gICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvZGUgPSAxMTsgLyogUGFnZSBkb21haW4gZmF1bHQuICAqLworICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgIH0KKyAgICBpZiAodHlwZSA9PSAyKSB7CisgICAgICAgIC8qIDFNYiBzZWN0aW9uLiAgKi8KKyAgICAgICAgcGh5c19hZGRyID0gKGRlc2MgJiAweGZmZjAwMDAwKSB8IChhZGRyZXNzICYgMHgwMDBmZmZmZik7CisgICAgICAgIGFwID0gKGRlc2MgPj4gMTApICYgMzsKKyAgICAgICAgY29kZSA9IDEzOworICAgICAgICAqcGFnZV9zaXplID0gMTAyNCAqIDEwMjQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTG9va3VwIGwyIGVudHJ5LiAgKi8KKwlpZiAodHlwZSA9PSAxKSB7CisJICAgIC8qIENvYXJzZSBwYWdldGFibGUuICAqLworCSAgICB0YWJsZSA9IChkZXNjICYgMHhmZmZmZmMwMCkgfCAoKGFkZHJlc3MgPj4gMTApICYgMHgzZmMpOworCX0gZWxzZSB7CisJICAgIC8qIEZpbmUgcGFnZXRhYmxlLiAgKi8KKwkgICAgdGFibGUgPSAoZGVzYyAmIDB4ZmZmZmYwMDApIHwgKChhZGRyZXNzID4+IDgpICYgMHhmZmMpOworCX0KKyAgICAgICAgZGVzYyA9IGxkbF9waHlzKHRhYmxlKTsKKyAgICAgICAgc3dpdGNoIChkZXNjICYgMykgeworICAgICAgICBjYXNlIDA6IC8qIFBhZ2UgdHJhbnNsYXRpb24gZmF1bHQuICAqLworICAgICAgICAgICAgY29kZSA9IDc7CisgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgICAgICBjYXNlIDE6IC8qIDY0ayBwYWdlLiAgKi8KKyAgICAgICAgICAgIHBoeXNfYWRkciA9IChkZXNjICYgMHhmZmZmMDAwMCkgfCAoYWRkcmVzcyAmIDB4ZmZmZik7CisgICAgICAgICAgICBhcCA9IChkZXNjID4+ICg0ICsgKChhZGRyZXNzID4+IDEzKSAmIDYpKSkgJiAzOworICAgICAgICAgICAgKnBhZ2Vfc2l6ZSA9IDB4MTAwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiA0ayBwYWdlLiAgKi8KKyAgICAgICAgICAgIHBoeXNfYWRkciA9IChkZXNjICYgMHhmZmZmZjAwMCkgfCAoYWRkcmVzcyAmIDB4ZmZmKTsKKyAgICAgICAgICAgIGFwID0gKGRlc2MgPj4gKDQgKyAoKGFkZHJlc3MgPj4gMTMpICYgNikpKSAmIDM7CisgICAgICAgICAgICAqcGFnZV9zaXplID0gMHgxMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogMWsgcGFnZS4gICovCisJICAgIGlmICh0eXBlID09IDEpIHsKKwkJaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKSkgeworCQkgICAgcGh5c19hZGRyID0gKGRlc2MgJiAweGZmZmZmMDAwKSB8IChhZGRyZXNzICYgMHhmZmYpOworCQl9IGVsc2UgeworCQkgICAgLyogUGFnZSB0cmFuc2xhdGlvbiBmYXVsdC4gICovCisJCSAgICBjb2RlID0gNzsKKwkJICAgIGdvdG8gZG9fZmF1bHQ7CisJCX0KKwkgICAgfSBlbHNlIHsKKwkJcGh5c19hZGRyID0gKGRlc2MgJiAweGZmZmZmYzAwKSB8IChhZGRyZXNzICYgMHgzZmYpOworCSAgICB9CisgICAgICAgICAgICBhcCA9IChkZXNjID4+IDQpICYgMzsKKyAgICAgICAgICAgICpwYWdlX3NpemUgPSAweDQwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogTmV2ZXIgaGFwcGVucywgYnV0IGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaCB0byB0ZWxsLiAgKi8KKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgY29kZSA9IDE1OworICAgIH0KKyAgICAqcHJvdCA9IGNoZWNrX2FwKGVudiwgYXAsIGRvbWFpbiwgYWNjZXNzX3R5cGUsIGlzX3VzZXIpOworICAgIGlmICghKnByb3QpIHsKKyAgICAgICAgLyogQWNjZXNzIHBlcm1pc3Npb24gZmF1bHQuICAqLworICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgIH0KKyAgICAqcHJvdCB8PSBQQUdFX0VYRUM7CisgICAgKnBoeXNfcHRyID0gcGh5c19hZGRyOworICAgIHJldHVybiAwOworZG9fZmF1bHQ6CisgICAgcmV0dXJuIGNvZGUgfCAoZG9tYWluIDw8IDQpOworfQorCitzdGF0aWMgaW50IGdldF9waHlzX2FkZHJfdjYoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYWRkcmVzcywgaW50IGFjY2Vzc190eXBlLAorCQkJICAgIGludCBpc191c2VyLCB1aW50MzJfdCAqcGh5c19wdHIsIGludCAqcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgKnBhZ2Vfc2l6ZSkKK3sKKyAgICBpbnQgY29kZTsKKyAgICB1aW50MzJfdCB0YWJsZTsKKyAgICB1aW50MzJfdCBkZXNjOworICAgIHVpbnQzMl90IHhuOworICAgIGludCB0eXBlOworICAgIGludCBhcDsKKyAgICBpbnQgZG9tYWluOworICAgIHVpbnQzMl90IHBoeXNfYWRkcjsKKworICAgIC8qIFBhZ2V0YWJsZSB3YWxrLiAgKi8KKyAgICAvKiBMb29rdXAgbDEgZGVzY3JpcHRvci4gICovCisgICAgdGFibGUgPSBnZXRfbGV2ZWwxX3RhYmxlX2FkZHJlc3MoZW52LCBhZGRyZXNzKTsKKyAgICBkZXNjID0gbGRsX3BoeXModGFibGUpOworICAgIHR5cGUgPSAoZGVzYyAmIDMpOworICAgIGlmICh0eXBlID09IDAgfHwgdHlwZSA9PSAzKSB7CisgICAgICAgIC8qIFNlY3Rpb24gdHJhbnNsYXRpb24gZmF1bHQuICAqLworICAgICAgICBjb2RlID0gNTsKKyAgICAgICAgZG9tYWluID0gMDsKKyAgICAgICAgZ290byBkb19mYXVsdDsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMiAmJiAoZGVzYyAmICgxIDw8IDE4KSkpIHsKKyAgICAgICAgLyogU3VwZXJzZWN0aW9uLiAgKi8KKyAgICAgICAgZG9tYWluID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTZWN0aW9uIG9yIHBhZ2UuICAqLworICAgICAgICBkb21haW4gPSAoZGVzYyA+PiA0KSAmIDB4MWU7CisgICAgfQorICAgIGRvbWFpbiA9IChlbnYtPmNwMTUuYzMgPj4gZG9tYWluKSAmIDM7CisgICAgaWYgKGRvbWFpbiA9PSAwIHx8IGRvbWFpbiA9PSAyKSB7CisgICAgICAgIGlmICh0eXBlID09IDIpCisgICAgICAgICAgICBjb2RlID0gOTsgLyogU2VjdGlvbiBkb21haW4gZmF1bHQuICAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb2RlID0gMTE7IC8qIFBhZ2UgZG9tYWluIGZhdWx0LiAgKi8KKyAgICAgICAgZ290byBkb19mYXVsdDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gMikgeworICAgICAgICBpZiAoZGVzYyAmICgxIDw8IDE4KSkgeworICAgICAgICAgICAgLyogU3VwZXJzZWN0aW9uLiAgKi8KKyAgICAgICAgICAgIHBoeXNfYWRkciA9IChkZXNjICYgMHhmZjAwMDAwMCkgfCAoYWRkcmVzcyAmIDB4MDBmZmZmZmYpOworICAgICAgICAgICAgKnBhZ2Vfc2l6ZSA9IDB4MTAwMDAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNlY3Rpb24uICAqLworICAgICAgICAgICAgcGh5c19hZGRyID0gKGRlc2MgJiAweGZmZjAwMDAwKSB8IChhZGRyZXNzICYgMHgwMDBmZmZmZik7CisgICAgICAgICAgICAqcGFnZV9zaXplID0gMHgxMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgYXAgPSAoKGRlc2MgPj4gMTApICYgMykgfCAoKGRlc2MgPj4gMTMpICYgNCk7CisgICAgICAgIHhuID0gZGVzYyAmICgxIDw8IDQpOworICAgICAgICBjb2RlID0gMTM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogTG9va3VwIGwyIGVudHJ5LiAgKi8KKyAgICAgICAgdGFibGUgPSAoZGVzYyAmIDB4ZmZmZmZjMDApIHwgKChhZGRyZXNzID4+IDEwKSAmIDB4M2ZjKTsKKyAgICAgICAgZGVzYyA9IGxkbF9waHlzKHRhYmxlKTsKKyAgICAgICAgYXAgPSAoKGRlc2MgPj4gNCkgJiAzKSB8ICgoZGVzYyA+PiA3KSAmIDQpOworICAgICAgICBzd2l0Y2ggKGRlc2MgJiAzKSB7CisgICAgICAgIGNhc2UgMDogLyogUGFnZSB0cmFuc2xhdGlvbiBmYXVsdC4gICovCisgICAgICAgICAgICBjb2RlID0gNzsKKyAgICAgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgIGNhc2UgMTogLyogNjRrIHBhZ2UuICAqLworICAgICAgICAgICAgcGh5c19hZGRyID0gKGRlc2MgJiAweGZmZmYwMDAwKSB8IChhZGRyZXNzICYgMHhmZmZmKTsKKyAgICAgICAgICAgIHhuID0gZGVzYyAmICgxIDw8IDE1KTsKKyAgICAgICAgICAgICpwYWdlX3NpemUgPSAweDEwMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogY2FzZSAzOiAvKiA0ayBwYWdlLiAgKi8KKyAgICAgICAgICAgIHBoeXNfYWRkciA9IChkZXNjICYgMHhmZmZmZjAwMCkgfCAoYWRkcmVzcyAmIDB4ZmZmKTsKKyAgICAgICAgICAgIHhuID0gZGVzYyAmIDE7CisgICAgICAgICAgICAqcGFnZV9zaXplID0gMHgxMDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBOZXZlciBoYXBwZW5zLCBidXQgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIHRlbGwuICAqLworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBjb2RlID0gMTU7CisgICAgfQorICAgIGlmIChkb21haW4gPT0gMykgeworICAgICAgICAqcHJvdCA9IFBBR0VfUkVBRCB8IFBBR0VfV1JJVEUgfCBQQUdFX0VYRUM7CisgICAgfSBlbHNlIHsKKyAgICBpZiAoeG4gJiYgYWNjZXNzX3R5cGUgPT0gMikKKyAgICAgICAgZ290byBkb19mYXVsdDsKKworICAgIC8qIFRoZSBzaW1wbGlmaWVkIG1vZGVsIHVzZXMgQVBbMF0gYXMgYW4gYWNjZXNzIGNvbnRyb2wgYml0LiAgKi8KKyAgICBpZiAoKGVudi0+Y3AxNS5jMV9zeXMgJiAoMSA8PCAyOSkpICYmIChhcCAmIDEpID09IDApIHsKKyAgICAgICAgLyogQWNjZXNzIGZsYWcgZmF1bHQuICAqLworICAgICAgICBjb2RlID0gKGNvZGUgPT0gMTUpID8gNiA6IDM7CisgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgfQorICAgICpwcm90ID0gY2hlY2tfYXAoZW52LCBhcCwgZG9tYWluLCBhY2Nlc3NfdHlwZSwgaXNfdXNlcik7CisgICAgaWYgKCEqcHJvdCkgeworICAgICAgICAvKiBBY2Nlc3MgcGVybWlzc2lvbiBmYXVsdC4gICovCisgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bikgeworICAgICAgICAgICAgKnByb3QgfD0gUEFHRV9FWEVDOworICAgICAgICB9CisgICAgfQorICAgICpwaHlzX3B0ciA9IHBoeXNfYWRkcjsKKyAgICByZXR1cm4gMDsKK2RvX2ZhdWx0OgorICAgIHJldHVybiBjb2RlIHwgKGRvbWFpbiA8PCA0KTsKK30KKworc3RhdGljIGludCBnZXRfcGh5c19hZGRyX21wdShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhZGRyZXNzLCBpbnQgYWNjZXNzX3R5cGUsCisJCQkgICAgIGludCBpc191c2VyLCB1aW50MzJfdCAqcGh5c19wdHIsIGludCAqcHJvdCkKK3sKKyAgICBpbnQgbjsKKyAgICB1aW50MzJfdCBtYXNrOworICAgIHVpbnQzMl90IGJhc2U7CisKKyAgICAqcGh5c19wdHIgPSBhZGRyZXNzOworICAgIGZvciAobiA9IDc7IG4gPj0gMDsgbi0tKSB7CisJYmFzZSA9IGVudi0+Y3AxNS5jNl9yZWdpb25bbl07CisJaWYgKChiYXNlICYgMSkgPT0gMCkKKwkgICAgY29udGludWU7CisJbWFzayA9IDEgPDwgKChiYXNlID4+IDEpICYgMHgxZik7CisJLyogS2VlcCB0aGlzIHNoaWZ0IHNlcGFyYXRlIGZyb20gdGhlIGFib3ZlIHRvIGF2b2lkIGFuCisJICAgKHVuZGVmaW5lZCkgPDwgMzIuICAqLworCW1hc2sgPSAobWFzayA8PCAxKSAtIDE7CisJaWYgKCgoYmFzZSBeIGFkZHJlc3MpICYgfm1hc2spID09IDApCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobiA8IDApCisJcmV0dXJuIDI7CisKKyAgICBpZiAoYWNjZXNzX3R5cGUgPT0gMikgeworCW1hc2sgPSBlbnYtPmNwMTUuYzVfaW5zbjsKKyAgICB9IGVsc2UgeworCW1hc2sgPSBlbnYtPmNwMTUuYzVfZGF0YTsKKyAgICB9CisgICAgbWFzayA9IChtYXNrID4+IChuICogNCkpICYgMHhmOworICAgIHN3aXRjaCAobWFzaykgeworICAgIGNhc2UgMDoKKwlyZXR1cm4gMTsKKyAgICBjYXNlIDE6CisJaWYgKGlzX3VzZXIpCisJICByZXR1cm4gMTsKKwkqcHJvdCA9IFBBR0VfUkVBRCB8IFBBR0VfV1JJVEU7CisJYnJlYWs7CisgICAgY2FzZSAyOgorCSpwcm90ID0gUEFHRV9SRUFEOworCWlmICghaXNfdXNlcikKKwkgICAgKnByb3QgfD0gUEFHRV9XUklURTsKKwlicmVhazsKKyAgICBjYXNlIDM6CisJKnByb3QgPSBQQUdFX1JFQUQgfCBQQUdFX1dSSVRFOworCWJyZWFrOworICAgIGNhc2UgNToKKwlpZiAoaXNfdXNlcikKKwkgICAgcmV0dXJuIDE7CisJKnByb3QgPSBQQUdFX1JFQUQ7CisJYnJlYWs7CisgICAgY2FzZSA2OgorCSpwcm90ID0gUEFHRV9SRUFEOworCWJyZWFrOworICAgIGRlZmF1bHQ6CisJLyogQmFkIHBlcm1pc3Npb24uICAqLworCXJldHVybiAxOworICAgIH0KKyAgICAqcHJvdCB8PSBQQUdFX0VYRUM7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfR0xFUzIKK2ludCBnZXRfcGh5c19hZGRyKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBpbnQgYWNjZXNzX3R5cGUsIGludCBpc191c2VyLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBoeXNfcHRyLCBpbnQgKnByb3QsCisgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgKnBhZ2Vfc2l6ZSk7CisjZWxzZQorc3RhdGljCisjZW5kaWYKK2ludCBnZXRfcGh5c19hZGRyKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBpbnQgYWNjZXNzX3R5cGUsIGludCBpc191c2VyLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnBoeXNfcHRyLCBpbnQgKnByb3QsCisgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgKnBhZ2Vfc2l6ZSkKK3sKKyAgICAvKiBGYXN0IENvbnRleHQgU3dpdGNoIEV4dGVuc2lvbi4gICovCisgICAgaWYgKGFkZHJlc3MgPCAweDAyMDAwMDAwKQorICAgICAgICBhZGRyZXNzICs9IGVudi0+Y3AxNS5jMTNfZmNzZTsKKworICAgIGlmICgoZW52LT5jcDE1LmMxX3N5cyAmIDEpID09IDApIHsKKyAgICAgICAgLyogTU1VL01QVSBkaXNhYmxlZC4gICovCisgICAgICAgICpwaHlzX3B0ciA9IGFkZHJlc3M7CisgICAgICAgICpwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURSB8IFBBR0VfRVhFQzsKKyAgICAgICAgKnBhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKSB7CisgICAgICAgICpwYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOworICAgIHJldHVybiBnZXRfcGh5c19hZGRyX21wdShlbnYsIGFkZHJlc3MsIGFjY2Vzc190eXBlLCBpc191c2VyLCBwaHlzX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdCk7CisgICAgfSBlbHNlIGlmIChlbnYtPmNwMTUuYzFfc3lzICYgKDEgPDwgMjMpKSB7CisgICAgICAgIHJldHVybiBnZXRfcGh5c19hZGRyX3Y2KGVudiwgYWRkcmVzcywgYWNjZXNzX3R5cGUsIGlzX3VzZXIsIHBoeXNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LCBwYWdlX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBnZXRfcGh5c19hZGRyX3Y1KGVudiwgYWRkcmVzcywgYWNjZXNzX3R5cGUsIGlzX3VzZXIsIHBoeXNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LCBwYWdlX3NpemUpOworICAgIH0KK30KKworaW50IGNwdV9hcm1faGFuZGxlX21tdV9mYXVsdCAoQ1BVQVJNU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjZXNzX3R5cGUsIGludCBtbXVfaWR4KQoreworICAgIHVpbnQzMl90IHBoeXNfYWRkciA9IDA7CisgICAgdGFyZ2V0X3Vsb25nIHBhZ2Vfc2l6ZSA9IDA7CisgICAgaW50IHByb3QgPSAwOworICAgIGludCByZXQsIGlzX3VzZXI7CisKKyAgICBpc191c2VyID0gbW11X2lkeCA9PSBNTVVfVVNFUl9JRFg7CisgICAgcmV0ID0gZ2V0X3BoeXNfYWRkcihlbnYsIGFkZHJlc3MsIGFjY2Vzc190eXBlLCBpc191c2VyLCAmcGh5c19hZGRyLCAmcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwYWdlX3NpemUpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAvKiBNYXAgYSBzaW5nbGUgW3N1Yl1wYWdlLiAgKi8KKyAgICAgICAgcGh5c19hZGRyICY9IH4odWludDMyX3QpMHgzZmY7CisgICAgICAgIGFkZHJlc3MgJj0gfih1aW50MzJfdCkweDNmZjsKKyAgICAgICAgdGxiX3NldF9wYWdlIChlbnYsIGFkZHJlc3MsIHBoeXNfYWRkciwgcHJvdCB8IFBBR0VfRVhFQywgbW11X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYWNjZXNzX3R5cGUgPT0gMikgeworICAgICAgICBlbnYtPmNwMTUuYzVfaW5zbiA9IHJldDsKKyAgICAgICAgZW52LT5jcDE1LmM2X2luc24gPSBhZGRyZXNzOworICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfUFJFRkVUQ0hfQUJPUlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5jcDE1LmM1X2RhdGEgPSByZXQ7CisgICAgICAgIGlmIChhY2Nlc3NfdHlwZSA9PSAxICYmIGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpKQorICAgICAgICAgICAgZW52LT5jcDE1LmM1X2RhdGEgfD0gKDEgPDwgMTEpOworICAgICAgICBlbnYtPmNwMTUuYzZfZGF0YSA9IGFkZHJlc3M7CisgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9EQVRBX0FCT1JUOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworaHdhZGRyIGNwdV9nZXRfcGh5c19wYWdlX2RlYnVnKENQVUFSTVN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIHVpbnQzMl90IHBoeXNfYWRkciA9IDA7CisgICAgdGFyZ2V0X3Vsb25nIHBhZ2Vfc2l6ZTsKKyAgICBpbnQgcHJvdDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZ2V0X3BoeXNfYWRkcihlbnYsIGFkZHIsIDAsIDAsICZwaHlzX2FkZHIsICZwcm90LCAmcGFnZV9zaXplKTsKKworICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHBoeXNfYWRkcjsKK30KKworLyogUmV0dXJuIGJhc2ljIE1QVSBhY2Nlc3MgcGVybWlzc2lvbiBiaXRzLiAgKi8KK3N0YXRpYyB1aW50MzJfdCBzaW1wbGVfbXB1X2FwX2JpdHModWludDMyX3QgdmFsKQoreworICAgIHVpbnQzMl90IHJldDsKKyAgICB1aW50MzJfdCBtYXNrOworICAgIGludCBpOworICAgIHJldCA9IDA7CisgICAgbWFzayA9IDM7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDIpIHsKKyAgICAgICAgcmV0IHw9ICh2YWwgPj4gaSkgJiBtYXNrOworICAgICAgICBtYXNrIDw8PSAyOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBQYWQgYmFzaWMgTVBVIGFjY2VzcyBwZXJtaXNzaW9uIGJpdHMgdG8gZXh0ZW5kZWQgZm9ybWF0LiAgKi8KK3N0YXRpYyB1aW50MzJfdCBleHRlbmRlZF9tcHVfYXBfYml0cyh1aW50MzJfdCB2YWwpCit7CisgICAgdWludDMyX3QgcmV0OworICAgIHVpbnQzMl90IG1hc2s7CisgICAgaW50IGk7CisgICAgcmV0ID0gMDsKKyAgICBtYXNrID0gMzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikgeworICAgICAgICByZXQgfD0gKHZhbCAmIG1hc2spIDw8IGk7CisgICAgICAgIG1hc2sgPDw9IDI7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgSEVMUEVSKHNldF9jcDE1KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBpbnNuLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IG9wMTsKKyAgICBpbnQgb3AyOworICAgIGludCBjcm07CisKKyAgICBvcDEgPSAoaW5zbiA+PiAyMSkgJiA3OworICAgIG9wMiA9IChpbnNuID4+IDUpICYgNzsKKyAgICBjcm0gPSBpbnNuICYgMHhmOworICAgIHN3aXRjaCAoKGluc24gPj4gMTYpICYgMHhmKSB7CisgICAgY2FzZSAwOgorICAgICAgICAvKiBJRCBjb2Rlcy4gICovCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1hTQ0FMRSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykKKyAgICAgICAgICAgICAgICAmJiBvcDEgPT0gMiAmJiBjcm0gPT0gMCAmJiBvcDIgPT0gMCkgeworICAgICAgICAgICAgZW52LT5jcDE1LmMwX2Nzc2VsID0gdmFsICYgMHhmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIGNhc2UgMTogLyogU3lzdGVtIGNvbmZpZ3VyYXRpb24uICAqLworICAgICAgICBzd2l0Y2ggKGNybSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX09NQVBDUCkpCisgICAgICAgICAgICBvcDIgPSAwOworICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1hTQ0FMRSkpCisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxX3N5cyA9IHZhbDsKKyAgICAgICAgICAgIC8qID8/PyBMb3RzIG9mIHRoZXNlIGJpdHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4gICovCisgICAgICAgICAgICAvKiBUaGlzIG1heSBlbmFibGUvZGlzYWJsZSB0aGUgTU1VLCBzbyBkbyBhIFRMQiBmbHVzaC4gICovCisgICAgICAgICAgICB0bGJfZmx1c2goZW52LCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBBdXhpbGlhcnkgY29udHJvbCByZWdpc3Rlci4gICovCisgICAgICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9YU0NBTEUpKSB7CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxX3hzY2FsZWF1eGNyID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9YU0NBTEUpKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIGlmIChlbnYtPmNwMTUuYzFfY29wcm9jICE9IHZhbCkgeworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jMV9jb3Byb2MgPSB2YWw7CisgICAgICAgICAgICAgICAgLyogPz8/IElzIHRoaXMgc2FmZSB3aGVuIGNhbGxlZCBmcm9tIHdpdGhpbiBhIFRCPyAgKi8KKyAgICAgICAgICAgICAgICB0Yl9mbHVzaChlbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9UUlVTVFpPTkUpCisgICAgICAgICAgICAgICAgfHwgKGVudi0+dW5jYWNoZWRfY3BzciAmIENQU1JfTSkgPT0gQVJNX0NQVV9NT0RFX1VTUikKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBTZWN1cmUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZW52LT5jcDE1LmMxX3NlY2ZnICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jMV9zZWNmZyA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogU2VjdXJlIGRlYnVnIGVuYWJsZSByZWdpc3Rlci4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZW52LT5jcDE1LmMxX3NlY2ZnICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jMV9zZWRiZyA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLyogTm9uc2VjdXJlIGFjY2VzcyBjb250cm9sIHJlZ2lzdGVyLiAqLworICAgICAgICAgICAgICAgIGlmIChlbnYtPmNwMTUuYzFfc2VjZmcgJiAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxX25zZWFjID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIE1NVSBQYWdlIHRhYmxlIGNvbnRyb2wgLyBNUFUgY2FjaGUgY29udHJvbC4gICovCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMyX2RhdGEgPSB2YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMyX2luc24gPSB2YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgc3dpdGNoIChvcDIpIHsKKwkgICAgY2FzZSAwOgorCQllbnYtPmNwMTUuYzJfYmFzZTAgPSB2YWw7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCWVudi0+Y3AxNS5jMl9iYXNlMSA9IHZhbDsKKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB2YWwgJj0gNzsKKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzJfY29udHJvbCA9IHZhbDsKKwkJZW52LT5jcDE1LmMyX21hc2sgPSB+KCgodWludDMyX3QpMHhmZmZmZmZmZnUpID4+IHZhbCk7CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMyX2Jhc2VfbWFzayA9IH4oKHVpbnQzMl90KTB4M2ZmZnUgPj4gdmFsKTsKKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWdvdG8gYmFkX3JlZzsKKwkgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogTU1VIERvbWFpbiBhY2Nlc3MgY29udHJvbCAvIE1QVSB3cml0ZSBidWZmZXIgY29udHJvbC4gICovCisgICAgICAgIGVudi0+Y3AxNS5jMyA9IHZhbDsKKyAgICAgICAgdGxiX2ZsdXNoKGVudiwgMSk7IC8qIEZsdXNoIFRMQiBhcyBkb21haW4gbm90IHRyYWNrZWQgaW4gVExCICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLyogUmVzZXJ2ZWQuICAqLworICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgY2FzZSA1OiAvKiBNTVUgRmF1bHQgc3RhdHVzIC8gTVBVIGFjY2VzcyBwZXJtaXNzaW9uLiAgKi8KKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkKKyAgICAgICAgICAgIG9wMiA9IDA7CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpCisgICAgICAgICAgICAgICAgdmFsID0gZXh0ZW5kZWRfbXB1X2FwX2JpdHModmFsKTsKKyAgICAgICAgICAgIGVudi0+Y3AxNS5jNV9kYXRhID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpCisgICAgICAgICAgICAgICAgdmFsID0gZXh0ZW5kZWRfbXB1X2FwX2JpdHModmFsKTsKKyAgICAgICAgICAgIGVudi0+Y3AxNS5jNV9pbnNuID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIGVudi0+Y3AxNS5jNV9kYXRhID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIGVudi0+Y3AxNS5jNV9pbnNuID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiBNTVUgRmF1bHQgYWRkcmVzcyAvIE1QVSBiYXNlL3NpemUuICAqLworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKSB7CisgICAgICAgICAgICBpZiAoY3JtID49IDgpCisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgZW52LT5jcDE1LmM2X3JlZ2lvbltjcm1dID0gdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkKKyAgICAgICAgICAgICAgICBvcDIgPSAwOworICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzZfZGF0YSA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogPz8/IFRoaXMgaXMgV0ZBUiBvbiBhcm12NiAqLworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jNl9pbnNuID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAvKiBDYWNoZSBjb250cm9sLiAgKi8KKyAgICAgICAgZW52LT5jcDE1LmMxNV9pX21heCA9IDB4MDAwOworICAgICAgICBlbnYtPmNwMTUuYzE1X2lfbWluID0gMHhmZjA7CisgICAgICAgIGlmIChvcDEgIT0gMCkgeworICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICB9CisgICAgICAgIC8qIE5vIGNhY2hlLCBzbyBub3RoaW5nIHRvIGRvIGV4Y2VwdCBWQS0+UEEgdHJhbnNsYXRpb25zLiAqLworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WQVBBKSkgeworICAgICAgICAgICAgc3dpdGNoIChjcm0pIHsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM3X3BhciA9IHZhbCAmIDB4ZmZmZmY2ZmY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM3X3BhciA9IHZhbCAmIDB4ZmZmZmYxZmY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgcGh5c19hZGRyID0gMDsKKyAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgcGFnZV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgcHJvdDsKKyAgICAgICAgICAgICAgICBpbnQgcmV0LCBpc191c2VyID0gb3AyICYgMjsKKyAgICAgICAgICAgICAgICBpbnQgYWNjZXNzX3R5cGUgPSBvcDIgJiAxOworCisgICAgICAgICAgICAgICAgaWYgKG9wMiAmIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogT3RoZXIgc3RhdGVzIGFyZSBvbmx5IGF2YWlsYWJsZSB3aXRoIFRydXN0Wm9uZSAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldCA9IGdldF9waHlzX2FkZHIoZW52LCB2YWwsIGFjY2Vzc190eXBlLCBpc191c2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNfYWRkciwgJnByb3QsICZwYWdlX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSBkbyBub3Qgc2V0IGFueSBhdHRyaWJ1dGUgYml0cyBpbiB0aGUgUEFSICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlX3NpemUgPT0gKDEgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM3X3BhciA9IChwaHlzX2FkZHIgJiAweGZmMDAwMDAwKSB8IDEgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jN19wYXIgPSBwaHlzX2FkZHIgJiAweGZmZmZmMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM3X3BhciA9ICgocmV0ICYgKDEwIDw8IDEpKSA+PiA1KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJldCAmICgxMiA8PCAxKSkgPj4gNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZXQgJiAweGYpIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAvKiBNTVUgVExCIGNvbnRyb2wuICAqLworICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIDA6IC8qIEludmFsaWRhdGUgYWxsLiAgKi8KKyAgICAgICAgICAgIHRsYl9mbHVzaChlbnYsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogSW52YWxpZGF0ZSBzaW5nbGUgVExCIGVudHJ5LiAgKi8KKyAgICAgICAgICAgIHRsYl9mbHVzaF9wYWdlKGVudiwgdmFsICYgVEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBJbnZhbGlkYXRlIG9uIEFTSUQuICAqLworICAgICAgICAgICAgdGxiX2ZsdXNoKGVudiwgdmFsID09IDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogSW52YWxpZGF0ZSBzaW5nbGUgZW50cnkgb24gTVZBLiAgKi8KKyAgICAgICAgICAgIC8qID8/PyBUaGlzIGlzIGxpa2UgY2FzZSAxLCBidXQgaWdub3JlcyBBU0lELiAgKi8KKyAgICAgICAgICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9PTUFQQ1ApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1NUUk9OR0FSTSkpCisgICAgICAgICAgICBicmVhazsgLyogSWdub3JlIFJlYWRCdWZmZXIgYWNjZXNzICovCisgICAgICAgIHN3aXRjaCAoY3JtKSB7CisgICAgICAgIGNhc2UgMDogLyogQ2FjaGUgbG9ja2Rvd24uICAqLworCSAgICBzd2l0Y2ggKG9wMSkgeworCSAgICBjYXNlIDA6IC8qIEwxIGNhY2hlLiAgKi8KKwkJc3dpdGNoIChvcDIpIHsKKwkJY2FzZSAwOgorCQkgICAgZW52LT5jcDE1LmM5X2RhdGEgPSB2YWw7CisJCSAgICBicmVhazsKKwkJY2FzZSAxOgorCQkgICAgZW52LT5jcDE1LmM5X2luc24gPSB2YWw7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIGdvdG8gYmFkX3JlZzsKKwkJfQorCQlicmVhazsKKwkgICAgY2FzZSAxOiAvKiBMMiBjYWNoZS4gICovCisgICAgICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIEwyIGNhY2hlIGxvY2tkb3duICovCisgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBMMiBjYWNoZSBhdXhpbGlhcnkgY29udHJvbCAqLworICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIH0KKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWdvdG8gYmFkX3JlZzsKKwkgICAgfQorCSAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBUQ00gbWVtb3J5IHJlZ2lvbiByZWdpc3RlcnMuICAqLworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvKiBOb3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICBjYXNlIDEyOiAvKiBQZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgKi8KKyAgICAgICAgICAgIC8qIFBlcmZvcm1hbmNlIG1vbml0b3JzIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGluIHY3LAorICAgICAgICAgICAgICogYnV0IHdpdGggYW4gQVJNIHJlY29tbWVuZGVkIHNldCBvZiByZWdpc3RlcnMsIHdoaWNoIHdlCisgICAgICAgICAgICAgKiBmb2xsb3cgKGFsdGhvdWdoIHdlIGRvbid0IGFjdHVhbGx5IGltcGxlbWVudCBhbnkgY291bnRlcnMpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBwZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAvKiBvbmx5IHRoZSBEUCwgWCwgRCBhbmQgRSBiaXRzIGFyZSB3cml0YWJsZSAqLworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jOV9wbWNyICY9IH4weDM5OworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jOV9wbWNyIHw9ICh2YWwgJiAweDM5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogQ291bnQgZW5hYmxlIHNldCByZWdpc3RlciAqLworICAgICAgICAgICAgICAgIHZhbCAmPSAoMSA8PCAzMSk7CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM5X3BtY250ZW4gfD0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBDb3VudCBlbmFibGUgY2xlYXIgKi8KKyAgICAgICAgICAgICAgICB2YWwgJj0gKDEgPDwgMzEpOworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jOV9wbWNudGVuICY9IH52YWw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8qIE92ZXJmbG93IGZsYWcgc3RhdHVzICovCisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM5X3Btb3ZzciAmPSB+dmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBTb2Z0d2FyZSBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAvKiBSQVovV0kgc2luY2Ugd2UgZG9uJ3QgaW1wbGVtZW50IHRoZSBzb2Z0d2FyZS1jb3VudCBldmVudCAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiAvKiBFdmVudCBjb3VudGVyIHNlbGVjdGlvbiByZWdpc3RlciAqLworICAgICAgICAgICAgICAgIC8qIFNpbmNlIHdlIGRvbid0IGltcGxlbWVudCBhbnkgZXZlbnRzLCB3cml0aW5nIHRvIHRoaXMgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgKiBpcyBhY3R1YWxseSBVTlBSRURJQ1RBQkxFLiBTbyB3ZSBjaG9vc2UgdG8gUkFaL1dJLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzogLyogUGVyZm9ybWFuY2UgY291bnRlcnMgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBDeWNsZSBjb3VudCByZWdpc3Rlcjogbm90IGltcGxlbWVudGVkLCBzbyBSQVovV0kgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLyogRXZlbnQgdHlwZSBzZWxlY3QgKi8KKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzlfcG14ZXZ0eXBlciA9IHZhbCAmIDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIEV2ZW50IGNvdW50IHJlZ2lzdGVyICovCisgICAgICAgICAgICAgICAgLyogVW5pbXBsZW1lbnRlZCAod2UgaGF2ZSBubyBldmVudHMpLCBSQVovV0kgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6IC8qIFBlcmZvcm1hbmNlIG1vbml0b3IgY29udHJvbCAqLworICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KSkgeworICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIHVzZXIgZW5hYmxlICovCisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM5X3BtdXNlcmVuciA9IHZhbCAmIDE7CisgICAgICAgICAgICAgICAgLyogY2hhbmdlcyBhY2Nlc3MgcmlnaHRzIGZvciBjcCByZWdpc3RlcnMsIHNvIGZsdXNoIHRicyAqLworICAgICAgICAgICAgICAgIHRiX2ZsdXNoKGVudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8qIGludGVycnVwdCBlbmFibGUgc2V0ICovCisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBubyBldmVudCBjb3VudGVycyBzbyBvbmx5IHRoZSBDIGJpdCBjYW4gYmUgY2hhbmdlZCAqLworICAgICAgICAgICAgICAgIHZhbCAmPSAoMSA8PCAzMSk7CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmM5X3BtaW50ZW4gfD0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBpbnRlcnJ1cHQgZW5hYmxlIGNsZWFyICovCisgICAgICAgICAgICAgICAgdmFsICY9ICgxIDw8IDMxKTsKKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzlfcG1pbnRlbiAmPSB+dmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDogLyogTU1VIFRMQiBsb2NrZG93bi4gICovCisgICAgICAgIC8qID8/PyBUTEIgbG9ja2Rvd24gbm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjogLyogUmVzZXJ2ZWQuICAqLworICAgICAgICBpZiAoIW9wMSAmJiAhY3JtKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9UUlVTVFpPTkUpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxMl92YmFyID0gdmFsICYgfjB4MWY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RSVVNUWk9ORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIShlbnYtPmNwMTUuYzFfc2VjZmcgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzEyX212YmFyID0gdmFsICYgfjB4MWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgY2FzZSAxMzogLyogUHJvY2VzcyBJRC4gICovCisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIFVubGlrZSByZWFsIGhhcmR3YXJlIHRoZSBxZW11IFRMQiB1c2VzIHZpcnR1YWwgYWRkcmVzc2VzLAorICAgICAgICAgICAgICAgbm90IG1vZGlmaWVkIHZpcnR1YWwgYWRkcmVzc2VzLCBzbyB0aGlzIGNhdXNlcyBhIFRMQiBmbHVzaC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGVudi0+Y3AxNS5jMTNfZmNzZSAhPSB2YWwpCisgICAgICAgICAgICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgICAgICAgICAgZW52LT5jcDE1LmMxM19mY3NlID0gdmFsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8qIFRoaXMgY2hhbmdlcyB0aGUgQVNJRCwgc28gZG8gYSBUTEIgZmx1c2guICAqLworICAgICAgICAgICAgaWYgKGVudi0+Y3AxNS5jMTNfY29udGV4dCAhPSB2YWwKKyAgICAgICAgICAgICAgICAmJiAhYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKQorICAgICAgICAgICAgICB0bGJfZmx1c2goZW52LCAwKTsKKyAgICAgICAgICAgIGVudi0+Y3AxNS5jMTNfY29udGV4dCA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6IC8qIFJlc2VydmVkLiAgKi8KKyAgICAgICAgZ290byBiYWRfcmVnOworICAgIGNhc2UgMTU6IC8qIEltcGxlbWVudGF0aW9uIHNwZWNpZmljLiAgKi8KKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKSkgeworICAgICAgICAgICAgaWYgKG9wMiA9PSAwICYmIGNybSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudi0+Y3AxNS5jMTVfY3BhciAhPSAodmFsICYgMHgzZmZmKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBDaGFuZ2VzIGNwMCB0byBjcDEzIGJlaGF2aW9yLCBzbyBuZWVkcyBhIFRCIGZsdXNoLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgdGJfZmx1c2goZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxNV9jcGFyID0gdmFsICYgMHgzZmZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9PTUFQQ1ApKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNybSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBTZXQgVEk5MjVUIGNvbmZpZ3VyYXRpb24uICAqLworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jMTVfdGljb25maWcgPSB2YWwgJiAweGU3OworICAgICAgICAgICAgICAgIGVudi0+Y3AxNS5jMF9jcHVpZCA9ICh2YWwgJiAoMSA8PCA1KSkgPyAvKiBPU19UWVBFIGJpdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgQVJNX0NQVUlEX1RJOTE1VCA6IEFSTV9DUFVJRF9USTkyNVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIFNldCBJX21heC4gICovCisgICAgICAgICAgICAgICAgZW52LT5jcDE1LmMxNV9pX21heCA9IHZhbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogU2V0IElfbWluLiAgKi8KKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzE1X2lfbWluID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvKiBTZXQgdGhyZWFkLUlELiAgKi8KKyAgICAgICAgICAgICAgICBlbnYtPmNwMTUuYzE1X3RocmVhZGlkID0gdmFsICYgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiAvKiBXYWl0LWZvci1pbnRlcnJ1cHQgKGRlcHJlY2F0ZWQpLiAgKi8KKyAgICAgICAgICAgICAgICBjcHVfaW50ZXJydXB0KEVOVl9HRVRfQ1BVKGVudiksIENQVV9JTlRFUlJVUFRfSEFMVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworYmFkX3JlZzoKKyAgICAvKiA/Pz8gRm9yIGRlYnVnZ2luZyBvbmx5LiAgU2hvdWxkIHJhaXNlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uLiAgKi8KKyAgICBjcHVfYWJvcnQoZW52LCAiVW5pbXBsZW1lbnRlZCBjcDE1IHJlZ2lzdGVyIHdyaXRlIChjJWQsIGMlZCwgeyVkLCAlZH0pXG4iLAorICAgICAgICAgICAgICAoaW5zbiA+PiAxNikgJiAweGYsIGNybSwgb3AxLCBvcDIpOworfQorCit1aW50MzJfdCBIRUxQRVIoZ2V0X2NwMTUpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGluc24pCit7CisgICAgaW50IG9wMTsKKyAgICBpbnQgb3AyOworICAgIGludCBjcm07CisKKyAgICBvcDEgPSAoaW5zbiA+PiAyMSkgJiA3OworICAgIG9wMiA9IChpbnNuID4+IDUpICYgNzsKKyAgICBjcm0gPSBpbnNuICYgMHhmOworICAgIHN3aXRjaCAoKGluc24gPj4gMTYpICYgMHhmKSB7CisgICAgY2FzZSAwOiAvKiBJRCBjb2Rlcy4gICovCisgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHN3aXRjaCAoY3JtKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIERldmljZSBJRC4gICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzBfY3B1aWQ7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBDYWNoZSBUeXBlLiAgKi8KKwkJICAgIHJldHVybiBlbnYtPmNwMTUuYzBfY2FjaGV0eXBlOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogVENNIHN0YXR1cy4gICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgMzogLyogVExCIHR5cGUgcmVnaXN0ZXIuICAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogTm8gbG9ja2FibGUgVExCIGVudHJpZXMuICAqLworICAgICAgICAgICAgICAgIGNhc2UgNTogLyogTVBJRFIgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogVGhlIE1QSURSIHdhcyBzdGFuZGFyZGlzZWQgaW4gdjc7IHByaW9yIHRvCisgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgaXQgd2FzIGltcGxlbWVudGVkIG9ubHkgaW4gdGhlIDExTVBDb3JlLgorICAgICAgICAgICAgICAgICAgICAgKiBGb3IgYWxsIG90aGVyIHByZS12NyBjb3JlcyBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgQVJNX0NQVUlEKGVudikgPT0gQVJNX0NQVUlEX0FSTTExTVBDT1JFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXBpZHIgPSBFTlZfR0VUX0NQVShlbnYpLT5jcHVfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSBkb24ndCBzdXBwb3J0IHNldHRpbmcgY2x1c3RlciBJRCAoWzguLjExXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHRoZXNlIGJpdHMgYWx3YXlzIFJBWi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjdNUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGlkciB8PSAoMSA8PCAzMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29yZXMgd2hpY2ggYXJlIHVuaXByb2Nlc3NvciAobm9uLWNvaGVyZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1dCBzdGlsbCBpbXBsZW1lbnQgdGhlIE1QIGV4dGVuc2lvbnMgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYml0IDMwLiAoRm9yIGluc3RhbmNlLCBBOVVQLikgSG93ZXZlciB3ZSBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vdCBjdXJyZW50bHkgbW9kZWwgYW55IG9mIHRob3NlIGNvcmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1waWRyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIHVuaW1wbGVtZW50ZWQtcmVnIGNhc2UgKi8KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNikpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMwX2MxW29wMl07CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzBfYzJbb3AyXTsKKyAgICAgICAgICAgIGNhc2UgMzogY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjogY2FzZSA3OgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogVGhlc2UgcmVnaXN0ZXJzIGFyZW4ndCBkb2N1bWVudGVkIG9uIGFybTExIGNvcmVzLiAgSG93ZXZlcgorICAgICAgICAgICAgICAgTGludXggbG9va3MgYXQgdGhlbSBhbnl3YXkuICAqLworICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICBpZiAoY3JtICE9IDApCisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMwX2Njc2lkW2Vudi0+Y3AxNS5jMF9jc3NlbF07CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMF9jbGlkOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAob3AyICE9IDAgfHwgY3JtICE9IDApCisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMF9jc3NlbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIFN5c3RlbSBjb25maWd1cmF0aW9uLiAgKi8KKyAgICAgICAgc3dpdGNoIChjcm0pIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9PTUFQQ1ApKQorICAgICAgICAgICAgb3AyID0gMDsKKyAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgY2FzZSAwOiAvKiBDb250cm9sIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzFfc3lzOworICAgICAgICBjYXNlIDE6IC8qIEF1eGlsaWFyeSBjb250cm9sIHJlZ2lzdGVyLiAgKi8KKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1hTQ0FMRSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMV94c2NhbGVhdXhjcjsKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9BVVhDUikpCisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgc3dpdGNoIChBUk1fQ1BVSUQoZW52KSkgeworICAgICAgICAgICAgY2FzZSBBUk1fQ1BVSURfQVJNMTAyNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIGNhc2UgQVJNX0NQVUlEX0FSTTExMzY6CisgICAgICAgICAgICBjYXNlIEFSTV9DUFVJRF9BUk0xMTM2X1IyOgorICAgICAgICAgICAgICAgIHJldHVybiA3OworICAgICAgICAgICAgY2FzZSBBUk1fQ1BVSURfQVJNMTFNUENPUkU6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjYXNlIEFSTV9DUFVJRF9DT1JURVhBODoKKyAgICAgICAgICAgICAgICBjYXNlIEFSTV9DUFVJRF9DT1JURVhBOF9SMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBjYXNlIEFSTV9DUFVJRF9DT1JURVhBOToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBDb3Byb2Nlc3NvciBhY2Nlc3MgcmVnaXN0ZXIuICAqLworICAgICAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMxX2NvcHJvYzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9UUlVTVFpPTkUpCisgICAgICAgICAgICAgICAgfHwgKGVudi0+dW5jYWNoZWRfY3BzciAmIENQU1JfTSkgPT0gQVJNX0NQVV9NT0RFX1VTUikKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBTZWN1cmUgY29uZmlndXJhdGlvbiByZWdpc3Rlci4gKi8KKyAgICAgICAgICAgICAgICBpZiAoZW52LT5jcDE1LmMxX3NlY2ZnICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzFfc2VjZmc7CisgICAgICAgICAgICBjYXNlIDE6IC8qIFNlY3VyZSBkZWJ1ZyBlbmFibGUgcmVnaXN0ZXIuICovCisgICAgICAgICAgICAgICAgaWYgKGVudi0+Y3AxNS5jMV9zZWNmZyAmIDEpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMxX3NlZGJnOworICAgICAgICAgICAgY2FzZSAyOiAvKiBOb25zZWN1cmUgYWNjZXNzIGNvbnRyb2wgcmVnaXN0ZXIuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMV9uc2VhYzsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBNTVUgUGFnZSB0YWJsZSBjb250cm9sIC8gTVBVIGNhY2hlIGNvbnRyb2wuICAqLworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzJfZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMyX2luc247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKwkgICAgc3dpdGNoIChvcDIpIHsKKwkgICAgY2FzZSAwOgorCQlyZXR1cm4gZW52LT5jcDE1LmMyX2Jhc2UwOworCSAgICBjYXNlIDE6CisJCXJldHVybiBlbnYtPmNwMTUuYzJfYmFzZTE7CisJICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMyX2NvbnRyb2w7CisJICAgIGRlZmF1bHQ6CisJCWdvdG8gYmFkX3JlZzsKKwkgICAgfQorCX0KKyAgICBjYXNlIDM6IC8qIE1NVSBEb21haW4gYWNjZXNzIGNvbnRyb2wgLyBNUFUgd3JpdGUgYnVmZmVyIGNvbnRyb2wuICAqLworICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMzOworICAgIGNhc2UgNDogLyogUmVzZXJ2ZWQuICAqLworICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgY2FzZSA1OiAvKiBNTVUgRmF1bHQgc3RhdHVzIC8gTVBVIGFjY2VzcyBwZXJtaXNzaW9uLiAgKi8KKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkKKyAgICAgICAgICAgIG9wMiA9IDA7CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsZV9tcHVfYXBfYml0cyhlbnYtPmNwMTUuYzVfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM1X2RhdGE7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpbXBsZV9tcHVfYXBfYml0cyhlbnYtPmNwMTUuYzVfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM1X2luc247CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NUFUpKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzVfZGF0YTsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpCisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jNV9pbnNuOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICB9CisgICAgY2FzZSA2OiAvKiBNTVUgRmF1bHQgYWRkcmVzcy4gICovCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX01QVSkpIHsKKyAgICAgICAgICAgIGlmIChjcm0gPj0gOCkKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM2X3JlZ2lvbltjcm1dOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkKKyAgICAgICAgICAgICAgICBvcDIgPSAwOworCSAgICBzd2l0Y2ggKG9wMikgeworCSAgICBjYXNlIDA6CisJCXJldHVybiBlbnYtPmNwMTUuYzZfZGF0YTsKKwkgICAgY2FzZSAxOgorCQlpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNikpIHsKKwkJICAgIC8qIFdhdGNocG9pbnQgRmF1bHQgQWRycmVzcy4gICovCisJCSAgICByZXR1cm4gMDsgLyogTm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgICAgICAgICB9CisJCSAgICAvKiBJbnN0cnVjdGlvbiBGYXVsdCBBZHJyZXNzLiAgKi8KKwkJICAgIC8qIEFybTkgZG9lc24ndCBoYXZlIGFuIElGQVIsIGJ1dCBpbXBsZW1lbnRpbmcgaXQgYW55d2F5CisJCSAgICAgICBzaG91bGRuJ3QgZG8gYW55IGhhcm0uICAqLworCQkgICAgcmV0dXJuIGVudi0+Y3AxNS5jNl9pbnNuOworCSAgICBjYXNlIDI6CisJCWlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KSkgeworCQkgICAgLyogSW5zdHJ1Y3Rpb24gRmF1bHQgQWRycmVzcy4gICovCisJCSAgICByZXR1cm4gZW52LT5jcDE1LmM2X2luc247CisJCX0KKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisJICAgIGRlZmF1bHQ6CisJCWdvdG8gYmFkX3JlZzsKKwkgICAgfQorICAgICAgICB9CisgICAgY2FzZSA3OiAvKiBDYWNoZSBjb250cm9sLiAgKi8KKyAgICAgICAgaWYgKGNybSA9PSA0ICYmIG9wMSA9PSAwICYmIG9wMiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM3X3BhcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChpbnNuID4+IDEyKSAmIDB4ZikgPT0gMHhmKSAvKiBjbGVhciBaRiBvbmx5IGlmIGRlc3RpbmF0aW9uIGlzIHIxNSAqLworICAgICAgICBlbnYtPlpGID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSA4OiAvKiBNTVUgVExCIGNvbnRyb2wuICAqLworICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgY2FzZSA5OgorICAgICAgICBzd2l0Y2ggKGNybSkgeworICAgICAgICBjYXNlIDA6IC8qIENhY2hlIGxvY2tkb3duICovCisgICAgICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBMMSBjYWNoZS4gICovCisgICAgICAgICAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzlfZGF0YTsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzlfaW5zbjsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAxOiAvKiBMMiBjYWNoZSAqLworICAgICAgICAgICAgICAgIGlmIChjcm0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEwyIExvY2tkb3duIGFuZCBBdXhpbGlhcnkgY29udHJvbC4gICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOiAvKiBQZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBwZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM5X3BtY3I7CisgICAgICAgICAgICBjYXNlIDE6IC8qIGNvdW50IGVuYWJsZSBzZXQgKi8KKyAgICAgICAgICAgIGNhc2UgMjogLyogY291bnQgZW5hYmxlIGNsZWFyICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jOV9wbWNudGVuOworICAgICAgICAgICAgY2FzZSAzOiAvKiBvdmVyZmxvdyBmbGFnIHN0YXR1cyAqLworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzlfcG1vdnNyOworICAgICAgICAgICAgY2FzZSA0OiAvKiBzb2Z0d2FyZSBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgIGNhc2UgNTogLyogZXZlbnQgY291bnRlciBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogVW5pbXBsZW1lbnRlZCwgUkFaL1dJICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAxMzogLyogUGVyZm9ybWFuY2UgY291bnRlcnMgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAxOiAvKiBFdmVudCB0eXBlIHNlbGVjdCAqLworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzlfcG14ZXZ0eXBlcjsKKyAgICAgICAgICAgIGNhc2UgMDogLyogQ3ljbGUgY291bnQgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgIGNhc2UgMjogLyogRXZlbnQgY291bnQgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAvKiBVbmltcGxlbWVudGVkLCBzbyBSQVovV0kgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBiYWRfcmVnOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIDE0OiAvKiBQZXJmb3JtYW5jZSBtb25pdG9yIGNvbnRyb2wgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiB1c2VyIGVuYWJsZSAqLworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzlfcG11c2VyZW5yOworICAgICAgICAgICAgY2FzZSAxOiAvKiBpbnRlcnJ1cHQgZW5hYmxlIHNldCAqLworICAgICAgICAgICAgY2FzZSAyOiAvKiBpbnRlcnJ1cHQgZW5hYmxlIGNsZWFyICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jOV9wbWludGVuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDogLyogTU1VIFRMQiBsb2NrZG93bi4gICovCisgICAgICAgIC8qID8/PyBUTEIgbG9ja2Rvd24gbm90IGltcGxlbWVudGVkLiAgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAxMTogLyogVENNIERNQSBjb250cm9sLiAgKi8KKyAgICBjYXNlIDEyOiAvKiBSZXNlcnZlZC4gICovCisgICAgICAgIGlmICghb3AxICYmICFjcm0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIHNlY3VyZSBvciBub25zZWN1cmUgdmVjdG9yIGJhc2UgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RSVVNUWk9ORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMTJfdmJhcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IC8qIG1vbml0b3IgdmVjdG9yIGJhc2UgYWRkcmVzcyAqLworICAgICAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RSVVNUWk9ORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMTJfbXZiYXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgY2FzZSAxMzogLyogUHJvY2VzcyBJRC4gICovCisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzEzX2Zjc2U7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzEzX2NvbnRleHQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICBjYXNlIDE0OiAvKiBSZXNlcnZlZC4gICovCisgICAgICAgIGdvdG8gYmFkX3JlZzsKKyAgICBjYXNlIDE1OiAvKiBJbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4gICovCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1hTQ0FMRSkpIHsKKyAgICAgICAgICAgIGlmIChvcDIgPT0gMCAmJiBjcm0gPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMxNV9jcGFyOworCisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfT01BUENQKSkgeworICAgICAgICAgICAgc3dpdGNoIChjcm0pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNhc2UgMTogLyogUmVhZCBUSTkyNVQgY29uZmlndXJhdGlvbi4gICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGVudi0+Y3AxNS5jMTVfdGljb25maWc7CisgICAgICAgICAgICBjYXNlIDI6IC8qIFJlYWQgSV9tYXguICAqLworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzE1X2lfbWF4OworICAgICAgICAgICAgY2FzZSAzOiAvKiBSZWFkIElfbWluLiAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmMxNV9pX21pbjsKKyAgICAgICAgICAgIGNhc2UgNDogLyogUmVhZCB0aHJlYWQtSUQuICAqLworICAgICAgICAgICAgICAgIHJldHVybiBlbnYtPmNwMTUuYzE1X3RocmVhZGlkOworICAgICAgICAgICAgY2FzZSA4OiAvKiBUSTkyNVRfc3RhdHVzICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBUT0RPOiBQZXJpcGhlcmFsIHBvcnQgcmVtYXAgcmVnaXN0ZXI6CisgICAgICAgICAgICAgKiBPbiBPTUFQMiBtY3IgcDE1LCAwLCBybiwgYzE1LCBjMiwgNCBzZXRzIHVwIHRoZSBpbnRlcnJ1cHQKKyAgICAgICAgICAgICAqIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzIGF0ICRybiAmIH4weGZmZiBhbmQgbWFwIHNpemUgb2YKKyAgICAgICAgICAgICAqIDB4MjAwIDw8ICgkcm4gJiAweGZmZiksIHdoZW4gTU1VIGlzIG9mZi4gICovCisgICAgICAgICAgICBnb3RvIGJhZF9yZWc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorYmFkX3JlZzoKKyAgICAvKiA/Pz8gRm9yIGRlYnVnZ2luZyBvbmx5LiAgU2hvdWxkIHJhaXNlIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXhjZXB0aW9uLiAgKi8KKyAgICBjcHVfYWJvcnQoZW52LCAiVW5pbXBsZW1lbnRlZCBjcDE1IHJlZ2lzdGVyIHJlYWQgKGMlZCwgYyVkLCB7JWQsICVkfSlcbiIsCisgICAgICAgICAgICAgIChpbnNuID4+IDE2KSAmIDB4ZiwgY3JtLCBvcDEsIG9wMik7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgSEVMUEVSKHNldF9yMTNfYmFua2VkKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBtb2RlLCB1aW50MzJfdCB2YWwpCit7CisgICAgaWYgKChlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX00pID09IG1vZGUpIHsKKyAgICAgICAgZW52LT5yZWdzWzEzXSA9IHZhbDsKKyAgICB9IGVsc2UgeworICAgIGVudi0+YmFua2VkX3IxM1tiYW5rX251bWJlcihlbnYsIG1vZGUpXSA9IHZhbDsKK30KK30KKwordWludDMyX3QgSEVMUEVSKGdldF9yMTNfYmFua2VkKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBtb2RlKQoreworICAgIGlmICgoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9NKSA9PSBtb2RlKSB7CisgICAgICAgIHJldHVybiBlbnYtPnJlZ3NbMTNdOworICAgIH0gZWxzZSB7CisgICAgcmV0dXJuIGVudi0+YmFua2VkX3IxM1tiYW5rX251bWJlcihlbnYsIG1vZGUpXTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEhFTFBFUih2N21fbXJzKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCByZWcpCit7CisgICAgc3dpdGNoIChyZWcpIHsKKyAgICBjYXNlIDA6IC8qIEFQU1IgKi8KKyAgICAgICAgcmV0dXJuIHhwc3JfcmVhZChlbnYpICYgMHhmODAwMDAwMDsKKyAgICBjYXNlIDE6IC8qIElBUFNSICovCisgICAgICAgIHJldHVybiB4cHNyX3JlYWQoZW52KSAmIDB4ZjgwMDAxZmY7CisgICAgY2FzZSAyOiAvKiBFQVBTUiAqLworICAgICAgICByZXR1cm4geHBzcl9yZWFkKGVudikgJiAweGZmMDBmYzAwOworICAgIGNhc2UgMzogLyogeFBTUiAqLworICAgICAgICByZXR1cm4geHBzcl9yZWFkKGVudikgJiAweGZmMDBmZGZmOworICAgIGNhc2UgNTogLyogSVBTUiAqLworICAgICAgICByZXR1cm4geHBzcl9yZWFkKGVudikgJiAweDAwMDAwMWZmOworICAgIGNhc2UgNjogLyogRVBTUiAqLworICAgICAgICByZXR1cm4geHBzcl9yZWFkKGVudikgJiAweDA3MDBmYzAwOworICAgIGNhc2UgNzogLyogSUVQU1IgKi8KKyAgICAgICAgcmV0dXJuIHhwc3JfcmVhZChlbnYpICYgMHgwNzAwZWRmZjsKKyAgICBjYXNlIDg6IC8qIE1TUCAqLworICAgICAgICByZXR1cm4gZW52LT52N20uY3VycmVudF9zcCA/IGVudi0+djdtLm90aGVyX3NwIDogZW52LT5yZWdzWzEzXTsKKyAgICBjYXNlIDk6IC8qIFBTUCAqLworICAgICAgICByZXR1cm4gZW52LT52N20uY3VycmVudF9zcCA/IGVudi0+cmVnc1sxM10gOiBlbnYtPnY3bS5vdGhlcl9zcDsKKyAgICBjYXNlIDE2OiAvKiBQUklNQVNLICovCisgICAgICAgIHJldHVybiAoZW52LT51bmNhY2hlZF9jcHNyICYgQ1BTUl9JKSAhPSAwOworICAgIGNhc2UgMTc6IC8qIEJBU0VQUkkgKi8KKyAgICBjYXNlIDE4OiAvKiBCQVNFUFJJX01BWCAqLworICAgICAgICByZXR1cm4gZW52LT52N20uYmFzZXByaTsKKyAgICBjYXNlIDE5OiAvKiBGQVVMVE1BU0sgKi8KKyAgICAgICAgcmV0dXJuIChlbnYtPnVuY2FjaGVkX2Nwc3IgJiBDUFNSX0YpICE9IDA7CisgICAgY2FzZSAyMDogLyogQ09OVFJPTCAqLworICAgICAgICByZXR1cm4gZW52LT52N20uY29udHJvbDsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiA/Pz8gRm9yIGRlYnVnZ2luZyBvbmx5LiAgKi8KKyAgICAgICAgY3B1X2Fib3J0KGVudiwgIlVuaW1wbGVtZW50ZWQgc3lzdGVtIHJlZ2lzdGVyIHJlYWQgKCVkKVxuIiwgcmVnKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIEhFTFBFUih2N21fbXNyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCByZWcsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBzd2l0Y2ggKHJlZykgeworICAgIGNhc2UgMDogLyogQVBTUiAqLworICAgICAgICB4cHNyX3dyaXRlKGVudiwgdmFsLCAweGY4MDAwMDAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiBJQVBTUiAqLworICAgICAgICB4cHNyX3dyaXRlKGVudiwgdmFsLCAweGY4MDAwMDAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiBFQVBTUiAqLworICAgICAgICB4cHNyX3dyaXRlKGVudiwgdmFsLCAweGZlMDBmYzAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiB4UFNSICovCisgICAgICAgIHhwc3Jfd3JpdGUoZW52LCB2YWwsIDB4ZmUwMGZjMDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6IC8qIElQU1IgKi8KKyAgICAgICAgLyogSVBTUiBiaXRzIGFyZSByZWFkb25seS4gICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjogLyogRVBTUiAqLworICAgICAgICB4cHNyX3dyaXRlKGVudiwgdmFsLCAweDA2MDBmYzAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OiAvKiBJRVBTUiAqLworICAgICAgICB4cHNyX3dyaXRlKGVudiwgdmFsLCAweDA2MDBmYzAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiAvKiBNU1AgKi8KKyAgICAgICAgaWYgKGVudi0+djdtLmN1cnJlbnRfc3ApCisgICAgICAgICAgICBlbnYtPnY3bS5vdGhlcl9zcCA9IHZhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52LT5yZWdzWzEzXSA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OiAvKiBQU1AgKi8KKyAgICAgICAgaWYgKGVudi0+djdtLmN1cnJlbnRfc3ApCisgICAgICAgICAgICBlbnYtPnJlZ3NbMTNdID0gdmFsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbnYtPnY3bS5vdGhlcl9zcCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjogLyogUFJJTUFTSyAqLworICAgICAgICBpZiAodmFsICYgMSkKKyAgICAgICAgICAgIGVudi0+dW5jYWNoZWRfY3BzciB8PSBDUFNSX0k7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVudi0+dW5jYWNoZWRfY3BzciAmPSB+Q1BTUl9JOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OiAvKiBCQVNFUFJJICovCisgICAgICAgIGVudi0+djdtLmJhc2VwcmkgPSB2YWwgJiAweGZmOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OiAvKiBCQVNFUFJJX01BWCAqLworICAgICAgICB2YWwgJj0gMHhmZjsKKyAgICAgICAgaWYgKHZhbCAhPSAwICYmICh2YWwgPCBlbnYtPnY3bS5iYXNlcHJpIHx8IGVudi0+djdtLmJhc2VwcmkgPT0gMCkpCisgICAgICAgICAgICBlbnYtPnY3bS5iYXNlcHJpID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5OiAvKiBGQVVMVE1BU0sgKi8KKyAgICAgICAgaWYgKHZhbCAmIDEpCisgICAgICAgICAgICBlbnYtPnVuY2FjaGVkX2Nwc3IgfD0gQ1BTUl9GOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlbnYtPnVuY2FjaGVkX2Nwc3IgJj0gfkNQU1JfRjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDogLyogQ09OVFJPTCAqLworICAgICAgICBlbnYtPnY3bS5jb250cm9sID0gdmFsICYgMzsKKyAgICAgICAgc3dpdGNoX3Y3bV9zcChlbnYsICh2YWwgJiAyKSAhPSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogPz8/IEZvciBkZWJ1Z2dpbmcgb25seS4gICovCisgICAgICAgIGNwdV9hYm9ydChlbnYsICJVbmltcGxlbWVudGVkIHN5c3RlbSByZWdpc3RlciB3cml0ZSAoJWQpXG4iLCByZWcpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIGNwdV9hcm1fc2V0X2NwX2lvKENQVUFSTVN0YXRlICplbnYsIGludCBjcG51bSwKKyAgICAgICAgICAgICAgICBBUk1SZWFkQ1BGdW5jICpjcF9yZWFkLCBBUk1Xcml0ZUNQRnVuYyAqY3Bfd3JpdGUsCisgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIGlmIChjcG51bSA8IDAgfHwgY3BudW0gPiAxNCkgeworICAgICAgICBjcHVfYWJvcnQoZW52LCAiQmFkIGNvcHJvY2Vzc29yIG51bWJlcjogJWlcbiIsIGNwbnVtKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVudi0+Y3BbY3BudW1dLmNwX3JlYWQgPSBjcF9yZWFkOworICAgIGVudi0+Y3BbY3BudW1dLmNwX3dyaXRlID0gY3Bfd3JpdGU7CisgICAgZW52LT5jcFtjcG51bV0ub3BhcXVlID0gb3BhcXVlOworfQorCisjZW5kaWYKKworLyogTm90ZSB0aGF0IHNpZ25lZCBvdmVyZmxvdyBpcyB1bmRlZmluZWQgaW4gQy4gIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlCisgICBjYXJlZnVsIHRvIHVzZSB1bnNpZ25lZCB0eXBlcyB3aGVyZSBtb2R1bG8gYXJpdGhtZXRpYyBpcyByZXF1aXJlZC4KKyAgIEZhaWx1cmUgdG8gZG8gc28gX3dpbGxfIGJyZWFrIG9uIG5ld2VyIGdjYy4gICovCisKKy8qIFNpZ25lZCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworCisvKiBQZXJmb3JtIDE2LWJpdCBzaWduZWQgc2F0dXJhdGluZyBhZGRpdGlvbi4gICovCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGFkZDE2X3NhdCh1aW50MTZfdCBhLCB1aW50MTZfdCBiKQoreworICAgIHVpbnQxNl90IHJlczsKKworICAgIHJlcyA9IGEgKyBiOworICAgIGlmICgoKHJlcyBeIGEpICYgMHg4MDAwKSAmJiAhKChhIF4gYikgJiAweDgwMDApKSB7CisgICAgICAgIGlmIChhICYgMHg4MDAwKQorICAgICAgICAgICAgcmVzID0gMHg4MDAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSAweDdmZmY7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8qIFBlcmZvcm0gOC1iaXQgc2lnbmVkIHNhdHVyYXRpbmcgYWRkaXRpb24uICAqLworc3RhdGljIGlubGluZSB1aW50OF90IGFkZDhfc2F0KHVpbnQ4X3QgYSwgdWludDhfdCBiKQoreworICAgIHVpbnQ4X3QgcmVzOworCisgICAgcmVzID0gYSArIGI7CisgICAgaWYgKCgocmVzIF4gYSkgJiAweDgwKSAmJiAhKChhIF4gYikgJiAweDgwKSkgeworICAgICAgICBpZiAoYSAmIDB4ODApCisgICAgICAgICAgICByZXMgPSAweDgwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSAweDdmOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKiBQZXJmb3JtIDE2LWJpdCBzaWduZWQgc2F0dXJhdGluZyBzdWJ0cmFjdGlvbi4gICovCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IHN1YjE2X3NhdCh1aW50MTZfdCBhLCB1aW50MTZfdCBiKQoreworICAgIHVpbnQxNl90IHJlczsKKworICAgIHJlcyA9IGEgLSBiOworICAgIGlmICgoKHJlcyBeIGEpICYgMHg4MDAwKSAmJiAoKGEgXiBiKSAmIDB4ODAwMCkpIHsKKyAgICAgICAgaWYgKGEgJiAweDgwMDApCisgICAgICAgICAgICByZXMgPSAweDgwMDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IDB4N2ZmZjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLyogUGVyZm9ybSA4LWJpdCBzaWduZWQgc2F0dXJhdGluZyBzdWJ0cmFjdGlvbi4gICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgc3ViOF9zYXQodWludDhfdCBhLCB1aW50OF90IGIpCit7CisgICAgdWludDhfdCByZXM7CisKKyAgICByZXMgPSBhIC0gYjsKKyAgICBpZiAoKChyZXMgXiBhKSAmIDB4ODApICYmICgoYSBeIGIpICYgMHg4MCkpIHsKKyAgICAgICAgaWYgKGEgJiAweDgwKQorICAgICAgICAgICAgcmVzID0gMHg4MDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gMHg3ZjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBBREQxNihhLCBiLCBuKSBSRVNVTFQoYWRkMTZfc2F0KGEsIGIpLCBuLCAxNik7CisjZGVmaW5lIFNVQjE2KGEsIGIsIG4pIFJFU1VMVChzdWIxNl9zYXQoYSwgYiksIG4sIDE2KTsKKyNkZWZpbmUgQUREOChhLCBiLCBuKSAgUkVTVUxUKGFkZDhfc2F0KGEsIGIpLCBuLCA4KTsKKyNkZWZpbmUgU1VCOChhLCBiLCBuKSAgUkVTVUxUKHN1Yjhfc2F0KGEsIGIpLCBuLCA4KTsKKyNkZWZpbmUgUEZYIHEKKworI2luY2x1ZGUgIm9wX2FkZHN1Yi5oIgorCisvKiBVbnNpZ25lZCBzYXR1cmF0aW5nIGFyaXRobWV0aWMuICAqLworc3RhdGljIGlubGluZSB1aW50MTZfdCBhZGQxNl91c2F0KHVpbnQxNl90IGEsIHVpbnQxNl90IGIpCit7CisgICAgdWludDE2X3QgcmVzOworICAgIHJlcyA9IGEgKyBiOworICAgIGlmIChyZXMgPCBhKQorICAgICAgICByZXMgPSAweGZmZmY7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBzdWIxNl91c2F0KHVpbnQxNl90IGEsIHVpbnQxNl90IGIpCit7CisgICAgaWYgKGEgPiBiKQorICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGFkZDhfdXNhdCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50OF90IHJlczsKKyAgICByZXMgPSBhICsgYjsKKyAgICBpZiAocmVzIDwgYSkKKyAgICAgICAgcmVzID0gMHhmZjsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3Qgc3ViOF91c2F0KHVpbnQ4X3QgYSwgdWludDhfdCBiKQoreworICAgIGlmIChhID4gYikKKyAgICAgICAgcmV0dXJuIGEgLSBiOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQUREMTYoYSwgYiwgbikgUkVTVUxUKGFkZDE2X3VzYXQoYSwgYiksIG4sIDE2KTsKKyNkZWZpbmUgU1VCMTYoYSwgYiwgbikgUkVTVUxUKHN1YjE2X3VzYXQoYSwgYiksIG4sIDE2KTsKKyNkZWZpbmUgQUREOChhLCBiLCBuKSAgUkVTVUxUKGFkZDhfdXNhdChhLCBiKSwgbiwgOCk7CisjZGVmaW5lIFNVQjgoYSwgYiwgbikgIFJFU1VMVChzdWI4X3VzYXQoYSwgYiksIG4sIDgpOworI2RlZmluZSBQRlggdXEKKworI2luY2x1ZGUgIm9wX2FkZHN1Yi5oIgorCisvKiBTaWduZWQgbW9kdWxvIGFyaXRobWV0aWMuICAqLworI2RlZmluZSBTQVJJVEgxNihhLCBiLCBuLCBvcCkgZG8geyBcCisgICAgaW50MzJfdCBzdW07IFwKKyAgICBzdW0gPSAoaW50MzJfdCkoaW50MTZfdCkoYSkgb3AgKGludDMyX3QpKGludDE2X3QpKGIpOyBcCisgICAgUkVTVUxUKHN1bSwgbiwgMTYpOyBcCisgICAgaWYgKHN1bSA+PSAwKSBcCisgICAgICAgIGdlIHw9IDMgPDwgKG4gKiAyKTsgXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBTQVJJVEg4KGEsIGIsIG4sIG9wKSBkbyB7IFwKKyAgICBpbnQzMl90IHN1bTsgXAorICAgIHN1bSA9IChpbnQzMl90KShpbnQ4X3QpKGEpIG9wIChpbnQzMl90KShpbnQ4X3QpKGIpOyBcCisgICAgUkVTVUxUKHN1bSwgbiwgOCk7IFwKKyAgICBpZiAoc3VtID49IDApIFwKKyAgICAgICAgZ2UgfD0gMSA8PCBuOyBcCisgICAgfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgQUREMTYoYSwgYiwgbikgU0FSSVRIMTYoYSwgYiwgbiwgKykKKyNkZWZpbmUgU1VCMTYoYSwgYiwgbikgU0FSSVRIMTYoYSwgYiwgbiwgLSkKKyNkZWZpbmUgQUREOChhLCBiLCBuKSAgU0FSSVRIOChhLCBiLCBuLCArKQorI2RlZmluZSBTVUI4KGEsIGIsIG4pICBTQVJJVEg4KGEsIGIsIG4sIC0pCisjZGVmaW5lIFBGWCBzCisjZGVmaW5lIEFSSVRIX0dFCisKKyNpbmNsdWRlICJvcF9hZGRzdWIuaCIKKworLyogVW5zaWduZWQgbW9kdWxvIGFyaXRobWV0aWMuICAqLworI2RlZmluZSBBREQxNihhLCBiLCBuKSBkbyB7IFwKKyAgICB1aW50MzJfdCBzdW07IFwKKyAgICBzdW0gPSAodWludDMyX3QpKHVpbnQxNl90KShhKSArICh1aW50MzJfdCkodWludDE2X3QpKGIpOyBcCisgICAgUkVTVUxUKHN1bSwgbiwgMTYpOyBcCisgICAgaWYgKChzdW0gPj4gMTYpID09IDEpIFwKKyAgICAgICAgZ2UgfD0gMyA8PCAobiAqIDIpOyBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIEFERDgoYSwgYiwgbikgZG8geyBcCisgICAgdWludDMyX3Qgc3VtOyBcCisgICAgc3VtID0gKHVpbnQzMl90KSh1aW50OF90KShhKSArICh1aW50MzJfdCkodWludDhfdCkoYik7IFwKKyAgICBSRVNVTFQoc3VtLCBuLCA4KTsgXAorICAgIGlmICgoc3VtID4+IDgpID09IDEpIFwKKyAgICAgICAgZ2UgfD0gMSA8PCBuOyBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIFNVQjE2KGEsIGIsIG4pIGRvIHsgXAorICAgIHVpbnQzMl90IHN1bTsgXAorICAgIHN1bSA9ICh1aW50MzJfdCkodWludDE2X3QpKGEpIC0gKHVpbnQzMl90KSh1aW50MTZfdCkoYik7IFwKKyAgICBSRVNVTFQoc3VtLCBuLCAxNik7IFwKKyAgICBpZiAoKHN1bSA+PiAxNikgPT0gMCkgXAorICAgICAgICBnZSB8PSAzIDw8IChuICogMik7IFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgU1VCOChhLCBiLCBuKSBkbyB7IFwKKyAgICB1aW50MzJfdCBzdW07IFwKKyAgICBzdW0gPSAodWludDMyX3QpKHVpbnQ4X3QpKGEpIC0gKHVpbnQzMl90KSh1aW50OF90KShiKTsgXAorICAgIFJFU1VMVChzdW0sIG4sIDgpOyBcCisgICAgaWYgKChzdW0gPj4gOCkgPT0gMCkgXAorICAgICAgICBnZSB8PSAxIDw8IG47IFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUEZYIHUKKyNkZWZpbmUgQVJJVEhfR0UKKworI2luY2x1ZGUgIm9wX2FkZHN1Yi5oIgorCisvKiBIYWx2ZWQgc2lnbmVkIGFyaXRobWV0aWMuICAqLworI2RlZmluZSBBREQxNihhLCBiLCBuKSBcCisgIFJFU1VMVCgoKGludDMyX3QpKGludDE2X3QpKGEpICsgKGludDMyX3QpKGludDE2X3QpKGIpKSA+PiAxLCBuLCAxNikKKyNkZWZpbmUgU1VCMTYoYSwgYiwgbikgXAorICBSRVNVTFQoKChpbnQzMl90KShpbnQxNl90KShhKSAtIChpbnQzMl90KShpbnQxNl90KShiKSkgPj4gMSwgbiwgMTYpCisjZGVmaW5lIEFERDgoYSwgYiwgbikgXAorICBSRVNVTFQoKChpbnQzMl90KShpbnQ4X3QpKGEpICsgKGludDMyX3QpKGludDhfdCkoYikpID4+IDEsIG4sIDgpCisjZGVmaW5lIFNVQjgoYSwgYiwgbikgXAorICBSRVNVTFQoKChpbnQzMl90KShpbnQ4X3QpKGEpIC0gKGludDMyX3QpKGludDhfdCkoYikpID4+IDEsIG4sIDgpCisjZGVmaW5lIFBGWCBzaAorCisjaW5jbHVkZSAib3BfYWRkc3ViLmgiCisKKy8qIEhhbHZlZCB1bnNpZ25lZCBhcml0aG1ldGljLiAgKi8KKyNkZWZpbmUgQUREMTYoYSwgYiwgbikgXAorICBSRVNVTFQoKCh1aW50MzJfdCkodWludDE2X3QpKGEpICsgKHVpbnQzMl90KSh1aW50MTZfdCkoYikpID4+IDEsIG4sIDE2KQorI2RlZmluZSBTVUIxNihhLCBiLCBuKSBcCisgIFJFU1VMVCgoKHVpbnQzMl90KSh1aW50MTZfdCkoYSkgLSAodWludDMyX3QpKHVpbnQxNl90KShiKSkgPj4gMSwgbiwgMTYpCisjZGVmaW5lIEFERDgoYSwgYiwgbikgXAorICBSRVNVTFQoKCh1aW50MzJfdCkodWludDhfdCkoYSkgKyAodWludDMyX3QpKHVpbnQ4X3QpKGIpKSA+PiAxLCBuLCA4KQorI2RlZmluZSBTVUI4KGEsIGIsIG4pIFwKKyAgUkVTVUxUKCgodWludDMyX3QpKHVpbnQ4X3QpKGEpIC0gKHVpbnQzMl90KSh1aW50OF90KShiKSkgPj4gMSwgbiwgOCkKKyNkZWZpbmUgUEZYIHVoCisKKyNpbmNsdWRlICJvcF9hZGRzdWIuaCIKKworc3RhdGljIGlubGluZSB1aW50OF90IGRvX3VzYWQodWludDhfdCBhLCB1aW50OF90IGIpCit7CisgICAgaWYgKGEgPiBiKQorICAgICAgICByZXR1cm4gYSAtIGI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYiAtIGE7Cit9CisKKy8qIFVuc2lnbmVkIHN1bSBvZiBhYnNvbHV0ZSBieXRlIGRpZmZlcmVuY2VzLiAgKi8KK3VpbnQzMl90IEhFTFBFUih1c2FkOCkodWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCBzdW07CisgICAgc3VtID0gZG9fdXNhZChhLCBiKTsKKyAgICBzdW0gKz0gZG9fdXNhZChhID4+IDgsIGIgPj4gOCk7CisgICAgc3VtICs9IGRvX3VzYWQoYSA+PiAxNiwgYiA+PjE2KTsKKyAgICBzdW0gKz0gZG9fdXNhZChhID4+IDI0LCBiID4+IDI0KTsKKyAgICByZXR1cm4gc3VtOworfQorCisvKiBGb3IgQVJNdjYgU0VMIGluc3RydWN0aW9uLiAgKi8KK3VpbnQzMl90IEhFTFBFUihzZWxfZmxhZ3MpKHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IG1hc2s7CisKKyAgICBtYXNrID0gMDsKKyAgICBpZiAoZmxhZ3MgJiAxKQorICAgICAgICBtYXNrIHw9IDB4ZmY7CisgICAgaWYgKGZsYWdzICYgMikKKyAgICAgICAgbWFzayB8PSAweGZmMDA7CisgICAgaWYgKGZsYWdzICYgNCkKKyAgICAgICAgbWFzayB8PSAweGZmMDAwMDsKKyAgICBpZiAoZmxhZ3MgJiA4KQorICAgICAgICBtYXNrIHw9IDB4ZmYwMDAwMDA7CisgICAgcmV0dXJuIChhICYgbWFzaykgfCAoYiAmIH5tYXNrKTsKK30KKwordWludDMyX3QgSEVMUEVSKGxvZ2ljcV9jYykodWludDY0X3QgdmFsKQoreworICAgIHJldHVybiAodmFsID4+IDMyKSB8ICh2YWwgIT0gMCk7Cit9CisKKy8qIFZGUCBzdXBwb3J0LiAgV2UgZm9sbG93IHRoZSBjb252ZW50aW9uIHVzZWQgZm9yIFZGUCBpbnN0cnVuY3Rpb25zOgorICAgU2luZ2xlIHByZWNpdGlvbiByb3V0aW5lcyBoYXZlIGEgInMiIHN1ZmZpeCwgZG91YmxlIHByZWNpc2lvbiBhCisgICAiZCIgc3VmZml4LiAgKi8KKworLyogQ29udmVydCBob3N0IGV4Y2VwdGlvbiBmbGFncyB0byB2ZnAgZm9ybS4gICovCitzdGF0aWMgaW5saW5lIGludCB2ZnBfZXhjZXB0Yml0c19mcm9tX2hvc3QoaW50IGhvc3RfYml0cykKK3sKKyAgICBpbnQgdGFyZ2V0X2JpdHMgPSAwOworCisgICAgaWYgKGhvc3RfYml0cyAmIGZsb2F0X2ZsYWdfaW52YWxpZCkKKyAgICAgICAgdGFyZ2V0X2JpdHMgfD0gMTsKKyAgICBpZiAoaG9zdF9iaXRzICYgZmxvYXRfZmxhZ19kaXZieXplcm8pCisgICAgICAgIHRhcmdldF9iaXRzIHw9IDI7CisgICAgaWYgKGhvc3RfYml0cyAmIGZsb2F0X2ZsYWdfb3ZlcmZsb3cpCisgICAgICAgIHRhcmdldF9iaXRzIHw9IDQ7CisgICAgaWYgKGhvc3RfYml0cyAmIChmbG9hdF9mbGFnX3VuZGVyZmxvdyB8IGZsb2F0X2ZsYWdfb3V0cHV0X2Rlbm9ybWFsKSkKKyAgICAgICAgdGFyZ2V0X2JpdHMgfD0gODsKKyAgICBpZiAoaG9zdF9iaXRzICYgZmxvYXRfZmxhZ19pbmV4YWN0KQorICAgICAgICB0YXJnZXRfYml0cyB8PSAweDEwOworICAgIGlmIChob3N0X2JpdHMgJiBmbG9hdF9mbGFnX2lucHV0X2Rlbm9ybWFsKQorICAgICAgICB0YXJnZXRfYml0cyB8PSAweDgwOworICAgIHJldHVybiB0YXJnZXRfYml0czsKK30KKwordWludDMyX3QgSEVMUEVSKHZmcF9nZXRfZnBzY3IpKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgaW50IGk7CisgICAgdWludDMyX3QgZnBzY3I7CisKKyAgICBmcHNjciA9IChlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0NSXSAmIDB4ZmZjOGZmZmYpCisgICAgICAgICAgICB8IChlbnYtPnZmcC52ZWNfbGVuIDw8IDE2KQorICAgICAgICAgICAgfCAoZW52LT52ZnAudmVjX3N0cmlkZSA8PCAyMCk7CisgICAgaSA9IGdldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoJmVudi0+dmZwLmZwX3N0YXR1cyk7CisgICAgaSB8PSBnZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKCZlbnYtPnZmcC5zdGFuZGFyZF9mcF9zdGF0dXMpOworICAgIGZwc2NyIHw9IHZmcF9leGNlcHRiaXRzX2Zyb21faG9zdChpKTsKKyAgICByZXR1cm4gZnBzY3I7Cit9CisKK3VpbnQzMl90IHZmcF9nZXRfZnBzY3IoQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gSEVMUEVSKHZmcF9nZXRfZnBzY3IpKGVudik7Cit9CisKKy8qIENvbnZlcnQgdmZwIGV4Y2VwdGlvbiBmbGFncyB0byB0YXJnZXQgZm9ybS4gICovCitzdGF0aWMgaW5saW5lIGludCB2ZnBfZXhjZXB0Yml0c190b19ob3N0KGludCB0YXJnZXRfYml0cykKK3sKKyAgICBpbnQgaG9zdF9iaXRzID0gMDsKKworICAgIGlmICh0YXJnZXRfYml0cyAmIDEpCisgICAgICAgIGhvc3RfYml0cyB8PSBmbG9hdF9mbGFnX2ludmFsaWQ7CisgICAgaWYgKHRhcmdldF9iaXRzICYgMikKKyAgICAgICAgaG9zdF9iaXRzIHw9IGZsb2F0X2ZsYWdfZGl2Ynl6ZXJvOworICAgIGlmICh0YXJnZXRfYml0cyAmIDQpCisgICAgICAgIGhvc3RfYml0cyB8PSBmbG9hdF9mbGFnX292ZXJmbG93OworICAgIGlmICh0YXJnZXRfYml0cyAmIDgpCisgICAgICAgIGhvc3RfYml0cyB8PSBmbG9hdF9mbGFnX3VuZGVyZmxvdzsKKyAgICBpZiAodGFyZ2V0X2JpdHMgJiAweDEwKQorICAgICAgICBob3N0X2JpdHMgfD0gZmxvYXRfZmxhZ19pbmV4YWN0OworICAgIGlmICh0YXJnZXRfYml0cyAmIDB4ODApCisgICAgICAgIGhvc3RfYml0cyB8PSBmbG9hdF9mbGFnX2lucHV0X2Rlbm9ybWFsOworICAgIHJldHVybiBob3N0X2JpdHM7Cit9CisKK3ZvaWQgSEVMUEVSKHZmcF9zZXRfZnBzY3IpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBjaGFuZ2VkOworCisgICAgY2hhbmdlZCA9IGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdOworICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdID0gKHZhbCAmIDB4ZmZjOGZmZmYpOworICAgIGVudi0+dmZwLnZlY19sZW4gPSAodmFsID4+IDE2KSAmIDc7CisgICAgZW52LT52ZnAudmVjX3N0cmlkZSA9ICh2YWwgPj4gMjApICYgMzsKKworICAgIGNoYW5nZWQgXj0gdmFsOworICAgIGlmIChjaGFuZ2VkICYgKDMgPDwgMjIpKSB7CisgICAgICAgIGkgPSAodmFsID4+IDIyKSAmIDM7CisgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpID0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGkgPSBmbG9hdF9yb3VuZF91cDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpID0gZmxvYXRfcm91bmRfZG93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpID0gZmxvYXRfcm91bmRfdG9femVybzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGksICZlbnYtPnZmcC5mcF9zdGF0dXMpOworICAgIH0KKyAgICBpZiAoY2hhbmdlZCAmICgxIDw8IDI0KSkgeworICAgICAgICBzZXRfZmx1c2hfdG9femVybygodmFsICYgKDEgPDwgMjQpKSAhPSAwLCAmZW52LT52ZnAuZnBfc3RhdHVzKTsKKyAgICAgICAgc2V0X2ZsdXNoX2lucHV0c190b196ZXJvKCh2YWwgJiAoMSA8PCAyNCkpICE9IDAsICZlbnYtPnZmcC5mcF9zdGF0dXMpOworICAgIH0KKyAgICBpZiAoY2hhbmdlZCAmICgxIDw8IDI1KSkKKyAgICAgICAgc2V0X2RlZmF1bHRfbmFuX21vZGUoKHZhbCAmICgxIDw8IDI1KSkgIT0gMCwgJmVudi0+dmZwLmZwX3N0YXR1cyk7CisKKyAgICBpID0gdmZwX2V4Y2VwdGJpdHNfdG9faG9zdCh2YWwpOworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoaSwgJmVudi0+dmZwLmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT52ZnAuc3RhbmRhcmRfZnBfc3RhdHVzKTsKK30KKwordm9pZCB2ZnBfc2V0X2Zwc2NyKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBIRUxQRVIodmZwX3NldF9mcHNjcikoZW52LCB2YWwpOworfQorCisjZGVmaW5lIFZGUF9IRUxQRVIobmFtZSwgcCkgSEVMUEVSKGdsdWUoZ2x1ZSh2ZnBfLG5hbWUpLHApKQorCisjZGVmaW5lIFZGUF9CSU5PUChuYW1lKSBcCitmbG9hdDMyIFZGUF9IRUxQRVIobmFtZSwgcykoZmxvYXQzMiBhLCBmbG9hdDMyIGIsIHZvaWQgKmZwc3RwKSBcCit7IFwKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsgXAorICAgIHJldHVybiBmbG9hdDMyXyAjIyBuYW1lIChhLCBiLCBmcHN0KTsgXAorfSBcCitmbG9hdDY0IFZGUF9IRUxQRVIobmFtZSwgZCkoZmxvYXQ2NCBhLCBmbG9hdDY0IGIsIHZvaWQgKmZwc3RwKSBcCit7IFwKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsgXAorICAgIHJldHVybiBmbG9hdDY0XyAjIyBuYW1lIChhLCBiLCBmcHN0KTsgXAorfQorVkZQX0JJTk9QKGFkZCkKK1ZGUF9CSU5PUChzdWIpCitWRlBfQklOT1AobXVsKQorVkZQX0JJTk9QKGRpdikKKyN1bmRlZiBWRlBfQklOT1AKKworZmxvYXQzMiBWRlBfSEVMUEVSKG5lZywgcykoZmxvYXQzMiBhKQoreworICAgIHJldHVybiBmbG9hdDMyX2NocyhhKTsKK30KKworZmxvYXQ2NCBWRlBfSEVMUEVSKG5lZywgZCkoZmxvYXQ2NCBhKQoreworICAgIHJldHVybiBmbG9hdDY0X2NocyhhKTsKK30KKworZmxvYXQzMiBWRlBfSEVMUEVSKGFicywgcykoZmxvYXQzMiBhKQoreworICAgIHJldHVybiBmbG9hdDMyX2FicyhhKTsKK30KKworZmxvYXQ2NCBWRlBfSEVMUEVSKGFicywgZCkoZmxvYXQ2NCBhKQoreworICAgIHJldHVybiBmbG9hdDY0X2FicyhhKTsKK30KKworZmxvYXQzMiBWRlBfSEVMUEVSKHNxcnQsIHMpKGZsb2F0MzIgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZmxvYXQzMl9zcXJ0KGEsICZlbnYtPnZmcC5mcF9zdGF0dXMpOworfQorCitmbG9hdDY0IFZGUF9IRUxQRVIoc3FydCwgZCkoZmxvYXQ2NCBhLCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHJldHVybiBmbG9hdDY0X3NxcnQoYSwgJmVudi0+dmZwLmZwX3N0YXR1cyk7Cit9CisKKy8qIFhYWDogY2hlY2sgcXVpZXQvc2lnbmFsaW5nIGNhc2UgKi8KKyNkZWZpbmUgRE9fVkZQX2NtcChwLCB0eXBlKSBcCit2b2lkIFZGUF9IRUxQRVIoY21wLCBwKSh0eXBlIGEsIHR5cGUgYiwgQ1BVQVJNU3RhdGUgKmVudikgIFwKK3sgXAorICAgIHVpbnQzMl90IGZsYWdzOyBcCisgICAgc3dpdGNoKHR5cGUgIyMgX2NvbXBhcmVfcXVpZXQoYSwgYiwgJmVudi0+dmZwLmZwX3N0YXR1cykpIHsgXAorICAgIGNhc2UgMDogZmxhZ3MgPSAweDY7IGJyZWFrOyBcCisgICAgY2FzZSAtMTogZmxhZ3MgPSAweDg7IGJyZWFrOyBcCisgICAgY2FzZSAxOiBmbGFncyA9IDB4MjsgYnJlYWs7IFwKKyAgICBkZWZhdWx0OiBjYXNlIDI6IGZsYWdzID0gMHgzOyBicmVhazsgXAorICAgIH0gXAorICAgIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdID0gKGZsYWdzIDw8IDI4KSBcCisgICAgICAgIHwgKGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdICYgMHgwZmZmZmZmZik7IFwKK30gXAordm9pZCBWRlBfSEVMUEVSKGNtcGUsIHApKHR5cGUgYSwgdHlwZSBiLCBDUFVBUk1TdGF0ZSAqZW52KSBcCit7IFwKKyAgICB1aW50MzJfdCBmbGFnczsgXAorICAgIHN3aXRjaCh0eXBlICMjIF9jb21wYXJlKGEsIGIsICZlbnYtPnZmcC5mcF9zdGF0dXMpKSB7IFwKKyAgICBjYXNlIDA6IGZsYWdzID0gMHg2OyBicmVhazsgXAorICAgIGNhc2UgLTE6IGZsYWdzID0gMHg4OyBicmVhazsgXAorICAgIGNhc2UgMTogZmxhZ3MgPSAweDI7IGJyZWFrOyBcCisgICAgZGVmYXVsdDogY2FzZSAyOiBmbGFncyA9IDB4MzsgYnJlYWs7IFwKKyAgICB9IFwKKyAgICBlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0NSXSA9IChmbGFncyA8PCAyOCkgXAorICAgICAgICB8IChlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0NSXSAmIDB4MGZmZmZmZmYpOyBcCit9CitET19WRlBfY21wKHMsIGZsb2F0MzIpCitET19WRlBfY21wKGQsIGZsb2F0NjQpCisjdW5kZWYgRE9fVkZQX2NtcAorCisvKiBJbnRlZ2VyIHRvIGZsb2F0IGFuZCBmbG9hdCB0byBpbnRlZ2VyIGNvbnZlcnNpb25zICovCisKKyNkZWZpbmUgQ09OVl9JVE9GKG5hbWUsIGZzeiwgc2lnbikgXAorICAgIGZsb2F0IyNmc3ogSEVMUEVSKG5hbWUpKHVpbnQzMl90IHgsIHZvaWQgKmZwc3RwKSBcCit7IFwKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsgXAorICAgIHJldHVybiBzaWduIyNpbnQzMl90b18jI2Zsb2F0IyNmc3ooeCwgZnBzdCk7IFwKK30KKworI2RlZmluZSBDT05WX0ZUT0kobmFtZSwgZnN6LCBzaWduLCByb3VuZCkgXAordWludDMyX3QgSEVMUEVSKG5hbWUpKGZsb2F0IyNmc3ogeCwgdm9pZCAqZnBzdHApIFwKK3sgXAorICAgIGZsb2F0X3N0YXR1cyAqZnBzdCA9IGZwc3RwOyBcCisgICAgaWYgKGZsb2F0IyNmc3ojI19pc19hbnlfbmFuKHgpKSB7IFwKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBmcHN0KTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorICAgIHJldHVybiBmbG9hdCMjZnN6IyNfdG9fIyNzaWduIyNpbnQzMiMjcm91bmQoeCwgZnBzdCk7IFwKK30KKworI2RlZmluZSBGTE9BVF9DT05WUyhuYW1lLCBwLCBmc3osIHNpZ24pIFwKK0NPTlZfSVRPRih2ZnBfIyNuYW1lIyN0byMjcCwgZnN6LCBzaWduKSBcCitDT05WX0ZUT0kodmZwX3RvIyNuYW1lIyNwLCBmc3osIHNpZ24sICkgXAorQ09OVl9GVE9JKHZmcF90byMjbmFtZSMjeiMjcCwgZnN6LCBzaWduLCBfcm91bmRfdG9femVybykKKworRkxPQVRfQ09OVlMoc2ksIHMsIDMyLCApCitGTE9BVF9DT05WUyhzaSwgZCwgNjQsICkKK0ZMT0FUX0NPTlZTKHVpLCBzLCAzMiwgdSkKK0ZMT0FUX0NPTlZTKHVpLCBkLCA2NCwgdSkKKworI3VuZGVmIENPTlZfSVRPRgorI3VuZGVmIENPTlZfRlRPSQorI3VuZGVmIEZMT0FUX0NPTlZTCisKKy8qIGZsb2F0aW5nIHBvaW50IGNvbnZlcnNpb24gKi8KK2Zsb2F0NjQgVkZQX0hFTFBFUihmY3Z0ZCwgcykoZmxvYXQzMiB4LCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIGZsb2F0NjQgciA9IGZsb2F0MzJfdG9fZmxvYXQ2NCh4LCAmZW52LT52ZnAuZnBfc3RhdHVzKTsKKyAgICAvKiBBUk0gcmVxdWlyZXMgdGhhdCBTPC0+RCBjb252ZXJzaW9uIG9mIGFueSBraW5kIG9mIE5hTiBnZW5lcmF0ZXMKKyAgICAgKiBhIHF1aWV0IE5hTiBieSBmb3JjaW5nIHRoZSBtb3N0IHNpZ25pZmljYW50IGZyYWMgYml0IHRvIDEuCisgICAgICovCisgICAgcmV0dXJuIGZsb2F0NjRfbWF5YmVfc2lsZW5jZV9uYW4ocik7Cit9CisKK2Zsb2F0MzIgVkZQX0hFTFBFUihmY3Z0cywgZCkoZmxvYXQ2NCB4LCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIGZsb2F0MzIgciA9ICBmbG9hdDY0X3RvX2Zsb2F0MzIoeCwgJmVudi0+dmZwLmZwX3N0YXR1cyk7CisgICAgLyogQVJNIHJlcXVpcmVzIHRoYXQgUzwtPkQgY29udmVyc2lvbiBvZiBhbnkga2luZCBvZiBOYU4gZ2VuZXJhdGVzCisgICAgICogYSBxdWlldCBOYU4gYnkgZm9yY2luZyB0aGUgbW9zdCBzaWduaWZpY2FudCBmcmFjIGJpdCB0byAxLgorICAgICAqLworICAgIHJldHVybiBmbG9hdDMyX21heWJlX3NpbGVuY2VfbmFuKHIpOworfQorCisvKiBWRlAzIGZpeGVkIHBvaW50IGNvbnZlcnNpb24uICAqLworI2RlZmluZSBWRlBfQ09OVl9GSVgobmFtZSwgcCwgZnN6LCBpdHlwZSwgc2lnbikgXAorZmxvYXQjI2ZzeiBIRUxQRVIodmZwXyMjbmFtZSMjdG8jI3ApKHVpbnQjI2ZzeiMjX3QgIHgsIHVpbnQzMl90IHNoaWZ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpmcHN0cCkgXAoreyBcCisgICAgZmxvYXRfc3RhdHVzICpmcHN0ID0gZnBzdHA7IFwKKyAgICBmbG9hdCMjZnN6IHRtcDsgXAorICAgIHRtcCA9IHNpZ24jI2ludDMyX3RvXyMjZmxvYXQjI2ZzeigoaXR5cGUjI190KXgsIGZwc3QpOyBcCisgICAgcmV0dXJuIGZsb2F0IyNmc3ojI19zY2FsYm4odG1wLCAtKGludClzaGlmdCwgZnBzdCk7IFwKK30gXAordWludCMjZnN6IyNfdCBIRUxQRVIodmZwX3RvIyNuYW1lIyNwKShmbG9hdCMjZnN6IHgsIHVpbnQzMl90IHNoaWZ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpmcHN0cCkgXAoreyBcCisgICAgZmxvYXRfc3RhdHVzICpmcHN0ID0gZnBzdHA7IFwKKyAgICBmbG9hdCMjZnN6IHRtcDsgXAorICAgIGlmIChmbG9hdCMjZnN6IyNfaXNfYW55X25hbih4KSkgeyBcCisgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxpZCwgZnBzdCk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICB0bXAgPSBmbG9hdCMjZnN6IyNfc2NhbGJuKHgsIHNoaWZ0LCBmcHN0KTsgXAorICAgIHJldHVybiBmbG9hdCMjZnN6IyNfdG9fIyNpdHlwZSMjX3JvdW5kX3RvX3plcm8odG1wLCBmcHN0KTsgXAorfQorCitWRlBfQ09OVl9GSVgoc2gsIGQsIDY0LCBpbnQxNiwgKQorVkZQX0NPTlZfRklYKHNsLCBkLCA2NCwgaW50MzIsICkKK1ZGUF9DT05WX0ZJWCh1aCwgZCwgNjQsIHVpbnQxNiwgdSkKK1ZGUF9DT05WX0ZJWCh1bCwgZCwgNjQsIHVpbnQzMiwgdSkKK1ZGUF9DT05WX0ZJWChzaCwgcywgMzIsIGludDE2LCApCitWRlBfQ09OVl9GSVgoc2wsIHMsIDMyLCBpbnQzMiwgKQorVkZQX0NPTlZfRklYKHVoLCBzLCAzMiwgdWludDE2LCB1KQorVkZQX0NPTlZfRklYKHVsLCBzLCAzMiwgdWludDMyLCB1KQorI3VuZGVmIFZGUF9DT05WX0ZJWAorCisvKiBIYWxmIHByZWNpc2lvbiBjb252ZXJzaW9ucy4gICovCitzdGF0aWMgZmxvYXQzMiBkb19mY3Z0X2YxNl90b19mMzIodWludDMyX3QgYSwgQ1BVQVJNU3RhdGUgKmVudiwgZmxvYXRfc3RhdHVzICpzKQoreworICAgIGludCBpZWVlID0gKGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdICYgKDEgPDwgMjYpKSA9PSAwOworICAgIGZsb2F0MzIgciA9IGZsb2F0MTZfdG9fZmxvYXQzMihtYWtlX2Zsb2F0MTYoYSksIGllZWUsIHMpOworICAgIGlmIChpZWVlKSB7CisgICAgICAgIHJldHVybiBmbG9hdDMyX21heWJlX3NpbGVuY2VfbmFuKHIpOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworc3RhdGljIHVpbnQzMl90IGRvX2ZjdnRfZjMyX3RvX2YxNihmbG9hdDMyIGEsIENQVUFSTVN0YXRlICplbnYsIGZsb2F0X3N0YXR1cyAqcykKK3sKKyAgICBpbnQgaWVlZSA9IChlbnYtPnZmcC54cmVnc1tBUk1fVkZQX0ZQU0NSXSAmICgxIDw8IDI2KSkgPT0gMDsKKyAgICBmbG9hdDE2IHIgPSBmbG9hdDMyX3RvX2Zsb2F0MTYoYSwgaWVlZSwgcyk7CisgICAgaWYgKGllZWUpIHsKKyAgICAgICAgciA9IGZsb2F0MTZfbWF5YmVfc2lsZW5jZV9uYW4ocik7CisgICAgfQorICAgIHJldHVybiBmbG9hdDE2X3ZhbChyKTsKK30KKworZmxvYXQzMiBIRUxQRVIobmVvbl9mY3Z0X2YxNl90b19mMzIpKHVpbnQzMl90IGEsIENQVUFSTVN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGRvX2ZjdnRfZjE2X3RvX2YzMihhLCBlbnYsICZlbnYtPnZmcC5zdGFuZGFyZF9mcF9zdGF0dXMpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9mY3Z0X2YzMl90b19mMTYpKGZsb2F0MzIgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZG9fZmN2dF9mMzJfdG9fZjE2KGEsIGVudiwgJmVudi0+dmZwLnN0YW5kYXJkX2ZwX3N0YXR1cyk7Cit9CisKK2Zsb2F0MzIgSEVMUEVSKHZmcF9mY3Z0X2YxNl90b19mMzIpKHVpbnQzMl90IGEsIENQVUFSTVN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGRvX2ZjdnRfZjE2X3RvX2YzMihhLCBlbnYsICZlbnYtPnZmcC5mcF9zdGF0dXMpOworfQorCit1aW50MzJfdCBIRUxQRVIodmZwX2ZjdnRfZjMyX3RvX2YxNikoZmxvYXQzMiBhLCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHJldHVybiBkb19mY3Z0X2YzMl90b19mMTYoYSwgZW52LCAmZW52LT52ZnAuZnBfc3RhdHVzKTsKK30KKworI2RlZmluZSBmbG9hdDMyX3R3byBtYWtlX2Zsb2F0MzIoMHg0MDAwMDAwMCkKKyNkZWZpbmUgZmxvYXQzMl90aHJlZSBtYWtlX2Zsb2F0MzIoMHg0MDQwMDAwMCkKKyNkZWZpbmUgZmxvYXQzMl9vbmVfcG9pbnRfZml2ZSBtYWtlX2Zsb2F0MzIoMHgzZmMwMDAwMCkKKworZmxvYXQzMiBIRUxQRVIocmVjcHNfZjMyKShmbG9hdDMyIGEsIGZsb2F0MzIgYiwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICBmbG9hdF9zdGF0dXMgKnMgPSAmZW52LT52ZnAuc3RhbmRhcmRfZnBfc3RhdHVzOworICAgIGlmICgoZmxvYXQzMl9pc19pbmZpbml0eShhKSAmJiBmbG9hdDMyX2lzX3plcm9fb3JfZGVub3JtYWwoYikpIHx8CisgICAgICAgIChmbG9hdDMyX2lzX2luZmluaXR5KGIpICYmIGZsb2F0MzJfaXNfemVyb19vcl9kZW5vcm1hbChhKSkpIHsKKyAgICAgICAgaWYgKCEoZmxvYXQzMl9pc196ZXJvKGEpIHx8IGZsb2F0MzJfaXNfemVybyhiKSkpIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW5wdXRfZGVub3JtYWwsIHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbG9hdDMyX3R3bzsKKyAgICB9CisgICAgcmV0dXJuIGZsb2F0MzJfc3ViKGZsb2F0MzJfdHdvLCBmbG9hdDMyX211bChhLCBiLCBzKSwgcyk7Cit9CisKK2Zsb2F0MzIgSEVMUEVSKHJzcXJ0c19mMzIpKGZsb2F0MzIgYSwgZmxvYXQzMiBiLCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIGZsb2F0X3N0YXR1cyAqcyA9ICZlbnYtPnZmcC5zdGFuZGFyZF9mcF9zdGF0dXM7CisgICAgZmxvYXQzMiBwcm9kdWN0OworICAgIGlmICgoZmxvYXQzMl9pc19pbmZpbml0eShhKSAmJiBmbG9hdDMyX2lzX3plcm9fb3JfZGVub3JtYWwoYikpIHx8CisgICAgICAgIChmbG9hdDMyX2lzX2luZmluaXR5KGIpICYmIGZsb2F0MzJfaXNfemVyb19vcl9kZW5vcm1hbChhKSkpIHsKKyAgICAgICAgaWYgKCEoZmxvYXQzMl9pc196ZXJvKGEpIHx8IGZsb2F0MzJfaXNfemVybyhiKSkpIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW5wdXRfZGVub3JtYWwsIHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmbG9hdDMyX29uZV9wb2ludF9maXZlOworICAgIH0KKyAgICBwcm9kdWN0ID0gZmxvYXQzMl9tdWwoYSwgYiwgcyk7CisgICAgcmV0dXJuIGZsb2F0MzJfZGl2KGZsb2F0MzJfc3ViKGZsb2F0MzJfdGhyZWUsIHByb2R1Y3QsIHMpLCBmbG9hdDMyX3R3bywgcyk7Cit9CisKKy8qIE5FT04gaGVscGVycy4gICovCisKKy8qIENvbnN0YW50cyAyNTYgYW5kIDUxMiBhcmUgdXNlZCBpbiBzb21lIGhlbHBlcnM7IHdlIGF2b2lkIHJlbHlpbmcgb24KKyAqIGludC0+ZmxvYXQgY29udmVyc2lvbnMgYXQgcnVuLXRpbWUuICAqLworI2RlZmluZSBmbG9hdDY0XzI1NiBtYWtlX2Zsb2F0NjQoMHg0MDcwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIGZsb2F0NjRfNTEyIG1ha2VfZmxvYXQ2NCgweDQwODAwMDAwMDAwMDAwMDBMTCkKKworLyogVGhlIGFsZ29yaXRobSB0aGF0IG11c3QgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVzdGltYXRlCisgKiBpcyBzcGVjaWZpZWQgYnkgdGhlIEFSTSBBUk0uCisgKi8KK3N0YXRpYyBmbG9hdDY0IHJlY2lwX2VzdGltYXRlKGZsb2F0NjQgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICAvKiBUaGVzZSBjYWxjdWxhdGlvbnMgbXVzdG4ndCBzZXQgYW55IGZwIGV4Y2VwdGlvbiBmbGFncywKKyAgICAgKiBzbyB3ZSB1c2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBmcF9zdGF0dXMuCisgICAgICovCisgICAgZmxvYXRfc3RhdHVzIGR1bW15X3N0YXR1cyA9IGVudi0+dmZwLnN0YW5kYXJkX2ZwX3N0YXR1czsKKyAgICBmbG9hdF9zdGF0dXMgKnMgPSAmZHVtbXlfc3RhdHVzOworICAgIC8qIHEgPSAoaW50KShhICogNTEyLjApICovCisgICAgZmxvYXQ2NCBxID0gZmxvYXQ2NF9tdWwoZmxvYXQ2NF81MTIsIGEsIHMpOworICAgIGludDY0X3QgcV9pbnQgPSBmbG9hdDY0X3RvX2ludDY0X3JvdW5kX3RvX3plcm8ocSwgcyk7CisKKyAgICAvKiByID0gMS4wIC8gKCgoZG91YmxlKXEgKyAwLjUpIC8gNTEyLjApICovCisgICAgcSA9IGludDY0X3RvX2Zsb2F0NjQocV9pbnQsIHMpOworICAgIHEgPSBmbG9hdDY0X2FkZChxLCBmbG9hdDY0X2hhbGYsIHMpOworICAgIHEgPSBmbG9hdDY0X2RpdihxLCBmbG9hdDY0XzUxMiwgcyk7CisgICAgcSA9IGZsb2F0NjRfZGl2KGZsb2F0NjRfb25lLCBxLCBzKTsKKworICAgIC8qIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpICovCisgICAgcSA9IGZsb2F0NjRfbXVsKHEsIGZsb2F0NjRfMjU2LCBzKTsKKyAgICBxID0gZmxvYXQ2NF9hZGQocSwgZmxvYXQ2NF9oYWxmLCBzKTsKKyAgICBxX2ludCA9IGZsb2F0NjRfdG9faW50NjRfcm91bmRfdG9femVybyhxLCBzKTsKKworICAgIC8qIHJldHVybiAoZG91YmxlKXMgLyAyNTYuMCAqLworICAgIHJldHVybiBmbG9hdDY0X2RpdihpbnQ2NF90b19mbG9hdDY0KHFfaW50LCBzKSwgZmxvYXQ2NF8yNTYsIHMpOworfQorCitmbG9hdDMyIEhFTFBFUihyZWNwZV9mMzIpKGZsb2F0MzIgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICBmbG9hdF9zdGF0dXMgKnMgPSAmZW52LT52ZnAuc3RhbmRhcmRfZnBfc3RhdHVzOworICAgIGZsb2F0NjQgZjY0OworICAgIHVpbnQzMl90IHZhbDMyID0gZmxvYXQzMl92YWwoYSk7CisKKyAgICBpbnQgcmVzdWx0X2V4cDsKKyAgICBpbnQgYV9leHAgPSAodmFsMzIgICYgMHg3ZjgwMDAwMCkgPj4gMjM7CisgICAgaW50IHNpZ24gPSB2YWwzMiAmIDB4ODAwMDAwMDA7CisKKyAgICBpZiAoZmxvYXQzMl9pc19hbnlfbmFuKGEpKSB7CisgICAgICAgIGlmIChmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oYSkpIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxpZCwgcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfZGVmYXVsdF9uYW47CisgICAgfSBlbHNlIGlmIChmbG9hdDMyX2lzX2luZmluaXR5KGEpKSB7CisgICAgICAgIHJldHVybiBmbG9hdDMyX3NldF9zaWduKGZsb2F0MzJfemVybywgZmxvYXQzMl9pc19uZWcoYSkpOworICAgIH0gZWxzZSBpZiAoZmxvYXQzMl9pc196ZXJvX29yX2Rlbm9ybWFsKGEpKSB7CisgICAgICAgIGlmICghZmxvYXQzMl9pc196ZXJvKGEpKSB7CisgICAgICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2lucHV0X2Rlbm9ybWFsLCBzKTsKKyAgICAgICAgfQorICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2RpdmJ5emVybywgcyk7CisgICAgICAgIHJldHVybiBmbG9hdDMyX3NldF9zaWduKGZsb2F0MzJfaW5maW5pdHksIGZsb2F0MzJfaXNfbmVnKGEpKTsKKyAgICB9IGVsc2UgaWYgKGFfZXhwID49IDI1MykgeworICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX3VuZGVyZmxvdywgcyk7CisgICAgICAgIHJldHVybiBmbG9hdDMyX3NldF9zaWduKGZsb2F0MzJfemVybywgZmxvYXQzMl9pc19uZWcoYSkpOworICAgIH0KKworICAgIGY2NCA9IG1ha2VfZmxvYXQ2NCgoMHgzZmVVTEwgPDwgNTIpCisgICAgICAgICAgICAgICAgICAgICAgIHwgKChpbnQ2NF90KSh2YWwzMiAmIDB4N2ZmZmZmKSA8PCAyOSkpOworCisgICAgcmVzdWx0X2V4cCA9IDI1MyAtIGFfZXhwOworCisgICAgZjY0ID0gcmVjaXBfZXN0aW1hdGUoZjY0LCBlbnYpOworCisgICAgdmFsMzIgPSBzaWduCisgICAgICAgIHwgKChyZXN1bHRfZXhwICYgMHhmZikgPDwgMjMpCisgICAgICAgIHwgKChmbG9hdDY0X3ZhbChmNjQpID4+IDI5KSAmIDB4N2ZmZmZmKTsKKyAgICByZXR1cm4gbWFrZV9mbG9hdDMyKHZhbDMyKTsKK30KKworLyogVGhlIGFsZ29yaXRobSB0aGF0IG11c3QgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGVzdGltYXRlCisgKiBpcyBzcGVjaWZpZWQgYnkgdGhlIEFSTSBBUk0uCisgKi8KK3N0YXRpYyBmbG9hdDY0IHJlY2lwX3NxcnRfZXN0aW1hdGUoZmxvYXQ2NCBhLCBDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIC8qIFRoZXNlIGNhbGN1bGF0aW9ucyBtdXN0bid0IHNldCBhbnkgZnAgZXhjZXB0aW9uIGZsYWdzLAorICAgICAqIHNvIHdlIHVzZSBhIGxvY2FsIGNvcHkgb2YgdGhlIGZwX3N0YXR1cy4KKyAgICAgKi8KKyAgICBmbG9hdF9zdGF0dXMgZHVtbXlfc3RhdHVzID0gZW52LT52ZnAuc3RhbmRhcmRfZnBfc3RhdHVzOworICAgIGZsb2F0X3N0YXR1cyAqcyA9ICZkdW1teV9zdGF0dXM7CisgICAgZmxvYXQ2NCBxOworICAgIGludDY0X3QgcV9pbnQ7CisKKyAgICBpZiAoZmxvYXQ2NF9sdChhLCBmbG9hdDY0X2hhbGYsIHMpKSB7CisgICAgICAgIC8qIHJhbmdlIDAuMjUgPD0gYSA8IDAuNSAqLworCisgICAgICAgIC8qIGEgaW4gdW5pdHMgb2YgMS81MTIgcm91bmRlZCBkb3duICovCisgICAgICAgIC8qIHEwID0gKGludCkoYSAqIDUxMi4wKTsgICovCisgICAgICAgIHEgPSBmbG9hdDY0X211bChmbG9hdDY0XzUxMiwgYSwgcyk7CisgICAgICAgIHFfaW50ID0gZmxvYXQ2NF90b19pbnQ2NF9yb3VuZF90b196ZXJvKHEsIHMpOworCisgICAgICAgIC8qIHJlY2lwcm9jYWwgcm9vdCByICovCisgICAgICAgIC8qIHIgPSAxLjAgLyBzcXJ0KCgoZG91YmxlKXEwICsgMC41KSAvIDUxMi4wKTsgICovCisgICAgICAgIHEgPSBpbnQ2NF90b19mbG9hdDY0KHFfaW50LCBzKTsKKyAgICAgICAgcSA9IGZsb2F0NjRfYWRkKHEsIGZsb2F0NjRfaGFsZiwgcyk7CisgICAgICAgIHEgPSBmbG9hdDY0X2RpdihxLCBmbG9hdDY0XzUxMiwgcyk7CisgICAgICAgIHEgPSBmbG9hdDY0X3NxcnQocSwgcyk7CisgICAgICAgIHEgPSBmbG9hdDY0X2RpdihmbG9hdDY0X29uZSwgcSwgcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcmFuZ2UgMC41IDw9IGEgPCAxLjAgKi8KKworICAgICAgICAvKiBhIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgZG93biAqLworICAgICAgICAvKiBxMSA9IChpbnQpKGEgKiAyNTYuMCk7ICovCisgICAgICAgIHEgPSBmbG9hdDY0X211bChmbG9hdDY0XzI1NiwgYSwgcyk7CisgICAgICAgIGludDY0X3QgcV9pbnQgPSBmbG9hdDY0X3RvX2ludDY0X3JvdW5kX3RvX3plcm8ocSwgcyk7CisKKyAgICAgICAgLyogcmVjaXByb2NhbCByb290IHIgKi8KKyAgICAgICAgLyogciA9IDEuMCAvc3FydCgoKGRvdWJsZSlxMSArIDAuNSkgLyAyNTYpOyAqLworICAgICAgICBxID0gaW50NjRfdG9fZmxvYXQ2NChxX2ludCwgcyk7CisgICAgICAgIHEgPSBmbG9hdDY0X2FkZChxLCBmbG9hdDY0X2hhbGYsIHMpOworICAgICAgICBxID0gZmxvYXQ2NF9kaXYocSwgZmxvYXQ2NF8yNTYsIHMpOworICAgICAgICBxID0gZmxvYXQ2NF9zcXJ0KHEsIHMpOworICAgICAgICBxID0gZmxvYXQ2NF9kaXYoZmxvYXQ2NF9vbmUsIHEsIHMpOworICAgIH0KKyAgICAvKiByIGluIHVuaXRzIG9mIDEvMjU2IHJvdW5kZWQgdG8gbmVhcmVzdCAqLworICAgIC8qIHMgPSAoaW50KSgyNTYuMCAqIHIgKyAwLjUpOyAqLworCisgICAgcSA9IGZsb2F0NjRfbXVsKHEsIGZsb2F0NjRfMjU2LHMgKTsKKyAgICBxID0gZmxvYXQ2NF9hZGQocSwgZmxvYXQ2NF9oYWxmLCBzKTsKKyAgICBxX2ludCA9IGZsb2F0NjRfdG9faW50NjRfcm91bmRfdG9femVybyhxLCBzKTsKKworICAgIC8qIHJldHVybiAoZG91YmxlKXMgLyAyNTYuMDsqLworICAgIHJldHVybiBmbG9hdDY0X2RpdihpbnQ2NF90b19mbG9hdDY0KHFfaW50LCBzKSwgZmxvYXQ2NF8yNTYsIHMpOworfQorCitmbG9hdDMyIEhFTFBFUihyc3FydGVfZjMyKShmbG9hdDMyIGEsIENQVUFSTVN0YXRlICplbnYpCit7CisgICAgZmxvYXRfc3RhdHVzICpzID0gJmVudi0+dmZwLnN0YW5kYXJkX2ZwX3N0YXR1czsKKyAgICBpbnQgcmVzdWx0X2V4cDsKKyAgICBmbG9hdDY0IGY2NDsKKyAgICB1aW50MzJfdCB2YWw7CisgICAgdWludDY0X3QgdmFsNjQ7CisKKyAgICB2YWwgPSBmbG9hdDMyX3ZhbChhKTsKKworICAgIGlmIChmbG9hdDMyX2lzX2FueV9uYW4oYSkpIHsKKyAgICAgICAgaWYgKGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbihhKSkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxvYXQzMl9kZWZhdWx0X25hbjsKKyAgICB9IGVsc2UgaWYgKGZsb2F0MzJfaXNfemVyb19vcl9kZW5vcm1hbChhKSkgeworICAgICAgICBpZiAoIWZsb2F0MzJfaXNfemVybyhhKSkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnB1dF9kZW5vcm1hbCwgcyk7CisgICAgICAgIH0KKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19kaXZieXplcm8sIHMpOworICAgICAgICByZXR1cm4gZmxvYXQzMl9zZXRfc2lnbihmbG9hdDMyX2luZmluaXR5LCBmbG9hdDMyX2lzX25lZyhhKSk7CisgICAgfSBlbHNlIGlmIChmbG9hdDMyX2lzX25lZyhhKSkgeworICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQsIHMpOworICAgICAgICByZXR1cm4gZmxvYXQzMl9kZWZhdWx0X25hbjsKKyAgICB9IGVsc2UgaWYgKGZsb2F0MzJfaXNfaW5maW5pdHkoYSkpIHsKKyAgICAgICAgcmV0dXJuIGZsb2F0MzJfemVybzsKKyAgICB9CisKKyAgICAvKiBOb3JtYWxpemUgdG8gYSBkb3VibGUtcHJlY2lzaW9uIHZhbHVlIGJldHdlZW4gMC4yNSBhbmQgMS4wLAorICAgICAqIHByZXNlcnZpbmcgdGhlIHBhcml0eSBvZiB0aGUgZXhwb25lbnQuICAqLworICAgIGlmICgodmFsICYgMHg4MDAwMDApID09IDApIHsKKyAgICAgICAgZjY0ID0gbWFrZV9mbG9hdDY0KCgodWludDY0X3QpKHZhbCAmIDB4ODAwMDAwMDApIDw8IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMHgzZmVVTEwgPDwgNTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodWludDY0X3QpKHZhbCAmIDB4N2ZmZmZmKSA8PCAyOSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGY2NCA9IG1ha2VfZmxvYXQ2NCgoKHVpbnQ2NF90KSh2YWwgJiAweDgwMDAwMDAwKSA8PCAzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDB4M2ZkVUxMIDw8IDUyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQ2NF90KSh2YWwgJiAweDdmZmZmZikgPDwgMjkpKTsKKyAgICB9CisKKyAgICByZXN1bHRfZXhwID0gKDM4MCAtICgodmFsICYgMHg3ZjgwMDAwMCkgPj4gMjMpKSAvIDI7CisKKyAgICBmNjQgPSByZWNpcF9zcXJ0X2VzdGltYXRlKGY2NCwgZW52KTsKKworICAgIHZhbDY0ID0gZmxvYXQ2NF92YWwoZjY0KTsKKworICAgIHZhbCA9ICgodmFsNjQgPj4gNjMpICAmIDB4ODAwMDAwMDApCisgICAgICAgIHwgKChyZXN1bHRfZXhwICYgMHhmZikgPDwgMjMpCisgICAgICAgIHwgKCh2YWw2NCA+PiAyOSkgICYgMHg3ZmZmZmYpOworICAgIHJldHVybiBtYWtlX2Zsb2F0MzIodmFsKTsKK30KKwordWludDMyX3QgSEVMUEVSKHJlY3BlX3UzMikodWludDMyX3QgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICBmbG9hdDY0IGY2NDsKKworICAgIGlmICgoYSAmIDB4ODAwMDAwMDApID09IDApIHsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CisgICAgfQorCisgICAgZjY0ID0gbWFrZV9mbG9hdDY0KCgweDNmZVVMTCA8PCA1MikKKyAgICAgICAgICAgICAgICAgICAgICAgfCAoKGludDY0X3QpKGEgJiAweDdmZmZmZmZmKSA8PCAyMSkpOworCisgICAgZjY0ID0gcmVjaXBfZXN0aW1hdGUgKGY2NCwgZW52KTsKKworICAgIHJldHVybiAweDgwMDAwMDAwIHwgKChmbG9hdDY0X3ZhbChmNjQpID4+IDIxKSAmIDB4N2ZmZmZmZmYpOworfQorCit1aW50MzJfdCBIRUxQRVIocnNxcnRlX3UzMikodWludDMyX3QgYSwgQ1BVQVJNU3RhdGUgKmVudikKK3sKKyAgICBmbG9hdDY0IGY2NDsKKworICAgIGlmICgoYSAmIDB4YzAwMDAwMDApID09IDApIHsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmY7CisgICAgfQorCisgICAgaWYgKGEgJiAweDgwMDAwMDAwKSB7CisgICAgICAgIGY2NCA9IG1ha2VfZmxvYXQ2NCgoMHgzZmVVTEwgPDwgNTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgodWludDY0X3QpKGEgJiAweDdmZmZmZmZmKSA8PCAyMSkpOworICAgIH0gZWxzZSB7IC8qIGJpdHMgMzEtMzAgPT0gJzAxJyAqLworICAgICAgICBmNjQgPSBtYWtlX2Zsb2F0NjQoKDB4M2ZkVUxMIDw8IDUyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKHVpbnQ2NF90KShhICYgMHgzZmZmZmZmZikgPDwgMjIpKTsKKyAgICB9CisKKyAgICBmNjQgPSByZWNpcF9zcXJ0X2VzdGltYXRlKGY2NCwgZW52KTsKKworICAgIHJldHVybiAweDgwMDAwMDAwIHwgKChmbG9hdDY0X3ZhbChmNjQpID4+IDIxKSAmIDB4N2ZmZmZmZmYpOworfQorCit2b2lkIEhFTFBFUihzZXRfdGVlY3IpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHZhbCkKK3sKKyAgICB2YWwgJj0gMTsKKyAgICBpZiAoZW52LT50ZWVjciAhPSB2YWwpIHsKKyAgICAgICAgZW52LT50ZWVjciA9IHZhbDsKKyAgICAgICAgdGJfZmx1c2goZW52KTsKKyAgICB9Cit9CisKK3ZvaWQgSEVMUEVSKHByb2ZpbGVCQikodm9pZCAqdGIpCit7CisgICAgKCpjb2RlX3Byb2ZpbGVfcmVjb3JkX2Z1bmMpKCgoVHJhbnNsYXRpb25CbG9jayAqKXRiKS0+cGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVHJhbnNsYXRpb25CbG9jayAqKXRiKS0+c2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vaGVscGVyLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzYTAwZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9oZWxwZXIuaApAQCAtMCwwICsxLDQ3NSBAQAorI2luY2x1ZGUgImV4ZWMvZGVmLWhlbHBlci5oIgorCitERUZfSEVMUEVSXzEoY2x6LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMShzeHRiMTYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKHV4dGIxNiwgaTMyLCBpMzIpCisKK0RFRl9IRUxQRVJfMyhhZGRfc2V0cSwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKGFkZF9zYXR1cmF0ZSwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKHN1Yl9zYXR1cmF0ZSwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKGFkZF91c2F0dXJhdGUsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhzdWJfdXNhdHVyYXRlLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIoZG91YmxlX3NhdHVyYXRlLCBpMzIsIGVudiwgczMyKQorREVGX0hFTFBFUl8yKHNkaXYsIHMzMiwgczMyLCBzMzIpCitERUZfSEVMUEVSXzIodWRpdiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMShyYml0LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMShhYnMsIGkzMiwgaTMyKQorCisjZGVmaW5lIFBBU19PUChwZngpICBcCisgICAgREVGX0hFTFBFUl8zKHBmeCAjIyBhZGQ4LCBpMzIsIGkzMiwgaTMyLCBwdHIpIFwKKyAgICBERUZfSEVMUEVSXzMocGZ4ICMjIHN1YjgsIGkzMiwgaTMyLCBpMzIsIHB0cikgXAorICAgIERFRl9IRUxQRVJfMyhwZnggIyMgc3ViMTYsIGkzMiwgaTMyLCBpMzIsIHB0cikgXAorICAgIERFRl9IRUxQRVJfMyhwZnggIyMgYWRkMTYsIGkzMiwgaTMyLCBpMzIsIHB0cikgXAorICAgIERFRl9IRUxQRVJfMyhwZnggIyMgYWRkc3VieCwgaTMyLCBpMzIsIGkzMiwgcHRyKSBcCisgICAgREVGX0hFTFBFUl8zKHBmeCAjIyBzdWJhZGR4LCBpMzIsIGkzMiwgaTMyLCBwdHIpCisKK1BBU19PUChzKQorUEFTX09QKHUpCisjdW5kZWYgUEFTX09QCisKKyNkZWZpbmUgUEFTX09QKHBmeCkgIFwKKyAgICBERUZfSEVMUEVSXzIocGZ4ICMjIGFkZDgsIGkzMiwgaTMyLCBpMzIpIFwKKyAgICBERUZfSEVMUEVSXzIocGZ4ICMjIHN1YjgsIGkzMiwgaTMyLCBpMzIpIFwKKyAgICBERUZfSEVMUEVSXzIocGZ4ICMjIHN1YjE2LCBpMzIsIGkzMiwgaTMyKSBcCisgICAgREVGX0hFTFBFUl8yKHBmeCAjIyBhZGQxNiwgaTMyLCBpMzIsIGkzMikgXAorICAgIERFRl9IRUxQRVJfMihwZnggIyMgYWRkc3VieCwgaTMyLCBpMzIsIGkzMikgXAorICAgIERFRl9IRUxQRVJfMihwZnggIyMgc3ViYWRkeCwgaTMyLCBpMzIsIGkzMikKK1BBU19PUChxKQorUEFTX09QKHNoKQorUEFTX09QKHVxKQorUEFTX09QKHVoKQorI3VuZGVmIFBBU19PUAorCitERUZfSEVMUEVSXzMoc3NhdCwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKHVzYXQsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhzc2F0MTYsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyh1c2F0MTYsIGkzMiwgZW52LCBpMzIsIGkzMikKKworREVGX0hFTFBFUl8yKHVzYWQ4LCBpMzIsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzEobG9naWNxX2NjLCBpMzIsIGk2NCkKKworREVGX0hFTFBFUl8zKHNlbF9mbGFncywgaTMyLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKGV4Y2VwdGlvbiwgdm9pZCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzEod2ZpLCB2b2lkLCBlbnYpCisKK0RFRl9IRUxQRVJfMyhjcHNyX3dyaXRlLCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKGNwc3JfcmVhZCwgaTMyLCBlbnYpCisKK0RFRl9IRUxQRVJfMyh2N21fbXNyLCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKHY3bV9tcnMsIGkzMiwgZW52LCBpMzIpCisKK0RFRl9IRUxQRVJfMyhzZXRfY3AxNSwgdm9pZCwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihnZXRfY3AxNSwgaTMyLCBlbnYsIGkzMikKKworREVGX0hFTFBFUl8zKHNldF9jcCwgdm9pZCwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihnZXRfY3AsIGkzMiwgZW52LCBpMzIpCisKK0RFRl9IRUxQRVJfMihnZXRfcjEzX2JhbmtlZCwgaTMyLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMyhzZXRfcjEzX2JhbmtlZCwgdm9pZCwgZW52LCBpMzIsIGkzMikKKworREVGX0hFTFBFUl8yKGdldF91c2VyX3JlZywgaTMyLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMyhzZXRfdXNlcl9yZWcsIHZvaWQsIGVudiwgaTMyLCBpMzIpCisKK0RFRl9IRUxQRVJfMSh2ZnBfZ2V0X2Zwc2NyLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfMih2ZnBfc2V0X2Zwc2NyLCB2b2lkLCBlbnYsIGkzMikKKworREVGX0hFTFBFUl8zKHZmcF9hZGRzLCBmMzIsIGYzMiwgZjMyLCBwdHIpCitERUZfSEVMUEVSXzModmZwX2FkZGQsIGY2NCwgZjY0LCBmNjQsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfc3VicywgZjMyLCBmMzIsIGYzMiwgcHRyKQorREVGX0hFTFBFUl8zKHZmcF9zdWJkLCBmNjQsIGY2NCwgZjY0LCBwdHIpCitERUZfSEVMUEVSXzModmZwX211bHMsIGYzMiwgZjMyLCBmMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfbXVsZCwgZjY0LCBmNjQsIGY2NCwgcHRyKQorREVGX0hFTFBFUl8zKHZmcF9kaXZzLCBmMzIsIGYzMiwgZjMyLCBwdHIpCitERUZfSEVMUEVSXzModmZwX2RpdmQsIGY2NCwgZjY0LCBmNjQsIHB0cikKK0RFRl9IRUxQRVJfMSh2ZnBfbmVncywgZjMyLCBmMzIpCitERUZfSEVMUEVSXzEodmZwX25lZ2QsIGY2NCwgZjY0KQorREVGX0hFTFBFUl8xKHZmcF9hYnNzLCBmMzIsIGYzMikKK0RFRl9IRUxQRVJfMSh2ZnBfYWJzZCwgZjY0LCBmNjQpCitERUZfSEVMUEVSXzIodmZwX3NxcnRzLCBmMzIsIGYzMiwgZW52KQorREVGX0hFTFBFUl8yKHZmcF9zcXJ0ZCwgZjY0LCBmNjQsIGVudikKK0RFRl9IRUxQRVJfMyh2ZnBfY21wcywgdm9pZCwgZjMyLCBmMzIsIGVudikKK0RFRl9IRUxQRVJfMyh2ZnBfY21wZCwgdm9pZCwgZjY0LCBmNjQsIGVudikKK0RFRl9IRUxQRVJfMyh2ZnBfY21wZXMsIHZvaWQsIGYzMiwgZjMyLCBlbnYpCitERUZfSEVMUEVSXzModmZwX2NtcGVkLCB2b2lkLCBmNjQsIGY2NCwgZW52KQorCitERUZfSEVMUEVSXzIodmZwX2ZjdnRkcywgZjY0LCBmMzIsIGVudikKK0RFRl9IRUxQRVJfMih2ZnBfZmN2dHNkLCBmMzIsIGY2NCwgZW52KQorCitERUZfSEVMUEVSXzIodmZwX3VpdG9zLCBmMzIsIGkzMiwgcHRyKQorREVGX0hFTFBFUl8yKHZmcF91aXRvZCwgZjY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMih2ZnBfc2l0b3MsIGYzMiwgaTMyLCBwdHIpCitERUZfSEVMUEVSXzIodmZwX3NpdG9kLCBmNjQsIGkzMiwgcHRyKQorCitERUZfSEVMUEVSXzIodmZwX3RvdWlzLCBpMzIsIGYzMiwgcHRyKQorREVGX0hFTFBFUl8yKHZmcF90b3VpZCwgaTMyLCBmNjQsIHB0cikKK0RFRl9IRUxQRVJfMih2ZnBfdG91aXpzLCBpMzIsIGYzMiwgcHRyKQorREVGX0hFTFBFUl8yKHZmcF90b3VpemQsIGkzMiwgZjY0LCBwdHIpCitERUZfSEVMUEVSXzIodmZwX3Rvc2lzLCBpMzIsIGYzMiwgcHRyKQorREVGX0hFTFBFUl8yKHZmcF90b3NpZCwgaTMyLCBmNjQsIHB0cikKK0RFRl9IRUxQRVJfMih2ZnBfdG9zaXpzLCBpMzIsIGYzMiwgcHRyKQorREVGX0hFTFBFUl8yKHZmcF90b3NpemQsIGkzMiwgZjY0LCBwdHIpCisKK0RFRl9IRUxQRVJfMyh2ZnBfdG9zaHMsIGkzMiwgZjMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG9zbHMsIGkzMiwgZjMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG91aHMsIGkzMiwgZjMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG91bHMsIGkzMiwgZjMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG9zaGQsIGk2NCwgZjY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG9zbGQsIGk2NCwgZjY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG91aGQsIGk2NCwgZjY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdG91bGQsIGk2NCwgZjY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfc2h0b3MsIGYzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfc2x0b3MsIGYzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdWh0b3MsIGYzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdWx0b3MsIGYzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfc2h0b2QsIGY2NCwgaTY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfc2x0b2QsIGY2NCwgaTY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdWh0b2QsIGY2NCwgaTY0LCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyh2ZnBfdWx0b2QsIGY2NCwgaTY0LCBpMzIsIHB0cikKKworREVGX0hFTFBFUl8yKHZmcF9mY3Z0X2YxNl90b19mMzIsIGYzMiwgaTMyLCBlbnYpCitERUZfSEVMUEVSXzIodmZwX2ZjdnRfZjMyX3RvX2YxNiwgaTMyLCBmMzIsIGVudikKK0RFRl9IRUxQRVJfMihuZW9uX2ZjdnRfZjE2X3RvX2YzMiwgZjMyLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfMihuZW9uX2ZjdnRfZjMyX3RvX2YxNiwgaTMyLCBmMzIsIGVudikKKworREVGX0hFTFBFUl8zKHJlY3BzX2YzMiwgZjMyLCBmMzIsIGYzMiwgZW52KQorREVGX0hFTFBFUl8zKHJzcXJ0c19mMzIsIGYzMiwgZjMyLCBmMzIsIGVudikKK0RFRl9IRUxQRVJfMihyZWNwZV9mMzIsIGYzMiwgZjMyLCBlbnYpCitERUZfSEVMUEVSXzIocnNxcnRlX2YzMiwgZjMyLCBmMzIsIGVudikKK0RFRl9IRUxQRVJfMihyZWNwZV91MzIsIGkzMiwgaTMyLCBlbnYpCitERUZfSEVMUEVSXzIocnNxcnRlX3UzMiwgaTMyLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfNShuZW9uX3RibCwgaTMyLCBlbnYsIGkzMiwgaTMyLCBpMzIsIGkzMikKKworREVGX0hFTFBFUl8zKGFkZF9jYywgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKGFkY19jYywgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKHN1Yl9jYywgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKHNiY19jYywgaTMyLCBlbnYsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzIoc2hsLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKHNociwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihzYXIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMoc2hsX2NjLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMoc2hyX2NjLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMoc2FyX2NjLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMocm9yX2NjLCBpMzIsIGVudiwgaTMyLCBpMzIpCisKKy8qIG5lb25faGVscGVyLmMgKi8KK0RFRl9IRUxQRVJfMyhuZW9uX3FhZGRfdTgsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FhZGRfczgsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FhZGRfdTE2LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xYWRkX3MxNiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcWFkZF91MzIsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FhZGRfczMyLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc3ViX3U4LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc3ViX3M4LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc3ViX3UxNiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXN1Yl9zMTYsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FzdWJfdTMyLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc3ViX3MzMiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcWFkZF91NjQsIGk2NCwgZW52LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhuZW9uX3FhZGRfczY0LCBpNjQsIGVudiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzMobmVvbl9xc3ViX3U2NCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKG5lb25fcXN1Yl9zNjQsIGk2NCwgZW52LCBpNjQsIGk2NCkKKworREVGX0hFTFBFUl8yKG5lb25faGFkZF9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2hhZGRfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9oYWRkX3MxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2hhZGRfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25faGFkZF9zMzIsIHMzMiwgczMyLCBzMzIpCitERUZfSEVMUEVSXzIobmVvbl9oYWRkX3UzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3JoYWRkX3M4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcmhhZGRfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yaGFkZF9zMTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yaGFkZF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yaGFkZF9zMzIsIHMzMiwgczMyLCBzMzIpCitERUZfSEVMUEVSXzIobmVvbl9yaGFkZF91MzIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9oc3ViX3M4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25faHN1Yl91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2hzdWJfczE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25faHN1Yl91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9oc3ViX3MzMiwgczMyLCBzMzIsIHMzMikKK0RFRl9IRUxQRVJfMihuZW9uX2hzdWJfdTMyLCBpMzIsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzIobmVvbl9jZ3RfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9jZ3RfczgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9jZ3RfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fY2d0X3MxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2NndF91MzIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9jZ3RfczMyLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fY2dlX3U4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fY2dlX3M4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fY2dlX3UxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2NnZV9zMTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9jZ2VfdTMyLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fY2dlX3MzMiwgaTMyLCBpMzIsIGkzMikKKworREVGX0hFTFBFUl8yKG5lb25fbWluX3U4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fbWluX3M4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fbWluX3UxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX21pbl9zMTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9taW5fdTMyLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fbWluX3MzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX21heF91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX21heF9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX21heF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9tYXhfczE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fbWF4X3UzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX21heF9zMzIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9wbWluX3U4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcG1pbl9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3BtaW5fdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcG1pbl9zMTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9wbWF4X3U4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcG1heF9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3BtYXhfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcG1heF9zMTYsIGkzMiwgaTMyLCBpMzIpCisKK0RFRl9IRUxQRVJfMihuZW9uX2FiZF91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2FiZF9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2FiZF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9hYmRfczE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fYWJkX3UzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2FiZF9zMzIsIGkzMiwgaTMyLCBpMzIpCisKK0RFRl9IRUxQRVJfMihuZW9uX3NobF91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3NobF9zOCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3NobF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9zaGxfczE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fc2hsX3UzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3NobF9zMzIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9zaGxfdTY0LCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fc2hsX3M2NCwgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX3JzaGxfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yc2hsX3M4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcnNobF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yc2hsX3MxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3JzaGxfdTMyLCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcnNobF9zMzIsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9yc2hsX3U2NCwgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX3JzaGxfczY0LCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKG5lb25fcXNobF91OCwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXNobF9zOCwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXNobF91MTYsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FzaGxfczE2LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc2hsX3UzMiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXNobF9zMzIsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FzaGxfdTY0LCBpNjQsIGVudiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzMobmVvbl9xc2hsX3M2NCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKG5lb25fcXNobHVfczgsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FzaGx1X3MxNiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXNobHVfczMyLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xc2hsdV9zNjQsIGk2NCwgZW52LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhuZW9uX3Fyc2hsX3U4LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xcnNobF9zOCwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXJzaGxfdTE2LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xcnNobF9zMTYsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3Fyc2hsX3UzMiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXJzaGxfczMyLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xcnNobF91NjQsIGk2NCwgZW52LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhuZW9uX3Fyc2hsX3M2NCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorCitERUZfSEVMUEVSXzIobmVvbl9hZGRfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9hZGRfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcGFkZF91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3BhZGRfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fc3ViX3U4LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fc3ViX3UxNiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX211bF91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX211bF91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9tdWxfcDgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9tdWxsX3A4LCBpNjQsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzIobmVvbl90c3RfdTgsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl90c3RfdTE2LCBpMzIsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fdHN0X3UzMiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2NlcV91OCwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2NlcV91MTYsIGkzMiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9jZXFfdTMyLCBpMzIsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzEobmVvbl9hYnNfczgsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKG5lb25fYWJzX3MxNiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzEobmVvbl9jbHpfdTgsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKG5lb25fY2x6X3UxNiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzEobmVvbl9jbHNfczgsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKG5lb25fY2xzX3MxNiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzEobmVvbl9jbHNfczMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMShuZW9uX2NudF91OCwgaTMyLCBpMzIpCisKK0RFRl9IRUxQRVJfMyhuZW9uX3FkbXVsaF9zMTYsIGkzMiwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3FyZG11bGhfczE2LCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xZG11bGhfczMyLCBpMzIsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xcmRtdWxoX3MzMiwgaTMyLCBlbnYsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzEobmVvbl9uYXJyb3dfdTgsIGkzMiwgaTY0KQorREVGX0hFTFBFUl8xKG5lb25fbmFycm93X3UxNiwgaTMyLCBpNjQpCitERUZfSEVMUEVSXzIobmVvbl91bmFycm93X3NhdDgsIGkzMiwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIobmVvbl9uYXJyb3dfc2F0X3U4LCBpMzIsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fbmFycm93X3NhdF9zOCwgaTMyLCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX3VuYXJyb3dfc2F0MTYsIGkzMiwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIobmVvbl9uYXJyb3dfc2F0X3UxNiwgaTMyLCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX25hcnJvd19zYXRfczE2LCBpMzIsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fdW5hcnJvd19zYXQzMiwgaTMyLCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX25hcnJvd19zYXRfdTMyLCBpMzIsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fbmFycm93X3NhdF9zMzIsIGkzMiwgZW52LCBpNjQpCitERUZfSEVMUEVSXzEobmVvbl9uYXJyb3dfaGlnaF91OCwgaTMyLCBpNjQpCitERUZfSEVMUEVSXzEobmVvbl9uYXJyb3dfaGlnaF91MTYsIGkzMiwgaTY0KQorREVGX0hFTFBFUl8xKG5lb25fbmFycm93X3JvdW5kX2hpZ2hfdTgsIGkzMiwgaTY0KQorREVGX0hFTFBFUl8xKG5lb25fbmFycm93X3JvdW5kX2hpZ2hfdTE2LCBpMzIsIGk2NCkKK0RFRl9IRUxQRVJfMShuZW9uX3dpZGVuX3U4LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMShuZW9uX3dpZGVuX3M4LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMShuZW9uX3dpZGVuX3UxNiwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzEobmVvbl93aWRlbl9zMTYsIGk2NCwgaTMyKQorCitERUZfSEVMUEVSXzIobmVvbl9hZGRsX3UxNiwgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMihuZW9uX2FkZGxfdTMyLCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fcGFkZGxfdTE2LCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fcGFkZGxfdTMyLCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fc3VibF91MTYsIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIobmVvbl9zdWJsX3UzMiwgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhuZW9uX2FkZGxfc2F0dXJhdGVfczMyLCBpNjQsIGVudiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzMobmVvbl9hZGRsX3NhdHVyYXRlX3M2NCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKG5lb25fYWJkbF91MTYsIGk2NCwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9hYmRsX3MxNiwgaTY0LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2FiZGxfdTMyLCBpNjQsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fYWJkbF9zMzIsIGk2NCwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9hYmRsX3U2NCwgaTY0LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX2FiZGxfczY0LCBpNjQsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fbXVsbF91OCwgaTY0LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX211bGxfczgsIGk2NCwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9tdWxsX3UxNiwgaTY0LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX211bGxfczE2LCBpNjQsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzEobmVvbl9uZWdsX3UxNiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzEobmVvbl9uZWdsX3UzMiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzEobmVvbl9uZWdsX3U2NCwgaTY0LCBpNjQpCisKK0RFRl9IRUxQRVJfMihuZW9uX3FhYnNfczgsIGkzMiwgZW52LCBpMzIpCitERUZfSEVMUEVSXzIobmVvbl9xYWJzX3MxNiwgaTMyLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3FhYnNfczMyLCBpMzIsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcW5lZ19zOCwgaTMyLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihuZW9uX3FuZWdfczE2LCBpMzIsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fcW5lZ19zMzIsIGkzMiwgZW52LCBpMzIpCisKK0RFRl9IRUxQRVJfMyhuZW9uX21pbl9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX21heF9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX2FiZF9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX2NlcV9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX2NnZV9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX2NndF9mMzIsIGkzMiwgaTMyLCBpMzIsIHB0cikKK0RFRl9IRUxQRVJfMyhuZW9uX2FjZ2VfZjMyLCBpMzIsIGkzMiwgaTMyLCBwdHIpCitERUZfSEVMUEVSXzMobmVvbl9hY2d0X2YzMiwgaTMyLCBpMzIsIGkzMiwgcHRyKQorCisvKiBpd21teHRfaGVscGVyLmMgKi8KK0RFRl9IRUxQRVJfMihpd21teHRfbWFkZHNxLCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF9tYWRkdXEsIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3NhZGIsIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3NhZHcsIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X211bHNsdywgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMihpd21teHRfbXVsc2h3LCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF9tdWx1bHcsIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X211bHVodywgaTY0LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMihpd21teHRfbWFjc3csIGk2NCwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X21hY3V3LCBpNjQsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8xKGl3bW14dF9zZXRwc3JfbnosIGkzMiwgaTY0KQorCisjZGVmaW5lIERFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKG5hbWUpIFwKK0RFRl9IRUxQRVJfMyhpd21teHRfIyNuYW1lIyNiLCBpNjQsIGVudiwgaTY0LCBpNjQpIFwKK0RFRl9IRUxQRVJfMyhpd21teHRfIyNuYW1lIyN3LCBpNjQsIGVudiwgaTY0LCBpNjQpIFwKK0RFRl9IRUxQRVJfMyhpd21teHRfIyNuYW1lIyNsLCBpNjQsIGVudiwgaTY0LCBpNjQpIFwKKworREVGX0lXTU1YVF9IRUxQRVJfU0laRV9FTlYodW5wYWNrbCkKK0RFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKHVucGFja2gpCisKK0RFRl9IRUxQRVJfMihpd21teHRfdW5wYWNrbHViLCBpNjQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF91bnBhY2tsdXcsIGk2NCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3VucGFja2x1bCwgaTY0LCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihpd21teHRfdW5wYWNraHViLCBpNjQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF91bnBhY2todXcsIGk2NCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3VucGFja2h1bCwgaTY0LCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihpd21teHRfdW5wYWNrbHNiLCBpNjQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF91bnBhY2tsc3csIGk2NCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3VucGFja2xzbCwgaTY0LCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihpd21teHRfdW5wYWNraHNiLCBpNjQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGl3bW14dF91bnBhY2toc3csIGk2NCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoaXdtbXh0X3VucGFja2hzbCwgaTY0LCBlbnYsIGk2NCkKKworREVGX0lXTU1YVF9IRUxQRVJfU0laRV9FTlYoY21wZXEpCitERUZfSVdNTVhUX0hFTFBFUl9TSVpFX0VOVihjbXBndHUpCitERUZfSVdNTVhUX0hFTFBFUl9TSVpFX0VOVihjbXBndHMpCisKK0RFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKG1pbnMpCitERUZfSVdNTVhUX0hFTFBFUl9TSVpFX0VOVihtaW51KQorREVGX0lXTU1YVF9IRUxQRVJfU0laRV9FTlYobWF4cykKK0RFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKG1heHUpCisKK0RFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKHN1Ym4pCitERUZfSVdNTVhUX0hFTFBFUl9TSVpFX0VOVihhZGRuKQorREVGX0lXTU1YVF9IRUxQRVJfU0laRV9FTlYoc3VidSkKK0RFRl9JV01NWFRfSEVMUEVSX1NJWkVfRU5WKGFkZHUpCitERUZfSVdNTVhUX0hFTFBFUl9TSVpFX0VOVihzdWJzKQorREVGX0lXTU1YVF9IRUxQRVJfU0laRV9FTlYoYWRkcykKKworREVGX0hFTFBFUl8zKGl3bW14dF9hdmdiMCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKGl3bW14dF9hdmdiMSwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKGl3bW14dF9hdmd3MCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKGl3bW14dF9hdmd3MSwgaTY0LCBlbnYsIGk2NCwgaTY0KQorCitERUZfSEVMUEVSXzIoaXdtbXh0X21zYWRiLCBpNjQsIGk2NCwgaTY0KQorCitERUZfSEVMUEVSXzMoaXdtbXh0X2FsaWduLCBpNjQsIGk2NCwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzQoaXdtbXh0X2luc3IsIGk2NCwgaTY0LCBpMzIsIGkzMiwgaTMyKQorCitERUZfSEVMUEVSXzEoaXdtbXh0X2Jjc3RiLCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMShpd21teHRfYmNzdHcsIGk2NCwgaTMyKQorREVGX0hFTFBFUl8xKGl3bW14dF9iY3N0bCwgaTY0LCBpMzIpCisKK0RFRl9IRUxQRVJfMShpd21teHRfYWRkY2IsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8xKGl3bW14dF9hZGRjdywgaTY0LCBpNjQpCitERUZfSEVMUEVSXzEoaXdtbXh0X2FkZGNsLCBpNjQsIGk2NCkKKworREVGX0hFTFBFUl8xKGl3bW14dF9tc2JiLCBpMzIsIGk2NCkKK0RFRl9IRUxQRVJfMShpd21teHRfbXNidywgaTMyLCBpNjQpCitERUZfSEVMUEVSXzEoaXdtbXh0X21zYmwsIGkzMiwgaTY0KQorCitERUZfSEVMUEVSXzMoaXdtbXh0X3NybHcsIGk2NCwgZW52LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMyhpd21teHRfc3JsbCwgaTY0LCBlbnYsIGk2NCwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9zcmxxLCBpNjQsIGVudiwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzMoaXdtbXh0X3NsbHcsIGk2NCwgZW52LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMyhpd21teHRfc2xsbCwgaTY0LCBlbnYsIGk2NCwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9zbGxxLCBpNjQsIGVudiwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzMoaXdtbXh0X3NyYXcsIGk2NCwgZW52LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMyhpd21teHRfc3JhbCwgaTY0LCBlbnYsIGk2NCwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9zcmFxLCBpNjQsIGVudiwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzMoaXdtbXh0X3JvcncsIGk2NCwgZW52LCBpNjQsIGkzMikKK0RFRl9IRUxQRVJfMyhpd21teHRfcm9ybCwgaTY0LCBlbnYsIGk2NCwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9yb3JxLCBpNjQsIGVudiwgaTY0LCBpMzIpCitERUZfSEVMUEVSXzMoaXdtbXh0X3NodWZoLCBpNjQsIGVudiwgaTY0LCBpMzIpCisKK0RFRl9IRUxQRVJfMyhpd21teHRfcGFja3V3LCBpNjQsIGVudiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzMoaXdtbXh0X3BhY2t1bCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKGl3bW14dF9wYWNrdXEsIGk2NCwgZW52LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhpd21teHRfcGFja3N3LCBpNjQsIGVudiwgaTY0LCBpNjQpCitERUZfSEVMUEVSXzMoaXdtbXh0X3BhY2tzbCwgaTY0LCBlbnYsIGk2NCwgaTY0KQorREVGX0hFTFBFUl8zKGl3bW14dF9wYWNrc3EsIGk2NCwgZW52LCBpNjQsIGk2NCkKKworREVGX0hFTFBFUl8zKGl3bW14dF9tdWxhZGRzbCwgaTY0LCBpNjQsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9tdWxhZGRzdywgaTY0LCBpNjQsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKGl3bW14dF9tdWxhZGRzd2wsIGk2NCwgaTY0LCBpMzIsIGkzMikKKworREVGX0hFTFBFUl8yKHNldF90ZWVjciwgdm9pZCwgZW52LCBpMzIpCisKK0RFRl9IRUxQRVJfMyhuZW9uX3VuemlwOCwgdm9pZCwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3VuemlwMTYsIHZvaWQsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xdW56aXA4LCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXVuemlwMTYsIHZvaWQsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl9xdW56aXAzMiwgdm9pZCwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3ppcDgsIHZvaWQsIGVudiwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzMobmVvbl96aXAxNiwgdm9pZCwgZW52LCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyhuZW9uX3F6aXA4LCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXppcDE2LCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8zKG5lb25fcXppcDMyLCB2b2lkLCBlbnYsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8yKG5lb25fdmxkc3RfYWxsLCB2b2lkLCBlbnYsIGkzMikKKworREVGX0hFTFBFUl8xKHByb2ZpbGVCQiwgdm9pZCwgcHRyKQorCisjaW5jbHVkZSAiZXhlYy9kZWYtaGVscGVyLmgiCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vaXdtbXh0X2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2l3bW14dF9oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjVlNzMzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL2l3bW14dF9oZWxwZXIuYwpAQCAtMCwwICsxLDY4MiBAQAorLyoKKyAqIGl3TU1YdCBtaWNybyBvcGVyYXRpb25zIGZvciBYU2NhbGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3IE9wZW5lZEhhbmQsIEx0ZC4KKyAqIFdyaXR0ZW4gYnkgQW5kcnplaiBaYWJvcm93c2tpIDxhbmRyZXdAb3BlbmVkaGFuZC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZVNvdXJjZXJ5CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZXhlYy9leGVjLWFsbC5oIgorI2luY2x1ZGUgInFlbXUvYml0b3BzLmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKy8qIGl3TU1YdCBtYWNyb3MgZXh0cmFjdGVkIGZyb20gR05VIGdkYi4gICovCisKKy8qIFNldCB0aGUgU0lNRCB3Q0FTRiBmbGFncyBmb3IgOCwgMTYsIDMyIG9yIDY0LWJpdCBvcGVyYXRpb25zLiAgKi8KKyNkZWZpbmUgU0lNRDhfU0VUKCB2LCBuLCBiKQkoKHYgIT0gMCkgPDwgKCgoKGIpICsgMSkgKiA0KSArIChuKSkpCisjZGVmaW5lIFNJTUQxNl9TRVQodiwgbiwgaCkJKCh2ICE9IDApIDw8ICgoKChoKSArIDEpICogOCkgKyAobikpKQorI2RlZmluZSBTSU1EMzJfU0VUKHYsIG4sIHcpCSgodiAhPSAwKSA8PCAoKCgodykgKyAxKSAqIDE2KSArIChuKSkpCisjZGVmaW5lIFNJTUQ2NF9TRVQodiwgbikJKCh2ICE9IDApIDw8ICgzMiArIChuKSkpCisvKiBGbGFncyB0byBwYXNzIGFzICJuIiBhYm92ZS4gICovCisjZGVmaW5lIFNJTURfTkJJVAktMQorI2RlZmluZSBTSU1EX1pCSVQJLTIKKyNkZWZpbmUgU0lNRF9DQklUCS0zCisjZGVmaW5lIFNJTURfVkJJVAktNAorLyogVmFyaW91cyBzdGF0dXMgYml0IG1hY3Jvcy4gICovCisjZGVmaW5lIE5CSVQ4KHgpCSgoeCkgJiAweDgwKQorI2RlZmluZSBOQklUMTYoeCkJKCh4KSAmIDB4ODAwMCkKKyNkZWZpbmUgTkJJVDMyKHgpCSgoeCkgJiAweDgwMDAwMDAwKQorI2RlZmluZSBOQklUNjQoeCkJKCh4KSAmIDB4ODAwMDAwMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgWkJJVDgoeCkJKCgoeCkgJiAweGZmKSA9PSAwKQorI2RlZmluZSBaQklUMTYoeCkJKCgoeCkgJiAweGZmZmYpID09IDApCisjZGVmaW5lIFpCSVQzMih4KQkoKCh4KSAmIDB4ZmZmZmZmZmYpID09IDApCisjZGVmaW5lIFpCSVQ2NCh4KQkoeCA9PSAwKQorLyogU2lnbiBleHRlbnNpb24gbWFjcm9zLiAgKi8KKyNkZWZpbmUgRVhURU5EOEgoYSkJKCh1aW50MTZfdCkgKGludDhfdCkgKGEpKQorI2RlZmluZSBFWFRFTkQ4KGEpCSgodWludDMyX3QpIChpbnQ4X3QpIChhKSkKKyNkZWZpbmUgRVhURU5EMTYoYSkJKCh1aW50MzJfdCkgKGludDE2X3QpIChhKSkKKyNkZWZpbmUgRVhURU5EMTZTKGEpCSgoaW50MzJfdCkgKGludDE2X3QpIChhKSkKKyNkZWZpbmUgRVhURU5EMzIoYSkJKCh1aW50NjRfdCkgKGludDMyX3QpIChhKSkKKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tYWRkc3EpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgYSA9ICgoCisgICAgICAgICAgICBFWFRFTkQxNlMoKGEgPj4gMCkgJiAweGZmZmYpICogRVhURU5EMTZTKChiID4+IDApICYgMHhmZmZmKSArCisgICAgICAgICAgICBFWFRFTkQxNlMoKGEgPj4gMTYpICYgMHhmZmZmKSAqIEVYVEVORDE2UygoYiA+PiAxNikgJiAweGZmZmYpCisgICAgICAgICkgJiAweGZmZmZmZmZmKSB8ICgodWludDY0X3QpICgKKyAgICAgICAgICAgIEVYVEVORDE2UygoYSA+PiAzMikgJiAweGZmZmYpICogRVhURU5EMTZTKChiID4+IDMyKSAmIDB4ZmZmZikgKworICAgICAgICAgICAgRVhURU5EMTZTKChhID4+IDQ4KSAmIDB4ZmZmZikgKiBFWFRFTkQxNlMoKGIgPj4gNDgpICYgMHhmZmZmKQorICAgICAgICApIDw8IDMyKTsKKyAgICByZXR1cm4gYTsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tYWRkdXEpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgYSA9ICgoCisgICAgICAgICAgICAoKGEgPj4gMCkgJiAweGZmZmYpICogKChiID4+IDApICYgMHhmZmZmKSArCisgICAgICAgICAgICAoKGEgPj4gMTYpICYgMHhmZmZmKSAqICgoYiA+PiAxNikgJiAweGZmZmYpCisgICAgICAgICkgJiAweGZmZmZmZmZmKSB8ICgoCisgICAgICAgICAgICAoKGEgPj4gMzIpICYgMHhmZmZmKSAqICgoYiA+PiAzMikgJiAweGZmZmYpICsKKyAgICAgICAgICAgICgoYSA+PiA0OCkgJiAweGZmZmYpICogKChiID4+IDQ4KSAmIDB4ZmZmZikKKyAgICAgICAgKSA8PCAzMik7CisgICAgcmV0dXJuIGE7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfc2FkYikodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyNkZWZpbmUgYWJzKHgpICgoKHgpID49IDApID8geCA6IC14KQorI2RlZmluZSBTQURCKFNIUikgYWJzKChpbnQpICgoYSA+PiBTSFIpICYgMHhmZikgLSAoaW50KSAoKGIgPj4gU0hSKSAmIDB4ZmYpKQorICAgIHJldHVybgorICAgICAgICBTQURCKDApICsgU0FEQig4KSArIFNBREIoMTYpICsgU0FEQigyNCkgKworICAgICAgICBTQURCKDMyKSArIFNBREIoNDApICsgU0FEQig0OCkgKyBTQURCKDU2KTsKKyN1bmRlZiBTQURCCit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfc2FkdykodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyNkZWZpbmUgU0FEVyhTSFIpIFwKKyAgICBhYnMoKGludCkgKChhID4+IFNIUikgJiAweGZmZmYpIC0gKGludCkgKChiID4+IFNIUikgJiAweGZmZmYpKQorICAgIHJldHVybiBTQURXKDApICsgU0FEVygxNikgKyBTQURXKDMyKSArIFNBRFcoNDgpOworI3VuZGVmIFNBRFcKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tdWxzbHcpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisjZGVmaW5lIE1VTFMoU0hSKSAoKHVpbnQ2NF90KSAoKCggXAorICAgICAgICBFWFRFTkQxNlMoKGEgPj4gU0hSKSAmIDB4ZmZmZikgKiBFWFRFTkQxNlMoKGIgPj4gU0hSKSAmIDB4ZmZmZikgXAorICAgICkgPj4gMCkgJiAweGZmZmYpIDw8IFNIUikKKyAgICByZXR1cm4gTVVMUygwKSB8IE1VTFMoMTYpIHwgTVVMUygzMikgfCBNVUxTKDQ4KTsKKyN1bmRlZiBNVUxTCit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfbXVsc2h3KSh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworI2RlZmluZSBNVUxTKFNIUikgKCh1aW50NjRfdCkgKCgoIFwKKyAgICAgICAgRVhURU5EMTZTKChhID4+IFNIUikgJiAweGZmZmYpICogRVhURU5EMTZTKChiID4+IFNIUikgJiAweGZmZmYpIFwKKyAgICApID4+IDE2KSAmIDB4ZmZmZikgPDwgU0hSKQorICAgIHJldHVybiBNVUxTKDApIHwgTVVMUygxNikgfCBNVUxTKDMyKSB8IE1VTFMoNDgpOworI3VuZGVmIE1VTFMKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tdWx1bHcpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisjZGVmaW5lIE1VTFUoU0hSKSAoKHVpbnQ2NF90KSAoKCggXAorICAgICAgICAoKGEgPj4gU0hSKSAmIDB4ZmZmZikgKiAoKGIgPj4gU0hSKSAmIDB4ZmZmZikgXAorICAgICkgPj4gMCkgJiAweGZmZmYpIDw8IFNIUikKKyAgICByZXR1cm4gTVVMVSgwKSB8IE1VTFUoMTYpIHwgTVVMVSgzMikgfCBNVUxVKDQ4KTsKKyN1bmRlZiBNVUxVCit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfbXVsdWh3KSh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworI2RlZmluZSBNVUxVKFNIUikgKCh1aW50NjRfdCkgKCgoIFwKKyAgICAgICAgKChhID4+IFNIUikgJiAweGZmZmYpICogKChiID4+IFNIUikgJiAweGZmZmYpIFwKKyAgICApID4+IDE2KSAmIDB4ZmZmZikgPDwgU0hSKQorICAgIHJldHVybiBNVUxVKDApIHwgTVVMVSgxNikgfCBNVUxVKDMyKSB8IE1VTFUoNDgpOworI3VuZGVmIE1VTFUKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tYWNzdykodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyNkZWZpbmUgTUFDUyhTSFIpICggXAorICAgICAgICBFWFRFTkQxNigoYSA+PiBTSFIpICYgMHhmZmZmKSAqIEVYVEVORDE2UygoYiA+PiBTSFIpICYgMHhmZmZmKSkKKyAgICByZXR1cm4gKGludDY0X3QpIChNQUNTKDApICsgTUFDUygxNikgKyBNQUNTKDMyKSArIE1BQ1MoNDgpKTsKKyN1bmRlZiBNQUNTCit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfbWFjdXcpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisjZGVmaW5lIE1BQ1UoU0hSKSAoIFwKKyAgICAgICAgKHVpbnQzMl90KSAoKGEgPj4gU0hSKSAmIDB4ZmZmZikgKiBcCisgICAgICAgICh1aW50MzJfdCkgKChiID4+IFNIUikgJiAweGZmZmYpKQorICAgIHJldHVybiBNQUNVKDApICsgTUFDVSgxNikgKyBNQUNVKDMyKSArIE1BQ1UoNDgpOworI3VuZGVmIE1BQ1UKK30KKworI2RlZmluZSBOWkJJVDgoeCwgaSkgXAorICAgIFNJTUQ4X1NFVChOQklUOCgoeCkgJiAweGZmKSwgU0lNRF9OQklULCBpKSB8IFwKKyAgICBTSU1EOF9TRVQoWkJJVDgoKHgpICYgMHhmZiksIFNJTURfWkJJVCwgaSkKKyNkZWZpbmUgTlpCSVQxNih4LCBpKSBcCisgICAgU0lNRDE2X1NFVChOQklUMTYoKHgpICYgMHhmZmZmKSwgU0lNRF9OQklULCBpKSB8IFwKKyAgICBTSU1EMTZfU0VUKFpCSVQxNigoeCkgJiAweGZmZmYpLCBTSU1EX1pCSVQsIGkpCisjZGVmaW5lIE5aQklUMzIoeCwgaSkgXAorICAgIFNJTUQzMl9TRVQoTkJJVDMyKCh4KSAmIDB4ZmZmZmZmZmYpLCBTSU1EX05CSVQsIGkpIHwgXAorICAgIFNJTUQzMl9TRVQoWkJJVDMyKCh4KSAmIDB4ZmZmZmZmZmYpLCBTSU1EX1pCSVQsIGkpCisjZGVmaW5lIE5aQklUNjQoeCkgXAorICAgIFNJTUQ2NF9TRVQoTkJJVDY0KHgpLCBTSU1EX05CSVQpIHwgXAorICAgIFNJTUQ2NF9TRVQoWkJJVDY0KHgpLCBTSU1EX1pCSVQpCisjZGVmaW5lIElXTU1YVF9PUF9VTlBBQ0soUywgU0gwLCBTSDEsIFNIMiwgU0gzKQkJCVwKK3VpbnQ2NF90IEhFTFBFUihnbHVlKGl3bW14dF91bnBhY2ssIGdsdWUoUywgYikpKShDUFVBUk1TdGF0ZSAqZW52LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYSwgdWludDY0X3QgYikgXAorewkJCQkJCQkJXAorICAgIGEgPQkJCQkJCQkgICAgICAgIFwKKyAgICAgICAgKCgoYSA+PiBTSDApICYgMHhmZikgPDwgMCkgfCAoKChiID4+IFNIMCkgJiAweGZmKSA8PCA4KSB8CVwKKyAgICAgICAgKCgoYSA+PiBTSDEpICYgMHhmZikgPDwgMTYpIHwgKCgoYiA+PiBTSDEpICYgMHhmZikgPDwgMjQpIHwJXAorICAgICAgICAoKChhID4+IFNIMikgJiAweGZmKSA8PCAzMikgfCAoKChiID4+IFNIMikgJiAweGZmKSA8PCA0MCkgfAlcCisgICAgICAgICgoKGEgPj4gU0gzKSAmIDB4ZmYpIDw8IDQ4KSB8ICgoKGIgPj4gU0gzKSAmIDB4ZmYpIDw8IDU2KTsJXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0JCQlcCisgICAgICAgIE5aQklUOChhID4+IDAsIDApIHwgTlpCSVQ4KGEgPj4gOCwgMSkgfAkJICAgICAgICBcCisgICAgICAgIE5aQklUOChhID4+IDE2LCAyKSB8IE5aQklUOChhID4+IDI0LCAzKSB8CQlcCisgICAgICAgIE5aQklUOChhID4+IDMyLCA0KSB8IE5aQklUOChhID4+IDQwLCA1KSB8CQlcCisgICAgICAgIE5aQklUOChhID4+IDQ4LCA2KSB8IE5aQklUOChhID4+IDU2LCA3KTsJCVwKKyAgICByZXR1cm4gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CQkJCQkJCQlcCit1aW50NjRfdCBIRUxQRVIoZ2x1ZShpd21teHRfdW5wYWNrLCBnbHVlKFMsIHcpKSkoQ1BVQVJNU3RhdGUgKmVudiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIFwKK3sJCQkJCQkJCVwKKyAgICBhID0JCQkJCQkJICAgICAgICBcCisgICAgICAgICgoKGEgPj4gU0gwKSAmIDB4ZmZmZikgPDwgMCkgfAkJCQlcCisgICAgICAgICgoKGIgPj4gU0gwKSAmIDB4ZmZmZikgPDwgMTYpIHwJCQkgICAgICAgIFwKKyAgICAgICAgKCgoYSA+PiBTSDIpICYgMHhmZmZmKSA8PCAzMikgfAkJCSAgICAgICAgXAorICAgICAgICAoKChiID4+IFNIMikgJiAweGZmZmYpIDw8IDQ4KTsJCQkJXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0JCQlcCisgICAgICAgIE5aQklUOChhID4+IDAsIDApIHwgTlpCSVQ4KGEgPj4gMTYsIDEpIHwJCVwKKyAgICAgICAgTlpCSVQ4KGEgPj4gMzIsIDIpIHwgTlpCSVQ4KGEgPj4gNDgsIDMpOwkJXAorICAgIHJldHVybiBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30JCQkJCQkJCVwKK3VpbnQ2NF90IEhFTFBFUihnbHVlKGl3bW14dF91bnBhY2ssIGdsdWUoUywgbCkpKShDUFVBUk1TdGF0ZSAqZW52LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYSwgdWludDY0X3QgYikgXAorewkJCQkJCQkJXAorICAgIGEgPQkJCQkJCQkgICAgICAgIFwKKyAgICAgICAgKCgoYSA+PiBTSDApICYgMHhmZmZmZmZmZikgPDwgMCkgfAkJCVwKKyAgICAgICAgKCgoYiA+PiBTSDApICYgMHhmZmZmZmZmZikgPDwgMzIpOwkJCVwKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CQkJXAorICAgICAgICBOWkJJVDMyKGEgPj4gMCwgMCkgfCBOWkJJVDMyKGEgPj4gMzIsIDEpOwkJXAorICAgIHJldHVybiBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30JCQkJCQkJCVwKK3VpbnQ2NF90IEhFTFBFUihnbHVlKGl3bW14dF91bnBhY2ssIGdsdWUoUywgdWIpKSkoQ1BVQVJNU3RhdGUgKmVudiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB4KSAgIFwKK3sJCQkJCQkJCVwKKyAgICB4ID0JCQkJCQkJICAgICAgICBcCisgICAgICAgICgoKHggPj4gU0gwKSAmIDB4ZmYpIDw8IDApIHwJCQkJXAorICAgICAgICAoKCh4ID4+IFNIMSkgJiAweGZmKSA8PCAxNikgfAkJCQlcCisgICAgICAgICgoKHggPj4gU0gyKSAmIDB4ZmYpIDw8IDMyKSB8CQkJCVwKKyAgICAgICAgKCgoeCA+PiBTSDMpICYgMHhmZikgPDwgNDgpOwkJCQlcCisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPQkJCVwKKyAgICAgICAgTlpCSVQxNih4ID4+IDAsIDApIHwgTlpCSVQxNih4ID4+IDE2LCAxKSB8CQlcCisgICAgICAgIE5aQklUMTYoeCA+PiAzMiwgMikgfCBOWkJJVDE2KHggPj4gNDgsIDMpOwkJXAorICAgIHJldHVybiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30JCQkJCQkJCVwKK3VpbnQ2NF90IEhFTFBFUihnbHVlKGl3bW14dF91bnBhY2ssIGdsdWUoUywgdXcpKSkoQ1BVQVJNU3RhdGUgKmVudiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB4KSAgIFwKK3sJCQkJCQkJCVwKKyAgICB4ID0JCQkJCQkJICAgICAgICBcCisgICAgICAgICgoKHggPj4gU0gwKSAmIDB4ZmZmZikgPDwgMCkgfAkJCQlcCisgICAgICAgICgoKHggPj4gU0gyKSAmIDB4ZmZmZikgPDwgMzIpOwkJCQlcCisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPQkJCVwKKyAgICAgICAgTlpCSVQzMih4ID4+IDAsIDApIHwgTlpCSVQzMih4ID4+IDMyLCAxKTsJCVwKKyAgICByZXR1cm4geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CQkJCQkJCQlcCit1aW50NjRfdCBIRUxQRVIoZ2x1ZShpd21teHRfdW5wYWNrLCBnbHVlKFMsIHVsKSkpKENQVUFSTVN0YXRlICplbnYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgeCkgICBcCit7CQkJCQkJCQlcCisgICAgeCA9ICgoKHggPj4gU0gwKSAmIDB4ZmZmZmZmZmYpIDw8IDApOwkJCVwKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9IE5aQklUNjQoeCA+PiAwKTsJXAorICAgIHJldHVybiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30JCQkJCQkJCVwKK3VpbnQ2NF90IEhFTFBFUihnbHVlKGl3bW14dF91bnBhY2ssIGdsdWUoUywgc2IpKSkoQ1BVQVJNU3RhdGUgKmVudiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB4KSAgIFwKK3sJCQkJCQkJCVwKKyAgICB4ID0JCQkJCQkJICAgICAgICBcCisgICAgICAgICgodWludDY0X3QpIEVYVEVORDhIKCh4ID4+IFNIMCkgJiAweGZmKSA8PCAwKSB8CSAgICAgICAgXAorICAgICAgICAoKHVpbnQ2NF90KSBFWFRFTkQ4SCgoeCA+PiBTSDEpICYgMHhmZikgPDwgMTYpIHwJXAorICAgICAgICAoKHVpbnQ2NF90KSBFWFRFTkQ4SCgoeCA+PiBTSDIpICYgMHhmZikgPDwgMzIpIHwJXAorICAgICAgICAoKHVpbnQ2NF90KSBFWFRFTkQ4SCgoeCA+PiBTSDMpICYgMHhmZikgPDwgNDgpOwkgICAgICAgIFwKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CQkJXAorICAgICAgICBOWkJJVDE2KHggPj4gMCwgMCkgfCBOWkJJVDE2KHggPj4gMTYsIDEpIHwJCVwKKyAgICAgICAgTlpCSVQxNih4ID4+IDMyLCAyKSB8IE5aQklUMTYoeCA+PiA0OCwgMyk7CQlcCisgICAgcmV0dXJuIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQkJCQkJCQkJXAordWludDY0X3QgSEVMUEVSKGdsdWUoaXdtbXh0X3VucGFjaywgZ2x1ZShTLCBzdykpKShDUFVBUk1TdGF0ZSAqZW52LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHgpICAgXAorewkJCQkJCQkJXAorICAgIHggPQkJCQkJCQkgICAgICAgIFwKKyAgICAgICAgKCh1aW50NjRfdCkgRVhURU5EMTYoKHggPj4gU0gwKSAmIDB4ZmZmZikgPDwgMCkgfAlcCisgICAgICAgICgodWludDY0X3QpIEVYVEVORDE2KCh4ID4+IFNIMikgJiAweGZmZmYpIDw8IDMyKTsJXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0JCQlcCisgICAgICAgIE5aQklUMzIoeCA+PiAwLCAwKSB8IE5aQklUMzIoeCA+PiAzMiwgMSk7CQlcCisgICAgcmV0dXJuIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQkJCQkJCQkJXAordWludDY0X3QgSEVMUEVSKGdsdWUoaXdtbXh0X3VucGFjaywgZ2x1ZShTLCBzbCkpKShDUFVBUk1TdGF0ZSAqZW52LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHgpICAgXAorewkJCQkJCQkJXAorICAgIHggPSBFWFRFTkQzMigoeCA+PiBTSDApICYgMHhmZmZmZmZmZik7CQkJXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0gTlpCSVQ2NCh4ID4+IDApOwlcCisgICAgcmV0dXJuIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorSVdNTVhUX09QX1VOUEFDSyhsLCAwLCA4LCAxNiwgMjQpCitJV01NWFRfT1BfVU5QQUNLKGgsIDMyLCA0MCwgNDgsIDU2KQorCisjZGVmaW5lIElXTU1YVF9PUF9DTVAoU1VGRiwgVGIsIFR3LCBUbCwgTykJCQlcCit1aW50NjRfdCBIRUxQRVIoZ2x1ZShpd21teHRfLCBnbHVlKFNVRkYsIGIpKSkoQ1BVQVJNU3RhdGUgKmVudiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIFwKK3sJCQkJCQkJCVwKKyAgICBhID0JCQkJCQkJICAgICAgICBcCisgICAgICAgIENNUCgwLCBUYiwgTywgMHhmZikgfCBDTVAoOCwgVGIsIE8sIDB4ZmYpIHwJCVwKKyAgICAgICAgQ01QKDE2LCBUYiwgTywgMHhmZikgfCBDTVAoMjQsIFRiLCBPLCAweGZmKSB8CQlcCisgICAgICAgIENNUCgzMiwgVGIsIE8sIDB4ZmYpIHwgQ01QKDQwLCBUYiwgTywgMHhmZikgfAkJXAorICAgICAgICBDTVAoNDgsIFRiLCBPLCAweGZmKSB8IENNUCg1NiwgVGIsIE8sIDB4ZmYpOwkJXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0JCQlcCisgICAgICAgIE5aQklUOChhID4+IDAsIDApIHwgTlpCSVQ4KGEgPj4gOCwgMSkgfAkJICAgICAgICBcCisgICAgICAgIE5aQklUOChhID4+IDE2LCAyKSB8IE5aQklUOChhID4+IDI0LCAzKSB8CQlcCisgICAgICAgIE5aQklUOChhID4+IDMyLCA0KSB8IE5aQklUOChhID4+IDQwLCA1KSB8CQlcCisgICAgICAgIE5aQklUOChhID4+IDQ4LCA2KSB8IE5aQklUOChhID4+IDU2LCA3KTsJCVwKKyAgICByZXR1cm4gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CQkJCQkJCQlcCit1aW50NjRfdCBIRUxQRVIoZ2x1ZShpd21teHRfLCBnbHVlKFNVRkYsIHcpKSkoQ1BVQVJNU3RhdGUgKmVudiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpIFwKK3sJCQkJCQkJCVwKKyAgICBhID0gQ01QKDAsIFR3LCBPLCAweGZmZmYpIHwgQ01QKDE2LCBUdywgTywgMHhmZmZmKSB8CVwKKyAgICAgICAgQ01QKDMyLCBUdywgTywgMHhmZmZmKSB8IENNUCg0OCwgVHcsIE8sIDB4ZmZmZik7CVwKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CQkJXAorICAgICAgICBOWkJJVDE2KGEgPj4gMCwgMCkgfCBOWkJJVDE2KGEgPj4gMTYsIDEpIHwJCVwKKyAgICAgICAgTlpCSVQxNihhID4+IDMyLCAyKSB8IE5aQklUMTYoYSA+PiA0OCwgMyk7CQlcCisgICAgcmV0dXJuIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQkJCQkJCQkJXAordWludDY0X3QgSEVMUEVSKGdsdWUoaXdtbXh0XywgZ2x1ZShTVUZGLCBsKSkpKENQVUFSTVN0YXRlICplbnYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhLCB1aW50NjRfdCBiKSBcCit7CQkJCQkJCQlcCisgICAgYSA9IENNUCgwLCBUbCwgTywgMHhmZmZmZmZmZikgfAkJCQlcCisgICAgICAgIENNUCgzMiwgVGwsIE8sIDB4ZmZmZmZmZmYpOwkJCQlcCisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPQkJCVwKKyAgICAgICAgTlpCSVQzMihhID4+IDAsIDApIHwgTlpCSVQzMihhID4+IDMyLCAxKTsJCVwKKyAgICByZXR1cm4gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIENNUChTSFIsIFRZUEUsIE9QRVIsIE1BU0spICgoKChUWVBFKSAoKGEgPj4gU0hSKSAmIE1BU0spIE9QRVIgXAorICAgICAgICAgICAgKFRZUEUpICgoYiA+PiBTSFIpICYgTUFTSykpID8gKHVpbnQ2NF90KSBNQVNLIDogMCkgPDwgU0hSKQorSVdNTVhUX09QX0NNUChjbXBlcSwgdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCA9PSkKK0lXTU1YVF9PUF9DTVAoY21wZ3RzLCBpbnQ4X3QsIGludDE2X3QsIGludDMyX3QsID4pCitJV01NWFRfT1BfQ01QKGNtcGd0dSwgdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCA+KQorI3VuZGVmIENNUAorI2RlZmluZSBDTVAoU0hSLCBUWVBFLCBPUEVSLCBNQVNLKSAoKCgoVFlQRSkgKChhID4+IFNIUikgJiBNQVNLKSBPUEVSIFwKKyAgICAgICAgICAgIChUWVBFKSAoKGIgPj4gU0hSKSAmIE1BU0spKSA/IGEgOiBiKSAmICgodWludDY0X3QpIE1BU0sgPDwgU0hSKSkKK0lXTU1YVF9PUF9DTVAobWlucywgaW50OF90LCBpbnQxNl90LCBpbnQzMl90LCA8KQorSVdNTVhUX09QX0NNUChtaW51LCB1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIDwpCitJV01NWFRfT1BfQ01QKG1heHMsIGludDhfdCwgaW50MTZfdCwgaW50MzJfdCwgPikKK0lXTU1YVF9PUF9DTVAobWF4dSwgdWludDhfdCwgdWludDE2X3QsIHVpbnQzMl90LCA+KQorI3VuZGVmIENNUAorI2RlZmluZSBDTVAoU0hSLCBUWVBFLCBPUEVSLCBNQVNLKSAoKHVpbnQ2NF90KSAoKChUWVBFKSAoKGEgPj4gU0hSKSAmIE1BU0spIFwKKyAgICAgICAgICAgIE9QRVIgKFRZUEUpICgoYiA+PiBTSFIpICYgTUFTSykpICYgTUFTSykgPDwgU0hSKQorSVdNTVhUX09QX0NNUChzdWJuLCB1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIC0pCitJV01NWFRfT1BfQ01QKGFkZG4sIHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50MzJfdCwgKykKKyN1bmRlZiBDTVAKKy8qIFRPRE8gU2lnbmVkLSBhbmQgVW5zaWduZWQtU2F0dXJhdGlvbiAqLworI2RlZmluZSBDTVAoU0hSLCBUWVBFLCBPUEVSLCBNQVNLKSAoKHVpbnQ2NF90KSAoKChUWVBFKSAoKGEgPj4gU0hSKSAmIE1BU0spIFwKKyAgICAgICAgICAgIE9QRVIgKFRZUEUpICgoYiA+PiBTSFIpICYgTUFTSykpICYgTUFTSykgPDwgU0hSKQorSVdNTVhUX09QX0NNUChzdWJ1LCB1aW50OF90LCB1aW50MTZfdCwgdWludDMyX3QsIC0pCitJV01NWFRfT1BfQ01QKGFkZHUsIHVpbnQ4X3QsIHVpbnQxNl90LCB1aW50MzJfdCwgKykKK0lXTU1YVF9PUF9DTVAoc3VicywgaW50OF90LCBpbnQxNl90LCBpbnQzMl90LCAtKQorSVdNTVhUX09QX0NNUChhZGRzLCBpbnQ4X3QsIGludDE2X3QsIGludDMyX3QsICspCisjdW5kZWYgQ01QCisjdW5kZWYgSVdNTVhUX09QX0NNUAorCisjZGVmaW5lIEFWR0IoU0hSKSAoKCggXAorICAgICAgICAoKGEgPj4gU0hSKSAmIDB4ZmYpICsgKChiID4+IFNIUikgJiAweGZmKSArIHJvdW5kKSA+PiAxKSA8PCBTSFIpCisjZGVmaW5lIElXTU1YVF9PUF9BVkdCKHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfYXZnYiMjcikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgYSwgdWludDY0X3QgYikgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHJvdW5kID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gQVZHQigwKSB8IEFWR0IoOCkgfCBBVkdCKDE2KSB8IEFWR0IoMjQpIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBVkdCKDMyKSB8IEFWR0IoNDApIHwgQVZHQig0OCkgfCBBVkdCKDU2KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0lNRDhfU0VUKFpCSVQ4KChhID4+IDApICYgMHhmZiksIFNJTURfWkJJVCwgMCkgfCAgICAgICAgICAgICAgICAgXAorICAgICAgICBTSU1EOF9TRVQoWkJJVDgoKGEgPj4gOCkgJiAweGZmKSwgU0lNRF9aQklULCAxKSB8ICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNJTUQ4X1NFVChaQklUOCgoYSA+PiAxNikgJiAweGZmKSwgU0lNRF9aQklULCAyKSB8ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0lNRDhfU0VUKFpCSVQ4KChhID4+IDI0KSAmIDB4ZmYpLCBTSU1EX1pCSVQsIDMpIHwgICAgICAgICAgICAgICAgXAorICAgICAgICBTSU1EOF9TRVQoWkJJVDgoKGEgPj4gMzIpICYgMHhmZiksIFNJTURfWkJJVCwgNCkgfCAgICAgICAgICAgICAgICBcCisgICAgICAgIFNJTUQ4X1NFVChaQklUOCgoYSA+PiA0MCkgJiAweGZmKSwgU0lNRF9aQklULCA1KSB8ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0lNRDhfU0VUKFpCSVQ4KChhID4+IDQ4KSAmIDB4ZmYpLCBTSU1EX1pCSVQsIDYpIHwgICAgICAgICAgICAgICAgXAorICAgICAgICBTSU1EOF9TRVQoWkJJVDgoKGEgPj4gNTYpICYgMHhmZiksIFNJTURfWkJJVCwgNyk7ICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK0lXTU1YVF9PUF9BVkdCKDApCitJV01NWFRfT1BfQVZHQigxKQorI3VuZGVmIElXTU1YVF9PUF9BVkdCCisjdW5kZWYgQVZHQgorCisjZGVmaW5lIEFWR1coU0hSKSAoKCggXAorICAgICAgICAoKGEgPj4gU0hSKSAmIDB4ZmZmZikgKyAoKGIgPj4gU0hSKSAmIDB4ZmZmZikgKyByb3VuZCkgPj4gMSkgPDwgU0hSKQorI2RlZmluZSBJV01NWFRfT1BfQVZHVyhyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordWludDY0X3QgSEVMUEVSKGl3bW14dF9hdmd3IyNyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBhLCB1aW50NjRfdCBiKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCByb3VuZCA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSBBVkdXKDApIHwgQVZHVygxNikgfCBBVkdXKDMyKSB8IEFWR1coNDgpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTSU1EMTZfU0VUKFpCSVQxNigoYSA+PiAwKSAmIDB4ZmZmZiksIFNJTURfWkJJVCwgMCkgfCAgICAgICAgICAgXAorICAgICAgICBTSU1EMTZfU0VUKFpCSVQxNigoYSA+PiAxNikgJiAweGZmZmYpLCBTSU1EX1pCSVQsIDEpIHwgICAgICAgICAgXAorICAgICAgICBTSU1EMTZfU0VUKFpCSVQxNigoYSA+PiAzMikgJiAweGZmZmYpLCBTSU1EX1pCSVQsIDIpIHwgICAgICAgICAgXAorICAgICAgICBTSU1EMTZfU0VUKFpCSVQxNigoYSA+PiA0OCkgJiAweGZmZmYpLCBTSU1EX1pCSVQsIDMpOyAgICAgICAgICAgXAorICAgIHJldHVybiBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorSVdNTVhUX09QX0FWR1coMCkKK0lXTU1YVF9PUF9BVkdXKDEpCisjdW5kZWYgSVdNTVhUX09QX0FWR1cKKyN1bmRlZiBBVkdXCisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfbXNhZGIpKHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgYSA9ICAoKCgoYSA+PiAwICkgJiAweGZmZmYpICogKChiID4+IDApICYgMHhmZmZmKSArCisgICAgICAgICAgICgoYSA+PiAxNikgJiAweGZmZmYpICogKChiID4+IDE2KSAmIDB4ZmZmZikpICYgMHhmZmZmZmZmZikgfAorICAgICAgICAgKCgoKGEgPj4gMzIpICYgMHhmZmZmKSAqICgoYiA+PiAzMikgJiAweGZmZmYpICsKKyAgICAgICAgICAgKChhID4+IDQ4KSAmIDB4ZmZmZikgKiAoKGIgPj4gNDgpICYgMHhmZmZmKSkgPDwgMzIpOworICAgIHJldHVybiBhOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2FsaWduKSh1aW50NjRfdCBhLCB1aW50NjRfdCBiLCB1aW50MzJfdCBuKQoreworICAgIGEgPj49IG4gPDwgMzsKKyAgICBhIHw9IGIgPDwgKDY0IC0gKG4gPDwgMykpOworICAgIHJldHVybiBhOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2luc3IpKHVpbnQ2NF90IHgsIHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IG4pCit7CisgICAgeCAmPSB+KCh1aW50NjRfdCkgYiA8PCBuKTsKKyAgICB4IHw9ICh1aW50NjRfdCkgKGEgJiBiKSA8PCBuOworICAgIHJldHVybiB4OworfQorCit1aW50MzJfdCBIRUxQRVIoaXdtbXh0X3NldHBzcl9ueikodWludDY0X3QgeCkKK3sKKyAgICByZXR1cm4gU0lNRDY0X1NFVCgoeCA9PSAwKSwgU0lNRF9aQklUKSB8CisgICAgICAgICAgIFNJTUQ2NF9TRVQoKHggJiAoMVVMTCA8PCA2MykpLCBTSU1EX05CSVQpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2Jjc3RiKSh1aW50MzJfdCBhcmcpCit7CisgICAgYXJnICY9IDB4ZmY7CisgICAgcmV0dXJuCisgICAgICAgICgodWludDY0X3QpIGFyZyA8PCAwICkgfCAoKHVpbnQ2NF90KSBhcmcgPDwgOCApIHwKKyAgICAgICAgKCh1aW50NjRfdCkgYXJnIDw8IDE2KSB8ICgodWludDY0X3QpIGFyZyA8PCAyNCkgfAorICAgICAgICAoKHVpbnQ2NF90KSBhcmcgPDwgMzIpIHwgKCh1aW50NjRfdCkgYXJnIDw8IDQwKSB8CisgICAgICAgICgodWludDY0X3QpIGFyZyA8PCA0OCkgfCAoKHVpbnQ2NF90KSBhcmcgPDwgNTYpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2Jjc3R3KSh1aW50MzJfdCBhcmcpCit7CisgICAgYXJnICY9IDB4ZmZmZjsKKyAgICByZXR1cm4KKyAgICAgICAgKCh1aW50NjRfdCkgYXJnIDw8IDAgKSB8ICgodWludDY0X3QpIGFyZyA8PCAxNikgfAorICAgICAgICAoKHVpbnQ2NF90KSBhcmcgPDwgMzIpIHwgKCh1aW50NjRfdCkgYXJnIDw8IDQ4KTsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9iY3N0bCkodWludDMyX3QgYXJnKQoreworICAgIHJldHVybiBhcmcgfCAoKHVpbnQ2NF90KSBhcmcgPDwgMzIpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2FkZGNiKSh1aW50NjRfdCB4KQoreworICAgIHJldHVybgorICAgICAgICAoKHggPj4gMCkgJiAweGZmKSArICgoeCA+PiA4KSAmIDB4ZmYpICsKKyAgICAgICAgKCh4ID4+IDE2KSAmIDB4ZmYpICsgKCh4ID4+IDI0KSAmIDB4ZmYpICsKKyAgICAgICAgKCh4ID4+IDMyKSAmIDB4ZmYpICsgKCh4ID4+IDQwKSAmIDB4ZmYpICsKKyAgICAgICAgKCh4ID4+IDQ4KSAmIDB4ZmYpICsgKCh4ID4+IDU2KSAmIDB4ZmYpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2FkZGN3KSh1aW50NjRfdCB4KQoreworICAgIHJldHVybgorICAgICAgICAoKHggPj4gMCkgJiAweGZmZmYpICsgKCh4ID4+IDE2KSAmIDB4ZmZmZikgKworICAgICAgICAoKHggPj4gMzIpICYgMHhmZmZmKSArICgoeCA+PiA0OCkgJiAweGZmZmYpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X2FkZGNsKSh1aW50NjRfdCB4KQoreworICAgIHJldHVybiAoeCAmIDB4ZmZmZmZmZmYpICsgKHggPj4gMzIpOworfQorCit1aW50MzJfdCBIRUxQRVIoaXdtbXh0X21zYmIpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuCisgICAgICAgICgoeCA+PiA3KSAmIDB4MDEpIHwgKCh4ID4+IDE0KSAmIDB4MDIpIHwKKyAgICAgICAgKCh4ID4+IDIxKSAmIDB4MDQpIHwgKCh4ID4+IDI4KSAmIDB4MDgpIHwKKyAgICAgICAgKCh4ID4+IDM1KSAmIDB4MTApIHwgKCh4ID4+IDQyKSAmIDB4MjApIHwKKyAgICAgICAgKCh4ID4+IDQ5KSAmIDB4NDApIHwgKCh4ID4+IDU2KSAmIDB4ODApOworfQorCit1aW50MzJfdCBIRUxQRVIoaXdtbXh0X21zYncpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuCisgICAgICAgICgoeCA+PiAxNSkgJiAweDAxKSB8ICgoeCA+PiAzMCkgJiAweDAyKSB8CisgICAgICAgICgoeCA+PiA0NSkgJiAweDA0KSB8ICgoeCA+PiA1MikgJiAweDA4KTsKK30KKwordWludDMyX3QgSEVMUEVSKGl3bW14dF9tc2JsKSh1aW50NjRfdCB4KQoreworICAgIHJldHVybiAoKHggPj4gMzEpICYgMHgwMSkgfCAoKHggPj4gNjIpICYgMHgwMik7Cit9CisKKy8qIEZJWE1FOiBTcGxpdCB3Q0FTRiBzZXR0aW5nIGludG8gYSBzZXBhcmF0ZSBvcCB0byBhdm9pZCBlbnYgdXNlLiAgKi8KK3VpbnQ2NF90IEhFTFBFUihpd21teHRfc3JsdykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCwgdWludDMyX3QgbikKK3sKKyAgICB4ID0gKCgoeCAmICgweGZmZmZsbCA8PCAwKSkgPj4gbikgJiAoMHhmZmZmbGwgPDwgMCkpIHwKKyAgICAgICAgKCgoeCAmICgweGZmZmZsbCA8PCAxNikpID4+IG4pICYgKDB4ZmZmZmxsIDw8IDE2KSkgfAorICAgICAgICAoKCh4ICYgKDB4ZmZmZmxsIDw8IDMyKSkgPj4gbikgJiAoMHhmZmZmbGwgPDwgMzIpKSB8CisgICAgICAgICgoKHggJiAoMHhmZmZmbGwgPDwgNDgpKSA+PiBuKSAmICgweGZmZmZsbCA8PCA0OCkpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQxNih4ID4+IDAsIDApIHwgTlpCSVQxNih4ID4+IDE2LCAxKSB8CisgICAgICAgIE5aQklUMTYoeCA+PiAzMiwgMikgfCBOWkJJVDE2KHggPj4gNDgsIDMpOworICAgIHJldHVybiB4OworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X3NybGwpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgsIHVpbnQzMl90IG4pCit7CisgICAgeCA9ICgoeCAmICgweGZmZmZmZmZmbGwgPDwgMCkpID4+IG4pIHwKKyAgICAgICAgKCh4ID4+IG4pICYgKDB4ZmZmZmZmZmZsbCA8PCAzMikpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQzMih4ID4+IDAsIDApIHwgTlpCSVQzMih4ID4+IDMyLCAxKTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9zcmxxKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPj49IG47CisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPSBOWkJJVDY0KHgpOworICAgIHJldHVybiB4OworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X3NsbHcpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgsIHVpbnQzMl90IG4pCit7CisgICAgeCA9ICgoKHggJiAoMHhmZmZmbGwgPDwgMCkpIDw8IG4pICYgKDB4ZmZmZmxsIDw8IDApKSB8CisgICAgICAgICgoKHggJiAoMHhmZmZmbGwgPDwgMTYpKSA8PCBuKSAmICgweGZmZmZsbCA8PCAxNikpIHwKKyAgICAgICAgKCgoeCAmICgweGZmZmZsbCA8PCAzMikpIDw8IG4pICYgKDB4ZmZmZmxsIDw8IDMyKSkgfAorICAgICAgICAoKCh4ICYgKDB4ZmZmZmxsIDw8IDQ4KSkgPDwgbikgJiAoMHhmZmZmbGwgPDwgNDgpKTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CisgICAgICAgIE5aQklUMTYoeCA+PiAwLCAwKSB8IE5aQklUMTYoeCA+PiAxNiwgMSkgfAorICAgICAgICBOWkJJVDE2KHggPj4gMzIsIDIpIHwgTlpCSVQxNih4ID4+IDQ4LCAzKTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9zbGxsKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPSAoKHggPDwgbikgJiAoMHhmZmZmZmZmZmxsIDw8IDApKSB8CisgICAgICAgICgoeCAmICgweGZmZmZmZmZmbGwgPDwgMzIpKSA8PCBuKTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CisgICAgICAgIE5aQklUMzIoeCA+PiAwLCAwKSB8IE5aQklUMzIoeCA+PiAzMiwgMSk7CisgICAgcmV0dXJuIHg7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfc2xscSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCwgdWludDMyX3QgbikKK3sKKyAgICB4IDw8PSBuOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0gTlpCSVQ2NCh4KTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9zcmF3KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPSAoKHVpbnQ2NF90KSAoKEVYVEVORDE2KHggPj4gMCkgPj4gbikgJiAweGZmZmYpIDw8IDApIHwKKyAgICAgICAgKCh1aW50NjRfdCkgKChFWFRFTkQxNih4ID4+IDE2KSA+PiBuKSAmIDB4ZmZmZikgPDwgMTYpIHwKKyAgICAgICAgKCh1aW50NjRfdCkgKChFWFRFTkQxNih4ID4+IDMyKSA+PiBuKSAmIDB4ZmZmZikgPDwgMzIpIHwKKyAgICAgICAgKCh1aW50NjRfdCkgKChFWFRFTkQxNih4ID4+IDQ4KSA+PiBuKSAmIDB4ZmZmZikgPDwgNDgpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQxNih4ID4+IDAsIDApIHwgTlpCSVQxNih4ID4+IDE2LCAxKSB8CisgICAgICAgIE5aQklUMTYoeCA+PiAzMiwgMikgfCBOWkJJVDE2KHggPj4gNDgsIDMpOworICAgIHJldHVybiB4OworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X3NyYWwpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgsIHVpbnQzMl90IG4pCit7CisgICAgeCA9ICgoKEVYVEVORDMyKHggPj4gMCkgPj4gbikgJiAweGZmZmZmZmZmKSA8PCAwKSB8CisgICAgICAgICgoKEVYVEVORDMyKHggPj4gMzIpID4+IG4pICYgMHhmZmZmZmZmZikgPDwgMzIpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQzMih4ID4+IDAsIDApIHwgTlpCSVQzMih4ID4+IDMyLCAxKTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9zcmFxKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPSAoaW50NjRfdCkgeCA+PiBuOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0gTlpCSVQ2NCh4KTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9yb3J3KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPSAoKCgoeCAmICgweGZmZmZsbCA8PCAwKSkgPj4gbikgfAorICAgICAgICAgICgoeCAmICgweGZmZmZsbCA8PCAwKSkgPDwgKDE2IC0gbikpKSAmICgweGZmZmZsbCA8PCAwKSkgfAorICAgICAgICAoKCgoeCAmICgweGZmZmZsbCA8PCAxNikpID4+IG4pIHwKKyAgICAgICAgICAoKHggJiAoMHhmZmZmbGwgPDwgMTYpKSA8PCAoMTYgLSBuKSkpICYgKDB4ZmZmZmxsIDw8IDE2KSkgfAorICAgICAgICAoKCgoeCAmICgweGZmZmZsbCA8PCAzMikpID4+IG4pIHwKKyAgICAgICAgICAoKHggJiAoMHhmZmZmbGwgPDwgMzIpKSA8PCAoMTYgLSBuKSkpICYgKDB4ZmZmZmxsIDw8IDMyKSkgfAorICAgICAgICAoKCgoeCAmICgweGZmZmZsbCA8PCA0OCkpID4+IG4pIHwKKyAgICAgICAgICAoKHggJiAoMHhmZmZmbGwgPDwgNDgpKSA8PCAoMTYgLSBuKSkpICYgKDB4ZmZmZmxsIDw8IDQ4KSk7CisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPQorICAgICAgICBOWkJJVDE2KHggPj4gMCwgMCkgfCBOWkJJVDE2KHggPj4gMTYsIDEpIHwKKyAgICAgICAgTlpCSVQxNih4ID4+IDMyLCAyKSB8IE5aQklUMTYoeCA+PiA0OCwgMyk7CisgICAgcmV0dXJuIHg7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfcm9ybCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCwgdWludDMyX3QgbikKK3sKKyAgICB4ID0gKCh4ICYgKDB4ZmZmZmZmZmZsbCA8PCAwKSkgPj4gbikgfAorICAgICAgICAoKHggPj4gbikgJiAoMHhmZmZmZmZmZmxsIDw8IDMyKSkgfAorICAgICAgICAoKHggPDwgKDMyIC0gbikpICYgKDB4ZmZmZmZmZmZsbCA8PCAwKSkgfAorICAgICAgICAoKHggJiAoMHhmZmZmZmZmZmxsIDw8IDMyKSkgPDwgKDMyIC0gbikpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQzMih4ID4+IDAsIDApIHwgTlpCSVQzMih4ID4+IDMyLCAxKTsKKyAgICByZXR1cm4geDsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9yb3JxKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4LCB1aW50MzJfdCBuKQoreworICAgIHggPSByb3I2NCh4LCBuKTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9IE5aQklUNjQoeCk7CisgICAgcmV0dXJuIHg7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfc2h1ZmgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgsIHVpbnQzMl90IG4pCit7CisgICAgeCA9ICgoKHggPj4gKChuIDw8IDQpICYgMHgzMCkpICYgMHhmZmZmKSA8PCAwKSB8CisgICAgICAgICgoKHggPj4gKChuIDw8IDIpICYgMHgzMCkpICYgMHhmZmZmKSA8PCAxNikgfAorICAgICAgICAoKCh4ID4+ICgobiA8PCAwKSAmIDB4MzApKSAmIDB4ZmZmZikgPDwgMzIpIHwKKyAgICAgICAgKCgoeCA+PiAoKG4gPj4gMikgJiAweDMwKSkgJiAweGZmZmYpIDw8IDQ4KTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CisgICAgICAgIE5aQklUMTYoeCA+PiAwLCAwKSB8IE5aQklUMTYoeCA+PiAxNiwgMSkgfAorICAgICAgICBOWkJJVDE2KHggPj4gMzIsIDIpIHwgTlpCSVQxNih4ID4+IDQ4LCAzKTsKKyAgICByZXR1cm4geDsKK30KKworLyogVE9ETzogVW5zaWduZWQtU2F0dXJhdGlvbiAqLwordWludDY0X3QgSEVMUEVSKGl3bW14dF9wYWNrdXcpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgYSA9ICgoKGEgPj4gMCkgJiAweGZmKSA8PCAwKSB8ICgoKGEgPj4gMTYpICYgMHhmZikgPDwgOCkgfAorICAgICAgICAoKChhID4+IDMyKSAmIDB4ZmYpIDw8IDE2KSB8ICgoKGEgPj4gNDgpICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgKCgoYiA+PiAwKSAmIDB4ZmYpIDw8IDMyKSB8ICgoKGIgPj4gMTYpICYgMHhmZikgPDwgNDApIHwKKyAgICAgICAgKCgoYiA+PiAzMikgJiAweGZmKSA8PCA0OCkgfCAoKChiID4+IDQ4KSAmIDB4ZmYpIDw8IDU2KTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CisgICAgICAgIE5aQklUOChhID4+IDAsIDApIHwgTlpCSVQ4KGEgPj4gOCwgMSkgfAorICAgICAgICBOWkJJVDgoYSA+PiAxNiwgMikgfCBOWkJJVDgoYSA+PiAyNCwgMykgfAorICAgICAgICBOWkJJVDgoYSA+PiAzMiwgNCkgfCBOWkJJVDgoYSA+PiA0MCwgNSkgfAorICAgICAgICBOWkJJVDgoYSA+PiA0OCwgNikgfCBOWkJJVDgoYSA+PiA1NiwgNyk7CisgICAgcmV0dXJuIGE7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfcGFja3VsKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIGEgPSAoKChhID4+IDApICYgMHhmZmZmKSA8PCAwKSB8ICgoKGEgPj4gMzIpICYgMHhmZmZmKSA8PCAxNikgfAorICAgICAgICAoKChiID4+IDApICYgMHhmZmZmKSA8PCAzMikgfCAoKChiID4+IDMyKSAmIDB4ZmZmZikgPDwgNDgpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQxNihhID4+IDAsIDApIHwgTlpCSVQxNihhID4+IDE2LCAxKSB8CisgICAgICAgIE5aQklUMTYoYSA+PiAzMiwgMikgfCBOWkJJVDE2KGEgPj4gNDgsIDMpOworICAgIHJldHVybiBhOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X3BhY2t1cSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICBhID0gKGEgJiAweGZmZmZmZmZmKSB8ICgoYiAmIDB4ZmZmZmZmZmYpIDw8IDMyKTsKKyAgICBlbnYtPml3bW14dC5jcmVnc1tBUk1fSVdNTVhUX3dDQVNGXSA9CisgICAgICAgIE5aQklUMzIoYSA+PiAwLCAwKSB8IE5aQklUMzIoYSA+PiAzMiwgMSk7CisgICAgcmV0dXJuIGE7Cit9CisKKy8qIFRPRE86IFNpZ25lZC1TYXR1cmF0aW9uICovCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X3BhY2tzdykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICBhID0gKCgoYSA+PiAwKSAmIDB4ZmYpIDw8IDApIHwgKCgoYSA+PiAxNikgJiAweGZmKSA8PCA4KSB8CisgICAgICAgICgoKGEgPj4gMzIpICYgMHhmZikgPDwgMTYpIHwgKCgoYSA+PiA0OCkgJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAoKChiID4+IDApICYgMHhmZikgPDwgMzIpIHwgKCgoYiA+PiAxNikgJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAoKChiID4+IDMyKSAmIDB4ZmYpIDw8IDQ4KSB8ICgoKGIgPj4gNDgpICYgMHhmZikgPDwgNTYpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQ4KGEgPj4gMCwgMCkgfCBOWkJJVDgoYSA+PiA4LCAxKSB8CisgICAgICAgIE5aQklUOChhID4+IDE2LCAyKSB8IE5aQklUOChhID4+IDI0LCAzKSB8CisgICAgICAgIE5aQklUOChhID4+IDMyLCA0KSB8IE5aQklUOChhID4+IDQwLCA1KSB8CisgICAgICAgIE5aQklUOChhID4+IDQ4LCA2KSB8IE5aQklUOChhID4+IDU2LCA3KTsKKyAgICByZXR1cm4gYTsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9wYWNrc2wpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgYSA9ICgoKGEgPj4gMCkgJiAweGZmZmYpIDw8IDApIHwgKCgoYSA+PiAzMikgJiAweGZmZmYpIDw8IDE2KSB8CisgICAgICAgICgoKGIgPj4gMCkgJiAweGZmZmYpIDw8IDMyKSB8ICgoKGIgPj4gMzIpICYgMHhmZmZmKSA8PCA0OCk7CisgICAgZW52LT5pd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0gPQorICAgICAgICBOWkJJVDE2KGEgPj4gMCwgMCkgfCBOWkJJVDE2KGEgPj4gMTYsIDEpIHwKKyAgICAgICAgTlpCSVQxNihhID4+IDMyLCAyKSB8IE5aQklUMTYoYSA+PiA0OCwgMyk7CisgICAgcmV0dXJuIGE7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihpd21teHRfcGFja3NxKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIGEgPSAoYSAmIDB4ZmZmZmZmZmYpIHwgKChiICYgMHhmZmZmZmZmZikgPDwgMzIpOworICAgIGVudi0+aXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0NBU0ZdID0KKyAgICAgICAgTlpCSVQzMihhID4+IDAsIDApIHwgTlpCSVQzMihhID4+IDMyLCAxKTsKKyAgICByZXR1cm4gYTsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tdWxhZGRzbCkodWludDY0X3QgYywgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICByZXR1cm4gYyArICgoaW50MzJfdCkgRVhURU5EMzIoYSkgKiAoaW50MzJfdCkgRVhURU5EMzIoYikpOworfQorCit1aW50NjRfdCBIRUxQRVIoaXdtbXh0X211bGFkZHN3KSh1aW50NjRfdCBjLCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIGMgKz0gRVhURU5EMzIoRVhURU5EMTZTKChhID4+IDApICYgMHhmZmZmKSAqCisgICAgICAgICAgICAgICAgICBFWFRFTkQxNlMoKGIgPj4gMCkgJiAweGZmZmYpKTsKKyAgICBjICs9IEVYVEVORDMyKEVYVEVORDE2UygoYSA+PiAxNikgJiAweGZmZmYpICoKKyAgICAgICAgICAgICAgICAgIEVYVEVORDE2UygoYiA+PiAxNikgJiAweGZmZmYpKTsKKyAgICByZXR1cm4gYzsKK30KKwordWludDY0X3QgSEVMUEVSKGl3bW14dF9tdWxhZGRzd2wpKHVpbnQ2NF90IGMsIHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgcmV0dXJuIGMgKyAoRVhURU5EMzIoRVhURU5EMTZTKGEgJiAweGZmZmYpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICBFWFRFTkQxNlMoYiAmIDB4ZmZmZikpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9rdm0tY29uc3RzLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0va3ZtLWNvbnN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYmEwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0va3ZtLWNvbnN0cy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBLVk0gQVJNIEFCSSBjb25zdGFudCBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBMaW5hcm8gTGltaXRlZAorICoKKyAqIFByb3ZpZGUgdmVyc2lvbnMgb2YgS1ZNIGNvbnN0YW50IGRlZmluZXMgdGhhdCBjYW4gYmUgdXNlZCBldmVuCisgKiB3aGVuIENPTkZJR19LVk0gaXMgbm90IHNldCBhbmQgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgKiBLVk0gaGVhZGVycy4gSWYgQ09ORklHX0tWTSBpcyBzZXQsIHdlIGRvIGEgY29tcGlsZS10aW1lIGNoZWNrCisgKiB0aGF0IHdlIGhhdmVuJ3QgZ290IG91dCBvZiBzeW5jIHNvbWVob3cuCisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yIGxhdGVyLgorICogU2VlIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKyNpZm5kZWYgQVJNX0tWTV9DT05TVFNfSAorI2RlZmluZSBBUk1fS1ZNX0NPTlNUU19ICisKKyNpZmRlZiBDT05GSUdfS1ZNCisjaW5jbHVkZSAicWVtdS9jb21waWxlci5oIgorI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgorCisjZGVmaW5lIE1JU01BVENIX0NIRUNLKFgsIFkpIFFFTVVfQlVJTERfQlVHX09OKFggIT0gWSkKKworI2Vsc2UKKyNkZWZpbmUgTUlTTUFUQ0hfQ0hFQ0soWCwgWSkKKyNlbmRpZgorCisjZGVmaW5lIENQX1JFR19TSVpFX1NISUZUIDUyCisjZGVmaW5lIENQX1JFR19TSVpFX01BU0sgICAgICAgMHgwMGYwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENQX1JFR19TSVpFX1UzMiAgICAgICAgMHgwMDIwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENQX1JFR19TSVpFX1U2NCAgICAgICAgMHgwMDMwMDAwMDAwMDAwMDAwVUxMCisjZGVmaW5lIENQX1JFR19BUk0gICAgICAgICAgICAgMHg0MDAwMDAwMDAwMDAwMDAwVUxMCisKK01JU01BVENIX0NIRUNLKENQX1JFR19TSVpFX1NISUZULCBLVk1fUkVHX1NJWkVfU0hJRlQpCitNSVNNQVRDSF9DSEVDSyhDUF9SRUdfU0laRV9NQVNLLCBLVk1fUkVHX1NJWkVfTUFTSykKK01JU01BVENIX0NIRUNLKENQX1JFR19TSVpFX1UzMiwgS1ZNX1JFR19TSVpFX1UzMikKK01JU01BVENIX0NIRUNLKENQX1JFR19TSVpFX1U2NCwgS1ZNX1JFR19TSVpFX1U2NCkKK01JU01BVENIX0NIRUNLKENQX1JFR19BUk0sIEtWTV9SRUdfQVJNKQorCisjZGVmaW5lIFBTQ0lfRk5fQkFTRSAweDk1YzFiYTVlCisjZGVmaW5lIFBTQ0lfRk4obikgKFBTQ0lfRk5fQkFTRSArIChuKSkKKyNkZWZpbmUgUFNDSV9GTl9DUFVfU1VTUEVORCBQU0NJX0ZOKDApCisjZGVmaW5lIFBTQ0lfRk5fQ1BVX09GRiBQU0NJX0ZOKDEpCisjZGVmaW5lIFBTQ0lfRk5fQ1BVX09OIFBTQ0lfRk4oMikKKyNkZWZpbmUgUFNDSV9GTl9NSUdSQVRFIFBTQ0lfRk4oMykKKworTUlTTUFUQ0hfQ0hFQ0soUFNDSV9GTl9DUFVfU1VTUEVORCwgS1ZNX1BTQ0lfRk5fQ1BVX1NVU1BFTkQpCitNSVNNQVRDSF9DSEVDSyhQU0NJX0ZOX0NQVV9PRkYsIEtWTV9QU0NJX0ZOX0NQVV9PRkYpCitNSVNNQVRDSF9DSEVDSyhQU0NJX0ZOX0NQVV9PTiwgS1ZNX1BTQ0lfRk5fQ1BVX09OKQorTUlTTUFUQ0hfQ0hFQ0soUFNDSV9GTl9NSUdSQVRFLCBLVk1fUFNDSV9GTl9NSUdSQVRFKQorCisjZGVmaW5lIFFFTVVfS1ZNX0FSTV9UQVJHRVRfQ09SVEVYX0ExNSAwCisKKy8qIFRoZXJlJ3Mgbm8ga2VybmVsIGRlZmluZSBmb3IgdGhpczogc2VudGluZWwgdmFsdWUgd2hpY2gKKyAqIG1hdGNoZXMgbm8gS1ZNIHRhcmdldCB2YWx1ZSBmb3IgZWl0aGVyIDY0IG9yIDMyIGJpdAorICovCisjZGVmaW5lIFFFTVVfS1ZNX0FSTV9UQVJHRVRfTk9ORSBVSU5UX01BWAorCisjaWZuZGVmIFRBUkdFVF9BQVJDSDY0CitNSVNNQVRDSF9DSEVDSyhRRU1VX0tWTV9BUk1fVEFSR0VUX0NPUlRFWF9BMTUsIEtWTV9BUk1fVEFSR0VUX0NPUlRFWF9BMTUpCisjZW5kaWYKKworI3VuZGVmIE1JU01BVENIX0NIRUNLCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL21hY2hpbmUuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ZTNlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9tYWNoaW5lLmMKQEAgLTAsMCArMSwyNDQgQEAKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2JvYXJkcy5oIgorCit2b2lkIGNwdV9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgaW50IGk7CisgICAgQ1BVQVJNU3RhdGUgKmVudiA9IChDUFVBUk1TdGF0ZSAqKW9wYXF1ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5yZWdzW2ldKTsKKyAgICB9CisgICAgcWVtdV9wdXRfYmUzMihmLCBjcHNyX3JlYWQoZW52KSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPnNwc3IpOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmJhbmtlZF9zcHNyW2ldKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmJhbmtlZF9yMTNbaV0pOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+YmFua2VkX3IxNFtpXSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPnVzcl9yZWdzW2ldKTsKKyAgICAgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmZpcV9yZWdzW2ldKTsKKyAgICB9CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzBfY3B1aWQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMwX2NhY2hldHlwZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzBfY3NzZWwpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMxX3N5cyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzFfY29wcm9jKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMV94c2NhbGVhdXhjcik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzFfc2VjZmcpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMxX3NlZGJnKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMV9uc2VhYyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzJfYmFzZTApOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMyX2Jhc2UxKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMl9jb250cm9sKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMl9tYXNrKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMl9iYXNlX21hc2spOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMyX2RhdGEpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMyX2luc24pOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMzKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jNV9pbnNuKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jNV9kYXRhKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmM2X3JlZ2lvbltpXSk7CisgICAgfQorICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmM2X2luc24pOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmM2X2RhdGEpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmM3X3Bhcik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzlfaW5zbik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzlfZGF0YSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzlfcG1jcik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzlfcG1jbnRlbik7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzlfcG1vdnNyKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jOV9wbXhldnR5cGVyKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jOV9wbXVzZXJlbnIpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmM5X3BtaW50ZW4pOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMxM19mY3NlKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMTNfY29udGV4dCk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzEzX3RsczEpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT5jcDE1LmMxM190bHMyKTsKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+Y3AxNS5jMTNfdGxzMyk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTUuYzE1X2NwYXIpOworCisgICAgcWVtdV9wdXRfYmUzMihmLCBlbnYtPmNwMTRfZGJnZGlkcik7CisKKyAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+ZmVhdHVyZXMpOworCisgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQKSkgeworICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIENQVV9Eb3VibGVVIHU7CisgICAgICAgICAgICB1LmQgPSBlbnYtPnZmcC5yZWdzW2ldOworICAgICAgICAgICAgcWVtdV9wdXRfYmUzMihmLCB1LmwudXBwZXIpOworICAgICAgICAgICAgcWVtdV9wdXRfYmUzMihmLCB1LmwubG93ZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+dmZwLnhyZWdzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRPRE86IFNob3VsZCB1c2UgcHJvcGVyIEZQU0NSIGFjY2VzcyBmdW5jdGlvbnMuICAqLworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+dmZwLnZlY19sZW4pOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+dmZwLnZlY19zdHJpZGUpOworCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAxNjsgIGkgPCAzMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ1BVX0RvdWJsZVUgdTsKKyAgICAgICAgICAgICAgICB1LmQgPSBlbnYtPnZmcC5yZWdzW2ldOworICAgICAgICAgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgdS5sLnVwcGVyKTsKKyAgICAgICAgICAgICAgICBxZW11X3B1dF9iZTMyKGYsIHUubC5sb3dlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9JV01NWFQpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBxZW11X3B1dF9iZTY0KGYsIGVudi0+aXdtbXh0LnJlZ3NbaV0pOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+aXdtbXh0LmNyZWdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX00pKSB7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT52N20ub3RoZXJfc3ApOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+djdtLnZlY2Jhc2UpOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+djdtLmJhc2VwcmkpOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+djdtLmNvbnRyb2wpOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+djdtLmN1cnJlbnRfc3ApOworICAgICAgICBxZW11X3B1dF9iZTMyKGYsIGVudi0+djdtLmV4Y2VwdGlvbik7CisgICAgfQorCisgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyRUUpKSB7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT50ZWVjcik7CisgICAgICAgIHFlbXVfcHV0X2JlMzIoZiwgZW52LT50ZWVoYnIpOworICAgIH0KK30KKworI2RlZmluZSBDUFVfU0FWRV9WRVJTSU9OX0xFR0FDWSAgMworCitpbnQgY3B1X2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgQ1BVQVJNU3RhdGUgKmVudiA9IChDUFVBUk1TdGF0ZSAqKW9wYXF1ZTsKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICBpZiAodmVyc2lvbl9pZCAhPSBDUFVfU0FWRV9WRVJTSU9OICYmIHZlcnNpb25faWQgIT0gQ1BVX1NBVkVfVkVSU0lPTl9MRUdBQ1kpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgZW52LT5yZWdzW2ldID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB9CisgICAgdmFsID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICAvKiBBdm9pZCBtb2RlIHN3aXRjaCB3aGVuIHJlc3RvcmluZyBDUFNSLiAgKi8KKyAgICBlbnYtPnVuY2FjaGVkX2Nwc3IgPSB2YWwgJiBDUFNSX007CisgICAgY3Bzcl93cml0ZShlbnYsIHZhbCwgMHhmZmZmZmZmZik7CisgICAgZW52LT5zcHNyID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGVudi0+YmFua2VkX3Nwc3JbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmJhbmtlZF9yMTNbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmJhbmtlZF9yMTRbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGVudi0+dXNyX3JlZ3NbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmZpcV9yZWdzW2ldID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB9CisgICAgZW52LT5jcDE1LmMwX2NwdWlkID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzBfY2FjaGV0eXBlID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzBfY3NzZWwgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMV9zeXMgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMV9jb3Byb2MgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMV94c2NhbGVhdXhjciA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMxX3NlY2ZnID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzFfc2VkYmcgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMV9uc2VhYyA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMyX2Jhc2UwID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzJfYmFzZTEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMl9jb250cm9sID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzJfbWFzayA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMyX2Jhc2VfbWFzayA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMyX2RhdGEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMl9pbnNuID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzMgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jNV9pbnNuID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzVfZGF0YSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBlbnYtPmNwMTUuYzZfcmVnaW9uW2ldID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICB9CisgICAgZW52LT5jcDE1LmM2X2luc24gPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jNl9kYXRhID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzdfcGFyID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzlfaW5zbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmM5X2RhdGEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGlmICh2ZXJzaW9uX2lkID09IENQVV9TQVZFX1ZFUlNJT05fTEVHQUNZKSB7CisgICAgICAgICh2b2lkKXFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICh2b2lkKXFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICh2b2lkKXFlbXVfZ2V0X2JlMzIoZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5jcDE1LmM5X3BtY3IgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmNwMTUuYzlfcG1jbnRlbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIGVudi0+Y3AxNS5jOV9wbW92c3IgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmNwMTUuYzlfcG14ZXZ0eXBlciA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIGVudi0+Y3AxNS5jOV9wbXVzZXJlbnIgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPmNwMTUuYzlfcG1pbnRlbiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgfQorICAgIGVudi0+Y3AxNS5jMTNfZmNzZSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMxM19jb250ZXh0ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzEzX3RsczEgPSBxZW11X2dldF9iZTMyKGYpOworICAgIGVudi0+Y3AxNS5jMTNfdGxzMiA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgZW52LT5jcDE1LmMxM190bHMzID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBlbnYtPmNwMTUuYzE1X2NwYXIgPSBxZW11X2dldF9iZTMyKGYpOworCisgICAgZW52LT5jcDE0X2RiZ2RpZHIgPSBxZW11X2dldF9iZTMyKGYpOworCisgICAgZW52LT5mZWF0dXJlcyA9IHFlbXVfZ2V0X2JlMzIoZik7CisKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlApKSB7CisgICAgICAgIGZvciAoaSA9IDA7ICBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgQ1BVX0RvdWJsZVUgdTsKKyAgICAgICAgICAgIHUubC51cHBlciA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICAgICB1LmwubG93ZXIgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICAgICAgZW52LT52ZnAucmVnc1tpXSA9IHUuZDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgZW52LT52ZnAueHJlZ3NbaV0gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICB9CisKKyAgICAgICAgLyogVE9ETzogU2hvdWxkIHVzZSBwcm9wZXIgRlBTQ1IgYWNjZXNzIGZ1bmN0aW9ucy4gICovCisgICAgICAgIGVudi0+dmZwLnZlY19sZW4gPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPnZmcC52ZWNfc3RyaWRlID0gcWVtdV9nZXRfYmUzMihmKTsKKworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgIGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ1BVX0RvdWJsZVUgdTsKKyAgICAgICAgICAgICAgICB1LmwudXBwZXIgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICAgICAgICAgIHUubC5sb3dlciA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgICAgICAgICAgZW52LT52ZnAucmVnc1tpXSA9IHUuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX0lXTU1YVCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIGVudi0+aXdtbXh0LnJlZ3NbaV0gPSBxZW11X2dldF9iZTY0KGYpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBlbnYtPml3bW14dC5jcmVnc1tpXSA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NKSkgeworICAgICAgICBlbnYtPnY3bS5vdGhlcl9zcCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIGVudi0+djdtLnZlY2Jhc2UgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPnY3bS5iYXNlcHJpID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICAgICAgZW52LT52N20uY29udHJvbCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgICAgIGVudi0+djdtLmN1cnJlbnRfc3AgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPnY3bS5leGNlcHRpb24gPSBxZW11X2dldF9iZTMyKGYpOworICAgIH0KKworICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RIVU1CMkVFKSkgeworICAgICAgICBlbnYtPnRlZWNyID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICAgICAgZW52LT50ZWVoYnIgPSBxZW11X2dldF9iZTMyKGYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL25lb25faGVscGVyLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vbmVvbl9oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ4ZTMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL25lb25faGVscGVyLmMKQEAgLTAsMCArMSwyMDE2IEBACisvKgorICogQVJNIE5FT04gdmVjdG9yIG9wZXJhdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IENvZGVTb3VyY2VyeS4KKyAqIFdyaXR0ZW4gYnkgUGF1bCBCcm9vaworICoKKyAqIFRoaXMgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTCB2Mi4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2V4ZWMtYWxsLmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNkZWZpbmUgU0lHTkJJVCAodWludDMyX3QpMHg4MDAwMDAwMAorI2RlZmluZSBTSUdOQklUNjQgKCh1aW50NjRfdCkxIDw8IDYzKQorCisjZGVmaW5lIFNFVF9RQygpIGVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdIHw9IENQU1JfUQorCisjZGVmaW5lIE5FT05fVFlQRTEobmFtZSwgdHlwZSkgXAordHlwZWRlZiBzdHJ1Y3QgXAoreyBcCisgICAgdHlwZSB2MTsgXAorfSBuZW9uXyMjbmFtZTsKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorI2RlZmluZSBORU9OX1RZUEUyKG5hbWUsIHR5cGUpIFwKK3R5cGVkZWYgc3RydWN0IFwKK3sgXAorICAgIHR5cGUgdjI7IFwKKyAgICB0eXBlIHYxOyBcCit9IG5lb25fIyNuYW1lOworI2RlZmluZSBORU9OX1RZUEU0KG5hbWUsIHR5cGUpIFwKK3R5cGVkZWYgc3RydWN0IFwKK3sgXAorICAgIHR5cGUgdjQ7IFwKKyAgICB0eXBlIHYzOyBcCisgICAgdHlwZSB2MjsgXAorICAgIHR5cGUgdjE7IFwKK30gbmVvbl8jI25hbWU7CisjZWxzZQorI2RlZmluZSBORU9OX1RZUEUyKG5hbWUsIHR5cGUpIFwKK3R5cGVkZWYgc3RydWN0IFwKK3sgXAorICAgIHR5cGUgdjE7IFwKKyAgICB0eXBlIHYyOyBcCit9IG5lb25fIyNuYW1lOworI2RlZmluZSBORU9OX1RZUEU0KG5hbWUsIHR5cGUpIFwKK3R5cGVkZWYgc3RydWN0IFwKK3sgXAorICAgIHR5cGUgdjE7IFwKKyAgICB0eXBlIHYyOyBcCisgICAgdHlwZSB2MzsgXAorICAgIHR5cGUgdjQ7IFwKK30gbmVvbl8jI25hbWU7CisjZW5kaWYKKworTkVPTl9UWVBFNChzOCwgaW50OF90KQorTkVPTl9UWVBFNCh1OCwgdWludDhfdCkKK05FT05fVFlQRTIoczE2LCBpbnQxNl90KQorTkVPTl9UWVBFMih1MTYsIHVpbnQxNl90KQorTkVPTl9UWVBFMShzMzIsIGludDMyX3QpCitORU9OX1RZUEUxKHUzMiwgdWludDMyX3QpCisjdW5kZWYgTkVPTl9UWVBFNAorI3VuZGVmIE5FT05fVFlQRTIKKyN1bmRlZiBORU9OX1RZUEUxCisKKy8qIENvcHkgZnJvbSBhIHVpbnQzMl90IHRvIGEgdmVjdG9yIHN0cnVjdHVyZSB0eXBlLiAgKi8KKyNkZWZpbmUgTkVPTl9VTlBBQ0sodnR5cGUsIGRlc3QsIHZhbCkgZG8geyBcCisgICAgdW5pb24geyBcCisgICAgICAgIHZ0eXBlIHY7IFwKKyAgICAgICAgdWludDMyX3QgaTsgXAorICAgIH0gY29udl91OyBcCisgICAgY29udl91LmkgPSAodmFsKTsgXAorICAgIGRlc3QgPSBjb252X3UudjsgXAorICAgIH0gd2hpbGUoMCkKKworLyogQ29weSBmcm9tIGEgdmVjdG9yIHN0cnVjdHVyZSB0eXBlIHRvIGEgdWludDMyX3QuICAqLworI2RlZmluZSBORU9OX1BBQ0sodnR5cGUsIGRlc3QsIHZhbCkgZG8geyBcCisgICAgdW5pb24geyBcCisgICAgICAgIHZ0eXBlIHY7IFwKKyAgICAgICAgdWludDMyX3QgaTsgXAorICAgIH0gY29udl91OyBcCisgICAgY29udl91LnYgPSAodmFsKTsgXAorICAgIGRlc3QgPSBjb252X3UuaTsgXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBORU9OX0RPMSBcCisgICAgTkVPTl9GTih2ZGVzdC52MSwgdnNyYzEudjEsIHZzcmMyLnYxKTsKKyNkZWZpbmUgTkVPTl9ETzIgXAorICAgIE5FT05fRk4odmRlc3QudjEsIHZzcmMxLnYxLCB2c3JjMi52MSk7IFwKKyAgICBORU9OX0ZOKHZkZXN0LnYyLCB2c3JjMS52MiwgdnNyYzIudjIpOworI2RlZmluZSBORU9OX0RPNCBcCisgICAgTkVPTl9GTih2ZGVzdC52MSwgdnNyYzEudjEsIHZzcmMyLnYxKTsgXAorICAgIE5FT05fRk4odmRlc3QudjIsIHZzcmMxLnYyLCB2c3JjMi52Mik7IFwKKyAgICBORU9OX0ZOKHZkZXN0LnYzLCB2c3JjMS52MywgdnNyYzIudjMpOyBcCisgICAgTkVPTl9GTih2ZGVzdC52NCwgdnNyYzEudjQsIHZzcmMyLnY0KTsKKworI2RlZmluZSBORU9OX1ZPUF9CT0RZKHZ0eXBlLCBuKSBcCit7IFwKKyAgICB1aW50MzJfdCByZXM7IFwKKyAgICB2dHlwZSB2c3JjMTsgXAorICAgIHZ0eXBlIHZzcmMyOyBcCisgICAgdnR5cGUgdmRlc3Q7IFwKKyAgICBORU9OX1VOUEFDSyh2dHlwZSwgdnNyYzEsIGFyZzEpOyBcCisgICAgTkVPTl9VTlBBQ0sodnR5cGUsIHZzcmMyLCBhcmcyKTsgXAorICAgIE5FT05fRE8jI247IFwKKyAgICBORU9OX1BBQ0sodnR5cGUsIHJlcywgdmRlc3QpOyBcCisgICAgcmV0dXJuIHJlczsgXAorfQorCisjZGVmaW5lIE5FT05fVk9QKG5hbWUsIHZ0eXBlLCBuKSBcCit1aW50MzJfdCBIRUxQRVIoZ2x1ZShuZW9uXyxuYW1lKSkodWludDMyX3QgYXJnMSwgdWludDMyX3QgYXJnMikgXAorTkVPTl9WT1BfQk9EWSh2dHlwZSwgbikKKworI2RlZmluZSBORU9OX1ZPUF9FTlYobmFtZSwgdnR5cGUsIG4pIFwKK3VpbnQzMl90IEhFTFBFUihnbHVlKG5lb25fLG5hbWUpKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhcmcxLCB1aW50MzJfdCBhcmcyKSBcCitORU9OX1ZPUF9CT0RZKHZ0eXBlLCBuKQorCisvKiBQYWlyd2lzZSBvcGVyYXRpb25zLiAgKi8KKy8qIEZvciAzMi1iaXQgZWxlbWVudHMgZWFjaCBzZWdtZW50IG9ubHkgY29udGFpbnMgYSBzaW5nbGUgZWxlbWVudCwgc28KKyAgIHRoZSBlbGVtZW50d2lzZSBhbmQgcGFpcndpc2Ugb3BlcmF0aW9ucyBhcmUgdGhlIHNhbWUuICAqLworI2RlZmluZSBORU9OX1BETzIgXAorICAgIE5FT05fRk4odmRlc3QudjEsIHZzcmMxLnYxLCB2c3JjMS52Mik7IFwKKyAgICBORU9OX0ZOKHZkZXN0LnYyLCB2c3JjMi52MSwgdnNyYzIudjIpOworI2RlZmluZSBORU9OX1BETzQgXAorICAgIE5FT05fRk4odmRlc3QudjEsIHZzcmMxLnYxLCB2c3JjMS52Mik7IFwKKyAgICBORU9OX0ZOKHZkZXN0LnYyLCB2c3JjMS52MywgdnNyYzEudjQpOyBcCisgICAgTkVPTl9GTih2ZGVzdC52MywgdnNyYzIudjEsIHZzcmMyLnYyKTsgXAorICAgIE5FT05fRk4odmRlc3QudjQsIHZzcmMyLnYzLCB2c3JjMi52NCk7IFwKKworI2RlZmluZSBORU9OX1BPUChuYW1lLCB2dHlwZSwgbikgXAordWludDMyX3QgSEVMUEVSKGdsdWUobmVvbl8sbmFtZSkpKHVpbnQzMl90IGFyZzEsIHVpbnQzMl90IGFyZzIpIFwKK3sgXAorICAgIHVpbnQzMl90IHJlczsgXAorICAgIHZ0eXBlIHZzcmMxOyBcCisgICAgdnR5cGUgdnNyYzI7IFwKKyAgICB2dHlwZSB2ZGVzdDsgXAorICAgIE5FT05fVU5QQUNLKHZ0eXBlLCB2c3JjMSwgYXJnMSk7IFwKKyAgICBORU9OX1VOUEFDSyh2dHlwZSwgdnNyYzIsIGFyZzIpOyBcCisgICAgTkVPTl9QRE8jI247IFwKKyAgICBORU9OX1BBQ0sodnR5cGUsIHJlcywgdmRlc3QpOyBcCisgICAgcmV0dXJuIHJlczsgXAorfQorCisvKiBVbmFyeSBvcGVyYXRvcnMuICAqLworI2RlZmluZSBORU9OX1ZPUDEobmFtZSwgdnR5cGUsIG4pIFwKK3VpbnQzMl90IEhFTFBFUihnbHVlKG5lb25fLG5hbWUpKSh1aW50MzJfdCBhcmcpIFwKK3sgXAorICAgIHZ0eXBlIHZzcmMxOyBcCisgICAgdnR5cGUgdmRlc3Q7IFwKKyAgICBORU9OX1VOUEFDSyh2dHlwZSwgdnNyYzEsIGFyZyk7IFwKKyAgICBORU9OX0RPIyNuOyBcCisgICAgTkVPTl9QQUNLKHZ0eXBlLCBhcmcsIHZkZXN0KTsgXAorICAgIHJldHVybiBhcmc7IFwKK30KKworCisjZGVmaW5lIE5FT05fVVNBVChkZXN0LCBzcmMxLCBzcmMyLCB0eXBlKSBkbyB7IFwKKyAgICB1aW50MzJfdCB0bXAgPSAodWludDMyX3Qpc3JjMSArICh1aW50MzJfdClzcmMyOyBcCisgICAgaWYgKHRtcCAhPSAodHlwZSl0bXApIHsgXAorICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICBkZXN0ID0gfjA7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGRlc3QgPSB0bXA7IFwKKyAgICB9fSB3aGlsZSgwKQorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fVVNBVChkZXN0LCBzcmMxLCBzcmMyLCB1aW50OF90KQorTkVPTl9WT1BfRU5WKHFhZGRfdTgsIG5lb25fdTgsIDQpCisjdW5kZWYgTkVPTl9GTgorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fVVNBVChkZXN0LCBzcmMxLCBzcmMyLCB1aW50MTZfdCkKK05FT05fVk9QX0VOVihxYWRkX3UxNiwgbmVvbl91MTYsIDIpCisjdW5kZWYgTkVPTl9GTgorI3VuZGVmIE5FT05fVVNBVAorCit1aW50MzJfdCBIRUxQRVIobmVvbl9xYWRkX3UzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXMgPSBhICsgYjsKKyAgICBpZiAocmVzIDwgYSkgeworICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgcmVzID0gfjA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3FhZGRfdTY0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBzcmMxLCB1aW50NjRfdCBzcmMyKQoreworICAgIHVpbnQ2NF90IHJlczsKKworICAgIHJlcyA9IHNyYzEgKyBzcmMyOworICAgIGlmIChyZXMgPCBzcmMxKSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXMgPSB+KHVpbnQ2NF90KTA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgTkVPTl9TU0FUKGRlc3QsIHNyYzEsIHNyYzIsIHR5cGUpIGRvIHsgXAorICAgIGludDMyX3QgdG1wID0gKHVpbnQzMl90KXNyYzEgKyAodWludDMyX3Qpc3JjMjsgXAorICAgIGlmICh0bXAgIT0gKHR5cGUpdG1wKSB7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgaWYgKHNyYzIgPiAwKSB7IFwKKyAgICAgICAgICAgIHRtcCA9ICgxIDw8IChzaXplb2YodHlwZSkgKiA4IC0gMSkpIC0gMTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICB0bXAgPSAxIDw8IChzaXplb2YodHlwZSkgKiA4IC0gMSk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgZGVzdCA9IHRtcDsgXAorICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBORU9OX1NTQVQoZGVzdCwgc3JjMSwgc3JjMiwgaW50OF90KQorTkVPTl9WT1BfRU5WKHFhZGRfczgsIG5lb25fczgsIDQpCisjdW5kZWYgTkVPTl9GTgorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fU1NBVChkZXN0LCBzcmMxLCBzcmMyLCBpbnQxNl90KQorTkVPTl9WT1BfRU5WKHFhZGRfczE2LCBuZW9uX3MxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisjdW5kZWYgTkVPTl9TU0FUCisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FhZGRfczMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlcyA9IGEgKyBiOworICAgIGlmICgoKHJlcyBeIGEpICYgU0lHTkJJVCkgJiYgISgoYSBeIGIpICYgU0lHTkJJVCkpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIHJlcyA9IH4oKChpbnQzMl90KWEgPj4gMzEpIF4gU0lHTkJJVCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3FhZGRfczY0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBzcmMxLCB1aW50NjRfdCBzcmMyKQoreworICAgIHVpbnQ2NF90IHJlczsKKworICAgIHJlcyA9IHNyYzEgKyBzcmMyOworICAgIGlmICgoKHJlcyBeIHNyYzEpICYgU0lHTkJJVDY0KSAmJiAhKChzcmMxIF4gc3JjMikgJiBTSUdOQklUNjQpKSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXMgPSAoKGludDY0X3Qpc3JjMSA+PiA2MykgXiB+U0lHTkJJVDY0OworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisjZGVmaW5lIE5FT05fVVNBVChkZXN0LCBzcmMxLCBzcmMyLCB0eXBlKSBkbyB7IFwKKyAgICB1aW50MzJfdCB0bXAgPSAodWludDMyX3Qpc3JjMSAtICh1aW50MzJfdClzcmMyOyBcCisgICAgaWYgKHRtcCAhPSAodHlwZSl0bXApIHsgXAorICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICBkZXN0ID0gMDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVzdCA9IHRtcDsgXAorICAgIH19IHdoaWxlKDApCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgTkVPTl9VU0FUKGRlc3QsIHNyYzEsIHNyYzIsIHVpbnQ4X3QpCitORU9OX1ZPUF9FTlYocXN1Yl91OCwgbmVvbl91OCwgNCkKKyN1bmRlZiBORU9OX0ZOCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgTkVPTl9VU0FUKGRlc3QsIHNyYzEsIHNyYzIsIHVpbnQxNl90KQorTkVPTl9WT1BfRU5WKHFzdWJfdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisjdW5kZWYgTkVPTl9VU0FUCisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FzdWJfdTMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlcyA9IGEgLSBiOworICAgIGlmIChyZXMgPiBhKSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9xc3ViX3U2NCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3Qgc3JjMSwgdWludDY0X3Qgc3JjMikKK3sKKyAgICB1aW50NjRfdCByZXM7CisKKyAgICBpZiAoc3JjMSA8IHNyYzIpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIHJlcyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gc3JjMSAtIHNyYzI7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgTkVPTl9TU0FUKGRlc3QsIHNyYzEsIHNyYzIsIHR5cGUpIGRvIHsgXAorICAgIGludDMyX3QgdG1wID0gKHVpbnQzMl90KXNyYzEgLSAodWludDMyX3Qpc3JjMjsgXAorICAgIGlmICh0bXAgIT0gKHR5cGUpdG1wKSB7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgaWYgKHNyYzIgPCAwKSB7IFwKKyAgICAgICAgICAgIHRtcCA9ICgxIDw8IChzaXplb2YodHlwZSkgKiA4IC0gMSkpIC0gMTsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICB0bXAgPSAxIDw8IChzaXplb2YodHlwZSkgKiA4IC0gMSk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgZGVzdCA9IHRtcDsgXAorICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBORU9OX1NTQVQoZGVzdCwgc3JjMSwgc3JjMiwgaW50OF90KQorTkVPTl9WT1BfRU5WKHFzdWJfczgsIG5lb25fczgsIDQpCisjdW5kZWYgTkVPTl9GTgorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fU1NBVChkZXN0LCBzcmMxLCBzcmMyLCBpbnQxNl90KQorTkVPTl9WT1BfRU5WKHFzdWJfczE2LCBuZW9uX3MxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisjdW5kZWYgTkVPTl9TU0FUCisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FzdWJfczMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlcyA9IGEgLSBiOworICAgIGlmICgoKHJlcyBeIGEpICYgU0lHTkJJVCkgJiYgKChhIF4gYikgJiBTSUdOQklUKSkgeworICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgcmVzID0gfigoKGludDMyX3QpYSA+PiAzMSkgXiBTSUdOQklUKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fcXN1Yl9zNjQpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHNyYzEsIHVpbnQ2NF90IHNyYzIpCit7CisgICAgdWludDY0X3QgcmVzOworCisgICAgcmVzID0gc3JjMSAtIHNyYzI7CisgICAgaWYgKCgocmVzIF4gc3JjMSkgJiBTSUdOQklUNjQpICYmICgoc3JjMSBeIHNyYzIpICYgU0lHTkJJVDY0KSkgeworICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgcmVzID0gKChpbnQ2NF90KXNyYzEgPj4gNjMpIF4gflNJR05CSVQ2NDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRlc3QgPSAoc3JjMSArIHNyYzIpID4+IDEKK05FT05fVk9QKGhhZGRfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChoYWRkX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1AoaGFkZF9zMTYsIG5lb25fczE2LCAyKQorTkVPTl9WT1AoaGFkZF91MTYsIG5lb25fdTE2LCAyKQorI3VuZGVmIE5FT05fRk4KKworaW50MzJfdCBIRUxQRVIobmVvbl9oYWRkX3MzMikoaW50MzJfdCBzcmMxLCBpbnQzMl90IHNyYzIpCit7CisgICAgaW50MzJfdCBkZXN0OworCisgICAgZGVzdCA9IChzcmMxID4+IDEpICsgKHNyYzIgPj4gMSk7CisgICAgaWYgKHNyYzEgJiBzcmMyICYgMSkKKyAgICAgICAgZGVzdCsrOworICAgIHJldHVybiBkZXN0OworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9oYWRkX3UzMikodWludDMyX3Qgc3JjMSwgdWludDMyX3Qgc3JjMikKK3sKKyAgICB1aW50MzJfdCBkZXN0OworCisgICAgZGVzdCA9IChzcmMxID4+IDEpICsgKHNyYzIgPj4gMSk7CisgICAgaWYgKHNyYzEgJiBzcmMyICYgMSkKKyAgICAgICAgZGVzdCsrOworICAgIHJldHVybiBkZXN0OworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IChzcmMxICsgc3JjMiArIDEpID4+IDEKK05FT05fVk9QKHJoYWRkX3M4LCBuZW9uX3M4LCA0KQorTkVPTl9WT1AocmhhZGRfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChyaGFkZF9zMTYsIG5lb25fczE2LCAyKQorTkVPTl9WT1AocmhhZGRfdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKK2ludDMyX3QgSEVMUEVSKG5lb25fcmhhZGRfczMyKShpbnQzMl90IHNyYzEsIGludDMyX3Qgc3JjMikKK3sKKyAgICBpbnQzMl90IGRlc3Q7CisKKyAgICBkZXN0ID0gKHNyYzEgPj4gMSkgKyAoc3JjMiA+PiAxKTsKKyAgICBpZiAoKHNyYzEgfCBzcmMyKSAmIDEpCisgICAgICAgIGRlc3QrKzsKKyAgICByZXR1cm4gZGVzdDsKK30KKwordWludDMyX3QgSEVMUEVSKG5lb25fcmhhZGRfdTMyKSh1aW50MzJfdCBzcmMxLCB1aW50MzJfdCBzcmMyKQoreworICAgIHVpbnQzMl90IGRlc3Q7CisKKyAgICBkZXN0ID0gKHNyYzEgPj4gMSkgKyAoc3JjMiA+PiAxKTsKKyAgICBpZiAoKHNyYzEgfCBzcmMyKSAmIDEpCisgICAgICAgIGRlc3QrKzsKKyAgICByZXR1cm4gZGVzdDsKK30KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRlc3QgPSAoc3JjMSAtIHNyYzIpID4+IDEKK05FT05fVk9QKGhzdWJfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChoc3ViX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1AoaHN1Yl9zMTYsIG5lb25fczE2LCAyKQorTkVPTl9WT1AoaHN1Yl91MTYsIG5lb25fdTE2LCAyKQorI3VuZGVmIE5FT05fRk4KKworaW50MzJfdCBIRUxQRVIobmVvbl9oc3ViX3MzMikoaW50MzJfdCBzcmMxLCBpbnQzMl90IHNyYzIpCit7CisgICAgaW50MzJfdCBkZXN0OworCisgICAgZGVzdCA9IChzcmMxID4+IDEpIC0gKHNyYzIgPj4gMSk7CisgICAgaWYgKCh+c3JjMSkgJiBzcmMyICYgMSkKKyAgICAgICAgZGVzdC0tOworICAgIHJldHVybiBkZXN0OworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9oc3ViX3UzMikodWludDMyX3Qgc3JjMSwgdWludDMyX3Qgc3JjMikKK3sKKyAgICB1aW50MzJfdCBkZXN0OworCisgICAgZGVzdCA9IChzcmMxID4+IDEpIC0gKHNyYzIgPj4gMSk7CisgICAgaWYgKCh+c3JjMSkgJiBzcmMyICYgMSkKKyAgICAgICAgZGVzdC0tOworICAgIHJldHVybiBkZXN0OworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IChzcmMxID4gc3JjMikgPyB+MCA6IDAKK05FT05fVk9QKGNndF9zOCwgbmVvbl9zOCwgNCkKK05FT05fVk9QKGNndF91OCwgbmVvbl91OCwgNCkKK05FT05fVk9QKGNndF9zMTYsIG5lb25fczE2LCAyKQorTkVPTl9WT1AoY2d0X3UxNiwgbmVvbl91MTYsIDIpCitORU9OX1ZPUChjZ3RfczMyLCBuZW9uX3MzMiwgMSkKK05FT05fVk9QKGNndF91MzIsIG5lb25fdTMyLCAxKQorI3VuZGVmIE5FT05fRk4KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRlc3QgPSAoc3JjMSA+PSBzcmMyKSA/IH4wIDogMAorTkVPTl9WT1AoY2dlX3M4LCBuZW9uX3M4LCA0KQorTkVPTl9WT1AoY2dlX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1AoY2dlX3MxNiwgbmVvbl9zMTYsIDIpCitORU9OX1ZPUChjZ2VfdTE2LCBuZW9uX3UxNiwgMikKK05FT05fVk9QKGNnZV9zMzIsIG5lb25fczMyLCAxKQorTkVPTl9WT1AoY2dlX3UzMiwgbmVvbl91MzIsIDEpCisjdW5kZWYgTkVPTl9GTgorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IChzcmMxIDwgc3JjMikgPyBzcmMxIDogc3JjMgorTkVPTl9WT1AobWluX3M4LCBuZW9uX3M4LCA0KQorTkVPTl9WT1AobWluX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1AobWluX3MxNiwgbmVvbl9zMTYsIDIpCitORU9OX1ZPUChtaW5fdTE2LCBuZW9uX3UxNiwgMikKK05FT05fVk9QKG1pbl9zMzIsIG5lb25fczMyLCAxKQorTkVPTl9WT1AobWluX3UzMiwgbmVvbl91MzIsIDEpCitORU9OX1BPUChwbWluX3M4LCBuZW9uX3M4LCA0KQorTkVPTl9QT1AocG1pbl91OCwgbmVvbl91OCwgNCkKK05FT05fUE9QKHBtaW5fczE2LCBuZW9uX3MxNiwgMikKK05FT05fUE9QKHBtaW5fdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBkZXN0ID0gKHNyYzEgPiBzcmMyKSA/IHNyYzEgOiBzcmMyCitORU9OX1ZPUChtYXhfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChtYXhfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChtYXhfczE2LCBuZW9uX3MxNiwgMikKK05FT05fVk9QKG1heF91MTYsIG5lb25fdTE2LCAyKQorTkVPTl9WT1AobWF4X3MzMiwgbmVvbl9zMzIsIDEpCitORU9OX1ZPUChtYXhfdTMyLCBuZW9uX3UzMiwgMSkKK05FT05fUE9QKHBtYXhfczgsIG5lb25fczgsIDQpCitORU9OX1BPUChwbWF4X3U4LCBuZW9uX3U4LCA0KQorTkVPTl9QT1AocG1heF9zMTYsIG5lb25fczE2LCAyKQorTkVPTl9QT1AocG1heF91MTYsIG5lb25fdTE2LCAyKQorI3VuZGVmIE5FT05fRk4KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIFwKKyAgICBkZXN0ID0gKHNyYzEgPiBzcmMyKSA/IChzcmMxIC0gc3JjMikgOiAoc3JjMiAtIHNyYzEpCitORU9OX1ZPUChhYmRfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChhYmRfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChhYmRfczE2LCBuZW9uX3MxNiwgMikKK05FT05fVk9QKGFiZF91MTYsIG5lb25fdTE2LCAyKQorTkVPTl9WT1AoYWJkX3MzMiwgbmVvbl9zMzIsIDEpCitORU9OX1ZPUChhYmRfdTMyLCBuZW9uX3UzMiwgMSkKKyN1bmRlZiBORU9OX0ZOCisKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBkbyB7IFwKKyAgICBpbnQ4X3QgdG1wOyBcCisgICAgdG1wID0gKGludDhfdClzcmMyOyBcCisgICAgaWYgKHRtcCA+PSAoc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4IHx8IFwKKyAgICAgICAgdG1wIDw9IC0oc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4KSB7IFwKKyAgICAgICAgZGVzdCA9IDA7IFwKKyAgICB9IGVsc2UgaWYgKHRtcCA8IDApIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA+PiAtdG1wOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA8PCB0bXA7IFwKKyAgICB9fSB3aGlsZSAoMCkKK05FT05fVk9QKHNobF91OCwgbmVvbl91OCwgNCkKK05FT05fVk9QKHNobF91MTYsIG5lb25fdTE2LCAyKQorTkVPTl9WT1Aoc2hsX3UzMiwgbmVvbl91MzIsIDEpCisjdW5kZWYgTkVPTl9GTgorCit1aW50NjRfdCBIRUxQRVIobmVvbl9zaGxfdTY0KSh1aW50NjRfdCB2YWwsIHVpbnQ2NF90IHNoaWZ0b3ApCit7CisgICAgaW50OF90IHNoaWZ0ID0gKGludDhfdClzaGlmdG9wOworICAgIGlmIChzaGlmdCA+PSA2NCB8fCBzaGlmdCA8PSAtNjQpIHsKKyAgICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICB2YWwgPj49IC1zaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgPDw9IHNoaWZ0OworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZG8geyBcCisgICAgaW50OF90IHRtcDsgXAorICAgIHRtcCA9IChpbnQ4X3Qpc3JjMjsgXAorICAgIGlmICh0bXAgPj0gKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgIGRlc3QgPSAwOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPD0gLShzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA+PiAoc2l6ZW9mKHNyYzEpICogOCAtIDEpOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPCAwKSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPj4gLXRtcDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPDwgdG1wOyBcCisgICAgfX0gd2hpbGUgKDApCitORU9OX1ZPUChzaGxfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChzaGxfczE2LCBuZW9uX3MxNiwgMikKK05FT05fVk9QKHNobF9zMzIsIG5lb25fczMyLCAxKQorI3VuZGVmIE5FT05fRk4KKwordWludDY0X3QgSEVMUEVSKG5lb25fc2hsX3M2NCkodWludDY0X3QgdmFsb3AsIHVpbnQ2NF90IHNoaWZ0b3ApCit7CisgICAgaW50OF90IHNoaWZ0ID0gKGludDhfdClzaGlmdG9wOworICAgIGludDY0X3QgdmFsID0gdmFsb3A7CisgICAgaWYgKHNoaWZ0ID49IDY0KSB7CisgICAgICAgIHZhbCA9IDA7CisgICAgfSBlbHNlIGlmIChzaGlmdCA8PSAtNjQpIHsKKyAgICAgICAgdmFsID4+PSA2MzsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICB2YWwgPj49IC1zaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgPDw9IHNoaWZ0OworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZG8geyBcCisgICAgaW50OF90IHRtcDsgXAorICAgIHRtcCA9IChpbnQ4X3Qpc3JjMjsgXAorICAgIGlmICgodG1wID49IChzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIFwKKyAgICAgICAgfHwgKHRtcCA8PSAtKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkpIHsgXAorICAgICAgICBkZXN0ID0gMDsgXAorICAgIH0gZWxzZSBpZiAodG1wIDwgMCkgeyBcCisgICAgICAgIGRlc3QgPSAoc3JjMSArICgxIDw8ICgtMSAtIHRtcCkpKSA+PiAtdG1wOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA8PCB0bXA7IFwKKyAgICB9fSB3aGlsZSAoMCkKK05FT05fVk9QKHJzaGxfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUChyc2hsX3MxNiwgbmVvbl9zMTYsIDIpCisjdW5kZWYgTkVPTl9GTgorCisvKiBUaGUgYWRkaXRpb24gb2YgdGhlIHJvdW5kaW5nIGNvbnN0YW50IG1heSBvdmVyZmxvdywgc28gd2UgdXNlIGFuCisgKiBpbnRlcm1lZGlhdGUgNjQgYml0IGFjY3VtdWxhdG9yLiAgKi8KK3VpbnQzMl90IEhFTFBFUihuZW9uX3JzaGxfczMyKSh1aW50MzJfdCB2YWxvcCwgdWludDMyX3Qgc2hpZnRvcCkKK3sKKyAgICBpbnQzMl90IGRlc3Q7CisgICAgaW50MzJfdCB2YWwgPSAoaW50MzJfdCl2YWxvcDsKKyAgICBpbnQ4X3Qgc2hpZnQgPSAoaW50OF90KXNoaWZ0b3A7CisgICAgaWYgKChzaGlmdCA+PSAzMikgfHwgKHNoaWZ0IDw9IC0zMikpIHsKKyAgICAgICAgZGVzdCA9IDA7CisgICAgfSBlbHNlIGlmIChzaGlmdCA8IDApIHsKKyAgICAgICAgaW50NjRfdCBiaWdfZGVzdCA9ICgoaW50NjRfdCl2YWwgKyAoMSA8PCAoLTEgLSBzaGlmdCkpKTsKKyAgICAgICAgZGVzdCA9IGJpZ19kZXN0ID4+IC1zaGlmdDsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXN0ID0gdmFsIDw8IHNoaWZ0OworICAgIH0KKyAgICByZXR1cm4gZGVzdDsKK30KKworLyogSGFuZGxpbmcgYWRkaXRpb24gb3ZlcmZsb3cgd2l0aCA2NCBiaXQgaW5wdXQgdmFsdWVzIGlzIG1vcmUKKyAqIHRyaWNreSB0aGFuIHdpdGggMzIgYml0IHZhbHVlcy4gICovCit1aW50NjRfdCBIRUxQRVIobmVvbl9yc2hsX3M2NCkodWludDY0X3QgdmFsb3AsIHVpbnQ2NF90IHNoaWZ0b3ApCit7CisgICAgaW50OF90IHNoaWZ0ID0gKGludDhfdClzaGlmdG9wOworICAgIGludDY0X3QgdmFsID0gdmFsb3A7CisgICAgaWYgKChzaGlmdCA+PSA2NCkgfHwgKHNoaWZ0IDw9IC02NCkpIHsKKyAgICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICB2YWwgPj49ICgtc2hpZnQgLSAxKTsKKyAgICAgICAgaWYgKHZhbCA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIC8qIEluIHRoaXMgY2FzZSwgaXQgbWVhbnMgdGhhdCB0aGUgcm91bmRpbmcgY29uc3RhbnQgaXMgMSwKKyAgICAgICAgICAgICAqIGFuZCB0aGUgYWRkaXRpb24gd291bGQgb3ZlcmZsb3cuIFJldHVybiB0aGUgYWN0dWFsCisgICAgICAgICAgICAgKiByZXN1bHQgZGlyZWN0bHkuICAqLworICAgICAgICAgICAgdmFsID0gMHg0MDAwMDAwMDAwMDAwMDAwTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwrKzsKKyAgICAgICAgICAgIHZhbCA+Pj0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZhbCA8PD0gc2hpZnQ7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBkbyB7IFwKKyAgICBpbnQ4X3QgdG1wOyBcCisgICAgdG1wID0gKGludDhfdClzcmMyOyBcCisgICAgaWYgKHRtcCA+PSAoc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4IHx8IFwKKyAgICAgICAgdG1wIDwgLShzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICBkZXN0ID0gMDsgXAorICAgIH0gZWxzZSBpZiAodG1wID09IC0oc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4KSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPj4gKC10bXAgLSAxKTsgXAorICAgIH0gZWxzZSBpZiAodG1wIDwgMCkgeyBcCisgICAgICAgIGRlc3QgPSAoc3JjMSArICgxIDw8ICgtMSAtIHRtcCkpKSA+PiAtdG1wOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA8PCB0bXA7IFwKKyAgICB9fSB3aGlsZSAoMCkKK05FT05fVk9QKHJzaGxfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChyc2hsX3UxNiwgbmVvbl91MTYsIDIpCisjdW5kZWYgTkVPTl9GTgorCisvKiBUaGUgYWRkaXRpb24gb2YgdGhlIHJvdW5kaW5nIGNvbnN0YW50IG1heSBvdmVyZmxvdywgc28gd2UgdXNlIGFuCisgKiBpbnRlcm1lZGlhdGUgNjQgYml0IGFjY3VtdWxhdG9yLiAgKi8KK3VpbnQzMl90IEhFTFBFUihuZW9uX3JzaGxfdTMyKSh1aW50MzJfdCB2YWwsIHVpbnQzMl90IHNoaWZ0b3ApCit7CisgICAgdWludDMyX3QgZGVzdDsKKyAgICBpbnQ4X3Qgc2hpZnQgPSAoaW50OF90KXNoaWZ0b3A7CisgICAgaWYgKHNoaWZ0ID49IDMyIHx8IHNoaWZ0IDwgLTMyKSB7CisgICAgICAgIGRlc3QgPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPT0gLTMyKSB7CisgICAgICAgIGRlc3QgPSB2YWwgPj4gMzE7CisgICAgfSBlbHNlIGlmIChzaGlmdCA8IDApIHsKKyAgICAgICAgdWludDY0X3QgYmlnX2Rlc3QgPSAoKHVpbnQ2NF90KXZhbCArICgxIDw8ICgtMSAtIHNoaWZ0KSkpOworICAgICAgICBkZXN0ID0gYmlnX2Rlc3QgPj4gLXNoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3QgPSB2YWwgPDwgc2hpZnQ7CisgICAgfQorICAgIHJldHVybiBkZXN0OworfQorCisvKiBIYW5kbGluZyBhZGRpdGlvbiBvdmVyZmxvdyB3aXRoIDY0IGJpdCBpbnB1dCB2YWx1ZXMgaXMgbW9yZQorICogdHJpY2t5IHRoYW4gd2l0aCAzMiBiaXQgdmFsdWVzLiAgKi8KK3VpbnQ2NF90IEhFTFBFUihuZW9uX3JzaGxfdTY0KSh1aW50NjRfdCB2YWwsIHVpbnQ2NF90IHNoaWZ0b3ApCit7CisgICAgaW50OF90IHNoaWZ0ID0gKHVpbnQ4X3Qpc2hpZnRvcDsKKyAgICBpZiAoc2hpZnQgPj0gNjQgfHwgc2hpZnQgPCAtNjQpIHsKKyAgICAgICAgdmFsID0gMDsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0ID09IC02NCkgeworICAgICAgICAvKiBSb3VuZGluZyBhIDEtYml0IHJlc3VsdCBqdXN0IHByZXNlcnZlcyB0aGF0IGJpdC4gICovCisgICAgICAgIHZhbCA+Pj0gNjM7CisgICAgfSBlbHNlIGlmIChzaGlmdCA8IDApIHsKKyAgICAgICAgdmFsID4+PSAoLXNoaWZ0IC0gMSk7CisgICAgICAgIGlmICh2YWwgPT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZSByb3VuZGluZyBjb25zdGFudCBpcyAxLAorICAgICAgICAgICAgICogYW5kIHRoZSBhZGRpdGlvbiB3b3VsZCBvdmVyZmxvdy4gUmV0dXJuIHRoZSBhY3R1YWwKKyAgICAgICAgICAgICAqIHJlc3VsdCBkaXJlY3RseS4gICovCisgICAgICAgICAgICB2YWwgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwrKzsKKyAgICAgICAgICAgIHZhbCA+Pj0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZhbCA8PD0gc2hpZnQ7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBkbyB7IFwKKyAgICBpbnQ4X3QgdG1wOyBcCisgICAgdG1wID0gKGludDhfdClzcmMyOyBcCisgICAgaWYgKHRtcCA+PSAoc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4KSB7IFwKKyAgICAgICAgaWYgKHNyYzEpIHsgXAorICAgICAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgICAgIGRlc3QgPSB+MDsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBkZXN0ID0gMDsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgaWYgKHRtcCA8PSAtKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgIGRlc3QgPSAwOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPCAwKSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPj4gLXRtcDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPDwgdG1wOyBcCisgICAgICAgIGlmICgoZGVzdCA+PiB0bXApICE9IHNyYzEpIHsgXAorICAgICAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgICAgIGRlc3QgPSB+MDsgXAorICAgICAgICB9IFwKKyAgICB9fSB3aGlsZSAoMCkKK05FT05fVk9QX0VOVihxc2hsX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1BfRU5WKHFzaGxfdTE2LCBuZW9uX3UxNiwgMikKK05FT05fVk9QX0VOVihxc2hsX3UzMiwgbmVvbl91MzIsIDEpCisjdW5kZWYgTkVPTl9GTgorCit1aW50NjRfdCBIRUxQRVIobmVvbl9xc2hsX3U2NCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgdmFsLCB1aW50NjRfdCBzaGlmdG9wKQoreworICAgIGludDhfdCBzaGlmdCA9IChpbnQ4X3Qpc2hpZnRvcDsKKyAgICBpZiAoc2hpZnQgPj0gNjQpIHsKKyAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgdmFsID0gfih1aW50NjRfdCkwOworICAgICAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDw9IC02NCkgeworICAgICAgICB2YWwgPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgIHZhbCA+Pj0gLXNoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IHRtcCA9IHZhbDsKKyAgICAgICAgdmFsIDw8PSBzaGlmdDsKKyAgICAgICAgaWYgKCh2YWwgPj4gc2hpZnQpICE9IHRtcCkgeworICAgICAgICAgICAgU0VUX1FDKCk7CisgICAgICAgICAgICB2YWwgPSB+KHVpbnQ2NF90KTA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRvIHsgXAorICAgIGludDhfdCB0bXA7IFwKKyAgICB0bXAgPSAoaW50OF90KXNyYzI7IFwKKyAgICBpZiAodG1wID49IChzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICBpZiAoc3JjMSkgeyBcCisgICAgICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICAgICAgZGVzdCA9ICh1aW50MzJfdCkoMSA8PCAoc2l6ZW9mKHNyYzEpICogOCAtIDEpKTsgXAorICAgICAgICAgICAgaWYgKHNyYzEgPiAwKSB7IFwKKyAgICAgICAgICAgICAgICBkZXN0LS07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBkZXN0ID0gc3JjMTsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgaWYgKHRtcCA8PSAtKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgIGRlc3QgPSBzcmMxID4+IDMxOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPCAwKSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPj4gLXRtcDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPDwgdG1wOyBcCisgICAgICAgIGlmICgoZGVzdCA+PiB0bXApICE9IHNyYzEpIHsgXAorICAgICAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgICAgIGRlc3QgPSAodWludDMyX3QpKDEgPDwgKHNpemVvZihzcmMxKSAqIDggLSAxKSk7IFwKKyAgICAgICAgICAgIGlmIChzcmMxID4gMCkgeyBcCisgICAgICAgICAgICAgICAgZGVzdC0tOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfX0gd2hpbGUgKDApCitORU9OX1ZPUF9FTlYocXNobF9zOCwgbmVvbl9zOCwgNCkKK05FT05fVk9QX0VOVihxc2hsX3MxNiwgbmVvbl9zMTYsIDIpCitORU9OX1ZPUF9FTlYocXNobF9zMzIsIG5lb25fczMyLCAxKQorI3VuZGVmIE5FT05fRk4KKwordWludDY0X3QgSEVMUEVSKG5lb25fcXNobF9zNjQpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHZhbG9wLCB1aW50NjRfdCBzaGlmdG9wKQoreworICAgIGludDhfdCBzaGlmdCA9ICh1aW50OF90KXNoaWZ0b3A7CisgICAgaW50NjRfdCB2YWwgPSB2YWxvcDsKKyAgICBpZiAoc2hpZnQgPj0gNjQpIHsKKyAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgU0VUX1FDKCk7CisgICAgICAgICAgICB2YWwgPSAodmFsID4+IDYzKSBeIH5TSUdOQklUNjQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDw9IC02NCkgeworICAgICAgICB2YWwgPj49IDYzOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgIHZhbCA+Pj0gLXNoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdG1wID0gdmFsOworICAgICAgICB2YWwgPDw9IHNoaWZ0OworICAgICAgICBpZiAoKHZhbCA+PiBzaGlmdCkgIT0gdG1wKSB7CisgICAgICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgICAgIHZhbCA9ICh0bXAgPj4gNjMpIF4gflNJR05CSVQ2NDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZG8geyBcCisgICAgaWYgKHNyYzEgJiAoMSA8PCAoc2l6ZW9mKHNyYzEpICogOCAtIDEpKSkgeyBcCisgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgIGRlc3QgPSAwOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBpbnQ4X3QgdG1wOyBcCisgICAgICAgIHRtcCA9IChpbnQ4X3Qpc3JjMjsgXAorICAgICAgICBpZiAodG1wID49IChzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICAgICAgaWYgKHNyYzEpIHsgXAorICAgICAgICAgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgICAgICAgICAgZGVzdCA9IH4wOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgZGVzdCA9IDA7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IGVsc2UgaWYgKHRtcCA8PSAtKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgICAgICBkZXN0ID0gMDsgXAorICAgICAgICB9IGVsc2UgaWYgKHRtcCA8IDApIHsgXAorICAgICAgICAgICAgZGVzdCA9IHNyYzEgPj4gLXRtcDsgXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBkZXN0ID0gc3JjMSA8PCB0bXA7IFwKKyAgICAgICAgICAgIGlmICgoZGVzdCA+PiB0bXApICE9IHNyYzEpIHsgXAorICAgICAgICAgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgICAgICAgICAgZGVzdCA9IH4wOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfX0gd2hpbGUgKDApCitORU9OX1ZPUF9FTlYocXNobHVfczgsIG5lb25fdTgsIDQpCitORU9OX1ZPUF9FTlYocXNobHVfczE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FzaGx1X3MzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgdmFsb3AsIHVpbnQzMl90IHNoaWZ0b3ApCit7CisgICAgaWYgKChpbnQzMl90KXZhbG9wIDwgMCkgeworICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBoZWxwZXJfbmVvbl9xc2hsX3UzMihlbnYsIHZhbG9wLCBzaGlmdG9wKTsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fcXNobHVfczY0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB2YWxvcCwgdWludDY0X3Qgc2hpZnRvcCkKK3sKKyAgICBpZiAoKGludDY0X3QpdmFsb3AgPCAwKSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGhlbHBlcl9uZW9uX3FzaGxfdTY0KGVudiwgdmFsb3AsIHNoaWZ0b3ApOworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZG8geyBcCisgICAgaW50OF90IHRtcDsgXAorICAgIHRtcCA9IChpbnQ4X3Qpc3JjMjsgXAorICAgIGlmICh0bXAgPj0gKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgIGlmIChzcmMxKSB7IFwKKyAgICAgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgICAgICBkZXN0ID0gfjA7IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgZGVzdCA9IDA7IFwKKyAgICAgICAgfSBcCisgICAgfSBlbHNlIGlmICh0bXAgPCAtKHNzaXplX3Qpc2l6ZW9mKHNyYzEpICogOCkgeyBcCisgICAgICAgIGRlc3QgPSAwOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPT0gLShzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICBkZXN0ID0gc3JjMSA+PiAoc2l6ZW9mKHNyYzEpICogOCAtIDEpOyBcCisgICAgfSBlbHNlIGlmICh0bXAgPCAwKSB7IFwKKyAgICAgICAgZGVzdCA9IChzcmMxICsgKDEgPDwgKC0xIC0gdG1wKSkpID4+IC10bXA7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGRlc3QgPSBzcmMxIDw8IHRtcDsgXAorICAgICAgICBpZiAoKGRlc3QgPj4gdG1wKSAhPSBzcmMxKSB7IFwKKyAgICAgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgICAgICBkZXN0ID0gfjA7IFwKKyAgICAgICAgfSBcCisgICAgfX0gd2hpbGUgKDApCitORU9OX1ZPUF9FTlYocXJzaGxfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUF9FTlYocXJzaGxfdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKKy8qIFRoZSBhZGRpdGlvbiBvZiB0aGUgcm91bmRpbmcgY29uc3RhbnQgbWF5IG92ZXJmbG93LCBzbyB3ZSB1c2UgYW4KKyAqIGludGVybWVkaWF0ZSA2NCBiaXQgYWNjdW11bGF0b3IuICAqLwordWludDMyX3QgSEVMUEVSKG5lb25fcXJzaGxfdTMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwsIHVpbnQzMl90IHNoaWZ0b3ApCit7CisgICAgdWludDMyX3QgZGVzdDsKKyAgICBpbnQ4X3Qgc2hpZnQgPSAoaW50OF90KXNoaWZ0b3A7CisgICAgaWYgKHNoaWZ0ID49IDMyKSB7CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIFNFVF9RQygpOworICAgICAgICAgICAgZGVzdCA9IH4wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVzdCA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgLTMyKSB7CisgICAgICAgIGRlc3QgPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPT0gLTMyKSB7CisgICAgICAgIGRlc3QgPSB2YWwgPj4gMzE7CisgICAgfSBlbHNlIGlmIChzaGlmdCA8IDApIHsKKyAgICAgICAgdWludDY0X3QgYmlnX2Rlc3QgPSAoKHVpbnQ2NF90KXZhbCArICgxIDw8ICgtMSAtIHNoaWZ0KSkpOworICAgICAgICBkZXN0ID0gYmlnX2Rlc3QgPj4gLXNoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3QgPSB2YWwgPDwgc2hpZnQ7CisgICAgICAgIGlmICgoZGVzdCA+PiBzaGlmdCkgIT0gdmFsKSB7CisgICAgICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgICAgIGRlc3QgPSB+MDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzdDsKK30KKworLyogSGFuZGxpbmcgYWRkaXRpb24gb3ZlcmZsb3cgd2l0aCA2NCBiaXQgaW5wdXQgdmFsdWVzIGlzIG1vcmUKKyAqIHRyaWNreSB0aGFuIHdpdGggMzIgYml0IHZhbHVlcy4gICovCit1aW50NjRfdCBIRUxQRVIobmVvbl9xcnNobF91NjQpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHZhbCwgdWludDY0X3Qgc2hpZnRvcCkKK3sKKyAgICBpbnQ4X3Qgc2hpZnQgPSAoaW50OF90KXNoaWZ0b3A7CisgICAgaWYgKHNoaWZ0ID49IDY0KSB7CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIFNFVF9RQygpOworICAgICAgICAgICAgdmFsID0gfjA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgLTY0KSB7CisgICAgICAgIHZhbCA9IDA7CisgICAgfSBlbHNlIGlmIChzaGlmdCA9PSAtNjQpIHsKKyAgICAgICAgdmFsID4+PSA2MzsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgeworICAgICAgICB2YWwgPj49ICgtc2hpZnQgLSAxKTsKKyAgICAgICAgaWYgKHZhbCA9PSBVSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIGl0IG1lYW5zIHRoYXQgdGhlIHJvdW5kaW5nIGNvbnN0YW50IGlzIDEsCisgICAgICAgICAgICAgKiBhbmQgdGhlIGFkZGl0aW9uIHdvdWxkIG92ZXJmbG93LiBSZXR1cm4gdGhlIGFjdHVhbAorICAgICAgICAgICAgICogcmVzdWx0IGRpcmVjdGx5LiAgKi8KKyAgICAgICAgICAgIHZhbCA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCsrOworICAgICAgICAgICAgdmFsID4+PSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsgXAorICAgICAgICB1aW50NjRfdCB0bXAgPSB2YWw7CisgICAgICAgIHZhbCA8PD0gc2hpZnQ7CisgICAgICAgIGlmICgodmFsID4+IHNoaWZ0KSAhPSB0bXApIHsKKyAgICAgICAgICAgIFNFVF9RQygpOworICAgICAgICAgICAgdmFsID0gfjA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRvIHsgXAorICAgIGludDhfdCB0bXA7IFwKKyAgICB0bXAgPSAoaW50OF90KXNyYzI7IFwKKyAgICBpZiAodG1wID49IChzc2l6ZV90KXNpemVvZihzcmMxKSAqIDgpIHsgXAorICAgICAgICBpZiAoc3JjMSkgeyBcCisgICAgICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICAgICAgZGVzdCA9ICgxIDw8IChzaXplb2Yoc3JjMSkgKiA4IC0gMSkpOyBcCisgICAgICAgICAgICBpZiAoc3JjMSA+IDApIHsgXAorICAgICAgICAgICAgICAgIGRlc3QtLTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIGRlc3QgPSAwOyBcCisgICAgICAgIH0gXAorICAgIH0gZWxzZSBpZiAodG1wIDw9IC0oc3NpemVfdClzaXplb2Yoc3JjMSkgKiA4KSB7IFwKKyAgICAgICAgZGVzdCA9IDA7IFwKKyAgICB9IGVsc2UgaWYgKHRtcCA8IDApIHsgXAorICAgICAgICBkZXN0ID0gKHNyYzEgKyAoMSA8PCAoLTEgLSB0bXApKSkgPj4gLXRtcDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZGVzdCA9IHNyYzEgPDwgdG1wOyBcCisgICAgICAgIGlmICgoZGVzdCA+PiB0bXApICE9IHNyYzEpIHsgXAorICAgICAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgICAgIGRlc3QgPSAodWludDMyX3QpKDEgPDwgKHNpemVvZihzcmMxKSAqIDggLSAxKSk7IFwKKyAgICAgICAgICAgIGlmIChzcmMxID4gMCkgeyBcCisgICAgICAgICAgICAgICAgZGVzdC0tOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfX0gd2hpbGUgKDApCitORU9OX1ZPUF9FTlYocXJzaGxfczgsIG5lb25fczgsIDQpCitORU9OX1ZPUF9FTlYocXJzaGxfczE2LCBuZW9uX3MxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKKy8qIFRoZSBhZGRpdGlvbiBvZiB0aGUgcm91bmRpbmcgY29uc3RhbnQgbWF5IG92ZXJmbG93LCBzbyB3ZSB1c2UgYW4KKyAqIGludGVybWVkaWF0ZSA2NCBiaXQgYWNjdW11bGF0b3IuICAqLwordWludDMyX3QgSEVMUEVSKG5lb25fcXJzaGxfczMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB2YWxvcCwgdWludDMyX3Qgc2hpZnRvcCkKK3sKKyAgICBpbnQzMl90IGRlc3Q7CisgICAgaW50MzJfdCB2YWwgPSAoaW50MzJfdCl2YWxvcDsKKyAgICBpbnQ4X3Qgc2hpZnQgPSAoaW50OF90KXNoaWZ0b3A7CisgICAgaWYgKHNoaWZ0ID49IDMyKSB7CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIFNFVF9RQygpOworICAgICAgICAgICAgZGVzdCA9ICh2YWwgPj4gMzEpIF4gflNJR05CSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2hpZnQgPD0gLTMyKSB7CisgICAgICAgIGRlc3QgPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgIGludDY0X3QgYmlnX2Rlc3QgPSAoKGludDY0X3QpdmFsICsgKDEgPDwgKC0xIC0gc2hpZnQpKSk7CisgICAgICAgIGRlc3QgPSBiaWdfZGVzdCA+PiAtc2hpZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzdCA9IHZhbCA8PCBzaGlmdDsKKyAgICAgICAgaWYgKChkZXN0ID4+IHNoaWZ0KSAhPSB2YWwpIHsKKyAgICAgICAgICAgIFNFVF9RQygpOworICAgICAgICAgICAgZGVzdCA9ICh2YWwgPj4gMzEpIF4gflNJR05CSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qIEhhbmRsaW5nIGFkZGl0aW9uIG92ZXJmbG93IHdpdGggNjQgYml0IGlucHV0IHZhbHVlcyBpcyBtb3JlCisgKiB0cmlja3kgdGhhbiB3aXRoIDMyIGJpdCB2YWx1ZXMuICAqLwordWludDY0X3QgSEVMUEVSKG5lb25fcXJzaGxfczY0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB2YWxvcCwgdWludDY0X3Qgc2hpZnRvcCkKK3sKKyAgICBpbnQ4X3Qgc2hpZnQgPSAodWludDhfdClzaGlmdG9wOworICAgIGludDY0X3QgdmFsID0gdmFsb3A7CisKKyAgICBpZiAoc2hpZnQgPj0gNjQpIHsKKyAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgU0VUX1FDKCk7CisgICAgICAgICAgICB2YWwgPSAodmFsID4+IDYzKSBeIH5TSUdOQklUNjQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDw9IC02NCkgeworICAgICAgICB2YWwgPSAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgIHZhbCA+Pj0gKC1zaGlmdCAtIDEpOworICAgICAgICBpZiAodmFsID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgLyogSW4gdGhpcyBjYXNlLCBpdCBtZWFucyB0aGF0IHRoZSByb3VuZGluZyBjb25zdGFudCBpcyAxLAorICAgICAgICAgICAgICogYW5kIHRoZSBhZGRpdGlvbiB3b3VsZCBvdmVyZmxvdy4gUmV0dXJuIHRoZSBhY3R1YWwKKyAgICAgICAgICAgICAqIHJlc3VsdCBkaXJlY3RseS4gICovCisgICAgICAgICAgICB2YWwgPSAweDQwMDAwMDAwMDAwMDAwMDBVTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwrKzsKKyAgICAgICAgICAgIHZhbCA+Pj0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgdG1wID0gdmFsOworICAgICAgICB2YWwgPDw9IHNoaWZ0OworICAgICAgICBpZiAoKHZhbCA+PiBzaGlmdCkgIT0gdG1wKSB7CisgICAgICAgICAgICBTRVRfUUMoKTsKKyAgICAgICAgICAgIHZhbCA9ICh0bXAgPj4gNjMpIF4gflNJR05CSVQ2NDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9hZGRfdTgpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDMyX3QgbWFzazsKKyAgICBtYXNrID0gKGEgXiBiKSAmIDB4ODA4MDgwODB1OworICAgIGEgJj0gfjB4ODA4MDgwODB1OworICAgIGIgJj0gfjB4ODA4MDgwODB1OworICAgIHJldHVybiAoYSArIGIpIF4gbWFzazsKK30KKwordWludDMyX3QgSEVMUEVSKG5lb25fYWRkX3UxNikodWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCBtYXNrOworICAgIG1hc2sgPSAoYSBeIGIpICYgMHg4MDAwODAwMHU7CisgICAgYSAmPSB+MHg4MDAwODAwMHU7CisgICAgYiAmPSB+MHg4MDAwODAwMHU7CisgICAgcmV0dXJuIChhICsgYikgXiBtYXNrOworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IHNyYzEgKyBzcmMyCitORU9OX1BPUChwYWRkX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9QT1AocGFkZF91MTYsIG5lb25fdTE2LCAyKQorI3VuZGVmIE5FT05fRk4KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIGRlc3QgPSBzcmMxIC0gc3JjMgorTkVPTl9WT1Aoc3ViX3U4LCBuZW9uX3U4LCA0KQorTkVPTl9WT1Aoc3ViX3UxNiwgbmVvbl91MTYsIDIpCisjdW5kZWYgTkVPTl9GTgorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IHNyYzEgKiBzcmMyCitORU9OX1ZPUChtdWxfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChtdWxfdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKKy8qIFBvbHlub21pYWwgbXVsdGlwbGljYXRpb24gaXMgbGlrZSBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uIGV4Y2VwdCB0aGUKKyAgIHBhcnRpYWwgcHJvZHVjdHMgYXJlIFhPUmVkLCBub3QgYWRkZWQuICAqLwordWludDMyX3QgSEVMUEVSKG5lb25fbXVsX3A4KSh1aW50MzJfdCBvcDEsIHVpbnQzMl90IG9wMikKK3sKKyAgICB1aW50MzJfdCBtYXNrOworICAgIHVpbnQzMl90IHJlc3VsdDsKKyAgICByZXN1bHQgPSAwOworICAgIHdoaWxlIChvcDEpIHsKKyAgICAgICAgbWFzayA9IDA7CisgICAgICAgIGlmIChvcDEgJiAxKQorICAgICAgICAgICAgbWFzayB8PSAweGZmOworICAgICAgICBpZiAob3AxICYgKDEgPDwgOCkpCisgICAgICAgICAgICBtYXNrIHw9ICgweGZmIDw8IDgpOworICAgICAgICBpZiAob3AxICYgKDEgPDwgMTYpKQorICAgICAgICAgICAgbWFzayB8PSAoMHhmZiA8PCAxNik7CisgICAgICAgIGlmIChvcDEgJiAoMSA8PCAyNCkpCisgICAgICAgICAgICBtYXNrIHw9ICgweGZmIDw8IDI0KTsKKyAgICAgICAgcmVzdWx0IF49IG9wMiAmIG1hc2s7CisgICAgICAgIG9wMSA9IChvcDEgPj4gMSkgJiAweDdmN2Y3ZjdmOworICAgICAgICBvcDIgPSAob3AyIDw8IDEpICYgMHhmZWZlZmVmZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fbXVsbF9wOCkodWludDMyX3Qgb3AxLCB1aW50MzJfdCBvcDIpCit7CisgICAgdWludDY0X3QgcmVzdWx0ID0gMDsKKyAgICB1aW50NjRfdCBtYXNrOworICAgIHVpbnQ2NF90IG9wMmV4ID0gb3AyOworICAgIG9wMmV4ID0gKG9wMmV4ICYgMHhmZikgfAorICAgICAgICAoKG9wMmV4ICYgMHhmZjAwKSA8PCA4KSB8CisgICAgICAgICgob3AyZXggJiAweGZmMDAwMCkgPDwgMTYpIHwKKyAgICAgICAgKChvcDJleCAmIDB4ZmYwMDAwMDApIDw8IDI0KTsKKyAgICB3aGlsZSAob3AxKSB7CisgICAgICAgIG1hc2sgPSAwOworICAgICAgICBpZiAob3AxICYgMSkgeworICAgICAgICAgICAgbWFzayB8PSAweGZmZmY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wMSAmICgxIDw8IDgpKSB7CisgICAgICAgICAgICBtYXNrIHw9ICgweGZmZmZVIDw8IDE2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3AxICYgKDEgPDwgMTYpKSB7CisgICAgICAgICAgICBtYXNrIHw9ICgweGZmZmZVTEwgPDwgMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChvcDEgJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgICAgIG1hc2sgfD0gKDB4ZmZmZlVMTCA8PCA0OCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0IF49IG9wMmV4ICYgbWFzazsKKyAgICAgICAgb3AxID0gKG9wMSA+PiAxKSAmIDB4N2Y3ZjdmN2Y7CisgICAgICAgIG9wMmV4IDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IChzcmMxICYgc3JjMikgPyAtMSA6IDAKK05FT05fVk9QKHRzdF91OCwgbmVvbl91OCwgNCkKK05FT05fVk9QKHRzdF91MTYsIG5lb25fdTE2LCAyKQorTkVPTl9WT1AodHN0X3UzMiwgbmVvbl91MzIsIDEpCisjdW5kZWYgTkVPTl9GTgorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgZGVzdCA9IChzcmMxID09IHNyYzIpID8gLTEgOiAwCitORU9OX1ZPUChjZXFfdTgsIG5lb25fdTgsIDQpCitORU9OX1ZPUChjZXFfdTE2LCBuZW9uX3UxNiwgMikKK05FT05fVk9QKGNlcV91MzIsIG5lb25fdTMyLCAxKQorI3VuZGVmIE5FT05fRk4KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYywgZHVtbXkpIGRlc3QgPSAoc3JjIDwgMCkgPyAtc3JjIDogc3JjCitORU9OX1ZPUDEoYWJzX3M4LCBuZW9uX3M4LCA0KQorTkVPTl9WT1AxKGFic19zMTYsIG5lb25fczE2LCAyKQorI3VuZGVmIE5FT05fRk4KKworLyogQ291bnQgTGVhZGluZyBTaWduL1plcm8gQml0cy4gICovCitzdGF0aWMgaW5saW5lIGludCBkb19jbHo4KHVpbnQ4X3QgeCkKK3sKKyAgICBpbnQgbjsKKyAgICBmb3IgKG4gPSA4OyB4OyBuLS0pCisgICAgICAgIHggPj49IDE7CisgICAgcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX2NsejE2KHVpbnQxNl90IHgpCit7CisgICAgaW50IG47CisgICAgZm9yIChuID0gMTY7IHg7IG4tLSkKKyAgICAgICAgeCA+Pj0gMTsKKyAgICByZXR1cm4gbjsKK30KKworI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYywgZHVtbXkpIGRlc3QgPSBkb19jbHo4KHNyYykKK05FT05fVk9QMShjbHpfdTgsIG5lb25fdTgsIDQpCisjdW5kZWYgTkVPTl9GTgorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjLCBkdW1teSkgZGVzdCA9IGRvX2NsejE2KHNyYykKK05FT05fVk9QMShjbHpfdTE2LCBuZW9uX3UxNiwgMikKKyN1bmRlZiBORU9OX0ZOCisKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMsIGR1bW15KSBkZXN0ID0gZG9fY2x6OCgoc3JjIDwgMCkgPyB+c3JjIDogc3JjKSAtIDEKK05FT05fVk9QMShjbHNfczgsIG5lb25fczgsIDQpCisjdW5kZWYgTkVPTl9GTgorCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjLCBkdW1teSkgZGVzdCA9IGRvX2NsejE2KChzcmMgPCAwKSA/IH5zcmMgOiBzcmMpIC0gMQorTkVPTl9WT1AxKGNsc19zMTYsIG5lb25fczE2LCAyKQorI3VuZGVmIE5FT05fRk4KKwordWludDMyX3QgSEVMUEVSKG5lb25fY2xzX3MzMikodWludDMyX3QgeCkKK3sKKyAgICBpbnQgY291bnQ7CisgICAgaWYgKChpbnQzMl90KXggPCAwKQorICAgICAgICB4ID0gfng7CisgICAgZm9yIChjb3VudCA9IDMyOyB4OyBjb3VudC0tKQorICAgICAgICB4ID0geCA+PiAxOworICAgIHJldHVybiBjb3VudCAtIDE7Cit9CisKKy8qIEJpdCBjb3VudC4gICovCit1aW50MzJfdCBIRUxQRVIobmVvbl9jbnRfdTgpKHVpbnQzMl90IHgpCit7CisgICAgeCA9ICh4ICYgMHg1NTU1NTU1NSkgKyAoKHggPj4gIDEpICYgMHg1NTU1NTU1NSk7CisgICAgeCA9ICh4ICYgMHgzMzMzMzMzMykgKyAoKHggPj4gIDIpICYgMHgzMzMzMzMzMyk7CisgICAgeCA9ICh4ICYgMHgwZjBmMGYwZikgKyAoKHggPj4gIDQpICYgMHgwZjBmMGYwZik7CisgICAgcmV0dXJuIHg7Cit9CisKKyNkZWZpbmUgTkVPTl9RRE1VTEgxNihkZXN0LCBzcmMxLCBzcmMyLCByb3VuZCkgZG8geyBcCisgICAgdWludDMyX3QgdG1wID0gKGludDMyX3QpKGludDE2X3QpIHNyYzEgKiAoaW50MTZfdCkgc3JjMjsgXAorICAgIGlmICgodG1wIF4gKHRtcCA8PCAxKSkgJiBTSUdOQklUKSB7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgdG1wID0gKHRtcCA+PiAzMSkgXiB+U0lHTkJJVDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgdG1wIDw8PSAxOyBcCisgICAgfSBcCisgICAgaWYgKHJvdW5kKSB7IFwKKyAgICAgICAgaW50MzJfdCBvbGQgPSB0bXA7IFwKKyAgICAgICAgdG1wICs9IDEgPDwgMTU7IFwKKyAgICAgICAgaWYgKChpbnQzMl90KXRtcCA8IG9sZCkgeyBcCisgICAgICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICAgICAgdG1wID0gU0lHTkJJVCAtIDE7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgZGVzdCA9IHRtcCA+PiAxNjsgXAorICAgIH0gd2hpbGUoMCkKKyNkZWZpbmUgTkVPTl9GTihkZXN0LCBzcmMxLCBzcmMyKSBORU9OX1FETVVMSDE2KGRlc3QsIHNyYzEsIHNyYzIsIDApCitORU9OX1ZPUF9FTlYocWRtdWxoX3MxNiwgbmVvbl9zMTYsIDIpCisjdW5kZWYgTkVPTl9GTgorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fUURNVUxIMTYoZGVzdCwgc3JjMSwgc3JjMiwgMSkKK05FT05fVk9QX0VOVihxcmRtdWxoX3MxNiwgbmVvbl9zMTYsIDIpCisjdW5kZWYgTkVPTl9GTgorI3VuZGVmIE5FT05fUURNVUxIMTYKKworI2RlZmluZSBORU9OX1FETVVMSDMyKGRlc3QsIHNyYzEsIHNyYzIsIHJvdW5kKSBkbyB7IFwKKyAgICB1aW50NjRfdCB0bXAgPSAoaW50NjRfdCkoaW50MzJfdCkgc3JjMSAqIChpbnQzMl90KSBzcmMyOyBcCisgICAgaWYgKCh0bXAgXiAodG1wIDw8IDEpKSAmIFNJR05CSVQ2NCkgeyBcCisgICAgICAgIFNFVF9RQygpOyBcCisgICAgICAgIHRtcCA9ICh0bXAgPj4gNjMpIF4gflNJR05CSVQ2NDsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgdG1wIDw8PSAxOyBcCisgICAgfSBcCisgICAgaWYgKHJvdW5kKSB7IFwKKyAgICAgICAgaW50NjRfdCBvbGQgPSB0bXA7IFwKKyAgICAgICAgdG1wICs9IChpbnQ2NF90KTEgPDwgMzE7IFwKKyAgICAgICAgaWYgKChpbnQ2NF90KXRtcCA8IG9sZCkgeyBcCisgICAgICAgICAgICBTRVRfUUMoKTsgXAorICAgICAgICAgICAgdG1wID0gU0lHTkJJVDY0IC0gMTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBkZXN0ID0gdG1wID4+IDMyOyBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBORU9OX0ZOKGRlc3QsIHNyYzEsIHNyYzIpIE5FT05fUURNVUxIMzIoZGVzdCwgc3JjMSwgc3JjMiwgMCkKK05FT05fVk9QX0VOVihxZG11bGhfczMyLCBuZW9uX3MzMiwgMSkKKyN1bmRlZiBORU9OX0ZOCisjZGVmaW5lIE5FT05fRk4oZGVzdCwgc3JjMSwgc3JjMikgTkVPTl9RRE1VTEgzMihkZXN0LCBzcmMxLCBzcmMyLCAxKQorTkVPTl9WT1BfRU5WKHFyZG11bGhfczMyLCBuZW9uX3MzMiwgMSkKKyN1bmRlZiBORU9OX0ZOCisjdW5kZWYgTkVPTl9RRE1VTEgzMgorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfdTgpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuICh4ICYgMHhmZnUpIHwgKCh4ID4+IDgpICYgMHhmZjAwdSkgfCAoKHggPj4gMTYpICYgMHhmZjAwMDB1KQorICAgICAgICAgICB8ICgoeCA+PiAyNCkgJiAweGZmMDAwMDAwdSk7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX25hcnJvd191MTYpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuICh4ICYgMHhmZmZmdSkgfCAoKHggPj4gMTYpICYgMHhmZmZmMDAwMHUpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfaGlnaF91OCkodWludDY0X3QgeCkKK3sKKyAgICByZXR1cm4gKCh4ID4+IDgpICYgMHhmZikgfCAoKHggPj4gMTYpICYgMHhmZjAwKQorICAgICAgICAgICAgfCAoKHggPj4gMjQpICYgMHhmZjAwMDApIHwgKCh4ID4+IDMyKSAmIDB4ZmYwMDAwMDApOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfaGlnaF91MTYpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuICgoeCA+PiAxNikgJiAweGZmZmYpIHwgKCh4ID4+IDMyKSAmIDB4ZmZmZjAwMDApOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfcm91bmRfaGlnaF91OCkodWludDY0X3QgeCkKK3sKKyAgICB4ICY9IDB4ZmY4MGZmODBmZjgwZmY4MHVsbDsKKyAgICB4ICs9IDB4MDA4MDAwODAwMDgwMDA4MHVsbDsKKyAgICByZXR1cm4gKCh4ID4+IDgpICYgMHhmZikgfCAoKHggPj4gMTYpICYgMHhmZjAwKQorICAgICAgICAgICAgfCAoKHggPj4gMjQpICYgMHhmZjAwMDApIHwgKCh4ID4+IDMyKSAmIDB4ZmYwMDAwMDApOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfcm91bmRfaGlnaF91MTYpKHVpbnQ2NF90IHgpCit7CisgICAgeCAmPSAweGZmZmY4MDAwZmZmZjgwMDB1bGw7CisgICAgeCArPSAweDAwMDA4MDAwMDAwMDgwMDB1bGw7CisgICAgcmV0dXJuICgoeCA+PiAxNikgJiAweGZmZmYpIHwgKCh4ID4+IDMyKSAmIDB4ZmZmZjAwMDApOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl91bmFycm93X3NhdDgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgpCit7CisgICAgdWludDE2X3QgczsKKyAgICB1aW50OF90IGQ7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyNkZWZpbmUgU0FUOChuKSBcCisgICAgcyA9IHggPj4gbjsgXAorICAgIGlmIChzICYgMHg4MDAwKSB7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGlmIChzID4gMHhmZikgeyBcCisgICAgICAgICAgICBkID0gMHhmZjsgXAorICAgICAgICAgICAgU0VUX1FDKCk7IFwKKyAgICAgICAgfSBlbHNlICB7IFwKKyAgICAgICAgICAgIGQgPSBzOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXMgfD0gKHVpbnQzMl90KWQgPDwgKG4gLyAyKTsgXAorICAgIH0KKworICAgIFNBVDgoMCk7CisgICAgU0FUOCgxNik7CisgICAgU0FUOCgzMik7CisgICAgU0FUOCg0OCk7CisjdW5kZWYgU0FUOAorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX25hcnJvd19zYXRfdTgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgpCit7CisgICAgdWludDE2X3QgczsKKyAgICB1aW50OF90IGQ7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyNkZWZpbmUgU0FUOChuKSBcCisgICAgcyA9IHggPj4gbjsgXAorICAgIGlmIChzID4gMHhmZikgeyBcCisgICAgICAgIGQgPSAweGZmOyBcCisgICAgICAgIFNFVF9RQygpOyBcCisgICAgfSBlbHNlICB7IFwKKyAgICAgICAgZCA9IHM7IFwKKyAgICB9IFwKKyAgICByZXMgfD0gKHVpbnQzMl90KWQgPDwgKG4gLyAyKTsKKworICAgIFNBVDgoMCk7CisgICAgU0FUOCgxNik7CisgICAgU0FUOCgzMik7CisgICAgU0FUOCg0OCk7CisjdW5kZWYgU0FUOAorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX25hcnJvd19zYXRfczgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgpCit7CisgICAgaW50MTZfdCBzOworICAgIHVpbnQ4X3QgZDsKKyAgICB1aW50MzJfdCByZXMgPSAwOworI2RlZmluZSBTQVQ4KG4pIFwKKyAgICBzID0geCA+PiBuOyBcCisgICAgaWYgKHMgIT0gKGludDhfdClzKSB7IFwKKyAgICAgICAgZCA9IChzID4+IDE1KSBeIDB4N2Y7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICB9IGVsc2UgIHsgXAorICAgICAgICBkID0gczsgXAorICAgIH0gXAorICAgIHJlcyB8PSAodWludDMyX3QpZCA8PCAobiAvIDIpOworCisgICAgU0FUOCgwKTsKKyAgICBTQVQ4KDE2KTsKKyAgICBTQVQ4KDMyKTsKKyAgICBTQVQ4KDQ4KTsKKyN1bmRlZiBTQVQ4CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgSEVMUEVSKG5lb25fdW5hcnJvd19zYXQxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCkKK3sKKyAgICB1aW50MzJfdCBoaWdoOworICAgIHVpbnQzMl90IGxvdzsKKyAgICBsb3cgPSB4OworICAgIGlmIChsb3cgJiAweDgwMDAwMDAwKSB7CisgICAgICAgIGxvdyA9IDA7CisgICAgICAgIFNFVF9RQygpOworICAgIH0gZWxzZSBpZiAobG93ID4gMHhmZmZmKSB7CisgICAgICAgIGxvdyA9IDB4ZmZmZjsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgfQorICAgIGhpZ2ggPSB4ID4+IDMyOworICAgIGlmIChoaWdoICYgMHg4MDAwMDAwMCkgeworICAgICAgICBoaWdoID0gMDsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgfSBlbHNlIGlmIChoaWdoID4gMHhmZmZmKSB7CisgICAgICAgIGhpZ2ggPSAweGZmZmY7CisgICAgICAgIFNFVF9RQygpOworICAgIH0KKyAgICByZXR1cm4gbG93IHwgKGhpZ2ggPDwgMTYpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfc2F0X3UxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCkKK3sKKyAgICB1aW50MzJfdCBoaWdoOworICAgIHVpbnQzMl90IGxvdzsKKyAgICBsb3cgPSB4OworICAgIGlmIChsb3cgPiAweGZmZmYpIHsKKyAgICAgICAgbG93ID0gMHhmZmZmOworICAgICAgICBTRVRfUUMoKTsKKyAgICB9CisgICAgaGlnaCA9IHggPj4gMzI7CisgICAgaWYgKGhpZ2ggPiAweGZmZmYpIHsKKyAgICAgICAgaGlnaCA9IDB4ZmZmZjsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgfQorICAgIHJldHVybiBsb3cgfCAoaGlnaCA8PCAxNik7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX25hcnJvd19zYXRfczE2KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCB4KQoreworICAgIGludDMyX3QgbG93OworICAgIGludDMyX3QgaGlnaDsKKyAgICBsb3cgPSB4OworICAgIGlmIChsb3cgIT0gKGludDE2X3QpbG93KSB7CisgICAgICAgIGxvdyA9IChsb3cgPj4gMzEpIF4gMHg3ZmZmOworICAgICAgICBTRVRfUUMoKTsKKyAgICB9CisgICAgaGlnaCA9IHggPj4gMzI7CisgICAgaWYgKGhpZ2ggIT0gKGludDE2X3QpaGlnaCkgeworICAgICAgICBoaWdoID0gKGhpZ2ggPj4gMzEpIF4gMHg3ZmZmOworICAgICAgICBTRVRfUUMoKTsKKyAgICB9CisgICAgcmV0dXJuICh1aW50MTZfdClsb3cgfCAoaGlnaCA8PCAxNik7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3VuYXJyb3dfc2F0MzIpKENQVUFSTVN0YXRlICplbnYsIHVpbnQ2NF90IHgpCit7CisgICAgaWYgKHggJiAweDgwMDAwMDAwMDAwMDAwMDB1bGwpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoeCA+IDB4ZmZmZmZmZmZ1KSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXR1cm4gMHhmZmZmZmZmZnU7CisgICAgfQorICAgIHJldHVybiB4OworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfc2F0X3UzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCkKK3sKKyAgICBpZiAoeCA+IDB4ZmZmZmZmZmZ1KSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXR1cm4gMHhmZmZmZmZmZnU7CisgICAgfQorICAgIHJldHVybiB4OworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9uYXJyb3dfc2F0X3MzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgeCkKK3sKKyAgICBpZiAoKGludDY0X3QpeCAhPSAoaW50MzJfdCl4KSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXR1cm4gKChpbnQ2NF90KXggPj4gNjMpIF4gMHg3ZmZmZmZmZjsKKyAgICB9CisgICAgcmV0dXJuIHg7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3dpZGVuX3U4KSh1aW50MzJfdCB4KQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXQ7CisgICAgcmV0ID0gKHVpbnQ4X3QpeDsKKyAgICB0bXAgPSAodWludDhfdCkoeCA+PiA4KTsKKyAgICByZXQgfD0gdG1wIDw8IDE2OworICAgIHRtcCA9ICh1aW50OF90KSh4ID4+IDE2KTsKKyAgICByZXQgfD0gdG1wIDw8IDMyOworICAgIHRtcCA9ICh1aW50OF90KSh4ID4+IDI0KTsKKyAgICByZXQgfD0gdG1wIDw8IDQ4OworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3dpZGVuX3M4KSh1aW50MzJfdCB4KQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXQ7CisgICAgcmV0ID0gKHVpbnQxNl90KShpbnQ4X3QpeDsKKyAgICB0bXAgPSAodWludDE2X3QpKGludDhfdCkoeCA+PiA4KTsKKyAgICByZXQgfD0gdG1wIDw8IDE2OworICAgIHRtcCA9ICh1aW50MTZfdCkoaW50OF90KSh4ID4+IDE2KTsKKyAgICByZXQgfD0gdG1wIDw8IDMyOworICAgIHRtcCA9ICh1aW50MTZfdCkoaW50OF90KSh4ID4+IDI0KTsKKyAgICByZXQgfD0gdG1wIDw8IDQ4OworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3dpZGVuX3UxNikodWludDMyX3QgeCkKK3sKKyAgICB1aW50NjRfdCBoaWdoID0gKHVpbnQxNl90KSh4ID4+IDE2KTsKKyAgICByZXR1cm4gKCh1aW50MTZfdCl4KSB8IChoaWdoIDw8IDMyKTsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fd2lkZW5fczE2KSh1aW50MzJfdCB4KQoreworICAgIHVpbnQ2NF90IGhpZ2ggPSAoaW50MTZfdCkoeCA+PiAxNik7CisgICAgcmV0dXJuICgodWludDMyX3QpKGludDE2X3QpeCkgfCAoaGlnaCA8PCAzMik7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX2FkZGxfdTE2KSh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIHVpbnQ2NF90IG1hc2s7CisgICAgbWFzayA9IChhIF4gYikgJiAweDgwMDA4MDAwODAwMDgwMDB1bGw7CisgICAgYSAmPSB+MHg4MDAwODAwMDgwMDA4MDAwdWxsOworICAgIGIgJj0gfjB4ODAwMDgwMDA4MDAwODAwMHVsbDsKKyAgICByZXR1cm4gKGEgKyBiKSBeIG1hc2s7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX2FkZGxfdTMyKSh1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIHVpbnQ2NF90IG1hc2s7CisgICAgbWFzayA9IChhIF4gYikgJiAweDgwMDAwMDAwODAwMDAwMDB1bGw7CisgICAgYSAmPSB+MHg4MDAwMDAwMDgwMDAwMDAwdWxsOworICAgIGIgJj0gfjB4ODAwMDAwMDA4MDAwMDAwMHVsbDsKKyAgICByZXR1cm4gKGEgKyBiKSBeIG1hc2s7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3BhZGRsX3UxNikodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50NjRfdCB0bXA7CisgICAgdWludDY0X3QgdG1wMjsKKworICAgIHRtcCA9IGEgJiAweDAwMDBmZmZmMDAwMGZmZmZ1bGw7CisgICAgdG1wICs9IChhID4+IDE2KSAmIDB4MDAwMGZmZmYwMDAwZmZmZnVsbDsKKyAgICB0bXAyID0gYiAmIDB4ZmZmZjAwMDBmZmZmMDAwMHVsbDsKKyAgICB0bXAyICs9IChiIDw8IDE2KSAmIDB4ZmZmZjAwMDBmZmZmMDAwMHVsbDsKKyAgICByZXR1cm4gICAgKCB0bXAgICAgICAgICAmIDB4ZmZmZikKKyAgICAgICAgICAgIHwgKCh0bXAgID4+IDE2KSAmIDB4ZmZmZjAwMDB1bGwpCisgICAgICAgICAgICB8ICgodG1wMiA8PCAxNikgJiAweGZmZmYwMDAwMDAwMHVsbCkKKyAgICAgICAgICAgIHwgKCB0bXAyICAgICAgICAmIDB4ZmZmZjAwMDAwMDAwMDAwMHVsbCk7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX3BhZGRsX3UzMikodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50MzJfdCBsb3cgPSBhICsgKGEgPj4gMzIpOworICAgIHVpbnQzMl90IGhpZ2ggPSBiICsgKGIgPj4gMzIpOworICAgIHJldHVybiBsb3cgKyAoKHVpbnQ2NF90KWhpZ2ggPDwgMzIpOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9zdWJsX3UxNikodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50NjRfdCBtYXNrOworICAgIG1hc2sgPSAoYSBeIH5iKSAmIDB4ODAwMDgwMDA4MDAwODAwMHVsbDsKKyAgICBhIHw9IDB4ODAwMDgwMDA4MDAwODAwMHVsbDsKKyAgICBiICY9IH4weDgwMDA4MDAwODAwMDgwMDB1bGw7CisgICAgcmV0dXJuIChhIC0gYikgXiBtYXNrOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9zdWJsX3UzMikodWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50NjRfdCBtYXNrOworICAgIG1hc2sgPSAoYSBeIH5iKSAmIDB4ODAwMDAwMDA4MDAwMDAwMHVsbDsKKyAgICBhIHw9IDB4ODAwMDAwMDA4MDAwMDAwMHVsbDsKKyAgICBiICY9IH4weDgwMDAwMDAwODAwMDAwMDB1bGw7CisgICAgcmV0dXJuIChhIC0gYikgXiBtYXNrOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9hZGRsX3NhdHVyYXRlX3MzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDY0X3QgYSwgdWludDY0X3QgYikKK3sKKyAgICB1aW50MzJfdCB4LCB5OworICAgIHVpbnQzMl90IGxvdywgaGlnaDsKKworICAgIHggPSBhOworICAgIHkgPSBiOworICAgIGxvdyA9IHggKyB5OworICAgIGlmICgoKGxvdyBeIHgpICYgU0lHTkJJVCkgJiYgISgoeCBeIHkpICYgU0lHTkJJVCkpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIGxvdyA9ICgoaW50MzJfdCl4ID4+IDMxKSBeIH5TSUdOQklUOworICAgIH0KKyAgICB4ID0gYSA+PiAzMjsKKyAgICB5ID0gYiA+PiAzMjsKKyAgICBoaWdoID0geCArIHk7CisgICAgaWYgKCgoaGlnaCBeIHgpICYgU0lHTkJJVCkgJiYgISgoeCBeIHkpICYgU0lHTkJJVCkpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIGhpZ2ggPSAoKGludDMyX3QpeCA+PiAzMSkgXiB+U0lHTkJJVDsKKyAgICB9CisgICAgcmV0dXJuIGxvdyB8ICgodWludDY0X3QpaGlnaCA8PCAzMik7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX2FkZGxfc2F0dXJhdGVfczY0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIHVpbnQ2NF90IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IGEgKyBiOworICAgIGlmICgoKHJlc3VsdCBeIGEpICYgU0lHTkJJVDY0KSAmJiAhKChhIF4gYikgJiBTSUdOQklUNjQpKSB7CisgICAgICAgIFNFVF9RQygpOworICAgICAgICByZXN1bHQgPSAoKGludDY0X3QpYSA+PiA2MykgXiB+U0lHTkJJVDY0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBXZSBoYXZlIHRvIGRvIHRoZSBhcml0aG1ldGljIGluIGEgbGFyZ2VyIHR5cGUgdGhhbgorICogdGhlIGlucHV0IHR5cGUsIGJlY2F1c2UgZm9yIGV4YW1wbGUgd2l0aCBhIHNpZ25lZCAzMiBiaXQKKyAqIG9wIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGNhbiBvdmVyZmxvdyBhIHNpZ25lZCAzMiBiaXQgdmFsdWUuCisgKi8KKyNkZWZpbmUgRE9fQUJEKGRlc3QsIHgsIHksIGludHlwZSwgYXJpdGh0eXBlKSBkbyB7ICAgICAgICAgICAgXAorICAgIGFyaXRodHlwZSB0bXBfeCA9IChpbnR5cGUpKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJpdGh0eXBlIHRtcF95ID0gKGludHlwZSkoeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZXN0ID0gKCh0bXBfeCA+IHRtcF95KSA/IHRtcF94IC0gdG1wX3kgOiB0bXBfeSAtIHRtcF94KTsgXAorICAgIH0gd2hpbGUoMCkKKwordWludDY0X3QgSEVMUEVSKG5lb25fYWJkbF91MTYpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDY0X3QgdG1wOworICAgIHVpbnQ2NF90IHJlc3VsdDsKKyAgICBET19BQkQocmVzdWx0LCBhLCBiLCB1aW50OF90LCB1aW50MzJfdCk7CisgICAgRE9fQUJEKHRtcCwgYSA+PiA4LCBiID4+IDgsIHVpbnQ4X3QsIHVpbnQzMl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDE2OworICAgIERPX0FCRCh0bXAsIGEgPj4gMTYsIGIgPj4gMTYsIHVpbnQ4X3QsIHVpbnQzMl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDMyOworICAgIERPX0FCRCh0bXAsIGEgPj4gMjQsIGIgPj4gMjQsIHVpbnQ4X3QsIHVpbnQzMl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDQ4OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX2FiZGxfczE2KSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXN1bHQ7CisgICAgRE9fQUJEKHJlc3VsdCwgYSwgYiwgaW50OF90LCBpbnQzMl90KTsKKyAgICBET19BQkQodG1wLCBhID4+IDgsIGIgPj4gOCwgaW50OF90LCBpbnQzMl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDE2OworICAgIERPX0FCRCh0bXAsIGEgPj4gMTYsIGIgPj4gMTYsIGludDhfdCwgaW50MzJfdCk7CisgICAgcmVzdWx0IHw9IHRtcCA8PCAzMjsKKyAgICBET19BQkQodG1wLCBhID4+IDI0LCBiID4+IDI0LCBpbnQ4X3QsIGludDMyX3QpOworICAgIHJlc3VsdCB8PSB0bXAgPDwgNDg7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fYWJkbF91MzIpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDY0X3QgdG1wOworICAgIHVpbnQ2NF90IHJlc3VsdDsKKyAgICBET19BQkQocmVzdWx0LCBhLCBiLCB1aW50MTZfdCwgdWludDMyX3QpOworICAgIERPX0FCRCh0bXAsIGEgPj4gMTYsIGIgPj4gMTYsIHVpbnQxNl90LCB1aW50MzJfdCk7CisgICAgcmV0dXJuIHJlc3VsdCB8ICh0bXAgPDwgMzIpOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9hYmRsX3MzMikodWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50NjRfdCB0bXA7CisgICAgdWludDY0X3QgcmVzdWx0OworICAgIERPX0FCRChyZXN1bHQsIGEsIGIsIGludDE2X3QsIGludDMyX3QpOworICAgIERPX0FCRCh0bXAsIGEgPj4gMTYsIGIgPj4gMTYsIGludDE2X3QsIGludDMyX3QpOworICAgIHJldHVybiByZXN1bHQgfCAodG1wIDw8IDMyKTsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fYWJkbF91NjQpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDY0X3QgcmVzdWx0OworICAgIERPX0FCRChyZXN1bHQsIGEsIGIsIHVpbnQzMl90LCB1aW50NjRfdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDY0X3QgSEVMUEVSKG5lb25fYWJkbF9zNjQpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDY0X3QgcmVzdWx0OworICAgIERPX0FCRChyZXN1bHQsIGEsIGIsIGludDMyX3QsIGludDY0X3QpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisjdW5kZWYgRE9fQUJECisKKy8qIFdpZGVuaW5nIG11bHRpcGx5LiBOYW1lZCB0eXBlIGlzIHRoZSBzb3VyY2UgdHlwZS4gICovCisjZGVmaW5lIERPX01VTEwoZGVzdCwgeCwgeSwgdHlwZTEsIHR5cGUyKSBkbyB7IFwKKyAgICB0eXBlMSB0bXBfeCA9IHg7IFwKKyAgICB0eXBlMSB0bXBfeSA9IHk7IFwKKyAgICBkZXN0ID0gKHR5cGUyKSgodHlwZTIpdG1wX3ggKiAodHlwZTIpdG1wX3kpOyBcCisgICAgfSB3aGlsZSgwKQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9tdWxsX3U4KSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXN1bHQ7CisKKyAgICBET19NVUxMKHJlc3VsdCwgYSwgYiwgdWludDhfdCwgdWludDE2X3QpOworICAgIERPX01VTEwodG1wLCBhID4+IDgsIGIgPj4gOCwgdWludDhfdCwgdWludDE2X3QpOworICAgIHJlc3VsdCB8PSB0bXAgPDwgMTY7CisgICAgRE9fTVVMTCh0bXAsIGEgPj4gMTYsIGIgPj4gMTYsIHVpbnQ4X3QsIHVpbnQxNl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDMyOworICAgIERPX01VTEwodG1wLCBhID4+IDI0LCBiID4+IDI0LCB1aW50OF90LCB1aW50MTZfdCk7CisgICAgcmVzdWx0IHw9IHRtcCA8PCA0ODsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9tdWxsX3M4KSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXN1bHQ7CisKKyAgICBET19NVUxMKHJlc3VsdCwgYSwgYiwgaW50OF90LCB1aW50MTZfdCk7CisgICAgRE9fTVVMTCh0bXAsIGEgPj4gOCwgYiA+PiA4LCBpbnQ4X3QsIHVpbnQxNl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDE2OworICAgIERPX01VTEwodG1wLCBhID4+IDE2LCBiID4+IDE2LCBpbnQ4X3QsIHVpbnQxNl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDMyOworICAgIERPX01VTEwodG1wLCBhID4+IDI0LCBiID4+IDI0LCBpbnQ4X3QsIHVpbnQxNl90KTsKKyAgICByZXN1bHQgfD0gdG1wIDw8IDQ4OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX211bGxfdTE2KSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXN1bHQ7CisKKyAgICBET19NVUxMKHJlc3VsdCwgYSwgYiwgdWludDE2X3QsIHVpbnQzMl90KTsKKyAgICBET19NVUxMKHRtcCwgYSA+PiAxNiwgYiA+PiAxNiwgdWludDE2X3QsIHVpbnQzMl90KTsKKyAgICByZXR1cm4gcmVzdWx0IHwgKHRtcCA8PCAzMik7Cit9CisKK3VpbnQ2NF90IEhFTFBFUihuZW9uX211bGxfczE2KSh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAgICB1aW50NjRfdCByZXN1bHQ7CisKKyAgICBET19NVUxMKHJlc3VsdCwgYSwgYiwgaW50MTZfdCwgdWludDMyX3QpOworICAgIERPX01VTEwodG1wLCBhID4+IDE2LCBiID4+IDE2LCBpbnQxNl90LCB1aW50MzJfdCk7CisgICAgcmV0dXJuIHJlc3VsdCB8ICh0bXAgPDwgMzIpOworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9uZWdsX3UxNikodWludDY0X3QgeCkKK3sKKyAgICB1aW50MTZfdCB0bXA7CisgICAgdWludDY0X3QgcmVzdWx0OworICAgIHJlc3VsdCA9ICh1aW50MTZfdCkteDsKKyAgICB0bXAgPSAtKHggPj4gMTYpOworICAgIHJlc3VsdCB8PSAodWludDY0X3QpdG1wIDw8IDE2OworICAgIHRtcCA9IC0oeCA+PiAzMik7CisgICAgcmVzdWx0IHw9ICh1aW50NjRfdCl0bXAgPDwgMzI7CisgICAgdG1wID0gLSh4ID4+IDQ4KTsKKyAgICByZXN1bHQgfD0gKHVpbnQ2NF90KXRtcCA8PCA0ODsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50NjRfdCBIRUxQRVIobmVvbl9uZWdsX3UzMikodWludDY0X3QgeCkKK3sKKyAgICB1aW50MzJfdCBsb3cgPSAteDsKKyAgICB1aW50MzJfdCBoaWdoID0gLSh4ID4+IDMyKTsKKyAgICByZXR1cm4gbG93IHwgKCh1aW50NjRfdCloaWdoIDw8IDMyKTsKK30KKworLyogRklYTUU6ICBUaGVyZSBzaG91bGQgYmUgYSBuYXRpdmUgb3AgZm9yIHRoaXMuICAqLwordWludDY0X3QgSEVMUEVSKG5lb25fbmVnbF91NjQpKHVpbnQ2NF90IHgpCit7CisgICAgcmV0dXJuIC14OworfQorCisvKiBTYXR1cmF0aW5nIHNpZ24gbWFuaXB1bGF0aW9uLiAgKi8KKy8qID8/PyBNYWtlIHRoZXNlIHVzZSBORU9OX1ZPUDEgKi8KKyNkZWZpbmUgRE9fUUFCUzgoeCkgZG8geyBcCisgICAgaWYgKHggPT0gKGludDhfdCkweDgwKSB7IFwKKyAgICAgICAgeCA9IDB4N2Y7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICB9IGVsc2UgaWYgKHggPCAwKSB7IFwKKyAgICAgICAgeCA9IC14OyBcCisgICAgfX0gd2hpbGUgKDApCit1aW50MzJfdCBIRUxQRVIobmVvbl9xYWJzX3M4KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4KQoreworICAgIG5lb25fczggdmVjOworICAgIE5FT05fVU5QQUNLKG5lb25fczgsIHZlYywgeCk7CisgICAgRE9fUUFCUzgodmVjLnYxKTsKKyAgICBET19RQUJTOCh2ZWMudjIpOworICAgIERPX1FBQlM4KHZlYy52Myk7CisgICAgRE9fUUFCUzgodmVjLnY0KTsKKyAgICBORU9OX1BBQ0sobmVvbl9zOCwgeCwgdmVjKTsKKyAgICByZXR1cm4geDsKK30KKyN1bmRlZiBET19RQUJTOAorCisjZGVmaW5lIERPX1FORUc4KHgpIGRvIHsgXAorICAgIGlmICh4ID09IChpbnQ4X3QpMHg4MCkgeyBcCisgICAgICAgIHggPSAweDdmOyBcCisgICAgICAgIFNFVF9RQygpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICB4ID0gLXg7IFwKKyAgICB9fSB3aGlsZSAoMCkKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FuZWdfczgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHgpCit7CisgICAgbmVvbl9zOCB2ZWM7CisgICAgTkVPTl9VTlBBQ0sobmVvbl9zOCwgdmVjLCB4KTsKKyAgICBET19RTkVHOCh2ZWMudjEpOworICAgIERPX1FORUc4KHZlYy52Mik7CisgICAgRE9fUU5FRzgodmVjLnYzKTsKKyAgICBET19RTkVHOCh2ZWMudjQpOworICAgIE5FT05fUEFDSyhuZW9uX3M4LCB4LCB2ZWMpOworICAgIHJldHVybiB4OworfQorI3VuZGVmIERPX1FORUc4CisKKyNkZWZpbmUgRE9fUUFCUzE2KHgpIGRvIHsgXAorICAgIGlmICh4ID09IChpbnQxNl90KTB4ODAwMCkgeyBcCisgICAgICAgIHggPSAweDdmZmY7IFwKKyAgICAgICAgU0VUX1FDKCk7IFwKKyAgICB9IGVsc2UgaWYgKHggPCAwKSB7IFwKKyAgICAgICAgeCA9IC14OyBcCisgICAgfX0gd2hpbGUgKDApCit1aW50MzJfdCBIRUxQRVIobmVvbl9xYWJzX3MxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCkKK3sKKyAgICBuZW9uX3MxNiB2ZWM7CisgICAgTkVPTl9VTlBBQ0sobmVvbl9zMTYsIHZlYywgeCk7CisgICAgRE9fUUFCUzE2KHZlYy52MSk7CisgICAgRE9fUUFCUzE2KHZlYy52Mik7CisgICAgTkVPTl9QQUNLKG5lb25fczE2LCB4LCB2ZWMpOworICAgIHJldHVybiB4OworfQorI3VuZGVmIERPX1FBQlMxNgorCisjZGVmaW5lIERPX1FORUcxNih4KSBkbyB7IFwKKyAgICBpZiAoeCA9PSAoaW50MTZfdCkweDgwMDApIHsgXAorICAgICAgICB4ID0gMHg3ZmZmOyBcCisgICAgICAgIFNFVF9RQygpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICB4ID0gLXg7IFwKKyAgICB9fSB3aGlsZSAoMCkKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FuZWdfczE2KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4KQoreworICAgIG5lb25fczE2IHZlYzsKKyAgICBORU9OX1VOUEFDSyhuZW9uX3MxNiwgdmVjLCB4KTsKKyAgICBET19RTkVHMTYodmVjLnYxKTsKKyAgICBET19RTkVHMTYodmVjLnYyKTsKKyAgICBORU9OX1BBQ0sobmVvbl9zMTYsIHgsIHZlYyk7CisgICAgcmV0dXJuIHg7Cit9CisjdW5kZWYgRE9fUU5FRzE2CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FhYnNfczMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4KQoreworICAgIGlmICh4ID09IFNJR05CSVQpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIHggPSB+U0lHTkJJVDsKKyAgICB9IGVsc2UgaWYgKChpbnQzMl90KXggPCAwKSB7CisgICAgICAgIHggPSAteDsKKyAgICB9CisgICAgcmV0dXJuIHg7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3FuZWdfczMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4KQoreworICAgIGlmICh4ID09IFNJR05CSVQpIHsKKyAgICAgICAgU0VUX1FDKCk7CisgICAgICAgIHggPSB+U0lHTkJJVDsKKyAgICB9IGVsc2UgeworICAgICAgICB4ID0gLXg7CisgICAgfQorICAgIHJldHVybiB4OworfQorCisvKiBORU9OIEZsb2F0IGhlbHBlcnMuICAqLwordWludDMyX3QgSEVMUEVSKG5lb25fbWluX2YzMikodWludDMyX3QgYSwgdWludDMyX3QgYiwgdm9pZCAqZnBzdHApCit7CisgICAgZmxvYXRfc3RhdHVzICpmcHN0ID0gZnBzdHA7CisgICAgcmV0dXJuIGZsb2F0MzJfdmFsKGZsb2F0MzJfbWluKG1ha2VfZmxvYXQzMihhKSwgbWFrZV9mbG9hdDMyKGIpLCBmcHN0KSk7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX21heF9mMzIpKHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHZvaWQgKmZwc3RwKQoreworICAgIGZsb2F0X3N0YXR1cyAqZnBzdCA9IGZwc3RwOworICAgIHJldHVybiBmbG9hdDMyX3ZhbChmbG9hdDMyX21heChtYWtlX2Zsb2F0MzIoYSksIG1ha2VfZmxvYXQzMihiKSwgZnBzdCkpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9hYmRfZjMyKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB2b2lkICpmcHN0cCkKK3sKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsKKyAgICBmbG9hdDMyIGYwID0gbWFrZV9mbG9hdDMyKGEpOworICAgIGZsb2F0MzIgZjEgPSBtYWtlX2Zsb2F0MzIoYik7CisgICAgcmV0dXJuIGZsb2F0MzJfdmFsKGZsb2F0MzJfYWJzKGZsb2F0MzJfc3ViKGYwLCBmMSwgZnBzdCkpKTsKK30KKworLyogRmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbnMgcHJvZHVjZSBhbiBpbnRlZ2VyIHJlc3VsdC4KKyAqIE5vdGUgdGhhdCBFUSBkb2Vzbid0IHNpZ25hbCBJbnZhbGlkT3AgZm9yIFFOYU5zIGJ1dCBHRSBhbmQgR1QgZG8uCisgKiBTb2Z0ZmxvYXQgcm91dGluZXMgcmV0dXJuIDAvMSwgd2hpY2ggd2UgY29udmVydCB0byB0aGUgMC8tMSBOZW9uIHJlcXVpcmVzLgorICovCit1aW50MzJfdCBIRUxQRVIobmVvbl9jZXFfZjMyKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB2b2lkICpmcHN0cCkKK3sKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsKKyAgICByZXR1cm4gLWZsb2F0MzJfZXFfcXVpZXQobWFrZV9mbG9hdDMyKGEpLCBtYWtlX2Zsb2F0MzIoYiksIGZwc3QpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9jZ2VfZjMyKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB2b2lkICpmcHN0cCkKK3sKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsKKyAgICByZXR1cm4gLWZsb2F0MzJfbGUobWFrZV9mbG9hdDMyKGIpLCBtYWtlX2Zsb2F0MzIoYSksIGZwc3QpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9jZ3RfZjMyKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB2b2lkICpmcHN0cCkKK3sKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsKKyAgICByZXR1cm4gLWZsb2F0MzJfbHQobWFrZV9mbG9hdDMyKGIpLCBtYWtlX2Zsb2F0MzIoYSksIGZwc3QpOworfQorCit1aW50MzJfdCBIRUxQRVIobmVvbl9hY2dlX2YzMikodWludDMyX3QgYSwgdWludDMyX3QgYiwgdm9pZCAqZnBzdHApCit7CisgICAgZmxvYXRfc3RhdHVzICpmcHN0ID0gZnBzdHA7CisgICAgZmxvYXQzMiBmMCA9IGZsb2F0MzJfYWJzKG1ha2VfZmxvYXQzMihhKSk7CisgICAgZmxvYXQzMiBmMSA9IGZsb2F0MzJfYWJzKG1ha2VfZmxvYXQzMihiKSk7CisgICAgcmV0dXJuIC1mbG9hdDMyX2xlKGYxLCBmMCwgZnBzdCk7Cit9CisKK3VpbnQzMl90IEhFTFBFUihuZW9uX2FjZ3RfZjMyKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB2b2lkICpmcHN0cCkKK3sKKyAgICBmbG9hdF9zdGF0dXMgKmZwc3QgPSBmcHN0cDsKKyAgICBmbG9hdDMyIGYwID0gZmxvYXQzMl9hYnMobWFrZV9mbG9hdDMyKGEpKTsKKyAgICBmbG9hdDMyIGYxID0gZmxvYXQzMl9hYnMobWFrZV9mbG9hdDMyKGIpKTsKKyAgICByZXR1cm4gLWZsb2F0MzJfbHQoZjEsIGYwLCBmcHN0KTsKK30KKworI2RlZmluZSBFTEVNKFYsIE4sIFNJWkUpICgoKFYpID4+ICgoTikgKiAoU0laRSkpKSAmICgoMXVsbCA8PCAoU0laRSkpIC0gMSkpCisKK3ZvaWQgSEVMUEVSKG5lb25fcXVuemlwOCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmQsIHVpbnQzMl90IHJtKQoreworICAgIHVpbnQ2NF90IHptMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6bTEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtICsgMV0pOworICAgIHVpbnQ2NF90IHpkMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCB6ZDEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkICsgMV0pOworICAgIHVpbnQ2NF90IGQwID0gRUxFTSh6ZDAsIDAsIDgpIHwgKEVMRU0oemQwLCAyLCA4KSA8PCA4KQorICAgICAgICB8IChFTEVNKHpkMCwgNCwgOCkgPDwgMTYpIHwgKEVMRU0oemQwLCA2LCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6ZDEsIDAsIDgpIDw8IDMyKSB8IChFTEVNKHpkMSwgMiwgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oemQxLCA0LCA4KSA8PCA0OCkgfCAoRUxFTSh6ZDEsIDYsIDgpIDw8IDU2KTsKKyAgICB1aW50NjRfdCBkMSA9IEVMRU0oem0wLCAwLCA4KSB8IChFTEVNKHptMCwgMiwgOCkgPDwgOCkKKyAgICAgICAgfCAoRUxFTSh6bTAsIDQsIDgpIDw8IDE2KSB8IChFTEVNKHptMCwgNiwgOCkgPDwgMjQpCisgICAgICAgIHwgKEVMRU0oem0xLCAwLCA4KSA8PCAzMikgfCAoRUxFTSh6bTEsIDIsIDgpIDw8IDQwKQorICAgICAgICB8IChFTEVNKHptMSwgNCwgOCkgPDwgNDgpIHwgKEVMRU0oem0xLCA2LCA4KSA8PCA1Nik7CisgICAgdWludDY0X3QgbTAgPSBFTEVNKHpkMCwgMSwgOCkgfCAoRUxFTSh6ZDAsIDMsIDgpIDw8IDgpCisgICAgICAgIHwgKEVMRU0oemQwLCA1LCA4KSA8PCAxNikgfCAoRUxFTSh6ZDAsIDcsIDgpIDw8IDI0KQorICAgICAgICB8IChFTEVNKHpkMSwgMSwgOCkgPDwgMzIpIHwgKEVMRU0oemQxLCAzLCA4KSA8PCA0MCkKKyAgICAgICAgfCAoRUxFTSh6ZDEsIDUsIDgpIDw8IDQ4KSB8IChFTEVNKHpkMSwgNywgOCkgPDwgNTYpOworICAgIHVpbnQ2NF90IG0xID0gRUxFTSh6bTAsIDEsIDgpIHwgKEVMRU0oem0wLCAzLCA4KSA8PCA4KQorICAgICAgICB8IChFTEVNKHptMCwgNSwgOCkgPDwgMTYpIHwgKEVMRU0oem0wLCA3LCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6bTEsIDEsIDgpIDw8IDMyKSB8IChFTEVNKHptMSwgMywgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oem0xLCA1LCA4KSA8PCA0OCkgfCAoRUxFTSh6bTEsIDcsIDgpIDw8IDU2KTsKKyAgICBlbnYtPnZmcC5yZWdzW3JtXSA9IG1ha2VfZmxvYXQ2NChtMCk7CisgICAgZW52LT52ZnAucmVnc1tybSArIDFdID0gbWFrZV9mbG9hdDY0KG0xKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChkMCk7CisgICAgZW52LT52ZnAucmVnc1tyZCArIDFdID0gbWFrZV9mbG9hdDY0KGQxKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl9xdW56aXAxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmQsIHVpbnQzMl90IHJtKQoreworICAgIHVpbnQ2NF90IHptMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6bTEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtICsgMV0pOworICAgIHVpbnQ2NF90IHpkMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCB6ZDEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkICsgMV0pOworICAgIHVpbnQ2NF90IGQwID0gRUxFTSh6ZDAsIDAsIDE2KSB8IChFTEVNKHpkMCwgMiwgMTYpIDw8IDE2KQorICAgICAgICB8IChFTEVNKHpkMSwgMCwgMTYpIDw8IDMyKSB8IChFTEVNKHpkMSwgMiwgMTYpIDw8IDQ4KTsKKyAgICB1aW50NjRfdCBkMSA9IEVMRU0oem0wLCAwLCAxNikgfCAoRUxFTSh6bTAsIDIsIDE2KSA8PCAxNikKKyAgICAgICAgfCAoRUxFTSh6bTEsIDAsIDE2KSA8PCAzMikgfCAoRUxFTSh6bTEsIDIsIDE2KSA8PCA0OCk7CisgICAgdWludDY0X3QgbTAgPSBFTEVNKHpkMCwgMSwgMTYpIHwgKEVMRU0oemQwLCAzLCAxNikgPDwgMTYpCisgICAgICAgIHwgKEVMRU0oemQxLCAxLCAxNikgPDwgMzIpIHwgKEVMRU0oemQxLCAzLCAxNikgPDwgNDgpOworICAgIHVpbnQ2NF90IG0xID0gRUxFTSh6bTAsIDEsIDE2KSB8IChFTEVNKHptMCwgMywgMTYpIDw8IDE2KQorICAgICAgICB8IChFTEVNKHptMSwgMSwgMTYpIDw8IDMyKSB8IChFTEVNKHptMSwgMywgMTYpIDw8IDQ4KTsKKyAgICBlbnYtPnZmcC5yZWdzW3JtXSA9IG1ha2VfZmxvYXQ2NChtMCk7CisgICAgZW52LT52ZnAucmVnc1tybSArIDFdID0gbWFrZV9mbG9hdDY0KG0xKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChkMCk7CisgICAgZW52LT52ZnAucmVnc1tyZCArIDFdID0gbWFrZV9mbG9hdDY0KGQxKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl9xdW56aXAzMikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmQsIHVpbnQzMl90IHJtKQoreworICAgIHVpbnQ2NF90IHptMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6bTEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtICsgMV0pOworICAgIHVpbnQ2NF90IHpkMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCB6ZDEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkICsgMV0pOworICAgIHVpbnQ2NF90IGQwID0gRUxFTSh6ZDAsIDAsIDMyKSB8IChFTEVNKHpkMSwgMCwgMzIpIDw8IDMyKTsKKyAgICB1aW50NjRfdCBkMSA9IEVMRU0oem0wLCAwLCAzMikgfCAoRUxFTSh6bTEsIDAsIDMyKSA8PCAzMik7CisgICAgdWludDY0X3QgbTAgPSBFTEVNKHpkMCwgMSwgMzIpIHwgKEVMRU0oemQxLCAxLCAzMikgPDwgMzIpOworICAgIHVpbnQ2NF90IG0xID0gRUxFTSh6bTAsIDEsIDMyKSB8IChFTEVNKHptMSwgMSwgMzIpIDw8IDMyKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JtXSA9IG1ha2VfZmxvYXQ2NChtMCk7CisgICAgZW52LT52ZnAucmVnc1tybSArIDFdID0gbWFrZV9mbG9hdDY0KG0xKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChkMCk7CisgICAgZW52LT52ZnAucmVnc1tyZCArIDFdID0gbWFrZV9mbG9hdDY0KGQxKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl91bnppcDgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHJkLCB1aW50MzJfdCBybSkKK3sKKyAgICB1aW50NjRfdCB6bSA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6ZCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCBkMCA9IEVMRU0oemQsIDAsIDgpIHwgKEVMRU0oemQsIDIsIDgpIDw8IDgpCisgICAgICAgIHwgKEVMRU0oemQsIDQsIDgpIDw8IDE2KSB8IChFTEVNKHpkLCA2LCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6bSwgMCwgOCkgPDwgMzIpIHwgKEVMRU0oem0sIDIsIDgpIDw8IDQwKQorICAgICAgICB8IChFTEVNKHptLCA0LCA4KSA8PCA0OCkgfCAoRUxFTSh6bSwgNiwgOCkgPDwgNTYpOworICAgIHVpbnQ2NF90IG0wID0gRUxFTSh6ZCwgMSwgOCkgfCAoRUxFTSh6ZCwgMywgOCkgPDwgOCkKKyAgICAgICAgfCAoRUxFTSh6ZCwgNSwgOCkgPDwgMTYpIHwgKEVMRU0oemQsIDcsIDgpIDw8IDI0KQorICAgICAgICB8IChFTEVNKHptLCAxLCA4KSA8PCAzMikgfCAoRUxFTSh6bSwgMywgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oem0sIDUsIDgpIDw8IDQ4KSB8IChFTEVNKHptLCA3LCA4KSA8PCA1Nik7CisgICAgZW52LT52ZnAucmVnc1tybV0gPSBtYWtlX2Zsb2F0NjQobTApOworICAgIGVudi0+dmZwLnJlZ3NbcmRdID0gbWFrZV9mbG9hdDY0KGQwKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl91bnppcDE2KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCByZCwgdWludDMyX3Qgcm0pCit7CisgICAgdWludDY0X3Qgem0gPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtXSk7CisgICAgdWludDY0X3QgemQgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkXSk7CisgICAgdWludDY0X3QgZDAgPSBFTEVNKHpkLCAwLCAxNikgfCAoRUxFTSh6ZCwgMiwgMTYpIDw8IDE2KQorICAgICAgICB8IChFTEVNKHptLCAwLCAxNikgPDwgMzIpIHwgKEVMRU0oem0sIDIsIDE2KSA8PCA0OCk7CisgICAgdWludDY0X3QgbTAgPSBFTEVNKHpkLCAxLCAxNikgfCAoRUxFTSh6ZCwgMywgMTYpIDw8IDE2KQorICAgICAgICB8IChFTEVNKHptLCAxLCAxNikgPDwgMzIpIHwgKEVMRU0oem0sIDMsIDE2KSA8PCA0OCk7CisgICAgZW52LT52ZnAucmVnc1tybV0gPSBtYWtlX2Zsb2F0NjQobTApOworICAgIGVudi0+dmZwLnJlZ3NbcmRdID0gbWFrZV9mbG9hdDY0KGQwKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl9xemlwOCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmQsIHVpbnQzMl90IHJtKQoreworICAgIHVpbnQ2NF90IHptMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6bTEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtICsgMV0pOworICAgIHVpbnQ2NF90IHpkMCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCB6ZDEgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkICsgMV0pOworICAgIHVpbnQ2NF90IGQwID0gRUxFTSh6ZDAsIDAsIDgpIHwgKEVMRU0oem0wLCAwLCA4KSA8PCA4KQorICAgICAgICB8IChFTEVNKHpkMCwgMSwgOCkgPDwgMTYpIHwgKEVMRU0oem0wLCAxLCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6ZDAsIDIsIDgpIDw8IDMyKSB8IChFTEVNKHptMCwgMiwgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oemQwLCAzLCA4KSA8PCA0OCkgfCAoRUxFTSh6bTAsIDMsIDgpIDw8IDU2KTsKKyAgICB1aW50NjRfdCBkMSA9IEVMRU0oemQwLCA0LCA4KSB8IChFTEVNKHptMCwgNCwgOCkgPDwgOCkKKyAgICAgICAgfCAoRUxFTSh6ZDAsIDUsIDgpIDw8IDE2KSB8IChFTEVNKHptMCwgNSwgOCkgPDwgMjQpCisgICAgICAgIHwgKEVMRU0oemQwLCA2LCA4KSA8PCAzMikgfCAoRUxFTSh6bTAsIDYsIDgpIDw8IDQwKQorICAgICAgICB8IChFTEVNKHpkMCwgNywgOCkgPDwgNDgpIHwgKEVMRU0oem0wLCA3LCA4KSA8PCA1Nik7CisgICAgdWludDY0X3QgbTAgPSBFTEVNKHpkMSwgMCwgOCkgfCAoRUxFTSh6bTEsIDAsIDgpIDw8IDgpCisgICAgICAgIHwgKEVMRU0oemQxLCAxLCA4KSA8PCAxNikgfCAoRUxFTSh6bTEsIDEsIDgpIDw8IDI0KQorICAgICAgICB8IChFTEVNKHpkMSwgMiwgOCkgPDwgMzIpIHwgKEVMRU0oem0xLCAyLCA4KSA8PCA0MCkKKyAgICAgICAgfCAoRUxFTSh6ZDEsIDMsIDgpIDw8IDQ4KSB8IChFTEVNKHptMSwgMywgOCkgPDwgNTYpOworICAgIHVpbnQ2NF90IG0xID0gRUxFTSh6ZDEsIDQsIDgpIHwgKEVMRU0oem0xLCA0LCA4KSA8PCA4KQorICAgICAgICB8IChFTEVNKHpkMSwgNSwgOCkgPDwgMTYpIHwgKEVMRU0oem0xLCA1LCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6ZDEsIDYsIDgpIDw8IDMyKSB8IChFTEVNKHptMSwgNiwgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oemQxLCA3LCA4KSA8PCA0OCkgfCAoRUxFTSh6bTEsIDcsIDgpIDw8IDU2KTsKKyAgICBlbnYtPnZmcC5yZWdzW3JtXSA9IG1ha2VfZmxvYXQ2NChtMCk7CisgICAgZW52LT52ZnAucmVnc1tybSArIDFdID0gbWFrZV9mbG9hdDY0KG0xKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChkMCk7CisgICAgZW52LT52ZnAucmVnc1tyZCArIDFdID0gbWFrZV9mbG9hdDY0KGQxKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl9xemlwMTYpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHJkLCB1aW50MzJfdCBybSkKK3sKKyAgICB1aW50NjRfdCB6bTAgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JtXSk7CisgICAgdWludDY0X3Qgem0xID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tybSArIDFdKTsKKyAgICB1aW50NjRfdCB6ZDAgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkXSk7CisgICAgdWludDY0X3QgemQxID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tyZCArIDFdKTsKKyAgICB1aW50NjRfdCBkMCA9IEVMRU0oemQwLCAwLCAxNikgfCAoRUxFTSh6bTAsIDAsIDE2KSA8PCAxNikKKyAgICAgICAgfCAoRUxFTSh6ZDAsIDEsIDE2KSA8PCAzMikgfCAoRUxFTSh6bTAsIDEsIDE2KSA8PCA0OCk7CisgICAgdWludDY0X3QgZDEgPSBFTEVNKHpkMCwgMiwgMTYpIHwgKEVMRU0oem0wLCAyLCAxNikgPDwgMTYpCisgICAgICAgIHwgKEVMRU0oemQwLCAzLCAxNikgPDwgMzIpIHwgKEVMRU0oem0wLCAzLCAxNikgPDwgNDgpOworICAgIHVpbnQ2NF90IG0wID0gRUxFTSh6ZDEsIDAsIDE2KSB8IChFTEVNKHptMSwgMCwgMTYpIDw8IDE2KQorICAgICAgICB8IChFTEVNKHpkMSwgMSwgMTYpIDw8IDMyKSB8IChFTEVNKHptMSwgMSwgMTYpIDw8IDQ4KTsKKyAgICB1aW50NjRfdCBtMSA9IEVMRU0oemQxLCAyLCAxNikgfCAoRUxFTSh6bTEsIDIsIDE2KSA8PCAxNikKKyAgICAgICAgfCAoRUxFTSh6ZDEsIDMsIDE2KSA8PCAzMikgfCAoRUxFTSh6bTEsIDMsIDE2KSA8PCA0OCk7CisgICAgZW52LT52ZnAucmVnc1tybV0gPSBtYWtlX2Zsb2F0NjQobTApOworICAgIGVudi0+dmZwLnJlZ3Nbcm0gKyAxXSA9IG1ha2VfZmxvYXQ2NChtMSk7CisgICAgZW52LT52ZnAucmVnc1tyZF0gPSBtYWtlX2Zsb2F0NjQoZDApOworICAgIGVudi0+dmZwLnJlZ3NbcmQgKyAxXSA9IG1ha2VfZmxvYXQ2NChkMSk7Cit9CisKK3ZvaWQgSEVMUEVSKG5lb25fcXppcDMyKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCByZCwgdWludDMyX3Qgcm0pCit7CisgICAgdWludDY0X3Qgem0wID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tybV0pOworICAgIHVpbnQ2NF90IHptMSA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm0gKyAxXSk7CisgICAgdWludDY0X3QgemQwID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tyZF0pOworICAgIHVpbnQ2NF90IHpkMSA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmQgKyAxXSk7CisgICAgdWludDY0X3QgZDAgPSBFTEVNKHpkMCwgMCwgMzIpIHwgKEVMRU0oem0wLCAwLCAzMikgPDwgMzIpOworICAgIHVpbnQ2NF90IGQxID0gRUxFTSh6ZDAsIDEsIDMyKSB8IChFTEVNKHptMCwgMSwgMzIpIDw8IDMyKTsKKyAgICB1aW50NjRfdCBtMCA9IEVMRU0oemQxLCAwLCAzMikgfCAoRUxFTSh6bTEsIDAsIDMyKSA8PCAzMik7CisgICAgdWludDY0X3QgbTEgPSBFTEVNKHpkMSwgMSwgMzIpIHwgKEVMRU0oem0xLCAxLCAzMikgPDwgMzIpOworICAgIGVudi0+dmZwLnJlZ3Nbcm1dID0gbWFrZV9mbG9hdDY0KG0wKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JtICsgMV0gPSBtYWtlX2Zsb2F0NjQobTEpOworICAgIGVudi0+dmZwLnJlZ3NbcmRdID0gbWFrZV9mbG9hdDY0KGQwKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkICsgMV0gPSBtYWtlX2Zsb2F0NjQoZDEpOworfQorCit2b2lkIEhFTFBFUihuZW9uX3ppcDgpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHJkLCB1aW50MzJfdCBybSkKK3sKKyAgICB1aW50NjRfdCB6bSA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3Nbcm1dKTsKKyAgICB1aW50NjRfdCB6ZCA9IGZsb2F0NjRfdmFsKGVudi0+dmZwLnJlZ3NbcmRdKTsKKyAgICB1aW50NjRfdCBkMCA9IEVMRU0oemQsIDAsIDgpIHwgKEVMRU0oem0sIDAsIDgpIDw8IDgpCisgICAgICAgIHwgKEVMRU0oemQsIDEsIDgpIDw8IDE2KSB8IChFTEVNKHptLCAxLCA4KSA8PCAyNCkKKyAgICAgICAgfCAoRUxFTSh6ZCwgMiwgOCkgPDwgMzIpIHwgKEVMRU0oem0sIDIsIDgpIDw8IDQwKQorICAgICAgICB8IChFTEVNKHpkLCAzLCA4KSA8PCA0OCkgfCAoRUxFTSh6bSwgMywgOCkgPDwgNTYpOworICAgIHVpbnQ2NF90IG0wID0gRUxFTSh6ZCwgNCwgOCkgfCAoRUxFTSh6bSwgNCwgOCkgPDwgOCkKKyAgICAgICAgfCAoRUxFTSh6ZCwgNSwgOCkgPDwgMTYpIHwgKEVMRU0oem0sIDUsIDgpIDw8IDI0KQorICAgICAgICB8IChFTEVNKHpkLCA2LCA4KSA8PCAzMikgfCAoRUxFTSh6bSwgNiwgOCkgPDwgNDApCisgICAgICAgIHwgKEVMRU0oemQsIDcsIDgpIDw8IDQ4KSB8IChFTEVNKHptLCA3LCA4KSA8PCA1Nik7CisgICAgZW52LT52ZnAucmVnc1tybV0gPSBtYWtlX2Zsb2F0NjQobTApOworICAgIGVudi0+dmZwLnJlZ3NbcmRdID0gbWFrZV9mbG9hdDY0KGQwKTsKK30KKwordm9pZCBIRUxQRVIobmVvbl96aXAxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmQsIHVpbnQzMl90IHJtKQoreworICAgIHVpbnQ2NF90IHptID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tybV0pOworICAgIHVpbnQ2NF90IHpkID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tyZF0pOworICAgIHVpbnQ2NF90IGQwID0gRUxFTSh6ZCwgMCwgMTYpIHwgKEVMRU0oem0sIDAsIDE2KSA8PCAxNikKKyAgICAgICAgfCAoRUxFTSh6ZCwgMSwgMTYpIDw8IDMyKSB8IChFTEVNKHptLCAxLCAxNikgPDwgNDgpOworICAgIHVpbnQ2NF90IG0wID0gRUxFTSh6ZCwgMiwgMTYpIHwgKEVMRU0oem0sIDIsIDE2KSA8PCAxNikKKyAgICAgICAgfCAoRUxFTSh6ZCwgMywgMTYpIDw8IDMyKSB8IChFTEVNKHptLCAzLCAxNikgPDwgNDgpOworICAgIGVudi0+dmZwLnJlZ3Nbcm1dID0gbWFrZV9mbG9hdDY0KG0wKTsKKyAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChkMCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vb3BfYWRkc3ViLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vb3BfYWRkc3ViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0YTE4OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9vcF9hZGRzdWIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIEFSTXY2IGludGVnZXIgU0lNRCBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBDb2RlU291cmNlcnkuCisgKiBXcml0dGVuIGJ5IFBhdWwgQnJvb2sKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTC4KKyAqLworCisjaWZkZWYgQVJJVEhfR0UKKyNkZWZpbmUgR0VfQVJHICwgdm9pZCAqZ2VwCisjZGVmaW5lIERFQ0xBUkVfR0UgdWludDMyX3QgZ2UgPSAwCisjZGVmaW5lIFNFVF9HRSAqKHVpbnQzMl90ICopZ2VwID0gZ2UKKyNlbHNlCisjZGVmaW5lIEdFX0FSRworI2RlZmluZSBERUNMQVJFX0dFIGRve313aGlsZSgwKQorI2RlZmluZSBTRVRfR0UgZG97fXdoaWxlKDApCisjZW5kaWYKKworI2RlZmluZSBSRVNVTFQodmFsLCBuLCB3aWR0aCkgXAorICAgIHJlcyB8PSAoKHVpbnQzMl90KShnbHVlKGdsdWUodWludCx3aWR0aCksX3QpKSh2YWwpKSA8PCAobiAqIHdpZHRoKQorCit1aW50MzJfdCBIRUxQRVIoZ2x1ZShQRlgsYWRkMTYpKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiIEdFX0FSRykKK3sKKyAgICB1aW50MzJfdCByZXMgPSAwOworICAgIERFQ0xBUkVfR0U7CisKKyAgICBBREQxNihhLCBiLCAwKTsKKyAgICBBREQxNihhID4+IDE2LCBiID4+IDE2LCAxKTsKKyAgICBTRVRfR0U7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgSEVMUEVSKGdsdWUoUEZYLGFkZDgpKSh1aW50MzJfdCBhLCB1aW50MzJfdCBiIEdFX0FSRykKK3sKKyAgICB1aW50MzJfdCByZXMgPSAwOworICAgIERFQ0xBUkVfR0U7CisKKyAgICBBREQ4KGEsIGIsIDApOworICAgIEFERDgoYSA+PiA4LCBiID4+IDgsIDEpOworICAgIEFERDgoYSA+PiAxNiwgYiA+PiAxNiwgMik7CisgICAgQUREOChhID4+IDI0LCBiID4+IDI0LCAzKTsKKyAgICBTRVRfR0U7CisgICAgcmV0dXJuIHJlczsKK30KKwordWludDMyX3QgSEVMUEVSKGdsdWUoUEZYLHN1YjE2KSkodWludDMyX3QgYSwgdWludDMyX3QgYiBHRV9BUkcpCit7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBERUNMQVJFX0dFOworCisgICAgU1VCMTYoYSwgYiwgMCk7CisgICAgU1VCMTYoYSA+PiAxNiwgYiA+PiAxNiwgMSk7CisgICAgU0VUX0dFOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihnbHVlKFBGWCxzdWI4KSkodWludDMyX3QgYSwgdWludDMyX3QgYiBHRV9BUkcpCit7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBERUNMQVJFX0dFOworCisgICAgU1VCOChhLCBiLCAwKTsKKyAgICBTVUI4KGEgPj4gOCwgYiA+PiA4LCAxKTsKKyAgICBTVUI4KGEgPj4gMTYsIGIgPj4gMTYsIDIpOworICAgIFNVQjgoYSA+PiAyNCwgYiA+PiAyNCwgMyk7CisgICAgU0VUX0dFOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihnbHVlKFBGWCxzdWJhZGR4KSkodWludDMyX3QgYSwgdWludDMyX3QgYiBHRV9BUkcpCit7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBERUNMQVJFX0dFOworCisgICAgQUREMTYoYSwgYiA+PiAxNiwgMCk7CisgICAgU1VCMTYoYSA+PiAxNiwgYiwgMSk7CisgICAgU0VUX0dFOworICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihnbHVlKFBGWCxhZGRzdWJ4KSkodWludDMyX3QgYSwgdWludDMyX3QgYiBHRV9BUkcpCit7CisgICAgdWludDMyX3QgcmVzID0gMDsKKyAgICBERUNMQVJFX0dFOworCisgICAgU1VCMTYoYSwgYiA+PiAxNiwgMCk7CisgICAgQUREMTYoYSA+PiAxNiwgYiwgMSk7CisgICAgU0VUX0dFOworICAgIHJldHVybiByZXM7Cit9CisKKyN1bmRlZiBHRV9BUkcKKyN1bmRlZiBERUNMQVJFX0dFCisjdW5kZWYgU0VUX0dFCisjdW5kZWYgUkVTVUxUCisKKyN1bmRlZiBBUklUSF9HRQorI3VuZGVmIFBGWAorI3VuZGVmIEFERDE2CisjdW5kZWYgU1VCMTYKKyN1bmRlZiBBREQ4CisjdW5kZWYgU1VCOApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL29wX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtYXJtL29wX2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzQ2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vb3BfaGVscGVyLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiAgQVJNIGhlbHBlciByb3V0aW5lcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwNyBDb2RlU291cmNlcnksIExMQworICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInRjZy5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorCisjZGVmaW5lIFNJR05CSVQgKHVpbnQzMl90KTB4ODAwMDAwMDAKKyNkZWZpbmUgU0lHTkJJVDY0ICgodWludDY0X3QpMSA8PCA2MykKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCitzdGF0aWMgdm9pZCByYWlzZV9leGNlcHRpb24oQ1BVQVJNU3RhdGUgKmVudiwgaW50IHR0KQoreworICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gdHQ7CisgICAgY3B1X2xvb3BfZXhpdChlbnYpOworfQorI2VuZGlmCisKK3VpbnQzMl90IEhFTFBFUihuZW9uX3RibCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgaXJlZywgdWludDMyX3QgZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybiwgdWludDMyX3QgbWF4aW5kZXgpCit7CisgICAgdWludDMyX3QgdmFsOworICAgIHVpbnQzMl90IHRtcDsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IHNoaWZ0OworICAgIHVpbnQ2NF90ICp0YWJsZTsKKyAgICB0YWJsZSA9ICh1aW50NjRfdCAqKSZlbnYtPnZmcC5yZWdzW3JuXTsKKyAgICB2YWwgPSAwOworICAgIGZvciAoc2hpZnQgPSAwOyBzaGlmdCA8IDMyOyBzaGlmdCArPSA4KSB7CisgICAgICAgIGluZGV4ID0gKGlyZWcgPj4gc2hpZnQpICYgMHhmZjsKKyAgICAgICAgaWYgKGluZGV4IDwgbWF4aW5kZXgpIHsKKyAgICAgICAgICAgIHRtcCA9ICh0YWJsZVtpbmRleCA+PiAzXSA+PiAoKGluZGV4ICYgNykgPDwgMykpICYgMHhmZjsKKyAgICAgICAgICAgIHZhbCB8PSB0bXAgPDwgc2hpZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwgfD0gZGVmICYgKDB4ZmYgPDwgc2hpZnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKKyN1bmRlZiBlbnYKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisKKworI2RlZmluZSBNTVVTVUZGSVggX21tdQorCisjZGVmaW5lIFNISUZUIDAKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTSElGVCAxCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmgiCisKKyNkZWZpbmUgU0hJRlQgMgorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgorCisjZGVmaW5lIFNISUZUIDMKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworLyogdHJ5IHRvIGZpbGwgdGhlIFRMQiBhbmQgcmV0dXJuIGFuIGV4Y2VwdGlvbiBpZiBlcnJvci4gSWYgcmV0YWRkciBpcworICAgTlVMTCwgaXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBpbiBDIGNvZGUgKGkuZS4gbm90CisgICBmcm9tIGdlbmVyYXRlZCBjb2RlIG9yIGZyb20gaGVscGVyLmMpICovCit2b2lkIHRsYl9maWxsKENQVUFSTVN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCBpbnQgaXNfd3JpdGUsIGludCBtbXVfaWR4LAorICAgICAgICAgICAgICB1aW50cHRyX3QgcmV0YWRkcikKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gY3B1X2FybV9oYW5kbGVfbW11X2ZhdWx0KGVudiwgYWRkciwgaXNfd3JpdGUsIG1tdV9pZHgpOworICAgIGlmICh1bmxpa2VseShyZXQpKSB7CisgICAgICAgIGlmIChyZXRhZGRyKSB7CisgICAgICAgICAgICAvKiBub3cgd2UgaGF2ZSBhIHJlYWwgY3B1IGZhdWx0ICovCisgICAgICAgICAgICBjcHVfcmVzdG9yZV9zdGF0ZShlbnYsIHJldGFkZHIpOworICAgICAgICB9CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIGVudi0+ZXhjZXB0aW9uX2luZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgSEVMUEVSKHNldF9jcCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgaW5zbiwgdWludDMyX3QgdmFsKQoreworICAgIGludCBjcF9udW0gPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICBpbnQgY3BfaW5mbyA9IChpbnNuID4+IDUpICYgNzsKKyAgICBpbnQgc3JjID0gKGluc24gPj4gMTYpICYgMHhmOworICAgIGludCBvcGVyYW5kID0gaW5zbiAmIDB4ZjsKKworICAgIGlmIChlbnYtPmNwW2NwX251bV0uY3Bfd3JpdGUpCisgICAgICAgIGVudi0+Y3BbY3BfbnVtXS5jcF93cml0ZShlbnYtPmNwW2NwX251bV0ub3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BfaW5mbywgc3JjLCBvcGVyYW5kLCB2YWwsICh2b2lkKilHRVRQQygpKTsKKyAgICAgICAgfQorCit1aW50MzJfdCBIRUxQRVIoZ2V0X2NwKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBpbnNuKQoreworICAgIGludCBjcF9udW0gPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICBpbnQgY3BfaW5mbyA9IChpbnNuID4+IDUpICYgNzsKKyAgICBpbnQgZGVzdCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICBpbnQgb3BlcmFuZCA9IGluc24gJiAweGY7CisKKyAgICBpZiAoZW52LT5jcFtjcF9udW1dLmNwX3JlYWQpCisgICAgICAgIHJldHVybiBlbnYtPmNwW2NwX251bV0uY3BfcmVhZChlbnYtPmNwW2NwX251bV0ub3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BfaW5mbywgZGVzdCwgb3BlcmFuZCwgKHZvaWQqKUdFVFBDKCkpOworICAgICAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKwordm9pZCBIRUxQRVIoc2V0X2NwKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBpbnNuLCB1aW50MzJfdCB2YWwpCit7CisgICAgaW50IG9wMSA9IChpbnNuID4+IDgpICYgMHhmOworICAgIGNwdV9hYm9ydChlbnYsICJjcCVpIGluc24gJTA4eFxuIiwgb3AxLCBpbnNuKTsKKyAgICByZXR1cm47Cit9CisKK3VpbnQzMl90IEhFTFBFUihnZXRfY3ApKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGluc24pCit7CisgICAgaW50IG9wMSA9IChpbnNuID4+IDgpICYgMHhmOworICAgIGNwdV9hYm9ydChlbnYsICJjcCVpIGluc24gJTA4eFxuIiwgb3AxLCBpbnNuKTsKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3VpbnQzMl90IEhFTFBFUihhZGRfc2V0cSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXMgPSBhICsgYjsKKyAgICBpZiAoKChyZXMgXiBhKSAmIFNJR05CSVQpICYmICEoKGEgXiBiKSAmIFNJR05CSVQpKQorICAgICAgICBlbnYtPlFGID0gMTsKKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJfdCBIRUxQRVIoYWRkX3NhdHVyYXRlKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlcyA9IGEgKyBiOworICAgIGlmICgoKHJlcyBeIGEpICYgU0lHTkJJVCkgJiYgISgoYSBeIGIpICYgU0lHTkJJVCkpIHsKKyAgICAgICAgZW52LT5RRiA9IDE7CisgICAgICAgIHJlcyA9IH4oKChpbnQzMl90KWEgPj4gMzEpIF4gU0lHTkJJVCk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihzdWJfc2F0dXJhdGUpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDMyX3QgcmVzID0gYSAtIGI7CisgICAgaWYgKCgocmVzIF4gYSkgJiBTSUdOQklUKSAmJiAoKGEgXiBiKSAmIFNJR05CSVQpKSB7CisgICAgICAgIGVudi0+UUYgPSAxOworICAgICAgICByZXMgPSB+KCgoaW50MzJfdClhID4+IDMxKSBeIFNJR05CSVQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJfdCBIRUxQRVIoZG91YmxlX3NhdHVyYXRlKShDUFVBUk1TdGF0ZSAqZW52LCBpbnQzMl90IHZhbCkKK3sKKyAgICB1aW50MzJfdCByZXM7CisgICAgaWYgKHZhbCA+PSAweDQwMDAwMDAwKSB7CisgICAgICAgIHJlcyA9IH5TSUdOQklUOworICAgICAgICBlbnYtPlFGID0gMTsKKyAgICB9IGVsc2UgaWYgKHZhbCA8PSAoaW50MzJfdCkweGMwMDAwMDAwKSB7CisgICAgICAgIHJlcyA9IFNJR05CSVQ7CisgICAgICAgIGVudi0+UUYgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlcyA9IHZhbCA8PCAxOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit1aW50MzJfdCBIRUxQRVIoYWRkX3VzYXR1cmF0ZSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXMgPSBhICsgYjsKKyAgICBpZiAocmVzIDwgYSkgeworICAgICAgICBlbnYtPlFGID0gMTsKKyAgICAgICAgcmVzID0gfjA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3VpbnQzMl90IEhFTFBFUihzdWJfdXNhdHVyYXRlKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlcyA9IGEgLSBiOworICAgIGlmIChyZXMgPiBhKSB7CisgICAgICAgIGVudi0+UUYgPSAxOworICAgICAgICByZXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvKiBTaWduZWQgc2F0dXJhdGlvbi4gICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGRvX3NzYXQoQ1BVQVJNU3RhdGUgKmVudiwgaW50MzJfdCB2YWwsIGludCBzaGlmdCkKK3sKKyAgICBpbnQzMl90IHRvcDsKKyAgICB1aW50MzJfdCBtYXNrOworCisgICAgdG9wID0gdmFsID4+IHNoaWZ0OworICAgIG1hc2sgPSAoMXUgPDwgc2hpZnQpIC0gMTsKKyAgICBpZiAodG9wID4gMCkgeworICAgICAgICBlbnYtPlFGID0gMTsKKyAgICAgICAgcmV0dXJuIG1hc2s7CisgICAgfSBlbHNlIGlmICh0b3AgPCAtMSkgeworICAgICAgICBlbnYtPlFGID0gMTsKKyAgICAgICAgcmV0dXJuIH5tYXNrOworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCisvKiBVbnNpZ25lZCBzYXR1cmF0aW9uLiAgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZG9fdXNhdChDUFVBUk1TdGF0ZSAqZW52LCBpbnQzMl90IHZhbCwgaW50IHNoaWZ0KQoreworICAgIHVpbnQzMl90IG1heDsKKworICAgIG1heCA9ICgxdSA8PCBzaGlmdCkgLSAxOworICAgIGlmICh2YWwgPCAwKSB7CisgICAgICAgIGVudi0+UUYgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IG1heCkgeworICAgICAgICBlbnYtPlFGID0gMTsKKyAgICAgICAgcmV0dXJuIG1heDsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworLyogU2lnbmVkIHNhdHVyYXRlLiAgKi8KK3VpbnQzMl90IEhFTFBFUihzc2F0KShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4LCB1aW50MzJfdCBzaGlmdCkKK3sKKyAgICByZXR1cm4gZG9fc3NhdChlbnYsIHgsIHNoaWZ0KTsKK30KKworLyogRHVhbCBoYWxmd29yZCBzaWduZWQgc2F0dXJhdGUuICAqLwordWludDMyX3QgSEVMUEVSKHNzYXQxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCwgdWludDMyX3Qgc2hpZnQpCit7CisgICAgdWludDMyX3QgcmVzOworCisgICAgcmVzID0gKHVpbnQxNl90KWRvX3NzYXQoZW52LCAoaW50MTZfdCl4LCBzaGlmdCk7CisgICAgcmVzIHw9IGRvX3NzYXQoZW52LCAoKGludDMyX3QpeCkgPj4gMTYsIHNoaWZ0KSA8PCAxNjsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiBVbnNpZ25lZCBzYXR1cmF0ZS4gICovCit1aW50MzJfdCBIRUxQRVIodXNhdCkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCwgdWludDMyX3Qgc2hpZnQpCit7CisgICAgcmV0dXJuIGRvX3VzYXQoZW52LCB4LCBzaGlmdCk7Cit9CisKKy8qIER1YWwgaGFsZndvcmQgdW5zaWduZWQgc2F0dXJhdGUuICAqLwordWludDMyX3QgSEVMUEVSKHVzYXQxNikoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCwgdWludDMyX3Qgc2hpZnQpCit7CisgICAgdWludDMyX3QgcmVzOworCisgICAgcmVzID0gKHVpbnQxNl90KWRvX3VzYXQoZW52LCAoaW50MTZfdCl4LCBzaGlmdCk7CisgICAgcmVzIHw9IGRvX3VzYXQoZW52LCAoKGludDMyX3QpeCkgPj4gMTYsIHNoaWZ0KSA8PCAxNjsKKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhFTFBFUih3ZmkpKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0hMVDsKKyAgICBFTlZfR0VUX0NQVShlbnYpLT5oYWx0ZWQgPSAxOworICAgIGNwdV9sb29wX2V4aXQoZW52KTsKK30KKwordm9pZCBIRUxQRVIoZXhjZXB0aW9uKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBleGNwKQoreworICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gZXhjcDsKKyAgICBjcHVfbG9vcF9leGl0KGVudik7Cit9CisKK3VpbnQzMl90IEhFTFBFUihjcHNyX3JlYWQpKENQVUFSTVN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGNwc3JfcmVhZChlbnYpICYgfkNQU1JfRVhFQzsKK30KKwordm9pZCBIRUxQRVIoY3Bzcl93cml0ZSkoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgdmFsLCB1aW50MzJfdCBtYXNrKQoreworICAgIGNwc3Jfd3JpdGUoZW52LCB2YWwsIG1hc2spOworfQorCisvKiBBY2Nlc3MgdG8gdXNlciBtb2RlIHJlZ2lzdGVycyBmcm9tIHByaXZpbGVnZWQgbW9kZXMuICAqLwordWludDMyX3QgSEVMUEVSKGdldF91c2VyX3JlZykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgcmVnbm8pCit7CisgICAgdWludDMyX3QgdmFsOworCisgICAgaWYgKHJlZ25vID09IDEzKSB7CisgICAgICAgIHZhbCA9IGVudi0+YmFua2VkX3IxM1swXTsKKyAgICB9IGVsc2UgaWYgKHJlZ25vID09IDE0KSB7CisgICAgICAgIHZhbCA9IGVudi0+YmFua2VkX3IxNFswXTsKKyAgICB9IGVsc2UgaWYgKHJlZ25vID49IDgKKyAgICAgICAgICAgICAgICYmIChlbnYtPnVuY2FjaGVkX2Nwc3IgJiAweDFmKSA9PSBBUk1fQ1BVX01PREVfRklRKSB7CisgICAgICAgIHZhbCA9IGVudi0+dXNyX3JlZ3NbcmVnbm8gLSA4XTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgPSBlbnYtPnJlZ3NbcmVnbm9dOworICAgIH0KKyAgICByZXR1cm4gdmFsOworfQorCit2b2lkIEhFTFBFUihzZXRfdXNlcl9yZWcpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHJlZ25vLCB1aW50MzJfdCB2YWwpCit7CisgICAgaWYgKHJlZ25vID09IDEzKSB7CisgICAgICAgIGVudi0+YmFua2VkX3IxM1swXSA9IHZhbDsKKyAgICB9IGVsc2UgaWYgKHJlZ25vID09IDE0KSB7CisgICAgICAgIGVudi0+YmFua2VkX3IxNFswXSA9IHZhbDsKKyAgICB9IGVsc2UgaWYgKHJlZ25vID49IDgKKyAgICAgICAgICAgICAgICYmIChlbnYtPnVuY2FjaGVkX2Nwc3IgJiAweDFmKSA9PSBBUk1fQ1BVX01PREVfRklRKSB7CisgICAgICAgIGVudi0+dXNyX3JlZ3NbcmVnbm8gLSA4XSA9IHZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPnJlZ3NbcmVnbm9dID0gdmFsOworICAgIH0KK30KKworLyogPz8/IEZsYWcgc2V0dGluZyBhcml0aG1ldGljIGlzIGF3a3dhcmQgYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIGNvbXBhcmlzb25zLgorICAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoYXQgaW4gVENHIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoLCB3aGljaCBjbG9iYmVycworICAgYWxsIG91ciB0ZW1wb3Jhcmllcy4gIEZvciBub3cgaW1wbGVtZW50IHRoZXNlIGFzIGhlbHBlciBmdW5jdGlvbnMuICAqLworCit1aW50MzJfdCBIRUxQRVIgKGFkZF9jYykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXN1bHQ7CisgICAgcmVzdWx0ID0gYSArIGI7CisgICAgZW52LT5ORiA9IGVudi0+WkYgPSByZXN1bHQ7CisgICAgZW52LT5DRiA9IHJlc3VsdCA8IGE7CisgICAgZW52LT5WRiA9IChhIF4gYiBeIC0xKSAmIChhIF4gcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit1aW50MzJfdCBIRUxQRVIoYWRjX2NjKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHVpbnQzMl90IHJlc3VsdDsKKyAgICBpZiAoIWVudi0+Q0YpIHsKKyAgICAgICAgcmVzdWx0ID0gYSArIGI7CisgICAgICAgIGVudi0+Q0YgPSByZXN1bHQgPCBhOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGEgKyBiICsgMTsKKyAgICAgICAgZW52LT5DRiA9IHJlc3VsdCA8PSBhOworICAgIH0KKyAgICBlbnYtPlZGID0gKGEgXiBiIF4gLTEpICYgKGEgXiByZXN1bHQpOworICAgIGVudi0+TkYgPSBlbnYtPlpGID0gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3VpbnQzMl90IEhFTFBFUihzdWJfY2MpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgdWludDMyX3QgcmVzdWx0OworICAgIHJlc3VsdCA9IGEgLSBiOworICAgIGVudi0+TkYgPSBlbnYtPlpGID0gcmVzdWx0OworICAgIGVudi0+Q0YgPSBhID49IGI7CisgICAgZW52LT5WRiA9IChhIF4gYikgJiAoYSBeIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordWludDMyX3QgSEVMUEVSKHNiY19jYykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICB1aW50MzJfdCByZXN1bHQ7CisgICAgaWYgKCFlbnYtPkNGKSB7CisgICAgICAgIHJlc3VsdCA9IGEgLSBiIC0gMTsKKyAgICAgICAgZW52LT5DRiA9IGEgPiBiOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGEgLSBiOworICAgICAgICBlbnYtPkNGID0gYSA+PSBiOworICAgIH0KKyAgICBlbnYtPlZGID0gKGEgXiBiKSAmIChhIF4gcmVzdWx0KTsKKyAgICBlbnYtPk5GID0gZW52LT5aRiA9IHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBTaW1pbGFybHkgZm9yIHZhcmlhYmxlIHNoaWZ0IGluc3RydWN0aW9ucy4gICovCisKK3VpbnQzMl90IEhFTFBFUihzaGwpKHVpbnQzMl90IHgsIHVpbnQzMl90IGkpCit7CisgICAgaW50IHNoaWZ0ID0gaSAmIDB4ZmY7CisgICAgaWYgKHNoaWZ0ID49IDMyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4geCA8PCBzaGlmdDsKK30KKwordWludDMyX3QgSEVMUEVSKHNocikodWludDMyX3QgeCwgdWludDMyX3QgaSkKK3sKKyAgICBpbnQgc2hpZnQgPSBpICYgMHhmZjsKKyAgICBpZiAoc2hpZnQgPj0gMzIpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAodWludDMyX3QpeCA+PiBzaGlmdDsKK30KKwordWludDMyX3QgSEVMUEVSKHNhcikodWludDMyX3QgeCwgdWludDMyX3QgaSkKK3sKKyAgICBpbnQgc2hpZnQgPSBpICYgMHhmZjsKKyAgICBpZiAoc2hpZnQgPj0gMzIpCisgICAgICAgIHNoaWZ0ID0gMzE7CisgICAgcmV0dXJuIChpbnQzMl90KXggPj4gc2hpZnQ7Cit9CisKK3VpbnQzMl90IEhFTFBFUihzaGxfY2MpKENQVUFSTVN0YXRlICplbnYsIHVpbnQzMl90IHgsIHVpbnQzMl90IGkpCit7CisgICAgaW50IHNoaWZ0ID0gaSAmIDB4ZmY7CisgICAgaWYgKHNoaWZ0ID49IDMyKSB7CisgICAgICAgIGlmIChzaGlmdCA9PSAzMikKKyAgICAgICAgICAgIGVudi0+Q0YgPSB4ICYgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52LT5DRiA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoc2hpZnQgIT0gMCkgeworICAgICAgICBlbnYtPkNGID0gKHggPj4gKDMyIC0gc2hpZnQpKSAmIDE7CisgICAgICAgIHJldHVybiB4IDw8IHNoaWZ0OworICAgIH0KKyAgICByZXR1cm4geDsKK30KKwordWludDMyX3QgSEVMUEVSKHNocl9jYykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCwgdWludDMyX3QgaSkKK3sKKyAgICBpbnQgc2hpZnQgPSBpICYgMHhmZjsKKyAgICBpZiAoc2hpZnQgPj0gMzIpIHsKKyAgICAgICAgaWYgKHNoaWZ0ID09IDMyKQorICAgICAgICAgICAgZW52LT5DRiA9ICh4ID4+IDMxKSAmIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVudi0+Q0YgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0ICE9IDApIHsKKyAgICAgICAgZW52LT5DRiA9ICh4ID4+IChzaGlmdCAtIDEpKSAmIDE7CisgICAgICAgIHJldHVybiB4ID4+IHNoaWZ0OworICAgIH0KKyAgICByZXR1cm4geDsKK30KKwordWludDMyX3QgSEVMUEVSKHNhcl9jYykoQ1BVQVJNU3RhdGUgKmVudiwgdWludDMyX3QgeCwgdWludDMyX3QgaSkKK3sKKyAgICBpbnQgc2hpZnQgPSBpICYgMHhmZjsKKyAgICBpZiAoc2hpZnQgPj0gMzIpIHsKKyAgICAgICAgZW52LT5DRiA9ICh4ID4+IDMxKSAmIDE7CisgICAgICAgIHJldHVybiAoaW50MzJfdCl4ID4+IDMxOworICAgIH0gZWxzZSBpZiAoc2hpZnQgIT0gMCkgeworICAgICAgICBlbnYtPkNGID0gKHggPj4gKHNoaWZ0IC0gMSkpICYgMTsKKyAgICAgICAgcmV0dXJuIChpbnQzMl90KXggPj4gc2hpZnQ7CisgICAgfQorICAgIHJldHVybiB4OworfQorCit1aW50MzJfdCBIRUxQRVIocm9yX2NjKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCB4LCB1aW50MzJfdCBpKQoreworICAgIGludCBzaGlmdDEsIHNoaWZ0OworICAgIHNoaWZ0MSA9IGkgJiAweGZmOworICAgIHNoaWZ0ID0gc2hpZnQxICYgMHgxZjsKKyAgICBpZiAoc2hpZnQgPT0gMCkgeworICAgICAgICBpZiAoc2hpZnQxICE9IDApCisgICAgICAgICAgICBlbnYtPkNGID0gKHggPj4gMzEpICYgMTsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5DRiA9ICh4ID4+IChzaGlmdCAtIDEpKSAmIDE7CisgICAgICAgIHJldHVybiAoKHVpbnQzMl90KXggPj4gc2hpZnQpIHwgKHggPDwgKDMyIC0gc2hpZnQpKTsKKyAgICB9Cit9CisKK3ZvaWQgSEVMUEVSKG5lb25fdmxkc3RfYWxsKShDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBpbnNuKQoreworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNkZWZpbmUgTERCKGFkZHIpIGxkdWIoYWRkcikKKyNkZWZpbmUgTERXKGFkZHIpIGxkdXcoYWRkcikKKyNkZWZpbmUgTERMKGFkZHIpIGxkbChhZGRyKQorI2RlZmluZSBMRFEoYWRkcikgbGRxKGFkZHIpCisjZGVmaW5lIFNUQihhZGRyLCB2YWwpIHN0YihhZGRyLCB2YWwpCisjZGVmaW5lIFNUVyhhZGRyLCB2YWwpIHN0dyhhZGRyLCB2YWwpCisjZGVmaW5lIFNUTChhZGRyLCB2YWwpIHN0bChhZGRyLCB2YWwpCisjZGVmaW5lIFNUUShhZGRyLCB2YWwpIHN0cShhZGRyLCB2YWwpCisjZWxzZQorICAgIGludCB1c2VyID0gY3B1X21tdV9pbmRleChlbnYpOworI2RlZmluZSBMREIoYWRkcikgaGVscGVyX2xkYl9tbXUoZW52LCBhZGRyLCB1c2VyKQorI2RlZmluZSBMRFcoYWRkcikgaGVscGVyX2xlX2xkdXdfbW11KGVudiwgYWRkciwgdXNlciwgR0VUUEMoKSkKKyNkZWZpbmUgTERMKGFkZHIpIGhlbHBlcl9sZV9sZHVsX21tdShlbnYsIGFkZHIsIHVzZXIsIEdFVFBDKCkpCisjZGVmaW5lIExEUShhZGRyKSBoZWxwZXJfbGVfbGRxX21tdShlbnYsIGFkZHIsIHVzZXIsIEdFVFBDKCkpCisjZGVmaW5lIFNUQihhZGRyLCB2YWwpIGhlbHBlcl9zdGJfbW11KGVudiwgYWRkciwgdmFsLCB1c2VyKQorI2RlZmluZSBTVFcoYWRkciwgdmFsKSBoZWxwZXJfbGVfc3R3X21tdShlbnYsIGFkZHIsIHZhbCwgdXNlciwgR0VUUEMoKSkKKyNkZWZpbmUgU1RMKGFkZHIsIHZhbCkgaGVscGVyX2xlX3N0bF9tbXUoZW52LCBhZGRyLCB2YWwsIHVzZXIsIEdFVFBDKCkpCisjZGVmaW5lIFNUUShhZGRyLCB2YWwpIGhlbHBlcl9sZV9zdHFfbW11KGVudiwgYWRkciwgdmFsLCB1c2VyLCBHRVRQQygpKQorI2VuZGlmCisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGludCBucmVnczsKKyAgICAgICAgaW50IGludGVybGVhdmU7CisgICAgICAgIGludCBzcGFjaW5nOworICAgIH0gbmVvbl9sc19lbGVtZW50X3R5cGVbMTFdID0geworICAgICAgICB7NCwgNCwgMX0sCisgICAgICAgIHs0LCA0LCAyfSwKKyAgICAgICAgezQsIDEsIDF9LAorICAgICAgICB7NCwgMiwgMX0sCisgICAgICAgIHszLCAzLCAxfSwKKyAgICAgICAgezMsIDMsIDJ9LAorICAgICAgICB7MywgMSwgMX0sCisgICAgICAgIHsxLCAxLCAxfSwKKyAgICAgICAgezIsIDIsIDF9LAorICAgICAgICB7MiwgMiwgMn0sCisgICAgICAgIHsyLCAxLCAxfQorICAgIH07CisKKyAgICBjb25zdCBpbnQgb3AgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IChpbnNuID4+IDYpICYgMzsKKyAgICBpbnQgcmQgPSAoKGluc24gPj4gMTIpICYgMHgwZikgfCAoKGluc24gPj4gMTgpICYgMHgxMCk7CisgICAgY29uc3QgaW50IHJuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgIGNvbnN0IGludCBsb2FkID0gKGluc24gJiAoMSA8PCAyMSkpICE9IDA7CisgICAgY29uc3QgaW50IG5yZWdzID0gbmVvbl9sc19lbGVtZW50X3R5cGVbb3BdLm5yZWdzOworICAgIGNvbnN0IGludCBpbnRlcmxlYXZlID0gbmVvbl9sc19lbGVtZW50X3R5cGVbb3BdLmludGVybGVhdmU7CisgICAgY29uc3QgaW50IHNwYWNpbmcgPSBuZW9uX2xzX2VsZW1lbnRfdHlwZVtvcF0uc3BhY2luZzsKKyAgICB1aW50MzJfdCBhZGRyID0gZW52LT5yZWdzW3JuXTsKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gKDEgPDwgc2l6ZSkgKiBpbnRlcmxlYXZlOworICAgIGludCBpLCByZWc7CisgICAgdWludDY0X3QgdG1wNjQ7CisKKyAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IG5yZWdzOyByZWcrKykgeworICAgICAgICBpZiAoaW50ZXJsZWF2ZSA+IDIgfHwgKGludGVybGVhdmUgPT0gMiAmJiBucmVncyA9PSAyKSkgeworICAgICAgICAgICAgYWRkciA9IGVudi0+cmVnc1tybl0gKyAoMSA8PCBzaXplKSAqIHJlZzsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlcmxlYXZlID09IDIgJiYgbnJlZ3MgPT0gNCAmJiByZWcgPT0gMikgeworICAgICAgICAgICAgYWRkciA9IGVudi0+cmVnc1tybl0gKyAoMSA8PCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpZiAobG9hZCkgeworICAgICAgICAgICAgICAgICAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NChMRFEoYWRkcikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFNUUShhZGRyLCBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiAobG9hZCkgeworICAgICAgICAgICAgICAgICAgICB0bXA2NCA9ICh1aW50MzJfdClMREwoYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGFkZHIgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICB0bXA2NCB8PSAodWludDY0X3QpTERMKGFkZHIpIDw8IDMyOworICAgICAgICAgICAgICAgICAgICBhZGRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgZW52LT52ZnAucmVnc1tyZF0gPSBtYWtlX2Zsb2F0NjQodG1wNjQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tyZF0pOworICAgICAgICAgICAgICAgICAgICBTVEwoYWRkciwgdG1wNjQpOworICAgICAgICAgICAgICAgICAgICBhZGRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgU1RMKGFkZHIsIHRtcDY0ID4+IDMyKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkciArPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gMHVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYWRkciArPSBzdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0IHw9ICh1aW50NjRfdClMRFcoYWRkcikgPDwgKGkgKiAxNik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZW52LT52ZnAucmVnc1tyZF0gPSBtYWtlX2Zsb2F0NjQodG1wNjQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZmxvYXQ2NF92YWwoZW52LT52ZnAucmVnc1tyZF0pOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBhZGRyICs9IHN0cmlkZSwgdG1wNjQgPj49IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTVFcoYWRkciwgdG1wNjQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmIChsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gMHVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYWRkciArPSBzdHJpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0IHw9ICh1aW50NjRfdClMREIoYWRkcikgPDwgKGkgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbnYtPnZmcC5yZWdzW3JkXSA9IG1ha2VfZmxvYXQ2NCh0bXA2NCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wNjQgPSBmbG9hdDY0X3ZhbChlbnYtPnZmcC5yZWdzW3JkXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGFkZHIgKz0gc3RyaWRlLCB0bXA2NCA+Pj0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU1RCKGFkZHIsIHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZCArPSBzcGFjaW5nOworICAgIH0KKyN1bmRlZiBMREIKKyN1bmRlZiBMRFcKKyN1bmRlZiBMREwKKyN1bmRlZiBMRFEKKyN1bmRlZiBTVEIKKyN1bmRlZiBTVFcKKyN1bmRlZiBTVEwKKyN1bmRlZiBTVFEKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS9xb20tY3B1LmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vcW9tLWNwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTcxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vcW9tLWNwdS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgUUVNVV9BUk1fQ1BVX1FPTV9ICisjZGVmaW5lIFFFTVVfQVJNX0NQVV9RT01fSAorCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgorI2luY2x1ZGUgInFvbS9jcHUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQVJNQ1BVIHsKKyAgICBDUFVTdGF0ZSBwYXJlbnRfb2JqOworCisgICAgQ1BVQVJNU3RhdGUgZW52OworfTsKKworc3RhdGljIGlubGluZSBBUk1DUFUgKmFybV9lbnZfZ2V0X2NwdShDUFVBUk1TdGF0ZSAqZW52KQoreworICAgIHJldHVybiBjb250YWluZXJfb2YoZW52LCBBUk1DUFUsIGVudik7Cit9CisKKyNkZWZpbmUgRU5WX0dFVF9DUFUoZSkgIENQVShhcm1fZW52X2dldF9jcHUoZSkpCisjZGVmaW5lIEVOVl9PRkZTRVQgb2Zmc2V0b2YoQVJNQ1BVLCBlbnYpCisKKyNlbmRpZiAgLy8gUUVNVV9BUk1fQ1BVX1FPTV9ICmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vdHJhbnNsYXRlLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1hcm0vdHJhbnNsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkMzc0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWFybS90cmFuc2xhdGUuYwpAQCAtMCwwICsxLDEwMDY2IEBACisvKgorICogIEFSTSB0cmFuc2xhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDcgQ29kZVNvdXJjZXJ5CisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IE9wZW5lZEhhbmQsIEx0ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2NvZGUtcHJvZmlsZS5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKyNpbmNsdWRlICJkaXNhcy9kaXNhcy5oIgorI2luY2x1ZGUgInRjZy1vcC5oIgorI2luY2x1ZGUgInFlbXUvbG9nLmgiCisKKyNpbmNsdWRlICJoZWxwZXIuaCIKKyNkZWZpbmUgR0VOX0hFTFBFUiAxCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNkZWZpbmUgRU5BQkxFX0FSQ0hfNFQgICAgYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpCisjZGVmaW5lIEVOQUJMRV9BUkNIXzUgICAgIGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjUpCisvKiBjdXJyZW50bHkgYWxsIGVtdWxhdGVkIHY1IGNvcmVzIGFyZSBhbHNvIHY1VEUsIHNvIGRvbid0IGJvdGhlciAqLworI2RlZmluZSBFTkFCTEVfQVJDSF81VEUgICBhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KQorI2RlZmluZSBFTkFCTEVfQVJDSF81SiAgICAwCisjZGVmaW5lIEVOQUJMRV9BUkNIXzYgICAgIGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpCisjZGVmaW5lIEVOQUJMRV9BUkNIXzZLICAgYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNkspCisjZGVmaW5lIEVOQUJMRV9BUkNIXzZUMiAgIGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyKQorI2RlZmluZSBFTkFCTEVfQVJDSF83ICAgICBhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3KQorCisjZGVmaW5lIEFSQ0goeCkgZG8geyBpZiAoIUVOQUJMRV9BUkNIXyMjeCkgZ290byBpbGxlZ2FsX29wOyB9IHdoaWxlKDApCisKKy8qIGludGVybmFsIGRlZmluZXMgKi8KK3R5cGVkZWYgc3RydWN0IERpc2FzQ29udGV4dCB7CisgICAgdGFyZ2V0X3Vsb25nIHBjOworICAgIGludCBpc19qbXA7CisgICAgLyogTm9uemVybyBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBiZWVuIGNvbmRpdGlvbmFsbHkgc2tpcHBlZC4gICovCisgICAgaW50IGNvbmRqbXA7CisgICAgLyogVGhlIGxhYmVsIHRoYXQgd2lsbCBiZSBqdW1wZWQgdG8gd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgc2tpcHBlZC4gICovCisgICAgaW50IGNvbmRsYWJlbDsKKyAgICAvKiBUaHVtYi0yIGNvbmR0aW9uYWwgZXhlY3V0aW9uIGJpdHMuICAqLworICAgIGludCBjb25kZXhlY19tYXNrOworICAgIGludCBjb25kZXhlY19jb25kOworICAgIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKyAgICBpbnQgc2luZ2xlc3RlcF9lbmFibGVkOworICAgIGludCB0aHVtYjsKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIGludCB1c2VyOworI2VuZGlmCisgICAgaW50IHZmcF9lbmFibGVkOworICAgIGludCB2ZWNfbGVuOworICAgIGludCB2ZWNfc3RyaWRlOworfSBEaXNhc0NvbnRleHQ7CisKK3N0YXRpYyB1aW50MzJfdCBnZW5fb3BjX2NvbmRleGVjX2JpdHNbT1BDX0JVRl9TSVpFXTsKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNkZWZpbmUgSVNfVVNFUihzKSAxCisjZWxzZQorI2RlZmluZSBJU19VU0VSKHMpIChzLT51c2VyKQorI2VuZGlmCisKKy8qIFRoZXNlIGluc3RydWN0aW9ucyB0cmFwIGFmdGVyIGV4ZWN1dGluZywgc28gZGVmZXIgdGhlbSB1bnRpbCBhZnRlciB0aGUKKyAgIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbnMgc3RhdGUgaGFzIGJlZW4gdXBkYXRlZC4gICovCisjZGVmaW5lIERJU0FTX1dGSSA0CisjZGVmaW5lIERJU0FTX1NXSSA1CisjZGVmaW5lIERJU0FTX1NNQyA2CisKK3N0YXRpYyBUQ0d2X3B0ciBjcHVfZW52OworLyogV2UgcmV1c2UgdGhlIHNhbWUgNjQtYml0IHRlbXBvcmFyaWVzIGZvciBlZmZpY2llbmN5LiAgKi8KK3N0YXRpYyBUQ0d2X2k2NCBjcHVfVjAsIGNwdV9WMSwgY3B1X00wOworc3RhdGljIFRDR3ZfaTMyIGNwdV9SWzE2XTsKK3N0YXRpYyBUQ0d2X2kzMiBjcHVfZXhjbHVzaXZlX2FkZHI7CitzdGF0aWMgVENHdl9pMzIgY3B1X2V4Y2x1c2l2ZV92YWw7CitzdGF0aWMgVENHdl9pMzIgY3B1X2V4Y2x1c2l2ZV9oaWdoOworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKK3N0YXRpYyBUQ0d2X2kzMiBjcHVfZXhjbHVzaXZlX3Rlc3Q7CitzdGF0aWMgVENHdl9pMzIgY3B1X2V4Y2x1c2l2ZV9pbmZvOworI2VuZGlmCisKKy8qIEZJWE1FOiAgVGhlc2Ugc2hvdWxkIGJlIHJlbW92ZWQuICAqLworc3RhdGljIFRDR3YgY3B1X0YwcywgY3B1X0YxczsKK3N0YXRpYyBUQ0d2X2k2NCBjcHVfRjBkLCBjcHVfRjFkOworCisjaW5jbHVkZSAiZXhlYy9nZW4taWNvdW50LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWduYW1lc1tdID0KKyAgICB7ICJyMCIsICJyMSIsICJyMiIsICJyMyIsICJyNCIsICJyNSIsICJyNiIsICJyNyIsCisgICAgICAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJwYyIgfTsKKworLyogaW5pdGlhbGl6ZSBUQ0cgZ2xvYmFscy4gICovCit2b2lkIGFybV90cmFuc2xhdGVfaW5pdCh2b2lkKQoreworICAgIGludCBpOworCisgICAgY3B1X2VudiA9IHRjZ19nbG9iYWxfcmVnX25ld19wdHIoVENHX0FSRUcwLCAiZW52Iik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBjcHVfUltpXSA9IHRjZ19nbG9iYWxfbWVtX25ld19pMzIoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIHJlZ3NbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbmFtZXNbaV0pOworICAgIH0KKyAgICBjcHVfZXhjbHVzaXZlX2FkZHIgPSB0Y2dfZ2xvYmFsX21lbV9uZXdfaTMyKFRDR19BUkVHMCwKKyAgICAgICAgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIGV4Y2x1c2l2ZV9hZGRyKSwgImV4Y2x1c2l2ZV9hZGRyIik7CisgICAgY3B1X2V4Y2x1c2l2ZV92YWwgPSB0Y2dfZ2xvYmFsX21lbV9uZXdfaTMyKFRDR19BUkVHMCwKKyAgICAgICAgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIGV4Y2x1c2l2ZV92YWwpLCAiZXhjbHVzaXZlX3ZhbCIpOworICAgIGNwdV9leGNsdXNpdmVfaGlnaCA9IHRjZ19nbG9iYWxfbWVtX25ld19pMzIoVENHX0FSRUcwLAorICAgICAgICBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgZXhjbHVzaXZlX2hpZ2gpLCAiZXhjbHVzaXZlX2hpZ2giKTsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgY3B1X2V4Y2x1c2l2ZV90ZXN0ID0gdGNnX2dsb2JhbF9tZW1fbmV3X2kzMihUQ0dfQVJFRzAsCisgICAgICAgIG9mZnNldG9mKENQVUFSTVN0YXRlLCBleGNsdXNpdmVfdGVzdCksICJleGNsdXNpdmVfdGVzdCIpOworICAgIGNwdV9leGNsdXNpdmVfaW5mbyA9IHRjZ19nbG9iYWxfbWVtX25ld19pMzIoVENHX0FSRUcwLAorICAgICAgICBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgZXhjbHVzaXZlX2luZm8pLCAiZXhjbHVzaXZlX2luZm8iKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIFRDR3YgbG9hZF9jcHVfb2Zmc2V0KGludCBvZmZzZXQpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9sZF9pMzIodG1wLCBjcHVfZW52LCBvZmZzZXQpOworICAgIHJldHVybiB0bXA7Cit9CisKKyNkZWZpbmUgbG9hZF9jcHVfZmllbGQobmFtZSkgbG9hZF9jcHVfb2Zmc2V0KG9mZnNldG9mKENQVUFSTVN0YXRlLCBuYW1lKSkKKworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX2NwdV9vZmZzZXQoVENHdiB2YXIsIGludCBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9zdF9pMzIodmFyLCBjcHVfZW52LCBvZmZzZXQpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHZhcik7Cit9CisKKyNkZWZpbmUgc3RvcmVfY3B1X2ZpZWxkKHZhciwgbmFtZSkgXAorICAgIHN0b3JlX2NwdV9vZmZzZXQodmFyLCBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgbmFtZSkpCisKKy8qIFNldCBhIHZhcmlhYmxlIHRvIHRoZSB2YWx1ZSBvZiBhIENQVSByZWdpc3Rlci4gICovCitzdGF0aWMgdm9pZCBsb2FkX3JlZ192YXIoRGlzYXNDb250ZXh0ICpzLCBUQ0d2IHZhciwgaW50IHJlZykKK3sKKyAgICBpZiAocmVnID09IDE1KSB7CisgICAgICAgIHVpbnQzMl90IGFkZHI7CisgICAgICAgIC8qIG5vcm1hbHksIHNpbmNlIHdlIHVwZGF0ZWQgUEMsIHdlIG5lZWQgb25seSB0byBhZGQgb25lIGluc24gKi8KKyAgICAgICAgaWYgKHMtPnRodW1iKQorICAgICAgICAgICAgYWRkciA9IChsb25nKXMtPnBjICsgMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWRkciA9IChsb25nKXMtPnBjICsgNDsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih2YXIsIGFkZHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMih2YXIsIGNwdV9SW3JlZ10pOworICAgIH0KK30KKworLyogQ3JlYXRlIGEgbmV3IHRlbXBvcmFyeSBhbmQgc2V0IGl0IHRvIHRoZSB2YWx1ZSBvZiBhIENQVSByZWdpc3Rlci4gICovCitzdGF0aWMgaW5saW5lIFRDR3YgbG9hZF9yZWcoRGlzYXNDb250ZXh0ICpzLCBpbnQgcmVnKQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIGxvYWRfcmVnX3ZhcihzLCB0bXAsIHJlZyk7CisgICAgcmV0dXJuIHRtcDsKK30KKworLyogU2V0IGEgQ1BVIHJlZ2lzdGVyLiAgVGhlIHNvdXJjZSBtdXN0IGJlIGEgdGVtcG9yYXJ5IGFuZCB3aWxsIGJlCisgICBtYXJrZWQgYXMgZGVhZC4gICovCitzdGF0aWMgdm9pZCBzdG9yZV9yZWcoRGlzYXNDb250ZXh0ICpzLCBpbnQgcmVnLCBUQ0d2IHZhcikKK3sKKyAgICBpZiAocmVnID09IDE1KSB7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodmFyLCB2YXIsIH4xKTsKKyAgICAgICAgcy0+aXNfam1wID0gRElTQVNfSlVNUDsKKyAgICB9CisgICAgdGNnX2dlbl9tb3ZfaTMyKGNwdV9SW3JlZ10sIHZhcik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodmFyKTsKK30KKworLyogVmFsdWUgZXh0ZW5zaW9ucy4gICovCisjZGVmaW5lIGdlbl91eHRiKHZhcikgdGNnX2dlbl9leHQ4dV9pMzIodmFyLCB2YXIpCisjZGVmaW5lIGdlbl91eHRoKHZhcikgdGNnX2dlbl9leHQxNnVfaTMyKHZhciwgdmFyKQorI2RlZmluZSBnZW5fc3h0Yih2YXIpIHRjZ19nZW5fZXh0OHNfaTMyKHZhciwgdmFyKQorI2RlZmluZSBnZW5fc3h0aCh2YXIpIHRjZ19nZW5fZXh0MTZzX2kzMih2YXIsIHZhcikKKworI2RlZmluZSBnZW5fc3h0YjE2KHZhcikgZ2VuX2hlbHBlcl9zeHRiMTYodmFyLCB2YXIpCisjZGVmaW5lIGdlbl91eHRiMTYodmFyKSBnZW5faGVscGVyX3V4dGIxNih2YXIsIHZhcikKKworCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3NldF9jcHNyKFRDR3YgdmFyLCB1aW50MzJfdCBtYXNrKQoreworICAgIFRDR3YgdG1wX21hc2sgPSB0Y2dfY29uc3RfaTMyKG1hc2spOworICAgIGdlbl9oZWxwZXJfY3Bzcl93cml0ZShjcHVfZW52LCB2YXIsIHRtcF9tYXNrKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXBfbWFzayk7Cit9CisvKiBTZXQgTlpDViBmbGFncyBmcm9tIHRoZSBoaWdoIDQgYml0cyBvZiB2YXIuICAqLworI2RlZmluZSBnZW5fc2V0X256Y3YodmFyKSBnZW5fc2V0X2Nwc3IodmFyLCBDUFNSX05aQ1YpCisKK3N0YXRpYyB2b2lkIGdlbl9leGNlcHRpb24oaW50IGV4Y3ApCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIGV4Y3ApOworICAgIGdlbl9oZWxwZXJfZXhjZXB0aW9uKGNwdV9lbnYsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX3NtdWxfZHVhbChUQ0d2IGEsIFRDR3YgYikKK3sKKyAgICBUQ0d2IHRtcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgVENHdiB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fZXh0MTZzX2kzMih0bXAxLCBhKTsKKyAgICB0Y2dfZ2VuX2V4dDE2c19pMzIodG1wMiwgYik7CisgICAgdGNnX2dlbl9tdWxfaTMyKHRtcDEsIHRtcDEsIHRtcDIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoYSwgYSwgMTYpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoYiwgYiwgMTYpOworICAgIHRjZ19nZW5fbXVsX2kzMihiLCBiLCBhKTsKKyAgICB0Y2dfZ2VuX21vdl9pMzIoYSwgdG1wMSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMSk7Cit9CisKKy8qIEJ5dGVzd2FwIGVhY2ggaGFsZndvcmQuICAqLworc3RhdGljIHZvaWQgZ2VuX3JldjE2KFRDR3YgdmFyKQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB2YXIsIDgpOworICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wLCB0bXAsIDB4MDBmZjAwZmYpOworICAgIHRjZ19nZW5fc2hsaV9pMzIodmFyLCB2YXIsIDgpOworICAgIHRjZ19nZW5fYW5kaV9pMzIodmFyLCB2YXIsIDB4ZmYwMGZmMDApOworICAgIHRjZ19nZW5fb3JfaTMyKHZhciwgdmFyLCB0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIEJ5dGVzd2FwIGxvdyBoYWxmd29yZCBhbmQgc2lnbiBleHRlbmQuICAqLworc3RhdGljIHZvaWQgZ2VuX3JldnNoKFRDR3YgdmFyKQoreworICAgIHRjZ19nZW5fZXh0MTZ1X2kzMih2YXIsIHZhcik7CisgICAgdGNnX2dlbl9ic3dhcDE2X2kzMih2YXIsIHZhcik7CisgICAgdGNnX2dlbl9leHQxNnNfaTMyKHZhciwgdmFyKTsKK30KKworLyogVW5zaWduZWQgYml0ZmllbGQgZXh0cmFjdC4gICovCitzdGF0aWMgdm9pZCBnZW5fdWJmeChUQ0d2IHZhciwgaW50IHNoaWZ0LCB1aW50MzJfdCBtYXNrKQoreworICAgIGlmIChzaGlmdCkKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih2YXIsIHZhciwgc2hpZnQpOworICAgIHRjZ19nZW5fYW5kaV9pMzIodmFyLCB2YXIsIG1hc2spOworfQorCisvKiBTaWduZWQgYml0ZmllbGQgZXh0cmFjdC4gICovCitzdGF0aWMgdm9pZCBnZW5fc2JmeChUQ0d2IHZhciwgaW50IHNoaWZ0LCBpbnQgd2lkdGgpCit7CisgICAgdWludDMyX3Qgc2lnbmJpdDsKKworICAgIGlmIChzaGlmdCkKKyAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih2YXIsIHZhciwgc2hpZnQpOworICAgIGlmIChzaGlmdCArIHdpZHRoIDwgMzIpIHsKKyAgICAgICAgc2lnbmJpdCA9IDF1IDw8ICh3aWR0aCAtIDEpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHZhciwgdmFyLCAoMXUgPDwgd2lkdGgpIC0gMSk7CisgICAgICAgIHRjZ19nZW5feG9yaV9pMzIodmFyLCB2YXIsIHNpZ25iaXQpOworICAgICAgICB0Y2dfZ2VuX3N1YmlfaTMyKHZhciwgdmFyLCBzaWduYml0KTsKKyAgICB9Cit9CisKKy8qIEJpdGZpZWxkIGluc2VydGlvbi4gIEluc2VydCB2YWwgaW50byBiYXNlLiAgQ2xvYmJlcnMgYmFzZSBhbmQgdmFsLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9iZmkoVENHdiBkZXN0LCBUQ0d2IGJhc2UsIFRDR3YgdmFsLCBpbnQgc2hpZnQsIHVpbnQzMl90IG1hc2spCit7CisgICAgdGNnX2dlbl9hbmRpX2kzMih2YWwsIHZhbCwgbWFzayk7CisgICAgdGNnX2dlbl9zaGxpX2kzMih2YWwsIHZhbCwgc2hpZnQpOworICAgIHRjZ19nZW5fYW5kaV9pMzIoYmFzZSwgYmFzZSwgfihtYXNrIDw8IHNoaWZ0KSk7CisgICAgdGNnX2dlbl9vcl9pMzIoZGVzdCwgYmFzZSwgdmFsKTsKK30KKworLyogUmV0dXJuIChiIDw8IDMyKSArIGEuIE1hcmsgaW5wdXRzIGFzIGRlYWQgKi8KK3N0YXRpYyBUQ0d2X2k2NCBnZW5fYWRkcV9tc3coVENHdl9pNjQgYSwgVENHdiBiKQoreworICAgIFRDR3ZfaTY0IHRtcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodG1wNjQsIGIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGIpOworICAgIHRjZ19nZW5fc2hsaV9pNjQodG1wNjQsIHRtcDY0LCAzMik7CisgICAgdGNnX2dlbl9hZGRfaTY0KGEsIHRtcDY0LCBhKTsKKworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDY0KTsKKyAgICByZXR1cm4gYTsKK30KKworLyogUmV0dXJuIChiIDw8IDMyKSAtIGEuIE1hcmsgaW5wdXRzIGFzIGRlYWQuICovCitzdGF0aWMgVENHdl9pNjQgZ2VuX3N1YnFfbXN3KFRDR3ZfaTY0IGEsIFRDR3YgYikKK3sKKyAgICBUQ0d2X2k2NCB0bXA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgIHRjZ19nZW5fZXh0dV9pMzJfaTY0KHRtcDY0LCBiKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihiKTsKKyAgICB0Y2dfZ2VuX3NobGlfaTY0KHRtcDY0LCB0bXA2NCwgMzIpOworICAgIHRjZ19nZW5fc3ViX2k2NChhLCB0bXA2NCwgYSk7CisKKyAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0bXA2NCk7CisgICAgcmV0dXJuIGE7Cit9CisKKy8qIEZJWE1FOiBNb3N0IHRhcmdldHMgaGF2ZSBuYXRpdmUgd2lkZW5pbmcgbXVsdGlwbGljYXRpb24uCisgICBJdCB3b3VsZCBiZSBnb29kIHRvIHVzZSB0aGF0IGluc3RlYWQgb2YgYSBmdWxsIHdpZGUgbXVsdGlwbHkuICAqLworLyogMzJ4MzItPjY0IG11bHRpcGx5LiAgTWFya3MgaW5wdXRzIGFzIGRlYWQuICAqLworc3RhdGljIFRDR3ZfaTY0IGdlbl9tdWx1X2k2NF9pMzIoVENHdiBhLCBUQ0d2IGIpCit7CisgICAgVENHdl9pNjQgdG1wMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICBUQ0d2X2k2NCB0bXAyID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodG1wMSwgYSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIoYSk7CisgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodG1wMiwgYik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIoYik7CisgICAgdGNnX2dlbl9tdWxfaTY0KHRtcDEsIHRtcDEsIHRtcDIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDIpOworICAgIHJldHVybiB0bXAxOworfQorCitzdGF0aWMgVENHdl9pNjQgZ2VuX211bHNfaTY0X2kzMihUQ0d2IGEsIFRDR3YgYikKK3sKKyAgICBUQ0d2X2k2NCB0bXAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgIFRDR3ZfaTY0IHRtcDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KHRtcDEsIGEpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGEpOworICAgIHRjZ19nZW5fZXh0X2kzMl9pNjQodG1wMiwgYik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIoYik7CisgICAgdGNnX2dlbl9tdWxfaTY0KHRtcDEsIHRtcDEsIHRtcDIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDIpOworICAgIHJldHVybiB0bXAxOworfQorCisvKiBTd2FwIGxvdyBhbmQgaGlnaCBoYWxmd29yZHMuICAqLworc3RhdGljIHZvaWQgZ2VuX3N3YXBfaGFsZihUQ0d2IHZhcikKK3sKKyAgICBUQ0d2IHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICB0Y2dfZ2VuX3NocmlfaTMyKHRtcCwgdmFyLCAxNik7CisgICAgdGNnX2dlbl9zaGxpX2kzMih2YXIsIHZhciwgMTYpOworICAgIHRjZ19nZW5fb3JfaTMyKHZhciwgdmFyLCB0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIER1YWwgMTYtYml0IGFkZC4gIFJlc3VsdCBwbGFjZWQgaW4gdDAgYW5kIHQxIGlzIG1hcmtlZCBhcyBkZWFkLgorICAgIHRtcCA9ICh0MCBeIHQxKSAmIDB4ODAwMDsKKyAgICB0MCAmPSB+MHg4MDAwOworICAgIHQxICY9IH4weDgwMDA7CisgICAgdDAgPSAodDAgKyB0MSkgXiB0bXA7CisgKi8KKworc3RhdGljIHZvaWQgZ2VuX2FkZDE2KFRDR3YgdDAsIFRDR3YgdDEpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl94b3JfaTMyKHRtcCwgdDAsIHQxKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdG1wLCAweDgwMDApOworICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIHQwLCB+MHg4MDAwKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQxLCB0MSwgfjB4ODAwMCk7CisgICAgdGNnX2dlbl9hZGRfaTMyKHQwLCB0MCwgdDEpOworICAgIHRjZ19nZW5feG9yX2kzMih0MCwgdDAsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7Cit9CisKKyNkZWZpbmUgZ2VuX3NldF9DRih2YXIpIHRjZ19nZW5fc3RfaTMyKHZhciwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIENGKSkKKworLyogU2V0IENGIHRvIHRoZSB0b3AgYml0IG9mIHZhci4gICovCitzdGF0aWMgdm9pZCBnZW5fc2V0X0NGX2JpdDMxKFRDR3YgdmFyKQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB2YXIsIDMxKTsKKyAgICBnZW5fc2V0X0NGKHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworLyogU2V0IE4gYW5kIFogZmxhZ3MgZnJvbSB2YXIuICAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbl9sb2dpY19DQyhUQ0d2IHZhcikKK3sKKyAgICB0Y2dfZ2VuX3N0X2kzMih2YXIsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCBORikpOworICAgIHRjZ19nZW5fc3RfaTMyKHZhciwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIFpGKSk7Cit9CisKKy8qIFQwICs9IFQxICsgQ0YuICAqLworc3RhdGljIHZvaWQgZ2VuX2FkYyhUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIFRDR3YgdG1wOworICAgIHRjZ19nZW5fYWRkX2kzMih0MCwgdDAsIHQxKTsKKyAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChDRik7CisgICAgdGNnX2dlbl9hZGRfaTMyKHQwLCB0MCwgdG1wKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworfQorCisvKiBkZXN0ID0gVDAgKyBUMSArIENGLiAqLworc3RhdGljIHZvaWQgZ2VuX2FkZF9jYXJyeShUQ0d2IGRlc3QsIFRDR3YgdDAsIFRDR3YgdDEpCit7CisgICAgVENHdiB0bXA7CisgICAgdGNnX2dlbl9hZGRfaTMyKGRlc3QsIHQwLCB0MSk7CisgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoQ0YpOworICAgIHRjZ19nZW5fYWRkX2kzMihkZXN0LCBkZXN0LCB0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIGRlc3QgPSBUMCAtIFQxICsgQ0YgLSAxLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9zdWJfY2FycnkoVENHdiBkZXN0LCBUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIFRDR3YgdG1wOworICAgIHRjZ19nZW5fc3ViX2kzMihkZXN0LCB0MCwgdDEpOworICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKENGKTsKKyAgICB0Y2dfZ2VuX2FkZF9pMzIoZGVzdCwgZGVzdCwgdG1wKTsKKyAgICB0Y2dfZ2VuX3N1YmlfaTMyKGRlc3QsIGRlc3QsIDEpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIEZJWE1FOiAgSW1wbGVtZW50IHRoaXMgbmF0aXZlbHkuICAqLworI2RlZmluZSB0Y2dfZ2VuX2Fic19pMzIodDAsIHQxKSBnZW5faGVscGVyX2Ficyh0MCwgdDEpCisKK3N0YXRpYyB2b2lkIHNoaWZ0ZXJfb3V0X2ltKFRDR3YgdmFyLCBpbnQgc2hpZnQpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgaWYgKHNoaWZ0ID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHZhciwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0bXAsIHZhciwgc2hpZnQpOworICAgICAgICBpZiAoc2hpZnQgIT0gMzEpCisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdG1wLCAxKTsKKyAgICB9CisgICAgZ2VuX3NldF9DRih0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIFNoaWZ0IGJ5IGltbWVkaWF0ZS4gIEluY2x1ZGVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHNoaWZ0ID09IDAuICAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbl9hcm1fc2hpZnRfaW0oVENHdiB2YXIsIGludCBzaGlmdG9wLCBpbnQgc2hpZnQsIGludCBmbGFncykKK3sKKyAgICBzd2l0Y2ggKHNoaWZ0b3ApIHsKKyAgICBjYXNlIDA6IC8qIExTTCAqLworICAgICAgICBpZiAoc2hpZnQgIT0gMCkgeworICAgICAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICAgICAgICAgIHNoaWZ0ZXJfb3V0X2ltKHZhciwgMzIgLSBzaGlmdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHZhciwgdmFyLCBzaGlmdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOiAvKiBMU1IgKi8KKyAgICAgICAgaWYgKHNoaWZ0ID09IDApIHsKKyAgICAgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodmFyLCB2YXIsIDMxKTsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X0NGKHZhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHZhciwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MpCisgICAgICAgICAgICAgICAgc2hpZnRlcl9vdXRfaW0odmFyLCBzaGlmdCAtIDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih2YXIsIHZhciwgc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjogLyogQVNSICovCisgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgc2hpZnQgPSAzMjsKKyAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICAgICAgc2hpZnRlcl9vdXRfaW0odmFyLCBzaGlmdCAtIDEpOworICAgICAgICBpZiAoc2hpZnQgPT0gMzIpCisgICAgICAgICAgc2hpZnQgPSAzMTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih2YXIsIHZhciwgc2hpZnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8qIFJPUi9SUlggKi8KKyAgICAgICAgaWYgKHNoaWZ0ICE9IDApIHsKKyAgICAgICAgICAgIGlmIChmbGFncykKKyAgICAgICAgICAgICAgICBzaGlmdGVyX291dF9pbSh2YXIsIHNoaWZ0IC0gMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3JvdHJpX2kzMih2YXIsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRDR3YgdG1wID0gbG9hZF9jcHVfZmllbGQoQ0YpOworICAgICAgICAgICAgaWYgKGZsYWdzKQorICAgICAgICAgICAgICAgIHNoaWZ0ZXJfb3V0X2ltKHZhciwgMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHZhciwgdmFyLCAxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wLCB0bXAsIDMxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHZhciwgdmFyLCB0bXApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgfQorICAgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fYXJtX3NoaWZ0X3JlZyhUQ0d2IHZhciwgaW50IHNoaWZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdiBzaGlmdCwgaW50IGZsYWdzKQoreworICAgIGlmIChmbGFncykgeworICAgICAgICBzd2l0Y2ggKHNoaWZ0b3ApIHsKKyAgICAgICAgY2FzZSAwOiBnZW5faGVscGVyX3NobF9jYyh2YXIsIGNwdV9lbnYsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiBnZW5faGVscGVyX3Nocl9jYyh2YXIsIGNwdV9lbnYsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX3Nhcl9jYyh2YXIsIGNwdV9lbnYsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBnZW5faGVscGVyX3Jvcl9jYyh2YXIsIGNwdV9lbnYsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoc2hpZnRvcCkgeworICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfc2hsKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfc2hyKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICBjYXNlIDI6IGdlbl9oZWxwZXJfc2FyKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICBjYXNlIDM6IHRjZ19nZW5fYW5kaV9pMzIoc2hpZnQsIHNoaWZ0LCAweDFmKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3JvdHJfaTMyKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHNoaWZ0KTsKK30KKworI2RlZmluZSBQQVNfT1AocGZ4KSBcCisgICAgc3dpdGNoIChvcDIpIHsgIFwKKyAgICBjYXNlIDA6IGdlbl9wYXNfaGVscGVyKGdsdWUocGZ4LGFkZDE2KSk7IGJyZWFrOyBcCisgICAgY2FzZSAxOiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxhZGRzdWJ4KSk7IGJyZWFrOyBcCisgICAgY2FzZSAyOiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxzdWJhZGR4KSk7IGJyZWFrOyBcCisgICAgY2FzZSAzOiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxzdWIxNikpOyBicmVhazsgXAorICAgIGNhc2UgNDogZ2VuX3Bhc19oZWxwZXIoZ2x1ZShwZngsYWRkOCkpOyBicmVhazsgXAorICAgIGNhc2UgNzogZ2VuX3Bhc19oZWxwZXIoZ2x1ZShwZngsc3ViOCkpOyBicmVhazsgXAorICAgIH0KK3N0YXRpYyB2b2lkIGdlbl9hcm1fcGFyYWxsZWxfYWRkc3ViKGludCBvcDEsIGludCBvcDIsIFRDR3YgYSwgVENHdiBiKQoreworICAgIFRDR3ZfcHRyIHRtcDsKKworICAgIHN3aXRjaCAob3AxKSB7CisjZGVmaW5lIGdlbl9wYXNfaGVscGVyKG5hbWUpIGdsdWUoZ2VuX2hlbHBlcl8sbmFtZSkoYSwgYSwgYiwgdG1wKQorICAgIGNhc2UgMToKKyAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X3B0cigpOworICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKHRtcCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIEdFKSk7CisgICAgICAgIFBBU19PUChzKQorICAgICAgICB0Y2dfdGVtcF9mcmVlX3B0cih0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19wdHIoKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX3B0cih0bXAsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCBHRSkpOworICAgICAgICBQQVNfT1AodSkKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIodG1wKTsKKyAgICAgICAgYnJlYWs7CisjdW5kZWYgZ2VuX3Bhc19oZWxwZXIKKyNkZWZpbmUgZ2VuX3Bhc19oZWxwZXIobmFtZSkgZ2x1ZShnZW5faGVscGVyXyxuYW1lKShhLCBhLCBiKQorICAgIGNhc2UgMjoKKyAgICAgICAgUEFTX09QKHEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIFBBU19PUChzaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgUEFTX09QKHVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBQQVNfT1AodWgpOworICAgICAgICBicmVhazsKKyN1bmRlZiBnZW5fcGFzX2hlbHBlcgorICAgIH0KK30KKyN1bmRlZiBQQVNfT1AKKworLyogRm9yIHVua25vd24gcmVhc29ucyBBcm0gYW5kIFRodW1iLTIgdXNlIGFyYml0cmFyaWx5IGRpZmZlcmVudCBlbmNvZGluZ3MuICAqLworI2RlZmluZSBQQVNfT1AocGZ4KSBcCisgICAgc3dpdGNoIChvcDEpIHsgIFwKKyAgICBjYXNlIDA6IGdlbl9wYXNfaGVscGVyKGdsdWUocGZ4LGFkZDgpKTsgYnJlYWs7IFwKKyAgICBjYXNlIDE6IGdlbl9wYXNfaGVscGVyKGdsdWUocGZ4LGFkZDE2KSk7IGJyZWFrOyBcCisgICAgY2FzZSAyOiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxhZGRzdWJ4KSk7IGJyZWFrOyBcCisgICAgY2FzZSA0OiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxzdWI4KSk7IGJyZWFrOyBcCisgICAgY2FzZSA1OiBnZW5fcGFzX2hlbHBlcihnbHVlKHBmeCxzdWIxNikpOyBicmVhazsgXAorICAgIGNhc2UgNjogZ2VuX3Bhc19oZWxwZXIoZ2x1ZShwZngsc3ViYWRkeCkpOyBicmVhazsgXAorICAgIH0KK3N0YXRpYyB2b2lkIGdlbl90aHVtYjJfcGFyYWxsZWxfYWRkc3ViKGludCBvcDEsIGludCBvcDIsIFRDR3YgYSwgVENHdiBiKQoreworICAgIFRDR3ZfcHRyIHRtcDsKKworICAgIHN3aXRjaCAob3AyKSB7CisjZGVmaW5lIGdlbl9wYXNfaGVscGVyKG5hbWUpIGdsdWUoZ2VuX2hlbHBlcl8sbmFtZSkoYSwgYSwgYiwgdG1wKQorICAgIGNhc2UgMDoKKyAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X3B0cigpOworICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKHRtcCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIEdFKSk7CisgICAgICAgIFBBU19PUChzKQorICAgICAgICB0Y2dfdGVtcF9mcmVlX3B0cih0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19wdHIoKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX3B0cih0bXAsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCBHRSkpOworICAgICAgICBQQVNfT1AodSkKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIodG1wKTsKKyAgICAgICAgYnJlYWs7CisjdW5kZWYgZ2VuX3Bhc19oZWxwZXIKKyNkZWZpbmUgZ2VuX3Bhc19oZWxwZXIobmFtZSkgZ2x1ZShnZW5faGVscGVyXyxuYW1lKShhLCBhLCBiKQorICAgIGNhc2UgMToKKyAgICAgICAgUEFTX09QKHEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIFBBU19PUChzaCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgUEFTX09QKHVxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBQQVNfT1AodWgpOworICAgICAgICBicmVhazsKKyN1bmRlZiBnZW5fcGFzX2hlbHBlcgorICAgIH0KK30KKyN1bmRlZiBQQVNfT1AKKworc3RhdGljIHZvaWQgZ2VuX3Rlc3RfY2MoaW50IGNjLCBpbnQgbGFiZWwpCit7CisgICAgVENHdiB0bXA7CisgICAgVENHdiB0bXAyOworICAgIGludCBpbnY7CisKKyAgICBzd2l0Y2ggKGNjKSB7CisgICAgY2FzZSAwOiAvKiBlcTogWiAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChaRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfRVEsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIG5lOiAhWiAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChaRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfTkUsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIGNzOiBDICovCisgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKENGKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9ORSwgdG1wLCAwLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzogLyogY2M6ICFDICovCisgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKENGKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9FUSwgdG1wLCAwLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDogLyogbWk6IE4gKi8KKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoTkYpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0xULCB0bXAsIDAsIGxhYmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OiAvKiBwbDogIU4gKi8KKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoTkYpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0dFLCB0bXAsIDAsIGxhYmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiAvKiB2czogViAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChWRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfTFQsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6IC8qIHZjOiAhViAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChWRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfR0UsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6IC8qIGhpOiBDICYmICFaICovCisgICAgICAgIGludiA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoQ0YpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0VRLCB0bXAsIDAsIGludik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKFpGKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9ORSwgdG1wLCAwLCBsYWJlbCk7CisgICAgICAgIGdlbl9zZXRfbGFiZWwoaW52KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OiAvKiBsczogIUMgfHwgWiAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChDRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfRVEsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChaRik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfRVEsIHRtcCwgMCwgbGFiZWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwOiAvKiBnZTogTiA9PSBWIC0+IE4gXiBWID09IDAgKi8KKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoVkYpOworICAgICAgICB0bXAyID0gbG9hZF9jcHVfZmllbGQoTkYpOworICAgICAgICB0Y2dfZ2VuX3hvcl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9HRSwgdG1wLCAwLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6IC8qIGx0OiBOICE9IFYgLT4gTiBeIFYgIT0gMCAqLworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChWRik7CisgICAgICAgIHRtcDIgPSBsb2FkX2NwdV9maWVsZChORik7CisgICAgICAgIHRjZ19nZW5feG9yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0xULCB0bXAsIDAsIGxhYmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjogLyogZ3Q6ICFaICYmIE4gPT0gViAqLworICAgICAgICBpbnYgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKFpGKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9FUSwgdG1wLCAwLCBpbnYpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChWRik7CisgICAgICAgIHRtcDIgPSBsb2FkX2NwdV9maWVsZChORik7CisgICAgICAgIHRjZ19nZW5feG9yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0dFLCB0bXAsIDAsIGxhYmVsKTsKKyAgICAgICAgZ2VuX3NldF9sYWJlbChpbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEzOiAvKiBsZTogWiB8fCBOICE9IFYgKi8KKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoWkYpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKFRDR19DT05EX0VRLCB0bXAsIDAsIGxhYmVsKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoVkYpOworICAgICAgICB0bXAyID0gbG9hZF9jcHVfZmllbGQoTkYpOworICAgICAgICB0Y2dfZ2VuX3hvcl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9MVCwgdG1wLCAwLCBsYWJlbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGNvbmRpdGlvbiBjb2RlIDB4JXhcbiIsIGNjKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGVfbG9naWNfY2NbMTZdID0geworICAgIDEsIC8qIGFuZCAqLworICAgIDEsIC8qIHhvciAqLworICAgIDAsIC8qIHN1YiAqLworICAgIDAsIC8qIHJzYiAqLworICAgIDAsIC8qIGFkZCAqLworICAgIDAsIC8qIGFkYyAqLworICAgIDAsIC8qIHNiYyAqLworICAgIDAsIC8qIHJzYyAqLworICAgIDEsIC8qIGFuZGwgKi8KKyAgICAxLCAvKiB4b3JsICovCisgICAgMCwgLyogY21wICovCisgICAgMCwgLyogY21uICovCisgICAgMSwgLyogb3JyICovCisgICAgMSwgLyogbW92ICovCisgICAgMSwgLyogYmljICovCisgICAgMSwgLyogbXZuICovCit9OworCisvKiBTZXQgUEMgYW5kIFRodW1iIHN0YXRlIGZyb20gYW4gaW1tZWRpYXRlIGFkZHJlc3MuICAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbl9ieF9pbShEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IGFkZHIpCit7CisgICAgVENHdiB0bXA7CisKKyAgICBzLT5pc19qbXAgPSBESVNBU19VUERBVEU7CisgICAgaWYgKHMtPnRodW1iICE9IChhZGRyICYgMSkpIHsKKyAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcCwgYWRkciAmIDEpOworICAgICAgICB0Y2dfZ2VuX3N0X2kzMih0bXAsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCB0aHVtYikpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgIH0KKyAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9SWzE1XSwgYWRkciAmIH4xKTsKK30KKworLyogU2V0IFBDIGFuZCBUaHVtYiBzdGF0ZSBmcm9tIHZhci4gIHZhciBpcyBtYXJrZWQgYXMgZGVhZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2J4KERpc2FzQ29udGV4dCAqcywgVENHdiB2YXIpCit7CisgICAgcy0+aXNfam1wID0gRElTQVNfVVBEQVRFOworICAgIHRjZ19nZW5fYW5kaV9pMzIoY3B1X1JbMTVdLCB2YXIsIH4xKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHZhciwgdmFyLCAxKTsKKyAgICBzdG9yZV9jcHVfZmllbGQodmFyLCB0aHVtYik7Cit9CisKKy8qIFZhcmlhbnQgb2Ygc3RvcmVfcmVnIHdoaWNoIHVzZXMgYnJhbmNoJmV4Y2hhbmdlIGxvZ2ljIHdoZW4gc3RvcmluZworICAgdG8gcjE1IGluIEFSTSBhcmNoaXRlY3R1cmUgdjcgYW5kIGFib3ZlLiBUaGUgc291cmNlIG11c3QgYmUgYSB0ZW1wb3JhcnkKKyAgIGFuZCB3aWxsIGJlIG1hcmtlZCBhcyBkZWFkLiAqLworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX3JlZ19ieChDUFVBUk1TdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWcsIFRDR3YgdmFyKQoreworICAgIGlmIChyZWcgPT0gMTUgJiYgRU5BQkxFX0FSQ0hfNykgeworICAgICAgICBnZW5fYngocywgdmFyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdG9yZV9yZWcocywgcmVnLCB2YXIpOworICAgIH0KK30KKworLyogVmFyaWFudCBvZiBzdG9yZV9yZWcgd2hpY2ggdXNlcyBicmFuY2gmZXhjaGFuZ2UgbG9naWMgd2hlbiBzdG9yaW5nCisgKiB0byByMTUgaW4gQVJNIGFyY2hpdGVjdHVyZSB2NVQgYW5kIGFib3ZlLiBUaGlzIGlzIHVzZWQgZm9yIHN0b3JpbmcKKyAqIHRoZSByZXN1bHRzIG9mIGEgTERSL0xETS9QT1AgaW50byByMTUsIGFuZCBjb3JyZXNwb25kcyB0byB0aGUgY2FzZXMKKyAqIGluIHRoZSBBUk0gQVJNIHdoaWNoIHVzZSB0aGUgTG9hZFdyaXRlUEMoKSBwc2V1ZG9jb2RlIGZ1bmN0aW9uLiAqLworc3RhdGljIGlubGluZSB2b2lkIHN0b3JlX3JlZ19mcm9tX2xvYWQoQ1BVQVJNU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVnLCBUQ0d2IHZhcikKK3sKKyAgICBpZiAocmVnID09IDE1ICYmIEVOQUJMRV9BUkNIXzUpIHsKKyAgICAgICAgZ2VuX2J4KHMsIHZhcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcmVfcmVnKHMsIHJlZywgdmFyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc21jKENQVUFSTVN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcykKK3sKKyAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9SWzE1XSwgcy0+cGMpOworICAgIHMtPmlzX2ptcCA9IERJU0FTX1NNQzsKK30KKworc3RhdGljIGlubGluZSBUQ0d2IGdlbl9sZDhzKFRDR3YgYWRkciwgaW50IGluZGV4KQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fcWVtdV9sZDhzKHRtcCwgYWRkciwgaW5kZXgpOworICAgIHJldHVybiB0bXA7Cit9CitzdGF0aWMgaW5saW5lIFRDR3YgZ2VuX2xkOHUoVENHdiBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9xZW11X2xkOHUodG1wLCBhZGRyLCBpbmRleCk7CisgICAgcmV0dXJuIHRtcDsKK30KK3N0YXRpYyBpbmxpbmUgVENHdiBnZW5fbGQxNnMoVENHdiBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9xZW11X2xkMTZzKHRtcCwgYWRkciwgaW5kZXgpOworICAgIHJldHVybiB0bXA7Cit9CitzdGF0aWMgaW5saW5lIFRDR3YgZ2VuX2xkMTZ1KFRDR3YgYWRkciwgaW50IGluZGV4KQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fcWVtdV9sZDE2dSh0bXAsIGFkZHIsIGluZGV4KTsKKyAgICByZXR1cm4gdG1wOworfQorc3RhdGljIGlubGluZSBUQ0d2IGdlbl9sZDMyKFRDR3YgYWRkciwgaW50IGluZGV4KQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fcWVtdV9sZDMydSh0bXAsIGFkZHIsIGluZGV4KTsKKyAgICByZXR1cm4gdG1wOworfQorI2lmIDAKK3N0YXRpYyBpbmxpbmUgVENHdl9pNjQgZ2VuX2xkNjQoVENHdiBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgVENHdl9pNjQgdG1wID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgIHRjZ19nZW5fcWVtdV9sZDY0KHRtcCwgYWRkciwgaW5kZXgpOworICAgIHJldHVybiB0bXA7Cit9CisjZW5kaWYKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3Q4KFRDR3YgdmFsLCBUQ0d2IGFkZHIsIGludCBpbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfc3Q4KHZhbCwgYWRkciwgaW5kZXgpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHZhbCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0MTYoVENHdiB2YWwsIFRDR3YgYWRkciwgaW50IGluZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9zdDE2KHZhbCwgYWRkciwgaW5kZXgpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHZhbCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0MzIoVENHdiB2YWwsIFRDR3YgYWRkciwgaW50IGluZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9zdDMyKHZhbCwgYWRkciwgaW5kZXgpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHZhbCk7Cit9CisjaWYgMAorc3RhdGljIGlubGluZSB2b2lkIGdlbl9zdDY0KFRDR3ZfaTY0IHZhbCwgVENHdiBhZGRyLCBpbnQgaW5kZXgpCit7CisgICAgdGNnX2dlbl9xZW11X3N0NjQodmFsLCBhZGRyLCBpbmRleCk7CisgICAgdGNnX3RlbXBfZnJlZV9pNjQodmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3NldF9wY19pbSh1aW50MzJfdCB2YWwpCit7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfUlsxNV0sIHZhbCk7Cit9CisKKy8qIEZvcmNlIGEgVEIgbG9va3VwIGFmdGVyIGFuIGluc3RydWN0aW9uIHRoYXQgY2hhbmdlcyB0aGUgQ1BVIHN0YXRlLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbG9va3VwX3RiKERpc2FzQ29udGV4dCAqcykKK3sKKyAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9SWzE1XSwgcy0+cGMgJiB+MSk7CisgICAgcy0+aXNfam1wID0gRElTQVNfVVBEQVRFOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2FkZF9kYXRhX29mZnNldChEaXNhc0NvbnRleHQgKnMsIHVuc2lnbmVkIGludCBpbnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdiB2YXIpCit7CisgICAgaW50IHZhbCwgcm0sIHNoaWZ0LCBzaGlmdG9wOworICAgIFRDR3Ygb2Zmc2V0OworCisgICAgaWYgKCEoaW5zbiAmICgxIDw8IDI1KSkpIHsKKyAgICAgICAgLyogaW1tZWRpYXRlICovCisgICAgICAgIHZhbCA9IGluc24gJiAweGZmZjsKKyAgICAgICAgaWYgKCEoaW5zbiAmICgxIDw8IDIzKSkpCisgICAgICAgICAgICB2YWwgPSAtdmFsOworICAgICAgICBpZiAodmFsICE9IDApCisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHZhciwgdmFyLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNoaWZ0L3JlZ2lzdGVyICovCisgICAgICAgIHJtID0gKGluc24pICYgMHhmOworICAgICAgICBzaGlmdCA9IChpbnNuID4+IDcpICYgMHgxZjsKKyAgICAgICAgc2hpZnRvcCA9IChpbnNuID4+IDUpICYgMzsKKyAgICAgICAgb2Zmc2V0ID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICBnZW5fYXJtX3NoaWZ0X2ltKG9mZnNldCwgc2hpZnRvcCwgc2hpZnQsIDApOworICAgICAgICBpZiAoIShpbnNuICYgKDEgPDwgMjMpKSkKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX2kzMih2YXIsIHZhciwgb2Zmc2V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHZhciwgdmFyLCBvZmZzZXQpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihvZmZzZXQpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9hZGRfZGF0YWhfb2Zmc2V0KERpc2FzQ29udGV4dCAqcywgdW5zaWduZWQgaW50IGluc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dHJhLCBUQ0d2IHZhcikKK3sKKyAgICBpbnQgdmFsLCBybTsKKyAgICBUQ0d2IG9mZnNldDsKKworICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgIC8qIGltbWVkaWF0ZSAqLworICAgICAgICB2YWwgPSAoaW5zbiAmIDB4ZikgfCAoKGluc24gPj4gNCkgJiAweGYwKTsKKyAgICAgICAgaWYgKCEoaW5zbiAmICgxIDw8IDIzKSkpCisgICAgICAgICAgICB2YWwgPSAtdmFsOworICAgICAgICB2YWwgKz0gZXh0cmE7CisgICAgICAgIGlmICh2YWwgIT0gMCkKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIodmFyLCB2YXIsIHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKGV4dHJhKQorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMih2YXIsIHZhciwgZXh0cmEpOworICAgICAgICBybSA9IChpbnNuKSAmIDB4ZjsKKyAgICAgICAgb2Zmc2V0ID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICBpZiAoIShpbnNuICYgKDEgPDwgMjMpKSkKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX2kzMih2YXIsIHZhciwgb2Zmc2V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHZhciwgdmFyLCBvZmZzZXQpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihvZmZzZXQpOworICAgIH0KK30KKworc3RhdGljIFRDR3ZfcHRyIGdldF9mcHN0YXR1c19wdHIoaW50IG5lb24pCit7CisgICAgVENHdl9wdHIgc3RhdHVzcHRyID0gdGNnX3RlbXBfbmV3X3B0cigpOworICAgIGludCBvZmZzZXQ7CisgICAgaWYgKG5lb24pIHsKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIHZmcC5zdGFuZGFyZF9mcF9zdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNldCA9IG9mZnNldG9mKENQVUFSTVN0YXRlLCB2ZnAuZnBfc3RhdHVzKTsKKyAgICB9CisgICAgdGNnX2dlbl9hZGRpX3B0cihzdGF0dXNwdHIsIGNwdV9lbnYsIG9mZnNldCk7CisgICAgcmV0dXJuIHN0YXR1c3B0cjsKK30KKworI2RlZmluZSBWRlBfT1AyKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwXyMjbmFtZShpbnQgZHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRDR3ZfcHRyIGZwc3QgPSBnZXRfZnBzdGF0dXNfcHRyKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZHApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdlbl9oZWxwZXJfdmZwXyMjbmFtZSMjZChjcHVfRjBkLCBjcHVfRjBkLCBjcHVfRjFkLCBmcHN0KTsgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfIyNuYW1lIyNzKGNwdV9GMHMsIGNwdV9GMHMsIGNwdV9GMXMsIGZwc3QpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVkZQX09QMihhZGQpCitWRlBfT1AyKHN1YikKK1ZGUF9PUDIobXVsKQorVkZQX09QMihkaXYpCisKKyN1bmRlZiBWRlBfT1AyCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwX0YxX211bChpbnQgZHApCit7CisgICAgLyogTGlrZSBnZW5fdmZwX211bCgpIGJ1dCBwdXQgcmVzdWx0IGluIEYxICovCisgICAgVENHdl9wdHIgZnBzdCA9IGdldF9mcHN0YXR1c19wdHIoMCk7CisgICAgaWYgKGRwKSB7CisgICAgICAgIGdlbl9oZWxwZXJfdmZwX211bGQoY3B1X0YxZCwgY3B1X0YwZCwgY3B1X0YxZCwgZnBzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfbXVscyhjcHVfRjFzLCBjcHVfRjBzLCBjcHVfRjFzLCBmcHN0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwX0YxX25lZyhpbnQgZHApCit7CisgICAgLyogTGlrZSBnZW5fdmZwX25lZygpIGJ1dCBwdXQgcmVzdWx0IGluIEYxICovCisgICAgaWYgKGRwKSB7CisgICAgICAgIGdlbl9oZWxwZXJfdmZwX25lZ2QoY3B1X0YxZCwgY3B1X0YwZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfbmVncyhjcHVfRjFzLCBjcHVfRjBzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwX2FicyhpbnQgZHApCit7CisgICAgaWYgKGRwKQorICAgICAgICBnZW5faGVscGVyX3ZmcF9hYnNkKGNwdV9GMGQsIGNwdV9GMGQpOworICAgIGVsc2UKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfYWJzcyhjcHVfRjBzLCBjcHVfRjBzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl92ZnBfbmVnKGludCBkcCkKK3sKKyAgICBpZiAoZHApCisgICAgICAgIGdlbl9oZWxwZXJfdmZwX25lZ2QoY3B1X0YwZCwgY3B1X0YwZCk7CisgICAgZWxzZQorICAgICAgICBnZW5faGVscGVyX3ZmcF9uZWdzKGNwdV9GMHMsIGNwdV9GMHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3ZmcF9zcXJ0KGludCBkcCkKK3sKKyAgICBpZiAoZHApCisgICAgICAgIGdlbl9oZWxwZXJfdmZwX3NxcnRkKGNwdV9GMGQsIGNwdV9GMGQsIGNwdV9lbnYpOworICAgIGVsc2UKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfc3FydHMoY3B1X0YwcywgY3B1X0YwcywgY3B1X2Vudik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwX2NtcChpbnQgZHApCit7CisgICAgaWYgKGRwKQorICAgICAgICBnZW5faGVscGVyX3ZmcF9jbXBkKGNwdV9GMGQsIGNwdV9GMWQsIGNwdV9lbnYpOworICAgIGVsc2UKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfY21wcyhjcHVfRjBzLCBjcHVfRjFzLCBjcHVfZW52KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl92ZnBfY21wZShpbnQgZHApCit7CisgICAgaWYgKGRwKQorICAgICAgICBnZW5faGVscGVyX3ZmcF9jbXBlZChjcHVfRjBkLCBjcHVfRjFkLCBjcHVfZW52KTsKKyAgICBlbHNlCisgICAgICAgIGdlbl9oZWxwZXJfdmZwX2NtcGVzKGNwdV9GMHMsIGNwdV9GMXMsIGNwdV9lbnYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3ZmcF9GMV9sZDAoaW50IGRwKQoreworICAgIGlmIChkcCkKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2k2NChjcHVfRjFkLCAwKTsKKyAgICBlbHNlCisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X0YxcywgMCk7Cit9CisKKyNkZWZpbmUgVkZQX0dFTl9JVE9GKG5hbWUpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fdmZwXyMjbmFtZShpbnQgZHAsIGludCBuZW9uKSBcCit7IFwKKyAgICBUQ0d2X3B0ciBzdGF0dXNwdHIgPSBnZXRfZnBzdGF0dXNfcHRyKG5lb24pOyBcCisgICAgaWYgKGRwKSB7IFwKKyAgICAgICAgZ2VuX2hlbHBlcl92ZnBfIyNuYW1lIyNkKGNwdV9GMGQsIGNwdV9GMHMsIHN0YXR1c3B0cik7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGdlbl9oZWxwZXJfdmZwXyMjbmFtZSMjcyhjcHVfRjBzLCBjcHVfRjBzLCBzdGF0dXNwdHIpOyBcCisgICAgfSBcCisgICAgdGNnX3RlbXBfZnJlZV9wdHIoc3RhdHVzcHRyKTsgXAorfQorCitWRlBfR0VOX0lUT0YodWl0bykKK1ZGUF9HRU5fSVRPRihzaXRvKQorI3VuZGVmIFZGUF9HRU5fSVRPRgorCisjZGVmaW5lIFZGUF9HRU5fRlRPSShuYW1lKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3ZmcF8jI25hbWUoaW50IGRwLCBpbnQgbmVvbikgXAoreyBcCisgICAgVENHdl9wdHIgc3RhdHVzcHRyID0gZ2V0X2Zwc3RhdHVzX3B0cihuZW9uKTsgXAorICAgIGlmIChkcCkgeyBcCisgICAgICAgIGdlbl9oZWxwZXJfdmZwXyMjbmFtZSMjZChjcHVfRjBzLCBjcHVfRjBkLCBzdGF0dXNwdHIpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBnZW5faGVscGVyX3ZmcF8jI25hbWUjI3MoY3B1X0YwcywgY3B1X0Ywcywgc3RhdHVzcHRyKTsgXAorICAgIH0gXAorICAgIHRjZ190ZW1wX2ZyZWVfcHRyKHN0YXR1c3B0cik7IFwKK30KKworVkZQX0dFTl9GVE9JKHRvdWkpCitWRlBfR0VOX0ZUT0kodG91aXopCitWRlBfR0VOX0ZUT0kodG9zaSkKK1ZGUF9HRU5fRlRPSSh0b3NpeikKKyN1bmRlZiBWRlBfR0VOX0ZUT0kKKworI2RlZmluZSBWRlBfR0VOX0ZJWChuYW1lKSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3ZmcF8jI25hbWUoaW50IGRwLCBpbnQgc2hpZnQsIGludCBuZW9uKSBcCit7IFwKKyAgICBUQ0d2IHRtcF9zaGlmdCA9IHRjZ19jb25zdF9pMzIoc2hpZnQpOyBcCisgICAgVENHdl9wdHIgc3RhdHVzcHRyID0gZ2V0X2Zwc3RhdHVzX3B0cihuZW9uKTsgXAorICAgIGlmIChkcCkgeyBcCisgICAgICAgIGdlbl9oZWxwZXJfdmZwXyMjbmFtZSMjZChjcHVfRjBkLCBjcHVfRjBkLCB0bXBfc2hpZnQsIHN0YXR1c3B0cik7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGdlbl9oZWxwZXJfdmZwXyMjbmFtZSMjcyhjcHVfRjBzLCBjcHVfRjBzLCB0bXBfc2hpZnQsIHN0YXR1c3B0cik7IFwKKyAgICB9IFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXBfc2hpZnQpOyBcCisgICAgdGNnX3RlbXBfZnJlZV9wdHIoc3RhdHVzcHRyKTsgXAorfQorVkZQX0dFTl9GSVgodG9zaCkKK1ZGUF9HRU5fRklYKHRvc2wpCitWRlBfR0VOX0ZJWCh0b3VoKQorVkZQX0dFTl9GSVgodG91bCkKK1ZGUF9HRU5fRklYKHNodG8pCitWRlBfR0VOX0ZJWChzbHRvKQorVkZQX0dFTl9GSVgodWh0bykKK1ZGUF9HRU5fRklYKHVsdG8pCisjdW5kZWYgVkZQX0dFTl9GSVgKKworc3RhdGljIGlubGluZSB2b2lkIGdlbl92ZnBfbGQoRGlzYXNDb250ZXh0ICpzLCBpbnQgZHAsIFRDR3YgYWRkcikKK3sKKyAgICBpZiAoZHApCisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KGNwdV9GMGQsIGFkZHIsIElTX1VTRVIocykpOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9xZW11X2xkMzJ1KGNwdV9GMHMsIGFkZHIsIElTX1VTRVIocykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3ZmcF9zdChEaXNhc0NvbnRleHQgKnMsIGludCBkcCwgVENHdiBhZGRyKQoreworICAgIGlmIChkcCkKKyAgICAgICAgdGNnX2dlbl9xZW11X3N0NjQoY3B1X0YwZCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgZWxzZQorICAgICAgICB0Y2dfZ2VuX3FlbXVfc3QzMihjcHVfRjBzLCBhZGRyLCBJU19VU0VSKHMpKTsKK30KKworc3RhdGljIGlubGluZSBsb25nCit2ZnBfcmVnX29mZnNldCAoaW50IGRwLCBpbnQgcmVnKQoreworICAgIGlmIChkcCkKKyAgICAgICAgcmV0dXJuIG9mZnNldG9mKENQVUFSTVN0YXRlLCB2ZnAucmVnc1tyZWddKTsKKyAgICBlbHNlIGlmIChyZWcgJiAxKSB7CisgICAgICAgIHJldHVybiBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgdmZwLnJlZ3NbcmVnID4+IDFdKQorICAgICAgICAgICsgb2Zmc2V0b2YoQ1BVX0RvdWJsZVUsIGwudXBwZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgdmZwLnJlZ3NbcmVnID4+IDFdKQorICAgICAgICAgICsgb2Zmc2V0b2YoQ1BVX0RvdWJsZVUsIGwubG93ZXIpOworICAgIH0KK30KKworLyogUmV0dXJuIHRoZSBvZmZzZXQgb2YgYSAzMi1iaXQgcGllY2Ugb2YgYSBORU9OIHJlZ2lzdGVyLgorICAgemVybyBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgZW5kIG9mIHRoZSByZWdpc3Rlci4gICovCitzdGF0aWMgaW5saW5lIGxvbmcKK25lb25fcmVnX29mZnNldCAoaW50IHJlZywgaW50IG4pCit7CisgICAgaW50IHNyZWc7CisgICAgc3JlZyA9IHJlZyAqIDIgKyBuOworICAgIHJldHVybiB2ZnBfcmVnX29mZnNldCgwLCBzcmVnKTsKK30KKworc3RhdGljIFRDR3YgbmVvbl9sb2FkX3JlZyhpbnQgcmVnLCBpbnQgcGFzcykKK3sKKyAgICBUQ0d2IHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICB0Y2dfZ2VuX2xkX2kzMih0bXAsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChyZWcsIHBhc3MpKTsKKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgdm9pZCBuZW9uX3N0b3JlX3JlZyhpbnQgcmVnLCBpbnQgcGFzcywgVENHdiB2YXIpCit7CisgICAgdGNnX2dlbl9zdF9pMzIodmFyLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocmVnLCBwYXNzKSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodmFyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5lb25fbG9hZF9yZWc2NChUQ0d2X2k2NCB2YXIsIGludCByZWcpCit7CisgICAgdGNnX2dlbl9sZF9pNjQodmFyLCBjcHVfZW52LCB2ZnBfcmVnX29mZnNldCgxLCByZWcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5lb25fc3RvcmVfcmVnNjQoVENHdl9pNjQgdmFyLCBpbnQgcmVnKQoreworICAgIHRjZ19nZW5fc3RfaTY0KHZhciwgY3B1X2VudiwgdmZwX3JlZ19vZmZzZXQoMSwgcmVnKSk7Cit9CisKKyNkZWZpbmUgdGNnX2dlbl9sZF9mMzIgdGNnX2dlbl9sZF9pMzIKKyNkZWZpbmUgdGNnX2dlbl9sZF9mNjQgdGNnX2dlbl9sZF9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zdF9mMzIgdGNnX2dlbl9zdF9pMzIKKyNkZWZpbmUgdGNnX2dlbl9zdF9mNjQgdGNnX2dlbl9zdF9pNjQKKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9tb3ZfRjBfdnJlZyhpbnQgZHAsIGludCByZWcpCit7CisgICAgaWYgKGRwKQorICAgICAgICB0Y2dfZ2VuX2xkX2Y2NChjcHVfRjBkLCBjcHVfZW52LCB2ZnBfcmVnX29mZnNldChkcCwgcmVnKSk7CisgICAgZWxzZQorICAgICAgICB0Y2dfZ2VuX2xkX2YzMihjcHVfRjBzLCBjcHVfZW52LCB2ZnBfcmVnX29mZnNldChkcCwgcmVnKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbW92X0YxX3ZyZWcoaW50IGRwLCBpbnQgcmVnKQoreworICAgIGlmIChkcCkKKyAgICAgICAgdGNnX2dlbl9sZF9mNjQoY3B1X0YxZCwgY3B1X2VudiwgdmZwX3JlZ19vZmZzZXQoZHAsIHJlZykpOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9sZF9mMzIoY3B1X0YxcywgY3B1X2VudiwgdmZwX3JlZ19vZmZzZXQoZHAsIHJlZykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX21vdl92cmVnX0YwKGludCBkcCwgaW50IHJlZykKK3sKKyAgICBpZiAoZHApCisgICAgICAgIHRjZ19nZW5fc3RfZjY0KGNwdV9GMGQsIGNwdV9lbnYsIHZmcF9yZWdfb2Zmc2V0KGRwLCByZWcpKTsKKyAgICBlbHNlCisgICAgICAgIHRjZ19nZW5fc3RfZjMyKGNwdV9GMHMsIGNwdV9lbnYsIHZmcF9yZWdfb2Zmc2V0KGRwLCByZWcpKTsKK30KKworI2RlZmluZSBBUk1fQ1BfUldfQklUCSgxIDw8IDIwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXdtbXh0X2xvYWRfcmVnKFRDR3ZfaTY0IHZhciwgaW50IHJlZykKK3sKKyAgICB0Y2dfZ2VuX2xkX2k2NCh2YXIsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCBpd21teHQucmVnc1tyZWddKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpd21teHRfc3RvcmVfcmVnKFRDR3ZfaTY0IHZhciwgaW50IHJlZykKK3sKKyAgICB0Y2dfZ2VuX3N0X2k2NCh2YXIsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCBpd21teHQucmVnc1tyZWddKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVENHdiBpd21teHRfbG9hZF9jcmVnKGludCByZWcpCit7CisgICAgVENHdiB2YXIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9sZF9pMzIodmFyLCBjcHVfZW52LCBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgaXdtbXh0LmNyZWdzW3JlZ10pKTsKKyAgICByZXR1cm4gdmFyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXdtbXh0X3N0b3JlX2NyZWcoaW50IHJlZywgVENHdiB2YXIpCit7CisgICAgdGNnX2dlbl9zdF9pMzIodmFyLCBjcHVfZW52LCBvZmZzZXRvZihDUFVBUk1TdGF0ZSwgaXdtbXh0LmNyZWdzW3JlZ10pKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih2YXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMChpbnQgcm4pCit7CisgICAgaXdtbXh0X3N0b3JlX3JlZyhjcHVfTTAsIHJuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4oaW50IHJuKQoreworICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfTTAsIHJuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9pd21teHRfb3JxX00wX3dSbihpbnQgcm4pCit7CisgICAgaXdtbXh0X2xvYWRfcmVnKGNwdV9WMSwgcm4pOworICAgIHRjZ19nZW5fb3JfaTY0KGNwdV9NMCwgY3B1X00wLCBjcHVfVjEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2l3bW14dF9hbmRxX00wX3dSbihpbnQgcm4pCit7CisgICAgaXdtbXh0X2xvYWRfcmVnKGNwdV9WMSwgcm4pOworICAgIHRjZ19nZW5fYW5kX2k2NChjcHVfTTAsIGNwdV9NMCwgY3B1X1YxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9pd21teHRfeG9ycV9NMF93Um4oaW50IHJuKQoreworICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfVjEsIHJuKTsKKyAgICB0Y2dfZ2VuX3hvcl9pNjQoY3B1X00wLCBjcHVfTTAsIGNwdV9WMSk7Cit9CisKKyNkZWZpbmUgSVdNTVhUX09QKG5hbWUpIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfaXdtbXh0XyMjbmFtZSMjX00wX3dSbihpbnQgcm4pIFwKK3sgXAorICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfVjEsIHJuKTsgXAorICAgIGdlbl9oZWxwZXJfaXdtbXh0XyMjbmFtZShjcHVfTTAsIGNwdV9NMCwgY3B1X1YxKTsgXAorfQorCisjZGVmaW5lIElXTU1YVF9PUF9FTlYobmFtZSkgXAorc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9pd21teHRfIyNuYW1lIyNfTTBfd1JuKGludCBybikgXAoreyBcCisgICAgaXdtbXh0X2xvYWRfcmVnKGNwdV9WMSwgcm4pOyBcCisgICAgZ2VuX2hlbHBlcl9pd21teHRfIyNuYW1lKGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCBjcHVfVjEpOyBcCit9CisKKyNkZWZpbmUgSVdNTVhUX09QX0VOVl9TSVpFKG5hbWUpIFwKK0lXTU1YVF9PUF9FTlYobmFtZSMjYikgXAorSVdNTVhUX09QX0VOVihuYW1lIyN3KSBcCitJV01NWFRfT1BfRU5WKG5hbWUjI2wpCisKKyNkZWZpbmUgSVdNTVhUX09QX0VOVjEobmFtZSkgXAorc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9pd21teHRfIyNuYW1lIyNfTTAodm9pZCkgXAoreyBcCisgICAgZ2VuX2hlbHBlcl9pd21teHRfIyNuYW1lKGNwdV9NMCwgY3B1X2VudiwgY3B1X00wKTsgXAorfQorCitJV01NWFRfT1AobWFkZHNxKQorSVdNTVhUX09QKG1hZGR1cSkKK0lXTU1YVF9PUChzYWRiKQorSVdNTVhUX09QKHNhZHcpCitJV01NWFRfT1AobXVsc2x3KQorSVdNTVhUX09QKG11bHNodykKK0lXTU1YVF9PUChtdWx1bHcpCitJV01NWFRfT1AobXVsdWh3KQorSVdNTVhUX09QKG1hY3N3KQorSVdNTVhUX09QKG1hY3V3KQorCitJV01NWFRfT1BfRU5WX1NJWkUodW5wYWNrbCkKK0lXTU1YVF9PUF9FTlZfU0laRSh1bnBhY2toKQorCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsdWIpCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsdXcpCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsdWwpCitJV01NWFRfT1BfRU5WMSh1bnBhY2todWIpCitJV01NWFRfT1BfRU5WMSh1bnBhY2todXcpCitJV01NWFRfT1BfRU5WMSh1bnBhY2todWwpCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsc2IpCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsc3cpCitJV01NWFRfT1BfRU5WMSh1bnBhY2tsc2wpCitJV01NWFRfT1BfRU5WMSh1bnBhY2toc2IpCitJV01NWFRfT1BfRU5WMSh1bnBhY2toc3cpCitJV01NWFRfT1BfRU5WMSh1bnBhY2toc2wpCisKK0lXTU1YVF9PUF9FTlZfU0laRShjbXBlcSkKK0lXTU1YVF9PUF9FTlZfU0laRShjbXBndHUpCitJV01NWFRfT1BfRU5WX1NJWkUoY21wZ3RzKQorCitJV01NWFRfT1BfRU5WX1NJWkUobWlucykKK0lXTU1YVF9PUF9FTlZfU0laRShtaW51KQorSVdNTVhUX09QX0VOVl9TSVpFKG1heHMpCitJV01NWFRfT1BfRU5WX1NJWkUobWF4dSkKKworSVdNTVhUX09QX0VOVl9TSVpFKHN1Ym4pCitJV01NWFRfT1BfRU5WX1NJWkUoYWRkbikKK0lXTU1YVF9PUF9FTlZfU0laRShzdWJ1KQorSVdNTVhUX09QX0VOVl9TSVpFKGFkZHUpCitJV01NWFRfT1BfRU5WX1NJWkUoc3VicykKK0lXTU1YVF9PUF9FTlZfU0laRShhZGRzKQorCitJV01NWFRfT1BfRU5WKGF2Z2IwKQorSVdNTVhUX09QX0VOVihhdmdiMSkKK0lXTU1YVF9PUF9FTlYoYXZndzApCitJV01NWFRfT1BfRU5WKGF2Z3cxKQorCisvLyBJV01NWFRfT1AobXNhZGIpCisKK0lXTU1YVF9PUF9FTlYocGFja3V3KQorSVdNTVhUX09QX0VOVihwYWNrdWwpCitJV01NWFRfT1BfRU5WKHBhY2t1cSkKK0lXTU1YVF9PUF9FTlYocGFja3N3KQorSVdNTVhUX09QX0VOVihwYWNrc2wpCitJV01NWFRfT1BfRU5WKHBhY2tzcSkKKworc3RhdGljIHZvaWQgZ2VuX29wX2l3bW14dF9zZXRfbXVwKHZvaWQpCit7CisgICAgVENHdiB0bXA7CisgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoaXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0Nvbl0pOworICAgIHRjZ19nZW5fb3JpX2kzMih0bXAsIHRtcCwgMik7CisgICAgc3RvcmVfY3B1X2ZpZWxkKHRtcCwgaXdtbXh0LmNyZWdzW0FSTV9JV01NWFRfd0Nvbl0pOworfQorCitzdGF0aWMgdm9pZCBnZW5fb3BfaXdtbXh0X3NldF9jdXAodm9pZCkKK3sKKyAgICBUQ0d2IHRtcDsKKyAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChpd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q29uXSk7CisgICAgdGNnX2dlbl9vcmlfaTMyKHRtcCwgdG1wLCAxKTsKKyAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBpd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q29uXSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9vcF9pd21teHRfc2V0cHNyX256KHZvaWQpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgZ2VuX2hlbHBlcl9pd21teHRfc2V0cHNyX256KHRtcCwgY3B1X00wKTsKKyAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBpd21teHQuY3JlZ3NbQVJNX0lXTU1YVF93Q0FTRl0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2l3bW14dF9hZGRsX00wX3dSbihpbnQgcm4pCit7CisgICAgaXdtbXh0X2xvYWRfcmVnKGNwdV9WMSwgcm4pOworICAgIHRjZ19nZW5fZXh0MzJ1X2k2NChjcHVfVjEsIGNwdV9WMSk7CisgICAgdGNnX2dlbl9hZGRfaTY0KGNwdV9NMCwgY3B1X00wLCBjcHVfVjEpOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZW5faXdtbXh0X2FkZHJlc3MoRGlzYXNDb250ZXh0ICpzLCB1aW50MzJfdCBpbnNuLCBUQ0d2IGRlc3QpCit7CisgICAgaW50IHJkOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICBUQ0d2IHRtcDsKKworICAgIHJkID0gKGluc24gPj4gMTYpICYgMHhmOworICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKworICAgIG9mZnNldCA9IChpbnNuICYgMHhmZikgPDwgKChpbnNuID4+IDcpICYgMik7CisgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgLyogUHJlIGluZGV4ZWQgKi8KKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMykpCisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHRtcCwgdG1wLCBvZmZzZXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHRtcCwgdG1wLCAtb2Zmc2V0KTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKGRlc3QsIHRtcCk7CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgIH0gZWxzZSBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAvKiBQb3N0IGluZGV4ZWQgKi8KKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKGRlc3QsIHRtcCk7CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjMpKQorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMih0bXAsIHRtcCwgb2Zmc2V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMih0bXAsIHRtcCwgLW9mZnNldCk7CisgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICB9IGVsc2UgaWYgKCEoaW5zbiAmICgxIDw8IDIzKSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBnZW5faXdtbXh0X3NoaWZ0KHVpbnQzMl90IGluc24sIHVpbnQzMl90IG1hc2ssIFRDR3YgZGVzdCkKK3sKKyAgICBpbnQgcmQgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICBUQ0d2IHRtcDsKKworICAgIGlmIChpbnNuICYgKDEgPDwgOCkpIHsKKyAgICAgICAgaWYgKHJkIDwgQVJNX0lXTU1YVF93Q0dSMCB8fCByZCA+IEFSTV9JV01NWFRfd0NHUjMpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG1wID0gaXdtbXh0X2xvYWRfY3JlZyhyZCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfVjAsIHJkKTsKKyAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKHRtcCwgY3B1X1YwKTsKKyAgICB9CisgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgbWFzayk7CisgICAgdGNnX2dlbl9tb3ZfaTMyKGRlc3QsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogRGlzYXNzZW1ibGUgYW4gaXdNTVh0IGluc3RydWN0aW9uLiAgUmV0dXJucyBub256ZXJvIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAoaWUuIGFuIHVuZGVmaW5lZCBpbnN0cnVjdGlvbikuICAqLworc3RhdGljIGludCBkaXNhc19pd21teHRfaW5zbihDUFVBUk1TdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IGluc24pCit7CisgICAgaW50IHJkLCB3cmQ7CisgICAgaW50IHJkaGksIHJkbG8sIHJkMCwgcmQxLCBpOworICAgIFRDR3YgYWRkcjsKKyAgICBUQ0d2IHRtcCwgdG1wMiwgdG1wMzsKKworICAgIGlmICgoaW5zbiAmIDB4MGUwMDBlMDApID09IDB4MGMwMDAwMDApIHsKKyAgICAgICAgaWYgKChpbnNuICYgMHgwZmUwMGZmMCkgPT0gMHgwYzQwMDAwMCkgeworICAgICAgICAgICAgd3JkID0gaW5zbiAmIDB4ZjsKKyAgICAgICAgICAgIHJkbG8gPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICByZGhpID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICAgICAgaWYgKGluc24gJiBBUk1fQ1BfUldfQklUKSB7CQkJLyogVE1SUkMgKi8KKyAgICAgICAgICAgICAgICBpd21teHRfbG9hZF9yZWcoY3B1X1YwLCB3cmQpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMihjcHVfUltyZGxvXSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KGNwdV9WMCwgY3B1X1YwLCAzMik7CisgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKGNwdV9SW3JkaGldLCBjcHVfVjApOworICAgICAgICAgICAgfSBlbHNlIHsJCQkJCS8qIFRNQ1JSICovCisgICAgICAgICAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NChjcHVfVjAsIGNwdV9SW3JkbG9dLCBjcHVfUltyZGhpXSk7CisgICAgICAgICAgICAgICAgaXdtbXh0X3N0b3JlX3JlZyhjcHVfVjAsIHdyZCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgYWRkciA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgaWYgKGdlbl9pd21teHRfYWRkcmVzcyhzLCBpbnNuLCBhZGRyKSkgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsKKyAgICAgICAgICAgIGlmICgoaW5zbiA+PiAyOCkgPT0gMHhmKSB7CQkJLyogV0xEUlcgd0N4ICovCisgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDMydSh0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgIGl3bW14dF9zdG9yZV9jcmVnKHdyZCwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA4KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIyKSkgewkJLyogV0xEUkQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KGNwdV9NMCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsJCQkJLyogV0xEUlcgd1JkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CQkvKiBXTERSSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkMTZ1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewkJCQkvKiBXTERSQiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkOHUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQoY3B1X00wLCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKGluc24gPj4gMjgpID09IDB4ZikgewkJCS8qIFdTVFJXIHdDeCAqLworICAgICAgICAgICAgICAgIHRtcCA9IGl3bW14dF9sb2FkX2NyZWcod3JkKTsKKyAgICAgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHdyZCk7CisgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsJCS8qIFdTVFJEICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9xZW11X3N0NjQoY3B1X00wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsJCQkJLyogV1NUUlcgd1JkICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodG1wLCBjcHVfTTApOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CQkvKiBXU1RSSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKHRtcCwgY3B1X00wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdDE2KHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CQkJCS8qIFdTVFJCICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodG1wLCBjcHVfTTApOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0OCh0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKGluc24gJiAweDBmMDAwMDAwKSAhPSAweDBlMDAwMDAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHN3aXRjaCAoKChpbnNuID4+IDEyKSAmIDB4ZjAwKSB8ICgoaW5zbiA+PiA0KSAmIDB4ZmYpKSB7CisgICAgY2FzZSAweDAwMDoJCQkJCQkvKiBXT1IgKi8KKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfb3JxX00wX3dSbihyZDEpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldHBzcl9ueigpOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMToJCQkJCQkvKiBUTUNSICovCisgICAgICAgIGlmIChpbnNuICYgMHhmKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIHN3aXRjaCAod3JkKSB7CisgICAgICAgIGNhc2UgQVJNX0lXTU1YVF93Q0lEOgorICAgICAgICBjYXNlIEFSTV9JV01NWFRfd0NBU0Y6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBUk1fSVdNTVhUX3dDb246CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCisgICAgICAgIGNhc2UgQVJNX0lXTU1YVF93Q1NTRjoKKyAgICAgICAgICAgIHRtcCA9IGl3bW14dF9sb2FkX2NyZWcod3JkKTsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGNfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgaXdtbXh0X3N0b3JlX2NyZWcod3JkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVJNX0lXTU1YVF93Q0dSMDoKKyAgICAgICAgY2FzZSBBUk1fSVdNTVhUX3dDR1IxOgorICAgICAgICBjYXNlIEFSTV9JV01NWFRfd0NHUjI6CisgICAgICAgIGNhc2UgQVJNX0lXTU1YVF93Q0dSMzoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgaXdtbXh0X3N0b3JlX2NyZWcod3JkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTAwOgkJCQkJCS8qIFdYT1IgKi8KKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfeG9ycV9NMF93Um4ocmQxKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRwc3JfbnooKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfY3VwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTE6CQkJCQkJLyogVE1SQyAqLworICAgICAgICBpZiAoaW5zbiAmIDB4ZikKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgd3JkID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICB0bXAgPSBpd21teHRfbG9hZF9jcmVnKHdyZCk7CisgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwMDoJCQkJCQkvKiBXQU5ETiAqLworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDApICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgdGNnX2dlbl9uZWdfaTY0KGNwdV9NMCwgY3B1X00wKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9hbmRxX00wX3dSbihyZDEpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldHBzcl9ueigpOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDIwMDoJCQkJCQkvKiBXQU5EICovCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMCkgJiAweGY7CisgICAgICAgIHJkMSA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBnZW5fb3BfaXdtbXh0X2FuZHFfTTBfd1JuKHJkMSk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0cHNyX256KCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODEwOiBjYXNlIDB4YTEwOgkJCQkvKiBXTUFERCAqLworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDApICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21hZGRzcV9NMF93Um4ocmQxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9tYWRkdXFfTTBfd1JuKHJkMSk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMGU6IGNhc2UgMHg1MGU6IGNhc2UgMHg5MGU6IGNhc2UgMHhkMGU6CS8qIFdVTlBDS0lMICovCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2tsYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2x3X00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNrbGxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfY3VwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMGM6IGNhc2UgMHg1MGM6IGNhc2UgMHg5MGM6IGNhc2UgMHhkMGM6CS8qIFdVTlBDS0lIICovCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2toYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2h3X00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNraGxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfY3VwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTI6IGNhc2UgMHgxMTI6IGNhc2UgMHg0MTI6IGNhc2UgMHg1MTI6CS8qIFdTQUQgKi8KKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIHJkMSA9IChpbnNuID4+IDApICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKQorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9zYWR3X00wX3dSbihyZDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3NhZGJfTTBfd1JuKHJkMSk7CisgICAgICAgIGlmICghKGluc24gJiAoMSA8PCAyMCkpKQorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hZGRsX00wX3dSbih3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDEwOiBjYXNlIDB4MTEwOiBjYXNlIDB4MjEwOiBjYXNlIDB4MzEwOgkvKiBXTVVMICovCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9tdWxzaHdfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9tdWxzbHdfTTBfd1JuKHJkMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X211bHVod19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X211bHVsd19NMF93Um4ocmQxKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NDEwOiBjYXNlIDB4NTEwOiBjYXNlIDB4NjEwOiBjYXNlIDB4NzEwOgkvKiBXTUFDICovCisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWFjc3dfTTBfd1JuKHJkMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWFjdXdfTTBfd1JuKHJkMSk7CisgICAgICAgIGlmICghKGluc24gJiAoMSA8PCAyMCkpKSB7CisgICAgICAgICAgICBpd21teHRfbG9hZF9yZWcoY3B1X1YxLCB3cmQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTY0KGNwdV9NMCwgY3B1X00wLCBjcHVfVjEpOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMDY6IGNhc2UgMHg0MDY6IGNhc2UgMHg4MDY6IGNhc2UgMHhjMDY6CS8qIFdDTVBFUSAqLworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMCkgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMikgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfY21wZXFiX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfY21wZXF3X00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfY21wZXFsX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODAwOiBjYXNlIDB4OTAwOiBjYXNlIDB4YzAwOiBjYXNlIDB4ZDAwOgkvKiBXQVZHMiAqLworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMCkgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjApKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfYXZndzFfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hdmd3MF9NMF93Um4ocmQxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjApKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfYXZnYjFfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hdmdiMF9NMF93Um4ocmQxKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDgwMjogY2FzZSAweDkwMjogY2FzZSAweGEwMjogY2FzZSAweGIwMjoJLyogV0FMSUdOUiAqLworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMCkgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgdG1wID0gaXdtbXh0X2xvYWRfY3JlZyhBUk1fSVdNTVhUX3dDR1IwICsgKChpbnNuID4+IDIwKSAmIDMpKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgNyk7CisgICAgICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfVjEsIHJkMSk7CisgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X2FsaWduKGNwdV9NMCwgY3B1X00wLCBjcHVfVjEsIHRtcCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2MDE6IGNhc2UgMHg2MDU6IGNhc2UgMHg2MDk6IGNhc2UgMHg2MGQ6CS8qIFRJTlNSICovCisgICAgICAgIGlmICgoKGluc24gPj4gNikgJiAzKSA9PSAzKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICB3cmQgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbih3cmQpOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDYpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMigweGZmKTsKKyAgICAgICAgICAgIHRtcDMgPSB0Y2dfY29uc3RfaTMyKChpbnNuICYgNykgPDwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMHhmZmZmKTsKKyAgICAgICAgICAgIHRtcDMgPSB0Y2dfY29uc3RfaTMyKChpbnNuICYgMykgPDwgNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMHhmZmZmZmZmZik7CisgICAgICAgICAgICB0bXAzID0gdGNnX2NvbnN0X2kzMigoaW5zbiAmIDEpIDw8IDUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUQ0dWX1VOVVNFRCh0bXAyKTsKKyAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcDMpOworICAgICAgICB9CisgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X2luc3IoY3B1X00wLCBjcHVfTTAsIHRtcCwgdG1wMiwgdG1wMyk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWUodG1wMyk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWUodG1wMik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMDc6IGNhc2UgMHg1MDc6IGNhc2UgMHg5MDc6IGNhc2UgMHhkMDc6CS8qIFRFWFRSTSAqLworICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgd3JkID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBpZiAocmQgPT0gMTUgfHwgKChpbnNuID4+IDIyKSAmIDMpID09IDMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbih3cmQpOworICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KGNwdV9NMCwgY3B1X00wLCAoaW5zbiAmIDcpIDw8IDMpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKHRtcCwgY3B1X00wKTsKKyAgICAgICAgICAgIGlmIChpbnNuICYgOCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0OHNfaTMyKHRtcCwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2k2NChjcHVfTTAsIGNwdV9NMCwgKGluc24gJiAzKSA8PCA0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIGNwdV9NMCk7CisgICAgICAgICAgICBpZiAoaW5zbiAmIDgpIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c19pMzIodG1wLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdG1wLCAweGZmZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQoY3B1X00wLCBjcHVfTTAsIChpbnNuICYgMSkgPDwgNSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodG1wLCBjcHVfTTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE3OiBjYXNlIDB4NTE3OiBjYXNlIDB4OTE3OiBjYXNlIDB4ZDE3OgkvKiBURVhUUkMgKi8KKyAgICAgICAgaWYgKChpbnNuICYgMHgwMDBmZjAwOCkgIT0gMHgwMDAzZjAwMCB8fCAoKGluc24gPj4gMjIpICYgMykgPT0gMykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB0bXAgPSBpd21teHRfbG9hZF9jcmVnKEFSTV9JV01NWFRfd0NBU0YpOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0bXAsIHRtcCwgKChpbnNuICYgNykgPDwgMikgKyAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHRtcCwgdG1wLCAoKGluc24gJiAzKSA8PCAzKSArIDQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB0bXAsICgoaW5zbiAmIDEpIDw8IDQpICsgMTIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0bXAsIHRtcCwgMjgpOworICAgICAgICBnZW5fc2V0X256Y3YodG1wKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQwMTogY2FzZSAweDQwNTogY2FzZSAweDQwOTogY2FzZSAweDQwZDoJLyogVEJDU1QgKi8KKyAgICAgICAgaWYgKCgoaW5zbiA+PiA2KSAmIDMpID09IDMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDYpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9iY3N0YihjcHVfTTAsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfYmNzdHcoY3B1X00wLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X2Jjc3RsKGNwdV9NMCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTM6IGNhc2UgMHg1MTM6IGNhc2UgMHg5MTM6IGNhc2UgMHhkMTM6CS8qIFRBTkRDICovCisgICAgICAgIGlmICgoaW5zbiAmIDB4MDAwZmYwMGYpICE9IDB4MDAwM2YwMDAgfHwgKChpbnNuID4+IDIyKSAmIDMpID09IDMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgdG1wID0gaXdtbXh0X2xvYWRfY3JlZyhBUk1fSVdNTVhUX3dDQVNGKTsKKyAgICAgICAgdG1wMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHRtcDIsIHRtcCk7CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSArKykgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wMiwgdG1wMiwgNCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wMiwgdG1wMiwgOCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcDIsIHRtcDIsIDE2KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnZW5fc2V0X256Y3YodG1wKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMWM6IGNhc2UgMHg0MWM6IGNhc2UgMHg4MWM6IGNhc2UgMHhjMWM6CS8qIFdBQ0MgKi8KKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMikgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X2FkZGNiKGNwdV9NMCwgY3B1X00wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9hZGRjdyhjcHVfTTAsIGNwdV9NMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfYWRkY2woY3B1X00wLCBjcHVfTTApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTU6IGNhc2UgMHg1MTU6IGNhc2UgMHg5MTU6IGNhc2UgMHhkMTU6CS8qIFRPUkMgKi8KKyAgICAgICAgaWYgKChpbnNuICYgMHgwMDBmZjAwZikgIT0gMHgwMDAzZjAwMCB8fCAoKGluc24gPj4gMjIpICYgMykgPT0gMykKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB0bXAgPSBpd21teHRfbG9hZF9jcmVnKEFSTV9JV01NWFRfd0NBU0YpOworICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIodG1wMiwgdG1wKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMikgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpICsrKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0bXAyLCB0bXAyLCA0KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcDIsIHRtcDIsIDgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcDIsIHRtcDIsIDE2KTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGdlbl9zZXRfbnpjdih0bXApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEwMzogY2FzZSAweDUwMzogY2FzZSAweDkwMzogY2FzZSAweGQwMzoJLyogVE1PVk1TSyAqLworICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBpZiAoKGluc24gJiAweGYpICE9IDAgfHwgKChpbnNuID4+IDIyKSAmIDMpID09IDMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9tc2JiKHRtcCwgY3B1X00wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9tc2J3KHRtcCwgY3B1X00wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9tc2JsKHRtcCwgY3B1X00wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEwNjogY2FzZSAweDMwNjogY2FzZSAweDUwNjogY2FzZSAweDcwNjoJLyogV0NNUEdUICovCisgICAgY2FzZSAweDkwNjogY2FzZSAweGIwNjogY2FzZSAweGQwNjogY2FzZSAweGYwNjoKKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIHJkMSA9IChpbnNuID4+IDApICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X2NtcGd0c2JfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9jbXBndHViX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfY21wZ3Rzd19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X2NtcGd0dXdfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9jbXBndHNsX00wX3dSbihyZDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfY21wZ3R1bF9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwZTogY2FzZSAweDIwZTogY2FzZSAweDQwZTogY2FzZSAweDYwZToJLyogV1VOUENLRUwgKi8KKyAgICBjYXNlIDB4ODBlOiBjYXNlIDB4YTBlOiBjYXNlIDB4YzBlOiBjYXNlIDB4ZTBlOgorICAgICAgICB3cmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2tsc2JfTTAoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2x1Yl9NMCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNrbHN3X00wKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2tsdXdfTTAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2xzbF9NMCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNrbHVsX00wKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfY3VwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMGM6IGNhc2UgMHgyMGM6IGNhc2UgMHg0MGM6IGNhc2UgMHg2MGM6CS8qIFdVTlBDS0VIICovCisgICAgY2FzZSAweDgwYzogY2FzZSAweGEwYzogY2FzZSAweGMwYzogY2FzZSAweGUwYzoKKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV9NMF93Um4ocmQwKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMikgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNraHNiX00wKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2todWJfTTAoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2hzd19NMCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfdW5wYWNraHV3X00wKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF91bnBhY2toc2xfTTAoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3VucGFja2h1bF9NMCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MjA0OiBjYXNlIDB4NjA0OiBjYXNlIDB4YTA0OiBjYXNlIDB4ZTA0OgkvKiBXU1JMICovCisgICAgY2FzZSAweDIxNDogY2FzZSAweDYxNDogY2FzZSAweGExNDogY2FzZSAweGUxNDoKKyAgICAgICAgaWYgKCgoaW5zbiA+PiAyMikgJiAzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgaWYgKGdlbl9pd21teHRfc2hpZnQoaW5zbiwgMHhmZiwgdG1wKSkgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9zcmx3KGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X3NybGwoY3B1X00wLCBjcHVfZW52LCBjcHVfTTAsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfc3JscShjcHVfTTAsIGNwdV9lbnYsIGNwdV9NMCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDA0OiBjYXNlIDB4NDA0OiBjYXNlIDB4ODA0OiBjYXNlIDB4YzA0OgkvKiBXU1JBICovCisgICAgY2FzZSAweDAxNDogY2FzZSAweDQxNDogY2FzZSAweDgxNDogY2FzZSAweGMxNDoKKyAgICAgICAgaWYgKCgoaW5zbiA+PiAyMikgJiAzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgaWYgKGdlbl9pd21teHRfc2hpZnQoaW5zbiwgMHhmZiwgdG1wKSkgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9zcmF3KGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X3NyYWwoY3B1X00wLCBjcHVfZW52LCBjcHVfTTAsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfc3JhcShjcHVfTTAsIGNwdV9lbnYsIGNwdV9NMCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTA0OiBjYXNlIDB4NTA0OiBjYXNlIDB4OTA0OiBjYXNlIDB4ZDA0OgkvKiBXU0xMICovCisgICAgY2FzZSAweDExNDogY2FzZSAweDUxNDogY2FzZSAweDkxNDogY2FzZSAweGQxNDoKKyAgICAgICAgaWYgKCgoaW5zbiA+PiAyMikgJiAzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgaWYgKGdlbl9pd21teHRfc2hpZnQoaW5zbiwgMHhmZiwgdG1wKSkgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjIpICYgMykgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9zbGx3KGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X3NsbGwoY3B1X00wLCBjcHVfZW52LCBjcHVfTTAsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfc2xscShjcHVfTTAsIGNwdV9lbnYsIGNwdV9NMCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzA0OiBjYXNlIDB4NzA0OiBjYXNlIDB4YjA0OiBjYXNlIDB4ZjA0OgkvKiBXUk9SICovCisgICAgY2FzZSAweDMxNDogY2FzZSAweDcxNDogY2FzZSAweGIxNDogY2FzZSAweGYxNDoKKyAgICAgICAgaWYgKCgoaW5zbiA+PiAyMikgJiAzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMikgJiAzKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChnZW5faXdtbXh0X3NoaWZ0KGluc24sIDB4ZiwgdG1wKSkgeworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9yb3J3KGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChnZW5faXdtbXh0X3NoaWZ0KGluc24sIDB4MWYsIHRtcCkpIHsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfcm9ybChjcHVfTTAsIGNwdV9lbnYsIGNwdV9NMCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAoZ2VuX2l3bW14dF9zaGlmdChpbnNuLCAweDNmLCB0bXApKSB7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X3JvcnEoY3B1X00wLCBjcHVfZW52LCBjcHVfTTAsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDExNjogY2FzZSAweDMxNjogY2FzZSAweDUxNjogY2FzZSAweDcxNjoJLyogV01JTiAqLworICAgIGNhc2UgMHg5MTY6IGNhc2UgMHhiMTY6IGNhc2UgMHhkMTY6IGNhc2UgMHhmMTY6CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9taW5zYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21pbnViX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWluc3dfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9taW51d19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21pbnNsX00wX3dSbihyZDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWludWxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxNjogY2FzZSAweDIxNjogY2FzZSAweDQxNjogY2FzZSAweDYxNjoJLyogV01BWCAqLworICAgIGNhc2UgMHg4MTY6IGNhc2UgMHhhMTY6IGNhc2UgMHhjMTY6IGNhc2UgMHhlMTY6CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9tYXhzYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21heHViX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWF4c3dfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9tYXh1d19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X21heHNsX00wX3dSbihyZDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9vcF9pd21teHRfbWF4dWxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwMjogY2FzZSAweDEwMjogY2FzZSAweDIwMjogY2FzZSAweDMwMjoJLyogV0FMSUdOSSAqLworICAgIGNhc2UgMHg0MDI6IGNhc2UgMHg1MDI6IGNhc2UgMHg2MDI6IGNhc2UgMHg3MDI6CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICB0bXAgPSB0Y2dfY29uc3RfaTMyKChpbnNuID4+IDIwKSAmIDMpOworICAgICAgICBpd21teHRfbG9hZF9yZWcoY3B1X1YxLCByZDEpOworICAgICAgICBnZW5faGVscGVyX2l3bW14dF9hbGlnbihjcHVfTTAsIGNwdV9NMCwgY3B1X1YxLCB0bXApOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMWE6IGNhc2UgMHgxMWE6IGNhc2UgMHgyMWE6IGNhc2UgMHgzMWE6CS8qIFdTVUIgKi8KKyAgICBjYXNlIDB4NDFhOiBjYXNlIDB4NTFhOiBjYXNlIDB4NjFhOiBjYXNlIDB4NzFhOgorICAgIGNhc2UgMHg4MWE6IGNhc2UgMHg5MWE6IGNhc2UgMHhhMWE6IGNhc2UgMHhiMWE6CisgICAgY2FzZSAweGMxYTogY2FzZSAweGQxYTogY2FzZSAweGUxYTogY2FzZSAweGYxYToKKyAgICAgICAgd3JkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICByZDAgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgIHJkMSA9IChpbnNuID4+IDApICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjApICYgMHhmKSB7CisgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9zdWJuYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MToKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfc3VidWJfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDM6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3N1YnNiX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0OgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9zdWJud19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NToKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfc3VidXdfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDc6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3N1YnN3X00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg4OgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9zdWJubF9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4OToKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfc3VidWxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGI6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X3N1YnNsX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAxZTogY2FzZSAweDExZTogY2FzZSAweDIxZTogY2FzZSAweDMxZToJLyogV1NIVUZIICovCisgICAgY2FzZSAweDQxZTogY2FzZSAweDUxZTogY2FzZSAweDYxZTogY2FzZSAweDcxZToKKyAgICBjYXNlIDB4ODFlOiBjYXNlIDB4OTFlOiBjYXNlIDB4YTFlOiBjYXNlIDB4YjFlOgorICAgIGNhc2UgMHhjMWU6IGNhc2UgMHhkMWU6IGNhc2UgMHhlMWU6IGNhc2UgMHhmMWU6CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfTTBfd1JuKHJkMCk7CisgICAgICAgIHRtcCA9IHRjZ19jb25zdF9pMzIoKChpbnNuID4+IDE2KSAmIDB4ZjApIHwgKGluc24gJiAweDBmKSk7CisgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X3NodWZoKGNwdV9NMCwgY3B1X2VudiwgY3B1X00wLCB0bXApOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfbW92cV93Um5fTTAod3JkKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfbXVwKCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X2N1cCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDE4OiBjYXNlIDB4MTE4OiBjYXNlIDB4MjE4OiBjYXNlIDB4MzE4OgkvKiBXQUREICovCisgICAgY2FzZSAweDQxODogY2FzZSAweDUxODogY2FzZSAweDYxODogY2FzZSAweDcxODoKKyAgICBjYXNlIDB4ODE4OiBjYXNlIDB4OTE4OiBjYXNlIDB4YTE4OiBjYXNlIDB4YjE4OgorICAgIGNhc2UgMHhjMTg6IGNhc2UgMHhkMTg6IGNhc2UgMHhlMTg6IGNhc2UgMHhmMTg6CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIwKSAmIDB4ZikgeworICAgICAgICBjYXNlIDB4MDoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfYWRkbmJfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X2FkZHViX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzOgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hZGRzYl9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfYWRkbndfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDU6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X2FkZHV3X00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg3OgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hZGRzd19NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODoKKyAgICAgICAgICAgIGdlbl9vcF9pd21teHRfYWRkbmxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDk6CisgICAgICAgICAgICBnZW5fb3BfaXdtbXh0X2FkZHVsX00wX3dSbihyZDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhiOgorICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9hZGRzbF9NMF93Um4ocmQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9zZXRfY3VwKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMDg6IGNhc2UgMHgxMDg6IGNhc2UgMHgyMDg6IGNhc2UgMHgzMDg6CS8qIFdQQUNLICovCisgICAgY2FzZSAweDQwODogY2FzZSAweDUwODogY2FzZSAweDYwODogY2FzZSAweDcwODoKKyAgICBjYXNlIDB4ODA4OiBjYXNlIDB4OTA4OiBjYXNlIDB4YTA4OiBjYXNlIDB4YjA4OgorICAgIGNhc2UgMHhjMDg6IGNhc2UgMHhkMDg6IGNhc2UgMHhlMDg6IGNhc2UgMHhmMDg6CisgICAgICAgIGlmICghKGluc24gJiAoMSA8PCAyMCkpIHx8ICgoaW5zbiA+PiAyMikgJiAzKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHdyZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQwID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZDEgPSAoaW5zbiA+PiAwKSAmIDB4ZjsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbihyZDApOworICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDIyKSAmIDMpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrc3dfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrdXdfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrc2xfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrdWxfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrc3FfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX2l3bW14dF9wYWNrdXFfTTBfd1JuKHJkMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKHdyZCk7CisgICAgICAgIGdlbl9vcF9pd21teHRfc2V0X211cCgpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9jdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDIwMTogY2FzZSAweDIwMzogY2FzZSAweDIwNTogY2FzZSAweDIwNzoKKyAgICBjYXNlIDB4MjA5OiBjYXNlIDB4MjBiOiBjYXNlIDB4MjBkOiBjYXNlIDB4MjBmOgorICAgIGNhc2UgMHgyMTE6IGNhc2UgMHgyMTM6IGNhc2UgMHgyMTU6IGNhc2UgMHgyMTc6CisgICAgY2FzZSAweDIxOTogY2FzZSAweDIxYjogY2FzZSAweDIxZDogY2FzZSAweDIxZjoKKyAgICAgICAgd3JkID0gKGluc24gPj4gNSkgJiAweGY7CisgICAgICAgIHJkMCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgcmQxID0gKGluc24gPj4gMCkgJiAweGY7CisgICAgICAgIGlmIChyZDAgPT0gMHhmIHx8IHJkMSA9PSAweGYpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX00wX3dSbih3cmQpOworICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZDApOworICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcmQxKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAxNikgJiAweGYpIHsKKyAgICAgICAgY2FzZSAweDA6CQkJCQkvKiBUTUlBICovCisgICAgICAgICAgICBnZW5faGVscGVyX2l3bW14dF9tdWxhZGRzbChjcHVfTTAsIGNwdV9NMCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ODoJCQkJCS8qIFRNSUFQSCAqLworICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfbXVsYWRkc3coY3B1X00wLCBjcHVfTTAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGM6IGNhc2UgMHhkOiBjYXNlIDB4ZTogY2FzZSAweGY6CQkvKiBUTUlBeHkgKi8KKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTYpKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB0bXAsIDE2KTsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTcpKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wMiwgdG1wMiwgMTYpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfbXVsYWRkc3dsKGNwdV9NMCwgY3B1X00wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgZ2VuX29wX2l3bW14dF9tb3ZxX3dSbl9NMCh3cmQpOworICAgICAgICBnZW5fb3BfaXdtbXh0X3NldF9tdXAoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIERpc2Fzc2VtYmxlIGFuIFhTY2FsZSBEU1AgaW5zdHJ1Y3Rpb24uICBSZXR1cm5zIG5vbnplcm8gaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAgIChpZS4gYW4gdW5kZWZpbmVkIGluc3RydWN0aW9uKS4gICovCitzdGF0aWMgaW50IGRpc2FzX2RzcF9pbnNuKENQVUFSTVN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbikKK3sKKyAgICBpbnQgYWNjLCByZDAsIHJkMSwgcmRoaSwgcmRsbzsKKyAgICBUQ0d2IHRtcCwgdG1wMjsKKworICAgIGlmICgoaW5zbiAmIDB4MGZmMDBmMTApID09IDB4MGUyMDAwMTApIHsKKyAgICAgICAgLyogTXVsdGlwbHkgd2l0aCBJbnRlcm5hbCBBY2N1bXVsYXRlIEZvcm1hdCAqLworICAgICAgICByZDAgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHJkMSA9IGluc24gJiAweGY7CisgICAgICAgIGFjYyA9IChpbnNuID4+IDUpICYgNzsKKworICAgICAgICBpZiAoYWNjICE9IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZDApOworICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcmQxKTsKKyAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAxNikgJiAweGYpIHsKKyAgICAgICAgY2FzZSAweDA6CQkJCQkvKiBNSUEgKi8KKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X211bGFkZHNsKGNwdV9NMCwgY3B1X00wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg4OgkJCQkJLyogTUlBUEggKi8KKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXdtbXh0X211bGFkZHN3KGNwdV9NMCwgY3B1X00wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhjOgkJCQkJLyogTUlBQkIgKi8KKyAgICAgICAgY2FzZSAweGQ6CQkJCQkvKiBNSUFCVCAqLworICAgICAgICBjYXNlIDB4ZToJCQkJCS8qIE1JQVRCICovCisgICAgICAgIGNhc2UgMHhmOgkJCQkJLyogTUlBVFQgKi8KKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTYpKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB0bXAsIDE2KTsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTcpKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wMiwgdG1wMiwgMTYpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9pd21teHRfbXVsYWRkc3dsKGNwdV9NMCwgY3B1X00wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKworICAgICAgICBnZW5fb3BfaXdtbXh0X21vdnFfd1JuX00wKGFjYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoaW5zbiAmIDB4MGZlMDBmZjgpID09IDB4MGM0MDAwMDApIHsKKyAgICAgICAgLyogSW50ZXJuYWwgQWNjdW11bGF0b3IgQWNjZXNzIEZvcm1hdCAqLworICAgICAgICByZGhpID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICByZGxvID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICBhY2MgPSBpbnNuICYgNzsKKworICAgICAgICBpZiAoYWNjICE9IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsJCQkvKiBNUkEgKi8KKyAgICAgICAgICAgIGl3bW14dF9sb2FkX3JlZyhjcHVfVjAsIGFjYyk7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIoY3B1X1JbcmRsb10sIGNwdV9WMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KGNwdV9WMCwgY3B1X1YwLCAzMik7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIoY3B1X1JbcmRoaV0sIGNwdV9WMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKGNwdV9SW3JkaGldLCBjcHVfUltyZGhpXSwgKDEgPDwgKDQwIC0gMzIpKSAtIDEpOworICAgICAgICB9IGVsc2UgewkJCQkJLyogTUFSICovCisgICAgICAgICAgICB0Y2dfZ2VuX2NvbmNhdF9pMzJfaTY0KGNwdV9WMCwgY3B1X1JbcmRsb10sIGNwdV9SW3JkaGldKTsKKyAgICAgICAgICAgIGl3bW14dF9zdG9yZV9yZWcoY3B1X1YwLCBhY2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCisvKiBEaXNhc3NlbWJsZSBzeXN0ZW0gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24uICBSZXR1cm4gbm9uemVybyBpZgorICAgaW5zdHJ1Y3Rpb24gaXMgbm90IGRlZmluZWQuICAqLworc3RhdGljIGludCBkaXNhc19jcF9pbnNuKENQVUFSTVN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbikKK3sKKyAgICBUQ0d2IHRtcCwgdG1wMjsKKyAgICB1aW50MzJfdCByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICB1aW50MzJfdCBjcCA9IChpbnNuID4+IDgpICYgMHhmOworCisgICAgaWYgKGluc24gJiBBUk1fQ1BfUldfQklUKSB7CisgICAgICAgIGlmICghZW52LT5jcFtjcF0uY3BfcmVhZCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBnZW5fc2V0X3BjX2ltKHMtPnBjKTsKKyAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMihpbnNuKTsKKyAgICAgICAgZ2VuX2hlbHBlcl9nZXRfY3AodG1wLCBjcHVfZW52LCB0bXAyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0bXAyKTsKKyAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZW52LT5jcFtjcF0uY3Bfd3JpdGUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZ2VuX3NldF9wY19pbShzLT5wYyk7CisgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoaW5zbik7CisgICAgICAgIGdlbl9oZWxwZXJfc2V0X2NwKGNwdV9lbnYsIHRtcDIsIHRtcCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWUodG1wMik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwMTVfdXNlcl9vayhDUFVBUk1TdGF0ZSAqZW52LCB1aW50MzJfdCBpbnNuKQoreworICAgIGludCBjcG4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgaW50IGNwbSA9IGluc24gJiAweGY7CisgICAgaW50IG9wID0gKChpbnNuID4+IDUpICYgNykgfCAoKGluc24gPj4gMTgpICYgMHgzOCk7CisKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNykgJiYgY3BuID09IDkpIHsKKyAgICAgICAgLyogUGVyZm9ybWFuY2UgbW9uaXRvciByZWdpc3RlcnMgZmFsbCBpbnRvIHRocmVlIGNhdGVnb3JpZXM6CisgICAgICAgICAqICAoYSkgYWx3YXlzIFVOREVGIGluIHVzZXJtb2RlCisgICAgICAgICAqICAoYikgVU5ERUYgb25seSBpZiBQTVVTRVJFTlIuRU4gaXMgMAorICAgICAgICAgKiAgKGMpIGFsd2F5cyByZWFkIE9LIGFuZCBVTkRFRiBvbiB3cml0ZSAoUE1VU0VSRU5SIG9ubHkpCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNwbSA9PSAxMiAmJiAob3AgPCA2KSkgfHwKKyAgICAgICAgICAgIChjcG0gPT0gMTMgJiYgKG9wIDwgMykpKSB7CisgICAgICAgICAgICByZXR1cm4gZW52LT5jcDE1LmM5X3BtdXNlcmVucjsKKyAgICAgICAgfSBlbHNlIGlmIChjcG0gPT0gMTQgJiYgb3AgPT0gMCAmJiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpKSB7CisgICAgICAgICAgICAvKiBQTVVTRVJFTlIsIHJlYWQgb25seSAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGNwbiA9PSAxMyAmJiBjcG0gPT0gMCkgeworICAgICAgICAvKiBUTFMgcmVnaXN0ZXIuICAqLworICAgICAgICBpZiAob3AgPT0gMiB8fCAob3AgPT0gMyAmJiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcDE1X3Rsc19sb2FkX3N0b3JlKENQVUFSTVN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbiwgdWludDMyX3QgcmQpCit7CisgICAgVENHdiB0bXA7CisgICAgaW50IGNwbiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICBpbnQgY3BtID0gaW5zbiAmIDB4ZjsKKyAgICBpbnQgb3AgPSAoKGluc24gPj4gNSkgJiA3KSB8ICgoaW5zbiA+PiAxOCkgJiAweDM4KTsKKworICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNkspKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghKGNwbiA9PSAxMyAmJiBjcG0gPT0gMCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGluc24gJiBBUk1fQ1BfUldfQklUKSB7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoY3AxNS5jMTNfdGxzMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoY3AxNS5jMTNfdGxzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoY3AxNS5jMTNfdGxzMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBjcDE1LmMxM190bHMxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBjcDE1LmMxM190bHMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBjcDE1LmMxM190bHMzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOworfQorCisvKiBEaXNhc3NlbWJsZSBzeXN0ZW0gY29wcm9jZXNzb3IgKGNwMTUpIGluc3RydWN0aW9uLiAgUmV0dXJuIG5vbnplcm8gaWYKKyAgIGluc3RydWN0aW9uIGlzIG5vdCBkZWZpbmVkLiAgKi8KK3N0YXRpYyBpbnQgZGlzYXNfY3AxNV9pbnNuKENQVUFSTVN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbikKK3sKKyAgICB1aW50MzJfdCByZDsKKyAgICBUQ0d2IHRtcCwgdG1wMjsKKworICAgIC8qIE0gcHJvZmlsZSBjb3JlcyB1c2UgbWVtb3J5IG1hcHBlZCByZWdpc3RlcnMgaW5zdGVhZCBvZiBjcDE1LiAgKi8KKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9NKSkKKwlyZXR1cm4gMTsKKworICAgIGlmICgoaW5zbiAmICgxIDw8IDI1KSkgPT0gMCkgeworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgLyogbXJyYyAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogbWNyci4gIFVzZWQgZm9yIGJsb2NrIGNhY2hlIG9wZXJhdGlvbnMsIHNvIGltcGxlbWVudCBhcyBuby1vcC4gICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKGluc24gJiAoMSA8PCA0KSkgPT0gMCkgeworICAgICAgICAvKiBjZHAgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIFdlIHNwZWNpYWwgY2FzZSBhIG51bWJlciBvZiBjcDE1IGluc3RydWN0aW9ucyB3aGljaCB3ZXJlIHVzZWQKKyAgICAgKiBmb3IgdGhpbmdzIHdoaWNoIGFyZSByZWFsIGluc3RydWN0aW9ucyBpbiBBUk12Ny4gVGhpcyBhbGxvd3MKKyAgICAgKiB0aGVtIHRvIHdvcmsgaW4gbGludXgtdXNlciBtb2RlIHdoaWNoIGRvZXNuJ3QgcHJvdmlkZSBmdW5jdGlvbmFsCisgICAgICogZ2V0X2NwMTUvc2V0X2NwMTUgaGVscGVycywgYW5kIGlzIG1vcmUgZWZmaWNpZW50IGFueXdheS4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKChpbnNuICYgMHgwZmZmMGZmZikpIHsKKyAgICBjYXNlIDB4MGUwNzBmOTA6CisgICAgICAgIC8qIDAsYzcsYzAsNDogU3RhbmRhcmQgdjYgV0ZJIChhbHNvIHVzZWQgaW4gc29tZSBwcmUtdjYgY29yZXMpLgorICAgICAgICAgKiBJbiB2NywgdGhpcyBtdXN0IE5PUC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChJU19VU0VSKHMpKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjcpKSB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciBpbnRlcnJ1cHQuICAqLworICAgICAgICAgICAgZ2VuX3NldF9wY19pbShzLT5wYyk7CisgICAgICAgICAgICBzLT5pc19qbXAgPSBESVNBU19XRkk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSAweDBlMDcwZjU4OgorICAgICAgICAvKiAwLGM3LGM4LDI6IE5vdCBhbGwgcHJlLXY2IGNvcmVzIGltcGxlbWVudGVkIHRoaXMgV0ZJLAorICAgICAgICAgKiBzbyB0aGlzIGlzIHNsaWdodGx5IG92ZXItYnJvYWQuCisgICAgICAgICAqLworICAgICAgICBpZiAoIUlTX1VTRVIocykgJiYgIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpKSB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciBpbnRlcnJ1cHQuICAqLworICAgICAgICAgICAgZ2VuX3NldF9wY19pbShzLT5wYyk7CisgICAgICAgICAgICBzLT5pc19qbXAgPSBESVNBU19XRkk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBPdGhlcndpc2UgY29udGludWUgdG8gaGFuZGxlIHZpYSBoZWxwZXIgZnVuY3Rpb24uCisgICAgICAgICAqIEluIHBhcnRpY3VsYXIsIG9uIHY3IGFuZCBzb21lIHY2IGNvcmVzIHRoaXMgaXMgb25lIG9mCisgICAgICAgICAqIHRoZSBWQS1QQSByZWdpc3RlcnMuCisgICAgICAgICAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGUwNzBmM2Q6CisgICAgICAgIC8qIDAsYzcsYzEzLDE6IHByZWZldGNoLWJ5LU1WQSBpbiB2NiwgTk9QIGluIHY3ICovCisgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y2KSkgeworICAgICAgICAgICAgcmV0dXJuIElTX1VTRVIocykgPyAxIDogMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MGUwNzBmOTU6IC8qIDAsYzcsYzUsNCA6IElTQiAqLworICAgIGNhc2UgMHgwZTA3MGY5YTogLyogMCxjNyxjMTAsNDogRFNCICovCisgICAgY2FzZSAweDBlMDcwZmJhOiAvKiAwLGM3LGMxMCw1OiBETUIgKi8KKyAgICAgICAgLyogQmFycmllcnMgaW4gYm90aCB2NiBhbmQgdjcgKi8KKyAgICAgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVjYpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoSVNfVVNFUihzKSAmJiAhY3AxNV91c2VyX29rKGVudiwgaW5zbikpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisKKyAgICBpZiAoY3AxNV90bHNfbG9hZF9zdG9yZShlbnYsIHMsIGluc24sIHJkKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB0bXAyID0gdGNnX2NvbnN0X2kzMihpbnNuKTsKKyAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsKKyAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICBnZW5faGVscGVyX2dldF9jcDE1KHRtcCwgY3B1X2VudiwgdG1wMik7CisgICAgICAgIC8qIElmIHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBpcyByMTUgdGhlbiBzZXRzIGNvbmRpdGlvbiBjb2Rlcy4gICovCisgICAgICAgIGlmIChyZCAhPSAxNSkKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgIGdlbl9oZWxwZXJfc2V0X2NwMTUoY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgLyogTm9ybWFsbHkgd2Ugd291bGQgYWx3YXlzIGVuZCB0aGUgVEIgaGVyZSwgYnV0IExpbnV4CisgICAgICAgICAqIGFyY2gvYXJtL21hY2gtcHhhL3NsZWVwLlMgZXhwZWN0cyB0d28gaW5zdHJ1Y3Rpb25zIGZvbGxvd2luZworICAgICAgICAgKiBhbiBNTVUgZW5hYmxlIHRvIGV4ZWN1dGUgZnJvbSBjYWNoZS4gIEltaXRhdGUgdGhpcyBiZWhhdmlvdXIuICAqLworICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKSB8fAorICAgICAgICAgICAgICAgIChpbnNuICYgMHgwZmZmMGZmZikgIT0gMHgwZTAxMGYxMCkKKyAgICAgICAgICAgIGdlbl9sb29rdXBfdGIocyk7CisgICAgfQorICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFZGUF9SRUdfU0hSKHgsIG4pICgoKG4pID4gMCkgPyAoeCkgPj4gKG4pIDogKHgpIDw8IC0obikpCisjZGVmaW5lIFZGUF9TUkVHKGluc24sIGJpZ2JpdCwgc21hbGxiaXQpIFwKKyAgKChWRlBfUkVHX1NIUihpbnNuLCBiaWdiaXQgLSAxKSAmIDB4MWUpIHwgKCgoaW5zbikgPj4gKHNtYWxsYml0KSkgJiAxKSkKKyNkZWZpbmUgVkZQX0RSRUcocmVnLCBpbnNuLCBiaWdiaXQsIHNtYWxsYml0KSBkbyB7IFwKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkgeyBcCisgICAgICAgIHJlZyA9ICgoKGluc24pID4+IChiaWdiaXQpKSAmIDB4MGYpIFwKKyAgICAgICAgICAgICAgfCAoKChpbnNuKSA+PiAoKHNtYWxsYml0KSAtIDQpKSAmIDB4MTApOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBpZiAoaW5zbiAmICgxIDw8IChzbWFsbGJpdCkpKSBcCisgICAgICAgICAgICByZXR1cm4gMTsgXAorICAgICAgICByZWcgPSAoKGluc24pID4+IChiaWdiaXQpKSAmIDB4MGY7IFwKKyAgICB9fSB3aGlsZSAoMCkKKworI2RlZmluZSBWRlBfU1JFR19EKGluc24pIFZGUF9TUkVHKGluc24sIDEyLCAyMikKKyNkZWZpbmUgVkZQX0RSRUdfRChyZWcsIGluc24pIFZGUF9EUkVHKHJlZywgaW5zbiwgMTIsIDIyKQorI2RlZmluZSBWRlBfU1JFR19OKGluc24pIFZGUF9TUkVHKGluc24sIDE2LCAgNykKKyNkZWZpbmUgVkZQX0RSRUdfTihyZWcsIGluc24pIFZGUF9EUkVHKHJlZywgaW5zbiwgMTYsICA3KQorI2RlZmluZSBWRlBfU1JFR19NKGluc24pIFZGUF9TUkVHKGluc24sICAwLCAgNSkKKyNkZWZpbmUgVkZQX0RSRUdfTShyZWcsIGluc24pIFZGUF9EUkVHKHJlZywgaW5zbiwgIDAsICA1KQorCisvKiBNb3ZlIGJldHdlZW4gaW50ZWdlciBhbmQgVkZQIGNvcmVzLiAgKi8KK3N0YXRpYyBUQ0d2IGdlbl92ZnBfbXJzKHZvaWQpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9tb3ZfaTMyKHRtcCwgY3B1X0Ywcyk7CisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQgZ2VuX3ZmcF9tc3IoVENHdiB0bXApCit7CisgICAgdGNnX2dlbl9tb3ZfaTMyKGNwdV9GMHMsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX25lb25fZHVwX3U4KFRDR3YgdmFyLCBpbnQgc2hpZnQpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgaWYgKHNoaWZ0KQorICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHZhciwgdmFyLCBzaGlmdCk7CisgICAgdGNnX2dlbl9leHQ4dV9pMzIodmFyLCB2YXIpOworICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wLCB2YXIsIDgpOworICAgIHRjZ19nZW5fb3JfaTMyKHZhciwgdmFyLCB0bXApOworICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wLCB2YXIsIDE2KTsKKyAgICB0Y2dfZ2VuX29yX2kzMih2YXIsIHZhciwgdG1wKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworfQorCitzdGF0aWMgdm9pZCBnZW5fbmVvbl9kdXBfbG93MTYoVENHdiB2YXIpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9leHQxNnVfaTMyKHZhciwgdmFyKTsKKyAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcCwgdmFyLCAxNik7CisgICAgdGNnX2dlbl9vcl9pMzIodmFyLCB2YXIsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX25lb25fZHVwX2hpZ2gxNihUQ0d2IHZhcikKK3sKKyAgICBUQ0d2IHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHZhciwgdmFyLCAweGZmZmYwMDAwKTsKKyAgICB0Y2dfZ2VuX3NocmlfaTMyKHRtcCwgdmFyLCAxNik7CisgICAgdGNnX2dlbl9vcl9pMzIodmFyLCB2YXIsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKK30KKworc3RhdGljIFRDR3YgZ2VuX2xvYWRfYW5kX3JlcGxpY2F0ZShEaXNhc0NvbnRleHQgKnMsIFRDR3YgYWRkciwgaW50IHNpemUpCit7CisgICAgLyogTG9hZCBhIHNpbmdsZSBOZW9uIGVsZW1lbnQgYW5kIHJlcGxpY2F0ZSBpbnRvIGEgMzIgYml0IFRDRyByZWcgKi8KKyAgICBUQ0d2IHRtcDsKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHRtcCA9IGdlbl9sZDh1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBnZW5fbmVvbl9kdXBfdTgodG1wLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB0bXAgPSBnZW5fbGQxNnUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgIGdlbl9uZW9uX2R1cF9sb3cxNih0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvKiBBdm9pZCBjb21waWxlciB3YXJuaW5ncy4gICovCisgICAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHJldHVybiB0bXA7Cit9CisKKy8qIERpc2Fzc2VtYmxlIGEgVkZQIGluc3RydWN0aW9uLiAgUmV0dXJucyBub256ZXJvIGlmIGFuIGVycm9yIG9jY3VycmVkCisgICAoaWUuIGFuIHVuZGVmaW5lZCBpbnN0cnVjdGlvbikuICAqLworc3RhdGljIGludCBkaXNhc192ZnBfaW5zbihDUFVBUk1TdGF0ZSAqIGVudiwgRGlzYXNDb250ZXh0ICpzLCB1aW50MzJfdCBpbnNuKQoreworICAgIHVpbnQzMl90IHJkLCBybiwgcm0sIG9wLCBpLCBuLCBvZmZzZXQsIGRlbHRhX2QsIGRlbHRhX20sIGJhbmtfbWFzazsKKyAgICBpbnQgZHAsIHZlY2xlbjsKKyAgICBUQ0d2IGFkZHI7CisgICAgVENHdiB0bXA7CisgICAgVENHdiB0bXAyOworCisgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKCFzLT52ZnBfZW5hYmxlZCkgeworICAgICAgICAvKiBWRlAgZGlzYWJsZWQuICBPbmx5IGFsbG93IGZteHIvZm1yeCB0by9mcm9tIHNvbWUgY29udHJvbCByZWdzLiAgKi8KKyAgICAgICAgaWYgKChpbnNuICYgMHgwZmUwMGZmZikgIT0gMHgwZWUwMGExMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgaWYgKHJuICE9IEFSTV9WRlBfRlBTSUQgJiYgcm4gIT0gQVJNX1ZGUF9GUEVYQworICAgICAgICAgICAgJiYgcm4gIT0gQVJNX1ZGUF9NVkZSMSAmJiBybiAhPSBBUk1fVkZQX01WRlIwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGRwID0gKChpbnNuICYgMHhmMDApID09IDB4YjAwKTsKKyAgICBzd2l0Y2ggKChpbnNuID4+IDI0KSAmIDB4ZikgeworICAgIGNhc2UgMHhlOgorICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDQpKSB7CisgICAgICAgICAgICAvKiBzaW5nbGUgcmVnaXN0ZXIgdHJhbnNmZXIgKi8KKyAgICAgICAgICAgIHJkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICAgICAgaWYgKGRwKSB7CisgICAgICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgaW50IHBhc3M7CisKKyAgICAgICAgICAgICAgICBWRlBfRFJFR19OKHJuLCBpbnNuKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmIDB4ZikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAweDAwYzAwMDYwCisgICAgICAgICAgICAgICAgICAgICYmICFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX05FT04pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgICAgIHBhc3MgPSAoaW5zbiA+PiAyMSkgJiAxOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoKGluc24gPj4gNSkgJiAzKSAqIDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuICYgKDEgPDwgNSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChpbnNuICYgKDEgPDwgNikpID8gMTYgOiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdmZwLT5hcm0gKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybiwgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB0bXAsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdXh0Yih0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zeHRiKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wLCB0bXAsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdXh0aCh0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKHRtcCwgdG1wLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N4dGgodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFybS0+dmZwICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZEVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9kdXBfdTgodG1wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fZHVwX2xvdzE2KHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDw9IHBhc3MgKiAyOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X2kzMih0bXAyLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJuLCBuLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJuLCBuLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVk1PViAqLworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm4sIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9iZmkodG1wLCB0bXAyLCB0bXAsIG9mZnNldCwgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm4sIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9iZmkodG1wLCB0bXAyLCB0bXAsIG9mZnNldCwgMHhmZmZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJuLCBwYXNzLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLyogIWRwICovCisgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgMHg2ZikgIT0gMHgwMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgcm4gPSBWRlBfU1JFR19OKGluc24pOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgQVJNX0NQX1JXX0JJVCkgeworICAgICAgICAgICAgICAgICAgICAvKiB2ZnAtPmFybSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogc3lzdGVtIHJlZ2lzdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBybiA+Pj0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChybikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUk1fVkZQX0ZQU0lEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZGUDIgYWxsb3dzIGFjY2VzcyB0byBGU0lEIGZyb20gdXNlcnNwYWNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZGUDMgcmVzdHJpY3RzIGFsbCBpZCByZWdpc3RlcnMgdG8gcHJpdmlsZWdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2VzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZCh2ZnAueHJlZ3Nbcm5dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9GUEVYQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQodmZwLnhyZWdzW3JuXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFSTV9WRlBfRlBJTlNUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUk1fVkZQX0ZQSU5TVDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IHByZXNlbnQgaW4gVkZQMy4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX1VTRVIocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQodmZwLnhyZWdzW3JuXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFSTV9WRlBfRlBTQ1I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJkID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKHZmcC54cmVnc1tBUk1fVkZQX0ZQU0NSXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wLCB0bXAsIDB4ZjAwMDAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl92ZnBfZ2V0X2Zwc2NyKHRtcCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUk1fVkZQX01WRlIwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUk1fVkZQX01WRlIxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19VU0VSKHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZCh2ZnAueHJlZ3Nbcm5dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoMCwgcm4pOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX3ZmcF9tcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmQgPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgNCBmbGFnIGJpdHMgaW4gdGhlIENQU1IuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3NldF9uemN2KHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYXJtLT52ZnAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm4gPj49IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeXN0ZW0gcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9GUFNJRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9NVkZSMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9NVkZSMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXcml0ZXMgYXJlIGlnbm9yZWQuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBUk1fVkZQX0ZQU0NSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmZwX3NldF9mcHNjcihjcHVfZW52LCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2xvb2t1cF90YihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9GUEVYQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogVkZQIHN1YmFyY2hpdGVjdHVyZSBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZvciBub3csIGtlZXAgdGhlIEVOIGJpdCBvbmx5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgMSA8PCAzMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfY3B1X2ZpZWxkKHRtcCwgdmZwLnhyZWdzW3JuXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2xvb2t1cF90YihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVJNX1ZGUF9GUElOU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFSTV9WRlBfRlBJTlNUMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCB2ZnAueHJlZ3Nbcm5dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX21zcih0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl92cmVnX0YwKDAsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGRhdGEgcHJvY2Vzc2luZyAqLworICAgICAgICAgICAgLyogVGhlIG9wY29kZSBpcyBpbiBiaXRzIDIzLCAyMSwgMjAgYW5kIDYuICAqLworICAgICAgICAgICAgb3AgPSAoKGluc24gPj4gMjApICYgOCkgfCAoKGluc24gPj4gMTkpICYgNikgfCAoKGluc24gPj4gNikgJiAxKTsKKyAgICAgICAgICAgIGlmIChkcCkgeworICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxNSkgeworICAgICAgICAgICAgICAgICAgICAvKiBybiBpcyBvcGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgcm4gPSAoKGluc24gPj4gMTUpICYgMHgxZSkgfCAoKGluc24gPj4gNykgJiAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBybiBpcyByZWdpc3RlciBudW1iZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgVkZQX0RSRUdfTihybiwgaW5zbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG9wID09IDE1ICYmIChybiA9PSAxNSB8fCAoKHJuICYgMHgxYykgPT0gMHgxOCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEludGVnZXIgb3Igc2luZ2xlIHByZWNpc2lvbiBkZXN0aW5hdGlvbi4gICovCisgICAgICAgICAgICAgICAgICAgIHJkID0gVkZQX1NSRUdfRChpbnNuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBWRlBfRFJFR19EKHJkLCBpbnNuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wID09IDE1ICYmCisgICAgICAgICAgICAgICAgICAgICgoKHJuICYgMHgxYykgPT0gMHgxMCkgfHwgKChybiAmIDB4MTQpID09IDB4MTQpKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBWQ1ZUIGZyb20gaW50IGlzIGFsd2F5cyBmcm9tIFMgcmVnIHJlZ2FyZGxlc3Mgb2YgZHAgYml0LgorICAgICAgICAgICAgICAgICAgICAgKiBWQ1ZUIHdpdGggaW1tZWRpYXRlIGZyYWNfYml0cyBoYXMgc2FtZSBmb3JtYXQgYXMgU1JFR19NCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBybSA9IFZGUF9TUkVHX00oaW5zbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVkZQX0RSRUdfTShybSwgaW5zbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybiA9IFZGUF9TUkVHX04oaW5zbik7CisgICAgICAgICAgICAgICAgaWYgKG9wID09IDE1ICYmIHJuID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIERvdWJsZSBwcmVjaXNpb24gZGVzdGluYXRpb24uICAqLworICAgICAgICAgICAgICAgICAgICBWRlBfRFJFR19EKHJkLCBpbnNuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZCA9IFZGUF9TUkVHX0QoaW5zbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIE5CIHRoYXQgd2UgaW1wbGljaXRseSByZWx5IG9uIHRoZSBlbmNvZGluZyBmb3IgdGhlIGZyYWNfYml0cworICAgICAgICAgICAgICAgICAqIGluIFZDVlQgb2YgZml4ZWQgdG8gZmxvYXQgYmVpbmcgdGhlIHNhbWUgYXMgdGhhdCBvZiBhbiBTUkVHX00KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBybSA9IFZGUF9TUkVHX00oaW5zbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZlY2xlbiA9IHMtPnZlY19sZW47CisgICAgICAgICAgICBpZiAob3AgPT0gMTUgJiYgcm4gPiAzKQorICAgICAgICAgICAgICAgIHZlY2xlbiA9IDA7CisKKyAgICAgICAgICAgIC8qIFNodXQgdXAgY29tcGlsZXIgd2FybmluZ3MuICAqLworICAgICAgICAgICAgZGVsdGFfbSA9IDA7CisgICAgICAgICAgICBkZWx0YV9kID0gMDsKKyAgICAgICAgICAgIGJhbmtfbWFzayA9IDA7CisKKyAgICAgICAgICAgIGlmICh2ZWNsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGRwKQorICAgICAgICAgICAgICAgICAgICBiYW5rX21hc2sgPSAweGM7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBiYW5rX21hc2sgPSAweDE4OworCisgICAgICAgICAgICAgICAgLyogRmlndXJlIG91dCB3aGF0IHR5cGUgb2YgdmVjdG9yIG9wZXJhdGlvbiB0aGlzIGlzLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJkICYgYmFua19tYXNrKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxhciAqLworICAgICAgICAgICAgICAgICAgICB2ZWNsZW4gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2QgPSAocy0+dmVjX3N0cmlkZSA+PiAxKSArIDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2QgPSBzLT52ZWNfc3RyaWRlICsgMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHJtICYgYmFua19tYXNrKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaXhlZCBzY2FsYXIvdmVjdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9tID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlY3RvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfbSA9IGRlbHRhX2Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIExvYWQgdGhlIGluaXRpYWwgb3BlcmFuZHMuICAqLworICAgICAgICAgICAgaWYgKG9wID09IDE1KSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChybikgeworICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgY2FzZSAxNzoKKyAgICAgICAgICAgICAgICAgICAgLyogSW50ZWdlciBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl9GMF92cmVnKDAsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgLyogQ29tcGFyZSAqLworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoZHAsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl9GMV92cmVnKGRwLCBybSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgICAgICAgICAgLyogQ29tcGFyZSB3aXRoIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl9GMF92cmVnKGRwLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfRjFfbGQwKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHRoZSBzYW1lLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl9GMF92cmVnKGRwLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgLyogVkNWVEIsIFZDVlRUOiBvbmx5IHByZXNlbnQgd2l0aCB0aGUgaGFsZnByZWMgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgKiBVTlBSRURJQ1RBQkxFIGlmIGJpdCA4IGlzIHNldCAod2UgY2hvb3NlIHRvIFVOREVGKQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRwIHx8ICFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUF9GUDE2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8qIE9uZSBzb3VyY2Ugb3BlcmFuZC4gICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcm0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFR3byBzb3VyY2Ugb3BlcmFuZHMuICAqLworICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcm4pOworICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjFfdnJlZyhkcCwgcm0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgLyogUGVyZm9ybSB0aGUgY2FsY3VsYXRpb24uICAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIFZNTEE6IGZkICsgKGZuICogZm0pICovCisgICAgICAgICAgICAgICAgICAgIC8qIE5vdGUgdGhhdCBvcmRlciBvZiBpbnB1dHMgdG8gdGhlIGFkZCBtYXR0ZXJzIGZvciBOYU5zICovCisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfRjFfbXVsKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl9GMF92cmVnKGRwLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfYWRkKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBWTUxTOiBmZCArIC0oZm4gKiBmbSkgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tdWwoZHApOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX0YxX25lZyhkcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcmQpOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX2FkZChkcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogVk5NTFM6IC1mZCArIChmbiAqIGZtKSAqLworICAgICAgICAgICAgICAgICAgICAvKiBOb3RlIHRoYXQgaXQgaXNuJ3QgdmFsaWQgdG8gcmVwbGFjZSAoLUEgKyBCKSB3aXRoIChCIC0gQSkKKyAgICAgICAgICAgICAgICAgICAgICogb3Igc2ltaWxhciBwbGF1c2libGUgbG9va2luZyBzaW1wbGlmaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSB0aGlzIHdpbGwgZ2l2ZSB3cm9uZyByZXN1bHRzIGZvciBOYU5zLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9GMV9tdWwoZHApOworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoZHAsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9uZWcoZHApOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX2FkZChkcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogLyogVk5NTEE6IC1mZCArIC0oZm4gKiBmbSkgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tdWwoZHApOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX0YxX25lZyhkcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcmQpOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX25lZyhkcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfYWRkKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiAvKiBtdWw6IGZuICogZm0gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tdWwoZHApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIG5tdWw6IC0oZm4gKiBmbSkgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tdWwoZHApOworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX25lZyhkcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjogLyogYWRkOiBmbiArIGZtICovCisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfYWRkKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3OiAvKiBzdWI6IGZuIC0gZm0gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9zdWIoZHApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDg6IC8qIGRpdjogZm4gLyBmbSAqLworICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX2RpdihkcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTQ6IC8qIGZjb25zdCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykpCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgICAgICAgICAgbiA9IChpbnNuIDw8IDEyKSAmIDB4ODAwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgIGkgPSAoKGluc24gPj4gMTIpICYgMHg3MCkgfCAoaW5zbiAmIDB4Zik7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiAweDQwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgfD0gMHgzZjgwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgfD0gMHg0MDAwOworICAgICAgICAgICAgICAgICAgICAgICAgbiB8PSBpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2k2NChjcHVfRjBkLCAoKHVpbnQ2NF90KW4pIDw8IDMyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYgMHg0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIHw9IDB4NzgwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgfD0gMHg4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICBuIHw9IGkgPDwgMTk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9GMHMsIG4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTU6IC8qIGV4dGVuc2lvbiBzcGFjZSAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJuKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLyogY3B5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBuby1vcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLyogYWJzICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX2FicyhkcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBuZWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbmVnKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IC8qIHNxcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfc3FydChkcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAvKiB2Y3Z0Yi5mMzIuZjE2ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fdmZwX21ycygpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfaTMyKHRtcCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmZwX2ZjdnRfZjE2X3RvX2YzMihjcHVfRjBzLCB0bXAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIHZjdnR0LmYzMi5mMTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl92ZnBfbXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHRtcCwgdG1wLCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9mY3Z0X2YxNl90b19mMzIoY3B1X0YwcywgdG1wLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiB2Y3Z0Yi5mMTYuZjMyICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9mY3Z0X2YzMl90b19mMTYodG1wLCBjcHVfRjBzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZygwLCByZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gZ2VuX3ZmcF9tcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wMiwgdG1wMiwgMHhmZmZmMDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbXNyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiAvKiB2Y3Z0dC5mMTYuZjMyICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9mY3Z0X2YzMl90b19mMTYodG1wLCBjcHVfRjBzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wLCB0bXAsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZygwLCByZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gZ2VuX3ZmcF9tcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZ1X2kzMih0bXAyLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tc3IodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IC8qIGNtcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9jbXAoZHApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgOTogLyogY21wZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9jbXBlKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOiAvKiBjbXB6ICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX2NtcChkcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTogLyogY21wZXogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfRjFfbGQwKGRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfY21wZShkcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxNTogLyogc2luZ2xlPC0+ZG91YmxlIGNvbnZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9mY3Z0c2QoY3B1X0YwcywgY3B1X0YwZCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl92ZnBfZmN2dGRzKGNwdV9GMGQsIGNwdV9GMHMsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6IC8qIGZ1aXRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3VpdG8oZHAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6IC8qIGZzaXRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3NpdG8oZHAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6IC8qIGZzaHRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9zaHRvKGRwLCAxNiAtIHJtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOiAvKiBmc2x0byAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfc2x0byhkcCwgMzIgLSBybSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjogLyogZnVodG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3VodG8oZHAsIDE2IC0gcm0sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6IC8qIGZ1bHRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF91bHRvKGRwLCAzMiAtIHJtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OiAvKiBmdG91aSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF90b3VpKGRwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OiAvKiBmdG91aXogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdG91aXooZHAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6IC8qIGZ0b3NpICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3Rvc2koZHAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6IC8qIGZ0b3NpeiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF90b3NpeihkcCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyODogLyogZnRvc2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3Rvc2goZHAsIDE2IC0gcm0sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6IC8qIGZ0b3NsICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQMykpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF90b3NsKGRwLCAzMiAtIHJtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOiAvKiBmdG91aCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUDMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdG91aChkcCwgMTYgLSBybSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTogLyogZnRvdWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WRlAzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3RvdWwoZHAsIDMyIC0gcm0sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIHVuZGVmaW5lZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmICgicm46JWRcbiIsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIHVuZGVmaW5lZCAqLworICAgICAgICAgICAgICAgICAgICBwcmludGYgKCJvcDolZFxuIiwgb3ApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBXcml0ZSBiYWNrIHRoZSByZXN1bHQuICAqLworICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxNSAmJiAocm4gPj0gOCAmJiBybiA8PSAxMSkpCisgICAgICAgICAgICAgICAgICAgIDsgLyogQ29tcGFyaXNvbiwgZG8gbm90aGluZy4gICovCisgICAgICAgICAgICAgICAgZWxzZSBpZiAob3AgPT0gMTUgJiYgZHAgJiYgKChybiAmIDB4MWMpID09IDB4MTgpKQorICAgICAgICAgICAgICAgICAgICAvKiBWQ1ZUIGRvdWJsZSB0byBpbnQ6IGFsd2F5cyBpbnRlZ2VyIHJlc3VsdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl92cmVnX0YwKDAsIHJkKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChvcCA9PSAxNSAmJiBybiA9PSAxNSkKKyAgICAgICAgICAgICAgICAgICAgLyogY29udmVyc2lvbiAqLworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X3ZyZWdfRjAoIWRwLCByZCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnZW5fbW92X3ZyZWdfRjAoZHAsIHJkKTsKKworICAgICAgICAgICAgICAgIC8qIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBpZiB3ZSBoYXZlIGZpbmlzaGVkICAqLworICAgICAgICAgICAgICAgIGlmICh2ZWNsZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gMTUgJiYgZGVsdGFfbSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNpbmdsZSBzb3VyY2Ugb25lLW1hbnkgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHZlY2xlbi0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZCA9ICgocmQgKyBkZWx0YV9kKSAmIChiYW5rX21hc2sgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAocmQgJiBiYW5rX21hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl92cmVnX0YwKGRwLCByZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFNldHVwIHRoZSBuZXh0IG9wZXJhbmRzLiAgKi8KKyAgICAgICAgICAgICAgICB2ZWNsZW4tLTsKKyAgICAgICAgICAgICAgICByZCA9ICgocmQgKyBkZWx0YV9kKSAmIChiYW5rX21hc2sgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgIHwgKHJkICYgYmFua19tYXNrKTsKKworICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxNSkgeworICAgICAgICAgICAgICAgICAgICAvKiBPbmUgc291cmNlIG9wZXJhbmQuICAqLworICAgICAgICAgICAgICAgICAgICBybSA9ICgocm0gKyBkZWx0YV9tKSAmIChiYW5rX21hc2sgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IChybSAmIGJhbmtfbWFzayk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcm0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFR3byBzb3VyY2Ugb3BlcmFuZHMuICAqLworICAgICAgICAgICAgICAgICAgICBybiA9ICgocm4gKyBkZWx0YV9kKSAmIChiYW5rX21hc2sgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICB8IChybiAmIGJhbmtfbWFzayk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcm4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFfbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm0gPSAoKHJtICsgZGVsdGFfbSkgJiAoYmFua19tYXNrIC0gMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHJtICYgYmFua19tYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjFfdnJlZyhkcCwgcm0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjOgorICAgIGNhc2UgMHhkOgorICAgICAgICBpZiAoKGluc24gJiAweDAzZTAwMDAwKSA9PSAweDAwNDAwMDAwKSB7CisgICAgICAgICAgICAvKiB0d28tcmVnaXN0ZXIgdHJhbnNmZXIgKi8KKyAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICBpZiAoZHApIHsKKyAgICAgICAgICAgICAgICBWRlBfRFJFR19NKHJtLCBpbnNuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSBWRlBfU1JFR19NKGluc24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsKKyAgICAgICAgICAgICAgICAvKiB2ZnAtPmFybSAqLworICAgICAgICAgICAgICAgIGlmIChkcCkgeworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoMCwgcm0gKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX3ZmcF9tcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoMCwgcm0gKiAyICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl92ZnBfbXJzKCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgdG1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoMCwgcm0pOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fdmZwX21ycygpOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZygwLCBybSArIDEpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fdmZwX21ycygpOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIHRtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBhcm0tPnZmcCAqLworICAgICAgICAgICAgICAgIGlmIChkcCkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbXNyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfdnJlZ19GMCgwLCBybSAqIDIpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbXNyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfdnJlZ19GMCgwLCBybSAqIDIgKyAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbXNyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfdnJlZ19GMCgwLCBybSk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9tc3IodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl92cmVnX0YwKDAsIHJtICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTG9hZC9zdG9yZSAqLworICAgICAgICAgICAgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgICAgICBpZiAoZHApCisgICAgICAgICAgICAgICAgVkZQX0RSRUdfRChyZCwgaW5zbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmQgPSBWRlBfU1JFR19EKGluc24pOworICAgICAgICAgICAgaWYgKChpbnNuICYgMHgwMTIwMDAwMCkgPT0gMHgwMTAwMDAwMCkgeworICAgICAgICAgICAgICAgIC8qIFNpbmdsZSBsb2FkL3N0b3JlICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGluc24gJiAweGZmKSA8PCAyOworICAgICAgICAgICAgICAgIGlmICgoaW5zbiAmICgxIDw8IDIzKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAocy0+dGh1bWIgJiYgcm4gPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBVTlBSRURJQ1RBQkxFICovCisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoYWRkciwgcy0+cGMgJiB+Mik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjApKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbGQocywgZHAsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X3ZyZWdfRjAoZHAsIHJkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5fbW92X0YwX3ZyZWcoZHAsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9zdChzLCBkcCwgYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIG11bHRpcGxlICovCisgICAgICAgICAgICAgICAgaW50IHcgPSBpbnNuICYgKDEgPDwgMjEpOworICAgICAgICAgICAgICAgIGlmIChkcCkKKyAgICAgICAgICAgICAgICAgICAgbiA9IChpbnNuID4+IDEpICYgMHg3ZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4gPSBpbnNuICYgMHhmZjsKKworICAgICAgICAgICAgICAgIGlmICh3ICYmICEoKChpbnNuID4+IDIzKSBeIChpbnNuID4+IDI0KSkgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBQID09IFUgLCBXID09IDEgID0+IFVOREVGICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobiA9PSAwIHx8IChyZCArIG4pID4gMzIgfHwgKGRwICYmIG4gPiAxNikpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVU5QUkVESUNUQUJMRSBjYXNlcyBmb3IgYmFkIGltbWVkaWF0ZXM6IHdlIGNob29zZSB0bworICAgICAgICAgICAgICAgICAgICAgKiBVTkRFRiB0byBhdm9pZCBnZW5lcmF0aW5nIGh1Z2UgbnVtYmVycyBvZiBUQ0cgb3BzCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJuID09IDE1ICYmIHcpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogd3JpdGViYWNrIHRvIFBDIGlzIFVOUFJFRElDVEFCTEUsIHdlIGNob29zZSB0byBVTkRFRiAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocy0+dGh1bWIgJiYgcm4gPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhY3R1YWxseSBVTlBSRURJQ1RBQkxFICovCisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoYWRkciwgcy0+cGMgJiB+Mik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIC8qIHByZS1kZWNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtKChpbnNuICYgMHhmZikgPDwgMikpOworCisgICAgICAgICAgICAgICAgaWYgKGRwKQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSA4OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gNDsKKyAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfY29uc3RfaTMyKG9mZnNldCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmIEFSTV9DUF9SV19CSVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfbGQocywgZHAsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX21vdl92cmVnX0YwKGRwLCByZCArIGkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9tb3ZfRjBfdnJlZyhkcCwgcmQgKyBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfc3QocywgZHAsIGFkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgIGlmICh3KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlYmFjayAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQgKiBuOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkcCAmJiAoaW5zbiAmIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gNDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgYWRkcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIFNob3VsZCBuZXZlciBoYXBwZW4uICAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fZ290b190YihEaXNhc0NvbnRleHQgKnMsIGludCBuLCB1aW50MzJfdCBkZXN0KQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworCisgICAgdGIgPSBzLT50YjsKKyAgICBpZiAoKHRiLT5wYyAmIFRBUkdFVF9QQUdFX01BU0spID09IChkZXN0ICYgVEFSR0VUX1BBR0VfTUFTSykpIHsKKyAgICAgICAgdGNnX2dlbl9nb3RvX3RiKG4pOworICAgICAgICBnZW5fc2V0X3BjX2ltKGRlc3QpOworICAgICAgICB0Y2dfZ2VuX2V4aXRfdGIoKHRjZ190YXJnZXRfbG9uZyl0YiArIG4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9zZXRfcGNfaW0oZGVzdCk7CisgICAgICAgIHRjZ19nZW5fZXhpdF90YigwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fam1wIChEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IGRlc3QpCit7CisgICAgaWYgKHVubGlrZWx5KHMtPnNpbmdsZXN0ZXBfZW5hYmxlZCkpIHsKKyAgICAgICAgLyogQW4gaW5kaXJlY3QganVtcCBzbyB0aGF0IHdlIHN0aWxsIHRyaWdnZXIgdGhlIGRlYnVnIGV4Y2VwdGlvbi4gICovCisgICAgICAgIGlmIChzLT50aHVtYikKKyAgICAgICAgICAgIGRlc3QgfD0gMTsKKyAgICAgICAgZ2VuX2J4X2ltKHMsIGRlc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9nb3RvX3RiKHMsIDAsIGRlc3QpOworICAgICAgICBzLT5pc19qbXAgPSBESVNBU19UQl9KVU1QOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9tdWx4eShUQ0d2IHQwLCBUQ0d2IHQxLCBpbnQgeCwgaW50IHkpCit7CisgICAgaWYgKHgpCisgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIodDAsIHQwLCAxNik7CisgICAgZWxzZQorICAgICAgICBnZW5fc3h0aCh0MCk7CisgICAgaWYgKHkpCisgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIodDEsIHQxLCAxNik7CisgICAgZWxzZQorICAgICAgICBnZW5fc3h0aCh0MSk7CisgICAgdGNnX2dlbl9tdWxfaTMyKHQwLCB0MCwgdDEpOworfQorCisvKiBSZXR1cm4gdGhlIG1hc2sgb2YgUFNSIGJpdHMgc2V0IGJ5IGEgTVNSIGluc3RydWN0aW9uLiAgKi8KK3N0YXRpYyB1aW50MzJfdCBtc3JfbWFzayhDUFVBUk1TdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBmbGFncywgaW50IHNwc3IpIHsKKyAgICB1aW50MzJfdCBtYXNrOworCisgICAgbWFzayA9IDA7CisgICAgaWYgKGZsYWdzICYgKDEgPDwgMCkpCisgICAgICAgIG1hc2sgfD0gMHhmZjsKKyAgICBpZiAoZmxhZ3MgJiAoMSA8PCAxKSkKKyAgICAgICAgbWFzayB8PSAweGZmMDA7CisgICAgaWYgKGZsYWdzICYgKDEgPDwgMikpCisgICAgICAgIG1hc2sgfD0gMHhmZjAwMDA7CisgICAgaWYgKGZsYWdzICYgKDEgPDwgMykpCisgICAgICAgIG1hc2sgfD0gMHhmZjAwMDAwMDsKKworICAgIC8qIE1hc2sgb3V0IHVuZGVmaW5lZCBiaXRzLiAgKi8KKyAgICBtYXNrICY9IH5DUFNSX1JFU0VSVkVEOworICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNFQpKQorICAgICAgICBtYXNrICY9IH5DUFNSX1Q7CisgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y1KSkKKyAgICAgICAgbWFzayAmPSB+Q1BTUl9ROyAvKiBWNVRFIGluIHJlYWxpdHkqLworICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WNikpCisgICAgICAgIG1hc2sgJj0gfihDUFNSX0UgfCBDUFNSX0dFKTsKKyAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyKSkKKyAgICAgICAgbWFzayAmPSB+Q1BTUl9JVDsKKyAgICAvKiBNYXNrIG91dCBleGVjdXRpb24gc3RhdGUgYml0cy4gICovCisgICAgaWYgKCFzcHNyKQorICAgICAgICBtYXNrICY9IH5DUFNSX0VYRUM7CisgICAgLyogTWFzayBvdXQgcHJpdmlsZWdlZCBiaXRzLiAgKi8KKyAgICBpZiAoSVNfVVNFUihzKSkKKyAgICAgICAgbWFzayAmPSBDUFNSX1VTRVI7CisgICAgcmV0dXJuIG1hc2s7Cit9CisKKy8qIFJldHVybnMgbm9uemVybyBpZiBhY2Nlc3MgdG8gdGhlIFBTUiBpcyBub3QgcGVybWl0dGVkLiBNYXJrcyB0MCBhcyBkZWFkLiAqLworc3RhdGljIGludCBnZW5fc2V0X3BzcihEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IG1hc2ssIGludCBzcHNyLCBUQ0d2IHQwKQoreworICAgIFRDR3YgdG1wOworICAgIGlmIChzcHNyKSB7CisgICAgICAgIC8qID8/PyBUaGlzIGlzIGFsc28gdW5kZWZpbmVkIGluIHN5c3RlbSBtb2RlLiAgKi8KKyAgICAgICAgaWYgKElTX1VTRVIocykpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZChzcHNyKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgfm1hc2spOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQwLCB0MCwgbWFzayk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0MCk7CisgICAgICAgIHN0b3JlX2NwdV9maWVsZCh0bXAsIHNwc3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9zZXRfY3Bzcih0MCwgbWFzayk7CisgICAgfQorICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICBnZW5fbG9va3VwX3RiKHMpOworICAgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIG5vbnplcm8gaWYgYWNjZXNzIHRvIHRoZSBQU1IgaXMgbm90IHBlcm1pdHRlZC4gICovCitzdGF0aWMgaW50IGdlbl9zZXRfcHNyX2ltKERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgbWFzaywgaW50IHNwc3IsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBUQ0d2IHRtcDsKKyAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIHZhbCk7CisgICAgcmV0dXJuIGdlbl9zZXRfcHNyKHMsIG1hc2ssIHNwc3IsIHRtcCk7Cit9CisKKy8qIEdlbmVyYXRlIGFuIG9sZC1zdHlsZSBleGNlcHRpb24gcmV0dXJuLiBNYXJrcyBwYyBhcyBkZWFkLiAqLworc3RhdGljIHZvaWQgZ2VuX2V4Y2VwdGlvbl9yZXR1cm4oRGlzYXNDb250ZXh0ICpzLCBUQ0d2IHBjKQoreworICAgIFRDR3YgdG1wOworICAgIHN0b3JlX3JlZyhzLCAxNSwgcGMpOworICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKHNwc3IpOworICAgIGdlbl9zZXRfY3Bzcih0bXAsIDB4ZmZmZmZmZmYpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgcy0+aXNfam1wID0gRElTQVNfVVBEQVRFOworfQorCisvKiBHZW5lcmF0ZSBhIHY2IGV4Y2VwdGlvbiByZXR1cm4uICBNYXJrcyBib3RoIHZhbHVlcyBhcyBkZWFkLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9yZmUoRGlzYXNDb250ZXh0ICpzLCBUQ0d2IHBjLCBUQ0d2IGNwc3IpCit7CisgICAgZ2VuX3NldF9jcHNyKGNwc3IsIDB4ZmZmZmZmZmYpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGNwc3IpOworICAgIHN0b3JlX3JlZyhzLCAxNSwgcGMpOworICAgIHMtPmlzX2ptcCA9IERJU0FTX1VQREFURTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZW5fc2V0X2NvbmRleGVjIChEaXNhc0NvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmNvbmRleGVjX21hc2spIHsKKyAgICAgICAgdWludDMyX3QgdmFsID0gKHMtPmNvbmRleGVjX2NvbmQgPDwgNCkgfCAocy0+Y29uZGV4ZWNfbWFzayA+PiAxKTsKKyAgICAgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCB2YWwpOworICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBjb25kZXhlY19iaXRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9leGNlcHRpb25faW5zbihEaXNhc0NvbnRleHQgKnMsIGludCBvZmZzZXQsIGludCBleGNwKQoreworICAgIGdlbl9zZXRfY29uZGV4ZWMocyk7CisgICAgZ2VuX3NldF9wY19pbShzLT5wYyAtIG9mZnNldCk7CisgICAgZ2VuX2V4Y2VwdGlvbihleGNwKTsKKyAgICBzLT5pc19qbXAgPSBESVNBU19KVU1QOworfQorCitzdGF0aWMgdm9pZCBnZW5fbm9wX2hpbnQoRGlzYXNDb250ZXh0ICpzLCBpbnQgdmFsKQoreworICAgIHN3aXRjaCAodmFsKSB7CisgICAgY2FzZSAzOiAvKiB3ZmkgKi8KKyAgICAgICAgZ2VuX3NldF9wY19pbShzLT5wYyk7CisgICAgICAgIHMtPmlzX2ptcCA9IERJU0FTX1dGSTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiAvKiB3ZmUgKi8KKyAgICBjYXNlIDQ6IC8qIHNldiAqLworICAgICAgICAvKiBUT0RPOiBJbXBsZW1lbnQgU0VWIGFuZCBXRkUuICBNYXkgaGVscCBTTVAgcGVyZm9ybWFuY2UuICAqLworICAgIGRlZmF1bHQ6IC8qIG5vcCAqLworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ1BVX1YwMDEgY3B1X1YwLCBjcHVfVjAsIGNwdV9WMQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fYWRkKGludCBzaXplLCBUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX2FkZF91OCh0MCwgdDAsIHQxKTsgYnJlYWs7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fYWRkX3UxNih0MCwgdDAsIHQxKTsgYnJlYWs7CisgICAgY2FzZSAyOiB0Y2dfZ2VuX2FkZF9pMzIodDAsIHQwLCB0MSk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fcnNiKGludCBzaXplLCBUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX3N1Yl91OCh0MCwgdDEsIHQwKTsgYnJlYWs7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fc3ViX3UxNih0MCwgdDEsIHQwKTsgYnJlYWs7CisgICAgY2FzZSAyOiB0Y2dfZ2VuX3N1Yl9pMzIodDAsIHQxLCB0MCk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybjsKKyAgICB9Cit9CisKKy8qIDMyLWJpdCBwYWlyd2lzZSBvcHMgZW5kIHVwIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50d2lzZSB2ZXJzaW9ucy4gICovCisjZGVmaW5lIGdlbl9oZWxwZXJfbmVvbl9wbWF4X3MzMiAgZ2VuX2hlbHBlcl9uZW9uX21heF9zMzIKKyNkZWZpbmUgZ2VuX2hlbHBlcl9uZW9uX3BtYXhfdTMyICBnZW5faGVscGVyX25lb25fbWF4X3UzMgorI2RlZmluZSBnZW5faGVscGVyX25lb25fcG1pbl9zMzIgIGdlbl9oZWxwZXJfbmVvbl9taW5fczMyCisjZGVmaW5lIGdlbl9oZWxwZXJfbmVvbl9wbWluX3UzMiAgZ2VuX2hlbHBlcl9uZW9uX21pbl91MzIKKworI2RlZmluZSBHRU5fTkVPTl9JTlRFR0VSX09QX0VOVihuYW1lKSBkbyB7IFwKKyAgICBzd2l0Y2ggKChzaXplIDw8IDEpIHwgdSkgeyBcCisgICAgY2FzZSAwOiBcCisgICAgICAgIGdlbl9oZWxwZXJfbmVvbl8jI25hbWUjI19zOCh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDE6IFwKKyAgICAgICAgZ2VuX2hlbHBlcl9uZW9uXyMjbmFtZSMjX3U4KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgMjogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfczE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgMzogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfdTE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgNDogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfczMyKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgNTogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfdTMyKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGRlZmF1bHQ6IHJldHVybiAxOyBcCisgICAgfX0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VOX05FT05fSU5URUdFUl9PUChuYW1lKSBkbyB7IFwKKyAgICBzd2l0Y2ggKChzaXplIDw8IDEpIHwgdSkgeyBcCisgICAgY2FzZSAwOiBcCisgICAgICAgIGdlbl9oZWxwZXJfbmVvbl8jI25hbWUjI19zOCh0bXAsIHRtcCwgdG1wMik7IFwKKyAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDE6IFwKKyAgICAgICAgZ2VuX2hlbHBlcl9uZW9uXyMjbmFtZSMjX3U4KHRtcCwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgMjogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfczE2KHRtcCwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgMzogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfdTE2KHRtcCwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgNDogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfczMyKHRtcCwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGNhc2UgNTogXAorICAgICAgICBnZW5faGVscGVyX25lb25fIyNuYW1lIyNfdTMyKHRtcCwgdG1wLCB0bXAyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIGRlZmF1bHQ6IHJldHVybiAxOyBcCisgICAgfX0gd2hpbGUgKDApCisKK3N0YXRpYyBUQ0d2IG5lb25fbG9hZF9zY3JhdGNoKGludCBzY3JhdGNoKQoreworICAgIFRDR3YgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fbGRfaTMyKHRtcCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIHZmcC5zY3JhdGNoW3NjcmF0Y2hdKSk7CisgICAgcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQgbmVvbl9zdG9yZV9zY3JhdGNoKGludCBzY3JhdGNoLCBUQ0d2IHZhcikKK3sKKyAgICB0Y2dfZ2VuX3N0X2kzMih2YXIsIGNwdV9lbnYsIG9mZnNldG9mKENQVUFSTVN0YXRlLCB2ZnAuc2NyYXRjaFtzY3JhdGNoXSkpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHZhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgVENHdiBuZW9uX2dldF9zY2FsYXIoaW50IHNpemUsIGludCByZWcpCit7CisgICAgVENHdiB0bXA7CisgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJlZyAmIDcsIHJlZyA+PiA0KTsKKyAgICAgICAgaWYgKHJlZyAmIDgpIHsKKyAgICAgICAgICAgIGdlbl9uZW9uX2R1cF9oaWdoMTYodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9uZW9uX2R1cF9sb3cxNih0bXApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhyZWcgJiAxNSwgcmVnID4+IDQpOworICAgIH0KKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgaW50IGdlbl9uZW9uX3VuemlwKGludCByZCwgaW50IHJtLCBpbnQgc2l6ZSwgaW50IHEpCit7CisgICAgVENHdiB0bXAsIHRtcDI7CisgICAgaWYgKCFxICYmIHNpemUgPT0gMikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdG1wID0gdGNnX2NvbnN0X2kzMihyZCk7CisgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIocm0pOworICAgIGlmIChxKSB7CisgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXVuemlwOChjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xdW56aXAxNihjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xdW56aXAzMihjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl91bnppcDgoY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX25lb25fdW56aXAxNihjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfQorICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuX25lb25femlwKGludCByZCwgaW50IHJtLCBpbnQgc2l6ZSwgaW50IHEpCit7CisgICAgVENHdiB0bXAsIHRtcDI7CisgICAgaWYgKCFxICYmIHNpemUgPT0gMikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdG1wID0gdGNnX2NvbnN0X2kzMihyZCk7CisgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIocm0pOworICAgIGlmIChxKSB7CisgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXppcDgoY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXppcDE2KGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3F6aXAzMihjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl96aXA4KGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3ppcDE2KGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2VuX25lb25fdHJuX3U4KFRDR3YgdDAsIFRDR3YgdDEpCit7CisgICAgVENHdiByZCwgdG1wOworCisgICAgcmQgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgdGNnX2dlbl9zaGxpX2kzMihyZCwgdDAsIDgpOworICAgIHRjZ19nZW5fYW5kaV9pMzIocmQsIHJkLCAweGZmMDBmZjAwKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdDEsIDB4MDBmZjAwZmYpOworICAgIHRjZ19nZW5fb3JfaTMyKHJkLCByZCwgdG1wKTsKKworICAgIHRjZ19nZW5fc2hyaV9pMzIodDEsIHQxLCA4KTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQxLCB0MSwgMHgwMGZmMDBmZik7CisgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHQwLCAweGZmMDBmZjAwKTsKKyAgICB0Y2dfZ2VuX29yX2kzMih0MSwgdDEsIHRtcCk7CisgICAgdGNnX2dlbl9tb3ZfaTMyKHQwLCByZCk7CisKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHJkKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX25lb25fdHJuX3UxNihUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIFRDR3YgcmQsIHRtcDsKKworICAgIHJkID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgIHRjZ19nZW5fc2hsaV9pMzIocmQsIHQwLCAxNik7CisgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHQxLCAweGZmZmYpOworICAgIHRjZ19nZW5fb3JfaTMyKHJkLCByZCwgdG1wKTsKKyAgICB0Y2dfZ2VuX3NocmlfaTMyKHQxLCB0MSwgMTYpOworICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wLCB0MCwgMHhmZmZmMDAwMCk7CisgICAgdGNnX2dlbl9vcl9pMzIodDEsIHQxLCB0bXApOworICAgIHRjZ19nZW5fbW92X2kzMih0MCwgcmQpOworCisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihyZCk7Cit9CisKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IG5yZWdzOworICAgIGludCBpbnRlcmxlYXZlOworICAgIGludCBzcGFjaW5nOworfSBuZW9uX2xzX2VsZW1lbnRfdHlwZVsxMV0gPSB7CisgICAgezQsIDQsIDF9LAorICAgIHs0LCA0LCAyfSwKKyAgICB7NCwgMSwgMX0sCisgICAgezQsIDIsIDF9LAorICAgIHszLCAzLCAxfSwKKyAgICB7MywgMywgMn0sCisgICAgezMsIDEsIDF9LAorICAgIHsxLCAxLCAxfSwKKyAgICB7MiwgMiwgMX0sCisgICAgezIsIDIsIDJ9LAorICAgIHsyLCAxLCAxfQorfTsKKworLyogVHJhbnNsYXRlIGEgTkVPTiBsb2FkL3N0b3JlIGVsZW1lbnQgaW5zdHJ1Y3Rpb24uICBSZXR1cm4gbm9uemVybyBpZiB0aGUKKyAgIGluc3RydWN0aW9uIGlzIGludmFsaWQuICAqLworc3RhdGljIGludCBkaXNhc19uZW9uX2xzX2luc24oQ1BVQVJNU3RhdGUgKiBlbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbikKK3sKKyAgICBpbnQgcmQsIHJuLCBybTsKKyAgICBpbnQgb3A7CisgICAgaW50IG5yZWdzOworICAgIGludCBpbnRlcmxlYXZlOworICAgIGludCBzcGFjaW5nOworICAgIGludCBzdHJpZGU7CisgICAgaW50IHNpemU7CisgICAgaW50IHJlZzsKKyAgICBpbnQgcGFzczsKKyAgICBpbnQgbG9hZDsKKyAgICBpbnQgc2hpZnQ7CisgICAgVENHdiBhZGRyOworICAgIFRDR3YgdG1wOworICAgIFRDR3YgdG1wMjsKKworICAgIGlmICghcy0+dmZwX2VuYWJsZWQpCisgICAgICByZXR1cm4gMTsKKyAgICBWRlBfRFJFR19EKHJkLCBpbnNuKTsKKyAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICBybSA9IGluc24gJiAweGY7CisgICAgbG9hZCA9IChpbnNuICYgKDEgPDwgMjEpKSAhPSAwOworICAgIGlmICgoaW5zbiAmICgxIDw8IDIzKSkgPT0gMCkgeworICAgICAgICAvKiBMb2FkIHN0b3JlIGFsbCBlbGVtZW50cy4gICovCisgICAgICAgIG9wID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgIHNpemUgPSAoaW5zbiA+PiA2KSAmIDM7CisgICAgICAgIGlmIChvcCA+IDEwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIC8qIENhdGNoIFVOREVGIGNhc2VzIGZvciBiYWQgdmFsdWVzIG9mIGFsaWduIGZpZWxkICovCisgICAgICAgIHN3aXRjaCAob3AgJiAweGMpIHsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgaWYgKCgoaW5zbiA+PiA1KSAmIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBpZiAoKChpbnNuID4+IDQpICYgMykgPT0gMykgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBucmVncyA9IG5lb25fbHNfZWxlbWVudF90eXBlW29wXS5ucmVnczsKKyAgICAgICAgaW50ZXJsZWF2ZSA9IG5lb25fbHNfZWxlbWVudF90eXBlW29wXS5pbnRlcmxlYXZlOworICAgICAgICBzcGFjaW5nID0gbmVvbl9sc19lbGVtZW50X3R5cGVbb3BdLnNwYWNpbmc7CisgICAgICAgIGlmIChzaXplID09IDMgJiYgKGludGVybGVhdmUgfCBzcGFjaW5nKSAhPSAxKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBhZGRyID0gdGNnX2NvbnN0X2kzMihpbnNuKTsKKyAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3ZsZHN0X2FsbChjcHVfZW52LCBhZGRyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgIHN0cmlkZSA9IG5yZWdzICogODsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplID0gKGluc24gPj4gMTApICYgMzsKKyAgICAgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICAgICAgLyogTG9hZCBzaW5nbGUgZWxlbWVudCB0byBhbGwgbGFuZXMuICAqLworICAgICAgICAgICAgaW50IGEgPSAoaW5zbiA+PiA0KSAmIDE7CisgICAgICAgICAgICBpZiAoIWxvYWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSAoaW5zbiA+PiA2KSAmIDM7CisgICAgICAgICAgICBucmVncyA9ICgoaW5zbiA+PiA4KSAmIDMpICsgMTsKKworICAgICAgICAgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICAgICAgICAgIGlmIChucmVncyAhPSA0IHx8IGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRm9yIFZMRDQgc2l6ZT09MyBhID09IDEgbWVhbnMgMzIgYml0cyBhdCAxNiBieXRlIGFsaWdubWVudCAqLworICAgICAgICAgICAgICAgIHNpemUgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5yZWdzID09IDEgJiYgYSA9PSAxICYmIHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5yZWdzID09IDMgJiYgYSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgbG9hZF9yZWdfdmFyKHMsIGFkZHIsIHJuKTsKKyAgICAgICAgICAgIGlmIChucmVncyA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyogVkxEMSB0byBhbGwgbGFuZXM6IGJpdCA1IGluZGljYXRlcyBob3cgbWFueSBEcmVncyB0byB3cml0ZSAqLworICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sb2FkX2FuZF9yZXBsaWNhdGUocywgYWRkciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9pMzIodG1wLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocmQsIDApKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2kzMih0bXAsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChyZCwgMSkpOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9pMzIodG1wLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocmQgKyAxLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfaTMyKHRtcCwgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJkICsgMSwgMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBWTEQyLzMvNCB0byBhbGwgbGFuZXM6IGJpdCA1IGluZGljYXRlcyByZWdpc3RlciBzdHJpZGUgKi8KKyAgICAgICAgICAgICAgICBzdHJpZGUgPSAoaW5zbiAmICgxIDw8IDUpKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIGZvciAocmVnID0gMDsgcmVnIDwgbnJlZ3M7IHJlZysrKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sb2FkX2FuZF9yZXBsaWNhdGUocywgYWRkciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfaTMyKHRtcCwgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJkLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfaTMyKHRtcCwgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJkLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgMSA8PCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgc3RyaWRlID0gKDEgPDwgc2l6ZSkgKiBucmVnczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNpbmdsZSBlbGVtZW50LiAgKi8KKyAgICAgICAgICAgIGludCBpZHggPSAoaW5zbiA+PiA0KSAmIDB4ZjsKKyAgICAgICAgICAgIHBhc3MgPSAoaW5zbiA+PiA3KSAmIDE7CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBzaGlmdCA9ICgoaW5zbiA+PiA1KSAmIDMpICogODsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHNoaWZ0ID0gKChpbnNuID4+IDYpICYgMSkgKiAxNjsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSAoaW5zbiAmICgxIDw8IDUpKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSAoaW5zbiAmICgxIDw8IDYpKSA/IDIgOiAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnJlZ3MgPSAoKGluc24gPj4gOCkgJiAzKSArIDE7CisgICAgICAgICAgICAvKiBDYXRjaCB0aGUgVU5ERUYgY2FzZXMuIFRoaXMgaXMgdW5hdm9pZGFibHkgYSBiaXQgbWVzc3kuICovCisgICAgICAgICAgICBzd2l0Y2ggKG5yZWdzKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKCgoaWR4ICYgKDEgPDwgc2l6ZSkpICE9IDApIHx8CisgICAgICAgICAgICAgICAgICAgIChzaXplID09IDIgJiYgKChpZHggJiAzKSA9PSAxIHx8IChpZHggJiAzKSA9PSAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmICgoaWR4ICYgMSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMiAmJiAoaWR4ICYgMikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaWYgKChzaXplID09IDIpICYmICgoaWR4ICYgMykgPT0gMykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZCArIHN0cmlkZSAqIChucmVncyAtIDEpKSA+IDMxKSB7CisgICAgICAgICAgICAgICAgLyogQXR0ZW1wdHMgdG8gd3JpdGUgb2ZmIHRoZSBlbmQgb2YgdGhlIHJlZ2lzdGVyIGZpbGUKKyAgICAgICAgICAgICAgICAgKiBhcmUgVU5QUkVESUNUQUJMRTsgd2UgY2hvb3NlIHRvIFVOREVGIGJlY2F1c2Ugb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICogdGhlIG5lb25fbG9hZF9yZWcoKSB3b3VsZCB3cml0ZSBvZmYgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgbG9hZF9yZWdfdmFyKHMsIGFkZHIsIHJuKTsKKyAgICAgICAgICAgIGZvciAocmVnID0gMDsgcmVnIDwgbnJlZ3M7IHJlZysrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDh1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDE2dShhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBBdm9pZCBjb21waWxlciB3YXJuaW5ncy4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJkLCBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9iZmkodG1wLCB0bXAyLCB0bXAsIHNoaWZ0LCBzaXplID8gMHhmZmZmIDogMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgcGFzcywgdG1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBTdG9yZSAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJkLCBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0bXAsIHRtcCwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0OCh0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdDE2KHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJkICs9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIDEgPDwgc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgIHN0cmlkZSA9IG5yZWdzICogKDEgPDwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJtICE9IDE1KSB7CisgICAgICAgIFRDR3YgYmFzZTsKKworICAgICAgICBiYXNlID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICBpZiAocm0gPT0gMTMpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYmFzZSwgYmFzZSwgc3RyaWRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRDR3YgaW5kZXg7CisgICAgICAgICAgICBpbmRleCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihiYXNlLCBiYXNlLCBpbmRleCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihpbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCBiYXNlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIEJpdHdpc2Ugc2VsZWN0LiAgZGVzdCA9IGMgPyB0IDogZi4gIENsb2JiZXJzIFQgYW5kIEYuICAqLworc3RhdGljIHZvaWQgZ2VuX25lb25fYnNsKFRDR3YgZGVzdCwgVENHdiB0LCBUQ0d2IGYsIFRDR3YgYykKK3sKKyAgICB0Y2dfZ2VuX2FuZF9pMzIodCwgdCwgYyk7CisgICAgdGNnX2dlbl9hbmRjX2kzMihmLCBmLCBjKTsKKyAgICB0Y2dfZ2VuX29yX2kzMihkZXN0LCB0LCBmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9uZW9uX25hcnJvdyhpbnQgc2l6ZSwgVENHdiBkZXN0LCBUQ0d2X2k2NCBzcmMpCit7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fbmFycm93X3U4KGRlc3QsIHNyYyk7IGJyZWFrOworICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX25hcnJvd191MTYoZGVzdCwgc3JjKTsgYnJlYWs7CisgICAgY2FzZSAyOiB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIoZGVzdCwgc3JjKTsgYnJlYWs7CisgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbmVvbl9uYXJyb3dfc2F0cyhpbnQgc2l6ZSwgVENHdiBkZXN0LCBUQ0d2X2k2NCBzcmMpCit7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fbmFycm93X3NhdF9zOChkZXN0LCBjcHVfZW52LCBzcmMpOyBicmVhazsKKyAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9uYXJyb3dfc2F0X3MxNihkZXN0LCBjcHVfZW52LCBzcmMpOyBicmVhazsKKyAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl9uYXJyb3dfc2F0X3MzMihkZXN0LCBjcHVfZW52LCBzcmMpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9uZW9uX25hcnJvd19zYXR1KGludCBzaXplLCBUQ0d2IGRlc3QsIFRDR3ZfaTY0IHNyYykKK3sKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9uYXJyb3dfc2F0X3U4KGRlc3QsIGNwdV9lbnYsIHNyYyk7IGJyZWFrOworICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX25hcnJvd19zYXRfdTE2KGRlc3QsIGNwdV9lbnYsIHNyYyk7IGJyZWFrOworICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX25hcnJvd19zYXRfdTMyKGRlc3QsIGNwdV9lbnYsIHNyYyk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fdW5hcnJvd19zYXRzKGludCBzaXplLCBUQ0d2IGRlc3QsIFRDR3ZfaTY0IHNyYykKK3sKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl91bmFycm93X3NhdDgoZGVzdCwgY3B1X2Vudiwgc3JjKTsgYnJlYWs7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fdW5hcnJvd19zYXQxNihkZXN0LCBjcHVfZW52LCBzcmMpOyBicmVhazsKKyAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl91bmFycm93X3NhdDMyKGRlc3QsIGNwdV9lbnYsIHNyYyk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fc2hpZnRfbmFycm93KGludCBzaXplLCBUQ0d2IHZhciwgVENHdiBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHEsIGludCB1KQoreworICAgIGlmIChxKSB7CisgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX3JzaGxfdTE2KHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX25lb25fcnNobF91MzIodmFyLCB2YXIsIHNoaWZ0KTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9yc2hsX3MxNih2YXIsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX3JzaGxfczMyKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX3NobF91MTYodmFyLCB2YXIsIHNoaWZ0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl9zaGxfdTMyKHZhciwgdmFyLCBzaGlmdCk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fc2hsX3MxNih2YXIsIHZhciwgc2hpZnQpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX3NobF9zMzIodmFyLCB2YXIsIHNoaWZ0KTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fd2lkZW4oVENHdl9pNjQgZGVzdCwgVENHdiBzcmMsIGludCBzaXplLCBpbnQgdSkKK3sKKyAgICBpZiAodSkgeworICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fd2lkZW5fdTgoZGVzdCwgc3JjKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX3dpZGVuX3UxNihkZXN0LCBzcmMpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiB0Y2dfZ2VuX2V4dHVfaTMyX2k2NChkZXN0LCBzcmMpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl93aWRlbl9zOChkZXN0LCBzcmMpOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fd2lkZW5fczE2KGRlc3QsIHNyYyk7IGJyZWFrOworICAgICAgICBjYXNlIDI6IHRjZ19nZW5fZXh0X2kzMl9pNjQoZGVzdCwgc3JjKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZV9pMzIoc3JjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9uZW9uX2FkZGwoaW50IHNpemUpCit7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fYWRkbF91MTYoQ1BVX1YwMDEpOyBicmVhazsKKyAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9hZGRsX3UzMihDUFVfVjAwMSk7IGJyZWFrOworICAgIGNhc2UgMjogdGNnX2dlbl9hZGRfaTY0KENQVV9WMDAxKTsgYnJlYWs7CisgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbmVvbl9zdWJsKGludCBzaXplKQoreworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX3N1YmxfdTE2KENQVV9WMDAxKTsgYnJlYWs7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fc3VibF91MzIoQ1BVX1YwMDEpOyBicmVhazsKKyAgICBjYXNlIDI6IHRjZ19nZW5fc3ViX2k2NChDUFVfVjAwMSk7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fbmVnbChUQ0d2X2k2NCB2YXIsIGludCBzaXplKQoreworICAgIHN3aXRjaCAoc2l6ZSkgeworICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX25lZ2xfdTE2KHZhciwgdmFyKTsgYnJlYWs7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fbmVnbF91MzIodmFyLCB2YXIpOyBicmVhazsKKyAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl9uZWdsX3U2NCh2YXIsIHZhcik7IGJyZWFrOworICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX25lb25fYWRkbF9zYXR1cmF0ZShUQ0d2X2k2NCBvcDAsIFRDR3ZfaTY0IG9wMSwgaW50IHNpemUpCit7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fYWRkbF9zYXR1cmF0ZV9zMzIob3AwLCBjcHVfZW52LCBvcDAsIG9wMSk7IGJyZWFrOworICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX2FkZGxfc2F0dXJhdGVfczY0KG9wMCwgY3B1X2Vudiwgb3AwLCBvcDEpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9uZW9uX211bGwoVENHdl9pNjQgZGVzdCwgVENHdiBhLCBUQ0d2IGIsIGludCBzaXplLCBpbnQgdSkKK3sKKyAgICBUQ0d2X2k2NCB0bXA7CisKKyAgICBzd2l0Y2ggKChzaXplIDw8IDEpIHwgdSkgeworICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX211bGxfczgoZGVzdCwgYSwgYik7IGJyZWFrOworICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX211bGxfdTgoZGVzdCwgYSwgYik7IGJyZWFrOworICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX211bGxfczE2KGRlc3QsIGEsIGIpOyBicmVhazsKKyAgICBjYXNlIDM6IGdlbl9oZWxwZXJfbmVvbl9tdWxsX3UxNihkZXN0LCBhLCBiKTsgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB0bXAgPSBnZW5fbXVsc19pNjRfaTMyKGEsIGIpOworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQoZGVzdCwgdG1wKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB0bXAgPSBnZW5fbXVsdV9pNjRfaTMyKGEsIGIpOworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQoZGVzdCwgdG1wKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICB9CisKKyAgICAvKiBnZW5faGVscGVyX25lb25fbXVsbF9bc3Vdezh8MTZ9IGRvIG5vdCBmcmVlIHRoZWlyIHBhcmFtZXRlcnMuCisgICAgICAgRG9uJ3QgZm9yZ2V0IHRvIGNsZWFuIHRoZW0gbm93LiAgKi8KKyAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYSk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX25lb25fbmFycm93X29wKGludCBvcCwgaW50IHUsIGludCBzaXplLCBUQ0d2IGRlc3QsIFRDR3ZfaTY0IHNyYykKK3sKKyAgICBpZiAob3ApIHsKKyAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgIGdlbl9uZW9uX3VuYXJyb3dfc2F0cyhzaXplLCBkZXN0LCBzcmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX25lb25fbmFycm93KHNpemUsIGRlc3QsIHNyYyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgZ2VuX25lb25fbmFycm93X3NhdHUoc2l6ZSwgZGVzdCwgc3JjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9uZW9uX25hcnJvd19zYXRzKHNpemUsIGRlc3QsIHNyYyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFN5bWJvbGljIGNvbnN0YW50cyBmb3Igb3AgZmllbGRzIGZvciBOZW9uIDMtcmVnaXN0ZXIgc2FtZS1sZW5ndGguCisgKiBUaGUgdmFsdWVzIGNvcnJlc3BvbmQgdG8gYml0cyBbMTE6OCw0XTsgc2VlIHRoZSBBUk0gQVJNIERESTA0MDZCCisgKiB0YWJsZSBBNy05LgorICovCisjZGVmaW5lIE5FT05fM1JfVkhBREQgMAorI2RlZmluZSBORU9OXzNSX1ZRQUREIDEKKyNkZWZpbmUgTkVPTl8zUl9WUkhBREQgMgorI2RlZmluZSBORU9OXzNSX0xPR0lDIDMgLyogVkFORCxWQklDLFZPUlIsVk1PVixWT1JOLFZFT1IsVkJJRixWQklULFZCU0wgKi8KKyNkZWZpbmUgTkVPTl8zUl9WSFNVQiA0CisjZGVmaW5lIE5FT05fM1JfVlFTVUIgNQorI2RlZmluZSBORU9OXzNSX1ZDR1QgNgorI2RlZmluZSBORU9OXzNSX1ZDR0UgNworI2RlZmluZSBORU9OXzNSX1ZTSEwgOAorI2RlZmluZSBORU9OXzNSX1ZRU0hMIDkKKyNkZWZpbmUgTkVPTl8zUl9WUlNITCAxMAorI2RlZmluZSBORU9OXzNSX1ZRUlNITCAxMQorI2RlZmluZSBORU9OXzNSX1ZNQVggMTIKKyNkZWZpbmUgTkVPTl8zUl9WTUlOIDEzCisjZGVmaW5lIE5FT05fM1JfVkFCRCAxNAorI2RlZmluZSBORU9OXzNSX1ZBQkEgMTUKKyNkZWZpbmUgTkVPTl8zUl9WQUREX1ZTVUIgMTYKKyNkZWZpbmUgTkVPTl8zUl9WVFNUX1ZDRVEgMTcKKyNkZWZpbmUgTkVPTl8zUl9WTUwgMTggLyogVk1MQSwgVk1MQUwsIFZNTFMsIFZNTFNMICovCisjZGVmaW5lIE5FT05fM1JfVk1VTCAxOQorI2RlZmluZSBORU9OXzNSX1ZQTUFYIDIwCisjZGVmaW5lIE5FT05fM1JfVlBNSU4gMjEKKyNkZWZpbmUgTkVPTl8zUl9WUURNVUxIX1ZRUkRNVUxIIDIyCisjZGVmaW5lIE5FT05fM1JfVlBBREQgMjMKKyNkZWZpbmUgTkVPTl8zUl9GTE9BVF9BUklUSCAyNiAvKiBmbG9hdCBWQURELCBWU1VCLCBWUEFERCwgVkFCRCAqLworI2RlZmluZSBORU9OXzNSX0ZMT0FUX01VTFRJUExZIDI3IC8qIGZsb2F0IFZNTEEsIFZNTFMsIFZNVUwgKi8KKyNkZWZpbmUgTkVPTl8zUl9GTE9BVF9DTVAgMjggLyogZmxvYXQgVkNFUSwgVkNHRSwgVkNHVCAqLworI2RlZmluZSBORU9OXzNSX0ZMT0FUX0FDTVAgMjkgLyogZmxvYXQgVkFDR0UsIFZBQ0dULCBWQUNMRSwgVkFDTFQgKi8KKyNkZWZpbmUgTkVPTl8zUl9GTE9BVF9NSU5NQVggMzAgLyogZmxvYXQgVk1JTiwgVk1BWCAqLworI2RlZmluZSBORU9OXzNSX1ZSRUNQU19WUlNRUlRTIDMxIC8qIGZsb2F0IFZSRUNQUywgVlJTUVJUUyAqLworCitzdGF0aWMgY29uc3QgdWludDhfdCBuZW9uXzNyX3NpemVzW10gPSB7CisgICAgW05FT05fM1JfVkhBRERdID0gMHg3LAorICAgIFtORU9OXzNSX1ZRQUREXSA9IDB4ZiwKKyAgICBbTkVPTl8zUl9WUkhBRERdID0gMHg3LAorICAgIFtORU9OXzNSX0xPR0lDXSA9IDB4ZiwgLyogc2l6ZSBmaWVsZCBlbmNvZGVzIG9wIHR5cGUgKi8KKyAgICBbTkVPTl8zUl9WSFNVQl0gPSAweDcsCisgICAgW05FT05fM1JfVlFTVUJdID0gMHhmLAorICAgIFtORU9OXzNSX1ZDR1RdID0gMHg3LAorICAgIFtORU9OXzNSX1ZDR0VdID0gMHg3LAorICAgIFtORU9OXzNSX1ZTSExdID0gMHhmLAorICAgIFtORU9OXzNSX1ZRU0hMXSA9IDB4ZiwKKyAgICBbTkVPTl8zUl9WUlNITF0gPSAweGYsCisgICAgW05FT05fM1JfVlFSU0hMXSA9IDB4ZiwKKyAgICBbTkVPTl8zUl9WTUFYXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WTUlOXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WQUJEXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WQUJBXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WQUREX1ZTVUJdID0gMHhmLAorICAgIFtORU9OXzNSX1ZUU1RfVkNFUV0gPSAweDcsCisgICAgW05FT05fM1JfVk1MXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WTVVMXSA9IDB4NywKKyAgICBbTkVPTl8zUl9WUE1BWF0gPSAweDcsCisgICAgW05FT05fM1JfVlBNSU5dID0gMHg3LAorICAgIFtORU9OXzNSX1ZRRE1VTEhfVlFSRE1VTEhdID0gMHg2LAorICAgIFtORU9OXzNSX1ZQQUREXSA9IDB4NywKKyAgICBbTkVPTl8zUl9GTE9BVF9BUklUSF0gPSAweDUsIC8qIHNpemUgYml0IDEgZW5jb2RlcyBvcCAqLworICAgIFtORU9OXzNSX0ZMT0FUX01VTFRJUExZXSA9IDB4NSwgLyogc2l6ZSBiaXQgMSBlbmNvZGVzIG9wICovCisgICAgW05FT05fM1JfRkxPQVRfQ01QXSA9IDB4NSwgLyogc2l6ZSBiaXQgMSBlbmNvZGVzIG9wICovCisgICAgW05FT05fM1JfRkxPQVRfQUNNUF0gPSAweDUsIC8qIHNpemUgYml0IDEgZW5jb2RlcyBvcCAqLworICAgIFtORU9OXzNSX0ZMT0FUX01JTk1BWF0gPSAweDUsIC8qIHNpemUgYml0IDEgZW5jb2RlcyBvcCAqLworICAgIFtORU9OXzNSX1ZSRUNQU19WUlNRUlRTXSA9IDB4NSwgLyogc2l6ZSBiaXQgMSBlbmNvZGVzIG9wICovCit9OworCisvKiBTeW1ib2xpYyBjb25zdGFudHMgZm9yIG9wIGZpZWxkcyBmb3IgTmVvbiAyLXJlZ2lzdGVyIG1pc2NlbGxhbmVvdXMuCisgKiBUaGUgdmFsdWVzIGNvcnJlc3BvbmQgdG8gYml0cyBbMTc6MTYsMTA6N107IHNlZSB0aGUgQVJNIEFSTSBEREkwNDA2QgorICogdGFibGUgQTctMTMuCisgKi8KKyNkZWZpbmUgTkVPTl8yUk1fVlJFVjY0IDAKKyNkZWZpbmUgTkVPTl8yUk1fVlJFVjMyIDEKKyNkZWZpbmUgTkVPTl8yUk1fVlJFVjE2IDIKKyNkZWZpbmUgTkVPTl8yUk1fVlBBRERMIDQKKyNkZWZpbmUgTkVPTl8yUk1fVlBBRERMX1UgNQorI2RlZmluZSBORU9OXzJSTV9WQ0xTIDgKKyNkZWZpbmUgTkVPTl8yUk1fVkNMWiA5CisjZGVmaW5lIE5FT05fMlJNX1ZDTlQgMTAKKyNkZWZpbmUgTkVPTl8yUk1fVk1WTiAxMQorI2RlZmluZSBORU9OXzJSTV9WUEFEQUwgMTIKKyNkZWZpbmUgTkVPTl8yUk1fVlBBREFMX1UgMTMKKyNkZWZpbmUgTkVPTl8yUk1fVlFBQlMgMTQKKyNkZWZpbmUgTkVPTl8yUk1fVlFORUcgMTUKKyNkZWZpbmUgTkVPTl8yUk1fVkNHVDAgMTYKKyNkZWZpbmUgTkVPTl8yUk1fVkNHRTAgMTcKKyNkZWZpbmUgTkVPTl8yUk1fVkNFUTAgMTgKKyNkZWZpbmUgTkVPTl8yUk1fVkNMRTAgMTkKKyNkZWZpbmUgTkVPTl8yUk1fVkNMVDAgMjAKKyNkZWZpbmUgTkVPTl8yUk1fVkFCUyAyMgorI2RlZmluZSBORU9OXzJSTV9WTkVHIDIzCisjZGVmaW5lIE5FT05fMlJNX1ZDR1QwX0YgMjQKKyNkZWZpbmUgTkVPTl8yUk1fVkNHRTBfRiAyNQorI2RlZmluZSBORU9OXzJSTV9WQ0VRMF9GIDI2CisjZGVmaW5lIE5FT05fMlJNX1ZDTEUwX0YgMjcKKyNkZWZpbmUgTkVPTl8yUk1fVkNMVDBfRiAyOAorI2RlZmluZSBORU9OXzJSTV9WQUJTX0YgMzAKKyNkZWZpbmUgTkVPTl8yUk1fVk5FR19GIDMxCisjZGVmaW5lIE5FT05fMlJNX1ZTV1AgMzIKKyNkZWZpbmUgTkVPTl8yUk1fVlRSTiAzMworI2RlZmluZSBORU9OXzJSTV9WVVpQIDM0CisjZGVmaW5lIE5FT05fMlJNX1ZaSVAgMzUKKyNkZWZpbmUgTkVPTl8yUk1fVk1PVk4gMzYgLyogSW5jbHVkZXMgVlFNT1ZOLCBWUU1PVlVOICovCisjZGVmaW5lIE5FT05fMlJNX1ZRTU9WTiAzNyAvKiBJbmNsdWRlcyBWUU1PVlVOICovCisjZGVmaW5lIE5FT05fMlJNX1ZTSExMIDM4CisjZGVmaW5lIE5FT05fMlJNX1ZDVlRfRjE2X0YzMiA0NAorI2RlZmluZSBORU9OXzJSTV9WQ1ZUX0YzMl9GMTYgNDYKKyNkZWZpbmUgTkVPTl8yUk1fVlJFQ1BFIDU2CisjZGVmaW5lIE5FT05fMlJNX1ZSU1FSVEUgNTcKKyNkZWZpbmUgTkVPTl8yUk1fVlJFQ1BFX0YgNTgKKyNkZWZpbmUgTkVPTl8yUk1fVlJTUVJURV9GIDU5CisjZGVmaW5lIE5FT05fMlJNX1ZDVlRfRlMgNjAKKyNkZWZpbmUgTkVPTl8yUk1fVkNWVF9GVSA2MQorI2RlZmluZSBORU9OXzJSTV9WQ1ZUX1NGIDYyCisjZGVmaW5lIE5FT05fMlJNX1ZDVlRfVUYgNjMKKworc3RhdGljIGludCBuZW9uXzJybV9pc19mbG9hdF9vcChpbnQgb3ApCit7CisgICAgLyogUmV0dXJuIHRydWUgaWYgdGhpcyBuZW9uIDJyZWctbWlzYyBvcCBpcyBmbG9hdC10by1mbG9hdCAqLworICAgIHJldHVybiAob3AgPT0gTkVPTl8yUk1fVkFCU19GIHx8IG9wID09IE5FT05fMlJNX1ZORUdfRiB8fAorICAgICAgICAgICAgb3AgPj0gTkVPTl8yUk1fVlJFQ1BFX0YpOworfQorCisvKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaGFzIGJpdCBuIHNldCBpZiB0aGUgaW5zbiBhbGxvd3MKKyAqIHNpemUgdmFsdWUgbiAob3RoZXJ3aXNlIGl0IHdpbGwgVU5ERUYpLiBTaW5jZSB1bmFsbG9jYXRlZAorICogb3AgdmFsdWVzIHdpbGwgaGF2ZSBubyBiaXRzIHNldCB0aGV5IGFsd2F5cyBVTkRFRi4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbmVvbl8ycm1fc2l6ZXNbXSA9IHsKKyAgICBbTkVPTl8yUk1fVlJFVjY0XSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVlJFVjMyXSA9IDB4MywKKyAgICBbTkVPTl8yUk1fVlJFVjE2XSA9IDB4MSwKKyAgICBbTkVPTl8yUk1fVlBBRERMXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVlBBRERMX1VdID0gMHg3LAorICAgIFtORU9OXzJSTV9WQ0xTXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVkNMWl0gPSAweDcsCisgICAgW05FT05fMlJNX1ZDTlRdID0gMHgxLAorICAgIFtORU9OXzJSTV9WTVZOXSA9IDB4MSwKKyAgICBbTkVPTl8yUk1fVlBBREFMXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVlBBREFMX1VdID0gMHg3LAorICAgIFtORU9OXzJSTV9WUUFCU10gPSAweDcsCisgICAgW05FT05fMlJNX1ZRTkVHXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVkNHVDBdID0gMHg3LAorICAgIFtORU9OXzJSTV9WQ0dFMF0gPSAweDcsCisgICAgW05FT05fMlJNX1ZDRVEwXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVkNMRTBdID0gMHg3LAorICAgIFtORU9OXzJSTV9WQ0xUMF0gPSAweDcsCisgICAgW05FT05fMlJNX1ZBQlNdID0gMHg3LAorICAgIFtORU9OXzJSTV9WTkVHXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVkNHVDBfRl0gPSAweDQsCisgICAgW05FT05fMlJNX1ZDR0UwX0ZdID0gMHg0LAorICAgIFtORU9OXzJSTV9WQ0VRMF9GXSA9IDB4NCwKKyAgICBbTkVPTl8yUk1fVkNMRTBfRl0gPSAweDQsCisgICAgW05FT05fMlJNX1ZDTFQwX0ZdID0gMHg0LAorICAgIFtORU9OXzJSTV9WQUJTX0ZdID0gMHg0LAorICAgIFtORU9OXzJSTV9WTkVHX0ZdID0gMHg0LAorICAgIFtORU9OXzJSTV9WU1dQXSA9IDB4MSwKKyAgICBbTkVPTl8yUk1fVlRSTl0gPSAweDcsCisgICAgW05FT05fMlJNX1ZVWlBdID0gMHg3LAorICAgIFtORU9OXzJSTV9WWklQXSA9IDB4NywKKyAgICBbTkVPTl8yUk1fVk1PVk5dID0gMHg3LAorICAgIFtORU9OXzJSTV9WUU1PVk5dID0gMHg3LAorICAgIFtORU9OXzJSTV9WU0hMTF0gPSAweDcsCisgICAgW05FT05fMlJNX1ZDVlRfRjE2X0YzMl0gPSAweDIsCisgICAgW05FT05fMlJNX1ZDVlRfRjMyX0YxNl0gPSAweDIsCisgICAgW05FT05fMlJNX1ZSRUNQRV0gPSAweDQsCisgICAgW05FT05fMlJNX1ZSU1FSVEVdID0gMHg0LAorICAgIFtORU9OXzJSTV9WUkVDUEVfRl0gPSAweDQsCisgICAgW05FT05fMlJNX1ZSU1FSVEVfRl0gPSAweDQsCisgICAgW05FT05fMlJNX1ZDVlRfRlNdID0gMHg0LAorICAgIFtORU9OXzJSTV9WQ1ZUX0ZVXSA9IDB4NCwKKyAgICBbTkVPTl8yUk1fVkNWVF9TRl0gPSAweDQsCisgICAgW05FT05fMlJNX1ZDVlRfVUZdID0gMHg0LAorfTsKKworLyogVHJhbnNsYXRlIGEgTkVPTiBkYXRhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uICBSZXR1cm4gbm9uemVybyBpZiB0aGUKKyAgIGluc3RydWN0aW9uIGlzIGludmFsaWQuCisgICBXZSBwcm9jZXNzIGRhdGEgaW4gYSBtaXh0dXJlIG9mIDMyLWJpdCBhbmQgNjQtYml0IGNodW5rcy4KKyAgIE1vc3RseSB3ZSB1c2UgMzItYml0IGNodW5rcyBzbyB3ZSBjYW4gdXNlIG5vcm1hbCBzY2FsYXIgaW5zdHJ1Y3Rpb25zLiAgKi8KKworc3RhdGljIGludCBkaXNhc19uZW9uX2RhdGFfaW5zbihDUFVBUk1TdGF0ZSAqIGVudiwgRGlzYXNDb250ZXh0ICpzLCB1aW50MzJfdCBpbnNuKQoreworICAgIGludCBvcDsKKyAgICBpbnQgcTsKKyAgICBpbnQgcmQsIHJuLCBybTsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgc2hpZnQ7CisgICAgaW50IHBhc3M7CisgICAgaW50IGNvdW50OworICAgIGludCBwYWlyd2lzZTsKKyAgICBpbnQgdTsKKyAgICB1aW50MzJfdCBpbW0sIG1hc2s7CisgICAgVENHdiB0bXAsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgICAgVENHdl9pNjQgdG1wNjQ7CisKKyAgICBpZiAoIXMtPnZmcF9lbmFibGVkKQorICAgICAgcmV0dXJuIDE7CisgICAgcSA9IChpbnNuICYgKDEgPDwgNikpICE9IDA7CisgICAgdSA9IChpbnNuID4+IDI0KSAmIDE7CisgICAgVkZQX0RSRUdfRChyZCwgaW5zbik7CisgICAgVkZQX0RSRUdfTihybiwgaW5zbik7CisgICAgVkZQX0RSRUdfTShybSwgaW5zbik7CisgICAgc2l6ZSA9IChpbnNuID4+IDIwKSAmIDM7CisgICAgaWYgKChpbnNuICYgKDEgPDwgMjMpKSA9PSAwKSB7CisgICAgICAgIC8qIFRocmVlIHJlZ2lzdGVyIHNhbWUgbGVuZ3RoLiAgKi8KKyAgICAgICAgb3AgPSAoKGluc24gPj4gNykgJiAweDFlKSB8ICgoaW5zbiA+PiA0KSAmIDEpOworICAgICAgICAvKiBDYXRjaCBpbnZhbGlkIG9wIGFuZCBiYWQgc2l6ZSBjb21iaW5hdGlvbnM6IFVOREVGICovCisgICAgICAgIGlmICgobmVvbl8zcl9zaXplc1tvcF0gJiAoMSA8PCBzaXplKSkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogQWxsIGluc25zIG9mIHRoaXMgZm9ybSBVTkRFRiBmb3IgZWl0aGVyIHRoaXMgY29uZGl0aW9uIG9yIHRoZQorICAgICAgICAgKiBzdXBlcnNldCBvZiBjYXNlcyAiUT09MSI7IHdlIGNhdGNoIHRoZSBsYXR0ZXIgbGF0ZXIuCisgICAgICAgICAqLworICAgICAgICBpZiAocSAmJiAoKHJkIHwgcm4gfCBybSkgJiAxKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMyAmJiBvcCAhPSBORU9OXzNSX0xPR0lDKSB7CisgICAgICAgICAgICAvKiA2NC1iaXQgZWxlbWVudCBpbnN0cnVjdGlvbnMuICovCisgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgKHEgPyAyIDogMSk7IHBhc3MrKykgeworICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjAsIHJuICsgcGFzcyk7CisgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMSwgcm0gKyBwYXNzKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICAgICAgY2FzZSBORU9OXzNSX1ZRQUREOgorICAgICAgICAgICAgICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FhZGRfdTY0KGNwdV9WMCwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfVjAsIGNwdV9WMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcWFkZF9zNjQoY3B1X1YwLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9WMCwgY3B1X1YxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fM1JfVlFTVUI6CisgICAgICAgICAgICAgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXN1Yl91NjQoY3B1X1YwLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9WMCwgY3B1X1YxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xc3ViX3M2NChjcHVfVjAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8zUl9WU0hMOgorICAgICAgICAgICAgICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3NobF91NjQoY3B1X1YwLCBjcHVfVjEsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fc2hsX3M2NChjcHVfVjAsIGNwdV9WMSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fM1JfVlFTSEw6CisgICAgICAgICAgICAgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXNobF91NjQoY3B1X1YwLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9WMSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xc2hsX3M2NChjcHVfVjAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X1YxLCBjcHVfVjApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8zUl9WUlNITDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9yc2hsX3U2NChjcHVfVjAsIGNwdV9WMSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9yc2hsX3M2NChjcHVfVjAsIGNwdV9WMSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fM1JfVlFSU0hMOgorICAgICAgICAgICAgICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3Fyc2hsX3U2NChjcHVfVjAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9WMSwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xcnNobF9zNjQoY3B1X1YwLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfVjEsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORU9OXzNSX1ZBRERfVlNVQjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3ViX2k2NChDUFVfVjAwMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pNjQoQ1BVX1YwMDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnNjQoY3B1X1YwLCByZCArIHBhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcGFpcndpc2UgPSAwOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WU0hMOgorICAgICAgICBjYXNlIE5FT05fM1JfVlFTSEw6CisgICAgICAgIGNhc2UgTkVPTl8zUl9WUlNITDoKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZRUlNITDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcnRtcDsKKyAgICAgICAgICAgICAgICAvKiBTaGlmdCBpbnN0cnVjdGlvbiBvcGVyYW5kcyBhcmUgcmV2ZXJzZWQuICAqLworICAgICAgICAgICAgICAgIHJ0bXAgPSBybjsKKyAgICAgICAgICAgICAgICBybiA9IHJtOworICAgICAgICAgICAgICAgIHJtID0gcnRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVlBBREQ6CisgICAgICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgTkVPTl8zUl9WUE1BWDoKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZQTUlOOgorICAgICAgICAgICAgcGFpcndpc2UgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9GTE9BVF9BUklUSDoKKyAgICAgICAgICAgIHBhaXJ3aXNlID0gKHUgJiYgc2l6ZSA8IDIpOyAvKiBpZiBWUEFERCAoZmxvYXQpICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX0ZMT0FUX01JTk1BWDoKKyAgICAgICAgICAgIHBhaXJ3aXNlID0gdTsgLyogaWYgVlBNSU4vVlBNQVggKGZsb2F0KSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9GTE9BVF9DTVA6CisgICAgICAgICAgICBpZiAoIXUgJiYgc2l6ZSkgeworICAgICAgICAgICAgICAgIC8qIG5vIGVuY29kaW5nIGZvciBVPTAgQz0xeCAqLworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9GTE9BVF9BQ01QOgorICAgICAgICAgICAgaWYgKCF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZSRUNQU19WUlNRUlRTOgorICAgICAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVk1VTDoKKyAgICAgICAgICAgIGlmICh1ICYmIChzaXplICE9IDApKSB7CisgICAgICAgICAgICAgICAgLyogVU5ERUYgb24gaW52YWxpZCBzaXplIGZvciBwb2x5bm9taWFsIHN1YmNhc2UgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFpcndpc2UgJiYgcSkgeworICAgICAgICAgICAgLyogQWxsIHRoZSBwYWlyd2lzZSBpbnNucyBVTkRFRiBpZiBRIGlzIHNldCAqLworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgKHEgPyA0IDogMik7IHBhc3MrKykgeworCisgICAgICAgIGlmIChwYWlyd2lzZSkgeworICAgICAgICAgICAgLyogUGFpcndpc2UuICAqLworICAgICAgICAgICAgaWYgKHBhc3MgPCAxKSB7CisgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybiwgMCk7CisgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm4sIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJtLCAwKTsKKyAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhybSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBFbGVtZW50d2lzZS4gICovCisgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJuLCBwYXNzKTsKKyAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJtLCBwYXNzKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WSEFERDoKKyAgICAgICAgICAgIEdFTl9ORU9OX0lOVEVHRVJfT1AoaGFkZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZRQUREOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUF9FTlYocWFkZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZSSEFERDoKKyAgICAgICAgICAgIEdFTl9ORU9OX0lOVEVHRVJfT1AocmhhZGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9MT0dJQzogLyogTG9naWMgb3BzLiAgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoKHUgPDwgMikgfCBzaXplKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIFZBTkQgKi8KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZF9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBCSUMgKi8KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGNfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLyogVk9SUiAqLworICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogVk9STiAqLworICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JjX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IC8qIFZFT1IgKi8KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3hvcl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiAvKiBWQlNMICovCisgICAgICAgICAgICAgICAgdG1wMyA9IG5lb25fbG9hZF9yZWcocmQsIHBhc3MpOworICAgICAgICAgICAgICAgIGdlbl9uZW9uX2JzbCh0bXAsIHRtcCwgdG1wMiwgdG1wMyk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIFZCSVQgKi8KKyAgICAgICAgICAgICAgICB0bXAzID0gbmVvbl9sb2FkX3JlZyhyZCwgcGFzcyk7CisgICAgICAgICAgICAgICAgZ2VuX25lb25fYnNsKHRtcCwgdG1wLCB0bXAzLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzogLyogVkJJRiAqLworICAgICAgICAgICAgICAgIHRtcDMgPSBuZW9uX2xvYWRfcmVnKHJkLCBwYXNzKTsKKyAgICAgICAgICAgICAgICBnZW5fbmVvbl9ic2wodG1wLCB0bXAzLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WSFNVQjoKKyAgICAgICAgICAgIEdFTl9ORU9OX0lOVEVHRVJfT1AoaHN1Yik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZRU1VCOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUF9FTlYocXN1Yik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZDR1Q6CisgICAgICAgICAgICBHRU5fTkVPTl9JTlRFR0VSX09QKGNndCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZDR0U6CisgICAgICAgICAgICBHRU5fTkVPTl9JTlRFR0VSX09QKGNnZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZTSEw6CisgICAgICAgICAgICBHRU5fTkVPTl9JTlRFR0VSX09QKHNobCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZRU0hMOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUF9FTlYocXNobCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZSU0hMOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChyc2hsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVlFSU0hMOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUF9FTlYocXJzaGwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WTUFYOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChtYXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WTUlOOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChtaW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WQUJEOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChhYmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WQUJBOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChhYmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhyZCwgcGFzcyk7CisgICAgICAgICAgICBnZW5fbmVvbl9hZGQoc2l6ZSwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVkFERF9WU1VCOgorICAgICAgICAgICAgaWYgKCF1KSB7IC8qIFZBREQgKi8KKyAgICAgICAgICAgICAgICBnZW5fbmVvbl9hZGQoc2l6ZSwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8qIFZTVUIgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9zdWJfdTgodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9zdWJfdTE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiB0Y2dfZ2VuX3N1Yl9pMzIodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVlRTVF9WQ0VROgorICAgICAgICAgICAgaWYgKCF1KSB7IC8qIFZUU1QgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl90c3RfdTgodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl90c3RfdTE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX25lb25fdHN0X3UzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLyogVkNFUSAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX2NlcV91OCh0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX2NlcV91MTYodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl9jZXFfdTMyKHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZNTDogLyogVk1MQSwgVk1MQUwsIFZNTFMsVk1MU0wgKi8KKyAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fbXVsX3U4KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9tdWxfdTE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IHRjZ19nZW5fbXVsX2kzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocmQsIHBhc3MpOworICAgICAgICAgICAgaWYgKHUpIHsgLyogVk1MUyAqLworICAgICAgICAgICAgICAgIGdlbl9uZW9uX3JzYihzaXplLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsgLyogVk1MQSAqLworICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZChzaXplLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WTVVMOgorICAgICAgICAgICAgaWYgKHUpIHsgLyogcG9seW5vbWlhbCAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9tdWxfcDgodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsgLyogSW50ZWdlciAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX211bF91OCh0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX211bF91MTYodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHRjZ19nZW5fbXVsX2kzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVPTl8zUl9WUE1BWDoKKyAgICAgICAgICAgIEdFTl9ORU9OX0lOVEVHRVJfT1AocG1heCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORU9OXzNSX1ZQTUlOOgorICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUChwbWluKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVlFETVVMSF9WUVJETVVMSDogLyogTXVsdGlwbHkgaGlnaC4gICovCisgICAgICAgICAgICBpZiAoIXUpIHsgLyogVlFETVVMSCAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FkbXVsaF9zMTYodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xZG11bGhfczMyKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBWUVJETVVMSCAqLworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FyZG11bGhfczE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXJkbXVsaF9zMzIodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfVlBBREQ6CisgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX3BhZGRfdTgodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX3BhZGRfdTE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IHRjZ19nZW5fYWRkX2kzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FT05fM1JfRkxPQVRfQVJJVEg6IC8qIEZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfcHRyIGZwc3RhdHVzID0gZ2V0X2Zwc3RhdHVzX3B0cigxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoKHUgPDwgMikgfCBzaXplKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIFZBREQgKi8KKyAgICAgICAgICAgIGNhc2UgNDogLyogVlBBREQgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9hZGRzKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIFZTVUIgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9zdWJzKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IC8qIFZBQkQgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fYWJkX2YzMih0bXAsIHRtcCwgdG1wMiwgZnBzdGF0dXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIoZnBzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBORU9OXzNSX0ZMT0FUX01VTFRJUExZOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9tdWxzKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIXUpIHsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhyZCwgcGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9hZGRzKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl92ZnBfc3Vicyh0bXAsIHRtcDIsIHRtcCwgZnBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTkVPTl8zUl9GTE9BVF9DTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfcHRyIGZwc3RhdHVzID0gZ2V0X2Zwc3RhdHVzX3B0cigxKTsKKyAgICAgICAgICAgIGlmICghdSkgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9jZXFfZjMyKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2NnZV9mMzIodG1wLCB0bXAsIHRtcDIsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fY2d0X2YzMih0bXAsIHRtcCwgdG1wMiwgZnBzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTkVPTl8zUl9GTE9BVF9BQ01QOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2FjZ2VfZjMyKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9hY2d0X2YzMih0bXAsIHRtcCwgdG1wMiwgZnBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIoZnBzdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBORU9OXzNSX0ZMT0FUX01JTk1BWDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9wdHIgZnBzdGF0dXMgPSBnZXRfZnBzdGF0dXNfcHRyKDEpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9tYXhfZjMyKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9taW5fZjMyKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX3B0cihmcHN0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE5FT05fM1JfVlJFQ1BTX1ZSU1FSVFM6CisgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcmVjcHNfZjMyKHRtcCwgdG1wLCB0bXAyLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3JzcXJ0c19mMzIodG1wLCB0bXAsIHRtcDIsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworCisgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdC4gIEZvciBlbGVtZW50d2lzZSBvcGVyYXRpb25zIHdlIGNhbiBwdXQgaXQKKyAgICAgICAgICAgc3RyYWlnaHQgaW50byB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuICBGb3IgcGFpcndpc2Ugb3BlcmF0aW9ucworICAgICAgICAgICB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gYXZvaWQgY2xvYmJlcmluZyB0aGUgc291cmNlIG9wZXJhbmRzLiAgKi8KKyAgICAgICAgaWYgKHBhaXJ3aXNlICYmIHJkID09IHJtKSB7CisgICAgICAgICAgICBuZW9uX3N0b3JlX3NjcmF0Y2gocGFzcywgdG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJkLCBwYXNzLCB0bXApOworICAgICAgICB9CisKKyAgICAgICAgfSAvKiBmb3IgcGFzcyAqLworICAgICAgICBpZiAocGFpcndpc2UgJiYgcmQgPT0gcm0pIHsKKyAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAocSA/IDQgOiAyKTsgcGFzcysrKSB7CisgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3NjcmF0Y2gocGFzcyk7CisgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIHBhc3MsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogRW5kIG9mIDMgcmVnaXN0ZXIgc2FtZSBzaXplIG9wZXJhdGlvbnMuICAqLworICAgIH0gZWxzZSBpZiAoaW5zbiAmICgxIDw8IDQpKSB7CisgICAgICAgIGlmICgoaW5zbiAmIDB4MDAzODAwODApICE9IDApIHsKKyAgICAgICAgICAgIC8qIFR3byByZWdpc3RlcnMgYW5kIHNoaWZ0LiAgKi8KKyAgICAgICAgICAgIG9wID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDcpKSB7CisgICAgICAgICAgICAgICAgLyogNjQtYml0IHNoaWZ0LiAqLworICAgICAgICAgICAgICAgIGlmIChvcCA+IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemUgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID0gMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGluc24gJiAoMSA8PCAoc2l6ZSArIDE5KSkpID09IDApCisgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaWZ0ID0gKGluc24gPj4gMTYpICYgKCgxIDw8ICgzICsgc2l6ZSkpIC0gMSk7CisgICAgICAgICAgICAvKiBUbyBhdm9pZCBleGNlc3NpdmUgZHVtcGxpY2F0aW9uIG9mIG9wcyB3ZSBpbXBsZW1lbnQgc2hpZnQKKyAgICAgICAgICAgICAgIGJ5IGltbWVkaWF0ZSB1c2luZyB0aGUgdmFyaWFibGUgc2hpZnQgb3BlcmF0aW9ucy4gICovCisgICAgICAgICAgICBpZiAob3AgPCA4KSB7CisgICAgICAgICAgICAgICAgLyogU2hpZnQgYnkgaW1tZWRpYXRlOgorICAgICAgICAgICAgICAgICAgIFZTSFIsIFZTUkEsIFZSU0hSLCBWUlNSQSwgVlNSSSwgVlNITCwgVlFTSEwsIFZRU0hMVS4gICovCisgICAgICAgICAgICAgICAgaWYgKHEgJiYgKChyZCB8IHJtKSAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXUgJiYgKG9wID09IDQgfHwgb3AgPT0gNikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNoaWZ0cyBhcmUgZW5jb2RlZCBhcyBOIC0gc2hpZnQsIHdoZXJlIE4gaXMgdGhlCisgICAgICAgICAgICAgICAgICAgZWxlbWVudCBzaXplIGluIGJpdHMuICAqLworICAgICAgICAgICAgICAgIGlmIChvcCA8PSA0KQorICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IHNoaWZ0IC0gKDEgPDwgKHNpemUgKyAzKSk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHEgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gcSA/IDQ6IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgaW1tID0gKHVpbnQ4X3QpIHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpbW0gfD0gaW1tIDw8IDg7CisgICAgICAgICAgICAgICAgICAgIGltbSB8PSBpbW0gPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgaW1tID0gKHVpbnQxNl90KSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgaW1tIHw9IGltbSA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgaW1tID0gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IGNvdW50OyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMCwgcm0gKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pNjQoY3B1X1YxLCBpbW0pOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAgLyogVlNIUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgLyogVlNSQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fc2hsX3U2NChjcHVfVjAsIGNwdV9WMCwgY3B1X1YxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9zaGxfczY0KGNwdV9WMCwgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBWUlNIUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBWUlNSQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcnNobF91NjQoY3B1X1YwLCBjcHVfVjAsIGNwdV9WMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcnNobF9zNjQoY3B1X1YwLCBjcHVfVjAsIGNwdV9WMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIFZTUkkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTogLyogVlNITCwgVlNMSSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9zaGxfdTY0KGNwdV9WMCwgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBWUVNITFUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXNobHVfczY0KGNwdV9WMCwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9WMCwgY3B1X1YxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogLyogVlFTSEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXNobF91NjQoY3B1X1YwLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xc2hsX3M2NChjcHVfVjAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfVjAsIGNwdV9WMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDEgfHwgb3AgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtdWxhdGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJkICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTY0KGNwdV9WMCwgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSA0IHx8IChvcCA9PSA1ICYmIHUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zZXJ0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMSwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA8IC02MyB8fCBzaGlmdCA+IDYzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmdWxsID4+IC1zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZ1bGwgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2k2NChjcHVfVjEsIGNwdV9WMSwgfm1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfaTY0KGNwdV9WMCwgY3B1X1YwLCBjcHVfVjEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWc2NChjcHVfVjAsIHJkICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIHNpemUgPCAzICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVyYW5kcyBpbiBUMCBhbmQgVDEuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMihpbW0pOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAgLyogVlNIUiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAgLyogVlNSQSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTl9ORU9OX0lOVEVHRVJfT1Aoc2hsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLyogVlJTSFIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogLyogVlJTUkEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5fTkVPTl9JTlRFR0VSX09QKHJzaGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAvKiBWU1JJICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIFZTSEwsIFZTTEkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9zaGxfdTgodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9zaGxfdTE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX25lb25fc2hsX3UzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBWUVNITFUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xc2hsdV9zOCh0bXAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xc2hsdV9zMTYodG1wLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FzaGx1X3MzMih0bXAsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IC8qIFZRU0hMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VOX05FT05fSU5URUdFUl9PUF9FTlYocXNobCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDEgfHwgb3AgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY3VtdWxhdGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJkLCBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9hZGQoc2l6ZSwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gNCB8fCAob3AgPT0gNSAmJiB1KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc2VydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gMHhmZiA+PiAtc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAodWludDhfdCkoMHhmZiA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgfD0gbWFzayA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IG1hc2sgPDwgMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gMHhmZmZmID4+IC1zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9ICh1aW50MTZfdCkoMHhmZmZmIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSBtYXNrIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCA8IC0zMSB8fCBzaGlmdCA+IDMxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAweGZmZmZmZmZmdSA+PiAtc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmZ1IDw8IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJkLCBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdG1wLCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcDIsIHRtcDIsIH5tYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgcGFzcywgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogZm9yIHBhc3MgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPCAxMCkgeworICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGJ5IGltbWVkaWF0ZSBhbmQgbmFycm93OgorICAgICAgICAgICAgICAgICAgIFZTSFJOLCBWUlNIUk4sIFZRU0hSTiwgVlFSU0hSTi4gICovCisgICAgICAgICAgICAgICAgaW50IGlucHV0X3Vuc2lnbmVkID0gKG9wID09IDgpID8gIXUgOiB1OworICAgICAgICAgICAgICAgIGlmIChybSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNoaWZ0ID0gc2hpZnQgLSAoMSA8PCAoc2l6ZSArIDMpKTsKKyAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICB0bXA2NCA9IHRjZ19jb25zdF9pNjQoc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YwLCBybSk7CisgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJtICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGluOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluID0gY3B1X1YwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiA9IGNwdV9WMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0X3Vuc2lnbmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9yc2hsX3U2NChjcHVfVjAsIGluLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3JzaGxfczY0KGNwdV9WMCwgaW4sIHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dF91bnNpZ25lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fc2hsX3U2NChjcHVfVjAsIGluLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3NobF9zNjQoY3B1X1YwLCBpbiwgdG1wNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX25hcnJvd19vcChvcCA9PSA4LCB1LCBzaXplIC0gMSwgdG1wLCBjcHVfVjApOworICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIHBhc3MsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gLyogZm9yIHBhc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wNjQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSA9ICh1aW50MTZfdClzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSB8PSBpbW0gPDwgMTY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplID09IDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSA9ICh1aW50MzJfdClzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMihpbW0pOworICAgICAgICAgICAgICAgICAgICB0bXA0ID0gbmVvbl9sb2FkX3JlZyhybSArIDEsIDApOworICAgICAgICAgICAgICAgICAgICB0bXA1ID0gbmVvbl9sb2FkX3JlZyhybSArIDEsIDEpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9zaGlmdF9uYXJyb3coc2l6ZSwgdG1wLCB0bXAyLCBxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Vuc2lnbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAzID0gbmVvbl9sb2FkX3JlZyhybSwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB0bXA1OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fc2hpZnRfbmFycm93KHNpemUsIHRtcDMsIHRtcDIsIHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdW5zaWduZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NChjcHVfVjAsIHRtcCwgdG1wMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9uYXJyb3dfb3Aob3AgPT0gOCwgdSwgc2l6ZSAtIDEsIHRtcCwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJkLCBwYXNzLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IC8qIGZvciBwYXNzICovCisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gMTApIHsKKyAgICAgICAgICAgICAgICAvKiBWU0hMTCwgVk1PVkwgKi8KKyAgICAgICAgICAgICAgICBpZiAocSB8fCAocmQgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgMCk7CisgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm0sIDEpOworICAgICAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRtcDI7CisKKyAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fd2lkZW4oY3B1X1YwLCB0bXAsIHNpemUsIHUpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2hpZnQgaXMgbGVzcyB0aGFuIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbyB3ZSBjYW4ganVzdCBzaGlmdCB0aGUgd2hvbGUgcmVnaXN0ZXIuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2k2NChjcHVfVjAsIGNwdV9WMCwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogV2lkZW4gdGhlIHJlc3VsdCBvZiBzaGlmdDogd2UgbmVlZCB0byBjbGVhcgorICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHBvdGVudGlhbCBvdmVyZmxvdyBiaXRzIHJlc3VsdGluZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBsZWZ0IGJpdHMgb2YgdGhlIG5hcnJvdyBpbnB1dCBhcHBlYXJpbmcgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHJpZ2h0IGJpdHMgb2YgbGVmdCB0aGUgbmVpZ2hib3VyIG5hcnJvdworICAgICAgICAgICAgICAgICAgICAgICAgICogaW5wdXQuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAyIHx8ICF1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgaW1tNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0gPSAoMHhmZnUgPj4gKDggLSBzaGlmdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW0gfD0gaW1tIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSA9IDB4ZmZmZiA+PiAoMTYgLSBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSA9PSAyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSA9IDB4ZmZmZmZmZmYgPj4gKDMyIC0gc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tNjQgPSBpbW0gfCAoKCh1aW50NjRfdClpbW0pIDw8IDMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW02NCA9IGltbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2k2NChjcHVfVjAsIGNwdV9WMCwgfmltbTY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZzY0KGNwdV9WMCwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID49IDE0KSB7CisgICAgICAgICAgICAgICAgLyogVkNWVCBmaXhlZC1wb2ludC4gICovCisgICAgICAgICAgICAgICAgaWYgKCEoaW5zbiAmICgxIDw8IDIxKSkgfHwgKHEgJiYgKChyZCB8IHJtKSAmIDEpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IG1hc2tlZCBvdXQgdGhlIG11c3QtYmUtMSB0b3AgYml0IG9mIGltbTYsCisgICAgICAgICAgICAgICAgICogaGVuY2UgdGhpcyAzMi1zaGlmdCB3aGVyZSB0aGUgQVJNIEFSTSBoYXMgNjQtaW1tNi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzaGlmdCA9IDMyIC0gc2hpZnQ7CisgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IChxID8gNCA6IDIpOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9sZF9mMzIoY3B1X0YwcywgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJtLCBwYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghKG9wICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdWx0bygwLCBzaGlmdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9zbHRvKDAsIHNoaWZ0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdG91bCgwLCBzaGlmdCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF90b3NsKDAsIHNoaWZ0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2YzMihjcHVfRjBzLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocmQsIHBhc3MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiAoaW5zbiAmIDB4MDAzODAwODApID09IDAgKi8KKyAgICAgICAgICAgIGludCBpbnZlcnQ7CisgICAgICAgICAgICBpZiAocSAmJiAocmQgJiAxKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcCA9IChpbnNuID4+IDgpICYgMHhmOworICAgICAgICAgICAgLyogT25lIHJlZ2lzdGVyIGFuZCBpbW1lZGlhdGUuICAqLworICAgICAgICAgICAgaW1tID0gKHUgPDwgNykgfCAoKGluc24gPj4gMTIpICYgMHg3MCkgfCAoaW5zbiAmIDB4Zik7CisgICAgICAgICAgICBpbnZlcnQgPSAoaW5zbiAmICgxIDw8IDUpKSAhPSAwOworICAgICAgICAgICAgLyogTm90ZSB0aGF0IG9wID0gMiwzLDQsNSw2LDcsMTAsMTEsMTIsMTMgaW1tPTAgaXMgVU5QUkVESUNUQUJMRS4KKyAgICAgICAgICAgICAqIFdlIGNob29zZSB0byBub3Qgc3BlY2lhbC1jYXNlIHRoaXMgYW5kIHdpbGwgYmVoYXZlIGFzIGlmIGEKKyAgICAgICAgICAgICAqIHZhbGlkIGNvbnN0YW50IGVuY29kaW5nIG9mIDAgaGFkIGJlZW4gZ2l2ZW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOgorICAgICAgICAgICAgICAgIC8qIG5vLW9wICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IGNhc2UgMzoKKyAgICAgICAgICAgICAgICBpbW0gPDw9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IGNhc2UgNToKKyAgICAgICAgICAgICAgICBpbW0gPDw9IDE2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OiBjYXNlIDc6CisgICAgICAgICAgICAgICAgaW1tIDw8PSAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODogY2FzZSA5OgorICAgICAgICAgICAgICAgIGltbSB8PSBpbW0gPDwgMTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBjYXNlIDExOgorICAgICAgICAgICAgICAgIGltbSA9IChpbW0gPDwgOCkgfCAoaW1tIDw8IDI0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICAgICAgaW1tID0gKGltbSA8PCA4KSB8IDB4ZmY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIGltbSA9IChpbW0gPDwgMTYpIHwgMHhmZmZmOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBpbW0gfD0gKGltbSA8PCA4KSB8IChpbW0gPDwgMTYpIHwgKGltbSA8PCAyNCk7CisgICAgICAgICAgICAgICAgaWYgKGludmVydCkKKyAgICAgICAgICAgICAgICAgICAgaW1tID0gfmltbTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICAgICAgaWYgKGludmVydCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW1tID0gKChpbW0gJiAweDgwKSA8PCAyNCkgfCAoKGltbSAmIDB4M2YpIDw8IDE5KQorICAgICAgICAgICAgICAgICAgICAgIHwgKChpbW0gJiAweDQwKSA/ICgweDFmIDw8IDI1KSA6ICgxIDw8IDMwKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW52ZXJ0KQorICAgICAgICAgICAgICAgIGltbSA9IH5pbW07CisKKyAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAocSA/IDQgOiAyKTsgcGFzcysrKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wICYgMSAmJiBvcCA8IDEyKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocmQsIHBhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW52ZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgaW1tZWRpYXRlIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gaW52ZXJ0ZWQsIHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUMgYmVjb21lcyBBTkQuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JpX2kzMih0bXAsIHRtcCwgaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFZNT1YsIFZNVk4uICAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxNCAmJiBpbnZlcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1tICYgKDEgPDwgKG4gKyAocGFzcyAmIDEpICogNCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgfD0gMHhmZiA8PCAobiAqIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcCwgaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgcGFzcywgdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIChpbnNuICYgMHgwMDgwMDAxMCA9PSAweDAwODAwMDAwKSAqLworICAgICAgICBpZiAoc2l6ZSAhPSAzKSB7CisgICAgICAgICAgICBvcCA9IChpbnNuID4+IDgpICYgMHhmOworICAgICAgICAgICAgaWYgKChpbnNuICYgKDEgPDwgNikpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBUaHJlZSByZWdpc3RlcnMgb2YgZGlmZmVyZW50IGxlbmd0aHMuICAqLworICAgICAgICAgICAgICAgIGludCBzcmMxX3dpZGU7CisgICAgICAgICAgICAgICAgaW50IHNyYzJfd2lkZTsKKyAgICAgICAgICAgICAgICBpbnQgcHJld2lkZW47CisgICAgICAgICAgICAgICAgLyogdW5kZWZyZXE6IGJpdCAwIDogVU5ERUYgaWYgc2l6ZSAhPSAwCisgICAgICAgICAgICAgICAgICogICAgICAgICAgIGJpdCAxIDogVU5ERUYgaWYgc2l6ZSA9PSAwCisgICAgICAgICAgICAgICAgICogICAgICAgICAgIGJpdCAyIDogVU5ERUYgaWYgVSA9PSAxCisgICAgICAgICAgICAgICAgICogTm90ZSB0aGF0IFsxOjBdIHNldCBpbXBsaWVzICdhbHdheXMgVU5ERUYnCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IHVuZGVmcmVxOworICAgICAgICAgICAgICAgIC8qIHByZXdpZGVuLCBzcmMxX3dpZGUsIHNyYzJfd2lkZSwgdW5kZWZyZXEgKi8KKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IG5lb25fM3JlZ193aWRlWzE2XVs0XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgezEsIDAsIDAsIDB9LCAvKiBWQURETCAqLworICAgICAgICAgICAgICAgICAgICB7MSwgMSwgMCwgMH0sIC8qIFZBRERXICovCisgICAgICAgICAgICAgICAgICAgIHsxLCAwLCAwLCAwfSwgLyogVlNVQkwgKi8KKyAgICAgICAgICAgICAgICAgICAgezEsIDEsIDAsIDB9LCAvKiBWU1VCVyAqLworICAgICAgICAgICAgICAgICAgICB7MCwgMSwgMSwgMH0sIC8qIFZBRERITiAqLworICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgMH0sIC8qIFZBQkFMICovCisgICAgICAgICAgICAgICAgICAgIHswLCAxLCAxLCAwfSwgLyogVlNVQkhOICovCisgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAwfSwgLyogVkFCREwgKi8KKyAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDB9LCAvKiBWTUxBTCAqLworICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgNn0sIC8qIFZRRE1MQUwgKi8KKyAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDB9LCAvKiBWTUxTTCAqLworICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgNn0sIC8qIFZRRE1MU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDB9LCAvKiBJbnRlZ2VyIFZNVUxMICovCisgICAgICAgICAgICAgICAgICAgIHswLCAwLCAwLCAyfSwgLyogVlFETVVMTCAqLworICAgICAgICAgICAgICAgICAgICB7MCwgMCwgMCwgNX0sIC8qIFBvbHlub21pYWwgVk1VTEwgKi8KKyAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDN9LCAvKiBSZXNlcnZlZDogYWx3YXlzIFVOREVGICovCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHByZXdpZGVuID0gbmVvbl8zcmVnX3dpZGVbb3BdWzBdOworICAgICAgICAgICAgICAgIHNyYzFfd2lkZSA9IG5lb25fM3JlZ193aWRlW29wXVsxXTsKKyAgICAgICAgICAgICAgICBzcmMyX3dpZGUgPSBuZW9uXzNyZWdfd2lkZVtvcF1bMl07CisgICAgICAgICAgICAgICAgdW5kZWZyZXEgPSBuZW9uXzNyZWdfd2lkZVtvcF1bM107CisKKyAgICAgICAgICAgICAgICBpZiAoKCh1bmRlZnJlcSAmIDEpICYmIChzaXplICE9IDApKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHVuZGVmcmVxICYgMikgJiYgKHNpemUgPT0gMCkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodW5kZWZyZXEgJiA0KSAmJiB1KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChzcmMxX3dpZGUgJiYgKHJuICYgMSkpIHx8CisgICAgICAgICAgICAgICAgICAgIChzcmMyX3dpZGUgJiYgKHJtICYgMSkpIHx8CisgICAgICAgICAgICAgICAgICAgICghc3JjMl93aWRlICYmIChyZCAmIDEpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBBdm9pZCBvdmVybGFwcGluZyBvcGVyYW5kcy4gIFdpZGUgc291cmNlIG9wZXJhbmRzIGFyZQorICAgICAgICAgICAgICAgICAgIGFsd2F5cyBhbGlnbmVkIHNvIHdpbGwgbmV2ZXIgb3ZlcmxhcCB3aXRoIHdpZGUKKyAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnMgaW4gcHJvYmxlbWF0aWMgd2F5cy4gICovCisgICAgICAgICAgICAgICAgaWYgKHJkID09IHJtICYmICFzcmMyX3dpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgMSk7CisgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfc2NyYXRjaCgyLCB0bXApOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmQgPT0gcm4gJiYgIXNyYzFfd2lkZSkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJuLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9zY3JhdGNoKDIsIHRtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcDMpOworICAgICAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyYzFfd2lkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMCwgcm4gKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAxICYmIHJkID09IHJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3NjcmF0Y2goMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocm4sIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXdpZGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fd2lkZW4oY3B1X1YwLCB0bXAsIHNpemUsIHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmMyX3dpZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJtICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX1VOVVNFRCh0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDEgJiYgcmQgPT0gcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3NjcmF0Y2goMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJtLCBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV3aWRlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX3dpZGVuKGNwdV9WMSwgdG1wMiwgc2l6ZSwgdSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSA0OiAvKiBWQURETCwgVkFERFcsIFZBRERITiwgVlJBRERITiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fYWRkbChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGNhc2UgMzogY2FzZSA2OiAvKiBWU1VCTCwgVlNVQlcsIFZTVUJITiwgVlJTVUJITiAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fc3VibChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IGNhc2UgNzogLyogVkFCQUwsIFZBQkRMICovCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKChzaXplIDw8IDEpIHwgdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9hYmRsX3MxNihjcHVfVjAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2FiZGxfdTE2KGNwdV9WMCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fYWJkbF9zMzIoY3B1X1YwLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9hYmRsX3UzMihjcHVfVjAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2FiZGxfczY0KGNwdV9WMCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fYWJkbF91NjQoY3B1X1YwLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDg6IGNhc2UgOTogY2FzZSAxMDogY2FzZSAxMTogY2FzZSAxMjogY2FzZSAxMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZNTEFMLCBWUURNTEFMLCBWTUxTTCwgVlFETUxTTCwgVk1VTEwsIFZRRE1VTEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX211bGwoY3B1X1YwLCB0bXAsIHRtcDIsIHNpemUsIHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6IC8qIFBvbHlub21pYWwgVk1VTEwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9tdWxsX3A4KGNwdV9WMCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiAxNSBpcyBSRVNFUlZFRDogY2F1Z2h0IGVhcmxpZXIgICovCisgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxMykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogVlFETVVMTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fYWRkbF9zYXR1cmF0ZShjcHVfVjAsIGNwdV9WMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZzY0KGNwdV9WMCwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSA1IHx8IChvcCA+PSA4ICYmIG9wIDw9IDExKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW11bGF0ZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YxLCByZCArIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDogLyogVk1MU0wgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9uZWdsKGNwdV9WMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IGNhc2UgODogLyogVkFCQUwsIFZNTEFMICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fYWRkbChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTogY2FzZSAxMTogLyogVlFETUxBTCwgVlFETUxTTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZGxfc2F0dXJhdGUoY3B1X1YwLCBjcHVfVjAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSAxMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9uZWdsKGNwdV9WMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZGxfc2F0dXJhdGUoY3B1X1YwLCBjcHVfVjEsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWc2NChjcHVfVjAsIHJkICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgPT0gNCB8fCBvcCA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOYXJyb3dpbmcgb3BlcmF0aW9uLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX25hcnJvd19oaWdoX3U4KHRtcCwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fbmFycm93X2hpZ2hfdTE2KHRtcCwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KGNwdV9WMCwgY3B1X1YwLCAzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9uYXJyb3dfcm91bmRfaGlnaF91OCh0bXAsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX25hcnJvd19yb3VuZF9oaWdoX3UxNih0bXAsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2k2NChjcHVfVjAsIGNwdV9WMCwgMXUgPDwgMzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KGNwdV9WMCwgY3B1X1YwLCAzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIGNwdV9WMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDMgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJkLCAwLCB0bXAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgMSwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRlIGJhY2sgdGhlIHJlc3VsdC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZzY0KGNwdV9WMCwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVHdvIHJlZ2lzdGVycyBhbmQgYSBzY2FsYXIuIE5CIHRoYXQgZm9yIG9wcyBvZiB0aGlzIGZvcm0KKyAgICAgICAgICAgICAgICAgKiB0aGUgQVJNIEFSTSBsYWJlbHMgYml0IDI0IGFzIFEsIGJ1dCBpdCBpcyBpbiBvdXIgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgKiAndScsIG5vdCAncScuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogRmxvYXQgVk1MQSBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIEZsb2F0aW5nIHBvaW50IFZNTFMgc2NhbGFyICovCisgICAgICAgICAgICAgICAgY2FzZSA5OiAvKiBGbG9hdGluZyBwb2ludCBWTVVMIHNjYWxhciAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIEludGVnZXIgVk1MQSBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIEludGVnZXIgVk1MUyBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDg6IC8qIEludGVnZXIgVk1VTCBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDEyOiAvKiBWUURNVUxIIHNjYWxhciAqLworICAgICAgICAgICAgICAgIGNhc2UgMTM6IC8qIFZRUkRNVUxIIHNjYWxhciAqLworICAgICAgICAgICAgICAgICAgICBpZiAodSAmJiAoKHJkIHwgcm4pICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fZ2V0X3NjYWxhcihzaXplLCBybSk7CisgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfc2NyYXRjaCgwLCB0bXApOworICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgKHUgPyA0IDogMik7IHBhc3MrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3NjcmF0Y2goMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhybiwgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPT0gMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xZG11bGhfczE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcWRtdWxoX3MzMih0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSAxMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FyZG11bGhfczE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fcXJkbXVsaF9zMzIodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9wdHIgZnBzdGF0dXMgPSBnZXRfZnBzdGF0dXNfcHRyKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmZwX211bHModG1wLCB0bXAsIHRtcDIsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX3B0cihmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX211bF91OCh0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX211bF91MTYodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHRjZ19nZW5fbXVsX2kzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW11bGF0ZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocmQsIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZChzaXplLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmZwX2FkZHModG1wLCB0bXAsIHRtcDIsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIoZnBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9yc2Ioc2l6ZSwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9wdHIgZnBzdGF0dXMgPSBnZXRfZnBzdGF0dXNfcHRyKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZmcF9zdWJzKHRtcCwgdG1wMiwgdG1wLCBmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIHBhc3MsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBWUURNTEFMIHNjYWxhciAqLworICAgICAgICAgICAgICAgIGNhc2UgNzogLyogVlFETUxTTCBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDExOiAvKiBWUURNVUxMIHNjYWxhciAqLworICAgICAgICAgICAgICAgICAgICBpZiAodSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8qIFZNTEFMIHNjbGFyICovCisgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBWTUxTTCBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDEwOiAvKiBWTVVMTCBzY2FsYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJkICYgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fZ2V0X3NjYWxhcihzaXplLCBybSk7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIG5lZWQgYSBjb3B5IG9mIHRtcDIgYmVjYXVzZSBnZW5fbmVvbl9tdWxsCisgICAgICAgICAgICAgICAgICAgICAqIGRlbGV0ZXMgaXQgZHVyaW5nIHBhc3MgMC4gICovCisgICAgICAgICAgICAgICAgICAgIHRtcDQgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X2kzMih0bXA0LCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IG5lb25fbG9hZF9yZWcocm4sIDEpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJuLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdG1wNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX211bGwoY3B1X1YwLCB0bXAsIHRtcDIsIHNpemUsIHUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wICE9IDExKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMSwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9uZWdsKGNwdV9WMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fYWRkbChzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogY2FzZSA3OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZGxfc2F0dXJhdGUoY3B1X1YwLCBjcHVfVjAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX25lZ2woY3B1X1YwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fYWRkbF9zYXR1cmF0ZShjcHVfVjAsIGNwdV9WMSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vLW9wICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX2FkZGxfc2F0dXJhdGUoY3B1X1YwLCBjcHVfVjAsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWc2NChjcHVfVjAsIHJkICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IC8qIDE0IGFuZCAxNSBhcmUgUkVTRVJWRUQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvKiBzaXplID09IDMgKi8KKyAgICAgICAgICAgIGlmICghdSkgeworICAgICAgICAgICAgICAgIC8qIEV4dHJhY3QuICAqLworICAgICAgICAgICAgICAgIGltbSA9IChpbnNuID4+IDgpICYgMHhmOworCisgICAgICAgICAgICAgICAgaWYgKGltbSA+IDcgJiYgIXEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAgICAgaWYgKHEgJiYgKChyZCB8IHJuIHwgcm0pICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGltbSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjAsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGltbSA9PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjAsIHJuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YxLCBybSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wNjQgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbW0gPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YwLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQodG1wNjQsIHJuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YwLCBybiArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KHRtcDY0LCBybSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2k2NChjcHVfVjAsIGNwdV9WMCwgKGltbSAmIDcpICogOCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pNjQoY3B1X1YxLCB0bXA2NCwgNjQgLSAoKGltbSAmIDcpICogOCkpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yX2k2NChjcHVfVjAsIGNwdV9WMCwgY3B1X1YxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGltbSA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fbG9hZF9yZWc2NChjcHVfVjEsIHJtICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbW0gLT0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KGNwdV9WMSwgY3B1X1YxLCA2NCAtIChpbW0gKiA4KSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodG1wNjQsIHRtcDY0LCBpbW0gKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9vcl9pNjQoY3B1X1YxLCBjcHVfVjEsIHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wNjQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEJVR0ZJWCAqLworICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YwLCBybik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQoY3B1X1YwLCBjcHVfVjAsIGltbSAqIDgpOworICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YxLCBybSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pNjQoY3B1X1YxLCBjcHVfVjEsIDY0IC0gKGltbSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9vcl9pNjQoY3B1X1YwLCBjcHVfVjAsIGNwdV9WMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnNjQoY3B1X1YwLCByZCk7CisgICAgICAgICAgICAgICAgaWYgKHEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWc2NChjcHVfVjEsIHJkICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmICgxIDw8IDExKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFR3byByZWdpc3RlciBtaXNjLiAgKi8KKyAgICAgICAgICAgICAgICBvcCA9ICgoaW5zbiA+PiAxMikgJiAweDMwKSB8ICgoaW5zbiA+PiA3KSAmIDB4Zik7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnNuID4+IDE4KSAmIDM7CisgICAgICAgICAgICAgICAgLyogVU5ERUYgZm9yIHVua25vd24gb3AgdmFsdWVzIGFuZCBiYWQgb3Atc2l6ZSBjb21iaW5hdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBpZiAoKG5lb25fMnJtX3NpemVzW29wXSAmICgxIDw8IHNpemUpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG9wICE9IE5FT05fMlJNX1ZNT1ZOICYmIG9wICE9IE5FT05fMlJNX1ZRTU9WTikgJiYKKyAgICAgICAgICAgICAgICAgICAgcSAmJiAoKHJtIHwgcmQpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZSRVY2NDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IChxID8gMiA6IDEpOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocm0sIHBhc3MgKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBuZW9uX2xvYWRfcmVnKHJtLCBwYXNzICogMiArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHRjZ19nZW5fYnN3YXAzMl9pMzIodG1wLCB0bXApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX3N3YXBfaGFsZih0bXApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLyogbm8tb3AgKi8gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIHBhc3MgKiAyICsgMSwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgcGFzcyAqIDIsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHRjZ19nZW5fYnN3YXAzMl9pMzIodG1wMiwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX3N3YXBfaGFsZih0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIHBhc3MgKiAyLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZQQURETDogY2FzZSBORU9OXzJSTV9WUEFERExfVToKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZQQURBTDogY2FzZSBORU9OXzJSTV9WUEFEQUxfVToKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IHEgKyAxOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocm0sIHBhc3MgKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX3dpZGVuKGNwdV9WMCwgdG1wLCBzaXplLCBvcCAmIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgcGFzcyAqIDIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX3dpZGVuKGNwdV9WMSwgdG1wLCBzaXplLCBvcCAmIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9wYWRkbF91MTYoQ1BVX1YwMDEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX3BhZGRsX3UzMihDUFVfVjAwMSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiB0Y2dfZ2VuX2FkZF9pNjQoQ1BVX1YwMDEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPj0gTkVPTl8yUk1fVlBBREFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWNjdW11bGF0ZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9sb2FkX3JlZzY0KGNwdV9WMSwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9hZGRsKHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWc2NChjcHVfVjAsIHJkICsgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WVFJOOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAocSA/IDQgOiAyKTsgbiArPSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbmVvbl9sb2FkX3JlZyhybSwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocmQsIG4gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhybSwgbiwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIG4gKyAxLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbGVtZW50d2lzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZVWlA6CisgICAgICAgICAgICAgICAgICAgIGlmIChnZW5fbmVvbl91bnppcChyZCwgcm0sIHNpemUsIHEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZaSVA6CisgICAgICAgICAgICAgICAgICAgIGlmIChnZW5fbmVvbl96aXAocmQsIHJtLCBzaXplLCBxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WTU9WTjogY2FzZSBORU9OXzJSTV9WUU1PVk46CisgICAgICAgICAgICAgICAgICAgIC8qIGFsc28gVlFNT1ZVTjsgb3AgZmllbGQgYW5kIG1uZW1vbmljcyBkb24ndCBsaW5lIHVwICovCisgICAgICAgICAgICAgICAgICAgIGlmIChybSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcDIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX2xvYWRfcmVnNjQoY3B1X1YwLCBybSArIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fbmFycm93X29wKG9wID09IE5FT05fMlJNX1ZNT1ZOLCBxLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgY3B1X1YwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgMCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVvbl9zdG9yZV9yZWcocmQsIDEsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WU0hMTDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHEgfHwgKHJkICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocm0sIDApOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhybSwgMSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX3dpZGVuKGNwdV9WMCwgdG1wLCBzaXplLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pNjQoY3B1X1YwLCBjcHVfVjAsIDggPDwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZzY0KGNwdV9WMCwgcmQgKyBwYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDVlRfRjE2X0YzMjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1ZGUF9GUDE2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcSB8fCAocm0gJiAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2YzMihjcHVfRjBzLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocm0sIDApKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2ZjdnRfZjMyX3RvX2YxNih0bXAsIGNwdV9GMHMsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2YzMihjcHVfRjBzLCBjcHVfZW52LCBuZW9uX3JlZ19vZmZzZXQocm0sIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2ZjdnRfZjMyX3RvX2YxNih0bXAyLCBjcHVfRjBzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0bXAyLCB0bXAyLCAxNik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcDIsIHRtcDIsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGRfZjMyKGNwdV9GMHMsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChybSwgMikpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fZmN2dF9mMzJfdG9fZjE2KHRtcCwgY3B1X0YwcywgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGRfZjMyKGNwdV9GMHMsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChybSwgMykpOworICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgMCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9mY3Z0X2YzMl90b19mMTYodG1wMiwgY3B1X0YwcywgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wMiwgdG1wMiwgMTYpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yX2kzMih0bXAyLCB0bXAyLCB0bXApOworICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgMSwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNWVF9GMzJfRjE2OgorICAgICAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVkZQX0ZQMTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBxIHx8IChyZCAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0bXAzID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJtLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm0sIDEpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV9pMzIodG1wMywgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2ZjdnRfZjE2X3RvX2YzMihjcHVfRjBzLCB0bXAzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9mMzIoY3B1X0YwcywgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJkLCAwKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodG1wMywgdG1wLCAxNik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9mY3Z0X2YxNl90b19mMzIoY3B1X0YwcywgdG1wMywgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfZjMyKGNwdV9GMHMsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChyZCwgMSkpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV9pMzIodG1wMywgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9mY3Z0X2YxNl90b19mMzIoY3B1X0YwcywgdG1wMywgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfZjMyKGNwdV9GMHMsIGNwdV9lbnYsIG5lb25fcmVnX29mZnNldChyZCwgMikpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHRtcDMsIHRtcDIsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2ZjdnRfZjE2X3RvX2YzMihjcHVfRjBzLCB0bXAzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9mMzIoY3B1X0YwcywgY3B1X2VudiwgbmVvbl9yZWdfb2Zmc2V0KHJkLCAzKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBlbGVtZW50d2lzZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IChxID8gNCA6IDIpOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZW9uXzJybV9pc19mbG9hdF9vcChvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2YzMihjcHVfRjBzLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fcmVnX29mZnNldChybSwgcGFzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocm0sIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WUkVWMzI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiB0Y2dfZ2VuX2Jzd2FwMzJfaTMyKHRtcCwgdG1wKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBnZW5fc3dhcF9oYWxmKHRtcCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WUkVWMTY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3JldjE2KHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDTFM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fY2xzX3M4KHRtcCwgdG1wKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fY2xzX3MxNih0bXAsIHRtcCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX2Nsc19zMzIodG1wLCB0bXApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNMWjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9jbHpfdTgodG1wLCB0bXApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9jbHpfdTE2KHRtcCwgdG1wKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX2Nseih0bXAsIHRtcCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WQ05UOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9jbnRfdTgodG1wLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WTVZOOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbm90X2kzMih0bXAsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZRQUJTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FhYnNfczgodG1wLCBjcHVfZW52LCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xYWJzX3MxNih0bXAsIGNwdV9lbnYsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FhYnNfczMyKHRtcCwgY3B1X2VudiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZRTkVHOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FuZWdfczgodG1wLCBjcHVfZW52LCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9xbmVnX3MxNih0bXAsIGNwdV9lbnYsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3FuZWdfczMyKHRtcCwgY3B1X2VudiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDR1QwOiBjYXNlIE5FT05fMlJNX1ZDTEUwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBnZW5faGVscGVyX25lb25fY2d0X3M4KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBnZW5faGVscGVyX25lb25fY2d0X3MxNih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogZ2VuX2hlbHBlcl9uZW9uX2NndF9zMzIodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSBORU9OXzJSTV9WQ0xFMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX25vdF9pMzIodG1wLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNHRTA6IGNhc2UgTkVPTl8yUk1fVkNMVDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9oZWxwZXJfbmVvbl9jZ2VfczgodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IGdlbl9oZWxwZXJfbmVvbl9jZ2VfczE2KHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBnZW5faGVscGVyX25lb25fY2dlX3MzMih0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IE5FT05fMlJNX1ZDTFQwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbm90X2kzMih0bXAsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WQ0VRMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMigwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX2NlcV91OCh0bXAsIHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX2NlcV91MTYodG1wLCB0bXAsIHRtcDIpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IGdlbl9oZWxwZXJfbmVvbl9jZXFfdTMyKHRtcCwgdG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkFCUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogZ2VuX2hlbHBlcl9uZW9uX2Fic19zOCh0bXAsIHRtcCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogZ2VuX2hlbHBlcl9uZW9uX2Fic19zMTYodG1wLCB0bXApOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHRjZ19nZW5fYWJzX2kzMih0bXAsIHRtcCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WTkVHOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9uZW9uX3JzYihzaXplLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDR1QwX0Y6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9wdHIgZnBzdGF0dXMgPSBnZXRfZnBzdGF0dXNfcHRyKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbmVvbl9jZ3RfZjMyKHRtcCwgdG1wLCB0bXAyLCBmcHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNHRTBfRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2NnZV9mMzIodG1wLCB0bXAsIHRtcDIsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNFUTBfRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2NlcV9mMzIodG1wLCB0bXAsIHRtcDIsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNMRTBfRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2NnZV9mMzIodG1wLCB0bXAyLCB0bXAsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNMVDBfRjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X3B0ciBmcHN0YXR1cyA9IGdldF9mcHN0YXR1c19wdHIoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX2NndF9mMzIodG1wLCB0bXAyLCB0bXAsIGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZwc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkFCU19GOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfYWJzKDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WTkVHX0Y6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9uZWcoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZTV1A6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocmQsIHBhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJtLCBwYXNzLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVlRSTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbmVvbl9sb2FkX3JlZyhyZCwgcGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBnZW5fbmVvbl90cm5fdTgodG1wLCB0bXAyKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiBnZW5fbmVvbl90cm5fdTE2KHRtcCwgdG1wMik7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJtLCBwYXNzLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVlJFQ1BFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcmVjcGVfdTMyKHRtcCwgdG1wLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVlJTUVJURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3JzcXJ0ZV91MzIodG1wLCB0bXAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WUkVDUEVfRjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3JlY3BlX2YzMihjcHVfRjBzLCBjcHVfRjBzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVlJTUVJURV9GOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcnNxcnRlX2YzMihjcHVfRjBzLCBjcHVfRjBzLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVPTl8yUk1fVkNWVF9GUzogLyogVkNWVC5GMzIuUzMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3ZmcF9zaXRvKDAsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBORU9OXzJSTV9WQ1ZUX0ZVOiAvKiBWQ1ZULkYzMi5VMzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdmZwX3VpdG8oMCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDVlRfU0Y6IC8qIFZDVlQuUzMyLkYzMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdG9zaXooMCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FT05fMlJNX1ZDVlRfVUY6IC8qIFZDVlQuVTMyLkYzMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl92ZnBfdG91aXooMCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VydmVkIG9wIHZhbHVlcyB3ZXJlIGNhdWdodCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBuZW9uXzJybV9zaXplc1tdIGNoZWNrIGVhcmxpZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZW9uXzJybV9pc19mbG9hdF9vcChvcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2YzMihjcHVfRjBzLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lb25fcmVnX29mZnNldChyZCwgcGFzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgcGFzcywgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgKDEgPDwgMTApKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogVlRCTCwgVlRCWC4gICovCisgICAgICAgICAgICAgICAgaW50IG4gPSAoKGluc24gPj4gOCkgJiAzKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKChybiArIG4pID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBVTlBSRURJQ1RBQkxFOyB3ZSBjaG9vc2UgdG8gVU5ERUYgdG8gYXZvaWQgdGhlCisgICAgICAgICAgICAgICAgICAgICAqIGhlbHBlciBmdW5jdGlvbiBydW5uaW5nIG9mZiB0aGUgZW5kIG9mIHRoZSByZWdpc3RlciBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG4gPDw9IDM7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA2KSkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJkLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wMiA9IG5lb25fbG9hZF9yZWcocm0sIDApOworICAgICAgICAgICAgICAgIHRtcDQgPSB0Y2dfY29uc3RfaTMyKHJuKTsKKyAgICAgICAgICAgICAgICB0bXA1ID0gdGNnX2NvbnN0X2kzMihuKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX25lb25fdGJsKHRtcDIsIGNwdV9lbnYsIHRtcDIsIHRtcCwgdG1wNCwgdG1wNSk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDYpKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IG5lb25fbG9hZF9yZWcocmQsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAzID0gbmVvbl9sb2FkX3JlZyhybSwgMSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9uZW9uX3RibCh0bXAzLCBjcHVfZW52LCB0bXAzLCB0bXAsIHRtcDQsIHRtcDUpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDUpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDQpOworICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJkLCAwLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBuZW9uX3N0b3JlX3JlZyhyZCwgMSwgdG1wMyk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGluc24gJiAweDM4MCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFZEVVAgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAoNyA8PCAxNikpID09IDAgfHwgKHEgJiYgKHJkICYgMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDE5KSkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJtLCAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZW9uX2xvYWRfcmVnKHJtLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxNikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fZHVwX3U4KHRtcCwgKChpbnNuID4+IDE3KSAmIDMpICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuICYgKDEgPDwgMTcpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5zbiA+PiAxOCkgJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25lb25fZHVwX2hpZ2gxNih0bXApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbmVvbl9kdXBfbG93MTYodG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IChxID8gNCA6IDIpOyBwYXNzKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHRtcDIsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIG5lb25fc3RvcmVfcmVnKHJkLCBwYXNzLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlzYXNfY3AxNF9yZWFkKENQVUFSTVN0YXRlICogZW52LCBEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IGluc24pCit7CisgICAgaW50IGNybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICBpbnQgY3JtID0gaW5zbiAmIDB4ZjsKKyAgICBpbnQgb3AxID0gKGluc24gPj4gMjEpICYgNzsKKyAgICBpbnQgb3AyID0gKGluc24gPj4gNSkgJiA3OworICAgIGludCBydCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICBUQ0d2IHRtcDsKKworICAgIC8qIE1pbmltYWwgc2V0IG9mIGRlYnVnIHJlZ2lzdGVycywgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBkZWJ1ZyAqLworICAgIGlmIChvcDEgPT0gMCAmJiBjcm4gPT0gMCAmJiBvcDIgPT0gMCkgeworICAgICAgICBzd2l0Y2ggKGNybSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBEQkdESURSOiBqdXN0IFJBWi4gSW4gcGFydGljdWxhciB0aGlzIG1lYW5zIHRoZQorICAgICAgICAgICAgICogImRlYnVnIGFyY2hpdGVjdHVyZSB2ZXJzaW9uIiBiaXRzIHdpbGwgcmVhZCBhcworICAgICAgICAgICAgICogYSByZXNlcnZlZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIGNhdXNlIExpbnV4IHRvCisgICAgICAgICAgICAgKiBub3QgdHJ5IHRvIHVzZSB0aGUgZGVidWcgaGFyZHdhcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRtcCA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcnQsIHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvKiBEQkdEUkFSIGFuZCBEQkdEU0FSOiB2NyBvbmx5LiBBbHdheXMgUkFaIHNpbmNlIHdlCisgICAgICAgICAgICAgKiBkb24ndCBpbXBsZW1lbnQgbWVtb3J5IG1hcHBlZCBkZWJ1ZyBjb21wb25lbnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChFTkFCTEVfQVJDSF83KSB7CisgICAgICAgICAgICAgICAgdG1wID0gdGNnX2NvbnN0X2kzMigwKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcnQsIHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyRUUpKSB7CisgICAgICAgIGlmIChvcDEgPT0gNiAmJiBjcm4gPT0gMCAmJiBjcm0gPT0gMCAmJiBvcDIgPT0gMCkgeworICAgICAgICAgICAgLyogVEVFQ1IgKi8KKyAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQodGVlY3IpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJ0LCB0bXApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wMSA9PSA2ICYmIGNybiA9PSAxICYmIGNybSA9PSAwICYmIG9wMiA9PSAwKSB7CisgICAgICAgICAgICAvKiBURUVIQlIgKi8KKyAgICAgICAgICAgIGlmIChJU19VU0VSKHMpICYmIChlbnYtPnRlZWNyICYgMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB0bXAgPSBsb2FkX2NwdV9maWVsZCh0ZWVoYnIpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJ0LCB0bXApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGNwMTQgcmVhZCBvcDE6JWQgY3JuOiVkIGNybTolZCBvcDI6JWRcbiIsCisgICAgICAgICAgICBvcDEsIGNybiwgY3JtLCBvcDIpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRpc2FzX2NwMTRfd3JpdGUoQ1BVQVJNU3RhdGUgKiBlbnYsIERpc2FzQ29udGV4dCAqcywgdWludDMyX3QgaW5zbikKK3sKKyAgICBpbnQgY3JuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgIGludCBjcm0gPSBpbnNuICYgMHhmOworICAgIGludCBvcDEgPSAoaW5zbiA+PiAyMSkgJiA3OworICAgIGludCBvcDIgPSAoaW5zbiA+PiA1KSAmIDc7CisgICAgaW50IHJ0ID0gKGluc24gPj4gMTIpICYgMHhmOworICAgIFRDR3YgdG1wOworCisgICAgLyogTWluaW1hbCBzZXQgb2YgZGVidWcgcmVnaXN0ZXJzLCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGRlYnVnICovCisgICAgaWYgKG9wMSA9PSAwICYmIGNybiA9PSAwICYmIG9wMiA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoY3JtKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIERCR0RJRFIgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKGNwMTRfZGJnZGlkcik7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcnQsIHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAvKiBEQkdEUkFSIGFuZCBEQkdEU0FSOiB2NyBvbmx5LiBBbHdheXMgUkFaIHNpbmNlIHdlCisgICAgICAgICAgICAgKiBkb24ndCBpbXBsZW1lbnQgbWVtb3J5IG1hcHBlZCBkZWJ1ZyBjb21wb25lbnRzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChFTkFCTEVfQVJDSF83KSB7CisgICAgICAgICAgICAgICAgdG1wID0gdGNnX2NvbnN0X2kzMigwKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcnQsIHRtcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfVEhVTUIyRUUpKSB7CisgICAgICAgIGlmIChvcDEgPT0gNiAmJiBjcm4gPT0gMCAmJiBjcm0gPT0gMCAmJiBvcDIgPT0gMCkgeworICAgICAgICAgICAgLyogVEVFQ1IgKi8KKyAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zZXRfdGVlY3IoY3B1X2VudiwgdG1wKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAob3AxID09IDYgJiYgY3JuID09IDEgJiYgY3JtID09IDAgJiYgb3AyID09IDApIHsKKyAgICAgICAgICAgIC8qIFRFRUhCUiAqLworICAgICAgICAgICAgaWYgKElTX1VTRVIocykgJiYgKGVudi0+dGVlY3IgJiAxKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJ0KTsKKyAgICAgICAgICAgIHN0b3JlX2NwdV9maWVsZCh0bXAsIHRlZWhicik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY3AxNCB3cml0ZSBvcDE6JWQgY3JuOiVkIGNybTolZCBvcDI6JWRcbiIsCisgICAgICAgICAgICBvcDEsIGNybiwgY3JtLCBvcDIpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRpc2FzX2NvcHJvY19pbnNuKENQVUFSTVN0YXRlICogZW52LCBEaXNhc0NvbnRleHQgKnMsIHVpbnQzMl90IGluc24pCit7CisgICAgaW50IGNwbnVtOworCisgICAgY3BudW0gPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9YU0NBTEUpCisJICAgICYmICgoZW52LT5jcDE1LmMxNV9jcGFyIF4gMHgzZmZmKSAmICgxIDw8IGNwbnVtKSkpCisJcmV0dXJuIDE7CisKKyAgICBzd2l0Y2ggKGNwbnVtKSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDE6CisJaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfSVdNTVhUKSkgeworCSAgICByZXR1cm4gZGlzYXNfaXdtbXh0X2luc24oZW52LCBzLCBpbnNuKTsKKwl9IGVsc2UgaWYgKGFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfWFNDQUxFKSkgeworCSAgICByZXR1cm4gZGlzYXNfZHNwX2luc24oZW52LCBzLCBpbnNuKTsKKwl9CisJZ290byBib2FyZDsKKyAgICBjYXNlIDEwOgorICAgIGNhc2UgMTE6CisJcmV0dXJuIGRpc2FzX3ZmcF9pbnNuIChlbnYsIHMsIGluc24pOworICAgIGNhc2UgMTQ6CisgICAgICAgIC8qIENvcHJvY2Vzc29ycyA3LTE1IGFyZSBhcmNoaXRlY3R1cmFsbHkgcmVzZXJ2ZWQgYnkgQVJNLgorICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IEludGVsIGRlY2lkZWQgdG8gaWdub3JlIHRoaXMuICAqLworICAgICAgICBpZiAoYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9YU0NBTEUpKQorICAgICAgICAgICAgZ290byBib2FyZDsKKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpCisgICAgICAgICAgICByZXR1cm4gZGlzYXNfY3AxNF9yZWFkKGVudiwgcywgaW5zbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBkaXNhc19jcDE0X3dyaXRlKGVudiwgcywgaW5zbik7CisgICAgY2FzZSAxNToKKwlyZXR1cm4gZGlzYXNfY3AxNV9pbnNuIChlbnYsIHMsIGluc24pOworICAgIGRlZmF1bHQ6CisgICAgYm9hcmQ6CisJLyogVW5rbm93biBjb3Byb2Nlc3Nvci4gIFNlZSBpZiB0aGUgYm9hcmQgaGFzIGhvb2tlZCBpdC4gICovCisJcmV0dXJuIGRpc2FzX2NwX2luc24gKGVudiwgcywgaW5zbik7CisgICAgfQorfQorCisKKy8qIFN0b3JlIGEgNjQtYml0IHZhbHVlIHRvIGEgcmVnaXN0ZXIgcGFpci4gIENsb2JiZXJzIHZhbC4gICovCitzdGF0aWMgdm9pZCBnZW5fc3RvcmVxX3JlZyhEaXNhc0NvbnRleHQgKnMsIGludCBybG93LCBpbnQgcmhpZ2gsIFRDR3ZfaTY0IHZhbCkKK3sKKyAgICBUQ0d2IHRtcDsKKyAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKHRtcCwgdmFsKTsKKyAgICBzdG9yZV9yZWcocywgcmxvdywgdG1wKTsKKyAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9zaHJpX2k2NCh2YWwsIHZhbCwgMzIpOworICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIHZhbCk7CisgICAgc3RvcmVfcmVnKHMsIHJoaWdoLCB0bXApOworfQorCisvKiBsb2FkIGEgMzItYml0IHZhbHVlIGZyb20gYSByZWdpc3RlciBhbmQgcGVyZm9ybSBhIDY0LWJpdCBhY2N1bXVsYXRlLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9hZGRxX2xvKERpc2FzQ29udGV4dCAqcywgVENHdl9pNjQgdmFsLCBpbnQgcmxvdykKK3sKKyAgICBUQ0d2X2k2NCB0bXA7CisgICAgVENHdiB0bXAyOworCisgICAgLyogTG9hZCB2YWx1ZSBhbmQgZXh0ZW5kIHRvIDY0IGJpdHMuICAqLworICAgIHRtcCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICB0bXAyID0gbG9hZF9yZWcocywgcmxvdyk7CisgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodG1wLCB0bXAyKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICB0Y2dfZ2VuX2FkZF9pNjQodmFsLCB2YWwsIHRtcCk7CisgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wKTsKK30KKworLyogbG9hZCBhbmQgYWRkIGEgNjQtYml0IHZhbHVlIGZyb20gYSByZWdpc3RlciBwYWlyLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9hZGRxKERpc2FzQ29udGV4dCAqcywgVENHdl9pNjQgdmFsLCBpbnQgcmxvdywgaW50IHJoaWdoKQoreworICAgIFRDR3ZfaTY0IHRtcDsKKyAgICBUQ0d2IHRtcGw7CisgICAgVENHdiB0bXBoOworCisgICAgLyogTG9hZCA2NC1iaXQgdmFsdWUgcmQ6cm4uICAqLworICAgIHRtcGwgPSBsb2FkX3JlZyhzLCBybG93KTsKKyAgICB0bXBoID0gbG9hZF9yZWcocywgcmhpZ2gpOworICAgIHRtcCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICB0Y2dfZ2VuX2NvbmNhdF9pMzJfaTY0KHRtcCwgdG1wbCwgdG1waCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wbCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1waCk7CisgICAgdGNnX2dlbl9hZGRfaTY0KHZhbCwgdmFsLCB0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcCk7Cit9CisKKy8qIFNldCBOIGFuZCBaIGZsYWdzIGZyb20gYSA2NC1iaXQgdmFsdWUuICAqLworc3RhdGljIHZvaWQgZ2VuX2xvZ2ljcV9jYyhUQ0d2X2k2NCB2YWwpCit7CisgICAgVENHdiB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgZ2VuX2hlbHBlcl9sb2dpY3FfY2ModG1wLCB2YWwpOworICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7Cit9CisKKy8qIExvYWQvU3RvcmUgZXhjbHVzaXZlIGluc3RydWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYnkgcmVtZW1iZXJpbmcKKyAgIHRoZSB2YWx1ZS9hZGRyZXNzIGxvYWRlZCwgYW5kIHNlZWluZyBpZiB0aGVzZSBhcmUgdGhlIHNhbWUKKyAgIHdoZW4gdGhlIHN0b3JlIGlzIHBlcmZvcm1lZC4gVGhpcyBzaG91bGQgYmUgaXMgc3VmZmljaWVudCB0byBpbXBsZW1lbnQKKyAgIHRoZSBhcmNoaXRlY3R1cmFsbHkgbWFuZGF0ZWQgc2VtYW50aWNzLCBhbmQgYXZvaWRzIGhhdmluZyB0byBtb25pdG9yCisgICByZWd1bGFyIHN0b3Jlcy4KKworICAgSW4gc3lzdGVtIGVtdWxhdGlvbiBtb2RlIG9ubHkgb25lIENQVSB3aWxsIGJlIHJ1bm5pbmcgYXQgb25jZSwgc28KKyAgIHRoaXMgc2VxdWVuY2UgaXMgZWZmZWN0aXZlbHkgYXRvbWljLiAgSW4gdXNlciBlbXVsYXRpb24gbW9kZSB3ZQorICAgdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBoYW5kbGUgdGhlIGF0b21pYyBvcGVyYXRpb24gZWxzZXdoZXJlLiAgKi8KK3N0YXRpYyB2b2lkIGdlbl9sb2FkX2V4Y2x1c2l2ZShEaXNhc0NvbnRleHQgKnMsIGludCBydCwgaW50IHJ0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2IGFkZHIsIGludCBzaXplKQoreworICAgIFRDR3YgdG1wOworCisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAwOgorICAgICAgICB0bXAgPSBnZW5fbGQ4dShhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB0bXAgPSBnZW5fbGQxNnUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB0Y2dfZ2VuX21vdl9pMzIoY3B1X2V4Y2x1c2l2ZV92YWwsIHRtcCk7CisgICAgc3RvcmVfcmVnKHMsIHJ0LCB0bXApOworICAgIGlmIChzaXplID09IDMpIHsKKyAgICAgICAgVENHdiB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHRtcDIsIGFkZHIsIDQpOworICAgICAgICB0bXAgPSBnZW5fbGQzMih0bXAyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihjcHVfZXhjbHVzaXZlX2hpZ2gsIHRtcCk7CisgICAgICAgIHN0b3JlX3JlZyhzLCBydDIsIHRtcCk7CisgICAgfQorICAgIHRjZ19nZW5fbW92X2kzMihjcHVfZXhjbHVzaXZlX2FkZHIsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBnZW5fY2xyZXgoRGlzYXNDb250ZXh0ICpzKQoreworICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X2V4Y2x1c2l2ZV9hZGRyLCAtMSk7Cit9CisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCitzdGF0aWMgdm9pZCBnZW5fc3RvcmVfZXhjbHVzaXZlKERpc2FzQ29udGV4dCAqcywgaW50IHJkLCBpbnQgcnQsIGludCBydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3YgYWRkciwgaW50IHNpemUpCit7CisgICAgdGNnX2dlbl9tb3ZfaTMyKGNwdV9leGNsdXNpdmVfdGVzdCwgYWRkcik7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfZXhjbHVzaXZlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICBzaXplIHwgKHJkIDw8IDQpIHwgKHJ0IDw8IDgpIHwgKHJ0MiA8PCAxMikpOworICAgIGdlbl9leGNlcHRpb25faW5zbihzLCA0LCBFWENQX1NUUkVYKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBnZW5fc3RvcmVfZXhjbHVzaXZlKERpc2FzQ29udGV4dCAqcywgaW50IHJkLCBpbnQgcnQsIGludCBydDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3YgYWRkciwgaW50IHNpemUpCit7CisgICAgVENHdiB0bXA7CisgICAgaW50IGRvbmVfbGFiZWw7CisgICAgaW50IGZhaWxfbGFiZWw7CisKKyAgICAvKiBpZiAoZW52LT5leGNsdXNpdmVfYWRkciA9PSBhZGRyICYmIGVudi0+ZXhjbHVzaXZlX3ZhbCA9PSBbYWRkcl0pIHsKKyAgICAgICAgIFthZGRyXSA9IHtSdH07CisgICAgICAgICB7UmR9ID0gMDsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAge1JkfSA9IDE7CisgICAgICAgfSAqLworICAgIGZhaWxfbGFiZWwgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgZG9uZV9sYWJlbCA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICB0Y2dfZ2VuX2JyY29uZF9pMzIoVENHX0NPTkRfTkUsIGFkZHIsIGNwdV9leGNsdXNpdmVfYWRkciwgZmFpbF9sYWJlbCk7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAwOgorICAgICAgICB0bXAgPSBnZW5fbGQ4dShhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB0bXAgPSBnZW5fbGQxNnUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICB0Y2dfZ2VuX2JyY29uZF9pMzIoVENHX0NPTkRfTkUsIHRtcCwgY3B1X2V4Y2x1c2l2ZV92YWwsIGZhaWxfbGFiZWwpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgaWYgKHNpemUgPT0gMykgeworICAgICAgICBUQ0d2IHRtcDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIodG1wMiwgYWRkciwgNCk7CisgICAgICAgIHRtcCA9IGdlbl9sZDMyKHRtcDIsIElTX1VTRVIocykpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRfaTMyKFRDR19DT05EX05FLCB0bXAsIGNwdV9leGNsdXNpdmVfaGlnaCwgZmFpbF9sYWJlbCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgfQorICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJ0KTsKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGdlbl9zdDgodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBnZW5fc3QxNih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgY2FzZSAzOgorICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAzKSB7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJ0Mik7CisgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgfQorICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X1JbcmRdLCAwKTsKKyAgICB0Y2dfZ2VuX2JyKGRvbmVfbGFiZWwpOworICAgIGdlbl9zZXRfbGFiZWwoZmFpbF9sYWJlbCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfUltyZF0sIDEpOworICAgIGdlbl9zZXRfbGFiZWwoZG9uZV9sYWJlbCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfZXhjbHVzaXZlX2FkZHIsIC0xKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaXNhc19hcm1faW5zbihDUFVBUk1TdGF0ZSAqIGVudiwgRGlzYXNDb250ZXh0ICpzKQoreworICAgIHVuc2lnbmVkIGludCBjb25kLCBpbnNuLCB2YWwsIG9wMSwgaSwgc2hpZnQsIHJtLCBycywgcm4sIHJkLCBzaDsKKyAgICBUQ0d2IHRtcDsKKyAgICBUQ0d2IHRtcDI7CisgICAgVENHdiB0bXAzOworICAgIFRDR3YgYWRkcjsKKyAgICBUQ0d2X2k2NCB0bXA2NDsKKworICAgIGluc24gPSBjcHVfbGRsX2NvZGUoZW52LCBzLT5wYyk7CisKKyAgICBzLT5wYyArPSA0OworCisgICAgLyogTSB2YXJpYW50cyBkbyBub3QgaW1wbGVtZW50IEFSTSBtb2RlLiAgKi8KKyAgICBpZiAoSVNfTShlbnYpKQorICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgY29uZCA9IGluc24gPj4gMjg7CisgICAgaWYgKGNvbmQgPT0gMHhmKXsKKyAgICAgICAgLyogSW4gQVJNdjMgYW5kIHY0IHRoZSBOViBjb25kaXRpb24gaXMgVU5QUkVESUNUQUJMRTsgd2UKKyAgICAgICAgICogY2hvb3NlIHRvIFVOREVGLiBJbiBBUk12NSBhbmQgYWJvdmUgdGhlIHNwYWNlIGlzIHVzZWQKKyAgICAgICAgICogZm9yIG1pc2NlbGxhbmVvdXMgdW5jb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBBUkNIKDUpOworCisgICAgICAgIC8qIFVuY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLiAgKi8KKyAgICAgICAgaWYgKCgoaW5zbiA+PiAyNSkgJiA3KSA9PSAxKSB7CisgICAgICAgICAgICAvKiBORU9OIERhdGEgcHJvY2Vzc2luZy4gICovCisgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfTkVPTikpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworCisgICAgICAgICAgICBpZiAoZGlzYXNfbmVvbl9kYXRhX2luc24oZW52LCBzLCBpbnNuKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKChpbnNuICYgMHgwZjEwMDAwMCkgPT0gMHgwNDAwMDAwMCkgeworICAgICAgICAgICAgLyogTkVPTiBsb2FkL3N0b3JlLiAgKi8KKyAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9ORU9OKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisKKyAgICAgICAgICAgIGlmIChkaXNhc19uZW9uX2xzX2luc24oZW52LCBzLCBpbnNuKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoaW5zbiAmIDB4MGYzMGYwMDApID09IDB4MDUxMGYwMDApIHx8CisgICAgICAgICAgICAoKGluc24gJiAweDBmMzBmMDEwKSA9PSAweDA3MTBmMDAwKSkgeworICAgICAgICAgICAgaWYgKChpbnNuICYgKDEgPDwgMjIpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogUExEVzsgdjdNUCAqLworICAgICAgICAgICAgICAgIGlmICghYXJtX2ZlYXR1cmUoZW52LCBBUk1fRkVBVFVSRV9WN01QKSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogT3RoZXJ3aXNlIFBMRDsgdjVURSsgKi8KKyAgICAgICAgICAgIEFSQ0goNVRFKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKChpbnNuICYgMHgwZjcwZjAwMCkgPT0gMHgwNDUwZjAwMCkgfHwKKyAgICAgICAgICAgICgoaW5zbiAmIDB4MGY3MGYwMTApID09IDB4MDY1MGYwMDApKSB7CisgICAgICAgICAgICBBUkNIKDcpOworICAgICAgICAgICAgcmV0dXJuOyAvKiBQTEk7IFY3ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoaW5zbiAmIDB4MGY3MDAwMDApID09IDB4MDQxMDAwMDApIHx8CisgICAgICAgICAgICAoKGluc24gJiAweDBmNzAwMDEwKSA9PSAweDA2MTAwMDAwKSkgeworICAgICAgICAgICAgaWYgKCFhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1Y3TVApKSB7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOyAvKiB2N01QOiBVbmFsbG9jYXRlZCBtZW1vcnkgaGludDogbXVzdCBOT1AgKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoaW5zbiAmIDB4MGZmZmZkZmYpID09IDB4MDEwMTAwMDApIHsKKyAgICAgICAgICAgIEFSQ0goNik7CisgICAgICAgICAgICAvKiBzZXRlbmQgKi8KKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgOSkpIHsKKyAgICAgICAgICAgICAgICAvKiBCRTggbW9kZSBub3QgaW1wbGVtZW50ZWQuICAqLworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmIDB4MGZmZmZmMDApID09IDB4MDU3ZmYwMDApIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKGluc24gPj4gNCkgJiAweGYpIHsKKyAgICAgICAgICAgIGNhc2UgMTogLyogY2xyZXggKi8KKyAgICAgICAgICAgICAgICBBUkNIKDZLKTsKKyAgICAgICAgICAgICAgICBnZW5fY2xyZXgocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSA0OiAvKiBkc2IgKi8KKyAgICAgICAgICAgIGNhc2UgNTogLyogZG1iICovCisgICAgICAgICAgICBjYXNlIDY6IC8qIGlzYiAqLworICAgICAgICAgICAgICAgIEFSQ0goNyk7CisgICAgICAgICAgICAgICAgLyogV2UgZG9uJ3QgZW11bGF0ZSBjYWNoZXMgc28gdGhlc2UgYXJlIGEgbm8tb3AuICAqLworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwZTVmZmZlMCkgPT0gMHgwODRkMDUwMCkgeworICAgICAgICAgICAgLyogc3JzICovCisgICAgICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIEFSQ0goNik7CisgICAgICAgICAgICBvcDEgPSAoaW5zbiAmIDB4MWYpOworICAgICAgICAgICAgYWRkciA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRtcCA9IHRjZ19jb25zdF9pMzIob3AxKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZ2V0X3IxM19iYW5rZWQoYWRkciwgY3B1X2VudiwgdG1wKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICBpID0gKGluc24gPj4gMjMpICYgMzsKKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgY2FzZSAwOiBvZmZzZXQgPSAtNDsgYnJlYWs7IC8qIERBICovCisgICAgICAgICAgICBjYXNlIDE6IG9mZnNldCA9IDA7IGJyZWFrOyAvKiBJQSAqLworICAgICAgICAgICAgY2FzZSAyOiBvZmZzZXQgPSAtODsgYnJlYWs7IC8qIERCICovCisgICAgICAgICAgICBjYXNlIDM6IG9mZnNldCA9IDQ7IGJyZWFrOyAvKiBJQiAqLworICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBvZmZzZXQpOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgMTQpOworICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCAwKTsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfY3B1X2ZpZWxkKHNwc3IpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCA0KTsKKyAgICAgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgMCk7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgIC8qIEJhc2Ugd3JpdGViYWNrLiAgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IG9mZnNldCA9IC04OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IG9mZnNldCA9IDQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogb2Zmc2V0ID0gLTQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogb2Zmc2V0ID0gMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHRtcCA9IHRjZ19jb25zdF9pMzIob3AxKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NldF9yMTNfYmFua2VkKGNwdV9lbnYsIHRtcCwgYWRkcik7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoKGluc24gJiAweDBlNTBmZmUwKSA9PSAweDA4MTAwYTAwKSB7CisgICAgICAgICAgICAvKiByZmUgKi8KKyAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICAgICAgaWYgKElTX1VTRVIocykpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgQVJDSCg2KTsKKyAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgIGkgPSAoaW5zbiA+PiAyMykgJiAzOworICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICBjYXNlIDA6IG9mZnNldCA9IC00OyBicmVhazsgLyogREEgKi8KKyAgICAgICAgICAgIGNhc2UgMTogb2Zmc2V0ID0gMDsgYnJlYWs7IC8qIElBICovCisgICAgICAgICAgICBjYXNlIDI6IG9mZnNldCA9IC04OyBicmVhazsgLyogREIgKi8KKyAgICAgICAgICAgIGNhc2UgMzogb2Zmc2V0ID0gNDsgYnJlYWs7IC8qIElCICovCisgICAgICAgICAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIG9mZnNldCk7CisgICAgICAgICAgICAvKiBMb2FkIFBDIGludG8gdG1wIGFuZCBDUFNSIGludG8gdG1wMi4gICovCisgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCAwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICB0bXAyID0gZ2VuX2xkMzIoYWRkciwgMCk7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgIC8qIEJhc2Ugd3JpdGViYWNrLiAgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IG9mZnNldCA9IC04OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IG9mZnNldCA9IDQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogb2Zmc2V0ID0gLTQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogb2Zmc2V0ID0gMDsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogYWJvcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgYWRkcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX3JmZShzLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwZTAwMDAwMCkgPT0gMHgwYTAwMDAwMCkgeworICAgICAgICAgICAgLyogYnJhbmNoIGxpbmsgYW5kIGNoYW5nZSB0byB0aHVtYiAoYmx4IDxvZmZzZXQ+KSAqLworICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisKKyAgICAgICAgICAgIHZhbCA9ICh1aW50MzJfdClzLT5wYzsKKyAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCB2YWwpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE0LCB0bXApOworICAgICAgICAgICAgLyogU2lnbi1leHRlbmQgdGhlIDI0LWJpdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIG9mZnNldCA9ICgoKGludDMyX3QpaW5zbikgPDwgOCkgPj4gODsKKyAgICAgICAgICAgIC8qIG9mZnNldCAqIDQgKyBiaXQyNCAqIDIgKyAodGh1bWIgYml0KSAqLworICAgICAgICAgICAgdmFsICs9IChvZmZzZXQgPDwgMikgfCAoKGluc24gPj4gMjMpICYgMikgfCAxOworICAgICAgICAgICAgLyogcGlwZWxpbmUgb2Zmc2V0ICovCisgICAgICAgICAgICB2YWwgKz0gNDsKKyAgICAgICAgICAgIC8qIHByb3RlY3RlZCBieSBBUkNIKDUpOyBhYm92ZSwgbmVhciB0aGUgc3RhcnQgb2YgdW5jb25kIGJsb2NrICovCisgICAgICAgICAgICBnZW5fYnhfaW0ocywgdmFsKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmIDB4MGUwMDBmMDApID09IDB4MGMwMDAxMDApIHsKKyAgICAgICAgICAgIGlmIChhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX0lXTU1YVCkpIHsKKyAgICAgICAgICAgICAgICAvKiBpV01NWHQgcmVnaXN0ZXIgdHJhbnNmZXIuICAqLworICAgICAgICAgICAgICAgIGlmIChlbnYtPmNwMTUuYzE1X2NwYXIgJiAoMSA8PCAxKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXNhc19pd21teHRfaW5zbihlbnYsIHMsIGluc24pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwZmUwMDAwMCkgPT0gMHgwYzQwMDAwMCkgeworICAgICAgICAgICAgLyogQ29wcm9jZXNzb3IgZG91YmxlIHJlZ2lzdGVyIHRyYW5zZmVyLiAgKi8KKyAgICAgICAgICAgIEFSQ0goNVRFKTsKKyAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmIDB4MGYwMDAwMTApID09IDB4MGUwMDAwMTApIHsKKyAgICAgICAgICAgIC8qIEFkZGl0aW9uYWwgY29wcm9jZXNzb3IgcmVnaXN0ZXIgdHJhbnNmZXIuICAqLworICAgICAgICAgICAgaWYgKCFkaXNhc19jb3Byb2NfaW5zbihlbnYsIHMsIGluc24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwZmYxMDAyMCkgPT0gMHgwMTAwMDAwMCkgeworICAgICAgICAgICAgdWludDMyX3QgbWFzazsKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbDsKKyAgICAgICAgICAgIC8qIGNwcyAocHJpdmlsZWdlZCkgKi8KKyAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG1hc2sgPSB2YWwgPSAwOworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxOSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDgpKQorICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IENQU1JfQTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDcpKQorICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IENQU1JfSTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDYpKQorICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IENQU1JfRjsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDE4KSkKKyAgICAgICAgICAgICAgICAgICAgdmFsIHw9IG1hc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDE3KSkgeworICAgICAgICAgICAgICAgIG1hc2sgfD0gQ1BTUl9NOworICAgICAgICAgICAgICAgIHZhbCB8PSAoaW5zbiAmIDB4MWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X3Bzcl9pbShzLCBtYXNrLCAwLCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICB9CisgICAgaWYgKGNvbmQgIT0gMHhlKSB7CisgICAgICAgIC8qIGlmIG5vdCBhbHdheXMgZXhlY3V0ZSwgd2UgZ2VuZXJhdGUgYSBjb25kaXRpb25hbCBqdW1wIHRvCisgICAgICAgICAgIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgcy0+Y29uZGxhYmVsID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICBnZW5fdGVzdF9jYyhjb25kIF4gMSwgcy0+Y29uZGxhYmVsKTsKKyAgICAgICAgcy0+Y29uZGptcCA9IDE7CisgICAgfQorICAgIGlmICgoaW5zbiAmIDB4MGY5MDAwMDApID09IDB4MDMwMDAwMDApIHsKKyAgICAgICAgaWYgKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwKSB7CisgICAgICAgICAgICBBUkNIKDZUMik7CisgICAgICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgICAgIHZhbCA9ICgoaW5zbiA+PiA0KSAmIDB4ZjAwMCkgfCAoaW5zbiAmIDB4ZmZmKTsKKyAgICAgICAgICAgIGlmICgoaW5zbiAmICgxIDw8IDIyKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIE1PVlcgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIE1PVlQgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfaTMyKHRtcCwgdG1wKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX29yaV9pMzIodG1wLCB0bXAsIHZhbCA8PCAxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKChpbnNuID4+IDEyKSAmIDB4ZikgIT0gMHhmKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIGlmICgoKGluc24gPj4gMTYpICYgMHhmKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ2VuX25vcF9oaW50KHMsIGluc24gJiAweGZmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQ1BTUiA9IGltbWVkaWF0ZSAqLworICAgICAgICAgICAgICAgIHZhbCA9IGluc24gJiAweGZmOworICAgICAgICAgICAgICAgIHNoaWZ0ID0gKChpbnNuID4+IDgpICYgMHhmKSAqIDI7CisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICB2YWwgPSAodmFsID4+IHNoaWZ0KSB8ICh2YWwgPDwgKDMyIC0gc2hpZnQpKTsKKyAgICAgICAgICAgICAgICBpID0gKChpbnNuICYgKDEgPDwgMjIpKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2VuX3NldF9wc3JfaW0ocywgbXNyX21hc2soZW52LCBzLCAoaW5zbiA+PiAxNikgJiAweGYsIGkpLCBpLCB2YWwpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwZjkwMDAwMCkgPT0gMHgwMTAwMDAwMAorICAgICAgICAgICAgICAgJiYgKGluc24gJiAweDAwMDAwMDkwKSAhPSAweDAwMDAwMDkwKSB7CisgICAgICAgIC8qIG1pc2NlbGxhbmVvdXMgaW5zdHJ1Y3Rpb25zICovCisgICAgICAgIG9wMSA9IChpbnNuID4+IDIxKSAmIDM7CisgICAgICAgIHNoID0gKGluc24gPj4gNCkgJiAweGY7CisgICAgICAgIHJtID0gaW5zbiAmIDB4ZjsKKyAgICAgICAgc3dpdGNoIChzaCkgeworICAgICAgICBjYXNlIDB4MDogLyogbW92ZSBwcm9ncmFtIHN0YXR1cyByZWdpc3RlciAqLworICAgICAgICAgICAgaWYgKG9wMSAmIDEpIHsKKyAgICAgICAgICAgICAgICAvKiBQU1IgPSByZWcgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgaSA9ICgob3AxICYgMikgIT0gMCk7CisgICAgICAgICAgICAgICAgaWYgKGdlbl9zZXRfcHNyKHMsIG1zcl9tYXNrKGVudiwgcywgKGluc24gPj4gMTYpICYgMHhmLCBpKSwgaSwgdG1wKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiByZWcgPSBQU1IgKi8KKyAgICAgICAgICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgICAgICAgICBpZiAob3AxICYgMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoc3Bzcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Nwc3JfcmVhZCh0bXAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE6CisgICAgICAgICAgICBpZiAob3AxID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBicmFuY2gvZXhjaGFuZ2UgdGh1bWIgKGJ4KS4gICovCisgICAgICAgICAgICAgICAgQVJDSCg0VCk7CisgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgIGdlbl9ieChzLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcDEgPT0gMykgeworICAgICAgICAgICAgICAgIC8qIGNseiAqLworICAgICAgICAgICAgICAgIEFSQ0goNSk7CisgICAgICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfY2x6KHRtcCwgdG1wKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjoKKyAgICAgICAgICAgIGlmIChvcDEgPT0gMSkgeworICAgICAgICAgICAgICAgIEFSQ0goNUopOyAvKiBieGogKi8KKyAgICAgICAgICAgICAgICAvKiBUcml2aWFsIGltcGxlbWVudGF0aW9uIGVxdWl2YWxlbnQgdG8gYnguICAqLworICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICBnZW5fYngocywgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzOgorICAgICAgICAgICAgaWYgKG9wMSAhPSAxKQorICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisKKyAgICAgICAgICAgIEFSQ0goNSk7CisgICAgICAgICAgICAvKiBicmFuY2ggbGluay9leGNoYW5nZSB0aHVtYiAoYmx4KSAqLworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgdG1wMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wMiwgcy0+cGMpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE0LCB0bXAyKTsKKyAgICAgICAgICAgIGdlbl9ieChzLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg1OiAvKiBzYXR1cmF0aW5nIGFkZC9zdWJ0cmFjdCAqLworICAgICAgICAgICAgQVJDSCg1VEUpOworICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICBpZiAob3AxICYgMikKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RvdWJsZV9zYXR1cmF0ZSh0bXAyLCBjcHVfZW52LCB0bXAyKTsKKyAgICAgICAgICAgIGlmIChvcDEgJiAxKQorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3ViX3NhdHVyYXRlKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9zYXR1cmF0ZSh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBpZiAob3AxID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBia3B0ICovCisgICAgICAgICAgICAgICAgQVJDSCg1KTsKKyAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uX2luc24ocywgNCwgRVhDUF9CS1BUKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3AxID09IDMpIHsKKyAgICAgICAgICAgICAgICAvKiBzbWkvc21jICovCisgICAgICAgICAgICAgICAgaWYgKCEoZW52LT5jcDE1LmMwX2MyWzRdICYgMHhmMDAwKSB8fCBJU19VU0VSKHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuX3NtYyhlbnYsIHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDg6IC8qIHNpZ25lZCBtdWx0aXBseSAqLworICAgICAgICBjYXNlIDB4YToKKyAgICAgICAgY2FzZSAweGM6CisgICAgICAgIGNhc2UgMHhlOgorICAgICAgICAgICAgQVJDSCg1VEUpOworICAgICAgICAgICAgcnMgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgICAgICBpZiAob3AxID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiAoMzIgKiAxNikgPj4gMTYgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICBpZiAoc2ggJiA0KQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKHRtcDIsIHRtcDIsIDE2KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdlbl9zeHRoKHRtcDIpOworICAgICAgICAgICAgICAgIHRtcDY0ID0gZ2VuX211bHNfaTY0X2kzMih0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodG1wNjQsIHRtcDY0LCAxNik7CisgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIHRtcDY0KTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0bXA2NCk7CisgICAgICAgICAgICAgICAgaWYgKChzaCAmIDIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRfc2V0cSh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIDE2ICogMTYgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICBnZW5fbXVseHkodG1wLCB0bXAyLCBzaCAmIDIsIHNoICYgNCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KHRtcDY0LCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICBnZW5fYWRkcShzLCB0bXA2NCwgcm4sIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlcV9yZWcocywgcm4sIHJkLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDY0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAob3AxID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9zZXRxKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKChpbnNuICYgMHgwZTAwMDAwMCkgPT0gMCAmJgorICAgICAgICAgICAgICAgIChpbnNuICYgMHgwMDAwMDA5MCkgIT0gMHg5MCkgfHwKKyAgICAgICAgICAgICAgICgoaW5zbiAmIDB4MGUwMDAwMDApID09ICgxIDw8IDI1KSkpIHsKKyAgICAgICAgaW50IHNldF9jYywgbG9naWNfY2MsIHNoaWZ0b3A7CisKKyAgICAgICAgb3AxID0gKGluc24gPj4gMjEpICYgMHhmOworICAgICAgICBzZXRfY2MgPSAoaW5zbiA+PiAyMCkgJiAxOworICAgICAgICBsb2dpY19jYyA9IHRhYmxlX2xvZ2ljX2NjW29wMV0gJiBzZXRfY2M7CisKKyAgICAgICAgLyogZGF0YSBwcm9jZXNzaW5nIGluc3RydWN0aW9uICovCisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjUpKSB7CisgICAgICAgICAgICAvKiBpbW1lZGlhdGUgb3BlcmFuZCAqLworICAgICAgICAgICAgdmFsID0gaW5zbiAmIDB4ZmY7CisgICAgICAgICAgICBzaGlmdCA9ICgoaW5zbiA+PiA4KSAmIDB4ZikgKiAyOworICAgICAgICAgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA+PiBzaGlmdCkgfCAodmFsIDw8ICgzMiAtIHNoaWZ0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAyLCB2YWwpOworICAgICAgICAgICAgaWYgKGxvZ2ljX2NjICYmIHNoaWZ0KSB7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9DRl9iaXQzMSh0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHJlZ2lzdGVyICovCisgICAgICAgICAgICBybSA9IChpbnNuKSAmIDB4ZjsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICBzaGlmdG9wID0gKGluc24gPj4gNSkgJiAzOworICAgICAgICAgICAgaWYgKCEoaW5zbiAmICgxIDw8IDQpKSkgeworICAgICAgICAgICAgICAgIHNoaWZ0ID0gKGluc24gPj4gNykgJiAweDFmOworICAgICAgICAgICAgICAgIGdlbl9hcm1fc2hpZnRfaW0odG1wMiwgc2hpZnRvcCwgc2hpZnQsIGxvZ2ljX2NjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnMgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBycyk7CisgICAgICAgICAgICAgICAgZ2VuX2FybV9zaGlmdF9yZWcodG1wMiwgc2hpZnRvcCwgdG1wLCBsb2dpY19jYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9wMSAhPSAweDBmICYmIG9wMSAhPSAweDBkKSB7CisgICAgICAgICAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcCk7CisgICAgICAgIH0KKyAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgIHN3aXRjaChvcDEpIHsKKyAgICAgICAgY2FzZSAweDAwOgorICAgICAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGlmIChsb2dpY19jYykgeworICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxOgorICAgICAgICAgICAgdGNnX2dlbl94b3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGlmIChsb2dpY19jYykgeworICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAyOgorICAgICAgICAgICAgaWYgKHNldF9jYyAmJiByZCA9PSAxNSkgeworICAgICAgICAgICAgICAgIC8qIFNVQlMgcjE1LCAuLi4gaXMgdXNlZCBmb3IgZXhjZXB0aW9uIHJldHVybi4gICovCisgICAgICAgICAgICAgICAgaWYgKElTX1VTRVIocykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbl9yZXR1cm4ocywgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9jYykgeworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgaWYgKHNldF9jYykgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3ViX2NjKHRtcCwgY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHRtcCwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3JlZ19ieChlbnYsIHMsIHJkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgIGlmIChzZXRfY2MpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWdfYngoZW52LCBzLCByZCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDU6CisgICAgICAgICAgICBpZiAoc2V0X2NjKSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGNfY2ModG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fYWRkX2NhcnJ5KHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3JlZ19ieChlbnYsIHMsIHJkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNjoKKyAgICAgICAgICAgIGlmIChzZXRfY2MpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NiY19jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9zdWJfY2FycnkodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA3OgorICAgICAgICAgICAgaWYgKHNldF9jYykgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2JjX2NjKHRtcCwgY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX3N1Yl9jYXJyeSh0bXAsIHRtcDIsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWdfYngoZW52LCBzLCByZCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDg6CisgICAgICAgICAgICBpZiAoc2V0X2NjKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgICAgaWYgKHNldF9jYykgeworICAgICAgICAgICAgICAgIHRjZ19nZW5feG9yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgZ2VuX2xvZ2ljX0NDKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYToKKyAgICAgICAgICAgIGlmIChzZXRfY2MpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYjoKKyAgICAgICAgICAgIGlmIChzZXRfY2MpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwYzoKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGlmIChsb2dpY19jYykgeworICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBkOgorICAgICAgICAgICAgaWYgKGxvZ2ljX2NjICYmIHJkID09IDE1KSB7CisgICAgICAgICAgICAgICAgLyogTU9WUyByMTUsIC4uLiBpcyB1c2VkIGZvciBleGNlcHRpb24gcmV0dXJuLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb25fcmV0dXJuKHMsIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobG9naWNfY2MpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xvZ2ljX0NDKHRtcDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZV9yZWdfYngoZW52LCBzLCByZCwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDBlOgorICAgICAgICAgICAgdGNnX2dlbl9hbmRjX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBpZiAobG9naWNfY2MpIHsKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3JlZ19ieChlbnYsIHMsIHJkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgMHgwZjoKKyAgICAgICAgICAgIHRjZ19nZW5fbm90X2kzMih0bXAyLCB0bXAyKTsKKyAgICAgICAgICAgIGlmIChsb2dpY19jYykgeworICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0b3JlX3JlZ19ieChlbnYsIHMsIHJkLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChvcDEgIT0gMHgwZiAmJiBvcDEgIT0gMHgwZCkgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBvdGhlciBpbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgb3AxID0gKGluc24gPj4gMjQpICYgMHhmOworICAgICAgICBzd2l0Y2gob3AxKSB7CisgICAgICAgIGNhc2UgMHgwOgorICAgICAgICBjYXNlIDB4MToKKyAgICAgICAgICAgIC8qIG11bHRpcGxpZXMsIGV4dHJhIGxvYWQvc3RvcmVzICovCisgICAgICAgICAgICBzaCA9IChpbnNuID4+IDUpICYgMzsKKyAgICAgICAgICAgIGlmIChzaCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSAweDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgICAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICAgICAgICAgICAgICBycyA9IChpbnNuID4+IDgpICYgMHhmOworICAgICAgICAgICAgICAgICAgICBybSA9IChpbnNuKSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAgICAgb3AxID0gKGluc24gPj4gMjApICYgMHhmOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBtdWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX211bF9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IChtbHMpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDSCg2VDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHRtcCwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDY0IGJpdCBtdWwgZG91YmxlIGFjY3VtdWxhdGUgKFVNQUFMKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgQVJDSCg2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXA2NCA9IGdlbl9tdWx1X2k2NF9pMzIodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9hZGRxX2xvKHMsIHRtcDY0LCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fYWRkcV9sbyhzLCB0bXA2NCwgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlcV9yZWcocywgcm4sIHJkLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA4OiBjYXNlIDk6IGNhc2UgMTA6IGNhc2UgMTE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IGNhc2UgMTM6IGNhc2UgMTQ6IGNhc2UgMTU6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NCBiaXQgbXVsOiBVTVVMTCwgVU1MQUwsIFNNVUxMLCBTTUxBTC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZ2VuX211bHNfaTY0X2kzMih0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXA2NCA9IGdlbl9tdWx1X2k2NF9pMzIodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKSB7IC8qIG11bHQgYWNjdW11bGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9hZGRxKHMsIHRtcDY0LCBybiwgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbG9naWNxX2NjKHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdG9yZXFfcmVnKHMsIHJuLCByZCwgdG1wNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIGV4Y2x1c2l2ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3AxID0gKGluc24gPj4gMjEpICYgMHgzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNIKDZLKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNIKDYpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IHRjZ190ZW1wX2xvY2FsX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfcmVnX3ZhcihzLCBhZGRyLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBsZHJleCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbG9hZF9leGNsdXNpdmUocywgcmQsIDE1LCBhZGRyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBsZHJleGQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZXhjbHVzaXZlKHMsIHJkLCByZCArIDEsIGFkZHIsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IC8qIGxkcmV4YiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbG9hZF9leGNsdXNpdmUocywgcmQsIDE1LCBhZGRyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBsZHJleGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZXhjbHVzaXZlKHMsIHJkLCAxNSwgYWRkciwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBybSA9IGluc24gJiAweGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6ICAvKiAgc3RyZXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2V4Y2x1c2l2ZShzLCByZCwgcm0sIDE1LCBhZGRyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiAgc3RyZXhkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9leGNsdXNpdmUocywgcmQsIHJtLCBybSArIDEsIGFkZHIsIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IC8qICBzdHJleGIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2V4Y2x1c2l2ZShzLCByZCwgcm0sIDE1LCBhZGRyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBzdHJleGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2V4Y2x1c2l2ZShzLCByZCwgcm0sIDE1LCBhZGRyLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKGFkZHIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogU1dQIGluc3RydWN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBybSA9IChpbnNuKSAmIDB4ZjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogPz8/IFRoaXMgaXMgbm90IHJlYWxseSBhdG9taWMuICBIb3dldmVyIHdlIGtub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlIG5ldmVyIGhhdmUgbXVsdGlwbGUgQ1BVcyBydW5uaW5nIGluIHBhcmFsbGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gaXQgaXMgZ29vZCBlbm91Z2guICAqLworICAgICAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGdlbl9sZDh1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdDgodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBhZGRyZXNzX29mZnNldDsKKyAgICAgICAgICAgICAgICBpbnQgbG9hZDsKKyAgICAgICAgICAgICAgICAvKiBNaXNjIGxvYWQvc3RvcmUgKi8KKyAgICAgICAgICAgICAgICBybiA9IChpbnNuID4+IDE2KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICByZCA9IChpbnNuID4+IDEyKSAmIDB4ZjsKKyAgICAgICAgICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjQpKQorICAgICAgICAgICAgICAgICAgICBnZW5fYWRkX2RhdGFoX29mZnNldChzLCBpbnNuLCAwLCBhZGRyKTsKKyAgICAgICAgICAgICAgICBhZGRyZXNzX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkMTZ1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDhzKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDE2cyhhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvYWQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2ggJiAyKSB7CisgICAgICAgICAgICAgICAgICAgIEFSQ0goNVRFKTsKKyAgICAgICAgICAgICAgICAgICAgLyogZG91Ymxld29yZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc2ggJiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkMzIoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkMzIoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzc19vZmZzZXQgPSAtNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzdG9yZSAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdDE2KHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgIGxvYWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBQZXJmb3JtIGJhc2Ugd3JpdGViYWNrIGJlZm9yZSB0aGUgbG9hZGVkIHZhbHVlIHRvCisgICAgICAgICAgICAgICAgICAgZW5zdXJlIGNvcnJlY3QgYmVoYXZpb3Igd2l0aCBvdmVybGFwcGluZyBpbmRleCByZWdpc3RlcnMuCisgICAgICAgICAgICAgICAgICAgbGRyZCB3aXRoIGJhc2Ugd3JpdGViYWNrIGlzIGlzIHVuZGVmaW5lZCBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBhbmQgaW5kZXggcmVnaXN0ZXJzIG92ZXJsYXAuICAqLworICAgICAgICAgICAgICAgIGlmICghKGluc24gJiAoMSA8PCAyNCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl9hZGRfZGF0YWhfb2Zmc2V0KHMsIGluc24sIGFkZHJlc3Nfb2Zmc2V0LCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCBhZGRyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc24gJiAoMSA8PCAyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3Nfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBhZGRyZXNzX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgYWRkcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb2FkKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHRoZSBsb2FkLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NDoKKyAgICAgICAgY2FzZSAweDU6CisgICAgICAgICAgICBnb3RvIGRvX2xkc3Q7CisgICAgICAgIGNhc2UgMHg2OgorICAgICAgICBjYXNlIDB4NzoKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNCkpIHsKKyAgICAgICAgICAgICAgICBBUkNIKDYpOworICAgICAgICAgICAgICAgIC8qIEFybXY2IE1lZGlhIGluc3RydWN0aW9ucy4gICovCisgICAgICAgICAgICAgICAgcm0gPSBpbnNuICYgMHhmOworICAgICAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICAgICAgICAgIHJkID0gKGluc24gPj4gMTIpICYgMHhmOworICAgICAgICAgICAgICAgIHJzID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgICAgICAgICAgc3dpdGNoICgoaW5zbiA+PiAyMykgJiAzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBQYXJhbGxlbCBhZGQvc3VidHJhY3QuICAqLworICAgICAgICAgICAgICAgICAgICBvcDEgPSAoaW5zbiA+PiAyMCkgJiA3OworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgIHNoID0gKGluc24gPj4gNSkgJiA3OworICAgICAgICAgICAgICAgICAgICBpZiAoKG9wMSAmIDMpID09IDAgfHwgc2ggPT0gNSB8fCBzaCA9PSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJtX3BhcmFsbGVsX2FkZHN1YihvcDEsIHNoLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5zbiAmIDB4MDA3MDAwMjApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhbGZ3b3JkIHBhY2suICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gKGluc24gPj4gNykgJiAweDFmOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBraHRiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0bXAyLCB0bXAyLCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0bXAsIHRtcCwgMHhmZmZmMDAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfaTMyKHRtcDIsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwa2hidCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0bXAyLCB0bXAyLCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfaTMyKHRtcCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcDIsIHRtcDIsIDB4ZmZmZjAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9vcl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGluc24gJiAweDAwMjAwMDIwKSA9PSAweDAwMjAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBbdXNdc2F0ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnNuID4+IDcpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAzMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKHRtcCwgdG1wLCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodG1wLCB0bXAsIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNoID0gKGluc24gPj4gMTYpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKHNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3VzYXQodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NzYXQodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGluc24gJiAweDAwMzAwZmUwKSA9PSAweDAwMjAwZjIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBbdXNdc2F0MTYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoID0gKGluc24gPj4gMTYpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKHNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3VzYXQxNih0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3NhdDE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwMDcwMGZlMCkgPT0gMHgwMDAwMGZhMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VsZWN0IGJ5dGVzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAzID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9sZF9pMzIodG1wMywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIEdFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NlbF9mbGFncyh0bXAsIHRtcDMsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpbnNuICYgMHgwMDAwMDNlMCkgPT0gMHgwMDAwMDA2MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW5zbiA+PiAxMCkgJiAzOworICAgICAgICAgICAgICAgICAgICAgICAgLyogPz8/IEluIG1hbnkgY2FzZXMgaXQncyBub3QgbmVjZXNzYXJ5IHRvIGRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgYSBzaGlmdCBpcyBzdWZmaWNpZW50LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcm90cmlfaTMyKHRtcCwgdG1wLCBzaGlmdCAqIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3AxID0gKGluc24gPj4gMjApICYgNzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGdlbl9zeHRiMTYodG1wKTsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiBnZW5fc3h0Yih0bXApOyAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogZ2VuX3N4dGgodG1wKTsgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IGdlbl91eHRiMTYodG1wKTsgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiBnZW5fdXh0Yih0bXApOyAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzogZ2VuX3V4dGgodG1wKTsgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOyBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm4gIT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgob3AxICYgMykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fYWRkMTYodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGluc24gJiAweDAwM2YwZjYwKSA9PSAweDAwM2YwZjIwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fcmV2c2godG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNIKDZUMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcmJpdCh0bXAsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fcmV2MTYodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYnN3YXAzMl9pMzIodG1wLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogTXVsdGlwbGllcyAoVHlwZSAzKS4gICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpZ25lZCBtdWx0aXBseSBtb3N0IHNpZ25pZmljYW50IFthY2N1bXVsYXRlXS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTTU1VTCwgU01NTEEsIFNNTUxTKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wNjQgPSBnZW5fbXVsc19pNjRfaTMyKHRtcCwgdG1wMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZCAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZ2VuX3N1YnFfbXN3KHRtcDY0LCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZ2VuX2FkZHFfbXN3KHRtcDY0LCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTY0KHRtcDY0LCB0bXA2NCwgMHg4MDAwMDAwMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2k2NCh0bXA2NCwgdG1wNjQsIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMih0bXAsIHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N3YXBfaGFsZih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zbXVsX2R1YWwodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHN1YnRyYWN0aW9uIGNhbm5vdCBvdmVyZmxvdy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGFkZGl0aW9uIGNhbm5vdCBvdmVyZmxvdyAzMiBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGhvd2V2ZXIgaXQgbWF5IG92ZXJmbG93IGNvbnNpZGVyZWQgYXMgYSBzaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvcGVyYXRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBzZXQgdGhlIFEgZmxhZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9zZXRxKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbWxhbGQsIHNtbHNsZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0X2kzMl9pNjQodG1wNjQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fYWRkcShzLCB0bXA2NCwgcmQsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVxX3JlZyhzLCByZCwgcm4sIHRtcDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0bXA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNtdWFkLCBzbXVzZCwgc21sYWQsIHNtbHNkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJkICE9IDE1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9zZXRxKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgb3AxID0gKChpbnNuID4+IDE3KSAmIDB4MzgpIHwgKChpbnNuID4+IDUpICYgNyk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLyogVW5zaWduZWQgc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0goNik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl91c2FkOCh0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZCAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjA6IGNhc2UgMHgyNDogY2FzZSAweDI4OiBjYXNlIDB4MmM6CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXRmaWVsZCBpbnNlcnQvY2xlYXIuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgQVJDSCg2VDIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW5zbiA+PiA3KSAmIDB4MWY7CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gKGluc24gPj4gMTYpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMSAtIHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJtID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9iZmkodG1wLCB0bXAyLCB0bXAsIHNoaWZ0LCAoMXUgPDwgaSkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTI6IGNhc2UgMHgxNjogY2FzZSAweDFhOiBjYXNlIDB4MWU6IC8qIHNiZnggKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDMyOiBjYXNlIDB4MzY6IGNhc2UgMHgzYTogY2FzZSAweDNlOiAvKiB1YmZ4ICovCisgICAgICAgICAgICAgICAgICAgICAgICBBUkNIKDZUMik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IChpbnNuID4+IDcpICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoKGluc24gPj4gMTYpICYgMHgxZikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICsgaSA+IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AxICYgMHgyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fdWJmeCh0bXAsIHNoaWZ0LCAoMXUgPDwgaSkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fc2JmeCh0bXAsIHNoaWZ0LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGRvX2xkc3Q6CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgdW5kZWZpbmVkIGV4dGVuc2lvbiBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgICAqIHBlciB0aGUgQVJNIEJpYmxlIElFOgorICAgICAgICAgICAgICogeHh4eCAwMTExIDExMTEgeHh4eCAgeHh4eCB4eHh4IDExMTEgeHh4eAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzaCA9ICgweGYgPDwgMjApIHwgKDB4ZiA8PCA0KTsKKyAgICAgICAgICAgIGlmIChvcDEgPT0gMHg3ICYmICgoaW5zbiAmIHNoKSA9PSBzaCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbG9hZC9zdG9yZSBieXRlL3dvcmQgKi8KKyAgICAgICAgICAgIHJuID0gKGluc24gPj4gMTYpICYgMHhmOworICAgICAgICAgICAgcmQgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgaSA9IChJU19VU0VSKHMpIHx8IChpbnNuICYgMHgwMTIwMDAwMCkgPT0gMHgwMDIwMDAwMCk7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkKKyAgICAgICAgICAgICAgICBnZW5fYWRkX2RhdGFfb2Zmc2V0KHMsIGluc24sIHRtcDIpOworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAvKiBsb2FkICovCisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkOHUodG1wMiwgaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gZ2VuX2xkMzIodG1wMiwgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBzdG9yZSAqLworICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIyKSkKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0OCh0bXAsIHRtcDIsIGkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCB0bXAyLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGluc24gJiAoMSA8PCAyNCkpKSB7CisgICAgICAgICAgICAgICAgZ2VuX2FkZF9kYXRhX29mZnNldChzLCBpbnNuLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnNuICYgKDEgPDwgMjEpKSB7CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCB0bXAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgIC8qIENvbXBsZXRlIHRoZSBsb2FkLiAgKi8KKyAgICAgICAgICAgICAgICBzdG9yZV9yZWdfZnJvbV9sb2FkKGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA4OgorICAgICAgICBjYXNlIDB4MDk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGosIG4sIHVzZXIsIGxvYWRlZF9iYXNlOworICAgICAgICAgICAgICAgIFRDR3YgbG9hZGVkX3ZhcjsKKyAgICAgICAgICAgICAgICAvKiBsb2FkL3N0b3JlIG11bHRpcGxlIHdvcmRzICovCisgICAgICAgICAgICAgICAgLyogWFhYOiBzdG9yZSBjb3JyZWN0IGJhc2UgaWYgd3JpdGUgYmFjayAqLworICAgICAgICAgICAgICAgIHVzZXIgPSAwOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOyAvKiBvbmx5IHVzYWJsZSBpbiBzdXBlcnZpc29yIG1vZGUgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAoMSA8PCAxNSkpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICB0bXAzID0gdGNnX2NvbnN0X2kzMig0KTsKKworICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgdG90YWwgc2l6ZSAqLworICAgICAgICAgICAgICAgIGxvYWRlZF9iYXNlID0gMDsKKyAgICAgICAgICAgICAgICBUQ0dWX1VOVVNFRChsb2FkZWRfdmFyKTsKKyAgICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoaT0wO2k8MTY7aSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFhYWDogdGVzdCBpbnZhbGlkIG4gPT0gMCBjYXNlID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlIGluY3JlbWVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKGFkZHIsIGFkZHIsIHRtcDMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUgZGVjcmVtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIC0obiAqIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3QgZGVjcmVtZW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtKChuIC0gMSkgKiA0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgZm9yKGk9MDtpPDE2O2krKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMihpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zZXRfdXNlcl9yZWcoY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IHJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZF92YXIgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZF9iYXNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWdfZnJvbV9sb2FkKGVudiwgcywgaSwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlOiByMTUgPSBQQyArIDggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gKGxvbmcpcy0+cGMgKyA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfY29uc3RfaTMyKGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2dldF91c2VyX3JlZyh0bXAsIGNwdV9lbnYsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIG5lZWQgdG8gYWRkIGFmdGVyIHRoZSBsYXN0IHRyYW5zZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBiYWNrICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pMzIoYWRkciwgYWRkciwgdG1wMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZSBkZWNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIC0oKG4gLSAxKSAqIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9zdCBkZWNyZW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIC0obiAqIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIGFkZHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAzKTsKKyAgICAgICAgICAgICAgICBpZiAobG9hZGVkX2Jhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCBsb2FkZWRfdmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgKDEgPDwgMjIpKSAmJiAhdXNlcikgeworICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIENQU1IgZnJvbSBTUFNSLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoc3Bzcik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zZXRfY3Bzcih0bXAsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICBzLT5pc19qbXAgPSBESVNBU19VUERBVEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhhOgorICAgICAgICBjYXNlIDB4YjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDsKKworICAgICAgICAgICAgICAgIC8qIGJyYW5jaCAoYW5kIGxpbmspICovCisgICAgICAgICAgICAgICAgdmFsID0gKGludDMyX3Qpcy0+cGM7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcCwgdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE0LCB0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoKChpbnQzMl90KWluc24gPDwgOCkgPj4gOCk7CisgICAgICAgICAgICAgICAgdmFsICs9IChvZmZzZXQgPDwgMikgKyA0OworICAgICAgICAgICAgICAgIGdlbl9qbXAocywgdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YzoKKyAgICAgICAgY2FzZSAweGQ6CisgICAgICAgIGNhc2UgMHhlOgorICAgICAgICAgICAgLyogQ29wcm9jZXNzb3IuICAqLworICAgICAgICAgICAgaWYgKGRpc2FzX2NvcHJvY19pbnNuKGVudiwgcywgaW5zbikpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmOgorICAgICAgICAgICAgLyogc3dpICovCisgICAgICAgICAgICBnZW5fc2V0X3BjX2ltKHMtPnBjKTsKKyAgICAgICAgICAgIHMtPmlzX2ptcCA9IERJU0FTX1NXSTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBpbGxlZ2FsX29wOgorICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbl9pbnNuKHMsIDQsIEVYQ1BfVURFRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFRodW1iLTIgbG9naWNhbCBvcC4gICovCitzdGF0aWMgaW50Cit0aHVtYjJfbG9naWNfb3AoaW50IG9wKQoreworICAgIHJldHVybiAob3AgPCA4KTsKK30KKworLyogR2VuZXJhdGUgY29kZSBmb3IgYSBUaHVtYi0yIGRhdGEgcHJvY2Vzc2luZyBvcGVyYXRpb24uICBJZiBDT05EUyBpcyBub256ZXJvCisgICB0aGVuIHNldCBjb25kaXRpb24gY29kZSBmbGFncyBiYXNlZCBvbiB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24uCisgICBJZiBTSElGVEVSX09VVCBpcyBub256ZXJvIHRoZW4gc2V0IHRoZSBjYXJyeSBmbGFnIGZvciBsb2dpY2FsIG9wZXJhdGlvbnMKKyAgIHRvIHRoZSBoaWdoIGJpdCBvZiBUMS4KKyAgIFJldHVybnMgemVybyBpZiB0aGUgb3Bjb2RlIGlzIHZhbGlkLiAgKi8KKworc3RhdGljIGludAorZ2VuX3RodW1iMl9kYXRhX29wKERpc2FzQ29udGV4dCAqcywgaW50IG9wLCBpbnQgY29uZHMsIHVpbnQzMl90IHNoaWZ0ZXJfb3V0LCBUQ0d2IHQwLCBUQ0d2IHQxKQoreworICAgIGludCBsb2dpY19jYzsKKworICAgIGxvZ2ljX2NjID0gMDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSAwOiAvKiBhbmQgKi8KKyAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICBsb2dpY19jYyA9IGNvbmRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIGJpYyAqLworICAgICAgICB0Y2dfZ2VuX2FuZGNfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICBsb2dpY19jYyA9IGNvbmRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIG9yciAqLworICAgICAgICB0Y2dfZ2VuX29yX2kzMih0MCwgdDAsIHQxKTsKKyAgICAgICAgbG9naWNfY2MgPSBjb25kczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiBvcm4gKi8KKyAgICAgICAgdGNnX2dlbl9vcmNfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICBsb2dpY19jYyA9IGNvbmRzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIGVvciAqLworICAgICAgICB0Y2dfZ2VuX3hvcl9pMzIodDAsIHQwLCB0MSk7CisgICAgICAgIGxvZ2ljX2NjID0gY29uZHM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODogLyogYWRkICovCisgICAgICAgIGlmIChjb25kcykKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkX2NjKHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pMzIodDAsIHQwLCB0MSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6IC8qIGFkYyAqLworICAgICAgICBpZiAoY29uZHMpCisgICAgICAgICAgICBnZW5faGVscGVyX2FkY19jYyh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuX2FkYyh0MCwgdDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDExOiAvKiBzYmMgKi8KKyAgICAgICAgaWYgKGNvbmRzKQorICAgICAgICAgICAgZ2VuX2hlbHBlcl9zYmNfY2ModDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9zdWJfY2FycnkodDAsIHQwLCB0MSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IC8qIHN1YiAqLworICAgICAgICBpZiAoY29uZHMpCisgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OiAvKiByc2IgKi8KKyAgICAgICAgaWYgKGNvbmRzKQorICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJfY2ModDAsIGNwdV9lbnYsIHQxLCB0MCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX2kzMih0MCwgdDEsIHQwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogLyogNSwgNiwgNywgOSwgMTIsIDE1LiAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGxvZ2ljX2NjKSB7CisgICAgICAgIGdlbl9sb2dpY19DQyh0MCk7CisgICAgICAgIGlmIChzaGlmdGVyX291dCkKKyAgICAgICAgICAgIGdlbl9zZXRfQ0ZfYml0MzEodDEpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogVHJhbnNsYXRlIGEgMzItYml0IHRodW1iIGluc3RydWN0aW9uLiAgUmV0dXJucyBub256ZXJvIGlmIHRoZSBpbnN0cnVjdGlvbgorICAgaXMgbm90IGxlZ2FsLiAgKi8KK3N0YXRpYyBpbnQgZGlzYXNfdGh1bWIyX2luc24oQ1BVQVJNU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCB1aW50MTZfdCBpbnNuX2h3MSkKK3sKKyAgICB1aW50MzJfdCBpbnNuLCBpbW0sIHNoaWZ0LCBvZmZzZXQ7CisgICAgdWludDMyX3QgcmQsIHJuLCBybSwgcnM7CisgICAgVENHdiB0bXA7CisgICAgVENHdiB0bXAyOworICAgIFRDR3YgdG1wMzsKKyAgICBUQ0d2IGFkZHI7CisgICAgVENHdl9pNjQgdG1wNjQ7CisgICAgaW50IG9wOworICAgIGludCBzaGlmdG9wOworICAgIGludCBjb25kczsKKyAgICBpbnQgbG9naWNfY2M7CisKKyAgICBpZiAoIShhcm1fZmVhdHVyZShlbnYsIEFSTV9GRUFUVVJFX1RIVU1CMikKKyAgICAgICAgICB8fCBhcm1fZmVhdHVyZSAoZW52LCBBUk1fRkVBVFVSRV9NKSkpIHsKKyAgICAgICAgLyogVGh1bWItMSBjb3JlcyBtYXkgbmVlZCB0byB0cmVhdCBibCBhbmQgYmx4IGFzIGEgcGFpciBvZgorICAgICAgICAgICAxNi1iaXQgaW5zdHJ1Y3Rpb25zIHRvIGdldCBjb3JyZWN0IHByZWZldGNoIGFib3J0IGJlaGF2aW9yLiAgKi8KKyAgICAgICAgaW5zbiA9IGluc25faHcxOworICAgICAgICBpZiAoKGluc24gJiAoMSA8PCAxMikpID09IDApIHsKKyAgICAgICAgICAgIEFSQ0goNSk7CisgICAgICAgICAgICAvKiBTZWNvbmQgaGFsZiBvZiBibHguICAqLworICAgICAgICAgICAgb2Zmc2V0ID0gKChpbnNuICYgMHg3ZmYpIDw8IDEpOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgMTQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMih0bXAsIHRtcCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wLCB0bXAsIDB4ZmZmZmZmZmMpOworCisgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAyLCBzLT5wYyB8IDEpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE0LCB0bXAyKTsKKyAgICAgICAgICAgIGdlbl9ieChzLCB0bXApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxMSkpIHsKKyAgICAgICAgICAgIC8qIFNlY29uZCBoYWxmIG9mIGJsLiAgKi8KKyAgICAgICAgICAgIG9mZnNldCA9ICgoaW5zbiAmIDB4N2ZmKSA8PCAxKSB8IDE7CisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCAxNCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHRtcCwgdG1wLCBvZmZzZXQpOworCisgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAyLCBzLT5wYyB8IDEpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE0LCB0bXAyKTsKKyAgICAgICAgICAgIGdlbl9ieChzLCB0bXApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzLT5wYyAmIH5UQVJHRVRfUEFHRV9NQVNLKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBJbnN0cnVjdGlvbiBzcGFucyBhIHBhZ2UgYm91bmRhcnkuICBJbXBsZW1lbnQgaXQgYXMgdHdvCisgICAgICAgICAgICAgICAxNi1iaXQgaW5zdHJ1Y3Rpb25zIGluIGNhc2UgdGhlIHNlY29uZCBoYWxmIGNhdXNlcyBhbgorICAgICAgICAgICAgICAgcHJlZmV0Y2ggYWJvcnQuICAqLworICAgICAgICAgICAgb2Zmc2V0ID0gKChpbnQzMl90KWluc24gPDwgMjEpID4+IDk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9SWzE0XSwgcy0+cGMgKyAyICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byAzMi1iaXQgZGVjb2RlLiAgKi8KKyAgICB9CisKKyAgICBpbnNuID0gY3B1X2xkdXdfY29kZShlbnYsIHMtPnBjKTsKKyAgICBzLT5wYyArPSAyOworICAgIGluc24gfD0gKHVpbnQzMl90KWluc25faHcxIDw8IDE2OworCisgICAgaWYgKChpbnNuICYgMHhmODAwZTgwMCkgIT0gMHhmMDAwZTgwMCkgeworICAgICAgICBBUkNIKDZUMik7CisgICAgfQorCisgICAgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgcnMgPSAoaW5zbiA+PiAxMikgJiAweGY7CisgICAgcmQgPSAoaW5zbiA+PiA4KSAmIDB4ZjsKKyAgICBybSA9IGluc24gJiAweGY7CisgICAgc3dpdGNoICgoaW5zbiA+PiAyNSkgJiAweGYpIHsKKyAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6CisgICAgICAgIC8qIDE2LWJpdCBpbnN0cnVjdGlvbnMuICBTaG91bGQgbmV2ZXIgaGFwcGVuLiAgKi8KKyAgICAgICAgYWJvcnQoKTsKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjIpKSB7CisgICAgICAgICAgICAvKiBPdGhlciBsb2FkL3N0b3JlLCB0YWJsZSBicmFuY2guICAqLworICAgICAgICAgICAgaWYgKGluc24gJiAweDAxMjAwMDAwKSB7CisgICAgICAgICAgICAgICAgLyogTG9hZC9zdG9yZSBkb3VibGV3b3JkLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAocm4gPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihhZGRyLCBzLT5wYyAmIH4zKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaW5zbiAmIDB4ZmYpICogNDsKKyAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAoMSA8PCAyMykpID09IDApCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBsZHJkICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcnMsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3RyZCAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBycyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQmFzZSB3cml0ZWJhY2suICAqLworICAgICAgICAgICAgICAgICAgICBpZiAocm4gPT0gMTUpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgb2Zmc2V0IC0gNCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgYWRkcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmICgxIDw8IDIzKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIExvYWQvc3RvcmUgZXhjbHVzaXZlIHdvcmQuICAqLworICAgICAgICAgICAgICAgIGFkZHIgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgICAgICBsb2FkX3JlZ192YXIocywgYWRkciwgcm4pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgKGluc24gJiAweGZmKSA8PCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5fbG9hZF9leGNsdXNpdmUocywgcnMsIDE1LCBhZGRyLCAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZXhjbHVzaXZlKHMsIHJkLCBycywgMTUsIGFkZHIsIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoaW5zbiAmICgxIDw8IDYpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogVGFibGUgQnJhbmNoLiAgKi8KKyAgICAgICAgICAgICAgICBpZiAocm4gPT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihhZGRyLCBzLT5wYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXApOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdGJoICovCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQxNnUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogdGJiICovCisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDh1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcCwgdG1wLCAxKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKHRtcCwgdG1wLCBzLT5wYyk7CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDE1LCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBMb2FkL3N0b3JlIGV4Y2x1c2l2ZSBieXRlL2hhbGZ3b3JkL2RvdWJsZXdvcmQuICAqLworICAgICAgICAgICAgICAgIEFSQ0goNyk7CisgICAgICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiA0KSAmIDB4MzsKKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZHIgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgICAgICBsb2FkX3JlZ192YXIocywgYWRkciwgcm4pOworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjApKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl9sb2FkX2V4Y2x1c2l2ZShzLCBycywgcmQsIGFkZHIsIG9wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZXhjbHVzaXZlKHMsIHJtLCBycywgcmQsIGFkZHIsIG9wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZShhZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIExvYWQvc3RvcmUgbXVsdGlwbGUsIFJGRSwgU1JTLiAgKi8KKyAgICAgICAgICAgIGlmICgoKGluc24gPj4gMjMpICYgMSkgPT0gKChpbnNuID4+IDI0KSAmIDEpKSB7CisgICAgICAgICAgICAgICAgLyogTm90IGF2YWlsYWJsZSBpbiB1c2VyIG1vZGUuICAqLworICAgICAgICAgICAgICAgIGlmIChJU19VU0VSKHMpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmZlICovCisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaW5zbiAmICgxIDw8IDI0KSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgLTgpOworICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIFBDIGludG8gdG1wIGFuZCBDUFNSIGludG8gdG1wMi4gICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIDApOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIDQpOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gZ2VuX2xkMzIoYWRkciwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBCYXNlIHdyaXRlYmFjay4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgLTQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdlbl9yZmUocywgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBzcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3AgPSAoaW5zbiAmIDB4MWYpOworICAgICAgICAgICAgICAgICAgICBhZGRyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfY29uc3RfaTMyKG9wKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9nZXRfcjEzX2JhbmtlZChhZGRyLCBjcHVfZW52LCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAoMSA8PCAyNCkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgLTgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIDE0KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Nwc3JfcmVhZCh0bXAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpbnNuICYgKDEgPDwgMjQpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfY29uc3RfaTMyKG9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2V0X3IxM19iYW5rZWQoY3B1X2VudiwgdG1wLCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGksIGxvYWRlZF9iYXNlID0gMDsKKyAgICAgICAgICAgICAgICBUQ0d2IGxvYWRlZF92YXI7CisgICAgICAgICAgICAgICAgLyogTG9hZC9zdG9yZSBtdWx0aXBsZS4gICovCisgICAgICAgICAgICAgICAgYWRkciA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUQ0dWX1VOVVNFRChsb2FkZWRfdmFyKTsKKyAgICAgICAgICAgICAgICB0bXAyID0gdGNnX2NvbnN0X2kzMig0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAoMSA8PCBpKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2J4KHMsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gcm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRfdmFyID0gdG1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZF9iYXNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIGksIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKGFkZHIsIGFkZHIsIHRtcDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobG9hZGVkX2Jhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJuLCBsb2FkZWRfdmFyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQmFzZSByZWdpc3RlciB3cml0ZWJhY2suICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDI0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBGYXVsdCBpZiB3cml0ZWJhY2sgcmVnaXN0ZXIgaXMgaW4gcmVnaXN0ZXIgbGlzdC4gICovCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgcm4pKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIGFkZHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisKKyAgICAgICAgb3AgPSAoaW5zbiA+PiAyMSkgJiAweGY7CisgICAgICAgIGlmIChvcCA9PSA2KSB7CisgICAgICAgICAgICAvKiBIYWxmd29yZCBwYWNrLiAgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICBzaGlmdCA9ICgoaW5zbiA+PiAxMCkgJiAweDFjKSB8ICgoaW5zbiA+PiA2KSAmIDB4Myk7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDUpKSB7CisgICAgICAgICAgICAgICAgLyogcGtodGIgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAzMTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKHRtcDIsIHRtcDIsIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHRtcCwgdG1wLCAweGZmZmYwMDAwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV9pMzIodG1wMiwgdG1wMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHBraGJ0ICovCisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcDIsIHRtcDIsIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV9pMzIodG1wLCB0bXApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wMiwgdG1wMiwgMHhmZmZmMDAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX29yX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIERhdGEgcHJvY2Vzc2luZyByZWdpc3RlciBjb25zdGFudCBzaGlmdC4gICovCisgICAgICAgICAgICBpZiAocm4gPT0gMTUpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm0pOworCisgICAgICAgICAgICBzaGlmdG9wID0gKGluc24gPj4gNCkgJiAzOworICAgICAgICAgICAgc2hpZnQgPSAoKGluc24gPj4gNikgJiAzKSB8ICgoaW5zbiA+PiAxMCkgJiAweDFjKTsKKyAgICAgICAgICAgIGNvbmRzID0gKGluc24gJiAoMSA8PCAyMCkpICE9IDA7CisgICAgICAgICAgICBsb2dpY19jYyA9IChjb25kcyAmJiB0aHVtYjJfbG9naWNfb3Aob3ApKTsKKyAgICAgICAgICAgIGdlbl9hcm1fc2hpZnRfaW0odG1wMiwgc2hpZnRvcCwgc2hpZnQsIGxvZ2ljX2NjKTsKKyAgICAgICAgICAgIGlmIChnZW5fdGh1bWIyX2RhdGFfb3Aocywgb3AsIGNvbmRzLCAwLCB0bXAsIHRtcDIpKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgaWYgKHJkICE9IDE1KSB7CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IC8qIE1pc2MgZGF0YSBwcm9jZXNzaW5nLiAgKi8KKyAgICAgICAgb3AgPSAoKGluc24gPj4gMjIpICYgNikgfCAoKGluc24gPj4gNykgJiAxKTsKKyAgICAgICAgaWYgKG9wIDwgNCAmJiAoaW5zbiAmIDB4ZjAwMCkgIT0gMHhmMDAwKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgMDogLyogUmVnaXN0ZXIgY29udHJvbGxlZCBzaGlmdC4gICovCisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgaWYgKChpbnNuICYgMHg3MCkgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBvcCA9IChpbnNuID4+IDIxKSAmIDM7CisgICAgICAgICAgICBsb2dpY19jYyA9IChpbnNuICYgKDEgPDwgMjApKSAhPSAwOworICAgICAgICAgICAgZ2VuX2FybV9zaGlmdF9yZWcodG1wLCBvcCwgdG1wMiwgbG9naWNfY2MpOworICAgICAgICAgICAgaWYgKGxvZ2ljX2NjKQorICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgc3RvcmVfcmVnX2J4KGVudiwgcywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBTaWduL3plcm8gZXh0ZW5kLiAgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgIHNoaWZ0ID0gKGluc24gPj4gNCkgJiAzOworICAgICAgICAgICAgLyogPz8/IEluIG1hbnkgY2FzZXMgaXQncyBub3QgbmVjZXNzYXJ5IHRvIGRvIGEKKyAgICAgICAgICAgICAgIHJvdGF0ZSwgYSBzaGlmdCBpcyBzdWZmaWNpZW50LiAgKi8KKyAgICAgICAgICAgIGlmIChzaGlmdCAhPSAwKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fcm90cmlfaTMyKHRtcCwgdG1wLCBzaGlmdCAqIDgpOworICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiAyMCkgJiA3OworICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgY2FzZSAwOiBnZW5fc3h0aCh0bXApOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiBnZW5fdXh0aCh0bXApOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBnZW5fc3h0YjE2KHRtcCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOiBnZW5fdXh0YjE2KHRtcCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiBnZW5fc3h0Yih0bXApOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiBnZW5fdXh0Yih0bXApOyAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJuICE9IDE1KSB7CisgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICBpZiAoKG9wID4+IDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2FkZDE2KHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogU0lNRCBhZGQvc3VidHJhY3QuICAqLworICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiAyMCkgJiA3OworICAgICAgICAgICAgc2hpZnQgPSAoaW5zbiA+PiA0KSAmIDc7CisgICAgICAgICAgICBpZiAoKG9wICYgMykgPT0gMyB8fCAoc2hpZnQgJiAzKSA9PSAzKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICBnZW5fdGh1bWIyX3BhcmFsbGVsX2FkZHN1YihvcCwgc2hpZnQsIHRtcCwgdG1wMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIE90aGVyIGRhdGEgcHJvY2Vzc2luZy4gICovCisgICAgICAgICAgICBvcCA9ICgoaW5zbiA+PiAxNykgJiAweDM4KSB8ICgoaW5zbiA+PiA0KSAmIDcpOworICAgICAgICAgICAgaWYgKG9wIDwgNCkgeworICAgICAgICAgICAgICAgIC8qIFNhdHVyYXRpbmcgYWRkL3N1YnRyYWN0LiAgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICBpZiAob3AgJiAxKQorICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RvdWJsZV9zYXR1cmF0ZSh0bXAsIGNwdV9lbnYsIHRtcCk7CisgICAgICAgICAgICAgICAgaWYgKG9wICYgMikKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJfc2F0dXJhdGUodG1wLCBjcHVfZW52LCB0bXAyLCB0bXApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRfc2F0dXJhdGUodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgIGNhc2UgMHgwYTogLyogcmJpdCAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3JiaXQodG1wLCB0bXApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDg6IC8qIHJldiAqLworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2Jzd2FwMzJfaTMyKHRtcCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDA5OiAvKiByZXYxNiAqLworICAgICAgICAgICAgICAgICAgICBnZW5fcmV2MTYodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDBiOiAvKiByZXZzaCAqLworICAgICAgICAgICAgICAgICAgICBnZW5fcmV2c2godG1wKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDEwOiAvKiBzZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wMyA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9sZF9pMzIodG1wMywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVQVJNU3RhdGUsIEdFKSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2VsX2ZsYWdzKHRtcCwgdG1wMywgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMyk7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTg6IC8qIGNseiAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Nseih0bXAsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiBjYXNlIDU6IC8qIDMyLWJpdCBtdWx0aXBseS4gIFN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcy4gICovCisgICAgICAgICAgICBvcCA9IChpbnNuID4+IDQpICYgMHhmOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgIHN3aXRjaCAoKGluc24gPj4gMjApICYgNykgeworICAgICAgICAgICAgY2FzZSAwOiAvKiAzMiB4IDMyIC0+IDMyICovCisgICAgICAgICAgICAgICAgdGNnX2dlbl9tdWxfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICBpZiAocnMgIT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHRtcCwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiAxNiB4IDE2IC0+IDMyICovCisgICAgICAgICAgICAgICAgZ2VuX211bHh5KHRtcCwgdG1wMiwgb3AgJiAyLCBvcCAmIDEpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIGlmIChycyAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcnMpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9zZXRxKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBEdWFsIG11bHRpcGx5IGFkZC4gICovCisgICAgICAgICAgICBjYXNlIDQ6IC8qIER1YWwgbXVsdGlwbHkgc3VidHJhY3QuICAqLworICAgICAgICAgICAgICAgIGlmIChvcCkKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N3YXBfaGFsZih0bXAyKTsKKyAgICAgICAgICAgICAgICBnZW5fc211bF9kdWFsKHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBzdWJ0cmFjdGlvbiBjYW5ub3Qgb3ZlcmZsb3cuICovCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3ViX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBhZGRpdGlvbiBjYW5ub3Qgb3ZlcmZsb3cgMzIgYml0czsKKyAgICAgICAgICAgICAgICAgICAgICogaG93ZXZlciBpdCBtYXkgb3ZlcmZsb3cgY29uc2lkZXJlZCBhcyBhIHNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgKiBvcGVyYXRpb24sIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBzZXQgdGhlIFEgZmxhZy4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkX3NldHEodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICBpZiAocnMgIT0gMTUpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBycyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkX3NldHEodG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogLyogMzIgKiAxNiAtPiAzMm1zYiAqLworICAgICAgICAgICAgICAgIGlmIChvcCkKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0bXAyLCB0bXAyLCAxNik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnZW5fc3h0aCh0bXAyKTsKKyAgICAgICAgICAgICAgICB0bXA2NCA9IGdlbl9tdWxzX2k2NF9pMzIodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KHRtcDY0LCB0bXA2NCwgMTYpOworICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodG1wLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wNjQpOworICAgICAgICAgICAgICAgIGlmIChycyAhPSAxNSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRfc2V0cSh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiBjYXNlIDY6IC8qIDMyICogMzIgLT4gMzJtc2IgKFNNTVVMLCBTTU1MQSwgU01NTFMpICovCisgICAgICAgICAgICAgICAgdG1wNjQgPSBnZW5fbXVsc19pNjRfaTMyKHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgaWYgKHJzICE9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gZ2VuX2FkZHFfbXN3KHRtcDY0LCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdG1wNjQgPSBnZW5fc3VicV9tc3codG1wNjQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA0KSkgeworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTY0KHRtcDY0LCB0bXA2NCwgMHg4MDAwMDAwMHUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KHRtcDY0LCB0bXA2NCwgMzIpOworICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodG1wLCB0bXA2NCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wNjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OiAvKiBVbnNpZ25lZCBzdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMuICAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdXNhZDgodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIGlmIChycyAhPSAxNSkgeworICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcnMpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiBjYXNlIDc6IC8qIDY0LWJpdCBtdWx0aXBseSwgRGl2aWRlLiAgKi8KKyAgICAgICAgICAgIG9wID0gKChpbnNuID4+IDQpICYgMHhmKSB8ICgoaW5zbiA+PiAxNikgJiAweDcwKTsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgIHRtcDIgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICBpZiAoKG9wICYgMHg1MCkgPT0gMHgxMCkgeworICAgICAgICAgICAgICAgIC8qIHNkaXYsIHVkaXYgKi8KKyAgICAgICAgICAgICAgICBpZiAoIWFybV9mZWF0dXJlKGVudiwgQVJNX0ZFQVRVUkVfRElWKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIGlmIChvcCAmIDB4MjApCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdWRpdih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NkaXYodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKG9wICYgMHhlKSA9PSAweGMpIHsKKyAgICAgICAgICAgICAgICAvKiBEdWFsIG11bHRpcGx5IGFjY3VtdWxhdGUgbG9uZy4gICovCisgICAgICAgICAgICAgICAgaWYgKG9wICYgMSkKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N3YXBfaGFsZih0bXAyKTsKKyAgICAgICAgICAgICAgICBnZW5fc211bF9kdWFsKHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgaWYgKG9wICYgMHgxMCkgeworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIC8qIEJVR0ZJWCAqLworICAgICAgICAgICAgICAgIHRtcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0X2kzMl9pNjQodG1wNjQsIHRtcCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICBnZW5fYWRkcShzLCB0bXA2NCwgcnMsIHJkKTsKKyAgICAgICAgICAgICAgICBnZW5fc3RvcmVxX3JlZyhzLCBycywgcmQsIHRtcDY0KTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0bXA2NCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChvcCAmIDB4MjApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVW5zaWduZWQgNjQtYml0IG11bHRpcGx5ICAqLworICAgICAgICAgICAgICAgICAgICB0bXA2NCA9IGdlbl9tdWx1X2k2NF9pMzIodG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAob3AgJiA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzbWxhbHh5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbXVseHkodG1wLCB0bXAyLCBvcCAmIDIsIG9wICYgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHRfaTMyX2k2NCh0bXA2NCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaWduZWQgNjQtYml0IG11bHRpcGx5ICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wNjQgPSBnZW5fbXVsc19pNjRfaTMyKHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wICYgNCkgeworICAgICAgICAgICAgICAgICAgICAvKiB1bWFhbCAqLworICAgICAgICAgICAgICAgICAgICBnZW5fYWRkcV9sbyhzLCB0bXA2NCwgcnMpOworICAgICAgICAgICAgICAgICAgICBnZW5fYWRkcV9sbyhzLCB0bXA2NCwgcmQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3AgJiAweDQwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIDY0LWJpdCBhY2N1bXVsYXRlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2FkZHEocywgdG1wNjQsIHJzLCByZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9zdG9yZXFfcmVnKHMsIHJzLCByZCwgdG1wNjQpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcDY0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjogY2FzZSA3OiBjYXNlIDE0OiBjYXNlIDE1OgorICAgICAgICAvKiBDb3Byb2Nlc3Nvci4gICovCisgICAgICAgIGlmICgoKGluc24gPj4gMjQpICYgMykgPT0gMykgeworICAgICAgICAgICAgLyogVHJhbnNsYXRlIGludG8gdGhlIGVxdWl2YWxlbnQgQVJNIGVuY29kaW5nLiAgKi8KKyAgICAgICAgICAgIGluc24gPSAoaW5zbiAmIDB4ZTJmZmZmZmYpIHwgKChpbnNuICYgKDEgPDwgMjgpKSA+PiA0KSB8ICgxIDw8IDI4KTsKKyAgICAgICAgICAgIGlmIChkaXNhc19uZW9uX2RhdGFfaW5zbihlbnYsIHMsIGluc24pKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjgpKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIGlmIChkaXNhc19jb3Byb2NfaW5zbiAoZW52LCBzLCBpbnNuKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OiBjYXNlIDk6IGNhc2UgMTA6IGNhc2UgMTE6CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTUpKSB7CisgICAgICAgICAgICAvKiBCcmFuY2hlcywgbWlzYyBjb250cm9sLiAgKi8KKyAgICAgICAgICAgIGlmIChpbnNuICYgMHg1MDAwKSB7CisgICAgICAgICAgICAgICAgLyogVW5jb25kaXRpb25hbCBicmFuY2guICAqLworICAgICAgICAgICAgICAgIC8qIHNpZ25leHRlbmQoaHcxWzEwOjBdKSAtPiBvZmZzZXRbOjEyXS4gICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKChpbnQzMl90KWluc24gPDwgNSkgPj4gOSAmIH4oaW50MzJfdCkweGZmZjsKKyAgICAgICAgICAgICAgICAvKiBodzFbMTA6MF0gLT4gb2Zmc2V0WzExOjFdLiAgKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgfD0gKGluc24gJiAweDdmZikgPDwgMTsKKyAgICAgICAgICAgICAgICAvKiAofmh3MlsxMywgMTFdIF4gb2Zmc2V0WzI0XSkgLT4gb2Zmc2V0WzIzLDIyXQorICAgICAgICAgICAgICAgICAgIG9mZnNldFsyNDoyMl0gYWxyZWFkeSBoYXZlIHRoZSBzYW1lIHZhbHVlIGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAgICAgICAgICAgc2lnbiBleHRlbnNpb24gYWJvdmUuICAqLworICAgICAgICAgICAgICAgIG9mZnNldCBePSAoKH5pbnNuKSAmICgxIDw8IDEzKSkgPDwgMTA7CisgICAgICAgICAgICAgICAgb2Zmc2V0IF49ICgofmluc24pICYgKDEgPDwgMTEpKSA8PCAxMTsKKworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEJyYW5jaCBhbmQgbGluay4gICovCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X1JbMTRdLCBzLT5wYyB8IDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzLT5wYzsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDEyKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBiL2JsICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9qbXAocywgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBibHggKi8KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICY9IH4odWludDMyX3QpMjsKKyAgICAgICAgICAgICAgICAgICAgLyogdGh1bWIyIGJ4LCBubyBuZWVkIHRvIGNoZWNrICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9ieF9pbShzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKChpbnNuID4+IDIzKSAmIDcpID09IDcpIHsKKyAgICAgICAgICAgICAgICAvKiBNaXNjIGNvbnRyb2wgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDEzKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworCisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNikpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogU2VjdXJlIG1vbml0b3IgY2FsbCAvIHNtYyAodjZaKSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoIShlbnYtPmNwMTUuYzBfYzJbNF0gJiAweGYwMDApIHx8IElTX1VTRVIocykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnZW5fc21jKGVudiwgcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiAyMCkgJiA3OworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogLyogbXNyIGNwc3IuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX00oZW52KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyID0gdGNnX2NvbnN0X2kzMihpbnNuICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl92N21fbXNyKGNwdV9lbnYsIGFkZHIsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbG9va3VwX3RiKHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLyogbXNyIHNwc3IuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX00oZW52KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuX3NldF9wc3IocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zcl9tYXNrKGVudiwgcywgKGluc24gPj4gOCkgJiAweGYsIG9wID09IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPT0gMSwgdG1wKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBjcHMsIG5vcC1oaW50LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGluc24gPj4gOCkgJiA3KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX25vcF9oaW50KHMsIGluc24gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltcGxlbWVudGVkIGFzIE5PUCBpbiB1c2VyIG1vZGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX1VTRVIocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW1tID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA3KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IHw9IENQU1JfQTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgfD0gQ1BTUl9JOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgNSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCB8PSBDUFNSX0Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tID0gQ1BTUl9BIHwgQ1BTUl9JIHwgQ1BTUl9GOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCB8PSAweDFmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbSB8PSAoaW5zbiAmIDB4MWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zZXRfcHNyX2ltKHMsIG9mZnNldCwgMCwgaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6IC8qIFNwZWNpYWwgY29udHJvbCBvcGVyYXRpb25zLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0goNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcCA9IChpbnNuID4+IDQpICYgMHhmOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBjbHJleCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9jbHJleChzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDogLyogZHNiICovCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIGRtYiAqLworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBpc2IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBleGVjdXRlIGFzIE5PUHMuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiAvKiBieGogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyaXZpYWwgaW1wbGVtZW50YXRpb24gZXF1aXZhbGVudCB0byBieC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fYngocywgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IC8qIEV4Y2VwdGlvbiByZXR1cm4uICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX1VTRVIocykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm4gIT0gMTQgfHwgcmQgIT0gMTUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1YmlfaTMyKHRtcCwgdG1wLCBpbnNuICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uX3JldHVybihzLCB0bXApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjogLyogbXJzIGNwc3IuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX00oZW52KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSB0Y2dfY29uc3RfaTMyKGluc24gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3Y3bV9tcnModG1wLCBjcHVfZW52LCBhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9jcHNyX3JlYWQodG1wLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IC8qIG1ycyBzcHNyLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhY2Nlc3NpYmxlIGluIHVzZXIgbW9kZS4gICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSB8fCBJU19NKGVudikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9jcHVfZmllbGQoc3Bzcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQ29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KKyAgICAgICAgICAgICAgICBvcCA9IChpbnNuID4+IDIyKSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAvKiBHZW5lcmF0ZSBhIGNvbmRpdGlvbmFsIGp1bXAgdG8gbmV4dCBpbnN0cnVjdGlvbi4gICovCisgICAgICAgICAgICAgICAgcy0+Y29uZGxhYmVsID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICAgICAgICAgIGdlbl90ZXN0X2NjKG9wIF4gMSwgcy0+Y29uZGxhYmVsKTsKKyAgICAgICAgICAgICAgICBzLT5jb25kam1wID0gMTsKKworICAgICAgICAgICAgICAgIC8qIG9mZnNldFsxMToxXSA9IGluc25bMTA6MF0gKi8KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaW5zbiAmIDB4N2ZmKSA8PCAxOworICAgICAgICAgICAgICAgIC8qIG9mZnNldFsxNzoxMl0gPSBpbnNuWzIxOjE2XS4gICovCisgICAgICAgICAgICAgICAgb2Zmc2V0IHw9IChpbnNuICYgMHgwMDNmMDAwMCkgPj4gNDsKKyAgICAgICAgICAgICAgICAvKiBvZmZzZXRbMzE6MjBdID0gaW5zblsyNl0uICAqLworICAgICAgICAgICAgICAgIG9mZnNldCB8PSAoKGludDMyX3QpKChpbnNuIDw8IDUpICYgMHg4MDAwMDAwMCkpID4+IDExOworICAgICAgICAgICAgICAgIC8qIG9mZnNldFsxOF0gPSBpbnNuWzEzXS4gICovCisgICAgICAgICAgICAgICAgb2Zmc2V0IHw9IChpbnNuICYgKDEgPDwgMTMpKSA8PCA1OworICAgICAgICAgICAgICAgIC8qIG9mZnNldFsxOV0gPSBpbnNuWzExXS4gICovCisgICAgICAgICAgICAgICAgb2Zmc2V0IHw9IChpbnNuICYgKDEgPDwgMTEpKSA8PCA4OworCisgICAgICAgICAgICAgICAgLyoganVtcCB0byB0aGUgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgZ2VuX2ptcChzLCBzLT5wYyArIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBEYXRhIHByb2Nlc3NpbmcgaW1tZWRpYXRlLiAgKi8KKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIC8qIEJpdGZpZWxkL1NhdHVyYXRlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiAyMSkgJiA3OworICAgICAgICAgICAgICAgICAgICBpbW0gPSBpbnNuICYgMHgxZjsKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoKGluc24gPj4gNikgJiAzKSB8ICgoaW5zbiA+PiAxMCkgJiAweDFjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJuID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IC8qIFNpZ25lZCBiaXRmaWVsZCBleHRyYWN0LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICsgaW1tID4gMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltbSA8IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9zYmZ4KHRtcCwgc2hpZnQsIGltbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBVbnNpZ25lZCBiaXRmaWVsZCBleHRyYWN0LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICsgaW1tID4gMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltbSA8IDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl91YmZ4KHRtcCwgc2hpZnQsICgxdSA8PCBpbW0pIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBCaXRmaWVsZCBpbnNlcnQvY2xlYXIuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltbSA8IHNoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltbSA9IGltbSArIDEgLSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbW0gIT0gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9iZmkodG1wLCB0bXAyLCB0bXAsIHNoaWZ0LCAoMXUgPDwgaW1tKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogU2F0dXJhdGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0bXAsIHRtcCwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0bXAsIHRtcCwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCAmIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnNpZ25lZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvcCAmIDEpICYmIHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdXNhdDE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdXNhdCh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNpZ25lZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvcCAmIDEpICYmIHNoaWZ0ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3NhdDE2KHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3NhdCh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbW0gPSAoKGluc24gJiAweDA0MDAwMDAwKSA+PiAxNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGluc24gJiAweDcwMDApID4+IDQpIHwgKGluc24gJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBpbW1lZGlhdGUuICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW1tIHw9IChpbnNuID4+IDQpICYgMHhmMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAyMykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Z0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZ1X2kzMih0bXAsIHRtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9vcmlfaTMyKHRtcCwgdG1wLCBpbW0gPDwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb3Z3ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCBpbW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWRkL3N1YiAxMi1iaXQgaW1tZWRpYXRlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChybiA9PSAxNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHMtPnBjICYgfih1aW50MzJfdCkzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLT0gaW1tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGltbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdWJpX2kzMih0bXAsIHRtcCwgaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIodG1wLCB0bXAsIGltbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHNoaWZ0ZXJfb3V0ID0gMDsKKyAgICAgICAgICAgICAgICAvKiBtb2RpZmllZCAxMi1iaXQgaW1tZWRpYXRlLiAgKi8KKyAgICAgICAgICAgICAgICBzaGlmdCA9ICgoaW5zbiAmIDB4MDQwMDAwMDApID4+IDIzKSB8ICgoaW5zbiAmIDB4NzAwMCkgPj4gMTIpOworICAgICAgICAgICAgICAgIGltbSA9IChpbnNuICYgMHhmZik7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzaGlmdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLyogWFkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogTm90aGluZyB0byBkby4gICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogMDBYWTAwWFkgKi8KKyAgICAgICAgICAgICAgICAgICAgaW1tIHw9IGltbSA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAvKiBYWTAwWFkwMCAqLworICAgICAgICAgICAgICAgICAgICBpbW0gfD0gaW1tIDw8IDE2OworICAgICAgICAgICAgICAgICAgICBpbW0gPDw9IDg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogLyogWFlYWVhZWFkgKi8KKyAgICAgICAgICAgICAgICAgICAgaW1tIHw9IGltbSA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgaW1tIHw9IGltbSA8PCA4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvKiBSb3RhdGVkIGNvbnN0YW50LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoc2hpZnQgPDwgMSkgfCAoaW1tID4+IDcpOworICAgICAgICAgICAgICAgICAgICBpbW0gfD0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgaW1tID0gaW1tIDw8ICgzMiAtIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgc2hpZnRlcl9vdXQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcDIsIGltbSk7CisgICAgICAgICAgICAgICAgcm4gPSAoaW5zbiA+PiAxNikgJiAweGY7CisgICAgICAgICAgICAgICAgaWYgKHJuID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiAyMSkgJiAweGY7CisgICAgICAgICAgICAgICAgaWYgKGdlbl90aHVtYjJfZGF0YV9vcChzLCBvcCwgKGluc24gJiAoMSA8PCAyMCkpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdGVyX291dCwgdG1wLCB0bXAyKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIHJkID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgICAgICAgICAgaWYgKHJkICE9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOiAvKiBMb2FkL3N0b3JlIHNpbmdsZSBkYXRhIGl0ZW0uICAqLworICAgICAgICB7CisgICAgICAgIGludCBwb3N0aW5jID0gMDsKKyAgICAgICAgaW50IHdyaXRlYmFjayA9IDA7CisgICAgICAgIGludCB1c2VyOworICAgICAgICBpZiAoKGluc24gJiAweDAxMTAwMDAwKSA9PSAweDAxMDAwMDAwKSB7CisgICAgICAgICAgICBpZiAoZGlzYXNfbmVvbl9sc19pbnNuKGVudiwgcywgaW5zbikpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb3AgPSAoKGluc24gPj4gMjEpICYgMykgfCAoKGluc24gPj4gMjIpICYgNCk7CisgICAgICAgIGlmIChycyA9PSAxNSkgeworICAgICAgICAgICAgaWYgKCEoaW5zbiAmICgxIDw8IDIwKSkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3AgIT0gMikgeworICAgICAgICAgICAgICAgIC8qIEJ5dGUgb3IgaGFsZndvcmQgbG9hZCBzcGFjZSB3aXRoIGRlc3QgPT0gcjE1IDogbWVtb3J5IGhpbnRzLgorICAgICAgICAgICAgICAgICAqIENhdGNoIHRoZW0gZWFybHkgc28gd2UgZG9uJ3QgZW1pdCBwb2ludGxlc3MgYWRkcmVzc2luZyBjb2RlLgorICAgICAgICAgICAgICAgICAqIFRoaXMgc3BhY2UgaXMgYSBtaXggb2Y6CisgICAgICAgICAgICAgICAgICogIFBMRC9QTERXL1BMSSwgIHdoaWNoIHdlIGltcGxlbWVudCBhcyBOT1BzIChub3RlIHRoYXQgdW5saWtlCisgICAgICAgICAgICAgICAgICogICAgIHRoZSBBUk0gZW5jb2RpbmdzLCBQTERXIHNwYWNlIGRvZXNuJ3QgVU5ERUYgZm9yIG5vbi12N01QCisgICAgICAgICAgICAgICAgICogICAgIGNvcmVzKQorICAgICAgICAgICAgICAgICAqICB1bmFsbG9jYXRlZCBoaW50cywgd2hpY2ggbXVzdCBiZSB0cmVhdGVkIGFzIE5PUHMKKyAgICAgICAgICAgICAgICAgKiAgVU5QUkVESUNUQUJMRSBzcGFjZSwgd2hpY2ggd2UgTk9QIG9yIFVOREVGIGRlcGVuZGluZyBvbgorICAgICAgICAgICAgICAgICAqICAgICB3aGljaCBpcyBlYXNpZXN0IGZvciB0aGUgZGVjb2RpbmcgbG9naWMKKyAgICAgICAgICAgICAgICAgKiAgU29tZSBzcGFjZSB3aGljaCBtdXN0IFVOREVGCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IG9wMSA9IChpbnNuID4+IDIzKSAmIDM7CisgICAgICAgICAgICAgICAgaW50IG9wMiA9IChpbnNuID4+IDYpICYgMHgzZjsKKyAgICAgICAgICAgICAgICBpZiAob3AgJiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJuID09IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFVOUFJFRElDVEFCTEUgb3IgdW5hbGxvY2F0ZWQgaGludCAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9wMSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIFBMRCogb3IgdW5hbGxvY2F0ZWQgaGludCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG9wMiA9PSAwKSB8fCAoKG9wMiAmIDB4M2MpID09IDB4MzApKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBQTEQqIG9yIHVuYWxsb2NhdGVkIGhpbnQgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogVU5ERUYgc3BhY2UsIG9yIGFuIFVOUFJFRElDVEFCTEUgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1c2VyID0gSVNfVVNFUihzKTsKKyAgICAgICAgaWYgKHJuID09IDE1KSB7CisgICAgICAgICAgICBhZGRyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgLyogUEMgcmVsYXRpdmUuICAqLworICAgICAgICAgICAgLyogcy0+cGMgaGFzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBieSA0LiAgKi8KKyAgICAgICAgICAgIGltbSA9IHMtPnBjICYgMHhmZmZmZmZmYzsKKyAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMjMpKQorICAgICAgICAgICAgICAgIGltbSArPSBpbnNuICYgMHhmZmY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW1tIC09IGluc24gJiAweGZmZjsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoYWRkciwgaW1tKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZHIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIzKSkgeworICAgICAgICAgICAgICAgIC8qIFBvc2l0aXZlIG9mZnNldC4gICovCisgICAgICAgICAgICAgICAgaW1tID0gaW5zbiAmIDB4ZmZmOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgaW1tKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW1tID0gaW5zbiAmIDB4ZmY7CisgICAgICAgICAgICAgICAgc3dpdGNoICgoaW5zbiA+PiA4KSAmIDB4ZikgeworICAgICAgICAgICAgICAgIGNhc2UgMHgwOiAvKiBTaGlmdGVkIFJlZ2lzdGVyLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAoaW5zbiA+PiA0KSAmIDB4ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID4gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHRtcCwgdG1wLCBzaGlmdCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4YzogLyogTmVnYXRpdmUgb2Zmc2V0LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCAtaW1tKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGU6IC8qIFVzZXIgcHJpdmlsZWdlLiAgKi8KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBpbW0pOworICAgICAgICAgICAgICAgICAgICB1c2VyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDk6IC8qIFBvc3QtZGVjcmVtZW50LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgaW1tID0gLWltbTsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDB4YjogLyogUG9zdC1pbmNyZW1lbnQuICAqLworICAgICAgICAgICAgICAgICAgICBwb3N0aW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGViYWNrID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweGQ6IC8qIFByZS1kZWNyZW1lbnQuICAqLworICAgICAgICAgICAgICAgICAgICBpbW0gPSAtaW1tOworICAgICAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2guICAqLworICAgICAgICAgICAgICAgIGNhc2UgMHhmOiAvKiBQcmUtaW5jcmVtZW50LiAgKi8KKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBpbW0pOworICAgICAgICAgICAgICAgICAgICB3cml0ZWJhY2sgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDIwKSkgeworICAgICAgICAgICAgLyogTG9hZC4gICovCisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIDA6IHRtcCA9IGdlbl9sZDh1KGFkZHIsIHVzZXIpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogdG1wID0gZ2VuX2xkOHMoYWRkciwgdXNlcik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiB0bXAgPSBnZW5fbGQxNnUoYWRkciwgdXNlcik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OiB0bXAgPSBnZW5fbGQxNnMoYWRkciwgdXNlcik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiB0bXAgPSBnZW5fbGQzMihhZGRyLCB1c2VyKTsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChycyA9PSAxNSkgeworICAgICAgICAgICAgICAgIGdlbl9ieChzLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcnMsIHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBTdG9yZS4gICovCisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBycyk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIDA6IGdlbl9zdDgodG1wLCBhZGRyLCB1c2VyKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGdlbl9zdDE2KHRtcCwgYWRkciwgdXNlcik7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBnZW5fc3QzMih0bXAsIGFkZHIsIHVzZXIpOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwb3N0aW5jKQorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihhZGRyLCBhZGRyLCBpbW0pOworICAgICAgICBpZiAod3JpdGViYWNrKSB7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIGFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgfQorICAgIHJldHVybiAwOworaWxsZWdhbF9vcDoKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGlzYXNfdGh1bWJfaW5zbihDUFVBUk1TdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMpCit7CisgICAgdWludDMyX3QgdmFsLCBpbnNuLCBvcCwgcm0sIHJuLCByZCwgc2hpZnQsIGNvbmQ7CisgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgaW50IGk7CisgICAgVENHdiB0bXA7CisgICAgVENHdiB0bXAyOworICAgIFRDR3YgYWRkcjsKKworICAgIGlmIChzLT5jb25kZXhlY19tYXNrKSB7CisgICAgICAgIGNvbmQgPSBzLT5jb25kZXhlY19jb25kOworICAgICAgICBpZiAoY29uZCAhPSAweDBlKSB7ICAgICAvKiBTa2lwIGNvbmRpdGlvbmFsIHdoZW4gY29uZGl0aW9uIGlzIEFMLiAqLworICAgICAgICAgIHMtPmNvbmRsYWJlbCA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICBnZW5fdGVzdF9jYyhjb25kIF4gMSwgcy0+Y29uZGxhYmVsKTsKKyAgICAgICAgICBzLT5jb25kam1wID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluc24gPSBjcHVfbGR1d19jb2RlKGVudiwgcy0+cGMpOworCisgICAgcy0+cGMgKz0gMjsKKworICAgIHN3aXRjaCAoaW5zbiA+PiAxMikgeworICAgIGNhc2UgMDogY2FzZSAxOgorCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIG9wID0gKGluc24gPj4gMTEpICYgMzsKKyAgICAgICAgaWYgKG9wID09IDMpIHsKKyAgICAgICAgICAgIC8qIGFkZC9zdWJ0cmFjdCAqLworICAgICAgICAgICAgcm4gPSAoaW5zbiA+PiAzKSAmIDc7CisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDEwKSkgeworICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSAqLworICAgICAgICAgICAgICAgIHRtcDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAyLCAoaW5zbiA+PiA2KSAmIDcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiByZWcgKi8KKyAgICAgICAgICAgICAgICBybSA9IChpbnNuID4+IDYpICYgNzsKKyAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA5KSkgeworICAgICAgICAgICAgICAgIGlmIChzLT5jb25kZXhlY19tYXNrKQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJfY2ModG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkX2NjKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc2hpZnQgaW1tZWRpYXRlICovCisgICAgICAgICAgICBybSA9IChpbnNuID4+IDMpICYgNzsKKyAgICAgICAgICAgIHNoaWZ0ID0gKGluc24gPj4gNikgJiAweDFmOworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgZ2VuX2FybV9zaGlmdF9pbSh0bXAsIG9wLCBzaGlmdCwgcy0+Y29uZGV4ZWNfbWFzayA9PSAwKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wKTsKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IGNhc2UgMzoKKyAgICAgICAgLyogYXJpdGhtZXRpYyBsYXJnZSBpbW1lZGlhdGUgKi8KKyAgICAgICAgb3AgPSAoaW5zbiA+PiAxMSkgJiAzOworICAgICAgICByZCA9IChpbnNuID4+IDgpICYgMHg3OworICAgICAgICBpZiAob3AgPT0gMCkgeyAvKiBtb3YgKi8KKyAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCBpbnNuICYgMHhmZik7CisgICAgICAgICAgICBpZiAoIXMtPmNvbmRleGVjX21hc2spCisgICAgICAgICAgICAgICAgZ2VuX2xvZ2ljX0NDKHRtcCk7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAyLCBpbnNuICYgMHhmZik7CisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIDE6IC8qIGNtcCAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc3ViX2NjKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXApOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBhZGQgKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkX2NjKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8qIHN1YiAqLworICAgICAgICAgICAgICAgIGlmIChzLT5jb25kZXhlY19tYXNrKQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJfY2ModG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTEpKSB7CisgICAgICAgICAgICByZCA9IChpbnNuID4+IDgpICYgNzsKKyAgICAgICAgICAgIC8qIGxvYWQgcGMtcmVsYXRpdmUuICBCaXQgMSBvZiBQQyBpcyBpZ25vcmVkLiAgKi8KKyAgICAgICAgICAgIHZhbCA9IHMtPnBjICsgMiArICgoaW5zbiAmIDB4ZmYpICogNCk7CisgICAgICAgICAgICB2YWwgJj0gfih1aW50MzJfdCkyOworICAgICAgICAgICAgYWRkciA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoYWRkciwgdmFsKTsKKyAgICAgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDEwKSkgeworICAgICAgICAgICAgLyogZGF0YSBwcm9jZXNzaW5nIGV4dGVuZGVkIG9yIGJseCAqLworICAgICAgICAgICAgcmQgPSAoaW5zbiAmIDcpIHwgKChpbnNuID4+IDQpICYgOCk7CisgICAgICAgICAgICBybSA9IChpbnNuID4+IDMpICYgMHhmOworICAgICAgICAgICAgb3AgPSAoaW5zbiA+PiA4KSAmIDM7CisgICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8qIGFkZCAqLworICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBjbXAgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCByZCk7CisgICAgICAgICAgICAgICAgdG1wMiA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wMik7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLyogbW92L2NweSAqLworICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6LyogYnJhbmNoIFthbmQgbGlua10gZXhjaGFuZ2UgdGh1bWIgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybSk7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA3KSkgeworICAgICAgICAgICAgICAgICAgICBBUkNIKDUpOworICAgICAgICAgICAgICAgICAgICB2YWwgPSAodWludDMyX3Qpcy0+cGMgfCAxOworICAgICAgICAgICAgICAgICAgICB0bXAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcDIsIHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCAxNCwgdG1wMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGFscmVhZHkgdGh1bWIsIG5vIG5lZWQgdG8gY2hlY2sgKi8KKyAgICAgICAgICAgICAgICBnZW5fYngocywgdG1wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZGF0YSBwcm9jZXNzaW5nIHJlZ2lzdGVyICovCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIHJtID0gKGluc24gPj4gMykgJiA3OworICAgICAgICBvcCA9IChpbnNuID4+IDYpICYgMHhmOworICAgICAgICBpZiAob3AgPT0gMiB8fCBvcCA9PSAzIHx8IG9wID09IDQgfHwgb3AgPT0gNykgeworICAgICAgICAgICAgLyogdGhlIHNoaWZ0L3JvdGF0ZSBvcHMgd2FudCB0aGUgb3BlcmFuZHMgYmFja3dhcmRzICovCisgICAgICAgICAgICB2YWwgPSBybTsKKyAgICAgICAgICAgIHJtID0gcmQ7CisgICAgICAgICAgICByZCA9IHZhbDsKKyAgICAgICAgICAgIHZhbCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9wID09IDkpIHsgLyogbmVnICovCisgICAgICAgICAgICB0bXAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHRtcCwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAob3AgIT0gMHhmKSB7IC8qIG12biBkb2Vzbid0IHJlYWQgaXRzIGZpcnN0IG9wZXJhbmQgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRDR1ZfVU5VU0VEKHRtcCk7CisgICAgICAgIH0KKworICAgICAgICB0bXAyID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgMHgwOiAvKiBhbmQgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fYW5kX2kzMih0bXAsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBpZiAoIXMtPmNvbmRleGVjX21hc2spCisgICAgICAgICAgICAgICAgZ2VuX2xvZ2ljX0NDKHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE6IC8qIGVvciAqLworICAgICAgICAgICAgdGNnX2dlbl94b3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjogLyogbHNsICovCisgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsKHRtcDIsIHRtcDIsIHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsX2NjKHRtcDIsIGNwdV9lbnYsIHRtcDIsIHRtcCk7CisgICAgICAgICAgICAgICAgZ2VuX2xvZ2ljX0NDKHRtcDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzOiAvKiBsc3IgKi8KKyAgICAgICAgICAgIGlmIChzLT5jb25kZXhlY19tYXNrKSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHIodG1wMiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJfY2ModG1wMiwgY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDQ6IC8qIGFzciAqLworICAgICAgICAgICAgaWYgKHMtPmNvbmRleGVjX21hc2spIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3Nhcih0bXAyLCB0bXAyLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3Nhcl9jYyh0bXAyLCBjcHVfZW52LCB0bXAyLCB0bXApOworICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NTogLyogYWRjICovCisgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICBnZW5fYWRjKHRtcCwgdG1wMik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGNfY2ModG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2OiAvKiBzYmMgKi8KKyAgICAgICAgICAgIGlmIChzLT5jb25kZXhlY19tYXNrKQorICAgICAgICAgICAgICAgIGdlbl9zdWJfY2FycnkodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2JjX2NjKHRtcCwgY3B1X2VudiwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzogLyogcm9yICovCisgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodG1wLCB0bXAsIDB4MWYpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fcm90cl9pMzIodG1wMiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9yb3JfY2ModG1wMiwgY3B1X2VudiwgdG1wMiwgdG1wKTsKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDg6IC8qIHRzdCAqLworICAgICAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgcmQgPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4OTogLyogbmVnICovCisgICAgICAgICAgICBpZiAocy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX25lZ19pMzIodG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N1Yl9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGE6IC8qIGNtcCAqLworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJfY2ModG1wLCBjcHVfZW52LCB0bXAsIHRtcDIpOworICAgICAgICAgICAgcmQgPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YjogLyogY21uICovCisgICAgICAgICAgICBnZW5faGVscGVyX2FkZF9jYyh0bXAsIGNwdV9lbnYsIHRtcCwgdG1wMik7CisgICAgICAgICAgICByZCA9IDE2OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhjOiAvKiBvcnIgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHRtcCwgdG1wLCB0bXAyKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZDogLyogbXVsICovCisgICAgICAgICAgICB0Y2dfZ2VuX211bF9pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgaWYgKCFzLT5jb25kZXhlY19tYXNrKQorICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhlOiAvKiBiaWMgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fYW5kY19pMzIodG1wLCB0bXAsIHRtcDIpOworICAgICAgICAgICAgaWYgKCFzLT5jb25kZXhlY19tYXNrKQorICAgICAgICAgICAgICAgIGdlbl9sb2dpY19DQyh0bXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmOiAvKiBtdm4gKi8KKyAgICAgICAgICAgIHRjZ19nZW5fbm90X2kzMih0bXAyLCB0bXAyKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29uZGV4ZWNfbWFzaykKKyAgICAgICAgICAgICAgICBnZW5fbG9naWNfQ0ModG1wMik7CisgICAgICAgICAgICB2YWwgPSAxOworICAgICAgICAgICAgcm0gPSByZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZCAhPSAxNikgeworICAgICAgICAgICAgaWYgKHZhbCkgeworICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybSwgdG1wMik7CisgICAgICAgICAgICAgICAgaWYgKG9wICE9IDB4ZikKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcDIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA1OgorICAgICAgICAvKiBsb2FkL3N0b3JlIHJlZ2lzdGVyIG9mZnNldC4gICovCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIHJuID0gKGluc24gPj4gMykgJiA3OworICAgICAgICBybSA9IChpbnNuID4+IDYpICYgNzsKKyAgICAgICAgb3AgPSAoaW5zbiA+PiA5KSAmIDc7CisgICAgICAgIGFkZHIgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfaTMyKGFkZHIsIGFkZHIsIHRtcCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisKKyAgICAgICAgaWYgKG9wIDwgMykgLyogc3RvcmUgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgMDogLyogc3RyICovCisgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogc3RyaCAqLworICAgICAgICAgICAgZ2VuX3N0MTYodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIHN0cmIgKi8KKyAgICAgICAgICAgIGdlbl9zdDgodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIGxkcnNiICovCisgICAgICAgICAgICB0bXAgPSBnZW5fbGQ4cyhhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6IC8qIGxkciAqLworICAgICAgICAgICAgdG1wID0gZ2VuX2xkMzIoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAvKiBsZHJoICovCisgICAgICAgICAgICB0bXAgPSBnZW5fbGQxNnUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBsZHJiICovCisgICAgICAgICAgICB0bXAgPSBnZW5fbGQ4dShhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6IC8qIGxkcnNoICovCisgICAgICAgICAgICB0bXAgPSBnZW5fbGQxNnMoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob3AgPj0gMykgLyogbG9hZCAqLworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDY6CisgICAgICAgIC8qIGxvYWQvc3RvcmUgd29yZCBpbW1lZGlhdGUgb2Zmc2V0ICovCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIHJuID0gKGluc24gPj4gMykgJiA3OworICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICB2YWwgPSAoaW5zbiA+PiA0KSAmIDB4N2M7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgdmFsKTsKKworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgdG1wID0gZ2VuX2xkMzIoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBzdG9yZSAqLworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgZ2VuX3N0MzIodG1wLCBhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDc6CisgICAgICAgIC8qIGxvYWQvc3RvcmUgYnl0ZSBpbW1lZGlhdGUgb2Zmc2V0ICovCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIHJuID0gKGluc24gPj4gMykgJiA3OworICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICB2YWwgPSAoaW5zbiA+PiA2KSAmIDB4MWY7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgdmFsKTsKKworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgdG1wID0gZ2VuX2xkOHUoYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBzdG9yZSAqLworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcmQpOworICAgICAgICAgICAgZ2VuX3N0OCh0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGFkZHIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgODoKKyAgICAgICAgLyogbG9hZC9zdG9yZSBoYWxmd29yZCBpbW1lZGlhdGUgb2Zmc2V0ICovCisgICAgICAgIHJkID0gaW5zbiAmIDc7CisgICAgICAgIHJuID0gKGluc24gPj4gMykgJiA3OworICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICB2YWwgPSAoaW5zbiA+PiA1KSAmIDB4M2U7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgdmFsKTsKKworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgdG1wID0gZ2VuX2xkMTZ1KGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3RvcmUgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgIGdlbl9zdDE2KHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgIH0KKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA5OgorICAgICAgICAvKiBsb2FkL3N0b3JlIGZyb20gc3RhY2sgKi8KKyAgICAgICAgcmQgPSAoaW5zbiA+PiA4KSAmIDc7CisgICAgICAgIGFkZHIgPSBsb2FkX3JlZyhzLCAxMyk7CisgICAgICAgIHZhbCA9IChpbnNuICYgMHhmZikgKiA0OworICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIHZhbCk7CisKKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxMSkpIHsKKyAgICAgICAgICAgIC8qIGxvYWQgKi8KKyAgICAgICAgICAgIHRtcCA9IGdlbl9sZDMyKGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3RvcmUgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJkKTsKKyAgICAgICAgICAgIGdlbl9zdDMyKHRtcCwgYWRkciwgSVNfVVNFUihzKSk7CisgICAgICAgIH0KKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxMDoKKyAgICAgICAgLyogYWRkIHRvIGhpZ2ggcmVnICovCisgICAgICAgIHJkID0gKGluc24gPj4gOCkgJiA3OworICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgLyogU1AgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIDEzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFBDLiBiaXQgMSBpcyBpZ25vcmVkLiAgKi8KKyAgICAgICAgICAgIHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIodG1wLCAocy0+cGMgKyAyKSAmIH4odWludDMyX3QpMik7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gKGluc24gJiAweGZmKSAqIDQ7CisgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIodG1wLCB0bXAsIHZhbCk7CisgICAgICAgIHN0b3JlX3JlZyhzLCByZCwgdG1wKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDExOgorICAgICAgICAvKiBtaXNjICovCisgICAgICAgIG9wID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogYWRqdXN0IHN0YWNrIHBvaW50ZXIgKi8KKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIDEzKTsKKyAgICAgICAgICAgIHZhbCA9IChpbnNuICYgMHg3ZikgKiA0OworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA3KSkKKyAgICAgICAgICAgICAgICB2YWwgPSAtKGludDMyX3QpdmFsOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX2kzMih0bXAsIHRtcCwgdmFsKTsKKyAgICAgICAgICAgIHN0b3JlX3JlZyhzLCAxMywgdG1wKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjogLyogc2lnbi96ZXJvIGV4dGVuZC4gICovCisgICAgICAgICAgICBBUkNIKDYpOworICAgICAgICAgICAgcmQgPSBpbnNuICYgNzsKKyAgICAgICAgICAgIHJtID0gKGluc24gPj4gMykgJiA3OworICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgcm0pOworICAgICAgICAgICAgc3dpdGNoICgoaW5zbiA+PiA2KSAmIDMpIHsKKyAgICAgICAgICAgIGNhc2UgMDogZ2VuX3N4dGgodG1wKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGdlbl9zeHRiKHRtcCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiBnZW5fdXh0aCh0bXApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogZ2VuX3V4dGIodG1wKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdG9yZV9yZWcocywgcmQsIHRtcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgMHhjOiBjYXNlIDB4ZDoKKyAgICAgICAgICAgIC8qIHB1c2gvcG9wICovCisgICAgICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgMTMpOworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA4KSkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSA0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCBpKSkKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGluc24gJiAoMSA8PCAxMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIC1vZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wMiA9IHRjZ19jb25zdF9pMzIoNCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCBpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9wICovCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBpLCB0bXApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogcHVzaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGFkdmFuY2UgdG8gdGhlIG5leHQgYWRkcmVzcy4gICovCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkX2kzMihhZGRyLCBhZGRyLCB0bXAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUQ0dWX1VOVVNFRCh0bXApOworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCA4KSkgeworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgKDEgPDwgMTEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHBvcCBwYyAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3Qgc2V0IHRoZSBwYyB1bnRpbCB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgaGFzIGNvbXBsZXRlZCAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggbHIgKi8KKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbG9hZF9yZWcocywgMTQpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pMzIoYWRkciwgYWRkciwgdG1wMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0bXAyKTsKKyAgICAgICAgICAgIGlmICgoaW5zbiAmICgxIDw8IDExKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9pMzIoYWRkciwgYWRkciwgLW9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB3cml0ZSBiYWNrIHRoZSBuZXcgc3RhY2sgcG9pbnRlciAqLworICAgICAgICAgICAgc3RvcmVfcmVnKHMsIDEzLCBhZGRyKTsKKyAgICAgICAgICAgIC8qIHNldCB0aGUgbmV3IFBDIHZhbHVlICovCisgICAgICAgICAgICBpZiAoKGluc24gJiAweDA5MDApID09IDB4MDkwMCkgeworICAgICAgICAgICAgICAgIHN0b3JlX3JlZ19mcm9tX2xvYWQoZW52LCBzLCAxNSwgdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTogY2FzZSAzOiBjYXNlIDk6IGNhc2UgMTE6IC8qIGN6YiAqLworICAgICAgICAgICAgcm0gPSBpbnNuICYgNzsKKyAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIHJtKTsKKyAgICAgICAgICAgIHMtPmNvbmRsYWJlbCA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIHMtPmNvbmRqbXAgPSAxOworICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxMSkpCisgICAgICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX2kzMihUQ0dfQ09ORF9FUSwgdG1wLCAwLCBzLT5jb25kbGFiZWwpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHX0NPTkRfTkUsIHRtcCwgMCwgcy0+Y29uZGxhYmVsKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcCk7CisgICAgICAgICAgICBvZmZzZXQgPSAoKGluc24gJiAweGY4KSA+PiAyKSB8IChpbnNuICYgMHgyMDApID4+IDM7CisgICAgICAgICAgICB2YWwgPSAodWludDMyX3Qpcy0+cGMgKyAyOworICAgICAgICAgICAgdmFsICs9IG9mZnNldDsKKyAgICAgICAgICAgIGdlbl9qbXAocywgdmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMTU6IC8qIElULCBub3AtaGludC4gICovCisgICAgICAgICAgICBpZiAoKGluc24gJiAweGYpID09IDApIHsKKyAgICAgICAgICAgICAgICBnZW5fbm9wX2hpbnQocywgKGluc24gPj4gNCkgJiAweGYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgVGhlbi4gICovCisgICAgICAgICAgICBzLT5jb25kZXhlY19jb25kID0gKGluc24gPj4gNCkgJiAweGU7CisgICAgICAgICAgICBzLT5jb25kZXhlY19tYXNrID0gaW5zbiAmIDB4MWY7CisgICAgICAgICAgICAvKiBObyBhY3R1YWwgY29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgaW5zbiwganVzdCBzZXR1cCBzdGF0ZS4gICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ZTogLyogYmtwdCAqLworICAgICAgICAgICAgQVJDSCg1KTsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb25faW5zbihzLCAyLCBFWENQX0JLUFQpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweGE6IC8qIHJldiAqLworICAgICAgICAgICAgQVJDSCg2KTsKKyAgICAgICAgICAgIHJuID0gKGluc24gPj4gMykgJiAweDc7CisgICAgICAgICAgICByZCA9IGluc24gJiAweDc7CisgICAgICAgICAgICB0bXAgPSBsb2FkX3JlZyhzLCBybik7CisgICAgICAgICAgICBzd2l0Y2ggKChpbnNuID4+IDYpICYgMykgeworICAgICAgICAgICAgY2FzZSAwOiB0Y2dfZ2VuX2Jzd2FwMzJfaTMyKHRtcCwgdG1wKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGdlbl9yZXYxNih0bXApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzogZ2VuX3JldnNoKHRtcCk7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RvcmVfcmVnKHMsIHJkLCB0bXApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA2OiAvKiBjcHMgKi8KKyAgICAgICAgICAgIEFSQ0goNik7CisgICAgICAgICAgICBpZiAoSVNfVVNFUihzKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChJU19NKGVudikpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSB0Y2dfY29uc3RfaTMyKChpbnNuICYgKDEgPDwgNCkpICE9IDApOworICAgICAgICAgICAgICAgIC8qIFBSSU1BU0sgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHRjZ19jb25zdF9pMzIoMTYpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3Y3bV9tc3IoY3B1X2VudiwgYWRkciwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoYWRkcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEZBVUxUTUFTSyAqLworICAgICAgICAgICAgICAgIGlmIChpbnNuICYgMikgeworICAgICAgICAgICAgICAgICAgICBhZGRyID0gdGNnX2NvbnN0X2kzMigxNyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdjdtX21zcihjcHVfZW52LCBhZGRyLCB0bXApOworICAgICAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodG1wKTsKKyAgICAgICAgICAgICAgICBnZW5fbG9va3VwX3RiKHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDQpKQorICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IENQU1JfQSB8IENQU1JfSSB8IENQU1JfRjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMDsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X3Bzcl9pbShzLCAoKGluc24gJiA3KSA8PCA2KSwgMCwgc2hpZnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gdW5kZWY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDEyOgorICAgIHsKKyAgICAgICAgLyogbG9hZC9zdG9yZSBtdWx0aXBsZSAqLworICAgICAgICBUQ0d2IGxvYWRlZF92YXI7CisgICAgICAgIFRDR1ZfVU5VU0VEKGxvYWRlZF92YXIpOworICAgICAgICBybiA9IChpbnNuID4+IDgpICYgMHg3OworICAgICAgICBhZGRyID0gbG9hZF9yZWcocywgcm4pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbG9hZCAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSBnZW5fbGQzMihhZGRyLCBJU19VU0VSKHMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gcm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZF92YXIgPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV9yZWcocywgaSwgdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlICovCisgICAgICAgICAgICAgICAgICAgIHRtcCA9IGxvYWRfcmVnKHMsIGkpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3QzMih0bXAsIGFkZHIsIElTX1VTRVIocykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBhZHZhbmNlIHRvIHRoZSBuZXh0IGFkZHJlc3MgKi8KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfaTMyKGFkZHIsIGFkZHIsIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoaW5zbiAmICgxIDw8IHJuKSkgPT0gMCkgeworICAgICAgICAgICAgLyogYmFzZSByZWcgbm90IGluIGxpc3Q6IGJhc2UgcmVnaXN0ZXIgd3JpdGViYWNrICovCisgICAgICAgICAgICBzdG9yZV9yZWcocywgcm4sIGFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogYmFzZSByZWcgaW4gbGlzdDogaWYgbG9hZCwgY29tcGxldGUgaXQgbm93ICovCisgICAgICAgICAgICBpZiAoaW5zbiAmICgxIDw8IDExKSkgeworICAgICAgICAgICAgICAgIHN0b3JlX3JlZyhzLCBybiwgbG9hZGVkX3Zhcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihhZGRyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAxMzoKKyAgICAgICAgLyogY29uZGl0aW9uYWwgYnJhbmNoIG9yIHN3aSAqLworICAgICAgICBjb25kID0gKGluc24gPj4gOCkgJiAweGY7CisgICAgICAgIGlmIChjb25kID09IDB4ZSkKKyAgICAgICAgICAgIGdvdG8gdW5kZWY7CisKKyAgICAgICAgaWYgKGNvbmQgPT0gMHhmKSB7CisgICAgICAgICAgICAvKiBzd2kgKi8KKyAgICAgICAgICAgIGdlbl9zZXRfcGNfaW0ocy0+cGMpOworICAgICAgICAgICAgcy0+aXNfam1wID0gRElTQVNfU1dJOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZ2VuZXJhdGUgYSBjb25kaXRpb25hbCBqdW1wIHRvIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgcy0+Y29uZGxhYmVsID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICBnZW5fdGVzdF9jYyhjb25kIF4gMSwgcy0+Y29uZGxhYmVsKTsKKyAgICAgICAgcy0+Y29uZGptcCA9IDE7CisKKyAgICAgICAgLyoganVtcCB0byB0aGUgb2Zmc2V0ICovCisgICAgICAgIHZhbCA9ICh1aW50MzJfdClzLT5wYyArIDI7CisgICAgICAgIG9mZnNldCA9ICgoaW50MzJfdClpbnNuIDw8IDI0KSA+PiAyNDsKKyAgICAgICAgdmFsICs9IG9mZnNldCA8PCAxOworICAgICAgICBnZW5fam1wKHMsIHZhbCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxNDoKKyAgICAgICAgaWYgKGluc24gJiAoMSA8PCAxMSkpIHsKKyAgICAgICAgICAgIGlmIChkaXNhc190aHVtYjJfaW5zbihlbnYsIHMsIGluc24pKQorICAgICAgICAgICAgICBnb3RvIHVuZGVmMzI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiB1bmNvbmRpdGlvbmFsIGJyYW5jaCAqLworICAgICAgICB2YWwgPSAodWludDMyX3Qpcy0+cGM7CisgICAgICAgIG9mZnNldCA9ICgoaW50MzJfdClpbnNuIDw8IDIxKSA+PiAyMTsKKyAgICAgICAgdmFsICs9IChvZmZzZXQgPDwgMSkgKyAyOworICAgICAgICBnZW5fam1wKHMsIHZhbCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAxNToKKyAgICAgICAgaWYgKGRpc2FzX3RodW1iMl9pbnNuKGVudiwgcywgaW5zbikpCisgICAgICAgICAgICBnb3RvIHVuZGVmMzI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit1bmRlZjMyOgorICAgIGdlbl9leGNlcHRpb25faW5zbihzLCA0LCBFWENQX1VERUYpOworICAgIHJldHVybjsKK2lsbGVnYWxfb3A6Cit1bmRlZjoKKyAgICBnZW5fZXhjZXB0aW9uX2luc24ocywgMiwgRVhDUF9VREVGKTsKK30KKworc3RhdGljIHZvaWQKK2dlbl9wcm9maWxlQkIodm9pZCAqIHRiKQoreworI2lmIEhPU1RfTE9OR19CSVRTID09IDMyCisgICAgVENHdl9pMzIgIHRtcFRiICA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgIHRjZ19nZW5fbW92aV9pMzIodG1wVGIsICAoaW50MzJfdCl0Yik7CisgICAgZ2VuX2hlbHBlcl9wcm9maWxlQkIodG1wVGIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHRtcFRiKTsKKyNlbGlmIEhPU1RfTE9OR19CSVRTID09IDY0CisgICAgVENHdl9pNjQgIHRtcFRiICA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgIHRjZ19nZW5fbW92aV9pNjQodG1wVGIsICAoaW50NjRfdCl0Yik7CisgICAgZ2VuX2hlbHBlcl9wcm9maWxlQkIodG1wVGIpOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHRtcFRiKTsKKyNlbmRpZgorfQorCisvKiBnZW5lcmF0ZSBpbnRlcm1lZGlhdGUgY29kZSBpbiBnZW5fb3BjX2J1ZiBhbmQgZ2VuX29wcGFyYW1fYnVmIGZvcgorICAgYmFzaWMgYmxvY2sgJ3RiJy4gSWYgc2VhcmNoX3BjIGlzIFRSVUUsIGFsc28gZ2VuZXJhdGUgUEMKKyAgIGluZm9ybWF0aW9uIGZvciBlYWNoIGludGVybWVkaWF0ZSBpbnN0cnVjdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoQ1BVQVJNU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb25CbG9jayAqdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWFyY2hfcGMpCit7CisgICAgRGlzYXNDb250ZXh0IGRjMSwgKmRjID0gJmRjMTsKKyAgICBDUFVCcmVha3BvaW50ICpicDsKKyAgICB1aW50MTZfdCAqZ2VuX29wY19lbmQ7CisgICAgaW50IGosIGxqOworICAgIHRhcmdldF91bG9uZyBwY19zdGFydDsKKyAgICB1aW50MzJfdCBuZXh0X3BhZ2Vfc3RhcnQ7CisgICAgaW50IG51bV9pbnNuczsKKyAgICBpbnQgbWF4X2luc25zOworCisgICAgLyogZ2VuZXJhdGUgaW50ZXJtZWRpYXRlIGNvZGUgKi8KKyAgICBwY19zdGFydCA9IHRiLT5wYzsKKworICAgIGRjLT50YiA9IHRiOworCisgICAgZ2VuX29wY19lbmQgPSB0Y2dfY3R4Lmdlbl9vcGNfYnVmICsgT1BDX01BWF9TSVpFOworCisgICAgZGMtPmlzX2ptcCA9IERJU0FTX05FWFQ7CisgICAgZGMtPnBjID0gcGNfc3RhcnQ7CisgICAgZGMtPnNpbmdsZXN0ZXBfZW5hYmxlZCA9IEVOVl9HRVRfQ1BVKGVudiktPnNpbmdsZXN0ZXBfZW5hYmxlZDsKKyAgICBkYy0+Y29uZGptcCA9IDA7CisgICAgZGMtPnRodW1iID0gQVJNX1RCRkxBR19USFVNQih0Yi0+ZmxhZ3MpOworICAgIGRjLT5jb25kZXhlY19tYXNrID0gKEFSTV9UQkZMQUdfQ09OREVYRUModGItPmZsYWdzKSAmIDB4ZikgPDwgMTsKKyAgICBkYy0+Y29uZGV4ZWNfY29uZCA9IEFSTV9UQkZMQUdfQ09OREVYRUModGItPmZsYWdzKSA+PiA0OworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgZGMtPnVzZXIgPSAoQVJNX1RCRkxBR19QUklWKHRiLT5mbGFncykgPT0gMCk7CisjZW5kaWYKKyAgICBkYy0+dmZwX2VuYWJsZWQgPSBBUk1fVEJGTEFHX1ZGUEVOKHRiLT5mbGFncyk7CisgICAgZGMtPnZlY19sZW4gPSBBUk1fVEJGTEFHX1ZFQ0xFTih0Yi0+ZmxhZ3MpOworICAgIGRjLT52ZWNfc3RyaWRlID0gQVJNX1RCRkxBR19WRUNTVFJJREUodGItPmZsYWdzKTsKKyAgICBjcHVfRjBzID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIGNwdV9GMXMgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgY3B1X0YwZCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICBjcHVfRjFkID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgIGNwdV9WMCA9IGNwdV9GMGQ7CisgICAgY3B1X1YxID0gY3B1X0YxZDsKKyAgICAvKiBGSVhNRTogY3B1X00wIGNhbiBwcm9iYWJseSBiZSB0aGUgc2FtZSBhcyBjcHVfVjAuICAqLworICAgIGNwdV9NMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICBuZXh0X3BhZ2Vfc3RhcnQgPSAocGNfc3RhcnQgJiBUQVJHRVRfUEFHRV9NQVNLKSArIFRBUkdFVF9QQUdFX1NJWkU7CisgICAgbGogPSAtMTsKKyAgICBudW1faW5zbnMgPSAwOworICAgIG1heF9pbnNucyA9IHRiLT5jZmxhZ3MgJiBDRl9DT1VOVF9NQVNLOworICAgIGlmIChtYXhfaW5zbnMgPT0gMCkKKyAgICAgICAgbWF4X2luc25zID0gQ0ZfQ09VTlRfTUFTSzsKKworICAgIGdlbl9pY291bnRfc3RhcnQoKTsKKworICAgIGlmIChjb2RlX3Byb2ZpbGVfcmVjb3JkX2Z1bmMgIT0gTlVMTCAmJiBjb2RlX3Byb2ZpbGVfZGlybmFtZSAhPSBOVUxMKQorICAgICAgICBnZW5fcHJvZmlsZUJCKHRiKTsKKworICAgIHRjZ19jbGVhcl90ZW1wX2NvdW50KCk7CisKKyAgICAvKiBBIG5vdGUgb24gaGFuZGxpbmcgb2YgdGhlIGNvbmRleGVjIChJVCkgYml0czoKKyAgICAgKgorICAgICAqIFdlIHdhbnQgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGhhdmluZyB0byB3cml0ZSB0aGUgdXBkYXRlZCBjb25kZXhlYworICAgICAqIGJpdHMgYmFjayB0byB0aGUgQ1BVQVJNU3RhdGUgZm9yIGV2ZXJ5IGluc3RydWN0aW9uIGluIGFuIElUIGJsb2NrLiBTbzoKKyAgICAgKiAoMSkgaWYgdGhlIGNvbmRleGVjIGJpdHMgYXJlIG5vdCBhbHJlYWR5IHplcm8gdGhlbiB3ZSB3cml0ZQorICAgICAqIHplcm8gYmFjayBpbnRvIHRoZSBDUFVBUk1TdGF0ZSBub3cuIFRoaXMgYXZvaWRzIGNvbXBsaWNhdGlvbnMgdHJ5aW5nCisgICAgICogdG8gZG8gaXQgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suIChGb3IgZXhhbXBsZSBpZiB3ZSBkb24ndCBkbyB0aGlzCisgICAgICogaXQncyBoYXJkIHRvIGlkZW50aWZ5IHdoZXRoZXIgd2UgY2FuIHNhZmVseSBza2lwIHdyaXRpbmcgY29uZGV4ZWMKKyAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBUQiwgd2hpY2ggd2UgZGVmaW5pdGVseSB3YW50IHRvIGRvIGZvciB0aGUgY2FzZQorICAgICAqIHdoZXJlIGEgVEIgZG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSBJVCBzdGF0ZSBhdCBhbGwuKQorICAgICAqICgyKSBpZiB3ZSBhcmUgZ29pbmcgdG8gbGVhdmUgdGhlIFRCIHRoZW4gd2UgY2FsbCBnZW5fc2V0X2NvbmRleGVjKCkKKyAgICAgKiB3aGljaCB3aWxsIHdyaXRlIHRoZSBjb3JyZWN0IHZhbHVlIGludG8gQ1BVQVJNU3RhdGUgaWYgemVybyBpcyB3cm9uZy4KKyAgICAgKiBUaGlzIGlzIGRvbmUgYm90aCBmb3IgbGVhdmluZyB0aGUgVEIgYXQgdGhlIGVuZCwgYW5kIGZvciBsZWF2aW5nCisgICAgICogaXQgYmVjYXVzZSBvZiBhbiBleGNlcHRpb24gd2Uga25vdyB3aWxsIGhhcHBlbiwgd2hpY2ggaXMgZG9uZSBpbgorICAgICAqIGdlbl9leGNlcHRpb25faW5zbigpLiBUaGUgbGF0dGVyIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG5lZWQgdG8KKyAgICAgKiBsZWF2ZSB0aGUgVEIgd2l0aCB0aGUgUEMvSVQgc3RhdGUganVzdCBwcmlvciB0byBleGVjdXRpb24gb2YgdGhlCisgICAgICogaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSBleGNlcHRpb24uCisgICAgICogKDMpIGlmIHdlIGxlYXZlIHRoZSBUQiB1bmV4cGVjdGVkbHkgKGVnIGEgZGF0YSBhYm9ydCBvbiBhIGxvYWQpCisgICAgICogdGhlbiB0aGUgQ1BVQVJNU3RhdGUgd2lsbCBiZSB3cm9uZyBhbmQgd2UgbmVlZCB0byByZXNldCBpdC4KKyAgICAgKiBUaGlzIGlzIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHJlc3RvcmF0aW9uIG9mIHRoZQorICAgICAqIFBDIGluIHRoZXNlIHNpdHVhdGlvbnM6IHdlIHdpbGwgYmUgY2FsbGVkIGFnYWluIHdpdGggc2VhcmNoX3BjPTEKKyAgICAgKiBhbmQgZ2VuZXJhdGUgYSBtYXBwaW5nIG9mIHRoZSBjb25kZXhlYyBiaXRzIGZvciBlYWNoIFBDIGluCisgICAgICogZ2VuX29wY19jb25kZXhlY19iaXRzW10uIHJlc3RvcmVfc3RhdGVfdG9fb3BjKCkgdGhlbiB1c2VzCisgICAgICogdGhpcyB0byByZXN0b3JlIHRoZSBjb25kZXhlYyBiaXRzLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIHJlYWQgdGhlIGNvbmRleGVjCisgICAgICogYml0cywgYW5kIG5vbmUgd2hpY2ggY2FuIHdyaXRlIG5vbi1zdGF0aWMgdmFsdWVzIHRvIHRoZW0sIHNvCisgICAgICogd2UgZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHdoZXRoZXIgQ1BVQVJNU3RhdGUgaXMgY29ycmVjdCBpbiB0aGUKKyAgICAgKiBtaWRkbGUgb2YgYSBUQi4KKyAgICAgKi8KKworICAgIC8qIFJlc2V0IHRoZSBjb25kaXRpb25hbCBleGVjdXRpb24gYml0cyBpbW1lZGlhdGVseS4gVGhpcyBhdm9pZHMKKyAgICAgICBjb21wbGljYXRpb25zIHRyeWluZyB0byBkbyBpdCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4gICovCisgICAgaWYgKGRjLT5jb25kZXhlY19tYXNrIHx8IGRjLT5jb25kZXhlY19jb25kKQorICAgICAgeworICAgICAgICBUQ0d2IHRtcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0bXAsIDApOworICAgICAgICBzdG9yZV9jcHVfZmllbGQodG1wLCBjb25kZXhlY19iaXRzKTsKKyAgICAgIH0KKyAgICBkbyB7CisjaWZkZWYgQ09ORklHX1VTRVJfT05MWQorICAgICAgICAvKiBJbnRlcmNlcHQganVtcCB0byB0aGUgbWFnaWMga2VybmVsIHBhZ2UuICAqLworICAgICAgICBpZiAoZGMtPnBjID49IDB4ZmZmZjAwMDApIHsKKyAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBnZXQgaGVyZSB2aWEgYSBqdW1wLCBzbyBrbm93IHdlIGFyZSBub3QgaW4gYQorICAgICAgICAgICAgICAgY29uZGl0aW9uYWwgZXhlY3V0aW9uIGJsb2NrLiAgKi8KKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9LRVJORUxfVFJBUCk7CisgICAgICAgICAgICBkYy0+aXNfam1wID0gRElTQVNfVVBEQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChkYy0+cGMgPj0gMHhmZmZmZmZmMCAmJiBJU19NKGVudikpIHsKKyAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBnZXQgaGVyZSB2aWEgYSBqdW1wLCBzbyBrbm93IHdlIGFyZSBub3QgaW4gYQorICAgICAgICAgICAgICAgY29uZGl0aW9uYWwgZXhlY3V0aW9uIGJsb2NrLiAgKi8KKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9FWENFUFRJT05fRVhJVCk7CisgICAgICAgICAgICBkYy0+aXNfam1wID0gRElTQVNfVVBEQVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmICh1bmxpa2VseSghUVRBSUxRX0VNUFRZKCZlbnYtPmJyZWFrcG9pbnRzKSkpIHsKKyAgICAgICAgICAgIFFUQUlMUV9GT1JFQUNIKGJwLCAmZW52LT5icmVha3BvaW50cywgZW50cnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnAtPnBjID09IGRjLT5wYykgeworICAgICAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uX2luc24oZGMsIDAsIEVYQ1BfREVCVUcpOworICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlIFBDIHNvIHRoYXQgY2xlYXJpbmcgdGhlIGJyZWFrcG9pbnQgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlIHRoaXMgVEIuICAqLworICAgICAgICAgICAgICAgICAgICBkYy0+cGMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lX2dlbmVyYXRpbmc7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWFyY2hfcGMpIHsKKyAgICAgICAgICAgIGogPSB0Y2dfY3R4Lmdlbl9vcGNfcHRyIC0gdGNnX2N0eC5nZW5fb3BjX2J1ZjsKKyAgICAgICAgICAgIGlmIChsaiA8IGopIHsKKyAgICAgICAgICAgICAgICBsaisrOworICAgICAgICAgICAgICAgIHdoaWxlIChsaiA8IGopCisgICAgICAgICAgICAgICAgICAgIHRjZ19jdHguZ2VuX29wY19pbnN0cl9zdGFydFtsaisrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfcGNbbGpdID0gZGMtPnBjOworICAgICAgICAgICAgZ2VuX29wY19jb25kZXhlY19iaXRzW2xqXSA9IChkYy0+Y29uZGV4ZWNfY29uZCA8PCA0KSB8IChkYy0+Y29uZGV4ZWNfbWFzayA+PiAxKTsKKyAgICAgICAgICAgIHRjZ19jdHguZ2VuX29wY19pbnN0cl9zdGFydFtsal0gPSAxOworICAgICAgICAgICAgdGNnX2N0eC5nZW5fb3BjX2ljb3VudFtsal0gPSBudW1faW5zbnM7CisgICAgICAgIH0KKworICAgICAgICBpZiAobnVtX2luc25zICsgMSA9PSBtYXhfaW5zbnMgJiYgKHRiLT5jZmxhZ3MgJiBDRl9MQVNUX0lPKSkKKyAgICAgICAgICAgIGdlbl9pb19zdGFydCgpOworCisgICAgICAgIGlmICh1bmxpa2VseShxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9PUCkpKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2RlYnVnX2luc25fc3RhcnQoZGMtPnBjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYy0+dGh1bWIpIHsKKyAgICAgICAgICAgIGRpc2FzX3RodW1iX2luc24oZW52LCBkYyk7CisgICAgICAgICAgICBpZiAoZGMtPmNvbmRleGVjX21hc2spIHsKKyAgICAgICAgICAgICAgICBkYy0+Y29uZGV4ZWNfY29uZCA9IChkYy0+Y29uZGV4ZWNfY29uZCAmIDB4ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoKGRjLT5jb25kZXhlY19tYXNrID4+IDQpICYgMSk7CisgICAgICAgICAgICAgICAgZGMtPmNvbmRleGVjX21hc2sgPSAoZGMtPmNvbmRleGVjX21hc2sgPDwgMSkgJiAweDFmOworICAgICAgICAgICAgICAgIGlmIChkYy0+Y29uZGV4ZWNfbWFzayA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRjLT5jb25kZXhlY19jb25kID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNhc19hcm1faW5zbihlbnYsIGRjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYy0+Y29uZGptcCAmJiAhZGMtPmlzX2ptcCkgeworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChkYy0+Y29uZGxhYmVsKTsKKyAgICAgICAgICAgIGRjLT5jb25kam1wID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0Y2dfY2hlY2tfdGVtcF9jb3VudCgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRDRyB0ZW1wb3JhcnkgbGVhayBiZWZvcmUgJTA4eFxuIiwgZGMtPnBjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRyYW5zbGF0aW9uIHN0b3BzIHdoZW4gYSBjb25kaXRpb25hbCBicmFuY2ggaXMgZW5jb3VudGVyZWQuCisgICAgICAgICAqIE90aGVyd2lzZSB0aGUgc3Vic2VxdWVudCBjb2RlIGNvdWxkIGdldCB0cmFuc2xhdGVkIHNldmVyYWwgdGltZXMuCisgICAgICAgICAqIEFsc28gc3RvcCB0cmFuc2xhdGlvbiB3aGVuIGEgcGFnZSBib3VuZGFyeSBpcyByZWFjaGVkLiAgVGhpcworICAgICAgICAgKiBlbnN1cmVzIHByZWZldGNoIGFib3J0cyBvY2N1ciBhdCB0aGUgcmlnaHQgcGxhY2UuICAqLworICAgICAgICBudW1faW5zbnMgKys7CisgICAgfSB3aGlsZSAoIWRjLT5pc19qbXAgJiYgdGNnX2N0eC5nZW5fb3BjX3B0ciA8IGdlbl9vcGNfZW5kICYmCisgICAgICAgICAgICAgIUVOVl9HRVRfQ1BVKGVudiktPnNpbmdsZXN0ZXBfZW5hYmxlZCAmJgorICAgICAgICAgICAgICFzaW5nbGVzdGVwICYmCisgICAgICAgICAgICAgZGMtPnBjIDwgbmV4dF9wYWdlX3N0YXJ0ICYmCisgICAgICAgICAgICAgbnVtX2luc25zIDwgbWF4X2luc25zKTsKKworICAgIGlmICh0Yi0+Y2ZsYWdzICYgQ0ZfTEFTVF9JTykgeworICAgICAgICBpZiAoZGMtPmNvbmRqbXApIHsKKyAgICAgICAgICAgIC8qIEZJWE1FOiAgVGhpcyBjYW4gdGhlb3JldGljYWxseSBoYXBwZW4gd2l0aCBzZWxmLW1vZGlmeWluZworICAgICAgICAgICAgICAgY29kZS4gICovCisgICAgICAgICAgICBjcHVfYWJvcnQoZW52LCAiSU8gb24gY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX2lvX2VuZCgpOworICAgIH0KKworICAgIC8qIEF0IHRoaXMgc3RhZ2UgZGMtPmNvbmRqbXAgd2lsbCBvbmx5IGJlIHNldCB3aGVuIHRoZSBza2lwcGVkCisgICAgICAgaW5zdHJ1Y3Rpb24gd2FzIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9yIHRyYXAsIGFuZCB0aGUgUEMgaGFzCisgICAgICAgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICAqLworICAgIGlmICh1bmxpa2VseShFTlZfR0VUX0NQVShlbnYpLT5zaW5nbGVzdGVwX2VuYWJsZWQpKSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgcGMgaXMgdXBkYXRlZCwgYW5kIHJhaXNlIGEgZGVidWcgZXhjZXB0aW9uLiAgKi8KKyAgICAgICAgaWYgKGRjLT5jb25kam1wKSB7CisgICAgICAgICAgICBnZW5fc2V0X2NvbmRleGVjKGRjKTsKKyAgICAgICAgICAgIGlmIChkYy0+aXNfam1wID09IERJU0FTX1NXSSkgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9TV0kpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkYy0+aXNfam1wID09IERJU0FTX1NNQykgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9TTUMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKEVYQ1BfREVCVUcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChkYy0+Y29uZGxhYmVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGMtPmNvbmRqbXAgfHwgIWRjLT5pc19qbXApIHsKKyAgICAgICAgICAgIGdlbl9zZXRfcGNfaW0oZGMtPnBjKTsKKyAgICAgICAgICAgIGRjLT5jb25kam1wID0gMDsKKyAgICAgICAgfQorICAgICAgICBnZW5fc2V0X2NvbmRleGVjKGRjKTsKKyAgICAgICAgaWYgKGRjLT5pc19qbXAgPT0gRElTQVNfU1dJICYmICFkYy0+Y29uZGptcCkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihFWENQX1NXSSk7CisgICAgICAgIH0gZWxzZSBpZiAoZGMtPmlzX2ptcCA9PSBESVNBU19TTUMgJiYgIWRjLT5jb25kam1wKSB7CisgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKEVYQ1BfU01DKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBTaW5nbGUgc3RlcHBpbmcgYSBXRkkgaW5zbiB3aWxsIG5vdCBoYWx0CisgICAgICAgICAgICAgICB0aGUgQ1BVLiAgKi8KKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9ERUJVRyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXaGlsZSBicmFuY2hlcyBtdXN0IGFsd2F5cyBvY2N1ciBhdCB0aGUgZW5kIG9mIGFuIElUIGJsb2NrLAorICAgICAgICAgICB0aGVyZSBhcmUgYSBmZXcgb3RoZXIgdGhpbmdzIHRoYXQgY2FuIGNhdXNlIHVzIHRvIHRlcm1pbmF0ZQorICAgICAgICAgICB0aGUgVEIgaW4gdGhlIG1pZGRlbCBvZiBhbiBJVCBibG9jazoKKyAgICAgICAgICAgIC0gRXhjZXB0aW9uIGdlbmVyYXRpbmcgaW5zdHJ1Y3Rpb25zIChia3B0LCBzd2ksIHVuZGVmaW5lZCkuCisgICAgICAgICAgICAtIFBhZ2UgYm91bmRhcmllcy4KKyAgICAgICAgICAgIC0gSGFyZHdhcmUgd2F0Y2hwb2ludHMuCisgICAgICAgICAgIEhhcmR3YXJlIGJyZWFrcG9pbnRzIGhhdmUgYWxyZWFkeSBiZWVuIGhhbmRsZWQgYW5kIHNraXAgdGhpcyBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgZ2VuX3NldF9jb25kZXhlYyhkYyk7CisgICAgICAgIHN3aXRjaChkYy0+aXNfam1wKSB7CisgICAgICAgIGNhc2UgRElTQVNfTkVYVDoKKyAgICAgICAgICAgIGdlbl9nb3RvX3RiKGRjLCAxLCBkYy0+cGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgRElTQVNfSlVNUDoKKyAgICAgICAgY2FzZSBESVNBU19VUERBVEU6CisgICAgICAgICAgICAvKiBpbmRpY2F0ZSB0aGF0IHRoZSBoYXNoIHRhYmxlIG11c3QgYmUgdXNlZCB0byBmaW5kIHRoZSBuZXh0IFRCICovCisgICAgICAgICAgICB0Y2dfZ2VuX2V4aXRfdGIoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESVNBU19UQl9KVU1QOgorICAgICAgICAgICAgLyogbm90aGluZyBtb3JlIHRvIGdlbmVyYXRlICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESVNBU19XRkk6CisgICAgICAgICAgICBnZW5faGVscGVyX3dmaShjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERJU0FTX1NXSToKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24oRVhDUF9TV0kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElTQVNfU01DOgorICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihFWENQX1NNQyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGMtPmNvbmRqbXApIHsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwoZGMtPmNvbmRsYWJlbCk7CisgICAgICAgICAgICBnZW5fc2V0X2NvbmRleGVjKGRjKTsKKyAgICAgICAgICAgIGdlbl9nb3RvX3RiKGRjLCAxLCBkYy0+cGMpOworICAgICAgICAgICAgZGMtPmNvbmRqbXAgPSAwOworICAgICAgICB9CisgICAgfQorCitkb25lX2dlbmVyYXRpbmc6CisgICAgZ2VuX2ljb3VudF9lbmQodGIsIG51bV9pbnNucyk7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIgPSBJTkRFWF9vcF9lbmQ7CisKKyNpZmRlZiBERUJVR19ESVNBUworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9JTl9BU00pKSB7CisgICAgICAgIHFlbXVfbG9nKCItLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgcWVtdV9sb2coIklOOiAlc1xuIiwgbG9va3VwX3N5bWJvbChwY19zdGFydCkpOworICAgICAgICBsb2dfdGFyZ2V0X2Rpc2FzKGVudiwgcGNfc3RhcnQsIGRjLT5wYyAtIHBjX3N0YXJ0LCBkYy0+dGh1bWIpOworICAgICAgICBxZW11X2xvZygiXG4iKTsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoc2VhcmNoX3BjKSB7CisgICAgICAgIGogPSB0Y2dfY3R4Lmdlbl9vcGNfcHRyIC0gdGNnX2N0eC5nZW5fb3BjX2J1ZjsKKyAgICAgICAgbGorKzsKKyAgICAgICAgd2hpbGUgKGxqIDw9IGopCisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfaW5zdHJfc3RhcnRbbGorK10gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRiLT5zaXplID0gZGMtPnBjIC0gcGNfc3RhcnQ7CisgICAgICAgIHRiLT5pY291bnQgPSBudW1faW5zbnM7CisgICAgfQorfQorCit2b2lkIGdlbl9pbnRlcm1lZGlhdGVfY29kZShDUFVBUk1TdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoZW52LCB0YiwgMCk7Cit9CisKK3ZvaWQgZ2VuX2ludGVybWVkaWF0ZV9jb2RlX3BjKENQVUFSTVN0YXRlICplbnYsIFRyYW5zbGF0aW9uQmxvY2sgKnRiKQoreworICAgIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9pbnRlcm5hbChlbnYsIHRiLCAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9tb2RlX25hbWVzWzE2XSA9IHsKKyAgInVzciIsICJmaXEiLCAiaXJxIiwgInN2YyIsICI/Pz8iLCAiPz8/IiwgIj8/PyIsICJhYnQiLAorICAiPz8/IiwgIj8/PyIsICI/Pz8iLCAidW5kIiwgIj8/PyIsICI/Pz8iLCAiPz8/IiwgInN5cyIKK307CisKK3ZvaWQgY3B1X2R1bXBfc3RhdGUoQ1BVU3RhdGUgKmNwdSwgRklMRSAqZiwgZnByaW50Zl9mdW5jdGlvbiBjcHVfZnByaW50ZiwKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIENQVUFSTVN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisgICAgaW50IGk7CisjaWYgMAorICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgZmxvYXQgczsKKyAgICB9IHMwLCBzMTsKKyAgICBDUFVfRG91YmxlVSBkOworICAgIC8qID8/PyBUaGlzIGFzc3VtZXMgZmxvYXQ2NCBhbmQgZG91YmxlIGhhdmUgdGhlIHNhbWUgbGF5b3V0LgorICAgICAgIE9oIHdlbGwsIGl0J3Mgb25seSBkZWJ1ZyBkdW1wcy4gICovCisgICAgdW5pb24geworICAgICAgICBmbG9hdDY0IGY2NDsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgfSBkMDsKKyNlbmRpZgorICAgIHVpbnQzMl90IHBzcjsKKworICAgIGZvcihpPTA7aTwxNjtpKyspIHsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIlIlMDJkPSUwOHgiLCBpLCBlbnYtPnJlZ3NbaV0pOworICAgICAgICBpZiAoKGkgJSA0KSA9PSAzKQorICAgICAgICAgICAgY3B1X2ZwcmludGYoZiwgIlxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNwdV9mcHJpbnRmKGYsICIgIik7CisgICAgfQorICAgIHBzciA9IGNwc3JfcmVhZChlbnYpOworICAgIGNwdV9mcHJpbnRmKGYsICJQU1I9JTA4eCAlYyVjJWMlYyAlYyAlcyVkXG4iLAorICAgICAgICAgICAgICAgIHBzciwKKyAgICAgICAgICAgICAgICBwc3IgJiAoMSA8PCAzMSkgPyAnTicgOiAnLScsCisgICAgICAgICAgICAgICAgcHNyICYgKDEgPDwgMzApID8gJ1onIDogJy0nLAorICAgICAgICAgICAgICAgIHBzciAmICgxIDw8IDI5KSA/ICdDJyA6ICctJywKKyAgICAgICAgICAgICAgICBwc3IgJiAoMSA8PCAyOCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICAgICAgcHNyICYgQ1BTUl9UID8gJ1QnIDogJ0EnLAorICAgICAgICAgICAgICAgIGNwdV9tb2RlX25hbWVzW3BzciAmIDB4Zl0sIChwc3IgJiAweDEwKSA/IDMyIDogMjYpOworCisjaWYgMAorICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGQuZCA9IGVudi0+dmZwLnJlZ3NbaV07CisgICAgICAgIHMwLmkgPSBkLmwubG93ZXI7CisgICAgICAgIHMxLmkgPSBkLmwudXBwZXI7CisgICAgICAgIGQwLmY2NCA9IGQuZDsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgInMlMDJkPSUwOHgoJThnKSBzJTAyZD0lMDh4KCU4ZykgZCUwMmQ9JTA4eCUwOHgoJThnKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSAqIDIsIChpbnQpczAuaSwgczAucywKKyAgICAgICAgICAgICAgICAgICAgaSAqIDIgKyAxLCAoaW50KXMxLmksIHMxLnMsCisgICAgICAgICAgICAgICAgICAgIGksIChpbnQpKHVpbnQzMl90KWQubC51cHBlciwgKGludCkodWludDMyX3QpZC5sLmxvd2VyLAorICAgICAgICAgICAgICAgICAgICBkMC5kKTsKKyAgICB9CisgICAgY3B1X2ZwcmludGYoZiwgIkZQU0NSOiAlMDh4XG4iLCAoaW50KWVudi0+dmZwLnhyZWdzW0FSTV9WRlBfRlBTQ1JdKTsKKyNlbmRpZgorfQorCit2b2lkIHJlc3RvcmVfc3RhdGVfdG9fb3BjKENQVUFSTVN0YXRlICplbnYsIFRyYW5zbGF0aW9uQmxvY2sgKnRiLCBpbnQgcGNfcG9zKQoreworICAgIGVudi0+cmVnc1sxNV0gPSB0Y2dfY3R4Lmdlbl9vcGNfcGNbcGNfcG9zXTsKKyAgICBlbnYtPmNvbmRleGVjX2JpdHMgPSBnZW5fb3BjX2NvbmRleGVjX2JpdHNbcGNfcG9zXTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvVE9ETyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjcxZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9UT0RPCkBAIC0wLDAgKzEsMzMgQEAKK0NvcnJlY3RuZXNzIGlzc3VlczoKKworLSBzb21lIGVmbGFncyBtYW5pcHVsYXRpb24gaW5jb3JyZWN0bHkgcmVzZXQgdGhlIGJpdCAweDIuCistIFNWTTogdGVzdCwgY3B1IHNhdmUvcmVzdG9yZSwgU01NIHNhdmUvcmVzdG9yZS4gCistIHg4Nl82NDogbGNhbGwvbGptcCBpbnRlbC9hbWQgZGlmZmVyZW5jZXMgPworLSBiZXR0ZXIgY29kZSBmZXRjaCAoZGlmZmVyZW50IGV4Y2VwdGlvbiBoYW5kbGluZyArIENTLmxpbWl0IHN1cHBvcnQpCistIHVzZXIva2VybmVsIFBVU0hML1BPUEwgaW4gaGVscGVyLmMKKy0gYWRkIG1pc3NpbmcgY3B1aWQgdGVzdHMKKy0gcmV0dXJuIFVEIGV4Y2VwdGlvbiBpZiBMT0NLIHByZWZpeCBpbmNvcnJlY3RseSB1c2VkCistIHRlc3QgbGR0IGxpbWl0IDwgNyA/CistIGZpeCBzb21lIDE2IGJpdCBzcCBwdXNoL3BvcCBvdmVyZmxvdyAocHVzaGEvcG9wYSwgbGNhbGwgbHJldCkKKy0gZnVsbCBzdXBwb3J0IG9mIHNlZ21lbnQgbGltaXQvcmlnaHRzIAorLSBmdWxsIHg4NyBleGNlcHRpb24gc3VwcG9ydAorLSBpbXByb3ZlIHg4NyBiaXQgZXhhY3RuZXNzICh1c2UgYm9jaHMgY29kZSA/KQorLSBEUnggcmVnaXN0ZXIgc3VwcG9ydAorLSBDUjAuQUMgZW11bGF0aW9uCistIFNTRSBhbGlnbm1lbnQgY2hlY2tzCistIGZpeCBTU0UgbWluL21heCB3aXRoIG5hbnMKKworT3B0aW1pemF0aW9ucy9GZWF0dXJlczoKKworLSBhZGQgU1ZNIG5lc3RlZCBwYWdpbmcgc3VwcG9ydAorLSBhZGQgVk1YIHN1cHBvcnQKKy0gYWRkIEFWWCBzdXBwb3J0CistIGFkZCBTU0U1IHN1cHBvcnQKKy0gZnhzYXZlL2Z4cnN0b3IgQU1EIGV4dGVuc2lvbnMKKy0gaW1wcm92ZSBtb25pdG9yL213YWl0IHN1cHBvcnQKKy0gZmFzdGVyIEVGTEFHUyB1cGRhdGU6IGNvbnNpZGVyIFNaQVAsIEMsIE8gY2FuIGJlIHVwZGF0ZWQgc2VwYXJhdGVseQorICB3aXRoIGEgYml0IGZpZWxkIGluIENDX09QIGFuZCBtb3JlIHN0YXRlIHZhcmlhYmxlcy4KKy0gZXZhbHVhdGUgeDg3IHN0YWNrIHBvaW50ZXIgc3RhdGljYWxseQorLSBmaW5kIGEgd2F5IHRvIGF2b2lkIHRyYW5zbGF0aW5nIHNldmVyYWwgdGltZSB0aGUgc2FtZSBUQiBpZiBDUjAuVFMKKyAgaXMgc2V0IG9yIG5vdC4KKy0gbW92ZSBrcWVtdSBzdXBwb3J0IG91dHNpZGUgdGFyZ2V0LWkzODYuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2NjX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9jY19oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWM5YzI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9jY19oZWxwZXIuYwpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqICB4ODYgY29uZGl0aW9uIGNvZGUgaGVscGVycworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uIE1BICAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworY29uc3QgdWludDhfdCBwYXJpdHlfdGFibGVbMjU2XSA9IHsKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgMCwgQ0NfUCwgQ0NfUCwgMCwgQ0NfUCwgMCwgMCwgQ0NfUCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgQ0NfUCwgMCwgMCwgQ0NfUCwgMCwgQ0NfUCwgQ0NfUCwgMCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgMCwgQ0NfUCwgQ0NfUCwgMCwgQ0NfUCwgMCwgMCwgQ0NfUCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIENDX1AsIDAsIDAsIENDX1AsIDAsIENDX1AsIENDX1AsIDAsCisgICAgMCwgQ0NfUCwgQ0NfUCwgMCwgQ0NfUCwgMCwgMCwgQ0NfUCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgMCwgQ0NfUCwgQ0NfUCwgMCwgQ0NfUCwgMCwgMCwgQ0NfUCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgQ0NfUCwgMCwgMCwgQ0NfUCwgMCwgQ0NfUCwgQ0NfUCwgMCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgQ0NfUCwgMCwgMCwgQ0NfUCwgMCwgQ0NfUCwgQ0NfUCwgMCwKKyAgICAwLCBDQ19QLCBDQ19QLCAwLCBDQ19QLCAwLCAwLCBDQ19QLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgQ0NfUCwgMCwgMCwgQ0NfUCwgMCwgQ0NfUCwgQ0NfUCwgMCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgMCwgQ0NfUCwgQ0NfUCwgMCwgQ0NfUCwgMCwgMCwgQ0NfUCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCisgICAgQ0NfUCwgMCwgMCwgQ0NfUCwgMCwgQ0NfUCwgQ0NfUCwgMCwKKyAgICBDQ19QLCAwLCAwLCBDQ19QLCAwLCBDQ19QLCBDQ19QLCAwLAorICAgIDAsIENDX1AsIENDX1AsIDAsIENDX1AsIDAsIDAsIENDX1AsCit9OworCisjZGVmaW5lIFNISUZUIDAKKyNpbmNsdWRlICJjY19oZWxwZXJfdGVtcGxhdGUuaCIKKyN1bmRlZiBTSElGVAorCisjZGVmaW5lIFNISUZUIDEKKyNpbmNsdWRlICJjY19oZWxwZXJfdGVtcGxhdGUuaCIKKyN1bmRlZiBTSElGVAorCisjZGVmaW5lIFNISUZUIDIKKyNpbmNsdWRlICJjY19oZWxwZXJfdGVtcGxhdGUuaCIKKyN1bmRlZiBTSElGVAorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorI2RlZmluZSBTSElGVCAzCisjaW5jbHVkZSAiY2NfaGVscGVyX3RlbXBsYXRlLmgiCisjdW5kZWYgU0hJRlQKKyNlbmRpZgorCitzdGF0aWMgaW50IGNvbXB1dGVfYWxsX2VmbGFncyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHJldHVybiBDQ19TUkM7Cit9CisKK3N0YXRpYyBpbnQgY29tcHV0ZV9jX2VmbGFncyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHJldHVybiBDQ19TUkMgJiBDQ19DOworfQorCit1aW50MzJfdCBoZWxwZXJfY2NfY29tcHV0ZV9hbGwoQ1BVWDg2U3RhdGUgKmVudiwgaW50IG9wKQoreworICAgIHN3aXRjaCAob3ApIHsKKyAgICBkZWZhdWx0OiAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovIHJldHVybiAwOworCisgICAgY2FzZSBDQ19PUF9FRkxBR1M6IHJldHVybiBjb21wdXRlX2FsbF9lZmxhZ3MoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfTVVMQjogcmV0dXJuIGNvbXB1dGVfYWxsX211bGIoZW52KTsKKyAgICBjYXNlIENDX09QX01VTFc6IHJldHVybiBjb21wdXRlX2FsbF9tdWx3KGVudik7CisgICAgY2FzZSBDQ19PUF9NVUxMOiByZXR1cm4gY29tcHV0ZV9hbGxfbXVsbChlbnYpOworCisgICAgY2FzZSBDQ19PUF9BRERCOiByZXR1cm4gY29tcHV0ZV9hbGxfYWRkYihlbnYpOworICAgIGNhc2UgQ0NfT1BfQUREVzogcmV0dXJuIGNvbXB1dGVfYWxsX2FkZHcoZW52KTsKKyAgICBjYXNlIENDX09QX0FEREw6IHJldHVybiBjb21wdXRlX2FsbF9hZGRsKGVudik7CisKKyAgICBjYXNlIENDX09QX0FEQ0I6IHJldHVybiBjb21wdXRlX2FsbF9hZGNiKGVudik7CisgICAgY2FzZSBDQ19PUF9BRENXOiByZXR1cm4gY29tcHV0ZV9hbGxfYWRjdyhlbnYpOworICAgIGNhc2UgQ0NfT1BfQURDTDogcmV0dXJuIGNvbXB1dGVfYWxsX2FkY2woZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU1VCQjogcmV0dXJuIGNvbXB1dGVfYWxsX3N1YmIoZW52KTsKKyAgICBjYXNlIENDX09QX1NVQlc6IHJldHVybiBjb21wdXRlX2FsbF9zdWJ3KGVudik7CisgICAgY2FzZSBDQ19PUF9TVUJMOiByZXR1cm4gY29tcHV0ZV9hbGxfc3VibChlbnYpOworCisgICAgY2FzZSBDQ19PUF9TQkJCOiByZXR1cm4gY29tcHV0ZV9hbGxfc2JiYihlbnYpOworICAgIGNhc2UgQ0NfT1BfU0JCVzogcmV0dXJuIGNvbXB1dGVfYWxsX3NiYncoZW52KTsKKyAgICBjYXNlIENDX09QX1NCQkw6IHJldHVybiBjb21wdXRlX2FsbF9zYmJsKGVudik7CisKKyAgICBjYXNlIENDX09QX0xPR0lDQjogcmV0dXJuIGNvbXB1dGVfYWxsX2xvZ2ljYihlbnYpOworICAgIGNhc2UgQ0NfT1BfTE9HSUNXOiByZXR1cm4gY29tcHV0ZV9hbGxfbG9naWN3KGVudik7CisgICAgY2FzZSBDQ19PUF9MT0dJQ0w6IHJldHVybiBjb21wdXRlX2FsbF9sb2dpY2woZW52KTsKKworICAgIGNhc2UgQ0NfT1BfSU5DQjogcmV0dXJuIGNvbXB1dGVfYWxsX2luY2IoZW52KTsKKyAgICBjYXNlIENDX09QX0lOQ1c6IHJldHVybiBjb21wdXRlX2FsbF9pbmN3KGVudik7CisgICAgY2FzZSBDQ19PUF9JTkNMOiByZXR1cm4gY29tcHV0ZV9hbGxfaW5jbChlbnYpOworCisgICAgY2FzZSBDQ19PUF9ERUNCOiByZXR1cm4gY29tcHV0ZV9hbGxfZGVjYihlbnYpOworICAgIGNhc2UgQ0NfT1BfREVDVzogcmV0dXJuIGNvbXB1dGVfYWxsX2RlY3coZW52KTsKKyAgICBjYXNlIENDX09QX0RFQ0w6IHJldHVybiBjb21wdXRlX2FsbF9kZWNsKGVudik7CisKKyAgICBjYXNlIENDX09QX1NITEI6IHJldHVybiBjb21wdXRlX2FsbF9zaGxiKGVudik7CisgICAgY2FzZSBDQ19PUF9TSExXOiByZXR1cm4gY29tcHV0ZV9hbGxfc2hsdyhlbnYpOworICAgIGNhc2UgQ0NfT1BfU0hMTDogcmV0dXJuIGNvbXB1dGVfYWxsX3NobGwoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU0FSQjogcmV0dXJuIGNvbXB1dGVfYWxsX3NhcmIoZW52KTsKKyAgICBjYXNlIENDX09QX1NBUlc6IHJldHVybiBjb21wdXRlX2FsbF9zYXJ3KGVudik7CisgICAgY2FzZSBDQ19PUF9TQVJMOiByZXR1cm4gY29tcHV0ZV9hbGxfc2FybChlbnYpOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNhc2UgQ0NfT1BfTVVMUTogcmV0dXJuIGNvbXB1dGVfYWxsX211bHEoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfQUREUTogcmV0dXJuIGNvbXB1dGVfYWxsX2FkZHEoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfQURDUTogcmV0dXJuIGNvbXB1dGVfYWxsX2FkY3EoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU1VCUTogcmV0dXJuIGNvbXB1dGVfYWxsX3N1YnEoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU0JCUTogcmV0dXJuIGNvbXB1dGVfYWxsX3NiYnEoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfTE9HSUNROiByZXR1cm4gY29tcHV0ZV9hbGxfbG9naWNxKGVudik7CisKKyAgICBjYXNlIENDX09QX0lOQ1E6IHJldHVybiBjb21wdXRlX2FsbF9pbmNxKGVudik7CisKKyAgICBjYXNlIENDX09QX0RFQ1E6IHJldHVybiBjb21wdXRlX2FsbF9kZWNxKGVudik7CisKKyAgICBjYXNlIENDX09QX1NITFE6IHJldHVybiBjb21wdXRlX2FsbF9zaGxxKGVudik7CisKKyAgICBjYXNlIENDX09QX1NBUlE6IHJldHVybiBjb21wdXRlX2FsbF9zYXJxKGVudik7CisjZW5kaWYKKyAgICB9Cit9CisKK3VpbnQzMl90IGNwdV9jY19jb21wdXRlX2FsbChDUFVBcmNoU3RhdGUgKmVudjEsIGludCBvcCkKK3sKKyAgICByZXR1cm4gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudjEsIG9wKTsKK30KKwordWludDMyX3QgaGVscGVyX2NjX2NvbXB1dGVfYyhDUFVYODZTdGF0ZSAqZW52LCBpbnQgb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgIGRlZmF1bHQ6IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8gcmV0dXJuIDA7CisKKyAgICBjYXNlIENDX09QX0VGTEFHUzogcmV0dXJuIGNvbXB1dGVfY19lZmxhZ3MoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfTVVMQjogcmV0dXJuIGNvbXB1dGVfY19tdWxsKGVudik7CisgICAgY2FzZSBDQ19PUF9NVUxXOiByZXR1cm4gY29tcHV0ZV9jX211bGwoZW52KTsKKyAgICBjYXNlIENDX09QX01VTEw6IHJldHVybiBjb21wdXRlX2NfbXVsbChlbnYpOworCisgICAgY2FzZSBDQ19PUF9BRERCOiByZXR1cm4gY29tcHV0ZV9jX2FkZGIoZW52KTsKKyAgICBjYXNlIENDX09QX0FERFc6IHJldHVybiBjb21wdXRlX2NfYWRkdyhlbnYpOworICAgIGNhc2UgQ0NfT1BfQURETDogcmV0dXJuIGNvbXB1dGVfY19hZGRsKGVudik7CisKKyAgICBjYXNlIENDX09QX0FEQ0I6IHJldHVybiBjb21wdXRlX2NfYWRjYihlbnYpOworICAgIGNhc2UgQ0NfT1BfQURDVzogcmV0dXJuIGNvbXB1dGVfY19hZGN3KGVudik7CisgICAgY2FzZSBDQ19PUF9BRENMOiByZXR1cm4gY29tcHV0ZV9jX2FkY2woZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU1VCQjogcmV0dXJuIGNvbXB1dGVfY19zdWJiKGVudik7CisgICAgY2FzZSBDQ19PUF9TVUJXOiByZXR1cm4gY29tcHV0ZV9jX3N1YncoZW52KTsKKyAgICBjYXNlIENDX09QX1NVQkw6IHJldHVybiBjb21wdXRlX2Nfc3VibChlbnYpOworCisgICAgY2FzZSBDQ19PUF9TQkJCOiByZXR1cm4gY29tcHV0ZV9jX3NiYmIoZW52KTsKKyAgICBjYXNlIENDX09QX1NCQlc6IHJldHVybiBjb21wdXRlX2Nfc2JidyhlbnYpOworICAgIGNhc2UgQ0NfT1BfU0JCTDogcmV0dXJuIGNvbXB1dGVfY19zYmJsKGVudik7CisKKyAgICBjYXNlIENDX09QX0xPR0lDQjogcmV0dXJuIGNvbXB1dGVfY19sb2dpY2IoZW52KTsKKyAgICBjYXNlIENDX09QX0xPR0lDVzogcmV0dXJuIGNvbXB1dGVfY19sb2dpY3coZW52KTsKKyAgICBjYXNlIENDX09QX0xPR0lDTDogcmV0dXJuIGNvbXB1dGVfY19sb2dpY2woZW52KTsKKworICAgIGNhc2UgQ0NfT1BfSU5DQjogcmV0dXJuIGNvbXB1dGVfY19pbmNsKGVudik7CisgICAgY2FzZSBDQ19PUF9JTkNXOiByZXR1cm4gY29tcHV0ZV9jX2luY2woZW52KTsKKyAgICBjYXNlIENDX09QX0lOQ0w6IHJldHVybiBjb21wdXRlX2NfaW5jbChlbnYpOworCisgICAgY2FzZSBDQ19PUF9ERUNCOiByZXR1cm4gY29tcHV0ZV9jX2luY2woZW52KTsKKyAgICBjYXNlIENDX09QX0RFQ1c6IHJldHVybiBjb21wdXRlX2NfaW5jbChlbnYpOworICAgIGNhc2UgQ0NfT1BfREVDTDogcmV0dXJuIGNvbXB1dGVfY19pbmNsKGVudik7CisKKyAgICBjYXNlIENDX09QX1NITEI6IHJldHVybiBjb21wdXRlX2Nfc2hsYihlbnYpOworICAgIGNhc2UgQ0NfT1BfU0hMVzogcmV0dXJuIGNvbXB1dGVfY19zaGx3KGVudik7CisgICAgY2FzZSBDQ19PUF9TSExMOiByZXR1cm4gY29tcHV0ZV9jX3NobGwoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU0FSQjogcmV0dXJuIGNvbXB1dGVfY19zYXJsKGVudik7CisgICAgY2FzZSBDQ19PUF9TQVJXOiByZXR1cm4gY29tcHV0ZV9jX3NhcmwoZW52KTsKKyAgICBjYXNlIENDX09QX1NBUkw6IHJldHVybiBjb21wdXRlX2Nfc2FybChlbnYpOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNhc2UgQ0NfT1BfTVVMUTogcmV0dXJuIGNvbXB1dGVfY19tdWxsKGVudik7CisKKyAgICBjYXNlIENDX09QX0FERFE6IHJldHVybiBjb21wdXRlX2NfYWRkcShlbnYpOworCisgICAgY2FzZSBDQ19PUF9BRENROiByZXR1cm4gY29tcHV0ZV9jX2FkY3EoZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU1VCUTogcmV0dXJuIGNvbXB1dGVfY19zdWJxKGVudik7CisKKyAgICBjYXNlIENDX09QX1NCQlE6IHJldHVybiBjb21wdXRlX2Nfc2JicShlbnYpOworCisgICAgY2FzZSBDQ19PUF9MT0dJQ1E6IHJldHVybiBjb21wdXRlX2NfbG9naWNxKGVudik7CisKKyAgICBjYXNlIENDX09QX0lOQ1E6IHJldHVybiBjb21wdXRlX2NfaW5jbChlbnYpOworCisgICAgY2FzZSBDQ19PUF9ERUNROiByZXR1cm4gY29tcHV0ZV9jX2luY2woZW52KTsKKworICAgIGNhc2UgQ0NfT1BfU0hMUTogcmV0dXJuIGNvbXB1dGVfY19zaGxxKGVudik7CisKKyAgICBjYXNlIENDX09QX1NBUlE6IHJldHVybiBjb21wdXRlX2Nfc2FybChlbnYpOworI2VuZGlmCisgICAgfQorfQorCit2b2lkIGhlbHBlcl93cml0ZV9lZmxhZ3MoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgdDAsIHVpbnQzMl90IHVwZGF0ZV9tYXNrKQoreworICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsIHQwLCB1cGRhdGVfbWFzayk7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfcmVhZF9lZmxhZ3MoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCBlZmxhZ3M7CisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGVmbGFncyB8PSAoREYgJiBERl9NQVNLKTsKKyAgICBlZmxhZ3MgfD0gZW52LT5lZmxhZ3MgJiB+KFZNX01BU0sgfCBSRl9NQVNLKTsKKyAgICByZXR1cm4gZWZsYWdzOworfQorCit2b2lkIGhlbHBlcl9jbHRzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZW52LT5jclswXSAmPSB+Q1IwX1RTX01BU0s7CisgICAgZW52LT5oZmxhZ3MgJj0gfkhGX1RTX01BU0s7Cit9CisKK3ZvaWQgaGVscGVyX3Jlc2V0X3JmKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZW52LT5lZmxhZ3MgJj0gflJGX01BU0s7Cit9CisKK3ZvaWQgaGVscGVyX2NsaShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+ZWZsYWdzICY9IH5JRl9NQVNLOworfQorCit2b2lkIGhlbHBlcl9zdGkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBlbnYtPmVmbGFncyB8PSBJRl9NQVNLOworfQorCit2b2lkIGhlbHBlcl9zZXRfaW5oaWJpdF9pcnEoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBlbnYtPmhmbGFncyB8PSBIRl9JTkhJQklUX0lSUV9NQVNLOworfQorCit2b2lkIGhlbHBlcl9yZXNldF9pbmhpYml0X2lycShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+aGZsYWdzICY9IH5IRl9JTkhJQklUX0lSUV9NQVNLOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9jY19oZWxwZXJfdGVtcGxhdGUuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY2NfaGVscGVyX3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmNWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY2NfaGVscGVyX3RlbXBsYXRlLmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiAgaTM4NiBoZWxwZXJzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24gTUEgIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNkZWZpbmUgREFUQV9CSVRTICgxIDw8ICgzICsgU0hJRlQpKQorI2RlZmluZSBTSElGVF9NQVNLIChEQVRBX0JJVFMgLSAxKQorI2RlZmluZSBTSUdOX01BU0sgKCgodGFyZ2V0X3Vsb25nKTEpIDw8IChEQVRBX0JJVFMgLSAxKSkKKyNpZiBEQVRBX0JJVFMgPD0gMzIKKyNkZWZpbmUgU0hJRlQxX01BU0sgMHgxZgorI2Vsc2UKKyNkZWZpbmUgU0hJRlQxX01BU0sgMHgzZgorI2VuZGlmCisKKyNpZiBEQVRBX0JJVFMgPT0gOAorI2RlZmluZSBTVUZGSVggYgorI2RlZmluZSBEQVRBX1RZUEUgdWludDhfdAorI2RlZmluZSBEQVRBX1NUWVBFIGludDhfdAorI2RlZmluZSBEQVRBX01BU0sgMHhmZgorI2VsaWYgREFUQV9CSVRTID09IDE2CisjZGVmaW5lIFNVRkZJWCB3CisjZGVmaW5lIERBVEFfVFlQRSB1aW50MTZfdAorI2RlZmluZSBEQVRBX1NUWVBFIGludDE2X3QKKyNkZWZpbmUgREFUQV9NQVNLIDB4ZmZmZgorI2VsaWYgREFUQV9CSVRTID09IDMyCisjZGVmaW5lIFNVRkZJWCBsCisjZGVmaW5lIERBVEFfVFlQRSB1aW50MzJfdAorI2RlZmluZSBEQVRBX1NUWVBFIGludDMyX3QKKyNkZWZpbmUgREFUQV9NQVNLIDB4ZmZmZmZmZmYKKyNlbGlmIERBVEFfQklUUyA9PSA2NAorI2RlZmluZSBTVUZGSVggcQorI2RlZmluZSBEQVRBX1RZUEUgdWludDY0X3QKKyNkZWZpbmUgREFUQV9TVFlQRSBpbnQ2NF90CisjZGVmaW5lIERBVEFfTUFTSyAweGZmZmZmZmZmZmZmZmZmZmZVTEwKKyNlbHNlCisjZXJyb3IgdW5oYW5kbGVkIG9wZXJhbmQgc2l6ZQorI2VuZGlmCisKKy8qIGR5bmFtaWMgZmxhZ3MgY29tcHV0YXRpb24gKi8KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfYWxsX2FkZCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBjZiwgcGYsIGFmLCB6Ziwgc2YsIG9mOworICAgIHRhcmdldF9sb25nIHNyYzEsIHNyYzI7CisgICAgc3JjMSA9IENDX1NSQzsKKyAgICBzcmMyID0gQ0NfRFNUIC0gQ0NfU1JDOworICAgIGNmID0gKERBVEFfVFlQRSlDQ19EU1QgPCAoREFUQV9UWVBFKXNyYzE7CisgICAgcGYgPSBwYXJpdHlfdGFibGVbKHVpbnQ4X3QpQ0NfRFNUXTsKKyAgICBhZiA9IChDQ19EU1QgXiBzcmMxIF4gc3JjMikgJiAweDEwOworICAgIHpmID0gKChEQVRBX1RZUEUpQ0NfRFNUID09IDApIDw8IDY7CisgICAgc2YgPSBsc2hpZnQoQ0NfRFNULCA4IC0gREFUQV9CSVRTKSAmIDB4ODA7CisgICAgb2YgPSBsc2hpZnQoKHNyYzEgXiBzcmMyIF4gLTEpICYgKHNyYzEgXiBDQ19EU1QpLCAxMiAtIERBVEFfQklUUykgJiBDQ19POworICAgIHJldHVybiBjZiB8IHBmIHwgYWYgfCB6ZiB8IHNmIHwgb2Y7Cit9CisKK3N0YXRpYyBpbnQgZ2x1ZShjb21wdXRlX2NfYWRkLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmOworICAgIHRhcmdldF9sb25nIHNyYzE7CisgICAgc3JjMSA9IENDX1NSQzsKKyAgICBjZiA9IChEQVRBX1RZUEUpQ0NfRFNUIDwgKERBVEFfVFlQRSlzcmMxOworICAgIHJldHVybiBjZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfYWxsX2FkYywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBjZiwgcGYsIGFmLCB6Ziwgc2YsIG9mOworICAgIHRhcmdldF9sb25nIHNyYzEsIHNyYzI7CisgICAgc3JjMSA9IENDX1NSQzsKKyAgICBzcmMyID0gQ0NfRFNUIC0gQ0NfU1JDIC0gMTsKKyAgICBjZiA9IChEQVRBX1RZUEUpQ0NfRFNUIDw9IChEQVRBX1RZUEUpc3JjMTsKKyAgICBwZiA9IHBhcml0eV90YWJsZVsodWludDhfdClDQ19EU1RdOworICAgIGFmID0gKENDX0RTVCBeIHNyYzEgXiBzcmMyKSAmIDB4MTA7CisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICBvZiA9IGxzaGlmdCgoc3JjMSBeIHNyYzIgXiAtMSkgJiAoc3JjMSBeIENDX0RTVCksIDEyIC0gREFUQV9CSVRTKSAmIENDX087CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfY19hZGMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQgY2Y7CisgICAgdGFyZ2V0X2xvbmcgc3JjMTsKKyAgICBzcmMxID0gQ0NfU1JDOworICAgIGNmID0gKERBVEFfVFlQRSlDQ19EU1QgPD0gKERBVEFfVFlQRSlzcmMxOworICAgIHJldHVybiBjZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfYWxsX3N1YiwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBjZiwgcGYsIGFmLCB6Ziwgc2YsIG9mOworICAgIHRhcmdldF9sb25nIHNyYzEsIHNyYzI7CisgICAgc3JjMSA9IENDX0RTVCArIENDX1NSQzsKKyAgICBzcmMyID0gQ0NfU1JDOworICAgIGNmID0gKERBVEFfVFlQRSlzcmMxIDwgKERBVEFfVFlQRSlzcmMyOworICAgIHBmID0gcGFyaXR5X3RhYmxlWyh1aW50OF90KUNDX0RTVF07CisgICAgYWYgPSAoQ0NfRFNUIF4gc3JjMSBeIHNyYzIpICYgMHgxMDsKKyAgICB6ZiA9ICgoREFUQV9UWVBFKUNDX0RTVCA9PSAwKSA8PCA2OworICAgIHNmID0gbHNoaWZ0KENDX0RTVCwgOCAtIERBVEFfQklUUykgJiAweDgwOworICAgIG9mID0gbHNoaWZ0KChzcmMxIF4gc3JjMikgJiAoc3JjMSBeIENDX0RTVCksIDEyIC0gREFUQV9CSVRTKSAmIENDX087CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfY19zdWIsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQgY2Y7CisgICAgdGFyZ2V0X2xvbmcgc3JjMSwgc3JjMjsKKyAgICBzcmMxID0gQ0NfRFNUICsgQ0NfU1JDOworICAgIHNyYzIgPSBDQ19TUkM7CisgICAgY2YgPSAoREFUQV9UWVBFKXNyYzEgPCAoREFUQV9UWVBFKXNyYzI7CisgICAgcmV0dXJuIGNmOworfQorCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfc2JiLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmLCBwZiwgYWYsIHpmLCBzZiwgb2Y7CisgICAgdGFyZ2V0X2xvbmcgc3JjMSwgc3JjMjsKKyAgICBzcmMxID0gQ0NfRFNUICsgQ0NfU1JDICsgMTsKKyAgICBzcmMyID0gQ0NfU1JDOworICAgIGNmID0gKERBVEFfVFlQRSlzcmMxIDw9IChEQVRBX1RZUEUpc3JjMjsKKyAgICBwZiA9IHBhcml0eV90YWJsZVsodWludDhfdClDQ19EU1RdOworICAgIGFmID0gKENDX0RTVCBeIHNyYzEgXiBzcmMyKSAmIDB4MTA7CisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICBvZiA9IGxzaGlmdCgoc3JjMSBeIHNyYzIpICYgKHNyYzEgXiBDQ19EU1QpLCAxMiAtIERBVEFfQklUUykgJiBDQ19POworICAgIHJldHVybiBjZiB8IHBmIHwgYWYgfCB6ZiB8IHNmIHwgb2Y7Cit9CisKK3N0YXRpYyBpbnQgZ2x1ZShjb21wdXRlX2Nfc2JiLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmOworICAgIHRhcmdldF9sb25nIHNyYzEsIHNyYzI7CisgICAgc3JjMSA9IENDX0RTVCArIENDX1NSQyArIDE7CisgICAgc3JjMiA9IENDX1NSQzsKKyAgICBjZiA9IChEQVRBX1RZUEUpc3JjMSA8PSAoREFUQV9UWVBFKXNyYzI7CisgICAgcmV0dXJuIGNmOworfQorCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfbG9naWMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQgY2YsIHBmLCBhZiwgemYsIHNmLCBvZjsKKyAgICBjZiA9IDA7CisgICAgcGYgPSBwYXJpdHlfdGFibGVbKHVpbnQ4X3QpQ0NfRFNUXTsKKyAgICBhZiA9IDA7CisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICBvZiA9IDA7CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfY19sb2dpYywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfaW5jLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmLCBwZiwgYWYsIHpmLCBzZiwgb2Y7CisgICAgdGFyZ2V0X2xvbmcgc3JjMSwgc3JjMjsKKyAgICBzcmMxID0gQ0NfRFNUIC0gMTsKKyAgICBzcmMyID0gMTsKKyAgICBjZiA9IENDX1NSQzsKKyAgICBwZiA9IHBhcml0eV90YWJsZVsodWludDhfdClDQ19EU1RdOworICAgIGFmID0gKENDX0RTVCBeIHNyYzEgXiBzcmMyKSAmIDB4MTA7CisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICBvZiA9ICgoQ0NfRFNUICYgREFUQV9NQVNLKSA9PSBTSUdOX01BU0spIDw8IDExOworICAgIHJldHVybiBjZiB8IHBmIHwgYWYgfCB6ZiB8IHNmIHwgb2Y7Cit9CisKKyNpZiBEQVRBX0JJVFMgPT0gMzIKK3N0YXRpYyBpbnQgZ2x1ZShjb21wdXRlX2NfaW5jLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIENDX1NSQzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfZGVjLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmLCBwZiwgYWYsIHpmLCBzZiwgb2Y7CisgICAgdGFyZ2V0X2xvbmcgc3JjMSwgc3JjMjsKKyAgICBzcmMxID0gQ0NfRFNUICsgMTsKKyAgICBzcmMyID0gMTsKKyAgICBjZiA9IENDX1NSQzsKKyAgICBwZiA9IHBhcml0eV90YWJsZVsodWludDhfdClDQ19EU1RdOworICAgIGFmID0gKENDX0RTVCBeIHNyYzEgXiBzcmMyKSAmIDB4MTA7CisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICBvZiA9ICgoQ0NfRFNUICYgREFUQV9NQVNLKSA9PSAoKHRhcmdldF91bG9uZylTSUdOX01BU0sgLSAxKSkgPDwgMTE7CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfYWxsX3NobCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBjZiwgcGYsIGFmLCB6Ziwgc2YsIG9mOworICAgIGNmID0gKENDX1NSQyA+PiAoREFUQV9CSVRTIC0gMSkpICYgQ0NfQzsKKyAgICBwZiA9IHBhcml0eV90YWJsZVsodWludDhfdClDQ19EU1RdOworICAgIGFmID0gMDsgLyogdW5kZWZpbmVkICovCisgICAgemYgPSAoKERBVEFfVFlQRSlDQ19EU1QgPT0gMCkgPDwgNjsKKyAgICBzZiA9IGxzaGlmdChDQ19EU1QsIDggLSBEQVRBX0JJVFMpICYgMHg4MDsKKyAgICAvKiBvZiBpcyBkZWZpbmVkIGlmIHNoaWZ0IGNvdW50ID09IDEgKi8KKyAgICBvZiA9IGxzaGlmdChDQ19TUkMgXiBDQ19EU1QsIDEyIC0gREFUQV9CSVRTKSAmIENDX087CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworc3RhdGljIGludCBnbHVlKGNvbXB1dGVfY19zaGwsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gKENDX1NSQyA+PiAoREFUQV9CSVRTIC0gMSkpICYgQ0NfQzsKK30KKworI2lmIERBVEFfQklUUyA9PSAzMgorc3RhdGljIGludCBnbHVlKGNvbXB1dGVfY19zYXIsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gQ0NfU1JDICYgMTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfc2FyLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmLCBwZiwgYWYsIHpmLCBzZiwgb2Y7CisgICAgY2YgPSBDQ19TUkMgJiAxOworICAgIHBmID0gcGFyaXR5X3RhYmxlWyh1aW50OF90KUNDX0RTVF07CisgICAgYWYgPSAwOyAvKiB1bmRlZmluZWQgKi8KKyAgICB6ZiA9ICgoREFUQV9UWVBFKUNDX0RTVCA9PSAwKSA8PCA2OworICAgIHNmID0gbHNoaWZ0KENDX0RTVCwgOCAtIERBVEFfQklUUykgJiAweDgwOworICAgIC8qIG9mIGlzIGRlZmluZWQgaWYgc2hpZnQgY291bnQgPT0gMSAqLworICAgIG9mID0gbHNoaWZ0KENDX1NSQyBeIENDX0RTVCwgMTIgLSBEQVRBX0JJVFMpICYgQ0NfTzsKKyAgICByZXR1cm4gY2YgfCBwZiB8IGFmIHwgemYgfCBzZiB8IG9mOworfQorCisjaWYgREFUQV9CSVRTID09IDMyCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9jX211bCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBjZjsKKyAgICBjZiA9IChDQ19TUkMgIT0gMCk7CisgICAgcmV0dXJuIGNmOworfQorI2VuZGlmCisKKy8qIE5PVEU6IHdlIGNvbXB1dGUgdGhlIGZsYWdzIGxpa2UgdGhlIFA0LiBPbiBvbGRlcnMgQ1BVcywgb25seSBPRiBhbmQKKyAgIENGIGFyZSBtb2RpZmllZCBhbmQgaXQgaXMgc2xvd2VyIHRvIGRvIHRoYXQuICovCitzdGF0aWMgaW50IGdsdWUoY29tcHV0ZV9hbGxfbXVsLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGNmLCBwZiwgYWYsIHpmLCBzZiwgb2Y7CisgICAgY2YgPSAoQ0NfU1JDICE9IDApOworICAgIHBmID0gcGFyaXR5X3RhYmxlWyh1aW50OF90KUNDX0RTVF07CisgICAgYWYgPSAwOyAvKiB1bmRlZmluZWQgKi8KKyAgICB6ZiA9ICgoREFUQV9UWVBFKUNDX0RTVCA9PSAwKSA8PCA2OworICAgIHNmID0gbHNoaWZ0KENDX0RTVCwgOCAtIERBVEFfQklUUykgJiAweDgwOworICAgIG9mID0gY2YgPDwgMTE7CisgICAgcmV0dXJuIGNmIHwgcGYgfCBhZiB8IHpmIHwgc2YgfCBvZjsKK30KKworI3VuZGVmIERBVEFfQklUUworI3VuZGVmIFNISUZUX01BU0sKKyN1bmRlZiBTSElGVDFfTUFTSworI3VuZGVmIFNJR05fTUFTSworI3VuZGVmIERBVEFfVFlQRQorI3VuZGVmIERBVEFfU1RZUEUKKyN1bmRlZiBEQVRBX01BU0sKKyN1bmRlZiBTVUZGSVgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY3B1LXFvbS5oIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9jcHUtcW9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NzhiYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY3B1LXFvbS5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgUUVNVV9YODZfQ1BVX1FPTV9ICisjZGVmaW5lIFFFTVVfWDg2X0NQVV9RT01fSAorCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgorI2luY2x1ZGUgInFvbS9jcHUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgWDg2Q1BVIHsKKyAgICBDUFVTdGF0ZSBwYXJlbnRfb2JqOworCisgICAgQ1BVWDg2U3RhdGUgZW52OworfSBYODZDUFU7CisKK3N0YXRpYyBpbmxpbmUgWDg2Q1BVICp4ODZfZW52X2dldF9jcHUoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gY29udGFpbmVyX29mKGVudiwgWDg2Q1BVLCBlbnYpOworfQorCisjZGVmaW5lIEVOVl9HRVRfQ1BVKGUpICBDUFUoeDg2X2Vudl9nZXRfY3B1KGUpKQorI2RlZmluZSBFTlZfT0ZGU0VUIG9mZnNldG9mKFg4NkNQVSwgZW52KQorCisjZW5kaWYgIC8vIFFFTVVfWDg2X0NQVV9RT01fSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9jcHUuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY3B1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvY3B1LmgKQEAgLTAsMCArMSwxMTg2IEBACisvKgorICogaTM4NiB2aXJ0dWFsIENQVSBoZWFkZXIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBDUFVfSTM4Nl9ICisjZGVmaW5lIENQVV9JMzg2X0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVFMgNjQKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVFMgMzIKKyNlbmRpZgorCisvKiB0YXJnZXQgc3VwcG9ydHMgaW1wbGljaXQgc2VsZiBtb2RpZnlpbmcgY29kZSAqLworI2RlZmluZSBUQVJHRVRfSEFTX1NNQworLyogc3VwcG9ydCBmb3Igc2VsZiBtb2RpZnlpbmcgY29kZSBldmVuIGlmIHRoZSBtb2RpZmllZCBpbnN0cnVjdGlvbiBpcworICAgY2xvc2UgdG8gdGhlIG1vZGlmeWluZyBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBUQVJHRVRfSEFTX1BSRUNJU0VfU01DCisKKyNkZWZpbmUgVEFSR0VUX0hBU19JQ0UgMQorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorI2RlZmluZSBFTEZfTUFDSElORSAgICAgRU1fWDg2XzY0CisjZWxzZQorI2RlZmluZSBFTEZfTUFDSElORSAgICAgRU1fMzg2CisjZW5kaWYKKworLy8gVE9ETyhkaWdpdCk6IFJlbW92ZSB0aGlzIGRlZmluZS4KKyNkZWZpbmUgQ1BVT2xkU3RhdGUgc3RydWN0IENQVVg4NlN0YXRlCisKKyNkZWZpbmUgQ1BVQXJjaFN0YXRlIHN0cnVjdCBDUFVYODZTdGF0ZQorCisjaW5jbHVkZSAiZXhlYy9jcHUtZGVmcy5oIgorCisjaW5jbHVkZSAiZnB1L3NvZnRmbG9hdC5oIgorCisjZGVmaW5lIFJfRUFYIDAKKyNkZWZpbmUgUl9FQ1ggMQorI2RlZmluZSBSX0VEWCAyCisjZGVmaW5lIFJfRUJYIDMKKyNkZWZpbmUgUl9FU1AgNAorI2RlZmluZSBSX0VCUCA1CisjZGVmaW5lIFJfRVNJIDYKKyNkZWZpbmUgUl9FREkgNworCisjZGVmaW5lIFJfQUwgMAorI2RlZmluZSBSX0NMIDEKKyNkZWZpbmUgUl9ETCAyCisjZGVmaW5lIFJfQkwgMworI2RlZmluZSBSX0FIIDQKKyNkZWZpbmUgUl9DSCA1CisjZGVmaW5lIFJfREggNgorI2RlZmluZSBSX0JIIDcKKworI2RlZmluZSBSX0VTIDAKKyNkZWZpbmUgUl9DUyAxCisjZGVmaW5lIFJfU1MgMgorI2RlZmluZSBSX0RTIDMKKyNkZWZpbmUgUl9GUyA0CisjZGVmaW5lIFJfR1MgNQorCisvKiBzZWdtZW50IGRlc2NyaXB0b3IgZmllbGRzICovCisjZGVmaW5lIERFU0NfR19NQVNLICAgICAoMSA8PCAyMykKKyNkZWZpbmUgREVTQ19CX1NISUZUICAgIDIyCisjZGVmaW5lIERFU0NfQl9NQVNLICAgICAoMSA8PCBERVNDX0JfU0hJRlQpCisjZGVmaW5lIERFU0NfTF9TSElGVCAgICAyMSAvKiB4ODZfNjQgb25seSA6IDY0IGJpdCBjb2RlIHNlZ21lbnQgKi8KKyNkZWZpbmUgREVTQ19MX01BU0sgICAgICgxIDw8IERFU0NfTF9TSElGVCkKKyNkZWZpbmUgREVTQ19BVkxfTUFTSyAgICgxIDw8IDIwKQorI2RlZmluZSBERVNDX1BfTUFTSyAgICAgKDEgPDwgMTUpCisjZGVmaW5lIERFU0NfRFBMX1NISUZUICAxMworI2RlZmluZSBERVNDX0RQTF9NQVNLICAgKDMgPDwgREVTQ19EUExfU0hJRlQpCisjZGVmaW5lIERFU0NfU19NQVNLICAgICAoMSA8PCAxMikKKyNkZWZpbmUgREVTQ19UWVBFX1NISUZUIDgKKyNkZWZpbmUgREVTQ19UWVBFX01BU0sgICgxNSA8PCBERVNDX1RZUEVfU0hJRlQpCisjZGVmaW5lIERFU0NfQV9NQVNLICAgICAoMSA8PCA4KQorCisjZGVmaW5lIERFU0NfQ1NfTUFTSyAgICAoMSA8PCAxMSkgLyogMT1jb2RlIHNlZ21lbnQgMD1kYXRhIHNlZ21lbnQgKi8KKyNkZWZpbmUgREVTQ19DX01BU0sgICAgICgxIDw8IDEwKSAvKiBjb2RlOiBjb25mb3JtaW5nICovCisjZGVmaW5lIERFU0NfUl9NQVNLICAgICAoMSA8PCA5KSAgLyogY29kZTogcmVhZGFibGUgKi8KKworI2RlZmluZSBERVNDX0VfTUFTSyAgICAgKDEgPDwgMTApIC8qIGRhdGE6IGV4cGFuc2lvbiBkaXJlY3Rpb24gKi8KKyNkZWZpbmUgREVTQ19XX01BU0sgICAgICgxIDw8IDkpICAvKiBkYXRhOiB3cml0YWJsZSAqLworCisjZGVmaW5lIERFU0NfVFNTX0JVU1lfTUFTSyAoMSA8PCA5KQorCisvKiBlZmxhZ3MgbWFza3MgKi8KKyNkZWZpbmUgQ0NfQyAgICAweDAwMDEKKyNkZWZpbmUgQ0NfUCAgICAweDAwMDQKKyNkZWZpbmUgQ0NfQSAgICAweDAwMTAKKyNkZWZpbmUgQ0NfWiAgICAweDAwNDAKKyNkZWZpbmUgQ0NfUyAgICAweDAwODAKKyNkZWZpbmUgQ0NfTyAgICAweDA4MDAKKworI2RlZmluZSBURl9TSElGVCAgIDgKKyNkZWZpbmUgSU9QTF9TSElGVCAxMgorI2RlZmluZSBWTV9TSElGVCAgIDE3CisKKyNkZWZpbmUgVEZfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBJRl9NQVNLICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERGX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgSU9QTF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMzAwMAorI2RlZmluZSBOVF9NQVNLICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIFJGX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgVk1fTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBBQ19NQVNLICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIFZJRl9NQVNLICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgVklQX01BU0sgICAgICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJRF9NQVNLICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisKKy8qIGhpZGRlbiBmbGFncyAtIHVzZWQgaW50ZXJuYWxseSBieSBxZW11IHRvIHJlcHJlc2VudCBhZGRpdGlvbmFsIGNwdQorICAgc3RhdGVzLiBPbmx5IHRoZSBDUEwsIElOSElCSVRfSVJRLCBTTU0gYW5kIFNWTUkgYXJlIG5vdAorICAgcmVkdW5kYW50LiBXZSBhdm9pZCB1c2luZyB0aGUgSU9QTF9NQVNLLCBURl9NQVNLLCBWTV9NQVNLIGFuZCBBQ19NQVNLCisgICBiaXQgcG9zaXRpb25zIHRvIGVhc2Ugb3Jpbmcgd2l0aCBlZmxhZ3MuICovCisvKiBjdXJyZW50IGNwbCAqLworI2RlZmluZSBIRl9DUExfU0hJRlQgICAgICAgICAwCisvKiB0cnVlIGlmIHNvZnQgbW11IGlzIGJlaW5nIHVzZWQgKi8KKyNkZWZpbmUgSEZfU09GVE1NVV9TSElGVCAgICAgMgorLyogdHJ1ZSBpZiBoYXJkd2FyZSBpbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgZm9yIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgSEZfSU5ISUJJVF9JUlFfU0hJRlQgMworLyogMTYgb3IgMzIgc2VnbWVudHMgKi8KKyNkZWZpbmUgSEZfQ1MzMl9TSElGVCAgICAgICAgNAorI2RlZmluZSBIRl9TUzMyX1NISUZUICAgICAgICA1CisvKiB6ZXJvIGJhc2UgZm9yIERTLCBFUyBhbmQgU1MgOiBjYW4gYmUgJzAnIG9ubHkgaW4gMzIgYml0IENTIHNlZ21lbnQgKi8KKyNkZWZpbmUgSEZfQUREU0VHX1NISUZUICAgICAgNgorLyogY29weSBvZiBDUjAuUEUgKHByb3RlY3RlZCBtb2RlKSAqLworI2RlZmluZSBIRl9QRV9TSElGVCAgICAgICAgICA3CisjZGVmaW5lIEhGX1RGX1NISUZUICAgICAgICAgIDggLyogbXVzdCBiZSBzYW1lIGFzIGVmbGFncyAqLworI2RlZmluZSBIRl9NUF9TSElGVCAgICAgICAgICA5IC8qIHRoZSBvcmRlciBtdXN0IGJlIE1QLCBFTSwgVFMgKi8KKyNkZWZpbmUgSEZfRU1fU0hJRlQgICAgICAgICAxMAorI2RlZmluZSBIRl9UU19TSElGVCAgICAgICAgIDExCisjZGVmaW5lIEhGX0lPUExfU0hJRlQgICAgICAgMTIgLyogbXVzdCBiZSBzYW1lIGFzIGVmbGFncyAqLworI2RlZmluZSBIRl9MTUFfU0hJRlQgICAgICAgIDE0IC8qIG9ubHkgdXNlZCBvbiB4ODZfNjQ6IGxvbmcgbW9kZSBhY3RpdmUgKi8KKyNkZWZpbmUgSEZfQ1M2NF9TSElGVCAgICAgICAxNSAvKiBvbmx5IHVzZWQgb24geDg2XzY0OiA2NCBiaXQgY29kZSBzZWdtZW50ICAqLworI2RlZmluZSBIRl9SRl9TSElGVCAgICAgICAgIDE2IC8qIG11c3QgYmUgc2FtZSBhcyBlZmxhZ3MgKi8KKyNkZWZpbmUgSEZfVk1fU0hJRlQgICAgICAgICAxNyAvKiBtdXN0IGJlIHNhbWUgYXMgZWZsYWdzICovCisjZGVmaW5lIEhGX0FDX1NISUZUICAgICAgICAgMTggLyogbXVzdCBiZSBzYW1lIGFzIGVmbGFncyAqLworI2RlZmluZSBIRl9TTU1fU0hJRlQgICAgICAgIDE5IC8qIENQVSBpbiBTTU0gbW9kZSAqLworI2RlZmluZSBIRl9TVk1FX1NISUZUICAgICAgIDIwIC8qIFNWTUUgZW5hYmxlZCAoY29weSBvZiBFRkVSLlNWTUUpICovCisjZGVmaW5lIEhGX1NWTUlfU0hJRlQgICAgICAgMjEgLyogU1ZNIGludGVyY2VwdHMgYXJlIGFjdGl2ZSAqLworI2RlZmluZSBIRl9PU0ZYU1JfU0hJRlQgICAgIDIyIC8qIENSNC5PU0ZYU1IgKi8KKyNkZWZpbmUgSEZfU01BUF9TSElGVCAgICAgICAyMyAvKiBDUjQuU01BUCAqLworCisjZGVmaW5lIEhGX0NQTF9NQVNLICAgICAgICAgICgzIDw8IEhGX0NQTF9TSElGVCkKKyNkZWZpbmUgSEZfU09GVE1NVV9NQVNLICAgICAgKDEgPDwgSEZfU09GVE1NVV9TSElGVCkKKyNkZWZpbmUgSEZfSU5ISUJJVF9JUlFfTUFTSyAgKDEgPDwgSEZfSU5ISUJJVF9JUlFfU0hJRlQpCisjZGVmaW5lIEhGX0NTMzJfTUFTSyAgICAgICAgICgxIDw8IEhGX0NTMzJfU0hJRlQpCisjZGVmaW5lIEhGX1NTMzJfTUFTSyAgICAgICAgICgxIDw8IEhGX1NTMzJfU0hJRlQpCisjZGVmaW5lIEhGX0FERFNFR19NQVNLICAgICAgICgxIDw8IEhGX0FERFNFR19TSElGVCkKKyNkZWZpbmUgSEZfUEVfTUFTSyAgICAgICAgICAgKDEgPDwgSEZfUEVfU0hJRlQpCisjZGVmaW5lIEhGX1RGX01BU0sgICAgICAgICAgICgxIDw8IEhGX1RGX1NISUZUKQorI2RlZmluZSBIRl9NUF9NQVNLICAgICAgICAgICAoMSA8PCBIRl9NUF9TSElGVCkKKyNkZWZpbmUgSEZfRU1fTUFTSyAgICAgICAgICAgKDEgPDwgSEZfRU1fU0hJRlQpCisjZGVmaW5lIEhGX1RTX01BU0sgICAgICAgICAgICgxIDw8IEhGX1RTX1NISUZUKQorI2RlZmluZSBIRl9JT1BMX01BU0sgICAgICAgICAoMyA8PCBIRl9JT1BMX1NISUZUKQorI2RlZmluZSBIRl9MTUFfTUFTSyAgICAgICAgICAoMSA8PCBIRl9MTUFfU0hJRlQpCisjZGVmaW5lIEhGX0NTNjRfTUFTSyAgICAgICAgICgxIDw8IEhGX0NTNjRfU0hJRlQpCisjZGVmaW5lIEhGX1JGX01BU0sgICAgICAgICAgICgxIDw8IEhGX1JGX1NISUZUKQorI2RlZmluZSBIRl9WTV9NQVNLICAgICAgICAgICAoMSA8PCBIRl9WTV9TSElGVCkKKyNkZWZpbmUgSEZfQUNfTUFTSyAgICAgICAgICAgKDEgPDwgSEZfQUNfU0hJRlQpCisjZGVmaW5lIEhGX1NNTV9NQVNLICAgICAgICAgICgxIDw8IEhGX1NNTV9TSElGVCkKKyNkZWZpbmUgSEZfU1ZNRV9NQVNLICAgICAgICAgKDEgPDwgSEZfU1ZNRV9TSElGVCkKKyNkZWZpbmUgSEZfU1ZNSV9NQVNLICAgICAgICAgKDEgPDwgSEZfU1ZNSV9TSElGVCkKKyNkZWZpbmUgSEZfT1NGWFNSX01BU0sgICAgICAgKDEgPDwgSEZfT1NGWFNSX1NISUZUKQorI2RlZmluZSBIRl9TTUFQX01BU0sgICAgICAgICAoMSA8PCBIRl9TTUFQX1NISUZUKQorCisvKiBoZmxhZ3MyICovCisKKyNkZWZpbmUgSEYyX0dJRl9TSElGVCAgICAgICAgMCAvKiBpZiBzZXQgQ1BVIHRha2VzIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSEYyX0hJRl9TSElGVCAgICAgICAgMSAvKiB2YWx1ZSBvZiBJRl9NQVNLIHdoZW4gZW50ZXJpbmcgU1ZNICovCisjZGVmaW5lIEhGMl9OTUlfU0hJRlQgICAgICAgIDIgLyogQ1BVIHNlcnZpbmcgTk1JICovCisjZGVmaW5lIEhGMl9WSU5UUl9TSElGVCAgICAgIDMgLyogdmFsdWUgb2YgVl9JTlRSX01BU0tJTkcgYml0ICovCisKKyNkZWZpbmUgSEYyX0dJRl9NQVNLICAgICAgICAgICgxIDw8IEhGMl9HSUZfU0hJRlQpCisjZGVmaW5lIEhGMl9ISUZfTUFTSyAgICAgICAgICAoMSA8PCBIRjJfSElGX1NISUZUKQorI2RlZmluZSBIRjJfTk1JX01BU0sgICAgICAgICAgKDEgPDwgSEYyX05NSV9TSElGVCkKKyNkZWZpbmUgSEYyX1ZJTlRSX01BU0sgICAgICAgICgxIDw8IEhGMl9WSU5UUl9TSElGVCkKKworI2RlZmluZSBDUjBfUEVfU0hJRlQgMAorI2RlZmluZSBDUjBfTVBfU0hJRlQgMQorCisjZGVmaW5lIENSMF9QRV9NQVNLICAoMSA8PCAwKQorI2RlZmluZSBDUjBfTVBfTUFTSyAgKDEgPDwgMSkKKyNkZWZpbmUgQ1IwX0VNX01BU0sgICgxIDw8IDIpCisjZGVmaW5lIENSMF9UU19NQVNLICAoMSA8PCAzKQorI2RlZmluZSBDUjBfRVRfTUFTSyAgKDEgPDwgNCkKKyNkZWZpbmUgQ1IwX05FX01BU0sgICgxIDw8IDUpCisjZGVmaW5lIENSMF9XUF9NQVNLICAoMSA8PCAxNikKKyNkZWZpbmUgQ1IwX0FNX01BU0sgICgxIDw8IDE4KQorI2RlZmluZSBDUjBfUEdfTUFTSyAgKDEgPDwgMzEpCisKKyNkZWZpbmUgQ1I0X1ZNRV9NQVNLICAoMSA8PCAwKQorI2RlZmluZSBDUjRfUFZJX01BU0sgICgxIDw8IDEpCisjZGVmaW5lIENSNF9UU0RfTUFTSyAgKDEgPDwgMikKKyNkZWZpbmUgQ1I0X0RFX01BU0sgICAoMSA8PCAzKQorI2RlZmluZSBDUjRfUFNFX01BU0sgICgxIDw8IDQpCisjZGVmaW5lIENSNF9QQUVfTUFTSyAgKDEgPDwgNSkKKyNkZWZpbmUgQ1I0X01DRV9NQVNLICAoMSA8PCA2KQorI2RlZmluZSBDUjRfUEdFX01BU0sgICgxIDw8IDcpCisjZGVmaW5lIENSNF9QQ0VfTUFTSyAgKDEgPDwgOCkKKyNkZWZpbmUgQ1I0X09TRlhTUl9TSElGVCA5CisjZGVmaW5lIENSNF9PU0ZYU1JfTUFTSyAoMSA8PCBDUjRfT1NGWFNSX1NISUZUKQorI2RlZmluZSBDUjRfT1NYTU1FWENQVF9NQVNLICAoMSA8PCAxMCkKKyNkZWZpbmUgQ1I0X1ZNWEVfTUFTSyAgICgxIDw8IDEzKQorI2RlZmluZSBDUjRfU01YRV9NQVNLICAgKDEgPDwgMTQpCisjZGVmaW5lIENSNF9GU0dTQkFTRV9NQVNLICgxIDw8IDE2KQorI2RlZmluZSBDUjRfUENJREVfTUFTSyAgKDEgPDwgMTcpCisjZGVmaW5lIENSNF9PU1hTQVZFX01BU0sgKDEgPDwgMTgpCisjZGVmaW5lIENSNF9TTUVQX01BU0sgICAoMSA8PCAyMCkKKyNkZWZpbmUgQ1I0X1NNQVBfTUFTSyAgICgxIDw8IDIxKQorCisjZGVmaW5lIERSNl9CRCAgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgRFI2X0JTICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBEUjZfQlQgICAgICAgICAgKDEgPDwgMTUpCisjZGVmaW5lIERSNl9GSVhFRF8xICAgICAweGZmZmYwZmYwCisKKyNkZWZpbmUgRFI3X0dEICAgICAgICAgICgxIDw8IDEzKQorI2RlZmluZSBEUjdfVFlQRV9TSElGVCAgMTYKKyNkZWZpbmUgRFI3X0xFTl9TSElGVCAgIDE4CisjZGVmaW5lIERSN19GSVhFRF8xICAgICAweDAwMDAwNDAwCisjZGVmaW5lIERSN19MT0NBTF9CUF9NQVNLICAgIDB4NTUKKyNkZWZpbmUgRFI3X01BWF9CUCAgICAgICAgICAgNAorI2RlZmluZSBEUjdfVFlQRV9CUF9JTlNUICAgICAweDAKKyNkZWZpbmUgRFI3X1RZUEVfREFUQV9XUiAgICAgMHgxCisjZGVmaW5lIERSN19UWVBFX0lPX1JXICAgICAgIDB4MgorI2RlZmluZSBEUjdfVFlQRV9EQVRBX1JXICAgICAweDMKKworI2RlZmluZSBQR19QUkVTRU5UX0JJVCAgMAorI2RlZmluZSBQR19SV19CSVQgICAgICAgMQorI2RlZmluZSBQR19VU0VSX0JJVCAgICAgMgorI2RlZmluZSBQR19QV1RfQklUICAgICAgMworI2RlZmluZSBQR19QQ0RfQklUICAgICAgNAorI2RlZmluZSBQR19BQ0NFU1NFRF9CSVQgNQorI2RlZmluZSBQR19ESVJUWV9CSVQgICAgNgorI2RlZmluZSBQR19QU0VfQklUICAgICAgNworI2RlZmluZSBQR19HTE9CQUxfQklUICAgOAorI2RlZmluZSBQR19OWF9CSVQgICAgICAgNjMKKworI2RlZmluZSBQR19QUkVTRU5UX01BU0sgICgxIDw8IFBHX1BSRVNFTlRfQklUKQorI2RlZmluZSBQR19SV19NQVNLICAgICAgICgxIDw8IFBHX1JXX0JJVCkKKyNkZWZpbmUgUEdfVVNFUl9NQVNLICAgICAoMSA8PCBQR19VU0VSX0JJVCkKKyNkZWZpbmUgUEdfUFdUX01BU0sgICAgICAoMSA8PCBQR19QV1RfQklUKQorI2RlZmluZSBQR19QQ0RfTUFTSyAgICAgICgxIDw8IFBHX1BDRF9CSVQpCisjZGVmaW5lIFBHX0FDQ0VTU0VEX01BU0sgKDEgPDwgUEdfQUNDRVNTRURfQklUKQorI2RlZmluZSBQR19ESVJUWV9NQVNLICAgICgxIDw8IFBHX0RJUlRZX0JJVCkKKyNkZWZpbmUgUEdfUFNFX01BU0sgICAgICAoMSA8PCBQR19QU0VfQklUKQorI2RlZmluZSBQR19HTE9CQUxfTUFTSyAgICgxIDw8IFBHX0dMT0JBTF9CSVQpCisjZGVmaW5lIFBHX0hJX1VTRVJfTUFTSyAgMHg3ZmYwMDAwMDAwMDAwMDAwTEwKKyNkZWZpbmUgUEdfTlhfTUFTSyAgICAgICAoMUxMIDw8IFBHX05YX0JJVCkKKworI2RlZmluZSBQR19FUlJPUl9XX0JJVCAgICAgMQorCisjZGVmaW5lIFBHX0VSUk9SX1BfTUFTSyAgICAweDAxCisjZGVmaW5lIFBHX0VSUk9SX1dfTUFTSyAgICAoMSA8PCBQR19FUlJPUl9XX0JJVCkKKyNkZWZpbmUgUEdfRVJST1JfVV9NQVNLICAgIDB4MDQKKyNkZWZpbmUgUEdfRVJST1JfUlNWRF9NQVNLIDB4MDgKKyNkZWZpbmUgUEdfRVJST1JfSV9EX01BU0sgIDB4MTAKKworI2RlZmluZSBNQ0dfQ1RMX1AgICAgICAgKDFVTEw8PDgpICAgLyogTUNHX0NBUCByZWdpc3RlciBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTUNHX1NFUl9QICAgICAgICgxVUxMPDwyNCkgLyogTUNBIHJlY292ZXJ5L25ldyBzdGF0dXMgYml0cyAqLworCisjZGVmaW5lIE1DRV9DQVBfREVGICAgIE1DR19DVExfUAorI2RlZmluZSBNQ0VfQkFOS1NfREVGICAxMAorCisjZGVmaW5lIE1DR19TVEFUVVNfTUNJUCAgICAgICAgKDFVTDw8MikgICAvKiBtYWNoaW5lIGNoZWNrIGluIHByb2dyZXNzICovCisKKyNkZWZpbmUgTUNJX1NUQVRVU19WQUwgICAoMVVMTDw8NjMpICAvKiB2YWxpZCBlcnJvciAqLworI2RlZmluZSBNQ0lfU1RBVFVTX09WRVIgICgxVUxMPDw2MikgIC8qIHByZXZpb3VzIGVycm9ycyBsb3N0ICovCisjZGVmaW5lIE1DSV9TVEFUVVNfVUMgICAgKDFVTEw8PDYxKSAgLyogdW5jb3JyZWN0ZWQgZXJyb3IgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19FTiAgICAoMVVMTDw8NjApICAvKiBlcnJvciBlbmFibGVkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfTUlTQ1YgKDFVTEw8PDU5KSAgLyogbWlzYyBlcnJvciByZWcuIHZhbGlkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfQUREUlYgKDFVTEw8PDU4KSAgLyogYWRkciByZWcuIHZhbGlkICovCisjZGVmaW5lIE1DSV9TVEFUVVNfUENDICAgKDFVTEw8PDU3KSAgLyogcHJvY2Vzc29yIGNvbnRleHQgY29ycnVwdCAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1MgICAgICgxVUxMPDw1NikgIC8qIFNpZ25hbGVkIG1hY2hpbmUgY2hlY2sgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19BUiAgICAoMVVMTDw8NTUpICAvKiBBY3Rpb24gcmVxdWlyZWQgKi8KKworLyogTUlTQyByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1DTV9BRERSX1NFR09GRiAgMCAgICAgIC8qIHNlZ21lbnQgb2Zmc2V0ICovCisjZGVmaW5lIE1DTV9BRERSX0xJTkVBUiAgMSAgICAgIC8qIGxpbmVhciBhZGRyZXNzICovCisjZGVmaW5lIE1DTV9BRERSX1BIWVMgICAgMiAgICAgIC8qIHBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUgTUNNX0FERFJfTUVNICAgICAzICAgICAgLyogbWVtb3J5IGFkZHJlc3MgKi8KKyNkZWZpbmUgTUNNX0FERFJfR0VORVJJQyA3ICAgICAgLyogZ2VuZXJpYyAqLworCisjZGVmaW5lIE1TUl9JQTMyX1RTQyAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNU1JfSUEzMl9BUElDQkFTRSAgICAgICAgICAgICAgIDB4MWIKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfQlNQICAgICAgICAgICAoMTw8OCkKKyNkZWZpbmUgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFICAgICAgICAoMTw8MTEpCisjZGVmaW5lIE1TUl9JQTMyX0FQSUNCQVNFX0JBU0UgICAgICAgICAgKDB4ZmZmZmY8PDEyKQorI2RlZmluZSBNU1JfSUEzMl9GRUFUVVJFX0NPTlRST0wgICAgICAgIDB4MDAwMDAwM2EKKyNkZWZpbmUgTVNSX1RTQ19BREpVU1QgICAgICAgICAgICAgICAgICAweDAwMDAwMDNiCisjZGVmaW5lIE1TUl9JQTMyX1RTQ0RFQURMSU5FICAgICAgICAgICAgMHg2ZTAKKworI2RlZmluZSBNU1JfUDZfUEVSRkNUUjAgICAgICAgICAgICAgICAgIDB4YzEKKworI2RlZmluZSBNU1JfTVRSUmNhcCAgICAgICAgICAgICAgICAgICAgIDB4ZmUKKyNkZWZpbmUgTVNSX01UUlJjYXBfVkNOVCAgICAgICAgICAgICAgICA4CisjZGVmaW5lIE1TUl9NVFJSY2FwX0ZJWFJBTkdFX1NVUFBPUlQgICAgKDEgPDwgOCkKKyNkZWZpbmUgTVNSX01UUlJjYXBfV0NfU1VQUE9SVEVEICAgICAgICAoMSA8PCAxMCkKKworI2RlZmluZSBNU1JfSUEzMl9TWVNFTlRFUl9DUyAgICAgICAgICAgIDB4MTc0CisjZGVmaW5lIE1TUl9JQTMyX1NZU0VOVEVSX0VTUCAgICAgICAgICAgMHgxNzUKKyNkZWZpbmUgTVNSX0lBMzJfU1lTRU5URVJfRUlQICAgICAgICAgICAweDE3NgorCisjZGVmaW5lIE1TUl9NQ0dfQ0FQICAgICAgICAgICAgICAgICAgICAgMHgxNzkKKyNkZWZpbmUgTVNSX01DR19TVEFUVVMgICAgICAgICAgICAgICAgICAweDE3YQorI2RlZmluZSBNU1JfTUNHX0NUTCAgICAgICAgICAgICAgICAgICAgIDB4MTdiCisKKyNkZWZpbmUgTVNSX1A2X0VWTlRTRUwwICAgICAgICAgICAgICAgICAweDE4NgorCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfU1RBVFVTICAgICAgICAgICAgMHgxOTgKKworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRSAgICAgICAgICAgIDB4MWEwCisvKiBJbmRpY2F0ZXMgZ29vZCByZXAvbW92cyBtaWNyb2NvZGUgb24gc29tZSBwcm9jZXNzb3JzOiAqLworI2RlZmluZSBNU1JfSUEzMl9NSVNDX0VOQUJMRV9ERUZBVUxUICAgIDEKKworI2RlZmluZSBNU1JfTVRSUnBoeXNCYXNlKHJlZykgICAgICAgICAgICgweDIwMCArIDIgKiAocmVnKSkKKyNkZWZpbmUgTVNSX01UUlJwaHlzTWFzayhyZWcpICAgICAgICAgICAoMHgyMDAgKyAyICogKHJlZykgKyAxKQorCisjZGVmaW5lIE1TUl9NVFJSZml4NjRLXzAwMDAwICAgICAgICAgICAgMHgyNTAKKyNkZWZpbmUgTVNSX01UUlJmaXgxNktfODAwMDAgICAgICAgICAgICAweDI1OAorI2RlZmluZSBNU1JfTVRSUmZpeDE2S19BMDAwMCAgICAgICAgICAgIDB4MjU5CisjZGVmaW5lIE1TUl9NVFJSZml4NEtfQzAwMDAgICAgICAgICAgICAgMHgyNjgKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19DODAwMCAgICAgICAgICAgICAweDI2OQorI2RlZmluZSBNU1JfTVRSUmZpeDRLX0QwMDAwICAgICAgICAgICAgIDB4MjZhCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRDgwMDAgICAgICAgICAgICAgMHgyNmIKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19FMDAwMCAgICAgICAgICAgICAweDI2YworI2RlZmluZSBNU1JfTVRSUmZpeDRLX0U4MDAwICAgICAgICAgICAgIDB4MjZkCisjZGVmaW5lIE1TUl9NVFJSZml4NEtfRjAwMDAgICAgICAgICAgICAgMHgyNmUKKyNkZWZpbmUgTVNSX01UUlJmaXg0S19GODAwMCAgICAgICAgICAgICAweDI2ZgorCisjZGVmaW5lIE1TUl9QQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNzcKKworI2RlZmluZSBNU1JfTVRSUmRlZlR5cGUgICAgICAgICAgICAgICAgIDB4MmZmCisKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFIwICAgICAgICAweDMwOQorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0ZJWEVEX0NUUjEgICAgICAgIDB4MzBhCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfRklYRURfQ1RSMiAgICAgICAgMHgzMGIKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9GSVhFRF9DVFJfQ1RSTCAgICAweDM4ZAorI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMgICAgIDB4MzhlCisjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwgICAgICAgMHgzOGYKKyNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwgICAweDM5MAorCisjZGVmaW5lIE1TUl9NQzBfQ1RMICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgTVNSX01DMF9TVEFUVVMgICAgICAgICAgICAgICAgICAweDQwMQorI2RlZmluZSBNU1JfTUMwX0FERFIgICAgICAgICAgICAgICAgICAgIDB4NDAyCisjZGVmaW5lIE1TUl9NQzBfTUlTQyAgICAgICAgICAgICAgICAgICAgMHg0MDMKKworI2RlZmluZSBNU1JfRUZFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMDAwODAKKworI2RlZmluZSBNU1JfRUZFUl9TQ0UgICAoMSA8PCAwKQorI2RlZmluZSBNU1JfRUZFUl9MTUUgICAoMSA8PCA4KQorI2RlZmluZSBNU1JfRUZFUl9MTUEgICAoMSA8PCAxMCkKKyNkZWZpbmUgTVNSX0VGRVJfTlhFICAgKDEgPDwgMTEpCisjZGVmaW5lIE1TUl9FRkVSX1NWTUUgICgxIDw8IDEyKQorI2RlZmluZSBNU1JfRUZFUl9GRlhTUiAoMSA8PCAxNCkKKworI2RlZmluZSBNU1JfU1RBUiAgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMDAwODEKKyNkZWZpbmUgTVNSX0xTVEFSICAgICAgICAgICAgICAgICAgICAgICAweGMwMDAwMDgyCisjZGVmaW5lIE1TUl9DU1RBUiAgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDA4MworI2RlZmluZSBNU1JfRk1BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4YzAwMDAwODQKKyNkZWZpbmUgTVNSX0ZTQkFTRSAgICAgICAgICAgICAgICAgICAgICAweGMwMDAwMTAwCisjZGVmaW5lIE1TUl9HU0JBU0UgICAgICAgICAgICAgICAgICAgICAgMHhjMDAwMDEwMQorI2RlZmluZSBNU1JfS0VSTkVMR1NCQVNFICAgICAgICAgICAgICAgIDB4YzAwMDAxMDIKKyNkZWZpbmUgTVNSX1RTQ19BVVggICAgICAgICAgICAgICAgICAgICAweGMwMDAwMTAzCisKKyNkZWZpbmUgTVNSX1ZNX0hTQVZFX1BBICAgICAgICAgICAgICAgICAweGMwMDEwMTE3CisKKyNkZWZpbmUgWFNUQVRFX0ZQICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFhTVEFURV9TU0UgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBYU1RBVEVfWU1NICAgICAgICAgICAgICAgICAgICAgIDQKKworLyogQ1BVSUQgZmVhdHVyZSB3b3JkcyAqLwordHlwZWRlZiBlbnVtIEZlYXR1cmVXb3JkIHsKKyAgICBGRUFUXzFfRURYLCAgICAgICAgIC8qIENQVUlEWzFdLkVEWCAqLworICAgIEZFQVRfMV9FQ1gsICAgICAgICAgLyogQ1BVSURbMV0uRUNYICovCisgICAgRkVBVF83XzBfRUJYLCAgICAgICAvKiBDUFVJRFtFQVg9NyxFQ1g9MF0uRUJYICovCisgICAgRkVBVF84MDAwXzAwMDFfRURYLCAvKiBDUFVJRFs4MDAwXzAwMDFdLkVEWCAqLworICAgIEZFQVRfODAwMF8wMDAxX0VDWCwgLyogQ1BVSURbODAwMF8wMDAxXS5FQ1ggKi8KKyAgICBGRUFUX0MwMDBfMDAwMV9FRFgsIC8qIENQVUlEW0MwMDBfMDAwMV0uRURYICovCisgICAgRkVBVF9LVk0sICAgICAgICAgICAvKiBDUFVJRFs0MDAwXzAwMDFdLkVBWCAoS1ZNX0NQVUlEX0ZFQVRVUkVTKSAqLworICAgIEZFQVRfU1ZNLCAgICAgICAgICAgLyogQ1BVSURbODAwMF8wMDBBXS5FRFggKi8KKyAgICBGRUFUVVJFX1dPUkRTLAorfSBGZWF0dXJlV29yZDsKKwordHlwZWRlZiB1aW50MzJfdCBGZWF0dXJlV29yZEFycmF5W0ZFQVRVUkVfV09SRFNdOworCisvKiBjcHVpZF9mZWF0dXJlcyBiaXRzICovCisjZGVmaW5lIENQVUlEX0ZQODcgKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfVk1FICAoMSA8PCAxKQorI2RlZmluZSBDUFVJRF9ERSAgICgxIDw8IDIpCisjZGVmaW5lIENQVUlEX1BTRSAgKDEgPDwgMykKKyNkZWZpbmUgQ1BVSURfVFNDICAoMSA8PCA0KQorI2RlZmluZSBDUFVJRF9NU1IgICgxIDw8IDUpCisjZGVmaW5lIENQVUlEX1BBRSAgKDEgPDwgNikKKyNkZWZpbmUgQ1BVSURfTUNFICAoMSA8PCA3KQorI2RlZmluZSBDUFVJRF9DWDggICgxIDw8IDgpCisjZGVmaW5lIENQVUlEX0FQSUMgKDEgPDwgOSkKKyNkZWZpbmUgQ1BVSURfU0VQICAoMSA8PCAxMSkgLyogc3lzZW50ZXIvc3lzZXhpdCAqLworI2RlZmluZSBDUFVJRF9NVFJSICgxIDw8IDEyKQorI2RlZmluZSBDUFVJRF9QR0UgICgxIDw8IDEzKQorI2RlZmluZSBDUFVJRF9NQ0EgICgxIDw8IDE0KQorI2RlZmluZSBDUFVJRF9DTU9WICgxIDw8IDE1KQorI2RlZmluZSBDUFVJRF9QQVQgICgxIDw8IDE2KQorI2RlZmluZSBDUFVJRF9QU0UzNiAgICgxIDw8IDE3KQorI2RlZmluZSBDUFVJRF9QTiAgICgxIDw8IDE4KQorI2RlZmluZSBDUFVJRF9DTEZMVVNIICgxIDw8IDE5KQorI2RlZmluZSBDUFVJRF9EVFMgKDEgPDwgMjEpCisjZGVmaW5lIENQVUlEX0FDUEkgKDEgPDwgMjIpCisjZGVmaW5lIENQVUlEX01NWCAgKDEgPDwgMjMpCisjZGVmaW5lIENQVUlEX0ZYU1IgKDEgPDwgMjQpCisjZGVmaW5lIENQVUlEX1NTRSAgKDEgPDwgMjUpCisjZGVmaW5lIENQVUlEX1NTRTIgKDEgPDwgMjYpCisjZGVmaW5lIENQVUlEX1NTICgxIDw8IDI3KQorI2RlZmluZSBDUFVJRF9IVCAoMSA8PCAyOCkKKyNkZWZpbmUgQ1BVSURfVE0gKDEgPDwgMjkpCisjZGVmaW5lIENQVUlEX0lBNjQgKDEgPDwgMzApCisjZGVmaW5lIENQVUlEX1BCRSAoMSA8PCAzMSkKKworI2RlZmluZSBDUFVJRF9FWFRfU1NFMyAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfRVhUX1BDTE1VTFFEUSAoMSA8PCAxKQorI2RlZmluZSBDUFVJRF9FWFRfRFRFUzY0ICAgKDEgPDwgMikKKyNkZWZpbmUgQ1BVSURfRVhUX01PTklUT1IgICgxIDw8IDMpCisjZGVmaW5lIENQVUlEX0VYVF9EU0NQTCAgICAoMSA8PCA0KQorI2RlZmluZSBDUFVJRF9FWFRfVk1YICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQ1BVSURfRVhUX1NNWCAgICAgICgxIDw8IDYpCisjZGVmaW5lIENQVUlEX0VYVF9FU1QgICAgICAoMSA8PCA3KQorI2RlZmluZSBDUFVJRF9FWFRfVE0yICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgQ1BVSURfRVhUX1NTU0UzICAgICgxIDw8IDkpCisjZGVmaW5lIENQVUlEX0VYVF9DSUQgICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgQ1BVSURfRVhUX0ZNQSAgICAgICgxIDw8IDEyKQorI2RlZmluZSBDUFVJRF9FWFRfQ1gxNiAgICAgKDEgPDwgMTMpCisjZGVmaW5lIENQVUlEX0VYVF9YVFBSICAgICAoMSA8PCAxNCkKKyNkZWZpbmUgQ1BVSURfRVhUX1BEQ00gICAgICgxIDw8IDE1KQorI2RlZmluZSBDUFVJRF9FWFRfUENJRCAgICAgKDEgPDwgMTcpCisjZGVmaW5lIENQVUlEX0VYVF9EQ0EgICAgICAoMSA8PCAxOCkKKyNkZWZpbmUgQ1BVSURfRVhUX1NTRTQxICAgICgxIDw8IDE5KQorI2RlZmluZSBDUFVJRF9FWFRfU1NFNDIgICAgKDEgPDwgMjApCisjZGVmaW5lIENQVUlEX0VYVF9YMkFQSUMgICAoMSA8PCAyMSkKKyNkZWZpbmUgQ1BVSURfRVhUX01PVkJFICAgICgxIDw8IDIyKQorI2RlZmluZSBDUFVJRF9FWFRfUE9QQ05UICAgKDEgPDwgMjMpCisjZGVmaW5lIENQVUlEX0VYVF9UU0NfREVBRExJTkVfVElNRVIgKDEgPDwgMjQpCisjZGVmaW5lIENQVUlEX0VYVF9BRVMgICAgICAoMSA8PCAyNSkKKyNkZWZpbmUgQ1BVSURfRVhUX1hTQVZFICAgICgxIDw8IDI2KQorI2RlZmluZSBDUFVJRF9FWFRfT1NYU0FWRSAgKDEgPDwgMjcpCisjZGVmaW5lIENQVUlEX0VYVF9BVlggICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgQ1BVSURfRVhUX0YxNkMgICAgICgxIDw8IDI5KQorI2RlZmluZSBDUFVJRF9FWFRfUkRSQU5EICAgKDEgPDwgMzApCisjZGVmaW5lIENQVUlEX0VYVF9IWVBFUlZJU09SICAoMSA8PCAzMSkKKworI2RlZmluZSBDUFVJRF9FWFQyX0ZQVSAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfRVhUMl9WTUUgICAgICgxIDw8IDEpCisjZGVmaW5lIENQVUlEX0VYVDJfREUgICAgICAoMSA8PCAyKQorI2RlZmluZSBDUFVJRF9FWFQyX1BTRSAgICAgKDEgPDwgMykKKyNkZWZpbmUgQ1BVSURfRVhUMl9UU0MgICAgICgxIDw8IDQpCisjZGVmaW5lIENQVUlEX0VYVDJfTVNSICAgICAoMSA8PCA1KQorI2RlZmluZSBDUFVJRF9FWFQyX1BBRSAgICAgKDEgPDwgNikKKyNkZWZpbmUgQ1BVSURfRVhUMl9NQ0UgICAgICgxIDw8IDcpCisjZGVmaW5lIENQVUlEX0VYVDJfQ1g4ICAgICAoMSA8PCA4KQorI2RlZmluZSBDUFVJRF9FWFQyX0FQSUMgICAgKDEgPDwgOSkKKyNkZWZpbmUgQ1BVSURfRVhUMl9TWVNDQUxMICgxIDw8IDExKQorI2RlZmluZSBDUFVJRF9FWFQyX01UUlIgICAgKDEgPDwgMTIpCisjZGVmaW5lIENQVUlEX0VYVDJfUEdFICAgICAoMSA8PCAxMykKKyNkZWZpbmUgQ1BVSURfRVhUMl9NQ0EgICAgICgxIDw8IDE0KQorI2RlZmluZSBDUFVJRF9FWFQyX0NNT1YgICAgKDEgPDwgMTUpCisjZGVmaW5lIENQVUlEX0VYVDJfUEFUICAgICAoMSA8PCAxNikKKyNkZWZpbmUgQ1BVSURfRVhUMl9QU0UzNiAgICgxIDw8IDE3KQorI2RlZmluZSBDUFVJRF9FWFQyX01QICAgICAgKDEgPDwgMTkpCisjZGVmaW5lIENQVUlEX0VYVDJfTlggICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgQ1BVSURfRVhUMl9NTVhFWFQgICgxIDw8IDIyKQorI2RlZmluZSBDUFVJRF9FWFQyX01NWCAgICAgKDEgPDwgMjMpCisjZGVmaW5lIENQVUlEX0VYVDJfRlhTUiAgICAoMSA8PCAyNCkKKyNkZWZpbmUgQ1BVSURfRVhUMl9GRlhTUiAgICgxIDw8IDI1KQorI2RlZmluZSBDUFVJRF9FWFQyX1BEUEUxR0IgKDEgPDwgMjYpCisjZGVmaW5lIENQVUlEX0VYVDJfUkRUU0NQICAoMSA8PCAyNykKKyNkZWZpbmUgQ1BVSURfRVhUMl9MTSAgICAgICgxIDw8IDI5KQorI2RlZmluZSBDUFVJRF9FWFQyXzNETk9XRVhUICgxIDw8IDMwKQorI2RlZmluZSBDUFVJRF9FWFQyXzNETk9XICAgKDEgPDwgMzEpCisKKy8qIENQVUlEWzgwMDBfMDAwMV0uRURYIGJpdHMgdGhhdCBhcmUgYWxpYXNlIG9mIENQVUlEWzFdLkVEWCBiaXRzIG9uIEFNRCBDUFVzICovCisjZGVmaW5lIENQVUlEX0VYVDJfQU1EX0FMSUFTRVMgKENQVUlEX0VYVDJfRlBVIHwgQ1BVSURfRVhUMl9WTUUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVUlEX0VYVDJfREUgfCBDUFVJRF9FWFQyX1BTRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVSURfRVhUMl9UU0MgfCBDUFVJRF9FWFQyX01TUiB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVSURfRVhUMl9QQUUgfCBDUFVJRF9FWFQyX01DRSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVSURfRVhUMl9DWDggfCBDUFVJRF9FWFQyX0FQSUMgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVUlEX0VYVDJfTVRSUiB8IENQVUlEX0VYVDJfUEdFIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVJRF9FWFQyX01DQSB8IENQVUlEX0VYVDJfQ01PViB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVSURfRVhUMl9QQVQgfCBDUFVJRF9FWFQyX1BTRTM2IHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVJRF9FWFQyX01NWCB8IENQVUlEX0VYVDJfRlhTUikKKworI2RlZmluZSBDUFVJRF9FWFQzX0xBSEZfTE0gKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfRVhUM19DTVBfTEVHICgxIDw8IDEpCisjZGVmaW5lIENQVUlEX0VYVDNfU1ZNICAgICAoMSA8PCAyKQorI2RlZmluZSBDUFVJRF9FWFQzX0VYVEFQSUMgKDEgPDwgMykKKyNkZWZpbmUgQ1BVSURfRVhUM19DUjhMRUcgICgxIDw8IDQpCisjZGVmaW5lIENQVUlEX0VYVDNfQUJNICAgICAoMSA8PCA1KQorI2RlZmluZSBDUFVJRF9FWFQzX1NTRTRBICAgKDEgPDwgNikKKyNkZWZpbmUgQ1BVSURfRVhUM19NSVNBTElHTlNTRSAoMSA8PCA3KQorI2RlZmluZSBDUFVJRF9FWFQzXzNETk9XUFJFRkVUQ0ggKDEgPDwgOCkKKyNkZWZpbmUgQ1BVSURfRVhUM19PU1ZXICAgICgxIDw8IDkpCisjZGVmaW5lIENQVUlEX0VYVDNfSUJTICAgICAoMSA8PCAxMCkKKyNkZWZpbmUgQ1BVSURfRVhUM19YT1AgICAgICgxIDw8IDExKQorI2RlZmluZSBDUFVJRF9FWFQzX1NLSU5JVCAgKDEgPDwgMTIpCisjZGVmaW5lIENQVUlEX0VYVDNfV0RUICAgICAoMSA8PCAxMykKKyNkZWZpbmUgQ1BVSURfRVhUM19MV1AgICAgICgxIDw8IDE1KQorI2RlZmluZSBDUFVJRF9FWFQzX0ZNQTQgICAgKDEgPDwgMTYpCisjZGVmaW5lIENQVUlEX0VYVDNfVENFICAgICAoMSA8PCAxNykKKyNkZWZpbmUgQ1BVSURfRVhUM19OT0RFSUQgICgxIDw8IDE5KQorI2RlZmluZSBDUFVJRF9FWFQzX1RCTSAgICAgKDEgPDwgMjEpCisjZGVmaW5lIENQVUlEX0VYVDNfVE9QT0VYVCAoMSA8PCAyMikKKyNkZWZpbmUgQ1BVSURfRVhUM19QRVJGQ09SRSAoMSA8PCAyMykKKyNkZWZpbmUgQ1BVSURfRVhUM19QRVJGTkIgICgxIDw8IDI0KQorCisjZGVmaW5lIENQVUlEX1NWTV9OUFQgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfU1ZNX0xCUlYgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBDUFVJRF9TVk1fU1ZNTE9DSyAgICAgICgxIDw8IDIpCisjZGVmaW5lIENQVUlEX1NWTV9OUklQU0FWRSAgICAgKDEgPDwgMykKKyNkZWZpbmUgQ1BVSURfU1ZNX1RTQ1NDQUxFICAgICAoMSA8PCA0KQorI2RlZmluZSBDUFVJRF9TVk1fVk1DQkNMRUFOICAgICgxIDw8IDUpCisjZGVmaW5lIENQVUlEX1NWTV9GTFVTSEFTSUQgICAgKDEgPDwgNikKKyNkZWZpbmUgQ1BVSURfU1ZNX0RFQ09ERUFTU0lTVCAoMSA8PCA3KQorI2RlZmluZSBDUFVJRF9TVk1fUEFVU0VGSUxURVIgICgxIDw8IDEwKQorI2RlZmluZSBDUFVJRF9TVk1fUEZUSFJFU0hPTEQgICgxIDw8IDEyKQorCisjZGVmaW5lIENQVUlEXzdfMF9FQlhfRlNHU0JBU0UgKDEgPDwgMCkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9CTUkxICAgICAoMSA8PCAzKQorI2RlZmluZSBDUFVJRF83XzBfRUJYX0hMRSAgICAgICgxIDw8IDQpCisjZGVmaW5lIENQVUlEXzdfMF9FQlhfQVZYMiAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9TTUVQICAgICAoMSA8PCA3KQorI2RlZmluZSBDUFVJRF83XzBfRUJYX0JNSTIgICAgICgxIDw8IDgpCisjZGVmaW5lIENQVUlEXzdfMF9FQlhfRVJNUyAgICAgKDEgPDwgOSkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9JTlZQQ0lEICAoMSA8PCAxMCkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9SVE0gICAgICAoMSA8PCAxMSkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9SRFNFRUQgICAoMSA8PCAxOCkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9BRFggICAgICAoMSA8PCAxOSkKKyNkZWZpbmUgQ1BVSURfN18wX0VCWF9TTUFQICAgICAoMSA8PCAyMCkKKworI2RlZmluZSBDUFVJRF9WRU5ET1JfU1ogICAgICAxMgorCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9JTlRFTF8xIDB4NzU2ZTY1NDcgLyogIkdlbnUiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9JTlRFTF8yIDB4NDk2NTZlNjkgLyogImluZUkiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9JTlRFTF8zIDB4NmM2NTc0NmUgLyogIm50ZWwiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9JTlRFTCAiR2VudWluZUludGVsIgorCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9BTURfMSAgIDB4Njg3NDc1NDEgLyogIkF1dGgiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9BTURfMiAgIDB4Njk3NDZlNjUgLyogImVudGkiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9BTURfMyAgIDB4NDQ0ZDQxNjMgLyogImNBTUQiICovCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9BTUQgICAiQXV0aGVudGljQU1EIgorCisjZGVmaW5lIENQVUlEX1ZFTkRPUl9WSUEgICAiQ2VudGF1ckhhdWxzIgorCisjZGVmaW5lIENQVUlEX01XQUlUX0lCRSAgICAgKDEgPDwgMSkgLyogSW50ZXJydXB0cyBjYW4gZXhpdCBjYXBhYmlsaXR5ICovCisjZGVmaW5lIENQVUlEX01XQUlUX0VNWCAgICAgKDEgPDwgMCkgLyogZW51bWVyYXRpb24gc3VwcG9ydGVkICovCisKKyNpZm5kZWYgSFlQRVJWX1NQSU5MT0NLX05FVkVSX1JFVFJZCisjZGVmaW5lIEhZUEVSVl9TUElOTE9DS19ORVZFUl9SRVRSWSAgICAgICAgICAgICAweEZGRkZGRkZGCisjZW5kaWYKKworI2RlZmluZSBFWENQMDBfRElWWgkwCisjZGVmaW5lIEVYQ1AwMV9EQgkxCisjZGVmaW5lIEVYQ1AwMl9OTUkJMgorI2RlZmluZSBFWENQMDNfSU5UMwkzCisjZGVmaW5lIEVYQ1AwNF9JTlRPCTQKKyNkZWZpbmUgRVhDUDA1X0JPVU5ECTUKKyNkZWZpbmUgRVhDUDA2X0lMTE9QCTYKKyNkZWZpbmUgRVhDUDA3X1BSRVgJNworI2RlZmluZSBFWENQMDhfREJMRQk4CisjZGVmaW5lIEVYQ1AwOV9YRVJSCTkKKyNkZWZpbmUgRVhDUDBBX1RTUwkxMAorI2RlZmluZSBFWENQMEJfTk9TRUcJMTEKKyNkZWZpbmUgRVhDUDBDX1NUQUNLCTEyCisjZGVmaW5lIEVYQ1AwRF9HUEYJMTMKKyNkZWZpbmUgRVhDUDBFX1BBR0UJMTQKKyNkZWZpbmUgRVhDUDEwX0NPUFIJMTYKKyNkZWZpbmUgRVhDUDExX0FMR04JMTcKKyNkZWZpbmUgRVhDUDEyX01DSEsJMTgKKworI2RlZmluZSBFWENQX1NZU0NBTEwgICAgMHgxMDAgLyogb25seSBoYXBwZW5zIGluIHVzZXIgb25seSBlbXVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzeXNjYWxsIGluc3RydWN0aW9uICovCisKKy8qIGkzODYtc3BlY2lmaWMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4gICovCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfUE9MTCAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0VYVF8xCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfU01JICAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0VYVF8yCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfTk1JICAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0VYVF8zCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfTUNFICAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0VYVF80CisjZGVmaW5lIENQVV9JTlRFUlJVUFRfVklSUSAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8wCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfSU5JVCAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8xCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfU0lQSSAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8yCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfVFBSICAgICAgIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8zCisKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQ19PUF9EWU5BTUlDLCAvKiBtdXN0IHVzZSBkeW5hbWljIGNvZGUgdG8gZ2V0IGNjX29wICovCisgICAgQ0NfT1BfRUZMQUdTLCAgLyogYWxsIGNjIGFyZSBleHBsaWNpdGx5IGNvbXB1dGVkLCBDQ19TUkMgPSBmbGFncyAqLworCisgICAgQ0NfT1BfTVVMQiwgLyogbW9kaWZ5IGFsbCBmbGFncywgQywgTyA9IChDQ19TUkMgIT0gMCkgKi8KKyAgICBDQ19PUF9NVUxXLAorICAgIENDX09QX01VTEwsCisgICAgQ0NfT1BfTVVMUSwKKworICAgIENDX09QX0FEREIsIC8qIG1vZGlmeSBhbGwgZmxhZ3MsIENDX0RTVCA9IHJlcywgQ0NfU1JDID0gc3JjMSAqLworICAgIENDX09QX0FERFcsCisgICAgQ0NfT1BfQURETCwKKyAgICBDQ19PUF9BRERRLAorCisgICAgQ0NfT1BfQURDQiwgLyogbW9kaWZ5IGFsbCBmbGFncywgQ0NfRFNUID0gcmVzLCBDQ19TUkMgPSBzcmMxICovCisgICAgQ0NfT1BfQURDVywKKyAgICBDQ19PUF9BRENMLAorICAgIENDX09QX0FEQ1EsCisKKyAgICBDQ19PUF9TVUJCLCAvKiBtb2RpZnkgYWxsIGZsYWdzLCBDQ19EU1QgPSByZXMsIENDX1NSQyA9IHNyYzEgKi8KKyAgICBDQ19PUF9TVUJXLAorICAgIENDX09QX1NVQkwsCisgICAgQ0NfT1BfU1VCUSwKKworICAgIENDX09QX1NCQkIsIC8qIG1vZGlmeSBhbGwgZmxhZ3MsIENDX0RTVCA9IHJlcywgQ0NfU1JDID0gc3JjMSAqLworICAgIENDX09QX1NCQlcsCisgICAgQ0NfT1BfU0JCTCwKKyAgICBDQ19PUF9TQkJRLAorCisgICAgQ0NfT1BfTE9HSUNCLCAvKiBtb2RpZnkgYWxsIGZsYWdzLCBDQ19EU1QgPSByZXMgKi8KKyAgICBDQ19PUF9MT0dJQ1csCisgICAgQ0NfT1BfTE9HSUNMLAorICAgIENDX09QX0xPR0lDUSwKKworICAgIENDX09QX0lOQ0IsIC8qIG1vZGlmeSBhbGwgZmxhZ3MgZXhjZXB0LCBDQ19EU1QgPSByZXMsIENDX1NSQyA9IEMgKi8KKyAgICBDQ19PUF9JTkNXLAorICAgIENDX09QX0lOQ0wsCisgICAgQ0NfT1BfSU5DUSwKKworICAgIENDX09QX0RFQ0IsIC8qIG1vZGlmeSBhbGwgZmxhZ3MgZXhjZXB0LCBDQ19EU1QgPSByZXMsIENDX1NSQyA9IEMgICovCisgICAgQ0NfT1BfREVDVywKKyAgICBDQ19PUF9ERUNMLAorICAgIENDX09QX0RFQ1EsCisKKyAgICBDQ19PUF9TSExCLCAvKiBtb2RpZnkgYWxsIGZsYWdzLCBDQ19EU1QgPSByZXMsIENDX1NSQy5tc2IgPSBDICovCisgICAgQ0NfT1BfU0hMVywKKyAgICBDQ19PUF9TSExMLAorICAgIENDX09QX1NITFEsCisKKyAgICBDQ19PUF9TQVJCLCAvKiBtb2RpZnkgYWxsIGZsYWdzLCBDQ19EU1QgPSByZXMsIENDX1NSQy5sc2IgPSBDICovCisgICAgQ0NfT1BfU0FSVywKKyAgICBDQ19PUF9TQVJMLAorICAgIENDX09QX1NBUlEsCisKKyAgICBDQ19PUF9OQiwKK30gQ0NPcDsKKwordHlwZWRlZiBzdHJ1Y3QgU2VnbWVudENhY2hlIHsKKyAgICB1aW50MzJfdCBzZWxlY3RvcjsKKyAgICB0YXJnZXRfdWxvbmcgYmFzZTsKKyAgICB1aW50MzJfdCBsaW1pdDsKKyAgICB1aW50MzJfdCBmbGFnczsKK30gU2VnbWVudENhY2hlOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICB1aW50OF90IF9iWzE2XTsKKyAgICB1aW50MTZfdCBfd1s4XTsKKyAgICB1aW50MzJfdCBfbFs0XTsKKyAgICB1aW50NjRfdCBfcVsyXTsKKyAgICBmbG9hdDMyIF9zWzRdOworICAgIGZsb2F0NjQgX2RbMl07Cit9IFhNTVJlZzsKKwordHlwZWRlZiB1bmlvbiB7CisgICAgdWludDhfdCBfYls4XTsKKyAgICB1aW50MTZfdCBfd1s0XTsKKyAgICB1aW50MzJfdCBfbFsyXTsKKyAgICBmbG9hdDMyIF9zWzJdOworICAgIHVpbnQ2NF90IHE7Cit9IE1NWFJlZzsKKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBYTU1fQihuKSBfYlsxNSAtIChuKV0KKyNkZWZpbmUgWE1NX1cobikgX3dbNyAtIChuKV0KKyNkZWZpbmUgWE1NX0wobikgX2xbMyAtIChuKV0KKyNkZWZpbmUgWE1NX1MobikgX3NbMyAtIChuKV0KKyNkZWZpbmUgWE1NX1EobikgX3FbMSAtIChuKV0KKyNkZWZpbmUgWE1NX0QobikgX2RbMSAtIChuKV0KKworI2RlZmluZSBNTVhfQihuKSBfYls3IC0gKG4pXQorI2RlZmluZSBNTVhfVyhuKSBfd1szIC0gKG4pXQorI2RlZmluZSBNTVhfTChuKSBfbFsxIC0gKG4pXQorI2RlZmluZSBNTVhfUyhuKSBfc1sxIC0gKG4pXQorI2Vsc2UKKyNkZWZpbmUgWE1NX0IobikgX2Jbbl0KKyNkZWZpbmUgWE1NX1cobikgX3dbbl0KKyNkZWZpbmUgWE1NX0wobikgX2xbbl0KKyNkZWZpbmUgWE1NX1MobikgX3Nbbl0KKyNkZWZpbmUgWE1NX1EobikgX3Fbbl0KKyNkZWZpbmUgWE1NX0QobikgX2Rbbl0KKworI2RlZmluZSBNTVhfQihuKSBfYltuXQorI2RlZmluZSBNTVhfVyhuKSBfd1tuXQorI2RlZmluZSBNTVhfTChuKSBfbFtuXQorI2RlZmluZSBNTVhfUyhuKSBfc1tuXQorI2VuZGlmCisjZGVmaW5lIE1NWF9RKG4pIHEKKwordHlwZWRlZiB1bmlvbiB7CisgICAgZmxvYXR4ODAgZCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOworICAgIE1NWFJlZyBtbXg7Cit9IEZQUmVnOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDY0X3QgYmFzZTsKKyAgICB1aW50NjRfdCBtYXNrOworfSBNVFJSVmFyOworCisjZGVmaW5lIENQVV9OQl9SRUdTNjQgMTYKKyNkZWZpbmUgQ1BVX05CX1JFR1MzMiA4CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisjZGVmaW5lIENQVV9OQl9SRUdTIENQVV9OQl9SRUdTNjQKKyNlbHNlCisjZGVmaW5lIENQVV9OQl9SRUdTIENQVV9OQl9SRUdTMzIKKyNlbmRpZgorCisjZGVmaW5lIE5CX01NVV9NT0RFUyAyCisKK3R5cGVkZWYgc3RydWN0IENQVVg4NlN0YXRlIHsKKyAgICAvKiBzdGFuZGFyZCByZWdpc3RlcnMgKi8KKyAgICB0YXJnZXRfdWxvbmcgcmVnc1tDUFVfTkJfUkVHU107CisgICAgdGFyZ2V0X3Vsb25nIGVpcDsKKyAgICB0YXJnZXRfdWxvbmcgZWZsYWdzOyAvKiBlZmxhZ3MgcmVnaXN0ZXIuIER1cmluZyBDUFUgZW11bGF0aW9uLCBDQworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgYW5kIERGIGFyZSBzZXQgdG8gemVybyBiZWNhdXNlIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQgZWxzZXdoZXJlICovCisKKyAgICAvKiBlbXVsYXRvciBpbnRlcm5hbCBlZmxhZ3MgaGFuZGxpbmcgKi8KKyAgICB0YXJnZXRfdWxvbmcgY2Nfc3JjOworICAgIHRhcmdldF91bG9uZyBjY19kc3Q7CisgICAgdWludDMyX3QgY2Nfb3A7CisgICAgaW50MzJfdCBkZjsgLyogRCBmbGFnIDogMSBpZiBEID0gMCwgLTEgaWYgRCA9IDEgKi8KKyAgICB1aW50MzJfdCBoZmxhZ3M7IC8qIFRCIGZsYWdzLCBzZWUgSEZfeHh4IGNvbnN0YW50cy4gVGhlc2UgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBrbm93biBhdCB0cmFuc2xhdGlvbiB0aW1lLiAqLworICAgIHVpbnQzMl90IGhmbGFnczI7IC8qIHZhcmlvdXMgb3RoZXIgZmxhZ3MsIHNlZSBIRjJfeHh4IGNvbnN0YW50cy4gKi8KKworICAgIC8qIHNlZ21lbnRzICovCisgICAgU2VnbWVudENhY2hlIHNlZ3NbNl07IC8qIHNlbGVjdG9yIHZhbHVlcyAqLworICAgIFNlZ21lbnRDYWNoZSBsZHQ7CisgICAgU2VnbWVudENhY2hlIHRyOworICAgIFNlZ21lbnRDYWNoZSBnZHQ7IC8qIG9ubHkgYmFzZSBhbmQgbGltaXQgYXJlIHVzZWQgKi8KKyAgICBTZWdtZW50Q2FjaGUgaWR0OyAvKiBvbmx5IGJhc2UgYW5kIGxpbWl0IGFyZSB1c2VkICovCisKKyAgICB0YXJnZXRfdWxvbmcgY3JbNV07IC8qIE5PVEU6IGNyMSBpcyB1bnVzZWQgKi8KKyAgICB1aW50NjRfdCBhMjBfbWFzazsKKworICAgIC8qIEZQVSBzdGF0ZSAqLworICAgIHVuc2lnbmVkIGludCBmcHN0dDsgLyogdG9wIG9mIHN0YWNrIGluZGV4ICovCisgICAgdW5zaWduZWQgaW50IGZwdXM7CisgICAgdW5zaWduZWQgaW50IGZwdWM7CisgICAgdWludDhfdCBmcHRhZ3NbOF07ICAgLyogMCA9IHZhbGlkLCAxID0gZW1wdHkgKi8KKyAgICBGUFJlZyBmcHJlZ3NbOF07CisKKyAgICAvKiBlbXVsYXRvciBpbnRlcm5hbCB2YXJpYWJsZXMgKi8KKyAgICBmbG9hdF9zdGF0dXMgZnBfc3RhdHVzOworICAgIGZsb2F0eDgwIGZ0MDsKKworICAgIGZsb2F0X3N0YXR1cyBtbXhfc3RhdHVzOyAvKiBmb3IgM0ROb3chIGZsb2F0IG9wcyAqLworICAgIGZsb2F0X3N0YXR1cyBzc2Vfc3RhdHVzOworICAgIHVpbnQzMl90IG14Y3NyOworICAgIFhNTVJlZyB4bW1fcmVnc1tDUFVfTkJfUkVHU107CisgICAgWE1NUmVnIHhtbV90MDsKKyAgICBNTVhSZWcgbW14X3QwOworCisgICAgLyogc3lzZW50ZXIgcmVnaXN0ZXJzICovCisgICAgdWludDMyX3Qgc3lzZW50ZXJfY3M7CisgICAgdGFyZ2V0X3Vsb25nIHN5c2VudGVyX2VzcDsKKyAgICB0YXJnZXRfdWxvbmcgc3lzZW50ZXJfZWlwOworICAgIHVpbnQ2NF90IGVmZXI7CisgICAgdWludDY0X3Qgc3RhcjsKKworICAgIHVpbnQ2NF90IHZtX2hzYXZlOworICAgIHVpbnQ2NF90IHZtX3ZtY2I7CisgICAgdWludDY0X3QgdHNjX29mZnNldDsKKyAgICB1aW50NjRfdCBpbnRlcmNlcHQ7CisgICAgdWludDE2X3QgaW50ZXJjZXB0X2NyX3JlYWQ7CisgICAgdWludDE2X3QgaW50ZXJjZXB0X2NyX3dyaXRlOworICAgIHVpbnQxNl90IGludGVyY2VwdF9kcl9yZWFkOworICAgIHVpbnQxNl90IGludGVyY2VwdF9kcl93cml0ZTsKKyAgICB1aW50MzJfdCBpbnRlcmNlcHRfZXhjZXB0aW9uczsKKyAgICB1aW50OF90IHZfdHByOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIHRhcmdldF91bG9uZyBsc3RhcjsKKyAgICB0YXJnZXRfdWxvbmcgY3N0YXI7CisgICAgdGFyZ2V0X3Vsb25nIGZtYXNrOworICAgIHRhcmdldF91bG9uZyBrZXJuZWxnc2Jhc2U7CisjZW5kaWYKKworICAgIHVpbnQ2NF90IHRzYzsKKworICAgIHVpbnQ2NF90IHBhdDsKKworICAgIC8qIGV4Y2VwdGlvbi9pbnRlcnJ1cHQgaGFuZGxpbmcgKi8KKyAgICBpbnQgZXJyb3JfY29kZTsKKyAgICBpbnQgZXhjZXB0aW9uX2lzX2ludDsKKyAgICB0YXJnZXRfdWxvbmcgZXhjZXB0aW9uX25leHRfZWlwOworICAgIHRhcmdldF91bG9uZyBkcls4XTsgLyogZGVidWcgcmVnaXN0ZXJzICovCisgICAgdW5pb24geworICAgICAgICBDUFVCcmVha3BvaW50ICpjcHVfYnJlYWtwb2ludFs0XTsKKyAgICAgICAgQ1BVV2F0Y2hwb2ludCAqY3B1X3dhdGNocG9pbnRbNF07CisgICAgfTsgLyogYnJlYWsvd2F0Y2hwb2ludHMgZm9yIGRyWzAuLjNdICovCisgICAgdWludDMyX3Qgc21iYXNlOworICAgIGludCBvbGRfZXhjZXB0aW9uOyAgLyogZXhjZXB0aW9uIGluIGZsaWdodCAqLworCisgICAgQ1BVX0NPTU1PTgorCisgICAgLyogcHJvY2Vzc29yIGZlYXR1cmVzIChlLmcuIGZvciBDUFVJRCBpbnNuKSAqLworICAgIHVpbnQzMl90IGNwdWlkX2xldmVsOworICAgIHVpbnQzMl90IGNwdWlkX3ZlbmRvcjE7CisgICAgdWludDMyX3QgY3B1aWRfdmVuZG9yMjsKKyAgICB1aW50MzJfdCBjcHVpZF92ZW5kb3IzOworICAgIHVpbnQzMl90IGNwdWlkX3ZlcnNpb247CisgICAgdWludDMyX3QgY3B1aWRfZmVhdHVyZXM7CisgICAgdWludDMyX3QgY3B1aWRfZXh0X2ZlYXR1cmVzOworICAgIHVpbnQzMl90IGNwdWlkX3hsZXZlbDsKKyAgICB1aW50MzJfdCBjcHVpZF9tb2RlbFsxMl07CisgICAgdWludDMyX3QgY3B1aWRfZXh0Ml9mZWF0dXJlczsKKyAgICB1aW50MzJfdCBjcHVpZF9leHQzX2ZlYXR1cmVzOworICAgIHVpbnQzMl90IGNwdWlkX2FwaWNfaWQ7CisgICAgaW50IGNwdWlkX3ZlbmRvcl9vdmVycmlkZTsKKworICAgIC8qIE1UUlJzICovCisgICAgdWludDY0X3QgbXRycl9maXhlZFsxMV07CisgICAgdWludDY0X3QgbXRycl9kZWZ0eXBlOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IGJhc2U7CisgICAgICAgIHVpbnQ2NF90IG1hc2s7CisgICAgfSBtdHJyX3Zhcls4XTsKKworICAgIC8qIEZvciBLVk0gKi8KKyAgICB1aW50NjRfdCBpbnRlcnJ1cHRfYml0bWFwWzI1NiAvIDY0XTsKKyAgICB1aW50MzJfdCBtcF9zdGF0ZTsKKworICAgIC8qIGluIG9yZGVyIHRvIHNpbXBsaWZ5IEFQSUMgc3VwcG9ydCwgd2UgbGVhdmUgdGhpcyBwb2ludGVyIHRvIHRoZQorICAgICAgIHVzZXIgKi8KKyAgICBzdHJ1Y3QgQVBJQ1N0YXRlICphcGljX3N0YXRlOworCisgICAgdWludDY0IG1jZ19jYXA7CisgICAgdWludDY0IG1jZ19zdGF0dXM7CisgICAgdWludDY0IG1jZ19jdGw7CisgICAgdWludDY0ICptY2VfYmFua3M7Cit9IENQVVg4NlN0YXRlOworCisjaW5jbHVkZSAiY3B1LXFvbS5oIgorCitDUFVYODZTdGF0ZSAqY3B1X3g4Nl9pbml0KGNvbnN0IGNoYXIgKmNwdV9tb2RlbCk7CitpbnQgY3B1X3g4Nl9leGVjKENQVVg4NlN0YXRlICpzKTsKK3ZvaWQgY3B1X3g4Nl9jbG9zZShDUFVYODZTdGF0ZSAqcyk7Cit2b2lkIHg4Nl9jcHVfbGlzdChGSUxFICpmLCBmcHJpbnRmX2Z1bmN0aW9uIGNwdV9mcHJpbnRmKTsKK2ludCBjcHVfZ2V0X3BpY19pbnRlcnJ1cHQoQ1BVWDg2U3RhdGUgKnMpOworLyogTVNET1MgY29tcGF0aWJpbGl0eSBtb2RlIEZQVSBleGNlcHRpb24gc3VwcG9ydCAqLwordm9pZCBjcHVfc2V0X2ZlcnIoQ1BVWDg2U3RhdGUgKnMpOworCisvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYWx3YXlzIGJlIHVzZWQgdG8gbG9hZCBkYXRhIGluIHRoZSBzZWdtZW50CisgICBjYWNoZTogaXQgc3luY2hyb25pemVzIHRoZSBoZmxhZ3Mgd2l0aCB0aGUgc2VnbWVudCBjYWNoZSB2YWx1ZXMgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VnX3JlZywgdW5zaWduZWQgaW50IHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgU2VnbWVudENhY2hlICpzYzsKKyAgICB1bnNpZ25lZCBpbnQgbmV3X2hmbGFnczsKKworICAgIHNjID0gJmVudi0+c2Vnc1tzZWdfcmVnXTsKKyAgICBzYy0+c2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICBzYy0+YmFzZSA9IGJhc2U7CisgICAgc2MtPmxpbWl0ID0gbGltaXQ7CisgICAgc2MtPmZsYWdzID0gZmxhZ3M7CisKKyAgICAvKiB1cGRhdGUgdGhlIGhpZGRlbiBmbGFncyAqLworICAgIHsKKyAgICAgICAgaWYgKHNlZ19yZWcgPT0gUl9DUykgeworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgIGlmICgoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgJiYgKGZsYWdzICYgREVTQ19MX01BU0spKSB7CisgICAgICAgICAgICAgICAgLyogbG9uZyBtb2RlICovCisgICAgICAgICAgICAgICAgZW52LT5oZmxhZ3MgfD0gSEZfQ1MzMl9NQVNLIHwgSEZfU1MzMl9NQVNLIHwgSEZfQ1M2NF9NQVNLOworICAgICAgICAgICAgICAgIGVudi0+aGZsYWdzICY9IH4oSEZfQUREU0VHX01BU0spOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBsZWdhY3kgLyBjb21wYXRpYmlsaXR5IGNhc2UgKi8KKyAgICAgICAgICAgICAgICBuZXdfaGZsYWdzID0gKGVudi0+c2Vnc1tSX0NTXS5mbGFncyAmIERFU0NfQl9NQVNLKQorICAgICAgICAgICAgICAgICAgICA+PiAoREVTQ19CX1NISUZUIC0gSEZfQ1MzMl9TSElGVCk7CisgICAgICAgICAgICAgICAgZW52LT5oZmxhZ3MgPSAoZW52LT5oZmxhZ3MgJiB+KEhGX0NTMzJfTUFTSyB8IEhGX0NTNjRfTUFTSykpIHwKKyAgICAgICAgICAgICAgICAgICAgbmV3X2hmbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXdfaGZsYWdzID0gKGVudi0+c2Vnc1tSX1NTXS5mbGFncyAmIERFU0NfQl9NQVNLKQorICAgICAgICAgICAgPj4gKERFU0NfQl9TSElGVCAtIEhGX1NTMzJfU0hJRlQpOworICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9DUzY0X01BU0spIHsKKyAgICAgICAgICAgIC8qIHplcm8gYmFzZSBhc3N1bWVkIGZvciBEUywgRVMgYW5kIFNTIGluIGxvbmcgbW9kZSAqLworICAgICAgICB9IGVsc2UgaWYgKCEoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSB8fAorICAgICAgICAgICAgICAgICAgIChlbnYtPmVmbGFncyAmIFZNX01BU0spIHx8CisgICAgICAgICAgICAgICAgICAgIShlbnYtPmhmbGFncyAmIEhGX0NTMzJfTUFTSykpIHsKKyAgICAgICAgICAgIC8qIFhYWDogdHJ5IHRvIGF2b2lkIHRoaXMgdGVzdC4gVGhlIHByb2JsZW0gY29tZXMgZnJvbSB0aGUKKyAgICAgICAgICAgICAgIGZhY3QgdGhhdCBpcyByZWFsIG1vZGUgb3Igdm04NiBtb2RlIHdlIG9ubHkgbW9kaWZ5IHRoZQorICAgICAgICAgICAgICAgJ2Jhc2UnIGFuZCAnc2VsZWN0b3InIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBjYWNoZSB0byBnbworICAgICAgICAgICAgICAgZmFzdGVyLiBBIHNvbHV0aW9uIG1heSBiZSB0byBmb3JjZSBhZGRzZWcgdG8gb25lIGluCisgICAgICAgICAgICAgICB0cmFuc2xhdGUtaTM4Ni5jLiAqLworICAgICAgICAgICAgbmV3X2hmbGFncyB8PSBIRl9BRERTRUdfTUFTSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld19oZmxhZ3MgfD0gKChlbnYtPnNlZ3NbUl9EU10uYmFzZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5zZWdzW1JfRVNdLmJhc2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+c2Vnc1tSX1NTXS5iYXNlKSAhPSAwKSA8PAorICAgICAgICAgICAgICAgIEhGX0FERFNFR19TSElGVDsKKyAgICAgICAgfQorICAgICAgICBlbnYtPmhmbGFncyA9IChlbnYtPmhmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgIH4oSEZfU1MzMl9NQVNLIHwgSEZfQUREU0VHX01BU0spKSB8IG5ld19oZmxhZ3M7CisgICAgfQorfQorCisvKiB3cmFwcGVyLCBqdXN0IGluIGNhc2UgbWVtb3J5IG1hcHBpbmdzIG11c3QgYmUgY2hhbmdlZCAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdV94ODZfc2V0X2NwbChDUFVYODZTdGF0ZSAqcywgaW50IGNwbCkKK3sKKyNpZiBIRl9DUExfTUFTSyA9PSAzCisgICAgcy0+aGZsYWdzID0gKHMtPmhmbGFncyAmIH5IRl9DUExfTUFTSykgfCBjcGw7CisjZWxzZQorI2Vycm9yIEhGX0NQTF9NQVNLIGlzIGhhcmRjb2RlZAorI2VuZGlmCit9CisKKy8qIG9wX2hlbHBlci5jICovCisvKiB1c2VkIGZvciBkZWJ1ZyBvciBjcHUgc2F2ZS9yZXN0b3JlICovCit2b2lkIGNwdV9nZXRfZnA4MCh1aW50NjRfdCAqcG1hbnQsIHVpbnQxNl90ICpwZXhwLCBmbG9hdHg4MCBmKTsKK2Zsb2F0eDgwIGNwdV9zZXRfZnA4MCh1aW50NjRfdCBtYW50LCB1aW50MTZfdCB1cHBlcik7CisKKy8qIGNwdS1leGVjLmMgKi8KKy8qIHRoZSBmb2xsb3dpbmcgaGVscGVycyBhcmUgb25seSB1c2FibGUgaW4gdXNlciBtb2RlIHNpbXVsYXRpb24gYXMKKyAgIHRoZXkgY2FuIHRyaWdnZXIgdW5leHBlY3RlZCBleGNlcHRpb25zICovCit2b2lkIGNwdV94ODZfbG9hZF9zZWcoQ1BVWDg2U3RhdGUgKnMsIGludCBzZWdfcmVnLCBpbnQgc2VsZWN0b3IpOwordm9pZCBjcHVfeDg2X2ZzYXZlKENQVVg4NlN0YXRlICpzLCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKTsKK3ZvaWQgY3B1X3g4Nl9mcnN0b3IoQ1BVWDg2U3RhdGUgKnMsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpOworCisvKiB5b3UgY2FuIGNhbGwgdGhpcyBzaWduYWwgaGFuZGxlciBmcm9tIHlvdXIgU0lHQlVTIGFuZCBTSUdTRUdWCisgICBzaWduYWwgaGFuZGxlcnMgdG8gaW5mb3JtIHRoZSB2aXJ0dWFsIENQVSBvZiBleGNlcHRpb25zLiBub24gemVybworICAgaXMgcmV0dXJuZWQgaWYgdGhlIHNpZ25hbCB3YXMgaGFuZGxlZCBieSB0aGUgdmlydHVhbCBDUFUuICAqLworaW50IGNwdV94ODZfc2lnbmFsX2hhbmRsZXIoaW50IGhvc3Rfc2lnbnVtLCB2b2lkICpwaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB1Yyk7CisKKy8qIGhlbHBlci5jICovCitpbnQgY3B1X3g4Nl9oYW5kbGVfbW11X2ZhdWx0KENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfd3JpdGUsIGludCBtbXVfaWR4KTsKK3ZvaWQgY3B1X3g4Nl9zZXRfYTIwKENQVVg4NlN0YXRlICplbnYsIGludCBhMjBfc3RhdGUpOwordm9pZCBjcHVfeDg2X2NwdWlkKENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWF4LCB1aW50MzJfdCAqZWJ4LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplY3gsIHVpbnQzMl90ICplZHgpOworCitzdGF0aWMgaW5saW5lIGludCBod19icmVha3BvaW50X2VuYWJsZWQodW5zaWduZWQgbG9uZyBkcjcsIGludCBpbmRleCkKK3sKKyAgICByZXR1cm4gKGRyNyA+PiAoaW5kZXggKiAyKSkgJiAzOworfQorCitzdGF0aWMgaW5saW5lIGludCBod19icmVha3BvaW50X3R5cGUodW5zaWduZWQgbG9uZyBkcjcsIGludCBpbmRleCkKK3sKKyAgICByZXR1cm4gKGRyNyA+PiAoRFI3X1RZUEVfU0hJRlQgKyAoaW5kZXggKiAyKSkpICYgMzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaHdfYnJlYWtwb2ludF9sZW4odW5zaWduZWQgbG9uZyBkcjcsIGludCBpbmRleCkKK3sKKyAgICBpbnQgbGVuID0gKChkcjcgPj4gKERSN19MRU5fU0hJRlQgKyAoaW5kZXggKiAyKSkpICYgMyk7CisgICAgcmV0dXJuIChsZW4gPT0gMikgPyA4IDogbGVuICsgMTsKK30KKwordm9pZCBod19icmVha3BvaW50X2luc2VydChDUFVYODZTdGF0ZSAqZW52LCBpbnQgaW5kZXgpOwordm9pZCBod19icmVha3BvaW50X3JlbW92ZShDUFVYODZTdGF0ZSAqZW52LCBpbnQgaW5kZXgpOworaW50IGNoZWNrX2h3X2JyZWFrcG9pbnRzKENQVVg4NlN0YXRlICplbnYsIGludCBmb3JjZV9kcjZfdXBkYXRlKTsKKworLyogd2lsbCBiZSBzdXBwcmVzc2VkICovCit2b2lkIGNwdV94ODZfdXBkYXRlX2NyMChDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCBuZXdfY3IwKTsKK3ZvaWQgY3B1X3g4Nl91cGRhdGVfY3IzKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBuZXdfY3IzKTsKK3ZvaWQgY3B1X3g4Nl91cGRhdGVfY3I0KENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IG5ld19jcjQpOworCisvKiBody9hcGljLmMgKi8KK3ZvaWQgY3B1X3NldF9hcGljX2Jhc2UoQ1BVWDg2U3RhdGUgKmVudiwgdWludDY0X3QgdmFsKTsKK3VpbnQ2NF90IGNwdV9nZXRfYXBpY19iYXNlKENQVVg4NlN0YXRlICplbnYpOwordm9pZCBjcHVfc2V0X2FwaWNfdHByKENQVVg4NlN0YXRlICplbnYsIHVpbnQ4X3QgdmFsKTsKKyNpZm5kZWYgTk9fQ1BVX0lPX0RFRlMKK3VpbnQ4X3QgY3B1X2dldF9hcGljX3RwcihDUFVYODZTdGF0ZSAqZW52KTsKKyNlbmRpZgorCisvKiBody9wYy5jICovCit2b2lkIGNwdV9zbW1fdXBkYXRlKENQVVg4NlN0YXRlICplbnYpOwordWludDY0X3QgY3B1X2dldF90c2MoQ1BVWDg2U3RhdGUgKmVudik7CisKKy8qIHVzZWQgdG8gZGVidWcgKi8KKyNkZWZpbmUgWDg2X0RVTVBfRlBVICAweDAwMDEgLyogZHVtcCBGUFUgc3RhdGUgdG9vICovCisjZGVmaW5lIFg4Nl9EVU1QX0NDT1AgMHgwMDAyIC8qIGR1bXAgcWVtdSBmbGFnIGNhY2hlICovCisKKyNkZWZpbmUgVEFSR0VUX1BBR0VfQklUUyAxMgorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorI2RlZmluZSBUQVJHRVRfUEhZU19BRERSX1NQQUNFX0JJVFMgNTIKKy8qID8/PyBUaGlzIGlzIHJlYWxseSA0OCBiaXRzLCBzaWduLWV4dGVuZGVkLCBidXQgdGhlIG9ubHkgdGhpbmcKKyAgIGFjY2Vzc2libGUgdG8gdXNlcmxhbmQgd2l0aCBiaXQgNDggc2V0IGlzIHRoZSBWU1lTQ0FMTCwgYW5kIHRoYXQKKyAgIGlzIGhhbmRsZWQgdmlhIG90aGVyIG1lY2hhbmlzbXMuICAqLworI2RlZmluZSBUQVJHRVRfVklSVF9BRERSX1NQQUNFX0JJVFMgNDcKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9QSFlTX0FERFJfU1BBQ0VfQklUUyAzNgorI2RlZmluZSBUQVJHRVRfVklSVF9BRERSX1NQQUNFX0JJVFMgMzIKKyNlbmRpZgorCisjZGVmaW5lIGNwdV9pbml0IGNwdV94ODZfaW5pdAorI2RlZmluZSBjcHVfZXhlYyBjcHVfeDg2X2V4ZWMKKyNkZWZpbmUgY3B1X2dlbl9jb2RlIGNwdV94ODZfZ2VuX2NvZGUKKyNkZWZpbmUgY3B1X3NpZ25hbF9oYW5kbGVyIGNwdV94ODZfc2lnbmFsX2hhbmRsZXIKKyNkZWZpbmUgY3B1X2xpc3QgeDg2X2NwdV9saXN0CisKKyNkZWZpbmUgQ1BVX1NBVkVfVkVSU0lPTiAxMAorCisvKiBNTVUgbW9kZXMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTU1VX01PREUwX1NVRkZJWCBfa2VybmVsCisjZGVmaW5lIE1NVV9NT0RFMV9TVUZGSVggX3VzZXIKKyNkZWZpbmUgTU1VX1VTRVJfSURYIDEKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9tbXVfaW5kZXggKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIChlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLKSA9PSAzID8gMSA6IDA7Cit9CisKKyN1bmRlZiBFQVgKKyNkZWZpbmUgRUFYIChlbnYtPnJlZ3NbUl9FQVhdKQorI3VuZGVmIEVDWAorI2RlZmluZSBFQ1ggKGVudi0+cmVnc1tSX0VDWF0pCisjdW5kZWYgRURYCisjZGVmaW5lIEVEWCAoZW52LT5yZWdzW1JfRURYXSkKKyN1bmRlZiBFQlgKKyNkZWZpbmUgRUJYIChlbnYtPnJlZ3NbUl9FQlhdKQorI3VuZGVmIEVTUAorI2RlZmluZSBFU1AgKGVudi0+cmVnc1tSX0VTUF0pCisjdW5kZWYgRUJQCisjZGVmaW5lIEVCUCAoZW52LT5yZWdzW1JfRUJQXSkKKyN1bmRlZiBFU0kKKyNkZWZpbmUgRVNJIChlbnYtPnJlZ3NbUl9FU0ldKQorI3VuZGVmIEVESQorI2RlZmluZSBFREkgKGVudi0+cmVnc1tSX0VESV0pCisjdW5kZWYgRUlQCisjZGVmaW5lIEVJUCAoZW52LT5laXApCisjZGVmaW5lIERGICAoZW52LT5kZikKKworI2RlZmluZSBDQ19TUkMgKGVudi0+Y2Nfc3JjKQorI2RlZmluZSBDQ19EU1QgKGVudi0+Y2NfZHN0KQorI2RlZmluZSBDQ19PUCAgKGVudi0+Y2Nfb3ApCisKKy8qIG4gbXVzdCBiZSBhIGNvbnN0YW50IHRvIGJlIGVmZmljaWVudCAqLworc3RhdGljIGlubGluZSB0YXJnZXRfbG9uZyBsc2hpZnQodGFyZ2V0X2xvbmcgeCwgaW50IG4pCit7CisgICAgaWYgKG4gPj0gMCkKKyAgICAgICAgcmV0dXJuIHggPDwgbjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB4ID4+ICgtbik7Cit9CisKKy8qIGZsb2F0IG1hY3JvcyAqLworI2RlZmluZSBGVDAgICAgKGVudi0+ZnQwKQorI2RlZmluZSBTVDAgICAgKGVudi0+ZnByZWdzW2Vudi0+ZnBzdHRdLmQpCisjZGVmaW5lIFNUKG4pICAoZW52LT5mcHJlZ3NbKGVudi0+ZnBzdHQgKyAobikpICYgN10uZCkKKyNkZWZpbmUgU1QxICAgIFNUKDEpCisKKy8qIHRyYW5zbGF0ZS5jICovCit2b2lkIG9wdGltaXplX2ZsYWdzX2luaXQodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IENDVGFibGUgeworICAgIGludCAoKmNvbXB1dGVfYWxsKSh2b2lkKTsgLyogcmV0dXJuIGFsbCB0aGUgZmxhZ3MgKi8KKyAgICBpbnQgKCpjb21wdXRlX2MpKHZvaWQpOyAgLyogcmV0dXJuIHRoZSBDIGZsYWcgKi8KK30gQ0NUYWJsZTsKKworLyogWFhYIG5vdCBkZWZpbmVkIHlldC4gU2hvdWxkIGJlIGZpeGVkICovCitzdGF0aWMgaW5saW5lIGludCBpc19jcHVfdXNlcihDUFVYODZTdGF0ZSAqZW52KQoreworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorc3RhdGljIGlubGluZSB2b2lkIGNwdV9jbG9uZV9yZWdzKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBuZXdzcCkKK3sKKyAgICBpZiAobmV3c3ApCisgICAgICAgIGVudi0+cmVnc1tSX0VTUF0gPSBuZXdzcDsKKyAgICBlbnYtPnJlZ3NbUl9FQVhdID0gMDsKK30KKyNlbmRpZgorCisjaW5jbHVkZSAiZXhlYy9jcHUtYWxsLmgiCisjaW5jbHVkZSAic3ZtLmgiCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaGFzX3dvcmsoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBpbnQgd29yazsKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisgICAgd29yayA9IChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSAmJgorICAgICAgICAgICAoZW52LT5lZmxhZ3MgJiBJRl9NQVNLKTsKKyAgICB3b3JrIHw9IGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX05NSTsKKyAgICB3b3JrIHw9IGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX0lOSVQ7CisgICAgd29yayB8PSBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9TSVBJOworCisgICAgcmV0dXJuIHdvcms7Cit9CisKKyNpbmNsdWRlICJleGVjL2V4ZWMtYWxsLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfcGNfZnJvbV90YihDUFVYODZTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBlbnYtPmVpcCA9IHRiLT5wYyAtIHRiLT5jc19iYXNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2dldF90Yl9jcHVfc3RhdGUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nICpwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgKmNzX2Jhc2UsIGludCAqZmxhZ3MpCit7CisgICAgKmNzX2Jhc2UgPSBlbnYtPnNlZ3NbUl9DU10uYmFzZTsKKyAgICAqcGMgPSAqY3NfYmFzZSArIGVudi0+ZWlwOworICAgICpmbGFncyA9IGVudi0+aGZsYWdzIHwKKyAgICAgICAgKGVudi0+ZWZsYWdzICYgKElPUExfTUFTSyB8IFRGX01BU0sgfCBSRl9NQVNLIHwgVk1fTUFTSykpOworfQorCit2b2lkIGFwaWNfaW5pdF9yZXNldChDUFVYODZTdGF0ZSAqZW52KTsKK3ZvaWQgYXBpY19zaXBpKENQVVg4NlN0YXRlICplbnYpOwordm9pZCBkb19jcHVfaW5pdChDUFVYODZTdGF0ZSAqZW52KTsKK3ZvaWQgZG9fY3B1X3NpcGkoQ1BVWDg2U3RhdGUgKmVudik7CisKKy8qIGV4Y3BfaGVscGVyLmMgKi8KK3ZvaWQgZG9faW50ZXJydXB0KENQVUFyY2hTdGF0ZSAqZW52KTsKK3ZvaWQgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKENQVUFyY2hTdGF0ZSAqZW52LCBpbnQgaW50bm8sIGludCBpc19odyk7CisvL3ZvaWQgUUVNVV9OT1JFVFVSTiByYWlzZV9leGNlcHRpb25fZXJyKGludCBleGNlcHRpb25faW5kZXgsIGludCBlcnJvcl9jb2RlKTsKK3ZvaWQgUUVNVV9OT1JFVFVSTiByYWlzZV9leGNlcHRpb24oQ1BVQXJjaFN0YXRlICplbnYsIGludCBleGNlcHRpb25faW5kZXgpOwordm9pZCBRRU1VX05PUkVUVVJOIHJhaXNlX2V4Y2VwdGlvbl9lcnIoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGNlcHRpb25faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfY29kZSk7CisKK3ZvaWQgUUVNVV9OT1JFVFVSTiByYWlzZV9pbnRlcnJ1cHQoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludG5vLCBpbnQgaXNfaW50LCBpbnQgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5leHRfZWlwX2FkZGVuZCk7CisKK3ZvaWQgZG9fc21tX2VudGVyKENQVUFyY2hTdGF0ZSAqZW52MSk7CisKK3ZvaWQgc3ZtX2NoZWNrX2ludGVyY2VwdChDUFVBcmNoU3RhdGUgKmVudjEsIHVpbnQzMl90IHR5cGUpOworCisvKiBjY19oZWxwZXIuYyAqLworY29uc3QgdWludDhfdCBwYXJpdHlfdGFibGVbMjU2XTsKK3VpbnQzMl90IGNwdV9jY19jb21wdXRlX2FsbChDUFVBcmNoU3RhdGUgKmVudjEsIGludCBvcCk7CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY3B1X2NvbXB1dGVfZWZsYWdzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+ZWZsYWdzIHwgY3B1X2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApIHwgKERGICYgREZfTUFTSyk7Cit9CisKKy8qIE5PVEU6IENDX09QIG11c3QgYmUgbW9kaWZpZWQgbWFudWFsbHkgdG8gQ0NfT1BfRUZMQUdTICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2xvYWRfZWZsYWdzKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmxhZ3MsIGludCB1cGRhdGVfbWFzaykKK3sKKyAgICBDQ19TUkMgPSBlZmxhZ3MgJiAoQ0NfTyB8IENDX1MgfCBDQ19aIHwgQ0NfQSB8IENDX1AgfCBDQ19DKTsKKyAgICBERiA9IDEgLSAoMiAqICgoZWZsYWdzID4+IDEwKSAmIDEpKTsKKyAgICBlbnYtPmVmbGFncyA9IChlbnYtPmVmbGFncyAmIH51cGRhdGVfbWFzaykgfAorICAgICAgICAoZWZsYWdzICYgdXBkYXRlX21hc2spIHwgMHgyOworfQorCisvKiBsb2FkIGVmZXIgYW5kIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBoZmxhZ3MuIFhYWDogZG8gY29uc2lzdGVuY3kKKyAgIGNoZWNrcyB3aXRoIGNwdWlkIGJpdHMgPyAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdV9sb2FkX2VmZXIoQ1BVWDg2U3RhdGUgKmVudiwgdWludDY0X3QgdmFsKQoreworICAgIGVudi0+ZWZlciA9IHZhbDsKKyAgICBlbnYtPmhmbGFncyAmPSB+KEhGX0xNQV9NQVNLIHwgSEZfU1ZNRV9NQVNLKTsKKyAgICBpZiAoZW52LT5lZmVyICYgTVNSX0VGRVJfTE1BKQorICAgICAgICBlbnYtPmhmbGFncyB8PSBIRl9MTUFfTUFTSzsKKyAgICBpZiAoZW52LT5lZmVyICYgTVNSX0VGRVJfU1ZNRSkKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gSEZfU1ZNRV9NQVNLOworfQorCisKKyNlbmRpZiAvKiBDUFVfSTM4Nl9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2V4Y3BfaGVscGVyLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2V4Y3BfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5NzNlNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvZXhjcF9oZWxwZXIuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqICB4ODYgZXhjZXB0aW9uIGhlbHBlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicWVtdS9sb2cuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNpZiAwCisjZGVmaW5lIHJhaXNlX2V4Y2VwdGlvbl9lcnIoYSwgYilcCitkbyB7XAorICAgIHFlbXVfbG9nKCJyYWlzZV9leGNlcHRpb24gbGluZT0lZFxuIiwgX19MSU5FX18pO1wKKyAgICAocmFpc2VfZXhjZXB0aW9uX2VycikoYSwgYik7XAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCit2b2lkIGhlbHBlcl9yYWlzZV9pbnRlcnJ1cHQoQ1BVWDg2U3RhdGUgKmVudiwgaW50IGludG5vLCBpbnQgbmV4dF9laXBfYWRkZW5kKQoreworICAgIHJhaXNlX2ludGVycnVwdChlbnYsIGludG5vLCAxLCAwLCBuZXh0X2VpcF9hZGRlbmQpOworfQorCit2b2lkIGhlbHBlcl9yYWlzZV9leGNlcHRpb24oQ1BVWDg2U3RhdGUgKmVudiwgaW50IGV4Y2VwdGlvbl9pbmRleCkKK3sKKyAgICByYWlzZV9leGNlcHRpb24oZW52LCBleGNlcHRpb25faW5kZXgpOworfQorCisvKgorICogQ2hlY2sgbmVzdGVkIGV4Y2VwdGlvbnMgYW5kIGNoYW5nZSB0byBkb3VibGUgb3IgdHJpcGxlIGZhdWx0IGlmCisgKiBuZWVkZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCwgaWYgdGhpcyBpcyBub3QgYW4gaW50ZXJydXB0LgorICogUmV0dXJucyB0aGUgbmV3IGV4Y2VwdGlvbiBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfZXhjZXB0aW9uKENQVVg4NlN0YXRlICplbnYsIGludCBpbnRubywgaW50ICplcnJvcl9jb2RlKQoreworICAgIGludCBmaXJzdF9jb250cmlidXRvcnkgPSBlbnYtPm9sZF9leGNlcHRpb24gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudi0+b2xkX2V4Y2VwdGlvbiA+PSAxMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+b2xkX2V4Y2VwdGlvbiA8PSAxMyk7CisgICAgaW50IHNlY29uZF9jb250cmlidXRvcnkgPSBpbnRubyA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludG5vID49IDEwICYmIGludG5vIDw9IDEzKTsKKworICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19JTlQsICJjaGVja19leGNlcHRpb24gb2xkOiAweCV4IG5ldyAweCV4XG4iLAorICAgICAgICAgICAgICAgIGVudi0+b2xkX2V4Y2VwdGlvbiwgaW50bm8pOworCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICBpZiAoZW52LT5vbGRfZXhjZXB0aW9uID09IEVYQ1AwOF9EQkxFKSB7CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX1NWTUlfTUFTSykKKyAgICAgICAgICAgIGhlbHBlcl92bWV4aXQoZW52LCBTVk1fRVhJVF9TSFVURE9XTiwgMCk7IC8qIGRvZXMgbm90IHJldHVybiAqLworCisgICAgICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19SRVNFVCwgIlRyaXBsZSBmYXVsdFxuIik7CisKKyAgICAgICAgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdCgpOworICAgICAgICByZXR1cm4gRVhDUF9ITFQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKGZpcnN0X2NvbnRyaWJ1dG9yeSAmJiBzZWNvbmRfY29udHJpYnV0b3J5KQorICAgICAgICB8fCAoZW52LT5vbGRfZXhjZXB0aW9uID09IEVYQ1AwRV9QQUdFICYmCisgICAgICAgICAgICAoc2Vjb25kX2NvbnRyaWJ1dG9yeSB8fCAoaW50bm8gPT0gRVhDUDBFX1BBR0UpKSkpIHsKKyAgICAgICAgaW50bm8gPSBFWENQMDhfREJMRTsKKyAgICAgICAgKmVycm9yX2NvZGUgPSAwOworICAgIH0KKworICAgIGlmIChzZWNvbmRfY29udHJpYnV0b3J5IHx8IChpbnRubyA9PSBFWENQMEVfUEFHRSkgfHwKKyAgICAgICAgKGludG5vID09IEVYQ1AwOF9EQkxFKSkKKyAgICAgICAgZW52LT5vbGRfZXhjZXB0aW9uID0gaW50bm87CisKKyAgICByZXR1cm4gaW50bm87Cit9CisKKy8qCisgKiBTaWduYWwgYW4gaW50ZXJydXB0aW9uLiBJdCBpcyBleGVjdXRlZCBpbiB0aGUgbWFpbiBDUFUgbG9vcC4KKyAqIGlzX2ludCBpcyBUUlVFIGlmIGNvbWluZyBmcm9tIHRoZSBpbnQgaW5zdHJ1Y3Rpb24uIG5leHRfZWlwIGlzIHRoZQorICogRUlQIHZhbHVlIEFGVEVSIHRoZSBpbnRlcnJ1cHQgaW5zdHJ1Y3Rpb24uIEl0IGlzIG9ubHkgcmVsZXZhbnQgaWYKKyAqIGlzX2ludCBpcyBUUlVFLgorICovCit2b2lkIFFFTVVfTk9SRVRVUk4gcmFpc2VfaW50ZXJydXB0KENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRubywgaW50IGlzX2ludCwgaW50IGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgaWYgKCFpc19pbnQpIHsKKyAgICAgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9FWENQX0JBU0UgKyBpbnRubywgZXJyb3JfY29kZSk7CisgICAgICAgIGludG5vID0gY2hlY2tfZXhjZXB0aW9uKGVudiwgaW50bm8sICZlcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShlbnYsIFNWTV9FWElUX1NXSU5ULCAwKTsKKyAgICB9CisKKyAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IGludG5vOworICAgIGVudi0+ZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisgICAgZW52LT5leGNlcHRpb25faXNfaW50ID0gaXNfaW50OworICAgIGVudi0+ZXhjZXB0aW9uX25leHRfZWlwID0gZW52LT5laXAgKyBuZXh0X2VpcF9hZGRlbmQ7CisgICAgY3B1X2xvb3BfZXhpdChlbnYpOworfQorCisvKiBzaG9ydGN1dHMgdG8gZ2VuZXJhdGUgZXhjZXB0aW9ucyAqLworCit2b2lkIHJhaXNlX2V4Y2VwdGlvbl9lcnIoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhjZXB0aW9uX2luZGV4LCBpbnQgZXJyb3JfY29kZSkKK3sKKyAgICByYWlzZV9pbnRlcnJ1cHQoZW52LCBleGNlcHRpb25faW5kZXgsIDAsIGVycm9yX2NvZGUsIDApOworfQorCit2b2lkIHJhaXNlX2V4Y2VwdGlvbihDUFVYODZTdGF0ZSAqZW52LCBpbnQgZXhjZXB0aW9uX2luZGV4KQoreworICAgIHJhaXNlX2ludGVycnVwdChlbnYsIGV4Y2VwdGlvbl9pbmRleCwgMCwgMCwgMCk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2ZwdV9oZWxwZXIuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvZnB1X2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2N2Y4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2ZwdV9oZWxwZXIuYwpAQCAtMCwwICsxLDExOTUgQEAKKy8qCisgKiAgeDg2IEZQVSwgTU1YLzNETm93IS9TU0UvU1NFMi9TU0UzL1NTU0UzL1NTRTQvUE5JIGhlbHBlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorI2luY2x1ZGUgInFlbXUvYWVzLmgiCisjaW5jbHVkZSAicWVtdS9ob3N0LXV0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9leGVjLmgiCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KKworI2RlZmluZSBSQ19NQVNLICAgICAgICAgMHhjMDAKKyNkZWZpbmUgUkNfTkVBUiAgICAgICAgIDB4MDAwCisjZGVmaW5lIFJDX0RPV04gICAgICAgICAweDQwMAorI2RlZmluZSBSQ19VUCAgICAgICAgICAgMHg4MDAKKyNkZWZpbmUgUkNfQ0hPUCAgICAgICAgIDB4YzAwCisKKyNkZWZpbmUgTUFYVEFOIDkyMjMzNzIwMzY4NTQ3NzU4MDguMAorCisvKiB0aGUgZm9sbG93aW5nIGRlYWwgd2l0aCB4ODYgbG9uZyBkb3VibGUtcHJlY2lzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgTUFYRVhQRCAweDdmZmYKKyNkZWZpbmUgRVhQQklBUyAxNjM4MworI2RlZmluZSBFWFBEKGZwKSAgICAgICAgKGZwLmwudXBwZXIgJiAweDdmZmYpCisjZGVmaW5lIFNJR05EKGZwKSAgICAgICAoKGZwLmwudXBwZXIpICYgMHg4MDAwKQorI2RlZmluZSBNQU5URChmcCkgICAgICAgKGZwLmwubG93ZXIpCisjZGVmaW5lIEJJQVNFWFBPTkVOVChmcCkgZnAubC51cHBlciA9IChmcC5sLnVwcGVyICYgfigweDdmZmYpKSB8IEVYUEJJQVMKKworI2RlZmluZSBmbG9hdHg4MF9sZzIgbWFrZV9mbG9hdHg4MCggMHgzZmZkLCAweDlhMjA5YTg0ZmJjZmY3OTlMTCApCisjZGVmaW5lIGZsb2F0eDgwX2wyZSBtYWtlX2Zsb2F0eDgwKCAweDNmZmYsIDB4YjhhYTNiMjk1YzE3ZjBiY0xMICkKKyNkZWZpbmUgZmxvYXR4ODBfbDJ0IG1ha2VfZmxvYXR4ODAoIDB4NDAwMCwgMHhkNDlhNzg0YmNkMWI4YWZlTEwgKQorCitzdGF0aWMgY29uc3QgZmxvYXR4ODAgZjE1cmtbN10gPQoreworICAgIGZsb2F0eDgwX3plcm8sCisgICAgZmxvYXR4ODBfb25lLAorICAgIGZsb2F0eDgwX3BpLAorICAgIGZsb2F0eDgwX2xnMiwKKyAgICBmbG9hdHg4MF9sbjIsCisgICAgZmxvYXR4ODBfbDJlLAorICAgIGZsb2F0eDgwX2wydCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcHVzaChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+ZnBzdHQgPSAoZW52LT5mcHN0dCAtIDEpICYgNzsKKyAgICBlbnYtPmZwdGFnc1tlbnYtPmZwc3R0XSA9IDA7IC8qIHZhbGlkYXRlIHN0YWNrIGVudHJ5ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcG9wKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZW52LT5mcHRhZ3NbZW52LT5mcHN0dF0gPSAxOyAvKiBpbnZ2YWxpZGF0ZSBzdGFjayBlbnRyeSAqLworICAgIGVudi0+ZnBzdHQgPSAoZW52LT5mcHN0dCArIDEpICYgNzsKK30KKworc3RhdGljIGlubGluZSBmbG9hdHg4MCBoZWxwZXJfZmxkdChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyKQoreworICAgIGZsb2F0eDgwIHRlbXA7CisKKyAgICB0ZW1wLmxvdyA9IGNwdV9sZHFfZGF0YShlbnYsIHB0cik7CisgICAgdGVtcC5oaWdoID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDgpOworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGVscGVyX2ZzdHQoQ1BVWDg2U3RhdGUgKmVudiwgZmxvYXR4ODAgZiwgdGFyZ2V0X3Vsb25nIHB0cikKK3sKKyAgICBjcHVfc3RxX2RhdGEoZW52LCBwdHIsIGYubG93KTsKKyAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA4LCBmLmhpZ2gpOworfQorCisjZGVmaW5lIEZQVVNfSUUgKDEgPDwgMCkKKyNkZWZpbmUgRlBVU19ERSAoMSA8PCAxKQorI2RlZmluZSBGUFVTX1pFICgxIDw8IDIpCisjZGVmaW5lIEZQVVNfT0UgKDEgPDwgMykKKyNkZWZpbmUgRlBVU19VRSAoMSA8PCA0KQorI2RlZmluZSBGUFVTX1BFICgxIDw8IDUpCisjZGVmaW5lIEZQVVNfU0YgKDEgPDwgNikKKyNkZWZpbmUgRlBVU19TRSAoMSA8PCA3KQorI2RlZmluZSBGUFVTX0IgICgxIDw8IDE1KQorCisjZGVmaW5lIEZQVUNfRU0gMHgzZgorCisvKiB4ODcgRlBVIGhlbHBlcnMgKi8KKworc3RhdGljIGlubGluZSBkb3VibGUgZmxvYXR4ODBfdG9fZG91YmxlKENQVVg4NlN0YXRlICplbnYsIGZsb2F0eDgwIGEpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDY0IGY2NDsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgfSB1OworCisgICAgdS5mNjQgPSBmbG9hdHg4MF90b19mbG9hdDY0KGEsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgcmV0dXJuIHUuZDsKK30KKworc3RhdGljIGlubGluZSBmbG9hdHg4MCBkb3VibGVfdG9fZmxvYXR4ODAoQ1BVWDg2U3RhdGUgKmVudiwgZG91YmxlIGEpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDY0IGY2NDsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgfSB1OworCisgICAgdS5kID0gYTsKKyAgICByZXR1cm4gZmxvYXQ2NF90b19mbG9hdHg4MCh1LmY2NCwgJmVudi0+ZnBfc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZnB1X3NldF9leGNlcHRpb24oQ1BVWDg2U3RhdGUgKmVudiwgaW50IG1hc2spCit7CisgICAgZW52LT5mcHVzIHw9IG1hc2s7CisgICAgaWYgKGVudi0+ZnB1cyAmICh+ZW52LT5mcHVjICYgRlBVQ19FTSkpCisgICAgICAgIGVudi0+ZnB1cyB8PSBGUFVTX1NFIHwgRlBVU19COworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0eDgwIGhlbHBlcl9mZGl2KENQVVg4NlN0YXRlICplbnYsIGZsb2F0eDgwIGEsIGZsb2F0eDgwIGIpCit7CisgICAgaWYgKGZsb2F0eDgwX2lzX3plcm8oYikpIHsKKyAgICAgICAgZnB1X3NldF9leGNlcHRpb24oZW52LCBGUFVTX1pFKTsKKyAgICB9CisgICAgcmV0dXJuIGZsb2F0eDgwX2RpdihhLCBiLCAmZW52LT5mcF9zdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBmcHVfcmFpc2VfZXhjZXB0aW9uKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaWYgKGVudi0+Y3JbMF0gJiBDUjBfTkVfTUFTSykgeworICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMTBfQ09QUik7CisgICAgfQorI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgZWxzZSB7CisgICAgICAgIGNwdV9zZXRfZmVycihlbnYpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGhlbHBlcl9mbGRzX0ZUMChDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDMyIGY7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgfSB1OworICAgIHUuaSA9IHZhbDsKKyAgICBGVDAgPSBmbG9hdDMyX3RvX2Zsb2F0eDgwKHUuZiwgJmVudi0+ZnBfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfZmxkbF9GVDAoQ1BVWDg2U3RhdGUgKmVudiwgdWludDY0X3QgdmFsKQoreworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQ2NCBmOworICAgICAgICB1aW50NjRfdCBpOworICAgIH0gdTsKKyAgICB1LmkgPSB2YWw7CisgICAgRlQwID0gZmxvYXQ2NF90b19mbG9hdHg4MCh1LmYsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZpbGRsX0ZUMChDUFVYODZTdGF0ZSAqZW52LCBpbnQzMl90IHZhbCkKK3sKKyAgICBGVDAgPSBpbnQzMl90b19mbG9hdHg4MCh2YWwsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZsZHNfU1QwKENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBpbnQgbmV3X2Zwc3R0OworICAgIHVuaW9uIHsKKyAgICAgICAgZmxvYXQzMiBmOworICAgICAgICB1aW50MzJfdCBpOworICAgIH0gdTsKKyAgICBuZXdfZnBzdHQgPSAoZW52LT5mcHN0dCAtIDEpICYgNzsKKyAgICB1LmkgPSB2YWw7CisgICAgZW52LT5mcHJlZ3NbbmV3X2Zwc3R0XS5kID0gZmxvYXQzMl90b19mbG9hdHg4MCh1LmYsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgZW52LT5mcHN0dCA9IG5ld19mcHN0dDsKKyAgICBlbnYtPmZwdGFnc1tuZXdfZnBzdHRdID0gMDsgLyogdmFsaWRhdGUgc3RhY2sgZW50cnkgKi8KK30KKwordm9pZCBoZWxwZXJfZmxkbF9TVDAoQ1BVWDg2U3RhdGUgKmVudiwgdWludDY0X3QgdmFsKQoreworICAgIGludCBuZXdfZnBzdHQ7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDY0IGY7CisgICAgICAgIHVpbnQ2NF90IGk7CisgICAgfSB1OworICAgIG5ld19mcHN0dCA9IChlbnYtPmZwc3R0IC0gMSkgJiA3OworICAgIHUuaSA9IHZhbDsKKyAgICBlbnYtPmZwcmVnc1tuZXdfZnBzdHRdLmQgPSBmbG9hdDY0X3RvX2Zsb2F0eDgwKHUuZiwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBlbnYtPmZwc3R0ID0gbmV3X2Zwc3R0OworICAgIGVudi0+ZnB0YWdzW25ld19mcHN0dF0gPSAwOyAvKiB2YWxpZGF0ZSBzdGFjayBlbnRyeSAqLworfQorCit2b2lkIGhlbHBlcl9maWxkbF9TVDAoQ1BVWDg2U3RhdGUgKmVudiwgaW50MzJfdCB2YWwpCit7CisgICAgaW50IG5ld19mcHN0dDsKKyAgICBuZXdfZnBzdHQgPSAoZW52LT5mcHN0dCAtIDEpICYgNzsKKyAgICBlbnYtPmZwcmVnc1tuZXdfZnBzdHRdLmQgPSBpbnQzMl90b19mbG9hdHg4MCh2YWwsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgZW52LT5mcHN0dCA9IG5ld19mcHN0dDsKKyAgICBlbnYtPmZwdGFnc1tuZXdfZnBzdHRdID0gMDsgLyogdmFsaWRhdGUgc3RhY2sgZW50cnkgKi8KK30KKwordm9pZCBoZWxwZXJfZmlsZGxsX1NUMChDUFVYODZTdGF0ZSAqZW52LCBpbnQ2NF90IHZhbCkKK3sKKyAgICBpbnQgbmV3X2Zwc3R0OworICAgIG5ld19mcHN0dCA9IChlbnYtPmZwc3R0IC0gMSkgJiA3OworICAgIGVudi0+ZnByZWdzW25ld19mcHN0dF0uZCA9IGludDY0X3RvX2Zsb2F0eDgwKHZhbCwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBlbnYtPmZwc3R0ID0gbmV3X2Zwc3R0OworICAgIGVudi0+ZnB0YWdzW25ld19mcHN0dF0gPSAwOyAvKiB2YWxpZGF0ZSBzdGFjayBlbnRyeSAqLworfQorCit1aW50MzJfdCBoZWxwZXJfZnN0c19TVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICB1bmlvbiB7CisgICAgICAgIGZsb2F0MzIgZjsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICB9IHU7CisgICAgdS5mID0gZmxvYXR4ODBfdG9fZmxvYXQzMihTVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgcmV0dXJuIHUuaTsKK30KKwordWludDY0X3QgaGVscGVyX2ZzdGxfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgdW5pb24geworICAgICAgICBmbG9hdDY0IGY7CisgICAgICAgIHVpbnQ2NF90IGk7CisgICAgfSB1OworICAgIHUuZiA9IGZsb2F0eDgwX3RvX2Zsb2F0NjQoU1QwLCAmZW52LT5mcF9zdGF0dXMpOworICAgIHJldHVybiB1Lmk7Cit9CisKK2ludDMyX3QgaGVscGVyX2Zpc3RfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgdmFsID0gZmxvYXR4ODBfdG9faW50MzIoU1QwLCAmZW52LT5mcF9zdGF0dXMpOworICAgIGlmICh2YWwgIT0gKGludDE2X3QpdmFsKQorICAgICAgICB2YWwgPSAtMzI3Njg7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MzJfdCBoZWxwZXJfZmlzdGxfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgdmFsID0gZmxvYXR4ODBfdG9faW50MzIoU1QwLCAmZW52LT5mcF9zdGF0dXMpOworICAgIHJldHVybiB2YWw7Cit9CisKK2ludDY0X3QgaGVscGVyX2Zpc3RsbF9TVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQ2NF90IHZhbDsKKyAgICB2YWwgPSBmbG9hdHg4MF90b19pbnQ2NChTVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50MzJfdCBoZWxwZXJfZmlzdHRfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgdmFsID0gZmxvYXR4ODBfdG9faW50MzJfcm91bmRfdG9femVybyhTVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgaWYgKHZhbCAhPSAoaW50MTZfdCl2YWwpCisgICAgICAgIHZhbCA9IC0zMjc2ODsKKyAgICByZXR1cm4gdmFsOworfQorCitpbnQzMl90IGhlbHBlcl9maXN0dGxfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB2YWw7CisgICAgdmFsID0gZmxvYXR4ODBfdG9faW50MzJfcm91bmRfdG9femVybyhTVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgcmV0dXJuIHZhbDsKK30KKworaW50NjRfdCBoZWxwZXJfZmlzdHRsbF9TVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQ2NF90IHZhbDsKKyAgICB2YWwgPSBmbG9hdHg4MF90b19pbnQ2NF9yb3VuZF90b196ZXJvKFNUMCwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICByZXR1cm4gdmFsOworfQorCit2b2lkIGhlbHBlcl9mbGR0X1NUMChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyKQoreworICAgIGludCBuZXdfZnBzdHQ7CisgICAgbmV3X2Zwc3R0ID0gKGVudi0+ZnBzdHQgLSAxKSAmIDc7CisgICAgZW52LT5mcHJlZ3NbbmV3X2Zwc3R0XS5kID0gaGVscGVyX2ZsZHQoZW52LCBwdHIpOworICAgIGVudi0+ZnBzdHQgPSBuZXdfZnBzdHQ7CisgICAgZW52LT5mcHRhZ3NbbmV3X2Zwc3R0XSA9IDA7IC8qIHZhbGlkYXRlIHN0YWNrIGVudHJ5ICovCit9CisKK3ZvaWQgaGVscGVyX2ZzdHRfU1QwKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIpCit7CisgICAgaGVscGVyX2ZzdHQoZW52LCBTVDAsIHB0cik7Cit9CisKK3ZvaWQgaGVscGVyX2ZwdXNoKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZnB1c2goZW52KTsKK30KKwordm9pZCBoZWxwZXJfZnBvcChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGZwb3AoZW52KTsKK30KKwordm9pZCBoZWxwZXJfZmRlY3N0cChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+ZnBzdHQgPSAoZW52LT5mcHN0dCAtIDEpICYgNzsKKyAgICBlbnYtPmZwdXMgJj0gKH4weDQ3MDApOworfQorCit2b2lkIGhlbHBlcl9maW5jc3RwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZW52LT5mcHN0dCA9IChlbnYtPmZwc3R0ICsgMSkgJiA3OworICAgIGVudi0+ZnB1cyAmPSAofjB4NDcwMCk7Cit9CisKKy8qIEZQVSBtb3ZlICovCisKK3ZvaWQgaGVscGVyX2ZmcmVlX1NUTihDUFVYODZTdGF0ZSAqZW52LCBpbnQgc3RfaW5kZXgpCit7CisgICAgZW52LT5mcHRhZ3NbKGVudi0+ZnBzdHQgKyBzdF9pbmRleCkgJiA3XSA9IDE7Cit9CisKK3ZvaWQgaGVscGVyX2Ztb3ZfU1QwX0ZUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IEZUMDsKK30KKwordm9pZCBoZWxwZXJfZm1vdl9GVDBfU1ROKENQVVg4NlN0YXRlICplbnYsIGludCBzdF9pbmRleCkKK3sKKyAgICBGVDAgPSBTVChzdF9pbmRleCk7Cit9CisKK3ZvaWQgaGVscGVyX2Ztb3ZfU1QwX1NUTihDUFVYODZTdGF0ZSAqZW52LCBpbnQgc3RfaW5kZXgpCit7CisgICAgU1QwID0gU1Qoc3RfaW5kZXgpOworfQorCit2b2lkIGhlbHBlcl9mbW92X1NUTl9TVDAoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHN0X2luZGV4KQoreworICAgIFNUKHN0X2luZGV4KSA9IFNUMDsKK30KKwordm9pZCBoZWxwZXJfZnhjaGdfU1QwX1NUTihDUFVYODZTdGF0ZSAqZW52LCBpbnQgc3RfaW5kZXgpCit7CisgICAgZmxvYXR4ODAgdG1wOworICAgIHRtcCA9IFNUKHN0X2luZGV4KTsKKyAgICBTVChzdF9pbmRleCkgPSBTVDA7CisgICAgU1QwID0gdG1wOworfQorCisvKiBGUFUgb3BlcmF0aW9ucyAqLworCitzdGF0aWMgY29uc3QgaW50IGZjb21fY2N2YWxbNF0gPSB7MHgwMTAwLCAweDQwMDAsIDB4MDAwMCwgMHg0NTAwfTsKKwordm9pZCBoZWxwZXJfZmNvbV9TVDBfRlQwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZsb2F0eDgwX2NvbXBhcmUoU1QwLCBGVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgZW52LT5mcHVzID0gKGVudi0+ZnB1cyAmIH4weDQ1MDApIHwgZmNvbV9jY3ZhbFtyZXQgKyAxXTsKK30KKwordm9pZCBoZWxwZXJfZnVjb21fU1QwX0ZUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmbG9hdHg4MF9jb21wYXJlX3F1aWV0KFNUMCwgRlQwLCAmZW52LT5mcF9zdGF0dXMpOworICAgIGVudi0+ZnB1cyA9IChlbnYtPmZwdXMgJiB+MHg0NTAwKSB8IGZjb21fY2N2YWxbcmV0KyAxXTsKK30KKworc3RhdGljIGNvbnN0IGludCBmY29taV9jY3ZhbFs0XSA9IHtDQ19DLCBDQ19aLCAwLCBDQ19aIHwgQ0NfUCB8IENDX0N9OworCit2b2lkIGhlbHBlcl9mY29taV9TVDBfRlQwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGVmbGFnczsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmxvYXR4ODBfY29tcGFyZShTVDAsIEZUMCwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBlZmxhZ3MgPSBoZWxwZXJfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCk7CisgICAgZWZsYWdzID0gKGVmbGFncyAmIH4oQ0NfWiB8IENDX1AgfCBDQ19DKSkgfCBmY29taV9jY3ZhbFtyZXQgKyAxXTsKKyAgICBDQ19TUkMgPSBlZmxhZ3M7Cit9CisKK3ZvaWQgaGVscGVyX2Z1Y29taV9TVDBfRlQwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGVmbGFnczsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmxvYXR4ODBfY29tcGFyZV9xdWlldChTVDAsIEZUMCwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBlZmxhZ3MgPSBoZWxwZXJfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCk7CisgICAgZWZsYWdzID0gKGVmbGFncyAmIH4oQ0NfWiB8IENDX1AgfCBDQ19DKSkgfCBmY29taV9jY3ZhbFtyZXQgKyAxXTsKKyAgICBDQ19TUkMgPSBlZmxhZ3M7Cit9CisKK3ZvaWQgaGVscGVyX2ZhZGRfU1QwX0ZUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGZsb2F0eDgwX2FkZChTVDAsIEZUMCwgJmVudi0+ZnBfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfZm11bF9TVDBfRlQwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgU1QwID0gZmxvYXR4ODBfbXVsKFNUMCwgRlQwLCAmZW52LT5mcF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9mc3ViX1NUMF9GVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBTVDAgPSBmbG9hdHg4MF9zdWIoU1QwLCBGVDAsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZzdWJyX1NUMF9GVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBTVDAgPSBmbG9hdHg4MF9zdWIoRlQwLCBTVDAsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZkaXZfU1QwX0ZUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGhlbHBlcl9mZGl2KGVudiwgU1QwLCBGVDApOworfQorCit2b2lkIGhlbHBlcl9mZGl2cl9TVDBfRlQwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgU1QwID0gaGVscGVyX2ZkaXYoZW52LCBGVDAsIFNUMCk7Cit9CisKKy8qIGZwIG9wZXJhdGlvbnMgYmV0d2VlbiBTVE4gYW5kIFNUMCAqLworCit2b2lkIGhlbHBlcl9mYWRkX1NUTl9TVDAoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHN0X2luZGV4KQoreworICAgIFNUKHN0X2luZGV4KSA9IGZsb2F0eDgwX2FkZChTVChzdF9pbmRleCksIFNUMCwgJmVudi0+ZnBfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfZm11bF9TVE5fU1QwKENQVVg4NlN0YXRlICplbnYsIGludCBzdF9pbmRleCkKK3sKKyAgICBTVChzdF9pbmRleCkgPSBmbG9hdHg4MF9tdWwoU1Qoc3RfaW5kZXgpLCBTVDAsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZzdWJfU1ROX1NUMChDUFVYODZTdGF0ZSAqZW52LCBpbnQgc3RfaW5kZXgpCit7CisgICAgU1Qoc3RfaW5kZXgpID0gZmxvYXR4ODBfc3ViKFNUKHN0X2luZGV4KSwgU1QwLCAmZW52LT5mcF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9mc3Vicl9TVE5fU1QwKENQVVg4NlN0YXRlICplbnYsIGludCBzdF9pbmRleCkKK3sKKyAgICBmbG9hdHg4MCAqcDsKKyAgICBwID0gJlNUKHN0X2luZGV4KTsKKyAgICAqcCA9IGZsb2F0eDgwX3N1YihTVDAsICpwLCAmZW52LT5mcF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9mZGl2X1NUTl9TVDAoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHN0X2luZGV4KQoreworICAgIGZsb2F0eDgwICpwOworICAgIHAgPSAmU1Qoc3RfaW5kZXgpOworICAgICpwID0gaGVscGVyX2ZkaXYoZW52LCAqcCwgU1QwKTsKK30KKwordm9pZCBoZWxwZXJfZmRpdnJfU1ROX1NUMChDUFVYODZTdGF0ZSAqZW52LCBpbnQgc3RfaW5kZXgpCit7CisgICAgZmxvYXR4ODAgKnA7CisgICAgcCA9ICZTVChzdF9pbmRleCk7CisgICAgKnAgPSBoZWxwZXJfZmRpdihlbnYsIFNUMCwgKnApOworfQorCisvKiBtaXNjIEZQVSBvcGVyYXRpb25zICovCit2b2lkIGhlbHBlcl9mY2hzX1NUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGZsb2F0eDgwX2NocyhTVDApOworfQorCit2b2lkIGhlbHBlcl9mYWJzX1NUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGZsb2F0eDgwX2FicyhTVDApOworfQorCit2b2lkIGhlbHBlcl9mbGQxX1NUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGYxNXJrWzFdOworfQorCit2b2lkIGhlbHBlcl9mbGRsMnRfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgU1QwID0gZjE1cmtbNl07Cit9CisKK3ZvaWQgaGVscGVyX2ZsZGwyZV9TVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBTVDAgPSBmMTVya1s1XTsKK30KKwordm9pZCBoZWxwZXJfZmxkcGlfU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgU1QwID0gZjE1cmtbMl07Cit9CisKK3ZvaWQgaGVscGVyX2ZsZGxnMl9TVDAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBTVDAgPSBmMTVya1szXTsKK30KKwordm9pZCBoZWxwZXJfZmxkbG4yX1NUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGYxNXJrWzRdOworfQorCit2b2lkIGhlbHBlcl9mbGR6X1NUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIFNUMCA9IGYxNXJrWzBdOworfQorCit2b2lkIGhlbHBlcl9mbGR6X0ZUMChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIEZUMCA9IGYxNXJrWzBdOworfQorCit1aW50MzJfdCBoZWxwZXJfZm5zdHN3KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgcmV0dXJuIChlbnYtPmZwdXMgJiB+MHgzODAwKSB8IChlbnYtPmZwc3R0ICYgMHg3KSA8PCAxMTsKK30KKwordWludDMyX3QgaGVscGVyX2Zuc3RjdyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHJldHVybiBlbnYtPmZwdWM7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9mcF9zdGF0dXMoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQgcm5kX3R5cGU7CisKKyAgICAvKiBzZXQgcm91bmRpbmcgbW9kZSAqLworICAgIHN3aXRjaChlbnYtPmZwdWMgJiBSQ19NQVNLKSB7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIFJDX05FQVI6CisgICAgICAgIHJuZF90eXBlID0gZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJDX0RPV046CisgICAgICAgIHJuZF90eXBlID0gZmxvYXRfcm91bmRfZG93bjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQ19VUDoKKyAgICAgICAgcm5kX3R5cGUgPSBmbG9hdF9yb3VuZF91cDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQ19DSE9QOgorICAgICAgICBybmRfdHlwZSA9IGZsb2F0X3JvdW5kX3RvX3plcm87CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShybmRfdHlwZSwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBzd2l0Y2goKGVudi0+ZnB1YyA+PiA4KSAmIDMpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHJuZF90eXBlID0gMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcm5kX3R5cGUgPSA2NDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJuZF90eXBlID0gODA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzZXRfZmxvYXR4ODBfcm91bmRpbmdfcHJlY2lzaW9uKHJuZF90eXBlLCAmZW52LT5mcF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9mbGRjdyhDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCB2YWwpCit7CisgICAgZW52LT5mcHVjID0gdmFsOworICAgIHVwZGF0ZV9mcF9zdGF0dXMoZW52KTsKK30KKwordm9pZCBoZWxwZXJfZmNsZXgoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBlbnYtPmZwdXMgJj0gMHg3ZjAwOworfQorCit2b2lkIGhlbHBlcl9md2FpdChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGlmIChlbnYtPmZwdXMgJiBGUFVTX1NFKQorICAgICAgICBmcHVfcmFpc2VfZXhjZXB0aW9uKGVudik7Cit9CisKK3ZvaWQgaGVscGVyX2ZuaW5pdChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+ZnB1cyA9IDA7CisgICAgZW52LT5mcHN0dCA9IDA7CisgICAgZW52LT5mcHVjID0gMHgzN2Y7CisgICAgZW52LT5mcHRhZ3NbMF0gPSAxOworICAgIGVudi0+ZnB0YWdzWzFdID0gMTsKKyAgICBlbnYtPmZwdGFnc1syXSA9IDE7CisgICAgZW52LT5mcHRhZ3NbM10gPSAxOworICAgIGVudi0+ZnB0YWdzWzRdID0gMTsKKyAgICBlbnYtPmZwdGFnc1s1XSA9IDE7CisgICAgZW52LT5mcHRhZ3NbNl0gPSAxOworICAgIGVudi0+ZnB0YWdzWzddID0gMTsKK30KKworLyogQkNEIG9wcyAqLworCit2b2lkIGhlbHBlcl9mYmxkX1NUMChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyKQoreworICAgIGZsb2F0eDgwIHRtcDsKKyAgICB1aW50NjRfdCB2YWw7CisgICAgdW5zaWduZWQgaW50IHY7CisgICAgaW50IGk7CisKKyAgICB2YWwgPSAwOworICAgIGZvcihpID0gODsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgdiA9IGNwdV9sZHViX2RhdGEoZW52LCBwdHIgKyBpKTsKKyAgICAgICAgdmFsID0gKHZhbCAqIDEwMCkgKyAoKHYgPj4gNCkgKiAxMCkgKyAodiAmIDB4Zik7CisgICAgfQorICAgIHRtcCA9IGludDY0X3RvX2Zsb2F0eDgwKHZhbCwgJmVudi0+ZnBfc3RhdHVzKTsKKyAgICBpZiAoY3B1X2xkdWJfZGF0YShlbnYsIHB0ciArIDkpICYgMHg4MCkgeworICAgICAgICBmbG9hdHg4MF9jaHModG1wKTsKKyAgICB9CisgICAgZnB1c2goZW52KTsKKyAgICBTVDAgPSB0bXA7Cit9CisKK3ZvaWQgaGVscGVyX2Zic3RfU1QwKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIpCit7CisgICAgaW50IHY7CisgICAgdGFyZ2V0X3Vsb25nIG1lbV9yZWYsIG1lbV9lbmQ7CisgICAgaW50NjRfdCB2YWw7CisKKyAgICB2YWwgPSBmbG9hdHg4MF90b19pbnQ2NChTVDAsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgbWVtX3JlZiA9IHB0cjsKKyAgICBtZW1fZW5kID0gbWVtX3JlZiArIDk7CisgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgY3B1X3N0Yl9kYXRhKGVudiwgbWVtX2VuZCwgMHg4MCk7CisgICAgICAgIHZhbCA9IC12YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3B1X3N0Yl9kYXRhKGVudiwgbWVtX2VuZCwgMHgwMCk7CisgICAgfQorICAgIHdoaWxlIChtZW1fcmVmIDwgbWVtX2VuZCkgeworICAgICAgICBpZiAodmFsID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdiA9IHZhbCAlIDEwMDsKKyAgICAgICAgdmFsID0gdmFsIC8gMTAwOworICAgICAgICB2ID0gKCh2IC8gMTApIDw8IDQpIHwgKHYgJSAxMCk7CisgICAgICAgIGNwdV9zdGJfZGF0YShlbnYsIG1lbV9yZWYrKywgdik7CisgICAgfQorICAgIHdoaWxlIChtZW1fcmVmIDwgbWVtX2VuZCkgeworICAgICAgICBjcHVfc3RiX2RhdGEoZW52LCBtZW1fcmVmKyssIDApOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfZjJ4bTEoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgdmFsID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKyAgICB2YWwgPSBwb3coMi4wLCB2YWwpIC0gMS4wOworICAgIFNUMCA9IGRvdWJsZV90b19mbG9hdHg4MChlbnYsIHZhbCk7Cit9CisKK3ZvaWQgaGVscGVyX2Z5bDJ4KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZG91YmxlIGZwdGVtcCA9IGZsb2F0eDgwX3RvX2RvdWJsZShlbnYsIFNUMCk7CisKKyAgICBpZiAoZnB0ZW1wPjAuMCl7CisgICAgICAgIGZwdGVtcCA9IGxvZyhmcHRlbXApL2xvZygyLjApOyAgIC8qIGxvZzIoU1QpICovCisgICAgICAgIGZwdGVtcCAqPSBmbG9hdHg4MF90b19kb3VibGUoZW52LCBTVDEpOworICAgICAgICBTVDEgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBmcHRlbXApOworICAgICAgICBmcG9wKGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0NzAwKTsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfZnB0YW4oQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgZnB0ZW1wID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKworICAgIGlmKChmcHRlbXAgPiBNQVhUQU4pfHwoZnB0ZW1wIDwgLU1BWFRBTikpIHsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwdGVtcCA9IHRhbihmcHRlbXApOworICAgICAgICBTVDAgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBmcHRlbXApOworICAgICAgICBmcHVzaChlbnYpOworICAgICAgICBTVDAgPSBmbG9hdHg4MF9vbmU7CisgICAgICAgIGVudi0+ZnB1cyAmPSAofjB4NDAwKTsgIC8qIEMyIDwtLSAwICovCisgICAgICAgIC8qIHRoZSBhYm92ZSBjb2RlIGlzIGZvciAgfGFyZ3wgPCAyKio1MiBvbmx5ICovCisgICAgfQorfQorCit2b2lkIGhlbHBlcl9mcGF0YW4oQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgZnB0ZW1wLCBmcHNyY29wOworCisgICAgZnBzcmNvcCA9IGZsb2F0eDgwX3RvX2RvdWJsZShlbnYsIFNUMSk7CisgICAgZnB0ZW1wID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKyAgICBTVDEgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBhdGFuMihmcHNyY29wLGZwdGVtcCkpOworICAgIGZwb3AoZW52KTsKK30KKwordm9pZCBoZWxwZXJfZnh0cmFjdChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIENQVV9MRG91YmxlVSB0ZW1wOworICAgIHVuc2lnbmVkIGludCBleHBkaWY7CisKKyAgICB0ZW1wLmQgPSBTVDA7CisgICAgZXhwZGlmID0gRVhQRCh0ZW1wKSAtIEVYUEJJQVM7CisgICAgLypEUCBleHBvbmVudCBiaWFzKi8KKyAgICBTVDAgPSBpbnQzMl90b19mbG9hdHg4MChleHBkaWYsICZlbnYtPmZwX3N0YXR1cyk7CisgICAgZnB1c2goZW52KTsKKyAgICBCSUFTRVhQT05FTlQodGVtcCk7CisgICAgU1QwID0gdGVtcC5kOworfQorCit2b2lkIGhlbHBlcl9mcHJlbTEoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgc3QwLCBzdDEsIGRibHEsIGZwc3Jjb3AsIGZwdGVtcDsKKyAgICBDUFVfTERvdWJsZVUgZnBzcmNvcDEsIGZwdGVtcDE7CisgICAgaW50IGV4cGRpZjsKKyAgICBzaWduZWQgbG9uZyBsb25nIGludCBxOworCisgICAgc3QwID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKyAgICBzdDEgPSBmbG9hdHg4MF90b19kb3VibGUoZW52LCBTVDEpOworCisgICAgaWYgKGlzaW5mKHN0MCkgfHwgaXNuYW4oc3QwKSB8fCBpc25hbihzdDEpIHx8IChzdDEgPT0gMC4wKSkgeworICAgICAgICBTVDAgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCAwLjAgLyAwLjApOyAvKiBOYU4gKi8KKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0NzAwKTsgLyogKEMzLEMyLEMxLEMwKSA8LS0gMDAwMCAqLworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnBzcmNvcCA9IHN0MDsKKyAgICBmcHRlbXAgPSBzdDE7CisgICAgZnBzcmNvcDEuZCA9IFNUMDsKKyAgICBmcHRlbXAxLmQgPSBTVDE7CisgICAgZXhwZGlmID0gRVhQRChmcHNyY29wMSkgLSBFWFBEKGZwdGVtcDEpOworCisgICAgaWYgKGV4cGRpZiA8IDApIHsKKyAgICAgICAgLyogb3B0aW1pc2F0aW9uPyB0YWtlbiBmcm9tIHRoZSBBTUQgZG9jcyAqLworICAgICAgICBlbnYtPmZwdXMgJj0gKH4weDQ3MDApOyAvKiAoQzMsQzIsQzEsQzApIDwtLSAwMDAwICovCisgICAgICAgIC8qIFNUMCBpcyB1bmNoYW5nZWQgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChleHBkaWYgPCA1MykgeworICAgICAgICBkYmxxID0gZnBzcmNvcCAvIGZwdGVtcDsKKyAgICAgICAgLyogcm91bmQgZGJscSB0b3dhcmRzIG5lYXJlc3QgaW50ZWdlciAqLworICAgICAgICBkYmxxID0gcmludChkYmxxKTsKKyAgICAgICAgc3QwID0gZnBzcmNvcCAtIGZwdGVtcCAqIGRibHE7CisKKyAgICAgICAgLyogY29udmVydCBkYmxxIHRvIHEgYnkgdHJ1bmNhdGluZyB0b3dhcmRzIHplcm8gKi8KKyAgICAgICAgaWYgKGRibHEgPCAwLjApCisgICAgICAgICAgIHEgPSAoc2lnbmVkIGxvbmcgbG9uZyBpbnQpKC1kYmxxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICBxID0gKHNpZ25lZCBsb25nIGxvbmcgaW50KWRibHE7CisKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0NzAwKTsgLyogKEMzLEMyLEMxLEMwKSA8LS0gMDAwMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoQzAsQzMsQzEpIDwtLSAocTIscTEscTApICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4NCkgPDwgKDggLSAyKTsgIC8qIChDMCkgPC0tIHEyICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4MikgPDwgKDE0IC0gMSk7IC8qIChDMykgPC0tIHExICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4MSkgPDwgKDkgLSAwKTsgIC8qIChDMSkgPC0tIHEwICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOyAgLyogQzIgPC0tIDEgKi8KKyAgICAgICAgZnB0ZW1wID0gcG93KDIuMCwgZXhwZGlmIC0gNTApOworICAgICAgICBmcHNyY29wID0gKHN0MCAvIHN0MSkgLyBmcHRlbXA7CisgICAgICAgIC8qIGZwc3Jjb3AgPSBpbnRlZ2VyIG9idGFpbmVkIGJ5IGNob3BwaW5nICovCisgICAgICAgIGZwc3Jjb3AgPSAoZnBzcmNvcCA8IDAuMCkgPworICAgICAgICAgICAgICAgICAgLShmbG9vcihmYWJzKGZwc3Jjb3ApKSkgOiBmbG9vcihmcHNyY29wKTsKKyAgICAgICAgc3QwIC09IChzdDEgKiBmcHNyY29wICogZnB0ZW1wKTsKKyAgICB9CisgICAgU1QwID0gZG91YmxlX3RvX2Zsb2F0eDgwKGVudiwgc3QwKTsKK30KKwordm9pZCBoZWxwZXJfZnByZW0oQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgc3QwLCBzdDEsIGRibHEsIGZwc3Jjb3AsIGZwdGVtcDsKKyAgICBDUFVfTERvdWJsZVUgZnBzcmNvcDEsIGZwdGVtcDE7CisgICAgaW50IGV4cGRpZjsKKyAgICBzaWduZWQgbG9uZyBsb25nIGludCBxOworCisgICAgc3QwID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKyAgICBzdDEgPSBmbG9hdHg4MF90b19kb3VibGUoZW52LCBTVDEpOworCisgICAgaWYgKGlzaW5mKHN0MCkgfHwgaXNuYW4oc3QwKSB8fCBpc25hbihzdDEpIHx8IChzdDEgPT0gMC4wKSkgeworICAgICAgIFNUMCA9IGRvdWJsZV90b19mbG9hdHg4MChlbnYsIDAuMCAvIDAuMCk7IC8qIE5hTiAqLworICAgICAgIGVudi0+ZnB1cyAmPSAofjB4NDcwMCk7IC8qIChDMyxDMixDMSxDMCkgPC0tIDAwMDAgKi8KKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnBzcmNvcCA9IHN0MDsKKyAgICBmcHRlbXAgPSBzdDE7CisgICAgZnBzcmNvcDEuZCA9IFNUMDsKKyAgICBmcHRlbXAxLmQgPSBTVDE7CisgICAgZXhwZGlmID0gRVhQRChmcHNyY29wMSkgLSBFWFBEKGZwdGVtcDEpOworCisgICAgaWYgKGV4cGRpZiA8IDApIHsKKyAgICAgICAgLyogb3B0aW1pc2F0aW9uPyB0YWtlbiBmcm9tIHRoZSBBTUQgZG9jcyAqLworICAgICAgICBlbnYtPmZwdXMgJj0gfjB4NDcwMDsgLyogKEMzLEMyLEMxLEMwKSA8LS0gMDAwMCAqLworICAgICAgICAvKiBTVDAgaXMgdW5jaGFuZ2VkICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZXhwZGlmIDwgNTMpIHsKKyAgICAgICAgZGJscSA9IGZwc3Jjb3AgLyBmcHRlbXA7IC8qIFNUMCAvIFNUMSovOworICAgICAgICAvKiByb3VuZCBkYmxxIHRvd2FyZHMgemVybyAqLworICAgICAgICBkYmxxID0gKGRibHEgPCAwLjApID8gY2VpbChkYmxxKSA6IGZsb29yKGRibHEpOworICAgICAgICBzdDAgPSBmcHNyY29wIC0gZnB0ZW1wICogZGJscTsgLyogZnBzcmNvcCBpcyBTVDAgKi8KKworICAgICAgICAvKiBjb252ZXJ0IGRibHEgdG8gcSBieSB0cnVuY2F0aW5nIHRvd2FyZHMgemVybyAqLworICAgICAgICBpZiAoZGJscSA8IDAuMCkgeworICAgICAgICAgICBxID0gKHNpZ25lZCBsb25nIGxvbmcgaW50KSgtZGJscSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHEgPSAoc2lnbmVkIGxvbmcgbG9uZyBpbnQpZGJscTsKKyAgICAgICAgfQorCisgICAgICAgIGVudi0+ZnB1cyAmPSB+MHg0NzAwOyAvKiAoQzMsQzIsQzEsQzApIDwtLSAwMDAwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoQzAsQzMsQzEpIDwtLSAocTIscTEscTApICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4NCkgPDwgKDggLSAyKTsgIC8qIChDMCkgPC0tIHEyICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4MikgPDwgKDE0IC0gMSk7IC8qIChDMykgPC0tIHExICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAocSAmIDB4MSkgPDwgKDkgLSAwKTsgIC8qIChDMSkgPC0tIHEwICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IE4gPSAzMiArIChleHBkaWYgJSAzMik7IC8qIGFzIHBlciBBTUQgZG9jcyAqLworICAgICAgICBlbnYtPmZwdXMgfD0gMHg0MDA7ICAvKiBDMiA8LS0gMSAqLworICAgICAgICBmcHRlbXAgPSBwb3coMi4wLCAoZG91YmxlKShleHBkaWYgLSBOKSk7CisgICAgICAgIGZwc3Jjb3AgPSAoc3QwIC8gc3QxKSAvIGZwdGVtcDsKKyAgICAgICAgLyogZnBzcmNvcCA9IGludGVnZXIgb2J0YWluZWQgYnkgY2hvcHBpbmcgKi8KKyAgICAgICAgZnBzcmNvcCA9IChmcHNyY29wIDwgMC4wKSA/CisgICAgICAgICAgICAgICAgICAtKGZsb29yKGZhYnMoZnBzcmNvcCkpKSA6IGZsb29yKGZwc3Jjb3ApOworICAgICAgICBzdDAgLT0gKHN0MSAqIGZwc3Jjb3AgKiBmcHRlbXApOworICAgIH0KKyAgICBTVDAgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBzdDApOworfQorCit2b2lkIGhlbHBlcl9meWwyeHAxKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZG91YmxlIGZwdGVtcCA9IGZsb2F0eDgwX3RvX2RvdWJsZShlbnYsIFNUMCk7CisKKyAgICBpZiAoKGZwdGVtcCsxLjApPjAuMCkgeworICAgICAgICBmcHRlbXAgPSBsb2coZnB0ZW1wKzEuMCkgLyBsb2coMi4wKTsgLyogbG9nMihTVCsxLjApICovCisgICAgICAgIGZwdGVtcCAqPSBmbG9hdHg4MF90b19kb3VibGUoZW52LCBTVDEpOworICAgICAgICBTVDEgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBmcHRlbXApOworICAgICAgICBmcG9wKGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0NzAwKTsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfZnNxcnQoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgZnB0ZW1wID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKworICAgIGlmIChmcHRlbXA8MC4wKSB7CisgICAgICAgIGVudi0+ZnB1cyAmPSAofjB4NDcwMCk7ICAvKiAoQzMsQzIsQzEsQzApIDwtLSAwMDAwICovCisgICAgICAgIGVudi0+ZnB1cyB8PSAweDQwMDsKKyAgICB9CisgICAgU1QwID0gZmxvYXR4ODBfc3FydChTVDAsICZlbnYtPmZwX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2ZzaW5jb3MoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgZnB0ZW1wID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKworICAgIGlmICgoZnB0ZW1wID4gTUFYVEFOKXx8KGZwdGVtcCA8IC1NQVhUQU4pKSB7CisgICAgICAgIGVudi0+ZnB1cyB8PSAweDQwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBTVDAgPSBkb3VibGVfdG9fZmxvYXR4ODAoZW52LCBzaW4oZnB0ZW1wKSk7CisgICAgICAgIGZwdXNoKGVudik7CisgICAgICAgIFNUMCA9IGRvdWJsZV90b19mbG9hdHg4MChlbnYsIGNvcyhmcHRlbXApKTsKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0MDApOyAgLyogQzIgPC0tIDAgKi8KKyAgICAgICAgLyogdGhlIGFib3ZlIGNvZGUgaXMgZm9yICB8YXJnfCA8IDIqKjYzIG9ubHkgKi8KKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2ZybmRpbnQoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBTVDAgPSBmbG9hdHg4MF9yb3VuZF90b19pbnQoU1QwLCAmZW52LT5mcF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9mc2NhbGUoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgc3QwID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKyAgICBkb3VibGUgc3QxID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QxKTsKKyAgICBkb3VibGUgdmFsID0gbGRleHAoc3QwLCAoaW50KXN0MSk7CisgICAgU1QwID0gZG91YmxlX3RvX2Zsb2F0eDgwKGVudiwgdmFsKTsKK30KKwordm9pZCBoZWxwZXJfZnNpbihDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGRvdWJsZSBmcHRlbXAgPSBmbG9hdHg4MF90b19kb3VibGUoZW52LCBTVDApOworCisgICAgaWYgKChmcHRlbXAgPiBNQVhUQU4pfHwoZnB0ZW1wIDwgLU1BWFRBTikpIHsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFNUMCA9IGRvdWJsZV90b19mbG9hdHg4MChlbnYsIHNpbihmcHRlbXApKTsKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0MDApOyAgLyogQzIgPC0tIDAgKi8KKyAgICAgICAgLyogdGhlIGFib3ZlIGNvZGUgaXMgZm9yICB8YXJnfCA8IDIqKjUzIG9ubHkgKi8KKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2Zjb3MoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBkb3VibGUgZnB0ZW1wID0gZmxvYXR4ODBfdG9fZG91YmxlKGVudiwgU1QwKTsKKworICAgIGlmKChmcHRlbXAgPiBNQVhUQU4pfHwoZnB0ZW1wIDwgLU1BWFRBTikpIHsKKyAgICAgICAgZW52LT5mcHVzIHw9IDB4NDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIFNUMCA9IGRvdWJsZV90b19mbG9hdHg4MChlbnYsIGNvcyhmcHRlbXApKTsKKyAgICAgICAgZW52LT5mcHVzICY9ICh+MHg0MDApOyAgLyogQzIgPC0tIDAgKi8KKyAgICAgICAgLyogdGhlIGFib3ZlIGNvZGUgaXMgZm9yICB8YXJnNSA8IDIqKjYzIG9ubHkgKi8KKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2Z4YW1fU1QwKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgQ1BVX0xEb3VibGVVIHRlbXA7CisgICAgaW50IGV4cGRpZjsKKworICAgIHRlbXAuZCA9IFNUMDsKKworICAgIGVudi0+ZnB1cyAmPSAofjB4NDcwMCk7ICAvKiAoQzMsQzIsQzEsQzApIDwtLSAwMDAwICovCisgICAgaWYgKFNJR05EKHRlbXApKQorICAgICAgICBlbnYtPmZwdXMgfD0gMHgyMDA7IC8qIEMxIDwtLSAxICovCisKKyAgICAvKiBYWFg6IHRlc3QgZnB0YWdzIHRvbyAqLworICAgIGV4cGRpZiA9IEVYUEQodGVtcCk7CisgICAgaWYgKGV4cGRpZiA9PSBNQVhFWFBEKSB7CisgICAgICAgIGlmIChNQU5URCh0ZW1wKSA9PSAweDgwMDAwMDAwMDAwMDAwMDBVTEwpIHsKKyAgICAgICAgICAgIGVudi0+ZnB1cyB8PSAgMHg1MDAgLypJbmZpbml0eSovOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW52LT5mcHVzIHw9ICAweDEwMCAvKk5hTiovOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChleHBkaWYgPT0gMCkgeworICAgICAgICBpZiAoTUFOVEQodGVtcCkgPT0gMCkgeworICAgICAgICAgICAgZW52LT5mcHVzIHw9ICAweDQwMDAgLypaZXJvKi87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnYtPmZwdXMgfD0gMHg0NDAwIC8qRGVub3JtYWwqLzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGVudi0+ZnB1cyB8PSAweDQwMDsKKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2ZzdGVudihDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyLCBpbnQgZGF0YTMyKQoreworICAgIGludCBmcHVzLCBmcHRhZywgZXhwLCBpOworICAgIHVpbnQ2NF90IG1hbnQ7CisgICAgQ1BVX0xEb3VibGVVIHRtcDsKKworICAgIGZwdXMgPSAoZW52LT5mcHVzICYgfjB4MzgwMCkgfCAoZW52LT5mcHN0dCAmIDB4NykgPDwgMTE7CisgICAgZnB0YWcgPSAwOworICAgIGZvciAoaT03OyBpPj0wOyBpLS0pIHsKKyAgICAgICAgZnB0YWcgPDw9IDI7CisgICAgICAgIGlmIChlbnYtPmZwdGFnc1tpXSkgeworICAgICAgICAgICAgZnB0YWcgfD0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRtcC5kID0gZW52LT5mcHJlZ3NbaV0uZDsKKyAgICAgICAgICAgIGV4cCA9IEVYUEQodG1wKTsKKyAgICAgICAgICAgIG1hbnQgPSBNQU5URCh0bXApOworICAgICAgICAgICAgaWYgKGV4cCA9PSAwICYmIG1hbnQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIHplcm8gKi8KKyAgICAgICAgICAgICAgICBmcHRhZyB8PSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChleHAgPT0gMCB8fCBleHAgPT0gTUFYRVhQRAorICAgICAgICAgICAgICAgICAgICAgICB8fCAobWFudCAmICgxTEwgPDwgNjMpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogTmFOcywgaW5maW5pdHksIGRlbm9ybWFsICovCisgICAgICAgICAgICAgICAgZnB0YWcgfD0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZGF0YTMyKSB7CisgICAgICAgIC8qIDMyIGJpdCAqLworICAgICAgICBjcHVfc3RsX2RhdGEoZW52LCBwdHIsIGVudi0+ZnB1Yyk7CisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDQsIGZwdXMpOworICAgICAgICBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyA4LCBmcHRhZyk7CisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDEyLCAwKTsgLyogZnBpcCAqLworICAgICAgICBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAxNiwgMCk7IC8qIGZwY3MgKi8KKyAgICAgICAgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMjAsIDApOyAvKiBmcG9vICovCisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDI0LCAwKTsgLyogZnBvcyAqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIsIGVudi0+ZnB1Yyk7CisgICAgICAgIGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDIsIGZwdXMpOworICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA0LCBmcHRhZyk7CisgICAgICAgIGNwdV9zdHdfZGF0YShlbnYsIHB0ciArIDYsIDApOworICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA4LCAwKTsKKyAgICAgICAgY3B1X3N0d19kYXRhKGVudiwgcHRyICsgMTAsIDApOworICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAxMiwgMCk7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9mbGRlbnYoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMikKK3sKKyAgICBpbnQgaSwgZnB1cywgZnB0YWc7CisKKyAgICBpZiAoZGF0YTMyKSB7CisgICAgICAgIGVudi0+ZnB1YyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIpOworICAgICAgICBmcHVzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDQpOworICAgICAgICBmcHRhZyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVudi0+ZnB1YyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIpOworICAgICAgICBmcHVzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDIpOworICAgICAgICBmcHRhZyA9IGNwdV9sZHV3X2RhdGEoZW52LCBwdHIgKyA0KTsKKyAgICB9CisgICAgZW52LT5mcHN0dCA9IChmcHVzID4+IDExKSAmIDc7CisgICAgZW52LT5mcHVzID0gZnB1cyAmIH4weDM4MDA7CisgICAgZm9yKGkgPSAwO2kgPCA4OyBpKyspIHsKKyAgICAgICAgZW52LT5mcHRhZ3NbaV0gPSAoKGZwdGFnICYgMykgPT0gMyk7CisgICAgICAgIGZwdGFnID4+PSAyOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfZnNhdmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGEzMikKK3sKKyAgICBmbG9hdHg4MCB0bXA7CisgICAgaW50IGk7CisKKyAgICBoZWxwZXJfZnN0ZW52KGVudiwgcHRyLCBkYXRhMzIpOworCisgICAgcHRyICs9ICgxNCA8PCBkYXRhMzIpOworICAgIGZvcihpID0gMDtpIDwgODsgaSsrKSB7CisgICAgICAgIHRtcCA9IFNUKGkpOworICAgICAgICBoZWxwZXJfZnN0dChlbnYsIHRtcCwgcHRyKTsKKyAgICAgICAgcHRyICs9IDEwOworICAgIH0KKworICAgIC8qIGZuaW5pdCAqLworICAgIGVudi0+ZnB1cyA9IDA7CisgICAgZW52LT5mcHN0dCA9IDA7CisgICAgZW52LT5mcHVjID0gMHgzN2Y7CisgICAgZW52LT5mcHRhZ3NbMF0gPSAxOworICAgIGVudi0+ZnB0YWdzWzFdID0gMTsKKyAgICBlbnYtPmZwdGFnc1syXSA9IDE7CisgICAgZW52LT5mcHRhZ3NbM10gPSAxOworICAgIGVudi0+ZnB0YWdzWzRdID0gMTsKKyAgICBlbnYtPmZwdGFnc1s1XSA9IDE7CisgICAgZW52LT5mcHRhZ3NbNl0gPSAxOworICAgIGVudi0+ZnB0YWdzWzddID0gMTsKK30KKwordm9pZCBoZWxwZXJfZnJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhMzIpCit7CisgICAgZmxvYXR4ODAgdG1wOworICAgIGludCBpOworCisgICAgaGVscGVyX2ZsZGVudihlbnYsIHB0ciwgZGF0YTMyKTsKKyAgICBwdHIgKz0gKDE0IDw8IGRhdGEzMik7CisKKyAgICBmb3IoaSA9IDA7aSA8IDg7IGkrKykgeworICAgICAgICB0bXAgPSBoZWxwZXJfZmxkdChlbnYsIHB0cik7CisgICAgICAgIFNUKGkpID0gdG1wOworICAgICAgICBwdHIgKz0gMTA7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9meHNhdmUoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHB0ciwgaW50IGRhdGE2NCkKK3sKKyAgICBpbnQgZnB1cywgZnB0YWcsIGksIG5iX3htbV9yZWdzOworICAgIGZsb2F0eDgwIHRtcDsKKyAgICB0YXJnZXRfdWxvbmcgYWRkcjsKKworICAgIGZwdXMgPSAoZW52LT5mcHVzICYgfjB4MzgwMCkgfCAoZW52LT5mcHN0dCAmIDB4NykgPDwgMTE7CisgICAgZnB0YWcgPSAwOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmcHRhZyB8PSAoZW52LT5mcHRhZ3NbaV0gPDwgaSk7CisgICAgfQorICAgIGNwdV9zdHdfZGF0YShlbnYsIHB0ciwgZW52LT5mcHVjKTsKKyAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyAyLCBmcHVzKTsKKyAgICBjcHVfc3R3X2RhdGEoZW52LCBwdHIgKyA0LCBmcHRhZyBeIDB4ZmYpOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAoZGF0YTY0KSB7CisgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIHB0ciArIDB4MDgsIDApOyAvKiByaXAgKi8KKyAgICAgICAgY3B1X3N0cV9kYXRhKGVudiwgcHRyICsgMHgxMCwgMCk7IC8qIHJkcCAqLworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAweDA4LCAwKTsgLyogZWlwICovCisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MGMsIDApOyAvKiBzZWwgICovCisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MTAsIDApOyAvKiBkcCAqLworICAgICAgICBjcHVfc3RsX2RhdGEoZW52LCBwdHIgKyAweDE0LCAwKTsgLyogc2VsICAqLworICAgIH0KKworICAgIGFkZHIgPSBwdHIgKyAweDIwOworICAgIGZvcihpID0gMDtpIDwgODsgaSsrKSB7CisgICAgICAgIHRtcCA9IFNUKGkpOworICAgICAgICBoZWxwZXJfZnN0dChlbnYsIHRtcCwgYWRkcik7CisgICAgICAgIGFkZHIgKz0gMTY7CisgICAgfQorCisgICAgaWYgKGVudi0+Y3JbNF0gJiBDUjRfT1NGWFNSX01BU0spIHsKKyAgICAgICAgLyogWFhYOiBmaW5pc2ggaXQgKi8KKyAgICAgICAgY3B1X3N0bF9kYXRhKGVudiwgcHRyICsgMHgxOCwgZW52LT5teGNzcik7IC8qIG14Y3NyICovCisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHB0ciArIDB4MWMsIDB4MDAwMGZmZmYpOyAvKiBteGNzcl9tYXNrICovCisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0NTNjRfTUFTSykKKyAgICAgICAgICAgIG5iX3htbV9yZWdzID0gMTY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5iX3htbV9yZWdzID0gODsKKyAgICAgICAgYWRkciA9IHB0ciArIDB4YTA7CisgICAgICAgIC8qIEZhc3QgRlhTQVZFIGxlYXZlcyBvdXQgdGhlIFhNTSByZWdpc3RlcnMgKi8KKyAgICAgICAgaWYgKCEoZW52LT5lZmVyICYgTVNSX0VGRVJfRkZYU1IpCisgICAgICAgICAgfHwgKGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0spCisgICAgICAgICAgfHwgIShlbnYtPmhmbGFncyAmIEhGX0xNQV9NQVNLKSkgeworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbmJfeG1tX3JlZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGFkZHIsIGVudi0+eG1tX3JlZ3NbaV0uWE1NX1EoMCkpOworICAgICAgICAgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGFkZHIgKyA4LCBlbnYtPnhtbV9yZWdzW2ldLlhNTV9RKDEpKTsKKyAgICAgICAgICAgICAgICBhZGRyICs9IDE2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9meHJzdG9yKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwdHIsIGludCBkYXRhNjQpCit7CisgICAgaW50IGksIGZwdXMsIGZwdGFnLCBuYl94bW1fcmVnczsKKyAgICBmbG9hdHg4MCB0bXA7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisKKyAgICBlbnYtPmZwdWMgPSBjcHVfbGR1d19kYXRhKGVudiwgcHRyKTsKKyAgICBmcHVzID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDIpOworICAgIGZwdGFnID0gY3B1X2xkdXdfZGF0YShlbnYsIHB0ciArIDQpOworICAgIGVudi0+ZnBzdHQgPSAoZnB1cyA+PiAxMSkgJiA3OworICAgIGVudi0+ZnB1cyA9IGZwdXMgJiB+MHgzODAwOworICAgIGZwdGFnIF49IDB4ZmY7CisgICAgZm9yKGkgPSAwO2kgPCA4OyBpKyspIHsKKyAgICAgICAgZW52LT5mcHRhZ3NbaV0gPSAoKGZwdGFnID4+IGkpICYgMSk7CisgICAgfQorCisgICAgYWRkciA9IHB0ciArIDB4MjA7CisgICAgZm9yKGkgPSAwO2kgPCA4OyBpKyspIHsKKyAgICAgICAgdG1wID0gaGVscGVyX2ZsZHQoZW52LCBhZGRyKTsKKyAgICAgICAgU1QoaSkgPSB0bXA7CisgICAgICAgIGFkZHIgKz0gMTY7CisgICAgfQorCisgICAgaWYgKGVudi0+Y3JbNF0gJiBDUjRfT1NGWFNSX01BU0spIHsKKyAgICAgICAgLyogWFhYOiBmaW5pc2ggaXQgKi8KKyAgICAgICAgZW52LT5teGNzciA9IGNwdV9sZGxfZGF0YShlbnYsIHB0ciArIDB4MTgpOworICAgICAgICAvL2xkbChwdHIgKyAweDFjKTsKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLKQorICAgICAgICAgICAgbmJfeG1tX3JlZ3MgPSAxNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmJfeG1tX3JlZ3MgPSA4OworICAgICAgICBhZGRyID0gcHRyICsgMHhhMDsKKyAgICAgICAgLyogRmFzdCBGWFJFU1RPUkUgbGVhdmVzIG91dCB0aGUgWE1NIHJlZ2lzdGVycyAqLworICAgICAgICBpZiAoIShlbnYtPmVmZXIgJiBNU1JfRUZFUl9GRlhTUikKKyAgICAgICAgICB8fCAoZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSykKKyAgICAgICAgICB8fCAhKGVudi0+aGZsYWdzICYgSEZfTE1BX01BU0spKSB7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBuYl94bW1fcmVnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZW52LT54bW1fcmVnc1tpXS5YTU1fUSgwKSA9IGNwdV9sZHFfZGF0YShlbnYsIGFkZHIpOworICAgICAgICAgICAgICAgIGVudi0+eG1tX3JlZ3NbaV0uWE1NX1EoMSkgPSBjcHVfbGRxX2RhdGEoZW52LCBhZGRyICsgOCk7CisgICAgICAgICAgICAgICAgYWRkciArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjcHVfZ2V0X2ZwODAodWludDY0X3QgKnBtYW50LCB1aW50MTZfdCAqcGV4cCwgZmxvYXR4ODAgZikKK3sKKyAgICBDUFVfTERvdWJsZVUgdGVtcDsKKworICAgIHRlbXAuZCA9IGY7CisgICAgKnBtYW50ID0gdGVtcC5sLmxvd2VyOworICAgICpwZXhwID0gdGVtcC5sLnVwcGVyOworfQorCitmbG9hdHg4MCBjcHVfc2V0X2ZwODAodWludDY0X3QgbWFudCwgdWludDE2X3QgdXBwZXIpCit7CisgICAgQ1BVX0xEb3VibGVVIHRlbXA7CisKKyAgICB0ZW1wLmwudXBwZXIgPSB1cHBlcjsKKyAgICB0ZW1wLmwubG93ZXIgPSBtYW50OworICAgIHJldHVybiB0ZW1wLmQ7Cit9CisKKy8qIE1NWC9TU0UgKi8KKy8qIFhYWDogb3B0aW1pemUgYnkgc3RvcmluZyBmcHR0IGFuZCBmcHRhZ3MgaW4gdGhlIHN0YXRpYyBjcHUgc3RhdGUgKi8KK3ZvaWQgaGVscGVyX2VudGVyX21teChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+ZnBzdHQgPSAwOworICAgIG1lbXNldChlbnYtPmZwdGFncywgMCwgc2l6ZW9mKGVudi0+ZnB0YWdzKSk7Cit9CisKK3ZvaWQgaGVscGVyX2VtbXMoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICAvKiBzZXQgdG8gZW1wdHkgc3RhdGUgKi8KKyAgICBtZW1zZXQoZW52LT5mcHRhZ3MsIDEsIHNpemVvZihlbnYtPmZwdGFncykpOworfQorCisvKiBYWFg6IHN1cHByZXNzICovCit2b2lkIGhlbHBlcl9tb3ZxKENQVVg4NlN0YXRlICplbnYsIHZvaWQgKmQsIHZvaWQgKnMpCit7CisgICAgKih1aW50NjRfdCAqKWQgPSAqKHVpbnQ2NF90ICopczsKK30KKworI2RlZmluZSBTSElGVCAwCisjaW5jbHVkZSAib3BzX3NzZS5oIgorCisjZGVmaW5lIFNISUZUIDEKKyNpbmNsdWRlICJvcHNfc3NlLmgiCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hheC1hbGwuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmYxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hheC1hbGwuYwpAQCAtMCwwICsxLDExOTEgQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKy8qCisgKiBIQVggY29tbW9uIGNvZGUgZm9yIGJvdGggV2luZG93cyBhbmQgRGFyd2luCisgKiBTb21lIHBvcnRpb24gb2YgY29kZSBmcm9tIEtWTSBpcyB1c2VkIGluIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlICJhbmRyb2lkL2F2ZC91dGlsLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9lcnJvci1tZXNzYWdlcy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgInRhcmdldC1pMzg2L2hheC1pMzg2LmgiCisKKyNkZWZpbmUgSEFYX0VNVUxfT05FICAgIDB4MQorI2RlZmluZSBIQVhfRU1VTF9SRUFMICAgMHgyCisjZGVmaW5lIEhBWF9FTVVMX0hMVCAgICAweDQKKyNkZWZpbmUgSEFYX0VNVUxfRVhJVExPT1AgICAgMHg1CisKKyNkZWZpbmUgSEFYX0VNVUxBVEVfU1RBVEVfTU1JTyAgMHgxCisjZGVmaW5lIEhBWF9FTVVMQVRFX1NUQVRFX1JFQUwgIDB4MgorI2RlZmluZSBIQVhfRU1VTEFURV9TVEFURV9OT05FICAweDMKKyNkZWZpbmUgSEFYX0VNVUxBVEVfU1RBVEVfSU5JVElBTCAgICAgICAweDQKKworc3RydWN0IGhheF9zdGF0ZSBoYXhfZ2xvYmFsOworCitpbnQgaGF4X3N1cHBvcnQgPSAtMTsKKworLyogQ2FsbGVkIGFmdGVyIGhheF9pbml0ICovCitpbnQgaGF4X2VuYWJsZWQoKQoreworICAgIHJldHVybiAoIWhheF9kaXNhYmxlZCAmJiBoYXhfc3VwcG9ydCk7Cit9CisKKy8qIEN1cnJlbnRseSBub24tUEcgbW9kZXMgYXJlIGVtdWxhdGVkIGJ5IFFFTVUgKi8KK2ludCBoYXhfdmNwdV9lbXVsYXRpb25fbW9kZShDUFVTdGF0ZSAqY3B1KQoreworICAgIENQVVg4NlN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisgICAgcmV0dXJuICEoZW52LT5jclswXSAmIENSMF9QR19NQVNLKTsKK30KKworc3RhdGljIGludCBoYXhfcHJlcGFyZV9lbXVsYXRpb24oQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICAvKiBGbHVzaCBhbGwgZW11bGF0aW9uIHN0YXRlcyAqLworICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgIHRiX2ZsdXNoKGVudik7CisgICAgLyogU3luYyB0aGUgdmNwdSBzdGF0ZSBmcm9tIGhheCBrZXJuZWwgbW9kdWxlICovCisgICAgaGF4X3ZjcHVfc3luY19zdGF0ZShFTlZfR0VUX0NQVShlbnYpLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgdG8gYnJlYWsgdGhlIHRyYW5zbGF0aW9uIGJsb2NrIGxvb3AKKyAqIEJyZWFrIHRibG9vcCBhZnRlciBvbmUgTU1JTyBlbXVsYXRpb24sIG9yIGFmdGVyIGZpbmlzaCBlbXVsYXRpb24gbW9kZQorICovCitzdGF0aWMgaW50IGhheF9zdG9wX3RibG9vcChDUFVTdGF0ZSAqY3B1KQoreworICAgIHN3aXRjaCAoY3B1LT5oYXhfdmNwdS0+ZW11bGF0aW9uX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBIQVhfRU1VTEFURV9TVEFURV9NTUlPOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgSEFYX0VNVUxBVEVfU1RBVEVfSU5JVElBTDoKKyAgICAgICAgY2FzZSBIQVhfRU1VTEFURV9TVEFURV9SRUFMOgorICAgICAgICAgICAgaWYgKCFoYXhfdmNwdV9lbXVsYXRpb25fbW9kZShjcHUpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBkcHJpbnQoIkludmFsaWQgZW11bGF0aW9uIHN0YXRlIGluIGhheF9zdG9fdGJsb29wIHN0YXRlICV4XG4iLAorICAgICAgICAgICAgICBjcHUtPmhheF92Y3B1LT5lbXVsYXRpb25fc3RhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfc3RvcF9lbXVsYXRpb24oQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBpZiAoaGF4X3N0b3BfdGJsb29wKGNwdSkpCisgICAgeworICAgICAgICBjcHUtPmhheF92Y3B1LT5lbXVsYXRpb25fc3RhdGUgPSAgSEFYX0VNVUxBVEVfU1RBVEVfTk9ORTsKKyAgICAgICAgLyoKKyAgICAgICAgICogUUVNVSBlbXVsYXRpb24gY2hhbmdlcyB2Y3B1IHN0YXRlLAorICAgICAgICAgKiBTeW5jIHRoZSB2Y3B1IHN0YXRlIHRvIEhBWCBrZXJuZWwgbW9kdWxlCisgICAgICAgICAqLworICAgICAgICBoYXhfdmNwdV9zeW5jX3N0YXRlKGNwdSwgMSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X3N0b3BfdHJhbnNsYXRlKENQVVN0YXRlICpjcHUpCit7CisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICp2c3RhdGU7CisKKyAgICB2c3RhdGUgPSBjcHUtPmhheF92Y3B1OworICAgIGFzc2VydCh2c3RhdGUtPmVtdWxhdGlvbl9zdGF0ZSk7CisgICAgaWYgKHZzdGF0ZS0+ZW11bGF0aW9uX3N0YXRlID09IEhBWF9FTVVMQVRFX1NUQVRFX01NSU8gKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgdmFsaWRfaGF4X3R1bm5lbF9zaXplKHVpbnQxNl90IHNpemUpCit7CisgICAgcmV0dXJuIHNpemUgPj0gc2l6ZW9mKHN0cnVjdCBoYXhfdHVubmVsKTsKK30KKworaGF4X2ZkIGhheF92Y3B1X2dldF9mZChDUFVTdGF0ZSAqY3B1KQoreworICAgIHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSAqdmNwdSA9IGNwdS0+aGF4X3ZjcHU7CisgICAgaWYgKCF2Y3B1KQorICAgICAgICByZXR1cm4gSEFYX0lOVkFMSURfRkQ7CisgICAgcmV0dXJuIHZjcHUtPmZkOworfQorCisvKiBDdXJyZW50IHZlcnNpb24gKi8KK3VpbnQzMl90IGhheF9jdXJfdmVyc2lvbiA9IDB4MjsKKy8qIExlYXN0IEhBWCBrZXJuZWwgdmVyc2lvbiAqLwordWludDMyX3QgaGF4X2xlc3RfdmVyc2lvbiA9IDB4MTsKKworLy8gUmV0dXJuIHRoZSBwYXRoIHRvIEludGVsIEhBWE0gaW5zdGFsbGVyLiBSZXR1cm4gTlVMTCBpZiB3ZSBjYW5ub3QgZmlndXJlCisvLyBpdCBvdXQuIFdlIHdhbnQgdG8gbWFrZSBpdCBpcyBlYXNpZXIgZm9yIHVzZXJzIHRvIHJlLXJ1biB0aGUgaW5zdGFsbGVyIHRvCisvLyByZWNvbmZpZ3VyZSB0aGUgSEFYTXMuCitzdGF0aWMgY2hhciogaGF4X2dldF9pbnRlbF9IQVhNX2luc3RhbGxlcl9wYXRoKCkgeworI2lmZGVmIENPTkZJR19EQVJXSU4KKyAgICBjb25zdCBjaGFyICpjb25zdCByZWxhdGl2ZV9wYXRoID0KKyAgICAgICAgIi9leHRyYXMvaW50ZWwvSGFyZHdhcmVfQWNjZWxlcmF0ZWRfRXhlY3V0aW9uX01hbmFnZXIvIgorICAgICAgICAiSW50ZWxIQVhNXzEuMS40LmRtZyI7CisjZWxpZiBDT05GSUdfV0lOMzIKKyAgICBjb25zdCBjaGFyICpjb25zdCByZWxhdGl2ZV9wYXRoID0KKyAgICAgICAgIlxcZXh0cmFzXFxpbnRlbFxcSGFyZHdhcmVfQWNjZWxlcmF0ZWRfRXhlY3V0aW9uX01hbmFnZXJcXCIKKyAgICAgICAgImludGVsaGF4bS1hbmRyb2lkLmV4ZSI7CisjZWxzZQorICAgIHJldHVybiBOVUxMOworI2VuZGlmCisKKyAgICBjaGFyIGJ1ZltQQVRIX01BWF07CisgICAgY2hhciogc2RrX2hvbWUgPSBwYXRoX2dldFNka1Jvb3QoKTsKKyAgICBpZiAoc2RrX2hvbWUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaW50IGxlbmd0aCA9IHN0cmxlbihzZGtfaG9tZSk7CisgICAgaWYgKGxlbmd0aCA+IFBBVEhfTUFYIC0gMSkgcmV0dXJuIE5VTEw7CisgICAgc3RybmNweShidWYsIHNka19ob21lLCBsZW5ndGggKyAxIC8qIHBhZGRpbmcgYSB6ZXJvICovKTsKKyAgICBmcmVlKHNka19ob21lKTsKKworICAgIGludCByZWxhdGl2ZV9wYXRoX2xlbmd0aCA9IHN0cmxlbihyZWxhdGl2ZV9wYXRoKTsKKyAgICBpZiAobGVuZ3RoICsgcmVsYXRpdmVfcGF0aF9sZW5ndGggPiBQQVRIX01BWCAtIDEpIHJldHVybiBOVUxMOworICAgIHN0cm5jcHkoYnVmICsgbGVuZ3RoLCByZWxhdGl2ZV9wYXRoLCByZWxhdGl2ZV9wYXRoX2xlbmd0aCArIDEpOworICAgIGlmIChhY2Nlc3MoYnVmLCBSX09LKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBnX3N0cmR1cChidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBoYXhfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IGhheF9zdGF0ZSAqaGF4KQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IGhheF9jYXBhYmlsaXR5aW5mbyBjYXBpbmZvLCAqY2FwID0gJmNhcGluZm87CisKKyAgICByZXQgPSBoYXhfY2FwYWJpbGl0eShoYXgsIGNhcCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisKKyAgICBpZiAoICgoY2FwLT53c3RhdHVzICYgSEFYX0NBUF9XT1JLU1RBVFVTX01BU0spID09CisgICAgICAgICAgSEFYX0NBUF9TVEFUVVNfTk9UV09SS0lORyApKQorICAgIHsKKyAgICAgICAgaWYgKGNhcC0+d2luZm8gJiBIQVhfQ0FQX0ZBSUxSRUFTT05fVlQpCisgICAgICAgICAgICBkcHJpbnQoIlZUIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQsIEhBWE0gbm90IHdvcmtpbmcuXG4iCisgICAgICAgICAgICAgICAgICAgIllvdSBtaWdodCB3YW50IHRvIGNoZWNrIHlvdXIgQklPUy9VRUZJIHNldHRpbmdzICIKKyAgICAgICAgICAgICAgICAgICAiYW5kL29yIHN5c3RlbSBtYW51YWwgb24gaG93IHRvIGVuYWJsZS5cbiIpOworICAgICAgICBlbHNlIGlmIChjYXAtPndpbmZvICYgSEFYX0NBUF9GQUlMUkVBU09OX05YKQorICAgICAgICAgICAgZHByaW50KCJOWCBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBIQVhNIG5vdCB3b3JraW5nLlxuIgorICAgICAgICAgICAgICAgICAgICJZb3UgbWlnaHQgd2FudCB0byBjaGVjayB5b3VyIEJJT1MvVUVGSSBzZXR0aW5ncyAiCisgICAgICAgICAgICAgICAgICAgImFuZC9vciBzeXN0ZW0gbWFudWFsIG9uIGhvdyB0byBlbmFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsKKyAgICB9CisKKyAgICBpZiAoY2FwLT53c3RhdHVzICYgSEFYX0NBUF9NRU1RVU9UQSkKKyAgICB7CisgICAgICAgIGlmIChjYXAtPm1lbV9xdW90YSA8IGhheC0+bWVtX3F1b3RhKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGJ1ZltQQVRIX01BWCArIDEyOF07ICAvLyBUbyBob2xkIHNvbWUgd29yZHMgcGx1cyBhIHBhdGguCisgICAgICAgICAgICBjaGFyKiBoYXhtX3BhdGggPSBoYXhfZ2V0X2ludGVsX0hBWE1faW5zdGFsbGVyX3BhdGgoKTsKKyAgICAgICAgICAgIGlmIChoYXhtX3BhdGggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc3RybGVuKGhheG1fcGF0aCkgKyAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBUaGUgSEFYTSBpbnN0YWxsZXIgbWF5IGJlIGZvdW5kIGF0ICVzLiIsIGhheG1fcGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7ICAgIC8vIE1ha2UgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcHJpbnQoCisgICAgICAgICAgICAgICAgIkhBWE0gZG9lcyBub3QgaGF2ZSBlbm91Z2ggbWVtb3J5IHJlbWFpbmluZyB0byBsb2FkIHRoaXMgQVZELiIpOworICAgICAgICAgICAgZHByaW50KCJBVkQgICAgICBSQU0gc2l6ZSA9ICUiUFJJZDY0IiBNQiIsIGhheC0+bWVtX3F1b3RhID4+IDIwKTsKKyAgICAgICAgICAgIGRwcmludCgiSEFYTSBtYXggUkFNIHNpemUgPSAlIlBSSWQ2NCIgTUIgKGZvciBhbGwgcnVubmluZyBBVkRzKSIsCisgICAgICAgICAgICAgICAgICAgY2FwLT5tZW1fcXVvdGEgPj4gMjApOworICAgICAgICAgICAgZHByaW50KAorICAgICAgICAgICAgICAgICJUcnkgY3JlYXRpbmcgYW4gQVZEIHRoYXQgcmVxdWlyZXMgbGVzcyBSQU0gb3IgcmUtcnVubmluZyAiCisgICAgICAgICAgICAgICAgInRoZSBIQVhNIGluc3RhbGxlciB0byBzZXQgYSBoaWdoZXIgbWVtb3J5IGxpbWl0LiVzXG4iLCBidWYpOworICAgICAgICAgICAgcmV0dXJuIC1FTk9TUEM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXhfdmVyc2lvbl9zdXBwb3J0KHN0cnVjdCBoYXhfc3RhdGUgKmhheCkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBoYXhfbW9kdWxlX3ZlcnNpb24gdmVyc2lvbjsKKworICAgIHJldCA9IGhheF9tb2RfdmVyc2lvbihoYXgsICZ2ZXJzaW9uKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIChoYXhfbGVzdF92ZXJzaW9uID4gdmVyc2lvbi5jdXJfdmVyc2lvbikgfHwKKyAgICAgICAgIChoYXhfY3VyX3ZlcnNpb24gPCB2ZXJzaW9uLmNvbXBhdF92ZXJzaW9uKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBoYXhfdmNwdV9jcmVhdGUoaW50IGlkKQoreworICAgIHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSAqdmNwdSA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICghaGF4X2dsb2JhbC52bSkKKyAgICB7CisgICAgICAgIGRwcmludCgidmNwdSAleCBjcmVhdGVkIGZhaWxlZCwgdm0gaXMgbnVsbFxuIiwgaWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGhheF9nbG9iYWwudm0tPnZjcHVzW2lkXSkKKyAgICB7CisgICAgICAgIGRwcmludCgidmNwdSAleCBhbGxvY2F0ZWQgYWxyZWFkeVxuIiwgaWQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2Y3B1ID0gZ19tYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSkpOworICAgIGlmICghdmNwdSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGFsbG9jIHZjcHUgc3RhdGVcbiIpOworICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9CisKKyAgICBtZW1zZXQodmNwdSwgMCwgc2l6ZW9mKHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSkpOworCisgICAgcmV0ID0gaGF4X2hvc3RfY3JlYXRlX3ZjcHUoaGF4X2dsb2JhbC52bS0+ZmQsIGlkKTsKKyAgICBpZiAocmV0KQorICAgIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gY3JlYXRlIHZjcHUgJXhcbiIsIGlkKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB2Y3B1LT5mZCA9IGhheF9ob3N0X29wZW5fdmNwdShoYXhfZ2xvYmFsLnZtLT5pZCwgaWQpOworICAgIGlmIChoYXhfaW52YWxpZF9mZCh2Y3B1LT5mZCkpCisgICAgeworICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBvcGVuIHRoZSB2Y3B1XG4iKTsKKyAgICAgICAgcmV0ID0gLUVOT0RFVjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoYXhfZ2xvYmFsLnZtLT52Y3B1c1tpZF0gPSB2Y3B1OworCisgICAgcmV0ID0gaGF4X2hvc3Rfc2V0dXBfdmNwdV9jaGFubmVsKHZjcHUpOworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBkcHJpbnQoIkludmFsaWQgSEFYIHR1bm5lbCBzaXplIFxuIik7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICAvKiB2Y3B1IGFuZCB0dW5uZWwgd2lsbCBiZSBjbG9zZWQgYXV0b21hdGljYWxseSAqLworICAgIGlmICh2Y3B1ICYmICFoYXhfaW52YWxpZF9mZCh2Y3B1LT5mZCkpCisgICAgICAgIGhheF9jbG9zZV9mZCh2Y3B1LT5mZCk7CisKKyAgICBoYXhfZ2xvYmFsLnZtLT52Y3B1c1tpZF0gPSBOVUxMOworICAgIGdfZnJlZSh2Y3B1KTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBoYXhfdmNwdV9kZXN0cm95KENQVVN0YXRlICpjcHUpCit7CisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1ID0gY3B1LT5oYXhfdmNwdTsKKworICAgIGlmICghaGF4X2dsb2JhbC52bSkKKyAgICB7CisgICAgICAgIGRwcmludCgidmNwdSAleCBkZXN0cm95IGZhaWxlZCwgdm0gaXMgbnVsbFxuIiwgdmNwdS0+dmNwdV9pZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIXZjcHUpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyoKKyAgICAgKiAxLiBUaGUgaGF4X3R1bm5lbCBpcyBhbHNvIGRlc3Ryb3llZCBhdCB2Y3B1X2Rlc3Ryb3kKKyAgICAgKiAyLiBoYXhfY2xvc2VfZmQgd2lsbCByZXF1aXJlIHRoZSBIQVgga2VybmVsIG1vZHVsZSB0byBmcmVlIHZjcHUKKyAgICAgKi8KKyAgICBoYXhfY2xvc2VfZmQodmNwdS0+ZmQpOworICAgIGhheF9nbG9iYWwudm0tPnZjcHVzW3ZjcHUtPnZjcHVfaWRdID0gTlVMTDsKKyAgICBnX2ZyZWUodmNwdSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfaW5pdF92Y3B1KENQVVN0YXRlICpjcHUpCit7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGhheF92Y3B1X2NyZWF0ZShjcHUtPmNwdV9pbmRleCk7CisgICAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBjcmVhdGUgSEFYIHZjcHVcbiIpOworICAgICAgICBleGl0KC0xKTsKKyAgICB9CisKKyAgICBjcHUtPmhheF92Y3B1ID0gaGF4X2dsb2JhbC52bS0+dmNwdXNbY3B1LT5jcHVfaW5kZXhdOworICAgIGNwdS0+aGF4X3ZjcHUtPmVtdWxhdGlvbl9zdGF0ZSA9IEhBWF9FTVVMQVRFX1NUQVRFX0lOSVRJQUw7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgaGF4X3ZtICpoYXhfdm1fY3JlYXRlKHN0cnVjdCBoYXhfc3RhdGUgKmhheCkKK3sKKyAgICBzdHJ1Y3QgaGF4X3ZtICp2bTsKKyAgICBpbnQgdm1faWQgPSAwLCByZXQ7CisgICAgY2hhciAqdm1fbmFtZSA9IE5VTEw7CisKKyAgICBpZiAoaGF4X2ludmFsaWRfZmQoaGF4LT5mZCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGhheC0+dm0pCisgICAgICAgIHJldHVybiBoYXgtPnZtOworCisgICAgdm0gPSBnX21hbGxvYyhzaXplb2Yoc3RydWN0IGhheF92bSkpOworICAgIGlmICghdm0pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldCh2bSwgMCwgc2l6ZW9mKHN0cnVjdCBoYXhfdm0pKTsKKyAgICByZXQgPSBoYXhfaG9zdF9jcmVhdGVfdm0oaGF4LCAmdm1faWQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gY3JlYXRlIHZtICV4XG4iLCByZXQpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICB2bS0+aWQgPSB2bV9pZDsKKyAgICB2bS0+ZmQgPSBoYXhfaG9zdF9vcGVuX3ZtKGhheCwgdm1faWQpOworICAgIGlmIChoYXhfaW52YWxpZF9mZCh2bS0+ZmQpKQorICAgIHsKKyAgICAgICAgZHByaW50KCJPcGVuIHZtIGRldmljZSBlcnJvcjolc1xuIiwgdm1fbmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaGF4LT52bSA9IHZtOworICAgIHJldHVybiB2bTsKKworZXJyb3I6CisgICAgZ19mcmVlKHZtKTsKKyAgICBoYXgtPnZtID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGhheF92bV9kZXN0cm95KHN0cnVjdCBoYXhfdm0gKnZtKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEhBWF9NQVhfVkNQVTsgaSsrKQorICAgICAgICBpZiAodm0tPnZjcHVzW2ldKQorICAgICAgICB7CisgICAgICAgICAgICBkcHJpbnQoIlZDUFUgc2hvdWxkIGJlIGNsZWFuZWQgYmVmb3JlIHZtIGNsZWFuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIGhheF9jbG9zZV9mZCh2bS0+ZmQpOworICAgIGdfZnJlZSh2bSk7CisgICAgaGF4X2dsb2JhbC52bSA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfZ2V0X21heF9yYW0odWludDY0X3QqIG1heF9yYW0pIHsKKyAgICBzdHJ1Y3QgaGF4X2NhcGFiaWxpdHlpbmZvIGNhcDsKKworICAgIGludCByZXN1bHQgPSBoYXhfY2FwYWJpbGl0eSgmaGF4X2dsb2JhbCwgJmNhcCk7CisgICAgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICptYXhfcmFtID0gY2FwLm1lbV9xdW90YTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGhheF9zZXRfcmFtc2l6ZSh1aW50NjRfdCByYW1zaXplKQoreworICAgIHN0cnVjdCBoYXhfc3RhdGUgKmhheCA9ICZoYXhfZ2xvYmFsOworCisgICAgbWVtc2V0KGhheCwgMCwgc2l6ZW9mKHN0cnVjdCBoYXhfc3RhdGUpKTsKKyAgICBoYXgtPm1lbV9xdW90YSA9IHJhbV9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfaW5pdChpbnQgc21wX2NwdXMpCit7CisgICAgc3RydWN0IGhheF9zdGF0ZSAqaGF4ID0gTlVMTDsKKyAgICBzdHJ1Y3QgaGF4X3FlbXVfdmVyc2lvbiBxdmVyc2lvbjsKKyAgICBpbnQgcmV0OworCisgICAgaGF4X3N1cHBvcnQgPSAwOworCisgICAgaGF4ID0gJmhheF9nbG9iYWw7CisKKyAgICBoYXgtPmZkID0gaGF4X21vZF9vcGVuKCk7CisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKGhheC0+ZmQpKQorICAgIHsKKyAgICAgICAgaGF4LT5mZCA9IDA7CisgICAgICAgIHJldCA9IC1FTk9ERVY7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gaGF4X2dldF9jYXBhYmlsaXR5KGhheCk7CisgICAgLyogSW4gY2FzZSBIQVhNIGhhdmUgbm8gc3VjaCBjYXBhYmlsaXR5IHN1cHBvcnQgKi8KKyAgICBpZiAocmV0ICYmIChyZXQgIT0gLUVOT1NZUykpCisgICAgeworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmICghaGF4X3ZlcnNpb25fc3VwcG9ydChoYXgpKQorICAgIHsKKyAgICAgICAgZHByaW50KCJJbmNvbXBhdGlibGUgSEFYIHZlcnNpb24uIFFlbXUgY3VycmVudCB2ZXJzaW9uICV4ICIsIGhheF9jdXJfdmVyc2lvbiApOworICAgICAgICBkcHJpbnQoInJlcXVpcmVzIGxlYXN0IEhBWCB2ZXJzaW9uICV4XG4iLCBoYXhfbGVzdF92ZXJzaW9uKTsKKyAgICAgICAgcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBoYXgtPnZtID0gaGF4X3ZtX2NyZWF0ZShoYXgpOworICAgIGlmICghaGF4LT52bSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGNyZWF0ZSBIQVggVk1cbiIpOworICAgICAgICByZXQgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHF2ZXJzaW9uLmN1cl92ZXJzaW9uID0gaGF4X2N1cl92ZXJzaW9uOworICAgIHF2ZXJzaW9uLmxlYXN0X3ZlcnNpb24gPSBoYXhfbGVzdF92ZXJzaW9uOworICAgIGhheF9ub3RpZnlfcWVtdV92ZXJzaW9uKGhheC0+dm0tPmZkLCAmcXZlcnNpb24pOworICAgIGhheF9zdXBwb3J0ID0gMTsKKyAgICBxZW11X3JlZ2lzdGVyX3Jlc2V0KCBoYXhfcmVzZXRfdmNwdV9zdGF0ZSwgMCwgTlVMTCk7CisKKyAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIGlmIChoYXgtPnZtKQorICAgICAgICBoYXhfdm1fZGVzdHJveShoYXgtPnZtKTsKKyAgICBpZiAoaGF4LT5mZCkKKyAgICAgICAgaGF4X21vZF9jbG9zZShoYXgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50ICBoYXhfaGFuZGxlX2Zhc3RtbWlvKENQVVg4NlN0YXRlICplbnYsIHN0cnVjdCBoYXhfZmFzdG1taW8gKmhmdCkKK3sKKyAgICB1aW50NjRfdCBidWYgPSAwOworCisgICAgLyoKKyAgICAgKiBXaXRoIGZhc3QgTU1JTywgUUVNVSBuZWVkIG5vdCBzeW5jIHZDUFUgc3RhdGUgd2l0aCBIQVhNCisgICAgICogZHJpdmVyIGJlY2F1c2UgaXQgd2lsbCBvbmx5IGludm9rZSBNTUlPIGhhbmRsZXIKKyAgICAgKiBIb3dldmVyLCBzb21lIE1NSU8gb3BlcmF0aW9ucyB1dGlsaXplIHZpcnR1YWwgYWRkcmVzcyBsaWtlIHFlbXVfcGlwZQorICAgICAqIFRodXMgd2UgbmVlZCB0byBzeW5jIHRoZSBDUjAsIENSMyBhbmQgQ1I0IHNvIHRoYXQgUUVNVQorICAgICAqIGNhbiB0cmFuc2xhdGUgdGhlIGd1ZXN0IHZpcnR1YWwgYWRkcmVzcyB0byBndWVzdCBwaHlzaWNhbAorICAgICAqIGFkZHJlc3MKKyAgICAgKi8KKyAgICBlbnYtPmNyWzBdID0gaGZ0LT5fY3IwOworICAgIGVudi0+Y3JbMl0gPSBoZnQtPl9jcjI7CisgICAgZW52LT5jclszXSA9IGhmdC0+X2NyMzsKKyAgICBlbnYtPmNyWzRdID0gaGZ0LT5fY3I0OworCisgICAgYnVmID0gaGZ0LT52YWx1ZTsKKyAgICBjcHVfcGh5c2ljYWxfbWVtb3J5X3J3KGhmdC0+Z3BhLCAmYnVmLCBoZnQtPnNpemUsIGhmdC0+ZGlyZWN0aW9uKTsKKyAgICBpZiAoaGZ0LT5kaXJlY3Rpb24gPT0gMCkKKyAgICAgICAgaGZ0LT52YWx1ZSA9IGJ1ZjsKKworICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X2hhbmRsZV9pbyhDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCBkZiwgdWludDE2X3QgcG9ydCwgaW50IGRpcmVjdGlvbiwKKyAgaW50IHNpemUsIGludCBjb3VudCwgdm9pZCAqYnVmZmVyKQoreworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICBpbnQgaTsKKworICAgIGlmICghZGYpCisgICAgICAgIHB0ciA9ICh1aW50OF90ICopYnVmZmVyOworICAgIGVsc2UKKyAgICAgICAgcHRyID0gYnVmZmVyICsgc2l6ZSAqIGNvdW50IC0gc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gSEFYX0VYSVRfSU9fSU4pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2l6ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc3RiX3AocHRyLCBjcHVfaW5iKHBvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBzdHdfcChwdHIsIGNwdV9pbncocG9ydCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIHN0bF9wKHB0ciwgY3B1X2lubChwb3J0KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChzaXplKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBjcHVfb3V0Yihwb3J0LCBsZHViX3AocHRyKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgY3B1X291dHcocG9ydCwgbGR1d19wKHB0cikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGNwdV9vdXRsKHBvcnQsIGxkbF9wKHB0cikpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRmKQorICAgICAgICAgICAgcHRyICs9IHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB0ciAtPSBzaXplOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhheF92Y3B1X2ludGVycnVwdChDUFVTdGF0ZSAqY3B1KQoreworICAgIHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSAqdmNwdSA9IGNwdS0+aGF4X3ZjcHU7CisgICAgc3RydWN0IGhheF90dW5uZWwgKmh0ID0gdmNwdS0+dHVubmVsOworICAgIENQVVg4NlN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisKKyAgICAvKgorICAgICAqIFRyeSB0byBpbmplY3QgYW4gaW50ZXJydXB0IGlmIHRoZSBndWVzdCBjYW4gYWNjZXB0IGl0CisgICAgICogVW5saWtlIEtWTSwgdGhlIEhBWCBrZXJuZWwgbW9kdWxlIGNoZWNrcyB0aGUgZWZsYWdzLCBpbnN0ZWFkLgorICAgICAqLworICAgIGlmIChodC0+cmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb24gJiYKKyAgICAgIChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSkKKyAgICB7CisgICAgICAgIGludCBpcnE7CisKKyAgICAgICAgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmPSB+Q1BVX0lOVEVSUlVQVF9IQVJEOworICAgICAgICBpcnEgPSBjcHVfZ2V0X3BpY19pbnRlcnJ1cHQoZW52KTsKKyAgICAgICAgaWYgKGlycSA+PSAwKSB7CisgICAgICAgICAgICBoYXhfaW5qZWN0X2ludGVycnVwdChjcHUsIGlycSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIHdlIGhhdmUgYW4gaW50ZXJydXB0IHBlbmRpbmcgYnV0IHRoZSBndWVzdCBpcyBub3QgcmVhZHkgdG8KKyAgICAgKiByZWNlaXZlIGl0LCByZXF1ZXN0IGFuIGludGVycnVwdCB3aW5kb3cgZXhpdC4gIFRoaXMgd2lsbCBjYXVzZQorICAgICAqIGEgcmV0dXJuIHRvIHVzZXJzcGFjZSBhcyBzb29uIGFzIHRoZSBndWVzdCBpcyByZWFkeSB0byByZWNlaXZlCisgICAgICogYW4gaW50ZXJydXB0LgorICAgICAqLworICAgIGlmICgoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkpCisgICAgICAgIGh0LT5yZXF1ZXN0X2ludGVycnVwdF93aW5kb3cgPSAxOworICAgIGVsc2UKKyAgICAgICAgaHQtPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdyA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGF4X3JhaXNlX2V2ZW50KENQVVN0YXRlICpjcHUpCit7CisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1ID0gY3B1LT5oYXhfdmNwdTsKKworICAgIGlmICghdmNwdSkKKyAgICAgICAgcmV0dXJuOworICAgIHZjcHUtPnR1bm5lbC0+dXNlcl9ldmVudF9wZW5kaW5nID0gMTsKK30KKworLyoKKyAqIFJlcXVlc3QgdGhlIEhBWCBrZXJuZWwgbW9kdWxlIHRvIHJ1biB0aGUgQ1BVIGZvciB1cyB1bnRpbCBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgb2NjdXJzOgorICogMS4gR3Vlc3QgY3Jhc2hlcyBvciBpcyBzaHV0IGRvd24KKyAqIDIuIFdlIG5lZWQgUUVNVSdzIGVtdWxhdGlvbiBsaWtlIHdoZW4gdGhlIGd1ZXN0IGV4ZWN1dGVzIGEgTU1JTworICogICAgaW5zdHJ1Y3Rpb24gb3IgZ3Vlc3QgZW50ZXJzIGVtdWxhdGlvbiBtb2RlIChub24tUEcgbW9kZSkKKyAqIDMuIEd1ZXN0IGV4ZWN1dGVzIEhMVAorICogNC4gUWVtdSBoYXMgU2lnbmFsL2V2ZW50IHBlbmRpbmcKKyAqIDUuIEFuIHVua25vd24gVk1YLWV4aXQgaGFwcGVucworICovCitleHRlcm4gdm9pZCBxZW11X3N5c3RlbV9yZXNldF9yZXF1ZXN0KHZvaWQpOworc3RhdGljIGludCBoYXhfdmNwdV9oYXhfZXhlYyhDUFVTdGF0ZSAqY3B1KQoreworICAgIGludCByZXQgPSAwOworICAgIENQVVg4NlN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1ID0gY3B1LT5oYXhfdmNwdTsKKyAgICBzdHJ1Y3QgaGF4X3R1bm5lbCAqaHQgPSB2Y3B1LT50dW5uZWw7CisKKyAgICBpZiAoaGF4X3ZjcHVfZW11bGF0aW9uX21vZGUoY3B1KSkKKyAgICB7CisgICAgICAgIGRwcmludCgiVHJ5aW5nIHRvIHZjcHUgZXhlY3V0ZSBhdCBlaXA6JWx4XG4iLCBlbnYtPmVpcCk7CisgICAgICAgIHJldHVybiAgSEFYX0VNVUxfRVhJVExPT1A7CisgICAgfQorCisgICAgZG8geworICAgICAgICBpbnQgaGF4X3JldDsKKworICAgICAgICBpZiAoY3B1LT5leGl0X3JlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldCA9IEhBWF9FTVVMX0VYSVRMT09QIDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaGF4X3ZjcHVfaW50ZXJydXB0KGNwdSk7CisKKyAgICAgICAgaGF4X3JldCA9IGhheF92Y3B1X3J1bih2Y3B1KTsKKworICAgICAgICAvKiBTaW1wbHkgY29udGludWUgdGhlIHZjcHVfcnVuIGlmIHN5c3RlbSBjYWxsIGludGVycnVwdGVkICovCisgICAgICAgIGlmIChoYXhfcmV0ID09IC1FSU5UUiB8fCBoYXhfcmV0ID09IC1FQUdBSU4pIHsKKyAgICAgICAgICAgIGRwcmludCgiaW8gd2luZG93IGludGVycnVwdGVkXG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhheF9yZXQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBkcHJpbnQoInZjcHUgcnVuIGZhaWxlZCBmb3IgdmNwdSAgJXhcbiIsIHZjcHUtPnZjcHVfaWQpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGh0LT5fZXhpdF9zdGF0dXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgSEFYX0VYSVRfSU86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBoYXhfaGFuZGxlX2lvKGVudiwgaHQtPnBpby5fZGYsIGh0LT5waW8uX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgaHQtPnBpby5fZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGh0LT5waW8uX3NpemUsIGh0LT5waW8uX2NvdW50LCB2Y3B1LT5pb2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIQVhfRVhJVF9NTUlPOgorICAgICAgICAgICAgICAgIHJldCA9IEhBWF9FTVVMX09ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFYX0VYSVRfRkFTVF9NTUlPOgorICAgICAgICAgICAgICAgIHJldCA9IGhheF9oYW5kbGVfZmFzdG1taW8oZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBoYXhfZmFzdG1taW8gKil2Y3B1LT5pb2J1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhBWF9FWElUX1JFQUw6CisgICAgICAgICAgICAgICAgcmV0ID0gSEFYX0VNVUxfUkVBTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvKiBHdWVzdCBzdGF0ZSBjaGFuZ2VkLCBjdXJyZW50bHkgb25seSBmb3Igc2h1dGRvd24gKi8KKyAgICAgICAgICAgIGNhc2UgSEFYX0VYSVRfU1RBVEVDSEFOR0U6CisgICAgICAgICAgICAgICAgZHByaW50KCJWQ1BVIHNodXRkb3duIHJlcXVlc3RcbiIpOworICAgICAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBoYXhfcHJlcGFyZV9lbXVsYXRpb24oZW52KTsKKyAgICAgICAgICAgICAgICBjcHVfZHVtcF9zdGF0ZShjcHUsIHN0ZGVyciwgZnByaW50ZiwgMCk7CisgICAgICAgICAgICAgICAgcmV0ID0gSEFYX0VNVUxfRVhJVExPT1A7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEhBWF9FWElUX1VOS05PV05fVk1FWElUOgorICAgICAgICAgICAgICAgIGRwcmludCgiVW5rbm93biBWTVggZXhpdCAleCBmcm9tIGd1ZXN0XG4iLCBodC0+X2V4aXRfcmVhc29uKTsKKyAgICAgICAgICAgICAgICBxZW11X3N5c3RlbV9yZXNldF9yZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgaGF4X3ByZXBhcmVfZW11bGF0aW9uKGVudik7CisgICAgICAgICAgICAgICAgY3B1X2R1bXBfc3RhdGUoY3B1LCBzdGRlcnIsIGZwcmludGYsIDApOworICAgICAgICAgICAgICAgIHJldCA9IEhBWF9FTVVMX0VYSVRMT09QOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIQVhfRVhJVF9ITFQ6CisgICAgICAgICAgICAgICAgaWYgKCEoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgJiYKKyAgICAgICAgICAgICAgICAgICEoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfTk1JKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBobHQgaW5zdHJ1Y3Rpb24gd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQgaXMgc2h1dGRvd24gKi8KKyAgICAgICAgICAgICAgICAgICAgZW52LT5lZmxhZ3MgfD0gSUZfTUFTSzsKKyAgICAgICAgICAgICAgICAgICAgY3B1LT5oYWx0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfSExUOworICAgICAgICAgICAgICAgICAgICByZXQgPSBIQVhfRU1VTF9ITFQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIHRoZXNlIHNpdHVhdGlvbiB3aWxsIGNvbnRpbnVlIHRvIGhheCBtb2R1bGUgKi8KKyAgICAgICAgICAgIGNhc2UgSEFYX0VYSVRfSU5URVJSVVBUOgorICAgICAgICAgICAgY2FzZSBIQVhfRVhJVF9QQVVTRUQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRwcmludCgiVW5rbm93IGV4aXQgJXggZnJvbSBoYXhcbiIsIGh0LT5fZXhpdF9zdGF0dXMpOworICAgICAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBoYXhfcHJlcGFyZV9lbXVsYXRpb24oZW52KTsKKyAgICAgICAgICAgICAgICBjcHVfZHVtcF9zdGF0ZShjcHUsIHN0ZGVyciwgZnByaW50ZiwgMCk7CisgICAgICAgICAgICAgICAgcmV0ID0gSEFYX0VNVUxfRVhJVExPT1A7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9d2hpbGUgKCFyZXQpOworCisgICAgaWYgKGNwdS0+ZXhpdF9yZXF1ZXN0KSB7CisgICAgICAgIGNwdS0+ZXhpdF9yZXF1ZXN0ID0gMDsKKyAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0lOVEVSUlVQVDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJldHVybiAxIHdoZW4gbmVlZCB0byBlbXVsYXRlLCAwIHdoZW4gbmVlZCB0byBleGl0IGxvb3AKKyAqLworaW50IGhheF92Y3B1X2V4ZWMoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBpbnQgbmV4dCA9IDAsIHJldCA9IDA7CisgICAgc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1OworICAgIENQVVg4NlN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisKKyAgICBpZiAoY3B1LT5oYXhfdmNwdS0+ZW11bGF0aW9uX3N0YXRlICE9IEhBWF9FTVVMQVRFX1NUQVRFX05PTkUpCisgICAgICAgIHJldHVybiAxOworCisgICAgdmNwdSA9IGNwdS0+aGF4X3ZjcHU7CisgICAgbmV4dCA9IGhheF92Y3B1X2hheF9leGVjKGNwdSk7CisgICAgc3dpdGNoIChuZXh0KQorICAgIHsKKyAgICAgICAgY2FzZSBIQVhfRU1VTF9PTkU6CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgdmNwdS0+ZW11bGF0aW9uX3N0YXRlID0gSEFYX0VNVUxBVEVfU1RBVEVfTU1JTzsKKyAgICAgICAgICAgIGhheF9wcmVwYXJlX2VtdWxhdGlvbihlbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFYX0VNVUxfUkVBTDoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB2Y3B1LT5lbXVsYXRpb25fc3RhdGUgPSBIQVhfRU1VTEFURV9TVEFURV9SRUFMOworICAgICAgICAgICAgaGF4X3ByZXBhcmVfZW11bGF0aW9uKGVudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQVhfRU1VTF9ITFQ6CisgICAgICAgIGNhc2UgSEFYX0VNVUxfRVhJVExPT1A6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGRwcmludCgiVW5rbm93biBoYXggdmNwdSBleGVjIHJldHVybiAleFxuIiwgbmV4dCk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSEFYX1JBTV9JTkZPX1JPTSAweDEKKworc3RhdGljIHZvaWQgc2V0X3Y4MDg2X3NlZyhzdHJ1Y3Qgc2VnbWVudF9kZXNjX3QgKmxocywgY29uc3QgU2VnbWVudENhY2hlICpyaHMpCit7CisgICAgbWVtc2V0KGxocywgMCwgc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2Rlc2NfdCApKTsKKyAgICBsaHMtPnNlbGVjdG9yID0gcmhzLT5zZWxlY3RvcjsKKyAgICBsaHMtPmJhc2UgPSByaHMtPmJhc2U7CisgICAgbGhzLT5saW1pdCA9IHJocy0+bGltaXQ7CisgICAgbGhzLT50eXBlID0gMzsKKyAgICBsaHMtPnByZXNlbnQgPSAxOworICAgIGxocy0+ZHBsID0gMzsKKyAgICBsaHMtPm9wZXJhbmRfc2l6ZSA9IDA7CisgICAgbGhzLT5kZXNjID0gMTsKKyAgICBsaHMtPmxvbmdfbW9kZSA9IDA7CisgICAgbGhzLT5ncmFudWxhcml0eSA9IDA7CisgICAgbGhzLT5hdmFpbGFibGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfc2VnKFNlZ21lbnRDYWNoZSAqbGhzLCBjb25zdCBzdHJ1Y3Qgc2VnbWVudF9kZXNjX3QgKnJocykKK3sKKyAgICBsaHMtPnNlbGVjdG9yID0gcmhzLT5zZWxlY3RvcjsKKyAgICBsaHMtPmJhc2UgPSByaHMtPmJhc2U7CisgICAgbGhzLT5saW1pdCA9IHJocy0+bGltaXQ7CisgICAgbGhzLT5mbGFncyA9CisgICAgICAocmhzLT50eXBlIDw8IERFU0NfVFlQRV9TSElGVCkKKyAgICAgIHwgKHJocy0+cHJlc2VudCAqIERFU0NfUF9NQVNLKQorICAgICAgfCAocmhzLT5kcGwgPDwgREVTQ19EUExfU0hJRlQpCisgICAgICB8IChyaHMtPm9wZXJhbmRfc2l6ZSA8PCBERVNDX0JfU0hJRlQpCisgICAgICB8IChyaHMtPmRlc2MgKiBERVNDX1NfTUFTSykKKyAgICAgIHwgKHJocy0+bG9uZ19tb2RlIDw8IERFU0NfTF9TSElGVCkKKyAgICAgIHwgKHJocy0+Z3JhbnVsYXJpdHkgKiBERVNDX0dfTUFTSykKKyAgICAgIHwgKHJocy0+YXZhaWxhYmxlICogREVTQ19BVkxfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zZWcoc3RydWN0IHNlZ21lbnRfZGVzY190ICpsaHMsIGNvbnN0IFNlZ21lbnRDYWNoZSAqcmhzKQoreworICAgIHVuc2lnbmVkIGZsYWdzID0gcmhzLT5mbGFnczsKKworICAgIG1lbXNldChsaHMsIDAsIHNpemVvZihzdHJ1Y3Qgc2VnbWVudF9kZXNjX3QpKTsKKyAgICBsaHMtPnNlbGVjdG9yID0gcmhzLT5zZWxlY3RvcjsKKyAgICBsaHMtPmJhc2UgPSByaHMtPmJhc2U7CisgICAgbGhzLT5saW1pdCA9IHJocy0+bGltaXQ7CisgICAgbGhzLT50eXBlID0gKGZsYWdzID4+IERFU0NfVFlQRV9TSElGVCkgJiAxNTsKKyAgICBsaHMtPnByZXNlbnQgPSAoZmxhZ3MgJiBERVNDX1BfTUFTSykgIT0gMDsKKyAgICBsaHMtPmRwbCA9IHJocy0+c2VsZWN0b3IgJiAzOworICAgIGxocy0+b3BlcmFuZF9zaXplID0gKGZsYWdzID4+IERFU0NfQl9TSElGVCkgJiAxOworICAgIGxocy0+ZGVzYyA9IChmbGFncyAmIERFU0NfU19NQVNLKSAhPSAwOworICAgIGxocy0+bG9uZ19tb2RlID0gKGZsYWdzID4+IERFU0NfTF9TSElGVCkgJiAxOworICAgIGxocy0+Z3JhbnVsYXJpdHkgPSAoZmxhZ3MgJiBERVNDX0dfTUFTSykgIT0gMDsKKyAgICBsaHMtPmF2YWlsYWJsZSA9IChmbGFncyAmIERFU0NfQVZMX01BU0spICE9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGhheF9nZXRwdXRfcmVnKHVpbnQ2NF90ICpoYXhfcmVnLCB0YXJnZXRfdWxvbmcgKnFlbXVfcmVnLCBpbnQgc2V0KQoreworICAgIHRhcmdldF91bG9uZyByZWcgPSAqaGF4X3JlZzsKKworICAgIGlmIChzZXQpCisgICAgICAgICpoYXhfcmVnID0gKnFlbXVfcmVnOworICAgIGVsc2UKKyAgICAgICAgKnFlbXVfcmVnID0gcmVnOworfQorCisvKiBUaGUgc3JlZ3MgaGFzIGJlZW4gc3luY2VkIHdpdGggSEFYIGtlcm5lbCBhbHJlYWR5IGJlZm9yZSB0aGlzIGNhbGwgKi8KK3N0YXRpYyBpbnQgaGF4X2dldF9zZWdtZW50cyhDUFVYODZTdGF0ZSAqZW52LCBzdHJ1Y3QgdmNwdV9zdGF0ZV90ICpzcmVncykKK3sKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9DU10sICZzcmVncy0+X2NzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9EU10sICZzcmVncy0+X2RzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9FU10sICZzcmVncy0+X2VzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9GU10sICZzcmVncy0+X2ZzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9HU10sICZzcmVncy0+X2dzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9TU10sICZzcmVncy0+X3NzKTsKKworICAgIGdldF9zZWcoJmVudi0+dHIsICZzcmVncy0+X3RyKTsKKyAgICBnZXRfc2VnKCZlbnYtPmxkdCwgJnNyZWdzLT5fbGR0KTsKKyAgICBlbnYtPmlkdC5saW1pdCA9IHNyZWdzLT5faWR0LmxpbWl0OworICAgIGVudi0+aWR0LmJhc2UgPSBzcmVncy0+X2lkdC5iYXNlOworICAgIGVudi0+Z2R0LmxpbWl0ID0gc3JlZ3MtPl9nZHQubGltaXQ7CisgICAgZW52LT5nZHQuYmFzZSA9IHNyZWdzLT5fZ2R0LmJhc2U7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGF4X3NldF9zZWdtZW50cyhDUFVYODZTdGF0ZSAqZW52LCBzdHJ1Y3QgdmNwdV9zdGF0ZV90ICpzcmVncykKK3sKKyAgICBpZiAoKGVudi0+ZWZsYWdzICYgVk1fTUFTSykpIHsKKyAgICAgICAgc2V0X3Y4MDg2X3NlZygmc3JlZ3MtPl9jcywgJmVudi0+c2Vnc1tSX0NTXSk7CisgICAgICAgIHNldF92ODA4Nl9zZWcoJnNyZWdzLT5fZHMsICZlbnYtPnNlZ3NbUl9EU10pOworICAgICAgICBzZXRfdjgwODZfc2VnKCZzcmVncy0+X2VzLCAmZW52LT5zZWdzW1JfRVNdKTsKKyAgICAgICAgc2V0X3Y4MDg2X3NlZygmc3JlZ3MtPl9mcywgJmVudi0+c2Vnc1tSX0ZTXSk7CisgICAgICAgIHNldF92ODA4Nl9zZWcoJnNyZWdzLT5fZ3MsICZlbnYtPnNlZ3NbUl9HU10pOworICAgICAgICBzZXRfdjgwODZfc2VnKCZzcmVncy0+X3NzLCAmZW52LT5zZWdzW1JfU1NdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRfc2VnKCZzcmVncy0+X2NzLCAmZW52LT5zZWdzW1JfQ1NdKTsKKyAgICAgICAgc2V0X3NlZygmc3JlZ3MtPl9kcywgJmVudi0+c2Vnc1tSX0RTXSk7CisgICAgICAgIHNldF9zZWcoJnNyZWdzLT5fZXMsICZlbnYtPnNlZ3NbUl9FU10pOworICAgICAgICBzZXRfc2VnKCZzcmVncy0+X2ZzLCAmZW52LT5zZWdzW1JfRlNdKTsKKyAgICAgICAgc2V0X3NlZygmc3JlZ3MtPl9ncywgJmVudi0+c2Vnc1tSX0dTXSk7CisgICAgICAgIHNldF9zZWcoJnNyZWdzLT5fc3MsICZlbnYtPnNlZ3NbUl9TU10pOworCisgICAgICAgIGlmIChlbnYtPmNyWzBdICYgQ1IwX1BFX01BU0spIHsKKyAgICAgICAgICAgIC8qIGZvcmNlIHNzIGNwbCB0byBjcyBjcGwgKi8KKyAgICAgICAgICAgIHNyZWdzLT5fc3Muc2VsZWN0b3IgPSAoc3JlZ3MtPl9zcy5zZWxlY3RvciAmIH4zKSB8CisgICAgICAgICAgICAgIChzcmVncy0+X2NzLnNlbGVjdG9yICYgMyk7CisgICAgICAgICAgICBzcmVncy0+X3NzLmRwbCA9IHNyZWdzLT5fc3Muc2VsZWN0b3IgJiAzOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0X3NlZygmc3JlZ3MtPl90ciwgJmVudi0+dHIpOworICAgIHNldF9zZWcoJnNyZWdzLT5fbGR0LCAmZW52LT5sZHQpOworICAgIHNyZWdzLT5faWR0LmxpbWl0ID0gZW52LT5pZHQubGltaXQ7CisgICAgc3JlZ3MtPl9pZHQuYmFzZSA9IGVudi0+aWR0LmJhc2U7CisgICAgc3JlZ3MtPl9nZHQubGltaXQgPSBlbnYtPmdkdC5saW1pdDsKKyAgICBzcmVncy0+X2dkdC5iYXNlID0gZW52LT5nZHQuYmFzZTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEFmdGVyIGdldCB0aGUgc3RhdGUgZnJvbSB0aGUga2VybmVsIG1vZHVsZSwgc29tZQorICogcWVtdSBlbXVsYXRvciBzdGF0ZSBuZWVkIGJlIHVwZGF0ZWQgYWxzbworICovCitzdGF0aWMgaW50IGhheF9zZXR1cF9xZW11X2VtdWxhdG9yKENQVVg4NlN0YXRlICplbnYpCit7CisKKyNkZWZpbmUgSEZMQUdfQ09QWV9NQVNLIH4oIFwKKyAgSEZfQ1BMX01BU0sgfCBIRl9QRV9NQVNLIHwgSEZfTVBfTUFTSyB8IEhGX0VNX01BU0sgfCBcCisgIEhGX1RTX01BU0sgfCBIRl9URl9NQVNLIHwgSEZfVk1fTUFTSyB8IEhGX0lPUExfTUFTSyB8IFwKKyAgSEZfT1NGWFNSX01BU0sgfCBIRl9MTUFfTUFTSyB8IEhGX0NTMzJfTUFTSyB8IFwKKyAgSEZfU1MzMl9NQVNLIHwgSEZfQ1M2NF9NQVNLIHwgSEZfQUREU0VHX01BU0spCisKKyAgICB1aW50MzJfdCBoZmxhZ3M7CisKKyAgICBoZmxhZ3MgPSAoZW52LT5zZWdzW1JfQ1NdLmZsYWdzID4+IERFU0NfRFBMX1NISUZUKSAmIEhGX0NQTF9NQVNLOworICAgIGhmbGFncyB8PSAoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSA8PCAoSEZfUEVfU0hJRlQgLSBDUjBfUEVfU0hJRlQpOworICAgIGhmbGFncyB8PSAoZW52LT5jclswXSA8PCAoSEZfTVBfU0hJRlQgLSBDUjBfTVBfU0hJRlQpKSAmCisgICAgICAoSEZfTVBfTUFTSyB8IEhGX0VNX01BU0sgfCBIRl9UU19NQVNLKTsKKyAgICBoZmxhZ3MgfD0gKGVudi0+ZWZsYWdzICYgKEhGX1RGX01BU0sgfCBIRl9WTV9NQVNLIHwgSEZfSU9QTF9NQVNLKSk7CisgICAgaGZsYWdzIHw9IChlbnYtPmNyWzRdICYgQ1I0X09TRlhTUl9NQVNLKSA8PAorICAgICAgKEhGX09TRlhTUl9TSElGVCAtIENSNF9PU0ZYU1JfU0hJRlQpOworCisgICAgaWYgKGVudi0+ZWZlciAmIE1TUl9FRkVSX0xNQSkgeworICAgICAgICBoZmxhZ3MgfD0gSEZfTE1BX01BU0s7CisgICAgfQorCisgICAgaWYgKChoZmxhZ3MgJiBIRl9MTUFfTUFTSykgJiYgKGVudi0+c2Vnc1tSX0NTXS5mbGFncyAmIERFU0NfTF9NQVNLKSkgeworICAgICAgICBoZmxhZ3MgfD0gSEZfQ1MzMl9NQVNLIHwgSEZfU1MzMl9NQVNLIHwgSEZfQ1M2NF9NQVNLOworICAgIH0gZWxzZSB7CisgICAgICAgIGhmbGFncyB8PSAoZW52LT5zZWdzW1JfQ1NdLmZsYWdzICYgREVTQ19CX01BU0spID4+CisgICAgICAgICAgKERFU0NfQl9TSElGVCAtIEhGX0NTMzJfU0hJRlQpOworICAgICAgICBoZmxhZ3MgfD0gKGVudi0+c2Vnc1tSX1NTXS5mbGFncyAmIERFU0NfQl9NQVNLKSA+PgorICAgICAgICAgIChERVNDX0JfU0hJRlQgLSBIRl9TUzMyX1NISUZUKTsKKyAgICAgICAgaWYgKCEoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSB8fAorICAgICAgICAgIChlbnYtPmVmbGFncyAmIFZNX01BU0spIHx8CisgICAgICAgICAgIShoZmxhZ3MgJiBIRl9DUzMyX01BU0spKSB7CisgICAgICAgICAgICBoZmxhZ3MgfD0gSEZfQUREU0VHX01BU0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZmxhZ3MgfD0gKChlbnYtPnNlZ3NbUl9EU10uYmFzZSB8CisgICAgICAgICAgICAgICAgICBlbnYtPnNlZ3NbUl9FU10uYmFzZSB8CisgICAgICAgICAgICAgICAgICBlbnYtPnNlZ3NbUl9TU10uYmFzZSkgIT0gMCkgPDwKKyAgICAgICAgICAgICAgSEZfQUREU0VHX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIGVudi0+aGZsYWdzID0gKGVudi0+aGZsYWdzICYgSEZMQUdfQ09QWV9NQVNLKSB8IGhmbGFnczsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXhfc3luY192Y3B1X3JlZ2lzdGVyKENQVVg4NlN0YXRlICplbnYsIGludCBzZXQpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisgICAgc3RydWN0IHZjcHVfc3RhdGVfdCByZWdzOworICAgIGludCByZXQ7CisgICAgbWVtc2V0KCZyZWdzLCAwLCBzaXplb2Yoc3RydWN0IHZjcHVfc3RhdGVfdCkpOworCisgICAgaWYgKCFzZXQpCisgICAgeworICAgICAgICByZXQgPSBoYXhfc3luY192Y3B1X3N0YXRlKGNwdSwgJnJlZ3MsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKmdlbmVyaWMgcmVnaXN0ZXIgKi8KKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmF4LCAmZW52LT5yZWdzW1JfRUFYXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmJ4LCAmZW52LT5yZWdzW1JfRUJYXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmN4LCAmZW52LT5yZWdzW1JfRUNYXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmR4LCAmZW52LT5yZWdzW1JfRURYXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcnNpLCAmZW52LT5yZWdzW1JfRVNJXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmRpLCAmZW52LT5yZWdzW1JfRURJXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcnNwLCAmZW52LT5yZWdzW1JfRVNQXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmJwLCAmZW52LT5yZWdzW1JfRUJQXSwgc2V0KTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaGF4X2dldHB1dF9yZWcoJnJlZ3MuX3I4LCAmZW52LT5yZWdzWzhdLCBzZXQpOworICAgIGhheF9nZXRwdXRfcmVnKCZyZWdzLl9yOSwgJmVudi0+cmVnc1s5XSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjEwLCAmZW52LT5yZWdzWzEwXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjExLCAmZW52LT5yZWdzWzExXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjEyLCAmZW52LT5yZWdzWzEyXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjEzLCAmZW52LT5yZWdzWzEzXSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjE0LCAmZW52LT5yZWdzWzE0XSwgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcjE1LCAmZW52LT5yZWdzWzE1XSwgc2V0KTsKKyNlbmRpZgorICAgIGhheF9nZXRwdXRfcmVnKCZyZWdzLl9yZmxhZ3MsICZlbnYtPmVmbGFncywgc2V0KTsKKyAgICBoYXhfZ2V0cHV0X3JlZygmcmVncy5fcmlwLCAmZW52LT5laXAsIHNldCk7CisKKyAgICBpZiAoc2V0KQorICAgIHsKKworICAgICAgICByZWdzLl9jcjAgPSBlbnYtPmNyWzBdOworICAgICAgICByZWdzLl9jcjIgPSBlbnYtPmNyWzJdOworICAgICAgICByZWdzLl9jcjMgPSBlbnYtPmNyWzNdOworICAgICAgICByZWdzLl9jcjQgPSBlbnYtPmNyWzRdOworICAgICAgICBoYXhfc2V0X3NlZ21lbnRzKGVudiwgJnJlZ3MpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBlbnYtPmNyWzBdID0gcmVncy5fY3IwOworICAgICAgICBlbnYtPmNyWzJdID0gcmVncy5fY3IyOworICAgICAgICBlbnYtPmNyWzNdID0gcmVncy5fY3IzOworICAgICAgICBlbnYtPmNyWzRdID0gcmVncy5fY3I0OworICAgICAgICBoYXhfZ2V0X3NlZ21lbnRzKGVudiwgJnJlZ3MpOworICAgIH0KKworICAgIGlmIChzZXQpCisgICAgeworICAgICAgICByZXQgPSBoYXhfc3luY192Y3B1X3N0YXRlKGNwdSwgJnJlZ3MsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFzZXQpCisgICAgICAgIGhheF9zZXR1cF9xZW11X2VtdWxhdG9yKGVudik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhheF9tc3JfZW50cnlfc2V0KHN0cnVjdCB2bXhfbXNyICppdGVtLAorICB1aW50MzJfdCBpbmRleCwgdWludDY0X3QgdmFsdWUpCit7CisgICAgaXRlbS0+ZW50cnkgPSBpbmRleDsKKyAgICBpdGVtLT52YWx1ZSA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IGhheF9nZXRfbXNycyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHN0cnVjdCBoYXhfbXNyX2RhdGEgbWQ7CisgICAgc3RydWN0IHZteF9tc3IgKm1zcnMgPSBtZC5lbnRyaWVzOworICAgIGludCByZXQsIGksIG47CisKKyAgICBuID0gMDsKKyAgICBtc3JzW24rK10uZW50cnkgPSBNU1JfSUEzMl9TWVNFTlRFUl9DUzsKKyAgICBtc3JzW24rK10uZW50cnkgPSBNU1JfSUEzMl9TWVNFTlRFUl9FU1A7CisgICAgbXNyc1tuKytdLmVudHJ5ID0gTVNSX0lBMzJfU1lTRU5URVJfRUlQOworICAgIG1zcnNbbisrXS5lbnRyeSA9IE1TUl9JQTMyX1RTQzsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgbXNyc1tuKytdLmVudHJ5ID0gTVNSX1NUQVI7CisgICAgbXNyc1tuKytdLmVudHJ5ID0gTVNSX0xTVEFSOworICAgIG1zcnNbbisrXS5lbnRyeSA9IE1TUl9DU1RBUjsKKyAgICBtc3JzW24rK10uZW50cnkgPSBNU1JfRk1BU0s7CisgICAgbXNyc1tuKytdLmVudHJ5ID0gTVNSX0tFUk5FTEdTQkFTRTsKKyNlbmRpZgorCisgICAgbWQubnJfbXNyID0gbjsKKyAgICByZXQgPSBoYXhfc3luY19tc3IoRU5WX0dFVF9DUFUoZW52KSwgJm1kLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtZC5kb25lOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtc3JzW2ldLmVudHJ5KSB7CisgICAgICAgICAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorICAgICAgICAgICAgICAgIGVudi0+c3lzZW50ZXJfY3MgPSBtc3JzW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FU1A6CisgICAgICAgICAgICAgICAgZW52LT5zeXNlbnRlcl9lc3AgPSBtc3JzW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FSVA6CisgICAgICAgICAgICAgICAgZW52LT5zeXNlbnRlcl9laXAgPSBtc3JzW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNU1JfSUEzMl9UU0M6CisgICAgICAgICAgICAgICAgZW52LT50c2MgPSBtc3JzW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgIGNhc2UgTVNSX1NUQVI6CisgICAgICAgICAgICAgICAgZW52LT5zdGFyID0gbXNyc1tpXS52YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVNSX0xTVEFSOgorICAgICAgICAgICAgICAgIGVudi0+bHN0YXIgPSBtc3JzW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNU1JfQ1NUQVI6CisgICAgICAgICAgICAgICAgZW52LT5jc3RhciA9IG1zcnNbaV0udmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1TUl9GTUFTSzoKKyAgICAgICAgICAgICAgICBlbnYtPmZtYXNrID0gbXNyc1tpXS52YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVNSX0tFUk5FTEdTQkFTRToKKyAgICAgICAgICAgICAgICBlbnYtPmtlcm5lbGdzYmFzZSA9IG1zcnNbaV0udmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhheF9zZXRfbXNycyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHN0cnVjdCBoYXhfbXNyX2RhdGEgbWQ7CisgICAgc3RydWN0IHZteF9tc3IgKm1zcnM7CisgICAgbXNycyA9IG1kLmVudHJpZXM7CisgICAgaW50IG4gPSAwOworCisgICAgbWVtc2V0KCZtZCwgMCwgc2l6ZW9mKHN0cnVjdCBoYXhfbXNyX2RhdGEpKTsKKyAgICBoYXhfbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfSUEzMl9TWVNFTlRFUl9DUywgZW52LT5zeXNlbnRlcl9jcyk7CisgICAgaGF4X21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0lBMzJfU1lTRU5URVJfRVNQLCBlbnYtPnN5c2VudGVyX2VzcCk7CisgICAgaGF4X21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0lBMzJfU1lTRU5URVJfRUlQLCBlbnYtPnN5c2VudGVyX2VpcCk7CisgICAgaGF4X21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0lBMzJfVFNDLCBlbnYtPnRzYyk7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGhheF9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9FRkVSLCBlbnYtPmVmZXIpOworICAgIGhheF9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9TVEFSLCBlbnYtPnN0YXIpOworICAgIGhheF9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9MU1RBUiwgZW52LT5sc3Rhcik7CisgICAgaGF4X21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0NTVEFSLCBlbnYtPmNzdGFyKTsKKyAgICBoYXhfbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfRk1BU0ssIGVudi0+Zm1hc2spOworICAgIGhheF9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9LRVJORUxHU0JBU0UsIGVudi0+a2VybmVsZ3NiYXNlKTsKKyNlbmRpZgorCisgICAgbWQubnJfbXNyID0gbjsKKyAgICBtZC5kb25lID0gMDsKKworICAgIHJldHVybiBoYXhfc3luY19tc3IoRU5WX0dFVF9DUFUoZW52KSwgJm1kLCAxKTsKKworfQorCitzdGF0aWMgaW50IGhheF9nZXRfZnB1KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgc3RydWN0IGZ4X2xheW91dCBmcHU7CisgICAgaW50IGksIHJldDsKKworICAgIHJldCA9IGhheF9zeW5jX2ZwdShFTlZfR0VUX0NQVShlbnYpLCAmZnB1LCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGVudi0+ZnBzdHQgPSAoZnB1LmZzdyA+PiAxMSkgJiA3OworICAgIGVudi0+ZnB1cyA9IGZwdS5mc3c7CisgICAgZW52LT5mcHVjID0gZnB1LmZjdzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICBlbnYtPmZwdGFnc1tpXSA9ICEoKGZwdS5mdHcgPj4gaSkgJiAxKTsKKyAgICBtZW1jcHkoZW52LT5mcHJlZ3MsIGZwdS5zdF9tbSwgc2l6ZW9mKGVudi0+ZnByZWdzKSk7CisKKyAgICBtZW1jcHkoZW52LT54bW1fcmVncywgZnB1Lm1teF8xLCBzaXplb2YoZnB1Lm1teF8xKSk7CisgICAgbWVtY3B5KChYTU1SZWcgKikoZW52LT54bW1fcmVncykgKyA4LCBmcHUubW14XzIsIHNpemVvZihmcHUubW14XzIpKTsKKyAgICBlbnYtPm14Y3NyID0gZnB1Lm14Y3NyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGF4X3NldF9mcHUoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBzdHJ1Y3QgZnhfbGF5b3V0IGZwdTsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldCgmZnB1LCAwLCBzaXplb2YoZnB1KSk7CisgICAgZnB1LmZzdyA9IGVudi0+ZnB1cyAmIH4oNyA8PCAxMSk7CisgICAgZnB1LmZzdyB8PSAoZW52LT5mcHN0dCAmIDcpIDw8IDExOworICAgIGZwdS5mY3cgPSBlbnYtPmZwdWM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICBmcHUuZnR3IHw9ICghZW52LT5mcHRhZ3NbaV0pIDw8IGk7CisKKyAgICBtZW1jcHkoZnB1LnN0X21tLCBlbnYtPmZwcmVncywgc2l6ZW9mIChlbnYtPmZwcmVncykpOworICAgIG1lbWNweShmcHUubW14XzEsIGVudi0+eG1tX3JlZ3MsIHNpemVvZiAoZnB1Lm1teF8xKSk7CisgICAgbWVtY3B5KGZwdS5tbXhfMiwgKFhNTVJlZyAqKShlbnYtPnhtbV9yZWdzKSArIDgsIHNpemVvZiAoZnB1Lm1teF8yKSk7CisKKyAgICBmcHUubXhjc3IgPSBlbnYtPm14Y3NyOworCisgICAgcmV0dXJuIGhheF9zeW5jX2ZwdShFTlZfR0VUX0NQVShlbnYpLCAmZnB1LCAxKTsKK30KKworaW50IGhheF9hcmNoX2dldF9yZWdpc3RlcnMoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBoYXhfc3luY192Y3B1X3JlZ2lzdGVyKGVudiwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBoYXhfZ2V0X2ZwdShlbnYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gaGF4X2dldF9tc3JzKGVudik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXhfYXJjaF9zZXRfcmVnaXN0ZXJzKENQVVN0YXRlICpjcHUpCit7CisgICAgaW50IHJldDsKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIHJldCA9IGhheF9zeW5jX3ZjcHVfcmVnaXN0ZXIoZW52LCAxKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gc3luYyB2Y3B1IHJlZ1xuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IGhheF9zZXRfZnB1KGVudik7CisgICAgaWYgKHJldCA8IDApCisgICAgeworICAgICAgICBkcHJpbnQoIkZQVSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXQgPSBoYXhfc2V0X21zcnMoZW52KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICAgIGRwcmludCgiTVNSIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGF4X3ZjcHVfc3luY19zdGF0ZShDUFVTdGF0ZSAqY3B1LCBpbnQgbW9kaWZpZWQpCit7CisgICAgaWYgKGhheF9lbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVkKQorICAgICAgICAgICAgaGF4X2FyY2hfc2V0X3JlZ2lzdGVycyhjcHUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoYXhfYXJjaF9nZXRfcmVnaXN0ZXJzKGNwdSk7CisgICAgfQorfQorCisvKgorICogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdGhlIG9uZSBmb3IgS1ZNIGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydAorICogZGlyZWN0IEkvTyBkZXZpY2UgYXNzaWdubWVudCBhdCB0aGlzIHBvaW50LgorICovCitpbnQgaGF4X3N5bmNfdmNwdXModm9pZCkKK3sKKyAgICBpZiAoaGF4X2VuYWJsZWQoKSkgeworICAgICAgICBDUFVTdGF0ZSAqY3B1OworCisgICAgICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICAgICAgaW50IHJldCA9IGhheF9hcmNoX3NldF9yZWdpc3RlcnMoY3B1KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZGVycm9yKGtIYXhWY3B1U3luY0ZhaWxlZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGhheF9yZXNldF92Y3B1X3N0YXRlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDUFVTdGF0ZSAqY3B1OworICAgIENQVV9GT1JFQUNIKGNwdSkgeworICAgICAgICBpZiAoY3B1LT5oYXhfdmNwdSkgeworICAgICAgICAgICAgY3B1LT5oYXhfdmNwdS0+ZW11bGF0aW9uX3N0YXRlICA9IEhBWF9FTVVMQVRFX1NUQVRFX0lOSVRJQUw7CisgICAgICAgICAgICBjcHUtPmhheF92Y3B1LT50dW5uZWwtPnVzZXJfZXZlbnRfcGVuZGluZyA9IDA7CisgICAgICAgICAgICBjcHUtPmhheF92Y3B1LT50dW5uZWwtPnJlYWR5X2Zvcl9pbnRlcnJ1cHRfaW5qZWN0aW9uID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LWRhcndpbi5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtZGFyd2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhYjFkYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LWRhcndpbi5jCkBAIC0wLDAgKzEsMzI3IEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbgorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvKiBIQVggbW9kdWxlIGludGVyZmFjZSAtIGRhcndpbiB2ZXJzaW9uICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisKKyNpbmNsdWRlICJleGVjL3JhbV9hZGRyLmgiCisjaW5jbHVkZSAidGFyZ2V0LWkzODYvaGF4LWkzODYuaCIKKworaGF4X2ZkIGhheF9tb2Rfb3Blbih2b2lkKQoreworICAgIGludCBmZCA9IG9wZW4oIi9kZXYvSEFYIiwgT19SRFdSKTsKKworICAgIGlmIChmZCA9PSAtMSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIG9wZW4gdGhlIGhheCBtb2R1bGVcbiIpOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKworICAgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgICByZXR1cm4gZmQ7Cit9CisKK2ludCBoYXhfcG9wdWxhdGVfcmFtKHVpbnQ2NF90IHZhLCB1aW50MzJfdCBzaXplKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IGhheF9hbGxvY19yYW1faW5mbyBpbmZvOworCisgICAgaWYgKCFoYXhfZ2xvYmFsLnZtIHx8ICFoYXhfZ2xvYmFsLnZtLT5mZCkKKyAgICB7CisgICAgICAgIGRwcmludCgiQWxsb2NhdGUgbWVtb3J5IGJlZm9yZSB2bSBjcmVhdGU/XG4iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaW5mby5zaXplID0gc2l6ZTsKKyAgICBpbmZvLnZhID0gdmE7CisgICAgcmV0ID0gaW9jdGwoaGF4X2dsb2JhbC52bS0+ZmQsIEhBWF9WTV9JT0NUTF9BTExPQ19SQU0sICZpbmZvKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGFsbG9jYXRlICV4IG1lbW9yeVxuIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X3NldF9waHlzX21lbShod2FkZHIgc3RhcnRfYWRkciwgcmFtX2FkZHJfdCBzaXplLCByYW1fYWRkcl90IHBoeXNfb2Zmc2V0KQoreworICAgIHN0cnVjdCBoYXhfc2V0X3JhbV9pbmZvIGluZm8sICpwaW5mbyA9ICZpbmZvOworICAgIGludCByZXQ7CisgICAgcmFtX2FkZHJfdCBmbGFncyA9IHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0s7CisKKyAgICAvKiBXZSBsb29rIGZvciB0aGUgIFJBTSBhbmQgUk9NIG9ubHkgKi8KKyAgICBpZiAoZmxhZ3MgPj0gSU9fTUVNX1VOQVNTSUdORUQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAoc3RhcnRfYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIH5UQVJHRVRfUEFHRV9NQVNLKSkKKyAgICB7CisgICAgICAgIGRwcmludCgic2V0X3BoeXNfbWVtICV4ICVseCByZXF1aXJlcyBwYWdlIGFsaWduZWQgYWRkciBhbmQgc2l6ZVxuIiwgc3RhcnRfYWRkciwgc2l6ZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpbmZvLnBhX3N0YXJ0ID0gc3RhcnRfYWRkcjsKKyAgICBpbmZvLnNpemUgPSBzaXplOworICAgIGluZm8udmEgPSAodWludDY0X3QpKHVpbnRwdHJfdClxZW11X2dldF9yYW1fcHRyKHBoeXNfb2Zmc2V0KTsKKyAgICBpbmZvLmZsYWdzID0gKGZsYWdzICYgSU9fTUVNX1JPTSkgPyAxIDogMDsKKworICAgIHJldCA9IGlvY3RsKGhheF9nbG9iYWwudm0tPmZkLCBIQVhfVk1fSU9DVExfU0VUX1JBTSwgcGluZm8pOworICAgIGlmIChyZXQgPCAwKQorICAgIHsKKyAgICAgICAgZHByaW50KCJoYXMgc2V0IHBoeXMgbWVtIGZhaWxlZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBoYXhfY2FwYWJpbGl0eShzdHJ1Y3QgaGF4X3N0YXRlICpoYXgsIHN0cnVjdCBoYXhfY2FwYWJpbGl0eWluZm8gKmNhcCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoaGF4LT5mZCwgSEFYX0lPQ1RMX0NBUEFCSUxJVFksIGNhcCk7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGdldCBIQVggY2FwYWJpbGl0eVxuIik7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfbW9kX3ZlcnNpb24oc3RydWN0IGhheF9zdGF0ZSAqaGF4LCBzdHJ1Y3QgaGF4X21vZHVsZV92ZXJzaW9uICp2ZXJzaW9uKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBpb2N0bChoYXgtPmZkLCBIQVhfSU9DVExfVkVSU0lPTiwgdmVyc2lvbik7CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGdldCBIQVggdmVyc2lvblxuIik7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpoYXhfdm1fZGV2ZnNfc3RyaW5nKGludCB2bV9pZCkKK3sKKyAgICBjaGFyICpuYW1lOworCisgICAgaWYgKHZtX2lkID4gTUFYX1ZNX0lEKQorICAgIHsKKyAgICAgICAgZHByaW50KCJUb28gYmlnIFZNIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbmFtZSA9IGdfc3RyZHVwKCIvZGV2L2hheF92bS92bXh4Iik7CisgICAgaWYgKCFuYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcHJpbnRmKG5hbWUsICIvZGV2L2hheF92bS92bSUwMmQiLCB2bV9pZCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNoYXIgKmhheF92Y3B1X2RldmZzX3N0cmluZyhpbnQgdm1faWQsIGludCB2Y3B1X2lkKQoreworICAgIGNoYXIgKm5hbWU7CisKKyAgICBpZiAodm1faWQgPiBNQVhfVk1fSUQgfHwgdmNwdV9pZCA+IE1BWF9WQ1BVX0lEKQorICAgIHsKKyAgICAgICAgZHByaW50KCJUb28gYmlnIHZtIGlkICV4IG9yIHZjcHUgaWQgJXhcbiIsIHZtX2lkLCB2Y3B1X2lkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbmFtZSA9IGdfc3RyZHVwKCIvZGV2L2hheF92bXh4L3ZjcHV5eSIpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzcHJpbnRmKG5hbWUsICIvZGV2L2hheF92bSUwMmQvdmNwdSUwMmQiLCB2bV9pZCwgdmNwdV9pZCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworaW50IGhheF9ob3N0X2NyZWF0ZV92bShzdHJ1Y3QgaGF4X3N0YXRlICpoYXgsIGludCAqdm1pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCB2bV9pZCA9IDA7CisKKyAgICBpZiAoaGF4X2ludmFsaWRfZmQoaGF4LT5mZCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGhheC0+dm0pCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gaW9jdGwoaGF4LT5mZCwgSEFYX0lPQ1RMX0NSRUFURV9WTSwgJnZtX2lkKTsKKyAgICAqdm1pZCA9IHZtX2lkOworICAgIHJldHVybiByZXQ7Cit9CisKK2hheF9mZCBoYXhfaG9zdF9vcGVuX3ZtKHN0cnVjdCBoYXhfc3RhdGUgKmhheCwgaW50IHZtX2lkKQoreworICAgIGhheF9mZCBmZDsKKyAgICBjaGFyICp2bV9uYW1lID0gTlVMTDsKKworICAgIHZtX25hbWUgPSBoYXhfdm1fZGV2ZnNfc3RyaW5nKHZtX2lkKTsKKyAgICBpZiAoIXZtX25hbWUpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZkID0gb3Blbih2bV9uYW1lLCBPX1JEV1IpOworICAgIGdfZnJlZSh2bV9uYW1lKTsKKyAgICBmY250bChmZCwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7CisKKyAgICByZXR1cm4gZmQ7Cit9CisKK2ludCBoYXhfbm90aWZ5X3FlbXVfdmVyc2lvbihoYXhfZmQgdm1fZmQsIHN0cnVjdCBoYXhfcWVtdV92ZXJzaW9uICpxdmVyc2lvbikKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKHZtX2ZkKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXQgPSBpb2N0bCh2bV9mZCwgSEFYX1ZNX0lPQ1RMX05PVElGWV9RRU1VX1ZFUlNJT04sIHF2ZXJzaW9uKTsKKyAgICBpZiAocmV0ID09IC0xKQorICAgIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gbm90aWZ5IHFlbXUgQVBJIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogU2ltcGx5IGFzc3VtZSB0aGF0IHRoZSBzaXplIHNob3VsZCBiZSBiaWdnZXIgdGhhbiB0aGUgaGF4X3R1bm5lbCwKKyAqIHNpbmNlIHRoZSBoYXhfdHVubmVsIGNhbiBiZSBleHRlbmRlZCBsYXRlciB3aXRoIGJhY2t3YXJkCisgKiBjb21wYXRpYmlsaXR5LgorICovCitpbnQgaGF4X2hvc3RfY3JlYXRlX3ZjcHUoaGF4X2ZkIHZtX2ZkLCBpbnQgdmNwdWlkKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBpb2N0bCh2bV9mZCwgSEFYX1ZNX0lPQ1RMX1ZDUFVfQ1JFQVRFLCAmdmNwdWlkKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gY3JlYXRlIHZjcHUgJXhcbiIsIHZjcHVpZCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitoYXhfZmQgaGF4X2hvc3Rfb3Blbl92Y3B1KGludCB2bWlkLCBpbnQgdmNwdWlkKQoreworICAgIGNoYXIgKmRldmZzX3BhdGggPSBOVUxMOworICAgIGhheF9mZCBmZDsKKworICAgIGRldmZzX3BhdGggPSBoYXhfdmNwdV9kZXZmc19zdHJpbmcodm1pZCwgdmNwdWlkKTsKKyAgICBpZiAoIWRldmZzX3BhdGgpCisgICAgeworICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBnZXQgdGhlIGRldmZzXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgZmQgPSBvcGVuKGRldmZzX3BhdGgsIE9fUkRXUik7CisgICAgZ19mcmVlKGRldmZzX3BhdGgpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIG9wZW4gdGhlIHZjcHUgZGV2ZnNcbiIpOworICAgIGZjbnRsKGZkLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKyAgICByZXR1cm4gZmQ7Cit9CisKK2ludCBoYXhfaG9zdF9zZXR1cF92Y3B1X2NoYW5uZWwoc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1KQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IGhheF90dW5uZWxfaW5mbyBpbmZvOworCisgICAgcmV0ID0gaW9jdGwodmNwdS0+ZmQsIEhBWF9WQ1BVX0lPQ1RMX1NFVFVQX1RVTk5FTCwgJmluZm8pOworICAgIGlmIChyZXQpCisgICAgeworICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBzZXR1cCB0aGUgaGF4IHR1bm5lbFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCF2YWxpZF9oYXhfdHVubmVsX3NpemUoaW5mby5zaXplKSkKKyAgICB7CisgICAgICAgIGRwcmludCgiSW52YWxpZCBoYXggdHVubmVsIHNpemUgJXhcbiIsIGluZm8uc2l6ZSk7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgdmNwdS0+dHVubmVsID0gKHN0cnVjdCBoYXhfdHVubmVsICopKHVpbnRwdHJfdCkoaW5mby52YSk7CisgICAgdmNwdS0+aW9idWYgPSAodW5zaWduZWQgY2hhciAqKSh1aW50cHRyX3QpKGluZm8uaW9fdmEpOworICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X3ZjcHVfcnVuKHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSogdmNwdSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwodmNwdS0+ZmQsIEhBWF9WQ1BVX0lPQ1RMX1JVTiwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGhheF9zeW5jX2ZwdShDUFVTdGF0ZSAqY3B1LCBzdHJ1Y3QgZnhfbGF5b3V0ICpmbCwgaW50IHNldCkKK3sKKyAgICBpbnQgcmV0LCBmZDsKKworICAgIGZkID0gaGF4X3ZjcHVfZ2V0X2ZkKGNwdSk7CisgICAgaWYgKGZkIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChzZXQpCisgICAgICAgIHJldCA9IGlvY3RsKGZkLCBIQVhfVkNQVV9JT0NUTF9TRVRfRlBVLCBmbCk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBpb2N0bChmZCwgSEFYX1ZDUFVfSU9DVExfR0VUX0ZQVSwgZmwpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBoYXhfc3luY19tc3IoQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGhheF9tc3JfZGF0YSAqbXNycywgaW50IHNldCkKK3sKKyAgICBpbnQgcmV0LCBmZDsKKworICAgIGZkID0gaGF4X3ZjcHVfZ2V0X2ZkKGNwdSk7CisgICAgaWYgKGZkIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoc2V0KQorICAgICAgICByZXQgPSBpb2N0bChmZCwgSEFYX1ZDUFVfSU9DVExfU0VUX01TUlMsIG1zcnMpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gaW9jdGwoZmQsIEhBWF9WQ1BVX0lPQ1RMX0dFVF9NU1JTLCBtc3JzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgaGF4X3N5bmNfdmNwdV9zdGF0ZShDUFVTdGF0ZSAqY3B1LCBzdHJ1Y3QgdmNwdV9zdGF0ZV90ICpzdGF0ZSwgaW50IHNldCkKK3sKKyAgICBpbnQgcmV0LCBmZDsKKworICAgIGZkID0gaGF4X3ZjcHVfZ2V0X2ZkKGNwdSk7CisgICAgaWYgKGZkIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChzZXQpCisgICAgICAgIHJldCA9IGlvY3RsKGZkLCBIQVhfVkNQVV9TRVRfUkVHUywgc3RhdGUpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gaW9jdGwoZmQsIEhBWF9WQ1BVX0dFVF9SRUdTLCBzdGF0ZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGhheF9pbmplY3RfaW50ZXJydXB0KENQVVN0YXRlICpjcHUsIGludCB2ZWN0b3IpCit7CisgICAgaW50IHJldCwgZmQ7CisKKyAgICBmZCA9IGhheF92Y3B1X2dldF9mZChjcHUpOworICAgIGlmIChmZCA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXQgPSBpb2N0bChmZCwgSEFYX1ZDUFVfSU9DVExfSU5URVJSVVBULCAmdmVjdG9yKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtZGFyd2luLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hheC1kYXJ3aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWE5YjMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtZGFyd2luLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyoqIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24KKyoqCisqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisqKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorKiogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyoqCisqKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKworI2lmbmRlZiBfX0hBWF9VTklYX0gKKyNkZWZpbmUgX19IQVhfVU5JWF9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIEhBWF9JTlZBTElEX0ZEICAoLTEpCitzdGF0aWMgaW5saW5lIGludCBoYXhfaW52YWxpZF9mZChoYXhfZmQgZmQpCit7CisgICAgcmV0dXJuIGZkIDw9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXhfbW9kX2Nsb3NlKHN0cnVjdCBoYXhfc3RhdGUgKmhheCkKK3sKKyAgICBjbG9zZShoYXgtPmZkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhheF9jbG9zZV9mZChoYXhfZmQgZmQpCit7CisgICAgY2xvc2UoZmQpOworfQorCisvKiBIQVggbW9kZWwgbGV2ZWwgaW9jdGwgKi8KKy8qIEdldCBBUEkgdmVyc2lvbiB0aGUgSEFYIGRyaXZlciBzdXBwb3J0cyAqLworI2RlZmluZSBIQVhfSU9DVExfVkVSU0lPTiBfSU9XUigwLCAweDIwLCBzdHJ1Y3QgaGF4X21vZHVsZV92ZXJzaW9uKQorLyogQ3JlYXRlIFZNIGluc3RhbmNlIGFuZCByZXR1cm4gdGhlIHZtX2lkICovCisjZGVmaW5lIEhBWF9JT0NUTF9DUkVBVEVfVk0gX0lPV1IoMCwgMHgyMSwgaW50KQorLyogR2V0IEhBWE0gY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBIQVhfSU9DVExfQ0FQQUJJTElUWSBfSU9SKDAsIDB4MjMsIHN0cnVjdCBoYXhfY2FwYWJpbGl0eWluZm8pCisKKy8qIFBhc3MgZG93biBhIFZNX0lELCBjcmVhdGUgYSBWQ1BVIGluc3RhbmNlIGZvciBpdCAqLworI2RlZmluZSBIQVhfVk1fSU9DVExfVkNQVV9DUkVBVEUgICAgX0lPUigwLCAweDgwLCBpbnQpCisvKgorICogQWxsb2NhdGUgZ3Vlc3QgbWVtb3J5LCB0aGUgc3RlcCBvZiBhbGxvY2F0ZSBndWVzdCBtZW1vcnkgaXM6CisgKiAxLiBRRU1VIHdpbGwgYWxsb2NhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcyB0byBjb3ZlciB0aGUgZ3Vlc3QgbWVtb3J5IHJhbmdlcworICogMi4gUUVNVSBwYXNzaW5nIGRvd24gdGhlIHZpcnR1YWwgYWRkcmVzcyBhbmQgbGVuZ3RoIGluIHRoZQorICogICAgSEFYX1ZNX0lPQ1RMX0FMTE9DX1JBTSBpb2N0bCB0aHJvdWdoIGhheF9hbGxvY19yYW1faW5mbyBzdHJ1Y3R1cmUKKyAqIDMuIEhBWCBkcml2ZXIgcG9wdWxhdGUgcGh5c2ljYWwgbWVtb3J5IGZvciB0aGUgdmlydHVhbCBhZGRyZXNzIHJhbmdlLCBhbmQKKyAqICAgIGxvY2sgdGhlc2UgcGh5c2ljYWwgbWVtb3J5IGxvY2ssIHNvIHRoYXQgdGhleSB3aWxsIG5vdCBiZSBzd2FwcGVkIG91dAorICogNC4gSEFYIGRyaXZlciBtYXAgdGhlIHBvcHVsYXRlZCBwaHlzaWNhbCBtZW1vcnkgaW50byBrZXJuZWwgYWRkcmVzcyBzcGFjZQorICovCisjZGVmaW5lIEhBWF9WTV9JT0NUTF9BTExPQ19SQU0gX0lPV1IoMCwgMHg4MSwgc3RydWN0IGhheF9hbGxvY19yYW1faW5mbykKKy8qCisgKiBTZXR1cCB0cmFuc2xhdGlvbiBiZXR3ZWVuIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3MgYW5kIGhvc3QgcGh5c2ljYWwgYWRkcmVzcworICovCisjZGVmaW5lIEhBWF9WTV9JT0NUTF9TRVRfUkFNIF9JT1dSKDAsIDB4ODIsIHN0cnVjdCBoYXhfc2V0X3JhbV9pbmZvKQorCisvKgorICogUUVNVSBub3RpZnkgSEFYTSBkcml2ZXIgb2YgdGhlIEFQSSB2ZXJzaW9uIGN1cnJlbnRseSBpbiB1c2UsIHNvIHRoYXQKKyAqIEhBWE0gZHJpdmVyIHdpbGwgbm90IHByZXNlbnQgZmVhdHVyZXMgdGhhdCBwb3NzaWJseSBub3Qgc3VwcG9ydGVkCisgKiBieSBRRU1VCisgKi8KKyNkZWZpbmUgSEFYX1ZNX0lPQ1RMX05PVElGWV9RRU1VX1ZFUlNJT04gICBfSU9XKDAsIDB4ODQsIHN0cnVjdCBoYXhfcWVtdV92ZXJzaW9uKQorCisvKiBSdW4gdGhlIGd1ZXN0IGluIG5vbi1yb290IG1vZGUgKi8KKyNkZWZpbmUgSEFYX1ZDUFVfSU9DVExfUlVOICBfSU8oMCwgMHhjMCkKKy8qIFN5bmMgUUVNVSdzIGd1ZXN0IE1TUiB2YWx1ZSB0byBIQVggZHJpdmVyICovCisjZGVmaW5lIEhBWF9WQ1BVX0lPQ1RMX1NFVF9NU1JTIF9JT1dSKDAsIDB4YzEsIHN0cnVjdCBoYXhfbXNyX2RhdGEpCisvKiBTeW5jIEhBWCBkcml2ZXIncyBndWVzdCBNU1IgdmFsdWUgdG8gUUVNVSAqLworI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9HRVRfTVNSUyBfSU9XUigwLCAweGMyLCBzdHJ1Y3QgaGF4X21zcl9kYXRhKQorI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9TRVRfRlBVICBfSU9XKDAsIDB4YzMsIHN0cnVjdCBmeF9sYXlvdXQpCisjZGVmaW5lIEhBWF9WQ1BVX0lPQ1RMX0dFVF9GUFUgIF9JT1IoMCwgMHhjNCwgc3RydWN0IGZ4X2xheW91dCkKKworLyogU2V0dXAgSEFYIHR1bm5lbCwgc2VlIHN0cnVjdHVyZSBoYXhfdHVubmVsIGNvbW1lbnRzIGluIGhheC1pbnRlcmZhY2UuaCAqLworI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9TRVRVUF9UVU5ORUwgX0lPV1IoMCwgMHhjNSwgc3RydWN0IGhheF90dW5uZWxfaW5mbykKKy8qIEEgaW50ZXJydXB0IG5lZWQgdG8gYmUgaW5qZWN0ZWQgaW50byBndWVzdCAqLworI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9JTlRFUlJVUFQgX0lPV1IoMCwgMHhjNiwgdWludDMyX3QpCisjZGVmaW5lIEhBWF9WQ1BVX1NFVF9SRUdTICAgICAgIF9JT1dSKDAsIDB4YzcsIHN0cnVjdCB2Y3B1X3N0YXRlX3QpCisjZGVmaW5lIEhBWF9WQ1BVX0dFVF9SRUdTICAgICAgIF9JT1dSKDAsIDB4YzgsIHN0cnVjdCB2Y3B1X3N0YXRlX3QpCisKKyNlbmRpZiAvKiBfX0hBWF9VTklYX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LWkzODYuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LWkzODYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVhZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtaTM4Ni5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpZm5kZWYgX0hBWF9JMzg2X0gKKyNkZWZpbmUgX0hBWF9JMzg2X0gKKworI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZGVidWcuaCIKKyNpbmNsdWRlICJleGVjL2hheC5oIgorCisjaWZkZWYgQ09ORklHX0RBUldJTgordHlwZWRlZiBpbnQgaGF4X2ZkOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfV0lOMzIKK3R5cGVkZWYgSEFORExFIGhheF9mZDsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGhheF9zdGF0ZSBoYXhfZ2xvYmFsOworc3RydWN0IGhheF92Y3B1X3N0YXRlCit7CisgICAgaGF4X2ZkIGZkOworICAgIGludCB2Y3B1X2lkOworICAgIGludCBlbXVsYXRpb25fc3RhdGU7CisgICAgc3RydWN0IGhheF90dW5uZWwgKnR1bm5lbDsKKyAgICB1bnNpZ25lZCBjaGFyICppb2J1ZjsKK307CisKK3N0cnVjdCBoYXhfc3RhdGUKK3sKKyAgICBoYXhfZmQgZmQ7IC8qIHRoZSBnbG9iYWwgaGF4IGRldmljZSBpbnRlcmZhY2UgKi8KKyAgICB1aW50MzJfdCB2ZXJzaW9uOworICAgIHN0cnVjdCBoYXhfdm0gKnZtOworICAgIHVpbnQ2NF90IG1lbV9xdW90YTsKK307CisKKyNkZWZpbmUgSEFYX01BWF9WQ1BVIDB4MTAKKyNkZWZpbmUgTUFYX1ZNX0lEIDB4NDAKKyNkZWZpbmUgTUFYX1ZDUFVfSUQgMHg0MAorCitzdHJ1Y3QgaGF4X3ZtCit7CisgICAgaGF4X2ZkIGZkOworICAgIGludCBpZDsKKyAgICBzdHJ1Y3QgaGF4X3ZjcHVfc3RhdGUgKnZjcHVzW0hBWF9NQVhfVkNQVV07Cit9OworCisvKiBGdW5jdGlvbnMgZXhwb3J0ZWQgdG8gaG9zdCBzcGVjaWZpYyBtb2RlICovCitoYXhfZmQgaGF4X3ZjcHVfZ2V0X2ZkKENQVVN0YXRlICpjcHUpOworaW50IHZhbGlkX2hheF90dW5uZWxfc2l6ZSh1aW50MTZfdCBzaXplKTsKKworLyogSG9zdCBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KK2ludCBoYXhfbW9kX3ZlcnNpb24oc3RydWN0IGhheF9zdGF0ZSAqaGF4LCBzdHJ1Y3QgaGF4X21vZHVsZV92ZXJzaW9uICp2ZXJzaW9uKTsKK2ludCBoYXhfaW5qZWN0X2ludGVycnVwdChDUFVTdGF0ZSAqY3B1LCBpbnQgdmVjdG9yKTsKK3N0cnVjdCBoYXhfdm0gKmhheF92bV9jcmVhdGUoc3RydWN0IGhheF9zdGF0ZSAqaGF4KTsKK2ludCBoYXhfdmNwdV9ydW4oc3RydWN0IGhheF92Y3B1X3N0YXRlICp2Y3B1KTsKK2ludCBoYXhfdmNwdV9jcmVhdGUoaW50IGlkKTsKK2ludCBoYXhfc3luY192Y3B1X3N0YXRlKENQVVN0YXRlICpjcHUsIHN0cnVjdCB2Y3B1X3N0YXRlX3QgKnN0YXRlLCBpbnQgc2V0KTsKK2ludCBoYXhfc3luY19tc3IoQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGhheF9tc3JfZGF0YSAqbXNycywgaW50IHNldCk7CitpbnQgaGF4X3N5bmNfZnB1KENQVVN0YXRlICpjcHUsIHN0cnVjdCBmeF9sYXlvdXQgKmZsLCBpbnQgc2V0KTsKK2ludCBoYXhfdm1fZGVzdHJveShzdHJ1Y3QgaGF4X3ZtICp2bSk7CitpbnQgaGF4X2NhcGFiaWxpdHkoc3RydWN0IGhheF9zdGF0ZSAqaGF4LCBzdHJ1Y3QgaGF4X2NhcGFiaWxpdHlpbmZvICpjYXApOworaW50IGhheF9ub3RpZnlfcWVtdV92ZXJzaW9uKGhheF9mZCB2bV9mZCwgc3RydWN0IGhheF9xZW11X3ZlcnNpb24gKnF2ZXJzaW9uKTsKKworLyogQ29tbW9uIGhvc3QgZnVuY3Rpb24gKi8KK2ludCBoYXhfaG9zdF9jcmVhdGVfdm0oc3RydWN0IGhheF9zdGF0ZSAqaGF4LCBpbnQgKnZtX2lkKTsKK2hheF9mZCBoYXhfaG9zdF9vcGVuX3ZtKHN0cnVjdCBoYXhfc3RhdGUgKmhheCwgaW50IHZtX2lkKTsKK2ludCBoYXhfaG9zdF9jcmVhdGVfdmNwdShoYXhfZmQgdm1fZmQsIGludCB2Y3B1aWQpOworaGF4X2ZkIGhheF9ob3N0X29wZW5fdmNwdShpbnQgdm1pZCwgaW50IHZjcHVpZCk7CitpbnQgaGF4X2hvc3Rfc2V0dXBfdmNwdV9jaGFubmVsKHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSAqdmNwdSk7CitoYXhfZmQgaGF4X21vZF9vcGVuKHZvaWQpOworCisKKyNpZmRlZiBDT05GSUdfREFSV0lOCisjaW5jbHVkZSAidGFyZ2V0LWkzODYvaGF4LWRhcndpbi5oIgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfV0lOMzIKKyNpbmNsdWRlICJ0YXJnZXQtaTM4Ni9oYXgtd2luZG93cy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0YXJnZXQtaTM4Ni9oYXgtaW50ZXJmYWNlLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtaW50ZXJmYWNlLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hheC1pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYyNTgwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw0MTggQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpZm5kZWYgX0hBWF9JTlRFUkZBQ0VfSAorI2RlZmluZSBfSEFYX0lOVEVSRkFDRV9ICisKKy8qCisgKiBDb21tb24gZGF0YSBzdHJ1Y3R1cmUgZm9yIEhBWCBpbnRlcmZhY2Ugb24gYm90aCBNYWMgYW5kIFdpbmRvd3MKKyAqIFRoZSBJT0NUTCBpcyBkZWZpbmVkIGluIGhheC1kYXJ3aW4uaCBhbmQgaGF4LXdpbmRvd3MuaAorICovCisKKy8qIGZ4X2xheW91dCBhY2NvcmRpbmcgdG8gSW50ZWwgU0RNICovCitzdHJ1Y3QgZnhfbGF5b3V0IHsKKyAgICB1aW50MTZfdCAgICBmY3c7CisgICAgdWludDE2X3QgICAgZnN3OworICAgIHVpbnQ4X3QgICAgIGZ0dzsKKyAgICB1aW50OF90ICAgICByZXMxOworICAgIHVpbnQxNl90ICAgIGZvcDsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50MzJfdCAgICBmaXA7CisgICAgICAgICAgICB1aW50MTZfdCAgICBmY3M7CisgICAgICAgICAgICB1aW50MTZfdCAgICByZXMyOworICAgICAgICB9OworICAgICAgICB1aW50NjRfdCAgZnB1X2lwOworICAgIH07CisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDMyX3QgICAgZmRwOworICAgICAgICAgICAgdWludDE2X3QgICAgZmRzOworICAgICAgICAgICAgdWludDE2X3QgICAgcmVzMzsKKyAgICAgICAgfTsKKyAgICAgICAgdWludDY0X3QgZnB1X2RwOworICAgIH07CisgICAgdWludDMyX3QgICAgbXhjc3I7CisgICAgdWludDMyX3QgICAgbXhjc3JfbWFzazsKKyAgICB1aW50OF90ICAgICBzdF9tbVs4XVsxNl07CisgICAgdWludDhfdCAgICAgbW14XzFbOF1bMTZdOworICAgIHVpbnQ4X3QgICAgIG1teF8yWzhdWzE2XTsKKyAgICB1aW50OF90ICAgICBwYWRbOTZdOworfTsKKworc3RydWN0IHZteF9tc3IgeworICAgIHVpbnQ2NF90IGVudHJ5OworICAgIHVpbnQ2NF90IHZhbHVlOworfTsKKworLyoKKyAqIFVzZSBmaXhlZC1zaXplIGFycmF5IHRvIG1ha2UgTWFjIE9TIFggc3VwcG9ydCBlZmZpY2llbnQgYnkgYXZvaWRpbmcKKyAqIHVzZSBtZW1vcnkgbWFwIG9yIGNvcHktaW4gcm91dGluZXMuCisgKi8KKyNkZWZpbmUgSEFYX01BWF9NU1JfQVJSQVkgMHgyMAorc3RydWN0IGhheF9tc3JfZGF0YQoreworICAgIHVpbnQxNl90IG5yX21zcjsKKyAgICB1aW50MTZfdCBkb25lOworICAgIHVpbnQxNl90IHBhZFsyXTsKKyAgICBzdHJ1Y3Qgdm14X21zciBlbnRyaWVzW0hBWF9NQVhfTVNSX0FSUkFZXTsKK307CisKK3VuaW9uIGludGVycnVwdGliaWxpdHlfc3RhdGVfdCB7CisgICAgdWludDMyX3QgcmF3OworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IHN0aV9ibG9ja2luZyAgIDogMTsKKyAgICAgICAgdWludDMyX3QgbW92c3NfYmxvY2tpbmcgOiAxOworICAgICAgICB1aW50MzJfdCBzbWlfYmxvY2tpbmcgICA6IDE7CisgICAgICAgIHVpbnQzMl90IG5taV9ibG9ja2luZyAgIDogMTsKKyAgICAgICAgdWludDMyX3QgcmVzZXJ2ZWQgICAgICAgOiAyODsKKyAgICB9OworICAgIHVpbnQ2NF90IHBhZDsKK307CisKK3R5cGVkZWYgdW5pb24gaW50ZXJydXB0aWJpbGl0eV9zdGF0ZV90IGludGVycnVwdGliaWxpdHlfc3RhdGVfdDsKKworLy8gU2VnbWVudCBkZXNjcmlwdG9yCitzdHJ1Y3Qgc2VnbWVudF9kZXNjX3QgeworICAgIHVpbnQxNl90IHNlbGVjdG9yOworICAgIHVpbnQxNl90IF9kdW1teTsKKyAgICB1aW50MzJfdCBsaW1pdDsKKyAgICB1aW50NjRfdCBiYXNlOworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IHR5cGUgICAgICAgICAgICAgOiA0OworICAgICAgICAgICAgdWludDMyX3QgZGVzYyAgICAgICAgICAgICA6IDE7CisgICAgICAgICAgICB1aW50MzJfdCBkcGwgICAgICAgICAgICAgIDogMjsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnQgICAgICAgICAgOiAxOworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICA6IDQ7CisgICAgICAgICAgICB1aW50MzJfdCBhdmFpbGFibGUgICAgICAgIDogMTsKKyAgICAgICAgICAgIHVpbnQzMl90IGxvbmdfbW9kZSAgICAgICAgOiAxOworICAgICAgICAgICAgdWludDMyX3Qgb3BlcmFuZF9zaXplICAgICA6IDE7CisgICAgICAgICAgICB1aW50MzJfdCBncmFudWxhcml0eSAgICAgIDogMTsKKyAgICAgICAgICAgIHVpbnQzMl90IG51bGwgICAgICAgICAgICAgOiAxOworICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICA6IDE1OworICAgICAgICB9OworICAgICAgICB1aW50MzJfdCBhcjsKKyAgICB9OworICAgIHVpbnQzMl90IGlwYWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBzZWdtZW50X2Rlc2NfdCBzZWdtZW50X2Rlc2NfdDsKKworc3RydWN0IHZjcHVfc3RhdGVfdAoreworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgX3JlZ3NbMTZdOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9haDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIF9heDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBfZWF4OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgIF9yYXg7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2NsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIF9jeDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBfZWN4OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgIF9yY3g7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2RsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kaDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHVpbnQxNl90ICAgIF9keDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBfZWR4OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAgIF9yZHg7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgX2JsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfYmg7CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBfYng7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgX2VieDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgICBfcmJ4OworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBfc3A7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgX2VzcDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgICBfcnNwOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBfYnA7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgX2VicDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgICBfcmJwOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBfc2k7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgX2VzaTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgICBfcnNpOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAgICBfZGk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgX2VkaTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgICBfcmRpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdWludDY0X3QgX3I4OworICAgICAgICAgICAgdWludDY0X3QgX3I5OworICAgICAgICAgICAgdWludDY0X3QgX3IxMDsKKyAgICAgICAgICAgIHVpbnQ2NF90IF9yMTE7CisgICAgICAgICAgICB1aW50NjRfdCBfcjEyOworICAgICAgICAgICAgdWludDY0X3QgX3IxMzsKKyAgICAgICAgICAgIHVpbnQ2NF90IF9yMTQ7CisgICAgICAgICAgICB1aW50NjRfdCBfcjE1OworICAgICAgICB9OworICAgIH07CisKKyAgICB1bmlvbiB7CisgICAgICAgIHVpbnQzMl90IF9laXA7CisgICAgICAgIHVpbnQ2NF90IF9yaXA7CisgICAgfTsKKworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDMyX3QgX2VmbGFnczsKKyAgICAgICAgdWludDY0X3QgX3JmbGFnczsKKyAgICB9OworCisgICAgc2VnbWVudF9kZXNjX3QgX2NzOworICAgIHNlZ21lbnRfZGVzY190IF9zczsKKyAgICBzZWdtZW50X2Rlc2NfdCBfZHM7CisgICAgc2VnbWVudF9kZXNjX3QgX2VzOworICAgIHNlZ21lbnRfZGVzY190IF9mczsKKyAgICBzZWdtZW50X2Rlc2NfdCBfZ3M7CisgICAgc2VnbWVudF9kZXNjX3QgX2xkdDsKKyAgICBzZWdtZW50X2Rlc2NfdCBfdHI7CisKKyAgICBzZWdtZW50X2Rlc2NfdCBfZ2R0OworICAgIHNlZ21lbnRfZGVzY190IF9pZHQ7CisKKyAgICB1aW50NjRfdCBfY3IwOworICAgIHVpbnQ2NF90IF9jcjI7CisgICAgdWludDY0X3QgX2NyMzsKKyAgICB1aW50NjRfdCBfY3I0OworCisgICAgdWludDY0X3QgX2RyMDsKKyAgICB1aW50NjRfdCBfZHIxOworICAgIHVpbnQ2NF90IF9kcjI7CisgICAgdWludDY0X3QgX2RyMzsKKyAgICB1aW50NjRfdCBfZHI2OworICAgIHVpbnQ2NF90IF9kcjc7CisgICAgdWludDY0X3QgX3BkZTsKKworICAgIHVpbnQzMl90IF9lZmVyOworCisgICAgdWludDMyX3QgX3N5c2VudGVyX2NzOworICAgIHVpbnQ2NF90IF9zeXNlbnRlcl9laXA7CisgICAgdWludDY0X3QgX3N5c2VudGVyX2VzcDsKKworICAgIHVpbnQzMl90IF9hY3Rpdml0eV9zdGF0ZTsKKyAgICB1aW50MzJfdCBwYWQ7CisgICAgaW50ZXJydXB0aWJpbGl0eV9zdGF0ZV90IF9pbnRlcnJ1cHRpYmlsaXR5X3N0YXRlOworfTsKKworLyoKKyAqIEhBWCB0dW5uZWwgaXMgYSBwZXItdkNQVSBzaGFyZWQgbWVtb3J5IGJldHdlZW4gUUVNVSBhbmQgSEFYIGRyaXZlcgorICogSXQgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGJldHdlZW4gUUVNVSBhbmQgSEFYIGRyaXZlciwgbGlrZSBLVk1fUlVOCisgKgorICogSW4gSEFYX1ZDUFVfSU9DVExfU0VUVVBfVFVOTkVMIGlvY3RsLCBIQVggZHJpdmVyIGFsbG9jYXRzIHRoZSBtZW1vcnksIG1hcHMKKyAqIGl0IHRvIFFFTVUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGFuZCByZXR1cm5zIHRoZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIHNpemUgdG8KKyAqIFFFTVUgdGhyb3VnaCBoYXhfdHVubmVsX2luZm8gc3RydWN0dXJlCisgKi8KK3N0cnVjdCBoYXhfdHVubmVsCit7CisgICAgdWludDMyX3QgX2V4aXRfcmVhc29uOworICAgIHVpbnQzMl90IF9leGl0X2ZsYWc7CisgICAgdWludDMyX3QgX2V4aXRfc3RhdHVzOworICAgIHVpbnQzMl90IHVzZXJfZXZlbnRfcGVuZGluZzsKKyAgICBpbnQgcmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb247CisgICAgaW50IHJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdzsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAvKiAwOiByZWFkLCAxOiB3cml0ZSAqLworI2RlZmluZSBIQVhfRVhJVF9JT19JTiAgMQorI2RlZmluZSBIQVhfRVhJVF9JT19PVVQgMAorICAgICAgICAgICAgdWludDhfdCBfZGlyZWN0aW9uOworICAgICAgICAgICAgdWludDhfdCBfZGY7CisgICAgICAgICAgICB1aW50MTZfdCBfc2l6ZTsKKyAgICAgICAgICAgIHVpbnQxNl90IF9wb3J0OworICAgICAgICAgICAgdWludDE2X3QgX2NvdW50OworICAgICAgICAgICAgdWludDhfdCBfZmxhZ3M7CisgICAgICAgICAgICB1aW50OF90IF9wYWQwOworICAgICAgICAgICAgdWludDE2X3QgX3BhZDE7CisgICAgICAgICAgICB1aW50MzJfdCBfcGFkMjsKKyAgICAgICAgICAgIHVpbnQ2NF90IF92YWRkcjsKKyAgICAgICAgfSBwaW87CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50NjRfdCBnbGE7CisgICAgICAgIH0gbW1pbzsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgfSBzdGF0ZTsKKyAgICB9OworfTsKKworc3RydWN0IGhheF90dW5uZWxfaW5mbworeworICAgIHVpbnQ2NF90IHZhOworICAgIHVpbnQ2NF90IGlvX3ZhOworICAgIHVpbnQxNl90IHNpemU7CisgICAgdWludDE2X3QgcGFkWzNdOworfTsKKworLyogVGhlIGV4aXQgcmVhc29uIGluIEhBWCB0dW5uZWwgZm9yIEhBWF9WQ1BVX0lPQ1RMX1JVTiBJT0NUTCAqLworZW51bSBleGl0X3N0YXR1cyB7CisgICAgLyogSU8gcG9ydCBlbXVsYXRpb24gcmVxdWVzdCAqLworICAgIEhBWF9FWElUX0lPID0gMSwKKyAgICAvKiBNTUlPIGluc3RydWN0aW9uIGVtdWxhdGlvbiByZXF1ZXN0CisgICAgICogUUVNVSBlbXVsYXRlcyBNTUlPIGluc3RydWN0aW9uIGluIGZvbGxvd2luZyBzdGVwOgorICAgICAqIDEuIFdoZW4gZ3Vlc3QgYWNjZXNzZXMgTU1JTyBhZGRyZXNzLCBpdCBpcyB0cmFwcGVkIHRvIEhBWCBkcml2ZXIKKyAgICAgKiAyLiBIQVggZHJpdmVyIHJldHVybiBiYWNrIHRvIFFFTVUgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZGRyZXNzCisgICAgICogMy4gUUVNVSBzeW5jIHRoZSB2Y3B1IHN0YXRlIHdpdGggSEFYIGRyaXZlcgorICAgICAqIDQuIFFFTVUgZW11bGF0ZXMgdGhpcyBpbnN0cnVjdGlvbgorICAgICAqIDUuIFFFTVUgc3luYyB0aGUgdmNwdSBzdGF0ZSB0byBIQVggZHJpdmVyCisgICAgICogNi4gSEFYIGRyaXZlciBjb250aW51b3VzIHJ1biB0aGUgZ3Vlc3QgdGhyb3VnaCBIQVhfVkNQVV9JT0NUTF9SVU4KKyAgICAgKi8KKyAgICBIQVhfRVhJVF9NTUlPLAorICAgIC8qCisgICAgICogUUVNVSBlbXVsYXRpb24gbW9kZSByZXF1ZXN0CisgICAgICogUUVNVSBlbXVsYXRlcyBndWVzdCBpbnN0cnVjdGlvbiB3aGVuIGd1ZXN0IGlzIHJ1bm5pbmcgaW4KKyAgICAgKiByZWFsIG1vZGUgb3IgcHJvdGVjdGVkIG1vZGUKKyAgICAgKi8KKyAgICBIQVhfRVhJVF9SRUFMLAorICAgIC8qCisgICAgICogSW50ZXJydXB0IHdpbmRvdyBvcGVuLCBxZW11IGNhbiBpbmplY3QgYW4gaW50ZXJydXB0IG5vdy4KKyAgICAgKiBBbHNvIHVzZWQgdG8gaW5kaWNhdGUgYSBzaWduYWwgaXMgcGVuZGluZyB0byBRRU1VCisgICAgICovCisgICAgSEFYX0VYSVRfSU5URVJSVVBULAorICAgIC8qIFVua25vd24gdm1leGl0LCBtb3N0bHkgdHJpZ2dlciByZWJvb3QgKi8KKyAgICBIQVhfRVhJVF9VTktOT1dOX1ZNRVhJVCwKKyAgICAvKgorICAgICAqIEhhbHQgaW4gZ3Vlc3QKKyAgICAgKiBXaGVuIGd1ZXN0IGV4ZWN1dGVzIEhMVCBpbnN0cnVjdGlvbiB3aXRoIGludGVycnVwdCBlbmFibGVkLCBIQVgKKyAgICAgKiByZXR1cm4gYmFjayB0byBRRU1VLgorICAgICAqLworICAgIEhBWF9FWElUX0hMVCwKKyAgICAvKiBSZWJvb3QgcmVxdWVzdCwgbGlrZSBiZWNhdXNlIG9mIHRyaXBwbGUgZmF1bHQgaW4gZ3Vlc3QgKi8KKyAgICBIQVhfRVhJVF9TVEFURUNIQU5HRSwKKyAgICAvKgorICAgICAqIFRoZSBWQ1BVIGlzIHBhdXNlZAorICAgICAqIE5vdyB0aGUgdmNwdSBpcyBvbmx5IHBhdXNlZCB3aGVuIHRvIGJlIGRlc3Ryb2lkLCBzbyBzaW1wbHkgcmV0dXJuIHRvIGhheAorICAgICAqLworICAgIEhBWF9FWElUX1BBVVNFRCwKKyAgICAvKiBmcm9tIEFQSSAyLjAgKi8KKyAgICAvKgorICAgICAqIEluIEFQSSAxLjAsIEhBWE0gZHJpdmVyIHV0aWxpemVzIFFFTVUgdG8gZGVjb2RlIGFuZCBlbXVsYXRlIE1NSU8KKyAgICAgKiBvcGVyYXRpb25zLgorICAgICAqIEZyb20gMi4wLCBIQVhNIGRyaXZlciB3aWxsIGRlY29kZSBzb21lIE1NSU8gaW5zdHJ1Y3Rpb25zIHRvIGltcHJvdmUKKyAgICAgKiBNTUlPIGhhbmRsaW5nIHBlcmZvcm1hbmNlLCBlc3BlY2lhbGx5IGZvciBHTEVTIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgorICAgICAqLworICAgIEhBWF9FWElUX0ZBU1RfTU1JTywKK307CisKKy8qCisgKiBUaGUgQVBJIHZlcnNpb24gYmV0d2VlbiBRRU1VIGFuZCBIQVggZHJpdmVyCisgKiBDb21wYXRfdmVyc2lvbiBkZWZpbmVzIHRoZSBvbGRlc3QgQVBJIHZlcnNpb24gdGhlIEhBWCBkcml2ZXIgY2FuIHN1cHBvcnQKKyAqLworc3RydWN0IGhheF9tb2R1bGVfdmVyc2lvbgoreworICAgIHVpbnQzMl90IGNvbXBhdF92ZXJzaW9uOworICAgIHVpbnQzMl90IGN1cl92ZXJzaW9uOworfTsKKworLyogVGhpcyBpbnRlcmZhY2UgaXMgc3VwcG9ydCBvbmx5IGFmdGVyIEFQSSB2ZXJzaW9uIDIgKi8KK3N0cnVjdCBoYXhfcWVtdV92ZXJzaW9uCit7CisgICAgLyogQ3VycmVudCBBUEkgdmVyc2lvbiBpbiBRRU1VKi8KKyAgICB1aW50MzJfdCBjdXJfdmVyc2lvbjsKKyAgICAvKiBUaGUgbGVhc3QgQVBJIHZlcnNpb24gc3VwcG9ydGVkIGJ5IFFFTVUgKi8KKyAgICB1aW50MzJfdCBsZWFzdF92ZXJzaW9uOworfTsKKworLyogU2VlIGNvbW1lbnRzIGZvciBIQVhfVk1fSU9DVExfQUxMT0NfUkFNIGlvY3RsICovCitzdHJ1Y3QgaGF4X2FsbG9jX3JhbV9pbmZvCit7CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICB1aW50MzJfdCBwYWQ7CisgICAgdWludDY0X3QgdmE7Cit9OworCisvKiBTZWUgY29tbWVudHMgZm9yIEhBWF9WTV9JT0NUTF9TRVRfUkFNIGlvY3RsICovCisjZGVmaW5lIEhBWF9SQU1fSU5GT19ST00gMHgxCitzdHJ1Y3QgaGF4X3NldF9yYW1faW5mbworeworICAgIHVpbnQ2NF90IHBhX3N0YXJ0OworICAgIHVpbnQzMl90IHNpemU7CisgICAgdWludDhfdCBmbGFnczsKKyAgICB1aW50OF90IHBhZFszXTsKKyAgICB1aW50NjRfdCB2YTsKK307CisKKy8qCisgKiBXZSBuZWVkIHRvIGxvYWQgdGhlIEhBWE0gKEhBWCBNYW5hZ2VyKSB0byB0ZWxsIGlmIHRoZSBob3N0IHN5c3RlbSBoYXMgdGhlCisgKiByZXF1aXJlZCBjYXBhYmlsaXRpZXMgdG8gb3BlcmF0ZSwgYW5kIHdlIHVzZSBoYXhfY2FwYWJpbGl0eWluZm8gdG8gZ2V0IHN1Y2gKKyAqIGluZm8gZnJvbSBIQVhNLgorICoKKyAqIFRvIHByZXZlbnQgSEFYTSBmcm9tIG92ZXItY29uc3VtaW5nIFJBTSwgd2Ugc2V0IHRoZSBtYXhpbXVtIGFtb3VudCBvZiBSQU0KKyAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIGd1ZXN0cyBhdCBIQVggaW5zdGFsbGF0aW9uIHRpbWUuIE9uY2UgdGhlIHF1b3RhIGlzCisgKiByZWFjaGVkLCBIQVhNIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBndWVzdHMuCisgKiBEZXRlY3QgdGhhdCBIQVhNIGlzIG91dCBvZiBxdW90YSBjYW4gdGFrZSB0aGUgZW11bGF0b3IgdG8gbm9uLUhBWE0gbW9kZWwKKyAqLworc3RydWN0IGhheF9jYXBhYmlsaXR5aW5mbworeworICAgIC8qIGJpdCAwOiAxIC0gSEFYTSBpcyB3b3JraW5nCisgICAgICogICAgICAgIDAgLSBIQVhNIGlzIG5vdCB3b3JraW5nIHBvc3NpYmx5IGJlY2F1c2UgVlQvTlggaXMgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgIE5YIG1lYW5zIE5vbi1lWGVjdXRpb24sIGFrcy4gWEQgKGVYZWN1dGlvbiBEaXNhYmxlKQorICAgICAqIGJpdCAxOiAxIC0gSEFYTSBoYXMgaGFyZCBsaW1pdCBvbiBob3cgbWFueSBSQU0gY2FuIGJlIHVzZWQgYXMgZ3Vlc3QgUkFNCisgICAgICogICAgICAgIDAgLSBIQVhNIGhhcyBubyBtZW1vcnkgbGltaXRhdGlvbgorICAgICAqLworI2RlZmluZSBIQVhfQ0FQX1NUQVRVU19XT1JLSU5HICAweDEKKyNkZWZpbmUgSEFYX0NBUF9TVEFUVVNfTk9UV09SS0lORyAgMHgwCisjZGVmaW5lIEhBWF9DQVBfV09SS1NUQVRVU19NQVNLIDB4MQorI2RlZmluZSBIQVhfQ0FQX01FTVFVT1RBICAgICAgICAweDIKKyAgICB1aW50MTZfdCB3c3RhdHVzOworICAgIC8qCisgICAgICogdmFsaWQgd2hlbiBIQVhNIGlzIG5vdCB3b3JraW5nCisgICAgICogYml0IDA6IEhBWE0gaXMgbm90IHdvcmtpbmcgYmVjYXVzZSBWVCBpcyBub3QgZW5hYmVsZAorICAgICAqIGJpdCAxOiBIQVhNIGlzIG5vdCB3b3JraW5nIGJlY2F1c2UgTlggbm90IGVuYWJsZWQKKyAgICAgKi8KKyNkZWZpbmUgSEFYX0NBUF9GQUlMUkVBU09OX1ZUICAgMHgxCisjZGVmaW5lIEhBWF9DQVBfRkFJTFJFQVNPTl9OWCAgIDB4MgorICAgIHVpbnQxNl90IHdpbmZvOworICAgIHVpbnQzMl90IHBhZDsKKyAgICB1aW50NjRfdCBtZW1fcXVvdGE7Cit9OworCisvKiBBUEkgMi4wICovCisKK3N0cnVjdCBoYXhfZmFzdG1taW8KK3sKKyAgICB1aW50NjRfdCBncGE7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgdWludDhfdCBzaXplOworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOworICAgIHVpbnQxNl90IHJlZ19pbmRleDsKKyAgICB1aW50MzJfdCBwYWQwOworICAgIHVpbnQ2NF90IF9jcjA7CisgICAgdWludDY0X3QgX2NyMjsKKyAgICB1aW50NjRfdCBfY3IzOworICAgIHVpbnQ2NF90IF9jcjQ7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LXdpbmRvd3MuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LXdpbmRvd3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM5OTE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtd2luZG93cy5jCkBAIC0wLDAgKzEsNTI0IEBACisvKgorKiogQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbgorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSAiZXhlYy9yYW1fYWRkci5oIgorI2luY2x1ZGUgInRhcmdldC1pMzg2L2hheC1pMzg2LmgiCisKKy8qCisgKiByZXR1cm4gMCB1cG9uIHN1Y2Nlc3MsIC0xIHdoZW4gdGhlIGRyaXZlciBpcyBub3QgbG9hZGVkLAorICogb3RoZXIgbmVnYXRpdmUgdmFsdWUgZm9yIG90aGVyIGZhaWx1cmVzCisgKi8KK3N0YXRpYyBpbnQgaGF4X29wZW5fZGV2aWNlKGhheF9mZCAqZmQpCit7CisgICAgdWludDMyX3QgZXJyTnVtID0gMDsKKyAgICBIQU5ETEUgaERldmljZTsKKworICAgIGlmICghZmQpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGhEZXZpY2UgPSBDcmVhdGVGaWxlKCAiXFxcXC5cXEhBWCIsCisgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgMCwKKyAgICAgIE5VTEwsCisgICAgICBDUkVBVEVfQUxXQVlTLAorICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgTlVMTCk7CisKKyAgICBpZiAoaERldmljZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIG9wZW4gdGhlIEhBWCBkZXZpY2UhXG4iKTsKKyAgICAgICAgZXJyTnVtID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChlcnJOdW0gPT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisgICAgKmZkID0gaERldmljZTsKKyAgICBkcHJpbnQoImRldmljZSBmZDolZFxuIiwgKmZkKTsKKyAgICByZXR1cm4gMDsKK30KKworCitoYXhfZmQgaGF4X21vZF9vcGVuKHZvaWQpCit7CisgICAgaW50IHJldDsKKyAgICBoYXhfZmQgZmQgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKworICAgIHJldCA9IGhheF9vcGVuX2RldmljZSgmZmQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBkcHJpbnQoIk9wZW4gSEFYIGRldmljZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIGZkOworfQorCitpbnQgaGF4X3BvcHVsYXRlX3JhbSh1aW50NjRfdCB2YSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBoYXhfYWxsb2NfcmFtX2luZm8gaW5mbzsKKyAgICBIQU5ETEUgaERldmljZVZNOworICAgIERXT1JEIGRTaXplID0gMDsKKworICAgIGlmICghaGF4X2dsb2JhbC52bSB8fCAhaGF4X2dsb2JhbC52bS0+ZmQpCisgICAgeworICAgICAgICBkcHJpbnQoIkFsbG9jYXRlIG1lbW9yeSBiZWZvcmUgdm0gY3JlYXRlP1xuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGluZm8uc2l6ZSA9IHNpemU7CisgICAgaW5mby52YSA9IHZhOworCisgICAgaERldmljZVZNID0gaGF4X2dsb2JhbC52bS0+ZmQ7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZNLAorICAgICAgSEFYX1ZNX0lPQ1RMX0FMTE9DX1JBTSwKKyAgICAgICZpbmZvLCBzaXplb2YoaW5mbyksCisgICAgICBOVUxMLCAwLAorICAgICAgJmRTaXplLAorICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgICBkcHJpbnQoIkhBWDogRmFpbGVkIHRvIGFsbG9jYXRlICV4IG1lbW9yeSAoYWRkcmVzcyAlbGx4KVxuIiwgCisgICAgICAgICAgICAgICBzaXplLCAodW5zaWduZWQgbG9uZyBsb25nKXZhKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2ludCBoYXhfc2V0X3BoeXNfbWVtKGh3YWRkciBzdGFydF9hZGRyLCByYW1fYWRkcl90IHNpemUsIHJhbV9hZGRyX3QgcGh5c19vZmZzZXQpCit7CisgICAgc3RydWN0IGhheF9zZXRfcmFtX2luZm8gaW5mbywgKnBpbmZvID0gJmluZm87CisgICAgcmFtX2FkZHJfdCBmbGFncyA9IHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0s7CisgICAgSEFORExFIGhEZXZpY2VWTTsKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvKiBXZSBsb29rIGZvciB0aGUgIFJBTSBhbmQgUk9NIG9ubHkgKi8KKyAgICBpZiAoZmxhZ3MgPj0gSU9fTUVNX1VOQVNTSUdORUQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAoc3RhcnRfYWRkciAmIH5UQVJHRVRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIH5UQVJHRVRfUEFHRV9NQVNLKSkKKyAgICB7CisgICAgICAgIGRwcmludCgKKyAgICAgICAgICAic2V0X3BoeXNfbWVtICV4ICVseCByZXF1aXJlcyBwYWdlIGFsaWduZWQgYWRkciBhbmQgc2l6ZVxuIiwKKyAgICAgICAgICBzdGFydF9hZGRyLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGluZm8ucGFfc3RhcnQgPSBzdGFydF9hZGRyOworICAgIGluZm8uc2l6ZSA9IHNpemU7CisgICAgaW5mby52YSA9ICh1aW50NjRfdCkodWludHB0cl90KXFlbXVfZ2V0X3JhbV9wdHIocGh5c19vZmZzZXQpOworICAgIGluZm8uZmxhZ3MgPSAoZmxhZ3MgJiBJT19NRU1fUk9NKSA/IDEgOiAwOworCisgICAgaERldmljZVZNID0gaGF4X2dsb2JhbC52bS0+ZmQ7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZNLAorICAgICAgSEFYX1ZNX0lPQ1RMX1NFVF9SQU0sCisgICAgICBwaW5mbywgc2l6ZW9mKCpwaW5mbyksCisgICAgICBOVUxMLCAwLAorICAgICAgJmRTaXplLAorICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IGhheF9jYXBhYmlsaXR5KHN0cnVjdCBoYXhfc3RhdGUgKmhheCwgc3RydWN0IGhheF9jYXBhYmlsaXR5aW5mbyAqY2FwKQoreworICAgIGludCByZXQ7CisgICAgSEFORExFIGhEZXZpY2UgPSBoYXgtPmZkOyAgIC8vaGFuZGxlIHRvIGhheCBtb2R1bGUKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisgICAgRFdPUkQgZXJyID0gMDsKKworICAgIGlmIChoYXhfaW52YWxpZF9mZChoRGV2aWNlKSkgeworICAgICAgICBkcHJpbnQoIkludmFsaWQgZmQgZm9yIGhheCBkZXZpY2UhXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgcmV0ID0gRGV2aWNlSW9Db250cm9sKGhEZXZpY2UsCisgICAgICBIQVhfSU9DVExfQ0FQQUJJTElUWSwKKyAgICAgIE5VTEwsIDAsCisgICAgICBjYXAsIHNpemVvZigqY2FwKSwKKyAgICAgICZkU2l6ZSwKKyAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgZXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiB8fAorICAgICAgICAgICAgZXJyID09IEVSUk9SX01PUkVfREFUQSkKKyAgICAgICAgICAgIGRwcmludCgiaGF4IGNhcGFiaWxpdHkgaXMgdG9vIGxvbmcgdG8gaG9sZC5cbiIpOworICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBnZXQgSGF4IGNhcGFiaWxpdHk6JWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworaW50IGhheF9tb2RfdmVyc2lvbihzdHJ1Y3QgaGF4X3N0YXRlICpoYXgsIHN0cnVjdCBoYXhfbW9kdWxlX3ZlcnNpb24gKnZlcnNpb24pCit7CisgICAgaW50IHJldDsKKyAgICBIQU5ETEUgaERldmljZSA9IGhheC0+ZmQ7ICAgLy9oYW5kbGUgdG8gaGF4IG1vZHVsZQorICAgIERXT1JEIGRTaXplID0gMDsKKyAgICBEV09SRCBlcnIgPSAwOworCisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKGhEZXZpY2UpKSB7CisgICAgICAgIGRwcmludCgiSW52YWxpZCBmZCBmb3IgaGF4IGRldmljZSFcbiIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZSwKKyAgICAgIEhBWF9JT0NUTF9WRVJTSU9OLAorICAgICAgTlVMTCwgMCwKKyAgICAgIHZlcnNpb24sIHNpemVvZigqdmVyc2lvbiksCisgICAgICAmZFNpemUsCisgICAgICAoTFBPVkVSTEFQUEVEKSBOVUxMKTsKKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgfHwKKyAgICAgICAgICAgIGVyciA9PSBFUlJPUl9NT1JFX0RBVEEpCisgICAgICAgICAgICBkcHJpbnQoIkhBWCBtb2R1bGUgaXMgdG9vIGxhcmdlLlxuIik7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGdldCBIYXggbW9kdWxlIHZlcnNpb246JWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmhheF92bV9kZXZmc19zdHJpbmcoaW50IHZtX2lkKQoreworICAgIGNoYXIgKm5hbWU7CisKKyAgICBpZiAodm1faWQgPiBNQVhfVk1fSUQpCisgICAgeworICAgICAgICBkcHJpbnQoIlRvbyBiaWcgVk0gaWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBuYW1lID0gZ19zdHJkdXAoIlxcXFwuXFxoYXhfdm14eCIpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3ByaW50ZihuYW1lLCAiXFxcXC5cXGhheF92bSUwMmQiLCB2bV9pZCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGNoYXIgKmhheF92Y3B1X2RldmZzX3N0cmluZyhpbnQgdm1faWQsIGludCB2Y3B1X2lkKQoreworICAgIGNoYXIgKm5hbWU7CisKKyAgICBpZiAodm1faWQgPiBNQVhfVk1fSUQgfHwgdmNwdV9pZCA+IE1BWF9WQ1BVX0lEKQorICAgIHsKKyAgICAgICAgZHByaW50KCJUb28gYmlnIHZtIGlkICV4IG9yIHZjcHUgaWQgJXhcbiIsIHZtX2lkLCB2Y3B1X2lkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5hbWUgPSBnX3N0cmR1cCgiXFxcXC5cXGhheF92bXh4X3ZjcHV4eCIpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3ByaW50ZihuYW1lLCAiXFxcXC5cXGhheF92bSUwMmRfdmNwdSUwMmQiLCB2bV9pZCwgdmNwdV9pZCk7CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworaW50IGhheF9ob3N0X2NyZWF0ZV92bShzdHJ1Y3QgaGF4X3N0YXRlICpoYXgsIGludCAqdm1pZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCB2bV9pZCA9IDA7CisgICAgRFdPUkQgZFNpemUgPSAwOworCisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKGhheC0+ZmQpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChoYXgtPnZtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IERldmljZUlvQ29udHJvbChoYXgtPmZkLAorICAgICAgSEFYX0lPQ1RMX0NSRUFURV9WTSwKKyAgICAgIE5VTEwsIDAsCisgICAgICAmdm1faWQsIHNpemVvZih2bV9pZCksCisgICAgICAmZFNpemUsCisgICAgICAoTFBPVkVSTEFQUEVEKSBOVUxMKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBkcHJpbnQoImVycm9yIGNvZGU6JWQiLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnZtaWQgPSB2bV9pZDsKKyAgICByZXR1cm4gMDsKK30KKworaGF4X2ZkIGhheF9ob3N0X29wZW5fdm0oc3RydWN0IGhheF9zdGF0ZSAqaGF4LCBpbnQgdm1faWQpCit7CisgICAgY2hhciAqdm1fbmFtZSA9IE5VTEw7CisgICAgaGF4X2ZkIGhEZXZpY2VWTTsKKworICAgIHZtX25hbWUgPSBoYXhfdm1fZGV2ZnNfc3RyaW5nKHZtX2lkKTsKKyAgICBpZiAoIXZtX25hbWUpIHsKKyAgICAgICAgZHByaW50KCJJbmNvcnJlY3QgbmFtZVxuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CisKKyAgICBoRGV2aWNlVk0gPSBDcmVhdGVGaWxlKHZtX25hbWUsCisgICAgICBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLAorICAgICAgMCwKKyAgICAgIE5VTEwsCisgICAgICBDUkVBVEVfQUxXQVlTLAorICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAorICAgICAgTlVMTCk7CisgICAgaWYgKGhEZXZpY2VWTSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgZHByaW50KCJPcGVuIHRoZSB2bSBkZXZjaWUgZXJyb3I6JXMsIGVjOiVkXG4iLCB2bV9uYW1lLCBHZXRMYXN0RXJyb3IoKSk7CisKKyAgICBnX2ZyZWUodm1fbmFtZSk7CisgICAgcmV0dXJuIGhEZXZpY2VWTTsKK30KKworaW50IGhheF9ub3RpZnlfcWVtdV92ZXJzaW9uKGhheF9mZCB2bV9mZCwgc3RydWN0IGhheF9xZW11X3ZlcnNpb24gKnF2ZXJzaW9uKQoreworICAgIGludCByZXQ7CisgICAgRFdPUkQgZFNpemUgPSAwOworCisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKHZtX2ZkKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2wodm1fZmQsCisgICAgICBIQVhfVk1fSU9DVExfTk9USUZZX1FFTVVfVkVSU0lPTiwKKyAgICAgIHF2ZXJzaW9uLCBzaXplb2Yoc3RydWN0IGhheF9xZW11X3ZlcnNpb24pLAorICAgICAgTlVMTCwgMCwKKyAgICAgICZkU2l6ZSwKKyAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworICAgIGlmICghcmV0KQorICAgIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gbm90aWZ5IHFlbXUgQVBJIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfaG9zdF9jcmVhdGVfdmNwdShoYXhfZmQgdm1fZmQsIGludCB2Y3B1aWQpCit7CisgICAgaW50IHJldDsKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2wodm1fZmQsCisgICAgICBIQVhfVk1fSU9DVExfVkNQVV9DUkVBVEUsCisgICAgICAmdmNwdWlkLCBzaXplb2YodmNwdWlkKSwKKyAgICAgIE5VTEwsIDAsCisgICAgICAmZFNpemUsCisgICAgICAoTFBPVkVSTEFQUEVEKSBOVUxMKTsKKyAgICBpZiAoIXJldCkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGNyZWF0ZSB2Y3B1ICV4XG4iLCB2Y3B1aWQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2hheF9mZCBoYXhfaG9zdF9vcGVuX3ZjcHUoaW50IHZtaWQsIGludCB2Y3B1aWQpCit7CisgICAgY2hhciAqZGV2ZnNfcGF0aCA9IE5VTEw7CisgICAgaGF4X2ZkIGhEZXZpY2VWQ1BVOworCisgICAgZGV2ZnNfcGF0aCA9IGhheF92Y3B1X2RldmZzX3N0cmluZyh2bWlkLCB2Y3B1aWQpOworICAgIGlmICghZGV2ZnNfcGF0aCkKKyAgICB7CisgICAgICAgIGRwcmludCgiRmFpbGVkIHRvIGdldCB0aGUgZGV2ZnNcbiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQorCisgICAgaERldmljZVZDUFUgPSBDcmVhdGVGaWxlKCBkZXZmc19wYXRoLAorICAgICAgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKyAgICAgIDAsCisgICAgICBOVUxMLAorICAgICAgQ1JFQVRFX0FMV0FZUywKKyAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwKKyAgICAgIE5VTEwpOworCisgICAgaWYgKGhEZXZpY2VWQ1BVID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICBkcHJpbnQoIkZhaWxlZCB0byBvcGVuIHRoZSB2Y3B1IGRldmZzXG4iKTsKKyAgICBnX2ZyZWUoZGV2ZnNfcGF0aCk7CisgICAgcmV0dXJuIGhEZXZpY2VWQ1BVOworfQorCitpbnQgaGF4X2hvc3Rfc2V0dXBfdmNwdV9jaGFubmVsKHN0cnVjdCBoYXhfdmNwdV9zdGF0ZSAqdmNwdSkKK3sKKyAgICBoYXhfZmQgaERldmljZVZDUFUgPSB2Y3B1LT5mZDsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBoYXhfdHVubmVsX2luZm8gaW5mbzsKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICBIQVhfVkNQVV9JT0NUTF9TRVRVUF9UVU5ORUwsCisgICAgICBOVUxMLCAwLAorICAgICAgJmluZm8sIHNpemVvZihpbmZvKSwKKyAgICAgICZkU2l6ZSwKKyAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworICAgIGlmICghcmV0KQorICAgIHsKKyAgICAgICAgZHByaW50KCJGYWlsZWQgdG8gc2V0dXAgdGhlIGhheCB0dW5uZWxcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCF2YWxpZF9oYXhfdHVubmVsX3NpemUoaW5mby5zaXplKSkKKyAgICB7CisgICAgICAgIGRwcmludCgiSW52YWxpZCBoYXggdHVubmVsIHNpemUgJXhcbiIsIGluZm8uc2l6ZSk7CisgICAgICAgIHJldCA9IC1FSU5WQUw7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHZjcHUtPnR1bm5lbCA9IChzdHJ1Y3QgaGF4X3R1bm5lbCAqKSh1aW50cHRyX3QpKGluZm8udmEpOworICAgIHZjcHUtPmlvYnVmID0gKHVuc2lnbmVkIGNoYXIgKikodWludHB0cl90KShpbmZvLmlvX3ZhKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGhheF92Y3B1X3J1bihzdHJ1Y3QgaGF4X3ZjcHVfc3RhdGUqIHZjcHUpCit7CisgICAgaW50IHJldDsKKyAgICBIQU5ETEUgaERldmljZVZDUFUgPSB2Y3B1LT5mZDsKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICBIQVhfVkNQVV9JT0NUTF9SVU4sCisgICAgICBOVUxMLCAwLAorICAgICAgTlVMTCwgMCwKKyAgICAgICZkU2l6ZSwKKyAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X3N5bmNfZnB1KENQVVN0YXRlICpjcHUsIHN0cnVjdCBmeF9sYXlvdXQgKmZsLCBpbnQgc2V0KQoreworICAgIGludCByZXQ7CisgICAgaGF4X2ZkIGZkOworICAgIEhBTkRMRSBoRGV2aWNlVkNQVTsKKyAgICBEV09SRCBkU2l6ZSA9IDA7CisKKyAgICBmZCA9IGhheF92Y3B1X2dldF9mZChjcHUpOworICAgIGlmIChoYXhfaW52YWxpZF9mZChmZCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGhEZXZpY2VWQ1BVID0gZmQ7CisKKyAgICBpZiAoc2V0KQorICAgICAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICAgICAgSEFYX1ZDUFVfSU9DVExfU0VUX0ZQVSwKKyAgICAgICAgICBmbCwgc2l6ZW9mKCpmbCksCisgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICAgICAgSEFYX1ZDUFVfSU9DVExfR0VUX0ZQVSwKKyAgICAgICAgICBOVUxMLCAwLAorICAgICAgICAgIGZsLCBzaXplb2YoKmZsKSwKKyAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfc3luY19tc3IoQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGhheF9tc3JfZGF0YSAqbXNycywgaW50IHNldCkKK3sKKyAgICBpbnQgcmV0OworICAgIGhheF9mZCBmZDsKKyAgICBIQU5ETEUgaERldmljZVZDUFU7CisgICAgRFdPUkQgZFNpemUgPSAwOworCisgICAgZmQgPSBoYXhfdmNwdV9nZXRfZmQoY3B1KTsKKyAgICBpZiAoaGF4X2ludmFsaWRfZmQoZmQpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaERldmljZVZDUFUgPSBmZDsKKworICAgIGlmIChzZXQpCisgICAgICAgIHJldCA9IERldmljZUlvQ29udHJvbChoRGV2aWNlVkNQVSwKKyAgICAgICAgICBIQVhfVkNQVV9JT0NUTF9TRVRfTVNSUywKKyAgICAgICAgICBtc3JzLCBzaXplb2YoKm1zcnMpLAorICAgICAgICAgIG1zcnMsIHNpemVvZigqbXNycyksCisgICAgICAgICAgJmRTaXplLAorICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gRGV2aWNlSW9Db250cm9sKGhEZXZpY2VWQ1BVLAorICAgICAgICAgIEhBWF9WQ1BVX0lPQ1RMX0dFVF9NU1JTLAorICAgICAgICAgIG1zcnMsIHNpemVvZigqbXNycyksCisgICAgICAgICAgbXNycywgc2l6ZW9mKCptc3JzKSwKKyAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBoYXhfc3luY192Y3B1X3N0YXRlKENQVVN0YXRlICpjcHUsIHN0cnVjdCB2Y3B1X3N0YXRlX3QgKnN0YXRlLCBpbnQgc2V0KQoreworICAgIGludCByZXQ7CisgICAgaGF4X2ZkIGZkOworICAgIEhBTkRMRSBoRGV2aWNlVkNQVTsKKyAgICBEV09SRCBkU2l6ZTsKKworICAgIGZkID0gaGF4X3ZjcHVfZ2V0X2ZkKGNwdSk7CisgICAgaWYgKGhheF9pbnZhbGlkX2ZkKGZkKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaERldmljZVZDUFUgPSBmZDsKKworICAgIGlmIChzZXQpCisgICAgICAgIHJldCA9IERldmljZUlvQ29udHJvbChoRGV2aWNlVkNQVSwKKyAgICAgICAgICBIQVhfVkNQVV9TRVRfUkVHUywKKyAgICAgICAgICBzdGF0ZSwgc2l6ZW9mKCpzdGF0ZSksCisgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICAmZFNpemUsCisgICAgICAgICAgKExQT1ZFUkxBUFBFRCkgTlVMTCk7CisgICAgZWxzZQorICAgICAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICAgICAgSEFYX1ZDUFVfR0VUX1JFR1MsCisgICAgICAgICAgTlVMTCwgMCwKKyAgICAgICAgICBzdGF0ZSwgc2l6ZW9mKCpzdGF0ZSksCisgICAgICAgICAgJmRTaXplLAorICAgICAgICAgIChMUE9WRVJMQVBQRUQpIE5VTEwpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgaGF4X2luamVjdF9pbnRlcnJ1cHQoQ1BVU3RhdGUgKmNwdSwgaW50IHZlY3RvcikKK3sKKyAgICBpbnQgcmV0OworICAgIGhheF9mZCBmZDsKKyAgICBIQU5ETEUgaERldmljZVZDUFU7CisgICAgRFdPUkQgZFNpemU7CisKKyAgICBmZCA9IGhheF92Y3B1X2dldF9mZChjcHUpOworICAgIGlmIChoYXhfaW52YWxpZF9mZChmZCkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGhEZXZpY2VWQ1BVID0gZmQ7CisKKyAgICByZXQgPSBEZXZpY2VJb0NvbnRyb2woaERldmljZVZDUFUsCisgICAgICBIQVhfVkNQVV9JT0NUTF9JTlRFUlJVUFQsCisgICAgICAmdmVjdG9yLCBzaXplb2YodmVjdG9yKSwKKyAgICAgIE5VTEwsIDAsCisgICAgICAmZFNpemUsCisgICAgICAoTFBPVkVSTEFQUEVEKSBOVUxMKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LXdpbmRvd3MuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGF4LXdpbmRvd3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM4MjFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oYXgtd2luZG93cy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uCisqKgorKiogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyoqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisqKgorKiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisKKyNpZm5kZWYgX19IQVhfV0lORE9XU19ICisjZGVmaW5lIF9fSEFYX1dJTkRPV1NfSAorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHdpbmlvY3RsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx3aW5kZWYuaD4KKworI2RlZmluZSBIQVhfSU5WQUxJRF9GRCBJTlZBTElEX0hBTkRMRV9WQUxVRQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGF4X21vZF9jbG9zZShzdHJ1Y3QgaGF4X3N0YXRlICpoYXgpCit7CisgICAgQ2xvc2VIYW5kbGUoaGF4LT5mZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXhfY2xvc2VfZmQoaGF4X2ZkIGZkKQoreworICAgIENsb3NlSGFuZGxlKGZkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGF4X2ludmFsaWRfZmQoaGF4X2ZkIGZkKQoreworICAgIHJldHVybiAoZmQgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpOworfQorCisKKyNkZWZpbmUgSEFYX0RFVklDRV9UWVBFIDB4NDAwMAorCisvKiBTZWUgY29tbWVudHMgZm9yIHRoZSBpb2N0bCBpbiBoYXgtZGFyd2luLmggKi8KKyNkZWZpbmUgSEFYX0lPQ1RMX1ZFUlNJT04gICAgICAgQ1RMX0NPREUoSEFYX0RFVklDRV9UWVBFLCAweDkwMCwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX0FOWV9BQ0NFU1MpCisjZGVmaW5lIEhBWF9JT0NUTF9DUkVBVEVfVk0gICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MDEsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorI2RlZmluZSBIQVhfSU9DVExfQ0FQQUJJTElUWSAgICBDVExfQ09ERShIQVhfREVWSUNFX1RZUEUsIDB4OTEwLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykKKworI2RlZmluZSBIQVhfVk1fSU9DVExfVkNQVV9DUkVBVEUgICBDVExfQ09ERShIQVhfREVWSUNFX1RZUEUsIDB4OTAyLCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykKKyNkZWZpbmUgSEFYX1ZNX0lPQ1RMX0FMTE9DX1JBTSAgICAgQ1RMX0NPREUoSEFYX0RFVklDRV9UWVBFLCAweDkwMywgTUVUSE9EX0JVRkZFUkVELCBGSUxFX0FOWV9BQ0NFU1MpCisjZGVmaW5lIEhBWF9WTV9JT0NUTF9TRVRfUkFNICAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MDQsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorCisjZGVmaW5lIEhBWF9WQ1BVX0lPQ1RMX1JVTiAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MDYsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9TRVRfTVNSUyBDVExfQ09ERShIQVhfREVWSUNFX1RZUEUsIDB4OTA3LCBNRVRIT0RfQlVGRkVSRUQsIEZJTEVfQU5ZX0FDQ0VTUykKKyNkZWZpbmUgSEFYX1ZDUFVfSU9DVExfR0VUX01TUlMgQ1RMX0NPREUoSEFYX0RFVklDRV9UWVBFLCAweDkwOCwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX0FOWV9BQ0NFU1MpCisKKyNkZWZpbmUgSEFYX1ZDUFVfSU9DVExfU0VUX0ZQVSAgQ1RMX0NPREUoSEFYX0RFVklDRV9UWVBFLCAweDkwOSwgTUVUSE9EX0JVRkZFUkVELCBGSUxFX0FOWV9BQ0NFU1MpCisjZGVmaW5lIEhBWF9WQ1BVX0lPQ1RMX0dFVF9GUFUgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MGEsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorCisjZGVmaW5lIEhBWF9WQ1BVX0lPQ1RMX1NFVFVQX1RVTk5FTCAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MGIsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorI2RlZmluZSBIQVhfVkNQVV9JT0NUTF9JTlRFUlJVUFQgICAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MGMsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorI2RlZmluZSBIQVhfVkNQVV9TRVRfUkVHUyAgICAgICAgICAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MGQsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorI2RlZmluZSBIQVhfVkNQVV9HRVRfUkVHUyAgICAgICAgICAgICAgIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MGUsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorCisjZGVmaW5lIEhBWF9WTV9JT0NUTF9OT1RJRllfUUVNVV9WRVJTSU9OIENUTF9DT0RFKEhBWF9ERVZJQ0VfVFlQRSwgMHg5MTAsIE1FVEhPRF9CVUZGRVJFRCwgRklMRV9BTllfQUNDRVNTKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaGVscGVyLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTRkOWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hlbHBlci5jCkBAIC0wLDAgKzEsMTgyMCBAQAorLyoKKyAqICBpMzg2IGhlbHBlcnMgKHdpdGhvdXQgcmVnaXN0ZXIgdmFyaWFibGUgdXNhZ2UpCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24gTUEgIDAyMTEwLTEzMDEgVVNBCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInN5c2VtdS9rdm0uaCIKKyNpbmNsdWRlICJleGVjL2hheC5oIgorCisvLyNkZWZpbmUgREVCVUdfTU1VCisKKy8qIGZlYXR1cmUgZmxhZ3MgdGFrZW4gZnJvbSAiSW50ZWwgUHJvY2Vzc29yIElkZW50aWZpY2F0aW9uIGFuZCB0aGUgQ1BVSUQKKyAqIEluc3RydWN0aW9uIiBhbmQgQU1EJ3MgIkNQVUlEIFNwZWNpZmljYXRpb24iLiBJbiBjYXNlcyBvZiBkaXNhZ3JlZW1lbnQKKyAqIGFib3V0IGZlYXR1cmUgbmFtZXMsIHRoZSBMaW51eCBuYW1lIGlzIHVzZWQuICovCitzdGF0aWMgY29uc3QgY2hhciAqZmVhdHVyZV9uYW1lW10gPSB7CisgICAgImZwdSIsICJ2bWUiLCAiZGUiLCAicHNlIiwgInRzYyIsICJtc3IiLCAicGFlIiwgIm1jZSIsCisgICAgImN4OCIsICJhcGljIiwgTlVMTCwgInNlcCIsICJtdHJyIiwgInBnZSIsICJtY2EiLCAiY21vdiIsCisgICAgInBhdCIsICJwc2UzNiIsICJwbiIgLyogSW50ZWwgcHNuICovLCAiY2xmbHVzaCIgLyogSW50ZWwgY2xmc2ggKi8sIE5VTEwsICJkcyIgLyogSW50ZWwgZHRzICovLCAiYWNwaSIsICJtbXgiLAorICAgICJmeHNyIiwgInNzZSIsICJzc2UyIiwgInNzIiwgImh0IiAvKiBJbnRlbCBodHQgKi8sICJ0bSIsICJpYTY0IiwgInBiZSIsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmV4dF9mZWF0dXJlX25hbWVbXSA9IHsKKyAgICAicG5pIiAvKiBJbnRlbCxBTUQgc3NlMyAqLywgTlVMTCwgTlVMTCwgIm1vbml0b3IiLCAiZHNfY3BsIiwgInZteCIsIE5VTEwgLyogTGludXggc214ICovLCAiZXN0IiwKKyAgICAidG0yIiwgInNzc2UzIiwgInNzZTRfMSIsICJzc2U0XzIiLCAiY2lkIiwgTlVMTCwgTlVMTCwgImN4MTYiLCAieHRwciIsIE5VTEwsCisgICAgTlVMTCwgTlVMTCwgImRjYSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsICJwb3BjbnQiLAorICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmV4dDJfZmVhdHVyZV9uYW1lW10gPSB7CisgICAgImZwdSIsICJ2bWUiLCAiZGUiLCAicHNlIiwgInRzYyIsICJtc3IiLCAicGFlIiwgIm1jZSIsCisgICAgImN4OCIgLyogQU1EIENNUFhDSEc4QiAqLywgImFwaWMiLCBOVUxMLCAic3lzY2FsbCIsICJtdHJyIiwgInBnZSIsICJtY2EiLCAiY21vdiIsCisgICAgInBhdCIsICJwc2UzNiIsIE5VTEwsIE5VTEwgLyogTGludXggbXAgKi8sICJueCIgLyogSW50ZWwgeGQgKi8sIE5VTEwsICJtbXhleHQiLCAibW14IiwKKyAgICAiZnhzciIsICJmeHNyX29wdCIgLyogQU1EIGZmeHNyICovLCAicGRwZTFnYiIgLyogQU1EIFBhZ2UxR0IgKi8sICJyZHRzY3AiLCBOVUxMLCAibG0iIC8qIEludGVsIDY0ICovLCAiM2Rub3dleHQiLCAiM2Rub3ciLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICpleHQzX2ZlYXR1cmVfbmFtZVtdID0geworICAgICJsYWhmX2xtIiAvKiBBTUQgTGFoZlNhaGYgKi8sICJjbXBfbGVnYWN5IiwgInN2bSIsICJleHRhcGljIiAvKiBBTUQgRXh0QXBpY1NwYWNlICovLCAiY3I4bGVnYWN5IiAvKiBBTUQgQWx0TW92Q3I4ICovLCAiYWJtIiwgInNzZTRhIiwgIm1pc2FsaWduc3NlIiwKKyAgICAiM2Rub3dwcmVmZXRjaCIsICJvc3Z3IiwgTlVMTCAvKiBMaW51eCBpYnMgKi8sIE5VTEwsICJza2luaXQiLCAid2R0IiwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCit9OworCitzdGF0aWMgdm9pZCBhZGRfZmxhZ25hbWVfdG9fYml0bWFwcyhjaGFyICpmbGFnbmFtZSwgdWludDMyX3QgKmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmV4dF9mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpleHQyX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmV4dDNfZmVhdHVyZXMpCit7CisgICAgaW50IGk7CisgICAgaW50IGZvdW5kID0gMDsKKworICAgIGZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkKKyAgICAgICAgaWYgKGZlYXR1cmVfbmFtZVtpXSAmJiAhc3RyY21wIChmbGFnbmFtZSwgZmVhdHVyZV9uYW1lW2ldKSkgeworICAgICAgICAgICAgKmZlYXR1cmVzIHw9IDEgPDwgaTsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgIGZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkKKyAgICAgICAgaWYgKGV4dF9mZWF0dXJlX25hbWVbaV0gJiYgIXN0cmNtcCAoZmxhZ25hbWUsIGV4dF9mZWF0dXJlX25hbWVbaV0pKSB7CisgICAgICAgICAgICAqZXh0X2ZlYXR1cmVzIHw9IDEgPDwgaTsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgIGZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkKKyAgICAgICAgaWYgKGV4dDJfZmVhdHVyZV9uYW1lW2ldICYmICFzdHJjbXAgKGZsYWduYW1lLCBleHQyX2ZlYXR1cmVfbmFtZVtpXSkpIHsKKyAgICAgICAgICAgICpleHQyX2ZlYXR1cmVzIHw9IDEgPDwgaTsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgIGZvciAoIGkgPSAwIDsgaSA8IDMyIDsgaSsrICkKKyAgICAgICAgaWYgKGV4dDNfZmVhdHVyZV9uYW1lW2ldICYmICFzdHJjbXAgKGZsYWduYW1lLCBleHQzX2ZlYXR1cmVfbmFtZVtpXSkpIHsKKyAgICAgICAgICAgICpleHQzX2ZlYXR1cmVzIHw9IDEgPDwgaTsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDUFUgZmVhdHVyZSAlcyBub3QgZm91bmRcbiIsIGZsYWduYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGt2bV90cmltX2ZlYXR1cmVzKHVpbnQzMl90ICpmZWF0dXJlcywgdWludDMyX3Qgc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MzJfdCBtYXNrOworCisgICAgZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKKyAgICAgICAgbWFzayA9IDFVIDw8IGk7CisgICAgICAgIGlmICgoKmZlYXR1cmVzICYgbWFzaykgJiYgIShzdXBwb3J0ZWQgJiBtYXNrKSkgeworICAgICAgICAgICAgKmZlYXR1cmVzICY9IH5tYXNrOworICAgICAgICB9CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCB4ODZfZGVmX3QgeworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgdWludDMyX3QgbGV2ZWw7CisgICAgdWludDMyX3QgdmVuZG9yMSwgdmVuZG9yMiwgdmVuZG9yMzsKKyAgICBpbnQgZmFtaWx5OworICAgIGludCBtb2RlbDsKKyAgICBpbnQgc3RlcHBpbmc7CisgICAgdWludDMyX3QgZmVhdHVyZXMsIGV4dF9mZWF0dXJlcywgZXh0Ml9mZWF0dXJlcywgZXh0M19mZWF0dXJlczsKKyAgICB1aW50MzJfdCB4bGV2ZWw7CisgICAgY2hhciBtb2RlbF9pZFs0OF07CisgICAgaW50IHZlbmRvcl9vdmVycmlkZTsKK30geDg2X2RlZl90OworCisjZGVmaW5lIEk0ODZfRkVBVFVSRVMgKENQVUlEX0ZQODcgfCBDUFVJRF9WTUUgfCBDUFVJRF9QU0UpCisjZGVmaW5lIFBFTlRJVU1fRkVBVFVSRVMgKEk0ODZfRkVBVFVSRVMgfCBDUFVJRF9ERSB8IENQVUlEX1RTQyB8IFwKKyAgICAgICAgICBDUFVJRF9NU1IgfCBDUFVJRF9NQ0UgfCBDUFVJRF9DWDggfCBDUFVJRF9NTVgpCisjZGVmaW5lIFBFTlRJVU0yX0ZFQVRVUkVTIChQRU5USVVNX0ZFQVRVUkVTIHwgQ1BVSURfUEFFIHwgQ1BVSURfU0VQIHwgXAorICAgICAgICAgIENQVUlEX01UUlIgfCBDUFVJRF9QR0UgfCBDUFVJRF9NQ0EgfCBDUFVJRF9DTU9WIHwgQ1BVSURfUEFUIHwgXAorICAgICAgICAgIENQVUlEX1BTRTM2IHwgQ1BVSURfRlhTUikKKyNkZWZpbmUgUEVOVElVTTNfRkVBVFVSRVMgKFBFTlRJVU0yX0ZFQVRVUkVTIHwgQ1BVSURfU1NFKQorI2RlZmluZSBQUFJPX0ZFQVRVUkVTIChDUFVJRF9GUDg3IHwgQ1BVSURfREUgfCBDUFVJRF9QU0UgfCBDUFVJRF9UU0MgfCBcCisgICAgICAgICAgQ1BVSURfTVNSIHwgQ1BVSURfTUNFIHwgQ1BVSURfQ1g4IHwgQ1BVSURfUEdFIHwgQ1BVSURfQ01PViB8IFwKKyAgICAgICAgICBDUFVJRF9QQVQgfCBDUFVJRF9GWFNSIHwgQ1BVSURfTU1YIHwgQ1BVSURfU1NFIHwgQ1BVSURfU1NFMiB8IFwKKyAgICAgICAgICBDUFVJRF9QQUUgfCBDUFVJRF9TRVAgfCBDUFVJRF9BUElDKQorc3RhdGljIHg4Nl9kZWZfdCB4ODZfZGVmc1tdID0geworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICB7CisgICAgICAgIC5uYW1lID0gInFlbXU2NCIsCisgICAgICAgIC5sZXZlbCA9IDIsCisgICAgICAgIC52ZW5kb3IxID0gQ1BVSURfVkVORE9SX0FNRF8xLAorICAgICAgICAudmVuZG9yMiA9IENQVUlEX1ZFTkRPUl9BTURfMiwKKyAgICAgICAgLnZlbmRvcjMgPSBDUFVJRF9WRU5ET1JfQU1EXzMsCisgICAgICAgIC5mYW1pbHkgPSA2LAorICAgICAgICAubW9kZWwgPSAyLAorICAgICAgICAuc3RlcHBpbmcgPSAzLAorICAgICAgICAuZmVhdHVyZXMgPSBQUFJPX0ZFQVRVUkVTIHwKKyAgICAgICAgLyogdGhlc2UgZmVhdHVyZXMgYXJlIG5lZWRlZCBmb3IgV2luNjQgYW5kIGFyZW4ndCBmdWxseSBpbXBsZW1lbnRlZCAqLworICAgICAgICAgICAgQ1BVSURfTVRSUiB8IENQVUlEX0NMRkxVU0ggfCBDUFVJRF9NQ0EgfAorICAgICAgICAvKiB0aGlzIGZlYXR1cmUgaXMgbmVlZGVkIGZvciBTb2xhcmlzIGFuZCBpc24ndCBmdWxseSBpbXBsZW1lbnRlZCAqLworICAgICAgICAgICAgQ1BVSURfUFNFMzYsCisgICAgICAgIC5leHRfZmVhdHVyZXMgPSBDUFVJRF9FWFRfU1NFMyB8IENQVUlEX0VYVF9TU1NFMyB8CisgICAgICAgICAgICBDUFVJRF9FWFRfU1NFNDEgfCBDUFVJRF9FWFRfU1NFNDIgfCBDUFVJRF9FWFRfUE9QQ05ULAorICAgICAgICAuZXh0Ml9mZWF0dXJlcyA9IChQUFJPX0ZFQVRVUkVTICYgMHgwMTgzRjNGRikgfAorICAgICAgICAgICAgQ1BVSURfRVhUMl9MTSB8IENQVUlEX0VYVDJfU1lTQ0FMTCB8IENQVUlEX0VYVDJfTlggfAorICAgICAgICAgICAgQ1BVSURfRVhUMl8zRE5PVyB8IENQVUlEX0VYVDJfM0ROT1dFWFQsCisgICAgICAgIC5leHQzX2ZlYXR1cmVzID0gQ1BVSURfRVhUM19TVk0sCisgICAgICAgIC54bGV2ZWwgPSAweDgwMDAwMDBBLAorICAgICAgICAubW9kZWxfaWQgPSAiUUVNVSBWaXJ0dWFsIENQVSB2ZXJzaW9uICIgUUVNVV9WRVJTSU9OLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICJwaGVub20iLAorICAgICAgICAubGV2ZWwgPSA1LAorICAgICAgICAudmVuZG9yMSA9IENQVUlEX1ZFTkRPUl9BTURfMSwKKyAgICAgICAgLnZlbmRvcjIgPSBDUFVJRF9WRU5ET1JfQU1EXzIsCisgICAgICAgIC52ZW5kb3IzID0gQ1BVSURfVkVORE9SX0FNRF8zLAorICAgICAgICAuZmFtaWx5ID0gMTYsCisgICAgICAgIC5tb2RlbCA9IDIsCisgICAgICAgIC5zdGVwcGluZyA9IDMsCisgICAgICAgIC8qIE1pc3Npbmc6IENQVUlEX1ZNRSwgQ1BVSURfSFQgKi8KKyAgICAgICAgLmZlYXR1cmVzID0gUFBST19GRUFUVVJFUyB8CisgICAgICAgICAgICBDUFVJRF9NVFJSIHwgQ1BVSURfQ0xGTFVTSCB8IENQVUlEX01DQSB8CisgICAgICAgICAgICBDUFVJRF9QU0UzNiwKKyAgICAgICAgLyogTWlzc2luZzogQ1BVSURfRVhUX0NYMTYsIENQVUlEX0VYVF9QT1BDTlQgKi8KKyAgICAgICAgLmV4dF9mZWF0dXJlcyA9IENQVUlEX0VYVF9TU0UzIHwgQ1BVSURfRVhUX01PTklUT1IsCisgICAgICAgIC8qIE1pc3Npbmc6IENQVUlEX0VYVDJfUERQRTFHQiwgQ1BVSURfRVhUMl9SRFRTQ1AgKi8KKyAgICAgICAgLmV4dDJfZmVhdHVyZXMgPSAoUFBST19GRUFUVVJFUyAmIDB4MDE4M0YzRkYpIHwKKyAgICAgICAgICAgIENQVUlEX0VYVDJfTE0gfCBDUFVJRF9FWFQyX1NZU0NBTEwgfCBDUFVJRF9FWFQyX05YIHwKKyAgICAgICAgICAgIENQVUlEX0VYVDJfM0ROT1cgfCBDUFVJRF9FWFQyXzNETk9XRVhUIHwgQ1BVSURfRVhUMl9NTVhFWFQgfAorICAgICAgICAgICAgQ1BVSURfRVhUMl9GRlhTUiwKKyAgICAgICAgLyogTWlzc2luZzogQ1BVSURfRVhUM19MQUhGX0xNLCBDUFVJRF9FWFQzX0NNUF9MRUcsIENQVUlEX0VYVDNfRVhUQVBJQywKKyAgICAgICAgICAgICAgICAgICAgQ1BVSURfRVhUM19DUjhMRUcsIENQVUlEX0VYVDNfQUJNLCBDUFVJRF9FWFQzX1NTRTRBLAorICAgICAgICAgICAgICAgICAgICBDUFVJRF9FWFQzX01JU0FMSUdOU1NFLCBDUFVJRF9FWFQzXzNETk9XUFJFRkVUQ0gsCisgICAgICAgICAgICAgICAgICAgIENQVUlEX0VYVDNfT1NWVywgQ1BVSURfRVhUM19JQlMgKi8KKyAgICAgICAgLmV4dDNfZmVhdHVyZXMgPSBDUFVJRF9FWFQzX1NWTSwKKyAgICAgICAgLnhsZXZlbCA9IDB4ODAwMDAwMUEsCisgICAgICAgIC5tb2RlbF9pZCA9ICJBTUQgUGhlbm9tKHRtKSA5NTUwIFF1YWQtQ29yZSBQcm9jZXNzb3IiCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gImNvcmUyZHVvIiwKKyAgICAgICAgLmxldmVsID0gMTAsCisgICAgICAgIC5mYW1pbHkgPSA2LAorICAgICAgICAubW9kZWwgPSAxNSwKKyAgICAgICAgLnN0ZXBwaW5nID0gMTEsCisJLyogVGhlIG9yaWdpbmFsIENQVSBhbHNvIGltcGxlbWVudHMgdGhlc2UgZmVhdHVyZXM6CisgICAgICAgICAgICAgICBDUFVJRF9WTUUsIENQVUlEX0RUUywgQ1BVSURfQUNQSSwgQ1BVSURfU1MsIENQVUlEX0hULAorICAgICAgICAgICAgICAgQ1BVSURfVE0sIENQVUlEX1BCRSAqLworICAgICAgICAuZmVhdHVyZXMgPSBQUFJPX0ZFQVRVUkVTIHwKKyAgICAgICAgICAgIENQVUlEX01UUlIgfCBDUFVJRF9DTEZMVVNIIHwgQ1BVSURfTUNBIHwKKyAgICAgICAgICAgIENQVUlEX1BTRTM2LAorCS8qIFRoZSBvcmlnaW5hbCBDUFUgYWxzbyBpbXBsZW1lbnRzIHRoZXNlIGV4dCBmZWF0dXJlczoKKyAgICAgICAgICAgICAgIENQVUlEX0VYVF9EVEVTNjQsIENQVUlEX0VYVF9EU0NQTCwgQ1BVSURfRVhUX1ZNWCwgQ1BVSURfRVhUX0VTVCwKKyAgICAgICAgICAgICAgIENQVUlEX0VYVF9UTTIsIENQVUlEX0VYVF9DWDE2LCBDUFVJRF9FWFRfWFRQUiwgQ1BVSURfRVhUX1BEQ00gKi8KKyAgICAgICAgLmV4dF9mZWF0dXJlcyA9IENQVUlEX0VYVF9TU0UzIHwgQ1BVSURfRVhUX01PTklUT1IgfCBDUFVJRF9FWFRfU1NTRTMsCisgICAgICAgIC5leHQyX2ZlYXR1cmVzID0gQ1BVSURfRVhUMl9MTSB8IENQVUlEX0VYVDJfU1lTQ0FMTCB8IENQVUlEX0VYVDJfTlgsCisgICAgICAgIC8qIE1pc3Npbmc6IC5leHQzX2ZlYXR1cmVzID0gQ1BVSURfRVhUM19MQUhGX0xNICovCisgICAgICAgIC54bGV2ZWwgPSAweDgwMDAwMDA4LAorICAgICAgICAubW9kZWxfaWQgPSAiSW50ZWwoUikgQ29yZShUTSkyIER1byBDUFUgICAgIFQ3NzAwICBAIDIuNDBHSHoiLAorICAgIH0sCisjZW5kaWYKKyAgICB7CisgICAgICAgIC5uYW1lID0gInFlbXUzMiIsCisgICAgICAgIC5sZXZlbCA9IDIsCisgICAgICAgIC5mYW1pbHkgPSA2LAorICAgICAgICAubW9kZWwgPSAzLAorICAgICAgICAuc3RlcHBpbmcgPSAzLAorICAgICAgICAuZmVhdHVyZXMgPSBQUFJPX0ZFQVRVUkVTLAorICAgICAgICAuZXh0X2ZlYXR1cmVzID0gQ1BVSURfRVhUX1NTRTMgfCBDUFVJRF9FWFRfU1NTRTMsCisgICAgICAgIC54bGV2ZWwgPSAwLAorICAgICAgICAubW9kZWxfaWQgPSAiUUVNVSBWaXJ0dWFsIENQVSB2ZXJzaW9uICIgUUVNVV9WRVJTSU9OLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICJjb3JlZHVvIiwKKyAgICAgICAgLmxldmVsID0gMTAsCisgICAgICAgIC5mYW1pbHkgPSA2LAorICAgICAgICAubW9kZWwgPSAxNCwKKyAgICAgICAgLnN0ZXBwaW5nID0gOCwKKyAgICAgICAgLyogVGhlIG9yaWdpbmFsIENQVSBhbHNvIGltcGxlbWVudHMgdGhlc2UgZmVhdHVyZXM6CisgICAgICAgICAgICAgICBDUFVJRF9EVFMsIENQVUlEX0FDUEksIENQVUlEX1NTLCBDUFVJRF9IVCwKKyAgICAgICAgICAgICAgIENQVUlEX1RNLCBDUFVJRF9QQkUgKi8KKyAgICAgICAgLmZlYXR1cmVzID0gUFBST19GRUFUVVJFUyB8IENQVUlEX1ZNRSB8CisgICAgICAgICAgICBDUFVJRF9NVFJSIHwgQ1BVSURfQ0xGTFVTSCB8IENQVUlEX01DQSwKKyAgICAgICAgLyogVGhlIG9yaWdpbmFsIENQVSBhbHNvIGltcGxlbWVudHMgdGhlc2UgZXh0IGZlYXR1cmVzOgorICAgICAgICAgICAgICAgQ1BVSURfRVhUX1ZNWCwgQ1BVSURfRVhUX0VTVCwgQ1BVSURfRVhUX1RNMiwgQ1BVSURfRVhUX1hUUFIsCisgICAgICAgICAgICAgICBDUFVJRF9FWFRfUERDTSAqLworICAgICAgICAuZXh0X2ZlYXR1cmVzID0gQ1BVSURfRVhUX1NTRTMgfCBDUFVJRF9FWFRfTU9OSVRPUiwKKyAgICAgICAgLmV4dDJfZmVhdHVyZXMgPSBDUFVJRF9FWFQyX05YLAorICAgICAgICAueGxldmVsID0gMHg4MDAwMDAwOCwKKyAgICAgICAgLm1vZGVsX2lkID0gIkdlbnVpbmUgSW50ZWwoUikgQ1BVICAgICAgICAgICBUMjYwMCAgQCAyLjE2R0h6IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiNDg2IiwKKyAgICAgICAgLmxldmVsID0gMCwKKyAgICAgICAgLmZhbWlseSA9IDQsCisgICAgICAgIC5tb2RlbCA9IDAsCisgICAgICAgIC5zdGVwcGluZyA9IDAsCisgICAgICAgIC5mZWF0dXJlcyA9IEk0ODZfRkVBVFVSRVMsCisgICAgICAgIC54bGV2ZWwgPSAwLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICJwZW50aXVtIiwKKyAgICAgICAgLmxldmVsID0gMSwKKyAgICAgICAgLmZhbWlseSA9IDUsCisgICAgICAgIC5tb2RlbCA9IDQsCisgICAgICAgIC5zdGVwcGluZyA9IDMsCisgICAgICAgIC5mZWF0dXJlcyA9IFBFTlRJVU1fRkVBVFVSRVMsCisgICAgICAgIC54bGV2ZWwgPSAwLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICJwZW50aXVtMiIsCisgICAgICAgIC5sZXZlbCA9IDIsCisgICAgICAgIC5mYW1pbHkgPSA2LAorICAgICAgICAubW9kZWwgPSA1LAorICAgICAgICAuc3RlcHBpbmcgPSAyLAorICAgICAgICAuZmVhdHVyZXMgPSBQRU5USVVNMl9GRUFUVVJFUywKKyAgICAgICAgLnhsZXZlbCA9IDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gInBlbnRpdW0zIiwKKyAgICAgICAgLmxldmVsID0gMiwKKyAgICAgICAgLmZhbWlseSA9IDYsCisgICAgICAgIC5tb2RlbCA9IDcsCisgICAgICAgIC5zdGVwcGluZyA9IDMsCisgICAgICAgIC5mZWF0dXJlcyA9IFBFTlRJVU0zX0ZFQVRVUkVTLAorICAgICAgICAueGxldmVsID0gMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiYXRobG9uIiwKKyAgICAgICAgLmxldmVsID0gMiwKKyAgICAgICAgLnZlbmRvcjEgPSAweDY4NzQ3NTQxLCAvKiAiQXV0aCIgKi8KKyAgICAgICAgLnZlbmRvcjIgPSAweDY5NzQ2ZTY1LCAvKiAiZW50aSIgKi8KKyAgICAgICAgLnZlbmRvcjMgPSAweDQ0NGQ0MTYzLCAvKiAiY0FNRCIgKi8KKyAgICAgICAgLmZhbWlseSA9IDYsCisgICAgICAgIC5tb2RlbCA9IDIsCisgICAgICAgIC5zdGVwcGluZyA9IDMsCisgICAgICAgIC5mZWF0dXJlcyA9IFBQUk9fRkVBVFVSRVMgfCBDUFVJRF9QU0UzNiB8IENQVUlEX1ZNRSB8IENQVUlEX01UUlIgfCBDUFVJRF9NQ0EsCisgICAgICAgIC5leHQyX2ZlYXR1cmVzID0gKFBQUk9fRkVBVFVSRVMgJiAweDAxODNGM0ZGKSB8IENQVUlEX0VYVDJfTU1YRVhUIHwgQ1BVSURfRVhUMl8zRE5PVyB8IENQVUlEX0VYVDJfM0ROT1dFWFQsCisgICAgICAgIC54bGV2ZWwgPSAweDgwMDAwMDA4LAorICAgICAgICAvKiBYWFg6IHB1dCBhbm90aGVyIHN0cmluZyA/ICovCisgICAgICAgIC5tb2RlbF9pZCA9ICJRRU1VIFZpcnR1YWwgQ1BVIHZlcnNpb24gIiBRRU1VX1ZFUlNJT04sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gIm4yNzAiLAorICAgICAgICAvKiBvcmlnaW5hbCBpcyBvbiBsZXZlbCAxMCAqLworICAgICAgICAubGV2ZWwgPSA1LAorICAgICAgICAuZmFtaWx5ID0gNiwKKyAgICAgICAgLm1vZGVsID0gMjgsCisgICAgICAgIC5zdGVwcGluZyA9IDIsCisgICAgICAgIC5mZWF0dXJlcyA9IFBQUk9fRkVBVFVSRVMgfAorICAgICAgICAgICAgQ1BVSURfTVRSUiB8IENQVUlEX0NMRkxVU0ggfCBDUFVJRF9NQ0EgfCBDUFVJRF9WTUUsCisgICAgICAgICAgICAvKiBNaXNzaW5nOiBDUFVJRF9EVFMgfCBDUFVJRF9BQ1BJIHwgQ1BVSURfU1MgfAorICAgICAgICAgICAgICogQ1BVSURfSFQgfCBDUFVJRF9UTSB8IENQVUlEX1BCRSAqLworICAgICAgICAgICAgLyogU29tZSBDUFVzIGdvdCBubyBDUFVJRF9TRVAgKi8KKyAgICAgICAgLmV4dF9mZWF0dXJlcyA9IENQVUlEX0VYVF9NT05JVE9SIHwKKyAgICAgICAgICAgIENQVUlEX0VYVF9TU0UzIC8qIFBOSSAqLyB8IENQVUlEX0VYVF9TU1NFMywKKyAgICAgICAgICAgIC8qIE1pc3Npbmc6IENQVUlEX0VYVF9EU0NQTCB8IENQVUlEX0VYVF9FU1QgfAorICAgICAgICAgICAgICogQ1BVSURfRVhUX1RNMiB8IENQVUlEX0VYVF9YVFBSICovCisgICAgICAgIC5leHQyX2ZlYXR1cmVzID0gKFBQUk9fRkVBVFVSRVMgJiAweDAxODNGM0ZGKSB8IENQVUlEX0VYVDJfTlgsCisgICAgICAgIC8qIE1pc3Npbmc6IC5leHQzX2ZlYXR1cmVzID0gQ1BVSURfRVhUM19MQUhGX0xNICovCisgICAgICAgIC54bGV2ZWwgPSAweDgwMDAwMDBBLAorICAgICAgICAubW9kZWxfaWQgPSAiSW50ZWwoUikgQXRvbShUTSkgQ1BVIE4yNzAgICBAIDEuNjBHSHoiLAorICAgIH0sCit9OworCitzdGF0aWMgaW50IGNwdV94ODZfZmluZF9ieV9uYW1lKHg4Nl9kZWZfdCAqeDg2X2NwdV9kZWYsIGNvbnN0IGNoYXIgKmNwdV9tb2RlbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB4ODZfZGVmX3QgKmRlZjsKKworICAgIGNoYXIgKnMgPSBzdHJkdXAoY3B1X21vZGVsKTsKKyAgICBjaGFyICpmZWF0dXJlc3RyLCAqbmFtZSA9IHN0cnRvayhzLCAiLCIpOworICAgIHVpbnQzMl90IHBsdXNfZmVhdHVyZXMgPSAwLCBwbHVzX2V4dF9mZWF0dXJlcyA9IDAsIHBsdXNfZXh0Ml9mZWF0dXJlcyA9IDAsIHBsdXNfZXh0M19mZWF0dXJlcyA9IDA7CisgICAgdWludDMyX3QgbWludXNfZmVhdHVyZXMgPSAwLCBtaW51c19leHRfZmVhdHVyZXMgPSAwLCBtaW51c19leHQyX2ZlYXR1cmVzID0gMCwgbWludXNfZXh0M19mZWF0dXJlcyA9IDA7CisgICAgaW50IGZhbWlseSA9IC0xLCBtb2RlbCA9IC0xLCBzdGVwcGluZyA9IC0xOworCisgICAgZGVmID0gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4ODZfZGVmcyk7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG5hbWUsIHg4Nl9kZWZzW2ldLm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGRlZiA9ICZ4ODZfZGVmc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZGVmKQorICAgICAgICBnb3RvIGVycm9yOworICAgIG1lbWNweSh4ODZfY3B1X2RlZiwgZGVmLCBzaXplb2YoKmRlZikpOworCisgICAgZmVhdHVyZXN0ciA9IHN0cnRvayhOVUxMLCAiLCIpOworCisgICAgd2hpbGUgKGZlYXR1cmVzdHIpIHsKKyAgICAgICAgY2hhciAqdmFsOworICAgICAgICBpZiAoZmVhdHVyZXN0clswXSA9PSAnKycpIHsKKyAgICAgICAgICAgIGFkZF9mbGFnbmFtZV90b19iaXRtYXBzKGZlYXR1cmVzdHIgKyAxLCAmcGx1c19mZWF0dXJlcywgJnBsdXNfZXh0X2ZlYXR1cmVzLCAmcGx1c19leHQyX2ZlYXR1cmVzLCAmcGx1c19leHQzX2ZlYXR1cmVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmZWF0dXJlc3RyWzBdID09ICctJykgeworICAgICAgICAgICAgYWRkX2ZsYWduYW1lX3RvX2JpdG1hcHMoZmVhdHVyZXN0ciArIDEsICZtaW51c19mZWF0dXJlcywgJm1pbnVzX2V4dF9mZWF0dXJlcywgJm1pbnVzX2V4dDJfZmVhdHVyZXMsICZtaW51c19leHQzX2ZlYXR1cmVzKTsKKyAgICAgICAgfSBlbHNlIGlmICgodmFsID0gc3RyY2hyKGZlYXR1cmVzdHIsICc9JykpKSB7CisgICAgICAgICAgICAqdmFsID0gMDsgdmFsKys7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChmZWF0dXJlc3RyLCAiZmFtaWx5IikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICplcnI7CisgICAgICAgICAgICAgICAgZmFtaWx5ID0gc3RydG9sKHZhbCwgJmVyciwgMTApOworICAgICAgICAgICAgICAgIGlmICghKnZhbCB8fCAqZXJyIHx8IGZhbWlseSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgbnVtZXJpY2FsIHZhbHVlICVzXG4iLCB2YWwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+ZmFtaWx5ID0gZmFtaWx5OworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGZlYXR1cmVzdHIsICJtb2RlbCIpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqZXJyOworICAgICAgICAgICAgICAgIG1vZGVsID0gc3RydG9sKHZhbCwgJmVyciwgMTApOworICAgICAgICAgICAgICAgIGlmICghKnZhbCB8fCAqZXJyIHx8IG1vZGVsIDwgMCB8fCBtb2RlbCA+IDB4ZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgbnVtZXJpY2FsIHZhbHVlICVzXG4iLCB2YWwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+bW9kZWwgPSBtb2RlbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChmZWF0dXJlc3RyLCAic3RlcHBpbmciKSkgeworICAgICAgICAgICAgICAgIGNoYXIgKmVycjsKKyAgICAgICAgICAgICAgICBzdGVwcGluZyA9IHN0cnRvbCh2YWwsICZlcnIsIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoISp2YWwgfHwgKmVyciB8fCBzdGVwcGluZyA8IDAgfHwgc3RlcHBpbmcgPiAweGYpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgbnVtZXJpY2FsIHZhbHVlICVzXG4iLCB2YWwpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+c3RlcHBpbmcgPSBzdGVwcGluZzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChmZWF0dXJlc3RyLCAidmVuZG9yIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RybGVuKHZhbCkgIT0gMTIpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ2ZW5kb3Igc3RyaW5nIG11c3QgYmUgMTIgY2hhcnMgbG9uZ1xuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHg4Nl9jcHVfZGVmLT52ZW5kb3IxID0gMDsKKyAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+dmVuZG9yMiA9IDA7CisgICAgICAgICAgICAgICAgeDg2X2NwdV9kZWYtPnZlbmRvcjMgPSAwOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+dmVuZG9yMSB8PSAoKHVpbnQ4X3QpdmFsW2kgICAgXSkgPDwgKDggKiBpKTsKKyAgICAgICAgICAgICAgICAgICAgeDg2X2NwdV9kZWYtPnZlbmRvcjIgfD0gKCh1aW50OF90KXZhbFtpICsgNF0pIDw8ICg4ICogaSk7CisgICAgICAgICAgICAgICAgICAgIHg4Nl9jcHVfZGVmLT52ZW5kb3IzIHw9ICgodWludDhfdCl2YWxbaSArIDhdKSA8PCAoOCAqIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4ODZfY3B1X2RlZi0+dmVuZG9yX292ZXJyaWRlID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChmZWF0dXJlc3RyLCAibW9kZWxfaWQiKSkgeworICAgICAgICAgICAgICAgIHBzdHJjcHkoeDg2X2NwdV9kZWYtPm1vZGVsX2lkLCBzaXplb2YoeDg2X2NwdV9kZWYtPm1vZGVsX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5yZWNvZ25pemVkIGZlYXR1cmUgJXNcbiIsIGZlYXR1cmVzdHIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZlYXR1cmUgc3RyaW5nIGAlcycgbm90IGluIGZvcm1hdCAoK2ZlYXR1cmV8LWZlYXR1cmV8ZmVhdHVyZT14eXopXG4iLCBmZWF0dXJlc3RyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZmVhdHVyZXN0ciA9IHN0cnRvayhOVUxMLCAiLCIpOworICAgIH0KKyAgICB4ODZfY3B1X2RlZi0+ZmVhdHVyZXMgfD0gcGx1c19mZWF0dXJlczsKKyAgICB4ODZfY3B1X2RlZi0+ZXh0X2ZlYXR1cmVzIHw9IHBsdXNfZXh0X2ZlYXR1cmVzOworICAgIHg4Nl9jcHVfZGVmLT5leHQyX2ZlYXR1cmVzIHw9IHBsdXNfZXh0Ml9mZWF0dXJlczsKKyAgICB4ODZfY3B1X2RlZi0+ZXh0M19mZWF0dXJlcyB8PSBwbHVzX2V4dDNfZmVhdHVyZXM7CisgICAgeDg2X2NwdV9kZWYtPmZlYXR1cmVzICY9IH5taW51c19mZWF0dXJlczsKKyAgICB4ODZfY3B1X2RlZi0+ZXh0X2ZlYXR1cmVzICY9IH5taW51c19leHRfZmVhdHVyZXM7CisgICAgeDg2X2NwdV9kZWYtPmV4dDJfZmVhdHVyZXMgJj0gfm1pbnVzX2V4dDJfZmVhdHVyZXM7CisgICAgeDg2X2NwdV9kZWYtPmV4dDNfZmVhdHVyZXMgJj0gfm1pbnVzX2V4dDNfZmVhdHVyZXM7CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgZnJlZShzKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3ZvaWQgeDg2X2NwdV9saXN0IChGSUxFICpmLCBpbnQgKCpjcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeDg2X2RlZnMpOyBpKyspCisgICAgICAgICgqY3B1X2ZwcmludGYpKGYsICJ4ODYgJTE2c1xuIiwgeDg2X2RlZnNbaV0ubmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY3B1X3g4Nl9yZWdpc3RlciAoQ1BVWDg2U3RhdGUgKmVudiwgY29uc3QgY2hhciAqY3B1X21vZGVsKQoreworICAgIHg4Nl9kZWZfdCBkZWYxLCAqZGVmID0gJmRlZjE7CisKKyAgICBpZiAoY3B1X3g4Nl9maW5kX2J5X25hbWUoZGVmLCBjcHVfbW9kZWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChkZWYtPnZlbmRvcjEpIHsKKyAgICAgICAgZW52LT5jcHVpZF92ZW5kb3IxID0gZGVmLT52ZW5kb3IxOworICAgICAgICBlbnYtPmNwdWlkX3ZlbmRvcjIgPSBkZWYtPnZlbmRvcjI7CisgICAgICAgIGVudi0+Y3B1aWRfdmVuZG9yMyA9IGRlZi0+dmVuZG9yMzsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPmNwdWlkX3ZlbmRvcjEgPSBDUFVJRF9WRU5ET1JfSU5URUxfMTsKKyAgICAgICAgZW52LT5jcHVpZF92ZW5kb3IyID0gQ1BVSURfVkVORE9SX0lOVEVMXzI7CisgICAgICAgIGVudi0+Y3B1aWRfdmVuZG9yMyA9IENQVUlEX1ZFTkRPUl9JTlRFTF8zOworICAgIH0KKyAgICBlbnYtPmNwdWlkX3ZlbmRvcl9vdmVycmlkZSA9IGRlZi0+dmVuZG9yX292ZXJyaWRlOworICAgIGVudi0+Y3B1aWRfbGV2ZWwgPSBkZWYtPmxldmVsOworICAgIGlmIChkZWYtPmZhbWlseSA+IDB4MGYpCisgICAgICAgIGVudi0+Y3B1aWRfdmVyc2lvbiA9IDB4ZjAwIHwgKChkZWYtPmZhbWlseSAtIDB4MGYpIDw8IDIwKTsKKyAgICBlbHNlCisgICAgICAgIGVudi0+Y3B1aWRfdmVyc2lvbiA9IGRlZi0+ZmFtaWx5IDw8IDg7CisgICAgZW52LT5jcHVpZF92ZXJzaW9uIHw9ICgoZGVmLT5tb2RlbCAmIDB4ZikgPDwgNCkgfCAoKGRlZi0+bW9kZWwgPj4gNCkgPDwgMTYpOworICAgIGVudi0+Y3B1aWRfdmVyc2lvbiB8PSBkZWYtPnN0ZXBwaW5nOworICAgIGVudi0+Y3B1aWRfZmVhdHVyZXMgPSBkZWYtPmZlYXR1cmVzOworICAgIGVudi0+cGF0ID0gMHgwMDA3MDQwNjAwMDcwNDA2VUxMOworICAgIGVudi0+Y3B1aWRfZXh0X2ZlYXR1cmVzID0gZGVmLT5leHRfZmVhdHVyZXM7CisgICAgZW52LT5jcHVpZF9leHQyX2ZlYXR1cmVzID0gZGVmLT5leHQyX2ZlYXR1cmVzOworICAgIGVudi0+Y3B1aWRfeGxldmVsID0gZGVmLT54bGV2ZWw7CisgICAgZW52LT5jcHVpZF9leHQzX2ZlYXR1cmVzID0gZGVmLT5leHQzX2ZlYXR1cmVzOworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqbW9kZWxfaWQgPSBkZWYtPm1vZGVsX2lkOworICAgICAgICBpbnQgYywgbGVuLCBpOworICAgICAgICBpZiAoIW1vZGVsX2lkKQorICAgICAgICAgICAgbW9kZWxfaWQgPSAiIjsKKyAgICAgICAgbGVuID0gc3RybGVuKG1vZGVsX2lkKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDg7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPj0gbGVuKQorICAgICAgICAgICAgICAgIGMgPSAnXDAnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgPSAodWludDhfdCltb2RlbF9pZFtpXTsKKyAgICAgICAgICAgIGVudi0+Y3B1aWRfbW9kZWxbaSA+PiAyXSB8PSBjIDw8ICg4ICogKGkgJiAzKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIE5PVEU6IG11c3QgYmUgY2FsbGVkIG91dHNpZGUgdGhlIENQVSBleGVjdXRlIGxvb3AgKi8KK3ZvaWQgY3B1X3Jlc2V0KENQVVN0YXRlICpjcHUpCit7CisgICAgQ1BVWDg2U3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICBpbnQgaTsKKworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19SRVNFVCkpIHsKKyAgICAgICAgcWVtdV9sb2coIkNQVSBSZXNldCAoQ1BVICVkKVxuIiwgY3B1LT5jcHVfaW5kZXgpOworICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgWDg2X0RVTVBfRlBVIHwgWDg2X0RVTVBfQ0NPUCk7CisgICAgfQorCisgICAgbWVtc2V0KGVudiwgMCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGJyZWFrcG9pbnRzKSk7CisKKyAgICB0bGJfZmx1c2goZW52LCAxKTsKKworICAgIGVudi0+b2xkX2V4Y2VwdGlvbiA9IC0xOworCisgICAgLyogaW5pdCB0byByZXNldCBzdGF0ZSAqLworCisjaWZkZWYgQ09ORklHX1NPRlRNTVUKKyAgICBlbnYtPmhmbGFncyB8PSBIRl9TT0ZUTU1VX01BU0s7CisjZW5kaWYKKyAgICBlbnYtPmhmbGFnczIgfD0gSEYyX0dJRl9NQVNLOworCisgICAgY3B1X3g4Nl91cGRhdGVfY3IwKGVudiwgMHg2MDAwMDAxMCk7CisgICAgZW52LT5hMjBfbWFzayA9IH4weDA7CisgICAgZW52LT5zbWJhc2UgPSAweDMwMDAwOworCisgICAgZW52LT5pZHQubGltaXQgPSAweGZmZmY7CisgICAgZW52LT5nZHQubGltaXQgPSAweGZmZmY7CisgICAgZW52LT5sZHQubGltaXQgPSAweGZmZmY7CisgICAgZW52LT5sZHQuZmxhZ3MgPSBERVNDX1BfTUFTSyB8ICgyIDw8IERFU0NfVFlQRV9TSElGVCk7CisgICAgZW52LT50ci5saW1pdCA9IDB4ZmZmZjsKKyAgICBlbnYtPnRyLmZsYWdzID0gREVTQ19QX01BU0sgfCAoMTEgPDwgREVTQ19UWVBFX1NISUZUKTsKKworICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0NTLCAweGYwMDAsIDB4ZmZmZjAwMDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX0NTX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19SX01BU0sgfCBERVNDX0FfTUFTSyk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRFMsIDAsIDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX1dfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0FfTUFTSyk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRVMsIDAsIDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX1dfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0FfTUFTSyk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfU1MsIDAsIDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX1dfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0FfTUFTSyk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRlMsIDAsIDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX1dfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0FfTUFTSyk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfR1MsIDAsIDAsIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfUF9NQVNLIHwgREVTQ19TX01BU0sgfCBERVNDX1dfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0FfTUFTSyk7CisKKyAgICBlbnYtPmVpcCA9IDB4ZmZmMDsKKyAgICBlbnYtPnJlZ3NbUl9FRFhdID0gZW52LT5jcHVpZF92ZXJzaW9uOworCisgICAgZW52LT5lZmxhZ3MgPSAweDI7CisKKyAgICAvKiBGUFUgaW5pdCAqLworICAgIGZvcihpID0gMDtpIDwgODsgaSsrKQorICAgICAgICBlbnYtPmZwdGFnc1tpXSA9IDE7CisgICAgZW52LT5mcHVjID0gMHgzN2Y7CisKKyAgICBlbnYtPm14Y3NyID0gMHgxZjgwOworCisgICAgbWVtc2V0KGVudi0+ZHIsIDAsIHNpemVvZihlbnYtPmRyKSk7CisgICAgZW52LT5kcls2XSA9IERSNl9GSVhFRF8xOworICAgIGVudi0+ZHJbN10gPSBEUjdfRklYRURfMTsKKyAgICBjcHVfYnJlYWtwb2ludF9yZW1vdmVfYWxsKGVudiwgQlBfQ1BVKTsKKyAgICBjcHVfd2F0Y2hwb2ludF9yZW1vdmVfYWxsKGVudiwgQlBfQ1BVKTsKK30KKwordm9pZCBjcHVfeDg2X2Nsb3NlKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisgICAgZ19mcmVlKGNwdSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHg4NiBkZWJ1ZyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY2Nfb3Bfc3RyW10gPSB7CisgICAgIkRZTkFNSUMiLAorICAgICJFRkxBR1MiLAorCisgICAgIk1VTEIiLAorICAgICJNVUxXIiwKKyAgICAiTVVMTCIsCisgICAgIk1VTFEiLAorCisgICAgIkFEREIiLAorICAgICJBRERXIiwKKyAgICAiQURETCIsCisgICAgIkFERFEiLAorCisgICAgIkFEQ0IiLAorICAgICJBRENXIiwKKyAgICAiQURDTCIsCisgICAgIkFEQ1EiLAorCisgICAgIlNVQkIiLAorICAgICJTVUJXIiwKKyAgICAiU1VCTCIsCisgICAgIlNVQlEiLAorCisgICAgIlNCQkIiLAorICAgICJTQkJXIiwKKyAgICAiU0JCTCIsCisgICAgIlNCQlEiLAorCisgICAgIkxPR0lDQiIsCisgICAgIkxPR0lDVyIsCisgICAgIkxPR0lDTCIsCisgICAgIkxPR0lDUSIsCisKKyAgICAiSU5DQiIsCisgICAgIklOQ1ciLAorICAgICJJTkNMIiwKKyAgICAiSU5DUSIsCisKKyAgICAiREVDQiIsCisgICAgIkRFQ1ciLAorICAgICJERUNMIiwKKyAgICAiREVDUSIsCisKKyAgICAiU0hMQiIsCisgICAgIlNITFciLAorICAgICJTSExMIiwKKyAgICAiU0hMUSIsCisKKyAgICAiU0FSQiIsCisgICAgIlNBUlciLAorICAgICJTQVJMIiwKKyAgICAiU0FSUSIsCit9OworCitzdGF0aWMgdm9pZAorY3B1X3g4Nl9kdW1wX3NlZ19jYWNoZShDUFVYODZTdGF0ZSAqZW52LCBGSUxFICpmLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpjcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgU2VnbWVudENhY2hlICpzYykKK3sKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLKSB7CisgICAgICAgIGNwdV9mcHJpbnRmKGYsICIlLTNzPSUwNHggJTAxNiIgUFJJeDY0ICIgJTA4eCAlMDh4IiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc2MtPnNlbGVjdG9yLCBzYy0+YmFzZSwgc2MtPmxpbWl0LCBzYy0+ZmxhZ3MpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBjcHVfZnByaW50ZihmLCAiJS0zcz0lMDR4ICUwOHggJTA4eCAlMDh4IiwgbmFtZSwgc2MtPnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2MtPmJhc2UsIHNjLT5saW1pdCwgc2MtPmZsYWdzKTsKKyAgICB9CisKKyAgICBpZiAoIShlbnYtPmhmbGFncyAmIEhGX1BFX01BU0spIHx8ICEoc2MtPmZsYWdzICYgREVTQ19QX01BU0spKQorICAgICAgICBnb3RvIGRvbmU7CisKKyAgICBjcHVfZnByaW50ZihmLCAiIERQTD0lZCAiLCAoc2MtPmZsYWdzICYgREVTQ19EUExfTUFTSykgPj4gREVTQ19EUExfU0hJRlQpOworICAgIGlmIChzYy0+ZmxhZ3MgJiBERVNDX1NfTUFTSykgeworICAgICAgICBpZiAoc2MtPmZsYWdzICYgREVTQ19DU19NQVNLKSB7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAoc2MtPmZsYWdzICYgREVTQ19MX01BU0spID8gIkNTNjQiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc2MtPmZsYWdzICYgREVTQ19CX01BU0spID8gIkNTMzIiIDogIkNTMTYiKSk7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiIFslYyVjIiwgKHNjLT5mbGFncyAmIERFU0NfQ19NQVNLKSA/ICdDJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgICAgIChzYy0+ZmxhZ3MgJiBERVNDX1JfTUFTSykgPyAnUicgOiAnLScpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3B1X2ZwcmludGYoZiwgKHNjLT5mbGFncyAmIERFU0NfQl9NQVNLKSA/ICJEUyAgIiA6ICJEUzE2Iik7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiIFslYyVjIiwgKHNjLT5mbGFncyAmIERFU0NfRV9NQVNLKSA/ICdFJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgICAgIChzYy0+ZmxhZ3MgJiBERVNDX1dfTUFTSykgPyAnVycgOiAnLScpOworICAgICAgICB9CisgICAgICAgIGNwdV9mcHJpbnRmKGYsICIlY10iLCAoc2MtPmZsYWdzICYgREVTQ19BX01BU0spID8gJ0EnIDogJy0nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqc3lzX3R5cGVfbmFtZVsyXVsxNl0gPSB7CisgICAgICAgICAgICB7IC8qIDMyIGJpdCBtb2RlICovCisgICAgICAgICAgICAgICAgIlJlc2VydmVkIiwgIlRTUzE2LWF2bCIsICJMRFQiLCAiVFNTMTYtYnVzeSIsCisgICAgICAgICAgICAgICAgIkNhbGxHYXRlMTYiLCAiVGFza0dhdGUiLCAiSW50R2F0ZTE2IiwgIlRyYXBHYXRlMTYiLAorICAgICAgICAgICAgICAgICJSZXNlcnZlZCIsICJUU1MzMi1hdmwiLCAiUmVzZXJ2ZWQiLCAiVFNTMzItYnVzeSIsCisgICAgICAgICAgICAgICAgIkNhbGxHYXRlMzIiLCAiUmVzZXJ2ZWQiLCAiSW50R2F0ZTMyIiwgIlRyYXBHYXRlMzIiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeyAvKiA2NCBiaXQgbW9kZSAqLworICAgICAgICAgICAgICAgICI8aGl3b3JkPiIsICJSZXNlcnZlZCIsICJMRFQiLCAiUmVzZXJ2ZWQiLCAiUmVzZXJ2ZWQiLAorICAgICAgICAgICAgICAgICJSZXNlcnZlZCIsICJSZXNlcnZlZCIsICJSZXNlcnZlZCIsICJSZXNlcnZlZCIsCisgICAgICAgICAgICAgICAgIlRTUzY0LWF2bCIsICJSZXNlcnZlZCIsICJUU1M2NC1idXN5IiwgIkNhbGxHYXRlNjQiLAorICAgICAgICAgICAgICAgICJSZXNlcnZlZCIsICJJbnRHYXRlNjQiLCAiVHJhcEdhdGU2NCIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgc3lzX3R5cGVfbmFtZVsoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgPyAxIDogMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2MtPmZsYWdzICYgREVTQ19UWVBFX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gREVTQ19UWVBFX1NISUZUXSk7CisgICAgfQorZG9uZToKKyAgICBjcHVfZnByaW50ZihmLCAiXG4iKTsKK30KKwordm9pZCBjcHVfZHVtcF9zdGF0ZShDUFVTdGF0ZSAqY3B1LCBGSUxFICpmLAorICAgICAgICAgICAgICAgICAgICBpbnQgKCpjcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgQ1BVWDg2U3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICBpbnQgZWZsYWdzLCBpLCBuYjsKKyAgICBjaGFyIGNjX29wX25hbWVbMzJdOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpzZWdfbmFtZVs2XSA9IHsgIkVTIiwgIkNTIiwgIlNTIiwgIkRTIiwgIkZTIiwgIkdTIiB9OworCisgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgIGt2bV9hcmNoX2dldF9yZWdpc3RlcnMoY3B1KTsKKworI2lmZGVmIENPTkZJR19IQVgKKyAgICBpZiAoaGF4X2VuYWJsZWQoKSkKKyAgICAgICAgaGF4X2FyY2hfZ2V0X3JlZ2lzdGVycyhjcHUpOworI2VuZGlmCisKKyAgICBlZmxhZ3MgPSBlbnYtPmVmbGFnczsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLKSB7CisgICAgICAgIGNwdV9mcHJpbnRmKGYsCisgICAgICAgICAgICAgICAgICAgICJSQVg9JTAxNiIgUFJJeDY0ICIgUkJYPSUwMTYiIFBSSXg2NCAiIFJDWD0lMDE2IiBQUkl4NjQgIiBSRFg9JTAxNiIgUFJJeDY0ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgIlJTST0lMDE2IiBQUkl4NjQgIiBSREk9JTAxNiIgUFJJeDY0ICIgUkJQPSUwMTYiIFBSSXg2NCAiIFJTUD0lMDE2IiBQUkl4NjQgIlxuIgorICAgICAgICAgICAgICAgICAgICAiUjggPSUwMTYiIFBSSXg2NCAiIFI5ID0lMDE2IiBQUkl4NjQgIiBSMTA9JTAxNiIgUFJJeDY0ICIgUjExPSUwMTYiIFBSSXg2NCAiXG4iCisgICAgICAgICAgICAgICAgICAgICJSMTI9JTAxNiIgUFJJeDY0ICIgUjEzPSUwMTYiIFBSSXg2NCAiIFIxND0lMDE2IiBQUkl4NjQgIiBSMTU9JTAxNiIgUFJJeDY0ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgIlJJUD0lMDE2IiBQUkl4NjQgIiBSRkw9JTA4eCBbJWMlYyVjJWMlYyVjJWNdIENQTD0lZCBJST0lZCBBMjA9JWQgU01NPSVkIEhMVD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRUFYXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRUJYXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRUNYXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRURYXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRVNJXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRURJXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRUJQXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzW1JfRVNQXSwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5yZWdzWzhdLAorICAgICAgICAgICAgICAgICAgICBlbnYtPnJlZ3NbOV0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxMF0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxMV0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxMl0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxM10sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxNF0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+cmVnc1sxNV0sCisgICAgICAgICAgICAgICAgICAgIGVudi0+ZWlwLCBlZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIERGX01BU0sgPyAnRCcgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX08gPyAnTycgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX1MgPyAnUycgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX1ogPyAnWicgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX0EgPyAnQScgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX1AgPyAnUCcgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVmbGFncyAmIENDX0MgPyAnQycgOiAnLScsCisgICAgICAgICAgICAgICAgICAgIGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0ssCisgICAgICAgICAgICAgICAgICAgIChlbnYtPmhmbGFncyA+PiBIRl9JTkhJQklUX0lSUV9TSElGVCkgJiAxLAorICAgICAgICAgICAgICAgICAgICAoaW50KShlbnYtPmEyMF9tYXNrID4+IDIwKSAmIDEsCisgICAgICAgICAgICAgICAgICAgIChlbnYtPmhmbGFncyA+PiBIRl9TTU1fU0hJRlQpICYgMSwKKyAgICAgICAgICAgICAgICAgICAgY3B1LT5oYWx0ZWQpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBjcHVfZnByaW50ZihmLCAiRUFYPSUwOHggRUJYPSUwOHggRUNYPSUwOHggRURYPSUwOHhcbiIKKyAgICAgICAgICAgICAgICAgICAgIkVTST0lMDh4IEVEST0lMDh4IEVCUD0lMDh4IEVTUD0lMDh4XG4iCisgICAgICAgICAgICAgICAgICAgICJFSVA9JTA4eCBFRkw9JTA4eCBbJWMlYyVjJWMlYyVjJWNdIENQTD0lZCBJST0lZCBBMjA9JWQgU01NPSVkIEhMVD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+cmVnc1tSX0VBWF0sCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCllbnYtPnJlZ3NbUl9FQlhdLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5yZWdzW1JfRUNYXSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+cmVnc1tSX0VEWF0sCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCllbnYtPnJlZ3NbUl9FU0ldLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5yZWdzW1JfRURJXSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+cmVnc1tSX0VCUF0sCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCllbnYtPnJlZ3NbUl9FU1BdLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5laXAsIGVmbGFncywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgREZfTUFTSyA/ICdEJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfTyA/ICdPJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfUyA/ICdTJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfWiA/ICdaJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfQSA/ICdBJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfUCA/ICdQJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZWZsYWdzICYgQ0NfQyA/ICdDJyA6ICctJywKKyAgICAgICAgICAgICAgICAgICAgZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSywKKyAgICAgICAgICAgICAgICAgICAgKGVudi0+aGZsYWdzID4+IEhGX0lOSElCSVRfSVJRX1NISUZUKSAmIDEsCisgICAgICAgICAgICAgICAgICAgIChpbnQpKGVudi0+YTIwX21hc2sgPj4gMjApICYgMSwKKyAgICAgICAgICAgICAgICAgICAgKGVudi0+aGZsYWdzID4+IEhGX1NNTV9TSElGVCkgJiAxLAorICAgICAgICAgICAgICAgICAgICBjcHUtPmhhbHRlZCk7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGNwdV94ODZfZHVtcF9zZWdfY2FjaGUoZW52LCBmLCBjcHVfZnByaW50Ziwgc2VnX25hbWVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c2Vnc1tpXSk7CisgICAgfQorICAgIGNwdV94ODZfZHVtcF9zZWdfY2FjaGUoZW52LCBmLCBjcHVfZnByaW50ZiwgIkxEVCIsICZlbnYtPmxkdCk7CisgICAgY3B1X3g4Nl9kdW1wX3NlZ19jYWNoZShlbnYsIGYsIGNwdV9mcHJpbnRmLCAiVFIiLCAmZW52LT50cik7CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfTE1BX01BU0spIHsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkdEVD0gICAgICUwMTYiIFBSSXg2NCAiICUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgIGVudi0+Z2R0LmJhc2UsIGVudi0+Z2R0LmxpbWl0KTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIklEVD0gICAgICUwMTYiIFBSSXg2NCAiICUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgIGVudi0+aWR0LmJhc2UsIGVudi0+aWR0LmxpbWl0KTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkNSMD0lMDh4IENSMj0lMDE2IiBQUkl4NjQgIiBDUjM9JTAxNiIgUFJJeDY0ICIgQ1I0PSUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCllbnYtPmNyWzBdLAorICAgICAgICAgICAgICAgICAgICBlbnYtPmNyWzJdLAorICAgICAgICAgICAgICAgICAgICBlbnYtPmNyWzNdLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5jcls0XSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGNwdV9mcHJpbnRmKGYsICJEUiVkPSUwMTYiIFBSSXg2NCAiICIsIGksIGVudi0+ZHJbaV0pOworICAgICAgICBjcHVfZnByaW50ZihmLCAiXG5EUjY9JTAxNiIgUFJJeDY0ICIgRFI3PSUwMTYiIFBSSXg2NCAiXG4iLAorICAgICAgICAgICAgICAgICAgICBlbnYtPmRyWzZdLCBlbnYtPmRyWzddKTsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkdEVD0gICAgICUwOHggJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+Z2R0LmJhc2UsIGVudi0+Z2R0LmxpbWl0KTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIklEVD0gICAgICUwOHggJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+aWR0LmJhc2UsIGVudi0+aWR0LmxpbWl0KTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkNSMD0lMDh4IENSMj0lMDh4IENSMz0lMDh4IENSND0lMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5jclswXSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWVudi0+Y3JbMl0sCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCllbnYtPmNyWzNdLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5jcls0XSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGNwdV9mcHJpbnRmKGYsICJEUiVkPSUwOHggIiwgaSwgZW52LT5kcltpXSk7CisgICAgICAgIGNwdV9mcHJpbnRmKGYsICJcbkRSNj0lMDh4IERSNz0lMDh4XG4iLCBlbnYtPmRyWzZdLCBlbnYtPmRyWzddKTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgWDg2X0RVTVBfQ0NPUCkgeworICAgICAgICBpZiAoKHVuc2lnbmVkKWVudi0+Y2Nfb3AgPCBDQ19PUF9OQikKKyAgICAgICAgICAgIHNucHJpbnRmKGNjX29wX25hbWUsIHNpemVvZihjY19vcF9uYW1lKSwgIiVzIiwgY2Nfb3Bfc3RyW2Vudi0+Y2Nfb3BdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc25wcmludGYoY2Nfb3BfbmFtZSwgc2l6ZW9mKGNjX29wX25hbWUpLCAiWyVkXSIsIGVudi0+Y2Nfb3ApOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLKSB7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiQ0NTPSUwMTYiIFBSSXg2NCAiIENDRD0lMDE2IiBQUkl4NjQgIiBDQ089JS04c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+Y2Nfc3JjLCBlbnYtPmNjX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjX29wX25hbWUpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiQ0NTPSUwOHggQ0NEPSUwOHggQ0NPPSUtOHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpZW52LT5jY19zcmMsICh1aW50MzJfdCllbnYtPmNjX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjX29wX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmbGFncyAmIFg4Nl9EVU1QX0ZQVSkgeworICAgICAgICBpbnQgZnB0YWc7CisgICAgICAgIGZwdGFnID0gMDsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBmcHRhZyB8PSAoKCFlbnYtPmZwdGFnc1tpXSkgPDwgaSk7CisgICAgICAgIH0KKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkZDVz0lMDR4IEZTVz0lMDR4IFtTVD0lZF0gRlRXPSUwMnggTVhDU1I9JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5mcHVjLAorICAgICAgICAgICAgICAgICAgICAoZW52LT5mcHVzICYgfjB4MzgwMCkgfCAoZW52LT5mcHN0dCAmIDB4NykgPDwgMTEsCisgICAgICAgICAgICAgICAgICAgIGVudi0+ZnBzdHQsCisgICAgICAgICAgICAgICAgICAgIGZwdGFnLAorICAgICAgICAgICAgICAgICAgICBlbnYtPm14Y3NyKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiRlBSJWQ9JTAxNiIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgZW52LT5mcHJlZ3NbaV0ubW14LnEpOworICAgICAgICAgICAgaWYgKChpICYgMSkgPT0gMSkKKyAgICAgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiICIpOworICAgICAgICB9CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0NTNjRfTUFTSykKKyAgICAgICAgICAgIG5iID0gMTY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5iID0gODsKKyAgICAgICAgZm9yKGk9MDtpPG5iO2krKykgeworICAgICAgICAgICAgY3B1X2ZwcmludGYoZiwgIlhNTSUwMmQ9JTA4eCUwOHglMDh4JTA4eCIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52LT54bW1fcmVnc1tpXS5YTU1fTCgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+eG1tX3JlZ3NbaV0uWE1NX0woMiksCisgICAgICAgICAgICAgICAgICAgICAgICBlbnYtPnhtbV9yZWdzW2ldLlhNTV9MKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52LT54bW1fcmVnc1tpXS5YTU1fTCgwKSk7CisgICAgICAgICAgICBpZiAoKGkgJiAxKSA9PSAxKQorICAgICAgICAgICAgICAgIGNwdV9mcHJpbnRmKGYsICJcbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNwdV9mcHJpbnRmKGYsICIgIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHg4NiBtbXUgKi8KKy8qIFhYWDogYWRkIFBHRSBzdXBwb3J0ICovCisKK3ZvaWQgY3B1X3g4Nl9zZXRfYTIwKENQVVg4NlN0YXRlICplbnYsIGludCBhMjBfc3RhdGUpCit7CisgICAgYTIwX3N0YXRlID0gKGEyMF9zdGF0ZSAhPSAwKTsKKyAgICBpZiAoYTIwX3N0YXRlICE9ICgoZW52LT5hMjBfbWFzayA+PiAyMCkgJiAxKSkgeworI2lmIGRlZmluZWQoREVCVUdfTU1VKQorICAgICAgICBwcmludGYoIkEyMCB1cGRhdGU6IGEyMD0lZFxuIiwgYTIwX3N0YXRlKTsKKyNlbmRpZgorICAgICAgICAvKiBpZiB0aGUgY3B1IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgY29kZSwgd2UgbXVzdCB1bmxpbmsgaXQgYW5kCisgICAgICAgICAgIGFsbCB0aGUgcG90ZW50aWFsbHkgZXhlY3V0aW5nIFRCICovCisgICAgICAgIGNwdV9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoZW52KSwgQ1BVX0lOVEVSUlVQVF9FWElUVEIpOworCisgICAgICAgIC8qIHdoZW4gYTIwIGlzIGNoYW5nZWQsIGFsbCB0aGUgTU1VIG1hcHBpbmdzIGFyZSBpbnZhbGlkLCBzbworICAgICAgICAgICB3ZSBtdXN0IGZsdXNoIGV2ZXJ5dGhpbmcgKi8KKyAgICAgICAgdGxiX2ZsdXNoKGVudiwgMSk7CisgICAgICAgIGVudi0+YTIwX21hc2sgPSAofjB4MTAwMDAwKSB8IChhMjBfc3RhdGUgPDwgMjApOworICAgIH0KK30KKwordm9pZCBjcHVfeDg2X3VwZGF0ZV9jcjAoQ1BVWDg2U3RhdGUgKmVudiwgdWludDMyX3QgbmV3X2NyMCkKK3sKKyAgICBpbnQgcGVfc3RhdGU7CisKKyNpZiBkZWZpbmVkKERFQlVHX01NVSkKKyAgICBwcmludGYoIkNSMCB1cGRhdGU6IENSMD0weCUwOHhcbiIsIG5ld19jcjApOworI2VuZGlmCisgICAgaWYgKChuZXdfY3IwICYgKENSMF9QR19NQVNLIHwgQ1IwX1dQX01BU0sgfCBDUjBfUEVfTUFTSykpICE9CisgICAgICAgIChlbnYtPmNyWzBdICYgKENSMF9QR19NQVNLIHwgQ1IwX1dQX01BU0sgfCBDUjBfUEVfTUFTSykpKSB7CisgICAgICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgIH0KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAoIShlbnYtPmNyWzBdICYgQ1IwX1BHX01BU0spICYmIChuZXdfY3IwICYgQ1IwX1BHX01BU0spICYmCisgICAgICAgIChlbnYtPmVmZXIgJiBNU1JfRUZFUl9MTUUpKSB7CisgICAgICAgIC8qIGVudGVyIGluIGxvbmcgbW9kZSAqLworICAgICAgICAvKiBYWFg6IGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICBpZiAoIShlbnYtPmNyWzRdICYgQ1I0X1BBRV9NQVNLKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZW52LT5lZmVyIHw9IE1TUl9FRkVSX0xNQTsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gSEZfTE1BX01BU0s7CisgICAgfSBlbHNlIGlmICgoZW52LT5jclswXSAmIENSMF9QR19NQVNLKSAmJiAhKG5ld19jcjAgJiBDUjBfUEdfTUFTSykgJiYKKyAgICAgICAgICAgICAgIChlbnYtPmVmZXIgJiBNU1JfRUZFUl9MTUEpKSB7CisgICAgICAgIC8qIGV4aXQgbG9uZyBtb2RlICovCisgICAgICAgIGVudi0+ZWZlciAmPSB+TVNSX0VGRVJfTE1BOworICAgICAgICBlbnYtPmhmbGFncyAmPSB+KEhGX0xNQV9NQVNLIHwgSEZfQ1M2NF9NQVNLKTsKKyAgICAgICAgZW52LT5laXAgJj0gMHhmZmZmZmZmZjsKKyAgICB9CisjZW5kaWYKKyAgICBlbnYtPmNyWzBdID0gbmV3X2NyMCB8IENSMF9FVF9NQVNLOworCisgICAgLyogdXBkYXRlIFBFIGZsYWcgaW4gaGlkZGVuIGZsYWdzICovCisgICAgcGVfc3RhdGUgPSAoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKTsKKyAgICBlbnYtPmhmbGFncyA9IChlbnYtPmhmbGFncyAmIH5IRl9QRV9NQVNLKSB8IChwZV9zdGF0ZSA8PCBIRl9QRV9TSElGVCk7CisgICAgLyogZW5zdXJlIHRoYXQgQUREU0VHIGlzIGFsd2F5cyBzZXQgaW4gcmVhbCBtb2RlICovCisgICAgZW52LT5oZmxhZ3MgfD0gKChwZV9zdGF0ZSBeIDEpIDw8IEhGX0FERFNFR19TSElGVCk7CisgICAgLyogdXBkYXRlIEZQVSBmbGFncyAqLworICAgIGVudi0+aGZsYWdzID0gKGVudi0+aGZsYWdzICYgfihIRl9NUF9NQVNLIHwgSEZfRU1fTUFTSyB8IEhGX1RTX01BU0spKSB8CisgICAgICAgICgobmV3X2NyMCA8PCAoSEZfTVBfU0hJRlQgLSAxKSkgJiAoSEZfTVBfTUFTSyB8IEhGX0VNX01BU0sgfCBIRl9UU19NQVNLKSk7Cit9CisKKy8qIFhYWDogaW4gbGVnYWN5IFBBRSBtb2RlLCBnZW5lcmF0ZSBhIEdQRiBpZiByZXNlcnZlZCBiaXRzIGFyZSBzZXQgaW4KKyAgIHRoZSBQRFBUICovCit2b2lkIGNwdV94ODZfdXBkYXRlX2NyMyhDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgbmV3X2NyMykKK3sKKyAgICBlbnYtPmNyWzNdID0gbmV3X2NyMzsKKyAgICBpZiAoZW52LT5jclswXSAmIENSMF9QR19NQVNLKSB7CisjaWYgZGVmaW5lZChERUJVR19NTVUpCisgICAgICAgIHByaW50ZigiQ1IzIHVwZGF0ZTogQ1IzPSIgVEFSR0VUX0ZNVF9seCAiXG4iLCBuZXdfY3IzKTsKKyNlbmRpZgorICAgICAgICB0bGJfZmx1c2goZW52LCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgY3B1X3g4Nl91cGRhdGVfY3I0KENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IG5ld19jcjQpCit7CisjaWYgZGVmaW5lZChERUJVR19NTVUpCisgICAgcHJpbnRmKCJDUjQgdXBkYXRlOiBDUjQ9JTA4eFxuIiwgKHVpbnQzMl90KWVudi0+Y3JbNF0pOworI2VuZGlmCisgICAgaWYgKChuZXdfY3I0ICYgKENSNF9QR0VfTUFTSyB8IENSNF9QQUVfTUFTSyB8IENSNF9QU0VfTUFTSykpICE9CisgICAgICAgIChlbnYtPmNyWzRdICYgKENSNF9QR0VfTUFTSyB8IENSNF9QQUVfTUFTSyB8IENSNF9QU0VfTUFTSykpKSB7CisgICAgICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgIH0KKyAgICAvKiBTU0UgaGFuZGxpbmcgKi8KKyAgICBpZiAoIShlbnYtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfU1NFKSkKKyAgICAgICAgbmV3X2NyNCAmPSB+Q1I0X09TRlhTUl9NQVNLOworICAgIGlmIChuZXdfY3I0ICYgQ1I0X09TRlhTUl9NQVNLKQorICAgICAgICBlbnYtPmhmbGFncyB8PSBIRl9PU0ZYU1JfTUFTSzsKKyAgICBlbHNlCisgICAgICAgIGVudi0+aGZsYWdzICY9IH5IRl9PU0ZYU1JfTUFTSzsKKworICAgIGVudi0+Y3JbNF0gPSBuZXdfY3I0OworfQorCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorCitpbnQgY3B1X3g4Nl9oYW5kbGVfbW11X2ZhdWx0KENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfd3JpdGUsIGludCBtbXVfaWR4KQoreworICAgIC8qIHVzZXIgbW9kZSBvbmx5IGVtdWxhdGlvbiAqLworICAgIGlzX3dyaXRlICY9IDE7CisgICAgZW52LT5jclsyXSA9IGFkZHI7CisgICAgZW52LT5lcnJvcl9jb2RlID0gKGlzX3dyaXRlIDw8IFBHX0VSUk9SX1dfQklUKTsKKyAgICBlbnYtPmVycm9yX2NvZGUgfD0gUEdfRVJST1JfVV9NQVNLOworICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUDBFX1BBR0U7CisgICAgcmV0dXJuIDE7Cit9CisKK2h3YWRkciBjcHVfZ2V0X3BoeXNfcGFnZV9kZWJ1ZyhDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcikKK3sKKyAgICByZXR1cm4gYWRkcjsKK30KKworI2Vsc2UKKworLyogWFhYOiBUaGlzIHZhbHVlIHNob3VsZCBtYXRjaCB0aGUgb25lIHJldHVybmVkIGJ5IENQVUlECisgKiBhbmQgaW4gZXhlYy5jICovCisjaWYgZGVmaW5lZChUQVJHRVRfWDg2XzY0KQorIyBkZWZpbmUgUEhZU19BRERSX01BU0sgMHhmZmZmZmZmMDAwTEwKKyNlbHNlCisjIGRlZmluZSBQSFlTX0FERFJfTUFTSyAweGZmZmZmZjAwMExMCisjZW5kaWYKKworLyogcmV0dXJuIHZhbHVlOgorICAgLTEgPSBjYW5ub3QgaGFuZGxlIGZhdWx0CisgICAwICA9IG5vdGhpbmcgbW9yZSB0byBkbworICAgMSAgPSBnZW5lcmF0ZSBQRiBmYXVsdAorKi8KK2ludCBjcHVfeDg2X2hhbmRsZV9tbXVfZmF1bHQoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc193cml0ZTEsIGludCBtbXVfaWR4KQoreworICAgIHVpbnQ2NF90IHB0ZXAsIHB0ZTsKKyAgICB0YXJnZXRfdWxvbmcgcGRlX2FkZHIsIHB0ZV9hZGRyOworICAgIGludCBlcnJvcl9jb2RlLCBpc19kaXJ0eSwgcHJvdCwgcGFnZV9zaXplLCBpc193cml0ZSwgaXNfdXNlcjsKKyAgICBod2FkZHIgcGFkZHI7CisgICAgdWludDMyX3QgcGFnZV9vZmZzZXQ7CisgICAgdGFyZ2V0X3Vsb25nIHZhZGRyLCB2aXJ0X2FkZHI7CisKKyAgICBpc191c2VyID0gbW11X2lkeCA9PSBNTVVfVVNFUl9JRFg7CisjaWYgZGVmaW5lZChERUJVR19NTVUpCisgICAgcHJpbnRmKCJNTVUgZmF1bHQ6IGFkZHI9IiBUQVJHRVRfRk1UX2x4ICIgdz0lZCB1PSVkIGVpcD0iIFRBUkdFVF9GTVRfbHggIlxuIiwKKyAgICAgICAgICAgYWRkciwgaXNfd3JpdGUxLCBpc191c2VyLCBlbnYtPmVpcCk7CisjZW5kaWYKKyAgICBpc193cml0ZSA9IGlzX3dyaXRlMSAmIDE7CisKKyAgICBpZiAoIShlbnYtPmNyWzBdICYgQ1IwX1BHX01BU0spKSB7CisgICAgICAgIHB0ZSA9IGFkZHI7CisgICAgICAgIHZpcnRfYWRkciA9IGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLOworICAgICAgICBwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURSB8IFBBR0VfRVhFQzsKKyAgICAgICAgcGFnZV9zaXplID0gNDA5NjsKKyAgICAgICAgZ290byBkb19tYXBwaW5nOworICAgIH0KKworICAgIGlmIChlbnYtPmNyWzRdICYgQ1I0X1BBRV9NQVNLKSB7CisgICAgICAgIHVpbnQ2NF90IHBkZSwgcGRwZTsKKyAgICAgICAgdGFyZ2V0X3Vsb25nIHBkcGVfYWRkcjsKKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfTE1BX01BU0spIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHBtbDRlX2FkZHIsIHBtbDRlOworICAgICAgICAgICAgaW50MzJfdCBzZXh0OworCisgICAgICAgICAgICAvKiB0ZXN0IHZpcnR1YWwgYWRkcmVzcyBzaWduIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgc2V4dCA9IChpbnQ2NF90KWFkZHIgPj4gNDc7CisgICAgICAgICAgICBpZiAoc2V4dCAhPSAwICYmIHNleHQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBlbnYtPmVycm9yX2NvZGUgPSAwOworICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUDBEX0dQRjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcG1sNGVfYWRkciA9ICgoZW52LT5jclszXSAmIH4weGZmZikgKyAoKChhZGRyID4+IDM5KSAmIDB4MWZmKSA8PCAzKSkgJgorICAgICAgICAgICAgICAgIGVudi0+YTIwX21hc2s7CisgICAgICAgICAgICBwbWw0ZSA9IGxkcV9waHlzKHBtbDRlX2FkZHIpOworICAgICAgICAgICAgaWYgKCEocG1sNGUgJiBQR19QUkVTRU5UX01BU0spKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfY29kZSA9IDA7CisgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGVudi0+ZWZlciAmIE1TUl9FRkVSX05YRSkgJiYgKHBtbDRlICYgUEdfTlhfTUFTSykpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9jb2RlID0gUEdfRVJST1JfUlNWRF9NQVNLOworICAgICAgICAgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShwbWw0ZSAmIFBHX0FDQ0VTU0VEX01BU0spKSB7CisgICAgICAgICAgICAgICAgcG1sNGUgfD0gUEdfQUNDRVNTRURfTUFTSzsKKyAgICAgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShwbWw0ZV9hZGRyLCBwbWw0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGVwID0gcG1sNGUgXiBQR19OWF9NQVNLOworICAgICAgICAgICAgcGRwZV9hZGRyID0gKChwbWw0ZSAmIFBIWVNfQUREUl9NQVNLKSArICgoKGFkZHIgPj4gMzApICYgMHgxZmYpIDw8IDMpKSAmCisgICAgICAgICAgICAgICAgZW52LT5hMjBfbWFzazsKKyAgICAgICAgICAgIHBkcGUgPSBsZHFfcGh5cyhwZHBlX2FkZHIpOworICAgICAgICAgICAgaWYgKCEocGRwZSAmIFBHX1BSRVNFTlRfTUFTSykpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9jb2RlID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoZW52LT5lZmVyICYgTVNSX0VGRVJfTlhFKSAmJiAocGRwZSAmIFBHX05YX01BU0spKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfY29kZSA9IFBHX0VSUk9SX1JTVkRfTUFTSzsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRlcCAmPSBwZHBlIF4gUEdfTlhfTUFTSzsKKyAgICAgICAgICAgIGlmICghKHBkcGUgJiBQR19BQ0NFU1NFRF9NQVNLKSkgeworICAgICAgICAgICAgICAgIHBkcGUgfD0gUEdfQUNDRVNTRURfTUFTSzsKKyAgICAgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShwZHBlX2FkZHIsIHBkcGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAvKiBYWFg6IGxvYWQgdGhlbSB3aGVuIGNyMyBpcyBsb2FkZWQgPyAqLworICAgICAgICAgICAgcGRwZV9hZGRyID0gKChlbnYtPmNyWzNdICYgfjB4MWYpICsgKChhZGRyID4+IDI3KSAmIDB4MTgpKSAmCisgICAgICAgICAgICAgICAgZW52LT5hMjBfbWFzazsKKyAgICAgICAgICAgIHBkcGUgPSBsZHFfcGh5cyhwZHBlX2FkZHIpOworICAgICAgICAgICAgaWYgKCEocGRwZSAmIFBHX1BSRVNFTlRfTUFTSykpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9jb2RlID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRlcCA9IFBHX05YX01BU0sgfCBQR19VU0VSX01BU0sgfCBQR19SV19NQVNLOworICAgICAgICB9CisKKyAgICAgICAgcGRlX2FkZHIgPSAoKHBkcGUgJiBQSFlTX0FERFJfTUFTSykgKyAoKChhZGRyID4+IDIxKSAmIDB4MWZmKSA8PCAzKSkgJgorICAgICAgICAgICAgZW52LT5hMjBfbWFzazsKKyAgICAgICAgcGRlID0gbGRxX3BoeXMocGRlX2FkZHIpOworICAgICAgICBpZiAoIShwZGUgJiBQR19QUkVTRU5UX01BU0spKSB7CisgICAgICAgICAgICBlcnJvcl9jb2RlID0gMDsKKyAgICAgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZW52LT5lZmVyICYgTVNSX0VGRVJfTlhFKSAmJiAocGRlICYgUEdfTlhfTUFTSykpIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGUgPSBQR19FUlJPUl9SU1ZEX01BU0s7CisgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0OworICAgICAgICB9CisgICAgICAgIHB0ZXAgJj0gcGRlIF4gUEdfTlhfTUFTSzsKKyAgICAgICAgaWYgKHBkZSAmIFBHX1BTRV9NQVNLKSB7CisgICAgICAgICAgICAvKiAyIE1CIHBhZ2UgKi8KKyAgICAgICAgICAgIHBhZ2Vfc2l6ZSA9IDIwNDggKiAxMDI0OworICAgICAgICAgICAgcHRlcCBePSBQR19OWF9NQVNLOworICAgICAgICAgICAgaWYgKChwdGVwICYgUEdfTlhfTUFTSykgJiYgaXNfd3JpdGUxID09IDIpCisgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgaWYgKGlzX3VzZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShwdGVwICYgUEdfVVNFUl9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgICAgIGlmIChpc193cml0ZSAmJiAhKHB0ZXAgJiBQR19SV19NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVudi0+Y3JbMF0gJiBDUjBfV1BfTUFTSykgJiYKKyAgICAgICAgICAgICAgICAgICAgaXNfd3JpdGUgJiYgIShwdGVwICYgUEdfUldfTUFTSykpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9fZmF1bHRfcHJvdGVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzX2RpcnR5ID0gaXNfd3JpdGUgJiYgIShwZGUgJiBQR19ESVJUWV9NQVNLKTsKKyAgICAgICAgICAgIGlmICghKHBkZSAmIFBHX0FDQ0VTU0VEX01BU0spIHx8IGlzX2RpcnR5KSB7CisgICAgICAgICAgICAgICAgcGRlIHw9IFBHX0FDQ0VTU0VEX01BU0s7CisgICAgICAgICAgICAgICAgaWYgKGlzX2RpcnR5KQorICAgICAgICAgICAgICAgICAgICBwZGUgfD0gUEdfRElSVFlfTUFTSzsKKyAgICAgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShwZGVfYWRkciwgcGRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGFsaWduIHRvIHBhZ2Vfc2l6ZSAqLworICAgICAgICAgICAgcHRlID0gcGRlICYgKChQSFlTX0FERFJfTUFTSyAmIH4ocGFnZV9zaXplIC0gMSkpIHwgMHhmZmYpOworICAgICAgICAgICAgdmlydF9hZGRyID0gYWRkciAmIH4ocGFnZV9zaXplIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiA0IEtCIHBhZ2UgKi8KKyAgICAgICAgICAgIGlmICghKHBkZSAmIFBHX0FDQ0VTU0VEX01BU0spKSB7CisgICAgICAgICAgICAgICAgcGRlIHw9IFBHX0FDQ0VTU0VEX01BU0s7CisgICAgICAgICAgICAgICAgc3RsX3BoeXNfbm90ZGlydHkocGRlX2FkZHIsIHBkZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGVfYWRkciA9ICgocGRlICYgUEhZU19BRERSX01BU0spICsgKCgoYWRkciA+PiAxMikgJiAweDFmZikgPDwgMykpICYKKyAgICAgICAgICAgICAgICBlbnYtPmEyMF9tYXNrOworICAgICAgICAgICAgcHRlID0gbGRxX3BoeXMocHRlX2FkZHIpOworICAgICAgICAgICAgaWYgKCEocHRlICYgUEdfUFJFU0VOVF9NQVNLKSkgeworICAgICAgICAgICAgICAgIGVycm9yX2NvZGUgPSAwOworICAgICAgICAgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShlbnYtPmVmZXIgJiBNU1JfRUZFUl9OWEUpICYmIChwdGUgJiBQR19OWF9NQVNLKSkgeworICAgICAgICAgICAgICAgIGVycm9yX2NvZGUgPSBQR19FUlJPUl9SU1ZEX01BU0s7CisgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNvbWJpbmUgcGRlIGFuZCBwdGUgbngsIHVzZXIgYW5kIHJ3IHByb3RlY3Rpb25zICovCisgICAgICAgICAgICBwdGVwICY9IHB0ZSBeIFBHX05YX01BU0s7CisgICAgICAgICAgICBwdGVwIF49IFBHX05YX01BU0s7CisgICAgICAgICAgICBpZiAoKHB0ZXAgJiBQR19OWF9NQVNLKSAmJiBpc193cml0ZTEgPT0gMikKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICBpZiAoaXNfdXNlcikgeworICAgICAgICAgICAgICAgIGlmICghKHB0ZXAgJiBQR19VU0VSX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICAgICAgaWYgKGlzX3dyaXRlICYmICEocHRlcCAmIFBHX1JXX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoZW52LT5jclswXSAmIENSMF9XUF9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICBpc193cml0ZSAmJiAhKHB0ZXAgJiBQR19SV19NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNfZGlydHkgPSBpc193cml0ZSAmJiAhKHB0ZSAmIFBHX0RJUlRZX01BU0spOworICAgICAgICAgICAgaWYgKCEocHRlICYgUEdfQUNDRVNTRURfTUFTSykgfHwgaXNfZGlydHkpIHsKKyAgICAgICAgICAgICAgICBwdGUgfD0gUEdfQUNDRVNTRURfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoaXNfZGlydHkpCisgICAgICAgICAgICAgICAgICAgIHB0ZSB8PSBQR19ESVJUWV9NQVNLOworICAgICAgICAgICAgICAgIHN0bF9waHlzX25vdGRpcnR5KHB0ZV9hZGRyLCBwdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFnZV9zaXplID0gNDA5NjsKKyAgICAgICAgICAgIHZpcnRfYWRkciA9IGFkZHIgJiB+MHhmZmY7CisgICAgICAgICAgICBwdGUgPSBwdGUgJiAoUEhZU19BRERSX01BU0sgfCAweGZmZik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBwZGU7CisKKyAgICAgICAgLyogcGFnZSBkaXJlY3RvcnkgZW50cnkgKi8KKyAgICAgICAgcGRlX2FkZHIgPSAoKGVudi0+Y3JbM10gJiB+MHhmZmYpICsgKChhZGRyID4+IDIwKSAmIDB4ZmZjKSkgJgorICAgICAgICAgICAgZW52LT5hMjBfbWFzazsKKyAgICAgICAgcGRlID0gbGRsX3BoeXMocGRlX2FkZHIpOworICAgICAgICBpZiAoIShwZGUgJiBQR19QUkVTRU5UX01BU0spKSB7CisgICAgICAgICAgICBlcnJvcl9jb2RlID0gMDsKKyAgICAgICAgICAgIGdvdG8gZG9fZmF1bHQ7CisgICAgICAgIH0KKyAgICAgICAgLyogaWYgUFNFIGJpdCBpcyBzZXQsIHRoZW4gd2UgdXNlIGEgNE1CIHBhZ2UgKi8KKyAgICAgICAgaWYgKChwZGUgJiBQR19QU0VfTUFTSykgJiYgKGVudi0+Y3JbNF0gJiBDUjRfUFNFX01BU0spKSB7CisgICAgICAgICAgICBwYWdlX3NpemUgPSA0MDk2ICogMTAyNDsKKyAgICAgICAgICAgIGlmIChpc191c2VyKSB7CisgICAgICAgICAgICAgICAgaWYgKCEocGRlICYgUEdfVVNFUl9NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgICAgIGlmIChpc193cml0ZSAmJiAhKHBkZSAmIFBHX1JXX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoZW52LT5jclswXSAmIENSMF9XUF9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICBpc193cml0ZSAmJiAhKHBkZSAmIFBHX1JXX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc19kaXJ0eSA9IGlzX3dyaXRlICYmICEocGRlICYgUEdfRElSVFlfTUFTSyk7CisgICAgICAgICAgICBpZiAoIShwZGUgJiBQR19BQ0NFU1NFRF9NQVNLKSB8fCBpc19kaXJ0eSkgeworICAgICAgICAgICAgICAgIHBkZSB8PSBQR19BQ0NFU1NFRF9NQVNLOworICAgICAgICAgICAgICAgIGlmIChpc19kaXJ0eSkKKyAgICAgICAgICAgICAgICAgICAgcGRlIHw9IFBHX0RJUlRZX01BU0s7CisgICAgICAgICAgICAgICAgc3RsX3BoeXNfbm90ZGlydHkocGRlX2FkZHIsIHBkZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB0ZSA9IHBkZSAmIH4oIChwYWdlX3NpemUgLSAxKSAmIH4weGZmZik7IC8qIGFsaWduIHRvIHBhZ2Vfc2l6ZSAqLworICAgICAgICAgICAgcHRlcCA9IHB0ZTsKKyAgICAgICAgICAgIHZpcnRfYWRkciA9IGFkZHIgJiB+KHBhZ2Vfc2l6ZSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEocGRlICYgUEdfQUNDRVNTRURfTUFTSykpIHsKKyAgICAgICAgICAgICAgICBwZGUgfD0gUEdfQUNDRVNTRURfTUFTSzsKKyAgICAgICAgICAgICAgICBzdGxfcGh5c19ub3RkaXJ0eShwZGVfYWRkciwgcGRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcGFnZSBkaXJlY3RvcnkgZW50cnkgKi8KKyAgICAgICAgICAgIHB0ZV9hZGRyID0gKChwZGUgJiB+MHhmZmYpICsgKChhZGRyID4+IDEwKSAmIDB4ZmZjKSkgJgorICAgICAgICAgICAgICAgIGVudi0+YTIwX21hc2s7CisgICAgICAgICAgICBwdGUgPSBsZGxfcGh5cyhwdGVfYWRkcik7CisgICAgICAgICAgICBpZiAoIShwdGUgJiBQR19QUkVTRU5UX01BU0spKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfY29kZSA9IDA7CisgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNvbWJpbmUgcGRlIGFuZCBwdGUgdXNlciBhbmQgcncgcHJvdGVjdGlvbnMgKi8KKyAgICAgICAgICAgIHB0ZXAgPSBwdGUgJiBwZGU7CisgICAgICAgICAgICBpZiAoaXNfdXNlcikgeworICAgICAgICAgICAgICAgIGlmICghKHB0ZXAgJiBQR19VU0VSX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICAgICAgaWYgKGlzX3dyaXRlICYmICEocHRlcCAmIFBHX1JXX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX2ZhdWx0X3Byb3RlY3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoZW52LT5jclswXSAmIENSMF9XUF9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICBpc193cml0ZSAmJiAhKHB0ZXAgJiBQR19SV19NQVNLKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb19mYXVsdF9wcm90ZWN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNfZGlydHkgPSBpc193cml0ZSAmJiAhKHB0ZSAmIFBHX0RJUlRZX01BU0spOworICAgICAgICAgICAgaWYgKCEocHRlICYgUEdfQUNDRVNTRURfTUFTSykgfHwgaXNfZGlydHkpIHsKKyAgICAgICAgICAgICAgICBwdGUgfD0gUEdfQUNDRVNTRURfTUFTSzsKKyAgICAgICAgICAgICAgICBpZiAoaXNfZGlydHkpCisgICAgICAgICAgICAgICAgICAgIHB0ZSB8PSBQR19ESVJUWV9NQVNLOworICAgICAgICAgICAgICAgIHN0bF9waHlzX25vdGRpcnR5KHB0ZV9hZGRyLCBwdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFnZV9zaXplID0gNDA5NjsKKyAgICAgICAgICAgIHZpcnRfYWRkciA9IGFkZHIgJiB+MHhmZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogdGhlIHBhZ2UgY2FuIGJlIHB1dCBpbiB0aGUgVExCICovCisgICAgcHJvdCA9IFBBR0VfUkVBRDsKKyAgICBpZiAoIShwdGVwICYgUEdfTlhfTUFTSykpCisgICAgICAgIHByb3QgfD0gUEFHRV9FWEVDOworICAgIGlmIChwdGUgJiBQR19ESVJUWV9NQVNLKSB7CisgICAgICAgIC8qIG9ubHkgc2V0IHdyaXRlIGFjY2VzcyBpZiBhbHJlYWR5IGRpcnR5Li4uIG90aGVyd2lzZSB3YWl0CisgICAgICAgICAgIGZvciBkaXJ0eSBhY2Nlc3MgKi8KKyAgICAgICAgaWYgKGlzX3VzZXIpIHsKKyAgICAgICAgICAgIGlmIChwdGVwICYgUEdfUldfTUFTSykKKyAgICAgICAgICAgICAgICBwcm90IHw9IFBBR0VfV1JJVEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShlbnYtPmNyWzBdICYgQ1IwX1dQX01BU0spIHx8CisgICAgICAgICAgICAgICAgKHB0ZXAgJiBQR19SV19NQVNLKSkKKyAgICAgICAgICAgICAgICBwcm90IHw9IFBBR0VfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisgZG9fbWFwcGluZzoKKyAgICBwdGUgPSBwdGUgJiBlbnYtPmEyMF9tYXNrOworCisgICAgLyogRXZlbiBpZiA0TUIgcGFnZXMsIHdlIG1hcCBvbmx5IG9uZSA0S0IgcGFnZSBpbiB0aGUgY2FjaGUgdG8KKyAgICAgICBhdm9pZCBmaWxsaW5nIGl0IHRvbyBmYXN0ICovCisgICAgcGFnZV9vZmZzZXQgPSAoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spICYgKHBhZ2Vfc2l6ZSAtIDEpOworICAgIHBhZGRyID0gKHB0ZSAmIFRBUkdFVF9QQUdFX01BU0spICsgcGFnZV9vZmZzZXQ7CisgICAgdmFkZHIgPSB2aXJ0X2FkZHIgKyBwYWdlX29mZnNldDsKKworICAgIHRsYl9zZXRfcGFnZShlbnYsIHZhZGRyLCBwYWRkciwgcHJvdCwgbW11X2lkeCwgcGFnZV9zaXplKTsKKyAgICByZXR1cm4gMDsKKyBkb19mYXVsdF9wcm90ZWN0OgorICAgIGVycm9yX2NvZGUgPSBQR19FUlJPUl9QX01BU0s7CisgZG9fZmF1bHQ6CisgICAgZXJyb3JfY29kZSB8PSAoaXNfd3JpdGUgPDwgUEdfRVJST1JfV19CSVQpOworICAgIGlmIChpc191c2VyKQorICAgICAgICBlcnJvcl9jb2RlIHw9IFBHX0VSUk9SX1VfTUFTSzsKKyAgICBpZiAoaXNfd3JpdGUxID09IDIgJiYKKyAgICAgICAgKGVudi0+ZWZlciAmIE1TUl9FRkVSX05YRSkgJiYKKyAgICAgICAgKGVudi0+Y3JbNF0gJiBDUjRfUEFFX01BU0spKQorICAgICAgICBlcnJvcl9jb2RlIHw9IFBHX0VSUk9SX0lfRF9NQVNLOworICAgIGlmIChlbnYtPmludGVyY2VwdF9leGNlcHRpb25zICYgKDEgPDwgRVhDUDBFX1BBR0UpKSB7CisgICAgICAgIC8qIGNyMiBpcyBub3QgbW9kaWZpZWQgaW4gY2FzZSBvZiBleGNlcHRpb25zICovCisgICAgICAgIHN0cV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV4aXRfaW5mb18yKSwKKyAgICAgICAgICAgICAgICAgYWRkcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5jclsyXSA9IGFkZHI7CisgICAgfQorICAgIGVudi0+ZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQMEVfUEFHRTsKKyAgICByZXR1cm4gMTsKK30KKworaHdhZGRyIGNwdV9nZXRfcGh5c19wYWdlX2RlYnVnKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIHRhcmdldF91bG9uZyBwZGVfYWRkciwgcHRlX2FkZHI7CisgICAgdWludDY0X3QgcHRlOworICAgIGh3YWRkciBwYWRkcjsKKyAgICB1aW50MzJfdCBwYWdlX29mZnNldDsKKyAgICBpbnQgcGFnZV9zaXplOworCisgICAgaWYgKGVudi0+Y3JbNF0gJiBDUjRfUEFFX01BU0spIHsKKyAgICAgICAgdGFyZ2V0X3Vsb25nIHBkcGVfYWRkcjsKKyAgICAgICAgdWludDY0X3QgcGRlLCBwZHBlOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgeworICAgICAgICAgICAgdWludDY0X3QgcG1sNGVfYWRkciwgcG1sNGU7CisgICAgICAgICAgICBpbnQzMl90IHNleHQ7CisKKyAgICAgICAgICAgIC8qIHRlc3QgdmlydHVhbCBhZGRyZXNzIHNpZ24gZXh0ZW5zaW9uICovCisgICAgICAgICAgICBzZXh0ID0gKGludDY0X3QpYWRkciA+PiA0NzsKKyAgICAgICAgICAgIGlmIChzZXh0ICE9IDAgJiYgc2V4dCAhPSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIHBtbDRlX2FkZHIgPSAoKGVudi0+Y3JbM10gJiB+MHhmZmYpICsgKCgoYWRkciA+PiAzOSkgJiAweDFmZikgPDwgMykpICYKKyAgICAgICAgICAgICAgICBlbnYtPmEyMF9tYXNrOworICAgICAgICAgICAgcG1sNGUgPSBsZHFfcGh5cyhwbWw0ZV9hZGRyKTsKKyAgICAgICAgICAgIGlmICghKHBtbDRlICYgUEdfUFJFU0VOVF9NQVNLKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIHBkcGVfYWRkciA9ICgocG1sNGUgJiB+MHhmZmYpICsgKCgoYWRkciA+PiAzMCkgJiAweDFmZikgPDwgMykpICYKKyAgICAgICAgICAgICAgICBlbnYtPmEyMF9tYXNrOworICAgICAgICAgICAgcGRwZSA9IGxkcV9waHlzKHBkcGVfYWRkcik7CisgICAgICAgICAgICBpZiAoIShwZHBlICYgUEdfUFJFU0VOVF9NQVNLKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIHBkcGVfYWRkciA9ICgoZW52LT5jclszXSAmIH4weDFmKSArICgoYWRkciA+PiAyNykgJiAweDE4KSkgJgorICAgICAgICAgICAgICAgIGVudi0+YTIwX21hc2s7CisgICAgICAgICAgICBwZHBlID0gbGRxX3BoeXMocGRwZV9hZGRyKTsKKyAgICAgICAgICAgIGlmICghKHBkcGUgJiBQR19QUkVTRU5UX01BU0spKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHBkZV9hZGRyID0gKChwZHBlICYgfjB4ZmZmKSArICgoKGFkZHIgPj4gMjEpICYgMHgxZmYpIDw8IDMpKSAmCisgICAgICAgICAgICBlbnYtPmEyMF9tYXNrOworICAgICAgICBwZGUgPSBsZHFfcGh5cyhwZGVfYWRkcik7CisgICAgICAgIGlmICghKHBkZSAmIFBHX1BSRVNFTlRfTUFTSykpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGRlICYgUEdfUFNFX01BU0spIHsKKyAgICAgICAgICAgIC8qIDIgTUIgcGFnZSAqLworICAgICAgICAgICAgcGFnZV9zaXplID0gMjA0OCAqIDEwMjQ7CisgICAgICAgICAgICBwdGUgPSBwZGUgJiB+KCAocGFnZV9zaXplIC0gMSkgJiB+MHhmZmYpOyAvKiBhbGlnbiB0byBwYWdlX3NpemUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIDQgS0IgcGFnZSAqLworICAgICAgICAgICAgcHRlX2FkZHIgPSAoKHBkZSAmIH4weGZmZikgKyAoKChhZGRyID4+IDEyKSAmIDB4MWZmKSA8PCAzKSkgJgorICAgICAgICAgICAgICAgIGVudi0+YTIwX21hc2s7CisgICAgICAgICAgICBwYWdlX3NpemUgPSA0MDk2OworICAgICAgICAgICAgcHRlID0gbGRxX3BoeXMocHRlX2FkZHIpOworICAgICAgICB9CisgICAgICAgIGlmICghKHB0ZSAmIFBHX1BSRVNFTlRfTUFTSykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgcGRlOworCisgICAgICAgIGlmICghKGVudi0+Y3JbMF0gJiBDUjBfUEdfTUFTSykpIHsKKyAgICAgICAgICAgIHB0ZSA9IGFkZHI7CisgICAgICAgICAgICBwYWdlX3NpemUgPSA0MDk2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcGFnZSBkaXJlY3RvcnkgZW50cnkgKi8KKyAgICAgICAgICAgIHBkZV9hZGRyID0gKChlbnYtPmNyWzNdICYgfjB4ZmZmKSArICgoYWRkciA+PiAyMCkgJiAweGZmYykpICYgZW52LT5hMjBfbWFzazsKKyAgICAgICAgICAgIHBkZSA9IGxkbF9waHlzKHBkZV9hZGRyKTsKKyAgICAgICAgICAgIGlmICghKHBkZSAmIFBHX1BSRVNFTlRfTUFTSykpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKChwZGUgJiBQR19QU0VfTUFTSykgJiYgKGVudi0+Y3JbNF0gJiBDUjRfUFNFX01BU0spKSB7CisgICAgICAgICAgICAgICAgcHRlID0gcGRlICYgfjB4MDAzZmYwMDA7IC8qIGFsaWduIHRvIDRNQiAqLworICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZSA9IDQwOTYgKiAxMDI0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBwYWdlIGRpcmVjdG9yeSBlbnRyeSAqLworICAgICAgICAgICAgICAgIHB0ZV9hZGRyID0gKChwZGUgJiB+MHhmZmYpICsgKChhZGRyID4+IDEwKSAmIDB4ZmZjKSkgJiBlbnYtPmEyMF9tYXNrOworICAgICAgICAgICAgICAgIHB0ZSA9IGxkbF9waHlzKHB0ZV9hZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwdGUgJiBQR19QUkVTRU5UX01BU0spKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcGFnZV9zaXplID0gNDA5NjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGUgPSBwdGUgJiBlbnYtPmEyMF9tYXNrOworICAgIH0KKworICAgIHBhZ2Vfb2Zmc2V0ID0gKGFkZHIgJiBUQVJHRVRfUEFHRV9NQVNLKSAmIChwYWdlX3NpemUgLSAxKTsKKyAgICBwYWRkciA9IChwdGUgJiBUQVJHRVRfUEFHRV9NQVNLKSArIHBhZ2Vfb2Zmc2V0OworICAgIHJldHVybiBwYWRkcjsKK30KKwordm9pZCBod19icmVha3BvaW50X2luc2VydChDUFVYODZTdGF0ZSAqZW52LCBpbnQgaW5kZXgpCit7CisgICAgaW50IHR5cGUsIGVyciA9IDA7CisKKyAgICBzd2l0Y2ggKGh3X2JyZWFrcG9pbnRfdHlwZShlbnYtPmRyWzddLCBpbmRleCkpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChod19icmVha3BvaW50X2VuYWJsZWQoZW52LT5kcls3XSwgaW5kZXgpKQorICAgICAgICAgICAgZXJyID0gY3B1X2JyZWFrcG9pbnRfaW5zZXJ0KGVudiwgZW52LT5kcltpbmRleF0sIEJQX0NQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5jcHVfYnJlYWtwb2ludFtpbmRleF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHR5cGUgPSBCUF9DUFUgfCBCUF9NRU1fV1JJVEU7CisgICAgICAgIGdvdG8gaW5zZXJ0X3dwOworICAgIGNhc2UgMjoKKyAgICAgICAgIC8qIE5vIHN1cHBvcnQgZm9yIEkvTyB3YXRjaHBvaW50cyB5ZXQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB0eXBlID0gQlBfQ1BVIHwgQlBfTUVNX0FDQ0VTUzsKKyAgICBpbnNlcnRfd3A6CisgICAgICAgIGVyciA9IGNwdV93YXRjaHBvaW50X2luc2VydChlbnYsIGVudi0+ZHJbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdfYnJlYWtwb2ludF9sZW4oZW52LT5kcls3XSwgaW5kZXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgJmVudi0+Y3B1X3dhdGNocG9pbnRbaW5kZXhdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnIpCisgICAgICAgIGVudi0+Y3B1X2JyZWFrcG9pbnRbaW5kZXhdID0gTlVMTDsKK30KKwordm9pZCBod19icmVha3BvaW50X3JlbW92ZShDUFVYODZTdGF0ZSAqZW52LCBpbnQgaW5kZXgpCit7CisgICAgaWYgKCFlbnYtPmNwdV9icmVha3BvaW50W2luZGV4XSkKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCAoaHdfYnJlYWtwb2ludF90eXBlKGVudi0+ZHJbN10sIGluZGV4KSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGh3X2JyZWFrcG9pbnRfZW5hYmxlZChlbnYtPmRyWzddLCBpbmRleCkpCisgICAgICAgICAgICBjcHVfYnJlYWtwb2ludF9yZW1vdmVfYnlfcmVmKGVudiwgZW52LT5jcHVfYnJlYWtwb2ludFtpbmRleF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAzOgorICAgICAgICBjcHVfd2F0Y2hwb2ludF9yZW1vdmVfYnlfcmVmKGVudiwgZW52LT5jcHVfd2F0Y2hwb2ludFtpbmRleF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIC8qIE5vIHN1cHBvcnQgZm9yIEkvTyB3YXRjaHBvaW50cyB5ZXQgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitpbnQgY2hlY2tfaHdfYnJlYWtwb2ludHMoQ1BVWDg2U3RhdGUgKmVudiwgaW50IGZvcmNlX2RyNl91cGRhdGUpCit7CisgICAgdGFyZ2V0X3Vsb25nIGRyNjsKKyAgICBpbnQgcmVnLCB0eXBlOworICAgIGludCBoaXRfZW5hYmxlZCA9IDA7CisKKyAgICBkcjYgPSBlbnYtPmRyWzZdICYgfjB4ZjsKKyAgICBmb3IgKHJlZyA9IDA7IHJlZyA8IDQ7IHJlZysrKSB7CisgICAgICAgIHR5cGUgPSBod19icmVha3BvaW50X3R5cGUoZW52LT5kcls3XSwgcmVnKTsKKyAgICAgICAgaWYgKCh0eXBlID09IDAgJiYgZW52LT5kcltyZWddID09IGVudi0+ZWlwKSB8fAorICAgICAgICAgICAgKCh0eXBlICYgMSkgJiYgZW52LT5jcHVfd2F0Y2hwb2ludFtyZWddICYmCisgICAgICAgICAgICAgKGVudi0+Y3B1X3dhdGNocG9pbnRbcmVnXS0+ZmxhZ3MgJiBCUF9XQVRDSFBPSU5UX0hJVCkpKSB7CisgICAgICAgICAgICBkcjYgfD0gMSA8PCByZWc7CisgICAgICAgICAgICBpZiAoaHdfYnJlYWtwb2ludF9lbmFibGVkKGVudi0+ZHJbN10sIHJlZykpCisgICAgICAgICAgICAgICAgaGl0X2VuYWJsZWQgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChoaXRfZW5hYmxlZCB8fCBmb3JjZV9kcjZfdXBkYXRlKQorICAgICAgICBlbnYtPmRyWzZdID0gZHI2OworICAgIHJldHVybiBoaXRfZW5hYmxlZDsKK30KKworc3RhdGljIHZvaWQgYnJlYWtwb2ludF9oYW5kbGVyKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgQ1BVQnJlYWtwb2ludCAqYnA7CisKKyAgICBpZiAoZW52LT53YXRjaHBvaW50X2hpdCkgeworICAgICAgICBpZiAoZW52LT53YXRjaHBvaW50X2hpdC0+ZmxhZ3MgJiBCUF9DUFUpIHsKKyAgICAgICAgICAgIGVudi0+d2F0Y2hwb2ludF9oaXQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGNoZWNrX2h3X2JyZWFrcG9pbnRzKGVudiwgMCkpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAxX0RCKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjcHVfcmVzdW1lX2Zyb21fc2lnbmFsKGVudiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBRVEFJTFFfRk9SRUFDSChicCwgJmVudi0+YnJlYWtwb2ludHMsIGVudHJ5KQorICAgICAgICAgICAgaWYgKGJwLT5wYyA9PSBlbnYtPmVpcCkgeworICAgICAgICAgICAgICAgIGlmIChicC0+ZmxhZ3MgJiBCUF9DUFUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfaHdfYnJlYWtwb2ludHMoZW52LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAxX0RCKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgfQorfQorCisKKy8qIFRoaXMgc2hvdWxkIGNvbWUgZnJvbSBzeXNlbXUuaCAtIGlmIHdlIGNvdWxkIGluY2x1ZGUgaXQgaGVyZS4uLiAqLwordm9pZCBxZW11X3N5c3RlbV9yZXNldF9yZXF1ZXN0KHZvaWQpOworCit2b2lkIGNwdV9pbmplY3RfeDg2X21jZShDUFVYODZTdGF0ZSAqY2VudiwgaW50IGJhbmssIHVpbnQ2NF90IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IG1jZ19zdGF0dXMsIHVpbnQ2NF90IGFkZHIsIHVpbnQ2NF90IG1pc2MpCit7CisgICAgdWludDY0X3QgbWNnX2NhcCA9IGNlbnYtPm1jZ19jYXA7CisgICAgdW5zaWduZWQgYmFua19udW0gPSBtY2dfY2FwICYgMHhmZjsKKyAgICB1aW50NjRfdCAqYmFua3MgPSBjZW52LT5tY2VfYmFua3M7CisKKyAgICBpZiAoYmFuayA+PSBiYW5rX251bSB8fCAhKHN0YXR1cyAmIE1DSV9TVEFUVVNfVkFMKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyoKKyAgICAgKiBpZiBNU1JfTUNHX0NUTCBpcyBub3QgYWxsIDFzLCB0aGUgdW5jb3JyZWN0ZWQgZXJyb3IKKyAgICAgKiByZXBvcnRpbmcgaXMgZGlzYWJsZWQKKyAgICAgKi8KKyAgICBpZiAoKHN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpICYmIChtY2dfY2FwICYgTUNHX0NUTF9QKSAmJgorICAgICAgICBjZW52LT5tY2dfY3RsICE9IH4odWludDY0X3QpMCkKKyAgICAgICAgcmV0dXJuOworICAgIGJhbmtzICs9IDQgKiBiYW5rOworICAgIC8qCisgICAgICogaWYgTVNSX01DaV9DVEwgaXMgbm90IGFsbCAxcywgdGhlIHVuY29ycmVjdGVkIGVycm9yCisgICAgICogcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgYmFuaworICAgICAqLworICAgIGlmICgoc3RhdHVzICYgTUNJX1NUQVRVU19VQykgJiYgYmFua3NbMF0gIT0gfih1aW50NjRfdCkwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpIHsKKyAgICAgICAgaWYgKChjZW52LT5tY2dfc3RhdHVzICYgTUNHX1NUQVRVU19NQ0lQKSB8fAorICAgICAgICAgICAgIShjZW52LT5jcls0XSAmIENSNF9NQ0VfTUFTSykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5qZWN0cyBtY2UgZXhjZXB0aW9uIHdoaWxlIHByZXZpb3VzICIKKyAgICAgICAgICAgICAgICAgICAgIm9uZSBpcyBpbiBwcm9ncmVzcyFcbiIpOworICAgICAgICAgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX1JFU0VULCAiVHJpcGxlIGZhdWx0XG4iKTsKKyAgICAgICAgICAgIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3QoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFua3NbMV0gJiBNQ0lfU1RBVFVTX1ZBTCkKKyAgICAgICAgICAgIHN0YXR1cyB8PSBNQ0lfU1RBVFVTX09WRVI7CisgICAgICAgIGJhbmtzWzJdID0gYWRkcjsKKyAgICAgICAgYmFua3NbM10gPSBtaXNjOworICAgICAgICBjZW52LT5tY2dfc3RhdHVzID0gbWNnX3N0YXR1czsKKyAgICAgICAgYmFua3NbMV0gPSBzdGF0dXM7CisgICAgICAgIGNwdV9pbnRlcnJ1cHQoRU5WX0dFVF9DUFUoY2VudiksIENQVV9JTlRFUlJVUFRfTUNFKTsKKyAgICB9IGVsc2UgaWYgKCEoYmFua3NbMV0gJiBNQ0lfU1RBVFVTX1ZBTCkKKyAgICAgICAgICAgICAgIHx8ICEoYmFua3NbMV0gJiBNQ0lfU1RBVFVTX1VDKSkgeworICAgICAgICBpZiAoYmFua3NbMV0gJiBNQ0lfU1RBVFVTX1ZBTCkKKyAgICAgICAgICAgIHN0YXR1cyB8PSBNQ0lfU1RBVFVTX09WRVI7CisgICAgICAgIGJhbmtzWzJdID0gYWRkcjsKKyAgICAgICAgYmFua3NbM10gPSBtaXNjOworICAgICAgICBiYW5rc1sxXSA9IHN0YXR1czsKKyAgICB9IGVsc2UKKyAgICAgICAgYmFua3NbMV0gfD0gTUNJX1NUQVRVU19PVkVSOworfQorI2VuZGlmIC8qICFDT05GSUdfVVNFUl9PTkxZICovCisKK3N0YXRpYyB2b2lkIG1jZV9pbml0KENQVVg4NlN0YXRlICpjZW52KQoreworICAgIHVuc2lnbmVkIGludCBiYW5rLCBiYW5rX251bTsKKworICAgIGlmICgoKGNlbnYtPmNwdWlkX3ZlcnNpb24gPj4gOCkmMHhmKSA+PSA2CisgICAgICAgICYmIChjZW52LT5jcHVpZF9mZWF0dXJlcyYoQ1BVSURfTUNFfENQVUlEX01DQSkpID09IChDUFVJRF9NQ0V8Q1BVSURfTUNBKSkgeworICAgICAgICBjZW52LT5tY2dfY2FwID0gTUNFX0NBUF9ERUYgfCBNQ0VfQkFOS1NfREVGOworICAgICAgICBjZW52LT5tY2dfY3RsID0gfih1aW50NjRfdCkwOworICAgICAgICBiYW5rX251bSA9IGNlbnYtPm1jZ19jYXAgJiAweGZmOworICAgICAgICBjZW52LT5tY2VfYmFua3MgPSBnX21hbGxvYzAoYmFua19udW0gKiBzaXplb2YodWludDY0X3QpICogNCk7CisgICAgICAgIGZvciAoYmFuayA9IDA7IGJhbmsgPCBiYW5rX251bTsgYmFuaysrKQorICAgICAgICAgICAgY2Vudi0+bWNlX2JhbmtzW2JhbmsqNF0gPSB+KHVpbnQ2NF90KTA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBob3N0X2NwdWlkKHVpbnQzMl90IGZ1bmN0aW9uLCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVheCwgdWludDMyX3QgKmVieCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVjeCwgdWludDMyX3QgKmVkeCkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19LVk0pCisgICAgdWludDMyX3QgdmVjWzRdOworCisjaWZkZWYgX194ODZfNjRfXworICAgIGFzbSB2b2xhdGlsZSgiY3B1aWQiCisgICAgICAgICAgICAgICAgIDogIj1hIih2ZWNbMF0pLCAiPWIiKHZlY1sxXSksCisgICAgICAgICAgICAgICAgICAgIj1jIih2ZWNbMl0pLCAiPWQiKHZlY1szXSkKKyAgICAgICAgICAgICAgICAgOiAiMCIoZnVuY3Rpb24pLCAiYyIoY291bnQpIDogImNjIik7CisjZWxzZQorICAgIGFzbSB2b2xhdGlsZSgicHVzaGEgXG5cdCIKKyAgICAgICAgICAgICAgICAgImNwdWlkIFxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgJSVlYXgsIDAoJTIpIFxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgJSVlYngsIDQoJTIpIFxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgJSVlY3gsIDgoJTIpIFxuXHQiCisgICAgICAgICAgICAgICAgICJtb3YgJSVlZHgsIDEyKCUyKSBcblx0IgorICAgICAgICAgICAgICAgICAicG9wYSIKKyAgICAgICAgICAgICAgICAgOiA6ICJhIihmdW5jdGlvbiksICJjIihjb3VudCksICJTIih2ZWMpCisgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIsICJjYyIpOworI2VuZGlmCisKKyAgICBpZiAoZWF4KQorCSplYXggPSB2ZWNbMF07CisgICAgaWYgKGVieCkKKwkqZWJ4ID0gdmVjWzFdOworICAgIGlmIChlY3gpCisJKmVjeCA9IHZlY1syXTsKKyAgICBpZiAoZWR4KQorCSplZHggPSB2ZWNbM107CisjZW5kaWYKK30KKwordm9pZCBjcHVfeDg2X2NwdWlkKENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZWF4LCB1aW50MzJfdCAqZWJ4LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICplY3gsIHVpbnQzMl90ICplZHgpCit7CisgICAgLyogdGVzdCBpZiBtYXhpbXVtIGluZGV4IHJlYWNoZWQgKi8KKyAgICBpZiAoaW5kZXggJiAweDgwMDAwMDAwKSB7CisgICAgICAgIGlmIChpbmRleCA+IGVudi0+Y3B1aWRfeGxldmVsKQorICAgICAgICAgICAgaW5kZXggPSBlbnYtPmNwdWlkX2xldmVsOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbmRleCA+IGVudi0+Y3B1aWRfbGV2ZWwpCisgICAgICAgICAgICBpbmRleCA9IGVudi0+Y3B1aWRfbGV2ZWw7CisgICAgfQorCisgICAgc3dpdGNoKGluZGV4KSB7CisgICAgY2FzZSAwOgorICAgICAgICAqZWF4ID0gZW52LT5jcHVpZF9sZXZlbDsKKyAgICAgICAgKmVieCA9IGVudi0+Y3B1aWRfdmVuZG9yMTsKKyAgICAgICAgKmVkeCA9IGVudi0+Y3B1aWRfdmVuZG9yMjsKKyAgICAgICAgKmVjeCA9IGVudi0+Y3B1aWRfdmVuZG9yMzsKKworICAgICAgICAvKiBzeXNlbnRlciBpc24ndCBzdXBwb3J0ZWQgb24gY29tcGF0aWJpbGl0eSBtb2RlIG9uIEFNRC4gIGFuZCBzeXNjYWxsCisgICAgICAgICAqIGlzbid0IHN1cHBvcnRlZCBpbiBjb21wYXRpYmlsaXR5IG1vZGUgb24gSW50ZWwuICBzbyBhZHZlcnRpc2UgdGhlCisgICAgICAgICAqIGFjdHVhbGwgY3B1LCBhbmQgc2F5IGdvb2RieWUgdG8gbWlncmF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHZlbmRvcnMKKyAgICAgICAgICogaXMgeW91IHVzZSBjb21wYXRpYmlsaXR5IG1vZGUuICovCisgICAgICAgIGlmIChrdm1fZW5hYmxlZCgpICYmICFlbnYtPmNwdWlkX3ZlbmRvcl9vdmVycmlkZSkKKyAgICAgICAgICAgIGhvc3RfY3B1aWQoMCwgMCwgTlVMTCwgZWJ4LCBlY3gsIGVkeCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgKmVheCA9IGVudi0+Y3B1aWRfdmVyc2lvbjsKKyAgICAgICAgaWYgKGt2bV9lbmFibGVkKCkgJiYgIWVudi0+Y3B1aWRfdmVuZG9yX292ZXJyaWRlKSB7CisgICAgICAgICAgICAvKiB0YWtlIG9ubHkgc3Vic2V0IG9mIGV4dCBmZWF0dXJlcyB3aGljaCBwcm9jZXNzb3IgY2FuIGhhbmRsZSAqLworICAgICAgICAgICAgdWludDMyX3QgdW51c2VkOworICAgICAgICAgICAgaG9zdF9jcHVpZCgxLCAwLCBOVUxMLCAmdW51c2VkLCBlY3gsICZ1bnVzZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmVjeCA9IFVJTlQzMl9NQVg7CisgICAgICAgIH0KKyAgICAgICAgKmVieCA9IChlbnYtPmNwdWlkX2FwaWNfaWQgPDwgMjQpIHwgOCA8PCA4OyAvKiBDTEZMVVNIIHNpemUgaW4gcXVhZCB3b3JkcywgTGludXggd2FudHMgaXQuICovCisgICAgICAgICplY3ggJj0gZW52LT5jcHVpZF9leHRfZmVhdHVyZXM7CisgICAgICAgICplZHggPSBlbnYtPmNwdWlkX2ZlYXR1cmVzOworCisgICAgICAgIC8qICJIeXBlcnZpc29yIHByZXNlbnQiIGJpdCByZXF1aXJlZCBmb3IgTWljcm9zb2Z0IFNWVlAgKi8KKyAgICAgICAgaWYgKGt2bV9lbmFibGVkKCkpCisgICAgICAgICAgICAqZWN4IHw9ICgxIDw8IDMxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICAvKiBjYWNoZSBpbmZvOiBuZWVkZWQgZm9yIFBlbnRpdW0gUHJvIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgKmVheCA9IDE7CisgICAgICAgICplYnggPSAwOworICAgICAgICAqZWN4ID0gMDsKKyAgICAgICAgKmVkeCA9IDB4MmMzMDdkOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIC8qIGNhY2hlIGluZm86IG5lZWRlZCBmb3IgQ29yZSBjb21wYXRpYmlsaXR5ICovCisgICAgICAgIHN3aXRjaCAoY291bnQpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLyogTDEgZGNhY2hlIGluZm8gKi8KKyAgICAgICAgICAgICAgICAqZWF4ID0gMHgwMDAwMTIxOworICAgICAgICAgICAgICAgICplYnggPSAweDFjMDAwM2Y7CisgICAgICAgICAgICAgICAgKmVjeCA9IDB4MDAwMDAzZjsKKyAgICAgICAgICAgICAgICAqZWR4ID0gMHgwMDAwMDAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBMMSBpY2FjaGUgaW5mbyAqLworICAgICAgICAgICAgICAgICplYXggPSAweDAwMDAxMjI7CisgICAgICAgICAgICAgICAgKmVieCA9IDB4MWMwMDAzZjsKKyAgICAgICAgICAgICAgICAqZWN4ID0gMHgwMDAwMDNmOworICAgICAgICAgICAgICAgICplZHggPSAweDAwMDAwMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIEwyIGNhY2hlIGluZm8gKi8KKyAgICAgICAgICAgICAgICAqZWF4ID0gMHgwMDAwMTQzOworICAgICAgICAgICAgICAgICplYnggPSAweDNjMDAwM2Y7CisgICAgICAgICAgICAgICAgKmVjeCA9IDB4MDAwMGZmZjsKKyAgICAgICAgICAgICAgICAqZWR4ID0gMHgwMDAwMDAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogLyogZW5kIG9mIGluZm8gKi8KKyAgICAgICAgICAgICAgICAqZWF4ID0gMDsKKyAgICAgICAgICAgICAgICAqZWJ4ID0gMDsKKyAgICAgICAgICAgICAgICAqZWN4ID0gMDsKKyAgICAgICAgICAgICAgICAqZWR4ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIC8qIG13YWl0IGluZm86IG5lZWRlZCBmb3IgQ29yZSBjb21wYXRpYmlsaXR5ICovCisgICAgICAgICplYXggPSAwOyAvKiBTbWFsbGVzdCBtb25pdG9yLWxpbmUgc2l6ZSBpbiBieXRlcyAqLworICAgICAgICAqZWJ4ID0gMDsgLyogTGFyZ2VzdCBtb25pdG9yLWxpbmUgc2l6ZSBpbiBieXRlcyAqLworICAgICAgICAqZWN4ID0gQ1BVSURfTVdBSVRfRU1YIHwgQ1BVSURfTVdBSVRfSUJFOworICAgICAgICAqZWR4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICAvKiBUaGVybWFsIGFuZCBQb3dlciBMZWFmICovCisgICAgICAgICplYXggPSAwOworICAgICAgICAqZWJ4ID0gMDsKKyAgICAgICAgKmVjeCA9IDA7CisgICAgICAgICplZHggPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICAgIC8qIERpcmVjdCBDYWNoZSBBY2Nlc3MgSW5mb3JtYXRpb24gTGVhZiAqLworICAgICAgICAqZWF4ID0gMDsgLyogQml0cyAwLTMxIGluIERDQV9DQVAgTVNSICovCisgICAgICAgICplYnggPSAwOworICAgICAgICAqZWN4ID0gMDsKKyAgICAgICAgKmVkeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhBOgorICAgICAgICAvKiBBcmNoaXRlY3R1cmFsIFBlcmZvcm1hbmNlIE1vbml0b3JpbmcgTGVhZiAqLworICAgICAgICAqZWF4ID0gMDsKKyAgICAgICAgKmVieCA9IDA7CisgICAgICAgICplY3ggPSAwOworICAgICAgICAqZWR4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDgwMDAwMDAwOgorICAgICAgICAqZWF4ID0gZW52LT5jcHVpZF94bGV2ZWw7CisgICAgICAgICplYnggPSBlbnYtPmNwdWlkX3ZlbmRvcjE7CisgICAgICAgICplZHggPSBlbnYtPmNwdWlkX3ZlbmRvcjI7CisgICAgICAgICplY3ggPSBlbnYtPmNwdWlkX3ZlbmRvcjM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MDAwMDAwMToKKyAgICAgICAgKmVheCA9IGVudi0+Y3B1aWRfZmVhdHVyZXM7CisgICAgICAgICplYnggPSAwOworICAgICAgICAqZWN4ID0gZW52LT5jcHVpZF9leHQzX2ZlYXR1cmVzOworICAgICAgICAqZWR4ID0gZW52LT5jcHVpZF9leHQyX2ZlYXR1cmVzOworCisgICAgICAgIGlmIChrdm1fZW5hYmxlZCgpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBoX2VheCwgaF9lZHg7CisKKyAgICAgICAgICAgIGhvc3RfY3B1aWQoaW5kZXgsIDAsICZoX2VheCwgTlVMTCwgTlVMTCwgJmhfZWR4KTsKKworICAgICAgICAgICAgLyogZGlzYWJsZSBDUFUgZmVhdHVyZXMgdGhhdCB0aGUgaG9zdCBkb2VzIG5vdCBzdXBwb3J0ICovCisKKyAgICAgICAgICAgIC8qIGxvbmcgbW9kZSAqLworICAgICAgICAgICAgaWYgKChoX2VkeCAmIDB4MjAwMDAwMDApID09IDAgLyogfHwgIWxtX2NhcGFibGVfa2VybmVsICovKQorICAgICAgICAgICAgICAgICplZHggJj0gfjB4MjAwMDAwMDA7CisgICAgICAgICAgICAvKiBzeXNjYWxsICovCisgICAgICAgICAgICBpZiAoKGhfZWR4ICYgMHgwMDAwMDgwMCkgPT0gMCkKKyAgICAgICAgICAgICAgICAqZWR4ICY9IH4weDAwMDAwODAwOworICAgICAgICAgICAgLyogbnggKi8KKyAgICAgICAgICAgIGlmICgoaF9lZHggJiAweDAwMTAwMDAwKSA9PSAwKQorICAgICAgICAgICAgICAgICplZHggJj0gfjB4MDAxMDAwMDA7CisKKyAgICAgICAgICAgIC8qIGRpc2FibGUgQ1BVIGZlYXR1cmVzIHRoYXQgS1ZNIGNhbm5vdCBzdXBwb3J0ICovCisKKyAgICAgICAgICAgIC8qIHN2bSAqLworICAgICAgICAgICAgKmVjeCAmPSB+NFVMOworICAgICAgICAgICAgLyogM2Rub3cgKi8KKyAgICAgICAgICAgICplZHggJj0gfjB4YzAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDgwMDAwMDAyOgorICAgIGNhc2UgMHg4MDAwMDAwMzoKKyAgICBjYXNlIDB4ODAwMDAwMDQ6CisgICAgICAgICplYXggPSBlbnYtPmNwdWlkX21vZGVsWyhpbmRleCAtIDB4ODAwMDAwMDIpICogNCArIDBdOworICAgICAgICAqZWJ4ID0gZW52LT5jcHVpZF9tb2RlbFsoaW5kZXggLSAweDgwMDAwMDAyKSAqIDQgKyAxXTsKKyAgICAgICAgKmVjeCA9IGVudi0+Y3B1aWRfbW9kZWxbKGluZGV4IC0gMHg4MDAwMDAwMikgKiA0ICsgMl07CisgICAgICAgICplZHggPSBlbnYtPmNwdWlkX21vZGVsWyhpbmRleCAtIDB4ODAwMDAwMDIpICogNCArIDNdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ODAwMDAwMDU6CisgICAgICAgIC8qIGNhY2hlIGluZm8gKEwxIGNhY2hlKSAqLworICAgICAgICAqZWF4ID0gMHgwMWZmMDFmZjsKKyAgICAgICAgKmVieCA9IDB4MDFmZjAxZmY7CisgICAgICAgICplY3ggPSAweDQwMDIwMTQwOworICAgICAgICAqZWR4ID0gMHg0MDAyMDE0MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDgwMDAwMDA2OgorICAgICAgICAvKiBjYWNoZSBpbmZvIChMMiBjYWNoZSkgKi8KKyAgICAgICAgKmVheCA9IDA7CisgICAgICAgICplYnggPSAweDQyMDA0MjAwOworICAgICAgICAqZWN4ID0gMHgwMjAwODE0MDsKKyAgICAgICAgKmVkeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MDAwMDAwODoKKyAgICAgICAgLyogdmlydHVhbCAmIHBoeXMgYWRkcmVzcyBzaXplIGluIGxvdyAyIGJ5dGVzLiAqLworLyogWFhYOiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhlIG9uZSB1c2VkIGluIHRoZSBNTVUgY29kZS4gKi8KKyAgICAgICAgaWYgKGVudi0+Y3B1aWRfZXh0Ml9mZWF0dXJlcyAmIENQVUlEX0VYVDJfTE0pIHsKKyAgICAgICAgICAgIC8qIDY0IGJpdCBwcm9jZXNzb3IgKi8KKy8qIFhYWDogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaXMgbGltaXRlZCB0byA0MiBiaXRzIGluIGV4ZWMuYy4gKi8KKyAgICAgICAgICAgICplYXggPSAweDAwMDAzMDI4OwkvKiA0OCBiaXRzIHZpcnR1YWwsIDQwIGJpdHMgcGh5c2ljYWwgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlbnYtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfUFNFMzYpCisgICAgICAgICAgICAgICAgKmVheCA9IDB4MDAwMDAwMjQ7IC8qIDM2IGJpdHMgcGh5c2ljYWwgKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZWF4ID0gMHgwMDAwMDAyMDsgLyogMzIgYml0cyBwaHlzaWNhbCAqLworICAgICAgICB9CisgICAgICAgICplYnggPSAwOworICAgICAgICAqZWN4ID0gMDsKKyAgICAgICAgKmVkeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MDAwMDAwQToKKyAgICAgICAgKmVheCA9IDB4MDAwMDAwMDE7IC8qIFNWTSBSZXZpc2lvbiAqLworICAgICAgICAqZWJ4ID0gMHgwMDAwMDAxMDsgLyogbnIgb2YgQVNJRHMgKi8KKyAgICAgICAgKmVjeCA9IDA7CisgICAgICAgICplZHggPSAwOyAvKiBvcHRpb25hbCBmZWF0dXJlcyAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiByZXNlcnZlZCB2YWx1ZXM6IHplcm8gKi8KKyAgICAgICAgKmVheCA9IDA7CisgICAgICAgICplYnggPSAwOworICAgICAgICAqZWN4ID0gMDsKKyAgICAgICAgKmVkeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworQ1BVWDg2U3RhdGUgKmNwdV94ODZfaW5pdChjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgWDg2Q1BVICp4ODZfY3B1OworICAgIENQVVg4NlN0YXRlICplbnY7CisgICAgc3RhdGljIGludCBpbml0ZWQ7CisKKyAgICB4ODZfY3B1ID0gZ19tYWxsb2MwKHNpemVvZihYODZDUFUpKTsKKyAgICBlbnYgPSAmeDg2X2NwdS0+ZW52OworICAgIEVOVl9HRVRfQ1BVKGVudiktPmVudl9wdHIgPSBlbnY7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICBjcHVfZXhlY19pbml0KGVudik7CisgICAgY3B1LT5jcHVfbW9kZWxfc3RyID0gY3B1X21vZGVsOworCisKKyAgICAvKiBpbml0IHZhcmlvdXMgc3RhdGljIHRhYmxlcyAqLworICAgIGlmICghaW5pdGVkKSB7CisgICAgICAgIGluaXRlZCA9IDE7CisgICAgICAgIG9wdGltaXplX2ZsYWdzX2luaXQoKTsKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgICAgICBjcHVfc2V0X2RlYnVnX2V4Y3BfaGFuZGxlcihicmVha3BvaW50X2hhbmRsZXIpOworI2VuZGlmCisgICAgfQorICAgIGlmIChjcHVfeDg2X3JlZ2lzdGVyKGVudiwgY3B1X21vZGVsKSA8IDApIHsKKyAgICAgICAgY3B1X3g4Nl9jbG9zZShlbnYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWNlX2luaXQoZW52KTsKKyAgICBjcHVfcmVzZXQoY3B1KTsKKworICAgIHFlbXVfaW5pdF92Y3B1KGNwdSk7CisKKyAgICBpZiAoa3ZtX2VuYWJsZWQoKSkgeworICAgICAgICBrdm1fdHJpbV9mZWF0dXJlcygmZW52LT5jcHVpZF9mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga3ZtX2FyY2hfZ2V0X3N1cHBvcnRlZF9jcHVpZChjcHUsIDEsIFJfRURYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZV9uYW1lKTsKKyAgICAgICAga3ZtX3RyaW1fZmVhdHVyZXMoJmVudi0+Y3B1aWRfZXh0X2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrdm1fYXJjaF9nZXRfc3VwcG9ydGVkX2NwdWlkKGNwdSwgMSwgUl9FQ1gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfZmVhdHVyZV9uYW1lKTsKKyAgICAgICAga3ZtX3RyaW1fZmVhdHVyZXMoJmVudi0+Y3B1aWRfZXh0Ml9mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga3ZtX2FyY2hfZ2V0X3N1cHBvcnRlZF9jcHVpZChjcHUsIDB4ODAwMDAwMDEsIFJfRURYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0Ml9mZWF0dXJlX25hbWUpOworICAgICAgICBrdm1fdHJpbV9mZWF0dXJlcygmZW52LT5jcHVpZF9leHQzX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrdm1fYXJjaF9nZXRfc3VwcG9ydGVkX2NwdWlkKGNwdSwgMHg4MDAwMDAwMSwgUl9FQ1gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHQzX2ZlYXR1cmVfbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIGVudjsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIGRvX2NwdV9pbml0KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisgICAgaW50IHNpcGkgPSBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9TSVBJOworICAgIGNwdV9yZXNldChjcHUpOworICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgPSBzaXBpOworICAgIGFwaWNfaW5pdF9yZXNldChlbnYpOworfQorCit2b2lkIGRvX2NwdV9zaXBpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgYXBpY19zaXBpKGVudik7Cit9CisjZWxzZQordm9pZCBkb19jcHVfaW5pdChDUFVYODZTdGF0ZSAqZW52KQoreworfQordm9pZCBkb19jcHVfc2lwaShDUFVYODZTdGF0ZSAqZW52KQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2hlbHBlci5oIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGY5ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9oZWxwZXIuaApAQCAtMCwwICsxLDIxOCBAQAorI2luY2x1ZGUgImV4ZWMvZGVmLWhlbHBlci5oIgorCitERUZfSEVMUEVSX0ZMQUdTXzIoY2NfY29tcHV0ZV9hbGwsIFRDR19DQUxMX05PX1NFLCBpMzIsIGVudiwgaW50KQorREVGX0hFTFBFUl9GTEFHU18yKGNjX2NvbXB1dGVfYywgVENHX0NBTExfTk9fU0UsIGkzMiwgZW52LCBpbnQpCisKK0RFRl9IRUxQRVJfMChsb2NrLCB2b2lkKQorREVGX0hFTFBFUl8wKHVubG9jaywgdm9pZCkKK0RFRl9IRUxQRVJfMyh3cml0ZV9lZmxhZ3MsIHZvaWQsIGVudiwgdGwsIGkzMikKK0RFRl9IRUxQRVJfMShyZWFkX2VmbGFncywgdGwsIGVudikKK0RFRl9IRUxQRVJfMihkaXZiX0FMLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKGlkaXZiX0FMLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKGRpdndfQVgsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIoaWRpdndfQVgsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIoZGl2bF9FQVgsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIoaWRpdmxfRUFYLCB2b2lkLCBlbnYsIHRsKQorI2lmZGVmIFRBUkdFVF9YODZfNjQKK0RFRl9IRUxQRVJfMihtdWxxX0VBWF9UMCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihpbXVscV9FQVhfVDAsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzMoaW11bHFfVDBfVDEsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMihkaXZxX0VBWCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihpZGl2cV9FQVgsIHZvaWQsIGVudiwgdGwpCisjZW5kaWYKKworREVGX0hFTFBFUl8yKGFhbSwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzIoYWFkLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMShhYWEsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShhYXMsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShkYWEsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShkYXMsIHZvaWQsIGVudikKKworREVGX0hFTFBFUl8yKGxzbCwgdGwsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobGFyLCB0bCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMih2ZXJyLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKHZlcncsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobGxkdCwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzIobHRyLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMyhsb2FkX3NlZywgdm9pZCwgZW52LCBpbnQsIGludCkKK0RFRl9IRUxQRVJfNChsam1wX3Byb3RlY3RlZCwgdm9pZCwgZW52LCBpbnQsIHRsLCBpbnQpCitERUZfSEVMUEVSXzUobGNhbGxfcmVhbCwgdm9pZCwgZW52LCBpbnQsIHRsLCBpbnQsIGludCkKK0RFRl9IRUxQRVJfNShsY2FsbF9wcm90ZWN0ZWQsIHZvaWQsIGVudiwgaW50LCB0bCwgaW50LCBpbnQpCitERUZfSEVMUEVSXzIoaXJldF9yZWFsLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMyhpcmV0X3Byb3RlY3RlZCwgdm9pZCwgZW52LCBpbnQsIGludCkKK0RFRl9IRUxQRVJfMyhscmV0X3Byb3RlY3RlZCwgdm9pZCwgZW52LCBpbnQsIGludCkKK0RFRl9IRUxQRVJfMihyZWFkX2NyTiwgdGwsIGVudiwgaW50KQorREVGX0hFTFBFUl8zKHdyaXRlX2NyTiwgdm9pZCwgZW52LCBpbnQsIHRsKQorREVGX0hFTFBFUl8yKGxtc3csIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzEoY2x0cywgdm9pZCwgZW52KQorREVGX0hFTFBFUl8zKG1vdmxfZHJOX1QwLCB2b2lkLCBlbnYsIGludCwgdGwpCitERUZfSEVMUEVSXzIoaW52bHBnLCB2b2lkLCBlbnYsIHRsKQorCitERUZfSEVMUEVSXzQoZW50ZXJfbGV2ZWwsIHZvaWQsIGVudiwgaW50LCBpbnQsIHRsKQorI2lmZGVmIFRBUkdFVF9YODZfNjQKK0RFRl9IRUxQRVJfNChlbnRlcjY0X2xldmVsLCB2b2lkLCBlbnYsIGludCwgaW50LCB0bCkKKyNlbmRpZgorREVGX0hFTFBFUl8xKHN5c2VudGVyLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIoc3lzZXhpdCwgdm9pZCwgZW52LCBpbnQpCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorREVGX0hFTFBFUl8yKHN5c2NhbGwsIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8yKHN5c3JldCwgdm9pZCwgZW52LCBpbnQpCisjZW5kaWYKK0RFRl9IRUxQRVJfMihobHQsIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8yKG1vbml0b3IsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXdhaXQsIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8xKGRlYnVnLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEocmVzZXRfcmYsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMyhyYWlzZV9pbnRlcnJ1cHQsIHZvaWQsIGVudiwgaW50LCBpbnQpCitERUZfSEVMUEVSXzIocmFpc2VfZXhjZXB0aW9uLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMShjbGksIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShzdGksIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShzZXRfaW5oaWJpdF9pcnEsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShyZXNldF9pbmhpYml0X2lycSwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8zKGJvdW5kdywgdm9pZCwgZW52LCB0bCwgaW50KQorREVGX0hFTFBFUl8zKGJvdW5kbCwgdm9pZCwgZW52LCB0bCwgaW50KQorREVGX0hFTFBFUl8xKHJzbSwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8yKGludG8sIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8yKGNtcHhjaGc4Yiwgdm9pZCwgZW52LCB0bCkKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitERUZfSEVMUEVSXzIoY21weGNoZzE2Yiwgdm9pZCwgZW52LCB0bCkKKyNlbmRpZgorREVGX0hFTFBFUl8xKHNpbmdsZV9zdGVwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoY3B1aWQsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShyZHRzYywgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKHJkcG1jLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEocmRtc3IsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMSh3cm1zciwgdm9pZCwgZW52KQorCitERUZfSEVMUEVSXzIoY2hlY2tfaW9iLCB2b2lkLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihjaGVja19pb3csIHZvaWQsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKGNoZWNrX2lvbCwgdm9pZCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzIob3V0Yiwgdm9pZCwgaTMyLCBpMzIpCitERUZfSEVMUEVSXzEoaW5iLCB0bCwgaTMyKQorREVGX0hFTFBFUl8yKG91dHcsIHZvaWQsIGkzMiwgaTMyKQorREVGX0hFTFBFUl8xKGludywgdGwsIGkzMikKK0RFRl9IRUxQRVJfMihvdXRsLCB2b2lkLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMShpbmwsIHRsLCBpMzIpCisKK0RFRl9IRUxQRVJfMyhzdm1fY2hlY2tfaW50ZXJjZXB0X3BhcmFtLCB2b2lkLCBlbnYsIGkzMiwgaTY0KQorREVGX0hFTFBFUl8zKHZtZXhpdCwgdm9pZCwgZW52LCBpMzIsIGk2NCkKK0RFRl9IRUxQRVJfNChzdm1fY2hlY2tfaW8sIHZvaWQsIGVudiwgaTMyLCBpMzIsIGkzMikKK0RFRl9IRUxQRVJfMyh2bXJ1biwgdm9pZCwgZW52LCBpbnQsIGludCkKK0RFRl9IRUxQRVJfMSh2bW1jYWxsLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIodm1sb2FkLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMih2bXNhdmUsIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8xKHN0Z2ksIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShjbGdpLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoc2tpbml0LCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIoaW52bHBnYSwgdm9pZCwgZW52LCBpbnQpCisKKy8qIHg4NiBGUFUgKi8KKworREVGX0hFTFBFUl8yKGZsZHNfRlQwLCB2b2lkLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihmbGRsX0ZUMCwgdm9pZCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoZmlsZGxfRlQwLCB2b2lkLCBlbnYsIHMzMikKK0RFRl9IRUxQRVJfMihmbGRzX1NUMCwgdm9pZCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzIoZmxkbF9TVDAsIHZvaWQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGZpbGRsX1NUMCwgdm9pZCwgZW52LCBzMzIpCitERUZfSEVMUEVSXzIoZmlsZGxsX1NUMCwgdm9pZCwgZW52LCBzNjQpCitERUZfSEVMUEVSXzEoZnN0c19TVDAsIGkzMiwgZW52KQorREVGX0hFTFBFUl8xKGZzdGxfU1QwLCBpNjQsIGVudikKK0RFRl9IRUxQRVJfMShmaXN0X1NUMCwgczMyLCBlbnYpCitERUZfSEVMUEVSXzEoZmlzdGxfU1QwLCBzMzIsIGVudikKK0RFRl9IRUxQRVJfMShmaXN0bGxfU1QwLCBzNjQsIGVudikKK0RFRl9IRUxQRVJfMShmaXN0dF9TVDAsIHMzMiwgZW52KQorREVGX0hFTFBFUl8xKGZpc3R0bF9TVDAsIHMzMiwgZW52KQorREVGX0hFTFBFUl8xKGZpc3R0bGxfU1QwLCBzNjQsIGVudikKK0RFRl9IRUxQRVJfMihmbGR0X1NUMCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihmc3R0X1NUMCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMShmcHVzaCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZwb3AsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmZGVjc3RwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZmluY3N0cCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8yKGZmcmVlX1NUTiwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzEoZm1vdl9TVDBfRlQwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIoZm1vdl9GVDBfU1ROLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMihmbW92X1NUMF9TVE4sIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8yKGZtb3ZfU1ROX1NUMCwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzIoZnhjaGdfU1QwX1NUTiwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzEoZmNvbV9TVDBfRlQwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnVjb21fU1QwX0ZUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZjb21pX1NUMF9GVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmdWNvbWlfU1QwX0ZUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZhZGRfU1QwX0ZUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZtdWxfU1QwX0ZUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZzdWJfU1QwX0ZUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZzdWJyX1NUMF9GVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmZGl2X1NUMF9GVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmZGl2cl9TVDBfRlQwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIoZmFkZF9TVE5fU1QwLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMihmbXVsX1NUTl9TVDAsIHZvaWQsIGVudiwgaW50KQorREVGX0hFTFBFUl8yKGZzdWJfU1ROX1NUMCwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzIoZnN1YnJfU1ROX1NUMCwgdm9pZCwgZW52LCBpbnQpCitERUZfSEVMUEVSXzIoZmRpdl9TVE5fU1QwLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMihmZGl2cl9TVE5fU1QwLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMShmY2hzX1NUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZhYnNfU1QwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnhhbV9TVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmbGQxX1NUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZsZGwydF9TVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmbGRsMmVfU1QwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZmxkcGlfU1QwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZmxkbGcyX1NUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZsZGxuMl9TVDAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmbGR6X1NUMCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZsZHpfRlQwLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZm5zdHN3LCBpMzIsIGVudikKK0RFRl9IRUxQRVJfMShmbnN0Y3csIGkzMiwgZW52KQorREVGX0hFTFBFUl8yKGZsZGN3LCB2b2lkLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMShmY2xleCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZ3YWl0LCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZm5pbml0LCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzIoZmJsZF9TVDAsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIoZmJzdF9TVDAsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzEoZjJ4bTEsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmeWwyeCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZwdGFuLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnBhdGFuLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnh0cmFjdCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZwcmVtMSwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZwcmVtLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnlsMnhwMSwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZzcXJ0LCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZnNpbmNvcywgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGZybmRpbnQsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmc2NhbGUsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShmc2luLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZmNvcywgdm9pZCwgZW52KQorREVGX0hFTFBFUl8zKGZzdGVudiwgdm9pZCwgZW52LCB0bCwgaW50KQorREVGX0hFTFBFUl8zKGZsZGVudiwgdm9pZCwgZW52LCB0bCwgaW50KQorREVGX0hFTFBFUl8zKGZzYXZlLCB2b2lkLCBlbnYsIHRsLCBpbnQpCitERUZfSEVMUEVSXzMoZnJzdG9yLCB2b2lkLCBlbnYsIHRsLCBpbnQpCitERUZfSEVMUEVSXzMoZnhzYXZlLCB2b2lkLCBlbnYsIHRsLCBpbnQpCitERUZfSEVMUEVSXzMoZnhyc3Rvciwgdm9pZCwgZW52LCB0bCwgaW50KQorREVGX0hFTFBFUl8xKGJzZiwgdGwsIHRsKQorREVGX0hFTFBFUl8xKGJzciwgdGwsIHRsKQorCisvKiBNTVgvU1NFICovCisKK0RFRl9IRUxQRVJfMShlbnRlcl9tbXgsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMShlbW1zLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzMobW92cSwgdm9pZCwgZW52LCBwdHIsIHB0cikKKworI2RlZmluZSBTSElGVCAwCisjaW5jbHVkZSAib3BzX3NzZV9oZWFkZXIuaCIKKyNkZWZpbmUgU0hJRlQgMQorI2luY2x1ZGUgIm9wc19zc2VfaGVhZGVyLmgiCisKK0RFRl9IRUxQRVJfMyhyY2xiLCB0bCwgZW52LCB0bCwgdGwpCitERUZfSEVMUEVSXzMocmNsdywgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKHJjbGwsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhyY3JiLCB0bCwgZW52LCB0bCwgdGwpCitERUZfSEVMUEVSXzMocmNydywgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKHJjcmwsIHRsLCBlbnYsIHRsLCB0bCkKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitERUZfSEVMUEVSXzMocmNscSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKHJjcnEsIHRsLCBlbnYsIHRsLCB0bCkKKyNlbmRpZgorCisjaW5jbHVkZSAiZXhlYy9kZWYtaGVscGVyLmgiCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2ludF9oZWxwZXIuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvaW50X2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTU5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2ludF9oZWxwZXIuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqICB4ODYgaW50ZWdlciBoZWxwZXJzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorCisvLyNkZWZpbmUgREVCVUdfTVVMRElWCisKKy8qIG1vZHVsbyAxNyB0YWJsZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmNsd190YWJsZVszMl0gPSB7CisgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywKKyAgICA4LCA5LDEwLDExLDEyLDEzLDE0LDE1LAorICAgMTYsIDAsIDEsIDIsIDMsIDQsIDUsIDYsCisgICAgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKK307CisKKy8qIG1vZHVsbyA5IHRhYmxlICovCitzdGF0aWMgY29uc3QgdWludDhfdCByY2xiX3RhYmxlWzMyXSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LAorICAgIDgsIDAsIDEsIDIsIDMsIDQsIDUsIDYsCisgICAgNywgOCwgMCwgMSwgMiwgMywgNCwgNSwKKyAgICA2LCA3LCA4LCAwLCAxLCAyLCAzLCA0LAorfTsKKworLyogZGl2aXNpb24sIGZsYWdzIGFyZSB1bmRlZmluZWQgKi8KKwordm9pZCBoZWxwZXJfZGl2Yl9BTChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgdW5zaWduZWQgaW50IG51bSwgZGVuLCBxLCByOworCisgICAgbnVtID0gKEVBWCAmIDB4ZmZmZik7CisgICAgZGVuID0gKHQwICYgMHhmZik7CisgICAgaWYgKGRlbiA9PSAwKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICB9CisgICAgcSA9IChudW0gLyBkZW4pOworICAgIGlmIChxID4gMHhmZikKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAwX0RJVlopOworICAgIHEgJj0gMHhmZjsKKyAgICByID0gKG51bSAlIGRlbikgJiAweGZmOworICAgIEVBWCA9IChFQVggJiB+MHhmZmZmKSB8IChyIDw8IDgpIHwgcTsKK30KKwordm9pZCBoZWxwZXJfaWRpdmJfQUwoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHQwKQoreworICAgIGludCBudW0sIGRlbiwgcSwgcjsKKworICAgIG51bSA9IChpbnQxNl90KUVBWDsKKyAgICBkZW4gPSAoaW50OF90KXQwOworICAgIGlmIChkZW4gPT0gMCkgeworICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMDBfRElWWik7CisgICAgfQorICAgIHEgPSAobnVtIC8gZGVuKTsKKyAgICBpZiAocSAhPSAoaW50OF90KXEpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICBxICY9IDB4ZmY7CisgICAgciA9IChudW0gJSBkZW4pICYgMHhmZjsKKyAgICBFQVggPSAoRUFYICYgfjB4ZmZmZikgfCAociA8PCA4KSB8IHE7Cit9CisKK3ZvaWQgaGVscGVyX2RpdndfQVgoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHQwKQoreworICAgIHVuc2lnbmVkIGludCBudW0sIGRlbiwgcSwgcjsKKworICAgIG51bSA9IChFQVggJiAweGZmZmYpIHwgKChFRFggJiAweGZmZmYpIDw8IDE2KTsKKyAgICBkZW4gPSAodDAgJiAweGZmZmYpOworICAgIGlmIChkZW4gPT0gMCkgeworICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMDBfRElWWik7CisgICAgfQorICAgIHEgPSAobnVtIC8gZGVuKTsKKyAgICBpZiAocSA+IDB4ZmZmZikKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAwX0RJVlopOworICAgIHEgJj0gMHhmZmZmOworICAgIHIgPSAobnVtICUgZGVuKSAmIDB4ZmZmZjsKKyAgICBFQVggPSAoRUFYICYgfjB4ZmZmZikgfCBxOworICAgIEVEWCA9IChFRFggJiB+MHhmZmZmKSB8IHI7Cit9CisKK3ZvaWQgaGVscGVyX2lkaXZ3X0FYKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyB0MCkKK3sKKyAgICBpbnQgbnVtLCBkZW4sIHEsIHI7CisKKyAgICBudW0gPSAoRUFYICYgMHhmZmZmKSB8ICgoRURYICYgMHhmZmZmKSA8PCAxNik7CisgICAgZGVuID0gKGludDE2X3QpdDA7CisgICAgaWYgKGRlbiA9PSAwKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICB9CisgICAgcSA9IChudW0gLyBkZW4pOworICAgIGlmIChxICE9IChpbnQxNl90KXEpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICBxICY9IDB4ZmZmZjsKKyAgICByID0gKG51bSAlIGRlbikgJiAweGZmZmY7CisgICAgRUFYID0gKEVBWCAmIH4weGZmZmYpIHwgcTsKKyAgICBFRFggPSAoRURYICYgfjB4ZmZmZikgfCByOworfQorCit2b2lkIGhlbHBlcl9kaXZsX0VBWChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgdW5zaWduZWQgaW50IGRlbiwgcjsKKyAgICB1aW50NjRfdCBudW0sIHE7CisKKyAgICBudW0gPSAoKHVpbnQzMl90KUVBWCkgfCAoKHVpbnQ2NF90KSgodWludDMyX3QpRURYKSA8PCAzMik7CisgICAgZGVuID0gdDA7CisgICAgaWYgKGRlbiA9PSAwKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICB9CisgICAgcSA9IChudW0gLyBkZW4pOworICAgIHIgPSAobnVtICUgZGVuKTsKKyAgICBpZiAocSA+IDB4ZmZmZmZmZmYpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICBFQVggPSAodWludDMyX3QpcTsKKyAgICBFRFggPSAodWludDMyX3QpcjsKK30KKwordm9pZCBoZWxwZXJfaWRpdmxfRUFYKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyB0MCkKK3sKKyAgICBpbnQgZGVuLCByOworICAgIGludDY0X3QgbnVtLCBxOworCisgICAgbnVtID0gKCh1aW50MzJfdClFQVgpIHwgKCh1aW50NjRfdCkoKHVpbnQzMl90KUVEWCkgPDwgMzIpOworICAgIGRlbiA9IHQwOworICAgIGlmIChkZW4gPT0gMCkgeworICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMDBfRElWWik7CisgICAgfQorICAgIHEgPSAobnVtIC8gZGVuKTsKKyAgICByID0gKG51bSAlIGRlbik7CisgICAgaWYgKHEgIT0gKGludDMyX3QpcSkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAwX0RJVlopOworICAgIEVBWCA9ICh1aW50MzJfdClxOworICAgIEVEWCA9ICh1aW50MzJfdClyOworfQorCisvKiBiY2QgKi8KKworLyogWFhYOiBleGNlcHRpb24gKi8KK3ZvaWQgaGVscGVyX2FhbShDUFVYODZTdGF0ZSAqZW52LCBpbnQgYmFzZSkKK3sKKyAgICBpbnQgYWwsIGFoOworICAgIGFsID0gRUFYICYgMHhmZjsKKyAgICBhaCA9IGFsIC8gYmFzZTsKKyAgICBhbCA9IGFsICUgYmFzZTsKKyAgICBFQVggPSAoRUFYICYgfjB4ZmZmZikgfCBhbCB8IChhaCA8PCA4KTsKKyAgICBDQ19EU1QgPSBhbDsKK30KKwordm9pZCBoZWxwZXJfYWFkKENQVVg4NlN0YXRlICplbnYsIGludCBiYXNlKQoreworICAgIGludCBhbCwgYWg7CisgICAgYWwgPSBFQVggJiAweGZmOworICAgIGFoID0gKEVBWCA+PiA4KSAmIDB4ZmY7CisgICAgYWwgPSAoKGFoICogYmFzZSkgKyBhbCkgJiAweGZmOworICAgIEVBWCA9IChFQVggJiB+MHhmZmZmKSB8IGFsOworICAgIENDX0RTVCA9IGFsOworfQorCit2b2lkIGhlbHBlcl9hYWEoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBpbnQgaWNhcnJ5OworICAgIGludCBhbCwgYWgsIGFmOworICAgIGludCBlZmxhZ3M7CisKKyAgICBlZmxhZ3MgPSBoZWxwZXJfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCk7CisgICAgYWYgPSBlZmxhZ3MgJiBDQ19BOworICAgIGFsID0gRUFYICYgMHhmZjsKKyAgICBhaCA9IChFQVggPj4gOCkgJiAweGZmOworCisgICAgaWNhcnJ5ID0gKGFsID4gMHhmOSk7CisgICAgaWYgKCgoYWwgJiAweDBmKSA+IDkgKSB8fCBhZikgeworICAgICAgICBhbCA9IChhbCArIDYpICYgMHgwZjsKKyAgICAgICAgYWggPSAoYWggKyAxICsgaWNhcnJ5KSAmIDB4ZmY7CisgICAgICAgIGVmbGFncyB8PSBDQ19DIHwgQ0NfQTsKKyAgICB9IGVsc2UgeworICAgICAgICBlZmxhZ3MgJj0gfihDQ19DIHwgQ0NfQSk7CisgICAgICAgIGFsICY9IDB4MGY7CisgICAgfQorICAgIEVBWCA9IChFQVggJiB+MHhmZmZmKSB8IGFsIHwgKGFoIDw8IDgpOworICAgIENDX1NSQyA9IGVmbGFnczsKK30KKwordm9pZCBoZWxwZXJfYWFzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGljYXJyeTsKKyAgICBpbnQgYWwsIGFoLCBhZjsKKyAgICBpbnQgZWZsYWdzOworCisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGFmID0gZWZsYWdzICYgQ0NfQTsKKyAgICBhbCA9IEVBWCAmIDB4ZmY7CisgICAgYWggPSAoRUFYID4+IDgpICYgMHhmZjsKKworICAgIGljYXJyeSA9IChhbCA8IDYpOworICAgIGlmICgoKGFsICYgMHgwZikgPiA5ICkgfHwgYWYpIHsKKyAgICAgICAgYWwgPSAoYWwgLSA2KSAmIDB4MGY7CisgICAgICAgIGFoID0gKGFoIC0gMSAtIGljYXJyeSkgJiAweGZmOworICAgICAgICBlZmxhZ3MgfD0gQ0NfQyB8IENDX0E7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWZsYWdzICY9IH4oQ0NfQyB8IENDX0EpOworICAgICAgICBhbCAmPSAweDBmOworICAgIH0KKyAgICBFQVggPSAoRUFYICYgfjB4ZmZmZikgfCBhbCB8IChhaCA8PCA4KTsKKyAgICBDQ19TUkMgPSBlZmxhZ3M7Cit9CisKK3ZvaWQgaGVscGVyX2RhYShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGludCBhbCwgYWYsIGNmOworICAgIGludCBlZmxhZ3M7CisKKyAgICBlZmxhZ3MgPSBoZWxwZXJfY2NfY29tcHV0ZV9hbGwoZW52LCBDQ19PUCk7CisgICAgY2YgPSBlZmxhZ3MgJiBDQ19DOworICAgIGFmID0gZWZsYWdzICYgQ0NfQTsKKyAgICBhbCA9IEVBWCAmIDB4ZmY7CisKKyAgICBlZmxhZ3MgPSAwOworICAgIGlmICgoKGFsICYgMHgwZikgPiA5ICkgfHwgYWYpIHsKKyAgICAgICAgYWwgPSAoYWwgKyA2KSAmIDB4ZmY7CisgICAgICAgIGVmbGFncyB8PSBDQ19BOworICAgIH0KKyAgICBpZiAoKGFsID4gMHg5ZikgfHwgY2YpIHsKKyAgICAgICAgYWwgPSAoYWwgKyAweDYwKSAmIDB4ZmY7CisgICAgICAgIGVmbGFncyB8PSBDQ19DOworICAgIH0KKyAgICBFQVggPSAoRUFYICYgfjB4ZmYpIHwgYWw7CisgICAgLyogd2VsbCwgc3BlZWQgaXMgbm90IGFuIGlzc3VlIGhlcmUsIHNvIHdlIGNvbXB1dGUgdGhlIGZsYWdzIGJ5IGhhbmQgKi8KKyAgICBlZmxhZ3MgfD0gKGFsID09IDApIDw8IDY7IC8qIHpmICovCisgICAgZWZsYWdzIHw9IHBhcml0eV90YWJsZVthbF07IC8qIHBmICovCisgICAgZWZsYWdzIHw9IChhbCAmIDB4ODApOyAvKiBzZiAqLworICAgIENDX1NSQyA9IGVmbGFnczsKK30KKwordm9pZCBoZWxwZXJfZGFzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaW50IGFsLCBhbDEsIGFmLCBjZjsKKyAgICBpbnQgZWZsYWdzOworCisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGNmID0gZWZsYWdzICYgQ0NfQzsKKyAgICBhZiA9IGVmbGFncyAmIENDX0E7CisgICAgYWwgPSBFQVggJiAweGZmOworCisgICAgZWZsYWdzID0gMDsKKyAgICBhbDEgPSBhbDsKKyAgICBpZiAoKChhbCAmIDB4MGYpID4gOSApIHx8IGFmKSB7CisgICAgICAgIGVmbGFncyB8PSBDQ19BOworICAgICAgICBpZiAoYWwgPCA2IHx8IGNmKQorICAgICAgICAgICAgZWZsYWdzIHw9IENDX0M7CisgICAgICAgIGFsID0gKGFsIC0gNikgJiAweGZmOworICAgIH0KKyAgICBpZiAoKGFsMSA+IDB4OTkpIHx8IGNmKSB7CisgICAgICAgIGFsID0gKGFsIC0gMHg2MCkgJiAweGZmOworICAgICAgICBlZmxhZ3MgfD0gQ0NfQzsKKyAgICB9CisgICAgRUFYID0gKEVBWCAmIH4weGZmKSB8IGFsOworICAgIC8qIHdlbGwsIHNwZWVkIGlzIG5vdCBhbiBpc3N1ZSBoZXJlLCBzbyB3ZSBjb21wdXRlIHRoZSBmbGFncyBieSBoYW5kICovCisgICAgZWZsYWdzIHw9IChhbCA9PSAwKSA8PCA2OyAvKiB6ZiAqLworICAgIGVmbGFncyB8PSBwYXJpdHlfdGFibGVbYWxdOyAvKiBwZiAqLworICAgIGVmbGFncyB8PSAoYWwgJiAweDgwKTsgLyogc2YgKi8KKyAgICBDQ19TUkMgPSBlZmxhZ3M7Cit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisKK3N0YXRpYyB2b2lkIGFkZDEyOCh1aW50NjRfdCAqcGxvdywgdWludDY0X3QgKnBoaWdoLCB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgICpwbG93ICs9IGE7CisgICAgLyogY2FycnkgdGVzdCAqLworICAgIGlmICgqcGxvdyA8IGEpCisgICAgICAgICgqcGhpZ2gpKys7CisgICAgKnBoaWdoICs9IGI7Cit9CisKK3N0YXRpYyB2b2lkIG5lZzEyOCh1aW50NjRfdCAqcGxvdywgdWludDY0X3QgKnBoaWdoKQoreworICAgICpwbG93ID0gfiAqcGxvdzsKKyAgICAqcGhpZ2ggPSB+ICpwaGlnaDsKKyAgICBhZGQxMjgocGxvdywgcGhpZ2gsIDEsIDApOworfQorCisvKiByZXR1cm4gVFJVRSBpZiBvdmVyZmxvdyAqLworc3RhdGljIGludCBkaXY2NCh1aW50NjRfdCAqcGxvdywgdWludDY0X3QgKnBoaWdoLCB1aW50NjRfdCBiKQoreworICAgIHVpbnQ2NF90IHEsIHIsIGExLCBhMDsKKyAgICBpbnQgaSwgcWIsIGFiOworCisgICAgYTAgPSAqcGxvdzsKKyAgICBhMSA9ICpwaGlnaDsKKyAgICBpZiAoYTEgPT0gMCkgeworICAgICAgICBxID0gYTAgLyBiOworICAgICAgICByID0gYTAgJSBiOworICAgICAgICAqcGxvdyA9IHE7CisgICAgICAgICpwaGlnaCA9IHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGExID49IGIpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgLyogWFhYOiB1c2UgYSBiZXR0ZXIgYWxnb3JpdGhtICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIGFiID0gYTEgPj4gNjM7CisgICAgICAgICAgICBhMSA9IChhMSA8PCAxKSB8IChhMCA+PiA2Myk7CisgICAgICAgICAgICBpZiAoYWIgfHwgYTEgPj0gYikgeworICAgICAgICAgICAgICAgIGExIC09IGI7CisgICAgICAgICAgICAgICAgcWIgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxYiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhMCA9IChhMCA8PCAxKSB8IHFiOworICAgICAgICB9CisjaWYgZGVmaW5lZChERUJVR19NVUxESVYpCisgICAgICAgIHByaW50ZigiZGl2OiAweCUwMTYiIFBSSXg2NCAiJTAxNiIgUFJJeDY0ICIgLyAweCUwMTYiIFBSSXg2NCAiOiBxPTB4JTAxNiIgUFJJeDY0ICIgcj0weCUwMTYiIFBSSXg2NCAiXG4iLAorICAgICAgICAgICAgICAgKnBoaWdoLCAqcGxvdywgYiwgYTAsIGExKTsKKyNlbmRpZgorICAgICAgICAqcGxvdyA9IGEwOworICAgICAgICAqcGhpZ2ggPSBhMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiBUUlVFIGlmIG92ZXJmbG93ICovCitzdGF0aWMgaW50IGlkaXY2NCh1aW50NjRfdCAqcGxvdywgdWludDY0X3QgKnBoaWdoLCBpbnQ2NF90IGIpCit7CisgICAgaW50IHNhLCBzYjsKKyAgICBzYSA9ICgoaW50NjRfdCkqcGhpZ2ggPCAwKTsKKyAgICBpZiAoc2EpCisgICAgICAgIG5lZzEyOChwbG93LCBwaGlnaCk7CisgICAgc2IgPSAoYiA8IDApOworICAgIGlmIChzYikKKyAgICAgICAgYiA9IC1iOworICAgIGlmIChkaXY2NChwbG93LCBwaGlnaCwgYikgIT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHNhIF4gc2IpIHsKKyAgICAgICAgaWYgKCpwbG93ID4gKDFVTEwgPDwgNjMpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICpwbG93ID0gLSAqcGxvdzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKnBsb3cgPj0gKDFVTEwgPDwgNjMpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChzYSkKKyAgICAgICAgKnBoaWdoID0gLSAqcGhpZ2g7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGVscGVyX211bHFfRUFYX1QwKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyB0MCkKK3sKKyAgICB1aW50NjRfdCByMCwgcjE7CisKKyAgICBtdWx1NjQoJnIwLCAmcjEsIEVBWCwgdDApOworICAgIEVBWCA9IHIwOworICAgIEVEWCA9IHIxOworICAgIENDX0RTVCA9IHIwOworICAgIENDX1NSQyA9IHIxOworfQorCit2b2lkIGhlbHBlcl9pbXVscV9FQVhfVDAoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHQwKQoreworICAgIHVpbnQ2NF90IHIwLCByMTsKKworICAgIG11bHM2NCgmcjAsICZyMSwgRUFYLCB0MCk7CisgICAgRUFYID0gcjA7CisgICAgRURYID0gcjE7CisgICAgQ0NfRFNUID0gcjA7CisgICAgQ0NfU1JDID0gKChpbnQ2NF90KXIxICE9ICgoaW50NjRfdClyMCA+PiA2MykpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2ltdWxxX1QwX1QxKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyB0MCwgdGFyZ2V0X3Vsb25nIHQxKQoreworICAgIHVpbnQ2NF90IHIwLCByMTsKKworICAgIG11bHM2NCgmcjAsICZyMSwgdDAsIHQxKTsKKyAgICBDQ19EU1QgPSByMDsKKyAgICBDQ19TUkMgPSAoKGludDY0X3QpcjEgIT0gKChpbnQ2NF90KXIwID4+IDYzKSk7CisgICAgcmV0dXJuIHIwOworfQorCit2b2lkIGhlbHBlcl9kaXZxX0VBWChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgdWludDY0X3QgcjAsIHIxOworICAgIGlmICh0MCA9PSAwKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICB9CisgICAgcjAgPSBFQVg7CisgICAgcjEgPSBFRFg7CisgICAgaWYgKGRpdjY0KCZyMCwgJnIxLCB0MCkpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICBFQVggPSByMDsKKyAgICBFRFggPSByMTsKK30KKwordm9pZCBoZWxwZXJfaWRpdnFfRUFYKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyB0MCkKK3sKKyAgICB1aW50NjRfdCByMCwgcjE7CisgICAgaWYgKHQwID09IDApIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDAwX0RJVlopOworICAgIH0KKyAgICByMCA9IEVBWDsKKyAgICByMSA9IEVEWDsKKyAgICBpZiAoaWRpdjY0KCZyMCwgJnIxLCB0MCkpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwMF9ESVZaKTsKKyAgICBFQVggPSByMDsKKyAgICBFRFggPSByMTsKK30KKworI2VuZGlmCisKKyNkZWZpbmUgU0hJRlQgMAorI2luY2x1ZGUgInNoaWZ0X2hlbHBlcl90ZW1wbGF0ZS5oIgorI3VuZGVmIFNISUZUCisKKyNkZWZpbmUgU0hJRlQgMQorI2luY2x1ZGUgInNoaWZ0X2hlbHBlcl90ZW1wbGF0ZS5oIgorI3VuZGVmIFNISUZUCisKKyNkZWZpbmUgU0hJRlQgMgorI2luY2x1ZGUgInNoaWZ0X2hlbHBlcl90ZW1wbGF0ZS5oIgorI3VuZGVmIFNISUZUCisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisjZGVmaW5lIFNISUZUIDMKKyNpbmNsdWRlICJzaGlmdF9oZWxwZXJfdGVtcGxhdGUuaCIKKyN1bmRlZiBTSElGVAorI2VuZGlmCisKKy8qIGJpdCBvcGVyYXRpb25zICovCit0YXJnZXRfdWxvbmcgaGVscGVyX2JzZih0YXJnZXRfdWxvbmcgdDApCit7CisgICAgaW50IGNvdW50OworICAgIHRhcmdldF91bG9uZyByZXM7CisKKyAgICByZXMgPSB0MDsKKyAgICBjb3VudCA9IDA7CisgICAgd2hpbGUgKChyZXMgJiAxKSA9PSAwKSB7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIHJlcyA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2Jzcih0YXJnZXRfdWxvbmcgdDApCit7CisgICAgaW50IGNvdW50OworICAgIHRhcmdldF91bG9uZyByZXMsIG1hc2s7CisKKyAgICByZXMgPSB0MDsKKyAgICBjb3VudCA9IFRBUkdFVF9MT05HX0JJVFMgLSAxOworICAgIG1hc2sgPSAodGFyZ2V0X3Vsb25nKTEgPDwgKFRBUkdFVF9MT05HX0JJVFMgLSAxKTsKKyAgICB3aGlsZSAoKHJlcyAmIG1hc2spID09IDApIHsKKyAgICAgICAgY291bnQtLTsKKyAgICAgICAgcmVzIDw8PSAxOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2t2bS1ncy1yZXN0b3JlLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2t2bS1ncy1yZXN0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhNmFiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYva3ZtLWdzLXJlc3RvcmUuYwpAQCAtMCwwICsxLDE4NyBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisKKyNpZmRlZiBDT05GSUdfS1ZNX0dTX1JFU1RPUkUKKworI2RlZmluZSBJTlZBTElEX0dTX1JFRyAgMHhmZmZmCisjZGVmaW5lIEtWTV9HU19SRVNUT1JFX05PREVURUNURUQgMHgxCisjZGVmaW5lIEtWTV9HU19SRVNUT1JFX05PIDB4MgorI2RlZmluZSBLVk1fR1NfUkVTVE9SRV9ZRVMgMHgzCitpbnQgaW5pdGlhbF9ncyA9IElOVkFMSURfR1NfUkVHOworaW50IGdzX25lZWRfcmVzdG9yZSA9IEtWTV9HU19SRVNUT1JFX05PREVURUNURUQ7CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVncyhpbnQgZ3MpCit7CisgICAgYXNtKCJtb3ZsICUwLCAlJWdzIjo6InIiKGdzKSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX2dldGdzKCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZ3MgPSAwOworICAgIGFzbSgibW92bCAlJWdzLCUwIiA6Ij1yIihncyk6KTsKKyAgICByZXR1cm4gZ3M7Cit9CisKKy8qIE5vIGZwcmludGYgb3IgYW55IHN5c3RlbSBjYWxsIGJlZm9yZSB0aGUgZ3MgaXMgcmVzdG9yZWQgc3VjY2Vzc2Z1bGx5ICovCitzdGF0aWMgdm9pZCBjaGVja19hbmRfcmVzdG9yZV9ncyh2b2lkKQoreworICAgIGlmIChnc19uZWVkX3Jlc3RvcmUgPT0gS1ZNX0dTX1JFU1RPUkVfTk8pCisgICAgICAgIHJldHVybjsKKworICAgIHJlc3RvcmVncyhpbml0aWFsX2dzKTsKK30KKworc3RydWN0IHNpZ2FjdF9zdGF0dXMKK3sKKyAgICB1bnNpZ25lZCBpbnQgc2lnYWN0aW9uOjE7CisgICAgX19zaWdoYW5kbGVyX3Qgb2xkX2hhbmRsZXI7CisgICAgdm9pZCAoKm9sZF9zaWdhY3Rpb24pIChpbnQsIHNpZ2luZm9fdCAqLCB2b2lkICopOworfTsKK3N0YXRpYyBzdHJ1Y3Qgc2lnYWN0X3N0YXR1cyBvX3NpZ2FjdFtTSUdVTlVTRURdOworCitzdGF0aWMgdm9pZCB0ZW1wX3NpZ19oYW5kbGVyKGludCBzaWdudW0pCit7CisgICAgLyogISEhIG11c3QgcmVzdG9yZSBncyBmaXJzdGx5ICovCisgICAgY2hlY2tfYW5kX3Jlc3RvcmVfZ3MoKTsKKworICAgIGlmIChzaWdudW0gPCBTSUdIVVAgfHwgc2lnbnVtID49IFNJR1VOVVNFRCkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBzaWduYWwgJXggaW4gdGVtcF9zaWdfaGFuZGxlclxuIiwgc2lnbnVtKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBpZiAoICFvX3NpZ2FjdFtzaWdudW1dLnNpZ2FjdGlvbiAmJiBvX3NpZ2FjdFtzaWdudW1dLm9sZF9oYW5kbGVyKQorICAgICAgICBvX3NpZ2FjdFtzaWdudW1dLm9sZF9oYW5kbGVyKHNpZ251bSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNpZ25hbCBpbiB0ZW1wX3NpZ19oYW5kbGVyOiAiCisgICAgICAgICAgICAgInNpZ25hbCAleCBzYV9pbmZvICVzISFcbiIsCisgICAgICAgICAgICAgc2lnbnVtLCBvX3NpZ2FjdFtzaWdudW1dLnNpZ2FjdGlvbiA/ICJzZXQiOiJub3Qgc2V0IiApOworICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlbXBfc2lnX3NpZ2FjdGlvbihpbnQgc2lnbnVtLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnVjb250ZXh0KQoreworICAgIC8qICEhISBtdXN0IHJlc3RvcmUgZ3MgZmlyc3RseSAqLworICAgIGNoZWNrX2FuZF9yZXN0b3JlX2dzKCk7CisKKyAgICBpZiAoc2lnbnVtIDwgU0lHSFVQIHx8IHNpZ251bSA+PSBTSUdVTlVTRUQpCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2lnbmFsICV4IGluIHRlbXBfc2lnX3NpZ2FjdGlvblxuIiwgc2lnbnVtKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisKKyAgICBpZiAoIG9fc2lnYWN0W3NpZ251bV0uc2lnYWN0aW9uICYmIG9fc2lnYWN0W3NpZ251bV0ub2xkX3NpZ2FjdGlvbiApCisgICAgICAgIG9fc2lnYWN0W3NpZ251bV0ub2xkX3NpZ2FjdGlvbihzaWdudW0sIGluZm8sIHVjb250ZXh0KTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgc2lnbmFsIGluIHRlbXBfc2lnX3NpZ2FjdGlvbjogIgorICAgICAgICAgICAgICJzaWduYWwgJXggc2FfaW5mbyAlcyEhXG4iLAorICAgICAgICAgICAgIHNpZ251bSwgb19zaWdhY3Rbc2lnbnVtXS5zaWdhY3Rpb24gPyAic2V0Ijoibm90IHNldCIgKTsKKyAgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNpZ190YWtlbiA9IDA7CisKK3N0YXRpYyBpbnQgdGFrZV9zaWduYWxfaGFuZGxlcih2b2lkKQoreworICAgIGludCBpOworCisgICAgaWYgKGdzX25lZWRfcmVzdG9yZSA9PSBLVk1fR1NfUkVTVE9SRV9OTykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHNpZ190YWtlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1zZXQob19zaWdhY3QsIDAsIHNpemVvZihvX3NpZ2FjdCkpOworCisgICAgLyogU0lHSFVQIGlzIDEgaW4gUE9TSVggKi8KKyAgICBmb3IgKGkgPSBTSUdIVVA7IGkgPCBTSUdVTlVTRUQ7IGkrKykKKyAgICB7CisgICAgICAgIGludCBzaWdyZXQ7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gYWN0LCBvbGRfYWN0OworCisgICAgICAgIHNpZ3JldCA9IHNpZ2FjdGlvbihpLCBOVUxMLCAmb2xkX2FjdCk7CisgICAgICAgIGlmIChzaWdyZXQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0YWtlIHRoZSBoYW5kbGVyIGZvciBkZWZhdWx0IG9yIGlnbm9yZSBzaWduYWxzICovCisgICAgICAgIGlmICggIShvbGRfYWN0LnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgJiYKKyAgICAgICAgICAgICAgICgob2xkX2FjdC5zYV9oYW5kbGVyID09IFNJR19JR04gKSB8fAorICAgICAgICAgICAgICAgIChvbGRfYWN0LnNhX2hhbmRsZXIgPT0gU0lHX0RGTCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbWVtY3B5KCZhY3QsICZvbGRfYWN0LCBzaXplb2Yoc3RydWN0IHNpZ2FjdGlvbikpOworCisgICAgICAgIGlmIChvbGRfYWN0LnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKKyAgICAgICAgeworICAgICAgICAgICAgb19zaWdhY3RbaV0ub2xkX3NpZ2FjdGlvbiA9IG9sZF9hY3Quc2Ffc2lnYWN0aW9uOworICAgICAgICAgICAgb19zaWdhY3RbaV0uc2lnYWN0aW9uID0gMTsKKyAgICAgICAgICAgIGFjdC5zYV9zaWdhY3Rpb24gPSB0ZW1wX3NpZ19zaWdhY3Rpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvX3NpZ2FjdFtpXS5vbGRfaGFuZGxlciA9IG9sZF9hY3Quc2FfaGFuZGxlcjsKKyAgICAgICAgICAgIGFjdC5zYV9oYW5kbGVyID0gdGVtcF9zaWdfaGFuZGxlcjsKKyAgICAgICAgfQorCisgICAgICAgIHNpZ2FjdGlvbihpLCAmYWN0LCBOVUxMKTsKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIHNpZ190YWtlbiA9IDE7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBnc19iYXNlX3ByZV9ydW4odm9pZCkKK3sKKyAgICBpZiAodW5saWtlbHkoaW5pdGlhbF9ncyA9PSBJTlZBTElEX0dTX1JFRykgKQorICAgIHsKKyAgICAgICAgaW5pdGlhbF9ncyA9IF9nZXRncygpOworICAgICAgICAvKgorICAgICAgICAgKiBBcyAyLjYuMzUtMjggbHVjaWQgd2lsbCBnZXQgY29ycmVjdCBncyBidXQgY2xvYmJlcmVkIEdTX0JBU0UKKyAgICAgICAgICogd2UgaGF2ZSB0byBhbHdheXMgcmUtd3JpdGUgdGhlIGdzIGJhc2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbml0aWFsX2dzID09IDB4MCkKKyAgICAgICAgICAgIGdzX25lZWRfcmVzdG9yZSA9IEtWTV9HU19SRVNUT1JFX05POworICAgICAgICBlbHNlCisgICAgICAgICAgICBnc19uZWVkX3Jlc3RvcmUgPSBLVk1fR1NfUkVTVE9SRV9ZRVM7CisgICAgfQorCisgICAgdGFrZV9zaWduYWxfaGFuZGxlcigpOworICAgIHJldHVybiAwOworfQorCitpbnQgZ3NfYmFzZV9wb3N0X3J1bih2b2lkKQoreworICAgIGNoZWNrX2FuZF9yZXN0b3JlX2dzKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBpb2N0bCBtYXkgdXBkYXRlIGVycm5vLCB3aGljaCBpcyBpbiB0aHJlYWQgbG9jYWwgc3RvcmFnZSBhbmQKKyAqIHJlcXVpcmVzIGdzIHJlZ2lzdGVyLCB3ZSBoYXZlIHRvIHByb3ZpZGUgb3VyIG93biBpb2N0bAorICogWFhYIHNob3VsZCAiY2FsbCAlJWdzOiQweDEwIiBiZSByZXBsYWNlZCB3aXRoIGNhbGwgdG8gdnN5c2NhbGwKKyAqIHBhZ2UsIHdoaWNoIGlzIG1vcmUgZ2VuZXJpYyBhbmQgY2xlYW4/CisgKi8KK2ludCBub19nc19pb2N0bChpbnQgZmQsIGludCB0eXBlLCB2b2lkICphcmcpCit7CisgICAgaW50IHJldD0wOworCisgICAgYXNtKAorICAgICAgIm1vdmwgJTMsICUlZWR4O1xuIgorICAgICAgIm1vdmwgJTIsICUlZWN4O1xuIgorICAgICAgIm1vdmwgJTEsICUlZWJ4O1xuIgorICAgICAgIm1vdmwgJDB4MzYsICUlZWF4O1xuIgorICAgICAgImNhbGwgKiUlZ3M6MHgxMDtcbiIKKyAgICAgICJtb3ZsICUlZWF4LCAlMFxuIgorICAgICAgOiAiPW0iKHJldCkKKyAgICAgIDoibSIoZmQpLCJtIih0eXBlKSwibSIoYXJnKQorICAgICAgOiIlZWR4IiwiJWVjeCIsIiVlYXgiLCIlZWJ4IgorICAgICAgKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2t2bS1ncy1yZXN0b3JlLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L2t2bS1ncy1yZXN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0N2IzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYva3ZtLWdzLXJlc3RvcmUuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9LVk1fR1NfUkVTVE9SRV9ICisjZGVmaW5lIF9LVk1fR1NfUkVTVE9SRV9ICisKKyNpZmRlZiBDT05GSUdfS1ZNX0dTX1JFU1RPUkUKK2ludCBub19nc19pb2N0bChpbnQgZmQsIGludCB0eXBlLCB2b2lkICphcmcpOworaW50IGdzX2Jhc2VfcG9zdF9ydW4odm9pZCk7CitpbnQgZ3NfYmFzZV9wcmVfcnVuKHZvaWQpOworZXh0ZXJuIGludCBnc19uZWVkX3Jlc3RvcmU7CisjZGVmaW5lIEtWTV9HU19SRVNUT1JFX05PIDB4MgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9rdm0uYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYva3ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1YWU0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYva3ZtLmMKQEAgLTAsMCArMSw5NjcgQEAKKy8qCisgKiBRRU1VIEtWTSBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDggUXVtcmFuZXQgVGVjaG5vbG9naWVzCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyN1bmRlZiBfX3VzZXIKKyNkZWZpbmUgX194dXNlciAgLyogbm90aGluZyAqLworI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImV4ZWMvZ2Ric3R1Yi5oIgorCisjaWZkZWYgQ09ORklHX0tWTV9HU19SRVNUT1JFCisjaW5jbHVkZSAia3ZtLWdzLXJlc3RvcmUuaCIKKyNlbmRpZgorCisvLyNkZWZpbmUgREVCVUdfS1ZNCisKKyNpZmRlZiBERUJVR19LVk0KKyNkZWZpbmUgZHByaW50ZihmbXQsIC4uLikgXAorICAgIGRvIHsgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ZihmbXQsIC4uLikgXAorICAgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgS1ZNX0NBUF9FWFRfQ1BVSUQKKworc3RhdGljIHN0cnVjdCBrdm1fY3B1aWQyICp0cnlfZ2V0X2NwdWlkKEtWTVN0YXRlICpzLCBpbnQgbWF4KQoreworICAgIHN0cnVjdCBrdm1fY3B1aWQyICpjcHVpZDsKKyAgICBpbnQgciwgc2l6ZTsKKworICAgIHNpemUgPSBzaXplb2YoKmNwdWlkKSArIG1heCAqIHNpemVvZigqY3B1aWQtPmVudHJpZXMpOworICAgIGNwdWlkID0gKHN0cnVjdCBrdm1fY3B1aWQyICopZ19tYWxsb2MwKHNpemUpOworICAgIGNwdWlkLT5uZW50ID0gbWF4OworICAgIHIgPSBrdm1faW9jdGwocywgS1ZNX0dFVF9TVVBQT1JURURfQ1BVSUQsIGNwdWlkKTsKKyAgICBpZiAociA9PSAwICYmIGNwdWlkLT5uZW50ID49IG1heCkgeworICAgICAgICByID0gLUUyQklHOworICAgIH0KKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgaWYgKHIgPT0gLUUyQklHKSB7CisgICAgICAgICAgICBnX2ZyZWUoY3B1aWQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIktWTV9HRVRfU1VQUE9SVEVEX0NQVUlEIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yKSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjcHVpZDsKK30KKwordWludDMyX3Qga3ZtX2FyY2hfZ2V0X3N1cHBvcnRlZF9jcHVpZChDUFVTdGF0ZSAqY3B1LCB1aW50MzJfdCBmdW5jdGlvbiwgaW50IHJlZykKK3sKKyAgICBzdHJ1Y3Qga3ZtX2NwdWlkMiAqY3B1aWQ7CisgICAgaW50IGksIG1heDsKKyAgICB1aW50MzJfdCByZXQgPSAwOworICAgIHVpbnQzMl90IGNwdWlkXzFfZWR4OworCisgICAgaWYgKCFrdm1fY2hlY2tfZXh0ZW5zaW9uKGNwdS0+a3ZtX3N0YXRlLCBLVk1fQ0FQX0VYVF9DUFVJRCkpIHsKKyAgICAgICAgcmV0dXJuIC0xVTsKKyAgICB9CisKKyAgICBtYXggPSAxOworICAgIHdoaWxlICgoY3B1aWQgPSB0cnlfZ2V0X2NwdWlkKGNwdS0+a3ZtX3N0YXRlLCBtYXgpKSA9PSBOVUxMKSB7CisgICAgICAgIG1heCAqPSAyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjcHVpZC0+bmVudDsgKytpKSB7CisgICAgICAgIGlmIChjcHVpZC0+ZW50cmllc1tpXS5mdW5jdGlvbiA9PSBmdW5jdGlvbikgeworICAgICAgICAgICAgc3dpdGNoIChyZWcpIHsKKyAgICAgICAgICAgIGNhc2UgUl9FQVg6CisgICAgICAgICAgICAgICAgcmV0ID0gY3B1aWQtPmVudHJpZXNbaV0uZWF4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSX0VCWDoKKyAgICAgICAgICAgICAgICByZXQgPSBjcHVpZC0+ZW50cmllc1tpXS5lYng7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJfRUNYOgorICAgICAgICAgICAgICAgIHJldCA9IGNwdWlkLT5lbnRyaWVzW2ldLmVjeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUl9FRFg6CisgICAgICAgICAgICAgICAgcmV0ID0gY3B1aWQtPmVudHJpZXNbaV0uZWR4OworICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiA9PSAweDgwMDAwMDAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE9uIEludGVsLCBrdm0gcmV0dXJucyBjcHVpZCBhY2NvcmRpbmcgdG8gdGhlIEludGVsIHNwZWMsCisgICAgICAgICAgICAgICAgICAgICAqIHNvIGFkZCBtaXNzaW5nIGJpdHMgYWNjb3JkaW5nIHRvIHRoZSBBTUQgc3BlYzoKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGNwdWlkXzFfZWR4ID0ga3ZtX2FyY2hfZ2V0X3N1cHBvcnRlZF9jcHVpZChjcHUsIDEsIFJfRURYKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0IHw9IGNwdWlkXzFfZWR4ICYgMHhkZmVmZjdmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnX2ZyZWUoY3B1aWQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworI2Vsc2UKKwordWludDMyX3Qga3ZtX2FyY2hfZ2V0X3N1cHBvcnRlZF9jcHVpZChDUFVTdGF0ZSAqY3B1LCB1aW50MzJfdCBmdW5jdGlvbiwgaW50IHJlZykKK3sKKyAgICByZXR1cm4gLTFVOworfQorCisjZW5kaWYKKworI2lmbmRlZiBLVk1fTVBfU1RBVEVfUlVOTkFCTEUKKyNkZWZpbmUgS1ZNX01QX1NUQVRFX1JVTk5BQkxFIDAKKyNlbmRpZgorCitpbnQga3ZtX2FyY2hfaW5pdF92Y3B1KENQVVN0YXRlICpjcHUpCit7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IGt2bV9jcHVpZDIgY3B1aWQ7CisgICAgICAgIHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyIGVudHJpZXNbMTAwXTsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGNwdWlkX2RhdGE7CisgICAgdWludDMyX3QgbGltaXQsIGksIGosIGNwdWlkX2k7CisgICAgdWludDMyX3QgdW51c2VkOworICAgIENQVVg4NlN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisKKyAgICBlbnYtPm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOworCisgICAgY3B1aWRfaSA9IDA7CisKKyAgICBjcHVfeDg2X2NwdWlkKGVudiwgMCwgMCwgJmxpbWl0LCAmdW51c2VkLCAmdW51c2VkLCAmdW51c2VkKTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gbGltaXQ7IGkrKykgeworICAgICAgICBzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYyA9ICZjcHVpZF9kYXRhLmVudHJpZXNbY3B1aWRfaSsrXTsKKworICAgICAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAvKiBLZWVwIHJlYWRpbmcgZnVuY3Rpb24gMiB0aWxsIGFsbCB0aGUgaW5wdXQgaXMgcmVjZWl2ZWQgKi8KKyAgICAgICAgICAgIGludCB0aW1lczsKKworICAgICAgICAgICAgYy0+ZnVuY3Rpb24gPSBpOworICAgICAgICAgICAgYy0+ZmxhZ3MgPSBLVk1fQ1BVSURfRkxBR19TVEFURUZVTF9GVU5DIHwKKyAgICAgICAgICAgICAgICAgICAgICAgS1ZNX0NQVUlEX0ZMQUdfU1RBVEVfUkVBRF9ORVhUOworICAgICAgICAgICAgY3B1X3g4Nl9jcHVpZChlbnYsIGksIDAsICZjLT5lYXgsICZjLT5lYngsICZjLT5lY3gsICZjLT5lZHgpOworICAgICAgICAgICAgdGltZXMgPSBjLT5lYXggJiAweGZmOworCisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgdGltZXM7ICsraikgeworICAgICAgICAgICAgICAgIGMgPSAmY3B1aWRfZGF0YS5lbnRyaWVzW2NwdWlkX2krK107CisgICAgICAgICAgICAgICAgYy0+ZnVuY3Rpb24gPSBpOworICAgICAgICAgICAgICAgIGMtPmZsYWdzID0gS1ZNX0NQVUlEX0ZMQUdfU1RBVEVGVUxfRlVOQzsKKyAgICAgICAgICAgICAgICBjcHVfeDg2X2NwdWlkKGVudiwgaSwgMCwgJmMtPmVheCwgJmMtPmVieCwgJmMtPmVjeCwgJmMtPmVkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgMHhiOgorICAgICAgICBjYXNlIDB4ZDoKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IDsgaisrKSB7CisgICAgICAgICAgICAgICAgYy0+ZnVuY3Rpb24gPSBpOworICAgICAgICAgICAgICAgIGMtPmZsYWdzID0gS1ZNX0NQVUlEX0ZMQUdfU0lHTklGQ0FOVF9JTkRFWDsKKyAgICAgICAgICAgICAgICBjLT5pbmRleCA9IGo7CisgICAgICAgICAgICAgICAgY3B1X3g4Nl9jcHVpZChlbnYsIGksIGosICZjLT5lYXgsICZjLT5lYngsICZjLT5lY3gsICZjLT5lZHgpOworCisgICAgICAgICAgICAgICAgaWYgKGkgPT0gNCAmJiBjLT5lYXggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMHhiICYmICEoYy0+ZWN4ICYgMHhmZjAwKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMHhkICYmIGMtPmVheCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGMgPSAmY3B1aWRfZGF0YS5lbnRyaWVzW2NwdWlkX2krK107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGMtPmZ1bmN0aW9uID0gaTsKKyAgICAgICAgICAgIGMtPmZsYWdzID0gMDsKKyAgICAgICAgICAgIGNwdV94ODZfY3B1aWQoZW52LCBpLCAwLCAmYy0+ZWF4LCAmYy0+ZWJ4LCAmYy0+ZWN4LCAmYy0+ZWR4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGNwdV94ODZfY3B1aWQoZW52LCAweDgwMDAwMDAwLCAwLCAmbGltaXQsICZ1bnVzZWQsICZ1bnVzZWQsICZ1bnVzZWQpOworCisgICAgZm9yIChpID0gMHg4MDAwMDAwMDsgaSA8PSBsaW1pdDsgaSsrKSB7CisgICAgICAgIHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyICpjID0gJmNwdWlkX2RhdGEuZW50cmllc1tjcHVpZF9pKytdOworCisgICAgICAgIGMtPmZ1bmN0aW9uID0gaTsKKyAgICAgICAgYy0+ZmxhZ3MgPSAwOworICAgICAgICBjcHVfeDg2X2NwdWlkKGVudiwgaSwgMCwgJmMtPmVheCwgJmMtPmVieCwgJmMtPmVjeCwgJmMtPmVkeCk7CisgICAgfQorCisgICAgY3B1aWRfZGF0YS5jcHVpZC5uZW50ID0gY3B1aWRfaTsKKworICAgIHJldHVybiBrdm1fdmNwdV9pb2N0bChjcHUsIEtWTV9TRVRfQ1BVSUQyLCAmY3B1aWRfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQga3ZtX2hhc19tc3Jfc3RhcihDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHN0YXRpYyBpbnQgaGFzX21zcl9zdGFyOworICAgIGludCByZXQ7CisgICAgQ1BVU3RhdGUgKmNwdSA9IEVOVl9HRVRfQ1BVKGVudik7CisKKyAgICAvKiBmaXJzdCB0aW1lICovCisgICAgaWYgKGhhc19tc3Jfc3RhciA9PSAwKSB7CisgICAgICAgIHN0cnVjdCBrdm1fbXNyX2xpc3QgbXNyX2xpc3QsICprdm1fbXNyX2xpc3Q7CisKKyAgICAgICAgaGFzX21zcl9zdGFyID0gLTE7CisKKyAgICAgICAgLyogT2J0YWluIE1TUiBsaXN0IGZyb20gS1ZNLiAgVGhlc2UgYXJlIHRoZSBNU1JzIHRoYXQgd2UgbXVzdAorICAgICAgICAgKiBzYXZlL3Jlc3RvcmUgKi8KKyAgICAgICAgbXNyX2xpc3Qubm1zcnMgPSAwOworICAgICAgICByZXQgPSBrdm1faW9jdGwoY3B1LT5rdm1fc3RhdGUsIEtWTV9HRVRfTVNSX0lOREVYX0xJU1QsICZtc3JfbGlzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAga3ZtX21zcl9saXN0ID0gZ19tYWxsb2MwKHNpemVvZihtc3JfbGlzdCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNyX2xpc3Qubm1zcnMgKiBzaXplb2YobXNyX2xpc3QuaW5kaWNlc1swXSkpOworCisgICAgICAgIGt2bV9tc3JfbGlzdC0+bm1zcnMgPSBtc3JfbGlzdC5ubXNyczsKKyAgICAgICAgcmV0ID0ga3ZtX2lvY3RsKGNwdS0+a3ZtX3N0YXRlLCBLVk1fR0VUX01TUl9JTkRFWF9MSVNULCBrdm1fbXNyX2xpc3QpOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwga3ZtX21zcl9saXN0LT5ubXNyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGt2bV9tc3JfbGlzdC0+aW5kaWNlc1tpXSA9PSBNU1JfU1RBUikgeworICAgICAgICAgICAgICAgICAgICBoYXNfbXNyX3N0YXIgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmcmVlKGt2bV9tc3JfbGlzdCk7CisgICAgfQorCisgICAgaWYgKGhhc19tc3Jfc3RhciA9PSAxKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX2luaXQoS1ZNU3RhdGUgKnMsIGludCBzbXBfY3B1cykKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogY3JlYXRlIHZtODYgdHNzLiAgS1ZNIHVzZXMgdm04NiBtb2RlIHRvIGVtdWxhdGUgMTYtYml0IGNvZGUKKyAgICAgKiBkaXJlY3RseS4gIEluIG9yZGVyIHRvIHVzZSB2bTg2IG1vZGUsIGEgVFNTIGlzIG5lZWRlZC4gIFNpbmNlIHRoaXMKKyAgICAgKiBtdXN0IGJlIHBhcnQgb2YgZ3Vlc3QgcGh5c2ljYWwgbWVtb3J5LCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGl0LiAgT2xkZXIKKyAgICAgKiB2ZXJzaW9ucyBvZiBLVk0ganVzdCBhc3N1bWVkIHRoYXQgaXQgd291bGQgYmUgYXQgdGhlIGVuZCBvZiBwaHlzaWNhbAorICAgICAqIG1lbW9yeSBidXQgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCBtb3JlIHRoYW4gNEdCIG9mIG1lbW9yeS4gIFdlIHNpbXBseQorICAgICAqIHJlZnVzZSB0byB3b3JrIHdpdGggdGhvc2Ugb2xkZXIgdmVyc2lvbnMgb2YgS1ZNLiAqLworICAgIHJldCA9IGt2bV9pb2N0bChzLCBLVk1fQ0hFQ0tfRVhURU5TSU9OLCBLVk1fQ0FQX1NFVF9UU1NfQUREUik7CisgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAia3ZtIGRvZXMgbm90IHN1cHBvcnQgS1ZNX0NBUF9TRVRfVFNTX0FERFJcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIHRoaXMgYWRkcmVzcyBpcyAzIHBhZ2VzIGJlZm9yZSB0aGUgYmlvcywgYW5kIHRoZSBiaW9zIHNob3VsZCBwcmVzZW50CisgICAgICogYXMgdW5hdmFpYmxlIG1lbW9yeS4gIEZJWE1FLCBuZWVkIHRvIGVuc3VyZSB0aGUgZTgyMCBtYXAgZGVhbHMgd2l0aAorICAgICAqIHRoaXM/CisgICAgICovCisgICAgcmV0dXJuIGt2bV92bV9pb2N0bChzLCBLVk1fU0VUX1RTU19BRERSLCAweGZmZmJkMDAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3Y4MDg2X3NlZyhzdHJ1Y3Qga3ZtX3NlZ21lbnQgKmxocywgY29uc3QgU2VnbWVudENhY2hlICpyaHMpCit7CisgICAgbGhzLT5zZWxlY3RvciA9IHJocy0+c2VsZWN0b3I7CisgICAgbGhzLT5iYXNlID0gcmhzLT5iYXNlOworICAgIGxocy0+bGltaXQgPSByaHMtPmxpbWl0OworICAgIGxocy0+dHlwZSA9IDM7CisgICAgbGhzLT5wcmVzZW50ID0gMTsKKyAgICBsaHMtPmRwbCA9IDM7CisgICAgbGhzLT5kYiA9IDA7CisgICAgbGhzLT5zID0gMTsKKyAgICBsaHMtPmwgPSAwOworICAgIGxocy0+ZyA9IDA7CisgICAgbGhzLT5hdmwgPSAwOworICAgIGxocy0+dW51c2FibGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfc2VnKHN0cnVjdCBrdm1fc2VnbWVudCAqbGhzLCBjb25zdCBTZWdtZW50Q2FjaGUgKnJocykKK3sKKyAgICB1bnNpZ25lZCBmbGFncyA9IHJocy0+ZmxhZ3M7CisgICAgbGhzLT5zZWxlY3RvciA9IHJocy0+c2VsZWN0b3I7CisgICAgbGhzLT5iYXNlID0gcmhzLT5iYXNlOworICAgIGxocy0+bGltaXQgPSByaHMtPmxpbWl0OworICAgIGxocy0+dHlwZSA9IChmbGFncyA+PiBERVNDX1RZUEVfU0hJRlQpICYgMTU7CisgICAgbGhzLT5wcmVzZW50ID0gKGZsYWdzICYgREVTQ19QX01BU0spICE9IDA7CisgICAgbGhzLT5kcGwgPSByaHMtPnNlbGVjdG9yICYgMzsKKyAgICBsaHMtPmRiID0gKGZsYWdzID4+IERFU0NfQl9TSElGVCkgJiAxOworICAgIGxocy0+cyA9IChmbGFncyAmIERFU0NfU19NQVNLKSAhPSAwOworICAgIGxocy0+bCA9IChmbGFncyA+PiBERVNDX0xfU0hJRlQpICYgMTsKKyAgICBsaHMtPmcgPSAoZmxhZ3MgJiBERVNDX0dfTUFTSykgIT0gMDsKKyAgICBsaHMtPmF2bCA9IChmbGFncyAmIERFU0NfQVZMX01BU0spICE9IDA7CisgICAgbGhzLT51bnVzYWJsZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zZWcoU2VnbWVudENhY2hlICpsaHMsIGNvbnN0IHN0cnVjdCBrdm1fc2VnbWVudCAqcmhzKQoreworICAgIGxocy0+c2VsZWN0b3IgPSByaHMtPnNlbGVjdG9yOworICAgIGxocy0+YmFzZSA9IHJocy0+YmFzZTsKKyAgICBsaHMtPmxpbWl0ID0gcmhzLT5saW1pdDsKKyAgICBsaHMtPmZsYWdzID0KKwkocmhzLT50eXBlIDw8IERFU0NfVFlQRV9TSElGVCkKKwl8IChyaHMtPnByZXNlbnQgKiBERVNDX1BfTUFTSykKKwl8IChyaHMtPmRwbCA8PCBERVNDX0RQTF9TSElGVCkKKwl8IChyaHMtPmRiIDw8IERFU0NfQl9TSElGVCkKKwl8IChyaHMtPnMgKiBERVNDX1NfTUFTSykKKwl8IChyaHMtPmwgPDwgREVTQ19MX1NISUZUKQorCXwgKHJocy0+ZyAqIERFU0NfR19NQVNLKQorCXwgKHJocy0+YXZsICogREVTQ19BVkxfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9nZXRwdXRfcmVnKF9fdTY0ICprdm1fcmVnLCB0YXJnZXRfdWxvbmcgKnFlbXVfcmVnLCBpbnQgc2V0KQoreworICAgIGlmIChzZXQpCisgICAgICAgICprdm1fcmVnID0gKnFlbXVfcmVnOworICAgIGVsc2UKKyAgICAgICAgKnFlbXVfcmVnID0gKmt2bV9yZWc7Cit9CisKK3N0YXRpYyBpbnQga3ZtX2dldHB1dF9yZWdzKENQVVg4NlN0YXRlICplbnYsIGludCBzZXQpCit7CisgICAgc3RydWN0IGt2bV9yZWdzIHJlZ3M7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXNldCkgeworICAgICAgICByZXQgPSBrdm1fdmNwdV9pb2N0bChFTlZfR0VUX0NQVShlbnYpLCBLVk1fR0VUX1JFR1MsICZyZWdzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnJheCwgJmVudi0+cmVnc1tSX0VBWF0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucmJ4LCAmZW52LT5yZWdzW1JfRUJYXSwgc2V0KTsKKyAgICBrdm1fZ2V0cHV0X3JlZygmcmVncy5yY3gsICZlbnYtPnJlZ3NbUl9FQ1hdLCBzZXQpOworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnJkeCwgJmVudi0+cmVnc1tSX0VEWF0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucnNpLCAmZW52LT5yZWdzW1JfRVNJXSwgc2V0KTsKKyAgICBrdm1fZ2V0cHV0X3JlZygmcmVncy5yZGksICZlbnYtPnJlZ3NbUl9FREldLCBzZXQpOworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnJzcCwgJmVudi0+cmVnc1tSX0VTUF0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucmJwLCAmZW52LT5yZWdzW1JfRUJQXSwgc2V0KTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucjgsICZlbnYtPnJlZ3NbOF0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucjksICZlbnYtPnJlZ3NbOV0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucjEwLCAmZW52LT5yZWdzWzEwXSwgc2V0KTsKKyAgICBrdm1fZ2V0cHV0X3JlZygmcmVncy5yMTEsICZlbnYtPnJlZ3NbMTFdLCBzZXQpOworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnIxMiwgJmVudi0+cmVnc1sxMl0sIHNldCk7CisgICAga3ZtX2dldHB1dF9yZWcoJnJlZ3MucjEzLCAmZW52LT5yZWdzWzEzXSwgc2V0KTsKKyAgICBrdm1fZ2V0cHV0X3JlZygmcmVncy5yMTQsICZlbnYtPnJlZ3NbMTRdLCBzZXQpOworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnIxNSwgJmVudi0+cmVnc1sxNV0sIHNldCk7CisjZW5kaWYKKworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnJmbGFncywgJmVudi0+ZWZsYWdzLCBzZXQpOworICAgIGt2bV9nZXRwdXRfcmVnKCZyZWdzLnJpcCwgJmVudi0+ZWlwLCBzZXQpOworCisgICAgaWYgKHNldCkKKyAgICAgICAgcmV0ID0ga3ZtX3ZjcHVfaW9jdGwoRU5WX0dFVF9DUFUoZW52KSwgS1ZNX1NFVF9SRUdTLCAmcmVncyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGt2bV9wdXRfZnB1KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgc3RydWN0IGt2bV9mcHUgZnB1OworICAgIGludCBpOworCisgICAgbWVtc2V0KCZmcHUsIDAsIHNpemVvZiBmcHUpOworICAgIGZwdS5mc3cgPSBlbnYtPmZwdXMgJiB+KDcgPDwgMTEpOworICAgIGZwdS5mc3cgfD0gKGVudi0+ZnBzdHQgJiA3KSA8PCAxMTsKKyAgICBmcHUuZmN3ID0gZW52LT5mcHVjOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJZnB1LmZ0d3ggfD0gKCFlbnYtPmZwdGFnc1tpXSkgPDwgaTsKKyAgICBtZW1jcHkoZnB1LmZwciwgZW52LT5mcHJlZ3MsIHNpemVvZiBlbnYtPmZwcmVncyk7CisgICAgbWVtY3B5KGZwdS54bW0sIGVudi0+eG1tX3JlZ3MsIHNpemVvZiBlbnYtPnhtbV9yZWdzKTsKKyAgICBmcHUubXhjc3IgPSBlbnYtPm14Y3NyOworCisgICAgcmV0dXJuIGt2bV92Y3B1X2lvY3RsKEVOVl9HRVRfQ1BVKGVudiksIEtWTV9TRVRfRlBVLCAmZnB1KTsKK30KKworc3RhdGljIGludCBrdm1fcHV0X3NyZWdzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgc3RydWN0IGt2bV9zcmVncyBzcmVnczsKKworICAgIG1lbWNweShzcmVncy5pbnRlcnJ1cHRfYml0bWFwLAorICAgICAgICAgICBlbnYtPmludGVycnVwdF9iaXRtYXAsCisgICAgICAgICAgIHNpemVvZihzcmVncy5pbnRlcnJ1cHRfYml0bWFwKSk7CisKKyAgICBpZiAoKGVudi0+ZWZsYWdzICYgVk1fTUFTSykpIHsKKwkgICAgc2V0X3Y4MDg2X3NlZygmc3JlZ3MuY3MsICZlbnYtPnNlZ3NbUl9DU10pOworCSAgICBzZXRfdjgwODZfc2VnKCZzcmVncy5kcywgJmVudi0+c2Vnc1tSX0RTXSk7CisJICAgIHNldF92ODA4Nl9zZWcoJnNyZWdzLmVzLCAmZW52LT5zZWdzW1JfRVNdKTsKKwkgICAgc2V0X3Y4MDg2X3NlZygmc3JlZ3MuZnMsICZlbnYtPnNlZ3NbUl9GU10pOworCSAgICBzZXRfdjgwODZfc2VnKCZzcmVncy5ncywgJmVudi0+c2Vnc1tSX0dTXSk7CisJICAgIHNldF92ODA4Nl9zZWcoJnNyZWdzLnNzLCAmZW52LT5zZWdzW1JfU1NdKTsKKyAgICB9IGVsc2UgeworCSAgICBzZXRfc2VnKCZzcmVncy5jcywgJmVudi0+c2Vnc1tSX0NTXSk7CisJICAgIHNldF9zZWcoJnNyZWdzLmRzLCAmZW52LT5zZWdzW1JfRFNdKTsKKwkgICAgc2V0X3NlZygmc3JlZ3MuZXMsICZlbnYtPnNlZ3NbUl9FU10pOworCSAgICBzZXRfc2VnKCZzcmVncy5mcywgJmVudi0+c2Vnc1tSX0ZTXSk7CisJICAgIHNldF9zZWcoJnNyZWdzLmdzLCAmZW52LT5zZWdzW1JfR1NdKTsKKwkgICAgc2V0X3NlZygmc3JlZ3Muc3MsICZlbnYtPnNlZ3NbUl9TU10pOworCisJICAgIGlmIChlbnYtPmNyWzBdICYgQ1IwX1BFX01BU0spIHsKKwkJLyogZm9yY2Ugc3MgY3BsIHRvIGNzIGNwbCAqLworCQlzcmVncy5zcy5zZWxlY3RvciA9IChzcmVncy5zcy5zZWxlY3RvciAmIH4zKSB8CisJCQkoc3JlZ3MuY3Muc2VsZWN0b3IgJiAzKTsKKwkJc3JlZ3Muc3MuZHBsID0gc3JlZ3Muc3Muc2VsZWN0b3IgJiAzOworCSAgICB9CisgICAgfQorCisgICAgc2V0X3NlZygmc3JlZ3MudHIsICZlbnYtPnRyKTsKKyAgICBzZXRfc2VnKCZzcmVncy5sZHQsICZlbnYtPmxkdCk7CisKKyAgICBzcmVncy5pZHQubGltaXQgPSBlbnYtPmlkdC5saW1pdDsKKyAgICBzcmVncy5pZHQuYmFzZSA9IGVudi0+aWR0LmJhc2U7CisgICAgc3JlZ3MuZ2R0LmxpbWl0ID0gZW52LT5nZHQubGltaXQ7CisgICAgc3JlZ3MuZ2R0LmJhc2UgPSBlbnYtPmdkdC5iYXNlOworCisgICAgc3JlZ3MuY3IwID0gZW52LT5jclswXTsKKyAgICBzcmVncy5jcjIgPSBlbnYtPmNyWzJdOworICAgIHNyZWdzLmNyMyA9IGVudi0+Y3JbM107CisgICAgc3JlZ3MuY3I0ID0gZW52LT5jcls0XTsKKworICAgIHNyZWdzLmNyOCA9IGNwdV9nZXRfYXBpY190cHIoZW52KTsKKyAgICBzcmVncy5hcGljX2Jhc2UgPSBjcHVfZ2V0X2FwaWNfYmFzZShlbnYpOworCisgICAgc3JlZ3MuZWZlciA9IGVudi0+ZWZlcjsKKworICAgIHJldHVybiBrdm1fdmNwdV9pb2N0bChFTlZfR0VUX0NQVShlbnYpLCBLVk1fU0VUX1NSRUdTLCAmc3JlZ3MpOworfQorCitzdGF0aWMgdm9pZCBrdm1fbXNyX2VudHJ5X3NldChzdHJ1Y3Qga3ZtX21zcl9lbnRyeSAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCwgdWludDY0X3QgdmFsdWUpCit7CisgICAgZW50cnktPmluZGV4ID0gaW5kZXg7CisgICAgZW50cnktPmRhdGEgPSB2YWx1ZTsKK30KKworc3RhdGljIGludCBrdm1fcHV0X21zcnMoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3Qga3ZtX21zcnMgaW5mbzsKKyAgICAgICAgc3RydWN0IGt2bV9tc3JfZW50cnkgZW50cmllc1sxMDBdOworICAgIH0gbXNyX2RhdGE7CisgICAgc3RydWN0IGt2bV9tc3JfZW50cnkgKm1zcnMgPSBtc3JfZGF0YS5lbnRyaWVzOworICAgIGludCBuID0gMDsKKworICAgIGt2bV9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9JQTMyX1NZU0VOVEVSX0NTLCBlbnYtPnN5c2VudGVyX2NzKTsKKyAgICBrdm1fbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIGVudi0+c3lzZW50ZXJfZXNwKTsKKyAgICBrdm1fbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIGVudi0+c3lzZW50ZXJfZWlwKTsKKyAgICBpZiAoa3ZtX2hhc19tc3Jfc3RhcihlbnYpKQorCWt2bV9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9TVEFSLCBlbnYtPnN0YXIpOworICAgIGt2bV9tc3JfZW50cnlfc2V0KCZtc3JzW24rK10sIE1TUl9JQTMyX1RTQywgZW52LT50c2MpOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAvKiBGSVhNRSBpZiBsbSBjYXBhYmxlICovCisgICAga3ZtX21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0NTVEFSLCBlbnYtPmNzdGFyKTsKKyAgICBrdm1fbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfS0VSTkVMR1NCQVNFLCBlbnYtPmtlcm5lbGdzYmFzZSk7CisgICAga3ZtX21zcl9lbnRyeV9zZXQoJm1zcnNbbisrXSwgTVNSX0ZNQVNLLCBlbnYtPmZtYXNrKTsKKyAgICBrdm1fbXNyX2VudHJ5X3NldCgmbXNyc1tuKytdLCBNU1JfTFNUQVIsIGVudi0+bHN0YXIpOworI2VuZGlmCisgICAgbXNyX2RhdGEuaW5mby5ubXNycyA9IG47CisKKyAgICByZXR1cm4ga3ZtX3ZjcHVfaW9jdGwoRU5WX0dFVF9DUFUoZW52KSwgS1ZNX1NFVF9NU1JTLCAmbXNyX2RhdGEpOworCit9CisKKworc3RhdGljIGludCBrdm1fZ2V0X2ZwdShDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHN0cnVjdCBrdm1fZnB1IGZwdTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgcmV0ID0ga3ZtX3ZjcHVfaW9jdGwoRU5WX0dFVF9DUFUoZW52KSwgS1ZNX0dFVF9GUFUsICZmcHUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZW52LT5mcHN0dCA9IChmcHUuZnN3ID4+IDExKSAmIDc7CisgICAgZW52LT5mcHVzID0gZnB1LmZzdzsKKyAgICBlbnYtPmZwdWMgPSBmcHUuZmN3OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpCisJZW52LT5mcHRhZ3NbaV0gPSAhKChmcHUuZnR3eCA+PiBpKSAmIDEpOworICAgIG1lbWNweShlbnYtPmZwcmVncywgZnB1LmZwciwgc2l6ZW9mIGVudi0+ZnByZWdzKTsKKyAgICBtZW1jcHkoZW52LT54bW1fcmVncywgZnB1LnhtbSwgc2l6ZW9mIGVudi0+eG1tX3JlZ3MpOworICAgIGVudi0+bXhjc3IgPSBmcHUubXhjc3I7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9nZXRfc3JlZ3MoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIHN0cnVjdCBrdm1fc3JlZ3Mgc3JlZ3M7CisgICAgdWludDMyX3QgaGZsYWdzOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBrdm1fdmNwdV9pb2N0bChjcHUsIEtWTV9HRVRfU1JFR1MsICZzcmVncyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBtZW1jcHkoZW52LT5pbnRlcnJ1cHRfYml0bWFwLAorICAgICAgICAgICBzcmVncy5pbnRlcnJ1cHRfYml0bWFwLAorICAgICAgICAgICBzaXplb2Yoc3JlZ3MuaW50ZXJydXB0X2JpdG1hcCkpOworCisgICAgZ2V0X3NlZygmZW52LT5zZWdzW1JfQ1NdLCAmc3JlZ3MuY3MpOworICAgIGdldF9zZWcoJmVudi0+c2Vnc1tSX0RTXSwgJnNyZWdzLmRzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9FU10sICZzcmVncy5lcyk7CisgICAgZ2V0X3NlZygmZW52LT5zZWdzW1JfRlNdLCAmc3JlZ3MuZnMpOworICAgIGdldF9zZWcoJmVudi0+c2Vnc1tSX0dTXSwgJnNyZWdzLmdzKTsKKyAgICBnZXRfc2VnKCZlbnYtPnNlZ3NbUl9TU10sICZzcmVncy5zcyk7CisKKyAgICBnZXRfc2VnKCZlbnYtPnRyLCAmc3JlZ3MudHIpOworICAgIGdldF9zZWcoJmVudi0+bGR0LCAmc3JlZ3MubGR0KTsKKworICAgIGVudi0+aWR0LmxpbWl0ID0gc3JlZ3MuaWR0LmxpbWl0OworICAgIGVudi0+aWR0LmJhc2UgPSBzcmVncy5pZHQuYmFzZTsKKyAgICBlbnYtPmdkdC5saW1pdCA9IHNyZWdzLmdkdC5saW1pdDsKKyAgICBlbnYtPmdkdC5iYXNlID0gc3JlZ3MuZ2R0LmJhc2U7CisKKyAgICBlbnYtPmNyWzBdID0gc3JlZ3MuY3IwOworICAgIGVudi0+Y3JbMl0gPSBzcmVncy5jcjI7CisgICAgZW52LT5jclszXSA9IHNyZWdzLmNyMzsKKyAgICBlbnYtPmNyWzRdID0gc3JlZ3MuY3I0OworCisgICAgY3B1X3NldF9hcGljX2Jhc2UoZW52LCBzcmVncy5hcGljX2Jhc2UpOworCisgICAgZW52LT5lZmVyID0gc3JlZ3MuZWZlcjsKKyAgICAvL2NwdV9zZXRfYXBpY190cHIoZW52LCBzcmVncy5jcjgpOworCisjZGVmaW5lIEhGTEFHX0NPUFlfTUFTSyB+KCBcCisJCQlIRl9DUExfTUFTSyB8IEhGX1BFX01BU0sgfCBIRl9NUF9NQVNLIHwgSEZfRU1fTUFTSyB8IFwKKwkJCUhGX1RTX01BU0sgfCBIRl9URl9NQVNLIHwgSEZfVk1fTUFTSyB8IEhGX0lPUExfTUFTSyB8IFwKKwkJCUhGX09TRlhTUl9NQVNLIHwgSEZfTE1BX01BU0sgfCBIRl9DUzMyX01BU0sgfCBcCisJCQlIRl9TUzMyX01BU0sgfCBIRl9DUzY0X01BU0sgfCBIRl9BRERTRUdfTUFTSykKKworCisKKyAgICBoZmxhZ3MgPSAoZW52LT5zZWdzW1JfQ1NdLmZsYWdzID4+IERFU0NfRFBMX1NISUZUKSAmIEhGX0NQTF9NQVNLOworICAgIGhmbGFncyB8PSAoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSA8PCAoSEZfUEVfU0hJRlQgLSBDUjBfUEVfU0hJRlQpOworICAgIGhmbGFncyB8PSAoZW52LT5jclswXSA8PCAoSEZfTVBfU0hJRlQgLSBDUjBfTVBfU0hJRlQpKSAmCisJICAgIChIRl9NUF9NQVNLIHwgSEZfRU1fTUFTSyB8IEhGX1RTX01BU0spOworICAgIGhmbGFncyB8PSAoZW52LT5lZmxhZ3MgJiAoSEZfVEZfTUFTSyB8IEhGX1ZNX01BU0sgfCBIRl9JT1BMX01BU0spKTsKKyAgICBoZmxhZ3MgfD0gKGVudi0+Y3JbNF0gJiBDUjRfT1NGWFNSX01BU0spIDw8CisJICAgIChIRl9PU0ZYU1JfU0hJRlQgLSBDUjRfT1NGWFNSX1NISUZUKTsKKworICAgIGlmIChlbnYtPmVmZXIgJiBNU1JfRUZFUl9MTUEpIHsKKyAgICAgICAgaGZsYWdzIHw9IEhGX0xNQV9NQVNLOworICAgIH0KKworICAgIGlmICgoaGZsYWdzICYgSEZfTE1BX01BU0spICYmIChlbnYtPnNlZ3NbUl9DU10uZmxhZ3MgJiBERVNDX0xfTUFTSykpIHsKKyAgICAgICAgaGZsYWdzIHw9IEhGX0NTMzJfTUFTSyB8IEhGX1NTMzJfTUFTSyB8IEhGX0NTNjRfTUFTSzsKKyAgICB9IGVsc2UgeworICAgICAgICBoZmxhZ3MgfD0gKGVudi0+c2Vnc1tSX0NTXS5mbGFncyAmIERFU0NfQl9NQVNLKSA+PgorCQkoREVTQ19CX1NISUZUIC0gSEZfQ1MzMl9TSElGVCk7CisgICAgICAgIGhmbGFncyB8PSAoZW52LT5zZWdzW1JfU1NdLmZsYWdzICYgREVTQ19CX01BU0spID4+CisJCShERVNDX0JfU0hJRlQgLSBIRl9TUzMyX1NISUZUKTsKKyAgICAgICAgaWYgKCEoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSB8fAorICAgICAgICAgICAgICAgICAgIChlbnYtPmVmbGFncyAmIFZNX01BU0spIHx8CisgICAgICAgICAgICAgICAgICAgIShoZmxhZ3MgJiBIRl9DUzMyX01BU0spKSB7CisgICAgICAgICAgICAgICAgaGZsYWdzIHw9IEhGX0FERFNFR19NQVNLOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZmxhZ3MgfD0gKChlbnYtPnNlZ3NbUl9EU10uYmFzZSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+c2Vnc1tSX0VTXS5iYXNlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5zZWdzW1JfU1NdLmJhc2UpICE9IDApIDw8CisgICAgICAgICAgICAgICAgICAgIEhGX0FERFNFR19TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgZW52LT5oZmxhZ3MgPSAoZW52LT5oZmxhZ3MgJiBIRkxBR19DT1BZX01BU0spIHwgaGZsYWdzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX2dldF9tc3JzKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IGt2bV9tc3JzIGluZm87CisgICAgICAgIHN0cnVjdCBrdm1fbXNyX2VudHJ5IGVudHJpZXNbMTAwXTsKKyAgICB9IG1zcl9kYXRhOworICAgIHN0cnVjdCBrdm1fbXNyX2VudHJ5ICptc3JzID0gbXNyX2RhdGEuZW50cmllczsKKyAgICBpbnQgcmV0LCBpLCBuOworCisgICAgbiA9IDA7CisgICAgbXNyc1tuKytdLmluZGV4ID0gTVNSX0lBMzJfU1lTRU5URVJfQ1M7CisgICAgbXNyc1tuKytdLmluZGV4ID0gTVNSX0lBMzJfU1lTRU5URVJfRVNQOworICAgIG1zcnNbbisrXS5pbmRleCA9IE1TUl9JQTMyX1NZU0VOVEVSX0VJUDsKKyAgICBpZiAoa3ZtX2hhc19tc3Jfc3RhcihlbnYpKQorCW1zcnNbbisrXS5pbmRleCA9IE1TUl9TVEFSOworICAgIG1zcnNbbisrXS5pbmRleCA9IE1TUl9JQTMyX1RTQzsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgLyogRklYTUUgbG1fY2FwYWJsZV9rZXJuZWwgKi8KKyAgICBtc3JzW24rK10uaW5kZXggPSBNU1JfQ1NUQVI7CisgICAgbXNyc1tuKytdLmluZGV4ID0gTVNSX0tFUk5FTEdTQkFTRTsKKyAgICBtc3JzW24rK10uaW5kZXggPSBNU1JfRk1BU0s7CisgICAgbXNyc1tuKytdLmluZGV4ID0gTVNSX0xTVEFSOworI2VuZGlmCisgICAgbXNyX2RhdGEuaW5mby5ubXNycyA9IG47CisgICAgcmV0ID0ga3ZtX3ZjcHVfaW9jdGwoRU5WX0dFVF9DUFUoZW52KSwgS1ZNX0dFVF9NU1JTLCAmbXNyX2RhdGEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IHJldDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobXNyc1tpXS5pbmRleCkgeworICAgICAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorICAgICAgICAgICAgZW52LT5zeXNlbnRlcl9jcyA9IG1zcnNbaV0uZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VTUDoKKyAgICAgICAgICAgIGVudi0+c3lzZW50ZXJfZXNwID0gbXNyc1tpXS5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRUlQOgorICAgICAgICAgICAgZW52LT5zeXNlbnRlcl9laXAgPSBtc3JzW2ldLmRhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNU1JfU1RBUjoKKyAgICAgICAgICAgIGVudi0+c3RhciA9IG1zcnNbaV0uZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgY2FzZSBNU1JfQ1NUQVI6CisgICAgICAgICAgICBlbnYtPmNzdGFyID0gbXNyc1tpXS5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVNSX0tFUk5FTEdTQkFTRToKKyAgICAgICAgICAgIGVudi0+a2VybmVsZ3NiYXNlID0gbXNyc1tpXS5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVNSX0ZNQVNLOgorICAgICAgICAgICAgZW52LT5mbWFzayA9IG1zcnNbaV0uZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1TUl9MU1RBUjoKKyAgICAgICAgICAgIGVudi0+bHN0YXIgPSBtc3JzW2ldLmRhdGE7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBjYXNlIE1TUl9JQTMyX1RTQzoKKyAgICAgICAgICAgIGVudi0+dHNjID0gbXNyc1tpXS5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX3B1dF9yZWdpc3RlcnMoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBrdm1fZ2V0cHV0X3JlZ3MoZW52LCAxKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGt2bV9wdXRfZnB1KGVudik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBrdm1fcHV0X3NyZWdzKGVudik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBrdm1fcHV0X21zcnMoZW52KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGt2bV9wdXRfbXBfc3RhdGUoY3B1KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGt2bV9nZXRfbXBfc3RhdGUoY3B1KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitpbnQga3ZtX2FyY2hfZ2V0X3JlZ2lzdGVycyhDUFVTdGF0ZSAqY3B1KQoreworICAgIGludCByZXQ7CisgICAgQ1BVWDg2U3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKworICAgIHJldCA9IGt2bV9nZXRwdXRfcmVncyhlbnYsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0ga3ZtX2dldF9mcHUoZW52KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGt2bV9nZXRfc3JlZ3MoY3B1KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGt2bV9nZXRfbXNycyhlbnYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrdm1fYXJjaF92Y3B1X3J1bihDUFVTdGF0ZSAqY3B1KQoreworI2lmZGVmIENPTkZJR19LVk1fR1NfUkVTVE9SRQorICAgIGlmIChnc19uZWVkX3Jlc3RvcmUgICE9IEtWTV9HU19SRVNUT1JFX05PKQorICAgICAgICByZXR1cm4gbm9fZ3NfaW9jdGwoY3B1LT5rdm1fZmQsIEtWTV9SVU4sIDApOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByZXR1cm4ga3ZtX3ZjcHVfaW9jdGwoY3B1LCBLVk1fUlVOLCAwKTsKK30KKworaW50IGt2bV9hcmNoX3ByZV9ydW4oQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisgICAgLyogVHJ5IHRvIGluamVjdCBhbiBpbnRlcnJ1cHQgaWYgdGhlIGd1ZXN0IGNhbiBhY2NlcHQgaXQgKi8KKyAgICBpZiAocnVuLT5yZWFkeV9mb3JfaW50ZXJydXB0X2luamVjdGlvbiAmJgorICAgICAgICAoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgJiYKKyAgICAgICAgKGVudi0+ZWZsYWdzICYgSUZfTUFTSykpIHsKKyAgICAgICAgaW50IGlycTsKKworICAgICAgICBjcHUtPmludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX0hBUkQ7CisgICAgICAgIGlycSA9IGNwdV9nZXRfcGljX2ludGVycnVwdChlbnYpOworICAgICAgICBpZiAoaXJxID49IDApIHsKKyAgICAgICAgICAgIHN0cnVjdCBrdm1faW50ZXJydXB0IGludHI7CisgICAgICAgICAgICBpbnRyLmlycSA9IGlycTsKKyAgICAgICAgICAgIC8qIEZJWE1FOiBlcnJvcnMgKi8KKyAgICAgICAgICAgIGRwcmludGYoImluamVjdGVkIGludGVycnVwdCAlZFxuIiwgaXJxKTsKKyAgICAgICAgICAgIGt2bV92Y3B1X2lvY3RsKGNwdSwgS1ZNX0lOVEVSUlVQVCwgJmludHIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSWYgd2UgaGF2ZSBhbiBpbnRlcnJ1cHQgYnV0IHRoZSBndWVzdCBpcyBub3QgcmVhZHkgdG8gcmVjZWl2ZSBhbgorICAgICAqIGludGVycnVwdCwgcmVxdWVzdCBhbiBpbnRlcnJ1cHQgd2luZG93IGV4aXQuICBUaGlzIHdpbGwKKyAgICAgKiBjYXVzZSBhIHJldHVybiB0byB1c2Vyc3BhY2UgYXMgc29vbiBhcyB0aGUgZ3Vlc3QgaXMgcmVhZHkgdG8KKyAgICAgKiByZWNlaXZlIGludGVycnVwdHMuICovCisgICAgaWYgKChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9IQVJEKSkKKyAgICAgICAgcnVuLT5yZXF1ZXN0X2ludGVycnVwdF93aW5kb3cgPSAxOworICAgIGVsc2UKKyAgICAgICAgcnVuLT5yZXF1ZXN0X2ludGVycnVwdF93aW5kb3cgPSAwOworCisgICAgZHByaW50Zigic2V0dGluZyB0cHJcbiIpOworICAgIHJ1bi0+Y3I4ID0gY3B1X2dldF9hcGljX3RwcihlbnYpOworCisjaWZkZWYgQ09ORklHX0tWTV9HU19SRVNUT1JFCisgICAgZ3NfYmFzZV9wcmVfcnVuKCk7CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitpbnQga3ZtX2FyY2hfcG9zdF9ydW4oQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworI2lmZGVmIENPTkZJR19LVk1fR1NfUkVTVE9SRQorICAgIGdzX2Jhc2VfcG9zdF9ydW4oKTsKKyNlbmRpZgorICAgIGlmIChydW4tPmlmX2ZsYWcpCisgICAgICAgIGVudi0+ZWZsYWdzIHw9IElGX01BU0s7CisgICAgZWxzZQorICAgICAgICBlbnYtPmVmbGFncyAmPSB+SUZfTUFTSzsKKworICAgIGNwdV9zZXRfYXBpY190cHIoZW52LCBydW4tPmNyOCk7CisgICAgY3B1X3NldF9hcGljX2Jhc2UoZW52LCBydW4tPmFwaWNfYmFzZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrdm1faGFuZGxlX2hhbHQoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBDUFVYODZTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworCisgICAgaWYgKCEoKGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX0hBUkQpICYmCisgICAgICAgICAgKGVudi0+ZWZsYWdzICYgSUZfTUFTSykpICYmCisgICAgICAgICEoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfTk1JKSkgeworICAgICAgICBjcHUtPmhhbHRlZCA9IDE7CisgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9ITFQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCitpbnQga3ZtX2FyY2hfaGFuZGxlX2V4aXQoQ1BVU3RhdGUgKmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHN3aXRjaCAocnVuLT5leGl0X3JlYXNvbikgeworICAgIGNhc2UgS1ZNX0VYSVRfSExUOgorICAgICAgICBkcHJpbnRmKCJoYW5kbGVfaGx0XG4iKTsKKyAgICAgICAgcmV0ID0ga3ZtX2hhbmRsZV9oYWx0KGNwdSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBLVk1fQ0FQX1NFVF9HVUVTVF9ERUJVRworaW50IGt2bV9hcmNoX2luc2VydF9zd19icmVha3BvaW50KENQVVN0YXRlICpjcHUsIHN0cnVjdCBrdm1fc3dfYnJlYWtwb2ludCAqYnApCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgaW50MyA9IDB4Y2M7CisKKyAgICBpZiAoY3B1X21lbW9yeV9yd19kZWJ1ZyhjcHUsIGJwLT5wYywgKHVpbnQ4X3QgKikmYnAtPnNhdmVkX2luc24sIDEsIDApIHx8CisgICAgICAgIGNwdV9tZW1vcnlfcndfZGVidWcoY3B1LCBicC0+cGMsICh1aW50OF90ICopJmludDMsIDEsIDEpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX3JlbW92ZV9zd19icmVha3BvaW50KENQVVN0YXRlICpjcHUsIHN0cnVjdCBrdm1fc3dfYnJlYWtwb2ludCAqYnApCit7CisgICAgdWludDhfdCBpbnQzOworCisgICAgaWYgKGNwdV9tZW1vcnlfcndfZGVidWcoY3B1LCBicC0+cGMsICZpbnQzLCAxLCAwKSB8fCBpbnQzICE9IDB4Y2MgfHwKKyAgICAgICAgY3B1X21lbW9yeV9yd19kZWJ1ZyhjcHUsIGJwLT5wYywgKHVpbnQ4X3QgKikmYnAtPnNhdmVkX2luc24sIDEsIDEpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgaW50IGxlbjsKKyAgICBpbnQgdHlwZTsKK30gaHdfYnJlYWtwb2ludFs0XTsKKworc3RhdGljIGludCBuYl9od19icmVha3BvaW50OworCitzdGF0aWMgaW50IGZpbmRfaHdfYnJlYWtwb2ludCh0YXJnZXRfdWxvbmcgYWRkciwgaW50IGxlbiwgaW50IHR5cGUpCit7CisgICAgaW50IG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmJfaHdfYnJlYWtwb2ludDsgbisrKQorICAgICAgICBpZiAoaHdfYnJlYWtwb2ludFtuXS5hZGRyID09IGFkZHIgJiYgaHdfYnJlYWtwb2ludFtuXS50eXBlID09IHR5cGUgJiYKKyAgICAgICAgICAgIChod19icmVha3BvaW50W25dLmxlbiA9PSBsZW4gfHwgbGVuID09IC0xKSkKKyAgICAgICAgICAgIHJldHVybiBuOworICAgIHJldHVybiAtMTsKK30KKworaW50IGt2bV9hcmNoX2luc2VydF9od19icmVha3BvaW50KHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBsZW4sIGludCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgR0RCX0JSRUFLUE9JTlRfSFc6CisgICAgICAgIGxlbiA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0RCX1dBVENIUE9JTlRfV1JJVEU6CisgICAgY2FzZSBHREJfV0FUQ0hQT0lOVF9BQ0NFU1M6CisgICAgICAgIHN3aXRjaCAobGVuKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgaWYgKGFkZHIgJiAobGVuIC0gMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKworICAgIGlmIChuYl9od19icmVha3BvaW50ID09IDQpCisgICAgICAgIHJldHVybiAtRU5PQlVGUzsKKworICAgIGlmIChmaW5kX2h3X2JyZWFrcG9pbnQoYWRkciwgbGVuLCB0eXBlKSA+PSAwKQorICAgICAgICByZXR1cm4gLUVFWElTVDsKKworICAgIGh3X2JyZWFrcG9pbnRbbmJfaHdfYnJlYWtwb2ludF0uYWRkciA9IGFkZHI7CisgICAgaHdfYnJlYWtwb2ludFtuYl9od19icmVha3BvaW50XS5sZW4gPSBsZW47CisgICAgaHdfYnJlYWtwb2ludFtuYl9od19icmVha3BvaW50XS50eXBlID0gdHlwZTsKKyAgICBuYl9od19icmVha3BvaW50Kys7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGt2bV9hcmNoX3JlbW92ZV9od19icmVha3BvaW50KHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBsZW4sIGludCB0eXBlKQoreworICAgIGludCBuOworCisgICAgbiA9IGZpbmRfaHdfYnJlYWtwb2ludChhZGRyLCAodHlwZSA9PSBHREJfQlJFQUtQT0lOVF9IVykgPyAxIDogbGVuLCB0eXBlKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiAtRU5PRU5UOworCisgICAgbmJfaHdfYnJlYWtwb2ludC0tOworICAgIGh3X2JyZWFrcG9pbnRbbl0gPSBod19icmVha3BvaW50W25iX2h3X2JyZWFrcG9pbnRdOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga3ZtX2FyY2hfcmVtb3ZlX2FsbF9od19icmVha3BvaW50cyh2b2lkKQoreworICAgIG5iX2h3X2JyZWFrcG9pbnQgPSAwOworfQorCitzdGF0aWMgQ1BVV2F0Y2hwb2ludCBod193YXRjaHBvaW50OworCitpbnQga3ZtX2FyY2hfZGVidWcoc3RydWN0IGt2bV9kZWJ1Z19leGl0X2FyY2ggKmFyY2hfaW5mbykKK3sKKyAgICBpbnQgaGFuZGxlID0gMDsKKyAgICBpbnQgbjsKKworICAgIGlmIChhcmNoX2luZm8tPmV4Y2VwdGlvbiA9PSAxKSB7CisgICAgICAgIGlmIChhcmNoX2luZm8tPmRyNiAmICgxIDw8IDE0KSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRfY3B1LT5zaW5nbGVzdGVwX2VuYWJsZWQpCisgICAgICAgICAgICAgICAgaGFuZGxlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCA0OyBuKyspCisgICAgICAgICAgICAgICAgaWYgKGFyY2hfaW5mby0+ZHI2ICYgKDEgPDwgbikpCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGFyY2hfaW5mby0+ZHI3ID4+ICgxNiArIG4qNCkpICYgMHgzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBjcHVfc2luZ2xlX2Vudi0+d2F0Y2hwb2ludF9oaXQgPSAmaHdfd2F0Y2hwb2ludDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X3dhdGNocG9pbnQudmFkZHIgPSBod19icmVha3BvaW50W25dLmFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICBod193YXRjaHBvaW50LmZsYWdzID0gQlBfTUVNX1dSSVRFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgzOgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9zaW5nbGVfZW52LT53YXRjaHBvaW50X2hpdCA9ICZod193YXRjaHBvaW50OworICAgICAgICAgICAgICAgICAgICAgICAgaHdfd2F0Y2hwb2ludC52YWRkciA9IGh3X2JyZWFrcG9pbnRbbl0uYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGh3X3dhdGNocG9pbnQuZmxhZ3MgPSBCUF9NRU1fQUNDRVNTOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoa3ZtX2ZpbmRfc3dfYnJlYWtwb2ludChjdXJyZW50X2NwdSwgYXJjaF9pbmZvLT5wYykpCisgICAgICAgIGhhbmRsZSA9IDE7CisKKyAgICBpZiAoIWhhbmRsZSkKKyAgICAgICAga3ZtX3VwZGF0ZV9ndWVzdF9kZWJ1ZyhjdXJyZW50X2NwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChhcmNoX2luZm8tPmV4Y2VwdGlvbiA9PSAxKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBLVk1fR1VFU1REQkdfSU5KRUNUX0RCIDogS1ZNX0dVRVNUREJHX0lOSkVDVF9CUCk7CisKKyAgICByZXR1cm4gaGFuZGxlOworfQorCit2b2lkIGt2bV9hcmNoX3VwZGF0ZV9ndWVzdF9kZWJ1ZyhDUFVTdGF0ZSAqY3B1LCBzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnICpkYmcpCit7CisgICAgY29uc3QgdWludDhfdCB0eXBlX2NvZGVbXSA9IHsKKyAgICAgICAgW0dEQl9CUkVBS1BPSU5UX0hXXSA9IDB4MCwKKyAgICAgICAgW0dEQl9XQVRDSFBPSU5UX1dSSVRFXSA9IDB4MSwKKyAgICAgICAgW0dEQl9XQVRDSFBPSU5UX0FDQ0VTU10gPSAweDMKKyAgICB9OworICAgIGNvbnN0IHVpbnQ4X3QgbGVuX2NvZGVbXSA9IHsKKyAgICAgICAgWzFdID0gMHgwLCBbMl0gPSAweDEsIFs0XSA9IDB4MywgWzhdID0gMHgyCisgICAgfTsKKyAgICBpbnQgbjsKKworICAgIGlmIChrdm1fc3dfYnJlYWtwb2ludHNfYWN0aXZlKGNwdSkpCisgICAgICAgIGRiZy0+Y29udHJvbCB8PSBLVk1fR1VFU1REQkdfRU5BQkxFIHwgS1ZNX0dVRVNUREJHX1VTRV9TV19CUDsKKworICAgIGlmIChuYl9od19icmVha3BvaW50ID4gMCkgeworICAgICAgICBkYmctPmNvbnRyb2wgfD0gS1ZNX0dVRVNUREJHX0VOQUJMRSB8IEtWTV9HVUVTVERCR19VU0VfSFdfQlA7CisgICAgICAgIGRiZy0+YXJjaC5kZWJ1Z3JlZ1s3XSA9IDB4MDYwMDsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG5iX2h3X2JyZWFrcG9pbnQ7IG4rKykgeworICAgICAgICAgICAgZGJnLT5hcmNoLmRlYnVncmVnW25dID0gaHdfYnJlYWtwb2ludFtuXS5hZGRyOworICAgICAgICAgICAgZGJnLT5hcmNoLmRlYnVncmVnWzddIHw9ICgyIDw8IChuICogMikpIHwKKyAgICAgICAgICAgICAgICAodHlwZV9jb2RlW2h3X2JyZWFrcG9pbnRbbl0udHlwZV0gPDwgKDE2ICsgbio0KSkgfAorICAgICAgICAgICAgICAgIChsZW5fY29kZVtod19icmVha3BvaW50W25dLmxlbl0gPDwgKDE4ICsgbio0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvbWFjaGluZS5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9tYWNoaW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2Y2FmYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvbWFjaGluZS5jCkBAIC0wLDAgKzEsMzExIEBACisjaW5jbHVkZSAiaHcvaHcuaCIKKyNpbmNsdWRlICJody9ib2FyZHMuaCIKKyNpbmNsdWRlICJody9pMzg2L3BjLmgiCisjaW5jbHVkZSAiaHcvaXNhL2lzYS5oIgorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorCitzdGF0aWMgdm9pZCBjcHVfcHV0X3NlZyhRRU1VRmlsZSAqZiwgU2VnbWVudENhY2hlICpkdCkKK3sKKyAgICBxZW11X3B1dF9iZTMyKGYsIGR0LT5zZWxlY3Rvcik7CisgICAgcWVtdV9wdXRfYmV0bChmLCBkdC0+YmFzZSk7CisgICAgcWVtdV9wdXRfYmUzMihmLCBkdC0+bGltaXQpOworICAgIHFlbXVfcHV0X2JlMzIoZiwgZHQtPmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3B1X2dldF9zZWcoUUVNVUZpbGUgKmYsIFNlZ21lbnRDYWNoZSAqZHQpCit7CisgICAgZHQtPnNlbGVjdG9yID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBkdC0+YmFzZSA9IHFlbXVfZ2V0X2JldGwoZik7CisgICAgZHQtPmxpbWl0ID0gcWVtdV9nZXRfYmUzMihmKTsKKyAgICBkdC0+ZmxhZ3MgPSBxZW11X2dldF9iZTMyKGYpOworfQorCit2b2lkIGNwdV9zYXZlKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUpCit7CisgICAgQ1BVWDg2U3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICB1aW50MTZfdCBmcHRhZywgZnB1cywgZnB1YywgZnByZWdzX2Zvcm1hdDsKKyAgICB1aW50MzJfdCBoZmxhZ3M7CisgICAgaW50MzJfdCBhMjBfbWFzazsKKyAgICBpbnQgaTsKKworICAgIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZShFTlZfR0VUX0NQVShlbnYpLCAwKTsKKworICAgIGZvcihpID0gMDsgaSA8IENQVV9OQl9SRUdTOyBpKyspCisgICAgICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPnJlZ3NbaV0pOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPmVpcCk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+ZWZsYWdzKTsKKyAgICBoZmxhZ3MgPSBlbnYtPmhmbGFnczsgLyogWFhYOiBzdXBwcmVzcyBtb3N0IG9mIHRoZSByZWR1bmRhbnQgaGZsYWdzICovCisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJmhmbGFncyk7CisKKyAgICAvKiBGUFUgKi8KKyAgICBmcHVjID0gZW52LT5mcHVjOworICAgIGZwdXMgPSAoZW52LT5mcHVzICYgfjB4MzgwMCkgfCAoZW52LT5mcHN0dCAmIDB4NykgPDwgMTE7CisgICAgZnB0YWcgPSAwOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmcHRhZyB8PSAoKCFlbnYtPmZwdGFnc1tpXSkgPDwgaSk7CisgICAgfQorCisgICAgcWVtdV9wdXRfYmUxNnMoZiwgJmZwdWMpOworICAgIHFlbXVfcHV0X2JlMTZzKGYsICZmcHVzKTsKKyAgICBxZW11X3B1dF9iZTE2cyhmLCAmZnB0YWcpOworCisgICAgZnByZWdzX2Zvcm1hdCA9IDE7CisgICAgcWVtdV9wdXRfYmUxNnMoZiwgJmZwcmVnc19mb3JtYXQpOworCisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIC8qIGlmIHdlIHVzZSBkb3VibGVzIGZvciBmbG9hdCBlbXVsYXRpb24sIHdlIHNhdmUgdGhlIGRvdWJsZXMgdG8KKyAgICAgICAgICAgYXZvaWQgbG9zaW5nIGluZm9ybWF0aW9uIGluIGNhc2Ugb2YgTU1YIHVzYWdlLiBJdCBjYW4gZ2l2ZQorICAgICAgICAgICBwcm9ibGVtcyBpZiB0aGUgaW1hZ2UgaXMgcmVzdG9yZWQgb24gYSBDUFUgd2hlcmUgbG9uZworICAgICAgICAgICBkb3VibGVzIGFyZSB1c2VkIGluc3RlYWQuICovCisgICAgICAgIHFlbXVfcHV0X2JlNjQoZiwgZW52LT5mcHJlZ3NbaV0ubW14Lk1NWF9RKDApKTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGNwdV9wdXRfc2VnKGYsICZlbnYtPnNlZ3NbaV0pOworICAgIGNwdV9wdXRfc2VnKGYsICZlbnYtPmxkdCk7CisgICAgY3B1X3B1dF9zZWcoZiwgJmVudi0+dHIpOworICAgIGNwdV9wdXRfc2VnKGYsICZlbnYtPmdkdCk7CisgICAgY3B1X3B1dF9zZWcoZiwgJmVudi0+aWR0KTsKKworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPnN5c2VudGVyX2NzKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5zeXNlbnRlcl9lc3ApOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPnN5c2VudGVyX2VpcCk7CisKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5jclswXSk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+Y3JbMl0pOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPmNyWzNdKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5jcls0XSk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPmRyW2ldKTsKKworICAgIC8qIE1NVSAqLworICAgIGEyMF9tYXNrID0gKGludDMyX3QpIGVudi0+YTIwX21hc2s7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZhMjBfbWFzayk7CisKKyAgICAvKiBYTU0gKi8KKyAgICBxZW11X3B1dF9iZTMycyhmLCAmZW52LT5teGNzcik7CisgICAgZm9yKGkgPSAwOyBpIDwgQ1BVX05CX1JFR1M7IGkrKykgeworICAgICAgICBxZW11X3B1dF9iZTY0cyhmLCAmZW52LT54bW1fcmVnc1tpXS5YTU1fUSgwKSk7CisgICAgICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPnhtbV9yZWdzW2ldLlhNTV9RKDEpKTsKKyAgICB9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+ZWZlcik7CisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+c3Rhcik7CisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bHN0YXIpOworICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPmNzdGFyKTsKKyAgICBxZW11X3B1dF9iZTY0cyhmLCAmZW52LT5mbWFzayk7CisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+a2VybmVsZ3NiYXNlKTsKKyNlbmRpZgorICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPnNtYmFzZSk7CisKKyAgICBxZW11X3B1dF9iZTY0cyhmLCAmZW52LT5wYXQpOworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPmhmbGFnczIpOworCisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+dm1faHNhdmUpOworICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPnZtX3ZtY2IpOworICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPnRzY19vZmZzZXQpOworICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPmludGVyY2VwdCk7CisgICAgcWVtdV9wdXRfYmUxNnMoZiwgJmVudi0+aW50ZXJjZXB0X2NyX3JlYWQpOworICAgIHFlbXVfcHV0X2JlMTZzKGYsICZlbnYtPmludGVyY2VwdF9jcl93cml0ZSk7CisgICAgcWVtdV9wdXRfYmUxNnMoZiwgJmVudi0+aW50ZXJjZXB0X2RyX3JlYWQpOworICAgIHFlbXVfcHV0X2JlMTZzKGYsICZlbnYtPmludGVyY2VwdF9kcl93cml0ZSk7CisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJmVudi0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMpOworICAgIHFlbXVfcHV0XzhzKGYsICZlbnYtPnZfdHByKTsKKworICAgIC8qIE1UUlJzICovCisgICAgZm9yKGkgPSAwOyBpIDwgMTE7IGkrKykKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bXRycl9maXhlZFtpXSk7CisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bXRycl9kZWZ0eXBlKTsKKyAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bXRycl92YXJbaV0uYmFzZSk7CisgICAgICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPm10cnJfdmFyW2ldLm1hc2spOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoZW52LT5pbnRlcnJ1cHRfYml0bWFwKS84OyBpKyspIHsKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+aW50ZXJydXB0X2JpdG1hcFtpXSk7CisgICAgfQorICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPnRzYyk7CisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJmVudi0+bXBfc3RhdGUpOworCisgICAgLyogTUNFICovCisgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bWNnX2NhcCk7CisgICAgaWYgKGVudi0+bWNnX2NhcCkgeworICAgICAgICBxZW11X3B1dF9iZTY0cyhmLCAmZW52LT5tY2dfc3RhdHVzKTsKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bWNnX2N0bCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoZW52LT5tY2dfY2FwICYgMHhmZik7IGkrKykgeworICAgICAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bWNlX2JhbmtzWzQqaV0pOworICAgICAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmVudi0+bWNlX2JhbmtzWzQqaSArIDFdKTsKKyAgICAgICAgICAgIHFlbXVfcHV0X2JlNjRzKGYsICZlbnYtPm1jZV9iYW5rc1s0KmkgKyAyXSk7CisgICAgICAgICAgICBxZW11X3B1dF9iZTY0cyhmLCAmZW52LT5tY2VfYmFua3NbNCppICsgM10pOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgY3B1X2xvYWQoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSwgaW50IHZlcnNpb25faWQpCit7CisgICAgQ1BVWDg2U3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICBpbnQgaSwgZ3Vlc3NfbW14OworICAgIHVpbnQzMl90IGhmbGFnczsKKyAgICB1aW50MTZfdCBmcHVzLCBmcHVjLCBmcHRhZywgZnByZWdzX2Zvcm1hdDsKKyAgICBpbnQzMl90IGEyMF9tYXNrOworCisgICAgaWYgKHZlcnNpb25faWQgPCAzIHx8IHZlcnNpb25faWQgPiBDUFVfU0FWRV9WRVJTSU9OKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBmb3IoaSA9IDA7IGkgPCBDUFVfTkJfUkVHUzsgaSsrKQorICAgICAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5yZWdzW2ldKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5laXApOworICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPmVmbGFncyk7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJmhmbGFncyk7CisKKyAgICBxZW11X2dldF9iZTE2cyhmLCAmZnB1Yyk7CisgICAgcWVtdV9nZXRfYmUxNnMoZiwgJmZwdXMpOworICAgIHFlbXVfZ2V0X2JlMTZzKGYsICZmcHRhZyk7CisgICAgcWVtdV9nZXRfYmUxNnMoZiwgJmZwcmVnc19mb3JtYXQpOworCisgICAgLyogTk9URTogd2UgY2Fubm90IGFsd2F5cyByZXN0b3JlIHRoZSBGUFUgc3RhdGUgaWYgdGhlIGltYWdlIGNvbWUKKyAgICAgICBmcm9tIGEgaG9zdCB3aXRoIGEgZGlmZmVyZW50ICdVU0VfWDg2TERPVUJMRScgZGVmaW5lLiBXZSBndWVzcworICAgICAgIGlmIHdlIGFyZSBpbiBhbiBNTVggc3RhdGUgdG8gcmVzdG9yZSBjb3JyZWN0bHkgaW4gdGhhdCBjYXNlLiAqLworICAgIGd1ZXNzX21teCA9ICgoZnB0YWcgPT0gMHhmZikgJiYgKGZwdXMgJiAweDM4MDApID09IDApOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICB1aW50NjRfdCBtYW50OworICAgICAgICB1aW50MTZfdCBleHA7CisKKyAgICAgICAgc3dpdGNoKGZwcmVnc19mb3JtYXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgbWFudCA9IHFlbXVfZ2V0X2JlNjQoZik7CisgICAgICAgICAgICBleHAgPSBxZW11X2dldF9iZTE2KGYpOworICAgICAgICAgICAgLyogZGlmZmljdWx0IGNhc2UgKi8KKyAgICAgICAgICAgIGlmIChndWVzc19tbXgpCisgICAgICAgICAgICAgICAgZW52LT5mcHJlZ3NbaV0ubW14Lk1NWF9RKDApID0gbWFudDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlbnYtPmZwcmVnc1tpXS5kID0gY3B1X3NldF9mcDgwKG1hbnQsIGV4cCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbWFudCA9IHFlbXVfZ2V0X2JlNjQoZik7CisgICAgICAgICAgICBlbnYtPmZwcmVnc1tpXS5tbXguTU1YX1EoMCkgPSBtYW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudi0+ZnB1YyA9IGZwdWM7CisgICAgLyogWFhYOiByZXN0b3JlIEZQVSByb3VuZCBzdGF0ZSAqLworICAgIGVudi0+ZnBzdHQgPSAoZnB1cyA+PiAxMSkgJiA3OworICAgIGVudi0+ZnB1cyA9IGZwdXMgJiB+MHgzODAwOworICAgIGZwdGFnIF49IDB4ZmY7CisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGVudi0+ZnB0YWdzW2ldID0gKGZwdGFnID4+IGkpICYgMTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgIGNwdV9nZXRfc2VnKGYsICZlbnYtPnNlZ3NbaV0pOworICAgIGNwdV9nZXRfc2VnKGYsICZlbnYtPmxkdCk7CisgICAgY3B1X2dldF9zZWcoZiwgJmVudi0+dHIpOworICAgIGNwdV9nZXRfc2VnKGYsICZlbnYtPmdkdCk7CisgICAgY3B1X2dldF9zZWcoZiwgJmVudi0+aWR0KTsKKworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZlbnYtPnN5c2VudGVyX2NzKTsKKyAgICBpZiAodmVyc2lvbl9pZCA+PSA3KSB7CisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPnN5c2VudGVyX2VzcCk7CisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPnN5c2VudGVyX2VpcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5zeXNlbnRlcl9lc3AgPSBxZW11X2dldF9iZTMyKGYpOworICAgICAgICBlbnYtPnN5c2VudGVyX2VpcCA9IHFlbXVfZ2V0X2JlMzIoZik7CisgICAgfQorCisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Y3JbMF0pOworICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPmNyWzJdKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5jclszXSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Y3JbNF0pOworCisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5kcltpXSk7CisgICAgY3B1X2JyZWFrcG9pbnRfcmVtb3ZlX2FsbChlbnYsIEJQX0NQVSk7CisgICAgY3B1X3dhdGNocG9pbnRfcmVtb3ZlX2FsbChlbnYsIEJQX0NQVSk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgaHdfYnJlYWtwb2ludF9pbnNlcnQoZW52LCBpKTsKKworICAgIC8qIE1NVSAqLworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmYTIwX21hc2spOworICAgIGVudi0+YTIwX21hc2sgPSBhMjBfbWFzazsKKworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZlbnYtPm14Y3NyKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBDUFVfTkJfUkVHUzsgaSsrKSB7CisgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPnhtbV9yZWdzW2ldLlhNTV9RKDApKTsKKyAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+eG1tX3JlZ3NbaV0uWE1NX1EoMSkpOworICAgIH0KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5lZmVyKTsKKyAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5zdGFyKTsKKyAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5sc3Rhcik7CisgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+Y3N0YXIpOworICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPmZtYXNrKTsKKyAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5rZXJuZWxnc2Jhc2UpOworI2VuZGlmCisgICAgaWYgKHZlcnNpb25faWQgPj0gNCkgeworICAgICAgICBxZW11X2dldF9iZTMycyhmLCAmZW52LT5zbWJhc2UpOworICAgIH0KKyAgICBpZiAodmVyc2lvbl9pZCA+PSA1KSB7CisgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPnBhdCk7CisgICAgICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZlbnYtPmhmbGFnczIpOworICAgICAgICBpZiAodmVyc2lvbl9pZCA8IDYpCisgICAgICAgICAgICBxZW11X2dldF9iZTMycyhmLCAmRU5WX0dFVF9DUFUoZW52KS0+aGFsdGVkKTsKKworICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT52bV9oc2F2ZSk7CisgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPnZtX3ZtY2IpOworICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT50c2Nfb2Zmc2V0KTsKKyAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+aW50ZXJjZXB0KTsKKyAgICAgICAgcWVtdV9nZXRfYmUxNnMoZiwgJmVudi0+aW50ZXJjZXB0X2NyX3JlYWQpOworICAgICAgICBxZW11X2dldF9iZTE2cyhmLCAmZW52LT5pbnRlcmNlcHRfY3Jfd3JpdGUpOworICAgICAgICBxZW11X2dldF9iZTE2cyhmLCAmZW52LT5pbnRlcmNlcHRfZHJfcmVhZCk7CisgICAgICAgIHFlbXVfZ2V0X2JlMTZzKGYsICZlbnYtPmludGVyY2VwdF9kcl93cml0ZSk7CisgICAgICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZlbnYtPmludGVyY2VwdF9leGNlcHRpb25zKTsKKyAgICAgICAgcWVtdV9nZXRfOHMoZiwgJmVudi0+dl90cHIpOworICAgIH0KKworICAgIGlmICh2ZXJzaW9uX2lkID49IDgpIHsKKyAgICAgICAgLyogTVRSUnMgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTE7IGkrKykKKyAgICAgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPm10cnJfZml4ZWRbaV0pOworICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5tdHJyX2RlZnR5cGUpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPm10cnJfdmFyW2ldLmJhc2UpOworICAgICAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+bXRycl92YXJbaV0ubWFzayk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHZlcnNpb25faWQgPj0gOSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGVudi0+aW50ZXJydXB0X2JpdG1hcCkvODsgaSsrKSB7CisgICAgICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5pbnRlcnJ1cHRfYml0bWFwW2ldKTsKKyAgICAgICAgfQorICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT50c2MpOworICAgICAgICBxZW11X2dldF9iZTMycyhmLCAmZW52LT5tcF9zdGF0ZSk7CisgICAgfQorCisgICAgaWYgKHZlcnNpb25faWQgPj0gMTApIHsKKyAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+bWNnX2NhcCk7CisgICAgICAgIGlmIChlbnYtPm1jZ19jYXApIHsKKyAgICAgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPm1jZ19zdGF0dXMpOworICAgICAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+bWNnX2N0bCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGVudi0+bWNnX2NhcCAmIDB4ZmYpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5tY2VfYmFua3NbNCppXSk7CisgICAgICAgICAgICAgICAgcWVtdV9nZXRfYmU2NHMoZiwgJmVudi0+bWNlX2JhbmtzWzQqaSArIDFdKTsKKyAgICAgICAgICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZW52LT5tY2VfYmFua3NbNCppICsgMl0pOworICAgICAgICAgICAgICAgIHFlbXVfZ2V0X2JlNjRzKGYsICZlbnYtPm1jZV9iYW5rc1s0KmkgKyAzXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIFhYWDogZW5zdXJlIGNvbXBhdGlibGl0eSBmb3IgaGFsdGVkIGJpdCA/ICovCisgICAgLyogWFhYOiBjb21wdXRlIHJlZHVuZGFudCBoZmxhZ3MgYml0cyAqLworICAgIGVudi0+aGZsYWdzID0gaGZsYWdzOworICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgIGNwdV9zeW5jaHJvbml6ZV9zdGF0ZShFTlZfR0VUX0NQVShlbnYpLCAxKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvbWVtX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9tZW1faGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwMGJhYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvbWVtX2hlbHBlci5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogIHg4NiBtZW1vcnkgYWNjZXNzIGhlbHBlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9leGVjLmgiCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KKworLyogYnJva2VuIHRocmVhZCBzdXBwb3J0ICovCisKK3N0YXRpYyBzcGlubG9ja190IGdsb2JhbF9jcHVfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwordm9pZCBoZWxwZXJfbG9jayh2b2lkKQoreworICAgIHNwaW5fbG9jaygmZ2xvYmFsX2NwdV9sb2NrKTsKK30KKwordm9pZCBoZWxwZXJfdW5sb2NrKHZvaWQpCit7CisgICAgc3Bpbl91bmxvY2soJmdsb2JhbF9jcHVfbG9jayk7Cit9CisKK3ZvaWQgaGVscGVyX2NtcHhjaGc4YihDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYTApCit7CisgICAgdWludDY0X3QgZDsKKyAgICBpbnQgZWZsYWdzOworCisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGQgPSBjcHVfbGRxX2RhdGEoZW52LCBhMCk7CisgICAgaWYgKGQgPT0gKCgodWludDY0X3QpRURYIDw8IDMyKSB8ICh1aW50MzJfdClFQVgpKSB7CisgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGEwLCAoKHVpbnQ2NF90KUVDWCA8PCAzMikgfCAodWludDMyX3QpRUJYKTsKKyAgICAgICAgZWZsYWdzIHw9IENDX1o7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogYWx3YXlzIGRvIHRoZSBzdG9yZSAqLworICAgICAgICBjcHVfc3RxX2RhdGEoZW52LCBhMCwgZCk7CisgICAgICAgIEVEWCA9ICh1aW50MzJfdCkoZCA+PiAzMik7CisgICAgICAgIEVBWCA9ICh1aW50MzJfdClkOworICAgICAgICBlZmxhZ3MgJj0gfkNDX1o7CisgICAgfQorICAgIENDX1NSQyA9IGVmbGFnczsKK30KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKK3ZvaWQgaGVscGVyX2NtcHhjaGcxNmIoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGEwKQoreworICAgIHVpbnQ2NF90IGQwLCBkMTsKKyAgICBpbnQgZWZsYWdzOworCisgICAgaWYgKChhMCAmIDB4ZikgIT0gMCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDBEX0dQRik7CisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGQwID0gY3B1X2xkcV9kYXRhKGVudiwgYTApOworICAgIGQxID0gY3B1X2xkcV9kYXRhKGVudiwgYTAgKyA4KTsKKyAgICBpZiAoZDAgPT0gRUFYICYmIGQxID09IEVEWCkgeworICAgICAgICBjcHVfc3RxX2RhdGEoZW52LCBhMCwgRUJYKTsKKyAgICAgICAgY3B1X3N0cV9kYXRhKGVudiwgYTAgKyA4LCBFQ1gpOworICAgICAgICBlZmxhZ3MgfD0gQ0NfWjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBhbHdheXMgZG8gdGhlIHN0b3JlICovCisgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGEwLCBkMCk7CisgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGEwICsgOCwgZDEpOworICAgICAgICBFRFggPSBkMTsKKyAgICAgICAgRUFYID0gZDA7CisgICAgICAgIGVmbGFncyAmPSB+Q0NfWjsKKyAgICB9CisgICAgQ0NfU1JDID0gZWZsYWdzOworfQorI2VuZGlmCisKK3ZvaWQgaGVscGVyX2JvdW5kdyhDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYTAsIGludCB2KQoreworICAgIGludCBsb3csIGhpZ2g7CisgICAgbG93ID0gY3B1X2xkc3dfZGF0YShlbnYsIGEwKTsKKyAgICBoaWdoID0gY3B1X2xkc3dfZGF0YShlbnYsIGEwICsgMik7CisgICAgdiA9IChpbnQxNl90KXY7CisgICAgaWYgKHYgPCBsb3cgfHwgdiA+IGhpZ2gpIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDA1X0JPVU5EKTsKKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2JvdW5kbChDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYTAsIGludCB2KQoreworICAgIGludCBsb3csIGhpZ2g7CisgICAgbG93ID0gY3B1X2xkbF9kYXRhKGVudiwgYTApOworICAgIGhpZ2ggPSBjcHVfbGRsX2RhdGEoZW52LCBhMCArIDQpOworICAgIGlmICh2IDwgbG93IHx8IHYgPiBoaWdoKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwNV9CT1VORCk7CisgICAgfQorfQorCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKworI2RlZmluZSBNTVVTVUZGSVggX21tdQorCisjZGVmaW5lIFNISUZUIDAKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTSElGVCAxCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmgiCisKKyNkZWZpbmUgU0hJRlQgMgorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgorCisjZGVmaW5lIFNISUZUIDMKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorLyogdHJ5IHRvIGZpbGwgdGhlIFRMQiBhbmQgcmV0dXJuIGFuIGV4Y2VwdGlvbiBpZiBlcnJvci4gSWYgcmV0YWRkciBpcworICAgTlVMTCwgaXQgbWVhbnMgdGhhdCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBpbiBDIGNvZGUgKGkuZS4gbm90CisgICBmcm9tIGdlbmVyYXRlZCBjb2RlIG9yIGZyb20gaGVscGVyLmMpICovCisvKiBYWFg6IGZpeCBpdCB0byByZXN0b3JlIGFsbCByZWdpc3RlcnMgKi8KK3ZvaWQgdGxiX2ZpbGwoQ1BVWDg2U3RhdGUqIGVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBpc193cml0ZSwgaW50IG1tdV9pZHgsCisgICAgICAgICAgICAgIHVpbnRwdHJfdCByZXRhZGRyKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBjcHVfeDg2X2hhbmRsZV9tbXVfZmF1bHQoZW52LCBhZGRyLCBpc193cml0ZSwgbW11X2lkeCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBpZiAocmV0YWRkcikgeworICAgICAgICAgICAgLyogbm93IHdlIGhhdmUgYSByZWFsIGNwdSBmYXVsdCAqLworICAgICAgICAgICAgY3B1X3Jlc3RvcmVfc3RhdGUoZW52LCByZXRhZGRyKTsKKyAgICAgICAgfQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgZW52LT5leGNlcHRpb25faW5kZXgsIGVudi0+ZXJyb3JfY29kZSk7CisgICAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L21pc2NfaGVscGVyLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L21pc2NfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkYzg5NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvbWlzY19oZWxwZXIuYwpAQCAtMCwwICsxLDU2NCBAQAorLyoKKyAqICB4ODYgbWlzYyBoZWxwZXJzCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImV4ZWMvaW9wb3J0LmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV9leGVjLmgiCisjZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KKworLyogY2hlY2sgaWYgUG9ydCBJL08gaXMgYWxsb3dlZCBpbiBUU1MgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19pbyhDUFVYODZTdGF0ZSAqZW52LCBpbnQgYWRkciwgaW50IHNpemUpCit7CisgICAgaW50IGlvX29mZnNldCwgdmFsLCBtYXNrOworCisgICAgLyogVFNTIG11c3QgYmUgYSB2YWxpZCAzMiBiaXQgb25lICovCisgICAgaWYgKCEoZW52LT50ci5mbGFncyAmIERFU0NfUF9NQVNLKSB8fAorICAgICAgICAoKGVudi0+dHIuZmxhZ3MgPj4gREVTQ19UWVBFX1NISUZUKSAmIDB4ZikgIT0gOSB8fAorICAgICAgICBlbnYtPnRyLmxpbWl0IDwgMTAzKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaW9fb2Zmc2V0ID0gY3B1X2xkdXdfa2VybmVsKGVudiwgZW52LT50ci5iYXNlICsgMHg2Nik7CisgICAgaW9fb2Zmc2V0ICs9IChhZGRyID4+IDMpOworICAgIC8qIE5vdGU6IHRoZSBjaGVjayBuZWVkcyB0d28gYnl0ZXMgKi8KKyAgICBpZiAoKGlvX29mZnNldCArIDEpID4gZW52LT50ci5saW1pdCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHZhbCA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArIGlvX29mZnNldCk7CisgICAgdmFsID4+PSAoYWRkciAmIDcpOworICAgIG1hc2sgPSAoMSA8PCBzaXplKSAtIDE7CisgICAgLyogYWxsIGJpdHMgbXVzdCBiZSB6ZXJvIHRvIGFsbG93IHRoZSBJL08gKi8KKyAgICBpZiAoKHZhbCAmIG1hc2spICE9IDApIHsKKyAgICBmYWlsOgorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgMCk7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9jaGVja19pb2IoQ1BVWDg2U3RhdGUgKmVudiwgdWludDMyX3QgdDApCit7CisgICAgY2hlY2tfaW8oZW52LCB0MCwgMSk7Cit9CisKK3ZvaWQgaGVscGVyX2NoZWNrX2lvdyhDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCB0MCkKK3sKKyAgICBjaGVja19pbyhlbnYsIHQwLCAyKTsKK30KKwordm9pZCBoZWxwZXJfY2hlY2tfaW9sKENQVVg4NlN0YXRlICplbnYsIHVpbnQzMl90IHQwKQoreworICAgIGNoZWNrX2lvKGVudiwgdDAsIDQpOworfQorCit2b2lkIGhlbHBlcl9vdXRiKHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IGRhdGEpCit7CisgICAgY3B1X291dGIocG9ydCwgZGF0YSAmIDB4ZmYpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2luYih1aW50MzJfdCBwb3J0KQoreworICAgIHJldHVybiBjcHVfaW5iKHBvcnQpOworfQorCit2b2lkIGhlbHBlcl9vdXR3KHVpbnQzMl90IHBvcnQsIHVpbnQzMl90IGRhdGEpCit7CisgICAgY3B1X291dHcocG9ydCwgZGF0YSAmIDB4ZmZmZik7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfaW53KHVpbnQzMl90IHBvcnQpCit7CisgICAgcmV0dXJuIGNwdV9pbncocG9ydCk7Cit9CisKK3ZvaWQgaGVscGVyX291dGwodWludDMyX3QgcG9ydCwgdWludDMyX3QgZGF0YSkKK3sKKyAgICBjcHVfb3V0bChwb3J0LCBkYXRhKTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9pbmwodWludDMyX3QgcG9ydCkKK3sKKyAgICByZXR1cm4gY3B1X2lubChwb3J0KTsKK30KKwordm9pZCBoZWxwZXJfaW50byhDUFVYODZTdGF0ZSAqZW52LCBpbnQgbmV4dF9laXBfYWRkZW5kKQoreworICAgIGludCBlZmxhZ3M7CisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGlmIChlZmxhZ3MgJiBDQ19PKSB7CisgICAgICAgIHJhaXNlX2ludGVycnVwdChlbnYsIEVYQ1AwNF9JTlRPLCAxLCAwLCBuZXh0X2VpcF9hZGRlbmQpOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfc2luZ2xlX3N0ZXAoQ1BVWDg2U3RhdGUgKmVudikKK3sKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgIGNoZWNrX2h3X2JyZWFrcG9pbnRzKGVudiwgMSk7CisgICAgZW52LT5kcls2XSB8PSBEUjZfQlM7CisjZW5kaWYKKyAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMDFfREIpOworfQorCit2b2lkIGhlbHBlcl9jcHVpZChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHVpbnQzMl90IGVheCwgZWJ4LCBlY3gsIGVkeDsKKworICAgIGhlbHBlcl9zdm1fY2hlY2tfaW50ZXJjZXB0X3BhcmFtKGVudiwgU1ZNX0VYSVRfQ1BVSUQsIDApOworCisgICAgY3B1X3g4Nl9jcHVpZChlbnYsICh1aW50MzJfdClFQVgsICh1aW50MzJfdClFQ1gsICZlYXgsICZlYngsICZlY3gsICZlZHgpOworICAgIEVBWCA9IGVheDsKKyAgICBFQlggPSBlYng7CisgICAgRUNYID0gZWN4OworICAgIEVEWCA9IGVkeDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKK3RhcmdldF91bG9uZyBoZWxwZXJfcmVhZF9jck4oQ1BVWDg2U3RhdGUgKmVudiwgaW50IHJlZykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBoZWxwZXJfd3JpdGVfY3JOKENQVVg4NlN0YXRlICplbnYsIGludCByZWcsIHRhcmdldF91bG9uZyB0MCkKK3sKK30KKwordm9pZCBoZWxwZXJfbW92bF9kck5fVDAoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHJlZywgdGFyZ2V0X3Vsb25nIHQwKQoreworfQorI2Vsc2UKK3RhcmdldF91bG9uZyBoZWxwZXJfcmVhZF9jck4oQ1BVWDg2U3RhdGUgKmVudiwgaW50IHJlZykKK3sKKyAgICB0YXJnZXRfdWxvbmcgdmFsOworCisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9SRUFEX0NSMCArIHJlZywgMCk7CisgICAgc3dpdGNoKHJlZykgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHZhbCA9IGVudi0+Y3JbcmVnXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBpZiAoIShlbnYtPmhmbGFnczIgJiBIRjJfVklOVFJfTUFTSykpIHsKKyAgICAgICAgICAgIHZhbCA9IGNwdV9nZXRfYXBpY190cHIoZW52KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbCA9IGVudi0+dl90cHI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKK3ZvaWQgaGVscGVyX3dyaXRlX2NyTihDUFVYODZTdGF0ZSAqZW52LCBpbnQgcmVnLCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9XUklURV9DUjAgKyByZWcsIDApOworICAgIHN3aXRjaChyZWcpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGNwdV94ODZfdXBkYXRlX2NyMChlbnYsIHQwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBjcHVfeDg2X3VwZGF0ZV9jcjMoZW52LCB0MCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgY3B1X3g4Nl91cGRhdGVfY3I0KGVudiwgdDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGlmICghKGVudi0+aGZsYWdzMiAmIEhGMl9WSU5UUl9NQVNLKSkgeworICAgICAgICAgICAgY3B1X3NldF9hcGljX3RwcihlbnYsIHQwKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPnZfdHByID0gdDAgJiAweDBmOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBlbnYtPmNyW3JlZ10gPSB0MDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9tb3ZsX2RyTl9UMChDUFVYODZTdGF0ZSAqZW52LCBpbnQgcmVnLCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgaW50IGk7CisKKyAgICBpZiAocmVnIDwgNCkgeworICAgICAgICBod19icmVha3BvaW50X3JlbW92ZShlbnYsIHJlZyk7CisgICAgICAgIGVudi0+ZHJbcmVnXSA9IHQwOworICAgICAgICBod19icmVha3BvaW50X2luc2VydChlbnYsIHJlZyk7CisgICAgfSBlbHNlIGlmIChyZWcgPT0gNykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgaHdfYnJlYWtwb2ludF9yZW1vdmUoZW52LCBpKTsKKyAgICAgICAgZW52LT5kcls3XSA9IHQwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgaHdfYnJlYWtwb2ludF9pbnNlcnQoZW52LCBpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgZW52LT5kcltyZWddID0gdDA7Cit9CisjZW5kaWYKKwordm9pZCBoZWxwZXJfbG1zdyhDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdDApCit7CisgICAgLyogb25seSA0IGxvd2VyIGJpdHMgb2YgQ1IwIGFyZSBtb2RpZmllZC4gUEUgY2Fubm90IGJlIHNldCB0byB6ZXJvCisgICAgICAgaWYgYWxyZWFkeSBzZXQgdG8gb25lLiAqLworICAgIHQwID0gKGVudi0+Y3JbMF0gJiB+MHhlKSB8ICh0MCAmIDB4Zik7CisgICAgaGVscGVyX3dyaXRlX2NyTihlbnYsIDAsIHQwKTsKK30KKwordm9pZCBoZWxwZXJfaW52bHBnKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIGhlbHBlcl9zdm1fY2hlY2tfaW50ZXJjZXB0X3BhcmFtKGVudiwgU1ZNX0VYSVRfSU5WTFBHLCAwKTsKKyAgICB0bGJfZmx1c2hfcGFnZShlbnYsIGFkZHIpOworfQorCit2b2lkIGhlbHBlcl9yZHRzYyhDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHZhbDsKKworICAgIGlmICgoZW52LT5jcls0XSAmIENSNF9UU0RfTUFTSykgJiYgKChlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLKSAhPSAwKSkgeworICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMERfR1BGKTsKKyAgICB9CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9SRFRTQywgMCk7CisKKyAgICB2YWwgPSBjcHVfZ2V0X3RzYyhlbnYpICsgZW52LT50c2Nfb2Zmc2V0OworICAgIEVBWCA9ICh1aW50MzJfdCkodmFsKTsKKyAgICBFRFggPSAodWludDMyX3QpKHZhbCA+PiAzMik7Cit9CisKK3ZvaWQgaGVscGVyX3JkcG1jKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaWYgKChlbnYtPmNyWzRdICYgQ1I0X1BDRV9NQVNLKSAmJiAoKGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0spICE9IDApKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwRF9HUEYpOworICAgIH0KKyAgICBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShlbnYsIFNWTV9FWElUX1JEUE1DLCAwKTsKKworICAgIC8qIGN1cnJlbnRseSB1bmltcGxlbWVudGVkICovCisgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwNl9JTExPUCwgMCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIGhlbHBlcl93cm1zcihDUFVYODZTdGF0ZSAqZW52KQoreworfQorCit2b2lkIGhlbHBlcl9yZG1zcihDUFVYODZTdGF0ZSAqZW52KQoreworfQorI2Vsc2UKK3ZvaWQgaGVscGVyX3dybXNyKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgdWludDY0X3QgdmFsOworCisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9NU1IsIDEpOworCisgICAgdmFsID0gKCh1aW50MzJfdClFQVgpIHwgKCh1aW50NjRfdCkoKHVpbnQzMl90KUVEWCkgPDwgMzIpOworCisgICAgc3dpdGNoKCh1aW50MzJfdClFQ1gpIHsKKyAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorICAgICAgICBlbnYtPnN5c2VudGVyX2NzID0gdmFsICYgMHhmZmZmOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VTUDoKKyAgICAgICAgZW52LT5zeXNlbnRlcl9lc3AgPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRUlQOgorICAgICAgICBlbnYtPnN5c2VudGVyX2VpcCA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfSUEzMl9BUElDQkFTRToKKyAgICAgICAgY3B1X3NldF9hcGljX2Jhc2UoZW52LCB2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9FRkVSOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50NjRfdCB1cGRhdGVfbWFzazsKKyAgICAgICAgICAgIHVwZGF0ZV9tYXNrID0gMDsKKyAgICAgICAgICAgIGlmIChlbnYtPmNwdWlkX2V4dDJfZmVhdHVyZXMgJiBDUFVJRF9FWFQyX1NZU0NBTEwpCisgICAgICAgICAgICAgICAgdXBkYXRlX21hc2sgfD0gTVNSX0VGRVJfU0NFOworICAgICAgICAgICAgaWYgKGVudi0+Y3B1aWRfZXh0Ml9mZWF0dXJlcyAmIENQVUlEX0VYVDJfTE0pCisgICAgICAgICAgICAgICAgdXBkYXRlX21hc2sgfD0gTVNSX0VGRVJfTE1FOworICAgICAgICAgICAgaWYgKGVudi0+Y3B1aWRfZXh0Ml9mZWF0dXJlcyAmIENQVUlEX0VYVDJfRkZYU1IpCisgICAgICAgICAgICAgICAgdXBkYXRlX21hc2sgfD0gTVNSX0VGRVJfRkZYU1I7CisgICAgICAgICAgICBpZiAoZW52LT5jcHVpZF9leHQyX2ZlYXR1cmVzICYgQ1BVSURfRVhUMl9OWCkKKyAgICAgICAgICAgICAgICB1cGRhdGVfbWFzayB8PSBNU1JfRUZFUl9OWEU7CisgICAgICAgICAgICBpZiAoZW52LT5jcHVpZF9leHQzX2ZlYXR1cmVzICYgQ1BVSURfRVhUM19TVk0pCisgICAgICAgICAgICAgICAgdXBkYXRlX21hc2sgfD0gTVNSX0VGRVJfU1ZNRTsKKyAgICAgICAgICAgIGlmIChlbnYtPmNwdWlkX2V4dDJfZmVhdHVyZXMgJiBDUFVJRF9FWFQyX0ZGWFNSKQorICAgICAgICAgICAgICAgIHVwZGF0ZV9tYXNrIHw9IE1TUl9FRkVSX0ZGWFNSOworICAgICAgICAgICAgY3B1X2xvYWRfZWZlcihlbnYsIChlbnYtPmVmZXIgJiB+dXBkYXRlX21hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbCAmIHVwZGF0ZV9tYXNrKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfU1RBUjoKKyAgICAgICAgZW52LT5zdGFyID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9QQVQ6CisgICAgICAgIGVudi0+cGF0ID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9WTV9IU0FWRV9QQToKKyAgICAgICAgZW52LT52bV9oc2F2ZSA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNhc2UgTVNSX0xTVEFSOgorICAgICAgICBlbnYtPmxzdGFyID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9DU1RBUjoKKyAgICAgICAgZW52LT5jc3RhciA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfRk1BU0s6CisgICAgICAgIGVudi0+Zm1hc2sgPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0ZTQkFTRToKKyAgICAgICAgZW52LT5zZWdzW1JfRlNdLmJhc2UgPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0dTQkFTRToKKyAgICAgICAgZW52LT5zZWdzW1JfR1NdLmJhc2UgPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0tFUk5FTEdTQkFTRToKKyAgICAgICAgZW52LT5rZXJuZWxnc2Jhc2UgPSB2YWw7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBNU1JfTVRSUnBoeXNCYXNlKDApOgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSgxKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c0Jhc2UoMik6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNCYXNlKDMpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSg0KToKKyAgICBjYXNlIE1TUl9NVFJScGh5c0Jhc2UoNSk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNCYXNlKDYpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSg3KToKKyAgICAgICAgZW52LT5tdHJyX3ZhclsoKHVpbnQzMl90KUVDWCAtIE1TUl9NVFJScGh5c0Jhc2UoMCkpIC8gMl0uYmFzZSA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfTVRSUnBoeXNNYXNrKDApOgorICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzaygxKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c01hc2soMik6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNNYXNrKDMpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzayg0KToKKyAgICBjYXNlIE1TUl9NVFJScGh5c01hc2soNSk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNNYXNrKDYpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzayg3KToKKyAgICAgICAgZW52LT5tdHJyX3ZhclsoKHVpbnQzMl90KUVDWCAtIE1TUl9NVFJScGh5c01hc2soMCkpIC8gMl0ubWFzayA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfTVRSUmZpeDY0S18wMDAwMDoKKyAgICAgICAgZW52LT5tdHJyX2ZpeGVkWyh1aW50MzJfdClFQ1ggLSBNU1JfTVRSUmZpeDY0S18wMDAwMF0gPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01UUlJmaXgxNktfODAwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDE2S19BMDAwMDoKKyAgICAgICAgZW52LT5tdHJyX2ZpeGVkWyh1aW50MzJfdClFQ1ggLSBNU1JfTVRSUmZpeDE2S184MDAwMCArIDFdID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfQzAwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDRLX0M4MDAwOgorICAgIGNhc2UgTVNSX01UUlJmaXg0S19EMDAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfRDgwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDRLX0UwMDAwOgorICAgIGNhc2UgTVNSX01UUlJmaXg0S19FODAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfRjAwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDRLX0Y4MDAwOgorICAgICAgICBlbnYtPm10cnJfZml4ZWRbKHVpbnQzMl90KUVDWCAtIE1TUl9NVFJSZml4NEtfQzAwMDAgKyAzXSA9IHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfTVRSUmRlZlR5cGU6CisgICAgICAgIGVudi0+bXRycl9kZWZ0eXBlID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9NQ0dfU1RBVFVTOgorICAgICAgICBlbnYtPm1jZ19zdGF0dXMgPSB2YWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01DR19DVEw6CisgICAgICAgIGlmICgoZW52LT5tY2dfY2FwICYgTUNHX0NUTF9QKQorICAgICAgICAgICAgJiYgKHZhbCA9PSAwIHx8IHZhbCA9PSB+KHVpbnQ2NF90KTApKQorICAgICAgICAgICAgZW52LT5tY2dfY3RsID0gdmFsOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBpZiAoKHVpbnQzMl90KUVDWCA+PSBNU1JfTUMwX0NUTAorICAgICAgICAgICAgJiYgKHVpbnQzMl90KUVDWCA8IE1TUl9NQzBfQ1RMICsgKDQgKiBlbnYtPm1jZ19jYXAgJiAweGZmKSkgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gKHVpbnQzMl90KUVDWCAtIE1TUl9NQzBfQ1RMOworICAgICAgICAgICAgaWYgKChvZmZzZXQgJiAweDMpICE9IDAKKyAgICAgICAgICAgICAgICB8fCAodmFsID09IDAgfHwgdmFsID09IH4odWludDY0X3QpMCkpCisgICAgICAgICAgICAgICAgZW52LT5tY2VfYmFua3Nbb2Zmc2V0XSA9IHZhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIFhYWDogZXhjZXB0aW9uID8gKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9yZG1zcihDUFVYODZTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHZhbDsKKworICAgIGhlbHBlcl9zdm1fY2hlY2tfaW50ZXJjZXB0X3BhcmFtKGVudiwgU1ZNX0VYSVRfTVNSLCAwKTsKKworICAgIHN3aXRjaCgodWludDMyX3QpRUNYKSB7CisgICAgY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9DUzoKKyAgICAgICAgdmFsID0gZW52LT5zeXNlbnRlcl9jczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9FU1A6CisgICAgICAgIHZhbCA9IGVudi0+c3lzZW50ZXJfZXNwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VJUDoKKyAgICAgICAgdmFsID0gZW52LT5zeXNlbnRlcl9laXA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0lBMzJfQVBJQ0JBU0U6CisgICAgICAgIHZhbCA9IGNwdV9nZXRfYXBpY19iYXNlKGVudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0VGRVI6CisgICAgICAgIHZhbCA9IGVudi0+ZWZlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfU1RBUjoKKyAgICAgICAgdmFsID0gZW52LT5zdGFyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9QQVQ6CisgICAgICAgIHZhbCA9IGVudi0+cGF0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9WTV9IU0FWRV9QQToKKyAgICAgICAgdmFsID0gZW52LT52bV9oc2F2ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfSUEzMl9QRVJGX1NUQVRVUzoKKyAgICAgICAgLyogdHNjX2luY3JlbWVudF9ieV90aWNrICovCisgICAgICAgIHZhbCA9IDEwMDBVTEw7CisgICAgICAgIC8qIENQVSBtdWx0aXBsaWVyICovCisgICAgICAgIHZhbCB8PSAoKCh1aW50NjRfdCk0VUxMKSA8PCA0MCk7CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBjYXNlIE1TUl9MU1RBUjoKKyAgICAgICAgdmFsID0gZW52LT5sc3RhcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfQ1NUQVI6CisgICAgICAgIHZhbCA9IGVudi0+Y3N0YXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX0ZNQVNLOgorICAgICAgICB2YWwgPSBlbnYtPmZtYXNrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9GU0JBU0U6CisgICAgICAgIHZhbCA9IGVudi0+c2Vnc1tSX0ZTXS5iYXNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9HU0JBU0U6CisgICAgICAgIHZhbCA9IGVudi0+c2Vnc1tSX0dTXS5iYXNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9LRVJORUxHU0JBU0U6CisgICAgICAgIHZhbCA9IGVudi0+a2VybmVsZ3NiYXNlOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSgwKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c0Jhc2UoMSk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNCYXNlKDIpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSgzKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c0Jhc2UoNCk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNCYXNlKDUpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzQmFzZSg2KToKKyAgICBjYXNlIE1TUl9NVFJScGh5c0Jhc2UoNyk6CisgICAgICAgIHZhbCA9IGVudi0+bXRycl92YXJbKCh1aW50MzJfdClFQ1ggLSBNU1JfTVRSUnBoeXNCYXNlKDApKSAvIDJdLmJhc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzaygwKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c01hc2soMSk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNNYXNrKDIpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzaygzKToKKyAgICBjYXNlIE1TUl9NVFJScGh5c01hc2soNCk6CisgICAgY2FzZSBNU1JfTVRSUnBoeXNNYXNrKDUpOgorICAgIGNhc2UgTVNSX01UUlJwaHlzTWFzayg2KToKKyAgICBjYXNlIE1TUl9NVFJScGh5c01hc2soNyk6CisgICAgICAgIHZhbCA9IGVudi0+bXRycl92YXJbKCh1aW50MzJfdClFQ1ggLSBNU1JfTVRSUnBoeXNNYXNrKDApKSAvIDJdLm1hc2s7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01UUlJmaXg2NEtfMDAwMDA6CisgICAgICAgIHZhbCA9IGVudi0+bXRycl9maXhlZFswXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNU1JfTVRSUmZpeDE2S184MDAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4MTZLX0EwMDAwOgorICAgICAgICB2YWwgPSBlbnYtPm10cnJfZml4ZWRbKHVpbnQzMl90KUVDWCAtIE1TUl9NVFJSZml4MTZLXzgwMDAwICsgMV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01UUlJmaXg0S19DMDAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfQzgwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDRLX0QwMDAwOgorICAgIGNhc2UgTVNSX01UUlJmaXg0S19EODAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfRTAwMDA6CisgICAgY2FzZSBNU1JfTVRSUmZpeDRLX0U4MDAwOgorICAgIGNhc2UgTVNSX01UUlJmaXg0S19GMDAwMDoKKyAgICBjYXNlIE1TUl9NVFJSZml4NEtfRjgwMDA6CisgICAgICAgIHZhbCA9IGVudi0+bXRycl9maXhlZFsodWludDMyX3QpRUNYIC0gTVNSX01UUlJmaXg0S19DMDAwMCArIDNdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9NVFJSZGVmVHlwZToKKyAgICAgICAgdmFsID0gZW52LT5tdHJyX2RlZnR5cGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01UUlJjYXA6CisgICAgICAgIGlmIChlbnYtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfTVRSUikKKyAgICAgICAgICAgIHZhbCA9IE1TUl9NVFJSY2FwX1ZDTlQgfCBNU1JfTVRSUmNhcF9GSVhSQU5HRV9TVVBQT1JUIHwgTVNSX01UUlJjYXBfV0NfU1VQUE9SVEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBYWFg6IGV4Y2VwdGlvbiA/ICovCisgICAgICAgICAgICB2YWwgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1TUl9NQ0dfQ0FQOgorICAgICAgICB2YWwgPSBlbnYtPm1jZ19jYXA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01DR19DVEw6CisgICAgICAgIGlmIChlbnYtPm1jZ19jYXAgJiBNQ0dfQ1RMX1ApCisgICAgICAgICAgICB2YWwgPSBlbnYtPm1jZ19jdGw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVNSX01DR19TVEFUVVM6CisgICAgICAgIHZhbCA9IGVudi0+bWNnX3N0YXR1czsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCh1aW50MzJfdClFQ1ggPj0gTVNSX01DMF9DVEwKKyAgICAgICAgICAgICYmICh1aW50MzJfdClFQ1ggPCBNU1JfTUMwX0NUTCArICg0ICogZW52LT5tY2dfY2FwICYgMHhmZikpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCA9ICh1aW50MzJfdClFQ1ggLSBNU1JfTUMwX0NUTDsKKyAgICAgICAgICAgIHZhbCA9IGVudi0+bWNlX2JhbmtzW29mZnNldF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBYWFg6IGV4Y2VwdGlvbiA/ICovCisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBFQVggPSAodWludDMyX3QpKHZhbCk7CisgICAgRURYID0gKHVpbnQzMl90KSh2YWwgPj4gMzIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRvX2hsdChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGVudi0+aGZsYWdzICY9IH5IRl9JTkhJQklUX0lSUV9NQVNLOyAvKiBuZWVkZWQgaWYgc3RpIGlzIGp1c3QgYmVmb3JlICovCisgICAgRU5WX0dFVF9DUFUoZW52KS0+aGFsdGVkID0gMTsKKyAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IEVYQ1BfSExUOworICAgIGNwdV9sb29wX2V4aXQoZW52KTsKK30KKwordm9pZCBoZWxwZXJfaGx0KENQVVg4NlN0YXRlICplbnYsIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9ITFQsIDApOworICAgIEVJUCArPSBuZXh0X2VpcF9hZGRlbmQ7CisKKyAgICBkb19obHQoZW52KTsKK30KKwordm9pZCBoZWxwZXJfbW9uaXRvcihDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgcHRyKQoreworICAgIGlmICgodWludDMyX3QpRUNYICE9IDApCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1AwRF9HUEYpOworICAgIC8qIFhYWDogc3RvcmUgYWRkcmVzcyA/ICovCisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9NT05JVE9SLCAwKTsKK30KKwordm9pZCBoZWxwZXJfbXdhaXQoQ1BVWDg2U3RhdGUgKmVudiwgaW50IG5leHRfZWlwX2FkZGVuZCkKK3sKKyAgICBpZiAoKHVpbnQzMl90KUVDWCAhPSAwKQorICAgICAgICByYWlzZV9leGNlcHRpb24oZW52LCBFWENQMERfR1BGKTsKKyAgICBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShlbnYsIFNWTV9FWElUX01XQUlULCAwKTsKKyAgICBFSVAgKz0gbmV4dF9laXBfYWRkZW5kOworCisgICAgLyogWFhYOiBub3QgY29tcGxldGUgYnV0IG5vdCBjb21wbGV0ZWx5IGVycm9uZW91cyAqLworICAgIENQVVN0YXRlICpjcHUgPSBFTlZfR0VUX0NQVShlbnYpOworICAgIGlmIChjcHUtPmNwdV9pbmRleCAhPSAwIHx8IFFUQUlMUV9ORVhUKGNwdSwgbm9kZSkgIT0gTlVMTCkgeworICAgICAgICAvKiBtb3JlIHRoYW4gb25lIENQVTogZG8gbm90IHNsZWVwIGJlY2F1c2UgYW5vdGhlciBDUFUgbWF5CisgICAgICAgICAgIHdha2UgdGhpcyBvbmUgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBkb19obHQoZW52KTsKKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX2RlYnVnKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX0RFQlVHOworICAgIGNwdV9sb29wX2V4aXQoZW52KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvb3BzX3NzZS5oIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9vcHNfc3NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwN2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvb3BzX3NzZS5oCkBAIC0wLDAgKzEsMjMwNCBAQAorLyoKKyAqICBNTVgvM0ROb3chL1NTRS9TU0UyL1NTRTMvU1NTRTMvU1NFNC9QTkkgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgRmFicmljZSBCZWxsYXJkCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEludGVsIENvcnBvcmF0aW9uICA8YW5kcmV3LnphYm9yb3dza2lAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmIFNISUZUID09IDAKKyNkZWZpbmUgUmVnIE1NWFJlZworI2RlZmluZSBYTU1fT05MWSguLi4pCisjZGVmaW5lIEIobikgTU1YX0IobikKKyNkZWZpbmUgVyhuKSBNTVhfVyhuKQorI2RlZmluZSBMKG4pIE1NWF9MKG4pCisjZGVmaW5lIFEobikgcQorI2RlZmluZSBTVUZGSVggX21teAorI2Vsc2UKKyNkZWZpbmUgUmVnIFhNTVJlZworI2RlZmluZSBYTU1fT05MWSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIEIobikgWE1NX0IobikKKyNkZWZpbmUgVyhuKSBYTU1fVyhuKQorI2RlZmluZSBMKG4pIFhNTV9MKG4pCisjZGVmaW5lIFEobikgWE1NX1EobikKKyNkZWZpbmUgU1VGRklYIF94bW0KKyNlbmRpZgorCisjaW5jbHVkZSAicWVtdS9hZXMuaCIKKwordm9pZCBnbHVlKGhlbHBlcl9wc3JsdywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgc2hpZnQ7CisKKyAgICBpZiAocy0+USgwKSA+IDE1KSB7CisgICAgICAgIGQtPlEoMCkgPSAwOworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+USgxKSA9IDA7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA9IHMtPkIoMCk7CisgICAgICAgIGQtPlcoMCkgPj49IHNoaWZ0OworICAgICAgICBkLT5XKDEpID4+PSBzaGlmdDsKKyAgICAgICAgZC0+VygyKSA+Pj0gc2hpZnQ7CisgICAgICAgIGQtPlcoMykgPj49IHNoaWZ0OworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+Vyg0KSA+Pj0gc2hpZnQ7CisgICAgICAgIGQtPlcoNSkgPj49IHNoaWZ0OworICAgICAgICBkLT5XKDYpID4+PSBzaGlmdDsKKyAgICAgICAgZC0+Vyg3KSA+Pj0gc2hpZnQ7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcHNyYXcsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IHNoaWZ0OworCisgICAgaWYgKHMtPlEoMCkgPiAxNSkgeworICAgICAgICBzaGlmdCA9IDE1OworICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gcy0+QigwKTsKKyAgICB9CisgICAgZC0+VygwKSA9IChpbnQxNl90KWQtPlcoMCkgPj4gc2hpZnQ7CisgICAgZC0+VygxKSA9IChpbnQxNl90KWQtPlcoMSkgPj4gc2hpZnQ7CisgICAgZC0+VygyKSA9IChpbnQxNl90KWQtPlcoMikgPj4gc2hpZnQ7CisgICAgZC0+VygzKSA9IChpbnQxNl90KWQtPlcoMykgPj4gc2hpZnQ7CisjaWYgU0hJRlQgPT0gMQorICAgIGQtPlcoNCkgPSAoaW50MTZfdClkLT5XKDQpID4+IHNoaWZ0OworICAgIGQtPlcoNSkgPSAoaW50MTZfdClkLT5XKDUpID4+IHNoaWZ0OworICAgIGQtPlcoNikgPSAoaW50MTZfdClkLT5XKDYpID4+IHNoaWZ0OworICAgIGQtPlcoNykgPSAoaW50MTZfdClkLT5XKDcpID4+IHNoaWZ0OworI2VuZGlmCit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcHNsbHcsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IHNoaWZ0OworCisgICAgaWYgKHMtPlEoMCkgPiAxNSkgeworICAgICAgICBkLT5RKDApID0gMDsKKyNpZiBTSElGVCA9PSAxCisgICAgICAgIGQtPlEoMSkgPSAwOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnQgPSBzLT5CKDApOworICAgICAgICBkLT5XKDApIDw8PSBzaGlmdDsKKyAgICAgICAgZC0+VygxKSA8PD0gc2hpZnQ7CisgICAgICAgIGQtPlcoMikgPDw9IHNoaWZ0OworICAgICAgICBkLT5XKDMpIDw8PSBzaGlmdDsKKyNpZiBTSElGVCA9PSAxCisgICAgICAgIGQtPlcoNCkgPDw9IHNoaWZ0OworICAgICAgICBkLT5XKDUpIDw8PSBzaGlmdDsKKyAgICAgICAgZC0+Vyg2KSA8PD0gc2hpZnQ7CisgICAgICAgIGQtPlcoNykgPDw9IHNoaWZ0OworI2VuZGlmCisgICAgfQorfQorCit2b2lkIGdsdWUoaGVscGVyX3BzcmxkLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCBzaGlmdDsKKworICAgIGlmIChzLT5RKDApID4gMzEpIHsKKyAgICAgICAgZC0+USgwKSA9IDA7CisjaWYgU0hJRlQgPT0gMQorICAgICAgICBkLT5RKDEpID0gMDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gcy0+QigwKTsKKyAgICAgICAgZC0+TCgwKSA+Pj0gc2hpZnQ7CisgICAgICAgIGQtPkwoMSkgPj49IHNoaWZ0OworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+TCgyKSA+Pj0gc2hpZnQ7CisgICAgICAgIGQtPkwoMykgPj49IHNoaWZ0OworI2VuZGlmCisgICAgfQorfQorCit2b2lkIGdsdWUoaGVscGVyX3BzcmFkLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCBzaGlmdDsKKworICAgIGlmIChzLT5RKDApID4gMzEpIHsKKyAgICAgICAgc2hpZnQgPSAzMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA9IHMtPkIoMCk7CisgICAgfQorICAgIGQtPkwoMCkgPSAoaW50MzJfdClkLT5MKDApID4+IHNoaWZ0OworICAgIGQtPkwoMSkgPSAoaW50MzJfdClkLT5MKDEpID4+IHNoaWZ0OworI2lmIFNISUZUID09IDEKKyAgICBkLT5MKDIpID0gKGludDMyX3QpZC0+TCgyKSA+PiBzaGlmdDsKKyAgICBkLT5MKDMpID0gKGludDMyX3QpZC0+TCgzKSA+PiBzaGlmdDsKKyNlbmRpZgorfQorCit2b2lkIGdsdWUoaGVscGVyX3BzbGxkLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCBzaGlmdDsKKworICAgIGlmIChzLT5RKDApID4gMzEpIHsKKyAgICAgICAgZC0+USgwKSA9IDA7CisjaWYgU0hJRlQgPT0gMQorICAgICAgICBkLT5RKDEpID0gMDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gcy0+QigwKTsKKyAgICAgICAgZC0+TCgwKSA8PD0gc2hpZnQ7CisgICAgICAgIGQtPkwoMSkgPDw9IHNoaWZ0OworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+TCgyKSA8PD0gc2hpZnQ7CisgICAgICAgIGQtPkwoMykgPDw9IHNoaWZ0OworI2VuZGlmCisgICAgfQorfQorCit2b2lkIGdsdWUoaGVscGVyX3BzcmxxLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCBzaGlmdDsKKworICAgIGlmIChzLT5RKDApID4gNjMpIHsKKyAgICAgICAgZC0+USgwKSA9IDA7CisjaWYgU0hJRlQgPT0gMQorICAgICAgICBkLT5RKDEpID0gMDsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gcy0+QigwKTsKKyAgICAgICAgZC0+USgwKSA+Pj0gc2hpZnQ7CisjaWYgU0hJRlQgPT0gMQorICAgICAgICBkLT5RKDEpID4+PSBzaGlmdDsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9wc2xscSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgc2hpZnQ7CisKKyAgICBpZiAocy0+USgwKSA+IDYzKSB7CisgICAgICAgIGQtPlEoMCkgPSAwOworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+USgxKSA9IDA7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA9IHMtPkIoMCk7CisgICAgICAgIGQtPlEoMCkgPDw9IHNoaWZ0OworI2lmIFNISUZUID09IDEKKyAgICAgICAgZC0+USgxKSA8PD0gc2hpZnQ7CisjZW5kaWYKKyAgICB9Cit9CisKKyNpZiBTSElGVCA9PSAxCit2b2lkIGdsdWUoaGVscGVyX3BzcmxkcSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgc2hpZnQsIGk7CisKKyAgICBzaGlmdCA9IHMtPkwoMCk7CisgICAgaWYgKHNoaWZ0ID4gMTYpIHsKKyAgICAgICAgc2hpZnQgPSAxNjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDE2IC0gc2hpZnQ7IGkrKykgeworICAgICAgICBkLT5CKGkpID0gZC0+QihpICsgc2hpZnQpOworICAgIH0KKyAgICBmb3IgKGkgPSAxNiAtIHNoaWZ0OyBpIDwgMTY7IGkrKykgeworICAgICAgICBkLT5CKGkpID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcHNsbGRxLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCBzaGlmdCwgaTsKKworICAgIHNoaWZ0ID0gcy0+TCgwKTsKKyAgICBpZiAoc2hpZnQgPiAxNikgeworICAgICAgICBzaGlmdCA9IDE2OworICAgIH0KKyAgICBmb3IgKGkgPSAxNTsgaSA+PSBzaGlmdDsgaS0tKSB7CisgICAgICAgIGQtPkIoaSkgPSBkLT5CKGkgLSBzaGlmdCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzaGlmdDsgaSsrKSB7CisgICAgICAgIGQtPkIoaSkgPSAwOworICAgIH0KK30KKyNlbmRpZgorCisjZGVmaW5lIFNTRV9IRUxQRVJfQihuYW1lLCBGKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZ2x1ZShuYW1lLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPkIoMCkgPSBGKGQtPkIoMCksIHMtPkIoMCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5CKDEpID0gRihkLT5CKDEpLCBzLT5CKDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZC0+QigyKSA9IEYoZC0+QigyKSwgcy0+QigyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPkIoMykgPSBGKGQtPkIoMyksIHMtPkIoMykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5CKDQpID0gRihkLT5CKDQpLCBzLT5CKDQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZC0+Qig1KSA9IEYoZC0+Qig1KSwgcy0+Qig1KSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPkIoNikgPSBGKGQtPkIoNiksIHMtPkIoNikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5CKDcpID0gRihkLT5CKDcpLCBzLT5CKDcpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgWE1NX09OTFkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPkIoOCkgPSBGKGQtPkIoOCksIHMtPkIoOCkpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBkLT5CKDkpID0gRihkLT5CKDkpLCBzLT5CKDkpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZC0+QigxMCkgPSBGKGQtPkIoMTApLCBzLT5CKDEwKSk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPkIoMTEpID0gRihkLT5CKDExKSwgcy0+QigxMSkpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBkLT5CKDEyKSA9IEYoZC0+QigxMiksIHMtPkIoMTIpKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZC0+QigxMykgPSBGKGQtPkIoMTMpLCBzLT5CKDEzKSk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPkIoMTQpID0gRihkLT5CKDE0KSwgcy0+QigxNCkpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBkLT5CKDE1KSA9IEYoZC0+QigxNSksIHMtPkIoMTUpKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgU1NFX0hFTFBFUl9XKG5hbWUsIEYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBnbHVlKG5hbWUsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZC0+VygwKSA9IEYoZC0+VygwKSwgcy0+VygwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPlcoMSkgPSBGKGQtPlcoMSksIHMtPlcoMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5XKDIpID0gRihkLT5XKDIpLCBzLT5XKDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZC0+VygzKSA9IEYoZC0+VygzKSwgcy0+VygzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFhNTV9PTkxZKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBkLT5XKDQpID0gRihkLT5XKDQpLCBzLT5XKDQpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZC0+Vyg1KSA9IEYoZC0+Vyg1KSwgcy0+Vyg1KSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPlcoNikgPSBGKGQtPlcoNiksIHMtPlcoNikpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBkLT5XKDcpID0gRihkLT5XKDcpLCBzLT5XKDcpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgU1NFX0hFTFBFUl9MKG5hbWUsIEYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBnbHVlKG5hbWUsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZC0+TCgwKSA9IEYoZC0+TCgwKSwgcy0+TCgwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPkwoMSkgPSBGKGQtPkwoMSksIHMtPkwoMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBYTU1fT05MWSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgZC0+TCgyKSA9IEYoZC0+TCgyKSwgcy0+TCgyKSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPkwoMykgPSBGKGQtPkwoMyksIHMtPkwoMykpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2RlZmluZSBTU0VfSEVMUEVSX1EobmFtZSwgRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIGdsdWUobmFtZSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5RKDApID0gRihkLT5RKDApLCBzLT5RKDApKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgWE1NX09OTFkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGQtPlEoMSkgPSBGKGQtPlEoMSksIHMtPlEoMSkpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgIFwKKyAgICAgICAgICAgIH0KKworI2lmIFNISUZUID09IDAKK3N0YXRpYyBpbmxpbmUgaW50IHNhdHViKGludCB4KQoreworICAgIGlmICh4IDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKHggPiAyNTUpIHsKKyAgICAgICAgcmV0dXJuIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4geDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNhdHV3KGludCB4KQoreworICAgIGlmICh4IDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKHggPiA2NTUzNSkgeworICAgICAgICByZXR1cm4gNjU1MzU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBzYXRzYihpbnQgeCkKK3sKKyAgICBpZiAoeCA8IC0xMjgpIHsKKyAgICAgICAgcmV0dXJuIC0xMjg7CisgICAgfSBlbHNlIGlmICh4ID4gMTI3KSB7CisgICAgICAgIHJldHVybiAxMjc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBzYXRzdyhpbnQgeCkKK3sKKyAgICBpZiAoeCA8IC0zMjc2OCkgeworICAgICAgICByZXR1cm4gLTMyNzY4OworICAgIH0gZWxzZSBpZiAoeCA+IDMyNzY3KSB7CisgICAgICAgIHJldHVybiAzMjc2NzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4geDsKKyAgICB9Cit9CisKKyNkZWZpbmUgRkFERChhLCBiKSAoKGEpICsgKGIpKQorI2RlZmluZSBGQUREVUIoYSwgYikgc2F0dWIoKGEpICsgKGIpKQorI2RlZmluZSBGQUREVVcoYSwgYikgc2F0dXcoKGEpICsgKGIpKQorI2RlZmluZSBGQUREU0IoYSwgYikgc2F0c2IoKGludDhfdCkoYSkgKyAoaW50OF90KShiKSkKKyNkZWZpbmUgRkFERFNXKGEsIGIpIHNhdHN3KChpbnQxNl90KShhKSArIChpbnQxNl90KShiKSkKKworI2RlZmluZSBGU1VCKGEsIGIpICgoYSkgLSAoYikpCisjZGVmaW5lIEZTVUJVQihhLCBiKSBzYXR1YigoYSkgLSAoYikpCisjZGVmaW5lIEZTVUJVVyhhLCBiKSBzYXR1dygoYSkgLSAoYikpCisjZGVmaW5lIEZTVUJTQihhLCBiKSBzYXRzYigoaW50OF90KShhKSAtIChpbnQ4X3QpKGIpKQorI2RlZmluZSBGU1VCU1coYSwgYikgc2F0c3coKGludDE2X3QpKGEpIC0gKGludDE2X3QpKGIpKQorI2RlZmluZSBGTUlOVUIoYSwgYikgKChhKSA8IChiKSkgPyAoYSkgOiAoYikKKyNkZWZpbmUgRk1JTlNXKGEsIGIpICgoaW50MTZfdCkoYSkgPCAoaW50MTZfdCkoYikpID8gKGEpIDogKGIpCisjZGVmaW5lIEZNQVhVQihhLCBiKSAoKGEpID4gKGIpKSA/IChhKSA6IChiKQorI2RlZmluZSBGTUFYU1coYSwgYikgKChpbnQxNl90KShhKSA+IChpbnQxNl90KShiKSkgPyAoYSkgOiAoYikKKworI2RlZmluZSBGQU5EKGEsIGIpICgoYSkgJiAoYikpCisjZGVmaW5lIEZBTkROKGEsIGIpICgofihhKSkgJiAoYikpCisjZGVmaW5lIEZPUihhLCBiKSAoKGEpIHwgKGIpKQorI2RlZmluZSBGWE9SKGEsIGIpICgoYSkgXiAoYikpCisKKyNkZWZpbmUgRkNNUEdUQihhLCBiKSAoKGludDhfdCkoYSkgPiAoaW50OF90KShiKSA/IC0xIDogMCkKKyNkZWZpbmUgRkNNUEdUVyhhLCBiKSAoKGludDE2X3QpKGEpID4gKGludDE2X3QpKGIpID8gLTEgOiAwKQorI2RlZmluZSBGQ01QR1RMKGEsIGIpICgoaW50MzJfdCkoYSkgPiAoaW50MzJfdCkoYikgPyAtMSA6IDApCisjZGVmaW5lIEZDTVBFUShhLCBiKSAoKGEpID09IChiKSA/IC0xIDogMCkKKworI2RlZmluZSBGTVVMTFcoYSwgYikgKChhKSAqIChiKSkKKyNkZWZpbmUgRk1VTEhSVyhhLCBiKSAoKChpbnQxNl90KShhKSAqIChpbnQxNl90KShiKSArIDB4ODAwMCkgPj4gMTYpCisjZGVmaW5lIEZNVUxIVVcoYSwgYikgKChhKSAqIChiKSA+PiAxNikKKyNkZWZpbmUgRk1VTEhXKGEsIGIpICgoaW50MTZfdCkoYSkgKiAoaW50MTZfdCkoYikgPj4gMTYpCisKKyNkZWZpbmUgRkFWRyhhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCisjZW5kaWYKKworU1NFX0hFTFBFUl9CKGhlbHBlcl9wYWRkYiwgRkFERCkKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcGFkZHcsIEZBREQpCitTU0VfSEVMUEVSX0woaGVscGVyX3BhZGRsLCBGQUREKQorU1NFX0hFTFBFUl9RKGhlbHBlcl9wYWRkcSwgRkFERCkKKworU1NFX0hFTFBFUl9CKGhlbHBlcl9wc3ViYiwgRlNVQikKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcHN1YncsIEZTVUIpCitTU0VfSEVMUEVSX0woaGVscGVyX3BzdWJsLCBGU1VCKQorU1NFX0hFTFBFUl9RKGhlbHBlcl9wc3VicSwgRlNVQikKKworU1NFX0hFTFBFUl9CKGhlbHBlcl9wYWRkdXNiLCBGQUREVUIpCitTU0VfSEVMUEVSX0IoaGVscGVyX3BhZGRzYiwgRkFERFNCKQorU1NFX0hFTFBFUl9CKGhlbHBlcl9wc3VidXNiLCBGU1VCVUIpCitTU0VfSEVMUEVSX0IoaGVscGVyX3BzdWJzYiwgRlNVQlNCKQorCitTU0VfSEVMUEVSX1coaGVscGVyX3BhZGR1c3csIEZBRERVVykKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcGFkZHN3LCBGQUREU1cpCitTU0VfSEVMUEVSX1coaGVscGVyX3BzdWJ1c3csIEZTVUJVVykKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcHN1YnN3LCBGU1VCU1cpCisKK1NTRV9IRUxQRVJfQihoZWxwZXJfcG1pbnViLCBGTUlOVUIpCitTU0VfSEVMUEVSX0IoaGVscGVyX3BtYXh1YiwgRk1BWFVCKQorCitTU0VfSEVMUEVSX1coaGVscGVyX3BtaW5zdywgRk1JTlNXKQorU1NFX0hFTFBFUl9XKGhlbHBlcl9wbWF4c3csIEZNQVhTVykKKworU1NFX0hFTFBFUl9RKGhlbHBlcl9wYW5kLCBGQU5EKQorU1NFX0hFTFBFUl9RKGhlbHBlcl9wYW5kbiwgRkFORE4pCitTU0VfSEVMUEVSX1EoaGVscGVyX3BvciwgRk9SKQorU1NFX0hFTFBFUl9RKGhlbHBlcl9weG9yLCBGWE9SKQorCitTU0VfSEVMUEVSX0IoaGVscGVyX3BjbXBndGIsIEZDTVBHVEIpCitTU0VfSEVMUEVSX1coaGVscGVyX3BjbXBndHcsIEZDTVBHVFcpCitTU0VfSEVMUEVSX0woaGVscGVyX3BjbXBndGwsIEZDTVBHVEwpCisKK1NTRV9IRUxQRVJfQihoZWxwZXJfcGNtcGVxYiwgRkNNUEVRKQorU1NFX0hFTFBFUl9XKGhlbHBlcl9wY21wZXF3LCBGQ01QRVEpCitTU0VfSEVMUEVSX0woaGVscGVyX3BjbXBlcWwsIEZDTVBFUSkKKworU1NFX0hFTFBFUl9XKGhlbHBlcl9wbXVsbHcsIEZNVUxMVykKKyNpZiBTSElGVCA9PSAwCitTU0VfSEVMUEVSX1coaGVscGVyX3BtdWxocncsIEZNVUxIUlcpCisjZW5kaWYKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcG11bGh1dywgRk1VTEhVVykKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcG11bGh3LCBGTVVMSFcpCisKK1NTRV9IRUxQRVJfQihoZWxwZXJfcGF2Z2IsIEZBVkcpCitTU0VfSEVMUEVSX1coaGVscGVyX3Bhdmd3LCBGQVZHKQorCit2b2lkIGdsdWUoaGVscGVyX3BtdWx1ZHEsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgZC0+USgwKSA9ICh1aW50NjRfdClzLT5MKDApICogKHVpbnQ2NF90KWQtPkwoMCk7CisjaWYgU0hJRlQgPT0gMQorICAgIGQtPlEoMSkgPSAodWludDY0X3Qpcy0+TCgyKSAqICh1aW50NjRfdClkLT5MKDIpOworI2VuZGlmCit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcG1hZGR3ZCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoMiA8PCBTSElGVCk7IGkrKykgeworICAgICAgICBkLT5MKGkpID0gKGludDE2X3Qpcy0+VygyICogaSkgKiAoaW50MTZfdClkLT5XKDIgKiBpKSArCisgICAgICAgICAgICAoaW50MTZfdClzLT5XKDIgKiBpICsgMSkgKiAoaW50MTZfdClkLT5XKDIgKiBpICsgMSk7CisgICAgfQorfQorCisjaWYgU0hJRlQgPT0gMAorc3RhdGljIGlubGluZSBpbnQgYWJzMShpbnQgYSkKK3sKKyAgICBpZiAoYSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1hOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0KK30KKyNlbmRpZgordm9pZCBnbHVlKGhlbHBlcl9wc2FkYncsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgdW5zaWduZWQgaW50IHZhbDsKKworICAgIHZhbCA9IDA7CisgICAgdmFsICs9IGFiczEoZC0+QigwKSAtIHMtPkIoMCkpOworICAgIHZhbCArPSBhYnMxKGQtPkIoMSkgLSBzLT5CKDEpKTsKKyAgICB2YWwgKz0gYWJzMShkLT5CKDIpIC0gcy0+QigyKSk7CisgICAgdmFsICs9IGFiczEoZC0+QigzKSAtIHMtPkIoMykpOworICAgIHZhbCArPSBhYnMxKGQtPkIoNCkgLSBzLT5CKDQpKTsKKyAgICB2YWwgKz0gYWJzMShkLT5CKDUpIC0gcy0+Qig1KSk7CisgICAgdmFsICs9IGFiczEoZC0+Qig2KSAtIHMtPkIoNikpOworICAgIHZhbCArPSBhYnMxKGQtPkIoNykgLSBzLT5CKDcpKTsKKyAgICBkLT5RKDApID0gdmFsOworI2lmIFNISUZUID09IDEKKyAgICB2YWwgPSAwOworICAgIHZhbCArPSBhYnMxKGQtPkIoOCkgLSBzLT5CKDgpKTsKKyAgICB2YWwgKz0gYWJzMShkLT5CKDkpIC0gcy0+Qig5KSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxMCkgLSBzLT5CKDEwKSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxMSkgLSBzLT5CKDExKSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxMikgLSBzLT5CKDEyKSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxMykgLSBzLT5CKDEzKSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxNCkgLSBzLT5CKDE0KSk7CisgICAgdmFsICs9IGFiczEoZC0+QigxNSkgLSBzLT5CKDE1KSk7CisgICAgZC0+USgxKSA9IHZhbDsKKyNlbmRpZgorfQorCit2b2lkIGdsdWUoaGVscGVyX21hc2ttb3YsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGEwKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8ICg4IDw8IFNISUZUKTsgaSsrKSB7CisgICAgICAgIGlmIChzLT5CKGkpICYgMHg4MCkgeworICAgICAgICAgICAgY3B1X3N0Yl9kYXRhKGVudiwgYTAgKyBpLCBkLT5CKGkpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9tb3ZsX21tX1QwLCBTVUZGSVgpKFJlZyAqZCwgdWludDMyX3QgdmFsKQoreworICAgIGQtPkwoMCkgPSB2YWw7CisgICAgZC0+TCgxKSA9IDA7CisjaWYgU0hJRlQgPT0gMQorICAgIGQtPlEoMSkgPSAwOworI2VuZGlmCit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0Cit2b2lkIGdsdWUoaGVscGVyX21vdnFfbW1fVDAsIFNVRkZJWCkoUmVnICpkLCB1aW50NjRfdCB2YWwpCit7CisgICAgZC0+USgwKSA9IHZhbDsKKyNpZiBTSElGVCA9PSAxCisgICAgZC0+USgxKSA9IDA7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgU0hJRlQgPT0gMAordm9pZCBnbHVlKGhlbHBlcl9wc2h1ZncsIFNVRkZJWCkoUmVnICpkLCBSZWcgKnMsIGludCBvcmRlcikKK3sKKyAgICBSZWcgcjsKKworICAgIHIuVygwKSA9IHMtPlcob3JkZXIgJiAzKTsKKyAgICByLlcoMSkgPSBzLT5XKChvcmRlciA+PiAyKSAmIDMpOworICAgIHIuVygyKSA9IHMtPlcoKG9yZGVyID4+IDQpICYgMyk7CisgICAgci5XKDMpID0gcy0+Vygob3JkZXIgPj4gNikgJiAzKTsKKyAgICAqZCA9IHI7Cit9CisjZWxzZQordm9pZCBoZWxwZXJfc2h1ZnBzKFJlZyAqZCwgUmVnICpzLCBpbnQgb3JkZXIpCit7CisgICAgUmVnIHI7CisKKyAgICByLkwoMCkgPSBkLT5MKG9yZGVyICYgMyk7CisgICAgci5MKDEpID0gZC0+TCgob3JkZXIgPj4gMikgJiAzKTsKKyAgICByLkwoMikgPSBzLT5MKChvcmRlciA+PiA0KSAmIDMpOworICAgIHIuTCgzKSA9IHMtPkwoKG9yZGVyID4+IDYpICYgMyk7CisgICAgKmQgPSByOworfQorCit2b2lkIGhlbHBlcl9zaHVmcGQoUmVnICpkLCBSZWcgKnMsIGludCBvcmRlcikKK3sKKyAgICBSZWcgcjsKKworICAgIHIuUSgwKSA9IGQtPlEob3JkZXIgJiAxKTsKKyAgICByLlEoMSkgPSBzLT5RKChvcmRlciA+PiAxKSAmIDEpOworICAgICpkID0gcjsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9wc2h1ZmQsIFNVRkZJWCkoUmVnICpkLCBSZWcgKnMsIGludCBvcmRlcikKK3sKKyAgICBSZWcgcjsKKworICAgIHIuTCgwKSA9IHMtPkwob3JkZXIgJiAzKTsKKyAgICByLkwoMSkgPSBzLT5MKChvcmRlciA+PiAyKSAmIDMpOworICAgIHIuTCgyKSA9IHMtPkwoKG9yZGVyID4+IDQpICYgMyk7CisgICAgci5MKDMpID0gcy0+TCgob3JkZXIgPj4gNikgJiAzKTsKKyAgICAqZCA9IHI7Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcHNodWZsdywgU1VGRklYKShSZWcgKmQsIFJlZyAqcywgaW50IG9yZGVyKQoreworICAgIFJlZyByOworCisgICAgci5XKDApID0gcy0+VyhvcmRlciAmIDMpOworICAgIHIuVygxKSA9IHMtPlcoKG9yZGVyID4+IDIpICYgMyk7CisgICAgci5XKDIpID0gcy0+Vygob3JkZXIgPj4gNCkgJiAzKTsKKyAgICByLlcoMykgPSBzLT5XKChvcmRlciA+PiA2KSAmIDMpOworICAgIHIuUSgxKSA9IHMtPlEoMSk7CisgICAgKmQgPSByOworfQorCit2b2lkIGdsdWUoaGVscGVyX3BzaHVmaHcsIFNVRkZJWCkoUmVnICpkLCBSZWcgKnMsIGludCBvcmRlcikKK3sKKyAgICBSZWcgcjsKKworICAgIHIuUSgwKSA9IHMtPlEoMCk7CisgICAgci5XKDQpID0gcy0+Vyg0ICsgKG9yZGVyICYgMykpOworICAgIHIuVyg1KSA9IHMtPlcoNCArICgob3JkZXIgPj4gMikgJiAzKSk7CisgICAgci5XKDYpID0gcy0+Vyg0ICsgKChvcmRlciA+PiA0KSAmIDMpKTsKKyAgICByLlcoNykgPSBzLT5XKDQgKyAoKG9yZGVyID4+IDYpICYgMykpOworICAgICpkID0gcjsKK30KKyNlbmRpZgorCisjaWYgU0hJRlQgPT0gMQorLyogRlBVIG9wcyAqLworLyogWFhYOiBub3QgYWNjdXJhdGUgKi8KKworI2RlZmluZSBTU0VfSEVMUEVSX1MobmFtZSwgRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHBzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUygwKSA9IEYoMzIsIGQtPlhNTV9TKDApLCBzLT5YTU1fUygwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUygxKSA9IEYoMzIsIGQtPlhNTV9TKDEpLCBzLT5YTU1fUygxKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUygyKSA9IEYoMzIsIGQtPlhNTV9TKDIpLCBzLT5YTU1fUygyKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUygzKSA9IEYoMzIsIGQtPlhNTV9TKDMpLCBzLT5YTU1fUygzKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHNzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUygwKSA9IEYoMzIsIGQtPlhNTV9TKDApLCBzLT5YTU1fUygwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHBkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fRCgwKSA9IEYoNjQsIGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fRCgxKSA9IEYoNjQsIGQtPlhNTV9EKDEpLCBzLT5YTU1fRCgxKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHNkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fRCgwKSA9IEYoNjQsIGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBGUFVfQUREKHNpemUsIGEsIGIpIGZsb2F0ICMjIHNpemUgIyMgX2FkZChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKQorI2RlZmluZSBGUFVfU1VCKHNpemUsIGEsIGIpIGZsb2F0ICMjIHNpemUgIyMgX3N1YihhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKQorI2RlZmluZSBGUFVfTVVMKHNpemUsIGEsIGIpIGZsb2F0ICMjIHNpemUgIyMgX211bChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKQorI2RlZmluZSBGUFVfRElWKHNpemUsIGEsIGIpIGZsb2F0ICMjIHNpemUgIyMgX2RpdihhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKQorI2RlZmluZSBGUFVfU1FSVChzaXplLCBhLCBiKSBmbG9hdCAjIyBzaXplICMjIF9zcXJ0KGIsICZlbnYtPnNzZV9zdGF0dXMpCisKKy8qIE5vdGUgdGhhdCB0aGUgY2hvaWNlIG9mIGNvbXBhcmlzb24gb3AgaGVyZSBpcyBpbXBvcnRhbnQgdG8gZ2V0IHRoZQorICogc3BlY2lhbCBjYXNlcyByaWdodDogZm9yIG1pbiBhbmQgbWF4IEludGVsIHNwZWNpZmllcyB0aGF0ICgtMCwwKSwKKyAqIChOYU4sIGFueXRoaW5nKSBhbmQgKGFueXRoaW5nLCBOYU4pIHJldHVybiB0aGUgc2Vjb25kIGFyZ3VtZW50LgorICovCisjZGVmaW5lIEZQVV9NSU4oc2l6ZSwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChmbG9hdCAjIyBzaXplICMjIF9sdChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgRlBVX01BWChzaXplLCBhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGZsb2F0ICMjIHNpemUgIyMgX2x0KGIsIGEsICZlbnYtPnNzZV9zdGF0dXMpID8gKGEpIDogKGIpKQorCitTU0VfSEVMUEVSX1MoYWRkLCBGUFVfQUREKQorU1NFX0hFTFBFUl9TKHN1YiwgRlBVX1NVQikKK1NTRV9IRUxQRVJfUyhtdWwsIEZQVV9NVUwpCitTU0VfSEVMUEVSX1MoZGl2LCBGUFVfRElWKQorU1NFX0hFTFBFUl9TKG1pbiwgRlBVX01JTikKK1NTRV9IRUxQRVJfUyhtYXgsIEZQVV9NQVgpCitTU0VfSEVMUEVSX1Moc3FydCwgRlBVX1NRUlQpCisKKworLyogZmxvYXQgdG8gZmxvYXQgY29udmVyc2lvbnMgKi8KK3ZvaWQgaGVscGVyX2N2dHBzMnBkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGZsb2F0MzIgczAsIHMxOworCisgICAgczAgPSBzLT5YTU1fUygwKTsKKyAgICBzMSA9IHMtPlhNTV9TKDEpOworICAgIGQtPlhNTV9EKDApID0gZmxvYXQzMl90b19mbG9hdDY0KHMwLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fRCgxKSA9IGZsb2F0MzJfdG9fZmxvYXQ2NChzMSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2N2dHBkMnBzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGQtPlhNTV9TKDApID0gZmxvYXQ2NF90b19mbG9hdDMyKHMtPlhNTV9EKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUygxKSA9IGZsb2F0NjRfdG9fZmxvYXQzMihzLT5YTU1fRCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+USgxKSA9IDA7Cit9CisKK3ZvaWQgaGVscGVyX2N2dHNzMnNkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGQtPlhNTV9EKDApID0gZmxvYXQzMl90b19mbG9hdDY0KHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfY3Z0c2Qyc3MoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgZC0+WE1NX1MoMCkgPSBmbG9hdDY0X3RvX2Zsb2F0MzIocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCisvKiBpbnRlZ2VyIHRvIGZsb2F0ICovCit2b2lkIGhlbHBlcl9jdnRkcTJwcyhDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5YTU1fUygwKSA9IGludDMyX3RvX2Zsb2F0MzIocy0+WE1NX0woMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDEpID0gaW50MzJfdG9fZmxvYXQzMihzLT5YTU1fTCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX1MoMikgPSBpbnQzMl90b19mbG9hdDMyKHMtPlhNTV9MKDIpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUygzKSA9IGludDMyX3RvX2Zsb2F0MzIocy0+WE1NX0woMyksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9jdnRkcTJwZChDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQzMl90IGwwLCBsMTsKKworICAgIGwwID0gKGludDMyX3Qpcy0+WE1NX0woMCk7CisgICAgbDEgPSAoaW50MzJfdClzLT5YTU1fTCgxKTsKKyAgICBkLT5YTU1fRCgwKSA9IGludDMyX3RvX2Zsb2F0NjQobDAsICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9EKDEpID0gaW50MzJfdG9fZmxvYXQ2NChsMSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX2N2dHBpMnBzKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPlhNTV9TKDApID0gaW50MzJfdG9fZmxvYXQzMihzLT5NTVhfTCgwKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX1MoMSkgPSBpbnQzMl90b19mbG9hdDMyKHMtPk1NWF9MKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfY3Z0cGkycGQoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBNTVhSZWcgKnMpCit7CisgICAgZC0+WE1NX0QoMCkgPSBpbnQzMl90b19mbG9hdDY0KHMtPk1NWF9MKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fRCgxKSA9IGludDMyX3RvX2Zsb2F0NjQocy0+TU1YX0woMSksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9jdnRzaTJzcyhDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIHVpbnQzMl90IHZhbCkKK3sKKyAgICBkLT5YTU1fUygwKSA9IGludDMyX3RvX2Zsb2F0MzIodmFsLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfY3Z0c2kyc2QoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCB1aW50MzJfdCB2YWwpCit7CisgICAgZC0+WE1NX0QoMCkgPSBpbnQzMl90b19mbG9hdDY0KHZhbCwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0Cit2b2lkIGhlbHBlcl9jdnRzcTJzcyhDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIHVpbnQ2NF90IHZhbCkKK3sKKyAgICBkLT5YTU1fUygwKSA9IGludDY0X3RvX2Zsb2F0MzIodmFsLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfY3Z0c3Eyc2QoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCB1aW50NjRfdCB2YWwpCit7CisgICAgZC0+WE1NX0QoMCkgPSBpbnQ2NF90b19mbG9hdDY0KHZhbCwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisjZW5kaWYKKworLyogZmxvYXQgdG8gaW50ZWdlciAqLwordm9pZCBoZWxwZXJfY3Z0cHMyZHEoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX0woMCkgPSBmbG9hdDMyX3RvX2ludDMyKHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fTCgxKSA9IGZsb2F0MzJfdG9faW50MzIocy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9MKDIpID0gZmxvYXQzMl90b19pbnQzMihzLT5YTU1fUygyKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX0woMykgPSBmbG9hdDMyX3RvX2ludDMyKHMtPlhNTV9TKDMpLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfY3Z0cGQyZHEoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX0woMCkgPSBmbG9hdDY0X3RvX2ludDMyKHMtPlhNTV9EKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fTCgxKSA9IGZsb2F0NjRfdG9faW50MzIocy0+WE1NX0QoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9RKDEpID0gMDsKK30KKwordm9pZCBoZWxwZXJfY3Z0cHMycGkoQ1BVWDg2U3RhdGUgKmVudiwgTU1YUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+TU1YX0woMCkgPSBmbG9hdDMyX3RvX2ludDMyKHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5NTVhfTCgxKSA9IGZsb2F0MzJfdG9faW50MzIocy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9jdnRwZDJwaShDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5NTVhfTCgwKSA9IGZsb2F0NjRfdG9faW50MzIocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPk1NWF9MKDEpID0gZmxvYXQ2NF90b19pbnQzMihzLT5YTU1fRCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK2ludDMyX3QgaGVscGVyX2N2dHNzMnNpKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqcykKK3sKKyAgICByZXR1cm4gZmxvYXQzMl90b19pbnQzMihzLT5YTU1fUygwKSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK2ludDMyX3QgaGVscGVyX2N2dHNkMnNpKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqcykKK3sKKyAgICByZXR1cm4gZmxvYXQ2NF90b19pbnQzMihzLT5YTU1fRCgwKSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitpbnQ2NF90IGhlbHBlcl9jdnRzczJzcShDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKnMpCit7CisgICAgcmV0dXJuIGZsb2F0MzJfdG9faW50NjQocy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCitpbnQ2NF90IGhlbHBlcl9jdnRzZDJzcShDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKnMpCit7CisgICAgcmV0dXJuIGZsb2F0NjRfdG9faW50NjQocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworfQorI2VuZGlmCisKKy8qIGZsb2F0IHRvIGludGVnZXIgdHJ1bmNhdGVkICovCit2b2lkIGhlbHBlcl9jdnR0cHMyZHEoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX0woMCkgPSBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8ocy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9MKDEpID0gZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPlhNTV9TKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fTCgyKSA9IGZsb2F0MzJfdG9faW50MzJfcm91bmRfdG9femVybyhzLT5YTU1fUygyKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX0woMykgPSBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8ocy0+WE1NX1MoMyksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9jdnR0cGQyZHEoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX0woMCkgPSBmbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8ocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9MKDEpID0gZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPlhNTV9EKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUSgxKSA9IDA7Cit9CisKK3ZvaWQgaGVscGVyX2N2dHRwczJwaShDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5NTVhfTCgwKSA9IGZsb2F0MzJfdG9faW50MzJfcm91bmRfdG9femVybyhzLT5YTU1fUygwKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+TU1YX0woMSkgPSBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8ocy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9jdnR0cGQycGkoQ1BVWDg2U3RhdGUgKmVudiwgTU1YUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+TU1YX0woMCkgPSBmbG9hdDY0X3RvX2ludDMyX3JvdW5kX3RvX3plcm8ocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPk1NWF9MKDEpID0gZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPlhNTV9EKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKworaW50MzJfdCBoZWxwZXJfY3Z0dHNzMnNpKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqcykKK3sKKyAgICByZXR1cm4gZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKworaW50MzJfdCBoZWxwZXJfY3Z0dHNkMnNpKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqcykKK3sKKyAgICByZXR1cm4gZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPlhNTV9EKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKK2ludDY0X3QgaGVscGVyX2N2dHRzczJzcShDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKnMpCit7CisgICAgcmV0dXJuIGZsb2F0MzJfdG9faW50NjRfcm91bmRfdG9femVybyhzLT5YTU1fUygwKSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK2ludDY0X3QgaGVscGVyX2N2dHRzZDJzcShDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKnMpCit7CisgICAgcmV0dXJuIGZsb2F0NjRfdG9faW50NjRfcm91bmRfdG9femVybyhzLT5YTU1fRCgwKSwgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisjZW5kaWYKKwordm9pZCBoZWxwZXJfcnNxcnRwcyhDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5YTU1fUygwKSA9IGZsb2F0MzJfZGl2KGZsb2F0MzJfb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQzMl9zcXJ0KHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDEpID0gZmxvYXQzMl9kaXYoZmxvYXQzMl9vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDMyX3NxcnQocy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX1MoMikgPSBmbG9hdDMyX2RpdihmbG9hdDMyX29uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0MzJfc3FydChzLT5YTU1fUygyKSwgJmVudi0+c3NlX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUygzKSA9IGZsb2F0MzJfZGl2KGZsb2F0MzJfb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQzMl9zcXJ0KHMtPlhNTV9TKDMpLCAmZW52LT5zc2Vfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9yc3FydHNzKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqZCwgWE1NUmVnICpzKQoreworICAgIGQtPlhNTV9TKDApID0gZmxvYXQzMl9kaXYoZmxvYXQzMl9vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDMyX3NxcnQocy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX3JjcHBzKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqZCwgWE1NUmVnICpzKQoreworICAgIGQtPlhNTV9TKDApID0gZmxvYXQzMl9kaXYoZmxvYXQzMl9vbmUsIHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUygxKSA9IGZsb2F0MzJfZGl2KGZsb2F0MzJfb25lLCBzLT5YTU1fUygxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX1MoMikgPSBmbG9hdDMyX2RpdihmbG9hdDMyX29uZSwgcy0+WE1NX1MoMiksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDMpID0gZmxvYXQzMl9kaXYoZmxvYXQzMl9vbmUsIHMtPlhNTV9TKDMpLCAmZW52LT5zc2Vfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfcmNwc3MoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX1MoMCkgPSBmbG9hdDMyX2RpdihmbG9hdDMyX29uZSwgcy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGhlbHBlcl9leHRycSh1aW50NjRfdCBzcmMsIGludCBzaGlmdCwgaW50IGxlbikKK3sKKyAgICB1aW50NjRfdCBtYXNrOworCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIG1hc2sgPSB+MExMOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hc2sgPSAoMVVMTCA8PCBsZW4pIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIChzcmMgPj4gc2hpZnQpICYgbWFzazsKK30KKwordm9pZCBoZWxwZXJfZXh0cnFfcihDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5YTU1fUSgwKSA9IGhlbHBlcl9leHRycShkLT5YTU1fUSgwKSwgcy0+WE1NX0IoMSksIHMtPlhNTV9CKDApKTsKK30KKwordm9pZCBoZWxwZXJfZXh0cnFfaShDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIGludCBpbmRleCwgaW50IGxlbmd0aCkKK3sKKyAgICBkLT5YTU1fUSgwKSA9IGhlbHBlcl9leHRycShkLT5YTU1fUSgwKSwgaW5kZXgsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgaGVscGVyX2luc2VydHEodWludDY0X3Qgc3JjLCBpbnQgc2hpZnQsIGludCBsZW4pCit7CisgICAgdWludDY0X3QgbWFzazsKKworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBtYXNrID0gfjBVTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFzayA9ICgxVUxMIDw8IGxlbikgLSAxOworICAgIH0KKyAgICByZXR1cm4gKHNyYyAmIH4obWFzayA8PCBzaGlmdCkpIHwgKChzcmMgJiBtYXNrKSA8PCBzaGlmdCk7Cit9CisKK3ZvaWQgaGVscGVyX2luc2VydHFfcihDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5YTU1fUSgwKSA9IGhlbHBlcl9pbnNlcnRxKHMtPlhNTV9RKDApLCBzLT5YTU1fQig5KSwgcy0+WE1NX0IoOCkpOworfQorCit2b2lkIGhlbHBlcl9pbnNlcnRxX2koQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCit7CisgICAgZC0+WE1NX1EoMCkgPSBoZWxwZXJfaW5zZXJ0cShkLT5YTU1fUSgwKSwgaW5kZXgsIGxlbmd0aCk7Cit9CisKK3ZvaWQgaGVscGVyX2hhZGRwcyhDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBYTU1SZWcgcjsKKworICAgIHIuWE1NX1MoMCkgPSBmbG9hdDMyX2FkZChkLT5YTU1fUygwKSwgZC0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIHIuWE1NX1MoMSkgPSBmbG9hdDMyX2FkZChkLT5YTU1fUygyKSwgZC0+WE1NX1MoMyksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIHIuWE1NX1MoMikgPSBmbG9hdDMyX2FkZChzLT5YTU1fUygwKSwgcy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIHIuWE1NX1MoMykgPSBmbG9hdDMyX2FkZChzLT5YTU1fUygyKSwgcy0+WE1NX1MoMyksICZlbnYtPnNzZV9zdGF0dXMpOworICAgICpkID0gcjsKK30KKwordm9pZCBoZWxwZXJfaGFkZHBkKENQVVg4NlN0YXRlICplbnYsIFhNTVJlZyAqZCwgWE1NUmVnICpzKQoreworICAgIFhNTVJlZyByOworCisgICAgci5YTU1fRCgwKSA9IGZsb2F0NjRfYWRkKGQtPlhNTV9EKDApLCBkLT5YTU1fRCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgci5YTU1fRCgxKSA9IGZsb2F0NjRfYWRkKHMtPlhNTV9EKDApLCBzLT5YTU1fRCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgKmQgPSByOworfQorCit2b2lkIGhlbHBlcl9oc3VicHMoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgWE1NUmVnIHI7CisKKyAgICByLlhNTV9TKDApID0gZmxvYXQzMl9zdWIoZC0+WE1NX1MoMCksIGQtPlhNTV9TKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICByLlhNTV9TKDEpID0gZmxvYXQzMl9zdWIoZC0+WE1NX1MoMiksIGQtPlhNTV9TKDMpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICByLlhNTV9TKDIpID0gZmxvYXQzMl9zdWIocy0+WE1NX1MoMCksIHMtPlhNTV9TKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICByLlhNTV9TKDMpID0gZmxvYXQzMl9zdWIocy0+WE1NX1MoMiksIHMtPlhNTV9TKDMpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAqZCA9IHI7Cit9CisKK3ZvaWQgaGVscGVyX2hzdWJwZChDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBYTU1SZWcgcjsKKworICAgIHIuWE1NX0QoMCkgPSBmbG9hdDY0X3N1YihkLT5YTU1fRCgwKSwgZC0+WE1NX0QoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIHIuWE1NX0QoMSkgPSBmbG9hdDY0X3N1YihzLT5YTU1fRCgwKSwgcy0+WE1NX0QoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgICpkID0gcjsKK30KKwordm9pZCBoZWxwZXJfYWRkc3VicHMoQ1BVWDg2U3RhdGUgKmVudiwgWE1NUmVnICpkLCBYTU1SZWcgKnMpCit7CisgICAgZC0+WE1NX1MoMCkgPSBmbG9hdDMyX3N1YihkLT5YTU1fUygwKSwgcy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDEpID0gZmxvYXQzMl9hZGQoZC0+WE1NX1MoMSksIHMtPlhNTV9TKDEpLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBkLT5YTU1fUygyKSA9IGZsb2F0MzJfc3ViKGQtPlhNTV9TKDIpLCBzLT5YTU1fUygyKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX1MoMykgPSBmbG9hdDMyX2FkZChkLT5YTU1fUygzKSwgcy0+WE1NX1MoMyksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9hZGRzdWJwZChDUFVYODZTdGF0ZSAqZW52LCBYTU1SZWcgKmQsIFhNTVJlZyAqcykKK3sKKyAgICBkLT5YTU1fRCgwKSA9IGZsb2F0NjRfc3ViKGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX0QoMSkgPSBmbG9hdDY0X2FkZChkLT5YTU1fRCgxKSwgcy0+WE1NX0QoMSksICZlbnYtPnNzZV9zdGF0dXMpOworfQorCisvKiBYWFg6IHVub3JkZXJlZCAqLworI2RlZmluZSBTU0VfSEVMUEVSX0NNUChuYW1lLCBGKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHBzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fTCgwKSA9IEYoMzIsIGQtPlhNTV9TKDApLCBzLT5YTU1fUygwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fTCgxKSA9IEYoMzIsIGQtPlhNTV9TKDEpLCBzLT5YTU1fUygxKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fTCgyKSA9IEYoMzIsIGQtPlhNTV9TKDIpLCBzLT5YTU1fUygyKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fTCgzKSA9IEYoMzIsIGQtPlhNTV9TKDMpLCBzLT5YTU1fUygzKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHNzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fTCgwKSA9IEYoMzIsIGQtPlhNTV9TKDApLCBzLT5YTU1fUygwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHBkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUSgwKSA9IEYoNjQsIGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUSgxKSA9IEYoNjQsIGQtPlhNTV9EKDEpLCBzLT5YTU1fRCgxKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgaGVscGVyXyAjIyBuYW1lICMjIHNkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5YTU1fUSgwKSA9IEYoNjQsIGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBGUFVfQ01QRVEoc2l6ZSwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChmbG9hdCAjIyBzaXplICMjIF9lcV9xdWlldChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKSA/IC0xIDogMCkKKyNkZWZpbmUgRlBVX0NNUExUKHNpemUsIGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZmxvYXQgIyMgc2l6ZSAjIyBfbHQoYSwgYiwgJmVudi0+c3NlX3N0YXR1cykgPyAtMSA6IDApCisjZGVmaW5lIEZQVV9DTVBMRShzaXplLCBhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGZsb2F0ICMjIHNpemUgIyMgX2xlKGEsIGIsICZlbnYtPnNzZV9zdGF0dXMpID8gLTEgOiAwKQorI2RlZmluZSBGUFVfQ01QVU5PUkQoc2l6ZSwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChmbG9hdCAjIyBzaXplICMjIF91bm9yZGVyZWRfcXVpZXQoYSwgYiwgJmVudi0+c3NlX3N0YXR1cykgPyAtMSA6IDApCisjZGVmaW5lIEZQVV9DTVBORVEoc2l6ZSwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGZsb2F0ICMjIHNpemUgIyMgX2VxX3F1aWV0KGEsIGIsICZlbnYtPnNzZV9zdGF0dXMpID8gMCA6IC0xKQorI2RlZmluZSBGUFVfQ01QTkxUKHNpemUsIGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChmbG9hdCAjIyBzaXplICMjIF9sdChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKSA/IDAgOiAtMSkKKyNkZWZpbmUgRlBVX0NNUE5MRShzaXplLCBhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZmxvYXQgIyMgc2l6ZSAjIyBfbGUoYSwgYiwgJmVudi0+c3NlX3N0YXR1cykgPyAwIDogLTEpCisjZGVmaW5lIEZQVV9DTVBPUkQoc2l6ZSwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGZsb2F0ICMjIHNpemUgIyMgX3Vub3JkZXJlZF9xdWlldChhLCBiLCAmZW52LT5zc2Vfc3RhdHVzKSA/IDAgOiAtMSkKKworU1NFX0hFTFBFUl9DTVAoY21wZXEsIEZQVV9DTVBFUSkKK1NTRV9IRUxQRVJfQ01QKGNtcGx0LCBGUFVfQ01QTFQpCitTU0VfSEVMUEVSX0NNUChjbXBsZSwgRlBVX0NNUExFKQorU1NFX0hFTFBFUl9DTVAoY21wdW5vcmQsIEZQVV9DTVBVTk9SRCkKK1NTRV9IRUxQRVJfQ01QKGNtcG5lcSwgRlBVX0NNUE5FUSkKK1NTRV9IRUxQRVJfQ01QKGNtcG5sdCwgRlBVX0NNUE5MVCkKK1NTRV9IRUxQRVJfQ01QKGNtcG5sZSwgRlBVX0NNUE5MRSkKK1NTRV9IRUxQRVJfQ01QKGNtcG9yZCwgRlBVX0NNUE9SRCkKKworc3RhdGljIGNvbnN0IGludCBjb21pc19lZmxhZ3NbNF0gPSB7Q0NfQywgQ0NfWiwgMCwgQ0NfWiB8IENDX1AgfCBDQ19DfTsKKwordm9pZCBoZWxwZXJfdWNvbWlzcyhDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgcmV0OworICAgIGZsb2F0MzIgczAsIHMxOworCisgICAgczAgPSBkLT5YTU1fUygwKTsKKyAgICBzMSA9IHMtPlhNTV9TKDApOworICAgIHJldCA9IGZsb2F0MzJfY29tcGFyZV9xdWlldChzMCwgczEsICZlbnYtPnNzZV9zdGF0dXMpOworICAgIENDX1NSQyA9IGNvbWlzX2VmbGFnc1tyZXQgKyAxXTsKK30KKwordm9pZCBoZWxwZXJfY29taXNzKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCByZXQ7CisgICAgZmxvYXQzMiBzMCwgczE7CisKKyAgICBzMCA9IGQtPlhNTV9TKDApOworICAgIHMxID0gcy0+WE1NX1MoMCk7CisgICAgcmV0ID0gZmxvYXQzMl9jb21wYXJlKHMwLCBzMSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgQ0NfU1JDID0gY29taXNfZWZsYWdzW3JldCArIDFdOworfQorCit2b2lkIGhlbHBlcl91Y29taXNkKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGludCByZXQ7CisgICAgZmxvYXQ2NCBkMCwgZDE7CisKKyAgICBkMCA9IGQtPlhNTV9EKDApOworICAgIGQxID0gcy0+WE1NX0QoMCk7CisgICAgcmV0ID0gZmxvYXQ2NF9jb21wYXJlX3F1aWV0KGQwLCBkMSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgQ0NfU1JDID0gY29taXNfZWZsYWdzW3JldCArIDFdOworfQorCit2b2lkIGhlbHBlcl9jb21pc2QoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IHJldDsKKyAgICBmbG9hdDY0IGQwLCBkMTsKKworICAgIGQwID0gZC0+WE1NX0QoMCk7CisgICAgZDEgPSBzLT5YTU1fRCgwKTsKKyAgICByZXQgPSBmbG9hdDY0X2NvbXBhcmUoZDAsIGQxLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICBDQ19TUkMgPSBjb21pc19lZmxhZ3NbcmV0ICsgMV07Cit9CisKK3VpbnQzMl90IGhlbHBlcl9tb3Ztc2twcyhDUFVYODZTdGF0ZSAqZW52LCBSZWcgKnMpCit7CisgICAgaW50IGIwLCBiMSwgYjIsIGIzOworCisgICAgYjAgPSBzLT5YTU1fTCgwKSA+PiAzMTsKKyAgICBiMSA9IHMtPlhNTV9MKDEpID4+IDMxOworICAgIGIyID0gcy0+WE1NX0woMikgPj4gMzE7CisgICAgYjMgPSBzLT5YTU1fTCgzKSA+PiAzMTsKKyAgICByZXR1cm4gYjAgfCAoYjEgPDwgMSkgfCAoYjIgPDwgMikgfCAoYjMgPDwgMyk7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9tb3Ztc2twZChDUFVYODZTdGF0ZSAqZW52LCBSZWcgKnMpCit7CisgICAgaW50IGIwLCBiMTsKKworICAgIGIwID0gcy0+WE1NX0woMSkgPj4gMzE7CisgICAgYjEgPSBzLT5YTU1fTCgzKSA+PiAzMTsKKyAgICByZXR1cm4gYjAgfCAoYjEgPDwgMSk7Cit9CisKKyNlbmRpZgorCit1aW50MzJfdCBnbHVlKGhlbHBlcl9wbW92bXNrYiwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKnMpCit7CisgICAgdWludDMyX3QgdmFsOworCisgICAgdmFsID0gMDsKKyAgICB2YWwgfD0gKHMtPkIoMCkgPj4gNyk7CisgICAgdmFsIHw9IChzLT5CKDEpID4+IDYpICYgMHgwMjsKKyAgICB2YWwgfD0gKHMtPkIoMikgPj4gNSkgJiAweDA0OworICAgIHZhbCB8PSAocy0+QigzKSA+PiA0KSAmIDB4MDg7CisgICAgdmFsIHw9IChzLT5CKDQpID4+IDMpICYgMHgxMDsKKyAgICB2YWwgfD0gKHMtPkIoNSkgPj4gMikgJiAweDIwOworICAgIHZhbCB8PSAocy0+Qig2KSA+PiAxKSAmIDB4NDA7CisgICAgdmFsIHw9IChzLT5CKDcpKSAmIDB4ODA7CisjaWYgU0hJRlQgPT0gMQorICAgIHZhbCB8PSAocy0+Qig4KSA8PCAxKSAmIDB4MDEwMDsKKyAgICB2YWwgfD0gKHMtPkIoOSkgPDwgMikgJiAweDAyMDA7CisgICAgdmFsIHw9IChzLT5CKDEwKSA8PCAzKSAmIDB4MDQwMDsKKyAgICB2YWwgfD0gKHMtPkIoMTEpIDw8IDQpICYgMHgwODAwOworICAgIHZhbCB8PSAocy0+QigxMikgPDwgNSkgJiAweDEwMDA7CisgICAgdmFsIHw9IChzLT5CKDEzKSA8PCA2KSAmIDB4MjAwMDsKKyAgICB2YWwgfD0gKHMtPkIoMTQpIDw8IDcpICYgMHg0MDAwOworICAgIHZhbCB8PSAocy0+QigxNSkgPDwgOCkgJiAweDgwMDA7CisjZW5kaWYKKyAgICByZXR1cm4gdmFsOworfQorCit2b2lkIGdsdWUoaGVscGVyX3BhY2tzc3diLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIFJlZyByOworCisgICAgci5CKDApID0gc2F0c2IoKGludDE2X3QpZC0+VygwKSk7CisgICAgci5CKDEpID0gc2F0c2IoKGludDE2X3QpZC0+VygxKSk7CisgICAgci5CKDIpID0gc2F0c2IoKGludDE2X3QpZC0+VygyKSk7CisgICAgci5CKDMpID0gc2F0c2IoKGludDE2X3QpZC0+VygzKSk7CisjaWYgU0hJRlQgPT0gMQorICAgIHIuQig0KSA9IHNhdHNiKChpbnQxNl90KWQtPlcoNCkpOworICAgIHIuQig1KSA9IHNhdHNiKChpbnQxNl90KWQtPlcoNSkpOworICAgIHIuQig2KSA9IHNhdHNiKChpbnQxNl90KWQtPlcoNikpOworICAgIHIuQig3KSA9IHNhdHNiKChpbnQxNl90KWQtPlcoNykpOworI2VuZGlmCisgICAgci5CKCg0IDw8IFNISUZUKSArIDApID0gc2F0c2IoKGludDE2X3Qpcy0+VygwKSk7CisgICAgci5CKCg0IDw8IFNISUZUKSArIDEpID0gc2F0c2IoKGludDE2X3Qpcy0+VygxKSk7CisgICAgci5CKCg0IDw8IFNISUZUKSArIDIpID0gc2F0c2IoKGludDE2X3Qpcy0+VygyKSk7CisgICAgci5CKCg0IDw8IFNISUZUKSArIDMpID0gc2F0c2IoKGludDE2X3Qpcy0+VygzKSk7CisjaWYgU0hJRlQgPT0gMQorICAgIHIuQigxMikgPSBzYXRzYigoaW50MTZfdClzLT5XKDQpKTsKKyAgICByLkIoMTMpID0gc2F0c2IoKGludDE2X3Qpcy0+Vyg1KSk7CisgICAgci5CKDE0KSA9IHNhdHNiKChpbnQxNl90KXMtPlcoNikpOworICAgIHIuQigxNSkgPSBzYXRzYigoaW50MTZfdClzLT5XKDcpKTsKKyNlbmRpZgorICAgICpkID0gcjsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9wYWNrdXN3YiwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBSZWcgcjsKKworICAgIHIuQigwKSA9IHNhdHViKChpbnQxNl90KWQtPlcoMCkpOworICAgIHIuQigxKSA9IHNhdHViKChpbnQxNl90KWQtPlcoMSkpOworICAgIHIuQigyKSA9IHNhdHViKChpbnQxNl90KWQtPlcoMikpOworICAgIHIuQigzKSA9IHNhdHViKChpbnQxNl90KWQtPlcoMykpOworI2lmIFNISUZUID09IDEKKyAgICByLkIoNCkgPSBzYXR1YigoaW50MTZfdClkLT5XKDQpKTsKKyAgICByLkIoNSkgPSBzYXR1YigoaW50MTZfdClkLT5XKDUpKTsKKyAgICByLkIoNikgPSBzYXR1YigoaW50MTZfdClkLT5XKDYpKTsKKyAgICByLkIoNykgPSBzYXR1YigoaW50MTZfdClkLT5XKDcpKTsKKyNlbmRpZgorICAgIHIuQigoNCA8PCBTSElGVCkgKyAwKSA9IHNhdHViKChpbnQxNl90KXMtPlcoMCkpOworICAgIHIuQigoNCA8PCBTSElGVCkgKyAxKSA9IHNhdHViKChpbnQxNl90KXMtPlcoMSkpOworICAgIHIuQigoNCA8PCBTSElGVCkgKyAyKSA9IHNhdHViKChpbnQxNl90KXMtPlcoMikpOworICAgIHIuQigoNCA8PCBTSElGVCkgKyAzKSA9IHNhdHViKChpbnQxNl90KXMtPlcoMykpOworI2lmIFNISUZUID09IDEKKyAgICByLkIoMTIpID0gc2F0dWIoKGludDE2X3Qpcy0+Vyg0KSk7CisgICAgci5CKDEzKSA9IHNhdHViKChpbnQxNl90KXMtPlcoNSkpOworICAgIHIuQigxNCkgPSBzYXR1YigoaW50MTZfdClzLT5XKDYpKTsKKyAgICByLkIoMTUpID0gc2F0dWIoKGludDE2X3Qpcy0+Vyg3KSk7CisjZW5kaWYKKyAgICAqZCA9IHI7Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGFja3NzZHcsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgUmVnIHI7CisKKyAgICByLlcoMCkgPSBzYXRzdyhkLT5MKDApKTsKKyAgICByLlcoMSkgPSBzYXRzdyhkLT5MKDEpKTsKKyNpZiBTSElGVCA9PSAxCisgICAgci5XKDIpID0gc2F0c3coZC0+TCgyKSk7CisgICAgci5XKDMpID0gc2F0c3coZC0+TCgzKSk7CisjZW5kaWYKKyAgICByLlcoKDIgPDwgU0hJRlQpICsgMCkgPSBzYXRzdyhzLT5MKDApKTsKKyAgICByLlcoKDIgPDwgU0hJRlQpICsgMSkgPSBzYXRzdyhzLT5MKDEpKTsKKyNpZiBTSElGVCA9PSAxCisgICAgci5XKDYpID0gc2F0c3cocy0+TCgyKSk7CisgICAgci5XKDcpID0gc2F0c3cocy0+TCgzKSk7CisjZW5kaWYKKyAgICAqZCA9IHI7Cit9CisKKyNkZWZpbmUgVU5QQ0tfT1AoYmFzZV9uYW1lLCBiYXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIGdsdWUoaGVscGVyX3B1bnBjayAjIyBiYXNlX25hbWUgIyMgYncsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZyAqZCwgUmVnICpzKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFJlZyByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQigwKSA9IGQtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQigxKSA9IHMtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQigyKSA9IGQtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQigzKSA9IHMtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQig0KSA9IGQtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQig1KSA9IHMtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQig2KSA9IGQtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHIuQig3KSA9IHMtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgMyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFhNTV9PTkxZKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQig4KSA9IGQtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgNCk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQig5KSA9IHMtPkIoKGJhc2UgPDwgKFNISUZUICsgMikpICsgNCk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxMCkgPSBkLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxMSkgPSBzLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDUpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxMikgPSBkLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDYpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxMykgPSBzLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDYpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxNCkgPSBkLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDcpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuQigxNSkgPSBzLT5CKChiYXNlIDw8IChTSElGVCArIDIpKSArIDcpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBcCisgICAgICAgICAgICAqZCA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCBnbHVlKGhlbHBlcl9wdW5wY2sgIyMgYmFzZV9uYW1lICMjIHdkLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWcgKmQsIFJlZyAqcykgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSZWcgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByLlcoMCkgPSBkLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByLlcoMSkgPSBzLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByLlcoMikgPSBkLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByLlcoMykgPSBzLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBYTU1fT05MWSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICByLlcoNCkgPSBkLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDIpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICByLlcoNSkgPSBzLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDIpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICByLlcoNikgPSBkLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDMpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICByLlcoNykgPSBzLT5XKChiYXNlIDw8IChTSElGVCArIDEpKSArIDMpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgXAorICAgICAgICAgICAgKmQgPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZ2x1ZShoZWxwZXJfcHVucGNrICMjIGJhc2VfbmFtZSAjIyBkcSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnICpkLCBSZWcgKnMpIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUmVnIHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgci5MKDApID0gZC0+TCgoYmFzZSA8PCBTSElGVCkgKyAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgci5MKDEpID0gcy0+TCgoYmFzZSA8PCBTSElGVCkgKyAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgWE1NX09OTFkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgci5MKDIpID0gZC0+TCgoYmFzZSA8PCBTSElGVCkgKyAxKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgci5MKDMpID0gcy0+TCgoYmFzZSA8PCBTSElGVCkgKyAxKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIFwKKyAgICAgICAgICAgICpkID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBYTU1fT05MWSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICB2b2lkIGdsdWUoaGVscGVyX3B1bnBjayAjIyBiYXNlX25hbWUgIyMgcWRxLCBTVUZGSVgpKENQVVg4NlN0YXRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbnYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZyAqZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnICpzKSBcCisgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIFJlZyByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuUSgwKSA9IGQtPlEoYmFzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHIuUSgxKSA9IHMtPlEoYmFzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICpkID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK1VOUENLX09QKGwsIDApCitVTlBDS19PUChoLCAxKQorCisvKiAzRE5vdyEgZmxvYXQgb3BzICovCisjaWYgU0hJRlQgPT0gMAordm9pZCBoZWxwZXJfcGkyZmQoQ1BVWDg2U3RhdGUgKmVudiwgTU1YUmVnICpkLCBNTVhSZWcgKnMpCit7CisgICAgZC0+TU1YX1MoMCkgPSBpbnQzMl90b19mbG9hdDMyKHMtPk1NWF9MKDApLCAmZW52LT5tbXhfc3RhdHVzKTsKKyAgICBkLT5NTVhfUygxKSA9IGludDMyX3RvX2Zsb2F0MzIocy0+TU1YX0woMSksICZlbnYtPm1teF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9waTJmdyhDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBkLT5NTVhfUygwKSA9IGludDMyX3RvX2Zsb2F0MzIoKGludDE2X3Qpcy0+TU1YX1coMCksICZlbnYtPm1teF9zdGF0dXMpOworICAgIGQtPk1NWF9TKDEpID0gaW50MzJfdG9fZmxvYXQzMigoaW50MTZfdClzLT5NTVhfVygyKSwgJmVudi0+bW14X3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX3BmMmlkKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPk1NWF9MKDApID0gZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPk1NWF9TKDApLCAmZW52LT5tbXhfc3RhdHVzKTsKKyAgICBkLT5NTVhfTCgxKSA9IGZsb2F0MzJfdG9faW50MzJfcm91bmRfdG9femVybyhzLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7Cit9CisKK3ZvaWQgaGVscGVyX3BmMml3KENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPk1NWF9MKDApID0gc2F0c3coZmxvYXQzMl90b19pbnQzMl9yb3VuZF90b196ZXJvKHMtPk1NWF9TKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpKTsKKyAgICBkLT5NTVhfTCgxKSA9IHNhdHN3KGZsb2F0MzJfdG9faW50MzJfcm91bmRfdG9femVybyhzLT5NTVhfUygxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5tbXhfc3RhdHVzKSk7Cit9CisKK3ZvaWQgaGVscGVyX3BmYWNjKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIE1NWFJlZyByOworCisgICAgci5NTVhfUygwKSA9IGZsb2F0MzJfYWRkKGQtPk1NWF9TKDApLCBkLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgci5NTVhfUygxKSA9IGZsb2F0MzJfYWRkKHMtPk1NWF9TKDApLCBzLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgKmQgPSByOworfQorCit2b2lkIGhlbHBlcl9wZmFkZChDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBkLT5NTVhfUygwKSA9IGZsb2F0MzJfYWRkKGQtPk1NWF9TKDApLCBzLT5NTVhfUygwKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgZC0+TU1YX1MoMSkgPSBmbG9hdDMyX2FkZChkLT5NTVhfUygxKSwgcy0+TU1YX1MoMSksICZlbnYtPm1teF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9wZmNtcGVxKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPk1NWF9MKDApID0gZmxvYXQzMl9lcV9xdWlldChkLT5NTVhfUygwKSwgcy0+TU1YX1MoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworICAgIGQtPk1NWF9MKDEpID0gZmxvYXQzMl9lcV9xdWlldChkLT5NTVhfUygxKSwgcy0+TU1YX1MoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworfQorCit2b2lkIGhlbHBlcl9wZmNtcGdlKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPk1NWF9MKDApID0gZmxvYXQzMl9sZShzLT5NTVhfUygwKSwgZC0+TU1YX1MoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworICAgIGQtPk1NWF9MKDEpID0gZmxvYXQzMl9sZShzLT5NTVhfUygxKSwgZC0+TU1YX1MoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworfQorCit2b2lkIGhlbHBlcl9wZmNtcGd0KENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGQtPk1NWF9MKDApID0gZmxvYXQzMl9sdChzLT5NTVhfUygwKSwgZC0+TU1YX1MoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworICAgIGQtPk1NWF9MKDEpID0gZmxvYXQzMl9sdChzLT5NTVhfUygxKSwgZC0+TU1YX1MoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpID8gLTEgOiAwOworfQorCit2b2lkIGhlbHBlcl9wZm1heChDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBpZiAoZmxvYXQzMl9sdChkLT5NTVhfUygwKSwgcy0+TU1YX1MoMCksICZlbnYtPm1teF9zdGF0dXMpKSB7CisgICAgICAgIGQtPk1NWF9TKDApID0gcy0+TU1YX1MoMCk7CisgICAgfQorICAgIGlmIChmbG9hdDMyX2x0KGQtPk1NWF9TKDEpLCBzLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cykpIHsKKyAgICAgICAgZC0+TU1YX1MoMSkgPSBzLT5NTVhfUygxKTsKKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX3BmbWluKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIGlmIChmbG9hdDMyX2x0KHMtPk1NWF9TKDApLCBkLT5NTVhfUygwKSwgJmVudi0+bW14X3N0YXR1cykpIHsKKyAgICAgICAgZC0+TU1YX1MoMCkgPSBzLT5NTVhfUygwKTsKKyAgICB9CisgICAgaWYgKGZsb2F0MzJfbHQocy0+TU1YX1MoMSksIGQtPk1NWF9TKDEpLCAmZW52LT5tbXhfc3RhdHVzKSkgeworICAgICAgICBkLT5NTVhfUygxKSA9IHMtPk1NWF9TKDEpOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfcGZtdWwoQ1BVWDg2U3RhdGUgKmVudiwgTU1YUmVnICpkLCBNTVhSZWcgKnMpCit7CisgICAgZC0+TU1YX1MoMCkgPSBmbG9hdDMyX211bChkLT5NTVhfUygwKSwgcy0+TU1YX1MoMCksICZlbnYtPm1teF9zdGF0dXMpOworICAgIGQtPk1NWF9TKDEpID0gZmxvYXQzMl9tdWwoZC0+TU1YX1MoMSksIHMtPk1NWF9TKDEpLCAmZW52LT5tbXhfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfcGZuYWNjKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIE1NWFJlZyByOworCisgICAgci5NTVhfUygwKSA9IGZsb2F0MzJfc3ViKGQtPk1NWF9TKDApLCBkLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgci5NTVhfUygxKSA9IGZsb2F0MzJfc3ViKHMtPk1NWF9TKDApLCBzLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgKmQgPSByOworfQorCit2b2lkIGhlbHBlcl9wZnBuYWNjKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIE1NWFJlZyByOworCisgICAgci5NTVhfUygwKSA9IGZsb2F0MzJfc3ViKGQtPk1NWF9TKDApLCBkLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgci5NTVhfUygxKSA9IGZsb2F0MzJfYWRkKHMtPk1NWF9TKDApLCBzLT5NTVhfUygxKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgKmQgPSByOworfQorCit2b2lkIGhlbHBlcl9wZnJjcChDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBkLT5NTVhfUygwKSA9IGZsb2F0MzJfZGl2KGZsb2F0MzJfb25lLCBzLT5NTVhfUygwKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgZC0+TU1YX1MoMSkgPSBkLT5NTVhfUygwKTsKK30KKwordm9pZCBoZWxwZXJfcGZyc3FydChDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBkLT5NTVhfTCgxKSA9IHMtPk1NWF9MKDApICYgMHg3ZmZmZmZmZjsKKyAgICBkLT5NTVhfUygxKSA9IGZsb2F0MzJfZGl2KGZsb2F0MzJfb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQzMl9zcXJ0KGQtPk1NWF9TKDEpLCAmZW52LT5tbXhfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPm1teF9zdGF0dXMpOworICAgIGQtPk1NWF9MKDEpIHw9IHMtPk1NWF9MKDApICYgMHg4MDAwMDAwMDsKKyAgICBkLT5NTVhfTCgwKSA9IGQtPk1NWF9MKDEpOworfQorCit2b2lkIGhlbHBlcl9wZnN1YihDUFVYODZTdGF0ZSAqZW52LCBNTVhSZWcgKmQsIE1NWFJlZyAqcykKK3sKKyAgICBkLT5NTVhfUygwKSA9IGZsb2F0MzJfc3ViKGQtPk1NWF9TKDApLCBzLT5NTVhfUygwKSwgJmVudi0+bW14X3N0YXR1cyk7CisgICAgZC0+TU1YX1MoMSkgPSBmbG9hdDMyX3N1YihkLT5NTVhfUygxKSwgcy0+TU1YX1MoMSksICZlbnYtPm1teF9zdGF0dXMpOworfQorCit2b2lkIGhlbHBlcl9wZnN1YnIoQ1BVWDg2U3RhdGUgKmVudiwgTU1YUmVnICpkLCBNTVhSZWcgKnMpCit7CisgICAgZC0+TU1YX1MoMCkgPSBmbG9hdDMyX3N1YihzLT5NTVhfUygwKSwgZC0+TU1YX1MoMCksICZlbnYtPm1teF9zdGF0dXMpOworICAgIGQtPk1NWF9TKDEpID0gZmxvYXQzMl9zdWIocy0+TU1YX1MoMSksIGQtPk1NWF9TKDEpLCAmZW52LT5tbXhfc3RhdHVzKTsKK30KKwordm9pZCBoZWxwZXJfcHN3YXBkKENQVVg4NlN0YXRlICplbnYsIE1NWFJlZyAqZCwgTU1YUmVnICpzKQoreworICAgIE1NWFJlZyByOworCisgICAgci5NTVhfTCgwKSA9IHMtPk1NWF9MKDEpOworICAgIHIuTU1YX0woMSkgPSBzLT5NTVhfTCgwKTsKKyAgICAqZCA9IHI7Cit9CisjZW5kaWYKKworLyogU1NTRTMgb3AgaGVscGVycyAqLwordm9pZCBnbHVlKGhlbHBlcl9wc2h1ZmIsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IGk7CisgICAgUmVnIHI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDggPDwgU0hJRlQpOyBpKyspIHsKKyAgICAgICAgci5CKGkpID0gKHMtPkIoaSkgJiAweDgwKSA/IDAgOiAoZC0+QihzLT5CKGkpICYgKCg4IDw8IFNISUZUKSAtIDEpKSk7CisgICAgfQorCisgICAgKmQgPSByOworfQorCit2b2lkIGdsdWUoaGVscGVyX3BoYWRkdywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5XKDApID0gKGludDE2X3QpZC0+VygwKSArIChpbnQxNl90KWQtPlcoMSk7CisgICAgZC0+VygxKSA9IChpbnQxNl90KWQtPlcoMikgKyAoaW50MTZfdClkLT5XKDMpOworICAgIFhNTV9PTkxZKGQtPlcoMikgPSAoaW50MTZfdClkLT5XKDQpICsgKGludDE2X3QpZC0+Vyg1KSk7CisgICAgWE1NX09OTFkoZC0+VygzKSA9IChpbnQxNl90KWQtPlcoNikgKyAoaW50MTZfdClkLT5XKDcpKTsKKyAgICBkLT5XKCgyIDw8IFNISUZUKSArIDApID0gKGludDE2X3Qpcy0+VygwKSArIChpbnQxNl90KXMtPlcoMSk7CisgICAgZC0+VygoMiA8PCBTSElGVCkgKyAxKSA9IChpbnQxNl90KXMtPlcoMikgKyAoaW50MTZfdClzLT5XKDMpOworICAgIFhNTV9PTkxZKGQtPlcoNikgPSAoaW50MTZfdClzLT5XKDQpICsgKGludDE2X3Qpcy0+Vyg1KSk7CisgICAgWE1NX09OTFkoZC0+Vyg3KSA9IChpbnQxNl90KXMtPlcoNikgKyAoaW50MTZfdClzLT5XKDcpKTsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9waGFkZGQsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgZC0+TCgwKSA9IChpbnQzMl90KWQtPkwoMCkgKyAoaW50MzJfdClkLT5MKDEpOworICAgIFhNTV9PTkxZKGQtPkwoMSkgPSAoaW50MzJfdClkLT5MKDIpICsgKGludDMyX3QpZC0+TCgzKSk7CisgICAgZC0+TCgoMSA8PCBTSElGVCkgKyAwKSA9IChpbnQzMl90KXMtPkwoMCkgKyAoaW50MzJfdClzLT5MKDEpOworICAgIFhNTV9PTkxZKGQtPkwoMykgPSAoaW50MzJfdClzLT5MKDIpICsgKGludDMyX3Qpcy0+TCgzKSk7Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGhhZGRzdywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5XKDApID0gc2F0c3coKGludDE2X3QpZC0+VygwKSArIChpbnQxNl90KWQtPlcoMSkpOworICAgIGQtPlcoMSkgPSBzYXRzdygoaW50MTZfdClkLT5XKDIpICsgKGludDE2X3QpZC0+VygzKSk7CisgICAgWE1NX09OTFkoZC0+VygyKSA9IHNhdHN3KChpbnQxNl90KWQtPlcoNCkgKyAoaW50MTZfdClkLT5XKDUpKSk7CisgICAgWE1NX09OTFkoZC0+VygzKSA9IHNhdHN3KChpbnQxNl90KWQtPlcoNikgKyAoaW50MTZfdClkLT5XKDcpKSk7CisgICAgZC0+VygoMiA8PCBTSElGVCkgKyAwKSA9IHNhdHN3KChpbnQxNl90KXMtPlcoMCkgKyAoaW50MTZfdClzLT5XKDEpKTsKKyAgICBkLT5XKCgyIDw8IFNISUZUKSArIDEpID0gc2F0c3coKGludDE2X3Qpcy0+VygyKSArIChpbnQxNl90KXMtPlcoMykpOworICAgIFhNTV9PTkxZKGQtPlcoNikgPSBzYXRzdygoaW50MTZfdClzLT5XKDQpICsgKGludDE2X3Qpcy0+Vyg1KSkpOworICAgIFhNTV9PTkxZKGQtPlcoNykgPSBzYXRzdygoaW50MTZfdClzLT5XKDYpICsgKGludDE2X3Qpcy0+Vyg3KSkpOworfQorCit2b2lkIGdsdWUoaGVscGVyX3BtYWRkdWJzdywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5XKDApID0gc2F0c3coKGludDhfdClzLT5CKDApICogKHVpbnQ4X3QpZC0+QigwKSArCisgICAgICAgICAgICAgICAgICAgIChpbnQ4X3Qpcy0+QigxKSAqICh1aW50OF90KWQtPkIoMSkpOworICAgIGQtPlcoMSkgPSBzYXRzdygoaW50OF90KXMtPkIoMikgKiAodWludDhfdClkLT5CKDIpICsKKyAgICAgICAgICAgICAgICAgICAgKGludDhfdClzLT5CKDMpICogKHVpbnQ4X3QpZC0+QigzKSk7CisgICAgZC0+VygyKSA9IHNhdHN3KChpbnQ4X3Qpcy0+Qig0KSAqICh1aW50OF90KWQtPkIoNCkgKworICAgICAgICAgICAgICAgICAgICAoaW50OF90KXMtPkIoNSkgKiAodWludDhfdClkLT5CKDUpKTsKKyAgICBkLT5XKDMpID0gc2F0c3coKGludDhfdClzLT5CKDYpICogKHVpbnQ4X3QpZC0+Qig2KSArCisgICAgICAgICAgICAgICAgICAgIChpbnQ4X3Qpcy0+Qig3KSAqICh1aW50OF90KWQtPkIoNykpOworI2lmIFNISUZUID09IDEKKyAgICBkLT5XKDQpID0gc2F0c3coKGludDhfdClzLT5CKDgpICogKHVpbnQ4X3QpZC0+Qig4KSArCisgICAgICAgICAgICAgICAgICAgIChpbnQ4X3Qpcy0+Qig5KSAqICh1aW50OF90KWQtPkIoOSkpOworICAgIGQtPlcoNSkgPSBzYXRzdygoaW50OF90KXMtPkIoMTApICogKHVpbnQ4X3QpZC0+QigxMCkgKworICAgICAgICAgICAgICAgICAgICAoaW50OF90KXMtPkIoMTEpICogKHVpbnQ4X3QpZC0+QigxMSkpOworICAgIGQtPlcoNikgPSBzYXRzdygoaW50OF90KXMtPkIoMTIpICogKHVpbnQ4X3QpZC0+QigxMikgKworICAgICAgICAgICAgICAgICAgICAoaW50OF90KXMtPkIoMTMpICogKHVpbnQ4X3QpZC0+QigxMykpOworICAgIGQtPlcoNykgPSBzYXRzdygoaW50OF90KXMtPkIoMTQpICogKHVpbnQ4X3QpZC0+QigxNCkgKworICAgICAgICAgICAgICAgICAgICAoaW50OF90KXMtPkIoMTUpICogKHVpbnQ4X3QpZC0+QigxNSkpOworI2VuZGlmCit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGhzdWJ3LCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGQtPlcoMCkgPSAoaW50MTZfdClkLT5XKDApIC0gKGludDE2X3QpZC0+VygxKTsKKyAgICBkLT5XKDEpID0gKGludDE2X3QpZC0+VygyKSAtIChpbnQxNl90KWQtPlcoMyk7CisgICAgWE1NX09OTFkoZC0+VygyKSA9IChpbnQxNl90KWQtPlcoNCkgLSAoaW50MTZfdClkLT5XKDUpKTsKKyAgICBYTU1fT05MWShkLT5XKDMpID0gKGludDE2X3QpZC0+Vyg2KSAtIChpbnQxNl90KWQtPlcoNykpOworICAgIGQtPlcoKDIgPDwgU0hJRlQpICsgMCkgPSAoaW50MTZfdClzLT5XKDApIC0gKGludDE2X3Qpcy0+VygxKTsKKyAgICBkLT5XKCgyIDw8IFNISUZUKSArIDEpID0gKGludDE2X3Qpcy0+VygyKSAtIChpbnQxNl90KXMtPlcoMyk7CisgICAgWE1NX09OTFkoZC0+Vyg2KSA9IChpbnQxNl90KXMtPlcoNCkgLSAoaW50MTZfdClzLT5XKDUpKTsKKyAgICBYTU1fT05MWShkLT5XKDcpID0gKGludDE2X3Qpcy0+Vyg2KSAtIChpbnQxNl90KXMtPlcoNykpOworfQorCit2b2lkIGdsdWUoaGVscGVyX3Boc3ViZCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5MKDApID0gKGludDMyX3QpZC0+TCgwKSAtIChpbnQzMl90KWQtPkwoMSk7CisgICAgWE1NX09OTFkoZC0+TCgxKSA9IChpbnQzMl90KWQtPkwoMikgLSAoaW50MzJfdClkLT5MKDMpKTsKKyAgICBkLT5MKCgxIDw8IFNISUZUKSArIDApID0gKGludDMyX3Qpcy0+TCgwKSAtIChpbnQzMl90KXMtPkwoMSk7CisgICAgWE1NX09OTFkoZC0+TCgzKSA9IChpbnQzMl90KXMtPkwoMikgLSAoaW50MzJfdClzLT5MKDMpKTsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9waHN1YnN3LCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKQoreworICAgIGQtPlcoMCkgPSBzYXRzdygoaW50MTZfdClkLT5XKDApIC0gKGludDE2X3QpZC0+VygxKSk7CisgICAgZC0+VygxKSA9IHNhdHN3KChpbnQxNl90KWQtPlcoMikgLSAoaW50MTZfdClkLT5XKDMpKTsKKyAgICBYTU1fT05MWShkLT5XKDIpID0gc2F0c3coKGludDE2X3QpZC0+Vyg0KSAtIChpbnQxNl90KWQtPlcoNSkpKTsKKyAgICBYTU1fT05MWShkLT5XKDMpID0gc2F0c3coKGludDE2X3QpZC0+Vyg2KSAtIChpbnQxNl90KWQtPlcoNykpKTsKKyAgICBkLT5XKCgyIDw8IFNISUZUKSArIDApID0gc2F0c3coKGludDE2X3Qpcy0+VygwKSAtIChpbnQxNl90KXMtPlcoMSkpOworICAgIGQtPlcoKDIgPDwgU0hJRlQpICsgMSkgPSBzYXRzdygoaW50MTZfdClzLT5XKDIpIC0gKGludDE2X3Qpcy0+VygzKSk7CisgICAgWE1NX09OTFkoZC0+Vyg2KSA9IHNhdHN3KChpbnQxNl90KXMtPlcoNCkgLSAoaW50MTZfdClzLT5XKDUpKSk7CisgICAgWE1NX09OTFkoZC0+Vyg3KSA9IHNhdHN3KChpbnQxNl90KXMtPlcoNikgLSAoaW50MTZfdClzLT5XKDcpKSk7Cit9CisKKyNkZWZpbmUgRkFCU0IoXywgeCkgKHggPiBJTlQ4X01BWCAgPyAtKGludDhfdCl4IDogeCkKKyNkZWZpbmUgRkFCU1coXywgeCkgKHggPiBJTlQxNl9NQVggPyAtKGludDE2X3QpeCA6IHgpCisjZGVmaW5lIEZBQlNMKF8sIHgpICh4ID4gSU5UMzJfTUFYID8gLShpbnQzMl90KXggOiB4KQorU1NFX0hFTFBFUl9CKGhlbHBlcl9wYWJzYiwgRkFCU0IpCitTU0VfSEVMUEVSX1coaGVscGVyX3BhYnN3LCBGQUJTVykKK1NTRV9IRUxQRVJfTChoZWxwZXJfcGFic2QsIEZBQlNMKQorCisjZGVmaW5lIEZNVUxIUlNXKGQsIHMpICgoKGludDE2X3QpIGQgKiAoaW50MTZfdClzICsgMHg0MDAwKSA+PiAxNSkKK1NTRV9IRUxQRVJfVyhoZWxwZXJfcG11bGhyc3csIEZNVUxIUlNXKQorCisjZGVmaW5lIEZTSUdOQihkLCBzKSAocyA8PSBJTlQ4X01BWCAgPyBzID8gZCA6IDAgOiAtKGludDhfdClkKQorI2RlZmluZSBGU0lHTlcoZCwgcykgKHMgPD0gSU5UMTZfTUFYID8gcyA/IGQgOiAwIDogLShpbnQxNl90KWQpCisjZGVmaW5lIEZTSUdOTChkLCBzKSAocyA8PSBJTlQzMl9NQVggPyBzID8gZCA6IDAgOiAtKGludDMyX3QpZCkKK1NTRV9IRUxQRVJfQihoZWxwZXJfcHNpZ25iLCBGU0lHTkIpCitTU0VfSEVMUEVSX1coaGVscGVyX3BzaWdudywgRlNJR05XKQorU1NFX0hFTFBFUl9MKGhlbHBlcl9wc2lnbmQsIEZTSUdOTCkKKwordm9pZCBnbHVlKGhlbHBlcl9wYWxpZ25yLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2hpZnQpCit7CisgICAgUmVnIHI7CisKKyAgICAvKiBYWFggY291bGQgYmUgY2hlY2tlZCBkdXJpbmcgdHJhbnNsYXRpb24gKi8KKyAgICBpZiAoc2hpZnQgPj0gKDE2IDw8IFNISUZUKSkgeworICAgICAgICByLlEoMCkgPSAwOworICAgICAgICBYTU1fT05MWShyLlEoMSkgPSAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaGlmdCA8PD0gMzsKKyNkZWZpbmUgU0hSKHYsIGkpIChpIDwgNjQgJiYgaSA+IC02NCA/IGkgPiAwID8gdiA+PiAoaSkgOiAodiA8PCAtKGkpKSA6IDApCisjaWYgU0hJRlQgPT0gMAorICAgICAgICByLlEoMCkgPSBTSFIocy0+USgwKSwgc2hpZnQgLSAwKSB8CisgICAgICAgICAgICBTSFIoZC0+USgwKSwgc2hpZnQgLSAgNjQpOworI2Vsc2UKKyAgICAgICAgci5RKDApID0gU0hSKHMtPlEoMCksIHNoaWZ0IC0gMCkgfAorICAgICAgICAgICAgU0hSKHMtPlEoMSksIHNoaWZ0IC0gIDY0KSB8CisgICAgICAgICAgICBTSFIoZC0+USgwKSwgc2hpZnQgLSAxMjgpIHwKKyAgICAgICAgICAgIFNIUihkLT5RKDEpLCBzaGlmdCAtIDE5Mik7CisgICAgICAgIHIuUSgxKSA9IFNIUihzLT5RKDApLCBzaGlmdCArIDY0KSB8CisgICAgICAgICAgICBTSFIocy0+USgxKSwgc2hpZnQgLSAgIDApIHwKKyAgICAgICAgICAgIFNIUihkLT5RKDApLCBzaGlmdCAtICA2NCkgfAorICAgICAgICAgICAgU0hSKGQtPlEoMSksIHNoaWZ0IC0gMTI4KTsKKyNlbmRpZgorI3VuZGVmIFNIUgorICAgIH0KKworICAgICpkID0gcjsKK30KKworI2RlZmluZSBYTU0wIChlbnYtPnhtbV9yZWdzWzBdKQorCisjaWYgU0hJRlQgPT0gMQorI2RlZmluZSBTU0VfSEVMUEVSX1YobmFtZSwgZWxlbSwgbnVtLCBGKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgZ2x1ZShuYW1lLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5lbGVtKDApID0gRihkLT5lbGVtKDApLCBzLT5lbGVtKDApLCBYTU0wLmVsZW0oMCkpOyAgICAgICAgICAgXAorICAgICAgICBkLT5lbGVtKDEpID0gRihkLT5lbGVtKDEpLCBzLT5lbGVtKDEpLCBYTU0wLmVsZW0oMSkpOyAgICAgICAgICAgXAorICAgICAgICBpZiAobnVtID4gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZC0+ZWxlbSgyKSA9IEYoZC0+ZWxlbSgyKSwgcy0+ZWxlbSgyKSwgWE1NMC5lbGVtKDIpKTsgICAgICAgXAorICAgICAgICAgICAgZC0+ZWxlbSgzKSA9IEYoZC0+ZWxlbSgzKSwgcy0+ZWxlbSgzKSwgWE1NMC5lbGVtKDMpKTsgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bSA+IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNCkgPSBGKGQtPmVsZW0oNCksIHMtPmVsZW0oNCksIFhNTTAuZWxlbSg0KSk7ICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNSkgPSBGKGQtPmVsZW0oNSksIHMtPmVsZW0oNSksIFhNTTAuZWxlbSg1KSk7ICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNikgPSBGKGQtPmVsZW0oNiksIHMtPmVsZW0oNiksIFhNTTAuZWxlbSg2KSk7ICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNykgPSBGKGQtPmVsZW0oNyksIHMtPmVsZW0oNyksIFhNTTAuZWxlbSg3KSk7ICAgXAorICAgICAgICAgICAgICAgIGlmIChudW0gPiA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkLT5lbGVtKDgpID0gRihkLT5lbGVtKDgpLCBzLT5lbGVtKDgpLCBYTU0wLmVsZW0oOCkpOyBcCisgICAgICAgICAgICAgICAgICAgIGQtPmVsZW0oOSkgPSBGKGQtPmVsZW0oOSksIHMtPmVsZW0oOSksIFhNTTAuZWxlbSg5KSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMCkgPSBGKGQtPmVsZW0oMTApLCBzLT5lbGVtKDEwKSwgWE1NMC5lbGVtKDEwKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMSkgPSBGKGQtPmVsZW0oMTEpLCBzLT5lbGVtKDExKSwgWE1NMC5lbGVtKDExKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMikgPSBGKGQtPmVsZW0oMTIpLCBzLT5lbGVtKDEyKSwgWE1NMC5lbGVtKDEyKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMykgPSBGKGQtPmVsZW0oMTMpLCBzLT5lbGVtKDEzKSwgWE1NMC5lbGVtKDEzKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxNCkgPSBGKGQtPmVsZW0oMTQpLCBzLT5lbGVtKDE0KSwgWE1NMC5lbGVtKDE0KSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxNSkgPSBGKGQtPmVsZW0oMTUpLCBzLT5lbGVtKDE1KSwgWE1NMC5lbGVtKDE1KSk7IFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgU1NFX0hFTFBFUl9JKG5hbWUsIGVsZW0sIG51bSwgRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2b2lkIGdsdWUobmFtZSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcywgdWludDMyX3QgaW1tKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGQtPmVsZW0oMCkgPSBGKGQtPmVsZW0oMCksIHMtPmVsZW0oMCksICgoaW1tID4+IDApICYgMSkpOyAgICAgICBcCisgICAgICAgIGQtPmVsZW0oMSkgPSBGKGQtPmVsZW0oMSksIHMtPmVsZW0oMSksICgoaW1tID4+IDEpICYgMSkpOyAgICAgICBcCisgICAgICAgIGlmIChudW0gPiAyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkLT5lbGVtKDIpID0gRihkLT5lbGVtKDIpLCBzLT5lbGVtKDIpLCAoKGltbSA+PiAyKSAmIDEpKTsgICBcCisgICAgICAgICAgICBkLT5lbGVtKDMpID0gRihkLT5lbGVtKDMpLCBzLT5lbGVtKDMpLCAoKGltbSA+PiAzKSAmIDEpKTsgICBcCisgICAgICAgICAgICBpZiAobnVtID4gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZC0+ZWxlbSg0KSA9IEYoZC0+ZWxlbSg0KSwgcy0+ZWxlbSg0KSwgKChpbW0gPj4gNCkgJiAxKSk7IFwKKyAgICAgICAgICAgICAgICBkLT5lbGVtKDUpID0gRihkLT5lbGVtKDUpLCBzLT5lbGVtKDUpLCAoKGltbSA+PiA1KSAmIDEpKTsgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNikgPSBGKGQtPmVsZW0oNiksIHMtPmVsZW0oNiksICgoaW1tID4+IDYpICYgMSkpOyBcCisgICAgICAgICAgICAgICAgZC0+ZWxlbSg3KSA9IEYoZC0+ZWxlbSg3KSwgcy0+ZWxlbSg3KSwgKChpbW0gPj4gNykgJiAxKSk7IFwKKyAgICAgICAgICAgICAgICBpZiAobnVtID4gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSg4KSA9IEYoZC0+ZWxlbSg4KSwgcy0+ZWxlbSg4KSwgKChpbW0gPj4gOCkgJiAxKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSg5KSA9IEYoZC0+ZWxlbSg5KSwgcy0+ZWxlbSg5KSwgKChpbW0gPj4gOSkgJiAxKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMCkgPSBGKGQtPmVsZW0oMTApLCBzLT5lbGVtKDEwKSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDEwKSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMSkgPSBGKGQtPmVsZW0oMTEpLCBzLT5lbGVtKDExKSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDExKSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMikgPSBGKGQtPmVsZW0oMTIpLCBzLT5lbGVtKDEyKSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDEyKSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxMykgPSBGKGQtPmVsZW0oMTMpLCBzLT5lbGVtKDEzKSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDEzKSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxNCkgPSBGKGQtPmVsZW0oMTQpLCBzLT5lbGVtKDE0KSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDE0KSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZC0+ZWxlbSgxNSkgPSBGKGQtPmVsZW0oMTUpLCBzLT5lbGVtKDE1KSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW1tID4+IDE1KSAmIDEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8qIFNTRTQuMSBvcCBoZWxwZXJzICovCisjZGVmaW5lIEZCTEVORFZCKGQsIHMsIG0pICgobSAmIDB4ODApID8gcyA6IGQpCisjZGVmaW5lIEZCTEVORFZQUyhkLCBzLCBtKSAoKG0gJiAweDgwMDAwMDAwKSA/IHMgOiBkKQorI2RlZmluZSBGQkxFTkRWUEQoZCwgcywgbSkgKChtICYgMHg4MDAwMDAwMDAwMDAwMDAwTEwpID8gcyA6IGQpCitTU0VfSEVMUEVSX1YoaGVscGVyX3BibGVuZHZiLCBCLCAxNiwgRkJMRU5EVkIpCitTU0VfSEVMUEVSX1YoaGVscGVyX2JsZW5kdnBzLCBMLCA0LCBGQkxFTkRWUFMpCitTU0VfSEVMUEVSX1YoaGVscGVyX2JsZW5kdnBkLCBRLCAyLCBGQkxFTkRWUEQpCisKK3ZvaWQgZ2x1ZShoZWxwZXJfcHRlc3QsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgdWludDY0X3QgemYgPSAocy0+USgwKSAmICBkLT5RKDApKSB8IChzLT5RKDEpICYgIGQtPlEoMSkpOworICAgIHVpbnQ2NF90IGNmID0gKHMtPlEoMCkgJiB+ZC0+USgwKSkgfCAocy0+USgxKSAmIH5kLT5RKDEpKTsKKworICAgIENDX1NSQyA9ICh6ZiA/IDAgOiBDQ19aKSB8IChjZiA/IDAgOiBDQ19DKTsKK30KKworI2RlZmluZSBTU0VfSEVMUEVSX0YobmFtZSwgZWxlbSwgbnVtLCBGKSAgICAgICAgXAorICAgIHZvaWQgZ2x1ZShuYW1lLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5lbGVtKDApID0gRigwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkLT5lbGVtKDEpID0gRigxKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobnVtID4gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZC0+ZWxlbSgyKSA9IEYoMik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZC0+ZWxlbSgzKSA9IEYoMyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bSA+IDQpIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNCkgPSBGKDQpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNSkgPSBGKDUpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNikgPSBGKDYpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQtPmVsZW0oNykgPSBGKDcpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworU1NFX0hFTFBFUl9GKGhlbHBlcl9wbW92c3hidywgVywgOCwgKGludDhfdCkgcy0+QikKK1NTRV9IRUxQRVJfRihoZWxwZXJfcG1vdnN4YmQsIEwsIDQsIChpbnQ4X3QpIHMtPkIpCitTU0VfSEVMUEVSX0YoaGVscGVyX3Btb3ZzeGJxLCBRLCAyLCAoaW50OF90KSBzLT5CKQorU1NFX0hFTFBFUl9GKGhlbHBlcl9wbW92c3h3ZCwgTCwgNCwgKGludDE2X3QpIHMtPlcpCitTU0VfSEVMUEVSX0YoaGVscGVyX3Btb3ZzeHdxLCBRLCAyLCAoaW50MTZfdCkgcy0+VykKK1NTRV9IRUxQRVJfRihoZWxwZXJfcG1vdnN4ZHEsIFEsIDIsIChpbnQzMl90KSBzLT5MKQorU1NFX0hFTFBFUl9GKGhlbHBlcl9wbW92enhidywgVywgOCwgcy0+QikKK1NTRV9IRUxQRVJfRihoZWxwZXJfcG1vdnp4YmQsIEwsIDQsIHMtPkIpCitTU0VfSEVMUEVSX0YoaGVscGVyX3Btb3Z6eGJxLCBRLCAyLCBzLT5CKQorU1NFX0hFTFBFUl9GKGhlbHBlcl9wbW92enh3ZCwgTCwgNCwgcy0+VykKK1NTRV9IRUxQRVJfRihoZWxwZXJfcG1vdnp4d3EsIFEsIDIsIHMtPlcpCitTU0VfSEVMUEVSX0YoaGVscGVyX3Btb3Z6eGRxLCBRLCAyLCBzLT5MKQorCit2b2lkIGdsdWUoaGVscGVyX3BtdWxkcSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBkLT5RKDApID0gKGludDY0X3QpKGludDMyX3QpIGQtPkwoMCkgKiAoaW50MzJfdCkgcy0+TCgwKTsKKyAgICBkLT5RKDEpID0gKGludDY0X3QpKGludDMyX3QpIGQtPkwoMikgKiAoaW50MzJfdCkgcy0+TCgyKTsKK30KKworI2RlZmluZSBGQ01QRVFRKGQsIHMpIChkID09IHMgPyAtMSA6IDApCitTU0VfSEVMUEVSX1EoaGVscGVyX3BjbXBlcXEsIEZDTVBFUVEpCisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGFja3VzZHcsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgZC0+VygwKSA9IHNhdHV3KChpbnQzMl90KSBkLT5MKDApKTsKKyAgICBkLT5XKDEpID0gc2F0dXcoKGludDMyX3QpIGQtPkwoMSkpOworICAgIGQtPlcoMikgPSBzYXR1dygoaW50MzJfdCkgZC0+TCgyKSk7CisgICAgZC0+VygzKSA9IHNhdHV3KChpbnQzMl90KSBkLT5MKDMpKTsKKyAgICBkLT5XKDQpID0gc2F0dXcoKGludDMyX3QpIHMtPkwoMCkpOworICAgIGQtPlcoNSkgPSBzYXR1dygoaW50MzJfdCkgcy0+TCgxKSk7CisgICAgZC0+Vyg2KSA9IHNhdHV3KChpbnQzMl90KSBzLT5MKDIpKTsKKyAgICBkLT5XKDcpID0gc2F0dXcoKGludDMyX3QpIHMtPkwoMykpOworfQorCisjZGVmaW5lIEZNSU5TQihkLCBzKSBNSU4oKGludDhfdClkLCAoaW50OF90KXMpCisjZGVmaW5lIEZNSU5TRChkLCBzKSBNSU4oKGludDMyX3QpZCwgKGludDMyX3QpcykKKyNkZWZpbmUgRk1BWFNCKGQsIHMpIE1BWCgoaW50OF90KWQsIChpbnQ4X3QpcykKKyNkZWZpbmUgRk1BWFNEKGQsIHMpIE1BWCgoaW50MzJfdClkLCAoaW50MzJfdClzKQorU1NFX0hFTFBFUl9CKGhlbHBlcl9wbWluc2IsIEZNSU5TQikKK1NTRV9IRUxQRVJfTChoZWxwZXJfcG1pbnNkLCBGTUlOU0QpCitTU0VfSEVMUEVSX1coaGVscGVyX3BtaW51dywgTUlOKQorU1NFX0hFTFBFUl9MKGhlbHBlcl9wbWludWQsIE1JTikKK1NTRV9IRUxQRVJfQihoZWxwZXJfcG1heHNiLCBGTUFYU0IpCitTU0VfSEVMUEVSX0woaGVscGVyX3BtYXhzZCwgRk1BWFNEKQorU1NFX0hFTFBFUl9XKGhlbHBlcl9wbWF4dXcsIE1BWCkKK1NTRV9IRUxQRVJfTChoZWxwZXJfcG1heHVkLCBNQVgpCisKKyNkZWZpbmUgRk1VTExEKGQsIHMpICgoaW50MzJfdClkICogKGludDMyX3QpcykKK1NTRV9IRUxQRVJfTChoZWxwZXJfcG11bGxkLCBGTVVMTEQpCisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGhtaW5wb3N1dywgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgaWR4ID0gMDsKKworICAgIGlmIChzLT5XKDEpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDE7CisgICAgfQorICAgIGlmIChzLT5XKDIpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDI7CisgICAgfQorICAgIGlmIChzLT5XKDMpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDM7CisgICAgfQorICAgIGlmIChzLT5XKDQpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDQ7CisgICAgfQorICAgIGlmIChzLT5XKDUpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDU7CisgICAgfQorICAgIGlmIChzLT5XKDYpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDY7CisgICAgfQorICAgIGlmIChzLT5XKDcpIDwgcy0+VyhpZHgpKSB7CisgICAgICAgIGlkeCA9IDc7CisgICAgfQorCisgICAgZC0+USgxKSA9IDA7CisgICAgZC0+TCgxKSA9IDA7CisgICAgZC0+VygxKSA9IGlkeDsKKyAgICBkLT5XKDApID0gcy0+VyhpZHgpOworfQorCit2b2lkIGdsdWUoaGVscGVyX3JvdW5kcHMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9kZSkKK3sKKyAgICBzaWduZWQgY2hhciBwcmV2X3JvdW5kaW5nX21vZGU7CisKKyAgICBwcmV2X3JvdW5kaW5nX21vZGUgPSBlbnYtPnNzZV9zdGF0dXMuZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICBpZiAoIShtb2RlICYgKDEgPDwgMikpKSB7CisgICAgICAgIHN3aXRjaCAobW9kZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF9kb3duLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF91cCwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfdG9femVybywgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGQtPlhNTV9TKDApID0gZmxvYXQzMl9yb3VuZF90b19pbnQocy0+WE1NX1MoMCksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDEpID0gZmxvYXQzMl9yb3VuZF90b19pbnQocy0+WE1NX1MoMSksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDIpID0gZmxvYXQzMl9yb3VuZF90b19pbnQocy0+WE1NX1MoMiksICZlbnYtPnNzZV9zdGF0dXMpOworICAgIGQtPlhNTV9TKDMpID0gZmxvYXQzMl9yb3VuZF90b19pbnQocy0+WE1NX1MoMyksICZlbnYtPnNzZV9zdGF0dXMpOworCisjaWYgMCAvKiBUT0RPICovCisgICAgaWYgKG1vZGUgJiAoMSA8PCAzKSkgeworICAgICAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKGdldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoJmVudi0+c3NlX3N0YXR1cykgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5mbG9hdF9mbGFnX2luZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgfQorI2VuZGlmCisgICAgZW52LT5zc2Vfc3RhdHVzLmZsb2F0X3JvdW5kaW5nX21vZGUgPSBwcmV2X3JvdW5kaW5nX21vZGU7Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcm91bmRwZCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtb2RlKQoreworICAgIHNpZ25lZCBjaGFyIHByZXZfcm91bmRpbmdfbW9kZTsKKworICAgIHByZXZfcm91bmRpbmdfbW9kZSA9IGVudi0+c3NlX3N0YXR1cy5mbG9hdF9yb3VuZGluZ19tb2RlOworICAgIGlmICghKG1vZGUgJiAoMSA8PCAyKSkpIHsKKyAgICAgICAgc3dpdGNoIChtb2RlICYgMykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4sICZlbnYtPnNzZV9zdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX2Rvd24sICZlbnYtPnNzZV9zdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX3VwLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF90b196ZXJvLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+WE1NX0QoMCkgPSBmbG9hdDY0X3JvdW5kX3RvX2ludChzLT5YTU1fRCgwKSwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgZC0+WE1NX0QoMSkgPSBmbG9hdDY0X3JvdW5kX3RvX2ludChzLT5YTU1fRCgxKSwgJmVudi0+c3NlX3N0YXR1cyk7CisKKyNpZiAwIC8qIFRPRE8gKi8KKyAgICBpZiAobW9kZSAmICgxIDw8IDMpKSB7CisgICAgICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoZ2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygmZW52LT5zc2Vfc3RhdHVzKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfmZsb2F0X2ZsYWdfaW5leGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICB9CisjZW5kaWYKKyAgICBlbnYtPnNzZV9zdGF0dXMuZmxvYXRfcm91bmRpbmdfbW9kZSA9IHByZXZfcm91bmRpbmdfbW9kZTsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9yb3VuZHNzLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vZGUpCit7CisgICAgc2lnbmVkIGNoYXIgcHJldl9yb3VuZGluZ19tb2RlOworCisgICAgcHJldl9yb3VuZGluZ19tb2RlID0gZW52LT5zc2Vfc3RhdHVzLmZsb2F0X3JvdW5kaW5nX21vZGU7CisgICAgaWYgKCEobW9kZSAmICgxIDw8IDIpKSkgeworICAgICAgICBzd2l0Y2ggKG1vZGUgJiAzKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfZG93biwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfdXAsICZlbnYtPnNzZV9zdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX3RvX3plcm8sICZlbnYtPnNzZV9zdGF0dXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5YTU1fUygwKSA9IGZsb2F0MzJfcm91bmRfdG9faW50KHMtPlhNTV9TKDApLCAmZW52LT5zc2Vfc3RhdHVzKTsKKworI2lmIDAgLyogVE9ETyAqLworICAgIGlmIChtb2RlICYgKDEgPDwgMykpIHsKKyAgICAgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncyhnZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKCZlbnYtPnNzZV9zdGF0dXMpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+ZmxvYXRfZmxhZ19pbmV4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpOworICAgIH0KKyNlbmRpZgorICAgIGVudi0+c3NlX3N0YXR1cy5mbG9hdF9yb3VuZGluZ19tb2RlID0gcHJldl9yb3VuZGluZ19tb2RlOworfQorCit2b2lkIGdsdWUoaGVscGVyX3JvdW5kc2QsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9kZSkKK3sKKyAgICBzaWduZWQgY2hhciBwcmV2X3JvdW5kaW5nX21vZGU7CisKKyAgICBwcmV2X3JvdW5kaW5nX21vZGUgPSBlbnYtPnNzZV9zdGF0dXMuZmxvYXRfcm91bmRpbmdfbW9kZTsKKyAgICBpZiAoIShtb2RlICYgKDEgPDwgMikpKSB7CisgICAgICAgIHN3aXRjaCAobW9kZSAmIDMpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF9kb3duLCAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF91cCwgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfdG9femVybywgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGQtPlhNTV9EKDApID0gZmxvYXQ2NF9yb3VuZF90b19pbnQocy0+WE1NX0QoMCksICZlbnYtPnNzZV9zdGF0dXMpOworCisjaWYgMCAvKiBUT0RPICovCisgICAgaWYgKG1vZGUgJiAoMSA8PCAzKSkgeworICAgICAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKGdldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoJmVudi0+c3NlX3N0YXR1cykgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5mbG9hdF9mbGFnX2luZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgfQorI2VuZGlmCisgICAgZW52LT5zc2Vfc3RhdHVzLmZsb2F0X3JvdW5kaW5nX21vZGUgPSBwcmV2X3JvdW5kaW5nX21vZGU7Cit9CisKKyNkZWZpbmUgRkJMRU5EUChkLCBzLCBtKSAobSA/IHMgOiBkKQorU1NFX0hFTFBFUl9JKGhlbHBlcl9ibGVuZHBzLCBMLCA0LCBGQkxFTkRQKQorU1NFX0hFTFBFUl9JKGhlbHBlcl9ibGVuZHBkLCBRLCAyLCBGQkxFTkRQKQorU1NFX0hFTFBFUl9JKGhlbHBlcl9wYmxlbmR3LCBXLCA4LCBGQkxFTkRQKQorCit2b2lkIGdsdWUoaGVscGVyX2RwcHMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsIHVpbnQzMl90IG1hc2spCit7CisgICAgZmxvYXQzMiBpcmVzdWx0ID0gZmxvYXQzMl96ZXJvOworCisgICAgaWYgKG1hc2sgJiAoMSA8PCA0KSkgeworICAgICAgICBpcmVzdWx0ID0gZmxvYXQzMl9hZGQoaXJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0MzJfbXVsKGQtPlhNTV9TKDApLCBzLT5YTU1fUygwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgfQorICAgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICAgICAgaXJlc3VsdCA9IGZsb2F0MzJfYWRkKGlyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDMyX211bChkLT5YTU1fUygxKSwgcy0+WE1NX1MoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5zc2Vfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpOworICAgIH0KKyAgICBpZiAobWFzayAmICgxIDw8IDYpKSB7CisgICAgICAgIGlyZXN1bHQgPSBmbG9hdDMyX2FkZChpcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQzMl9tdWwoZC0+WE1NX1MoMiksIHMtPlhNTV9TKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5zc2Vfc3RhdHVzKTsKKyAgICB9CisgICAgaWYgKG1hc2sgJiAoMSA8PCA3KSkgeworICAgICAgICBpcmVzdWx0ID0gZmxvYXQzMl9hZGQoaXJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0MzJfbXVsKGQtPlhNTV9TKDMpLCBzLT5YTU1fUygzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgfQorICAgIGQtPlhNTV9TKDApID0gKG1hc2sgJiAoMSA8PCAwKSkgPyBpcmVzdWx0IDogZmxvYXQzMl96ZXJvOworICAgIGQtPlhNTV9TKDEpID0gKG1hc2sgJiAoMSA8PCAxKSkgPyBpcmVzdWx0IDogZmxvYXQzMl96ZXJvOworICAgIGQtPlhNTV9TKDIpID0gKG1hc2sgJiAoMSA8PCAyKSkgPyBpcmVzdWx0IDogZmxvYXQzMl96ZXJvOworICAgIGQtPlhNTV9TKDMpID0gKG1hc2sgJiAoMSA8PCAzKSkgPyBpcmVzdWx0IDogZmxvYXQzMl96ZXJvOworfQorCit2b2lkIGdsdWUoaGVscGVyX2RwcGQsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsIHVpbnQzMl90IG1hc2spCit7CisgICAgZmxvYXQ2NCBpcmVzdWx0ID0gZmxvYXQ2NF96ZXJvOworCisgICAgaWYgKG1hc2sgJiAoMSA8PCA0KSkgeworICAgICAgICBpcmVzdWx0ID0gZmxvYXQ2NF9hZGQoaXJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NjRfbXVsKGQtPlhNTV9EKDApLCBzLT5YTU1fRCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudi0+c3NlX3N0YXR1cyk7CisgICAgfQorICAgIGlmIChtYXNrICYgKDEgPDwgNSkpIHsKKyAgICAgICAgaXJlc3VsdCA9IGZsb2F0NjRfYWRkKGlyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdDY0X211bChkLT5YTU1fRCgxKSwgcy0+WE1NX0QoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52LT5zc2Vfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbnYtPnNzZV9zdGF0dXMpOworICAgIH0KKyAgICBkLT5YTU1fRCgwKSA9IChtYXNrICYgKDEgPDwgMCkpID8gaXJlc3VsdCA6IGZsb2F0NjRfemVybzsKKyAgICBkLT5YTU1fRCgxKSA9IChtYXNrICYgKDEgPDwgMSkpID8gaXJlc3VsdCA6IGZsb2F0NjRfemVybzsKK30KKwordm9pZCBnbHVlKGhlbHBlcl9tcHNhZGJ3LCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCkKK3sKKyAgICBpbnQgczAgPSAob2Zmc2V0ICYgMykgPDwgMjsKKyAgICBpbnQgZDAgPSAob2Zmc2V0ICYgNCkgPDwgMDsKKyAgICBpbnQgaTsKKyAgICBSZWcgcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGQwKyspIHsKKyAgICAgICAgci5XKGkpID0gMDsKKyAgICAgICAgci5XKGkpICs9IGFiczEoZC0+QihkMCArIDApIC0gcy0+QihzMCArIDApKTsKKyAgICAgICAgci5XKGkpICs9IGFiczEoZC0+QihkMCArIDEpIC0gcy0+QihzMCArIDEpKTsKKyAgICAgICAgci5XKGkpICs9IGFiczEoZC0+QihkMCArIDIpIC0gcy0+QihzMCArIDIpKTsKKyAgICAgICAgci5XKGkpICs9IGFiczEoZC0+QihkMCArIDMpIC0gcy0+QihzMCArIDMpKTsKKyAgICB9CisKKyAgICAqZCA9IHI7Cit9CisKKy8qIFNTRTQuMiBvcCBoZWxwZXJzICovCisjZGVmaW5lIEZDTVBHVFEoZCwgcykgKChpbnQ2NF90KWQgPiAoaW50NjRfdClzID8gLTEgOiAwKQorU1NFX0hFTFBFUl9RKGhlbHBlcl9wY21wZ3RxLCBGQ01QR1RRKQorCitzdGF0aWMgaW5saW5lIGludCBwY21wX2VsZW4oQ1BVWDg2U3RhdGUgKmVudiwgaW50IHJlZywgdWludDMyX3QgY3RybCkKK3sKKyAgICBpbnQgdmFsOworCisgICAgLyogUHJlc2VuY2Ugb2YgUkVYLlcgaXMgaW5kaWNhdGVkIGJ5IGEgYml0IGhpZ2hlciB0aGFuIDcgc2V0ICovCisgICAgaWYgKGN0cmwgPj4gOCkgeworICAgICAgICB2YWwgPSBhYnMxKChpbnQ2NF90KWVudi0+cmVnc1tyZWddKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWwgPSBhYnMxKChpbnQzMl90KWVudi0+cmVnc1tyZWddKTsKKyAgICB9CisKKyAgICBpZiAoY3RybCAmIDEpIHsKKyAgICAgICAgaWYgKHZhbCA+IDgpIHsKKyAgICAgICAgICAgIHJldHVybiA4OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZhbCA+IDE2KSB7CisgICAgICAgICAgICByZXR1cm4gMTY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGNtcF9pbGVuKFJlZyAqciwgdWludDhfdCBjdHJsKQoreworICAgIGludCB2YWwgPSAwOworCisgICAgaWYgKGN0cmwgJiAxKSB7CisgICAgICAgIHdoaWxlICh2YWwgPCA4ICYmIHItPlcodmFsKSkgeworICAgICAgICAgICAgdmFsKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAodmFsIDwgMTYgJiYgci0+Qih2YWwpKSB7CisgICAgICAgICAgICB2YWwrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBjbXBfdmFsKFJlZyAqciwgdWludDhfdCBjdHJsLCBpbnQgaSkKK3sKKyAgICBzd2l0Y2ggKChjdHJsID4+IDApICYgMykgeworICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuIHItPkIoaSk7CisgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gci0+VyhpKTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiAoaW50OF90KXItPkIoaSk7CisgICAgY2FzZSAzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoaW50MTZfdClyLT5XKGkpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBwY21weHN0cngoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgY3RybCwgaW50IHZhbGlkcywgaW50IHZhbGlkZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzID0gMDsKKyAgICBpbnQgdjsKKyAgICBpbnQgaiwgaTsKKyAgICBpbnQgdXBwZXIgPSAoY3RybCAmIDEpID8gNyA6IDE1OworCisgICAgdmFsaWRzLS07CisgICAgdmFsaWRkLS07CisKKyAgICBDQ19TUkMgPSAodmFsaWRzIDwgdXBwZXIgPyBDQ19aIDogMCkgfCAodmFsaWRkIDwgdXBwZXIgPyBDQ19TIDogMCk7CisKKyAgICBzd2l0Y2ggKChjdHJsID4+IDIpICYgMykgeworICAgIGNhc2UgMDoKKyAgICAgICAgZm9yIChqID0gdmFsaWRzOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgcmVzIDw8PSAxOworICAgICAgICAgICAgdiA9IHBjbXBfdmFsKHMsIGN0cmwsIGopOworICAgICAgICAgICAgZm9yIChpID0gdmFsaWRkOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHJlcyB8PSAodiA9PSBwY21wX3ZhbChkLCBjdHJsLCBpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBmb3IgKGogPSB2YWxpZHM7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICByZXMgPDw9IDE7CisgICAgICAgICAgICB2ID0gcGNtcF92YWwocywgY3RybCwgaik7CisgICAgICAgICAgICBmb3IgKGkgPSAoKHZhbGlkZCAtIDEpIHwgMSk7IGkgPj0gMDsgaSAtPSAyKSB7CisgICAgICAgICAgICAgICAgcmVzIHw9IChwY21wX3ZhbChkLCBjdHJsLCBpIC0gMCkgPj0gdiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGNtcF92YWwoZCwgY3RybCwgaSAtIDEpIDw9IHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcmVzID0gKDEgPDwgKHVwcGVyIC0gTUFYKHZhbGlkcywgdmFsaWRkKSkpIC0gMTsKKyAgICAgICAgcmVzIDw8PSBNQVgodmFsaWRzLCB2YWxpZGQpIC0gTUlOKHZhbGlkcywgdmFsaWRkKTsKKyAgICAgICAgZm9yIChpID0gTUlOKHZhbGlkcywgdmFsaWRkKTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHJlcyA8PD0gMTsKKyAgICAgICAgICAgIHYgPSBwY21wX3ZhbChzLCBjdHJsLCBpKTsKKyAgICAgICAgICAgIHJlcyB8PSAodiA9PSBwY21wX3ZhbChkLCBjdHJsLCBpKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBmb3IgKGogPSB2YWxpZHMgLSB2YWxpZGQ7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICByZXMgPDw9IDE7CisgICAgICAgICAgICB2ID0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IE1JTih1cHBlciAtIGosIHZhbGlkZCk7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdiAmPSAocGNtcF92YWwocywgY3RybCwgaSArIGopID09IHBjbXBfdmFsKGQsIGN0cmwsIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyB8PSB2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoKGN0cmwgPj4gNCkgJiAzKSB7CisgICAgY2FzZSAxOgorICAgICAgICByZXMgXj0gKDIgPDwgdXBwZXIpIC0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICByZXMgXj0gKDEgPDwgKHZhbGlkcyArIDEpKSAtIDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChyZXMpIHsKKyAgICAgICAgQ0NfU1JDIHw9IENDX0M7CisgICAgfQorICAgIGlmIChyZXMgJiAxKSB7CisgICAgICAgIENDX1NSQyB8PSBDQ19POworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfcGNtcGVzdHJpLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsIFJlZyAqZCwgUmVnICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3RybCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgcmVzID0gcGNtcHhzdHJ4KGVudiwgZCwgcywgY3RybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXBfZWxlbihlbnYsIFJfRURYLCBjdHJsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjbXBfZWxlbihlbnYsIFJfRUFYLCBjdHJsKSk7CisKKyAgICBpZiAocmVzKSB7CisgICAgICAgIGVudi0+cmVnc1tSX0VDWF0gPSAoY3RybCAmICgxIDw8IDYpKSA/IDMxIC0gY2x6MzIocmVzKSA6IGN0ejMyKHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5yZWdzW1JfRUNYXSA9IDE2ID4+IChjdHJsICYgKDEgPDwgMCkpOworICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9wY21wZXN0cm0sIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdHJsKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCByZXMgPSBwY21weHN0cngoZW52LCBkLCBzLCBjdHJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcF9lbGVuKGVudiwgUl9FRFgsIGN0cmwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcF9lbGVuKGVudiwgUl9FQVgsIGN0cmwpKTsKKworICAgIGlmICgoY3RybCA+PiA2KSAmIDEpIHsKKyAgICAgICAgaWYgKGN0cmwgJiAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCByZXMgPj49IDEpIHsKKyAgICAgICAgICAgICAgICBlbnYtPnhtbV9yZWdzWzBdLlcoaSkgPSAocmVzICYgMSkgPyB+MCA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgcmVzID4+PSAxKSB7CisgICAgICAgICAgICAgICAgZW52LT54bW1fcmVnc1swXS5CKGkpID0gKHJlcyAmIDEpID8gfjAgOiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT54bW1fcmVnc1swXS5RKDEpID0gMDsKKyAgICAgICAgZW52LT54bW1fcmVnc1swXS5RKDApID0gcmVzOworICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9wY21waXN0cmksIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdHJsKQoreworICAgIHVuc2lnbmVkIGludCByZXMgPSBwY21weHN0cngoZW52LCBkLCBzLCBjdHJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcF9pbGVuKHMsIGN0cmwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNtcF9pbGVuKGQsIGN0cmwpKTsKKworICAgIGlmIChyZXMpIHsKKyAgICAgICAgZW52LT5yZWdzW1JfRUNYXSA9IChjdHJsICYgKDEgPDwgNikpID8gMzEgLSBjbHozMihyZXMpIDogY3R6MzIocmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPnJlZ3NbUl9FQ1hdID0gMTYgPj4gKGN0cmwgJiAoMSA8PCAwKSk7CisgICAgfQorfQorCit2b2lkIGdsdWUoaGVscGVyX3BjbXBpc3RybSwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN0cmwpCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgaW50IHJlcyA9IHBjbXB4c3RyeChlbnYsIGQsIHMsIGN0cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21wX2lsZW4ocywgY3RybCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21wX2lsZW4oZCwgY3RybCkpOworCisgICAgaWYgKChjdHJsID4+IDYpICYgMSkgeworICAgICAgICBpZiAoY3RybCAmIDEpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIHJlcyA+Pj0gMSkgeworICAgICAgICAgICAgICAgIGVudi0+eG1tX3JlZ3NbMF0uVyhpKSA9IChyZXMgJiAxKSA/IH4wIDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrLCByZXMgPj49IDEpIHsKKyAgICAgICAgICAgICAgICBlbnYtPnhtbV9yZWdzWzBdLkIoaSkgPSAocmVzICYgMSkgPyB+MCA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPnhtbV9yZWdzWzBdLlEoMSkgPSAwOworICAgICAgICBlbnYtPnhtbV9yZWdzWzBdLlEoMCkgPSByZXM7CisgICAgfQorfQorCisjZGVmaW5lIENSQ1BPTFkgICAgICAgIDB4MWVkYzZmNDEKKyNkZWZpbmUgQ1JDUE9MWV9CSVRSRVYgMHg4MmY2M2I3OAordGFyZ2V0X3Vsb25nIGhlbHBlcl9jcmMzMih1aW50MzJfdCBjcmMxLCB0YXJnZXRfdWxvbmcgbXNnLCB1aW50MzJfdCBsZW4pCit7CisgICAgdGFyZ2V0X3Vsb25nIGNyYyA9IChtc2cgJiAoKHRhcmdldF91bG9uZykgLTEgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEFSR0VUX0xPTkdfQklUUyAtIGxlbikpKSBeIGNyYzE7CisKKyAgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICAgY3JjID0gKGNyYyA+PiAxKSBeICgoY3JjICYgMSkgPyBDUkNQT0xZX0JJVFJFViA6IDApOworICAgIH0KKworICAgIHJldHVybiBjcmM7Cit9CisKKyNkZWZpbmUgUE9QTUFTSyhpKSAgICAgKCh0YXJnZXRfdWxvbmcpIC0xIC8gKCgxTEwgPDwgKDEgPDwgaSkpICsgMSkpCisjZGVmaW5lIFBPUENPVU5UKG4sIGkpICgobiAmIFBPUE1BU0soaSkpICsgKChuID4+ICgxIDw8IGkpKSAmIFBPUE1BU0soaSkpKQordGFyZ2V0X3Vsb25nIGhlbHBlcl9wb3BjbnQoQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIG4sIHVpbnQzMl90IHR5cGUpCit7CisgICAgQ0NfU1JDID0gbiA/IDAgOiBDQ19aOworCisgICAgbiA9IFBPUENPVU5UKG4sIDApOworICAgIG4gPSBQT1BDT1VOVChuLCAxKTsKKyAgICBuID0gUE9QQ09VTlQobiwgMik7CisgICAgbiA9IFBPUENPVU5UKG4sIDMpOworICAgIGlmICh0eXBlID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG4gJiAweGZmOworICAgIH0KKworICAgIG4gPSBQT1BDT1VOVChuLCA0KTsKKyNpZm5kZWYgVEFSR0VUX1g4Nl82NAorICAgIHJldHVybiBuOworI2Vsc2UKKyAgICBpZiAodHlwZSA9PSAyKSB7CisgICAgICAgIHJldHVybiBuICYgMHhmZjsKKyAgICB9CisKKyAgICByZXR1cm4gUE9QQ09VTlQobiwgNSk7CisjZW5kaWYKK30KKwordm9pZCBnbHVlKGhlbHBlcl9wY2xtdWxxZHEsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdHJsKQoreworICAgIHVpbnQ2NF90IGFoLCBhbCwgYiwgcmVzaCwgcmVzbDsKKworICAgIGFoID0gMDsKKyAgICBhbCA9IGQtPlEoKGN0cmwgJiAxKSAhPSAwKTsKKyAgICBiID0gcy0+USgoY3RybCAmIDE2KSAhPSAwKTsKKyAgICByZXNoID0gcmVzbCA9IDA7CisKKyAgICB3aGlsZSAoYikgeworICAgICAgICBpZiAoYiAmIDEpIHsKKyAgICAgICAgICAgIHJlc2wgXj0gYWw7CisgICAgICAgICAgICByZXNoIF49IGFoOworICAgICAgICB9CisgICAgICAgIGFoID0gKGFoIDw8IDEpIHwgKGFsID4+IDYzKTsKKyAgICAgICAgYWwgPDw9IDE7CisgICAgICAgIGIgPj49IDE7CisgICAgfQorCisgICAgZC0+USgwKSA9IHJlc2w7CisgICAgZC0+USgxKSA9IHJlc2g7Cit9CisKKy8qIEFFUy1OSSBvcCBoZWxwZXJzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBhZXNfc2hpZnRzWzE2XSA9IHsKKyAgICAwLCA1LCAxMCwgMTUsIDQsIDksIDE0LCAzLCA4LCAxMywgMiwgNywgMTIsIDEsIDYsIDExCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhZXNfaXNoaWZ0c1sxNl0gPSB7CisgICAgMCwgMTMsIDEwLCA3LCA0LCAxLCAxNCwgMTEsIDgsIDUsIDIsIDE1LCAxMiwgOSwgNiwgMworfTsKKwordm9pZCBnbHVlKGhlbHBlcl9hZXNkZWMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IGk7CisgICAgUmVnIHN0ID0gKmQ7CisgICAgUmVnIHJrID0gKnM7CisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZC0+TChpKSA9IHJrLkwoaSkgXiBic3dhcDMyKEFFU19UZDBbc3QuQihhZXNfaXNoaWZ0c1s0KmkrMF0pXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQxW3N0LkIoYWVzX2lzaGlmdHNbNCppKzFdKV0gXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMltzdC5CKGFlc19pc2hpZnRzWzQqaSsyXSldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDNbc3QuQihhZXNfaXNoaWZ0c1s0KmkrM10pXSk7CisgICAgfQorfQorCit2b2lkIGdsdWUoaGVscGVyX2Flc2RlY2xhc3QsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IGk7CisgICAgUmVnIHN0ID0gKmQ7CisgICAgUmVnIHJrID0gKnM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBkLT5CKGkpID0gcmsuQihpKSBeIChBRVNfVGQ0W3N0LkIoYWVzX2lzaGlmdHNbaV0pXSAmIDB4ZmYpOworICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9hZXNlbmMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IGk7CisgICAgUmVnIHN0ID0gKmQ7CisgICAgUmVnIHJrID0gKnM7CisKKyAgICBmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgZC0+TChpKSA9IHJrLkwoaSkgXiBic3dhcDMyKEFFU19UZTBbc3QuQihhZXNfc2hpZnRzWzQqaSswXSldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZTFbc3QuQihhZXNfc2hpZnRzWzQqaSsxXSldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZTJbc3QuQihhZXNfc2hpZnRzWzQqaSsyXSldIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZTNbc3QuQihhZXNfc2hpZnRzWzQqaSszXSldKTsKKyAgICB9Cit9CisKK3ZvaWQgZ2x1ZShoZWxwZXJfYWVzZW5jbGFzdCwgU1VGRklYKShDUFVYODZTdGF0ZSAqZW52LCBSZWcgKmQsIFJlZyAqcykKK3sKKyAgICBpbnQgaTsKKyAgICBSZWcgc3QgPSAqZDsKKyAgICBSZWcgcmsgPSAqczsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgIGQtPkIoaSkgPSByay5CKGkpIF4gKEFFU19UZTRbc3QuQihhZXNfc2hpZnRzW2ldKV0gJiAweGZmKTsKKyAgICB9CisKK30KKwordm9pZCBnbHVlKGhlbHBlcl9hZXNpbWMsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMpCit7CisgICAgaW50IGk7CisgICAgUmVnIHRtcCA9ICpzOworCisgICAgZm9yIChpID0gMCA7IGkgPCA0IDsgaSsrKSB7CisgICAgICAgIGQtPkwoaSkgPSBic3dhcDMyKEFFU19UZDBbQUVTX1RlNFt0bXAuQig0KmkrMCldICYgMHhmZl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQxW0FFU19UZTRbdG1wLkIoNCppKzEpXSAmIDB4ZmZdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMltBRVNfVGU0W3RtcC5CKDQqaSsyKV0gJiAweGZmXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDNbQUVTX1RlNFt0bXAuQig0KmkrMyldICYgMHhmZl0pOworICAgIH0KK30KKwordm9pZCBnbHVlKGhlbHBlcl9hZXNrZXlnZW5hc3Npc3QsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwgUmVnICpkLCBSZWcgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdHJsKQoreworICAgIGludCBpOworICAgIFJlZyB0bXAgPSAqczsKKworICAgIGZvciAoaSA9IDAgOyBpIDwgNCA7IGkrKykgeworICAgICAgICBkLT5CKGkpID0gQUVTX1RlNFt0bXAuQihpICsgNCldICYgMHhmZjsKKyAgICAgICAgZC0+QihpICsgOCkgPSBBRVNfVGU0W3RtcC5CKGkgKyAxMildICYgMHhmZjsKKyAgICB9CisgICAgZC0+TCgxKSA9IChkLT5MKDApIDw8IDI0IHwgZC0+TCgwKSA+PiA4KSBeIGN0cmw7CisgICAgZC0+TCgzKSA9IChkLT5MKDIpIDw8IDI0IHwgZC0+TCgyKSA+PiA4KSBeIGN0cmw7Cit9CisjZW5kaWYKKworI3VuZGVmIFNISUZUCisjdW5kZWYgWE1NX09OTFkKKyN1bmRlZiBSZWcKKyN1bmRlZiBCCisjdW5kZWYgVworI3VuZGVmIEwKKyN1bmRlZiBRCisjdW5kZWYgU1VGRklYCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L29wc19zc2VfaGVhZGVyLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L29wc19zc2VfaGVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4YzdjYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvb3BzX3NzZV9oZWFkZXIuaApAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqICBNTVgvM0ROb3chL1NTRS9TU0UyL1NTRTMvU1NTRTMvU1NFNC9QTkkgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDUgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWYgU0hJRlQgPT0gMAorI2RlZmluZSBSZWcgTU1YUmVnCisjZGVmaW5lIFNVRkZJWCBfbW14CisjZWxzZQorI2RlZmluZSBSZWcgWE1NUmVnCisjZGVmaW5lIFNVRkZJWCBfeG1tCisjZW5kaWYKKworI2RlZmluZSBkaF9hbGlhc19SZWcgcHRyCisjZGVmaW5lIGRoX2FsaWFzX1hNTVJlZyBwdHIKKyNkZWZpbmUgZGhfYWxpYXNfTU1YUmVnIHB0cgorI2RlZmluZSBkaF9jdHlwZV9SZWcgUmVnICoKKyNkZWZpbmUgZGhfY3R5cGVfWE1NUmVnIFhNTVJlZyAqCisjZGVmaW5lIGRoX2N0eXBlX01NWFJlZyBNTVhSZWcgKgorI2RlZmluZSBkaF9pc19zaWduZWRfUmVnIGRoX2lzX3NpZ25lZF9wdHIKKyNkZWZpbmUgZGhfaXNfc2lnbmVkX1hNTVJlZyBkaF9pc19zaWduZWRfcHRyCisjZGVmaW5lIGRoX2lzX3NpZ25lZF9NTVhSZWcgZGhfaXNfc2lnbmVkX3B0cgorCitERUZfSEVMUEVSXzMoZ2x1ZShwc3JsdywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBzcmF3LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocHNsbHcsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc3JsZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBzcmFkLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocHNsbGQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc3JscSwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBzbGxxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorCisjaWYgU0hJRlQgPT0gMQorREVGX0hFTFBFUl8zKGdsdWUocHNybGRxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocHNsbGRxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorI2VuZGlmCisKKyNkZWZpbmUgU1NFX0hFTFBFUl9CKG5hbWUsIEYpXAorICAgIERFRl9IRUxQRVJfMyhnbHVlKG5hbWUsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKKyNkZWZpbmUgU1NFX0hFTFBFUl9XKG5hbWUsIEYpXAorICAgIERFRl9IRUxQRVJfMyhnbHVlKG5hbWUsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKKyNkZWZpbmUgU1NFX0hFTFBFUl9MKG5hbWUsIEYpXAorICAgIERFRl9IRUxQRVJfMyhnbHVlKG5hbWUsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKKyNkZWZpbmUgU1NFX0hFTFBFUl9RKG5hbWUsIEYpXAorICAgIERFRl9IRUxQRVJfMyhnbHVlKG5hbWUsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKK1NTRV9IRUxQRVJfQihwYWRkYiwgRkFERCkKK1NTRV9IRUxQRVJfVyhwYWRkdywgRkFERCkKK1NTRV9IRUxQRVJfTChwYWRkbCwgRkFERCkKK1NTRV9IRUxQRVJfUShwYWRkcSwgRkFERCkKKworU1NFX0hFTFBFUl9CKHBzdWJiLCBGU1VCKQorU1NFX0hFTFBFUl9XKHBzdWJ3LCBGU1VCKQorU1NFX0hFTFBFUl9MKHBzdWJsLCBGU1VCKQorU1NFX0hFTFBFUl9RKHBzdWJxLCBGU1VCKQorCitTU0VfSEVMUEVSX0IocGFkZHVzYiwgRkFERFVCKQorU1NFX0hFTFBFUl9CKHBhZGRzYiwgRkFERFNCKQorU1NFX0hFTFBFUl9CKHBzdWJ1c2IsIEZTVUJVQikKK1NTRV9IRUxQRVJfQihwc3Vic2IsIEZTVUJTQikKKworU1NFX0hFTFBFUl9XKHBhZGR1c3csIEZBRERVVykKK1NTRV9IRUxQRVJfVyhwYWRkc3csIEZBRERTVykKK1NTRV9IRUxQRVJfVyhwc3VidXN3LCBGU1VCVVcpCitTU0VfSEVMUEVSX1cocHN1YnN3LCBGU1VCU1cpCisKK1NTRV9IRUxQRVJfQihwbWludWIsIEZNSU5VQikKK1NTRV9IRUxQRVJfQihwbWF4dWIsIEZNQVhVQikKKworU1NFX0hFTFBFUl9XKHBtaW5zdywgRk1JTlNXKQorU1NFX0hFTFBFUl9XKHBtYXhzdywgRk1BWFNXKQorCitTU0VfSEVMUEVSX1EocGFuZCwgRkFORCkKK1NTRV9IRUxQRVJfUShwYW5kbiwgRkFORE4pCitTU0VfSEVMUEVSX1EocG9yLCBGT1IpCitTU0VfSEVMUEVSX1EocHhvciwgRlhPUikKKworU1NFX0hFTFBFUl9CKHBjbXBndGIsIEZDTVBHVEIpCitTU0VfSEVMUEVSX1cocGNtcGd0dywgRkNNUEdUVykKK1NTRV9IRUxQRVJfTChwY21wZ3RsLCBGQ01QR1RMKQorCitTU0VfSEVMUEVSX0IocGNtcGVxYiwgRkNNUEVRKQorU1NFX0hFTFBFUl9XKHBjbXBlcXcsIEZDTVBFUSkKK1NTRV9IRUxQRVJfTChwY21wZXFsLCBGQ01QRVEpCisKK1NTRV9IRUxQRVJfVyhwbXVsbHcsIEZNVUxMVykKKyNpZiBTSElGVCA9PSAwCitTU0VfSEVMUEVSX1cocG11bGhydywgRk1VTEhSVykKKyNlbmRpZgorU1NFX0hFTFBFUl9XKHBtdWxodXcsIEZNVUxIVVcpCitTU0VfSEVMUEVSX1cocG11bGh3LCBGTVVMSFcpCisKK1NTRV9IRUxQRVJfQihwYXZnYiwgRkFWRykKK1NTRV9IRUxQRVJfVyhwYXZndywgRkFWRykKKworREVGX0hFTFBFUl8zKGdsdWUocG11bHVkcSwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBtYWRkd2QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKK0RFRl9IRUxQRVJfMyhnbHVlKHBzYWRidywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfNChnbHVlKG1hc2ttb3YsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcsIHRsKQorREVGX0hFTFBFUl8yKGdsdWUobW92bF9tbV9UMCwgU1VGRklYKSwgdm9pZCwgUmVnLCBpMzIpCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorREVGX0hFTFBFUl8yKGdsdWUobW92cV9tbV9UMCwgU1VGRklYKSwgdm9pZCwgUmVnLCBpNjQpCisjZW5kaWYKKworI2lmIFNISUZUID09IDAKK0RFRl9IRUxQRVJfMyhnbHVlKHBzaHVmdywgU1VGRklYKSwgdm9pZCwgUmVnLCBSZWcsIGludCkKKyNlbHNlCitERUZfSEVMUEVSXzMoc2h1ZnBzLCB2b2lkLCBSZWcsIFJlZywgaW50KQorREVGX0hFTFBFUl8zKHNodWZwZCwgdm9pZCwgUmVnLCBSZWcsIGludCkKK0RFRl9IRUxQRVJfMyhnbHVlKHBzaHVmZCwgU1VGRklYKSwgdm9pZCwgUmVnLCBSZWcsIGludCkKK0RFRl9IRUxQRVJfMyhnbHVlKHBzaHVmbHcsIFNVRkZJWCksIHZvaWQsIFJlZywgUmVnLCBpbnQpCitERUZfSEVMUEVSXzMoZ2x1ZShwc2h1Zmh3LCBTVUZGSVgpLCB2b2lkLCBSZWcsIFJlZywgaW50KQorI2VuZGlmCisKKyNpZiBTSElGVCA9PSAxCisvKiBGUFUgb3BzICovCisvKiBYWFg6IG5vdCBhY2N1cmF0ZSAqLworCisjZGVmaW5lIFNTRV9IRUxQRVJfUyhuYW1lLCBGKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKG5hbWUgIyMgcHMsIHZvaWQsIGVudiwgUmVnLCBSZWcpICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKG5hbWUgIyMgc3MsIHZvaWQsIGVudiwgUmVnLCBSZWcpICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKG5hbWUgIyMgcGQsIHZvaWQsIGVudiwgUmVnLCBSZWcpICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKG5hbWUgIyMgc2QsIHZvaWQsIGVudiwgUmVnLCBSZWcpCisKK1NTRV9IRUxQRVJfUyhhZGQsIEZQVV9BREQpCitTU0VfSEVMUEVSX1Moc3ViLCBGUFVfU1VCKQorU1NFX0hFTFBFUl9TKG11bCwgRlBVX01VTCkKK1NTRV9IRUxQRVJfUyhkaXYsIEZQVV9ESVYpCitTU0VfSEVMUEVSX1MobWluLCBGUFVfTUlOKQorU1NFX0hFTFBFUl9TKG1heCwgRlBVX01BWCkKK1NTRV9IRUxQRVJfUyhzcXJ0LCBGUFVfU1FSVCkKKworCitERUZfSEVMUEVSXzMoY3Z0cHMycGQsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0cGQycHMsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0c3Myc2QsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0c2Qyc3MsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0ZHEycHMsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0ZHEycGQsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoY3Z0cGkycHMsIHZvaWQsIGVudiwgWE1NUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMoY3Z0cGkycGQsIHZvaWQsIGVudiwgWE1NUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMoY3Z0c2kyc3MsIHZvaWQsIGVudiwgWE1NUmVnLCBpMzIpCitERUZfSEVMUEVSXzMoY3Z0c2kyc2QsIHZvaWQsIGVudiwgWE1NUmVnLCBpMzIpCisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitERUZfSEVMUEVSXzMoY3Z0c3Eyc3MsIHZvaWQsIGVudiwgWE1NUmVnLCBpNjQpCitERUZfSEVMUEVSXzMoY3Z0c3Eyc2QsIHZvaWQsIGVudiwgWE1NUmVnLCBpNjQpCisjZW5kaWYKKworREVGX0hFTFBFUl8zKGN2dHBzMmRxLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGN2dHBkMmRxLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGN2dHBzMnBpLCB2b2lkLCBlbnYsIE1NWFJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGN2dHBkMnBpLCB2b2lkLCBlbnYsIE1NWFJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8yKGN2dHNzMnNpLCBzMzIsIGVudiwgWE1NUmVnKQorREVGX0hFTFBFUl8yKGN2dHNkMnNpLCBzMzIsIGVudiwgWE1NUmVnKQorI2lmZGVmIFRBUkdFVF9YODZfNjQKK0RFRl9IRUxQRVJfMihjdnRzczJzcSwgczY0LCBlbnYsIFhNTVJlZykKK0RFRl9IRUxQRVJfMihjdnRzZDJzcSwgczY0LCBlbnYsIFhNTVJlZykKKyNlbmRpZgorCitERUZfSEVMUEVSXzMoY3Z0dHBzMmRxLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGN2dHRwZDJkcSwgdm9pZCwgZW52LCBYTU1SZWcsIFhNTVJlZykKK0RFRl9IRUxQRVJfMyhjdnR0cHMycGksIHZvaWQsIGVudiwgTU1YUmVnLCBYTU1SZWcpCitERUZfSEVMUEVSXzMoY3Z0dHBkMnBpLCB2b2lkLCBlbnYsIE1NWFJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8yKGN2dHRzczJzaSwgczMyLCBlbnYsIFhNTVJlZykKK0RFRl9IRUxQRVJfMihjdnR0c2Qyc2ksIHMzMiwgZW52LCBYTU1SZWcpCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorREVGX0hFTFBFUl8yKGN2dHRzczJzcSwgczY0LCBlbnYsIFhNTVJlZykKK0RFRl9IRUxQRVJfMihjdnR0c2Qyc3EsIHM2NCwgZW52LCBYTU1SZWcpCisjZW5kaWYKKworREVGX0hFTFBFUl8zKHJzcXJ0cHMsIHZvaWQsIGVudiwgWE1NUmVnLCBYTU1SZWcpCitERUZfSEVMUEVSXzMocnNxcnRzcywgdm9pZCwgZW52LCBYTU1SZWcsIFhNTVJlZykKK0RFRl9IRUxQRVJfMyhyY3Bwcywgdm9pZCwgZW52LCBYTU1SZWcsIFhNTVJlZykKK0RFRl9IRUxQRVJfMyhyY3Bzcywgdm9pZCwgZW52LCBYTU1SZWcsIFhNTVJlZykKK0RFRl9IRUxQRVJfMyhleHRycV9yLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl80KGV4dHJxX2ksIHZvaWQsIGVudiwgWE1NUmVnLCBpbnQsIGludCkKK0RFRl9IRUxQRVJfMyhpbnNlcnRxX3IsIHZvaWQsIGVudiwgWE1NUmVnLCBYTU1SZWcpCitERUZfSEVMUEVSXzQoaW5zZXJ0cV9pLCB2b2lkLCBlbnYsIFhNTVJlZywgaW50LCBpbnQpCitERUZfSEVMUEVSXzMoaGFkZHBzLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGhhZGRwZCwgdm9pZCwgZW52LCBYTU1SZWcsIFhNTVJlZykKK0RFRl9IRUxQRVJfMyhoc3VicHMsIHZvaWQsIGVudiwgWE1NUmVnLCBYTU1SZWcpCitERUZfSEVMUEVSXzMoaHN1YnBkLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGFkZHN1YnBzLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorREVGX0hFTFBFUl8zKGFkZHN1YnBkLCB2b2lkLCBlbnYsIFhNTVJlZywgWE1NUmVnKQorCisjZGVmaW5lIFNTRV9IRUxQRVJfQ01QKG5hbWUsIEYpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFRl9IRUxQRVJfMyhuYW1lICMjIHBzLCB2b2lkLCBlbnYsIFJlZywgUmVnKSAgICAgICAgIFwKKyAgICBERUZfSEVMUEVSXzMobmFtZSAjIyBzcywgdm9pZCwgZW52LCBSZWcsIFJlZykgICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKG5hbWUgIyMgcGQsIHZvaWQsIGVudiwgUmVnLCBSZWcpICAgICAgICAgXAorICAgIERFRl9IRUxQRVJfMyhuYW1lICMjIHNkLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorCitTU0VfSEVMUEVSX0NNUChjbXBlcSwgRlBVX0NNUEVRKQorU1NFX0hFTFBFUl9DTVAoY21wbHQsIEZQVV9DTVBMVCkKK1NTRV9IRUxQRVJfQ01QKGNtcGxlLCBGUFVfQ01QTEUpCitTU0VfSEVMUEVSX0NNUChjbXB1bm9yZCwgRlBVX0NNUFVOT1JEKQorU1NFX0hFTFBFUl9DTVAoY21wbmVxLCBGUFVfQ01QTkVRKQorU1NFX0hFTFBFUl9DTVAoY21wbmx0LCBGUFVfQ01QTkxUKQorU1NFX0hFTFBFUl9DTVAoY21wbmxlLCBGUFVfQ01QTkxFKQorU1NFX0hFTFBFUl9DTVAoY21wb3JkLCBGUFVfQ01QT1JEKQorCitERUZfSEVMUEVSXzModWNvbWlzcywgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhjb21pc3MsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzModWNvbWlzZCwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhjb21pc2QsIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzIobW92bXNrcHMsIGkzMiwgZW52LCBSZWcpCitERUZfSEVMUEVSXzIobW92bXNrcGQsIGkzMiwgZW52LCBSZWcpCisjZW5kaWYKKworREVGX0hFTFBFUl8yKGdsdWUocG1vdm1za2IsIFNVRkZJWCksIGkzMiwgZW52LCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwYWNrc3N3YiwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBhY2t1c3diLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocGFja3NzZHcsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCisjZGVmaW5lIFVOUENLX09QKGJhc2VfbmFtZSwgYmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVGX0hFTFBFUl8zKGdsdWUocHVucGNrICMjIGJhc2VfbmFtZSAjIyBidywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykgXAorICAgIERFRl9IRUxQRVJfMyhnbHVlKHB1bnBjayAjIyBiYXNlX25hbWUgIyMgd2QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpIFwKKyAgICBERUZfSEVMUEVSXzMoZ2x1ZShwdW5wY2sgIyMgYmFzZV9uYW1lICMjIGRxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorCitVTlBDS19PUChsLCAwKQorVU5QQ0tfT1AoaCwgMSkKKworI2lmIFNISUZUID09IDEKK0RFRl9IRUxQRVJfMyhnbHVlKHB1bnBja2xxZHEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwdW5wY2tocWRxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorI2VuZGlmCisKKy8qIDNETm93ISBmbG9hdCBvcHMgKi8KKyNpZiBTSElGVCA9PSAwCitERUZfSEVMUEVSXzMocGkyZmQsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGkyZncsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGYyaWQsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGYyaXcsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZhY2MsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZhZGQsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZjbXBlcSwgdm9pZCwgZW52LCBNTVhSZWcsIE1NWFJlZykKK0RFRl9IRUxQRVJfMyhwZmNtcGdlLCB2b2lkLCBlbnYsIE1NWFJlZywgTU1YUmVnKQorREVGX0hFTFBFUl8zKHBmY21wZ3QsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZtYXgsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZtaW4sIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZtdWwsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZuYWNjLCB2b2lkLCBlbnYsIE1NWFJlZywgTU1YUmVnKQorREVGX0hFTFBFUl8zKHBmcG5hY2MsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZyY3AsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocGZyc3FydCwgdm9pZCwgZW52LCBNTVhSZWcsIE1NWFJlZykKK0RFRl9IRUxQRVJfMyhwZnN1Yiwgdm9pZCwgZW52LCBNTVhSZWcsIE1NWFJlZykKK0RFRl9IRUxQRVJfMyhwZnN1YnIsIHZvaWQsIGVudiwgTU1YUmVnLCBNTVhSZWcpCitERUZfSEVMUEVSXzMocHN3YXBkLCB2b2lkLCBlbnYsIE1NWFJlZywgTU1YUmVnKQorI2VuZGlmCisKKy8qIFNTU0UzIG9wIGhlbHBlcnMgKi8KK0RFRl9IRUxQRVJfMyhnbHVlKHBoYWRkdywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBoYWRkZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBoYWRkc3csIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwaHN1YncsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwaHN1YmQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwaHN1YnN3LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocGFic2IsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwYWJzdywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBhYnNkLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG1hZGR1YnN3LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG11bGhyc3csIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc2h1ZmIsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc2lnbmIsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc2lnbncsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwc2lnbmQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzQoZ2x1ZShwYWxpZ25yLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnLCBzMzIpCisKKy8qIFNTRTQuMSBvcCBoZWxwZXJzICovCisjaWYgU0hJRlQgPT0gMQorREVGX0hFTFBFUl8zKGdsdWUocGJsZW5kdmIsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShibGVuZHZwcywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKGJsZW5kdnBkLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocHRlc3QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbW92c3hidywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBtb3ZzeGJkLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG1vdnN4YnEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbW92c3h3ZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBtb3ZzeHdxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG1vdnN4ZHEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbW92enhidywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBtb3Z6eGJkLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG1vdnp4YnEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbW92enh3ZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKHBtb3Z6eHdxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocG1vdnp4ZHEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbXVsZHEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwY21wZXFxLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUocGFja3VzZHcsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWluc2IsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWluc2QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWludXcsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWludWQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWF4c2IsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWF4c2QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWF4dXcsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbWF4dWQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwbXVsbGQsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShwaG1pbnBvc3V3LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl80KGdsdWUocm91bmRwcywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUocm91bmRwZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUocm91bmRzcywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUocm91bmRzZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUoYmxlbmRwcywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUoYmxlbmRwZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUocGJsZW5kdywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUoZHBwcywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUoZHBwZCwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUobXBzYWRidywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorI2VuZGlmCisKKy8qIFNTRTQuMiBvcCBoZWxwZXJzICovCisjaWYgU0hJRlQgPT0gMQorREVGX0hFTFBFUl8zKGdsdWUocGNtcGd0cSwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfNChnbHVlKHBjbXBlc3RyaSwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl80KGdsdWUocGNtcGVzdHJtLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnLCBpMzIpCitERUZfSEVMUEVSXzQoZ2x1ZShwY21waXN0cmksIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcsIGkzMikKK0RFRl9IRUxQRVJfNChnbHVlKHBjbXBpc3RybSwgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZywgaTMyKQorREVGX0hFTFBFUl8zKGNyYzMyLCB0bCwgaTMyLCB0bCwgaTMyKQorREVGX0hFTFBFUl8zKHBvcGNudCwgdGwsIGVudiwgdGwsIGkzMikKKyNlbmRpZgorCisvKiBBRVMtTkkgb3AgaGVscGVycyAqLworI2lmIFNISUZUID09IDEKK0RFRl9IRUxQRVJfMyhnbHVlKGFlc2RlYywgU1VGRklYKSwgdm9pZCwgZW52LCBSZWcsIFJlZykKK0RFRl9IRUxQRVJfMyhnbHVlKGFlc2RlY2xhc3QsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShhZXNlbmMsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcpCitERUZfSEVMUEVSXzMoZ2x1ZShhZXNlbmNsYXN0LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl8zKGdsdWUoYWVzaW1jLCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnKQorREVGX0hFTFBFUl80KGdsdWUoYWVza2V5Z2VuYXNzaXN0LCBTVUZGSVgpLCB2b2lkLCBlbnYsIFJlZywgUmVnLCBpMzIpCitERUZfSEVMUEVSXzQoZ2x1ZShwY2xtdWxxZHEsIFNVRkZJWCksIHZvaWQsIGVudiwgUmVnLCBSZWcsIGkzMikKKyNlbmRpZgorCisjdW5kZWYgU0hJRlQKKyN1bmRlZiBSZWcKKyN1bmRlZiBTVUZGSVgKKworI3VuZGVmIFNTRV9IRUxQRVJfQgorI3VuZGVmIFNTRV9IRUxQRVJfVworI3VuZGVmIFNTRV9IRUxQRVJfTAorI3VuZGVmIFNTRV9IRUxQRVJfUQorI3VuZGVmIFNTRV9IRUxQRVJfUworI3VuZGVmIFNTRV9IRUxQRVJfQ01QCisjdW5kZWYgVU5QQ0tfT1AKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc2VnX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9zZWdfaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjYTgyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc2VnX2hlbHBlci5jCkBAIC0wLDAgKzEsMjIzMyBAQAorLyoKKyAqICB4ODYgc2VnbWVudGF0aW9uIHJlbGF0ZWQgaGVscGVyczoKKyAqICBUU1MsIGludGVycnVwdHMsIHN5c3RlbSBjYWxscywganVtcHMgYW5kIGNhbGwvdGFzayBnYXRlcywgZGVzY3JpcHRvcnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAicWVtdS9sb2cuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2V4ZWMuaCIKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKSAqLworCisvLyNkZWZpbmUgREVCVUdfUENBTEwKKworCisjaWZkZWYgREVCVUdfUENBTEwKKyMgIGRlZmluZSBMT0dfUENBTEwoLi4uKSBxZW11X2xvZ19tYXNrKENQVV9MT0dfUENBTEwsICMjIF9fVkFfQVJHU19fKQorIyAgZGVmaW5lIExPR19QQ0FMTF9TVEFURShlbnYpIFwKKyAgICAgICAgICBsb2dfY3B1X3N0YXRlX21hc2soQ1BVX0xPR19QQ0FMTCwgKGVudiksIFg4Nl9EVU1QX0NDT1ApCisjZWxzZQorIyAgZGVmaW5lIExPR19QQ0FMTCguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyMgIGRlZmluZSBMT0dfUENBTExfU1RBVEUoZW52KSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogcmV0dXJuIG5vbiB6ZXJvIGlmIGVycm9yICovCitzdGF0aWMgaW5saW5lIGludCBsb2FkX3NlZ21lbnQoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZTFfcHRyLCB1aW50MzJfdCAqZTJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWxlY3RvcikKK3sKKyAgICBTZWdtZW50Q2FjaGUgKmR0OworICAgIGludCBpbmRleDsKKyAgICB0YXJnZXRfdWxvbmcgcHRyOworCisgICAgaWYgKHNlbGVjdG9yICYgMHg0KQorICAgICAgICBkdCA9ICZlbnYtPmxkdDsKKyAgICBlbHNlCisgICAgICAgIGR0ID0gJmVudi0+Z2R0OworICAgIGluZGV4ID0gc2VsZWN0b3IgJiB+NzsKKyAgICBpZiAoKGluZGV4ICsgNykgPiBkdC0+bGltaXQpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBwdHIgPSBkdC0+YmFzZSArIGluZGV4OworICAgICplMV9wdHIgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0cik7CisgICAgKmUyX3B0ciA9IGNwdV9sZGxfa2VybmVsKGVudiwgcHRyICsgNCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9zZWdfbGltaXQodWludDMyX3QgZTEsIHVpbnQzMl90IGUyKQoreworICAgIHVuc2lnbmVkIGludCBsaW1pdDsKKyAgICBsaW1pdCA9IChlMSAmIDB4ZmZmZikgfCAoZTIgJiAweDAwMGYwMDAwKTsKKyAgICBpZiAoZTIgJiBERVNDX0dfTUFTSykKKyAgICAgICAgbGltaXQgPSAobGltaXQgPDwgMTIpIHwgMHhmZmY7CisgICAgcmV0dXJuIGxpbWl0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9zZWdfYmFzZSh1aW50MzJfdCBlMSwgdWludDMyX3QgZTIpCit7CisgICAgcmV0dXJuICgoZTEgPj4gMTYpIHwgKChlMiAmIDB4ZmYpIDw8IDE2KSB8IChlMiAmIDB4ZmYwMDAwMDApKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfc2VnX2NhY2hlX3Jhd19kdChTZWdtZW50Q2FjaGUgKnNjLCB1aW50MzJfdCBlMSwgdWludDMyX3QgZTIpCit7CisgICAgc2MtPmJhc2UgPSBnZXRfc2VnX2Jhc2UoZTEsIGUyKTsKKyAgICBzYy0+bGltaXQgPSBnZXRfc2VnX2xpbWl0KGUxLCBlMik7CisgICAgc2MtPmZsYWdzID0gZTI7Cit9CisKKy8qIGluaXQgdGhlIHNlZ21lbnQgY2FjaGUgaW4gdm04NiBtb2RlLiAqLworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfc2VnX3ZtKENQVVg4NlN0YXRlICplbnYsIGludCBzZWcsIGludCBzZWxlY3RvcikKK3sKKyAgICBzZWxlY3RvciAmPSAweGZmZmY7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIHNlZywgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0b3IgPDwgNCksIDB4ZmZmZiwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfc3NfZXNwX2Zyb21fdHNzKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc3NfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmVzcF9wdHIsIGludCBkcGwpCit7CisgICAgaW50IHR5cGUsIGluZGV4LCBzaGlmdDsKKworI2lmIDAKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludGYoIlRSOiBiYXNlPSVwIGxpbWl0PSV4XG4iLCBlbnYtPnRyLmJhc2UsIGVudi0+dHIubGltaXQpOworICAgICAgICBmb3IoaT0wO2k8ZW52LT50ci5saW1pdDtpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBlbnYtPnRyLmJhc2VbaV0pOworICAgICAgICAgICAgaWYgKChpICYgNykgPT0gNykgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICghKGVudi0+dHIuZmxhZ3MgJiBERVNDX1BfTUFTSykpCisgICAgICAgIGNwdV9hYm9ydChlbnYsICJpbnZhbGlkIHRzcyIpOworICAgIHR5cGUgPSAoZW52LT50ci5mbGFncyA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmOworICAgIGlmICgodHlwZSAmIDcpICE9IDEpCisgICAgICAgIGNwdV9hYm9ydChlbnYsICJpbnZhbGlkIHRzcyB0eXBlIik7CisgICAgc2hpZnQgPSB0eXBlID4+IDM7CisgICAgaW5kZXggPSAoZHBsICogNCArIDIpIDw8IHNoaWZ0OworICAgIGlmIChpbmRleCArICg0IDw8IHNoaWZ0KSAtIDEgPiBlbnYtPnRyLmxpbWl0KQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgZW52LT50ci5zZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgaWYgKHNoaWZ0ID09IDApIHsKKyAgICAgICAgKmVzcF9wdHIgPSBjcHVfbGR1d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyBpbmRleCk7CisgICAgICAgICpzc19wdHIgPSBjcHVfbGR1d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyBpbmRleCArIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgICplc3BfcHRyID0gY3B1X2xkbF9rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyBpbmRleCk7CisgICAgICAgICpzc19wdHIgPSBjcHVfbGR1d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyBpbmRleCArIDQpOworICAgIH0KK30KKworLyogWFhYOiBtZXJnZSB3aXRoIGxvYWRfc2VnKCkgKi8KK3N0YXRpYyB2b2lkIHRzc19sb2FkX3NlZyhDUFVYODZTdGF0ZSAqZW52LCBpbnQgc2VnX3JlZywgaW50IHNlbGVjdG9yKQoreworICAgIHVpbnQzMl90IGUxLCBlMjsKKyAgICBpbnQgcnBsLCBkcGwsIGNwbDsKKworICAgIGlmICgoc2VsZWN0b3IgJiAweGZmZmMpICE9IDApIHsKKyAgICAgICAgaWYgKGxvYWRfc2VnbWVudChlbnYsICZlMSwgJmUyLCBzZWxlY3RvcikgIT0gMCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGlmICghKGUyICYgREVTQ19TX01BU0spKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgcnBsID0gc2VsZWN0b3IgJiAzOworICAgICAgICBkcGwgPSAoZTIgPj4gREVTQ19EUExfU0hJRlQpICYgMzsKKyAgICAgICAgY3BsID0gZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSzsKKyAgICAgICAgaWYgKHNlZ19yZWcgPT0gUl9DUykgeworICAgICAgICAgICAgaWYgKCEoZTIgJiBERVNDX0NTX01BU0spKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICAvKiBYWFg6IGlzIGl0IGNvcnJlY3QgPyAqLworICAgICAgICAgICAgaWYgKGRwbCAhPSBycGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICgoZTIgJiBERVNDX0NfTUFTSykgJiYgZHBsID4gcnBsKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIH0gZWxzZSBpZiAoc2VnX3JlZyA9PSBSX1NTKSB7CisgICAgICAgICAgICAvKiBTUyBtdXN0IGJlIHdyaXRhYmxlIGRhdGEgKi8KKyAgICAgICAgICAgIGlmICgoZTIgJiBERVNDX0NTX01BU0spIHx8ICEoZTIgJiBERVNDX1dfTUFTSykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmIChkcGwgIT0gY3BsIHx8IGRwbCAhPSBycGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vdCByZWFkYWJsZSBjb2RlICovCisgICAgICAgICAgICBpZiAoKGUyICYgREVTQ19DU19NQVNLKSAmJiAhKGUyICYgREVTQ19SX01BU0spKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICAvKiBpZiBkYXRhIG9yIG5vbiBjb25mb3JtaW5nIGNvZGUsIGNoZWNrcyB0aGUgcmlnaHRzICovCisgICAgICAgICAgICBpZiAoKChlMiA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmKSA8IDEyKSB7CisgICAgICAgICAgICAgICAgaWYgKGRwbCA8IGNwbCB8fCBkcGwgPCBycGwpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBzZWdfcmVnLCBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZWdfcmVnID09IFJfU1MgfHwgc2VnX3JlZyA9PSBSX0NTKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgU1dJVENIX1RTU19KTVAgIDAKKyNkZWZpbmUgU1dJVENIX1RTU19JUkVUIDEKKyNkZWZpbmUgU1dJVENIX1RTU19DQUxMIDIKKworLyogWFhYOiByZXN0b3JlIENQVSBzdGF0ZSBpbiByZWdpc3RlcnMgKFBvd2VyUEMgY2FzZSkgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF90c3MoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRzc19zZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZTEsIHVpbnQzMl90IGUyLCBpbnQgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuZXh0X2VpcCkKK3sKKyAgICBpbnQgdHNzX2xpbWl0LCB0c3NfbGltaXRfbWF4LCB0eXBlLCBvbGRfdHNzX2xpbWl0X21heCwgb2xkX3R5cGUsIHYxLCB2MiwgaTsKKyAgICB0YXJnZXRfdWxvbmcgdHNzX2Jhc2U7CisgICAgdWludDMyX3QgbmV3X3JlZ3NbOF0sIG5ld19zZWdzWzZdOworICAgIHVpbnQzMl90IG5ld19lZmxhZ3MsIG5ld19laXAsIG5ld19jcjMsIG5ld19sZHQ7CisgICAgdWludDMyX3Qgb2xkX2VmbGFncywgZWZsYWdzX21hc2s7CisgICAgU2VnbWVudENhY2hlICpkdDsKKyAgICBpbnQgaW5kZXg7CisgICAgdGFyZ2V0X3Vsb25nIHB0cjsKKworICAgIHR5cGUgPSAoZTIgPj4gREVTQ19UWVBFX1NISUZUKSAmIDB4ZjsKKyAgICBMT0dfUENBTEwoInN3aXRjaF90c3M6IHNlbD0weCUwNHggdHlwZT0lZCBzcmM9JWRcbiIsIHRzc19zZWxlY3RvciwgdHlwZSwgc291cmNlKTsKKworICAgIC8qIGlmIHRhc2sgZ2F0ZSwgd2UgcmVhZCB0aGUgVFNTIHNlZ21lbnQgYW5kIHdlIGxvYWQgaXQgKi8KKyAgICBpZiAodHlwZSA9PSA1KSB7CisgICAgICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQl9OT1NFRywgdHNzX3NlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgdHNzX3NlbGVjdG9yID0gZTEgPj4gMTY7CisgICAgICAgIGlmICh0c3Nfc2VsZWN0b3IgJiA0KQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHRzc19zZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmZTEsICZlMiwgdHNzX3NlbGVjdG9yKSAhPSAwKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHRzc19zZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGlmIChlMiAmIERFU0NfU19NQVNLKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHRzc19zZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIHR5cGUgPSAoZTIgPj4gREVTQ19UWVBFX1NISUZUKSAmIDB4ZjsKKyAgICAgICAgaWYgKCh0eXBlICYgNykgIT0gMSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCB0c3Nfc2VsZWN0b3IgJiAweGZmZmMpOworICAgIH0KKworICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCB0c3Nfc2VsZWN0b3IgJiAweGZmZmMpOworCisgICAgaWYgKHR5cGUgJiA4KQorICAgICAgICB0c3NfbGltaXRfbWF4ID0gMTAzOworICAgIGVsc2UKKyAgICAgICAgdHNzX2xpbWl0X21heCA9IDQzOworICAgIHRzc19saW1pdCA9IGdldF9zZWdfbGltaXQoZTEsIGUyKTsKKyAgICB0c3NfYmFzZSA9IGdldF9zZWdfYmFzZShlMSwgZTIpOworICAgIGlmICgodHNzX3NlbGVjdG9yICYgNCkgIT0gMCB8fAorICAgICAgICB0c3NfbGltaXQgPCB0c3NfbGltaXRfbWF4KQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgdHNzX3NlbGVjdG9yICYgMHhmZmZjKTsKKyAgICBvbGRfdHlwZSA9IChlbnYtPnRyLmZsYWdzID4+IERFU0NfVFlQRV9TSElGVCkgJiAweGY7CisgICAgaWYgKG9sZF90eXBlICYgOCkKKyAgICAgICAgb2xkX3Rzc19saW1pdF9tYXggPSAxMDM7CisgICAgZWxzZQorICAgICAgICBvbGRfdHNzX2xpbWl0X21heCA9IDQzOworCisgICAgLyogcmVhZCBhbGwgdGhlIHJlZ2lzdGVycyBmcm9tIHRoZSBuZXcgVFNTICovCisgICAgaWYgKHR5cGUgJiA4KSB7CisgICAgICAgIC8qIDMyIGJpdCAqLworICAgICAgICBuZXdfY3IzID0gY3B1X2xkbF9rZXJuZWwoZW52LCB0c3NfYmFzZSArIDB4MWMpOworICAgICAgICBuZXdfZWlwID0gY3B1X2xkbF9rZXJuZWwoZW52LCB0c3NfYmFzZSArIDB4MjApOworICAgICAgICBuZXdfZWZsYWdzID0gY3B1X2xkbF9rZXJuZWwoZW52LCB0c3NfYmFzZSArIDB4MjQpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBuZXdfcmVnc1tpXSA9IGNwdV9sZGxfa2VybmVsKGVudiwgdHNzX2Jhc2UgKyAoMHgyOCArIGkgKiA0KSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIG5ld19zZWdzW2ldID0gY3B1X2xkdXdfa2VybmVsKGVudiwgdHNzX2Jhc2UgKyAoMHg0OCArIGkgKiA0KSk7CisgICAgICAgIG5ld19sZHQgPSBjcHVfbGR1d19rZXJuZWwoZW52LCB0c3NfYmFzZSArIDB4NjApOworICAgICAgICBjcHVfbGRsX2tlcm5lbChlbnYsIHRzc19iYXNlICsgMHg2NCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMTYgYml0ICovCisgICAgICAgIG5ld19jcjMgPSAwOworICAgICAgICBuZXdfZWlwID0gY3B1X2xkdXdfa2VybmVsKGVudiwgdHNzX2Jhc2UgKyAweDBlKTsKKyAgICAgICAgbmV3X2VmbGFncyA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIHRzc19iYXNlICsgMHgxMCk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIG5ld19yZWdzW2ldID0gY3B1X2xkdXdfa2VybmVsKGVudiwgdHNzX2Jhc2UgKyAoMHgxMiArIGkgKiAyKSkgfCAweGZmZmYwMDAwOworICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBuZXdfc2Vnc1tpXSA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIHRzc19iYXNlICsgKDB4MjIgKyBpICogNCkpOworICAgICAgICBuZXdfbGR0ID0gY3B1X2xkdXdfa2VybmVsKGVudiwgdHNzX2Jhc2UgKyAweDJhKTsKKyAgICAgICAgbmV3X3NlZ3NbUl9GU10gPSAwOworICAgICAgICBuZXdfc2Vnc1tSX0dTXSA9IDA7CisgICAgfQorCisgICAgLyogTk9URTogd2UgbXVzdCBhdm9pZCBtZW1vcnkgZXhjZXB0aW9ucyBkdXJpbmcgdGhlIHRhc2sgc3dpdGNoLAorICAgICAgIHNvIHdlIG1ha2UgZHVtbXkgYWNjZXNzZXMgYmVmb3JlICovCisgICAgLyogWFhYOiBpdCBjYW4gc3RpbGwgZmFpbCBpbiBzb21lIGNhc2VzLCBzbyBhIGJpZ2dlciBoYWNrIGlzCisgICAgICAgbmVjZXNzYXJ5IHRvIHZhbGlkIHRoZSBUTEIgYWZ0ZXIgaGF2aW5nIGRvbmUgdGhlIGFjY2Vzc2VzICovCisKKyAgICB2MSA9IGNwdV9sZHViX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSk7CisgICAgdjIgPSBjcHVfbGR1Yl9rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyBvbGRfdHNzX2xpbWl0X21heCk7CisgICAgY3B1X3N0Yl9rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UsIHYxKTsKKyAgICBjcHVfc3RiX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArIG9sZF90c3NfbGltaXRfbWF4LCB2Mik7CisKKyAgICAvKiBjbGVhciBidXN5IGJpdCAoaXQgaXMgcmVzdGFydGFibGUpICovCisgICAgaWYgKHNvdXJjZSA9PSBTV0lUQ0hfVFNTX0pNUCB8fCBzb3VyY2UgPT0gU1dJVENIX1RTU19JUkVUKSB7CisgICAgICAgIHRhcmdldF91bG9uZyBwdHI7CisgICAgICAgIHVpbnQzMl90IGUyOworICAgICAgICBwdHIgPSBlbnYtPmdkdC5iYXNlICsgKGVudi0+dHIuc2VsZWN0b3IgJiB+Nyk7CisgICAgICAgIGUyID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA0KTsKKyAgICAgICAgZTIgJj0gfkRFU0NfVFNTX0JVU1lfTUFTSzsKKyAgICAgICAgY3B1X3N0bF9rZXJuZWwoZW52LCBwdHIgKyA0LCBlMik7CisgICAgfQorICAgIG9sZF9lZmxhZ3MgPSBjcHVfY29tcHV0ZV9lZmxhZ3MoZW52KTsKKyAgICBpZiAoc291cmNlID09IFNXSVRDSF9UU1NfSVJFVCkKKyAgICAgICAgb2xkX2VmbGFncyAmPSB+TlRfTUFTSzsKKworICAgIC8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgaW4gdGhlIG9sZCBUU1MgKi8KKyAgICBpZiAodHlwZSAmIDgpIHsKKyAgICAgICAgLyogMzIgYml0ICovCisgICAgICAgIGNwdV9zdGxfa2VybmVsKGVudiwgZW52LT50ci5iYXNlICsgMHgyMCwgbmV4dF9laXApOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArIDB4MjQsIG9sZF9lZmxhZ3MpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgMCAqIDQpLCBFQVgpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgMSAqIDQpLCBFQ1gpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgMiAqIDQpLCBFRFgpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgMyAqIDQpLCBFQlgpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgNCAqIDQpLCBFU1ApOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgNSAqIDQpLCBFQlApOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgNiAqIDQpLCBFU0kpOworICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDI4ICsgNyAqIDQpLCBFREkpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBjcHVfc3R3X2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArICgweDQ4ICsgaSAqIDQpLCBlbnYtPnNlZ3NbaV0uc2VsZWN0b3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICBjcHVfc3R3X2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArIDB4MGUsIG5leHRfZWlwKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAweDEwLCBvbGRfZWZsYWdzKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDAgKiAyKSwgRUFYKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDEgKiAyKSwgRUNYKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDIgKiAyKSwgRURYKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDMgKiAyKSwgRUJYKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDQgKiAyKSwgRVNQKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDUgKiAyKSwgRUJQKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDYgKiAyKSwgRVNJKTsKKyAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgxMiArIDcgKiAyKSwgRURJKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgY3B1X3N0d19rZXJuZWwoZW52LCBlbnYtPnRyLmJhc2UgKyAoMHgyMiArIGkgKiA0KSwgZW52LT5zZWdzW2ldLnNlbGVjdG9yKTsKKyAgICB9CisKKyAgICAvKiBub3cgaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgaXQgd2lsbCBvY2N1cnMgaW4gdGhlIG5leHQgdGFzaworICAgICAgIGNvbnRleHQgKi8KKworICAgIGlmIChzb3VyY2UgPT0gU1dJVENIX1RTU19DQUxMKSB7CisgICAgICAgIGNwdV9zdHdfa2VybmVsKGVudiwgdHNzX2Jhc2UsIGVudi0+dHIuc2VsZWN0b3IpOworICAgICAgICBuZXdfZWZsYWdzIHw9IE5UX01BU0s7CisgICAgfQorCisgICAgLyogc2V0IGJ1c3kgYml0ICovCisgICAgaWYgKHNvdXJjZSA9PSBTV0lUQ0hfVFNTX0pNUCB8fCBzb3VyY2UgPT0gU1dJVENIX1RTU19DQUxMKSB7CisgICAgICAgIHRhcmdldF91bG9uZyBwdHI7CisgICAgICAgIHVpbnQzMl90IGUyOworICAgICAgICBwdHIgPSBlbnYtPmdkdC5iYXNlICsgKHRzc19zZWxlY3RvciAmIH43KTsKKyAgICAgICAgZTIgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0ciArIDQpOworICAgICAgICBlMiB8PSBERVNDX1RTU19CVVNZX01BU0s7CisgICAgICAgIGNwdV9zdGxfa2VybmVsKGVudiwgcHRyICsgNCwgZTIpOworICAgIH0KKworICAgIC8qIHNldCB0aGUgbmV3IENQVSBzdGF0ZSAqLworICAgIC8qIGZyb20gdGhpcyBwb2ludCwgYW55IGV4Y2VwdGlvbiB3aGljaCBvY2N1cnMgY2FuIGdpdmUgcHJvYmxlbXMgKi8KKyAgICBlbnYtPmNyWzBdIHw9IENSMF9UU19NQVNLOworICAgIGVudi0+aGZsYWdzIHw9IEhGX1RTX01BU0s7CisgICAgZW52LT50ci5zZWxlY3RvciA9IHRzc19zZWxlY3RvcjsKKyAgICBlbnYtPnRyLmJhc2UgPSB0c3NfYmFzZTsKKyAgICBlbnYtPnRyLmxpbWl0ID0gdHNzX2xpbWl0OworICAgIGVudi0+dHIuZmxhZ3MgPSBlMiAmIH5ERVNDX1RTU19CVVNZX01BU0s7CisKKyAgICBpZiAoKHR5cGUgJiA4KSAmJiAoZW52LT5jclswXSAmIENSMF9QR19NQVNLKSkgeworICAgICAgICBjcHVfeDg2X3VwZGF0ZV9jcjMoZW52LCBuZXdfY3IzKTsKKyAgICB9CisKKyAgICAvKiBsb2FkIGFsbCByZWdpc3RlcnMgd2l0aG91dCBhbiBleGNlcHRpb24sIHRoZW4gcmVsb2FkIHRoZW0gd2l0aAorICAgICAgIHBvc3NpYmxlIGV4Y2VwdGlvbiAqLworICAgIGVudi0+ZWlwID0gbmV3X2VpcDsKKyAgICBlZmxhZ3NfbWFzayA9IFRGX01BU0sgfCBBQ19NQVNLIHwgSURfTUFTSyB8CisgICAgICAgIElGX01BU0sgfCBJT1BMX01BU0sgfCBWTV9NQVNLIHwgUkZfTUFTSyB8IE5UX01BU0s7CisgICAgaWYgKCEodHlwZSAmIDgpKQorICAgICAgICBlZmxhZ3NfbWFzayAmPSAweGZmZmY7CisgICAgY3B1X2xvYWRfZWZsYWdzKGVudiwgbmV3X2VmbGFncywgZWZsYWdzX21hc2spOworICAgIC8qIFhYWDogd2hhdCB0byBkbyBpbiAxNiBiaXQgY2FzZSA/ICovCisgICAgRUFYID0gbmV3X3JlZ3NbMF07CisgICAgRUNYID0gbmV3X3JlZ3NbMV07CisgICAgRURYID0gbmV3X3JlZ3NbMl07CisgICAgRUJYID0gbmV3X3JlZ3NbM107CisgICAgRVNQID0gbmV3X3JlZ3NbNF07CisgICAgRUJQID0gbmV3X3JlZ3NbNV07CisgICAgRVNJID0gbmV3X3JlZ3NbNl07CisgICAgRURJID0gbmV3X3JlZ3NbN107CisgICAgaWYgKG5ld19lZmxhZ3MgJiBWTV9NQVNLKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgIGxvYWRfc2VnX3ZtKGVudiwgaSwgbmV3X3NlZ3NbaV0pOworICAgICAgICAvKiBpbiB2bTg2LCBDUEwgaXMgYWx3YXlzIDMgKi8KKyAgICAgICAgY3B1X3g4Nl9zZXRfY3BsKGVudiwgMyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ1BMIGlzIHNldCB0aGUgUlBMIG9mIENTICovCisgICAgICAgIGNwdV94ODZfc2V0X2NwbChlbnYsIG5ld19zZWdzW1JfQ1NdICYgMyk7CisgICAgICAgIC8qIGZpcnN0IGp1c3Qgc2VsZWN0b3JzIGFzIHRoZSByZXN0IG1heSB0cmlnZ2VyIGV4Y2VwdGlvbnMgKi8KKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIGksIG5ld19zZWdzW2ldLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBlbnYtPmxkdC5zZWxlY3RvciA9IG5ld19sZHQgJiB+NDsKKyAgICBlbnYtPmxkdC5iYXNlID0gMDsKKyAgICBlbnYtPmxkdC5saW1pdCA9IDA7CisgICAgZW52LT5sZHQuZmxhZ3MgPSAwOworCisgICAgLyogbG9hZCB0aGUgTERUICovCisgICAgaWYgKG5ld19sZHQgJiA0KQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgbmV3X2xkdCAmIDB4ZmZmYyk7CisKKyAgICBpZiAoKG5ld19sZHQgJiAweGZmZmMpICE9IDApIHsKKyAgICAgICAgZHQgPSAmZW52LT5nZHQ7CisgICAgICAgIGluZGV4ID0gbmV3X2xkdCAmIH43OworICAgICAgICBpZiAoKGluZGV4ICsgNykgPiBkdC0+bGltaXQpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgbmV3X2xkdCAmIDB4ZmZmYyk7CisgICAgICAgIHB0ciA9IGR0LT5iYXNlICsgaW5kZXg7CisgICAgICAgIGUxID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIpOworICAgICAgICBlMiA9IGNwdV9sZGxfa2VybmVsKGVudiwgcHRyICsgNCk7CisgICAgICAgIGlmICgoZTIgJiBERVNDX1NfTUFTSykgfHwgKChlMiA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmKSAhPSAyKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIG5ld19sZHQgJiAweGZmZmMpOworICAgICAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBuZXdfbGR0ICYgMHhmZmZjKTsKKyAgICAgICAgbG9hZF9zZWdfY2FjaGVfcmF3X2R0KCZlbnYtPmxkdCwgZTEsIGUyKTsKKyAgICB9CisKKyAgICAvKiBsb2FkIHRoZSBzZWdtZW50cyAqLworICAgIGlmICghKG5ld19lZmxhZ3MgJiBWTV9NQVNLKSkgeworICAgICAgICB0c3NfbG9hZF9zZWcoZW52LCBSX0NTLCBuZXdfc2Vnc1tSX0NTXSk7CisgICAgICAgIHRzc19sb2FkX3NlZyhlbnYsIFJfU1MsIG5ld19zZWdzW1JfU1NdKTsKKyAgICAgICAgdHNzX2xvYWRfc2VnKGVudiwgUl9FUywgbmV3X3NlZ3NbUl9FU10pOworICAgICAgICB0c3NfbG9hZF9zZWcoZW52LCBSX0RTLCBuZXdfc2Vnc1tSX0RTXSk7CisgICAgICAgIHRzc19sb2FkX3NlZyhlbnYsIFJfRlMsIG5ld19zZWdzW1JfRlNdKTsKKyAgICAgICAgdHNzX2xvYWRfc2VnKGVudiwgUl9HUywgbmV3X3NlZ3NbUl9HU10pOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgRUlQIGlzIGluIHRoZSBDUyBzZWdtZW50IGxpbWl0cyAqLworICAgIGlmIChuZXdfZWlwID4gZW52LT5zZWdzW1JfQ1NdLmxpbWl0KSB7CisgICAgICAgIC8qIFhYWDogZGlmZmVyZW50IGV4Y2VwdGlvbiBpZiBDQUxMID8gKi8KKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIH0KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgLyogcmVzZXQgbG9jYWwgYnJlYWtwb2ludHMgKi8KKyAgICBpZiAoZW52LT5kcls3XSAmIDB4NTUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGh3X2JyZWFrcG9pbnRfZW5hYmxlZChlbnYtPmRyWzddLCBpKSA9PSAweDEpCisgICAgICAgICAgICAgICAgaHdfYnJlYWtwb2ludF9yZW1vdmUoZW52LCBpKTsKKyAgICAgICAgfQorICAgICAgICBlbnYtPmRyWzddICY9IH4weDU1OworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfc3BfbWFzayh1bnNpZ25lZCBpbnQgZTIpCit7CisgICAgaWYgKGUyICYgREVTQ19CX01BU0spCisgICAgICAgIHJldHVybiAweGZmZmZmZmZmOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKK30KKworc3RhdGljIGludCBleGVwdGlvbl9oYXNfZXJyb3JfY29kZShpbnQgaW50bm8pCit7CisgICAgICAgIHN3aXRjaChpbnRubykgeworICAgICAgICBjYXNlIDg6CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgIGNhc2UgMTE6CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKK30KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyNkZWZpbmUgU0VUX0VTUCh2YWwsIHNwX21hc2spXAorZG8ge1wKKyAgICBpZiAoKHNwX21hc2spID09IDB4ZmZmZilcCisgICAgICAgIEVTUCA9IChFU1AgJiB+MHhmZmZmKSB8ICgodmFsKSAmIDB4ZmZmZik7XAorICAgIGVsc2UgaWYgKChzcF9tYXNrKSA9PSAweGZmZmZmZmZmTEwpXAorICAgICAgICBFU1AgPSAodWludDMyX3QpKHZhbCk7XAorICAgIGVsc2VcCisgICAgICAgIEVTUCA9ICh2YWwpO1wKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBTRVRfRVNQKHZhbCwgc3BfbWFzaykgRVNQID0gKEVTUCAmIH4oc3BfbWFzaykpIHwgKCh2YWwpICYgKHNwX21hc2spKQorI2VuZGlmCisKKy8qIGluIDY0LWJpdCBtYWNoaW5lcywgdGhpcyBjYW4gb3ZlcmZsb3cuIFNvIHRoaXMgc2VnbWVudCBhZGRpdGlvbiBtYWNybworICogY2FuIGJlIHVzZWQgdG8gdHJpbSB0aGUgdmFsdWUgdG8gMzItYml0IHdoZW5ldmVyIG5lZWRlZCAqLworI2RlZmluZSBTRUdfQURETChzc3AsIHNwLCBzcF9tYXNrKSAoKHVpbnQzMl90KSgoc3NwKSArIChzcCAmIChzcF9tYXNrKSkpKQorCisvKiBYWFg6IGFkZCBhIGlzX3VzZXIgZmxhZyB0byBoYXZlIHByb3BlciBzZWN1cml0eSBzdXBwb3J0ICovCisjZGVmaW5lIFBVU0hXKHNzcCwgc3AsIHNwX21hc2ssIHZhbClcCit7XAorICAgIHNwIC09IDI7XAorICAgIGNwdV9zdHdfa2VybmVsKGVudiwgKHNzcCkgKyAoc3AgJiAoc3BfbWFzaykpLCAodmFsKSk7XAorfQorCisjZGVmaW5lIFBVU0hMKHNzcCwgc3AsIHNwX21hc2ssIHZhbClcCit7XAorICAgIHNwIC09IDQ7XAorICAgIGNwdV9zdGxfa2VybmVsKGVudiwgU0VHX0FEREwoc3NwLCBzcCwgc3BfbWFzayksICh1aW50MzJfdCkodmFsKSk7XAorfQorCisjZGVmaW5lIFBPUFcoc3NwLCBzcCwgc3BfbWFzaywgdmFsKVwKK3tcCisgICAgdmFsID0gY3B1X2xkdXdfa2VybmVsKGVudiwgKHNzcCkgKyAoc3AgJiAoc3BfbWFzaykpKTtcCisgICAgc3AgKz0gMjtcCit9CisKKyNkZWZpbmUgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCB2YWwpXAore1wKKyAgICB2YWwgPSAodWludDMyX3QpY3B1X2xkbF9rZXJuZWwoZW52LCBTRUdfQURETChzc3AsIHNwLCBzcF9tYXNrKSk7XAorICAgIHNwICs9IDQ7XAorfQorCisvKiBwcm90ZWN0ZWQgbW9kZSBpbnRlcnJ1cHQgKi8KK3N0YXRpYyB2b2lkIGRvX2ludGVycnVwdF9wcm90ZWN0ZWQoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludG5vLCBpbnQgaXNfaW50LCBpbnQgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5leHRfZWlwLCBpbnQgaXNfaHcpCit7CisgICAgU2VnbWVudENhY2hlICpkdDsKKyAgICB0YXJnZXRfdWxvbmcgcHRyLCBzc3A7CisgICAgaW50IHR5cGUsIGRwbCwgc2VsZWN0b3IsIHNzX2RwbCwgY3BsOworICAgIGludCBoYXNfZXJyb3JfY29kZSwgbmV3X3N0YWNrLCBzaGlmdDsKKyAgICB1aW50MzJfdCBlMSwgZTIsIG9mZnNldCwgc3MgPSAwLCBlc3AsIHNzX2UxID0gMCwgc3NfZTIgPSAwOworICAgIHVpbnQzMl90IG9sZF9laXAsIHNwX21hc2s7CisKKyAgICBoYXNfZXJyb3JfY29kZSA9IDA7CisgICAgaWYgKCFpc19pbnQgJiYgIWlzX2h3KQorICAgICAgICBoYXNfZXJyb3JfY29kZSA9IGV4ZXB0aW9uX2hhc19lcnJvcl9jb2RlKGludG5vKTsKKyAgICBpZiAoaXNfaW50KQorICAgICAgICBvbGRfZWlwID0gbmV4dF9laXA7CisgICAgZWxzZQorICAgICAgICBvbGRfZWlwID0gZW52LT5laXA7CisKKyAgICBkdCA9ICZlbnYtPmlkdDsKKyAgICBpZiAoaW50bm8gKiA4ICsgNyA+IGR0LT5saW1pdCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIGludG5vICogOCArIDIpOworICAgIHB0ciA9IGR0LT5iYXNlICsgaW50bm8gKiA4OworICAgIGUxID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIpOworICAgIGUyID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA0KTsKKyAgICAvKiBjaGVjayBnYXRlIHR5cGUgKi8KKyAgICB0eXBlID0gKGUyID4+IERFU0NfVFlQRV9TSElGVCkgJiAweDFmOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSA1OiAvKiB0YXNrIGdhdGUgKi8KKyAgICAgICAgLyogbXVzdCBkbyB0aGF0IGNoZWNrIGhlcmUgdG8gcmV0dXJuIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUgKi8KKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBpbnRubyAqIDggKyAyKTsKKyAgICAgICAgc3dpdGNoX3RzcyhlbnYsIGludG5vICogOCwgZTEsIGUyLCBTV0lUQ0hfVFNTX0NBTEwsIG9sZF9laXApOworICAgICAgICBpZiAoaGFzX2Vycm9yX2NvZGUpIHsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgdWludDMyX3QgbWFzazsKKyAgICAgICAgICAgIC8qIHB1c2ggdGhlIGVycm9yIGNvZGUgKi8KKyAgICAgICAgICAgIHR5cGUgPSAoZW52LT50ci5mbGFncyA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmOworICAgICAgICAgICAgc2hpZnQgPSB0eXBlID4+IDM7CisgICAgICAgICAgICBpZiAoZW52LT5zZWdzW1JfU1NdLmZsYWdzICYgREVTQ19CX01BU0spCisgICAgICAgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWFzayA9IDB4ZmZmZjsKKyAgICAgICAgICAgIGVzcCA9IChFU1AgLSAoMiA8PCBzaGlmdCkpICYgbWFzazsKKyAgICAgICAgICAgIHNzcCA9IGVudi0+c2Vnc1tSX1NTXS5iYXNlICsgZXNwOworICAgICAgICAgICAgaWYgKHNoaWZ0KQorICAgICAgICAgICAgICAgIGNwdV9zdGxfa2VybmVsKGVudiwgc3NwLCBlcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjcHVfc3R3X2tlcm5lbChlbnYsIHNzcCwgZXJyb3JfY29kZSk7CisgICAgICAgICAgICBTRVRfRVNQKGVzcCwgbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgNjogLyogMjg2IGludGVycnVwdCBnYXRlICovCisgICAgY2FzZSA3OiAvKiAyODYgdHJhcCBnYXRlICovCisgICAgY2FzZSAxNDogLyogMzg2IGludGVycnVwdCBnYXRlICovCisgICAgY2FzZSAxNTogLyogMzg2IHRyYXAgZ2F0ZSAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgaW50bm8gKiA4ICsgMik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkcGwgPSAoZTIgPj4gREVTQ19EUExfU0hJRlQpICYgMzsKKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIC8qIGNoZWNrIHByaXZpbGVnZSBpZiBzb2Z0d2FyZSBpbnQgKi8KKyAgICBpZiAoaXNfaW50ICYmIGRwbCA8IGNwbCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIGludG5vICogOCArIDIpOworICAgIC8qIGNoZWNrIHZhbGlkIGJpdCAqLworICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBpbnRubyAqIDggKyAyKTsKKyAgICBzZWxlY3RvciA9IGUxID4+IDE2OworICAgIG9mZnNldCA9IChlMiAmIDB4ZmZmZjAwMDApIHwgKGUxICYgMHgwMDAwZmZmZik7CisgICAgaWYgKChzZWxlY3RvciAmIDB4ZmZmYykgPT0gMCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworCisgICAgaWYgKGxvYWRfc2VnbWVudChlbnYsICZlMSwgJmUyLCBzZWxlY3RvcikgIT0gMCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICBpZiAoIShlMiAmIERFU0NfU19NQVNLKSB8fCAhKGUyICYgKERFU0NfQ1NfTUFTSykpKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgIGlmIChkcGwgPiBjcGwpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICBpZiAoIShlMiAmIERFU0NfQ19NQVNLKSAmJiBkcGwgPCBjcGwpIHsKKyAgICAgICAgLyogdG8gaW5uZXIgcHJpdmlsZWdlICovCisgICAgICAgIGdldF9zc19lc3BfZnJvbV90c3MoZW52LCAmc3MsICZlc3AsIGRwbCk7CisgICAgICAgIGlmICgoc3MgJiAweGZmZmMpID09IDApCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgc3MgJiAweGZmZmMpOworICAgICAgICBpZiAoKHNzICYgMykgIT0gZHBsKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgaWYgKGxvYWRfc2VnbWVudChlbnYsICZzc19lMSwgJnNzX2UyLCBzcykgIT0gMCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzcyAmIDB4ZmZmYyk7CisgICAgICAgIHNzX2RwbCA9IChzc19lMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICBpZiAoc3NfZHBsICE9IGRwbCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzcyAmIDB4ZmZmYyk7CisgICAgICAgIGlmICghKHNzX2UyICYgREVTQ19TX01BU0spIHx8CisgICAgICAgICAgICAoc3NfZTIgJiBERVNDX0NTX01BU0spIHx8CisgICAgICAgICAgICAhKHNzX2UyICYgREVTQ19XX01BU0spKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgaWYgKCEoc3NfZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgc3MgJiAweGZmZmMpOworICAgICAgICBuZXdfc3RhY2sgPSAxOworICAgICAgICBzcF9tYXNrID0gZ2V0X3NwX21hc2soc3NfZTIpOworICAgICAgICBzc3AgPSBnZXRfc2VnX2Jhc2Uoc3NfZTEsIHNzX2UyKTsKKyAgICB9IGVsc2UgaWYgKChlMiAmIERFU0NfQ19NQVNLKSB8fCBkcGwgPT0gY3BsKSB7CisgICAgICAgIC8qIHRvIHNhbWUgcHJpdmlsZWdlICovCisgICAgICAgIGlmIChlbnYtPmVmbGFncyAmIFZNX01BU0spCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBuZXdfc3RhY2sgPSAwOworICAgICAgICBzcF9tYXNrID0gZ2V0X3NwX21hc2soZW52LT5zZWdzW1JfU1NdLmZsYWdzKTsKKyAgICAgICAgc3NwID0gZW52LT5zZWdzW1JfU1NdLmJhc2U7CisgICAgICAgIGVzcCA9IEVTUDsKKyAgICAgICAgZHBsID0gY3BsOworICAgIH0gZWxzZSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIG5ld19zdGFjayA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICAgICAgc3BfbWFzayA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICAgICAgc3NwID0gMDsgLyogYXZvaWQgd2FybmluZyAqLworICAgICAgICBlc3AgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisgICAgfQorCisgICAgc2hpZnQgPSB0eXBlID4+IDM7CisKKyNpZiAwCisgICAgLyogWFhYOiBjaGVjayB0aGF0IGVub3VnaCByb29tIGlzIGF2YWlsYWJsZSAqLworICAgIHB1c2hfc2l6ZSA9IDYgKyAobmV3X3N0YWNrIDw8IDIpICsgKGhhc19lcnJvcl9jb2RlIDw8IDEpOworICAgIGlmIChlbnYtPmVmbGFncyAmIFZNX01BU0spCisgICAgICAgIHB1c2hfc2l6ZSArPSA4OworICAgIHB1c2hfc2l6ZSA8PD0gc2hpZnQ7CisjZW5kaWYKKyAgICBpZiAoc2hpZnQgPT0gMSkgeworICAgICAgICBpZiAobmV3X3N0YWNrKSB7CisgICAgICAgICAgICBpZiAoZW52LT5lZmxhZ3MgJiBWTV9NQVNLKSB7CisgICAgICAgICAgICAgICAgUFVTSEwoc3NwLCBlc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX0dTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgUFVTSEwoc3NwLCBlc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX0ZTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgUFVTSEwoc3NwLCBlc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX0RTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgUFVTSEwoc3NwLCBlc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX0VTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNITChzc3AsIGVzcCwgc3BfbWFzaywgZW52LT5zZWdzW1JfU1NdLnNlbGVjdG9yKTsKKyAgICAgICAgICAgIFBVU0hMKHNzcCwgZXNwLCBzcF9tYXNrLCBFU1ApOworICAgICAgICB9CisgICAgICAgIFBVU0hMKHNzcCwgZXNwLCBzcF9tYXNrLCBjcHVfY29tcHV0ZV9lZmxhZ3MoZW52KSk7CisgICAgICAgIFBVU0hMKHNzcCwgZXNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICBQVVNITChzc3AsIGVzcCwgc3BfbWFzaywgb2xkX2VpcCk7CisgICAgICAgIGlmIChoYXNfZXJyb3JfY29kZSkgeworICAgICAgICAgICAgUFVTSEwoc3NwLCBlc3AsIHNwX21hc2ssIGVycm9yX2NvZGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG5ld19zdGFjaykgeworICAgICAgICAgICAgaWYgKGVudi0+ZWZsYWdzICYgVk1fTUFTSykgeworICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgZXNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9HU10uc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgZXNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9GU10uc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgZXNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9EU10uc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgZXNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9FU10uc2VsZWN0b3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSFcoc3NwLCBlc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX1NTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICBQVVNIVyhzc3AsIGVzcCwgc3BfbWFzaywgRVNQKTsKKyAgICAgICAgfQorICAgICAgICBQVVNIVyhzc3AsIGVzcCwgc3BfbWFzaywgY3B1X2NvbXB1dGVfZWZsYWdzKGVudikpOworICAgICAgICBQVVNIVyhzc3AsIGVzcCwgc3BfbWFzaywgZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yKTsKKyAgICAgICAgUFVTSFcoc3NwLCBlc3AsIHNwX21hc2ssIG9sZF9laXApOworICAgICAgICBpZiAoaGFzX2Vycm9yX2NvZGUpIHsKKyAgICAgICAgICAgIFBVU0hXKHNzcCwgZXNwLCBzcF9tYXNrLCBlcnJvcl9jb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXdfc3RhY2spIHsKKyAgICAgICAgaWYgKGVudi0+ZWZsYWdzICYgVk1fTUFTSykgeworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRVMsIDAsIDAsIDAsIDApOworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRFMsIDAsIDAsIDAsIDApOworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfRlMsIDAsIDAsIDAsIDApOworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfR1MsIDAsIDAsIDAsIDApOworICAgICAgICB9CisgICAgICAgIHNzID0gKHNzICYgfjMpIHwgZHBsOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NwLCBnZXRfc2VnX2xpbWl0KHNzX2UxLCBzc19lMiksIHNzX2UyKTsKKyAgICB9CisgICAgU0VUX0VTUChlc3AsIHNwX21hc2spOworCisgICAgc2VsZWN0b3IgPSAoc2VsZWN0b3IgJiB+MykgfCBkcGw7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgIGdldF9zZWdfYmFzZShlMSwgZTIpLAorICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICBlMik7CisgICAgY3B1X3g4Nl9zZXRfY3BsKGVudiwgZHBsKTsKKyAgICBlbnYtPmVpcCA9IG9mZnNldDsKKworICAgIC8qIGludGVycnVwdCBnYXRlIGNsZWFyIElGIG1hc2sgKi8KKyAgICBpZiAoKHR5cGUgJiAxKSA9PSAwKSB7CisgICAgICAgIGVudi0+ZWZsYWdzICY9IH5JRl9NQVNLOworICAgIH0KKyAgICBlbnYtPmVmbGFncyAmPSB+KFRGX01BU0sgfCBWTV9NQVNLIHwgUkZfTUFTSyB8IE5UX01BU0spOworfQorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorCisjZGVmaW5lIFBVU0hRKHNwLCB2YWwpXAore1wKKyAgICBzcCAtPSA4O1wKKyAgICBjcHVfc3RxX2tlcm5lbChlbnYsIHNwLCAodmFsKSk7XAorfQorCisjZGVmaW5lIFBPUFEoc3AsIHZhbClcCit7XAorICAgIHZhbCA9IGNwdV9sZHFfa2VybmVsKGVudiwgc3ApO1wKKyAgICBzcCArPSA4O1wKK30KKworc3RhdGljIGlubGluZSB0YXJnZXRfdWxvbmcgZ2V0X3JzcF9mcm9tX3RzcyhDUFVYODZTdGF0ZSAqZW52LCBpbnQgbGV2ZWwpCit7CisgICAgaW50IGluZGV4OworCisjaWYgMAorICAgIHByaW50ZigiVFI6IGJhc2U9IiBUQVJHRVRfRk1UX2x4ICIgbGltaXQ9JXhcbiIsCisgICAgICAgICAgIGVudi0+dHIuYmFzZSwgZW52LT50ci5saW1pdCk7CisjZW5kaWYKKworICAgIGlmICghKGVudi0+dHIuZmxhZ3MgJiBERVNDX1BfTUFTSykpCisgICAgICAgIGNwdV9hYm9ydChlbnYsICJpbnZhbGlkIHRzcyIpOworICAgIGluZGV4ID0gOCAqIGxldmVsICsgNDsKKyAgICBpZiAoKGluZGV4ICsgNykgPiBlbnYtPnRyLmxpbWl0KQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgZW52LT50ci5zZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgcmV0dXJuIGNwdV9sZHFfa2VybmVsKGVudiwgZW52LT50ci5iYXNlICsgaW5kZXgpOworfQorCisvKiA2NCBiaXQgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBkb19pbnRlcnJ1cHQ2NChDUFVYODZTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludG5vLCBpbnQgaXNfaW50LCBpbnQgZXJyb3JfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBuZXh0X2VpcCwgaW50IGlzX2h3KQoreworICAgIFNlZ21lbnRDYWNoZSAqZHQ7CisgICAgdGFyZ2V0X3Vsb25nIHB0cjsKKyAgICBpbnQgdHlwZSwgZHBsLCBzZWxlY3RvciwgY3BsLCBpc3Q7CisgICAgaW50IGhhc19lcnJvcl9jb2RlLCBuZXdfc3RhY2s7CisgICAgdWludDMyX3QgZTEsIGUyLCBlMywgc3M7CisgICAgdGFyZ2V0X3Vsb25nIG9sZF9laXAsIGVzcCwgb2Zmc2V0OworCisgICAgaGFzX2Vycm9yX2NvZGUgPSAwOworICAgIGlmICghaXNfaW50ICYmICFpc19odykKKyAgICAgICAgaGFzX2Vycm9yX2NvZGUgPSBleGVwdGlvbl9oYXNfZXJyb3JfY29kZShpbnRubyk7CisgICAgaWYgKGlzX2ludCkKKyAgICAgICAgb2xkX2VpcCA9IG5leHRfZWlwOworICAgIGVsc2UKKyAgICAgICAgb2xkX2VpcCA9IGVudi0+ZWlwOworCisgICAgZHQgPSAmZW52LT5pZHQ7CisgICAgaWYgKGludG5vICogMTYgKyAxNSA+IGR0LT5saW1pdCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIGludG5vICogMTYgKyAyKTsKKyAgICBwdHIgPSBkdC0+YmFzZSArIGludG5vICogMTY7CisgICAgZTEgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0cik7CisgICAgZTIgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0ciArIDQpOworICAgIGUzID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA4KTsKKyAgICAvKiBjaGVjayBnYXRlIHR5cGUgKi8KKyAgICB0eXBlID0gKGUyID4+IERFU0NfVFlQRV9TSElGVCkgJiAweDFmOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSAxNDogLyogMzg2IGludGVycnVwdCBnYXRlICovCisgICAgY2FzZSAxNTogLyogMzg2IHRyYXAgZ2F0ZSAqLworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgaW50bm8gKiAxNiArIDIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZHBsID0gKGUyID4+IERFU0NfRFBMX1NISUZUKSAmIDM7CisgICAgY3BsID0gZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSzsKKyAgICAvKiBjaGVjayBwcml2aWxlZ2UgaWYgc29mdHdhcmUgaW50ICovCisgICAgaWYgKGlzX2ludCAmJiBkcGwgPCBjcGwpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBpbnRubyAqIDE2ICsgMik7CisgICAgLyogY2hlY2sgdmFsaWQgYml0ICovCisgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsIGludG5vICogMTYgKyAyKTsKKyAgICBzZWxlY3RvciA9IGUxID4+IDE2OworICAgIG9mZnNldCA9ICgodGFyZ2V0X3Vsb25nKWUzIDw8IDMyKSB8IChlMiAmIDB4ZmZmZjAwMDApIHwgKGUxICYgMHgwMDAwZmZmZik7CisgICAgaXN0ID0gZTIgJiA3OworICAgIGlmICgoc2VsZWN0b3IgJiAweGZmZmMpID09IDApCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCAwKTsKKworICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmZTEsICZlMiwgc2VsZWN0b3IpICE9IDApCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgaWYgKCEoZTIgJiBERVNDX1NfTUFTSykgfHwgIShlMiAmIChERVNDX0NTX01BU0spKSkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICBkcGwgPSAoZTIgPj4gREVTQ19EUExfU0hJRlQpICYgMzsKKyAgICBpZiAoZHBsID4gY3BsKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgaWYgKCEoZTIgJiBERVNDX0xfTUFTSykgfHwgKGUyICYgREVTQ19CX01BU0spKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgIGlmICgoIShlMiAmIERFU0NfQ19NQVNLKSAmJiBkcGwgPCBjcGwpIHx8IGlzdCAhPSAwKSB7CisgICAgICAgIC8qIHRvIGlubmVyIHByaXZpbGVnZSAqLworICAgICAgICBpZiAoaXN0ICE9IDApCisgICAgICAgICAgICBlc3AgPSBnZXRfcnNwX2Zyb21fdHNzKGVudiwgaXN0ICsgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVzcCA9IGdldF9yc3BfZnJvbV90c3MoZW52LCBkcGwpOworICAgICAgICBlc3AgJj0gfjB4ZkxMOyAvKiBhbGlnbiBzdGFjayAqLworICAgICAgICBzcyA9IDA7CisgICAgICAgIG5ld19zdGFjayA9IDE7CisgICAgfSBlbHNlIGlmICgoZTIgJiBERVNDX0NfTUFTSykgfHwgZHBsID09IGNwbCkgeworICAgICAgICAvKiB0byBzYW1lIHByaXZpbGVnZSAqLworICAgICAgICBpZiAoZW52LT5lZmxhZ3MgJiBWTV9NQVNLKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgbmV3X3N0YWNrID0gMDsKKyAgICAgICAgaWYgKGlzdCAhPSAwKQorICAgICAgICAgICAgZXNwID0gZ2V0X3JzcF9mcm9tX3RzcyhlbnYsIGlzdCArIDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlc3AgPSBFU1A7CisgICAgICAgIGVzcCAmPSB+MHhmTEw7IC8qIGFsaWduIHN0YWNrICovCisgICAgICAgIGRwbCA9IGNwbDsKKyAgICB9IGVsc2UgeworICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBuZXdfc3RhY2sgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisgICAgICAgIGVzcCA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KKyAgICB9CisKKyAgICBQVVNIUShlc3AsIGVudi0+c2Vnc1tSX1NTXS5zZWxlY3Rvcik7CisgICAgUFVTSFEoZXNwLCBFU1ApOworICAgIFBVU0hRKGVzcCwgY3B1X2NvbXB1dGVfZWZsYWdzKGVudikpOworICAgIFBVU0hRKGVzcCwgZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yKTsKKyAgICBQVVNIUShlc3AsIG9sZF9laXApOworICAgIGlmIChoYXNfZXJyb3JfY29kZSkgeworICAgICAgICBQVVNIUShlc3AsIGVycm9yX2NvZGUpOworICAgIH0KKworICAgIGlmIChuZXdfc3RhY2spIHsKKyAgICAgICAgc3MgPSAwIHwgZHBsOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgc3MsIDAsIDAsIDApOworICAgIH0KKyAgICBFU1AgPSBlc3A7CisKKyAgICBzZWxlY3RvciA9IChzZWxlY3RvciAmIH4zKSB8IGRwbDsKKyAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19saW1pdChlMSwgZTIpLAorICAgICAgICAgICAgICAgICAgIGUyKTsKKyAgICBjcHVfeDg2X3NldF9jcGwoZW52LCBkcGwpOworICAgIGVudi0+ZWlwID0gb2Zmc2V0OworCisgICAgLyogaW50ZXJydXB0IGdhdGUgY2xlYXIgSUYgbWFzayAqLworICAgIGlmICgodHlwZSAmIDEpID09IDApIHsKKyAgICAgICAgZW52LT5lZmxhZ3MgJj0gfklGX01BU0s7CisgICAgfQorICAgIGVudi0+ZWZsYWdzICY9IH4oVEZfTUFTSyB8IFZNX01BU0sgfCBSRl9NQVNLIHwgTlRfTUFTSyk7Cit9CisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIGhlbHBlcl9zeXNjYWxsKENQVVg4NlN0YXRlICplbnYsIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX1NZU0NBTEw7CisgICAgZW52LT5leGNlcHRpb25fbmV4dF9laXAgPSBlbnYtPmVpcCArIG5leHRfZWlwX2FkZGVuZDsKKyAgICBjcHVfbG9vcF9leGl0KGVudik7Cit9CisjZWxzZQordm9pZCBoZWxwZXJfc3lzY2FsbChDUFVYODZTdGF0ZSAqZW52LCBpbnQgbmV4dF9laXBfYWRkZW5kKQoreworICAgIGludCBzZWxlY3RvcjsKKworICAgIGlmICghKGVudi0+ZWZlciAmIE1TUl9FRkVSX1NDRSkpIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwNl9JTExPUCwgMCk7CisgICAgfQorICAgIHNlbGVjdG9yID0gKGVudi0+c3RhciA+PiAzMikgJiAweGZmZmY7CisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfTE1BX01BU0spIHsKKyAgICAgICAgaW50IGNvZGU2NDsKKworICAgICAgICBFQ1ggPSBlbnYtPmVpcCArIG5leHRfZWlwX2FkZGVuZDsKKyAgICAgICAgZW52LT5yZWdzWzExXSA9IGNwdV9jb21wdXRlX2VmbGFncyhlbnYpOworCisgICAgICAgIGNvZGU2NCA9IGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLOworCisgICAgICAgIGNwdV94ODZfc2V0X2NwbChlbnYsIDApOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgc2VsZWN0b3IgJiAweGZmZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0NTX01BU0sgfCBERVNDX1JfTUFTSyB8IERFU0NfQV9NQVNLIHwgREVTQ19MX01BU0spOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgKHNlbGVjdG9yICsgOCkgJiAweGZmZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0dfTUFTSyB8IERFU0NfQl9NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1dfTUFTSyB8IERFU0NfQV9NQVNLKTsKKyAgICAgICAgZW52LT5lZmxhZ3MgJj0gfmVudi0+Zm1hc2s7CisgICAgICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsIGVudi0+ZWZsYWdzLCAwKTsKKyAgICAgICAgaWYgKGNvZGU2NCkKKyAgICAgICAgICAgIGVudi0+ZWlwID0gZW52LT5sc3RhcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52LT5laXAgPSBlbnYtPmNzdGFyOworICAgIH0gZWxzZSB7CisgICAgICAgIEVDWCA9ICh1aW50MzJfdCkoZW52LT5laXAgKyBuZXh0X2VpcF9hZGRlbmQpOworCisgICAgICAgIGNwdV94ODZfc2V0X2NwbChlbnYsIDApOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgc2VsZWN0b3IgJiAweGZmZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19CX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfQ1NfTUFTSyB8IERFU0NfUl9NQVNLIHwgREVTQ19BX01BU0spOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgKHNlbGVjdG9yICsgOCkgJiAweGZmZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0dfTUFTSyB8IERFU0NfQl9NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1dfTUFTSyB8IERFU0NfQV9NQVNLKTsKKyAgICAgICAgZW52LT5lZmxhZ3MgJj0gfihJRl9NQVNLIHwgUkZfTUFTSyB8IFZNX01BU0spOworICAgICAgICBlbnYtPmVpcCA9ICh1aW50MzJfdCllbnYtPnN0YXI7CisgICAgfQorfQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9YODZfNjQKK3ZvaWQgaGVscGVyX3N5c3JldChDUFVYODZTdGF0ZSAqZW52LCBpbnQgZGZsYWcpCit7CisgICAgaW50IGNwbCwgc2VsZWN0b3I7CisKKyAgICBpZiAoIShlbnYtPmVmZXIgJiBNU1JfRUZFUl9TQ0UpKSB7CisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMDZfSUxMT1AsIDApOworICAgIH0KKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIGlmICghKGVudi0+Y3JbMF0gJiBDUjBfUEVfTUFTSykgfHwgY3BsICE9IDApIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIH0KKyAgICBzZWxlY3RvciA9IChlbnYtPnN0YXIgPj4gNDgpICYgMHhmZmZmOworICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0xNQV9NQVNLKSB7CisgICAgICAgIGlmIChkZmxhZyA9PSAyKSB7CisgICAgICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgKHNlbGVjdG9yICsgMTYpIHwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwgKDMgPDwgREVTQ19EUExfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19DU19NQVNLIHwgREVTQ19SX01BU0sgfCBERVNDX0FfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfTF9NQVNLKTsKKyAgICAgICAgICAgIGVudi0+ZWlwID0gRUNYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIHNlbGVjdG9yIHwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX0JfTUFTSyB8IERFU0NfUF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfCAoMyA8PCBERVNDX0RQTF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0NTX01BU0sgfCBERVNDX1JfTUFTSyB8IERFU0NfQV9NQVNLKTsKKyAgICAgICAgICAgIGVudi0+ZWlwID0gKHVpbnQzMl90KUVDWDsKKyAgICAgICAgfQorICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgc2VsZWN0b3IgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX0JfTUFTSyB8IERFU0NfUF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NfTUFTSyB8ICgzIDw8IERFU0NfRFBMX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19XX01BU0sgfCBERVNDX0FfTUFTSyk7CisgICAgICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsICh1aW50MzJfdCkoZW52LT5yZWdzWzExXSksIFRGX01BU0sgfCBBQ19NQVNLIHwgSURfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgIElGX01BU0sgfCBJT1BMX01BU0sgfCBWTV9NQVNLIHwgUkZfTUFTSyB8IE5UX01BU0spOworICAgICAgICBjcHVfeDg2X3NldF9jcGwoZW52LCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgc2VsZWN0b3IgfCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX0JfTUFTSyB8IERFU0NfUF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NfTUFTSyB8ICgzIDw8IERFU0NfRFBMX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19DU19NQVNLIHwgREVTQ19SX01BU0sgfCBERVNDX0FfTUFTSyk7CisgICAgICAgIGVudi0+ZWlwID0gKHVpbnQzMl90KUVDWDsKKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfU1MsIHNlbGVjdG9yICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19CX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfCAoMyA8PCBERVNDX0RQTF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfV19NQVNLIHwgREVTQ19BX01BU0spOworICAgICAgICBlbnYtPmVmbGFncyB8PSBJRl9NQVNLOworICAgICAgICBjcHVfeDg2X3NldF9jcGwoZW52LCAzKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyogcmVhbCBtb2RlIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgZG9faW50ZXJydXB0X3JlYWwoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRubywgaW50IGlzX2ludCwgaW50IGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmV4dF9laXApCit7CisgICAgU2VnbWVudENhY2hlICpkdDsKKyAgICB0YXJnZXRfdWxvbmcgcHRyLCBzc3A7CisgICAgaW50IHNlbGVjdG9yOworICAgIHVpbnQzMl90IG9mZnNldCwgZXNwOworICAgIHVpbnQzMl90IG9sZF9jcywgb2xkX2VpcDsKKworICAgIC8qIHJlYWwgbW9kZSAoc2ltcGxlciAhKSAqLworICAgIGR0ID0gJmVudi0+aWR0OworICAgIGlmIChpbnRubyAqIDQgKyAzID4gZHQtPmxpbWl0KQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgaW50bm8gKiA4ICsgMik7CisgICAgcHRyID0gZHQtPmJhc2UgKyBpbnRubyAqIDQ7CisgICAgb2Zmc2V0ID0gY3B1X2xkdXdfa2VybmVsKGVudiwgcHRyKTsKKyAgICBzZWxlY3RvciA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIHB0ciArIDIpOworICAgIGVzcCA9IEVTUDsKKyAgICBzc3AgPSBlbnYtPnNlZ3NbUl9TU10uYmFzZTsKKyAgICBpZiAoaXNfaW50KQorICAgICAgICBvbGRfZWlwID0gbmV4dF9laXA7CisgICAgZWxzZQorICAgICAgICBvbGRfZWlwID0gZW52LT5laXA7CisgICAgb2xkX2NzID0gZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yOworICAgIC8qIFhYWDogdXNlIFNTIHNlZ21lbnQgc2l6ZSA/ICovCisgICAgUFVTSFcoc3NwLCBlc3AsIDB4ZmZmZiwgY3B1X2NvbXB1dGVfZWZsYWdzKGVudikpOworICAgIFBVU0hXKHNzcCwgZXNwLCAweGZmZmYsIG9sZF9jcyk7CisgICAgUFVTSFcoc3NwLCBlc3AsIDB4ZmZmZiwgb2xkX2VpcCk7CisKKyAgICAvKiB1cGRhdGUgcHJvY2Vzc29yIHN0YXRlICovCisgICAgRVNQID0gKEVTUCAmIH4weGZmZmYpIHwgKGVzcCAmIDB4ZmZmZik7CisgICAgZW52LT5laXAgPSBvZmZzZXQ7CisgICAgZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgZW52LT5zZWdzW1JfQ1NdLmJhc2UgPSAoc2VsZWN0b3IgPDwgNCk7CisgICAgZW52LT5lZmxhZ3MgJj0gfihJRl9NQVNLIHwgVEZfTUFTSyB8IEFDX01BU0sgfCBSRl9NQVNLKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKy8qIGZha2UgdXNlciBtb2RlIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgZG9faW50ZXJydXB0X3VzZXIoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRubywgaW50IGlzX2ludCwgaW50IGVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbmV4dF9laXApCit7CisgICAgU2VnbWVudENhY2hlICpkdDsKKyAgICB0YXJnZXRfdWxvbmcgcHRyOworICAgIGludCBkcGwsIGNwbCwgc2hpZnQ7CisgICAgdWludDMyX3QgZTI7CisKKyAgICBkdCA9ICZlbnYtPmlkdDsKKyAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgeworICAgICAgICBzaGlmdCA9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hpZnQgPSAzOworICAgIH0KKyAgICBwdHIgPSBkdC0+YmFzZSArIChpbnRubyA8PCBzaGlmdCk7CisgICAgZTIgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0ciArIDQpOworCisgICAgZHBsID0gKGUyID4+IERFU0NfRFBMX1NISUZUKSAmIDM7CisgICAgY3BsID0gZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSzsKKyAgICAvKiBjaGVjayBwcml2aWxlZ2UgaWYgc29mdHdhcmUgaW50ICovCisgICAgaWYgKGlzX2ludCAmJiBkcGwgPCBjcGwpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCAoaW50bm8gPDwgc2hpZnQpICsgMik7CisKKyAgICAvKiBTaW5jZSB3ZSBlbXVsYXRlIG9ubHkgdXNlciBzcGFjZSwgd2UgY2Fubm90IGRvIG1vcmUgdGhhbgorICAgICAgIGV4aXRpbmcgdGhlIGVtdWxhdGlvbiB3aXRoIHRoZSBzdWl0YWJsZSBleGNlcHRpb24gYW5kIGVycm9yCisgICAgICAgY29kZSAqLworICAgIGlmIChpc19pbnQpCisgICAgICAgIEVJUCA9IG5leHRfZWlwOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZXZlbl9pbmooQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50bm8sIGludCBpc19pbnQsIGludCBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19odywgaW50IHJtKQoreworICAgIHVpbnQzMl90IGV2ZW50X2luaiA9IGxkbF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV2ZW50X2luaikpOworICAgIGlmICghKGV2ZW50X2luaiAmIFNWTV9FVlRJTkpfVkFMSUQpKSB7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGlmIChpc19pbnQpCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTVk1fRVZUSU5KX1RZUEVfU09GVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IFNWTV9FVlRJTkpfVFlQRV9FWEVQVDsKKyAgICAgICAgICAgIGV2ZW50X2luaiA9IGludG5vIHwgdHlwZSB8IFNWTV9FVlRJTkpfVkFMSUQ7CisgICAgICAgICAgICBpZiAoIXJtICYmIGV4ZXB0aW9uX2hhc19lcnJvcl9jb2RlKGludG5vKSkgeworICAgICAgICAgICAgICAgICAgICBldmVudF9pbmogfD0gU1ZNX0VWVElOSl9WQUxJRF9FUlI7CisgICAgICAgICAgICAgICAgICAgIHN0bF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV2ZW50X2lual9lcnIpLCBlcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0bF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV2ZW50X2luaiksIGV2ZW50X2luaik7CisgICAgfQorfQorI2VuZGlmCisKKy8qCisgKiBCZWdpbiBleGVjdXRpb24gb2YgYW4gaW50ZXJydXB0aW9uLiBpc19pbnQgaXMgVFJVRSBpZiBjb21pbmcgZnJvbQorICogdGhlIGludCBpbnN0cnVjdGlvbi4gbmV4dF9laXAgaXMgdGhlIEVJUCB2YWx1ZSBBRlRFUiB0aGUgaW50ZXJydXB0CisgKiBpbnN0cnVjdGlvbi4gSXQgaXMgb25seSByZWxldmFudCBpZiBpc19pbnQgaXMgVFJVRS4KKyAqLworc3RhdGljIHZvaWQgZG9faW50ZXJydXB0X2FsbChDUFVYODZTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50bm8sIGludCBpc19pbnQsIGludCBlcnJvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbmV4dF9laXAsIGludCBpc19odykKK3sKKyAgICBpZiAocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9MT0dfSU5UKSkgeworICAgICAgICBpZiAoKGVudi0+Y3JbMF0gJiBDUjBfUEVfTUFTSykpIHsKKyAgICAgICAgICAgIHN0YXRpYyBpbnQgY291bnQ7CisgICAgICAgICAgICBxZW11X2xvZygiJTZkOiB2PSUwMnggZT0lMDR4IGk9JWQgY3BsPSVkIElQPSUwNHg6IiBUQVJHRVRfRk1UX2x4ICIgcGM9IiBUQVJHRVRfRk1UX2x4ICIgU1A9JTA0eDoiIFRBUkdFVF9GTVRfbHgsCisgICAgICAgICAgICAgICAgICAgIGNvdW50LCBpbnRubywgZXJyb3JfY29kZSwgaXNfaW50LAorICAgICAgICAgICAgICAgICAgICBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IsIEVJUCwKKyAgICAgICAgICAgICAgICAgICAgKGludCllbnYtPnNlZ3NbUl9DU10uYmFzZSArIEVJUCwKKyAgICAgICAgICAgICAgICAgICAgZW52LT5zZWdzW1JfU1NdLnNlbGVjdG9yLCBFU1ApOworICAgICAgICAgICAgaWYgKGludG5vID09IDB4MGUpIHsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiIENSMj0iIFRBUkdFVF9GTVRfbHgsIGVudi0+Y3JbMl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiIEVBWD0iIFRBUkdFVF9GTVRfbHgsIEVBWCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxZW11X2xvZygiXG4iKTsKKyAgICAgICAgICAgIGxvZ19jcHVfc3RhdGUoRU5WX0dFVF9DUFUoZW52KSwgWDg2X0RVTVBfQ0NPUCk7CisjaWYgMAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiICAgICAgIGNvZGU9Iik7CisgICAgICAgICAgICAgICAgcHRyID0gZW52LT5zZWdzW1JfQ1NdLmJhc2UgKyBlbnYtPmVpcDsKKyAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIgJTAyeCIsIGxkdWIocHRyICsgaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBxZW11X2xvZygiXG4iKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW52LT5jclswXSAmIENSMF9QRV9NQVNLKSB7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfU1ZNSV9NQVNLKQorICAgICAgICAgICAgaGFuZGxlX2V2ZW5faW5qKGVudiwgaW50bm8sIGlzX2ludCwgZXJyb3JfY29kZSwgaXNfaHcsIDApOworI2VuZGlmCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgeworICAgICAgICAgICAgZG9faW50ZXJydXB0NjQoZW52LCBpbnRubywgaXNfaW50LCBlcnJvcl9jb2RlLCBuZXh0X2VpcCwgaXNfaHcpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBkb19pbnRlcnJ1cHRfcHJvdGVjdGVkKGVudiwgaW50bm8sIGlzX2ludCwgZXJyb3JfY29kZSwgbmV4dF9laXAsIGlzX2h3KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfU1ZNSV9NQVNLKQorICAgICAgICAgICAgaGFuZGxlX2V2ZW5faW5qKGVudiwgaW50bm8sIGlzX2ludCwgZXJyb3JfY29kZSwgaXNfaHcsIDEpOworI2VuZGlmCisgICAgICAgIGRvX2ludGVycnVwdF9yZWFsKGVudiwgaW50bm8sIGlzX2ludCwgZXJyb3JfY29kZSwgbmV4dF9laXApOworICAgIH0KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfU1ZNSV9NQVNLKSB7CisgICAgICAgIHVpbnQzMl90IGV2ZW50X2luaiA9IGxkbF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV2ZW50X2luaikpOworICAgICAgICBzdGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5ldmVudF9pbmopLCBldmVudF9pbmogJiB+U1ZNX0VWVElOSl9WQUxJRCk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZG9faW50ZXJydXB0KENQVVg4NlN0YXRlICplbnYpCit7CisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIC8qIGlmIHVzZXIgbW9kZSBvbmx5LCB3ZSBzaW11bGF0ZSBhIGZha2UgZXhjZXB0aW9uCisgICAgICAgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIG91dHNpZGUgdGhlIGNwdSBleGVjdXRpb24KKyAgICAgICBsb29wICovCisgICAgZG9faW50ZXJydXB0X3VzZXIoZW52LAorICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2lzX2ludCwKKyAgICAgICAgICAgICAgICAgICAgICBlbnYtPmVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25fbmV4dF9laXApOworICAgIC8qIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgKi8KKyAgICBlbnYtPm9sZF9leGNlcHRpb24gPSAtMTsKKyNlbHNlCisgICAgLyogc2ltdWxhdGUgYSByZWFsIGNwdSBleGNlcHRpb24uIE9uIGkzODYsIGl0IGNhbgorICAgICAgIHRyaWdnZXIgbmV3IGV4Y2VwdGlvbnMsIGJ1dCB3ZSBkbyBub3QgaGFuZGxlCisgICAgICAgZG91YmxlIG9yIHRyaXBsZSBmYXVsdHMgeWV0LiAqLworICAgIGRvX2ludGVycnVwdF9hbGwoZW52LAorICAgICAgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pc19pbnQsCisgICAgICAgICAgICAgICAgICAgICBlbnYtPmVycm9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9uZXh0X2VpcCwgMCk7CisgICAgLyogc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZCAqLworICAgIGVudi0+b2xkX2V4Y2VwdGlvbiA9IC0xOworI2VuZGlmCit9CisKK3ZvaWQgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKENQVVg4NlN0YXRlICplbnYsIGludCBpbnRubywgaW50IGlzX2h3KQoreworICAgIGRvX2ludGVycnVwdF9hbGwoZW52LCBpbnRubywgMCwgMCwgMCwgaXNfaHcpOworfQorCisvKiBUaGlzIHNob3VsZCBjb21lIGZyb20gc3lzZW11LmggLSBpZiB3ZSBjb3VsZCBpbmNsdWRlIGl0IGhlcmUuLi4gKi8KK3ZvaWQgcWVtdV9zeXN0ZW1fcmVzZXRfcmVxdWVzdCh2b2lkKTsKKwordm9pZCBoZWxwZXJfZW50ZXJfbGV2ZWwoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgaW50IGRhdGEzMiwgdGFyZ2V0X3Vsb25nIHQxKQoreworICAgIHRhcmdldF91bG9uZyBzc3A7CisgICAgdWludDMyX3QgZXNwX21hc2ssIGVzcCwgZWJwOworCisgICAgZXNwX21hc2sgPSBnZXRfc3BfbWFzayhlbnYtPnNlZ3NbUl9TU10uZmxhZ3MpOworICAgIHNzcCA9IGVudi0+c2Vnc1tSX1NTXS5iYXNlOworICAgIGVicCA9IEVCUDsKKyAgICBlc3AgPSBFU1A7CisgICAgaWYgKGRhdGEzMikgeworICAgICAgICAvKiAzMiBiaXQgKi8KKyAgICAgICAgZXNwIC09IDQ7CisgICAgICAgIHdoaWxlICgtLWxldmVsKSB7CisgICAgICAgICAgICBlc3AgLT0gNDsKKyAgICAgICAgICAgIGVicCAtPSA0OworICAgICAgICAgICAgY3B1X3N0bF9kYXRhKGVudiwgc3NwICsgKGVzcCAmIGVzcF9tYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfbGRsX2RhdGEoZW52LCBzc3AgKyAoZWJwICYgZXNwX21hc2spKSk7CisgICAgICAgIH0KKyAgICAgICAgZXNwIC09IDQ7CisgICAgICAgIGNwdV9zdGxfZGF0YShlbnYsIHNzcCArIChlc3AgJiBlc3BfbWFzayksIHQxKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiAxNiBiaXQgKi8KKyAgICAgICAgZXNwIC09IDI7CisgICAgICAgIHdoaWxlICgtLWxldmVsKSB7CisgICAgICAgICAgICBlc3AgLT0gMjsKKyAgICAgICAgICAgIGVicCAtPSAyOworICAgICAgICAgICAgY3B1X3N0d19kYXRhKGVudiwgc3NwICsgKGVzcCAmIGVzcF9tYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfbGR1d19kYXRhKGVudiwgc3NwICsgKGVicCAmIGVzcF9tYXNrKSkpOworICAgICAgICB9CisgICAgICAgIGVzcCAtPSAyOworICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBzc3AgKyAoZXNwICYgZXNwX21hc2spLCB0MSk7CisgICAgfQorfQorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAordm9pZCBoZWxwZXJfZW50ZXI2NF9sZXZlbChDUFVYODZTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIGludCBkYXRhNjQsIHRhcmdldF91bG9uZyB0MSkKK3sKKyAgICB0YXJnZXRfdWxvbmcgZXNwLCBlYnA7CisgICAgZWJwID0gRUJQOworICAgIGVzcCA9IEVTUDsKKworICAgIGlmIChkYXRhNjQpIHsKKyAgICAgICAgLyogNjQgYml0ICovCisgICAgICAgIGVzcCAtPSA4OworICAgICAgICB3aGlsZSAoLS1sZXZlbCkgeworICAgICAgICAgICAgZXNwIC09IDg7CisgICAgICAgICAgICBlYnAgLT0gODsKKyAgICAgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGVzcCwgY3B1X2xkcV9kYXRhKGVudiwgZWJwKSk7CisgICAgICAgIH0KKyAgICAgICAgZXNwIC09IDg7CisgICAgICAgIGNwdV9zdHFfZGF0YShlbnYsIGVzcCwgdDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIDE2IGJpdCAqLworICAgICAgICBlc3AgLT0gMjsKKyAgICAgICAgd2hpbGUgKC0tbGV2ZWwpIHsKKyAgICAgICAgICAgIGVzcCAtPSAyOworICAgICAgICAgICAgZWJwIC09IDI7CisgICAgICAgICAgICBjcHVfc3R3X2RhdGEoZW52LCBlc3AsIGNwdV9sZHV3X2RhdGEoZW52LCBlYnApKTsKKyAgICAgICAgfQorICAgICAgICBlc3AgLT0gMjsKKyAgICAgICAgY3B1X3N0d19kYXRhKGVudiwgZXNwLCB0MSk7CisgICAgfQorfQorI2VuZGlmCisKK3ZvaWQgaGVscGVyX2xsZHQoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHNlbGVjdG9yKQoreworICAgIFNlZ21lbnRDYWNoZSAqZHQ7CisgICAgdWludDMyX3QgZTEsIGUyOworICAgIGludCBpbmRleCwgZW50cnlfbGltaXQ7CisgICAgdGFyZ2V0X3Vsb25nIHB0cjsKKworICAgIHNlbGVjdG9yICY9IDB4ZmZmZjsKKyAgICBpZiAoKHNlbGVjdG9yICYgMHhmZmZjKSA9PSAwKSB7CisgICAgICAgIC8qIFhYWDogTlVMTCBzZWxlY3RvciBjYXNlOiBpbnZhbGlkIExEVCAqLworICAgICAgICBlbnYtPmxkdC5iYXNlID0gMDsKKyAgICAgICAgZW52LT5sZHQubGltaXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZWxlY3RvciAmIDB4NCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGR0ID0gJmVudi0+Z2R0OworICAgICAgICBpbmRleCA9IHNlbGVjdG9yICYgfjc7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykKKyAgICAgICAgICAgIGVudHJ5X2xpbWl0ID0gMTU7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgZW50cnlfbGltaXQgPSA3OworICAgICAgICBpZiAoKGluZGV4ICsgZW50cnlfbGltaXQpID4gZHQtPmxpbWl0KQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgcHRyID0gZHQtPmJhc2UgKyBpbmRleDsKKyAgICAgICAgZTEgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0cik7CisgICAgICAgIGUyID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA0KTsKKyAgICAgICAgaWYgKChlMiAmIERFU0NfU19NQVNLKSB8fCAoKGUyID4+IERFU0NfVFlQRV9TSElGVCkgJiAweGYpICE9IDIpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0xNQV9NQVNLKSB7CisgICAgICAgICAgICB1aW50MzJfdCBlMzsKKyAgICAgICAgICAgIGUzID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA4KTsKKyAgICAgICAgICAgIGxvYWRfc2VnX2NhY2hlX3Jhd19kdCgmZW52LT5sZHQsIGUxLCBlMik7CisgICAgICAgICAgICBlbnYtPmxkdC5iYXNlIHw9ICh0YXJnZXRfdWxvbmcpZTMgPDwgMzI7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvYWRfc2VnX2NhY2hlX3Jhd19kdCgmZW52LT5sZHQsIGUxLCBlMik7CisgICAgICAgIH0KKyAgICB9CisgICAgZW52LT5sZHQuc2VsZWN0b3IgPSBzZWxlY3RvcjsKK30KKwordm9pZCBoZWxwZXJfbHRyKENQVVg4NlN0YXRlICplbnYsIGludCBzZWxlY3RvcikKK3sKKyAgICBTZWdtZW50Q2FjaGUgKmR0OworICAgIHVpbnQzMl90IGUxLCBlMjsKKyAgICBpbnQgaW5kZXgsIHR5cGUsIGVudHJ5X2xpbWl0OworICAgIHRhcmdldF91bG9uZyBwdHI7CisKKyAgICBzZWxlY3RvciAmPSAweGZmZmY7CisgICAgaWYgKChzZWxlY3RvciAmIDB4ZmZmYykgPT0gMCkgeworICAgICAgICAvKiBOVUxMIHNlbGVjdG9yIGNhc2U6IGludmFsaWQgVFIgKi8KKyAgICAgICAgZW52LT50ci5iYXNlID0gMDsKKyAgICAgICAgZW52LT50ci5saW1pdCA9IDA7CisgICAgICAgIGVudi0+dHIuZmxhZ3MgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzZWxlY3RvciAmIDB4NCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGR0ID0gJmVudi0+Z2R0OworICAgICAgICBpbmRleCA9IHNlbGVjdG9yICYgfjc7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykKKyAgICAgICAgICAgIGVudHJ5X2xpbWl0ID0gMTU7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgZW50cnlfbGltaXQgPSA3OworICAgICAgICBpZiAoKGluZGV4ICsgZW50cnlfbGltaXQpID4gZHQtPmxpbWl0KQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgcHRyID0gZHQtPmJhc2UgKyBpbmRleDsKKyAgICAgICAgZTEgPSBjcHVfbGRsX2tlcm5lbChlbnYsIHB0cik7CisgICAgICAgIGUyID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIgKyA0KTsKKyAgICAgICAgdHlwZSA9IChlMiA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmOworICAgICAgICBpZiAoKGUyICYgREVTQ19TX01BU0spIHx8CisgICAgICAgICAgICAodHlwZSAhPSAxICYmIHR5cGUgIT0gOSkpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0xNQV9NQVNLKSB7CisgICAgICAgICAgICB1aW50MzJfdCBlMywgZTQ7CisgICAgICAgICAgICBlMyA9IGNwdV9sZGxfa2VybmVsKGVudiwgcHRyICsgOCk7CisgICAgICAgICAgICBlNCA9IGNwdV9sZGxfa2VybmVsKGVudiwgcHRyICsgMTIpOworICAgICAgICAgICAgaWYgKChlNCA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICBsb2FkX3NlZ19jYWNoZV9yYXdfZHQoJmVudi0+dHIsIGUxLCBlMik7CisgICAgICAgICAgICBlbnYtPnRyLmJhc2UgfD0gKHRhcmdldF91bG9uZyllMyA8PCAzMjsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgbG9hZF9zZWdfY2FjaGVfcmF3X2R0KCZlbnYtPnRyLCBlMSwgZTIpOworICAgICAgICB9CisgICAgICAgIGUyIHw9IERFU0NfVFNTX0JVU1lfTUFTSzsKKyAgICAgICAgY3B1X3N0bF9rZXJuZWwoZW52LCBwdHIgKyA0LCBlMik7CisgICAgfQorICAgIGVudi0+dHIuc2VsZWN0b3IgPSBzZWxlY3RvcjsKK30KKworLyogb25seSB3b3JrcyBpZiBwcm90ZWN0ZWQgbW9kZSBhbmQgbm90IFZNODYuIHNlZ19yZWcgbXVzdCBiZSAhPSBSX0NTICovCit2b2lkIGhlbHBlcl9sb2FkX3NlZyhDUFVYODZTdGF0ZSAqZW52LCBpbnQgc2VnX3JlZywgaW50IHNlbGVjdG9yKQoreworICAgIHVpbnQzMl90IGUxLCBlMjsKKyAgICBpbnQgY3BsLCBkcGwsIHJwbDsKKyAgICBTZWdtZW50Q2FjaGUgKmR0OworICAgIGludCBpbmRleDsKKyAgICB0YXJnZXRfdWxvbmcgcHRyOworCisgICAgc2VsZWN0b3IgJj0gMHhmZmZmOworICAgIGNwbCA9IGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0s7CisgICAgaWYgKChzZWxlY3RvciAmIDB4ZmZmYykgPT0gMCkgeworICAgICAgICAvKiBudWxsIHNlbGVjdG9yIGNhc2UgKi8KKyAgICAgICAgaWYgKHNlZ19yZWcgPT0gUl9TUworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgICYmICghKGVudi0+aGZsYWdzICYgSEZfQ1M2NF9NQVNLKSB8fCBjcGwgPT0gMykKKyNlbmRpZgorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgc2VnX3JlZywgc2VsZWN0b3IsIDAsIDAsIDApOworICAgIH0gZWxzZSB7CisKKyAgICAgICAgaWYgKHNlbGVjdG9yICYgMHg0KQorICAgICAgICAgICAgZHQgPSAmZW52LT5sZHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGR0ID0gJmVudi0+Z2R0OworICAgICAgICBpbmRleCA9IHNlbGVjdG9yICYgfjc7CisgICAgICAgIGlmICgoaW5kZXggKyA3KSA+IGR0LT5saW1pdCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIHB0ciA9IGR0LT5iYXNlICsgaW5kZXg7CisgICAgICAgIGUxID0gY3B1X2xkbF9rZXJuZWwoZW52LCBwdHIpOworICAgICAgICBlMiA9IGNwdV9sZGxfa2VybmVsKGVudiwgcHRyICsgNCk7CisKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1NfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBycGwgPSBzZWxlY3RvciAmIDM7CisgICAgICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICBpZiAoc2VnX3JlZyA9PSBSX1NTKSB7CisgICAgICAgICAgICAvKiBtdXN0IGJlIHdyaXRhYmxlIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIGlmICgoZTIgJiBERVNDX0NTX01BU0spIHx8ICEoZTIgJiBERVNDX1dfTUFTSykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmIChycGwgIT0gY3BsIHx8IGRwbCAhPSBjcGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG11c3QgYmUgcmVhZGFibGUgc2VnbWVudCAqLworICAgICAgICAgICAgaWYgKChlMiAmIChERVNDX0NTX01BU0sgfCBERVNDX1JfTUFTSykpID09IERFU0NfQ1NfTUFTSykKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgc2VsZWN0b3IgJiAweGZmZmMpOworCisgICAgICAgICAgICBpZiAoIShlMiAmIERFU0NfQ1NfTUFTSykgfHwgIShlMiAmIERFU0NfQ19NQVNLKSkgeworICAgICAgICAgICAgICAgIC8qIGlmIG5vdCBjb25mb3JtaW5nIGNvZGUsIHRlc3QgcmlnaHRzICovCisgICAgICAgICAgICAgICAgaWYgKGRwbCA8IGNwbCB8fCBkcGwgPCBycGwpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkgeworICAgICAgICAgICAgaWYgKHNlZ19yZWcgPT0gUl9TUykKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBDX1NUQUNLLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQl9OT1NFRywgc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHRoZSBhY2Nlc3MgYml0IGlmIG5vdCBhbHJlYWR5IHNldCAqLworICAgICAgICBpZiAoIShlMiAmIERFU0NfQV9NQVNLKSkgeworICAgICAgICAgICAgZTIgfD0gREVTQ19BX01BU0s7CisgICAgICAgICAgICBjcHVfc3RsX2tlcm5lbChlbnYsIHB0ciArIDQsIGUyKTsKKyAgICAgICAgfQorCisgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBzZWdfcmVnLCBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZTIpOworI2lmIDAKKyAgICAgICAgcWVtdV9sb2coImxvYWRfc2VnOiBzZWw9MHglMDR4IGJhc2U9MHglMDhseCBsaW1pdD0weCUwOGx4IGZsYWdzPSUwOHhcbiIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3IsICh1bnNpZ25lZCBsb25nKXNjLT5iYXNlLCBzYy0+bGltaXQsIHNjLT5mbGFncyk7CisjZW5kaWYKKyAgICB9Cit9CisKKy8qIHByb3RlY3RlZCBtb2RlIGp1bXAgKi8KK3ZvaWQgaGVscGVyX2xqbXBfcHJvdGVjdGVkKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2NzLCB0YXJnZXRfdWxvbmcgbmV3X2VpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgaW50IGdhdGVfY3MsIHR5cGU7CisgICAgdWludDMyX3QgZTEsIGUyLCBjcGwsIGRwbCwgcnBsLCBsaW1pdDsKKyAgICB0YXJnZXRfdWxvbmcgbmV4dF9laXA7CisKKyAgICBpZiAoKG5ld19jcyAmIDB4ZmZmYykgPT0gMCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmZTEsICZlMiwgbmV3X2NzKSAhPSAwKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIGlmIChlMiAmIERFU0NfU19NQVNLKSB7CisgICAgICAgIGlmICghKGUyICYgREVTQ19DU19NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICBkcGwgPSAoZTIgPj4gREVTQ19EUExfU0hJRlQpICYgMzsKKyAgICAgICAgaWYgKGUyICYgREVTQ19DX01BU0spIHsKKyAgICAgICAgICAgIC8qIGNvbmZvcm1pbmcgY29kZSBzZWdtZW50ICovCisgICAgICAgICAgICBpZiAoZHBsID4gY3BsKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbm9uIGNvbmZvcm1pbmcgY29kZSBzZWdtZW50ICovCisgICAgICAgICAgICBycGwgPSBuZXdfY3MgJiAzOworICAgICAgICAgICAgaWYgKHJwbCA+IGNwbCkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmIChkcGwgIT0gY3BsKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICB9CisgICAgICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQl9OT1NFRywgbmV3X2NzICYgMHhmZmZjKTsKKyAgICAgICAgbGltaXQgPSBnZXRfc2VnX2xpbWl0KGUxLCBlMik7CisgICAgICAgIGlmIChuZXdfZWlwID4gbGltaXQgJiYKKyAgICAgICAgICAgICEoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgJiYgIShlMiAmIERFU0NfTF9NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgKG5ld19jcyAmIDB4ZmZmYykgfCBjcGwsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfYmFzZShlMSwgZTIpLCBsaW1pdCwgZTIpOworICAgICAgICBFSVAgPSBuZXdfZWlwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGp1bXAgdG8gY2FsbCBvciB0YXNrIGdhdGUgKi8KKyAgICAgICAgZHBsID0gKGUyID4+IERFU0NfRFBMX1NISUZUKSAmIDM7CisgICAgICAgIHJwbCA9IG5ld19jcyAmIDM7CisgICAgICAgIGNwbCA9IGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0s7CisgICAgICAgIHR5cGUgPSAoZTIgPj4gREVTQ19UWVBFX1NISUZUKSAmIDB4ZjsKKyAgICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSAxOiAvKiAyODYgVFNTICovCisgICAgICAgIGNhc2UgOTogLyogMzg2IFRTUyAqLworICAgICAgICBjYXNlIDU6IC8qIHRhc2sgZ2F0ZSAqLworICAgICAgICAgICAgaWYgKGRwbCA8IGNwbCB8fCBkcGwgPCBycGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgICAgICBuZXh0X2VpcCA9IGVudi0+ZWlwICsgbmV4dF9laXBfYWRkZW5kOworICAgICAgICAgICAgc3dpdGNoX3RzcyhlbnYsIG5ld19jcywgZTEsIGUyLCBTV0lUQ0hfVFNTX0pNUCwgbmV4dF9laXApOworICAgICAgICAgICAgQ0NfT1AgPSBDQ19PUF9FRkxBR1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAvKiAyODYgY2FsbCBnYXRlICovCisgICAgICAgIGNhc2UgMTI6IC8qIDM4NiBjYWxsIGdhdGUgKi8KKyAgICAgICAgICAgIGlmICgoZHBsIDwgY3BsKSB8fCAoZHBsIDwgcnBsKSkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgICAgICBnYXRlX2NzID0gZTEgPj4gMTY7CisgICAgICAgICAgICBuZXdfZWlwID0gKGUxICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IDEyKQorICAgICAgICAgICAgICAgIG5ld19laXAgfD0gKGUyICYgMHhmZmZmMDAwMCk7CisgICAgICAgICAgICBpZiAobG9hZF9zZWdtZW50KGVudiwgJmUxLCAmZTIsIGdhdGVfY3MpICE9IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIGdhdGVfY3MgJiAweGZmZmMpOworICAgICAgICAgICAgZHBsID0gKGUyID4+IERFU0NfRFBMX1NISUZUKSAmIDM7CisgICAgICAgICAgICAvKiBtdXN0IGJlIGNvZGUgc2VnbWVudCAqLworICAgICAgICAgICAgaWYgKCgoZTIgJiAoREVTQ19TX01BU0sgfCBERVNDX0NTX01BU0spKSAhPQorICAgICAgICAgICAgICAgICAoREVTQ19TX01BU0sgfCBERVNDX0NTX01BU0spKSkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgZ2F0ZV9jcyAmIDB4ZmZmYyk7CisgICAgICAgICAgICBpZiAoKChlMiAmIERFU0NfQ19NQVNLKSAmJiAoZHBsID4gY3BsKSkgfHwKKyAgICAgICAgICAgICAgICAoIShlMiAmIERFU0NfQ19NQVNLKSAmJiAoZHBsICE9IGNwbCkpKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBnYXRlX2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICghKGUyICYgREVTQ19QX01BU0spKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBnYXRlX2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGxpbWl0ID0gZ2V0X3NlZ19saW1pdChlMSwgZTIpOworICAgICAgICAgICAgaWYgKG5ld19laXAgPiBsaW1pdCkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgMCk7CisgICAgICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgKGdhdGVfY3MgJiAweGZmZmMpIHwgY3BsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2VnX2Jhc2UoZTEsIGUyKSwgbGltaXQsIGUyKTsKKyAgICAgICAgICAgIEVJUCA9IG5ld19laXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIHJlYWwgbW9kZSBjYWxsICovCit2b2lkIGhlbHBlcl9sY2FsbF9yZWFsKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfY3MsIHRhcmdldF91bG9uZyBuZXdfZWlwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LCBpbnQgbmV4dF9laXApCit7CisgICAgaW50IG5ld19laXA7CisgICAgdWludDMyX3QgZXNwLCBlc3BfbWFzazsKKyAgICB0YXJnZXRfdWxvbmcgc3NwOworCisgICAgbmV3X2VpcCA9IG5ld19laXAxOworICAgIGVzcCA9IEVTUDsKKyAgICBlc3BfbWFzayA9IGdldF9zcF9tYXNrKGVudi0+c2Vnc1tSX1NTXS5mbGFncyk7CisgICAgc3NwID0gZW52LT5zZWdzW1JfU1NdLmJhc2U7CisgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgIFBVU0hMKHNzcCwgZXNwLCBlc3BfbWFzaywgZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yKTsKKyAgICAgICAgUFVTSEwoc3NwLCBlc3AsIGVzcF9tYXNrLCBuZXh0X2VpcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUFVTSFcoc3NwLCBlc3AsIGVzcF9tYXNrLCBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICBQVVNIVyhzc3AsIGVzcCwgZXNwX21hc2ssIG5leHRfZWlwKTsKKyAgICB9CisKKyAgICBTRVRfRVNQKGVzcCwgZXNwX21hc2spOworICAgIGVudi0+ZWlwID0gbmV3X2VpcDsKKyAgICBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IgPSBuZXdfY3M7CisgICAgZW52LT5zZWdzW1JfQ1NdLmJhc2UgPSAobmV3X2NzIDw8IDQpOworfQorCisvKiBwcm90ZWN0ZWQgbW9kZSBjYWxsICovCit2b2lkIGhlbHBlcl9sY2FsbF9wcm90ZWN0ZWQoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2NzLCB0YXJnZXRfdWxvbmcgbmV3X2VpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQsIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgaW50IG5ld19zdGFjaywgaTsKKyAgICB1aW50MzJfdCBlMSwgZTIsIGNwbCwgZHBsLCBycGwsIHNlbGVjdG9yLCBvZmZzZXQsIHBhcmFtX2NvdW50OworICAgIHVpbnQzMl90IHNzID0gMCwgc3NfZTEgPSAwLCBzc19lMiA9IDAsIHNwLCB0eXBlLCBzc19kcGwsIHNwX21hc2s7CisgICAgdWludDMyX3QgdmFsLCBsaW1pdCwgb2xkX3NwX21hc2s7CisgICAgdGFyZ2V0X3Vsb25nIHNzcCwgb2xkX3NzcCwgbmV4dF9laXA7CisKKyAgICBuZXh0X2VpcCA9IGVudi0+ZWlwICsgbmV4dF9laXBfYWRkZW5kOworICAgIExPR19QQ0FMTCgibGNhbGwgJTA0eDolMDh4IHM9JWRcbiIsIG5ld19jcywgKHVpbnQzMl90KW5ld19laXAsIHNoaWZ0KTsKKyAgICBMT0dfUENBTExfU1RBVEUoZW52KTsKKyAgICBpZiAoKG5ld19jcyAmIDB4ZmZmYykgPT0gMCkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmZTEsICZlMiwgbmV3X2NzKSAhPSAwKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIExPR19QQ0FMTCgiZGVzYz0lMDh4OiUwOHhcbiIsIGUxLCBlMik7CisgICAgaWYgKGUyICYgREVTQ19TX01BU0spIHsKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX0NTX01BU0spKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICBpZiAoZTIgJiBERVNDX0NfTUFTSykgeworICAgICAgICAgICAgLyogY29uZm9ybWluZyBjb2RlIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIGlmIChkcGwgPiBjcGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBub24gY29uZm9ybWluZyBjb2RlIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIHJwbCA9IG5ld19jcyAmIDM7CisgICAgICAgICAgICBpZiAocnBsID4gY3BsKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICAgICAgaWYgKGRwbCAhPSBjcGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBuZXdfY3MgJiAweGZmZmMpOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAvKiBYWFg6IGNoZWNrIDE2LzMyIGJpdCBjYXNlcyBpbiBsb25nIG1vZGUgKi8KKyAgICAgICAgaWYgKHNoaWZ0ID09IDIpIHsKKyAgICAgICAgICAgIHRhcmdldF91bG9uZyByc3A7CisgICAgICAgICAgICAvKiA2NCBiaXQgY2FzZSAqLworICAgICAgICAgICAgcnNwID0gRVNQOworICAgICAgICAgICAgUFVTSFEocnNwLCBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICAgICAgUFVTSFEocnNwLCBuZXh0X2VpcCk7CisgICAgICAgICAgICAvKiBmcm9tIHRoaXMgcG9pbnQsIG5vdCByZXN0YXJ0YWJsZSAqLworICAgICAgICAgICAgRVNQID0gcnNwOworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIChuZXdfY3MgJiAweGZmZmMpIHwgY3BsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2VnX2Jhc2UoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19saW1pdChlMSwgZTIpLCBlMik7CisgICAgICAgICAgICBFSVAgPSBuZXdfZWlwOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBzcCA9IEVTUDsKKyAgICAgICAgICAgIHNwX21hc2sgPSBnZXRfc3BfbWFzayhlbnYtPnNlZ3NbUl9TU10uZmxhZ3MpOworICAgICAgICAgICAgc3NwID0gZW52LT5zZWdzW1JfU1NdLmJhc2U7CisgICAgICAgICAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgICAgICAgICBQVVNITChzc3AsIHNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIFBVU0hMKHNzcCwgc3AsIHNwX21hc2ssIG5leHRfZWlwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUFVTSFcoc3NwLCBzcCwgc3BfbWFzaywgZW52LT5zZWdzW1JfQ1NdLnNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICBQVVNIVyhzc3AsIHNwLCBzcF9tYXNrLCBuZXh0X2VpcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpbWl0ID0gZ2V0X3NlZ19saW1pdChlMSwgZTIpOworICAgICAgICAgICAgaWYgKG5ld19laXAgPiBsaW1pdCkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIC8qIGZyb20gdGhpcyBwb2ludCwgbm90IHJlc3RhcnRhYmxlICovCisgICAgICAgICAgICBTRVRfRVNQKHNwLCBzcF9tYXNrKTsKKyAgICAgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0NTLCAobmV3X2NzICYgMHhmZmZjKSB8IGNwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksIGxpbWl0LCBlMik7CisgICAgICAgICAgICBFSVAgPSBuZXdfZWlwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogY2hlY2sgZ2F0ZSB0eXBlICovCisgICAgICAgIHR5cGUgPSAoZTIgPj4gREVTQ19UWVBFX1NISUZUKSAmIDB4MWY7CisgICAgICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICBycGwgPSBuZXdfY3MgJiAzOworICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIDE6IC8qIGF2YWlsYWJsZSAyODYgVFNTICovCisgICAgICAgIGNhc2UgOTogLyogYXZhaWxhYmxlIDM4NiBUU1MgKi8KKyAgICAgICAgY2FzZSA1OiAvKiB0YXNrIGdhdGUgKi8KKyAgICAgICAgICAgIGlmIChkcGwgPCBjcGwgfHwgZHBsIDwgcnBsKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICAgICAgc3dpdGNoX3RzcyhlbnYsIG5ld19jcywgZTEsIGUyLCBTV0lUQ0hfVFNTX0NBTEwsIG5leHRfZWlwKTsKKyAgICAgICAgICAgIENDX09QID0gQ0NfT1BfRUZMQUdTOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIDQ6IC8qIDI4NiBjYWxsIGdhdGUgKi8KKyAgICAgICAgY2FzZSAxMjogLyogMzg2IGNhbGwgZ2F0ZSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNoaWZ0ID0gdHlwZSA+PiAzOworCisgICAgICAgIGlmIChkcGwgPCBjcGwgfHwgZHBsIDwgcnBsKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgICAgIC8qIGNoZWNrIHZhbGlkIGJpdCAqLworICAgICAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEJfTk9TRUcsICBuZXdfY3MgJiAweGZmZmMpOworICAgICAgICBzZWxlY3RvciA9IGUxID4+IDE2OworICAgICAgICBvZmZzZXQgPSAoZTIgJiAweGZmZmYwMDAwKSB8IChlMSAmIDB4MDAwMGZmZmYpOworICAgICAgICBwYXJhbV9jb3VudCA9IGUyICYgMHgxZjsKKyAgICAgICAgaWYgKChzZWxlY3RvciAmIDB4ZmZmYykgPT0gMCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCAwKTsKKworICAgICAgICBpZiAobG9hZF9zZWdtZW50KGVudiwgJmUxLCAmZTIsIHNlbGVjdG9yKSAhPSAwKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1NfTUFTSykgfHwgIShlMiAmIChERVNDX0NTX01BU0spKSkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisgICAgICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICBpZiAoZHBsID4gY3BsKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIHNlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1BfTUFTSykpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBzZWxlY3RvciAmIDB4ZmZmYyk7CisKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX0NfTUFTSykgJiYgZHBsIDwgY3BsKSB7CisgICAgICAgICAgICAvKiB0byBpbm5lciBwcml2aWxlZ2UgKi8KKyAgICAgICAgICAgIGdldF9zc19lc3BfZnJvbV90c3MoZW52LCAmc3MsICZzcCwgZHBsKTsKKyAgICAgICAgICAgIExPR19QQ0FMTCgibmV3IHNzOmVzcD0lMDR4OiUwOHggcGFyYW1fY291bnQ9JWQgRVNQPSIgVEFSR0VUX0ZNVF9seCAiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3MsIHNwLCBwYXJhbV9jb3VudCwgRVNQKTsKKyAgICAgICAgICAgIGlmICgoc3MgJiAweGZmZmMpID09IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICgoc3MgJiAzKSAhPSBkcGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmc3NfZTEsICZzc19lMiwgc3MpICE9IDApCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIHNzX2RwbCA9IChzc19lMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICAgICAgaWYgKHNzX2RwbCAhPSBkcGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICghKHNzX2UyICYgREVTQ19TX01BU0spIHx8CisgICAgICAgICAgICAgICAgKHNzX2UyICYgREVTQ19DU19NQVNLKSB8fAorICAgICAgICAgICAgICAgICEoc3NfZTIgJiBERVNDX1dfTUFTSykpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQV9UU1MsIHNzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmICghKHNzX2UyICYgREVTQ19QX01BU0spKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCBzcyAmIDB4ZmZmYyk7CisKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgcHVzaF9zaXplID0gKChwYXJhbV9jb3VudCAqIDIpICsgOCkgPDwgc2hpZnQ7CisKKyAgICAgICAgICAgIG9sZF9zcF9tYXNrID0gZ2V0X3NwX21hc2soZW52LT5zZWdzW1JfU1NdLmZsYWdzKTsKKyAgICAgICAgICAgIG9sZF9zc3AgPSBlbnYtPnNlZ3NbUl9TU10uYmFzZTsKKworICAgICAgICAgICAgc3BfbWFzayA9IGdldF9zcF9tYXNrKHNzX2UyKTsKKyAgICAgICAgICAgIHNzcCA9IGdldF9zZWdfYmFzZShzc19lMSwgc3NfZTIpOworICAgICAgICAgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgICAgICAgICAgUFVTSEwoc3NwLCBzcCwgc3BfbWFzaywgZW52LT5zZWdzW1JfU1NdLnNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICBQVVNITChzc3AsIHNwLCBzcF9tYXNrLCBFU1ApOworICAgICAgICAgICAgICAgIGZvcihpID0gcGFyYW1fY291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSBjcHVfbGRsX2tlcm5lbChlbnYsIG9sZF9zc3AgKyAoKEVTUCArIGkgKiA0KSAmIG9sZF9zcF9tYXNrKSk7CisgICAgICAgICAgICAgICAgICAgIFBVU0hMKHNzcCwgc3AsIHNwX21hc2ssIHZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQVVNIVyhzc3AsIHNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9TU10uc2VsZWN0b3IpOworICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgc3AsIHNwX21hc2ssIEVTUCk7CisgICAgICAgICAgICAgICAgZm9yKGkgPSBwYXJhbV9jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIG9sZF9zc3AgKyAoKEVTUCArIGkgKiAyKSAmIG9sZF9zcF9tYXNrKSk7CisgICAgICAgICAgICAgICAgICAgIFBVU0hXKHNzcCwgc3AsIHNwX21hc2ssIHZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X3N0YWNrID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRvIHNhbWUgcHJpdmlsZWdlICovCisgICAgICAgICAgICBzcCA9IEVTUDsKKyAgICAgICAgICAgIHNwX21hc2sgPSBnZXRfc3BfbWFzayhlbnYtPnNlZ3NbUl9TU10uZmxhZ3MpOworICAgICAgICAgICAgc3NwID0gZW52LT5zZWdzW1JfU1NdLmJhc2U7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIHB1c2hfc2l6ZSA9ICg0IDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIG5ld19zdGFjayA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgICAgIFBVU0hMKHNzcCwgc3AsIHNwX21hc2ssIGVudi0+c2Vnc1tSX0NTXS5zZWxlY3Rvcik7CisgICAgICAgICAgICBQVVNITChzc3AsIHNwLCBzcF9tYXNrLCBuZXh0X2VpcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQVVNIVyhzc3AsIHNwLCBzcF9tYXNrLCBlbnYtPnNlZ3NbUl9DU10uc2VsZWN0b3IpOworICAgICAgICAgICAgUFVTSFcoc3NwLCBzcCwgc3BfbWFzaywgbmV4dF9laXApOworICAgICAgICB9CisKKyAgICAgICAgLyogZnJvbSB0aGlzIHBvaW50LCBub3QgcmVzdGFydGFibGUgKi8KKworICAgICAgICBpZiAobmV3X3N0YWNrKSB7CisgICAgICAgICAgICBzcyA9IChzcyAmIH4zKSB8IGRwbDsKKyAgICAgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX1NTLCBzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2VnX2xpbWl0KHNzX2UxLCBzc19lMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzX2UyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGVjdG9yID0gKHNlbGVjdG9yICYgfjMpIHwgZHBsOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfYmFzZShlMSwgZTIpLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2VnX2xpbWl0KGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgICAgIGUyKTsKKyAgICAgICAgY3B1X3g4Nl9zZXRfY3BsKGVudiwgZHBsKTsKKyAgICAgICAgU0VUX0VTUChzcCwgc3BfbWFzayk7CisgICAgICAgIEVJUCA9IG9mZnNldDsKKyAgICB9Cit9CisKKy8qIHJlYWwgYW5kIHZtODYgbW9kZSBpcmV0ICovCit2b2lkIGhlbHBlcl9pcmV0X3JlYWwoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHNoaWZ0KQoreworICAgIHVpbnQzMl90IHNwLCBuZXdfY3MsIG5ld19laXAsIG5ld19lZmxhZ3MsIHNwX21hc2s7CisgICAgdGFyZ2V0X3Vsb25nIHNzcDsKKyAgICBpbnQgZWZsYWdzX21hc2s7CisKKyAgICBzcF9tYXNrID0gMHhmZmZmOyAvKiBYWFhYOiB1c2UgU1Mgc2VnbWVudCBzaXplID8gKi8KKyAgICBzcCA9IEVTUDsKKyAgICBzc3AgPSBlbnYtPnNlZ3NbUl9TU10uYmFzZTsKKyAgICBpZiAoc2hpZnQgPT0gMSkgeworICAgICAgICAvKiAzMiBiaXRzICovCisgICAgICAgIFBPUEwoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2VpcCk7CisgICAgICAgIFBPUEwoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2NzKTsKKyAgICAgICAgbmV3X2NzICY9IDB4ZmZmZjsKKyAgICAgICAgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZWZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiAxNiBiaXRzICovCisgICAgICAgIFBPUFcoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2VpcCk7CisgICAgICAgIFBPUFcoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2NzKTsKKyAgICAgICAgUE9QVyhzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZWZsYWdzKTsKKyAgICB9CisgICAgRVNQID0gKEVTUCAmIH5zcF9tYXNrKSB8IChzcCAmIHNwX21hc2spOworICAgIGVudi0+c2Vnc1tSX0NTXS5zZWxlY3RvciA9IG5ld19jczsKKyAgICBlbnYtPnNlZ3NbUl9DU10uYmFzZSA9IChuZXdfY3MgPDwgNCk7CisgICAgZW52LT5laXAgPSBuZXdfZWlwOworICAgIGlmIChlbnYtPmVmbGFncyAmIFZNX01BU0spCisgICAgICAgIGVmbGFnc19tYXNrID0gVEZfTUFTSyB8IEFDX01BU0sgfCBJRF9NQVNLIHwgSUZfTUFTSyB8IFJGX01BU0sgfCBOVF9NQVNLOworICAgIGVsc2UKKyAgICAgICAgZWZsYWdzX21hc2sgPSBURl9NQVNLIHwgQUNfTUFTSyB8IElEX01BU0sgfCBJRl9NQVNLIHwgSU9QTF9NQVNLIHwgUkZfTUFTSyB8IE5UX01BU0s7CisgICAgaWYgKHNoaWZ0ID09IDApCisgICAgICAgIGVmbGFnc19tYXNrICY9IDB4ZmZmZjsKKyAgICBjcHVfbG9hZF9lZmxhZ3MoZW52LCBuZXdfZWZsYWdzLCBlZmxhZ3NfbWFzayk7CisgICAgZW52LT5oZmxhZ3MyICY9IH5IRjJfTk1JX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2YWxpZGF0ZV9zZWcoQ1BVWDg2U3RhdGUgKmVudiwgaW50IHNlZ19yZWcsIGludCBjcGwpCit7CisgICAgaW50IGRwbDsKKyAgICB1aW50MzJfdCBlMjsKKworICAgIC8qIFhYWDogb24geDg2XzY0LCB3ZSBkbyBub3Qgd2FudCB0byBudWxsaWZ5IEZTIGFuZCBHUyBiZWNhdXNlCisgICAgICAgdGhleSBtYXkgc3RpbGwgY29udGFpbiBhIHZhbGlkIGJhc2UuIEkgd291bGQgYmUgaW50ZXJlc3RlZCB0bworICAgICAgIGtub3cgaG93IGEgcmVhbCB4ODZfNjQgQ1BVIGJlaGF2ZXMgKi8KKyAgICBpZiAoKHNlZ19yZWcgPT0gUl9GUyB8fCBzZWdfcmVnID09IFJfR1MpICYmCisgICAgICAgIChlbnYtPnNlZ3Nbc2VnX3JlZ10uc2VsZWN0b3IgJiAweGZmZmMpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIGUyID0gZW52LT5zZWdzW3NlZ19yZWddLmZsYWdzOworICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgIGlmICghKGUyICYgREVTQ19DU19NQVNLKSB8fCAhKGUyICYgREVTQ19DX01BU0spKSB7CisgICAgICAgIC8qIGRhdGEgb3Igbm9uIGNvbmZvcm1pbmcgY29kZSBzZWdtZW50ICovCisgICAgICAgIGlmIChkcGwgPCBjcGwpIHsKKyAgICAgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBzZWdfcmVnLCAwLCAwLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogcHJvdGVjdGVkIG1vZGUgaXJldCAqLworc3RhdGljIGlubGluZSB2b2lkIGhlbHBlcl9yZXRfcHJvdGVjdGVkKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LCBpbnQgaXNfaXJldCwgaW50IGFkZGVuZCkKK3sKKyAgICB1aW50MzJfdCBuZXdfY3MsIG5ld19lZmxhZ3MsIG5ld19zczsKKyAgICB1aW50MzJfdCBuZXdfZXMsIG5ld19kcywgbmV3X2ZzLCBuZXdfZ3M7CisgICAgdWludDMyX3QgZTEsIGUyLCBzc19lMSwgc3NfZTI7CisgICAgaW50IGNwbCwgZHBsLCBycGwsIGVmbGFnc19tYXNrLCBpb3BsOworICAgIHRhcmdldF91bG9uZyBzc3AsIHNwLCBuZXdfZWlwLCBuZXdfZXNwLCBzcF9tYXNrOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChzaGlmdCA9PSAyKQorICAgICAgICBzcF9tYXNrID0gLTE7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIHNwX21hc2sgPSBnZXRfc3BfbWFzayhlbnYtPnNlZ3NbUl9TU10uZmxhZ3MpOworICAgIHNwID0gRVNQOworICAgIHNzcCA9IGVudi0+c2Vnc1tSX1NTXS5iYXNlOworICAgIG5ld19lZmxhZ3MgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChzaGlmdCA9PSAyKSB7CisgICAgICAgIFBPUFEoc3AsIG5ld19laXApOworICAgICAgICBQT1BRKHNwLCBuZXdfY3MpOworICAgICAgICBuZXdfY3MgJj0gMHhmZmZmOworICAgICAgICBpZiAoaXNfaXJldCkgeworICAgICAgICAgICAgUE9QUShzcCwgbmV3X2VmbGFncyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIGlmIChzaGlmdCA9PSAxKSB7CisgICAgICAgIC8qIDMyIGJpdHMgKi8KKyAgICAgICAgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZWlwKTsKKyAgICAgICAgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCBuZXdfY3MpOworICAgICAgICBuZXdfY3MgJj0gMHhmZmZmOworICAgICAgICBpZiAoaXNfaXJldCkgeworICAgICAgICAgICAgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZWZsYWdzKTsKKyAgICAgICAgICAgIGlmIChuZXdfZWZsYWdzICYgVk1fTUFTSykKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl90b192bTg2OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMTYgYml0cyAqLworICAgICAgICBQT1BXKHNzcCwgc3AsIHNwX21hc2ssIG5ld19laXApOworICAgICAgICBQT1BXKHNzcCwgc3AsIHNwX21hc2ssIG5ld19jcyk7CisgICAgICAgIGlmIChpc19pcmV0KQorICAgICAgICAgICAgUE9QVyhzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZWZsYWdzKTsKKyAgICB9CisgICAgTE9HX1BDQUxMKCJscmV0IG5ldyAlMDR4OiIgVEFSR0VUX0ZNVF9seCAiIHM9JWQgYWRkZW5kPTB4JXhcbiIsCisgICAgICAgICAgICAgIG5ld19jcywgbmV3X2VpcCwgc2hpZnQsIGFkZGVuZCk7CisgICAgTE9HX1BDQUxMX1NUQVRFKGVudik7CisgICAgaWYgKChuZXdfY3MgJiAweGZmZmMpID09IDApCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmZTEsICZlMiwgbmV3X2NzKSAhPSAwKQorICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICBpZiAoIShlMiAmIERFU0NfU19NQVNLKSB8fAorICAgICAgICAhKGUyICYgREVTQ19DU19NQVNLKSkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19jcyAmIDB4ZmZmYyk7CisgICAgY3BsID0gZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSzsKKyAgICBycGwgPSBuZXdfY3MgJiAzOworICAgIGlmIChycGwgPCBjcGwpCisgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgIGlmIChlMiAmIERFU0NfQ19NQVNLKSB7CisgICAgICAgIGlmIChkcGwgPiBycGwpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X2NzICYgMHhmZmZjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZHBsICE9IHJwbCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfY3MgJiAweGZmZmMpOworICAgIH0KKyAgICBpZiAoIShlMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwQl9OT1NFRywgbmV3X2NzICYgMHhmZmZjKTsKKworICAgIHNwICs9IGFkZGVuZDsKKyAgICBpZiAocnBsID09IGNwbCAmJiAoIShlbnYtPmhmbGFncyAmIEhGX0NTNjRfTUFTSykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKChlbnYtPmhmbGFncyAmIEhGX0NTNjRfTUFTSykgJiYgIWlzX2lyZXQpKSkgeworICAgICAgICAvKiByZXR1cm4gdG8gc2FtZSBwcml2aWxlZ2UgbGV2ZWwgKi8KKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIG5ld19jcywKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHJldHVybiB0byBkaWZmZXJlbnQgcHJpdmlsZWdlIGxldmVsICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoc2hpZnQgPT0gMikgeworICAgICAgICAgICAgUE9QUShzcCwgbmV3X2VzcCk7CisgICAgICAgICAgICBQT1BRKHNwLCBuZXdfc3MpOworICAgICAgICAgICAgbmV3X3NzICY9IDB4ZmZmZjsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKHNoaWZ0ID09IDEpIHsKKyAgICAgICAgICAgIC8qIDMyIGJpdHMgKi8KKyAgICAgICAgICAgIFBPUEwoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2VzcCk7CisgICAgICAgICAgICBQT1BMKHNzcCwgc3AsIHNwX21hc2ssIG5ld19zcyk7CisgICAgICAgICAgICBuZXdfc3MgJj0gMHhmZmZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogMTYgYml0cyAqLworICAgICAgICAgICAgUE9QVyhzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZXNwKTsKKyAgICAgICAgICAgIFBPUFcoc3NwLCBzcCwgc3BfbWFzaywgbmV3X3NzKTsKKyAgICAgICAgfQorICAgICAgICBMT0dfUENBTEwoIm5ldyBzczplc3A9JTA0eDoiIFRBUkdFVF9GTVRfbHggIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3X3NzLCBuZXdfZXNwKTsKKyAgICAgICAgaWYgKChuZXdfc3MgJiAweGZmZmMpID09IDApIHsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICAvKiBOVUxMIHNzIGlzIGFsbG93ZWQgaW4gbG9uZyBtb2RlIGlmIGNwbCAhPSAzKi8KKyAgICAgICAgICAgIC8qIFhYWDogdGVzdCBDUzY0ID8gKi8KKyAgICAgICAgICAgIGlmICgoZW52LT5oZmxhZ3MgJiBIRl9MTUFfTUFTSykgJiYgcnBsICE9IDMpIHsKKyAgICAgICAgICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgbmV3X3NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19CX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NfTUFTSyB8IChycGwgPDwgREVTQ19EUExfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfV19NQVNLIHwgREVTQ19BX01BU0spOworICAgICAgICAgICAgICAgIHNzX2UyID0gREVTQ19CX01BU0s7IC8qIFhYWDogc2hvdWxkIG5vdCBiZSBuZWVkZWQgPyAqLworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKG5ld19zcyAmIDMpICE9IHJwbCkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X3NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGlmIChsb2FkX3NlZ21lbnQoZW52LCAmc3NfZTEsICZzc19lMiwgbmV3X3NzKSAhPSAwKQorICAgICAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMERfR1BGLCBuZXdfc3MgJiAweGZmZmMpOworICAgICAgICAgICAgaWYgKCEoc3NfZTIgJiBERVNDX1NfTUFTSykgfHwKKyAgICAgICAgICAgICAgICAoc3NfZTIgJiBERVNDX0NTX01BU0spIHx8CisgICAgICAgICAgICAgICAgIShzc19lMiAmIERFU0NfV19NQVNLKSkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBEX0dQRiwgbmV3X3NzICYgMHhmZmZjKTsKKyAgICAgICAgICAgIGRwbCA9IChzc19lMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgICAgICAgICAgaWYgKGRwbCAhPSBycGwpCisgICAgICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIG5ld19zcyAmIDB4ZmZmYyk7CisgICAgICAgICAgICBpZiAoIShzc19lMiAmIERFU0NfUF9NQVNLKSkKKyAgICAgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBCX05PU0VHLCBuZXdfc3MgJiAweGZmZmMpOworICAgICAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfU1MsIG5ld19zcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKHNzX2UxLCBzc19lMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoc3NfZTEsIHNzX2UyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NfZTIpOworICAgICAgICB9CisKKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIG5ld19jcywKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3NlZ19iYXNlKGUxLCBlMiksCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWdfbGltaXQoZTEsIGUyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZTIpOworICAgICAgICBjcHVfeDg2X3NldF9jcGwoZW52LCBycGwpOworICAgICAgICBzcCA9IG5ld19lc3A7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBIRl9DUzY0X01BU0spCisgICAgICAgICAgICBzcF9tYXNrID0gLTE7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgc3BfbWFzayA9IGdldF9zcF9tYXNrKHNzX2UyKTsKKworICAgICAgICAvKiB2YWxpZGF0ZSBkYXRhIHNlZ21lbnRzICovCisgICAgICAgIHZhbGlkYXRlX3NlZyhlbnYsIFJfRVMsIHJwbCk7CisgICAgICAgIHZhbGlkYXRlX3NlZyhlbnYsIFJfRFMsIHJwbCk7CisgICAgICAgIHZhbGlkYXRlX3NlZyhlbnYsIFJfRlMsIHJwbCk7CisgICAgICAgIHZhbGlkYXRlX3NlZyhlbnYsIFJfR1MsIHJwbCk7CisKKyAgICAgICAgc3AgKz0gYWRkZW5kOworICAgIH0KKyAgICBTRVRfRVNQKHNwLCBzcF9tYXNrKTsKKyAgICBlbnYtPmVpcCA9IG5ld19laXA7CisgICAgaWYgKGlzX2lyZXQpIHsKKyAgICAgICAgLyogTk9URTogJ2NwbCcgaXMgdGhlIF9vbGRfIENQTCAqLworICAgICAgICBlZmxhZ3NfbWFzayA9IFRGX01BU0sgfCBBQ19NQVNLIHwgSURfTUFTSyB8IFJGX01BU0sgfCBOVF9NQVNLOworICAgICAgICBpZiAoY3BsID09IDApCisgICAgICAgICAgICBlZmxhZ3NfbWFzayB8PSBJT1BMX01BU0s7CisgICAgICAgIGlvcGwgPSAoZW52LT5lZmxhZ3MgPj4gSU9QTF9TSElGVCkgJiAzOworICAgICAgICBpZiAoY3BsIDw9IGlvcGwpCisgICAgICAgICAgICBlZmxhZ3NfbWFzayB8PSBJRl9NQVNLOworICAgICAgICBpZiAoc2hpZnQgPT0gMCkKKyAgICAgICAgICAgIGVmbGFnc19tYXNrICY9IDB4ZmZmZjsKKyAgICAgICAgY3B1X2xvYWRfZWZsYWdzKGVudiwgbmV3X2VmbGFncywgZWZsYWdzX21hc2spOworICAgIH0KKyAgICByZXR1cm47CisKKyByZXR1cm5fdG9fdm04NjoKKyAgICBQT1BMKHNzcCwgc3AsIHNwX21hc2ssIG5ld19lc3ApOworICAgIFBPUEwoc3NwLCBzcCwgc3BfbWFzaywgbmV3X3NzKTsKKyAgICBQT1BMKHNzcCwgc3AsIHNwX21hc2ssIG5ld19lcyk7CisgICAgUE9QTChzc3AsIHNwLCBzcF9tYXNrLCBuZXdfZHMpOworICAgIFBPUEwoc3NwLCBzcCwgc3BfbWFzaywgbmV3X2ZzKTsKKyAgICBQT1BMKHNzcCwgc3AsIHNwX21hc2ssIG5ld19ncyk7CisKKyAgICAvKiBtb2RpZnkgcHJvY2Vzc29yIHN0YXRlICovCisgICAgY3B1X2xvYWRfZWZsYWdzKGVudiwgbmV3X2VmbGFncywgVEZfTUFTSyB8IEFDX01BU0sgfCBJRF9NQVNLIHwKKyAgICAgICAgICAgICAgICBJRl9NQVNLIHwgSU9QTF9NQVNLIHwgVk1fTUFTSyB8IE5UX01BU0sgfCBWSUZfTUFTSyB8IFZJUF9NQVNLKTsKKyAgICBsb2FkX3NlZ192bShlbnYsIFJfQ1MsIG5ld19jcyAmIDB4ZmZmZik7CisgICAgY3B1X3g4Nl9zZXRfY3BsKGVudiwgMyk7CisgICAgbG9hZF9zZWdfdm0oZW52LCBSX1NTLCBuZXdfc3MgJiAweGZmZmYpOworICAgIGxvYWRfc2VnX3ZtKGVudiwgUl9FUywgbmV3X2VzICYgMHhmZmZmKTsKKyAgICBsb2FkX3NlZ192bShlbnYsIFJfRFMsIG5ld19kcyAmIDB4ZmZmZik7CisgICAgbG9hZF9zZWdfdm0oZW52LCBSX0ZTLCBuZXdfZnMgJiAweGZmZmYpOworICAgIGxvYWRfc2VnX3ZtKGVudiwgUl9HUywgbmV3X2dzICYgMHhmZmZmKTsKKworICAgIGVudi0+ZWlwID0gbmV3X2VpcCAmIDB4ZmZmZjsKKyAgICBFU1AgPSBuZXdfZXNwOworfQorCit2b2lkIGhlbHBlcl9pcmV0X3Byb3RlY3RlZChDUFVYODZTdGF0ZSAqZW52LCBpbnQgc2hpZnQsIGludCBuZXh0X2VpcCkKK3sKKyAgICBpbnQgdHNzX3NlbGVjdG9yLCB0eXBlOworICAgIHVpbnQzMl90IGUxLCBlMjsKKworICAgIC8qIHNwZWNpZmljIGNhc2UgZm9yIFRTUyAqLworICAgIGlmIChlbnYtPmVmbGFncyAmIE5UX01BU0spIHsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIEhGX0xNQV9NQVNLKQorICAgICAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworI2VuZGlmCisgICAgICAgIHRzc19zZWxlY3RvciA9IGNwdV9sZHV3X2tlcm5lbChlbnYsIGVudi0+dHIuYmFzZSArIDApOworICAgICAgICBpZiAodHNzX3NlbGVjdG9yICYgNCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCB0c3Nfc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICBpZiAobG9hZF9zZWdtZW50KGVudiwgJmUxLCAmZTIsIHRzc19zZWxlY3RvcikgIT0gMCkKKyAgICAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBFWENQMEFfVFNTLCB0c3Nfc2VsZWN0b3IgJiAweGZmZmMpOworICAgICAgICB0eXBlID0gKGUyID4+IERFU0NfVFlQRV9TSElGVCkgJiAweDE3OworICAgICAgICAvKiBOT1RFOiB3ZSBjaGVjayBib3RoIHNlZ21lbnQgYW5kIGJ1c3kgVFNTICovCisgICAgICAgIGlmICh0eXBlICE9IDMpCisgICAgICAgICAgICByYWlzZV9leGNlcHRpb25fZXJyKGVudiwgRVhDUDBBX1RTUywgdHNzX3NlbGVjdG9yICYgMHhmZmZjKTsKKyAgICAgICAgc3dpdGNoX3RzcyhlbnYsIHRzc19zZWxlY3RvciwgZTEsIGUyLCBTV0lUQ0hfVFNTX0lSRVQsIG5leHRfZWlwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZWxwZXJfcmV0X3Byb3RlY3RlZChlbnYsIHNoaWZ0LCAxLCAwKTsKKyAgICB9CisgICAgZW52LT5oZmxhZ3MyICY9IH5IRjJfTk1JX01BU0s7Cit9CisKK3ZvaWQgaGVscGVyX2xyZXRfcHJvdGVjdGVkKENQVVg4NlN0YXRlICplbnYsIGludCBzaGlmdCwgaW50IGFkZGVuZCkKK3sKKyAgICBoZWxwZXJfcmV0X3Byb3RlY3RlZChlbnYsIHNoaWZ0LCAwLCBhZGRlbmQpOworfQorCit2b2lkIGhlbHBlcl9zeXNlbnRlcihDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGlmIChlbnYtPnN5c2VudGVyX2NzID09IDApIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIH0KKyAgICBlbnYtPmVmbGFncyAmPSB+KFZNX01BU0sgfCBJRl9NQVNLIHwgUkZfTUFTSyk7CisgICAgY3B1X3g4Nl9zZXRfY3BsKGVudiwgMCk7CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKGVudi0+aGZsYWdzICYgSEZfTE1BX01BU0spIHsKKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsIGVudi0+c3lzZW50ZXJfY3MgJiAweGZmZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0dfTUFTSyB8IERFU0NfQl9NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0NTX01BU0sgfCBERVNDX1JfTUFTSyB8IERFU0NfQV9NQVNLIHwgREVTQ19MX01BU0spOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgZW52LT5zeXNlbnRlcl9jcyAmIDB4ZmZmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19CX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfQ1NfTUFTSyB8IERFU0NfUl9NQVNLIHwgREVTQ19BX01BU0spOworICAgIH0KKyAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgKGVudi0+c3lzZW50ZXJfY3MgKyA4KSAmIDB4ZmZmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0dfTUFTSyB8IERFU0NfQl9NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19XX01BU0sgfCBERVNDX0FfTUFTSyk7CisgICAgRVNQID0gZW52LT5zeXNlbnRlcl9lc3A7CisgICAgRUlQID0gZW52LT5zeXNlbnRlcl9laXA7Cit9CisKK3ZvaWQgaGVscGVyX3N5c2V4aXQoQ1BVWDg2U3RhdGUgKmVudiwgaW50IGRmbGFnKQoreworICAgIGludCBjcGw7CisKKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIGlmIChlbnYtPnN5c2VudGVyX2NzID09IDAgfHwgY3BsICE9IDApIHsKKyAgICAgICAgcmFpc2VfZXhjZXB0aW9uX2VycihlbnYsIEVYQ1AwRF9HUEYsIDApOworICAgIH0KKyAgICBjcHVfeDg2X3NldF9jcGwoZW52LCAzKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKGRmbGFnID09IDIpIHsKKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfQ1MsICgoZW52LT5zeXNlbnRlcl9jcyArIDMyKSAmIDB4ZmZmYykgfCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX0JfTUFTSyB8IERFU0NfUF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NfTUFTSyB8ICgzIDw8IERFU0NfRFBMX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19DU19NQVNLIHwgREVTQ19SX01BU0sgfCBERVNDX0FfTUFTSyB8IERFU0NfTF9NQVNLKTsKKyAgICAgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfU1MsICgoZW52LT5zeXNlbnRlcl9jcyArIDQwKSAmIDB4ZmZmYykgfCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19HX01BU0sgfCBERVNDX0JfTUFTSyB8IERFU0NfUF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NfTUFTSyB8ICgzIDw8IERFU0NfRFBMX1NISUZUKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19XX01BU0sgfCBERVNDX0FfTUFTSyk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0NTLCAoKGVudi0+c3lzZW50ZXJfY3MgKyAxNikgJiAweGZmZmMpIHwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAweGZmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfR19NQVNLIHwgREVTQ19CX01BU0sgfCBERVNDX1BfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TX01BU0sgfCAoMyA8PCBERVNDX0RQTF9TSElGVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfQ1NfTUFTSyB8IERFU0NfUl9NQVNLIHwgREVTQ19BX01BU0spOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9TUywgKChlbnYtPnN5c2VudGVyX2NzICsgMjQpICYgMHhmZmZjKSB8IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMHhmZmZmZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX0dfTUFTSyB8IERFU0NfQl9NQVNLIHwgREVTQ19QX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU19NQVNLIHwgKDMgPDwgREVTQ19EUExfU0hJRlQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1dfTUFTSyB8IERFU0NfQV9NQVNLKTsKKyAgICB9CisgICAgRVNQID0gRUNYOworICAgIEVJUCA9IEVEWDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9sc2woQ1BVWDg2U3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHNlbGVjdG9yMSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbGltaXQ7CisgICAgdWludDMyX3QgZTEsIGUyLCBlZmxhZ3MsIHNlbGVjdG9yOworICAgIGludCBycGwsIGRwbCwgY3BsLCB0eXBlOworCisgICAgc2VsZWN0b3IgPSBzZWxlY3RvcjEgJiAweGZmZmY7CisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGlmICgoc2VsZWN0b3IgJiAweGZmZmMpID09IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAobG9hZF9zZWdtZW50KGVudiwgJmUxLCAmZTIsIHNlbGVjdG9yKSAhPSAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcnBsID0gc2VsZWN0b3IgJiAzOworICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgIGNwbCA9IGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0s7CisgICAgaWYgKGUyICYgREVTQ19TX01BU0spIHsKKyAgICAgICAgaWYgKChlMiAmIERFU0NfQ1NfTUFTSykgJiYgKGUyICYgREVTQ19DX01BU0spKSB7CisgICAgICAgICAgICAvKiBjb25mb3JtaW5nICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZHBsIDwgY3BsIHx8IGRwbCA8IHJwbCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKGUyID4+IERFU0NfVFlQRV9TSElGVCkgJiAweGY7CisgICAgICAgIHN3aXRjaCh0eXBlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChkcGwgPCBjcGwgfHwgZHBsIDwgcnBsKSB7CisgICAgICAgIGZhaWw6CisgICAgICAgICAgICBDQ19TUkMgPSBlZmxhZ3MgJiB+Q0NfWjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGxpbWl0ID0gZ2V0X3NlZ19saW1pdChlMSwgZTIpOworICAgIENDX1NSQyA9IGVmbGFncyB8IENDX1o7CisgICAgcmV0dXJuIGxpbWl0OworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2xhcihDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgc2VsZWN0b3IxKQoreworICAgIHVpbnQzMl90IGUxLCBlMiwgZWZsYWdzLCBzZWxlY3RvcjsKKyAgICBpbnQgcnBsLCBkcGwsIGNwbCwgdHlwZTsKKworICAgIHNlbGVjdG9yID0gc2VsZWN0b3IxICYgMHhmZmZmOworICAgIGVmbGFncyA9IGhlbHBlcl9jY19jb21wdXRlX2FsbChlbnYsIENDX09QKTsKKyAgICBpZiAoKHNlbGVjdG9yICYgMHhmZmZjKSA9PSAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGxvYWRfc2VnbWVudChlbnYsICZlMSwgJmUyLCBzZWxlY3RvcikgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJwbCA9IHNlbGVjdG9yICYgMzsKKyAgICBkcGwgPSAoZTIgPj4gREVTQ19EUExfU0hJRlQpICYgMzsKKyAgICBjcGwgPSBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLOworICAgIGlmIChlMiAmIERFU0NfU19NQVNLKSB7CisgICAgICAgIGlmICgoZTIgJiBERVNDX0NTX01BU0spICYmIChlMiAmIERFU0NfQ19NQVNLKSkgeworICAgICAgICAgICAgLyogY29uZm9ybWluZyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGRwbCA8IGNwbCB8fCBkcGwgPCBycGwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9IChlMiA+PiBERVNDX1RZUEVfU0hJRlQpICYgMHhmOworICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA5OgorICAgICAgICBjYXNlIDExOgorICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRwbCA8IGNwbCB8fCBkcGwgPCBycGwpIHsKKyAgICAgICAgZmFpbDoKKyAgICAgICAgICAgIENDX1NSQyA9IGVmbGFncyAmIH5DQ19aOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0NfU1JDID0gZWZsYWdzIHwgQ0NfWjsKKyAgICByZXR1cm4gZTIgJiAweDAwZjBmZjAwOworfQorCit2b2lkIGhlbHBlcl92ZXJyKENQVVg4NlN0YXRlICplbnYsIHRhcmdldF91bG9uZyBzZWxlY3RvcjEpCit7CisgICAgdWludDMyX3QgZTEsIGUyLCBlZmxhZ3MsIHNlbGVjdG9yOworICAgIGludCBycGwsIGRwbCwgY3BsOworCisgICAgc2VsZWN0b3IgPSBzZWxlY3RvcjEgJiAweGZmZmY7CisgICAgZWZsYWdzID0gaGVscGVyX2NjX2NvbXB1dGVfYWxsKGVudiwgQ0NfT1ApOworICAgIGlmICgoc2VsZWN0b3IgJiAweGZmZmMpID09IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAobG9hZF9zZWdtZW50KGVudiwgJmUxLCAmZTIsIHNlbGVjdG9yKSAhPSAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKCEoZTIgJiBERVNDX1NfTUFTSykpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBycGwgPSBzZWxlY3RvciAmIDM7CisgICAgZHBsID0gKGUyID4+IERFU0NfRFBMX1NISUZUKSAmIDM7CisgICAgY3BsID0gZW52LT5oZmxhZ3MgJiBIRl9DUExfTUFTSzsKKyAgICBpZiAoZTIgJiBERVNDX0NTX01BU0spIHsKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1JfTUFTSykpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmICghKGUyICYgREVTQ19DX01BU0spKSB7CisgICAgICAgICAgICBpZiAoZHBsIDwgY3BsIHx8IGRwbCA8IHJwbCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZHBsIDwgY3BsIHx8IGRwbCA8IHJwbCkgeworICAgICAgICBmYWlsOgorICAgICAgICAgICAgQ0NfU1JDID0gZWZsYWdzICYgfkNDX1o7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgQ0NfU1JDID0gZWZsYWdzIHwgQ0NfWjsKK30KKwordm9pZCBoZWxwZXJfdmVydyhDUFVYODZTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgc2VsZWN0b3IxKQoreworICAgIHVpbnQzMl90IGUxLCBlMiwgZWZsYWdzLCBzZWxlY3RvcjsKKyAgICBpbnQgcnBsLCBkcGwsIGNwbDsKKworICAgIHNlbGVjdG9yID0gc2VsZWN0b3IxICYgMHhmZmZmOworICAgIGVmbGFncyA9IGhlbHBlcl9jY19jb21wdXRlX2FsbChlbnYsIENDX09QKTsKKyAgICBpZiAoKHNlbGVjdG9yICYgMHhmZmZjKSA9PSAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGxvYWRfc2VnbWVudChlbnYsICZlMSwgJmUyLCBzZWxlY3RvcikgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmICghKGUyICYgREVTQ19TX01BU0spKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcnBsID0gc2VsZWN0b3IgJiAzOworICAgIGRwbCA9IChlMiA+PiBERVNDX0RQTF9TSElGVCkgJiAzOworICAgIGNwbCA9IGVudi0+aGZsYWdzICYgSEZfQ1BMX01BU0s7CisgICAgaWYgKGUyICYgREVTQ19DU19NQVNLKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZHBsIDwgY3BsIHx8IGRwbCA8IHJwbCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgaWYgKCEoZTIgJiBERVNDX1dfTUFTSykpIHsKKyAgICAgICAgZmFpbDoKKyAgICAgICAgICAgIENDX1NSQyA9IGVmbGFncyAmIH5DQ19aOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIENDX1NSQyA9IGVmbGFncyB8IENDX1o7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L3NoaWZ0X2hlbHBlcl90ZW1wbGF0ZS5oIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9zaGlmdF9oZWxwZXJfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDA2YWIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9zaGlmdF9oZWxwZXJfdGVtcGxhdGUuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqICBpMzg2IGhlbHBlcnMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiBNQSAgMDIxMTAtMTMwMSBVU0EKKyAqLworI2RlZmluZSBEQVRBX0JJVFMgKDEgPDwgKDMgKyBTSElGVCkpCisjZGVmaW5lIFNISUZUX01BU0sgKERBVEFfQklUUyAtIDEpCisjZGVmaW5lIFNJR05fTUFTSyAoKCh0YXJnZXRfdWxvbmcpMSkgPDwgKERBVEFfQklUUyAtIDEpKQorI2lmIERBVEFfQklUUyA8PSAzMgorI2RlZmluZSBTSElGVDFfTUFTSyAweDFmCisjZWxzZQorI2RlZmluZSBTSElGVDFfTUFTSyAweDNmCisjZW5kaWYKKworI2lmIERBVEFfQklUUyA9PSA4CisjZGVmaW5lIFNVRkZJWCBiCisjZGVmaW5lIERBVEFfVFlQRSB1aW50OF90CisjZGVmaW5lIERBVEFfU1RZUEUgaW50OF90CisjZGVmaW5lIERBVEFfTUFTSyAweGZmCisjZWxpZiBEQVRBX0JJVFMgPT0gMTYKKyNkZWZpbmUgU1VGRklYIHcKKyNkZWZpbmUgREFUQV9UWVBFIHVpbnQxNl90CisjZGVmaW5lIERBVEFfU1RZUEUgaW50MTZfdAorI2RlZmluZSBEQVRBX01BU0sgMHhmZmZmCisjZWxpZiBEQVRBX0JJVFMgPT0gMzIKKyNkZWZpbmUgU1VGRklYIGwKKyNkZWZpbmUgREFUQV9UWVBFIHVpbnQzMl90CisjZGVmaW5lIERBVEFfU1RZUEUgaW50MzJfdAorI2RlZmluZSBEQVRBX01BU0sgMHhmZmZmZmZmZgorI2VsaWYgREFUQV9CSVRTID09IDY0CisjZGVmaW5lIFNVRkZJWCBxCisjZGVmaW5lIERBVEFfVFlQRSB1aW50NjRfdAorI2RlZmluZSBEQVRBX1NUWVBFIGludDY0X3QKKyNkZWZpbmUgREFUQV9NQVNLIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorI2Vsc2UKKyNlcnJvciB1bmhhbmRsZWQgb3BlcmFuZCBzaXplCisjZW5kaWYKKworLyogc2hpZnRzICovCisKK3RhcmdldF91bG9uZyBnbHVlKGhlbHBlcl9yY2wsIFNVRkZJWCkoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHQwLCB0YXJnZXRfdWxvbmcgdDEpCit7CisgICAgaW50IGNvdW50LCBlZmxhZ3M7CisgICAgdGFyZ2V0X3Vsb25nIHNyYzsKKyAgICB0YXJnZXRfbG9uZyByZXM7CisKKyAgICBjb3VudCA9IHQxICYgU0hJRlQxX01BU0s7CisjaWYgREFUQV9CSVRTID09IDE2CisgICAgY291bnQgPSByY2x3X3RhYmxlW2NvdW50XTsKKyNlbGlmIERBVEFfQklUUyA9PSA4CisgICAgY291bnQgPSByY2xiX3RhYmxlW2NvdW50XTsKKyNlbmRpZgorICAgIGlmIChjb3VudCkgeworICAgICAgICBlZmxhZ3MgPSBlbnYtPmNjX3NyYzsKKyAgICAgICAgdDAgJj0gREFUQV9NQVNLOworICAgICAgICBzcmMgPSB0MDsKKyAgICAgICAgcmVzID0gKHQwIDw8IGNvdW50KSB8ICgodGFyZ2V0X3Vsb25nKShlZmxhZ3MgJiBDQ19DKSA8PCAoY291bnQgLSAxKSk7CisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgICAgICByZXMgfD0gdDAgPj4gKERBVEFfQklUUyArIDEgLSBjb3VudCk7CisgICAgICAgIHQwID0gcmVzOworICAgICAgICBlbnYtPmNjX3NyYyA9IChlZmxhZ3MgJiB+KENDX0MgfCBDQ19PKSkgfAorICAgICAgICAgICAgKGxzaGlmdChzcmMgXiB0MCwgMTEgLSAoREFUQV9CSVRTIC0gMSkpICYgQ0NfTykgfAorICAgICAgICAgICAgKChzcmMgPj4gKERBVEFfQklUUyAtIGNvdW50KSkgJiBDQ19DKTsKKyAgICB9CisgICAgcmV0dXJuIHQwOworfQorCit0YXJnZXRfdWxvbmcgZ2x1ZShoZWxwZXJfcmNyLCBTVUZGSVgpKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyB0MCwgdGFyZ2V0X3Vsb25nIHQxKQoreworICAgIGludCBjb3VudCwgZWZsYWdzOworICAgIHRhcmdldF91bG9uZyBzcmM7CisgICAgdGFyZ2V0X2xvbmcgcmVzOworCisgICAgY291bnQgPSB0MSAmIFNISUZUMV9NQVNLOworI2lmIERBVEFfQklUUyA9PSAxNgorICAgIGNvdW50ID0gcmNsd190YWJsZVtjb3VudF07CisjZWxpZiBEQVRBX0JJVFMgPT0gOAorICAgIGNvdW50ID0gcmNsYl90YWJsZVtjb3VudF07CisjZW5kaWYKKyAgICBpZiAoY291bnQpIHsKKyAgICAgICAgZWZsYWdzID0gZW52LT5jY19zcmM7CisgICAgICAgIHQwICY9IERBVEFfTUFTSzsKKyAgICAgICAgc3JjID0gdDA7CisgICAgICAgIHJlcyA9ICh0MCA+PiBjb3VudCkgfCAoKHRhcmdldF91bG9uZykoZWZsYWdzICYgQ0NfQykgPDwgKERBVEFfQklUUyAtIGNvdW50KSk7CisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgICAgICByZXMgfD0gdDAgPDwgKERBVEFfQklUUyArIDEgLSBjb3VudCk7CisgICAgICAgIHQwID0gcmVzOworICAgICAgICBlbnYtPmNjX3NyYyA9IChlZmxhZ3MgJiB+KENDX0MgfCBDQ19PKSkgfAorICAgICAgICAgICAgKGxzaGlmdChzcmMgXiB0MCwgMTEgLSAoREFUQV9CSVRTIC0gMSkpICYgQ0NfTykgfAorICAgICAgICAgICAgKChzcmMgPj4gKGNvdW50IC0gMSkpICYgQ0NfQyk7CisgICAgfQorICAgIHJldHVybiB0MDsKK30KKworI3VuZGVmIERBVEFfQklUUworI3VuZGVmIFNISUZUX01BU0sKKyN1bmRlZiBTSElGVDFfTUFTSworI3VuZGVmIFNJR05fTUFTSworI3VuZGVmIERBVEFfVFlQRQorI3VuZGVmIERBVEFfU1RZUEUKKyN1bmRlZiBEQVRBX01BU0sKKyN1bmRlZiBTVUZGSVgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc21tX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9zbW1faGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzMjI3NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc21tX2hlbHBlci5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogIHg4NiBTTU0gaGVscGVycworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworLyogU01NIHN1cHBvcnQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKwordm9pZCBkb19zbW1fZW50ZXIoQ1BVQXJjaFN0YXRlICplbnYxKQoreworfQorCit2b2lkIGhlbHBlcl9yc20oQ1BVWDg2U3RhdGUgKmVudikKK3sKK30KKworI2Vsc2UKKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyNkZWZpbmUgU01NX1JFVklTSU9OX0lEIDB4MDAwMjAwNjQKKyNlbHNlCisjZGVmaW5lIFNNTV9SRVZJU0lPTl9JRCAweDAwMDIwMDAwCisjZW5kaWYKKwordm9pZCBkb19zbW1fZW50ZXIoQ1BVQXJjaFN0YXRlICplbnYpCit7CisgICAgdGFyZ2V0X3Vsb25nIHNtX3N0YXRlOworICAgIFNlZ21lbnRDYWNoZSAqZHQ7CisgICAgaW50IGksIG9mZnNldDsKKworICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19JTlQsICJTTU06IGVudGVyXG4iKTsKKyAgICBsb2dfY3B1X3N0YXRlX21hc2soQ1BVX0xPR19JTlQsIEVOVl9HRVRfQ1BVKGVudiksIFg4Nl9EVU1QX0NDT1ApOworCisgICAgZW52LT5oZmxhZ3MgfD0gSEZfU01NX01BU0s7CisgICAgY3B1X3NtbV91cGRhdGUoZW52KTsKKworICAgIHNtX3N0YXRlID0gZW52LT5zbWJhc2UgKyAweDgwMDA7CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGR0ID0gJmVudi0+c2Vnc1tpXTsKKyAgICAgICAgb2Zmc2V0ID0gMHg3ZTAwICsgaSAqIDE2OworICAgICAgICBzdHdfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCwgZHQtPnNlbGVjdG9yKTsKKyAgICAgICAgc3R3X3BoeXMoc21fc3RhdGUgKyBvZmZzZXQgKyAyLCAoZHQtPmZsYWdzID4+IDgpICYgMHhmMGZmKTsKKyAgICAgICAgc3RsX3BoeXMoc21fc3RhdGUgKyBvZmZzZXQgKyA0LCBkdC0+bGltaXQpOworICAgICAgICBzdHFfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCArIDgsIGR0LT5iYXNlKTsKKyAgICB9CisKKyAgICBzdHFfcGh5cyhzbV9zdGF0ZSArIDB4N2U2OCwgZW52LT5nZHQuYmFzZSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdlNjQsIGVudi0+Z2R0LmxpbWl0KTsKKworICAgIHN0d19waHlzKHNtX3N0YXRlICsgMHg3ZTcwLCBlbnYtPmxkdC5zZWxlY3Rvcik7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdlNzgsIGVudi0+bGR0LmJhc2UpOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZTc0LCBlbnYtPmxkdC5saW1pdCk7CisgICAgc3R3X3BoeXMoc21fc3RhdGUgKyAweDdlNzIsIChlbnYtPmxkdC5mbGFncyA+PiA4KSAmIDB4ZjBmZik7CisKKyAgICBzdHFfcGh5cyhzbV9zdGF0ZSArIDB4N2U4OCwgZW52LT5pZHQuYmFzZSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdlODQsIGVudi0+aWR0LmxpbWl0KTsKKworICAgIHN0d19waHlzKHNtX3N0YXRlICsgMHg3ZTkwLCBlbnYtPnRyLnNlbGVjdG9yKTsKKyAgICBzdHFfcGh5cyhzbV9zdGF0ZSArIDB4N2U5OCwgZW52LT50ci5iYXNlKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2U5NCwgZW52LT50ci5saW1pdCk7CisgICAgc3R3X3BoeXMoc21fc3RhdGUgKyAweDdlOTIsIChlbnYtPnRyLmZsYWdzID4+IDgpICYgMHhmMGZmKTsKKworICAgIHN0cV9waHlzKHNtX3N0YXRlICsgMHg3ZWQwLCBlbnYtPmVmZXIpOworCisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZjgsIEVBWCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZjAsIEVDWCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZTgsIEVEWCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZTAsIEVCWCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZDgsIEVTUCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZDAsIEVCUCk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmYzgsIEVTSSk7CisgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmYzAsIEVESSk7CisgICAgZm9yKGkgPSA4OyBpIDwgMTY7IGkrKykKKyAgICAgICAgc3RxX3BoeXMoc21fc3RhdGUgKyAweDdmZjggLSBpICogOCwgZW52LT5yZWdzW2ldKTsKKyAgICBzdHFfcGh5cyhzbV9zdGF0ZSArIDB4N2Y3OCwgZW52LT5laXApOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZjcwLCBjcHVfY29tcHV0ZV9lZmxhZ3MoZW52KSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmNjgsIGVudi0+ZHJbNl0pOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZjYwLCBlbnYtPmRyWzddKTsKKworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZjQ4LCBlbnYtPmNyWzRdKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y1MCwgZW52LT5jclszXSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmNTgsIGVudi0+Y3JbMF0pOworCisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdlZmMsIFNNTV9SRVZJU0lPTl9JRCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmMDAsIGVudi0+c21iYXNlKTsKKyNlbHNlCisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZmMsIGVudi0+Y3JbMF0pOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmY4LCBlbnYtPmNyWzNdKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZmNCwgY3B1X2NvbXB1dGVfZWZsYWdzKGVudikpOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmYwLCBlbnYtPmVpcCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZWMsIEVESSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZTgsIEVTSSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZTQsIEVCUCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZTAsIEVTUCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZGMsIEVCWCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZDgsIEVEWCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZDQsIEVDWCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmZDAsIEVBWCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmY2MsIGVudi0+ZHJbNl0pOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmM4LCBlbnYtPmRyWzddKTsKKworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmM0LCBlbnYtPnRyLnNlbGVjdG9yKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y2NCwgZW52LT50ci5iYXNlKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y2MCwgZW52LT50ci5saW1pdCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmNWMsIChlbnYtPnRyLmZsYWdzID4+IDgpICYgMHhmMGZmKTsKKworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmMwLCBlbnYtPmxkdC5zZWxlY3Rvcik7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmODAsIGVudi0+bGR0LmJhc2UpOworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZjdjLCBlbnYtPmxkdC5saW1pdCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmNzgsIChlbnYtPmxkdC5mbGFncyA+PiA4KSAmIDB4ZjBmZik7CisKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y3NCwgZW52LT5nZHQuYmFzZSk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmNzAsIGVudi0+Z2R0LmxpbWl0KTsKKworICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZjU4LCBlbnYtPmlkdC5iYXNlKTsKKyAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y1NCwgZW52LT5pZHQubGltaXQpOworCisgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGR0ID0gJmVudi0+c2Vnc1tpXTsKKyAgICAgICAgaWYgKGkgPCAzKQorICAgICAgICAgICAgb2Zmc2V0ID0gMHg3Zjg0ICsgaSAqIDEyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZmZzZXQgPSAweDdmMmMgKyAoaSAtIDMpICogMTI7CisgICAgICAgIHN0bF9waHlzKHNtX3N0YXRlICsgMHg3ZmE4ICsgaSAqIDQsIGR0LT5zZWxlY3Rvcik7CisgICAgICAgIHN0bF9waHlzKHNtX3N0YXRlICsgb2Zmc2V0ICsgOCwgZHQtPmJhc2UpOworICAgICAgICBzdGxfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCArIDQsIGR0LT5saW1pdCk7CisgICAgICAgIHN0bF9waHlzKHNtX3N0YXRlICsgb2Zmc2V0LCAoZHQtPmZsYWdzID4+IDgpICYgMHhmMGZmKTsKKyAgICB9CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdmMTQsIGVudi0+Y3JbNF0pOworCisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdlZmMsIFNNTV9SRVZJU0lPTl9JRCk7CisgICAgc3RsX3BoeXMoc21fc3RhdGUgKyAweDdlZjgsIGVudi0+c21iYXNlKTsKKyNlbmRpZgorICAgIC8qIGluaXQgU01NIGNwdSBzdGF0ZSAqLworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNwdV9sb2FkX2VmZXIoZW52LCAwKTsKKyNlbmRpZgorICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsIDAsIH4oQ0NfTyB8IENDX1MgfCBDQ19aIHwgQ0NfQSB8IENDX1AgfCBDQ19DIHwgREZfTUFTSykpOworICAgIGVudi0+ZWlwID0gMHgwMDAwODAwMDsKKyAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9DUywgKGVudi0+c21iYXNlID4+IDQpICYgMHhmZmZmLCBlbnYtPnNtYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYsIDApOworICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0RTLCAwLCAwLCAweGZmZmZmZmZmLCAwKTsKKyAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9FUywgMCwgMCwgMHhmZmZmZmZmZiwgMCk7CisgICAgY3B1X3g4Nl9sb2FkX3NlZ19jYWNoZShlbnYsIFJfU1MsIDAsIDAsIDB4ZmZmZmZmZmYsIDApOworICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBSX0ZTLCAwLCAwLCAweGZmZmZmZmZmLCAwKTsKKyAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgUl9HUywgMCwgMCwgMHhmZmZmZmZmZiwgMCk7CisKKyAgICBjcHVfeDg2X3VwZGF0ZV9jcjAoZW52LAorICAgICAgICAgICAgICAgICAgICAgICBlbnYtPmNyWzBdICYgfihDUjBfUEVfTUFTSyB8IENSMF9FTV9NQVNLIHwgQ1IwX1RTX01BU0sgfCBDUjBfUEdfTUFTSykpOworICAgIGNwdV94ODZfdXBkYXRlX2NyNChlbnYsIDApOworICAgIGVudi0+ZHJbN10gPSAweDAwMDAwNDAwOworICAgIENDX09QID0gQ0NfT1BfRUZMQUdTOworfQorCit2b2lkIGhlbHBlcl9yc20oQ1BVWDg2U3RhdGUgKmVudikKK3sKKyAgICB0YXJnZXRfdWxvbmcgc21fc3RhdGU7CisgICAgaW50IGksIG9mZnNldDsKKyAgICB1aW50MzJfdCB2YWw7CisKKyAgICBzbV9zdGF0ZSA9IGVudi0+c21iYXNlICsgMHg4MDAwOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBjcHVfbG9hZF9lZmVyKGVudiwgbGRxX3BoeXMoc21fc3RhdGUgKyAweDdlZDApKTsKKworICAgIGZvcihpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBvZmZzZXQgPSAweDdlMDAgKyBpICogMTY7CisgICAgICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkdXdfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRxX3BoeXMoc21fc3RhdGUgKyBvZmZzZXQgKyA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGxfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCArIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZHV3X3BoeXMoc21fc3RhdGUgKyBvZmZzZXQgKyAyKSAmIDB4ZjBmZikgPDwgOCk7CisgICAgfQorCisgICAgZW52LT5nZHQuYmFzZSA9IGxkcV9waHlzKHNtX3N0YXRlICsgMHg3ZTY4KTsKKyAgICBlbnYtPmdkdC5saW1pdCA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZTY0KTsKKworICAgIGVudi0+bGR0LnNlbGVjdG9yID0gbGR1d19waHlzKHNtX3N0YXRlICsgMHg3ZTcwKTsKKyAgICBlbnYtPmxkdC5iYXNlID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdlNzgpOworICAgIGVudi0+bGR0LmxpbWl0ID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdlNzQpOworICAgIGVudi0+bGR0LmZsYWdzID0gKGxkdXdfcGh5cyhzbV9zdGF0ZSArIDB4N2U3MikgJiAweGYwZmYpIDw8IDg7CisKKyAgICBlbnYtPmlkdC5iYXNlID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdlODgpOworICAgIGVudi0+aWR0LmxpbWl0ID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdlODQpOworCisgICAgZW52LT50ci5zZWxlY3RvciA9IGxkdXdfcGh5cyhzbV9zdGF0ZSArIDB4N2U5MCk7CisgICAgZW52LT50ci5iYXNlID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdlOTgpOworICAgIGVudi0+dHIubGltaXQgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2U5NCk7CisgICAgZW52LT50ci5mbGFncyA9IChsZHV3X3BoeXMoc21fc3RhdGUgKyAweDdlOTIpICYgMHhmMGZmKSA8PCA4OworCisgICAgRUFYID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdmZjgpOworICAgIEVDWCA9IGxkcV9waHlzKHNtX3N0YXRlICsgMHg3ZmYwKTsKKyAgICBFRFggPSBsZHFfcGh5cyhzbV9zdGF0ZSArIDB4N2ZlOCk7CisgICAgRUJYID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdmZTApOworICAgIEVTUCA9IGxkcV9waHlzKHNtX3N0YXRlICsgMHg3ZmQ4KTsKKyAgICBFQlAgPSBsZHFfcGh5cyhzbV9zdGF0ZSArIDB4N2ZkMCk7CisgICAgRVNJID0gbGRxX3BoeXMoc21fc3RhdGUgKyAweDdmYzgpOworICAgIEVESSA9IGxkcV9waHlzKHNtX3N0YXRlICsgMHg3ZmMwKTsKKyAgICBmb3IoaSA9IDg7IGkgPCAxNjsgaSsrKQorICAgICAgICBlbnYtPnJlZ3NbaV0gPSBsZHFfcGh5cyhzbV9zdGF0ZSArIDB4N2ZmOCAtIGkgKiA4KTsKKyAgICBlbnYtPmVpcCA9IGxkcV9waHlzKHNtX3N0YXRlICsgMHg3Zjc4KTsKKyAgICBjcHVfbG9hZF9lZmxhZ3MoZW52LCBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y3MCksCisgICAgICAgICAgICAgICAgfihDQ19PIHwgQ0NfUyB8IENDX1ogfCBDQ19BIHwgQ0NfUCB8IENDX0MgfCBERl9NQVNLKSk7CisgICAgZW52LT5kcls2XSA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZjY4KTsKKyAgICBlbnYtPmRyWzddID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmNjApOworCisgICAgY3B1X3g4Nl91cGRhdGVfY3I0KGVudiwgbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmNDgpKTsKKyAgICBjcHVfeDg2X3VwZGF0ZV9jcjMoZW52LCBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y1MCkpOworICAgIGNwdV94ODZfdXBkYXRlX2NyMChlbnYsIGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZjU4KSk7CisKKyAgICB2YWwgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2VmYyk7IC8qIHJldmlzaW9uIElEICovCisgICAgaWYgKHZhbCAmIDB4MjAwMDApIHsKKyAgICAgICAgZW52LT5zbWJhc2UgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2YwMCkgJiB+MHg3ZmZmOworICAgIH0KKyNlbHNlCisgICAgY3B1X3g4Nl91cGRhdGVfY3IwKGVudiwgbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmZmMpKTsKKyAgICBjcHVfeDg2X3VwZGF0ZV9jcjMoZW52LCBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZmOCkpOworICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsIGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmY0KSwKKyAgICAgICAgICAgICAgICB+KENDX08gfCBDQ19TIHwgQ0NfWiB8IENDX0EgfCBDQ19QIHwgQ0NfQyB8IERGX01BU0spKTsKKyAgICBlbnYtPmVpcCA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmYwKTsKKyAgICBFREkgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZlYyk7CisgICAgRVNJID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmZTgpOworICAgIEVCUCA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmU0KTsKKyAgICBFU1AgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZlMCk7CisgICAgRUJYID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmZGMpOworICAgIEVEWCA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmQ4KTsKKyAgICBFQ1ggPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZkNCk7CisgICAgRUFYID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmZDApOworICAgIGVudi0+ZHJbNl0gPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZjYyk7CisgICAgZW52LT5kcls3XSA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmM4KTsKKworICAgIGVudi0+dHIuc2VsZWN0b3IgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZjNCkgJiAweGZmZmY7CisgICAgZW52LT50ci5iYXNlID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmNjQpOworICAgIGVudi0+dHIubGltaXQgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y2MCk7CisgICAgZW52LT50ci5mbGFncyA9IChsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y1YykgJiAweGYwZmYpIDw8IDg7CisKKyAgICBlbnYtPmxkdC5zZWxlY3RvciA9IGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZmMwKSAmIDB4ZmZmZjsKKyAgICBlbnYtPmxkdC5iYXNlID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmODApOworICAgIGVudi0+bGR0LmxpbWl0ID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmN2MpOworICAgIGVudi0+bGR0LmZsYWdzID0gKGxkbF9waHlzKHNtX3N0YXRlICsgMHg3Zjc4KSAmIDB4ZjBmZikgPDwgODsKKworICAgIGVudi0+Z2R0LmJhc2UgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y3NCk7CisgICAgZW52LT5nZHQubGltaXQgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2Y3MCk7CisKKyAgICBlbnYtPmlkdC5iYXNlID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmNTgpOworICAgIGVudi0+aWR0LmxpbWl0ID0gbGRsX3BoeXMoc21fc3RhdGUgKyAweDdmNTQpOworCisgICAgZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgMykKKyAgICAgICAgICAgIG9mZnNldCA9IDB4N2Y4NCArIGkgKiAxMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2Zmc2V0ID0gMHg3ZjJjICsgKGkgLSAzKSAqIDEyOworICAgICAgICBjcHVfeDg2X2xvYWRfc2VnX2NhY2hlKGVudiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2ZhOCArIGkgKiA0KSAmIDB4ZmZmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZGxfcGh5cyhzbV9zdGF0ZSArIG9mZnNldCArIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxkbF9waHlzKHNtX3N0YXRlICsgb2Zmc2V0ICsgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxkbF9waHlzKHNtX3N0YXRlICsgb2Zmc2V0KSAmIDB4ZjBmZikgPDwgOCk7CisgICAgfQorICAgIGNwdV94ODZfdXBkYXRlX2NyNChlbnYsIGxkbF9waHlzKHNtX3N0YXRlICsgMHg3ZjE0KSk7CisKKyAgICB2YWwgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2VmYyk7IC8qIHJldmlzaW9uIElEICovCisgICAgaWYgKHZhbCAmIDB4MjAwMDApIHsKKyAgICAgICAgZW52LT5zbWJhc2UgPSBsZGxfcGh5cyhzbV9zdGF0ZSArIDB4N2VmOCkgJiB+MHg3ZmZmOworICAgIH0KKyNlbmRpZgorICAgIENDX09QID0gQ0NfT1BfRUZMQUdTOworICAgIGVudi0+aGZsYWdzICY9IH5IRl9TTU1fTUFTSzsKKyAgICBjcHVfc21tX3VwZGF0ZShlbnYpOworCisgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX0lOVCwgIlNNTTogYWZ0ZXIgUlNNXG4iKTsKKyAgICBsb2dfY3B1X3N0YXRlX21hc2soQ1BVX0xPR19JTlQsIEVOVl9HRVRfQ1BVKGVudiksIFg4Nl9EVU1QX0NDT1ApOworfQorCisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc3ZtLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L3N2bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTkzZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L3N2bS5oCkBAIC0wLDAgKzEsMjIyIEBACisjaWZuZGVmIF9fU1ZNX0gKKyNkZWZpbmUgX19TVk1fSAorCisjZGVmaW5lIFRMQl9DT05UUk9MX0RPX05PVEhJTkcgMAorI2RlZmluZSBUTEJfQ09OVFJPTF9GTFVTSF9BTExfQVNJRCAxCisKKyNkZWZpbmUgVl9UUFJfTUFTSyAweDBmCisKKyNkZWZpbmUgVl9JUlFfU0hJRlQgOAorI2RlZmluZSBWX0lSUV9NQVNLICgxIDw8IFZfSVJRX1NISUZUKQorCisjZGVmaW5lIFZfSU5UUl9QUklPX1NISUZUIDE2CisjZGVmaW5lIFZfSU5UUl9QUklPX01BU0sgKDB4MGYgPDwgVl9JTlRSX1BSSU9fU0hJRlQpCisKKyNkZWZpbmUgVl9JR05fVFBSX1NISUZUIDIwCisjZGVmaW5lIFZfSUdOX1RQUl9NQVNLICgxIDw8IFZfSUdOX1RQUl9TSElGVCkKKworI2RlZmluZSBWX0lOVFJfTUFTS0lOR19TSElGVCAyNAorI2RlZmluZSBWX0lOVFJfTUFTS0lOR19NQVNLICgxIDw8IFZfSU5UUl9NQVNLSU5HX1NISUZUKQorCisjZGVmaW5lIFNWTV9JTlRFUlJVUFRfU0hBRE9XX01BU0sgMQorCisjZGVmaW5lIFNWTV9JT0lPX1NUUl9TSElGVCAyCisjZGVmaW5lIFNWTV9JT0lPX1JFUF9TSElGVCAzCisjZGVmaW5lIFNWTV9JT0lPX1NJWkVfU0hJRlQgNAorI2RlZmluZSBTVk1fSU9JT19BU0laRV9TSElGVCA3CisKKyNkZWZpbmUgU1ZNX0lPSU9fVFlQRV9NQVNLIDEKKyNkZWZpbmUgU1ZNX0lPSU9fU1RSX01BU0sgKDEgPDwgU1ZNX0lPSU9fU1RSX1NISUZUKQorI2RlZmluZSBTVk1fSU9JT19SRVBfTUFTSyAoMSA8PCBTVk1fSU9JT19SRVBfU0hJRlQpCisjZGVmaW5lIFNWTV9JT0lPX1NJWkVfTUFTSyAoNyA8PCBTVk1fSU9JT19TSVpFX1NISUZUKQorI2RlZmluZSBTVk1fSU9JT19BU0laRV9NQVNLICg3IDw8IFNWTV9JT0lPX0FTSVpFX1NISUZUKQorCisjZGVmaW5lIFNWTV9FVlRJTkpfVkVDX01BU0sgMHhmZgorCisjZGVmaW5lIFNWTV9FVlRJTkpfVFlQRV9TSElGVCA4CisjZGVmaW5lIFNWTV9FVlRJTkpfVFlQRV9NQVNLICg3IDw8IFNWTV9FVlRJTkpfVFlQRV9TSElGVCkKKworI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfSU5UUiAoMCA8PCBTVk1fRVZUSU5KX1RZUEVfU0hJRlQpCisjZGVmaW5lIFNWTV9FVlRJTkpfVFlQRV9OTUkgKDIgPDwgU1ZNX0VWVElOSl9UWVBFX1NISUZUKQorI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfRVhFUFQgKDMgPDwgU1ZNX0VWVElOSl9UWVBFX1NISUZUKQorI2RlZmluZSBTVk1fRVZUSU5KX1RZUEVfU09GVCAoNCA8PCBTVk1fRVZUSU5KX1RZUEVfU0hJRlQpCisKKyNkZWZpbmUgU1ZNX0VWVElOSl9WQUxJRCAoMSA8PCAzMSkKKyNkZWZpbmUgU1ZNX0VWVElOSl9WQUxJRF9FUlIgKDEgPDwgMTEpCisKKyNkZWZpbmUgU1ZNX0VYSVRJTlRJTkZPX1ZFQ19NQVNLIFNWTV9FVlRJTkpfVkVDX01BU0sKKworI2RlZmluZQlTVk1fRVhJVElOVElORk9fVFlQRV9JTlRSIFNWTV9FVlRJTkpfVFlQRV9JTlRSCisjZGVmaW5lCVNWTV9FWElUSU5USU5GT19UWVBFX05NSSBTVk1fRVZUSU5KX1RZUEVfTk1JCisjZGVmaW5lCVNWTV9FWElUSU5USU5GT19UWVBFX0VYRVBUIFNWTV9FVlRJTkpfVFlQRV9FWEVQVAorI2RlZmluZQlTVk1fRVhJVElOVElORk9fVFlQRV9TT0ZUIFNWTV9FVlRJTkpfVFlQRV9TT0ZUCisKKyNkZWZpbmUgU1ZNX0VYSVRJTlRJTkZPX1ZBTElEIFNWTV9FVlRJTkpfVkFMSUQKKyNkZWZpbmUgU1ZNX0VYSVRJTlRJTkZPX1ZBTElEX0VSUiBTVk1fRVZUSU5KX1ZBTElEX0VSUgorCisjZGVmaW5lCVNWTV9FWElUX1JFQURfQ1IwIAkweDAwMAorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0NSMyAJMHgwMDMKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9DUjQgCTB4MDA0CisjZGVmaW5lCVNWTV9FWElUX1JFQURfQ1I4IAkweDAwOAorI2RlZmluZQlTVk1fRVhJVF9XUklURV9DUjAgCTB4MDEwCisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0NSMyAJMHgwMTMKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfQ1I0IAkweDAxNAorI2RlZmluZQlTVk1fRVhJVF9XUklURV9DUjggCTB4MDE4CisjZGVmaW5lCVNWTV9FWElUX1JFQURfRFIwIAkweDAyMAorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSMSAJMHgwMjEKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9EUjIgCTB4MDIyCisjZGVmaW5lCVNWTV9FWElUX1JFQURfRFIzIAkweDAyMworI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSNCAJMHgwMjQKKyNkZWZpbmUJU1ZNX0VYSVRfUkVBRF9EUjUgCTB4MDI1CisjZGVmaW5lCVNWTV9FWElUX1JFQURfRFI2IAkweDAyNgorI2RlZmluZQlTVk1fRVhJVF9SRUFEX0RSNyAJMHgwMjcKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFIwIAkweDAzMAorI2RlZmluZQlTVk1fRVhJVF9XUklURV9EUjEgCTB4MDMxCisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0RSMiAJMHgwMzIKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFIzIAkweDAzMworI2RlZmluZQlTVk1fRVhJVF9XUklURV9EUjQgCTB4MDM0CisjZGVmaW5lCVNWTV9FWElUX1dSSVRFX0RSNSAJMHgwMzUKKyNkZWZpbmUJU1ZNX0VYSVRfV1JJVEVfRFI2IAkweDAzNgorI2RlZmluZQlTVk1fRVhJVF9XUklURV9EUjcgCTB4MDM3CisjZGVmaW5lIFNWTV9FWElUX0VYQ1BfQkFTRSAgICAgIDB4MDQwCisjZGVmaW5lIFNWTV9FWElUX0lOVFIJCTB4MDYwCisjZGVmaW5lIFNWTV9FWElUX05NSQkJMHgwNjEKKyNkZWZpbmUgU1ZNX0VYSVRfU01JCQkweDA2MgorI2RlZmluZSBTVk1fRVhJVF9JTklUCQkweDA2MworI2RlZmluZSBTVk1fRVhJVF9WSU5UUgkJMHgwNjQKKyNkZWZpbmUgU1ZNX0VYSVRfQ1IwX1NFTF9XUklURQkweDA2NQorI2RlZmluZSBTVk1fRVhJVF9JRFRSX1JFQUQJMHgwNjYKKyNkZWZpbmUgU1ZNX0VYSVRfR0RUUl9SRUFECTB4MDY3CisjZGVmaW5lIFNWTV9FWElUX0xEVFJfUkVBRAkweDA2OAorI2RlZmluZSBTVk1fRVhJVF9UUl9SRUFECTB4MDY5CisjZGVmaW5lIFNWTV9FWElUX0lEVFJfV1JJVEUJMHgwNmEKKyNkZWZpbmUgU1ZNX0VYSVRfR0RUUl9XUklURQkweDA2YgorI2RlZmluZSBTVk1fRVhJVF9MRFRSX1dSSVRFCTB4MDZjCisjZGVmaW5lIFNWTV9FWElUX1RSX1dSSVRFCTB4MDZkCisjZGVmaW5lIFNWTV9FWElUX1JEVFNDCQkweDA2ZQorI2RlZmluZSBTVk1fRVhJVF9SRFBNQwkJMHgwNmYKKyNkZWZpbmUgU1ZNX0VYSVRfUFVTSEYJCTB4MDcwCisjZGVmaW5lIFNWTV9FWElUX1BPUEYJCTB4MDcxCisjZGVmaW5lIFNWTV9FWElUX0NQVUlECQkweDA3MgorI2RlZmluZSBTVk1fRVhJVF9SU00JCTB4MDczCisjZGVmaW5lIFNWTV9FWElUX0lSRVQJCTB4MDc0CisjZGVmaW5lIFNWTV9FWElUX1NXSU5UCQkweDA3NQorI2RlZmluZSBTVk1fRVhJVF9JTlZECQkweDA3NgorI2RlZmluZSBTVk1fRVhJVF9QQVVTRQkJMHgwNzcKKyNkZWZpbmUgU1ZNX0VYSVRfSExUCQkweDA3OAorI2RlZmluZSBTVk1fRVhJVF9JTlZMUEcJCTB4MDc5CisjZGVmaW5lIFNWTV9FWElUX0lOVkxQR0EJMHgwN2EKKyNkZWZpbmUgU1ZNX0VYSVRfSU9JTwkJMHgwN2IKKyNkZWZpbmUgU1ZNX0VYSVRfTVNSCQkweDA3YworI2RlZmluZSBTVk1fRVhJVF9UQVNLX1NXSVRDSAkweDA3ZAorI2RlZmluZSBTVk1fRVhJVF9GRVJSX0ZSRUVaRQkweDA3ZQorI2RlZmluZSBTVk1fRVhJVF9TSFVURE9XTgkweDA3ZgorI2RlZmluZSBTVk1fRVhJVF9WTVJVTgkJMHgwODAKKyNkZWZpbmUgU1ZNX0VYSVRfVk1NQ0FMTAkweDA4MQorI2RlZmluZSBTVk1fRVhJVF9WTUxPQUQJCTB4MDgyCisjZGVmaW5lIFNWTV9FWElUX1ZNU0FWRQkJMHgwODMKKyNkZWZpbmUgU1ZNX0VYSVRfU1RHSQkJMHgwODQKKyNkZWZpbmUgU1ZNX0VYSVRfQ0xHSQkJMHgwODUKKyNkZWZpbmUgU1ZNX0VYSVRfU0tJTklUCQkweDA4NgorI2RlZmluZSBTVk1fRVhJVF9SRFRTQ1AJCTB4MDg3CisjZGVmaW5lIFNWTV9FWElUX0lDRUJQCQkweDA4OAorI2RlZmluZSBTVk1fRVhJVF9XQklOVkQJCTB4MDg5CisvKiBvbmx5IGluY2x1ZGVkIGluIGRvY3VtZW50YXRpb24sIG1heWJlIHdyb25nICovCisjZGVmaW5lIFNWTV9FWElUX01PTklUT1IJMHgwOGEKKyNkZWZpbmUgU1ZNX0VYSVRfTVdBSVQJCTB4MDhiCisjZGVmaW5lIFNWTV9FWElUX05QRiAgCQkweDQwMAorCisjZGVmaW5lIFNWTV9FWElUX0VSUgkJLTEKKworI2RlZmluZSBTVk1fQ1IwX1NFTEVDVElWRV9NQVNLICgxIDw8IDMgfCAxKSAvKiBUUyBhbmQgTVAgKi8KKworc3RydWN0IFFFTVVfUEFDS0VEIHZtY2JfY29udHJvbF9hcmVhIHsKKwl1aW50MTZfdCBpbnRlcmNlcHRfY3JfcmVhZDsKKwl1aW50MTZfdCBpbnRlcmNlcHRfY3Jfd3JpdGU7CisJdWludDE2X3QgaW50ZXJjZXB0X2RyX3JlYWQ7CisJdWludDE2X3QgaW50ZXJjZXB0X2RyX3dyaXRlOworCXVpbnQzMl90IGludGVyY2VwdF9leGNlcHRpb25zOworCXVpbnQ2NF90IGludGVyY2VwdDsKKwl1aW50OF90IHJlc2VydmVkXzFbNDRdOworCXVpbnQ2NF90IGlvcG1fYmFzZV9wYTsKKwl1aW50NjRfdCBtc3JwbV9iYXNlX3BhOworCXVpbnQ2NF90IHRzY19vZmZzZXQ7CisJdWludDMyX3QgYXNpZDsKKwl1aW50OF90IHRsYl9jdGw7CisJdWludDhfdCByZXNlcnZlZF8yWzNdOworCXVpbnQzMl90IGludF9jdGw7CisJdWludDMyX3QgaW50X3ZlY3RvcjsKKwl1aW50MzJfdCBpbnRfc3RhdGU7CisJdWludDhfdCByZXNlcnZlZF8zWzRdOworCXVpbnQ2NF90IGV4aXRfY29kZTsKKwl1aW50NjRfdCBleGl0X2luZm9fMTsKKwl1aW50NjRfdCBleGl0X2luZm9fMjsKKwl1aW50MzJfdCBleGl0X2ludF9pbmZvOworCXVpbnQzMl90IGV4aXRfaW50X2luZm9fZXJyOworCXVpbnQ2NF90IG5lc3RlZF9jdGw7CisJdWludDhfdCByZXNlcnZlZF80WzE2XTsKKwl1aW50MzJfdCBldmVudF9pbmo7CisJdWludDMyX3QgZXZlbnRfaW5qX2VycjsKKwl1aW50NjRfdCBuZXN0ZWRfY3IzOworCXVpbnQ2NF90IGxicl9jdGw7CisJdWludDhfdCByZXNlcnZlZF81WzgzMl07Cit9OworCitzdHJ1Y3QgUUVNVV9QQUNLRUQgdm1jYl9zZWcgeworCXVpbnQxNl90IHNlbGVjdG9yOworCXVpbnQxNl90IGF0dHJpYjsKKwl1aW50MzJfdCBsaW1pdDsKKwl1aW50NjRfdCBiYXNlOworfTsKKworc3RydWN0IFFFTVVfUEFDS0VEIHZtY2Jfc2F2ZV9hcmVhIHsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZXM7CisJc3RydWN0IHZtY2Jfc2VnIGNzOworCXN0cnVjdCB2bWNiX3NlZyBzczsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZHM7CisJc3RydWN0IHZtY2Jfc2VnIGZzOworCXN0cnVjdCB2bWNiX3NlZyBnczsKKwlzdHJ1Y3Qgdm1jYl9zZWcgZ2R0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgbGR0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgaWR0cjsKKwlzdHJ1Y3Qgdm1jYl9zZWcgdHI7CisJdWludDhfdCByZXNlcnZlZF8xWzQzXTsKKwl1aW50OF90IGNwbDsKKwl1aW50OF90IHJlc2VydmVkXzJbNF07CisJdWludDY0X3QgZWZlcjsKKwl1aW50OF90IHJlc2VydmVkXzNbMTEyXTsKKwl1aW50NjRfdCBjcjQ7CisJdWludDY0X3QgY3IzOworCXVpbnQ2NF90IGNyMDsKKwl1aW50NjRfdCBkcjc7CisJdWludDY0X3QgZHI2OworCXVpbnQ2NF90IHJmbGFnczsKKwl1aW50NjRfdCByaXA7CisJdWludDhfdCByZXNlcnZlZF80Wzg4XTsKKwl1aW50NjRfdCByc3A7CisJdWludDhfdCByZXNlcnZlZF81WzI0XTsKKwl1aW50NjRfdCByYXg7CisJdWludDY0X3Qgc3RhcjsKKwl1aW50NjRfdCBsc3RhcjsKKwl1aW50NjRfdCBjc3RhcjsKKwl1aW50NjRfdCBzZm1hc2s7CisJdWludDY0X3Qga2VybmVsX2dzX2Jhc2U7CisJdWludDY0X3Qgc3lzZW50ZXJfY3M7CisJdWludDY0X3Qgc3lzZW50ZXJfZXNwOworCXVpbnQ2NF90IHN5c2VudGVyX2VpcDsKKwl1aW50NjRfdCBjcjI7CisJdWludDhfdCByZXNlcnZlZF82WzMyXTsKKwl1aW50NjRfdCBnX3BhdDsKKwl1aW50NjRfdCBkYmdjdGw7CisJdWludDY0X3QgYnJfZnJvbTsKKwl1aW50NjRfdCBicl90bzsKKwl1aW50NjRfdCBsYXN0X2V4Y3BfZnJvbTsKKwl1aW50NjRfdCBsYXN0X2V4Y3BfdG87Cit9OworCitzdHJ1Y3QgUUVNVV9QQUNLRUQgdm1jYiB7CisJc3RydWN0IHZtY2JfY29udHJvbF9hcmVhIGNvbnRyb2w7CisJc3RydWN0IHZtY2Jfc2F2ZV9hcmVhIHNhdmU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc3ZtX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni9zdm1faGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiMjUwMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LWkzODYvc3ZtX2hlbHBlci5jCkBAIC0wLDAgKzEsNjIxIEBACisvKgorICogIHg4NiBTVk0gaGVscGVycworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2NwdS1hbGwuaCIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X2V4ZWMuaCIKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKSAqLworCisvKiBTZWN1cmUgVmlydHVhbCBNYWNoaW5lIGhlbHBlcnMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKwordm9pZCBoZWxwZXJfdm1ydW4oQ1BVWDg2U3RhdGUgKmVudiwgaW50IGFmbGFnLCBpbnQgbmV4dF9laXBfYWRkZW5kKQoreworfQordm9pZCBoZWxwZXJfdm1tY2FsbChDUFVYODZTdGF0ZSAqZW52KQoreworfQordm9pZCBoZWxwZXJfdm1sb2FkKENQVVg4NlN0YXRlICplbnYsIGludCBhZmxhZykKK3sKK30KK3ZvaWQgaGVscGVyX3Ztc2F2ZShDUFVYODZTdGF0ZSAqZW52LCBpbnQgYWZsYWcpCit7Cit9Cit2b2lkIGhlbHBlcl9zdGdpKENQVVg4NlN0YXRlICplbnYpCit7Cit9Cit2b2lkIGhlbHBlcl9jbGdpKENQVVg4NlN0YXRlICplbnYpCit7Cit9Cit2b2lkIGhlbHBlcl9za2luaXQoQ1BVWDg2U3RhdGUgKmVudikKK3sKK30KK3ZvaWQgaGVscGVyX2ludmxwZ2EoQ1BVWDg2U3RhdGUgKmVudiwgaW50IGFmbGFnKQoreworfQordm9pZCBoZWxwZXJfdm1leGl0KENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXhpdF9jb2RlLCB1aW50NjRfdCBleGl0X2luZm9fMSkKK3sKK30KK3ZvaWQgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSwgdWludDY0X3QgcGFyYW0pCit7Cit9CisKK3ZvaWQgc3ZtX2NoZWNrX2ludGVyY2VwdChDUFVYODZTdGF0ZSAqZW52LCB1aW50MzJfdCB0eXBlKQoreworfQorCit2b2lkIGhlbHBlcl9zdm1fY2hlY2tfaW8oQ1BVWDg2U3RhdGUqIGVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3J0LCB1aW50MzJfdCBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuZXh0X2VpcF9hZGRlbmQpCit7Cit9CisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZtX3NhdmVfc2VnKGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWdtZW50Q2FjaGUgKnNjKQoreworICAgIHN0d19waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYl9zZWcsIHNlbGVjdG9yKSwKKyAgICAgICAgICAgICBzYy0+c2VsZWN0b3IpOworICAgIHN0cV9waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYl9zZWcsIGJhc2UpLAorICAgICAgICAgICAgIHNjLT5iYXNlKTsKKyAgICBzdGxfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2Jfc2VnLCBsaW1pdCksCisgICAgICAgICAgICAgc2MtPmxpbWl0KTsKKyAgICBzdHdfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2Jfc2VnLCBhdHRyaWIpLAorICAgICAgICAgICAgICgoc2MtPmZsYWdzID4+IDgpICYgMHhmZikgfCAoKHNjLT5mbGFncyA+PiAxMikgJiAweDBmMDApKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN2bV9sb2FkX3NlZyhod2FkZHIgYWRkciwgU2VnbWVudENhY2hlICpzYykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisKKyAgICBzYy0+c2VsZWN0b3IgPSBsZHV3X3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiX3NlZywgc2VsZWN0b3IpKTsKKyAgICBzYy0+YmFzZSA9IGxkcV9waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYl9zZWcsIGJhc2UpKTsKKyAgICBzYy0+bGltaXQgPSBsZGxfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2Jfc2VnLCBsaW1pdCkpOworICAgIGZsYWdzID0gbGR1d19waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYl9zZWcsIGF0dHJpYikpOworICAgIHNjLT5mbGFncyA9ICgoZmxhZ3MgJiAweGZmKSA8PCA4KSB8ICgoZmxhZ3MgJiAweDBmMDApIDw8IDEyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN2bV9sb2FkX3NlZ19jYWNoZShod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVWDg2U3RhdGUgKmVudiwgaW50IHNlZ19yZWcpCit7CisgICAgU2VnbWVudENhY2hlIHNjMSwgKnNjID0gJnNjMTsKKyAgICBzdm1fbG9hZF9zZWcoYWRkciwgc2MpOworICAgIGNwdV94ODZfbG9hZF9zZWdfY2FjaGUoZW52LCBzZWdfcmVnLCBzYy0+c2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+YmFzZSwgc2MtPmxpbWl0LCBzYy0+ZmxhZ3MpOworfQorCit2b2lkIGhlbHBlcl92bXJ1bihDUFVYODZTdGF0ZSAqZW52LCBpbnQgYWZsYWcsIGludCBuZXh0X2VpcF9hZGRlbmQpCit7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgdWludDMyX3QgZXZlbnRfaW5qOworICAgIHVpbnQzMl90IGludF9jdGw7CisKKyAgICBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShlbnYsIFNWTV9FWElUX1ZNUlVOLCAwKTsKKworICAgIGlmIChhZmxhZyA9PSAyKQorICAgICAgICBhZGRyID0gRUFYOworICAgIGVsc2UKKyAgICAgICAgYWRkciA9ICh1aW50MzJfdClFQVg7CisKKyAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfSU5fQVNNLCAidm1ydW4hICIgVEFSR0VUX0ZNVF9seCAiXG4iLCBhZGRyKTsKKworICAgIGVudi0+dm1fdm1jYiA9IGFkZHI7CisKKyAgICAvKiBzYXZlIHRoZSBjdXJyZW50IENQVSBzdGF0ZSBpbiB0aGUgaHNhdmUgcGFnZSAqLworICAgIHN0cV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5nZHRyLmJhc2UpLCBlbnYtPmdkdC5iYXNlKTsKKyAgICBzdGxfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZ2R0ci5saW1pdCksIGVudi0+Z2R0LmxpbWl0KTsKKworICAgIHN0cV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5pZHRyLmJhc2UpLCBlbnYtPmlkdC5iYXNlKTsKKyAgICBzdGxfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuaWR0ci5saW1pdCksIGVudi0+aWR0LmxpbWl0KTsKKworICAgIHN0cV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjApLCBlbnYtPmNyWzBdKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3IyKSwgZW52LT5jclsyXSk7CisgICAgc3RxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmNyMyksIGVudi0+Y3JbM10pOworICAgIHN0cV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjQpLCBlbnYtPmNyWzRdKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZHI2KSwgZW52LT5kcls2XSk7CisgICAgc3RxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmRyNyksIGVudi0+ZHJbN10pOworCisgICAgc3RxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmVmZXIpLCBlbnYtPmVmZXIpOworICAgIHN0cV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5yZmxhZ3MpLCBjcHVfY29tcHV0ZV9lZmxhZ3MoZW52KSk7CisKKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmVzKSwKKyAgICAgICAgICAgICAgICAgICZlbnYtPnNlZ3NbUl9FU10pOworICAgIHN2bV9zYXZlX3NlZyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3MpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfQ1NdKTsKKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnNzKSwKKyAgICAgICAgICAgICAgICAgJmVudi0+c2Vnc1tSX1NTXSk7CisgICAgc3ZtX3NhdmVfc2VnKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5kcyksCisgICAgICAgICAgICAgICAgICZlbnYtPnNlZ3NbUl9EU10pOworCisgICAgc3RxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnJpcCksCisgICAgICAgICAgICAgRUlQICsgbmV4dF9laXBfYWRkZW5kKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucnNwKSwgRVNQKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmF4KSwgRUFYKTsKKworICAgIC8qIGxvYWQgdGhlIGludGVyY2VwdGlvbiBiaXRtYXBzIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGFjY2VzcyB0aGUKKyAgICAgICB2bWNiIGluIHN2bSBtb2RlICovCisgICAgZW52LT5pbnRlcmNlcHQgICAgICAgICAgICA9IGxkcV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmludGVyY2VwdCkpOworICAgIGVudi0+aW50ZXJjZXB0X2NyX3JlYWQgICAgPSBsZHV3X3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50ZXJjZXB0X2NyX3JlYWQpKTsKKyAgICBlbnYtPmludGVyY2VwdF9jcl93cml0ZSAgID0gbGR1d19waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmludGVyY2VwdF9jcl93cml0ZSkpOworICAgIGVudi0+aW50ZXJjZXB0X2RyX3JlYWQgICAgPSBsZHV3X3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50ZXJjZXB0X2RyX3JlYWQpKTsKKyAgICBlbnYtPmludGVyY2VwdF9kcl93cml0ZSAgID0gbGR1d19waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmludGVyY2VwdF9kcl93cml0ZSkpOworICAgIGVudi0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgPSBsZGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5pbnRlcmNlcHRfZXhjZXB0aW9ucykpOworCisgICAgLyogZW5hYmxlIGludGVyY2VwdHMgKi8KKyAgICBlbnYtPmhmbGFncyB8PSBIRl9TVk1JX01BU0s7CisKKyAgICBlbnYtPnRzY19vZmZzZXQgPSBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC50c2Nfb2Zmc2V0KSk7CisKKyAgICBlbnYtPmdkdC5iYXNlICA9IGxkcV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdkdHIuYmFzZSkpOworICAgIGVudi0+Z2R0LmxpbWl0ID0gbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZ2R0ci5saW1pdCkpOworCisgICAgZW52LT5pZHQuYmFzZSAgPSBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5pZHRyLmJhc2UpKTsKKyAgICBlbnYtPmlkdC5saW1pdCA9IGxkbF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmlkdHIubGltaXQpKTsKKworICAgIC8qIGNsZWFyIGV4aXRfaW5mb18yIHNvIHdlIGJlaGF2ZSBsaWtlIHRoZSByZWFsIGhhcmR3YXJlICovCisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuZXhpdF9pbmZvXzIpLCAwKTsKKworICAgIGNwdV94ODZfdXBkYXRlX2NyMChlbnYsIGxkcV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmNyMCkpKTsKKyAgICBjcHVfeDg2X3VwZGF0ZV9jcjQoZW52LCBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjQpKSk7CisgICAgY3B1X3g4Nl91cGRhdGVfY3IzKGVudiwgbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3IzKSkpOworICAgIGVudi0+Y3JbMl0gPSBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjIpKTsKKyAgICBpbnRfY3RsID0gbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50X2N0bCkpOworICAgIGVudi0+aGZsYWdzMiAmPSB+KEhGMl9ISUZfTUFTSyB8IEhGMl9WSU5UUl9NQVNLKTsKKyAgICBpZiAoaW50X2N0bCAmIFZfSU5UUl9NQVNLSU5HX01BU0spIHsKKyAgICAgICAgZW52LT52X3RwciA9IGludF9jdGwgJiBWX1RQUl9NQVNLOworICAgICAgICBlbnYtPmhmbGFnczIgfD0gSEYyX1ZJTlRSX01BU0s7CisgICAgICAgIGlmIChlbnYtPmVmbGFncyAmIElGX01BU0spCisgICAgICAgICAgICBlbnYtPmhmbGFnczIgfD0gSEYyX0hJRl9NQVNLOworICAgIH0KKworICAgIGNwdV9sb2FkX2VmZXIoZW52LAorICAgICAgICAgICAgICAgICAgbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZWZlcikpKTsKKyAgICBlbnYtPmVmbGFncyA9IDA7CisgICAgY3B1X2xvYWRfZWZsYWdzKGVudiwgbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmZsYWdzKSksCisgICAgICAgICAgICAgICAgfihDQ19PIHwgQ0NfUyB8IENDX1ogfCBDQ19BIHwgQ0NfUCB8IENDX0MgfCBERl9NQVNLKSk7CisgICAgQ0NfT1AgPSBDQ19PUF9FRkxBR1M7CisKKyAgICBzdm1fbG9hZF9zZWdfY2FjaGUoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZXMpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfRVMpOworICAgIHN2bV9sb2FkX3NlZ19jYWNoZShlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcyksCisgICAgICAgICAgICAgICAgICAgICAgIGVudiwgUl9DUyk7CisgICAgc3ZtX2xvYWRfc2VnX2NhY2hlKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZW52LCBSX1NTKTsKKyAgICBzdm1fbG9hZF9zZWdfY2FjaGUoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfRFMpOworCisgICAgRUlQID0gbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmlwKSk7CisgICAgZW52LT5laXAgPSBFSVA7CisgICAgRVNQID0gbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucnNwKSk7CisgICAgRUFYID0gbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmF4KSk7CisgICAgZW52LT5kcls3XSA9IGxkcV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmRyNykpOworICAgIGVudi0+ZHJbNl0gPSBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5kcjYpKTsKKyAgICBjcHVfeDg2X3NldF9jcGwoZW52LCBsZHViX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3BsKSkpOworCisgICAgLyogRklYTUU6IGd1ZXN0IHN0YXRlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLworCisgICAgc3dpdGNoKGxkdWJfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC50bGJfY3RsKSkpIHsKKyAgICAgICAgY2FzZSBUTEJfQ09OVFJPTF9ET19OT1RISU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVExCX0NPTlRST0xfRkxVU0hfQUxMX0FTSUQ6CisgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBpcyBub3QgMTAwJSBjb3JyZWN0IGJ1dCBzaG91bGQgd29yayBmb3Igbm93ICovCisgICAgICAgICAgICB0bGJfZmx1c2goZW52LCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZW52LT5oZmxhZ3MyIHw9IEhGMl9HSUZfTUFTSzsKKworICAgIGlmIChpbnRfY3RsICYgVl9JUlFfTUFTSykgeworICAgICAgICBFTlZfR0VUX0NQVShlbnYpLT5pbnRlcnJ1cHRfcmVxdWVzdCB8PSBDUFVfSU5URVJSVVBUX1ZJUlE7CisgICAgfQorCisgICAgLyogbWF5YmUgd2UgbmVlZCB0byBpbmplY3QgYW4gZXZlbnQgKi8KKyAgICBldmVudF9pbmogPSBsZGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5ldmVudF9pbmopKTsKKyAgICBpZiAoZXZlbnRfaW5qICYgU1ZNX0VWVElOSl9WQUxJRCkgeworICAgICAgICB1aW50OF90IHZlY3RvciA9IGV2ZW50X2luaiAmIFNWTV9FVlRJTkpfVkVDX01BU0s7CisgICAgICAgIHVpbnQxNl90IHZhbGlkX2VyciA9IGV2ZW50X2luaiAmIFNWTV9FVlRJTkpfVkFMSURfRVJSOworICAgICAgICB1aW50MzJfdCBldmVudF9pbmpfZXJyID0gbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuZXZlbnRfaW5qX2VycikpOworCisgICAgICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19UQl9JTl9BU00sICJJbmplY3RpbmcoJSNoeCk6ICIsIHZhbGlkX2Vycik7CisgICAgICAgIC8qIEZJWE1FOiBuZWVkIHRvIGltcGxlbWVudCB2YWxpZF9lcnIgKi8KKyAgICAgICAgc3dpdGNoIChldmVudF9pbmogJiBTVk1fRVZUSU5KX1RZUEVfTUFTSykgeworICAgICAgICBjYXNlIFNWTV9FVlRJTkpfVFlQRV9JTlRSOgorICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gdmVjdG9yOworICAgICAgICAgICAgICAgIGVudi0+ZXJyb3JfY29kZSA9IGV2ZW50X2lual9lcnI7CisgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faXNfaW50ID0gMDsKKyAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9uZXh0X2VpcCA9IC0xOworICAgICAgICAgICAgICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19UQl9JTl9BU00sICJJTlRSIik7CisgICAgICAgICAgICAgICAgLyogWFhYOiBpcyBpdCBhbHdheXMgY29ycmVjdCA/ICovCisgICAgICAgICAgICAgICAgZG9faW50ZXJydXB0X3g4Nl9oYXJkaXJxKGVudiwgdmVjdG9yLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVk1fRVZUSU5KX1RZUEVfTk1JOgorICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUDAyX05NSTsKKyAgICAgICAgICAgICAgICBlbnYtPmVycm9yX2NvZGUgPSBldmVudF9pbmpfZXJyOworICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2lzX2ludCA9IDA7CisgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25fbmV4dF9laXAgPSBFSVA7CisgICAgICAgICAgICAgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX1RCX0lOX0FTTSwgIk5NSSIpOworICAgICAgICAgICAgICAgIGNwdV9sb29wX2V4aXQoZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVk1fRVZUSU5KX1RZUEVfRVhFUFQ6CisgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faW5kZXggPSB2ZWN0b3I7CisgICAgICAgICAgICAgICAgZW52LT5lcnJvcl9jb2RlID0gZXZlbnRfaW5qX2VycjsKKyAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9pc19pbnQgPSAwOworICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX25leHRfZWlwID0gLTE7CisgICAgICAgICAgICAgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX1RCX0lOX0FTTSwgIkVYRVBUIik7CisgICAgICAgICAgICAgICAgY3B1X2xvb3BfZXhpdChlbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNWTV9FVlRJTkpfVFlQRV9TT0ZUOgorICAgICAgICAgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gdmVjdG9yOworICAgICAgICAgICAgICAgIGVudi0+ZXJyb3JfY29kZSA9IGV2ZW50X2lual9lcnI7CisgICAgICAgICAgICAgICAgZW52LT5leGNlcHRpb25faXNfaW50ID0gMTsKKyAgICAgICAgICAgICAgICBlbnYtPmV4Y2VwdGlvbl9uZXh0X2VpcCA9IEVJUDsKKyAgICAgICAgICAgICAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfSU5fQVNNLCAiU09GVCIpOworICAgICAgICAgICAgICAgIGNwdV9sb29wX2V4aXQoZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfSU5fQVNNLCAiICUjeCAlI3hcbiIsIGVudi0+ZXhjZXB0aW9uX2luZGV4LCBlbnYtPmVycm9yX2NvZGUpOworICAgIH0KK30KKwordm9pZCBoZWxwZXJfdm1tY2FsbChDUFVYODZTdGF0ZSAqZW52KQoreworICAgIGhlbHBlcl9zdm1fY2hlY2tfaW50ZXJjZXB0X3BhcmFtKGVudiwgU1ZNX0VYSVRfVk1NQ0FMTCwgMCk7CisgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDA2X0lMTE9QKTsKK30KKwordm9pZCBoZWxwZXJfdm1sb2FkKENQVVg4NlN0YXRlICplbnYsIGludCBhZmxhZykKK3sKKyAgICB0YXJnZXRfdWxvbmcgYWRkcjsKKyAgICBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShlbnYsIFNWTV9FWElUX1ZNTE9BRCwgMCk7CisKKyAgICBpZiAoYWZsYWcgPT0gMikKKyAgICAgICAgYWRkciA9IEVBWDsKKyAgICBlbHNlCisgICAgICAgIGFkZHIgPSAodWludDMyX3QpRUFYOworCisgICAgcWVtdV9sb2dfbWFzayhDUFVfTE9HX1RCX0lOX0FTTSwgInZtbG9hZCEgIiBUQVJHRVRfRk1UX2x4ICJcbkZTOiAlMDE2IiBQUkl4NjQgIiB8ICIgVEFSR0VUX0ZNVF9seCAiXG4iLAorICAgICAgICAgICAgICAgIGFkZHIsIGxkcV9waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5mcy5iYXNlKSksCisgICAgICAgICAgICAgICAgZW52LT5zZWdzW1JfRlNdLmJhc2UpOworCisgICAgc3ZtX2xvYWRfc2VnX2NhY2hlKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5mcyksCisgICAgICAgICAgICAgICAgICAgICAgIGVudiwgUl9GUyk7CisgICAgc3ZtX2xvYWRfc2VnX2NhY2hlKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5ncyksCisgICAgICAgICAgICAgICAgICAgICAgIGVudiwgUl9HUyk7CisgICAgc3ZtX2xvYWRfc2VnKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS50ciksCisgICAgICAgICAgICAgICAgICZlbnYtPnRyKTsKKyAgICBzdm1fbG9hZF9zZWcoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmxkdHIpLAorICAgICAgICAgICAgICAgICAmZW52LT5sZHQpOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGVudi0+a2VybmVsZ3NiYXNlID0gbGRxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmtlcm5lbF9nc19iYXNlKSk7CisgICAgZW52LT5sc3RhciA9IGxkcV9waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5sc3RhcikpOworICAgIGVudi0+Y3N0YXIgPSBsZHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3N0YXIpKTsKKyAgICBlbnYtPmZtYXNrID0gbGRxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnNmbWFzaykpOworI2VuZGlmCisgICAgZW52LT5zdGFyID0gbGRxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnN0YXIpKTsKKyAgICBlbnYtPnN5c2VudGVyX2NzID0gbGRxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnN5c2VudGVyX2NzKSk7CisgICAgZW52LT5zeXNlbnRlcl9lc3AgPSBsZHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3lzZW50ZXJfZXNwKSk7CisgICAgZW52LT5zeXNlbnRlcl9laXAgPSBsZHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3lzZW50ZXJfZWlwKSk7Cit9CisKK3ZvaWQgaGVscGVyX3Ztc2F2ZShDUFVYODZTdGF0ZSAqZW52LCBpbnQgYWZsYWcpCit7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9WTVNBVkUsIDApOworCisgICAgaWYgKGFmbGFnID09IDIpCisgICAgICAgIGFkZHIgPSBFQVg7CisgICAgZWxzZQorICAgICAgICBhZGRyID0gKHVpbnQzMl90KUVBWDsKKworICAgIHFlbXVfbG9nX21hc2soQ1BVX0xPR19UQl9JTl9BU00sICJ2bXNhdmUhICIgVEFSR0VUX0ZNVF9seCAiXG5GUzogJTAxNiIgUFJJeDY0ICIgfCAiIFRBUkdFVF9GTVRfbHggIlxuIiwKKyAgICAgICAgICAgICAgICBhZGRyLCBsZHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZnMuYmFzZSkpLAorICAgICAgICAgICAgICAgIGVudi0+c2Vnc1tSX0ZTXS5iYXNlKTsKKworICAgIHN2bV9zYXZlX3NlZyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZnMpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfRlNdKTsKKyAgICBzdm1fc2F2ZV9zZWcoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdzKSwKKyAgICAgICAgICAgICAgICAgJmVudi0+c2Vnc1tSX0dTXSk7CisgICAgc3ZtX3NhdmVfc2VnKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS50ciksCisgICAgICAgICAgICAgICAgICZlbnYtPnRyKTsKKyAgICBzdm1fc2F2ZV9zZWcoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmxkdHIpLAorICAgICAgICAgICAgICAgICAmZW52LT5sZHQpOworCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIHN0cV9waHlzKGFkZHIgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5rZXJuZWxfZ3NfYmFzZSksIGVudi0+a2VybmVsZ3NiYXNlKTsKKyAgICBzdHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUubHN0YXIpLCBlbnYtPmxzdGFyKTsKKyAgICBzdHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3N0YXIpLCBlbnYtPmNzdGFyKTsKKyAgICBzdHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc2ZtYXNrKSwgZW52LT5mbWFzayk7CisjZW5kaWYKKyAgICBzdHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3RhciksIGVudi0+c3Rhcik7CisgICAgc3RxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnN5c2VudGVyX2NzKSwgZW52LT5zeXNlbnRlcl9jcyk7CisgICAgc3RxX3BoeXMoYWRkciArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnN5c2VudGVyX2VzcCksIGVudi0+c3lzZW50ZXJfZXNwKTsKKyAgICBzdHFfcGh5cyhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3lzZW50ZXJfZWlwKSwgZW52LT5zeXNlbnRlcl9laXApOworfQorCit2b2lkIGhlbHBlcl9zdGdpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9TVEdJLCAwKTsKKyAgICBlbnYtPmhmbGFnczIgfD0gSEYyX0dJRl9NQVNLOworfQorCit2b2lkIGhlbHBlcl9jbGdpKENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9DTEdJLCAwKTsKKyAgICBlbnYtPmhmbGFnczIgJj0gfkhGMl9HSUZfTUFTSzsKK30KKwordm9pZCBoZWxwZXJfc2tpbml0KENQVVg4NlN0YXRlICplbnYpCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9TS0lOSVQsIDApOworICAgIC8qIFhYWDogbm90IGltcGxlbWVudGVkICovCisgICAgcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUDA2X0lMTE9QKTsKK30KKwordm9pZCBoZWxwZXJfaW52bHBnYShDUFVYODZTdGF0ZSAqZW52LCBpbnQgYWZsYWcpCit7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCBTVk1fRVhJVF9JTlZMUEdBLCAwKTsKKworICAgIGlmIChhZmxhZyA9PSAyKQorICAgICAgICBhZGRyID0gRUFYOworICAgIGVsc2UKKyAgICAgICAgYWRkciA9ICh1aW50MzJfdClFQVg7CisKKyAgICAvKiBYWFg6IGNvdWxkIHVzZSB0aGUgQVNJRCB0byBzZWUgaWYgaXQgaXMgbmVlZGVkIHRvIGRvIHRoZQorICAgICAgIGZsdXNoICovCisgICAgdGxiX2ZsdXNoX3BhZ2UoZW52LCBhZGRyKTsKK30KKwordm9pZCBoZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShDUFVYODZTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlLCB1aW50NjRfdCBwYXJhbSkKK3sKKyAgICBpZiAobGlrZWx5KCEoZW52LT5oZmxhZ3MgJiBIRl9TVk1JX01BU0spKSkKKyAgICAgICAgcmV0dXJuOworICAgIHN3aXRjaCh0eXBlKSB7CisgICAgY2FzZSBTVk1fRVhJVF9SRUFEX0NSMCAuLi4gU1ZNX0VYSVRfUkVBRF9DUjAgKyA4OgorICAgICAgICBpZiAoZW52LT5pbnRlcmNlcHRfY3JfcmVhZCAmICgxIDw8ICh0eXBlIC0gU1ZNX0VYSVRfUkVBRF9DUjApKSkgeworICAgICAgICAgICAgaGVscGVyX3ZtZXhpdChlbnYsIHR5cGUsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNWTV9FWElUX1dSSVRFX0NSMCAuLi4gU1ZNX0VYSVRfV1JJVEVfQ1IwICsgODoKKyAgICAgICAgaWYgKGVudi0+aW50ZXJjZXB0X2NyX3dyaXRlICYgKDEgPDwgKHR5cGUgLSBTVk1fRVhJVF9XUklURV9DUjApKSkgeworICAgICAgICAgICAgaGVscGVyX3ZtZXhpdChlbnYsIHR5cGUsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNWTV9FWElUX1JFQURfRFIwIC4uLiBTVk1fRVhJVF9SRUFEX0RSMCArIDc6CisgICAgICAgIGlmIChlbnYtPmludGVyY2VwdF9kcl9yZWFkICYgKDEgPDwgKHR5cGUgLSBTVk1fRVhJVF9SRUFEX0RSMCkpKSB7CisgICAgICAgICAgICBoZWxwZXJfdm1leGl0KGVudiwgdHlwZSwgcGFyYW0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1ZNX0VYSVRfV1JJVEVfRFIwIC4uLiBTVk1fRVhJVF9XUklURV9EUjAgKyA3OgorICAgICAgICBpZiAoZW52LT5pbnRlcmNlcHRfZHJfd3JpdGUgJiAoMSA8PCAodHlwZSAtIFNWTV9FWElUX1dSSVRFX0RSMCkpKSB7CisgICAgICAgICAgICBoZWxwZXJfdm1leGl0KGVudiwgdHlwZSwgcGFyYW0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1ZNX0VYSVRfRVhDUF9CQVNFIC4uLiBTVk1fRVhJVF9FWENQX0JBU0UgKyAzMToKKyAgICAgICAgaWYgKGVudi0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgJiAoMSA8PCAodHlwZSAtIFNWTV9FWElUX0VYQ1BfQkFTRSkpKSB7CisgICAgICAgICAgICBoZWxwZXJfdm1leGl0KGVudiwgdHlwZSwgcGFyYW0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1ZNX0VYSVRfTVNSOgorICAgICAgICBpZiAoZW52LT5pbnRlcmNlcHQgJiAoMVVMTCA8PCAoU1ZNX0VYSVRfTVNSIC0gU1ZNX0VYSVRfSU5UUikpKSB7CisgICAgICAgICAgICAvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgcmVhZCBpbiBhdCB2bXJ1biAoZmFzdGVyIHRoaXMgd2F5PykgKi8KKyAgICAgICAgICAgIHVpbnQ2NF90IGFkZHIgPSBsZHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5tc3JwbV9iYXNlX3BhKSk7CisgICAgICAgICAgICB1aW50MzJfdCB0MCwgdDE7CisgICAgICAgICAgICBzd2l0Y2goKHVpbnQzMl90KUVDWCkgeworICAgICAgICAgICAgY2FzZSAwIC4uLiAweDFmZmY6CisgICAgICAgICAgICAgICAgdDAgPSAoRUNYICogMikgJSA4OworICAgICAgICAgICAgICAgIHQxID0gRUNYIC8gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhjMDAwMDAwMCAuLi4gMHhjMDAwMWZmZjoKKyAgICAgICAgICAgICAgICB0MCA9ICg4MTkyICsgRUNYIC0gMHhjMDAwMDAwMCkgKiAyOworICAgICAgICAgICAgICAgIHQxID0gKHQwIC8gOCk7CisgICAgICAgICAgICAgICAgdDAgJT0gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhjMDAxMDAwMCAuLi4gMHhjMDAxMWZmZjoKKyAgICAgICAgICAgICAgICB0MCA9ICgxNjM4NCArIEVDWCAtIDB4YzAwMTAwMDApICogMjsKKyAgICAgICAgICAgICAgICB0MSA9ICh0MCAvIDgpOworICAgICAgICAgICAgICAgIHQwICU9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGhlbHBlcl92bWV4aXQoZW52LCB0eXBlLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgdDAgPSAwOworICAgICAgICAgICAgICAgIHQxID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZHViX3BoeXMoYWRkciArIHQxKSAmICgoMSA8PCBwYXJhbSkgPDwgdDApKQorICAgICAgICAgICAgICAgIGhlbHBlcl92bWV4aXQoZW52LCB0eXBlLCBwYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGVudi0+aW50ZXJjZXB0ICYgKDFVTEwgPDwgKHR5cGUgLSBTVk1fRVhJVF9JTlRSKSkpIHsKKyAgICAgICAgICAgIGhlbHBlcl92bWV4aXQoZW52LCB0eXBlLCBwYXJhbSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHN2bV9jaGVja19pbnRlcmNlcHQoQ1BVQXJjaFN0YXRlICplbnYsIHVpbnQzMl90IHR5cGUpCit7CisgICAgaGVscGVyX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oZW52LCB0eXBlLCAwKTsKK30KKwordm9pZCBoZWxwZXJfc3ZtX2NoZWNrX2lvKENQVVg4NlN0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9ydCwgdWludDMyX3QgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmV4dF9laXBfYWRkZW5kKQoreworICAgIGlmIChlbnYtPmludGVyY2VwdCAmICgxVUxMIDw8IChTVk1fRVhJVF9JT0lPIC0gU1ZNX0VYSVRfSU5UUikpKSB7CisgICAgICAgIC8qIEZJWE1FOiB0aGlzIHNob3VsZCBiZSByZWFkIGluIGF0IHZtcnVuIChmYXN0ZXIgdGhpcyB3YXk/KSAqLworICAgICAgICB1aW50NjRfdCBhZGRyID0gbGRxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW9wbV9iYXNlX3BhKSk7CisgICAgICAgIHVpbnQxNl90IG1hc2sgPSAoMSA8PCAoKHBhcmFtID4+IDQpICYgNykpIC0gMTsKKyAgICAgICAgaWYobGR1d19waHlzKGFkZHIgKyBwb3J0IC8gOCkgJiAobWFzayA8PCAocG9ydCAmIDcpKSkgeworICAgICAgICAgICAgLyogbmV4dCBFSVAgKi8KKyAgICAgICAgICAgIHN0cV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV4aXRfaW5mb18yKSwKKyAgICAgICAgICAgICAgICAgICAgIGVudi0+ZWlwICsgbmV4dF9laXBfYWRkZW5kKTsKKyAgICAgICAgICAgIGhlbHBlcl92bWV4aXQoZW52LCBTVk1fRVhJVF9JT0lPLCBwYXJhbSB8IChwb3J0IDw8IDE2KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIE5vdGU6IGN1cnJlbnRseSBvbmx5IDMyIGJpdHMgb2YgZXhpdF9jb2RlIGFyZSB1c2VkICovCit2b2lkIGhlbHBlcl92bWV4aXQoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleGl0X2NvZGUsIHVpbnQ2NF90IGV4aXRfaW5mb18xKQoreworICAgIHVpbnQzMl90IGludF9jdGw7CisKKyAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfSU5fQVNNLCAidm1leGl0KCUwOHgsICUwMTYiIFBSSXg2NCAiLCAlMDE2IiBQUkl4NjQgIiwgIiBUQVJHRVRfRk1UX2x4ICIpIVxuIiwKKyAgICAgICAgICAgICAgICBleGl0X2NvZGUsIGV4aXRfaW5mb18xLAorICAgICAgICAgICAgICAgIGxkcV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV4aXRfaW5mb18yKSksCisgICAgICAgICAgICAgICAgRUlQKTsKKworICAgIGlmKGVudi0+aGZsYWdzICYgSEZfSU5ISUJJVF9JUlFfTUFTSykgeworICAgICAgICBzdGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5pbnRfc3RhdGUpLCBTVk1fSU5URVJSVVBUX1NIQURPV19NQVNLKTsKKyAgICAgICAgZW52LT5oZmxhZ3MgJj0gfkhGX0lOSElCSVRfSVJRX01BU0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50X3N0YXRlKSwgMCk7CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgVk0gc3RhdGUgaW4gdGhlIHZtY2IgKi8KKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZXMpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfRVNdKTsKKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3MpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfQ1NdKTsKKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3MpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfU1NdKTsKKyAgICBzdm1fc2F2ZV9zZWcoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZHMpLAorICAgICAgICAgICAgICAgICAmZW52LT5zZWdzW1JfRFNdKTsKKworICAgIHN0cV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdkdHIuYmFzZSksIGVudi0+Z2R0LmJhc2UpOworICAgIHN0bF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdkdHIubGltaXQpLCBlbnYtPmdkdC5saW1pdCk7CisKKyAgICBzdHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5pZHRyLmJhc2UpLCBlbnYtPmlkdC5iYXNlKTsKKyAgICBzdGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5pZHRyLmxpbWl0KSwgZW52LT5pZHQubGltaXQpOworCisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZWZlciksIGVudi0+ZWZlcik7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3IwKSwgZW52LT5jclswXSk7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3IyKSwgZW52LT5jclsyXSk7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3IzKSwgZW52LT5jclszXSk7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3I0KSwgZW52LT5jcls0XSk7CisKKyAgICBpbnRfY3RsID0gbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuaW50X2N0bCkpOworICAgIGludF9jdGwgJj0gfihWX1RQUl9NQVNLIHwgVl9JUlFfTUFTSyk7CisgICAgaW50X2N0bCB8PSBlbnYtPnZfdHByICYgVl9UUFJfTUFTSzsKKyAgICBpZiAoRU5WX0dFVF9DUFUoZW52KS0+aW50ZXJydXB0X3JlcXVlc3QgJiBDUFVfSU5URVJSVVBUX1ZJUlEpCisgICAgICAgIGludF9jdGwgfD0gVl9JUlFfTUFTSzsKKyAgICBzdGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5pbnRfY3RsKSwgaW50X2N0bCk7CisKKyAgICBzdHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5yZmxhZ3MpLCBjcHVfY29tcHV0ZV9lZmxhZ3MoZW52KSk7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmlwKSwgZW52LT5laXApOworICAgIHN0cV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnJzcCksIEVTUCk7CisgICAgc3RxX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmF4KSwgRUFYKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5kcjcpLCBlbnYtPmRyWzddKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5kcjYpLCBlbnYtPmRyWzZdKTsKKyAgICBzdGJfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcGwpLCBlbnYtPmhmbGFncyAmIEhGX0NQTF9NQVNLKTsKKworICAgIC8qIFJlbG9hZCB0aGUgaG9zdCBzdGF0ZSBmcm9tIHZtX2hzYXZlICovCisgICAgZW52LT5oZmxhZ3MyICY9IH4oSEYyX0hJRl9NQVNLIHwgSEYyX1ZJTlRSX01BU0spOworICAgIGVudi0+aGZsYWdzICY9IH5IRl9TVk1JX01BU0s7CisgICAgZW52LT5pbnRlcmNlcHQgPSAwOworICAgIGVudi0+aW50ZXJjZXB0X2V4Y2VwdGlvbnMgPSAwOworICAgIEVOVl9HRVRfQ1BVKGVudiktPmludGVycnVwdF9yZXF1ZXN0ICY9IH5DUFVfSU5URVJSVVBUX1ZJUlE7CisgICAgZW52LT50c2Nfb2Zmc2V0ID0gMDsKKworICAgIGVudi0+Z2R0LmJhc2UgID0gbGRxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdkdHIuYmFzZSkpOworICAgIGVudi0+Z2R0LmxpbWl0ID0gbGRsX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmdkdHIubGltaXQpKTsKKworICAgIGVudi0+aWR0LmJhc2UgID0gbGRxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmlkdHIuYmFzZSkpOworICAgIGVudi0+aWR0LmxpbWl0ID0gbGRsX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmlkdHIubGltaXQpKTsKKworICAgIGNwdV94ODZfdXBkYXRlX2NyMChlbnYsIGxkcV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjApKSB8IENSMF9QRV9NQVNLKTsKKyAgICBjcHVfeDg2X3VwZGF0ZV9jcjQoZW52LCBsZHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3I0KSkpOworICAgIGNwdV94ODZfdXBkYXRlX2NyMyhlbnYsIGxkcV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5jcjMpKSk7CisgICAgLyogd2UgbmVlZCB0byBzZXQgdGhlIGVmZXIgYWZ0ZXIgdGhlIGNycyBzbyB0aGUgaGlkZGVuIGZsYWdzIGdldAorICAgICAgIHNldCBwcm9wZXJseSAqLworICAgIGNwdV9sb2FkX2VmZXIoZW52LAorICAgICAgICAgICAgICAgICAgbGRxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmVmZXIpKSk7CisgICAgZW52LT5lZmxhZ3MgPSAwOworICAgIGNwdV9sb2FkX2VmbGFncyhlbnYsIGxkcV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5yZmxhZ3MpKSwKKyAgICAgICAgICAgICAgICB+KENDX08gfCBDQ19TIHwgQ0NfWiB8IENDX0EgfCBDQ19QIHwgQ0NfQyB8IERGX01BU0spKTsKKyAgICBDQ19PUCA9IENDX09QX0VGTEFHUzsKKworICAgIHN2bV9sb2FkX3NlZ19jYWNoZShlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZXMpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfRVMpOworICAgIHN2bV9sb2FkX3NlZ19jYWNoZShlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuY3MpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfQ1MpOworICAgIHN2bV9sb2FkX3NlZ19jYWNoZShlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuc3MpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfU1MpOworICAgIHN2bV9sb2FkX3NlZ19jYWNoZShlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZHMpLAorICAgICAgICAgICAgICAgICAgICAgICBlbnYsIFJfRFMpOworCisgICAgRUlQID0gbGRxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLnJpcCkpOworICAgIEVTUCA9IGxkcV9waHlzKGVudi0+dm1faHNhdmUgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgc2F2ZS5yc3ApKTsKKyAgICBFQVggPSBsZHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUucmF4KSk7CisKKyAgICBlbnYtPmRyWzZdID0gbGRxX3BoeXMoZW52LT52bV9oc2F2ZSArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBzYXZlLmRyNikpOworICAgIGVudi0+ZHJbN10gPSBsZHFfcGh5cyhlbnYtPnZtX2hzYXZlICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIHNhdmUuZHI3KSk7CisKKyAgICAvKiBvdGhlciBzZXR1cHMgKi8KKyAgICBjcHVfeDg2X3NldF9jcGwoZW52LCAwKTsKKyAgICBzdHFfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5leGl0X2NvZGUpLCBleGl0X2NvZGUpOworICAgIHN0cV9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV4aXRfaW5mb18xKSwgZXhpdF9pbmZvXzEpOworCisgICAgc3RsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuZXhpdF9pbnRfaW5mbyksCisgICAgICAgICAgICAgbGRsX3BoeXMoZW52LT52bV92bWNiICsgb2Zmc2V0b2Yoc3RydWN0IHZtY2IsIGNvbnRyb2wuZXZlbnRfaW5qKSkpOworICAgIHN0bF9waHlzKGVudi0+dm1fdm1jYiArIG9mZnNldG9mKHN0cnVjdCB2bWNiLCBjb250cm9sLmV4aXRfaW50X2luZm9fZXJyKSwKKyAgICAgICAgICAgICBsZGxfcGh5cyhlbnYtPnZtX3ZtY2IgKyBvZmZzZXRvZihzdHJ1Y3Qgdm1jYiwgY29udHJvbC5ldmVudF9pbmpfZXJyKSkpOworCisgICAgZW52LT5oZmxhZ3MyICY9IH5IRjJfR0lGX01BU0s7CisgICAgLyogRklYTUU6IFJlc2V0cyB0aGUgY3VycmVudCBBU0lEIHJlZ2lzdGVyIHRvIHplcm8gKGhvc3QgQVNJRCkuICovCisKKyAgICAvKiBDbGVhcnMgdGhlIFZfSVJRIGFuZCBWX0lOVFJfTUFTS0lORyBiaXRzIGluc2lkZSB0aGUgcHJvY2Vzc29yLiAqLworCisgICAgLyogQ2xlYXJzIHRoZSBUU0NfT0ZGU0VUIGluc2lkZSB0aGUgcHJvY2Vzc29yLiAqLworCisgICAgLyogSWYgdGhlIGhvc3QgaXMgaW4gUEFFIG1vZGUsIHRoZSBwcm9jZXNzb3IgcmVsb2FkcyB0aGUgaG9zdCdzIFBEUEVzCisgICAgICAgZnJvbSB0aGUgcGFnZSB0YWJsZSBpbmRpY2F0ZWQgdGhlIGhvc3QncyBDUjMuIElmIHRoZSBQRFBFcyBjb250YWluCisgICAgICAgaWxsZWdhbCBzdGF0ZSwgdGhlIHByb2Nlc3NvciBjYXVzZXMgYSBzaHV0ZG93bi4gKi8KKworICAgIC8qIEZvcmNlcyBDUjAuUEUgPSAxLCBSRkxBR1MuVk0gPSAwLiAqLworICAgIGVudi0+Y3JbMF0gfD0gQ1IwX1BFX01BU0s7CisgICAgZW52LT5lZmxhZ3MgJj0gflZNX01BU0s7CisKKyAgICAvKiBEaXNhYmxlcyBhbGwgYnJlYWtwb2ludHMgaW4gdGhlIGhvc3QgRFI3IHJlZ2lzdGVyLiAqLworCisgICAgLyogQ2hlY2tzIHRoZSByZWxvYWRlZCBob3N0IHN0YXRlIGZvciBjb25zaXN0ZW5jeS4gKi8KKworICAgIC8qIElmIHRoZSBob3N0J3MgcklQIHJlbG9hZGVkIGJ5ICNWTUVYSVQgaXMgb3V0c2lkZSB0aGUgbGltaXQgb2YgdGhlCisgICAgICAgaG9zdCdzIGNvZGUgc2VnbWVudCBvciBub24tY2Fub25pY2FsIChpbiB0aGUgY2FzZSBvZiBsb25nIG1vZGUpLCBhCisgICAgICAgI0dQIGZhdWx0IGlzIGRlbGl2ZXJlZCBpbnNpZGUgdGhlIGhvc3QuKSAqLworCisgICAgLyogcmVtb3ZlIGFueSBwZW5kaW5nIGV4Y2VwdGlvbiAqLworICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gLTE7CisgICAgZW52LT5lcnJvcl9jb2RlID0gMDsKKyAgICBlbnYtPm9sZF9leGNlcHRpb24gPSAtMTsKKworICAgIGNwdV9sb29wX2V4aXQoZW52KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1pMzg2L3RyYW5zbGF0ZS5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni90cmFuc2xhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU2Mjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtaTM4Ni90cmFuc2xhdGUuYwpAQCAtMCwwICsxLDc5ODkgQEAKKy8qCisgKiAgaTM4NiB0cmFuc2xhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorCisjaW5jbHVkZSAicWVtdS9ob3N0LXV0aWxzLmgiCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZGlzYXMvZGlzYXMuaCIKKyNpbmNsdWRlICJ0Y2ctb3AuaCIKKworI2luY2x1ZGUgImhlbHBlci5oIgorI2RlZmluZSBHRU5fSEVMUEVSIDEKKyNpbmNsdWRlICJoZWxwZXIuaCIKKyNpbmNsdWRlICJleGVjL2hheC5oIgorCisjaWZkZWYgX1dJTjMyCisjdW5kZWYgZ3JwMgorI2VuZGlmCisKKyNkZWZpbmUgUFJFRklYX1JFUFogICAweDAxCisjZGVmaW5lIFBSRUZJWF9SRVBOWiAgMHgwMgorI2RlZmluZSBQUkVGSVhfTE9DSyAgIDB4MDQKKyNkZWZpbmUgUFJFRklYX0RBVEEgICAweDA4CisjZGVmaW5lIFBSRUZJWF9BRFIgICAgMHgxMAorI2RlZmluZSBQUkVGSVhfVkVYICAgIDB4MjAKKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyNkZWZpbmUgWDg2XzY0X09OTFkoeCkgeAorI2RlZmluZSBYODZfNjRfREVGKC4uLikgIF9fVkFfQVJHU19fCisjZGVmaW5lIENPREU2NChzKSAoKHMpLT5jb2RlNjQpCisjZGVmaW5lIFJFWF9YKHMpICgocyktPnJleF94KQorI2RlZmluZSBSRVhfQihzKSAoKHMpLT5yZXhfYikKKy8qIFhYWDogZ2NjIGdlbmVyYXRlcyBwdXNoL3BvcCBpbiBzb21lIG9wY29kZXMsIHNvIHdlIGNhbm5vdCB1c2UgdGhlbSAqLworI2lmIDEKKyNkZWZpbmUgQlVHR1lfNjQoeCkgTlVMTAorI2VuZGlmCisjZWxzZQorI2RlZmluZSBYODZfNjRfT05MWSh4KSBOVUxMCisjZGVmaW5lIFg4Nl82NF9ERUYoLi4uKQorI2RlZmluZSBDT0RFNjQocykgMAorI2RlZmluZSBSRVhfWChzKSAwCisjZGVmaW5lIFJFWF9CKHMpIDAKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorIyBkZWZpbmUgY3R6dGwgIGN0ejY0CisjIGRlZmluZSBjbHp0bCAgY2x6NjQKKyNlbHNlCisjIGRlZmluZSBjdHp0bCAgY3R6MzIKKyMgZGVmaW5lIGNsenRsICBjbHozMgorI2VuZGlmCisKKy8vI2RlZmluZSBNQUNST19URVNUICAgMQorCisvKiBnbG9iYWwgcmVnaXN0ZXIgaW5kZXhlcyAqLworc3RhdGljIFRDR3ZfcHRyIGNwdV9lbnY7CitzdGF0aWMgVENHdiBjcHVfQTAsIGNwdV9jY19zcmMsIGNwdV9jY19kc3Q7CitzdGF0aWMgVENHdl9pMzIgY3B1X2NjX29wOworLyogbG9jYWwgdGVtcHMgKi8KK3N0YXRpYyBUQ0d2IGNwdV9UWzJdLCBjcHVfVDM7CisvKiBsb2NhbCByZWdpc3RlciBpbmRleGVzIChvbmx5IHVzZWQgaW5zaWRlIG9sZCBtaWNybyBvcHMpICovCitzdGF0aWMgVENHdiBjcHVfdG1wMCwgY3B1X3RtcDQ7CitzdGF0aWMgVENHdl9wdHIgY3B1X3B0cjAsIGNwdV9wdHIxOworc3RhdGljIFRDR3ZfaTMyIGNwdV90bXAyX2kzMiwgY3B1X3RtcDNfaTMyOworc3RhdGljIFRDR3ZfaTY0IGNwdV90bXAxX2k2NDsKK3N0YXRpYyBUQ0d2IGNwdV90bXA1LCBjcHVfdG1wNjsKKworc3RhdGljIHVpbnQ4X3QgZ2VuX29wY19jY19vcFtPUENfQlVGX1NJWkVdOworCisjaW5jbHVkZSAiZXhlYy9nZW4taWNvdW50LmgiCisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgaW50IHg4Nl82NF9ocmVnczsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBEaXNhc0NvbnRleHQgeworICAgIC8qIGN1cnJlbnQgaW5zbiBjb250ZXh0ICovCisgICAgaW50IG92ZXJyaWRlOyAvKiAtMSBpZiBubyBvdmVycmlkZSAqLworICAgIGludCBwcmVmaXg7CisgICAgaW50IGFmbGFnLCBkZmxhZzsKKyAgICB0YXJnZXRfdWxvbmcgcGM7IC8qIHBjID0gZWlwICsgY3NfYmFzZSAqLworICAgIGludCBpc19qbXA7IC8qIDEgPSBtZWFucyBqdW1wIChzdG9wIHRyYW5zbGF0aW9uKSwgMiBtZWFucyBDUFUKKyAgICAgICAgICAgICAgICAgICBzdGF0aWMgc3RhdGUgY2hhbmdlIChzdG9wIHRyYW5zbGF0aW9uKSAqLworICAgIC8qIGN1cnJlbnQgYmxvY2sgY29udGV4dCAqLworICAgIHRhcmdldF91bG9uZyBjc19iYXNlOyAvKiBiYXNlIG9mIENTIHNlZ21lbnQgKi8KKyAgICBpbnQgcGU7ICAgICAvKiBwcm90ZWN0ZWQgbW9kZSAqLworICAgIGludCBjb2RlMzI7IC8qIDMyIGJpdCBjb2RlIHNlZ21lbnQgKi8KKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaW50IGxtYTsgICAgLyogbG9uZyBtb2RlIGFjdGl2ZSAqLworICAgIGludCBjb2RlNjQ7IC8qIDY0IGJpdCBjb2RlIHNlZ21lbnQgKi8KKyAgICBpbnQgcmV4X3gsIHJleF9iOworI2VuZGlmCisgICAgaW50IHNzMzI7ICAgLyogMzIgYml0IHN0YWNrIHNlZ21lbnQgKi8KKyAgICBDQ09wIGNjX29wOyAgLyogY3VycmVudCBDQyBvcGVyYXRpb24gKi8KKyAgICBib29sIGNjX29wX2RpcnR5OworICAgIGludCBhZGRzZWc7IC8qIG5vbiB6ZXJvIGlmIGVpdGhlciBEUy9FUy9TUyBoYXZlIGEgbm9uIHplcm8gYmFzZSAqLworICAgIGludCBmX3N0OyAgIC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KKyAgICBpbnQgdm04NjsgICAvKiB2bTg2IG1vZGUgKi8KKyAgICBpbnQgY3BsOworICAgIGludCBpb3BsOworICAgIGludCB0ZjsgICAgIC8qIFRGIGNwdSBmbGFnICovCisgICAgaW50IHNpbmdsZXN0ZXBfZW5hYmxlZDsgLyogImhhcmR3YXJlIiBzaW5nbGUgc3RlcCBlbmFibGVkICovCisgICAgaW50IGptcF9vcHQ7IC8qIHVzZSBkaXJlY3QgYmxvY2sgY2hhaW5pbmcgZm9yIGRpcmVjdCBqdW1wcyAqLworICAgIGludCBtZW1faW5kZXg7IC8qIHNlbGVjdCBtZW1vcnkgYWNjZXNzIGZ1bmN0aW9ucyAqLworICAgIHVpbnQ2NF90IGZsYWdzOyAvKiBhbGwgZXhlY3V0aW9uIGZsYWdzICovCisgICAgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIGludCBwb3BsX2VzcF9oYWNrOyAvKiBmb3IgY29ycmVjdCBwb3BsIHdpdGggZXNwIGJhc2UgaGFuZGxpbmcgKi8KKyAgICBpbnQgcmlwX29mZnNldDsgLyogb25seSB1c2VkIGluIHg4Nl82NCwgYnV0IGxlZnQgZm9yIHNpbXBsaWNpdHkgKi8KKyAgICBpbnQgY3B1aWRfZmVhdHVyZXM7CisgICAgaW50IGNwdWlkX2V4dF9mZWF0dXJlczsKKyAgICBpbnQgY3B1aWRfZXh0Ml9mZWF0dXJlczsKKyAgICBpbnQgY3B1aWRfZXh0M19mZWF0dXJlczsKK30gRGlzYXNDb250ZXh0OworCitzdGF0aWMgdm9pZCBnZW5fZW9iKERpc2FzQ29udGV4dCAqcyk7CitzdGF0aWMgdm9pZCBnZW5fam1wKERpc2FzQ29udGV4dCAqcywgdGFyZ2V0X3Vsb25nIGVpcCk7CitzdGF0aWMgdm9pZCBnZW5fam1wX3RiKERpc2FzQ29udGV4dCAqcywgdGFyZ2V0X3Vsb25nIGVpcCwgaW50IHRiX251bSk7CisKKy8qIGkzODYgYXJpdGgvbG9naWMgb3BlcmF0aW9ucyAqLworZW51bSB7CisgICAgT1BfQURETCwKKyAgICBPUF9PUkwsCisgICAgT1BfQURDTCwKKyAgICBPUF9TQkJMLAorICAgIE9QX0FOREwsCisgICAgT1BfU1VCTCwKKyAgICBPUF9YT1JMLAorICAgIE9QX0NNUEwsCit9OworCisvKiBpMzg2IHNoaWZ0IG9wcyAqLworZW51bSB7CisgICAgT1BfUk9MLAorICAgIE9QX1JPUiwKKyAgICBPUF9SQ0wsCisgICAgT1BfUkNSLAorICAgIE9QX1NITCwKKyAgICBPUF9TSFIsCisgICAgT1BfU0hMMSwgLyogdW5kb2N1bWVudGVkICovCisgICAgT1BfU0FSID0gNywKK307CisKK2VudW0geworICAgIEpDQ19PLAorICAgIEpDQ19CLAorICAgIEpDQ19aLAorICAgIEpDQ19CRSwKKyAgICBKQ0NfUywKKyAgICBKQ0NfUCwKKyAgICBKQ0NfTCwKKyAgICBKQ0NfTEUsCit9OworCisvKiBvcGVyYW5kIHNpemUgKi8KK2VudW0geworICAgIE9UX0JZVEUgPSAwLAorICAgIE9UX1dPUkQsCisgICAgT1RfTE9ORywKKyAgICBPVF9RVUFELAorfTsKKworZW51bSB7CisgICAgLyogSTM4NiBpbnQgcmVnaXN0ZXJzICovCisgICAgT1JfRUFYLCAgIC8qIE1VU1QgYmUgZXZlbiBudW1iZXJlZCAqLworICAgIE9SX0VDWCwKKyAgICBPUl9FRFgsCisgICAgT1JfRUJYLAorICAgIE9SX0VTUCwKKyAgICBPUl9FQlAsCisgICAgT1JfRVNJLAorICAgIE9SX0VESSwKKworICAgIE9SX1RNUDAgPSAxNiwgICAgLyogdGVtcG9yYXJ5IG9wZXJhbmQgcmVnaXN0ZXIgKi8KKyAgICBPUl9UTVAxLAorICAgIE9SX0EwLCAvKiB0ZW1wb3JhcnkgcmVnaXN0ZXIgdXNlZCB3aGVuIGRvaW5nIGFkZHJlc3MgZXZhbHVhdGlvbiAqLworfTsKKworZW51bSB7CisgICAgVVNFU19DQ19EU1QgPSAxLAorICAgIFVTRVNfQ0NfU1JDID0gMiwKK307CisKKy8qIEJpdCBzZXQgaWYgdGhlIGdsb2JhbCB2YXJpYWJsZSBpcyBsaXZlIGFmdGVyIHNldHRpbmcgQ0NfT1AgdG8gWC4gICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjY19vcF9saXZlW0NDX09QX05CXSA9IHsKKyAgICBbQ0NfT1BfRFlOQU1JQ10gPSBVU0VTX0NDX0RTVCB8IFVTRVNfQ0NfU1JDLAorICAgIFtDQ19PUF9FRkxBR1NdID0gVVNFU19DQ19TUkMsCisgICAgW0NDX09QX01VTEIgLi4uIENDX09QX01VTFFdID0gVVNFU19DQ19EU1QgfCBVU0VTX0NDX1NSQywKKyAgICBbQ0NfT1BfQUREQiAuLi4gQ0NfT1BfQUREUV0gPSBVU0VTX0NDX0RTVCB8IFVTRVNfQ0NfU1JDLAorICAgIFtDQ19PUF9BRENCIC4uLiBDQ19PUF9BRENRXSA9IFVTRVNfQ0NfRFNUIHwgVVNFU19DQ19TUkMsCisgICAgW0NDX09QX1NVQkIgLi4uIENDX09QX1NVQlFdID0gVVNFU19DQ19EU1QgfCBVU0VTX0NDX1NSQywKKyAgICBbQ0NfT1BfU0JCQiAuLi4gQ0NfT1BfU0JCUV0gPSBVU0VTX0NDX0RTVCB8IFVTRVNfQ0NfU1JDLAorICAgIFtDQ19PUF9MT0dJQ0IgLi4uIENDX09QX0xPR0lDUV0gPSBVU0VTX0NDX0RTVCwKKyAgICBbQ0NfT1BfSU5DQiAuLi4gQ0NfT1BfSU5DUV0gPSBVU0VTX0NDX0RTVCB8IFVTRVNfQ0NfU1JDLAorICAgIFtDQ19PUF9ERUNCIC4uLiBDQ19PUF9ERUNRXSA9IFVTRVNfQ0NfRFNUIHwgVVNFU19DQ19TUkMsCisgICAgW0NDX09QX1NITEIgLi4uIENDX09QX1NITFFdID0gVVNFU19DQ19EU1QgfCBVU0VTX0NDX1NSQywKKyAgICBbQ0NfT1BfU0FSQiAuLi4gQ0NfT1BfU0FSUV0gPSBVU0VTX0NDX0RTVCB8IFVTRVNfQ0NfU1JDLAorfTsKKworc3RhdGljIHZvaWQgc2V0X2NjX29wKERpc2FzQ29udGV4dCAqcywgQ0NPcCBvcCkKK3sKKyAgICBpbnQgZGVhZDsKKworICAgIGlmIChzLT5jY19vcCA9PSBvcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogRGlzY2FyZCBDQyBjb21wdXRhdGlvbiB0aGF0IHdpbGwgbm8gbG9uZ2VyIGJlIHVzZWQuICAqLworICAgIGRlYWQgPSBjY19vcF9saXZlW3MtPmNjX29wXSAmIH5jY19vcF9saXZlW29wXTsKKyAgICBpZiAoZGVhZCAmIFVTRVNfQ0NfRFNUKSB7CisgICAgICAgIHRjZ19nZW5fZGlzY2FyZF90bChjcHVfY2NfZHN0KTsKKyAgICB9CisgICAgaWYgKGRlYWQgJiBVU0VTX0NDX1NSQykgeworICAgICAgICB0Y2dfZ2VuX2Rpc2NhcmRfdGwoY3B1X2NjX3NyYyk7CisgICAgfQorCisgICAgcy0+Y2Nfb3AgPSBvcDsKKyAgICAvKiBUaGUgRFlOQU1JQyBzZXR0aW5nIGlzIHRyYW5zbGF0b3Igb25seSwgYW5kIHNob3VsZCBuZXZlciBiZQorICAgICAgIHN0b3JlZC4gIFRodXMgd2UgYWx3YXlzIGNvbnNpZGVyIGl0IGNsZWFuLiAgKi8KKyAgICBzLT5jY19vcF9kaXJ0eSA9IChvcCAhPSBDQ19PUF9EWU5BTUlDKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX3VwZGF0ZV9jY19vcChEaXNhc0NvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmNjX29wX2RpcnR5KSB7CisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X2NjX29wLCBzLT5jY19vcCk7CisgICAgICAgIHMtPmNjX29wX2RpcnR5ID0gZmFsc2U7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdmxfVDBfMCh2b2lkKQoreworICAgIHRjZ19nZW5fbW92aV90bChjcHVfVFswXSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92bF9UMF9pbShpbnQzMl90IHZhbCkKK3sKKyAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X1RbMF0sIHZhbCk7Cit9CisKKyNpZiAwCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdmxfVDBfaW11KHVpbnQzMl90IHZhbCkKK3sKKyAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X1RbMF0sIHZhbCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZsX1QxX2ltKGludDMyX3QgdmFsKQoreworICAgIHRjZ19nZW5fbW92aV90bChjcHVfVFsxXSwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZsX1QxX2ltdSh1aW50MzJfdCB2YWwpCit7CisgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9UWzFdLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdmxfQTBfaW0odWludDMyX3QgdmFsKQoreworICAgIHRjZ19nZW5fbW92aV90bChjcHVfQTAsIHZhbCk7Cit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdnFfQTBfaW0oaW50NjRfdCB2YWwpCit7CisgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9BMCwgdmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX21vdnRsX1QwX2ltKHRhcmdldF91bG9uZyB2YWwpCit7CisgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9UWzBdLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX21vdnRsX1QxX2ltKHRhcmdldF91bG9uZyB2YWwpCit7CisgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9UWzFdLCB2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2FuZGxfVDBfZmZmZih2b2lkKQoreworICAgIHRjZ19nZW5fYW5kaV90bChjcHVfVFswXSwgY3B1X1RbMF0sIDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYW5kbF9UMF9pbSh1aW50MzJfdCB2YWwpCit7CisgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZsX1QwX1QxKHZvaWQpCit7CisgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X1RbMF0sIGNwdV9UWzFdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9hbmRsX0EwX2ZmZmYodm9pZCkKK3sKKyAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X0EwLCBjcHVfQTAsIDB4ZmZmZik7Cit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisKKyNkZWZpbmUgTkJfT1BfU0laRVMgNAorCisjZWxzZSAvKiAhVEFSR0VUX1g4Nl82NCAqLworCisjZGVmaW5lIE5CX09QX1NJWkVTIDMKKworI2VuZGlmIC8qICFUQVJHRVRfWDg2XzY0ICovCisKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyNkZWZpbmUgUkVHX0JfT0ZGU0VUIChzaXplb2YodGFyZ2V0X3Vsb25nKSAtIDEpCisjZGVmaW5lIFJFR19IX09GRlNFVCAoc2l6ZW9mKHRhcmdldF91bG9uZykgLSAyKQorI2RlZmluZSBSRUdfV19PRkZTRVQgKHNpemVvZih0YXJnZXRfdWxvbmcpIC0gMikKKyNkZWZpbmUgUkVHX0xfT0ZGU0VUIChzaXplb2YodGFyZ2V0X3Vsb25nKSAtIDQpCisjZGVmaW5lIFJFR19MSF9PRkZTRVQgKHNpemVvZih0YXJnZXRfdWxvbmcpIC0gOCkKKyNlbHNlCisjZGVmaW5lIFJFR19CX09GRlNFVCAwCisjZGVmaW5lIFJFR19IX09GRlNFVCAxCisjZGVmaW5lIFJFR19XX09GRlNFVCAwCisjZGVmaW5lIFJFR19MX09GRlNFVCAwCisjZGVmaW5lIFJFR19MSF9PRkZTRVQgNAorI2VuZGlmCisKKy8qIEluIGluc3RydWN0aW9uIGVuY29kaW5ncyBmb3IgYnl0ZSByZWdpc3RlciBhY2Nlc3NlcyB0aGUKKyAqIHJlZ2lzdGVyIG51bWJlciB1c3VhbGx5IGluZGljYXRlcyAibG93IDggYml0cyBvZiByZWdpc3RlciBOIjsKKyAqIGhvd2V2ZXIgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBjYXNlcyB3aGVyZSBOIDQuLjcgaW5kaWNhdGVzCisgKiBbQUgsIENILCBESCwgQkhdLCBpZSAiYml0cyAxNS4uOCBvZiByZWdpc3RlciBOLTQiLiBSZXR1cm4KKyAqIHRydWUgZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBieXRlX3JlZ19pc194SChpbnQgcmVnKQoreworICAgIGlmIChyZWcgPCA0KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChyZWcgPj0gOCB8fCB4ODZfNjRfaHJlZ3MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdl9yZWdfdihpbnQgb3QsIGludCByZWcsIFRDR3YgdDApCit7CisgICAgc3dpdGNoKG90KSB7CisgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICBpZiAoIWJ5dGVfcmVnX2lzX3hIKHJlZykpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fc3Q4X3RsKHQwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSArIFJFR19CX09GRlNFVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX3N0OF90bCh0MCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnIC0gNF0pICsgUkVHX0hfT0ZGU0VUKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9UX1dPUkQ6CisgICAgICAgIHRjZ19nZW5fc3QxNl90bCh0MCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkgKyBSRUdfV19PRkZTRVQpOworICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwodDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pICsgUkVHX0xfT0ZGU0VUKTsKKyAgICAgICAgLyogaGlnaCBwYXJ0IG9mIHJlZ2lzdGVyIHNldCB0byB6ZXJvICovCisgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfdG1wMCwgMCk7CisgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkgKyBSRUdfTEhfT0ZGU0VUKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIE9UX1FVQUQ6CisgICAgICAgIHRjZ19nZW5fc3RfdGwodDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pKTsKKyAgICAgICAgYnJlYWs7CisjZWxzZQorICAgIGRlZmF1bHQ6CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwodDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pICsgUkVHX0xfT0ZGU0VUKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92X3JlZ19UMChpbnQgb3QsIGludCByZWcpCit7CisgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFswXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92X3JlZ19UMShpbnQgb3QsIGludCByZWcpCit7CisgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgcmVnLCBjcHVfVFsxXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92X3JlZ19BMChpbnQgc2l6ZSwgaW50IHJlZykKK3sKKyAgICBzd2l0Y2goc2l6ZSkgeworICAgIGNhc2UgT1RfQllURToKKyAgICAgICAgdGNnX2dlbl9zdDE2X3RsKGNwdV9BMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkgKyBSRUdfV19PRkZTRVQpOworICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwoY3B1X0EwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSArIFJFR19MX09GRlNFVCk7CisgICAgICAgIC8qIGhpZ2ggcGFydCBvZiByZWdpc3RlciBzZXQgdG8gemVybyAqLworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X3RtcDAsIDApOworICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwoY3B1X3RtcDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pICsgUkVHX0xIX09GRlNFVCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICB0Y2dfZ2VuX3N0X3RsKGNwdV9BMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICBicmVhazsKKyNlbHNlCisgICAgZGVmYXVsdDoKKyAgICBjYXNlIE9UX1dPUkQ6CisgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfQTAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pICsgUkVHX0xfT0ZGU0VUKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92X3ZfcmVnKGludCBvdCwgVENHdiB0MCwgaW50IHJlZykKK3sKKyAgICBpZiAob3QgPT0gT1RfQllURSAmJiBieXRlX3JlZ19pc194SChyZWcpKSB7CisgICAgICAgIHRjZ19nZW5fbGQ4dV90bCh0MCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnIC0gNF0pICsgUkVHX0hfT0ZGU0VUKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX2xkX3RsKHQwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdl9UTl9yZWcoaW50IG90LCBpbnQgdF9pbmRleCwgaW50IHJlZykKK3sKKyAgICBnZW5fb3BfbW92X3ZfcmVnKG90LCBjcHVfVFt0X2luZGV4XSwgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZsX0EwX3JlZyhpbnQgcmVnKQoreworICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X0EwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSArIFJFR19MX09GRlNFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkbF9BMF9pbShpbnQzMl90IHZhbCkKK3sKKyAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X0EwLCBjcHVfQTAsIHZhbCk7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIHRjZ19nZW5fYW5kaV90bChjcHVfQTAsIGNwdV9BMCwgMHhmZmZmZmZmZik7CisjZW5kaWYKK30KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkcV9BMF9pbShpbnQ2NF90IHZhbCkKK3sKKyAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X0EwLCBjcHVfQTAsIHZhbCk7Cit9CisjZW5kaWYKKyAgICAKK3N0YXRpYyB2b2lkIGdlbl9hZGRfQTBfaW0oRGlzYXNDb250ZXh0ICpzLCBpbnQgdmFsKQoreworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICBnZW5fb3BfYWRkcV9BMF9pbSh2YWwpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBnZW5fb3BfYWRkbF9BMF9pbSh2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2FkZGxfVDBfVDEodm9pZCkKK3sKKyAgICB0Y2dfZ2VuX2FkZF90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9qbXBfVDAodm9pZCkKK3sKKyAgICB0Y2dfZ2VuX3N0X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZWlwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkX3JlZ19pbShpbnQgc2l6ZSwgaW50IHJlZywgaW50MzJfdCB2YWwpCit7CisgICAgc3dpdGNoKHNpemUpIHsKKyAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgIHRjZ19nZW5fbGRfdGwoY3B1X3RtcDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX3RsKGNwdV90bXAwLCBjcHVfdG1wMCwgdmFsKTsKKyAgICAgICAgdGNnX2dlbl9zdDE2X3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSArIFJFR19XX09GRlNFVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X3RtcDAsIGNwdV90bXAwLCB2YWwpOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV90bXAwLCBjcHVfdG1wMCwgMHhmZmZmZmZmZik7CisjZW5kaWYKKyAgICAgICAgdGNnX2dlbl9zdF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICB0Y2dfZ2VuX2xkX3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSk7CisgICAgICAgIHRjZ19nZW5fYWRkaV90bChjcHVfdG1wMCwgY3B1X3RtcDAsIHZhbCk7CisgICAgICAgIHRjZ19nZW5fc3RfdGwoY3B1X3RtcDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkX3JlZ19UMChpbnQgc2l6ZSwgaW50IHJlZykKK3sKKyAgICBzd2l0Y2goc2l6ZSkgeworICAgIGNhc2UgT1RfQllURToKKyAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICB0Y2dfZ2VuX2FkZF90bChjcHVfdG1wMCwgY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyAgICAgICAgdGNnX2dlbl9zdDE2X3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSArIFJFR19XX09GRlNFVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICB0Y2dfZ2VuX2FkZF90bChjcHVfdG1wMCwgY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfdG1wMCwgY3B1X3RtcDAsIDB4ZmZmZmZmZmYpOworI2VuZGlmCisgICAgICAgIHRjZ19nZW5fc3RfdGwoY3B1X3RtcDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pKTsKKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNhc2UgT1RfTE9ORzoKKyAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICB0Y2dfZ2VuX2FkZF90bChjcHVfdG1wMCwgY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyAgICAgICAgdGNnX2dlbl9zdF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9hZGRsX0EwX3JlZ19zTihpbnQgc2hpZnQsIGludCByZWcpCit7CisgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkpOworICAgIGlmIChzaGlmdCAhPSAwKQorICAgICAgICB0Y2dfZ2VuX3NobGlfdGwoY3B1X3RtcDAsIGNwdV90bXAwLCBzaGlmdCk7CisgICAgdGNnX2dlbl9hZGRfdGwoY3B1X0EwLCBjcHVfQTAsIGNwdV90bXAwKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9BMCwgY3B1X0EwLCAweGZmZmZmZmZmKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdmxfQTBfc2VnKGludCByZWcpCit7CisgICAgdGNnX2dlbl9sZDMydV90bChjcHVfQTAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBzZWdzW3JlZ10uYmFzZSkgKyBSRUdfTF9PRkZTRVQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2FkZGxfQTBfc2VnKERpc2FzQ29udGV4dCAqcywgaW50IHJlZykKK3sKKyAgICB0Y2dfZ2VuX2xkX3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgc2Vnc1tyZWddLmJhc2UpKTsKKyAgICB0Y2dfZ2VuX2FkZF90bChjcHVfQTAsIGNwdV9BMCwgY3B1X3RtcDApOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X0EwLCBjcHVfQTAsIDB4ZmZmZmZmZmYpOworI2VuZGlmCit9CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdnFfQTBfc2VnKGludCByZWcpCit7CisgICAgdGNnX2dlbl9sZF90bChjcHVfQTAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBzZWdzW3JlZ10uYmFzZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2FkZHFfQTBfc2VnKGludCByZWcpCit7CisgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHNlZ3NbcmVnXS5iYXNlKSk7CisgICAgdGNnX2dlbl9hZGRfdGwoY3B1X0EwLCBjcHVfQTAsIGNwdV90bXAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZxX0EwX3JlZyhpbnQgcmVnKQoreworICAgIHRjZ19nZW5fbGRfdGwoY3B1X0EwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tyZWddKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkcV9BMF9yZWdfc04oaW50IHNoaWZ0LCBpbnQgcmVnKQoreworICAgIHRjZ19nZW5fbGRfdGwoY3B1X3RtcDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pKTsKKyAgICBpZiAoc2hpZnQgIT0gMCkKKyAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV90bXAwLCBjcHVfdG1wMCwgc2hpZnQpOworICAgIHRjZ19nZW5fYWRkX3RsKGNwdV9BMCwgY3B1X0EwLCBjcHVfdG1wMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9sZHNfVDBfQTAoaW50IGlkeCkKK3sKKyAgICBpbnQgbWVtX2luZGV4ID0gKGlkeCA+PiAyKSAtIDE7CisgICAgc3dpdGNoKGlkeCAmIDMpIHsKKyAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDhzKGNwdV9UWzBdLCBjcHVfQTAsIG1lbV9pbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgdGNnX2dlbl9xZW11X2xkMTZzKGNwdV9UWzBdLCBjcHVfQTAsIG1lbV9pbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQzMnMoY3B1X1RbMF0sIGNwdV9BMCwgbWVtX2luZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2xkX3YoaW50IGlkeCwgVENHdiB0MCwgVENHdiBhMCkKK3sKKyAgICBpbnQgbWVtX2luZGV4ID0gKGlkeCA+PiAyKSAtIDE7CisgICAgc3dpdGNoKGlkeCAmIDMpIHsKKyAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDh1KHQwLCBhMCwgbWVtX2luZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQxNnUodDAsIGEwLCBtZW1faW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDMydSh0MCwgYTAsIG1lbV9pbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBPVF9RVUFEOgorICAgICAgICAvKiBTaG91bGQgbmV2ZXIgaGFwcGVuIG9uIDMyLWJpdCB0YXJnZXRzLiAgKi8KKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KHQwLCBhMCwgbWVtX2luZGV4KTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIFhYWDogYWx3YXlzIHVzZSBsZHUgb3IgbGRzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2xkX1QwX0EwKGludCBpZHgpCit7CisgICAgZ2VuX29wX2xkX3YoaWR4LCBjcHVfVFswXSwgY3B1X0EwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9sZHVfVDBfQTAoaW50IGlkeCkKK3sKKyAgICBnZW5fb3BfbGRfdihpZHgsIGNwdV9UWzBdLCBjcHVfQTApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2xkX1QxX0EwKGludCBpZHgpCit7CisgICAgZ2VuX29wX2xkX3YoaWR4LCBjcHVfVFsxXSwgY3B1X0EwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9zdF92KGludCBpZHgsIFRDR3YgdDAsIFRDR3YgYTApCit7CisgICAgaW50IG1lbV9pbmRleCA9IChpZHggPj4gMikgLSAxOworICAgIHN3aXRjaChpZHggJiAzKSB7CisgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfc3Q4KHQwLCBhMCwgbWVtX2luZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfc3QxNih0MCwgYTAsIG1lbV9pbmRleCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1RfTE9ORzoKKyAgICAgICAgdGNnX2dlbl9xZW11X3N0MzIodDAsIGEwLCBtZW1faW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT1RfUVVBRDoKKyAgICAgICAgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiBvbiAzMi1iaXQgdGFyZ2V0cy4gICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICB0Y2dfZ2VuX3FlbXVfc3Q2NCh0MCwgYTAsIG1lbV9pbmRleCk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX3N0X1QwX0EwKGludCBpZHgpCit7CisgICAgZ2VuX29wX3N0X3YoaWR4LCBjcHVfVFswXSwgY3B1X0EwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9zdF9UMV9BMChpbnQgaWR4KQoreworICAgIGdlbl9vcF9zdF92KGlkeCwgY3B1X1RbMV0sIGNwdV9BMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fam1wX2ltKHRhcmdldF91bG9uZyBwYykKK3sKKyAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X3RtcDAsIHBjKTsKKyAgICB0Y2dfZ2VuX3N0X3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZWlwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3RyaW5nX21vdmxfQTBfRVNJKERpc2FzQ29udGV4dCAqcykKK3sKKyAgICBpbnQgb3ZlcnJpZGU7CisKKyAgICBvdmVycmlkZSA9IHMtPm92ZXJyaWRlOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAocy0+YWZsYWcgPT0gMikgeworICAgICAgICBpZiAob3ZlcnJpZGUgPj0gMCkgeworICAgICAgICAgICAgZ2VuX29wX21vdnFfQTBfc2VnKG92ZXJyaWRlKTsKKyAgICAgICAgICAgIGdlbl9vcF9hZGRxX0EwX3JlZ19zTigwLCBSX0VTSSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfbW92cV9BMF9yZWcoUl9FU0kpOworICAgICAgICB9CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAocy0+YWZsYWcpIHsKKyAgICAgICAgLyogMzIgYml0IGFkZHJlc3MgKi8KKyAgICAgICAgaWYgKHMtPmFkZHNlZyAmJiBvdmVycmlkZSA8IDApCisgICAgICAgICAgICBvdmVycmlkZSA9IFJfRFM7CisgICAgICAgIGlmIChvdmVycmlkZSA+PSAwKSB7CisgICAgICAgICAgICBnZW5fb3BfbW92bF9BMF9zZWcob3ZlcnJpZGUpOworICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfcmVnX3NOKDAsIFJfRVNJKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VTSSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiAxNiBhZGRyZXNzLCBhbHdheXMgb3ZlcnJpZGUgKi8KKyAgICAgICAgaWYgKG92ZXJyaWRlIDwgMCkKKyAgICAgICAgICAgIG92ZXJyaWRlID0gUl9EUzsKKyAgICAgICAgZ2VuX29wX21vdmxfQTBfcmVnKFJfRVNJKTsKKyAgICAgICAgZ2VuX29wX2FuZGxfQTBfZmZmZigpOworICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgb3ZlcnJpZGUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9zdHJpbmdfbW92bF9BMF9FREkoRGlzYXNDb250ZXh0ICpzKQoreworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAocy0+YWZsYWcgPT0gMikgeworICAgICAgICBnZW5fb3BfbW92cV9BMF9yZWcoUl9FREkpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKHMtPmFmbGFnKSB7CisgICAgICAgIGlmIChzLT5hZGRzZWcpIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3NlZyhSX0VTKTsKKyAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX3JlZ19zTigwLCBSX0VESSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FREkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX29wX21vdmxfQTBfcmVnKFJfRURJKTsKKyAgICAgICAgZ2VuX29wX2FuZGxfQTBfZmZmZigpOworICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgUl9FUyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdmxfVDBfRHNoaWZ0KGludCBvdCkgCit7CisgICAgdGNnX2dlbl9sZDMyc190bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGRmKSk7CisgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgb3QpOworfTsKKworc3RhdGljIFRDR3YgZ2VuX2V4dF90bChUQ0d2IGRzdCwgVENHdiBzcmMsIGludCBzaXplLCBib29sIHNpZ24pCit7CisgICAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgICAgdGNnX2dlbl9leHQ4c190bChkc3QsIHNyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDh1X3RsKGRzdCwgc3JjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHN0OworICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZzX3RsKGRzdCwgc3JjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZ1X3RsKGRzdCwgc3JjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZHN0OworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChkc3QsIHNyYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bChkc3QsIHNyYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRzdDsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBzcmM7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fZXh0dShpbnQgb3QsIFRDR3YgcmVnKQoreworICAgIGdlbl9leHRfdGwocmVnLCByZWcsIG90LCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9leHRzKGludCBvdCwgVENHdiByZWcpCit7CisgICAgZ2VuX2V4dF90bChyZWcsIHJlZywgb3QsIHRydWUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2puel9lY3goaW50IHNpemUsIGludCBsYWJlbDEpCit7CisgICAgdGNnX2dlbl9sZF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbUl9FQ1hdKSk7CisgICAgZ2VuX2V4dHUoc2l6ZSArIDEsIGNwdV90bXAwKTsKKyAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIGNwdV90bXAwLCAwLCBsYWJlbDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2p6X2VjeChpbnQgc2l6ZSwgaW50IGxhYmVsMSkKK3sKKyAgICB0Y2dfZ2VuX2xkX3RsKGNwdV90bXAwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tSX0VDWF0pKTsKKyAgICBnZW5fZXh0dShzaXplICsgMSwgY3B1X3RtcDApOworICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgY3B1X3RtcDAsIDAsIGxhYmVsMSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9oZWxwZXJfaW5fZnVuYyhpbnQgb3QsIFRDR3YgdiwgVENHdl9pMzIgbikKK3sKKyAgICBzd2l0Y2ggKG90KSB7CisgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICBnZW5faGVscGVyX2luYih2LCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICBnZW5faGVscGVyX2ludyh2LCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVF9MT05HOgorICAgICAgICBnZW5faGVscGVyX2lubCh2LCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5faGVscGVyX291dF9mdW5jKGludCBvdCwgVENHdl9pMzIgdiwgVENHdl9pMzIgbikKK3sKKyAgICBzd2l0Y2ggKG90KSB7CisgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICBnZW5faGVscGVyX291dGIodiwgbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgZ2VuX2hlbHBlcl9vdXR3KHYsIG4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgIGdlbl9oZWxwZXJfb3V0bCh2LCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fY2hlY2tfaW8oRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QsIHRhcmdldF91bG9uZyBjdXJfZWlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN2bV9mbGFncykKK3sKKyAgICBpbnQgc3RhdGVfc2F2ZWQ7CisgICAgdGFyZ2V0X3Vsb25nIG5leHRfZWlwOworCisgICAgc3RhdGVfc2F2ZWQgPSAwOworICAgIGlmIChzLT5wZSAmJiAocy0+Y3BsID4gcy0+aW9wbCB8fCBzLT52bTg2KSkgeworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5fam1wX2ltKGN1cl9laXApOworICAgICAgICBzdGF0ZV9zYXZlZCA9IDE7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICBzd2l0Y2ggKG90KSB7CisgICAgICAgIGNhc2UgT1RfQllURToKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY2hlY2tfaW9iKGNwdV9lbnYsIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9jaGVja19pb3coY3B1X2VudiwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgICAgICBnZW5faGVscGVyX2NoZWNrX2lvbChjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYocy0+ZmxhZ3MgJiBIRl9TVk1JX01BU0spIHsKKyAgICAgICAgaWYgKCFzdGF0ZV9zYXZlZCkgeworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0oY3VyX2VpcCk7CisgICAgICAgICAgICBzdGF0ZV9zYXZlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgc3ZtX2ZsYWdzIHw9ICgxIDw8ICg0ICsgb3QpKTsKKyAgICAgICAgbmV4dF9laXAgPSBzLT5wYyAtIHMtPmNzX2Jhc2U7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICBnZW5faGVscGVyX3N2bV9jaGVja19pbyhjcHVfZW52LCBjcHVfdG1wMl9pMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIoc3ZtX2ZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihuZXh0X2VpcCAtIGN1cl9laXApKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbW92cyhEaXNhc0NvbnRleHQgKnMsIGludCBvdCkKK3sKKyAgICBnZW5fc3RyaW5nX21vdmxfQTBfRVNJKHMpOworICAgIGdlbl9vcF9sZF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgZ2VuX3N0cmluZ19tb3ZsX0EwX0VESShzKTsKKyAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGdlbl9vcF9tb3ZsX1QwX0RzaGlmdChvdCk7CisgICAgZ2VuX29wX2FkZF9yZWdfVDAocy0+YWZsYWcsIFJfRVNJKTsKKyAgICBnZW5fb3BfYWRkX3JlZ19UMChzLT5hZmxhZywgUl9FREkpOworfQorCitzdGF0aWMgdm9pZCBnZW5fb3BfdXBkYXRlMV9jYyh2b2lkKQoreworICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19kc3QsIGNwdV9UWzBdKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX29wX3VwZGF0ZTJfY2Modm9pZCkKK3sKKyAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2Nfc3JjLCBjcHVfVFsxXSk7CisgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgY3B1X1RbMF0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX2NtcGxfVDBfVDFfY2Modm9pZCkKK3sKKyAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2Nfc3JjLCBjcHVfVFsxXSk7CisgICAgdGNnX2dlbl9zdWJfdGwoY3B1X2NjX2RzdCwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF90ZXN0bF9UMF9UMV9jYyh2b2lkKQoreworICAgIHRjZ19nZW5fYW5kX3RsKGNwdV9jY19kc3QsIGNwdV9UWzBdLCBjcHVfVFsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9vcF91cGRhdGVfbmVnX2NjKHZvaWQpCit7CisgICAgdGNnX2dlbl9uZWdfdGwoY3B1X2NjX3NyYywgY3B1X1RbMF0pOworICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19kc3QsIGNwdV9UWzBdKTsKK30KKworLyogY29tcHV0ZSBhbGwgZWZsYWdzIHRvIGNjX3NyYyAqLworc3RhdGljIHZvaWQgZ2VuX2NvbXB1dGVfZWZsYWdzKERpc2FzQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+Y2Nfb3AgPT0gQ0NfT1BfRUZMQUdTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICBnZW5faGVscGVyX2NjX2NvbXB1dGVfYWxsKGNwdV90bXAyX2kzMiwgY3B1X2VudiwgY3B1X2NjX29wKTsKKyAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9jY19zcmMsIGNwdV90bXAyX2kzMik7Cit9CisKKy8qIGNvbXB1dGUgZWZsYWdzLkMgdG8gcmVnICovCitzdGF0aWMgdm9pZCBnZW5fY29tcHV0ZV9lZmxhZ3NfYyhEaXNhc0NvbnRleHQgKnMsIFRDR3YgcmVnLCBib29sIGludikKK3sKKyAgICBUQ0d2IHQwLCB0MTsKKyAgICBpbnQgc2l6ZTsKKworICAgIHN3aXRjaCAocy0+Y2Nfb3ApIHsKKyAgICBjYXNlIENDX09QX1NVQkIgLi4uIENDX09QX1NVQlE6CisgICAgICAgIC8qIChEQVRBX1RZUEUpKENDX0RTVCArIENDX1NSQykgPCAoREFUQV9UWVBFKUNDX1NSQyAqLworICAgICAgICBzaXplID0gcy0+Y2Nfb3AgLSBDQ19PUF9TVUJCOworICAgICAgICB0MSA9IGdlbl9leHRfdGwoY3B1X3RtcDAsIGNwdV9jY19zcmMsIHNpemUsIGZhbHNlKTsKKyAgICAgICAgLyogSWYgbm8gdGVtcG9yYXJ5IHdhcyB1c2VkLCBiZSBjYXJlZnVsIG5vdCB0byBhbGlhcyB0MSBhbmQgdDAuICAqLworICAgICAgICB0MCA9IFRDR1ZfRVFVQUwodDEsIGNwdV9jY19zcmMpID8gY3B1X3RtcDAgOiByZWc7CisgICAgICAgIHRjZ19nZW5fYWRkX3RsKHQwLCBjcHVfY2NfZHN0LCBjcHVfY2Nfc3JjKTsKKyAgICAgICAgZ2VuX2V4dHUoc2l6ZSwgdDApOworICAgICAgICBnb3RvIGFkZF9zdWI7CisKKyAgICBjYXNlIENDX09QX0FEREIgLi4uIENDX09QX0FERFE6CisgICAgICAgIC8qIChEQVRBX1RZUEUpQ0NfRFNUIDwgKERBVEFfVFlQRSlDQ19TUkMgKi8KKyAgICAgICAgc2l6ZSA9IHMtPmNjX29wIC0gQ0NfT1BfQUREQjsKKyAgICAgICAgdDEgPSBnZW5fZXh0X3RsKGNwdV90bXAwLCBjcHVfY2Nfc3JjLCBzaXplLCBmYWxzZSk7CisgICAgICAgIHQwID0gZ2VuX2V4dF90bChyZWcsIGNwdV9jY19kc3QsIHNpemUsIGZhbHNlKTsKKyAgICBhZGRfc3ViOgorICAgICAgICB0Y2dfZ2VuX3NldGNvbmRfdGwoaW52ID8gVENHX0NPTkRfR0VVIDogVENHX0NPTkRfTFRVLCByZWcsIHQwLCB0MSk7CisgICAgICAgIGludiA9IGZhbHNlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ0NfT1BfU0JCQiAuLi4gQ0NfT1BfU0JCUToKKyAgICAgICAgLyogKERBVEFfVFlQRSkoQ0NfRFNUICsgQ0NfU1JDICsgMSkgPD0gKERBVEFfVFlQRSlDQ19TUkMgKi8KKyAgICAgICAgc2l6ZSA9IHMtPmNjX29wIC0gQ0NfT1BfU0JCQjsKKyAgICAgICAgdDEgPSBnZW5fZXh0X3RsKGNwdV90bXAwLCBjcHVfY2Nfc3JjLCBzaXplLCBmYWxzZSk7CisgICAgICAgIGlmIChUQ0dWX0VRVUFMKHQxLCByZWcpICYmIFRDR1ZfRVFVQUwocmVnLCBjcHVfY2Nfc3JjKSkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X3RtcDAsIGNwdV9jY19zcmMpOworICAgICAgICAgICAgdDEgPSBjcHVfdG1wMDsKKyAgICAgICAgfQorCisgICAgICAgIHRjZ19nZW5fYWRkX3RsKHJlZywgY3B1X2NjX2RzdCwgY3B1X2NjX3NyYyk7CisgICAgICAgIHRjZ19nZW5fYWRkaV90bChyZWcsIHJlZywgMSk7CisgICAgICAgIGdlbl9leHR1KHNpemUsIHJlZyk7CisgICAgICAgIHQwID0gcmVnOworICAgICAgICBnb3RvIGFkY19zYmI7CisKKyAgICBjYXNlIENDX09QX0FEQ0IgLi4uIENDX09QX0FEQ1E6CisgICAgICAgIC8qIChEQVRBX1RZUEUpQ0NfRFNUIDw9IChEQVRBX1RZUEUpQ0NfU1JDICovCisgICAgICAgIHNpemUgPSBzLT5jY19vcCAtIENDX09QX0FEQ0I7CisgICAgICAgIHQxID0gZ2VuX2V4dF90bChjcHVfdG1wMCwgY3B1X2NjX3NyYywgc2l6ZSwgZmFsc2UpOworICAgICAgICB0MCA9IGdlbl9leHRfdGwocmVnLCBjcHVfY2NfZHN0LCBzaXplLCBmYWxzZSk7CisgICAgYWRjX3NiYjoKKyAgICAgICAgdGNnX2dlbl9zZXRjb25kX3RsKGludiA/IFRDR19DT05EX0dUVSA6IFRDR19DT05EX0xFVSwgcmVnLCB0MCwgdDEpOworICAgICAgICBpbnYgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENDX09QX0xPR0lDQiAuLi4gQ0NfT1BfTE9HSUNROgorICAgICAgICB0Y2dfZ2VuX21vdmlfdGwocmVnLCAwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENDX09QX0lOQ0IgLi4uIENDX09QX0lOQ1E6CisgICAgY2FzZSBDQ19PUF9ERUNCIC4uLiBDQ19PUF9ERUNROgorICAgICAgICBpZiAoaW52KSB7CisgICAgICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwocmVnLCBjcHVfY2Nfc3JjLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKHJlZywgY3B1X2NjX3NyYyk7CisgICAgICAgIH0KKyAgICAgICAgaW52ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQ19PUF9TSExCIC4uLiBDQ19PUF9TSExROgorICAgICAgICAvKiAoQ0NfU1JDID4+IChEQVRBX0JJVFMgLSAxKSkgJiAxICovCisgICAgICAgIHNpemUgPSBzLT5jY19vcCAtIENDX09QX1NITEI7CisgICAgICAgIHRjZ19nZW5fc2hyaV90bChyZWcsIGNwdV9jY19zcmMsICg4IDw8IHNpemUpIC0gMSk7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bChyZWcsIHJlZywgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQ19PUF9NVUxCIC4uLiBDQ19PUF9NVUxROgorICAgICAgICB0Y2dfZ2VuX3NldGNvbmRpX3RsKGludiA/IFRDR19DT05EX0VRIDogVENHX0NPTkRfTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnLCBjcHVfY2Nfc3JjLCAwKTsKKyAgICAgICAgaW52ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQ19PUF9FRkxBR1M6CisgICAgY2FzZSBDQ19PUF9TQVJCIC4uLiBDQ19PUF9TQVJROgorICAgICAgICAvKiBDQ19TUkMgJiAxICovCisgICAgICAgIHRjZ19nZW5fYW5kaV90bChyZWcsIGNwdV9jY19zcmMsIDEpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgLyogVGhlIG5lZWQgdG8gY29tcHV0ZSBvbmx5IEMgZnJvbSBDQ19PUF9EWU5BTUlDIGlzIGltcG9ydGFudAorICAgICAgICAgIGluIGVmZmljaWVudGx5IGltcGxlbWVudGluZyBlLmcuIElOQyBhdCB0aGUgc3RhcnQgb2YgYSBUQi4gICovCisgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICBnZW5faGVscGVyX2NjX2NvbXB1dGVfYyhjcHVfdG1wMl9pMzIsIGNwdV9lbnYsIGNwdV9jY19vcCk7CisgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChyZWcsIGNwdV90bXAyX2kzMik7CisgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbnYpIHsKKyAgICAgICAgdGNnX2dlbl94b3JpX3RsKHJlZywgcmVnLCAxKTsKKyAgICB9Cit9CisKKy8qIGNvbXB1dGUgZWZsYWdzLlAgdG8gcmVnICovCitzdGF0aWMgdm9pZCBnZW5fY29tcHV0ZV9lZmxhZ3NfcChEaXNhc0NvbnRleHQgKnMsIFRDR3YgcmVnKQoreworICAgIGdlbl9jb21wdXRlX2VmbGFncyhzKTsKKyAgICB0Y2dfZ2VuX3NocmlfdGwocmVnLCBjcHVfY2Nfc3JjLCAyKTsKKyAgICB0Y2dfZ2VuX2FuZGlfdGwocmVnLCByZWcsIDEpOworfQorCisvKiBjb21wdXRlIGVmbGFncy5TIHRvIHJlZyAqLworc3RhdGljIHZvaWQgZ2VuX2NvbXB1dGVfZWZsYWdzX3MoRGlzYXNDb250ZXh0ICpzLCBUQ0d2IHJlZywgYm9vbCBpbnYpCit7CisgICAgc3dpdGNoIChzLT5jY19vcCkgeworICAgIGNhc2UgQ0NfT1BfRFlOQU1JQzoKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICAvKiBGQUxMVEhSVSAqLworICAgIGNhc2UgQ0NfT1BfRUZMQUdTOgorICAgICAgICB0Y2dfZ2VuX3NocmlfdGwocmVnLCBjcHVfY2Nfc3JjLCA3KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHJlZywgcmVnLCAxKTsKKyAgICAgICAgaWYgKGludikgeworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHJlZywgcmVnLCAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IChzLT5jY19vcCAtIENDX09QX0FEREIpICYgMzsKKyAgICAgICAgICAgIFRDR3YgdDAgPSBnZW5fZXh0X3RsKHJlZywgY3B1X2NjX2RzdCwgc2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NldGNvbmRpX3RsKGludiA/IFRDR19DT05EX0dFIDogVENHX0NPTkRfTFQsIHJlZywgdDAsIDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogY29tcHV0ZSBlZmxhZ3MuTyB0byByZWcgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb21wdXRlX2VmbGFnc19vKERpc2FzQ29udGV4dCAqcywgVENHdiByZWcpCit7CisgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgIHRjZ19nZW5fc2hyaV90bChyZWcsIGNwdV9jY19zcmMsIDExKTsKKyAgICB0Y2dfZ2VuX2FuZGlfdGwocmVnLCByZWcsIDEpOworfQorCisvKiBjb21wdXRlIGVmbGFncy5aIHRvIHJlZyAqLworc3RhdGljIHZvaWQgZ2VuX2NvbXB1dGVfZWZsYWdzX3ooRGlzYXNDb250ZXh0ICpzLCBUQ0d2IHJlZywgYm9vbCBpbnYpCit7CisgICAgc3dpdGNoIChzLT5jY19vcCkgeworICAgIGNhc2UgQ0NfT1BfRFlOQU1JQzoKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICAvKiBGQUxMVEhSVSAqLworICAgIGNhc2UgQ0NfT1BfRUZMQUdTOgorICAgICAgICB0Y2dfZ2VuX3NocmlfdGwocmVnLCBjcHVfY2Nfc3JjLCA2KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHJlZywgcmVnLCAxKTsKKyAgICAgICAgaWYgKGludikgeworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHJlZywgcmVnLCAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IChzLT5jY19vcCAtIENDX09QX0FEREIpICYgMzsKKyAgICAgICAgICAgIFRDR3YgdDAgPSBnZW5fZXh0X3RsKHJlZywgY3B1X2NjX2RzdCwgc2l6ZSwgZmFsc2UpOworICAgICAgICAgICAgdGNnX2dlbl9zZXRjb25kaV90bChpbnYgPyBUQ0dfQ09ORF9ORSA6IFRDR19DT05EX0VRLCByZWcsIHQwLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX3NldGNjX3Nsb3coRGlzYXNDb250ZXh0ICpzLCBpbnQgamNjX29wLCBUQ0d2IHJlZywgYm9vbCBpbnYpCit7CisgICAgYXNzZXJ0KCFUQ0dWX0VRVUFMKHJlZywgY3B1X2NjX3NyYykpOworICAgIHN3aXRjaChqY2Nfb3ApIHsKKyAgICBjYXNlIEpDQ19POgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfbyhzLCByZWcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpDQ19COgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfYyhzLCByZWcsIGludik7CisgICAgICAgIGludiA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpDQ19aOgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfeihzLCByZWcsIGludik7CisgICAgICAgIGludiA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpDQ19CRToKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwocmVnLCBjcHVfY2Nfc3JjLCBDQ19aIHwgQ0NfQyk7CisgICAgICAgIHRjZ19nZW5fc2V0Y29uZGlfdGwoaW52ID8gVENHX0NPTkRfRVEgOiBUQ0dfQ09ORF9ORSwgcmVnLCByZWcsIDApOworICAgICAgICByZXR1cm47CisgICAgY2FzZSBKQ0NfUzoKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzX3MocywgcmVnLCBpbnYpOworICAgICAgICBpbnYgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ0NfUDoKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzX3AocywgcmVnKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKQ0NfTDoKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICB0Y2dfZ2VuX3NocmlfdGwocmVnLCBjcHVfY2Nfc3JjLCAxMSk7IC8qIENDX08gKi8KKyAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV90bXAwLCBjcHVfY2Nfc3JjLCA3KTsgLyogQ0NfUyAqLworICAgICAgICB0Y2dfZ2VuX3hvcl90bChyZWcsIHJlZywgY3B1X3RtcDApOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwocmVnLCByZWcsIDEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgSkNDX0xFOgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3Mocyk7CisgICAgICAgIHRjZ19nZW5fc2hyaV90bChyZWcsIGNwdV9jY19zcmMsIDExKTsgLyogQ0NfTyAqLworICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X3RtcDQsIGNwdV9jY19zcmMsIDcpOyAvKiBDQ19TICovCisgICAgICAgIHRjZ19nZW5fc2hyaV90bChjcHVfdG1wMCwgY3B1X2NjX3NyYywgNik7IC8qIENDX1ogKi8KKyAgICAgICAgdGNnX2dlbl94b3JfdGwocmVnLCByZWcsIGNwdV90bXA0KTsKKyAgICAgICAgdGNnX2dlbl9vcl90bChyZWcsIHJlZywgY3B1X3RtcDApOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwocmVnLCByZWcsIDEpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGludikgeworICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwocmVnLCByZWcsIDEpOworICAgIH0KK30KKworLyogcmV0dXJuIHRydWUgaWYgc2V0Y2Nfc2xvdyBpcyBub3QgbmVlZGVkIChXQVJOSU5HOiBtdXN0IGJlIGtlcHQgaW4KKyAgIHN5bmMgd2l0aCBnZW5famNjMSkgKi8KK3N0YXRpYyBpbnQgaXNfZmFzdF9qY2NfY2FzZShEaXNhc0NvbnRleHQgKnMsIGludCBiKQoreworICAgIGludCBqY2Nfb3A7CisgICAgamNjX29wID0gKGIgPj4gMSkgJiA3OworICAgIHN3aXRjaChzLT5jY19vcCkgeworICAgICAgICAvKiB3ZSBvcHRpbWl6ZSB0aGUgY21wL2pjYyBjYXNlICovCisgICAgY2FzZSBDQ19PUF9TVUJCOgorICAgIGNhc2UgQ0NfT1BfU1VCVzoKKyAgICBjYXNlIENDX09QX1NVQkw6CisgICAgY2FzZSBDQ19PUF9TVUJROgorICAgICAgICBpZiAoamNjX29wID09IEpDQ19PIHx8IGpjY19vcCA9PSBKQ0NfUCkKKyAgICAgICAgICAgIGdvdG8gc2xvd19qY2M7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHNvbWUganVtcHMgYXJlIGVhc3kgdG8gY29tcHV0ZSAqLworICAgIGNhc2UgQ0NfT1BfQUREQjoKKyAgICBjYXNlIENDX09QX0FERFc6CisgICAgY2FzZSBDQ19PUF9BRERMOgorICAgIGNhc2UgQ0NfT1BfQUREUToKKworICAgIGNhc2UgQ0NfT1BfTE9HSUNCOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNXOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNMOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNROgorCisgICAgY2FzZSBDQ19PUF9JTkNCOgorICAgIGNhc2UgQ0NfT1BfSU5DVzoKKyAgICBjYXNlIENDX09QX0lOQ0w6CisgICAgY2FzZSBDQ19PUF9JTkNROgorCisgICAgY2FzZSBDQ19PUF9ERUNCOgorICAgIGNhc2UgQ0NfT1BfREVDVzoKKyAgICBjYXNlIENDX09QX0RFQ0w6CisgICAgY2FzZSBDQ19PUF9ERUNROgorCisgICAgY2FzZSBDQ19PUF9TSExCOgorICAgIGNhc2UgQ0NfT1BfU0hMVzoKKyAgICBjYXNlIENDX09QX1NITEw6CisgICAgY2FzZSBDQ19PUF9TSExROgorICAgICAgICBpZiAoamNjX29wICE9IEpDQ19aICYmIGpjY19vcCAhPSBKQ0NfUykKKyAgICAgICAgICAgIGdvdG8gc2xvd19qY2M7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgc2xvd19qY2M6CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyogZ2VuZXJhdGUgYSBjb25kaXRpb25hbCBqdW1wIHRvIGxhYmVsICdsMScgYWNjb3JkaW5nIHRvIGp1bXAgb3Bjb2RlCisgICB2YWx1ZSAnYicuIEluIHRoZSBmYXN0IGNhc2UsIFQwIGlzIGd1YXJhbnRlZCBub3QgdG8gYmUgdXNlZC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5famNjMShEaXNhc0NvbnRleHQgKnMsIGludCBiLCBpbnQgbDEpCit7CisgICAgaW50IGludiwgamNjX29wLCBzaXplLCBjb25kOworICAgIFRDR3YgdDA7CisKKyAgICBpbnYgPSBiICYgMTsKKyAgICBqY2Nfb3AgPSAoYiA+PiAxKSAmIDc7CisKKyAgICBzd2l0Y2gocy0+Y2Nfb3ApIHsKKyAgICAgICAgLyogd2Ugb3B0aW1pemUgdGhlIGNtcC9qY2MgY2FzZSAqLworICAgIGNhc2UgQ0NfT1BfU1VCQjoKKyAgICBjYXNlIENDX09QX1NVQlc6CisgICAgY2FzZSBDQ19PUF9TVUJMOgorICAgIGNhc2UgQ0NfT1BfU1VCUToKKworICAgICAgICBzaXplID0gcy0+Y2Nfb3AgLSBDQ19PUF9TVUJCOworICAgICAgICBzd2l0Y2goamNjX29wKSB7CisgICAgICAgIGNhc2UgSkNDX1o6CisgICAgICAgIGZhc3RfamNjX3o6CisgICAgICAgICAgICB0MCA9IGdlbl9leHRfdGwoY3B1X3RtcDAsIGNwdV9jY19kc3QsIHNpemUsIGZhbHNlKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChpbnYgPyBUQ0dfQ09ORF9ORSA6IFRDR19DT05EX0VRLCB0MCwgMCwgbDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSkNDX1M6CisgICAgICAgIGZhc3RfamNjX3M6CisgICAgICAgICAgICB0MCA9IGdlbl9leHRfdGwoY3B1X3RtcDAsIGNwdV9jY19kc3QsIHNpemUsIHRydWUpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKGludiA/IFRDR19DT05EX0dFIDogVENHX0NPTkRfTFQsIHQwLCAwLCBsMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEpDQ19COgorICAgICAgICAgICAgY29uZCA9IGludiA/IFRDR19DT05EX0dFVSA6IFRDR19DT05EX0xUVTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9qY2NfYjsKKyAgICAgICAgY2FzZSBKQ0NfQkU6CisgICAgICAgICAgICBjb25kID0gaW52ID8gVENHX0NPTkRfR1RVIDogVENHX0NPTkRfTEVVOworICAgICAgICBmYXN0X2pjY19iOgorICAgICAgICAgICAgdGNnX2dlbl9hZGRfdGwoY3B1X3RtcDQsIGNwdV9jY19kc3QsIGNwdV9jY19zcmMpOworICAgICAgICAgICAgZ2VuX2V4dHUoc2l6ZSwgY3B1X3RtcDQpOworICAgICAgICAgICAgdDAgPSBnZW5fZXh0X3RsKGNwdV90bXAwLCBjcHVfY2Nfc3JjLCBzaXplLCBmYWxzZSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZF90bChjb25kLCBjcHVfdG1wNCwgdDAsIGwxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSkNDX0w6CisgICAgICAgICAgICBjb25kID0gaW52ID8gVENHX0NPTkRfR0UgOiBUQ0dfQ09ORF9MVDsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9qY2NfbDsKKyAgICAgICAgY2FzZSBKQ0NfTEU6CisgICAgICAgICAgICBjb25kID0gaW52ID8gVENHX0NPTkRfR1QgOiBUQ0dfQ09ORF9MRTsKKyAgICAgICAgZmFzdF9qY2NfbDoKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkX3RsKGNwdV90bXA0LCBjcHVfY2NfZHN0LCBjcHVfY2Nfc3JjKTsKKyAgICAgICAgICAgIGdlbl9leHRzKHNpemUsIGNwdV90bXA0KTsKKyAgICAgICAgICAgIHQwID0gZ2VuX2V4dF90bChjcHVfdG1wMCwgY3B1X2NjX3NyYywgc2l6ZSwgdHJ1ZSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZF90bChjb25kLCBjcHVfdG1wNCwgdDAsIGwxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIHNsb3dfamNjOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHNvbWUganVtcHMgYXJlIGVhc3kgdG8gY29tcHV0ZSAqLworICAgIGNhc2UgQ0NfT1BfQUREQjoKKyAgICBjYXNlIENDX09QX0FERFc6CisgICAgY2FzZSBDQ19PUF9BRERMOgorICAgIGNhc2UgQ0NfT1BfQUREUToKKworICAgIGNhc2UgQ0NfT1BfQURDQjoKKyAgICBjYXNlIENDX09QX0FEQ1c6CisgICAgY2FzZSBDQ19PUF9BRENMOgorICAgIGNhc2UgQ0NfT1BfQURDUToKKworICAgIGNhc2UgQ0NfT1BfU0JCQjoKKyAgICBjYXNlIENDX09QX1NCQlc6CisgICAgY2FzZSBDQ19PUF9TQkJMOgorICAgIGNhc2UgQ0NfT1BfU0JCUToKKworICAgIGNhc2UgQ0NfT1BfTE9HSUNCOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNXOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNMOgorICAgIGNhc2UgQ0NfT1BfTE9HSUNROgorCisgICAgY2FzZSBDQ19PUF9JTkNCOgorICAgIGNhc2UgQ0NfT1BfSU5DVzoKKyAgICBjYXNlIENDX09QX0lOQ0w6CisgICAgY2FzZSBDQ19PUF9JTkNROgorCisgICAgY2FzZSBDQ19PUF9ERUNCOgorICAgIGNhc2UgQ0NfT1BfREVDVzoKKyAgICBjYXNlIENDX09QX0RFQ0w6CisgICAgY2FzZSBDQ19PUF9ERUNROgorCisgICAgY2FzZSBDQ19PUF9TSExCOgorICAgIGNhc2UgQ0NfT1BfU0hMVzoKKyAgICBjYXNlIENDX09QX1NITEw6CisgICAgY2FzZSBDQ19PUF9TSExROgorCisgICAgY2FzZSBDQ19PUF9TQVJCOgorICAgIGNhc2UgQ0NfT1BfU0FSVzoKKyAgICBjYXNlIENDX09QX1NBUkw6CisgICAgY2FzZSBDQ19PUF9TQVJROgorICAgICAgICBzd2l0Y2goamNjX29wKSB7CisgICAgICAgIGNhc2UgSkNDX1o6CisgICAgICAgICAgICBzaXplID0gKHMtPmNjX29wIC0gQ0NfT1BfQUREQikgJiAzOworICAgICAgICAgICAgZ290byBmYXN0X2pjY196OworICAgICAgICBjYXNlIEpDQ19TOgorICAgICAgICAgICAgc2l6ZSA9IChzLT5jY19vcCAtIENDX09QX0FEREIpICYgMzsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9qY2NfczsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gc2xvd19qY2M7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBzbG93X2pjYzoKKyAgICAgICAgZ2VuX3NldGNjX3Nsb3cocywgamNjX29wLCBjcHVfVFswXSwgZmFsc2UpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoaW52ID8gVENHX0NPTkRfRVEgOiBUQ0dfQ09ORF9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9UWzBdLCAwLCBsMSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogWFhYOiBkb2VzIG5vdCB3b3JrIHdpdGggZ2Ric3R1YiAiaWNlIiBzaW5nbGUgc3RlcCAtIG5vdCBhCisgICBzZXJpb3VzIHByb2JsZW0gKi8KK3N0YXRpYyBpbnQgZ2VuX2p6X2VjeF9zdHJpbmcoRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRfdWxvbmcgbmV4dF9laXApCit7CisgICAgaW50IGwxLCBsMjsKKworICAgIGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgIGwyID0gZ2VuX25ld19sYWJlbCgpOworICAgIGdlbl9vcF9qbnpfZWN4KHMtPmFmbGFnLCBsMSk7CisgICAgZ2VuX3NldF9sYWJlbChsMik7CisgICAgZ2VuX2ptcF90YihzLCBuZXh0X2VpcCwgMSk7CisgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgcmV0dXJuIGwyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0b3MoRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QpCit7CisgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfTE9ORywgMCwgUl9FQVgpOworICAgIGdlbl9zdHJpbmdfbW92bF9BMF9FREkocyk7CisgICAgZ2VuX29wX3N0X1QwX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICBnZW5fb3BfbW92bF9UMF9Ec2hpZnQob3QpOworICAgIGdlbl9vcF9hZGRfcmVnX1QwKHMtPmFmbGFnLCBSX0VESSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbG9kcyhEaXNhc0NvbnRleHQgKnMsIGludCBvdCkKK3sKKyAgICBnZW5fc3RyaW5nX21vdmxfQTBfRVNJKHMpOworICAgIGdlbl9vcF9sZF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIFJfRUFYKTsKKyAgICBnZW5fb3BfbW92bF9UMF9Ec2hpZnQob3QpOworICAgIGdlbl9vcF9hZGRfcmVnX1QwKHMtPmFmbGFnLCBSX0VTSSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc2NhcyhEaXNhc0NvbnRleHQgKnMsIGludCBvdCkKK3sKKyAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCBSX0VBWCk7CisgICAgZ2VuX3N0cmluZ19tb3ZsX0EwX0VESShzKTsKKyAgICBnZW5fb3BfbGRfVDFfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGdlbl9vcF9jbXBsX1QwX1QxX2NjKCk7CisgICAgZ2VuX29wX21vdmxfVDBfRHNoaWZ0KG90KTsKKyAgICBnZW5fb3BfYWRkX3JlZ19UMChzLT5hZmxhZywgUl9FREkpOworICAgIHNldF9jY19vcChzLCBDQ19PUF9TVUJCICsgb3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2NtcHMoRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QpCit7CisgICAgZ2VuX3N0cmluZ19tb3ZsX0EwX0VTSShzKTsKKyAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGdlbl9zdHJpbmdfbW92bF9BMF9FREkocyk7CisgICAgZ2VuX29wX2xkX1QxX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICBnZW5fb3BfY21wbF9UMF9UMV9jYygpOworICAgIGdlbl9vcF9tb3ZsX1QwX0RzaGlmdChvdCk7CisgICAgZ2VuX29wX2FkZF9yZWdfVDAocy0+YWZsYWcsIFJfRVNJKTsKKyAgICBnZW5fb3BfYWRkX3JlZ19UMChzLT5hZmxhZywgUl9FREkpOworICAgIHNldF9jY19vcChzLCBDQ19PUF9TVUJCICsgb3QpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2lucyhEaXNhc0NvbnRleHQgKnMsIGludCBvdCkKK3sKKyAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgZ2VuX2lvX3N0YXJ0KCk7CisgICAgZ2VuX3N0cmluZ19tb3ZsX0EwX0VESShzKTsKKyAgICAvKiBOb3RlOiB3ZSBtdXN0IGRvIHRoaXMgZHVtbXkgd3JpdGUgZmlyc3QgdG8gYmUgcmVzdGFydGFibGUgaW4KKyAgICAgICBjYXNlIG9mIHBhZ2UgZmF1bHQuICovCisgICAgZ2VuX29wX21vdmxfVDBfMCgpOworICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfV09SRCwgMSwgUl9FRFgpOworICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMV0pOworICAgIHRjZ19nZW5fYW5kaV9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfdG1wMl9pMzIsIDB4ZmZmZik7CisgICAgZ2VuX2hlbHBlcl9pbl9mdW5jKG90LCBjcHVfVFswXSwgY3B1X3RtcDJfaTMyKTsKKyAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGdlbl9vcF9tb3ZsX1QwX0RzaGlmdChvdCk7CisgICAgZ2VuX29wX2FkZF9yZWdfVDAocy0+YWZsYWcsIFJfRURJKTsKKyAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgZ2VuX2lvX2VuZCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX291dHMoRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QpCit7CisgICAgaWYgKHVzZV9pY291bnQpCisgICAgICAgIGdlbl9pb19zdGFydCgpOworICAgIGdlbl9zdHJpbmdfbW92bF9BMF9FU0kocyk7CisgICAgZ2VuX29wX2xkX1QwX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKworICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX1dPUkQsIDEsIFJfRURYKTsKKyAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzFdKTsKKyAgICB0Y2dfZ2VuX2FuZGlfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDJfaTMyLCAweGZmZmYpOworICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAzX2kzMiwgY3B1X1RbMF0pOworICAgIGdlbl9oZWxwZXJfb3V0X2Z1bmMob3QsIGNwdV90bXAyX2kzMiwgY3B1X3RtcDNfaTMyKTsKKworICAgIGdlbl9vcF9tb3ZsX1QwX0RzaGlmdChvdCk7CisgICAgZ2VuX29wX2FkZF9yZWdfVDAocy0+YWZsYWcsIFJfRVNJKTsKKyAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgZ2VuX2lvX2VuZCgpOworfQorCisvKiBzYW1lIG1ldGhvZCBhcyBWYWxncmluZCA6IHdlIGdlbmVyYXRlIGp1bXBzIHRvIGN1cnJlbnQgb3IgbmV4dAorICAgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgR0VOX1JFUFoob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fcmVwel8gIyMgb3AoRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBjdXJfZWlwLCB0YXJnZXRfdWxvbmcgbmV4dF9laXApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbDI7XAorICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGwyID0gZ2VuX2p6X2VjeF9zdHJpbmcocywgbmV4dF9laXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl8gIyMgb3Aocywgb3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl9vcF9hZGRfcmVnX2ltKHMtPmFmbGFnLCBSX0VDWCwgLTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGEgbG9vcCB3b3VsZCBjYXVzZSB0d28gc2luZ2xlIHN0ZXAgZXhjZXB0aW9ucyBpZiBFQ1ggPSAxICAgICAgICAgICAgICAgXAorICAgICAgIGJlZm9yZSByZXAgc3RyaW5nX2luc24gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcy0+am1wX29wdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnZW5fb3BfanpfZWN4KHMtPmFmbGFnLCBsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl9qbXAocywgY3VyX2VpcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEdFTl9SRVBaMihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3JlcHpfICMjIG9wKERpc2FzQ29udGV4dCAqcywgaW50IG90LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBjdXJfZWlwLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBuZXh0X2VpcCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBueikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGwyO1wKKyAgICBnZW5fdXBkYXRlX2NjX29wKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsMiA9IGdlbl9qel9lY3hfc3RyaW5nKHMsIG5leHRfZWlwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fICMjIG9wKHMsIG90KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fb3BfYWRkX3JlZ19pbShzLT5hZmxhZywgUl9FQ1gsIC0xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fdXBkYXRlX2NjX29wKHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5famNjMShzLCAoSkNDX1ogPDwgMSkgfCAobnogXiAxKSwgbDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXMtPmptcF9vcHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2VuX29wX2p6X2VjeChzLT5hZmxhZywgbDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fam1wKHMsIGN1cl9laXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworR0VOX1JFUFoobW92cykKK0dFTl9SRVBaKHN0b3MpCitHRU5fUkVQWihsb2RzKQorR0VOX1JFUFooaW5zKQorR0VOX1JFUFoob3V0cykKK0dFTl9SRVBaMihzY2FzKQorR0VOX1JFUFoyKGNtcHMpCisKK3N0YXRpYyB2b2lkIGdlbl9oZWxwZXJfZnBfYXJpdGhfU1QwX0ZUMChpbnQgb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZ2VuX2hlbHBlcl9mYWRkX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgZ2VuX2hlbHBlcl9mbXVsX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZ2VuX2hlbHBlcl9mY29tX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgZ2VuX2hlbHBlcl9mY29tX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgZ2VuX2hlbHBlcl9mc3ViX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgZ2VuX2hlbHBlcl9mc3Vicl9TVDBfRlQwKGNwdV9lbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGdlbl9oZWxwZXJfZmRpdl9TVDBfRlQwKGNwdV9lbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIGdlbl9oZWxwZXJfZmRpdnJfU1QwX0ZUMChjcHVfZW52KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBOT1RFIHRoZSBleGNlcHRpb24gaW4gInIiIG9wIG9yZGVyaW5nICovCitzdGF0aWMgdm9pZCBnZW5faGVscGVyX2ZwX2FyaXRoX1NUTl9TVDAoaW50IG9wLCBpbnQgb3ByZWcpCit7CisgICAgVENHdl9pMzIgdG1wID0gdGNnX2NvbnN0X2kzMihvcHJlZyk7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZ2VuX2hlbHBlcl9mYWRkX1NUTl9TVDAoY3B1X2VudiwgdG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBnZW5faGVscGVyX2ZtdWxfU1ROX1NUMChjcHVfZW52LCB0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGdlbl9oZWxwZXJfZnN1YnJfU1ROX1NUMChjcHVfZW52LCB0bXApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGdlbl9oZWxwZXJfZnN1Yl9TVE5fU1QwKGNwdV9lbnYsIHRtcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgZ2VuX2hlbHBlcl9mZGl2cl9TVE5fU1QwKGNwdV9lbnYsIHRtcCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgZ2VuX2hlbHBlcl9mZGl2X1NUTl9TVDAoY3B1X2VudiwgdG1wKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBpZiBkID09IE9SX1RNUDAsIGl0IG1lYW5zIG1lbW9yeSBvcGVyYW5kIChhZGRyZXNzIGluIEEwKSAqLworc3RhdGljIHZvaWQgZ2VuX29wKERpc2FzQ29udGV4dCAqczEsIGludCBvcCwgaW50IG90LCBpbnQgZCkKK3sKKyAgICBpZiAoZCAhPSBPUl9UTVAwKSB7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCBkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICB9CisgICAgc3dpdGNoKG9wKSB7CisgICAgY2FzZSBPUF9BRENMOgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfYyhzMSwgY3B1X3RtcDQsIGZhbHNlKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgIHRjZ19nZW5fYWRkX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X3RtcDQpOworICAgICAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX3NyYywgY3B1X1RbMV0pOworICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDQpOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDJfaTMyLCAyKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihjcHVfY2Nfb3AsIGNwdV90bXAyX2kzMiwgQ0NfT1BfQUREQiArIG90KTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9EWU5BTUlDKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9TQkJMOgorICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfYyhzMSwgY3B1X3RtcDQsIGZhbHNlKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X3RtcDQpOworICAgICAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX3NyYywgY3B1X1RbMV0pOworICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDQpOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDJfaTMyLCAyKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX2kzMihjcHVfY2Nfb3AsIGNwdV90bXAyX2kzMiwgQ0NfT1BfU1VCQiArIG90KTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9EWU5BTUlDKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9BRERMOgorICAgICAgICBnZW5fb3BfYWRkbF9UMF9UMSgpOworICAgICAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICAgICAgZ2VuX29wX3VwZGF0ZTJfY2MoKTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9BRERCICsgb3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX1NVQkw6CisgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICAgICAgZ2VuX29wX3VwZGF0ZTJfY2MoKTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9TVUJCICsgb3QpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT1BfQU5ETDoKKyAgICAgICAgdGNnX2dlbl9hbmRfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgIGlmIChkICE9IE9SX1RNUDApCisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMxLT5tZW1faW5kZXgpOworICAgICAgICBnZW5fb3BfdXBkYXRlMV9jYygpOworICAgICAgICBzZXRfY2Nfb3AoczEsIENDX09QX0xPR0lDQiArIG90KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9PUkw6CisgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgIGlmIChkICE9IE9SX1RNUDApCisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMxLT5tZW1faW5kZXgpOworICAgICAgICBnZW5fb3BfdXBkYXRlMV9jYygpOworICAgICAgICBzZXRfY2Nfb3AoczEsIENDX09QX0xPR0lDQiArIG90KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9YT1JMOgorICAgICAgICB0Y2dfZ2VuX3hvcl90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgaWYgKGQgIT0gT1JfVE1QMCkKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCBkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKG90ICsgczEtPm1lbV9pbmRleCk7CisgICAgICAgIGdlbl9vcF91cGRhdGUxX2NjKCk7CisgICAgICAgIHNldF9jY19vcChzMSwgQ0NfT1BfTE9HSUNCICsgb3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX0NNUEw6CisgICAgICAgIGdlbl9vcF9jbXBsX1QwX1QxX2NjKCk7CisgICAgICAgIHNldF9jY19vcChzMSwgQ0NfT1BfU1VCQiArIG90KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBpZiBkID09IE9SX1RNUDAsIGl0IG1lYW5zIG1lbW9yeSBvcGVyYW5kIChhZGRyZXNzIGluIEEwKSAqLworc3RhdGljIHZvaWQgZ2VuX2luYyhEaXNhc0NvbnRleHQgKnMxLCBpbnQgb3QsIGludCBkLCBpbnQgYykKK3sKKyAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgZCk7CisgICAgZWxzZQorICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICBnZW5fY29tcHV0ZV9lZmxhZ3NfYyhzMSwgY3B1X2NjX3NyYywgZmFsc2UpOworICAgIGlmIChjID4gMCkgeworICAgICAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCAxKTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9JTkNCICsgb3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fYWRkaV90bChjcHVfVFswXSwgY3B1X1RbMF0sIC0xKTsKKyAgICAgICAgc2V0X2NjX29wKHMxLCBDQ19PUF9ERUNCICsgb3QpOworICAgIH0KKyAgICBpZiAoZCAhPSBPUl9UTVAwKQorICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgZCk7CisgICAgZWxzZQorICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzMS0+bWVtX2luZGV4KTsKKyAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9zaGlmdF9ybV9UMShEaXNhc0NvbnRleHQgKnMsIGludCBvdCwgaW50IG9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcmlnaHQsIGludCBpc19hcml0aCkKK3sKKyAgICB0YXJnZXRfdWxvbmcgbWFzazsKKyAgICBpbnQgc2hpZnRfbGFiZWw7CisgICAgVENHdiB0MCwgdDE7CisKKyAgICBpZiAob3QgPT0gT1RfUVVBRCkKKyAgICAgICAgbWFzayA9IDB4M2Y7CisgICAgZWxzZQorICAgICAgICBtYXNrID0gMHgxZjsKKworICAgIC8qIGxvYWQgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApIHsKKyAgICAgICAgZ2VuX29wX2xkX1QwX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgb3AxKTsKKyAgICB9CisKKyAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X1RbMV0sIGNwdV9UWzFdLCBtYXNrKTsKKworICAgIHRjZ19nZW5fYWRkaV90bChjcHVfdG1wNSwgY3B1X1RbMV0sIC0xKTsKKworICAgIGlmIChpc19yaWdodCkgeworICAgICAgICBpZiAoaXNfYXJpdGgpIHsKKyAgICAgICAgICAgIGdlbl9leHRzKG90LCBjcHVfVFswXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3Nhcl90bChjcHVfVDMsIGNwdV9UWzBdLCBjcHVfdG1wNSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3Nhcl90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9leHR1KG90LCBjcHVfVFswXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bChjcHVfVDMsIGNwdV9UWzBdLCBjcHVfdG1wNSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fc2hsX3RsKGNwdV9UMywgY3B1X1RbMF0sIGNwdV90bXA1KTsKKyAgICAgICAgdGNnX2dlbl9zaGxfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgfQorCisgICAgLyogc3RvcmUgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApIHsKKyAgICAgICAgZ2VuX29wX3N0X1QwX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgb3AxKTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgZWZsYWdzICovCisgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKworICAgIC8qIFhYWDogaW5lZmZpY2llbnQgKi8KKyAgICB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgIHQxID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisKKyAgICB0Y2dfZ2VuX21vdl90bCh0MCwgY3B1X1RbMF0pOworICAgIHRjZ19nZW5fbW92X3RsKHQxLCBjcHVfVDMpOworCisgICAgc2hpZnRfbGFiZWwgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0VRLCBjcHVfVFsxXSwgMCwgc2hpZnRfbGFiZWwpOworCisgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX3NyYywgdDEpOworICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19kc3QsIHQwKTsKKyAgICBpZiAoaXNfcmlnaHQpCisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoY3B1X2NjX29wLCBDQ19PUF9TQVJCICsgb3QpOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfY2Nfb3AsIENDX09QX1NITEIgKyBvdCk7CisKKyAgICBnZW5fc2V0X2xhYmVsKHNoaWZ0X2xhYmVsKTsKKyAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRFlOQU1JQyk7IC8qIGNhbm5vdCBwcmVkaWN0IGZsYWdzIGFmdGVyICovCisKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX3NoaWZ0X3JtX2ltKERpc2FzQ29udGV4dCAqcywgaW50IG90LCBpbnQgb3AxLCBpbnQgb3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19yaWdodCwgaW50IGlzX2FyaXRoKQoreworICAgIGludCBtYXNrID0gKG90ID09IE9UX1FVQUQgPyAweDNmIDogMHgxZik7CisKKyAgICAvKiBsb2FkICovCisgICAgaWYgKG9wMSA9PSBPUl9UTVAwKQorICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGVsc2UKKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIG9wMSk7CisKKyAgICBvcDIgJj0gbWFzazsKKyAgICBpZiAob3AyICE9IDApIHsKKyAgICAgICAgaWYgKGlzX3JpZ2h0KSB7CisgICAgICAgICAgICBpZiAoaXNfYXJpdGgpIHsKKyAgICAgICAgICAgICAgICBnZW5fZXh0cyhvdCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2FyaV90bChjcHVfdG1wNCwgY3B1X1RbMF0sIG9wMiAtIDEpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2FyaV90bChjcHVfVFswXSwgY3B1X1RbMF0sIG9wMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9leHR1KG90LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV90bXA0LCBjcHVfVFswXSwgb3AyIC0gMSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgb3AyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bChjcHVfdG1wNCwgY3B1X1RbMF0sIG9wMiAtIDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgb3AyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3JlICovCisgICAgaWYgKG9wMSA9PSBPUl9UTVAwKQorICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgIGVsc2UKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIG9wMSk7CisgICAgICAgIAorICAgIC8qIHVwZGF0ZSBlZmxhZ3MgaWYgbm9uIHplcm8gc2hpZnQgKi8KKyAgICBpZiAob3AyICE9IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX3NyYywgY3B1X3RtcDQpOworICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgIGlmIChpc19yaWdodCkKKyAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9TQVJCICsgb3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfU0hMQiArIG90KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xzaGlmdChUQ0d2IHJldCwgVENHdiBhcmcxLCB0YXJnZXRfbG9uZyBhcmcyKQoreworICAgIGlmIChhcmcyID49IDApCisgICAgICAgIHRjZ19nZW5fc2hsaV90bChyZXQsIGFyZzEsIGFyZzIpOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHJldCwgYXJnMSwgLWFyZzIpOworfQorCitzdGF0aWMgdm9pZCBnZW5fcm90X3JtX1QxKERpc2FzQ29udGV4dCAqcywgaW50IG90LCBpbnQgb3AxLCBpbnQgaXNfcmlnaHQpCit7CisgICAgdGFyZ2V0X3Vsb25nIG1hc2s7CisgICAgaW50IGxhYmVsMSwgbGFiZWwyLCBkYXRhX2JpdHM7CisgICAgVENHdiB0MCwgdDEsIHQyLCBhMDsKKworICAgIC8qIFhYWDogaW5lZmZpY2llbnQsIGJ1dCB3ZSBtdXN0IHVzZSBsb2NhbCB0ZW1wcyAqLworICAgIHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICB0MiA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgIGEwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisKKyAgICBpZiAob3QgPT0gT1RfUVVBRCkKKyAgICAgICAgbWFzayA9IDB4M2Y7CisgICAgZWxzZQorICAgICAgICBtYXNrID0gMHgxZjsKKworICAgIC8qIGxvYWQgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9BMCk7CisgICAgICAgIGdlbl9vcF9sZF92KG90ICsgcy0+bWVtX2luZGV4LCB0MCwgYTApOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9vcF9tb3Zfdl9yZWcob3QsIHQwLCBvcDEpOworICAgIH0KKworICAgIHRjZ19nZW5fbW92X3RsKHQxLCBjcHVfVFsxXSk7CisKKyAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQxLCBtYXNrKTsKKworICAgIC8qIE11c3QgdGVzdCB6ZXJvIGNhc2UgdG8gYXZvaWQgdXNpbmcgdW5kZWZpbmVkIGJlaGF2aW91ciBpbiBUQ0cKKyAgICAgICBzaGlmdHMuICovCisgICAgbGFiZWwxID0gZ2VuX25ld19sYWJlbCgpOworICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgdDEsIDAsIGxhYmVsMSk7CisKKyAgICBpZiAob3QgPD0gT1RfV09SRCkKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV90bXAwLCB0MSwgKDEgPDwgKDMgKyBvdCkpIC0gMSk7CisgICAgZWxzZQorICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfdG1wMCwgdDEpOworCisgICAgZ2VuX2V4dHUob3QsIHQwKTsKKyAgICB0Y2dfZ2VuX21vdl90bCh0MiwgdDApOworCisgICAgZGF0YV9iaXRzID0gOCA8PCBvdDsKKyAgICAvKiBYWFg6IHJlbHkgb24gYmVoYXZpb3VyIG9mIHNoaWZ0cyB3aGVuIG9wZXJhbmQgMiBvdmVyZmxvd3MgKFhYWDoKKyAgICAgICBmaXggVENHIGRlZmluaXRpb24pICovCisgICAgaWYgKGlzX3JpZ2h0KSB7CisgICAgICAgIHRjZ19nZW5fc2hyX3RsKGNwdV90bXA0LCB0MCwgY3B1X3RtcDApOworICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfdG1wMCwgdGNnX2NvbnN0X3RsKGRhdGFfYml0cyksIGNwdV90bXAwKTsKKyAgICAgICAgdGNnX2dlbl9zaGxfdGwodDAsIHQwLCBjcHVfdG1wMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9zaGxfdGwoY3B1X3RtcDQsIHQwLCBjcHVfdG1wMCk7CisgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV90bXAwLCB0Y2dfY29uc3RfdGwoZGF0YV9iaXRzKSwgY3B1X3RtcDApOworICAgICAgICB0Y2dfZ2VuX3Nocl90bCh0MCwgdDAsIGNwdV90bXAwKTsKKyAgICB9CisgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIGNwdV90bXA0KTsKKworICAgIGdlbl9zZXRfbGFiZWwobGFiZWwxKTsKKyAgICAvKiBzdG9yZSAqLworICAgIGlmIChvcDEgPT0gT1JfVE1QMCkgeworICAgICAgICBnZW5fb3Bfc3RfdihvdCArIHMtPm1lbV9pbmRleCwgdDAsIGEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfbW92X3JlZ192KG90LCBvcDEsIHQwKTsKKyAgICB9CisKKyAgICAvKiB1cGRhdGUgZWZsYWdzLiAgSXQgaXMgbmVlZGVkIGFueXdheSBtb3N0IG9mIHRoZSB0aW1lLCBkbyBpdCBhbHdheXMuICAqLworICAgIGdlbl9jb21wdXRlX2VmbGFncyhzKTsKKyAgICBhc3NlcnQocy0+Y2Nfb3AgPT0gQ0NfT1BfRUZMQUdTKTsKKworICAgIGxhYmVsMiA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfRVEsIHQxLCAwLCBsYWJlbDIpOworCisgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIH4oQ0NfTyB8IENDX0MpKTsKKyAgICB0Y2dfZ2VuX3hvcl90bChjcHVfdG1wMCwgdDIsIHQwKTsKKyAgICB0Y2dfZ2VuX2xzaGlmdChjcHVfdG1wMCwgY3B1X3RtcDAsIDExIC0gKGRhdGFfYml0cyAtIDEpKTsKKyAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X3RtcDAsIGNwdV90bXAwLCBDQ19PKTsKKyAgICB0Y2dfZ2VuX29yX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIGNwdV90bXAwKTsKKyAgICBpZiAoaXNfcmlnaHQpIHsKKyAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHQwLCB0MCwgZGF0YV9iaXRzIC0gMSk7CisgICAgfQorICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIENDX0MpOworICAgIHRjZ19nZW5fb3JfdGwoY3B1X2NjX3NyYywgY3B1X2NjX3NyYywgdDApOworCisgICAgZ2VuX3NldF9sYWJlbChsYWJlbDIpOworCisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgdGNnX3RlbXBfZnJlZSh0Mik7CisgICAgdGNnX3RlbXBfZnJlZShhMCk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9yb3Rfcm1faW0oRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QsIGludCBvcDEsIGludCBvcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19yaWdodCkKK3sKKyAgICBpbnQgbWFzazsKKyAgICBpbnQgZGF0YV9iaXRzOworICAgIFRDR3YgdDAsIHQxLCBhMDsKKworICAgIC8qIFhYWDogaW5lZmZpY2llbnQsIGJ1dCB3ZSBtdXN0IHVzZSBsb2NhbCB0ZW1wcyAqLworICAgIHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICBhMCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworCisgICAgaWYgKG90ID09IE9UX1FVQUQpCisgICAgICAgIG1hc2sgPSAweDNmOworICAgIGVsc2UKKyAgICAgICAgbWFzayA9IDB4MWY7CisKKyAgICAvKiBsb2FkICovCisgICAgaWYgKG9wMSA9PSBPUl9UTVAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X3RsKGEwLCBjcHVfQTApOworICAgICAgICBnZW5fb3BfbGRfdihvdCArIHMtPm1lbV9pbmRleCwgdDAsIGEwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfbW92X3ZfcmVnKG90LCB0MCwgb3AxKTsKKyAgICB9CisKKyAgICBnZW5fZXh0dShvdCwgdDApOworICAgIHRjZ19nZW5fbW92X3RsKHQxLCB0MCk7CisKKyAgICBvcDIgJj0gbWFzazsKKyAgICBkYXRhX2JpdHMgPSA4IDw8IG90OworICAgIGlmIChvcDIgIT0gMCkgeworICAgICAgICBpbnQgc2hpZnQgPSBvcDIgJiAoKDEgPDwgKDMgKyBvdCkpIC0gMSk7CisgICAgICAgIGlmIChpc19yaWdodCkgeworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV90bXA0LCB0MCwgc2hpZnQpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQwLCB0MCwgZGF0YV9iaXRzIC0gc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV90bXA0LCB0MCwgc2hpZnQpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHQwLCB0MCwgZGF0YV9iaXRzIC0gc2hpZnQpOworICAgICAgICB9CisgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCBjcHVfdG1wNCk7CisgICAgfQorCisgICAgLyogc3RvcmUgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApIHsKKyAgICAgICAgZ2VuX29wX3N0X3Yob3QgKyBzLT5tZW1faW5kZXgsIHQwLCBhMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgb3AxLCB0MCk7CisgICAgfQorCisgICAgaWYgKG9wMiAhPSAwKSB7CisgICAgICAgIC8qIHVwZGF0ZSBlZmxhZ3MgKi8KKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICBhc3NlcnQocy0+Y2Nfb3AgPT0gQ0NfT1BfRUZMQUdTKTsKKworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X2NjX3NyYywgY3B1X2NjX3NyYywgfihDQ19PIHwgQ0NfQykpOworICAgICAgICB0Y2dfZ2VuX3hvcl90bChjcHVfdG1wMCwgdDEsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9sc2hpZnQoY3B1X3RtcDAsIGNwdV90bXAwLCAxMSAtIChkYXRhX2JpdHMgLSAxKSk7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfdG1wMCwgY3B1X3RtcDAsIENDX08pOworICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIGNwdV90bXAwKTsKKyAgICAgICAgaWYgKGlzX3JpZ2h0KSB7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwodDAsIHQwLCBkYXRhX2JpdHMgLSAxKTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCBDQ19DKTsKKyAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfY2Nfc3JjLCBjcHVfY2Nfc3JjLCB0MCk7CisKKyAgICAgICAgdGNnX2dlbl9kaXNjYXJkX3RsKGNwdV9jY19kc3QpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9jY19vcCwgQ0NfT1BfRUZMQUdTKTsKKyAgICB9CisKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKKyAgICB0Y2dfdGVtcF9mcmVlKGEwKTsKK30KKworLyogWFhYOiBhZGQgZmFzdGVyIGltbWVkaWF0ZSA9IDEgY2FzZSAqLworc3RhdGljIHZvaWQgZ2VuX3JvdGNfcm1fVDEoRGlzYXNDb250ZXh0ICpzLCBpbnQgb3QsIGludCBvcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcmlnaHQpCit7CisgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgIGFzc2VydChzLT5jY19vcCA9PSBDQ19PUF9FRkxBR1MpOworICAgIHRjZ19nZW5fZGlzY2FyZF90bChjcHVfY2NfZHN0KTsKKyAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKworICAgIC8qIGxvYWQgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApCisgICAgICAgIGdlbl9vcF9sZF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgZWxzZQorICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgb3AxKTsKKyAgICAKKyAgICBpZiAoaXNfcmlnaHQpIHsKKyAgICAgICAgc3dpdGNoIChvdCkgeworICAgICAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgICAgICBnZW5faGVscGVyX3JjcmIoY3B1X1RbMF0sIGNwdV9lbnYsIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9yY3J3KGNwdV9UWzBdLCBjcHVfZW52LCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfTE9ORzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcmNybChjcHVfVFswXSwgY3B1X2VudiwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgY2FzZSBPVF9RVUFEOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9yY3JxKGNwdV9UWzBdLCBjcHVfZW52LCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAob3QpIHsKKyAgICAgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9yY2xiKGNwdV9UWzBdLCBjcHVfZW52LCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcmNsdyhjcHVfVFswXSwgY3B1X2VudiwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgICAgICBnZW5faGVscGVyX3JjbGwoY3B1X1RbMF0sIGNwdV9lbnYsIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGNhc2UgT1RfUVVBRDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcmNscShjcHVfVFswXSwgY3B1X2VudiwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgLyogc3RvcmUgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApCisgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgZWxzZQorICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgb3AxKTsKK30KKworLyogWFhYOiBhZGQgZmFzdGVyIGltbWVkaWF0ZSBjYXNlICovCitzdGF0aWMgdm9pZCBnZW5fc2hpZnRkX3JtX1QxX1QzKERpc2FzQ29udGV4dCAqcywgaW50IG90LCBpbnQgb3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfcmlnaHQpCit7CisgICAgaW50IGxhYmVsMSwgbGFiZWwyLCBkYXRhX2JpdHM7CisgICAgdGFyZ2V0X3Vsb25nIG1hc2s7CisgICAgVENHdiB0MCwgdDEsIHQyLCBhMDsKKworICAgIHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICB0MiA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgIGEwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisKKyAgICBpZiAob3QgPT0gT1RfUVVBRCkKKyAgICAgICAgbWFzayA9IDB4M2Y7CisgICAgZWxzZQorICAgICAgICBtYXNrID0gMHgxZjsKKworICAgIC8qIGxvYWQgKi8KKyAgICBpZiAob3AxID09IE9SX1RNUDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9BMCk7CisgICAgICAgIGdlbl9vcF9sZF92KG90ICsgcy0+bWVtX2luZGV4LCB0MCwgYTApOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9vcF9tb3Zfdl9yZWcob3QsIHQwLCBvcDEpOworICAgIH0KKworICAgIHRjZ19nZW5fYW5kaV90bChjcHVfVDMsIGNwdV9UMywgbWFzayk7CisKKyAgICB0Y2dfZ2VuX21vdl90bCh0MSwgY3B1X1RbMV0pOworICAgIHRjZ19nZW5fbW92X3RsKHQyLCBjcHVfVDMpOworCisgICAgLyogTXVzdCB0ZXN0IHplcm8gY2FzZSB0byBhdm9pZCB1c2luZyB1bmRlZmluZWQgYmVoYXZpb3VyIGluIFRDRworICAgICAgIHNoaWZ0cy4gKi8KKyAgICBsYWJlbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0VRLCB0MiwgMCwgbGFiZWwxKTsKKworICAgIHRjZ19nZW5fYWRkaV90bChjcHVfdG1wNSwgdDIsIC0xKTsKKyAgICBpZiAob3QgPT0gT1RfV09SRCkgeworICAgICAgICAvKiBOb3RlOiB3ZSBpbXBsZW1lbnQgdGhlIEludGVsIGJlaGF2aW91ciBmb3Igc2hpZnQgY291bnQgPiAxNiAqLworICAgICAgICBpZiAoaXNfcmlnaHQpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIDB4ZmZmZik7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwoY3B1X3RtcDAsIHQxLCAxNik7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKHQwLCB0MCwgY3B1X3RtcDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwodDAsIHQwKTsKKworICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X3RtcDQsIHQwLCBjcHVfdG1wNSk7CisKKyAgICAgICAgICAgIC8qIG9ubHkgbmVlZGVkIGlmIGNvdW50ID4gMTYsIGJ1dCBhIHRlc3Qgd291bGQgY29tcGxpY2F0ZSAqLworICAgICAgICAgICAgdGNnX2dlbl9zdWJfdGwoY3B1X3RtcDUsIHRjZ19jb25zdF90bCgzMiksIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsX3RsKGNwdV90bXAwLCB0MCwgY3B1X3RtcDUpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bCh0MCwgdDAsIHQyKTsKKworICAgICAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIGNwdV90bXAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFhYWDogbm90IG9wdGltYWwgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIDB4ZmZmZik7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDEsIHQxLCAxNik7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKHQxLCB0MSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwodDEsIHQxKTsKKworICAgICAgICAgICAgdGNnX2dlbl9zaGxfdGwoY3B1X3RtcDQsIHQwLCBjcHVfdG1wNSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfdG1wMCwgdGNnX2NvbnN0X3RsKDMyKSwgY3B1X3RtcDUpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X3RtcDYsIHQxLCBjcHVfdG1wMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV90bXA0LCBjcHVfdG1wNCwgY3B1X3RtcDYpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3NobF90bCh0MCwgdDAsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV90bXA1LCB0Y2dfY29uc3RfdGwoMzIpLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bCh0MSwgdDEsIGNwdV90bXA1KTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhX2JpdHMgPSA4IDw8IG90OworICAgICAgICBpZiAoaXNfcmlnaHQpIHsKKyAgICAgICAgICAgIGlmIChvdCA9PSBPVF9MT05HKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQwLCB0MCk7CisKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyX3RsKGNwdV90bXA0LCB0MCwgY3B1X3RtcDUpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bCh0MCwgdDAsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV90bXA1LCB0Y2dfY29uc3RfdGwoZGF0YV9iaXRzKSwgdDIpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxfdGwodDEsIHQxLCBjcHVfdG1wNSk7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKHQwLCB0MCwgdDEpOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3QgPT0gT1RfTE9ORykKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bCh0MSwgdDEpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3NobF90bChjcHVfdG1wNCwgdDAsIGNwdV90bXA1KTsKKworICAgICAgICAgICAgdGNnX2dlbl9zaGxfdGwodDAsIHQwLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfdG1wNSwgdGNnX2NvbnN0X3RsKGRhdGFfYml0cyksIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyX3RsKHQxLCB0MSwgY3B1X3RtcDUpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0Y2dfZ2VuX21vdl90bCh0MSwgY3B1X3RtcDQpOworCisgICAgZ2VuX3NldF9sYWJlbChsYWJlbDEpOworICAgIC8qIHN0b3JlICovCisgICAgaWYgKG9wMSA9PSBPUl9UTVAwKSB7CisgICAgICAgIGdlbl9vcF9zdF92KG90ICsgcy0+bWVtX2luZGV4LCB0MCwgYTApOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX3Yob3QsIG9wMSwgdDApOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBlZmxhZ3MgKi8KKyAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworCisgICAgbGFiZWwyID0gZ2VuX25ld19sYWJlbCgpOworICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgdDIsIDAsIGxhYmVsMik7CisKKyAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2Nfc3JjLCB0MSk7CisgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgdDApOworICAgIGlmIChpc19yaWdodCkgeworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9jY19vcCwgQ0NfT1BfU0FSQiArIG90KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV9jY19vcCwgQ0NfT1BfU0hMQiArIG90KTsKKyAgICB9CisgICAgZ2VuX3NldF9sYWJlbChsYWJlbDIpOworICAgIHNldF9jY19vcChzLCBDQ19PUF9EWU5BTUlDKTsgLyogY2Fubm90IHByZWRpY3QgZmxhZ3MgYWZ0ZXIgKi8KKworICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgIHRjZ190ZW1wX2ZyZWUoYTApOworfQorCitzdGF0aWMgdm9pZCBnZW5fc2hpZnQoRGlzYXNDb250ZXh0ICpzMSwgaW50IG9wLCBpbnQgb3QsIGludCBkLCBpbnQgcykKK3sKKyAgICBpZiAocyAhPSBPUl9UTVAxKQorICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMSwgcyk7CisgICAgc3dpdGNoKG9wKSB7CisgICAgY2FzZSBPUF9ST0w6CisgICAgICAgIGdlbl9yb3Rfcm1fVDEoczEsIG90LCBkLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9ST1I6CisgICAgICAgIGdlbl9yb3Rfcm1fVDEoczEsIG90LCBkLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9TSEw6CisgICAgY2FzZSBPUF9TSEwxOgorICAgICAgICBnZW5fc2hpZnRfcm1fVDEoczEsIG90LCBkLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9TSFI6CisgICAgICAgIGdlbl9zaGlmdF9ybV9UMShzMSwgb3QsIGQsIDEsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX1NBUjoKKyAgICAgICAgZ2VuX3NoaWZ0X3JtX1QxKHMxLCBvdCwgZCwgMSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BfUkNMOgorICAgICAgICBnZW5fcm90Y19ybV9UMShzMSwgb3QsIGQsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX1JDUjoKKyAgICAgICAgZ2VuX3JvdGNfcm1fVDEoczEsIG90LCBkLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fc2hpZnRpKERpc2FzQ29udGV4dCAqczEsIGludCBvcCwgaW50IG90LCBpbnQgZCwgaW50IGMpCit7CisgICAgc3dpdGNoKG9wKSB7CisgICAgY2FzZSBPUF9ST0w6CisgICAgICAgIGdlbl9yb3Rfcm1faW0oczEsIG90LCBkLCBjLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9ST1I6CisgICAgICAgIGdlbl9yb3Rfcm1faW0oczEsIG90LCBkLCBjLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9TSEw6CisgICAgY2FzZSBPUF9TSEwxOgorICAgICAgICBnZW5fc2hpZnRfcm1faW0oczEsIG90LCBkLCBjLCAwLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUF9TSFI6CisgICAgICAgIGdlbl9zaGlmdF9ybV9pbShzMSwgb3QsIGQsIGMsIDEsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX1NBUjoKKyAgICAgICAgZ2VuX3NoaWZ0X3JtX2ltKHMxLCBvdCwgZCwgYywgMSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIGN1cnJlbnRseSBub3Qgb3B0aW1pemVkICovCisgICAgICAgIGdlbl9vcF9tb3ZsX1QxX2ltKGMpOworICAgICAgICBnZW5fc2hpZnQoczEsIG9wLCBvdCwgZCwgT1JfVE1QMSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX2xlYV9tb2RybShDUFVYODZTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKnMsIGludCBtb2RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyZWdfcHRyLCBpbnQgKm9mZnNldF9wdHIpCit7CisgICAgdGFyZ2V0X2xvbmcgZGlzcDsKKyAgICBpbnQgaGF2ZXNpYjsKKyAgICBpbnQgYmFzZTsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IHNjYWxlOworICAgIGludCBvcHJlZzsKKyAgICBpbnQgbW9kLCBybSwgY29kZSwgb3ZlcnJpZGUsIG11c3RfYWRkX3NlZzsKKworICAgIG92ZXJyaWRlID0gcy0+b3ZlcnJpZGU7CisgICAgbXVzdF9hZGRfc2VnID0gcy0+YWRkc2VnOworICAgIGlmIChvdmVycmlkZSA+PSAwKQorICAgICAgICBtdXN0X2FkZF9zZWcgPSAxOworICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgcm0gPSBtb2RybSAmIDc7CisKKyAgICBpZiAocy0+YWZsYWcpIHsKKworICAgICAgICBoYXZlc2liID0gMDsKKyAgICAgICAgYmFzZSA9IHJtOworICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIHNjYWxlID0gMDsKKworICAgICAgICBpZiAoYmFzZSA9PSA0KSB7CisgICAgICAgICAgICBoYXZlc2liID0gMTsKKyAgICAgICAgICAgIGNvZGUgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBzY2FsZSA9IChjb2RlID4+IDYpICYgMzsKKyAgICAgICAgICAgIGluZGV4ID0gKChjb2RlID4+IDMpICYgNykgfCBSRVhfWChzKTsKKyAgICAgICAgICAgIGJhc2UgPSAoY29kZSAmIDcpOworICAgICAgICB9CisgICAgICAgIGJhc2UgfD0gUkVYX0Iocyk7CisKKyAgICAgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKChiYXNlICYgNykgPT0gNSkgeworICAgICAgICAgICAgICAgIGJhc2UgPSAtMTsKKyAgICAgICAgICAgICAgICBkaXNwID0gKGludDMyX3QpY3B1X2xkbF9jb2RlKGVudiwgcy0+cGMpOworICAgICAgICAgICAgICAgIHMtPnBjICs9IDQ7CisgICAgICAgICAgICAgICAgaWYgKENPREU2NChzKSAmJiAhaGF2ZXNpYikgeworICAgICAgICAgICAgICAgICAgICBkaXNwICs9IHMtPnBjICsgcy0+cmlwX29mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGRpc3AgPSAoaW50OF90KWNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBkaXNwID0gY3B1X2xkbF9jb2RlKGVudiwgcy0+cGMpOworICAgICAgICAgICAgcy0+cGMgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJhc2UgPj0gMCkgeworICAgICAgICAgICAgLyogZm9yIGNvcnJlY3QgcG9wbCBoYW5kbGluZyB3aXRoIGVzcCAqLworICAgICAgICAgICAgaWYgKGJhc2UgPT0gNCAmJiBzLT5wb3BsX2VzcF9oYWNrKQorICAgICAgICAgICAgICAgIGRpc3AgKz0gcy0+cG9wbF9lc3BfaGFjazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICBpZiAocy0+YWZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZxX0EwX3JlZyhiYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9hZGRxX0EwX2ltKGRpc3ApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdmxfQTBfcmVnKGJhc2UpOworICAgICAgICAgICAgICAgIGlmIChkaXNwICE9IDApCisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX2ltKGRpc3ApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgIGlmIChzLT5hZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdnFfQTBfaW0oZGlzcCk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX2ltKGRpc3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFhYWDogaW5kZXggPT0gNCBpcyBhbHdheXMgaW52YWxpZCAqLworICAgICAgICBpZiAoaGF2ZXNpYiAmJiAoaW5kZXggIT0gNCB8fCBzY2FsZSAhPSAwKSkgeworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgIGlmIChzLT5hZmxhZyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZ2VuX29wX2FkZHFfQTBfcmVnX3NOKHNjYWxlLCBpbmRleCk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX3JlZ19zTihzY2FsZSwgaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtdXN0X2FkZF9zZWcpIHsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZSA9PSBSX0VCUCB8fCBiYXNlID09IFJfRVNQKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSA9IFJfU1M7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSA9IFJfRFM7CisgICAgICAgICAgICB9CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmFmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfYWRkcV9BMF9zZWcob3ZlcnJpZGUpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgb3ZlcnJpZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKHJtID09IDYpIHsKKyAgICAgICAgICAgICAgICBkaXNwID0gY3B1X2xkdXdfY29kZShlbnYsIHMtPnBjKTsKKyAgICAgICAgICAgICAgICBzLT5wYyArPSAyOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX2ltKGRpc3ApOworICAgICAgICAgICAgICAgIHJtID0gMDsgLyogYXZvaWQgU1Mgb3ZlcnJpZGUgKi8KKyAgICAgICAgICAgICAgICBnb3RvIG5vX3JtOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaXNwID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBkaXNwID0gKGludDhfdCljcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZGlzcCA9IGNwdV9sZHV3X2NvZGUoZW52LCBzLT5wYyk7CisgICAgICAgICAgICBzLT5wYyArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCWCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9yZWdfc04oMCwgUl9FU0kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCWCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9yZWdfc04oMCwgUl9FREkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCUCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9yZWdfc04oMCwgUl9FU0kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCUCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9yZWdfc04oMCwgUl9FREkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VTSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZ2VuX29wX21vdmxfQTBfcmVnKFJfRURJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FQlApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCWCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzcCAhPSAwKQorICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfaW0oZGlzcCk7CisgICAgICAgIGdlbl9vcF9hbmRsX0EwX2ZmZmYoKTsKKyAgICBub19ybToKKyAgICAgICAgaWYgKG11c3RfYWRkX3NlZykgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlIDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChybSA9PSAyIHx8IHJtID09IDMgfHwgcm0gPT0gNikKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBSX1NTOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGUgPSBSX0RTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfc2VnKHMsIG92ZXJyaWRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9wcmVnID0gT1JfQTA7CisgICAgZGlzcCA9IDA7CisgICAgKnJlZ19wdHIgPSBvcHJlZzsKKyAgICAqb2Zmc2V0X3B0ciA9IGRpc3A7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9ub3BfbW9kcm0oQ1BVWDg2U3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpzLCBpbnQgbW9kcm0pCit7CisgICAgaW50IG1vZCwgcm0sIGJhc2UsIGNvZGU7CisKKyAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgcmV0dXJuOworICAgIHJtID0gbW9kcm0gJiA3OworCisgICAgaWYgKHMtPmFmbGFnKSB7CisKKyAgICAgICAgYmFzZSA9IHJtOworCisgICAgICAgIGlmIChiYXNlID09IDQpIHsKKyAgICAgICAgICAgIGNvZGUgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBiYXNlID0gKGNvZGUgJiA3KTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobW9kKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGlmIChiYXNlID09IDUpIHsKKyAgICAgICAgICAgICAgICBzLT5wYyArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHMtPnBjKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcy0+cGMgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChtb2QpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKHJtID09IDYpIHsKKyAgICAgICAgICAgICAgICBzLT5wYyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHMtPnBjKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcy0+cGMgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKiB1c2VkIGZvciBMRUEgYW5kIE1PViBBWCwgbWVtICovCitzdGF0aWMgdm9pZCBnZW5fYWRkX0EwX2RzX3NlZyhEaXNhc0NvbnRleHQgKnMpCit7CisgICAgaW50IG92ZXJyaWRlLCBtdXN0X2FkZF9zZWc7CisgICAgbXVzdF9hZGRfc2VnID0gcy0+YWRkc2VnOworICAgIG92ZXJyaWRlID0gUl9EUzsKKyAgICBpZiAocy0+b3ZlcnJpZGUgPj0gMCkgeworICAgICAgICBvdmVycmlkZSA9IHMtPm92ZXJyaWRlOworICAgICAgICBtdXN0X2FkZF9zZWcgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG92ZXJyaWRlID0gUl9EUzsKKyAgICB9CisgICAgaWYgKG11c3RfYWRkX3NlZykgeworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKENPREU2NChzKSkgeworICAgICAgICAgICAgZ2VuX29wX2FkZHFfQTBfc2VnKG92ZXJyaWRlKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfc2VnKHMsIG92ZXJyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogZ2VuZXJhdGUgbW9kcm0gbWVtb3J5IGxvYWQgb3Igc3RvcmUgb2YgJ3JlZycuIFRNUDAgaXMgdXNlZCBpZiByZWcgPT0KKyAgIE9SX1RNUDAgKi8KK3N0YXRpYyB2b2lkIGdlbl9sZHN0X21vZHJtKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IG1vZHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG90LCBpbnQgcmVnLCBpbnQgaXNfc3RvcmUpCit7CisgICAgaW50IG1vZCwgcm0sIG9wcmVnLCBkaXNwOworCisgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgIGlmIChpc19zdG9yZSkgeworICAgICAgICAgICAgaWYgKHJlZyAhPSBPUl9UTVAwKQorICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCByZWcpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCBybSk7CisgICAgICAgICAgICBpZiAocmVnICE9IE9SX1RNUDApCisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJlZyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZvcHJlZywgJmRpc3ApOworICAgICAgICBpZiAoaXNfc3RvcmUpIHsKKyAgICAgICAgICAgIGlmIChyZWcgIT0gT1JfVE1QMCkKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgcmVnKTsKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgaWYgKHJlZyAhPSBPUl9UTVAwKQorICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCByZWcpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGluc25fZ2V0KENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IG90KQoreworICAgIHVpbnQzMl90IHJldDsKKworICAgIHN3aXRjaChvdCkgeworICAgIGNhc2UgT1RfQllURToKKyAgICAgICAgcmV0ID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKTsKKyAgICAgICAgcy0+cGMrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICByZXQgPSBjcHVfbGR1d19jb2RlKGVudiwgcy0+cGMpOworICAgICAgICBzLT5wYyArPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgT1RfTE9ORzoKKyAgICAgICAgcmV0ID0gY3B1X2xkbF9jb2RlKGVudiwgcy0+cGMpOworICAgICAgICBzLT5wYyArPSA0OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5zbl9jb25zdF9zaXplKHVuc2lnbmVkIGludCBvdCkKK3sKKyAgICBpZiAob3QgPD0gT1RfTE9ORykKKyAgICAgICAgcmV0dXJuIDEgPDwgb3Q7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9nb3RvX3RiKERpc2FzQ29udGV4dCAqcywgaW50IHRiX251bSwgdGFyZ2V0X3Vsb25nIGVpcCkKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKyAgICB0YXJnZXRfdWxvbmcgcGM7CisKKyAgICBwYyA9IHMtPmNzX2Jhc2UgKyBlaXA7CisgICAgdGIgPSBzLT50YjsKKyAgICAvKiBOT1RFOiB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIFRCIHNwYW5zIHR3byBwYWdlcyBoZXJlICovCisgICAgaWYgKChwYyAmIFRBUkdFVF9QQUdFX01BU0spID09ICh0Yi0+cGMgJiBUQVJHRVRfUEFHRV9NQVNLKSB8fAorICAgICAgICAocGMgJiBUQVJHRVRfUEFHRV9NQVNLKSA9PSAoKHMtPnBjIC0gMSkgJiBUQVJHRVRfUEFHRV9NQVNLKSkgIHsKKyAgICAgICAgLyoganVtcCB0byBzYW1lIHBhZ2U6IHdlIGNhbiB1c2UgYSBkaXJlY3QganVtcCAqLworICAgICAgICB0Y2dfZ2VuX2dvdG9fdGIodGJfbnVtKTsKKyAgICAgICAgZ2VuX2ptcF9pbShlaXApOworICAgICAgICB0Y2dfZ2VuX2V4aXRfdGIoKHVpbnRwdHJfdCl0YiArIHRiX251bSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoganVtcCB0byBhbm90aGVyIHBhZ2U6IGN1cnJlbnRseSBub3Qgb3B0aW1pemVkICovCisgICAgICAgIGdlbl9qbXBfaW0oZWlwKTsKKyAgICAgICAgZ2VuX2VvYihzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5famNjKERpc2FzQ29udGV4dCAqcywgaW50IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgdmFsLCB0YXJnZXRfdWxvbmcgbmV4dF9laXApCit7CisgICAgaW50IGwxLCBsMjsKKworICAgIGlmIChzLT5qbXBfb3B0KSB7CisgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgIGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICBnZW5famNjMShzLCBiLCBsMSk7CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9EWU5BTUlDKTsKKworICAgICAgICBnZW5fZ290b190YihzLCAwLCBuZXh0X2VpcCk7CisKKyAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgIGdlbl9nb3RvX3RiKHMsIDEsIHZhbCk7CisgICAgICAgIHMtPmlzX2ptcCA9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgIGwyID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICBnZW5famNjMShzLCBiLCBsMSk7CisKKyAgICAgICAgZ2VuX2ptcF9pbShuZXh0X2VpcCk7CisgICAgICAgIHRjZ19nZW5fYnIobDIpOworCisgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICBnZW5fam1wX2ltKHZhbCk7CisgICAgICAgIGdlbl9zZXRfbGFiZWwobDIpOworICAgICAgICBnZW5fZW9iKHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX3NldGNjKERpc2FzQ29udGV4dCAqcywgaW50IGIpCit7CisgICAgaW50IGludiwgamNjX29wLCBsMTsKKyAgICBUQ0d2IHQwOworCisgICAgaWYgKGlzX2Zhc3RfamNjX2Nhc2UocywgYikpIHsKKyAgICAgICAgLyogbm9taW5hbCBjYXNlOiB3ZSB1c2UgYSBqdW1wICovCisgICAgICAgIC8qIFhYWDogbWFrZSBpdCBmYXN0ZXIgYnkgYWRkaW5nIG5ldyBpbnN0cnVjdGlvbnMgaW4gVENHICovCisgICAgICAgIHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgMCk7CisgICAgICAgIGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICBnZW5famNjMShzLCBiIF4gMSwgbDEpOworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIDEpOworICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X1RbMF0sIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogc2xvdyBjYXNlOiBpdCBpcyBtb3JlIGVmZmljaWVudCBub3QgdG8gZ2VuZXJhdGUgYSBqdW1wLAorICAgICAgICAgICBhbHRob3VnaCBpdCBpcyBxdWVzdGlvbm5hYmxlIHdoZXRoZXIgdGhpcyBvcHRpbWl6YXRpb24gaXMKKyAgICAgICAgICAgd29ydGggdG8gKi8KKyAgICAgICAgaW52ID0gYiAmIDE7CisgICAgICAgIGpjY19vcCA9IChiID4+IDEpICYgNzsKKyAgICAgICAgZ2VuX3NldGNjX3Nsb3cocywgamNjX29wLCBjcHVfVFswXSwgaW52KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92bF9UMF9zZWcoaW50IHNlZ19yZWcpCit7CisgICAgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2VudiwgCisgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSxzZWdzW3NlZ19yZWddLnNlbGVjdG9yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92bF9zZWdfVDBfdm0oaW50IHNlZ19yZWcpCit7CisgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgMHhmZmZmKTsKKyAgICB0Y2dfZ2VuX3N0MzJfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIAorICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSxzZWdzW3NlZ19yZWddLnNlbGVjdG9yKSk7CisgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgNCk7CisgICAgdGNnX2dlbl9zdF90bChjcHVfVFswXSwgY3B1X2VudiwgCisgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSxzZWdzW3NlZ19yZWddLmJhc2UpKTsKK30KKworLyogbW92ZSBUMCB0byBzZWdfcmVnIGFuZCBjb21wdXRlIGlmIHRoZSBDUFUgc3RhdGUgbWF5IGNoYW5nZS4gTmV2ZXIKKyAgIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNlZ19yZWcgPT0gUl9DUyAqLworc3RhdGljIHZvaWQgZ2VuX21vdmxfc2VnX1QwKERpc2FzQ29udGV4dCAqcywgaW50IHNlZ19yZWcsIHRhcmdldF91bG9uZyBjdXJfZWlwKQoreworICAgIGlmIChzLT5wZSAmJiAhcy0+dm04NikgeworICAgICAgICAvKiBYWFg6IG9wdGltaXplIGJ5IGZpbmRpbmcgcHJvY2Vzc29yIHN0YXRlIGR5bmFtaWNhbGx5ICovCisgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgIGdlbl9qbXBfaW0oY3VyX2VpcCk7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICBnZW5faGVscGVyX2xvYWRfc2VnKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoc2VnX3JlZyksIGNwdV90bXAyX2kzMik7CisgICAgICAgIC8qIGFib3J0IHRyYW5zbGF0aW9uIGJlY2F1c2UgdGhlIGFkZHNlZyB2YWx1ZSBtYXkgY2hhbmdlIG9yCisgICAgICAgICAgIGJlY2F1c2Ugc3MzMiBtYXkgY2hhbmdlLiBGb3IgUl9TUywgdHJhbnNsYXRpb24gbXVzdCBhbHdheXMKKyAgICAgICAgICAgc3RvcCBhcyBhIHNwZWNpYWwgaGFuZGxpbmcgbXVzdCBiZSBkb25lIHRvIGRpc2FibGUgaGFyZHdhcmUKKyAgICAgICAgICAgaW50ZXJydXB0cyBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgaWYgKHNlZ19yZWcgPT0gUl9TUyB8fCAocy0+Y29kZTMyICYmIHNlZ19yZWcgPCBSX0ZTKSkKKyAgICAgICAgICAgIHMtPmlzX2ptcCA9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX29wX21vdmxfc2VnX1QwX3ZtKHNlZ19yZWcpOworICAgICAgICBpZiAoc2VnX3JlZyA9PSBSX1NTKQorICAgICAgICAgICAgcy0+aXNfam1wID0gMzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN2bV9pc19yZXAoaW50IHByZWZpeGVzKQoreworICAgIHJldHVybiAoKHByZWZpeGVzICYgKFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkgPyA4IDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ2VuX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0oRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRfdWxvbmcgcGNfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlLCB1aW50NjRfdCBwYXJhbSkKK3sKKyAgICAvKiBubyBTVk0gYWN0aXZhdGVkOyBmYXN0IGNhc2UgKi8KKyAgICBpZiAobGlrZWx5KCEocy0+ZmxhZ3MgJiBIRl9TVk1JX01BU0spKSkKKyAgICAgICAgcmV0dXJuOworICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgIGdlbl9oZWxwZXJfc3ZtX2NoZWNrX2ludGVyY2VwdF9wYXJhbShjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY29uc3RfaTY0KHBhcmFtKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQoRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRfdWxvbmcgcGNfc3RhcnQsIHVpbnQ2NF90IHR5cGUpCit7CisgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHRfcGFyYW0ocywgcGNfc3RhcnQsIHR5cGUsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0YWNrX3VwZGF0ZShEaXNhc0NvbnRleHQgKnMsIGludCBhZGRlbmQpCit7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChDT0RFNjQocykpIHsKKyAgICAgICAgZ2VuX29wX2FkZF9yZWdfaW0oMiwgUl9FU1AsIGFkZGVuZCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAocy0+c3MzMikgeworICAgICAgICBnZW5fb3BfYWRkX3JlZ19pbSgxLCBSX0VTUCwgYWRkZW5kKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfYWRkX3JlZ19pbSgwLCBSX0VTUCwgYWRkZW5kKTsKKyAgICB9Cit9CisKKy8qIGdlbmVyYXRlIGEgcHVzaC4gSXQgZGVwZW5kcyBvbiBzczMyLCBhZGRzZWcgYW5kIGRmbGFnICovCitzdGF0aWMgdm9pZCBnZW5fcHVzaF9UMChEaXNhc0NvbnRleHQgKnMpCit7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChDT0RFNjQocykpIHsKKyAgICAgICAgZ2VuX29wX21vdnFfQTBfcmVnKFJfRVNQKTsKKyAgICAgICAgaWYgKHMtPmRmbGFnKSB7CisgICAgICAgICAgICBnZW5fb3BfYWRkcV9BMF9pbSgtOCk7CisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAoT1RfUVVBRCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfYWRkcV9BMF9pbSgtMik7CisgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAoT1RfV09SRCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX21vdl9yZWdfQTAoMiwgUl9FU1ApOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FU1ApOworICAgICAgICBpZiAoIXMtPmRmbGFnKQorICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfaW0oLTIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9pbSgtNCk7CisgICAgICAgIGlmIChzLT5zczMyKSB7CisgICAgICAgICAgICBpZiAocy0+YWRkc2VnKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X1RbMV0sIGNwdV9BMCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfc2VnKHMsIFJfU1MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX2FuZGxfQTBfZmZmZigpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X1RbMV0sIGNwdV9BMCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgUl9TUyk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX3N0X1QwX0EwKHMtPmRmbGFnICsgMSArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIGlmIChzLT5zczMyICYmICFzLT5hZGRzZWcpCisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19BMCgxLCBSX0VTUCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QxKHMtPnNzMzIgKyAxLCBSX0VTUCk7CisgICAgfQorfQorCisvKiBnZW5lcmF0ZSBhIHB1c2guIEl0IGRlcGVuZHMgb24gc3MzMiwgYWRkc2VnIGFuZCBkZmxhZyAqLworLyogc2xvd2VyIHZlcnNpb24gZm9yIFQxLCBvbmx5IHVzZWQgZm9yIGNhbGwgRXYgKi8KK3N0YXRpYyB2b2lkIGdlbl9wdXNoX1QxKERpc2FzQ29udGV4dCAqcykKK3sKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKENPREU2NChzKSkgeworICAgICAgICBnZW5fb3BfbW92cV9BMF9yZWcoUl9FU1ApOworICAgICAgICBpZiAocy0+ZGZsYWcpIHsKKyAgICAgICAgICAgIGdlbl9vcF9hZGRxX0EwX2ltKC04KTsKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMV9BMChPVF9RVUFEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9vcF9hZGRxX0EwX2ltKC0yKTsKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChPVF9XT1JEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfbW92X3JlZ19BMCgyLCBSX0VTUCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VTUCk7CisgICAgICAgIGlmICghcy0+ZGZsYWcpCisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9pbSgtMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX2ltKC00KTsKKyAgICAgICAgaWYgKHMtPnNzMzIpIHsKKyAgICAgICAgICAgIGlmIChzLT5hZGRzZWcpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgUl9TUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfYW5kbF9BMF9mZmZmKCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9BMF9zZWcocywgUl9TUyk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX3N0X1QxX0EwKHMtPmRmbGFnICsgMSArIHMtPm1lbV9pbmRleCk7CisKKyAgICAgICAgaWYgKHMtPnNzMzIgJiYgIXMtPmFkZHNlZykKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX0EwKDEsIFJfRVNQKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ2VuX3N0YWNrX3VwZGF0ZShzLCAoLTIpIDw8IHMtPmRmbGFnKTsKKyAgICB9Cit9CisKKy8qIHR3byBzdGVwIHBvcCBpcyBuZWNlc3NhcnkgZm9yIHByZWNpc2UgZXhjZXB0aW9ucyAqLworc3RhdGljIHZvaWQgZ2VuX3BvcF9UMChEaXNhc0NvbnRleHQgKnMpCit7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGlmIChDT0RFNjQocykpIHsKKyAgICAgICAgZ2VuX29wX21vdnFfQTBfcmVnKFJfRVNQKTsKKyAgICAgICAgZ2VuX29wX2xkX1QwX0EwKChzLT5kZmxhZyA/IE9UX1FVQUQgOiBPVF9XT1JEKSArIHMtPm1lbV9pbmRleCk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VTUCk7CisgICAgICAgIGlmIChzLT5zczMyKSB7CisgICAgICAgICAgICBpZiAocy0+YWRkc2VnKQorICAgICAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBSX1NTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9vcF9hbmRsX0EwX2ZmZmYoKTsKKyAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBSX1NTKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfbGRfVDBfQTAocy0+ZGZsYWcgKyAxICsgcy0+bWVtX2luZGV4KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9wb3BfdXBkYXRlKERpc2FzQ29udGV4dCAqcykKK3sKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKENPREU2NChzKSAmJiBzLT5kZmxhZykgeworICAgICAgICBnZW5fc3RhY2tfdXBkYXRlKHMsIDgpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBnZW5fc3RhY2tfdXBkYXRlKHMsIDIgPDwgcy0+ZGZsYWcpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX3N0YWNrX0EwKERpc2FzQ29udGV4dCAqcykKK3sKKyAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FU1ApOworICAgIGlmICghcy0+c3MzMikKKyAgICAgICAgZ2VuX29wX2FuZGxfQTBfZmZmZigpOworICAgIHRjZ19nZW5fbW92X3RsKGNwdV9UWzFdLCBjcHVfQTApOworICAgIGlmIChzLT5hZGRzZWcpCisgICAgICAgIGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBSX1NTKTsKK30KKworLyogTk9URTogd3JhcCBhcm91bmQgaW4gMTYgYml0IG5vdCBmdWxseSBoYW5kbGVkICovCitzdGF0aWMgdm9pZCBnZW5fcHVzaGEoRGlzYXNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VTUCk7CisgICAgZ2VuX29wX2FkZGxfQTBfaW0oLTE2IDw8ICBzLT5kZmxhZyk7CisgICAgaWYgKCFzLT5zczMyKQorICAgICAgICBnZW5fb3BfYW5kbF9BMF9mZmZmKCk7CisgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X1RbMV0sIGNwdV9BMCk7CisgICAgaWYgKHMtPmFkZHNlZykKKyAgICAgICAgZ2VuX29wX2FkZGxfQTBfc2VnKHMsIFJfU1MpOworICAgIGZvcihpID0gMDtpIDwgODsgaSsrKSB7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0xPTkcsIDAsIDcgLSBpKTsKKyAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX1dPUkQgKyBzLT5kZmxhZyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIGdlbl9vcF9hZGRsX0EwX2ltKDIgPDwgIHMtPmRmbGFnKTsKKyAgICB9CisgICAgZ2VuX29wX21vdl9yZWdfVDEoT1RfV09SRCArIHMtPnNzMzIsIFJfRVNQKTsKK30KKworLyogTk9URTogd3JhcCBhcm91bmQgaW4gMTYgYml0IG5vdCBmdWxseSBoYW5kbGVkICovCitzdGF0aWMgdm9pZCBnZW5fcG9wYShEaXNhc0NvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisgICAgZ2VuX29wX21vdmxfQTBfcmVnKFJfRVNQKTsKKyAgICBpZiAoIXMtPnNzMzIpCisgICAgICAgIGdlbl9vcF9hbmRsX0EwX2ZmZmYoKTsKKyAgICB0Y2dfZ2VuX21vdl90bChjcHVfVFsxXSwgY3B1X0EwKTsKKyAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X1RbMV0sIGNwdV9UWzFdLCAxNiA8PCAgcy0+ZGZsYWcpOworICAgIGlmIChzLT5hZGRzZWcpCisgICAgICAgIGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBSX1NTKTsKKyAgICBmb3IoaSA9IDA7aSA8IDg7IGkrKykgeworICAgICAgICAvKiBFU1AgaXMgbm90IHJlbG9hZGVkICovCisgICAgICAgIGlmIChpICE9IDMpIHsKKyAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9XT1JEICsgcy0+ZGZsYWcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCArIHMtPmRmbGFnLCA3IC0gaSk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX2FkZGxfQTBfaW0oMiA8PCAgcy0+ZGZsYWcpOworICAgIH0KKyAgICBnZW5fb3BfbW92X3JlZ19UMShPVF9XT1JEICsgcy0+c3MzMiwgUl9FU1ApOworfQorCitzdGF0aWMgdm9pZCBnZW5fZW50ZXIoRGlzYXNDb250ZXh0ICpzLCBpbnQgZXNwX2FkZGVuZCwgaW50IGxldmVsKQoreworICAgIGludCBvdCwgb3BzaXplOworCisgICAgbGV2ZWwgJj0gMHgxZjsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgaWYgKENPREU2NChzKSkgeworICAgICAgICBvdCA9IHMtPmRmbGFnID8gT1RfUVVBRCA6IE9UX1dPUkQ7CisgICAgICAgIG9wc2l6ZSA9IDEgPDwgb3Q7CisKKyAgICAgICAgZ2VuX29wX21vdmxfQTBfcmVnKFJfRVNQKTsKKyAgICAgICAgZ2VuX29wX2FkZHFfQTBfaW0oLW9wc2l6ZSk7CisgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9UWzFdLCBjcHVfQTApOworCisgICAgICAgIC8qIHB1c2ggYnAgKi8KKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfTE9ORywgMCwgUl9FQlApOworICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgIC8qIFhYWDogbXVzdCBzYXZlIHN0YXRlICovCisgICAgICAgICAgICBnZW5faGVscGVyX2VudGVyNjRfbGV2ZWwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihsZXZlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMigob3QgPT0gT1RfUVVBRCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9UWzFdKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfbW92X3JlZ19UMShvdCwgUl9FQlApOworICAgICAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X1RbMV0sIGNwdV9UWzFdLCAtZXNwX2FkZGVuZCArICgtb3BzaXplICogbGV2ZWwpKTsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDEoT1RfUVVBRCwgUl9FU1ApOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgeworICAgICAgICBvdCA9IHMtPmRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgb3BzaXplID0gMiA8PCBzLT5kZmxhZzsKKworICAgICAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FU1ApOworICAgICAgICBnZW5fb3BfYWRkbF9BMF9pbSgtb3BzaXplKTsKKyAgICAgICAgaWYgKCFzLT5zczMyKQorICAgICAgICAgICAgZ2VuX29wX2FuZGxfQTBfZmZmZigpOworICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfVFsxXSwgY3B1X0EwKTsKKyAgICAgICAgaWYgKHMtPmFkZHNlZykKKyAgICAgICAgICAgIGdlbl9vcF9hZGRsX0EwX3NlZyhzLCBSX1NTKTsKKyAgICAgICAgLyogcHVzaCBicCAqLworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCBSX0VCUCk7CisgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIGlmIChsZXZlbCkgeworICAgICAgICAgICAgLyogWFhYOiBtdXN0IHNhdmUgc3RhdGUgKi8KKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZW50ZXJfbGV2ZWwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihsZXZlbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIocy0+ZGZsYWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfVFsxXSk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDEob3QsIFJfRUJQKTsKKyAgICAgICAgdGNnX2dlbl9hZGRpX3RsKGNwdV9UWzFdLCBjcHVfVFsxXSwgLWVzcF9hZGRlbmQgKyAoLW9wc2l6ZSAqIGxldmVsKSk7CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QxKE9UX1dPUkQgKyBzLT5zczMyLCBSX0VTUCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5fZXhjZXB0aW9uKERpc2FzQ29udGV4dCAqcywgaW50IHRyYXBubywgdGFyZ2V0X3Vsb25nIGN1cl9laXApCit7CisgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICBnZW5fam1wX2ltKGN1cl9laXApOworICAgIGdlbl9oZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIodHJhcG5vKSk7CisgICAgcy0+aXNfam1wID0gMzsKK30KKworLyogYW4gaW50ZXJydXB0IGlzIGRpZmZlcmVudCBmcm9tIGFuIGV4Y2VwdGlvbiBiZWNhdXNlIG9mIHRoZQorICAgcHJpdmlsZWdlIGNoZWNrcyAqLworc3RhdGljIHZvaWQgZ2VuX2ludGVycnVwdChEaXNhc0NvbnRleHQgKnMsIGludCBpbnRubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGN1cl9laXAsIHRhcmdldF91bG9uZyBuZXh0X2VpcCkKK3sKKyAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgIGdlbl9qbXBfaW0oY3VyX2VpcCk7CisgICAgZ2VuX2hlbHBlcl9yYWlzZV9pbnRlcnJ1cHQoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihpbnRubyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihuZXh0X2VpcCAtIGN1cl9laXApKTsKKyAgICBzLT5pc19qbXAgPSAzOworfQorCitzdGF0aWMgdm9pZCBnZW5fZGVidWcoRGlzYXNDb250ZXh0ICpzLCB0YXJnZXRfdWxvbmcgY3VyX2VpcCkKK3sKKyAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgIGdlbl9qbXBfaW0oY3VyX2VpcCk7CisgICAgZ2VuX2hlbHBlcl9kZWJ1ZyhjcHVfZW52KTsKKyAgICBzLT5pc19qbXAgPSAzOworfQorCisvKiBnZW5lcmF0ZSBhIGdlbmVyaWMgZW5kIG9mIGJsb2NrLiBUcmFjZSBleGNlcHRpb24gaXMgYWxzbyBnZW5lcmF0ZWQKKyAgIGlmIG5lZWRlZCAqLworc3RhdGljIHZvaWQgZ2VuX2VvYihEaXNhc0NvbnRleHQgKnMpCit7CisgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICBpZiAocy0+dGItPmZsYWdzICYgSEZfSU5ISUJJVF9JUlFfTUFTSykgeworICAgICAgICBnZW5faGVscGVyX3Jlc2V0X2luaGliaXRfaXJxKGNwdV9lbnYpOworICAgIH0KKyAgICBpZiAocy0+dGItPmZsYWdzICYgSEZfUkZfTUFTSykgeworICAgICAgICBnZW5faGVscGVyX3Jlc2V0X3JmKGNwdV9lbnYpOworICAgIH0KKyAgICBpZiAocy0+c2luZ2xlc3RlcF9lbmFibGVkKSB7CisgICAgICAgIGdlbl9oZWxwZXJfZGVidWcoY3B1X2Vudik7CisgICAgfSBlbHNlIGlmIChzLT50ZikgeworCWdlbl9oZWxwZXJfc2luZ2xlX3N0ZXAoY3B1X2Vudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9leGl0X3RiKDApOworICAgIH0KKyAgICBzLT5pc19qbXAgPSAzOworfQorCisvKiBnZW5lcmF0ZSBhIGp1bXAgdG8gZWlwLiBObyBzZWdtZW50IGNoYW5nZSBtdXN0IGhhcHBlbiBiZWZvcmUgYXMgYQorICAgZGlyZWN0IGNhbGwgdG8gdGhlIG5leHQgYmxvY2sgbWF5IG9jY3VyICovCitzdGF0aWMgdm9pZCBnZW5fam1wX3RiKERpc2FzQ29udGV4dCAqcywgdGFyZ2V0X3Vsb25nIGVpcCwgaW50IHRiX251bSkKK3sKKyAgICBpZiAocy0+am1wX29wdCkgeworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5fZ290b190YihzLCB0Yl9udW0sIGVpcCk7CisgICAgICAgIHMtPmlzX2ptcCA9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuX2ptcF9pbShlaXApOworICAgICAgICBnZW5fZW9iKHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2VuX2ptcChEaXNhc0NvbnRleHQgKnMsIHRhcmdldF91bG9uZyBlaXApCit7CisgICAgZ2VuX2ptcF90YihzLCBlaXAsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2xkcV9lbnZfQTAoaW50IGlkeCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgbWVtX2luZGV4ID0gKGlkeCA+PiAyKSAtIDE7CisgICAgdGNnX2dlbl9xZW11X2xkNjQoY3B1X3RtcDFfaTY0LCBjcHVfQTAsIG1lbV9pbmRleCk7CisgICAgdGNnX2dlbl9zdF9pNjQoY3B1X3RtcDFfaTY0LCBjcHVfZW52LCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0cV9lbnZfQTAoaW50IGlkeCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgbWVtX2luZGV4ID0gKGlkeCA+PiAyKSAtIDE7CisgICAgdGNnX2dlbl9sZF9pNjQoY3B1X3RtcDFfaTY0LCBjcHVfZW52LCBvZmZzZXQpOworICAgIHRjZ19nZW5fcWVtdV9zdDY0KGNwdV90bXAxX2k2NCwgY3B1X0EwLCBtZW1faW5kZXgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX2xkb19lbnZfQTAoaW50IGlkeCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgbWVtX2luZGV4ID0gKGlkeCA+PiAyKSAtIDE7CisgICAgdGNnX2dlbl9xZW11X2xkNjQoY3B1X3RtcDFfaTY0LCBjcHVfQTAsIG1lbV9pbmRleCk7CisgICAgdGNnX2dlbl9zdF9pNjQoY3B1X3RtcDFfaTY0LCBjcHVfZW52LCBvZmZzZXQgKyBvZmZzZXRvZihYTU1SZWcsIFhNTV9RKDApKSk7CisgICAgdGNnX2dlbl9hZGRpX3RsKGNwdV90bXAwLCBjcHVfQTAsIDgpOworICAgIHRjZ19nZW5fcWVtdV9sZDY0KGNwdV90bXAxX2k2NCwgY3B1X3RtcDAsIG1lbV9pbmRleCk7CisgICAgdGNnX2dlbl9zdF9pNjQoY3B1X3RtcDFfaTY0LCBjcHVfZW52LCBvZmZzZXQgKyBvZmZzZXRvZihYTU1SZWcsIFhNTV9RKDEpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3RvX2Vudl9BMChpbnQgaWR4LCBpbnQgb2Zmc2V0KQoreworICAgIGludCBtZW1faW5kZXggPSAoaWR4ID4+IDIpIC0gMTsKKyAgICB0Y2dfZ2VuX2xkX2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsIG9mZnNldCArIG9mZnNldG9mKFhNTVJlZywgWE1NX1EoMCkpKTsKKyAgICB0Y2dfZ2VuX3FlbXVfc3Q2NChjcHVfdG1wMV9pNjQsIGNwdV9BMCwgbWVtX2luZGV4KTsKKyAgICB0Y2dfZ2VuX2FkZGlfdGwoY3B1X3RtcDAsIGNwdV9BMCwgOCk7CisgICAgdGNnX2dlbl9sZF9pNjQoY3B1X3RtcDFfaTY0LCBjcHVfZW52LCBvZmZzZXQgKyBvZmZzZXRvZihYTU1SZWcsIFhNTV9RKDEpKSk7CisgICAgdGNnX2dlbl9xZW11X3N0NjQoY3B1X3RtcDFfaTY0LCBjcHVfdG1wMCwgbWVtX2luZGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZvKGludCBkX29mZnNldCwgaW50IHNfb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRfaTY0KGNwdV90bXAxX2k2NCwgY3B1X2Vudiwgc19vZmZzZXQpOworICAgIHRjZ19nZW5fc3RfaTY0KGNwdV90bXAxX2k2NCwgY3B1X2VudiwgZF9vZmZzZXQpOworICAgIHRjZ19nZW5fbGRfaTY0KGNwdV90bXAxX2k2NCwgY3B1X2Vudiwgc19vZmZzZXQgKyA4KTsKKyAgICB0Y2dfZ2VuX3N0X2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsIGRfb2Zmc2V0ICsgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfbW92cShpbnQgZF9vZmZzZXQsIGludCBzX29mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkX2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsIHNfb2Zmc2V0KTsKKyAgICB0Y2dfZ2VuX3N0X2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsIGRfb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9vcF9tb3ZsKGludCBkX29mZnNldCwgaW50IHNfb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRfaTMyKGNwdV90bXAyX2kzMiwgY3B1X2Vudiwgc19vZmZzZXQpOworICAgIHRjZ19nZW5fc3RfaTMyKGNwdV90bXAyX2kzMiwgY3B1X2VudiwgZF9vZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX29wX21vdnFfZW52XzAoaW50IGRfb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbW92aV9pNjQoY3B1X3RtcDFfaTY0LCAwKTsKKyAgICB0Y2dfZ2VuX3N0X2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsIGRfb2Zmc2V0KTsKK30KKwordHlwZWRlZiB2b2lkICgqU1NFRnVuY19pX2VwKShUQ0d2X2kzMiB2YWwsIFRDR3ZfcHRyIGVudiwgVENHdl9wdHIgcmVnKTsKK3R5cGVkZWYgdm9pZCAoKlNTRUZ1bmNfbF9lcCkoVENHdl9pNjQgdmFsLCBUQ0d2X3B0ciBlbnYsIFRDR3ZfcHRyIHJlZyk7Cit0eXBlZGVmIHZvaWQgKCpTU0VGdW5jXzBfZXBpKShUQ0d2X3B0ciBlbnYsIFRDR3ZfcHRyIHJlZywgVENHdl9pMzIgdmFsKTsKK3R5cGVkZWYgdm9pZCAoKlNTRUZ1bmNfMF9lcGwpKFRDR3ZfcHRyIGVudiwgVENHdl9wdHIgcmVnLCBUQ0d2X2k2NCB2YWwpOwordHlwZWRlZiB2b2lkICgqU1NFRnVuY18wX2VwcCkoVENHdl9wdHIgZW52LCBUQ0d2X3B0ciByZWdfYSwgVENHdl9wdHIgcmVnX2IpOwordHlwZWRlZiB2b2lkICgqU1NFRnVuY18wX2VwcGkpKFRDR3ZfcHRyIGVudiwgVENHdl9wdHIgcmVnX2EsIFRDR3ZfcHRyIHJlZ19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIHZhbCk7Cit0eXBlZGVmIHZvaWQgKCpTU0VGdW5jXzBfcHBpKShUQ0d2X3B0ciByZWdfYSwgVENHdl9wdHIgcmVnX2IsIFRDR3ZfaTMyIHZhbCk7Cit0eXBlZGVmIHZvaWQgKCpTU0VGdW5jXzBfZXBwdCkoVENHdl9wdHIgZW52LCBUQ0d2X3B0ciByZWdfYSwgVENHdl9wdHIgcmVnX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdiB2YWwpOworCisjZGVmaW5lIFNTRV9TUEVDSUFMICgodm9pZCAqKTEpCisjZGVmaW5lIFNTRV9EVU1NWSAoKHZvaWQgKikyKQorCisjZGVmaW5lIE1NWF9PUDIoeCkgeyBnZW5faGVscGVyXyAjIyB4ICMjIF9tbXgsIGdlbl9oZWxwZXJfICMjIHggIyMgX3htbSB9CisjZGVmaW5lIFNTRV9GT1AoeCkgeyBnZW5faGVscGVyXyAjIyB4ICMjIHBzLCBnZW5faGVscGVyXyAjIyB4ICMjIHBkLCBcCisgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyXyAjIyB4ICMjIHNzLCBnZW5faGVscGVyXyAjIyB4ICMjIHNkLCB9CisKK3N0YXRpYyBjb25zdCBTU0VGdW5jXzBfZXBwIHNzZV9vcF90YWJsZTFbMjU2XVs0XSA9IHsKKyAgICAvKiAzRE5vdyEgZXh0ZW5zaW9ucyAqLworICAgIFsweDBlXSA9IHsgU1NFX0RVTU1ZIH0sIC8qIGZlbW1zICovCisgICAgWzB4MGZdID0geyBTU0VfRFVNTVkgfSwgLyogcGYuLi4gKi8KKyAgICAvKiBwdXJlIFNTRSBvcGVyYXRpb25zICovCisgICAgWzB4MTBdID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBtb3Z1cHMsIG1vdnVwZCwgbW92c3MsIG1vdnNkICovCisgICAgWzB4MTFdID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBtb3Z1cHMsIG1vdnVwZCwgbW92c3MsIG1vdnNkICovCisgICAgWzB4MTJdID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBtb3ZscHMsIG1vdmxwZCwgbW92c2xkdXAsIG1vdmRkdXAgKi8KKyAgICBbMHgxM10gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAgLyogbW92bHBzLCBtb3ZscGQgKi8KKyAgICBbMHgxNF0gPSB7IGdlbl9oZWxwZXJfcHVucGNrbGRxX3htbSwgZ2VuX2hlbHBlcl9wdW5wY2tscWRxX3htbSB9LAorICAgIFsweDE1XSA9IHsgZ2VuX2hlbHBlcl9wdW5wY2toZHFfeG1tLCBnZW5faGVscGVyX3B1bnBja2hxZHFfeG1tIH0sCisgICAgWzB4MTZdID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sICAvKiBtb3ZocHMsIG1vdmhwZCwgbW92c2hkdXAgKi8KKyAgICBbMHgxN10gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAgLyogbW92aHBzLCBtb3ZocGQgKi8KKworICAgIFsweDI4XSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sICAvKiBtb3ZhcHMsIG1vdmFwZCAqLworICAgIFsweDI5XSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sICAvKiBtb3ZhcHMsIG1vdmFwZCAqLworICAgIFsweDJhXSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwgfSwgLyogY3Z0cGkycHMsIGN2dHBpMnBkLCBjdnRzaTJzcywgY3Z0c2kyc2QgKi8KKyAgICBbMHgyYl0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sIC8qIG1vdm50cHMsIG1vdm50cGQsIG1vdm50c3MsIG1vdm50c2QgKi8KKyAgICBbMHgyY10gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sIC8qIGN2dHRwczJwaSwgY3Z0dHBkMnBpLCBjdnR0c2Qyc2ksIGN2dHRzczJzaSAqLworICAgIFsweDJkXSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwgfSwgLyogY3Z0cHMycGksIGN2dHBkMnBpLCBjdnRzZDJzaSwgY3Z0c3Myc2kgKi8KKyAgICBbMHgyZV0gPSB7IGdlbl9oZWxwZXJfdWNvbWlzcywgZ2VuX2hlbHBlcl91Y29taXNkIH0sCisgICAgWzB4MmZdID0geyBnZW5faGVscGVyX2NvbWlzcywgZ2VuX2hlbHBlcl9jb21pc2QgfSwKKyAgICBbMHg1MF0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBtb3Ztc2twcywgbW92bXNrcGQgKi8KKyAgICBbMHg1MV0gPSBTU0VfRk9QKHNxcnQpLAorICAgIFsweDUyXSA9IHsgZ2VuX2hlbHBlcl9yc3FydHBzLCBOVUxMLCBnZW5faGVscGVyX3JzcXJ0c3MsIE5VTEwgfSwKKyAgICBbMHg1M10gPSB7IGdlbl9oZWxwZXJfcmNwcHMsIE5VTEwsIGdlbl9oZWxwZXJfcmNwc3MsIE5VTEwgfSwKKyAgICBbMHg1NF0gPSB7IGdlbl9oZWxwZXJfcGFuZF94bW0sIGdlbl9oZWxwZXJfcGFuZF94bW0gfSwgLyogYW5kcHMsIGFuZHBkICovCisgICAgWzB4NTVdID0geyBnZW5faGVscGVyX3BhbmRuX3htbSwgZ2VuX2hlbHBlcl9wYW5kbl94bW0gfSwgLyogYW5kbnBzLCBhbmRucGQgKi8KKyAgICBbMHg1Nl0gPSB7IGdlbl9oZWxwZXJfcG9yX3htbSwgZ2VuX2hlbHBlcl9wb3JfeG1tIH0sIC8qIG9ycHMsIG9ycGQgKi8KKyAgICBbMHg1N10gPSB7IGdlbl9oZWxwZXJfcHhvcl94bW0sIGdlbl9oZWxwZXJfcHhvcl94bW0gfSwgLyogeG9ycHMsIHhvcnBkICovCisgICAgWzB4NThdID0gU1NFX0ZPUChhZGQpLAorICAgIFsweDU5XSA9IFNTRV9GT1AobXVsKSwKKyAgICBbMHg1YV0gPSB7IGdlbl9oZWxwZXJfY3Z0cHMycGQsIGdlbl9oZWxwZXJfY3Z0cGQycHMsCisgICAgICAgICAgICAgICBnZW5faGVscGVyX2N2dHNzMnNkLCBnZW5faGVscGVyX2N2dHNkMnNzIH0sCisgICAgWzB4NWJdID0geyBnZW5faGVscGVyX2N2dGRxMnBzLCBnZW5faGVscGVyX2N2dHBzMmRxLCBnZW5faGVscGVyX2N2dHRwczJkcSB9LAorICAgIFsweDVjXSA9IFNTRV9GT1Aoc3ViKSwKKyAgICBbMHg1ZF0gPSBTU0VfRk9QKG1pbiksCisgICAgWzB4NWVdID0gU1NFX0ZPUChkaXYpLAorICAgIFsweDVmXSA9IFNTRV9GT1AobWF4KSwKKworICAgIFsweGMyXSA9IFNTRV9GT1AoY21wZXEpLAorICAgIFsweGM2XSA9IHsgKFNTRUZ1bmNfMF9lcHApZ2VuX2hlbHBlcl9zaHVmcHMsCisgICAgICAgICAgICAgICAoU1NFRnVuY18wX2VwcClnZW5faGVscGVyX3NodWZwZCB9LCAvKiBYWFg6IGNhc3RzICovCisKKyAgICAvKiBTU1NFMywgU1NFNCwgTU9WQkUsIENSQzMyLCBCTUkxLCBCTUkyLCBBRFguICAqLworICAgIFsweDM4XSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwgfSwKKyAgICBbMHgzYV0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sCisKKyAgICAvKiBNTVggb3BzIGFuZCB0aGVpciBTU0UgZXh0ZW5zaW9ucyAqLworICAgIFsweDYwXSA9IE1NWF9PUDIocHVucGNrbGJ3KSwKKyAgICBbMHg2MV0gPSBNTVhfT1AyKHB1bnBja2x3ZCksCisgICAgWzB4NjJdID0gTU1YX09QMihwdW5wY2tsZHEpLAorICAgIFsweDYzXSA9IE1NWF9PUDIocGFja3Nzd2IpLAorICAgIFsweDY0XSA9IE1NWF9PUDIocGNtcGd0YiksCisgICAgWzB4NjVdID0gTU1YX09QMihwY21wZ3R3KSwKKyAgICBbMHg2Nl0gPSBNTVhfT1AyKHBjbXBndGwpLAorICAgIFsweDY3XSA9IE1NWF9PUDIocGFja3Vzd2IpLAorICAgIFsweDY4XSA9IE1NWF9PUDIocHVucGNraGJ3KSwKKyAgICBbMHg2OV0gPSBNTVhfT1AyKHB1bnBja2h3ZCksCisgICAgWzB4NmFdID0gTU1YX09QMihwdW5wY2toZHEpLAorICAgIFsweDZiXSA9IE1NWF9PUDIocGFja3NzZHcpLAorICAgIFsweDZjXSA9IHsgTlVMTCwgZ2VuX2hlbHBlcl9wdW5wY2tscWRxX3htbSB9LAorICAgIFsweDZkXSA9IHsgTlVMTCwgZ2VuX2hlbHBlcl9wdW5wY2tocWRxX3htbSB9LAorICAgIFsweDZlXSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sIC8qIG1vdmQgbW0sIGVhICovCisgICAgWzB4NmZdID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sIC8qIG1vdnEsIG1vdmRxYSwgLCBtb3ZxZHUgKi8KKyAgICBbMHg3MF0gPSB7IChTU0VGdW5jXzBfZXBwKWdlbl9oZWxwZXJfcHNodWZ3X21teCwKKyAgICAgICAgICAgICAgIChTU0VGdW5jXzBfZXBwKWdlbl9oZWxwZXJfcHNodWZkX3htbSwKKyAgICAgICAgICAgICAgIChTU0VGdW5jXzBfZXBwKWdlbl9oZWxwZXJfcHNodWZod194bW0sCisgICAgICAgICAgICAgICAoU1NFRnVuY18wX2VwcClnZW5faGVscGVyX3BzaHVmbHdfeG1tIH0sIC8qIFhYWDogY2FzdHMgKi8KKyAgICBbMHg3MV0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBzaGlmdHcgKi8KKyAgICBbMHg3Ml0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBzaGlmdGQgKi8KKyAgICBbMHg3M10gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBzaGlmdHEgKi8KKyAgICBbMHg3NF0gPSBNTVhfT1AyKHBjbXBlcWIpLAorICAgIFsweDc1XSA9IE1NWF9PUDIocGNtcGVxdyksCisgICAgWzB4NzZdID0gTU1YX09QMihwY21wZXFsKSwKKyAgICBbMHg3N10gPSB7IFNTRV9EVU1NWSB9LCAvKiBlbW1zICovCisgICAgWzB4N2NdID0geyBOVUxMLCBnZW5faGVscGVyX2hhZGRwZCwgTlVMTCwgZ2VuX2hlbHBlcl9oYWRkcHMgfSwKKyAgICBbMHg3ZF0gPSB7IE5VTEwsIGdlbl9oZWxwZXJfaHN1YnBkLCBOVUxMLCBnZW5faGVscGVyX2hzdWJwcyB9LAorICAgIFsweDdlXSA9IHsgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBtb3ZkLCBtb3ZkLCAsIG1vdnEgKi8KKyAgICBbMHg3Zl0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwgfSwgLyogbW92cSwgbW92ZHFhLCBtb3ZkcXUgKi8KKyAgICBbMHhjNF0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBwaW5zcncgKi8KKyAgICBbMHhjNV0gPSB7IFNTRV9TUEVDSUFMLCBTU0VfU1BFQ0lBTCB9LCAvKiBwZXh0cncgKi8KKyAgICBbMHhkMF0gPSB7IE5VTEwsIGdlbl9oZWxwZXJfYWRkc3VicGQsIE5VTEwsIGdlbl9oZWxwZXJfYWRkc3VicHMgfSwKKyAgICBbMHhkMV0gPSBNTVhfT1AyKHBzcmx3KSwKKyAgICBbMHhkMl0gPSBNTVhfT1AyKHBzcmxkKSwKKyAgICBbMHhkM10gPSBNTVhfT1AyKHBzcmxxKSwKKyAgICBbMHhkNF0gPSBNTVhfT1AyKHBhZGRxKSwKKyAgICBbMHhkNV0gPSBNTVhfT1AyKHBtdWxsdyksCisgICAgWzB4ZDZdID0geyBOVUxMLCBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwsIFNTRV9TUEVDSUFMIH0sCisgICAgWzB4ZDddID0geyBTU0VfU1BFQ0lBTCwgU1NFX1NQRUNJQUwgfSwgLyogcG1vdm1za2IgKi8KKyAgICBbMHhkOF0gPSBNTVhfT1AyKHBzdWJ1c2IpLAorICAgIFsweGQ5XSA9IE1NWF9PUDIocHN1YnVzdyksCisgICAgWzB4ZGFdID0gTU1YX09QMihwbWludWIpLAorICAgIFsweGRiXSA9IE1NWF9PUDIocGFuZCksCisgICAgWzB4ZGNdID0gTU1YX09QMihwYWRkdXNiKSwKKyAgICBbMHhkZF0gPSBNTVhfT1AyKHBhZGR1c3cpLAorICAgIFsweGRlXSA9IE1NWF9PUDIocG1heHViKSwKKyAgICBbMHhkZl0gPSBNTVhfT1AyKHBhbmRuKSwKKyAgICBbMHhlMF0gPSBNTVhfT1AyKHBhdmdiKSwKKyAgICBbMHhlMV0gPSBNTVhfT1AyKHBzcmF3KSwKKyAgICBbMHhlMl0gPSBNTVhfT1AyKHBzcmFkKSwKKyAgICBbMHhlM10gPSBNTVhfT1AyKHBhdmd3KSwKKyAgICBbMHhlNF0gPSBNTVhfT1AyKHBtdWxodXcpLAorICAgIFsweGU1XSA9IE1NWF9PUDIocG11bGh3KSwKKyAgICBbMHhlNl0gPSB7IE5VTEwsIGdlbl9oZWxwZXJfY3Z0dHBkMmRxLCBnZW5faGVscGVyX2N2dGRxMnBkLCBnZW5faGVscGVyX2N2dHBkMmRxIH0sCisgICAgWzB4ZTddID0geyBTU0VfU1BFQ0lBTCAsIFNTRV9TUEVDSUFMIH0sICAvKiBtb3ZudHEsIG1vdm50cSAqLworICAgIFsweGU4XSA9IE1NWF9PUDIocHN1YnNiKSwKKyAgICBbMHhlOV0gPSBNTVhfT1AyKHBzdWJzdyksCisgICAgWzB4ZWFdID0gTU1YX09QMihwbWluc3cpLAorICAgIFsweGViXSA9IE1NWF9PUDIocG9yKSwKKyAgICBbMHhlY10gPSBNTVhfT1AyKHBhZGRzYiksCisgICAgWzB4ZWRdID0gTU1YX09QMihwYWRkc3cpLAorICAgIFsweGVlXSA9IE1NWF9PUDIocG1heHN3KSwKKyAgICBbMHhlZl0gPSBNTVhfT1AyKHB4b3IpLAorICAgIFsweGYwXSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgU1NFX1NQRUNJQUwgfSwgLyogbGRkcXUgKi8KKyAgICBbMHhmMV0gPSBNTVhfT1AyKHBzbGx3KSwKKyAgICBbMHhmMl0gPSBNTVhfT1AyKHBzbGxkKSwKKyAgICBbMHhmM10gPSBNTVhfT1AyKHBzbGxxKSwKKyAgICBbMHhmNF0gPSBNTVhfT1AyKHBtdWx1ZHEpLAorICAgIFsweGY1XSA9IE1NWF9PUDIocG1hZGR3ZCksCisgICAgWzB4ZjZdID0gTU1YX09QMihwc2FkYncpLAorICAgIFsweGY3XSA9IHsgKFNTRUZ1bmNfMF9lcHApZ2VuX2hlbHBlcl9tYXNrbW92X21teCwKKyAgICAgICAgICAgICAgIChTU0VGdW5jXzBfZXBwKWdlbl9oZWxwZXJfbWFza21vdl94bW0gfSwgLyogWFhYOiBjYXN0cyAqLworICAgIFsweGY4XSA9IE1NWF9PUDIocHN1YmIpLAorICAgIFsweGY5XSA9IE1NWF9PUDIocHN1YncpLAorICAgIFsweGZhXSA9IE1NWF9PUDIocHN1YmwpLAorICAgIFsweGZiXSA9IE1NWF9PUDIocHN1YnEpLAorICAgIFsweGZjXSA9IE1NWF9PUDIocGFkZGIpLAorICAgIFsweGZkXSA9IE1NWF9PUDIocGFkZHcpLAorICAgIFsweGZlXSA9IE1NWF9PUDIocGFkZGwpLAorfTsKKworc3RhdGljIGNvbnN0IFNTRUZ1bmNfMF9lcHAgc3NlX29wX3RhYmxlMlszICogOF1bMl0gPSB7CisgICAgWzAgKyAyXSA9IE1NWF9PUDIocHNybHcpLAorICAgIFswICsgNF0gPSBNTVhfT1AyKHBzcmF3KSwKKyAgICBbMCArIDZdID0gTU1YX09QMihwc2xsdyksCisgICAgWzggKyAyXSA9IE1NWF9PUDIocHNybGQpLAorICAgIFs4ICsgNF0gPSBNTVhfT1AyKHBzcmFkKSwKKyAgICBbOCArIDZdID0gTU1YX09QMihwc2xsZCksCisgICAgWzE2ICsgMl0gPSBNTVhfT1AyKHBzcmxxKSwKKyAgICBbMTYgKyAzXSA9IHsgTlVMTCwgZ2VuX2hlbHBlcl9wc3JsZHFfeG1tIH0sCisgICAgWzE2ICsgNl0gPSBNTVhfT1AyKHBzbGxxKSwKKyAgICBbMTYgKyA3XSA9IHsgTlVMTCwgZ2VuX2hlbHBlcl9wc2xsZHFfeG1tIH0sCit9OworCitzdGF0aWMgY29uc3QgU1NFRnVuY18wX2VwaSBzc2Vfb3BfdGFibGUzYWlbXSA9IHsKKyAgICBnZW5faGVscGVyX2N2dHNpMnNzLAorICAgIGdlbl9oZWxwZXJfY3Z0c2kyc2QKK307CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgY29uc3QgU1NFRnVuY18wX2VwbCBzc2Vfb3BfdGFibGUzYXFbXSA9IHsKKyAgICBnZW5faGVscGVyX2N2dHNxMnNzLAorICAgIGdlbl9oZWxwZXJfY3Z0c3Eyc2QKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IFNTRUZ1bmNfaV9lcCBzc2Vfb3BfdGFibGUzYmlbXSA9IHsKKyAgICBnZW5faGVscGVyX2N2dHRzczJzaSwKKyAgICBnZW5faGVscGVyX2N2dHNzMnNpLAorICAgIGdlbl9oZWxwZXJfY3Z0dHNkMnNpLAorICAgIGdlbl9oZWxwZXJfY3Z0c2Qyc2kKK307CisKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CitzdGF0aWMgY29uc3QgU1NFRnVuY19sX2VwIHNzZV9vcF90YWJsZTNicVtdID0geworICAgIGdlbl9oZWxwZXJfY3Z0dHNzMnNxLAorICAgIGdlbl9oZWxwZXJfY3Z0c3Myc3EsCisgICAgZ2VuX2hlbHBlcl9jdnR0c2Qyc3EsCisgICAgZ2VuX2hlbHBlcl9jdnRzZDJzcQorfTsKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgU1NFRnVuY18wX2VwcCBzc2Vfb3BfdGFibGU0WzhdWzRdID0geworICAgIFNTRV9GT1AoY21wZXEpLAorICAgIFNTRV9GT1AoY21wbHQpLAorICAgIFNTRV9GT1AoY21wbGUpLAorICAgIFNTRV9GT1AoY21wdW5vcmQpLAorICAgIFNTRV9GT1AoY21wbmVxKSwKKyAgICBTU0VfRk9QKGNtcG5sdCksCisgICAgU1NFX0ZPUChjbXBubGUpLAorICAgIFNTRV9GT1AoY21wb3JkKSwKK307CisKK3N0YXRpYyBjb25zdCBTU0VGdW5jXzBfZXBwIHNzZV9vcF90YWJsZTVbMjU2XSA9IHsKKyAgICBbMHgwY10gPSBnZW5faGVscGVyX3BpMmZ3LAorICAgIFsweDBkXSA9IGdlbl9oZWxwZXJfcGkyZmQsCisgICAgWzB4MWNdID0gZ2VuX2hlbHBlcl9wZjJpdywKKyAgICBbMHgxZF0gPSBnZW5faGVscGVyX3BmMmlkLAorICAgIFsweDhhXSA9IGdlbl9oZWxwZXJfcGZuYWNjLAorICAgIFsweDhlXSA9IGdlbl9oZWxwZXJfcGZwbmFjYywKKyAgICBbMHg5MF0gPSBnZW5faGVscGVyX3BmY21wZ2UsCisgICAgWzB4OTRdID0gZ2VuX2hlbHBlcl9wZm1pbiwKKyAgICBbMHg5Nl0gPSBnZW5faGVscGVyX3BmcmNwLAorICAgIFsweDk3XSA9IGdlbl9oZWxwZXJfcGZyc3FydCwKKyAgICBbMHg5YV0gPSBnZW5faGVscGVyX3Bmc3ViLAorICAgIFsweDllXSA9IGdlbl9oZWxwZXJfcGZhZGQsCisgICAgWzB4YTBdID0gZ2VuX2hlbHBlcl9wZmNtcGd0LAorICAgIFsweGE0XSA9IGdlbl9oZWxwZXJfcGZtYXgsCisgICAgWzB4YTZdID0gZ2VuX2hlbHBlcl9tb3ZxLCAvKiBwZnJjcGl0MTsgbm8gbmVlZCB0byBhY3R1YWxseSBpbmNyZWFzZSBwcmVjaXNpb24gKi8KKyAgICBbMHhhN10gPSBnZW5faGVscGVyX21vdnEsIC8qIHBmcnNxaXQxICovCisgICAgWzB4YWFdID0gZ2VuX2hlbHBlcl9wZnN1YnIsCisgICAgWzB4YWVdID0gZ2VuX2hlbHBlcl9wZmFjYywKKyAgICBbMHhiMF0gPSBnZW5faGVscGVyX3BmY21wZXEsCisgICAgWzB4YjRdID0gZ2VuX2hlbHBlcl9wZm11bCwKKyAgICBbMHhiNl0gPSBnZW5faGVscGVyX21vdnEsIC8qIHBmcmNwaXQyICovCisgICAgWzB4YjddID0gZ2VuX2hlbHBlcl9wbXVsaHJ3X21teCwKKyAgICBbMHhiYl0gPSBnZW5faGVscGVyX3Bzd2FwZCwKKyAgICBbMHhiZl0gPSBnZW5faGVscGVyX3BhdmdiX21teCAvKiBwYXZndXNiICovCit9OworCitzdHJ1Y3QgU1NFT3BIZWxwZXJfZXBwIHsKKyAgICBTU0VGdW5jXzBfZXBwIG9wWzJdOworICAgIHVpbnQzMl90IGV4dF9tYXNrOworfTsKKworc3RydWN0IFNTRU9wSGVscGVyX2VwcGkgeworICAgIFNTRUZ1bmNfMF9lcHBpIG9wWzJdOworICAgIHVpbnQzMl90IGV4dF9tYXNrOworfTsKKworI2RlZmluZSBTU1NFM19PUCh4KSB7IE1NWF9PUDIoeCksIENQVUlEX0VYVF9TU1NFMyB9CisjZGVmaW5lIFNTRTQxX09QKHgpIHsgeyBOVUxMLCBnZW5faGVscGVyXyAjIyB4ICMjIF94bW0gfSwgQ1BVSURfRVhUX1NTRTQxIH0KKyNkZWZpbmUgU1NFNDJfT1AoeCkgeyB7IE5VTEwsIGdlbl9oZWxwZXJfICMjIHggIyMgX3htbSB9LCBDUFVJRF9FWFRfU1NFNDIgfQorI2RlZmluZSBTU0U0MV9TUEVDSUFMIHsgeyBOVUxMLCBTU0VfU1BFQ0lBTCB9LCBDUFVJRF9FWFRfU1NFNDEgfQorc3RhdGljIGNvbnN0IHN0cnVjdCBTU0VPcEhlbHBlcl9lcHAgc3NlX29wX3RhYmxlNlsyNTZdID0geworICAgIFsweDAwXSA9IFNTU0UzX09QKHBzaHVmYiksCisgICAgWzB4MDFdID0gU1NTRTNfT1AocGhhZGR3KSwKKyAgICBbMHgwMl0gPSBTU1NFM19PUChwaGFkZGQpLAorICAgIFsweDAzXSA9IFNTU0UzX09QKHBoYWRkc3cpLAorICAgIFsweDA0XSA9IFNTU0UzX09QKHBtYWRkdWJzdyksCisgICAgWzB4MDVdID0gU1NTRTNfT1AocGhzdWJ3KSwKKyAgICBbMHgwNl0gPSBTU1NFM19PUChwaHN1YmQpLAorICAgIFsweDA3XSA9IFNTU0UzX09QKHBoc3Vic3cpLAorICAgIFsweDA4XSA9IFNTU0UzX09QKHBzaWduYiksCisgICAgWzB4MDldID0gU1NTRTNfT1AocHNpZ253KSwKKyAgICBbMHgwYV0gPSBTU1NFM19PUChwc2lnbmQpLAorICAgIFsweDBiXSA9IFNTU0UzX09QKHBtdWxocnN3KSwKKyAgICBbMHgxMF0gPSBTU0U0MV9PUChwYmxlbmR2YiksCisgICAgWzB4MTRdID0gU1NFNDFfT1AoYmxlbmR2cHMpLAorICAgIFsweDE1XSA9IFNTRTQxX09QKGJsZW5kdnBkKSwKKyAgICBbMHgxN10gPSBTU0U0MV9PUChwdGVzdCksCisgICAgWzB4MWNdID0gU1NTRTNfT1AocGFic2IpLAorICAgIFsweDFkXSA9IFNTU0UzX09QKHBhYnN3KSwKKyAgICBbMHgxZV0gPSBTU1NFM19PUChwYWJzZCksCisgICAgWzB4MjBdID0gU1NFNDFfT1AocG1vdnN4YncpLAorICAgIFsweDIxXSA9IFNTRTQxX09QKHBtb3ZzeGJkKSwKKyAgICBbMHgyMl0gPSBTU0U0MV9PUChwbW92c3hicSksCisgICAgWzB4MjNdID0gU1NFNDFfT1AocG1vdnN4d2QpLAorICAgIFsweDI0XSA9IFNTRTQxX09QKHBtb3ZzeHdxKSwKKyAgICBbMHgyNV0gPSBTU0U0MV9PUChwbW92c3hkcSksCisgICAgWzB4MjhdID0gU1NFNDFfT1AocG11bGRxKSwKKyAgICBbMHgyOV0gPSBTU0U0MV9PUChwY21wZXFxKSwKKyAgICBbMHgyYV0gPSBTU0U0MV9TUEVDSUFMLCAvKiBtb3ZudHFkYSAqLworICAgIFsweDJiXSA9IFNTRTQxX09QKHBhY2t1c2R3KSwKKyAgICBbMHgzMF0gPSBTU0U0MV9PUChwbW92enhidyksCisgICAgWzB4MzFdID0gU1NFNDFfT1AocG1vdnp4YmQpLAorICAgIFsweDMyXSA9IFNTRTQxX09QKHBtb3Z6eGJxKSwKKyAgICBbMHgzM10gPSBTU0U0MV9PUChwbW92enh3ZCksCisgICAgWzB4MzRdID0gU1NFNDFfT1AocG1vdnp4d3EpLAorICAgIFsweDM1XSA9IFNTRTQxX09QKHBtb3Z6eGRxKSwKKyAgICBbMHgzN10gPSBTU0U0Ml9PUChwY21wZ3RxKSwKKyAgICBbMHgzOF0gPSBTU0U0MV9PUChwbWluc2IpLAorICAgIFsweDM5XSA9IFNTRTQxX09QKHBtaW5zZCksCisgICAgWzB4M2FdID0gU1NFNDFfT1AocG1pbnV3KSwKKyAgICBbMHgzYl0gPSBTU0U0MV9PUChwbWludWQpLAorICAgIFsweDNjXSA9IFNTRTQxX09QKHBtYXhzYiksCisgICAgWzB4M2RdID0gU1NFNDFfT1AocG1heHNkKSwKKyAgICBbMHgzZV0gPSBTU0U0MV9PUChwbWF4dXcpLAorICAgIFsweDNmXSA9IFNTRTQxX09QKHBtYXh1ZCksCisgICAgWzB4NDBdID0gU1NFNDFfT1AocG11bGxkKSwKKyAgICBbMHg0MV0gPSBTU0U0MV9PUChwaG1pbnBvc3V3KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgU1NFT3BIZWxwZXJfZXBwaSBzc2Vfb3BfdGFibGU3WzI1Nl0gPSB7CisgICAgWzB4MDhdID0gU1NFNDFfT1Aocm91bmRwcyksCisgICAgWzB4MDldID0gU1NFNDFfT1Aocm91bmRwZCksCisgICAgWzB4MGFdID0gU1NFNDFfT1Aocm91bmRzcyksCisgICAgWzB4MGJdID0gU1NFNDFfT1Aocm91bmRzZCksCisgICAgWzB4MGNdID0gU1NFNDFfT1AoYmxlbmRwcyksCisgICAgWzB4MGRdID0gU1NFNDFfT1AoYmxlbmRwZCksCisgICAgWzB4MGVdID0gU1NFNDFfT1AocGJsZW5kdyksCisgICAgWzB4MGZdID0gU1NTRTNfT1AocGFsaWduciksCisgICAgWzB4MTRdID0gU1NFNDFfU1BFQ0lBTCwgLyogcGV4dHJiICovCisgICAgWzB4MTVdID0gU1NFNDFfU1BFQ0lBTCwgLyogcGV4dHJ3ICovCisgICAgWzB4MTZdID0gU1NFNDFfU1BFQ0lBTCwgLyogcGV4dHJkL3BleHRycSAqLworICAgIFsweDE3XSA9IFNTRTQxX1NQRUNJQUwsIC8qIGV4dHJhY3RwcyAqLworICAgIFsweDIwXSA9IFNTRTQxX1NQRUNJQUwsIC8qIHBpbnNyYiAqLworICAgIFsweDIxXSA9IFNTRTQxX1NQRUNJQUwsIC8qIGluc2VydHBzICovCisgICAgWzB4MjJdID0gU1NFNDFfU1BFQ0lBTCwgLyogcGluc3JkL3BpbnNycSAqLworICAgIFsweDQwXSA9IFNTRTQxX09QKGRwcHMpLAorICAgIFsweDQxXSA9IFNTRTQxX09QKGRwcGQpLAorICAgIFsweDQyXSA9IFNTRTQxX09QKG1wc2FkYncpLAorICAgIFsweDYwXSA9IFNTRTQyX09QKHBjbXBlc3RybSksCisgICAgWzB4NjFdID0gU1NFNDJfT1AocGNtcGVzdHJpKSwKKyAgICBbMHg2Ml0gPSBTU0U0Ml9PUChwY21waXN0cm0pLAorICAgIFsweDYzXSA9IFNTRTQyX09QKHBjbXBpc3RyaSksCit9OworCitzdGF0aWMgdm9pZCBnZW5fc3NlKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgaW50IGIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBwY19zdGFydCwgaW50IHJleF9yKQoreworICAgIGludCBiMSwgb3AxX29mZnNldCwgb3AyX29mZnNldCwgaXNfeG1tLCB2YWwsIG90OworICAgIGludCBtb2RybSwgbW9kLCBybSwgcmVnLCByZWdfYWRkciwgb2Zmc2V0X2FkZHI7CisgICAgU1NFRnVuY18wX2VwcCBzc2VfZm5fZXBwOworICAgIFNTRUZ1bmNfMF9lcHBpIHNzZV9mbl9lcHBpOworICAgIFNTRUZ1bmNfMF9wcGkgc3NlX2ZuX3BwaTsKKyAgICBTU0VGdW5jXzBfZXBwdCBzc2VfZm5fZXBwdDsKKworICAgIGIgJj0gMHhmZjsKKyAgICBpZiAocy0+cHJlZml4ICYgUFJFRklYX0RBVEEpCisgICAgICAgIGIxID0gMTsKKyAgICBlbHNlIGlmIChzLT5wcmVmaXggJiBQUkVGSVhfUkVQWikKKyAgICAgICAgYjEgPSAyOworICAgIGVsc2UgaWYgKHMtPnByZWZpeCAmIFBSRUZJWF9SRVBOWikKKyAgICAgICAgYjEgPSAzOworICAgIGVsc2UKKyAgICAgICAgYjEgPSAwOworICAgIHNzZV9mbl9lcHAgPSBzc2Vfb3BfdGFibGUxW2JdW2IxXTsKKyAgICBpZiAoIXNzZV9mbl9lcHApIHsKKyAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgIH0KKyAgICBpZiAoKGIgPD0gMHg1ZiAmJiBiID49IDB4MTApIHx8IGIgPT0gMHhjNiB8fCBiID09IDB4YzIpIHsKKyAgICAgICAgaXNfeG1tID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYjEgPT0gMCkgeworICAgICAgICAgICAgLyogTU1YIGNhc2UgKi8KKyAgICAgICAgICAgIGlzX3htbSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpc194bW0gPSAxOworICAgICAgICB9CisgICAgfQorICAgIC8qIHNpbXBsZSBNTVgvU1NFIG9wZXJhdGlvbiAqLworICAgIGlmIChzLT5mbGFncyAmIEhGX1RTX01BU0spIHsKKyAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocy0+ZmxhZ3MgJiBIRl9FTV9NQVNLKSB7CisgICAgaWxsZWdhbF9vcDoKKyAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDZfSUxMT1AsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzX3htbSAmJiAhKHMtPmZsYWdzICYgSEZfT1NGWFNSX01BU0spKQorICAgICAgICBpZiAoKGIgIT0gMHgzOCAmJiBiICE9IDB4M2EpIHx8IChzLT5wcmVmaXggJiBQUkVGSVhfREFUQSkpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgaWYgKGIgPT0gMHgwZSkgeworICAgICAgICBpZiAoIShzLT5jcHVpZF9leHQyX2ZlYXR1cmVzICYgQ1BVSURfRVhUMl8zRE5PVykpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIC8qIGZlbW1zICovCisgICAgICAgIGdlbl9oZWxwZXJfZW1tcyhjcHVfZW52KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYiA9PSAweDc3KSB7CisgICAgICAgIC8qIGVtbXMgKi8KKyAgICAgICAgZ2VuX2hlbHBlcl9lbW1zKGNwdV9lbnYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHByZXBhcmUgTU1YIHN0YXRlIChYWFg6IG9wdGltaXplIGJ5IHN0b3JpbmcgZnB0dCBhbmQgZnB0YWdzIGluCisgICAgICAgdGhlIHN0YXRpYyBjcHUgc3RhdGUpICovCisgICAgaWYgKCFpc194bW0pIHsKKyAgICAgICAgZ2VuX2hlbHBlcl9lbnRlcl9tbXgoY3B1X2Vudik7CisgICAgfQorCisgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpOworICAgIGlmIChpc194bW0pCisgICAgICAgIHJlZyB8PSByZXhfcjsKKyAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgIGlmIChzc2VfZm5fZXBwID09IFNTRV9TUEVDSUFMKSB7CisgICAgICAgIGIgfD0gKGIxIDw8IDgpOworICAgICAgICBzd2l0Y2goYikgeworICAgICAgICBjYXNlIDB4MGU3OiAvKiBtb3ZudHEgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIGdlbl9zdHFfZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDFlNzogLyogbW92bnRkcSAqLworICAgICAgICBjYXNlIDB4MDJiOiAvKiBtb3ZudHBzICovCisgICAgICAgIGNhc2UgMHgxMmI6IC8qIG1vdm50cHMgKi8KKyAgICAgICAgY2FzZSAweDNmMDogLyogbGRkcXUgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIGdlbl9zdG9fZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg2ZTogLyogbW92ZCBtbSwgZWEgKi8KKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICBpZiAocy0+ZGZsYWcgPT0gMikgeworICAgICAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE9UX1FVQUQsIE9SX1RNUDAsIDApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tyZWddLm1teCkpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9MT05HLCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tyZWddLm1teCkpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbW92bF9tbV9UMF9tbXgoY3B1X3B0cjAsIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE2ZTogLyogbW92ZCB4bW0sIGVhICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmRmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9RVUFELCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21vdnFfbW1fVDBfeG1tKGNwdV9wdHIwLCBjcHVfVFswXSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE9UX0xPTkcsIE9SX1RNUDAsIDApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXSkpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbW92bF9tbV9UMF94bW0oY3B1X3B0cjAsIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDZmOiAvKiBtb3ZxIG1tLCBlYSAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX2xkcV9lbnZfQTAocy0+bWVtX2luZGV4LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXgpKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2k2NChjcHVfdG1wMV9pNjQsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxMDogLyogbW92dXBzICovCisgICAgICAgIGNhc2UgMHgxMTA6IC8qIG1vdnVwZCAqLworICAgICAgICBjYXNlIDB4MDI4OiAvKiBtb3ZhcHMgKi8KKyAgICAgICAgY2FzZSAweDEyODogLyogbW92YXBkICovCisgICAgICAgIGNhc2UgMHgxNmY6IC8qIG1vdmRxYSB4bW0sIGVhICovCisgICAgICAgIGNhc2UgMHgyNmY6IC8qIG1vdmRxdSB4bW0sIGVhICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRvX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZvKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMTA6IC8qIG1vdnNzIHhtbSwgZWEgKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9UMF8wKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDEpKSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDIpKSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDMpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX0woMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MzEwOiAvKiBtb3ZzZCB4bW0sIGVhICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9UMF8wKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDIpKSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDMpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92cShvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDEyOiAvKiBtb3ZscHMgKi8KKyAgICAgICAgY2FzZSAweDExMjogLyogbW92bHBkICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbW92aGxwcyAqLworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92cShvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX1EoMSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjEyOiAvKiBtb3ZzbGR1cCAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX2xkb19lbnZfQTAocy0+bWVtX2luZGV4LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX0woMikpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fTCgwKSkpOworICAgICAgICAgICAgZ2VuX29wX21vdmwob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fTCgzKSksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDIpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDMxMjogLyogbW92ZGR1cCAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX2xkcV9lbnZfQTAocy0+bWVtX2luZGV4LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDApKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92cShvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9vcF9tb3ZxKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX1EoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMTY6IC8qIG1vdmhwcyAqLworICAgICAgICBjYXNlIDB4MTE2OiAvKiBtb3ZocGQgKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9sZHFfZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgxKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBtb3ZsaHBzICovCisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZxKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX1EoMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMTY6IC8qIG1vdnNoZHVwICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRvX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXS5YTU1fTCgxKSkpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXS5YTU1fTCgzKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX29wX21vdmwob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fTCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDEpKSk7CisgICAgICAgICAgICBnZW5fb3BfbW92bChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9MKDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMykpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4N2U6IC8qIG1vdmQgZWEsIG1tICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmRmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2k2NChjcHVfVFswXSwgY3B1X2VudiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7CisgICAgICAgICAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgT1RfUVVBRCwgT1JfVE1QMCwgMSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14Lk1NWF9MKDApKSk7CisgICAgICAgICAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgT1RfTE9ORywgT1JfVE1QMCwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE3ZTogLyogbW92ZCBlYSwgeG1tICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmRmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2k2NChjcHVfVFswXSwgY3B1X2VudiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE9UX1FVQUQsIE9SX1RNUDAsIDEpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9MT05HLCBPUl9UTVAwLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjdlOiAvKiBtb3ZxIHhtbSwgZWEgKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9sZHFfZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdnEob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dLlhNTV9RKDApKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5fb3BfbW92cV9lbnZfMChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDEpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDdmOiAvKiBtb3ZxIGVhLCBtbSAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX3N0cV9lbnZfQTAocy0+bWVtX2luZGV4LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92cShvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxMTogLyogbW92dXBzICovCisgICAgICAgIGNhc2UgMHgxMTE6IC8qIG1vdnVwZCAqLworICAgICAgICBjYXNlIDB4MDI5OiAvKiBtb3ZhcHMgKi8KKyAgICAgICAgY2FzZSAweDEyOTogLyogbW92YXBkICovCisgICAgICAgIGNhc2UgMHgxN2Y6IC8qIG1vdmRxYSBlYSwgeG1tICovCisgICAgICAgIGNhc2UgMHgyN2Y6IC8qIG1vdmRxdSBlYSwgeG1tICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fc3RvX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZvKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgyMTE6IC8qIG1vdnNzIGVhLCB4bW0gKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAoT1RfTE9ORyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bChvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX0woMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX0woMCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MzExOiAvKiBtb3ZzZCBlYSwgeG1tICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fc3RxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZxKG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXS5YTU1fUSgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwMTM6IC8qIG1vdmxwcyAqLworICAgICAgICBjYXNlIDB4MTEzOiAvKiBtb3ZscGQgKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9zdHFfZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDAxNzogLyogbW92aHBzICovCisgICAgICAgIGNhc2UgMHgxMTc6IC8qIG1vdmhwZCAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX3N0cV9lbnZfQTAocy0+bWVtX2luZGV4LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDEpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzE6IC8qIHNoaWZ0IG1tLCBpbSAqLworICAgICAgICBjYXNlIDB4NzI6CisgICAgICAgIGNhc2UgMHg3MzoKKyAgICAgICAgY2FzZSAweDE3MTogLyogc2hpZnQgeG1tLCBpbSAqLworICAgICAgICBjYXNlIDB4MTcyOgorICAgICAgICBjYXNlIDB4MTczOgorICAgICAgICAgICAgaWYgKGIxID49IDIpIHsKKwkgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIGlmIChpc194bW0pIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9UMF9pbSh2YWwpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3QwLlhNTV9MKDApKSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdmxfVDBfMCgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3QwLlhNTV9MKDEpKSk7CisgICAgICAgICAgICAgICAgb3AxX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHZhbCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDAuTU1YX0woMCkpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9UMF8wKCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDAuTU1YX0woMSkpKTsKKyAgICAgICAgICAgICAgICBvcDFfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsbW14X3QwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzZV9mbl9lcHAgPSBzc2Vfb3BfdGFibGUyWygoYiAtIDEpICYgMykgKiA4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKG1vZHJtID4+IDMpKSAmIDcpXVtiMV07CisgICAgICAgICAgICBpZiAoIXNzZV9mbl9lcHApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNfeG1tKSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpOworICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjEsIGNwdV9lbnYsIG9wMV9vZmZzZXQpOworICAgICAgICAgICAgc3NlX2ZuX2VwcChjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwNTA6IC8qIG1vdm1za3BzICovCisgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dKSk7CisgICAgICAgICAgICBnZW5faGVscGVyX21vdm1za3BzKGNwdV90bXAyX2kzMiwgY3B1X2VudiwgY3B1X3B0cjApOworICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChjcHVfVFswXSwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIHJlZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDE1MDogLyogbW92bXNrcGQgKi8KKyAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0pKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbW92bXNrcGQoY3B1X3RtcDJfaTMyLCBjcHVfZW52LCBjcHVfcHRyMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfTE9ORywgcmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDJhOiAvKiBjdnRwaTJwcyAqLworICAgICAgICBjYXNlIDB4MTJhOiAvKiBjdnRwaTJwZCAqLworICAgICAgICAgICAgZ2VuX2hlbHBlcl9lbnRlcl9tbXgoY3B1X2Vudik7CisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsbW14X3QwKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpOworICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcDFfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCBvcDFfb2Zmc2V0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjEsIGNwdV9lbnYsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgc3dpdGNoKGIgPj4gOCkgeworICAgICAgICAgICAgY2FzZSAweDA6CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9jdnRwaTJwcyhjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhc2UgMHgxOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfY3Z0cGkycGQoY3B1X2VudiwgY3B1X3B0cjAsIGNwdV9wdHIxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjJhOiAvKiBjdnRzaTJzcyAqLworICAgICAgICBjYXNlIDB4MzJhOiAvKiBjdnRzaTJzZCAqLworICAgICAgICAgICAgb3QgPSAocy0+ZGZsYWcgPT0gMikgPyBPVF9RVUFEIDogT1RfTE9ORzsKKyAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgIG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9wMV9vZmZzZXQpOworICAgICAgICAgICAgaWYgKG90ID09IE9UX0xPTkcpIHsKKyAgICAgICAgICAgICAgICBTU0VGdW5jXzBfZXBpIHNzZV9mbl9lcGkgPSBzc2Vfb3BfdGFibGUzYWlbKGIgPj4gOCkgJiAxXTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBzc2VfZm5fZXBpKGNwdV9lbnYsIGNwdV9wdHIwLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICAgICAgU1NFRnVuY18wX2VwbCBzc2VfZm5fZXBsID0gc3NlX29wX3RhYmxlM2FxWyhiID4+IDgpICYgMV07CisgICAgICAgICAgICAgICAgc3NlX2ZuX2VwbChjcHVfZW52LCBjcHVfcHRyMCwgY3B1X1RbMF0pOworI2Vsc2UKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MDJjOiAvKiBjdnR0cHMycGkgKi8KKyAgICAgICAgY2FzZSAweDEyYzogLyogY3Z0dHBkMnBpICovCisgICAgICAgIGNhc2UgMHgwMmQ6IC8qIGN2dHBzMnBpICovCisgICAgICAgIGNhc2UgMHgxMmQ6IC8qIGN2dHBkMnBpICovCisgICAgICAgICAgICBnZW5faGVscGVyX2VudGVyX21teChjcHVfZW52KTsKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fdDApOworICAgICAgICAgICAgICAgIGdlbl9sZG9fZW52X0EwKHMtPm1lbV9pbmRleCwgb3AyX29mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnICYgN10ubW14KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9wMV9vZmZzZXQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMSwgY3B1X2Vudiwgb3AyX29mZnNldCk7CisgICAgICAgICAgICBzd2l0Y2goYikgeworICAgICAgICAgICAgY2FzZSAweDAyYzoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2N2dHRwczJwaShjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEyYzoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2N2dHRwZDJwaShjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAyZDoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2N2dHBzMnBpKGNwdV9lbnYsIGNwdV9wdHIwLCBjcHVfcHRyMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTJkOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfY3Z0cGQycGkoY3B1X2VudiwgY3B1X3B0cjAsIGNwdV9wdHIxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MjJjOiAvKiBjdnR0c3Myc2kgKi8KKyAgICAgICAgY2FzZSAweDMyYzogLyogY3Z0dHNkMnNpICovCisgICAgICAgIGNhc2UgMHgyMmQ6IC8qIGN2dHNzMnNpICovCisgICAgICAgIGNhc2UgMHgzMmQ6IC8qIGN2dHNkMnNpICovCisgICAgICAgICAgICBvdCA9IChzLT5kZmxhZyA9PSAyKSA/IE9UX1FVQUQgOiBPVF9MT05HOworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgaWYgKChiID4+IDgpICYgMSkgeworICAgICAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MC5YTU1fUSgwKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fdDAuWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgaWYgKG90ID09IE9UX0xPTkcpIHsKKyAgICAgICAgICAgICAgICBTU0VGdW5jX2lfZXAgc3NlX2ZuX2lfZXAgPQorICAgICAgICAgICAgICAgICAgICBzc2Vfb3BfdGFibGUzYmlbKChiID4+IDcpICYgMikgfCAoYiAmIDEpXTsKKyAgICAgICAgICAgICAgICBzc2VfZm5faV9lcChjcHVfdG1wMl9pMzIsIGNwdV9lbnYsIGNwdV9wdHIwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICAgICAgU1NFRnVuY19sX2VwIHNzZV9mbl9sX2VwID0KKyAgICAgICAgICAgICAgICAgICAgc3NlX29wX3RhYmxlM2JxWygoYiA+PiA3KSAmIDIpIHwgKGIgJiAxKV07CisgICAgICAgICAgICAgICAgc3NlX2ZuX2xfZXAoY3B1X1RbMF0sIGNwdV9lbnYsIGNwdV9wdHIwKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YzQ6IC8qIHBpbnNydyAqLworICAgICAgICBjYXNlIDB4MWM0OgorICAgICAgICAgICAgcy0+cmlwX29mZnNldCA9IDE7CisgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9XT1JELCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIGlmIChiMSkgeworICAgICAgICAgICAgICAgIHZhbCAmPSA3OworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QxNl90bChjcHVfVFswXSwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fVyh2YWwpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbCAmPSAzOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QxNl90bChjcHVfVFswXSwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZ10ubW14Lk1NWF9XKHZhbCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4YzU6IC8qIHBleHRydyAqLworICAgICAgICBjYXNlIDB4MWM1OgorICAgICAgICAgICAgaWYgKG1vZCAhPSAzKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIG90ID0gKHMtPmRmbGFnID09IDIpID8gT1RfUVVBRCA6IE9UX0xPTkc7CisgICAgICAgICAgICB2YWwgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBpZiAoYjEpIHsKKyAgICAgICAgICAgICAgICB2YWwgJj0gNzsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9sZDE2dV90bChjcHVfVFswXSwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXS5YTU1fVyh2YWwpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbCAmPSAzOworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNyk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9sZDE2dV90bChjcHVfVFswXSwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXguTU1YX1codmFsKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcmVnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4MWQ2OiAvKiBtb3ZxIGVhLCB4bW0gKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9zdHFfZW52X0EwKHMtPm1lbV9pbmRleCwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdnEob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dLlhNTV9RKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddLlhNTV9RKDApKSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdnFfZW52XzAob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dLlhNTV9RKDEpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDJkNjogLyogbW92cTJkcSAqLworICAgICAgICAgICAgZ2VuX2hlbHBlcl9lbnRlcl9tbXgoY3B1X2Vudik7CisgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpOworICAgICAgICAgICAgZ2VuX29wX21vdnEob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCkpOworICAgICAgICAgICAgZ2VuX29wX21vdnFfZW52XzAob2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXS5YTU1fUSgxKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzZDY6IC8qIG1vdmRxMnEgKi8KKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZW50ZXJfbW14KGNwdV9lbnYpOworICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgZ2VuX29wX21vdnEob2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JlZyAmIDddLm1teCksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybV0uWE1NX1EoMCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZDc6IC8qIHBtb3Ztc2tiICovCisgICAgICAgIGNhc2UgMHgxZDc6CisgICAgICAgICAgICBpZiAobW9kICE9IDMpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgaWYgKGIxKSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JtXSkpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcG1vdm1za2JfeG1tKGNwdV90bXAyX2kzMiwgY3B1X2VudiwgY3B1X3B0cjApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tybV0ubW14KSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9wbW92bXNrYl9tbXgoY3B1X3RtcDJfaTMyLCBjcHVfZW52LCBjcHVfcHRyMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9MT05HLCByZWcpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDEzODoKKyAgICAgICAgICAgIGlmIChzLT5wcmVmaXggJiBQUkVGSVhfUkVQTlopCisgICAgICAgICAgICAgICAgZ290byBjcmMzMjsKKyAgICAgICAgY2FzZSAweDAzODoKKyAgICAgICAgICAgIGIgPSBtb2RybTsKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgcm0gPSBtb2RybSAmIDc7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisKKyAgICAgICAgICAgIHNzZV9mbl9lcHAgPSBzc2Vfb3BfdGFibGU2W2JdLm9wW2IxXTsKKyAgICAgICAgICAgIGlmICghc3NlX2ZuX2VwcCkgeworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHMtPmNwdWlkX2V4dF9mZWF0dXJlcyAmIHNzZV9vcF90YWJsZTZbYl0uZXh0X21hc2spKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKworICAgICAgICAgICAgaWYgKGIxKSB7CisgICAgICAgICAgICAgICAgb3AxX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV9yZWdzW3JlZ10pOworICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm0gfCBSRVhfQihzKV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fdDApOworICAgICAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChiKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyMDogY2FzZSAweDMwOiAvKiBwbW92c3hidywgcG1vdnp4YncgKi8KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDIzOiBjYXNlIDB4MzM6IC8qIHBtb3ZzeHdkLCBwbW92enh3ZCAqLworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjU6IGNhc2UgMHgzNTogLyogcG1vdnN4ZHEsIHBtb3Z6eGRxICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9wMl9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFhNTVJlZywgWE1NX1EoMCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjE6IGNhc2UgMHgzMTogLyogcG1vdnN4YmQsIHBtb3Z6eGJkICovCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyNDogY2FzZSAweDM0OiAvKiBwbW92c3h3cSwgcG1vdnp4d3EgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDMydShjcHVfdG1wMCwgY3B1X0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfdG1wMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2kzMihjcHVfdG1wMl9pMzIsIGNwdV9lbnYsIG9wMl9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKFhNTVJlZywgWE1NX0woMCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MjI6IGNhc2UgMHgzMjogLyogcG1vdnN4YnEsIHBtb3Z6eGJxICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQxNnUoY3B1X3RtcDAsIGNwdV9BMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QxNl90bChjcHVfdG1wMCwgY3B1X2Vudiwgb3AyX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoWE1NUmVnLCBYTU1fVygwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgyYTogICAgICAgICAgICAvKiBtb3ZudHFkYSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2xkb19lbnZfQTAocy0+bWVtX2luZGV4LCBvcDFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9sZG9fZW52X0EwKHMtPm1lbV9pbmRleCwgb3AyX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXgpOworICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxtbXhfdDApOworICAgICAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xkcV9lbnZfQTAocy0+bWVtX2luZGV4LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3NlX2ZuX2VwcCA9PSBTU0VfU1BFQ0lBTCkgeworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiwgb3AxX29mZnNldCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIxLCBjcHVfZW52LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIHNzZV9mbl9lcHAoY3B1X2VudiwgY3B1X3B0cjAsIGNwdV9wdHIxKTsKKworICAgICAgICAgICAgaWYgKGIgPT0gMHgxNykgeworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzMzg6IC8qIGNyYzMyICovCisgICAgICAgIGNyYzMyOgorICAgICAgICAgICAgYiA9IG1vZHJtOworICAgICAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKworICAgICAgICAgICAgaWYgKGIgIT0gMHhmMCAmJiBiICE9IDB4ZjEpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgaWYgKCEocy0+Y3B1aWRfZXh0X2ZlYXR1cmVzICYgQ1BVSURfRVhUX1NTRTQyKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisKKyAgICAgICAgICAgIGlmIChiID09IDB4ZjApCisgICAgICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICAgICAgZWxzZSBpZiAoYiA9PSAweGYxICYmIHMtPmRmbGFnICE9IDIpCisgICAgICAgICAgICAgICAgaWYgKHMtPnByZWZpeCAmIFBSRUZJWF9EQVRBKQorICAgICAgICAgICAgICAgICAgICBvdCA9IE9UX1dPUkQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvdCA9IE9UX0xPTkc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3QgPSBPVF9RVUFEOworCisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCByZWcpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NyYzMyKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9UWzBdLCB0Y2dfY29uc3RfaTMyKDggPDwgb3QpKTsKKworICAgICAgICAgICAgb3QgPSAocy0+ZGZsYWcgPT0gMikgPyBPVF9RVUFEIDogT1RfTE9ORzsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCByZWcpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAweDAzYToKKyAgICAgICAgY2FzZSAweDEzYToKKyAgICAgICAgICAgIGIgPSBtb2RybTsKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgcm0gPSBtb2RybSAmIDc7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisKKyAgICAgICAgICAgIHNzZV9mbl9lcHBpID0gc3NlX29wX3RhYmxlN1tiXS5vcFtiMV07CisgICAgICAgICAgICBpZiAoIXNzZV9mbl9lcHBpKSB7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEocy0+Y3B1aWRfZXh0X2ZlYXR1cmVzICYgc3NlX29wX3RhYmxlN1tiXS5leHRfbWFzaykpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworCisgICAgICAgICAgICBpZiAoc3NlX2ZuX2VwcGkgPT0gU1NFX1NQRUNJQUwpIHsKKyAgICAgICAgICAgICAgICBvdCA9IChzLT5kZmxhZyA9PSAyKSA/IE9UX1FVQUQgOiBPVF9MT05HOworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kICE9IDMpCisgICAgICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIHJlZyA9ICgobW9kcm0gPj4gMykgJiA3KSB8IHJleF9yOworICAgICAgICAgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTQ6IC8qIHBleHRyYiAqLworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkOHVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bW1fcmVnc1tyZWddLlhNTV9CKHZhbCAmIDE1KSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3Q4KGNwdV9UWzBdLCBjcHVfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTU6IC8qIHBleHRydyAqLworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkMTZ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1tX3JlZ3NbcmVnXS5YTU1fVyh2YWwgJiA3KSkpOworICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3QxNihjcHVfVFswXSwgY3B1X0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDE2OgorICAgICAgICAgICAgICAgICAgICBpZiAob3QgPT0gT1RfTE9ORykgeyAvKiBwZXh0cmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGRfaTMyKGNwdV90bXAyX2kzMiwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbV9yZWdzW3JlZ10uWE1NX0wodmFsICYgMykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoY3B1X1RbMF0sIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgcm0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3QzMihjcHVfVFswXSwgY3B1X0EwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWVtX2luZGV4ID4+IDIpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIHBleHRycSAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGRfaTY0KGNwdV90bXAxX2k2NCwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbV9yZWdzW3JlZ10uWE1NX1EodmFsICYgMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ192KG90LCBybSwgY3B1X3RtcDFfaTY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3Q2NChjcHVfdG1wMV9pNjQsIGNwdV9BMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgxNzogLyogZXh0cmFjdHBzICovCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bW1fcmVnc1tyZWddLlhNTV9MKHZhbCAmIDMpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCBybSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9zdDMyKGNwdV9UWzBdLCBjcHVfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjA6IC8qIHBpbnNyYiAqLworICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCBybSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDh1KGNwdV90bXAwLCBjcHVfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0OF90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbV9yZWdzW3JlZ10uWE1NX0IodmFsICYgMTUpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHgyMTogLyogaW5zZXJ0cHMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuWE1NX0woKHZhbCA+PiA2KSAmIDMpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQzMnUoY3B1X3RtcDAsIGNwdV9BMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWVtX2luZGV4ID4+IDIpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV90bXAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2kzMihjcHVfdG1wMl9pMzIsIGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5YTU1fTCgodmFsID4+IDQpICYgMykpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWwgPj4gMCkgJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9pMzIodGNnX2NvbnN0X2kzMigwIC8qZmxvYXQzMl96ZXJvKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1tX3JlZ3NbcmVnXS5YTU1fTCgwKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHZhbCA+PiAxKSAmIDEpCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0X2kzMih0Y2dfY29uc3RfaTMyKDAgLypmbG9hdDMyX3plcm8qLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bW1fcmVnc1tyZWddLlhNTV9MKDEpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgodmFsID4+IDIpICYgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfaTMyKHRjZ19jb25zdF9pMzIoMCAvKmZsb2F0MzJfemVybyovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbV9yZWdzW3JlZ10uWE1NX0woMikpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWwgPj4gMykgJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9pMzIodGNnX2NvbnN0X2kzMigwIC8qZmxvYXQzMl96ZXJvKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1tX3JlZ3NbcmVnXS5YTU1fTCgzKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MjI6CisgICAgICAgICAgICAgICAgICAgIGlmIChvdCA9PSBPVF9MT05HKSB7IC8qIHBpbnNyZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3Zfdl9yZWcob3QsIGNwdV90bXAwLCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9xZW11X2xkMzJ1KGNwdV90bXAwLCBjcHVfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X3RtcDApOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVVg4NlN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1tX3JlZ3NbcmVnXS5YTU1fTCh2YWwgJiAzKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvKiBwaW5zcnEgKi8KKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX21vdl92X3JlZyhvdCwgY3B1X3RtcDFfaTY0LCBybSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9xZW11X2xkNjQoY3B1X3RtcDFfaTY0LCBjcHVfQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfaTY0KGNwdV90bXAxX2k2NCwgY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVYODZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbV9yZWdzW3JlZ10uWE1NX1EodmFsICYgMSkpKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYjEpIHsKKyAgICAgICAgICAgICAgICBvcDFfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3NbcmVnXSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tybSB8IFJFWF9CKHMpXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgICAgICBnZW5fbGRvX2Vudl9BMChzLT5tZW1faW5kZXgsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3AxX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLGZwcmVnc1tyZWddLm1teCk7CisgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3Nbcm1dLm1teCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLG1teF90MCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKworICAgICAgICAgICAgaWYgKChiICYgMHhmYykgPT0gMHg2MCkgeyAvKiBwY21wWHN0clggKi8KKyAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5kZmxhZyA9PSAyKQorICAgICAgICAgICAgICAgICAgICAvKiBUaGUgaGVscGVyIG11c3QgdXNlIGVudGlyZSA2NC1iaXQgZ3AgcmVnaXN0ZXJzICovCisgICAgICAgICAgICAgICAgICAgIHZhbCB8PSAxIDw8IDg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9wMV9vZmZzZXQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMSwgY3B1X2Vudiwgb3AyX29mZnNldCk7CisgICAgICAgICAgICBzc2VfZm5fZXBwaShjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEsIHRjZ19jb25zdF9pMzIodmFsKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGdlbmVyaWMgTU1YIG9yIFNTRSBvcGVyYXRpb24gKi8KKyAgICAgICAgc3dpdGNoKGIpIHsKKyAgICAgICAgY2FzZSAweDcwOiAvKiBwc2h1ZnggaW5zbiAqLworICAgICAgICBjYXNlIDB4YzY6IC8qIHBzaHVmeCBpbnNuICovCisgICAgICAgIGNhc2UgMHhjMjogLyogY29tcGFyZSBpbnNucyAqLworICAgICAgICAgICAgcy0+cmlwX29mZnNldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpc194bW0pIHsKKyAgICAgICAgICAgIG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fcmVnc1tyZWddKTsKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIG9wMl9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSx4bW1fdDApOworICAgICAgICAgICAgICAgIGlmIChiMSA+PSAyICYmICgoYiA+PSAweDUwICYmIGIgPD0gMHg1ZiAmJiBiICE9IDB4NWIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPT0gMHhjMikpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lmaWMgY2FzZSBmb3IgU1NFIHNpbmdsZSBpbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGIxID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBhY2Nlc3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3QwLlhNTV9MKDApKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiA2NCBiaXQgYWNjZXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fbGRxX2Vudl9BMChzLT5tZW1faW5kZXgsIG9mZnNldG9mKENQVVg4NlN0YXRlLHhtbV90MC5YTU1fRCgwKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xkb19lbnZfQTAocy0+bWVtX2luZGV4LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUseG1tX3JlZ3Nbcm1dKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wMV9vZmZzZXQgPSBvZmZzZXRvZihDUFVYODZTdGF0ZSxmcHJlZ3NbcmVnXS5tbXgpOworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgb3AyX29mZnNldCA9IG9mZnNldG9mKENQVVg4NlN0YXRlLG1teF90MCk7CisgICAgICAgICAgICAgICAgZ2VuX2xkcV9lbnZfQTAocy0+bWVtX2luZGV4LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KTsKKyAgICAgICAgICAgICAgICBvcDJfb2Zmc2V0ID0gb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZnByZWdzW3JtXS5tbXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaChiKSB7CisgICAgICAgIGNhc2UgMHgwZjogLyogM0ROb3chIGRhdGEgaW5zbnMgKi8KKyAgICAgICAgICAgIGlmICghKHMtPmNwdWlkX2V4dDJfZmVhdHVyZXMgJiBDUFVJRF9FWFQyXzNETk9XKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB2YWwgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBzc2VfZm5fZXBwID0gc3NlX29wX3RhYmxlNVt2YWxdOworICAgICAgICAgICAgaWYgKCFzc2VfZm5fZXBwKSB7CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiwgb3AxX29mZnNldCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIxLCBjcHVfZW52LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIHNzZV9mbl9lcHAoY3B1X2VudiwgY3B1X3B0cjAsIGNwdV9wdHIxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4NzA6IC8qIHBzaHVmeCBpbnNuICovCisgICAgICAgIGNhc2UgMHhjNjogLyogcHNodWZ4IGluc24gKi8KKyAgICAgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjAsIGNwdV9lbnYsIG9wMV9vZmZzZXQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMSwgY3B1X2Vudiwgb3AyX29mZnNldCk7CisgICAgICAgICAgICAvKiBYWFg6IGludHJvZHVjZSBhIG5ldyB0YWJsZT8gKi8KKyAgICAgICAgICAgIHNzZV9mbl9wcGkgPSAoU1NFRnVuY18wX3BwaSlzc2VfZm5fZXBwOworICAgICAgICAgICAgc3NlX2ZuX3BwaShjcHVfcHRyMCwgY3B1X3B0cjEsIHRjZ19jb25zdF9pMzIodmFsKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGMyOgorICAgICAgICAgICAgLyogY29tcGFyZSBpbnNucyAqLworICAgICAgICAgICAgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgaWYgKHZhbCA+PSA4KQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIHNzZV9mbl9lcHAgPSBzc2Vfb3BfdGFibGU0W3ZhbF1bYjFdOworCisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIwLCBjcHVfZW52LCBvcDFfb2Zmc2V0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV9wdHIoY3B1X3B0cjEsIGNwdV9lbnYsIG9wMl9vZmZzZXQpOworICAgICAgICAgICAgc3NlX2ZuX2VwcChjcHVfZW52LCBjcHVfcHRyMCwgY3B1X3B0cjEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHhmNzoKKyAgICAgICAgICAgIC8qIG1hc2ttb3YgOiB3ZSBtdXN0IHByZXBhcmUgQTAgKi8KKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmFmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92cV9BMF9yZWcoUl9FREkpOworICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9BMF9yZWcoUl9FREkpOworICAgICAgICAgICAgICAgIGlmIChzLT5hZmxhZyA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnZW5fb3BfYW5kbF9BMF9mZmZmKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5fYWRkX0EwX2RzX3NlZyhzKTsKKworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiwgb3AxX29mZnNldCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIxLCBjcHVfZW52LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIC8qIFhYWDogaW50cm9kdWNlIGEgbmV3IHRhYmxlPyAqLworICAgICAgICAgICAgc3NlX2ZuX2VwcHQgPSAoU1NFRnVuY18wX2VwcHQpc3NlX2ZuX2VwcDsKKyAgICAgICAgICAgIHNzZV9mbl9lcHB0KGNwdV9lbnYsIGNwdV9wdHIwLCBjcHVfcHRyMSwgY3B1X0EwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3B0cihjcHVfcHRyMCwgY3B1X2Vudiwgb3AxX29mZnNldCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfcHRyKGNwdV9wdHIxLCBjcHVfZW52LCBvcDJfb2Zmc2V0KTsKKyAgICAgICAgICAgIHNzZV9mbl9lcHAoY3B1X2VudiwgY3B1X3B0cjAsIGNwdV9wdHIxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChiID09IDB4MmUgfHwgYiA9PSAweDJmKSB7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogY29udmVydCBvbmUgaW5zdHJ1Y3Rpb24uIHMtPmlzX2ptcCBpcyBzZXQgaWYgdGhlIHRyYW5zbGF0aW9uIG11c3QKKyAgIGJlIHN0b3BwZWQuIFJldHVybiB0aGUgbmV4dCBwYyB2YWx1ZSAqLworc3RhdGljIHRhcmdldF91bG9uZyBkaXNhc19pbnNuKENQVVg4NlN0YXRlICplbnYsIERpc2FzQ29udGV4dCAqcywgdGFyZ2V0X3Vsb25nIHBjX3N0YXJ0KQoreworICAgIGludCBiLCBwcmVmaXhlcywgYWZsYWcsIGRmbGFnOworICAgIGludCBzaGlmdCwgb3Q7CisgICAgaW50IG1vZHJtLCByZWcsIHJtLCBtb2QsIHJlZ19hZGRyLCBvcCwgb3ByZWcsIG9mZnNldF9hZGRyLCB2YWw7CisgICAgdGFyZ2V0X3Vsb25nIG5leHRfZWlwLCB0dmFsOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpbnQgcmV4X3cgPSAtMTsKKyNlbmRpZgorICAgIGludCByZXhfcjsKKworICAgIGlmICh1bmxpa2VseShxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9PUCkpKSB7CisgICAgICAgIHRjZ19nZW5fZGVidWdfaW5zbl9zdGFydChwY19zdGFydCk7CisgICAgfQorICAgIHMtPnBjID0gcGNfc3RhcnQ7CisgICAgcHJlZml4ZXMgPSAwOworICAgIGFmbGFnID0gcy0+Y29kZTMyOworICAgIGRmbGFnID0gcy0+Y29kZTMyOworICAgIHMtPm92ZXJyaWRlID0gLTE7CisgICAgcmV4X3IgPSAwOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBzLT5yZXhfeCA9IDA7CisgICAgcy0+cmV4X2IgPSAwOworICAgIHg4Nl82NF9ocmVncyA9IDA7CisjZW5kaWYKKyAgICBzLT5yaXBfb2Zmc2V0ID0gMDsgLyogZm9yIHJlbGF0aXZlIGlwIGFkZHJlc3MgKi8KKyBuZXh0X2J5dGU6CisgICAgYiA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYyk7CisgICAgcy0+cGMrKzsKKyAgICAvKiBjaGVjayBwcmVmaXhlcyAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICBpZiAoQ09ERTY0KHMpKSB7CisgICAgICAgIHN3aXRjaCAoYikgeworICAgICAgICBjYXNlIDB4ZjM6CisgICAgICAgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQWjsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4ZjI6CisgICAgICAgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQTlo7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweGYwOgorICAgICAgICAgICAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDJlOgorICAgICAgICAgICAgcy0+b3ZlcnJpZGUgPSBSX0NTOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIGNhc2UgMHgzNjoKKyAgICAgICAgICAgIHMtPm92ZXJyaWRlID0gUl9TUzsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4M2U6CisgICAgICAgICAgICBzLT5vdmVycmlkZSA9IFJfRFM7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDI2OgorICAgICAgICAgICAgcy0+b3ZlcnJpZGUgPSBSX0VTOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIGNhc2UgMHg2NDoKKyAgICAgICAgICAgIHMtPm92ZXJyaWRlID0gUl9GUzsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4NjU6CisgICAgICAgICAgICBzLT5vdmVycmlkZSA9IFJfR1M7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDY2OgorICAgICAgICAgICAgcHJlZml4ZXMgfD0gUFJFRklYX0RBVEE7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDY3OgorICAgICAgICAgICAgcHJlZml4ZXMgfD0gUFJFRklYX0FEUjsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4NDAgLi4uIDB4NGY6CisgICAgICAgICAgICAvKiBSRVggcHJlZml4ICovCisgICAgICAgICAgICByZXhfdyA9IChiID4+IDMpICYgMTsKKyAgICAgICAgICAgIHJleF9yID0gKGIgJiAweDQpIDw8IDE7CisgICAgICAgICAgICBzLT5yZXhfeCA9IChiICYgMHgyKSA8PCAyOworICAgICAgICAgICAgUkVYX0IocykgPSAoYiAmIDB4MSkgPDwgMzsKKyAgICAgICAgICAgIHg4Nl82NF9ocmVncyA9IDE7IC8qIHNlbGVjdCB1bmlmb3JtIGJ5dGUgcmVnaXN0ZXIgYWRkcmVzc2luZyAqLworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJleF93ID09IDEpIHsKKyAgICAgICAgICAgIC8qIDB4NjYgaXMgaWdub3JlZCBpZiByZXgudyBpcyBzZXQgKi8KKyAgICAgICAgICAgIGRmbGFnID0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKQorICAgICAgICAgICAgICAgIGRmbGFnIF49IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocHJlZml4ZXMgJiBQUkVGSVhfQURSKSkKKyAgICAgICAgICAgIGFmbGFnID0gMjsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgICAgc3dpdGNoIChiKSB7CisgICAgICAgIGNhc2UgMHhmMzoKKyAgICAgICAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBaOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIGNhc2UgMHhmMjoKKyAgICAgICAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBOWjsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4ZjA6CisgICAgICAgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4MmU6CisgICAgICAgICAgICBzLT5vdmVycmlkZSA9IFJfQ1M7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDM2OgorICAgICAgICAgICAgcy0+b3ZlcnJpZGUgPSBSX1NTOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIGNhc2UgMHgzZToKKyAgICAgICAgICAgIHMtPm92ZXJyaWRlID0gUl9EUzsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4MjY6CisgICAgICAgICAgICBzLT5vdmVycmlkZSA9IFJfRVM7CisgICAgICAgICAgICBnb3RvIG5leHRfYnl0ZTsKKyAgICAgICAgY2FzZSAweDY0OgorICAgICAgICAgICAgcy0+b3ZlcnJpZGUgPSBSX0ZTOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIGNhc2UgMHg2NToKKyAgICAgICAgICAgIHMtPm92ZXJyaWRlID0gUl9HUzsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4NjY6CisgICAgICAgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKKyAgICAgICAgICAgIGdvdG8gbmV4dF9ieXRlOworICAgICAgICBjYXNlIDB4Njc6CisgICAgICAgICAgICBwcmVmaXhlcyB8PSBQUkVGSVhfQURSOworICAgICAgICAgICAgZ290byBuZXh0X2J5dGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RBVEEpIHsKKyAgICAgICAgICAgIGRmbGFnIF49IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZWZpeGVzICYgUFJFRklYX0FEUikgeworICAgICAgICAgICAgYWZsYWcgXj0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnByZWZpeCA9IHByZWZpeGVzOworICAgIHMtPmFmbGFnID0gYWZsYWc7CisgICAgcy0+ZGZsYWcgPSBkZmxhZzsKKworICAgIC8qIGxvY2sgZ2VuZXJhdGlvbiAqLworICAgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKQorICAgICAgICBnZW5faGVscGVyX2xvY2soKTsKKworICAgIC8qIG5vdyBjaGVjayBvcCBjb2RlICovCisgcmVzd2l0Y2g6CisgICAgc3dpdGNoKGIpIHsKKyAgICBjYXNlIDB4MGY6CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogZXh0ZW5kZWQgb3AgY29kZSAqLworICAgICAgICBiID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspIHwgMHgxMDA7CisgICAgICAgIGdvdG8gcmVzd2l0Y2g7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBhcml0aCAmIGxvZ2ljICovCisgICAgY2FzZSAweDAwIC4uLiAweDA1OgorICAgIGNhc2UgMHgwOCAuLi4gMHgwZDoKKyAgICBjYXNlIDB4MTAgLi4uIDB4MTU6CisgICAgY2FzZSAweDE4IC4uLiAweDFkOgorICAgIGNhc2UgMHgyMCAuLi4gMHgyNToKKyAgICBjYXNlIDB4MjggLi4uIDB4MmQ6CisgICAgY2FzZSAweDMwIC4uLiAweDM1OgorICAgIGNhc2UgMHgzOCAuLi4gMHgzZDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wLCBmLCB2YWw7CisgICAgICAgICAgICBvcCA9IChiID4+IDMpICYgNzsKKyAgICAgICAgICAgIGYgPSAoYiA+PiAxKSAmIDM7CisKKyAgICAgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworCisgICAgICAgICAgICBzd2l0Y2goZikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBPUCBFdiwgR3YgKi8KKyAgICAgICAgICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIG9wcmVnID0gT1JfVE1QMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IE9QX1hPUkwgJiYgcm0gPT0gcmVnKSB7CisgICAgICAgICAgICAgICAgeG9yX3plcm86CisgICAgICAgICAgICAgICAgICAgIC8qIHhvciByZWcsIHJlZyBvcHRpbWlzYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX21vdmxfVDBfMCgpOworICAgICAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTE9HSUNCICsgb3QpOworICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcmVnKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX3VwZGF0ZTFfY2MoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3ByZWcgPSBybTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDEsIHJlZyk7CisgICAgICAgICAgICAgICAgZ2VuX29wKHMsIG9wLCBvdCwgb3ByZWcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvKiBPUCBHdiwgRXYgKi8KKyAgICAgICAgICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICAgICAgICAgIHJlZyA9ICgobW9kcm0gPj4gMykgJiA3KSB8IHJleF9yOworICAgICAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMV9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcCA9PSBPUF9YT1JMICYmIHJtID09IHJlZykgeworICAgICAgICAgICAgICAgICAgICBnb3RvIHhvcl96ZXJvOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAxLCBybSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9vcChzLCBvcCwgb3QsIHJlZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IC8qIE9QIEEsIEl2ICovCisgICAgICAgICAgICAgICAgdmFsID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdmxfVDFfaW0odmFsKTsKKyAgICAgICAgICAgICAgICBnZW5fb3Aocywgb3AsIG90LCBPUl9FQVgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDgyOgorICAgICAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgIGNhc2UgMHg4MDogLyogR1JQMSAqLworICAgIGNhc2UgMHg4MToKKyAgICBjYXNlIDB4ODM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWw7CisKKyAgICAgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworCisgICAgICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICBvcCA9IChtb2RybSA+PiAzKSAmIDc7CisKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGlmIChiID09IDB4ODMpCisgICAgICAgICAgICAgICAgICAgIHMtPnJpcF9vZmZzZXQgPSAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+cmlwX29mZnNldCA9IGluc25fY29uc3Rfc2l6ZShvdCk7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgb3ByZWcgPSBPUl9UTVAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcHJlZyA9IHJtOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2goYikgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhc2UgMHg4MDoKKyAgICAgICAgICAgIGNhc2UgMHg4MToKKyAgICAgICAgICAgIGNhc2UgMHg4MjoKKyAgICAgICAgICAgICAgICB2YWwgPSBpbnNuX2dldChlbnYsIHMsIG90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg4MzoKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50OF90KWluc25fZ2V0KGVudiwgcywgT1RfQllURSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZW5fb3BfbW92bF9UMV9pbSh2YWwpOworICAgICAgICAgICAgZ2VuX29wKHMsIG9wLCBvdCwgb3ByZWcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogaW5jLCBkZWMsIGFuZCBvdGhlciBtaXNjIGFyaXRoICovCisgICAgY2FzZSAweDQwIC4uLiAweDQ3OiAvKiBpbmMgR3YgKi8KKyAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICBnZW5faW5jKHMsIG90LCBPUl9FQVggKyAoYiAmIDcpLCAxKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQ4IC4uLiAweDRmOiAvKiBkZWMgR3YgKi8KKyAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICBnZW5faW5jKHMsIG90LCBPUl9FQVggKyAoYiAmIDcpLCAtMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhmNjogLyogR1JQMyAqLworICAgIGNhc2UgMHhmNzoKKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgb3AgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgIGlmIChvcCA9PSAwKQorICAgICAgICAgICAgICAgIHMtPnJpcF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIHJtKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChvcCkgeworICAgICAgICBjYXNlIDA6IC8qIHRlc3QgKi8KKyAgICAgICAgICAgIHZhbCA9IGluc25fZ2V0KGVudiwgcywgb3QpOworICAgICAgICAgICAgZ2VuX29wX21vdmxfVDFfaW0odmFsKTsKKyAgICAgICAgICAgIGdlbl9vcF90ZXN0bF9UMF9UMV9jYygpOworICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0xPR0lDQiArIG90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIG5vdCAqLworICAgICAgICAgICAgdGNnX2dlbl9ub3RfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCBybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOiAvKiBuZWcgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fbmVnX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX29wX3VwZGF0ZV9uZWdfY2MoKTsKKyAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9TVUJCICsgb3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogbXVsICovCisgICAgICAgICAgICBzd2l0Y2gob3QpIHsKKyAgICAgICAgICAgIGNhc2UgT1RfQllURToKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9CWVRFLCAxLCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQ4dV90bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0OHVfdGwoY3B1X1RbMV0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IHVzZSAzMiBiaXQgbXVsIHdoaWNoIGNvdWxkIGJlIGZhc3RlciAqLworICAgICAgICAgICAgICAgIHRjZ19nZW5fbXVsX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX1dPUkQsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9jY19zcmMsIGNwdV9UWzBdLCAweGZmMDApOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9NVUxCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9XT1JELCAxLCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV90bChjcHVfVFsxXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIC8qIFhYWDogdXNlIDMyIGJpdCBtdWwgd2hpY2ggY291bGQgYmUgZmFzdGVyICovCisgICAgICAgICAgICAgICAgdGNnX2dlbl9tdWxfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FQVgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19kc3QsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCAxNik7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FRFgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19zcmMsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTVVMVyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBPVF9MT05HOgorI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAxLCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bChjcHVfVFsxXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbXVsX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgMzIpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIFJfRURYKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2Nfc3JjLCBjcHVfVFswXSk7CisjZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgdDAsIHQxOworICAgICAgICAgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgdDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0xPTkcsIDEsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodDAsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodDEsIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tdWxfaTY0KHQwLCB0MCwgdDEpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIoY3B1X1RbMF0sIHQwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfTE9ORywgUl9FQVgpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDAsIHQwLCAzMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMihjcHVfVFswXSwgdDApOworICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9MT05HLCBSX0VEWCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19zcmMsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTVVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgY2FzZSBPVF9RVUFEOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVscV9FQVhfVDAoY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9NVUxRKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTogLyogaW11bCAqLworICAgICAgICAgICAgc3dpdGNoKG90KSB7CisgICAgICAgICAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfQllURSwgMSwgUl9FQVgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0OHNfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDhzX3RsKGNwdV9UWzFdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICAgICAgLyogWFhYOiB1c2UgMzIgYml0IG11bCB3aGljaCBjb3VsZCBiZSBmYXN0ZXIgKi8KKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX211bF90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9XT1JELCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0OHNfdGwoY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfY2Nfc3JjLCBjcHVfVFswXSwgY3B1X3RtcDApOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9NVUxCKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1RfV09SRDoKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9XT1JELCAxLCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQxNnNfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfVFsxXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIC8qIFhYWDogdXNlIDMyIGJpdCBtdWwgd2hpY2ggY291bGQgYmUgZmFzdGVyICovCisgICAgICAgICAgICAgICAgdGNnX2dlbl9tdWxfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FQVgpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19kc3QsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfdG1wMCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9jY19zcmMsIGNwdV9UWzBdLCBjcHVfdG1wMCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgMTYpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX1dPUkQsIFJfRURYKTsKKyAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTVVMVyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBPVF9MT05HOgorI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAxLCBSX0VBWCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfVFsxXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbXVsX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgY3B1X1RbMV0pOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfY2Nfc3JjLCBjcHVfVFswXSwgY3B1X3RtcDApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV90bChjcHVfVFswXSwgY3B1X1RbMF0sIDMyKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9MT05HLCBSX0VEWCk7CisjZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgdDAsIHQxOworICAgICAgICAgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgdDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0xPTkcsIDEsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leHRfaTMyX2k2NCh0MCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KHQxLCBjcHVfVFsxXSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgdDAsIHQxKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKGNwdV9UWzBdLCB0MCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfdGwoY3B1X3RtcDAsIGNwdV9UWzBdLCAzMSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDAsIHQwLCAzMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMihjcHVfVFswXSwgdDApOworICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9MT05HLCBSX0VEWCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9jY19zcmMsIGNwdV9UWzBdLCBjcHVfdG1wMCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX01VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgIGNhc2UgT1RfUVVBRDoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ltdWxxX0VBWF9UMChjcHVfZW52LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX01VTFEpOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBkaXYgKi8KKyAgICAgICAgICAgIHN3aXRjaChvdCkgeworICAgICAgICAgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RpdmJfQUwoY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RpdndfQVgoY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhc2UgT1RfTE9ORzoKKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9kaXZsX0VBWChjcHVfZW52LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgY2FzZSBPVF9RVUFEOgorICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RpdnFfRUFYKGNwdV9lbnYsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzogLyogaWRpdiAqLworICAgICAgICAgICAgc3dpdGNoKG90KSB7CisgICAgICAgICAgICBjYXNlIE9UX0JZVEU6CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfaWRpdmJfQUwoY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2lkaXZ3X0FYKGNwdV9lbnYsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIE9UX0xPTkc6CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfaWRpdmxfRUFYKGNwdV9lbnYsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgICAgICBjYXNlIE9UX1FVQUQ6CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfaWRpdnFfRUFYKGNwdV9lbnYsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4ZmU6IC8qIEdSUDQgKi8KKyAgICBjYXNlIDB4ZmY6IC8qIEdSUDUgKi8KKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgb3AgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBpZiAob3AgPj0gMiAmJiBiID09IDB4ZmUpIHsKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ09ERTY0KHMpKSB7CisgICAgICAgICAgICBpZiAob3AgPT0gMiB8fCBvcCA9PSA0KSB7CisgICAgICAgICAgICAgICAgLyogb3BlcmFuZCBzaXplIGZvciBqdW1wcyBpcyA2NCBiaXQgKi8KKyAgICAgICAgICAgICAgICBvdCA9IE9UX1FVQUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IDMgfHwgb3AgPT0gNSkgeworICAgICAgICAgICAgICAgIC8qIGZvciBjYWxsIGNhbGxzLCB0aGUgb3BlcmFuZCBpcyAxNiBvciAzMiBiaXQsIGV2ZW4KKyAgICAgICAgICAgICAgICAgICBpbiBsb25nIG1vZGUgKi8KKyAgICAgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID09IDYpIHsKKyAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IHB1c2ggc2l6ZSBpcyA2NCBiaXQgKi8KKyAgICAgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfUVVBRCA6IE9UX1dPUkQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIGlmIChvcCA+PSAyICYmIG9wICE9IDMgJiYgb3AgIT0gNSkKKyAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIHJtKTsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaChvcCkgeworICAgICAgICBjYXNlIDA6IC8qIGluYyBFdiAqLworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKQorICAgICAgICAgICAgICAgIG9wcmVnID0gT1JfVE1QMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvcHJlZyA9IHJtOworICAgICAgICAgICAgZ2VuX2luYyhzLCBvdCwgb3ByZWcsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogZGVjIEV2ICovCisgICAgICAgICAgICBpZiAobW9kICE9IDMpCisgICAgICAgICAgICAgICAgb3ByZWcgPSBPUl9UTVAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wcmVnID0gcm07CisgICAgICAgICAgICBnZW5faW5jKHMsIG90LCBvcHJlZywgLTEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogY2FsbCBFdiAqLworICAgICAgICAgICAgLyogWFhYOiBvcHRpbWl6ZSBpZiBtZW1vcnkgKG5vICdhbmQnIGlzIG5lY2Vzc2FyeSkgKi8KKyAgICAgICAgICAgIGlmIChzLT5kZmxhZyA9PSAwKQorICAgICAgICAgICAgICAgIGdlbl9vcF9hbmRsX1QwX2ZmZmYoKTsKKyAgICAgICAgICAgIG5leHRfZWlwID0gcy0+cGMgLSBzLT5jc19iYXNlOworICAgICAgICAgICAgZ2VuX21vdnRsX1QxX2ltKG5leHRfZWlwKTsKKyAgICAgICAgICAgIGdlbl9wdXNoX1QxKHMpOworICAgICAgICAgICAgZ2VuX29wX2ptcF9UMCgpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8qIGxjYWxsIEV2ICovCisgICAgICAgICAgICBnZW5fb3BfbGRfVDFfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgZ2VuX2FkZF9BMF9pbShzLCAxIDw8IChvdCAtIE9UX1dPUkQgKyAxKSk7CisgICAgICAgICAgICBnZW5fb3BfbGR1X1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICBkb19sY2FsbDoKKyAgICAgICAgICAgIGlmIChzLT5wZSAmJiAhcy0+dm04NikgeworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbGNhbGxfcHJvdGVjdGVkKGNwdV9lbnYsIGNwdV90bXAyX2kzMiwgY3B1X1RbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihkZmxhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihzLT5wYyAtIHBjX3N0YXJ0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbGNhbGxfcmVhbChjcHVfZW52LCBjcHVfdG1wMl9pMzIsIGNwdV9UWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY29uc3RfaTMyKGRmbGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihzLT5wYyAtIHMtPmNzX2Jhc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAvKiBqbXAgRXYgKi8KKyAgICAgICAgICAgIGlmIChzLT5kZmxhZyA9PSAwKQorICAgICAgICAgICAgICAgIGdlbl9vcF9hbmRsX1QwX2ZmZmYoKTsKKyAgICAgICAgICAgIGdlbl9vcF9qbXBfVDAoKTsKKyAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OiAvKiBsam1wIEV2ICovCisgICAgICAgICAgICBnZW5fb3BfbGRfVDFfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgZ2VuX2FkZF9BMF9pbShzLCAxIDw8IChvdCAtIE9UX1dPUkQgKyAxKSk7CisgICAgICAgICAgICBnZW5fb3BfbGR1X1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICBkb19sam1wOgorICAgICAgICAgICAgaWYgKHMtPnBlICYmICFzLT52bTg2KSB7CisgICAgICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9sam1wX3Byb3RlY3RlZChjcHVfZW52LCBjcHVfdG1wMl9pMzIsIGNwdV9UWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMihzLT5wYyAtIHBjX3N0YXJ0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX3NlZ19UMF92bShSX0NTKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92bF9UMF9UMSgpOworICAgICAgICAgICAgICAgIGdlbl9vcF9qbXBfVDAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBwdXNoIEV2ICovCisgICAgICAgICAgICBnZW5fcHVzaF9UMChzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDg0OiAvKiB0ZXN0IEV2LCBHdiAqLworICAgIGNhc2UgMHg4NToKKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisKKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMSwgcmVnKTsKKyAgICAgICAgZ2VuX29wX3Rlc3RsX1QwX1QxX2NjKCk7CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9MT0dJQ0IgKyBvdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweGE4OiAvKiB0ZXN0IGVBWCwgSXYgKi8KKyAgICBjYXNlIDB4YTk6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICB2YWwgPSBpbnNuX2dldChlbnYsIHMsIG90KTsKKworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgT1JfRUFYKTsKKyAgICAgICAgZ2VuX29wX21vdmxfVDFfaW0odmFsKTsKKyAgICAgICAgZ2VuX29wX3Rlc3RsX1QwX1QxX2NjKCk7CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9MT0dJQ0IgKyBvdCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDk4OiAvKiBDV0RFL0NCVyAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGRmbGFnID09IDIpIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0xPTkcsIDAsIFJfRUFYKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9RVUFELCBSX0VBWCk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmIChkZmxhZyA9PSAxKSB7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9XT1JELCAwLCBSX0VBWCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfTE9ORywgUl9FQVgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfQllURSwgMCwgUl9FQVgpOworICAgICAgICAgICAgdGNnX2dlbl9leHQ4c190bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FQVgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5OTogLyogQ0RRL0NXRCAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGRmbGFnID09IDIpIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX1FVQUQsIDAsIFJfRUFYKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2FyaV90bChjcHVfVFswXSwgY3B1X1RbMF0sIDYzKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX1FVQUQsIFJfRURYKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKGRmbGFnID09IDEpIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0xPTkcsIDAsIFJfRUFYKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCAzMSk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9MT05HLCBSX0VEWCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9XT1JELCAwLCBSX0VBWCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgdGNnX2dlbl9zYXJpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgMTUpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FRFgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxYWY6IC8qIGltdWwgR3YsIEV2ICovCisgICAgY2FzZSAweDY5OiAvKiBpbXVsIEd2LCBFdiwgSSAqLworICAgIGNhc2UgMHg2YjoKKyAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgaWYgKGIgPT0gMHg2OSkKKyAgICAgICAgICAgIHMtPnJpcF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOworICAgICAgICBlbHNlIGlmIChiID09IDB4NmIpCisgICAgICAgICAgICBzLT5yaXBfb2Zmc2V0ID0gMTsKKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOworICAgICAgICBpZiAoYiA9PSAweDY5KSB7CisgICAgICAgICAgICB2YWwgPSBpbnNuX2dldChlbnYsIHMsIG90KTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QxX2ltKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoYiA9PSAweDZiKSB7CisgICAgICAgICAgICB2YWwgPSAoaW50OF90KWluc25fZ2V0KGVudiwgcywgT1RfQllURSk7CisgICAgICAgICAgICBnZW5fb3BfbW92bF9UMV9pbSh2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDEsIHJlZyk7CisgICAgICAgIH0KKworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKG90ID09IE9UX1FVQUQpIHsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaW11bHFfVDBfVDEoY3B1X1RbMF0sIGNwdV9lbnYsIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmIChvdCA9PSBPVF9MT05HKSB7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X1RbMV0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX211bF90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X3RtcDAsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfY2Nfc3JjLCBjcHVfVFswXSwgY3B1X3RtcDApOworI2Vsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IHQwLCB0MTsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICAgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KHQwLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0X2kzMl9pNjQodDEsIGNwdV9UWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tdWxfaTY0KHQwLCB0MCwgdDEpOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIoY3B1X1RbMF0sIHQwKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfdGwoY3B1X3RtcDAsIGNwdV9UWzBdLCAzMSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDAsIHQwLCAzMik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMihjcHVfVFsxXSwgdDApOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl90bChjcHVfY2Nfc3JjLCBjcHVfVFsxXSwgY3B1X3RtcDApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9leHQxNnNfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZzX3RsKGNwdV9UWzFdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICAvKiBYWFg6IHVzZSAzMiBiaXQgbXVsIHdoaWNoIGNvdWxkIGJlIGZhc3RlciAqLworICAgICAgICAgICAgdGNnX2dlbl9tdWxfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfY2NfZHN0LCBjcHVfVFswXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfdG1wMCwgY3B1X1RbMF0pOworICAgICAgICAgICAgdGNnX2dlbl9zdWJfdGwoY3B1X2NjX3NyYywgY3B1X1RbMF0sIGNwdV90bXAwKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcmVnKTsKKyAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX01VTEIgKyBvdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxYzA6CisgICAgY2FzZSAweDFjMTogLyogeGFkZCBFdiwgR3YgKi8KKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgcmVnKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAxLCBybSk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9UMF9UMSgpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDEob3QsIHJlZyk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgcmVnKTsKKyAgICAgICAgICAgIGdlbl9vcF9sZF9UMV9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICBnZW5fb3BfYWRkbF9UMF9UMSgpOworICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QxKG90LCByZWcpOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF91cGRhdGUyX2NjKCk7CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9BRERCICsgb3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWIwOgorICAgIGNhc2UgMHgxYjE6IC8qIGNtcHhjaGcgRXYsIEd2ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsYWJlbDEsIGxhYmVsMjsKKyAgICAgICAgICAgIFRDR3YgdDAsIHQxLCB0MiwgYTA7CisKKyAgICAgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgdDEgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgIHQyID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgICAgICAgICBhMCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgZ2VuX29wX21vdl92X3JlZyhvdCwgdDEsIHJlZyk7CisgICAgICAgICAgICBpZiAobW9kID09IDMpIHsKKyAgICAgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl92X3JlZyhvdCwgdDAsIHJtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoYTAsIGNwdV9BMCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX2xkX3Yob3QgKyBzLT5tZW1faW5kZXgsIHQwLCBhMCk7CisgICAgICAgICAgICAgICAgcm0gPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYWJlbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKHQyLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgcmVnc1tSX0VBWF0pKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKHQyLCB0MiwgdDApOworICAgICAgICAgICAgZ2VuX2V4dHUob3QsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgdDIsIDAsIGxhYmVsMSk7CisgICAgICAgICAgICBpZiAobW9kID09IDMpIHsKKyAgICAgICAgICAgICAgICBsYWJlbDIgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgUl9FQVgsIHQwKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2JyKGxhYmVsMik7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsYWJlbDEpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX3Yob3QsIHJtLCB0MSk7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsYWJlbDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bCh0MSwgdDApOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX3Yob3QsIFJfRUFYLCB0MCk7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsYWJlbDEpOworICAgICAgICAgICAgICAgIC8qIGFsd2F5cyBzdG9yZSAqLworICAgICAgICAgICAgICAgIGdlbl9vcF9zdF92KG90ICsgcy0+bWVtX2luZGV4LCB0MSwgYTApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX3NyYywgdDApOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2NjX2RzdCwgdDIpOworICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX1NVQkIgKyBvdCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0Mik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKGEwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWM3OiAvKiBjbXB4Y2hnOGIgKi8KKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIGlmICgobW9kID09IDMpIHx8ICgobW9kcm0gJiAweDM4KSAhPSAweDgpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGRmbGFnID09IDIpIHsKKyAgICAgICAgICAgIGlmICghKHMtPmNwdWlkX2V4dF9mZWF0dXJlcyAmIENQVUlEX0VYVF9DWDE2KSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcHhjaGcxNmIoY3B1X2VudiwgY3B1X0EwKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCEocy0+Y3B1aWRfZmVhdHVyZXMgJiBDUFVJRF9DWDgpKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21weGNoZzhiKGNwdV9lbnYsIGNwdV9BMCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogcHVzaC9wb3AgKi8KKyAgICBjYXNlIDB4NTAgLi4uIDB4NTc6IC8qIHB1c2ggKi8KKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfTE9ORywgMCwgKGIgJiA3KSB8IFJFWF9CKHMpKTsKKyAgICAgICAgZ2VuX3B1c2hfVDAocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1OCAuLi4gMHg1ZjogLyogcG9wICovCisgICAgICAgIGlmIChDT0RFNjQocykpIHsKKyAgICAgICAgICAgIG90ID0gZGZsYWcgPyBPVF9RVUFEIDogT1RfV09SRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICB9CisgICAgICAgIGdlbl9wb3BfVDAocyk7CisgICAgICAgIC8qIE5PVEU6IG9yZGVyIGlzIGltcG9ydGFudCBmb3IgcG9wICVzcCAqLworICAgICAgICBnZW5fcG9wX3VwZGF0ZShzKTsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIChiICYgNykgfCBSRVhfQihzKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2MDogLyogcHVzaGEgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX3B1c2hhKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NjE6IC8qIHBvcGEgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX3BvcGEocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2ODogLyogcHVzaCBJdiAqLworICAgIGNhc2UgMHg2YToKKyAgICAgICAgaWYgKENPREU2NChzKSkgeworICAgICAgICAgICAgb3QgPSBkZmxhZyA/IE9UX1FVQUQgOiBPVF9XT1JEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIgPT0gMHg2OCkKKyAgICAgICAgICAgIHZhbCA9IGluc25fZ2V0KGVudiwgcywgb3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2YWwgPSAoaW50OF90KWluc25fZ2V0KGVudiwgcywgT1RfQllURSk7CisgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHZhbCk7CisgICAgICAgIGdlbl9wdXNoX1QwKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4OGY6IC8qIHBvcCBFdiAqLworICAgICAgICBpZiAoQ09ERTY0KHMpKSB7CisgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfUVVBRCA6IE9UX1dPUkQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgfQorICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgZ2VuX3BvcF9UMChzKTsKKyAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICAvKiBOT1RFOiBvcmRlciBpcyBpbXBvcnRhbnQgZm9yIHBvcCAlc3AgKi8KKyAgICAgICAgICAgIGdlbl9wb3BfdXBkYXRlKHMpOworICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IG9yZGVyIGlzIGltcG9ydGFudCB0b28gZm9yIE1NVSBleGNlcHRpb25zICovCisgICAgICAgICAgICBzLT5wb3BsX2VzcF9oYWNrID0gMSA8PCBvdDsKKyAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTsKKyAgICAgICAgICAgIHMtPnBvcGxfZXNwX2hhY2sgPSAwOworICAgICAgICAgICAgZ2VuX3BvcF91cGRhdGUocyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGM4OiAvKiBlbnRlciAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGV2ZWw7CisgICAgICAgICAgICB2YWwgPSBjcHVfbGR1d19jb2RlKGVudiwgcy0+cGMpOworICAgICAgICAgICAgcy0+cGMgKz0gMjsKKyAgICAgICAgICAgIGxldmVsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgZ2VuX2VudGVyKHMsIHZhbCwgbGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjOTogLyogbGVhdmUgKi8KKyAgICAgICAgLyogWFhYOiBleGNlcHRpb24gbm90IHByZWNpc2UgKEVTUCBpcyB1cGRhdGVkIGJlZm9yZSBwb3RlbnRpYWwgZXhjZXB0aW9uKSAqLworICAgICAgICBpZiAoQ09ERTY0KHMpKSB7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9RVUFELCAwLCBSX0VCUCk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9RVUFELCBSX0VTUCk7CisgICAgICAgIH0gZWxzZSBpZiAocy0+c3MzMikgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfTE9ORywgMCwgUl9FQlApOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfTE9ORywgUl9FU1ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfV09SRCwgMCwgUl9FQlApOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfV09SRCwgUl9FU1ApOworICAgICAgICB9CisgICAgICAgIGdlbl9wb3BfVDAocyk7CisgICAgICAgIGlmIChDT0RFNjQocykpIHsKKyAgICAgICAgICAgIG90ID0gZGZsYWcgPyBPVF9RVUFEIDogT1RfV09SRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICB9CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCBSX0VCUCk7CisgICAgICAgIGdlbl9wb3BfdXBkYXRlKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDY6IC8qIHB1c2ggZXMgKi8KKyAgICBjYXNlIDB4MGU6IC8qIHB1c2ggY3MgKi8KKyAgICBjYXNlIDB4MTY6IC8qIHB1c2ggc3MgKi8KKyAgICBjYXNlIDB4MWU6IC8qIHB1c2ggZHMgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX29wX21vdmxfVDBfc2VnKGIgPj4gMyk7CisgICAgICAgIGdlbl9wdXNoX1QwKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWEwOiAvKiBwdXNoIGZzICovCisgICAgY2FzZSAweDFhODogLyogcHVzaCBncyAqLworICAgICAgICBnZW5fb3BfbW92bF9UMF9zZWcoKGIgPj4gMykgJiA3KTsKKyAgICAgICAgZ2VuX3B1c2hfVDAocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwNzogLyogcG9wIGVzICovCisgICAgY2FzZSAweDE3OiAvKiBwb3Agc3MgKi8KKyAgICBjYXNlIDB4MWY6IC8qIHBvcCBkcyAqLworICAgICAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICByZWcgPSBiID4+IDM7CisgICAgICAgIGdlbl9wb3BfVDAocyk7CisgICAgICAgIGdlbl9tb3ZsX3NlZ19UMChzLCByZWcsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGdlbl9wb3BfdXBkYXRlKHMpOworICAgICAgICBpZiAocmVnID09IFJfU1MpIHsKKyAgICAgICAgICAgIC8qIGlmIHJlZyA9PSBTUywgaW5oaWJpdCBpbnRlcnJ1cHRzL3RyYWNlLiAqLworICAgICAgICAgICAgLyogSWYgc2V2ZXJhbCBpbnN0cnVjdGlvbnMgZGlzYWJsZSBpbnRlcnJ1cHRzLCBvbmx5IHRoZQorICAgICAgICAgICAgICAgX2ZpcnN0XyBkb2VzIGl0ICovCisgICAgICAgICAgICBpZiAoIShzLT50Yi0+ZmxhZ3MgJiBIRl9JTkhJQklUX0lSUV9NQVNLKSkKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NldF9pbmhpYml0X2lycShjcHVfZW52KTsKKyAgICAgICAgICAgIHMtPnRmID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+aXNfam1wKSB7CisgICAgICAgICAgICBnZW5fam1wX2ltKHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxYTE6IC8qIHBvcCBmcyAqLworICAgIGNhc2UgMHgxYTk6IC8qIHBvcCBncyAqLworICAgICAgICBnZW5fcG9wX1QwKHMpOworICAgICAgICBnZW5fbW92bF9zZWdfVDAocywgKGIgPj4gMykgJiA3LCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICBnZW5fcG9wX3VwZGF0ZShzKTsKKyAgICAgICAgaWYgKHMtPmlzX2ptcCkgeworICAgICAgICAgICAgZ2VuX2ptcF9pbShzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIG1vdiAqLworICAgIGNhc2UgMHg4ODoKKyAgICBjYXNlIDB4ODk6IC8qIG1vdiBHdiwgRXYgKi8KKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKworICAgICAgICAvKiBnZW5lcmF0ZSBhIGdlbmVyaWMgc3RvcmUgKi8KKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIHJlZywgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjNjoKKyAgICBjYXNlIDB4Yzc6IC8qIG1vdiBFdiwgSXYgKi8KKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgIHMtPnJpcF9vZmZzZXQgPSBpbnNuX2NvbnN0X3NpemUob3QpOworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7CisgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHZhbCk7CisgICAgICAgIGlmIChtb2QgIT0gMykKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKG90LCAobW9kcm0gJiA3KSB8IFJFWF9CKHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDhhOgorICAgIGNhc2UgMHg4YjogLyogbW92IEV2LCBHdiAqLworICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IE9UX1dPUkQgKyBkZmxhZzsKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIHJlZyA9ICgobW9kcm0gPj4gMykgJiA3KSB8IHJleF9yOworCisgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJlZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4ZTogLyogbW92IHNlZywgR3YgKi8KKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIHJlZyA9IChtb2RybSA+PiAzKSAmIDc7CisgICAgICAgIGlmIChyZWcgPj0gNiB8fCByZWcgPT0gUl9DUykKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgT1RfV09SRCwgT1JfVE1QMCwgMCk7CisgICAgICAgIGdlbl9tb3ZsX3NlZ19UMChzLCByZWcsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGlmIChyZWcgPT0gUl9TUykgeworICAgICAgICAgICAgLyogaWYgcmVnID09IFNTLCBpbmhpYml0IGludGVycnVwdHMvdHJhY2UgKi8KKyAgICAgICAgICAgIC8qIElmIHNldmVyYWwgaW5zdHJ1Y3Rpb25zIGRpc2FibGUgaW50ZXJydXB0cywgb25seSB0aGUKKyAgICAgICAgICAgICAgIF9maXJzdF8gZG9lcyBpdCAqLworICAgICAgICAgICAgaWYgKCEocy0+dGItPmZsYWdzICYgSEZfSU5ISUJJVF9JUlFfTUFTSykpCisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zZXRfaW5oaWJpdF9pcnEoY3B1X2Vudik7CisgICAgICAgICAgICBzLT50ZiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmlzX2ptcCkgeworICAgICAgICAgICAgZ2VuX2ptcF9pbShzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4OGM6IC8qIG1vdiBHdiwgc2VnICovCisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBpZiAocmVnID49IDYpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl9vcF9tb3ZsX1QwX3NlZyhyZWcpOworICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICBvdCA9IE9UX1dPUkQgKyBkZmxhZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBPVF9XT1JEOworICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBvdCwgT1JfVE1QMCwgMSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAweDFiNjogLyogbW92emJTIEd2LCBFYiAqLworICAgIGNhc2UgMHgxYjc6IC8qIG1vdnp3UyBHdiwgRWIgKi8KKyAgICBjYXNlIDB4MWJlOiAvKiBtb3ZzYlMgR3YsIEViICovCisgICAgY2FzZSAweDFiZjogLyogbW92c3dTIEd2LCBFYiAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgZF9vdDsKKyAgICAgICAgICAgIC8qIGRfb3QgaXMgdGhlIHNpemUgb2YgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgIGRfb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgICAgICAvKiBvdCBpcyB0aGUgc2l6ZSBvZiBzb3VyY2UgKi8KKyAgICAgICAgICAgIG90ID0gKGIgJiAxKSArIE9UX0JZVEU7CisgICAgICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgIHJlZyA9ICgobW9kcm0gPj4gMykgJiA3KSB8IHJleF9yOworICAgICAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKworICAgICAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIHJtKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2gob3QgfCAoYiAmIDgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPVF9CWVRFOgorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDh1X3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1RfQllURSB8IDg6CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0OHNfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPVF9XT1JEOgorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDE2dV90bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNhc2UgT1RfV09SRCB8IDg6CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZzX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChkX290LCByZWcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBpZiAoYiAmIDgpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkc19UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkdV9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKGRfb3QsIHJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4OGQ6IC8qIGxlYSAqLworICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgIC8qIHdlIG11c3QgZW5zdXJlIHRoYXQgbm8gc2VnbWVudCBpcyBhZGRlZCAqLworICAgICAgICBzLT5vdmVycmlkZSA9IC0xOworICAgICAgICB2YWwgPSBzLT5hZGRzZWc7CisgICAgICAgIHMtPmFkZHNlZyA9IDA7CisgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICBzLT5hZGRzZWcgPSB2YWw7CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX0EwKG90IC0gT1RfV09SRCwgcmVnKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4YTA6IC8qIG1vdiBFQVgsIE92ICovCisgICAgY2FzZSAweGExOgorICAgIGNhc2UgMHhhMjogLyogbW92IE92LCBFQVggKi8KKyAgICBjYXNlIDB4YTM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldF91bG9uZyBvZmZzZXRfYWRkcjsKKworICAgICAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKHMtPmFmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfYWRkciA9IGNwdV9sZHFfY29kZShlbnYsIHMtPnBjKTsKKyAgICAgICAgICAgICAgICBzLT5wYyArPSA4OworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZxX0EwX2ltKG9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmFmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9hZGRyID0gaW5zbl9nZXQoZW52LCBzLCBPVF9MT05HKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZmZzZXRfYWRkciA9IGluc25fZ2V0KGVudiwgcywgT1RfV09SRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX2ltKG9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9hZGRfQTBfZHNfc2VnKHMpOworICAgICAgICAgICAgaWYgKChiICYgMikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIFJfRUFYKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhkNzogLyogeGxhdCAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKHMtPmFmbGFnID09IDIpIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZxX0EwX3JlZyhSX0VCWCk7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9RVUFELCAwLCBSX0VBWCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCAweGZmKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkX3RsKGNwdV9BMCwgY3B1X0EwLCBjcHVfVFswXSk7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VCWCk7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCBSX0VBWCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCAweGZmKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkX3RsKGNwdV9BMCwgY3B1X0EwLCBjcHVfVFswXSk7CisgICAgICAgICAgICBpZiAocy0+YWZsYWcgPT0gMCkKKyAgICAgICAgICAgICAgICBnZW5fb3BfYW5kbF9BMF9mZmZmKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9BMCwgY3B1X0EwLCAweGZmZmZmZmZmKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fYWRkX0EwX2RzX3NlZyhzKTsKKyAgICAgICAgZ2VuX29wX2xkdV9UMF9BMChPVF9CWVRFICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfQllURSwgUl9FQVgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4YjAgLi4uIDB4Yjc6IC8qIG1vdiBSLCBJYiAqLworICAgICAgICB2YWwgPSBpbnNuX2dldChlbnYsIHMsIE9UX0JZVEUpOworICAgICAgICBnZW5fb3BfbW92bF9UMF9pbSh2YWwpOworICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9CWVRFLCAoYiAmIDcpIHwgUkVYX0IocykpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4YjggLi4uIDB4YmY6IC8qIG1vdiBSLCBJdiAqLworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgaWYgKGRmbGFnID09IDIpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHRtcDsKKyAgICAgICAgICAgIC8qIDY0IGJpdCBjYXNlICovCisgICAgICAgICAgICB0bXAgPSBjcHVfbGRxX2NvZGUoZW52LCBzLT5wYyk7CisgICAgICAgICAgICBzLT5wYyArPSA4OworICAgICAgICAgICAgcmVnID0gKGIgJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgZ2VuX21vdnRsX1QwX2ltKHRtcCk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9RVUFELCByZWcpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgICAgICB2YWwgPSBpbnNuX2dldChlbnYsIHMsIG90KTsKKyAgICAgICAgICAgIHJlZyA9IChiICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHZhbCk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcmVnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHg5MSAuLi4gMHg5NzogLyogeGNoZyBSLCBFQVggKi8KKyAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIHJlZyA9IChiICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgcm0gPSBSX0VBWDsKKyAgICAgICAgZ290byBkb194Y2hnX3JlZzsKKyAgICBjYXNlIDB4ODY6CisgICAgY2FzZSAweDg3OiAvKiB4Y2hnIEV2LCBHdiAqLworICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIHJlZyA9ICgobW9kcm0gPj4gMykgJiA3KSB8IHJleF9yOworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBpZiAobW9kID09IDMpIHsKKyAgICAgICAgICAgIHJtID0gKG1vZHJtICYgNykgfCBSRVhfQihzKTsKKyAgICAgICAgZG9feGNoZ19yZWc6CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgcmVnKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAxLCBybSk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDEob3QsIHJlZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCByZWcpOworICAgICAgICAgICAgLyogZm9yIHhjaGcsIGxvY2sgaXMgaW1wbGljaXQgKi8KKyAgICAgICAgICAgIGlmICghKHByZWZpeGVzICYgUFJFRklYX0xPQ0spKQorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbG9jaygpOworICAgICAgICAgICAgZ2VuX29wX2xkX1QxX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICBpZiAoIShwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKSkKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3VubG9jaygpOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDEob3QsIHJlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGM0OiAvKiBsZXMgR3YgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgb3AgPSBSX0VTOworICAgICAgICBnb3RvIGRvX2x4eDsKKyAgICBjYXNlIDB4YzU6IC8qIGxkcyBHdiAqLworICAgICAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBvcCA9IFJfRFM7CisgICAgICAgIGdvdG8gZG9fbHh4OworICAgIGNhc2UgMHgxYjI6IC8qIGxzcyBHdiAqLworICAgICAgICBvcCA9IFJfU1M7CisgICAgICAgIGdvdG8gZG9fbHh4OworICAgIGNhc2UgMHgxYjQ6IC8qIGxmcyBHdiAqLworICAgICAgICBvcCA9IFJfRlM7CisgICAgICAgIGdvdG8gZG9fbHh4OworICAgIGNhc2UgMHgxYjU6IC8qIGxncyBHdiAqLworICAgICAgICBvcCA9IFJfR1M7CisgICAgZG9fbHh4OgorICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgaWYgKG1vZCA9PSAzKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgZ2VuX29wX2xkX1QxX0EwKG90ICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgZ2VuX2FkZF9BMF9pbShzLCAxIDw8IChvdCAtIE9UX1dPUkQgKyAxKSk7CisgICAgICAgIC8qIGxvYWQgdGhlIHNlZ21lbnQgZmlyc3QgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgcHJvcGVybHkgKi8KKyAgICAgICAgZ2VuX29wX2xkdV9UMF9BMChPVF9XT1JEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgZ2VuX21vdmxfc2VnX1QwKHMsIG9wLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAvKiB0aGVuIHB1dCB0aGUgZGF0YSAqLworICAgICAgICBnZW5fb3BfbW92X3JlZ19UMShvdCwgcmVnKTsKKyAgICAgICAgaWYgKHMtPmlzX2ptcCkgeworICAgICAgICAgICAgZ2VuX2ptcF9pbShzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBzaGlmdHMgKi8KKyAgICBjYXNlIDB4YzA6CisgICAgY2FzZSAweGMxOgorICAgICAgICAvKiBzaGlmdCBFdixJYiAqLworICAgICAgICBzaGlmdCA9IDI7CisgICAgZ3JwMjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgICAgIG9wID0gKG1vZHJtID4+IDMpICYgNzsKKworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+cmlwX29mZnNldCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIG9wcmVnID0gT1JfVE1QMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3ByZWcgPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzaW1wbGVyIG9wICovCisgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdlbl9zaGlmdChzLCBvcCwgb3QsIG9wcmVnLCBPUl9FQ1gpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2VuX3NoaWZ0aShzLCBvcCwgb3QsIG9wcmVnLCBzaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQwOgorICAgIGNhc2UgMHhkMToKKyAgICAgICAgLyogc2hpZnQgRXYsMSAqLworICAgICAgICBzaGlmdCA9IDE7CisgICAgICAgIGdvdG8gZ3JwMjsKKyAgICBjYXNlIDB4ZDI6CisgICAgY2FzZSAweGQzOgorICAgICAgICAvKiBzaGlmdCBFdixjbCAqLworICAgICAgICBzaGlmdCA9IDA7CisgICAgICAgIGdvdG8gZ3JwMjsKKworICAgIGNhc2UgMHgxYTQ6IC8qIHNobGQgaW1tICovCisgICAgICAgIG9wID0gMDsKKyAgICAgICAgc2hpZnQgPSAxOworICAgICAgICBnb3RvIGRvX3NoaWZ0ZDsKKyAgICBjYXNlIDB4MWE1OiAvKiBzaGxkIGNsICovCisgICAgICAgIG9wID0gMDsKKyAgICAgICAgc2hpZnQgPSAwOworICAgICAgICBnb3RvIGRvX3NoaWZ0ZDsKKyAgICBjYXNlIDB4MWFjOiAvKiBzaHJkIGltbSAqLworICAgICAgICBvcCA9IDE7CisgICAgICAgIHNoaWZ0ID0gMTsKKyAgICAgICAgZ290byBkb19zaGlmdGQ7CisgICAgY2FzZSAweDFhZDogLyogc2hyZCBjbCAqLworICAgICAgICBvcCA9IDE7CisgICAgICAgIHNoaWZ0ID0gMDsKKyAgICBkb19zaGlmdGQ6CisgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIG9wcmVnID0gT1JfVE1QMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wcmVnID0gcm07CisgICAgICAgIH0KKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDEsIHJlZyk7CisKKyAgICAgICAgaWYgKHNoaWZ0KSB7CisgICAgICAgICAgICB2YWwgPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X1QzLCB2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfVDMsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW1JfRUNYXSkpOworICAgICAgICB9CisgICAgICAgIGdlbl9zaGlmdGRfcm1fVDFfVDMocywgb3QsIG9wcmVnLCBvcCk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIGZsb2F0cyAqLworICAgIGNhc2UgMHhkOCAuLi4gMHhkZjoKKyAgICAgICAgaWYgKHMtPmZsYWdzICYgKEhGX0VNX01BU0sgfCBIRl9UU19NQVNLKSkgeworICAgICAgICAgICAgLyogaWYgQ1IwLkVNIG9yIENSMC5UUyBhcmUgc2V0LCBnZW5lcmF0ZSBhbiBGUFUgZXhjZXB0aW9uICovCisgICAgICAgICAgICAvKiBYWFg6IHdoYXQgdG8gZG8gaWYgaWxsZWdhbCBvcCA/ICovCisgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwN19QUkVYLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIHJtID0gbW9kcm0gJiA3OworICAgICAgICBvcCA9ICgoYiAmIDcpIDw8IDMpIHwgKChtb2RybSA+PiAzKSAmIDcpOworICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgIC8qIG1lbW9yeSBvcCAqLworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMCAuLi4gMHgwNzogLyogZnh4eHMgKi8KKyAgICAgICAgICAgIGNhc2UgMHgxMCAuLi4gMHgxNzogLyogZml4eHhsICovCisgICAgICAgICAgICBjYXNlIDB4MjAgLi4uIDB4Mjc6IC8qIGZ4eHhsICovCisgICAgICAgICAgICBjYXNlIDB4MzAgLi4uIDB4Mzc6IC8qIGZpeHh4ICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3AxOworICAgICAgICAgICAgICAgICAgICBvcDEgPSBvcCAmIDc7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKG9wID4+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkX1QwX0EwKE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZHNfRlQwKGNwdV9lbnYsIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkX1QwX0EwKE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZpbGRsX0ZUMChjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KGNwdV90bXAxX2k2NCwgY3B1X0EwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxkbF9GVDAoY3B1X2VudiwgY3B1X3RtcDFfaTY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbGRzX1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZpbGRsX0ZUMChjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZwX2FyaXRoX1NUMF9GVDAob3AxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wMSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmY29tcCBuZWVkcyBwb3AgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnBvcChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwODogLyogZmxkcyAqLworICAgICAgICAgICAgY2FzZSAweDBhOiAvKiBmc3RzICovCisgICAgICAgICAgICBjYXNlIDB4MGI6IC8qIGZzdHBzICovCisgICAgICAgICAgICBjYXNlIDB4MTggLi4uIDB4MWI6IC8qIGZpbGRsLCBmaXN0dHBsLCBmaXN0bCwgZmlzdHBsICovCisgICAgICAgICAgICBjYXNlIDB4MjggLi4uIDB4MmI6IC8qIGZsZGwsIGZpc3R0cGxsLCBmc3RsLCBmc3RwbCAqLworICAgICAgICAgICAgY2FzZSAweDM4IC4uLiAweDNiOiAvKiBmaWxkcywgZmlzdHRwcywgZmlzdHMsIGZpc3RwcyAqLworICAgICAgICAgICAgICAgIHN3aXRjaChvcCAmIDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChvcCA+PiA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbGRzX1NUMChjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9maWxkbF9TVDAoY3B1X2VudiwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQ2NChjcHVfdG1wMV9pNjQsIGNwdV9BMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWVtX2luZGV4ID4+IDIpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZGxfU1QwKGNwdV9lbnYsIGNwdV90bXAxX2k2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkc19UMF9BMChPVF9XT1JEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9maWxkbF9TVDAoY3B1X2VudiwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYOiB0aGUgY29ycmVzcG9uZGluZyBDUFVJRCBiaXQgbXVzdCBiZSB0ZXN0ZWQgISAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3AgPj4gNCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zpc3R0bF9TVDAoY3B1X3RtcDJfaTMyLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoY3B1X1RbMF0sIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAoT1RfTE9ORyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9maXN0dGxsX1NUMChjcHVfdG1wMV9pNjQsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9xZW11X3N0NjQoY3B1X3RtcDFfaTY0LCBjcHVfQTAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmlzdHRfU1QwKGNwdV90bXAyX2kzMiwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2gob3AgPj4gNCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZzdHNfU1QwKGNwdV90bXAyX2kzMiwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmlzdGxfU1QwKGNwdV90bXAyX2kzMiwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnN0bF9TVDAoY3B1X3RtcDFfaTY0LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9zdDY0KGNwdV90bXAxX2k2NCwgY3B1X0EwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tZW1faW5kZXggPj4gMikgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zpc3RfU1QwKGNwdV90bXAyX2kzMiwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChvcCAmIDcpID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zwb3AoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwYzogLyogZmxkZW52IG1lbSAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxkZW52KGNwdV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9BMCwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDBkOiAvKiBmbGRjdyBtZW0gKi8KKyAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoT1RfV09SRCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbGRjdyhjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDBlOiAvKiBmbnN0ZW52IG1lbSAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnN0ZW52KGNwdV9lbnYsIGNwdV9BMCwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDBmOiAvKiBmbnN0Y3cgbWVtICovCisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbnN0Y3coY3B1X3RtcDJfaTMyLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGNwdV9UWzBdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChPVF9XT1JEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxZDogLyogZmxkdCBtZW0gKi8KKyAgICAgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZHRfU1QwKGNwdV9lbnYsIGNwdV9BMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MWY6IC8qIGZzdHB0IG1lbSAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnN0dF9TVDAoY3B1X2VudiwgY3B1X0EwKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zwb3AoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MmM6IC8qIGZyc3RvciBtZW0gKi8KKyAgICAgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zyc3RvcihjcHVfZW52LCBjcHVfQTAsIHRjZ19jb25zdF9pMzIocy0+ZGZsYWcpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgyZTogLyogZm5zYXZlIG1lbSAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnNhdmUoY3B1X2VudiwgY3B1X0EwLCB0Y2dfY29uc3RfaTMyKHMtPmRmbGFnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MmY6IC8qIGZuc3RzdyBtZW0gKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zuc3RzdyhjcHVfdG1wMl9pMzIsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoY3B1X1RbMF0sIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX1dPUkQgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDNjOiAvKiBmYmxkICovCisgICAgICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mYmxkX1NUMChjcHVfZW52LCBjcHVfQTApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDNlOiAvKiBmYnN0cCAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmJzdF9TVDAoY3B1X2VudiwgY3B1X0EwKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zwb3AoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4M2Q6IC8qIGZpbGRsbCAqLworICAgICAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KGNwdV90bXAxX2k2NCwgY3B1X0EwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+bWVtX2luZGV4ID4+IDIpIC0gMSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9maWxkbGxfU1QwKGNwdV9lbnYsIGNwdV90bXAxX2k2NCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4M2Y6IC8qIGZpc3RwbGwgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zpc3RsbF9TVDAoY3B1X3RtcDFfaTY0LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3Q2NChjcHVfdG1wMV9pNjQsIGNwdV9BMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1lbV9pbmRleCA+PiAyKSAtIDEpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnBvcChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogcmVnaXN0ZXIgZmxvYXQgb3BzICovCisgICAgICAgICAgICBvcHJlZyA9IHJtOworCisgICAgICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgICAgIGNhc2UgMHgwODogLyogZmxkIHN0aSAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnB1c2goY3B1X2Vudik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbW92X1NUMF9TVE4oY3B1X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY29uc3RfaTMyKChvcHJlZyArIDEpICYgNykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDA5OiAvKiBmeGNoZyBzdGkgKi8KKyAgICAgICAgICAgIGNhc2UgMHgyOTogLyogZnhjaGc0IHN0aSwgdW5kb2N1bWVudGVkIG9wICovCisgICAgICAgICAgICBjYXNlIDB4Mzk6IC8qIGZ4Y2hnNyBzdGksIHVuZG9jdW1lbnRlZCBvcCAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnhjaGdfU1QwX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MGE6IC8qIGdycCBkOS8yICovCisgICAgICAgICAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBmbm9wICovCisgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGV4Y2VwdGlvbnMgKEZyZWVCU0QgRlBVIHByb2JlKSAqLworICAgICAgICAgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZndhaXQoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MGM6IC8qIGdycCBkOS80ICovCisgICAgICAgICAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBmY2hzICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmNoc19TVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogZmFicyAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZhYnNfU1QwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIGZ0c3QgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbGR6X0ZUMChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mY29tX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogLyogZnhhbSAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Z4YW1fU1QwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDBkOiAvKiBncnAgZDkvNSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnB1c2goY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZDFfU1QwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnB1c2goY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZGwydF9TVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcHVzaChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxkbDJlX1NUMChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZwdXNoKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbGRwaV9TVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcHVzaChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxkbGcyX1NUMChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZwdXNoKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbGRsbjJfU1QwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnB1c2goY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZsZHpfU1QwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MGU6IC8qIGdycCBkOS82ICovCisgICAgICAgICAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBmMnhtMSAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2YyeG0xKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIGZ5bDJ4ICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnlsMngoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogZnB0YW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcHRhbihjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBmcGF0YW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcGF0YW4oY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogLyogZnh0cmFjdCAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Z4dHJhY3QoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogLyogZnByZW0xICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnByZW0xKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDY6IC8qIGZkZWNzdHAgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mZGVjc3RwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNhc2UgNzogLyogZmluY3N0cCAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZpbmNzdHAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwZjogLyogZ3JwIGQ5LzcgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2gocm0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIGZwcmVtICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnByZW0oY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogZnlsMnhwMSAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Z5bDJ4cDEoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogZnNxcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mc3FydChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBmc2luY29zICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnNpbmNvcyhjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OiAvKiBmc2NhbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mc2NhbGUoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogLyogZnJuZGludCAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZybmRpbnQoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjogLyogZnNpbiAqLworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZzaW4oY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSA3OiAvKiBmY29zICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmNvcyhjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDAwOiBjYXNlIDB4MDE6IGNhc2UgMHgwNCAuLi4gMHgwNzogLyogZnh4eCBzdCwgc3RpICovCisgICAgICAgICAgICBjYXNlIDB4MjA6IGNhc2UgMHgyMTogY2FzZSAweDI0IC4uLiAweDI3OiAvKiBmeHh4IHN0aSwgc3QgKi8KKyAgICAgICAgICAgIGNhc2UgMHgzMDogY2FzZSAweDMxOiBjYXNlIDB4MzQgLi4uIDB4Mzc6IC8qIGZ4eHhwIHN0aSwgc3QgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvcDE7CisKKyAgICAgICAgICAgICAgICAgICAgb3AxID0gb3AgJiA3OworICAgICAgICAgICAgICAgICAgICBpZiAob3AgPj0gMHgyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcF9hcml0aF9TVE5fU1QwKG9wMSwgb3ByZWcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID49IDB4MzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbW92X0ZUMF9TVE4oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihvcHJlZykpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcF9hcml0aF9TVDBfRlQwKG9wMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDI6IC8qIGZjb20gKi8KKyAgICAgICAgICAgIGNhc2UgMHgyMjogLyogZmNvbTIsIHVuZG9jdW1lbnRlZCBvcCAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm1vdl9GVDBfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIob3ByZWcpKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zjb21fU1QwX0ZUMChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMzogLyogZmNvbXAgKi8KKyAgICAgICAgICAgIGNhc2UgMHgyMzogLyogZmNvbXAzLCB1bmRvY3VtZW50ZWQgb3AgKi8KKyAgICAgICAgICAgIGNhc2UgMHgzMjogLyogZmNvbXA1LCB1bmRvY3VtZW50ZWQgb3AgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Ztb3ZfRlQwX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mY29tX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDE1OiAvKiBkYS81ICovCisgICAgICAgICAgICAgICAgc3dpdGNoKHJtKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxOiAvKiBmdWNvbXBwICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm1vdl9GVDBfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoMSkpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Z1Y29tX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnBvcChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDFjOgorICAgICAgICAgICAgICAgIHN3aXRjaChybSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLyogZmVuaSAoMjg3IG9ubHksIGp1c3QgZG8gbm9wIGhlcmUpICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogZmRpc2kgKDI4NyBvbmx5LCBqdXN0IGRvIG5vcCBoZXJlKSAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IC8qIGZjbGV4ICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmNsZXgoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzogLyogZm5pbml0ICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm5pbml0KGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIGZzZXRwbSAoMjg3IG9ubHksIGp1c3QgZG8gbm9wIGhlcmUpICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MWQ6IC8qIGZ1Y29taSAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbW92X0ZUMF9TVE4oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihvcHJlZykpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnVjb21pX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MWU6IC8qIGZjb21pICovCisgICAgICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Ztb3ZfRlQwX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mY29taV9TVDBfRlQwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDI4OiAvKiBmZnJlZSBzdGkgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ZmcmVlX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MmE6IC8qIGZzdCBzdGkgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Ztb3ZfU1ROX1NUMChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MmI6IC8qIGZzdHAgc3RpICovCisgICAgICAgICAgICBjYXNlIDB4MGI6IC8qIGZzdHAxIHN0aSwgdW5kb2N1bWVudGVkIG9wICovCisgICAgICAgICAgICBjYXNlIDB4M2E6IC8qIGZzdHA4IHN0aSwgdW5kb2N1bWVudGVkIG9wICovCisgICAgICAgICAgICBjYXNlIDB4M2I6IC8qIGZzdHA5IHN0aSwgdW5kb2N1bWVudGVkIG9wICovCisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbW92X1NUTl9TVDAoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihvcHJlZykpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnBvcChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgyYzogLyogZnVjb20gc3QoaSkgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Ztb3ZfRlQwX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mdWNvbV9TVDBfRlQwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDJkOiAvKiBmdWNvbXAgc3QoaSkgKi8KKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Ztb3ZfRlQwX1NUTihjcHVfZW52LCB0Y2dfY29uc3RfaTMyKG9wcmVnKSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mdWNvbV9TVDBfRlQwKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnBvcChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgzMzogLyogZGUvMyAqLworICAgICAgICAgICAgICAgIHN3aXRjaChybSkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogZmNvbXBwICovCisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm1vdl9GVDBfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoMSkpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zjb21fU1QwX0ZUMChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zwb3AoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Mzg6IC8qIGZmcmVlcCBzdGksIHVuZG9jdW1lbnRlZCBvcCAqLworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZmZyZWVfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIob3ByZWcpKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zwb3AoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4M2M6IC8qIGRmLzQgKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2gocm0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm5zdHN3KGNwdV90bXAyX2kzMiwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoY3B1X1RbMF0sIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX1dPUkQsIFJfRUFYKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgzZDogLyogZnVjb21pcCAqLworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbW92X0ZUMF9TVE4oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihvcHJlZykpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZnVjb21pX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDNlOiAvKiBmY29taXAgKi8KKyAgICAgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm1vdl9GVDBfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIob3ByZWcpKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Zjb21pX1NUMF9GVDAoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mcG9wKGNwdV9lbnYpOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwIC4uLiAweDEzOiAvKiBmY21vdnh4ICovCisgICAgICAgICAgICBjYXNlIDB4MTggLi4uIDB4MWI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3AxLCBsMTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmNtb3ZfY2NbOF0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoSkNDX0IgPDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoSkNDX1ogPDwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoSkNDX0JFIDw8IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKEpDQ19QIDw8IDEpLAorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBvcDEgPSBmY21vdl9jY1tvcCAmIDNdIHwgKCgob3AgPj4gMykgJiAxKSBeIDEpOworICAgICAgICAgICAgICAgICAgICBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2pjYzEocywgb3AxLCBsMSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZm1vdl9TVDBfU1ROKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIob3ByZWcpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHN0cmluZyBvcHMgKi8KKworICAgIGNhc2UgMHhhNDogLyogbW92c1MgKi8KKyAgICBjYXNlIDB4YTU6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworCisgICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikpIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X21vdnMocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwgcy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9tb3ZzKHMsIG90KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHhhYTogLyogc3Rvc1MgKi8KKyAgICBjYXNlIDB4YWI6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworCisgICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikpIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X3N0b3Mocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwgcy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9zdG9zKHMsIG90KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4YWM6IC8qIGxvZHNTICovCisgICAgY2FzZSAweGFkOgorICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkgeworICAgICAgICAgICAgZ2VuX3JlcHpfbG9kcyhzLCBvdCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlLCBzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX2xvZHMocywgb3QpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhhZTogLyogc2Nhc1MgKi8KKyAgICBjYXNlIDB4YWY6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQTlopIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X3NjYXMocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwgcy0+cGMgLSBzLT5jc19iYXNlLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKSB7CisgICAgICAgICAgICBnZW5fcmVwel9zY2FzKHMsIG90LCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsIHMtPnBjIC0gcy0+Y3NfYmFzZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fc2NhcyhzLCBvdCk7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfU1VCQiArIG90KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgMHhhNjogLyogY21wc1MgKi8KKyAgICBjYXNlIDB4YTc6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQTlopIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X2NtcHMocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwgcy0+cGMgLSBzLT5jc19iYXNlLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBaKSB7CisgICAgICAgICAgICBnZW5fcmVwel9jbXBzKHMsIG90LCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsIHMtPnBjIC0gcy0+Y3NfYmFzZSwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fY21wcyhzLCBvdCk7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfU1VCQiArIG90KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NmM6IC8qIGluc1MgKi8KKyAgICBjYXNlIDB4NmQ6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgPyBPVF9MT05HIDogT1RfV09SRDsKKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfV09SRCwgMCwgUl9FRFgpOworICAgICAgICBnZW5fb3BfYW5kbF9UMF9mZmZmKCk7CisgICAgICAgIGdlbl9jaGVja19pbyhzLCBvdCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlLCAKKyAgICAgICAgICAgICAgICAgICAgIFNWTV9JT0lPX1RZUEVfTUFTSyB8IHN2bV9pc19yZXAocHJlZml4ZXMpIHwgNCk7CisgICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikpIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X2lucyhzLCBvdCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlLCBzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX2lucyhzLCBvdCk7CisgICAgICAgICAgICBpZiAodXNlX2ljb3VudCkgeworICAgICAgICAgICAgICAgIGdlbl9qbXAocywgcy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NmU6IC8qIG91dHNTICovCisgICAgY2FzZSAweDZmOgorICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX1dPUkQsIDAsIFJfRURYKTsKKyAgICAgICAgZ2VuX29wX2FuZGxfVDBfZmZmZigpOworICAgICAgICBnZW5fY2hlY2tfaW8ocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHN2bV9pc19yZXAocHJlZml4ZXMpIHwgNCk7CisgICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikpIHsKKyAgICAgICAgICAgIGdlbl9yZXB6X291dHMocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwgcy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9vdXRzKHMsIG90KTsKKyAgICAgICAgICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgICAgICAgICAgZ2VuX2ptcChzLCBzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIHBvcnQgSS9PICovCisKKyAgICBjYXNlIDB4ZTQ6CisgICAgY2FzZSAweGU1OgorICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgZ2VuX29wX21vdmxfVDBfaW0odmFsKTsKKyAgICAgICAgZ2VuX2NoZWNrX2lvKHMsIG90LCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICBTVk1fSU9JT19UWVBFX01BU0sgfCBzdm1faXNfcmVwKHByZWZpeGVzKSk7CisgICAgICAgIGlmICh1c2VfaWNvdW50KQorICAgICAgICAgICAgZ2VuX2lvX3N0YXJ0KCk7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAyX2kzMiwgY3B1X1RbMF0pOworICAgICAgICBnZW5faGVscGVyX2luX2Z1bmMob3QsIGNwdV9UWzFdLCBjcHVfdG1wMl9pMzIpOworICAgICAgICBnZW5fb3BfbW92X3JlZ19UMShvdCwgUl9FQVgpOworICAgICAgICBpZiAodXNlX2ljb3VudCkgeworICAgICAgICAgICAgZ2VuX2lvX2VuZCgpOworICAgICAgICAgICAgZ2VuX2ptcChzLCBzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhlNjoKKyAgICBjYXNlIDB4ZTc6CisgICAgICAgIGlmICgoYiAmIDEpID09IDApCisgICAgICAgICAgICBvdCA9IE9UX0JZVEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG90ID0gZGZsYWcgPyBPVF9MT05HIDogT1RfV09SRDsKKyAgICAgICAgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBnZW5fb3BfbW92bF9UMF9pbSh2YWwpOworICAgICAgICBnZW5fY2hlY2tfaW8ocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHN2bV9pc19yZXAocHJlZml4ZXMpKTsKKyAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDEsIFJfRUFYKTsKKworICAgICAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgICAgIGdlbl9pb19zdGFydCgpOworICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMihjcHVfdG1wMl9pMzIsIGNwdV90bXAyX2kzMiwgMHhmZmZmKTsKKyAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDNfaTMyLCBjcHVfVFsxXSk7CisgICAgICAgIGdlbl9oZWxwZXJfb3V0X2Z1bmMob3QsIGNwdV90bXAyX2kzMiwgY3B1X3RtcDNfaTMyKTsKKyAgICAgICAgaWYgKHVzZV9pY291bnQpIHsKKyAgICAgICAgICAgIGdlbl9pb19lbmQoKTsKKyAgICAgICAgICAgIGdlbl9qbXAocywgcy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZWM6CisgICAgY2FzZSAweGVkOgorICAgICAgICBpZiAoKGIgJiAxKSA9PSAwKQorICAgICAgICAgICAgb3QgPSBPVF9CWVRFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IGRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX1dPUkQsIDAsIFJfRURYKTsKKyAgICAgICAgZ2VuX29wX2FuZGxfVDBfZmZmZigpOworICAgICAgICBnZW5fY2hlY2tfaW8ocywgb3QsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIFNWTV9JT0lPX1RZUEVfTUFTSyB8IHN2bV9pc19yZXAocHJlZml4ZXMpKTsKKyAgICAgICAgaWYgKHVzZV9pY291bnQpCisgICAgICAgICAgICBnZW5faW9fc3RhcnQoKTsKKyAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgIGdlbl9oZWxwZXJfaW5fZnVuYyhvdCwgY3B1X1RbMV0sIGNwdV90bXAyX2kzMik7CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QxKG90LCBSX0VBWCk7CisgICAgICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgICAgICAgICBnZW5fam1wKHMsIHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGVlOgorICAgIGNhc2UgMHhlZjoKKyAgICAgICAgaWYgKChiICYgMSkgPT0gMCkKKyAgICAgICAgICAgIG90ID0gT1RfQllURTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9XT1JELCAwLCBSX0VEWCk7CisgICAgICAgIGdlbl9vcF9hbmRsX1QwX2ZmZmYoKTsKKyAgICAgICAgZ2VuX2NoZWNrX2lvKHMsIG90LCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICBzdm1faXNfcmVwKHByZWZpeGVzKSk7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAxLCBSX0VBWCk7CisKKyAgICAgICAgaWYgKHVzZV9pY291bnQpCisgICAgICAgICAgICBnZW5faW9fc3RhcnQoKTsKKyAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfdG1wMl9pMzIsIDB4ZmZmZik7CisgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGNwdV90bXAzX2kzMiwgY3B1X1RbMV0pOworICAgICAgICBnZW5faGVscGVyX291dF9mdW5jKG90LCBjcHVfdG1wMl9pMzIsIGNwdV90bXAzX2kzMik7CisgICAgICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgICAgICAgICBnZW5fam1wKHMsIHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogY29udHJvbCAqLworICAgIGNhc2UgMHhjMjogLyogcmV0IGltICovCisgICAgICAgIHZhbCA9IGNwdV9sZHN3X2NvZGUoZW52LCBzLT5wYyk7CisgICAgICAgIHMtPnBjICs9IDI7CisgICAgICAgIGdlbl9wb3BfVDAocyk7CisgICAgICAgIGlmIChDT0RFNjQocykgJiYgcy0+ZGZsYWcpCisgICAgICAgICAgICBzLT5kZmxhZyA9IDI7CisgICAgICAgIGdlbl9zdGFja191cGRhdGUocywgdmFsICsgKDIgPDwgcy0+ZGZsYWcpKTsKKyAgICAgICAgaWYgKHMtPmRmbGFnID09IDApCisgICAgICAgICAgICBnZW5fb3BfYW5kbF9UMF9mZmZmKCk7CisgICAgICAgIGdlbl9vcF9qbXBfVDAoKTsKKyAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGMzOiAvKiByZXQgKi8KKyAgICAgICAgZ2VuX3BvcF9UMChzKTsKKyAgICAgICAgZ2VuX3BvcF91cGRhdGUocyk7CisgICAgICAgIGlmIChzLT5kZmxhZyA9PSAwKQorICAgICAgICAgICAgZ2VuX29wX2FuZGxfVDBfZmZmZigpOworICAgICAgICBnZW5fb3Bfam1wX1QwKCk7CisgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjYTogLyogbHJldCBpbSAqLworICAgICAgICB2YWwgPSBjcHVfbGRzd19jb2RlKGVudiwgcy0+cGMpOworICAgICAgICBzLT5wYyArPSAyOworICAgIGRvX2xyZXQ6CisgICAgICAgIGlmIChzLT5wZSAmJiAhcy0+dm04NikgeworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbHJldF9wcm90ZWN0ZWQoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIodmFsKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fc3RhY2tfQTAocyk7CisgICAgICAgICAgICAvKiBwb3Agb2Zmc2V0ICovCisgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoMSArIHMtPmRmbGFnICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgIGlmIChzLT5kZmxhZyA9PSAwKQorICAgICAgICAgICAgICAgIGdlbl9vcF9hbmRsX1QwX2ZmZmYoKTsKKyAgICAgICAgICAgIC8qIE5PVEU6IGtlZXBpbmcgRUlQIHVwZGF0ZWQgaXMgbm90IGEgcHJvYmxlbSBpbiBjYXNlIG9mCisgICAgICAgICAgICAgICBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGdlbl9vcF9qbXBfVDAoKTsKKyAgICAgICAgICAgIC8qIHBvcCBzZWxlY3RvciAqLworICAgICAgICAgICAgZ2VuX29wX2FkZGxfQTBfaW0oMiA8PCBzLT5kZmxhZyk7CisgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoMSArIHMtPmRmbGFnICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX3NlZ19UMF92bShSX0NTKTsKKyAgICAgICAgICAgIC8qIGFkZCBzdGFjayBvZmZzZXQgKi8KKyAgICAgICAgICAgIGdlbl9zdGFja191cGRhdGUocywgdmFsICsgKDQgPDwgcy0+ZGZsYWcpKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4Y2I6IC8qIGxyZXQgKi8KKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgZ290byBkb19scmV0OworICAgIGNhc2UgMHhjZjogLyogaXJldCAqLworICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfSVJFVCk7CisgICAgICAgIGlmICghcy0+cGUpIHsKKyAgICAgICAgICAgIC8qIHJlYWwgbW9kZSAqLworICAgICAgICAgICAgZ2VuX2hlbHBlcl9pcmV0X3JlYWwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZykpOworICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7CisgICAgICAgIH0gZWxzZSBpZiAocy0+dm04NikgeworICAgICAgICAgICAgaWYgKHMtPmlvcGwgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9pcmV0X3JlYWwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZykpOworICAgICAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaXJldF9wcm90ZWN0ZWQoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIocy0+cGMgLSBzLT5jc19iYXNlKSk7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZTg6IC8qIGNhbGwgaW0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRmbGFnKQorICAgICAgICAgICAgICAgIHR2YWwgPSAoaW50MzJfdClpbnNuX2dldChlbnYsIHMsIE9UX0xPTkcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR2YWwgPSAoaW50MTZfdClpbnNuX2dldChlbnYsIHMsIE9UX1dPUkQpOworICAgICAgICAgICAgbmV4dF9laXAgPSBzLT5wYyAtIHMtPmNzX2Jhc2U7CisgICAgICAgICAgICB0dmFsICs9IG5leHRfZWlwOworICAgICAgICAgICAgaWYgKHMtPmRmbGFnID09IDApCisgICAgICAgICAgICAgICAgdHZhbCAmPSAweGZmZmY7CisgICAgICAgICAgICBnZW5fbW92dGxfVDBfaW0obmV4dF9laXApOworICAgICAgICAgICAgZ2VuX3B1c2hfVDAocyk7CisgICAgICAgICAgICBnZW5fam1wKHMsIHR2YWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5YTogLyogbGNhbGwgaW0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbGVjdG9yLCBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICAgICAgb2Zmc2V0ID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7CisgICAgICAgICAgICBzZWxlY3RvciA9IGluc25fZ2V0KGVudiwgcywgT1RfV09SRCk7CisKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHNlbGVjdG9yKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QxX2ltdShvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZG9fbGNhbGw7CisgICAgY2FzZSAweGU5OiAvKiBqbXAgaW0gKi8KKyAgICAgICAgaWYgKGRmbGFnKQorICAgICAgICAgICAgdHZhbCA9IChpbnQzMl90KWluc25fZ2V0KGVudiwgcywgT1RfTE9ORyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR2YWwgPSAoaW50MTZfdClpbnNuX2dldChlbnYsIHMsIE9UX1dPUkQpOworICAgICAgICB0dmFsICs9IHMtPnBjIC0gcy0+Y3NfYmFzZTsKKyAgICAgICAgaWYgKHMtPmRmbGFnID09IDApCisgICAgICAgICAgICB0dmFsICY9IDB4ZmZmZjsKKyAgICAgICAgZWxzZSBpZighQ09ERTY0KHMpKQorICAgICAgICAgICAgdHZhbCAmPSAweGZmZmZmZmZmOworICAgICAgICBnZW5fam1wKHMsIHR2YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZWE6IC8qIGxqbXAgaW0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbGVjdG9yLCBvZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICAgICAgb2Zmc2V0ID0gaW5zbl9nZXQoZW52LCBzLCBvdCk7CisgICAgICAgICAgICBzZWxlY3RvciA9IGluc25fZ2V0KGVudiwgcywgT1RfV09SRCk7CisKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QwX2ltKHNlbGVjdG9yKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZsX1QxX2ltdShvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGdvdG8gZG9fbGptcDsKKyAgICBjYXNlIDB4ZWI6IC8qIGptcCBKYiAqLworICAgICAgICB0dmFsID0gKGludDhfdClpbnNuX2dldChlbnYsIHMsIE9UX0JZVEUpOworICAgICAgICB0dmFsICs9IHMtPnBjIC0gcy0+Y3NfYmFzZTsKKyAgICAgICAgaWYgKHMtPmRmbGFnID09IDApCisgICAgICAgICAgICB0dmFsICY9IDB4ZmZmZjsKKyAgICAgICAgZ2VuX2ptcChzLCB0dmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDcwIC4uLiAweDdmOiAvKiBqY2MgSmIgKi8KKyAgICAgICAgdHZhbCA9IChpbnQ4X3QpaW5zbl9nZXQoZW52LCBzLCBPVF9CWVRFKTsKKyAgICAgICAgZ290byBkb19qY2M7CisgICAgY2FzZSAweDE4MCAuLi4gMHgxOGY6IC8qIGpjYyBKdiAqLworICAgICAgICBpZiAoZGZsYWcpIHsKKyAgICAgICAgICAgIHR2YWwgPSAoaW50MzJfdClpbnNuX2dldChlbnYsIHMsIE9UX0xPTkcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHZhbCA9IChpbnQxNl90KWluc25fZ2V0KGVudiwgcywgT1RfV09SRCk7CisgICAgICAgIH0KKyAgICBkb19qY2M6CisgICAgICAgIG5leHRfZWlwID0gcy0+cGMgLSBzLT5jc19iYXNlOworICAgICAgICB0dmFsICs9IG5leHRfZWlwOworICAgICAgICBpZiAocy0+ZGZsYWcgPT0gMCkKKyAgICAgICAgICAgIHR2YWwgJj0gMHhmZmZmOworICAgICAgICBnZW5famNjKHMsIGIsIHR2YWwsIG5leHRfZWlwKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDB4MTkwIC4uLiAweDE5ZjogLyogc2V0Y2MgR3YgKi8KKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIGdlbl9zZXRjYyhzLCBiKTsKKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgT1RfQllURSwgT1JfVE1QMCwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxNDAgLi4uIDB4MTRmOiAvKiBjbW92IEd2LCBFdiAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgbDE7CisgICAgICAgICAgICBUQ0d2IHQwOworCisgICAgICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICAgICAgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGdlbl9vcF9sZF92KG90ICsgcy0+bWVtX2luZGV4LCB0MCwgY3B1X0EwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3Zfdl9yZWcob3QsIHQwLCBybSk7CisgICAgICAgICAgICB9CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgaWYgKG90ID09IE9UX0xPTkcpIHsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IHNwZWNpZmljIEludGVsIGJlaGF2aW91ciA/ICovCisgICAgICAgICAgICAgICAgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICAgICAgZ2VuX2pjYzEocywgYiBeIDEsIGwxKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3N0MzJfdGwodDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCByZWdzW3JlZ10pICsgUkVHX0xfT0ZGU0VUKTsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X3RtcDAsIDApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfdG1wMCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIHJlZ3NbcmVnXSkgKyBSRUdfTEhfT0ZGU0VUKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICAgICAgZ2VuX2pjYzEocywgYiBeIDEsIGwxKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIHQwKTsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIGZsYWdzICovCisgICAgY2FzZSAweDljOiAvKiBwdXNoZiAqLworICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfUFVTSEYpOworICAgICAgICBpZiAocy0+dm04NiAmJiBzLT5pb3BsICE9IDMpIHsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICBnZW5faGVscGVyX3JlYWRfZWZsYWdzKGNwdV9UWzBdLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGdlbl9wdXNoX1QwKHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5ZDogLyogcG9wZiAqLworICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfUE9QRik7CisgICAgICAgIGlmIChzLT52bTg2ICYmIHMtPmlvcGwgIT0gMykgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX3BvcF9UMChzKTsKKyAgICAgICAgICAgIGlmIChzLT5jcGwgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzLT5kZmxhZykgeworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3dyaXRlX2VmbGFncyhjcHVfZW52LCBjcHVfVFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMigoVEZfTUFTSyB8IEFDX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9NQVNLIHwgTlRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1BMX01BU0spKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl93cml0ZV9lZmxhZ3MoY3B1X2VudiwgY3B1X1RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIoKFRGX01BU0sgfCBBQ19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTUFTSyB8IE5UX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRl9NQVNLIHwgSU9QTF9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgMHhmZmZmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+Y3BsIDw9IHMtPmlvcGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3dyaXRlX2VmbGFncyhjcHVfZW52LCBjcHVfVFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIoKFRGX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5UX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZfTUFTSykpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfd3JpdGVfZWZsYWdzKGNwdV9lbnYsIGNwdV9UWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2NvbnN0X2kzMigoVEZfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX01BU0sgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlRfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3dyaXRlX2VmbGFncyhjcHVfZW52LCBjcHVfVFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY29uc3RfaTMyKChURl9NQVNLIHwgQUNfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTUFTSyB8IE5UX01BU0spKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3dyaXRlX2VmbGFncyhjcHVfZW52LCBjcHVfVFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY29uc3RfaTMyKChURl9NQVNLIHwgQUNfTUFTSyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURfTUFTSyB8IE5UX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZmZmZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX3BvcF91cGRhdGUocyk7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgICAgIC8qIGFib3J0IHRyYW5zbGF0aW9uIGJlY2F1c2UgVEYgZmxhZyBtYXkgY2hhbmdlICovCisgICAgICAgICAgICBnZW5fam1wX2ltKHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg5ZTogLyogc2FoZiAqLworICAgICAgICBpZiAoQ09ERTY0KHMpICYmICEocy0+Y3B1aWRfZXh0M19mZWF0dXJlcyAmIENQVUlEX0VYVDNfTEFIRl9MTSkpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKE9UX0JZVEUsIDAsIFJfQUgpOworICAgICAgICBnZW5fY29tcHV0ZV9lZmxhZ3Mocyk7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfY2Nfc3JjLCBjcHVfY2Nfc3JjLCBDQ19PKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9UWzBdLCBjcHVfVFswXSwgQ0NfUyB8IENDX1ogfCBDQ19BIHwgQ0NfUCB8IENDX0MpOworICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIGNwdV9UWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDlmOiAvKiBsYWhmICovCisgICAgICAgIGlmIChDT0RFNjQocykgJiYgIShzLT5jcHVpZF9leHQzX2ZlYXR1cmVzICYgQ1BVSURfRVhUM19MQUhGX0xNKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICAvKiBOb3RlOiBnZW5fY29tcHV0ZV9lZmxhZ3MoKSBvbmx5IGdpdmVzIHRoZSBjb25kaXRpb24gY29kZXMgKi8KKyAgICAgICAgdGNnX2dlbl9vcmlfdGwoY3B1X1RbMF0sIGNwdV9jY19zcmMsIDB4MDIpOworICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChPVF9CWVRFLCBSX0FIKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGY1OiAvKiBjbWMgKi8KKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwoY3B1X2NjX3NyYywgY3B1X2NjX3NyYywgQ0NfQyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhmODogLyogY2xjICovCisgICAgICAgIGdlbl9jb21wdXRlX2VmbGFncyhzKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIH5DQ19DKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGY5OiAvKiBzdGMgKi8KKyAgICAgICAgZ2VuX2NvbXB1dGVfZWZsYWdzKHMpOworICAgICAgICB0Y2dfZ2VuX29yaV90bChjcHVfY2Nfc3JjLCBjcHVfY2Nfc3JjLCBDQ19DKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGZjOiAvKiBjbGQgKi8KKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihjcHVfdG1wMl9pMzIsIDEpOworICAgICAgICB0Y2dfZ2VuX3N0X2kzMihjcHVfdG1wMl9pMzIsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBkZikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZmQ6IC8qIHN0ZCAqLworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGNwdV90bXAyX2kzMiwgLTEpOworICAgICAgICB0Y2dfZ2VuX3N0X2kzMihjcHVfdG1wMl9pMzIsIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBkZikpOworICAgICAgICBicmVhazsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiBiaXQgb3BlcmF0aW9ucyAqLworICAgIGNhc2UgMHgxYmE6IC8qIGJ0L2J0cy9idHIvYnRjIEd2LCBpbSAqLworICAgICAgICBvdCA9IGRmbGFnICsgT1RfV09SRDsKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG9wID0gKG1vZHJtID4+IDMpICYgNzsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgIHMtPnJpcF9vZmZzZXQgPSAxOworICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAob3QgKyBzLT5tZW1faW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIHJtKTsKKyAgICAgICAgfQorICAgICAgICAvKiBsb2FkIHNoaWZ0ICovCisgICAgICAgIHZhbCA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgZ2VuX29wX21vdmxfVDFfaW0odmFsKTsKKyAgICAgICAgaWYgKG9wIDwgNCkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgb3AgLT0gNDsKKyAgICAgICAgZ290byBidF9vcDsKKyAgICBjYXNlIDB4MWEzOiAvKiBidCBHdiwgRXYgKi8KKyAgICAgICAgb3AgPSAwOworICAgICAgICBnb3RvIGRvX2J0eDsKKyAgICBjYXNlIDB4MWFiOiAvKiBidHMgKi8KKyAgICAgICAgb3AgPSAxOworICAgICAgICBnb3RvIGRvX2J0eDsKKyAgICBjYXNlIDB4MWIzOiAvKiBidHIgKi8KKyAgICAgICAgb3AgPSAyOworICAgICAgICBnb3RvIGRvX2J0eDsKKyAgICBjYXNlIDB4MWJiOiAvKiBidGMgKi8KKyAgICAgICAgb3AgPSAzOworICAgIGRvX2J0eDoKKyAgICAgICAgb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAxLCByZWcpOworICAgICAgICBpZiAobW9kICE9IDMpIHsKKyAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgLyogc3BlY2lmaWMgY2FzZTogd2UgbmVlZCB0byBhZGQgYSBkaXNwbGFjZW1lbnQgKi8KKyAgICAgICAgICAgIGdlbl9leHRzKG90LCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfdGwoY3B1X3RtcDAsIGNwdV9UWzFdLCAzICsgb3QpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV90bXAwLCBjcHVfdG1wMCwgb3QpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRfdGwoY3B1X0EwLCBjcHVfQTAsIGNwdV90bXAwKTsKKyAgICAgICAgICAgIGdlbl9vcF9sZF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhvdCwgMCwgcm0pOworICAgICAgICB9CisgICAgYnRfb3A6CisgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfVFsxXSwgY3B1X1RbMV0sICgxIDw8ICgzICsgb3QpKSAtIDEpOworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X2NjX3NyYywgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfY2NfZHN0LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bChjcHVfdG1wNCwgY3B1X1RbMF0sIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfdG1wMCwgMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobF90bChjcHVfdG1wMCwgY3B1X3RtcDAsIGNwdV9UWzFdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfdG1wMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X3RtcDQsIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X3RtcDAsIDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxfdGwoY3B1X3RtcDAsIGNwdV90bXAwLCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX25vdF90bChjcHVfdG1wMCwgY3B1X3RtcDApOworICAgICAgICAgICAgdGNnX2dlbl9hbmRfdGwoY3B1X1RbMF0sIGNwdV9UWzBdLCBjcHVfdG1wMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X3RtcDQsIGNwdV9UWzBdLCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X3RtcDAsIDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxfdGwoY3B1X3RtcDAsIGNwdV90bXAwLCBjcHVfVFsxXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3hvcl90bChjcHVfVFswXSwgY3B1X1RbMF0sIGNwdV90bXAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9TQVJCICsgb3QpOworICAgICAgICBpZiAob3AgIT0gMCkgeworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKQorICAgICAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChvdCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJtKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9jY19zcmMsIGNwdV90bXA0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfY2NfZHN0LCAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWJjOiAvKiBic2YgKi8KKyAgICBjYXNlIDB4MWJkOiAvKiBic3IgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxhYmVsMTsKKyAgICAgICAgICAgIFRDR3YgdDA7CisKKyAgICAgICAgICAgIG90ID0gZGZsYWcgKyBPVF9XT1JEOworICAgICAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgIGdlbl9leHR1KG90LCBjcHVfVFswXSk7CisgICAgICAgICAgICBsYWJlbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2NjX2RzdCwgMCk7CisgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwodDAsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgdDAsIDAsIGxhYmVsMSk7CisgICAgICAgICAgICBpZiAoYiAmIDEpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2JzcihjcHVfVFswXSwgdDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2JzZihjcHVfVFswXSwgdDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJlZyk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2NjX2RzdCwgMSk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGxhYmVsMSk7CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTE9HSUNCICsgb3QpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIGJjZCAqLworICAgIGNhc2UgMHgyNzogLyogZGFhICovCisgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgIGdlbl9oZWxwZXJfZGFhKGNwdV9lbnYpOworICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDJmOiAvKiBkYXMgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgZ2VuX2hlbHBlcl9kYXMoY3B1X2Vudik7CisgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4Mzc6IC8qIGFhYSAqLworICAgICAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5faGVscGVyX2FhYShjcHVfZW52KTsKKyAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzZjogLyogYWFzICovCisgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgIGdlbl9oZWxwZXJfYWFzKGNwdV9lbnYpOworICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ0OiAvKiBhYW0gKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDAwX0RJVlosIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5faGVscGVyX2FhbShjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHZhbCkpOworICAgICAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0xPR0lDQik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ1OiAvKiBhYWQgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBnZW5faGVscGVyX2FhZChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHZhbCkpOworICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfTE9HSUNCKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qIG1pc2MgKi8KKyAgICBjYXNlIDB4OTA6IC8qIG5vcCAqLworICAgICAgICAvKiBYWFg6IHhjaGcgKyByZXggaGFuZGxpbmcgKi8KKyAgICAgICAgLyogWFhYOiBjb3JyZWN0IGxvY2sgdGVzdCBmb3IgYWxsIGluc24gKi8KKyAgICAgICAgaWYgKHByZWZpeGVzICYgUFJFRklYX0xPQ0spIHsKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfUkVQWikgeworICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1BBVVNFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4OWI6IC8qIGZ3YWl0ICovCisgICAgICAgIGlmICgocy0+ZmxhZ3MgJiAoSEZfTVBfTUFTSyB8IEhGX1RTX01BU0spKSA9PQorICAgICAgICAgICAgKEhGX01QX01BU0sgfCBIRl9UU19NQVNLKSkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Z3YWl0KGNwdV9lbnYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjYzogLyogaW50MyAqLworICAgICAgICBnZW5faW50ZXJydXB0KHMsIEVYQ1AwM19JTlQzLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsIHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhjZDogLyogaW50IE4gKi8KKyAgICAgICAgdmFsID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBpZiAocy0+dm04NiAmJiBzLT5pb3BsICE9IDMpIHsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9pbnRlcnJ1cHQocywgdmFsLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UsIHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGNlOiAvKiBpbnRvICovCisgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgZ2VuX2hlbHBlcl9pbnRvKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIocy0+cGMgLSBwY19zdGFydCkpOworICAgICAgICBicmVhazsKKyNpZmRlZiBXQU5UX0lDRUJQCisgICAgY2FzZSAweGYxOiAvKiBpY2VicCAodW5kb2N1bWVudGVkLCBleGl0cyB0byBleHRlcm5hbCBkZWJ1Z2dlcikgKi8KKyAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0lDRUJQKTsKKyNpZiAxCisgICAgICAgIGdlbl9kZWJ1ZyhzLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworI2Vsc2UKKyAgICAgICAgLyogc3RhcnQgZGVidWcgKi8KKyAgICAgICAgdGJfZmx1c2goY3B1X3NpbmdsZV9lbnYpOworICAgICAgICBxZW11X3NldF9sb2coQ1BVX0xPR19JTlQgfCBDUFVfTE9HX1RCX0lOX0FTTSk7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIDB4ZmE6IC8qIGNsaSAqLworICAgICAgICBpZiAoIXMtPnZtODYpIHsKKyAgICAgICAgICAgIGlmIChzLT5jcGwgPD0gcy0+aW9wbCkgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfY2xpKGNwdV9lbnYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocy0+aW9wbCA9PSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbGkoY3B1X2Vudik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZmI6IC8qIHN0aSAqLworICAgICAgICBpZiAoIXMtPnZtODYpIHsKKyAgICAgICAgICAgIGlmIChzLT5jcGwgPD0gcy0+aW9wbCkgeworICAgICAgICAgICAgZ2VuX3N0aToKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N0aShjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAvKiBpbnRlcnJ1cHRpb25zIGFyZSBlbmFibGVkIG9ubHkgdGhlIGZpcnN0IGluc24gYWZ0ZXIgc3RpICovCisgICAgICAgICAgICAgICAgLyogSWYgc2V2ZXJhbCBpbnN0cnVjdGlvbnMgZGlzYWJsZSBpbnRlcnJ1cHRzLCBvbmx5IHRoZQorICAgICAgICAgICAgICAgICAgIF9maXJzdF8gZG9lcyBpdCAqLworICAgICAgICAgICAgICAgIGlmICghKHMtPnRiLT5mbGFncyAmIEhGX0lOSElCSVRfSVJRX01BU0spKQorICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NldF9pbmhpYml0X2lycShjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAvKiBnaXZlIGEgY2hhbmNlIHRvIGhhbmRsZSBwZW5kaW5nIGlycXMgKi8KKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPmlvcGwgPT0gMykgeworICAgICAgICAgICAgICAgIGdvdG8gZ2VuX3N0aTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2MjogLyogYm91bmQgKi8KKyAgICAgICAgaWYgKENPREU2NChzKSkKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoY3B1X3NpbmdsZV9lbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCByZWcpOworICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTsKKyAgICAgICAgaWYgKG90ID09IE9UX1dPUkQpIHsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYm91bmR3KGNwdV9lbnYsIGNwdV9BMCwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYm91bmRsKGNwdV9lbnYsIGNwdV9BMCwgY3B1X3RtcDJfaTMyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWM4IC4uLiAweDFjZjogLyogYnN3YXAgcmVnICovCisgICAgICAgIHJlZyA9IChiICYgNykgfCBSRVhfQihzKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGlmIChkZmxhZyA9PSAyKSB7CisgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9RVUFELCAwLCByZWcpOworICAgICAgICAgICAgdGNnX2dlbl9ic3dhcDY0X2k2NChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAoT1RfUVVBRCwgcmVnKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcoT1RfTE9ORywgMCwgcmVnKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2Jzd2FwMzJfdGwoY3B1X1RbMF0sIGNwdV9UWzBdKTsKKyAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0xPTkcsIHJlZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGQ2OiAvKiBzYWxjICovCisgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl9jb21wdXRlX2VmbGFnc19jKHMsIGNwdV9UWzBdLCBmYWxzZSk7CisgICAgICAgIHRjZ19nZW5fbmVnX3RsKGNwdV9UWzBdLCBjcHVfVFswXSk7CisgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKE9UX0JZVEUsIFJfRUFYKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGUwOiAvKiBsb29wbnogKi8KKyAgICBjYXNlIDB4ZTE6IC8qIGxvb3B6ICovCisgICAgY2FzZSAweGUyOiAvKiBsb29wICovCisgICAgY2FzZSAweGUzOiAvKiBqZWN4eiAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgbDEsIGwyLCBsMzsKKworICAgICAgICAgICAgdHZhbCA9IChpbnQ4X3QpaW5zbl9nZXQoZW52LCBzLCBPVF9CWVRFKTsKKyAgICAgICAgICAgIG5leHRfZWlwID0gcy0+cGMgLSBzLT5jc19iYXNlOworICAgICAgICAgICAgdHZhbCArPSBuZXh0X2VpcDsKKyAgICAgICAgICAgIGlmIChzLT5kZmxhZyA9PSAwKQorICAgICAgICAgICAgICAgIHR2YWwgJj0gMHhmZmZmOworCisgICAgICAgICAgICBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIGwyID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICAgICAgbDMgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICBiICY9IDM7CisgICAgICAgICAgICBzd2l0Y2goYikgeworICAgICAgICAgICAgY2FzZSAwOiAvKiBsb29wbnogKi8KKyAgICAgICAgICAgIGNhc2UgMTogLyogbG9vcHogKi8KKyAgICAgICAgICAgICAgICBnZW5fb3BfYWRkX3JlZ19pbShzLT5hZmxhZywgUl9FQ1gsIC0xKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfanpfZWN4KHMtPmFmbGFnLCBsMyk7CisgICAgICAgICAgICAgICAgZ2VuX2pjYzEocywgKEpDQ19aIDw8IDEpIHwgKGIgXiAxKSwgbDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvKiBsb29wICovCisgICAgICAgICAgICAgICAgZ2VuX29wX2FkZF9yZWdfaW0ocy0+YWZsYWcsIFJfRUNYLCAtMSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX2puel9lY3gocy0+YWZsYWcsIGwxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIDM6IC8qIGpjeHogKi8KKyAgICAgICAgICAgICAgICBnZW5fb3BfanpfZWN4KHMtPmFmbGFnLCBsMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDMpOworICAgICAgICAgICAgZ2VuX2ptcF9pbShuZXh0X2VpcCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyKGwyKTsKKworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgICAgICBnZW5fam1wX2ltKHR2YWwpOworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMik7CisgICAgICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMzA6IC8qIHdybXNyICovCisgICAgY2FzZSAweDEzMjogLyogcmRtc3IgKi8KKyAgICAgICAgaWYgKHMtPmNwbCAhPSAwKSB7CisgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgaWYgKGIgJiAyKSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9yZG1zcihjcHVfZW52KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl93cm1zcihjcHVfZW52KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTMxOiAvKiByZHRzYyAqLworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGlmICh1c2VfaWNvdW50KQorICAgICAgICAgICAgZ2VuX2lvX3N0YXJ0KCk7CisgICAgICAgIGdlbl9oZWxwZXJfcmR0c2MoY3B1X2Vudik7CisgICAgICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgICAgICAgICBnZW5fam1wKHMsIHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEzMzogLyogcmRwbWMgKi8KKyAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICBnZW5faGVscGVyX3JkcG1jKGNwdV9lbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTM0OiAvKiBzeXNlbnRlciAqLworICAgICAgICAvKiBGb3IgSW50ZWwgU1lTRU5URVIgaXMgdmFsaWQgb24gNjQtYml0ICovCisgICAgICAgIGlmIChDT0RFNjQocykgJiYgY3B1X3NpbmdsZV9lbnYtPmNwdWlkX3ZlbmRvcjEgIT0gQ1BVSURfVkVORE9SX0lOVEVMXzEpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGlmICghcy0+cGUpIHsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N5c2VudGVyKGNwdV9lbnYpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTM1OiAvKiBzeXNleGl0ICovCisgICAgICAgIC8qIEZvciBJbnRlbCBTWVNFWElUIGlzIHZhbGlkIG9uIDY0LWJpdCAqLworICAgICAgICBpZiAoQ09ERTY0KHMpICYmIGNwdV9zaW5nbGVfZW52LT5jcHVpZF92ZW5kb3IxICE9IENQVUlEX1ZFTkRPUl9JTlRFTF8xKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBpZiAoIXMtPnBlKSB7CisgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zeXNleGl0KGNwdV9lbnYsIHRjZ19jb25zdF9pMzIoZGZsYWcpKTsKKyAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGNhc2UgMHgxMDU6IC8qIHN5c2NhbGwgKi8KKyAgICAgICAgLyogWFhYOiBpcyBpdCB1c2FibGUgaW4gcmVhbCBtb2RlID8gKi8KKyAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICBnZW5faGVscGVyX3N5c2NhbGwoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5wYyAtIHBjX3N0YXJ0KSk7CisgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMDc6IC8qIHN5c3JldCAqLworICAgICAgICBpZiAoIXMtPnBlKSB7CisgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zeXNyZXQoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5kZmxhZykpOworICAgICAgICAgICAgLyogY29uZGl0aW9uIGNvZGVzIGFyZSBtb2RpZmllZCBvbmx5IGluIGxvbmcgbW9kZSAqLworICAgICAgICAgICAgaWYgKHMtPmxtYSkKKyAgICAgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIDB4MWEyOiAvKiBjcHVpZCAqLworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGdlbl9oZWxwZXJfY3B1aWQoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHhmNDogLyogaGx0ICovCisgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaGx0KGNwdV9lbnYsIHRjZ19jb25zdF9pMzIocy0+cGMgLSBwY19zdGFydCkpOworICAgICAgICAgICAgcy0+aXNfam1wID0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTAwOgorICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgb3AgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSAwOiAvKiBzbGR0ICovCisgICAgICAgICAgICBpZiAoIXMtPnBlIHx8IHMtPnZtODYpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0xEVFJfUkVBRCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxsZHQuc2VsZWN0b3IpKTsKKyAgICAgICAgICAgIG90ID0gT1RfV09SRDsKKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICBvdCArPSBzLT5kZmxhZzsKKyAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCBPUl9UTVAwLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6IC8qIGxsZHQgKi8KKyAgICAgICAgICAgIGlmICghcy0+cGUgfHwgcy0+dm04NikKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBpZiAocy0+Y3BsICE9IDApIHsKKyAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9MRFRSX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9XT1JELCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoY3B1X3RtcDJfaTMyLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9sbGR0KGNwdV9lbnYsIGNwdV90bXAyX2kzMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiBzdHIgKi8KKyAgICAgICAgICAgIGlmICghcy0+cGUgfHwgcy0+dm04NikKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfVFJfUkVBRCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2xkMzJ1X3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSx0ci5zZWxlY3RvcikpOworICAgICAgICAgICAgb3QgPSBPVF9XT1JEOworICAgICAgICAgICAgaWYgKG1vZCA9PSAzKQorICAgICAgICAgICAgICAgIG90ICs9IHMtPmRmbGFnOworICAgICAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLyogbHRyICovCisgICAgICAgICAgICBpZiAoIXMtPnBlIHx8IHMtPnZtODYpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgaWYgKHMtPmNwbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfVFJfV1JJVEUpOworICAgICAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE9UX1dPUkQsIE9SX1RNUDAsIDApOworICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihjcHVfdG1wMl9pMzIsIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2x0cihjcHVfZW52LCBjcHVfdG1wMl9pMzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDogLyogdmVyciAqLworICAgICAgICBjYXNlIDU6IC8qIHZlcncgKi8KKyAgICAgICAgICAgIGlmICghcy0+cGUgfHwgcy0+dm04NikKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9XT1JELCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICBpZiAob3AgPT0gNCkgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmVycihjcHVfZW52LCBjcHVfVFswXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdmVydyhjcHVfZW52LCBjcHVfVFswXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRfY2Nfb3AocywgQ0NfT1BfRUZMQUdTKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMDE6CisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBvcCA9IChtb2RybSA+PiAzKSAmIDc7CisgICAgICAgIHJtID0gbW9kcm0gJiA3OworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSAwOiAvKiBzZ2R0ICovCisgICAgICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX0dEVFJfUkVBRCk7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBnZHQubGltaXQpKTsKKyAgICAgICAgICAgIGdlbl9vcF9zdF9UMF9BMChPVF9XT1JEICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgIGdlbl9hZGRfQTBfaW0ocywgMik7CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgZ2R0LmJhc2UpKTsKKyAgICAgICAgICAgIGlmICghcy0+ZGZsYWcpCisgICAgICAgICAgICAgICAgZ2VuX29wX2FuZGxfVDBfaW0oMHhmZmZmZmYpOworICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKENPREU2NChzKSArIE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocm0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IC8qIG1vbml0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+Y3B1aWRfZXh0X2ZlYXR1cmVzICYgQ1BVSURfRVhUX01PTklUT1IpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jcGwgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworI2lmZGVmIFRBUkdFVF9YODZfNjQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFmbGFnID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZxX0EwX3JlZyhSX0VBWCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZsX0EwX3JlZyhSX0VBWCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWZsYWcgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5fb3BfYW5kbF9BMF9mZmZmKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZ2VuX2FkZF9BMF9kc19zZWcocyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbW9uaXRvcihjcHVfZW52LCBjcHVfQTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIG13YWl0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmNwdWlkX2V4dF9mZWF0dXJlcyAmIENQVUlEX0VYVF9NT05JVE9SKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3BsICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9td2FpdChjcHVfZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIocy0+cGMgLSBwY19zdGFydCkpOworICAgICAgICAgICAgICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLyogc2lkdCAqLworICAgICAgICAgICAgICAgIGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9JRFRSX1JFQUQpOworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbGQzMnVfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBpZHQubGltaXQpKTsKKyAgICAgICAgICAgICAgICBnZW5fb3Bfc3RfVDBfQTAoT1RfV09SRCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgZ2VuX2FkZF9BMF9pbShzLCAyKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgaWR0LmJhc2UpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmRmbGFnKQorICAgICAgICAgICAgICAgICAgICBnZW5fb3BfYW5kbF9UMF9pbSgweGZmZmZmZik7CisgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKENPREU2NChzKSArIE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogbGdkdCAqLworICAgICAgICBjYXNlIDM6IC8qIGxpZHQgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykgeworICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIHN3aXRjaChybSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogLyogVk1SVU4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBIRl9TVk1FX01BU0spIHx8ICFzLT5wZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNwbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdm1ydW4oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5hZmxhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jb25zdF9pMzIocy0+cGMgLSBwY19zdGFydCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9leGl0X3RiKDApOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aXNfam1wID0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IC8qIFZNTUNBTEwgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBIRl9TVk1FX01BU0spKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZtbWNhbGwoY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogLyogVk1MT0FEICovCisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgSEZfU1ZNRV9NQVNLKSB8fCAhcy0+cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ZtbG9hZChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHMtPmFmbGFnKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiAvKiBWTVNBVkUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBIRl9TVk1FX01BU0spIHx8ICFzLT5wZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNwbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfdm1zYXZlKGNwdV9lbnYsIHRjZ19jb25zdF9pMzIocy0+YWZsYWcpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IC8qIFNUR0kgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCghKHMtPmZsYWdzICYgSEZfU1ZNRV9NQVNLKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICEocy0+Y3B1aWRfZXh0M19mZWF0dXJlcyAmIENQVUlEX0VYVDNfU0tJTklUKSkgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAhcy0+cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3N0Z2koY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OiAvKiBDTEdJICovCisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgSEZfU1ZNRV9NQVNLKSB8fCAhcy0+cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2NsZ2koY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OiAvKiBTS0lOSVQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCghKHMtPmZsYWdzICYgSEZfU1ZNRV9NQVNLKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAhKHMtPmNwdWlkX2V4dDNfZmVhdHVyZXMgJiBDUFVJRF9FWFQzX1NLSU5JVCkpIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgIXMtPnBlKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NraW5pdChjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3OiAvKiBJTlZMUEdBICovCisgICAgICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgSEZfU1ZNRV9NQVNLKSB8fCAhcy0+cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2ludmxwZ2EoY3B1X2VudiwgdGNnX2NvbnN0X2kzMihzLT5hZmxhZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmNwbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcD09MiA/IFNWTV9FWElUX0dEVFJfV1JJVEUgOiBTVk1fRVhJVF9JRFRSX1dSSVRFKTsKKyAgICAgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDFfQTAoT1RfV09SRCArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgZ2VuX2FkZF9BMF9pbShzLCAyKTsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoQ09ERTY0KHMpICsgT1RfTE9ORyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKCFzLT5kZmxhZykKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2FuZGxfVDBfaW0oMHhmZmZmZmYpOworICAgICAgICAgICAgICAgIGlmIChvcCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfdGwoY3B1X1RbMF0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLGdkdC5iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3QzMl90bChjcHVfVFsxXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsZ2R0LmxpbWl0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsaWR0LmJhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzFdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxpZHQubGltaXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiAvKiBzbXN3ICovCisgICAgICAgICAgICBnZW5fc3ZtX2NoZWNrX2ludGVyY2VwdChzLCBwY19zdGFydCwgU1ZNX0VYSVRfUkVBRF9DUjApOworI2lmIGRlZmluZWQgVEFSR0VUX1g4Nl82NCAmJiBkZWZpbmVkIFdPUkRTX0JJR0VORElBTgorICAgICAgICAgICAgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsY3JbMF0pICsgNCk7CisjZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsY3JbMF0pKTsKKyNlbmRpZgorICAgICAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgT1RfV09SRCwgT1JfVE1QMCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OiAvKiBsbXN3ICovCisgICAgICAgICAgICBpZiAocy0+Y3BsICE9IDApIHsKKyAgICAgICAgICAgICAgICBnZW5fZXhjZXB0aW9uKHMsIEVYQ1AwRF9HUEYsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9XUklURV9DUjApOworICAgICAgICAgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIE9UX1dPUkQsIE9SX1RNUDAsIDApOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbG1zdyhjcHVfZW52LCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgZ2VuX2ptcF9pbShzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgICAgIGdlbl9lb2Iocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvKiBpbnZscGcgKi8KKyAgICAgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZCA9PSAzKSB7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICAgICAgICAgICAgICBpZiAoQ09ERTY0KHMpICYmIHJtID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN3YXBncyAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9sZF90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsc2Vnc1tSX0dTXS5iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGNwdV9UWzFdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxrZXJuZWxnc2Jhc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fc3RfdGwoY3B1X1RbMV0sIGNwdV9lbnYsIG9mZnNldG9mKENQVVg4NlN0YXRlLHNlZ3NbUl9HU10uYmFzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2dlbl9zdF90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsa2VybmVsZ3NiYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGdlbl91cGRhdGVfY2Nfb3Aocyk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfaW52bHBnKGNwdV9lbnYsIGNwdV9BMCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTA4OiAvKiBpbnZkICovCisgICAgY2FzZSAweDEwOTogLyogd2JpbnZkICovCisgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIChiICYgMikgPyBTVk1fRVhJVF9JTlZEIDogU1ZNX0VYSVRfV0JJTlZEKTsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NjM6IC8qIGFycGwgb3IgbW92c2xTICh4ODZfNjQpICovCisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgICAgICBpZiAoQ09ERTY0KHMpKSB7CisgICAgICAgICAgICBpbnQgZF9vdDsKKyAgICAgICAgICAgIC8qIGRfb3QgaXMgdGhlIHNpemUgb2YgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgIGRfb3QgPSBkZmxhZyArIE9UX1dPUkQ7CisKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworCisgICAgICAgICAgICBpZiAobW9kID09IDMpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X1ROX3JlZyhPVF9MT05HLCAwLCBybSk7CisgICAgICAgICAgICAgICAgLyogc2lnbiBleHRlbmQgKi8KKyAgICAgICAgICAgICAgICBpZiAoZF9vdCA9PSBPVF9RVUFEKQorICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfVFswXSwgY3B1X1RbMF0pOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKGRfb3QsIHJlZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgICAgIGlmIChkX290ID09IE9UX1FVQUQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX2xkc19UMF9BMChPVF9MT05HICsgcy0+bWVtX2luZGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoT1RfTE9ORyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfcmVnX1QwKGRfb3QsIHJlZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsYWJlbDE7CisgICAgICAgICAgICBUQ0d2IHQwLCB0MSwgdDI7CisKKyAgICAgICAgICAgIGlmICghcy0+cGUgfHwgcy0+dm04NikKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgdDEgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgIHQyID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgICAgICAgICBvdCA9IE9UX1dPUkQ7CisgICAgICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCAgcy0+cGMrKyk7CisgICAgICAgICAgICByZWcgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgICAgIHJtID0gbW9kcm0gJiA3OworICAgICAgICAgICAgaWYgKG1vZCAhPSAzKSB7CisgICAgICAgICAgICAgICAgZ2VuX2xlYV9tb2RybShlbnYsIHMsIG1vZHJtLCAmcmVnX2FkZHIsICZvZmZzZXRfYWRkcik7CisgICAgICAgICAgICAgICAgZ2VuX29wX2xkX3Yob3QgKyBzLT5tZW1faW5kZXgsIHQwLCBjcHVfQTApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3ZfcmVnKG90LCB0MCwgcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2VuX29wX21vdl92X3JlZyhvdCwgdDEsIHJlZyk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X3RtcDAsIHQwLCAzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MSwgdDEsIDMpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQyLCAwKTsKKyAgICAgICAgICAgIGxhYmVsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kX3RsKFRDR19DT05EX0dFLCBjcHVfdG1wMCwgdDEsIGxhYmVsMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCB+Myk7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQyLCBDQ19aKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobGFiZWwxKTsKKyAgICAgICAgICAgIGlmIChtb2QgIT0gMykgeworICAgICAgICAgICAgICAgIGdlbl9vcF9zdF92KG90ICsgcy0+bWVtX2luZGV4LCB0MCwgY3B1X0EwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfdihvdCwgcm0sIHQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9jb21wdXRlX2VmbGFncyhzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfY2Nfc3JjLCBjcHVfY2Nfc3JjLCB+Q0NfWik7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV9jY19zcmMsIGNwdV9jY19zcmMsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTAyOiAvKiBsYXIgKi8KKyAgICBjYXNlIDB4MTAzOiAvKiBsc2wgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxhYmVsMTsKKyAgICAgICAgICAgIFRDR3YgdDA7CisgICAgICAgICAgICBpZiAoIXMtPnBlIHx8IHMtPnZtODYpCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgb3QgPSBkZmxhZyA/IE9UX0xPTkcgOiBPVF9XT1JEOworICAgICAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgIHMtPnBjKyspOworICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBnZW5fbGRzdF9tb2RybShlbnYsIHMsIG1vZHJtLCBPVF9XT1JELCBPUl9UTVAwLCAwKTsKKyAgICAgICAgICAgIHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgaWYgKGIgPT0gMHgxMDIpIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2xhcih0MCwgY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2xzbCh0MCwgY3B1X2VudiwgY3B1X1RbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV90bXAwLCBjcHVfY2Nfc3JjLCBDQ19aKTsKKyAgICAgICAgICAgIGxhYmVsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgY3B1X3RtcDAsIDAsIGxhYmVsMSk7CisgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ192KG90LCByZWcsIHQwKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobGFiZWwxKTsKKyAgICAgICAgICAgIHNldF9jY19vcChzLCBDQ19PUF9FRkxBR1MpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDExODoKKyAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgIG1vZCA9IChtb2RybSA+PiA2KSAmIDM7CisgICAgICAgIG9wID0gKG1vZHJtID4+IDMpICYgNzsKKyAgICAgICAgc3dpdGNoKG9wKSB7CisgICAgICAgIGNhc2UgMDogLyogcHJlZmV0Y2hudGEgKi8KKyAgICAgICAgY2FzZSAxOiAvKiBwcmVmZXRjaG50MCAqLworICAgICAgICBjYXNlIDI6IC8qIHByZWZldGNobnQwICovCisgICAgICAgIGNhc2UgMzogLyogcHJlZmV0Y2hudDAgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMykKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBnZW5fbGVhX21vZHJtKGVudiwgcywgbW9kcm0sICZyZWdfYWRkciwgJm9mZnNldF9hZGRyKTsKKyAgICAgICAgICAgIC8qIG5vdGhpbmcgbW9yZSB0byBkbyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8qIG5vcCAobXVsdGkgYnl0ZSkgKi8KKyAgICAgICAgICAgIGdlbl9ub3BfbW9kcm0oZW52LCBzLCBtb2RybSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE5IC4uLiAweDExZjogLyogbm9wIChtdWx0aSBieXRlKSAqLworICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgZ2VuX25vcF9tb2RybShlbnYsIHMsIG1vZHJtKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEyMDogLyogbW92IHJlZywgY3JOICovCisgICAgY2FzZSAweDEyMjogLyogbW92IGNyTiwgcmVnICovCisgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW9kcm0gPSBjcHVfbGR1Yl9jb2RlKGVudiwgcy0+cGMrKyk7CisgICAgICAgICAgICBpZiAoKG1vZHJtICYgMHhjMCkgIT0gMHhjMCkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBybSA9IChtb2RybSAmIDcpIHwgUkVYX0Iocyk7CisgICAgICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgICAgIGlmIChDT0RFNjQocykpCisgICAgICAgICAgICAgICAgb3QgPSBPVF9RVUFEOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG90ID0gT1RfTE9ORzsKKyAgICAgICAgICAgIHN3aXRjaChyZWcpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAoYiAmIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9UTl9yZWcob3QsIDAsIHJtKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl93cml0ZV9jck4oY3B1X2VudiwgdGNnX2NvbnN0X2kzMihyZWcpLCBjcHVfVFswXSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9qbXBfaW0ocy0+cGMgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX3JlYWRfY3JOKGNwdV9UWzBdLCBjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHJlZykpOworICAgICAgICAgICAgICAgICAgICBnZW5fb3BfbW92X3JlZ19UMChvdCwgcm0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMjE6IC8qIG1vdiByZWcsIGRyTiAqLworICAgIGNhc2UgMHgxMjM6IC8qIG1vdiBkck4sIHJlZyAqLworICAgICAgICBpZiAocy0+Y3BsICE9IDApIHsKKyAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDBEX0dQRiwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICAgICAgaWYgKChtb2RybSAmIDB4YzApICE9IDB4YzApCisgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgcm0gPSAobW9kcm0gJiA3KSB8IFJFWF9CKHMpOworICAgICAgICAgICAgcmVnID0gKChtb2RybSA+PiAzKSAmIDcpIHwgcmV4X3I7CisgICAgICAgICAgICBpZiAoQ09ERTY0KHMpKQorICAgICAgICAgICAgICAgIG90ID0gT1RfUVVBRDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvdCA9IE9UX0xPTkc7CisgICAgICAgICAgICAvKiBYWFg6IGRvIGl0IGR5bmFtaWNhbGx5IHdpdGggQ1I0LkRFIGJpdCAqLworICAgICAgICAgICAgaWYgKHJlZyA9PSA0IHx8IHJlZyA9PSA1IHx8IHJlZyA+PSA4KQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIGlmIChiICYgMikgeworICAgICAgICAgICAgICAgIGdlbl9zdm1fY2hlY2tfaW50ZXJjZXB0KHMsIHBjX3N0YXJ0LCBTVk1fRVhJVF9XUklURV9EUjAgKyByZWcpOworICAgICAgICAgICAgICAgIGdlbl9vcF9tb3ZfVE5fcmVnKG90LCAwLCBybSk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tb3ZsX2RyTl9UMChjcHVfZW52LCB0Y2dfY29uc3RfaTMyKHJlZyksIGNwdV9UWzBdKTsKKyAgICAgICAgICAgICAgICBnZW5fam1wX2ltKHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1JFQURfRFIwICsgcmVnKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSxkcltyZWddKSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTA2OiAvKiBjbHRzICovCisgICAgICAgIGlmIChzLT5jcGwgIT0gMCkgeworICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMERfR1BGLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1dSSVRFX0NSMCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NsdHMoY3B1X2Vudik7CisgICAgICAgICAgICAvKiBhYm9ydCBibG9jayBiZWNhdXNlIHN0YXRpYyBjcHUgc3RhdGUgY2hhbmdlZCAqLworICAgICAgICAgICAgZ2VuX2ptcF9pbShzLT5wYyAtIHMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2VvYihzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAvKiBNTVgvM0ROb3chL1NTRS9TU0UyL1NTRTMvU1NTRTMvU1NFNCBzdXBwb3J0ICovCisgICAgY2FzZSAweDFjMzogLyogTU9WTlRJIHJlZywgbWVtICovCisgICAgICAgIGlmICghKHMtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfU1NFMikpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIG90ID0gcy0+ZGZsYWcgPT0gMiA/IE9UX1FVQUQgOiBPVF9MT05HOworICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgaWYgKG1vZCA9PSAzKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNykgfCByZXhfcjsKKyAgICAgICAgLyogZ2VuZXJhdGUgYSBnZW5lcmljIHN0b3JlICovCisgICAgICAgIGdlbl9sZHN0X21vZHJtKGVudiwgcywgbW9kcm0sIG90LCByZWcsIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWFlOgorICAgICAgICBtb2RybSA9IGNwdV9sZHViX2NvZGUoZW52LCBzLT5wYysrKTsKKyAgICAgICAgbW9kID0gKG1vZHJtID4+IDYpICYgMzsKKyAgICAgICAgb3AgPSAobW9kcm0gPj4gMykgJiA3OworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSAwOiAvKiBmeHNhdmUgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMyB8fCAhKHMtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfRlhTUikgfHwKKyAgICAgICAgICAgICAgICAocy0+ZmxhZ3MgJiBIRl9FTV9NQVNLKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBpZiAocy0+ZmxhZ3MgJiBIRl9UU19NQVNLKSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZnhzYXZlKGNwdV9lbnYsIGNwdV9BMCwgdGNnX2NvbnN0X2kzMigocy0+ZGZsYWcgPT0gMikpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIGZ4cnN0b3IgKi8KKyAgICAgICAgICAgIGlmIChtb2QgPT0gMyB8fCAhKHMtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfRlhTUikgfHwKKyAgICAgICAgICAgICAgICAocy0+ZmxhZ3MgJiBIRl9FTV9NQVNLKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBpZiAocy0+ZmxhZ3MgJiBIRl9UU19NQVNLKSB7CisgICAgICAgICAgICAgICAgZ2VuX2V4Y2VwdGlvbihzLCBFWENQMDdfUFJFWCwgcGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgZ2VuX3VwZGF0ZV9jY19vcChzKTsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfc3RhcnQgLSBzLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZnhyc3RvcihjcHVfZW52LCBjcHVfQTAsIHRjZ19jb25zdF9pMzIoKHMtPmRmbGFnID09IDIpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiBsZG14Y3NyICovCisgICAgICAgIGNhc2UgMzogLyogc3RteGNzciAqLworICAgICAgICAgICAgaWYgKHMtPmZsYWdzICYgSEZfVFNfTUFTSykgeworICAgICAgICAgICAgICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDA3X1BSRVgsIHBjX3N0YXJ0IC0gcy0+Y3NfYmFzZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHMtPmZsYWdzICYgSEZfRU1fTUFTSykgfHwgIShzLT5mbGFncyAmIEhGX09TRlhTUl9NQVNLKSB8fAorICAgICAgICAgICAgICAgIG1vZCA9PSAzKQorICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgaWYgKG9wID09IDIpIHsKKyAgICAgICAgICAgICAgICBnZW5fb3BfbGRfVDBfQTAoT1RfTE9ORyArIHMtPm1lbV9pbmRleCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zdDMyX3RsKGNwdV9UWzBdLCBjcHVfZW52LCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgbXhjc3IpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9sZDMydV90bChjcHVfVFswXSwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIG14Y3NyKSk7CisgICAgICAgICAgICAgICAgZ2VuX29wX3N0X1QwX0EwKE9UX0xPTkcgKyBzLT5tZW1faW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTogLyogbGZlbmNlICovCisgICAgICAgIGNhc2UgNjogLyogbWZlbmNlICovCisgICAgICAgICAgICBpZiAoKG1vZHJtICYgMHhjNykgIT0gMHhjMCB8fCAhKHMtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfU1NFKSkKKyAgICAgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OiAvKiBzZmVuY2UgLyBjbGZsdXNoICovCisgICAgICAgICAgICBpZiAoKG1vZHJtICYgMHhjNykgPT0gMHhjMCkgeworICAgICAgICAgICAgICAgIC8qIHNmZW5jZSAqLworICAgICAgICAgICAgICAgIC8qIFhYWDogYWxzbyBjaGVjayBmb3IgY3B1aWRfZXh0Ml9mZWF0dXJlcyAmIENQVUlEX0VYVDJfRU1NWCAqLworICAgICAgICAgICAgICAgIGlmICghKHMtPmNwdWlkX2ZlYXR1cmVzICYgQ1BVSURfU1NFKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBjbGZsdXNoICovCisgICAgICAgICAgICAgICAgaWYgKCEocy0+Y3B1aWRfZmVhdHVyZXMgJiBDUFVJRF9DTEZMVVNIKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICAgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDEwZDogLyogM0ROb3chIHByZWZldGNoKHcpICovCisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICBtb2QgPSAobW9kcm0gPj4gNikgJiAzOworICAgICAgICBpZiAobW9kID09IDMpCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGdlbl9sZWFfbW9kcm0oZW52LCBzLCBtb2RybSwgJnJlZ19hZGRyLCAmb2Zmc2V0X2FkZHIpOworICAgICAgICAvKiBpZ25vcmUgZm9yIG5vdyAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWFhOiAvKiByc20gKi8KKyAgICAgICAgZ2VuX3N2bV9jaGVja19pbnRlcmNlcHQocywgcGNfc3RhcnQsIFNWTV9FWElUX1JTTSk7CisgICAgICAgIGlmICghKHMtPmZsYWdzICYgSEZfU01NX01BU0spKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworICAgICAgICBnZW5fdXBkYXRlX2NjX29wKHMpOworICAgICAgICBnZW5fam1wX2ltKHMtPnBjIC0gcy0+Y3NfYmFzZSk7CisgICAgICAgIGdlbl9oZWxwZXJfcnNtKGNwdV9lbnYpOworICAgICAgICBnZW5fZW9iKHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MWI4OiAvKiBTU0U0LjIgcG9wY250ICovCisgICAgICAgIGlmICgocHJlZml4ZXMgJiAoUFJFRklYX1JFUFogfCBQUkVGSVhfTE9DSyB8IFBSRUZJWF9SRVBOWikpICE9CisgICAgICAgICAgICAgUFJFRklYX1JFUFopCisgICAgICAgICAgICBnb3RvIGlsbGVnYWxfb3A7CisgICAgICAgIGlmICghKHMtPmNwdWlkX2V4dF9mZWF0dXJlcyAmIENQVUlEX0VYVF9QT1BDTlQpKQorICAgICAgICAgICAgZ290byBpbGxlZ2FsX29wOworCisgICAgICAgIG1vZHJtID0gY3B1X2xkdWJfY29kZShlbnYsIHMtPnBjKyspOworICAgICAgICByZWcgPSAoKG1vZHJtID4+IDMpICYgNyk7CisKKyAgICAgICAgaWYgKHMtPnByZWZpeCAmIFBSRUZJWF9EQVRBKQorICAgICAgICAgICAgb3QgPSBPVF9XT1JEOworICAgICAgICBlbHNlIGlmIChzLT5kZmxhZyAhPSAyKQorICAgICAgICAgICAgb3QgPSBPVF9MT05HOworICAgICAgICBlbHNlCisgICAgICAgICAgICBvdCA9IE9UX1FVQUQ7CisKKyAgICAgICAgZ2VuX2xkc3RfbW9kcm0oZW52LCBzLCBtb2RybSwgb3QsIE9SX1RNUDAsIDApOworICAgICAgICBnZW5faGVscGVyX3BvcGNudChjcHVfVFswXSwgY3B1X2VudiwgY3B1X1RbMF0sIHRjZ19jb25zdF9pMzIob3QpKTsKKyAgICAgICAgZ2VuX29wX21vdl9yZWdfVDAob3QsIHJlZyk7CisKKyAgICAgICAgc2V0X2NjX29wKHMsIENDX09QX0VGTEFHUyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMGUgLi4uIDB4MTBmOgorICAgICAgICAvKiAzRE5vdyEgaW5zdHJ1Y3Rpb25zLCBpZ25vcmUgcHJlZml4ZXMgKi8KKyAgICAgICAgcy0+cHJlZml4ICY9IH4oUFJFRklYX1JFUFogfCBQUkVGSVhfUkVQTlogfCBQUkVGSVhfREFUQSk7CisgICAgY2FzZSAweDExMCAuLi4gMHgxMTc6CisgICAgY2FzZSAweDEyOCAuLi4gMHgxMmY6CisgICAgY2FzZSAweDEzOCAuLi4gMHgxM2E6CisgICAgY2FzZSAweDE1MCAuLi4gMHgxNzc6CisgICAgY2FzZSAweDE3YyAuLi4gMHgxN2Y6CisgICAgY2FzZSAweDFjMjoKKyAgICBjYXNlIDB4MWM0IC4uLiAweDFjNjoKKyAgICBjYXNlIDB4MWQwIC4uLiAweDFmZToKKyAgICAgICAgZ2VuX3NzZShlbnYsIHMsIGIsIHBjX3N0YXJ0LCByZXhfcik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gaWxsZWdhbF9vcDsKKyAgICB9CisgICAgLyogbG9jayBnZW5lcmF0aW9uICovCisgICAgaWYgKHMtPnByZWZpeCAmIFBSRUZJWF9MT0NLKQorICAgICAgICBnZW5faGVscGVyX3VubG9jaygpOworICAgIHJldHVybiBzLT5wYzsKKyBpbGxlZ2FsX29wOgorICAgIGlmIChzLT5wcmVmaXggJiBQUkVGSVhfTE9DSykKKyAgICAgICAgZ2VuX2hlbHBlcl91bmxvY2soKTsKKyAgICAvKiBYWFg6IGVuc3VyZSB0aGF0IG5vIGxvY2sgd2FzIGdlbmVyYXRlZCAqLworICAgIGdlbl9leGNlcHRpb24ocywgRVhDUDA2X0lMTE9QLCBwY19zdGFydCAtIHMtPmNzX2Jhc2UpOworICAgIHJldHVybiBzLT5wYzsKK30KKwordm9pZCBvcHRpbWl6ZV9mbGFnc19pbml0KHZvaWQpCit7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorICAgIGFzc2VydChzaXplb2YoQ0NUYWJsZSkgPT0gKDEgPDwgMykpOworI2Vsc2UKKyAgICBhc3NlcnQoc2l6ZW9mKENDVGFibGUpID09ICgxIDw8IDQpKTsKKyNlbmRpZgorICAgIGNwdV9lbnYgPSB0Y2dfZ2xvYmFsX3JlZ19uZXdfcHRyKFRDR19BUkVHMCwgImVudiIpOworICAgIGNwdV9jY19vcCA9IHRjZ19nbG9iYWxfbWVtX25ld19pMzIoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVWDg2U3RhdGUsIGNjX29wKSwgImNjX29wIik7CisgICAgY3B1X2NjX3NyYyA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsIG9mZnNldG9mKENQVVg4NlN0YXRlLCBjY19zcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNjX3NyYyIpOworICAgIGNwdV9jY19kc3QgPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLCBvZmZzZXRvZihDUFVYODZTdGF0ZSwgY2NfZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjY19kc3QiKTsKK30KKworLyogZ2VuZXJhdGUgaW50ZXJtZWRpYXRlIGNvZGUgaW4gdGNnX2N0eC5nZW5fb3BjX2J1ZiBhbmQgZ2VuX29wcGFyYW1fYnVmIGZvcgorICAgYmFzaWMgYmxvY2sgJ3RiJy4gSWYgc2VhcmNoX3BjIGlzIFRSVUUsIGFsc28gZ2VuZXJhdGUgUEMKKyAgIGluZm9ybWF0aW9uIGZvciBlYWNoIGludGVybWVkaWF0ZSBpbnN0cnVjdGlvbi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoQ1BVWDg2U3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb25CbG9jayAqdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWFyY2hfcGMpCit7CisgICAgRGlzYXNDb250ZXh0IGRjMSwgKmRjID0gJmRjMTsKKyAgICB0YXJnZXRfdWxvbmcgcGNfcHRyOworICAgIHVpbnQxNl90ICpnZW5fb3BjX2VuZDsKKyAgICBDUFVCcmVha3BvaW50ICpicDsKKyAgICBpbnQgaiwgbGo7CisgICAgdWludDY0X3QgZmxhZ3M7CisgICAgdGFyZ2V0X3Vsb25nIHBjX3N0YXJ0OworICAgIHRhcmdldF91bG9uZyBjc19iYXNlOworICAgIGludCBudW1faW5zbnM7CisgICAgaW50IG1heF9pbnNuczsKKworICAgIC8qIGdlbmVyYXRlIGludGVybWVkaWF0ZSBjb2RlICovCisgICAgcGNfc3RhcnQgPSB0Yi0+cGM7CisgICAgY3NfYmFzZSA9IHRiLT5jc19iYXNlOworICAgIGZsYWdzID0gdGItPmZsYWdzOworCisgICAgZGMtPnBlID0gKGZsYWdzID4+IEhGX1BFX1NISUZUKSAmIDE7CisgICAgZGMtPmNvZGUzMiA9IChmbGFncyA+PiBIRl9DUzMyX1NISUZUKSAmIDE7CisgICAgZGMtPnNzMzIgPSAoZmxhZ3MgPj4gSEZfU1MzMl9TSElGVCkgJiAxOworICAgIGRjLT5hZGRzZWcgPSAoZmxhZ3MgPj4gSEZfQUREU0VHX1NISUZUKSAmIDE7CisgICAgZGMtPmZfc3QgPSAwOworICAgIGRjLT52bTg2ID0gKGZsYWdzID4+IFZNX1NISUZUKSAmIDE7CisgICAgZGMtPmNwbCA9IChmbGFncyA+PiBIRl9DUExfU0hJRlQpICYgMzsKKyAgICBkYy0+aW9wbCA9IChmbGFncyA+PiBJT1BMX1NISUZUKSAmIDM7CisgICAgZGMtPnRmID0gKGZsYWdzID4+IFRGX1NISUZUKSAmIDE7CisgICAgZGMtPnNpbmdsZXN0ZXBfZW5hYmxlZCA9IEVOVl9HRVRfQ1BVKGVudiktPnNpbmdsZXN0ZXBfZW5hYmxlZDsKKyAgICBkYy0+Y2Nfb3AgPSBDQ19PUF9EWU5BTUlDOworICAgIGRjLT5jY19vcF9kaXJ0eSA9IGZhbHNlOworICAgIGRjLT5jc19iYXNlID0gY3NfYmFzZTsKKyAgICBkYy0+dGIgPSB0YjsKKyAgICBkYy0+cG9wbF9lc3BfaGFjayA9IDA7CisgICAgLyogc2VsZWN0IG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb25zICovCisgICAgZGMtPm1lbV9pbmRleCA9IDA7CisgICAgaWYgKGZsYWdzICYgSEZfU09GVE1NVV9NQVNLKSB7CisgICAgICAgIGlmIChkYy0+Y3BsID09IDMpCisgICAgICAgICAgICBkYy0+bWVtX2luZGV4ID0gMiAqIDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRjLT5tZW1faW5kZXggPSAxICogNDsKKyAgICB9CisgICAgZGMtPmNwdWlkX2ZlYXR1cmVzID0gZW52LT5jcHVpZF9mZWF0dXJlczsKKyAgICBkYy0+Y3B1aWRfZXh0X2ZlYXR1cmVzID0gZW52LT5jcHVpZF9leHRfZmVhdHVyZXM7CisgICAgZGMtPmNwdWlkX2V4dDJfZmVhdHVyZXMgPSBlbnYtPmNwdWlkX2V4dDJfZmVhdHVyZXM7CisgICAgZGMtPmNwdWlkX2V4dDNfZmVhdHVyZXMgPSBlbnYtPmNwdWlkX2V4dDNfZmVhdHVyZXM7CisjaWZkZWYgVEFSR0VUX1g4Nl82NAorICAgIGRjLT5sbWEgPSAoZmxhZ3MgPj4gSEZfTE1BX1NISUZUKSAmIDE7CisgICAgZGMtPmNvZGU2NCA9IChmbGFncyA+PiBIRl9DUzY0X1NISUZUKSAmIDE7CisjZW5kaWYKKyAgICBkYy0+ZmxhZ3MgPSBmbGFnczsKKyAgICBkYy0+am1wX29wdCA9ICEoZGMtPnRmIHx8IEVOVl9HRVRfQ1BVKGVudiktPnNpbmdsZXN0ZXBfZW5hYmxlZCB8fAorICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBIRl9JTkhJQklUX0lSUV9NQVNLKQorI2lmbmRlZiBDT05GSUdfU09GVE1NVQorICAgICAgICAgICAgICAgICAgICB8fCAoZmxhZ3MgJiBIRl9TT0ZUTU1VX01BU0spCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKTsKKyNpZiAwCisgICAgLyogY2hlY2sgYWRkc2VnIGxvZ2ljICovCisgICAgaWYgKCFkYy0+YWRkc2VnICYmIChkYy0+dm04NiB8fCAhZGMtPnBlIHx8ICFkYy0+Y29kZTMyKSkKKyAgICAgICAgcHJpbnRmKCJFUlJPUiBhZGRzZWdcbiIpOworI2VuZGlmCisKKyAgICBjcHVfVFswXSA9IHRjZ190ZW1wX25ldygpOworICAgIGNwdV9UWzFdID0gdGNnX3RlbXBfbmV3KCk7CisgICAgY3B1X0EwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgY3B1X1QzID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICBjcHVfdG1wMCA9IHRjZ190ZW1wX25ldygpOworICAgIGNwdV90bXAxX2k2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICBjcHVfdG1wMl9pMzIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgY3B1X3RtcDNfaTMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIGNwdV90bXA0ID0gdGNnX3RlbXBfbmV3KCk7CisgICAgY3B1X3RtcDUgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBjcHVfdG1wNiA9IHRjZ190ZW1wX25ldygpOworICAgIGNwdV9wdHIwID0gdGNnX3RlbXBfbmV3X3B0cigpOworICAgIGNwdV9wdHIxID0gdGNnX3RlbXBfbmV3X3B0cigpOworCisgICAgZ2VuX29wY19lbmQgPSB0Y2dfY3R4Lmdlbl9vcGNfYnVmICsgT1BDX01BWF9TSVpFOworCisgICAgZGMtPmlzX2ptcCA9IERJU0FTX05FWFQ7CisgICAgcGNfcHRyID0gcGNfc3RhcnQ7CisgICAgbGogPSAtMTsKKyAgICBudW1faW5zbnMgPSAwOworICAgIG1heF9pbnNucyA9IHRiLT5jZmxhZ3MgJiBDRl9DT1VOVF9NQVNLOworICAgIGlmIChtYXhfaW5zbnMgPT0gMCkKKyAgICAgICAgbWF4X2luc25zID0gQ0ZfQ09VTlRfTUFTSzsKKworICAgIGdlbl9pY291bnRfc3RhcnQoKTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYgKHVubGlrZWx5KCFRVEFJTFFfRU1QVFkoJmVudi0+YnJlYWtwb2ludHMpKSkgeworICAgICAgICAgICAgUVRBSUxRX0ZPUkVBQ0goYnAsICZlbnYtPmJyZWFrcG9pbnRzLCBlbnRyeSkgeworICAgICAgICAgICAgICAgIGlmIChicC0+cGMgPT0gcGNfcHRyICYmCisgICAgICAgICAgICAgICAgICAgICEoKGJwLT5mbGFncyAmIEJQX0NQVSkgJiYgKHRiLT5mbGFncyAmIEhGX1JGX01BU0spKSkgeworICAgICAgICAgICAgICAgICAgICBnZW5fZGVidWcoZGMsIHBjX3B0ciAtIGRjLT5jc19iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZWFyY2hfcGMpIHsKKyAgICAgICAgICAgIGogPSB0Y2dfY3R4Lmdlbl9vcGNfcHRyIC0gdGNnX2N0eC5nZW5fb3BjX2J1ZjsKKyAgICAgICAgICAgIGlmIChsaiA8IGopIHsKKyAgICAgICAgICAgICAgICBsaisrOworICAgICAgICAgICAgICAgIHdoaWxlIChsaiA8IGopCisgICAgICAgICAgICAgICAgICAgIHRjZ19jdHguZ2VuX29wY19pbnN0cl9zdGFydFtsaisrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfcGNbbGpdID0gcGNfcHRyOworICAgICAgICAgICAgZ2VuX29wY19jY19vcFtsal0gPSBkYy0+Y2Nfb3A7CisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfaW5zdHJfc3RhcnRbbGpdID0gMTsKKyAgICAgICAgICAgIHRjZ19jdHguZ2VuX29wY19pY291bnRbbGpdID0gbnVtX2luc25zOworICAgICAgICB9CisgICAgICAgIGlmIChudW1faW5zbnMgKyAxID09IG1heF9pbnNucyAmJiAodGItPmNmbGFncyAmIENGX0xBU1RfSU8pKQorICAgICAgICAgICAgZ2VuX2lvX3N0YXJ0KCk7CisKKyAgICAgICAgcGNfcHRyID0gZGlzYXNfaW5zbihlbnYsIGRjLCBwY19wdHIpOworICAgICAgICBudW1faW5zbnMrKzsKKyNpZmRlZiBDT05GSUdfSEFYCisgICAgICAgIGlmIChoYXhfZW5hYmxlZCgpICYmIGhheF9zdG9wX3RyYW5zbGF0ZShFTlZfR0VUX0NQVShlbnYpKSkKKyAgICAgICAgeworICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19wdHIgLSBkYy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5fZW9iKGRjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogc3RvcCB0cmFuc2xhdGlvbiBpZiBpbmRpY2F0ZWQgKi8KKyAgICAgICAgaWYgKGRjLT5pc19qbXApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogaWYgc2luZ2xlIHN0ZXAgbW9kZSwgd2UgZ2VuZXJhdGUgb25seSBvbmUgaW5zdHJ1Y3Rpb24gYW5kCisgICAgICAgICAgIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAvKiBpZiBpcnEgd2VyZSBpbmhpYml0ZWQgd2l0aCBIRl9JTkhJQklUX0lSUV9NQVNLLCB3ZSBjbGVhcgorICAgICAgICAgICB0aGUgZmxhZyBhbmQgYWJvcnQgdGhlIHRyYW5zbGF0aW9uIHRvIGdpdmUgdGhlIGlycXMgYQorICAgICAgICAgICBjaGFuZ2UgdG8gYmUgaGFwcGVuICovCisgICAgICAgIGlmIChkYy0+dGYgfHwgZGMtPnNpbmdsZXN0ZXBfZW5hYmxlZCB8fAorICAgICAgICAgICAgKGZsYWdzICYgSEZfSU5ISUJJVF9JUlFfTUFTSykpIHsKKyAgICAgICAgICAgIGdlbl9qbXBfaW0ocGNfcHRyIC0gZGMtPmNzX2Jhc2UpOworICAgICAgICAgICAgZ2VuX2VvYihkYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBpZiB0b28gbG9uZyB0cmFuc2xhdGlvbiwgc3RvcCBnZW5lcmF0aW9uIHRvbyAqLworICAgICAgICBpZiAodGNnX2N0eC5nZW5fb3BjX3B0ciA+PSBnZW5fb3BjX2VuZCB8fAorICAgICAgICAgICAgKHBjX3B0ciAtIHBjX3N0YXJ0KSA+PSAoVEFSR0VUX1BBR0VfU0laRSAtIDMyKSB8fAorICAgICAgICAgICAgbnVtX2luc25zID49IG1heF9pbnNucykgeworICAgICAgICAgICAgZ2VuX2ptcF9pbShwY19wdHIgLSBkYy0+Y3NfYmFzZSk7CisgICAgICAgICAgICBnZW5fZW9iKGRjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzaW5nbGVzdGVwKSB7CisgICAgICAgICAgICBnZW5fam1wX2ltKHBjX3B0ciAtIGRjLT5jc19iYXNlKTsKKyAgICAgICAgICAgIGdlbl9lb2IoZGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRiLT5jZmxhZ3MgJiBDRl9MQVNUX0lPKQorICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgZ2VuX2ljb3VudF9lbmQodGIsIG51bV9pbnNucyk7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIgPSBJTkRFWF9vcF9lbmQ7CisgICAgLyogd2UgZG9uJ3QgZm9yZ2V0IHRvIGZpbGwgdGhlIGxhc3QgdmFsdWVzICovCisgICAgaWYgKHNlYXJjaF9wYykgeworICAgICAgICBqID0gdGNnX2N0eC5nZW5fb3BjX3B0ciAtIHRjZ19jdHguZ2VuX29wY19idWY7CisgICAgICAgIGxqKys7CisgICAgICAgIHdoaWxlIChsaiA8PSBqKQorICAgICAgICAgICAgdGNnX2N0eC5nZW5fb3BjX2luc3RyX3N0YXJ0W2xqKytdID0gMDsKKyAgICB9CisKKyNpZmRlZiBERUJVR19ESVNBUworICAgIGxvZ19jcHVfc3RhdGVfbWFzayhDUFVfTE9HX1RCX0NQVSwgRU5WX0dFVF9DUFUoZW52KSwgWDg2X0RVTVBfQ0NPUCk7CisgICAgaWYgKHFlbXVfbG9nbGV2ZWxfbWFzayhDUFVfTE9HX1RCX0lOX0FTTSkpIHsKKyAgICAgICAgaW50IGRpc2FzX2ZsYWdzOworICAgICAgICBxZW11X2xvZygiLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgICAgIHFlbXVfbG9nKCJJTjogJXNcbiIsIGxvb2t1cF9zeW1ib2wocGNfc3RhcnQpKTsKKyNpZmRlZiBUQVJHRVRfWDg2XzY0CisgICAgICAgIGlmIChkYy0+Y29kZTY0KQorICAgICAgICAgICAgZGlzYXNfZmxhZ3MgPSAyOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGRpc2FzX2ZsYWdzID0gIWRjLT5jb2RlMzI7CisgICAgICAgIGxvZ190YXJnZXRfZGlzYXMoZW52LCBwY19zdGFydCwgcGNfcHRyIC0gcGNfc3RhcnQsIGRpc2FzX2ZsYWdzKTsKKyAgICAgICAgcWVtdV9sb2coIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIXNlYXJjaF9wYykgeworICAgICAgICB0Yi0+c2l6ZSA9IHBjX3B0ciAtIHBjX3N0YXJ0OworICAgICAgICB0Yi0+aWNvdW50ID0gbnVtX2luc25zOworICAgIH0KK30KKwordm9pZCBnZW5faW50ZXJtZWRpYXRlX2NvZGUoQ1BVWDg2U3RhdGUgKmVudiwgVHJhbnNsYXRpb25CbG9jayAqdGIpCit7CisgICAgZ2VuX2ludGVybWVkaWF0ZV9jb2RlX2ludGVybmFsKGVudiwgdGIsIDApOworfQorCit2b2lkIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9wYyhDUFVYODZTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoZW52LCB0YiwgMSk7Cit9CisKK3ZvaWQgcmVzdG9yZV9zdGF0ZV90b19vcGMoQ1BVWDg2U3RhdGUgKmVudiwgVHJhbnNsYXRpb25CbG9jayAqdGIsIGludCBwY19wb3MpCit7CisgICAgaW50IGNjX29wOworI2lmZGVmIERFQlVHX0RJU0FTCisgICAgaWYgKHFlbXVfbG9nbGV2ZWxfbWFzayhDUFVfTE9HX1RCX09QKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcWVtdV9sb2coIlJFU1RPUkU6XG4iKTsKKyAgICAgICAgZm9yKGkgPSAwO2kgPD0gcGNfcG9zOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0Y2dfY3R4Lmdlbl9vcGNfaW5zdHJfc3RhcnRbaV0pIHsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiMHglMDR4OiAiIFRBUkdFVF9GTVRfbHggIlxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jdHguZ2VuX29wY19wY1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9sb2coInBjX3Bvcz0weCV4IGVpcD0iIFRBUkdFVF9GTVRfbHggIiBjc19iYXNlPSV4XG4iLAorICAgICAgICAgICAgICAgIHBjX3BvcywgdGNnX2N0eC5nZW5fb3BjX3BjW3BjX3Bvc10gLSB0Yi0+Y3NfYmFzZSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpdGItPmNzX2Jhc2UpOworICAgIH0KKyNlbmRpZgorICAgIGVudi0+ZWlwID0gdGNnX2N0eC5nZW5fb3BjX3BjW3BjX3Bvc10gLSB0Yi0+Y3NfYmFzZTsKKyAgICBjY19vcCA9IGdlbl9vcGNfY2Nfb3BbcGNfcG9zXTsKKyAgICBpZiAoY2Nfb3AgIT0gQ0NfT1BfRFlOQU1JQykKKyAgICAgICAgZW52LT5jY19vcCA9IGNjX29wOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9UT0RPIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzNlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL1RPRE8KQEAgLTAsMCArMSw1MiBAQAorVW5zb2x2ZWQgaXNzdWVzL2J1Z3MgaW4gdGhlIG1pcHMvbWlwc2VsIGJhY2tlbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0dlbmVyYWwKKy0tLS0tLS0KKy0gVW5pbXBsZW1lbnRlZCBBU0VzOgorICAtIE1JUFMxNgorICAtIE1ETVgKKyAgLSBTbWFydE1JUFMKKyAgLSBtaWNyb01JUFMgRFNQIHIxICYgcjIgZW5jb2RpbmdzCistIE1UIEFTRSBvbmx5IHBhcnRpYWxseSBpbXBsZW1lbnRlZCBhbmQgbm90IGZ1bmN0aW9uYWwKKy0gU2hhZG93IHJlZ2lzdGVyIHN1cHBvcnQgb25seSBwYXJ0aWFsbHkgaW1wbGVtZW50ZWQsCisgIGxhY2tzIHNldCBzd2l0Y2hpbmcgb24gaW50ZXJydXB0L2V4Y2VwdGlvbi4KKy0gMzRLIElUQyBub3QgaW1wbGVtZW50ZWQuCistIEEgZ2VuZXJhbCBsYWNrIG9mIGRvY3VtZW50YXRpb24sIGVzcGVjaWFsbHkgZm9yIHRlY2huaWNhbCBpbnRlcm5hbHMuCisgIEV4aXN0aW5nIGRvY3VtZW50YXRpb24gaXMgeDg2LWNlbnRyaWMuCistIFJldmVyc2UgZW5kaWFubmVzcyBiaXQgbm90IGltcGxlbWVudGVkCistIFRoZSBUTEIgZW11bGF0aW9uIGlzIHZlcnkgaW5lZmZpY2llbnQ6CisgIFFlbXUncyBzb2Z0bW11IGltcGxlbWVudHMgYSB4ODYtc3R5bGUgTU1VLCB3aXRoIHNlcGFyYXRlIGVudHJpZXMKKyAgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSwgYSBUTEIgaW5kZXggd2hpY2ggaXMganVzdCBhIG1vZHVsbyBvZiB0aGUKKyAgdmlydHVhbCBhZGRyZXNzLCBhbmQgYSBzZXQgb2YgVExCcyBmb3IgZWFjaCB1c2VyL2tlcm5lbC9zdXBlcnZpc29yCisgIE1NVSBtb2RlLgorICBNSVBTIGhhcyBhIHNpbmdsZSBlbnRyeSBmb3IgcmVhZC93cml0ZS9leGVjdXRlIGFuZCBvbmx5IG9uZSBNTVUgbW9kZS4KKyAgQnV0IGl0IGlzIGZ1bGx5IGFzc29jaWF0aXZlIHdpdGggcmFuZG9taXplZCBlbnRyeSBpbmRpY2VzLCBhbmQgdXNlcworICB1cCB0byAyNTYgQVNJRCB0YWdzIGFzIGFkZGl0aW9uYWwgbWF0Y2hpbmcgY3JpdGVyaW9uICh3aGljaCByb3VnaGx5CisgIGVxdWF0ZXMgdG8gMjU2IE1NVSBtb2RlcykuIEl0IGFsc28gaGFzIGEgZ2xvYmFsIGZsYWcgd2hpY2ggY2F1c2VzCisgIGVudHJpZXMgdG8gbWF0Y2ggcmVnYXJkbGVzcyBvZiBBU0lELgorICBUbyBjb3BlIHdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIFFlbXUgY3VycmVudGx5IGZsdXNoZXMgdGhlIFRMQiBhdAorICBlYWNoIEFTSUQgY2hhbmdlLiBVc2luZyB0aGUgTU1VIG1vZGVzIHRvIGltcGxlbWVudCBBU0lEcyBoaW5nZXMgb24KKyAgaW1wbGVtZW50aW5nIHRoZSBnbG9iYWwgYml0IGVmZmljaWVudGx5LgorLSBzYXZlL3Jlc3RvcmUgb2YgdGhlIENQVSBzdGF0ZSBpcyBub3QgaW1wbGVtZW50ZWQgKHNlZSBtYWNoaW5lLmMpLgorCitNSVBTNjQKKy0tLS0tLQorLSBVc2VybGFuZCBlbXVsYXRpb24gKGJvdGggbjMyIGFuZCBuNjQpIG5vdCBmdW5jdGlvbmFsLgorCisiR2VuZXJpYyIgNEtjIHN5c3RlbSBlbXVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSBEb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW55IHJlYWwgaGFyZHdhcmUuIFNob3VsZCBiZSByZW1vdmVkIHNvbWUgZGF5LAorICBVLUJvb3QgaXMgdGhlIGxhc3QgcmVtYWluaW5nIHVzZXIuCisKK1BJQ0EgNjEgc3lzdGVtIGVtdWxhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistIE5vIGZyYW1lYnVmZmVyIHN1cHBvcnQgeWV0LgorCitNQUxUQSBzeXN0ZW0gZW11bGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistIFdlIGZha2UgZmlybXdhcmUgc3VwcG9ydCBpbnN0ZWFkIG9mIGRvaW5nIHRoZSByZWFsIHRoaW5nCistIFJlYWwgZmlybXdhcmUgKFlBTU9OKSBmYWxscyBvdmVyIHdoZW4gdHJ5aW5nIHRvIGluaXQgUkFNLCBwcmVzdW1hYmx5CisgIGR1ZSB0byBsYWNraW5nIHN5c3RlbSBjb250cm9sbGVyIGVtdWxhdGlvbi4KKy0gQm9uaXRvIHN5c3RlbSBjb250cm9sbGVyIG5vdCBpbXBsZW1lbnRlZAorLSBNU0MxIHN5c3RlbSBjb250cm9sbGVyIG5vdCBpbXBsZW1lbnRlZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9jcHUtcW9tLmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2NwdS1xb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVlNDFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9jcHUtcW9tLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBRRU1VX01JUFNfQ1BVX1FPTV9ICisjZGVmaW5lIFFFTVVfTUlQU19DUFVfUU9NX0gKKworI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKKyNpbmNsdWRlICJxb20vY3B1LmgiCisKK3R5cGVkZWYgc3RydWN0IE1JUFNDUFUgeworICAgIENQVVN0YXRlIHBhcmVudF9vYmo7CisKKyAgICBDUFVNSVBTU3RhdGUgZW52OworfSBNSVBTQ1BVOworCisKK3N0YXRpYyBpbmxpbmUgTUlQU0NQVSAqbWlwc19lbnZfZ2V0X2NwdShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gY29udGFpbmVyX29mKGVudiwgTUlQU0NQVSwgZW52KTsKK30KKworI2RlZmluZSBFTlZfR0VUX0NQVShlKSAgQ1BVKG1pcHNfZW52X2dldF9jcHUoZSkpCisjZGVmaW5lIEVOVl9PRkZTRVQgb2Zmc2V0b2YoTUlQU0NQVSwgZW52KQorCisjZW5kaWYgIC8vIFFFTVVfTUlQU19DUFVfUU9NX0gKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvY3B1LmggYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2NwdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWE5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2NwdS5oCkBAIC0wLDAgKzEsNzI2IEBACisjaWYgIWRlZmluZWQgKF9fTUlQU19DUFVfSF9fKQorI2RlZmluZSBfX01JUFNfQ1BVX0hfXworCisvLyNkZWZpbmUgREVCVUdfT1AKKworI2RlZmluZSBUQVJHRVRfSEFTX0lDRSAxCisKKyNkZWZpbmUgRUxGX01BQ0hJTkUJRU1fTUlQUworCisvLyBUT0RPKGRpZ2l0KTogUmVtb3ZlIHRoaXMgZGVmaW5lLgorI2RlZmluZSBDUFVPbGRTdGF0ZSBzdHJ1Y3QgQ1BVTUlQU1N0YXRlCisKKyNkZWZpbmUgQ1BVQXJjaFN0YXRlIHN0cnVjdCBDUFVNSVBTU3RhdGUKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAibWlwcy1kZWZzLmgiCisjaW5jbHVkZSAiZXhlYy9jcHUtZGVmcy5oIgorI2luY2x1ZGUgImZwdS9zb2Z0ZmxvYXQuaCIKKworLy8gdWludF9mYXN0OF90IGFuZCB1aW50X2Zhc3QxNl90IG5vdCBpbiA8c3lzL2ludF90eXBlcy5oPgorLy8gWFhYOiBtb3ZlIHRoYXQgZWxzZXdoZXJlCisjaWYgZGVmaW5lZChDT05GSUdfU09MQVJJUykgJiYgQ09ORklHX1NPTEFSSVNfVkVSU0lPTiA8IDEwCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICAgICAgIHVpbnRfZmFzdDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAgdWludF9mYXN0MTZfdDsKKyNlbmRpZgorCitzdHJ1Y3QgQ1BVTUlQU1N0YXRlOworCit0eXBlZGVmIHN0cnVjdCByNGtfdGxiX3QgcjRrX3RsYl90Oworc3RydWN0IHI0a190bGJfdCB7CisgICAgdGFyZ2V0X3Vsb25nIFZQTjsKKyAgICB1aW50MzJfdCBQYWdlTWFzazsKKyAgICB1aW50X2Zhc3Q4X3QgQVNJRDsKKyAgICB1aW50X2Zhc3QxNl90IEc6MTsKKyAgICB1aW50X2Zhc3QxNl90IEMwOjM7CisgICAgdWludF9mYXN0MTZfdCBDMTozOworICAgIHVpbnRfZmFzdDE2X3QgVjA6MTsKKyAgICB1aW50X2Zhc3QxNl90IFYxOjE7CisgICAgdWludF9mYXN0MTZfdCBEMDoxOworICAgIHVpbnRfZmFzdDE2X3QgRDE6MTsKKyAgICB0YXJnZXRfdWxvbmcgUEZOWzJdOworfTsKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit0eXBlZGVmIHN0cnVjdCBDUFVNSVBTVExCQ29udGV4dCBDUFVNSVBTVExCQ29udGV4dDsKK3N0cnVjdCBDUFVNSVBTVExCQ29udGV4dCB7CisgICAgdWludDMyX3QgbmJfdGxiOworICAgIHVpbnQzMl90IHRsYl9pbl91c2U7CisgICAgaW50ICgqbWFwX2FkZHJlc3MpIChzdHJ1Y3QgQ1BVTUlQU1N0YXRlICplbnYsIGh3YWRkciAqcGh5c2ljYWwsIGludCAqcHJvdCwgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsIGludCBydywgaW50IGFjY2Vzc190eXBlKTsKKyAgICB2b2lkICgqaGVscGVyX3RsYndpKShzdHJ1Y3QgQ1BVTUlQU1N0YXRlICplbnYpOworICAgIHZvaWQgKCpoZWxwZXJfdGxid3IpKHN0cnVjdCBDUFVNSVBTU3RhdGUgKmVudik7CisgICAgdm9pZCAoKmhlbHBlcl90bGJwKShzdHJ1Y3QgQ1BVTUlQU1N0YXRlICplbnYpOworICAgIHZvaWQgKCpoZWxwZXJfdGxicikoc3RydWN0IENQVU1JUFNTdGF0ZSAqZW52KTsKKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICByNGtfdGxiX3QgdGxiW01JUFNfVExCX01BWF07CisgICAgICAgIH0gcjRrOworICAgIH0gbW11OworfTsKKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIGZwcl90IGZwcl90OwordW5pb24gZnByX3QgeworICAgIGZsb2F0NjQgIGZkOyAgIC8qIGllZWUgZG91YmxlIHByZWNpc2lvbiAqLworICAgIGZsb2F0MzIgIGZzWzJdOy8qIGllZWUgc2luZ2xlIHByZWNpc2lvbiAqLworICAgIHVpbnQ2NF90IGQ7ICAgIC8qIGJpbmFyeSBkb3VibGUgZml4ZWQtcG9pbnQgKi8KKyAgICB1aW50MzJfdCB3WzJdOyAvKiBiaW5hcnkgc2luZ2xlIGZpeGVkLXBvaW50ICovCit9OworLyogZGVmaW5lIEZQX0VORElBTl9JRFggdG8gYWNjZXNzIHRoZSBzYW1lIGxvY2F0aW9uCisgKiBpbiB0aGUgZnByX3QgdW5pb24gcmVnYXJkbGVzcyBvZiB0aGUgaG9zdCBlbmRpYW5uZXNzCisgKi8KKyNpZiBkZWZpbmVkKEhPU1RfV09SRFNfQklHRU5ESUFOKQorIyAgZGVmaW5lIEZQX0VORElBTl9JRFggMQorI2Vsc2UKKyMgIGRlZmluZSBGUF9FTkRJQU5fSURYIDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDUFVNSVBTRlBVQ29udGV4dCBDUFVNSVBTRlBVQ29udGV4dDsKK3N0cnVjdCBDUFVNSVBTRlBVQ29udGV4dCB7CisgICAgLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisgICAgZnByX3QgZnByWzMyXTsKKyAgICBmbG9hdF9zdGF0dXMgZnBfc3RhdHVzOworICAgIC8qIGZwdSBpbXBsZW1lbnRhdGlvbi9yZXZpc2lvbiByZWdpc3RlciAoZmlyKSAqLworICAgIHVpbnQzMl90IGZjcjA7CisjZGVmaW5lIEZDUjBfRjY0IDIyCisjZGVmaW5lIEZDUjBfTCAyMQorI2RlZmluZSBGQ1IwX1cgMjAKKyNkZWZpbmUgRkNSMF8zRCAxOQorI2RlZmluZSBGQ1IwX1BTIDE4CisjZGVmaW5lIEZDUjBfRCAxNworI2RlZmluZSBGQ1IwX1MgMTYKKyNkZWZpbmUgRkNSMF9QUklEIDgKKyNkZWZpbmUgRkNSMF9SRVYgMAorICAgIC8qIGZjc3IgKi8KKyAgICB1aW50MzJfdCBmY3IzMTsKKyNkZWZpbmUgU0VUX0ZQX0NPTkQobnVtLGVudikgICAgIGRvIHsgKChlbnYpLmZjcjMxKSB8PSAoKG51bSkgPyAoMSA8PCAoKG51bSkgKyAyNCkpIDogKDEgPDwgMjMpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBDTEVBUl9GUF9DT05EKG51bSxlbnYpICAgZG8geyAoKGVudikuZmNyMzEpICY9IH4oKG51bSkgPyAoMSA8PCAoKG51bSkgKyAyNCkpIDogKDEgPDwgMjMpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBHRVRfRlBfQ09ORChlbnYpICAgICAgICAgKCgoKGVudikuZmNyMzEgPj4gMjQpICYgMHhmZSkgfCAoKChlbnYpLmZjcjMxID4+IDIzKSAmIDB4MSkpCisjZGVmaW5lIEdFVF9GUF9DQVVTRShyZWcpICAgICAgICAoKChyZWcpID4+IDEyKSAmIDB4M2YpCisjZGVmaW5lIEdFVF9GUF9FTkFCTEUocmVnKSAgICAgICAoKChyZWcpID4+ICA3KSAmIDB4MWYpCisjZGVmaW5lIEdFVF9GUF9GTEFHUyhyZWcpICAgICAgICAoKChyZWcpID4+ICAyKSAmIDB4MWYpCisjZGVmaW5lIFNFVF9GUF9DQVVTRShyZWcsdikgICAgICBkbyB7IChyZWcpID0gKChyZWcpICYgfigweDNmIDw8IDEyKSkgfCAoKHYgJiAweDNmKSA8PCAxMik7IH0gd2hpbGUoMCkKKyNkZWZpbmUgU0VUX0ZQX0VOQUJMRShyZWcsdikgICAgIGRvIHsgKHJlZykgPSAoKHJlZykgJiB+KDB4MWYgPDwgIDcpKSB8ICgodiAmIDB4MWYpIDw8IDcpOyB9IHdoaWxlKDApCisjZGVmaW5lIFNFVF9GUF9GTEFHUyhyZWcsdikgICAgICBkbyB7IChyZWcpID0gKChyZWcpICYgfigweDFmIDw8ICAyKSkgfCAoKHYgJiAweDFmKSA8PCAyKTsgfSB3aGlsZSgwKQorI2RlZmluZSBVUERBVEVfRlBfRkxBR1MocmVnLHYpICAgZG8geyAocmVnKSB8PSAoKHYgJiAweDFmKSA8PCAyKTsgfSB3aGlsZSgwKQorI2RlZmluZSBGUF9JTkVYQUNUICAgICAgICAxCisjZGVmaW5lIEZQX1VOREVSRkxPVyAgICAgIDIKKyNkZWZpbmUgRlBfT1ZFUkZMT1cgICAgICAgNAorI2RlZmluZSBGUF9ESVYwICAgICAgICAgICA4CisjZGVmaW5lIEZQX0lOVkFMSUQgICAgICAgIDE2CisjZGVmaW5lIEZQX1VOSU1QTEVNRU5URUQgIDMyCit9OworCisjZGVmaW5lIE5CX01NVV9NT0RFUyAzCisKK3R5cGVkZWYgc3RydWN0IENQVU1JUFNNVlBDb250ZXh0IENQVU1JUFNNVlBDb250ZXh0Oworc3RydWN0IENQVU1JUFNNVlBDb250ZXh0IHsKKyAgICBpbnQzMl90IENQMF9NVlBDb250cm9sOworI2RlZmluZSBDUDBNVlBDb19DUEEJMworI2RlZmluZSBDUDBNVlBDb19TVExCCTIKKyNkZWZpbmUgQ1AwTVZQQ29fVlBDCTEKKyNkZWZpbmUgQ1AwTVZQQ29fRVZQCTAKKyAgICBpbnQzMl90IENQMF9NVlBDb25mMDsKKyNkZWZpbmUgQ1AwTVZQQzBfTQkzMQorI2RlZmluZSBDUDBNVlBDMF9UTEJTCTI5CisjZGVmaW5lIENQME1WUEMwX0dTCTI4CisjZGVmaW5lIENQME1WUEMwX1BDUAkyNworI2RlZmluZSBDUDBNVlBDMF9QVExCRQkxNgorI2RlZmluZSBDUDBNVlBDMF9UQ0EJMTUKKyNkZWZpbmUgQ1AwTVZQQzBfUFZQRQkxMAorI2RlZmluZSBDUDBNVlBDMF9QVEMJMAorICAgIGludDMyX3QgQ1AwX01WUENvbmYxOworI2RlZmluZSBDUDBNVlBDMV9DSU0JMzEKKyNkZWZpbmUgQ1AwTVZQQzFfQ0lGCTMwCisjZGVmaW5lIENQME1WUEMxX1BDWAkyMAorI2RlZmluZSBDUDBNVlBDMV9QQ1AyCTEwCisjZGVmaW5lIENQME1WUEMxX1BDUDEJMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWlwc19kZWZfdCBtaXBzX2RlZl90OworCisjZGVmaW5lIE1JUFNfU0hBRE9XX1NFVF9NQVggMTYKKyNkZWZpbmUgTUlQU19UQ19NQVggNQorI2RlZmluZSBNSVBTX0ZQVV9NQVggMQorI2RlZmluZSBNSVBTX0RTUF9BQ0MgNAorCit0eXBlZGVmIHN0cnVjdCBUQ1N0YXRlIFRDU3RhdGU7CitzdHJ1Y3QgVENTdGF0ZSB7CisgICAgdGFyZ2V0X3Vsb25nIGdwclszMl07CisgICAgdGFyZ2V0X3Vsb25nIFBDOworICAgIHRhcmdldF91bG9uZyBISVtNSVBTX0RTUF9BQ0NdOworICAgIHRhcmdldF91bG9uZyBMT1tNSVBTX0RTUF9BQ0NdOworICAgIHRhcmdldF91bG9uZyBBQ1hbTUlQU19EU1BfQUNDXTsKKyAgICB0YXJnZXRfdWxvbmcgRFNQQ29udHJvbDsKKyAgICBpbnQzMl90IENQMF9UQ1N0YXR1czsKKyNkZWZpbmUgQ1AwVENTdF9UQ1UzCTMxCisjZGVmaW5lIENQMFRDU3RfVENVMgkzMAorI2RlZmluZSBDUDBUQ1N0X1RDVTEJMjkKKyNkZWZpbmUgQ1AwVENTdF9UQ1UwCTI4CisjZGVmaW5lIENQMFRDU3RfVE1YCTI3CisjZGVmaW5lIENQMFRDU3RfUk5TVAkyMworI2RlZmluZSBDUDBUQ1N0X1REUwkyMQorI2RlZmluZSBDUDBUQ1N0X0RUCTIwCisjZGVmaW5lIENQMFRDU3RfREEJMTUKKyNkZWZpbmUgQ1AwVENTdF9BCTEzCisjZGVmaW5lIENQMFRDU3RfVEtTVQkxMQorI2RlZmluZSBDUDBUQ1N0X0lYTVQJMTAKKyNkZWZpbmUgQ1AwVENTdF9UQVNJRAkwCisgICAgaW50MzJfdCBDUDBfVENCaW5kOworI2RlZmluZSBDUDBUQ0JkX0N1clRDCTIxCisjZGVmaW5lIENQMFRDQmRfVEJFCTE3CisjZGVmaW5lIENQMFRDQmRfQ3VyVlBFCTAKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1RDSGFsdDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1RDQ29udGV4dDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1RDU2NoZWR1bGU7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9UQ1NjaGVGQmFjazsKKyAgICBpbnQzMl90IENQMF9EZWJ1Z190Y3N0YXR1czsKK307CisKK3R5cGVkZWYgc3RydWN0IENQVU1JUFNTdGF0ZSBDUFVNSVBTU3RhdGU7CitzdHJ1Y3QgQ1BVTUlQU1N0YXRlIHsKKyAgICBUQ1N0YXRlIGFjdGl2ZV90YzsKKyAgICBDUFVNSVBTRlBVQ29udGV4dCBhY3RpdmVfZnB1OworCisgICAgdWludDMyX3QgY3VycmVudF90YzsKKyAgICB1aW50MzJfdCBjdXJyZW50X2ZwdTsKKworICAgIHVpbnQzMl90IFNFR0JJVFM7CisgICAgdWludDMyX3QgUEFCSVRTOworICAgIHRhcmdldF91bG9uZyBTRUdNYXNrOworICAgIHRhcmdldF91bG9uZyBQQU1hc2s7CisKKyAgICBpbnQzMl90IENQMF9JbmRleDsKKyAgICAvKiBDUDBfTVZQKiBhcmUgcGVyIE1WUCByZWdpc3RlcnMuICovCisgICAgaW50MzJfdCBDUDBfUmFuZG9tOworICAgIGludDMyX3QgQ1AwX1ZQRUNvbnRyb2w7CisjZGVmaW5lIENQMFZQRUNvX1lTSQkyMQorI2RlZmluZSBDUDBWUEVDb19HU0kJMjAKKyNkZWZpbmUgQ1AwVlBFQ29fRVhDUFQJMTYKKyNkZWZpbmUgQ1AwVlBFQ29fVEUJMTUKKyNkZWZpbmUgQ1AwVlBFQ29fVGFyZ1RDCTAKKyAgICBpbnQzMl90IENQMF9WUEVDb25mMDsKKyNkZWZpbmUgQ1AwVlBFQzBfTQkzMQorI2RlZmluZSBDUDBWUEVDMF9YVEMJMjEKKyNkZWZpbmUgQ1AwVlBFQzBfVENTCTE5CisjZGVmaW5lIENQMFZQRUMwX1NDUwkxOAorI2RlZmluZSBDUDBWUEVDMF9EU0MJMTcKKyNkZWZpbmUgQ1AwVlBFQzBfSUNTCTE2CisjZGVmaW5lIENQMFZQRUMwX01WUAkxCisjZGVmaW5lIENQMFZQRUMwX1ZQQQkwCisgICAgaW50MzJfdCBDUDBfVlBFQ29uZjE7CisjZGVmaW5lIENQMFZQRUMxX05DWAkyMAorI2RlZmluZSBDUDBWUEVDMV9OQ1AyCTEwCisjZGVmaW5lIENQMFZQRUMxX05DUDEJMAorICAgIHRhcmdldF91bG9uZyBDUDBfWVFNYXNrOworICAgIHRhcmdldF91bG9uZyBDUDBfVlBFU2NoZWR1bGU7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9WUEVTY2hlRkJhY2s7CisgICAgaW50MzJfdCBDUDBfVlBFT3B0OworI2RlZmluZSBDUDBWUEVPcHRfSVdYNwkxNQorI2RlZmluZSBDUDBWUEVPcHRfSVdYNgkxNAorI2RlZmluZSBDUDBWUEVPcHRfSVdYNQkxMworI2RlZmluZSBDUDBWUEVPcHRfSVdYNAkxMgorI2RlZmluZSBDUDBWUEVPcHRfSVdYMwkxMQorI2RlZmluZSBDUDBWUEVPcHRfSVdYMgkxMAorI2RlZmluZSBDUDBWUEVPcHRfSVdYMQk5CisjZGVmaW5lIENQMFZQRU9wdF9JV1gwCTgKKyNkZWZpbmUgQ1AwVlBFT3B0X0RXWDcJNworI2RlZmluZSBDUDBWUEVPcHRfRFdYNgk2CisjZGVmaW5lIENQMFZQRU9wdF9EV1g1CTUKKyNkZWZpbmUgQ1AwVlBFT3B0X0RXWDQJNAorI2RlZmluZSBDUDBWUEVPcHRfRFdYMwkzCisjZGVmaW5lIENQMFZQRU9wdF9EV1gyCTIKKyNkZWZpbmUgQ1AwVlBFT3B0X0RXWDEJMQorI2RlZmluZSBDUDBWUEVPcHRfRFdYMAkwCisgICAgdGFyZ2V0X3Vsb25nIENQMF9FbnRyeUxvMDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX0VudHJ5TG8xOworI2RlZmluZSBDUDBFbkxvX1BGTiAgNgorI2RlZmluZSBDUDBFbkxvX0MgICAgMworI2RlZmluZSBDUDBFbkxvX0QgICAgMgorI2RlZmluZSBDUDBFbkxvX1YgICAgMQorI2RlZmluZSBDUDBFbkxvX0cgICAgMAorICAgIHRhcmdldF91bG9uZyBDUDBfQ29udGV4dDsKKyAgICBpbnQzMl90IENQMF9QYWdlTWFzazsKKyAgICBpbnQzMl90IENQMF9QYWdlR3JhaW47CisgICAgaW50MzJfdCBDUDBfV2lyZWQ7CisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjBfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMDsKKyNkZWZpbmUgQ1AwU1JTQzBfTQkzMQorI2RlZmluZSBDUDBTUlNDMF9TUlMzCTIwCisjZGVmaW5lIENQMFNSU0MwX1NSUzIJMTAKKyNkZWZpbmUgQ1AwU1JTQzBfU1JTMQkwCisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjFfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMTsKKyNkZWZpbmUgQ1AwU1JTQzFfTQkzMQorI2RlZmluZSBDUDBTUlNDMV9TUlM2CTIwCisjZGVmaW5lIENQMFNSU0MxX1NSUzUJMTAKKyNkZWZpbmUgQ1AwU1JTQzFfU1JTNAkwCisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjJfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMjsKKyNkZWZpbmUgQ1AwU1JTQzJfTQkzMQorI2RlZmluZSBDUDBTUlNDMl9TUlM5CTIwCisjZGVmaW5lIENQMFNSU0MyX1NSUzgJMTAKKyNkZWZpbmUgQ1AwU1JTQzJfU1JTNwkwCisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjNfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMzsKKyNkZWZpbmUgQ1AwU1JTQzNfTQkzMQorI2RlZmluZSBDUDBTUlNDM19TUlMxMgkyMAorI2RlZmluZSBDUDBTUlNDM19TUlMxMQkxMAorI2RlZmluZSBDUDBTUlNDM19TUlMxMAkwCisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjRfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mNDsKKyNkZWZpbmUgQ1AwU1JTQzRfU1JTMTUJMjAKKyNkZWZpbmUgQ1AwU1JTQzRfU1JTMTQJMTAKKyNkZWZpbmUgQ1AwU1JTQzRfU1JTMTMJMAorICAgIGludDMyX3QgQ1AwX0hXUkVuYTsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX0JhZFZBZGRyOworICAgIGludDMyX3QgQ1AwX0NvdW50OworICAgIHRhcmdldF91bG9uZyBDUDBfRW50cnlIaTsKKyAgICBpbnQzMl90IENQMF9Db21wYXJlOworICAgIGludDMyX3QgQ1AwX1N0YXR1czsKKyNkZWZpbmUgQ1AwU3RfQ1UzICAgMzEKKyNkZWZpbmUgQ1AwU3RfQ1UyICAgMzAKKyNkZWZpbmUgQ1AwU3RfQ1UxICAgMjkKKyNkZWZpbmUgQ1AwU3RfQ1UwICAgMjgKKyNkZWZpbmUgQ1AwU3RfUlAgICAgMjcKKyNkZWZpbmUgQ1AwU3RfRlIgICAgMjYKKyNkZWZpbmUgQ1AwU3RfUkUgICAgMjUKKyNkZWZpbmUgQ1AwU3RfTVggICAgMjQKKyNkZWZpbmUgQ1AwU3RfUFggICAgMjMKKyNkZWZpbmUgQ1AwU3RfQkVWICAgMjIKKyNkZWZpbmUgQ1AwU3RfVFMgICAgMjEKKyNkZWZpbmUgQ1AwU3RfU1IgICAgMjAKKyNkZWZpbmUgQ1AwU3RfTk1JICAgMTkKKyNkZWZpbmUgQ1AwU3RfSU0gICAgOAorI2RlZmluZSBDUDBTdF9LWCAgICA3CisjZGVmaW5lIENQMFN0X1NYICAgIDYKKyNkZWZpbmUgQ1AwU3RfVVggICAgNQorI2RlZmluZSBDUDBTdF9LU1UgICAzCisjZGVmaW5lIENQMFN0X0VSTCAgIDIKKyNkZWZpbmUgQ1AwU3RfRVhMICAgMQorI2RlZmluZSBDUDBTdF9JRSAgICAwCisgICAgaW50MzJfdCBDUDBfSW50Q3RsOworI2RlZmluZSBDUDBJbnRDdGxfSVBUSSAyOQorI2RlZmluZSBDUDBJbnRDdGxfSVBQQzEgMjYKKyNkZWZpbmUgQ1AwSW50Q3RsX1ZTIDUKKyAgICBpbnQzMl90IENQMF9TUlNDdGw7CisjZGVmaW5lIENQMFNSU0N0bF9IU1MgMjYKKyNkZWZpbmUgQ1AwU1JTQ3RsX0VJQ1NTIDE4CisjZGVmaW5lIENQMFNSU0N0bF9FU1MgMTIKKyNkZWZpbmUgQ1AwU1JTQ3RsX1BTUyA2CisjZGVmaW5lIENQMFNSU0N0bF9DU1MgMAorICAgIGludDMyX3QgQ1AwX1NSU01hcDsKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjcgMjgKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjYgMjQKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjUgMjAKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjQgMTYKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjMgMTIKKyNkZWZpbmUgQ1AwU1JTTWFwX1NTVjIgOAorI2RlZmluZSBDUDBTUlNNYXBfU1NWMSA0CisjZGVmaW5lIENQMFNSU01hcF9TU1YwIDAKKyAgICBpbnQzMl90IENQMF9DYXVzZTsKKyNkZWZpbmUgQ1AwQ2FfQkQgICAzMQorI2RlZmluZSBDUDBDYV9USSAgIDMwCisjZGVmaW5lIENQMENhX0NFICAgMjgKKyNkZWZpbmUgQ1AwQ2FfREMgICAyNworI2RlZmluZSBDUDBDYV9QQ0kgIDI2CisjZGVmaW5lIENQMENhX0lWICAgMjMKKyNkZWZpbmUgQ1AwQ2FfV1AgICAyMgorI2RlZmluZSBDUDBDYV9JUCAgICA4CisjZGVmaW5lIENQMENhX0lQX21hc2sgMHgwMDAwRkYwMAorI2RlZmluZSBDUDBDYV9FQyAgICAyCisgICAgdGFyZ2V0X3Vsb25nIENQMF9FUEM7CisgICAgaW50MzJfdCBDUDBfUFJpZDsKKyAgICBpbnQzMl90IENQMF9FQmFzZTsKKyAgICBpbnQzMl90IENQMF9Db25maWcwOworI2RlZmluZSBDUDBDMF9NICAgIDMxCisjZGVmaW5lIENQMEMwX0syMyAgMjgKKyNkZWZpbmUgQ1AwQzBfS1UgICAyNQorI2RlZmluZSBDUDBDMF9NRFUgIDIwCisjZGVmaW5lIENQMEMwX01NICAgMTcKKyNkZWZpbmUgQ1AwQzBfQk0gICAxNgorI2RlZmluZSBDUDBDMF9CRSAgIDE1CisjZGVmaW5lIENQMEMwX0FUICAgMTMKKyNkZWZpbmUgQ1AwQzBfQVIgICAxMAorI2RlZmluZSBDUDBDMF9NVCAgIDcKKyNkZWZpbmUgQ1AwQzBfVkkgICAzCisjZGVmaW5lIENQMEMwX0swICAgMAorICAgIGludDMyX3QgQ1AwX0NvbmZpZzE7CisjZGVmaW5lIENQMEMxX00gICAgMzEKKyNkZWZpbmUgQ1AwQzFfTU1VICAyNQorI2RlZmluZSBDUDBDMV9JUyAgIDIyCisjZGVmaW5lIENQMEMxX0lMICAgMTkKKyNkZWZpbmUgQ1AwQzFfSUEgICAxNgorI2RlZmluZSBDUDBDMV9EUyAgIDEzCisjZGVmaW5lIENQMEMxX0RMICAgMTAKKyNkZWZpbmUgQ1AwQzFfREEgICA3CisjZGVmaW5lIENQMEMxX0MyICAgNgorI2RlZmluZSBDUDBDMV9NRCAgIDUKKyNkZWZpbmUgQ1AwQzFfUEMgICA0CisjZGVmaW5lIENQMEMxX1dSICAgMworI2RlZmluZSBDUDBDMV9DQSAgIDIKKyNkZWZpbmUgQ1AwQzFfRVAgICAxCisjZGVmaW5lIENQMEMxX0ZQICAgMAorICAgIGludDMyX3QgQ1AwX0NvbmZpZzI7CisjZGVmaW5lIENQMEMyX00gICAgMzEKKyNkZWZpbmUgQ1AwQzJfVFUgICAyOAorI2RlZmluZSBDUDBDMl9UUyAgIDI0CisjZGVmaW5lIENQMEMyX1RMICAgMjAKKyNkZWZpbmUgQ1AwQzJfVEEgICAxNgorI2RlZmluZSBDUDBDMl9TVSAgIDEyCisjZGVmaW5lIENQMEMyX1NTICAgOAorI2RlZmluZSBDUDBDMl9TTCAgIDQKKyNkZWZpbmUgQ1AwQzJfU0EgICAwCisgICAgaW50MzJfdCBDUDBfQ29uZmlnMzsKKyNkZWZpbmUgQ1AwQzNfTSAgICAzMQorI2RlZmluZSBDUDBDM19JU0FfT05fRVhDIDE2CisjZGVmaW5lIENQMEMzX0RTUDJQIDExCisjZGVmaW5lIENQMEMzX0RTUFAgMTAKKyNkZWZpbmUgQ1AwQzNfTFBBICA3CisjZGVmaW5lIENQMEMzX1ZFSUMgNgorI2RlZmluZSBDUDBDM19WSW50IDUKKyNkZWZpbmUgQ1AwQzNfU1AgICA0CisjZGVmaW5lIENQMEMzX01UICAgMgorI2RlZmluZSBDUDBDM19TTSAgIDEKKyNkZWZpbmUgQ1AwQzNfVEwgICAwCisgICAgaW50MzJfdCBDUDBfQ29uZmlnNjsKKyAgICBpbnQzMl90IENQMF9Db25maWc3OworICAgIC8qIFhYWDogTWF5YmUgbWFrZSBMTEFkZHIgcGVyLVRDPyAqLworICAgIHRhcmdldF91bG9uZyBsbGFkZHI7CisgICAgdGFyZ2V0X3Vsb25nIGxsdmFsOworICAgIHRhcmdldF91bG9uZyBsbG5ld3ZhbDsKKyAgICB0YXJnZXRfdWxvbmcgbGxyZWc7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9MTEFkZHJfcndfYml0bWFzazsKKyAgICBpbnQgQ1AwX0xMQWRkcl9zaGlmdDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1dhdGNoTG9bOF07CisgICAgaW50MzJfdCBDUDBfV2F0Y2hIaVs4XTsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1hDb250ZXh0OworICAgIGludDMyX3QgQ1AwX0ZyYW1lbWFzazsKKyAgICBpbnQzMl90IENQMF9EZWJ1ZzsKKyNkZWZpbmUgQ1AwREJfREJEICAzMQorI2RlZmluZSBDUDBEQl9ETSAgIDMwCisjZGVmaW5lIENQMERCX0xTTk0gMjgKKyNkZWZpbmUgQ1AwREJfRG96ZSAyNworI2RlZmluZSBDUDBEQl9IYWx0IDI2CisjZGVmaW5lIENQMERCX0NOVCAgMjUKKyNkZWZpbmUgQ1AwREJfSUJFUCAyNAorI2RlZmluZSBDUDBEQl9EQkVQIDIxCisjZGVmaW5lIENQMERCX0lFWEkgMjAKKyNkZWZpbmUgQ1AwREJfVkVSICAxNQorI2RlZmluZSBDUDBEQl9ERUMgIDEwCisjZGVmaW5lIENQMERCX1NTdCAgOAorI2RlZmluZSBDUDBEQl9ESU5UIDUKKyNkZWZpbmUgQ1AwREJfRElCICA0CisjZGVmaW5lIENQMERCX0REQlMgMworI2RlZmluZSBDUDBEQl9EREJMIDIKKyNkZWZpbmUgQ1AwREJfREJwICAxCisjZGVmaW5lIENQMERCX0RTUyAgMAorICAgIHRhcmdldF91bG9uZyBDUDBfREVQQzsKKyAgICBpbnQzMl90IENQMF9QZXJmb3JtYW5jZTA7CisgICAgaW50MzJfdCBDUDBfVGFnTG87CisgICAgaW50MzJfdCBDUDBfRGF0YUxvOworICAgIGludDMyX3QgQ1AwX1RhZ0hpOworICAgIGludDMyX3QgQ1AwX0RhdGFIaTsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX0Vycm9yRVBDOworICAgIGludDMyX3QgQ1AwX0RFU0FWRTsKKyAgICAvKiBXZSB3YXN0ZSBzb21lIHNwYWNlIHNvIHdlIGNhbiBoYW5kbGUgc2hhZG93IHJlZ2lzdGVycyBsaWtlIFRDcy4gKi8KKyAgICBUQ1N0YXRlIHRjc1tNSVBTX1NIQURPV19TRVRfTUFYXTsKKyAgICBDUFVNSVBTRlBVQ29udGV4dCBmcHVzW01JUFNfRlBVX01BWF07CisgICAgLyogUUVNVSAqLworICAgIGludCBlcnJvcl9jb2RlOworICAgIHVpbnQzMl90IGhmbGFnczsgICAgLyogQ1BVIFN0YXRlICovCisgICAgLyogVE1BU0sgZGVmaW5lcyBkaWZmZXJlbnQgZXhlY3V0aW9uIG1vZGVzICovCisjZGVmaW5lIE1JUFNfSEZMQUdfVE1BU0sgIDB4QzNGRgorI2RlZmluZSBNSVBTX0hGTEFHX01PREUgICAweDAwMDcgLyogZXhlY3V0aW9uIG1vZGVzICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIFRoZSBLU1UgZmxhZ3MgbXVzdCBiZSB0aGUgbG93ZXN0IGJpdHMgaW4gaGZsYWdzLiBUaGUgZmxhZyBvcmRlcgorICAgICAgIG11c3QgYmUgdGhlIHNhbWUgYXMgZGVmaW5lZCBmb3IgQ1AwIFN0YXR1cy4gVGhpcyBhbGxvd3MgdG8gdXNlCisgICAgICAgdGhlIGJpdHMgYXMgdGhlIHZhbHVlIG9mIG1tdV9pZHguICovCisjZGVmaW5lIE1JUFNfSEZMQUdfS1NVICAgIDB4MDAwMyAvKiBrZXJuZWwvc3VwZXJ2aXNvci91c2VyIG1vZGUgbWFzayAgICovCisjZGVmaW5lIE1JUFNfSEZMQUdfVU0gICAgICAgMHgwMDAyIC8qIHVzZXIgbW9kZSBmbGFnICovCisjZGVmaW5lIE1JUFNfSEZMQUdfU00gICAgICAgMHgwMDAxIC8qIHN1cGVydmlzb3IgbW9kZSBmbGFnICovCisjZGVmaW5lIE1JUFNfSEZMQUdfS00gICAgICAgMHgwMDAwIC8qIGtlcm5lbCBtb2RlIGZsYWcgKi8KKyNkZWZpbmUgTUlQU19IRkxBR19ETSAgICAgMHgwMDA0IC8qIERlYnVnIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlQU19IRkxBR182NCAgICAgMHgwMDA4IC8qIDY0LWJpdCBpbnN0cnVjdGlvbnMgZW5hYmxlZCAgICAgICAgKi8KKyNkZWZpbmUgTUlQU19IRkxBR19DUDAgICAgMHgwMDEwIC8qIENQMCBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlQU19IRkxBR19GUFUgICAgMHgwMDIwIC8qIEZQVSBlbmFibGVkICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgTUlQU19IRkxBR19GNjQgICAgMHgwMDQwIC8qIDY0LWJpdCBGUFUgZW5hYmxlZCAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUcnVlIGlmIHRoZSBNSVBTIElWIENPUDFYIGluc3RydWN0aW9ucyBjYW4gYmUgdXNlZC4gIFRoaXMgYWxzbworICAgICAgIGNvbnRyb2xzIHRoZSBub24tQ09QMVggaW5zdHJ1Y3Rpb25zIFJFQ0lQLlMsIFJFQ0lQLkQsIFJTUVJULlMKKyAgICAgICBhbmQgUlNRUlQuRC4gICovCisjZGVmaW5lIE1JUFNfSEZMQUdfQ09QMVggIDB4MDA4MCAvKiBDT1AxWCBpbnN0cnVjdGlvbnMgZW5hYmxlZCAgICAgICAgICovCisjZGVmaW5lIE1JUFNfSEZMQUdfUkUgICAgIDB4MDEwMCAvKiBSZXZlcnNlZCBlbmRpYW5uZXNzICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JUFNfSEZMQUdfVVggICAgIDB4MDIwMCAvKiA2NC1iaXQgdXNlciBtb2RlICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSWYgdHJhbnNsYXRpb24gaXMgaW50ZXJydXB0ZWQgYmV0d2VlbiB0aGUgYnJhbmNoIGluc3RydWN0aW9uIGFuZAorICAgICAqIHRoZSBkZWxheSBzbG90LCByZWNvcmQgd2hhdCB0eXBlIG9mIGJyYW5jaCBpdCBpcyBzbyB0aGF0IHdlIGNhbgorICAgICAqIHJlc3VtZSB0cmFuc2xhdGlvbiBwcm9wZXJseS4gIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlZHVjZQorICAgICAqIHRoaXMgZnJvbSB0aHJlZSBiaXRzIHRvIHR3by4gICovCisjZGVmaW5lIE1JUFNfSEZMQUdfQk1BU0sgIDB4MUMwMAorI2RlZmluZSBNSVBTX0hGTEFHX0IgICAgICAweDA0MDAgLyogVW5jb25kaXRpb25hbCBicmFuY2ggICAgICAgICAgICAgICAqLworI2RlZmluZSBNSVBTX0hGTEFHX0JDICAgICAweDA4MDAgLyogQ29uZGl0aW9uYWwgYnJhbmNoICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSVBTX0hGTEFHX0JMICAgICAweDBDMDAgLyogTGlrZWx5IGJyYW5jaCAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBNSVBTX0hGTEFHX0JSICAgICAweDEwMDAgLyogYnJhbmNoIHRvIHJlZ2lzdGVyIChjYW4ndCBsaW5rIFRCKSAqLworICAgIC8qIE1JUFMgRFNQIHJlc291cmNlcyBhY2Nlc3MuICovCisjZGVmaW5lIE1JUFNfSEZMQUdfRFNQICAgMHg0MDAwICAvKiBFbmFibGUgYWNjZXNzIHRvIE1JUFMgRFNQIHJlc291cmNlcy4gKi8KKyNkZWZpbmUgTUlQU19IRkxBR19EU1BSMiAweDgwMDAgIC8qIEVuYWJsZSBhY2Nlc3MgdG8gTUlQUyBEU1BSMiByZXNvdXJjZXMuICovCisgICAgdGFyZ2V0X3Vsb25nIGJ0YXJnZXQ7ICAgICAgICAvKiBKdW1wIC8gYnJhbmNoIHRhcmdldCAgICAgICAgICAgICAgICovCisgICAgdGFyZ2V0X3Vsb25nIGJjb25kOyAgICAgICAgICAvKiBCcmFuY2ggY29uZGl0aW9uIChpZiBuZWVkZWQpICAgICAgICovCisKKyAgICBpbnQgU1lOQ0lfU3RlcDsgLyogQWRkcmVzcyBzdGVwIHNpemUgZm9yIFNZTkNJICovCisgICAgaW50IENDUmVzOyAvKiBDeWNsZSBjb3VudCByZXNvbHV0aW9uL2Rpdmlzb3IgKi8KKyAgICB1aW50MzJfdCBDUDBfU3RhdHVzX3J3X2JpdG1hc2s7IC8qIFJlYWQvd3JpdGUgYml0cyBpbiBDUDBfU3RhdHVzICovCisgICAgdWludDMyX3QgQ1AwX1RDU3RhdHVzX3J3X2JpdG1hc2s7IC8qIFJlYWQvd3JpdGUgYml0cyBpbiBDUDBfVENTdGF0dXMgKi8KKyAgICBpbnQgaW5zbl9mbGFnczsgLyogU3VwcG9ydGVkIGluc3RydWN0aW9uIHNldCAqLworCisgICAgdGFyZ2V0X3Vsb25nIHRsc192YWx1ZTsgLyogRm9yIHVzZXJtb2RlIGVtdWxhdGlvbiAqLworCisgICAgQ1BVX0NPTU1PTgorCisgICAgQ1BVTUlQU01WUENvbnRleHQgKm12cDsKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIENQVU1JUFNUTEJDb250ZXh0ICp0bGI7CisjZW5kaWYKKworICAgIGNvbnN0IG1pcHNfZGVmX3QgKmNwdV9tb2RlbDsKKyAgICB2b2lkICppcnFbOF07CisgICAgc3RydWN0IFFFTVVUaW1lciAqdGltZXI7IC8qIEludGVybmFsIHRpbWVyICovCit9OworCisjaW5jbHVkZSAiY3B1LXFvbS5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdGFyZ2V0X2xvbmcgZ3ByX3JlZ1szMl07CisgICAgdWludDMyX3QgcGM7CisgICAgdWludDMyX3QgYnJhbmNoX2FkZHI7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9FbnRyeUxvMDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX0VudHJ5TG8xOworICAgIHRhcmdldF91bG9uZyBDUDBfQmFkVkFkZHI7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9FbnRyeUhpOworICAgIHRhcmdldF91bG9uZyBDUDBfQ29udGV4dDsKKyAgICB0YXJnZXRfdWxvbmcgQ1AwX1hDb250ZXh0OworICAgIGludCBkb190bGJ3cjsKK30gQ1BVSW50ZXJwcmV0ZXJDb250ZXh0OworCitleHRlcm4gQ1BVSW50ZXJwcmV0ZXJDb250ZXh0IENQVTsKKworaW50IHRsYl9leGNlcHRpb25faW50ZXJwcmV0ZXIoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90ICpoYW5kbGVyLCB1aW50MzJfdCBzaXplKTsKK2ludCBub19tbXVfbWFwX2FkZHJlc3MgKENQVU1JUFNTdGF0ZSAqZW52LCBod2FkZHIgKnBoeXNpY2FsLCBpbnQgKnByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYWRkcmVzcywgaW50IHJ3LCBpbnQgYWNjZXNzX3R5cGUpOworaW50IGZpeGVkX21tdV9tYXBfYWRkcmVzcyAoQ1BVTUlQU1N0YXRlICplbnYsIGh3YWRkciAqcGh5c2ljYWwsIGludCAqcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncsIGludCBhY2Nlc3NfdHlwZSk7CitpbnQgcjRrX21hcF9hZGRyZXNzIChDUFVNSVBTU3RhdGUgKmVudiwgaHdhZGRyICpwaHlzaWNhbCwgaW50ICpwcm90LAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsIGludCBydywgaW50IGFjY2Vzc190eXBlKTsKK3ZvaWQgcjRrX2hlbHBlcl90bGJ3aShDUFVNSVBTU3RhdGUgKmVudik7Cit2b2lkIHI0a19oZWxwZXJfdGxid3IoQ1BVTUlQU1N0YXRlICplbnYpOwordm9pZCByNGtfaGVscGVyX3RsYnAoQ1BVTUlQU1N0YXRlICplbnYpOwordm9pZCByNGtfaGVscGVyX3RsYnIoQ1BVTUlQU1N0YXRlICplbnYpOwordm9pZCBtaXBzX2NwdV9saXN0IChGSUxFICpmLCBpbnQgKCpjcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pKTsKKwordm9pZCBjcHVfdW5hc3NpZ25lZF9hY2Nlc3MoQ1BVQXJjaFN0YXRlKiBlbnYsIGh3YWRkciBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3dyaXRlLCBpbnQgaXNfZXhlYywgaW50IHVudXNlZCwgaW50IHNpemUpOworCisjZGVmaW5lIGNwdV9pbml0IGNwdV9taXBzX2luaXQKKyNkZWZpbmUgY3B1X2V4ZWMgY3B1X21pcHNfZXhlYworI2RlZmluZSBjcHVfZ2VuX2NvZGUgY3B1X21pcHNfZ2VuX2NvZGUKKyNkZWZpbmUgY3B1X3NpZ25hbF9oYW5kbGVyIGNwdV9taXBzX3NpZ25hbF9oYW5kbGVyCisjZGVmaW5lIGNwdV9saXN0IG1pcHNfY3B1X2xpc3QKKworI2RlZmluZSBDUFVfU0FWRV9WRVJTSU9OIDMKKworLy8gTk9URShkaWdpdCk6IENhbWUgZnJvbSBjcHUtYWxsLmgsIHRvIGJlIHJlbW92ZWQgbGF0ZXIuCisjZGVmaW5lIENQVV9JTlRFUlJVUFRfVElNRVIgIDB4MDggLyogaW50ZXJuYWwgdGltZXIgZXhjZXB0aW9uIHBlbmRpbmcgKi8KKworLyogTU1VIG1vZGVzIGRlZmluaXRpb25zLiBXZSBjYXJlZnVsbHkgbWF0Y2ggdGhlIGluZGljZXMgd2l0aCBvdXIKKyAgIGhmbGFncyBsYXlvdXQuICovCisjZGVmaW5lIE1NVV9NT0RFMF9TVUZGSVggX2tlcm5lbAorI2RlZmluZSBNTVVfTU9ERTFfU1VGRklYIF9zdXBlcgorI2RlZmluZSBNTVVfTU9ERTJfU1VGRklYIF91c2VyCisjZGVmaW5lIE1NVV9VU0VSX0lEWCAyCitzdGF0aWMgaW5saW5lIGludCBjcHVfbW11X2luZGV4IChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0tTVTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfY3B1X3VzZXIgKENQVU1JUFNTdGF0ZSAqZW52KQoreworI2lmZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICByZXR1cm4gMTsKKyNlbHNlCisgICAgcmV0dXJuICgoZW52LT5DUDBfU3RhdHVzICYKKwkgICAgICgoMyA8PCBDUDBTdF9LU1UpIHwgKDEgPDwgQ1AwU3RfRVJMKSB8ICgxIDw8IENQMFN0X0VYTCkpKSA9PSAoMyA8PCBDUDBTdF9LU1UpKTsKKyNlbmRpZiAgLy8gQ09ORklHX1VTRVJfT05MWQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2Nsb25lX3JlZ3MoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBuZXdzcCkKK3sKKyAgICBpZiAobmV3c3ApCisgICAgICAgIGVudi0+YWN0aXZlX3RjLmdwclsyOV0gPSBuZXdzcDsKKyAgICBlbnYtPmFjdGl2ZV90Yy5ncHJbN10gPSAwOworICAgIGVudi0+YWN0aXZlX3RjLmdwclsyXSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9taXBzX2h3X2ludGVycnVwdHNfcGVuZGluZyhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHBlbmRpbmc7CisgICAgaW50MzJfdCBzdGF0dXM7CisgICAgaW50IHI7CisKKyAgICBpZiAoIShlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9JRSkpIHx8CisgICAgICAgIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9FWEwpKSB8fAorICAgICAgICAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfRVJMKSkgfHwKKyAgICAgICAgKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19ETSkpIHsKKyAgICAgICAgLyogSW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcGVuZGluZyA9IGVudi0+Q1AwX0NhdXNlICYgQ1AwQ2FfSVBfbWFzazsKKyAgICBzdGF0dXMgPSBlbnYtPkNQMF9TdGF0dXMgJiBDUDBDYV9JUF9tYXNrOworCisgICAgaWYgKGVudi0+Q1AwX0NvbmZpZzMgJiAoMSA8PCBDUDBDM19WRUlDKSkgeworICAgICAgICAvKiBBIE1JUFMgY29uZmlndXJlZCB3aXRoIGEgdmVjdG9yaXppbmcgZXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgICAgICAgICAgd2lsbCBmZWVkIGEgdmVjdG9yIGludG8gdGhlIENhdXNlIHBlbmRpbmcgbGluZXMuIFRoZSBjb3JlIHRyZWF0cworICAgICAgICAgICB0aGUgc3RhdHVzIGxpbmVzIGFzIGEgdmVjdG9yIGxldmVsLCBub3QgYXMgaW5kaXZpdWFsIG1hc2tzLiAgKi8KKyAgICAgICAgciA9IHBlbmRpbmcgPiBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQSBNSVBTIGNvbmZpZ3VyZWQgd2l0aCBjb21wYXRpYmlsaXR5IG9yIFZJbnQgKFZlY3RvcmVkIEludGVycnVwdHMpCisgICAgICAgICAgIHRyZWF0cyB0aGUgcGVuZGluZyBsaW5lcyBhcyBpbmRpdmlkdWFsIGludGVycnVwdCBsaW5lcywgdGhlIHN0YXR1cworICAgICAgICAgICBsaW5lcyBhcmUgaW5kaXZpZHVhbCBtYXNrcy4gICovCisgICAgICAgIHIgPSBwZW5kaW5nICYgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gcjsKK30KKworI2luY2x1ZGUgImV4ZWMvY3B1LWFsbC5oIgorI2luY2x1ZGUgImV4ZWMvZXhlYy1hbGwuaCIKKworLyogTWVtb3J5IGFjY2VzcyB0eXBlIDoKKyAqIG1heSBiZSBuZWVkZWQgZm9yIHByZWNpc2UgYWNjZXNzIHJpZ2h0cyBjb250cm9sIGFuZCBwcmVjaXNlIGV4Y2VwdGlvbnMuCisgKi8KK2VudW0geworICAgIC8qIDEgYml0IHRvIGRlZmluZSB1c2VyIGxldmVsIC8gc3VwZXJ2aXNvciBhY2Nlc3MgKi8KKyAgICBBQ0NFU1NfVVNFUiAgPSAweDAwLAorICAgIEFDQ0VTU19TVVBFUiA9IDB4MDEsCisgICAgLyogMSBiaXQgdG8gaW5kaWNhdGUgZGlyZWN0aW9uICovCisgICAgQUNDRVNTX1NUT1JFID0gMHgwMiwKKyAgICAvKiBUeXBlIG9mIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIHRoZSBhY2Nlc3MgKi8KKyAgICBBQ0NFU1NfQ09ERSAgPSAweDEwLCAvKiBDb2RlIGZldGNoIGFjY2VzcyAgICAgICAgICAgICAgICAqLworICAgIEFDQ0VTU19JTlQgICA9IDB4MjAsIC8qIEludGVnZXIgbG9hZC9zdG9yZSBhY2Nlc3MgICAgICAgICovCisgICAgQUNDRVNTX0ZMT0FUID0gMHgzMCwgLyogZmxvYXRpbmcgcG9pbnQgbG9hZC9zdG9yZSBhY2Nlc3MgKi8KK307CisKKy8qIEV4Y2VwdGlvbnMgKi8KK2VudW0geworICAgIEVYQ1BfTk9ORSAgICAgICAgICA9IC0xLAorICAgIEVYQ1BfUkVTRVQgICAgICAgICA9IDAsCisgICAgRVhDUF9TUkVTRVQsCisgICAgRVhDUF9EU1MsCisgICAgRVhDUF9ESU5ULAorICAgIEVYQ1BfRERCTCwKKyAgICBFWENQX0REQlMsCisgICAgRVhDUF9OTUksCisgICAgRVhDUF9NQ0hFQ0ssCisgICAgRVhDUF9FWFRfSU5URVJSVVBULCAvKiA4ICovCisgICAgRVhDUF9ERldBVENILAorICAgIEVYQ1BfRElCLAorICAgIEVYQ1BfSVdBVENILAorICAgIEVYQ1BfQWRFTCwKKyAgICBFWENQX0FkRVMsCisgICAgRVhDUF9UTEJGLAorICAgIEVYQ1BfSUJFLAorICAgIEVYQ1BfREJwLCAvKiAxNiAqLworICAgIEVYQ1BfU1lTQ0FMTCwKKyAgICBFWENQX0JSRUFLLAorICAgIEVYQ1BfQ3BVLAorICAgIEVYQ1BfUkksCisgICAgRVhDUF9PVkVSRkxPVywKKyAgICBFWENQX1RSQVAsCisgICAgRVhDUF9GUEUsCisgICAgRVhDUF9EV0FUQ0gsIC8qIDI0ICovCisgICAgRVhDUF9MVExCTCwKKyAgICBFWENQX1RMQkwsCisgICAgRVhDUF9UTEJTLAorICAgIEVYQ1BfREJFLAorICAgIEVYQ1BfVEhSRUFELAorICAgIEVYQ1BfTURNWCwKKyAgICBFWENQX0MyRSwKKyAgICBFWENQX0NBQ0hFLCAvKiAzMiAqLworICAgIEVYQ1BfRFNQRElTLAorCisgICAgRVhDUF9MQVNUID0gRVhDUF9EU1BESVMsCit9OworLyogRHVtbXkgZXhjZXB0aW9uIGZvciBjb25kaXRpb25hbCBzdG9yZXMuICAqLworI2RlZmluZSBFWENQX1NDIDB4MTAwCisKKy8qCisgKiBUaGlzIGlzIGFuIGludGVycm5hbGx5IGdlbmVyYXRlZCBXQUtFIHJlcXVlc3QgbGluZS4KKyAqIEl0IGlzIGRyaXZlbiBieSB0aGUgQ1BVIGl0c2VsZi4gUmFpc2VkIHdoZW4gdGhlIE1UCisgKiBibG9jayB3YW50cyB0byB3YWtlIGEgVlBFIGZyb20gYW4gaW5hY3RpdmUgc3RhdGUgYW5kCisgKiBjbGVhcmVkIHdoZW4gVlBFIGdvZXMgZnJvbSBhY3RpdmUgdG8gaW5hY3RpdmUuCisgKi8KKyNkZWZpbmUgQ1BVX0lOVEVSUlVQVF9XQUtFIENQVV9JTlRFUlJVUFRfVEdUX0lOVF8wCisKK2ludCBjcHVfbWlwc19leGVjKENQVU1JUFNTdGF0ZSAqcyk7CitDUFVNSVBTU3RhdGUgKmNwdV9taXBzX2luaXQoY29uc3QgY2hhciAqY3B1X21vZGVsKTsKKy8vfiB1aW50MzJfdCBjcHVfbWlwc19nZXRfY2xvY2sgKHZvaWQpOworaW50IGNwdV9taXBzX3NpZ25hbF9oYW5kbGVyKGludCBob3N0X3NpZ251bSwgdm9pZCAqcGluZm8sIHZvaWQgKnB1Yyk7CisKKy8qIG1pcHNfdGltZXIuYyAqLwordWludDMyX3QgY3B1X21pcHNfZ2V0X3JhbmRvbSAoQ1BVTUlQU1N0YXRlICplbnYpOwordWludDMyX3QgY3B1X21pcHNfZ2V0X2NvdW50IChDUFVNSVBTU3RhdGUgKmVudik7Cit2b2lkIGNwdV9taXBzX3N0b3JlX2NvdW50IChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgdmFsdWUpOwordm9pZCBjcHVfbWlwc19zdG9yZV9jb21wYXJlIChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgdmFsdWUpOwordm9pZCBjcHVfbWlwc19zdGFydF9jb3VudChDUFVNSVBTU3RhdGUgKmVudik7Cit2b2lkIGNwdV9taXBzX3N0b3BfY291bnQoQ1BVTUlQU1N0YXRlICplbnYpOworCisvKiBtaXBzX2ludC5jICovCit2b2lkIGNwdV9taXBzX3VwZGF0ZV9pcnEgKENQVU1JUFNTdGF0ZSAqZW52KTsKKworLyogaGVscGVyLmMgKi8KK2ludCBjcHVfbWlwc19oYW5kbGVfbW11X2ZhdWx0IChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsIGludCBydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCk7CisjZGVmaW5lIGNwdV9oYW5kbGVfbW11X2ZhdWx0IGNwdV9taXBzX2hhbmRsZV9tbXVfZmF1bHQKK3ZvaWQgZG9faW50ZXJydXB0IChDUFVNSVBTU3RhdGUgKmVudik7Cit2b2lkIHI0a19pbnZhbGlkYXRlX3RsYiAoQ1BVTUlQU1N0YXRlICplbnYsIGludCBpZHgsIGludCB1c2VfZXh0cmEpOworaHdhZGRyIGNwdV9taXBzX3RyYW5zbGF0ZV9hZGRyZXNzIChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcncpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X2dldF90Yl9jcHVfc3RhdGUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyAqcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nICpjc19iYXNlLCBpbnQgKmZsYWdzKQoreworICAgICpwYyA9IGVudi0+YWN0aXZlX3RjLlBDOworICAgICpjc19iYXNlID0gMDsKKyAgICAqZmxhZ3MgPSBlbnYtPmhmbGFncyAmIChNSVBTX0hGTEFHX1RNQVNLIHwgTUlQU19IRkxBR19CTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcHVfc2V0X3RscyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIG5ld3RscykKK3sKKyAgICBlbnYtPnRsc192YWx1ZSA9IG5ld3RsczsKK30KKworc3RhdGljIGlubGluZSBib29sIGNwdV9oYXNfd29yayhDUFVTdGF0ZSAqY3B1KQoreworICAgIGludCBoYXNfd29yayA9IDA7CisKKyAgICAvKiBJdCBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgaWYgbm9uLWVuYWJsZWQgaW50ZXJydXB0cworICAgICAgIHdha2UtdXAgdGhlIENQVSwgaG93ZXZlciBtb3N0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgb25seQorICAgICAgIGNoZWNrIGZvciBpbnRlcnJ1cHRzIHRoYXQgY2FuIGJlIHRha2VuLiAqLworICAgIGlmICgoY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCAmIENQVV9JTlRFUlJVUFRfSEFSRCkgJiYKKyAgICAgICAgY3B1X21pcHNfaHdfaW50ZXJydXB0c19wZW5kaW5nKGNwdS0+ZW52X3B0cikpIHsKKyAgICAgICAgaGFzX3dvcmsgPSAxOworICAgIH0KKworICAgIGlmIChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYgQ1BVX0lOVEVSUlVQVF9USU1FUikgeworICAgICAgICBoYXNfd29yayA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIGhhc193b3JrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3BjX2Zyb21fdGIoQ1BVTUlQU1N0YXRlICplbnYsIFRyYW5zbGF0aW9uQmxvY2sgKnRiKQoreworICAgIGVudi0+YWN0aXZlX3RjLlBDID0gdGItPnBjOworICAgIGVudi0+aGZsYWdzICY9IH5NSVBTX0hGTEFHX0JNQVNLOworICAgIGVudi0+aGZsYWdzIHw9IHRiLT5mbGFncyAmIE1JUFNfSEZMQUdfQk1BU0s7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoX19NSVBTX0NQVV9IX18pICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2RzcF9oZWxwZXIuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvZHNwX2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjM2NmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2RzcF9oZWxwZXIuYwpAQCAtMCwwICsxLDM4MDkgQEAKKy8qCisgKiBNSVBTIEFTRSBEU1AgSW5zdHJ1Y3Rpb24gZW11bGF0aW9uIGhlbHBlcnMgZm9yIFFFTVUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyICBKaWEgTGl1IDxwcm9samNAZ21haWwuY29tPgorICogICAgICAgICAgICAgICAgICAgICBEb25neHVlIFpoYW5nIDxlbHRhLmVyYUBnbWFpbC5jb20+CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiaGVscGVyLmgiCisKKy8qIEFzIHRoZSBieXRlIG9yZGVyaW5nIGRvZXNuJ3QgbWF0dGVyLCBpLmUuIGFsbCBjb2x1bW5zIGFyZSB0cmVhdGVkCisgICBpZGVudGljYWxseSwgdGhlc2UgdW5pb25zIGNhbiBiZSB1c2VkIGRpcmVjdGx5LiAgKi8KK3R5cGVkZWYgdW5pb24geworICAgIHVpbnQ4X3QgIHViWzRdOworICAgIGludDhfdCAgIHNiWzRdOworICAgIHVpbnQxNl90IHVoWzJdOworICAgIGludDE2X3QgIHNoWzJdOworICAgIHVpbnQzMl90IHV3WzFdOworICAgIGludDMyX3QgIHN3WzFdOworfSBEU1AzMlZhbHVlOworCit0eXBlZGVmIHVuaW9uIHsKKyAgICB1aW50OF90ICB1Yls4XTsKKyAgICBpbnQ4X3QgICBzYls4XTsKKyAgICB1aW50MTZfdCB1aFs0XTsKKyAgICBpbnQxNl90ICBzaFs0XTsKKyAgICB1aW50MzJfdCB1d1syXTsKKyAgICBpbnQzMl90ICBzd1syXTsKKyAgICB1aW50NjRfdCB1bFsxXTsKKyAgICBpbnQ2NF90ICBzbFsxXTsKK30gRFNQNjRWYWx1ZTsKKworLyoqKiBNSVBTIERTUCBpbnRlcm5hbCBmdW5jdGlvbnMgYmVnaW4gKioqLworI2RlZmluZSBNSVBTRFNQX0FCUyh4KSAoKCh4KSA+PSAwKSA/IHggOiAteCkKKyNkZWZpbmUgTUlQU0RTUF9PVkVSRkxPV19BREQoYSwgYiwgYywgZCkgKH4oYSBeIGIpICYgKGEgXiBjKSAmIGQpCisjZGVmaW5lIE1JUFNEU1BfT1ZFUkZMT1dfU1VCKGEsIGIsIGMsIGQpICgoYSBeIGIpICYgKGEgXiBjKSAmIGQpCisKKy8qKgorICogZGVwb3NpdDY0OgorICogQHZhbHVlOiBpbml0aWFsIHZhbHVlIHRvIGluc2VydCBiaXQgZmllbGQgaW50bworICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqIEBmaWVsZHZhbDogdGhlIHZhbHVlIHRvIGluc2VydCBpbnRvIHRoZSBiaXQgZmllbGQKKyAqCisgKiBEZXBvc2l0IEBmaWVsZHZhbCBpbnRvIHRoZSA2NCBiaXQgQHZhbHVlIGF0IHRoZSBiaXQgZmllbGQgc3BlY2lmaWVkCisgKiBieSB0aGUgQHN0YXJ0IGFuZCBAbGVuZ3RoIHBhcmFtZXRlcnMsIGFuZCByZXR1cm4gdGhlIG1vZGlmaWVkCisgKiBAdmFsdWUuIEJpdHMgb2YgQHZhbHVlIG91dHNpZGUgdGhlIGJpdCBmaWVsZCBhcmUgbm90IG1vZGlmaWVkLgorICogQml0cyBvZiBAZmllbGR2YWwgYWJvdmUgdGhlIGxlYXN0IHNpZ25pZmljYW50IEBsZW5ndGggYml0cyBhcmUKKyAqIGlnbm9yZWQuIFRoZSBiaXQgZmllbGQgbXVzdCBsaWUgZW50aXJlbHkgd2l0aGluIHRoZSA2NCBiaXQgd29yZC4KKyAqIEl0IGlzIHZhbGlkIHRvIHJlcXVlc3QgdGhhdCBhbGwgNjQgYml0cyBhcmUgbW9kaWZpZWQgKGllIEBsZW5ndGgKKyAqIDY0IGFuZCBAc3RhcnQgMCkuCisgKgorICogUmV0dXJuczogdGhlIG1vZGlmaWVkIEB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBkZXBvc2l0NjQodWludDY0X3QgdmFsdWUsIGludCBzdGFydCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZpZWxkdmFsKQoreworICAgIHVpbnQ2NF90IG1hc2s7CisgICAgYXNzZXJ0KHN0YXJ0ID49IDAgJiYgbGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gNjQgLSBzdGFydCk7CisgICAgbWFzayA9ICh+MFVMTCA+PiAoNjQgLSBsZW5ndGgpKSA8PCBzdGFydDsKKyAgICByZXR1cm4gKHZhbHVlICYgfm1hc2spIHwgKChmaWVsZHZhbCA8PCBzdGFydCkgJiBtYXNrKTsKK30KKworLyoqCisgKiBleHRyYWN0NjQ6CisgKiBAdmFsdWU6IHRoZSB2YWx1ZSB0byBleHRyYWN0IHRoZSBiaXQgZmllbGQgZnJvbQorICogQHN0YXJ0OiB0aGUgbG93ZXN0IGJpdCBpbiB0aGUgYml0IGZpZWxkIChudW1iZXJlZCBmcm9tIDApCisgKiBAbGVuZ3RoOiB0aGUgbGVuZ3RoIG9mIHRoZSBiaXQgZmllbGQKKyAqCisgKiBFeHRyYWN0IGZyb20gdGhlIDY0IGJpdCBpbnB1dCBAdmFsdWUgdGhlIGJpdCBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlCisgKiBAc3RhcnQgYW5kIEBsZW5ndGggcGFyYW1ldGVycywgYW5kIHJldHVybiBpdC4gVGhlIGJpdCBmaWVsZCBtdXN0CisgKiBsaWUgZW50aXJlbHkgd2l0aGluIHRoZSA2NCBiaXQgd29yZC4gSXQgaXMgdmFsaWQgdG8gcmVxdWVzdCB0aGF0CisgKiBhbGwgNjQgYml0cyBhcmUgcmV0dXJuZWQgKGllIEBsZW5ndGggNjQgYW5kIEBzdGFydCAwKS4KKyAqCisgKiBSZXR1cm5zOiB0aGUgdmFsdWUgb2YgdGhlIGJpdCBmaWVsZCBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZXh0cmFjdDY0KHVpbnQ2NF90IHZhbHVlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCit7CisgICAgYXNzZXJ0KHN0YXJ0ID49IDAgJiYgbGVuZ3RoID4gMCAmJiBsZW5ndGggPD0gNjQgLSBzdGFydCk7CisgICAgcmV0dXJuICh2YWx1ZSA+PiBzdGFydCkgJiAofjBVTEwgPj4gKDY0IC0gbGVuZ3RoKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKHVpbnQzMl90IGZsYWcsIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2wgfD0gKHRhcmdldF91bG9uZylmbGFnIDw8IHBvc2l0aW9uOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0RTUENvbnRyb2xfY2FycnlmbGFnKGJvb2wgZmxhZywgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgZW52LT5hY3RpdmVfdGMuRFNQQ29udHJvbCAmPSB+KDEgPDwgMTMpOworICAgIGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2wgfD0gZmxhZyA8PCAxMzsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBnZXRfRFNQQ29udHJvbF9jYXJyeWZsYWcoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIChlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sID4+IDEzKSAmIDB4MDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfRFNQQ29udHJvbF8yNCh1aW50MzJfdCBmbGFnLCBpbnQgbGVuLCBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgdWludDMyX3QgZmlsdGVyOworCisgIGZpbHRlciA9ICgoMHgwMSA8PCBsZW4pIC0gMSkgPDwgMjQ7CisgIGZpbHRlciA9IH5maWx0ZXI7CisKKyAgZW52LT5hY3RpdmVfdGMuRFNQQ29udHJvbCAmPSBmaWx0ZXI7CisgIGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2wgfD0gKHRhcmdldF91bG9uZylmbGFnIDw8IDI0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9EU1BDb250cm9sXzI0KGludCBsZW4sIENQVU1JUFNTdGF0ZSAqZW52KQoreworICB1aW50MzJfdCBmaWx0ZXI7CisKKyAgZmlsdGVyID0gKDB4MDEgPDwgbGVuKSAtIDE7CisKKyAgcmV0dXJuIChlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sID4+IDI0KSAmIGZpbHRlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9EU1BDb250cm9sX3Bvcyh1aW50MzJfdCBwb3MsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHRhcmdldF91bG9uZyBkc3BjOworCisgICAgZHNwYyA9IGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2w7CisjaWZuZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBkc3BjID0gZHNwYyAmIDB4RkZGRkZGQzA7CisgICAgZHNwYyB8PSAocG9zICYgMHgzRik7CisjZWxzZQorICAgIGRzcGMgPSBkc3BjICYgMHhGRkZGRkY4MDsKKyAgICBkc3BjIHw9IChwb3MgJiAweDdGKTsKKyNlbmRpZgorICAgIGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2wgPSBkc3BjOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGdldF9EU1BDb250cm9sX3BvcyhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB0YXJnZXRfdWxvbmcgZHNwYzsKKyAgICB1aW50MzJfdCBwb3M7CisKKyAgICBkc3BjID0gZW52LT5hY3RpdmVfdGMuRFNQQ29udHJvbDsKKworI2lmbmRlZiBUQVJHRVRfTUlQUzY0CisgICAgcG9zID0gZHNwYyAmIDB4M0Y7CisjZWxzZQorICAgIHBvcyA9IGRzcGMgJiAweDdGOworI2VuZGlmCisKKyAgICByZXR1cm4gcG9zOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0RTUENvbnRyb2xfZWZpKHVpbnQzMl90IGZsYWcsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2wgJj0gMHhGRkZGQkZGRjsKKyAgICBlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sIHw9ICh0YXJnZXRfdWxvbmcpZmxhZyA8PCAxNDsKK30KKworI2RlZmluZSBET19NSVBTX1NBVF9BQlMoc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIGludCMjc2l6ZSMjX3QgbWlwc2RzcF9zYXRfYWJzIyNzaXplKGludCMjc2l6ZSMjX3QgYSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChhID09IElOVCMjc2l6ZSMjX01JTikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIElOVCMjc2l6ZSMjX01BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBNSVBTRFNQX0FCUyhhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorRE9fTUlQU19TQVRfQUJTKDgpCitET19NSVBTX1NBVF9BQlMoMTYpCitET19NSVBTX1NBVF9BQlMoMzIpCisjdW5kZWYgRE9fTUlQU19TQVRfQUJTCisKKy8qIGdldCBzdW0gdmFsdWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBtaXBzZHNwX2FkZF9pMTYoaW50MTZfdCBhLCBpbnQxNl90IGIsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDE2X3QgdGVtcEk7CisKKyAgICB0ZW1wSSA9IGEgKyBiOworCisgICAgaWYgKE1JUFNEU1BfT1ZFUkZMT1dfQUREKGEsIGIsIHRlbXBJLCAweDgwMDApKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXBJOworfQorCitzdGF0aWMgaW5saW5lIGludDE2X3QgbWlwc2RzcF9zYXRfYWRkX2kxNihpbnQxNl90IGEsIGludDE2X3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDE2X3QgdGVtcFM7CisKKyAgICB0ZW1wUyA9IGEgKyBiOworCisgICAgaWYgKE1JUFNEU1BfT1ZFUkZMT1dfQUREKGEsIGIsIHRlbXBTLCAweDgwMDApKSB7CisgICAgICAgIGlmIChhID4gMCkgeworICAgICAgICAgICAgdGVtcFMgPSAweDdGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wUyA9IDB4ODAwMDsKKyAgICAgICAgfQorICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIwLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wUzsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3Bfc2F0X2FkZF9pMzIoaW50MzJfdCBhLCBpbnQzMl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXBJOworCisgICAgdGVtcEkgPSBhICsgYjsKKworICAgIGlmIChNSVBTRFNQX09WRVJGTE9XX0FERChhLCBiLCB0ZW1wSSwgMHg4MDAwMDAwMCkpIHsKKyAgICAgICAgaWYgKGEgPiAwKSB7CisgICAgICAgICAgICB0ZW1wSSA9IDB4N0ZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wSSA9IDB4ODAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcEk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBtaXBzZHNwX2FkZF91OCh1aW50OF90IGEsIHVpbnQ4X3QgYiwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDE2X3QgdGVtcDsKKworICAgIHRlbXAgPSAodWludDE2X3QpYSArICh1aW50MTZfdCliOworCisgICAgaWYgKHRlbXAgJiAweDAxMDApIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcCAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9hZGRfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MzJfdClhICsgKHVpbnQzMl90KWI7CisKKyAgICBpZiAodGVtcCAmIDB4MDAwMTAwMDApIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcCAmIDB4RkZGRjsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IG1pcHNkc3Bfc2F0X2FkZF91OCh1aW50OF90IGEsIHVpbnQ4X3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDhfdCAgcmVzdWx0OworICAgIHVpbnQxNl90IHRlbXA7CisKKyAgICB0ZW1wID0gKHVpbnQxNl90KWEgKyAodWludDE2X3QpYjsKKyAgICByZXN1bHQgPSB0ZW1wICYgMHhGRjsKKworICAgIGlmICgweDAxMDAgJiB0ZW1wKSB7CisgICAgICAgIHJlc3VsdCA9IDB4RkY7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBtaXBzZHNwX3NhdF9hZGRfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDE2X3QgcmVzdWx0OworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICB0ZW1wID0gKHVpbnQzMl90KWEgKyAodWludDMyX3QpYjsKKyAgICByZXN1bHQgPSB0ZW1wICYgMHhGRkZGOworCisgICAgaWYgKDB4MDAwMTAwMDAgJiB0ZW1wKSB7CisgICAgICAgIHJlc3VsdCA9IDB4RkZGRjsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9zYXQzMl9hY2NfcTMxKGludDMyX3QgYWNjLCBpbnQzMl90IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDY0X3QgdGVtcDsKKyAgICBpbnQzMl90IHJlc3VsdDsKKyAgICBpbnQ2NF90IHRlbXBfc3VtOworCisjaWZuZGVmIFRBUkdFVF9NSVBTNjQKKyAgICB0ZW1wID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY2NdIDw8IDMyKSB8CisgICAgICAgICAgICh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY2NdOworI2Vsc2UKKyAgICB0ZW1wID0gKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkxPW2FjY107CisjZW5kaWYKKworICAgIHRlbXBfc3VtID0gKGludDY0X3QpYSArIHRlbXA7CisKKyAgICByZXN1bHQgPSB0ZW1wX3N1bSAmIDB4RkZGRkZGRkY7CisKKyAgICAvL2lmIHRoZXJlIHdhcyBvdmVyZmxvdyBpbnRvIHRvcCAzMiBiaXRzIG9yIHRoZSB0b3AgYml0IG9mIHRoZSBsb3dlciAzMiBiaXRzLCBzYXR1cmF0ZQorICAgIGlmICgoKHRlbXBfc3VtICYgMHhGRkZGRkZGRjAwMDAwMDAwbGwpICE9ICh0ZW1wICYgMHhGRkZGRkZGRjAwMDAwMDAwbGwpKQorICAgICAgICB8fCAoKHRlbXBfc3VtICYgMHgwMDAwMDAwMDgwMDAwMDAwbGwpICYmICEodGVtcCAmIDB4MDAwMDAwMDA4MDAwMDAwMGxsKSkpCisgICAgeworICAgICAgICAgaWYgKHRlbXBfc3VtICYgMHg4MDAwMDAwMDAwMDAwMDAwbGwpIHsKKyAgICAgICAgICAgICByZXN1bHQgPSAweDgwMDAwMDAwOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICByZXN1bHQgPSAweDdGRkZGRkZGOworICAgICAgICAgfQorICAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAxNiArIGFjYywgZW52KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogYVswXSBpcyBMTywgYVsxXSBpcyBISS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXBzZHNwX3NhdDY0X2FjY19hZGRfcTYzKGludDY0X3QgKnJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICphLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgYm9vbCB0ZW1wNjQ7CisKKyAgICByZXRbMF0gPSBlbnYtPmFjdGl2ZV90Yy5MT1thY10gKyBhWzBdOworICAgIHJldFsxXSA9IGVudi0+YWN0aXZlX3RjLkhJW2FjXSArIGFbMV07CisKKyAgICBpZiAoKCh1aW50NjRfdClyZXRbMF0gPCAodWludDY0X3QpZW52LT5hY3RpdmVfdGMuTE9bYWNdKSAmJgorICAgICAgICAoKHVpbnQ2NF90KXJldFswXSA8ICh1aW50NjRfdClhWzBdKSkgeworICAgICAgICByZXRbMV0gKz0gMTsKKyAgICB9CisgICAgdGVtcDY0ID0gcmV0WzFdICYgMTsKKyAgICBpZiAodGVtcDY0ICE9ICgocmV0WzBdID4+IDYzKSAmIDB4MDEpKSB7CisgICAgICAgIGlmICh0ZW1wNjQpIHsKKyAgICAgICAgICAgIHJldFswXSA9ICgweDAxdWxsIDw8IDYzKTsKKyAgICAgICAgICAgIHJldFsxXSA9IH4wdWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0WzBdID0gKDB4MDF1bGwgPDwgNjMpIC0gMTsKKyAgICAgICAgICAgIHJldFsxXSA9IDB4MDA7CisgICAgICAgIH0KKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAxNiArIGFjLCBlbnYpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG1pcHNkc3Bfc2F0NjRfYWNjX3N1Yl9xNjMoaW50NjRfdCAqcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBib29sIHRlbXA2NDsKKworICAgIHJldFswXSA9IGVudi0+YWN0aXZlX3RjLkxPW2FjXSAtIGFbMF07CisgICAgcmV0WzFdID0gZW52LT5hY3RpdmVfdGMuSElbYWNdIC0gYVsxXTsKKworICAgIGlmICgodWludDY0X3QpcmV0WzBdID4gKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkxPW2FjXSkgeworICAgICAgICByZXRbMV0gLT0gMTsKKyAgICB9CisgICAgdGVtcDY0ID0gcmV0WzFdICYgMTsKKyAgICBpZiAodGVtcDY0ICE9ICgocmV0WzBdID4+IDYzKSAmIDB4MDEpKSB7CisgICAgICAgIGlmICh0ZW1wNjQpIHsKKyAgICAgICAgICAgIHJldFswXSA9ICgweDAxdWxsIDw8IDYzKTsKKyAgICAgICAgICAgIHJldFsxXSA9IH4wdWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0WzBdID0gKDB4MDF1bGwgPDwgNjMpIC0gMTsKKyAgICAgICAgICAgIHJldFsxXSA9IDB4MDA7CisgICAgICAgIH0KKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAxNiArIGFjLCBlbnYpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3BfbXVsX2kxNl9pMTYoaW50MTZfdCBhLCBpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICB0ZW1wID0gKGludDMyX3QpYSAqIChpbnQzMl90KWI7CisKKyAgICBpZiAoKHRlbXAgPiAoaW50KTB4N0ZGRikgfHwgKHRlbXAgPCAoaW50KTB4RkZGRjgwMDApKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjEsIGVudik7CisgICAgfQorICAgIHRlbXAgJj0gMHgwMDAwRkZGRjsKKworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9tdWxfdTE2X3UxNihpbnQzMl90IGEsIGludDMyX3QgYikKK3sKKyAgICByZXR1cm4gYSAqIGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX211bF9pMzJfaTMyKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworICAgIHJldHVybiBhICogYjsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3Bfc2F0MTZfbXVsX2kxNl9pMTYoaW50MTZfdCBhLCBpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICB0ZW1wID0gKGludDMyX3QpYSAqIChpbnQzMl90KWI7CisKKyAgICBpZiAodGVtcCA+IChpbnQpMHg3RkZGKSB7CisgICAgICAgIHRlbXAgPSAweDAwMDA3RkZGOworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIxLCBlbnYpOworICAgIH0gZWxzZSBpZiAodGVtcCA8IChpbnQpMHhmZmZmODAwMCkgeworICAgICAgICB0ZW1wID0gMHhGRkZGODAwMDsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMSwgZW52KTsKKyAgICB9CisgICAgdGVtcCAmPSAweDAwMDBGRkZGOworCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX211bF9xMTVfcTE1X292ZXJmbG93ZmxhZzIxKHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICBpZiAoKGEgPT0gMHg4MDAwKSAmJiAoYiA9PSAweDgwMDApKSB7CisgICAgICAgIHRlbXAgPSAweDdGRkZGRkZGOworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIxLCBlbnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXAgPSAoKGludDE2X3QpYSAqIChpbnQxNl90KWIpIDw8IDE7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKKy8qIHJpZ2h0IHNoaWZ0ICovCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9yc2hpZnRfdTgodWludDhfdCBhLCB0YXJnZXRfdWxvbmcgbW92KQoreworICAgIHJldHVybiBhID4+IG1vdjsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBtaXBzZHNwX3JzaGlmdF91MTYodWludDE2X3QgYSwgdGFyZ2V0X3Vsb25nIG1vdikKK3sKKyAgICByZXR1cm4gYSA+PiBtb3Y7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50OF90IG1pcHNkc3BfcmFzaGlmdDgoaW50OF90IGEsIHRhcmdldF91bG9uZyBtb3YpCit7CisgICAgcmV0dXJuIGEgPj4gbW92OworfQorCitzdGF0aWMgaW5saW5lIGludDE2X3QgbWlwc2RzcF9yYXNoaWZ0MTYoaW50MTZfdCBhLCB0YXJnZXRfdWxvbmcgbW92KQoreworICAgIHJldHVybiBhID4+IG1vdjsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3BfcmFzaGlmdDMyKGludDMyX3QgYSwgdGFyZ2V0X3Vsb25nIG1vdikKK3sKKyAgICByZXR1cm4gYSA+PiBtb3Y7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBtaXBzZHNwX3JzaGlmdDFfYWRkX3ExNihpbnQxNl90IGEsIGludDE2X3QgYikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICB0ZW1wID0gKGludDMyX3QpYSArIChpbnQzMl90KWI7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweEZGRkY7Cit9CisKKy8qIHJvdW5kIHJpZ2h0IHNoaWZ0ICovCitzdGF0aWMgaW5saW5lIGludDE2X3QgbWlwc2RzcF9ycnNoaWZ0MV9hZGRfcTE2KGludDE2X3QgYSwgaW50MTZfdCBiKQoreworICAgIGludDMyX3QgdGVtcDsKKworICAgIHRlbXAgPSAoaW50MzJfdClhICsgKGludDMyX3QpYjsKKyAgICB0ZW1wICs9IDE7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweEZGRkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX3JzaGlmdDFfYWRkX3EzMihpbnQzMl90IGEsIGludDMyX3QgYikKK3sKKyAgICBpbnQ2NF90IHRlbXA7CisKKyAgICB0ZW1wID0gKGludDY0X3QpYSArIChpbnQ2NF90KWI7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweEZGRkZGRkZGOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9ycnNoaWZ0MV9hZGRfcTMyKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworICAgIGludDY0X3QgdGVtcDsKKworICAgIHRlbXAgPSAoaW50NjRfdClhICsgKGludDY0X3QpYjsKKyAgICB0ZW1wICs9IDE7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweEZGRkZGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9yc2hpZnQxX2FkZF91OCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50MTZfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MTZfdClhICsgKHVpbnQxNl90KWI7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweDAwRkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBtaXBzZHNwX3Jyc2hpZnQxX2FkZF91OCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50MTZfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MTZfdClhICsgKHVpbnQxNl90KWIgKyAxOworCisgICAgcmV0dXJuICh0ZW1wID4+IDEpICYgMHgwMEZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9yc2hpZnQxX3N1Yl91OCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50MTZfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MTZfdClhIC0gKHVpbnQxNl90KWI7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweDAwRkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBtaXBzZHNwX3Jyc2hpZnQxX3N1Yl91OCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKyAgICB1aW50MTZfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MTZfdClhIC0gKHVpbnQxNl90KWIgKyAxOworCisgICAgcmV0dXJuICh0ZW1wID4+IDEpICYgMHgwMEZGOworfQorCisvKiAgMTI4IGJpdHMgbG9uZy4gcFswXSBpcyBMTywgcFsxXSBpcyBISS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXBzZHNwX3JuZHJhc2hpZnRfc2hvcnRfYWNjKGludDY0X3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDY0X3QgYWNjOworCisgICAgYWNjID0gKChpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkhJW2FjXSA8PCAzMikgfAorICAgICAgICAgICgoaW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiAweEZGRkZGRkZGKTsKKyAgICBwWzBdID0gKHNoaWZ0ID09IDApID8gKGFjYyA8PCAxKSA6IChhY2MgPj4gKHNoaWZ0IC0gMSkpOworICAgIHBbMV0gPSAoYWNjID4+IDYzKSAmIDB4MDE7Cit9CisKKy8qIDEyOCBiaXRzIGxvbmcuIHBbMF0gaXMgTE8sIHBbMV0gaXMgSEkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtaXBzZHNwX3Jhc2hpZnRfYWNjKHVpbnQ2NF90ICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXBCLCB0ZW1wQTsKKworICAgIHRlbXBCID0gZW52LT5hY3RpdmVfdGMuSElbYWNdOworICAgIHRlbXBBID0gZW52LT5hY3RpdmVfdGMuTE9bYWNdOworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDFGOworCisgICAgaWYgKHNoaWZ0ID09IDApIHsKKyAgICAgICAgcFsxXSA9IHRlbXBCOworICAgICAgICBwWzBdID0gdGVtcEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFswXSA9ICh0ZW1wQiA8PCAoNjQgLSBzaGlmdCkpIHwgKHRlbXBBID4+IHNoaWZ0KTsKKyAgICAgICAgcFsxXSA9IChpbnQ2NF90KXRlbXBCID4+IHNoaWZ0OworICAgIH0KK30KKworLyogMTI4IGJpdHMgbG9uZy4gcFswXSBpcyBMTywgcFsxXSBpcyBISSAsIHBbMl0gaXMgc2lnbiBvZiBISS4qLworc3RhdGljIGlubGluZSB2b2lkIG1pcHNkc3Bfcm5kcmFzaGlmdF9hY2ModWludDY0X3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50NjRfdCB0ZW1wQiwgdGVtcEE7CisKKyAgICB0ZW1wQiA9IGVudi0+YWN0aXZlX3RjLkhJW2FjXTsKKyAgICB0ZW1wQSA9IGVudi0+YWN0aXZlX3RjLkxPW2FjXTsKKyAgICBzaGlmdCA9IHNoaWZ0ICYgMHgzRjsKKworICAgIGlmIChzaGlmdCA9PSAwKSB7CisgICAgICAgIHBbMl0gPSB0ZW1wQiA+PiA2MzsKKyAgICAgICAgcFsxXSA9ICh0ZW1wQiA8PCAxKSB8ICh0ZW1wQSA+PiA2Myk7CisgICAgICAgIHBbMF0gPSB0ZW1wQSA8PCAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHBbMF0gPSAodGVtcEIgPDwgKDY1IC0gc2hpZnQpKSB8ICh0ZW1wQSA+PiAoc2hpZnQgLSAxKSk7CisgICAgICAgIHBbMV0gPSAoaW50NjRfdCl0ZW1wQiA+PiAoc2hpZnQgLSAxKTsKKyAgICAgICAgaWYgKHRlbXBCID49IDApIHsKKyAgICAgICAgICAgIHBbMl0gPSAweDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwWzJdID0gfjB1bGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX211bF9xMTVfcTE1KGludDMyX3QgYWMsIHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICBpZiAoKGEgPT0gMHg4MDAwKSAmJiAoYiA9PSAweDgwMDApKSB7CisgICAgICAgIHRlbXAgPSAweDdGRkZGRkZGOworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDE2ICsgYWMsIGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgdGVtcCA9ICgoaW50MTZfdClhICogKGludDE2X3QpYikgPDwgMTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IG1pcHNkc3BfbXVsX3EzMV9xMzEoaW50MzJfdCBhYywgdWludDMyX3QgYSwgdWludDMyX3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXA7CisKKyAgICBpZiAoKGEgPT0gMHg4MDAwMDAwMCkgJiYgKGIgPT0gMHg4MDAwMDAwMCkpIHsKKyAgICAgICAgdGVtcCA9ICgweDAxdWxsIDw8IDYzKSAtIDE7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMTYgKyBhYywgZW52KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wID0gKChpbnQ2NF90KShpbnQzMl90KWEgKiAoaW50MzJfdCliKSA8PCAxOworICAgIH0KKworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IG1pcHNkc3BfbXVsX3U4X3U4KHVpbnQ4X3QgYSwgdWludDhfdCBiKQoreworICAgIHJldHVybiAodWludDE2X3QpYSAqICh1aW50MTZfdCliOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IG1pcHNkc3BfbXVsX3U4X3UxNih1aW50OF90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCB0ZW1wSTsKKworICAgIHRlbXBJID0gKHVpbnQzMl90KWEgKiAodWludDMyX3QpYjsKKyAgICBpZiAodGVtcEkgPiAweDAwMDBGRkZGKSB7CisgICAgICAgIHRlbXBJID0gMHgwMDAwRkZGRjsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMSwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcEkgJiAweDAwMDBGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IG1pcHNkc3BfbXVsX3UzMl91MzIodWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICByZXR1cm4gKHVpbnQ2NF90KWEgKiAodWludDY0X3QpYjsKK30KKworc3RhdGljIGlubGluZSBpbnQxNl90IG1pcHNkc3Bfcm5kcTE1X211bF9xMTVfcTE1KHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIGlmICgoYSA9PSAweDgwMDApICYmIChiID09IDB4ODAwMCkpIHsKKyAgICAgICAgdGVtcCA9IDB4N0ZGRjAwMDA7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjEsIGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcCA9ICgoaW50MTZfdClhICogKGludDE2X3QpYikgPDwgMTsKKyAgICAgICAgdGVtcCA9IHRlbXAgKyAweDAwMDA4MDAwOworICAgIH0KKworICAgIHJldHVybiAodGVtcCAmIDB4RkZGRjAwMDApID4+IDE2OworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9zYXQxNl9tdWxfcTE1X3ExNSh1aW50MTZfdCBhLCB1aW50MTZfdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB0ZW1wOworCisgICAgaWYgKChhID09IDB4ODAwMCkgJiYgKGIgPT0gMHg4MDAwKSkgeworICAgICAgICB0ZW1wID0gMHg3RkZGMDAwMDsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMSwgZW52KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wID0gKGludDE2X3QpYSAqIChpbnQxNl90KWI7CisgICAgICAgIHRlbXAgPSB0ZW1wIDw8IDE7CisgICAgfQorCisgICAgcmV0dXJuICh0ZW1wID4+IDE2KSAmIDB4MDAwMEZGRkY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF90cnVuYzE2X3NhdDE2X3JvdW5kKGludDMyX3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQxNl90IHRlbXA7CisKKworICAgIC8qCisgICAgICogVGhlIHZhbHVlIDB4MDAwMDgwMDAgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5wdXQgUTMxIHZhbHVlLCBhbmQgdGhlIGNvZGUKKyAgICAgKiBuZWVkcyB0byBjaGVjayBpZiB0aGUgYWRkaXRpb24gY2F1c2VzIGFuIG92ZXJmbG93LiBTaW5jZSBhIHBvc2l0aXZlIHZhbHVlCisgICAgICogaXMgYWRkZWQsIG92ZXJmbG93IGNhbiBoYXBwZW4gaW4gb25lIGRpcmVjdGlvbiBvbmx5LgorICAgICAqLworICAgIGlmIChhID4gMHg3RkZGN0ZGRikgeworICAgICAgICB0ZW1wID0gMHg3RkZGOworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIyLCBlbnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXAgPSAoKGEgKyAweDgwMDApID4+IDE2KSAmIDB4RkZGRjsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IG1pcHNkc3Bfc2F0OF9yZWR1Y2VfcHJlY2lzaW9uKHVpbnQxNl90IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDE2X3QgbWFnOworICAgIHVpbnQzMl90IHNpZ247CisKKyAgICBzaWduID0gKGEgPj4gMTUpICYgMHgwMTsKKyAgICBtYWcgPSBhICYgMHg3RkZGOworCisgICAgaWYgKHNpZ24gPT0gMCkgeworICAgICAgICBpZiAobWFnID4gMHg3RjgwKSB7CisgICAgICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIyLCBlbnYpOworICAgICAgICAgICAgcmV0dXJuIDB4RkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKG1hZyA+PiA3KSAmIDB4RkZGRjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjIsIGVudik7CisgICAgICAgIHJldHVybiAweDAwOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50OF90IG1pcHNkc3BfbHNoaWZ0OCh1aW50OF90IGEsIHVpbnQ4X3QgcywgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDhfdCBkaXNjYXJkOworCisgICAgaWYgKHMgIT0gMCkgeworICAgICAgICBkaXNjYXJkID0gYSA+PiAoOCAtIHMpOworCisgICAgICAgIGlmIChkaXNjYXJkICE9IDB4MDApIHsKKyAgICAgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjIsIGVudik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGEgPDwgczsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBtaXBzZHNwX2xzaGlmdDE2KHVpbnQxNl90IGEsIHVpbnQ4X3QgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50MTZfdCBkaXNjYXJkOworCisgICAgaWYgKHMgIT0gMCkgeworICAgICAgICBkaXNjYXJkID0gKGludDE2X3QpYSA+PiAoMTUgLSBzKTsKKworICAgICAgICBpZiAoKGRpc2NhcmQgIT0gMHgwMDAwKSAmJiAoZGlzY2FyZCAhPSAweEZGRkYpKSB7CisgICAgICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIyLCBlbnYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhIDw8IHM7Cit9CisKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBtaXBzZHNwX2xzaGlmdDMyKHVpbnQzMl90IGEsIHVpbnQ4X3QgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCBkaXNjYXJkOworCisgICAgaWYgKHMgPT0gMCkgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9IGVsc2UgeworICAgICAgICBkaXNjYXJkID0gKGludDMyX3QpYSA+PiAoMzEgLSAocyAtIDEpKTsKKworICAgICAgICBpZiAoKGRpc2NhcmQgIT0gMHgwMDAwMDAwMCkgJiYgKGRpc2NhcmQgIT0gMHhGRkZGRkZGRikpIHsKKyAgICAgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjIsIGVudik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGEgPDwgczsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9zYXQxNl9sc2hpZnQodWludDE2X3QgYSwgdWludDhfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50OF90ICBzaWduOworICAgIHVpbnQxNl90IGRpc2NhcmQ7CisKKyAgICBpZiAocyA9PSAwKSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpZ24gPSAoYSA+PiAxNSkgJiAweDAxOworICAgICAgICBpZiAoc2lnbiAhPSAwKSB7CisgICAgICAgICAgICBkaXNjYXJkID0gKCgoMHgwMSA8PCAoMTYgLSBzKSkgLSAxKSA8PCBzKSB8CisgICAgICAgICAgICAgICAgICAgICAgKChhID4+ICgxNCAtIChzIC0gMSkpKSAmICgoMHgwMSA8PCBzKSAtIDEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpc2NhcmQgPSBhID4+ICgxNCAtIChzIC0gMSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChkaXNjYXJkICE9IDB4MDAwMCkgJiYgKGRpc2NhcmQgIT0gMHhGRkZGKSkgeworICAgICAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMiwgZW52KTsKKyAgICAgICAgICAgIHJldHVybiAoc2lnbiA9PSAwKSA/IDB4N0ZGRiA6IDB4ODAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhIDw8IHM7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbWlwc2RzcF9zYXQzMl9sc2hpZnQodWludDMyX3QgYSwgdWludDhfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50OF90ICBzaWduOworICAgIHVpbnQzMl90IGRpc2NhcmQ7CisKKyAgICBpZiAocyA9PSAwKSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpZ24gPSAoYSA+PiAzMSkgJiAweDAxOworICAgICAgICBpZiAoc2lnbiAhPSAwKSB7CisgICAgICAgICAgICBkaXNjYXJkID0gKCgoMHgwMSA8PCAoMzIgLSBzKSkgLSAxKSA8PCBzKSB8CisgICAgICAgICAgICAgICAgICAgICAgKChhID4+ICgzMCAtIChzIC0gMSkpKSAmICgoMHgwMSA8PCBzKSAtIDEpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpc2NhcmQgPSBhID4+ICgzMCAtIChzIC0gMSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChkaXNjYXJkICE9IDB4MDAwMDAwMDApICYmIChkaXNjYXJkICE9IDB4RkZGRkZGRkYpKSB7CisgICAgICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIyLCBlbnYpOworICAgICAgICAgICAgcmV0dXJuIChzaWduID09IDApID8gMHg3RkZGRkZGRiA6IDB4ODAwMDAwMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYSA8PCBzOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9ybmQ4X3Jhc2hpZnQodWludDhfdCBhLCB1aW50OF90IHMpCit7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIGlmIChzID09IDApIHsKKyAgICAgICAgdGVtcCA9ICh1aW50MzJfdClhIDw8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcCA9IChpbnQzMl90KShpbnQ4X3QpYSA+PiAocyAtIDEpOworICAgIH0KKworICAgIHJldHVybiAodGVtcCArIDEpID4+IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9ybmQxNl9yYXNoaWZ0KHVpbnQxNl90IGEsIHVpbnQ4X3QgcykKK3sKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgaWYgKHMgPT0gMCkgeworICAgICAgICB0ZW1wID0gKHVpbnQzMl90KWEgPDwgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wID0gKGludDMyX3QpKGludDE2X3QpYSA+PiAocyAtIDEpOworICAgIH0KKworICAgIHJldHVybiAodGVtcCArIDEpID4+IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbWlwc2RzcF9ybmQzMl9yYXNoaWZ0KHVpbnQzMl90IGEsIHVpbnQ4X3QgcykKK3sKKyAgICBpbnQ2NF90IHRlbXA7CisKKyAgICBpZiAocyA9PSAwKSB7CisgICAgICAgIHRlbXAgPSAodWludDY0X3QpYSA8PCAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXAgPSAoaW50NjRfdCkoaW50MzJfdClhID4+IChzIC0gMSk7CisgICAgfQorICAgIHRlbXAgKz0gMTsKKworICAgIHJldHVybiAodGVtcCA+PiAxKSAmIDB4RkZGRkZGRkZ1bGw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9zdWJfaTE2KGludDE2X3QgYSwgaW50MTZfdCBiLCBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQxNl90ICB0ZW1wOworCisgICAgdGVtcCA9IGEgLSBiOworICAgIGlmIChNSVBTRFNQX09WRVJGTE9XX1NVQihhLCBiLCB0ZW1wLCAweDgwMDApKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9zYXQxNl9zdWIoaW50MTZfdCBhLCBpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDE2X3QgIHRlbXA7CisKKyAgICB0ZW1wID0gYSAtIGI7CisgICAgaWYgKE1JUFNEU1BfT1ZFUkZMT1dfU1VCKGEsIGIsIHRlbXAsIDB4ODAwMCkpIHsKKyAgICAgICAgaWYgKGEgPj0gMCkgeworICAgICAgICAgICAgdGVtcCA9IDB4N0ZGRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRlbXAgPSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBtaXBzZHNwX3NhdDMyX3N1YihpbnQzMl90IGEsIGludDMyX3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50MzJfdCAgdGVtcDsKKworICAgIHRlbXAgPSBhIC0gYjsKKyAgICBpZiAoTUlQU0RTUF9PVkVSRkxPV19TVUIoYSwgYiwgdGVtcCwgMHg4MDAwMDAwMCkpIHsKKyAgICAgICAgaWYgKGEgPj0gMCkgeworICAgICAgICAgICAgdGVtcCA9IDB4N0ZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wID0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIwLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wICYgMHhGRkZGRkZGRnVsbDsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBtaXBzZHNwX3JzaGlmdDFfc3ViX3ExNihpbnQxNl90IGEsIGludDE2X3QgYikKK3sKKyAgICBpbnQzMl90ICB0ZW1wOworCisgICAgdGVtcCA9IChpbnQzMl90KWEgLSAoaW50MzJfdCliOworCisgICAgcmV0dXJuICh0ZW1wID4+IDEpICYgMHgwMDAwRkZGRjsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBtaXBzZHNwX3Jyc2hpZnQxX3N1Yl9xMTYoaW50MTZfdCBhLCBpbnQxNl90IGIpCit7CisgICAgaW50MzJfdCAgdGVtcDsKKworICAgIHRlbXAgPSAoaW50MzJfdClhIC0gKGludDMyX3QpYjsKKyAgICB0ZW1wICs9IDE7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweDAwMDBGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG1pcHNkc3BfcnNoaWZ0MV9zdWJfcTMyKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworICAgIGludDY0X3QgIHRlbXA7CisKKyAgICB0ZW1wID0gKGludDY0X3QpYSAtIChpbnQ2NF90KWI7CisKKyAgICByZXR1cm4gKHRlbXAgPj4gMSkgJiAweEZGRkZGRkZGdWxsOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IG1pcHNkc3BfcnJzaGlmdDFfc3ViX3EzMihpbnQzMl90IGEsIGludDMyX3QgYikKK3sKKyAgICBpbnQ2NF90ICB0ZW1wOworCisgICAgdGVtcCA9IChpbnQ2NF90KWEgLSAoaW50NjRfdCliOworICAgIHRlbXAgKz0gMTsKKworICAgIHJldHVybiAodGVtcCA+PiAxKSAmIDB4RkZGRkZGRkZ1bGw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWlwc2RzcF9zdWJfdTE2X3UxNih1aW50MTZfdCBhLCB1aW50MTZfdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgIHRlbXAxNjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgdGVtcCA9ICh1aW50MzJfdClhIC0gKHVpbnQzMl90KWI7CisgICAgdGVtcDE2ID0gKHRlbXAgPj4gMTYpICYgMHgwMTsKKyAgICBpZiAodGVtcDE2ID09IDEpIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisgICAgcmV0dXJuIHRlbXAgJiAweDAwMDBGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IG1pcHNkc3Bfc2F0dTE2X3N1Yl91MTZfdTE2KHVpbnQxNl90IGEsIHVpbnQxNl90IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgIHRlbXAxNjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgdGVtcCAgID0gKHVpbnQzMl90KWEgLSAodWludDMyX3QpYjsKKyAgICB0ZW1wMTYgPSAodGVtcCA+PiAxNikgJiAweDAxOworCisgICAgaWYgKHRlbXAxNiA9PSAxKSB7CisgICAgICAgIHRlbXAgPSAweDAwMDA7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXAgJiAweDAwMDBGRkZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9zdWJfdTgodWludDhfdCBhLCB1aW50OF90IGIsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgIHRlbXA4OworICAgIHVpbnQxNl90IHRlbXA7CisKKyAgICB0ZW1wID0gKHVpbnQxNl90KWEgLSAodWludDE2X3QpYjsKKyAgICB0ZW1wOCA9ICh0ZW1wID4+IDgpICYgMHgwMTsKKyAgICBpZiAodGVtcDggPT0gMSkgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIwLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wICYgMHgwMEZGOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgbWlwc2RzcF9zYXR1OF9zdWIodWludDhfdCBhLCB1aW50OF90IGIsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgIHRlbXA4OworICAgIHVpbnQxNl90IHRlbXA7CisKKyAgICB0ZW1wID0gKHVpbnQxNl90KWEgLSAodWludDE2X3QpYjsKKyAgICB0ZW1wOCA9ICh0ZW1wID4+IDgpICYgMHgwMTsKKyAgICBpZiAodGVtcDggPT0gMSkgeworICAgICAgICB0ZW1wID0gMHgwMDsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMCwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gdGVtcCAmIDB4MDBGRjsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBtaXBzZHNwX3N1YjMyKGludDMyX3QgYSwgaW50MzJfdCBiLCBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXA7CisKKyAgICB0ZW1wID0gYSAtIGI7CisgICAgaWYgKE1JUFNEU1BfT1ZFUkZMT1dfU1VCKGEsIGIsIHRlbXAsIDB4ODAwMDAwMDApKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjAsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX2FkZF9pMzIoaW50MzJfdCBhLCBpbnQzMl90IGIsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDMyX3QgdGVtcDsKKworICAgIHRlbXAgPSBhICsgYjsKKworICAgIGlmIChNSVBTRFNQX09WRVJGTE9XX0FERChhLCBiLCB0ZW1wLCAweDgwMDAwMDAwKSkgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIwLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9jbXBfZXEoaW50MzJfdCBhLCBpbnQzMl90IGIpCit7CisgICAgcmV0dXJuIGEgPT0gYjsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3BfY21wX2xlKGludDMyX3QgYSwgaW50MzJfdCBiKQoreworICAgIHJldHVybiBhIDw9IGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX2NtcF9sdChpbnQzMl90IGEsIGludDMyX3QgYikKK3sKKyAgICByZXR1cm4gYSA8IGI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtaXBzZHNwX2NtcHVfZXEodWludDMyX3QgYSwgdWludDMyX3QgYikKK3sKKyAgICByZXR1cm4gYSA9PSBiOworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3QgbWlwc2RzcF9jbXB1X2xlKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpCit7CisgICAgcmV0dXJuIGEgPD0gYjsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IG1pcHNkc3BfY21wdV9sdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiKQoreworICAgIHJldHVybiBhIDwgYjsKK30KKy8qKiogTUlQUyBEU1AgaW50ZXJuYWwgZnVuY3Rpb25zIGVuZCAqKiovCisKKyNkZWZpbmUgTUlQU0RTUF9MSEkgMHhGRkZGRkZGRjAwMDAwMDAwdWxsCisjZGVmaW5lIE1JUFNEU1BfTExPIDB4MDAwMDAwMDBGRkZGRkZGRnVsbAorI2RlZmluZSBNSVBTRFNQX0hJICAweEZGRkYwMDAwCisjZGVmaW5lIE1JUFNEU1BfTE8gIDB4MDAwMEZGRkYKKyNkZWZpbmUgTUlQU0RTUF9RMyAgMHhGRjAwMDAwMAorI2RlZmluZSBNSVBTRFNQX1EyICAweDAwRkYwMDAwCisjZGVmaW5lIE1JUFNEU1BfUTEgIDB4MDAwMEZGMDAKKyNkZWZpbmUgTUlQU0RTUF9RMCAgMHgwMDAwMDBGRgorCisjZGVmaW5lIE1JUFNEU1BfU1BMSVQzMl84KG51bSwgYSwgYiwgYywgZCkgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhID0gKG51bSA+PiAyNCkgJiBNSVBTRFNQX1EwOyAgICAgICBcCisgICAgICAgIGIgPSAobnVtID4+IDE2KSAmIE1JUFNEU1BfUTA7ICAgICAgIFwKKyAgICAgICAgYyA9IChudW0gPj4gOCkgJiBNSVBTRFNQX1EwOyAgICAgICAgXAorICAgICAgICBkID0gbnVtICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNSVBTRFNQX1NQTElUMzJfMTYobnVtLCBhLCBiKSAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYSA9IChudW0gPj4gMTYpICYgTUlQU0RTUF9MTzsgICAgICAgXAorICAgICAgICBiID0gbnVtICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBNSVBTRFNQX1JFVFVSTjMyXzgoYSwgYiwgYywgZCkgICgodGFyZ2V0X2xvbmcpKGludDMyX3QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpYSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQzMl90KWIgPDwgMTYpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzJfdCljIDw8IDgpIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpZCAmIDB4RkYpKSkpKQorI2RlZmluZSBNSVBTRFNQX1JFVFVSTjMyXzE2KGEsIGIpICAgICAgICgodGFyZ2V0X2xvbmcpKGludDMyX3QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpYSA8PCAxNikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWIgJiAweEZGRkYpKSkKKworI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyNkZWZpbmUgTUlQU0RTUF9TUExJVDY0XzE2KG51bSwgYSwgYiwgYywgZCkgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYSA9IChudW0gPj4gNDgpICYgTUlQU0RTUF9MTzsgICAgICAgIFwKKyAgICAgICAgYiA9IChudW0gPj4gMzIpICYgTUlQU0RTUF9MTzsgICAgICAgIFwKKyAgICAgICAgYyA9IChudW0gPj4gMTYpICYgTUlQU0RTUF9MTzsgICAgICAgIFwKKyAgICAgICAgZCA9IG51bSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JUFNEU1BfU1BMSVQ2NF8zMihudW0sIGEsIGIpICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhID0gKG51bSA+PiAzMikgJiBNSVBTRFNQX0xMTzsgICAgICBcCisgICAgICAgIGIgPSBudW0gJiBNSVBTRFNQX0xMTzsgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIE1JUFNEU1BfUkVUVVJONjRfMTYoYSwgYiwgYywgZCkgKCgodWludDY0X3QpYSA8PCA0OCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpYiA8PCAzMikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpYyA8PCAxNikgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClkKQorI2RlZmluZSBNSVBTRFNQX1JFVFVSTjY0XzMyKGEsIGIpICAgICAgICgoKHVpbnQ2NF90KWEgPDwgMzIpIHwgKHVpbnQ2NF90KWIpCisjZW5kaWYKKworLyoqIERTUCBBcml0aG1ldGljIFN1Yi1jbGFzcyBpbnNucyAqKi8KKyNkZWZpbmUgTUlQU0RTUDMyX1VOT1BfRU5WKG5hbWUsIGZ1bmMsIGVsZW1lbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lKHRhcmdldF91bG9uZyBydCwgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEU1AzMlZhbHVlIGR0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBpbnQgaSwgbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuID0gc2l6ZW9mKERTUDMyVmFsdWUpIC8gc2l6ZW9mKGR0LmVsZW1lbnRbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkdC5zd1swXSA9IHJ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHQuZWxlbWVudFtpXSA9IG1pcHNkc3BfIyNmdW5jKGR0LmVsZW1lbnRbaV0sIGVudik7ICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKWR0LnN3WzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK01JUFNEU1AzMl9VTk9QX0VOVihhYnNxX3NfcGgsIHNhdF9hYnMxNiwgc2gpCitNSVBTRFNQMzJfVU5PUF9FTlYoYWJzcV9zX3FiLCBzYXRfYWJzOCwgc2IpCitNSVBTRFNQMzJfVU5PUF9FTlYoYWJzcV9zX3csIHNhdF9hYnMzMiwgc3cpCisjdW5kZWYgTUlQU0RTUDMyX1VOT1BfRU5WCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisjZGVmaW5lIE1JUFNEU1A2NF9VTk9QX0VOVihuYW1lLCBmdW5jLCBlbGVtZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnQsIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFNQNjRWYWx1ZSBkdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IGksIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbiA9IHNpemVvZihEU1A2NFZhbHVlKSAvIHNpemVvZihkdC5lbGVtZW50WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHQuc2xbMF0gPSBydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGR0LmVsZW1lbnRbaV0gPSBtaXBzZHNwXyMjZnVuYyhkdC5lbGVtZW50W2ldLCBlbnYpOyAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGR0LnNsWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitNSVBTRFNQNjRfVU5PUF9FTlYoYWJzcV9zX29iLCBzYXRfYWJzOCwgc2IpCitNSVBTRFNQNjRfVU5PUF9FTlYoYWJzcV9zX3FoLCBzYXRfYWJzMTYsIHNoKQorTUlQU0RTUDY0X1VOT1BfRU5WKGFic3Ffc19wdywgc2F0X2FiczMyLCBzdykKKyN1bmRlZiBNSVBTRFNQNjRfVU5PUF9FTlYKKyNlbmRpZgorCisjZGVmaW5lIE1JUFNEU1AzMl9CSU5PUChuYW1lLCBmdW5jLCBlbGVtZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFNQMzJWYWx1ZSBkcywgZHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IGksIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbiA9IHNpemVvZihEU1AzMlZhbHVlKSAvIHNpemVvZihkcy5lbGVtZW50WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHMuc3dbMF0gPSByczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHQuc3dbMF0gPSBydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzLmVsZW1lbnRbaV0gPSBtaXBzZHNwXyMjZnVuYyhkcy5lbGVtZW50W2ldLCBkdC5lbGVtZW50W2ldKTsgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZylkcy5zd1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitNSVBTRFNQMzJfQklOT1AoYWRkcWhfcGgsIHJzaGlmdDFfYWRkX3ExNiwgc2gpOworTUlQU0RTUDMyX0JJTk9QKGFkZHFoX3JfcGgsIHJyc2hpZnQxX2FkZF9xMTYsIHNoKTsKK01JUFNEU1AzMl9CSU5PUChhZGRxaF9yX3csIHJyc2hpZnQxX2FkZF9xMzIsIHN3KTsKK01JUFNEU1AzMl9CSU5PUChhZGRxaF93LCByc2hpZnQxX2FkZF9xMzIsIHN3KTsKK01JUFNEU1AzMl9CSU5PUChhZGR1aF9xYiwgcnNoaWZ0MV9hZGRfdTgsIHViKTsKK01JUFNEU1AzMl9CSU5PUChhZGR1aF9yX3FiLCBycnNoaWZ0MV9hZGRfdTgsIHViKTsKK01JUFNEU1AzMl9CSU5PUChzdWJxaF9waCwgcnNoaWZ0MV9zdWJfcTE2LCBzaCk7CitNSVBTRFNQMzJfQklOT1Aoc3VicWhfcl9waCwgcnJzaGlmdDFfc3ViX3ExNiwgc2gpOworTUlQU0RTUDMyX0JJTk9QKHN1YnFoX3JfdywgcnJzaGlmdDFfc3ViX3EzMiwgc3cpOworTUlQU0RTUDMyX0JJTk9QKHN1YnFoX3csIHJzaGlmdDFfc3ViX3EzMiwgc3cpOworI3VuZGVmIE1JUFNEU1AzMl9CSU5PUAorCisjZGVmaW5lIE1JUFNEU1AzMl9CSU5PUF9FTlYobmFtZSwgZnVuYywgZWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFNQMzJWYWx1ZSBkcywgZHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IGksIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbiA9IHNpemVvZihEU1AzMlZhbHVlKSAvIHNpemVvZihkcy5lbGVtZW50WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHMuc3dbMF0gPSByczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHQuc3dbMF0gPSBydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMCA7IGkgPCBuIDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzLmVsZW1lbnRbaV0gPSBtaXBzZHNwXyMjZnVuYyhkcy5lbGVtZW50W2ldLCBkdC5lbGVtZW50W2ldLCBlbnYpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZylkcy5zd1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitNSVBTRFNQMzJfQklOT1BfRU5WKGFkZHFfcGgsIGFkZF9pMTYsIHNoKQorTUlQU0RTUDMyX0JJTk9QX0VOVihhZGRxX3NfcGgsIHNhdF9hZGRfaTE2LCBzaCkKK01JUFNEU1AzMl9CSU5PUF9FTlYoYWRkcV9zX3csIHNhdF9hZGRfaTMyLCBzdyk7CitNSVBTRFNQMzJfQklOT1BfRU5WKGFkZHVfcGgsIGFkZF91MTYsIHNoKQorTUlQU0RTUDMyX0JJTk9QX0VOVihhZGR1X3FiLCBhZGRfdTgsIHViKTsKK01JUFNEU1AzMl9CSU5PUF9FTlYoYWRkdV9zX3BoLCBzYXRfYWRkX3UxNiwgc2gpCitNSVBTRFNQMzJfQklOT1BfRU5WKGFkZHVfc19xYiwgc2F0X2FkZF91OCwgdWIpOworTUlQU0RTUDMyX0JJTk9QX0VOVihzdWJxX3BoLCBzdWJfaTE2LCBzaCk7CitNSVBTRFNQMzJfQklOT1BfRU5WKHN1YnFfc19waCwgc2F0MTZfc3ViLCBzaCk7CitNSVBTRFNQMzJfQklOT1BfRU5WKHN1YnFfc193LCBzYXQzMl9zdWIsIHN3KTsKK01JUFNEU1AzMl9CSU5PUF9FTlYoc3VidV9waCwgc3ViX3UxNl91MTYsIHNoKTsKK01JUFNEU1AzMl9CSU5PUF9FTlYoc3VidV9xYiwgc3ViX3U4LCB1Yik7CitNSVBTRFNQMzJfQklOT1BfRU5WKHN1YnVfc19waCwgc2F0dTE2X3N1Yl91MTZfdTE2LCBzaCk7CitNSVBTRFNQMzJfQklOT1BfRU5WKHN1YnVfc19xYiwgc2F0dThfc3ViLCB1Yik7CisjdW5kZWYgTUlQU0RTUDMyX0JJTk9QX0VOVgorCisjaWZkZWYgVEFSR0VUX01JUFM2NAorI2RlZmluZSBNSVBTRFNQNjRfQklOT1AobmFtZSwgZnVuYywgZWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERTUDY0VmFsdWUgZHMsIGR0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGludCBpLCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG4gPSBzaXplb2YoRFNQNjRWYWx1ZSkgLyBzaXplb2YoZHMuZWxlbWVudFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzLnNsWzBdID0gcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGR0LnNsWzBdID0gcnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDAgOyBpIDwgbiA7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkcy5lbGVtZW50W2ldID0gbWlwc2RzcF8jI2Z1bmMoZHMuZWxlbWVudFtpXSwgZHQuZWxlbWVudFtpXSk7ICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBkcy5zbFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorTUlQU0RTUDY0X0JJTk9QKGFkZHVoX29iLCByc2hpZnQxX2FkZF91OCwgdWIpOworTUlQU0RTUDY0X0JJTk9QKGFkZHVoX3Jfb2IsIHJyc2hpZnQxX2FkZF91OCwgdWIpOworTUlQU0RTUDY0X0JJTk9QKHN1YnVoX29iLCByc2hpZnQxX3N1Yl91OCwgdWIpOworTUlQU0RTUDY0X0JJTk9QKHN1YnVoX3Jfb2IsIHJyc2hpZnQxX3N1Yl91OCwgdWIpOworI3VuZGVmIE1JUFNEU1A2NF9CSU5PUAorCisjZGVmaW5lIE1JUFNEU1A2NF9CSU5PUF9FTlYobmFtZSwgZnVuYywgZWxlbWVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFNQNjRWYWx1ZSBkcywgZHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgaW50IGksIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbiA9IHNpemVvZihEU1A2NFZhbHVlKSAvIHNpemVvZihkcy5lbGVtZW50WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHMuc2xbMF0gPSByczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHQuc2xbMF0gPSBydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMCA7IGkgPCBuIDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzLmVsZW1lbnRbaV0gPSBtaXBzZHNwXyMjZnVuYyhkcy5lbGVtZW50W2ldLCBkdC5lbGVtZW50W2ldLCBlbnYpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGRzLnNsWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitNSVBTRFNQNjRfQklOT1BfRU5WKGFkZHFfcHcsIGFkZF9pMzIsIHN3KTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoYWRkcV9xaCwgYWRkX2kxNiwgc2gpOworTUlQU0RTUDY0X0JJTk9QX0VOVihhZGRxX3NfcHcsIHNhdF9hZGRfaTMyLCBzdyk7CitNSVBTRFNQNjRfQklOT1BfRU5WKGFkZHFfc19xaCwgc2F0X2FkZF9pMTYsIHNoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoYWRkdV9vYiwgYWRkX3U4LCB1aCk7CitNSVBTRFNQNjRfQklOT1BfRU5WKGFkZHVfcWgsIGFkZF91MTYsIHVoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoYWRkdV9zX29iLCBzYXRfYWRkX3U4LCB1aCk7CitNSVBTRFNQNjRfQklOT1BfRU5WKGFkZHVfc19xaCwgc2F0X2FkZF91MTYsIHVoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoc3VicV9wdywgc3ViMzIsIHN3KTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoc3VicV9xaCwgc3ViX2kxNiwgc2gpOworTUlQU0RTUDY0X0JJTk9QX0VOVihzdWJxX3NfcHcsIHNhdDMyX3N1Yiwgc3cpOworTUlQU0RTUDY0X0JJTk9QX0VOVihzdWJxX3NfcWgsIHNhdDE2X3N1Yiwgc2gpOworTUlQU0RTUDY0X0JJTk9QX0VOVihzdWJ1X29iLCBzdWJfdTgsIHVoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoc3VidV9xaCwgc3ViX3UxNl91MTYsIHVoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoc3VidV9zX29iLCBzYXR1OF9zdWIsIHVoKTsKK01JUFNEU1A2NF9CSU5PUF9FTlYoc3VidV9zX3FoLCBzYXR1MTZfc3ViX3UxNl91MTYsIHVoKTsKKyN1bmRlZiBNSVBTRFNQNjRfQklOT1BfRU5WCisKKyNlbmRpZgorCisjZGVmaW5lIFNVQlVIX1FCKG5hbWUsIHZhcikgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19xYih0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcnMzLCByczIsIHJzMSwgcnMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcnQzLCBydDIsIHJ0MSwgcnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgdGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JUFNEU1BfU1BMSVQzMl84KHJzLCByczMsIHJzMiwgcnMxLCByczApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JUFNEU1BfU1BMSVQzMl84KHJ0LCBydDMsIHJ0MiwgcnQxLCBydDApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBEID0gKCh1aW50MTZfdClyczMgLSAodWludDE2X3QpcnQzICsgdmFyKSA+PiAxOyAgICAgICAgICAgXAorICAgIHRlbXBDID0gKCh1aW50MTZfdClyczIgLSAodWludDE2X3QpcnQyICsgdmFyKSA+PiAxOyAgICAgICAgICAgXAorICAgIHRlbXBCID0gKCh1aW50MTZfdClyczEgLSAodWludDE2X3QpcnQxICsgdmFyKSA+PiAxOyAgICAgICAgICAgXAorICAgIHRlbXBBID0gKCh1aW50MTZfdClyczAgLSAodWludDE2X3QpcnQwICsgdmFyKSA+PiAxOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHVpbnQzMl90KXRlbXBEIDw8IDI0KSB8ICgodWludDMyX3QpdGVtcEMgPDwgMTYpIHwgICAgXAorICAgICAgICAoKHVpbnQzMl90KXRlbXBCIDw8IDgpIHwgKCh1aW50MzJfdCl0ZW1wQSk7ICAgICAgICAgICAgICAgXAorfQorCitTVUJVSF9RQihzdWJ1aCwgMCk7CitTVUJVSF9RQihzdWJ1aF9yLCAxKTsKKworI3VuZGVmIFNVQlVIX1FCCisKK3RhcmdldF91bG9uZyBoZWxwZXJfYWRkc2ModGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXAsIHRlbXBScywgdGVtcFJ0OworICAgIGJvb2wgZmxhZzsKKworICAgIHRlbXBScyA9ICh1aW50NjRfdClycyAmIE1JUFNEU1BfTExPOworICAgIHRlbXBSdCA9ICh1aW50NjRfdClydCAmIE1JUFNEU1BfTExPOworCisgICAgdGVtcCA9IHRlbXBScyArIHRlbXBSdDsKKyAgICBmbGFnID0gKHRlbXAgJiAweDAxMDAwMDAwMDB1bGwpID4+IDMyOworICAgIHNldF9EU1BDb250cm9sX2NhcnJ5ZmxhZyhmbGFnLCBlbnYpOworCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZykoaW50MzJfdCkodGVtcCAmIE1JUFNEU1BfTExPKTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9hZGR3Yyh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDMyX3QgcmQ7CisgICAgaW50MzJfdCB0ZW1wMzIsIHRlbXAzMTsKKyAgICBpbnQ2NF90IHRlbXBMOworCisgICAgdGVtcEwgPSAoaW50NjRfdCkoaW50MzJfdClycyArIChpbnQ2NF90KShpbnQzMl90KXJ0ICsKKyAgICAgICAgZ2V0X0RTUENvbnRyb2xfY2FycnlmbGFnKGVudik7CisgICAgdGVtcDMxID0gKHRlbXBMID4+IDMxKSAmIDB4MDE7CisgICAgdGVtcDMyID0gKHRlbXBMID4+IDMyKSAmIDB4MDE7CisKKyAgICBpZiAodGVtcDMxICE9IHRlbXAzMikgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIwLCBlbnYpOworICAgIH0KKworICAgIHJkID0gdGVtcEwgJiBNSVBTRFNQX0xMTzsKKworICAgIHJldHVybiAodGFyZ2V0X2xvbmcpKGludDMyX3QpcmQ7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbW9kc3ViKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0KQoreworICAgIGludDMyX3QgZGVjcjsKKyAgICB1aW50MTZfdCBsYXN0aW5kZXg7CisgICAgdGFyZ2V0X3Vsb25nIHJkOworCisgICAgZGVjciA9IHJ0ICYgTUlQU0RTUF9RMDsKKyAgICBsYXN0aW5kZXggPSAocnQgPj4gOCkgJiBNSVBTRFNQX0xPOworCisgICAgaWYgKChycyAmIE1JUFNEU1BfTExPKSA9PSAweDAwMDAwMDAwKSB7CisgICAgICAgIHJkID0gKHRhcmdldF91bG9uZylsYXN0aW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmQgPSBycyAtIGRlY3I7CisgICAgfQorCisgICAgcmV0dXJuIHJkOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX3JhZGR1X3dfcWIodGFyZ2V0X3Vsb25nIHJzKQoreworICAgIHRhcmdldF91bG9uZyByZXQgPSAwOworICAgIERTUDMyVmFsdWUgZHM7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBkcy51d1swXSA9IHJzOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgcmV0ICs9IGRzLnViW2ldOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQordGFyZ2V0X3Vsb25nIGhlbHBlcl9yYWRkdV9sX29iKHRhcmdldF91bG9uZyBycykKK3sKKyAgICB0YXJnZXRfdWxvbmcgcmV0ID0gMDsKKyAgICBEU1A2NFZhbHVlIGRzOworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZHMudWxbMF0gPSByczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHJldCArPSBkcy51YltpXTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjZGVmaW5lIFBSRUNSX1FCX1BIKG5hbWUsIGEsIGIpXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19xYl9waCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgdGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBEID0gKHJzID4+IGEpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBDID0gKHJzID4+IGIpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBCID0gKHJ0ID4+IGEpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gKHJ0ID4+IGIpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjMyXzgodGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEEpOyAgICAgICAgICAgXAorfQorCitQUkVDUl9RQl9QSChwcmVjciwgMTYsIDApOworUFJFQ1JfUUJfUEgocHJlY3JxLCAyNCwgOCk7CisKKyN1bmRlZiBQUkVDUl9RQl9PSAorCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNyX3NyYV9waF93KHVpbnQzMl90IHNhLCB0YXJnZXRfdWxvbmcgcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBydCkKK3sKKyAgICB1aW50MTZfdCB0ZW1wQiwgdGVtcEE7CisKKyAgICB0ZW1wQiA9ICgoaW50MzJfdClydCA+PiBzYSkgJiBNSVBTRFNQX0xPOworICAgIHRlbXBBID0gKChpbnQzMl90KXJzID4+IHNhKSAmIE1JUFNEU1BfTE87CisKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk4zMl8xNih0ZW1wQiwgdGVtcEEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNyX3NyYV9yX3BoX3codWludDMyX3Qgc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQpCit7CisgICAgdWludDY0X3QgdGVtcEIsIHRlbXBBOworCisgICAgLyogSWYgc2EgPSAwLCB0aGVuIChzYSAtIDEpID0gLTEgd2lsbCBjYXNlIHNoaWZ0IGVycm9yLCBzbyB3ZSBuZWVkIGVsc2UuICovCisgICAgaWYgKHNhID09IDApIHsKKyAgICAgICAgdGVtcEIgPSAocnQgJiBNSVBTRFNQX0xPKSA8PCAxOworICAgICAgICB0ZW1wQSA9IChycyAmIE1JUFNEU1BfTE8pIDw8IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcEIgPSAoKGludDMyX3QpcnQgPj4gKHNhIC0gMSkpICsgMTsKKyAgICAgICAgdGVtcEEgPSAoKGludDMyX3QpcnMgPj4gKHNhIC0gMSkpICsgMTsKKyAgICB9CisgICAgcnQgPSAoKCh0ZW1wQiA+PiAxKSAmIE1JUFNEU1BfTE8pIDw8IDE2KSB8ICgodGVtcEEgPj4gMSkgJiBNSVBTRFNQX0xPKTsKKworICAgIHJldHVybiAodGFyZ2V0X2xvbmcpKGludDMyX3QpcnQ7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfcHJlY3JxX3BoX3codGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQpCit7CisgICAgdWludDE2X3QgdGVtcEIsIHRlbXBBOworCisgICAgdGVtcEIgPSAocnMgJiBNSVBTRFNQX0hJKSA+PiAxNjsKKyAgICB0ZW1wQSA9IChydCAmIE1JUFNEU1BfSEkpID4+IDE2OworCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJOMzJfMTYodGVtcEIsIHRlbXBBKTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9wcmVjcnFfcnNfcGhfdyh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDE2X3QgdGVtcEIsIHRlbXBBOworCisgICAgdGVtcEIgPSBtaXBzZHNwX3RydW5jMTZfc2F0MTZfcm91bmQocnMsIGVudik7CisgICAgdGVtcEEgPSBtaXBzZHNwX3RydW5jMTZfc2F0MTZfcm91bmQocnQsIGVudik7CisKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk4zMl8xNih0ZW1wQiwgdGVtcEEpOworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQordGFyZ2V0X3Vsb25nIGhlbHBlcl9wcmVjcl9vYl9xaCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkKK3sKKyAgICB1aW50OF90IHJzNiwgcnM0LCByczIsIHJzMDsKKyAgICB1aW50OF90IHJ0NiwgcnQ0LCBydDIsIHJ0MDsKKyAgICB1aW50NjRfdCB0ZW1wOworCisgICAgcnM2ID0gKHJzID4+IDQ4KSAmIE1JUFNEU1BfUTA7CisgICAgcnM0ID0gKHJzID4+IDMyKSAmIE1JUFNEU1BfUTA7CisgICAgcnMyID0gKHJzID4+IDE2KSAmIE1JUFNEU1BfUTA7CisgICAgcnMwID0gcnMgJiBNSVBTRFNQX1EwOworICAgIHJ0NiA9IChydCA+PiA0OCkgJiBNSVBTRFNQX1EwOworICAgIHJ0NCA9IChydCA+PiAzMikgJiBNSVBTRFNQX1EwOworICAgIHJ0MiA9IChydCA+PiAxNikgJiBNSVBTRFNQX1EwOworICAgIHJ0MCA9IHJ0ICYgTUlQU0RTUF9RMDsKKworICAgIHRlbXAgPSAoKHVpbnQ2NF90KXJzNiA8PCA1NikgfCAoKHVpbnQ2NF90KXJzNCA8PCA0OCkgfAorICAgICAgICAgICAoKHVpbnQ2NF90KXJzMiA8PCA0MCkgfCAoKHVpbnQ2NF90KXJzMCA8PCAzMikgfAorICAgICAgICAgICAoKHVpbnQ2NF90KXJ0NiA8PCAyNCkgfCAoKHVpbnQ2NF90KXJ0NCA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQ2NF90KXJ0MiA8PCA4KSB8ICh1aW50NjRfdClydDA7CisKKyAgICByZXR1cm4gdGVtcDsKK30KKworI2RlZmluZSBQUkVDUl9RSF9QVyhuYW1lLCB2YXIpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfcHJlY3JfIyNuYW1lIyNfcWhfcHcodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJzMywgcnMyLCByczEsIHJzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBydDMsIHJ0MiwgcnQxLCBydDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgdGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnMsIHJzMywgcnMyLCByczEsIHJzMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDY0XzE2KHJ0LCBydDMsIHJ0MiwgcnQxLCBydDApOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBXaGVuIHNhID0gMCwgd2UgdXNlIHJ0MiwgcnQwLCByczIsIHJzMDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogd2hlbiBzYSAhPSAwLCB3ZSB1c2UgcnQzLCBydDEsIHJzMywgcnMxLiAqLyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzYSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEQgPSBydDIgPDwgdmFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBDID0gcnQwIDw8IHZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQiA9IHJzMiA8PCB2YXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEEgPSByczAgPDwgdmFyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wRCA9ICgoKGludDE2X3QpcnQzID4+IHNhKSArIHZhcikgPj4gdmFyOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSAoKChpbnQxNl90KXJ0MSA+PiBzYSkgKyB2YXIpID4+IHZhcjsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBCID0gKCgoaW50MTZfdClyczMgPj4gc2EpICsgdmFyKSA+PiB2YXI7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQSA9ICgoKGludDE2X3QpcnMxID4+IHNhKSArIHZhcikgPj4gdmFyOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjY0XzE2KHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBKTsgICAgICAgICAgIFwKK30KKworUFJFQ1JfUUhfUFcoc3JhLCAwKTsKK1BSRUNSX1FIX1BXKHNyYV9yLCAxKTsKKworI3VuZGVmIFBSRUNSX1FIX1BXCisKK3RhcmdldF91bG9uZyBoZWxwZXJfcHJlY3JxX29iX3FoKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0KQoreworICAgIHVpbnQ4X3QgcnM2LCByczQsIHJzMiwgcnMwOworICAgIHVpbnQ4X3QgcnQ2LCBydDQsIHJ0MiwgcnQwOworICAgIHVpbnQ2NF90IHRlbXA7CisKKyAgICByczYgPSAocnMgPj4gNTYpICYgTUlQU0RTUF9RMDsKKyAgICByczQgPSAocnMgPj4gNDApICYgTUlQU0RTUF9RMDsKKyAgICByczIgPSAocnMgPj4gMjQpICYgTUlQU0RTUF9RMDsKKyAgICByczAgPSAocnMgPj4gOCkgJiBNSVBTRFNQX1EwOworICAgIHJ0NiA9IChydCA+PiA1NikgJiBNSVBTRFNQX1EwOworICAgIHJ0NCA9IChydCA+PiA0MCkgJiBNSVBTRFNQX1EwOworICAgIHJ0MiA9IChydCA+PiAyNCkgJiBNSVBTRFNQX1EwOworICAgIHJ0MCA9IChydCA+PiA4KSAmIE1JUFNEU1BfUTA7CisKKyAgICB0ZW1wID0gKCh1aW50NjRfdClyczYgPDwgNTYpIHwgKCh1aW50NjRfdClyczQgPDwgNDgpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdClyczIgPDwgNDApIHwgKCh1aW50NjRfdClyczAgPDwgMzIpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdClydDYgPDwgMjQpIHwgKCh1aW50NjRfdClydDQgPDwgMTYpIHwKKyAgICAgICAgICAgKCh1aW50NjRfdClydDIgPDwgOCkgfCAodWludDY0X3QpcnQwOworCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfcHJlY3JxX3FoX3B3KHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0KQoreworICAgIHVpbnQxNl90IHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBOworCisgICAgdGVtcEQgPSAocnMgPj4gNDgpICYgTUlQU0RTUF9MTzsKKyAgICB0ZW1wQyA9IChycyA+PiAxNikgJiBNSVBTRFNQX0xPOworICAgIHRlbXBCID0gKHJ0ID4+IDQ4KSAmIE1JUFNEU1BfTE87CisgICAgdGVtcEEgPSAocnQgPj4gMTYpICYgTUlQU0RTUF9MTzsKKworICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjY0XzE2KHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBKTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9wcmVjcnFfcnNfcWhfcHcodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50MzJfdCByczIsIHJzMDsKKyAgICB1aW50MzJfdCBydDIsIHJ0MDsKKyAgICB1aW50MTZfdCB0ZW1wRCwgdGVtcEMsIHRlbXBCLCB0ZW1wQTsKKworICAgIHJzMiA9IChycyA+PiAzMikgJiBNSVBTRFNQX0xMTzsKKyAgICByczAgPSBycyAmIE1JUFNEU1BfTExPOworICAgIHJ0MiA9IChydCA+PiAzMikgJiBNSVBTRFNQX0xMTzsKKyAgICBydDAgPSBydCAmIE1JUFNEU1BfTExPOworCisgICAgdGVtcEQgPSBtaXBzZHNwX3RydW5jMTZfc2F0MTZfcm91bmQocnMyLCBlbnYpOworICAgIHRlbXBDID0gbWlwc2RzcF90cnVuYzE2X3NhdDE2X3JvdW5kKHJzMCwgZW52KTsKKyAgICB0ZW1wQiA9IG1pcHNkc3BfdHJ1bmMxNl9zYXQxNl9yb3VuZChydDIsIGVudik7CisgICAgdGVtcEEgPSBtaXBzZHNwX3RydW5jMTZfc2F0MTZfcm91bmQocnQwLCBlbnYpOworCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJONjRfMTYodGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNycV9wd19sKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0KQoreworICAgIHVpbnQzMl90IHRlbXBCLCB0ZW1wQTsKKworICAgIHRlbXBCID0gKHJzID4+IDMyKSAmIE1JUFNEU1BfTExPOworICAgIHRlbXBBID0gKHJ0ID4+IDMyKSAmIE1JUFNEU1BfTExPOworCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJONjRfMzIodGVtcEIsIHRlbXBBKTsKK30KKyNlbmRpZgorCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNycXVfc19xYl9waCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgIHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBOworICAgIHVpbnQxNl90IHJzaCwgcnNsLCBydGgsIHJ0bDsKKworICAgIHJzaCA9IChycyAmIE1JUFNEU1BfSEkpID4+IDE2OworICAgIHJzbCA9ICBycyAmIE1JUFNEU1BfTE87CisgICAgcnRoID0gKHJ0ICYgTUlQU0RTUF9ISSkgPj4gMTY7CisgICAgcnRsID0gIHJ0ICYgTUlQU0RTUF9MTzsKKworICAgIHRlbXBEID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnNoLCBlbnYpOworICAgIHRlbXBDID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnNsLCBlbnYpOworICAgIHRlbXBCID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnRoLCBlbnYpOworICAgIHRlbXBBID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnRsLCBlbnYpOworCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJOMzJfOCh0ZW1wRCwgdGVtcEMsIHRlbXBCLCB0ZW1wQSk7Cit9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNycXVfc19vYl9xaCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCBpOworICAgIHVpbnQxNl90IHJzMywgcnMyLCByczEsIHJzMDsKKyAgICB1aW50MTZfdCBydDMsIHJ0MiwgcnQxLCBydDA7CisgICAgdWludDhfdCB0ZW1wWzhdOworICAgIHVpbnQ2NF90IHJlc3VsdDsKKworICAgIHJlc3VsdCA9IDA7CisKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnMsIHJzMywgcnMyLCByczEsIHJzMCk7CisgICAgTUlQU0RTUF9TUExJVDY0XzE2KHJ0LCBydDMsIHJ0MiwgcnQxLCBydDApOworCisgICAgdGVtcFs3XSA9IG1pcHNkc3Bfc2F0OF9yZWR1Y2VfcHJlY2lzaW9uKHJzMywgZW52KTsKKyAgICB0ZW1wWzZdID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnMyLCBlbnYpOworICAgIHRlbXBbNV0gPSBtaXBzZHNwX3NhdDhfcmVkdWNlX3ByZWNpc2lvbihyczEsIGVudik7CisgICAgdGVtcFs0XSA9IG1pcHNkc3Bfc2F0OF9yZWR1Y2VfcHJlY2lzaW9uKHJzMCwgZW52KTsKKyAgICB0ZW1wWzNdID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnQzLCBlbnYpOworICAgIHRlbXBbMl0gPSBtaXBzZHNwX3NhdDhfcmVkdWNlX3ByZWNpc2lvbihydDIsIGVudik7CisgICAgdGVtcFsxXSA9IG1pcHNkc3Bfc2F0OF9yZWR1Y2VfcHJlY2lzaW9uKHJ0MSwgZW52KTsKKyAgICB0ZW1wWzBdID0gbWlwc2RzcF9zYXQ4X3JlZHVjZV9wcmVjaXNpb24ocnQwLCBlbnYpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICByZXN1bHQgfD0gKHVpbnQ2NF90KXRlbXBbaV0gPDwgKDggKiBpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIFBSRUNFUV9QVyhuYW1lLCBhLCBiKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNlcV9wd18jI25hbWUodGFyZ2V0X3Vsb25nIHJ0KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHRlbXBCSSwgdGVtcEFJOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IChydCA+PiBhKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gKHJ0ID4+IGIpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQkkgPSAodWludDMyX3QpdGVtcEIgPDwgMTY7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBSSA9ICh1aW50MzJfdCl0ZW1wQSA8PCAxNjsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk42NF8zMih0ZW1wQkksIHRlbXBBSSk7ICAgICAgICAgXAorfQorCitQUkVDRVFfUFcocWhsLCA0OCwgMzIpOworUFJFQ0VRX1BXKHFociwgMTYsIDApOworUFJFQ0VRX1BXKHFobGEsIDQ4LCAxNik7CitQUkVDRVFfUFcocWhyYSwgMzIsIDApOworCisjdW5kZWYgUFJFQ0VRX1BXCisKKyNlbmRpZgorCisjZGVmaW5lIFBSRUNFUVVfUEgobmFtZSwgYSwgYikgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl9wcmVjZXF1X3BoXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnQpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IChydCA+PiBhKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQSA9IChydCA+PiBiKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IHRlbXBCIDw8IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQSA9IHRlbXBBIDw8IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk4zMl8xNih0ZW1wQiwgdGVtcEEpOyAgICAgICAgICAgIFwKK30KKworUFJFQ0VRVV9QSChxYmwsIDI0LCAxNik7CitQUkVDRVFVX1BIKHFiciwgOCwgMCk7CitQUkVDRVFVX1BIKHFibGEsIDI0LCA4KTsKK1BSRUNFUVVfUEgocWJyYSwgMTYsIDApOworCisjdW5kZWYgUFJFQ0VRVV9QSAorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBQUkVDRVFVX1FIKG5hbWUsIGEsIGIsIGMsIGQpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfcHJlY2VxdV9xaF8jI25hbWUodGFyZ2V0X3Vsb25nIHJ0KSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEQgPSAocnQgPj4gYSkgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBDID0gKHJ0ID4+IGIpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IChydCA+PiBjKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEEgPSAocnQgPj4gZCkgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wRCA9IHRlbXBEIDw8IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEMgPSB0ZW1wQyA8PCA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBCID0gdGVtcEIgPDwgNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQSA9IHRlbXBBIDw8IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjY0XzE2KHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBKTsgIFwKK30KKworUFJFQ0VRVV9RSChvYmwsIDU2LCA0OCwgNDAsIDMyKTsKK1BSRUNFUVVfUUgob2JyLCAyNCwgMTYsIDgsIDApOworUFJFQ0VRVV9RSChvYmxhLCA1NiwgNDAsIDI0LCA4KTsKK1BSRUNFUVVfUUgob2JyYSwgNDgsIDMyLCAxNiwgMCk7CisKKyN1bmRlZiBQUkVDRVFVX1FICisKKyNlbmRpZgorCisjZGVmaW5lIFBSRUNFVV9QSChuYW1lLCBhLCBiKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNldV9waF8jI25hbWUodGFyZ2V0X3Vsb25nIHJ0KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgdGVtcEIsIHRlbXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEIgPSAocnQgPj4gYSkgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEEgPSAocnQgPj4gYikgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJOMzJfMTYodGVtcEIsIHRlbXBBKTsgICAgICAgICBcCit9CisKK1BSRUNFVV9QSChxYmwsIDI0LCAxNik7CitQUkVDRVVfUEgocWJyLCA4LCAwKTsKK1BSRUNFVV9QSChxYmxhLCAyNCwgOCk7CitQUkVDRVVfUEgocWJyYSwgMTYsIDApOworCisjdW5kZWYgUFJFQ0VVX1BICisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisjZGVmaW5lIFBSRUNFVV9RSChuYW1lLCBhLCBiLCBjLCBkKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyX3ByZWNldV9xaF8jI25hbWUodGFyZ2V0X3Vsb25nIHJ0KSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB0ZW1wRCwgdGVtcEMsIHRlbXBCLCB0ZW1wQTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBEID0gKHJ0ID4+IGEpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQyA9IChydCA+PiBiKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEIgPSAocnQgPj4gYykgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gKHJ0ID4+IGQpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJONjRfMTYodGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEEpOyAgXAorfQorCitQUkVDRVVfUUgob2JsLCA1NiwgNDgsIDQwLCAzMik7CitQUkVDRVVfUUgob2JyLCAyNCwgMTYsIDgsIDApOworUFJFQ0VVX1FIKG9ibGEsIDU2LCA0MCwgMjQsIDgpOworUFJFQ0VVX1FIKG9icmEsIDQ4LCAzMiwgMTYsIDApOworCisjdW5kZWYgUFJFQ0VVX1FICisKKyNlbmRpZgorCisvKiogRFNQIEdQUi1CYXNlZCBTaGlmdCBTdWItY2xhc3MgaW5zbnMgKiovCisjZGVmaW5lIFNISUZUX1FCKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfcWIodGFyZ2V0X3Vsb25nIHNhLCB0YXJnZXRfdWxvbmcgcnQpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHJ0MywgcnQyLCBydDEsIHJ0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYSA9IHNhICYgMHgwNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUMzJfOChydCwgcnQzLCBydDIsIHJ0MSwgcnQwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDMgPSBtaXBzZHNwXyMjZnVuYyhydDMsIHNhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDIgPSBtaXBzZHNwXyMjZnVuYyhydDIsIHNhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDEgPSBtaXBzZHNwXyMjZnVuYyhydDEsIHNhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDAgPSBtaXBzZHNwXyMjZnVuYyhydDAsIHNhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk4zMl84KHJ0MywgcnQyLCBydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTSElGVF9RQl9FTlYobmFtZSwgZnVuYykgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19xYih0YXJnZXRfdWxvbmcgc2EsIHRhcmdldF91bG9uZyBydCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBydDMsIHJ0MiwgcnQxLCBydDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2EgPSBzYSAmIDB4MDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDMyXzgocnQsIHJ0MywgcnQyLCBydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQzID0gbWlwc2RzcF8jI2Z1bmMocnQzLCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQyID0gbWlwc2RzcF8jI2Z1bmMocnQyLCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQxID0gbWlwc2RzcF8jI2Z1bmMocnQxLCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQwID0gbWlwc2RzcF8jI2Z1bmMocnQwLCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJOMzJfOChydDMsIHJ0MiwgcnQxLCBydDApOyAgICAgICAgICAgICAgICAgICBcCit9CisKK1NISUZUX1FCX0VOVihzaGxsLCBsc2hpZnQ4KTsKK1NISUZUX1FCKHNocmwsIHJzaGlmdF91OCk7CisKK1NISUZUX1FCKHNocmEsIHJhc2hpZnQ4KTsKK1NISUZUX1FCKHNocmFfciwgcm5kOF9yYXNoaWZ0KTsKKworI3VuZGVmIFNISUZUX1FCCisjdW5kZWYgU0hJRlRfUUJfRU5WCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisjZGVmaW5lIFNISUZUX09CKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfb2IodGFyZ2V0X3Vsb25nIHJ0LCB0YXJnZXRfdWxvbmcgc2EpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcnRfdFs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhID0gc2EgJiAweDA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnRfdFtpXSA9IChydCA+PiAoOCAqIGkpKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0X3RbaV0gPSBtaXBzZHNwXyMjZnVuYyhydF90W2ldLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wIHw9ICh1aW50NjRfdClydF90W2ldIDw8ICg4ICogaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTSElGVF9PQl9FTlYobmFtZSwgZnVuYykgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19vYih0YXJnZXRfdWxvbmcgcnQsIHRhcmdldF91bG9uZyBzYSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcnRfdFs4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhID0gc2EgJiAweDA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnRfdFtpXSA9IChydCA+PiAoOCAqIGkpKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJ0X3RbaV0gPSBtaXBzZHNwXyMjZnVuYyhydF90W2ldLCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wIHw9ICh1aW50NjRfdClydF90W2ldIDw8ICg4ICogaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworU0hJRlRfT0JfRU5WKHNobGwsIGxzaGlmdDgpOworU0hJRlRfT0Ioc2hybCwgcnNoaWZ0X3U4KTsKKworU0hJRlRfT0Ioc2hyYSwgcmFzaGlmdDgpOworU0hJRlRfT0Ioc2hyYV9yLCBybmQ4X3Jhc2hpZnQpOworCisjdW5kZWYgU0hJRlRfT0IKKyN1bmRlZiBTSElGVF9PQl9FTlYKKworI2VuZGlmCisKKyNkZWZpbmUgU0hJRlRfUEgobmFtZSwgZnVuYykgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19waCh0YXJnZXRfdWxvbmcgc2EsIHRhcmdldF91bG9uZyBydCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJ0aCwgcnRsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhID0gc2EgJiAweDBGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JUFNEU1BfU1BMSVQzMl8xNihydCwgcnRoLCBydGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0aCA9IG1pcHNkc3BfIyNmdW5jKHJ0aCwgc2EsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0bCA9IG1pcHNkc3BfIyNmdW5jKHJ0bCwgc2EsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjMyXzE2KHJ0aCwgcnRsKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitTSElGVF9QSChzaGxsLCBsc2hpZnQxNik7CitTSElGVF9QSChzaGxsX3MsIHNhdDE2X2xzaGlmdCk7CisKKyN1bmRlZiBTSElGVF9QSAorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBTSElGVF9RSChuYW1lLCBmdW5jKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSMjX3FoKHRhcmdldF91bG9uZyBydCwgdGFyZ2V0X3Vsb25nIHNhKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgcnQzLCBydDIsIHJ0MSwgcnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2EgPSBzYSAmIDB4MEY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDY0XzE2KHJ0LCBydDMsIHJ0MiwgcnQxLCBydDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQzID0gbWlwc2RzcF8jI2Z1bmMocnQzLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQyID0gbWlwc2RzcF8jI2Z1bmMocnQyLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQxID0gbWlwc2RzcF8jI2Z1bmMocnQxLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQwID0gbWlwc2RzcF8jI2Z1bmMocnQwLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJONjRfMTYocnQzLCBydDIsIHJ0MSwgcnQwKTsgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgU0hJRlRfUUhfRU5WKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfcWgodGFyZ2V0X3Vsb25nIHJ0LCB0YXJnZXRfdWxvbmcgc2EsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBydDMsIHJ0MiwgcnQxLCBydDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYSA9IHNhICYgMHgwRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnQsIHJ0MywgcnQyLCBydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDMgPSBtaXBzZHNwXyMjZnVuYyhydDMsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDIgPSBtaXBzZHNwXyMjZnVuYyhydDIsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDEgPSBtaXBzZHNwXyMjZnVuYyhydDEsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDAgPSBtaXBzZHNwXyMjZnVuYyhydDAsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk42NF8xNihydDMsIHJ0MiwgcnQxLCBydDApOyAgICAgICAgICAgICAgIFwKK30KKworU0hJRlRfUUhfRU5WKHNobGwsIGxzaGlmdDE2KTsKK1NISUZUX1FIX0VOVihzaGxsX3MsIHNhdDE2X2xzaGlmdCk7CisKK1NISUZUX1FIKHNocmwsIHJzaGlmdF91MTYpOworU0hJRlRfUUgoc2hyYSwgcmFzaGlmdDE2KTsKK1NISUZUX1FIKHNocmFfciwgcm5kMTZfcmFzaGlmdCk7CisKKyN1bmRlZiBTSElGVF9RSAorI3VuZGVmIFNISUZUX1FIX0VOVgorCisjZW5kaWYKKworI2RlZmluZSBTSElGVF9XKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfdyh0YXJnZXRfdWxvbmcgc2EsIHRhcmdldF91bG9uZyBydCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhID0gc2EgJiAweDFGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSBtaXBzZHNwXyMjZnVuYyhydCwgc2EpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAodGFyZ2V0X2xvbmcpKGludDMyX3QpdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNISUZUX1dfRU5WKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfdyh0YXJnZXRfdWxvbmcgc2EsIHRhcmdldF91bG9uZyBydCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2EgPSBzYSAmIDB4MUY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcCA9IG1pcHNkc3BfIyNmdW5jKHJ0LCBzYSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZykoaW50MzJfdCl0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1NISUZUX1dfRU5WKHNobGxfcywgc2F0MzJfbHNoaWZ0KTsKK1NISUZUX1coc2hyYV9yLCBybmQzMl9yYXNoaWZ0KTsKKworI3VuZGVmIFNISUZUX1cKKyN1bmRlZiBTSElGVF9XX0VOVgorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBTSElGVF9QVyhuYW1lLCBmdW5jKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSMjX3B3KHRhcmdldF91bG9uZyBydCwgdGFyZ2V0X3Vsb25nIHNhKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgcnQxLCBydDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2EgPSBzYSAmIDB4MUY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDY0XzMyKHJ0LCBydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQxID0gbWlwc2RzcF8jI2Z1bmMocnQxLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnQwID0gbWlwc2RzcF8jI2Z1bmMocnQwLCBzYSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJONjRfMzIocnQxLCBydDApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgU0hJRlRfUFdfRU5WKG5hbWUsIGZ1bmMpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lIyNfcHcodGFyZ2V0X3Vsb25nIHJ0LCB0YXJnZXRfdWxvbmcgc2EsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBydDEsIHJ0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzYSA9IHNhICYgMHgxRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMzIocnQsIHJ0MSwgcnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDEgPSBtaXBzZHNwXyMjZnVuYyhydDEsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDAgPSBtaXBzZHNwXyMjZnVuYyhydDAsIHNhLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gTUlQU0RTUF9SRVRVUk42NF8zMihydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworU0hJRlRfUFdfRU5WKHNobGwsIGxzaGlmdDMyKTsKK1NISUZUX1BXX0VOVihzaGxsX3MsIHNhdDMyX2xzaGlmdCk7CisKK1NISUZUX1BXKHNocmEsIHJhc2hpZnQzMik7CitTSElGVF9QVyhzaHJhX3IsIHJuZDMyX3Jhc2hpZnQpOworCisjdW5kZWYgU0hJRlRfUFcKKyN1bmRlZiBTSElGVF9QV19FTlYKKworI2VuZGlmCisKKyNkZWZpbmUgU0hJRlRfUEgobmFtZSwgZnVuYykgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUjI19waCh0YXJnZXRfdWxvbmcgc2EsIHRhcmdldF91bG9uZyBydCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJ0aCwgcnRsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNhID0gc2EgJiAweDBGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JUFNEU1BfU1BMSVQzMl8xNihydCwgcnRoLCBydGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0aCA9IG1pcHNkc3BfIyNmdW5jKHJ0aCwgc2EpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0bCA9IG1pcHNkc3BfIyNmdW5jKHJ0bCwgc2EpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjMyXzE2KHJ0aCwgcnRsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitTSElGVF9QSChzaHJsLCByc2hpZnRfdTE2KTsKK1NISUZUX1BIKHNocmEsIHJhc2hpZnQxNik7CitTSElGVF9QSChzaHJhX3IsIHJuZDE2X3Jhc2hpZnQpOworCisjdW5kZWYgU0hJRlRfUEgKKworLyoqIERTUCBNdWx0aXBseSBTdWItY2xhc3MgaW5zbnMgKiovCisvKiBSZXR1cm4gdmFsdWUgbWFkZSB1cCBieSB0d28gMTZiaXRzIHZhbHVlLgorICogRklYTUUgZ2l2ZSB0aGUgbWFjcm8gYSBiZXR0ZXIgbmFtZS4KKyAqLworI2RlZmluZSBNVUxfUkVUVVJOMzJfMTZfUEgobmFtZSwgZnVuYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNtb3YxLCByc21vdjIsIHJzZmlsdGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBydG1vdjEsIHJ0bW92MiwgcnRmaWx0ZXIpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCByc0IsIHJzQSwgcnRCLCBydEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzQiA9IChycyA+PiByc21vdjEpICYgcnNmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0EgPSAocnMgPj4gcnNtb3YyKSAmIHJzZmlsdGVyOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRCID0gKHJ0ID4+IHJ0bW92MSkgJiBydGZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0QSA9IChydCA+PiBydG1vdjIpICYgcnRmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNCID0gbWlwc2RzcF8jI2Z1bmMocnNCLCBydEIsIGVudik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzQSA9IG1pcHNkc3BfIyNmdW5jKHJzQSwgcnRBLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIE1JUFNEU1BfUkVUVVJOMzJfMTYocnNCLCByc0EpOyAgICAgICAgICAgICAgICAgICAgXAorfQorCitNVUxfUkVUVVJOMzJfMTZfUEgobXVsZXVfc19waF9xYmwsIG11bF91OF91MTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAyNCwgMTYsIE1JUFNEU1BfUTAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAxNiwgMCwgTUlQU0RTUF9MTyk7CitNVUxfUkVUVVJOMzJfMTZfUEgobXVsZXVfc19waF9xYnIsIG11bF91OF91MTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICA4LCAwLCBNSVBTRFNQX1EwLCBcCisgICAgICAgICAgICAgICAgICAgICAgMTYsIDAsIE1JUFNEU1BfTE8pOworTVVMX1JFVFVSTjMyXzE2X1BIKG11bHFfcnNfcGgsIHJuZHExNV9tdWxfcTE1X3ExNSwgXAorICAgICAgICAgICAgICAgICAgICAgIDE2LCAwLCBNSVBTRFNQX0xPLCBcCisgICAgICAgICAgICAgICAgICAgICAgMTYsIDAsIE1JUFNEU1BfTE8pOworTVVMX1JFVFVSTjMyXzE2X1BIKG11bF9waCwgbXVsX2kxNl9pMTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAxNiwgMCwgTUlQU0RTUF9MTywgXAorICAgICAgICAgICAgICAgICAgICAgIDE2LCAwLCBNSVBTRFNQX0xPKTsKK01VTF9SRVRVUk4zMl8xNl9QSChtdWxfc19waCwgc2F0MTZfbXVsX2kxNl9pMTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAxNiwgMCwgTUlQU0RTUF9MTywgXAorICAgICAgICAgICAgICAgICAgICAgIDE2LCAwLCBNSVBTRFNQX0xPKTsKK01VTF9SRVRVUk4zMl8xNl9QSChtdWxxX3NfcGgsIHNhdDE2X211bF9xMTVfcTE1LCBcCisgICAgICAgICAgICAgICAgICAgICAgMTYsIDAsIE1JUFNEU1BfTE8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAxNiwgMCwgTUlQU0RTUF9MTyk7CisKKyN1bmRlZiBNVUxfUkVUVVJOMzJfMTZfUEgKKworI2RlZmluZSBNVUxfUkVUVVJOMzJfMzJfcGgobmFtZSwgZnVuYywgbW92Yml0cykgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgcnNoLCBydGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzaCA9IChycyA+PiBtb3ZiaXRzKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydGggPSAocnQgPj4gbW92Yml0cykgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcCA9IG1pcHNkc3BfIyNmdW5jKHJzaCwgcnRoLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKShpbnQzMl90KXRlbXA7ICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01VTF9SRVRVUk4zMl8zMl9waChtdWxlcV9zX3dfcGhsLCBtdWxfcTE1X3ExNV9vdmVyZmxvd2ZsYWcyMSwgMTYpOworTVVMX1JFVFVSTjMyXzMyX3BoKG11bGVxX3Nfd19waHIsIG11bF9xMTVfcTE1X292ZXJmbG93ZmxhZzIxLCAwKTsKKworI3VuZGVmIE1VTF9SRVRVUk4zMl8zMl9waAorCisjZGVmaW5lIE1VTF9WT0lEX1BIKG5hbWUsIHVzZV9hY19lbnYpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh1aW50MzJfdCBhYywgdGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQxNl90IHJzaCwgcnNsLCBydGgsIHJ0bDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDY0X3QgYWNjLCBkb3RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDMyXzE2KHJzLCByc2gsIHJzbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1JUFNEU1BfU1BMSVQzMl8xNihydCwgcnRoLCBydGwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHVzZV9hY19lbnYgPT0gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQiA9IG1pcHNkc3BfbXVsX3ExNV9xMTUoYWMsIHJzaCwgcnRoLCBlbnYpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByc2wsIHJ0bCwgZW52KTsgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQiA9IG1pcHNkc3BfbXVsX3UxNl91MTYocnNoLCBydGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEEgPSBtaXBzZHNwX211bF91MTZfdTE2KHJzbCwgcnRsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3RwID0gKGludDY0X3QpdGVtcEIgLSAoaW50NjRfdCl0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuTE9bYWNdICYgTUlQU0RTUF9MTE8pOyAgICAgICAgICAgICAgIFwKKyAgICBkb3RwID0gZG90cCArIGFjYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZG90cCAmIE1JUFNEU1BfTEhJKSA+PiAzMik7ICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSAodGFyZ2V0X2xvbmcpKGludDMyX3QpKGRvdHAgJiBNSVBTRFNQX0xMTyk7ICBcCit9CisKK01VTF9WT0lEX1BIKG11bHNhcV9zX3dfcGgsIDEpOworTVVMX1ZPSURfUEgobXVsc2Ffd19waCwgMCk7CisKKyN1bmRlZiBNVUxfVk9JRF9QSAorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBNVUxfUkVUVVJONjRfMTZfUUgobmFtZSwgZnVuYywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNtb3YxLCByc21vdjIsIHJzbW92MywgcnNtb3Y0LCByc2ZpbHRlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRtb3YxLCBydG1vdjIsIHJ0bW92MywgcnRtb3Y0LCBydGZpbHRlcikgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJzMywgcnMyLCByczEsIHJzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJ0MywgcnQyLCBydDEsIHJ0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzMyA9IChycyA+PiByc21vdjEpICYgcnNmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzMiA9IChycyA+PiByc21vdjIpICYgcnNmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzMSA9IChycyA+PiByc21vdjMpICYgcnNmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzMCA9IChycyA+PiByc21vdjQpICYgcnNmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0MyA9IChydCA+PiBydG1vdjEpICYgcnRmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0MiA9IChydCA+PiBydG1vdjIpICYgcnRmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0MSA9IChydCA+PiBydG1vdjMpICYgcnRmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0MCA9IChydCA+PiBydG1vdjQpICYgcnRmaWx0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBEID0gbWlwc2RzcF8jI2Z1bmMocnMzLCBydDMsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBDID0gbWlwc2RzcF8jI2Z1bmMocnMyLCBydDIsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBCID0gbWlwc2RzcF8jI2Z1bmMocnMxLCBydDEsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gbWlwc2RzcF8jI2Z1bmMocnMwLCBydDAsIGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBNSVBTRFNQX1JFVFVSTjY0XzE2KHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBKTsgICAgICAgICAgXAorfQorCitNVUxfUkVUVVJONjRfMTZfUUgobXVsZXVfc19xaF9vYmwsIG11bF91OF91MTYsIFwKKyAgICAgICAgICAgICAgICAgICA1NiwgNDgsIDQwLCAzMiwgTUlQU0RTUF9RMCwgXAorICAgICAgICAgICAgICAgICAgIDQ4LCAzMiwgMTYsIDAsIE1JUFNEU1BfTE8pOworTVVMX1JFVFVSTjY0XzE2X1FIKG11bGV1X3NfcWhfb2JyLCBtdWxfdThfdTE2LCBcCisgICAgICAgICAgICAgICAgICAgMjQsIDE2LCA4LCAwLCBNSVBTRFNQX1EwLCBcCisgICAgICAgICAgICAgICAgICAgNDgsIDMyLCAxNiwgMCwgTUlQU0RTUF9MTyk7CitNVUxfUkVUVVJONjRfMTZfUUgobXVscV9yc19xaCwgcm5kcTE1X211bF9xMTVfcTE1LCBcCisgICAgICAgICAgICAgICAgICAgNDgsIDMyLCAxNiwgMCwgTUlQU0RTUF9MTywgXAorICAgICAgICAgICAgICAgICAgIDQ4LCAzMiwgMTYsIDAsIE1JUFNEU1BfTE8pOworCisjdW5kZWYgTVVMX1JFVFVSTjY0XzE2X1FICisKKyNkZWZpbmUgTVVMX1JFVFVSTjY0XzMyX1FIKG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzbW92MSwgcnNtb3YyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBydG1vdjEsIHJ0bW92MikgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQxNl90IHJzQiwgcnNBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBydEIsIHJ0QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgdGVtcEIsIHRlbXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0IgPSAocnMgPj4gcnNtb3YxKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNBID0gKHJzID4+IHJzbW92MikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0QiA9IChydCA+PiBydG1vdjEpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydEEgPSAocnQgPj4gcnRtb3YyKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBCID0gbWlwc2RzcF9tdWxfcTE1X3ExNSg1LCByc0IsIHJ0QiwgZW52KTsgICAgICAgICAgIFwKKyAgICB0ZW1wQSA9IG1pcHNkc3BfbXVsX3ExNV9xMTUoNSwgcnNBLCBydEEsIGVudik7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHVpbnQ2NF90KXRlbXBCIDw8IDMyKSB8ICh1aW50NjRfdCl0ZW1wQTsgICAgICAgIFwKK30KKworTVVMX1JFVFVSTjY0XzMyX1FIKG11bGVxX3NfcHdfcWhsLCA0OCwgMzIsIDQ4LCAzMik7CitNVUxfUkVUVVJONjRfMzJfUUgobXVsZXFfc19wd19xaHIsIDE2LCAwLCAxNiwgMCk7CisKKyN1bmRlZiBNVUxfUkVUVVJONjRfMzJfUUgKKwordm9pZCBoZWxwZXJfbXVsc2FxX3Nfd19xaCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDE2X3QgcnMzLCByczIsIHJzMSwgcnMwOworICAgIGludDE2X3QgcnQzLCBydDIsIHJ0MSwgcnQwOworICAgIGludDMyX3QgdGVtcEQsIHRlbXBDLCB0ZW1wQiwgdGVtcEE7CisgICAgaW50NjRfdCBhY2NbMl07CisgICAgaW50NjRfdCB0ZW1wWzJdOworICAgIGludDY0X3QgdGVtcF9zdW07CisKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnMsIHJzMywgcnMyLCByczEsIHJzMCk7CisgICAgTUlQU0RTUF9TUExJVDY0XzE2KHJ0LCBydDMsIHJ0MiwgcnQxLCBydDApOworCisgICAgdGVtcEQgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczMsIHJ0MywgZW52KTsKKyAgICB0ZW1wQyA9IG1pcHNkc3BfbXVsX3ExNV9xMTUoYWMsIHJzMiwgcnQyLCBlbnYpOworICAgIHRlbXBCID0gbWlwc2RzcF9tdWxfcTE1X3ExNShhYywgcnMxLCBydDEsIGVudik7CisgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczAsIHJ0MCwgZW52KTsKKworICAgIHRlbXBbMF0gPSAoKGludDMyX3QpdGVtcEQgLSAoaW50MzJfdCl0ZW1wQykgKworICAgICAgICAgICAgICAoKGludDMyX3QpdGVtcEIgLSAoaW50MzJfdCl0ZW1wQSk7CisgICAgdGVtcFswXSA9IChpbnQ2NF90KSh0ZW1wWzBdIDw8IDMwKSA+PiAzMDsKKyAgICBpZiAoKCh0ZW1wWzBdID4+IDMzKSAmIDB4MDEpID09IDApIHsKKyAgICAgICAgdGVtcFsxXSA9IDB4MDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcFsxXSA9IH4wdWxsOworICAgIH0KKworICAgIGFjY1swXSA9IGVudi0+YWN0aXZlX3RjLkxPW2FjXTsKKyAgICBhY2NbMV0gPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107CisKKyAgICB0ZW1wX3N1bSA9IGFjY1swXSArIHRlbXBbMF07CisgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJgorICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsKKyAgICAgICAgYWNjWzFdICs9IDE7CisgICAgfQorICAgIGFjY1swXSA9IHRlbXBfc3VtOworICAgIGFjY1sxXSArPSB0ZW1wWzFdOworCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gYWNjWzFdOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9IGFjY1swXTsKK30KKyNlbmRpZgorCisjZGVmaW5lIERQX1FCKG5hbWUsIGZ1bmMsIGlzX2FkZCwgcnNtb3YxLCByc21vdjIsIHJ0bW92MSwgcnRtb3YyKSBcCit2b2lkIGhlbHBlcl8jI25hbWUodWludDMyX3QgYWMsIHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCByczMsIHJzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgcnQzLCBydDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgdGVtcEMsIGRvdHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByczMgPSAocnMgPj4gcnNtb3YxKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnMyID0gKHJzID4+IHJzbW92MikgJiBNSVBTRFNQX1EwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0MyA9IChydCA+PiBydG1vdjEpICYgTUlQU0RTUF9RMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydDIgPSAocnQgPj4gcnRtb3YyKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEIgPSBtaXBzZHNwXyMjZnVuYyhyczMsIHJ0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gbWlwc2RzcF8jI2Z1bmMocnMyLCBydDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3RwID0gKGludDY0X3QpdGVtcEIgKyAoaW50NjRfdCl0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGlzX2FkZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQyA9ICgoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkhJW2FjXSA8PCAzMikgfCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiBNSVBTRFNQX0xMTykpICAgICAgICBcCisgICAgICAgICAgICArIGRvdHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSAoKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuTE9bYWNdICYgTUlQU0RTUF9MTE8pKSAgICAgICAgXAorICAgICAgICAgICAgLSBkb3RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudi0+YWN0aXZlX3RjLkhJW2FjXSA9ICh0YXJnZXRfbG9uZykoaW50MzJfdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRlbXBDICYgTUlQU0RTUF9MSEkpID4+IDMyKTsgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSh0ZW1wQyAmIE1JUFNEU1BfTExPKTsgXAorfQorCitEUF9RQihkcGF1X2hfcWJsLCBtdWxfdThfdTgsIDEsIDI0LCAxNiwgMjQsIDE2KTsKK0RQX1FCKGRwYXVfaF9xYnIsIG11bF91OF91OCwgMSwgOCwgMCwgOCwgMCk7CitEUF9RQihkcHN1X2hfcWJsLCBtdWxfdThfdTgsIDAsIDI0LCAxNiwgMjQsIDE2KTsKK0RQX1FCKGRwc3VfaF9xYnIsIG11bF91OF91OCwgMCwgOCwgMCwgOCwgMCk7CisKKyN1bmRlZiBEUF9RQgorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBEUF9PQihuYW1lLCBhZGRfc3ViLCBcCisgICAgICAgICAgICAgIHJzbW92MSwgcnNtb3YyLCByc21vdjMsIHJzbW92NCwgXAorICAgICAgICAgICAgICBydG1vdjEsIHJ0bW92MiwgcnRtb3YzLCBydG1vdjQpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHJzRCwgcnNDLCByc0IsIHJzQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHJ0RCwgcnRDLCBydEIsIHJ0QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCB0ZW1wRCwgdGVtcEMsIHRlbXBCLCB0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCBhY2NbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wX3N1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0QgPSAocnMgPj4gcnNtb3YxKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0MgPSAocnMgPj4gcnNtb3YyKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0IgPSAocnMgPj4gcnNtb3YzKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0EgPSAocnMgPj4gcnNtb3Y0KSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydEQgPSAocnQgPj4gcnRtb3YxKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydEMgPSAocnQgPj4gcnRtb3YyKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydEIgPSAocnQgPj4gcnRtb3YzKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydEEgPSAocnQgPj4gcnRtb3Y0KSAmIE1JUFNEU1BfUTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wRCA9IG1pcHNkc3BfbXVsX3U4X3U4KHJzRCwgcnREKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQyA9IG1pcHNkc3BfbXVsX3U4X3U4KHJzQywgcnRDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IG1pcHNkc3BfbXVsX3U4X3U4KHJzQiwgcnRCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQSA9IG1pcHNkc3BfbXVsX3U4X3U4KHJzQSwgcnRBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gKHVpbnQ2NF90KXRlbXBEICsgKHVpbnQ2NF90KXRlbXBDICsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICh1aW50NjRfdCl0ZW1wQiArICh1aW50NjRfdCl0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMF0gPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMV0gPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYWRkX3N1YikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gKyB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSArIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gLSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCh1aW50NjRfdCl0ZW1wX3N1bSA+ICh1aW50NjRfdClhY2NbMF0pIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSAtIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSB0ZW1wWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRFBfT0IoZHBhdV9oX29ibCwgMSwgNTYsIDQ4LCA0MCwgMzIsIDU2LCA0OCwgNDAsIDMyKTsKK0RQX09CKGRwYXVfaF9vYnIsIDEsIDI0LCAxNiwgOCwgMCwgMjQsIDE2LCA4LCAwKTsKK0RQX09CKGRwc3VfaF9vYmwsIDAsIDU2LCA0OCwgNDAsIDMyLCA1NiwgNDgsIDQwLCAzMik7CitEUF9PQihkcHN1X2hfb2JyLCAwLCAyNCwgMTYsIDgsIDAsIDI0LCAxNiwgOCwgMCk7CisKKyN1bmRlZiBEUF9PQgorI2VuZGlmCisKKyNkZWZpbmUgRFBfTk9GVU5DX1BIKG5hbWUsIGlzX2FkZCwgcnNtb3YxLCByc21vdjIsIHJ0bW92MSwgcnRtb3YyKSAgICAgICAgICAgICBcCit2b2lkIGhlbHBlcl8jI25hbWUodWludDMyX3QgYWMsIHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MTZfdCByc0IsIHJzQSwgcnRCLCBydEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDMyX3QgIHRlbXBBLCB0ZW1wQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90ICBhY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzQiA9IChycyA+PiByc21vdjEpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0EgPSAocnMgPj4gcnNtb3YyKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRCID0gKHJ0ID4+IHJ0bW92MSkgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0QSA9IChydCA+PiBydG1vdjIpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEIgPSAoaW50MzJfdClyc0IgKiAoaW50MzJfdClydEI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gKGludDMyX3QpcnNBICogKGludDMyX3QpcnRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuTE9bYWNdICYgTUlQU0RTUF9MTE8pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGlzX2FkZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhY2MgPSBhY2MgKyAoKGludDY0X3QpdGVtcEIgKyAoaW50NjRfdCl0ZW1wQSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFjYyA9IGFjYyAtICgoaW50NjRfdCl0ZW1wQiArIChpbnQ2NF90KXRlbXBBKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSgoYWNjICYgTUlQU0RTUF9MSEkpID4+IDMyKTsgXAorICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9ICh0YXJnZXRfbG9uZykoaW50MzJfdCkoYWNjICYgTUlQU0RTUF9MTE8pOyAgICAgICAgIFwKK30KKworRFBfTk9GVU5DX1BIKGRwYV93X3BoLCAxLCAxNiwgMCwgMTYsIDApOworRFBfTk9GVU5DX1BIKGRwYXhfd19waCwgMSwgMTYsIDAsIDAsIDE2KTsKK0RQX05PRlVOQ19QSChkcHNfd19waCwgMCwgMTYsIDAsIDE2LCAwKTsKK0RQX05PRlVOQ19QSChkcHN4X3dfcGgsIDAsIDE2LCAwLCAwLCAxNik7CisjdW5kZWYgRFBfTk9GVU5DX1BICisKKyNkZWZpbmUgRFBfSEFTRlVOQ19QSChuYW1lLCBpc19hZGQsIHJzbW92MSwgcnNtb3YyLCBydG1vdjEsIHJ0bW92MikgXAordm9pZCBoZWxwZXJfIyNuYW1lKHVpbnQzMl90IGFjLCB0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICBcCisgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgcnNCLCByc0EsIHJ0QiwgcnRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCB0ZW1wQiwgdGVtcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IGFjYywgZG90cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNCID0gKHJzID4+IHJzbW92MSkgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc0EgPSAocnMgPj4gcnNtb3YyKSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJ0QiA9IChydCA+PiBydG1vdjEpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRBID0gKHJ0ID4+IHJ0bW92MikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBCID0gbWlwc2RzcF9tdWxfcTE1X3ExNShhYywgcnNCLCBydEIsIGVudik7ICAgICAgICBcCisgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByc0EsIHJ0QSwgZW52KTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdHAgPSAoaW50NjRfdCl0ZW1wQiArIChpbnQ2NF90KXRlbXBBOyAgICAgICAgICAgICAgICBcCisgICAgYWNjID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgIFwKKyAgICAgICAgICAoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkxPW2FjXSAmIE1JUFNEU1BfTExPKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGlzX2FkZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWNjID0gYWNjICsgZG90cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFjYyA9IGFjYyAtIGRvdHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSAgICAgICAgIFwKKyAgICAgICAgKChhY2MgJiBNSVBTRFNQX0xISSkgPj4gMzIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9ICh0YXJnZXRfbG9uZykoaW50MzJfdCkgICAgICAgICBcCisgICAgICAgIChhY2MgJiBNSVBTRFNQX0xMTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRFBfSEFTRlVOQ19QSChkcGFxX3Nfd19waCwgMSwgMTYsIDAsIDE2LCAwKTsKK0RQX0hBU0ZVTkNfUEgoZHBhcXhfc193X3BoLCAxLCAxNiwgMCwgMCwgMTYpOworRFBfSEFTRlVOQ19QSChkcHNxX3Nfd19waCwgMCwgMTYsIDAsIDE2LCAwKTsKK0RQX0hBU0ZVTkNfUEgoZHBzcXhfc193X3BoLCAwLCAxNiwgMCwgMCwgMTYpOworCisjdW5kZWYgRFBfSEFTRlVOQ19QSAorCisjZGVmaW5lIERQXzEyOE9QRVJBVElPTl9QSChuYW1lLCBpc19hZGQpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh1aW50MzJfdCBhYywgdGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgcnNoLCByc2wsIHJ0aCwgcnRsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHRlbXBCLCB0ZW1wQSwgdGVtcEM2Ml8zMSwgdGVtcEM2MzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCBhY2MsIGRvdHAsIHRlbXBDOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUMzJfMTYocnMsIHJzaCwgcnNsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU0RTUF9TUExJVDMyXzE2KHJ0LCBydGgsIHJ0bCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQiA9IG1pcHNkc3BfbXVsX3ExNV9xMTUoYWMsIHJzaCwgcnRsLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByc2wsIHJ0aCwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3RwID0gKGludDY0X3QpdGVtcEIgKyAoaW50NjRfdCl0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuTE9bYWNdICYgTUlQU0RTUF9MTE8pOyAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaXNfYWRkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBDID0gYWNjICsgZG90cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSBhY2MgLSBkb3RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBDNjMgPSAodGVtcEMgPj4gNjMpICYgMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQzYyXzMxID0gKHRlbXBDID4+IDMxKSAmIDB4RkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgodGVtcEM2MyA9PSAwKSAmJiAodGVtcEM2Ml8zMSAhPSAweDAwMDAwMDAwKSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSAweDdGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMTYgKyBhYywgZW52KTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCh0ZW1wQzYzID09IDEpICYmICh0ZW1wQzYyXzMxICE9IDB4RkZGRkZGRkYpKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wQyA9IChpbnQ2NF90KShpbnQzMl90KTB4ODAwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAxNiArIGFjLCBlbnYpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSAodGFyZ2V0X2xvbmcpKGludDMyX3QpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgodGVtcEMgJiBNSVBTRFNQX0xISSkgPj4gMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9ICh0YXJnZXRfbG9uZykoaW50MzJfdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRlbXBDICYgTUlQU0RTUF9MTE8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RQXzEyOE9QRVJBVElPTl9QSChkcGFxeF9zYV93X3BoLCAxKTsKK0RQXzEyOE9QRVJBVElPTl9QSChkcHNxeF9zYV93X3BoLCAwKTsKKworI3VuZGVmIERQXzEyOE9QRVJBVElPTl9IUAorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBEUF9RSChuYW1lLCBpc19hZGQsIHVzZV9hY19lbnYpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsICAgIFwKKyAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJzMywgcnMyLCByczEsIHJzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJ0MywgcnQyLCBydDEsIHJ0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHRlbXBELCB0ZW1wQywgdGVtcEIsIHRlbXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IGFjY1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnMsIHJzMywgcnMyLCByczEsIHJzMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMTYocnQsIHJ0MywgcnQyLCBydDEsIHJ0MCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodXNlX2FjX2VudikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEQgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczMsIHJ0MywgZW52KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczIsIHJ0MiwgZW52KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEIgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczEsIHJ0MSwgZW52KTsgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByczAsIHJ0MCwgZW52KTsgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEQgPSBtaXBzZHNwX211bF91MTZfdTE2KHJzMywgcnQzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEMgPSBtaXBzZHNwX211bF91MTZfdTE2KHJzMiwgcnQyKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEIgPSBtaXBzZHNwX211bF91MTZfdTE2KHJzMSwgcnQxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEEgPSBtaXBzZHNwX211bF91MTZfdTE2KHJzMCwgcnQwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gKGludDY0X3QpdGVtcEQgKyAoaW50NjRfdCl0ZW1wQyArICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGludDY0X3QpdGVtcEIgKyAoaW50NjRfdCl0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodGVtcFswXSA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IH4wdWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMV0gPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMF0gPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaXNfYWRkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gKyB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSA9IGFjY1sxXSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSArIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gLSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCh1aW50NjRfdCl0ZW1wX3N1bSA+ICh1aW50NjRfdClhY2NbMF0pIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSA9IGFjY1sxXSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSAtIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSB0ZW1wWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRFBfUUgoZHBhX3dfcWgsIDEsIDApOworRFBfUUgoZHBhcV9zX3dfcWgsIDEsIDEpOworRFBfUUgoZHBzX3dfcWgsIDAsIDApOworRFBfUUgoZHBzcV9zX3dfcWgsIDAsIDEpOworCisjdW5kZWYgRFBfUUgKKworI2VuZGlmCisKKyNkZWZpbmUgRFBfTF9XKG5hbWUsIGlzX2FkZCkgXAordm9pZCBoZWxwZXJfIyNuYW1lKHVpbnQzMl90IGFjLCB0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDMyX3QgdGVtcDYzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCBkb3RwLCBhY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgb3ZlcmZsb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3RwID0gbWlwc2RzcF9tdWxfcTMxX3EzMShhYywgcnMsIHJ0LCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFjYyA9ICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuSElbYWNdIDw8IDMyKSB8ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiBNSVBTRFNQX0xMTyk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoaXNfYWRkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wID0gYWNjICsgZG90cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG92ZXJmbG93ID0gTUlQU0RTUF9PVkVSRkxPV19BREQoKHVpbnQ2NF90KWFjYywgKHVpbnQ2NF90KWRvdHAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCAoMHgwMXVsbCA8PCA2MykpOyAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXAgPSBhY2MgLSBkb3RwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb3ZlcmZsb3cgPSBNSVBTRFNQX09WRVJGTE9XX1NVQigodWludDY0X3QpYWNjLCAodWludDY0X3QpZG90cCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsICgweDAxdWxsIDw8IDYzKSk7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChvdmVyZmxvdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXA2MyA9ICh0ZW1wID4+IDYzKSAmIDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHRlbXA2MyA9PSAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9ICgweDAxdWxsIDw8IDYzKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXAgPSAweDAxdWxsIDw8IDYzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAxNiArIGFjLCBlbnYpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSAodGFyZ2V0X2xvbmcpKGludDMyX3QpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKHRlbXAgJiBNSVBTRFNQX0xISSkgPj4gMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHRlbXAgJiBNSVBTRFNQX0xMTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitEUF9MX1coZHBhcV9zYV9sX3csIDEpOworRFBfTF9XKGRwc3Ffc2FfbF93LCAwKTsKKworI3VuZGVmIERQX0xfVworCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBEUF9MX1BXKG5hbWUsIGZ1bmMpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsIFwKKyAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJzMSwgcnMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJ0MSwgcnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBCWzJdLCB0ZW1wQVsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IGFjY1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMzIocnMsIHJzMSwgcnMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMzIocnQsIHJ0MSwgcnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wQlswXSA9IG1pcHNkc3BfbXVsX3EzMV9xMzEoYWMsIHJzMSwgcnQxLCBlbnYpOyAgICAgICAgICAgIFwKKyAgICB0ZW1wQVswXSA9IG1pcHNkc3BfbXVsX3EzMV9xMzEoYWMsIHJzMCwgcnQwLCBlbnYpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodGVtcEJbMF0gPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEJbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEJbMV0gPSB+MHVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodGVtcEFbMF0gPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEFbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEFbMV0gPSB+MHVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wX3N1bSA9IHRlbXBCWzBdICsgdGVtcEFbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCh1aW50NjRfdCl0ZW1wX3N1bSA8ICh1aW50NjRfdCl0ZW1wQlswXSkgJiYgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50NjRfdCl0ZW1wX3N1bSA8ICh1aW50NjRfdCl0ZW1wQVswXSkpIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gdGVtcF9zdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzFdICs9IHRlbXBCWzFdICsgdGVtcEFbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtaXBzZHNwXyMjZnVuYyhhY2MsIGFjLCB0ZW1wLCBlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSBhY2NbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSBhY2NbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRFBfTF9QVyhkcGFxX3NhX2xfcHcsIHNhdDY0X2FjY19hZGRfcTYzKTsKK0RQX0xfUFcoZHBzcV9zYV9sX3B3LCBzYXQ2NF9hY2Nfc3ViX3E2Myk7CisKKyN1bmRlZiBEUF9MX1BXCisKK3ZvaWQgaGVscGVyX211bHNhcV9zX2xfcHcodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIHVpbnQzMl90IGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHJzMSwgcnMwOworICAgIGludDMyX3QgcnQxLCBydDA7CisgICAgaW50NjRfdCB0ZW1wQlsyXSwgdGVtcEFbMl07CisgICAgaW50NjRfdCB0ZW1wWzJdOworICAgIGludDY0X3QgYWNjWzJdOworICAgIGludDY0X3QgdGVtcF9zdW07CisKKyAgICByczEgPSAocnMgPj4gMzIpICYgTUlQU0RTUF9MTE87CisgICAgcnMwID0gcnMgJiBNSVBTRFNQX0xMTzsKKyAgICBydDEgPSAocnQgPj4gMzIpICYgTUlQU0RTUF9MTE87CisgICAgcnQwID0gcnQgJiBNSVBTRFNQX0xMTzsKKworICAgIHRlbXBCWzBdID0gbWlwc2RzcF9tdWxfcTMxX3EzMShhYywgcnMxLCBydDEsIGVudik7CisgICAgdGVtcEFbMF0gPSBtaXBzZHNwX211bF9xMzFfcTMxKGFjLCByczAsIHJ0MCwgZW52KTsKKworICAgIGlmICh0ZW1wQlswXSA+PSAwKSB7CisgICAgICAgIHRlbXBCWzFdID0gMHgwMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wQlsxXSA9IH4wdWxsOworICAgIH0KKworICAgIGlmICh0ZW1wQVswXSA+PSAwKSB7CisgICAgICAgIHRlbXBBWzFdID0gMHgwMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wQVsxXSA9IH4wdWxsOworICAgIH0KKworICAgIGFjY1swXSA9IGVudi0+YWN0aXZlX3RjLkxPW2FjXTsKKyAgICBhY2NbMV0gPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107CisKKyAgICB0ZW1wX3N1bSA9IHRlbXBCWzBdIC0gdGVtcEFbMF07CisgICAgaWYgKCh1aW50NjRfdCl0ZW1wX3N1bSA+ICh1aW50NjRfdCl0ZW1wQlswXSkgeworICAgICAgICB0ZW1wQlsxXSAtPSAxOworICAgIH0KKyAgICB0ZW1wWzBdID0gdGVtcF9zdW07CisgICAgdGVtcFsxXSA9IHRlbXBCWzFdIC0gdGVtcEFbMV07CisKKyAgICBpZiAoKHRlbXBbMV0gJiAweDAxKSA9PSAwKSB7CisgICAgICAgIHRlbXBbMV0gPSAweDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBbMV0gPSB+MHVsbDsKKyAgICB9CisKKyAgICB0ZW1wX3N1bSA9IGFjY1swXSArIHRlbXBbMF07CisgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJgorICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsKKyAgICAgICAgYWNjWzFdICs9IDE7CisgICAgfQorICAgIGFjY1swXSA9IHRlbXBfc3VtOworICAgIGFjY1sxXSArPSB0ZW1wWzFdOworCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gYWNjWzFdOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9IGFjY1swXTsKK30KKyNlbmRpZgorCisjZGVmaW5lIE1BUV9TX1cobmFtZSwgbW92KSBcCit2b2lkIGhlbHBlcl8jI25hbWUodWludDMyX3QgYWMsIHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCBcCisgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MTZfdCByc2gsIHJ0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCB0ZW1wQTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wTCwgYWNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNoID0gKHJzID4+IG1vdikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRoID0gKHJ0ID4+IG1vdikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEEgID0gbWlwc2RzcF9tdWxfcTE1X3ExNShhYywgcnNoLCBydGgsIGVudik7ICAgICAgICAgICAgICBcCisgICAgYWNjID0gKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5ISVthY10gPDwgMzIpIHwgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiBNSVBTRFNQX0xMTyk7ICAgICAgICBcCisgICAgdGVtcEwgID0gKGludDY0X3QpdGVtcEEgKyBhY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSAgICAgICAgICAgICAgICBcCisgICAgICAgICgodGVtcEwgJiBNSVBTRFNQX0xISSkgPj4gMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSAgICAgICAgICAgICAgICBcCisgICAgICAgICh0ZW1wTCAmIE1JUFNEU1BfTExPKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01BUV9TX1cobWFxX3Nfd19waGwsIDE2KTsKK01BUV9TX1cobWFxX3Nfd19waHIsIDApOworCisjdW5kZWYgTUFRX1NfVworCisjZGVmaW5lIE1BUV9TQV9XKG5hbWUsIG1vdikgXAordm9pZCBoZWxwZXJfIyNuYW1lKHVpbnQzMl90IGFjLCB0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgcnNoLCBydGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHRlbXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJzaCA9IChycyA+PiBtb3YpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydGggPSAocnQgPj4gbW92KSAmIE1JUFNEU1BfTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEEgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByc2gsIHJ0aCwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBBID0gbWlwc2RzcF9zYXQzMl9hY2NfcTMxKGFjLCB0ZW1wQSwgZW52KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZW52LT5hY3RpdmVfdGMuRFNQQ29udHJvbCAmICh0YXJnZXRfdWxvbmcpMSA8PCAoMTYgKyBhYykgKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSgoKGludDY0X3QpdGVtcEEgJiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVBTRFNQX0xISSkgPj4gMzIpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gKHRhcmdldF9sb25nKShpbnQzMl90KSgoaW50NjRfdCl0ZW1wQSAmICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlQU0RTUF9MTE8pOyAgICAgICAgIFwKK30KKworTUFRX1NBX1cobWFxX3NhX3dfcGhsLCAxNik7CitNQVFfU0FfVyhtYXFfc2Ffd19waHIsIDApOworCisjdW5kZWYgTUFRX1NBX1cKKworI2RlZmluZSBNVUxRX1cobmFtZSwgYWRkdmFyKSBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCByc190LCBydF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCB0ZW1wSTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNfdCA9IHJzICYgTUlQU0RTUF9MTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRfdCA9IHJ0ICYgTUlQU0RTUF9MTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChyc190ID09IDB4ODAwMDAwMDApICYmIChydF90ID09IDB4ODAwMDAwMDApKSB7ICAgICAgICBcCisgICAgICAgIHRlbXBMID0gMHg3RkZGRkZGRjAwMDAwMDAwdWxsOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjEsIGVudik7ICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBMICA9ICgoaW50NjRfdClyc190ICogKGludDY0X3QpcnRfdCkgPDwgMTsgICAgICAgICBcCisgICAgICAgIHRlbXBMICs9IGFkZHZhcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcEkgPSAodGVtcEwgJiBNSVBTRFNQX0xISSkgPj4gMzI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZykoaW50MzJfdCl0ZW1wSTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01VTFFfVyhtdWxxX3NfdywgMCk7CitNVUxRX1cobXVscV9yc193LCAweDgwMDAwMDAwdWxsKTsKKworI3VuZGVmIE1VTFFfVworCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorCisjZGVmaW5lIE1BUV9TX1dfUUgobmFtZSwgbW92KSBcCit2b2lkIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIHVpbnQzMl90IGFjLCBcCisgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MTZfdCByc190LCBydF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCB0ZW1wX211bDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCBhY2NbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wX3N1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFsxXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNfdCA9IChycyA+PiBtb3YpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRfdCA9IChydCA+PiBtb3YpICYgTUlQU0RTUF9MTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF9tdWwgPSBtaXBzZHNwX211bF9xMTVfcTE1KGFjLCByc190LCBydF90LCBlbnYpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFswXSA9IChpbnQ2NF90KXRlbXBfbXVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRlbXBbMF0gPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBbMV0gPSB+MHVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzBdID0gZW52LT5hY3RpdmVfdGMuTE9bYWNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzFdID0gZW52LT5hY3RpdmVfdGMuSElbYWNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF9zdW0gPSBhY2NbMF0gKyB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJiAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgIGFjY1sxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzBdID0gdGVtcF9zdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzFdICs9IHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gYWNjWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gYWNjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01BUV9TX1dfUUgobWFxX3Nfd19xaGxsLCA0OCk7CitNQVFfU19XX1FIKG1hcV9zX3dfcWhsciwgMzIpOworTUFRX1NfV19RSChtYXFfc193X3FocmwsIDE2KTsKK01BUV9TX1dfUUgobWFxX3Nfd19xaHJyLCAwKTsKKworI3VuZGVmIE1BUV9TX1dfUUgKKworI2RlZmluZSBNQVFfU0FfVyhuYW1lLCBtb3YpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsIFwKKyAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQxNl90IHJzX3QsIHJ0X3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IGFjY1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByc190ID0gKHJzID4+IG1vdikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBydF90ID0gKHJ0ID4+IG1vdikgJiBNSVBTRFNQX0xPOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wID0gbWlwc2RzcF9tdWxfcTE1X3ExNShhYywgcnNfdCwgcnRfdCwgZW52KTsgICAgICAgICAgICAgIFwKKyAgICB0ZW1wID0gbWlwc2RzcF9zYXQzMl9hY2NfcTMxKGFjLCB0ZW1wLCBlbnYpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMF0gPSAoaW50NjRfdCkoaW50MzJfdCl0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYWNjWzBdID49IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWNjWzFdID0gMHgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYWNjWzFdID0gfjB1bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSBhY2NbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSBhY2NbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworTUFRX1NBX1cobWFxX3NhX3dfcWhsbCwgNDgpOworTUFRX1NBX1cobWFxX3NhX3dfcWhsciwgMzIpOworTUFRX1NBX1cobWFxX3NhX3dfcWhybCwgMTYpOworTUFRX1NBX1cobWFxX3NhX3dfcWhyciwgMCk7CisKKyN1bmRlZiBNQVFfU0FfVworCisjZGVmaW5lIE1BUV9TX0xfUFcobmFtZSwgbW92KSBcCit2b2lkIGhlbHBlcl8jI25hbWUodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgcnQsIHVpbnQzMl90IGFjLCBcCisgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50MzJfdCByc190LCBydF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCBhY2NbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50NjRfdCB0ZW1wX3N1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFswXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFsxXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnNfdCA9IChycyA+PiBtb3YpICYgTUlQU0RTUF9MTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcnRfdCA9IChydCA+PiBtb3YpICYgTUlQU0RTUF9MTE87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcFswXSA9IG1pcHNkc3BfbXVsX3EzMV9xMzEoYWMsIHJzX3QsIHJ0X3QsIGVudik7ICAgICAgICAgICBcCisgICAgaWYgKHRlbXBbMF0gPj0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBbMV0gPSB+MHVsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzBdID0gZW52LT5hY3RpdmVfdGMuTE9bYWNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzFdID0gZW52LT5hY3RpdmVfdGMuSElbYWNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcF9zdW0gPSBhY2NbMF0gKyB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJiAgICAgICAgICAgICAgICBcCisgICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsgICAgICAgICAgICAgICBcCisgICAgICAgIGFjY1sxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzBdID0gdGVtcF9zdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWNjWzFdICs9IHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gYWNjWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52LT5hY3RpdmVfdGMuTE9bYWNdID0gYWNjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK01BUV9TX0xfUFcobWFxX3NfbF9wd2wsIDMyKTsKK01BUV9TX0xfUFcobWFxX3NfbF9wd3IsIDApOworCisjdW5kZWYgTUFRX1NfTF9QVworCisjZGVmaW5lIERNX09QRVJBVEUobmFtZSwgZnVuYywgaXNfYWRkLCBzaWdleHQpIFwKK3ZvaWQgaGVscGVyXyMjbmFtZSh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCwgdWludDMyX3QgYWMsICAgIFwKKyAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJzMSwgcnMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQzMl90IHJ0MSwgcnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBCTFsyXSwgdGVtcEFMWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IGFjY1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQ2NF90IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gMHgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzFdID0gMHgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMzIocnMsIHJzMSwgcnMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNSVBTRFNQX1NQTElUNjRfMzIocnQsIHJ0MSwgcnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc2lnZXh0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEJMWzBdID0gKGludDY0X3QpbWlwc2RzcF8jI2Z1bmMocnMxLCBydDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEFMWzBdID0gKGludDY0X3QpbWlwc2RzcF8jI2Z1bmMocnMwLCBydDApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHRlbXBCTFswXSA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBCTFsxXSA9IDB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBCTFsxXSA9IH4wdWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHRlbXBBTFswXSA+PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBBTFsxXSA9IDB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBBTFsxXSA9IH4wdWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEJMWzBdID0gbWlwc2RzcF8jI2Z1bmMocnMxLCBydDEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEFMWzBdID0gbWlwc2RzcF8jI2Z1bmMocnMwLCBydDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEJMWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcEFMWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMV0gPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhY2NbMF0gPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wX3N1bSA9IHRlbXBCTFswXSArIHRlbXBBTFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCh1aW50NjRfdCl0ZW1wX3N1bSA8ICh1aW50NjRfdCl0ZW1wQkxbMF0pICYmICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCh1aW50NjRfdCl0ZW1wX3N1bSA8ICh1aW50NjRfdCl0ZW1wQUxbMF0pKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzBdID0gdGVtcF9zdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wWzFdICs9IHRlbXBCTFsxXSArIHRlbXBBTFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoaXNfYWRkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gKyB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpYWNjWzBdKSAmJiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgodWludDY0X3QpdGVtcF9zdW0gPCAodWludDY0X3QpdGVtcFswXSkpIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSArIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF9zdW0gPSBhY2NbMF0gLSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCh1aW50NjRfdCl0ZW1wX3N1bSA+ICh1aW50NjRfdClhY2NbMF0pIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY1sxXSAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFswXSA9IHRlbXBfc3VtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcFsxXSA9IGFjY1sxXSAtIHRlbXBbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY10gPSB0ZW1wWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmFjdGl2ZV90Yy5MT1thY10gPSB0ZW1wWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRE1fT1BFUkFURShkbWFkZCwgbXVsX2kzMl9pMzIsIDEsIDEpOworRE1fT1BFUkFURShkbWFkZHUsIG11bF91MzJfdTMyLCAxLCAwKTsKK0RNX09QRVJBVEUoZG1zdWIsIG11bF9pMzJfaTMyLCAwLCAxKTsKK0RNX09QRVJBVEUoZG1zdWJ1LCBtdWxfdTMyX3UzMiwgMCwgMCk7CisjdW5kZWYgRE1fT1BFUkFURQorI2VuZGlmCisKKy8qKiBEU1AgQml0L01hbmlwdWxhdGlvbiBTdWItY2xhc3MgaW5zbnMgKiovCit0YXJnZXRfdWxvbmcgaGVscGVyX2JpdHJldih0YXJnZXRfdWxvbmcgcnQpCit7CisgICAgaW50MzJfdCB0ZW1wOworICAgIHVpbnQzMl90IHJkOworICAgIGludCBpOworCisgICAgdGVtcCA9IHJ0ICYgTUlQU0RTUF9MTzsKKyAgICByZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgcmQgPSAocmQgPDwgMSkgfCAodGVtcCAmIDEpOworICAgICAgICB0ZW1wID0gdGVtcCA+PiAxOworICAgIH0KKworICAgIHJldHVybiAodGFyZ2V0X3Vsb25nKXJkOworfQorCisjZGVmaW5lIEJJVF9JTlNWKG5hbWUsIHBvc2ZpbHRlciwgcmV0X3R5cGUpICAgICAgICAgICAgICAgICAgICAgXAordGFyZ2V0X3Vsb25nIGhlbHBlcl8jI25hbWUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBycywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBydCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHBvcywgc2l6ZSwgbXNiLCBsc2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBjb25zdCBzaXplZmlsdGVyID0gMHgzRjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0X3Vsb25nIHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhcmdldF91bG9uZyBkc3BjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHNwYyA9IGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwb3MgID0gZHNwYyAmIHBvc2ZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZSA9IChkc3BjID4+IDcpICYgc2l6ZWZpbHRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtc2IgID0gcG9zICsgc2l6ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbHNiICA9IHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobHNiID4gbXNiIHx8IChtc2IgPiBUQVJHRVRfTE9OR19CSVRTKSkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcCA9IGRlcG9zaXQ2NChydCwgcG9zLCBzaXplLCBycyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKShyZXRfdHlwZSl0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0JJVF9JTlNWKGluc3YsIDB4MUYsIGludDMyX3QpOworI2lmZGVmIFRBUkdFVF9NSVBTNjQKK0JJVF9JTlNWKGRpbnN2LCAweDdGLCB0YXJnZXRfbG9uZyk7CisjZW5kaWYKKworI3VuZGVmIEJJVF9JTlNWCisKKworLyoqIERTUCBDb21wYXJlLVBpY2sgU3ViLWNsYXNzIGluc25zICoqLworI2RlZmluZSBDTVBfSEFTX1JFVChuYW1lLCBmdW5jLCBzcGxpdF9udW0sIGZpbHRlciwgYml0X3NpemUpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCByc190LCBydF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QgY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgdGVtcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IHNwbGl0X251bTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnNfdCA9IChycyA+PiAoYml0X3NpemUgKiBpKSkgJiBmaWx0ZXI7ICAgICAgICAgXAorICAgICAgICBydF90ID0gKHJ0ID4+IChiaXRfc2l6ZSAqIGkpKSAmIGZpbHRlcjsgICAgICAgICBcCisgICAgICAgIGNjID0gbWlwc2RzcF8jI2Z1bmMocnNfdCwgcnRfdCk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcCB8PSBjYyA8PCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHRhcmdldF91bG9uZyl0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitDTVBfSEFTX1JFVChjbXBndV9lcV9xYiwgY21wdV9lcSwgNCwgTUlQU0RTUF9RMCwgOCk7CitDTVBfSEFTX1JFVChjbXBndV9sdF9xYiwgY21wdV9sdCwgNCwgTUlQU0RTUF9RMCwgOCk7CitDTVBfSEFTX1JFVChjbXBndV9sZV9xYiwgY21wdV9sZSwgNCwgTUlQU0RTUF9RMCwgOCk7CisKKyNpZmRlZiBUQVJHRVRfTUlQUzY0CitDTVBfSEFTX1JFVChjbXBndV9lcV9vYiwgY21wdV9lcSwgOCwgTUlQU0RTUF9RMCwgOCk7CitDTVBfSEFTX1JFVChjbXBndV9sdF9vYiwgY21wdV9sdCwgOCwgTUlQU0RTUF9RMCwgOCk7CitDTVBfSEFTX1JFVChjbXBndV9sZV9vYiwgY21wdV9sZSwgOCwgTUlQU0RTUF9RMCwgOCk7CisjZW5kaWYKKworI3VuZGVmIENNUF9IQVNfUkVUCisKKworI2RlZmluZSBDTVBfTk9fUkVUKG5hbWUsIGZ1bmMsIHNwbGl0X251bSwgZmlsdGVyLCBiaXRfc2l6ZSkgXAordm9pZCBoZWxwZXJfIyNuYW1lKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCMjYml0X3NpemUjI190IHJzX3QsIHJ0X3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCMjYml0X3NpemUjI190IGZsYWcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCMjYml0X3NpemUjI190IGNjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBzcGxpdF9udW07IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByc190ID0gKHJzID4+IChiaXRfc2l6ZSAqIGkpKSAmIGZpbHRlcjsgICAgICAgICAgICAgXAorICAgICAgICBydF90ID0gKHJ0ID4+IChiaXRfc2l6ZSAqIGkpKSAmIGZpbHRlcjsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYyA9IG1pcHNkc3BfIyNmdW5jKChpbnQzMl90KXJzX3QsIChpbnQzMl90KXJ0X3QpOyAgXAorICAgICAgICBmbGFnIHw9IGNjIDw8IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF9EU1BDb250cm9sXzI0KGZsYWcsIHNwbGl0X251bSwgZW52KTsgICAgICAgICAgICAgICAgXAorfQorCitDTVBfTk9fUkVUKGNtcHVfZXFfcWIsIGNtcHVfZXEsIDQsIE1JUFNEU1BfUTAsIDgpOworQ01QX05PX1JFVChjbXB1X2x0X3FiLCBjbXB1X2x0LCA0LCBNSVBTRFNQX1EwLCA4KTsKK0NNUF9OT19SRVQoY21wdV9sZV9xYiwgY21wdV9sZSwgNCwgTUlQU0RTUF9RMCwgOCk7CisKK0NNUF9OT19SRVQoY21wX2VxX3BoLCBjbXBfZXEsIDIsIE1JUFNEU1BfTE8sIDE2KTsKK0NNUF9OT19SRVQoY21wX2x0X3BoLCBjbXBfbHQsIDIsIE1JUFNEU1BfTE8sIDE2KTsKK0NNUF9OT19SRVQoY21wX2xlX3BoLCBjbXBfbGUsIDIsIE1JUFNEU1BfTE8sIDE2KTsKKworI2lmZGVmIFRBUkdFVF9NSVBTNjQKK0NNUF9OT19SRVQoY21wdV9lcV9vYiwgY21wdV9lcSwgOCwgTUlQU0RTUF9RMCwgOCk7CitDTVBfTk9fUkVUKGNtcHVfbHRfb2IsIGNtcHVfbHQsIDgsIE1JUFNEU1BfUTAsIDgpOworQ01QX05PX1JFVChjbXB1X2xlX29iLCBjbXB1X2xlLCA4LCBNSVBTRFNQX1EwLCA4KTsKKworQ01QX05PX1JFVChjbXBfZXFfcWgsIGNtcF9lcSwgNCwgTUlQU0RTUF9MTywgMTYpOworQ01QX05PX1JFVChjbXBfbHRfcWgsIGNtcF9sdCwgNCwgTUlQU0RTUF9MTywgMTYpOworQ01QX05PX1JFVChjbXBfbGVfcWgsIGNtcF9sZSwgNCwgTUlQU0RTUF9MTywgMTYpOworCitDTVBfTk9fUkVUKGNtcF9lcV9wdywgY21wX2VxLCAyLCBNSVBTRFNQX0xMTywgMzIpOworQ01QX05PX1JFVChjbXBfbHRfcHcsIGNtcF9sdCwgMiwgTUlQU0RTUF9MTE8sIDMyKTsKK0NNUF9OT19SRVQoY21wX2xlX3B3LCBjbXBfbGUsIDIsIE1JUFNEU1BfTExPLCAzMik7CisjZW5kaWYKKyN1bmRlZiBDTVBfTk9fUkVUCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisKKyNkZWZpbmUgQ01QR0RVX09CKG5hbWUpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfY21wZ2R1XyMjbmFtZSMjX29iKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90IHJzX3QsIHJ0X3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBjb25kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnNfdCA9IChycyA+PiAoOCAqIGkpKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgIFwKKyAgICAgICAgcnRfdCA9IChydCA+PiAoOCAqIGkpKSAmIE1JUFNEU1BfUTA7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1pcHNkc3BfY21wdV8jI25hbWUocnNfdCwgcnRfdCkpIHsgICAgICAgIFwKKyAgICAgICAgICAgIGNvbmQgfD0gMHgwMSA8PCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzZXRfRFNQQ29udHJvbF8yNChjb25kLCA4LCBlbnYpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHVpbnQ2NF90KWNvbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQ01QR0RVX09CKGVxKQorQ01QR0RVX09CKGx0KQorQ01QR0RVX09CKGxlKQorI3VuZGVmIENNUEdEVV9PQgorI2VuZGlmCisKKyNkZWZpbmUgUElDS19JTlNOKG5hbWUsIHNwbGl0X251bSwgZmlsdGVyLCBiaXRfc2l6ZSwgcmV0MzJiaXQpIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lKHRhcmdldF91bG9uZyBycywgdGFyZ2V0X3Vsb25nIHJ0LCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCByc190LCBydF90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBjYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXJnZXRfdWxvbmcgZHNwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YXJnZXRfdWxvbmcgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3AgPSBlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3BsaXRfbnVtOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnNfdCA9IChycyA+PiAoYml0X3NpemUgKiBpKSkgJiBmaWx0ZXI7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcnRfdCA9IChydCA+PiAoYml0X3NpemUgKiBpKSkgJiBmaWx0ZXI7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2MgPSAoZHNwID4+ICgyNCArIGkpKSAmIDB4MDE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2MgPSBjYyA9PSAxID8gcnNfdCA6IHJ0X3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzdWx0IHw9ICh0YXJnZXRfdWxvbmcpY2MgPDwgKGJpdF9zaXplICogaSk7ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmV0MzJiaXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmVzdWx0ID0gKHRhcmdldF9sb25nKShpbnQzMl90KShyZXN1bHQgJiBNSVBTRFNQX0xMTyk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUElDS19JTlNOKHBpY2tfcWIsIDQsIE1JUFNEU1BfUTAsIDgsIDEpOworUElDS19JTlNOKHBpY2tfcGgsIDIsIE1JUFNEU1BfTE8sIDE2LCAxKTsKKworI2lmZGVmIFRBUkdFVF9NSVBTNjQKK1BJQ0tfSU5TTihwaWNrX29iLCA4LCBNSVBTRFNQX1EwLCA4LCAwKTsKK1BJQ0tfSU5TTihwaWNrX3FoLCA0LCBNSVBTRFNQX0xPLCAxNiwgMCk7CitQSUNLX0lOU04ocGlja19wdywgMiwgTUlQU0RTUF9MTE8sIDMyLCAwKTsKKyNlbmRpZgorI3VuZGVmIFBJQ0tfSU5TTgorCit0YXJnZXRfdWxvbmcgaGVscGVyX3BhY2tybF9waCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkKK3sKKyAgICB1aW50MzJfdCByc2wsIHJ0aDsKKworICAgIHJzbCA9ICBycyAmIE1JUFNEU1BfTE87CisgICAgcnRoID0gKHJ0ICYgTUlQU0RTUF9ISSkgPj4gMTY7CisKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKShpbnQzMl90KSgocnNsIDw8IDE2KSB8IHJ0aCk7Cit9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCit0YXJnZXRfdWxvbmcgaGVscGVyX3BhY2tybF9wdyh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBydCkKK3sKKyAgICB1aW50MzJfdCByczAsIHJ0MTsKKworICAgIHJzMCA9IHJzICYgTUlQU0RTUF9MTE87CisgICAgcnQxID0gKHJ0ID4+IDMyKSAmIE1JUFNEU1BfTExPOworCisgICAgcmV0dXJuICgodWludDY0X3QpcnMwIDw8IDMyKSB8ICh1aW50NjRfdClydDE7Cit9CisjZW5kaWYKKworLyoqIERTUCBBY2N1bXVsYXRvciBhbmQgRFNQQ29udHJvbCBBY2Nlc3MgU3ViLWNsYXNzIGluc25zICoqLwordGFyZ2V0X3Vsb25nIGhlbHBlcl9leHRyX3codGFyZ2V0X3Vsb25nIGFjLCB0YXJnZXRfdWxvbmcgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQzMl90IHRlbXBJOworICAgIGludDY0X3QgdGVtcERMWzJdOworCisgICAgc2hpZnQgPSBzaGlmdCAmIDB4MUY7CisKKyAgICBtaXBzZHNwX3JuZHJhc2hpZnRfc2hvcnRfYWNjKHRlbXBETCwgYWMsIHNoaWZ0LCBlbnYpOworICAgIGlmICgoKHRlbXBETFsxXSAmIDB4MDEpICE9IDAgfHwgKHRlbXBETFswXSAmIE1JUFNEU1BfTEhJKSAhPSAwKSAmJgorICAgICAgICAoKHRlbXBETFsxXSAmIDB4MDEpICE9IDEgfHwgKHRlbXBETFswXSAmIE1JUFNEU1BfTEhJKSAhPSBNSVBTRFNQX0xISSkpIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMywgZW52KTsKKyAgICB9CisKKyAgICB0ZW1wSSA9ICh0ZW1wRExbMF0gPj4gMSkgJiBNSVBTRFNQX0xMTzsKKworICAgIHRlbXBETFswXSArPSAxOworICAgIGlmICh0ZW1wRExbMF0gPT0gMCkgeworICAgICAgICB0ZW1wRExbMV0gKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAwIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gMCkgJiYKKyAgICAgICAgKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAxIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gTUlQU0RTUF9MSEkpKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZyl0ZW1wSTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9leHRyX3Jfdyh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50NjRfdCB0ZW1wRExbMl07CisKKyAgICBzaGlmdCA9IHNoaWZ0ICYgMHgxRjsKKworICAgIG1pcHNkc3Bfcm5kcmFzaGlmdF9zaG9ydF9hY2ModGVtcERMLCBhYywgc2hpZnQsIGVudik7CisgICAgaWYgKCgodGVtcERMWzFdICYgMHgwMSkgIT0gMCB8fCAodGVtcERMWzBdICYgTUlQU0RTUF9MSEkpICE9IDApICYmCisgICAgICAgICgodGVtcERMWzFdICYgMHgwMSkgIT0gMSB8fCAodGVtcERMWzBdICYgTUlQU0RTUF9MSEkpICE9IE1JUFNEU1BfTEhJKSkgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIzLCBlbnYpOworICAgIH0KKworICAgIHRlbXBETFswXSArPSAxOworICAgIGlmICh0ZW1wRExbMF0gPT0gMCkgeworICAgICAgICB0ZW1wRExbMV0gKz0gMTsKKyAgICB9CisKKyAgICBpZiAoKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAwIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gMCkgJiYKKyAgICAgICAgKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAxIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gTUlQU0RTUF9MSEkpKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuICh0YXJnZXRfbG9uZykoaW50MzJfdCkodGVtcERMWzBdID4+IDEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2V4dHJfcnNfdyh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDMyX3QgdGVtcEksIHRlbXA2NDsKKyAgICBpbnQ2NF90IHRlbXBETFsyXTsKKworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDFGOworCisgICAgbWlwc2RzcF9ybmRyYXNoaWZ0X3Nob3J0X2FjYyh0ZW1wREwsIGFjLCBzaGlmdCwgZW52KTsKKyAgICBpZiAoKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAwIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gMCkgJiYKKyAgICAgICAgKCh0ZW1wRExbMV0gJiAweDAxKSAhPSAxIHx8ICh0ZW1wRExbMF0gJiBNSVBTRFNQX0xISSkgIT0gTUlQU0RTUF9MSEkpKSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorICAgIHRlbXBETFswXSArPSAxOworICAgIGlmICh0ZW1wRExbMF0gPT0gMCkgeworICAgICAgICB0ZW1wRExbMV0gKz0gMTsKKyAgICB9CisgICAgdGVtcEkgPSB0ZW1wRExbMF0gPj4gMTsKKworICAgIGlmICgoKHRlbXBETFsxXSAmIDB4MDEpICE9IDAgfHwgKHRlbXBETFswXSAmIE1JUFNEU1BfTEhJKSAhPSAwKSAmJgorICAgICAgICAoKHRlbXBETFsxXSAmIDB4MDEpICE9IDEgfHwgKHRlbXBETFswXSAmIE1JUFNEU1BfTEhJKSAhPSBNSVBTRFNQX0xISSkpIHsKKyAgICAgICAgdGVtcDY0ID0gdGVtcERMWzFdICYgMHgwMTsKKyAgICAgICAgaWYgKHRlbXA2NCA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wSSA9IDB4N0ZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wSSA9IDB4ODAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMywgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKXRlbXBJOworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQordGFyZ2V0X3Vsb25nIGhlbHBlcl9kZXh0cl93KHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXBbM107CisKKyAgICBzaGlmdCA9IHNoaWZ0ICYgMHgzRjsKKworICAgIG1pcHNkc3Bfcm5kcmFzaGlmdF9hY2ModGVtcCwgYWMsIHNoaWZ0LCBlbnYpOworCisgICAgcmV0dXJuIChpbnQ2NF90KShpbnQzMl90KSh0ZW1wWzBdID4+IDEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2RleHRyX3Jfdyh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXBbM107CisgICAgdWludDMyX3QgdGVtcDEyODsKKworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDNGOworICAgIG1pcHNkc3Bfcm5kcmFzaGlmdF9hY2ModGVtcCwgYWMsIHNoaWZ0LCBlbnYpOworCisgICAgdGVtcFswXSArPSAxOworICAgIGlmICh0ZW1wWzBdID09IDApIHsKKyAgICAgICAgdGVtcFsxXSArPSAxOworICAgICAgICBpZiAodGVtcFsxXSA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wWzJdICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wMTI4ID0gdGVtcFsyXSAmIDB4MDE7CisKKyAgICBpZiAoKHRlbXAxMjggIT0gMCB8fCB0ZW1wWzFdICE9IDApICYmCisgICAgICAgKHRlbXAxMjggIT0gMSB8fCB0ZW1wWzFdICE9IH4wdWxsKSkgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIzLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiAoaW50NjRfdCkoaW50MzJfdCkodGVtcFswXSA+PiAxKTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9kZXh0cl9yc193KHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ2NF90IHRlbXBbM107CisgICAgdWludDMyX3QgdGVtcDEyODsKKworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDNGOworICAgIG1pcHNkc3Bfcm5kcmFzaGlmdF9hY2ModGVtcCwgYWMsIHNoaWZ0LCBlbnYpOworCisgICAgdGVtcFswXSArPSAxOworICAgIGlmICh0ZW1wWzBdID09IDApIHsKKyAgICAgICAgdGVtcFsxXSArPSAxOworICAgICAgICBpZiAodGVtcFsxXSA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wWzJdICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wMTI4ID0gdGVtcFsyXSAmIDB4MDE7CisKKyAgICBpZiAoKHRlbXAxMjggIT0gMCB8fCB0ZW1wWzFdICE9IDApICYmCisgICAgICAgKHRlbXAxMjggIT0gMSB8fCB0ZW1wWzFdICE9IH4wdWxsKSkgeworICAgICAgICBpZiAodGVtcDEyOCA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wWzBdID0gMHgwRkZGRkZGRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wWzBdID0gMHgwMTAwMDAwMDAwVUxMOworICAgICAgICB9CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQ2NF90KShpbnQzMl90KSh0ZW1wWzBdID4+IDEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2RleHRyX2wodGFyZ2V0X3Vsb25nIGFjLCB0YXJnZXRfdWxvbmcgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDY0X3QgdGVtcFszXTsKKyAgICB0YXJnZXRfdWxvbmcgcmVzdWx0OworCisgICAgc2hpZnQgPSBzaGlmdCAmIDB4M0Y7CisKKyAgICBtaXBzZHNwX3JuZHJhc2hpZnRfYWNjKHRlbXAsIGFjLCBzaGlmdCwgZW52KTsKKyAgICByZXN1bHQgPSAodGVtcFsxXSA8PCA2MykgfCAodGVtcFswXSA+PiAxKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZGV4dHJfcl9sKHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDY0X3QgdGVtcFszXTsKKyAgICB1aW50MzJfdCB0ZW1wMTI4OworICAgIHRhcmdldF91bG9uZyByZXN1bHQ7CisKKyAgICBzaGlmdCA9IHNoaWZ0ICYgMHgzRjsKKyAgICBtaXBzZHNwX3JuZHJhc2hpZnRfYWNjKHRlbXAsIGFjLCBzaGlmdCwgZW52KTsKKworICAgIHRlbXBbMF0gKz0gMTsKKyAgICBpZiAodGVtcFswXSA9PSAwKSB7CisgICAgICAgIHRlbXBbMV0gKz0gMTsKKyAgICAgICAgaWYgKHRlbXBbMV0gPT0gMCkgeworICAgICAgICAgICAgdGVtcFsyXSArPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgdGVtcDEyOCA9IHRlbXBbMl0gJiAweDAxOworCisgICAgaWYgKCh0ZW1wMTI4ICE9IDAgfHwgdGVtcFsxXSAhPSAwKSAmJgorICAgICAgICh0ZW1wMTI4ICE9IDEgfHwgdGVtcFsxXSAhPSB+MHVsbCkpIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMywgZW52KTsKKyAgICB9CisKKyAgICByZXN1bHQgPSAodGVtcFsxXSA8PCA2MykgfCAodGVtcFswXSA+PiAxKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZGV4dHJfcnNfbCh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB1aW50NjRfdCB0ZW1wWzNdOworICAgIHVpbnQzMl90IHRlbXAxMjg7CisgICAgdGFyZ2V0X3Vsb25nIHJlc3VsdDsKKworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDNGOworICAgIG1pcHNkc3Bfcm5kcmFzaGlmdF9hY2ModGVtcCwgYWMsIHNoaWZ0LCBlbnYpOworCisgICAgdGVtcFswXSArPSAxOworICAgIGlmICh0ZW1wWzBdID09IDApIHsKKyAgICAgICAgdGVtcFsxXSArPSAxOworICAgICAgICBpZiAodGVtcFsxXSA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wWzJdICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ZW1wMTI4ID0gdGVtcFsyXSAmIDB4MDE7CisKKyAgICBpZiAoKHRlbXAxMjggIT0gMCB8fCB0ZW1wWzFdICE9IDApICYmCisgICAgICAgKHRlbXAxMjggIT0gMSB8fCB0ZW1wWzFdICE9IH4wdWxsKSkgeworICAgICAgICBpZiAodGVtcDEyOCA9PSAwKSB7CisgICAgICAgICAgICB0ZW1wWzFdICY9IH4weDAwdWxsIC0gMTsKKyAgICAgICAgICAgIHRlbXBbMF0gfD0gfjB4MDB1bGwgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcFsxXSB8PSAweDAxOworICAgICAgICAgICAgdGVtcFswXSAmPSAweDAxOworICAgICAgICB9CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorICAgIHJlc3VsdCA9ICh0ZW1wWzFdIDw8IDYzKSB8ICh0ZW1wWzBdID4+IDEpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCit0YXJnZXRfdWxvbmcgaGVscGVyX2V4dHJfc19oKHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQ2NF90IHRlbXAsIGFjYzsKKworICAgIHNoaWZ0ID0gc2hpZnQgJiAweDFGOworCisgICAgYWNjID0gKChpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkhJW2FjXSA8PCAzMikgfAorICAgICAgICAgICgoaW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiAweEZGRkZGRkZGKTsKKworICAgIHRlbXAgPSBhY2MgPj4gc2hpZnQ7CisKKworICAgIGlmICh0ZW1wID4gKGludDY0X3QpMHg3RkZGKSB7CisgICAgICAgIHRlbXAgPSAweDAwMDA3RkZGOworICAgICAgICBzZXRfRFNQQ29udHJvbF9vdmVyZmxvd19mbGFnKDEsIDIzLCBlbnYpOworICAgIH0gZWxzZSBpZiAodGVtcCA8IChpbnQ2NF90KTB4RkZGRkZGRkZGRkZGODAwMFVMTCkgeworICAgICAgICB0ZW1wID0gMHhGRkZGODAwMDsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfb3ZlcmZsb3dfZmxhZygxLCAyMywgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gKHRhcmdldF9sb25nKShpbnQzMl90KSh0ZW1wICYgMHhGRkZGRkZGRik7Cit9CisKKworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK3RhcmdldF91bG9uZyBoZWxwZXJfZGV4dHJfc19oKHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50NjRfdCB0ZW1wWzJdOworICAgIHVpbnQzMl90IHRlbXAxMjc7CisKKyAgICBzaGlmdCA9IHNoaWZ0ICYgMHgxRjsKKworICAgIG1pcHNkc3BfcmFzaGlmdF9hY2MoKHVpbnQ2NF90ICopdGVtcCwgYWMsIHNoaWZ0LCBlbnYpOworCisgICAgdGVtcDEyNyA9ICh0ZW1wWzFdID4+IDYzKSAmIDB4MDE7CisKKyAgICBpZiAoKHRlbXAxMjcgPT0gMCkgJiYgKHRlbXBbMV0gPiAwIHx8IHRlbXBbMF0gPiAzMjc2NykpIHsKKyAgICAgICAgdGVtcFswXSAmPSAweEZGRkYwMDAwOworICAgICAgICB0ZW1wWzBdIHw9IDB4MDAwMDdGRkY7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfSBlbHNlIGlmICgodGVtcDEyNyA9PSAxKSAmJgorICAgICAgICAgICAgKHRlbXBbMV0gPCAweEZGRkZGRkZGRkZGRkZGRkZsbAorICAgICAgICAgICAgIHx8IHRlbXBbMF0gPCAweEZGRkZGRkZGRkZGRjEwMDBsbCkpIHsKKyAgICAgICAgdGVtcFswXSAmPSAweEZGRkYwMDAwOworICAgICAgICB0ZW1wWzBdIHw9IDB4MDAwMDgwMDA7CisgICAgICAgIHNldF9EU1BDb250cm9sX292ZXJmbG93X2ZsYWcoMSwgMjMsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQ2NF90KShpbnQxNl90KSh0ZW1wWzBdICYgTUlQU0RTUF9MTyk7Cit9CisKKyNlbmRpZgorCit0YXJnZXRfdWxvbmcgaGVscGVyX2V4dHAodGFyZ2V0X3Vsb25nIGFjLCB0YXJnZXRfdWxvbmcgc2l6ZSwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50MzJfdCBzdGFydF9wb3M7CisgICAgaW50IHN1YjsKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHVpbnQ2NF90IGFjYzsKKworICAgIHNpemUgPSBzaXplICYgMHgxRjsKKworICAgIHRlbXAgPSAwOworICAgIHN0YXJ0X3BvcyA9IGdldF9EU1BDb250cm9sX3BvcyhlbnYpOworICAgIHN1YiA9IHN0YXJ0X3BvcyAtIChzaXplICsgMSk7CisgICAgaWYgKHN1YiA+PSAtMSkgeworICAgICAgICBhY2MgPSAoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkhJW2FjXSA8PCAzMikgfAorICAgICAgICAgICAgICAoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkxPW2FjXSAmIE1JUFNEU1BfTExPKTsKKyAgICAgICAgdGVtcCA9IChhY2MgPj4gKHN0YXJ0X3BvcyAtIHNpemUpKSAmICh+MFUgPj4gKDMxIC0gc2l6ZSkpOworICAgICAgICBzZXRfRFNQQ29udHJvbF9lZmkoMCwgZW52KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9lZmkoMSwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gKHRhcmdldF91bG9uZyl0ZW1wOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2V4dHBkcCh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50MzJfdCBzdGFydF9wb3M7CisgICAgaW50IHN1YjsKKyAgICB1aW50MzJfdCB0ZW1wOworICAgIHVpbnQ2NF90IGFjYzsKKworICAgIHNpemUgPSBzaXplICYgMHgxRjsKKyAgICB0ZW1wID0gMDsKKyAgICBzdGFydF9wb3MgPSBnZXRfRFNQQ29udHJvbF9wb3MoZW52KTsKKyAgICBzdWIgPSBzdGFydF9wb3MgLSAoc2l6ZSArIDEpOworICAgIGlmIChzdWIgPj0gLTEpIHsKKyAgICAgICAgYWNjICA9ICgodWludDY0X3QpZW52LT5hY3RpdmVfdGMuSElbYWNdIDw8IDMyKSB8CisgICAgICAgICAgICAgICAoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkxPW2FjXSAmIE1JUFNEU1BfTExPKTsKKyAgICAgICAgdGVtcCA9IGV4dHJhY3Q2NChhY2MsIHN0YXJ0X3BvcyAtIHNpemUsIHNpemUgKyAxKTsKKworICAgICAgICBzZXRfRFNQQ29udHJvbF9wb3Moc3ViLCBlbnYpOworICAgICAgICBzZXRfRFNQQ29udHJvbF9lZmkoMCwgZW52KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRfRFNQQ29udHJvbF9lZmkoMSwgZW52KTsKKyAgICB9CisKKyAgICByZXR1cm4gKHRhcmdldF91bG9uZyl0ZW1wOworfQorCisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCit0YXJnZXRfdWxvbmcgaGVscGVyX2RleHRwKHRhcmdldF91bG9uZyBhYywgdGFyZ2V0X3Vsb25nIHNpemUsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCBzdGFydF9wb3M7CisgICAgaW50IGxlbjsKKyAgICBpbnQgc3ViOworICAgIHVpbnQ2NF90IHRlbXBCLCB0ZW1wQTsKKyAgICB1aW50NjRfdCB0ZW1wOworCisgICAgdGVtcCA9IDA7CisKKyAgICBzaXplID0gc2l6ZSAmIDB4M0Y7CisgICAgc3RhcnRfcG9zID0gZ2V0X0RTUENvbnRyb2xfcG9zKGVudik7CisgICAgbGVuID0gc3RhcnRfcG9zIC0gc2l6ZTsKKyAgICB0ZW1wQiA9IGVudi0+YWN0aXZlX3RjLkhJW2FjXTsKKyAgICB0ZW1wQSA9IGVudi0+YWN0aXZlX3RjLkxPW2FjXTsKKworICAgIHN1YiA9IHN0YXJ0X3BvcyAtIChzaXplICsgMSk7CisKKyAgICBpZiAoc3ViID49IC0xKSB7CisgICAgICAgIHRlbXAgPSAodGVtcEIgPDwgKDY0IC0gbGVuKSkgfCAodGVtcEEgPj4gbGVuKTsKKyAgICAgICAgdGVtcCA9IHRlbXAgJiAoKDB4MDEgPDwgKHNpemUgKyAxKSkgLSAxKTsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfZWZpKDAsIGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfZWZpKDEsIGVudik7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZGV4dHBkcCh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCBzdGFydF9wb3M7CisgICAgaW50IGxlbjsKKyAgICBpbnQgc3ViOworICAgIHVpbnQ2NF90IHRlbXBCLCB0ZW1wQTsKKyAgICB1aW50NjRfdCB0ZW1wOworCisgICAgdGVtcCA9IDA7CisgICAgc2l6ZSA9IHNpemUgJiAweDNGOworICAgIHN0YXJ0X3BvcyA9IGdldF9EU1BDb250cm9sX3BvcyhlbnYpOworICAgIGxlbiA9IHN0YXJ0X3BvcyAtIHNpemU7CisgICAgdGVtcEIgPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107CisgICAgdGVtcEEgPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107CisKKyAgICBzdWIgPSBzdGFydF9wb3MgLSAoc2l6ZSArIDEpOworCisgICAgaWYgKHN1YiA+PSAtMSkgeworICAgICAgICB0ZW1wID0gKHRlbXBCIDw8ICg2NCAtIGxlbikpIHwgKHRlbXBBID4+IGxlbik7CisgICAgICAgIHRlbXAgPSB0ZW1wICYgKCgweDAxIDw8IChzaXplICsgMSkpIC0gMSk7CisgICAgICAgIHNldF9EU1BDb250cm9sX3BvcyhzdWIsIGVudik7CisgICAgICAgIHNldF9EU1BDb250cm9sX2VmaSgwLCBlbnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9EU1BDb250cm9sX2VmaSgxLCBlbnYpOworICAgIH0KKworICAgIHJldHVybiB0ZW1wOworfQorCisjZW5kaWYKKwordm9pZCBoZWxwZXJfc2hpbG8odGFyZ2V0X3Vsb25nIGFjLCB0YXJnZXRfdWxvbmcgcnMsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDhfdCAgcnM1XzA7CisgICAgdWludDY0X3QgdGVtcCwgYWNjOworCisgICAgcnM1XzAgPSBycyAmIDB4M0Y7CisgICAgcnM1XzAgPSAoaW50OF90KShyczVfMCA8PCAyKSA+PiAyOworCisgICAgaWYgKHVubGlrZWx5KHJzNV8wID09IDApKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhY2MgICA9ICgoKHVpbnQ2NF90KWVudi0+YWN0aXZlX3RjLkhJW2FjXSA8PCAzMikgJiBNSVBTRFNQX0xISSkgfAorICAgICAgICAgICAgKCh1aW50NjRfdCllbnYtPmFjdGl2ZV90Yy5MT1thY10gJiBNSVBTRFNQX0xMTyk7CisKKyAgICBpZiAocnM1XzAgPiAwKSB7CisgICAgICAgIHRlbXAgPSBhY2MgPj4gcnM1XzA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVtcCA9IGFjYyA8PCAtcnM1XzA7CisgICAgfQorCisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF91bG9uZykoaW50MzJfdCkoKHRlbXAgJiBNSVBTRFNQX0xISSkgPj4gMzIpOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9ICh0YXJnZXRfdWxvbmcpKGludDMyX3QpKHRlbXAgJiBNSVBTRFNQX0xMTyk7Cit9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCit2b2lkIGhlbHBlcl9kc2hpbG8odGFyZ2V0X3Vsb25nIHNoaWZ0LCB0YXJnZXRfdWxvbmcgYWMsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludDhfdCBzaGlmdF90OworICAgIHVpbnQ2NF90IHRlbXBCLCB0ZW1wQTsKKworICAgIHNoaWZ0X3QgPSAoaW50OF90KShzaGlmdCA8PCAxKSA+PiAxOworCisgICAgdGVtcEIgPSBlbnYtPmFjdGl2ZV90Yy5ISVthY107CisgICAgdGVtcEEgPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107CisKKyAgICBpZiAoc2hpZnRfdCAhPSAwKSB7CisgICAgICAgIGlmIChzaGlmdF90ID49IDApIHsKKyAgICAgICAgICAgIHRlbXBBID0gKHRlbXBCIDw8ICg2NCAtIHNoaWZ0X3QpKSB8ICh0ZW1wQSA+PiBzaGlmdF90KTsKKyAgICAgICAgICAgIHRlbXBCID0gdGVtcEIgPj4gc2hpZnRfdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoaWZ0X3QgPSAtc2hpZnRfdDsKKyAgICAgICAgICAgIHRlbXBCID0gKHRlbXBCIDw8IHNoaWZ0X3QpIHwgKHRlbXBBID4+ICg2NCAtIHNoaWZ0X3QpKTsKKyAgICAgICAgICAgIHRlbXBBID0gdGVtcEEgPDwgc2hpZnRfdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudi0+YWN0aXZlX3RjLkhJW2FjXSA9IHRlbXBCOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9IHRlbXBBOworfQorCisjZW5kaWYKK3ZvaWQgaGVscGVyX210aGxpcCh0YXJnZXRfdWxvbmcgYWMsIHRhcmdldF91bG9uZyBycywgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50MzJfdCB0ZW1wQSwgdGVtcEIsIHBvczsKKworICAgIHRlbXBBID0gcnM7CisgICAgdGVtcEIgPSBlbnYtPmFjdGl2ZV90Yy5MT1thY107CisgICAgZW52LT5hY3RpdmVfdGMuSElbYWNdID0gKHRhcmdldF9sb25nKXRlbXBCOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjXSA9ICh0YXJnZXRfbG9uZyl0ZW1wQTsKKyAgICBwb3MgPSBnZXRfRFNQQ29udHJvbF9wb3MoZW52KTsKKworICAgIGlmIChwb3MgPiAzMikgeworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X0RTUENvbnRyb2xfcG9zKHBvcyArIDMyLCBlbnYpOworICAgIH0KK30KKworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK3ZvaWQgaGVscGVyX2RtdGhsaXAodGFyZ2V0X3Vsb25nIHJzLCB0YXJnZXRfdWxvbmcgYWMsIENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHVpbnQ4X3QgYWNfdDsKKyAgICB1aW50OF90IHBvczsKKyAgICB1aW50NjRfdCB0ZW1wQiwgdGVtcEE7CisKKyAgICBhY190ID0gYWMgJiAweDM7CisKKyAgICB0ZW1wQSA9IHJzOworICAgIHRlbXBCID0gZW52LT5hY3RpdmVfdGMuTE9bYWNfdF07CisKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVthY190XSA9IHRlbXBCOworICAgIGVudi0+YWN0aXZlX3RjLkxPW2FjX3RdID0gdGVtcEE7CisKKyAgICBwb3MgPSBnZXRfRFNQQ29udHJvbF9wb3MoZW52KTsKKworICAgIGlmIChwb3MgPD0gNjQpIHsKKyAgICAgICAgcG9zID0gcG9zICsgNjQ7CisgICAgICAgIHNldF9EU1BDb250cm9sX3Bvcyhwb3MsIGVudik7CisgICAgfQorfQorI2VuZGlmCisKK3ZvaWQgY3B1X3dyZHNwKHVpbnQzMl90IHJzLCB1aW50MzJfdCBtYXNrX251bSwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDhfdCAgbWFza1s2XTsKKyAgICB1aW50OF90ICBpOworICAgIHVpbnQzMl90IG5ld2JpdHMsIG92ZXJ3cml0ZTsKKyAgICB0YXJnZXRfdWxvbmcgZHNwOworCisgICAgbmV3Yml0cyAgID0gMHgwMDsKKyAgICBvdmVyd3JpdGUgPSAweEZGRkZGRkZGOworICAgIGRzcCA9IGVudi0+YWN0aXZlX3RjLkRTUENvbnRyb2w7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIG1hc2tbaV0gPSAobWFza19udW0gPj4gaSkgJiAweDAxOworICAgIH0KKworICAgIGlmIChtYXNrWzBdID09IDEpIHsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgIG92ZXJ3cml0ZSAmPSAweEZGRkZGRjgwOworICAgICAgICBuZXdiaXRzICAgJj0gMHhGRkZGRkY4MDsKKyAgICAgICAgbmV3Yml0cyAgIHw9IDB4MDAwMDAwN0YgJiByczsKKyNlbHNlCisgICAgICAgIG92ZXJ3cml0ZSAmPSAweEZGRkZGRkMwOworICAgICAgICBuZXdiaXRzICAgJj0gMHhGRkZGRkZDMDsKKyAgICAgICAgbmV3Yml0cyAgIHw9IDB4MDAwMDAwM0YgJiByczsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtYXNrWzFdID09IDEpIHsKKyAgICAgICAgb3ZlcndyaXRlICY9IDB4RkZGRkUwN0Y7CisgICAgICAgIG5ld2JpdHMgICAmPSAweEZGRkZFMDdGOworICAgICAgICBuZXdiaXRzICAgfD0gMHgwMDAwMUY4MCAmIHJzOworICAgIH0KKworICAgIGlmIChtYXNrWzJdID09IDEpIHsKKyAgICAgICAgb3ZlcndyaXRlICY9IDB4RkZGRkRGRkY7CisgICAgICAgIG5ld2JpdHMgICAmPSAweEZGRkZERkZGOworICAgICAgICBuZXdiaXRzICAgfD0gMHgwMDAwMjAwMCAmIHJzOworICAgIH0KKworICAgIGlmIChtYXNrWzNdID09IDEpIHsKKyAgICAgICAgb3ZlcndyaXRlICY9IDB4RkYwMEZGRkY7CisgICAgICAgIG5ld2JpdHMgICAmPSAweEZGMDBGRkZGOworICAgICAgICBuZXdiaXRzICAgfD0gMHgwMEZGMDAwMCAmIHJzOworICAgIH0KKworICAgIGlmIChtYXNrWzRdID09IDEpIHsKKyAgICAgICAgb3ZlcndyaXRlICY9IDB4MDBGRkZGRkY7CisgICAgICAgIG5ld2JpdHMgICAmPSAweDAwRkZGRkZGOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgbmV3Yml0cyAgIHw9IDB4RkYwMDAwMDAgJiByczsKKyNlbHNlCisgICAgICAgIG5ld2JpdHMgICB8PSAweDBGMDAwMDAwICYgcnM7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobWFza1s1XSA9PSAxKSB7CisgICAgICAgIG92ZXJ3cml0ZSAmPSAweEZGRkZCRkZGOworICAgICAgICBuZXdiaXRzICAgJj0gMHhGRkZGQkZGRjsKKyAgICAgICAgbmV3Yml0cyAgIHw9IDB4MDAwMDQwMDAgJiByczsKKyAgICB9CisKKyAgICBkc3AgPSBkc3AgJiBvdmVyd3JpdGU7CisgICAgZHNwID0gZHNwIHwgbmV3Yml0czsKKyAgICBlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sID0gZHNwOworfQorCit2b2lkIGhlbHBlcl93cmRzcCh0YXJnZXRfdWxvbmcgcnMsIHRhcmdldF91bG9uZyBtYXNrX251bSwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGNwdV93cmRzcChycywgbWFza19udW0sIGVudik7Cit9CisKK3VpbnQzMl90IGNwdV9yZGRzcCh1aW50MzJfdCBtYXNrX251bSwgQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdWludDhfdCAgbWFza1s2XTsKKyAgICB1aW50MzJfdCBydWxlciwgaTsKKyAgICB0YXJnZXRfdWxvbmcgdGVtcDsKKyAgICB0YXJnZXRfdWxvbmcgZHNwOworCisgICAgcnVsZXIgPSAweDAxOworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgbWFza1tpXSA9IChtYXNrX251bSAmIHJ1bGVyKSA+PiBpIDsKKyAgICAgICAgcnVsZXIgPSBydWxlciA8PCAxOworICAgIH0KKworICAgIHRlbXAgID0gMHgwMDsKKyAgICBkc3AgPSBlbnYtPmFjdGl2ZV90Yy5EU1BDb250cm9sOworCisgICAgaWYgKG1hc2tbMF0gPT0gMSkgeworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgdGVtcCB8PSBkc3AgJiAweDdGOworI2Vsc2UKKyAgICAgICAgdGVtcCB8PSBkc3AgJiAweDNGOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1hc2tbMV0gPT0gMSkgeworICAgICAgICB0ZW1wIHw9IGRzcCAmIDB4MUY4MDsKKyAgICB9CisKKyAgICBpZiAobWFza1syXSA9PSAxKSB7CisgICAgICAgIHRlbXAgfD0gZHNwICYgMHgyMDAwOworICAgIH0KKworICAgIGlmIChtYXNrWzNdID09IDEpIHsKKyAgICAgICAgdGVtcCB8PSBkc3AgJiAweDAwRkYwMDAwOworICAgIH0KKworICAgIGlmIChtYXNrWzRdID09IDEpIHsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgIHRlbXAgfD0gZHNwICYgMHhGRjAwMDAwMDsKKyNlbHNlCisgICAgICAgIHRlbXAgfD0gZHNwICYgMHgwRjAwMDAwMDsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtYXNrWzVdID09IDEpIHsKKyAgICAgICAgdGVtcCB8PSBkc3AgJiAweDQwMDA7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfcmRkc3AodGFyZ2V0X3Vsb25nIG1hc2tfbnVtLCBDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gY3B1X3JkZHNwKG1hc2tfbnVtLCBlbnYpOworfQorCisKKyN1bmRlZiBNSVBTRFNQX0xISQorI3VuZGVmIE1JUFNEU1BfTExPCisjdW5kZWYgTUlQU0RTUF9ISQorI3VuZGVmIE1JUFNEU1BfTE8KKyN1bmRlZiBNSVBTRFNQX1EzCisjdW5kZWYgTUlQU0RTUF9RMgorI3VuZGVmIE1JUFNEU1BfUTEKKyN1bmRlZiBNSVBTRFNQX1EwCisKKyN1bmRlZiBNSVBTRFNQX1NQTElUMzJfOAorI3VuZGVmIE1JUFNEU1BfU1BMSVQzMl8xNgorCisjdW5kZWYgTUlQU0RTUF9SRVRVUk4zMl84CisjdW5kZWYgTUlQU0RTUF9SRVRVUk4zMl8xNgorCisjaWZkZWYgVEFSR0VUX01JUFM2NAorI3VuZGVmIE1JUFNEU1BfU1BMSVQ2NF8xNgorI3VuZGVmIE1JUFNEU1BfU1BMSVQ2NF8zMgorI3VuZGVmIE1JUFNEU1BfUkVUVVJONjRfMTYKKyN1bmRlZiBNSVBTRFNQX1JFVFVSTjY0XzMyCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvaGVscGVyLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTgxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL2hlbHBlci5jCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogIE1JUFMgZW11bGF0aW9uIGhlbHBlcnMgZm9yIHFlbXUuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNC0yMDA1IEpvY2VseW4gTWF5ZXIKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlICJjcHUuaCIKKworZW51bSB7CisgICAgVExCUkVUX0RJUlRZID0gLTQsCisgICAgVExCUkVUX0lOVkFMSUQgPSAtMywKKyAgICBUTEJSRVRfTk9NQVRDSCA9IC0yLAorICAgIFRMQlJFVF9CQURBRERSID0gLTEsCisgICAgVExCUkVUX01BVENIID0gMAorfTsKKworLyogbm8gTU1VIGVtdWxhdGlvbiAqLworaW50IG5vX21tdV9tYXBfYWRkcmVzcyAoQ1BVTUlQU1N0YXRlICplbnYsIGh3YWRkciAqcGh5c2ljYWwsIGludCAqcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncsIGludCBhY2Nlc3NfdHlwZSkKK3sKKyAgICAqcGh5c2ljYWwgPSBhZGRyZXNzOworICAgICpwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKyAgICByZXR1cm4gVExCUkVUX01BVENIOworfQorCisvKiBmaXhlZCBtYXBwaW5nIE1NVSBlbXVsYXRpb24gKi8KK2ludCBmaXhlZF9tbXVfbWFwX2FkZHJlc3MgKENQVU1JUFNTdGF0ZSAqZW52LCBod2FkZHIgKnBoeXNpY2FsLCBpbnQgKnByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYWRkcmVzcywgaW50IHJ3LCBpbnQgYWNjZXNzX3R5cGUpCit7CisgICAgaWYgKGFkZHJlc3MgPD0gKGludDMyX3QpMHg3RkZGRkZGRlVMKSB7CisgICAgICAgIGlmICghKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpKQorICAgICAgICAgICAgKnBoeXNpY2FsID0gYWRkcmVzcyArIDB4NDAwMDAwMDBVTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnBoeXNpY2FsID0gYWRkcmVzczsKKyAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPD0gKGludDMyX3QpMHhCRkZGRkZGRlVMKQorICAgICAgICAqcGh5c2ljYWwgPSBhZGRyZXNzICYgMHgxRkZGRkZGRjsKKyAgICBlbHNlCisgICAgICAgICpwaHlzaWNhbCA9IGFkZHJlc3M7CisKKyAgICAqcHJvdCA9IFBBR0VfUkVBRCB8IFBBR0VfV1JJVEU7CisgICAgcmV0dXJuIFRMQlJFVF9NQVRDSDsKK30KKworLyogTUlQUzMyL01JUFM2NCBSNDAwMC1zdHlsZSBNTVUgZW11bGF0aW9uICovCitpbnQgcjRrX21hcF9hZGRyZXNzIChDUFVNSVBTU3RhdGUgKmVudiwgaHdhZGRyICpwaHlzaWNhbCwgaW50ICpwcm90LAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHJlc3MsIGludCBydywgaW50IGFjY2Vzc190eXBlKQoreworICAgIHVpbnQ4X3QgQVNJRCA9IGVudi0+Q1AwX0VudHJ5SGkgJiAweEZGOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGVudi0+dGxiLT50bGJfaW5fdXNlOyBpKyspIHsKKyAgICAgICAgcjRrX3RsYl90ICp0bGIgPSAmZW52LT50bGItPm1tdS5yNGsudGxiW2ldOworICAgICAgICAvKiAxayBwYWdlcyBhcmUgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgICAgdGFyZ2V0X3Vsb25nIG1hc2sgPSB0bGItPlBhZ2VNYXNrIHwgfihUQVJHRVRfUEFHRV9NQVNLIDw8IDEpOworICAgICAgICB0YXJnZXRfdWxvbmcgdGFnID0gYWRkcmVzcyAmIH5tYXNrOworICAgICAgICB0YXJnZXRfdWxvbmcgVlBOID0gdGxiLT5WUE4gJiB+bWFzazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgIHRhZyAmPSBlbnYtPlNFR01hc2s7CisjZW5kaWYKKworICAgICAgICAvKiBDaGVjayBBU0lELCB2aXJ0dWFsIHBhZ2UgbnVtYmVyICYgc2l6ZSAqLworICAgICAgICBpZiAoKHRsYi0+RyA9PSAxIHx8IHRsYi0+QVNJRCA9PSBBU0lEKSAmJiBWUE4gPT0gdGFnKSB7CisgICAgICAgICAgICAvKiBUTEIgbWF0Y2ggKi8KKyAgICAgICAgICAgIGludCBuID0gISEoYWRkcmVzcyAmIG1hc2sgJiB+KG1hc2sgPj4gMSkpOworICAgICAgICAgICAgLyogQ2hlY2sgYWNjZXNzIHJpZ2h0cyAqLworICAgICAgICAgICAgaWYgKCEobiA/IHRsYi0+VjEgOiB0bGItPlYwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gVExCUkVUX0lOVkFMSUQ7CisgICAgICAgICAgICBpZiAocncgPT0gMCB8fCAobiA/IHRsYi0+RDEgOiB0bGItPkQwKSkgeworICAgICAgICAgICAgICAgICpwaHlzaWNhbCA9IHRsYi0+UEZOW25dIHwgKGFkZHJlc3MgJiAobWFzayA+PiAxKSk7CisgICAgICAgICAgICAgICAgKnByb3QgPSBQQUdFX1JFQUQ7CisgICAgICAgICAgICAgICAgaWYgKG4gPyB0bGItPkQxIDogdGxiLT5EMCkKKyAgICAgICAgICAgICAgICAgICAgKnByb3QgfD0gUEFHRV9XUklURTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVExCUkVUX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRMQlJFVF9ESVJUWTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVExCUkVUX05PTUFUQ0g7Cit9CisKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCitzdGF0aWMgaW50IGdldF9waHlzaWNhbF9hZGRyZXNzIChDUFVNSVBTU3RhdGUgKmVudiwgaHdhZGRyICpwaHlzaWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcm90LCB0YXJnZXRfdWxvbmcgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ3LCBpbnQgYWNjZXNzX3R5cGUpCit7CisgICAgLyogVXNlciBtb2RlIGNhbiBvbmx5IGFjY2VzcyB1c2VnL3h1c2VnICovCisgICAgaW50IHVzZXJfbW9kZSA9IChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfTU9ERSkgPT0gTUlQU19IRkxBR19VTTsKKyAgICBpbnQgc3VwZXJ2aXNvcl9tb2RlID0gKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19NT0RFKSA9PSBNSVBTX0hGTEFHX1NNOworICAgIGludCBrZXJuZWxfbW9kZSA9ICF1c2VyX21vZGUgJiYgIXN1cGVydmlzb3JfbW9kZTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgaW50IFVYID0gKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1VYKSkgIT0gMDsKKyAgICBpbnQgU1ggPSAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfU1gpKSAhPSAwOworICAgIGludCBLWCA9IChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9LWCkpICE9IDA7CisjZW5kaWYKKyAgICBpbnQgcmV0ID0gVExCUkVUX01BVENIOworCisjaWYgMAorICAgIHFlbXVfbG9nKCJ1c2VyIG1vZGUgJWQgaCAlMDh4XG4iLCB1c2VyX21vZGUsIGVudi0+aGZsYWdzKTsKKyNlbmRpZgorCisgICAgaWYgKGFkZHJlc3MgPD0gKGludDMyX3QpMHg3RkZGRkZGRlVMKSB7CisgICAgICAgIC8qIHVzZWcgKi8KKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpIHsKKyAgICAgICAgICAgICpwaHlzaWNhbCA9IGFkZHJlc3MgJiAweEZGRkZGRkZGOworICAgICAgICAgICAgKnByb3QgPSBQQUdFX1JFQUQgfCBQQUdFX1dSSVRFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gZW52LT50bGItPm1hcF9hZGRyZXNzKGVudiwgcGh5c2ljYWwsIHByb3QsIGFkZHJlc3MsIHJ3LCBhY2Nlc3NfdHlwZSk7CisgICAgICAgIH0KKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgMHg0MDAwMDAwMDAwMDAwMDAwVUxMKSB7CisgICAgICAgIC8qIHh1c2VnICovCisgICAgICAgIGlmIChVWCAmJiBhZGRyZXNzIDw9ICgweDNGRkZGRkZGRkZGRkZGRkZVTEwgJiBlbnYtPlNFR01hc2spKSB7CisgICAgICAgICAgICByZXQgPSBlbnYtPnRsYi0+bWFwX2FkZHJlc3MoZW52LCBwaHlzaWNhbCwgcHJvdCwgYWRkcmVzcywgcncsIGFjY2Vzc190eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRMQlJFVF9CQURBRERSOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgMHg4MDAwMDAwMDAwMDAwMDAwVUxMKSB7CisgICAgICAgIC8qIHhzc2VnICovCisgICAgICAgIGlmICgoc3VwZXJ2aXNvcl9tb2RlIHx8IGtlcm5lbF9tb2RlKSAmJgorICAgICAgICAgICAgU1ggJiYgYWRkcmVzcyA8PSAoMHg3RkZGRkZGRkZGRkZGRkZGVUxMICYgZW52LT5TRUdNYXNrKSkgeworICAgICAgICAgICAgcmV0ID0gZW52LT50bGItPm1hcF9hZGRyZXNzKGVudiwgcGh5c2ljYWwsIHByb3QsIGFkZHJlc3MsIHJ3LCBhY2Nlc3NfdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBUTEJSRVRfQkFEQUREUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYWRkcmVzcyA8IDB4QzAwMDAwMDAwMDAwMDAwMFVMTCkgeworICAgICAgICAvKiB4a3BoeXMgKi8KKyAgICAgICAgaWYgKGtlcm5lbF9tb2RlICYmIEtYICYmCisgICAgICAgICAgICAoYWRkcmVzcyAmIDB4MDdGRkZGRkZGRkZGRkZGRlVMTCkgPD0gZW52LT5QQU1hc2spIHsKKyAgICAgICAgICAgICpwaHlzaWNhbCA9IGFkZHJlc3MgJiBlbnYtPlBBTWFzazsKKyAgICAgICAgICAgICpwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRMQlJFVF9CQURBRERSOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgMHhGRkZGRkZGRjgwMDAwMDAwVUxMKSB7CisgICAgICAgIC8qIHhrc2VnICovCisgICAgICAgIGlmIChrZXJuZWxfbW9kZSAmJiBLWCAmJgorICAgICAgICAgICAgYWRkcmVzcyA8PSAoMHhGRkZGRkZGRjdGRkZGRkZGVUxMICYgZW52LT5TRUdNYXNrKSkgeworICAgICAgICAgICAgcmV0ID0gZW52LT50bGItPm1hcF9hZGRyZXNzKGVudiwgcGh5c2ljYWwsIHByb3QsIGFkZHJlc3MsIHJ3LCBhY2Nlc3NfdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBUTEJSRVRfQkFEQUREUjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgKGludDMyX3QpMHhBMDAwMDAwMFVMKSB7CisgICAgICAgIC8qIGtzZWcwICovCisgICAgICAgIGlmIChrZXJuZWxfbW9kZSkgeworICAgICAgICAgICAgKnBoeXNpY2FsID0gYWRkcmVzcyAtIChpbnQzMl90KTB4ODAwMDAwMDBVTDsKKyAgICAgICAgICAgICpwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRMQlJFVF9CQURBRERSOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgKGludDMyX3QpMHhDMDAwMDAwMFVMKSB7CisgICAgICAgIC8qIGtzZWcxICovCisgICAgICAgIGlmIChrZXJuZWxfbW9kZSkgeworICAgICAgICAgICAgKnBoeXNpY2FsID0gYWRkcmVzcyAtIChpbnQzMl90KTB4QTAwMDAwMDBVTDsKKyAgICAgICAgICAgICpwcm90ID0gUEFHRV9SRUFEIHwgUEFHRV9XUklURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRMQlJFVF9CQURBRERSOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgKGludDMyX3QpMHhFMDAwMDAwMFVMKSB7CisgICAgICAgIC8qIHNzZWcgKGtzZWcyKSAqLworICAgICAgICBpZiAoc3VwZXJ2aXNvcl9tb2RlIHx8IGtlcm5lbF9tb2RlKSB7CisgICAgICAgICAgICByZXQgPSBlbnYtPnRsYi0+bWFwX2FkZHJlc3MoZW52LCBwaHlzaWNhbCwgcHJvdCwgYWRkcmVzcywgcncsIGFjY2Vzc190eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRMQlJFVF9CQURBRERSOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoga3NlZzMgKi8KKyAgICAgICAgLyogWFhYOiBkZWJ1ZyBzZWdtZW50IGlzIG5vdCBlbXVsYXRlZCAqLworICAgICAgICBpZiAoa2VybmVsX21vZGUpIHsKKyAgICAgICAgICAgIHJldCA9IGVudi0+dGxiLT5tYXBfYWRkcmVzcyhlbnYsIHBoeXNpY2FsLCBwcm90LCBhZGRyZXNzLCBydywgYWNjZXNzX3R5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gVExCUkVUX0JBREFERFI7CisgICAgICAgIH0KKyAgICB9CisjaWYgMAorICAgIHFlbXVfbG9nKFRBUkdFVF9GTVRfbHggIiAlZCAlZCA9PiAiIFRBUkdFVF9GTVRfbHggIiAlZCAoJWQpXG4iLAorICAgICAgICAgICAgYWRkcmVzcywgcncsIGFjY2Vzc190eXBlLCAqcGh5c2ljYWwsICpwcm90LCByZXQpOworI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJhaXNlX21tdV9leGNlcHRpb24oQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcncsIGludCB0bGJfZXJyb3IpCit7CisgICAgaW50IGV4Y2VwdGlvbiA9IDAsIGVycm9yX2NvZGUgPSAwOworCisgICAgc3dpdGNoICh0bGJfZXJyb3IpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgVExCUkVUX0JBREFERFI6CisgICAgICAgIC8qIFJlZmVyZW5jZSB0byBrZXJuZWwgYWRkcmVzcyBmcm9tIHVzZXIgbW9kZSBvciBzdXBlcnZpc29yIG1vZGUgKi8KKyAgICAgICAgLyogUmVmZXJlbmNlIHRvIHN1cGVydmlzb3IgYWRkcmVzcyBmcm9tIHVzZXIgbW9kZSAqLworICAgICAgICBpZiAocncpCisgICAgICAgICAgICBleGNlcHRpb24gPSBFWENQX0FkRVM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEVYQ1BfQWRFTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUTEJSRVRfTk9NQVRDSDoKKyAgICAgICAgLyogTm8gVExCIG1hdGNoIGZvciBhIG1hcHBlZCBhZGRyZXNzICovCisgICAgICAgIGlmIChydykKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEVYQ1BfVExCUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhjZXB0aW9uID0gRVhDUF9UTEJMOworICAgICAgICBlcnJvcl9jb2RlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUTEJSRVRfSU5WQUxJRDoKKyAgICAgICAgLyogVExCIG1hdGNoIHdpdGggbm8gdmFsaWQgYml0ICovCisgICAgICAgIGlmIChydykKKyAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEVYQ1BfVExCUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhjZXB0aW9uID0gRVhDUF9UTEJMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRMQlJFVF9ESVJUWToKKyAgICAgICAgLyogVExCIG1hdGNoIGJ1dCAnRCcgYml0IGlzIGNsZWFyZWQgKi8KKyAgICAgICAgZXhjZXB0aW9uID0gRVhDUF9MVExCTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICB9CisgICAgLyogUmFpc2UgZXhjZXB0aW9uICovCisgICAgZW52LT5DUDBfQmFkVkFkZHIgPSBhZGRyZXNzOworICAgIGVudi0+Q1AwX0NvbnRleHQgPSAoZW52LT5DUDBfQ29udGV4dCAmIH4weDAwN2ZmZmZmKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgoYWRkcmVzcyA+PiA5KSAmIDB4MDA3ZmZmZjApOworICAgIGVudi0+Q1AwX0VudHJ5SGkgPQorICAgICAgICAoZW52LT5DUDBfRW50cnlIaSAmIDB4RkYpIHwgKGFkZHJlc3MgJiAoVEFSR0VUX1BBR0VfTUFTSyA8PCAxKSk7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGVudi0+Q1AwX0VudHJ5SGkgJj0gZW52LT5TRUdNYXNrOworICAgIGVudi0+Q1AwX1hDb250ZXh0ID0gKGVudi0+Q1AwX1hDb250ZXh0ICYgKCh+MFVMTCkgPDwgKGVudi0+U0VHQklUUyAtIDcpKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChhZGRyZXNzICYgMHhDMDAwMDAwMDAwMDBVTEwpID4+ICg1NSAtIGVudi0+U0VHQklUUykpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYWRkcmVzcyAmICgoMVVMTCA8PCBlbnYtPlNFR0JJVFMpIC0gMSkgJiAweEZGRkZGRkZGRkZGRkUwMDBVTEwpID4+IDkpOworI2VuZGlmCisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBleGNlcHRpb247CisgICAgZW52LT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKK30KKworI2RlZmluZSBUTEJfSEFORExFUl9TSVpFICgweDQwKQorCit0eXBlZGVmIGVudW0geyBQUk9CRSA9IDAsIFVTRUZBU1RUTEIsIFVTRVNMT1dUTEIgfSBpbnRlcnByZXRlcl9zdGF0ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludGVycHJldGVyX3N0YXRlIHN0YXRlOworICAgIGNoYXIgbmFtZVszMl07CisgICAgaW50MzJfdCBlYmFzZTsKKyAgICB1aW50MzJfdCBoYW5kbGVyW1RMQl9IQU5ETEVSX1NJWkVdOworfSBUTEJIYW5kbGVySW5mbzsKKworLy8gI2RlZmluZSBEVU1QX0hBTkRMRVIgMQorCisjaWYgZGVmaW5lZChEVU1QX0hBTkRMRVIpCisvKgorICogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIFRMQkhhbmRsZXJJbmZvIGJ1ZmZlciBob2xkaW5nCisgKiBob2xkaW5nIHRoZSBUTEIgZXhjZXB0aW9uIGhhbmRsZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfaGFuZGxlcihUTEJIYW5kbGVySW5mbyAqaGFuZGxlcl9pbmZvKQoreworICAgIGludCBpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIGV4Y2VwdGlvbiBoYW5kbGVyXG4iLCBoYW5kbGVyX2luZm8tPm5hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IFRMQl9IQU5ETEVSX1NJWkU7IGkrKykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIjB4IiBUQVJHRVRfRk1UX2x4ICIgJTA4eFxuIiwKKyAgICAgICAgICAgICAgICAodGFyZ2V0X3Vsb25nKShoYW5kbGVyX2luZm8tPmViYXNlICsgKGkgPDwgMikpLAorICAgICAgICAgICAgICAgIGhhbmRsZXJfaW5mby0+aGFuZGxlcltpXSk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9oYW5kbGVyKFRMQkhhbmRsZXJJbmZvICpoYW5kbGVyX2luZm8pCit7CisgICAgOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgaXNfNjRiaXRfa2VybmVsID0gMDsKK3N0YXRpYyBUTEJIYW5kbGVySW5mbyB0bGJfcmVmaWxsX2luZm8gPSB7IFBST0JFLCAiUmVmaWxsIiB9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgc2F2ZSB0aGUgVExCIFJlZmlsbCBoYW5kbGVyIHRvIGEKKyAqIHRsYl9yZWZpbGxfaW5mby5oYW5kbGVyIGJ1ZmZlciB3aGljaCB3aWxsIGxhdGVyCisgKiBiZSB1c2VkIGZvciB0aGUgSW50ZXJwcmV0ZXIKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRsYl9yZWZpbGxfZXhjZXB0aW9uX3ByZXBhcmUoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoQ1BVLnBjICE9IDApCisgICAgICAgIGlzXzY0Yml0X2tlcm5lbCA9IDE7CisKKyAgICBpZiAodW5saWtlbHkodGxiX3JlZmlsbF9pbmZvLnN0YXRlID09IFBST0JFKSkgeworICAgICAgICB0bGJfcmVmaWxsX2luZm8uZWJhc2UgPSBlbnYtPkNQMF9FQmFzZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFRMQl9IQU5ETEVSX1NJWkU7IGkrKykgeworICAgICAgICAgICAgdGxiX3JlZmlsbF9pbmZvLmhhbmRsZXJbaV0gPSBsZGxfcGh5cyh0bGJfcmVmaWxsX2luZm8uZWJhc2UgLSAweDgwMDAwMDAwICsgKGkgPDwgMikpOworICAgICAgICAgICAgQ1BVLmRvX3RsYndyID0gMTsKKyAgICAgICAgfQorICAgICAgICB0bGJfcmVmaWxsX2luZm8uc3RhdGUgPSBVU0VGQVNUVExCOworICAgICAgICBkdW1wX2hhbmRsZXIoJnRsYl9yZWZpbGxfaW5mbyk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGxiX2V4Y2VwdGlvbl9pbnRlcnByZXRlcl9wcmVwYXJlKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcmVzcywgaW50IGV4Y2VwdGlvbikKK3sKKyAgICBlbnYtPkNQMF9CYWRWQWRkciA9IGFkZHJlc3M7CisgICAgZW52LT5DUDBfQ29udGV4dCA9IChlbnYtPkNQMF9Db250ZXh0ICYgfjB4MDA3ZmZmZmYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChhZGRyZXNzID4+IDkpICYgICAweDAwN2ZmZmYwKTsKKyAgICBlbnYtPkNQMF9FbnRyeUhpID0KKyAgICAgICAgKGVudi0+Q1AwX0VudHJ5SGkgJiAweEZGKSB8IChhZGRyZXNzICYgKFRBUkdFVF9QQUdFX01BU0sgPDwgMSkpOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICBlbnYtPkNQMF9FbnRyeUhpICY9IGVudi0+U0VHTWFzazsKKyAgICBlbnYtPkNQMF9YQ29udGV4dCA9IChlbnYtPkNQMF9YQ29udGV4dCAmICgofjBVTEwpIDw8IChlbnYtPlNFR0JJVFMgLSA3KSkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoYWRkcmVzcyAmIDB4QzAwMDAwMDAwMDAwVUxMKSA+PiAoNTUgLSBlbnYtPlNFR0JJVFMpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKGFkZHJlc3MgJiAoKDFVTEwgPDwgZW52LT5TRUdCSVRTKSAtIDEpICYgMHhGRkZGRkZGRkZGRkZFMDAwVUxMKSA+PiA5KTsKKyNlbmRpZgorCisgICAgQ1BVLnBjID0gMDsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgaW50IFIgPSBlbnYtPkNQMF9CYWRWQWRkciA+PiA2MjsKKyAgICBpbnQgVVggPSAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfVVgpKSAhPSAwOworICAgIGludCBTWCA9IChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9TWCkpICE9IDA7CisgICAgaW50IEtYID0gKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0tYKSkgIT0gMDsKKworICAgIGlmICgoKFIgPT0gMCAmJiBVWCkgfHwgKFIgPT0gMSAmJiBTWCkgfHwgKFIgPT0gMyAmJiBLWCkpICYmCisgICAgICAgICghKGVudi0+aW5zbl9mbGFncyAmIChJTlNOX0xPT05HU09OMkUgfCBJTlNOX0xPT05HU09OMkYpKSkpCisgICAgICAgIENQVS5wYyA9IDB4MDgwIC8gNDsKKyNlbmRpZgorCisgICAgaWYgKGxpa2VseSh0bGJfcmVmaWxsX2luZm8uc3RhdGUgIT0gUFJPQkUpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKGV4Y2VwdGlvbikgeworICAgICAgICBjYXNlIEVYQ1BfVExCRjoKKyAgICAgICAgICAgIHRsYl9yZWZpbGxfZXhjZXB0aW9uX3ByZXBhcmUoZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcyA6IFVuZXhwZWN0ZWQgVExCIGV4Y2VwdGlvbiAlZFxuIiwgX19mdW5jX18sIGV4Y2VwdGlvbik7CisgICAgICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworLyoKKyAqIE9uY2UgdGhlIHBhZ2Ugd2FsayBpcyBkb25lIGJ5IHRoZSBJbnRlcnByZXRlciwKKyAqIHRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHZlcmlmeWluZworICogdGhlIFRMQiBFbnRyeS4gVGhlIHBlcmZvcm1hbmNlIGJvb3N0IGNvbWVzIGZyb20gdGhpcworICogZnVuY3Rpb24gYWN0dWFsbHksIGJlY2F1c2UgaXQgcHJldmVudHMgcmFpc2luZyBuZXcKKyAqIGV4Y2VwdGlvbiBpZiBpdCBnb2VzIHRocm91Z2ggYWxsIGNoZWNrIGFuZCByZXR1cm5zIFRMQlJFVF9NQVRDSC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgdGxiX2V4Y2VwdGlvbl9yZXR1cm4oQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4KQoreworICAgIHRhcmdldF91bG9uZyBtYXNrID0gZW52LT5DUDBfUGFnZU1hc2sgfCB+KFRBUkdFVF9QQUdFX01BU0sgPDwgMSk7CisgICAgdGFyZ2V0X3Vsb25nIGxvID0gKGFkZHJlc3MgJiBtYXNrICYgfihtYXNrID4+IDEpKSA/IGVudi0+Q1AwX0VudHJ5TG8xIDogZW52LT5DUDBfRW50cnlMbzA7CisKKyAgICAvKiBJcyB0aGUgVExCIGVudHJ5IHZhbGlkPyAqLworICAgIGlmICgobG8gJiAoMSA8PCBDUDBFbkxvX1YpKSA9PSAwKQorICAgICAgICByZXR1cm4gVExCUkVUX0lOVkFMSUQ7CisKKyAgICAvKiBJcyB0aGlzIGEgcmVhZCBhY2Nlc3Mgb3IgYSB3cml0ZSB0byBhIG1vZGlmaWFibGUgcGFnZT8gKi8KKyAgICBpZiAocncgPT0gMCB8fCAobG8gJiAoMSA8PCBDUDBFbkxvX0QpKSkgeworICAgICAgICBod2FkZHIgcGh5c2ljYWwgPSAobG8gPj4gQ1AwRW5Mb19QRk4pIDw8IDEyOworICAgICAgICBwaHlzaWNhbCB8PSBhZGRyZXNzICYgKG1hc2sgPj4gMSk7CisgICAgICAgIGludCBwcm90ID0gUEFHRV9SRUFEOworICAgICAgICBpZiAobG8gJiAoMSA8PCBDUDBFbkxvX0QpKQorICAgICAgICAgICAgcHJvdCB8PSBQQUdFX1dSSVRFOworCisgICAgICAgIHRsYl9zZXRfcGFnZShlbnYsIGFkZHJlc3MgJiBUQVJHRVRfUEFHRV9NQVNLLAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgJiBUQVJHRVRfUEFHRV9NQVNLLCBwcm90IHwgUEFHRV9FWEVDLAorICAgICAgICAgICAgICAgICAgICAgICAgbW11X2lkeCwgVEFSR0VUX1BBR0VfU0laRSk7CisgICAgICAgIHJldHVybiBUTEJSRVRfTUFUQ0g7CisgICAgfQorICAgIHJldHVybiBUTEJSRVRfRElSVFk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHJvdXRlcyBSZWZpbGwgZXhjZXB0aW9ucyB0aHJvdWdoIHRoZSBUTEIgZXhjZXB0aW9uIEludGVycHJldGVyCisgKiBhbmQgYWxsIG90aGVycyBhcmUgaGFuZGxlZCBieSB0aGUga2VybmVsLgorICovCitzdGF0aWMgaW5saW5lIGludCBkb190bGJfcmVmaWxsKENQVU1JUFNTdGF0ZSAqZW52LCB2YWRkciBhZGRyZXNzLCBpbnQgcncsIGludCBtbXVfaWR4KQoreworICAgIGludCB0bGJyZXQgPSBUTEJSRVRfTk9NQVRDSDsKKworICAgIHRhcmdldF91bG9uZyBzYXZlZF9iYWR2YWRkcjsKKyAgICB0YXJnZXRfdWxvbmcgc2F2ZWRfZW50cnloaTsKKyAgICB0YXJnZXRfdWxvbmcgc2F2ZWRfY29udGV4dDsKKyAgICB0YXJnZXRfdWxvbmcgc2F2ZWRfeGNvbnRleHQ7CisKKyAgICBpZiAodW5saWtlbHkodGxiX3JlZmlsbF9pbmZvLnN0YXRlID09IFVTRVNMT1dUTEIpKQorICAgICAgICByZXR1cm4gdGxicmV0OworCisgICAgc2F2ZWRfYmFkdmFkZHIgPSBlbnYtPkNQMF9CYWRWQWRkcjsKKyAgICBzYXZlZF9jb250ZXh0ID0gZW52LT5DUDBfQ29udGV4dDsKKyAgICBzYXZlZF94Y29udGV4dCA9IGVudi0+Q1AwX1hDb250ZXh0OworICAgIHNhdmVkX2VudHJ5aGkgPSBlbnYtPkNQMF9FbnRyeUhpOworCisgICAgdGxiX2V4Y2VwdGlvbl9pbnRlcnByZXRlcl9wcmVwYXJlKGVudiwgYWRkcmVzcywgRVhDUF9UTEJGKTsKKworICAgIGlmICh0bGJfZXhjZXB0aW9uX2ludGVycHJldGVyKGVudiwgdGxiX3JlZmlsbF9pbmZvLmhhbmRsZXIsIFRMQl9IQU5ETEVSX1NJWkUpKQorICAgICAgICBnb3RvIG91dDsKKworICAgIHRsYnJldCA9IHRsYl9leGNlcHRpb25fcmV0dXJuKGVudiwgYWRkcmVzcywgcncsIG1tdV9pZHgpOworCitvdXQ6CisgICAgZW52LT5DUDBfQmFkVkFkZHIgPSBzYXZlZF9iYWR2YWRkcjsKKyAgICBlbnYtPkNQMF9Db250ZXh0ID0gc2F2ZWRfY29udGV4dDsKKyAgICBlbnYtPkNQMF9YQ29udGV4dCA9IHNhdmVkX3hjb250ZXh0OworICAgIGVudi0+Q1AwX0VudHJ5SGkgPSBzYXZlZF9lbnRyeWhpOworCisgICAgcmV0dXJuIHRsYnJldDsKK30KKworaHdhZGRyIGNwdV9nZXRfcGh5c19wYWdlX2RlYnVnKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkcikKK3sKKyAgICBod2FkZHIgcGh5c19hZGRyOworICAgIGludCBwcm90LCByZXQ7CisKKyAgICBpZiAoIWlzXzY0Yml0X2tlcm5lbCkKKyAgICAgICAgYWRkciA9IChpbnQzMl90KWFkZHI7CisKKyAgICByZXQgPSBnZXRfcGh5c2ljYWxfYWRkcmVzcyhlbnYsICZwaHlzX2FkZHIsICZwcm90LCBhZGRyLCAwLCBBQ0NFU1NfSU5UKTsKKyAgICBpZiAocmV0ICE9IFRMQlJFVF9NQVRDSCkgeworICAgICAgICB0YXJnZXRfdWxvbmcgc2F2ZWRfYmFkdmFkZHI7CisgICAgICAgIHRhcmdldF91bG9uZyBzYXZlZF9lbnRyeWhpOworICAgICAgICB0YXJnZXRfdWxvbmcgc2F2ZWRfY29udGV4dDsKKyAgICAgICAgdGFyZ2V0X3Vsb25nIHNhdmVkX3hjb250ZXh0OworCisgICAgICAgIHNhdmVkX2JhZHZhZGRyID0gZW52LT5DUDBfQmFkVkFkZHI7CisgICAgICAgIHNhdmVkX2NvbnRleHQgPSBlbnYtPkNQMF9Db250ZXh0OworICAgICAgICBzYXZlZF94Y29udGV4dCA9IGVudi0+Q1AwX1hDb250ZXh0OworICAgICAgICBzYXZlZF9lbnRyeWhpID0gZW52LT5DUDBfRW50cnlIaTsKKworICAgICAgICB0bGJfZXhjZXB0aW9uX2ludGVycHJldGVyX3ByZXBhcmUoZW52LCBhZGRyLCBFWENQX1RMQkYpOworCisgICAgICAgIGlmIChsaWtlbHkodGxiX3JlZmlsbF9pbmZvLnN0YXRlID09IFVTRUZBU1RUTEIpKSB7CisgICAgICAgICAgICBDUFUuZG9fdGxid3IgPSAwOworICAgICAgICAgICAgaWYgKHRsYl9leGNlcHRpb25faW50ZXJwcmV0ZXIoZW52LCB0bGJfcmVmaWxsX2luZm8uaGFuZGxlciwgVExCX0hBTkRMRVJfU0laRSkgIT0gMCkgeworICAgICAgICAgICAgICAgIHBoeXNfYWRkciA9IC0xOworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY3B1X2dldF9waHlzX3BhZ2VfZGVidWcoKSBmYWlscyBmb3IgdmFkZHI6IDB4IiBUQVJHRVRfRk1UX2x4ICJcbiIsIGFkZHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbWFzayA9IGVudi0+Q1AwX1BhZ2VNYXNrIHwgfihUQVJHRVRfUEFHRV9NQVNLIDw8IDEpOworICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBsbyA9IChhZGRyICYgbWFzayAmIH4obWFzayA+PiAxKSkgPyBDUFUuQ1AwX0VudHJ5TG8xIDogQ1BVLkNQMF9FbnRyeUxvMDsKKyAgICAgICAgICAgICAgICBwaHlzX2FkZHIgPSAoKGxvID4+IENQMEVuTG9fUEZOKSA8PCAxMikgfCAoYWRkciAmIChtYXNrID4+IDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENQVS5kb190bGJ3ciA9IDE7CisgICAgICAgIH0KKworICAgICAgICBlbnYtPkNQMF9CYWRWQWRkciA9IHNhdmVkX2JhZHZhZGRyOworICAgICAgICBlbnYtPkNQMF9Db250ZXh0ID0gc2F2ZWRfY29udGV4dDsKKyAgICAgICAgZW52LT5DUDBfWENvbnRleHQgPSBzYXZlZF94Y29udGV4dDsKKyAgICAgICAgZW52LT5DUDBfRW50cnlIaSA9IHNhdmVkX2VudHJ5aGk7CisgICAgfQorCisgICAgcmV0dXJuIHBoeXNfYWRkcjsKK30KKworaW50IGNwdV9taXBzX2hhbmRsZV9tbXVfZmF1bHQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCkKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIGh3YWRkciBwaHlzaWNhbDsKKyAgICBpbnQgcHJvdDsKKyAgICBpbnQgYWNjZXNzX3R5cGU7CisjZW5kaWYKKyAgICBpbnQgcmV0ID0gMDsKKworI2lmIDAKKyAgICBsb2dfY3B1X3N0YXRlKGNzLCAwKTsKKyNlbmRpZgorICAgIHFlbXVfbG9nKCIlcyBwYyAiIFRBUkdFVF9GTVRfbHggIiBhZCAiIFRBUkdFVF9GTVRfbHggIiBydyAlZCBtbXVfaWR4ICVkXG4iLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgZW52LT5hY3RpdmVfdGMuUEMsIGFkZHJlc3MsIHJ3LCBtbXVfaWR4KTsKKworICAgIHJ3ICY9IDE7CisKKyAgICAvKiBkYXRhIGFjY2VzcyAqLworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgLyogWFhYOiBwdXQgY29ycmVjdCBhY2Nlc3MgYnkgdXNpbmcgY3B1X3Jlc3RvcmVfc3RhdGUoKQorICAgICAgIGNvcnJlY3RseSAqLworICAgIGFjY2Vzc190eXBlID0gQUNDRVNTX0lOVDsKKyAgICByZXQgPSBnZXRfcGh5c2ljYWxfYWRkcmVzcyhlbnYsICZwaHlzaWNhbCwgJnByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgcncsIGFjY2Vzc190eXBlKTsKKyAgICBxZW11X2xvZygiJXMgYWRkcmVzcz0iIFRBUkdFVF9GTVRfbHggIiByZXQgJWQgcGh5c2ljYWwgIiBUQVJHRVRfRk1UX3BseAorICAgICAgICAgICAgICIgcHJvdCAlZFxuIiwKKyAgICAgICAgICAgICBfX2Z1bmNfXywgYWRkcmVzcywgcmV0LCBwaHlzaWNhbCwgcHJvdCk7CisgICAgaWYgKHJldCA9PSBUTEJSRVRfTUFUQ0gpIHsKKyAgICAgICAgdGxiX3NldF9wYWdlKGVudiwgYWRkcmVzcyAmIFRBUkdFVF9QQUdFX01BU0ssCisgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCAmIFRBUkdFVF9QQUdFX01BU0ssIHByb3QgfCBQQUdFX0VYRUMsCisgICAgICAgICAgICAgICAgICAgICBtbXVfaWR4LCBUQVJHRVRfUEFHRV9TSVpFKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBUTEJSRVRfTk9NQVRDSCkKKyAgICAgICAgcmV0ID0gZG9fdGxiX3JlZmlsbChlbnYsIGFkZHJlc3MsIHJ3LCBtbXVfaWR4KTsKKworICAgIGlmIChyZXQgPCAwKQorI2VuZGlmCisKKyAgICB7CisgICAgICAgIHJhaXNlX21tdV9leGNlcHRpb24oZW52LCBhZGRyZXNzLCBydywgcmV0KTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCitod2FkZHIgY3B1X21pcHNfdHJhbnNsYXRlX2FkZHJlc3MoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzLCBpbnQgcncpCit7CisgICAgaHdhZGRyIHBoeXNpY2FsOworICAgIGludCBwcm90OworICAgIGludCBhY2Nlc3NfdHlwZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJ3ICY9IDE7CisKKyAgICAvKiBkYXRhIGFjY2VzcyAqLworICAgIGFjY2Vzc190eXBlID0gQUNDRVNTX0lOVDsKKyAgICByZXQgPSBnZXRfcGh5c2ljYWxfYWRkcmVzcyhlbnYsICZwaHlzaWNhbCwgJnByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgcncsIGFjY2Vzc190eXBlKTsKKyAgICBpZiAocmV0ICE9IFRMQlJFVF9NQVRDSCkgeworICAgICAgICByYWlzZV9tbXVfZXhjZXB0aW9uKGVudiwgYWRkcmVzcywgcncsIHJldCk7CisgICAgICAgIHJldHVybiAtMUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBwaHlzaWNhbDsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleGNwX25hbWVzW0VYQ1BfTEFTVCArIDFdID0geworICAgIFtFWENQX1JFU0VUXSA9ICJyZXNldCIsCisgICAgW0VYQ1BfU1JFU0VUXSA9ICJzb2Z0IHJlc2V0IiwKKyAgICBbRVhDUF9EU1NdID0gImRlYnVnIHNpbmdsZSBzdGVwIiwKKyAgICBbRVhDUF9ESU5UXSA9ICJkZWJ1ZyBpbnRlcnJ1cHQiLAorICAgIFtFWENQX05NSV0gPSAibm9uLW1hc2thYmxlIGludGVycnVwdCIsCisgICAgW0VYQ1BfTUNIRUNLXSA9ICJtYWNoaW5lIGNoZWNrIiwKKyAgICBbRVhDUF9FWFRfSU5URVJSVVBUXSA9ICJpbnRlcnJ1cHQiLAorICAgIFtFWENQX0RGV0FUQ0hdID0gImRlZmVycmVkIHdhdGNocG9pbnQiLAorICAgIFtFWENQX0RJQl0gPSAiZGVidWcgaW5zdHJ1Y3Rpb24gYnJlYWtwb2ludCIsCisgICAgW0VYQ1BfSVdBVENIXSA9ICJpbnN0cnVjdGlvbiBmZXRjaCB3YXRjaHBvaW50IiwKKyAgICBbRVhDUF9BZEVMXSA9ICJhZGRyZXNzIGVycm9yIGxvYWQiLAorICAgIFtFWENQX0FkRVNdID0gImFkZHJlc3MgZXJyb3Igc3RvcmUiLAorICAgIFtFWENQX1RMQkZdID0gIlRMQiByZWZpbGwiLAorICAgIFtFWENQX0lCRV0gPSAiaW5zdHJ1Y3Rpb24gYnVzIGVycm9yIiwKKyAgICBbRVhDUF9EQnBdID0gImRlYnVnIGJyZWFrcG9pbnQiLAorICAgIFtFWENQX1NZU0NBTExdID0gInN5c2NhbGwiLAorICAgIFtFWENQX0JSRUFLXSA9ICJicmVhayIsCisgICAgW0VYQ1BfQ3BVXSA9ICJjb3Byb2Nlc3NvciB1bnVzYWJsZSIsCisgICAgW0VYQ1BfUkldID0gInJlc2VydmVkIGluc3RydWN0aW9uIiwKKyAgICBbRVhDUF9PVkVSRkxPV10gPSAiYXJpdGhtZXRpYyBvdmVyZmxvdyIsCisgICAgW0VYQ1BfVFJBUF0gPSAidHJhcCIsCisgICAgW0VYQ1BfRlBFXSA9ICJmbG9hdGluZyBwb2ludCIsCisgICAgW0VYQ1BfRERCU10gPSAiZGVidWcgZGF0YSBicmVhayBzdG9yZSIsCisgICAgW0VYQ1BfRFdBVENIXSA9ICJkYXRhIHdhdGNocG9pbnQiLAorICAgIFtFWENQX0xUTEJMXSA9ICJUTEIgbW9kaWZ5IiwKKyAgICBbRVhDUF9UTEJMXSA9ICJUTEIgbG9hZCIsCisgICAgW0VYQ1BfVExCU10gPSAiVExCIHN0b3JlIiwKKyAgICBbRVhDUF9EQkVdID0gImRhdGEgYnVzIGVycm9yIiwKKyAgICBbRVhDUF9EREJMXSA9ICJkZWJ1ZyBkYXRhIGJyZWFrIGxvYWQiLAorICAgIFtFWENQX1RIUkVBRF0gPSAidGhyZWFkIiwKKyAgICBbRVhDUF9NRE1YXSA9ICJNRE1YIiwKKyAgICBbRVhDUF9DMkVdID0gInByZWNpc2UgY29wcm9jZXNzb3IgMiIsCisgICAgW0VYQ1BfQ0FDSEVdID0gImNhY2hlIGVycm9yIiwKK307CisKK3ZvaWQgZG9faW50ZXJydXB0IChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIHRhcmdldF91bG9uZyBvZmZzZXQ7CisgICAgaW50IGNhdXNlID0gLTE7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIGlmIChxZW11X2xvZ19lbmFibGVkKCkgJiYgZW52LT5leGNlcHRpb25faW5kZXggIT0gRVhDUF9FWFRfSU5URVJSVVBUKSB7CisgICAgICAgIGlmIChlbnYtPmV4Y2VwdGlvbl9pbmRleCA8IDAgfHwgZW52LT5leGNlcHRpb25faW5kZXggPiBFWENQX0xBU1QpCisgICAgICAgICAgICBuYW1lID0gInVua25vd24iOworICAgICAgICBlbHNlCisgICAgICAgICAgICBuYW1lID0gZXhjcF9uYW1lc1tlbnYtPmV4Y2VwdGlvbl9pbmRleF07CisKKyAgICAgICAgcWVtdV9sb2coIiVzIGVudGVyOiBQQyAiIFRBUkdFVF9GTVRfbHggIiBFUEMgIiBUQVJHRVRfRk1UX2x4ICIgJXMgZXhjZXB0aW9uXG4iLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZW52LT5hY3RpdmVfdGMuUEMsIGVudi0+Q1AwX0VQQywgbmFtZSk7CisgICAgfQorICAgIGlmIChlbnYtPmV4Y2VwdGlvbl9pbmRleCA9PSBFWENQX0VYVF9JTlRFUlJVUFQgJiYKKyAgICAgICAgKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19ETSkpCisgICAgICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9ESU5UOworICAgIG9mZnNldCA9IDB4MTgwOworICAgIHN3aXRjaCAoZW52LT5leGNlcHRpb25faW5kZXgpIHsKKyAgICBjYXNlIEVYQ1BfRFNTOgorICAgICAgICBlbnYtPkNQMF9EZWJ1ZyB8PSAxIDw8IENQMERCX0RTUzsKKyAgICAgICAgLyogRGVidWcgc2luZ2xlIHN0ZXAgY2Fubm90IGJlIHJhaXNlZCBpbnNpZGUgYSBkZWxheSBzbG90IGFuZAorICAgICAgICAgICByZXN1bWUgd2lsbCBhbHdheXMgb2NjdXIgb24gdGhlIG5leHQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgKGJ1dCB3ZSBhc3N1bWUgdGhlIHBjIGhhcyBhbHdheXMgYmVlbiB1cGRhdGVkIGR1cmluZworICAgICAgICAgICBjb2RlIHRyYW5zbGF0aW9uKS4gKi8KKyAgICAgICAgZW52LT5DUDBfREVQQyA9IGVudi0+YWN0aXZlX3RjLlBDOworICAgICAgICBnb3RvIGVudGVyX2RlYnVnX21vZGU7CisgICAgY2FzZSBFWENQX0RJTlQ6CisgICAgICAgIGVudi0+Q1AwX0RlYnVnIHw9IDEgPDwgQ1AwREJfRElOVDsKKyAgICAgICAgZ290byBzZXRfREVQQzsKKyAgICBjYXNlIEVYQ1BfRElCOgorICAgICAgICBlbnYtPkNQMF9EZWJ1ZyB8PSAxIDw8IENQMERCX0RJQjsKKyAgICAgICAgZ290byBzZXRfREVQQzsKKyAgICBjYXNlIEVYQ1BfREJwOgorICAgICAgICBlbnYtPkNQMF9EZWJ1ZyB8PSAxIDw8IENQMERCX0RCcDsKKyAgICAgICAgZ290byBzZXRfREVQQzsKKyAgICBjYXNlIEVYQ1BfRERCUzoKKyAgICAgICAgZW52LT5DUDBfRGVidWcgfD0gMSA8PCBDUDBEQl9EREJTOworICAgICAgICBnb3RvIHNldF9ERVBDOworICAgIGNhc2UgRVhDUF9EREJMOgorICAgICAgICBlbnYtPkNQMF9EZWJ1ZyB8PSAxIDw8IENQMERCX0REQkw7CisgICAgc2V0X0RFUEM6CisgICAgICAgIGlmIChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfQk1BU0spIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBleGNlcHRpb24gd2FzIHJhaXNlZCBmcm9tIGEgZGVsYXkgc2xvdCwKKyAgICAgICAgICAgICAgIGNvbWUgYmFjayB0byB0aGUganVtcC4gICovCisgICAgICAgICAgICBlbnYtPkNQMF9ERVBDID0gZW52LT5hY3RpdmVfdGMuUEMgLSA0OworICAgICAgICAgICAgZW52LT5oZmxhZ3MgJj0gfk1JUFNfSEZMQUdfQk1BU0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnYtPkNQMF9ERVBDID0gZW52LT5hY3RpdmVfdGMuUEM7CisgICAgICAgIH0KKyBlbnRlcl9kZWJ1Z19tb2RlOgorICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0RNIHwgTUlQU19IRkxBR182NCB8IE1JUFNfSEZMQUdfQ1AwOworICAgICAgICBlbnYtPmhmbGFncyAmPSB+KE1JUFNfSEZMQUdfS1NVKTsKKyAgICAgICAgLyogRUpUQUcgcHJvYmUgdHJhcCBlbmFibGUgaXMgbm90IGltcGxlbWVudGVkLi4uICovCisgICAgICAgIGlmICghKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VYTCkpKQorICAgICAgICAgICAgZW52LT5DUDBfQ2F1c2UgJj0gfigxIDw8IENQMENhX0JEKTsKKyAgICAgICAgZW52LT5hY3RpdmVfdGMuUEMgPSAoaW50MzJfdCkweEJGQzAwNDgwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ1BfUkVTRVQ6CisgICAgICAgIGNwdV9yZXNldChFTlZfR0VUX0NQVShlbnYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWENQX1NSRVNFVDoKKyAgICAgICAgZW52LT5DUDBfU3RhdHVzIHw9ICgxIDw8IENQMFN0X1NSKTsKKyAgICAgICAgbWVtc2V0KGVudi0+Q1AwX1dhdGNoTG8sIDAsIHNpemVvZigqZW52LT5DUDBfV2F0Y2hMbykpOworICAgICAgICBnb3RvIHNldF9lcnJvcl9FUEM7CisgICAgY2FzZSBFWENQX05NSToKKyAgICAgICAgZW52LT5DUDBfU3RhdHVzIHw9ICgxIDw8IENQMFN0X05NSSk7Cisgc2V0X2Vycm9yX0VQQzoKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19CTUFTSykgeworICAgICAgICAgICAgLyogSWYgdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGZyb20gYSBkZWxheSBzbG90LAorICAgICAgICAgICAgICAgY29tZSBiYWNrIHRvIHRoZSBqdW1wLiAgKi8KKyAgICAgICAgICAgIGVudi0+Q1AwX0Vycm9yRVBDID0gZW52LT5hY3RpdmVfdGMuUEMgLSA0OworICAgICAgICAgICAgZW52LT5oZmxhZ3MgJj0gfk1JUFNfSEZMQUdfQk1BU0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnYtPkNQMF9FcnJvckVQQyA9IGVudi0+YWN0aXZlX3RjLlBDOworICAgICAgICB9CisgICAgICAgIGVudi0+Q1AwX1N0YXR1cyB8PSAoMSA8PCBDUDBTdF9FUkwpIHwgKDEgPDwgQ1AwU3RfQkVWKTsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR182NCB8IE1JUFNfSEZMQUdfQ1AwOworICAgICAgICBlbnYtPmhmbGFncyAmPSB+KE1JUFNfSEZMQUdfS1NVKTsKKyAgICAgICAgaWYgKCEoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfRVhMKSkpCisgICAgICAgICAgICBlbnYtPkNQMF9DYXVzZSAmPSB+KDEgPDwgQ1AwQ2FfQkQpOworICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQyA9IChpbnQzMl90KTB4QkZDMDAwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhDUF9FWFRfSU5URVJSVVBUOgorICAgICAgICBjYXVzZSA9IDA7CisgICAgICAgIGlmIChlbnYtPkNQMF9DYXVzZSAmICgxIDw8IENQMENhX0lWKSkKKyAgICAgICAgICAgIG9mZnNldCA9IDB4MjAwOworICAgICAgICBnb3RvIHNldF9FUEM7CisgICAgY2FzZSBFWENQX0xUTEJMOgorICAgICAgICBjYXVzZSA9IDE7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfVExCTDoKKyAgICAgICAgY2F1c2UgPSAyOworICAgICAgICBpZiAoZW52LT5lcnJvcl9jb2RlID09IDEgJiYgIShlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9FWEwpKSkgeworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgIGludCBSID0gZW52LT5DUDBfQmFkVkFkZHIgPj4gNjI7CisgICAgICAgICAgICBpbnQgVVggPSAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfVVgpKSAhPSAwOworICAgICAgICAgICAgaW50IFNYID0gKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1NYKSkgIT0gMDsKKyAgICAgICAgICAgIGludCBLWCA9IChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9LWCkpICE9IDA7CisKKyAgICAgICAgICAgIGlmICgoUiA9PSAwICYmIFVYKSB8fCAoUiA9PSAxICYmIFNYKSB8fCAoUiA9PSAzICYmIEtYKSkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAweDA4MDsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIG9mZnNldCA9IDB4MDAwOworICAgICAgICB9CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfVExCUzoKKyAgICAgICAgY2F1c2UgPSAzOworICAgICAgICBpZiAoZW52LT5lcnJvcl9jb2RlID09IDEgJiYgIShlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9FWEwpKSkgeworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgIGludCBSID0gZW52LT5DUDBfQmFkVkFkZHIgPj4gNjI7CisgICAgICAgICAgICBpbnQgVVggPSAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfVVgpKSAhPSAwOworICAgICAgICAgICAgaW50IFNYID0gKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1NYKSkgIT0gMDsKKyAgICAgICAgICAgIGludCBLWCA9IChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9LWCkpICE9IDA7CisKKyAgICAgICAgICAgIGlmICgoUiA9PSAwICYmIFVYKSB8fCAoUiA9PSAxICYmIFNYKSB8fCAoUiA9PSAzICYmIEtYKSkKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAweDA4MDsKKyAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgIG9mZnNldCA9IDB4MDAwOworICAgICAgICB9CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfQWRFTDoKKyAgICAgICAgY2F1c2UgPSA0OworICAgICAgICBnb3RvIHNldF9FUEM7CisgICAgY2FzZSBFWENQX0FkRVM6CisgICAgICAgIGNhdXNlID0gNTsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9JQkU6CisgICAgICAgIGNhdXNlID0gNjsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9EQkU6CisgICAgICAgIGNhdXNlID0gNzsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9TWVNDQUxMOgorICAgICAgICBjYXVzZSA9IDg7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfQlJFQUs6CisgICAgICAgIGNhdXNlID0gOTsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9SSToKKyAgICAgICAgY2F1c2UgPSAxMDsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9DcFU6CisgICAgICAgIGNhdXNlID0gMTE7CisgICAgICAgIGVudi0+Q1AwX0NhdXNlID0gKGVudi0+Q1AwX0NhdXNlICYgfigweDMgPDwgQ1AwQ2FfQ0UpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGVudi0+ZXJyb3JfY29kZSA8PCBDUDBDYV9DRSk7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfT1ZFUkZMT1c6CisgICAgICAgIGNhdXNlID0gMTI7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfVFJBUDoKKyAgICAgICAgY2F1c2UgPSAxMzsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9GUEU6CisgICAgICAgIGNhdXNlID0gMTU7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfQzJFOgorICAgICAgICBjYXVzZSA9IDE4OworICAgICAgICBnb3RvIHNldF9FUEM7CisgICAgY2FzZSBFWENQX01ETVg6CisgICAgICAgIGNhdXNlID0gMjI7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfRFdBVENIOgorICAgICAgICBjYXVzZSA9IDIzOworICAgICAgICAvKiBYWFg6IFRPRE86IG1hbmFnZSBkZWZlcmVkIHdhdGNoIGV4Y2VwdGlvbnMgKi8KKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9NQ0hFQ0s6CisgICAgICAgIGNhdXNlID0gMjQ7CisgICAgICAgIGdvdG8gc2V0X0VQQzsKKyAgICBjYXNlIEVYQ1BfVEhSRUFEOgorICAgICAgICBjYXVzZSA9IDI1OworICAgICAgICBnb3RvIHNldF9FUEM7CisgICAgY2FzZSBFWENQX0RTUERJUzoKKyAgICAgICAgY2F1c2UgPSAyNjsKKyAgICAgICAgZ290byBzZXRfRVBDOworICAgIGNhc2UgRVhDUF9DQUNIRToKKyAgICAgICAgY2F1c2UgPSAzMDsKKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0JFVikpIHsKKyAgICAgICAgICAgIG9mZnNldCA9IDB4MTAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0ID0gMHgyMDAwMDEwMDsKKyAgICAgICAgfQorIHNldF9FUEM6CisgICAgICAgIGlmICghKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VYTCkpKSB7CisgICAgICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0JNQVNLKSB7CisgICAgICAgICAgICAgICAgLyogSWYgdGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIGZyb20gYSBkZWxheSBzbG90LAorICAgICAgICAgICAgICAgICAgIGNvbWUgYmFjayB0byB0aGUganVtcC4gICovCisgICAgICAgICAgICAgICAgZW52LT5DUDBfRVBDID0gZW52LT5hY3RpdmVfdGMuUEMgLSA0OworICAgICAgICAgICAgICAgIGVudi0+Q1AwX0NhdXNlIHw9ICgxIDw8IENQMENhX0JEKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW52LT5DUDBfRVBDID0gZW52LT5hY3RpdmVfdGMuUEM7CisgICAgICAgICAgICAgICAgZW52LT5DUDBfQ2F1c2UgJj0gfigxIDw8IENQMENhX0JEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudi0+Q1AwX1N0YXR1cyB8PSAoMSA8PCBDUDBTdF9FWEwpOworICAgICAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR182NCB8IE1JUFNfSEZMQUdfQ1AwOworICAgICAgICAgICAgZW52LT5oZmxhZ3MgJj0gfihNSVBTX0hGTEFHX0tTVSk7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5oZmxhZ3MgJj0gfk1JUFNfSEZMQUdfQk1BU0s7CisgICAgICAgIGlmIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9CRVYpKSB7CisgICAgICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQyA9IChpbnQzMl90KTB4QkZDMDAyMDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQyA9IChpbnQzMl90KShlbnYtPkNQMF9FQmFzZSAmIH4weDNmZik7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5hY3RpdmVfdGMuUEMgKz0gb2Zmc2V0OworICAgICAgICBlbnYtPkNQMF9DYXVzZSA9IChlbnYtPkNQMF9DYXVzZSAmIH4oMHgxZiA8PCBDUDBDYV9FQykpIHwgKGNhdXNlIDw8IENQMENhX0VDKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcWVtdV9sb2coIkludmFsaWQgTUlQUyBleGNlcHRpb24gJWQuIEV4aXRpbmdcbiIsIGVudi0+ZXhjZXB0aW9uX2luZGV4KTsKKyAgICAgICAgcHJpbnRmKCJJbnZhbGlkIE1JUFMgZXhjZXB0aW9uICVkLiBFeGl0aW5nXG4iLCBlbnYtPmV4Y2VwdGlvbl9pbmRleCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChxZW11X2xvZ19lbmFibGVkKCkgJiYgZW52LT5leGNlcHRpb25faW5kZXggIT0gRVhDUF9FWFRfSU5URVJSVVBUKSB7CisgICAgICAgIHFlbXVfbG9nKCIlczogUEMgIiBUQVJHRVRfRk1UX2x4ICIgRVBDICIgVEFSR0VUX0ZNVF9seCAiIGNhdXNlICVkXG4iCisgICAgICAgICAgICAgICAgIiAgICBTICUwOHggQyAlMDh4IEEgIiBUQVJHRVRfRk1UX2x4ICIgRCAiIFRBUkdFVF9GTVRfbHggIlxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZW52LT5hY3RpdmVfdGMuUEMsIGVudi0+Q1AwX0VQQywgY2F1c2UsCisgICAgICAgICAgICAgICAgZW52LT5DUDBfU3RhdHVzLCBlbnYtPkNQMF9DYXVzZSwgZW52LT5DUDBfQmFkVkFkZHIsCisgICAgICAgICAgICAgICAgZW52LT5DUDBfREVQQyk7CisgICAgfQorI2VuZGlmCisgICAgZW52LT5leGNlcHRpb25faW5kZXggPSBFWENQX05PTkU7Cit9CisKK3ZvaWQgcjRrX2ludmFsaWRhdGVfdGxiIChDUFVNSVBTU3RhdGUgKmVudiwgaW50IGlkeCwgaW50IHVzZV9leHRyYSkKK3sKKyAgICByNGtfdGxiX3QgKnRsYjsKKyAgICB0YXJnZXRfdWxvbmcgYWRkcjsKKyAgICB0YXJnZXRfdWxvbmcgZW5kOworICAgIHVpbnQ4X3QgQVNJRCA9IGVudi0+Q1AwX0VudHJ5SGkgJiAweEZGOworICAgIHRhcmdldF91bG9uZyBtYXNrOworCisgICAgdGxiID0gJmVudi0+dGxiLT5tbXUucjRrLnRsYltpZHhdOworICAgIC8qIFRoZSBxZW11IFRMQiBpcyBmbHVzaGVkIHdoZW4gdGhlIEFTSUQgY2hhbmdlcywgc28gbm8gbmVlZCB0bworICAgICAgIGZsdXNoIHRoZXNlIGVudHJpZXMgYWdhaW4uICAqLworICAgIGlmICh0bGItPkcgPT0gMCAmJiB0bGItPkFTSUQgIT0gQVNJRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHVzZV9leHRyYSAmJiBlbnYtPnRsYi0+dGxiX2luX3VzZSA8IE1JUFNfVExCX01BWCkgeworICAgICAgICAvKiBGb3IgdGxid3IsIHdlIGNhbiBzaGFkb3cgdGhlIGRpc2NhcmRlZCBlbnRyeSBpbnRvCisgICAgICAgICAgIGEgbmV3IChmYWtlKSBUTEIgZW50cnksIGFzIGxvbmcgYXMgdGhlIGd1ZXN0IGNhbiBub3QKKyAgICAgICAgICAgdGVsbCB0aGF0IGl0J3MgdGhlcmUuICAqLworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbZW52LT50bGItPnRsYl9pbl91c2VdID0gKnRsYjsKKyAgICAgICAgZW52LT50bGItPnRsYl9pbl91c2UrKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIDFrIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworICAgIG1hc2sgPSB0bGItPlBhZ2VNYXNrIHwgfihUQVJHRVRfUEFHRV9NQVNLIDw8IDEpOworICAgIGlmICh0bGItPlYwKSB7CisgICAgICAgIGFkZHIgPSB0bGItPlZQTiAmIH5tYXNrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgaWYgKGFkZHIgPj0gKDB4RkZGRkZGRkY4MDAwMDAwMFVMTCAmIGVudi0+U0VHTWFzaykpIHsKKyAgICAgICAgICAgIGFkZHIgfD0gMHgzRkZGRkYwMDAwMDAwMDAwVUxMOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZW5kID0gYWRkciB8IChtYXNrID4+IDEpOworICAgICAgICB3aGlsZSAoYWRkciA8IGVuZCkgeworICAgICAgICAgICAgdGxiX2ZsdXNoX3BhZ2UoZW52LCBhZGRyKTsKKyAgICAgICAgICAgIGFkZHIgKz0gVEFSR0VUX1BBR0VfU0laRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGxiLT5WMSkgeworICAgICAgICBhZGRyID0gKHRsYi0+VlBOICYgfm1hc2spIHwgKChtYXNrID4+IDEpICsgMSk7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICBpZiAoYWRkciA+PSAoMHhGRkZGRkZGRjgwMDAwMDAwVUxMICYgZW52LT5TRUdNYXNrKSkgeworICAgICAgICAgICAgYWRkciB8PSAweDNGRkZGRjAwMDAwMDAwMDBVTEw7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBlbmQgPSBhZGRyIHwgbWFzazsKKyAgICAgICAgd2hpbGUgKGFkZHIgLSAxIDwgZW5kKSB7CisgICAgICAgICAgICB0bGJfZmx1c2hfcGFnZShlbnYsIGFkZHIpOworICAgICAgICAgICAgYWRkciArPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9oZWxwZXIuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvaGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkMjE5NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvaGVscGVyLmgKQEAgLTAsMCArMSw2MTggQEAKKyNpbmNsdWRlICJleGVjL2RlZi1oZWxwZXIuaCIKKworREVGX0hFTFBFUl8zKHJhaXNlX2V4Y2VwdGlvbl9lcnIsIHZvaWQsIGVudiwgaTMyLCBpbnQpCitERUZfSEVMUEVSXzIocmFpc2VfZXhjZXB0aW9uLCB2b2lkLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMShpbnRlcnJ1cHRfcmVzdGFydCwgdm9pZCwgZW52KQorCisjaWZkZWYgVEFSR0VUX01JUFM2NAorREVGX0hFTFBFUl80KHNkbCwgdm9pZCwgZW52LCB0bCwgdGwsIGludCkKK0RFRl9IRUxQRVJfNChzZHIsIHZvaWQsIGVudiwgdGwsIHRsLCBpbnQpCisjZW5kaWYKK0RFRl9IRUxQRVJfNChzd2wsIHZvaWQsIGVudiwgdGwsIHRsLCBpbnQpCitERUZfSEVMUEVSXzQoc3dyLCB2b2lkLCBlbnYsIHRsLCB0bCwgaW50KQorCisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKK0RFRl9IRUxQRVJfMyhsbCwgdGwsIGVudiwgdGwsIGludCkKK0RFRl9IRUxQRVJfNChzYywgdGwsIGVudiwgdGwsIHRsLCBpbnQpCisjaWZkZWYgVEFSR0VUX01JUFM2NAorREVGX0hFTFBFUl8zKGxsZCwgdGwsIGVudiwgdGwsIGludCkKK0RFRl9IRUxQRVJfNChzY2QsIHRsLCBlbnYsIHRsLCB0bCwgaW50KQorI2VuZGlmCisjZW5kaWYKKworREVGX0hFTFBFUl9GTEFHU18xKGNsbywgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEoY2x6LCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKKyNpZmRlZiBUQVJHRVRfTUlQUzY0CitERUZfSEVMUEVSX0ZMQUdTXzEoZGNsbywgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEoZGNseiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSXzMoZG11bHQsIHZvaWQsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKGRtdWx0dSwgdm9pZCwgZW52LCB0bCwgdGwpCisjZW5kaWYKKworREVGX0hFTFBFUl8zKG11bHMsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhtdWxzdSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKG1hY2MsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhtYWNjdSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKG1zYWMsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhtc2FjdSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKG11bGhpLCB0bCwgZW52LCB0bCwgdGwpCitERUZfSEVMUEVSXzMobXVsaGl1LCB0bCwgZW52LCB0bCwgdGwpCitERUZfSEVMUEVSXzMobXVsc2hpLCB0bCwgZW52LCB0bCwgdGwpCitERUZfSEVMUEVSXzMobXVsc2hpdSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKG1hY2NoaSwgdGwsIGVudiwgdGwsIHRsKQorREVGX0hFTFBFUl8zKG1hY2NoaXUsIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhtc2FjaGksIHRsLCBlbnYsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMyhtc2FjaGl1LCB0bCwgZW52LCB0bCwgdGwpCisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorLyogQ1AwIGhlbHBlcnMgKi8KK0RFRl9IRUxQRVJfMShtZmMwX212cGNvbnRyb2wsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZjMF9tdnBjb25mMCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZmMwX212cGNvbmYxLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mYzBfcmFuZG9tLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mYzBfdGNzdGF0dXMsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZ0YzBfdGNzdGF0dXMsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZjMF90Y2JpbmQsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZ0YzBfdGNiaW5kLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mYzBfdGNyZXN0YXJ0LCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mdGMwX3RjcmVzdGFydCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZmMwX3RjaGFsdCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZnRjMF90Y2hhbHQsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZjMF90Y2NvbnRleHQsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZ0YzBfdGNjb250ZXh0LCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mYzBfdGNzY2hlZHVsZSwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZnRjMF90Y3NjaGVkdWxlLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mYzBfdGNzY2hlZmJhY2ssIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZ0YzBfdGNzY2hlZmJhY2ssIHRsLCBlbnYpCitERUZfSEVMUEVSXzEobWZjMF9jb3VudCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZnRjMF9lbnRyeWhpLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mdGMwX3N0YXR1cywgdGwsIGVudikKK0RFRl9IRUxQRVJfMShtZmMwX2xsYWRkciwgdGwsIGVudikKK0RFRl9IRUxQRVJfMihtZmMwX3dhdGNobG8sIHRsLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihtZmMwX3dhdGNoaGksIHRsLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMShtZmMwX2RlYnVnLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKG1mdGMwX2RlYnVnLCB0bCwgZW52KQorI2lmZGVmIFRBUkdFVF9NSVBTNjQKK0RFRl9IRUxQRVJfMShkbWZjMF90Y3Jlc3RhcnQsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEoZG1mYzBfdGNoYWx0LCB0bCwgZW52KQorREVGX0hFTFBFUl8xKGRtZmMwX3RjY29udGV4dCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShkbWZjMF90Y3NjaGVkdWxlLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKGRtZmMwX3Rjc2NoZWZiYWNrLCB0bCwgZW52KQorREVGX0hFTFBFUl8xKGRtZmMwX2xsYWRkciwgdGwsIGVudikKK0RFRl9IRUxQRVJfMihkbWZjMF93YXRjaGxvLCB0bCwgZW52LCBpMzIpCisjZW5kaWYgLyogVEFSR0VUX01JUFM2NCAqLworCitERUZfSEVMUEVSXzIobXRjMF9pbmRleCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX212cGNvbnRyb2wsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF92cGVjb250cm9sLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdnBlY29uZjAsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF92cGVjb25mMSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3lxbWFzaywgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3ZwZW9wdCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2VudHJ5bG8wLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdGNzdGF0dXMsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXR0YzBfdGNzdGF0dXMsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF90Y2JpbmQsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXR0YzBfdGNiaW5kLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdGNyZXN0YXJ0LCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10dGMwX3RjcmVzdGFydCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3RjaGFsdCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdHRjMF90Y2hhbHQsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF90Y2NvbnRleHQsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXR0YzBfdGNjb250ZXh0LCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdGNzY2hlZHVsZSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdHRjMF90Y3NjaGVkdWxlLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdGNzY2hlZmJhY2ssIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXR0YzBfdGNzY2hlZmJhY2ssIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9lbnRyeWxvMSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2NvbnRleHQsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9wYWdlbWFzaywgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3BhZ2VncmFpbiwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3dpcmVkLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfc3JzY29uZjAsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9zcnNjb25mMSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3Nyc2NvbmYyLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfc3JzY29uZjMsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9zcnNjb25mNCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2h3cmVuYSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2NvdW50LCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfZW50cnloaSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdHRjMF9lbnRyeWhpLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfY29tcGFyZSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX3N0YXR1cywgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdHRjMF9zdGF0dXMsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9pbnRjdGwsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9zcnNjdGwsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9jYXVzZSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2ViYXNlLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfY29uZmlnMCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2NvbmZpZzIsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9sbGFkZHIsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzMobXRjMF93YXRjaGxvLCB2b2lkLCBlbnYsIHRsLCBpMzIpCitERUZfSEVMUEVSXzMobXRjMF93YXRjaGhpLCB2b2lkLCBlbnYsIHRsLCBpMzIpCitERUZfSEVMUEVSXzIobXRjMF94Y29udGV4dCwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2ZyYW1lbWFzaywgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2RlYnVnLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10dGMwX2RlYnVnLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfcGVyZm9ybWFuY2UwLCB2b2lkLCBlbnYsIHRsKQorREVGX0hFTFBFUl8yKG10YzBfdGFnbG8sIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF9kYXRhbG8sIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzIobXRjMF90YWdoaSwgdm9pZCwgZW52LCB0bCkKK0RFRl9IRUxQRVJfMihtdGMwX2RhdGFoaSwgdm9pZCwgZW52LCB0bCkKKworLyogTUlQUyBNVCBmdW5jdGlvbnMgKi8KK0RFRl9IRUxQRVJfMihtZnRncHIsIHRsLCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihtZnRsbywgdGwsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKG1mdGhpLCB0bCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzIobWZ0YWN4LCB0bCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzEobWZ0ZHNwLCB0bCwgZW52KQorREVGX0hFTFBFUl8zKG10dGdwciwgdm9pZCwgZW52LCB0bCwgaTMyKQorREVGX0hFTFBFUl8zKG10dGxvLCB2b2lkLCBlbnYsIHRsLCBpMzIpCitERUZfSEVMUEVSXzMobXR0aGksIHZvaWQsIGVudiwgdGwsIGkzMikKK0RFRl9IRUxQRVJfMyhtdHRhY3gsIHZvaWQsIGVudiwgdGwsIGkzMikKK0RFRl9IRUxQRVJfMihtdHRkc3AsIHZvaWQsIGVudiwgdGwpCitERUZfSEVMUEVSXzAoZG10LCB0bCkKK0RFRl9IRUxQRVJfMChlbXQsIHRsKQorREVGX0hFTFBFUl8xKGR2cGUsIHRsLCBlbnYpCitERUZfSEVMUEVSXzEoZXZwZSwgdGwsIGVudikKKyNlbmRpZiAvKiAhQ09ORklHX1VTRVJfT05MWSAqLworREVGX0hFTFBFUl8yKGZvcmssIHZvaWQsIHRsLCB0bCkKK0RFRl9IRUxQRVJfMih5aWVsZCwgdGwsIGVudiwgdGwpCisKKy8qIENQMSBmdW5jdGlvbnMgKi8KK0RFRl9IRUxQRVJfMihjZmMxLCB0bCwgZW52LCBpMzIpCitERUZfSEVMUEVSXzMoY3RjMSwgdm9pZCwgZW52LCB0bCwgaTMyKQorCitERUZfSEVMUEVSXzIoZmxvYXRfY3Z0ZF9zLCBpNjQsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKGZsb2F0X2N2dGRfdywgaTY0LCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihmbG9hdF9jdnRkX2wsIGk2NCwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoZmxvYXRfY3Z0bF9kLCBpNjQsIGVudiwgaTY0KQorREVGX0hFTFBFUl8yKGZsb2F0X2N2dGxfcywgaTY0LCBlbnYsIGkzMikKK0RFRl9IRUxQRVJfMihmbG9hdF9jdnRwc19wdywgaTY0LCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihmbG9hdF9jdnRwd19wcywgaTY0LCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihmbG9hdF9jdnRzX2QsIGkzMiwgZW52LCBpNjQpCitERUZfSEVMUEVSXzIoZmxvYXRfY3Z0c193LCBpMzIsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKGZsb2F0X2N2dHNfbCwgaTMyLCBlbnYsIGk2NCkKK0RFRl9IRUxQRVJfMihmbG9hdF9jdnRzX3BsLCBpMzIsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKGZsb2F0X2N2dHNfcHUsIGkzMiwgZW52LCBpMzIpCitERUZfSEVMUEVSXzIoZmxvYXRfY3Z0d19zLCBpMzIsIGVudiwgaTMyKQorREVGX0hFTFBFUl8yKGZsb2F0X2N2dHdfZCwgaTMyLCBlbnYsIGk2NCkKKworREVGX0hFTFBFUl8zKGZsb2F0X2FkZHJfcHMsIGk2NCwgZW52LCBpNjQsIGk2NCkKK0RFRl9IRUxQRVJfMyhmbG9hdF9tdWxyX3BzLCBpNjQsIGVudiwgaTY0LCBpNjQpCisKKyNkZWZpbmUgRk9QX1BST1RPKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUZfSEVMUEVSXzIoZmxvYXRfICMjIG9wICMjIGxfcywgaTY0LCBlbnYsIGkzMikgXAorREVGX0hFTFBFUl8yKGZsb2F0XyAjIyBvcCAjIyBsX2QsIGk2NCwgZW52LCBpNjQpIFwKK0RFRl9IRUxQRVJfMihmbG9hdF8gIyMgb3AgIyMgd19zLCBpMzIsIGVudiwgaTMyKSBcCitERUZfSEVMUEVSXzIoZmxvYXRfICMjIG9wICMjIHdfZCwgaTMyLCBlbnYsIGk2NCkKK0ZPUF9QUk9UTyhyb3VuZCkKK0ZPUF9QUk9UTyh0cnVuYykKK0ZPUF9QUk9UTyhjZWlsKQorRk9QX1BST1RPKGZsb29yKQorI3VuZGVmIEZPUF9QUk9UTworCisjZGVmaW5lIEZPUF9QUk9UTyhvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVGX0hFTFBFUl8yKGZsb2F0XyAjIyBvcCAjIyBfcywgaTMyLCBlbnYsIGkzMikgIFwKK0RFRl9IRUxQRVJfMihmbG9hdF8gIyMgb3AgIyMgX2QsIGk2NCwgZW52LCBpNjQpCitGT1BfUFJPVE8oc3FydCkKK0ZPUF9QUk9UTyhyc3FydCkKK0ZPUF9QUk9UTyhyZWNpcCkKKyN1bmRlZiBGT1BfUFJPVE8KKworI2RlZmluZSBGT1BfUFJPVE8ob3ApICAgICAgICAgICAgICAgICAgICAgICBcCitERUZfSEVMUEVSXzEoZmxvYXRfICMjIG9wICMjIF9zLCBpMzIsIGkzMikgIFwKK0RFRl9IRUxQRVJfMShmbG9hdF8gIyMgb3AgIyMgX2QsIGk2NCwgaTY0KSAgXAorREVGX0hFTFBFUl8xKGZsb2F0XyAjIyBvcCAjIyBfcHMsIGk2NCwgaTY0KQorRk9QX1BST1RPKGFicykKK0ZPUF9QUk9UTyhjaHMpCisjdW5kZWYgRk9QX1BST1RPCisKKyNkZWZpbmUgRk9QX1BST1RPKG9wKSAgICAgICAgICAgICAgICAgICAgICAgXAorREVGX0hFTFBFUl8yKGZsb2F0XyAjIyBvcCAjIyBfcywgaTMyLCBlbnYsIGkzMikgIFwKK0RFRl9IRUxQRVJfMihmbG9hdF8gIyMgb3AgIyMgX2QsIGk2NCwgZW52LCBpNjQpICBcCitERUZfSEVMUEVSXzIoZmxvYXRfICMjIG9wICMjIF9wcywgaTY0LCBlbnYsIGk2NCkKK0ZPUF9QUk9UTyhyZWNpcDEpCitGT1BfUFJPVE8ocnNxcnQxKQorI3VuZGVmIEZPUF9QUk9UTworCisjZGVmaW5lIEZPUF9QUk9UTyhvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVGX0hFTFBFUl8zKGZsb2F0XyAjIyBvcCAjIyBfcywgaTMyLCBlbnYsIGkzMiwgaTMyKSAgIFwKK0RFRl9IRUxQRVJfMyhmbG9hdF8gIyMgb3AgIyMgX2QsIGk2NCwgZW52LCBpNjQsIGk2NCkgICBcCitERUZfSEVMUEVSXzMoZmxvYXRfICMjIG9wICMjIF9wcywgaTY0LCBlbnYsIGk2NCwgaTY0KQorRk9QX1BST1RPKGFkZCkKK0ZPUF9QUk9UTyhzdWIpCitGT1BfUFJPVE8obXVsKQorRk9QX1BST1RPKGRpdikKK0ZPUF9QUk9UTyhyZWNpcDIpCitGT1BfUFJPVE8ocnNxcnQyKQorI3VuZGVmIEZPUF9QUk9UTworCisjZGVmaW5lIEZPUF9QUk9UTyhvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFRl9IRUxQRVJfNChmbG9hdF8gIyMgb3AgIyMgX3MsIGkzMiwgZW52LCBpMzIsIGkzMiwgaTMyKSAgXAorREVGX0hFTFBFUl80KGZsb2F0XyAjIyBvcCAjIyBfZCwgaTY0LCBlbnYsIGk2NCwgaTY0LCBpNjQpICBcCitERUZfSEVMUEVSXzQoZmxvYXRfICMjIG9wICMjIF9wcywgaTY0LCBlbnYsIGk2NCwgaTY0LCBpNjQpCitGT1BfUFJPVE8obXVsYWRkKQorRk9QX1BST1RPKG11bHN1YikKK0ZPUF9QUk9UTyhubXVsYWRkKQorRk9QX1BST1RPKG5tdWxzdWIpCisjdW5kZWYgRk9QX1BST1RPCisKKyNkZWZpbmUgRk9QX1BST1RPKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFRl9IRUxQRVJfNChjbXBfZF8gIyMgb3AsIHZvaWQsIGVudiwgaTY0LCBpNjQsIGludCkgICAgIFwKK0RFRl9IRUxQRVJfNChjbXBhYnNfZF8gIyMgb3AsIHZvaWQsIGVudiwgaTY0LCBpNjQsIGludCkgIFwKK0RFRl9IRUxQRVJfNChjbXBfc18gIyMgb3AsIHZvaWQsIGVudiwgaTMyLCBpMzIsIGludCkgICAgIFwKK0RFRl9IRUxQRVJfNChjbXBhYnNfc18gIyMgb3AsIHZvaWQsIGVudiwgaTMyLCBpMzIsIGludCkgIFwKK0RFRl9IRUxQRVJfNChjbXBfcHNfICMjIG9wLCB2b2lkLCBlbnYsIGk2NCwgaTY0LCBpbnQpICAgIFwKK0RFRl9IRUxQRVJfNChjbXBhYnNfcHNfICMjIG9wLCB2b2lkLCBlbnYsIGk2NCwgaTY0LCBpbnQpCitGT1BfUFJPVE8oZikKK0ZPUF9QUk9UTyh1bikKK0ZPUF9QUk9UTyhlcSkKK0ZPUF9QUk9UTyh1ZXEpCitGT1BfUFJPVE8ob2x0KQorRk9QX1BST1RPKHVsdCkKK0ZPUF9QUk9UTyhvbGUpCitGT1BfUFJPVE8odWxlKQorRk9QX1BST1RPKHNmKQorRk9QX1BST1RPKG5nbGUpCitGT1BfUFJPVE8oc2VxKQorRk9QX1BST1RPKG5nbCkKK0ZPUF9QUk9UTyhsdCkKK0ZPUF9QUk9UTyhuZ2UpCitGT1BfUFJPVE8obGUpCitGT1BfUFJPVE8obmd0KQorI3VuZGVmIEZPUF9QUk9UTworCisvKiBTcGVjaWFsIGZ1bmN0aW9ucyAqLworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCitERUZfSEVMUEVSXzEodGxid2ksIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMSh0bGJ3ciwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKHRsYnAsIHZvaWQsIGVudikKK0RFRl9IRUxQRVJfMSh0bGJyLCB2b2lkLCBlbnYpCitERUZfSEVMUEVSXzEoZGksIHRsLCBlbnYpCitERUZfSEVMUEVSXzEoZWksIHRsLCBlbnYpCitERUZfSEVMUEVSXzEoZXJldCwgdm9pZCwgZW52KQorREVGX0hFTFBFUl8xKGRlcmV0LCB2b2lkLCBlbnYpCisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KK0RFRl9IRUxQRVJfMShyZGh3cl9jcHVudW0sIHRsLCBlbnYpCitERUZfSEVMUEVSXzEocmRod3Jfc3luY2lfc3RlcCwgdGwsIGVudikKK0RFRl9IRUxQRVJfMShyZGh3cl9jYywgdGwsIGVudikKK0RFRl9IRUxQRVJfMShyZGh3cl9jY3JlcywgdGwsIGVudikKK0RFRl9IRUxQRVJfMihwbW9uLCB2b2lkLCBlbnYsIGludCkKK0RFRl9IRUxQRVJfMSh3YWl0LCB2b2lkLCBlbnYpCisKKy8qKiogTUlQUyBEU1AgKioqLworLyogRFNQIEFyaXRobWV0aWMgU3ViLWNsYXNzIGluc25zICovCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkcV9waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGFkZHFfc19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGRxX3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkcV9zX3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGRxX3NfdywgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGRxX3B3LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkcV9zX3B3LCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGR1X3FiLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkdV9zX3FiLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzIoYWRkdWhfcWIsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihhZGR1aF9yX3FiLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkdV9waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGFkZHVfc19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKGFkZHFoX3BoLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoYWRkcWhfcl9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKGFkZHFoX3csIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihhZGRxaF9yX3csIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoYWRkdV9vYiwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGFkZHVfc19vYiwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKGFkZHVoX29iLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoYWRkdWhfcl9vYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKGFkZHVfcWgsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGR1X3NfcWgsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKHN1YnFfcGgsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhzdWJxX3NfcGgsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoc3VicV9xaCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKHN1YnFfc19xaCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzMoc3VicV9zX3csIDAsIHRsLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoc3VicV9wdywgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKHN1YnFfc19wdywgMCwgdGwsIHRsLCB0bCwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzMoc3VidV9xYiwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKHN1YnVfc19xYiwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKHN1YnVoX3FiLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc3VidWhfcl9xYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKHN1YnVfcGgsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhzdWJ1X3NfcGgsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMihzdWJxaF9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHN1YnFoX3JfcGgsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihzdWJxaF93LCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc3VicWhfcl93LCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKHN1YnVfb2IsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhzdWJ1X3Nfb2IsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMihzdWJ1aF9vYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHN1YnVoX3Jfb2IsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhzdWJ1X3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoc3VidV9zX3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhhZGRzYywgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGFkZHdjLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzIobW9kc3ViLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocmFkZHVfd19xYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18xKHJhZGR1X2xfb2IsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzIoYWJzcV9zX3FiLCAwLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMihhYnNxX3NfcGgsIDAsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKGFic3Ffc193LCAwLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzIoYWJzcV9zX29iLCAwLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMihhYnNxX3NfcWgsIDAsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKGFic3Ffc19wdywgMCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMihwcmVjcl9xYl9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHByZWNycV9xYl9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKHByZWNyX3NyYV9waF93LCBUQ0dfQ0FMTF9OT19SV0dfU0UsCisgICAgICAgICAgICAgICAgICAgdGwsIGkzMiwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKHByZWNyX3NyYV9yX3BoX3csIFRDR19DQUxMX05PX1JXR19TRSwKKyAgICAgICAgICAgICAgICAgICB0bCwgaTMyLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIocHJlY3JxX3BoX3csIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhwcmVjcnFfcnNfcGhfdywgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMihwcmVjcl9vYl9xaCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKHByZWNyX3NyYV9xaF9wdywKKyAgICAgICAgICAgICAgICAgICBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwsIGkzMikKK0RFRl9IRUxQRVJfRkxBR1NfMyhwcmVjcl9zcmFfcl9xaF9wdywKKyAgICAgICAgICAgICAgICAgICBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwsIGkzMikKK0RFRl9IRUxQRVJfRkxBR1NfMihwcmVjcnFfb2JfcWgsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihwcmVjcnFfcWhfcHcsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhwcmVjcnFfcnNfcWhfcHcsCisgICAgICAgICAgICAgICAgICAgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzIocHJlY3JxX3B3X2wsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKHByZWNycXVfc19xYl9waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhwcmVjcnF1X3Nfb2JfcWgsCisgICAgICAgICAgICAgICAgICAgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsLCBlbnYpCisKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXFfcHdfcWhsLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXFfcHdfcWhyLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXFfcHdfcWhsYSwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2VxX3B3X3FocmEsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2VxdV9waF9xYmwsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18xKHByZWNlcXVfcGhfcWJyLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXF1X3BoX3FibGEsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18xKHByZWNlcXVfcGhfcWJyYSwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18xKHByZWNlcXVfcWhfb2JsLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXF1X3FoX29iciwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2VxdV9xaF9vYmxhLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMShwcmVjZXF1X3FoX29icmEsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3BoX3FibCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3BoX3FiciwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3BoX3FibGEsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18xKHByZWNldV9waF9xYnJhLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3FoX29ibCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3FoX29iciwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzEocHJlY2V1X3FoX29ibGEsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18xKHByZWNldV9xaF9vYnJhLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCkKKyNlbmRpZgorCisvKiBEU1AgR1BSLUJhc2VkIFNoaWZ0IFN1Yi1jbGFzcyBpbnNucyAqLworREVGX0hFTFBFUl9GTEFHU18zKHNobGxfcWIsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoc2hsbF9vYiwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzMoc2hsbF9waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKHNobGxfc19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhzaGxsX3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoc2hsbF9zX3FoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhzaGxsX3NfdywgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhzaGxsX3B3LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoc2hsbF9zX3B3LCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMihzaHJsX3FiLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hybF9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMihzaHJsX29iLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hybF9xaCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hyYV9xYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHNocmFfcl9xYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMihzaHJhX29iLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hyYV9yX29iLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMihzaHJhX3BoLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hyYV9yX3BoLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hyYV9yX3csIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzIoc2hyYV9xaCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHNocmFfcl9xaCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKHNocmFfcHcsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihzaHJhX3JfcHcsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKKyNlbmRpZgorCisvKiBEU1AgTXVsdGlwbHkgU3ViLWNsYXNzIGluc25zICovCitERUZfSEVMUEVSX0ZMQUdTXzMobXVsZXVfc19waF9xYmwsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxldV9zX3BoX3FiciwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxldV9zX3FoX29ibCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKG11bGV1X3NfcWhfb2JyLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxxX3JzX3BoLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKG11bHFfcnNfcWgsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKG11bGVxX3Nfd19waGwsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxlcV9zX3dfcGhyLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKG11bGVxX3NfcHdfcWhsLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMobXVsZXFfc19wd19xaHIsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU180KGRwYXVfaF9xYmwsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhdV9oX3FiciwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhdV9oX29ibCwgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChkcGF1X2hfb2JyLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBzdV9oX3FibCwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChkcHN1X2hfcWJyLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfNChkcHN1X2hfb2JsLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KGRwc3VfaF9vYnIsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfNChkcGFfd19waCwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhX3dfcWgsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfNChkcGF4X3dfcGgsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhcV9zX3dfcGgsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU180KGRwYXFfc193X3FoLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhcXhfc193X3BoLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KGRwYXF4X3NhX3dfcGgsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBzX3dfcGgsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU180KGRwc193X3FoLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBzeF93X3BoLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KGRwc3Ffc193X3BoLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfNChkcHNxX3Nfd19xaCwgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU180KGRwc3F4X3Nfd19waCwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChkcHNxeF9zYV93X3BoLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KG11bHNhcV9zX3dfcGgsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU180KG11bHNhcV9zX3dfcWgsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfNChkcGFxX3NhX2xfdywgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBhcV9zYV9sX3B3LCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzQoZHBzcV9zYV9sX3csIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU180KGRwc3Ffc2FfbF9wdywgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChtdWxzYXFfc19sX3B3LCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3Nfd19waGwsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3Nfd19waHIsIDAsIHZvaWQsIGkzMiwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3NhX3dfcGhsLCAwLCB2b2lkLCBpMzIsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KG1hcV9zYV93X3BociwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxfcGgsIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhtdWxfc19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKG11bHFfc19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKG11bHFfc193LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMobXVscV9yc193LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobXVsc2Ffd19waCwgMCwgdm9pZCwgaTMyLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3Nfd19xaGxsLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KG1hcV9zX3dfcWhsciwgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChtYXFfc193X3FocmwsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3Nfd19xaHJyLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KG1hcV9zYV93X3FobGwsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3NhX3dfcWhsciwgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfNChtYXFfc2Ffd19xaHJsLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KG1hcV9zYV93X3FocnIsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3NfbF9wd2wsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQobWFxX3NfbF9wd3IsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQoZG1hZGQsIDAsIHZvaWQsIHRsLCB0bCwgaTMyLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzQoZG1hZGR1LCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KGRtc3ViLCAwLCB2b2lkLCB0bCwgdGwsIGkzMiwgZW52KQorREVGX0hFTFBFUl9GTEFHU180KGRtc3VidSwgMCwgdm9pZCwgdGwsIHRsLCBpMzIsIGVudikKKyNlbmRpZgorCisvKiBEU1AgQml0L01hbmlwdWxhdGlvbiBTdWItY2xhc3MgaW5zbnMgKi8KK0RFRl9IRUxQRVJfRkxBR1NfMShiaXRyZXYsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18zKGluc3YsIDAsIHRsLCBlbnYsIHRsLCB0bCkKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoZGluc3YsIDAsIHRsLCBlbnYsIHRsLCB0bCk7CisjZW5kaWYKKworLyogRFNQIENvbXBhcmUtUGljayBTdWItY2xhc3MgaW5zbnMgKi8KK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXB1X2VxX3FiLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXB1X2x0X3FiLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXB1X2xlX3FiLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMihjbXBndV9lcV9xYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKGNtcGd1X2x0X3FiLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzIoY21wZ3VfbGVfcWIsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXBfZXFfcGgsIDAsIHZvaWQsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGNtcF9sdF9waCwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wX2xlX3BoLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wdV9lcV9vYiwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wdV9sdF9vYiwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wdV9sZV9vYiwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wZ2R1X2VxX29iLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wZ2R1X2x0X29iLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wZ2R1X2xlX29iLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzIoY21wZ3VfZXFfb2IsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKK0RFRl9IRUxQRVJfRkxBR1NfMihjbXBndV9sdF9vYiwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorREVGX0hFTFBFUl9GTEFHU18yKGNtcGd1X2xlX29iLCBUQ0dfQ0FMTF9OT19SV0dfU0UsIHRsLCB0bCwgdGwpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wX2VxX3FoLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXBfbHRfcWgsIDAsIHZvaWQsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGNtcF9sZV9xaCwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoY21wX2VxX3B3LCAwLCB2b2lkLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhjbXBfbHRfcHcsIDAsIHZvaWQsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGNtcF9sZV9wdywgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCisjZW5kaWYKK0RFRl9IRUxQRVJfRkxBR1NfMyhwaWNrX3FiLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMocGlja19waCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhwaWNrX29iLCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMocGlja19xaCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKHBpY2tfcHcsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18yKHBhY2tybF9waCwgVENHX0NBTExfTk9fUldHX1NFLCB0bCwgdGwsIHRsKQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMihwYWNrcmxfcHcsIFRDR19DQUxMX05PX1JXR19TRSwgdGwsIHRsLCB0bCkKKyNlbmRpZgorCisvKiBEU1AgQWNjdW11bGF0b3IgYW5kIERTUENvbnRyb2wgQWNjZXNzIFN1Yi1jbGFzcyBpbnNucyAqLworREVGX0hFTFBFUl9GTEFHU18zKGV4dHJfdywgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGV4dHJfcl93LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoZXh0cl9yc193LCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKGRleHRyX3csIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhkZXh0cl9yX3csIDAsIHRsLCB0bCwgdGwsIGVudikKK0RFRl9IRUxQRVJfRkxBR1NfMyhkZXh0cl9yc193LCAwLCB0bCwgdGwsIHRsLCBlbnYpCitERUZfSEVMUEVSX0ZMQUdTXzMoZGV4dHJfbCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGRleHRyX3JfbCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGRleHRyX3JzX2wsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKGV4dHJfc19oLCAwLCB0bCwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKGRleHRyX3NfaCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzMoZXh0cCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGV4dHBkcCwgMCwgdGwsIHRsLCB0bCwgZW52KQorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKK0RFRl9IRUxQRVJfRkxBR1NfMyhkZXh0cCwgMCwgdGwsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18zKGRleHRwZHAsIDAsIHRsLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKHNoaWxvLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitERUZfSEVMUEVSX0ZMQUdTXzMoZHNoaWxvLCAwLCB2b2lkLCB0bCwgdGwsIGVudikKKyNlbmRpZgorREVGX0hFTFBFUl9GTEFHU18zKG10aGxpcCwgMCwgdm9pZCwgdGwsIHRsLCBlbnYpCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorREVGX0hFTFBFUl9GTEFHU18zKGRtdGhsaXAsIDAsIHZvaWQsIHRsLCB0bCwgZW52KQorI2VuZGlmCitERUZfSEVMUEVSX0ZMQUdTXzMod3Jkc3AsIDAsIHZvaWQsIHRsLCB0bCwgZW52KQorREVGX0hFTFBFUl9GTEFHU18yKHJkZHNwLCAwLCB0bCwgdGwsIGVudikKKworI2luY2x1ZGUgImV4ZWMvZGVmLWhlbHBlci5oIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9tYWNoaW5lLmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjcyODM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9tYWNoaW5lLmMKQEAgLTAsMCArMSwzMDggQEAKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2JvYXJkcy5oIgorCisjaW5jbHVkZSAiY3B1LmgiCisKK3N0YXRpYyB2b2lkIHNhdmVfdGMoUUVNVUZpbGUgKmYsIFRDU3RhdGUgKnRjKQoreworICAgIGludCBpOworCisgICAgLyogU2F2ZSBhY3RpdmUgVEMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICBxZW11X3B1dF9iZXRscyhmLCAmdGMtPmdwcltpXSk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJnRjLT5QQyk7CisgICAgZm9yKGkgPSAwOyBpIDwgTUlQU19EU1BfQUNDOyBpKyspCisgICAgICAgIHFlbXVfcHV0X2JldGxzKGYsICZ0Yy0+SElbaV0pOworICAgIGZvcihpID0gMDsgaSA8IE1JUFNfRFNQX0FDQzsgaSsrKQorICAgICAgICBxZW11X3B1dF9iZXRscyhmLCAmdGMtPkxPW2ldKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBNSVBTX0RTUF9BQ0M7IGkrKykKKyAgICAgICAgcWVtdV9wdXRfYmV0bHMoZiwgJnRjLT5BQ1hbaV0pOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZ0Yy0+RFNQQ29udHJvbCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZ0Yy0+Q1AwX1RDU3RhdHVzKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJnRjLT5DUDBfVENCaW5kKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmdGMtPkNQMF9UQ0hhbHQpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZ0Yy0+Q1AwX1RDQ29udGV4dCk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJnRjLT5DUDBfVENTY2hlZHVsZSk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJnRjLT5DUDBfVENTY2hlRkJhY2spOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmdGMtPkNQMF9EZWJ1Z190Y3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNhdmVfZnB1KFFFTVVGaWxlICpmLCBDUFVNSVBTRlBVQ29udGV4dCAqZnB1KQoreworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKyAgICAgICAgcWVtdV9wdXRfYmU2NHMoZiwgJmZwdS0+ZnByW2ldLmQpOworICAgIHFlbXVfcHV0X3M4cyhmLCAmZnB1LT5mcF9zdGF0dXMuZmxvYXRfZGV0ZWN0X3RpbmluZXNzKTsKKyAgICBxZW11X3B1dF9zOHMoZiwgJmZwdS0+ZnBfc3RhdHVzLmZsb2F0X3JvdW5kaW5nX21vZGUpOworICAgIHFlbXVfcHV0X3M4cyhmLCAmZnB1LT5mcF9zdGF0dXMuZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKTsKKyAgICBxZW11X3B1dF9iZTMycyhmLCAmZnB1LT5mY3IwKTsKKyAgICBxZW11X3B1dF9iZTMycyhmLCAmZnB1LT5mY3IzMSk7Cit9CisKK3ZvaWQgY3B1X3NhdmUoUUVNVUZpbGUgKmYsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBDUFVNSVBTU3RhdGUgKmVudiA9IG9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIC8qIFNhdmUgYWN0aXZlIFRDICovCisgICAgc2F2ZV90YyhmLCAmZW52LT5hY3RpdmVfdGMpOworCisgICAgLyogU2F2ZSBhY3RpdmUgRlBVICovCisgICAgc2F2ZV9mcHUoZiwgJmVudi0+YWN0aXZlX2ZwdSk7CisKKyAgICAvKiBTYXZlIE1WUCAqLworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5tdnAtPkNQMF9NVlBDb250cm9sKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+bXZwLT5DUDBfTVZQQ29uZjApOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5tdnAtPkNQMF9NVlBDb25mMSk7CisKKyAgICAvKiBTYXZlIFRMQiAqLworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPnRsYi0+bmJfdGxiKTsKKyAgICBxZW11X3B1dF9iZTMycyhmLCAmZW52LT50bGItPnRsYl9pbl91c2UpOworICAgIGZvcihpID0gMDsgaSA8IE1JUFNfVExCX01BWDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGZsYWdzID0gKChlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uRyA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZW52LT50bGItPm1tdS5yNGsudGxiW2ldLkMwIDw8IDcpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5DMSA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uVjAgPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZW52LT50bGItPm1tdS5yNGsudGxiW2ldLlYxIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5EMCA8PCAxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uRDEgPDwgMCkpOworICAgICAgICB1aW50OF90IGFzaWQ7CisKKyAgICAgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5WUE4pOworICAgICAgICBxZW11X3B1dF9iZTMycyhmLCAmZW52LT50bGItPm1tdS5yNGsudGxiW2ldLlBhZ2VNYXNrKTsKKyAgICAgICAgYXNpZCA9IGVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5BU0lEOworICAgICAgICBxZW11X3B1dF84cyhmLCAmYXNpZCk7CisgICAgICAgIHFlbXVfcHV0X2JlMTZzKGYsICZmbGFncyk7CisgICAgICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uUEZOWzBdKTsKKyAgICAgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5QRk5bMV0pOworICAgIH0KKworICAgIC8qIFNhdmUgQ1BVIG1ldGFzdGF0ZSAqLworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPmN1cnJlbnRfdGMpOworICAgIHFlbXVfcHV0X2JlMzJzKGYsICZlbnYtPmN1cnJlbnRfZnB1KTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+ZXJyb3JfY29kZSk7CisgICAgcWVtdV9wdXRfYmUzMnMoZiwgJmVudi0+aGZsYWdzKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5idGFyZ2V0KTsKKyAgICBpID0gZW52LT5iY29uZDsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmkpOworCisgICAgLyogU2F2ZSByZW1haW5pbmcgQ1AxIHJlZ2lzdGVycyAqLworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfSW5kZXgpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfUmFuZG9tKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX1ZQRUNvbnRyb2wpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfVlBFQ29uZjApOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfVlBFQ29uZjEpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9ZUU1hc2spOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9WUEVTY2hlZHVsZSk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+Q1AwX1ZQRVNjaGVGQmFjayk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9WUEVPcHQpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9FbnRyeUxvMCk7CisgICAgcWVtdV9wdXRfYmV0bHMoZiwgJmVudi0+Q1AwX0VudHJ5TG8xKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5DUDBfQ29udGV4dCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9QYWdlTWFzayk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9QYWdlR3JhaW4pOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfV2lyZWQpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ29uZjApOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ29uZjEpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ29uZjIpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ29uZjMpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ29uZjQpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfSFdSRW5hKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5DUDBfQmFkVkFkZHIpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfQ291bnQpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9FbnRyeUhpKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvbXBhcmUpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU3RhdHVzKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX0ludEN0bCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9TUlNDdGwpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTTWFwKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NhdXNlKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5DUDBfRVBDKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX1BSaWQpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfRUJhc2UpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfQ29uZmlnMCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9Db25maWcxKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvbmZpZzIpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfQ29uZmlnMyk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9Db25maWc2KTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvbmZpZzcpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPmxsYWRkcik7CisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5DUDBfV2F0Y2hMb1tpXSk7CisgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX1dhdGNoSGlbaV0pOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9YQ29udGV4dCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9GcmFtZW1hc2spOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfRGVidWcpOworICAgIHFlbXVfcHV0X2JldGxzKGYsICZlbnYtPkNQMF9ERVBDKTsKKyAgICBxZW11X3B1dF9zYmUzMnMoZiwgJmVudi0+Q1AwX1BlcmZvcm1hbmNlMCk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9UYWdMbyk7CisgICAgcWVtdV9wdXRfc2JlMzJzKGYsICZlbnYtPkNQMF9EYXRhTG8pOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfVGFnSGkpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfRGF0YUhpKTsKKyAgICBxZW11X3B1dF9iZXRscyhmLCAmZW52LT5DUDBfRXJyb3JFUEMpOworICAgIHFlbXVfcHV0X3NiZTMycyhmLCAmZW52LT5DUDBfREVTQVZFKTsKKworICAgIC8qIFNhdmUgaW5hY3RpdmUgVEMgc3RhdGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTUlQU19TSEFET1dfU0VUX01BWDsgaSsrKQorICAgICAgICBzYXZlX3RjKGYsICZlbnYtPnRjc1tpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IE1JUFNfRlBVX01BWDsgaSsrKQorICAgICAgICBzYXZlX2ZwdShmLCAmZW52LT5mcHVzW2ldKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF90YyhRRU1VRmlsZSAqZiwgVENTdGF0ZSAqdGMpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBTYXZlIGFjdGl2ZSBUQyAqLworICAgIGZvcihpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZ0Yy0+Z3ByW2ldKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmdGMtPlBDKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBNSVBTX0RTUF9BQ0M7IGkrKykKKyAgICAgICAgcWVtdV9nZXRfYmV0bHMoZiwgJnRjLT5ISVtpXSk7CisgICAgZm9yKGkgPSAwOyBpIDwgTUlQU19EU1BfQUNDOyBpKyspCisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZ0Yy0+TE9baV0pOworICAgIGZvcihpID0gMDsgaSA8IE1JUFNfRFNQX0FDQzsgaSsrKQorICAgICAgICBxZW11X2dldF9iZXRscyhmLCAmdGMtPkFDWFtpXSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJnRjLT5EU1BDb250cm9sKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJnRjLT5DUDBfVENTdGF0dXMpOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmdGMtPkNQMF9UQ0JpbmQpOworICAgIHFlbXVfZ2V0X2JldGxzKGYsICZ0Yy0+Q1AwX1RDSGFsdCk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJnRjLT5DUDBfVENDb250ZXh0KTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmdGMtPkNQMF9UQ1NjaGVkdWxlKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmdGMtPkNQMF9UQ1NjaGVGQmFjayk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZ0Yy0+Q1AwX0RlYnVnX3Rjc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgbG9hZF9mcHUoUUVNVUZpbGUgKmYsIENQVU1JUFNGUFVDb250ZXh0ICpmcHUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKQorICAgICAgICBxZW11X2dldF9iZTY0cyhmLCAmZnB1LT5mcHJbaV0uZCk7CisgICAgcWVtdV9nZXRfczhzKGYsICZmcHUtPmZwX3N0YXR1cy5mbG9hdF9kZXRlY3RfdGluaW5lc3MpOworICAgIHFlbXVfZ2V0X3M4cyhmLCAmZnB1LT5mcF9zdGF0dXMuZmxvYXRfcm91bmRpbmdfbW9kZSk7CisgICAgcWVtdV9nZXRfczhzKGYsICZmcHUtPmZwX3N0YXR1cy5mbG9hdF9leGNlcHRpb25fZmxhZ3MpOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZmcHUtPmZjcjApOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZmcHUtPmZjcjMxKTsKK30KKworaW50IGNwdV9sb2FkKFFFTVVGaWxlICpmLCB2b2lkICpvcGFxdWUsIGludCB2ZXJzaW9uX2lkKQoreworICAgIENQVU1JUFNTdGF0ZSAqZW52ID0gb3BhcXVlOworICAgIGludCBpOworCisgICAgaWYgKHZlcnNpb25faWQgIT0gMykKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBMb2FkIGFjdGl2ZSBUQyAqLworICAgIGxvYWRfdGMoZiwgJmVudi0+YWN0aXZlX3RjKTsKKworICAgIC8qIExvYWQgYWN0aXZlIEZQVSAqLworICAgIGxvYWRfZnB1KGYsICZlbnYtPmFjdGl2ZV9mcHUpOworCisgICAgLyogTG9hZCBNVlAgKi8KKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+bXZwLT5DUDBfTVZQQ29udHJvbCk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPm12cC0+Q1AwX01WUENvbmYwKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+bXZwLT5DUDBfTVZQQ29uZjEpOworCisgICAgLyogTG9hZCBUTEIgKi8KKyAgICBxZW11X2dldF9iZTMycyhmLCAmZW52LT50bGItPm5iX3RsYik7CisgICAgcWVtdV9nZXRfYmUzMnMoZiwgJmVudi0+dGxiLT50bGJfaW5fdXNlKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBNSVBTX1RMQl9NQVg7IGkrKykgeworICAgICAgICB1aW50MTZfdCBmbGFnczsKKyAgICAgICAgdWludDhfdCBhc2lkOworCisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uVlBOKTsKKyAgICAgICAgcWVtdV9nZXRfYmUzMnMoZiwgJmVudi0+dGxiLT5tbXUucjRrLnRsYltpXS5QYWdlTWFzayk7CisgICAgICAgIHFlbXVfZ2V0XzhzKGYsICZhc2lkKTsKKyAgICAgICAgZW52LT50bGItPm1tdS5yNGsudGxiW2ldLkFTSUQgPSBhc2lkOworICAgICAgICBxZW11X2dldF9iZTE2cyhmLCAmZmxhZ3MpOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uRyA9IChmbGFncyA+PiAxMCkgJiAxOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uQzAgPSAoZmxhZ3MgPj4gNykgJiAzOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uQzEgPSAoZmxhZ3MgPj4gNCkgJiAzOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uVjAgPSAoZmxhZ3MgPj4gMykgJiAxOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uVjEgPSAoZmxhZ3MgPj4gMikgJiAxOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uRDAgPSAoZmxhZ3MgPj4gMSkgJiAxOworICAgICAgICBlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uRDEgPSAoZmxhZ3MgPj4gMCkgJiAxOworICAgICAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT50bGItPm1tdS5yNGsudGxiW2ldLlBGTlswXSk7CisgICAgICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPnRsYi0+bW11LnI0ay50bGJbaV0uUEZOWzFdKTsKKyAgICB9CisKKyAgICAvKiBMb2FkIENQVSBtZXRhc3RhdGUgKi8KKyAgICBxZW11X2dldF9iZTMycyhmLCAmZW52LT5jdXJyZW50X3RjKTsKKyAgICBxZW11X2dldF9iZTMycyhmLCAmZW52LT5jdXJyZW50X2ZwdSk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPmVycm9yX2NvZGUpOworICAgIHFlbXVfZ2V0X2JlMzJzKGYsICZlbnYtPmhmbGFncyk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+YnRhcmdldCk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZpKTsKKyAgICBlbnYtPmJjb25kID0gaTsKKworICAgIC8qIExvYWQgcmVtYWluaW5nIENQMSByZWdpc3RlcnMgKi8KKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0luZGV4KTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1JhbmRvbSk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9WUEVDb250cm9sKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1ZQRUNvbmYwKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1ZQRUNvbmYxKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfWVFNYXNrKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfVlBFU2NoZWR1bGUpOworICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPkNQMF9WUEVTY2hlRkJhY2spOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfVlBFT3B0KTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfRW50cnlMbzApOworICAgIHFlbXVfZ2V0X2JldGxzKGYsICZlbnYtPkNQMF9FbnRyeUxvMSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Q1AwX0NvbnRleHQpOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfUGFnZU1hc2spOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfUGFnZUdyYWluKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1dpcmVkKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU0NvbmYwKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU0NvbmYxKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU0NvbmYyKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU0NvbmYzKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU0NvbmY0KTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0hXUkVuYSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Q1AwX0JhZFZBZGRyKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvdW50KTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfRW50cnlIaSk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9Db21wYXJlKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1N0YXR1cyk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9JbnRDdGwpOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfU1JTQ3RsKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1NSU01hcCk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9DYXVzZSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Q1AwX0VQQyk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9QUmlkKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0VCYXNlKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvbmZpZzApOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfQ29uZmlnMSk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9Db25maWcyKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0NvbmZpZzMpOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfQ29uZmlnNik7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9Db25maWc3KTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5sbGFkZHIpOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Q1AwX1dhdGNoTG9baV0pOworICAgIGZvcihpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9XYXRjaEhpW2ldKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfWENvbnRleHQpOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfRnJhbWVtYXNrKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0RlYnVnKTsKKyAgICBxZW11X2dldF9iZXRscyhmLCAmZW52LT5DUDBfREVQQyk7CisgICAgcWVtdV9nZXRfc2JlMzJzKGYsICZlbnYtPkNQMF9QZXJmb3JtYW5jZTApOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfVGFnTG8pOworICAgIHFlbXVfZ2V0X3NiZTMycyhmLCAmZW52LT5DUDBfRGF0YUxvKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX1RhZ0hpKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0RhdGFIaSk7CisgICAgcWVtdV9nZXRfYmV0bHMoZiwgJmVudi0+Q1AwX0Vycm9yRVBDKTsKKyAgICBxZW11X2dldF9zYmUzMnMoZiwgJmVudi0+Q1AwX0RFU0FWRSk7CisKKyAgICAvKiBMb2FkIGluYWN0aXZlIFRDIHN0YXRlICovCisgICAgZm9yIChpID0gMDsgaSA8IE1JUFNfU0hBRE9XX1NFVF9NQVg7IGkrKykKKyAgICAgICAgbG9hZF90YyhmLCAmZW52LT50Y3NbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCBNSVBTX0ZQVV9NQVg7IGkrKykKKyAgICAgICAgbG9hZF9mcHUoZiwgJmVudi0+ZnB1c1tpXSk7CisKKyAgICAvKiBYWFg6IGVuc3VyZSBjb21wYXRpYmxpdHkgZm9yIGhhbHRlZCBiaXQgPyAqLworICAgIHRsYl9mbHVzaChlbnYsIDEpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9taXBzLWRlZnMuaCBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvbWlwcy1kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwOTRhMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvbWlwcy1kZWZzLmgKQEAgLTAsMCArMSw3MiBAQAorI2lmICFkZWZpbmVkIChfX1FFTVVfTUlQU19ERUZTX0hfXykKKyNkZWZpbmUgX19RRU1VX01JUFNfREVGU19IX18KKworLyogSWYgd2Ugd2FudCB0byB1c2UgaG9zdCBmbG9hdCByZWdzLi4uICovCisvLyNkZWZpbmUgVVNFX0hPU1RfRkxPQVRfUkVHUworCisvKiBSZWFsIHBhZ2VzIGFyZSB2YXJpYWJsZSBzaXplLi4uICovCisjZGVmaW5lIFRBUkdFVF9QQUdFX0JJVFMgMTIKKyNkZWZpbmUgTUlQU19UTEJfTUFYIDEyOAorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorI2RlZmluZSBUQVJHRVRfTE9OR19CSVRTIDY0CisjZGVmaW5lIFRBUkdFVF9QSFlTX0FERFJfU1BBQ0VfQklUUyAzNgorI2RlZmluZSBUQVJHRVRfVklSVF9BRERSX1NQQUNFX0JJVFMgNDIKKyNlbHNlCisjZGVmaW5lIFRBUkdFVF9MT05HX0JJVFMgMzIKKyNkZWZpbmUgVEFSR0VUX1BIWVNfQUREUl9TUEFDRV9CSVRTIDM2CisjZGVmaW5lIFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUyAzMgorI2VuZGlmCisKKy8qIE1hc2tzIHVzZWQgdG8gbWFyayBpbnN0cnVjdGlvbnMgdG8gaW5kaWNhdGUgd2hpY2ggSVNBIGxldmVsIHRoZXkKKyAgIHdlcmUgaW50cm9kdWNlZCBpbi4gKi8KKyNkZWZpbmUJCUlTQV9NSVBTMQkweDAwMDAwMDAxCisjZGVmaW5lCQlJU0FfTUlQUzIJMHgwMDAwMDAwMgorI2RlZmluZQkJSVNBX01JUFMzCTB4MDAwMDAwMDQKKyNkZWZpbmUJCUlTQV9NSVBTNAkweDAwMDAwMDA4CisjZGVmaW5lCQlJU0FfTUlQUzUJMHgwMDAwMDAxMAorI2RlZmluZQkJSVNBX01JUFMzMgkweDAwMDAwMDIwCisjZGVmaW5lCQlJU0FfTUlQUzMyUjIJMHgwMDAwMDA0MAorI2RlZmluZQkJSVNBX01JUFM2NAkweDAwMDAwMDgwCisjZGVmaW5lCQlJU0FfTUlQUzY0UjIJMHgwMDAwMDEwMAorCisvKiBNSVBTIEFTRXMuICovCisjZGVmaW5lCQlBU0VfTUlQUzE2CTB4MDAwMDEwMDAKKyNkZWZpbmUJCUFTRV9NSVBTM0QJMHgwMDAwMjAwMAorI2RlZmluZQkJQVNFX01ETVgJMHgwMDAwNDAwMAorI2RlZmluZQkJQVNFX0RTUAkJMHgwMDAwODAwMAorI2RlZmluZQkJQVNFX0RTUFIyCTB4MDAwMTAwMDAKKyNkZWZpbmUJCUFTRV9NVAkJMHgwMDAyMDAwMAorI2RlZmluZQkJQVNFX1NNQVJUTUlQUwkweDAwMDQwMDAwCisjZGVmaW5lIAlBU0VfTUlDUk9NSVBTCTB4MDAwODAwMDAKKworLyogQ2hpcCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuICovCisjZGVmaW5lCQlJTlNOX0xPT05HU09OMkUgIDB4MjAwMDAwMDAKKyNkZWZpbmUJCUlOU05fTE9PTkdTT04yRiAgMHg0MDAwMDAwMAorI2RlZmluZQkJSU5TTl9WUjU0WFgJMHg4MDAwMDAwMAorCisvKiBNSVBTIENQVSBkZWZpbmVzLiAqLworI2RlZmluZQkJQ1BVX01JUFMxCShJU0FfTUlQUzEpCisjZGVmaW5lCQlDUFVfTUlQUzIJKENQVV9NSVBTMSB8IElTQV9NSVBTMikKKyNkZWZpbmUJCUNQVV9NSVBTMwkoQ1BVX01JUFMyIHwgSVNBX01JUFMzKQorI2RlZmluZQkJQ1BVX01JUFM0CShDUFVfTUlQUzMgfCBJU0FfTUlQUzQpCisjZGVmaW5lCQlDUFVfVlI1NFhYCShDUFVfTUlQUzQgfCBJTlNOX1ZSNTRYWCkKKyNkZWZpbmUJCUNQVV9MT09OR1NPTjJFICAoQ1BVX01JUFMzIHwgSU5TTl9MT09OR1NPTjJFKQorI2RlZmluZQkJQ1BVX0xPT05HU09OMkYgIChDUFVfTUlQUzMgfCBJTlNOX0xPT05HU09OMkYpCisKKyNkZWZpbmUJCUNQVV9NSVBTNQkoQ1BVX01JUFM0IHwgSVNBX01JUFM1KQorCisvKiBNSVBTIFRlY2hub2xvZ2llcyAiUmVsZWFzZSAxIiAqLworI2RlZmluZQkJQ1BVX01JUFMzMgkoQ1BVX01JUFMyIHwgSVNBX01JUFMzMikKKyNkZWZpbmUJCUNQVV9NSVBTNjQJKENQVV9NSVBTNSB8IENQVV9NSVBTMzIgfCBJU0FfTUlQUzY0KQorCisvKiBNSVBTIFRlY2hub2xvZ2llcyAiUmVsZWFzZSAyIiAqLworI2RlZmluZQkJQ1BVX01JUFMzMlIyCShDUFVfTUlQUzMyIHwgSVNBX01JUFMzMlIyKQorI2RlZmluZQkJQ1BVX01JUFM2NFIyCShDUFVfTUlQUzY0IHwgQ1BVX01JUFMzMlIyIHwgSVNBX01JUFM2NFIyKQorCisvKiBTdHJpY3RseSBmb2xsb3cgdGhlIGFyY2hpdGVjdHVyZSBzdGFuZGFyZDoKKyAgIC0gRGlzYWxsb3cgInNwZWNpYWwiIGluc3RydWN0aW9uIGhhbmRsaW5nIGZvciBQTU9OL1NQSU0uCisgICBOb3RlIHRoYXQgd2Ugc3RpbGwgbWFpbnRhaW4gQ291bnQvQ29tcGFyZSB0byBtYXRjaCB0aGUgaG9zdCBjbG9jay4gKi8KKy8vI2RlZmluZSBNSVBTX1NUUklDVF9TVEFOREFSRCAxCisKKyNlbmRpZiAvKiAhZGVmaW5lZCAoX19RRU1VX01JUFNfREVGU19IX18pICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL29wX2hlbHBlci5jIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9vcF9oZWxwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFkOWRiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy9vcF9oZWxwZXIuYwpAQCAtMCwwICsxLDMxMDkgQEAKKy8qCisgKiAgTUlQUyBlbXVsYXRpb24gaGVscGVycyBmb3IgcWVtdS4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgSm9jZWx5biBNYXllcgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2luY2x1ZGUgInRjZy5oIgorI2luY2x1ZGUgImhlbHBlci5oIgorCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfZXhlYy5oIgorI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpICovCisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorc3RhdGljIGlubGluZSB2b2lkIGNwdV9taXBzX3RsYl9mbHVzaCAoQ1BVTUlQU1N0YXRlICplbnYsIGludCBmbHVzaF9nbG9iYWwpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wdXRlX2hmbGFncyhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBlbnYtPmhmbGFncyAmPSB+KE1JUFNfSEZMQUdfQ09QMVggfCBNSVBTX0hGTEFHXzY0IHwgTUlQU19IRkxBR19DUDAgfAorICAgICAgICAgICAgICAgICAgICAgTUlQU19IRkxBR19GNjQgfCBNSVBTX0hGTEFHX0ZQVSB8IE1JUFNfSEZMQUdfS1NVIHwKKyAgICAgICAgICAgICAgICAgICAgIE1JUFNfSEZMQUdfVVgpOworICAgIGlmICghKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VYTCkpICYmCisgICAgICAgICEoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfRVJMKSkgJiYKKyAgICAgICAgIShlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfRE0pKSB7CisgICAgICAgIGVudi0+aGZsYWdzIHw9IChlbnYtPkNQMF9TdGF0dXMgPj4gQ1AwU3RfS1NVKSAmIE1JUFNfSEZMQUdfS1NVOworICAgIH0KKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgaWYgKCgoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0tTVSkgIT0gTUlQU19IRkxBR19VTSkgfHwKKyAgICAgICAgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1BYKSkgfHwKKyAgICAgICAgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1VYKSkpIHsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR182NDsKKyAgICB9CisgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X1VYKSkgeworICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX1VYOworICAgIH0KKyNlbmRpZgorICAgIGlmICgoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfQ1UwKSkgfHwKKyAgICAgICAgIShlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfS1NVKSkgeworICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0NQMDsKKyAgICB9CisgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0NVMSkpIHsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19GUFU7CisgICAgfQorICAgIGlmIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9GUikpIHsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19GNjQ7CisgICAgfQorICAgIGlmIChlbnYtPmluc25fZmxhZ3MgJiBBU0VfRFNQUjIpIHsKKyAgICAgICAgLyogRW5hYmxlcyBhY2Nlc3MgTUlQUyBEU1AgcmVzb3VyY2VzLCBub3cgb3VyIGNwdSBpcyBEU1AgQVNFUjIsCisgICAgICAgICAgIHNvIGVuYWJsZSB0byBhY2Nlc3MgRFNQUjIgcmVzb3VyY2VzLiAqLworICAgICAgICBpZiAoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfTVgpKSB7CisgICAgICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0RTUCB8IE1JUFNfSEZMQUdfRFNQUjI7CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoZW52LT5pbnNuX2ZsYWdzICYgQVNFX0RTUCkgeworICAgICAgICAvKiBFbmFibGVzIGFjY2VzcyBNSVBTIERTUCByZXNvdXJjZXMsIG5vdyBvdXIgY3B1IGlzIERTUCBBU0UsCisgICAgICAgICAgIHNvIGVuYWJsZSB0byBhY2Nlc3MgRFNQIHJlc291cmNlcy4gKi8KKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X01YKSkgeworICAgICAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19EU1A7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVudi0+aW5zbl9mbGFncyAmIElTQV9NSVBTMzJSMikgeworICAgICAgICBpZiAoZW52LT5hY3RpdmVfZnB1LmZjcjAgJiAoMSA8PCBGQ1IwX0Y2NCkpIHsKKyAgICAgICAgICAgIGVudi0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfQ09QMVg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVudi0+aW5zbl9mbGFncyAmIElTQV9NSVBTMzIpIHsKKyAgICAgICAgaWYgKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR182NCkgeworICAgICAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19DT1AxWDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZW52LT5pbnNuX2ZsYWdzICYgSVNBX01JUFM0KSB7CisgICAgICAgIC8qIEFsbCBzdXBwb3J0ZWQgTUlQUyBJViBDUFVzIHVzZSB0aGUgWFggKENVMykgdG8gZW5hYmxlCisgICAgICAgICAgIGFuZCBkaXNhYmxlIHRoZSBNSVBTIElWIGV4dGVuc2lvbnMgdG8gdGhlIE1JUFMgSUlJIElTQS4KKyAgICAgICAgICAgU29tZSBvdGhlciBNSVBTIElWIENQVXMgaWdub3JlIHRoZSBiaXQsIHNvIHRoZSBjaGVjayBoZXJlCisgICAgICAgICAgIHdvdWxkIGJlIHRvbyByZXN0cmljdGl2ZSBmb3IgdGhlbS4gICovCisgICAgICAgIGlmIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9DVTMpKSB7CisgICAgICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0NPUDFYOworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFeGNlcHRpb25zIHByb2Nlc3NpbmcgaGVscGVycyAqLworCit2b2lkIGhlbHBlcl9yYWlzZV9leGNlcHRpb25fZXJyIChDUFVNSVBTU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4Y2VwdGlvbiwgaW50IGVycm9yX2NvZGUpCit7CisjaWYgMQorICAgIGlmIChleGNlcHRpb24gPCAweDEwMCkKKyAgICAgICAgcWVtdV9sb2coIiVzOiAlZCAlZFxuIiwgX19mdW5jX18sIGV4Y2VwdGlvbiwgZXJyb3JfY29kZSk7CisjZW5kaWYKKyAgICBlbnYtPmV4Y2VwdGlvbl9pbmRleCA9IGV4Y2VwdGlvbjsKKyAgICBlbnYtPmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworICAgIGNwdV9sb29wX2V4aXQoZW52KTsKK30KKwordm9pZCBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uIChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZXhjZXB0aW9uKQoreworICAgIGhlbHBlcl9yYWlzZV9leGNlcHRpb25fZXJyKGVudiwgZXhjZXB0aW9uLCAwKTsKK30KKwordm9pZCBoZWxwZXJfaW50ZXJydXB0X3Jlc3RhcnQgKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGlmICghKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VYTCkpICYmCisgICAgICAgICEoZW52LT5DUDBfU3RhdHVzICYgKDEgPDwgQ1AwU3RfRVJMKSkgJiYKKyAgICAgICAgIShlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfRE0pICYmCisgICAgICAgIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9JRSkpICYmCisgICAgICAgIChlbnYtPkNQMF9TdGF0dXMgJiBlbnYtPkNQMF9DYXVzZSAmIENQMENhX0lQX21hc2spKSB7CisgICAgICAgIGVudi0+Q1AwX0NhdXNlICY9IH4oMHgxZiA8PCBDUDBDYV9FQyk7CisgICAgICAgIGhlbHBlcl9yYWlzZV9leGNlcHRpb24oZW52LCBFWENQX0VYVF9JTlRFUlJVUFQpOworICAgIH0KK30KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCitzdGF0aWMgdm9pZCBkb19yZXN0b3JlX3N0YXRlIChDUFVNSVBTU3RhdGUgKmVudiwgdWludHB0cl90IHBjKQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworCisgICAgdGIgPSB0Yl9maW5kX3BjIChwYyk7CisgICAgaWYgKHRiKSB7CisgICAgICAgIGNwdV9yZXN0b3JlX3N0YXRlIChlbnYsIHBjKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNkZWZpbmUgSEVMUEVSX0xEKG5hbWUsIGluc24sIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdHlwZSBkb18jI25hbWUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbV9pZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKHR5cGUpIGNwdV8jI2luc24jI19yYXcoZW52LCBhZGRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UKKyNkZWZpbmUgSEVMUEVSX0xEKG5hbWUsIGluc24sIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdHlwZSBkb18jI25hbWUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbV9pZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzd2l0Y2ggKG1lbV9pZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDA6IHJldHVybiAodHlwZSkgY3B1XyMjaW5zbiMjX2tlcm5lbChlbnYsIGFkZHIpOyBicmVhazsgICAgICAgIFwKKyAgICBjYXNlIDE6IHJldHVybiAodHlwZSkgY3B1XyMjaW5zbiMjX3N1cGVyKGVudiwgYWRkcik7IGJyZWFrOyAgICAgICAgIFwKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDI6IHJldHVybiAodHlwZSkgY3B1XyMjaW5zbiMjX3VzZXIoZW52LCBhZGRyKTsgYnJlYWs7ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZgorSEVMUEVSX0xEKGxidSwgbGR1YiwgdWludDhfdCkKK0hFTFBFUl9MRChsdywgbGRsLCBpbnQzMl90KQorI2lmZGVmIFRBUkdFVF9NSVBTNjQKK0hFTFBFUl9MRChsZCwgbGRxLCBpbnQ2NF90KQorI2VuZGlmCisjdW5kZWYgSEVMUEVSX0xECisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjZGVmaW5lIEhFTFBFUl9TVChuYW1lLCBpbnNuLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fIyNuYW1lKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgdmFsLCBpbnQgbWVtX2lkeCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY3B1XyMjaW5zbiMjX3JhdyhlbnYsIGFkZHIsIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIEhFTFBFUl9TVChuYW1lLCBpbnNuLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fIyNuYW1lKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgdmFsLCBpbnQgbWVtX2lkeCkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoIChtZW1faWR4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAwOiBjcHVfIyNpbnNuIyNfa2VybmVsKGVudiwgYWRkciwgdmFsKTsgYnJlYWs7ICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAxOiBjcHVfIyNpbnNuIyNfc3VwZXIoZW52LCBhZGRyLCB2YWwpOyBicmVhazsgICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAyOiBjcHVfIyNpbnNuIyNfdXNlcihlbnYsIGFkZHIsIHZhbCk7IGJyZWFrOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYKK0hFTFBFUl9TVChzYiwgc3RiLCB1aW50OF90KQorSEVMUEVSX1NUKHN3LCBzdGwsIHVpbnQzMl90KQorI2lmZGVmIFRBUkdFVF9NSVBTNjQKK0hFTFBFUl9TVChzZCwgc3RxLCB1aW50NjRfdCkKKyNlbmRpZgorI3VuZGVmIEhFTFBFUl9TVAorCit0YXJnZXRfdWxvbmcgaGVscGVyX2NsbyAodGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgcmV0dXJuIGNsbzMyKGFyZzEpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2NseiAodGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgcmV0dXJuIGNsejMyKGFyZzEpOworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQordGFyZ2V0X3Vsb25nIGhlbHBlcl9kY2xvICh0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICByZXR1cm4gY2xvNjQoYXJnMSk7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZGNseiAodGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgcmV0dXJuIGNsejY0KGFyZzEpOworfQorI2VuZGlmIC8qIFRBUkdFVF9NSVBTNjQgKi8KKworLyogNjQgYml0cyBhcml0aG1ldGljIGZvciAzMiBiaXRzIGhvc3RzICovCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdldF9ISUxPKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHJldHVybiAoKHVpbnQ2NF90KShlbnYtPmFjdGl2ZV90Yy5ISVswXSkgPDwgMzIpIHwgKHVpbnQzMl90KWVudi0+YWN0aXZlX3RjLkxPWzBdOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X0hJTE8gKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBISUxPKQoreworICAgIGVudi0+YWN0aXZlX3RjLkxPWzBdID0gKGludDMyX3QpSElMTzsKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVswXSA9IChpbnQzMl90KShISUxPID4+IDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ISVQwX0xPIChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsIHVpbnQ2NF90IEhJTE8pCit7CisgICAgZW52LT5hY3RpdmVfdGMuTE9bMF0gPSAoaW50MzJfdCkoSElMTyAmIDB4RkZGRkZGRkYpOworICAgIGFyZzEgPSBlbnYtPmFjdGl2ZV90Yy5ISVswXSA9IChpbnQzMl90KShISUxPID4+IDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ISV9MT1QwIChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsIHVpbnQ2NF90IEhJTE8pCit7CisgICAgYXJnMSA9IGVudi0+YWN0aXZlX3RjLkxPWzBdID0gKGludDMyX3QpKEhJTE8gJiAweEZGRkZGRkZGKTsKKyAgICBlbnYtPmFjdGl2ZV90Yy5ISVswXSA9IChpbnQzMl90KShISUxPID4+IDMyKTsKK30KKworLyogTXVsdGlwbGljYXRpb24gdmFyaWFudHMgb2YgdGhlIHZyNTR4eC4gKi8KK3RhcmdldF91bG9uZyBoZWxwZXJfbXVscyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgc2V0X0hJX0xPVDAoZW52LCBhcmcxLCAwIC0gKChpbnQ2NF90KShpbnQzMl90KWFyZzEgKiAoaW50NjRfdCkoaW50MzJfdClhcmcyKSk7CisKKyAgICByZXR1cm4gYXJnMTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tdWxzdShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIHNldF9ISV9MT1QwKGVudiwgYXJnMSwgMCAtICgodWludDY0X3QpKHVpbnQzMl90KWFyZzEgKiAodWludDY0X3QpKHVpbnQzMl90KWFyZzIpKTsKKworICAgIHJldHVybiBhcmcxOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21hY2MoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIHNldF9ISV9MT1QwKGVudiwgYXJnMSwgKChpbnQ2NF90KWdldF9ISUxPKGVudikpICsgKChpbnQ2NF90KShpbnQzMl90KWFyZzEgKiAoaW50NjRfdCkoaW50MzJfdClhcmcyKSk7CisKKyAgICByZXR1cm4gYXJnMTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tYWNjaGkoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgc2V0X0hJVDBfTE8oZW52LCBhcmcxLCAoKGludDY0X3QpZ2V0X0hJTE8oZW52KSkgKyAoKGludDY0X3QpKGludDMyX3QpYXJnMSAqIChpbnQ2NF90KShpbnQzMl90KWFyZzIpKTsKKworICAgIHJldHVybiBhcmcxOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21hY2N1KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgc2V0X0hJX0xPVDAoZW52LCBhcmcxLCAoKHVpbnQ2NF90KWdldF9ISUxPKGVudikpICsgKCh1aW50NjRfdCkodWludDMyX3QpYXJnMSAqICh1aW50NjRfdCkodWludDMyX3QpYXJnMikpOworCisgICAgcmV0dXJuIGFyZzE7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWFjY2hpdShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgc2V0X0hJVDBfTE8oZW52LCBhcmcxLCAoKHVpbnQ2NF90KWdldF9ISUxPKGVudikpICsgKCh1aW50NjRfdCkodWludDMyX3QpYXJnMSAqICh1aW50NjRfdCkodWludDMyX3QpYXJnMikpOworCisgICAgcmV0dXJuIGFyZzE7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbXNhYyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgc2V0X0hJX0xPVDAoZW52LCBhcmcxLCAoKGludDY0X3QpZ2V0X0hJTE8oZW52KSkgLSAoKGludDY0X3QpKGludDMyX3QpYXJnMSAqIChpbnQ2NF90KShpbnQzMl90KWFyZzIpKTsKKworICAgIHJldHVybiBhcmcxOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21zYWNoaShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYXJnMikKK3sKKyAgICBzZXRfSElUMF9MTyhlbnYsIGFyZzEsICgoaW50NjRfdClnZXRfSElMTyhlbnYpKSAtICgoaW50NjRfdCkoaW50MzJfdClhcmcxICogKGludDY0X3QpKGludDMyX3QpYXJnMikpOworCisgICAgcmV0dXJuIGFyZzE7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbXNhY3UoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYXJnMikKK3sKKyAgICBzZXRfSElfTE9UMChlbnYsIGFyZzEsICgodWludDY0X3QpZ2V0X0hJTE8oZW52KSkgLSAoKHVpbnQ2NF90KSh1aW50MzJfdClhcmcxICogKHVpbnQ2NF90KSh1aW50MzJfdClhcmcyKSk7CisKKyAgICByZXR1cm4gYXJnMTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tc2FjaGl1KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYXJnMikKK3sKKyAgICBzZXRfSElUMF9MTyhlbnYsIGFyZzEsICgodWludDY0X3QpZ2V0X0hJTE8oZW52KSkgLSAoKHVpbnQ2NF90KSh1aW50MzJfdClhcmcxICogKHVpbnQ2NF90KSh1aW50MzJfdClhcmcyKSk7CisKKyAgICByZXR1cm4gYXJnMTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tdWxoaShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIHNldF9ISVQwX0xPKGVudiwgYXJnMSwgKGludDY0X3QpKGludDMyX3QpYXJnMSAqIChpbnQ2NF90KShpbnQzMl90KWFyZzIpOworCisgICAgcmV0dXJuIGFyZzE7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbXVsaGl1KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIHNldF9ISVQwX0xPKGVudiwgYXJnMSwgKHVpbnQ2NF90KSh1aW50MzJfdClhcmcxICogKHVpbnQ2NF90KSh1aW50MzJfdClhcmcyKTsKKworICAgIHJldHVybiBhcmcxOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX211bHNoaShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYXJnMikKK3sKKyAgICBzZXRfSElUMF9MTyhlbnYsIGFyZzEsIDAgLSAoKGludDY0X3QpKGludDMyX3QpYXJnMSAqIChpbnQ2NF90KShpbnQzMl90KWFyZzIpKTsKKworICAgIHJldHVybiBhcmcxOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX211bHNoaXUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIHNldF9ISVQwX0xPKGVudiwgYXJnMSwgMCAtICgodWludDY0X3QpKHVpbnQzMl90KWFyZzEgKiAodWludDY0X3QpKHVpbnQzMl90KWFyZzIpKTsKKworICAgIHJldHVybiBhcmcxOworfQorCisjaWZkZWYgVEFSR0VUX01JUFM2NAordm9pZCBoZWxwZXJfZG11bHQgKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwgdGFyZ2V0X3Vsb25nIGFyZzIpCit7CisgICAgbXVsczY0KCYoZW52LT5hY3RpdmVfdGMuTE9bMF0pLCAmKGVudi0+YWN0aXZlX3RjLkhJWzBdKSwgYXJnMSwgYXJnMik7Cit9CisKK3ZvaWQgaGVscGVyX2RtdWx0dSAoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB0YXJnZXRfdWxvbmcgYXJnMikKK3sKKyAgICBtdWx1NjQoJihlbnYtPmFjdGl2ZV90Yy5MT1swXSksICYoZW52LT5hY3RpdmVfdGMuSElbMF0pLCBhcmcxLCBhcmcyKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKKworc3RhdGljIGlubGluZSBod2FkZHIgZG9fdHJhbnNsYXRlX2FkZHJlc3MoQ1BVTUlQU1N0YXRlICplbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydykKK3sKKyAgICBod2FkZHIgbGxhZGRyOworCisgICAgbGxhZGRyID0gY3B1X21pcHNfdHJhbnNsYXRlX2FkZHJlc3MoZW52LCBhZGRyZXNzLCBydyk7CisKKyAgICBpZiAobGxhZGRyID09IChod2FkZHIpLTFMTCkgeworICAgICAgICBjcHVfbG9vcF9leGl0KGVudik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGxsYWRkcjsKKyAgICB9Cit9CisKKyNkZWZpbmUgSEVMUEVSX0xEX0FUT01JQyhuYW1lLCBpbnNuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RhcmdldF91bG9uZyBoZWxwZXJfIyNuYW1lKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnLCBpbnQgbWVtX2lkeCkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnYtPmxsYWRkciA9IGRvX3RyYW5zbGF0ZV9hZGRyZXNzKGVudiwgYXJnLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogTk9URShkaWdpdCk6IFVzZSBvZiAnY3B1X3NpbmdsZV9lbnYnIHdvcmtzIGFyb3VuZCBjb21waWxlciBidWchICovICAgICBcCisgICAgY3B1X3NpbmdsZV9lbnYtPmxsdmFsID0gZG9fIyNpbnNuKGVudiwgYXJnLCBtZW1faWR4KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZW52LT5sbHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorSEVMUEVSX0xEX0FUT01JQyhsbCwgbHcpCisjaWZkZWYgVEFSR0VUX01JUFM2NAorSEVMUEVSX0xEX0FUT01JQyhsbGQsIGxkKQorI2VuZGlmCisjdW5kZWYgSEVMUEVSX0xEX0FUT01JQworCisjZGVmaW5lIEhFTFBFUl9TVF9BVE9NSUMobmFtZSwgbGRfaW5zbiwgc3RfaW5zbiwgYWxtYXNrKSAgICAgICAgICAgICAgICAgICAgICBcCit0YXJnZXRfdWxvbmcgaGVscGVyXyMjbmFtZShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgYXJnMiwgaW50IG1lbV9pZHgpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFyZ2V0X2xvbmcgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGFyZzIgJiBhbG1hc2spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVudi0+Q1AwX0JhZFZBZGRyID0gYXJnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhlbHBlcl9yYWlzZV9leGNlcHRpb24oZW52LCBFWENQX0FkRVMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGRvX3RyYW5zbGF0ZV9hZGRyZXNzKGVudiwgYXJnMiwgMSkgPT0gZW52LT5sbGFkZHIpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRtcCA9IGRvXyMjbGRfaW5zbihlbnYsIGFyZzIsIG1lbV9pZHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh0bXAgPT0gZW52LT5sbHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb18jI3N0X2luc24oZW52LCBhcmcyLCBhcmcxLCBtZW1faWR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitIRUxQRVJfU1RfQVRPTUlDKHNjLCBsdywgc3csIDB4MykKKyNpZmRlZiBUQVJHRVRfTUlQUzY0CitIRUxQRVJfU1RfQVRPTUlDKHNjZCwgbGQsIHNkLCAweDcpCisjZW5kaWYKKyN1bmRlZiBIRUxQRVJfU1RfQVRPTUlDCisjZW5kaWYKKworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgR0VUX0xNQVNLKHYpICgodikgJiAzKQorI2RlZmluZSBHRVRfT0ZGU0VUKGFkZHIsIG9mZnNldCkgKGFkZHIgKyAob2Zmc2V0KSkKKyNlbHNlCisjZGVmaW5lIEdFVF9MTUFTSyh2KSAoKCh2KSAmIDMpIF4gMykKKyNkZWZpbmUgR0VUX09GRlNFVChhZGRyLCBvZmZzZXQpIChhZGRyIC0gKG9mZnNldCkpCisjZW5kaWYKKwordm9pZCBoZWxwZXJfc3dsKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwgdGFyZ2V0X3Vsb25nIGFyZzIsCisgICAgICAgICAgICAgICAgaW50IG1lbV9pZHgpCit7CisgICAgZG9fc2IoZW52LCBhcmcyLCAodWludDhfdCkoYXJnMSA+PiAyNCksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSyhhcmcyKSA8PSAyKQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgMSksICh1aW50OF90KShhcmcxID4+IDE2KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLKGFyZzIpIDw9IDEpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAyKSwgKHVpbnQ4X3QpKGFyZzEgPj4gOCksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSyhhcmcyKSA9PSAwKQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgMyksICh1aW50OF90KWFyZzEsIG1lbV9pZHgpOworfQorCit2b2lkIGhlbHBlcl9zd3IoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB0YXJnZXRfdWxvbmcgYXJnMiwKKyAgICAgICAgICAgICAgICBpbnQgbWVtX2lkeCkKK3sKKyAgICBkb19zYihlbnYsIGFyZzIsICh1aW50OF90KWFyZzEsIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSyhhcmcyKSA+PSAxKQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgLTEpLCAodWludDhfdCkoYXJnMSA+PiA4KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLKGFyZzIpID49IDIpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAtMiksICh1aW50OF90KShhcmcxID4+IDE2KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLKGFyZzIpID09IDMpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAtMyksICh1aW50OF90KShhcmcxID4+IDI0KSwgbWVtX2lkeCk7Cit9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisvKiAiaGFsZiIgbG9hZCBhbmQgc3RvcmVzLiAgV2UgbXVzdCBkbyB0aGUgbWVtb3J5IGFjY2VzcyBpbmxpbmUsCisgICBvciBmYXVsdCBoYW5kbGluZyB3b24ndCB3b3JrLiAgKi8KKworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgR0VUX0xNQVNLNjQodikgKCh2KSAmIDcpCisjZWxzZQorI2RlZmluZSBHRVRfTE1BU0s2NCh2KSAoKCh2KSAmIDcpIF4gNykKKyNlbmRpZgorCit2b2lkIGhlbHBlcl9zZGwoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB0YXJnZXRfdWxvbmcgYXJnMiwKKyAgICAgICAgICAgICAgICAgaW50IG1lbV9pZHgpCit7CisgICAgZG9fc2IoZW52LCBhcmcyLCAodWludDhfdCkoYXJnMSA+PiA1NiksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSzY0KGFyZzIpIDw9IDYpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAxKSwgKHVpbnQ4X3QpKGFyZzEgPj4gNDgpLCBtZW1faWR4KTsKKworICAgIGlmIChHRVRfTE1BU0s2NChhcmcyKSA8PSA1KQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgMiksICh1aW50OF90KShhcmcxID4+IDQwKSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPD0gNCkKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIDMpLCAodWludDhfdCkoYXJnMSA+PiAzMiksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSzY0KGFyZzIpIDw9IDMpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCA0KSwgKHVpbnQ4X3QpKGFyZzEgPj4gMjQpLCBtZW1faWR4KTsKKworICAgIGlmIChHRVRfTE1BU0s2NChhcmcyKSA8PSAyKQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgNSksICh1aW50OF90KShhcmcxID4+IDE2KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPD0gMSkKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIDYpLCAodWludDhfdCkoYXJnMSA+PiA4KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPD0gMCkKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIDcpLCAodWludDhfdClhcmcxLCBtZW1faWR4KTsKK30KKwordm9pZCBoZWxwZXJfc2RyKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwgdGFyZ2V0X3Vsb25nIGFyZzIsCisgICAgICAgICAgICAgICAgIGludCBtZW1faWR4KQoreworICAgIGRvX3NiKGVudiwgYXJnMiwgKHVpbnQ4X3QpYXJnMSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPj0gMSkKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIC0xKSwgKHVpbnQ4X3QpKGFyZzEgPj4gOCksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSzY0KGFyZzIpID49IDIpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAtMiksICh1aW50OF90KShhcmcxID4+IDE2KSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPj0gMykKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIC0zKSwgKHVpbnQ4X3QpKGFyZzEgPj4gMjQpLCBtZW1faWR4KTsKKworICAgIGlmIChHRVRfTE1BU0s2NChhcmcyKSA+PSA0KQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgLTQpLCAodWludDhfdCkoYXJnMSA+PiAzMiksIG1lbV9pZHgpOworCisgICAgaWYgKEdFVF9MTUFTSzY0KGFyZzIpID49IDUpCisgICAgICAgIGRvX3NiKGVudiwgR0VUX09GRlNFVChhcmcyLCAtNSksICh1aW50OF90KShhcmcxID4+IDQwKSwgbWVtX2lkeCk7CisKKyAgICBpZiAoR0VUX0xNQVNLNjQoYXJnMikgPj0gNikKKyAgICAgICAgZG9fc2IoZW52LCBHRVRfT0ZGU0VUKGFyZzIsIC02KSwgKHVpbnQ4X3QpKGFyZzEgPj4gNDgpLCBtZW1faWR4KTsKKworICAgIGlmIChHRVRfTE1BU0s2NChhcmcyKSA9PSA3KQorICAgICAgICBkb19zYihlbnYsIEdFVF9PRkZTRVQoYXJnMiwgLTcpLCAodWludDhfdCkoYXJnMSA+PiA1NiksIG1lbV9pZHgpOworfQorI2VuZGlmIC8qIFRBUkdFVF9NSVBTNjQgKi8KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisvKiB0YyBzaG91bGQgcG9pbnQgdG8gYW4gaW50IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBnbG9iYWwgVEMgaW5kZXguCisgICBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNmb3JtIGl0IGludG8gYSBsb2NhbCBpbmRleCB3aXRoaW4gdGhlCisgICByZXR1cm5lZCBDUFVTdGF0ZS4KKworICAgRklYTUU6IFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgYWxsIFZQRXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgVENzLAorICAgICAgICAgIHdoaWNoIGRlcGVuZHMgb24gcnVudGltZSBzZXR1cC4gQ2FuIHByb2JhYmx5IGJlIGZpeGVkIGJ5CisgICAgICAgICAgd2Fsa2luZyB0aGUgbGlzdCBvZiBDUFVNSVBTU3RhdGVzLiAgKi8KK3N0YXRpYyBDUFVNSVBTU3RhdGUgKm1pcHNfY3B1X21hcF90YyhDUFVNSVBTU3RhdGUgKmVudiwgaW50ICp0YykKK3sKKyAgICBpbnQgdnBlX2lkeCwgbnJfdGhyZWFkcyA9IEVOVl9HRVRfQ1BVKGVudiktPm5yX3RocmVhZHM7CisgICAgaW50IHRjX2lkeCA9ICp0YzsKKworICAgIGlmICghKGVudi0+Q1AwX1ZQRUNvbmYwICYgKDEgPDwgQ1AwVlBFQzBfTVZQKSkpIHsKKyAgICAgICAgLyogTm90IGFsbG93ZWQgdG8gYWRkcmVzcyBvdGhlciBDUFVzLiAgKi8KKyAgICAgICAgKnRjID0gZW52LT5jdXJyZW50X3RjOworICAgICAgICByZXR1cm4gZW52OworICAgIH0KKworICAgIHZwZV9pZHggPSB0Y19pZHggLyBucl90aHJlYWRzOworICAgICp0YyA9IHRjX2lkeCAlIG5yX3RocmVhZHM7CisgICAgQ1BVU3RhdGUgKm90aGVyID0gcWVtdV9nZXRfY3B1KHZwZV9pZHgpOworICAgIHJldHVybiBvdGhlciA/IG90aGVyLT5lbnZfcHRyIDogZW52OworfQorCisvKiBUaGUgcGVyIFZQRSBDUDBfU3RhdHVzIHJlZ2lzdGVyIHNoYXJlcyBzb21lIGZpZWxkcyB3aXRoIHRoZSBwZXIgVEMKKyAgIENQMF9UQ1N0YXR1cyByZWdpc3RlcnMuIFRoZXNlIGZpZWxkcyBhcmUgd2lyZWQgdG8gdGhlIHNhbWUgcmVnaXN0ZXJzLAorICAgc28gY2hhbmdlcyB0byBlaXRoZXIgb2YgdGhlbSBzaG91bGQgYmUgcmVmbGVjdGVkIG9uIGJvdGggcmVnaXN0ZXJzLgorCisgICBBbHNvLCBFbnRyeUhpIHNoYXJlcyB0aGUgYm90dG9tIDggYml0IEFTSUQgd2l0aCBUQ1N0YXV0cy4KKworICAgVGhlc2UgaGVscGVyIGNhbGwgc3luY2hyb25pemVzIHRoZSByZWdzIGZvciBhIGdpdmVuIGNwdS4gICovCisKKy8qIENhbGxlZCBmb3IgdXBkYXRlcyB0byBDUDBfU3RhdHVzLiAgKi8KK3N0YXRpYyB2b2lkIHN5bmNfYzBfc3RhdHVzKENQVU1JUFNTdGF0ZSAqZW52LCBDUFVNSVBTU3RhdGUgKmNwdSwgaW50IHRjKQoreworICAgIGludDMyX3QgdGNzdGF0dXMsICp0Y3N0OworICAgIHVpbnQzMl90IHYgPSBjcHUtPkNQMF9TdGF0dXM7CisgICAgdWludDMyX3QgY3UsIG14LCBhc2lkLCBrc3U7CisgICAgdWludDMyX3QgbWFzayA9ICgoMSA8PCBDUDBUQ1N0X1RDVTMpCisgICAgICAgICAgICAgICAgICAgICAgIHwgKDEgPDwgQ1AwVENTdF9UQ1UyKQorICAgICAgICAgICAgICAgICAgICAgICB8ICgxIDw8IENQMFRDU3RfVENVMSkKKyAgICAgICAgICAgICAgICAgICAgICAgfCAoMSA8PCBDUDBUQ1N0X1RDVTApCisgICAgICAgICAgICAgICAgICAgICAgIHwgKDEgPDwgQ1AwVENTdF9UTVgpCisgICAgICAgICAgICAgICAgICAgICAgIHwgKDMgPDwgQ1AwVENTdF9US1NVKQorICAgICAgICAgICAgICAgICAgICAgICB8ICgweGZmIDw8IENQMFRDU3RfVEFTSUQpKTsKKworICAgIGN1ID0gKHYgPj4gQ1AwU3RfQ1UwKSAmIDB4ZjsKKyAgICBteCA9ICh2ID4+IENQMFN0X01YKSAmIDB4MTsKKyAgICBrc3UgPSAodiA+PiBDUDBTdF9LU1UpICYgMHgzOworICAgIGFzaWQgPSBlbnYtPkNQMF9FbnRyeUhpICYgMHhmZjsKKworICAgIHRjc3RhdHVzID0gY3UgPDwgQ1AwVENTdF9UQ1UwOworICAgIHRjc3RhdHVzIHw9IG14IDw8IENQMFRDU3RfVE1YOworICAgIHRjc3RhdHVzIHw9IGtzdSA8PCBDUDBUQ1N0X1RLU1U7CisgICAgdGNzdGF0dXMgfD0gYXNpZDsKKworICAgIGlmICh0YyA9PSBjcHUtPmN1cnJlbnRfdGMpIHsKKyAgICAgICAgdGNzdCA9ICZjcHUtPmFjdGl2ZV90Yy5DUDBfVENTdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNzdCA9ICZjcHUtPnRjc1t0Y10uQ1AwX1RDU3RhdHVzOworICAgIH0KKworICAgICp0Y3N0ICY9IH5tYXNrOworICAgICp0Y3N0IHw9IHRjc3RhdHVzOworICAgIGNvbXB1dGVfaGZsYWdzKGNwdSk7Cit9CisKKy8qIENhbGxlZCBmb3IgdXBkYXRlcyB0byBDUDBfVENTdGF0dXMuICAqLworc3RhdGljIHZvaWQgc3luY19jMF90Y3N0YXR1cyhDUFVNSVBTU3RhdGUgKmNwdSwgaW50IHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdWxvbmcgdikKK3sKKyAgICB1aW50MzJfdCBzdGF0dXM7CisgICAgdWludDMyX3QgdGN1LCB0bXgsIHRhc2lkLCB0a3N1OworICAgIHVpbnQzMl90IG1hc2sgPSAoKDEgPDwgQ1AwU3RfQ1UzKQorICAgICAgICAgICAgICAgICAgICAgICB8ICgxIDw8IENQMFN0X0NVMikKKyAgICAgICAgICAgICAgICAgICAgICAgfCAoMSA8PCBDUDBTdF9DVTEpCisgICAgICAgICAgICAgICAgICAgICAgIHwgKDEgPDwgQ1AwU3RfQ1UwKQorICAgICAgICAgICAgICAgICAgICAgICB8ICgxIDw8IENQMFN0X01YKQorICAgICAgICAgICAgICAgICAgICAgICB8ICgzIDw8IENQMFN0X0tTVSkpOworCisgICAgdGN1ID0gKHYgPj4gQ1AwVENTdF9UQ1UwKSAmIDB4ZjsKKyAgICB0bXggPSAodiA+PiBDUDBUQ1N0X1RNWCkgJiAweDE7CisgICAgdGFzaWQgPSB2ICYgMHhmZjsKKyAgICB0a3N1ID0gKHYgPj4gQ1AwVENTdF9US1NVKSAmIDB4MzsKKworICAgIHN0YXR1cyA9IHRjdSA8PCBDUDBTdF9DVTA7CisgICAgc3RhdHVzIHw9IHRteCA8PCBDUDBTdF9NWDsKKyAgICBzdGF0dXMgfD0gdGtzdSA8PCBDUDBTdF9LU1U7CisKKyAgICBjcHUtPkNQMF9TdGF0dXMgJj0gfm1hc2s7CisgICAgY3B1LT5DUDBfU3RhdHVzIHw9IHN0YXR1czsKKworICAgIC8qIFN5bmMgdGhlIFRBU0lEIHdpdGggRW50cnlIaS4gICovCisgICAgY3B1LT5DUDBfRW50cnlIaSAmPSB+MHhmZjsKKyAgICBjcHUtPkNQMF9FbnRyeUhpID0gdGFzaWQ7CisKKyAgICBjb21wdXRlX2hmbGFncyhjcHUpOworfQorCisvKiBDYWxsZWQgZm9yIHVwZGF0ZXMgdG8gQ1AwX0VudHJ5SGkuICAqLworc3RhdGljIHZvaWQgc3luY19jMF9lbnRyeWhpKENQVU1JUFNTdGF0ZSAqY3B1LCBpbnQgdGMpCit7CisgICAgaW50MzJfdCAqdGNzdDsKKyAgICB1aW50MzJfdCBhc2lkLCB2ID0gY3B1LT5DUDBfRW50cnlIaTsKKworICAgIGFzaWQgPSB2ICYgMHhmZjsKKworICAgIGlmICh0YyA9PSBjcHUtPmN1cnJlbnRfdGMpIHsKKyAgICAgICAgdGNzdCA9ICZjcHUtPmFjdGl2ZV90Yy5DUDBfVENTdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNzdCA9ICZjcHUtPnRjc1t0Y10uQ1AwX1RDU3RhdHVzOworICAgIH0KKworICAgICp0Y3N0ICY9IH4weGZmOworICAgICp0Y3N0IHw9IGFzaWQ7Cit9CisKKy8qIENQMCBoZWxwZXJzICovCit0YXJnZXRfdWxvbmcgaGVscGVyX21mYzBfbXZwY29udHJvbChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5tdnAtPkNQMF9NVlBDb250cm9sOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mYzBfbXZwY29uZjAoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+bXZwLT5DUDBfTVZQQ29uZjA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZjMF9tdnBjb25mMShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5tdnAtPkNQMF9NVlBDb25mMTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3JhbmRvbShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gKGludDMyX3QpY3B1X21pcHNfZ2V0X3JhbmRvbShlbnYpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mYzBfdGNzdGF0dXMoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1N0YXR1czsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF90Y3N0YXR1cyhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgcmV0dXJuIG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDU3RhdHVzOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1N0YXR1czsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3RjYmluZChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuQ1AwX1RDQmluZDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF90Y2JpbmQoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ0JpbmQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gb3RoZXItPnRjc1tvdGhlcl90Y10uQ1AwX1RDQmluZDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3RjcmVzdGFydChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuUEM7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZ0YzBfdGNyZXN0YXJ0KENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICByZXR1cm4gb3RoZXItPmFjdGl2ZV90Yy5QQzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvdGhlci0+dGNzW290aGVyX3RjXS5QQzsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3RjaGFsdChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuQ1AwX1RDSGFsdDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF90Y2hhbHQoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ0hhbHQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gb3RoZXItPnRjc1tvdGhlcl90Y10uQ1AwX1RDSGFsdDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3RjY29udGV4dChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuQ1AwX1RDQ29udGV4dDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF90Y2NvbnRleHQoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ0NvbnRleHQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gb3RoZXItPnRjc1tvdGhlcl90Y10uQ1AwX1RDQ29udGV4dDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX3Rjc2NoZWR1bGUoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVkdWxlOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mdGMwX3Rjc2NoZWR1bGUoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVkdWxlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1NjaGVkdWxlOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mYzBfdGNzY2hlZmJhY2soQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVGQmFjazsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF90Y3NjaGVmYmFjayhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgcmV0dXJuIG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDU2NoZUZCYWNrOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1NjaGVGQmFjazsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX2NvdW50KENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHJldHVybiAoaW50MzJfdCljcHVfbWlwc19nZXRfY291bnQoZW52KTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF9lbnRyeWhpKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgcmV0dXJuIG90aGVyLT5DUDBfRW50cnlIaTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRjMF9zdGF0dXMoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICByZXR1cm4gb3RoZXItPkNQMF9TdGF0dXM7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZjMF9sbGFkZHIoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIChpbnQzMl90KShlbnYtPmxsYWRkciA+PiBlbnYtPkNQMF9MTEFkZHJfc2hpZnQpOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mYzBfd2F0Y2hsbyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgc2VsKQoreworICAgIHJldHVybiAoaW50MzJfdCllbnYtPkNQMF9XYXRjaExvW3NlbF07Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZjMF93YXRjaGhpKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBzZWwpCit7CisgICAgcmV0dXJuIGVudi0+Q1AwX1dhdGNoSGlbc2VsXTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZmMwX2RlYnVnKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHRhcmdldF91bG9uZyB0MCA9IGVudi0+Q1AwX0RlYnVnOworICAgIGlmIChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfRE0pCisgICAgICAgIHQwIHw9IDEgPDwgQ1AwREJfRE07CisKKyAgICByZXR1cm4gdDA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZ0YzBfZGVidWcoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgaW50MzJfdCB0Y3N0YXR1czsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgdGNzdGF0dXMgPSBvdGhlci0+YWN0aXZlX3RjLkNQMF9EZWJ1Z190Y3N0YXR1czsKKyAgICBlbHNlCisgICAgICAgIHRjc3RhdHVzID0gb3RoZXItPnRjc1tvdGhlcl90Y10uQ1AwX0RlYnVnX3Rjc3RhdHVzOworCisgICAgLyogWFhYOiBNaWdodCBiZSB3cm9uZywgY2hlY2sgd2l0aCBFSlRBRyBzcGVjLiAqLworICAgIHJldHVybiAob3RoZXItPkNQMF9EZWJ1ZyAmIH4oKDEgPDwgQ1AwREJfU1N0KSB8ICgxIDw8IENQMERCX0hhbHQpKSkgfAorICAgICAgICAgICAgKHRjc3RhdHVzICYgKCgxIDw8IENQMERCX1NTdCkgfCAoMSA8PCBDUDBEQl9IYWx0KSkpOworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQordGFyZ2V0X3Vsb25nIGhlbHBlcl9kbWZjMF90Y3Jlc3RhcnQoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLlBDOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2RtZmMwX3RjaGFsdChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuQ1AwX1RDSGFsdDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9kbWZjMF90Y2NvbnRleHQoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLkNQMF9UQ0NvbnRleHQ7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZG1mYzBfdGNzY2hlZHVsZShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICByZXR1cm4gZW52LT5hY3RpdmVfdGMuQ1AwX1RDU2NoZWR1bGU7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZG1mYzBfdGNzY2hlZmJhY2soQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVGQmFjazsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9kbWZjMF9sbGFkZHIoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcmV0dXJuIGVudi0+bGxhZGRyID4+IGVudi0+Q1AwX0xMQWRkcl9zaGlmdDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9kbWZjMF93YXRjaGxvKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBzZWwpCit7CisgICAgcmV0dXJuIGVudi0+Q1AwX1dhdGNoTG9bc2VsXTsKK30KKyNlbmRpZiAvKiBUQVJHRVRfTUlQUzY0ICovCisKK3ZvaWQgaGVscGVyX210YzBfaW5kZXgoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBudW0gPSAxOworICAgIHVuc2lnbmVkIGludCB0bXAgPSBlbnYtPnRsYi0+bmJfdGxiOworCisgICAgZG8geworICAgICAgICB0bXAgPj49IDE7CisgICAgICAgIG51bSA8PD0gMTsKKyAgICB9IHdoaWxlICh0bXApOworICAgIGVudi0+Q1AwX0luZGV4ID0gKGVudi0+Q1AwX0luZGV4ICYgMHg4MDAwMDAwMCkgfCAoYXJnMSAmIChudW0gLSAxKSk7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfbXZwY29udHJvbChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgdWludDMyX3QgbWFzayA9IDA7CisgICAgdWludDMyX3QgbmV3dmFsOworCisgICAgaWYgKGVudi0+Q1AwX1ZQRUNvbmYwICYgKDEgPDwgQ1AwVlBFQzBfTVZQKSkKKyAgICAgICAgbWFzayB8PSAoMSA8PCBDUDBNVlBDb19DUEEpIHwgKDEgPDwgQ1AwTVZQQ29fVlBDKSB8CisgICAgICAgICAgICAgICAgKDEgPDwgQ1AwTVZQQ29fRVZQKTsKKyAgICBpZiAoZW52LT5tdnAtPkNQMF9NVlBDb250cm9sICYgKDEgPDwgQ1AwTVZQQ29fVlBDKSkKKyAgICAgICAgbWFzayB8PSAoMSA8PCBDUDBNVlBDb19TVExCKTsKKyAgICBuZXd2YWwgPSAoZW52LT5tdnAtPkNQMF9NVlBDb250cm9sICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKKworICAgIC8vIFRPRE86IEVuYWJsZS9kaXNhYmxlIHNoYXJlZCBUTEIsIGVuYWJsZS9kaXNhYmxlIFZQRXMuCisKKyAgICBlbnYtPm12cC0+Q1AwX01WUENvbnRyb2wgPSBuZXd2YWw7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfdnBlY29udHJvbChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgdWludDMyX3QgbWFzazsKKyAgICB1aW50MzJfdCBuZXd2YWw7CisKKyAgICBtYXNrID0gKDEgPDwgQ1AwVlBFQ29fWVNJKSB8ICgxIDw8IENQMFZQRUNvX0dTSSkgfAorICAgICAgICAgICAoMSA8PCBDUDBWUEVDb19URSkgfCAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIG5ld3ZhbCA9IChlbnYtPkNQMF9WUEVDb250cm9sICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKKworICAgIC8qIFlpZWxkIHNjaGVkdWxlciBpbnRlcmNlcHQgbm90IGltcGxlbWVudGVkLiAqLworICAgIC8qIEdhdGluZyBzdG9yYWdlIHNjaGVkdWxlciBpbnRlcmNlcHQgbm90IGltcGxlbWVudGVkLiAqLworCisgICAgLy8gVE9ETzogRW5hYmxlL2Rpc2FibGUgVENzLgorCisgICAgZW52LT5DUDBfVlBFQ29udHJvbCA9IG5ld3ZhbDsKK30KKwordm9pZCBoZWxwZXJfbXRjMF92cGVjb25mMChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgdWludDMyX3QgbWFzayA9IDA7CisgICAgdWludDMyX3QgbmV3dmFsOworCisgICAgaWYgKGVudi0+Q1AwX1ZQRUNvbmYwICYgKDEgPDwgQ1AwVlBFQzBfTVZQKSkgeworICAgICAgICBpZiAoZW52LT5DUDBfVlBFQ29uZjAgJiAoMSA8PCBDUDBWUEVDMF9WUEEpKQorICAgICAgICAgICAgbWFzayB8PSAoMHhmZiA8PCBDUDBWUEVDMF9YVEMpOworICAgICAgICBtYXNrIHw9ICgxIDw8IENQMFZQRUMwX01WUCkgfCAoMSA8PCBDUDBWUEVDMF9WUEEpOworICAgIH0KKyAgICBuZXd2YWwgPSAoZW52LT5DUDBfVlBFQ29uZjAgJiB+bWFzaykgfCAoYXJnMSAmIG1hc2spOworCisgICAgLy8gVE9ETzogVEMgZXhjbHVzaXZlIGhhbmRsaW5nIGR1ZSB0byBFUkwvRVhMLgorCisgICAgZW52LT5DUDBfVlBFQ29uZjAgPSBuZXd2YWw7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfdnBlY29uZjEoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIHVpbnQzMl90IG1hc2sgPSAwOworICAgIHVpbnQzMl90IG5ld3ZhbDsKKworICAgIGlmIChlbnYtPm12cC0+Q1AwX01WUENvbnRyb2wgJiAoMSA8PCBDUDBNVlBDb19WUEMpKQorICAgICAgICBtYXNrIHw9ICgweGZmIDw8IENQMFZQRUMxX05DWCkgfCAoMHhmZiA8PCBDUDBWUEVDMV9OQ1AyKSB8CisgICAgICAgICAgICAgICAgKDB4ZmYgPDwgQ1AwVlBFQzFfTkNQMSk7CisgICAgbmV3dmFsID0gKGVudi0+Q1AwX1ZQRUNvbmYxICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKKworICAgIC8qIFVESSBub3QgaW1wbGVtZW50ZWQuICovCisgICAgLyogQ1AyIG5vdCBpbXBsZW1lbnRlZC4gKi8KKworICAgIC8vIFRPRE86IEhhbmRsZSBGUFUgKENQMSkgYmluZGluZy4KKworICAgIGVudi0+Q1AwX1ZQRUNvbmYxID0gbmV3dmFsOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3lxbWFzayhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgLyogWWllbGQgcXVhbGlmaWVyIGlucHV0cyBub3QgaW1wbGVtZW50ZWQuICovCisgICAgZW52LT5DUDBfWVFNYXNrID0gMHgwMDAwMDAwMDsKK30KKwordm9pZCBoZWxwZXJfbXRjMF92cGVvcHQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1ZQRU9wdCA9IGFyZzEgJiAweDAwMDBmZmZmOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2VudHJ5bG8wKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICAvKiBMYXJnZSBwaHlzYWRkciAoUEFCSVRTKSBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICAvKiAxayBwYWdlcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICBlbnYtPkNQMF9FbnRyeUxvMCA9IGFyZzEgJiAweDNGRkZGRkZGOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3Rjc3RhdHVzKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICB1aW50MzJfdCBtYXNrID0gZW52LT5DUDBfVENTdGF0dXNfcndfYml0bWFzazsKKyAgICB1aW50MzJfdCBuZXd2YWw7CisKKyAgICBuZXd2YWwgPSAoZW52LT5hY3RpdmVfdGMuQ1AwX1RDU3RhdHVzICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKKworICAgIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1N0YXR1cyA9IG5ld3ZhbDsKKyAgICBzeW5jX2MwX3Rjc3RhdHVzKGVudiwgZW52LT5jdXJyZW50X3RjLCBuZXd2YWwpOworfQorCit2b2lkIGhlbHBlcl9tdHRjMF90Y3N0YXR1cyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDU3RhdHVzID0gYXJnMTsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1N0YXR1cyA9IGFyZzE7CisgICAgc3luY19jMF90Y3N0YXR1cyhvdGhlciwgb3RoZXJfdGMsIGFyZzEpOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3RjYmluZChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgdWludDMyX3QgbWFzayA9ICgxIDw8IENQMFRDQmRfVEJFKTsKKyAgICB1aW50MzJfdCBuZXd2YWw7CisKKyAgICBpZiAoZW52LT5tdnAtPkNQMF9NVlBDb250cm9sICYgKDEgPDwgQ1AwTVZQQ29fVlBDKSkKKyAgICAgICAgbWFzayB8PSAoMSA8PCBDUDBUQ0JkX0N1clZQRSk7CisgICAgbmV3dmFsID0gKGVudi0+YWN0aXZlX3RjLkNQMF9UQ0JpbmQgJiB+bWFzaykgfCAoYXJnMSAmIG1hc2spOworICAgIGVudi0+YWN0aXZlX3RjLkNQMF9UQ0JpbmQgPSBuZXd2YWw7Cit9CisKK3ZvaWQgaGVscGVyX210dGMwX3RjYmluZChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgdWludDMyX3QgbWFzayA9ICgxIDw8IENQMFRDQmRfVEJFKTsKKyAgICB1aW50MzJfdCBuZXd2YWw7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXItPm12cC0+Q1AwX01WUENvbnRyb2wgJiAoMSA8PCBDUDBNVlBDb19WUEMpKQorICAgICAgICBtYXNrIHw9ICgxIDw8IENQMFRDQmRfQ3VyVlBFKTsKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpIHsKKyAgICAgICAgbmV3dmFsID0gKG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDQmluZCAmIH5tYXNrKSB8IChhcmcxICYgbWFzayk7CisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDQmluZCA9IG5ld3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBuZXd2YWwgPSAob3RoZXItPnRjc1tvdGhlcl90Y10uQ1AwX1RDQmluZCAmIH5tYXNrKSB8IChhcmcxICYgbWFzayk7CisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ0JpbmQgPSBuZXd2YWw7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9tdGMwX3RjcmVzdGFydChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5hY3RpdmVfdGMuUEMgPSBhcmcxOworICAgIGVudi0+YWN0aXZlX3RjLkNQMF9UQ1N0YXR1cyAmPSB+KDEgPDwgQ1AwVENTdF9URFMpOworICAgIGVudi0+bGxhZGRyID0gMFVMTDsKKyAgICAvKiBNSVBTMTYgbm90IGltcGxlbWVudGVkLiAqLworfQorCit2b2lkIGhlbHBlcl9tdHRjMF90Y3Jlc3RhcnQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKSB7CisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuUEMgPSBhcmcxOworICAgICAgICBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ1N0YXR1cyAmPSB+KDEgPDwgQ1AwVENTdF9URFMpOworICAgICAgICBvdGhlci0+bGxhZGRyID0gMFVMTDsKKyAgICAgICAgLyogTUlQUzE2IG5vdCBpbXBsZW1lbnRlZC4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBvdGhlci0+dGNzW290aGVyX3RjXS5QQyA9IGFyZzE7CisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1N0YXR1cyAmPSB+KDEgPDwgQ1AwVENTdF9URFMpOworICAgICAgICBvdGhlci0+bGxhZGRyID0gMFVMTDsKKyAgICAgICAgLyogTUlQUzE2IG5vdCBpbXBsZW1lbnRlZC4gKi8KKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX210YzBfdGNoYWx0KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPmFjdGl2ZV90Yy5DUDBfVENIYWx0ID0gYXJnMSAmIDB4MTsKKworICAgIC8vIFRPRE86IEhhbHQgVEMgLyBSZXN0YXJ0IChpZiBhbGxvY2F0ZWQrYWN0aXZlKSBUQy4KK30KKwordm9pZCBoZWxwZXJfbXR0YzBfdGNoYWx0KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIC8vIFRPRE86IEhhbHQgVEMgLyBSZXN0YXJ0IChpZiBhbGxvY2F0ZWQrYWN0aXZlKSBUQy4KKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgb3RoZXItPmFjdGl2ZV90Yy5DUDBfVENIYWx0ID0gYXJnMTsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ0hhbHQgPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3RjY29udGV4dChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5hY3RpdmVfdGMuQ1AwX1RDQ29udGV4dCA9IGFyZzE7Cit9CisKK3ZvaWQgaGVscGVyX210dGMwX3RjY29udGV4dChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuQ1AwX1RDQ29udGV4dCA9IGFyZzE7CisgICAgZWxzZQorICAgICAgICBvdGhlci0+dGNzW290aGVyX3RjXS5DUDBfVENDb250ZXh0ID0gYXJnMTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF90Y3NjaGVkdWxlKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPmFjdGl2ZV90Yy5DUDBfVENTY2hlZHVsZSA9IGFyZzE7Cit9CisKK3ZvaWQgaGVscGVyX210dGMwX3Rjc2NoZWR1bGUoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVkdWxlID0gYXJnMTsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9UQ1NjaGVkdWxlID0gYXJnMTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF90Y3NjaGVmYmFjayhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5hY3RpdmVfdGMuQ1AwX1RDU2NoZUZCYWNrID0gYXJnMTsKK30KKwordm9pZCBoZWxwZXJfbXR0YzBfdGNzY2hlZmJhY2soQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICBvdGhlci0+YWN0aXZlX3RjLkNQMF9UQ1NjaGVGQmFjayA9IGFyZzE7CisgICAgZWxzZQorICAgICAgICBvdGhlci0+dGNzW290aGVyX3RjXS5DUDBfVENTY2hlRkJhY2sgPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2VudHJ5bG8xKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICAvKiBMYXJnZSBwaHlzYWRkciAoUEFCSVRTKSBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICAvKiAxayBwYWdlcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICBlbnYtPkNQMF9FbnRyeUxvMSA9IGFyZzEgJiAweDNGRkZGRkZGOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2NvbnRleHQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX0NvbnRleHQgPSAoZW52LT5DUDBfQ29udGV4dCAmIDB4MDA3RkZGRkYpIHwgKGFyZzEgJiB+MHgwMDdGRkZGRik7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfcGFnZW1hc2soQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIC8qIDFrIHBhZ2VzIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIGVudi0+Q1AwX1BhZ2VNYXNrID0gYXJnMSAmICgweDFGRkZGRkZGICYgKFRBUkdFVF9QQUdFX01BU0sgPDwgMSkpOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3BhZ2VncmFpbihDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgLyogU21hcnRNSVBTIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIC8qIExhcmdlIHBoeXNhZGRyIChQQUJJVFMpIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIC8qIDFrIHBhZ2VzIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIGVudi0+Q1AwX1BhZ2VHcmFpbiA9IDA7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfd2lyZWQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1dpcmVkID0gYXJnMSAlIGVudi0+dGxiLT5uYl90bGI7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfc3JzY29uZjAoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1NSU0NvbmYwIHw9IGFyZzEgJiBlbnYtPkNQMF9TUlNDb25mMF9yd19iaXRtYXNrOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3Nyc2NvbmYxKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPkNQMF9TUlNDb25mMSB8PSBhcmcxICYgZW52LT5DUDBfU1JTQ29uZjFfcndfYml0bWFzazsKK30KKwordm9pZCBoZWxwZXJfbXRjMF9zcnNjb25mMihDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5DUDBfU1JTQ29uZjIgfD0gYXJnMSAmIGVudi0+Q1AwX1NSU0NvbmYyX3J3X2JpdG1hc2s7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfc3JzY29uZjMoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1NSU0NvbmYzIHw9IGFyZzEgJiBlbnYtPkNQMF9TUlNDb25mM19yd19iaXRtYXNrOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3Nyc2NvbmY0KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPkNQMF9TUlNDb25mNCB8PSBhcmcxICYgZW52LT5DUDBfU1JTQ29uZjRfcndfYml0bWFzazsKK30KKwordm9pZCBoZWxwZXJfbXRjMF9od3JlbmEoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX0hXUkVuYSA9IGFyZzEgJiAweDAwMDAwMDBGOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2NvdW50KENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBjcHVfbWlwc19zdG9yZV9jb3VudChlbnYsIGFyZzEpOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2VudHJ5aGkoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIHRhcmdldF91bG9uZyBvbGQsIHZhbDsKKworICAgIC8qIDFrIHBhZ2VzIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIHZhbCA9IGFyZzEgJiAoKFRBUkdFVF9QQUdFX01BU0sgPDwgMSkgfCAweEZGKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgdmFsICY9IGVudi0+U0VHTWFzazsKKyNlbmRpZgorICAgIG9sZCA9IGVudi0+Q1AwX0VudHJ5SGk7CisgICAgZW52LT5DUDBfRW50cnlIaSA9IHZhbDsKKyAgICBpZiAoZW52LT5DUDBfQ29uZmlnMyAmICgxIDw8IENQMEMzX01UKSkgeworICAgICAgICBzeW5jX2MwX2VudHJ5aGkoZW52LCBlbnYtPmN1cnJlbnRfdGMpOworICAgIH0KKyAgICAvKiBJZiB0aGUgQVNJRCBjaGFuZ2VzLCBmbHVzaCBxZW11J3MgVExCLiAgKi8KKyAgICBpZiAoKG9sZCAmIDB4RkYpICE9ICh2YWwgJiAweEZGKSkKKyAgICAgICAgY3B1X21pcHNfdGxiX2ZsdXNoKGVudiwgMSk7Cit9CisKK3ZvaWQgaGVscGVyX210dGMwX2VudHJ5aGkoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgb3RoZXItPkNQMF9FbnRyeUhpID0gYXJnMTsKKyAgICBzeW5jX2MwX2VudHJ5aGkob3RoZXIsIG90aGVyX3RjKTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF9jb21wYXJlKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBjcHVfbWlwc19zdG9yZV9jb21wYXJlKGVudiwgYXJnMSk7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfc3RhdHVzKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICB1aW50MzJfdCB2YWwsIG9sZDsKKyAgICB1aW50MzJfdCBtYXNrID0gZW52LT5DUDBfU3RhdHVzX3J3X2JpdG1hc2s7CisKKyAgICB2YWwgPSBhcmcxICYgbWFzazsKKyAgICBvbGQgPSBlbnYtPkNQMF9TdGF0dXM7CisgICAgZW52LT5DUDBfU3RhdHVzID0gKGVudi0+Q1AwX1N0YXR1cyAmIH5tYXNrKSB8IHZhbDsKKyAgICBpZiAoZW52LT5DUDBfQ29uZmlnMyAmICgxIDw8IENQMEMzX01UKSkgeworICAgICAgICBzeW5jX2MwX3N0YXR1cyhlbnYsIGVudiwgZW52LT5jdXJyZW50X3RjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb21wdXRlX2hmbGFncyhlbnYpOworICAgIH0KKworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19FWEVDKSkgeworICAgICAgICBxZW11X2xvZygiU3RhdHVzICUwOHggKCUwOHgpID0+ICUwOHggKCUwOHgpIENhdXNlICUwOHgiLAorICAgICAgICAgICAgICAgIG9sZCwgb2xkICYgZW52LT5DUDBfQ2F1c2UgJiBDUDBDYV9JUF9tYXNrLAorICAgICAgICAgICAgICAgIHZhbCwgdmFsICYgZW52LT5DUDBfQ2F1c2UgJiBDUDBDYV9JUF9tYXNrLAorICAgICAgICAgICAgICAgIGVudi0+Q1AwX0NhdXNlKTsKKyAgICAgICAgc3dpdGNoIChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfS1NVKSB7CisgICAgICAgIGNhc2UgTUlQU19IRkxBR19VTTogcWVtdV9sb2coIiwgVU1cbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBNSVBTX0hGTEFHX1NNOiBxZW11X2xvZygiLCBTTVxuIik7IGJyZWFrOworICAgICAgICBjYXNlIE1JUFNfSEZMQUdfS006IHFlbXVfbG9nKCJcbiIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogY3B1X2Fib3J0KGVudiwgIkludmFsaWQgTU1VIG1vZGUhXG4iKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY3B1X21pcHNfdXBkYXRlX2lycShlbnYpOworfQorCit2b2lkIGhlbHBlcl9tdHRjMF9zdGF0dXMoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgb3RoZXItPkNQMF9TdGF0dXMgPSBhcmcxICYgfjB4ZjEwMDAwMTg7CisgICAgc3luY19jMF9zdGF0dXMoZW52LCBvdGhlciwgb3RoZXJfdGMpOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2ludGN0bChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgLyogdmVjdG9yZWQgaW50ZXJydXB0cyBub3QgaW1wbGVtZW50ZWQsIG5vIHBlcmZvcm1hbmNlIGNvdW50ZXJzLiAqLworICAgIGVudi0+Q1AwX0ludEN0bCA9IChlbnYtPkNQMF9JbnRDdGwgJiB+MHgwMDAwMDJlMCkgfCAoYXJnMSAmIDB4MDAwMDAyZTApOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3Nyc2N0bChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgdWludDMyX3QgbWFzayA9ICgweGYgPDwgQ1AwU1JTQ3RsX0VTUykgfCAoMHhmIDw8IENQMFNSU0N0bF9QU1MpOworICAgIGVudi0+Q1AwX1NSU0N0bCA9IChlbnYtPkNQMF9TUlNDdGwgJiB+bWFzaykgfCAoYXJnMSAmIG1hc2spOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2NhdXNlKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICB1aW50MzJfdCBtYXNrID0gMHgwMEMwMDMwMDsKKyAgICB1aW50MzJfdCBvbGQgPSBlbnYtPkNQMF9DYXVzZTsKKworICAgIGlmIChlbnYtPmluc25fZmxhZ3MgJiBJU0FfTUlQUzMyUjIpCisgICAgICAgIG1hc2sgfD0gMSA8PCBDUDBDYV9EQzsKKworICAgIGVudi0+Q1AwX0NhdXNlID0gKGVudi0+Q1AwX0NhdXNlICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKKworICAgIGlmICgob2xkIF4gZW52LT5DUDBfQ2F1c2UpICYgKDEgPDwgQ1AwQ2FfREMpKSB7CisgICAgICAgIGlmIChlbnYtPkNQMF9DYXVzZSAmICgxIDw8IENQMENhX0RDKSkKKyAgICAgICAgICAgIGNwdV9taXBzX3N0b3BfY291bnQoZW52KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3B1X21pcHNfc3RhcnRfY291bnQoZW52KTsKKyAgICB9CisKKyAgICAvKiBIYW5kbGUgdGhlIHNvZnR3YXJlIGludGVycnVwdCBhcyBhbiBoYXJkd2FyZSBvbmUsIGFzIHRoZXkKKyAgICAgICBhcmUgdmVyeSBzaW1pbGFyICovCisgICAgaWYgKGFyZzEgJiBDUDBDYV9JUF9tYXNrKSB7CisgICAgICAgIGNwdV9taXBzX3VwZGF0ZV9pcnEoZW52KTsKKyAgICB9Cit9CisKK3ZvaWQgaGVscGVyX210YzBfZWJhc2UoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIC8qIHZlY3RvcmVkIGludGVycnVwdHMgbm90IGltcGxlbWVudGVkICovCisgICAgLyogTXVsdGktQ1BVIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIGVudi0+Q1AwX0VCYXNlID0gMHg4MDAwMDAwMCB8IChhcmcxICYgMHgzRkZGRjAwMCk7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfY29uZmlnMChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5DUDBfQ29uZmlnMCA9IChlbnYtPkNQMF9Db25maWcwICYgMHg4MUZGRkZGOCkgfCAoYXJnMSAmIDB4MDAwMDAwMDcpOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2NvbmZpZzIoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIC8qIHRlcnRpYXJ5L3NlY29uZGFyeSBjYWNoZXMgbm90IGltcGxlbWVudGVkICovCisgICAgZW52LT5DUDBfQ29uZmlnMiA9IChlbnYtPkNQMF9Db25maWcyICYgMHg4RkZGMEZGRik7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfbGxhZGRyKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICB0YXJnZXRfbG9uZyBtYXNrID0gZW52LT5DUDBfTExBZGRyX3J3X2JpdG1hc2s7CisgICAgYXJnMSA9IGFyZzEgPDwgZW52LT5DUDBfTExBZGRyX3NoaWZ0OworICAgIGVudi0+bGxhZGRyID0gKGVudi0+bGxhZGRyICYgfm1hc2spIHwgKGFyZzEgJiBtYXNrKTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF93YXRjaGxvKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwgdWludDMyX3Qgc2VsKQoreworICAgIC8qIFdhdGNoIGV4Y2VwdGlvbnMgZm9yIGluc3RydWN0aW9ucywgZGF0YSBsb2FkcywgZGF0YSBzdG9yZXMKKyAgICAgICBub3QgaW1wbGVtZW50ZWQuICovCisgICAgZW52LT5DUDBfV2F0Y2hMb1tzZWxdID0gKGFyZzEgJiB+MHg3KTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF93YXRjaGhpKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSwgdWludDMyX3Qgc2VsKQoreworICAgIGVudi0+Q1AwX1dhdGNoSGlbc2VsXSA9IChhcmcxICYgMHg0MEZGMEZGOCk7CisgICAgZW52LT5DUDBfV2F0Y2hIaVtzZWxdICY9IH4oZW52LT5DUDBfV2F0Y2hIaVtzZWxdICYgYXJnMSAmIDB4Nyk7Cit9CisKK3ZvaWQgaGVscGVyX210YzBfeGNvbnRleHQoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIHRhcmdldF91bG9uZyBtYXNrID0gKDFVTEwgPDwgKGVudi0+U0VHQklUUyAtIDcpKSAtIDE7CisgICAgZW52LT5DUDBfWENvbnRleHQgPSAoZW52LT5DUDBfWENvbnRleHQgJiBtYXNrKSB8IChhcmcxICYgfm1hc2spOworfQorCit2b2lkIGhlbHBlcl9tdGMwX2ZyYW1lbWFzayhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5DUDBfRnJhbWVtYXNrID0gYXJnMTsgLyogWFhYICovCit9CisKK3ZvaWQgaGVscGVyX210YzBfZGVidWcoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX0RlYnVnID0gKGVudi0+Q1AwX0RlYnVnICYgMHg4QzAzRkMxRikgfCAoYXJnMSAmIDB4MTMzMDAxMjApOworICAgIGlmIChhcmcxICYgKDEgPDwgQ1AwREJfRE0pKQorICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0RNOworICAgIGVsc2UKKyAgICAgICAgZW52LT5oZmxhZ3MgJj0gfk1JUFNfSEZMQUdfRE07Cit9CisKK3ZvaWQgaGVscGVyX210dGMwX2RlYnVnKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICB1aW50MzJfdCB2YWwgPSBhcmcxICYgKCgxIDw8IENQMERCX1NTdCkgfCAoMSA8PCBDUDBEQl9IYWx0KSk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICAvKiBYWFg6IE1pZ2h0IGJlIHdyb25nLCBjaGVjayB3aXRoIEVKVEFHIHNwZWMuICovCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICBvdGhlci0+YWN0aXZlX3RjLkNQMF9EZWJ1Z190Y3N0YXR1cyA9IHZhbDsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkNQMF9EZWJ1Z190Y3N0YXR1cyA9IHZhbDsKKyAgICBvdGhlci0+Q1AwX0RlYnVnID0gKG90aGVyLT5DUDBfRGVidWcgJgorICAgICAgICAgICAgICAgICAgICAgKCgxIDw8IENQMERCX1NTdCkgfCAoMSA8PCBDUDBEQl9IYWx0KSkpIHwKKyAgICAgICAgICAgICAgICAgICAgIChhcmcxICYgfigoMSA8PCBDUDBEQl9TU3QpIHwgKDEgPDwgQ1AwREJfSGFsdCkpKTsKK30KKwordm9pZCBoZWxwZXJfbXRjMF9wZXJmb3JtYW5jZTAoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1BlcmZvcm1hbmNlMCA9IGFyZzEgJiAweDAwMDAwN2ZmOworfQorCit2b2lkIGhlbHBlcl9tdGMwX3RhZ2xvKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPkNQMF9UYWdMbyA9IGFyZzEgJiAweEZGRkZGQ0Y2OworfQorCit2b2lkIGhlbHBlcl9tdGMwX2RhdGFsbyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEpCit7CisgICAgZW52LT5DUDBfRGF0YUxvID0gYXJnMTsgLyogWFhYICovCit9CisKK3ZvaWQgaGVscGVyX210YzBfdGFnaGkoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGVudi0+Q1AwX1RhZ0hpID0gYXJnMTsgLyogWFhYICovCit9CisKK3ZvaWQgaGVscGVyX210YzBfZGF0YWhpKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYXJnMSkKK3sKKyAgICBlbnYtPkNQMF9EYXRhSGkgPSBhcmcxOyAvKiBYWFggKi8KK30KKworLyogTUlQUyBNVCBmdW5jdGlvbnMgKi8KK3RhcmdldF91bG9uZyBoZWxwZXJfbWZ0Z3ByKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBzZWwpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLmdwcltzZWxdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLmdwcltzZWxdOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mdGxvKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBzZWwpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkxPW3NlbF07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gb3RoZXItPnRjc1tvdGhlcl90Y10uTE9bc2VsXTsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9tZnRoaShDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgc2VsKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICByZXR1cm4gb3RoZXItPmFjdGl2ZV90Yy5ISVtzZWxdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkhJW3NlbF07Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfbWZ0YWN4KENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBzZWwpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIHJldHVybiBvdGhlci0+YWN0aXZlX3RjLkFDWFtzZWxdOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkFDWFtzZWxdOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX21mdGRzcChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgcmV0dXJuIG90aGVyLT5hY3RpdmVfdGMuRFNQQ29udHJvbDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvdGhlci0+dGNzW290aGVyX3RjXS5EU1BDb250cm9sOworfQorCit2b2lkIGhlbHBlcl9tdHRncHIoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB1aW50MzJfdCBzZWwpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuZ3ByW3NlbF0gPSBhcmcxOworICAgIGVsc2UKKyAgICAgICAgb3RoZXItPnRjc1tvdGhlcl90Y10uZ3ByW3NlbF0gPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdHRsbyhDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsIHVpbnQzMl90IHNlbCkKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgb3RoZXItPmFjdGl2ZV90Yy5MT1tzZWxdID0gYXJnMTsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkxPW3NlbF0gPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdHRoaShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZzEsIHVpbnQzMl90IHNlbCkKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBDUFVNSVBTU3RhdGUgKm90aGVyID0gbWlwc19jcHVfbWFwX3RjKGVudiwgJm90aGVyX3RjKTsKKworICAgIGlmIChvdGhlcl90YyA9PSBvdGhlci0+Y3VycmVudF90YykKKyAgICAgICAgb3RoZXItPmFjdGl2ZV90Yy5ISVtzZWxdID0gYXJnMTsKKyAgICBlbHNlCisgICAgICAgIG90aGVyLT50Y3Nbb3RoZXJfdGNdLkhJW3NlbF0gPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdHRhY3goQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB1aW50MzJfdCBzZWwpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgQ1BVTUlQU1N0YXRlICpvdGhlciA9IG1pcHNfY3B1X21hcF90YyhlbnYsICZvdGhlcl90Yyk7CisKKyAgICBpZiAob3RoZXJfdGMgPT0gb3RoZXItPmN1cnJlbnRfdGMpCisgICAgICAgIG90aGVyLT5hY3RpdmVfdGMuQUNYW3NlbF0gPSBhcmcxOworICAgIGVsc2UKKyAgICAgICAgb3RoZXItPnRjc1tvdGhlcl90Y10uQUNYW3NlbF0gPSBhcmcxOworfQorCit2b2lkIGhlbHBlcl9tdHRkc3AoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxKQoreworICAgIGludCBvdGhlcl90YyA9IGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpOworICAgIENQVU1JUFNTdGF0ZSAqb3RoZXIgPSBtaXBzX2NwdV9tYXBfdGMoZW52LCAmb3RoZXJfdGMpOworCisgICAgaWYgKG90aGVyX3RjID09IG90aGVyLT5jdXJyZW50X3RjKQorICAgICAgICBvdGhlci0+YWN0aXZlX3RjLkRTUENvbnRyb2wgPSBhcmcxOworICAgIGVsc2UKKyAgICAgICAgb3RoZXItPnRjc1tvdGhlcl90Y10uRFNQQ29udHJvbCA9IGFyZzE7Cit9CisKKy8qIE1JUFMgTVQgZnVuY3Rpb25zICovCit0YXJnZXRfdWxvbmcgaGVscGVyX2RtdCh2b2lkKQoreworICAgIC8vIFRPRE8KKyAgICAgcmV0dXJuIDA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfZW10KHZvaWQpCit7CisgICAgLy8gVE9ETworICAgIHJldHVybiAwOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2R2cGUoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgLy8gVE9ETworICAgIHJldHVybiAwOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX2V2cGUoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgLy8gVE9ETworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qICFDT05GSUdfVVNFUl9PTkxZICovCisKK3ZvaWQgaGVscGVyX2ZvcmsodGFyZ2V0X3Vsb25nIGFyZzEsIHRhcmdldF91bG9uZyBhcmcyKQoreworICAgIC8vIGFyZzEgPSBydCwgYXJnMiA9IHJzCisgICAgYXJnMSA9IDA7CisgICAgLy8gVE9ETzogc3RvcmUgdG8gVEMgcmVnaXN0ZXIKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl95aWVsZChDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFyZykKK3sKKyAgICB0YXJnZXRfbG9uZyBhcmcxID0gYXJnOworCisgICAgaWYgKGFyZzEgPCAwKSB7CisgICAgICAgIC8qIE5vIHNjaGVkdWxpbmcgcG9saWN5IGltcGxlbWVudGVkLiAqLworICAgICAgICBpZiAoYXJnMSAhPSAtMikgeworICAgICAgICAgICAgaWYgKGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMSA8PCBDUDBWUEVDb19ZU0kpICYmCisgICAgICAgICAgICAgICAgZW52LT5hY3RpdmVfdGMuQ1AwX1RDU3RhdHVzICYgKDEgPDwgQ1AwVENTdF9EVCkpIHsKKyAgICAgICAgICAgICAgICBlbnYtPkNQMF9WUEVDb250cm9sICY9IH4oMHg3IDw8IENQMFZQRUNvX0VYQ1BUKTsKKyAgICAgICAgICAgICAgICBlbnYtPkNQMF9WUEVDb250cm9sIHw9IDQgPDwgQ1AwVlBFQ29fRVhDUFQ7CisgICAgICAgICAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfVEhSRUFEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnMSA9PSAwKSB7CisgICAgICAgIGlmICgwIC8qIFRPRE86IFRDIHVuZGVyZmxvdyAqLykgeworICAgICAgICAgICAgZW52LT5DUDBfVlBFQ29udHJvbCAmPSB+KDB4NyA8PCBDUDBWUEVDb19FWENQVCk7CisgICAgICAgICAgICBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUF9USFJFQUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogRGVhbGxvY2F0ZSBUQworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmcxID4gMCkgeworICAgICAgICAvKiBZaWVsZCBxdWFsaWZpZXIgaW5wdXRzIG5vdCBpbXBsZW1lbnRlZC4gKi8KKyAgICAgICAgZW52LT5DUDBfVlBFQ29udHJvbCAmPSB+KDB4NyA8PCBDUDBWUEVDb19FWENQVCk7CisgICAgICAgIGVudi0+Q1AwX1ZQRUNvbnRyb2wgfD0gMiA8PCBDUDBWUEVDb19FWENQVDsKKyAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfVEhSRUFEKTsKKyAgICB9CisgICAgcmV0dXJuIGVudi0+Q1AwX1lRTWFzazsKK30KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisvKiBUTEIgbWFuYWdlbWVudCAqLworc3RhdGljIHZvaWQgY3B1X21pcHNfdGxiX2ZsdXNoIChDUFVNSVBTU3RhdGUgKmVudiwgaW50IGZsdXNoX2dsb2JhbCkKK3sKKyAgICAvKiBGbHVzaCBxZW11J3MgVExCIGFuZCBkaXNjYXJkIGFsbCBzaGFkb3dlZCBlbnRyaWVzLiAgKi8KKyAgICB0bGJfZmx1c2goZW52LCBmbHVzaF9nbG9iYWwpOworICAgIGVudi0+dGxiLT50bGJfaW5fdXNlID0gZW52LT50bGItPm5iX3RsYjsKK30KKworc3RhdGljIHZvaWQgcjRrX21pcHNfdGxiX2ZsdXNoX2V4dHJhIChDUFVNSVBTU3RhdGUgKmVudiwgaW50IGZpcnN0KQoreworICAgIC8qIERpc2NhcmQgZW50cmllcyBmcm9tIGVudi0+dGxiW2ZpcnN0XSBvbndhcmRzLiAgKi8KKyAgICB3aGlsZSAoZW52LT50bGItPnRsYl9pbl91c2UgPiBmaXJzdCkgeworICAgICAgICByNGtfaW52YWxpZGF0ZV90bGIoZW52LCAtLWVudi0+dGxiLT50bGJfaW5fdXNlLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHI0a19maWxsX3RsYihDUFVNSVBTU3RhdGUgKmVudiwgaW50IGlkeCkKK3sKKyAgICByNGtfdGxiX3QgKnRsYjsKKworICAgIC8qIFhYWDogZGV0ZWN0IGNvbmZsaWN0aW5nIFRMQnMgYW5kIHJhaXNlIGEgTUNIRUNLIGV4Y2VwdGlvbiB3aGVuIG5lZWRlZCAqLworICAgIHRsYiA9ICZlbnYtPnRsYi0+bW11LnI0ay50bGJbaWR4XTsKKyAgICB0bGItPlZQTiA9IGVudi0+Q1AwX0VudHJ5SGkgJiAoVEFSR0VUX1BBR0VfTUFTSyA8PCAxKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgdGxiLT5WUE4gJj0gZW52LT5TRUdNYXNrOworI2VuZGlmCisgICAgdGxiLT5BU0lEID0gZW52LT5DUDBfRW50cnlIaSAmIDB4RkY7CisgICAgdGxiLT5QYWdlTWFzayA9IGVudi0+Q1AwX1BhZ2VNYXNrOworICAgIHRsYi0+RyA9IGVudi0+Q1AwX0VudHJ5TG8wICYgZW52LT5DUDBfRW50cnlMbzEgJiAxOworICAgIHRsYi0+VjAgPSAoZW52LT5DUDBfRW50cnlMbzAgJiAyKSAhPSAwOworICAgIHRsYi0+RDAgPSAoZW52LT5DUDBfRW50cnlMbzAgJiA0KSAhPSAwOworICAgIHRsYi0+QzAgPSAoZW52LT5DUDBfRW50cnlMbzAgPj4gMykgJiAweDc7CisgICAgdGxiLT5QRk5bMF0gPSAoZW52LT5DUDBfRW50cnlMbzAgPj4gNikgPDwgMTI7CisgICAgdGxiLT5WMSA9IChlbnYtPkNQMF9FbnRyeUxvMSAmIDIpICE9IDA7CisgICAgdGxiLT5EMSA9IChlbnYtPkNQMF9FbnRyeUxvMSAmIDQpICE9IDA7CisgICAgdGxiLT5DMSA9IChlbnYtPkNQMF9FbnRyeUxvMSA+PiAzKSAmIDB4NzsKKyAgICB0bGItPlBGTlsxXSA9IChlbnYtPkNQMF9FbnRyeUxvMSA+PiA2KSA8PCAxMjsKK30KKwordm9pZCByNGtfaGVscGVyX3RsYndpKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHI0a190bGJfdCAqdGxiOworICAgIGludCBpZHg7CisgICAgdGFyZ2V0X3Vsb25nIFZQTjsKKyAgICB1aW50OF90IEFTSUQ7CisgICAgYm9vbCBHLCBWMCwgRDAsIFYxLCBEMTsKKworICAgIGlkeCA9IChlbnYtPkNQMF9JbmRleCAmIH4weDgwMDAwMDAwKSAlIGVudi0+dGxiLT5uYl90bGI7CisgICAgdGxiID0gJmVudi0+dGxiLT5tbXUucjRrLnRsYltpZHhdOworICAgIFZQTiA9IGVudi0+Q1AwX0VudHJ5SGkgJiAoVEFSR0VUX1BBR0VfTUFTSyA8PCAxKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgVlBOICY9IGVudi0+U0VHTWFzazsKKyNlbmRpZgorICAgIEFTSUQgPSBlbnYtPkNQMF9FbnRyeUhpICYgMHhmZjsKKyAgICBHID0gZW52LT5DUDBfRW50cnlMbzAgJiBlbnYtPkNQMF9FbnRyeUxvMSAmIDE7CisgICAgVjAgPSAoZW52LT5DUDBfRW50cnlMbzAgJiAyKSAhPSAwOworICAgIEQwID0gKGVudi0+Q1AwX0VudHJ5TG8wICYgNCkgIT0gMDsKKyAgICBWMSA9IChlbnYtPkNQMF9FbnRyeUxvMSAmIDIpICE9IDA7CisgICAgRDEgPSAoZW52LT5DUDBfRW50cnlMbzEgJiA0KSAhPSAwOworCisgICAgLyogRGlzY2FyZCBjYWNoZWQgVExCIGVudHJpZXMsIHVubGVzcyB0bGJ3aSBpcyBqdXN0IHVwZ3JhZGluZyBhY2Nlc3MKKyAgICAgICBwZXJtaXNzaW9ucyBvbiB0aGUgY3VycmVudCBlbnRyeS4gKi8KKyAgICBpZiAodGxiLT5WUE4gIT0gVlBOIHx8IHRsYi0+QVNJRCAhPSBBU0lEIHx8IHRsYi0+RyAhPSBHIHx8CisgICAgICAgICh0bGItPlYwICYmICFWMCkgfHwgKHRsYi0+RDAgJiYgIUQwKSB8fAorICAgICAgICAodGxiLT5WMSAmJiAhVjEpIHx8ICh0bGItPkQxICYmICFEMSkpIHsKKyAgICAgICAgcjRrX21pcHNfdGxiX2ZsdXNoX2V4dHJhKGVudiwgZW52LT50bGItPm5iX3RsYik7CisgICAgfQorCisgICAgcjRrX2ludmFsaWRhdGVfdGxiKGVudiwgaWR4LCAwKTsKKyAgICByNGtfZmlsbF90bGIoZW52LCBpZHgpOworfQorCit2b2lkIHI0a19oZWxwZXJfdGxid3IoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaW50IHIgPSBjcHVfbWlwc19nZXRfcmFuZG9tKGVudik7CisKKyAgICByNGtfaW52YWxpZGF0ZV90bGIoZW52LCByLCAxKTsKKyAgICByNGtfZmlsbF90bGIoZW52LCByKTsKK30KKwordm9pZCByNGtfaGVscGVyX3RsYnAoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgcjRrX3RsYl90ICp0bGI7CisgICAgdGFyZ2V0X3Vsb25nIG1hc2s7CisgICAgdGFyZ2V0X3Vsb25nIHRhZzsKKyAgICB0YXJnZXRfdWxvbmcgVlBOOworICAgIHVpbnQ4X3QgQVNJRDsKKyAgICBpbnQgaTsKKworICAgIEFTSUQgPSBlbnYtPkNQMF9FbnRyeUhpICYgMHhGRjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW52LT50bGItPm5iX3RsYjsgaSsrKSB7CisgICAgICAgIHRsYiA9ICZlbnYtPnRsYi0+bW11LnI0ay50bGJbaV07CisgICAgICAgIC8qIDFrIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworICAgICAgICBtYXNrID0gdGxiLT5QYWdlTWFzayB8IH4oVEFSR0VUX1BBR0VfTUFTSyA8PCAxKTsKKyAgICAgICAgdGFnID0gZW52LT5DUDBfRW50cnlIaSAmIH5tYXNrOworICAgICAgICBWUE4gPSB0bGItPlZQTiAmIH5tYXNrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgdGFnICY9IGVudi0+U0VHTWFzazsKKyNlbmRpZgorICAgICAgICAvKiBDaGVjayBBU0lELCB2aXJ0dWFsIHBhZ2UgbnVtYmVyICYgc2l6ZSAqLworICAgICAgICBpZiAoKHRsYi0+RyA9PSAxIHx8IHRsYi0+QVNJRCA9PSBBU0lEKSAmJiBWUE4gPT0gdGFnKSB7CisgICAgICAgICAgICAvKiBUTEIgbWF0Y2ggKi8KKyAgICAgICAgICAgIGVudi0+Q1AwX0luZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IGVudi0+dGxiLT5uYl90bGIpIHsKKyAgICAgICAgLyogTm8gbWF0Y2guICBEaXNjYXJkIGFueSBzaGFkb3cgZW50cmllcywgaWYgYW55IG9mIHRoZW0gbWF0Y2guICAqLworICAgICAgICBmb3IgKGkgPSBlbnYtPnRsYi0+bmJfdGxiOyBpIDwgZW52LT50bGItPnRsYl9pbl91c2U7IGkrKykgeworICAgICAgICAgICAgdGxiID0gJmVudi0+dGxiLT5tbXUucjRrLnRsYltpXTsKKyAgICAgICAgICAgIC8qIDFrIHBhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworICAgICAgICAgICAgbWFzayA9IHRsYi0+UGFnZU1hc2sgfCB+KFRBUkdFVF9QQUdFX01BU0sgPDwgMSk7CisgICAgICAgICAgICB0YWcgPSBlbnYtPkNQMF9FbnRyeUhpICYgfm1hc2s7CisgICAgICAgICAgICBWUE4gPSB0bGItPlZQTiAmIH5tYXNrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgIHRhZyAmPSBlbnYtPlNFR01hc2s7CisjZW5kaWYKKyAgICAgICAgICAgIC8qIENoZWNrIEFTSUQsIHZpcnR1YWwgcGFnZSBudW1iZXIgJiBzaXplICovCisgICAgICAgICAgICBpZiAoKHRsYi0+RyA9PSAxIHx8IHRsYi0+QVNJRCA9PSBBU0lEKSAmJiBWUE4gPT0gdGFnKSB7CisgICAgICAgICAgICAgICAgcjRrX21pcHNfdGxiX2ZsdXNoX2V4dHJhIChlbnYsIGkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZW52LT5DUDBfSW5kZXggfD0gMHg4MDAwMDAwMDsKKyAgICB9Cit9CisKK3ZvaWQgcjRrX2hlbHBlcl90bGJyKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIHI0a190bGJfdCAqdGxiOworICAgIHVpbnQ4X3QgQVNJRDsKKyAgICBpbnQgaWR4OworCisgICAgQVNJRCA9IGVudi0+Q1AwX0VudHJ5SGkgJiAweEZGOworICAgIGlkeCA9IChlbnYtPkNQMF9JbmRleCAmIH4weDgwMDAwMDAwKSAlIGVudi0+dGxiLT5uYl90bGI7CisgICAgdGxiID0gJmVudi0+dGxiLT5tbXUucjRrLnRsYltpZHhdOworCisgICAgLyogSWYgdGhpcyB3aWxsIGNoYW5nZSB0aGUgY3VycmVudCBBU0lELCBmbHVzaCBxZW11J3MgVExCLiAgKi8KKyAgICBpZiAoQVNJRCAhPSB0bGItPkFTSUQpCisgICAgICAgIGNwdV9taXBzX3RsYl9mbHVzaCAoZW52LCAxKTsKKworICAgIHI0a19taXBzX3RsYl9mbHVzaF9leHRyYShlbnYsIGVudi0+dGxiLT5uYl90bGIpOworCisgICAgZW52LT5DUDBfRW50cnlIaSA9IHRsYi0+VlBOIHwgdGxiLT5BU0lEOworICAgIGVudi0+Q1AwX1BhZ2VNYXNrID0gdGxiLT5QYWdlTWFzazsKKyAgICBlbnYtPkNQMF9FbnRyeUxvMCA9IHRsYi0+RyB8ICh0bGItPlYwIDw8IDEpIHwgKHRsYi0+RDAgPDwgMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgKHRsYi0+QzAgPDwgMykgfCAodGxiLT5QRk5bMF0gPj4gNik7CisgICAgZW52LT5DUDBfRW50cnlMbzEgPSB0bGItPkcgfCAodGxiLT5WMSA8PCAxKSB8ICh0bGItPkQxIDw8IDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0bGItPkMxIDw8IDMpIHwgKHRsYi0+UEZOWzFdID4+IDYpOworfQorCit2b2lkIGhlbHBlcl90bGJ3aShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYndpKGVudik7Cit9CisKK3ZvaWQgaGVscGVyX3RsYndyKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGVudi0+dGxiLT5oZWxwZXJfdGxid3IoZW52KTsKK30KKwordm9pZCBoZWxwZXJfdGxicChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYnAoZW52KTsKK30KKwordm9pZCBoZWxwZXJfdGxicihDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYnIoZW52KTsKK30KKworLyogU3BlY2lhbHMgKi8KK3RhcmdldF91bG9uZyBoZWxwZXJfZGkoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgdGFyZ2V0X3Vsb25nIHQwID0gZW52LT5DUDBfU3RhdHVzOworCisgICAgZW52LT5DUDBfU3RhdHVzID0gdDAgJiB+KDEgPDwgQ1AwU3RfSUUpOworICAgIGNwdV9taXBzX3VwZGF0ZV9pcnEoZW52KTsKKworICAgIHJldHVybiB0MDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9laShDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICB0YXJnZXRfdWxvbmcgdDAgPSBlbnYtPkNQMF9TdGF0dXM7CisKKyAgICBlbnYtPkNQMF9TdGF0dXMgPSB0MCB8ICgxIDw8IENQMFN0X0lFKTsKKyAgICBjcHVfbWlwc191cGRhdGVfaXJxKGVudik7CisKKyAgICByZXR1cm4gdDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX3ByZV9lcmV0KENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19FWEVDKSkgeworICAgICAgICBxZW11X2xvZygiRVJFVDogUEMgIiBUQVJHRVRfRk1UX2x4ICIgRVBDICIgVEFSR0VUX0ZNVF9seCwKKyAgICAgICAgICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQywgZW52LT5DUDBfRVBDKTsKKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpCisgICAgICAgICAgICBxZW11X2xvZygiIEVycm9yRVBDICIgVEFSR0VUX0ZNVF9seCwgZW52LT5DUDBfRXJyb3JFUEMpOworICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0RNKQorICAgICAgICAgICAgcWVtdV9sb2coIiBERVBDICIgVEFSR0VUX0ZNVF9seCwgZW52LT5DUDBfREVQQyk7CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVidWdfcG9zdF9lcmV0KENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19FWEVDKSkgeworICAgICAgICBxZW11X2xvZygiICA9PiAgUEMgIiBUQVJHRVRfRk1UX2x4ICIgRVBDICIgVEFSR0VUX0ZNVF9seCwKKyAgICAgICAgICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQywgZW52LT5DUDBfRVBDKTsKKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpCisgICAgICAgICAgICBxZW11X2xvZygiIEVycm9yRVBDICIgVEFSR0VUX0ZNVF9seCwgZW52LT5DUDBfRXJyb3JFUEMpOworICAgICAgICBpZiAoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0RNKQorICAgICAgICAgICAgcWVtdV9sb2coIiBERVBDICIgVEFSR0VUX0ZNVF9seCwgZW52LT5DUDBfREVQQyk7CisgICAgICAgIHN3aXRjaCAoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0tTVSkgeworICAgICAgICBjYXNlIE1JUFNfSEZMQUdfVU06IHFlbXVfbG9nKCIsIFVNXG4iKTsgYnJlYWs7CisgICAgICAgIGNhc2UgTUlQU19IRkxBR19TTTogcWVtdV9sb2coIiwgU01cbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSBNSVBTX0hGTEFHX0tNOiBxZW11X2xvZygiXG4iKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGNwdV9hYm9ydChlbnYsICJJbnZhbGlkIE1NVSBtb2RlIVxuIik7IGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGhlbHBlcl9lcmV0IChDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBkZWJ1Z19wcmVfZXJldChlbnYpOworICAgIGlmIChlbnYtPkNQMF9TdGF0dXMgJiAoMSA8PCBDUDBTdF9FUkwpKSB7CisgICAgICAgIGVudi0+YWN0aXZlX3RjLlBDID0gZW52LT5DUDBfRXJyb3JFUEM7CisgICAgICAgIGVudi0+Q1AwX1N0YXR1cyAmPSB+KDEgPDwgQ1AwU3RfRVJMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQyA9IGVudi0+Q1AwX0VQQzsKKyAgICAgICAgZW52LT5DUDBfU3RhdHVzICY9IH4oMSA8PCBDUDBTdF9FWEwpOworICAgIH0KKyAgICBjb21wdXRlX2hmbGFncyhlbnYpOworICAgIGRlYnVnX3Bvc3RfZXJldChlbnYpOworICAgIGVudi0+bGxhZGRyID0gMTsKK30KKwordm9pZCBoZWxwZXJfZGVyZXQgKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGRlYnVnX3ByZV9lcmV0KGVudik7CisgICAgZW52LT5hY3RpdmVfdGMuUEMgPSBlbnYtPkNQMF9ERVBDOworICAgIGVudi0+aGZsYWdzICY9IE1JUFNfSEZMQUdfRE07CisgICAgY29tcHV0ZV9oZmxhZ3MoZW52KTsKKyAgICBkZWJ1Z19wb3N0X2VyZXQoZW52KTsKKyAgICBlbnYtPmxsYWRkciA9IDE7Cit9CisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9yZGh3cl9jcHVudW0oQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaWYgKChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfQ1AwKSB8fAorICAgICAgICAoZW52LT5DUDBfSFdSRW5hICYgKDEgPDwgMCkpKQorICAgICAgICByZXR1cm4gZW52LT5DUDBfRUJhc2UgJiAweDNmZjsKKyAgICBlbHNlCisgICAgICAgIGhlbHBlcl9yYWlzZV9leGNlcHRpb24oZW52LCBFWENQX1JJKTsKKworICAgIHJldHVybiAwOworfQorCit0YXJnZXRfdWxvbmcgaGVscGVyX3JkaHdyX3N5bmNpX3N0ZXAoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaWYgKChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfQ1AwKSB8fAorICAgICAgICAoZW52LT5DUDBfSFdSRW5hICYgKDEgPDwgMSkpKQorICAgICAgICByZXR1cm4gZW52LT5TWU5DSV9TdGVwOworICAgIGVsc2UKKyAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfUkkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3RhcmdldF91bG9uZyBoZWxwZXJfcmRod3JfY2MoQ1BVTUlQU1N0YXRlICplbnYpCit7CisgICAgaWYgKChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfQ1AwKSB8fAorICAgICAgICAoZW52LT5DUDBfSFdSRW5hICYgKDEgPDwgMikpKQorICAgICAgICByZXR1cm4gZW52LT5DUDBfQ291bnQ7CisgICAgZWxzZQorICAgICAgICBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUF9SSSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordGFyZ2V0X3Vsb25nIGhlbHBlcl9yZGh3cl9jY3JlcyhDUFVNSVBTU3RhdGUgKmVudikKK3sKKyAgICBpZiAoKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19DUDApIHx8CisgICAgICAgIChlbnYtPkNQMF9IV1JFbmEgJiAoMSA8PCAzKSkpCisgICAgICAgIHJldHVybiBlbnYtPkNDUmVzOworICAgIGVsc2UKKyAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfUkkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGVscGVyX3Btb24oQ1BVTUlQU1N0YXRlICplbnYsIGludCBmdW5jdGlvbikKK3sKKyAgICBmdW5jdGlvbiAvPSAyOworICAgIHN3aXRjaCAoZnVuY3Rpb24pIHsKKyAgICBjYXNlIDI6IC8qIFRPRE86IGNoYXIgaW5ieXRlKGludCB3YWl0ZmxhZyk7ICovCisgICAgICAgIGlmIChlbnYtPmFjdGl2ZV90Yy5ncHJbNF0gPT0gMCkKKyAgICAgICAgICAgIGVudi0+YWN0aXZlX3RjLmdwclsyXSA9IC0xOworICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIDExOiAvKiBUT0RPOiBjaGFyIGluYnl0ZSAodm9pZCk7ICovCisgICAgICAgIGVudi0+YWN0aXZlX3RjLmdwclsyXSA9IC0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgY2FzZSAxMjoKKyAgICAgICAgcHJpbnRmKCIlYyIsIChjaGFyKShlbnYtPmFjdGl2ZV90Yy5ncHJbNF0gJiAweEZGKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTU4OgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmbXQgPSAodm9pZCAqKSh1aW50cHRyX3QpZW52LT5hY3RpdmVfdGMuZ3ByWzRdOworICAgICAgICAgICAgcHJpbnRmKCIlcyIsIGZtdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGhlbHBlcl93YWl0KENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIEVOVl9HRVRfQ1BVKGVudiktPmhhbHRlZCA9IDE7CisgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfSExUKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisKK3N0YXRpYyB2b2lkIGRvX3VuYWxpZ25lZF9hY2Nlc3MgKENQVU1JUFNTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBpc193cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc191c2VyLCB1aW50cHRyX3QgcmV0YWRkcik7CisKKyNkZWZpbmUgTU1VU1VGRklYIF9tbXUKKyNkZWZpbmUgQUxJR05FRF9PTkxZCisKKyNkZWZpbmUgU0hJRlQgMAorI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgorCisjZGVmaW5lIFNISUZUIDEKKyNpbmNsdWRlICJleGVjL3NvZnRtbXVfdGVtcGxhdGUuaCIKKworI2RlZmluZSBTSElGVCAyCisjaW5jbHVkZSAiZXhlYy9zb2Z0bW11X3RlbXBsYXRlLmgiCisKKyNkZWZpbmUgU0hJRlQgMworI2luY2x1ZGUgImV4ZWMvc29mdG1tdV90ZW1wbGF0ZS5oIgorCitzdGF0aWMgdm9pZCBkb191bmFsaWduZWRfYWNjZXNzKENQVU1JUFNTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3dyaXRlLCBpbnQgaXNfdXNlciwgdWludHB0cl90IHJldGFkZHIpCit7CisgICAgZW52LT5DUDBfQmFkVkFkZHIgPSBhZGRyOworICAgIGRvX3Jlc3RvcmVfc3RhdGUgKGVudiwgcmV0YWRkcik7CisgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIChpc193cml0ZSA9PSAxKSA/IEVYQ1BfQWRFUyA6IEVYQ1BfQWRFTCk7Cit9CisKK3ZvaWQgdGxiX2ZpbGwgKENQVU1JUFNTdGF0ZSogZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgaW50IGlzX3dyaXRlLCBpbnQgbW11X2lkeCwKKyAgICAgICAgICAgICAgIHVpbnRwdHJfdCByZXRhZGRyKQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBjcHVfbWlwc19oYW5kbGVfbW11X2ZhdWx0KGVudiwgYWRkciwgaXNfd3JpdGUsIG1tdV9pZHgpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgaWYgKHJldGFkZHIpIHsKKyAgICAgICAgICAgIC8qIG5vdyB3ZSBoYXZlIGEgcmVhbCBjcHUgZmF1bHQgKi8KKyAgICAgICAgICAgIHRiID0gdGJfZmluZF9wYyhyZXRhZGRyKTsKKyAgICAgICAgICAgIGlmICh0YikgeworICAgICAgICAgICAgICAgIC8qIHRoZSBQQyBpcyBpbnNpZGUgdGhlIHRyYW5zbGF0ZWQgY29kZS4gSXQgbWVhbnMgdGhhdCB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgYSB2aXJ0dWFsIENQVSBmYXVsdCAqLworICAgICAgICAgICAgICAgIGNwdV9yZXN0b3JlX3N0YXRlKGVudiwgcmV0YWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbl9lcnIoZW52LCBlbnYtPmV4Y2VwdGlvbl9pbmRleCwgZW52LT5lcnJvcl9jb2RlKTsKKyAgICB9Cit9CisKK3ZvaWQgY3B1X3VuYXNzaWduZWRfYWNjZXNzKENQVU1JUFNTdGF0ZSogZW52LCBod2FkZHIgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc193cml0ZSwgaW50IGlzX2V4ZWMsIGludCB1bnVzZWQsIGludCBzaXplKQoreworICAgIGlmIChpc19leGVjKQorICAgICAgICBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUF9JQkUpOworICAgIGVsc2UKKyAgICAgICAgaGVscGVyX3JhaXNlX2V4Y2VwdGlvbihlbnYsIEVYQ1BfREJFKTsKK30KKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgYWRkcmVzcyB0cmFuc2xhdGlvbiBoZWxwZXIgZnVuY3Rpb25zCisgKiBmb3IgZmFzdCBtZW1vcnkgYWNjZXNzIGluIFFFTVUuCisgKi8KK3N0YXRpYyB1aW50cHRyX3QgdjJwX21tdShDUFVNSVBTU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBpc191c2VyKQoreworICAgIGludCBpbmRleDsKKyAgICB0YXJnZXRfdWxvbmcgdGxiX2FkZHI7CisgICAgdWludHB0cl90IHBoeXNhZGRyOworICAgIHVpbnRwdHJfdCByZXRhZGRyOworCisgICAgaW5kZXggPSAoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKSAmIChDUFVfVExCX1NJWkUgLSAxKTsKK3JlZG86CisgICAgdGxiX2FkZHIgPSBlbnYtPnRsYl90YWJsZVtpc191c2VyXVtpbmRleF0uYWRkcl9yZWFkOworICAgIGlmICgoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spID09ICh0bGJfYWRkciAmIChUQVJHRVRfUEFHRV9NQVNLIHwgVExCX0lOVkFMSURfTUFTSykpKSB7CisgICAgICAgIHBoeXNhZGRyID0gYWRkciArIGVudi0+dGxiX3RhYmxlW2lzX3VzZXJdW2luZGV4XS5hZGRlbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogdGhlIHBhZ2UgaXMgbm90IGluIHRoZSBUTEIgOiBmaWxsIGl0ICovCisgICAgICAgIHJldGFkZHIgPSBHRVRQQygpOworICAgICAgICB0bGJfZmlsbChlbnYsIGFkZHIsIDAsIGlzX3VzZXIsIHJldGFkZHIpOworICAgICAgICBnb3RvIHJlZG87CisgICAgfQorICAgIHJldHVybiBwaHlzYWRkcjsKK30KKworLyoKKyAqIHRyYW5zbGF0aW9uIGZyb20gdmlydHVhbCBhZGRyZXNzIG9mIHNpbXVsYXRlZCBPUworICogdG8gdGhlIGFkZHJlc3Mgb2Ygc2ltdWxhdGlvbiBob3N0IChub3QgdGhlIHBoeXNpY2FsCisgKiBhZGRyZXNzIG9mIHNpbXVsYXRlZCBPUy4KKyAqLwordWludHB0cl90IHYycCh0YXJnZXRfdWxvbmcgcHRyLCBpbnQgaXNfdXNlcikKK3sKKyAgICBDUFVNSVBTU3RhdGUgKmVudjsKKyAgICBpbnQgaW5kZXg7CisgICAgdGFyZ2V0X3Vsb25nIGFkZHI7CisgICAgdWludHB0cl90IHBoeXNhZGRyOworCisgICAgZW52ID0gY3B1X3NpbmdsZV9lbnY7CisgICAgYWRkciA9IHB0cjsKKyAgICBpbmRleCA9IChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpICYgKENQVV9UTEJfU0laRSAtIDEpOworICAgIGlmIChfX2J1aWx0aW5fZXhwZWN0KGVudi0+dGxiX3RhYmxlW2lzX3VzZXJdW2luZGV4XS5hZGRyX3JlYWQgIT0KKyAgICAgICAgICAgICAgICAoYWRkciAmIFRBUkdFVF9QQUdFX01BU0spLCAwKSkgeworICAgICAgICBwaHlzYWRkciA9IHYycF9tbXUoZW52LCBhZGRyLCBpc191c2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwaHlzYWRkciA9IGFkZHIgKyBlbnYtPnRsYl90YWJsZVtpc191c2VyXVtpbmRleF0uYWRkZW5kOworICAgIH0KKyAgICByZXR1cm4gcGh5c2FkZHI7Cit9CisKKy8qIGNvcHkgYSBzdHJpbmcgZnJvbSB0aGUgc2ltdWxhdGVkIHZpcnR1YWwgc3BhY2UgdG8gYSBidWZmZXIgaW4gUUVNVSAqLwordm9pZCB2c3RyY3B5KHRhcmdldF91bG9uZyBwdHIsIGNoYXIgKmJ1ZiwgaW50IG1heCkKK3sKKyAgICBjaGFyICpwaHlzID0gMDsKKyAgICB0YXJnZXRfdWxvbmcgcGFnZSA9IDA7CisKKyAgICBpZiAoYnVmID09IE5VTEwpIHJldHVybjsKKworICAgIHdoaWxlIChtYXgpIHsKKyAgICAgICAgaWYgKChwdHIgJiBUQVJHRVRfUEFHRV9NQVNLKSAhPSBwYWdlKSB7CisgICAgICAgICAgICBwaHlzID0gKGNoYXIgKil2MnAocHRyLCAwKTsKKyAgICAgICAgICAgIHBhZ2UgPSBwdHIgJiBUQVJHRVRfUEFHRV9NQVNLOworICAgICAgICB9CisgICAgICAgICpidWYgPSAqcGh5czsKKyAgICAgICAgaWYgKCpwaHlzID09ICdcMCcpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHB0ciArKzsKKyAgICAgICAgYnVmICsrOworICAgICAgICBwaHlzICsrOworICAgICAgICBtYXggLS07CisgICAgfQorfQorCisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KKworLyogQ29tcGxleCBGUFUgb3BlcmF0aW9ucyB3aGljaCBtYXkgbmVlZCBzdGFjayBzcGFjZS4gKi8KKworI2RlZmluZSBGTE9BVF9PTkUzMiBtYWtlX2Zsb2F0MzIoMHgzZjggPDwgMjApCisjZGVmaW5lIEZMT0FUX09ORTY0IG1ha2VfZmxvYXQ2NCgweDNmZlVMTCA8PCA1MikKKyNkZWZpbmUgRkxPQVRfVFdPMzIgbWFrZV9mbG9hdDMyKDEgPDwgMzApCisjZGVmaW5lIEZMT0FUX1RXTzY0IG1ha2VfZmxvYXQ2NCgxVUxMIDw8IDYyKQorI2RlZmluZSBGTE9BVF9RTkFOMzIgMHg3ZmJmZmZmZgorI2RlZmluZSBGTE9BVF9RTkFONjQgMHg3ZmY3ZmZmZmZmZmZmZmZmVUxMCisjZGVmaW5lIEZMT0FUX1NOQU4zMiAweDdmZmZmZmZmCisjZGVmaW5lIEZMT0FUX1NOQU42NCAweDdmZmZmZmZmZmZmZmZmZmZVTEwKKworLyogY29udmVydCBNSVBTIHJvdW5kaW5nIG1vZGUgaW4gRkNSMzEgdG8gSUVFRSBsaWJyYXJ5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGllZWVfcm1bXSA9IHsKKyAgICBmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4sCisgICAgZmxvYXRfcm91bmRfdG9femVybywKKyAgICBmbG9hdF9yb3VuZF91cCwKKyAgICBmbG9hdF9yb3VuZF9kb3duCit9OworCisjZGVmaW5lIFJFU1RPUkVfUk9VTkRJTkdfTU9ERSBcCisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoaWVlZV9ybVtlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgJiAzXSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpCisKKyNkZWZpbmUgUkVTVE9SRV9GTFVTSF9NT0RFIFwKKyAgICBzZXRfZmx1c2hfdG9femVybygoZW52LT5hY3RpdmVfZnB1LmZjcjMxICYgKDEgPDwgMjQpKSAhPSAwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisKK3RhcmdldF91bG9uZyBoZWxwZXJfY2ZjMSAoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IHJlZykKK3sKKyAgICB0YXJnZXRfdWxvbmcgYXJnMTsKKworICAgIHN3aXRjaCAocmVnKSB7CisgICAgY2FzZSAwOgorICAgICAgICBhcmcxID0gKGludDMyX3QpZW52LT5hY3RpdmVfZnB1LmZjcjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICAgIGFyZzEgPSAoKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSA+PiAyNCkgJiAweGZlKSB8ICgoZW52LT5hY3RpdmVfZnB1LmZjcjMxID4+IDIzKSAmIDB4MSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjY6CisgICAgICAgIGFyZzEgPSBlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgJiAweDAwMDNmMDdjOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI4OgorICAgICAgICBhcmcxID0gKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSAmIDB4MDAwMDBmODMpIHwgKChlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgPj4gMjIpICYgMHg0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXJnMSA9IChpbnQzMl90KWVudi0+YWN0aXZlX2ZwdS5mY3IzMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGFyZzE7Cit9CisKK3ZvaWQgaGVscGVyX2N0YzEoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhcmcxLCB1aW50MzJfdCByZWcpCit7CisgICAgc3dpdGNoKHJlZykgeworICAgIGNhc2UgMjU6CisgICAgICAgIGlmIChhcmcxICYgMHhmZmZmZmYwMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZW52LT5hY3RpdmVfZnB1LmZjcjMxID0gKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSAmIDB4MDE3ZmZmZmYpIHwgKChhcmcxICYgMHhmZSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICgoYXJnMSAmIDB4MSkgPDwgMjMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICBpZiAoYXJnMSAmIDB4MDA3YzAwMDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGVudi0+YWN0aXZlX2ZwdS5mY3IzMSA9IChlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgJiAweGZmZmMwZjgzKSB8IChhcmcxICYgMHgwMDAzZjA3Yyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjg6CisgICAgICAgIGlmIChhcmcxICYgMHgwMDdjMDAwMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZW52LT5hY3RpdmVfZnB1LmZjcjMxID0gKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSAmIDB4ZmVmZmYwN2MpIHwgKGFyZzEgJiAweDAwMDAwZjgzKSB8CisgICAgICAgICAgICAgICAgICAgICAoKGFyZzEgJiAweDQpIDw8IDIyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgICAgaWYgKGFyZzEgJiAweDAwN2MwMDAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBlbnYtPmFjdGl2ZV9mcHUuZmNyMzEgPSBhcmcxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIHNldCByb3VuZGluZyBtb2RlICovCisgICAgUkVTVE9SRV9ST1VORElOR19NT0RFOworICAgIC8qIHNldCBmbHVzaC10by16ZXJvIG1vZGUgKi8KKyAgICBSRVNUT1JFX0ZMVVNIX01PREU7CisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgaWYgKChHRVRfRlBfRU5BQkxFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgfCAweDIwKSAmIEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpKQorICAgICAgICBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUF9GUEUpOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgaWVlZV9leF90b19taXBzKGNoYXIgeGNwdCkKK3sKKyAgICByZXR1cm4gKHhjcHQgJiBmbG9hdF9mbGFnX2luZXhhY3QpID4+IDUgfAorICAgICAgICAgICAoeGNwdCAmIGZsb2F0X2ZsYWdfdW5kZXJmbG93KSA+PiAzIHwKKyAgICAgICAgICAgKHhjcHQgJiBmbG9hdF9mbGFnX292ZXJmbG93KSA+PiAxIHwKKyAgICAgICAgICAgKHhjcHQgJiBmbG9hdF9mbGFnX2RpdmJ5emVybykgPDwgMSB8CisgICAgICAgICAgICh4Y3B0ICYgZmxvYXRfZmxhZ19pbnZhbGlkKSA8PCA0OworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgbWlwc19leF90b19pZWVlKGNoYXIgeGNwdCkKK3sKKyAgICByZXR1cm4gKHhjcHQgJiBGUF9JTkVYQUNUKSA8PCA1IHwKKyAgICAgICAgICAgKHhjcHQgJiBGUF9VTkRFUkZMT1cpIDw8IDMgfAorICAgICAgICAgICAoeGNwdCAmIEZQX09WRVJGTE9XKSA8PCAxIHwKKyAgICAgICAgICAgKHhjcHQgJiBGUF9ESVYwKSA+PiAxIHwKKyAgICAgICAgICAgKHhjcHQgJiBGUF9JTlZBTElEKSA+PiA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2ZjcjMxKENQVU1JUFNTdGF0ZSAqZW52KQoreworICAgIGludCB0bXAgPSBpZWVlX2V4X3RvX21pcHMoZ2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpOworCisgICAgU0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSwgdG1wKTsKKyAgICBpZiAoR0VUX0ZQX0VOQUJMRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgdG1wKQorICAgICAgICBoZWxwZXJfcmFpc2VfZXhjZXB0aW9uKGVudiwgRVhDUF9GUEUpOworICAgIGVsc2UKKyAgICAgICAgVVBEQVRFX0ZQX0ZMQUdTKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSwgdG1wKTsKK30KKworLyogRmxvYXQgc3VwcG9ydC4KKyAgIFNpbmdsZSBwcmVjaXRpb24gcm91dGluZXMgaGF2ZSBhICJzIiBzdWZmaXgsIGRvdWJsZSBwcmVjaXNpb24gYQorICAgImQiIHN1ZmZpeCwgMzJiaXQgaW50ZWdlciAidyIsIDY0Yml0IGludGVnZXIgImwiLCBwYWlyZWQgc2luZ2xlICJwcyIsCisgICBwYWlyZWQgc2luZ2xlIGxvd2VyICJwbCIsIHBhaXJlZCBzaW5nbGUgdXBwZXIgInB1Ii4gICovCisKKy8qIHVuYXJ5IG9wZXJhdGlvbnMsIG1vZGlmeWluZyBmcCBzdGF0dXMgICovCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfc3FydF9kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHJldHVybiBmbG9hdDY0X3NxcnQoZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfc3FydF9zKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwKQoreworICAgIHJldHVybiBmbG9hdDMyX3NxcnQoZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfY3Z0ZF9zKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwKQoreworICAgIHVpbnQ2NF90IGZkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gZmxvYXQzMl90b19mbG9hdDY0KGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gZmR0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X2N2dGRfdyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgd3QwKQoreworICAgIHVpbnQ2NF90IGZkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gaW50MzJfdG9fZmxvYXQ2NCh3dDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gZmR0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X2N2dGRfbChDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZHQwKQoreworICAgIHVpbnQ2NF90IGZkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gaW50NjRfdG9fZmxvYXQ2NChkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gZmR0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X2N2dGxfZChDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZmR0MCkKK3sKKyAgICB1aW50NjRfdCBkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBkdDIgPSBmbG9hdDY0X3RvX2ludDY0KGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgZHQyID0gRkxPQVRfU05BTjY0OworICAgIHJldHVybiBkdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9jdnRsX3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDY0X3QgZHQyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZHQyID0gZmxvYXQzMl90b19pbnQ2NChmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIGR0MiA9IEZMT0FUX1NOQU42NDsKKyAgICByZXR1cm4gZHQyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfY3Z0cHNfcHcoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGR0MCkKK3sKKyAgICB1aW50MzJfdCBmc3QyOworICAgIHVpbnQzMl90IGZzdGgyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGludDMyX3RvX2Zsb2F0MzIoZHQwICYgMFhGRkZGRkZGRiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdGgyID0gaW50MzJfdG9fZmxvYXQzMihkdDAgPj4gMzIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gKCh1aW50NjRfdClmc3RoMiA8PCAzMikgfCBmc3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfY3Z0cHdfcHMoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDMyX3Qgd3QyOworICAgIHVpbnQzMl90IHd0aDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB3dDIgPSBmbG9hdDMyX3RvX2ludDMyKGZkdDAgJiAwWEZGRkZGRkZGLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgd3RoMiA9IGZsb2F0MzJfdG9faW50MzIoZmR0MCA+PiAzMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKSB7CisgICAgICAgIHd0MiA9IEZMT0FUX1NOQU4zMjsKKyAgICAgICAgd3RoMiA9IEZMT0FUX1NOQU4zMjsKKyAgICB9CisgICAgcmV0dXJuICgodWludDY0X3Qpd3RoMiA8PCAzMikgfCB3dDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF9jdnRzX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDY0X3RvX2Zsb2F0MzIoZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmc3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfY3Z0c193KENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCB3dDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBpbnQzMl90b19mbG9hdDMyKHd0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmc3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfY3Z0c19sKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBkdDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBpbnQ2NF90b19mbG9hdDMyKGR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmc3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfY3Z0c19wbChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgd3QwKQoreworICAgIHVpbnQzMl90IHd0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHd0MiA9IHd0MDsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gd3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfY3Z0c19wdShDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgd3RoMCkKK3sKKyAgICB1aW50MzJfdCB3dDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB3dDIgPSB3dGgwOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiB3dDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF9jdnR3X3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDMyX3Qgd3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgd3QyID0gZmxvYXQzMl90b19pbnQzMihmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIHd0MiA9IEZMT0FUX1NOQU4zMjsKKyAgICByZXR1cm4gd3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfY3Z0d19kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQzMl90IHd0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHd0MiA9IGZsb2F0NjRfdG9faW50MzIoZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICB3dDIgPSBGTE9BVF9TTkFOMzI7CisgICAgcmV0dXJuIHd0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X3JvdW5kbF9kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQ2NF90IGR0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGR0MiA9IGZsb2F0NjRfdG9faW50NjQoZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIFJFU1RPUkVfUk9VTkRJTkdfTU9ERTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgZHQyID0gRkxPQVRfU05BTjY0OworICAgIHJldHVybiBkdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9yb3VuZGxfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50NjRfdCBkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF9uZWFyZXN0X2V2ZW4sICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBkdDIgPSBmbG9hdDMyX3RvX2ludDY0KGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBSRVNUT1JFX1JPVU5ESU5HX01PREU7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIGR0MiA9IEZMT0FUX1NOQU42NDsKKyAgICByZXR1cm4gZHQyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfcm91bmR3X2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDMyX3Qgd3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfbmVhcmVzdF9ldmVuLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgd3QyID0gZmxvYXQ2NF90b19pbnQzMihmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgUkVTVE9SRV9ST1VORElOR19NT0RFOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICB3dDIgPSBGTE9BVF9TTkFOMzI7CisgICAgcmV0dXJuIHd0MjsKK30KKwordWludDMyX3QgaGVscGVyX2Zsb2F0X3JvdW5kd19zKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwKQoreworICAgIHVpbnQzMl90IHd0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX25lYXJlc3RfZXZlbiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHd0MiA9IGZsb2F0MzJfdG9faW50MzIoZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIFJFU1RPUkVfUk9VTkRJTkdfTU9ERTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgd3QyID0gRkxPQVRfU05BTjMyOworICAgIHJldHVybiB3dDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF90cnVuY2xfZChDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZmR0MCkKK3sKKyAgICB1aW50NjRfdCBkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBkdDIgPSBmbG9hdDY0X3RvX2ludDY0X3JvdW5kX3RvX3plcm8oZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICBkdDIgPSBGTE9BVF9TTkFONjQ7CisgICAgcmV0dXJuIGR0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X3RydW5jbF9zKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwKQoreworICAgIHVpbnQ2NF90IGR0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGR0MiA9IGZsb2F0MzJfdG9faW50NjRfcm91bmRfdG9femVybyhmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIGR0MiA9IEZMT0FUX1NOQU42NDsKKyAgICByZXR1cm4gZHQyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfdHJ1bmN3X2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDMyX3Qgd3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgd3QyID0gZmxvYXQ2NF90b19pbnQzMl9yb3VuZF90b196ZXJvKGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgd3QyID0gRkxPQVRfU05BTjMyOworICAgIHJldHVybiB3dDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF90cnVuY3dfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50MzJfdCB3dDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB3dDIgPSBmbG9hdDMyX3RvX2ludDMyX3JvdW5kX3RvX3plcm8oZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICB3dDIgPSBGTE9BVF9TTkFOMzI7CisgICAgcmV0dXJuIHd0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X2NlaWxsX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDY0X3QgZHQyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfdXAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBkdDIgPSBmbG9hdDY0X3RvX2ludDY0KGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBSRVNUT1JFX1JPVU5ESU5HX01PREU7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIGR0MiA9IEZMT0FUX1NOQU42NDsKKyAgICByZXR1cm4gZHQyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfY2VpbGxfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50NjRfdCBkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF91cCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGR0MiA9IGZsb2F0MzJfdG9faW50NjQoZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIFJFU1RPUkVfUk9VTkRJTkdfTU9ERTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgZHQyID0gRkxPQVRfU05BTjY0OworICAgIHJldHVybiBkdDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF9jZWlsd19kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQzMl90IHd0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX3VwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgd3QyID0gZmxvYXQ2NF90b19pbnQzMihmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgUkVTVE9SRV9ST1VORElOR19NT0RFOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICB3dDIgPSBGTE9BVF9TTkFOMzI7CisgICAgcmV0dXJuIHd0MjsKK30KKwordWludDMyX3QgaGVscGVyX2Zsb2F0X2NlaWx3X3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDMyX3Qgd3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfdXAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB3dDIgPSBmbG9hdDMyX3RvX2ludDMyKGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBSRVNUT1JFX1JPVU5ESU5HX01PREU7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIHd0MiA9IEZMT0FUX1NOQU4zMjsKKyAgICByZXR1cm4gd3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfZmxvb3JsX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDY0X3QgZHQyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfZG93biwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGR0MiA9IGZsb2F0NjRfdG9faW50NjQoZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIFJFU1RPUkVfUk9VTkRJTkdfTU9ERTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgZHQyID0gRkxPQVRfU05BTjY0OworICAgIHJldHVybiBkdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9mbG9vcmxfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50NjRfdCBkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBzZXRfZmxvYXRfcm91bmRpbmdfbW9kZShmbG9hdF9yb3VuZF9kb3duLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZHQyID0gZmxvYXQzMl90b19pbnQ2NChmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgUkVTVE9SRV9ST1VORElOR19NT0RFOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIGlmIChHRVRfRlBfQ0FVU0UoZW52LT5hY3RpdmVfZnB1LmZjcjMxKSAmIChGUF9PVkVSRkxPVyB8IEZQX0lOVkFMSUQpKQorICAgICAgICBkdDIgPSBGTE9BVF9TTkFONjQ7CisgICAgcmV0dXJuIGR0MjsKK30KKwordWludDMyX3QgaGVscGVyX2Zsb2F0X2Zsb29yd19kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQzMl90IHd0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHNldF9mbG9hdF9yb3VuZGluZ19tb2RlKGZsb2F0X3JvdW5kX2Rvd24sICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB3dDIgPSBmbG9hdDY0X3RvX2ludDMyKGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBSRVNUT1JFX1JPVU5ESU5HX01PREU7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgKEZQX09WRVJGTE9XIHwgRlBfSU5WQUxJRCkpCisgICAgICAgIHd0MiA9IEZMT0FUX1NOQU4zMjsKKyAgICByZXR1cm4gd3QyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfZmxvb3J3X3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDMyX3Qgd3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgc2V0X2Zsb2F0X3JvdW5kaW5nX21vZGUoZmxvYXRfcm91bmRfZG93biwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHd0MiA9IGZsb2F0MzJfdG9faW50MzIoZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIFJFU1RPUkVfUk9VTkRJTkdfTU9ERTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiAoRlBfT1ZFUkZMT1cgfCBGUF9JTlZBTElEKSkKKyAgICAgICAgd3QyID0gRkxPQVRfU05BTjMyOworICAgIHJldHVybiB3dDI7Cit9CisKKy8qIHVuYXJ5IG9wZXJhdGlvbnMsIG5vdCBtb2RpZnlpbmcgZnAgc3RhdHVzICAqLworI2RlZmluZSBGTE9BVF9VTk9QKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordWludDY0X3QgaGVscGVyX2Zsb2F0XyAjIyBuYW1lICMjIF9kKHVpbnQ2NF90IGZkdDApICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZmxvYXQ2NF8gIyMgbmFtZShmZHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF8gIyMgbmFtZSAjIyBfcyh1aW50MzJfdCBmc3QwKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZsb2F0MzJfICMjIG5hbWUoZnN0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfICMjIG5hbWUgIyMgX3BzKHVpbnQ2NF90IGZkdDApICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHd0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHd0aDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHd0MCA9IGZsb2F0MzJfICMjIG5hbWUoZmR0MCAmIDBYRkZGRkZGRkYpOyAgICAgICAgICAgICAgICAgXAorICAgIHd0aDAgPSBmbG9hdDMyXyAjIyBuYW1lKGZkdDAgPj4gMzIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHVpbnQ2NF90KXd0aDAgPDwgMzIpIHwgd3QwOyAgICAgICAgICAgICAgICAgICAgICAgXAorfQorRkxPQVRfVU5PUChhYnMpCitGTE9BVF9VTk9QKGNocykKKyN1bmRlZiBGTE9BVF9VTk9QCisKKy8qIE1JUFMgc3BlY2lmaWMgdW5hcnkgb3BlcmF0aW9ucyAqLwordWludDY0X3QgaGVscGVyX2Zsb2F0X3JlY2lwX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDY0X3QgZmR0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZkdDIgPSBmbG9hdDY0X2RpdihGTE9BVF9PTkU2NCwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmZHQyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfcmVjaXBfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50MzJfdCBmc3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfZGl2KEZMT0FUX09ORTMyLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuIGZzdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9yc3FydF9kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQ2NF90IGZkdDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gZmxvYXQ2NF9zcXJ0KGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gZmxvYXQ2NF9kaXYoRkxPQVRfT05FNjQsIGZkdDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gZmR0MjsKK30KKwordWludDMyX3QgaGVscGVyX2Zsb2F0X3JzcXJ0X3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX3NxcnQoZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX2RpdihGTE9BVF9PTkUzMiwgZnN0MiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmc3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfcmVjaXAxX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDY0X3QgZmR0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZkdDIgPSBmbG9hdDY0X2RpdihGTE9BVF9PTkU2NCwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmZHQyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfcmVjaXAxX3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX2RpdihGTE9BVF9PTkUzMiwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmc3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfcmVjaXAxX3BzKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwKQoreworICAgIHVpbnQzMl90IGZzdDI7CisgICAgdWludDMyX3QgZnN0aDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9kaXYoRkxPQVRfT05FMzIsIGZkdDAgJiAwWEZGRkZGRkZGLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0aDIgPSBmbG9hdDMyX2RpdihGTE9BVF9PTkUzMiwgZmR0MCA+PiAzMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiAoKHVpbnQ2NF90KWZzdGgyIDw8IDMyKSB8IGZzdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9yc3FydDFfZChDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZmR0MCkKK3sKKyAgICB1aW50NjRfdCBmZHQyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZmR0MiA9IGZsb2F0NjRfc3FydChmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZmR0MiA9IGZsb2F0NjRfZGl2KEZMT0FUX09ORTY0LCBmZHQyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuIGZkdDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF9yc3FydDFfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCkKK3sKKyAgICB1aW50MzJfdCBmc3QyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfc3FydChmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfZGl2KEZMT0FUX09ORTMyLCBmc3QyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuIGZzdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9yc3FydDFfcHMoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDApCit7CisgICAgdWludDMyX3QgZnN0MjsKKyAgICB1aW50MzJfdCBmc3RoMjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX3NxcnQoZmR0MCAmIDBYRkZGRkZGRkYsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3RoMiA9IGZsb2F0MzJfc3FydChmZHQwID4+IDMyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfZGl2KEZMT0FUX09ORTMyLCBmc3QyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0aDIgPSBmbG9hdDMyX2RpdihGTE9BVF9PTkUzMiwgZnN0aDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gKCh1aW50NjRfdClmc3RoMiA8PCAzMikgfCBmc3QyOworfQorCisjZGVmaW5lIEZMT0FUX09QKG5hbWUsIHApIHZvaWQgaGVscGVyX2Zsb2F0XyMjbmFtZSMjXyMjcChDUFVNSVBTU3RhdGUgKmVudikKKworLyogYmluYXJ5IG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgRkxPQVRfQklOT1AobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfICMjIG5hbWUgIyMgX2QoQ1BVTUlQU1N0YXRlICplbnYsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDEpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgZHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgICAgICBcCisgICAgZHQyID0gZmxvYXQ2NF8gIyMgbmFtZSAoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiBGUF9JTlZBTElEKSAgICAgICAgICAgICAgICBcCisgICAgICAgIGR0MiA9IEZMT0FUX1FOQU42NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBkdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordWludDMyX3QgaGVscGVyX2Zsb2F0XyAjIyBuYW1lICMjIF9zKENQVU1JUFNTdGF0ZSAqZW52LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmc3QwLCB1aW50MzJfdCBmc3QxKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHd0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICAgICAgICAgXAorICAgIHd0MiA9IGZsb2F0MzJfICMjIG5hbWUgKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgIFwKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEdFVF9GUF9DQVVTRShlbnYtPmFjdGl2ZV9mcHUuZmNyMzEpICYgRlBfSU5WQUxJRCkgICAgICAgICAgICAgICAgXAorICAgICAgICB3dDIgPSBGTE9BVF9RTkFOMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gd3QyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF8gIyMgbmFtZSAjIyBfcHMoQ1BVTUlQU1N0YXRlICplbnYsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDAsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmZHQxKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0MCA9IGZkdDAgJiAwWEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdGgwID0gZmR0MCA+PiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3QxID0gZmR0MSAmIDBYRkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0aDEgPSBmZHQxID4+IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IHd0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCB3dGgyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICAgIFwKKyAgICB3dDIgPSBmbG9hdDMyXyAjIyBuYW1lIChmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICBcCisgICAgd3RoMiA9IGZsb2F0MzJfICMjIG5hbWUgKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoR0VUX0ZQX0NBVVNFKGVudi0+YWN0aXZlX2ZwdS5mY3IzMSkgJiBGUF9JTlZBTElEKSB7ICAgICAgICAgICAgICBcCisgICAgICAgIHd0MiA9IEZMT0FUX1FOQU4zMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3dGgyID0gRkxPQVRfUU5BTjMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgodWludDY0X3Qpd3RoMiA8PCAzMikgfCB3dDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGTE9BVF9CSU5PUChhZGQpCitGTE9BVF9CSU5PUChzdWIpCitGTE9BVF9CSU5PUChtdWwpCitGTE9BVF9CSU5PUChkaXYpCisjdW5kZWYgRkxPQVRfQklOT1AKKworLyogdGVybmFyeSBvcGVyYXRpb25zICovCisjZGVmaW5lIEZMT0FUX1RFUk5PUChuYW1lMSwgbmFtZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF8gIyMgbmFtZTEgIyMgbmFtZTIgIyMgX2QoQ1BVTUlQU1N0YXRlICplbnYsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDEsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmR0MikgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZkdDAgPSBmbG9hdDY0XyAjIyBuYW1lMSAoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICBcCisgICAgcmV0dXJuIGZsb2F0NjRfICMjIG5hbWUyIChmZHQwLCBmZHQyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfICMjIG5hbWUxICMjIG5hbWUyICMjIF9zKENQVU1JUFNTdGF0ZSAqZW52LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmc3QwLCB1aW50MzJfdCBmc3QxLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZzdDIpICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmc3QwID0gZmxvYXQzMl8gIyMgbmFtZTEgKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgICAgXAorICAgIHJldHVybiBmbG9hdDMyXyAjIyBuYW1lMiAoZnN0MCwgZnN0MiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordWludDY0X3QgaGVscGVyX2Zsb2F0XyAjIyBuYW1lMSAjIyBuYW1lMiAjIyBfcHMoQ1BVTUlQU1N0YXRlICplbnYsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmR0MikgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0MCA9IGZkdDAgJiAwWEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3RoMCA9IGZkdDAgPj4gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdDEgPSBmZHQxICYgMFhGRkZGRkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0aDEgPSBmZHQxID4+IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3QyID0gZmR0MiAmIDBYRkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdGgyID0gZmR0MiA+PiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmc3QwID0gZmxvYXQzMl8gIyMgbmFtZTEgKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgICAgXAorICAgIGZzdGgwID0gZmxvYXQzMl8gIyMgbmFtZTEgKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICBcCisgICAgZnN0MiA9IGZsb2F0MzJfICMjIG5hbWUyIChmc3QwLCBmc3QyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICAgICAgIFwKKyAgICBmc3RoMiA9IGZsb2F0MzJfICMjIG5hbWUyIChmc3RoMCwgZnN0aDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgXAorICAgIHJldHVybiAoKHVpbnQ2NF90KWZzdGgyIDw8IDMyKSB8IGZzdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0ZMT0FUX1RFUk5PUChtdWwsIGFkZCkKK0ZMT0FUX1RFUk5PUChtdWwsIHN1YikKKyN1bmRlZiBGTE9BVF9URVJOT1AKKworLyogbmVnYXRlZCB0ZXJuYXJ5IG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgRkxPQVRfTlRFUk5PUChuYW1lMSwgbmFtZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordWludDY0X3QgaGVscGVyX2Zsb2F0X24gIyMgbmFtZTEgIyMgbmFtZTIgIyMgX2QoQ1BVTUlQU1N0YXRlICplbnYsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZmR0MCwgdWludDY0X3QgZmR0MSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDIpICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZHQwID0gZmxvYXQ2NF8gIyMgbmFtZTEgKGZkdDAsIGZkdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgICAgXAorICAgIGZkdDIgPSBmbG9hdDY0XyAjIyBuYW1lMiAoZmR0MCwgZmR0MiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICBcCisgICAgcmV0dXJuIGZsb2F0NjRfY2hzKGZkdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfbiAjIyBuYW1lMSAjIyBuYW1lMiAjIyBfcyhDUFVNSVBTU3RhdGUgKmVudiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmc3QwLCB1aW50MzJfdCBmc3QxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnN0MikgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZzdDAgPSBmbG9hdDMyXyAjIyBuYW1lMSAoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICBcCisgICAgZnN0MiA9IGZsb2F0MzJfICMjIG5hbWUyIChmc3QwLCBmc3QyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICAgICAgIFwKKyAgICByZXR1cm4gZmxvYXQzMl9jaHMoZnN0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9uICMjIG5hbWUxICMjIG5hbWUyICMjIF9wcyhDUFVNSVBTU3RhdGUgKmVudiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDEsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDIpICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3QwID0gZmR0MCAmIDBYRkZGRkZGRkY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdGgwID0gZmR0MCA+PiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0MSA9IGZkdDEgJiAwWEZGRkZGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3RoMSA9IGZkdDEgPj4gMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdDIgPSBmZHQyICYgMFhGRkZGRkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0aDIgPSBmZHQyID4+IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZzdDAgPSBmbG9hdDMyXyAjIyBuYW1lMSAoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICAgICBcCisgICAgZnN0aDAgPSBmbG9hdDMyXyAjIyBuYW1lMSAoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7ICAgICAgIFwKKyAgICBmc3QyID0gZmxvYXQzMl8gIyMgbmFtZTIgKGZzdDAsIGZzdDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsgICAgICAgICAgXAorICAgIGZzdGgyID0gZmxvYXQzMl8gIyMgbmFtZTIgKGZzdGgwLCBmc3RoMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOyAgICAgICBcCisgICAgZnN0MiA9IGZsb2F0MzJfY2hzKGZzdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmc3RoMiA9IGZsb2F0MzJfY2hzKGZzdGgyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKHVpbnQ2NF90KWZzdGgyIDw8IDMyKSB8IGZzdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0ZMT0FUX05URVJOT1AobXVsLCBhZGQpCitGTE9BVF9OVEVSTk9QKG11bCwgc3ViKQorI3VuZGVmIEZMT0FUX05URVJOT1AKKworLyogTUlQUyBzcGVjaWZpYyBiaW5hcnkgb3BlcmF0aW9ucyAqLwordWludDY0X3QgaGVscGVyX2Zsb2F0X3JlY2lwMl9kKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwLCB1aW50NjRfdCBmZHQyKQoreworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZkdDIgPSBmbG9hdDY0X211bChmZHQwLCBmZHQyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZmR0MiA9IGZsb2F0NjRfY2hzKGZsb2F0NjRfc3ViKGZkdDIsIEZMT0FUX09ORTY0LCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiBmZHQyOworfQorCit1aW50MzJfdCBoZWxwZXJfZmxvYXRfcmVjaXAyX3MoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IGZzdDAsIHVpbnQzMl90IGZzdDIpCit7CisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfbXVsKGZzdDAsIGZzdDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9jaHMoZmxvYXQzMl9zdWIoZnN0MiwgRkxPQVRfT05FMzIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuIGZzdDI7Cit9CisKK3VpbnQ2NF90IGhlbHBlcl9mbG9hdF9yZWNpcDJfcHMoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDIpCit7CisgICAgdWludDMyX3QgZnN0MCA9IGZkdDAgJiAwWEZGRkZGRkZGOworICAgIHVpbnQzMl90IGZzdGgwID0gZmR0MCA+PiAzMjsKKyAgICB1aW50MzJfdCBmc3QyID0gZmR0MiAmIDBYRkZGRkZGRkY7CisgICAgdWludDMyX3QgZnN0aDIgPSBmZHQyID4+IDMyOworCisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfbXVsKGZzdDAsIGZzdDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3RoMiA9IGZsb2F0MzJfbXVsKGZzdGgwLCBmc3RoMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX2NocyhmbG9hdDMyX3N1Yihmc3QyLCBGTE9BVF9PTkUzMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKTsKKyAgICBmc3RoMiA9IGZsb2F0MzJfY2hzKGZsb2F0MzJfc3ViKGZzdGgyLCBGTE9BVF9PTkUzMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gKCh1aW50NjRfdClmc3RoMiA8PCAzMikgfCBmc3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfcnNxcnQyX2QoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDIpCit7CisgICAgc2V0X2Zsb2F0X2V4Y2VwdGlvbl9mbGFncygwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZmR0MiA9IGZsb2F0NjRfbXVsKGZkdDAsIGZkdDIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gZmxvYXQ2NF9zdWIoZmR0MiwgRkxPQVRfT05FNjQsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmZHQyID0gZmxvYXQ2NF9jaHMoZmxvYXQ2NF9kaXYoZmR0MiwgRkxPQVRfVFdPNjQsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuIGZkdDI7Cit9CisKK3VpbnQzMl90IGhlbHBlcl9mbG9hdF9yc3FydDJfcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3QgZnN0MCwgdWludDMyX3QgZnN0MikKK3sKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9tdWwoZnN0MCwgZnN0MiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX3N1Yihmc3QyLCBGTE9BVF9PTkUzMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX2NocyhmbG9hdDMyX2Rpdihmc3QyLCBGTE9BVF9UV08zMiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gZnN0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X3JzcXJ0Ml9wcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZmR0MCwgdWludDY0X3QgZmR0MikKK3sKKyAgICB1aW50MzJfdCBmc3QwID0gZmR0MCAmIDBYRkZGRkZGRkY7CisgICAgdWludDMyX3QgZnN0aDAgPSBmZHQwID4+IDMyOworICAgIHVpbnQzMl90IGZzdDIgPSBmZHQyICYgMFhGRkZGRkZGRjsKKyAgICB1aW50MzJfdCBmc3RoMiA9IGZkdDIgPj4gMzI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9tdWwoZnN0MCwgZnN0MiwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdGgyID0gZmxvYXQzMl9tdWwoZnN0aDAsIGZzdGgyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0MiA9IGZsb2F0MzJfc3ViKGZzdDIsIEZMT0FUX09ORTMyLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0aDIgPSBmbG9hdDMyX3N1Yihmc3RoMiwgRkxPQVRfT05FMzIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9jaHMoZmxvYXQzMl9kaXYoZnN0MiwgRkxPQVRfVFdPMzIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSk7CisgICAgZnN0aDIgPSBmbG9hdDMyX2NocyhmbG9hdDMyX2Rpdihmc3RoMiwgRkxPQVRfVFdPMzIsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSk7CisgICAgdXBkYXRlX2ZjcjMxKGVudik7CisgICAgcmV0dXJuICgodWludDY0X3QpZnN0aDIgPDwgMzIpIHwgZnN0MjsKK30KKwordWludDY0X3QgaGVscGVyX2Zsb2F0X2FkZHJfcHMoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDAsIHVpbnQ2NF90IGZkdDEpCit7CisgICAgdWludDMyX3QgZnN0MCA9IGZkdDAgJiAwWEZGRkZGRkZGOworICAgIHVpbnQzMl90IGZzdGgwID0gZmR0MCA+PiAzMjsKKyAgICB1aW50MzJfdCBmc3QxID0gZmR0MSAmIDBYRkZGRkZGRkY7CisgICAgdWludDMyX3QgZnN0aDEgPSBmZHQxID4+IDMyOworICAgIHVpbnQzMl90IGZzdDI7CisgICAgdWludDMyX3QgZnN0aDI7CisKKyAgICBzZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3QyID0gZmxvYXQzMl9hZGQgKGZzdDAsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyk7CisgICAgZnN0aDIgPSBmbG9hdDMyX2FkZCAoZnN0MSwgZnN0aDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICB1cGRhdGVfZmNyMzEoZW52KTsKKyAgICByZXR1cm4gKCh1aW50NjRfdClmc3RoMiA8PCAzMikgfCBmc3QyOworfQorCit1aW50NjRfdCBoZWxwZXJfZmxvYXRfbXVscl9wcyhDUFVNSVBTU3RhdGUgKmVudiwgdWludDY0X3QgZmR0MCwgdWludDY0X3QgZmR0MSkKK3sKKyAgICB1aW50MzJfdCBmc3QwID0gZmR0MCAmIDBYRkZGRkZGRkY7CisgICAgdWludDMyX3QgZnN0aDAgPSBmZHQwID4+IDMyOworICAgIHVpbnQzMl90IGZzdDEgPSBmZHQxICYgMFhGRkZGRkZGRjsKKyAgICB1aW50MzJfdCBmc3RoMSA9IGZkdDEgPj4gMzI7CisgICAgdWludDMyX3QgZnN0MjsKKyAgICB1aW50MzJfdCBmc3RoMjsKKworICAgIHNldF9mbG9hdF9leGNlcHRpb25fZmxhZ3MoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIGZzdDIgPSBmbG9hdDMyX211bCAoZnN0MCwgZnN0aDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKTsKKyAgICBmc3RoMiA9IGZsb2F0MzJfbXVsIChmc3QxLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpOworICAgIHVwZGF0ZV9mY3IzMShlbnYpOworICAgIHJldHVybiAoKHVpbnQ2NF90KWZzdGgyIDw8IDMyKSB8IGZzdDI7Cit9CisKKy8qIGNvbXBhcmUgb3BlcmF0aW9ucyAqLworI2RlZmluZSBGT1BfQ09ORF9EKG9wLCBjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBoZWxwZXJfY21wX2RfICMjIG9wKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDEsIGludCBjYykgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjID0gY29uZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBfQ09ORChjYywgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBUl9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBoZWxwZXJfY21wYWJzX2RfICMjIG9wKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDEsIGludCBjYykgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZkdDAgPSBmbG9hdDY0X2FicyhmZHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZkdDEgPSBmbG9hdDY0X2FicyhmZHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMgPSBjb25kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBfQ09ORChjYywgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBUl9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgaW50IGZsb2F0NjRfaXNfdW5vcmRlcmVkKGludCBzaWcsIGZsb2F0NjQgYSwgZmxvYXQ2NCBiIFNUQVRVU19QQVJBTSkKK3sKKyAgICBpZiAoZmxvYXQ2NF9pc19zaWduYWxpbmdfbmFuKGEpIHx8CisgICAgICAgIGZsb2F0NjRfaXNfc2lnbmFsaW5nX25hbihiKSB8fAorICAgICAgICAoc2lnICYmIChmbG9hdDY0X2lzX2FueV9uYW4oYSkgfHwgZmxvYXQ2NF9pc19hbnlfbmFuKGIpKSkpIHsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGZsb2F0NjRfaXNfYW55X25hbihhKSB8fCBmbG9hdDY0X2lzX2FueV9uYW4oYikpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiBOT1RFOiB0aGUgY29tbWEgb3BlcmF0b3Igd2lsbCBtYWtlICJjb25kIiB0byBldmFsIHRvIGZhbHNlLAorICogYnV0IGZsb2F0Kl9pc191bm9yZGVyZWQoKSBpcyBzdGlsbCBjYWxsZWQuICovCitGT1BfQ09ORF9EKGYsICAgKGZsb2F0NjRfaXNfdW5vcmRlcmVkKDAsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwgMCkpCitGT1BfQ09ORF9EKHVuLCAgZmxvYXQ2NF9pc191bm9yZGVyZWQoMCwgZmR0MSwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfRChlcSwgICFmbG9hdDY0X2lzX3Vub3JkZXJlZCgwLCBmZHQxLCBmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgJiYgZmxvYXQ2NF9lcShmZHQwLCBmZHQxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9EKHVlcSwgZmxvYXQ2NF9pc191bm9yZGVyZWQoMCwgZmR0MSwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDY0X2VxKGZkdDAsIGZkdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX0Qob2x0LCAhZmxvYXQ2NF9pc191bm9yZGVyZWQoMCwgZmR0MSwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0NjRfbHQoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfRCh1bHQsIGZsb2F0NjRfaXNfdW5vcmRlcmVkKDAsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgfHwgZmxvYXQ2NF9sdChmZHQwLCBmZHQxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9EKG9sZSwgIWZsb2F0NjRfaXNfdW5vcmRlcmVkKDAsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDY0X2xlKGZkdDAsIGZkdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX0QodWxlLCBmbG9hdDY0X2lzX3Vub3JkZXJlZCgwLCBmZHQxLCBmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0NjRfbGUoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorLyogTk9URTogdGhlIGNvbW1hIG9wZXJhdG9yIHdpbGwgbWFrZSAiY29uZCIgdG8gZXZhbCB0byBmYWxzZSwKKyAqIGJ1dCBmbG9hdCpfaXNfdW5vcmRlcmVkKCkgaXMgc3RpbGwgY2FsbGVkLiAqLworRk9QX0NPTkRfRChzZiwgIChmbG9hdDY0X2lzX3Vub3JkZXJlZCgxLCBmZHQxLCBmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksIDApKQorRk9QX0NPTkRfRChuZ2xlLGZsb2F0NjRfaXNfdW5vcmRlcmVkKDEsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX0Qoc2VxLCAhZmxvYXQ2NF9pc191bm9yZGVyZWQoMSwgZmR0MSwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0NjRfZXEoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfRChuZ2wsIGZsb2F0NjRfaXNfdW5vcmRlcmVkKDEsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgfHwgZmxvYXQ2NF9lcShmZHQwLCBmZHQxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9EKGx0LCAgIWZsb2F0NjRfaXNfdW5vcmRlcmVkKDEsIGZkdDEsIGZkdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDY0X2x0KGZkdDAsIGZkdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX0QobmdlLCBmbG9hdDY0X2lzX3Vub3JkZXJlZCgxLCBmZHQxLCBmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0NjRfbHQoZmR0MCwgZmR0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfRChsZSwgICFmbG9hdDY0X2lzX3Vub3JkZXJlZCgxLCBmZHQxLCBmZHQwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgJiYgZmxvYXQ2NF9sZShmZHQwLCBmZHQxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9EKG5ndCwgZmxvYXQ2NF9pc191bm9yZGVyZWQoMSwgZmR0MSwgZmR0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDY0X2xlKGZkdDAsIGZkdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKKworI2RlZmluZSBGT1BfQ09ORF9TKG9wLCBjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBoZWxwZXJfY21wX3NfICMjIG9wKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZzdDEsIGludCBjYykgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjID0gY29uZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBfQ09ORChjYywgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBUl9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBoZWxwZXJfY21wYWJzX3NfICMjIG9wKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBmc3QwLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZzdDEsIGludCBjYykgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZzdDAgPSBmbG9hdDMyX2Ficyhmc3QwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZzdDEgPSBmbG9hdDMyX2Ficyhmc3QxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGMgPSBjb25kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBfQ09ORChjYywgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBUl9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgZmxhZyBmbG9hdDMyX2lzX3Vub3JkZXJlZChpbnQgc2lnLCBmbG9hdDMyIGEsIGZsb2F0MzIgYiBTVEFUVVNfUEFSQU0pCit7CisgICAgaWYgKGZsb2F0MzJfaXNfc2lnbmFsaW5nX25hbihhKSB8fAorICAgICAgICBmbG9hdDMyX2lzX3NpZ25hbGluZ19uYW4oYikgfHwKKyAgICAgICAgKHNpZyAmJiAoZmxvYXQzMl9pc19hbnlfbmFuKGEpIHx8IGZsb2F0MzJfaXNfYW55X25hbihiKSkpKSB7CisgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxpZCwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChmbG9hdDMyX2lzX2FueV9uYW4oYSkgfHwgZmxvYXQzMl9pc19hbnlfbmFuKGIpKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyogTk9URTogdGhlIGNvbW1hIG9wZXJhdG9yIHdpbGwgbWFrZSAiY29uZCIgdG8gZXZhbCB0byBmYWxzZSwKKyAqIGJ1dCBmbG9hdCpfaXNfdW5vcmRlcmVkKCkgaXMgc3RpbGwgY2FsbGVkLiAqLworRk9QX0NPTkRfUyhmLCAgIChmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksIDApKQorRk9QX0NPTkRfUyh1biwgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX1MoZXEsICAhZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0MzJfZXEoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUyh1ZXEsIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgfHwgZmxvYXQzMl9lcShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9TKG9sdCwgIWZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDMyX2x0KGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX1ModWx0LCBmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0MzJfbHQoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUyhvbGUsICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgJiYgZmxvYXQzMl9sZShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9TKHVsZSwgZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDMyX2xlKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKKy8qIE5PVEU6IHRoZSBjb21tYSBvcGVyYXRvciB3aWxsIG1ha2UgImNvbmQiIHRvIGV2YWwgdG8gZmFsc2UsCisgKiBidXQgZmxvYXQqX2lzX3Vub3JkZXJlZCgpIGlzIHN0aWxsIGNhbGxlZC4gKi8KK0ZPUF9DT05EX1Moc2YsICAoZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpLCAwKSkKK0ZPUF9DT05EX1MobmdsZSxmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9TKHNlcSwgIWZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDMyX2VxKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX1MobmdsLCBmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0MzJfZXEoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUyhsdCwgICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgJiYgZmxvYXQzMl9sdChmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9TKG5nZSwgZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDMyX2x0KGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSkKK0ZPUF9DT05EX1MobGUsICAhZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0MzJfbGUoZnN0MCwgZnN0MSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUyhuZ3QsIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgfHwgZmxvYXQzMl9sZShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCisKKyNkZWZpbmUgRk9QX0NPTkRfUFMob3AsIGNvbmRsLCBjb25kaCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGhlbHBlcl9jbXBfcHNfICMjIG9wKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50NjRfdCBmZHQwLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmZHQxLCBpbnQgY2MpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0MCA9IGZsb2F0MzJfYWJzKGZkdDAgJiAwWEZGRkZGRkZGKTsgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdGgwID0gZmxvYXQzMl9hYnMoZmR0MCA+PiAzMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3QxID0gZmxvYXQzMl9hYnMoZmR0MSAmIDBYRkZGRkZGRkYpOyAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0aDEgPSBmbG9hdDMyX2FicyhmZHQxID4+IDMyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjbCA9IGNvbmRsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY2ggPSBjb25kaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVwZGF0ZV9mY3IzMShlbnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY2wpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNFVF9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xFQVJfRlBfQ09ORChjYywgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTRVRfRlBfQ09ORChjYyArIDEsIGVudi0+YWN0aXZlX2ZwdSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENMRUFSX0ZQX0NPTkQoY2MgKyAxLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgaGVscGVyX2NtcGFic19wc18gIyMgb3AoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQ2NF90IGZkdDAsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZkdDEsIGludCBjYykgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3QwID0gZmxvYXQzMl9hYnMoZmR0MCAmIDBYRkZGRkZGRkYpOyAgICAgICAgICAgICBcCisgICAgdWludDMyX3QgZnN0aDAgPSBmbG9hdDMyX2FicyhmZHQwID4+IDMyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQzMl90IGZzdDEgPSBmbG9hdDMyX2FicyhmZHQxICYgMFhGRkZGRkZGRik7ICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBmc3RoMSA9IGZsb2F0MzJfYWJzKGZkdDEgPj4gMzIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNsID0gY29uZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjaCA9IGNvbmRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXBkYXRlX2ZjcjMxKGVudik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0VUX0ZQX0NPTkQoY2MsIGVudi0+YWN0aXZlX2ZwdSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEVBUl9GUF9DT05EKGNjLCBlbnYtPmFjdGl2ZV9mcHUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNFVF9GUF9DT05EKGNjICsgMSwgZW52LT5hY3RpdmVfZnB1KTsgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xFQVJfRlBfQ09ORChjYyArIDEsIGVudi0+YWN0aXZlX2ZwdSk7ICAgICAgICAgICAgICAgICBcCit9CisKKy8qIE5PVEU6IHRoZSBjb21tYSBvcGVyYXRvciB3aWxsIG1ha2UgImNvbmQiIHRvIGV2YWwgdG8gZmFsc2UsCisgKiBidXQgZmxvYXQqX2lzX3Vub3JkZXJlZCgpIGlzIHN0aWxsIGNhbGxlZC4gKi8KK0ZPUF9DT05EX1BTKGYsICAgKGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwgMCksCisgICAgICAgICAgICAgICAgIChmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3RoMSwgZnN0aDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwgMCkpCitGT1BfQ09ORF9QUyh1biwgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0aDEsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyhlcSwgICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAmJiBmbG9hdDMyX2VxKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgIWZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0MzJfZXEoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyh1ZXEsIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgICB8fCBmbG9hdDMyX2VxKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0aDEsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0MzJfZXEoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyhvbHQsICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAmJiBmbG9hdDMyX2x0KGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgIWZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0MzJfbHQoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyh1bHQsIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgICB8fCBmbG9hdDMyX2x0KGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0aDEsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0MzJfbHQoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyhvbGUsICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgwLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAmJiBmbG9hdDMyX2xlKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgIWZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICYmIGZsb2F0MzJfbGUoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCitGT1BfQ09ORF9QUyh1bGUsIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDAsIGZzdDEsIGZzdDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAgICB8fCBmbG9hdDMyX2xlKGZzdDAsIGZzdDEsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgZmxvYXQzMl9pc191bm9yZGVyZWQoMCwgZnN0aDEsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgIHx8IGZsb2F0MzJfbGUoZnN0aDAsIGZzdGgxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykpCisvKiBOT1RFOiB0aGUgY29tbWEgb3BlcmF0b3Igd2lsbCBtYWtlICJjb25kIiB0byBldmFsIHRvIGZhbHNlLAorICogYnV0IGZsb2F0Kl9pc191bm9yZGVyZWQoKSBpcyBzdGlsbCBjYWxsZWQuICovCitGT1BfQ09ORF9QUyhzZiwgIChmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksIDApLAorICAgICAgICAgICAgICAgICAoZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0aDEsIGZzdGgwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksIDApKQorRk9QX0NPTkRfUFMobmdsZSxmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMoc2VxLCAhZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICAgJiYgZmxvYXQzMl9lcShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3RoMSwgZnN0aDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDMyX2VxKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMobmdsLCBmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAgfHwgZmxvYXQzMl9lcShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDMyX2VxKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMobHQsICAhZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICAgJiYgZmxvYXQzMl9sdChmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3RoMSwgZnN0aDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDMyX2x0KGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMobmdlLCBmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAgfHwgZmxvYXQzMl9sdChmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDMyX2x0KGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMobGUsICAhZmxvYXQzMl9pc191bm9yZGVyZWQoMSwgZnN0MSwgZnN0MCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICAgJiYgZmxvYXQzMl9sZShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgICFmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3RoMSwgZnN0aDAsICZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSAmJiBmbG9hdDMyX2xlKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQorRk9QX0NPTkRfUFMobmd0LCBmbG9hdDMyX2lzX3Vub3JkZXJlZCgxLCBmc3QxLCBmc3QwLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cykgICAgfHwgZmxvYXQzMl9sZShmc3QwLCBmc3QxLCAmZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cyksCisgICAgICAgICAgICAgICAgIGZsb2F0MzJfaXNfdW5vcmRlcmVkKDEsIGZzdGgxLCBmc3RoMCwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpICB8fCBmbG9hdDMyX2xlKGZzdGgwLCBmc3RoMSwgJmVudi0+YWN0aXZlX2ZwdS5mcF9zdGF0dXMpKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90YXJnZXQtbWlwcy90cmFuc2xhdGUuYyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvdHJhbnNsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxNDdlOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvdHJhbnNsYXRlLmMKQEAgLTAsMCArMSwxMjE0OSBAQAorLyoKKyAqICBNSVBTMzIgZW11bGF0aW9uIGZvciBxZW11OiBtYWluIHRyYW5zbGF0aW9uIHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBKb2NlbHluIE1heWVyCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IE1hcml1cyBHcm9lZ2VyIChGUFUgb3BlcmF0aW9ucykKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgVGhpZW1vIFNldWZlciAoTUlQUzMyUjIgc3VwcG9ydCkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgSmlhIExpdSAmIERvbmd4dWUgWmhhbmcgKE1JUFMgQVNFIERTUCBzdXBwb3J0KQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZGlzYXMvZGlzYXMuaCIKKyNpbmNsdWRlICJ0Y2ctb3AuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCisjaW5jbHVkZSAiaGVscGVyLmgiCisjZGVmaW5lIEdFTl9IRUxQRVIgMQorI2luY2x1ZGUgImhlbHBlci5oIgorCisvLyNkZWZpbmUgTUlQU19ERUJVR19ESVNBUworLy8jZGVmaW5lIE1JUFNfREVCVUdfU0lHTl9FWFRFTlNJT05TCisKKy8qIE1JUFMgbWFqb3Igb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX09QX01BSk9SKG9wKSAgKG9wICYgKDB4M0YgPDwgMjYpKQorCitlbnVtIHsKKyAgICAvKiBpbmRpcmVjdCBvcGNvZGUgdGFibGVzICovCisgICAgT1BDX1NQRUNJQUwgID0gKDB4MDAgPDwgMjYpLAorICAgIE9QQ19SRUdJTU0gICA9ICgweDAxIDw8IDI2KSwKKyAgICBPUENfQ1AwICAgICAgPSAoMHgxMCA8PCAyNiksCisgICAgT1BDX0NQMSAgICAgID0gKDB4MTEgPDwgMjYpLAorICAgIE9QQ19DUDIgICAgICA9ICgweDEyIDw8IDI2KSwKKyAgICBPUENfQ1AzICAgICAgPSAoMHgxMyA8PCAyNiksCisgICAgT1BDX1NQRUNJQUwyID0gKDB4MUMgPDwgMjYpLAorICAgIE9QQ19TUEVDSUFMMyA9ICgweDFGIDw8IDI2KSwKKyAgICAvKiBhcml0aG1ldGljIHdpdGggaW1tZWRpYXRlICovCisgICAgT1BDX0FEREkgICAgID0gKDB4MDggPDwgMjYpLAorICAgIE9QQ19BRERJVSAgICA9ICgweDA5IDw8IDI2KSwKKyAgICBPUENfU0xUSSAgICAgPSAoMHgwQSA8PCAyNiksCisgICAgT1BDX1NMVElVICAgID0gKDB4MEIgPDwgMjYpLAorICAgIC8qIGxvZ2ljIHdpdGggaW1tZWRpYXRlICovCisgICAgT1BDX0FOREkgICAgID0gKDB4MEMgPDwgMjYpLAorICAgIE9QQ19PUkkgICAgICA9ICgweDBEIDw8IDI2KSwKKyAgICBPUENfWE9SSSAgICAgPSAoMHgwRSA8PCAyNiksCisgICAgT1BDX0xVSSAgICAgID0gKDB4MEYgPDwgMjYpLAorICAgIC8qIGFyaXRobWV0aWMgd2l0aCBpbW1lZGlhdGUgKi8KKyAgICBPUENfREFEREkgICAgPSAoMHgxOCA8PCAyNiksCisgICAgT1BDX0RBRERJVSAgID0gKDB4MTkgPDwgMjYpLAorICAgIC8qIEp1bXAgYW5kIGJyYW5jaGVzICovCisgICAgT1BDX0ogICAgICAgID0gKDB4MDIgPDwgMjYpLAorICAgIE9QQ19KQUwgICAgICA9ICgweDAzIDw8IDI2KSwKKyAgICBPUENfQkVRICAgICAgPSAoMHgwNCA8PCAyNiksICAvKiBVbmNvbmRpdGlvbmFsIGlmIHJzID0gcnQgPSAwIChCKSAqLworICAgIE9QQ19CRVFMICAgICA9ICgweDE0IDw8IDI2KSwKKyAgICBPUENfQk5FICAgICAgPSAoMHgwNSA8PCAyNiksCisgICAgT1BDX0JORUwgICAgID0gKDB4MTUgPDwgMjYpLAorICAgIE9QQ19CTEVaICAgICA9ICgweDA2IDw8IDI2KSwKKyAgICBPUENfQkxFWkwgICAgPSAoMHgxNiA8PCAyNiksCisgICAgT1BDX0JHVFogICAgID0gKDB4MDcgPDwgMjYpLAorICAgIE9QQ19CR1RaTCAgICA9ICgweDE3IDw8IDI2KSwKKyAgICBPUENfSkFMWCAgICAgPSAoMHgxRCA8PCAyNiksICAvKiBNSVBTIDE2IG9ubHkgKi8KKyAgICAvKiBMb2FkIGFuZCBzdG9yZXMgKi8KKyAgICBPUENfTERMICAgICAgPSAoMHgxQSA8PCAyNiksCisgICAgT1BDX0xEUiAgICAgID0gKDB4MUIgPDwgMjYpLAorICAgIE9QQ19MQiAgICAgICA9ICgweDIwIDw8IDI2KSwKKyAgICBPUENfTEggICAgICAgPSAoMHgyMSA8PCAyNiksCisgICAgT1BDX0xXTCAgICAgID0gKDB4MjIgPDwgMjYpLAorICAgIE9QQ19MVyAgICAgICA9ICgweDIzIDw8IDI2KSwKKyAgICBPUENfTEJVICAgICAgPSAoMHgyNCA8PCAyNiksCisgICAgT1BDX0xIVSAgICAgID0gKDB4MjUgPDwgMjYpLAorICAgIE9QQ19MV1IgICAgICA9ICgweDI2IDw8IDI2KSwKKyAgICBPUENfTFdVICAgICAgPSAoMHgyNyA8PCAyNiksCisgICAgT1BDX1NCICAgICAgID0gKDB4MjggPDwgMjYpLAorICAgIE9QQ19TSCAgICAgICA9ICgweDI5IDw8IDI2KSwKKyAgICBPUENfU1dMICAgICAgPSAoMHgyQSA8PCAyNiksCisgICAgT1BDX1NXICAgICAgID0gKDB4MkIgPDwgMjYpLAorICAgIE9QQ19TREwgICAgICA9ICgweDJDIDw8IDI2KSwKKyAgICBPUENfU0RSICAgICAgPSAoMHgyRCA8PCAyNiksCisgICAgT1BDX1NXUiAgICAgID0gKDB4MkUgPDwgMjYpLAorICAgIE9QQ19MTCAgICAgICA9ICgweDMwIDw8IDI2KSwKKyAgICBPUENfTExEICAgICAgPSAoMHgzNCA8PCAyNiksCisgICAgT1BDX0xEICAgICAgID0gKDB4MzcgPDwgMjYpLAorICAgIE9QQ19TQyAgICAgICA9ICgweDM4IDw8IDI2KSwKKyAgICBPUENfU0NEICAgICAgPSAoMHgzQyA8PCAyNiksCisgICAgT1BDX1NEICAgICAgID0gKDB4M0YgPDwgMjYpLAorICAgIC8qIEZsb2F0aW5nIHBvaW50IGxvYWQvc3RvcmUgKi8KKyAgICBPUENfTFdDMSAgICAgPSAoMHgzMSA8PCAyNiksCisgICAgT1BDX0xXQzIgICAgID0gKDB4MzIgPDwgMjYpLAorICAgIE9QQ19MREMxICAgICA9ICgweDM1IDw8IDI2KSwKKyAgICBPUENfTERDMiAgICAgPSAoMHgzNiA8PCAyNiksCisgICAgT1BDX1NXQzEgICAgID0gKDB4MzkgPDwgMjYpLAorICAgIE9QQ19TV0MyICAgICA9ICgweDNBIDw8IDI2KSwKKyAgICBPUENfU0RDMSAgICAgPSAoMHgzRCA8PCAyNiksCisgICAgT1BDX1NEQzIgICAgID0gKDB4M0UgPDwgMjYpLAorICAgIC8qIE1ETVggQVNFIHNwZWNpZmljICovCisgICAgT1BDX01ETVggICAgID0gKDB4MUUgPDwgMjYpLAorICAgIC8qIENhY2hlIGFuZCBwcmVmZXRjaCAqLworICAgIE9QQ19DQUNIRSAgICA9ICgweDJGIDw8IDI2KSwKKyAgICBPUENfUFJFRiAgICAgPSAoMHgzMyA8PCAyNiksCisgICAgLyogUmVzZXJ2ZWQgbWFqb3Igb3Bjb2RlICovCisgICAgT1BDX01BSk9SM0JfUkVTRVJWRUQgPSAoMHgzQiA8PCAyNiksCit9OworCisvKiBNSVBTIHNwZWNpYWwgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX1NQRUNJQUwob3ApICAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAweDNGKQorCitlbnVtIHsKKyAgICAvKiBTaGlmdHMgKi8KKyAgICBPUENfU0xMICAgICAgPSAweDAwIHwgT1BDX1NQRUNJQUwsCisgICAgLyogTk9QIGlzIFNMTCByMCwgcjAsIDAgICAqLworICAgIC8qIFNTTk9QIGlzIFNMTCByMCwgcjAsIDEgKi8KKyAgICAvKiBFSEIgaXMgU0xMIHIwLCByMCwgMyAqLworICAgIE9QQ19TUkwgICAgICA9IDB4MDIgfCBPUENfU1BFQ0lBTCwgLyogYWxzbyBST1RSICovCisgICAgT1BDX1NSQSAgICAgID0gMHgwMyB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19TTExWICAgICA9IDB4MDQgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfU1JMViAgICAgPSAweDA2IHwgT1BDX1NQRUNJQUwsIC8qIGFsc28gUk9UUlYgKi8KKyAgICBPUENfU1JBViAgICAgPSAweDA3IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RTTExWICAgID0gMHgxNCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19EU1JMViAgICA9IDB4MTYgfCBPUENfU1BFQ0lBTCwgLyogYWxzbyBEUk9UUlYgKi8KKyAgICBPUENfRFNSQVYgICAgPSAweDE3IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RTTEwgICAgID0gMHgzOCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19EU1JMICAgICA9IDB4M0EgfCBPUENfU1BFQ0lBTCwgLyogYWxzbyBEUk9UUiAqLworICAgIE9QQ19EU1JBICAgICA9IDB4M0IgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfRFNMTDMyICAgPSAweDNDIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RTUkwzMiAgID0gMHgzRSB8IE9QQ19TUEVDSUFMLCAvKiBhbHNvIERST1RSMzIgKi8KKyAgICBPUENfRFNSQTMyICAgPSAweDNGIHwgT1BDX1NQRUNJQUwsCisgICAgLyogTXVsdGlwbGljYXRpb24gLyBkaXZpc2lvbiAqLworICAgIE9QQ19NVUxUICAgICA9IDB4MTggfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfTVVMVFUgICAgPSAweDE5IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RJViAgICAgID0gMHgxQSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19ESVZVICAgICA9IDB4MUIgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfRE1VTFQgICAgPSAweDFDIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RNVUxUVSAgID0gMHgxRCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19ERElWICAgICA9IDB4MUUgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfRERJVlUgICAgPSAweDFGIHwgT1BDX1NQRUNJQUwsCisgICAgLyogMiByZWdpc3RlcnMgYXJpdGhtZXRpYyAvIGxvZ2ljICovCisgICAgT1BDX0FERCAgICAgID0gMHgyMCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19BRERVICAgICA9IDB4MjEgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfU1VCICAgICAgPSAweDIyIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1NVQlUgICAgID0gMHgyMyB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19BTkQgICAgICA9IDB4MjQgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfT1IgICAgICAgPSAweDI1IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1hPUiAgICAgID0gMHgyNiB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19OT1IgICAgICA9IDB4MjcgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfU0xUICAgICAgPSAweDJBIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1NMVFUgICAgID0gMHgyQiB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19EQUREICAgICA9IDB4MkMgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfREFERFUgICAgPSAweDJEIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0RTVUIgICAgID0gMHgyRSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19EU1VCVSAgICA9IDB4MkYgfCBPUENfU1BFQ0lBTCwKKyAgICAvKiBKdW1wcyAqLworICAgIE9QQ19KUiAgICAgICA9IDB4MDggfCBPUENfU1BFQ0lBTCwgLyogQWxzbyBKUi5IQiAqLworICAgIE9QQ19KQUxSICAgICA9IDB4MDkgfCBPUENfU1BFQ0lBTCwgLyogQWxzbyBKQUxSLkhCICovCisgICAgLyogVHJhcHMgKi8KKyAgICBPUENfVEdFICAgICAgPSAweDMwIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1RHRVUgICAgID0gMHgzMSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19UTFQgICAgICA9IDB4MzIgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfVExUVSAgICAgPSAweDMzIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1RFUSAgICAgID0gMHgzNCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19UTkUgICAgICA9IDB4MzYgfCBPUENfU1BFQ0lBTCwKKyAgICAvKiBISSAvIExPIHJlZ2lzdGVycyBsb2FkICYgc3RvcmVzICovCisgICAgT1BDX01GSEkgICAgID0gMHgxMCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19NVEhJICAgICA9IDB4MTEgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfTUZMTyAgICAgPSAweDEyIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX01UTE8gICAgID0gMHgxMyB8IE9QQ19TUEVDSUFMLAorICAgIC8qIENvbmRpdGlvbmFsIG1vdmVzICovCisgICAgT1BDX01PVlogICAgID0gMHgwQSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19NT1ZOICAgICA9IDB4MEIgfCBPUENfU1BFQ0lBTCwKKworICAgIE9QQ19NT1ZDSSAgICA9IDB4MDEgfCBPUENfU1BFQ0lBTCwKKworICAgIC8qIFNwZWNpYWwgKi8KKyAgICBPUENfUE1PTiAgICAgPSAweDA1IHwgT1BDX1NQRUNJQUwsIC8qIHVub2ZmaWNpYWwgKi8KKyAgICBPUENfU1lTQ0FMTCAgPSAweDBDIHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX0JSRUFLICAgID0gMHgwRCB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19TUElNICAgICA9IDB4MEUgfCBPUENfU1BFQ0lBTCwgLyogdW5vZmZpY2lhbCAqLworICAgIE9QQ19TWU5DICAgICA9IDB4MEYgfCBPUENfU1BFQ0lBTCwKKworICAgIE9QQ19TUEVDSUFMMTVfUkVTRVJWRUQgPSAweDE1IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1NQRUNJQUwyOF9SRVNFUlZFRCA9IDB4MjggfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfU1BFQ0lBTDI5X1JFU0VSVkVEID0gMHgyOSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19TUEVDSUFMMzVfUkVTRVJWRUQgPSAweDM1IHwgT1BDX1NQRUNJQUwsCisgICAgT1BDX1NQRUNJQUwzN19SRVNFUlZFRCA9IDB4MzcgfCBPUENfU1BFQ0lBTCwKKyAgICBPUENfU1BFQ0lBTDM5X1JFU0VSVkVEID0gMHgzOSB8IE9QQ19TUEVDSUFMLAorICAgIE9QQ19TUEVDSUFMM0RfUkVTRVJWRUQgPSAweDNEIHwgT1BDX1NQRUNJQUwsCit9OworCisvKiBNdWx0aXBsaWNhdGlvbiB2YXJpYW50cyBvZiB0aGUgdnI1NHh4LiAqLworI2RlZmluZSBNQVNLX01VTF9WUjU0WFgob3ApICAgTUFTS19TUEVDSUFMKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKQorCitlbnVtIHsKKyAgICBPUENfVlI1NFhYX01VTFMgICAgPSAoMHgwMyA8PCA2KSB8IE9QQ19NVUxULAorICAgIE9QQ19WUjU0WFhfTVVMU1UgICA9ICgweDAzIDw8IDYpIHwgT1BDX01VTFRVLAorICAgIE9QQ19WUjU0WFhfTUFDQyAgICA9ICgweDA1IDw8IDYpIHwgT1BDX01VTFQsCisgICAgT1BDX1ZSNTRYWF9NQUNDVSAgID0gKDB4MDUgPDwgNikgfCBPUENfTVVMVFUsCisgICAgT1BDX1ZSNTRYWF9NU0FDICAgID0gKDB4MDcgPDwgNikgfCBPUENfTVVMVCwKKyAgICBPUENfVlI1NFhYX01TQUNVICAgPSAoMHgwNyA8PCA2KSB8IE9QQ19NVUxUVSwKKyAgICBPUENfVlI1NFhYX01VTEhJICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19NVUxULAorICAgIE9QQ19WUjU0WFhfTVVMSElVICA9ICgweDA5IDw8IDYpIHwgT1BDX01VTFRVLAorICAgIE9QQ19WUjU0WFhfTVVMU0hJICA9ICgweDBCIDw8IDYpIHwgT1BDX01VTFQsCisgICAgT1BDX1ZSNTRYWF9NVUxTSElVID0gKDB4MEIgPDwgNikgfCBPUENfTVVMVFUsCisgICAgT1BDX1ZSNTRYWF9NQUNDSEkgID0gKDB4MEQgPDwgNikgfCBPUENfTVVMVCwKKyAgICBPUENfVlI1NFhYX01BQ0NISVUgPSAoMHgwRCA8PCA2KSB8IE9QQ19NVUxUVSwKKyAgICBPUENfVlI1NFhYX01TQUNISSAgPSAoMHgwRiA8PCA2KSB8IE9QQ19NVUxULAorICAgIE9QQ19WUjU0WFhfTVNBQ0hJVSA9ICgweDBGIDw8IDYpIHwgT1BDX01VTFRVLAorfTsKKworLyogUkVHSU1NIChydCBmaWVsZCkgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX1JFR0lNTShvcCkgICAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAoMHgxRiA8PCAxNikpCisKK2VudW0geworICAgIE9QQ19CTFRaICAgICA9ICgweDAwIDw8IDE2KSB8IE9QQ19SRUdJTU0sCisgICAgT1BDX0JMVFpMICAgID0gKDB4MDIgPDwgMTYpIHwgT1BDX1JFR0lNTSwKKyAgICBPUENfQkdFWiAgICAgPSAoMHgwMSA8PCAxNikgfCBPUENfUkVHSU1NLAorICAgIE9QQ19CR0VaTCAgICA9ICgweDAzIDw8IDE2KSB8IE9QQ19SRUdJTU0sCisgICAgT1BDX0JMVFpBTCAgID0gKDB4MTAgPDwgMTYpIHwgT1BDX1JFR0lNTSwKKyAgICBPUENfQkxUWkFMTCAgPSAoMHgxMiA8PCAxNikgfCBPUENfUkVHSU1NLAorICAgIE9QQ19CR0VaQUwgICA9ICgweDExIDw8IDE2KSB8IE9QQ19SRUdJTU0sCisgICAgT1BDX0JHRVpBTEwgID0gKDB4MTMgPDwgMTYpIHwgT1BDX1JFR0lNTSwKKyAgICBPUENfVEdFSSAgICAgPSAoMHgwOCA8PCAxNikgfCBPUENfUkVHSU1NLAorICAgIE9QQ19UR0VJVSAgICA9ICgweDA5IDw8IDE2KSB8IE9QQ19SRUdJTU0sCisgICAgT1BDX1RMVEkgICAgID0gKDB4MEEgPDwgMTYpIHwgT1BDX1JFR0lNTSwKKyAgICBPUENfVExUSVUgICAgPSAoMHgwQiA8PCAxNikgfCBPUENfUkVHSU1NLAorICAgIE9QQ19URVFJICAgICA9ICgweDBDIDw8IDE2KSB8IE9QQ19SRUdJTU0sCisgICAgT1BDX1RORUkgICAgID0gKDB4MEUgPDwgMTYpIHwgT1BDX1JFR0lNTSwKKyAgICBPUENfU1lOQ0kgICAgPSAoMHgxRiA8PCAxNikgfCBPUENfUkVHSU1NLAorfTsKKworLyogU3BlY2lhbDIgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX1NQRUNJQUwyKG9wKSAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAweDNGKQorCitlbnVtIHsKKyAgICAvKiBNdWx0aXBseSAmIHh4eCBvcGVyYXRpb25zICovCisgICAgT1BDX01BREQgICAgID0gMHgwMCB8IE9QQ19TUEVDSUFMMiwKKyAgICBPUENfTUFERFUgICAgPSAweDAxIHwgT1BDX1NQRUNJQUwyLAorICAgIE9QQ19NVUwgICAgICA9IDB4MDIgfCBPUENfU1BFQ0lBTDIsCisgICAgT1BDX01TVUIgICAgID0gMHgwNCB8IE9QQ19TUEVDSUFMMiwKKyAgICBPUENfTVNVQlUgICAgPSAweDA1IHwgT1BDX1NQRUNJQUwyLAorICAgIC8qIE1pc2MgKi8KKyAgICBPUENfQ0xaICAgICAgPSAweDIwIHwgT1BDX1NQRUNJQUwyLAorICAgIE9QQ19DTE8gICAgICA9IDB4MjEgfCBPUENfU1BFQ0lBTDIsCisgICAgT1BDX0RDTFogICAgID0gMHgyNCB8IE9QQ19TUEVDSUFMMiwKKyAgICBPUENfRENMTyAgICAgPSAweDI1IHwgT1BDX1NQRUNJQUwyLAorICAgIC8qIFNwZWNpYWwgKi8KKyAgICBPUENfU0RCQlAgICAgPSAweDNGIHwgT1BDX1NQRUNJQUwyLAorfTsKKworLyogU3BlY2lhbDMgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX1NQRUNJQUwzKG9wKSAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAweDNGKQorCitlbnVtIHsKKyAgICBPUENfRVhUICAgICAgPSAweDAwIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ERVhUTSAgICA9IDB4MDEgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RFWFRVICAgID0gMHgwMiB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfREVYVCAgICAgPSAweDAzIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19JTlMgICAgICA9IDB4MDQgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RJTlNNICAgID0gMHgwNSB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfRElOU1UgICAgPSAweDA2IHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ESU5TICAgICA9IDB4MDcgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0ZPUksgICAgID0gMHgwOCB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfWUlFTEQgICAgPSAweDA5IHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19CU0hGTCAgICA9IDB4MjAgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RCU0hGTCAgID0gMHgyNCB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfUkRIV1IgICAgPSAweDNCIHwgT1BDX1NQRUNJQUwzLAorCisgICAgLyogTG9vbmdzb24gMkUgKi8KKyAgICBPUENfTVVMVF9HXzJFICAgPSAweDE4IHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19NVUxUVV9HXzJFICA9IDB4MTkgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RJVl9HXzJFICAgID0gMHgxQSB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfRElWVV9HXzJFICAgPSAweDFCIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ETVVMVF9HXzJFICA9IDB4MUMgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RNVUxUVV9HXzJFID0gMHgxRCB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfRERJVl9HXzJFICAgPSAweDFFIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ERElWVV9HXzJFICA9IDB4MUYgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX01PRF9HXzJFICAgID0gMHgyMiB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfTU9EVV9HXzJFICAgPSAweDIzIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ETU9EX0dfMkUgICA9IDB4MjYgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RNT0RVX0dfMkUgID0gMHgyNyB8IE9QQ19TUEVDSUFMMywKKworICAgIC8qIE1JUFMgRFNQIExvYWQgKi8KKyAgICBPUENfTFhfRFNQICAgICAgICAgPSAweDBBIHwgT1BDX1NQRUNJQUwzLAorICAgIC8qIE1JUFMgRFNQIEFyaXRobWV0aWMgKi8KKyAgICBPUENfQUREVV9RQl9EU1AgICAgPSAweDEwIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19BRERVX09CX0RTUCAgICA9IDB4MTQgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0FCU1FfU19QSF9EU1AgID0gMHgxMiB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfQUJTUV9TX1FIX0RTUCAgPSAweDE2IHwgT1BDX1NQRUNJQUwzLAorICAgIC8qIE9QQ19BRERVSF9RQl9EU1AgaXMgc2FtZSBhcyBPUENfTVVMVF9HXzJFLiAgKi8KKyAgICAvKiBPUENfQUREVUhfUUJfRFNQICAgPSAweDE4IHwgT1BDX1NQRUNJQUwzLCAgKi8KKyAgICBPUENfQ01QVV9FUV9RQl9EU1AgPSAweDExIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19DTVBVX0VRX09CX0RTUCA9IDB4MTUgfCBPUENfU1BFQ0lBTDMsCisgICAgLyogTUlQUyBEU1AgR1BSLUJhc2VkIFNoaWZ0IFN1Yi1jbGFzcyAqLworICAgIE9QQ19TSExMX1FCX0RTUCAgICA9IDB4MTMgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX1NITExfT0JfRFNQICAgID0gMHgxNyB8IE9QQ19TUEVDSUFMMywKKyAgICAvKiBNSVBTIERTUCBNdWx0aXBseSBTdWItY2xhc3MgaW5zbnMgKi8KKyAgICAvKiBPUENfTVVMX1BIX0RTUCBpcyBzYW1lIGFzIE9QQ19BRERVSF9RQl9EU1AuICAqLworICAgIC8qIE9QQ19NVUxfUEhfRFNQICAgICA9IDB4MTggfCBPUENfU1BFQ0lBTDMsICAqLworICAgIE9QQ19EUEFfV19QSF9EU1AgICA9IDB4MzAgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RQQVFfV19RSF9EU1AgID0gMHgzNCB8IE9QQ19TUEVDSUFMMywKKyAgICAvKiBEU1AgQml0L01hbmlwdWxhdGlvbiBTdWItY2xhc3MgKi8KKyAgICBPUENfSU5TVl9EU1AgICAgICAgPSAweDBDIHwgT1BDX1NQRUNJQUwzLAorICAgIE9QQ19ESU5TVl9EU1AgICAgICA9IDB4MEQgfCBPUENfU1BFQ0lBTDMsCisgICAgLyogTUlQUyBEU1AgQXBwZW5kIFN1Yi1jbGFzcyAqLworICAgIE9QQ19BUFBFTkRfRFNQICAgICA9IDB4MzEgfCBPUENfU1BFQ0lBTDMsCisgICAgT1BDX0RBUFBFTkRfRFNQICAgID0gMHgzNSB8IE9QQ19TUEVDSUFMMywKKyAgICAvKiBNSVBTIERTUCBBY2N1bXVsYXRvciBhbmQgRFNQQ29udHJvbCBBY2Nlc3MgU3ViLWNsYXNzICovCisgICAgT1BDX0VYVFJfV19EU1AgICAgID0gMHgzOCB8IE9QQ19TUEVDSUFMMywKKyAgICBPUENfREVYVFJfV19EU1AgICAgPSAweDNDIHwgT1BDX1NQRUNJQUwzLAorfTsKKworLyogQlNIRkwgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX0JTSEZMKG9wKSAgICAgTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkKKworZW51bSB7CisgICAgT1BDX1dTQkggICAgID0gKDB4MDIgPDwgNikgfCBPUENfQlNIRkwsCisgICAgT1BDX1NFQiAgICAgID0gKDB4MTAgPDwgNikgfCBPUENfQlNIRkwsCisgICAgT1BDX1NFSCAgICAgID0gKDB4MTggPDwgNikgfCBPUENfQlNIRkwsCit9OworCisvKiBEQlNIRkwgb3Bjb2RlcyAqLworI2RlZmluZSBNQVNLX0RCU0hGTChvcCkgICAgTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkKKworZW51bSB7CisgICAgT1BDX0RTQkggICAgID0gKDB4MDIgPDwgNikgfCBPUENfREJTSEZMLAorICAgIE9QQ19EU0hEICAgICA9ICgweDA1IDw8IDYpIHwgT1BDX0RCU0hGTCwKK307CisKKy8qIE1JUFMgRFNQIFJFR0lNTSBvcGNvZGVzICovCitlbnVtIHsKKyAgICBPUENfQlBPU0dFMzIgPSAoMHgxQyA8PCAxNikgfCBPUENfUkVHSU1NLAorICAgIE9QQ19CUE9TR0U2NCA9ICgweDFEIDw8IDE2KSB8IE9QQ19SRUdJTU0sCit9OworCisjZGVmaW5lIE1BU0tfTFgob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKKy8qIE1JUFMgRFNQIExvYWQgKi8KK2VudW0geworICAgIE9QQ19MQlVYID0gKDB4MDYgPDwgNikgfCBPUENfTFhfRFNQLAorICAgIE9QQ19MSFggID0gKDB4MDQgPDwgNikgfCBPUENfTFhfRFNQLAorICAgIE9QQ19MV1ggID0gKDB4MDAgPDwgNikgfCBPUENfTFhfRFNQLAorICAgIE9QQ19MRFggPSAoMHgwOCA8PCA2KSB8IE9QQ19MWF9EU1AsCit9OworCisjZGVmaW5lIE1BU0tfQUREVV9RQihvcCkgKE1BU0tfU1BFQ0lBTDMob3ApIHwgKG9wICYgKDB4MUYgPDwgNikpKQorZW51bSB7CisgICAgLyogTUlQUyBEU1AgQXJpdGhtZXRpYyBTdWItY2xhc3MgKi8KKyAgICBPUENfQUREUV9QSCAgICAgICAgPSAoMHgwQSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREUV9TX1BIICAgICAgPSAoMHgwRSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREUV9TX1cgICAgICAgPSAoMHgxNiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREVV9RQiAgICAgICAgPSAoMHgwMCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREVV9TX1FCICAgICAgPSAoMHgwNCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREVV9QSCAgICAgICAgPSAoMHgwOCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREVV9TX1BIICAgICAgPSAoMHgwQyA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCUV9QSCAgICAgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCUV9TX1BIICAgICAgPSAoMHgwRiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCUV9TX1cgICAgICAgPSAoMHgxNyA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCVV9RQiAgICAgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCVV9TX1FCICAgICAgPSAoMHgwNSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCVV9QSCAgICAgICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfU1VCVV9TX1BIICAgICAgPSAoMHgwRCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREU0MgICAgICAgICAgPSAoMHgxMCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfQUREV0MgICAgICAgICAgPSAoMHgxMSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTU9EU1VCICAgICAgICAgPSAoMHgxMiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfUkFERFVfV19RQiAgICAgPSAoMHgxNCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICAvKiBNSVBTIERTUCBNdWx0aXBseSBTdWItY2xhc3MgaW5zbnMgKi8KKyAgICBPUENfTVVMRVVfU19QSF9RQkwgPSAoMHgwNiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTVVMRVVfU19QSF9RQlIgPSAoMHgwNyA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTVVMUV9SU19QSCAgICAgPSAoMHgxRiA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTVVMRVFfU19XX1BITCAgPSAoMHgxQyA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTVVMRVFfU19XX1BIUiAgPSAoMHgxRCA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKKyAgICBPUENfTVVMUV9TX1BIICAgICAgPSAoMHgxRSA8PCA2KSB8IE9QQ19BRERVX1FCX0RTUCwKK307CisKKyNkZWZpbmUgT1BDX0FERFVIX1FCX0RTUCBPUENfTVVMVF9HXzJFCisjZGVmaW5lIE1BU0tfQUREVUhfUUIob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIE1JUFMgRFNQIEFyaXRobWV0aWMgU3ViLWNsYXNzICovCisgICAgT1BDX0FERFVIX1FCICAgPSAoMHgwMCA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX0FERFVIX1JfUUIgPSAoMHgwMiA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX0FERFFIX1BIICAgPSAoMHgwOCA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX0FERFFIX1JfUEggPSAoMHgwQSA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX0FERFFIX1cgICAgPSAoMHgxMCA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX0FERFFIX1JfVyAgPSAoMHgxMiA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlVIX1FCICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlVIX1JfUUIgPSAoMHgwMyA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlFIX1BIICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlFIX1JfUEggPSAoMHgwQiA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlFIX1cgICAgPSAoMHgxMSA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX1NVQlFIX1JfVyAgPSAoMHgxMyA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgLyogTUlQUyBEU1AgTXVsdGlwbHkgU3ViLWNsYXNzIGluc25zICovCisgICAgT1BDX01VTF9QSCAgICAgPSAoMHgwQyA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX01VTF9TX1BIICAgPSAoMHgwRSA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX01VTFFfU19XICAgPSAoMHgxNiA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCisgICAgT1BDX01VTFFfUlNfVyAgPSAoMHgxNyA8PCA2KSB8IE9QQ19BRERVSF9RQl9EU1AsCit9OworCisjZGVmaW5lIE1BU0tfQUJTUV9TX1BIKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBNSVBTIERTUCBBcml0aG1ldGljIFN1Yi1jbGFzcyAqLworICAgIE9QQ19BQlNRX1NfUUIgICAgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19BQlNRX1NfUEggICAgICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19BQlNRX1NfVyAgICAgICAgPSAoMHgxMSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFfV19QSEwgICAgPSAoMHgwQyA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFfV19QSFIgICAgPSAoMHgwRCA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1BIX1FCTCAgPSAoMHgwNCA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1BIX1FCUiAgPSAoMHgwNSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1BIX1FCTEEgPSAoMHgwNiA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1BIX1FCUkEgPSAoMHgwNyA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVVfUEhfUUJMICAgPSAoMHgxQyA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVVfUEhfUUJSICAgPSAoMHgxRCA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVVfUEhfUUJMQSAgPSAoMHgxRSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19QUkVDRVVfUEhfUUJSQSAgPSAoMHgxRiA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIC8qIERTUCBCaXQvTWFuaXB1bGF0aW9uIFN1Yi1jbGFzcyAqLworICAgIE9QQ19CSVRSRVYgICAgICAgICAgPSAoMHgxQiA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19SRVBMX1FCICAgICAgICAgPSAoMHgwMiA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19SRVBMVl9RQiAgICAgICAgPSAoMHgwMyA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19SRVBMX1BIICAgICAgICAgPSAoMHgwQSA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorICAgIE9QQ19SRVBMVl9QSCAgICAgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19BQlNRX1NfUEhfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0NNUFVfRVFfUUIob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIE1JUFMgRFNQIEFyaXRobWV0aWMgU3ViLWNsYXNzICovCisgICAgT1BDX1BSRUNSX1FCX1BIICAgICAgPSAoMHgwRCA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfUFJFQ1JRX1FCX1BIICAgICA9ICgweDBDIDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19QUkVDUl9TUkFfUEhfVyAgID0gKDB4MUUgPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX1BSRUNSX1NSQV9SX1BIX1cgPSAoMHgxRiA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfUFJFQ1JRX1BIX1cgICAgICA9ICgweDE0IDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19QUkVDUlFfUlNfUEhfVyAgID0gKDB4MTUgPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX1BSRUNSUVVfU19RQl9QSCAgPSAoMHgwRiA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICAvKiBEU1AgQ29tcGFyZS1QaWNrIFN1Yi1jbGFzcyAqLworICAgIE9QQ19DTVBVX0VRX1FCICAgICAgID0gKDB4MDAgPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX0NNUFVfTFRfUUIgICAgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfQ01QVV9MRV9RQiAgICAgICA9ICgweDAyIDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19DTVBHVV9FUV9RQiAgICAgID0gKDB4MDQgPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX0NNUEdVX0xUX1FCICAgICAgPSAoMHgwNSA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfQ01QR1VfTEVfUUIgICAgICA9ICgweDA2IDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19DTVBHRFVfRVFfUUIgICAgID0gKDB4MTggPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX0NNUEdEVV9MVF9RQiAgICAgPSAoMHgxOSA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfQ01QR0RVX0xFX1FCICAgICA9ICgweDFBIDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19DTVBfRVFfUEggICAgICAgID0gKDB4MDggPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX0NNUF9MVF9QSCAgICAgICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfQ01QX0xFX1BIICAgICAgICA9ICgweDBBIDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorICAgIE9QQ19QSUNLX1FCICAgICAgICAgID0gKDB4MDMgPDwgNikgfCBPUENfQ01QVV9FUV9RQl9EU1AsCisgICAgT1BDX1BJQ0tfUEggICAgICAgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19DTVBVX0VRX1FCX0RTUCwKKyAgICBPUENfUEFDS1JMX1BIICAgICAgICA9ICgweDBFIDw8IDYpIHwgT1BDX0NNUFVfRVFfUUJfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX1NITExfUUIob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIE1JUFMgRFNQIEdQUi1CYXNlZCBTaGlmdCBTdWItY2xhc3MgKi8KKyAgICBPUENfU0hMTF9RQiAgICA9ICgweDAwIDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSExMVl9RQiAgID0gKDB4MDIgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NITExfUEggICAgPSAoMHgwOCA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hMTFZfUEggICA9ICgweDBBIDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSExMX1NfUEggID0gKDB4MEMgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NITExWX1NfUEggPSAoMHgwRSA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hMTF9TX1cgICA9ICgweDE0IDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSExMVl9TX1cgID0gKDB4MTYgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NIUkxfUUIgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hSTFZfUUIgICA9ICgweDAzIDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSFJMX1BIICAgID0gKDB4MTkgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NIUkxWX1BIICAgPSAoMHgxQiA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hSQV9RQiAgICA9ICgweDA0IDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSFJBX1JfUUIgID0gKDB4MDUgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NIUkFWX1FCICAgPSAoMHgwNiA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hSQVZfUl9RQiA9ICgweDA3IDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSFJBX1BIICAgID0gKDB4MDkgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NIUkFWX1BIICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hSQV9SX1BIICA9ICgweDBEIDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorICAgIE9QQ19TSFJBVl9SX1BIID0gKDB4MEYgPDwgNikgfCBPUENfU0hMTF9RQl9EU1AsCisgICAgT1BDX1NIUkFfUl9XICAgPSAoMHgxNSA8PCA2KSB8IE9QQ19TSExMX1FCX0RTUCwKKyAgICBPUENfU0hSQVZfUl9XICA9ICgweDE3IDw8IDYpIHwgT1BDX1NITExfUUJfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0RQQV9XX1BIKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBNSVBTIERTUCBNdWx0aXBseSBTdWItY2xhc3MgaW5zbnMgKi8KKyAgICBPUENfRFBBVV9IX1FCTCAgICA9ICgweDAzIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBVV9IX1FCUiAgICA9ICgweDA3IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTVV9IX1FCTCAgICA9ICgweDBCIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTVV9IX1FCUiAgICA9ICgweDBGIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBX1dfUEggICAgICA9ICgweDAwIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBWF9XX1BIICAgICA9ICgweDA4IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBUV9TX1dfUEggICA9ICgweDA0IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBUVhfU19XX1BIICA9ICgweDE4IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBUVhfU0FfV19QSCA9ICgweDFBIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTX1dfUEggICAgICA9ICgweDAxIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTWF9XX1BIICAgICA9ICgweDA5IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTUV9TX1dfUEggICA9ICgweDA1IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTUVhfU19XX1BIICA9ICgweDE5IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTUVhfU0FfV19QSCA9ICgweDFCIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTVVMU0FRX1NfV19QSCA9ICgweDA2IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBBUV9TQV9MX1cgICA9ICgweDBDIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfRFBTUV9TQV9MX1cgICA9ICgweDBEIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTUFRX1NfV19QSEwgICA9ICgweDE0IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTUFRX1NfV19QSFIgICA9ICgweDE2IDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTUFRX1NBX1dfUEhMICA9ICgweDEwIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTUFRX1NBX1dfUEhSICA9ICgweDEyIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKKyAgICBPUENfTVVMU0FfV19QSCAgICA9ICgweDAyIDw8IDYpIHwgT1BDX0RQQV9XX1BIX0RTUCwKK307CisKKyNkZWZpbmUgTUFTS19JTlNWKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBEU1AgQml0L01hbmlwdWxhdGlvbiBTdWItY2xhc3MgKi8KKyAgICBPUENfSU5TViA9ICgweDAwIDw8IDYpIHwgT1BDX0lOU1ZfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0FQUEVORChvcCkgKE1BU0tfU1BFQ0lBTDMob3ApIHwgKG9wICYgKDB4MUYgPDwgNikpKQorZW51bSB7CisgICAgLyogTUlQUyBEU1AgQXBwZW5kIFN1Yi1jbGFzcyAqLworICAgIE9QQ19BUFBFTkQgID0gKDB4MDAgPDwgNikgfCBPUENfQVBQRU5EX0RTUCwKKyAgICBPUENfUFJFUEVORCA9ICgweDAxIDw8IDYpIHwgT1BDX0FQUEVORF9EU1AsCisgICAgT1BDX0JBTElHTiAgPSAoMHgxMCA8PCA2KSB8IE9QQ19BUFBFTkRfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0VYVFJfVyhvcCkgKE1BU0tfU1BFQ0lBTDMob3ApIHwgKG9wICYgKDB4MUYgPDwgNikpKQorZW51bSB7CisgICAgLyogTUlQUyBEU1AgQWNjdW11bGF0b3IgYW5kIERTUENvbnRyb2wgQWNjZXNzIFN1Yi1jbGFzcyAqLworICAgIE9QQ19FWFRSX1cgICAgID0gKDB4MDAgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfRVhUUl9SX1cgICA9ICgweDA0IDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCisgICAgT1BDX0VYVFJfUlNfVyAgPSAoMHgwNiA8PCA2KSB8IE9QQ19FWFRSX1dfRFNQLAorICAgIE9QQ19FWFRSX1NfSCAgID0gKDB4MEUgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfRVhUUlZfU19IICA9ICgweDBGIDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCisgICAgT1BDX0VYVFJWX1cgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19FWFRSX1dfRFNQLAorICAgIE9QQ19FWFRSVl9SX1cgID0gKDB4MDUgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfRVhUUlZfUlNfVyA9ICgweDA3IDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCisgICAgT1BDX0VYVFAgICAgICAgPSAoMHgwMiA8PCA2KSB8IE9QQ19FWFRSX1dfRFNQLAorICAgIE9QQ19FWFRQViAgICAgID0gKDB4MDMgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfRVhUUERQICAgICA9ICgweDBBIDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCisgICAgT1BDX0VYVFBEUFYgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19FWFRSX1dfRFNQLAorICAgIE9QQ19TSElMTyAgICAgID0gKDB4MUEgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfU0hJTE9WICAgICA9ICgweDFCIDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCisgICAgT1BDX01USExJUCAgICAgPSAoMHgxRiA8PCA2KSB8IE9QQ19FWFRSX1dfRFNQLAorICAgIE9QQ19XUkRTUCAgICAgID0gKDB4MTMgPDwgNikgfCBPUENfRVhUUl9XX0RTUCwKKyAgICBPUENfUkREU1AgICAgICA9ICgweDEyIDw8IDYpIHwgT1BDX0VYVFJfV19EU1AsCit9OworCisjZGVmaW5lIE1BU0tfQUJTUV9TX1FIKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBNSVBTIERTUCBBcml0aG1ldGljIFN1Yi1jbGFzcyAqLworICAgIE9QQ19QUkVDRVFfTF9QV0wgICAgPSAoMHgxNCA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFfTF9QV1IgICAgPSAoMHgxNSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFfUFdfUUhMICAgPSAoMHgwQyA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFfUFdfUUhSICAgPSAoMHgwRCA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFfUFdfUUhMQSAgPSAoMHgwRSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFfUFdfUUhSQSAgPSAoMHgwRiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1FIX09CTCAgPSAoMHgwNCA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1FIX09CUiAgPSAoMHgwNSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1FIX09CTEEgPSAoMHgwNiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVFVX1FIX09CUkEgPSAoMHgwNyA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVVfUUhfT0JMICAgPSAoMHgxQyA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVVfUUhfT0JSICAgPSAoMHgxRCA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVVfUUhfT0JMQSAgPSAoMHgxRSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19QUkVDRVVfUUhfT0JSQSAgPSAoMHgxRiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19BQlNRX1NfT0IgICAgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19BQlNRX1NfUFcgICAgICAgPSAoMHgxMSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19BQlNRX1NfUUggICAgICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIC8qIERTUCBCaXQvTWFuaXB1bGF0aW9uIFN1Yi1jbGFzcyAqLworICAgIE9QQ19SRVBMX09CICAgICAgICAgPSAoMHgwMiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19SRVBMX1BXICAgICAgICAgPSAoMHgxMiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19SRVBMX1FIICAgICAgICAgPSAoMHgwQSA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19SRVBMVl9PQiAgICAgICAgPSAoMHgwMyA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19SRVBMVl9QVyAgICAgICAgPSAoMHgxMyA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorICAgIE9QQ19SRVBMVl9RSCAgICAgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19BQlNRX1NfUUhfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0FERFVfT0Iob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIE1JUFMgRFNQIE11bHRpcGx5IFN1Yi1jbGFzcyBpbnNucyAqLworICAgIE9QQ19NVUxFUV9TX1BXX1FITCA9ICgweDFDIDw8IDYpIHwgT1BDX0FERFVfT0JfRFNQLAorICAgIE9QQ19NVUxFUV9TX1BXX1FIUiA9ICgweDFEIDw8IDYpIHwgT1BDX0FERFVfT0JfRFNQLAorICAgIE9QQ19NVUxFVV9TX1FIX09CTCA9ICgweDA2IDw8IDYpIHwgT1BDX0FERFVfT0JfRFNQLAorICAgIE9QQ19NVUxFVV9TX1FIX09CUiA9ICgweDA3IDw8IDYpIHwgT1BDX0FERFVfT0JfRFNQLAorICAgIE9QQ19NVUxRX1JTX1FIICAgICA9ICgweDFGIDw8IDYpIHwgT1BDX0FERFVfT0JfRFNQLAorICAgIC8qIE1JUFMgRFNQIEFyaXRobWV0aWMgU3ViLWNsYXNzICovCisgICAgT1BDX1JBRERVX0xfT0IgICAgID0gKDB4MTQgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlFfUFcgICAgICAgID0gKDB4MTMgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlFfU19QVyAgICAgID0gKDB4MTcgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlFfUUggICAgICAgID0gKDB4MEIgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlFfU19RSCAgICAgID0gKDB4MEYgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVfT0IgICAgICAgID0gKDB4MDEgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVfU19PQiAgICAgID0gKDB4MDUgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVfUUggICAgICAgID0gKDB4MDkgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVfU19RSCAgICAgID0gKDB4MEQgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVIX09CICAgICAgID0gKDB4MTkgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX1NVQlVIX1JfT0IgICAgID0gKDB4MUIgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFFfUFcgICAgICAgID0gKDB4MTIgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFFfU19QVyAgICAgID0gKDB4MTYgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFFfUUggICAgICAgID0gKDB4MEEgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFFfU19RSCAgICAgID0gKDB4MEUgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVfT0IgICAgICAgID0gKDB4MDAgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVfU19PQiAgICAgID0gKDB4MDQgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVfUUggICAgICAgID0gKDB4MDggPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVfU19RSCAgICAgID0gKDB4MEMgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVIX09CICAgICAgID0gKDB4MTggPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCisgICAgT1BDX0FERFVIX1JfT0IgICAgID0gKDB4MUEgPDwgNikgfCBPUENfQUREVV9PQl9EU1AsCit9OworCisjZGVmaW5lIE1BU0tfQ01QVV9FUV9PQihvcCkgKE1BU0tfU1BFQ0lBTDMob3ApIHwgKG9wICYgKDB4MUYgPDwgNikpKQorZW51bSB7CisgICAgLyogRFNQIEFwcGVuZCBTdWItY2xhc3MgKi8KKyAgICBPUENfQ01QX0VRX1BXICAgICAgICAgPSAoMHgxMCA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QX0xUX1BXICAgICAgICAgPSAoMHgxMSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QX0xFX1BXICAgICAgICAgPSAoMHgxMiA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QX0VRX1FIICAgICAgICAgPSAoMHgwOCA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QX0xUX1FIICAgICAgICAgPSAoMHgwOSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QX0xFX1FIICAgICAgICAgPSAoMHgwQSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR0RVX0VRX09CICAgICAgPSAoMHgxOCA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR0RVX0xUX09CICAgICAgPSAoMHgxOSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR0RVX0xFX09CICAgICAgPSAoMHgxQSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR1VfRVFfT0IgICAgICAgPSAoMHgwNCA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR1VfTFRfT0IgICAgICAgPSAoMHgwNSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QR1VfTEVfT0IgICAgICAgPSAoMHgwNiA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QVV9FUV9PQiAgICAgICAgPSAoMHgwMCA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QVV9MVF9PQiAgICAgICAgPSAoMHgwMSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfQ01QVV9MRV9PQiAgICAgICAgPSAoMHgwMiA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfUEFDS1JMX1BXICAgICAgICAgPSAoMHgwRSA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfUElDS19PQiAgICAgICAgICAgPSAoMHgwMyA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfUElDS19QVyAgICAgICAgICAgPSAoMHgxMyA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICBPUENfUElDS19RSCAgICAgICAgICAgPSAoMHgwQiA8PCA2KSB8IE9QQ19DTVBVX0VRX09CX0RTUCwKKyAgICAvKiBNSVBTIERTUCBBcml0aG1ldGljIFN1Yi1jbGFzcyAqLworICAgIE9QQ19QUkVDUl9PQl9RSCAgICAgICA9ICgweDBEIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUl9TUkFfUUhfUFcgICA9ICgweDFFIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUl9TUkFfUl9RSF9QVyA9ICgweDFGIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUlFfT0JfUUggICAgICA9ICgweDBDIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUlFfUFdfTCAgICAgICA9ICgweDFDIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUlFfUUhfUFcgICAgICA9ICgweDE0IDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUlFfUlNfUUhfUFcgICA9ICgweDE1IDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorICAgIE9QQ19QUkVDUlFVX1NfT0JfUUggICA9ICgweDBGIDw8IDYpIHwgT1BDX0NNUFVfRVFfT0JfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0RBUFBFTkQob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIERTUCBDb21wYXJlLVBpY2sgU3ViLWNsYXNzICovCisgICAgT1BDX0RBUFBFTkQgID0gKDB4MDAgPDwgNikgfCBPUENfREFQUEVORF9EU1AsCisgICAgT1BDX1BSRVBFTkREID0gKDB4MDMgPDwgNikgfCBPUENfREFQUEVORF9EU1AsCisgICAgT1BDX1BSRVBFTkRXID0gKDB4MDEgPDwgNikgfCBPUENfREFQUEVORF9EU1AsCisgICAgT1BDX0RCQUxJR04gID0gKDB4MTAgPDwgNikgfCBPUENfREFQUEVORF9EU1AsCit9OworCisjZGVmaW5lIE1BU0tfREVYVFJfVyhvcCkgKE1BU0tfU1BFQ0lBTDMob3ApIHwgKG9wICYgKDB4MUYgPDwgNikpKQorZW51bSB7CisgICAgLyogTUlQUyBEU1AgQWNjdW11bGF0b3IgYW5kIERTUENvbnRyb2wgQWNjZXNzIFN1Yi1jbGFzcyAqLworICAgIE9QQ19ETVRITElQICAgICA9ICgweDFGIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19EU0hJTE8gICAgICA9ICgweDFBIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUCAgICAgICA9ICgweDAyIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUERQICAgICA9ICgweDBBIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUERQViAgICA9ICgweDBCIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUFYgICAgICA9ICgweDAzIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9MICAgICA9ICgweDEwIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9SX0wgICA9ICgweDE0IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9SU19MICA9ICgweDE2IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9XICAgICA9ICgweDAwIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9SX1cgICA9ICgweDA0IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9SU19XICA9ICgweDA2IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUl9TX0ggICA9ICgweDBFIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfTCAgICA9ICgweDExIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfUl9MICA9ICgweDE1IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfUlNfTCA9ICgweDE3IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfU19IICA9ICgweDBGIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfVyAgICA9ICgweDAxIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfUl9XICA9ICgweDA1IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19ERVhUUlZfUlNfVyA9ICgweDA3IDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorICAgIE9QQ19EU0hJTE9WICAgICA9ICgweDFCIDw8IDYpIHwgT1BDX0RFWFRSX1dfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX0RJTlNWKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBEU1AgQml0L01hbmlwdWxhdGlvbiBTdWItY2xhc3MgKi8KKyAgICBPUENfRElOU1YgPSAoMHgwMCA8PCA2KSB8IE9QQ19ESU5TVl9EU1AsCit9OworCisjZGVmaW5lIE1BU0tfRFBBUV9XX1FIKG9wKSAoTUFTS19TUEVDSUFMMyhvcCkgfCAob3AgJiAoMHgxRiA8PCA2KSkpCitlbnVtIHsKKyAgICAvKiBNSVBTIERTUCBNdWx0aXBseSBTdWItY2xhc3MgaW5zbnMgKi8KKyAgICBPUENfRE1BREQgICAgICAgICA9ICgweDE5IDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX0RNQUREVSAgICAgICAgPSAoMHgxRCA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19ETVNVQiAgICAgICAgID0gKDB4MUIgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfRE1TVUJVICAgICAgICA9ICgweDFGIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX0RQQV9XX1FIICAgICAgPSAoMHgwMCA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19EUEFRX1NfV19RSCAgID0gKDB4MDQgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfRFBBUV9TQV9MX1BXICA9ICgweDBDIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX0RQQVVfSF9PQkwgICAgPSAoMHgwMyA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19EUEFVX0hfT0JSICAgID0gKDB4MDcgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfRFBTX1dfUUggICAgICA9ICgweDAxIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX0RQU1FfU19XX1FIICAgPSAoMHgwNSA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19EUFNRX1NBX0xfUFcgID0gKDB4MEQgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfRFBTVV9IX09CTCAgICA9ICgweDBCIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX0RQU1VfSF9PQlIgICAgPSAoMHgwRiA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19NQVFfU19MX1BXTCAgID0gKDB4MUMgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfTUFRX1NfTF9QV1IgICA9ICgweDFFIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX01BUV9TX1dfUUhMTCAgPSAoMHgxNCA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19NQVFfU0FfV19RSExMID0gKDB4MTAgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfTUFRX1NfV19RSExSICA9ICgweDE1IDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX01BUV9TQV9XX1FITFIgPSAoMHgxMSA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19NQVFfU19XX1FIUkwgID0gKDB4MTYgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfTUFRX1NBX1dfUUhSTCA9ICgweDEyIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX01BUV9TX1dfUUhSUiAgPSAoMHgxNyA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorICAgIE9QQ19NQVFfU0FfV19RSFJSID0gKDB4MTMgPDwgNikgfCBPUENfRFBBUV9XX1FIX0RTUCwKKyAgICBPUENfTVVMU0FRX1NfTF9QVyA9ICgweDBFIDw8IDYpIHwgT1BDX0RQQVFfV19RSF9EU1AsCisgICAgT1BDX01VTFNBUV9TX1dfUUggPSAoMHgwNiA8PCA2KSB8IE9QQ19EUEFRX1dfUUhfRFNQLAorfTsKKworI2RlZmluZSBNQVNLX1NITExfT0Iob3ApIChNQVNLX1NQRUNJQUwzKG9wKSB8IChvcCAmICgweDFGIDw8IDYpKSkKK2VudW0geworICAgIC8qIE1JUFMgRFNQIEdQUi1CYXNlZCBTaGlmdCBTdWItY2xhc3MgKi8KKyAgICBPUENfU0hMTF9QVyAgICA9ICgweDEwIDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSExMX1NfUFcgID0gKDB4MTQgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NITExWX09CICAgPSAoMHgwMiA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hMTFZfUFcgICA9ICgweDEyIDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSExMVl9TX1BXID0gKDB4MTYgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NITExWX1FIICAgPSAoMHgwQSA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hMTFZfU19RSCA9ICgweDBFIDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJBX1BXICAgID0gKDB4MTEgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NIUkFfUl9QVyAgPSAoMHgxNSA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hSQVZfT0IgICA9ICgweDA2IDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJBVl9SX09CID0gKDB4MDcgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NIUkFWX1BXICAgPSAoMHgxMyA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hSQVZfUl9QVyA9ICgweDE3IDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJBVl9RSCAgID0gKDB4MEIgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NIUkFWX1JfUUggPSAoMHgwRiA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hSTFZfT0IgICA9ICgweDAzIDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJMVl9RSCAgID0gKDB4MUIgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NITExfT0IgICAgPSAoMHgwMCA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hMTF9RSCAgICA9ICgweDA4IDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSExMX1NfUUggID0gKDB4MEMgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NIUkFfT0IgICAgPSAoMHgwNCA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hSQV9SX09CICA9ICgweDA1IDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJBX1FIICAgID0gKDB4MDkgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCisgICAgT1BDX1NIUkFfUl9RSCAgPSAoMHgwRCA8PCA2KSB8IE9QQ19TSExMX09CX0RTUCwKKyAgICBPUENfU0hSTF9PQiAgICA9ICgweDAxIDw8IDYpIHwgT1BDX1NITExfT0JfRFNQLAorICAgIE9QQ19TSFJMX1FIICAgID0gKDB4MTkgPDwgNikgfCBPUENfU0hMTF9PQl9EU1AsCit9OworCisvKiBDb3Byb2Nlc3NvciAwIChycyBmaWVsZCkgKi8KKyNkZWZpbmUgTUFTS19DUDAob3ApICAgICAgIE1BU0tfT1BfTUFKT1Iob3ApIHwgKG9wICYgKDB4MUYgPDwgMjEpKQorCitlbnVtIHsKKyAgICBPUENfTUZDMCAgICAgPSAoMHgwMCA8PCAyMSkgfCBPUENfQ1AwLAorICAgIE9QQ19ETUZDMCAgICA9ICgweDAxIDw8IDIxKSB8IE9QQ19DUDAsCisgICAgT1BDX01UQzAgICAgID0gKDB4MDQgPDwgMjEpIHwgT1BDX0NQMCwKKyAgICBPUENfRE1UQzAgICAgPSAoMHgwNSA8PCAyMSkgfCBPUENfQ1AwLAorICAgIE9QQ19NRlRSICAgICA9ICgweDA4IDw8IDIxKSB8IE9QQ19DUDAsCisgICAgT1BDX1JEUEdQUiAgID0gKDB4MEEgPDwgMjEpIHwgT1BDX0NQMCwKKyAgICBPUENfTUZNQzAgICAgPSAoMHgwQiA8PCAyMSkgfCBPUENfQ1AwLAorICAgIE9QQ19NVFRSICAgICA9ICgweDBDIDw8IDIxKSB8IE9QQ19DUDAsCisgICAgT1BDX1dSUEdQUiAgID0gKDB4MEUgPDwgMjEpIHwgT1BDX0NQMCwKKyAgICBPUENfQzAgICAgICAgPSAoMHgxMCA8PCAyMSkgfCBPUENfQ1AwLAorICAgIE9QQ19DMF9GSVJTVCA9ICgweDEwIDw8IDIxKSB8IE9QQ19DUDAsCisgICAgT1BDX0MwX0xBU1QgID0gKDB4MUYgPDwgMjEpIHwgT1BDX0NQMCwKK307CisKKy8qIE1GTUMwIG9wY29kZXMgKi8KKyNkZWZpbmUgTUFTS19NRk1DMChvcCkgICAgIE1BU0tfQ1AwKG9wKSB8IChvcCAmIDB4RkZGRikKKworZW51bSB7CisgICAgT1BDX0RNVCAgICAgID0gMHgwMSB8ICgwIDw8IDUpIHwgKDB4MEYgPDwgNikgfCAoMHgwMSA8PCAxMSkgfCBPUENfTUZNQzAsCisgICAgT1BDX0VNVCAgICAgID0gMHgwMSB8ICgxIDw8IDUpIHwgKDB4MEYgPDwgNikgfCAoMHgwMSA8PCAxMSkgfCBPUENfTUZNQzAsCisgICAgT1BDX0RWUEUgICAgID0gMHgwMSB8ICgwIDw8IDUpIHwgT1BDX01GTUMwLAorICAgIE9QQ19FVlBFICAgICA9IDB4MDEgfCAoMSA8PCA1KSB8IE9QQ19NRk1DMCwKKyAgICBPUENfREkgICAgICAgPSAoMCA8PCA1KSB8ICgweDBDIDw8IDExKSB8IE9QQ19NRk1DMCwKKyAgICBPUENfRUkgICAgICAgPSAoMSA8PCA1KSB8ICgweDBDIDw8IDExKSB8IE9QQ19NRk1DMCwKK307CisKKy8qIENvcHJvY2Vzc29yIDAgKHdpdGggcnMgPT0gQzApICovCisjZGVmaW5lIE1BU0tfQzAob3ApICAgICAgICBNQVNLX0NQMChvcCkgfCAob3AgJiAweDNGKQorCitlbnVtIHsKKyAgICBPUENfVExCUiAgICAgPSAweDAxIHwgT1BDX0MwLAorICAgIE9QQ19UTEJXSSAgICA9IDB4MDIgfCBPUENfQzAsCisgICAgT1BDX1RMQldSICAgID0gMHgwNiB8IE9QQ19DMCwKKyAgICBPUENfVExCUCAgICAgPSAweDA4IHwgT1BDX0MwLAorICAgIE9QQ19SRkUgICAgICA9IDB4MTAgfCBPUENfQzAsCisgICAgT1BDX0VSRVQgICAgID0gMHgxOCB8IE9QQ19DMCwKKyAgICBPUENfREVSRVQgICAgPSAweDFGIHwgT1BDX0MwLAorICAgIE9QQ19XQUlUICAgICA9IDB4MjAgfCBPUENfQzAsCit9OworCisvKiBDb3Byb2Nlc3NvciAxIChycyBmaWVsZCkgKi8KKyNkZWZpbmUgTUFTS19DUDEob3ApICAgICAgIE1BU0tfT1BfTUFKT1Iob3ApIHwgKG9wICYgKDB4MUYgPDwgMjEpKQorCitlbnVtIHsKKyAgICBPUENfTUZDMSAgICAgPSAoMHgwMCA8PCAyMSkgfCBPUENfQ1AxLAorICAgIE9QQ19ETUZDMSAgICA9ICgweDAxIDw8IDIxKSB8IE9QQ19DUDEsCisgICAgT1BDX0NGQzEgICAgID0gKDB4MDIgPDwgMjEpIHwgT1BDX0NQMSwKKyAgICBPUENfTUZIQzEgICAgPSAoMHgwMyA8PCAyMSkgfCBPUENfQ1AxLAorICAgIE9QQ19NVEMxICAgICA9ICgweDA0IDw8IDIxKSB8IE9QQ19DUDEsCisgICAgT1BDX0RNVEMxICAgID0gKDB4MDUgPDwgMjEpIHwgT1BDX0NQMSwKKyAgICBPUENfQ1RDMSAgICAgPSAoMHgwNiA8PCAyMSkgfCBPUENfQ1AxLAorICAgIE9QQ19NVEhDMSAgICA9ICgweDA3IDw8IDIxKSB8IE9QQ19DUDEsCisgICAgT1BDX0JDMSAgICAgID0gKDB4MDggPDwgMjEpIHwgT1BDX0NQMSwgLyogYmMgKi8KKyAgICBPUENfQkMxQU5ZMiAgPSAoMHgwOSA8PCAyMSkgfCBPUENfQ1AxLAorICAgIE9QQ19CQzFBTlk0ICA9ICgweDBBIDw8IDIxKSB8IE9QQ19DUDEsCisgICAgT1BDX1NfRk1UICAgID0gKDB4MTAgPDwgMjEpIHwgT1BDX0NQMSwgLyogMTY6IGZtdD1zaW5nbGUgZnAgKi8KKyAgICBPUENfRF9GTVQgICAgPSAoMHgxMSA8PCAyMSkgfCBPUENfQ1AxLCAvKiAxNzogZm10PWRvdWJsZSBmcCAqLworICAgIE9QQ19FX0ZNVCAgICA9ICgweDEyIDw8IDIxKSB8IE9QQ19DUDEsIC8qIDE4OiBmbXQ9ZXh0ZW5kZWQgZnAgKi8KKyAgICBPUENfUV9GTVQgICAgPSAoMHgxMyA8PCAyMSkgfCBPUENfQ1AxLCAvKiAxOTogZm10PXF1YWQgZnAgKi8KKyAgICBPUENfV19GTVQgICAgPSAoMHgxNCA8PCAyMSkgfCBPUENfQ1AxLCAvKiAyMDogZm10PTMyYml0IGZpeGVkICovCisgICAgT1BDX0xfRk1UICAgID0gKDB4MTUgPDwgMjEpIHwgT1BDX0NQMSwgLyogMjE6IGZtdD02NGJpdCBmaXhlZCAqLworICAgIE9QQ19QU19GTVQgICA9ICgweDE2IDw8IDIxKSB8IE9QQ19DUDEsIC8qIDIyOiBmbXQ9cGFpcmVkIHNpbmdsZSBmcCAqLworfTsKKworI2RlZmluZSBNQVNLX0NQMV9GVU5DKG9wKSAgICAgICBNQVNLX0NQMShvcCkgfCAob3AgJiAweDNGKQorI2RlZmluZSBNQVNLX0JDMShvcCkgICAgICAgICAgICBNQVNLX0NQMShvcCkgfCAob3AgJiAoMHgzIDw8IDE2KSkKKworZW51bSB7CisgICAgT1BDX0JDMUYgICAgID0gKDB4MDAgPDwgMTYpIHwgT1BDX0JDMSwKKyAgICBPUENfQkMxVCAgICAgPSAoMHgwMSA8PCAxNikgfCBPUENfQkMxLAorICAgIE9QQ19CQzFGTCAgICA9ICgweDAyIDw8IDE2KSB8IE9QQ19CQzEsCisgICAgT1BDX0JDMVRMICAgID0gKDB4MDMgPDwgMTYpIHwgT1BDX0JDMSwKK307CisKK2VudW0geworICAgIE9QQ19CQzFGQU5ZMiAgICAgPSAoMHgwMCA8PCAxNikgfCBPUENfQkMxQU5ZMiwKKyAgICBPUENfQkMxVEFOWTIgICAgID0gKDB4MDEgPDwgMTYpIHwgT1BDX0JDMUFOWTIsCit9OworCitlbnVtIHsKKyAgICBPUENfQkMxRkFOWTQgICAgID0gKDB4MDAgPDwgMTYpIHwgT1BDX0JDMUFOWTQsCisgICAgT1BDX0JDMVRBTlk0ICAgICA9ICgweDAxIDw8IDE2KSB8IE9QQ19CQzFBTlk0LAorfTsKKworI2RlZmluZSBNQVNLX0NQMihvcCkgICAgICAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAoMHgxRiA8PCAyMSkpCisKK2VudW0geworICAgIE9QQ19NRkMyICAgID0gKDB4MDAgPDwgMjEpIHwgT1BDX0NQMiwKKyAgICBPUENfRE1GQzIgICA9ICgweDAxIDw8IDIxKSB8IE9QQ19DUDIsCisgICAgT1BDX0NGQzIgICAgPSAoMHgwMiA8PCAyMSkgfCBPUENfQ1AyLAorICAgIE9QQ19NRkhDMiAgID0gKDB4MDMgPDwgMjEpIHwgT1BDX0NQMiwKKyAgICBPUENfTVRDMiAgICA9ICgweDA0IDw8IDIxKSB8IE9QQ19DUDIsCisgICAgT1BDX0RNVEMyICAgPSAoMHgwNSA8PCAyMSkgfCBPUENfQ1AyLAorICAgIE9QQ19DVEMyICAgID0gKDB4MDYgPDwgMjEpIHwgT1BDX0NQMiwKKyAgICBPUENfTVRIQzIgICA9ICgweDA3IDw8IDIxKSB8IE9QQ19DUDIsCisgICAgT1BDX0JDMiAgICAgPSAoMHgwOCA8PCAyMSkgfCBPUENfQ1AyLAorfTsKKworI2RlZmluZSBNQVNLX0NQMyhvcCkgICAgICAgTUFTS19PUF9NQUpPUihvcCkgfCAob3AgJiAweDNGKQorCitlbnVtIHsKKyAgICBPUENfTFdYQzEgICA9IDB4MDAgfCBPUENfQ1AzLAorICAgIE9QQ19MRFhDMSAgID0gMHgwMSB8IE9QQ19DUDMsCisgICAgT1BDX0xVWEMxICAgPSAweDA1IHwgT1BDX0NQMywKKyAgICBPUENfU1dYQzEgICA9IDB4MDggfCBPUENfQ1AzLAorICAgIE9QQ19TRFhDMSAgID0gMHgwOSB8IE9QQ19DUDMsCisgICAgT1BDX1NVWEMxICAgPSAweDBEIHwgT1BDX0NQMywKKyAgICBPUENfUFJFRlggICA9IDB4MEYgfCBPUENfQ1AzLAorICAgIE9QQ19BTE5WX1BTID0gMHgxRSB8IE9QQ19DUDMsCisgICAgT1BDX01BRERfUyAgPSAweDIwIHwgT1BDX0NQMywKKyAgICBPUENfTUFERF9EICA9IDB4MjEgfCBPUENfQ1AzLAorICAgIE9QQ19NQUREX1BTID0gMHgyNiB8IE9QQ19DUDMsCisgICAgT1BDX01TVUJfUyAgPSAweDI4IHwgT1BDX0NQMywKKyAgICBPUENfTVNVQl9EICA9IDB4MjkgfCBPUENfQ1AzLAorICAgIE9QQ19NU1VCX1BTID0gMHgyRSB8IE9QQ19DUDMsCisgICAgT1BDX05NQUREX1MgPSAweDMwIHwgT1BDX0NQMywKKyAgICBPUENfTk1BRERfRCA9IDB4MzEgfCBPUENfQ1AzLAorICAgIE9QQ19OTUFERF9QUz0gMHgzNiB8IE9QQ19DUDMsCisgICAgT1BDX05NU1VCX1MgPSAweDM4IHwgT1BDX0NQMywKKyAgICBPUENfTk1TVUJfRCA9IDB4MzkgfCBPUENfQ1AzLAorICAgIE9QQ19OTVNVQl9QUz0gMHgzRSB8IE9QQ19DUDMsCit9OworCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKworLy8gI2RlZmluZSBERUJVR19JTlRFUlBSRVRFUiAxCisKKyNpZiBkZWZpbmVkKERFQlVHX0lOVEVSUFJFVEVSKQorI2RlZmluZSBERUJVR19ESVNTQVMob3BjKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICIlczolZFx0JXMgcGMgJXUgb3AgMHgleCBycyAlZCBydCAlZCByZCAlZCBzYSAlZCBpbW0gMHgleFxuIiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sIG9wYywgQ1BVLnBjLCBvcCwgcnMsIHJ0LCByZCwgc2EsICh1aW50MzJfdClpbW0pO1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJCVkID0gMHgiIFRBUkdFVF9GTVRfbHggIiAiLCBpLCBDUFUuZ3ByX3JlZ1tpXSk7ICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKGkgJSA0KSA9PSAzKSBmcHJpbnRmKHN0ZGVyciwgIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERFQlVHX0RJU1NBUyhvcGMpCisjZW5kaWYKKworI2RlZmluZSBERUJVR19FUlJPUihtc2cpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkXHQlcyBwYyAldSBvcCAweCV4IHJzICVkIHJ0ICVkIHJkICVkIHNhICVkIGltbSAweCV4XG4iLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgbXNnLCBDUFUucGMsIG9wLCBycywgcnQsIHJkLCBzYSwgKHVpbnQzMl90KWltbSk7XAorICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworQ1BVSW50ZXJwcmV0ZXJDb250ZXh0IENQVTsKKworc3RhdGljIGlubGluZSBod2FkZHIgdHJhbnNsYXRlX2FkZHJlc3MoQ1BVTUlQU1N0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyZXNzKSB7CisKKyNkZWZpbmUgVVNFR19MSU1JVCAgICAgIDB4N0ZGRkZGRkZVTAorI2RlZmluZSBLU0VHMF9CQVNFICAgICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIEtTRUcxX0JBU0UgICAgICAweEEwMDAwMDAwVUwKKyNkZWZpbmUgS1NFRzJfQkFTRSAgICAgIDB4QzAwMDAwMDBVTAorI2RlZmluZSBLU0VHM19CQVNFICAgICAgMHhFMDAwMDAwMFVMCisKKyNkZWZpbmUgS1ZNX0tTRUcwX0JBU0UgIDB4NDAwMDAwMDBVTAorI2RlZmluZSBLVk1fS1NFRzJfQkFTRSAgMHg2MDAwMDAwMFVMCisKKyAgICBpZiAoYWRkcmVzcyA8PSBVU0VHX0xJTUlUKSB7CisgICAgICAgIC8qIHVzZWcgKi8KKyAgICAgICAgaWYgKGVudi0+Q1AwX1N0YXR1cyAmICgxIDw8IENQMFN0X0VSTCkpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRyZXNzICYgMHhGRkZGRkZGRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgICAgICB9CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIH0gZWxzZSBpZiAoYWRkcmVzcyA8IDB4NDAwMDAwMDAwMDAwMDAwMFVMTCkgeworICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPCAweDgwMDAwMDAwMDAwMDAwMDBVTEwpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfSBlbHNlIGlmIChhZGRyZXNzIDwgMHhDMDAwMDAwMDAwMDAwMDAwVUxMKSB7CisgICAgICAgIC8qIHhrcGh5cyAqLworICAgICAgICBpZiAoKGFkZHJlc3MgJiAweDA3RkZGRkZGRkZGRkZGRkZVTEwpIDw9IGVudi0+UEFNYXNrKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkcmVzcyAmIGVudi0+UEFNYXNrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPCAweEZGRkZGRkZGODAwMDAwMDBVTEwpIHsKKyAgICAgICAgLyogeGtzZWcgKi8KKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPCAoaW50MzJfdClLU0VHMV9CQVNFKSB7CisgICAgICAgIC8qIGtzZWcwICovCisgICAgICAgIHJldHVybiBhZGRyZXNzIC0gKGludDMyX3QpS1NFRzBfQkFTRTsKKyAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPCAoaW50MzJfdClLU0VHMl9CQVNFKSB7CisgICAgICAgIC8qIGtzZWcxICovCisgICAgICAgIHJldHVybiBhZGRyZXNzIC0gKGludDMyX3QpS1NFRzFfQkFTRTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7Cit9CisKK2ludCB0bGJfZXhjZXB0aW9uX2ludGVycHJldGVyKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCAqY29kZSwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICB1aW50MzJfdCBvcGNvZGU7CisgICAgaW50IHJzLCBydCwgcmQsIHNhOworICAgIHVpbnQzMl90IG9wLCBvcDE7CisgICAgaW50MTZfdCBpbW07CisKKyAgICBDUFUuYnJhbmNoX2FkZHIgPSAwOworCisgICAgQ1BVLkNQMF9FbnRyeUxvMCA9IGVudi0+Q1AwX0VudHJ5TG8wOworICAgIENQVS5DUDBfRW50cnlMbzEgPSBlbnYtPkNQMF9FbnRyeUxvMTsKKyAgICBDUFUuQ1AwX0JhZFZBZGRyID0gZW52LT5DUDBfQmFkVkFkZHI7CisgICAgQ1BVLkNQMF9FbnRyeUhpID0gZW52LT5DUDBfRW50cnlIaTsKKyAgICBDUFUuQ1AwX0NvbnRleHQgPSBlbnYtPkNQMF9Db250ZXh0OworICAgIENQVS5DUDBfWENvbnRleHQgPSBlbnYtPkNQMF9YQ29udGV4dDsKKworICAgIHdoaWxlICgxKSB7CisKKyAgICAgICAgb3AgPSBNQVNLX09QX01BSk9SKGNvZGVbQ1BVLnBjXSk7CisgICAgICAgIHJzID0gKGNvZGVbQ1BVLnBjXSA+PiAyMSkgJiAweDFmOworICAgICAgICBydCA9IChjb2RlW0NQVS5wY10gPj4gMTYpICYgMHgxZjsKKyAgICAgICAgcmQgPSAoY29kZVtDUFUucGNdID4+IDExKSAmIDB4MWY7CisgICAgICAgIHNhID0gKGNvZGVbQ1BVLnBjXSA+PiA2KSAmIDB4MWY7CisgICAgICAgIGltbSA9IChpbnQxNl90KWNvZGVbQ1BVLnBjXTsKKyAgICAgICAgb3Bjb2RlID0gY29kZVtDUFUucGNdOworCisgICAgICAgIENQVS5wYysrOworCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBPUENfU1BFQ0lBTDoKKyAgICAgICAgICAgIG9wMSA9IE1BU0tfU1BFQ0lBTChvcGNvZGUpOworICAgICAgICAgICAgc3dpdGNoIChvcDEpIHsKKyAgICAgICAgICAgIGNhc2UgT1BDX0pSOgorICAgICAgICAgICAgY2FzZSBPUENfSkFMUjoKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIkp1bXAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICBjYXNlIE9QQ19TTEw6CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gKGludDMyX3QpKENQVS5ncHJfcmVnW3J0XSA8PCBzYSk7CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJzbGwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NSQToKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoaW50MzJfdCkoKGludDMyX3QpQ1BVLmdwcl9yZWdbcnRdID4+IHNhKTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoInNyYSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU1JMOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoKG9wY29kZSA+PiAyMSkgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IH4oLTEgPDwgc2EpOworICAgICAgICAgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcmRdID0gKGludDMyX3QpKCgoKHVpbnQzMl90KUNQVS5ncHJfcmVnW3J0XSAmIG1hc2spIDw8ICgzMiAtIHNhKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodWludDMyX3QpQ1BVLmdwcl9yZWdbcnRdKSA+PiBzYSkpOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJyb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IChpbnQzMl90KSgodWludDMyX3QpQ1BVLmdwcl9yZWdbcnRdID4+IHNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygic3JsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJzcmwgVW5rbm93biIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfQUREVToKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tyZF0gPSAoaW50MzJfdCkoQ1BVLmdwcl9yZWdbcnNdICsgQ1BVLmdwcl9yZWdbcnRdKTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImFkZHUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NVQlU6CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcmRdID0gKGludDMyX3QpKENQVS5ncHJfcmVnW3JzXSAtIENQVS5ncHJfcmVnW3J0XSk7CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJzdWJ1Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19BTkQ6ICAgICAgICAgIC8qIExvZ2ljKi8KKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tyZF0gPSBDUFUuZ3ByX3JlZ1tyc10gJiBDUFUuZ3ByX3JlZ1tydF07CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJhbmQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX09SOgorICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3JkXSA9IENQVS5ncHJfcmVnW3JzXSB8IENQVS5ncHJfcmVnW3J0XTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIm9yIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19YT1I6CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcmRdID0gQ1BVLmdwcl9yZWdbcnNdIF4gQ1BVLmdwcl9yZWdbcnRdOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygieG9yIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAgICAgICAgIC8qIE1JUFM2NCBzcGVjaWZpYyBvcGNvZGVzICovCisgICAgICAgICAgICBjYXNlIE9QQ19EU0xMOgorICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3JkXSA9IENQVS5ncHJfcmVnW3J0XSA8PCBzYTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRzbGwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RTUkE6CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcmRdID0gQ1BVLmdwcl9yZWdbcnRdID4+IHNhOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHNyYSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFNMTDMyOgorICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3JkXSA9IENQVS5ncHJfcmVnW3J0XSA8PCAoc2EgKyAzMik7CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJkc2xsMzIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RTUkEzMjoKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tyZF0gPSBDUFUuZ3ByX3JlZ1tydF0gPj4gKHNhICsgMzIpOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHNyYTMyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19EU1JMOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoKG9wY29kZSA+PiAyMSkgJiAweDFmKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIG1hc2sgPSB+KC0xIDw8IHNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3JkXSA9ICgoKHRhcmdldF91bG9uZylDUFUuZ3ByX3JlZ1tydF0gJiBtYXNrKSA8PCAoNjQgLSBzYSkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHRhcmdldF91bG9uZylDUFUuZ3ByX3JlZ1tydF0pID4+IHNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHJvciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gKCh0YXJnZXRfdWxvbmcpQ1BVLmdwcl9yZWdbcnRdID4+IHNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHNybCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRzcmwgVW5rbm93biIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFNSTDMyOgorICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3JkXSA9ICgodGFyZ2V0X3Vsb25nKUNQVS5ncHJfcmVnW3J0XSkgPj4gKHNhICsgMzIpOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHNybDMyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19EQUREVToKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tyZF0gPSBDUFUuZ3ByX3JlZ1tyc10gKyBDUFUuZ3ByX3JlZ1tydF07CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJkYWRkdSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFNVQlU6CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcmRdID0gQ1BVLmdwcl9yZWdbcnNdIC0gQ1BVLmdwcl9yZWdbcnRdOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZHN1YnUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiVW5rbm93biIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NQRUNJQUwzOgorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXRfdWxvbmcgbWFzazsKKworICAgICAgICAgICAgb3AxID0gTUFTS19TUEVDSUFMMyhvcGNvZGUpOworICAgICAgICAgICAgc3dpdGNoIChvcDEpIHsKKyAgICAgICAgICAgIGNhc2UgT1BDX0VYVDoKKyAgICAgICAgICAgICAgICBtYXNrID0gKH4oLTEgPDwgKHJkICsgMSkpKSA8PCBzYTsKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoaW50MzJfdCkoKCh0YXJnZXRfdWxvbmcpKENQVS5ncHJfcmVnW3JzXSAmIG1hc2spKSA+PiBzYSk7CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJleHQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0lOUzoKKyAgICAgICAgICAgICAgICBtYXNrID0gfigtMSA8PCAocmQgLSBzYSArIDEpKTsKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoaW50MzJfdCkoKENQVS5ncHJfcmVnW3J0XSAmIH4obWFzayA8PCBzYSkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChDUFUuZ3ByX3JlZ1tyc10gJiBtYXNrKSA8PCBzYSkpOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiaW5zIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAgICAgY2FzZSBPUENfREVYVDoKKyAgICAgICAgICAgICAgICBtYXNrID0gKH4oLTEgPDwgKHJkICsgMSkpKSA8PCBzYTsKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoKHRhcmdldF91bG9uZykoQ1BVLmdwcl9yZWdbcnNdICYgbWFzaykpID4+IHNhIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1BVLmdwcl9yZWdbcnRdICYgfigodGFyZ2V0X3Vsb25nKW1hc2sgPj4gc2EpKTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRleHQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RJTlNNOgorICAgICAgICAgICAgICAgIG1hc2sgPSB+KC0xIDw8ICgocmQgKyAzMikgLSBzYSArIDEpKTsKKyAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoQ1BVLmdwcl9yZWdbcnRdICYgfihtYXNrIDw8IHNhKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ1BVLmdwcl9yZWdbcnNdICYgbWFzaykgPDwgc2EpOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZGluc20iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RJTlM6CisgICAgICAgICAgICAgICAgbWFzayA9IH4oLTEgPDwgKHJkIC0gc2EgKyAxKSk7CisgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gKENQVS5ncHJfcmVnW3J0XSAmIH4obWFzayA8PCBzYSkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENQVS5ncHJfcmVnW3JzXSAmIG1hc2spIDw8IHNhKTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRpbnMiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiVW5rbm93biIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPUENfUkVHSU1NOgorICAgICAgICAgICAgb3AxID0gTUFTS19SRUdJTU0ob3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19CTFRaTDogLyogUkVHSU1NIGJyYW5jaGVzICovCisgICAgICAgICAgICAgICAgaWYgKENQVS5ncHJfcmVnW3JzXSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ1BVLmJyYW5jaF9hZGRyID0gQ1BVLnBjICsgKGludDMyX3QpaW1tOworICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJsdHpsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENQVS5wYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJsdHpsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19CR0VaTDoKKyAgICAgICAgICAgICAgICBpZiAoQ1BVLmdwcl9yZWdbcnNdID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ1BVLmJyYW5jaF9hZGRyID0gQ1BVLnBjICsgKGludDMyX3QpaW1tOworICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJnZXpsIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENQVS5wYysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJnZXpsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19CTFRaOgorICAgICAgICAgICAgICAgIGlmIChDUFUuZ3ByX3JlZ1tyc10gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENQVS5icmFuY2hfYWRkciA9IENQVS5wYyArIChpbnQzMl90KWltbTsKKyAgICAgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJibHR6Iik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJibHR6Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19CR0VaOgorICAgICAgICAgICAgICAgIGlmIChDUFUuZ3ByX3JlZ1tyc10gPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBDUFUuYnJhbmNoX2FkZHIgPSBDUFUucGMgKyAoaW50MzJfdClpbW07CisgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiYmdleiIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJiZ2V6Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiVW5rbm93biIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NQMDoKKyAgICAgICAgICAgIG9wMSA9IE1BU0tfQ1AwKG9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICAgICAgY2FzZSBPUENfTUZDMDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJkKSB7CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4NykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoaW50MzJfdClDUFUuQ1AwX0NvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIm1mYzAgQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIm1mYzAgcmVnIDQ6IFVua25vd24gc2VsZWN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUgJiAweDcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFkVkFkZHIKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IENQVS5DUDBfQmFkVkFkZHI7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIm1mYzAgQmFkVkFkZHIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfRVJST1IoIm1mYzAgcmVnIDggVW5rbm93biBzZWxlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgICAgICBjYXNlIDIwOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4NykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBYQ29udGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gQ1BVLkNQMF9YQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygibWZjMCBYQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoIm1mYzAgcmVnIDIwOiBVbmtub3duIHNlbGVjdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJtZmMwIFVua25vd24iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTVRDMDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJkKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4NykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudHJ5TG8wCisgICAgICAgICAgICAgICAgICAgICAgICBDUFUuQ1AwX0VudHJ5TG8wID0gQ1BVLmdwcl9yZWdbcnRdICYgMHgzRkZGRkZGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygibXRjMCBFbnRyeUxvMCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJtdGMwIHJlZyAyIFVua25vd24gc2VsZWN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlICYgMHg3KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW50cnlMbzEKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5DUDBfRW50cnlMbzEgPSBDUFUuZ3ByX3JlZ1tydF0gJiAweDNGRkZGRkZGOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJtdGMwIEVudHJ5TG8xIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfRVJST1IoIm10YzAgcmVnIDMgVW5rbm93biBzZWxlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJtdGMwIFVua25vd24iKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgIGNhc2UgT1BDX0RNRkMwOgorICAgICAgICAgICAgICAgIHN3aXRjaCAocmQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlICYgMHg3KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IENQVS5DUDBfQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZG1mYzAgQ29udGV4dCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRtZmMwIHJlZyA0OiBVbmtub3duIHNlbGVjdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlICYgMHg3KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhZFZBZGRyCisgICAgICAgICAgICAgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSBDUFUuQ1AwX0JhZFZBZGRyOworICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfRElTU0FTKCJkbWZjMCBCYWRWQWRkciIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRtZmMwIHJlZyA4OiBVbmtub3duIHNlbGVjdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcGNvZGUgJiAweDcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gWENvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IENQVS5DUDBfWENvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImRtZmMwIFhDb250ZXh0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZG1mYzAgcmVnIDIwOiBVbmtub3duIHNlbGVjdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiZG1mYzAgVW5rbm93biIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19ETVRDMDoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJkKSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4NykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudHJ5TG8wCisgICAgICAgICAgICAgICAgICAgICAgICBDUFUuQ1AwX0VudHJ5TG8wID0gQ1BVLmdwcl9yZWdbcnRdICYgMHgzRkZGRkZGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZG10YzAgRW50cnlMbzAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJkbXRjMCBVbmtub3duIHNlbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4NykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVudHJ5TG8xCisgICAgICAgICAgICAgICAgICAgICAgICBDUFUuQ1AwX0VudHJ5TG8xID0gQ1BVLmdwcl9yZWdbcnRdICYgMHgzRkZGRkZGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZG10YzAgRW50cnlMbzEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiZG10YzAgVW5rbm93biBzZWxlY3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJkbXRjMCBVbmtub3duIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgICAgICAgICBjYXNlIE9QQ19DMF9GSVJTVCAuLi4gT1BDX0MwX0xBU1Q6CisgICAgICAgICAgICAgICAgc3dpdGNoIChNQVNLX0MwKG9wY29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPUENfRVJFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4Y2VwdGlvbiByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiZXJldCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BDX1RMQldSOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpa2VseShDUFUuZG9fdGxid3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LT5DUDBfRW50cnlMbzAgPSBDUFUuQ1AwX0VudHJ5TG8wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+Q1AwX0VudHJ5TG8xID0gQ1BVLkNQMF9FbnRyeUxvMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByNGtfaGVscGVyX3RsYndyKGVudik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoInRsYndyIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0VSUk9SKCJvcGNfYzAgVW5rbm93biIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBERUJVR19FUlJPUigiVW5rbm93biIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERElVOgorICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gQ1BVLmdwcl9yZWdbcnNdICsgaW1tOworICAgICAgICAgICAgREVCVUdfRElTU0FTKCJhZGRpdSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FOREk6IC8qIEFyaXRobWV0aWMgd2l0aCBpbW1lZGlhdGUgb3Bjb2RlICovCisgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSBDUFUuZ3ByX3JlZ1tyc10gJiAodWludDMyX3QpaW1tOworICAgICAgICAgICAgREVCVUdfRElTU0FTKCJhbmRpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTFVJOiAvKiBPUENfQVVJICovCisgICAgICAgICAgICBDUFUuZ3ByX3JlZ1tydF0gPSAoKGludDMyX3QpaW1tKSA8PCAxNjsKKyAgICAgICAgICAgIERFQlVHX0RJU1NBUygibHVpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfT1JJOgorICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gQ1BVLmdwcl9yZWdbcnNdIHwgKCh1aW50MzJfdClpbW0pOworICAgICAgICAgICAgREVCVUdfRElTU0FTKCJvcmkiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19YT1JJOgorICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gQ1BVLmdwcl9yZWdbcnNdIF4gKCh1aW50MzJfdClpbW0pOworICAgICAgICAgICAgREVCVUdfRElTU0FTKCJ4b3JpIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfSjoKKyAgICAgICAgY2FzZSBPUENfSkFMOiAvKiBKdW1wICovCisgICAgICAgIGNhc2UgT1BDX0pBTFg6CisgICAgICAgICAgICBERUJVR19ESVNTQVMoIkp1bXAiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLyogQnJhbmNoICovCisgICAgICAgIGNhc2UgT1BDX0JFUToKKyAgICAgICAgICAgIGlmIChDUFUuZ3ByX3JlZ1tyc10gPT0gQ1BVLmdwcl9yZWdbcnRdKSB7CisgICAgICAgICAgICAgICAgQ1BVLmJyYW5jaF9hZGRyID0gQ1BVLnBjICsgKGludDMyX3QpaW1tOworICAgICAgICAgICAgICAgIERFQlVHX0RJU1NBUygiYmVxIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERUJVR19ESVNTQVMoImJlcSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0JFUUw6CisgICAgICAgICAgICBpZiAoQ1BVLmdwcl9yZWdbcnNdID09IENQVS5ncHJfcmVnW3J0XSkgeworICAgICAgICAgICAgICAgIENQVS5icmFuY2hfYWRkciA9IENQVS5wYyArIChpbnQzMl90KWltbTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJlcWwiKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ1BVLnBjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBERUJVR19ESVNTQVMoImJlcWwiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19CTkU6CisgICAgICAgICAgICBpZiAoQ1BVLmdwcl9yZWdbcnNdICE9IENQVS5ncHJfcmVnW3J0XSkgeworICAgICAgICAgICAgICAgIENQVS5icmFuY2hfYWRkciA9IENQVS5wYyArIChpbnQzMl90KWltbTsKKyAgICAgICAgICAgICAgICBERUJVR19ESVNTQVMoImJuZSIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgREVCVUdfRElTU0FTKCJibmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19MVzoKKyAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IChpbnQzMl90KWxkbF9waHlzKHRyYW5zbGF0ZV9hZGRyZXNzKGVudiwgQ1BVLmdwcl9yZWdbcnNdICsgaW1tKSk7CisgICAgICAgICAgICBERUJVR19ESVNTQVMoImx3Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1c6CisgICAgICAgICAgICBzdGxfcGh5cyh0cmFuc2xhdGVfYWRkcmVzcyhlbnYsIENQVS5ncHJfcmVnW3JzXSArIGltbSksIENQVS5ncHJfcmVnW3J0XSk7CisgICAgICAgICAgICBERUJVR19ESVNTQVMoInN3Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAvKiBNSVBTNjQgb3Bjb2RlcyAqLworICAgICAgICBjYXNlIE9QQ19MRDoKKyAgICAgICAgICAgIENQVS5ncHJfcmVnW3J0XSA9IGxkcV9waHlzKHRyYW5zbGF0ZV9hZGRyZXNzKGVudiwgQ1BVLmdwcl9yZWdbcnNdICsgaW1tKSk7CisgICAgICAgICAgICBERUJVR19ESVNTQVMoImxkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0Q6CisgICAgICAgICAgICBzdHFfcGh5cyh0cmFuc2xhdGVfYWRkcmVzcyhlbnYsIENQVS5ncHJfcmVnW3JzXSArIGltbSksIENQVS5ncHJfcmVnW3J0XSk7CisgICAgICAgICAgICBERUJVR19ESVNTQVMoInNkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREFERElVOgorICAgICAgICAgICAgQ1BVLmdwcl9yZWdbcnRdID0gQ1BVLmdwcl9yZWdbcnNdICsgaW1tOworICAgICAgICAgICAgREVCVUdfRElTU0FTKCJkYWRkaXUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICNlbmRpZgorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgIERFQlVHX0VSUk9SKCJVbmtub3duIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDUFUuYnJhbmNoX2FkZHIpIHsKKyAgICAgICAgICAgIENQVS5wYyA9IENQVS5icmFuY2hfYWRkcjsKKyAgICAgICAgICAgIENQVS5icmFuY2hfYWRkciA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ1BVLnBjID49IHNpemUpIHsKKyAgICAgICAgICAgIERFQlVHX0VSUk9SKCJDb2RlIGJ1ZmZlciBJbmRleCBvdXQgb2YgYm91bmRzIik7CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIH0KKworICAgIH0gLy9lbmQgb2Ygd2hpbGUKK30KKyNlbmRpZgorCisvKiBnbG9iYWwgcmVnaXN0ZXIgaW5kaWNlcyAqLworc3RhdGljIFRDR3ZfcHRyIGNwdV9lbnY7CitzdGF0aWMgVENHdiBjcHVfZ3ByWzMyXSwgY3B1X1BDOworc3RhdGljIFRDR3YgY3B1X0hJW01JUFNfRFNQX0FDQ10sIGNwdV9MT1tNSVBTX0RTUF9BQ0NdLCBjcHVfQUNYW01JUFNfRFNQX0FDQ107CitzdGF0aWMgVENHdiBjcHVfZHNwY3RybCwgYnRhcmdldCwgYmNvbmQ7CitzdGF0aWMgVENHdl9pMzIgaGZsYWdzOworc3RhdGljIFRDR3ZfaTMyIGZwdV9mY3IwLCBmcHVfZmNyMzE7CisKK3N0YXRpYyB1aW50MzJfdCBnZW5fb3BjX2hmbGFnc1tPUENfQlVGX1NJWkVdOworCisjaW5jbHVkZSAiZXhlYy9nZW4taWNvdW50LmgiCisKKyNkZWZpbmUgZ2VuX2hlbHBlcl8waShuYW1lLCBhcmcpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUQ0d2X2kzMiBoZWxwZXJfdG1wID0gdGNnX2NvbnN0X2kzMihhcmcpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXyMjbmFtZShoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgZ2VuX2hlbHBlcl8xaShuYW1lLCBhcmcxLCBhcmcyKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUQ0d2X2kzMiBoZWxwZXJfdG1wID0gdGNnX2NvbnN0X2kzMihhcmcyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXyMjbmFtZShhcmcxLCBoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgZ2VuX2hlbHBlcl8yaShuYW1lLCBhcmcxLCBhcmcyLCBhcmczKSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgICBUQ0d2X2kzMiBoZWxwZXJfdG1wID0gdGNnX2NvbnN0X2kzMihhcmczKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXyMjbmFtZShhcmcxLCBhcmcyLCBoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgZ2VuX2hlbHBlcl8zaShuYW1lLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSBkbyB7ICAgICAgICAgIFwKKyAgICBUQ0d2X2kzMiBoZWxwZXJfdG1wID0gdGNnX2NvbnN0X2kzMihhcmc0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXyMjbmFtZShhcmcxLCBhcmcyLCBhcmczLCBoZWxwZXJfdG1wKTsgICAgICAgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgZ2VuX2hlbHBlcl80aShuYW1lLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSBkbyB7ICAgIFwKKyAgICBUQ0d2X2kzMiBoZWxwZXJfdG1wID0gdGNnX2NvbnN0X2kzMihhcmc1KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXyMjbmFtZShhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBoZWxwZXJfdG1wKTsgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMihoZWxwZXJfdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKK3R5cGVkZWYgc3RydWN0IERpc2FzQ29udGV4dCB7CisgICAgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIHRhcmdldF91bG9uZyBwYywgc2F2ZWRfcGM7CisgICAgdWludDMyX3Qgb3Bjb2RlOworICAgIGludCBzaW5nbGVzdGVwX2VuYWJsZWQ7CisgICAgLyogUm91dGluZSB1c2VkIHRvIGFjY2VzcyBtZW1vcnkgKi8KKyAgICBpbnQgbWVtX2lkeDsKKyAgICB1aW50MzJfdCBoZmxhZ3MsIHNhdmVkX2hmbGFnczsKKyAgICBpbnQgYnN0YXRlOworICAgIHRhcmdldF91bG9uZyBidGFyZ2V0OworfSBEaXNhc0NvbnRleHQ7CisKK2VudW0geworICAgIEJTX05PTkUgICAgID0gMCwgLyogV2UgZ28gb3V0IG9mIHRoZSBUQiB3aXRob3V0IHJlYWNoaW5nIGEgYnJhbmNoIG9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgKiBleGNlcHRpb24gY29uZGl0aW9uICovCisgICAgQlNfU1RPUCAgICAgPSAxLCAvKiBXZSB3YW50IHRvIHN0b3AgdHJhbnNsYXRpb24gZm9yIGFueSByZWFzb24gKi8KKyAgICBCU19CUkFOQ0ggICA9IDIsIC8qIFdlIHJlYWNoZWQgYSBicmFuY2ggY29uZGl0aW9uICAgICAqLworICAgIEJTX0VYQ1AgICAgID0gMywgLyogV2UgcmVhY2hlZCBhbiBleGNlcHRpb24gY29uZGl0aW9uICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmVnbmFtZXNbXSA9CisgICAgeyAicjAiLCAiYXQiLCAidjAiLCAidjEiLCAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLAorICAgICAgInQwIiwgInQxIiwgInQyIiwgInQzIiwgInQ0IiwgInQ1IiwgInQ2IiwgInQ3IiwKKyAgICAgICJzMCIsICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJzNiIsICJzNyIsCisgICAgICAidDgiLCAidDkiLCAiazAiLCAiazEiLCAiZ3AiLCAic3AiLCAiczgiLCAicmEiLCB9OworCitzdGF0aWMgY29uc3QgY2hhciAqcmVnbmFtZXNfSElbXSA9CisgICAgeyAiSEkwIiwgIkhJMSIsICJISTIiLCAiSEkzIiwgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnJlZ25hbWVzX0xPW10gPQorICAgIHsgIkxPMCIsICJMTzEiLCAiTE8yIiwgIkxPMyIsIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpyZWduYW1lc19BQ1hbXSA9CisgICAgeyAiQUNYMCIsICJBQ1gxIiwgIkFDWDIiLCAiQUNYMyIsIH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpmcmVnbmFtZXNbXSA9CisgICAgeyAiZjAiLCAgImYxIiwgICJmMiIsICAiZjMiLCAgImY0IiwgICJmNSIsICAiZjYiLCAgImY3IiwKKyAgICAgICJmOCIsICAiZjkiLCAgImYxMCIsICJmMTEiLCAiZjEyIiwgImYxMyIsICJmMTQiLCAiZjE1IiwKKyAgICAgICJmMTYiLCAiZjE3IiwgImYxOCIsICJmMTkiLCAiZjIwIiwgImYyMSIsICJmMjIiLCAiZjIzIiwKKyAgICAgICJmMjQiLCAiZjI1IiwgImYyNiIsICJmMjciLCAiZjI4IiwgImYyOSIsICJmMzAiLCAiZjMxIiwgfTsKKworI2lmZGVmIE1JUFNfREVCVUdfRElTQVMKKyNkZWZpbmUgTUlQU19ERUJVRyhmbXQsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfSU5fQVNNLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIFRBUkdFVF9GTVRfbHggIjogJTA4eCAiIGZtdCAiXG4iLCBcCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGMsIGN0eC0+b3Bjb2RlICwgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIExPR19ESVNBUyguLi4pIHFlbXVfbG9nX21hc2soQ1BVX0xPR19UQl9JTl9BU00sICMjIF9fVkFfQVJHU19fKQorI2Vsc2UKKyNkZWZpbmUgTUlQU19ERUJVRyhmbXQsIC4uLikgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIExPR19ESVNBUyguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIE1JUFNfSU5WQUwob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTUlQU19ERUJVRygiSW52YWxpZCAlcyAlMDN4ICUwM3ggJTAzeCIsIG9wLCBjdHgtPm9wY29kZSA+PiAyNiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBjdHgtPm9wY29kZSAmIDB4M0YsICgoY3R4LT5vcGNvZGUgPj4gMTYpICYgMHgxRikpOyAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIG1vdmVzLiAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbl9sb2FkX2dwciAoVENHdiB0LCBpbnQgcmVnKQoreworICAgIGlmIChyZWcgPT0gMCkKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQsIDApOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9tb3ZfdGwodCwgY3B1X2dwcltyZWddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9zdG9yZV9ncHIgKFRDR3YgdCwgaW50IHJlZykKK3sKKyAgICBpZiAocmVnICE9IDApCisgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9ncHJbcmVnXSwgdCk7Cit9CisKKy8qIE1vdmVzIHRvL2Zyb20gQUNYIHJlZ2lzdGVyLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbG9hZF9BQ1ggKFRDR3YgdCwgaW50IHJlZykKK3sKKyAgICB0Y2dfZ2VuX21vdl90bCh0LCBjcHVfQUNYW3JlZ10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0b3JlX0FDWCAoVENHdiB0LCBpbnQgcmVnKQoreworICAgIHRjZ19nZW5fbW92X3RsKGNwdV9BQ1hbcmVnXSwgdCk7Cit9CisKKy8qIE1vdmVzIHRvL2Zyb20gc2hhZG93IHJlZ2lzdGVycy4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbG9hZF9zcnNncHIgKGludCBmcm9tLCBpbnQgdG8pCit7CisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworCisgICAgaWYgKGZyb20gPT0gMCkKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCAwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgVENHdl9pMzIgdDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIFRDR3ZfcHRyIGFkZHIgPSB0Y2dfdGVtcF9uZXdfcHRyKCk7CisKKyAgICAgICAgdGNnX2dlbl9sZF9pMzIodDIsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0N0bCkpOworICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHQyLCB0MiwgQ1AwU1JTQ3RsX1BTUyk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodDIsIHQyLCAweGYpOworICAgICAgICB0Y2dfZ2VuX211bGlfaTMyKHQyLCB0Miwgc2l6ZW9mKHRhcmdldF91bG9uZykgKiAzMik7CisgICAgICAgIHRjZ19nZW5fZXh0X2kzMl9wdHIoYWRkciwgdDIpOworICAgICAgICB0Y2dfZ2VuX2FkZF9wdHIoYWRkciwgY3B1X2VudiwgYWRkcik7CisKKyAgICAgICAgdGNnX2dlbl9sZF90bCh0MCwgYWRkciwgc2l6ZW9mKHRhcmdldF91bG9uZykgKiBmcm9tKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9wdHIoYWRkcik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQyKTsKKyAgICB9CisgICAgZ2VuX3N0b3JlX2dwcih0MCwgdG8pOworICAgIHRjZ190ZW1wX2ZyZWUodDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX3N0b3JlX3Nyc2dwciAoaW50IGZyb20sIGludCB0bykKK3sKKyAgICBpZiAodG8gIT0gMCkgeworICAgICAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgICAgIFRDR3ZfaTMyIHQyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICBUQ0d2X3B0ciBhZGRyID0gdGNnX3RlbXBfbmV3X3B0cigpOworCisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgZnJvbSk7CisgICAgICAgIHRjZ19nZW5fbGRfaTMyKHQyLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9TUlNDdGwpKTsKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MiwgdDIsIENQMFNSU0N0bF9QU1MpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQyLCB0MiwgMHhmKTsKKyAgICAgICAgdGNnX2dlbl9tdWxpX2kzMih0MiwgdDIsIHNpemVvZih0YXJnZXRfdWxvbmcpICogMzIpOworICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfcHRyKGFkZHIsIHQyKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfcHRyKGFkZHIsIGNwdV9lbnYsIGFkZHIpOworCisgICAgICAgIHRjZ19nZW5fc3RfdGwodDAsIGFkZHIsIHNpemVvZih0YXJnZXRfdWxvbmcpICogdG8pOworICAgICAgICB0Y2dfdGVtcF9mcmVlX3B0cihhZGRyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB9Cit9CisKKy8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1vdmVzLiAqLworc3RhdGljIGlubGluZSB2b2lkIGdlbl9sb2FkX2ZwcjMyIChUQ0d2X2kzMiB0LCBpbnQgcmVnKQoreworICAgIHRjZ19nZW5fbGRfaTMyKHQsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX2ZwdS5mcHJbcmVnXS53W0ZQX0VORElBTl9JRFhdKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3RvcmVfZnByMzIgKFRDR3ZfaTMyIHQsIGludCByZWcpCit7CisgICAgdGNnX2dlbl9zdF9pMzIodCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBhY3RpdmVfZnB1LmZwcltyZWddLndbRlBfRU5ESUFOX0lEWF0pKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9sb2FkX2ZwcjMyaCAoRGlzYXNDb250ZXh0ICpjdHgsIFRDR3ZfaTMyIHQsIGludCByZWcpCit7CisgIGlmIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfRjY0KSB7CisgICAgdGNnX2dlbl9sZF9pMzIodCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBhY3RpdmVfZnB1LmZwcltyZWddLndbIUZQX0VORElBTl9JRFhdKSk7CisgIH0gZWxzZSB7CisgICAgZ2VuX2xvYWRfZnByMzIodCwgcmVnfDEpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3RvcmVfZnByMzJoIChEaXNhc0NvbnRleHQgKmN0eCwgVENHdl9pMzIgdCwgaW50IHJlZykKK3sKKyAgaWYgKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19GNjQpIHsKKyAgICB0Y2dfZ2VuX3N0X2kzMih0LCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGFjdGl2ZV9mcHUuZnByW3JlZ10ud1shRlBfRU5ESUFOX0lEWF0pKTsKKyAgfSBlbHNlIHsKKyAgICBnZW5fc3RvcmVfZnByMzIodCwgcmVnfDEpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbG9hZF9mcHI2NCAoRGlzYXNDb250ZXh0ICpjdHgsIFRDR3ZfaTY0IHQsIGludCByZWcpCit7CisgICAgaWYgKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19GNjQpIHsKKyAgICAgICAgdGNnX2dlbl9sZF9pNjQodCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBhY3RpdmVfZnB1LmZwcltyZWddLmQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgVENHdl9pMzIgdDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIGdlbl9sb2FkX2ZwcjMyKHQwLCByZWcgJiB+MSk7CisgICAgICAgIGdlbl9sb2FkX2ZwcjMyKHQxLCByZWcgfCAxKTsKKyAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NCh0LCB0MCwgdDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fc3RvcmVfZnByNjQgKERpc2FzQ29udGV4dCAqY3R4LCBUQ0d2X2k2NCB0LCBpbnQgcmVnKQoreworICAgIGlmIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfRjY0KSB7CisgICAgICAgIHRjZ19nZW5fc3RfaTY0KHQsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX2ZwdS5mcHJbcmVnXS5kKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIFRDR3ZfaTMyIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodDEsIHQpOworICAgICAgICBnZW5fc3RvcmVfZnByMzIodDEsIHJlZyAmIH4xKTsKKyAgICAgICAgdGNnX2dlbl9zaHJpX2k2NCh0MCwgdCwgMzIpOworICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodDEsIHQwKTsKKyAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKHQxLCByZWcgfCAxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBnZXRfZnBfYml0IChpbnQgY2MpCit7CisgICAgaWYgKGNjKQorICAgICAgICByZXR1cm4gMjQgKyBjYzsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAyMzsKK30KKworI2RlZmluZSBGT1BfQ09ORFModHlwZSwgZm10LCBiaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIGdlbl9jbXAgIyMgdHlwZSAjIyBfICMjIGZtdChpbnQgbiwgVENHdl9pIyNiaXRzIGEsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kjI2JpdHMgYiwgaW50IGNjKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN3aXRjaCAobikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIDA6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX2YsIGNwdV9lbnYsIGEsIGIsIGNjKTsgICAgYnJlYWs7XAorICAgIGNhc2UgIDE6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3VuLCBjcHVfZW52LCBhLCBiLCBjYyk7ICAgYnJlYWs7XAorICAgIGNhc2UgIDI6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX2VxLCBjcHVfZW52LCBhLCBiLCBjYyk7ICAgYnJlYWs7XAorICAgIGNhc2UgIDM6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3VlcSwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgIDQ6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX29sdCwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgIDU6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3VsdCwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgIDY6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX29sZSwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgIDc6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3VsZSwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgIDg6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3NmLCBjcHVfZW52LCBhLCBiLCBjYyk7ICAgYnJlYWs7XAorICAgIGNhc2UgIDk6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX25nbGUsIGNwdV9lbnYsIGEsIGIsIGNjKTsgYnJlYWs7XAorICAgIGNhc2UgMTA6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX3NlcSwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgMTE6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX25nbCwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgMTI6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX2x0LCBjcHVfZW52LCBhLCBiLCBjYyk7ICAgYnJlYWs7XAorICAgIGNhc2UgMTM6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX25nZSwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGNhc2UgMTQ6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX2xlLCBjcHVfZW52LCBhLCBiLCBjYyk7ICAgYnJlYWs7XAorICAgIGNhc2UgMTU6IGdlbl9oZWxwZXJfM2koY21wICMjIHR5cGUgIyMgXyAjIyBmbXQgIyMgX25ndCwgY3B1X2VudiwgYSwgYiwgY2MpOyAgYnJlYWs7XAorICAgIGRlZmF1bHQ6IGFib3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGT1BfQ09ORFMoLCBkLCA2NCkKK0ZPUF9DT05EUyhhYnMsIGQsIDY0KQorRk9QX0NPTkRTKCwgcywgMzIpCitGT1BfQ09ORFMoYWJzLCBzLCAzMikKK0ZPUF9DT05EUygsIHBzLCA2NCkKK0ZPUF9DT05EUyhhYnMsIHBzLCA2NCkKKyN1bmRlZiBGT1BfQ09ORFMKKworLyogVGVzdHMgKi8KKyNkZWZpbmUgT1BfQ09ORChuYW1lLCBjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSB2b2lkIGdsdWUoZ2VuX29wXywgbmFtZSkgKFRDR3YgcmV0LCBUQ0d2IHQwLCBUQ0d2IHQxKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsMiA9IGdlbl9uZXdfbGFiZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX2JyY29uZF90bChjb25kLCB0MCwgdDEsIGwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fbW92aV90bChyZXQsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9icihsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fc2V0X2xhYmVsKGwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fbW92aV90bChyZXQsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2VuX3NldF9sYWJlbChsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK09QX0NPTkQoZXEsIFRDR19DT05EX0VRKTsKK09QX0NPTkQobmUsIFRDR19DT05EX05FKTsKK09QX0NPTkQoZ2UsIFRDR19DT05EX0dFKTsKK09QX0NPTkQoZ2V1LCBUQ0dfQ09ORF9HRVUpOworT1BfQ09ORChsdCwgVENHX0NPTkRfTFQpOworT1BfQ09ORChsdHUsIFRDR19DT05EX0xUVSk7CisjdW5kZWYgT1BfQ09ORAorCisjZGVmaW5lIE9QX0NPTkRJKG5hbWUsIGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBnbHVlKGdlbl9vcF8sIG5hbWUpIChUQ0d2IHJldCwgVENHdiB0MCwgdGFyZ2V0X3Vsb25nIHZhbCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbDIgPSBnZW5fbmV3X2xhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9icmNvbmRpX3RsKGNvbmQsIHQwLCB2YWwsIGwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX21vdmlfdGwocmV0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fYnIobDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2VuX3NldF9sYWJlbChsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX21vdmlfdGwocmV0LCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl9zZXRfbGFiZWwobDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitPUF9DT05ESShsdGksIFRDR19DT05EX0xUKTsKK09QX0NPTkRJKGx0aXUsIFRDR19DT05EX0xUVSk7CisjdW5kZWYgT1BfQ09OREkKKworI2RlZmluZSBPUF9DT05EWihuYW1lLCBjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgZ2x1ZShnZW5fb3BfLCBuYW1lKSAoVENHdiByZXQsIFRDR3YgdDApICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGwyID0gZ2VuX25ld19sYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fYnJjb25kaV90bChjb25kLCB0MCwgMCwgbDEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9tb3ZpX3RsKHJldCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX2JyKGwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl9zZXRfbGFiZWwobDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9tb3ZpX3RsKHJldCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5fc2V0X2xhYmVsKGwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorT1BfQ09ORFooZ2V6LCBUQ0dfQ09ORF9HRSk7CitPUF9DT05EWihndHosIFRDR19DT05EX0dUKTsKK09QX0NPTkRaKGxleiwgVENHX0NPTkRfTEUpOworT1BfQ09ORFoobHR6LCBUQ0dfQ09ORF9MVCk7CisjdW5kZWYgT1BfQ09ORFoKKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9zYXZlX3BjKHRhcmdldF91bG9uZyBwYykKK3sKKyAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X1BDLCBwYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX2NwdV9zdGF0ZSAoRGlzYXNDb250ZXh0ICpjdHgsIGludCBkb19zYXZlX3BjKQoreworICAgIExPR19ESVNBUygiaGZsYWdzICUwOHggc2F2ZWQgJTA4eFxuIiwgY3R4LT5oZmxhZ3MsIGN0eC0+c2F2ZWRfaGZsYWdzKTsKKyAgICBpZiAoZG9fc2F2ZV9wYyAmJiBjdHgtPnBjICE9IGN0eC0+c2F2ZWRfcGMpIHsKKyAgICAgICAgZ2VuX3NhdmVfcGMoY3R4LT5wYyk7CisgICAgICAgIGN0eC0+c2F2ZWRfcGMgPSBjdHgtPnBjOworICAgIH0KKyAgICBpZiAoY3R4LT5oZmxhZ3MgIT0gY3R4LT5zYXZlZF9oZmxhZ3MpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihoZmxhZ3MsIGN0eC0+aGZsYWdzKTsKKyAgICAgICAgY3R4LT5zYXZlZF9oZmxhZ3MgPSBjdHgtPmhmbGFnczsKKyAgICAgICAgc3dpdGNoIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfQk1BU0spIHsKKyAgICAgICAgY2FzZSBNSVBTX0hGTEFHX0JSOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUlQU19IRkxBR19CQzoKKyAgICAgICAgY2FzZSBNSVBTX0hGTEFHX0JMOgorICAgICAgICBjYXNlIE1JUFNfSEZMQUdfQjoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChidGFyZ2V0LCBjdHgtPmJ0YXJnZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2NwdV9zdGF0ZSAoQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4KQoreworICAgIGN0eC0+c2F2ZWRfaGZsYWdzID0gY3R4LT5oZmxhZ3M7CisgICAgc3dpdGNoIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfQk1BU0spIHsKKyAgICBjYXNlIE1JUFNfSEZMQUdfQlI6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUlQU19IRkxBR19CQzoKKyAgICBjYXNlIE1JUFNfSEZMQUdfQkw6CisgICAgY2FzZSBNSVBTX0hGTEFHX0I6CisgICAgICAgIGN0eC0+YnRhcmdldCA9IGVudi0+YnRhcmdldDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dlbmVyYXRlX2V4Y2VwdGlvbl9lcnIgKERpc2FzQ29udGV4dCAqY3R4LCBpbnQgZXhjcCwgaW50IGVycikKK3sKKyAgICBUQ0d2X2kzMiB0ZXhjcCA9IHRjZ19jb25zdF9pMzIoZXhjcCk7CisgICAgVENHdl9pMzIgdGVyciA9IHRjZ19jb25zdF9pMzIoZXJyKTsKKyAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDEpOworICAgIGdlbl9oZWxwZXJfcmFpc2VfZXhjZXB0aW9uX2VycihjcHVfZW52LCB0ZXhjcCwgdGVycik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodGVycik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodGV4Y3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2dlbmVyYXRlX2V4Y2VwdGlvbiAoRGlzYXNDb250ZXh0ICpjdHgsIGludCBleGNwKQoreworICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgZ2VuX2hlbHBlcl8xaShyYWlzZV9leGNlcHRpb24sIGNwdV9lbnYsIGV4Y3ApOworfQorCisvKiBBZGRyZXNzZXMgY29tcHV0YXRpb24gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fb3BfYWRkcl9hZGQgKERpc2FzQ29udGV4dCAqY3R4LCBUQ0d2IHJldCwgVENHdiBhcmcwLCBUQ0d2IGFyZzEpCit7CisgICAgdGNnX2dlbl9hZGRfdGwocmV0LCBhcmcwLCBhcmcxKTsKKworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIDMyLWJpdCBjb2RlLCBkYXRhIHJlZmVyZW5jZSBpbiB1c2VyIG1vZGUKKyAgICAgICB3aXRoIFN0YXR1c19VWCA9IDAgc2hvdWxkIGJlIGNhc3RlZCB0byAzMi1iaXQgYW5kIHNpZ24gZXh0ZW5kZWQuCisgICAgICAgU2VlIHRoZSBNSVBTNjQgUFJBIG1hbnVhbCwgc2VjdGlvbiA0LjEwLiAqLworICAgIGlmICgoKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19LU1UpID09IE1JUFNfSEZMQUdfVU0pICYmCisgICAgICAgICEoY3R4LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX1VYKSkgeworICAgICAgICB0Y2dfZ2VuX2V4dDMyc19pNjQocmV0LCByZXQpOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfY3AwX2VuYWJsZWQoRGlzYXNDb250ZXh0ICpjdHgpCit7CisgICAgaWYgKHVubGlrZWx5KCEoY3R4LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0NQMCkpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb25fZXJyKGN0eCwgRVhDUF9DcFUsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfY3AxX2VuYWJsZWQoRGlzYXNDb250ZXh0ICpjdHgpCit7CisgICAgaWYgKHVubGlrZWx5KCEoY3R4LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0ZQVSkpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb25fZXJyKGN0eCwgRVhDUF9DcFUsIDEpOworfQorCisvKiBWZXJpZnkgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgd2l0aCBDT1AxWCBpbnN0cnVjdGlvbnMgZW5hYmxlZC4KKyAgIFRoaXMgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYWJsYSBzeW1ib2wgaW4gdGhlIE1JUFMzMiBhbmQgTUlQUzY0CisgICBvcGNvZGUgdGFibGVzLiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2NvcDF4KERpc2FzQ29udGV4dCAqY3R4KQoreworICAgIGlmICh1bmxpa2VseSghKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19DT1AxWCkpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworLyogVmVyaWZ5IHRoYXQgdGhlIHByb2Nlc3NvciBpcyBydW5uaW5nIHdpdGggNjQtYml0IGZsb2F0aW5nLXBvaW50CisgICBvcGVyYXRpb25zIGVuYWJsZWQuICAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfY3AxXzY0Yml0bW9kZShEaXNhc0NvbnRleHQgKmN0eCkKK3sKKyAgICBpZiAodW5saWtlbHkofmN0eC0+aGZsYWdzICYgKE1JUFNfSEZMQUdfRjY0IHwgTUlQU19IRkxBR19DT1AxWCkpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworLyoKKyAqIFZlcmlmeSBpZiBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpcyB2YWxpZDsgYW4gb3BlcmF0aW9uIGlzIG5vdCBkZWZpbmVkCisgKiBpZiBiaXQgMCBvZiBhbnkgcmVnaXN0ZXIgc3BlY2lmaWNhdGlvbiBpcyBzZXQgYW5kIHRoZSBGUiBiaXQgaW4gdGhlCisgKiBTdGF0dXMgcmVnaXN0ZXIgZXF1YWxzIHplcm8sIHNpbmNlIHRoZSByZWdpc3RlciBudW1iZXJzIHNwZWNpZnkgYW4KKyAqIGV2ZW4tb2RkIHBhaXIgb2YgYWRqYWNlbnQgY29wcm9jZXNzb3IgZ2VuZXJhbCByZWdpc3RlcnMuIFdoZW4gdGhlIEZSIGJpdAorICogaW4gdGhlIFN0YXR1cyByZWdpc3RlciBlcXVhbHMgb25lLCBib3RoIGV2ZW4gYW5kIG9kZCByZWdpc3RlciBudW1iZXJzCisgKiBhcmUgdmFsaWQuIFRoaXMgbGltaXRhdGlvbiBleGlzdHMgb25seSBmb3IgNjQgYml0IHdpZGUgKGQsbCxwcykgcmVnaXN0ZXJzLgorICoKKyAqIE11bHRpcGxlIDY0IGJpdCB3aWRlIHJlZ2lzdGVycyBjYW4gYmUgY2hlY2tlZCBieSBjYWxsaW5nCisgKiBnZW5fb3BfY3AxX3JlZ2lzdGVycyhmcmVnMSB8IGZyZWcyIHwgLi4uIHwgZnJlZ04pOworICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfY3AxX3JlZ2lzdGVycyhEaXNhc0NvbnRleHQgKmN0eCwgaW50IHJlZ3MpCit7CisgICAgaWYgKHVubGlrZWx5KCEoY3R4LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0Y2NCkgJiYgKHJlZ3MgJiAxKSkpCisgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworfQorCisvKiBWZXJpZnkgdGhhdCB0aGUgcHJvY2Vzc29yIGlzIHJ1bm5pbmcgd2l0aCBEU1AgaW5zdHJ1Y3Rpb25zIGVuYWJsZWQuCisgICBUaGlzIGlzIGVuYWJsZWQgYnkgQ1AwIFN0YXR1cyByZWdpc3RlciBNWCgyNCkgYml0LgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19kc3AoRGlzYXNDb250ZXh0ICpjdHgpCit7CisgICAgaWYgKHVubGlrZWx5KCEoY3R4LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0RTUCkpKSB7CisgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfRFNQRElTKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19kc3ByMihEaXNhc0NvbnRleHQgKmN0eCkKK3sKKyAgICBpZiAodW5saWtlbHkoIShjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfRFNQUjIpKSkgeworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX0RTUERJUyk7CisgICAgfQorfQorCisvKiBUaGlzIGNvZGUgZ2VuZXJhdGVzIGEgInJlc2VydmVkIGluc3RydWN0aW9uIiBleGNlcHRpb24gaWYgdGhlCisgICBDUFUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGNvcnJlc3BvbmRpbmcgdG8gZmxhZ3MuICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfaW5zbihDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIGludCBmbGFncykKK3sKKyAgICBpZiAodW5saWtlbHkoIShlbnYtPmluc25fZmxhZ3MgJiBmbGFncykpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworLyogVGhpcyBjb2RlIGdlbmVyYXRlcyBhICJyZXNlcnZlZCBpbnN0cnVjdGlvbiIgZXhjZXB0aW9uIGlmIDY0LWJpdAorICAgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgZW5hYmxlZC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19taXBzXzY0KERpc2FzQ29udGV4dCAqY3R4KQoreworICAgIGlmICh1bmxpa2VseSghKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR182NCkpKQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworLyogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuICovCisjZGVmaW5lIE9QX0xEKGluc24sZm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcF9sZHN0XyMjaW5zbihUQ0d2IHJldCwgVENHdiBhcmcxLCBEaXNhc0NvbnRleHQgKmN0eCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9xZW11XyMjZm5hbWUocmV0LCBhcmcxLCBjdHgtPm1lbV9pZHgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK09QX0xEKGxiLGxkOHMpOworT1BfTEQobGJ1LGxkOHUpOworT1BfTEQobGgsbGQxNnMpOworT1BfTEQobGh1LGxkMTZ1KTsKK09QX0xEKGx3LGxkMzJzKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitPUF9MRChsd3UsbGQzMnUpOworT1BfTEQobGQsbGQ2NCk7CisjZW5kaWYKKyN1bmRlZiBPUF9MRAorCisjZGVmaW5lIE9QX1NUKGluc24sZm5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgb3BfbGRzdF8jI2luc24oVENHdiBhcmcxLCBUQ0d2IGFyZzIsIERpc2FzQ29udGV4dCAqY3R4KSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9xZW11XyMjZm5hbWUoYXJnMSwgYXJnMiwgY3R4LT5tZW1faWR4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitPUF9TVChzYixzdDgpOworT1BfU1Qoc2gsc3QxNik7CitPUF9TVChzdyxzdDMyKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitPUF9TVChzZCxzdDY0KTsKKyNlbmRpZgorI3VuZGVmIE9QX1NUCisKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisjZGVmaW5lIE9QX0xEX0FUT01JQyhpbnNuLGZuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgb3BfbGRzdF8jI2luc24oVENHdiByZXQsIFRDR3YgYXJnMSwgRGlzYXNDb250ZXh0ICpjdHgpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9tb3ZfdGwodDAsIGFyZzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9xZW11XyMjZm5hbWUocmV0LCBhcmcxLCBjdHgtPm1lbV9pZHgpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9zdF90bCh0MCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBsbGFkZHIpKTsgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fc3RfdGwocmV0LCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGxsdmFsKSk7ICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIE9QX0xEX0FUT01JQyhpbnNuLGZuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgb3BfbGRzdF8jI2luc24oVENHdiByZXQsIFRDR3YgYXJnMSwgRGlzYXNDb250ZXh0ICpjdHgpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2VuX2hlbHBlcl8zaShpbnNuLCByZXQsIGNwdV9lbnYsIGFyZzEsIGN0eC0+bWVtX2lkeCk7ICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYKK09QX0xEX0FUT01JQyhsbCxsZDMycyk7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorT1BfTERfQVRPTUlDKGxsZCxsZDY0KTsKKyNlbmRpZgorI3VuZGVmIE9QX0xEX0FUT01JQworCisjaWZkZWYgQ09ORklHX1VTRVJfT05MWQorI2RlZmluZSBPUF9TVF9BVE9NSUMoaW5zbixmbmFtZSxsZG5hbWUsYWxtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIHZvaWQgb3BfbGRzdF8jI2luc24oVENHdiBhcmcxLCBUQ0d2IGFyZzIsIGludCBydCwgRGlzYXNDb250ZXh0ICpjdHgpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbDIgPSBnZW5fbmV3X2xhYmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCBhcmcyLCBhbG1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfRVEsIHQwLCAwLCBsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fc3RfdGwoYXJnMiwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQmFkVkFkZHIpKTsgICAgICAgICAgXAorICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfQWRFUyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2VuX3NldF9sYWJlbChsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX2xkX3RsKHQwLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGxsYWRkcikpOyAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX2JyY29uZF90bChUQ0dfQ09ORF9ORSwgYXJnMiwgdDAsIGwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRjZ19nZW5fbW92aV90bCh0MCwgcnQgfCAoKGFsbWFzayA8PCAzKSAmIDB4MjApKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9zdF90bCh0MCwgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBsbHJlZykpOyAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX2dlbl9zdF90bChhcmcxLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGxsbmV3dmFsKSk7ICAgICAgICAgICAgICBcCisgICAgZ2VuX2hlbHBlcl8xaShyYWlzZV9leGNlcHRpb24sIGNwdV9lbnYsIEVYQ1BfU0MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2VuX3NldF9sYWJlbChsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX3RlbXBfZnJlZSh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIE9QX1NUX0FUT01JQyhpbnNuLGZuYW1lLGxkbmFtZSxhbG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcF9sZHN0XyMjaW5zbihUQ0d2IGFyZzEsIFRDR3YgYXJnMiwgaW50IHJ0LCBEaXNhc0NvbnRleHQgKmN0eCkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZW5faGVscGVyXzRpKGluc24sIHQwLCBjcHVfZW52LCBhcmcxLCBhcmcyLCBjdHgtPm1lbV9pZHgpOyAgICAgICAgICAgICAgXAorICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGNnX3RlbXBfZnJlZSh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZgorT1BfU1RfQVRPTUlDKHNjLHN0MzIsbGQzMnMsMHgzKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCitPUF9TVF9BVE9NSUMoc2NkLHN0NjQsbGQ2NCwweDcpOworI2VuZGlmCisjdW5kZWYgT1BfU1RfQVRPTUlDCisKKy8qIExvYWQgYW5kIHN0b3JlICovCitzdGF0aWMgdm9pZCBnZW5fbGRzdCAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywgaW50IHJ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlLCBpbnQxNl90IG9mZnNldCkKK3sKKyAgICBjb25zdCBjaGFyICogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImxkc3QiOworICAgIFRDR3YgdDAsIHQxLCB0MjsKKworICAgIHQwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGlmIChiYXNlID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBiYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIG9mZnNldCk7CisgICAgICAgIGdlbl9vcF9hZGRyX2FkZChjdHgsIHQwLCBjcHVfZ3ByW2Jhc2VdLCB0MCk7CisgICAgfQorICAgIC8qIERvbid0IGRvIE5PUCBpZiBkZXN0aW5hdGlvbiBpcyB6ZXJvOiB3ZSBtdXN0IHBlcmZvcm0gdGhlIGFjdHVhbAorICAgICAgIG1lbW9yeSBhY2Nlc3MuICovCisgICAgc3dpdGNoIChvcGMpIHsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfTFdVOgorICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICBvcF9sZHN0X2x3dSh0MCwgdDAsIGN0eCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImx3dSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0xEOgorICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICBvcF9sZHN0X2xkKHQwLCB0MCwgY3R4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibGQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19MTEQ6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgICAgIG9wX2xkc3RfbGxkKHQwLCB0MCwgY3R4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibGxkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU0Q6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICBvcF9sZHN0X3NkKHQxLCB0MCwgY3R4KTsKKyAgICAgICAgb3BuID0gInNkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTERMOgorICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQwLCA3KTsKKyNpZm5kZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwodDEsIHQxLCA3KTsKKyNlbmRpZgorICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDEsIHQxLCAzKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfjcpOworICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQ2NCh0MCwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgIHRjZ19nZW5fc2hsX3RsKHQwLCB0MCwgdDEpOworICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwodDEsIHQxLCA2Myk7CisgICAgICAgIHQyID0gdGNnX2NvbnN0X3RsKDB4N2ZmZmZmZmZmZmZmZmZmZnVsbCk7CisgICAgICAgIHRjZ19nZW5fc2hyX3RsKHQyLCB0MiwgdDEpOworICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICAgICAgdGNnX2dlbl9hbmRfdGwodDEsIHQxLCB0Mik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgICAgICB0Y2dfZ2VuX29yX3RsKHQwLCB0MCwgdDEpOworICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgIG9wbiA9ICJsZGwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TREw6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICBnZW5faGVscGVyXzNpKHNkbCwgY3B1X2VudiwgdDEsIHQwLCBjdHgtPm1lbV9pZHgpOworICAgICAgICBvcG4gPSAic2RsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTERSOgorICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQwLCA3KTsKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgICAgIHRjZ19nZW5feG9yaV90bCh0MSwgdDEsIDcpOworI2VuZGlmCisgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MSwgdDEsIDMpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCB+Nyk7CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KHQwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgdGNnX2dlbl9zaHJfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIHRjZ19nZW5feG9yaV90bCh0MSwgdDEsIDYzKTsKKyAgICAgICAgdDIgPSB0Y2dfY29uc3RfdGwoMHhmZmZmZmZmZmZmZmZmZmZldWxsKTsKKyAgICAgICAgdGNnX2dlbl9zaGxfdGwodDIsIHQyLCB0MSk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0Mik7CisgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImxkciI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1NEUjoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBydCk7CisgICAgICAgIGdlbl9oZWxwZXJfM2koc2RyLCBjcHVfZW52LCB0MSwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgIG9wbiA9ICJzZHIiOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgT1BDX0xXOgorICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICBvcF9sZHN0X2x3KHQwLCB0MCwgY3R4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibHciOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TVzoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAwKTsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBydCk7CisgICAgICAgIG9wX2xkc3Rfc3codDEsIHQwLCBjdHgpOworICAgICAgICBvcG4gPSAic3ciOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19MSDoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAwKTsKKyAgICAgICAgb3BfbGRzdF9saCh0MCwgdDAsIGN0eCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImxoIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU0g6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICBvcF9sZHN0X3NoKHQxLCB0MCwgY3R4KTsKKyAgICAgICAgb3BuID0gInNoIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTEhVOgorICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICBvcF9sZHN0X2xodSh0MCwgdDAsIGN0eCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImxodSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0xCOgorICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICBvcF9sZHN0X2xiKHQwLCB0MCwgY3R4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibGIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TQjoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAwKTsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBydCk7CisgICAgICAgIG9wX2xkc3Rfc2IodDEsIHQwLCBjdHgpOworICAgICAgICBvcG4gPSAic2IiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19MQlU6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgICAgIG9wX2xkc3RfbGJ1KHQwLCB0MCwgY3R4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibGJ1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTFdMOgorICAgICAgICB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQwLCAzKTsKKyNpZm5kZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwodDEsIHQxLCAzKTsKKyNlbmRpZgorICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDEsIHQxLCAzKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfjMpOworICAgICAgICB0Y2dfZ2VuX3FlbXVfbGRfdGwodDAsIHQwLCBjdHgtPm1lbV9pZHgsIE1PX1RFVUwpOworICAgICAgICB0Y2dfZ2VuX3NobF90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX2dlbl94b3JpX3RsKHQxLCB0MSwgMzEpOworICAgICAgICB0MiA9IHRjZ19jb25zdF90bCgweDdmZmZmZmZmdWxsKTsKKyAgICAgICAgdGNnX2dlbl9zaHJfdGwodDIsIHQyLCB0MSk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0Mik7CisgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bCh0MCwgdDApOworICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgIG9wbiA9ICJsd2wiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TV0w6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgICAgICBnZW5faGVscGVyXzNpKHN3bCwgY3B1X2VudiwgdDEsIHQwLCBjdHgtPm1lbV9pZHgpOworICAgICAgICBvcG4gPSAic3dsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTFdSOgorICAgICAgICB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQwLCAzKTsKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgICAgIHRjZ19nZW5feG9yaV90bCh0MSwgdDEsIDMpOworI2VuZGlmCisgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MSwgdDEsIDMpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCB+Myk7CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZF90bCh0MCwgdDAsIGN0eC0+bWVtX2lkeCwgTU9fVEVVTCk7CisgICAgICAgIHRjZ19nZW5fc2hyX3RsKHQwLCB0MCwgdDEpOworICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwodDEsIHQxLCAzMSk7CisgICAgICAgIHQyID0gdGNnX2NvbnN0X3RsKDB4ZmZmZmZmZmV1bGwpOworICAgICAgICB0Y2dfZ2VuX3NobF90bCh0MiwgdDIsIHQxKTsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBydCk7CisgICAgICAgIHRjZ19nZW5fYW5kX3RsKHQxLCB0MSwgdDIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHQyKTsKKyAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKHQwLCB0MCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImx3ciI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1NXUjoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBydCk7CisgICAgICAgIGdlbl9oZWxwZXJfM2koc3dyLCBjcHVfZW52LCB0MSwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgIG9wbiA9ICJzd3IiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19MTDoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgb3BfbGRzdF9sbCh0MCwgdDAsIGN0eCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE1JUFNfREVCVUcoIiVzICVzLCAlZCglcykiLCBvcG4sIHJlZ25hbWVzW3J0XSwgb2Zmc2V0LCByZWduYW1lc1tiYXNlXSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7Cit9CisKKy8qIFN0b3JlIGNvbmRpdGlvbmFsICovCitzdGF0aWMgdm9pZCBnZW5fc3RfY29uZCAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywgaW50IHJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlLCBpbnQxNl90IG9mZnNldCkKK3sKKyAgICBjb25zdCBjaGFyICogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gInN0X2NvbmQiOworICAgIFRDR3YgdDAsIHQxOworCisgICAgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKworICAgIGlmIChiYXNlID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBiYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIG9mZnNldCk7CisgICAgICAgIGdlbl9vcF9hZGRyX2FkZChjdHgsIHQwLCBjcHVfZ3ByW2Jhc2VdLCB0MCk7CisgICAgfQorICAgIC8qIERvbid0IGRvIE5PUCBpZiBkZXN0aW5hdGlvbiBpcyB6ZXJvOiB3ZSBtdXN0IHBlcmZvcm0gdGhlIGFjdHVhbAorICAgICAgIG1lbW9yeSBhY2Nlc3MuICovCisKKyAgICB0MSA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworICAgIHN3aXRjaCAob3BjKSB7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX1NDRDoKKyAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAwKTsKKyAgICAgICAgb3BfbGRzdF9zY2QodDEsIHQwLCBydCwgY3R4KTsKKyAgICAgICAgb3BuID0gInNjZCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBPUENfU0M6CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgIG9wX2xkc3Rfc2ModDEsIHQwLCBydCwgY3R4KTsKKyAgICAgICAgb3BuID0gInNjIjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE1JUFNfREVCVUcoIiVzICVzLCAlZCglcykiLCBvcG4sIHJlZ25hbWVzW3J0XSwgb2Zmc2V0LCByZWduYW1lc1tiYXNlXSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7Cit9CisKKy8qIExvYWQgYW5kIHN0b3JlICovCitzdGF0aWMgdm9pZCBnZW5fZmx0X2xkc3QgKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsIGludCBmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGludDE2X3Qgb2Zmc2V0KQoreworICAgIGNvbnN0IGNoYXIgKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiZmx0X2xkc3QiOworICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGlmIChiYXNlID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBiYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIG9mZnNldCk7CisgICAgICAgIGdlbl9vcF9hZGRyX2FkZChjdHgsIHQwLCBjcHVfZ3ByW2Jhc2VdLCB0MCk7CisgICAgfQorICAgIC8qIERvbid0IGRvIE5PUCBpZiBkZXN0aW5hdGlvbiBpcyB6ZXJvOiB3ZSBtdXN0IHBlcmZvcm0gdGhlIGFjdHVhbAorICAgICAgIG1lbW9yeSBhY2Nlc3MuICovCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19MV0MxOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDMycyh0MCwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihmcDAsIHQwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZ0KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImx3YzEiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TV0MxOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2IHQxID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnQpOworICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bCh0MSwgZnAwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9zdDMyKHQxLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAic3djMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0xEQzE6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9xZW11X2xkNjQoZnAwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZnQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibGRjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1NEQzE6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZ0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9zdDY0KGZwMCwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJzZGMxIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTChvcG4pOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIE1JUFNfREVCVUcoIiVzICVzLCAlZCglcykiLCBvcG4sIGZyZWduYW1lc1tmdF0sIG9mZnNldCwgcmVnbmFtZXNbYmFzZV0pOworIG91dDoKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKK30KKworLyogQXJpdGhtZXRpYyB3aXRoIGltbWVkaWF0ZSBvcGVyYW5kICovCitzdGF0aWMgdm9pZCBnZW5fYXJpdGhfaW1tIChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydCwgaW50IHJzLCBpbnQxNl90IGltbSkKK3sKKyAgICB0YXJnZXRfdWxvbmcgdWltbSA9ICh0YXJnZXRfbG9uZylpbW07IC8qIFNpZ24gZXh0ZW5kIHRvIDMyLzY0IGJpdHMgKi8KKyAgICBjb25zdCBjaGFyICogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImltbSBhcml0aCI7CisKKyAgICBpZiAocnQgPT0gMCAmJiBvcGMgIT0gT1BDX0FEREkgJiYgb3BjICE9IE9QQ19EQURESSkgeworICAgICAgICAvKiBJZiBubyBkZXN0aW5hdGlvbiwgdHJlYXQgaXQgYXMgYSBOT1AuCisgICAgICAgICAgIEZvciBhZGRpLCB3ZSBtdXN0IGdlbmVyYXRlIHRoZSBvdmVyZmxvdyBleGNlcHRpb24gd2hlbiBuZWVkZWQuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfQURESToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgVENHdiB0MiA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV90bCh0MCwgdDEsIHVpbW0pOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwodDAsIHQwKTsKKworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHQxLCB0MSwgfnVpbW0pOworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHQyLCB0MCwgdWltbSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0dFLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICAvKiBvcGVyYW5kcyBvZiBzYW1lIHNpZ24sIHJlc3VsdCBkaWZmZXJlbnQgc2lnbiAqLworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9PVkVSRkxPVyk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKHQwLCB0MCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYWRkaSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0FERElVOgorICAgICAgICBpZiAocnMgIT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9hZGRpX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3JzXSwgdWltbSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcnRdLCB1aW1tKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYWRkaXUiOworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfREFEREk6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICAgICAgICAgIFRDR3YgdDIgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBycyk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZGlfdGwodDAsIHQxLCB1aW1tKTsKKworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHQxLCB0MSwgfnVpbW0pOworICAgICAgICAgICAgdGNnX2dlbl94b3JpX3RsKHQyLCB0MCwgdWltbSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0dFLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICAvKiBvcGVyYW5kcyBvZiBzYW1lIHNpZ24sIHJlc3VsdCBkaWZmZXJlbnQgc2lnbiAqLworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9PVkVSRkxPVyk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkYWRkaSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RBRERJVToKKyAgICAgICAgaWYgKHJzICE9IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkaV90bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltyc10sIHVpbW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcnRdLCB1aW1tKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiZGFkZGl1IjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAiIFRBUkdFVF9GTVRfbHgsIG9wbiwgcmVnbmFtZXNbcnRdLCByZWduYW1lc1tyc10sIHVpbW0pOworfQorCisvKiBMb2dpYyB3aXRoIGltbWVkaWF0ZSBvcGVyYW5kICovCitzdGF0aWMgdm9pZCBnZW5fbG9naWNfaW1tIChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgb3BjLCBpbnQgcnQsIGludCBycywgaW50MTZfdCBpbW0pCit7CisgICAgdGFyZ2V0X3Vsb25nIHVpbW07CisgICAgY29uc3QgY2hhciAqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9wbiA9ICJpbW0gbG9naWMiOworCisgICAgaWYgKHJ0ID09IDApIHsKKyAgICAgICAgLyogSWYgbm8gZGVzdGluYXRpb24sIHRyZWF0IGl0IGFzIGEgTk9QLiAqLworICAgICAgICBNSVBTX0RFQlVHKCJOT1AiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW1tID0gKHVpbnQxNl90KWltbTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX0FOREk6CisgICAgICAgIGlmIChsaWtlbHkocnMgIT0gMCkpCisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnNdLCB1aW1tKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcnRdLCAwKTsKKyAgICAgICAgb3BuID0gImFuZGkiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19PUkk6CisgICAgICAgIGlmIChycyAhPSAwKQorICAgICAgICAgICAgdGNnX2dlbl9vcmlfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnNdLCB1aW1tKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcnRdLCB1aW1tKTsKKyAgICAgICAgb3BuID0gIm9yaSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1hPUkk6CisgICAgICAgIGlmIChsaWtlbHkocnMgIT0gMCkpCisgICAgICAgICAgICB0Y2dfZ2VuX3hvcmlfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnNdLCB1aW1tKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcnRdLCB1aW1tKTsKKyAgICAgICAgb3BuID0gInhvcmkiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19MVUk6CisgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3J0XSwgaW1tIDw8IDE2KTsKKyAgICAgICAgb3BuID0gImx1aSI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlcyAlcywgJXMsICIgVEFSR0VUX0ZNVF9seCwgb3BuLCByZWduYW1lc1tydF0sIHJlZ25hbWVzW3JzXSwgdWltbSk7Cit9CisKKy8qIFNldCBvbiBsZXNzIHRoYW4gd2l0aCBpbW1lZGlhdGUgb3BlcmFuZCAqLworc3RhdGljIHZvaWQgZ2VuX3NsdF9pbW0gKENQVU1JUFNTdGF0ZSAqZW52LCB1aW50MzJfdCBvcGMsIGludCBydCwgaW50IHJzLCBpbnQxNl90IGltbSkKK3sKKyAgICB0YXJnZXRfdWxvbmcgdWltbSA9ICh0YXJnZXRfbG9uZylpbW07IC8qIFNpZ24gZXh0ZW5kIHRvIDMyLzY0IGJpdHMgKi8KKyAgICBjb25zdCBjaGFyICogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImltbSBhcml0aCI7CisgICAgVENHdiB0MDsKKworICAgIGlmIChydCA9PSAwKSB7CisgICAgICAgIC8qIElmIG5vIGRlc3RpbmF0aW9uLCB0cmVhdCBpdCBhcyBhIE5PUC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX1NMVEk6CisgICAgICAgIGdlbl9vcF9sdGkoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgb3BuID0gInNsdGkiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TTFRJVToKKyAgICAgICAgZ2VuX29wX2x0aXUoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgb3BuID0gInNsdGl1IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIE1JUFNfREVCVUcoIiVzICVzLCAlcywgIiBUQVJHRVRfRk1UX2x4LCBvcG4sIHJlZ25hbWVzW3J0XSwgcmVnbmFtZXNbcnNdLCB1aW1tKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKK30KKworLyogU2hpZnRzIHdpdGggaW1tZWRpYXRlIG9wZXJhbmQgKi8KK3N0YXRpYyB2b2lkIGdlbl9zaGlmdF9pbW0oQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBydCwgaW50IHJzLCBpbnQxNl90IGltbSkKK3sKKyAgICB0YXJnZXRfdWxvbmcgdWltbSA9ICgodWludDE2X3QpaW1tKSAmIDB4MWY7CisgICAgY29uc3QgY2hhciogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImltbSBzaGlmdCI7CisgICAgVENHdiB0MDsKKworICAgIGlmIChydCA9PSAwKSB7CisgICAgICAgIC8qIElmIG5vIGRlc3RpbmF0aW9uLCB0cmVhdCBpdCBhcyBhIE5PUC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIGdlbl9sb2FkX2dwcih0MCwgcnMpOworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfU0xMOgorICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDAsIHQwLCB1aW1tKTsKKyAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltydF0sIHQwKTsKKyAgICAgICAgb3BuID0gInNsbCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1NSQToKKyAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwodDAsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSk7CisgICAgICAgIG9wbiA9ICJzcmEiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TUkw6CisgICAgICAgIHN3aXRjaCAoKGN0eC0+b3Bjb2RlID4+IDIxKSAmIDB4MWYpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKHVpbW0gIT0gMCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQwLCB0MCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcnRdLCB0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcG4gPSAic3JsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiByb3RyIGlzIGRlY29kZWQgYXMgc3JsIG9uIG5vbi1SMiBDUFVzICovCisgICAgICAgICAgICBpZiAoZW52LT5pbnNuX2ZsYWdzICYgSVNBX01JUFMzMlIyKSB7CisgICAgICAgICAgICAgICAgaWYgKHVpbW0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMih0MSwgdDApOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3JvdHJpX2kzMih0MSwgdDEsIHVpbW0pOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfdGwoY3B1X2dwcltydF0sIHQxKTsKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcnRdLCB0MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wbiA9ICJyb3RyIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHVpbW0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bCh0MCwgdDApOworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3J0XSwgdDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcG4gPSAic3JsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTUlQU19JTlZBTCgiaW52YWxpZCBzcmwgZmxhZyIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfRFNMTDoKKyAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSk7CisgICAgICAgIG9wbiA9ICJkc2xsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRFNSQToKKyAgICAgICAgdGNnX2dlbl9zYXJpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSk7CisgICAgICAgIG9wbiA9ICJkc3JhIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRFNSTDoKKyAgICAgICAgc3dpdGNoICgoY3R4LT5vcGNvZGUgPj4gMjEpICYgMHgxZikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgICAgIG9wbiA9ICJkc3JsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiBkcm90ciBpcyBkZWNvZGVkIGFzIGRzcmwgb24gbm9uLVIyIENQVXMgKi8KKyAgICAgICAgICAgIGlmIChlbnYtPmluc25fZmxhZ3MgJiBJU0FfTUlQUzMyUjIpIHsKKyAgICAgICAgICAgICAgICBpZiAodWltbSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fcm90cmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3J0XSwgdDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcG4gPSAiZHJvdHIiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tKTsKKyAgICAgICAgICAgICAgICBvcG4gPSAiZHNybCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1JUFNfSU5WQUwoImludmFsaWQgZHNybCBmbGFnIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RTTEwzMjoKKyAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSArIDMyKTsKKyAgICAgICAgb3BuID0gImRzbGwzMiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RTUkEzMjoKKyAgICAgICAgdGNnX2dlbl9zYXJpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSArIDMyKTsKKyAgICAgICAgb3BuID0gImRzcmEzMiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RTUkwzMjoKKyAgICAgICAgc3dpdGNoICgoY3R4LT5vcGNvZGUgPj4gMjEpICYgMHgxZikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tICsgMzIpOworICAgICAgICAgICAgb3BuID0gImRzcmwzMiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgLyogZHJvdHIzMiBpcyBkZWNvZGVkIGFzIGRzcmwzMiBvbiBub24tUjIgQ1BVcyAqLworICAgICAgICAgICAgaWYgKGVudi0+aW5zbl9mbGFncyAmIElTQV9NSVBTMzJSMikgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fcm90cmlfdGwoY3B1X2dwcltydF0sIHQwLCB1aW1tICsgMzIpOworICAgICAgICAgICAgICAgIG9wbiA9ICJkcm90cjMyIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9ncHJbcnRdLCB0MCwgdWltbSArIDMyKTsKKyAgICAgICAgICAgICAgICBvcG4gPSAiZHNybDMyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTUlQU19JTlZBTCgiaW52YWxpZCBkc3JsMzIgZmxhZyIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlcyAlcywgJXMsICIgVEFSR0VUX0ZNVF9seCwgb3BuLCByZWduYW1lc1tydF0sIHJlZ25hbWVzW3JzXSwgdWltbSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7Cit9CisKKy8qIEFyaXRobWV0aWMgKi8KK3N0YXRpYyB2b2lkIGdlbl9hcml0aCAoQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCByZCwgaW50IHJzLCBpbnQgcnQpCit7CisgICAgY29uc3QgY2hhciogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImFyaXRoIjsKKworICAgIGlmIChyZCA9PSAwICYmIG9wYyAhPSBPUENfQUREICYmIG9wYyAhPSBPUENfU1VCCisgICAgICAgJiYgb3BjICE9IE9QQ19EQUREICYmIG9wYyAhPSBPUENfRFNVQikgeworICAgICAgICAvKiBJZiBubyBkZXN0aW5hdGlvbiwgdHJlYXQgaXQgYXMgYSBOT1AuCisgICAgICAgICAgIEZvciBhZGQgJiBzdWIsIHdlIG11c3QgZ2VuZXJhdGUgdGhlIG92ZXJmbG93IGV4Y2VwdGlvbiB3aGVuIG5lZWRlZC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX0FERDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgVENHdiB0MiA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MiwgcnQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRfdGwodDAsIHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bCh0MCwgdDApOworICAgICAgICAgICAgdGNnX2dlbl94b3JfdGwodDEsIHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX25vdF90bCh0MSwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl94b3JfdGwodDIsIHQwLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0dFLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICAvKiBvcGVyYW5kcyBvZiBzYW1lIHNpZ24sIHJlc3VsdCBkaWZmZXJlbnQgc2lnbiAqLworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9PVkVSRkxPVyk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJhZGQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19BRERVOgorICAgICAgICBpZiAocnMgIT0gMCAmJiBydCAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZF90bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltyc10sIGNwdV9ncHJbcnRdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JkXSk7CisgICAgICAgIH0gZWxzZSBpZiAocnMgPT0gMCAmJiBydCAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzICE9IDAgJiYgcnQgPT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JkXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImFkZHUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TVUI6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXcoKTsKKyAgICAgICAgICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICAgICAgICAgIFRDR3YgdDIgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBycyk7CisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDIsIHJ0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKHQwLCB0MSwgdDIpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwodDAsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5feG9yX3RsKHQyLCB0MSwgdDIpOworICAgICAgICAgICAgdGNnX2dlbl94b3JfdGwodDEsIHQwLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZF90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDIpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0dFLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICAvKiBvcGVyYW5kcyBvZiBkaWZmZXJlbnQgc2lnbiwgZmlyc3Qgb3BlcmFuZCBhbmQgcmVzdWx0IGRpZmZlcmVudCBzaWduICovCisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX09WRVJGTE9XKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN1YiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1NVQlU6CisgICAgICAgIGlmIChycyAhPSAwICYmIHJ0ICE9IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSwgY3B1X2dwcltydF0pOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcmRdKTsKKyAgICAgICAgfSBlbHNlIGlmIChycyA9PSAwICYmIHJ0ICE9IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbmVnX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltyZF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzICE9IDAgJiYgcnQgPT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JkXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN1YnUiOworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfREFERDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgVENHdiB0MiA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MiwgcnQpOworICAgICAgICAgICAgdGNnX2dlbl9hZGRfdGwodDAsIHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3hvcl90bCh0MSwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbm90X3RsKHQxLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3hvcl90bCh0MiwgdDAsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kX3RsKHQxLCB0MSwgdDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfR0UsIHQxLCAwLCBsMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKKyAgICAgICAgICAgIC8qIG9wZXJhbmRzIG9mIHNhbWUgc2lnbiwgcmVzdWx0IGRpZmZlcmVudCBzaWduICovCisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX09WRVJGTE9XKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImRhZGQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19EQUREVToKKyAgICAgICAgaWYgKHJzICE9IDAgJiYgcnQgIT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9hZGRfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgIH0gZWxzZSBpZiAocnMgPT0gMCAmJiBydCAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzICE9IDAgJiYgcnQgPT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JkXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImRhZGR1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRFNVQjoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgVENHdiB0MiA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MiwgcnQpOworICAgICAgICAgICAgdGNnX2dlbl9zdWJfdGwodDAsIHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3hvcl90bCh0MiwgdDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5feG9yX3RsKHQxLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9hbmRfdGwodDEsIHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9HRSwgdDEsIDAsIGwxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICAgICAgLyogb3BlcmFuZHMgb2YgZGlmZmVyZW50IHNpZ24sIGZpcnN0IG9wZXJhbmQgYW5kIHJlc3VsdCBkaWZmZXJlbnQgc2lnbiAqLworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9PVkVSRkxPVyk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkc3ViIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRFNVQlU6CisgICAgICAgIGlmIChycyAhPSAwICYmIHJ0ICE9IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fc3ViX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzID09IDAgJiYgcnQgIT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9uZWdfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnRdKTsKKyAgICAgICAgfSBlbHNlIGlmIChycyAhPSAwICYmIHJ0ID09IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZF0sIDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkc3VidSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBPUENfTVVMOgorICAgICAgICBpZiAobGlrZWx5KHJzICE9IDAgJiYgcnQgIT0gMCkpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbXVsX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSwgY3B1X2dwcltydF0pOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcmRdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JkXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm11bCI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlcyAlcywgJXMsICVzIiwgb3BuLCByZWduYW1lc1tyZF0sIHJlZ25hbWVzW3JzXSwgcmVnbmFtZXNbcnRdKTsKK30KKworLyogQ29uZGl0aW9uYWwgbW92ZSAqLworc3RhdGljIHZvaWQgZ2VuX2NvbmRfbW92ZSAoQ1BVTUlQU1N0YXRlICplbnYsIHVpbnQzMl90IG9wYywgaW50IHJkLCBpbnQgcnMsIGludCBydCkKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiY29uZCBtb3ZlIjsKKyAgICBpbnQgbDE7CisKKyAgICBpZiAocmQgPT0gMCkgeworICAgICAgICAvKiBJZiBubyBkZXN0aW5hdGlvbiwgdHJlYXQgaXQgYXMgYSBOT1AuCisgICAgICAgICAgIEZvciBhZGQgJiBzdWIsIHdlIG11c3QgZ2VuZXJhdGUgdGhlIG92ZXJmbG93IGV4Y2VwdGlvbiB3aGVuIG5lZWRlZC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX01PVk46CisgICAgICAgIGlmIChsaWtlbHkocnQgIT0gMCkpCisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfRVEsIGNwdV9ncHJbcnRdLCAwLCBsMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRjZ19nZW5fYnIobDEpOworICAgICAgICBvcG4gPSAibW92biI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX01PVlo6CisgICAgICAgIGlmIChsaWtlbHkocnQgIT0gMCkpCisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIGNwdV9ncHJbcnRdLCAwLCBsMSk7CisgICAgICAgIG9wbiA9ICJtb3Z6IjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChycyAhPSAwKQorICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltyc10pOworICAgIGVsc2UKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcmRdLCAwKTsKKyAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKworICAgIE1JUFNfREVCVUcoIiVzICVzLCAlcywgJXMiLCBvcG4sIHJlZ25hbWVzW3JkXSwgcmVnbmFtZXNbcnNdLCByZWduYW1lc1tydF0pOworfQorCisvKiBMb2dpYyAqLworc3RhdGljIHZvaWQgZ2VuX2xvZ2ljIChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgb3BjLCBpbnQgcmQsIGludCBycywgaW50IHJ0KQoreworICAgIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9wbiA9ICJsb2dpYyI7CisKKyAgICBpZiAocmQgPT0gMCkgeworICAgICAgICAvKiBJZiBubyBkZXN0aW5hdGlvbiwgdHJlYXQgaXQgYXMgYSBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19BTkQ6CisgICAgICAgIGlmIChsaWtlbHkocnMgIT0gMCAmJiBydCAhPSAwKSkgeworICAgICAgICAgICAgdGNnX2dlbl9hbmRfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZF0sIDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJhbmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19OT1I6CisgICAgICAgIGlmIChycyAhPSAwICYmIHJ0ICE9IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbm9yX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzID09IDAgJiYgcnQgIT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9ub3RfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnRdKTsKKyAgICAgICAgfSBlbHNlIGlmIChycyAhPSAwICYmIHJ0ID09IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbm90X3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZF0sIH4oKHRhcmdldF91bG9uZykwKSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm5vciI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX09SOgorICAgICAgICBpZiAobGlrZWx5KHJzICE9IDAgJiYgcnQgIT0gMCkpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgIH0gZWxzZSBpZiAocnMgPT0gMCAmJiBydCAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JkXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzICE9IDAgJiYgcnQgPT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnNdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JkXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm9yIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfWE9SOgorICAgICAgICBpZiAobGlrZWx5KHJzICE9IDAgJiYgcnQgIT0gMCkpIHsKKyAgICAgICAgICAgIHRjZ19nZW5feG9yX3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSwgY3B1X2dwcltydF0pOworICAgICAgICB9IGVsc2UgaWYgKHJzID09IDAgJiYgcnQgIT0gMCkgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZF0sIGNwdV9ncHJbcnRdKTsKKyAgICAgICAgfSBlbHNlIGlmIChycyAhPSAwICYmIHJ0ID09IDApIHsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZF0sIDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJ4b3IiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAlcyIsIG9wbiwgcmVnbmFtZXNbcmRdLCByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSk7Cit9CisKKy8qIFNldCBvbiBsb3dlciB0aGFuICovCitzdGF0aWMgdm9pZCBnZW5fc2x0IChDUFVNSVBTU3RhdGUgKmVudiwgdWludDMyX3Qgb3BjLCBpbnQgcmQsIGludCBycywgaW50IHJ0KQoreworICAgIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9wbiA9ICJzbHQiOworICAgIFRDR3YgdDAsIHQxOworCisgICAgaWYgKHJkID09IDApIHsKKyAgICAgICAgLyogSWYgbm8gZGVzdGluYXRpb24sIHRyZWF0IGl0IGFzIGEgTk9QLiAqLworICAgICAgICBNSVBTX0RFQlVHKCJOT1AiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHQwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX1NMVDoKKyAgICAgICAgZ2VuX29wX2x0KGNwdV9ncHJbcmRdLCB0MCwgdDEpOworICAgICAgICBvcG4gPSAic2x0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU0xUVToKKyAgICAgICAgZ2VuX29wX2x0dShjcHVfZ3ByW3JkXSwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gInNsdHUiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAlcyIsIG9wbiwgcmVnbmFtZXNbcmRdLCByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7Cit9CisKKy8qIFNoaWZ0cyAqLworc3RhdGljIHZvaWQgZ2VuX3NoaWZ0IChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHJkLCBpbnQgcnMsIGludCBydCkKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAic2hpZnRzIjsKKyAgICBUQ0d2IHQwLCB0MTsKKworICAgIGlmIChyZCA9PSAwKSB7CisgICAgICAgIC8qIElmIG5vIGRlc3RpbmF0aW9uLCB0cmVhdCBpdCBhcyBhIE5PUC4KKyAgICAgICAgICAgRm9yIGFkZCAmIHN1Yiwgd2UgbXVzdCBnZW5lcmF0ZSB0aGUgb3ZlcmZsb3cgZXhjZXB0aW9uIHdoZW4gbmVlZGVkLiAqLworICAgICAgICBNSVBTX0RFQlVHKCJOT1AiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHQwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX1NMTFY6CisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIDB4MWYpOworICAgICAgICB0Y2dfZ2VuX3NobF90bCh0MCwgdDEsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIHQwKTsKKyAgICAgICAgb3BuID0gInNsbHYiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TUkFWOgorICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bCh0MSwgdDEpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAweDFmKTsKKyAgICAgICAgdGNnX2dlbl9zYXJfdGwoY3B1X2dwcltyZF0sIHQxLCB0MCk7CisgICAgICAgIG9wbiA9ICJzcmF2IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU1JMVjoKKyAgICAgICAgc3dpdGNoICgoY3R4LT5vcGNvZGUgPj4gNikgJiAweDFmKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQxLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAweDFmKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyX3RsKHQwLCB0MSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIHQwKTsKKyAgICAgICAgICAgIG9wbiA9ICJzcmx2IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiByb3RydiBpcyBkZWNvZGVkIGFzIHNybHYgb24gbm9uLVIyIENQVXMgKi8KKyAgICAgICAgICAgIGlmIChlbnYtPmluc25fZmxhZ3MgJiBJU0FfTUlQUzMyUjIpIHsKKyAgICAgICAgICAgICAgICBUQ0d2X2kzMiB0MiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgICAgICBUQ0d2X2kzMiB0MyA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKHQyLCB0MCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIodDMsIHQxKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQyLCB0MiwgMHgxZik7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9yb3RyX2kzMih0MiwgdDMsIHQyKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfdGwoY3B1X2dwcltyZF0sIHQyKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0Mik7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDMpOworICAgICAgICAgICAgICAgIG9wbiA9ICJyb3RydiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQxLCB0MSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgMHgxZik7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwodDAsIHQxLCB0MCk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIHQwKTsKKyAgICAgICAgICAgICAgICBvcG4gPSAic3JsdiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1JUFNfSU5WQUwoImludmFsaWQgc3JsdiBmbGFnIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICBjYXNlIE9QQ19EU0xMVjoKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgMHgzZik7CisgICAgICAgIHRjZ19nZW5fc2hsX3RsKGNwdV9ncHJbcmRdLCB0MSwgdDApOworICAgICAgICBvcG4gPSAiZHNsbHYiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19EU1JBVjoKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgMHgzZik7CisgICAgICAgIHRjZ19nZW5fc2FyX3RsKGNwdV9ncHJbcmRdLCB0MSwgdDApOworICAgICAgICBvcG4gPSAiZHNyYXYiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19EU1JMVjoKKyAgICAgICAgc3dpdGNoICgoY3R4LT5vcGNvZGUgPj4gNikgJiAweDFmKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIDB4M2YpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJfdGwoY3B1X2dwcltyZF0sIHQxLCB0MCk7CisgICAgICAgICAgICBvcG4gPSAiZHNybHYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIC8qIGRyb3RydiBpcyBkZWNvZGVkIGFzIGRzcmx2IG9uIG5vbi1SMiBDUFVzICovCisgICAgICAgICAgICBpZiAoZW52LT5pbnNuX2ZsYWdzICYgSVNBX01JUFMzMlIyKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgMHgzZik7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9yb3RyX3RsKGNwdV9ncHJbcmRdLCB0MSwgdDApOworICAgICAgICAgICAgICAgIG9wbiA9ICJkcm90cnYiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAweDNmKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3Nocl90bCh0MCwgdDEsIHQwKTsKKyAgICAgICAgICAgICAgICBvcG4gPSAiZHNybHYiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBNSVBTX0lOVkFMKCJpbnZhbGlkIGRzcmx2IGZsYWciKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAlcyIsIG9wbiwgcmVnbmFtZXNbcmRdLCByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7Cit9CisKKy8qIEFyaXRobWV0aWMgb24gSEkvTE8gcmVnaXN0ZXJzICovCitzdGF0aWMgdm9pZCBnZW5fSElMTyAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywgaW50IHJlZykKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiaGlsbyI7CisgICAgdW5zaWduZWQgaW50IGFjYzsKKworICAgIGlmIChyZWcgPT0gMCAmJiAob3BjID09IE9QQ19NRkhJIHx8IG9wYyA9PSBPUENfTUZMTykpIHsKKyAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICBNSVBTX0RFQlVHKCJOT1AiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvcGMgPT0gT1BDX01GSEkgfHwgb3BjID09IE9QQ19NRkxPKSB7CisgICAgICAgIGFjYyA9ICgoY3R4LT5vcGNvZGUpID4+IDIxKSAmIDB4MDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWNjID0gKChjdHgtPm9wY29kZSkgPj4gMTEpICYgMHgwMzsKKyAgICB9CisKKyAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgfQorCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19NRkhJOgorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgaWYgKGFjYyAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3JlZ10sIGNwdV9ISVthY2NdKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZWddLCBjcHVfSElbYWNjXSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1maGkiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NRkxPOgorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgaWYgKGFjYyAhPSAwKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3JlZ10sIGNwdV9MT1thY2NdKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X2dwcltyZWddLCBjcHVfTE9bYWNjXSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1mbG8iOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NVEhJOgorICAgICAgICBpZiAocmVnICE9IDApIHsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgICAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfSElbYWNjXSwgY3B1X2dwcltyZWddKTsKKyAgICAgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X0hJW2FjY10sIGNwdV9ncHJbcmVnXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X0hJW2FjY10sIDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdGhpIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTVRMTzoKKyAgICAgICAgaWYgKHJlZyAhPSAwKSB7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAgICAgaWYgKGFjYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0xPW2FjY10sIGNwdV9ncHJbcmVnXSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9MT1thY2NdLCBjcHVfZ3ByW3JlZ10pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9MT1thY2NdLCAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibXRsbyI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAodm9pZClvcG47IC8qIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyAqLworICAgIE1JUFNfREVCVUcoIiVzICVzIiwgb3BuLCByZWduYW1lc1tyZWddKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX211bGRpdiAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBycywgaW50IHJ0KQoreworICAgIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9wbiA9ICJtdWwvZGl2IjsKKyAgICBUQ0d2IHQwLCB0MTsKKyAgICB1bnNpZ25lZCBpbnQgYWNjOworCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19ESVY6CisgICAgY2FzZSBPUENfRElWVToKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfRERJVjoKKyAgICBjYXNlIE9QQ19ERElWVToKKyNlbmRpZgorICAgICAgICB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICB0MSA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgICAgICB0MSA9IHRjZ190ZW1wX25ldygpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX0RJVjoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICAgICAgaW50IGwyID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bCh0MCwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwodDEsIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgdDEsIDAsIGwxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9ORSwgdDAsIElOVF9NSU4sIGwyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9ORSwgdDEsIC0xLCBsMik7CisKKyAgICAgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9MT1swXSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ISVswXSwgMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyKGwxKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDIpOworICAgICAgICAgICAgdGNnX2dlbl9kaXZfdGwoY3B1X0xPWzBdLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9yZW1fdGwoY3B1X0hJWzBdLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0xPWzBdLCBjcHVfTE9bMF0pOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0hJWzBdLCBjcHVfSElbMF0pOworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImRpdiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RJVlU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwodDAsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQxLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfRVEsIHQxLCAwLCBsMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2RpdnVfdGwoY3B1X0xPWzBdLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9yZW11X3RsKGNwdV9ISVswXSwgdDAsIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9MT1swXSwgY3B1X0xPWzBdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ISVswXSwgY3B1X0hJWzBdKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkaXZ1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTVVMVDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgdDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCB0MyA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIGFjYyA9ICgoY3R4LT5vcGNvZGUpID4+IDExKSAmIDB4MDM7CisgICAgICAgICAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNnX2dlbl9leHRfdGxfaTY0KHQyLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dF90bF9pNjQodDMsIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MiwgdDIsIHQzKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X3RsKHQwLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KHQyLCB0MiwgMzIpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfdGwodDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9MT1thY2NdLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfSElbYWNjXSwgdDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdWx0IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTVVMVFU6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IHQyID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgdDMgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBhY2MgPSAoKGN0eC0+b3Bjb2RlKSA+PiAxMSkgJiAweDAzOworICAgICAgICAgICAgaWYgKGFjYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQwLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bCh0MSwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9leHR1X3RsX2k2NCh0MiwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHR1X3RsX2k2NCh0MywgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9tdWxfaTY0KHQyLCB0MiwgdDMpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDMpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfdGwodDAsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDIsIHQyLCAzMik7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF90bCh0MSwgdDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDIpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0xPW2FjY10sIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ISVthY2NdLCB0MSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm11bHR1IjsKKyAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX0RESVY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIGludCBsMiA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0VRLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX05FLCB0MCwgLTFMTCA8PCA2MywgbDIpOworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX05FLCB0MSwgLTFMTCwgbDIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfdGwoY3B1X0xPWzBdLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X0hJWzBdLCAwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnIobDEpOworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMik7CisgICAgICAgICAgICB0Y2dfZ2VuX2Rpdl9pNjQoY3B1X0xPWzBdLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9yZW1faTY0KGNwdV9ISVswXSwgdDAsIHQxKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkZGl2IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRERJVlU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0VRLCB0MSwgMCwgbDEpOworICAgICAgICAgICAgdGNnX2dlbl9kaXZ1X2k2NChjcHVfTE9bMF0sIHQwLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3JlbXVfaTY0KGNwdV9ISVswXSwgdDAsIHQxKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJkZGl2dSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RNVUxUOgorICAgICAgICBnZW5faGVscGVyX2RtdWx0KGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJkbXVsdCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RNVUxUVToKKyAgICAgICAgZ2VuX2hlbHBlcl9kbXVsdHUoY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gImRtdWx0dSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBPUENfTUFERDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgdDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCB0MyA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIGFjYyA9ICgoY3R4LT5vcGNvZGUpID4+IDExKSAmIDB4MDM7CisgICAgICAgICAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNnX2dlbl9leHRfdGxfaTY0KHQyLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dF90bF9pNjQodDMsIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MiwgdDIsIHQzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fY29uY2F0X3RsX2k2NCh0MywgY3B1X0xPW2FjY10sIGNwdV9ISVthY2NdKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYWRkX2k2NCh0MiwgdDIsIHQzKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X3RsKHQwLCB0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KHQyLCB0MiwgMzIpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfdGwodDEsIHQyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9MT1thY2NdLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfSElbYWNjXSwgdDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtYWRkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTUFERFU6CisgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgdDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCB0MyA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIGFjYyA9ICgoY3R4LT5vcGNvZGUpID4+IDExKSAmIDB4MDM7CisgICAgICAgICAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwodDAsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQxLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfdGxfaTY0KHQyLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfdGxfaTY0KHQzLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX211bF9pNjQodDIsIHQyLCB0Myk7CisgICAgICAgICAgICB0Y2dfZ2VuX2NvbmNhdF90bF9pNjQodDMsIGNwdV9MT1thY2NdLCBjcHVfSElbYWNjXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FkZF9pNjQodDIsIHQyLCB0Myk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0Myk7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF90bCh0MCwgdDIpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2k2NCh0MiwgdDIsIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X3RsKHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfTE9bYWNjXSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0hJW2FjY10sIHQxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibWFkZHUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NU1VCOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCB0MiA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IHQzID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgYWNjID0gKChjdHgtPm9wY29kZSkgPj4gMTEpICYgMHgwMzsKKyAgICAgICAgICAgIGlmIChhY2MgIT0gMCkgeworICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0Y2dfZ2VuX2V4dF90bF9pNjQodDIsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0X3RsX2k2NCh0MywgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9tdWxfaTY0KHQyLCB0MiwgdDMpOworICAgICAgICAgICAgdGNnX2dlbl9jb25jYXRfdGxfaTY0KHQzLCBjcHVfTE9bYWNjXSwgY3B1X0hJW2FjY10pOworICAgICAgICAgICAgdGNnX2dlbl9zdWJfaTY0KHQyLCB0MywgdDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDMpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY19pNjRfdGwodDAsIHQyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDIsIHQyLCAzMik7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF90bCh0MSwgdDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDIpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0xPW2FjY10sIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ISVthY2NdLCB0MSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1zdWIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NU1VCVToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgdDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCB0MyA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIGFjYyA9ICgoY3R4LT5vcGNvZGUpID4+IDExKSAmIDB4MDM7CisgICAgICAgICAgICBpZiAoYWNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfdGwodDAsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKHQxLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfdGxfaTY0KHQyLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfdGxfaTY0KHQzLCB0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX211bF9pNjQodDIsIHQyLCB0Myk7CisgICAgICAgICAgICB0Y2dfZ2VuX2NvbmNhdF90bF9pNjQodDMsIGNwdV9MT1thY2NdLCBjcHVfSElbYWNjXSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQodDIsIHQzLCB0Mik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0Myk7CisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF90bCh0MCwgdDIpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2k2NCh0MiwgdDIsIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfaTY0X3RsKHQxLCB0Mik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfTE9bYWNjXSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X0hJW2FjY10sIHQxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibXN1YnUiOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBNSVBTX0lOVkFMKG9wbik7CisgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgKHZvaWQpb3BuOyAvKiBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBNSVBTX0RFQlVHKCIlcyAlcyAlcyIsIG9wbiwgcmVnbmFtZXNbcnNdLCByZWduYW1lc1tydF0pOworIG91dDoKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX211bF92cjU0eHggKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJkLCBpbnQgcnMsIGludCBydCkKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAibXVsIHZyNTR4eCI7CisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGdlbl9sb2FkX2dwcih0MCwgcnMpOworICAgIGdlbl9sb2FkX2dwcih0MSwgcnQpOworCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19WUjU0WFhfTVVMUzoKKyAgICAgICAgZ2VuX2hlbHBlcl9tdWxzKHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBvcG4gPSAibXVscyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1ZSNTRYWF9NVUxTVToKKyAgICAgICAgZ2VuX2hlbHBlcl9tdWxzdSh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gIm11bHN1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfVlI1NFhYX01BQ0M6CisgICAgICAgIGdlbl9oZWxwZXJfbWFjYyh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gIm1hY2MiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19WUjU0WFhfTUFDQ1U6CisgICAgICAgIGdlbl9oZWxwZXJfbWFjY3UodDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJtYWNjdSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1ZSNTRYWF9NU0FDOgorICAgICAgICBnZW5faGVscGVyX21zYWModDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJtc2FjIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfVlI1NFhYX01TQUNVOgorICAgICAgICBnZW5faGVscGVyX21zYWN1KHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBvcG4gPSAibXNhY3UiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19WUjU0WFhfTVVMSEk6CisgICAgICAgIGdlbl9oZWxwZXJfbXVsaGkodDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJtdWxoaSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1ZSNTRYWF9NVUxISVU6CisgICAgICAgIGdlbl9oZWxwZXJfbXVsaGl1KHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBvcG4gPSAibXVsaGl1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfVlI1NFhYX01VTFNISToKKyAgICAgICAgZ2VuX2hlbHBlcl9tdWxzaGkodDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJtdWxzaGkiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19WUjU0WFhfTVVMU0hJVToKKyAgICAgICAgZ2VuX2hlbHBlcl9tdWxzaGl1KHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBvcG4gPSAibXVsc2hpdSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1ZSNTRYWF9NQUNDSEk6CisgICAgICAgIGdlbl9oZWxwZXJfbWFjY2hpKHQwLCBjcHVfZW52LCB0MCwgdDEpOworICAgICAgICBvcG4gPSAibWFjY2hpIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfVlI1NFhYX01BQ0NISVU6CisgICAgICAgIGdlbl9oZWxwZXJfbWFjY2hpdSh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gIm1hY2NoaXUiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19WUjU0WFhfTVNBQ0hJOgorICAgICAgICBnZW5faGVscGVyX21zYWNoaSh0MCwgY3B1X2VudiwgdDAsIHQxKTsKKyAgICAgICAgb3BuID0gIm1zYWNoaSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1ZSNTRYWF9NU0FDSElVOgorICAgICAgICBnZW5faGVscGVyX21zYWNoaXUodDAsIGNwdV9lbnYsIHQwLCB0MSk7CisgICAgICAgIG9wbiA9ICJtc2FjaGl1IjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTCgibXVsIHZyNTR4eCIpOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGdlbl9zdG9yZV9ncHIodDAsIHJkKTsKKyAgICBNSVBTX0RFQlVHKCIlcyAlcywgJXMsICVzIiwgb3BuLCByZWduYW1lc1tyZF0sIHJlZ25hbWVzW3JzXSwgcmVnbmFtZXNbcnRdKTsKKworIG91dDoKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX2NsIChEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3BjLAorICAgICAgICAgICAgICAgICAgICBpbnQgcmQsIGludCBycykKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiQ0x4IjsKKyAgICBUQ0d2IHQwOworCisgICAgaWYgKHJkID09IDApIHsKKyAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICBNSVBTX0RFQlVHKCJOT1AiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIGdlbl9sb2FkX2dwcih0MCwgcnMpOworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfQ0xPOgorICAgICAgICBnZW5faGVscGVyX2NsbyhjcHVfZ3ByW3JkXSwgdDApOworICAgICAgICBvcG4gPSAiY2xvIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQ0xaOgorICAgICAgICBnZW5faGVscGVyX2NseihjcHVfZ3ByW3JkXSwgdDApOworICAgICAgICBvcG4gPSAiY2x6IjsKKyAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX0RDTE86CisgICAgICAgIGdlbl9oZWxwZXJfZGNsbyhjcHVfZ3ByW3JkXSwgdDApOworICAgICAgICBvcG4gPSAiZGNsbyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RDTFo6CisgICAgICAgIGdlbl9oZWxwZXJfZGNseihjcHVfZ3ByW3JkXSwgdDApOworICAgICAgICBvcG4gPSAiZGNseiI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIE1JUFNfREVCVUcoIiVzICVzLCAlcyIsIG9wbiwgcmVnbmFtZXNbcmRdLCByZWduYW1lc1tyc10pOworICAgIHRjZ190ZW1wX2ZyZWUodDApOworfQorCisvKiBUcmFwcyAqLworc3RhdGljIHZvaWQgZ2VuX3RyYXAgKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHJzLCBpbnQgcnQsIGludDE2X3QgaW1tKQoreworICAgIGludCBjb25kOworICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBUQ0d2IHQxID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICBjb25kID0gMDsKKyAgICAvKiBMb2FkIG5lZWRlZCBvcGVyYW5kcyAqLworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfVEVROgorICAgIGNhc2UgT1BDX1RHRToKKyAgICBjYXNlIE9QQ19UR0VVOgorICAgIGNhc2UgT1BDX1RMVDoKKyAgICBjYXNlIE9QQ19UTFRVOgorICAgIGNhc2UgT1BDX1RORToKKyAgICAgICAgLyogQ29tcGFyZSB0d28gcmVnaXN0ZXJzICovCisgICAgICAgIGlmIChycyAhPSBydCkgeworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBycyk7CisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICAgICAgICAgIGNvbmQgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1RFUUk6CisgICAgY2FzZSBPUENfVEdFSToKKyAgICBjYXNlIE9QQ19UR0VJVToKKyAgICBjYXNlIE9QQ19UTFRJOgorICAgIGNhc2UgT1BDX1RMVElVOgorICAgIGNhc2UgT1BDX1RORUk6CisgICAgICAgIC8qIENvbXBhcmUgcmVnaXN0ZXIgdG8gaW1tZWRpYXRlICovCisgICAgICAgIGlmIChycyAhPSAwIHx8IGltbSAhPSAwKSB7CisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgKGludDMyX3QpaW1tKTsKKyAgICAgICAgICAgIGNvbmQgPSAxOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY29uZCA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAob3BjKSB7CisgICAgICAgIGNhc2UgT1BDX1RFUTogICAvKiBycyA9PSBycyAqLworICAgICAgICBjYXNlIE9QQ19URVFJOiAgLyogcjAgPT0gMCAgKi8KKyAgICAgICAgY2FzZSBPUENfVEdFOiAgIC8qIHJzID49IHJzICovCisgICAgICAgIGNhc2UgT1BDX1RHRUk6ICAvKiByMCA+PSAwICAqLworICAgICAgICBjYXNlIE9QQ19UR0VVOiAgLyogcnMgPj0gcnMgdW5zaWduZWQgKi8KKyAgICAgICAgY2FzZSBPUENfVEdFSVU6IC8qIHIwID49IDAgIHVuc2lnbmVkICovCisgICAgICAgICAgICAvKiBBbHdheXMgdHJhcCAqLworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9UUkFQKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19UTFQ6ICAgLyogcnMgPCBycyAgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBPUENfVExUSTogIC8qIHIwIDwgMCAgICAgICAgICAgICovCisgICAgICAgIGNhc2UgT1BDX1RMVFU6ICAvKiBycyA8IHJzIHVuc2lnbmVkICAqLworICAgICAgICBjYXNlIE9QQ19UTFRJVTogLyogcjAgPCAwICB1bnNpZ25lZCAgKi8KKyAgICAgICAgY2FzZSBPUENfVE5FOiAgIC8qIHJzICE9IHJzICAgICAgICAgICovCisgICAgICAgIGNhc2UgT1BDX1RORUk6ICAvKiByMCAhPSAwICAgICAgICAgICAqLworICAgICAgICAgICAgLyogTmV2ZXIgdHJhcDogdHJlYXQgYXMgTk9QLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisKKyAgICAgICAgc3dpdGNoIChvcGMpIHsKKyAgICAgICAgY2FzZSBPUENfVEVROgorICAgICAgICBjYXNlIE9QQ19URVFJOgorICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRfdGwoVENHX0NPTkRfTkUsIHQwLCB0MSwgbDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1RHRToKKyAgICAgICAgY2FzZSBPUENfVEdFSToKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kX3RsKFRDR19DT05EX0xULCB0MCwgdDEsIGwxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19UR0VVOgorICAgICAgICBjYXNlIE9QQ19UR0VJVToKKyAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kX3RsKFRDR19DT05EX0xUVSwgdDAsIHQxLCBsMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfVExUOgorICAgICAgICBjYXNlIE9QQ19UTFRJOgorICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRfdGwoVENHX0NPTkRfR0UsIHQwLCB0MSwgbDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1RMVFU6CisgICAgICAgIGNhc2UgT1BDX1RMVElVOgorICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRfdGwoVENHX0NPTkRfR0VVLCB0MCwgdDEsIGwxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19UTkU6CisgICAgICAgIGNhc2UgT1BDX1RORUk6CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZF90bChUQ0dfQ09ORF9FUSwgdDAsIHQxLCBsMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1RSQVApOworICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fZ290b190YihEaXNhc0NvbnRleHQgKmN0eCwgaW50IG4sIHRhcmdldF91bG9uZyBkZXN0KQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIHRiID0gY3R4LT50YjsKKyAgICBpZiAoKHRiLT5wYyAmIFRBUkdFVF9QQUdFX01BU0spID09IChkZXN0ICYgVEFSR0VUX1BBR0VfTUFTSykgJiYKKyAgICAgICAgbGlrZWx5KCFjdHgtPnNpbmdsZXN0ZXBfZW5hYmxlZCkpIHsKKyAgICAgICAgdGNnX2dlbl9nb3RvX3RiKG4pOworICAgICAgICBnZW5fc2F2ZV9wYyhkZXN0KTsKKyAgICAgICAgdGNnX2dlbl9leGl0X3RiKCh1aW50cHRyX3QpdGIgKyBuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fc2F2ZV9wYyhkZXN0KTsKKyAgICAgICAgaWYgKGN0eC0+c2luZ2xlc3RlcF9lbmFibGVkKSB7CisgICAgICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDApOworICAgICAgICAgICAgZ2VuX2hlbHBlcl8xaShyYWlzZV9leGNlcHRpb24sIGNwdV9lbnYsIEVYQ1BfREVCVUcpOworICAgICAgICB9CisgICAgICAgIHRjZ19nZW5fZXhpdF90YigwKTsKKyAgICB9Cit9CisKKy8qIEJyYW5jaGVzIChiZWZvcmUgZGVsYXkgc2xvdCkgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb21wdXRlX2JyYW5jaCAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJzLCBpbnQgcnQsIGludDMyX3Qgb2Zmc2V0KQoreworICAgIHRhcmdldF91bG9uZyBidGd0ID0gLTE7CisgICAgaW50IGJsaW5rID0gMDsKKyAgICBpbnQgYmNvbmRfY29tcHV0ZSA9IDA7CisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGlmIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfQk1BU0spIHsKKyNpZmRlZiBNSVBTX0RFQlVHX0RJU0FTCisgICAgICAgIExPR19ESVNBUygiQnJhbmNoIGluIGRlbGF5IHNsb3QgYXQgUEMgMHgiIFRBUkdFVF9GTVRfbHggIlxuIiwgY3R4LT5wYyk7CisjZW5kaWYKKyAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIExvYWQgbmVlZGVkIG9wZXJhbmRzICovCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19CRVE6CisgICAgY2FzZSBPUENfQkVRTDoKKyAgICBjYXNlIE9QQ19CTkU6CisgICAgY2FzZSBPUENfQk5FTDoKKyAgICAgICAgLyogQ29tcGFyZSB0d28gcmVnaXN0ZXJzICovCisgICAgICAgIGlmIChycyAhPSBydCkgeworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBycyk7CisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJ0KTsKKyAgICAgICAgICAgIGJjb25kX2NvbXB1dGUgPSAxOworICAgICAgICB9CisgICAgICAgIGJ0Z3QgPSBjdHgtPnBjICsgNCArIG9mZnNldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQkdFWjoKKyAgICBjYXNlIE9QQ19CR0VaQUw6CisgICAgY2FzZSBPUENfQkdFWkFMTDoKKyAgICBjYXNlIE9QQ19CR0VaTDoKKyAgICBjYXNlIE9QQ19CR1RaOgorICAgIGNhc2UgT1BDX0JHVFpMOgorICAgIGNhc2UgT1BDX0JMRVo6CisgICAgY2FzZSBPUENfQkxFWkw6CisgICAgY2FzZSBPUENfQkxUWjoKKyAgICBjYXNlIE9QQ19CTFRaQUw6CisgICAgY2FzZSBPUENfQkxUWkFMTDoKKyAgICBjYXNlIE9QQ19CTFRaTDoKKyAgICAgICAgLyogQ29tcGFyZSB0byB6ZXJvICovCisgICAgICAgIGlmIChycyAhPSAwKSB7CisgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJzKTsKKyAgICAgICAgICAgIGJjb25kX2NvbXB1dGUgPSAxOworICAgICAgICB9CisgICAgICAgIGJ0Z3QgPSBjdHgtPnBjICsgNCArIG9mZnNldDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQlBPU0dFMzI6CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX0JQT1NHRTY0OgorICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIGNwdV9kc3BjdHJsLCAweDdGKTsKKyNlbHNlCisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgY3B1X2RzcGN0cmwsIDB4M0YpOworI2VuZGlmCisgICAgICAgIGJjb25kX2NvbXB1dGUgPSAxOworICAgICAgICBidGd0ID0gY3R4LT5wYyArIDQgKyBvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0o6CisgICAgY2FzZSBPUENfSkFMOgorICAgICAgICAvKiBKdW1wIHRvIGltbWVkaWF0ZSAqLworICAgICAgICBidGd0ID0gKChjdHgtPnBjICsgNCkgJiAoaW50MzJfdCkweEYwMDAwMDAwKSB8ICh1aW50MzJfdClvZmZzZXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0pSOgorICAgIGNhc2UgT1BDX0pBTFI6CisgICAgICAgIC8qIEp1bXAgdG8gcmVnaXN0ZXIgKi8KKyAgICAgICAgaWYgKG9mZnNldCAhPSAwICYmIG9mZnNldCAhPSAxNikgeworICAgICAgICAgICAgLyogSGludCA9IDAgaXMgSlIvSkFMUiwgaGludCAxNiBpcyBKUi5IQi9KQUxSLkhCLCB0aGUKKyAgICAgICAgICAgICAgIG90aGVycyBhcmUgcmVzZXJ2ZWQuICovCisgICAgICAgICAgICBNSVBTX0lOVkFMKCJqdW1wIGhpbnQiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX2xvYWRfZ3ByKGJ0YXJnZXQsIHJzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTCgiYnJhbmNoL2p1bXAiKTsKKyAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAoYmNvbmRfY29tcHV0ZSA9PSAwKSB7CisgICAgICAgIC8qIE5vIGNvbmRpdGlvbiB0byBiZSBjb21wdXRlZCAqLworICAgICAgICBzd2l0Y2ggKG9wYykgeworICAgICAgICBjYXNlIE9QQ19CRVE6ICAgICAvKiByeCA9PSByeCAgICAgICAgKi8KKyAgICAgICAgY2FzZSBPUENfQkVRTDogICAgLyogcnggPT0gcnggbGlrZWx5ICovCisgICAgICAgIGNhc2UgT1BDX0JHRVo6ICAgIC8qIDAgPj0gMCAgICAgICAgICAqLworICAgICAgICBjYXNlIE9QQ19CR0VaTDogICAvKiAwID49IDAgbGlrZWx5ICAgKi8KKyAgICAgICAgY2FzZSBPUENfQkxFWjogICAgLyogMCA8PSAwICAgICAgICAgICovCisgICAgICAgIGNhc2UgT1BDX0JMRVpMOiAgIC8qIDAgPD0gMCBsaWtlbHkgICAqLworICAgICAgICAgICAgLyogQWx3YXlzIHRha2UgKi8KKyAgICAgICAgICAgIGN0eC0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfQjsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJhbHdheXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19CR0VaQUw6ICAvKiAwID49IDAgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBPUENfQkdFWkFMTDogLyogMCA+PSAwIGxpa2VseSAgICovCisgICAgICAgICAgICAvKiBBbHdheXMgdGFrZSBhbmQgbGluayAqLworICAgICAgICAgICAgYmxpbmsgPSAzMTsKKyAgICAgICAgICAgIGN0eC0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfQjsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJhbHdheXMgYW5kIGxpbmsiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19CTkU6ICAgICAvKiByeCAhPSByeCAgICAgICAgKi8KKyAgICAgICAgY2FzZSBPUENfQkdUWjogICAgLyogMCA+IDAgICAgICAgICAgICovCisgICAgICAgIGNhc2UgT1BDX0JMVFo6ICAgIC8qIDAgPCAwICAgICAgICAgICAqLworICAgICAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICAgICAgTUlQU19ERUJVRygiYm5ldmVyIChOT1ApIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgY2FzZSBPUENfQkxUWkFMOiAgLyogMCA8IDAgICAgICAgICAgICovCisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwclszMV0sIGN0eC0+cGMgKyA4KTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJuZXZlciBhbmQgbGluayIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIGNhc2UgT1BDX0JMVFpBTEw6IC8qIDAgPCAwIGxpa2VseSAqLworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbMzFdLCBjdHgtPnBjICsgOCk7CisgICAgICAgICAgICAvKiBTa2lwIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgZGVsYXkgc2xvdCAqLworICAgICAgICAgICAgTUlQU19ERUJVRygiYm5ldmVyLCBsaW5rIGFuZCBza2lwIik7CisgICAgICAgICAgICBjdHgtPnBjICs9IDQ7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgY2FzZSBPUENfQk5FTDogICAgLyogcnggIT0gcnggbGlrZWx5ICovCisgICAgICAgIGNhc2UgT1BDX0JHVFpMOiAgIC8qIDAgPiAwIGxpa2VseSAqLworICAgICAgICBjYXNlIE9QQ19CTFRaTDogICAvKiAwIDwgMCBsaWtlbHkgKi8KKyAgICAgICAgICAgIC8qIFNraXAgdGhlIGluc3RydWN0aW9uIGluIHRoZSBkZWxheSBzbG90ICovCisgICAgICAgICAgICBNSVBTX0RFQlVHKCJibmV2ZXIgYW5kIHNraXAiKTsKKyAgICAgICAgICAgIGN0eC0+cGMgKz0gNDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBjYXNlIE9QQ19KOgorICAgICAgICAgICAgY3R4LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19COworICAgICAgICAgICAgTUlQU19ERUJVRygiaiAiIFRBUkdFVF9GTVRfbHgsIGJ0Z3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0pBTDoKKyAgICAgICAgICAgIGJsaW5rID0gMzE7CisgICAgICAgICAgICBjdHgtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0I7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJqYWwgIiBUQVJHRVRfRk1UX2x4LCBidGd0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19KUjoKKyAgICAgICAgICAgIGN0eC0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfQlI7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJqciAlcyIsIHJlZ25hbWVzW3JzXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfSkFMUjoKKyAgICAgICAgICAgIGJsaW5rID0gcnQ7CisgICAgICAgICAgICBjdHgtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0JSOworICAgICAgICAgICAgTUlQU19ERUJVRygiamFsciAlcywgJXMiLCByZWduYW1lc1tydF0sIHJlZ25hbWVzW3JzXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1JUFNfSU5WQUwoImJyYW5jaC9qdW1wIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChvcGMpIHsKKyAgICAgICAgY2FzZSBPUENfQkVROgorICAgICAgICAgICAgZ2VuX29wX2VxKGJjb25kLCB0MCwgdDEpOworICAgICAgICAgICAgTUlQU19ERUJVRygiYmVxICVzLCAlcywgIiBUQVJHRVRfRk1UX2x4LAorICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIG5vdF9saWtlbHk7CisgICAgICAgIGNhc2UgT1BDX0JFUUw6CisgICAgICAgICAgICBnZW5fb3BfZXEoYmNvbmQsIHQwLCB0MSk7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJiZXFsICVzLCAlcywgIiBUQVJHRVRfRk1UX2x4LAorICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIGxpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQk5FOgorICAgICAgICAgICAgZ2VuX29wX25lKGJjb25kLCB0MCwgdDEpOworICAgICAgICAgICAgTUlQU19ERUJVRygiYm5lICVzLCAlcywgIiBUQVJHRVRfRk1UX2x4LAorICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIG5vdF9saWtlbHk7CisgICAgICAgIGNhc2UgT1BDX0JORUw6CisgICAgICAgICAgICBnZW5fb3BfbmUoYmNvbmQsIHQwLCB0MSk7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJibmVsICVzLCAlcywgIiBUQVJHRVRfRk1UX2x4LAorICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc1tyc10sIHJlZ25hbWVzW3J0XSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIGxpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQkdFWjoKKyAgICAgICAgICAgIGdlbl9vcF9nZXooYmNvbmQsIHQwKTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJnZXogJXMsICIgVEFSR0VUX0ZNVF9seCwgcmVnbmFtZXNbcnNdLCBidGd0KTsKKyAgICAgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQkdFWkw6CisgICAgICAgICAgICBnZW5fb3BfZ2V6KGJjb25kLCB0MCk7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJiZ2V6bCAlcywgIiBUQVJHRVRfRk1UX2x4LCByZWduYW1lc1tyc10sIGJ0Z3QpOworICAgICAgICAgICAgZ290byBsaWtlbHk7CisgICAgICAgIGNhc2UgT1BDX0JHRVpBTDoKKyAgICAgICAgICAgIGdlbl9vcF9nZXooYmNvbmQsIHQwKTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJnZXphbCAlcywgIiBUQVJHRVRfRk1UX2x4LCByZWduYW1lc1tyc10sIGJ0Z3QpOworICAgICAgICAgICAgYmxpbmsgPSAzMTsKKyAgICAgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQkdFWkFMTDoKKyAgICAgICAgICAgIGdlbl9vcF9nZXooYmNvbmQsIHQwKTsKKyAgICAgICAgICAgIGJsaW5rID0gMzE7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJiZ2V6YWxsICVzLCAiIFRBUkdFVF9GTVRfbHgsIHJlZ25hbWVzW3JzXSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIGxpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQkdUWjoKKyAgICAgICAgICAgIGdlbl9vcF9ndHooYmNvbmQsIHQwKTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJndHogJXMsICIgVEFSR0VUX0ZNVF9seCwgcmVnbmFtZXNbcnNdLCBidGd0KTsKKyAgICAgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQkdUWkw6CisgICAgICAgICAgICBnZW5fb3BfZ3R6KGJjb25kLCB0MCk7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJiZ3R6bCAlcywgIiBUQVJHRVRfRk1UX2x4LCByZWduYW1lc1tyc10sIGJ0Z3QpOworICAgICAgICAgICAgZ290byBsaWtlbHk7CisgICAgICAgIGNhc2UgT1BDX0JMRVo6CisgICAgICAgICAgICBnZW5fb3BfbGV6KGJjb25kLCB0MCk7CisgICAgICAgICAgICBNSVBTX0RFQlVHKCJibGV6ICVzLCAiIFRBUkdFVF9GTVRfbHgsIHJlZ25hbWVzW3JzXSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIG5vdF9saWtlbHk7CisgICAgICAgIGNhc2UgT1BDX0JMRVpMOgorICAgICAgICAgICAgZ2VuX29wX2xleihiY29uZCwgdDApOworICAgICAgICAgICAgTUlQU19ERUJVRygiYmxlemwgJXMsICIgVEFSR0VUX0ZNVF9seCwgcmVnbmFtZXNbcnNdLCBidGd0KTsKKyAgICAgICAgICAgIGdvdG8gbGlrZWx5OworICAgICAgICBjYXNlIE9QQ19CTFRaOgorICAgICAgICAgICAgZ2VuX29wX2x0eihiY29uZCwgdDApOworICAgICAgICAgICAgTUlQU19ERUJVRygiYmx0eiAlcywgIiBUQVJHRVRfRk1UX2x4LCByZWduYW1lc1tyc10sIGJ0Z3QpOworICAgICAgICAgICAgZ290byBub3RfbGlrZWx5OworICAgICAgICBjYXNlIE9QQ19CTFRaTDoKKyAgICAgICAgICAgIGdlbl9vcF9sdHooYmNvbmQsIHQwKTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJsdHpsICVzLCAiIFRBUkdFVF9GTVRfbHgsIHJlZ25hbWVzW3JzXSwgYnRndCk7CisgICAgICAgICAgICBnb3RvIGxpa2VseTsKKyAgICAgICAgY2FzZSBPUENfQlBPU0dFMzI6CisgICAgICAgICAgICB0Y2dfZ2VuX3NldGNvbmRpX3RsKFRDR19DT05EX0dFLCBiY29uZCwgdDAsIDMyKTsKKyAgICAgICAgICAgIE1JUFNfREVCVUcoImJwb3NnZTMyICIgVEFSR0VUX0ZNVF9seCwgYnRndCk7CisgICAgICAgICAgICBnb3RvIG5vdF9saWtlbHk7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICBjYXNlIE9QQ19CUE9TR0U2NDoKKyAgICAgICAgICAgIHRjZ19nZW5fc2V0Y29uZGlfdGwoVENHX0NPTkRfR0UsIGJjb25kLCB0MCwgNjQpOworICAgICAgICAgICAgTUlQU19ERUJVRygiYnBvc2dlNjQgIiBUQVJHRVRfRk1UX2x4LCBidGd0KTsKKyAgICAgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyNlbmRpZgorICAgICAgICBjYXNlIE9QQ19CTFRaQUw6CisgICAgICAgICAgICBnZW5fb3BfbHR6KGJjb25kLCB0MCk7CisgICAgICAgICAgICBibGluayA9IDMxOworICAgICAgICAgICAgTUlQU19ERUJVRygiYmx0emFsICVzLCAiIFRBUkdFVF9GTVRfbHgsIHJlZ25hbWVzW3JzXSwgYnRndCk7CisgICAgICAgIG5vdF9saWtlbHk6CisgICAgICAgICAgICBjdHgtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0JDOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0JMVFpBTEw6CisgICAgICAgICAgICBnZW5fb3BfbHR6KGJjb25kLCB0MCk7CisgICAgICAgICAgICBibGluayA9IDMxOworICAgICAgICAgICAgTUlQU19ERUJVRygiYmx0emFsbCAlcywgIiBUQVJHRVRfRk1UX2x4LCByZWduYW1lc1tyc10sIGJ0Z3QpOworICAgICAgICBsaWtlbHk6CisgICAgICAgICAgICBjdHgtPmhmbGFncyB8PSBNSVBTX0hGTEFHX0JMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBNSVBTX0lOVkFMKCJjb25kaXRpb25hbCBicmFuY2gvanVtcCIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBNSVBTX0RFQlVHKCJlbnRlciBkczogbGluayAlZCBjb25kICUwMnggdGFyZ2V0ICIgVEFSR0VUX0ZNVF9seCwKKyAgICAgICAgICAgICAgIGJsaW5rLCBjdHgtPmhmbGFncywgYnRndCk7CisKKyAgICBjdHgtPmJ0YXJnZXQgPSBidGd0OworICAgIGlmIChibGluayA+IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbYmxpbmtdLCBjdHgtPnBjICsgOCk7CisgICAgfQorCisgb3V0OgorICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHRjZ190ZW1wX2ZyZWUodDEpOworfQorCisvKiBzcGVjaWFsMyBiaXRmaWVsZCBvcGVyYXRpb25zICovCitzdGF0aWMgdm9pZCBnZW5fYml0b3BzIChEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3BjLCBpbnQgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcnMsIGludCBsc2IsIGludCBtc2IpCit7CisgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICB0YXJnZXRfdWxvbmcgbWFzazsKKworICAgIGdlbl9sb2FkX2dwcih0MSwgcnMpOworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfRVhUOgorICAgICAgICBpZiAobHNiICsgbXNiID4gMzEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHRjZ19nZW5fc2hyaV90bCh0MCwgdDEsIGxzYik7CisgICAgICAgIGlmIChtc2IgIT0gMzEpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsICgxIDw8IChtc2IgKyAxKSkgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKHQwLCB0MCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX0RFWFRNOgorICAgICAgICB0Y2dfZ2VuX3NocmlfdGwodDAsIHQxLCBsc2IpOworICAgICAgICBpZiAobXNiICE9IDMxKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAoMVVMTCA8PCAobXNiICsgMSArIDMyKSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ERVhUVToKKyAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHQwLCB0MSwgbHNiICsgMzIpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAoMVVMTCA8PCAobXNiICsgMSkpIC0gMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RFWFQ6CisgICAgICAgIHRjZ19nZW5fc2hyaV90bCh0MCwgdDEsIGxzYik7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsICgxVUxMIDw8IChtc2IgKyAxKSkgLSAxKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE9QQ19JTlM6CisgICAgICAgIGlmIChsc2IgPiBtc2IpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIG1hc2sgPSAoKG1zYiAtIGxzYiArIDEgPCAzMikgPyAoKDEgPDwgKG1zYiAtIGxzYiArIDEpKSAtIDEpIDogfjApIDw8IGxzYjsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBydCk7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIH5tYXNrKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQxLCB0MSwgbHNiKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQxLCB0MSwgbWFzayk7CisgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKHQwLCB0MCk7CisgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICBjYXNlIE9QQ19ESU5TTToKKyAgICAgICAgaWYgKGxzYiA+IG1zYikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbWFzayA9ICgobXNiIC0gbHNiICsgMSArIDMyIDwgNjQpID8gKCgxVUxMIDw8IChtc2IgLSBsc2IgKyAxICsgMzIpKSAtIDEpIDogfjBVTEwpIDw8IGxzYjsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBydCk7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIH5tYXNrKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQxLCB0MSwgbHNiKTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQxLCB0MSwgbWFzayk7CisgICAgICAgIHRjZ19nZW5fb3JfdGwodDAsIHQwLCB0MSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RJTlNVOgorICAgICAgICBpZiAobHNiID4gbXNiKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBtYXNrID0gKCgxVUxMIDw8IChtc2IgLSBsc2IgKyAxKSkgLSAxKSA8PCAobHNiICsgMzIpOworICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfm1hc2spOworICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDEsIHQxLCBsc2IgKyAzMik7CisgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MSwgdDEsIG1hc2spOworICAgICAgICB0Y2dfZ2VuX29yX3RsKHQwLCB0MCwgdDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19ESU5TOgorICAgICAgICBpZiAobHNiID4gbXNiKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICAgICAgbWFzayA9ICgoMVVMTCA8PCAobXNiIC0gbHNiICsgMSkpIC0gMSkgPDwgbHNiOworICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfm1hc2spOworICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDEsIHQxLCBsc2IpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQxLCBtYXNrKTsKKyAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorZmFpbDoKKyAgICAgICAgTUlQU19JTlZBTCgiYml0b3BzIik7CisgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHRjZ190ZW1wX2ZyZWUodDEpOworfQorCitzdGF0aWMgdm9pZCBnZW5fYnNoZmwgKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcDIsIGludCBydCwgaW50IHJkKQoreworICAgIFRDR3YgdDA7CisKKyAgICBpZiAocmQgPT0gMCkgeworICAgICAgICAvKiBJZiBubyBkZXN0aW5hdGlvbiwgdHJlYXQgaXQgYXMgYSBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICBzd2l0Y2ggKG9wMikgeworICAgIGNhc2UgT1BDX1dTQkg6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHQxLCB0MCwgOCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDEsIHQxLCAweDAwRkYwMEZGKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDgpOworICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfjB4MDBGRjAwRkYpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZF0sIHQwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TRUI6CisgICAgICAgIHRjZ19nZW5fZXh0OHNfdGwoY3B1X2dwcltyZF0sIHQwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU0VIOgorICAgICAgICB0Y2dfZ2VuX2V4dDE2c190bChjcHVfZ3ByW3JkXSwgdDApOworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfRFNCSDoKKyAgICAgICAgeworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfdGwodDEsIHQwLCA4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MSwgdDEsIDB4MDBGRjAwRkYwMEZGMDBGRlVMTCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDAsIHQwLCA4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIH4weDAwRkYwMEZGMDBGRjAwRkZVTEwpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3JkXSwgdDAsIHQxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0RTSEQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3YgdDEgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKHQxLCB0MCwgMTYpOworICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQxLCB0MSwgMHgwMDAwRkZGRjAwMDBGRkZGVUxMKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDE2KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bCh0MCwgdDAsIH4weDAwMDBGRkZGMDAwMEZGRkZVTEwpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bCh0MCwgdDAsIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV90bCh0MSwgdDAsIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZF0sIHQwLCB0MSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIE1JUFNfSU5WQUwoImJzZmhsIik7CisgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKK30KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisvKiBDUDAgKE1NVSBhbmQgY29udHJvbCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbWZjMF9sb2FkMzIgKFRDR3YgYXJnLCB0YXJnZXRfdWxvbmcgb2ZmKQoreworICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgdGNnX2dlbl9sZF9pMzIodDAsIGNwdV9lbnYsIG9mZik7CisgICAgdGNnX2dlbl9leHRfaTMyX3RsKGFyZywgdDApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9tZmMwX2xvYWQ2NCAoVENHdiBhcmcsIHRhcmdldF91bG9uZyBvZmYpCit7CisgICAgdGNnX2dlbl9sZF90bChhcmcsIGNwdV9lbnYsIG9mZik7CisgICAgdGNnX2dlbl9leHQzMnNfdGwoYXJnLCBhcmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX210YzBfc3RvcmUzMiAoVENHdiBhcmcsIHRhcmdldF91bG9uZyBvZmYpCit7CisgICAgVENHdl9pMzIgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMih0MCwgYXJnKTsKKyAgICB0Y2dfZ2VuX3N0X2kzMih0MCwgY3B1X2Vudiwgb2ZmKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbXRjMF9zdG9yZTY0IChUQ0d2IGFyZywgdGFyZ2V0X3Vsb25nIG9mZikKK3sKKyAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgdGNnX2dlbl9zdF90bChhcmcsIGNwdV9lbnYsIG9mZik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9tZmMwIChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIFRDR3YgYXJnLCBpbnQgcmVnLCBpbnQgc2VsKQoreworICAgIGNvbnN0IGNoYXIgKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBybiA9ICJpbnZhbGlkIjsKKworICAgIGlmIChzZWwgIT0gMCkKKyAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMik7CisKKyAgICBzd2l0Y2ggKHJlZykgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfSW5kZXgpKTsKKyAgICAgICAgICAgIHJuID0gIkluZGV4IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX212cGNvbnRyb2woYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIk1WUENvbnRyb2wiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfbXZwY29uZjAoYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIk1WUENvbmYwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX212cGNvbmYxKGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJNVlBDb25mMSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3JhbmRvbShhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiUmFuZG9tIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFQ29udHJvbCkpOworICAgICAgICAgICAgcm4gPSAiVlBFQ29udHJvbCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1ZQRUNvbmYwKSk7CisgICAgICAgICAgICBybiA9ICJWUEVDb25mMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1ZQRUNvbmYxKSk7CisgICAgICAgICAgICBybiA9ICJWUEVDb25mMSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQ2NChhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1lRTWFzaykpOworICAgICAgICAgICAgcm4gPSAiWVFNYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDY0KGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFU2NoZWR1bGUpKTsKKyAgICAgICAgICAgIHJuID0gIlZQRVNjaGVkdWxlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDY0KGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFU2NoZUZCYWNrKSk7CisgICAgICAgICAgICBybiA9ICJWUEVTY2hlRkJhY2siOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9WUEVPcHQpKTsKKyAgICAgICAgICAgIHJuID0gIlZQRU9wdCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdGNnX2dlbl9sZF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0VudHJ5TG8wKSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFbnRyeUxvMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF90Y3N0YXR1cyhhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiVENTdGF0dXMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdGNiaW5kKGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ0JpbmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdGNyZXN0YXJ0KGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ1Jlc3RhcnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdGNoYWx0KGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ0hhbHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdGNjb250ZXh0KGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ0NvbnRleHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdGNzY2hlZHVsZShhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiVENTY2hlZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF90Y3NjaGVmYmFjayhhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiVENTY2hlRkJhY2siOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9FbnRyeUxvMSkpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoYXJnLCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRW50cnlMbzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9Db250ZXh0KSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb250ZXh0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9jb250ZXh0Y29uZmlnKGFyZyk7IC8qIFNtYXJ0TUlQUyBBU0UgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbnRleHRDb25maWciOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfUGFnZU1hc2spKTsKKyAgICAgICAgICAgIHJuID0gIlBhZ2VNYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfUGFnZUdyYWluKSk7CisgICAgICAgICAgICBybiA9ICJQYWdlR3JhaW4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1dpcmVkKSk7CisgICAgICAgICAgICBybiA9ICJXaXJlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0NvbmYwKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0NvbmYxKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0NvbmYyKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0NvbmYzKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1NSU0NvbmY0KSk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mNCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNzoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0hXUkVuYSkpOworICAgICAgICAgICAgcm4gPSAiSFdSRW5hIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQmFkVkFkZHIpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGFyZywgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkJhZFZBZGRyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIE1hcmsgYXMgYW4gSU8gb3BlcmF0aW9uIGJlY2F1c2Ugd2UgcmVhZCB0aGUgdGltZS4gICovCisgICAgICAgICAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgICAgICAgICBnZW5faW9fc3RhcnQoKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9jb3VudChhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgaWYgKHVzZV9pY291bnQpIHsKKyAgICAgICAgICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm4gPSAiQ291bnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRW50cnlIaSkpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoYXJnLCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRW50cnlIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbXBhcmUpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbXBhcmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9TdGF0dXMpKTsKKyAgICAgICAgICAgIHJuID0gIlN0YXR1cyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0ludEN0bCkpOworICAgICAgICAgICAgcm4gPSAiSW50Q3RsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ3RsKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDdGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9TUlNNYXApKTsKKyAgICAgICAgICAgIHJuID0gIlNSU01hcCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ2F1c2UpKTsKKyAgICAgICAgICAgIHJuID0gIkNhdXNlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRVBDKSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFUEMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9QUmlkKSk7CisgICAgICAgICAgICBybiA9ICJQUmlkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRUJhc2UpKTsKKyAgICAgICAgICAgIHJuID0gIkVCYXNlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9Db25maWcwKSk7CisgICAgICAgICAgICBybiA9ICJDb25maWciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzEpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzIpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzMpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDQsNSBhcmUgcmVzZXJ2ZWQgKi8KKyAgICAgICAgLyogNiw3IGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ29uZmlnNikpOworICAgICAgICAgICAgcm4gPSAiQ29uZmlnNiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ29uZmlnNykpOworICAgICAgICAgICAgcm4gPSAiQ29uZmlnNyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9sbGFkZHIoYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIkxMQWRkciI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMCAuLi4gNzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobWZjMF93YXRjaGxvLCBhcmcsIGNwdV9lbnYsIHNlbCk7CisgICAgICAgICAgICBybiA9ICJXYXRjaExvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwIC4uLjc6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG1mYzBfd2F0Y2hoaSwgYXJnLCBjcHVfZW52LCBzZWwpOworICAgICAgICAgICAgcm4gPSAiV2F0Y2hIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMpOworICAgICAgICAgICAgdGNnX2dlbl9sZF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1hDb250ZXh0KSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJYQ29udGV4dCI7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMToKKyAgICAgICAvKiBPZmZpY2lhbGx5IHJlc2VydmVkLCBidXQgc2VsIDAgaXMgdXNlZCBmb3IgUjF4MDAwIGZyYW1lbWFzayAqLworICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9GcmFtZW1hc2spKTsKKyAgICAgICAgICAgIHJuID0gIkZyYW1lbWFzayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAgIHRjZ19nZW5fbW92aV90bChhcmcsIDApOyAvKiB1bmltcGxlbWVudGVkICovCisgICAgICAgIHJuID0gIidEaWFnbm9zdGljIjsgLyogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9kZWJ1ZyhhcmcsIGNwdV9lbnYpOyAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJEZWJ1ZyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX21mYzBfdHJhY2Vjb250cm9sKGFyZyk7IC8qIFBEdHJhY2Ugc3VwcG9ydCAqLworICAgICAgICAgICAgcm4gPSAiVHJhY2VDb250cm9sIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3RyYWNlY29udHJvbDIoYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJUcmFjZUNvbnRyb2wyIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3VzZXJ0cmFjZWRhdGEoYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJVc2VyVHJhY2VEYXRhIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3RyYWNlYnBjKGFyZyk7IC8qIFBEdHJhY2Ugc3VwcG9ydCAqLworICAgICAgICAgICAgcm4gPSAiVHJhY2VCUEMiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjQ6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIEVKVEFHIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9ERVBDKSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChhcmcsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJERVBDIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfUGVyZm9ybWFuY2UwKSk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlMShhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UxIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlMihhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UyIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlMyhhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UzIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlNChhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U0IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlNShhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U1IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlNihhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U2IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3BlcmZvcm1hbmNlNyhhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U3IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoYXJnLCAwKTsgLyogdW5pbXBsZW1lbnRlZCAqLworICAgICAgICBybiA9ICJFQ0MiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI3OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDAgLi4uIDM6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoYXJnLCAwKTsgLyogdW5pbXBsZW1lbnRlZCAqLworICAgICAgICAgICAgcm4gPSAiQ2FjaGVFcnIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI4OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSA0OgorICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9UYWdMbykpOworICAgICAgICAgICAgcm4gPSAiVGFnTG8iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAzOgorICAgICAgICBjYXNlIDU6CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0RhdGFMbykpOworICAgICAgICAgICAgcm4gPSAiRGF0YUxvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVGFnSGkpKTsKKyAgICAgICAgICAgIHJuID0gIlRhZ0hpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSA1OgorICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9EYXRhSGkpKTsKKyAgICAgICAgICAgIHJuID0gIkRhdGFIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzA6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9FcnJvckVQQykpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoYXJnLCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRXJyb3JFUEMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDMxOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9ERVNBVkUpKTsKKyAgICAgICAgICAgIHJuID0gIkRFU0FWRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgZ290byBkaWU7CisgICAgfQorICAgIExPR19ESVNBUygibWZjMCAlcyAocmVnICVkIHNlbCAlZClcbiIsIHJuLCByZWcsIHNlbCk7CisgICAgcmV0dXJuOworCitkaWU6CisgICAgTE9HX0RJU0FTKCJtZmMwICVzIChyZWcgJWQgc2VsICVkKVxuIiwgcm4sIHJlZywgc2VsKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX210YzAgKENQVU1JUFNTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKmN0eCwgVENHdiBhcmcsIGludCByZWcsIGludCBzZWwpCit7CisgICAgY29uc3QgY2hhciAqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHJuID0gImludmFsaWQiOworCisgICAgaWYgKHNlbCAhPSAwKQorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyKTsKKworICAgIGlmICh1c2VfaWNvdW50KQorICAgICAgICBnZW5faW9fc3RhcnQoKTsKKworICAgIHN3aXRjaCAocmVnKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfaW5kZXgoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkluZGV4IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX212cGNvbnRyb2woY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIk1WUENvbnRyb2wiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJNVlBDb25mMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgICAgIHJuID0gIk1WUENvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJSYW5kb20iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdnBlY29udHJvbChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVlBFQ29udHJvbCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF92cGVjb25mMChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVlBFQ29uZjAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdnBlY29uZjEoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlZQRUNvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3lxbWFzayhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiWVFNYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX210YzBfc3RvcmU2NChhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1ZQRVNjaGVkdWxlKSk7CisgICAgICAgICAgICBybiA9ICJWUEVTY2hlZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9tdGMwX3N0b3JlNjQoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9WUEVTY2hlRkJhY2spKTsKKyAgICAgICAgICAgIHJuID0gIlZQRVNjaGVGQmFjayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF92cGVvcHQoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlZQRU9wdCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2VudHJ5bG8wKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFbnRyeUxvMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF90Y3N0YXR1cyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENTdGF0dXMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNiaW5kKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUQ0JpbmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNyZXN0YXJ0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUQ1Jlc3RhcnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNoYWx0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUQ0hhbHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNjb250ZXh0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUQ0NvbnRleHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNzY2hlZHVsZShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENTY2hlZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF90Y3NjaGVmYmFjayhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENTY2hlRkJhY2siOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9lbnRyeWxvMShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRW50cnlMbzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb250ZXh0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb250ZXh0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb250ZXh0Y29uZmlnKGFyZyk7IC8qIFNtYXJ0TUlQUyBBU0UgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbnRleHRDb25maWciOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BhZ2VtYXNrKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQYWdlTWFzayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9wYWdlZ3JhaW4oY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlBhZ2VHcmFpbiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3dpcmVkKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJXaXJlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjb25mMChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiU1JTQ29uZjAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfc3JzY29uZjEoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3Nyc2NvbmYyKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjb25mMyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiU1JTQ29uZjMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfc3JzY29uZjQoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmY0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2h3cmVuYShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiSFdSRW5hIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgIHJuID0gIkJhZFZBZGRyIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfY291bnQoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkNvdW50IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiA2LDcgYXJlIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2VudHJ5aGkoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkVudHJ5SGkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDExOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfY29tcGFyZShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiQ29tcGFyZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogNiw3IGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfc3RhdHVzKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICAvKiBCU19TVE9QIGlzbid0IGdvb2QgZW5vdWdoIGhlcmUsIGhmbGFncyBtYXkgaGF2ZSBjaGFuZ2VkLiAqLworICAgICAgICAgICAgZ2VuX3NhdmVfcGMoY3R4LT5wYyArIDQpOworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19FWENQOworICAgICAgICAgICAgcm4gPSAiU3RhdHVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2ludGN0bChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgIHJuID0gIkludEN0bCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjdGwoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBybiA9ICJTUlNDdGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbXRjMF9zdG9yZTMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTTWFwKSk7CisgICAgICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICAgICAgcm4gPSAiU1JTTWFwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jYXVzZShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiQ2F1c2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbXRjMF9zdG9yZTY0KGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRVBDKSk7CisgICAgICAgICAgICBybiA9ICJFUEMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJQUmlkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2ViYXNlKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFQmFzZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb25maWcwKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb25maWciOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiBpZ25vcmVkLCByZWFkIG9ubHkgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb25maWcyKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb25maWcyIjsKKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogaWdub3JlZCwgcmVhZCBvbmx5ICovCisgICAgICAgICAgICBybiA9ICJDb25maWczIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiA0LDUgYXJlIHJlc2VydmVkICovCisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBybiA9ICJJbnZhbGlkIGNvbmZpZyBzZWxlY3RvciI7CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfbGxhZGRyKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJMTEFkZHIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDAgLi4uIDc6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG10YzBfd2F0Y2hsbywgY3B1X2VudiwgYXJnLCBzZWwpOworICAgICAgICAgICAgcm4gPSAiV2F0Y2hMbyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTk6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMCAuLi4gNzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXRjMF93YXRjaGhpLCBjcHVfZW52LCBhcmcsIHNlbCk7CisgICAgICAgICAgICBybiA9ICJXYXRjaEhpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfeGNvbnRleHQoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlhDb250ZXh0IjsKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDIxOgorICAgICAgIC8qIE9mZmljaWFsbHkgcmVzZXJ2ZWQsIGJ1dCBzZWwgMCBpcyB1c2VkIGZvciBSMXgwMDAgZnJhbWVtYXNrICovCisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9mcmFtZW1hc2soY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkZyYW1lbWFzayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgcm4gPSAiRGlhZ25vc3RpYyI7IC8qIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIzOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfZGVidWcoY3B1X2VudiwgYXJnKTsgLyogRUpUQUcgc3VwcG9ydCAqLworICAgICAgICAgICAgLyogQlNfU1RPUCBpc24ndCBnb29kIGVub3VnaCBoZXJlLCBoZmxhZ3MgbWF5IGhhdmUgY2hhbmdlZC4gKi8KKyAgICAgICAgICAgIGdlbl9zYXZlX3BjKGN0eC0+cGMgKyA0KTsKKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfRVhDUDsKKyAgICAgICAgICAgIHJuID0gIkRlYnVnIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF90cmFjZWNvbnRyb2woYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJUcmFjZUNvbnRyb2wiOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RyYWNlY29udHJvbDIoYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJUcmFjZUNvbnRyb2wyIjsKKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfdXNlcnRyYWNlZGF0YShhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIHJuID0gIlVzZXJUcmFjZURhdGEiOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RyYWNlYnBjKGFyZyk7IC8qIFBEdHJhY2Ugc3VwcG9ydCAqLworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgIHJuID0gIlRyYWNlQlBDIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICBnZW5fbXRjMF9zdG9yZTY0KGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfREVQQykpOworICAgICAgICAgICAgcm4gPSAiREVQQyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9wZXJmb3JtYW5jZTAoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlBlcmZvcm1hbmNlMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2UxKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTEiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2UyKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTIiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2UzKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTMiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2U0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTQiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2U1KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTUiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2U2KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTYiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2U3KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTciOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNjoKKyAgICAgICAgLyogaWdub3JlZCAqLworICAgICAgICBybiA9ICJFQ0MiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI3OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDAgLi4uIDM6CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJDYWNoZUVyciI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSAyODoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RhZ2xvKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUYWdMbyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2RhdGFsbyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRGF0YUxvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RhZ2hpKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUYWdIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2RhdGFoaShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRGF0YUhpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcm4gPSAiaW52YWxpZCBzZWwiOworICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICBicmVhazsKKyAgICBjYXNlIDMwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbXRjMF9zdG9yZTY0KGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRXJyb3JFUEMpKTsKKyAgICAgICAgICAgIHJuID0gIkVycm9yRVBDIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogRUpUQUcgc3VwcG9ydCAqLworICAgICAgICAgICAgZ2VuX210YzBfc3RvcmUzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0RFU0FWRSkpOworICAgICAgICAgICAgcm4gPSAiREVTQVZFIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgIGdvdG8gZGllOworICAgIH0KKyAgICBMT0dfRElTQVMoIm10YzAgJXMgKHJlZyAlZCBzZWwgJWQpXG4iLCBybiwgcmVnLCBzZWwpOworICAgIC8qIEZvciBzaW1wbGljaXR5IGFzc3VtZSB0aGF0IGFsbCB3cml0ZXMgY2FuIGNhdXNlIGludGVycnVwdHMuICAqLworICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgIGdlbl9pb19lbmQoKTsKKyAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgIH0KKyAgICByZXR1cm47CisKK2RpZToKKyAgICBMT0dfRElTQVMoIm10YzAgJXMgKHJlZyAlZCBzZWwgJWQpXG4iLCBybiwgcmVnLCBzZWwpOworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworfQorCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorc3RhdGljIHZvaWQgZ2VuX2RtZmMwIChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIFRDR3YgYXJnLCBpbnQgcmVnLCBpbnQgc2VsKQoreworICAgIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHJuID0gImludmFsaWQiOworCisgICAgaWYgKHNlbCAhPSAwKQorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzY0KTsKKworICAgIHN3aXRjaCAocmVnKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9JbmRleCkpOworICAgICAgICAgICAgcm4gPSAiSW5kZXgiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfbXZwY29udHJvbChhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiTVZQQ29udHJvbCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9tdnBjb25mMChhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiTVZQQ29uZjAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfbXZwY29uZjEoYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIk1WUENvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX21mYzBfcmFuZG9tKGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJSYW5kb20iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9WUEVDb250cm9sKSk7CisgICAgICAgICAgICBybiA9ICJWUEVDb250cm9sIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFQ29uZjApKTsKKyAgICAgICAgICAgIHJuID0gIlZQRUNvbmYwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFQ29uZjEpKTsKKyAgICAgICAgICAgIHJuID0gIlZQRUNvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgdGNnX2dlbl9sZF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1lRTWFzaykpOworICAgICAgICAgICAgcm4gPSAiWVFNYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgdGNnX2dlbl9sZF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1ZQRVNjaGVkdWxlKSk7CisgICAgICAgICAgICBybiA9ICJWUEVTY2hlZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9WUEVTY2hlRkJhY2spKTsKKyAgICAgICAgICAgIHJuID0gIlZQRVNjaGVGQmFjayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1ZQRU9wdCkpOworICAgICAgICAgICAgcm4gPSAiVlBFT3B0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRW50cnlMbzApKTsKKyAgICAgICAgICAgIHJuID0gIkVudHJ5TG8wIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZmMwX3Rjc3RhdHVzKGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ1N0YXR1cyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF90Y2JpbmQoYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIlRDQmluZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfdGNyZXN0YXJ0KGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJUQ1Jlc3RhcnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX3RjaGFsdChhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiVENIYWx0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kbWZjMF90Y2NvbnRleHQoYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIlRDQ29udGV4dCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfdGNzY2hlZHVsZShhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgcm4gPSAiVENTY2hlZHVsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfdGNzY2hlZmJhY2soYXJnLCBjcHVfZW52KTsKKyAgICAgICAgICAgIHJuID0gIlRDU2NoZUZCYWNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRW50cnlMbzEpKTsKKyAgICAgICAgICAgIHJuID0gIkVudHJ5TG8xIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ29udGV4dCkpOworICAgICAgICAgICAgcm4gPSAiQ29udGV4dCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX2NvbnRleHRjb25maWcoYXJnKTsgLyogU21hcnRNSVBTIEFTRSAqLworICAgICAgICAgICAgcm4gPSAiQ29udGV4dENvbmZpZyI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9QYWdlTWFzaykpOworICAgICAgICAgICAgcm4gPSAiUGFnZU1hc2siOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9QYWdlR3JhaW4pKTsKKyAgICAgICAgICAgIHJuID0gIlBhZ2VHcmFpbiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfV2lyZWQpKTsKKyAgICAgICAgICAgIHJuID0gIldpcmVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ29uZjApKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ29uZjEpKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYxIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ29uZjIpKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ29uZjMpKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ29uZjQpKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmY0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfSFdSRW5hKSk7CisgICAgICAgICAgICBybiA9ICJIV1JFbmEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9CYWRWQWRkcikpOworICAgICAgICAgICAgcm4gPSAiQmFkVkFkZHIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIE1hcmsgYXMgYW4gSU8gb3BlcmF0aW9uIGJlY2F1c2Ugd2UgcmVhZCB0aGUgdGltZS4gICovCisgICAgICAgICAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgICAgICAgICBnZW5faW9fc3RhcnQoKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9jb3VudChhcmcsIGNwdV9lbnYpOworICAgICAgICAgICAgaWYgKHVzZV9pY291bnQpIHsKKyAgICAgICAgICAgICAgICBnZW5faW9fZW5kKCk7CisgICAgICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm4gPSAiQ291bnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRW50cnlIaSkpOworICAgICAgICAgICAgcm4gPSAiRW50cnlIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTE6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbXBhcmUpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbXBhcmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9TdGF0dXMpKTsKKyAgICAgICAgICAgIHJuID0gIlN0YXR1cyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0ludEN0bCkpOworICAgICAgICAgICAgcm4gPSAiSW50Q3RsIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTQ3RsKSk7CisgICAgICAgICAgICBybiA9ICJTUlNDdGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9TUlNNYXApKTsKKyAgICAgICAgICAgIHJuID0gIlNSU01hcCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NhdXNlKSk7CisgICAgICAgICAgICBybiA9ICJDYXVzZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTQ6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9FUEMpKTsKKyAgICAgICAgICAgIHJuID0gIkVQQyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTU6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1BSaWQpKTsKKyAgICAgICAgICAgIHJuID0gIlBSaWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9FQmFzZSkpOworICAgICAgICAgICAgcm4gPSAiRUJhc2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9Db25maWcwKSk7CisgICAgICAgICAgICBybiA9ICJDb25maWciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzEpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzIpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0NvbmZpZzMpKTsKKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgLyogNiw3IGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ29uZmlnNikpOworICAgICAgICAgICAgcm4gPSAiQ29uZmlnNiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfQ29uZmlnNykpOworICAgICAgICAgICAgcm4gPSAiQ29uZmlnNyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfbGxhZGRyKGFyZywgY3B1X2Vudik7CisgICAgICAgICAgICBybiA9ICJMTEFkZHIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE4OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDAgLi4uIDc6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKGRtZmMwX3dhdGNobG8sIGFyZywgY3B1X2Vudiwgc2VsKTsKKyAgICAgICAgICAgIHJuID0gIldhdGNoTG8iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE5OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDAgLi4uIDc6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG1mYzBfd2F0Y2hoaSwgYXJnLCBjcHVfZW52LCBzZWwpOworICAgICAgICAgICAgcm4gPSAiV2F0Y2hIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfWENvbnRleHQpKTsKKyAgICAgICAgICAgIHJuID0gIlhDb250ZXh0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMToKKyAgICAgICAvKiBPZmZpY2lhbGx5IHJlc2VydmVkLCBidXQgc2VsIDAgaXMgdXNlZCBmb3IgUjF4MDAwIGZyYW1lbWFzayAqLworICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9GcmFtZW1hc2spKTsKKyAgICAgICAgICAgIHJuID0gIkZyYW1lbWFzayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjI6CisgICAgICAgIHRjZ19nZW5fbW92aV90bChhcmcsIDApOyAvKiB1bmltcGxlbWVudGVkICovCisgICAgICAgIHJuID0gIidEaWFnbm9zdGljIjsgLyogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZjMF9kZWJ1ZyhhcmcsIGNwdV9lbnYpOyAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJEZWJ1ZyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX3RyYWNlY29udHJvbChhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIHJuID0gIlRyYWNlQ29udHJvbCI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfdHJhY2Vjb250cm9sMihhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIHJuID0gIlRyYWNlQ29udHJvbDIiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX3VzZXJ0cmFjZWRhdGEoYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICBybiA9ICJVc2VyVHJhY2VEYXRhIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9kbWZjMF90cmFjZWJwYyhhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIHJuID0gIlRyYWNlQlBDIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfREVQQykpOworICAgICAgICAgICAgcm4gPSAiREVQQyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1BlcmZvcm1hbmNlMCkpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfcGVyZm9ybWFuY2UxKGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTEiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX3BlcmZvcm1hbmNlMihhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UyIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9kbWZjMF9wZXJmb3JtYW5jZTMoYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlBlcmZvcm1hbmNlMyI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfcGVyZm9ybWFuY2U0KGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTQiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorLy8gICAgICAgICAgICBnZW5faGVscGVyX2RtZmMwX3BlcmZvcm1hbmNlNShhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U1IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9kbWZjMF9wZXJmb3JtYW5jZTYoYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlBlcmZvcm1hbmNlNiI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfZG1mYzBfcGVyZm9ybWFuY2U3KGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTciOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjY6CisgICAgICAgIHRjZ19nZW5fbW92aV90bChhcmcsIDApOyAvKiB1bmltcGxlbWVudGVkICovCisgICAgICAgIHJuID0gIkVDQyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgY2FzZSAwIC4uLiAzOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGFyZywgMCk7IC8qIHVuaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgICAgIHJuID0gIkNhY2hlRXJyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyODoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVGFnTG8pKTsKKyAgICAgICAgICAgIHJuID0gIlRhZ0xvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgY2FzZSA1OgorICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBnZW5fbWZjMF9sb2FkMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9EYXRhTG8pKTsKKyAgICAgICAgICAgIHJuID0gIkRhdGFMbyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjk6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAyOgorICAgICAgICBjYXNlIDQ6CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGdlbl9tZmMwX2xvYWQzMihhcmcsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX1RhZ0hpKSk7CisgICAgICAgICAgICBybiA9ICJUYWdIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRGF0YUhpKSk7CisgICAgICAgICAgICBybiA9ICJEYXRhSGkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDMwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX2xkX3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRXJyb3JFUEMpKTsKKyAgICAgICAgICAgIHJuID0gIkVycm9yRVBDIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogRUpUQUcgc3VwcG9ydCAqLworICAgICAgICAgICAgZ2VuX21mYzBfbG9hZDMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfREVTQVZFKSk7CisgICAgICAgICAgICBybiA9ICJERVNBVkUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIGRpZTsKKyAgICB9CisgICAgTE9HX0RJU0FTKCJkbWZjMCAlcyAocmVnICVkIHNlbCAlZClcbiIsIHJuLCByZWcsIHNlbCk7CisgICAgcmV0dXJuOworCitkaWU6CisgICAgTE9HX0RJU0FTKCJkbWZjMCAlcyAocmVnICVkIHNlbCAlZClcbiIsIHJuLCByZWcsIHNlbCk7CisgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9kbXRjMCAoQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4LCBUQ0d2IGFyZywgaW50IHJlZywgaW50IHNlbCkKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBybiA9ICJpbnZhbGlkIjsKKworICAgIGlmIChzZWwgIT0gMCkKKyAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFM2NCk7CisKKyAgICBpZiAodXNlX2ljb3VudCkKKyAgICAgICAgZ2VuX2lvX3N0YXJ0KCk7CisKKyAgICBzd2l0Y2ggKHJlZykgeworICAgIGNhc2UgMDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2luZGV4KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJJbmRleCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9tdnBjb250cm9sKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJNVlBDb250cm9sIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgLyogaWdub3JlZCAqLworICAgICAgICAgICAgcm4gPSAiTVZQQ29uZjAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJNVlBDb25mMSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogaWdub3JlZCAqLworICAgICAgICAgICAgcm4gPSAiUmFuZG9tIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3ZwZWNvbnRyb2woY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlZQRUNvbnRyb2wiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdnBlY29uZjAoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlZQRUNvbmYwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3ZwZWNvbmYxKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJWUEVDb25mMSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF95cW1hc2soY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIllRTWFzayI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc3RfdGwoYXJnLCBjcHVfZW52LCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9WUEVTY2hlZHVsZSkpOworICAgICAgICAgICAgcm4gPSAiVlBFU2NoZWR1bGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3N0X3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfVlBFU2NoZUZCYWNrKSk7CisgICAgICAgICAgICBybiA9ICJWUEVTY2hlRkJhY2siOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdnBlb3B0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJWUEVPcHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9lbnRyeWxvMChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRW50cnlMbzAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNzdGF0dXMoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlRDU3RhdHVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RjYmluZChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENCaW5kIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RjcmVzdGFydChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENSZXN0YXJ0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RjaGFsdChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENIYWx0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RjY29udGV4dChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiVENDb250ZXh0IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3Rjc2NoZWR1bGUoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlRDU2NoZWR1bGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfdGNzY2hlZmJhY2soY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlRDU2NoZUZCYWNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfZW50cnlsbzEoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkVudHJ5TG8xIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfY29udGV4dChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiQ29udGV4dCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorLy8gICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb250ZXh0Y29uZmlnKGFyZyk7IC8qIFNtYXJ0TUlQUyBBU0UgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbnRleHRDb25maWciOworLy8gICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGFnZW1hc2soY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlBhZ2VNYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BhZ2VncmFpbihjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGFnZUdyYWluIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfd2lyZWQoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIldpcmVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3Nyc2NvbmYwKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjb25mMShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiU1JTQ29uZjEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfc3JzY29uZjIoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIlNSU0NvbmYyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3Nyc2NvbmYzKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJTUlNDb25mMyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjb25mNChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiU1JTQ29uZjQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfaHdyZW5hKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJIV1JFbmEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgcm4gPSAiQmFkVkFkZHIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDk6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb3VudChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiQ291bnQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9lbnRyeWhpKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFbnRyeUhpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2NvbXBhcmUoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkNvbXBhcmUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIDYsNyBhcmUgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTI6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfc3RhdHVzKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICAvKiBCU19TVE9QIGlzbid0IGdvb2QgZW5vdWdoIGhlcmUsIGhmbGFncyBtYXkgaGF2ZSBjaGFuZ2VkLiAqLworICAgICAgICAgICAgZ2VuX3NhdmVfcGMoY3R4LT5wYyArIDQpOworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19FWENQOworICAgICAgICAgICAgcm4gPSAiU3RhdHVzIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2ludGN0bChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgIHJuID0gIkludEN0bCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9zcnNjdGwoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBybiA9ICJTUlNDdGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBnZW5fbXRjMF9zdG9yZTMyKGFyZywgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfU1JTTWFwKSk7CisgICAgICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICAgICAgcm4gPSAiU1JTTWFwIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMzoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jYXVzZShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiQ2F1c2UiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE0OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB0Y2dfZ2VuX3N0X3RsKGFyZywgY3B1X2Vudiwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBDUDBfRVBDKSk7CisgICAgICAgICAgICBybiA9ICJFUEMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgICAgICBybiA9ICJQUmlkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2ViYXNlKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJFQmFzZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTY6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb25maWcwKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb25maWciOworICAgICAgICAgICAgLyogU3RvcCB0cmFuc2xhdGlvbiBhcyB3ZSBtYXkgaGF2ZSBzd2l0Y2hlZCB0aGUgZXhlY3V0aW9uIG1vZGUgKi8KKyAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvKiBpZ25vcmVkLCByZWFkIG9ubHkgKi8KKyAgICAgICAgICAgIHJuID0gIkNvbmZpZzEiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9jb25maWcyKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJDb25maWcyIjsKKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgLyogaWdub3JlZCAqLworICAgICAgICAgICAgcm4gPSAiQ29uZmlnMyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogNiw3IGFyZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgKi8KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJuID0gIkludmFsaWQgY29uZmlnIHNlbGVjdG9yIjsKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9sbGFkZHIoY3B1X2VudiwgYXJnKTsKKyAgICAgICAgICAgIHJuID0gIkxMQWRkciI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTg6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMCAuLi4gNzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXRjMF93YXRjaGxvLCBjcHVfZW52LCBhcmcsIHNlbCk7CisgICAgICAgICAgICBybiA9ICJXYXRjaExvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwIC4uLiA3OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdGMwX3dhdGNoaGksIGNwdV9lbnYsIGFyZywgc2VsKTsKKyAgICAgICAgICAgIHJuID0gIldhdGNoSGkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3hjb250ZXh0KGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJYQ29udGV4dCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjE6CisgICAgICAgLyogT2ZmaWNpYWxseSByZXNlcnZlZCwgYnV0IHNlbCAwIGlzIHVzZWQgZm9yIFIxeDAwMCBmcmFtZW1hc2sgKi8KKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2ZyYW1lbWFzayhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRnJhbWVtYXNrIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjoKKyAgICAgICAgLyogaWdub3JlZCAqLworICAgICAgICBybiA9ICJEaWFnbm9zdGljIjsgLyogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjM6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF9kZWJ1ZyhjcHVfZW52LCBhcmcpOyAvKiBFSlRBRyBzdXBwb3J0ICovCisgICAgICAgICAgICAvKiBCU19TVE9QIGlzbid0IGdvb2QgZW5vdWdoIGhlcmUsIGhmbGFncyBtYXkgaGF2ZSBjaGFuZ2VkLiAqLworICAgICAgICAgICAgZ2VuX3NhdmVfcGMoY3R4LT5wYyArIDQpOworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19FWENQOworICAgICAgICAgICAgcm4gPSAiRGVidWciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RyYWNlY29udHJvbChhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBybiA9ICJUcmFjZUNvbnRyb2wiOworLy8gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorLy8gICAgICAgICAgICBnZW5faGVscGVyX210YzBfdHJhY2Vjb250cm9sMihhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBybiA9ICJUcmFjZUNvbnRyb2wyIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3VzZXJ0cmFjZWRhdGEoYXJnKTsgLyogUER0cmFjZSBzdXBwb3J0ICovCisgICAgICAgICAgICAvKiBTdG9wIHRyYW5zbGF0aW9uIGFzIHdlIG1heSBoYXZlIHN3aXRjaGVkIHRoZSBleGVjdXRpb24gbW9kZSAqLworICAgICAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgICAgICAgICAgcm4gPSAiVXNlclRyYWNlRGF0YSI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisvLyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXRjMF90cmFjZWJwYyhhcmcpOyAvKiBQRHRyYWNlIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBybiA9ICJUcmFjZUJQQyI7CisvLyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLyogRUpUQUcgc3VwcG9ydCAqLworICAgICAgICAgICAgdGNnX2dlbl9zdF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0RFUEMpKTsKKyAgICAgICAgICAgIHJuID0gIkRFUEMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI1OgorICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBnZW5faGVscGVyX210YzBfcGVyZm9ybWFuY2UwKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJQZXJmb3JtYW5jZTAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlMShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UxIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlMihjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UyIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlMyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2UzIjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlNChjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U0IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlNShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U1IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlNihjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U2IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzoKKy8vICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3BlcmZvcm1hbmNlNyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiUGVyZm9ybWFuY2U3IjsKKy8vICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI2OgorICAgICAgICAvKiBpZ25vcmVkICovCisgICAgICAgIHJuID0gIkVDQyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjc6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMCAuLi4gMzoKKyAgICAgICAgICAgIC8qIGlnbm9yZWQgKi8KKyAgICAgICAgICAgIHJuID0gIkNhY2hlRXJyIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyODoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RhZ2xvKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUYWdMbyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2RhdGFsbyhjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRGF0YUxvIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOToKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDI6CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX3RhZ2hpKGNwdV9lbnYsIGFyZyk7CisgICAgICAgICAgICBybiA9ICJUYWdIaSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDM6CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGMwX2RhdGFoaShjcHVfZW52LCBhcmcpOworICAgICAgICAgICAgcm4gPSAiRGF0YUhpIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcm4gPSAiaW52YWxpZCBzZWwiOworICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMDoKKyAgICAgICAgc3dpdGNoIChzZWwpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgdGNnX2dlbl9zdF90bChhcmcsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgQ1AwX0Vycm9yRVBDKSk7CisgICAgICAgICAgICBybiA9ICJFcnJvckVQQyI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzE6CisgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8qIEVKVEFHIHN1cHBvcnQgKi8KKyAgICAgICAgICAgIGdlbl9tdGMwX3N0b3JlMzIoYXJnLCBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIENQMF9ERVNBVkUpKTsKKyAgICAgICAgICAgIHJuID0gIkRFU0FWRSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICB9CisgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBkaWU7CisgICAgfQorICAgIExPR19ESVNBUygiZG10YzAgJXMgKHJlZyAlZCBzZWwgJWQpXG4iLCBybiwgcmVnLCBzZWwpOworICAgIC8qIEZvciBzaW1wbGljaXR5IGFzc3VtZSB0aGF0IGFsbCB3cml0ZXMgY2FuIGNhdXNlIGludGVycnVwdHMuICAqLworICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgIGdlbl9pb19lbmQoKTsKKyAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19TVE9QOworICAgIH0KKyAgICByZXR1cm47CisKK2RpZToKKyAgICBMT0dfRElTQVMoImRtdGMwICVzIChyZWcgJWQgc2VsICVkKVxuIiwgcm4sIHJlZywgc2VsKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKyNlbmRpZiAvKiBUQVJHRVRfTUlQUzY0ICovCisKK3N0YXRpYyB2b2lkIGdlbl9tZnRyKENQVU1JUFNTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKmN0eCwgaW50IHJ0LCBpbnQgcmQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdSwgaW50IHNlbCwgaW50IGgpCit7CisgICAgaW50IG90aGVyX3RjID0gZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQyk7CisgICAgVENHdiB0MCA9IHRjZ190ZW1wX2xvY2FsX25ldygpOworCisgICAgaWYgKChlbnYtPkNQMF9WUEVDb25mMCAmICgxIDw8IENQMFZQRUMwX01WUCkpID09IDAgJiYKKyAgICAgICAgKChlbnYtPnRjc1tvdGhlcl90Y10uQ1AwX1RDQmluZCAmICgweGYgPDwgQ1AwVENCZF9DdXJWUEUpKSAhPQorICAgICAgICAgKGVudi0+YWN0aXZlX3RjLkNQMF9UQ0JpbmQgJiAoMHhmIDw8IENQMFRDQmRfQ3VyVlBFKSkpKQorICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIC0xKTsKKyAgICBlbHNlIGlmICgoZW52LT5DUDBfVlBFQ29udHJvbCAmICgweGZmIDw8IENQMFZQRUNvX1RhcmdUQykpID4KKyAgICAgICAgICAgICAoZW52LT5tdnAtPkNQMF9NVlBDb25mMCAmICgweGZmIDw8IENQME1WUEMwX1BUQykpKQorICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIC0xKTsKKyAgICBlbHNlIGlmICh1ID09IDApIHsKKyAgICAgICAgc3dpdGNoIChydCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfdGNzdGF0dXModDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfdGNiaW5kKHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21mdGMwX3RjcmVzdGFydCh0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZnRjMF90Y2hhbHQodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfdGNjb250ZXh0KHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21mdGMwX3Rjc2NoZWR1bGUodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfdGNzY2hlZmJhY2sodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnZW5fbWZjMChlbnYsIGN0eCwgdDAsIHJ0LCBzZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfZW50cnloaSh0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdlbl9tZmMwKGVudiwgY3R4LCB0MCwgcnQsIHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0YzBfc3RhdHVzKHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ2VuX21mYzAoZW52LCBjdHgsIHQwLCBydCwgc2VsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tZnRjMF9kZWJ1Zyh0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdlbl9tZmMwKGVudiwgY3R4LCB0MCwgcnQsIHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdlbl9tZmMwKGVudiwgY3R4LCB0MCwgcnQsIHNlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2Ugc3dpdGNoIChzZWwpIHsKKyAgICAvKiBHUFIgcmVnaXN0ZXJzLiAqLworICAgIGNhc2UgMDoKKyAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRncHIsIHQwLCBjcHVfZW52LCBydCk7CisgICAgICAgIGJyZWFrOworICAgIC8qIEF1eGlsaWFyeSBDUFUgcmVnaXN0ZXJzICovCisgICAgY2FzZSAxOgorICAgICAgICBzd2l0Y2ggKHJ0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobWZ0bG8sIHQwLCBjcHVfZW52LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG1mdGhpLCB0MCwgY3B1X2VudiwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRhY3gsIHQwLCBjcHVfZW52LCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG1mdGxvLCB0MCwgY3B1X2VudiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRoaSwgdDAsIGNwdV9lbnYsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobWZ0YWN4LCB0MCwgY3B1X2VudiwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRsbywgdDAsIGNwdV9lbnYsIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobWZ0aGksIHQwLCBjcHVfZW52LCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRhY3gsIHQwLCBjcHVfZW52LCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtZnRsbywgdDAsIGNwdV9lbnYsIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG1mdGhpLCB0MCwgY3B1X2VudiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobWZ0YWN4LCB0MCwgY3B1X2VudiwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbWZ0ZHNwKHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgLyogRmxvYXRpbmcgcG9pbnQgKENPUDEpLiAqLworICAgIGNhc2UgMjoKKyAgICAgICAgLyogWFhYOiBGb3Igbm93IHdlIHN1cHBvcnQgb25seSBhIHNpbmdsZSBGUFUgY29udGV4dC4gKi8KKyAgICAgICAgaWYgKGggPT0gMCkgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIHJ0KTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0X2kzMl90bCh0MCwgZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyaChjdHgsIGZwMCwgcnQpOworICAgICAgICAgICAgdGNnX2dlbl9leHRfaTMyX3RsKHQwLCBmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIC8qIFhYWDogRm9yIG5vdyB3ZSBzdXBwb3J0IG9ubHkgYSBzaW5nbGUgRlBVIGNvbnRleHQuICovCisgICAgICAgIGdlbl9oZWxwZXJfMmkoY2ZjMSwgdDAsIGNwdV9lbnYsIHJ0KTsKKyAgICAgICAgYnJlYWs7CisgICAgLyogQ09QMjogTm90IGltcGxlbWVudGVkLiAqLworICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gZGllOworICAgIH0KKyAgICBMT0dfRElTQVMoIm1mdHIgKHJlZyAlZCB1ICVkIHNlbCAlZCBoICVkKVxuIiwgcnQsIHUsIHNlbCwgaCk7CisgICAgZ2VuX3N0b3JlX2dwcih0MCwgcmQpOworICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHJldHVybjsKKworZGllOgorICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIExPR19ESVNBUygibWZ0ciAocmVnICVkIHUgJWQgc2VsICVkIGggJWQpXG4iLCBydCwgdSwgc2VsLCBoKTsKKyAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX210dHIoQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4LCBpbnQgcmQsIGludCBydCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB1LCBpbnQgc2VsLCBpbnQgaCkKK3sKKyAgICBpbnQgb3RoZXJfdGMgPSBlbnYtPkNQMF9WUEVDb250cm9sICYgKDB4ZmYgPDwgQ1AwVlBFQ29fVGFyZ1RDKTsKKyAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisKKyAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICBpZiAoKGVudi0+Q1AwX1ZQRUNvbmYwICYgKDEgPDwgQ1AwVlBFQzBfTVZQKSkgPT0gMCAmJgorICAgICAgICAoKGVudi0+dGNzW290aGVyX3RjXS5DUDBfVENCaW5kICYgKDB4ZiA8PCBDUDBUQ0JkX0N1clZQRSkpICE9CisgICAgICAgICAoZW52LT5hY3RpdmVfdGMuQ1AwX1RDQmluZCAmICgweGYgPDwgQ1AwVENCZF9DdXJWUEUpKSkpCisgICAgICAgIC8qIE5PUCAqLyA7CisgICAgZWxzZSBpZiAoKGVudi0+Q1AwX1ZQRUNvbnRyb2wgJiAoMHhmZiA8PCBDUDBWUEVDb19UYXJnVEMpKSA+CisgICAgICAgICAgICAgKGVudi0+bXZwLT5DUDBfTVZQQ29uZjAgJiAoMHhmZiA8PCBDUDBNVlBDMF9QVEMpKSkKKyAgICAgICAgLyogTk9QICovIDsKKyAgICBlbHNlIGlmICh1ID09IDApIHsKKyAgICAgICAgc3dpdGNoIChyZCkgeworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfdGNzdGF0dXMoY3B1X2VudiwgdDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfdGNiaW5kKGNwdV9lbnYsIHQwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX210dGMwX3RjcmVzdGFydChjcHVfZW52LCB0MCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdHRjMF90Y2hhbHQoY3B1X2VudiwgdDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfdGNjb250ZXh0KGNwdV9lbnYsIHQwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX210dGMwX3Rjc2NoZWR1bGUoY3B1X2VudiwgdDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfdGNzY2hlZmJhY2soY3B1X2VudiwgdDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBnZW5fbXRjMChlbnYsIGN0eCwgdDAsIHJkLCBzZWwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfZW50cnloaShjcHVfZW52LCB0MCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdlbl9tdGMwKGVudiwgY3R4LCB0MCwgcmQsIHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICBzd2l0Y2ggKHNlbCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0YzBfc3RhdHVzKGNwdV9lbnYsIHQwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZ2VuX210YzAoZW52LCBjdHgsIHQwLCByZCwgc2VsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSAyMzoKKyAgICAgICAgICAgIHN3aXRjaCAoc2VsKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdHRjMF9kZWJ1ZyhjcHVfZW52LCB0MCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGdlbl9tdGMwKGVudiwgY3R4LCB0MCwgcmQsIHNlbCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdlbl9tdGMwKGVudiwgY3R4LCB0MCwgcmQsIHNlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2Ugc3dpdGNoIChzZWwpIHsKKyAgICAvKiBHUFIgcmVnaXN0ZXJzLiAqLworICAgIGNhc2UgMDoKKyAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRncHIsIGNwdV9lbnYsIHQwLCByZCk7CisgICAgICAgIGJyZWFrOworICAgIC8qIEF1eGlsaWFyeSBDUFUgcmVnaXN0ZXJzICovCisgICAgY2FzZSAxOgorICAgICAgICBzd2l0Y2ggKHJkKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXR0bG8sIGNwdV9lbnYsIHQwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG10dGhpLCBjcHVfZW52LCB0MCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRhY3gsIGNwdV9lbnYsIHQwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG10dGxvLCBjcHVfZW52LCB0MCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRoaSwgY3B1X2VudiwgdDAsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXR0YWN4LCBjcHVfZW52LCB0MCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRsbywgY3B1X2VudiwgdDAsIDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXR0aGksIGNwdV9lbnYsIHQwLCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRhY3gsIGNwdV9lbnYsIHQwLCAyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl8yaShtdHRsbywgY3B1X2VudiwgdDAsIDMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBnZW5faGVscGVyXzJpKG10dGhpLCBjcHVfZW52LCB0MCwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMmkobXR0YWN4LCBjcHVfZW52LCB0MCwgMyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXR0ZHNwKGNwdV9lbnYsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgLyogRmxvYXRpbmcgcG9pbnQgKENPUDEpLiAqLworICAgIGNhc2UgMjoKKyAgICAgICAgLyogWFhYOiBGb3Igbm93IHdlIHN1cHBvcnQgb25seSBhIHNpbmdsZSBGUFUgY29udGV4dC4gKi8KKyAgICAgICAgaWYgKGggPT0gMCkgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihmcDAsIHQwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIHJkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGZwMCwgdDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyaChjdHgsIGZwMCwgcmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIC8qIFhYWDogRm9yIG5vdyB3ZSBzdXBwb3J0IG9ubHkgYSBzaW5nbGUgRlBVIGNvbnRleHQuICovCisgICAgICAgIGdlbl9oZWxwZXJfMmkoY3RjMSwgY3B1X2VudiwgdDAsIHJkKTsKKyAgICAgICAgYnJlYWs7CisgICAgLyogQ09QMjogTm90IGltcGxlbWVudGVkLiAqLworICAgIGNhc2UgNDoKKyAgICBjYXNlIDU6CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gZGllOworICAgIH0KKyAgICBMT0dfRElTQVMoIm10dHIgKHJlZyAlZCB1ICVkIHNlbCAlZCBoICVkKVxuIiwgcmQsIHUsIHNlbCwgaCk7CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgcmV0dXJuOworCitkaWU6CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgTE9HX0RJU0FTKCJtdHRyIChyZWcgJWQgdSAlZCBzZWwgJWQgaCAlZClcbiIsIHJkLCB1LCBzZWwsIGgpOworICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworfQorCitzdGF0aWMgdm9pZCBnZW5fY3AwIChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wYywgaW50IHJ0LCBpbnQgcmQpCit7CisgICAgY29uc3QgY2hhciogX19hdHRyaWJ1dGVfXygodW51c2VkKSkgb3BuID0gImxkc3QiOworCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19NRkMwOgorICAgICAgICBpZiAocnQgPT0gMCkgeworICAgICAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdlbl9tZmMwKGVudiwgY3R4LCBjcHVfZ3ByW3J0XSwgcmQsIGN0eC0+b3Bjb2RlICYgMHg3KTsKKyAgICAgICAgb3BuID0gIm1mYzAiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NVEMwOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICAgICAgZ2VuX210YzAoZW52LCBjdHgsIHQwLCByZCwgY3R4LT5vcGNvZGUgJiAweDcpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm10YzAiOworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfRE1GQzA6CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgIGlmIChydCA9PSAwKSB7CisgICAgICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZ2VuX2RtZmMwKGVudiwgY3R4LCBjcHVfZ3ByW3J0XSwgcmQsIGN0eC0+b3Bjb2RlICYgMHg3KTsKKyAgICAgICAgb3BuID0gImRtZmMwIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRE1UQzA6CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICBnZW5fZG10YzAoZW52LCBjdHgsIHQwLCByZCwgY3R4LT5vcGNvZGUgJiAweDcpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImRtdGMwIjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE9QQ19NRlRSOgorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICBpZiAocmQgPT0gMCkgeworICAgICAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGdlbl9tZnRyKGVudiwgY3R4LCBydCwgcmQsIChjdHgtPm9wY29kZSA+PiA1KSAmIDEsCisgICAgICAgICAgICAgICAgIGN0eC0+b3Bjb2RlICYgMHg3LCAoY3R4LT5vcGNvZGUgPj4gNCkgJiAxKTsKKyAgICAgICAgb3BuID0gIm1mdHIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NVFRSOgorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICBnZW5fbXR0cihlbnYsIGN0eCwgcmQsIHJ0LCAoY3R4LT5vcGNvZGUgPj4gNSkgJiAxLAorICAgICAgICAgICAgICAgICBjdHgtPm9wY29kZSAmIDB4NywgKGN0eC0+b3Bjb2RlID4+IDQpICYgMSk7CisgICAgICAgIG9wbiA9ICJtdHRyIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfVExCV0k6CisgICAgICAgIG9wbiA9ICJ0bGJ3aSI7CisgICAgICAgIGlmICghZW52LT50bGItPmhlbHBlcl90bGJ3aSkKKyAgICAgICAgICAgIGdvdG8gZGllOworICAgICAgICBnZW5faGVscGVyX3RsYndpKGNwdV9lbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19UTEJXUjoKKyAgICAgICAgb3BuID0gInRsYndyIjsKKyAgICAgICAgaWYgKCFlbnYtPnRsYi0+aGVscGVyX3RsYndyKQorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIGdlbl9oZWxwZXJfdGxid3IoY3B1X2Vudik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1RMQlA6CisgICAgICAgIG9wbiA9ICJ0bGJwIjsKKyAgICAgICAgaWYgKCFlbnYtPnRsYi0+aGVscGVyX3RsYnApCisgICAgICAgICAgICBnb3RvIGRpZTsKKyAgICAgICAgZ2VuX2hlbHBlcl90bGJwKGNwdV9lbnYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19UTEJSOgorICAgICAgICBvcG4gPSAidGxiciI7CisgICAgICAgIGlmICghZW52LT50bGItPmhlbHBlcl90bGJyKQorICAgICAgICAgICAgZ290byBkaWU7CisgICAgICAgIGdlbl9oZWxwZXJfdGxicihjcHVfZW52KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRVJFVDoKKyAgICAgICAgb3BuID0gImVyZXQiOworICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzIpOworICAgICAgICBnZW5faGVscGVyX2VyZXQoY3B1X2Vudik7CisgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfRVhDUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfREVSRVQ6CisgICAgICAgIG9wbiA9ICJkZXJldCI7CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzIpOworICAgICAgICBpZiAoIShjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfRE0pKSB7CisgICAgICAgICAgICBNSVBTX0lOVkFMKG9wbik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZGVyZXQoY3B1X2Vudik7CisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX0VYQ1A7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfV0FJVDoKKyAgICAgICAgb3BuID0gIndhaXQiOworICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMgfCBJU0FfTUlQUzMyKTsKKyAgICAgICAgLyogSWYgd2UgZ2V0IGFuIGV4Y2VwdGlvbiwgd2Ugd2FudCB0byByZXN0YXJ0IGF0IG5leHQgaW5zdHJ1Y3Rpb24gKi8KKyAgICAgICAgY3R4LT5wYyArPSA0OworICAgICAgICBzYXZlX2NwdV9zdGF0ZShjdHgsIDEpOworICAgICAgICBjdHgtPnBjIC09IDQ7CisgICAgICAgIGdlbl9oZWxwZXJfd2FpdChjcHVfZW52KTsKKyAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19FWENQOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorIGRpZToKKyAgICAgICAgTUlQU19JTlZBTChvcG4pOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlcyAlcyAlZCIsIG9wbiwgcmVnbmFtZXNbcnRdLCByZCk7Cit9CisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KKworLyogQ1AxIEJyYW5jaGVzIChiZWZvcmUgZGVsYXkgc2xvdCkgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb21wdXRlX2JyYW5jaDEgKENQVU1JUFNTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNjLCBpbnQzMl90IG9mZnNldCkKK3sKKyAgICB0YXJnZXRfdWxvbmcgYnRhcmdldDsKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiY3AxIGNvbmQgYnJhbmNoIjsKKyAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgIGlmIChjYyAhPSAwKQorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzQgfCBJU0FfTUlQUzMyKTsKKworICAgIGJ0YXJnZXQgPSBjdHgtPnBjICsgNCArIG9mZnNldDsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIE9QQ19CQzFGOgorICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHQwLCBmcHVfZmNyMzEsIGdldF9mcF9iaXQoY2MpKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTMyKHQwLCB0MCk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIHQwLCAxKTsKKyAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChiY29uZCwgdDApOworICAgICAgICBvcG4gPSAiYmMxZiI7CisgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyAgICBjYXNlIE9QQ19CQzFGTDoKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MCwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKSk7CisgICAgICAgIHRjZ19nZW5fbm90X2kzMih0MCwgdDApOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQwLCB0MCwgMSk7CisgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoYmNvbmQsIHQwKTsKKyAgICAgICAgb3BuID0gImJjMWZsIjsKKyAgICAgICAgZ290byBsaWtlbHk7CisgICAgY2FzZSBPUENfQkMxVDoKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MCwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKSk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIHQwLCAxKTsKKyAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChiY29uZCwgdDApOworICAgICAgICBvcG4gPSAiYmMxdCI7CisgICAgICAgIGdvdG8gbm90X2xpa2VseTsKKyAgICBjYXNlIE9QQ19CQzFUTDoKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MCwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKSk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIHQwLCAxKTsKKyAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChiY29uZCwgdDApOworICAgICAgICBvcG4gPSAiYmMxdGwiOworICAgIGxpa2VseToKKyAgICAgICAgY3R4LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19CTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQkMxRkFOWTI6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MCwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHQxLCBmcHVfZmNyMzEsIGdldF9mcF9iaXQoY2MrMSkpOworICAgICAgICAgICAgdGNnX2dlbl9vcl9pMzIodDAsIHQwLCB0MSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX25vdF9pMzIodDAsIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIHQwLCAxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwoYmNvbmQsIHQwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYmMxYW55MmYiOworICAgICAgICBnb3RvIG5vdF9saWtlbHk7CisgICAgY2FzZSBPUENfQkMxVEFOWTI6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MCwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKSk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHQxLCBmcHVfZmNyMzEsIGdldF9mcF9iaXQoY2MrMSkpOworICAgICAgICAgICAgdGNnX2dlbl9vcl9pMzIodDAsIHQwLCB0MSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQwLCB0MCwgMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGJjb25kLCB0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImJjMWFueTJ0IjsKKyAgICAgICAgZ290byBub3RfbGlrZWx5OworICAgIGNhc2UgT1BDX0JDMUZBTlk0OgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodDAsIGZwdV9mY3IzMSwgZ2V0X2ZwX2JpdChjYykpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzEpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzIpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzMpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgICAgICAgICAgdGNnX2dlbl9ub3RfaTMyKHQwLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHQwLCB0MCwgMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX3RsKGJjb25kLCB0MCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImJjMWFueTRmIjsKKyAgICAgICAgZ290byBub3RfbGlrZWx5OworICAgIGNhc2UgT1BDX0JDMVRBTlk0OgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIodDAsIGZwdV9mY3IzMSwgZ2V0X2ZwX2JpdChjYykpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzEpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzIpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgZnB1X2ZjcjMxLCBnZXRfZnBfYml0KGNjKzMpKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfaTMyKHQwLCB0MCwgdDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgICAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0MCwgdDAsIDEpOworICAgICAgICAgICAgdGNnX2dlbl9leHR1X2kzMl90bChiY29uZCwgdDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJiYzFhbnk0dCI7CisgICAgbm90X2xpa2VseToKKyAgICAgICAgY3R4LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19CQzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTChvcG4pOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24gKGN0eCwgRVhDUF9SSSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlczogY29uZCAlMDJ4IHRhcmdldCAiIFRBUkdFVF9GTVRfbHgsIG9wbiwKKyAgICAgICAgICAgICAgIGN0eC0+aGZsYWdzLCBidGFyZ2V0KTsKKyAgICBjdHgtPmJ0YXJnZXQgPSBidGFyZ2V0OworCisgb3V0OgorICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKK30KKworLyogQ29wcm9jZXNzb3IgMSAoRlBVKSAqLworCisjZGVmaW5lIEZPUChmdW5jLCBmbXQpICgoKGZtdCkgPDwgMjEpIHwgKGZ1bmMpKQorCitzdGF0aWMgdm9pZCBnZW5fY3AxIChEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3BjLCBpbnQgcnQsIGludCBmcykKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiY3AxIG1vdmUiOworICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfTUZDMToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0X2kzMl90bCh0MCwgZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAibWZjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX01UQzE6CisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIHRjZ19nZW5fdHJ1bmNfdGxfaTMyKGZwMCwgdDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibXRjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0NGQzE6CisgICAgICAgIGdlbl9oZWxwZXJfMmkoY2ZjMSwgdDAsIGNwdV9lbnYsIGZzKTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICBvcG4gPSAiY2ZjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0NUQzE6CisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICBnZW5faGVscGVyXzJpKGN0YzEsIGNwdV9lbnYsIHQwLCBmcyk7CisgICAgICAgIG9wbiA9ICJjdGMxIjsKKyAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGNhc2UgT1BDX0RNRkMxOgorICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIHQwLCBmcyk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgb3BuID0gImRtZmMxIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfRE1UQzE6CisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCB0MCwgZnMpOworICAgICAgICBvcG4gPSAiZG10YzEiOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgT1BDX01GSEMxOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyaChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgdGNnX2dlbl9leHRfaTMyX3RsKHQwLCBmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgIG9wbiA9ICJtZmhjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX01USEMxOgorICAgICAgICBnZW5fbG9hZF9ncHIodDAsIHJ0KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3RydW5jX3RsX2kzMihmcDAsIHQwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMmgoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm10aGMxIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTChvcG4pOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24gKGN0eCwgRVhDUF9SSSk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBNSVBTX0RFQlVHKCIlcyAlcyAlcyIsIG9wbiwgcmVnbmFtZXNbcnRdLCBmcmVnbmFtZXNbZnNdKTsKKworIG91dDoKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX21vdmNpIChEaXNhc0NvbnRleHQgKmN0eCwgaW50IHJkLCBpbnQgcnMsIGludCBjYywgaW50IHRmKQoreworICAgIGludCBsMTsKKyAgICBUQ0dDb25kIGNvbmQ7CisgICAgVENHdl9pMzIgdDA7CisKKyAgICBpZiAocmQgPT0gMCkgeworICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodGYpCisgICAgICAgIGNvbmQgPSBUQ0dfQ09ORF9FUTsKKyAgICBlbHNlCisgICAgICAgIGNvbmQgPSBUQ0dfQ09ORF9ORTsKKworICAgIGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIGZwdV9mY3IzMSwgMSA8PCBnZXRfZnBfYml0KGNjKSk7CisgICAgdGNnX2dlbl9icmNvbmRpX2kzMihjb25kLCB0MCwgMCwgbDEpOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICBpZiAocnMgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZF0sIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fbW92X3RsKGNwdV9ncHJbcmRdLCBjcHVfZ3ByW3JzXSk7CisgICAgfQorICAgIGdlbl9zZXRfbGFiZWwobDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX21vdmNmX3MgKGludCBmcywgaW50IGZkLCBpbnQgY2MsIGludCB0ZikKK3sKKyAgICBpbnQgY29uZDsKKyAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisKKyAgICBpZiAodGYpCisgICAgICAgIGNvbmQgPSBUQ0dfQ09ORF9FUTsKKyAgICBlbHNlCisgICAgICAgIGNvbmQgPSBUQ0dfQ09ORF9ORTsKKworICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIGZwdV9mY3IzMSwgMSA8PCBnZXRfZnBfYml0KGNjKSk7CisgICAgdGNnX2dlbl9icmNvbmRpX2kzMihjb25kLCB0MCwgMCwgbDEpOworICAgIGdlbl9sb2FkX2ZwcjMyKHQwLCBmcyk7CisgICAgZ2VuX3N0b3JlX2ZwcjMyKHQwLCBmZCk7CisgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ2VuX21vdmNmX2QgKERpc2FzQ29udGV4dCAqY3R4LCBpbnQgZnMsIGludCBmZCwgaW50IGNjLCBpbnQgdGYpCit7CisgICAgaW50IGNvbmQ7CisgICAgVENHdl9pMzIgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgVENHdl9pNjQgZnAwOworICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgIGlmICh0ZikKKyAgICAgICAgY29uZCA9IFRDR19DT05EX0VROworICAgIGVsc2UKKyAgICAgICAgY29uZCA9IFRDR19DT05EX05FOworCisgICAgdGNnX2dlbl9hbmRpX2kzMih0MCwgZnB1X2ZjcjMxLCAxIDw8IGdldF9mcF9iaXQoY2MpKTsKKyAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKGNvbmQsIHQwLCAwLCBsMSk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgZ2VuX3NldF9sYWJlbChsMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5fbW92Y2ZfcHMgKERpc2FzQ29udGV4dCAqY3R4LCBpbnQgZnMsIGludCBmZCwgaW50IGNjLCBpbnQgdGYpCit7CisgICAgaW50IGNvbmQ7CisgICAgVENHdl9pMzIgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgIGludCBsMiA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgIGlmICh0ZikKKyAgICAgICAgY29uZCA9IFRDR19DT05EX0VROworICAgIGVsc2UKKyAgICAgICAgY29uZCA9IFRDR19DT05EX05FOworCisgICAgdGNnX2dlbl9hbmRpX2kzMih0MCwgZnB1X2ZjcjMxLCAxIDw8IGdldF9mcF9iaXQoY2MpKTsKKyAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKGNvbmQsIHQwLCAwLCBsMSk7CisgICAgZ2VuX2xvYWRfZnByMzIodDAsIGZzKTsKKyAgICBnZW5fc3RvcmVfZnByMzIodDAsIGZkKTsKKyAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKworICAgIHRjZ19nZW5fYW5kaV9pMzIodDAsIGZwdV9mY3IzMSwgMSA8PCBnZXRfZnBfYml0KGNjKzEpKTsKKyAgICB0Y2dfZ2VuX2JyY29uZGlfaTMyKGNvbmQsIHQwLCAwLCBsMik7CisgICAgZ2VuX2xvYWRfZnByMzJoKGN0eCwgdDAsIGZzKTsKKyAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgdDAsIGZkKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgZ2VuX3NldF9sYWJlbChsMik7Cit9CisKKworc3RhdGljIHZvaWQgZ2VuX2Zhcml0aCAoRGlzYXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IG9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmdCwgaW50IGZzLCBpbnQgZmQsIGludCBjYykKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiZmFyaXRoIjsKKyAgICBjb25zdCBjaGFyICpjb25kbmFtZXNbXSA9IHsKKyAgICAgICAgICAgICJjLmYiLAorICAgICAgICAgICAgImMudW4iLAorICAgICAgICAgICAgImMuZXEiLAorICAgICAgICAgICAgImMudWVxIiwKKyAgICAgICAgICAgICJjLm9sdCIsCisgICAgICAgICAgICAiYy51bHQiLAorICAgICAgICAgICAgImMub2xlIiwKKyAgICAgICAgICAgICJjLnVsZSIsCisgICAgICAgICAgICAiYy5zZiIsCisgICAgICAgICAgICAiYy5uZ2xlIiwKKyAgICAgICAgICAgICJjLnNlcSIsCisgICAgICAgICAgICAiYy5uZ2wiLAorICAgICAgICAgICAgImMubHQiLAorICAgICAgICAgICAgImMubmdlIiwKKyAgICAgICAgICAgICJjLmxlIiwKKyAgICAgICAgICAgICJjLm5ndCIsCisgICAgfTsKKyAgICBjb25zdCBjaGFyICpjb25kbmFtZXNfYWJzW10gPSB7CisgICAgICAgICAgICAiY2Ficy5mIiwKKyAgICAgICAgICAgICJjYWJzLnVuIiwKKyAgICAgICAgICAgICJjYWJzLmVxIiwKKyAgICAgICAgICAgICJjYWJzLnVlcSIsCisgICAgICAgICAgICAiY2Ficy5vbHQiLAorICAgICAgICAgICAgImNhYnMudWx0IiwKKyAgICAgICAgICAgICJjYWJzLm9sZSIsCisgICAgICAgICAgICAiY2Ficy51bGUiLAorICAgICAgICAgICAgImNhYnMuc2YiLAorICAgICAgICAgICAgImNhYnMubmdsZSIsCisgICAgICAgICAgICAiY2Ficy5zZXEiLAorICAgICAgICAgICAgImNhYnMubmdsIiwKKyAgICAgICAgICAgICJjYWJzLmx0IiwKKyAgICAgICAgICAgICJjYWJzLm5nZSIsCisgICAgICAgICAgICAiY2Ficy5sZSIsCisgICAgICAgICAgICAiY2Ficy5uZ3QiLAorICAgIH07CisgICAgZW51bSB7IEJJTk9QLCBDTVBPUCwgT1RIRVJPUCB9IG9wdHlwZSA9IE9USEVST1A7CisgICAgdWludDMyX3QgZnVuYyA9IGN0eC0+b3Bjb2RlICYgMHgzZjsKKworICAgIHN3aXRjaCAoY3R4LT5vcGNvZGUgJiBGT1AoMHgzZiwgMHgxZikpIHsKKyAgICBjYXNlIEZPUCgwLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfYWRkX3MoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYWRkLnMiOworICAgICAgICBvcHR5cGUgPSBCSU5PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMSwgMTYpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3N1Yl9zKGZwMCwgY3B1X2VudiwgZnAwLCBmcDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN1Yi5zIjsKKyAgICAgICAgb3B0eXBlID0gQklOT1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDIsIDE2KToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAxID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9tdWxfcyhmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdWwucyI7CisgICAgICAgIG9wdHlwZSA9IEJJTk9QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfZGl2X3MoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiZGl2LnMiOworICAgICAgICBvcHR5cGUgPSBCSU5PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNCwgMTYpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9zcXJ0X3MoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAic3FydC5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNSwgMTYpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9hYnNfcyhmcDAsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJhYnMucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDYsIDE2KToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1vdi5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNywgMTYpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jaHNfcyhmcDAsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJuZWcucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDgsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAzMiwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9yb3VuZGxfcyhmcDY0LCBjcHVfZW52LCBmcDMyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnA2NCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnA2NCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJvdW5kLmwucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDksIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAzMiwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF90cnVuY2xfcyhmcDY0LCBjcHVfZW52LCBmcDMyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnA2NCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnA2NCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInRydW5jLmwucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDEwLCAxNik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAzMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwNjQgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMzIsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfY2VpbGxfcyhmcDY0LCBjcHVfZW52LCBmcDMyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnA2NCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnA2NCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImNlaWwubC5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMTEsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAzMiwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9mbG9vcmxfcyhmcDY0LCBjcHVfZW52LCBmcDMyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnA2NCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnA2NCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImZsb29yLmwucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDEyLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JvdW5kd19zKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJvdW5kLncucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDEzLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3RydW5jd19zKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInRydW5jLncucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDE0LCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2NlaWx3X3MoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiY2VpbC53LnMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxNSwgMTYpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9mbG9vcndfcyhmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJmbG9vci53LnMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxNywgMTYpOgorICAgICAgICBnZW5fbW92Y2ZfcyhmcywgZmQsIChmdCA+PiAyKSAmIDB4NywgZnQgJiAweDEpOworICAgICAgICBvcG4gPSAibW92Y2YucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDE4LCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMDsKKworICAgICAgICAgICAgaWYgKGZ0ICE9IDApIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIGNwdV9ncHJbZnRdLCAwLCBsMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibW92ei5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMTksIDE2KToKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICAgICAgVENHdl9pMzIgZnAwOworCisgICAgICAgICAgICBpZiAoZnQgIT0gMCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fYnJjb25kaV90bChUQ0dfQ09ORF9FUSwgY3B1X2dwcltmdF0sIDAsIGwxKTsKKyAgICAgICAgICAgICAgICBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1vdm4ucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDIxLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JlY2lwX3MoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicmVjaXAucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDIyLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JzcXJ0X3MoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicnNxcnQucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDI4LCAxNik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAxID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMSwgZmQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9yZWNpcDJfcyhmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJyZWNpcDIucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDI5LCAxNik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcmVjaXAxX3MoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicmVjaXAxLnMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzMCwgMTYpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JzcXJ0MV9zKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJzcXJ0MS5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzEsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JzcXJ0Ml9zKGZwMCwgY3B1X2VudiwgZnAwLCBmcDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJzcXJ0Mi5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzMsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZkKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAzMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwNjQgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMzIsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfY3Z0ZF9zKGZwNjQsIGNwdV9lbnYsIGZwMzIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAzMik7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDY0LCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDY0KTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiY3Z0LmQucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDM2LCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2N2dHdfcyhmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQudy5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzcsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAzMiwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnRsX3MoZnA2NCwgY3B1X2VudiwgZnAzMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwNjQsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQubC5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzgsIDE2KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pMzIgZnAzMl8wID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAzMl8xID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDMyXzAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMzJfMSwgZnQpOworICAgICAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NChmcDY0LCBmcDMyXzAsIGZwMzJfMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyXzEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAzMl8wKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwNjQsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQucHMucyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDQ4LCAxNik6CisgICAgY2FzZSBGT1AoNDksIDE2KToKKyAgICBjYXNlIEZPUCg1MCwgMTYpOgorICAgIGNhc2UgRk9QKDUxLCAxNik6CisgICAgY2FzZSBGT1AoNTIsIDE2KToKKyAgICBjYXNlIEZPUCg1MywgMTYpOgorICAgIGNhc2UgRk9QKDU0LCAxNik6CisgICAgY2FzZSBGT1AoNTUsIDE2KToKKyAgICBjYXNlIEZPUCg1NiwgMTYpOgorICAgIGNhc2UgRk9QKDU3LCAxNik6CisgICAgY2FzZSBGT1AoNTgsIDE2KToKKyAgICBjYXNlIEZPUCg1OSwgMTYpOgorICAgIGNhc2UgRk9QKDYwLCAxNik6CisgICAgY2FzZSBGT1AoNjEsIDE2KToKKyAgICBjYXNlIEZPUCg2MiwgMTYpOgorICAgIGNhc2UgRk9QKDYzLCAxNik6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDEsIGZ0KTsKKyAgICAgICAgICAgIGlmIChjdHgtPm9wY29kZSAmICgxIDw8IDYpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5fY21wYWJzX3MoZnVuYy00OCwgZnAwLCBmcDEsIGNjKTsKKyAgICAgICAgICAgICAgICBvcG4gPSBjb25kbmFtZXNfYWJzW2Z1bmMtNDhdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5fY21wX3MoZnVuYy00OCwgZnAwLCBmcDEsIGNjKTsKKyAgICAgICAgICAgICAgICBvcG4gPSBjb25kbmFtZXNbZnVuYy00OF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgwLCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV9yZWdpc3RlcnMoY3R4LCBmcyB8IGZ0IHwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9hZGRfZChmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImFkZC5kIjsKKyAgICAgICAgb3B0eXBlID0gQklOT1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDEsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzIHwgZnQgfCBmZCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3N1Yl9kKGZwMCwgY3B1X2VudiwgZnAwLCBmcDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAic3ViLmQiOworICAgICAgICBvcHR5cGUgPSBCSU5PUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMiwgMTcpOgorICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZnMgfCBmdCB8IGZkKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbXVsX2QoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdWwuZCI7CisgICAgICAgIG9wdHlwZSA9IEJJTk9QOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzLCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV9yZWdpc3RlcnMoY3R4LCBmcyB8IGZ0IHwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9kaXZfZChmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImRpdi5kIjsKKyAgICAgICAgb3B0eXBlID0gQklOT1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDQsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzIHwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3NxcnRfZChmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInNxcnQuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDUsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzIHwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2Fic19kKGZwMCwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYWJzLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCg2LCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV9yZWdpc3RlcnMoY3R4LCBmcyB8IGZkKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtb3YuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDcsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzIHwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2Noc19kKGZwMCwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibmVnLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCg4LCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9yb3VuZGxfZChmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJvdW5kLmwuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDksIDE3KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3RydW5jbF9kKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAidHJ1bmMubC5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMTAsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2NlaWxsX2QoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjZWlsLmwuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDExLCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9mbG9vcmxfZChmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImZsb29yLmwuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDEyLCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV9yZWdpc3RlcnMoY3R4LCBmcyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwMzIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDY0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwNjQsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcm91bmR3X2QoZnAzMiwgY3B1X2VudiwgZnA2NCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDY0KTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDMyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicm91bmQudy5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMTMsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAzMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwNjQgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnA2NCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF90cnVuY3dfZChmcDMyLCBjcHVfZW52LCBmcDY0KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMzIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJ0cnVuYy53LmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxNCwgMTcpOgorICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZnMpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDY0LCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2NlaWx3X2QoZnAzMiwgY3B1X2VudiwgZnA2NCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDY0KTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDMyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiY2VpbC53LmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxNSwgMTcpOgorICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZnMpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDY0LCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2Zsb29yd19kKGZwMzIsIGNwdV9lbnYsIGZwNjQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnA2NCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAzMiwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAzMik7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImZsb29yLncuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDE3LCAxNyk6CisgICAgICAgIGdlbl9tb3ZjZl9kKGN0eCwgZnMsIGZkLCAoZnQgPj4gMikgJiAweDcsIGZ0ICYgMHgxKTsKKyAgICAgICAgb3BuID0gIm1vdmNmLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxOCwgMTcpOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDA7CisKKyAgICAgICAgICAgIGlmIChmdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX05FLCBjcHVfZ3ByW2Z0XSwgMCwgbDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtb3Z6LmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxOSwgMTcpOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDA7CisKKyAgICAgICAgICAgIGlmIChmdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX0VRLCBjcHVfZ3ByW2Z0XSwgMCwgbDEpOworICAgICAgICAgICAgICAgIGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1vdm4uZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDIxLCAxNyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcmVjaXBfZChmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJlY2lwLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgyMiwgMTcpOgorICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JzcXJ0X2QoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJyc3FydC5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMjgsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9yZWNpcDJfZChmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJlY2lwMi5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMjksIDE3KToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JlY2lwMV9kKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicmVjaXAxLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzMCwgMTcpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcnNxcnQxX2QoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJyc3FydDEuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDMxLCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcnNxcnQyX2QoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJyc3FydDIuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDQ4LCAxNyk6CisgICAgY2FzZSBGT1AoNDksIDE3KToKKyAgICBjYXNlIEZPUCg1MCwgMTcpOgorICAgIGNhc2UgRk9QKDUxLCAxNyk6CisgICAgY2FzZSBGT1AoNTIsIDE3KToKKyAgICBjYXNlIEZPUCg1MywgMTcpOgorICAgIGNhc2UgRk9QKDU0LCAxNyk6CisgICAgY2FzZSBGT1AoNTUsIDE3KToKKyAgICBjYXNlIEZPUCg1NiwgMTcpOgorICAgIGNhc2UgRk9QKDU3LCAxNyk6CisgICAgY2FzZSBGT1AoNTgsIDE3KToKKyAgICBjYXNlIEZPUCg1OSwgMTcpOgorICAgIGNhc2UgRk9QKDYwLCAxNyk6CisgICAgY2FzZSBGT1AoNjEsIDE3KToKKyAgICBjYXNlIEZPUCg2MiwgMTcpOgorICAgIGNhc2UgRk9QKDYzLCAxNyk6CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBpZiAoY3R4LT5vcGNvZGUgJiAoMSA8PCA2KSkgeworICAgICAgICAgICAgICAgIGNoZWNrX2NvcDF4KGN0eCk7CisgICAgICAgICAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzIHwgZnQpOworICAgICAgICAgICAgICAgIGdlbl9jbXBhYnNfZChmdW5jLTQ4LCBmcDAsIGZwMSwgY2MpOworICAgICAgICAgICAgICAgIG9wbiA9IGNvbmRuYW1lc19hYnNbZnVuYy00OF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoZWNrX2NwMV9yZWdpc3RlcnMoY3R4LCBmcyB8IGZ0KTsKKyAgICAgICAgICAgICAgICBnZW5fY21wX2QoZnVuYy00OCwgZnAwLCBmcDEsIGNjKTsKKyAgICAgICAgICAgICAgICBvcG4gPSBjb25kbmFtZXNbZnVuYy00OF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzMiwgMTcpOgorICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZnMpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDY0LCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2N2dHNfZChmcDMyLCBjcHVfZW52LCBmcDY0KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMzIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQucy5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzYsIDE3KToKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAzMiA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwNjQgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnA2NCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnR3X2QoZnAzMiwgY3B1X2VudiwgZnA2NCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDY0KTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDMyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiY3Z0LncuZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDM3LCAxNyk6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnRsX2QoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQubC5kIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzIsIDIwKToKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfY3Z0c193KGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImN2dC5zLnciOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzMywgMjApOgorICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAzMiwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnRkX3coZnA2NCwgY3B1X2VudiwgZnAzMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDMyKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwNjQsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQuZC53IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzIsIDIxKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDMyID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pNjQgZnA2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDY0LCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2N2dHNfbChmcDMyLCBjcHVfZW52LCBmcDY0KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwNjQpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMzIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMzIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQucy5sIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzMsIDIxKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2N2dGRfbChmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImN2dC5kLmwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgzOCwgMjApOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfY3Z0cHNfcHcoZnAwLCBjcHVfZW52LCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJjdnQucHMucHciOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgwLCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfYWRkX3BzKGZwMCwgY3B1X2VudiwgZnAwLCBmcDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiYWRkLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMSwgMjIpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3N1Yl9wcyhmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN1Yi5wcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDIsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9tdWxfcHMoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdWwucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCg1LCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9hYnNfcHMoZnAwLCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJhYnMucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCg2LCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtb3YucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCg3LCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jaHNfcHMoZnAwLCBmcDApOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJuZWcucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxNywgMjIpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIGdlbl9tb3ZjZl9wcyhjdHgsIGZzLCBmZCwgKGZ0ID4+IDIpICYgMHg3LCBmdCAmIDB4MSk7CisgICAgICAgIG9wbiA9ICJtb3ZjZi5wcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDE4LCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAwOworCisgICAgICAgICAgICBpZiAoZnQgIT0gMCkKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIGNwdV9ncHJbZnRdLCAwLCBsMSk7CisgICAgICAgICAgICBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm1vdnoucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgxOSwgMjIpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMDsKKworICAgICAgICAgICAgaWYgKGZ0ICE9IDApIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfRVEsIGNwdV9ncHJbZnRdLCAwLCBsMSk7CisgICAgICAgICAgICAgICAgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibW92bi5wcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDI0LCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfYWRkcl9wcyhmcDAsIGNwdV9lbnYsIGZwMCwgZnAxKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImFkZHIucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgyNiwgMjIpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X211bHJfcHMoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtdWxyLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMjgsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZmQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9yZWNpcDJfcHMoZnAwLCBjcHVfZW52LCBmcDAsIGZwMSk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJyZWNpcDIucHMiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZPUCgyOSwgMjIpOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcmVjaXAxX3BzKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicmVjaXAxLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzAsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X3JzcXJ0MV9wcyhmcDAsIGNwdV9lbnYsIGZwMCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInJzcXJ0MS5wcyI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRk9QKDMxLCAyMik6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfcnNxcnQyX3BzKGZwMCwgY3B1X2VudiwgZnAwLCBmcDEpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAxKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicnNxcnQyLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzIsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyaChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnRzX3B1KGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImN2dC5zLnB1IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoMzYsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X2N2dHB3X3BzKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAiY3Z0LnB3LnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDAsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9jdnRzX3BsKGZwMCwgY3B1X2VudiwgZnAwKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImN2dC5zLnBsIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDQsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAxLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicGxsLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDUsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzJoKGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAxLCBmZCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicGx1LnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDYsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyaChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAxLCBmZCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicHVsLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDcsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyaChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzJoKGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAxLCBmZCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAxKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAicHV1LnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGT1AoNDgsIDIyKToKKyAgICBjYXNlIEZPUCg0OSwgMjIpOgorICAgIGNhc2UgRk9QKDUwLCAyMik6CisgICAgY2FzZSBGT1AoNTEsIDIyKToKKyAgICBjYXNlIEZPUCg1MiwgMjIpOgorICAgIGNhc2UgRk9QKDUzLCAyMik6CisgICAgY2FzZSBGT1AoNTQsIDIyKToKKyAgICBjYXNlIEZPUCg1NSwgMjIpOgorICAgIGNhc2UgRk9QKDU2LCAyMik6CisgICAgY2FzZSBGT1AoNTcsIDIyKToKKyAgICBjYXNlIEZPUCg1OCwgMjIpOgorICAgIGNhc2UgRk9QKDU5LCAyMik6CisgICAgY2FzZSBGT1AoNjAsIDIyKToKKyAgICBjYXNlIEZPUCg2MSwgMjIpOgorICAgIGNhc2UgRk9QKDYyLCAyMik6CisgICAgY2FzZSBGT1AoNjMsIDIyKToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgaWYgKGN0eC0+b3Bjb2RlICYgKDEgPDwgNikpIHsKKyAgICAgICAgICAgICAgICBnZW5fY21wYWJzX3BzKGZ1bmMtNDgsIGZwMCwgZnAxLCBjYyk7CisgICAgICAgICAgICAgICAgb3BuID0gY29uZG5hbWVzX2Fic1tmdW5jLTQ4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2VuX2NtcF9wcyhmdW5jLTQ4LCBmcDAsIGZwMSwgY2MpOworICAgICAgICAgICAgICAgIG9wbiA9IGNvbmRuYW1lc1tmdW5jLTQ4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIE1JUFNfSU5WQUwob3BuKTsKKyAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uIChjdHgsIEVYQ1BfUkkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN3aXRjaCAob3B0eXBlKSB7CisgICAgY2FzZSBCSU5PUDoKKyAgICAgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAlcyIsIG9wbiwgZnJlZ25hbWVzW2ZkXSwgZnJlZ25hbWVzW2ZzXSwgZnJlZ25hbWVzW2Z0XSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ01QT1A6CisgICAgICAgIE1JUFNfREVCVUcoIiVzICVzLCVzIiwgb3BuLCBmcmVnbmFtZXNbZnNdLCBmcmVnbmFtZXNbZnRdKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19ERUJVRygiJXMgJXMsJXMiLCBvcG4sIGZyZWduYW1lc1tmZF0sIGZyZWduYW1lc1tmc10pOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qIENvcHJvY2Vzc29yIDMgKEZQVSkgKi8KK3N0YXRpYyB2b2lkIGdlbl9mbHQzX2xkc3QgKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIGludCBmcywgaW50IGJhc2UsIGludCBpbmRleCkKK3sKKyAgICBjb25zdCBjaGFyKiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBvcG4gPSAiZXh0ZW5kZWQgZmxvYXQgbG9hZC9zdG9yZSI7CisgICAgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHN0b3JlID0gMDsKKyAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICBpZiAoYmFzZSA9PSAwKSB7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgaW5kZXgpOworICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICBnZW5fbG9hZF9ncHIodDAsIGJhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgaW5kZXgpOworICAgICAgICBnZW5fb3BfYWRkcl9hZGQoY3R4LCB0MCwgY3B1X2dwcltiYXNlXSwgdDApOworICAgIH0KKyAgICAvKiBEb24ndCBkbyBOT1AgaWYgZGVzdGluYXRpb24gaXMgemVybzogd2UgbXVzdCBwZXJmb3JtIHRoZSBhY3R1YWwKKyAgICAgICBtZW1vcnkgYWNjZXNzLiAqLworICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19MV1hDMToKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQzMnModDAsIHQwLCBjdHgtPm1lbV9pZHgpOworICAgICAgICAgICAgdGNnX2dlbl90cnVuY190bF9pMzIoZnAwLCB0MCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAwLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJsd3hjMSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0xEWEMxOgorICAgICAgICBjaGVja19jb3AxeChjdHgpOworICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZmQpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIHRjZ19nZW5fcWVtdV9sZDY0KGZwMCwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDAsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gImxkeGMxIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTFVYQzE6CisgICAgICAgIGNoZWNrX2NwMV82NGJpdG1vZGUoY3R4KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX3RsKHQwLCB0MCwgfjB4Nyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgdGNnX2dlbl9xZW11X2xkNjQoZnAwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHI2NChjdHgsIGZwMCwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibHV4YzEiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TV1hDMToKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0dV9pMzJfdGwodDEsIGZwMCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3FlbXVfc3QzMih0MSwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDApOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN3eGMxIjsKKyAgICAgICAgc3RvcmUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TRFhDMToKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZzKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgdGNnX2dlbl9xZW11X3N0NjQoZnAwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInNkeGMxIjsKKyAgICAgICAgc3RvcmUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TVVhDMToKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCB+MHg3KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgdGNnX2dlbl9xZW11X3N0NjQoZnAwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gInN1eGMxIjsKKyAgICAgICAgc3RvcmUgPSAxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzKCVzKSIsIG9wbiwgZnJlZ25hbWVzW3N0b3JlID8gZnMgOiBmZF0sCisgICAgICAgICAgICAgICByZWduYW1lc1tpbmRleF0sIHJlZ25hbWVzW2Jhc2VdKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX2ZsdDNfYXJpdGggKERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgZnIsIGludCBmcywgaW50IGZ0KQoreworICAgIGNvbnN0IGNoYXIqIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIG9wbiA9ICJmbHQzX2FyaXRoIjsKKworICAgIHN3aXRjaCAob3BjKSB7CisgICAgY2FzZSBPUENfQUxOVl9QUzoKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbG9jYWxfbmV3KCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIFRDR3ZfaTMyIGZwaCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgICAgIGludCBsMSA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgICAgIGludCBsMiA9IGdlbl9uZXdfbGFiZWwoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBmcik7CisgICAgICAgICAgICB0Y2dfZ2VuX2FuZGlfdGwodDAsIHQwLCAweDcpOworCisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIHQwLCAwLCBsMSk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzJoKGN0eCwgZnBoLCBmcyk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAsIGZkKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMmgoY3R4LCBmcGgsIGZkKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYnIobDIpOworICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMSk7CisgICAgICAgICAgICB0Y2dfZ2VuX2JyY29uZGlfdGwoVENHX0NPTkRfTkUsIHQwLCA0LCBsMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyNpZmRlZiBUQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzJoKGN0eCwgZnBoLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAsIGZkKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9mcHIzMihmcGgsIGZkKTsKKyNlbHNlCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMmgoY3R4LCBmcGgsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwLCBmdCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnBoLCBmZCk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzJoKGN0eCwgZnAsIGZkKTsKKyNlbmRpZgorICAgICAgICAgICAgZ2VuX3NldF9sYWJlbChsMik7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcGgpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJhbG52LnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTUFERF9TOgorICAgICAgICBjaGVja19jb3AxeChjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbXVsYWRkX3MoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMiwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAyKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibWFkZC5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTUFERF9EOgorICAgICAgICBjaGVja19jb3AxeChjdHgpOworICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZmQgfCBmcyB8IGZ0IHwgZnIpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbXVsYWRkX2QoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtYWRkLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NQUREX1BTOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMiA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMiwgZnIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9tdWxhZGRfcHMoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtYWRkLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTVNVQl9TOgorICAgICAgICBjaGVja19jb3AxeChjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgICAgICBUQ0d2X2kzMiBmcDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbXVsc3ViX3MoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjMyKGZwMiwgZmQpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAyKTsKKyAgICAgICAgfQorICAgICAgICBvcG4gPSAibXN1Yi5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTVNVQl9EOgorICAgICAgICBjaGVja19jb3AxeChjdHgpOworICAgICAgICBjaGVja19jcDFfcmVnaXN0ZXJzKGN0eCwgZmQgfCBmcyB8IGZ0IHwgZnIpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbXVsc3ViX2QoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtc3ViLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19NU1VCX1BTOgorICAgICAgICBjaGVja19jcDFfNjRiaXRtb2RlKGN0eCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IGZwMiA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAxLCBmdCk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMiwgZnIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9mbG9hdF9tdWxzdWJfcHMoZnAyLCBjcHVfZW52LCBmcDAsIGZwMSwgZnAyKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDEpOworICAgICAgICAgICAgZ2VuX3N0b3JlX2ZwcjY0KGN0eCwgZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NChmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJtc3ViLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTk1BRERfUzoKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAyLCBmcik7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X25tdWxhZGRfcyhmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJubWFkZC5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTk1BRERfRDoKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZkIHwgZnMgfCBmdCB8IGZyKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAyID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAyLCBmcik7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X25tdWxhZGRfZChmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMik7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm5tYWRkLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19OTUFERF9QUzoKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbm11bGFkZF9wcyhmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMik7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm5tYWRkLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTk1TVUJfUzoKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pMzIgZnAwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICAgICAgVENHdl9pMzIgZnAyID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHIzMihmcDAsIGZzKTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjMyKGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByMzIoZnAyLCBmcik7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X25tdWxzdWJfcyhmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByMzIoZnAyLCBmZCk7CisgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihmcDIpOworICAgICAgICB9CisgICAgICAgIG9wbiA9ICJubXN1Yi5zIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTk1TVUJfRDoKKyAgICAgICAgY2hlY2tfY29wMXgoY3R4KTsKKyAgICAgICAgY2hlY2tfY3AxX3JlZ2lzdGVycyhjdHgsIGZkIHwgZnMgfCBmdCB8IGZyKTsKKyAgICAgICAgeworICAgICAgICAgICAgVENHdl9pNjQgZnAwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICAgICAgVENHdl9pNjQgZnAyID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMCwgZnMpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDEsIGZ0KTsKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAyLCBmcik7CisgICAgICAgICAgICBnZW5faGVscGVyX2Zsb2F0X25tdWxzdWJfZChmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMik7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm5tc3ViLmQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19OTVNVQl9QUzoKKyAgICAgICAgY2hlY2tfY3AxXzY0Yml0bW9kZShjdHgpOworICAgICAgICB7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgICAgICBUQ0d2X2k2NCBmcDIgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisKKyAgICAgICAgICAgIGdlbl9sb2FkX2ZwcjY0KGN0eCwgZnAwLCBmcyk7CisgICAgICAgICAgICBnZW5fbG9hZF9mcHI2NChjdHgsIGZwMSwgZnQpOworICAgICAgICAgICAgZ2VuX2xvYWRfZnByNjQoY3R4LCBmcDIsIGZyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZmxvYXRfbm11bHN1Yl9wcyhmcDIsIGNwdV9lbnYsIGZwMCwgZnAxLCBmcDIpOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQoZnAwKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMSk7CisgICAgICAgICAgICBnZW5fc3RvcmVfZnByNjQoY3R4LCBmcDIsIGZkKTsKKyAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KGZwMik7CisgICAgICAgIH0KKyAgICAgICAgb3BuID0gIm5tc3ViLnBzIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUlQU19JTlZBTChvcG4pOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24gKGN0eCwgRVhDUF9SSSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzLCAlcywgJXMiLCBvcG4sIGZyZWduYW1lc1tmZF0sIGZyZWduYW1lc1tmcl0sCisgICAgICAgICAgICAgICBmcmVnbmFtZXNbZnNdLCBmcmVnbmFtZXNbZnRdKTsKK30KKworLyogSVNBIGV4dGVuc2lvbnMgKEFTRXMpICovCisvKiBNSVBTMTYgZXh0ZW5zaW9uIHRvIE1JUFMzMiAqLworLyogU21hcnRNSVBTIGV4dGVuc2lvbiB0byBNSVBTMzIgKi8KKworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKworLyogTURNWCBleHRlbnNpb24gdG8gTUlQUzY0ICovCisKKyNlbmRpZgorCisvKiBNSVBTRFNQIGZ1bmN0aW9ucy4gKi8KK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX2xkKENQVU1JUFNTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJkLCBpbnQgYmFzZSwgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCBjaGFyICpvcG4gPSAibGR4IjsKKyAgICBUQ0d2IHQwOworCisgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGlmIChiYXNlID09IDApIHsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBiYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnZW5fb3BfYWRkcl9hZGQoY3R4LCB0MCwgY3B1X2dwcltiYXNlXSwgY3B1X2dwcltvZmZzZXRdKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG9wYykgeworICAgIGNhc2UgT1BDX0xCVVg6CisgICAgICAgIHRjZ19nZW5fcWVtdV9sZDh1KHQwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcmQpOworICAgICAgICBvcG4gPSAibGJ1eCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0xIWDoKKyAgICAgICAgdGNnX2dlbl9xZW11X2xkMTZzKHQwLCB0MCwgY3R4LT5tZW1faWR4KTsKKyAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcmQpOworICAgICAgICBvcG4gPSAibGh4IjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfTFdYOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQzMnModDAsIHQwLCBjdHgtPm1lbV9pZHgpOworICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCByZCk7CisgICAgICAgIG9wbiA9ICJsd3giOworICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgY2FzZSBPUENfTERYOgorICAgICAgICB0Y2dfZ2VuX3FlbXVfbGQ2NCh0MCwgdDAsIGN0eC0+bWVtX2lkeCk7CisgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJkKTsKKyAgICAgICAgb3BuID0gImxkeCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgICh2b2lkKW9wbjsgLyogYXZvaWQgYSBjb21waWxlciB3YXJuaW5nICovCisgICAgTUlQU19ERUJVRygiJXMgJXMsICVzKCVzKSIsIG9wbiwKKyAgICAgICAgICAgICAgIHJlZ25hbWVzW3JkXSwgcmVnbmFtZXNbb2Zmc2V0XSwgcmVnbmFtZXNbYmFzZV0pOworICAgIHRjZ190ZW1wX2ZyZWUodDApOworfQorCitzdGF0aWMgdm9pZCBnZW5fbWlwc2RzcF9hcml0aChEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3AxLCB1aW50MzJfdCBvcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0LCBpbnQgdjEsIGludCB2MikKK3sKKyAgICBjb25zdCBjaGFyICpvcG4gPSAibWlwc2RzcCBhcml0aCI7CisgICAgVENHdiB2MV90OworICAgIFRDR3YgdjJfdDsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdjFfdCA9IHRjZ190ZW1wX25ldygpOworICAgIHYyX3QgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIGdlbl9sb2FkX2dwcih2MV90LCB2MSk7CisgICAgZ2VuX2xvYWRfZ3ByKHYyX3QsIHYyKTsKKworICAgIHN3aXRjaCAob3AxKSB7CisgICAgLyogT1BDX01VTFRfR18yRSBpcyBlcXVhbCBPUENfQUREVUhfUUJfRFNQICovCisgICAgY2FzZSBPUENfTVVMVF9HXzJFOgorICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19BRERVSF9RQjoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkdWhfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERVSF9SX1FCOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGR1aF9yX3FiKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREUUhfUEg6CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFoX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREUUhfUl9QSDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkcWhfcl9waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFFIX1c6CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFoX3coY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERRSF9SX1c6CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFoX3JfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlVIX1FCOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1aF9xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlVIX1JfUUI6CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnVoX3JfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TVUJRSF9QSDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VicWhfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TVUJRSF9SX1BIOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJxaF9yX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCUUhfVzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VicWhfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlFIX1JfVzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VicWhfcl93KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19BQlNRX1NfUEhfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19BQlNRX1NfUUI6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hYnNxX3NfcWIoY3B1X2dwcltyZXRdLCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BQlNRX1NfUEg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWJzcV9zX3BoKGNwdV9ncHJbcmV0XSwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUJTUV9TX1c6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWJzcV9zX3coY3B1X2dwcltyZXRdLCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVFfV19QSEw6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfZ3ByW3JldF0sIHYyX3QsIDB4RkZGRjAwMDApOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnNfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFUV9XX1BIUjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgdGNnX2dlbl9hbmRpX3RsKGNwdV9ncHJbcmV0XSwgdjJfdCwgMHgwMDAwRkZGRik7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIDE2KTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcmV0XSwgY3B1X2dwcltyZXRdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVFVX1BIX1FCTDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXF1X3BoX3FibChjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUEhfUUJSOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNlcXVfcGhfcWJyKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9QSF9RQkxBOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNlcXVfcGhfcWJsYShjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUEhfUUJSQToKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXF1X3BoX3FicmEoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUEhfUUJMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNldV9waF9xYmwoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUEhfUUJSOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNldV9waF9xYnIoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUEhfUUJMQToKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXVfcGhfcWJsYShjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9QSF9RQlJBOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNldV9waF9xYnJhKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19BRERVX1FCX0RTUDoKKyAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgY2FzZSBPUENfQUREUV9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRxX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREUV9TX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFfc19waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFFfU19XOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFfc193KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREVV9RQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGR1X3FiKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREVV9TX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHVfc19xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFVfUEg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGR1X3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREVV9TX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkdV9zX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCUV9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJxX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCUV9TX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnFfc19waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlFfU19XOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnFfc193KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9RQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1X3FiKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9TX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnVfc19xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlVfUEg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1X3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9TX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VidV9zX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREU0M6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkc2MoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERXQzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGR3YyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01PRFNVQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tb2RzdWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SQUREVV9XX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3JhZGR1X3dfcWIoY3B1X2dwcltyZXRdLCB2MV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0NNUFVfRVFfUUJfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19QUkVDUl9RQl9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNyX3FiX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1FCX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNycV9xYl9waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNSX1NSQV9QSF9XOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ0d2X2kzMiBzYV90ID0gdGNnX2NvbnN0X2kzMih2Mik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjcl9zcmFfcGhfdyhjcHVfZ3ByW3JldF0sIHNhX3QsIHYxX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfZ3ByW3JldF0pOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHNhX3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE9QQ19QUkVDUl9TUkFfUl9QSF9XOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ0d2X2kzMiBzYV90ID0gdGNnX2NvbnN0X2kzMih2Mik7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjcl9zcmFfcl9waF93KGNwdV9ncHJbcmV0XSwgc2FfdCwgdjFfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B1X2dwcltyZXRdKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMihzYV90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1BIX1c6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY3JxX3BoX3coY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDUlFfUlNfUEhfVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjcnFfcnNfcGhfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNSUVVfU19RQl9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjcnF1X3NfcWJfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBjYXNlIE9QQ19BQlNRX1NfUUhfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19QUkVDRVFfTF9QV0w6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfZ3ByW3JldF0sIHYyX3QsIDB4RkZGRkZGRkYwMDAwMDAwMHVsbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRX0xfUFdSOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwoY3B1X2dwcltyZXRdLCB2Ml90LCAzMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRX1BXX1FITDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXFfcHdfcWhsKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRX1BXX1FIUjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXFfcHdfcWhyKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRX1BXX1FITEE6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2VxX3B3X3FobGEoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVFfUFdfUUhSQToKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjZXFfcHdfcWhyYShjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUUhfT0JMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNlcXVfcWhfb2JsKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9RSF9PQlI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2VxdV9xaF9vYnIoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDRVFVX1FIX09CTEE6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2VxdV9xaF9vYmxhKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9RSF9PQlJBOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNlcXVfcWhfb2JyYShjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9RSF9PQkw6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2V1X3FoX29ibChjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9RSF9PQlI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2V1X3FoX29icihjcHVfZ3ByW3JldF0sIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9RSF9PQkxBOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNldV9xaF9vYmxhKGNwdV9ncHJbcmV0XSwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ0VVX1FIX09CUkE6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY2V1X3FoX29icmEoY3B1X2dwcltyZXRdLCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BQlNRX1NfT0I6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hYnNxX3Nfb2IoY3B1X2dwcltyZXRdLCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BQlNRX1NfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWJzcV9zX3B3KGNwdV9ncHJbcmV0XSwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUJTUV9TX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Fic3Ffc19xaChjcHVfZ3ByW3JldF0sIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQUREVV9PQl9EU1A6CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgT1BDX1JBRERVX0xfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcmFkZHVfbF9vYihjcHVfZ3ByW3JldF0sIHYxX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlFfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VicV9wdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlFfU19QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJxX3NfcHcoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TVUJRX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnFfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TVUJRX1NfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VicV9zX3FoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1X29iKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9TX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3N1YnVfc19vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlVfUUg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1X3FoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVV9TX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc3VidV9zX3FoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1VCVUhfT0I6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1aF9vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NVQlVIX1JfT0I6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zdWJ1aF9yX29iKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREUV9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRxX3B3KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREUV9TX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHFfc19wdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFFfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkcV9xaChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFFfU19RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGRxX3NfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERVX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHVfb2IoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERVX1NfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYWRkdV9zX29iKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREVV9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHVfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERVX1NfUUg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9hZGR1X3NfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BRERVSF9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHVoX29iKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQUREVUhfUl9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2FkZHVoX3Jfb2IoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0NNUFVfRVFfT0JfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19QUkVDUl9PQl9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNyX29iX3FoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ1JfU1JBX1FIX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ0d2X2kzMiByZXRfdCA9IHRjZ19jb25zdF9pMzIocmV0KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNyX3NyYV9xaF9wdyh2Ml90LCB2MV90LCB2Ml90LCByZXRfdCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIocmV0X3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE9QQ19QUkVDUl9TUkFfUl9RSF9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENHdl9pMzIgc2FfdiA9IHRjZ19jb25zdF9pMzIocmV0KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNyX3NyYV9yX3FoX3B3KHYyX3QsIHYxX3QsIHYyX3QsIHNhX3YpOworICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHNhX3YpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE9QQ19QUkVDUlFfT0JfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY3JxX29iX3FoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1BXX0w6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY3JxX3B3X2woY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVDUlFfUUhfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcHJlY3JxX3FoX3B3KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1JTX1FIX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3ByZWNycV9yc19xaF9wdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRUNSUVVfU19PQl9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wcmVjcnF1X3Nfb2JfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgdGNnX3RlbXBfZnJlZSh2MV90KTsKKyAgICB0Y2dfdGVtcF9mcmVlKHYyX3QpOworCisgICAgKHZvaWQpb3BuOyAvKiBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBNSVBTX0RFQlVHKCIlcyIsIG9wbik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX3NoaWZ0KERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0LCBpbnQgdjEsIGludCB2MikKK3sKKyAgICB1aW50MzJfdCBvcDI7CisgICAgY29uc3QgY2hhciAqb3BuID0gIm1pcHNkc3Agc2hpZnQiOworICAgIFRDR3YgdDA7CisgICAgVENHdiB2MV90OworICAgIFRDR3YgdjJfdDsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICB2MV90ID0gdGNnX3RlbXBfbmV3KCk7CisgICAgdjJfdCA9IHRjZ190ZW1wX25ldygpOworCisgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2MSk7CisgICAgZ2VuX2xvYWRfZ3ByKHYxX3QsIHYxKTsKKyAgICBnZW5fbG9hZF9ncHIodjJfdCwgdjIpOworCisgICAgc3dpdGNoIChvcGMpIHsKKyAgICBjYXNlIE9QQ19TSExMX1FCX0RTUDoKKyAgICAgICAgeworICAgICAgICAgICAgb3AyID0gTUFTS19TSExMX1FCKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19TSExMX1FCOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9xYihjcHVfZ3ByW3JldF0sIHQwLCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NITExWX1FCOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU0hMTF9QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfcGgoY3B1X2dwcltyZXRdLCB0MCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSExMVl9QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NITExfU19QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfc19waChjcHVfZ3ByW3JldF0sIHQwLCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NITExWX1NfUEg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX3NfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NITExfU19XOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9zX3coY3B1X2dwcltyZXRdLCB0MCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSExMVl9TX1c6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX3NfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU0hSTF9RQjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmxfcWIoY3B1X2dwcltyZXRdLCB0MCwgdjJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSFJMVl9RQjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmxfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NIUkxfUEg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmxfcGgoY3B1X2dwcltyZXRdLCB0MCwgdjJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSFJMVl9QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hybF9waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU0hSQV9RQjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9xYihjcHVfZ3ByW3JldF0sIHQwLCB2Ml90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NIUkFfUl9RQjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9yX3FiKGNwdV9ncHJbcmV0XSwgdDAsIHYyX3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU0hSQVZfUUI6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NIUkFWX1JfUUI6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfU0hSQV9QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcGgoY3B1X2dwcltyZXRdLCB0MCwgdjJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSFJBX1JfUEg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3JfcGgoY3B1X2dwcltyZXRdLCB0MCwgdjJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSFJBVl9QSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NIUkFWX1JfUEg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3JfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NIUkFfUl9XOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9yX3coY3B1X2dwcltyZXRdLCB0MCwgdjJfdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19TSFJBVl9SX1c6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3JfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBTSExMLlFCIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBjYXNlIE9QQ19TSExMX09CX0RTUDoKKyAgICAgICAgb3AyID0gTUFTS19TSExMX09CKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgY2FzZSBPUENfU0hMTF9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX3B3KGNwdV9ncHJbcmV0XSwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NITExWX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfcHcoY3B1X2dwcltyZXRdLCB2Ml90LCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSExMX1NfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9zX3B3KGNwdV9ncHJbcmV0XSwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NITExWX1NfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9zX3B3KGNwdV9ncHJbcmV0XSwgdjJfdCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hMTF9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX29iKGNwdV9ncHJbcmV0XSwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NITExWX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfb2IoY3B1X2dwcltyZXRdLCB2Ml90LCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSExMX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NobGxfcWgoY3B1X2dwcltyZXRdLCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hMTFZfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hsbF9xaChjcHVfZ3ByW3JldF0sIHYyX3QsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NITExfU19RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX3NfcWgoY3B1X2dwcltyZXRdLCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hMTFZfU19RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGxsX3NfcWgoY3B1X2dwcltyZXRdLCB2Ml90LCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBX09COgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9vYihjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBVl9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfb2IoY3B1X2dwcltyZXRdLCB2Ml90LCB2MV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBX1JfT0I6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3Jfb2IoY3B1X2dwcltyZXRdLCB2Ml90LCB0MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hSQVZfUl9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9vYihjcHVfZ3ByW3JldF0sIHYyX3QsIHYxX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NIUkFfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9wdyhjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBVl9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3B3KGNwdV9ncHJbcmV0XSwgdjJfdCwgdjFfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hSQV9SX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9wdyhjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBVl9SX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9wdyhjcHVfZ3ByW3JldF0sIHYyX3QsIHYxX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NIUkFfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hyYV9xaChjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBVl9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJhX3FoKGNwdV9ncHJbcmV0XSwgdjJfdCwgdjFfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hSQV9SX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9xaChjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJBVl9SX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmFfcl9xaChjcHVfZ3ByW3JldF0sIHYyX3QsIHYxX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NIUkxfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfc2hybF9vYihjcHVfZ3ByW3JldF0sIHYyX3QsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TSFJMVl9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJsX29iKGNwdV9ncHJbcmV0XSwgdjJfdCwgdjFfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hSTF9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NocmxfcWgoY3B1X2dwcltyZXRdLCB2Ml90LCB0MCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hSTFZfUUg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaHJsX3FoKGNwdV9ncHJbcmV0XSwgdjJfdCwgdjFfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICBNSVBTX0lOVkFMKCJNQVNLIFNITEwuT0IiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisKKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlKHYxX3QpOworICAgIHRjZ190ZW1wX2ZyZWUodjJfdCk7CisgICAgKHZvaWQpb3BuOyAvKiBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBNSVBTX0RFQlVHKCIlcyIsIG9wbik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX211bHRpcGx5KERpc2FzQ29udGV4dCAqY3R4LCB1aW50MzJfdCBvcDEsIHVpbnQzMl90IG9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQsIGludCB2MSwgaW50IHYyLCBpbnQgY2hlY2tfcmV0KQoreworICAgIGNvbnN0IGNoYXIgKm9wbiA9ICJtaXBzZHNwIG11bHRpcGx5IjsKKyAgICBUQ0d2X2kzMiB0MDsKKyAgICBUQ0d2IHYxX3Q7CisgICAgVENHdiB2Ml90OworCisgICAgaWYgKChyZXQgPT0gMCkgJiYgKGNoZWNrX3JldCA9PSAxKSkgeworICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdjFfdCA9IHRjZ190ZW1wX25ldygpOworICAgIHYyX3QgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgIHRjZ19nZW5fbW92aV9pMzIodDAsIHJldCk7CisgICAgZ2VuX2xvYWRfZ3ByKHYxX3QsIHYxKTsKKyAgICBnZW5fbG9hZF9ncHIodjJfdCwgdjIpOworCisgICAgc3dpdGNoIChvcDEpIHsKKyAgICAvKiBPUENfTVVMVF9HXzJFLCBPUENfQUREVUhfUUJfRFNQLCBPUENfTVVMX1BIX0RTUCBoYXZlCisgICAgICogdGhlIHNhbWUgbWFzayBhbmQgb3AxLiAqLworICAgIGNhc2UgT1BDX01VTFRfR18yRToKKyAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgY2FzZSAgT1BDX01VTF9QSDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVsX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAgT1BDX01VTF9TX1BIOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdWxfc19waChjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01VTFFfU19XOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdWxxX3NfdyhjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01VTFFfUlNfVzoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVscV9yc193KGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19EUEFfV19QSF9EU1A6CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgT1BDX0RQQVVfSF9RQkw6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBhdV9oX3FibCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBBVV9IX1FCUjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGF1X2hfcWJyKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUFNVX0hfUUJMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2Rwc3VfaF9xYmwodDAsIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RQU1VfSF9RQlI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzdV9oX3Ficih0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBBX1dfUEg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGFfd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBBWF9XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBheF93X3BoKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUEFRX1NfV19QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGFxX3Nfd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBBUVhfU19XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBhcXhfc193X3BoKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUEFRWF9TQV9XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBhcXhfc2Ffd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBTX1dfUEg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcHNfd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBTWF9XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzeF93X3BoKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUFNRX1NfV19QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcHNxX3Nfd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBTUVhfU19XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzcXhfc193X3BoKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUFNRWF9TQV9XX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzcXhfc2Ffd19waCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTVVMU0FRX1NfV19QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdWxzYXFfc193X3BoKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EUEFRX1NBX0xfVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGFxX3NhX2xfdyh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRFBTUV9TQV9MX1c6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzcV9zYV9sX3codDAsIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01BUV9TX1dfUEhMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zX3dfcGhsKHQwLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1BIUjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tYXFfc193X3Bocih0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUEhMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zYV93X3BobCh0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUEhSOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zYV93X3Bocih0MCwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTVVMU0FfV19QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bHNhX3dfcGgodDAsIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVEFSR0VUX01JUFM2NAorICAgIGNhc2UgT1BDX0RQQVFfV19RSF9EU1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhYyA9IHJldCAmIDB4MDM7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHQwLCBhYyk7CisKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19ETUFERDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RtYWRkKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RNQUREVToKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RtYWRkdSh2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19ETVNVQjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Rtc3ViKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RNU1VCVToKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Rtc3VidSh2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19EUEFfV19RSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBhX3dfcWgodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFBBUV9TX1dfUUg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGFxX3Nfd19xaCh2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19EUEFRX1NBX0xfUFc6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcGFxX3NhX2xfcHcodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFBBVV9IX09CTDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RwYXVfaF9vYmwodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFBBVV9IX09CUjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RwYXVfaF9vYnIodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFBTX1dfUUg6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwcjIoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2Rwc193X3FoKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQU1FfU19XX1FIOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzcV9zX3dfcWgodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfRFBTUV9TQV9MX1BXOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZHBzcV9zYV9sX3B3KHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQU1VfSF9PQkw6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcHN1X2hfb2JsKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQU1VfSF9PQlI6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9kcHN1X2hfb2JyKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX01BUV9TX0xfUFdMOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWFxX3NfbF9wd2wodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NfTF9QV1I6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tYXFfc19sX3B3cih2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1FITEw6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tYXFfc193X3FobGwodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUUhMTDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zYV93X3FobGwodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NfV19RSExSOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWFxX3Nfd19xaGxyKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX01BUV9TQV9XX1FITFI6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tYXFfc2Ffd19xaGxyKHYxX3QsIHYyX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX01BUV9TX1dfUUhSTDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zX3dfcWhybCh2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19NQVFfU0FfV19RSFJMOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfbWFxX3NhX3dfcWhybCh2MV90LCB2Ml90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1FIUlI6CisgICAgICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9tYXFfc193X3FocnIodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUUhSUjoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX21hcV9zYV93X3FocnIodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTVVMU0FRX1NfTF9QVzoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX211bHNhcV9zX2xfcHcodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfTVVMU0FRX1NfV19RSDoKKyAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX211bHNhcV9zX3dfcWgodjFfdCwgdjJfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBPUENfQUREVV9RQl9EU1A6CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgT1BDX01VTEVVX1NfUEhfUUJMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bGV1X3NfcGhfcWJsKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTVVMRVVfU19QSF9RQlI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVsZXVfc19waF9xYnIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxRX1JTX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bHFfcnNfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxFUV9TX1dfUEhMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bGVxX3Nfd19waGwoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxFUV9TX1dfUEhSOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bGVxX3Nfd19waHIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxRX1NfUEg6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdWxxX3NfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBjYXNlIE9QQ19BRERVX09CX0RTUDoKKyAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgY2FzZSBPUENfTVVMRVFfU19QV19RSEw6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVsZXFfc19wd19xaGwoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxFUV9TX1BXX1FIUjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdWxlcV9zX3B3X3FocihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01VTEVVX1NfUUhfT0JMOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bGV1X3NfcWhfb2JsKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTVVMRVVfU19RSF9PQlI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfbXVsZXVfc19xaF9vYnIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxRX1JTX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX211bHFfcnNfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIHRjZ190ZW1wX2ZyZWUodjFfdCk7CisgICAgdGNnX3RlbXBfZnJlZSh2Ml90KTsKKworICAgICh2b2lkKW9wbjsgLyogYXZvaWQgYSBjb21waWxlciB3YXJuaW5nICovCisgICAgTUlQU19ERUJVRygiJXMiLCBvcG4pOworCit9CisKK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX2JpdGluc24oQ1BVTUlQU1N0YXRlICplbnYsIERpc2FzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvcDEsIHVpbnQzMl90IG9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCwgaW50IHZhbCkKK3sKKyAgICBjb25zdCBjaGFyICpvcG4gPSAibWlwc2RzcCBCaXQvIE1hbmlwdWxhdGlvbiI7CisgICAgaW50MTZfdCBpbW07CisgICAgVENHdiB0MDsKKyAgICBUQ0d2IHZhbF90OworCisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIHZhbF90ID0gdGNnX3RlbXBfbmV3KCk7CisgICAgZ2VuX2xvYWRfZ3ByKHZhbF90LCB2YWwpOworCisgICAgc3dpdGNoIChvcDEpIHsKKyAgICBjYXNlIE9QQ19BQlNRX1NfUEhfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19CSVRSRVY6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfYml0cmV2KGNwdV9ncHJbcmV0XSwgdmFsX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1JFUExfUUI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRfbG9uZyByZXN1bHQ7CisgICAgICAgICAgICAgICAgaW1tID0gKGN0eC0+b3Bjb2RlID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHVpbnQzMl90KWltbSA8PCAyNCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWltbSA8PCAxNiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWltbSA8PCA4ICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWltbTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAoaW50MzJfdClyZXN1bHQ7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcmV0XSwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SRVBMVl9RQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgdGNnX2dlbl9leHQ4dV90bChjcHVfZ3ByW3JldF0sIHZhbF90KTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgY3B1X2dwcltyZXRdLCA4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgY3B1X2dwcltyZXRdLCAxNik7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV9ncHJbcmV0XSwgY3B1X2dwcltyZXRdLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3JldF0sIGNwdV9ncHJbcmV0XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUkVQTF9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltbSA9IChjdHgtPm9wY29kZSA+PiAxNikgJiAweDAzRkY7CisgICAgICAgICAgICAgICAgaW1tID0gKGludDE2X3QpKGltbSA8PCA2KSA+PiA2OworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bChjcHVfZ3ByW3JldF0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhcmdldF9sb25nKSgoaW50MzJfdClpbW0gPDwgMTYgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkodWludDE2X3QpaW1tKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUkVQTFZfUEg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MTZ1X3RsKGNwdV9ncHJbcmV0XSwgdmFsX3QpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQwLCBjcHVfZ3ByW3JldF0sIDE2KTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIHQwKTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcmV0XSwgY3B1X2dwcltyZXRdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBjYXNlIE9QQ19BQlNRX1NfUUhfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19SRVBMX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFyZ2V0X2xvbmcgdGVtcDsKKworICAgICAgICAgICAgICAgIGltbSA9IChjdHgtPm9wY29kZSA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHVpbnQ2NF90KWltbSA8PCA4KSB8ICh1aW50NjRfdClpbW07CisgICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDE2KSB8IHRlbXA7CisgICAgICAgICAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDMyKSB8IHRlbXA7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKGNwdV9ncHJbcmV0XSwgdGVtcCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgT1BDX1JFUExfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRfbG9uZyB0ZW1wOworCisgICAgICAgICAgICAgICAgaW1tID0gKGN0eC0+b3Bjb2RlID4+IDE2KSAmIDB4MDNGRjsKKyAgICAgICAgICAgICAgICBpbW0gPSAoaW50MTZfdCkoaW1tIDw8IDYpID4+IDY7CisgICAgICAgICAgICAgICAgdGVtcCA9ICgodGFyZ2V0X2xvbmcpaW1tIDw8IDMyKSBcCisgICAgICAgICAgICAgICAgICAgICAgIHwgKCh0YXJnZXRfbG9uZylpbW0gJiAweEZGRkZGRkZGKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZXRdLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBPUENfUkVQTF9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRhcmdldF9sb25nIHRlbXA7CisKKyAgICAgICAgICAgICAgICBpbW0gPSAoY3R4LT5vcGNvZGUgPj4gMTYpICYgMHgwM0ZGOworICAgICAgICAgICAgICAgIGltbSA9IChpbnQxNl90KShpbW0gPDwgNikgPj4gNjsKKworICAgICAgICAgICAgICAgIHRlbXAgPSAoKHVpbnQ2NF90KSh1aW50MTZfdClpbW0gPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50NjRfdCkodWludDE2X3QpaW1tIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpKHVpbnQxNl90KWltbSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKHVpbnQxNl90KWltbTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwoY3B1X2dwcltyZXRdLCB0ZW1wKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBPUENfUkVQTFZfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIHRjZ19nZW5fZXh0OHVfdGwoY3B1X2dwcltyZXRdLCB2YWxfdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDAsIGNwdV9ncHJbcmV0XSwgOCk7CisgICAgICAgICAgICB0Y2dfZ2VuX29yX3RsKGNwdV9ncHJbcmV0XSwgY3B1X2dwcltyZXRdLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDAsIGNwdV9ncHJbcmV0XSwgMTYpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3JldF0sIGNwdV9ncHJbcmV0XSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQwLCBjcHVfZ3ByW3JldF0sIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SRVBMVl9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfaTY0KGNwdV9ncHJbcmV0XSwgdmFsX3QpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQwLCBjcHVfZ3ByW3JldF0sIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SRVBMVl9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgdGNnX2dlbl9leHQxNnVfdGwoY3B1X2dwcltyZXRdLCB2YWxfdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwodDAsIGNwdV9ncHJbcmV0XSwgMTYpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3JldF0sIGNwdV9ncHJbcmV0XSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQwLCBjcHVfZ3ByW3JldF0sIDMyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltyZXRdLCBjcHVfZ3ByW3JldF0sIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHRjZ190ZW1wX2ZyZWUodmFsX3QpOworCisgICAgKHZvaWQpb3BuOyAvKiBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBNSVBTX0RFQlVHKCIlcyIsIG9wbik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX2FkZF9jbXBfcGljayhEaXNhc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvcDEsIHVpbnQzMl90IG9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0LCBpbnQgdjEsIGludCB2MiwgaW50IGNoZWNrX3JldCkKK3sKKyAgICBjb25zdCBjaGFyICpvcG4gPSAibWlwc2RzcCBhZGQgY29tcGFyZSBwaWNrIjsKKyAgICBUQ0d2IHQxOworICAgIFRDR3YgdjFfdDsKKyAgICBUQ0d2IHYyX3Q7CisKKyAgICBpZiAoKHJldCA9PSAwKSAmJiAoY2hlY2tfcmV0ID09IDEpKSB7CisgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0MSA9IHRjZ190ZW1wX25ldygpOworICAgIHYxX3QgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICB2Ml90ID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICBnZW5fbG9hZF9ncHIodjFfdCwgdjEpOworICAgIGdlbl9sb2FkX2dwcih2Ml90LCB2Mik7CisKKyAgICBzd2l0Y2ggKG9wMSkgeworICAgIGNhc2UgT1BDX0NNUFVfRVFfUUJfRFNQOgorICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19DTVBVX0VRX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcHVfZXFfcWIodjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QVV9MVF9RQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXB1X2x0X3FiKHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUFVfTEVfUUI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wdV9sZV9xYih2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBHVV9FUV9RQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBndV9lcV9xYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUEdVX0xUX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcGd1X2x0X3FiKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QR1VfTEVfUUI6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wZ3VfbGVfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBHRFVfRVFfUUI6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBndV9lcV9xYih0MSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JldF0sIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIDB4RjBGRkZGRkYpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQxLCB0MSwgMjQpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIHQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBHRFVfTFRfUUI6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBndV9sdF9xYih0MSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JldF0sIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIDB4RjBGRkZGRkYpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQxLCB0MSwgMjQpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIHQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBHRFVfTEVfUUI6CisgICAgICAgICAgICBjaGVja19kc3ByMihjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBndV9sZV9xYih0MSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfZ3ByW3JldF0sIHQxKTsKKyAgICAgICAgICAgIHRjZ19nZW5fYW5kaV90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIDB4RjBGRkZGRkYpOworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKHQxLCB0MSwgMjQpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZHNwY3RybCwgY3B1X2RzcGN0cmwsIHQxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBfRVFfUEg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wX2VxX3BoKHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUF9MVF9QSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBfbHRfcGgodjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QX0xFX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcF9sZV9waCh2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QSUNLX1FCOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3BpY2tfcWIoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QSUNLX1BIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3BpY2tfcGgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QQUNLUkxfUEg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfcGFja3JsX3BoKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfTUlQUzY0CisgICAgY2FzZSBPUENfQ01QVV9FUV9PQl9EU1A6CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgT1BDX0NNUF9FUV9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBfZXFfcHcodjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QX0xUX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcF9sdF9wdyh2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBfTEVfUFc6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wX2xlX3B3KHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUF9FUV9RSDoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBfZXFfcWgodjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QX0xUX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcF9sdF9xaCh2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBfTEVfUUg6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wX2xlX3FoKHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9FUV9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcGdkdV9lcV9vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9MVF9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcGdkdV9sdF9vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9MRV9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcHIyKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcGdkdV9sZV9vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUEdVX0VRX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcGd1X2VxX29iKGNwdV9ncHJbcmV0XSwgdjFfdCwgdjJfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QR1VfTFRfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wZ3VfbHRfb2IoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBHVV9MRV9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXBndV9sZV9vYihjcHVfZ3ByW3JldF0sIHYxX3QsIHYyX3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0NNUFVfRVFfT0I6CisgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfY21wdV9lcV9vYih2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBVX0xUX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2NtcHVfbHRfb2IodjFfdCwgdjJfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ01QVV9MRV9PQjoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9jbXB1X2xlX29iKHYxX3QsIHYyX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BBQ0tSTF9QVzoKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9wYWNrcmxfcHcoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QSUNLX09COgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3BpY2tfb2IoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QSUNLX1BXOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3BpY2tfcHcoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QSUNLX1FIOgorICAgICAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgICAgICBnZW5faGVscGVyX3BpY2tfcWgoY3B1X2dwcltyZXRdLCB2MV90LCB2Ml90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgdGNnX3RlbXBfZnJlZSh2MV90KTsKKyAgICB0Y2dfdGVtcF9mcmVlKHYyX3QpOworCisgICAgKHZvaWQpb3BuOyAvKiBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcgKi8KKyAgICBNSVBTX0RFQlVHKCIlcyIsIG9wbik7Cit9CisKK3N0YXRpYyB2b2lkIGdlbl9taXBzZHNwX2FwcGVuZChDUFVNSVBTU3RhdGUgKmVudiwgRGlzYXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3AxLCBpbnQgcnQsIGludCBycywgaW50IHNhKQoreworICAgIGNvbnN0IGNoYXIgKm9wbiA9ICJtaXBzZHNwIGFwcGVuZC9kYXBwZW5kIjsKKyAgICBUQ0d2IHQwOworCisgICAgY2hlY2tfZHNwcjIoY3R4KTsKKworICAgIGlmIChydCA9PSAwKSB7CisgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgIGdlbl9sb2FkX2dwcih0MCwgcnMpOworCisgICAgc3dpdGNoIChvcDEpIHsKKyAgICBjYXNlIE9QQ19BUFBFTkRfRFNQOgorICAgICAgICBzd2l0Y2ggKE1BU0tfQVBQRU5EKGN0eC0+b3Bjb2RlKSkgeworICAgICAgICBjYXNlIE9QQ19BUFBFTkQ6CisgICAgICAgICAgICBpZiAoc2EgIT0gMCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZGVwb3NpdF90bChjcHVfZ3ByW3J0XSwgdDAsIGNwdV9ncHJbcnRdLCBzYSwgMzIgLSBzYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltydF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRVBFTkQ6CisgICAgICAgICAgICBpZiAoc2EgIT0gMCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJ1X3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSwgc2EpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDMyIC0gc2EpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnRdLCB0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMyc190bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltydF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0JBTElHTjoKKyAgICAgICAgICAgIHNhICY9IDM7CisgICAgICAgICAgICBpZiAoc2EgIT0gMCAmJiBzYSAhPSAyKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaGxpX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSwgOCAqIHNhKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2V4dDMydV90bCh0MCwgdDApOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV90bCh0MCwgdDAsIDggKiAoNCAtIHNhKSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltydF0sIHQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICBNSVBTX0lOVkFMKCJNQVNLIEFQUEVORCIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBUQVJHRVRfTUlQUzY0CisgICAgY2FzZSBPUENfREFQUEVORF9EU1A6CisgICAgICAgIHN3aXRjaCAoTUFTS19EQVBQRU5EKGN0eC0+b3Bjb2RlKSkgeworICAgICAgICBjYXNlIE9QQ19EQVBQRU5EOgorICAgICAgICAgICAgaWYgKHNhICE9IDApIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX2RlcG9zaXRfdGwoY3B1X2dwcltydF0sIHQwLCBjcHVfZ3ByW3J0XSwgc2EsIDY0IC0gc2EpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1BSRVBFTkREOgorICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSwgMHgyMCB8IHNhKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDY0IC0gKDB4MjAgfCBzYSkpOworICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3J0XSwgdDAsIHQwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19QUkVQRU5EVzoKKyAgICAgICAgICAgIGlmIChzYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX3RsKGNwdV9ncHJbcnRdLCBjcHVfZ3ByW3J0XSwgc2EpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hsaV90bCh0MCwgdDAsIDY0IC0gc2EpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fb3JfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnRdLCB0MCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREJBTElHTjoKKyAgICAgICAgICAgIHNhICY9IDc7CisgICAgICAgICAgICBpZiAoc2EgIT0gMCAmJiBzYSAhPSAyICYmIHNhICE9IDQpIHsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfdGwoY3B1X2dwcltydF0sIGNwdV9ncHJbcnRdLCA4ICogc2EpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2hyaV90bCh0MCwgdDAsIDggKiAoOCAtIHNhKSk7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9vcl90bChjcHVfZ3ByW3J0XSwgY3B1X2dwcltydF0sIHQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgREFQUEVORCIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKyAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAodm9pZClvcG47IC8qIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyAqLworICAgIE1JUFNfREVCVUcoIiVzIiwgb3BuKTsKK30KKworc3RhdGljIHZvaWQgZ2VuX21pcHNkc3BfYWNjaW5zbihEaXNhc0NvbnRleHQgKmN0eCwgdWludDMyX3Qgb3AxLCB1aW50MzJfdCBvcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXQsIGludCB2MSwgaW50IHYyLCBpbnQgY2hlY2tfcmV0KQorCit7CisgICAgY29uc3QgY2hhciAqb3BuID0gIm1pcHNkc3AgYWNjdW11bGF0b3IiOworICAgIFRDR3YgdDA7CisgICAgVENHdiB0MTsKKyAgICBUQ0d2IHYxX3Q7CisgICAgVENHdiB2Ml90OworICAgIGludDE2X3QgaW1tOworCisgICAgaWYgKChyZXQgPT0gMCkgJiYgKGNoZWNrX3JldCA9PSAxKSkgeworICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICB0MSA9IHRjZ190ZW1wX25ldygpOworICAgIHYxX3QgPSB0Y2dfdGVtcF9uZXcoKTsKKyAgICB2Ml90ID0gdGNnX3RlbXBfbmV3KCk7CisKKyAgICBnZW5fbG9hZF9ncHIodjFfdCwgdjEpOworICAgIGdlbl9sb2FkX2dwcih2Ml90LCB2Mik7CisKKyAgICBzd2l0Y2ggKG9wMSkgeworICAgIGNhc2UgT1BDX0VYVFJfV19EU1A6CisgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICBjYXNlIE9QQ19FWFRSX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9leHRyX3coY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFJfUl9XOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDEsIHYxKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZXh0cl9yX3coY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFJfUlNfVzoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQxLCB2MSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2V4dHJfcnNfdyhjcHVfZ3ByW3JldF0sIHQwLCB0MSwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRVhUUl9TX0g6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9leHRyX3NfaChjcHVfZ3ByW3JldF0sIHQwLCB0MSwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRVhUUlZfU19IOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICBnZW5faGVscGVyX2V4dHJfc19oKGNwdV9ncHJbcmV0XSwgdDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFJWX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZXh0cl93KGNwdV9ncHJbcmV0XSwgdDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFJWX1JfVzoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9leHRyX3JfdyhjcHVfZ3ByW3JldF0sIHQwLCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19FWFRSVl9SU19XOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICBnZW5faGVscGVyX2V4dHJfcnNfdyhjcHVfZ3ByW3JldF0sIHQwLCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19FWFRQOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDEsIHYxKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZXh0cChjcHVfZ3ByW3JldF0sIHQwLCB0MSwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfRVhUUFY6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZXh0cChjcHVfZ3ByW3JldF0sIHQwLCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19FWFRQRFA6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9leHRwZHAoY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFBEUFY6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZXh0cGRwKGNwdV9ncHJbcmV0XSwgdDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NISUxPOgorICAgICAgICAgICAgaW1tID0gKGN0eC0+b3Bjb2RlID4+IDIwKSAmIDB4M0Y7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHJldCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDEsIGltbSk7CisgICAgICAgICAgICBnZW5faGVscGVyX3NoaWxvKHQwLCB0MSwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hJTE9WOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCByZXQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9zaGlsbyh0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTVRITElQOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCByZXQpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9tdGhsaXAodDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1dSRFNQOgorICAgICAgICAgICAgaW1tID0gKGN0eC0+b3Bjb2RlID4+IDExKSAmIDB4M0ZGOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCBpbW0pOworICAgICAgICAgICAgZ2VuX2hlbHBlcl93cmRzcCh2MV90LCB0MCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUkREU1A6CisgICAgICAgICAgICBpbW0gPSAoY3R4LT5vcGNvZGUgPj4gMTYpICYgMHgwM0ZGOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCBpbW0pOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9yZGRzcChjcHVfZ3ByW3JldF0sIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9NSVBTNjQKKyAgICBjYXNlIE9QQ19ERVhUUl9XX0RTUDoKKyAgICAgICAgY2hlY2tfZHNwKGN0eCk7CisgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgIGNhc2UgT1BDX0RNVEhMSVA6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHJldCk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RtdGhsaXAodjFfdCwgdDAsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RTSElMTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2hpZnQgPSAoY3R4LT5vcGNvZGUgPj4gMTkpICYgMHg3RjsKKyAgICAgICAgICAgICAgICBpbnQgYWMgPSAoY3R4LT5vcGNvZGUgPj4gMTEpICYgMHgwMzsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDEsIGFjKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RzaGlsbyh0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIE9QQ19EU0hJTE9WOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhYyA9IChjdHgtPm9wY29kZSA+PiAxMSkgJiAweDAzOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgYWMpOworICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZHNoaWxvKHYxX3QsIHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBPUENfREVYVFA6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworCisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRwKGNwdV9ncHJbcmV0XSwgdDAsIHQxLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ERVhUUFY6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZGV4dHAoY3B1X2dwcltyZXRdLCB0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREVYVFBEUDoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQxLCB2MSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRwZHAoY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRQRFBWOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRwZHAoY3B1X2dwcltyZXRdLCB0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREVYVFJfTDoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQxLCB2MSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRyX2woY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSX1JfTDoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQxLCB2MSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRyX3JfbChjcHVfZ3ByW3JldF0sIHQwLCB0MSwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREVYVFJfUlNfTDoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQxLCB2MSk7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRyX3JzX2woY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl93KGNwdV9ncHJbcmV0XSwgdDAsIHQxLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ERVhUUl9SX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl9yX3coY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSX1JTX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl9yc193KGNwdV9ncHJbcmV0XSwgdDAsIHQxLCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ERVhUUl9TX0g6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl9zX2goY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9TX0g6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MSwgdjEpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl9zX2goY3B1X2dwcltyZXRdLCB0MCwgdDEsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9MOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRyX2woY3B1X2dwcltyZXRdLCB0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREVYVFJWX1JfTDoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl9yX2woY3B1X2dwcltyZXRdLCB0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREVYVFJWX1JTX0w6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZGV4dHJfcnNfbChjcHVfZ3ByW3JldF0sIHQwLCB2MV90LCBjcHVfZW52KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ERVhUUlZfVzoKKyAgICAgICAgICAgIHRjZ19nZW5fbW92aV90bCh0MCwgdjIpOworICAgICAgICAgICAgZ2VuX2hlbHBlcl9kZXh0cl93KGNwdV9ncHJbcmV0XSwgdDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9SX1c6CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfdGwodDAsIHYyKTsKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfZGV4dHJfcl93KGNwdV9ncHJbcmV0XSwgdDAsIHYxX3QsIGNwdV9lbnYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9SU19XOgorICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX3RsKHQwLCB2Mik7CisgICAgICAgICAgICBnZW5faGVscGVyX2RleHRyX3JzX3coY3B1X2dwcltyZXRdLCB0MCwgdjFfdCwgY3B1X2Vudik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIH0KKworICAgIHRjZ190ZW1wX2ZyZWUodDApOworICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgIHRjZ190ZW1wX2ZyZWUodjFfdCk7CisgICAgdGNnX3RlbXBfZnJlZSh2Ml90KTsKKworICAgICh2b2lkKW9wbjsgLyogYXZvaWQgYSBjb21waWxlciB3YXJuaW5nICovCisgICAgTUlQU19ERUJVRygiJXMiLCBvcG4pOworfQorCisvKiBFbmQgTUlQU0RTUCBmdW5jdGlvbnMuICovCisKK3N0YXRpYyB2b2lkIGRlY29kZV9vcGMgKENQVU1JUFNTdGF0ZSAqZW52LCBEaXNhc0NvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQzMl90IG9mZnNldDsKKyAgICBpbnQgcnMsIHJ0LCByZCwgc2E7CisgICAgdWludDMyX3Qgb3AsIG9wMSwgb3AyOworICAgIGludDE2X3QgaW1tOworCisgICAgLyogbWFrZSBzdXJlIGluc3RydWN0aW9ucyBhcmUgb24gYSB3b3JkIGJvdW5kYXJ5ICovCisgICAgaWYgKGN0eC0+cGMgJiAweDMpIHsKKyAgICAgICAgZW52LT5DUDBfQmFkVkFkZHIgPSBjdHgtPnBjOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX0FkRUwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogSGFuZGxlIGJsaWtlbHkgbm90IHRha2VuIGNhc2UgKi8KKyAgICBpZiAoKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19CTUFTSykgPT0gTUlQU19IRkxBR19CTCkgeworICAgICAgICBpbnQgbDEgPSBnZW5fbmV3X2xhYmVsKCk7CisKKyAgICAgICAgTUlQU19ERUJVRygiYmxpa2VseSBjb25kaXRpb24gKCIgVEFSR0VUX0ZNVF9seCAiKSIsIGN0eC0+cGMgKyA0KTsKKyAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX05FLCBiY29uZCwgMCwgbDEpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKGhmbGFncywgY3R4LT5oZmxhZ3MgJiB+TUlQU19IRkxBR19CTUFTSyk7CisgICAgICAgIGdlbl9nb3RvX3RiKGN0eCwgMSwgY3R4LT5wYyArIDQpOworICAgICAgICBnZW5fc2V0X2xhYmVsKGwxKTsKKyAgICB9CisKKyAgICBpZiAodW5saWtlbHkocWVtdV9sb2dsZXZlbF9tYXNrKENQVV9MT0dfVEJfT1ApKSkKKyAgICAgICAgdGNnX2dlbl9kZWJ1Z19pbnNuX3N0YXJ0KGN0eC0+cGMpOworCisgICAgb3AgPSBNQVNLX09QX01BSk9SKGN0eC0+b3Bjb2RlKTsKKyAgICBycyA9IChjdHgtPm9wY29kZSA+PiAyMSkgJiAweDFmOworICAgIHJ0ID0gKGN0eC0+b3Bjb2RlID4+IDE2KSAmIDB4MWY7CisgICAgcmQgPSAoY3R4LT5vcGNvZGUgPj4gMTEpICYgMHgxZjsKKyAgICBzYSA9IChjdHgtPm9wY29kZSA+PiA2KSAmIDB4MWY7CisgICAgaW1tID0gKGludDE2X3QpY3R4LT5vcGNvZGU7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgT1BDX1NQRUNJQUw6CisgICAgICAgIG9wMSA9IE1BU0tfU1BFQ0lBTChjdHgtPm9wY29kZSk7CisgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgIGNhc2UgT1BDX1NMTDogICAgICAgICAgLyogU2hpZnQgd2l0aCBpbW1lZGlhdGUgKi8KKyAgICAgICAgY2FzZSBPUENfU1JBOgorICAgICAgICBjYXNlIE9QQ19TUkw6CisgICAgICAgICAgICBnZW5fc2hpZnRfaW1tKGVudiwgY3R4LCBvcDEsIHJkLCBydCwgc2EpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01PVk46ICAgICAgICAgLyogQ29uZGl0aW9uYWwgbW92ZSAqLworICAgICAgICBjYXNlIE9QQ19NT1ZaOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFM0IHwgSVNBX01JUFMzMik7CisgICAgICAgICAgICBnZW5fY29uZF9tb3ZlKGVudiwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BREQgLi4uIE9QQ19TVUJVOgorICAgICAgICAgICAgZ2VuX2FyaXRoKGVudiwgY3R4LCBvcDEsIHJkLCBycywgcnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NMTFY6ICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgIGNhc2UgT1BDX1NSTFY6CisgICAgICAgIGNhc2UgT1BDX1NSQVY6CisgICAgICAgICAgICBnZW5fc2hpZnQoZW52LCBjdHgsIG9wMSwgcmQsIHJzLCBydCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0xUOiAgICAgICAgICAvKiBTZXQgb24gbGVzcyB0aGFuICovCisgICAgICAgIGNhc2UgT1BDX1NMVFU6CisgICAgICAgICAgICBnZW5fc2x0KGVudiwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BTkQ6ICAgICAgICAgIC8qIExvZ2ljKi8KKyAgICAgICAgY2FzZSBPUENfT1I6CisgICAgICAgIGNhc2UgT1BDX05PUjoKKyAgICAgICAgY2FzZSBPUENfWE9SOgorICAgICAgICAgICAgZ2VuX2xvZ2ljKGVudiwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUxUIC4uLiBPUENfRElWVToKKyAgICAgICAgICAgIGlmIChzYSkgeworICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElOU05fVlI1NFhYKTsKKyAgICAgICAgICAgICAgICBvcDEgPSBNQVNLX01VTF9WUjU0WFgoY3R4LT5vcGNvZGUpOworICAgICAgICAgICAgICAgIGdlbl9tdWxfdnI1NHh4KGN0eCwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGdlbl9tdWxkaXYoY3R4LCBvcDEsIHJzLCBydCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfSlIgLi4uIE9QQ19KQUxSOgorICAgICAgICAgICAgZ2VuX2NvbXB1dGVfYnJhbmNoKGN0eCwgb3AxLCBycywgcmQsIHNhKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBPUENfVEdFIC4uLiBPUENfVEVROiAvKiBUcmFwcyAqLworICAgICAgICBjYXNlIE9QQ19UTkU6CisgICAgICAgICAgICBnZW5fdHJhcChjdHgsIG9wMSwgcnMsIHJ0LCAtMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfTUZISTogICAgICAgICAgLyogTW92ZSBmcm9tIEhJL0xPICovCisgICAgICAgIGNhc2UgT1BDX01GTE86CisgICAgICAgICAgICBnZW5fSElMTyhjdHgsIG9wMSwgcmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01USEk6CisgICAgICAgIGNhc2UgT1BDX01UTE86ICAgICAgICAgIC8qIE1vdmUgdG8gSEkvTE8gKi8KKyAgICAgICAgICAgIGdlbl9ISUxPKGN0eCwgb3AxLCBycyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfUE1PTjogICAgICAgICAgLyogUG1vbiBlbnRyeSBwb2ludCwgYWxzbyBSNDAxMCBzZWxzbCAqLworI2lmZGVmIE1JUFNfU1RSSUNUX1NUQU5EQVJECisgICAgICAgICAgICBNSVBTX0lOVkFMKCJQTU9OIC8gc2Vsc2wiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworI2Vsc2UKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfMWkocG1vbiwgY3B1X2Vudiwgc2EpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1lTQ0FMTDoKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfU1lTQ0FMTCk7CisgICAgICAgICAgICBjdHgtPmJzdGF0ZSA9IEJTX1NUT1A7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQlJFQUs6CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX0JSRUFLKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TUElNOgorI2lmZGVmIE1JUFNfU1RSSUNUX1NUQU5EQVJECisgICAgICAgICAgICBNSVBTX0lOVkFMKCJTUElNIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyNlbHNlCisgICAgICAgICAgIC8qIEltcGxlbWVudGVkIGFzIFJJIGV4Y2VwdGlvbiBmb3Igbm93LiAqLworICAgICAgICAgICAgTUlQU19JTlZBTCgic3BpbSAodW5vZmZpY2lhbCkiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU1lOQzoKKyAgICAgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BDX01PVkNJOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFM0IHwgSVNBX01JUFMzMik7CisgICAgICAgICAgICBpZiAoZW52LT5DUDBfQ29uZmlnMSAmICgxIDw8IENQMEMxX0ZQKSkgeworICAgICAgICAgICAgICAgIGNoZWNrX2NwMV9lbmFibGVkKGN0eCk7CisgICAgICAgICAgICAgICAgZ2VuX21vdmNpKGN0eCwgcmQsIHJzLCAoY3R4LT5vcGNvZGUgPj4gMTgpICYgMHg3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5vcGNvZGUgPj4gMTYpICYgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9lcnIoY3R4LCBFWENQX0NwVSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAvKiBNSVBTNjQgc3BlY2lmaWMgb3Bjb2RlcyAqLworICAgICAgICBjYXNlIE9QQ19EU0xMOgorICAgICAgICBjYXNlIE9QQ19EU1JBOgorICAgICAgICBjYXNlIE9QQ19EU1JMOgorICAgICAgICBjYXNlIE9QQ19EU0xMMzI6CisgICAgICAgIGNhc2UgT1BDX0RTUkEzMjoKKyAgICAgICAgY2FzZSBPUENfRFNSTDMyOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzKTsKKyAgICAgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9zaGlmdF9pbW0oZW52LCBjdHgsIG9wMSwgcmQsIHJ0LCBzYSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfREFERCAuLi4gT1BDX0RTVUJVOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzKTsKKyAgICAgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9hcml0aChlbnYsIGN0eCwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EU0xMVjoKKyAgICAgICAgY2FzZSBPUENfRFNSQVY6CisgICAgICAgIGNhc2UgT1BDX0RTUkxWOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzKTsKKyAgICAgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9zaGlmdChlbnYsIGN0eCwgb3AxLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ETVVMVCAuLi4gT1BDX0RESVZVOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzKTsKKyAgICAgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9tdWxkaXYoY3R4LCBvcDEsIHJzLCBydCk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgIE1JUFNfSU5WQUwoInNwZWNpYWwiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU1BFQ0lBTDI6CisgICAgICAgIG9wMSA9IE1BU0tfU1BFQ0lBTDIoY3R4LT5vcGNvZGUpOworICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICBjYXNlIE9QQ19NQUREIC4uLiBPUENfTUFERFU6IC8qIE11bHRpcGx5IGFuZCBhZGQvc3ViICovCisgICAgICAgIGNhc2UgT1BDX01TVUIgLi4uIE9QQ19NU1VCVToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzIpOworICAgICAgICAgICAgZ2VuX211bGRpdihjdHgsIG9wMSwgcnMsIHJ0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19NVUw6CisgICAgICAgICAgICBnZW5fYXJpdGgoZW52LCBjdHgsIG9wMSwgcmQsIHJzLCBydCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQ0xPOgorICAgICAgICBjYXNlIE9QQ19DTFo6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyKTsKKyAgICAgICAgICAgIGdlbl9jbChjdHgsIG9wMSwgcmQsIHJzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TREJCUDoKKyAgICAgICAgICAgIC8qIFhYWDogbm90IGNsZWFyIHdoaWNoIGV4Y2VwdGlvbiBzaG91bGQgYmUgcmFpc2VkCisgICAgICAgICAgICAgKiAgICAgIHdoZW4gaW4gZGVidWcgbW9kZS4uLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyKTsKKyAgICAgICAgICAgIGlmICghKGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19ETSkpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX0RCcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfREJwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgY2FzZSBPUENfRENMTzoKKyAgICAgICAgY2FzZSBPUENfRENMWjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTNjQpOworICAgICAgICAgICAgY2hlY2tfbWlwc182NChjdHgpOworICAgICAgICAgICAgZ2VuX2NsKGN0eCwgb3AxLCByZCwgcnMpOworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICBNSVBTX0lOVkFMKCJzcGVjaWFsMiIpOworICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TUEVDSUFMMzoKKyAgICAgICAgb3AxID0gTUFTS19TUEVDSUFMMyhjdHgtPm9wY29kZSk7CisgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgIGNhc2UgT1BDX0VYVDoKKyAgICAgICAgY2FzZSBPUENfSU5TOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9iaXRvcHMoY3R4LCBvcDEsIHJ0LCBycywgc2EsIHJkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19CU0hGTDoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBvcDIgPSBNQVNLX0JTSEZMKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIGdlbl9ic2hmbChjdHgsIG9wMiwgcnQsIHJkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SREhXUjoKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChyZCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9yZGh3cl9jcHVudW0odDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9yZGh3cl9zeW5jaV9zdGVwKHQwLCBjcHVfZW52KTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfcmRod3JfY2ModDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9yZGh3cl9jY3Jlcyh0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOToKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgICAgICAgICAgICAgICAgIHRjZ19nZW5fbGRfdGwodDAsIGNwdV9lbnYsIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgdGxzX3ZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IFNvbWUgQ1BVcyBpbXBsZW1lbnQgdGhpcyBpbiBoYXJkd2FyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgTm90IHN1cHBvcnRlZCB5ZXQuICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgTUlQU19JTlZBTCgicmRod3IiKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19GT1JLOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01UKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ0d2IHQwID0gdGNnX3RlbXBfbmV3KCk7CisgICAgICAgICAgICAgICAgVENHdiB0MSA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQxLCBycyk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl9mb3JrKHQwLCB0MSk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfWUlFTEQ6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRDR3YgdDAgPSB0Y2dfdGVtcF9uZXcoKTsKKworICAgICAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICAgICAgZ2VuX2xvYWRfZ3ByKHQwLCBycyk7CisgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl95aWVsZCh0MCwgY3B1X2VudiwgdDApOworICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJkKTsKKyAgICAgICAgICAgICAgICB0Y2dfdGVtcF9mcmVlKHQwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19ESVZfR18yRSAuLi4gT1BDX0RJVlVfR18yRToKKyAgICAgICAgY2FzZSBPUENfTU9EX0dfMkUgLi4uIE9QQ19NT0RVX0dfMkU6CisgICAgICAgIGNhc2UgT1BDX01VTFRfR18yRSAuLi4gT1BDX01VTFRVX0dfMkU6CisgICAgICAgIC8qIE9QQ19NVUxUX0dfMkUsIE9QQ19BRERVSF9RQl9EU1AsIE9QQ19NVUxfUEhfRFNQIGhhdmUKKyAgICAgICAgICogdGhlIHNhbWUgbWFzayBhbmQgb3AxLiAqLworICAgICAgICAgICAgaWYgKChlbnYtPmluc25fZmxhZ3MgJiBBU0VfRFNQUjIpICYmIChvcDEgPT0gT1BDX01VTFRfR18yRSkpIHsKKyAgICAgICAgICAgICAgICBvcDIgPSBNQVNLX0FERFVIX1FCKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgICAgIGNhc2UgT1BDX0FERFVIX1FCOgorICAgICAgICAgICAgICAgIGNhc2UgT1BDX0FERFVIX1JfUUI6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfQUREUUhfUEg6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfQUREUUhfUl9QSDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19BRERRSF9XOgorICAgICAgICAgICAgICAgIGNhc2UgT1BDX0FERFFIX1JfVzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19TVUJVSF9RQjoKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19TVUJVSF9SX1FCOgorICAgICAgICAgICAgICAgIGNhc2UgT1BDX1NVQlFIX1BIOgorICAgICAgICAgICAgICAgIGNhc2UgT1BDX1NVQlFIX1JfUEg6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfU1VCUUhfVzoKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19TVUJRSF9SX1c6CisgICAgICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FyaXRoKGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19NVUxfUEg6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfTVVMX1NfUEg6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfTVVMUV9TX1c6CisgICAgICAgICAgICAgICAgY2FzZSBPUENfTVVMUV9SU19XOgorICAgICAgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9tdWx0aXBseShjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBBRERVSC5RQiIpOworICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19MWF9EU1A6CisgICAgICAgICAgICBvcDIgPSBNQVNLX0xYKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAgICAgY2FzZSBPUENfTERYOgorI2VuZGlmCisgICAgICAgICAgICBjYXNlIE9QQ19MQlVYOgorICAgICAgICAgICAgY2FzZSBPUENfTEhYOgorICAgICAgICAgICAgY2FzZSBPUENfTFdYOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2xkKGVudiwgY3R4LCBvcDIsIHJkLCBycywgcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBMWCIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FCU1FfU19QSF9EU1A6CisgICAgICAgICAgICBvcDIgPSBNQVNLX0FCU1FfU19QSChjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSBPUENfQUJTUV9TX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfQUJTUV9TX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQUJTUV9TX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVFfV19QSEw6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVFfV19QSFI6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVFVX1BIX1FCTDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUEhfUUJSOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9QSF9RQkxBOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9QSF9RQlJBOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VVX1BIX1FCTDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9QSF9RQlI6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUEhfUUJMQToKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9QSF9RQlJBOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FyaXRoKGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfQklUUkVWOgorICAgICAgICAgICAgY2FzZSBPUENfUkVQTF9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX1JFUExWX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfUkVQTF9QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1JFUExWX1BIOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2JpdGluc24oZW52LCBjdHgsIG9wMSwgb3AyLCByZCwgcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBNSVBTX0lOVkFMKCJNQVNLIEFCU1FfUy5QSCIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FERFVfUUJfRFNQOgorICAgICAgICAgICAgb3AyID0gTUFTS19BRERVX1FCKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19BRERRX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQUREUV9TX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQUREUV9TX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19BRERVX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfQUREVV9TX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfQUREVV9QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0FERFVfU19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1NVQlFfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19TVUJRX1NfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19TVUJRX1NfVzoKKyAgICAgICAgICAgIGNhc2UgT1BDX1NVQlVfUUI6CisgICAgICAgICAgICBjYXNlIE9QQ19TVUJVX1NfUUI6CisgICAgICAgICAgICBjYXNlIE9QQ19TVUJVX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfU1VCVV9TX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQUREU0M6CisgICAgICAgICAgICBjYXNlIE9QQ19BRERXQzoKKyAgICAgICAgICAgIGNhc2UgT1BDX01PRFNVQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX1JBRERVX1dfUUI6CisgICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYXJpdGgoY3R4LCBvcDEsIG9wMiwgcmQsIHJzLCBydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9QQ19NVUxFVV9TX1BIX1FCTDoKKyAgICAgICAgICAgIGNhc2UgT1BDX01VTEVVX1NfUEhfUUJSOgorICAgICAgICAgICAgY2FzZSBPUENfTVVMUV9SU19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX01VTEVRX1NfV19QSEw6CisgICAgICAgICAgICBjYXNlIE9QQ19NVUxFUV9TX1dfUEhSOgorICAgICAgICAgICAgY2FzZSBPUENfTVVMUV9TX1BIOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX211bHRpcGx5KGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBBRERVLlFCIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19DTVBVX0VRX1FCX0RTUDoKKyAgICAgICAgICAgIG9wMiA9IE1BU0tfQ01QVV9FUV9RQihjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JfU1JBX1BIX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDUl9TUkFfUl9QSF9XOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FyaXRoKGN0eCwgb3AxLCBvcDIsIHJ0LCBycywgcmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JfUUJfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDUlFfUUJfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDUlFfUEhfVzoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNSUV9SU19QSF9XOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JRVV9TX1FCX1BIOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FyaXRoKGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfQ01QVV9FUV9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX0NNUFVfTFRfUUI6CisgICAgICAgICAgICBjYXNlIE9QQ19DTVBVX0xFX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfQ01QX0VRX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQ01QX0xUX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfQ01QX0xFX1BIOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FkZF9jbXBfcGljayhjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0NNUEdVX0VRX1FCOgorICAgICAgICAgICAgY2FzZSBPUENfQ01QR1VfTFRfUUI6CisgICAgICAgICAgICBjYXNlIE9QQ19DTVBHVV9MRV9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9FUV9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9MVF9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9MRV9RQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BJQ0tfUUI6CisgICAgICAgICAgICBjYXNlIE9QQ19QSUNLX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfUEFDS1JMX1BIOgorICAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FkZF9jbXBfcGljayhjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgQ01QVS5FUS5RQiIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX1NITExfUUJfRFNQOgorICAgICAgICAgICAgZ2VuX21pcHNkc3Bfc2hpZnQoY3R4LCBvcDEsIHJkLCBycywgcnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RQQV9XX1BIX0RTUDoKKyAgICAgICAgICAgIG9wMiA9IE1BU0tfRFBBX1dfUEgoY3R4LT5vcGNvZGUpOworICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQQVVfSF9RQkw6CisgICAgICAgICAgICBjYXNlIE9QQ19EUEFVX0hfUUJSOgorICAgICAgICAgICAgY2FzZSBPUENfRFBTVV9IX1FCTDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQU1VfSF9RQlI6CisgICAgICAgICAgICBjYXNlIE9QQ19EUEFfV19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQQVhfV19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQQVFfU19XX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfRFBBUVhfU19XX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfRFBBUVhfU0FfV19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQU19XX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfRFBTWF9XX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfRFBTUV9TX1dfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19EUFNRWF9TX1dfUEg6CisgICAgICAgICAgICBjYXNlIE9QQ19EUFNRWF9TQV9XX1BIOgorICAgICAgICAgICAgY2FzZSBPUENfTVVMU0FRX1NfV19QSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0RQQVFfU0FfTF9XOgorICAgICAgICAgICAgY2FzZSBPUENfRFBTUV9TQV9MX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1BITDoKKyAgICAgICAgICAgIGNhc2UgT1BDX01BUV9TX1dfUEhSOgorICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUEhMOgorICAgICAgICAgICAgY2FzZSBPUENfTUFRX1NBX1dfUEhSOgorICAgICAgICAgICAgY2FzZSBPUENfTVVMU0FfV19QSDoKKyAgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9tdWx0aXBseShjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgRFBBVy5QSCIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0lOU1ZfRFNQOgorICAgICAgICAgICAgb3AyID0gTUFTS19JTlNWKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19JTlNWOgorICAgICAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVENHdiB0MCwgdDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1JUFNfREVCVUcoIk5PUCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgICAgICAgICB0MSA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICAgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2luc3YoY3B1X2dwcltydF0sIGNwdV9lbnYsIHQxLCB0MCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ190ZW1wX2ZyZWUodDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgICAgICBNSVBTX0lOVkFMKCJNQVNLIElOU1YiKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19BUFBFTkRfRFNQOgorICAgICAgICAgICAgZ2VuX21pcHNkc3BfYXBwZW5kKGVudiwgY3R4LCBvcDEsIHJ0LCBycywgcmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0VYVFJfV19EU1A6CisgICAgICAgICAgICBvcDIgPSBNQVNLX0VYVFJfVyhjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSBPUENfRVhUUl9XOgorICAgICAgICAgICAgY2FzZSBPUENfRVhUUl9SX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19FWFRSX1JTX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19FWFRSX1NfSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0VYVFJWX1NfSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0VYVFJWX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19FWFRSVl9SX1c6CisgICAgICAgICAgICBjYXNlIE9QQ19FWFRSVl9SU19XOgorICAgICAgICAgICAgY2FzZSBPUENfRVhUUDoKKyAgICAgICAgICAgIGNhc2UgT1BDX0VYVFBWOgorICAgICAgICAgICAgY2FzZSBPUENfRVhUUERQOgorICAgICAgICAgICAgY2FzZSBPUENfRVhUUERQVjoKKyAgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9hY2NpbnNuKGN0eCwgb3AxLCBvcDIsIHJ0LCBycywgcmQsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUENfUkREU1A6CisgICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYWNjaW5zbihjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1NISUxPOgorICAgICAgICAgICAgY2FzZSBPUENfU0hJTE9WOgorICAgICAgICAgICAgY2FzZSBPUENfTVRITElQOgorICAgICAgICAgICAgY2FzZSBPUENfV1JEU1A6CisgICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYWNjaW5zbihjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgRVhUUi5XIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgICAgIGNhc2UgT1BDX0RFWFRNIC4uLiBPUENfREVYVDoKKyAgICAgICAgY2FzZSBPUENfRElOU00gLi4uIE9QQ19ESU5TOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFM2NFIyKTsKKyAgICAgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9iaXRvcHMoY3R4LCBvcDEsIHJ0LCBycywgc2EsIHJkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19EQlNIRkw6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzY0UjIpOworICAgICAgICAgICAgY2hlY2tfbWlwc182NChjdHgpOworICAgICAgICAgICAgb3AyID0gTUFTS19EQlNIRkwoY3R4LT5vcGNvZGUpOworICAgICAgICAgICAgZ2VuX2JzaGZsKGN0eCwgb3AyLCBydCwgcmQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0FCU1FfU19RSF9EU1A6CisgICAgICAgICAgICBvcDIgPSBNQVNLX0FCU1FfU19RSChjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRX0xfUFdMOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRX0xfUFdSOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRX1BXX1FITDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFUV9QV19RSFI6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVFfUFdfUUhMQToKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFUV9QV19RSFJBOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VRVV9RSF9PQkw6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVFVX1FIX09CUjoKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUUhfT0JMQToKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFUVVfUUhfT0JSQToKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUNFVV9RSF9PQkw6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUUhfT0JSOgorICAgICAgICAgICAgY2FzZSBPUENfUFJFQ0VVX1FIX09CTEE6CisgICAgICAgICAgICBjYXNlIE9QQ19QUkVDRVVfUUhfT0JSQToKKyAgICAgICAgICAgIGNhc2UgT1BDX0FCU1FfU19PQjoKKyAgICAgICAgICAgIGNhc2UgT1BDX0FCU1FfU19QVzoKKyAgICAgICAgICAgIGNhc2UgT1BDX0FCU1FfU19RSDoKKyAgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9hcml0aChjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1JFUExfT0I6CisgICAgICAgICAgICBjYXNlIE9QQ19SRVBMX1BXOgorICAgICAgICAgICAgY2FzZSBPUENfUkVQTF9RSDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1JFUExWX09COgorICAgICAgICAgICAgY2FzZSBPUENfUkVQTFZfUFc6CisgICAgICAgICAgICBjYXNlIE9QQ19SRVBMVl9RSDoKKyAgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9iaXRpbnNuKGVudiwgY3R4LCBvcDEsIG9wMiwgcmQsIHJ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgQUJTUV9TLlFIIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBPUENfQUREVV9PQl9EU1A6CisgICAgICAgICAgIG9wMiA9IE1BU0tfQUREVV9PQihjdHgtPm9wY29kZSk7CisgICAgICAgICAgIHN3aXRjaCAob3AyKSB7CisgICAgICAgICAgIGNhc2UgT1BDX1JBRERVX0xfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX1NVQlFfUFc6CisgICAgICAgICAgIGNhc2UgT1BDX1NVQlFfU19QVzoKKyAgICAgICAgICAgY2FzZSBPUENfU1VCUV9RSDoKKyAgICAgICAgICAgY2FzZSBPUENfU1VCUV9TX1FIOgorICAgICAgICAgICBjYXNlIE9QQ19TVUJVX09COgorICAgICAgICAgICBjYXNlIE9QQ19TVUJVX1NfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX1NVQlVfUUg6CisgICAgICAgICAgIGNhc2UgT1BDX1NVQlVfU19RSDoKKyAgICAgICAgICAgY2FzZSBPUENfU1VCVUhfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX1NVQlVIX1JfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX0FERFFfUFc6CisgICAgICAgICAgIGNhc2UgT1BDX0FERFFfU19QVzoKKyAgICAgICAgICAgY2FzZSBPUENfQUREUV9RSDoKKyAgICAgICAgICAgY2FzZSBPUENfQUREUV9TX1FIOgorICAgICAgICAgICBjYXNlIE9QQ19BRERVX09COgorICAgICAgICAgICBjYXNlIE9QQ19BRERVX1NfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX0FERFVfUUg6CisgICAgICAgICAgIGNhc2UgT1BDX0FERFVfU19RSDoKKyAgICAgICAgICAgY2FzZSBPUENfQUREVUhfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX0FERFVIX1JfT0I6CisgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9hcml0aChjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIE9QQ19NVUxFUV9TX1BXX1FITDoKKyAgICAgICAgICAgY2FzZSBPUENfTVVMRVFfU19QV19RSFI6CisgICAgICAgICAgIGNhc2UgT1BDX01VTEVVX1NfUUhfT0JMOgorICAgICAgICAgICBjYXNlIE9QQ19NVUxFVV9TX1FIX09CUjoKKyAgICAgICAgICAgY2FzZSBPUENfTVVMUV9SU19RSDoKKyAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX211bHRpcGx5KGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQsIDEpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBBRERVLk9CIik7CisgICAgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgT1BDX0NNUFVfRVFfT0JfRFNQOgorICAgICAgICAgICBvcDIgPSBNQVNLX0NNUFVfRVFfT0IoY3R4LT5vcGNvZGUpOworICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICBjYXNlIE9QQ19QUkVDUl9TUkFfUUhfUFc6CisgICAgICAgICAgIGNhc2UgT1BDX1BSRUNSX1NSQV9SX1FIX1BXOgorICAgICAgICAgICAgICAgLyogUmV0dXJuIHZhbHVlIGlzIHJ0LiAqLworICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYXJpdGgoY3R4LCBvcDEsIG9wMiwgcnQsIHJzLCByZCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JfT0JfUUg6CisgICAgICAgICAgIGNhc2UgT1BDX1BSRUNSUV9PQl9RSDoKKyAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1BXX0w6CisgICAgICAgICAgIGNhc2UgT1BDX1BSRUNSUV9RSF9QVzoKKyAgICAgICAgICAgY2FzZSBPUENfUFJFQ1JRX1JTX1FIX1BXOgorICAgICAgICAgICBjYXNlIE9QQ19QUkVDUlFVX1NfT0JfUUg6CisgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9hcml0aChjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIE9QQ19DTVBVX0VRX09COgorICAgICAgICAgICBjYXNlIE9QQ19DTVBVX0xUX09COgorICAgICAgICAgICBjYXNlIE9QQ19DTVBVX0xFX09COgorICAgICAgICAgICBjYXNlIE9QQ19DTVBfRVFfUUg6CisgICAgICAgICAgIGNhc2UgT1BDX0NNUF9MVF9RSDoKKyAgICAgICAgICAgY2FzZSBPUENfQ01QX0xFX1FIOgorICAgICAgICAgICBjYXNlIE9QQ19DTVBfRVFfUFc6CisgICAgICAgICAgIGNhc2UgT1BDX0NNUF9MVF9QVzoKKyAgICAgICAgICAgY2FzZSBPUENfQ01QX0xFX1BXOgorICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYWRkX2NtcF9waWNrKGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQsIDApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGNhc2UgT1BDX0NNUEdEVV9FUV9PQjoKKyAgICAgICAgICAgY2FzZSBPUENfQ01QR0RVX0xUX09COgorICAgICAgICAgICBjYXNlIE9QQ19DTVBHRFVfTEVfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX0NNUEdVX0VRX09COgorICAgICAgICAgICBjYXNlIE9QQ19DTVBHVV9MVF9PQjoKKyAgICAgICAgICAgY2FzZSBPUENfQ01QR1VfTEVfT0I6CisgICAgICAgICAgIGNhc2UgT1BDX1BBQ0tSTF9QVzoKKyAgICAgICAgICAgY2FzZSBPUENfUElDS19PQjoKKyAgICAgICAgICAgY2FzZSBPUENfUElDS19QVzoKKyAgICAgICAgICAgY2FzZSBPUENfUElDS19RSDoKKyAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX2FkZF9jbXBfcGljayhjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAxKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIk1BU0sgQ01QVV9FUS5PQiIpOworICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIE9QQ19EQVBQRU5EX0RTUDoKKyAgICAgICAgICAgZ2VuX21pcHNkc3BfYXBwZW5kKGVudiwgY3R4LCBvcDEsIHJ0LCBycywgcmQpOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIE9QQ19ERVhUUl9XX0RTUDoKKyAgICAgICAgICAgb3AyID0gTUFTS19ERVhUUl9XKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFA6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRQRFA6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRQRFBWOgorICAgICAgICAgICBjYXNlIE9QQ19ERVhUUFY6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRSX0w6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRSX1JfTDoKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFJfUlNfTDoKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFJfVzoKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFJfUl9XOgorICAgICAgICAgICBjYXNlIE9QQ19ERVhUUl9SU19XOgorICAgICAgICAgICBjYXNlIE9QQ19ERVhUUl9TX0g6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9MOgorICAgICAgICAgICBjYXNlIE9QQ19ERVhUUlZfUl9MOgorICAgICAgICAgICBjYXNlIE9QQ19ERVhUUlZfUlNfTDoKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFJWX1NfSDoKKyAgICAgICAgICAgY2FzZSBPUENfREVYVFJWX1c6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9SX1c6CisgICAgICAgICAgIGNhc2UgT1BDX0RFWFRSVl9SU19XOgorICAgICAgICAgICAgICAgZ2VuX21pcHNkc3BfYWNjaW5zbihjdHgsIG9wMSwgb3AyLCBydCwgcnMsIHJkLCAxKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIE9QQ19ETVRITElQOgorICAgICAgICAgICBjYXNlIE9QQ19EU0hJTE86CisgICAgICAgICAgIGNhc2UgT1BDX0RTSElMT1Y6CisgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9hY2NpbnNuKGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQsIDApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBFWFRSLlciKTsKKyAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBPUENfRFBBUV9XX1FIX0RTUDoKKyAgICAgICAgICAgb3AyID0gTUFTS19EUEFRX1dfUUgoY3R4LT5vcGNvZGUpOworICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICBjYXNlIE9QQ19EUEFVX0hfT0JMOgorICAgICAgICAgICBjYXNlIE9QQ19EUEFVX0hfT0JSOgorICAgICAgICAgICBjYXNlIE9QQ19EUFNVX0hfT0JMOgorICAgICAgICAgICBjYXNlIE9QQ19EUFNVX0hfT0JSOgorICAgICAgICAgICBjYXNlIE9QQ19EUEFfV19RSDoKKyAgICAgICAgICAgY2FzZSBPUENfRFBBUV9TX1dfUUg6CisgICAgICAgICAgIGNhc2UgT1BDX0RQU19XX1FIOgorICAgICAgICAgICBjYXNlIE9QQ19EUFNRX1NfV19RSDoKKyAgICAgICAgICAgY2FzZSBPUENfTVVMU0FRX1NfV19RSDoKKyAgICAgICAgICAgY2FzZSBPUENfRFBBUV9TQV9MX1BXOgorICAgICAgICAgICBjYXNlIE9QQ19EUFNRX1NBX0xfUFc6CisgICAgICAgICAgIGNhc2UgT1BDX01VTFNBUV9TX0xfUFc6CisgICAgICAgICAgICAgICBnZW5fbWlwc2RzcF9tdWx0aXBseShjdHgsIG9wMSwgb3AyLCByZCwgcnMsIHJ0LCAwKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1FITEw6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TX1dfUUhMUjoKKyAgICAgICAgICAgY2FzZSBPUENfTUFRX1NfV19RSFJMOgorICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19XX1FIUlI6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TQV9XX1FITEw6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TQV9XX1FITFI6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TQV9XX1FIUkw6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TQV9XX1FIUlI6CisgICAgICAgICAgIGNhc2UgT1BDX01BUV9TX0xfUFdMOgorICAgICAgICAgICBjYXNlIE9QQ19NQVFfU19MX1BXUjoKKyAgICAgICAgICAgY2FzZSBPUENfRE1BREQ6CisgICAgICAgICAgIGNhc2UgT1BDX0RNQUREVToKKyAgICAgICAgICAgY2FzZSBPUENfRE1TVUI6CisgICAgICAgICAgIGNhc2UgT1BDX0RNU1VCVToKKyAgICAgICAgICAgICAgIGdlbl9taXBzZHNwX211bHRpcGx5KGN0eCwgb3AxLCBvcDIsIHJkLCBycywgcnQsIDApOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogSW52YWxpZCAqLworICAgICAgICAgICAgICAgTUlQU19JTlZBTCgiTUFTSyBEUEFRLlcuUUgiKTsKKyAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX0RJTlNWX0RTUDoKKyAgICAgICAgICAgIG9wMiA9IE1BU0tfSU5TVihjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMikgeworICAgICAgICAgICAgY2FzZSBPUENfRElOU1Y6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUQ0d2IHQwLCB0MTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTUlQU19ERUJVRygiTk9QIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGVja19kc3AoY3R4KTsKKworICAgICAgICAgICAgICAgICAgICB0MCA9IHRjZ190ZW1wX25ldygpOworICAgICAgICAgICAgICAgICAgICB0MSA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICAgICAgICAgIGdlbl9sb2FkX2dwcih0MCwgcnQpOworICAgICAgICAgICAgICAgICAgICBnZW5fbG9hZF9ncHIodDEsIHJzKTsKKworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2RpbnN2KGNwdV9ncHJbcnRdLCBjcHVfZW52LCB0MSwgdDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgICAgICBNSVBTX0lOVkFMKCJNQVNLIERJTlNWIik7CisgICAgICAgICAgICAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uKGN0eCwgRVhDUF9SSSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfU0hMTF9PQl9EU1A6CisgICAgICAgICAgICBnZW5fbWlwc2RzcF9zaGlmdChjdHgsIG9wMSwgcmQsIHJzLCBydCk7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIEludmFsaWQgKi8KKyAgICAgICAgICAgIE1JUFNfSU5WQUwoInNwZWNpYWwzIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX1JFR0lNTToKKyAgICAgICAgb3AxID0gTUFTS19SRUdJTU0oY3R4LT5vcGNvZGUpOworICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICBjYXNlIE9QQ19CTFRaIC4uLiBPUENfQkdFWkw6IC8qIFJFR0lNTSBicmFuY2hlcyAqLworICAgICAgICBjYXNlIE9QQ19CTFRaQUwgLi4uIE9QQ19CR0VaQUxMOgorICAgICAgICAgICAgZ2VuX2NvbXB1dGVfYnJhbmNoKGN0eCwgb3AxLCBycywgLTEsIGltbSA8PCAyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBPUENfVEdFSSAuLi4gT1BDX1RFUUk6IC8qIFJFR0lNTSB0cmFwcyAqLworICAgICAgICBjYXNlIE9QQ19UTkVJOgorICAgICAgICAgICAgZ2VuX3RyYXAoY3R4LCBvcDEsIHJzLCAtMSwgaW1tKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19TWU5DSToKKyAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICAvKiBUcmVhdCBhcyBOT1AuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQlBPU0dFMzI6ICAgIC8qIE1JUFMgRFNQIGJyYW5jaCAqLworI2lmIGRlZmluZWQoVEFSR0VUX01JUFM2NCkKKyAgICAgICAgY2FzZSBPUENfQlBPU0dFNjQ6CisjZW5kaWYKKyAgICAgICAgICAgIGNoZWNrX2RzcChjdHgpOworICAgICAgICAgICAgZ2VuX2NvbXB1dGVfYnJhbmNoKGN0eCwgb3AxLCAtMSwgLTIsIGltbSA8PCAyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICBNSVBTX0lOVkFMKCJyZWdpbW0iKTsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfQ1AwOgorICAgICAgICBjaGVja19jcDBfZW5hYmxlZChjdHgpOworICAgICAgICBvcDEgPSBNQVNLX0NQMChjdHgtPm9wY29kZSk7CisgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgIGNhc2UgT1BDX01GQzA6CisgICAgICAgIGNhc2UgT1BDX01UQzA6CisgICAgICAgIGNhc2UgT1BDX01GVFI6CisgICAgICAgIGNhc2UgT1BDX01UVFI6CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICBjYXNlIE9QQ19ETUZDMDoKKyAgICAgICAgY2FzZSBPUENfRE1UQzA6CisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgICAgICAgICAgZ2VuX2NwMChlbnYsIGN0eCwgb3AxLCBydCwgcmQpOworI2VuZGlmIC8qICFDT05GSUdfVVNFUl9PTkxZICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfQzBfRklSU1QgLi4uIE9QQ19DMF9MQVNUOgorI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgICAgICBnZW5fY3AwKGVudiwgY3R4LCBNQVNLX0MwKGN0eC0+b3Bjb2RlKSwgcnQsIHJkKTsKKyNlbmRpZiAvKiAhQ09ORklHX1VTRVJfT05MWSAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BDX01GTUMwOgorI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENHdiB0MCA9IHRjZ190ZW1wX25ldygpOworCisgICAgICAgICAgICAgICAgb3AyID0gTUFTS19NRk1DMChjdHgtPm9wY29kZSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcDIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19ETVQ6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZG10KHQwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19FTVQ6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZW10KHQwKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX3N0b3JlX2dwcih0MCwgcnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9QQ19EVlBFOgorICAgICAgICAgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTVQpOworICAgICAgICAgICAgICAgICAgICBnZW5faGVscGVyX2R2cGUodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT1BDX0VWUEU6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIEFTRV9NVCk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZXZwZSh0MCwgY3B1X2Vudik7CisgICAgICAgICAgICAgICAgICAgIGdlbl9zdG9yZV9ncHIodDAsIHJ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUENfREk6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZGkodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPUENfRUk6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICAgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9oZWxwZXJfZWkodDAsIGNwdV9lbnYpOworICAgICAgICAgICAgICAgICAgICBnZW5fc3RvcmVfZ3ByKHQwLCBydCk7CisgICAgICAgICAgICAgICAgICAgIC8qIFN0b3AgdHJhbnNsYXRpb24gYXMgd2UgbWF5IGhhdmUgc3dpdGNoZWQgdGhlIGV4ZWN1dGlvbiBtb2RlICovCisgICAgICAgICAgICAgICAgICAgIGN0eC0+YnN0YXRlID0gQlNfU1RPUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoIm1mbWMwIik7CisgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbihjdHgsIEVYQ1BfUkkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNnX3RlbXBfZnJlZSh0MCk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogIUNPTkZJR19VU0VSX09OTFkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QQ19SRFBHUFI6CisgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMyUjIpOworICAgICAgICAgICAgZ2VuX2xvYWRfc3JzZ3ByKHJ0LCByZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUENfV1JQR1BSOgorICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgSVNBX01JUFMzMlIyKTsKKyAgICAgICAgICAgIGdlbl9zdG9yZV9zcnNncHIocnQsIHJkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTUlQU19JTlZBTCgiY3AwIik7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0FEREk6IC8qIEFyaXRobWV0aWMgd2l0aCBpbW1lZGlhdGUgb3Bjb2RlICovCisgICAgY2FzZSBPUENfQURESVU6CisgICAgICAgICBnZW5fYXJpdGhfaW1tKGVudiwgY3R4LCBvcCwgcnQsIHJzLCBpbW0pOworICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUENfU0xUSTogLyogU2V0IG9uIGxlc3MgdGhhbiB3aXRoIGltbWVkaWF0ZSBvcGNvZGUgKi8KKyAgICBjYXNlIE9QQ19TTFRJVToKKyAgICAgICAgIGdlbl9zbHRfaW1tKGVudiwgb3AsIHJ0LCBycywgaW1tKTsKKyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0FOREk6IC8qIEFyaXRobWV0aWMgd2l0aCBpbW1lZGlhdGUgb3Bjb2RlICovCisgICAgY2FzZSBPUENfTFVJOgorICAgIGNhc2UgT1BDX09SSToKKyAgICBjYXNlIE9QQ19YT1JJOgorICAgICAgICAgZ2VuX2xvZ2ljX2ltbShlbnYsIG9wLCBydCwgcnMsIGltbSk7CisgICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19KIC4uLiBPUENfSkFMOiAvKiBKdW1wICovCisgICAgICAgICBvZmZzZXQgPSAoaW50MzJfdCkoY3R4LT5vcGNvZGUgJiAweDNGRkZGRkYpIDw8IDI7CisgICAgICAgICBnZW5fY29tcHV0ZV9icmFuY2goY3R4LCBvcCwgcnMsIHJ0LCBvZmZzZXQpOworICAgICAgICAgcmV0dXJuOworICAgIGNhc2UgT1BDX0JFUSAuLi4gT1BDX0JHVFo6IC8qIEJyYW5jaCAqLworICAgIGNhc2UgT1BDX0JFUUwgLi4uIE9QQ19CR1RaTDoKKyAgICAgICAgIGdlbl9jb21wdXRlX2JyYW5jaChjdHgsIG9wLCBycywgcnQsIGltbSA8PCAyKTsKKyAgICAgICAgIHJldHVybjsKKyAgICBjYXNlIE9QQ19MQiAuLi4gT1BDX0xXUjogLyogTG9hZCBhbmQgc3RvcmVzICovCisgICAgY2FzZSBPUENfU0IgLi4uIE9QQ19TVzoKKyAgICBjYXNlIE9QQ19TV1I6CisgICAgY2FzZSBPUENfTEw6CisgICAgICAgICBnZW5fbGRzdChjdHgsIG9wLCBydCwgcnMsIGltbSk7CisgICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TQzoKKyAgICAgICAgIGdlbl9zdF9jb25kKGN0eCwgb3AsIHJ0LCBycywgaW1tKTsKKyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1BDX0NBQ0hFOgorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMgfCBJU0FfTUlQUzMyKTsKKyAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19QUkVGOgorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzQgfCBJU0FfTUlQUzMyKTsKKyAgICAgICAgLyogVHJlYXQgYXMgTk9QLiAqLworICAgICAgICBicmVhazsKKworICAgIC8qIEZsb2F0aW5nIHBvaW50IChDT1AxKS4gKi8KKyAgICBjYXNlIE9QQ19MV0MxOgorICAgIGNhc2UgT1BDX0xEQzE6CisgICAgY2FzZSBPUENfU1dDMToKKyAgICBjYXNlIE9QQ19TREMxOgorICAgICAgICBpZiAoZW52LT5DUDBfQ29uZmlnMSAmICgxIDw8IENQMEMxX0ZQKSkgeworICAgICAgICAgICAgY2hlY2tfY3AxX2VuYWJsZWQoY3R4KTsKKyAgICAgICAgICAgIGdlbl9mbHRfbGRzdChjdHgsIG9wLCBydCwgcnMsIGltbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb25fZXJyKGN0eCwgRVhDUF9DcFUsIDEpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUENfQ1AxOgorICAgICAgICBpZiAoZW52LT5DUDBfQ29uZmlnMSAmICgxIDw8IENQMEMxX0ZQKSkgeworICAgICAgICAgICAgY2hlY2tfY3AxX2VuYWJsZWQoY3R4KTsKKyAgICAgICAgICAgIG9wMSA9IE1BU0tfQ1AxKGN0eC0+b3Bjb2RlKTsKKyAgICAgICAgICAgIHN3aXRjaCAob3AxKSB7CisgICAgICAgICAgICBjYXNlIE9QQ19NRkhDMToKKyAgICAgICAgICAgIGNhc2UgT1BDX01USEMxOgorICAgICAgICAgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMzJSMik7CisgICAgICAgICAgICBjYXNlIE9QQ19NRkMxOgorICAgICAgICAgICAgY2FzZSBPUENfQ0ZDMToKKyAgICAgICAgICAgIGNhc2UgT1BDX01UQzE6CisgICAgICAgICAgICBjYXNlIE9QQ19DVEMxOgorICAgICAgICAgICAgICAgIGdlbl9jcDEoY3R4LCBvcDEsIHJ0LCByZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgICAgICAgICAgY2FzZSBPUENfRE1GQzE6CisgICAgICAgICAgICBjYXNlIE9QQ19ETVRDMToKKyAgICAgICAgICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBJU0FfTUlQUzMpOworICAgICAgICAgICAgICAgIGdlbl9jcDEoY3R4LCBvcDEsIHJ0LCByZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgT1BDX0JDMUFOWTI6CisgICAgICAgICAgICBjYXNlIE9QQ19CQzFBTlk0OgorICAgICAgICAgICAgICAgIGNoZWNrX2NvcDF4KGN0eCk7CisgICAgICAgICAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01JUFMzRCk7CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlIE9QQ19CQzE6CisgICAgICAgICAgICAgICAgZ2VuX2NvbXB1dGVfYnJhbmNoMShlbnYsIGN0eCwgTUFTS19CQzEoY3R4LT5vcGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ0ID4+IDIpICYgMHg3LCBpbW0gPDwgMik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgY2FzZSBPUENfU19GTVQ6CisgICAgICAgICAgICBjYXNlIE9QQ19EX0ZNVDoKKyAgICAgICAgICAgIGNhc2UgT1BDX1dfRk1UOgorICAgICAgICAgICAgY2FzZSBPUENfTF9GTVQ6CisgICAgICAgICAgICBjYXNlIE9QQ19QU19GTVQ6CisgICAgICAgICAgICAgICAgZ2VuX2Zhcml0aChjdHgsIE1BU0tfQ1AxX0ZVTkMoY3R4LT5vcGNvZGUpLCBydCwgcmQsIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltbSA+PiA4KSAmIDB4Nyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoImNwMSIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbiAoY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9lcnIoY3R4LCBFWENQX0NwVSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAvKiBDT1AyLiAgKi8KKyAgICBjYXNlIE9QQ19MV0MyOgorICAgIGNhc2UgT1BDX0xEQzI6CisgICAgY2FzZSBPUENfU1dDMjoKKyAgICBjYXNlIE9QQ19TREMyOgorICAgIGNhc2UgT1BDX0NQMjoKKyAgICAgICAgLyogQ09QMjogTm90IGltcGxlbWVudGVkLiAqLworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb25fZXJyKGN0eCwgRVhDUF9DcFUsIDIpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgT1BDX0NQMzoKKyAgICAgICAgaWYgKGVudi0+Q1AwX0NvbmZpZzEgJiAoMSA8PCBDUDBDMV9GUCkpIHsKKyAgICAgICAgICAgIGNoZWNrX2NwMV9lbmFibGVkKGN0eCk7CisgICAgICAgICAgICBvcDEgPSBNQVNLX0NQMyhjdHgtPm9wY29kZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9wMSkgeworICAgICAgICAgICAgY2FzZSBPUENfTFdYQzE6CisgICAgICAgICAgICBjYXNlIE9QQ19MRFhDMToKKyAgICAgICAgICAgIGNhc2UgT1BDX0xVWEMxOgorICAgICAgICAgICAgY2FzZSBPUENfU1dYQzE6CisgICAgICAgICAgICBjYXNlIE9QQ19TRFhDMToKKyAgICAgICAgICAgIGNhc2UgT1BDX1NVWEMxOgorICAgICAgICAgICAgICAgIGdlbl9mbHQzX2xkc3QoY3R4LCBvcDEsIHNhLCByZCwgcnMsIHJ0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX1BSRUZYOgorICAgICAgICAgICAgICAgIC8qIFRyZWF0IGFzIE5PUC4gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT1BDX0FMTlZfUFM6CisgICAgICAgICAgICBjYXNlIE9QQ19NQUREX1M6CisgICAgICAgICAgICBjYXNlIE9QQ19NQUREX0Q6CisgICAgICAgICAgICBjYXNlIE9QQ19NQUREX1BTOgorICAgICAgICAgICAgY2FzZSBPUENfTVNVQl9TOgorICAgICAgICAgICAgY2FzZSBPUENfTVNVQl9EOgorICAgICAgICAgICAgY2FzZSBPUENfTVNVQl9QUzoKKyAgICAgICAgICAgIGNhc2UgT1BDX05NQUREX1M6CisgICAgICAgICAgICBjYXNlIE9QQ19OTUFERF9EOgorICAgICAgICAgICAgY2FzZSBPUENfTk1BRERfUFM6CisgICAgICAgICAgICBjYXNlIE9QQ19OTVNVQl9TOgorICAgICAgICAgICAgY2FzZSBPUENfTk1TVUJfRDoKKyAgICAgICAgICAgIGNhc2UgT1BDX05NU1VCX1BTOgorICAgICAgICAgICAgICAgIGdlbl9mbHQzX2FyaXRoKGN0eCwgb3AxLCBzYSwgcnMsIHJkLCBydCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIE1JUFNfSU5WQUwoImNwMyIpOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbiAoY3R4LCBFWENQX1JJKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9lcnIoY3R4LCBFWENQX0NwVSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgLyogTUlQUzY0IG9wY29kZXMgKi8KKyAgICBjYXNlIE9QQ19MV1U6CisgICAgY2FzZSBPUENfTERMIC4uLiBPUENfTERSOgorICAgIGNhc2UgT1BDX1NETCAuLi4gT1BDX1NEUjoKKyAgICBjYXNlIE9QQ19MTEQ6CisgICAgY2FzZSBPUENfTEQ6CisgICAgY2FzZSBPUENfU0Q6CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgZ2VuX2xkc3QoY3R4LCBvcCwgcnQsIHJzLCBpbW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19TQ0Q6CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgZ2VuX3N0X2NvbmQoY3R4LCBvcCwgcnQsIHJzLCBpbW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QQ19EQURESToKKyAgICBjYXNlIE9QQ19EQURESVU6CisgICAgICAgIGNoZWNrX2luc24oZW52LCBjdHgsIElTQV9NSVBTMyk7CisgICAgICAgIGNoZWNrX21pcHNfNjQoY3R4KTsKKyAgICAgICAgZ2VuX2FyaXRoX2ltbShlbnYsIGN0eCwgb3AsIHJ0LCBycywgaW1tKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIE9QQ19KQUxYOgorICAgICAgICBjaGVja19pbnNuKGVudiwgY3R4LCBBU0VfTUlQUzE2KTsKKyAgICAgICAgLyogTUlQUzE2OiBOb3QgaW1wbGVtZW50ZWQuICovCisgICAgY2FzZSBPUENfTURNWDoKKyAgICAgICAgY2hlY2tfaW5zbihlbnYsIGN0eCwgQVNFX01ETVgpOworICAgICAgICAvKiBNRE1YOiBOb3QgaW1wbGVtZW50ZWQuICovCisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBJbnZhbGlkICovCisgICAgICAgIE1JUFNfSU5WQUwoIm1ham9yIG9wY29kZSIpOworICAgICAgICBnZW5lcmF0ZV9leGNlcHRpb24oY3R4LCBFWENQX1JJKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjdHgtPmhmbGFncyAmIE1JUFNfSEZMQUdfQk1BU0spIHsKKyAgICAgICAgaW50IGhmbGFncyA9IGN0eC0+aGZsYWdzICYgTUlQU19IRkxBR19CTUFTSzsKKyAgICAgICAgLyogQnJhbmNoZXMgY29tcGxldGlvbiAqLworICAgICAgICBjdHgtPmhmbGFncyAmPSB+TUlQU19IRkxBR19CTUFTSzsKKyAgICAgICAgY3R4LT5ic3RhdGUgPSBCU19CUkFOQ0g7CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKGN0eCwgMCk7CisgICAgICAgIC8qIEZJWE1FOiBOZWVkIHRvIGNsZWFyIGNhbl9kb19pby4gICovCisgICAgICAgIHN3aXRjaCAoaGZsYWdzKSB7CisgICAgICAgIGNhc2UgTUlQU19IRkxBR19COgorICAgICAgICAgICAgLyogdW5jb25kaXRpb25hbCBicmFuY2ggKi8KKyAgICAgICAgICAgIE1JUFNfREVCVUcoInVuY29uZGl0aW9uYWwgYnJhbmNoIik7CisgICAgICAgICAgICBnZW5fZ290b190YihjdHgsIDAsIGN0eC0+YnRhcmdldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNSVBTX0hGTEFHX0JMOgorICAgICAgICAgICAgLyogYmxpa2VseSB0YWtlbiBjYXNlICovCisgICAgICAgICAgICBNSVBTX0RFQlVHKCJibGlrZWx5IGJyYW5jaCB0YWtlbiIpOworICAgICAgICAgICAgZ2VuX2dvdG9fdGIoY3R4LCAwLCBjdHgtPmJ0YXJnZXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUlQU19IRkxBR19CQzoKKyAgICAgICAgICAgIC8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLworICAgICAgICAgICAgTUlQU19ERUJVRygiY29uZGl0aW9uYWwgYnJhbmNoIik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGwxID0gZ2VuX25ld19sYWJlbCgpOworCisgICAgICAgICAgICAgICAgdGNnX2dlbl9icmNvbmRpX3RsKFRDR19DT05EX05FLCBiY29uZCwgMCwgbDEpOworICAgICAgICAgICAgICAgIGdlbl9nb3RvX3RiKGN0eCwgMSwgY3R4LT5wYyArIDQpOworICAgICAgICAgICAgICAgIGdlbl9zZXRfbGFiZWwobDEpOworICAgICAgICAgICAgICAgIGdlbl9nb3RvX3RiKGN0eCwgMCwgY3R4LT5idGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1JUFNfSEZMQUdfQlI6CisgICAgICAgICAgICAvKiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byByZWdpc3RlciAqLworICAgICAgICAgICAgTUlQU19ERUJVRygiYnJhbmNoIHRvIHJlZ2lzdGVyIik7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl90bChjcHVfUEMsIGJ0YXJnZXQpOworICAgICAgICAgICAgaWYgKGN0eC0+c2luZ2xlc3RlcF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoY3R4LCAwKTsKKyAgICAgICAgICAgICAgICBnZW5faGVscGVyXzFpKHJhaXNlX2V4Y2VwdGlvbiwgY3B1X2VudiwgRVhDUF9ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfZ2VuX2V4aXRfdGIoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1JUFNfREVCVUcoInVua25vd24gYnJhbmNoIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwgKENQVU1JUFNTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYXJjaF9wYykKK3sKKyAgICBEaXNhc0NvbnRleHQgY3R4OworICAgIHRhcmdldF91bG9uZyBwY19zdGFydDsKKyAgICB1aW50MTZfdCAqZ2VuX29wY19lbmQ7CisgICAgQ1BVQnJlYWtwb2ludCAqYnA7CisgICAgaW50IGosIGxqID0gLTE7CisgICAgaW50IG51bV9pbnNuczsKKyAgICBpbnQgbWF4X2luc25zOworCisgICAgaWYgKHNlYXJjaF9wYykKKyAgICAgICAgcWVtdV9sb2coInNlYXJjaCBwYyAlZFxuIiwgc2VhcmNoX3BjKTsKKworICAgIHBjX3N0YXJ0ID0gdGItPnBjOworICAgIGdlbl9vcGNfZW5kID0gdGNnX2N0eC5nZW5fb3BjX2J1ZiArIE9QQ19NQVhfU0laRTsKKyAgICBjdHgucGMgPSBwY19zdGFydDsKKyAgICBjdHguc2F2ZWRfcGMgPSAtMTsKKyAgICBjdHguc2luZ2xlc3RlcF9lbmFibGVkID0gRU5WX0dFVF9DUFUoZW52KS0+c2luZ2xlc3RlcF9lbmFibGVkOworICAgIGN0eC50YiA9IHRiOworICAgIGN0eC5ic3RhdGUgPSBCU19OT05FOworICAgIC8qIFJlc3RvcmUgZGVsYXkgc2xvdCBzdGF0ZSBmcm9tIHRoZSB0YiBjb250ZXh0LiAgKi8KKyAgICBjdHguaGZsYWdzID0gKHVpbnQzMl90KXRiLT5mbGFnczsgLyogRklYTUU6IG1heWJlIHVzZSA2NCBiaXRzIGhlcmU/ICovCisgICAgcmVzdG9yZV9jcHVfc3RhdGUoZW52LCAmY3R4KTsKKyNpZmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgICAgIGN0eC5tZW1faWR4ID0gTUlQU19IRkxBR19VTTsKKyNlbHNlCisgICAgICAgIGN0eC5tZW1faWR4ID0gY3R4LmhmbGFncyAmIE1JUFNfSEZMQUdfS1NVOworI2VuZGlmCisgICAgbnVtX2luc25zID0gMDsKKyAgICBtYXhfaW5zbnMgPSB0Yi0+Y2ZsYWdzICYgQ0ZfQ09VTlRfTUFTSzsKKyAgICBpZiAobWF4X2luc25zID09IDApCisgICAgICAgIG1heF9pbnNucyA9IENGX0NPVU5UX01BU0s7CisjaWZkZWYgREVCVUdfRElTQVMKKyAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfQ1BVLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAvKiBGSVhNRTogVGhpcyBtYXkgcHJpbnQgb3V0IHN0YWxlIGhmbGFncyBmcm9tIGVudi4uLiAqLworICAgIGxvZ19jcHVfc3RhdGVfbWFzayhDUFVfTE9HX1RCX0NQVSwgRU5WX0dFVF9DUFUoZW52KSwgMCk7CisjZW5kaWYKKyAgICBMT0dfRElTQVMoIlxudGIgJXAgaWR4ICVkIGhmbGFncyAlMDR4XG4iLCB0YiwgY3R4Lm1lbV9pZHgsIGN0eC5oZmxhZ3MpOworICAgIGdlbl9pY291bnRfc3RhcnQoKTsKKyAgICB3aGlsZSAoY3R4LmJzdGF0ZSA9PSBCU19OT05FKSB7CisgICAgICAgIGlmICh1bmxpa2VseSghUVRBSUxRX0VNUFRZKCZlbnYtPmJyZWFrcG9pbnRzKSkpIHsKKyAgICAgICAgICAgIFFUQUlMUV9GT1JFQUNIKGJwLCAmZW52LT5icmVha3BvaW50cywgZW50cnkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnAtPnBjID09IGN0eC5wYykgeworICAgICAgICAgICAgICAgICAgICBzYXZlX2NwdV9zdGF0ZSgmY3R4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3R4LmJzdGF0ZSA9IEJTX0JSQU5DSDsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2hlbHBlcl8xaShyYWlzZV9leGNlcHRpb24sIGNwdV9lbnYsIEVYQ1BfREVCVUcpOworICAgICAgICAgICAgICAgICAgICAvKiBJbmNsdWRlIHRoZSBicmVha3BvaW50IGxvY2F0aW9uIG9yIHRoZSB0YiB3b24ndAorICAgICAgICAgICAgICAgICAgICAgKiBiZSBmbHVzaGVkIHdoZW4gaXQgbXVzdCBiZS4gICovCisgICAgICAgICAgICAgICAgICAgIGN0eC5wYyArPSA0OworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmVfZ2VuZXJhdGluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VhcmNoX3BjKSB7CisgICAgICAgICAgICBqID0gdGNnX2N0eC5nZW5fb3BjX3B0ciAtIHRjZ19jdHguZ2VuX29wY19idWY7CisgICAgICAgICAgICBpZiAobGogPCBqKSB7CisgICAgICAgICAgICAgICAgbGorKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGogPCBqKQorICAgICAgICAgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfaW5zdHJfc3RhcnRbbGorK10gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX2N0eC5nZW5fb3BjX3BjW2xqXSA9IGN0eC5wYzsKKyAgICAgICAgICAgIGdlbl9vcGNfaGZsYWdzW2xqXSA9IGN0eC5oZmxhZ3MgJiBNSVBTX0hGTEFHX0JNQVNLOworICAgICAgICAgICAgdGNnX2N0eC5nZW5fb3BjX2luc3RyX3N0YXJ0W2xqXSA9IDE7CisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfaWNvdW50W2xqXSA9IG51bV9pbnNuczsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtX2luc25zICsgMSA9PSBtYXhfaW5zbnMgJiYgKHRiLT5jZmxhZ3MgJiBDRl9MQVNUX0lPKSkKKyAgICAgICAgICAgIGdlbl9pb19zdGFydCgpOworICAgICAgICBjdHgub3Bjb2RlID0gY3B1X2xkbF9jb2RlKGVudiwgY3R4LnBjKTsKKyAgICAgICAgZGVjb2RlX29wYyhlbnYsICZjdHgpOworICAgICAgICBjdHgucGMgKz0gNDsKKyAgICAgICAgbnVtX2luc25zKys7CisKKyAgICAgICAgLyogRXhlY3V0ZSBhIGJyYW5jaCBhbmQgaXRzIGRlbGF5IHNsb3QgYXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICAgICAgICAgIFRoaXMgaXMgd2hhdCBHREIgZXhwZWN0cyBhbmQgaXMgY29uc2lzdGVudCB3aXRoIHdoYXQgdGhlCisgICAgICAgICAgIGhhcmR3YXJlIGRvZXMgKGUuZy4gaWYgYSBkZWxheSBzbG90IGluc3RydWN0aW9uIGZhdWx0cywgdGhlCisgICAgICAgICAgIHJlcG9ydGVkIFBDIGlzIHRoZSBQQyBvZiB0aGUgYnJhbmNoKS4gICovCisgICAgICAgIGlmIChFTlZfR0VUX0NQVShlbnYpLT5zaW5nbGVzdGVwX2VuYWJsZWQgJiYgKGN0eC5oZmxhZ3MgJiBNSVBTX0hGTEFHX0JNQVNLKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogRG8gbm90IHNwbGl0IGEgYnJhbmNoIGluc3RydWN0aW9uIGFuZCBpdHMgZGVsYXkgc2xvdCBpbnRvIHR3bworICAgICAgICAgICBUQidzIHdoZW4gYSBwYWdlIGJvdW5kYXJ5IGlzIGNyb3NzZWQuIFRoaXMgY2F1c2VzIFRCJ3MgdG8gYmUKKyAgICAgICAgICAgaW52YWxpZGF0ZWQgaW5jb3JyZWN0bHkgaWYgYnJhbmNoIHRhcmdldCBpcyBwYXRjaGVkLiAgKi8KKyAgICAgICAgaWYgKChjdHgucGMgJiAoVEFSR0VUX1BBR0VfU0laRSAtIDEpKSA9PSAwICYmIChjdHguaGZsYWdzICYgTUlQU19IRkxBR19CTUFTSykgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICh0Y2dfY3R4Lmdlbl9vcGNfcHRyID49IGdlbl9vcGNfZW5kKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKG51bV9pbnNucyA+PSBtYXhfaW5zbnMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoc2luZ2xlc3RlcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodGItPmNmbGFncyAmIENGX0xBU1RfSU8pCisgICAgICAgIGdlbl9pb19lbmQoKTsKKyAgICBpZiAoRU5WX0dFVF9DUFUoZW52KS0+c2luZ2xlc3RlcF9lbmFibGVkICYmIGN0eC5ic3RhdGUgIT0gQlNfQlJBTkNIKSB7CisgICAgICAgIHNhdmVfY3B1X3N0YXRlKCZjdHgsIGN0eC5ic3RhdGUgPT0gQlNfTk9ORSk7CisgICAgICAgIGdlbl9oZWxwZXJfMWkocmFpc2VfZXhjZXB0aW9uLCBjcHVfZW52LCBFWENQX0RFQlVHKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGN0eC5ic3RhdGUpIHsKKyAgICAgICAgY2FzZSBCU19TVE9QOgorICAgICAgICAgICAgZ2VuX2hlbHBlcl9pbnRlcnJ1cHRfcmVzdGFydChjcHVfZW52KTsKKyAgICAgICAgICAgIGdlbl9nb3RvX3RiKCZjdHgsIDAsIGN0eC5wYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCU19OT05FOgorICAgICAgICAgICAgc2F2ZV9jcHVfc3RhdGUoJmN0eCwgMCk7CisgICAgICAgICAgICBnZW5fZ290b190YigmY3R4LCAwLCBjdHgucGMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQlNfRVhDUDoKKyAgICAgICAgICAgIGdlbl9oZWxwZXJfaW50ZXJydXB0X3Jlc3RhcnQoY3B1X2Vudik7CisgICAgICAgICAgICB0Y2dfZ2VuX2V4aXRfdGIoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCU19CUkFOQ0g6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK2RvbmVfZ2VuZXJhdGluZzoKKyAgICBnZW5faWNvdW50X2VuZCh0YiwgbnVtX2luc25zKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0ciA9IElOREVYX29wX2VuZDsKKyAgICBpZiAoc2VhcmNoX3BjKSB7CisgICAgICAgIGogPSB0Y2dfY3R4Lmdlbl9vcGNfcHRyIC0gdGNnX2N0eC5nZW5fb3BjX2J1ZjsKKyAgICAgICAgbGorKzsKKyAgICAgICAgd2hpbGUgKGxqIDw9IGopCisgICAgICAgICAgICB0Y2dfY3R4Lmdlbl9vcGNfaW5zdHJfc3RhcnRbbGorK10gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHRiLT5zaXplID0gY3R4LnBjIC0gcGNfc3RhcnQ7CisgICAgICAgIHRiLT5pY291bnQgPSBudW1faW5zbnM7CisgICAgfQorI2lmZGVmIERFQlVHX0RJU0FTCisgICAgTE9HX0RJU0FTKCJcbiIpOworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9JTl9BU00pKSB7CisgICAgICAgIHFlbXVfbG9nKCJJTjogJXNcbiIsIGxvb2t1cF9zeW1ib2wocGNfc3RhcnQpKTsKKyAgICAgICAgbG9nX3RhcmdldF9kaXNhcyhlbnYsIHBjX3N0YXJ0LCBjdHgucGMgLSBwY19zdGFydCwgMCk7CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworICAgIH0KKyAgICBxZW11X2xvZ19tYXNrKENQVV9MT0dfVEJfQ1BVLCAiLS0tLS0tLS0tLS0tLS0tLSAlZCAlMDh4XG4iLCBjdHguYnN0YXRlLCBjdHguaGZsYWdzKTsKKyNlbmRpZgorfQorCit2b2lkIGdlbl9pbnRlcm1lZGlhdGVfY29kZSAoQ1BVTUlQU1N0YXRlICplbnYsIHN0cnVjdCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBnZW5faW50ZXJtZWRpYXRlX2NvZGVfaW50ZXJuYWwoZW52LCB0YiwgMCk7Cit9CisKK3ZvaWQgZ2VuX2ludGVybWVkaWF0ZV9jb2RlX3BjIChDUFVNSVBTU3RhdGUgKmVudiwgc3RydWN0IFRyYW5zbGF0aW9uQmxvY2sgKnRiKQoreworICAgIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9pbnRlcm5hbChlbnYsIHRiLCAxKTsKK30KKworc3RhdGljIHZvaWQgZnB1X2R1bXBfc3RhdGUoQ1BVTUlQU1N0YXRlICplbnYsIEZJTEUgKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCBpOworICAgIGludCBpc19mcHU2NCA9ICEhKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19GNjQpOworCisjZGVmaW5lIHByaW50ZnByKGZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGlzX2ZwdTY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmcHVfZnByaW50ZihmLCAidzolMDh4IGQ6JTAxNmx4IGZkOiUxM2cgZnM6JTEzZyBwc3U6ICUxM2dcbiIsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKGZwKS0+d1tGUF9FTkRJQU5fSURYXSwgKGZwKS0+ZCwgKGZwKS0+ZmQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcCktPmZzW0ZQX0VORElBTl9JRFhdLCAoZnApLT5mc1shRlBfRU5ESUFOX0lEWF0pOyBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnByX3QgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRtcC53W0ZQX0VORElBTl9JRFhdID0gKGZwKS0+d1tGUF9FTkRJQU5fSURYXTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0bXAud1shRlBfRU5ESUFOX0lEWF0gPSAoKGZwKSArIDEpLT53W0ZQX0VORElBTl9JRFhdOyAgICAgICAgICAgXAorICAgICAgICAgICAgZnB1X2ZwcmludGYoZiwgInc6JTA4eCBkOiUwMTZseCBmZDolMTNnIGZzOiUxM2cgcHN1OiUxM2dcbiIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcC53W0ZQX0VORElBTl9JRFhdLCB0bXAuZCwgdG1wLmZkLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAuZnNbRlBfRU5ESUFOX0lEWF0sIHRtcC5mc1shRlBfRU5ESUFOX0lEWF0pOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlKDApCisKKworICAgIGZwdV9mcHJpbnRmKGYsICJDUDEgRkNSMCAweCUwOHggIEZDUjMxIDB4JTA4eCAgU1IuRlIgJWQgIGZwX3N0YXR1cyAweCUwOHgoMHglMDJ4KVxuIiwKKyAgICAgICAgICAgICAgICBlbnYtPmFjdGl2ZV9mcHUuZmNyMCwgZW52LT5hY3RpdmVfZnB1LmZjcjMxLCBpc19mcHU2NCwgZW52LT5hY3RpdmVfZnB1LmZwX3N0YXR1cywKKyAgICAgICAgICAgICAgICBnZXRfZmxvYXRfZXhjZXB0aW9uX2ZsYWdzKCZlbnYtPmFjdGl2ZV9mcHUuZnBfc3RhdHVzKSk7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyAoaXNfZnB1NjQpID8gaSsrIDogKGkgKz0gMikpIHsKKyAgICAgICAgZnB1X2ZwcmludGYoZiwgIiUzczogIiwgZnJlZ25hbWVzW2ldKTsKKyAgICAgICAgcHJpbnRmcHIoJmVudi0+YWN0aXZlX2ZwdS5mcHJbaV0pOworICAgIH0KKworI3VuZGVmIHByaW50ZnByCit9CisKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpICYmIGRlZmluZWQoTUlQU19ERUJVR19TSUdOX0VYVEVOU0lPTlMpCisvKiBEZWJ1ZyBoZWxwOiBUaGUgYXJjaGl0ZWN0dXJlIHJlcXVpcmVzIDMyYml0IGNvZGUgdG8gbWFpbnRhaW4gcHJvcGVyCisgICBzaWduLWV4dGVuZGVkIHZhbHVlcyBvbiA2NGJpdCBtYWNoaW5lcy4gICovCisKKyNkZWZpbmUgU0lHTl9FWFRfUCh2YWwpICgoKCh2YWwpICYgfjB4N2ZmZmZmZmYpID09IDApIHx8ICgoKHZhbCkgJiB+MHg3ZmZmZmZmZikgPT0gfjB4N2ZmZmZmZmYpKQorCitzdGF0aWMgdm9pZAorY3B1X21pcHNfY2hlY2tfc2lnbl9leHRlbnNpb25zIChDUFVNSVBTU3RhdGUgKmVudiwgRklMRSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY3B1X2ZwcmludGYpKEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCBpOworCisgICAgaWYgKCFTSUdOX0VYVF9QKGVudi0+YWN0aXZlX3RjLlBDKSkKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIkJST0tFTjogcGM9MHgiIFRBUkdFVF9GTVRfbHggIlxuIiwgZW52LT5hY3RpdmVfdGMuUEMpOworICAgIGlmICghU0lHTl9FWFRfUChlbnYtPmFjdGl2ZV90Yy5ISVswXSkpCisgICAgICAgIGNwdV9mcHJpbnRmKGYsICJCUk9LRU46IEhJPTB4IiBUQVJHRVRfRk1UX2x4ICJcbiIsIGVudi0+YWN0aXZlX3RjLkhJWzBdKTsKKyAgICBpZiAoIVNJR05fRVhUX1AoZW52LT5hY3RpdmVfdGMuTE9bMF0pKQorICAgICAgICBjcHVfZnByaW50ZihmLCAiQlJPS0VOOiBMTz0weCIgVEFSR0VUX0ZNVF9seCAiXG4iLCBlbnYtPmFjdGl2ZV90Yy5MT1swXSk7CisgICAgaWYgKCFTSUdOX0VYVF9QKGVudi0+YnRhcmdldCkpCisgICAgICAgIGNwdV9mcHJpbnRmKGYsICJCUk9LRU46IGJ0YXJnZXQ9MHgiIFRBUkdFVF9GTVRfbHggIlxuIiwgZW52LT5idGFyZ2V0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIGlmICghU0lHTl9FWFRfUChlbnYtPmFjdGl2ZV90Yy5ncHJbaV0pKQorICAgICAgICAgICAgY3B1X2ZwcmludGYoZiwgIkJST0tFTjogJXM9MHgiIFRBUkdFVF9GTVRfbHggIlxuIiwgcmVnbmFtZXNbaV0sIGVudi0+YWN0aXZlX3RjLmdwcltpXSk7CisgICAgfQorCisgICAgaWYgKCFTSUdOX0VYVF9QKGVudi0+Q1AwX0VQQykpCisgICAgICAgIGNwdV9mcHJpbnRmKGYsICJCUk9LRU46IEVQQz0weCIgVEFSR0VUX0ZNVF9seCAiXG4iLCBlbnYtPkNQMF9FUEMpOworICAgIGlmICghU0lHTl9FWFRfUChlbnYtPmxsYWRkcikpCisgICAgICAgIGNwdV9mcHJpbnRmKGYsICJCUk9LRU46IExMQWRkcj0weCIgVEFSR0VUX0ZNVF9seCAiXG4iLCBlbnYtPmxsYWRkcik7Cit9CisjZW5kaWYKKwordm9pZCBjcHVfZHVtcF9zdGF0ZSAoQ1BVU3RhdGUgKmNwdSwgRklMRSAqZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCAoKmNwdV9mcHJpbnRmKShGSUxFICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLiksCisgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgQ1BVTUlQU1N0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisgICAgaW50IGk7CisKKyAgICBjcHVfZnByaW50ZihmLCAicGM9MHgiIFRBUkdFVF9GTVRfbHggIiBIST0weCIgVEFSR0VUX0ZNVF9seCAiIExPPTB4IiBUQVJHRVRfRk1UX2x4ICIgZHMgJTA0eCAiIFRBUkdFVF9GTVRfbHggIiAlZFxuIiwKKyAgICAgICAgICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQywgZW52LT5hY3RpdmVfdGMuSElbMF0sIGVudi0+YWN0aXZlX3RjLkxPWzBdLAorICAgICAgICAgICAgICAgIGVudi0+aGZsYWdzLCBlbnYtPmJ0YXJnZXQsIGVudi0+YmNvbmQpOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIGlmICgoaSAmIDMpID09IDApCisgICAgICAgICAgICBjcHVfZnByaW50ZihmLCAiR1BSJTAyZDoiLCBpKTsKKyAgICAgICAgY3B1X2ZwcmludGYoZiwgIiAlcyAiIFRBUkdFVF9GTVRfbHgsIHJlZ25hbWVzW2ldLCBlbnYtPmFjdGl2ZV90Yy5ncHJbaV0pOworICAgICAgICBpZiAoKGkgJiAzKSA9PSAzKQorICAgICAgICAgICAgY3B1X2ZwcmludGYoZiwgIlxuIik7CisgICAgfQorCisgICAgY3B1X2ZwcmludGYoZiwgIkNQMCBTdGF0dXMgIDB4JTA4eCBDYXVzZSAgIDB4JTA4eCBFUEMgICAgMHgiIFRBUkdFVF9GTVRfbHggIlxuIiwKKyAgICAgICAgICAgICAgICBlbnYtPkNQMF9TdGF0dXMsIGVudi0+Q1AwX0NhdXNlLCBlbnYtPkNQMF9FUEMpOworICAgIGNwdV9mcHJpbnRmKGYsICIgICAgQ29uZmlnMCAweCUwOHggQ29uZmlnMSAweCUwOHggTExBZGRyIDB4IiBUQVJHRVRfRk1UX2x4ICJcbiIsCisgICAgICAgICAgICAgICAgZW52LT5DUDBfQ29uZmlnMCwgZW52LT5DUDBfQ29uZmlnMSwgZW52LT5sbGFkZHIpOworICAgIGlmIChlbnYtPmhmbGFncyAmIE1JUFNfSEZMQUdfRlBVKQorICAgICAgICBmcHVfZHVtcF9zdGF0ZShlbnYsIGYsIGNwdV9mcHJpbnRmLCBmbGFncyk7CisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KSAmJiBkZWZpbmVkKE1JUFNfREVCVUdfU0lHTl9FWFRFTlNJT05TKQorICAgIGNwdV9taXBzX2NoZWNrX3NpZ25fZXh0ZW5zaW9ucyhlbnYsIGYsIGNwdV9mcHJpbnRmLCBmbGFncyk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgbWlwc190Y2dfaW5pdCh2b2lkKQoreworICAgIGludCBpOworICAgIHN0YXRpYyBpbnQgaW5pdGVkOworCisgICAgLyogSW5pdGlhbGl6ZSB2YXJpb3VzIHN0YXRpYyB0YWJsZXMuICovCisgICAgaWYgKGluaXRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgY3B1X2VudiA9IHRjZ19nbG9iYWxfcmVnX25ld19wdHIoVENHX0FSRUcwLCAiZW52Iik7CisgICAgVENHVl9VTlVTRUQoY3B1X2dwclswXSk7CisgICAgZm9yIChpID0gMTsgaSA8IDMyOyBpKyspCisgICAgICAgIGNwdV9ncHJbaV0gPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX3RjLmdwcltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbmFtZXNbaV0pOworICAgIGNwdV9QQyA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX3RjLlBDKSwgIlBDIik7CisgICAgZm9yIChpID0gMDsgaSA8IE1JUFNfRFNQX0FDQzsgaSsrKSB7CisgICAgICAgIGNwdV9ISVtpXSA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGFjdGl2ZV90Yy5ISVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc19ISVtpXSk7CisgICAgICAgIGNwdV9MT1tpXSA9IHRjZ19nbG9iYWxfbWVtX25ldyhUQ0dfQVJFRzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGFjdGl2ZV90Yy5MT1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWduYW1lc19MT1tpXSk7CisgICAgICAgIGNwdV9BQ1hbaV0gPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX3RjLkFDWFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnbmFtZXNfQUNYW2ldKTsKKyAgICB9CisgICAgY3B1X2RzcGN0cmwgPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX3RjLkRTUENvbnRyb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEU1BDb250cm9sIik7CisgICAgYmNvbmQgPSB0Y2dfZ2xvYmFsX21lbV9uZXcoVENHX0FSRUcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYmNvbmQpLCAiYmNvbmQiKTsKKyAgICBidGFyZ2V0ID0gdGNnX2dsb2JhbF9tZW1fbmV3KFRDR19BUkVHMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYnRhcmdldCksICJidGFyZ2V0Iik7CisgICAgaGZsYWdzID0gdGNnX2dsb2JhbF9tZW1fbmV3X2kzMihUQ0dfQVJFRzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihDUFVNSVBTU3RhdGUsIGhmbGFncyksICJoZmxhZ3MiKTsKKworICAgIGZwdV9mY3IwID0gdGNnX2dsb2JhbF9tZW1fbmV3X2kzMihUQ0dfQVJFRzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX2ZwdS5mY3IwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZjcjAiKTsKKyAgICBmcHVfZmNyMzEgPSB0Y2dfZ2xvYmFsX21lbV9uZXdfaTMyKFRDR19BUkVHMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVU1JUFNTdGF0ZSwgYWN0aXZlX2ZwdS5mY3IzMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmNyMzEiKTsKKyAgICBpbml0ZWQgPSAxOworfQorCisjaW5jbHVkZSAidHJhbnNsYXRlX2luaXQuYyIKKworQ1BVTUlQU1N0YXRlICpjcHVfbWlwc19pbml0IChjb25zdCBjaGFyICpjcHVfbW9kZWwpCit7CisgICAgTUlQU0NQVSAqbWlwc19jcHU7CisgICAgQ1BVTUlQU1N0YXRlICplbnY7CisgICAgQ1BVU3RhdGUgKmNwdTsKKyAgICBjb25zdCBtaXBzX2RlZl90ICpkZWY7CisKKyAgICBkZWYgPSBjcHVfbWlwc19maW5kX2J5X25hbWUoY3B1X21vZGVsKTsKKyAgICBpZiAoIWRlZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWlwc19jcHUgPSBnX21hbGxvYzAoc2l6ZW9mKE1JUFNDUFUpKTsKKyAgICBlbnYgPSAmbWlwc19jcHUtPmVudjsKKyAgICBFTlZfR0VUX0NQVShlbnYpLT5lbnZfcHRyID0gZW52OworCisgICAgY3B1ID0gRU5WX0dFVF9DUFUoZW52KTsKKyAgICBlbnYtPmNwdV9tb2RlbCA9IGRlZjsKKyAgICBjcHUtPmNwdV9tb2RlbF9zdHIgPSBjcHVfbW9kZWw7CisKKyAgICBjcHVfZXhlY19pbml0KGVudik7CisjaWZuZGVmIENPTkZJR19VU0VSX09OTFkKKyAgICBtbXVfaW5pdChlbnYsIGRlZik7CisjZW5kaWYKKyAgICBtdnBfaW5pdChlbnYsIGRlZik7CisgICAgbWlwc190Y2dfaW5pdCgpOworICAgIGNwdV9yZXNldChjcHUpOworICAgIHFlbXVfaW5pdF92Y3B1KGNwdSk7CisgICAgcmV0dXJuIGVudjsKK30KKwordm9pZCBjcHVfcmVzZXQoQ1BVU3RhdGUgKmNwdSkKK3sKKyAgICBDUFVNSVBTU3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19SRVNFVCkpIHsKKyAgICAgICAgcWVtdV9sb2coIkNQVSBSZXNldCAoQ1BVICVkKVxuIiwgY3B1LT5jcHVfaW5kZXgpOworICAgICAgICBsb2dfY3B1X3N0YXRlKGNwdSwgMCk7CisgICAgfQorCisgICAgbWVtc2V0KGVudiwgMCwgb2Zmc2V0b2YoQ1BVTUlQU1N0YXRlLCBicmVha3BvaW50cykpOworICAgIHRsYl9mbHVzaChlbnYsIDEpOworCisgICAgLyogUmVzZXQgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzICovCisgICAgZW52LT5DUDBfUFJpZCA9IGVudi0+Y3B1X21vZGVsLT5DUDBfUFJpZDsKKyAgICBlbnYtPkNQMF9Db25maWcwID0gZW52LT5jcHVfbW9kZWwtPkNQMF9Db25maWcwOworI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICBlbnYtPkNQMF9Db25maWcwIHw9ICgxIDw8IENQMEMwX0JFKTsKKyNlbmRpZgorICAgIGVudi0+Q1AwX0NvbmZpZzEgPSBlbnYtPmNwdV9tb2RlbC0+Q1AwX0NvbmZpZzE7CisgICAgZW52LT5DUDBfQ29uZmlnMiA9IGVudi0+Y3B1X21vZGVsLT5DUDBfQ29uZmlnMjsKKyAgICBlbnYtPkNQMF9Db25maWczID0gZW52LT5jcHVfbW9kZWwtPkNQMF9Db25maWczOworICAgIGVudi0+Q1AwX0NvbmZpZzYgPSBlbnYtPmNwdV9tb2RlbC0+Q1AwX0NvbmZpZzY7CisgICAgZW52LT5DUDBfQ29uZmlnNyA9IGVudi0+Y3B1X21vZGVsLT5DUDBfQ29uZmlnNzsKKyAgICBlbnYtPkNQMF9MTEFkZHJfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfTExBZGRyX3J3X2JpdG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVudi0+Y3B1X21vZGVsLT5DUDBfTExBZGRyX3NoaWZ0OworICAgIGVudi0+Q1AwX0xMQWRkcl9zaGlmdCA9IGVudi0+Y3B1X21vZGVsLT5DUDBfTExBZGRyX3NoaWZ0OworICAgIGVudi0+U1lOQ0lfU3RlcCA9IGVudi0+Y3B1X21vZGVsLT5TWU5DSV9TdGVwOworICAgIGVudi0+Q0NSZXMgPSBlbnYtPmNwdV9tb2RlbC0+Q0NSZXM7CisgICAgZW52LT5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSBlbnYtPmNwdV9tb2RlbC0+Q1AwX1N0YXR1c19yd19iaXRtYXNrOworICAgIGVudi0+Q1AwX1RDU3RhdHVzX3J3X2JpdG1hc2sgPSBlbnYtPmNwdV9tb2RlbC0+Q1AwX1RDU3RhdHVzX3J3X2JpdG1hc2s7CisgICAgZW52LT5DUDBfU1JTQ3RsID0gZW52LT5jcHVfbW9kZWwtPkNQMF9TUlNDdGw7CisgICAgZW52LT5jdXJyZW50X3RjID0gMDsKKyAgICBlbnYtPlNFR0JJVFMgPSBlbnYtPmNwdV9tb2RlbC0+U0VHQklUUzsKKyAgICBlbnYtPlNFR01hc2sgPSAodGFyZ2V0X3Vsb25nKSgoMVVMTCA8PCBlbnYtPmNwdV9tb2RlbC0+U0VHQklUUykgLSAxKTsKKyNpZiBkZWZpbmVkKFRBUkdFVF9NSVBTNjQpCisgICAgaWYgKGVudi0+Y3B1X21vZGVsLT5pbnNuX2ZsYWdzICYgSVNBX01JUFMzKSB7CisgICAgICAgIGVudi0+U0VHTWFzayB8PSAzVUxMIDw8IDYyOworICAgIH0KKyNlbmRpZgorICAgIGVudi0+UEFCSVRTID0gZW52LT5jcHVfbW9kZWwtPlBBQklUUzsKKyAgICBlbnYtPlBBTWFzayA9ICh0YXJnZXRfdWxvbmcpKCgxVUxMIDw8IGVudi0+Y3B1X21vZGVsLT5QQUJJVFMpIC0gMSk7CisgICAgZW52LT5DUDBfU1JTQ29uZjBfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjBfcndfYml0bWFzazsKKyAgICBlbnYtPkNQMF9TUlNDb25mMCA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjA7CisgICAgZW52LT5DUDBfU1JTQ29uZjFfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjFfcndfYml0bWFzazsKKyAgICBlbnYtPkNQMF9TUlNDb25mMSA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjE7CisgICAgZW52LT5DUDBfU1JTQ29uZjJfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjJfcndfYml0bWFzazsKKyAgICBlbnYtPkNQMF9TUlNDb25mMiA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjI7CisgICAgZW52LT5DUDBfU1JTQ29uZjNfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjNfcndfYml0bWFzazsKKyAgICBlbnYtPkNQMF9TUlNDb25mMyA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjM7CisgICAgZW52LT5DUDBfU1JTQ29uZjRfcndfYml0bWFzayA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjRfcndfYml0bWFzazsKKyAgICBlbnYtPkNQMF9TUlNDb25mNCA9IGVudi0+Y3B1X21vZGVsLT5DUDBfU1JTQ29uZjQ7CisgICAgZW52LT5pbnNuX2ZsYWdzID0gZW52LT5jcHVfbW9kZWwtPmluc25fZmxhZ3M7CisKKyAgICBmcHVfaW5pdChlbnYsIGVudi0+Y3B1X21vZGVsKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICBlbnYtPmhmbGFncyA9IE1JUFNfSEZMQUdfVU07CisgICAgLyogRW5hYmxlIGFjY2VzcyB0byB0aGUgU1lOQ0lfU3RlcCByZWdpc3Rlci4gICovCisgICAgZW52LT5DUDBfSFdSRW5hIHw9ICgxIDw8IDEpOworICAgIGlmIChlbnYtPkNQMF9Db25maWcxICYgKDEgPDwgQ1AwQzFfRlApKSB7CisgICAgICAgIGVudi0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfRlBVOworICAgIH0KKyAgICBpZiAoZW52LT5jcHVfbW9kZWwtPmluc25fZmxhZ3MgJiBBU0VfRFNQUjIpIHsKKyAgICAgICAgZW52LT5oZmxhZ3MgfD0gTUlQU19IRkxBR19EU1AgfCBNSVBTX0hGTEFHX0RTUFIyOworICAgIH0gZWxzZSBpZiAoZW52LT5jcHVfbW9kZWwtPmluc25fZmxhZ3MgJiBBU0VfRFNQKSB7CisgICAgICAgIGVudi0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfRFNQOworICAgIH0KKyNpZmRlZiBUQVJHRVRfTUlQUzY0CisgICAgaWYgKGVudi0+YWN0aXZlX2ZwdS5mY3IwICYgKDEgPDwgRkNSMF9GNjQpKSB7CisgICAgICAgIGVudi0+aGZsYWdzIHw9IE1JUFNfSEZMQUdfRjY0OworICAgIH0KKyNlbmRpZgorI2Vsc2UKKyAgICBpZiAoZW52LT5oZmxhZ3MgJiBNSVBTX0hGTEFHX0JNQVNLKSB7CisgICAgICAgIC8qIElmIHRoZSBleGNlcHRpb24gd2FzIHJhaXNlZCBmcm9tIGEgZGVsYXkgc2xvdCwKKyAgICAgICAgICAgY29tZSBiYWNrIHRvIHRoZSBqdW1wLiAgKi8KKyAgICAgICAgZW52LT5DUDBfRXJyb3JFUEMgPSBlbnYtPmFjdGl2ZV90Yy5QQyAtIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW52LT5DUDBfRXJyb3JFUEMgPSBlbnYtPmFjdGl2ZV90Yy5QQzsKKyAgICB9CisgICAgZW52LT5hY3RpdmVfdGMuUEMgPSAoaW50MzJfdCkweEJGQzAwMDAwOworICAgIGVudi0+Q1AwX1JhbmRvbSA9IGVudi0+dGxiLT5uYl90bGIgLSAxOworICAgIGVudi0+dGxiLT50bGJfaW5fdXNlID0gZW52LT50bGItPm5iX3RsYjsKKyAgICBlbnYtPkNQMF9XaXJlZCA9IDA7CisgICAgLyogU01QIG5vdCBpbXBsZW1lbnRlZCAqLworICAgIGVudi0+Q1AwX0VCYXNlID0gMHg4MDAwMDAwMDsKKyAgICBlbnYtPkNQMF9TdGF0dXMgPSAoMSA8PCBDUDBTdF9CRVYpIHwgKDEgPDwgQ1AwU3RfRVJMKTsKKyAgICAvKiB2ZWN0b3JlZCBpbnRlcnJ1cHRzIG5vdCBpbXBsZW1lbnRlZCwgdGltZXIgb24gaW50IDcsCisgICAgICAgbm8gcGVyZm9ybWFuY2UgY291bnRlcnMuICovCisgICAgZW52LT5DUDBfSW50Q3RsID0gMHhlMDAwMDAwMDsKKyAgICB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgICAgIGVudi0+Q1AwX1dhdGNoTG9baV0gPSAwOworICAgICAgICAgICAgZW52LT5DUDBfV2F0Y2hIaVtpXSA9IDB4ODAwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgZW52LT5DUDBfV2F0Y2hMb1s3XSA9IDA7CisgICAgICAgIGVudi0+Q1AwX1dhdGNoSGlbN10gPSAwOworICAgIH0KKyAgICAvKiBDb3VudCByZWdpc3RlciBpbmNyZW1lbnRzIGluIGRlYnVnIG1vZGUsIEVKVEFHIHZlcnNpb24gMSAqLworICAgIGVudi0+Q1AwX0RlYnVnID0gKDEgPDwgQ1AwREJfQ05UKSB8ICgweDEgPDwgQ1AwREJfVkVSKTsKKyAgICBlbnYtPmhmbGFncyA9IE1JUFNfSEZMQUdfQ1AwOworI2VuZGlmCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIGlmIChlbnYtPmNwdV9tb2RlbC0+aW5zbl9mbGFncyAmIElTQV9NSVBTMykgeworICAgICAgICBlbnYtPmhmbGFncyB8PSBNSVBTX0hGTEFHXzY0OworICAgIH0KKyNlbmRpZgorICAgIGVudi0+ZXhjZXB0aW9uX2luZGV4ID0gRVhDUF9OT05FOworfQorCit2b2lkIHJlc3RvcmVfc3RhdGVfdG9fb3BjKENQVU1JUFNTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YiwgaW50IHBjX3BvcykKK3sKKyAgICBlbnYtPmFjdGl2ZV90Yy5QQyA9IHRjZ19jdHguZ2VuX29wY19wY1twY19wb3NdOworICAgIGVudi0+aGZsYWdzICY9IH5NSVBTX0hGTEFHX0JNQVNLOworICAgIGVudi0+aGZsYWdzIHw9IGdlbl9vcGNfaGZsYWdzW3BjX3Bvc107Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL3RyYW5zbGF0ZV9pbml0LmMgYi9hbmRyb2lkL3FlbXUxL3RhcmdldC1taXBzL3RyYW5zbGF0ZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNWMyZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGFyZ2V0LW1pcHMvdHJhbnNsYXRlX2luaXQuYwpAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqICBNSVBTIGVtdWxhdGlvbiBmb3IgcWVtdTogQ1BVIGluaXRpYWxpc2F0aW9uIHJvdXRpbmVzLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSBKb2NlbHluIE1heWVyCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IEhlcnZlIFBvdXNzaW5lYXUKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyogQ1BVIC8gQ1BVIGZhbWlseSBzcGVjaWZpYyBjb25maWcgcmVnaXN0ZXIgdmFsdWVzLiAqLworCisvKiBIYXZlIGNvbmZpZzEsIHVuY2FjaGVkIGNvaGVyZW5jeSAqLworI2RlZmluZSBNSVBTX0NPTkZJRzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKDEgPDwgQ1AwQzBfTSkgfCAoMHgyIDw8IENQMEMwX0swKSkKKworLyogSGF2ZSBjb25maWcyLCBubyBjb3Byb2Nlc3NvcjIgYXR0YWNoZWQsIG5vIE1ETVggc3VwcG9ydCBhdHRhY2hlZCwKKyAgIG5vIHBlcmZvcm1hbmNlIGNvdW50ZXJzLCB3YXRjaCByZWdpc3RlcnMgcHJlc2VudCwKKyAgIG5vIGNvZGUgY29tcHJlc3Npb24sIEVKVEFHIHByZXNlbnQsIG5vIEZQVSAqLworI2RlZmluZSBNSVBTX0NPTkZJRzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCgxIDw8IENQMEMxX00pIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICgwIDw8IENQMEMxX0MyKSB8ICgwIDw8IENQMEMxX01EKSB8ICgwIDw8IENQMEMxX1BDKSB8ICAgICAgICAgICAgXAorICgxIDw8IENQMEMxX1dSKSB8ICgwIDw8IENQMEMxX0NBKSB8ICgxIDw8IENQMEMxX0VQKSB8ICAgICAgICAgICAgXAorICgwIDw8IENQMEMxX0ZQKSkKKworLyogSGF2ZSBjb25maWczLCBubyB0ZXJ0aWFyeS9zZWNvbmRhcnkgY2FjaGVzIGltcGxlbWVudGVkICovCisjZGVmaW5lIE1JUFNfQ09ORklHMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoKDEgPDwgQ1AwQzJfTSkpCisKKy8qIE5vIGNvbmZpZzQsIG5vIERTUCBBU0UsIG5vIGxhcmdlIHBoeXNhZGRyIChQQUJJVFMpLAorICAgbm8gZXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIsIG5vIHZlY3RvcmVkIGludGVydXB0cywKKyAgIG5vIDFrYiBwYWdlcywgbm8gU21hcnRNSVBTIEFTRSwgbm8gdHJhY2UgbG9naWMgKi8KKyNkZWZpbmUgTUlQU19DT05GSUczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKygoMCA8PCBDUDBDM19NKSB8ICgwIDw8IENQMEMzX0RTUFApIHwgKDAgPDwgQ1AwQzNfTFBBKSB8ICAgICAgICAgIFwKKyAoMCA8PCBDUDBDM19WRUlDKSB8ICgwIDw8IENQMEMzX1ZJbnQpIHwgKDAgPDwgQ1AwQzNfU1ApIHwgICAgICAgIFwKKyAoMCA8PCBDUDBDM19TTSkgfCAoMCA8PCBDUDBDM19UTCkpCisKKy8qIERlZmluZSBhIGltcGxlbWVudGF0aW9uIG51bWJlciBvZiAxLgorICAgRGVmaW5lIGEgbWFqb3IgdmVyc2lvbiAxLCBtaW5vciB2ZXJzaW9uIDAuICovCisjZGVmaW5lIE1JUFNfRkNSMCAoKDAgPDwgRkNSMF9TKSB8ICgweDEgPDwgRkNSMF9QUklEKSB8ICgweDEwIDw8IEZDUjBfUkVWKSkKKworLyogTU1VIHR5cGVzLCB0aGUgZmlyc3QgZm91ciBlbnRyaWVzIGhhdmUgdGhlIHNhbWUgbGF5b3V0IGFzIHRoZQorICAgQ1AwQzBfTVQgZmllbGQuICAqLworZW51bSBtaXBzX21tdV90eXBlcyB7CisgICAgTU1VX1RZUEVfTk9ORSwKKyAgICBNTVVfVFlQRV9SNDAwMCwKKyAgICBNTVVfVFlQRV9SRVNFUlZFRCwKKyAgICBNTVVfVFlQRV9GTVQsCisgICAgTU1VX1RZUEVfUjMwMDAsCisgICAgTU1VX1RZUEVfUjYwMDAsCisgICAgTU1VX1RZUEVfUjgwMDAKK307CisKK3N0cnVjdCBtaXBzX2RlZl90IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludDMyX3QgQ1AwX1BSaWQ7CisgICAgaW50MzJfdCBDUDBfQ29uZmlnMDsKKyAgICBpbnQzMl90IENQMF9Db25maWcxOworICAgIGludDMyX3QgQ1AwX0NvbmZpZzI7CisgICAgaW50MzJfdCBDUDBfQ29uZmlnMzsKKyAgICBpbnQzMl90IENQMF9Db25maWc2OworICAgIGludDMyX3QgQ1AwX0NvbmZpZzc7CisgICAgdGFyZ2V0X3Vsb25nIENQMF9MTEFkZHJfcndfYml0bWFzazsKKyAgICBpbnQgQ1AwX0xMQWRkcl9zaGlmdDsKKyAgICBpbnQzMl90IFNZTkNJX1N0ZXA7CisgICAgaW50MzJfdCBDQ1JlczsKKyAgICBpbnQzMl90IENQMF9TdGF0dXNfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9UQ1N0YXR1c19yd19iaXRtYXNrOworICAgIGludDMyX3QgQ1AwX1NSU0N0bDsKKyAgICBpbnQzMl90IENQMV9mY3IwOworICAgIGludDMyX3QgU0VHQklUUzsKKyAgICBpbnQzMl90IFBBQklUUzsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMF9yd19iaXRtYXNrOworICAgIGludDMyX3QgQ1AwX1NSU0NvbmYwOworICAgIGludDMyX3QgQ1AwX1NSU0NvbmYxX3J3X2JpdG1hc2s7CisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjE7CisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjJfcndfYml0bWFzazsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mMjsKKyAgICBpbnQzMl90IENQMF9TUlNDb25mM19yd19iaXRtYXNrOworICAgIGludDMyX3QgQ1AwX1NSU0NvbmYzOworICAgIGludDMyX3QgQ1AwX1NSU0NvbmY0X3J3X2JpdG1hc2s7CisgICAgaW50MzJfdCBDUDBfU1JTQ29uZjQ7CisgICAgaW50IGluc25fZmxhZ3M7CisgICAgZW51bSBtaXBzX21tdV90eXBlcyBtbXVfdHlwZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1JUFMgQ1BVIGRlZmluaXRpb25zICovCitzdGF0aWMgY29uc3QgbWlwc19kZWZfdCBtaXBzX2RlZnNbXSA9Cit7CisgICAgeworICAgICAgICAubmFtZSA9ICI0S2MiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE4MDAwLAorICAgICAgICAuQ1AwX0NvbmZpZzAgPSBNSVBTX0NPTkZJRzAgfCAoTU1VX1RZUEVfUjQwMDAgPDwgQ1AwQzBfTVQpLAorICAgICAgICAuQ1AwX0NvbmZpZzEgPSBNSVBTX0NPTkZJRzEgfCAoMTUgPDwgQ1AwQzFfTU1VKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0lTKSB8ICgzIDw8IENQMEMxX0lMKSB8ICgxIDw8IENQMEMxX0lBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0RTKSB8ICgzIDw8IENQMEMxX0RMKSB8ICgxIDw8IENQMEMxX0RBKSwKKyAgICAgICAgLkNQMF9Db25maWcyID0gTUlQU19DT05GSUcyLAorICAgICAgICAuQ1AwX0NvbmZpZzMgPSBNSVBTX0NPTkZJRzMsCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDEyNzhGRjE3LAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMiB8IEFTRV9NSVBTMTYsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX1I0MDAwLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICI0S20iLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE4MzAwLAorICAgICAgICAvKiBDb25maWcxIGltcGxlbWVudGVkLCBmaXhlZCBtYXBwaW5nIE1NVSwKKyAgICAgICAgICAgbm8gdmlydHVhbCBpY2FjaGUsIHVuY2FjaGVkIGNvaGVyZW5jeS4gKi8KKyAgICAgICAgLkNQMF9Db25maWcwID0gTUlQU19DT05GSUcwIHwgKE1NVV9UWVBFX0ZNVCA8PCBDUDBDMF9NVCksCisgICAgICAgIC5DUDBfQ29uZmlnMSA9IE1JUFNfQ09ORklHMSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0lTKSB8ICgzIDw8IENQMEMxX0lMKSB8ICgxIDw8IENQMEMxX0lBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0RTKSB8ICgzIDw8IENQMEMxX0RMKSB8ICgxIDw8IENQMEMxX0RBKSwKKyAgICAgICAgLkNQMF9Db25maWcyID0gTUlQU19DT05GSUcyLAorICAgICAgICAuQ1AwX0NvbmZpZzMgPSBNSVBTX0NPTkZJRzMsCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDEyNThGRjE3LAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMiB8IEFTRV9NSVBTMTYsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX0ZNVCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiNEtFY1IxIiwKKyAgICAgICAgLkNQMF9QUmlkID0gMHgwMDAxODQwMCwKKyAgICAgICAgLkNQMF9Db25maWcwID0gTUlQU19DT05GSUcwIHwgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDE1IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczLAorICAgICAgICAuQ1AwX0xMQWRkcl9yd19iaXRtYXNrID0gMCwKKyAgICAgICAgLkNQMF9MTEFkZHJfc2hpZnQgPSA0LAorICAgICAgICAuU1lOQ0lfU3RlcCA9IDMyLAorICAgICAgICAuQ0NSZXMgPSAyLAorICAgICAgICAuQ1AwX1N0YXR1c19yd19iaXRtYXNrID0gMHgxMjc4RkYxNywKKyAgICAgICAgLlNFR0JJVFMgPSAzMiwKKyAgICAgICAgLlBBQklUUyA9IDMyLAorICAgICAgICAuaW5zbl9mbGFncyA9IENQVV9NSVBTMzIgfCBBU0VfTUlQUzE2LAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiNEtFbVIxIiwKKyAgICAgICAgLkNQMF9QUmlkID0gMHgwMDAxODUwMCwKKyAgICAgICAgLkNQMF9Db25maWcwID0gTUlQU19DT05GSUcwIHwgKE1NVV9UWVBFX0ZNVCA8PCBDUDBDMF9NVCksCisgICAgICAgIC5DUDBfQ29uZmlnMSA9IE1JUFNfQ09ORklHMSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0lTKSB8ICgzIDw8IENQMEMxX0lMKSB8ICgxIDw8IENQMEMxX0lBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQMEMxX0RTKSB8ICgzIDw8IENQMEMxX0RMKSB8ICgxIDw8IENQMEMxX0RBKSwKKyAgICAgICAgLkNQMF9Db25maWcyID0gTUlQU19DT05GSUcyLAorICAgICAgICAuQ1AwX0NvbmZpZzMgPSBNSVBTX0NPTkZJRzMsCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDEyNThGRjE3LAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMiB8IEFTRV9NSVBTMTYsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX0ZNVCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiNEtFYyIsCisgICAgICAgIC5DUDBfUFJpZCA9IDB4MDAwMTkwMDAsCisgICAgICAgIC5DUDBfQ29uZmlnMCA9IE1JUFNfQ09ORklHMCB8ICgweDEgPDwgQ1AwQzBfQVIpIHwKKyAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDE1IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczIHwgKDAgPDwgQ1AwQzNfVkludCksCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDEyNzhGRjE3LAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMlIyIHwgQVNFX01JUFMxNiwKKyAgICAgICAgLm1tdV90eXBlID0gTU1VX1RZUEVfUjQwMDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gIjRLRW0iLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE5MTAwLAorICAgICAgICAuQ1AwX0NvbmZpZzAgPSBNSVBTX0NPTkZJRzAgfCAoMHgxIDw8IENQMEMwX0FSKSB8CisgICAgICAgICAgICAgICAgICAgICAgIChNTVVfVFlQRV9GTVQgPDwgQ1AwQzBfTVQpLAorICAgICAgICAuQ1AwX0NvbmZpZzEgPSBNSVBTX0NPTkZJRzEgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczLAorICAgICAgICAuQ1AwX0xMQWRkcl9yd19iaXRtYXNrID0gMCwKKyAgICAgICAgLkNQMF9MTEFkZHJfc2hpZnQgPSA0LAorICAgICAgICAuU1lOQ0lfU3RlcCA9IDMyLAorICAgICAgICAuQ0NSZXMgPSAyLAorICAgICAgICAuQ1AwX1N0YXR1c19yd19iaXRtYXNrID0gMHgxMjU4RkYxNywKKyAgICAgICAgLlNFR0JJVFMgPSAzMiwKKyAgICAgICAgLlBBQklUUyA9IDMyLAorICAgICAgICAuaW5zbl9mbGFncyA9IENQVV9NSVBTMzJSMiB8IEFTRV9NSVBTMTYsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX0ZNVCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiMjRLYyIsCisgICAgICAgIC5DUDBfUFJpZCA9IDB4MDAwMTkzMDAsCisgICAgICAgIC5DUDBfQ29uZmlnMCA9IE1JUFNfQ09ORklHMCB8ICgweDEgPDwgQ1AwQzBfQVIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDE1IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczIHwgKDAgPDwgQ1AwQzNfVkludCksCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC8qIE5vIERTUCBpbXBsZW1lbnRlZC4gKi8KKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MTI3OEZGMUYsCisgICAgICAgIC5TRUdCSVRTID0gMzIsCisgICAgICAgIC5QQUJJVFMgPSAzMiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzMyUjIgfCBBU0VfTUlQUzE2LAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiMjRLZiIsCisgICAgICAgIC5DUDBfUFJpZCA9IDB4MDAwMTkzMDAsCisgICAgICAgIC5DUDBfQ29uZmlnMCA9IE1JUFNfQ09ORklHMCB8ICgweDEgPDwgQ1AwQzBfQVIpIHwKKyAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDEgPDwgQ1AwQzFfRlApIHwgKDE1IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczIHwgKDAgPDwgQ1AwQzNfVkludCksCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC8qIE5vIERTUCBpbXBsZW1lbnRlZC4gKi8KKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MzY3OEZGMUYsCisgICAgICAgIC5DUDFfZmNyMCA9ICgxIDw8IEZDUjBfRjY0KSB8ICgxIDw8IEZDUjBfTCkgfCAoMSA8PCBGQ1IwX1cpIHwKKyAgICAgICAgICAgICAgICAgICAgKDEgPDwgRkNSMF9EKSB8ICgxIDw8IEZDUjBfUykgfCAoMHg5MyA8PCBGQ1IwX1BSSUQpLAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMlIyIHwgQVNFX01JUFMxNiwKKyAgICAgICAgLm1tdV90eXBlID0gTU1VX1RZUEVfUjQwMDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lID0gIjc0S2YiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE5NzAwLAorICAgICAgICAuQ1AwX0NvbmZpZzAgPSBNSVBTX0NPTkZJRzAgfCAoMHgxIDw8IENQMEMwX0FSKSB8CisgICAgICAgICAgICAgICAgICAgIChNTVVfVFlQRV9SNDAwMCA8PCBDUDBDMF9NVCksCisgICAgICAgIC5DUDBfQ29uZmlnMSA9IE1JUFNfQ09ORklHMSB8ICgxIDw8IENQMEMxX0ZQKSB8ICgxNSA8PCBDUDBDMV9NTVUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgQ1AwQzFfSVMpIHwgKDMgPDwgQ1AwQzFfSUwpIHwgKDEgPDwgQ1AwQzFfSUEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgQ1AwQzFfRFMpIHwgKDMgPDwgQ1AwQzFfREwpIHwgKDEgPDwgQ1AwQzFfREEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQ1AwQzFfQ0EpLAorICAgICAgICAuQ1AwX0NvbmZpZzIgPSBNSVBTX0NPTkZJRzIsCisgICAgICAgIC5DUDBfQ29uZmlnMyA9IE1JUFNfQ09ORklHMyB8ICgxIDw8IENQMEMzX0RTUDJQKSB8ICgxIDw8IENQMEMzX0RTUFApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDAgPDwgQ1AwQzNfVkludCksCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDM3NzhGRjFGLAorICAgICAgICAuQ1AxX2ZjcjAgPSAoMSA8PCBGQ1IwX0Y2NCkgfCAoMSA8PCBGQ1IwX0wpIHwgKDEgPDwgRkNSMF9XKSB8CisgICAgICAgICAgICAgICAgICAgICgxIDw8IEZDUjBfRCkgfCAoMSA8PCBGQ1IwX1MpIHwgKDB4OTMgPDwgRkNSMF9QUklEKSwKKyAgICAgICAgLlNFR0JJVFMgPSAzMiwKKyAgICAgICAgLlBBQklUUyA9IDMyLAorICAgICAgICAuaW5zbl9mbGFncyA9IENQVV9NSVBTMzJSMiB8IEFTRV9NSVBTMTYgfCBBU0VfRFNQIHwgQVNFX0RTUFIyLAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiMzRLZiIsCisgICAgICAgIC5DUDBfUFJpZCA9IDB4MDAwMTk1MDAsCisgICAgICAgIC5DUDBfQ29uZmlnMCA9IE1JUFNfQ09ORklHMCB8ICgweDEgPDwgQ1AwQzBfQVIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDEgPDwgQ1AwQzFfRlApIHwgKDE1IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9JUykgfCAoMyA8PCBDUDBDMV9JTCkgfCAoMSA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBDMV9EUykgfCAoMyA8PCBDUDBDMV9ETCkgfCAoMSA8PCBDUDBDMV9EQSksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczIHwgKDEgPDwgQ1AwQzNfVkludCkgfCAoMSA8PCBDUDBDM19NVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBDUDBDM19EU1BQKSwKKyAgICAgICAgLkNQMF9MTEFkZHJfcndfYml0bWFzayA9IDAsCisgICAgICAgIC5DUDBfTExBZGRyX3NoaWZ0ID0gMCwKKyAgICAgICAgLlNZTkNJX1N0ZXAgPSAzMiwKKyAgICAgICAgLkNDUmVzID0gMiwKKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4Mzc3OEZGMUYsCisgICAgICAgIC5DUDBfVENTdGF0dXNfcndfYml0bWFzayA9ICgwIDw8IENQMFRDU3RfVENVMykgfCAoMCA8PCBDUDBUQ1N0X1RDVTIpIHwKKyAgICAgICAgICAgICAgICAgICAgKDEgPDwgQ1AwVENTdF9UQ1UxKSB8ICgxIDw8IENQMFRDU3RfVENVMCkgfAorICAgICAgICAgICAgICAgICAgICAoMCA8PCBDUDBUQ1N0X1RNWCkgfCAoMSA8PCBDUDBUQ1N0X0RUKSB8CisgICAgICAgICAgICAgICAgICAgICgxIDw8IENQMFRDU3RfREEpIHwgKDEgPDwgQ1AwVENTdF9BKSB8CisgICAgICAgICAgICAgICAgICAgICgweDMgPDwgQ1AwVENTdF9US1NVKSB8ICgxIDw8IENQMFRDU3RfSVhNVCkgfAorICAgICAgICAgICAgICAgICAgICAoMHhmZiA8PCBDUDBUQ1N0X1RBU0lEKSwKKyAgICAgICAgLkNQMV9mY3IwID0gKDEgPDwgRkNSMF9GNjQpIHwgKDEgPDwgRkNSMF9MKSB8ICgxIDw8IEZDUjBfVykgfAorICAgICAgICAgICAgICAgICAgICAoMSA8PCBGQ1IwX0QpIHwgKDEgPDwgRkNSMF9TKSB8ICgweDk1IDw8IEZDUjBfUFJJRCksCisgICAgICAgIC5DUDBfU1JTQ3RsID0gKDB4ZiA8PCBDUDBTUlNDdGxfSFNTKSwKKyAgICAgICAgLkNQMF9TUlNDb25mMF9yd19iaXRtYXNrID0gMHgzZmZmZmZmZiwKKyAgICAgICAgLkNQMF9TUlNDb25mMCA9ICgxIDw8IENQMFNSU0MwX00pIHwgKDB4M2ZlIDw8IENQMFNSU0MwX1NSUzMpIHwKKyAgICAgICAgICAgICAgICAgICAgKDB4M2ZlIDw8IENQMFNSU0MwX1NSUzIpIHwgKDB4M2ZlIDw8IENQMFNSU0MwX1NSUzEpLAorICAgICAgICAuQ1AwX1NSU0NvbmYxX3J3X2JpdG1hc2sgPSAweDNmZmZmZmZmLAorICAgICAgICAuQ1AwX1NSU0NvbmYxID0gKDEgPDwgQ1AwU1JTQzFfTSkgfCAoMHgzZmUgPDwgQ1AwU1JTQzFfU1JTNikgfAorICAgICAgICAgICAgICAgICAgICAoMHgzZmUgPDwgQ1AwU1JTQzFfU1JTNSkgfCAoMHgzZmUgPDwgQ1AwU1JTQzFfU1JTNCksCisgICAgICAgIC5DUDBfU1JTQ29uZjJfcndfYml0bWFzayA9IDB4M2ZmZmZmZmYsCisgICAgICAgIC5DUDBfU1JTQ29uZjIgPSAoMSA8PCBDUDBTUlNDMl9NKSB8ICgweDNmZSA8PCBDUDBTUlNDMl9TUlM5KSB8CisgICAgICAgICAgICAgICAgICAgICgweDNmZSA8PCBDUDBTUlNDMl9TUlM4KSB8ICgweDNmZSA8PCBDUDBTUlNDMl9TUlM3KSwKKyAgICAgICAgLkNQMF9TUlNDb25mM19yd19iaXRtYXNrID0gMHgzZmZmZmZmZiwKKyAgICAgICAgLkNQMF9TUlNDb25mMyA9ICgxIDw8IENQMFNSU0MzX00pIHwgKDB4M2ZlIDw8IENQMFNSU0MzX1NSUzEyKSB8CisgICAgICAgICAgICAgICAgICAgICgweDNmZSA8PCBDUDBTUlNDM19TUlMxMSkgfCAoMHgzZmUgPDwgQ1AwU1JTQzNfU1JTMTApLAorICAgICAgICAuQ1AwX1NSU0NvbmY0X3J3X2JpdG1hc2sgPSAweDNmZmZmZmZmLAorICAgICAgICAuQ1AwX1NSU0NvbmY0ID0gKDB4M2ZlIDw8IENQMFNSU0M0X1NSUzE1KSB8CisgICAgICAgICAgICAgICAgICAgICgweDNmZSA8PCBDUDBTUlNDNF9TUlMxNCkgfCAoMHgzZmUgPDwgQ1AwU1JTQzRfU1JTMTMpLAorICAgICAgICAuU0VHQklUUyA9IDMyLAorICAgICAgICAuUEFCSVRTID0gMzIsCisgICAgICAgIC5pbnNuX2ZsYWdzID0gQ1BVX01JUFMzMlIyIHwgQVNFX01JUFMxNiB8IEFTRV9EU1AgfCBBU0VfTVQsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX1I0MDAwLAorICAgIH0sCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUzY0KQorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiUjQwMDAiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDAwNDAwLAorICAgICAgICAvKiBObyBMMiBjYWNoZSwgaWNhY2hlIHNpemUgOGssIGRjYWNoZSBzaXplIDhrLCB1bmNhY2hlZCBjb2hlcmVuY3kuICovCisgICAgICAgIC5DUDBfQ29uZmlnMCA9ICgxIDw8IDE3KSB8ICgweDEgPDwgOSkgfCAoMHgxIDw8IDYpIHwgKDB4MiA8PCBDUDBDMF9LMCksCisgICAgICAgIC8qIE5vdGU6IENvbmZpZzEgaXMgb25seSB1c2VkIGludGVybmFsbHksIHRoZSBSNDAwMCBoYXMgb25seSBDb25maWcwLiAqLworICAgICAgICAuQ1AwX0NvbmZpZzEgPSAoMSA8PCBDUDBDMV9GUCkgfCAoNDcgPDwgQ1AwQzFfTU1VKSwKKyAgICAgICAgLkNQMF9MTEFkZHJfcndfYml0bWFzayA9IDB4RkZGRkZGRkYsCisgICAgICAgIC5DUDBfTExBZGRyX3NoaWZ0ID0gNCwKKyAgICAgICAgLlNZTkNJX1N0ZXAgPSAxNiwKKyAgICAgICAgLkNDUmVzID0gMiwKKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MzY3OEZGRkYsCisgICAgICAgIC8qIFRoZSBSNDAwMCBoYXMgYSBmdWxsIDY0Yml0IEZQVSBidXQgZG9lc24ndCB1c2UgdGhlIGZjcjAgYml0cy4gKi8KKyAgICAgICAgLkNQMV9mY3IwID0gKDB4NSA8PCBGQ1IwX1BSSUQpIHwgKDB4MCA8PCBGQ1IwX1JFViksCisgICAgICAgIC5TRUdCSVRTID0gNDAsCisgICAgICAgIC5QQUJJVFMgPSAzNiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzMsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX1I0MDAwLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICJWUjU0MzIiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDA1NDAwLAorICAgICAgICAvKiBObyBMMiBjYWNoZSwgaWNhY2hlIHNpemUgOGssIGRjYWNoZSBzaXplIDhrLCB1bmNhY2hlZCBjb2hlcmVuY3kuICovCisgICAgICAgIC5DUDBfQ29uZmlnMCA9ICgxIDw8IDE3KSB8ICgweDEgPDwgOSkgfCAoMHgxIDw8IDYpIHwgKDB4MiA8PCBDUDBDMF9LMCksCisgICAgICAgIC5DUDBfQ29uZmlnMSA9ICgxIDw8IENQMEMxX0ZQKSB8ICg0NyA8PCBDUDBDMV9NTVUpLAorICAgICAgICAuQ1AwX0xMQWRkcl9yd19iaXRtYXNrID0gMHhGRkZGRkZGRkwsCisgICAgICAgIC5DUDBfTExBZGRyX3NoaWZ0ID0gNCwKKyAgICAgICAgLlNZTkNJX1N0ZXAgPSAxNiwKKyAgICAgICAgLkNDUmVzID0gMiwKKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MzY3OEZGRkYsCisgICAgICAgIC8qIFRoZSBWUjU0MzIgaGFzIGEgZnVsbCA2NGJpdCBGUFUgYnV0IGRvZXNuJ3QgdXNlIHRoZSBmY3IwIGJpdHMuICovCisgICAgICAgIC5DUDFfZmNyMCA9ICgweDU0IDw8IEZDUjBfUFJJRCkgfCAoMHgwIDw8IEZDUjBfUkVWKSwKKyAgICAgICAgLlNFR0JJVFMgPSA0MCwKKyAgICAgICAgLlBBQklUUyA9IDMyLAorICAgICAgICAuaW5zbl9mbGFncyA9IENQVV9WUjU0WFgsCisgICAgICAgIC5tbXVfdHlwZSA9IE1NVV9UWVBFX1I0MDAwLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSA9ICI1S2MiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE4MTAwLAorICAgICAgICAuQ1AwX0NvbmZpZzAgPSBNSVBTX0NPTkZJRzAgfCAoMHgyIDw8IENQMEMwX0FUKSB8CisgICAgICAgICAgICAgICAgICAgICAgIChNTVVfVFlQRV9SNDAwMCA8PCBDUDBDMF9NVCksCisgICAgICAgIC5DUDBfQ29uZmlnMSA9IE1JUFNfQ09ORklHMSB8ICgzMSA8PCBDUDBDMV9NTVUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQ1AwQzFfSVMpIHwgKDQgPDwgQ1AwQzFfSUwpIHwgKDEgPDwgQ1AwQzFfSUEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQ1AwQzFfRFMpIHwgKDQgPDwgQ1AwQzFfREwpIHwgKDEgPDwgQ1AwQzFfREEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgQ1AwQzFfUEMpIHwgKDEgPDwgQ1AwQzFfV1IpIHwgKDEgPDwgQ1AwQzFfRVApLAorICAgICAgICAuQ1AwX0NvbmZpZzIgPSBNSVBTX0NPTkZJRzIsCisgICAgICAgIC5DUDBfQ29uZmlnMyA9IE1JUFNfQ09ORklHMywKKyAgICAgICAgLkNQMF9MTEFkZHJfcndfYml0bWFzayA9IDAsCisgICAgICAgIC5DUDBfTExBZGRyX3NoaWZ0ID0gNCwKKyAgICAgICAgLlNZTkNJX1N0ZXAgPSAzMiwKKyAgICAgICAgLkNDUmVzID0gMiwKKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MzJGOEZGRkYsCisgICAgICAgIC5TRUdCSVRTID0gNDIsCisgICAgICAgIC5QQUJJVFMgPSAzNiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzY0LAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiNUtmIiwKKyAgICAgICAgLkNQMF9QUmlkID0gMHgwMDAxODEwMCwKKyAgICAgICAgLkNQMF9Db25maWcwID0gTUlQU19DT05GSUcwIHwgKDB4MiA8PCBDUDBDMF9BVCkgfAorICAgICAgICAgICAgICAgICAgICAgICAoTU1VX1RZUEVfUjQwMDAgPDwgQ1AwQzBfTVQpLAorICAgICAgICAuQ1AwX0NvbmZpZzEgPSBNSVBTX0NPTkZJRzEgfCAoMSA8PCBDUDBDMV9GUCkgfCAoMzEgPDwgQ1AwQzFfTU1VKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IENQMEMxX0lTKSB8ICg0IDw8IENQMEMxX0lMKSB8ICgxIDw8IENQMEMxX0lBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IENQMEMxX0RTKSB8ICg0IDw8IENQMEMxX0RMKSB8ICgxIDw8IENQMEMxX0RBKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IENQMEMxX1BDKSB8ICgxIDw8IENQMEMxX1dSKSB8ICgxIDw8IENQMEMxX0VQKSwKKyAgICAgICAgLkNQMF9Db25maWcyID0gTUlQU19DT05GSUcyLAorICAgICAgICAuQ1AwX0NvbmZpZzMgPSBNSVBTX0NPTkZJRzMsCisgICAgICAgIC5DUDBfTExBZGRyX3J3X2JpdG1hc2sgPSAwLAorICAgICAgICAuQ1AwX0xMQWRkcl9zaGlmdCA9IDQsCisgICAgICAgIC5TWU5DSV9TdGVwID0gMzIsCisgICAgICAgIC5DQ1JlcyA9IDIsCisgICAgICAgIC5DUDBfU3RhdHVzX3J3X2JpdG1hc2sgPSAweDM2RjhGRkZGLAorICAgICAgICAvKiBUaGUgNUtmIGhhcyBGNjQgLyBMIC8gVyBidXQgZG9lc24ndCB1c2UgdGhlIGZjcjAgYml0cy4gKi8KKyAgICAgICAgLkNQMV9mY3IwID0gKDEgPDwgRkNSMF9EKSB8ICgxIDw8IEZDUjBfUykgfAorICAgICAgICAgICAgICAgICAgICAoMHg4MSA8PCBGQ1IwX1BSSUQpIHwgKDB4MCA8PCBGQ1IwX1JFViksCisgICAgICAgIC5TRUdCSVRTID0gNDIsCisgICAgICAgIC5QQUJJVFMgPSAzNiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzY0LAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgPSAiMjBLYyIsCisgICAgICAgIC8qIFdlIGVtdWxhdGUgYSBsYXRlciB2ZXJzaW9uIG9mIHRoZSAyMEtjLCBlYXJsaWVyIG9uZXMgaGFkIGEgYnJva2VuCisgICAgICAgICAgIFdBSVQgaW5zdHJ1Y3Rpb24uICovCisgICAgICAgIC5DUDBfUFJpZCA9IDB4MDAwMTgyYTAsCisgICAgICAgIC5DUDBfQ29uZmlnMCA9IE1JUFNfQ09ORklHMCB8ICgweDIgPDwgQ1AwQzBfQVQpIHwKKyAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSB8ICgxIDw8IENQMEMwX1ZJKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDEgPDwgQ1AwQzFfRlApIHwgKDQ3IDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCBDUDBDMV9JUykgfCAoNCA8PCBDUDBDMV9JTCkgfCAoMyA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCBDUDBDMV9EUykgfCAoNCA8PCBDUDBDMV9ETCkgfCAoMyA8PCBDUDBDMV9EQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBDUDBDMV9QQykgfCAoMSA8PCBDUDBDMV9XUikgfCAoMSA8PCBDUDBDMV9FUCksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczLAorICAgICAgICAuQ1AwX0xMQWRkcl9yd19iaXRtYXNrID0gMCwKKyAgICAgICAgLkNQMF9MTEFkZHJfc2hpZnQgPSAwLAorICAgICAgICAuU1lOQ0lfU3RlcCA9IDMyLAorICAgICAgICAuQ0NSZXMgPSAxLAorICAgICAgICAuQ1AwX1N0YXR1c19yd19iaXRtYXNrID0gMHgzNkZCRkZGRiwKKyAgICAgICAgLyogVGhlIDIwS2MgaGFzIEY2NCAvIEwgLyBXIGJ1dCBkb2Vzbid0IHVzZSB0aGUgZmNyMCBiaXRzLiAqLworICAgICAgICAuQ1AxX2ZjcjAgPSAoMSA8PCBGQ1IwXzNEKSB8ICgxIDw8IEZDUjBfUFMpIHwKKyAgICAgICAgICAgICAgICAgICAgKDEgPDwgRkNSMF9EKSB8ICgxIDw8IEZDUjBfUykgfAorICAgICAgICAgICAgICAgICAgICAoMHg4MiA8PCBGQ1IwX1BSSUQpIHwgKDB4MCA8PCBGQ1IwX1JFViksCisgICAgICAgIC5TRUdCSVRTID0gNDAsCisgICAgICAgIC5QQUJJVFMgPSAzNiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzY0IHwgQVNFX01JUFMzRCwKKyAgICAgICAgLm1tdV90eXBlID0gTU1VX1RZUEVfUjQwMDAsCisgICAgfSwKKyAgICB7CisgICAgICAgIC8qIEEgZ2VuZXJpYyBDUFUgcHJvdmlkaW5nIE1JUFM2NCBSZWxlYXNlIDIgZmVhdHVyZXMuCisgICAgICAgICAgIEZJWE1FOiBFdmVudHVhbGx5IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgcmVhbCBDUFUgbW9kZWwuICovCisgICAgICAgIC5uYW1lID0gIk1JUFM2NFIyLWdlbmVyaWMiLAorICAgICAgICAuQ1AwX1BSaWQgPSAweDAwMDE4OTAwLAorICAgICAgICAuQ1AwX0NvbmZpZzAgPSBNSVBTX0NPTkZJRzAgfCAoMHgxIDw8IENQMEMwX0FSKSB8ICgweDIgPDwgQ1AwQzBfQVQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSwKKyAgICAgICAgLkNQMF9Db25maWcxID0gTUlQU19DT05GSUcxIHwgKDEgPDwgQ1AwQzFfRlApIHwgKDYzIDw8IENQMEMxX01NVSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCBDUDBDMV9JUykgfCAoNCA8PCBDUDBDMV9JTCkgfCAoMyA8PCBDUDBDMV9JQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMiA8PCBDUDBDMV9EUykgfCAoNCA8PCBDUDBDMV9ETCkgfCAoMyA8PCBDUDBDMV9EQSkgfAorICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBDUDBDMV9QQykgfCAoMSA8PCBDUDBDMV9XUikgfCAoMSA8PCBDUDBDMV9FUCksCisgICAgICAgIC5DUDBfQ29uZmlnMiA9IE1JUFNfQ09ORklHMiwKKyAgICAgICAgLkNQMF9Db25maWczID0gTUlQU19DT05GSUczIHwgKDEgPDwgQ1AwQzNfTFBBKSwKKyAgICAgICAgLkNQMF9MTEFkZHJfcndfYml0bWFzayA9IDAsCisgICAgICAgIC5DUDBfTExBZGRyX3NoaWZ0ID0gMCwKKyAgICAgICAgLlNZTkNJX1N0ZXAgPSAzMiwKKyAgICAgICAgLkNDUmVzID0gMiwKKyAgICAgICAgLkNQMF9TdGF0dXNfcndfYml0bWFzayA9IDB4MzZGQkZGRkYsCisgICAgICAgIC5DUDFfZmNyMCA9ICgxIDw8IEZDUjBfRjY0KSB8ICgxIDw8IEZDUjBfM0QpIHwgKDEgPDwgRkNSMF9QUykgfAorICAgICAgICAgICAgICAgICAgICAoMSA8PCBGQ1IwX0wpIHwgKDEgPDwgRkNSMF9XKSB8ICgxIDw8IEZDUjBfRCkgfAorICAgICAgICAgICAgICAgICAgICAoMSA8PCBGQ1IwX1MpIHwgKDB4MDAgPDwgRkNSMF9QUklEKSB8ICgweDAgPDwgRkNSMF9SRVYpLAorICAgICAgICAuU0VHQklUUyA9IDQyLAorICAgICAgICAvKiBUaGUgYXJjaGl0ZWN0dXJhbCBsaW1pdCBpcyA1OSwgYnV0IHdlIGhhdmUgaGFyZGNvZGVkIDM2IGJpdAorICAgICAgICAgICBpbiBzb21lIHBsYWNlcy4uLgorICAgICAgICAuUEFCSVRTID0gNTksICovIC8qIHRoZSBhcmNoaXRlY3R1cmFsIGxpbWl0ICovCisgICAgICAgIC5QQUJJVFMgPSAzNiwKKyAgICAgICAgLmluc25fZmxhZ3MgPSBDUFVfTUlQUzY0UjIgfCBBU0VfTUlQUzNELAorICAgICAgICAubW11X3R5cGUgPSBNTVVfVFlQRV9SNDAwMCwKKyAgICB9LAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgbWlwc19kZWZfdCAqY3B1X21pcHNfZmluZF9ieV9uYW1lIChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWlwc19kZWZzKTsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjYXNlY21wKG5hbWUsIG1pcHNfZGVmc1tpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJm1pcHNfZGVmc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBtaXBzX2NwdV9saXN0IChGSUxFICpmLCBpbnQgKCpjcHVfZnByaW50ZikoRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWlwc19kZWZzKTsgaSsrKSB7CisgICAgICAgICgqY3B1X2ZwcmludGYpKGYsICJNSVBTICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1pcHNfZGVmc1tpXS5uYW1lKTsKKyAgICB9Cit9CisKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorc3RhdGljIHZvaWQgbm9fbW11X2luaXQgKENQVU1JUFNTdGF0ZSAqZW52LCBjb25zdCBtaXBzX2RlZl90ICpkZWYpCit7CisgICAgZW52LT50bGItPm5iX3RsYiA9IDE7CisgICAgZW52LT50bGItPm1hcF9hZGRyZXNzID0gJm5vX21tdV9tYXBfYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgZml4ZWRfbW11X2luaXQgKENQVU1JUFNTdGF0ZSAqZW52LCBjb25zdCBtaXBzX2RlZl90ICpkZWYpCit7CisgICAgZW52LT50bGItPm5iX3RsYiA9IDE7CisgICAgZW52LT50bGItPm1hcF9hZGRyZXNzID0gJmZpeGVkX21tdV9tYXBfYWRkcmVzczsKK30KKworc3RhdGljIHZvaWQgcjRrX21tdV9pbml0IChDUFVNSVBTU3RhdGUgKmVudiwgY29uc3QgbWlwc19kZWZfdCAqZGVmKQoreworICAgIGVudi0+dGxiLT5uYl90bGIgPSAxICsgKChkZWYtPkNQMF9Db25maWcxID4+IENQMEMxX01NVSkgJiA2Myk7CisgICAgZW52LT50bGItPm1hcF9hZGRyZXNzID0gJnI0a19tYXBfYWRkcmVzczsKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYndpID0gcjRrX2hlbHBlcl90bGJ3aTsKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYndyID0gcjRrX2hlbHBlcl90bGJ3cjsKKyAgICBlbnYtPnRsYi0+aGVscGVyX3RsYnAgPSByNGtfaGVscGVyX3RsYnA7CisgICAgZW52LT50bGItPmhlbHBlcl90bGJyID0gcjRrX2hlbHBlcl90bGJyOworfQorCitzdGF0aWMgdm9pZCBtbXVfaW5pdCAoQ1BVTUlQU1N0YXRlICplbnYsIGNvbnN0IG1pcHNfZGVmX3QgKmRlZikKK3sKKyAgICBlbnYtPnRsYiA9IGdfbWFsbG9jMChzaXplb2YoQ1BVTUlQU1RMQkNvbnRleHQpKTsKKworICAgIHN3aXRjaCAoZGVmLT5tbXVfdHlwZSkgeworICAgICAgICBjYXNlIE1NVV9UWVBFX05PTkU6CisgICAgICAgICAgICBub19tbXVfaW5pdChlbnYsIGRlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTVVfVFlQRV9SNDAwMDoKKyAgICAgICAgICAgIHI0a19tbXVfaW5pdChlbnYsIGRlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTVVfVFlQRV9GTVQ6CisgICAgICAgICAgICBmaXhlZF9tbXVfaW5pdChlbnYsIGRlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTVVfVFlQRV9SMzAwMDoKKyAgICAgICAgY2FzZSBNTVVfVFlQRV9SNjAwMDoKKyAgICAgICAgY2FzZSBNTVVfVFlQRV9SODAwMDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNwdV9hYm9ydChlbnYsICJNTVUgdHlwZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX1VTRVJfT05MWSAqLworCitzdGF0aWMgdm9pZCBmcHVfaW5pdCAoQ1BVTUlQU1N0YXRlICplbnYsIGNvbnN0IG1pcHNfZGVmX3QgKmRlZikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNSVBTX0ZQVV9NQVg7IGkrKykKKyAgICAgICAgZW52LT5mcHVzW2ldLmZjcjAgPSBkZWYtPkNQMV9mY3IwOworCisgICAgbWVtY3B5KCZlbnYtPmFjdGl2ZV9mcHUsICZlbnYtPmZwdXNbMF0sIHNpemVvZihlbnYtPmFjdGl2ZV9mcHUpKTsKK30KKworc3RhdGljIHZvaWQgbXZwX2luaXQgKENQVU1JUFNTdGF0ZSAqZW52LCBjb25zdCBtaXBzX2RlZl90ICpkZWYpCit7CisgICAgZW52LT5tdnAgPSBnX21hbGxvYzAoc2l6ZW9mKENQVU1JUFNNVlBDb250ZXh0KSk7CisKKyAgICAvKiBNVlBDb25mMSBpbXBsZW1lbnRlZCwgVExCIHNoYXJhYmxlLCBubyBnYXRpbmcgc3RvcmFnZSBzdXBwb3J0LAorICAgICAgIHByb2dyYW1tYWJsZSBjYWNoZSBwYXJ0aXRpb25pbmcgaW1wbGVtZW50ZWQsIG51bWJlciBvZiBhbGxvY2F0YWJsZQorICAgICAgIGFuZCBzaGFyYWJsZSBUTEIgZW50cmllcywgTVZQIGhhcyBhbGxvY2F0YWJsZSBUQ3MsIDIgVlBFcworICAgICAgIGltcGxlbWVudGVkLCA1IFRDcyBpbXBsZW1lbnRlZC4gKi8KKyAgICBlbnYtPm12cC0+Q1AwX01WUENvbmYwID0gKDEgPDwgQ1AwTVZQQzBfTSkgfCAoMSA8PCBDUDBNVlBDMF9UTEJTKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIDw8IENQME1WUEMwX0dTKSB8ICgxIDw8IENQME1WUEMwX1BDUCkgfAorLy8gVE9ETzogYWN0dWFsbHkgZG8gMiBWUEVzLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IENQME1WUEMwX1RDQSkgfCAoMHgxIDw8IENQME1WUEMwX1BWUEUpIHwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNCA8PCBDUDBNVlBDMF9QVEMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBDUDBNVlBDMF9UQ0EpIHwgKDB4MCA8PCBDUDBNVlBDMF9QVlBFKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDA0IDw8IENQME1WUEMwX1BUQyk7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAvKiBVc2VybW9kZSBoYXMgbm8gVExCIHN1cHBvcnQgKi8KKyAgICBlbnYtPm12cC0+Q1AwX01WUENvbmYwIHw9IChlbnYtPnRsYi0+bmJfdGxiIDw8IENQME1WUEMwX1BUTEJFKTsKKyNlbmRpZgorCisgICAgLyogQWxsb2NhdGFibGUgQ1AxIGhhdmUgbWVkaWEgZXh0ZW5zaW9ucywgYWxsb2NhdGFibGUgQ1AxIGhhdmUgRlAgc3VwcG9ydCwKKyAgICAgICBubyBVREkgaW1wbGVtZW50ZWQsIG5vIENQMiBpbXBsZW1lbnRlZCwgMSBDUDEgaW1wbGVtZW50ZWQuICovCisgICAgZW52LT5tdnAtPkNQMF9NVlBDb25mMSA9ICgxIDw8IENQME1WUEMxX0NJTSkgfCAoMSA8PCBDUDBNVlBDMV9DSUYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MCA8PCBDUDBNVlBDMV9QQ1gpIHwgKDB4MCA8PCBDUDBNVlBDMV9QQ1AyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEgPDwgQ1AwTVZQQzFfUENQMSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy1ydW50aW1lLmMgYi9hbmRyb2lkL3FlbXUxL3RjZy1ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MGU1MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGNnLXJ1bnRpbWUuYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIFRpbnkgQ29kZSBHZW5lcmF0b3IgZm9yIFFFTVUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAicWVtdS9ob3N0LXV0aWxzLmgiCisKKy8qIDMyLWJpdCBoZWxwZXJzICovCisKK2ludDMyX3QgdGNnX2hlbHBlcl9kaXZfaTMyKGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKQoreworICAgIHJldHVybiBhcmcxIC8gYXJnMjsKK30KKworaW50MzJfdCB0Y2dfaGVscGVyX3JlbV9pMzIoaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpCit7CisgICAgcmV0dXJuIGFyZzEgJSBhcmcyOworfQorCit1aW50MzJfdCB0Y2dfaGVscGVyX2RpdnVfaTMyKHVpbnQzMl90IGFyZzEsIHVpbnQzMl90IGFyZzIpCit7CisgICAgcmV0dXJuIGFyZzEgLyBhcmcyOworfQorCit1aW50MzJfdCB0Y2dfaGVscGVyX3JlbXVfaTMyKHVpbnQzMl90IGFyZzEsIHVpbnQzMl90IGFyZzIpCit7CisgICAgcmV0dXJuIGFyZzEgJSBhcmcyOworfQorCisvKiA2NC1iaXQgaGVscGVycyAqLworCitpbnQ2NF90IHRjZ19oZWxwZXJfc2hsX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICByZXR1cm4gYXJnMSA8PCBhcmcyOworfQorCitpbnQ2NF90IHRjZ19oZWxwZXJfc2hyX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICByZXR1cm4gKHVpbnQ2NF90KWFyZzEgPj4gYXJnMjsKK30KKworaW50NjRfdCB0Y2dfaGVscGVyX3Nhcl9pNjQoaW50NjRfdCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgcmV0dXJuIGFyZzEgPj4gYXJnMjsKK30KKworaW50NjRfdCB0Y2dfaGVscGVyX2Rpdl9pNjQoaW50NjRfdCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgcmV0dXJuIGFyZzEgLyBhcmcyOworfQorCitpbnQ2NF90IHRjZ19oZWxwZXJfcmVtX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICByZXR1cm4gYXJnMSAlIGFyZzI7Cit9CisKK3VpbnQ2NF90IHRjZ19oZWxwZXJfZGl2dV9pNjQodWludDY0X3QgYXJnMSwgdWludDY0X3QgYXJnMikKK3sKKyAgICByZXR1cm4gYXJnMSAvIGFyZzI7Cit9CisKK3VpbnQ2NF90IHRjZ19oZWxwZXJfcmVtdV9pNjQodWludDY0X3QgYXJnMSwgdWludDY0X3QgYXJnMikKK3sKKyAgICByZXR1cm4gYXJnMSAlIGFyZzI7Cit9CisKK3VpbnQ2NF90IHRjZ19oZWxwZXJfbXVsdWhfaTY0KHVpbnQ2NF90IGFyZzEsIHVpbnQ2NF90IGFyZzIpCit7CisgICAgdWludDY0X3QgbCwgaDsKKyAgICBtdWx1NjQoJmwsICZoLCBhcmcxLCBhcmcyKTsKKyAgICByZXR1cm4gaDsKK30KKworaW50NjRfdCB0Y2dfaGVscGVyX211bHNoX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICB1aW50NjRfdCBsLCBoOworICAgIG11bHM2NCgmbCwgJmgsIGFyZzEsIGFyZzIpOworICAgIHJldHVybiBoOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90Y2cvTElDRU5TRSBiL2FuZHJvaWQvcWVtdTEvdGNnL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MTdmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGNnL0xJQ0VOU0UKQEAgLTAsMCArMSwzIEBACitBbGwgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFuZCBzdWJkaXJlY3RvcmllcyBhcmUgcmVsZWFzZWQgdW5kZXIKK2EgQlNEIGxpa2UgbGljZW5zZSAoc2VlIGhlYWRlciBpbiBlYWNoIGZpbGUpLiBObyBvdGhlciBsaWNlbnNlIGlzCithY2NlcHRlZC4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGNnL1JFQURNRSBiL2FuZHJvaWQvcWVtdTEvdGNnL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTc4MjEyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvUkVBRE1FCkBAIC0wLDAgKzEsNTM4IEBACitUaW55IENvZGUgR2VuZXJhdG9yIC0gRmFicmljZSBCZWxsYXJkLgorCisxKSBJbnRyb2R1Y3Rpb24KKworVENHIChUaW55IENvZGUgR2VuZXJhdG9yKSBiZWdhbiBhcyBhIGdlbmVyaWMgYmFja2VuZCBmb3IgYSBDCitjb21waWxlci4gSXQgd2FzIHNpbXBsaWZpZWQgdG8gYmUgdXNlZCBpbiBRRU1VLiBJdCBhbHNvIGhhcyBpdHMgcm9vdHMKK2luIHRoZSBRT1AgY29kZSBnZW5lcmF0b3Igd3JpdHRlbiBieSBQYXVsIEJyb29rLiAKKworMikgRGVmaW5pdGlvbnMKKworVGhlIFRDRyAidGFyZ2V0IiBpcyB0aGUgYXJjaGl0ZWN0dXJlIGZvciB3aGljaCB3ZSBnZW5lcmF0ZSB0aGUKK2NvZGUuIEl0IGlzIG9mIGNvdXJzZSBub3QgdGhlIHNhbWUgYXMgdGhlICJ0YXJnZXQiIG9mIFFFTVUgd2hpY2ggaXMKK3RoZSBlbXVsYXRlZCBhcmNoaXRlY3R1cmUuIEFzIFRDRyBzdGFydGVkIGFzIGEgZ2VuZXJpYyBDIGJhY2tlbmQgdXNlZAorZm9yIGNyb3NzIGNvbXBpbGluZywgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBUQ0cgdGFyZ2V0IGlzIGRpZmZlcmVudAorZnJvbSB0aGUgaG9zdCwgYWx0aG91Z2ggaXQgaXMgbmV2ZXIgdGhlIGNhc2UgZm9yIFFFTVUuCisKK0luIHRoaXMgZG9jdW1lbnQsIHdlIHVzZSAiZ3Vlc3QiIHRvIHNwZWNpZnkgd2hhdCBhcmNoaXRlY3R1cmUgd2UgYXJlCitlbXVsYXRpbmc7ICJ0YXJnZXQiIGFsd2F5cyBtZWFucyB0aGUgVENHIHRhcmdldCwgdGhlIG1hY2hpbmUgb24gd2hpY2gKK3dlIGFyZSBydW5uaW5nIFFFTVUuCisKK0EgVENHICJmdW5jdGlvbiIgY29ycmVzcG9uZHMgdG8gYSBRRU1VIFRyYW5zbGF0ZWQgQmxvY2sgKFRCKS4KKworQSBUQ0cgInRlbXBvcmFyeSIgaXMgYSB2YXJpYWJsZSBvbmx5IGxpdmUgaW4gYSBiYXNpYworYmxvY2suIFRlbXBvcmFyaWVzIGFyZSBhbGxvY2F0ZWQgZXhwbGljaXRseSBpbiBlYWNoIGZ1bmN0aW9uLgorCitBIFRDRyAibG9jYWwgdGVtcG9yYXJ5IiBpcyBhIHZhcmlhYmxlIG9ubHkgbGl2ZSBpbiBhIGZ1bmN0aW9uLiBMb2NhbAordGVtcG9yYXJpZXMgYXJlIGFsbG9jYXRlZCBleHBsaWNpdGx5IGluIGVhY2ggZnVuY3Rpb24uCisKK0EgVENHICJnbG9iYWwiIGlzIGEgdmFyaWFibGUgd2hpY2ggaXMgbGl2ZSBpbiBhbGwgdGhlIGZ1bmN0aW9ucworKGVxdWl2YWxlbnQgb2YgYSBDIGdsb2JhbCB2YXJpYWJsZSkuIFRoZXkgYXJlIGRlZmluZWQgYmVmb3JlIHRoZQorZnVuY3Rpb25zIGRlZmluZWQuIEEgVENHIGdsb2JhbCBjYW4gYmUgYSBtZW1vcnkgbG9jYXRpb24gKGUuZy4gYSBRRU1VCitDUFUgcmVnaXN0ZXIpLCBhIGZpeGVkIGhvc3QgcmVnaXN0ZXIgKGUuZy4gdGhlIFFFTVUgQ1BVIHN0YXRlIHBvaW50ZXIpCitvciBhIG1lbW9yeSBsb2NhdGlvbiB3aGljaCBpcyBzdG9yZWQgaW4gYSByZWdpc3RlciBvdXRzaWRlIFFFTVUgVEJzCisobm90IGltcGxlbWVudGVkIHlldCkuCisKK0EgVENHICJiYXNpYyBibG9jayIgY29ycmVzcG9uZHMgdG8gYSBsaXN0IG9mIGluc3RydWN0aW9ucyB0ZXJtaW5hdGVkCitieSBhIGJyYW5jaCBpbnN0cnVjdGlvbi4gCisKKzMpIEludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbgorCiszLjEpIEludHJvZHVjdGlvbgorCitUQ0cgaW5zdHJ1Y3Rpb25zIG9wZXJhdGUgb24gdmFyaWFibGVzIHdoaWNoIGFyZSB0ZW1wb3JhcmllcywgbG9jYWwKK3RlbXBvcmFyaWVzIG9yIGdsb2JhbHMuIFRDRyBpbnN0cnVjdGlvbnMgYW5kIHZhcmlhYmxlcyBhcmUgc3Ryb25nbHkKK3R5cGVkLiBUd28gdHlwZXMgYXJlIHN1cHBvcnRlZDogMzIgYml0IGludGVnZXJzIGFuZCA2NCBiaXQKK2ludGVnZXJzLiBQb2ludGVycyBhcmUgZGVmaW5lZCBhcyBhbiBhbGlhcyB0byAzMiBiaXQgb3IgNjQgYml0CitpbnRlZ2VycyBkZXBlbmRpbmcgb24gdGhlIFRDRyB0YXJnZXQgd29yZCBzaXplLgorCitFYWNoIGluc3RydWN0aW9uIGhhcyBhIGZpeGVkIG51bWJlciBvZiBvdXRwdXQgdmFyaWFibGUgb3BlcmFuZHMsIGlucHV0Cit2YXJpYWJsZSBvcGVyYW5kcyBhbmQgYWx3YXlzIGNvbnN0YW50IG9wZXJhbmRzLgorCitUaGUgbm90YWJsZSBleGNlcHRpb24gaXMgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gd2hpY2ggaGFzIGEgdmFyaWFibGUKK251bWJlciBvZiBvdXRwdXRzIGFuZCBpbnB1dHMuCisKK0luIHRoZSB0ZXh0dWFsIGZvcm0sIG91dHB1dCBvcGVyYW5kcyB1c3VhbGx5IGNvbWUgZmlyc3QsIGZvbGxvd2VkIGJ5CitpbnB1dCBvcGVyYW5kcywgZm9sbG93ZWQgYnkgY29uc3RhbnQgb3BlcmFuZHMuIFRoZSBvdXRwdXQgdHlwZSBpcworaW5jbHVkZWQgaW4gdGhlIGluc3RydWN0aW9uIG5hbWUuIENvbnN0YW50cyBhcmUgcHJlZml4ZWQgd2l0aCBhICckJy4KKworYWRkX2kzMiB0MCwgdDEsIHQyICAodDAgPC0gdDEgKyB0MikKKworMy4yKSBBc3N1bXB0aW9ucworCisqIEJhc2ljIGJsb2NrcworCistIEJhc2ljIGJsb2NrcyBlbmQgYWZ0ZXIgYnJhbmNoZXMgKGUuZy4gYnJjb25kX2kzMiBpbnN0cnVjdGlvbiksCisgIGdvdG9fdGIgYW5kIGV4aXRfdGIgaW5zdHJ1Y3Rpb25zLgorLSBCYXNpYyBibG9ja3Mgc3RhcnQgYWZ0ZXIgdGhlIGVuZCBvZiBhIHByZXZpb3VzIGJhc2ljIGJsb2NrLCBvciBhdCBhCisgIHNldF9sYWJlbCBpbnN0cnVjdGlvbi4KKworQWZ0ZXIgdGhlIGVuZCBvZiBhIGJhc2ljIGJsb2NrLCB0aGUgY29udGVudCBvZiB0ZW1wb3JhcmllcyBpcworZGVzdHJveWVkLCBidXQgbG9jYWwgdGVtcG9yYXJpZXMgYW5kIGdsb2JhbHMgYXJlIHByZXNlcnZlZC4KKworKiBGbG9hdGluZyBwb2ludCB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQKKworKiBQb2ludGVyczogZGVwZW5kaW5nIG9uIHRoZSBUQ0cgdGFyZ2V0LCBwb2ludGVyIHNpemUgaXMgMzIgYml0IG9yIDY0CisgIGJpdC4gVGhlIHR5cGUgVENHX1RZUEVfUFRSIGlzIGFuIGFsaWFzIHRvIFRDR19UWVBFX0kzMiBvcgorICBUQ0dfVFlQRV9JNjQuCisKKyogSGVscGVyczoKKworVXNpbmcgdGhlIHRjZ19nZW5faGVscGVyX3hfeSBpdCBpcyBwb3NzaWJsZSB0byBjYWxsIGFueSBmdW5jdGlvbgordGFraW5nIGkzMiwgaTY0IG9yIHBvaW50ZXIgdHlwZXMuIEJ5IGRlZmF1bHQsIGJlZm9yZSBjYWxsaW5nIGEgaGVscGVyLAorYWxsIGdsb2JhbHMgYXJlIHN0b3JlZCBhdCB0aGVpciBjYW5vbmljYWwgbG9jYXRpb24gYW5kIGl0IGlzIGFzc3VtZWQKK3RoYXQgdGhlIGZ1bmN0aW9uIGNhbiBtb2RpZnkgdGhlbS4gQnkgZGVmYXVsdCwgdGhlIGhlbHBlciBpcyBhbGxvd2VkIHRvCittb2RpZnkgdGhlIENQVSBzdGF0ZSBvciByYWlzZSBhbiBleGNlcHRpb24uCisKK1RoaXMgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBtb2RpZmllcnM6CistIFRDR19DQUxMX05PX1JFQURfR0xPQkFMUyBtZWFucyB0aGF0IHRoZSBoZWxwZXIgZG9lcyBub3QgcmVhZCBnbG9iYWxzLAorICBlaXRoZXIgZGlyZWN0bHkgb3IgdmlhIGFuIGV4Y2VwdGlvbi4gVGhleSB3aWxsIG5vdCBiZSBzYXZlZCB0byB0aGVpcgorICBjYW5vbmljYWwgbG9jYXRpb25zIGJlZm9yZSBjYWxsaW5nIHRoZSBoZWxwZXIuCistIFRDR19DQUxMX05PX1dSSVRFX0dMT0JBTFMgbWVhbnMgdGhhdCB0aGUgaGVscGVyIGRvZXMgbm90IG1vZGlmeSBhbnkgZ2xvYmFscy4KKyAgVGhleSB3aWxsIG9ubHkgYmUgc2F2ZWQgdG8gdGhlaXIgY2Fub25pY2FsIGxvY2F0aW9uIGJlZm9yZSBjYWxsaW5nIGhlbHBlcnMsCisgIGJ1dCB0aGV5IHdvbid0IGJlIHJlbG9hZGVkIGFmdGVyd2lzZS4KKy0gVENHX0NBTExfTk9fU0lERV9FRkZFQ1RTIG1lYW5zIHRoYXQgdGhlIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGlzIHJlbW92ZWQgaWYKKyAgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC4KKworTm90ZSB0aGF0IFRDR19DQUxMX05PX1JFQURfR0xPQkFMUyBpbXBsaWVzIFRDR19DQUxMX05PX1dSSVRFX0dMT0JBTFMuCisKK09uIHNvbWUgVENHIHRhcmdldHMgKGUuZy4geDg2KSwgc2V2ZXJhbCBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZQorc3VwcG9ydGVkLgorCisqIEJyYW5jaGVzOgorCitVc2UgdGhlIGluc3RydWN0aW9uICdicicgdG8ganVtcCB0byBhIGxhYmVsLgorCiszLjMpIENvZGUgT3B0aW1pemF0aW9ucworCitXaGVuIGdlbmVyYXRpbmcgaW5zdHJ1Y3Rpb25zLCB5b3UgY2FuIGNvdW50IG9uIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcKK29wdGltaXphdGlvbnM6CisKKy0gU2luZ2xlIGluc3RydWN0aW9ucyBhcmUgc2ltcGxpZmllZCwgZS5nLgorCisgICBhbmRfaTMyIHQwLCB0MCwgJDB4ZmZmZmZmZmYKKyAgICAKKyAgaXMgc3VwcHJlc3NlZC4KKworLSBBIGxpdmVuZXNzIGFuYWx5c2lzIGlzIGRvbmUgYXQgdGhlIGJhc2ljIGJsb2NrIGxldmVsLiBUaGUKKyAgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBzdXBwcmVzcyBtb3ZlcyBmcm9tIGEgZGVhZCB2YXJpYWJsZSB0bworICBhbm90aGVyIG9uZS4gSXQgaXMgYWxzbyB1c2VkIHRvIHJlbW92ZSBpbnN0cnVjdGlvbnMgd2hpY2ggY29tcHV0ZQorICBkZWFkIHJlc3VsdHMuIFRoZSBsYXRlciBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgY29uZGl0aW9uIGNvZGUKKyAgb3B0aW1pemF0aW9uIGluIFFFTVUuCisKKyAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgIGFkZF9pMzIgdDAsIHQxLCB0MgorICBhZGRfaTMyIHQwLCB0MCwgJDEKKyAgbW92X2kzMiB0MCwgJDEKKworICBvbmx5IHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIGtlcHQuCisKKzMuNCkgSW5zdHJ1Y3Rpb24gUmVmZXJlbmNlCisKKyoqKioqKioqKiBGdW5jdGlvbiBjYWxsCisKKyogY2FsbCA8cmV0PiA8cGFyYW1zPiBwdHIKKworY2FsbCBmdW5jdGlvbiAncHRyJyAocG9pbnRlciB0eXBlKQorCis8cmV0PiBvcHRpb25hbCAzMiBiaXQgb3IgNjQgYml0IHJldHVybiB2YWx1ZQorPHBhcmFtcz4gb3B0aW9uYWwgMzIgYml0IG9yIDY0IGJpdCBwYXJhbWV0ZXJzCisKKyoqKioqKioqKiBKdW1wcy9MYWJlbHMKKworKiBzZXRfbGFiZWwgJGxhYmVsCisKK0RlZmluZSBsYWJlbCAnbGFiZWwnIGF0IHRoZSBjdXJyZW50IHByb2dyYW0gcG9pbnQuCisKKyogYnIgJGxhYmVsCisKK0p1bXAgdG8gbGFiZWwuCisKKyogYnJjb25kX2kzMi9pNjQgdDAsIHQxLCBjb25kLCBsYWJlbAorCitDb25kaXRpb25hbCBqdW1wIGlmIHQwIGNvbmQgdDEgaXMgdHJ1ZS4gY29uZCBjYW4gYmU6CisgICAgVENHX0NPTkRfRVEKKyAgICBUQ0dfQ09ORF9ORQorICAgIFRDR19DT05EX0xUIC8qIHNpZ25lZCAqLworICAgIFRDR19DT05EX0dFIC8qIHNpZ25lZCAqLworICAgIFRDR19DT05EX0xFIC8qIHNpZ25lZCAqLworICAgIFRDR19DT05EX0dUIC8qIHNpZ25lZCAqLworICAgIFRDR19DT05EX0xUVSAvKiB1bnNpZ25lZCAqLworICAgIFRDR19DT05EX0dFVSAvKiB1bnNpZ25lZCAqLworICAgIFRDR19DT05EX0xFVSAvKiB1bnNpZ25lZCAqLworICAgIFRDR19DT05EX0dUVSAvKiB1bnNpZ25lZCAqLworCisqKioqKioqKiogQXJpdGhtZXRpYworCisqIGFkZF9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDErdDIKKworKiBzdWJfaTMyL2k2NCB0MCwgdDEsIHQyCisKK3QwPXQxLXQyCisKKyogbmVnX2kzMi9pNjQgdDAsIHQxCisKK3QwPS10MSAodHdvJ3MgY29tcGxlbWVudCkKKworKiBtdWxfaTMyL2k2NCB0MCwgdDEsIHQyCisKK3QwPXQxKnQyCisKKyogZGl2X2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD10MS90MiAoc2lnbmVkKS4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGRpdmlzaW9uIGJ5IHplcm8gb3Igb3ZlcmZsb3cuCisKKyogZGl2dV9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDEvdDIgKHVuc2lnbmVkKS4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGRpdmlzaW9uIGJ5IHplcm8uCisKKyogcmVtX2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD10MSV0MiAoc2lnbmVkKS4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGRpdmlzaW9uIGJ5IHplcm8gb3Igb3ZlcmZsb3cuCisKKyogcmVtdV9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDEldDIgKHVuc2lnbmVkKS4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIGRpdmlzaW9uIGJ5IHplcm8uCisKKyoqKioqKioqKiBMb2dpY2FsCisKKyogYW5kX2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD10MSZ0MgorCisqIG9yX2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD10MXx0MgorCisqIHhvcl9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDFedDIKKworKiBub3RfaTMyL2k2NCB0MCwgdDEKKwordDA9fnQxCisKKyogYW5kY19pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDEmfnQyCisKKyogZXF2X2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD1+KHQxXnQyKSwgb3IgZXF1aXZhbGVudGx5LCB0MD10MV5+dDIKKworKiBuYW5kX2kzMi9pNjQgdDAsIHQxLCB0MgorCit0MD1+KHQxJnQyKQorCisqIG5vcl9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9fih0MXx0MikKKworKiBvcmNfaTMyL2k2NCB0MCwgdDEsIHQyCisKK3QwPXQxfH50MgorCisqKioqKioqKiogU2hpZnRzL1JvdGF0ZXMKKworKiBzaGxfaTMyL2k2NCB0MCwgdDEsIHQyCisKK3QwPXQxIDw8IHQyLiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgdDIgPCAwIG9yIHQyID49IDMyIChyZXNwIDY0KQorCisqIHNocl9pMzIvaTY0IHQwLCB0MSwgdDIKKwordDA9dDEgPj4gdDIgKHVuc2lnbmVkKS4gVW5kZWZpbmVkIGJlaGF2aW9yIGlmIHQyIDwgMCBvciB0MiA+PSAzMiAocmVzcCA2NCkKKworKiBzYXJfaTMyL2k2NCB0MCwgdDEsIHQyCisKK3QwPXQxID4+IHQyIChzaWduZWQpLiBVbmRlZmluZWQgYmVoYXZpb3IgaWYgdDIgPCAwIG9yIHQyID49IDMyIChyZXNwIDY0KQorCisqIHJvdGxfaTMyL2k2NCB0MCwgdDEsIHQyCisKK1JvdGF0aW9uIG9mIHQyIGJpdHMgdG8gdGhlIGxlZnQuIFVuZGVmaW5lZCBiZWhhdmlvciBpZiB0MiA8IDAgb3IgdDIgPj0gMzIgKHJlc3AgNjQpCisKKyogcm90cl9pMzIvaTY0IHQwLCB0MSwgdDIKKworUm90YXRpb24gb2YgdDIgYml0cyB0byB0aGUgcmlnaHQuIFVuZGVmaW5lZCBiZWhhdmlvciBpZiB0MiA8IDAgb3IgdDIgPj0gMzIgKHJlc3AgNjQpCisKKyoqKioqKioqKiBNaXNjCisKKyogbW92X2kzMi9pNjQgdDAsIHQxCisKK3QwID0gdDEKKworTW92ZSB0MSB0byB0MCAoYm90aCBvcGVyYW5kcyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSkuCisKKyogZXh0OHNfaTMyL2k2NCB0MCwgdDEKK2V4dDh1X2kzMi9pNjQgdDAsIHQxCitleHQxNnNfaTMyL2k2NCB0MCwgdDEKK2V4dDE2dV9pMzIvaTY0IHQwLCB0MQorZXh0MzJzX2k2NCB0MCwgdDEKK2V4dDMydV9pNjQgdDAsIHQxCisKKzgsIDE2IG9yIDMyIGJpdCBzaWduL3plcm8gZXh0ZW5zaW9uIChib3RoIG9wZXJhbmRzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlKQorCisqIGJzd2FwMTZfaTMyL2k2NCB0MCwgdDEKKworMTYgYml0IGJ5dGUgc3dhcCBvbiBhIDMyLzY0IGJpdCB2YWx1ZS4gSXQgYXNzdW1lcyB0aGF0IHRoZSB0d28vc2l4IGhpZ2ggb3JkZXIKK2J5dGVzIGFyZSBzZXQgdG8gemVyby4KKworKiBic3dhcDMyX2kzMi9pNjQgdDAsIHQxCisKKzMyIGJpdCBieXRlIHN3YXAgb24gYSAzMi82NCBiaXQgdmFsdWUuIFdpdGggYSA2NCBiaXQgdmFsdWUsIGl0IGFzc3VtZXMgdGhhdAordGhlIGZvdXIgaGlnaCBvcmRlciBieXRlcyBhcmUgc2V0IHRvIHplcm8uCisKKyogYnN3YXA2NF9pNjQgdDAsIHQxCisKKzY0IGJpdCBieXRlIHN3YXAKKworKiBkaXNjYXJkX2kzMi9pNjQgdDAKKworSW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgb2YgdDAgd29uJ3QgYmUgdXNlZCBsYXRlci4gSXQgaXMgdXNlZnVsIHRvCitmb3JjZSBkZWFkIGNvZGUgZWxpbWluYXRpb24uCisKKyogZGVwb3NpdF9pMzIvaTY0IGRlc3QsIHQxLCB0MiwgcG9zLCBsZW4KKworRGVwb3NpdCBUMiBhcyBhIGJpdGZpZWxkIGludG8gVDEsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbiBERVNULgorVGhlIGJpdGZpZWxkIGlzIGRlc2NyaWJlZCBieSBQT1MvTEVOLCB3aGljaCBhcmUgaW1tZWRpYXRlIHZhbHVlczoKKworICBMRU4gLSB0aGUgbGVuZ3RoIG9mIHRoZSBiaXRmaWVsZAorICBQT1MgLSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJpdCwgY291bnRpbmcgZnJvbSB0aGUgTFNCCisKK0ZvciBleGFtcGxlLCBwb3M9OCwgbGVuPTQgaW5kaWNhdGVzIGEgNC1iaXQgZmllbGQgYXQgYml0IDguCitUaGlzIG9wZXJhdGlvbiB3b3VsZCBiZSBlcXVpdmFsZW50IHRvCisKKyAgZGVzdCA9ICh0MSAmIH4weDBmMDApIHwgKCh0MiA8PCA4KSAmIDB4MGYwMCkKKworCisqKioqKioqKiogQ29uZGl0aW9uYWwgbW92ZXMKKworKiBzZXRjb25kX2kzMi9pNjQgZGVzdCwgdDEsIHQyLCBjb25kCisKK2Rlc3QgPSAodDEgY29uZCB0MikKKworU2V0IERFU1QgdG8gMSBpZiAoVDEgY29uZCBUMikgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHNldCB0byAwLgorCisqIG1vdmNvbmRfaTMyL2k2NCBkZXN0LCBjMSwgYzIsIHYxLCB2MiwgY29uZAorCitkZXN0ID0gKGMxIGNvbmQgYzIgPyB2MSA6IHYyKQorCitTZXQgREVTVCB0byBWMSBpZiAoQzEgY29uZCBDMikgaXMgdHJ1ZSwgb3RoZXJ3aXNlIHNldCB0byBWMi4KKworKioqKioqKioqIFR5cGUgY29udmVyc2lvbnMKKworKiBleHRfaTMyX2k2NCB0MCwgdDEKK0NvbnZlcnQgdDEgKDMyIGJpdCkgdG8gdDAgKDY0IGJpdCkgYW5kIGRvZXMgc2lnbiBleHRlbnNpb24KKworKiBleHR1X2kzMl9pNjQgdDAsIHQxCitDb252ZXJ0IHQxICgzMiBiaXQpIHRvIHQwICg2NCBiaXQpIGFuZCBkb2VzIHplcm8gZXh0ZW5zaW9uCisKKyogdHJ1bmNfaTY0X2kzMiB0MCwgdDEKK1RydW5jYXRlIHQxICg2NCBiaXQpIHRvIHQwICgzMiBiaXQpCisKKyogY29uY2F0X2kzMl9pNjQgdDAsIHQxLCB0MgorQ29uc3RydWN0IHQwICg2NC1iaXQpIHRha2luZyB0aGUgbG93IGhhbGYgZnJvbSB0MSAoMzIgYml0KSBhbmQgdGhlIGhpZ2ggaGFsZgorZnJvbSB0MiAoMzIgYml0KS4KKworKiBjb25jYXQzMl9pNjQgdDAsIHQxLCB0MgorQ29uc3RydWN0IHQwICg2NC1iaXQpIHRha2luZyB0aGUgbG93IGhhbGYgZnJvbSB0MSAoNjQgYml0KSBhbmQgdGhlIGhpZ2ggaGFsZgorZnJvbSB0MiAoNjQgYml0KS4KKworKioqKioqKioqIExvYWQvU3RvcmUKKworKiBsZF9pMzIvaTY0IHQwLCB0MSwgb2Zmc2V0CitsZDhzX2kzMi9pNjQgdDAsIHQxLCBvZmZzZXQKK2xkOHVfaTMyL2k2NCB0MCwgdDEsIG9mZnNldAorbGQxNnNfaTMyL2k2NCB0MCwgdDEsIG9mZnNldAorbGQxNnVfaTMyL2k2NCB0MCwgdDEsIG9mZnNldAorbGQzMnNfaTY0IHQwLCB0MSwgb2Zmc2V0CitsZDMydV9pNjQgdDAsIHQxLCBvZmZzZXQKKwordDAgPSByZWFkKHQxICsgb2Zmc2V0KQorTG9hZCA4LCAxNiwgMzIgb3IgNjQgYml0cyB3aXRoIG9yIHdpdGhvdXQgc2lnbiBleHRlbnNpb24gZnJvbSBob3N0IG1lbW9yeS4gCitvZmZzZXQgbXVzdCBiZSBhIGNvbnN0YW50LgorCisqIHN0X2kzMi9pNjQgdDAsIHQxLCBvZmZzZXQKK3N0OF9pMzIvaTY0IHQwLCB0MSwgb2Zmc2V0CitzdDE2X2kzMi9pNjQgdDAsIHQxLCBvZmZzZXQKK3N0MzJfaTY0IHQwLCB0MSwgb2Zmc2V0CisKK3dyaXRlKHQwLCB0MSArIG9mZnNldCkKK1dyaXRlIDgsIDE2LCAzMiBvciA2NCBiaXRzIHRvIGhvc3QgbWVtb3J5LgorCitBbGwgdGhpcyBvcGNvZGVzIGFzc3VtZSB0aGF0IHRoZSBwb2ludGVkIGhvc3QgbWVtb3J5IGRvZXNuJ3QgY29ycmVzcG9uZAordG8gYSBnbG9iYWwuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgYmVoYXZpb3VyIGlzIHVucHJlZGljdGFibGUuCisKKyoqKioqKioqKiBNdWx0aXdvcmQgYXJpdGhtZXRpYyBzdXBwb3J0CisKKyogYWRkMl9pMzIvaTY0IHQwX2xvdywgdDBfaGlnaCwgdDFfbG93LCB0MV9oaWdoLCB0Ml9sb3csIHQyX2hpZ2gKKyogc3ViMl9pMzIvaTY0IHQwX2xvdywgdDBfaGlnaCwgdDFfbG93LCB0MV9oaWdoLCB0Ml9sb3csIHQyX2hpZ2gKKworU2ltaWxhciB0byBhZGQvc3ViLCBleGNlcHQgdGhhdCB0aGUgZG91YmxlLXdvcmQgaW5wdXRzIFQxIGFuZCBUMiBhcmUKK2Zvcm1lZCBmcm9tIHR3byBzaW5nbGUtd29yZCBhcmd1bWVudHMsIGFuZCB0aGUgZG91YmxlLXdvcmQgb3V0cHV0IFQwCitpcyByZXR1cm5lZCBpbiB0d28gc2luZ2xlLXdvcmQgb3V0cHV0cy4KKworKiBtdWx1Ml9pMzIvaTY0IHQwX2xvdywgdDBfaGlnaCwgdDEsIHQyCisKK1NpbWlsYXIgdG8gbXVsLCBleGNlcHQgdHdvIHVuc2lnbmVkIGlucHV0cyBUMSBhbmQgVDIgeWllbGRpbmcgdGhlIGZ1bGwKK2RvdWJsZS13b3JkIHByb2R1Y3QgVDAuICBUaGUgbGF0ZXIgaXMgcmV0dXJuZWQgaW4gdHdvIHNpbmdsZS13b3JkIG91dHB1dHMuCisKKyogbXVsczJfaTMyL2k2NCB0MF9sb3csIHQwX2hpZ2gsIHQxLCB0MgorCitTaW1pbGFyIHRvIG11bHUyLCBleGNlcHQgdGhlIHR3byBpbnB1dHMgVDEgYW5kIFQyIGFyZSBzaWduZWQuCisKKyoqKioqKioqKiA2NC1iaXQgZ3Vlc3Qgb24gMzItYml0IGhvc3Qgc3VwcG9ydAorCitUaGUgZm9sbG93aW5nIG9wY29kZXMgYXJlIGludGVybmFsIHRvIFRDRy4gIFRodXMgdGhleSBhcmUgdG8gYmUgaW1wbGVtZW50ZWQgYnkKKzMyLWJpdCBob3N0IGNvZGUgZ2VuZXJhdG9ycywgYnV0IGFyZSBub3QgdG8gYmUgZW1pdHRlZCBieSBndWVzdCB0cmFuc2xhdG9ycy4KK1RoZXkgYXJlIGVtaXR0ZWQgYXMgbmVlZGVkIGJ5IGlubGluZSBmdW5jdGlvbnMgd2l0aGluICJ0Y2ctb3AuaCIuCisKKyogYnJjb25kMl9pMzIgdDBfbG93LCB0MF9oaWdoLCB0MV9sb3csIHQxX2hpZ2gsIGNvbmQsIGxhYmVsCisKK1NpbWlsYXIgdG8gYnJjb25kLCBleGNlcHQgdGhhdCB0aGUgNjQtYml0IHZhbHVlcyBUMCBhbmQgVDEKK2FyZSBmb3JtZWQgZnJvbSB0d28gMzItYml0IGFyZ3VtZW50cy4KKworKiBzZXRjb25kMl9pMzIgZGVzdCwgdDFfbG93LCB0MV9oaWdoLCB0Ml9sb3csIHQyX2hpZ2gsIGNvbmQKKworU2ltaWxhciB0byBzZXRjb25kLCBleGNlcHQgdGhhdCB0aGUgNjQtYml0IHZhbHVlcyBUMSBhbmQgVDIgYXJlCitmb3JtZWQgZnJvbSB0d28gMzItYml0IGFyZ3VtZW50cy4gIFRoZSByZXN1bHQgaXMgYSAzMi1iaXQgdmFsdWUuCisKKyoqKioqKioqKiBRRU1VIHNwZWNpZmljIG9wZXJhdGlvbnMKKworKiBleGl0X3RiIHQwCisKK0V4aXQgdGhlIGN1cnJlbnQgVEIgYW5kIHJldHVybiB0aGUgdmFsdWUgdDAgKHdvcmQgdHlwZSkuCisKKyogZ290b190YiBpbmRleAorCitFeGl0IHRoZSBjdXJyZW50IFRCIGFuZCBqdW1wIHRvIHRoZSBUQiBpbmRleCAnaW5kZXgnIChjb25zdGFudCkgaWYgdGhlCitjdXJyZW50IFRCIHdhcyBsaW5rZWQgdG8gdGhpcyBUQi4gT3RoZXJ3aXNlIGV4ZWN1dGUgdGhlIG5leHQKK2luc3RydWN0aW9ucy4gT25seSBpbmRpY2VzIDAgYW5kIDEgYXJlIHZhbGlkIGFuZCB0Y2dfZ2VuX2dvdG9fdGIgbWF5IGJlIGlzc3VlZAorYXQgbW9zdCBvbmNlIHdpdGggZWFjaCBzbG90IGluZGV4IHBlciBUQi4KKworKiBxZW11X2xkX2kzMi9pNjQgdDAsIHQxLCBmbGFncywgbWVtaWR4CisqIHFlbXVfc3RfaTMyL2k2NCB0MCwgdDEsIGZsYWdzLCBtZW1pZHgKKworTG9hZCBkYXRhIGF0IHRoZSBndWVzdCBhZGRyZXNzIHQxIGludG8gdDAsIG9yIHN0b3JlIGRhdGEgaW4gdDAgYXQgZ3Vlc3QKK2FkZHJlc3MgdDEuICBUaGUgX2kzMi9faTY0IHNpemUgYXBwbGllcyB0byB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQvb3V0cHV0CityZWdpc3RlciB0MCBvbmx5LiAgVGhlIGFkZHJlc3MgdDEgaXMgYWx3YXlzIHNpemVkIGFjY29yZGluZyB0byB0aGUgZ3Vlc3QsCithbmQgdGhlIHdpZHRoIG9mIHRoZSBtZW1vcnkgb3BlcmF0aW9uIGlzIGNvbnRyb2xsZWQgYnkgZmxhZ3MuCisKK0JvdGggdDAgYW5kIHQxIG1heSBiZSBzcGxpdCBpbnRvIGxpdHRsZS1lbmRpYW4gb3JkZXJlZCBwYWlycyBvZiByZWdpc3RlcnMKK2lmIGRlYWxpbmcgd2l0aCA2NC1iaXQgcXVhbnRpdGllcyBvbiBhIDMyLWJpdCBob3N0LgorCitUaGUgbWVtaWR4IHNlbGVjdHMgdGhlIHFlbXUgdGxiIGluZGV4IHRvIHVzZSAoZS5nLiB1c2VyIG9yIGtlcm5lbCBhY2Nlc3MpLgorVGhlIGZsYWdzIGFyZSB0aGUgVENHTWVtT3AgYml0cywgc2VsZWN0aW5nIHRoZSBzaWduLCB3aWR0aCwgYW5kIGVuZGlhbm5lc3MKK29mIHRoZSBtZW1vcnkgYWNjZXNzLgorCitGb3IgYSAzMi1iaXQgaG9zdCwgcWVtdV9sZC9zdF9pNjQgaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIHVzZWQgd2l0aCBhCis2NC1iaXQgbWVtb3J5IGFjY2VzcyBzcGVjaWZpZWQgaW4gZmxhZ3MuCisKKyoqKioqKioqKgorCitOb3RlIDE6IFNvbWUgc2hvcnRjdXRzIGFyZSBkZWZpbmVkIHdoZW4gdGhlIGxhc3Qgb3BlcmFuZCBpcyBrbm93biB0byBiZQorYSBjb25zdGFudCAoZS5nLiBhZGRpIGZvciBhZGQsIG1vdmkgZm9yIG1vdikuCisKK05vdGUgMjogV2hlbiB1c2luZyBUQ0csIHRoZSBvcGNvZGVzIG11c3QgbmV2ZXIgYmUgZ2VuZXJhdGVkIGRpcmVjdGx5CithcyBzb21lIG9mIHRoZW0gbWF5IG5vdCBiZSBhdmFpbGFibGUgYXMgInJlYWwiIG9wY29kZXMuIEFsd2F5cyB1c2UgdGhlCitmdW5jdGlvbiB0Y2dfZ2VuX3h4eChhcmdzKS4KKworNCkgQmFja2VuZAorCit0Y2ctdGFyZ2V0LmggY29udGFpbnMgdGhlIHRhcmdldCBzcGVjaWZpYyBkZWZpbml0aW9ucy4gdGNnLXRhcmdldC5jCitjb250YWlucyB0aGUgdGFyZ2V0IHNwZWNpZmljIGNvZGUuCisKKzQuMSkgQXNzdW1wdGlvbnMKKworVGhlIHRhcmdldCB3b3JkIHNpemUgKFRDR19UQVJHRVRfUkVHX0JJVFMpIGlzIGV4cGVjdGVkIHRvIGJlIDMyIGJpdCBvcgorNjQgYml0LiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBwb2ludGVyIGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSB3b3JkLgorCitPbiBhIDMyIGJpdCB0YXJnZXQsIGFsbCA2NCBiaXQgb3BlcmF0aW9ucyBhcmUgY29udmVydGVkIHRvIDMyIGJpdHMuIEEKK2ZldyBzcGVjaWZpYyBvcGVyYXRpb25zIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gYWxsb3cgaXQgKHNlZSBhZGQyX2kzMiwKK3N1YjJfaTMyLCBicmNvbmQyX2kzMikuCisKK0Zsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyB2ZXJzaW9uLiBBCitwcmV2aW91cyBpbmNhcm5hdGlvbiBvZiB0aGUgY29kZSBnZW5lcmF0b3IgaGFkIGZ1bGwgc3VwcG9ydCBvZiB0aGVtLAorYnV0IGl0IGlzIGJldHRlciB0byBjb25jZW50cmF0ZSBvbiBpbnRlZ2VyIG9wZXJhdGlvbnMgZmlyc3QuCisKK09uIGEgNjQgYml0IHRhcmdldCwgbm8gYXNzdW1wdGlvbiBpcyBtYWRlIGluIFRDRyBhYm91dCB0aGUgc3RvcmFnZSBvZgordGhlIDMyIGJpdCB2YWx1ZXMgaW4gNjQgYml0IHJlZ2lzdGVycy4KKworNC4yKSBDb25zdHJhaW50cworCitHQ0MgbGlrZSBjb25zdHJhaW50cyBhcmUgdXNlZCB0byBkZWZpbmUgdGhlIGNvbnN0cmFpbnRzIG9mIGV2ZXJ5CitpbnN0cnVjdGlvbi4gTWVtb3J5IGNvbnN0cmFpbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMKK3ZlcnNpb24uIEFsaWFzZXMgYXJlIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgb3BlcmFuZHMgYXMgZm9yIEdDQy4KKworVGhlIHNhbWUgcmVnaXN0ZXIgbWF5IGJlIHVzZWQgZm9yIGJvdGggYW4gaW5wdXQgYW5kIGFuIG91dHB1dCwgZXZlbiB3aGVuCit0aGV5IGFyZSBub3QgZXhwbGljaXRseSBhbGlhc2VkLiAgSWYgYW4gb3AgZXhwYW5kcyB0byBtdWx0aXBsZSB0YXJnZXQKK2luc3RydWN0aW9ucyB0aGVuIGNhcmUgbXVzdCBiZSB0YWtlbiB0byBhdm9pZCBjbG9iYmVyaW5nIGlucHV0IHZhbHVlcy4KK0dDQyBzdHlsZSAiZWFybHkgY2xvYmJlciIgb3V0cHV0cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKK0EgdGFyZ2V0IGNhbiBkZWZpbmUgc3BlY2lmaWMgcmVnaXN0ZXIgb3IgY29uc3RhbnQgY29uc3RyYWludHMuIElmIGFuCitvcGVyYXRpb24gdXNlcyBhIGNvbnN0YW50IGlucHV0IGNvbnN0cmFpbnQgd2hpY2ggZG9lcyBub3QgYWxsb3cgYWxsCitjb25zdGFudHMsIGl0IG11c3QgYWxzbyBhY2NlcHQgcmVnaXN0ZXJzIGluIG9yZGVyIHRvIGhhdmUgYSBmYWxsYmFjay4KKworVGhlIG1vdmlfaTMyIGFuZCBtb3ZpX2k2NCBvcGVyYXRpb25zIG11c3QgYWNjZXB0IGFueSBjb25zdGFudHMuCisKK1RoZSBtb3ZfaTMyIGFuZCBtb3ZfaTY0IG9wZXJhdGlvbnMgbXVzdCBhY2NlcHQgYW55IHJlZ2lzdGVycyBvZiB0aGUKK3NhbWUgdHlwZS4KKworVGhlIGxkL3N0IGluc3RydWN0aW9ucyBtdXN0IGFjY2VwdCBzaWduZWQgMzIgYml0IGNvbnN0YW50IG9mZnNldHMuIEl0CitjYW4gYmUgaW1wbGVtZW50ZWQgYnkgcmVzZXJ2aW5nIGEgc3BlY2lmaWMgcmVnaXN0ZXIgdG8gY29tcHV0ZSB0aGUKK2FkZHJlc3MgaWYgdGhlIG9mZnNldCBpcyB0b28gYmlnLgorCitUaGUgbGQvc3QgaW5zdHJ1Y3Rpb25zIG11c3QgYWNjZXB0IGFueSBkZXN0aW5hdGlvbiAobGQpIG9yIHNvdXJjZSAoc3QpCityZWdpc3Rlci4KKworNC4zKSBGdW5jdGlvbiBjYWxsIGFzc3VtcHRpb25zCisKKy0gVGhlIG9ubHkgc3VwcG9ydGVkIHR5cGVzIGZvciBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUgYXJlOiAzMiBhbmQKKyAgNjQgYml0IGludGVnZXJzIGFuZCBwb2ludGVyLgorLSBUaGUgc3RhY2sgZ3Jvd3MgZG93bndhcmRzLgorLSBUaGUgZmlyc3QgTiBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgaW4gcmVnaXN0ZXJzLgorLSBUaGUgbmV4dCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgb24gdGhlIHN0YWNrIGJ5IHN0b3JpbmcgdGhlbSBhcyB3b3Jkcy4KKy0gU29tZSByZWdpc3RlcnMgYXJlIGNsb2JiZXJlZCBkdXJpbmcgdGhlIGNhbGwuIAorLSBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiAwIG9yIDEgdmFsdWUgaW4gcmVnaXN0ZXJzLiBPbiBhIDMyIGJpdAorICB0YXJnZXQsIGZ1bmN0aW9ucyBtdXN0IGJlIGFibGUgdG8gcmV0dXJuIDIgdmFsdWVzIGluIHJlZ2lzdGVycyBmb3IKKyAgNjQgYml0IHJldHVybiB0eXBlLgorCis1KSBSZWNvbW1lbmRlZCBjb2RpbmcgcnVsZXMgZm9yIGJlc3QgcGVyZm9ybWFuY2UKKworLSBVc2UgZ2xvYmFscyB0byByZXByZXNlbnQgdGhlIHBhcnRzIG9mIHRoZSBRRU1VIENQVSBzdGF0ZSB3aGljaCBhcmUKKyAgb2Z0ZW4gbW9kaWZpZWQsIGUuZy4gdGhlIGludGVnZXIgcmVnaXN0ZXJzIGFuZCB0aGUgY29uZGl0aW9uCisgIGNvZGVzLiBUQ0cgd2lsbCBiZSBhYmxlIHRvIHVzZSBob3N0IHJlZ2lzdGVycyB0byBzdG9yZSB0aGVtLgorCistIEF2b2lkIGdsb2JhbHMgc3RvcmVkIGluIGZpeGVkIHJlZ2lzdGVycy4gVGhleSBtdXN0IGJlIHVzZWQgb25seSB0bworICBzdG9yZSB0aGUgcG9pbnRlciB0byB0aGUgQ1BVIHN0YXRlIGFuZCBwb3NzaWJseSB0byBzdG9yZSBhIHBvaW50ZXIKKyAgdG8gYSByZWdpc3RlciB3aW5kb3cuCisKKy0gVXNlIHRlbXBvcmFyaWVzLiBVc2UgbG9jYWwgdGVtcG9yYXJpZXMgb25seSB3aGVuIHJlYWxseSBuZWVkZWQsCisgIGUuZy4gd2hlbiB5b3UgbmVlZCB0byB1c2UgYSB2YWx1ZSBhZnRlciBhIGp1bXAuIExvY2FsIHRlbXBvcmFyaWVzCisgIGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIGhpdCBpbiB0aGUgY3VycmVudCBUQ0cgaW1wbGVtZW50YXRpb246IHRoZWlyCisgIGNvbnRlbnQgaXMgc2F2ZWQgdG8gbWVtb3J5IGF0IGVuZCBvZiBlYWNoIGJhc2ljIGJsb2NrLgorCistIEZyZWUgdGVtcG9yYXJpZXMgYW5kIGxvY2FsIHRlbXBvcmFyaWVzIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIHVzZWQKKyAgKHRjZ190ZW1wX2ZyZWUpLiBTaW5jZSB0Y2dfY29uc3RfeCgpIGFsc28gY3JlYXRlcyBhIHRlbXBvcmFyeSwgeW91CisgIHNob3VsZCBmcmVlIGl0IGFmdGVyIGl0IGlzIHVzZWQuIEZyZWVpbmcgdGVtcG9yYXJpZXMgZG9lcyBub3QgeWllbGQKKyAgYSBiZXR0ZXIgZ2VuZXJhdGVkIGNvZGUsIGJ1dCBpdCByZWR1Y2VzIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgVENHIGFuZAorICB0aGUgc3BlZWQgb2YgdGhlIHRyYW5zbGF0aW9uLgorCistIERvbid0IGhlc2l0YXRlIHRvIHVzZSBoZWxwZXJzIGZvciBjb21wbGljYXRlZCBvciBzZWxkb20gdXNlZCBndWVzdAorICBpbnN0cnVjdGlvbnMuIFRoZXJlIGlzIGxpdHRsZSBwZXJmb3JtYW5jZSBhZHZhbnRhZ2UgaW4gdXNpbmcgVENHIHRvCisgIGltcGxlbWVudCBndWVzdCBpbnN0cnVjdGlvbnMgdGFraW5nIG1vcmUgdGhhbiBhYm91dCB0d2VudHkgVENHCisgIGluc3RydWN0aW9ucy4gTm90ZSB0aGF0IHRoaXMgcnVsZSBvZiB0aHVtYiBpcyBtb3JlIGFwcGxpY2FibGUgdG8KKyAgaGVscGVycyBkb2luZyBjb21wbGV4IGxvZ2ljIG9yIGFyaXRobWV0aWMsIHdoZXJlIHRoZSBDIGNvbXBpbGVyIGhhcworICBzY29wZSB0byBkbyBhIGdvb2Qgam9iIG9mIG9wdGltaXNhdGlvbjsgaXQgaXMgbGVzcyByZWxldmFudCB3aGVyZQorICB0aGUgaW5zdHJ1Y3Rpb24gaXMgbW9zdGx5IGRvaW5nIGxvYWRzIGFuZCBzdG9yZXMsIGFuZCBpbiB0aG9zZSBjYXNlcworICBpbmxpbmUgVENHIG1heSBzdGlsbCBiZSBmYXN0ZXIgZm9yIGxvbmdlciBzZXF1ZW5jZXMuCisKKy0gVGhlIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBUQ0cgaW5zdHJ1Y3Rpb25zIHlvdSBjYW4gZ2VuZXJhdGUKKyAgcGVyIGd1ZXN0IGluc3RydWN0aW9uIGlzIHNldCBieSBNQVhfT1BfUEVSX0lOU1RSIGluIGV4ZWMtYWxsLmggLS0KKyAgeW91IGNhbm5vdCBleGNlZWQgdGhpcyB3aXRob3V0IHJpc2tpbmcgYSBidWZmZXIgb3ZlcnJ1bi4KKworLSBVc2UgdGhlICdkaXNjYXJkJyBpbnN0cnVjdGlvbiBpZiB5b3Uga25vdyB0aGF0IFRDRyB3b24ndCBiZSBhYmxlIHRvCisgIHByb3ZlIHRoYXQgYSBnaXZlbiBnbG9iYWwgaXMgImRlYWQiIGF0IGEgZ2l2ZW4gcHJvZ3JhbSBwb2ludC4gVGhlCisgIHg4NiBndWVzdCB1c2VzIGl0IHRvIGltcHJvdmUgdGhlIGNvbmRpdGlvbiBjb2RlcyBvcHRpbWlzYXRpb24uCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy9UT0RPIGIvYW5kcm9pZC9xZW11MS90Y2cvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzQ3ODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvVE9ETwpAQCAtMCwwICsxLDE0IEBACistIEFkZCBuZXcgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXM6IGNseiwgY3R6LCBwb3BjbnQuCisKKy0gU2VlIGlmIGl0IGlzIHdvcnRoIGV4cG9ydGluZyBtdWwyLCBtdWx1MiwgZGl2MiwgZGl2dTIuIAorCistIFN1cHBvcnQgb2YgZ2xvYmFscyBzYXZlZCBpbiBmaXhlZCByZWdpc3RlcnMgYmV0d2VlbiBUQnMuCisKK0lkZWFzOgorCistIE1vdmUgdGhlIHNsb3cgcGFydCBvZiB0aGUgcWVtdV9sZC9zdCBvcHMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgVEIuCisKKy0gQ2hhbmdlIGV4Y2VwdGlvbiBzeW50YXggdG8gZ2V0IGNsb3NlciB0byBRT1Agc3lzdGVtIChleGNlcHRpb24KKyAgcGFyYW1ldGVycyBnaXZlbiB3aXRoIGEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24pLgorCistIEFkZCBmbG9hdCBhbmQgdmVjdG9yIHN1cHBvcnQuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy9pMzg2L3RjZy10YXJnZXQuYyBiL2FuZHJvaWQvcWVtdTEvdGNnL2kzODYvdGNnLXRhcmdldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZmNkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RjZy9pMzg2L3RjZy10YXJnZXQuYwpAQCAtMCwwICsxLDI0MzkgQEAKKy8qCisgKiBUaW55IENvZGUgR2VuZXJhdG9yIGZvciBRRU1VCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAidGNnLWJlLWxkc3QuaCIKKworI2lmZGVmIF9XSU4zMgorLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgTWluZ3czMiBoZWFkZXJzIGRlZmluZSB0aGUgJ3NtYWxsJyBtYWNybyB3aGljaAorLy8gcHJldmVudHMgdGhpcyBzb3VyY2UgZnJvbSBjb21waWxpbmcuCisjdW5kZWYgc21hbGwKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0Y2dfdGFyZ2V0X3JlZ19uYW1lc1tUQ0dfVEFSR0VUX05CX1JFR1NdID0geworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICAiJXJheCIsICIlcmN4IiwgIiVyZHgiLCAiJXJieCIsICIlcnNwIiwgIiVyYnAiLCAiJXJzaSIsICIlcmRpIiwKKyAgICAiJXI4IiwgICIlcjkiLCAgIiVyMTAiLCAiJXIxMSIsICIlcjEyIiwgIiVyMTMiLCAiJXIxNCIsICIlcjE1IiwKKyNlbHNlCisgICAgIiVlYXgiLCAiJWVjeCIsICIlZWR4IiwgIiVlYngiLCAiJWVzcCIsICIlZWJwIiwgIiVlc2kiLCAiJWVkaSIsCisjZW5kaWYKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGludCB0Y2dfdGFyZ2V0X3JlZ19hbGxvY19vcmRlcltdID0geworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBUQ0dfUkVHX1JCUCwKKyAgICBUQ0dfUkVHX1JCWCwKKyAgICBUQ0dfUkVHX1IxMiwKKyAgICBUQ0dfUkVHX1IxMywKKyAgICBUQ0dfUkVHX1IxNCwKKyAgICBUQ0dfUkVHX1IxNSwKKyAgICBUQ0dfUkVHX1IxMCwKKyAgICBUQ0dfUkVHX1IxMSwKKyAgICBUQ0dfUkVHX1I5LAorICAgIFRDR19SRUdfUjgsCisgICAgVENHX1JFR19SQ1gsCisgICAgVENHX1JFR19SRFgsCisgICAgVENHX1JFR19SU0ksCisgICAgVENHX1JFR19SREksCisgICAgVENHX1JFR19SQVgsCisjZWxzZQorICAgIFRDR19SRUdfRUJYLAorICAgIFRDR19SRUdfRVNJLAorICAgIFRDR19SRUdfRURJLAorICAgIFRDR19SRUdfRUJQLAorICAgIFRDR19SRUdfRUNYLAorICAgIFRDR19SRUdfRURYLAorICAgIFRDR19SRUdfRUFYLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaW50IHRjZ190YXJnZXRfY2FsbF9pYXJnX3JlZ3NbXSA9IHsKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0CisjaWYgZGVmaW5lZChfV0lONjQpCisgICAgVENHX1JFR19SQ1gsCisgICAgVENHX1JFR19SRFgsCisjZWxzZQorICAgIFRDR19SRUdfUkRJLAorICAgIFRDR19SRUdfUlNJLAorICAgIFRDR19SRUdfUkRYLAorICAgIFRDR19SRUdfUkNYLAorI2VuZGlmCisgICAgVENHX1JFR19SOCwKKyAgICBUQ0dfUkVHX1I5LAorI2Vsc2UKKyAgICAvKiAzMiBiaXQgbW9kZSB1c2VzIHN0YWNrIGJhc2VkIGNhbGxpbmcgY29udmVudGlvbiAoR0NDIGRlZmF1bHQpLiAqLworI2VuZGlmCit9OworCitzdGF0aWMgY29uc3QgaW50IHRjZ190YXJnZXRfY2FsbF9vYXJnX3JlZ3NbXSA9IHsKKyAgICBUQ0dfUkVHX0VBWCwKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisgICAgVENHX1JFR19FRFgKKyNlbmRpZgorfTsKKworLyogQ29uc3RhbnRzIHdlIGFjY2VwdC4gICovCisjZGVmaW5lIFRDR19DVF9DT05TVF9TMzIgMHgxMDAKKyNkZWZpbmUgVENHX0NUX0NPTlNUX1UzMiAweDIwMAorI2RlZmluZSBUQ0dfQ1RfQ09OU1RfSTMyIDB4NDAwCisvKiBSZWdpc3RlcnMgdXNlZCB3aXRoIEwgY29uc3RyYWludCwgd2hpY2ggYXJlIHRoZSBmaXJzdCBhcmd1bWVudCAKKyAgIHJlZ2lzdGVycyBvbiB4ODZfNjQsIGFuZCB0d28gcmFuZG9tIGNhbGwgY2xvYmJlcmVkIHJlZ2lzdGVycyBvbgorICAgaTM4Ni4gKi8KKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0CisjIGRlZmluZSBUQ0dfUkVHX0wwIHRjZ190YXJnZXRfY2FsbF9pYXJnX3JlZ3NbMF0KKyMgZGVmaW5lIFRDR19SRUdfTDEgdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1sxXQorI2Vsc2UKKyMgZGVmaW5lIFRDR19SRUdfTDAgVENHX1JFR19FQVgKKyMgZGVmaW5lIFRDR19SRUdfTDEgVENHX1JFR19FRFgKKyNlbmRpZgorCisvKiBUaGUgaG9zdCBjb21waWxlciBzaG91bGQgc3VwcGx5IDxjcHVpZC5oPiB0byBlbmFibGUgcnVudGltZSBmZWF0dXJlcworICAgZGV0ZWN0aW9uLCBhcyB3ZSdyZSBub3QgZ29pbmcgdG8gZ28gc28gZmFyIGFzIG91ciBvd24gaW5saW5lIGFzc2VtYmx5LgorICAgSWYgbm90IGF2YWlsYWJsZSwgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSBhc3N1bWVkLiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVJRF9IKQorI2luY2x1ZGUgPGNwdWlkLmg+CisjZW5kaWYKKworLyogRm9yIDMyLWJpdCwgd2UgYXJlIGdvaW5nIHRvIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGF0IHJ1bnRpbWUgd2hldGhlciBjbW92CisgICBpcyBhdmFpbGFibGUuICAqLworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyMgZGVmaW5lIGhhdmVfY21vdiAxCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVJRF9IKSAmJiBkZWZpbmVkKGJpdF9DTU9WKQorc3RhdGljIGJvb2wgaGF2ZV9jbW92OworI2Vsc2UKKyMgZGVmaW5lIGhhdmVfY21vdiAwCisjZW5kaWYKKworLyogSWYgYml0X01PVkJFIGlzIGRlZmluZWQgaW4gY3B1aWQuaCAoYWRkZWQgaW4gR0NDIHZlcnNpb24gNC42KSwgd2UgYXJlCisgICBnb2luZyB0byBhdHRlbXB0IHRvIGRldGVybWluZSBhdCBydW50aW1lIHdoZXRoZXIgbW92YmUgaXMgYXZhaWxhYmxlLiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVJRF9IKSAmJiBkZWZpbmVkKGJpdF9NT1ZCRSkKK3N0YXRpYyBib29sIGhhdmVfbW92YmU7CisjZWxzZQorIyBkZWZpbmUgaGF2ZV9tb3ZiZSAwCisjZW5kaWYKKworLyogV2UgbmVlZCB0aGlzIHN5bWJvbCBpbiB0Y2ctdGFyZ2V0LmgsIGFuZCB3ZSBjYW4ndCBwcm9wZXJseSBjb25kaXRpb25hbGl6ZQorICAgaXQgdGhlcmUuICBUaGVyZWZvcmUgd2UgYWx3YXlzIGRlZmluZSB0aGUgdmFyaWFibGUuICAqLworYm9vbCBoYXZlX2JtaTE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVJRF9IKSAmJiBkZWZpbmVkKGJpdF9CTUkyKQorc3RhdGljIGJvb2wgaGF2ZV9ibWkyOworI2Vsc2UKKyMgZGVmaW5lIGhhdmVfYm1pMiAwCisjZW5kaWYKKworc3RhdGljIHVpbnQ4X3QgKnRiX3JldF9hZGRyOworCitzdGF0aWMgdm9pZCBwYXRjaF9yZWxvYyh1aW50OF90ICpjb2RlX3B0ciwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB2YWx1ZSwgaW50cHRyX3QgYWRkZW5kKQoreworICAgIHZhbHVlICs9IGFkZGVuZDsKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgUl8zODZfUEMzMjoKKyAgICAgICAgdmFsdWUgLT0gKHVpbnRwdHJfdCljb2RlX3B0cjsKKyAgICAgICAgaWYgKHZhbHVlICE9IChpbnQzMl90KXZhbHVlKSB7CisgICAgICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICAqKHVpbnQzMl90ICopY29kZV9wdHIgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSXzM4Nl9QQzg6CisgICAgICAgIHZhbHVlIC09ICh1aW50cHRyX3QpY29kZV9wdHI7CisgICAgICAgIGlmICh2YWx1ZSAhPSAoaW50OF90KXZhbHVlKSB7CisgICAgICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICAqKHVpbnQ4X3QgKiljb2RlX3B0ciA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICB9Cit9CisKKy8qIHBhcnNlIHRhcmdldCBzcGVjaWZpYyBjb25zdHJhaW50cyAqLworc3RhdGljIGludCB0YXJnZXRfcGFyc2VfY29uc3RyYWludChUQ0dBcmdDb25zdHJhaW50ICpjdCwgY29uc3QgY2hhciAqKnBjdF9zdHIpCit7CisgICAgY29uc3QgY2hhciAqY3Rfc3RyOworCisgICAgY3Rfc3RyID0gKnBjdF9zdHI7CisgICAgc3dpdGNoKGN0X3N0clswXSkgeworICAgIGNhc2UgJ2EnOgorICAgICAgICBjdC0+Y3QgfD0gVENHX0NUX1JFRzsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKGN0LT51LnJlZ3MsIFRDR19SRUdfRUFYKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYic6CisgICAgICAgIGN0LT5jdCB8PSBUQ0dfQ1RfUkVHOworICAgICAgICB0Y2dfcmVnc2V0X3NldF9yZWcoY3QtPnUucmVncywgVENHX1JFR19FQlgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdjJzoKKyAgICBjYXNlX2M6CisgICAgICAgIGN0LT5jdCB8PSBUQ0dfQ1RfUkVHOworICAgICAgICB0Y2dfcmVnc2V0X3NldF9yZWcoY3QtPnUucmVncywgVENHX1JFR19FQ1gpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzoKKyAgICAgICAgY3QtPmN0IHw9IFRDR19DVF9SRUc7CisgICAgICAgIHRjZ19yZWdzZXRfc2V0X3JlZyhjdC0+dS5yZWdzLCBUQ0dfUkVHX0VEWCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1MnOgorICAgICAgICBjdC0+Y3QgfD0gVENHX0NUX1JFRzsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKGN0LT51LnJlZ3MsIFRDR19SRUdfRVNJKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnRCc6CisgICAgICAgIGN0LT5jdCB8PSBUQ0dfQ1RfUkVHOworICAgICAgICB0Y2dfcmVnc2V0X3NldF9yZWcoY3QtPnUucmVncywgVENHX1JFR19FREkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdxJzoKKyAgICAgICAgY3QtPmN0IHw9IFRDR19DVF9SRUc7CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4ZmZmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4Zik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnUSc6CisgICAgICAgIGN0LT5jdCB8PSBUQ0dfQ1RfUkVHOworICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4Zik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3InOgorICAgIGNhc2VfcjoKKyAgICAgICAgY3QtPmN0IHw9IFRDR19DVF9SRUc7CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4ZmZmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4ZmYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ0MnOgorICAgICAgICAvKiBXaXRoIFNIUlggZXQgYWwsIHdlIG5lZWQgbm90IHVzZSBFQ1ggYXMgc2hpZnQgY291bnQgcmVnaXN0ZXIuICAqLworICAgICAgICBpZiAoaGF2ZV9ibWkyKSB7CisgICAgICAgICAgICBnb3RvIGNhc2VfcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gY2FzZV9jOworICAgICAgICB9CisKKyAgICAgICAgLyogcWVtdV9sZC9zdCBhZGRyZXNzIGNvbnN0cmFpbnQgKi8KKyAgICBjYXNlICdMJzoKKyAgICAgICAgY3QtPmN0IHw9IFRDR19DVF9SRUc7CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4ZmZmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKGN0LT51LnJlZ3MsIDAsIDB4ZmYpOworICAgICAgICB9CisgICAgICAgIHRjZ19yZWdzZXRfcmVzZXRfcmVnKGN0LT51LnJlZ3MsIFRDR19SRUdfTDApOworICAgICAgICB0Y2dfcmVnc2V0X3Jlc2V0X3JlZyhjdC0+dS5yZWdzLCBUQ0dfUkVHX0wxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdlJzoKKyAgICAgICAgY3QtPmN0IHw9IFRDR19DVF9DT05TVF9TMzI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ1onOgorICAgICAgICBjdC0+Y3QgfD0gVENHX0NUX0NPTlNUX1UzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnSSc6CisgICAgICAgIGN0LT5jdCB8PSBUQ0dfQ1RfQ09OU1RfSTMyOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY3Rfc3RyKys7CisgICAgKnBjdF9zdHIgPSBjdF9zdHI7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHRlc3QgaWYgYSBjb25zdGFudCBtYXRjaGVzIHRoZSBjb25zdHJhaW50ICovCitzdGF0aWMgaW5saW5lIGludCB0Y2dfdGFyZ2V0X2NvbnN0X21hdGNoKHRjZ190YXJnZXRfbG9uZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRDR0FyZ0NvbnN0cmFpbnQgKmFyZ19jdCkKK3sKKyAgICBpbnQgY3QgPSBhcmdfY3QtPmN0OworICAgIGlmIChjdCAmIFRDR19DVF9DT05TVCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKChjdCAmIFRDR19DVF9DT05TVF9TMzIpICYmIHZhbCA9PSAoaW50MzJfdCl2YWwpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICgoY3QgJiBUQ0dfQ1RfQ09OU1RfVTMyKSAmJiB2YWwgPT0gKHVpbnQzMl90KXZhbCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKChjdCAmIFRDR19DVF9DT05TVF9JMzIpICYmIH52YWwgPT0gKGludDMyX3QpfnZhbCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0CisjIGRlZmluZSBMT1dSRUdNQVNLKHgpCSgoeCkgJiA3KQorI2Vsc2UKKyMgZGVmaW5lIExPV1JFR01BU0soeCkJKHgpCisjZW5kaWYKKworI2RlZmluZSBQX0VYVAkJMHgxMDAJCS8qIDB4MGYgb3Bjb2RlIHByZWZpeCAqLworI2RlZmluZSBQX0VYVDM4ICAgICAgICAgMHgyMDAgICAgICAgICAgIC8qIDB4MGYgMHgzOCBvcGNvZGUgcHJlZml4ICovCisjZGVmaW5lIFBfREFUQTE2ICAgICAgICAweDQwMCAgICAgICAgICAgLyogMHg2NiBvcGNvZGUgcHJlZml4ICovCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorIyBkZWZpbmUgUF9BRERSMzIgICAgICAgMHg4MDAgICAgICAgICAgIC8qIDB4Njcgb3Bjb2RlIHByZWZpeCAqLworIyBkZWZpbmUgUF9SRVhXICAgICAgICAgMHgxMDAwICAgICAgICAgIC8qIFNldCBSRVguVyA9IDEgKi8KKyMgZGVmaW5lIFBfUkVYQl9SICAgICAgIDB4MjAwMCAgICAgICAgICAvKiBSRUcgZmllbGQgYXMgYnl0ZSByZWdpc3RlciAqLworIyBkZWZpbmUgUF9SRVhCX1JNICAgICAgMHg0MDAwICAgICAgICAgIC8qIFIvTSBmaWVsZCBhcyBieXRlIHJlZ2lzdGVyICovCisjIGRlZmluZSBQX0dTICAgICAgICAgICAweDgwMDAgICAgICAgICAgLyogZ3Mgc2VnbWVudCBvdmVycmlkZSAqLworI2Vsc2UKKyMgZGVmaW5lIFBfQUREUjMyCTAKKyMgZGVmaW5lIFBfUkVYVwkJMAorIyBkZWZpbmUgUF9SRVhCX1IJMAorIyBkZWZpbmUgUF9SRVhCX1JNCTAKKyMgZGVmaW5lIFBfR1MgICAgICAgICAgIDAKKyNlbmRpZgorI2RlZmluZSBQX1NJTURGMyAgICAgICAgMHgxMDAwMCAgICAgICAgIC8qIDB4ZjMgb3Bjb2RlIHByZWZpeCAqLworI2RlZmluZSBQX1NJTURGMiAgICAgICAgMHgyMDAwMCAgICAgICAgIC8qIDB4ZjIgb3Bjb2RlIHByZWZpeCAqLworCisjZGVmaW5lIE9QQ19BUklUSF9Fdkl6CSgweDgxKQorI2RlZmluZSBPUENfQVJJVEhfRXZJYgkoMHg4MykKKyNkZWZpbmUgT1BDX0FSSVRIX0d2RXYJKDB4MDMpCQkvKiAuLi4gcGx1cyAoQVJJVEhfRk9PIDw8IDMpICovCisjZGVmaW5lIE9QQ19BTkROICAgICAgICAoMHhmMiB8IFBfRVhUMzgpCisjZGVmaW5lIE9QQ19BRERfR3ZFdgkoT1BDX0FSSVRIX0d2RXYgfCAoQVJJVEhfQUREIDw8IDMpKQorI2RlZmluZSBPUENfQlNXQVAJKDB4YzggfCBQX0VYVCkKKyNkZWZpbmUgT1BDX0NBTExfSnoJKDB4ZTgpCisjZGVmaW5lIE9QQ19DTU9WQ0MgICAgICAoMHg0MCB8IFBfRVhUKSAgLyogLi4uIHBsdXMgY29uZGl0aW9uIGNvZGUgKi8KKyNkZWZpbmUgT1BDX0NNUF9HdkV2CShPUENfQVJJVEhfR3ZFdiB8IChBUklUSF9DTVAgPDwgMykpCisjZGVmaW5lIE9QQ19ERUNfcjMyCSgweDQ4KQorI2RlZmluZSBPUENfSU1VTF9HdkV2CSgweGFmIHwgUF9FWFQpCisjZGVmaW5lIE9QQ19JTVVMX0d2RXZJYgkoMHg2YikKKyNkZWZpbmUgT1BDX0lNVUxfR3ZFdkl6CSgweDY5KQorI2RlZmluZSBPUENfSU5DX3IzMgkoMHg0MCkKKyNkZWZpbmUgT1BDX0pDQ19sb25nCSgweDgwIHwgUF9FWFQpCS8qIC4uLiBwbHVzIGNvbmRpdGlvbiBjb2RlICovCisjZGVmaW5lIE9QQ19KQ0Nfc2hvcnQJKDB4NzApCQkvKiAuLi4gcGx1cyBjb25kaXRpb24gY29kZSAqLworI2RlZmluZSBPUENfSk1QX2xvbmcJKDB4ZTkpCisjZGVmaW5lIE9QQ19KTVBfc2hvcnQJKDB4ZWIpCisjZGVmaW5lIE9QQ19MRUEgICAgICAgICAoMHg4ZCkKKyNkZWZpbmUgT1BDX01PVkJfRXZHdgkoMHg4OCkJCS8qIHN0b3JlcywgbW9yZSBvciBsZXNzICovCisjZGVmaW5lIE9QQ19NT1ZMX0V2R3YJKDB4ODkpCQkvKiBzdG9yZXMsIG1vcmUgb3IgbGVzcyAqLworI2RlZmluZSBPUENfTU9WTF9HdkV2CSgweDhiKQkJLyogbG9hZHMsIG1vcmUgb3IgbGVzcyAqLworI2RlZmluZSBPUENfTU9WQl9Fdkl6ICAgKDB4YzYpCisjZGVmaW5lIE9QQ19NT1ZMX0V2SXoJKDB4YzcpCisjZGVmaW5lIE9QQ19NT1ZMX0l2ICAgICAoMHhiOCkKKyNkZWZpbmUgT1BDX01PVkJFX0d5TXkgICgweGYwIHwgUF9FWFQzOCkKKyNkZWZpbmUgT1BDX01PVkJFX015R3kgICgweGYxIHwgUF9FWFQzOCkKKyNkZWZpbmUgT1BDX01PVlNCTAkoMHhiZSB8IFBfRVhUKQorI2RlZmluZSBPUENfTU9WU1dMCSgweGJmIHwgUF9FWFQpCisjZGVmaW5lIE9QQ19NT1ZTTFEJKDB4NjMgfCBQX1JFWFcpCisjZGVmaW5lIE9QQ19NT1ZaQkwJKDB4YjYgfCBQX0VYVCkKKyNkZWZpbmUgT1BDX01PVlpXTAkoMHhiNyB8IFBfRVhUKQorI2RlZmluZSBPUENfUE9QX3IzMgkoMHg1OCkKKyNkZWZpbmUgT1BDX1BVU0hfcjMyCSgweDUwKQorI2RlZmluZSBPUENfUFVTSF9JdgkoMHg2OCkKKyNkZWZpbmUgT1BDX1BVU0hfSWIJKDB4NmEpCisjZGVmaW5lIE9QQ19SRVQJCSgweGMzKQorI2RlZmluZSBPUENfU0VUQ0MJKDB4OTAgfCBQX0VYVCB8IFBfUkVYQl9STSkgLyogLi4uIHBsdXMgY2MgKi8KKyNkZWZpbmUgT1BDX1NISUZUXzEJKDB4ZDEpCisjZGVmaW5lIE9QQ19TSElGVF9JYgkoMHhjMSkKKyNkZWZpbmUgT1BDX1NISUZUX2NsCSgweGQzKQorI2RlZmluZSBPUENfU0FSWCAgICAgICAgKDB4ZjcgfCBQX0VYVDM4IHwgUF9TSU1ERjMpCisjZGVmaW5lIE9QQ19TSExYICAgICAgICAoMHhmNyB8IFBfRVhUMzggfCBQX0RBVEExNikKKyNkZWZpbmUgT1BDX1NIUlggICAgICAgICgweGY3IHwgUF9FWFQzOCB8IFBfU0lNREYyKQorI2RlZmluZSBPUENfVEVTVEwJKDB4ODUpCisjZGVmaW5lIE9QQ19YQ0hHX2F4X3IzMgkoMHg5MCkKKworI2RlZmluZSBPUENfR1JQM19FdgkoMHhmNykKKyNkZWZpbmUgT1BDX0dSUDUJKDB4ZmYpCisKKy8qIEdyb3VwIDEgb3Bjb2RlIGV4dGVuc2lvbnMgZm9yIDB4ODAtMHg4My4KKyAgIFRoZXNlIGFyZSBhbHNvIHVzZWQgYXMgbW9kaWZpZXJzIGZvciBPUENfQVJJVEguICAqLworI2RlZmluZSBBUklUSF9BREQgMAorI2RlZmluZSBBUklUSF9PUiAgMQorI2RlZmluZSBBUklUSF9BREMgMgorI2RlZmluZSBBUklUSF9TQkIgMworI2RlZmluZSBBUklUSF9BTkQgNAorI2RlZmluZSBBUklUSF9TVUIgNQorI2RlZmluZSBBUklUSF9YT1IgNgorI2RlZmluZSBBUklUSF9DTVAgNworCisvKiBHcm91cCAyIG9wY29kZSBleHRlbnNpb25zIGZvciAweGMwLCAweGMxLCAweGQwLTB4ZDMuICAqLworI2RlZmluZSBTSElGVF9ST0wgMAorI2RlZmluZSBTSElGVF9ST1IgMQorI2RlZmluZSBTSElGVF9TSEwgNAorI2RlZmluZSBTSElGVF9TSFIgNQorI2RlZmluZSBTSElGVF9TQVIgNworCisvKiBHcm91cCAzIG9wY29kZSBleHRlbnNpb25zIGZvciAweGY2LCAweGY3LiAgVG8gYmUgdXNlZCB3aXRoIE9QQ19HUlAzLiAgKi8KKyNkZWZpbmUgRVhUM19OT1QgICAyCisjZGVmaW5lIEVYVDNfTkVHICAgMworI2RlZmluZSBFWFQzX01VTCAgIDQKKyNkZWZpbmUgRVhUM19JTVVMICA1CisjZGVmaW5lIEVYVDNfRElWICAgNgorI2RlZmluZSBFWFQzX0lESVYgIDcKKworLyogR3JvdXAgNSBvcGNvZGUgZXh0ZW5zaW9ucyBmb3IgMHhmZi4gIFRvIGJlIHVzZWQgd2l0aCBPUENfR1JQNS4gICovCisjZGVmaW5lIEVYVDVfSU5DX0V2CTAKKyNkZWZpbmUgRVhUNV9ERUNfRXYJMQorI2RlZmluZSBFWFQ1X0NBTExOX0V2CTIKKyNkZWZpbmUgRVhUNV9KTVBOX0V2CTQKKworLyogQ29uZGl0aW9uIGNvZGVzIHRvIGJlIGFkZGVkIHRvIE9QQ19KQ0Nfe2xvbmcsc2hvcnR9LiAgKi8KKyNkZWZpbmUgSkNDX0pNUCAoLTEpCisjZGVmaW5lIEpDQ19KTyAgMHgwCisjZGVmaW5lIEpDQ19KTk8gMHgxCisjZGVmaW5lIEpDQ19KQiAgMHgyCisjZGVmaW5lIEpDQ19KQUUgMHgzCisjZGVmaW5lIEpDQ19KRSAgMHg0CisjZGVmaW5lIEpDQ19KTkUgMHg1CisjZGVmaW5lIEpDQ19KQkUgMHg2CisjZGVmaW5lIEpDQ19KQSAgMHg3CisjZGVmaW5lIEpDQ19KUyAgMHg4CisjZGVmaW5lIEpDQ19KTlMgMHg5CisjZGVmaW5lIEpDQ19KUCAgMHhhCisjZGVmaW5lIEpDQ19KTlAgMHhiCisjZGVmaW5lIEpDQ19KTCAgMHhjCisjZGVmaW5lIEpDQ19KR0UgMHhkCisjZGVmaW5lIEpDQ19KTEUgMHhlCisjZGVmaW5lIEpDQ19KRyAgMHhmCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRjZ19jb25kX3RvX2pjY1tdID0geworICAgIFtUQ0dfQ09ORF9FUV0gPSBKQ0NfSkUsCisgICAgW1RDR19DT05EX05FXSA9IEpDQ19KTkUsCisgICAgW1RDR19DT05EX0xUXSA9IEpDQ19KTCwKKyAgICBbVENHX0NPTkRfR0VdID0gSkNDX0pHRSwKKyAgICBbVENHX0NPTkRfTEVdID0gSkNDX0pMRSwKKyAgICBbVENHX0NPTkRfR1RdID0gSkNDX0pHLAorICAgIFtUQ0dfQ09ORF9MVFVdID0gSkNDX0pCLAorICAgIFtUQ0dfQ09ORF9HRVVdID0gSkNDX0pBRSwKKyAgICBbVENHX0NPTkRfTEVVXSA9IEpDQ19KQkUsCisgICAgW1RDR19DT05EX0dUVV0gPSBKQ0NfSkEsCit9OworCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorc3RhdGljIHZvaWQgdGNnX291dF9vcGMoVENHQ29udGV4dCAqcywgaW50IG9wYywgaW50IHIsIGludCBybSwgaW50IHgpCit7CisgICAgaW50IHJleDsKKworICAgIGlmIChvcGMgJiBQX0dTKSB7CisgICAgICAgIHRjZ19vdXQ4KHMsIDB4NjUpOworICAgIH0KKyAgICBpZiAob3BjICYgUF9EQVRBMTYpIHsKKyAgICAgICAgLyogV2Ugc2hvdWxkIG5ldmVyIGJlIGFza2luZyBmb3IgYm90aCAxNiBhbmQgNjQtYml0IG9wZXJhdGlvbi4gICovCisgICAgICAgIGFzc2VydCgob3BjICYgUF9SRVhXKSA9PSAwKTsKKyAgICAgICAgdGNnX291dDgocywgMHg2Nik7CisgICAgfQorICAgIGlmIChvcGMgJiBQX0FERFIzMikgeworICAgICAgICB0Y2dfb3V0OChzLCAweDY3KTsKKyAgICB9CisKKyAgICByZXggPSAwOworICAgIHJleCB8PSAob3BjICYgUF9SRVhXKSA/IDB4OCA6IDB4MDsgIC8qIFJFWC5XICovCisgICAgcmV4IHw9IChyICYgOCkgPj4gMTsJCS8qIFJFWC5SICovCisgICAgcmV4IHw9ICh4ICYgOCkgPj4gMjsJCS8qIFJFWC5YICovCisgICAgcmV4IHw9IChybSAmIDgpID4+IDM7CQkvKiBSRVguQiAqLworCisgICAgLyogUF9SRVhCX3tSLFJNfSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaXMgdGhlIGxvdyBieXRlLgorICAgICAgIEZvciAlW2FiY2RdbCB3ZSBuZWVkIG5vIFJFWCBwcmVmaXgsIGJ1dCBmb3IgJXtzaSxkaSxicCxzcH1sIHdlIGRvLAorICAgICAgIGFzIG90aGVyd2lzZSB0aGUgZW5jb2RpbmcgaW5kaWNhdGVzICVbYWJjZF1oLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZXMKKyAgICAgICB0aGF0IGFyZSBPUmVkIGluIG1lcmVseSBpbmRpY2F0ZSB0aGF0IHRoZSBSRVggYnl0ZSBtdXN0IGJlIHByZXNlbnQ7CisgICAgICAgdGhvc2UgYml0cyBnZXQgZGlzY2FyZGVkIGluIG91dHB1dC4gICovCisgICAgcmV4IHw9IG9wYyAmIChyID49IDQgPyBQX1JFWEJfUiA6IDApOworICAgIHJleCB8PSBvcGMgJiAocm0gPj0gNCA/IFBfUkVYQl9STSA6IDApOworCisgICAgaWYgKHJleCkgeworICAgICAgICB0Y2dfb3V0OChzLCAodWludDhfdCkocmV4IHwgMHg0MCkpOworICAgIH0KKworICAgIGlmIChvcGMgJiAoUF9FWFQgfCBQX0VYVDM4KSkgeworICAgICAgICB0Y2dfb3V0OChzLCAweDBmKTsKKyAgICAgICAgaWYgKG9wYyAmIFBfRVhUMzgpIHsKKyAgICAgICAgICAgIHRjZ19vdXQ4KHMsIDB4MzgpOworICAgIH0KKyAgICB9CisgICAgdGNnX291dDgocywgb3BjKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0Y2dfb3V0X29wYyhUQ0dDb250ZXh0ICpzLCBpbnQgb3BjKQoreworICAgIGlmIChvcGMgJiBQX0RBVEExNikgeworICAgICAgICB0Y2dfb3V0OChzLCAweDY2KTsKKyAgICB9CisgICAgaWYgKG9wYyAmIChQX0VYVCB8IFBfRVhUMzgpKSB7CisgICAgICAgIHRjZ19vdXQ4KHMsIDB4MGYpOworICAgICAgICBpZiAob3BjICYgUF9FWFQzOCkgeworICAgICAgICAgICAgdGNnX291dDgocywgMHgzOCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGNnX291dDgocywgb3BjKTsKK30KKy8qIERpc2NhcmQgdGhlIHJlZ2lzdGVyIGFyZ3VtZW50cyB0byB0Y2dfb3V0X29wYyBlYXJseSwgc28gYXMgbm90IHRvIHBlbmFsaXplCisgICB0aGUgMzItYml0IGNvbXBpbGF0aW9uIHBhdGhzLiAgVGhpcyBtZXRob2Qgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgZ2NjLAorICAgd2hlcmVhcyByZWx5aW5nIG9uIG9wdGltaXphdGlvbiBtYXkgbm90IGJlIGFibGUgdG8gZXhjbHVkZSB0aGVtLiAgKi8KKyNkZWZpbmUgdGNnX291dF9vcGMocywgb3BjLCByLCBybSwgeCkgICh0Y2dfb3V0X29wYykocywgb3BjKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfbW9kcm0oVENHQ29udGV4dCAqcywgaW50IG9wYywgaW50IHIsIGludCBybSkKK3sKKyAgICB0Y2dfb3V0X29wYyhzLCBvcGMsIHIsIHJtLCAwKTsKKyAgICB0Y2dfb3V0OChzLCAweGMwIHwgKExPV1JFR01BU0socikgPDwgMykgfCBMT1dSRUdNQVNLKHJtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfdmV4X21vZHJtKFRDR0NvbnRleHQgKnMsIGludCBvcGMsIGludCByLCBpbnQgdiwgaW50IHJtKQoreworICAgIGludCB0bXA7CisKKyAgICBpZiAoKG9wYyAmIChQX1JFWFcgfCBQX0VYVCB8IFBfRVhUMzgpKSB8fCAocm0gJiA4KSkgeworICAgICAgICAvKiBUaHJlZSBieXRlIFZFWCBwcmVmaXguICAqLworICAgICAgICB0Y2dfb3V0OChzLCAweGM0KTsKKworICAgICAgICAvKiBWRVgubS1tbW1tICovCisgICAgICAgIGlmIChvcGMgJiBQX0VYVDM4KSB7CisgICAgICAgICAgICB0bXAgPSAyOworICAgICAgICB9IGVsc2UgaWYgKG9wYyAmIFBfRVhUKSB7CisgICAgICAgICAgICB0bXAgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgdG1wIHw9IDB4NDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBWRVguWCAqLworICAgICAgICB0bXAgfD0gKHIgJiA4ID8gMCA6IDB4ODApOyAgICAgICAgIC8qIFZFWC5SICovCisgICAgICAgIHRtcCB8PSAocm0gJiA4ID8gMCA6IDB4MjApOyAgICAgICAgLyogVkVYLkIgKi8KKyAgICAgICAgdGNnX291dDgocywgdG1wKTsKKworICAgICAgICB0bXAgPSAob3BjICYgUF9SRVhXID8gMHg4MCA6IDApOyAgIC8qIFZFWC5XICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVHdvIGJ5dGUgVkVYIHByZWZpeC4gICovCisgICAgICAgIHRjZ19vdXQ4KHMsIDB4YzUpOworCisgICAgICAgIHRtcCA9IChyICYgOCA/IDAgOiAweDgwKTsgICAgICAgICAgLyogVkVYLlIgKi8KKyAgICB9CisgICAgLyogVkVYLnBwICovCisgICAgaWYgKG9wYyAmIFBfREFUQTE2KSB7CisgICAgICAgIHRtcCB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHg2NiAqLworICAgIH0gZWxzZSBpZiAob3BjICYgUF9TSU1ERjMpIHsKKyAgICAgICAgdG1wIHw9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweGYzICovCisgICAgfSBlbHNlIGlmIChvcGMgJiBQX1NJTURGMikgeworICAgICAgICB0bXAgfD0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4ZjIgKi8KKyAgICB9CisgICAgdG1wIHw9ICh+diAmIDE1KSA8PCAzOyAgICAgICAgICAgICAgICAgLyogVkVYLnZ2dnYgKi8KKyAgICB0Y2dfb3V0OChzLCB0bXApOworICAgIHRjZ19vdXQ4KHMsIG9wYyk7CisgICAgdGNnX291dDgocywgMHhjMCB8IChMT1dSRUdNQVNLKHIpIDw8IDMpIHwgTE9XUkVHTUFTSyhybSkpOworfQorLyogT3V0cHV0IGFuIG9wY29kZSB3aXRoIGEgZnVsbCAicm0gKyAoaW5kZXg8PHNoaWZ0KSArIG9mZnNldCIgYWRkcmVzcyBtb2RlLgorICAgV2UgaGFuZGxlIGVpdGhlciBSTSBhbmQgSU5ERVggbWlzc2luZyB3aXRoIGEgbmVnYXRpdmUgdmFsdWUuICBJbiA2NC1iaXQKKyAgIG1vZGUgZm9yIGFic29sdXRlIGFkZHJlc3NlcywgflJNIGlzIHRoZSBzaXplIG9mIHRoZSBpbW1lZGlhdGUgb3BlcmFuZAorICAgdGhhdCB3aWxsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb24uICAqLworCitzdGF0aWMgdm9pZCB0Y2dfb3V0X21vZHJtX3NpYl9vZmZzZXQoVENHQ29udGV4dCAqcywgaW50IG9wYywgaW50IHIsIGludCBybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBzaGlmdCwgaW50cHRyX3Qgb2Zmc2V0KQoreworICAgIGludCBtb2QsIGxlbjsKKworICAgIGlmIChpbmRleCA8IDAgJiYgcm0gPCAwKSB7CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICAvKiBUcnkgZm9yIGEgcmlwLXJlbGF0aXZlIGFkZHJlc3NpbmcgbW9kZS4gIFRoaXMgaGFzIHJlcGxhY2VkCisgICAgICAgICAgICAgICB0aGUgMzItYml0LW1vZGUgYWJzb2x1dGUgYWRkcmVzc2luZyBlbmNvZGluZy4gICovCisgICAgICAgICAgICBpbnRwdHJfdCBwYyA9IChpbnRwdHJfdClzLT5jb2RlX3B0ciArIDUgKyB+cm07CisgICAgICAgICAgICBpbnRwdHJfdCBkaXNwID0gb2Zmc2V0IC0gcGM7CisgICAgICAgICAgICBpZiAoZGlzcCA9PSAoaW50MzJfdClkaXNwKSB7CisgICAgICAgICAgICAgICAgdGNnX291dF9vcGMocywgb3BjLCByLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0OChzLCAoTE9XUkVHTUFTSyhyKSA8PCAzKSB8IDUpOworICAgICAgICAgICAgICAgIHRjZ19vdXQzMihzLCBkaXNwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRyeSBmb3IgYW4gYWJzb2x1dGUgYWRkcmVzcyBlbmNvZGluZy4gIFRoaXMgcmVxdWlyZXMgdGhlCisgICAgICAgICAgICAgICB1c2Ugb2YgdGhlIE1PRFJNK1NJQiBlbmNvZGluZyBhbmQgaXMgdGhlcmVmb3JlIGxhcmdlciB0aGFuCisgICAgICAgICAgICAgICByaXAtcmVsYXRpdmUgYWRkcmVzc2luZy4gICovCisgICAgICAgICAgICBpZiAob2Zmc2V0ID09IChpbnQzMl90KW9mZnNldCkgeworICAgICAgICAgICAgICAgIHRjZ19vdXRfb3BjKHMsIG9wYywgciwgMCwgMCk7CisgICAgICAgICAgICAgICAgdGNnX291dDgocywgKExPV1JFR01BU0socikgPDwgMykgfCA0KTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0OChzLCAoNCA8PCAzKSB8IDUpOworICAgICAgICAgICAgICAgIHRjZ19vdXQzMihzLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogPz8/IFRoZSBtZW1vcnkgaXNuJ3QgZGlyZWN0bHkgYWRkcmVzc2FibGUuICAqLworICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBBYnNvbHV0ZSBhZGRyZXNzLiAgKi8KKyAgICAgICAgICAgIHRjZ19vdXRfb3BjKHMsIG9wYywgciwgMCwgMCk7CisgICAgICAgICAgICB0Y2dfb3V0OChzLCAociA8PCAzKSB8IDUpOworICAgICAgICAgICAgdGNnX291dDMyKHMsIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaW5kIHRoZSBsZW5ndGggb2YgdGhlIGltbWVkaWF0ZSBhZGRlbmQuICBOb3RlIHRoYXQgdGhlIGVuY29kaW5nCisgICAgICAgdGhhdCB3b3VsZCBiZSB1c2VkIGZvciAoJWVicCkgaW5kaWNhdGVzIGFic29sdXRlIGFkZHJlc3NpbmcuICAqLworICAgIGlmIChybSA8IDApIHsKKyAgICAgICAgbW9kID0gMCwgbGVuID0gNCwgcm0gPSA1OworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDAgJiYgTE9XUkVHTUFTSyhybSkgIT0gVENHX1JFR19FQlApIHsKKyAgICAgICAgbW9kID0gMCwgbGVuID0gMDsKKyAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAoaW50OF90KW9mZnNldCkgeworICAgICAgICBtb2QgPSAweDQwLCBsZW4gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG1vZCA9IDB4ODAsIGxlbiA9IDQ7CisgICAgfQorCisgICAgLyogVXNlIGEgc2luZ2xlIGJ5dGUgTU9EUk0gZm9ybWF0IGlmIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHRoZSBlbmNvZGluZworICAgICAgIHRoYXQgd291bGQgYmUgdXNlZCBmb3IgJWVzcCBpcyB0aGUgZXNjYXBlIHRvIHRoZSB0d28gYnl0ZSBmb3JtLiAgKi8KKyAgICBpZiAoaW5kZXggPCAwICYmIExPV1JFR01BU0socm0pICE9IFRDR19SRUdfRVNQKSB7CisgICAgICAgIC8qIFNpbmdsZSBieXRlIE1PRFJNIGZvcm1hdC4gICovCisgICAgICAgIHRjZ19vdXRfb3BjKHMsIG9wYywgciwgcm0sIDApOworICAgICAgICB0Y2dfb3V0OChzLCBtb2QgfCAoTE9XUkVHTUFTSyhyKSA8PCAzKSB8IExPV1JFR01BU0socm0pKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBUd28gYnl0ZSBNT0RSTStTSUIgZm9ybWF0LiAgKi8KKworICAgICAgICAvKiBOb3RlIHRoYXQgdGhlIGVuY29kaW5nIHRoYXQgd291bGQgcGxhY2UgJWVzcCBpbnRvIHRoZSBpbmRleAorICAgICAgICAgICBmaWVsZCBpbmRpY2F0ZXMgbm8gaW5kZXggcmVnaXN0ZXIuICBJbiA2NC1iaXQgbW9kZSwgdGhlIFJFWC5YCisgICAgICAgICAgIGJpdCBjb3VudHMsIHNvICVyMTIgY2FuIGJlIHVzZWQgYXMgdGhlIGluZGV4LiAgKi8KKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgaW5kZXggPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGluZGV4ICE9IFRDR19SRUdfRVNQKTsKKyAgICAgICAgfQorCisgICAgICAgIHRjZ19vdXRfb3BjKHMsIG9wYywgciwgcm0sIGluZGV4KTsKKyAgICAgICAgdGNnX291dDgocywgbW9kIHwgKExPV1JFR01BU0socikgPDwgMykgfCA0KTsKKyAgICAgICAgdGNnX291dDgocywgKHNoaWZ0IDw8IDYpIHwgKExPV1JFR01BU0soaW5kZXgpIDw8IDMpIHwgTE9XUkVHTUFTSyhybSkpOworICAgIH0KKworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICB0Y2dfb3V0OChzLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAobGVuID09IDQpIHsKKyAgICAgICAgdGNnX291dDMyKHMsIG9mZnNldCk7CisgICAgfQorfQorCisvKiBBIHNpbXBsaWZpY2F0aW9uIG9mIHRoZSBhYm92ZSB3aXRoIG5vIGluZGV4IG9yIHNoaWZ0LiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X21vZHJtX29mZnNldChUQ0dDb250ZXh0ICpzLCBpbnQgb3BjLCBpbnQgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm0sIGludHB0cl90IG9mZnNldCkKK3sKKyAgICB0Y2dfb3V0X21vZHJtX3NpYl9vZmZzZXQocywgb3BjLCByLCBybSwgLTEsIDAsIG9mZnNldCk7Cit9CisKKy8qIEdlbmVyYXRlIGRlc3Qgb3A9IHNyYy4gIFVzZXMgdGhlIHNhbWUgQVJJVEhfKiBjb2RlcyBhcyB0Z2VuX2FyaXRoaS4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGdlbl9hcml0aHIoVENHQ29udGV4dCAqcywgaW50IHN1Ym9wLCBpbnQgZGVzdCwgaW50IHNyYykKK3sKKyAgICAvKiBQcm9wYWdhdGUgYW4gb3Bjb2RlIHByZWZpeCwgc3VjaCBhcyBQX1JFWFcuICAqLworICAgIGludCBleHQgPSBzdWJvcCAmIH4weDc7CisgICAgc3Vib3AgJj0gMHg3OworCisgICAgdGNnX291dF9tb2RybShzLCBPUENfQVJJVEhfR3ZFdiArIChzdWJvcCA8PCAzKSArIGV4dCwgZGVzdCwgc3JjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfbW92KFRDR0NvbnRleHQgKnMsIFRDR1R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dSZWcgcmV0LCBUQ0dSZWcgYXJnKQoreworICAgIGlmIChhcmcgIT0gcmV0KSB7CisgICAgICAgIGludCBvcGMgPSBPUENfTU9WTF9HdkV2ICsgKHR5cGUgPT0gVENHX1RZUEVfSTY0ID8gUF9SRVhXIDogMCk7CisgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgb3BjLCByZXQsIGFyZyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0Y2dfb3V0X21vdmkoVENHQ29udGV4dCAqcywgVENHVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1JlZyByZXQsIHRjZ190YXJnZXRfbG9uZyBhcmcpCit7CisgICAgdGNnX3RhcmdldF9sb25nIGRpZmY7CisKKyAgICBpZiAoYXJnID09IDApIHsKKyAgICAgICAgdGdlbl9hcml0aHIocywgQVJJVEhfWE9SLCByZXQsIHJldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGFyZyA9PSAodWludDMyX3QpYXJnIHx8IHR5cGUgPT0gVENHX1RZUEVfSTMyKSB7CisgICAgICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19NT1ZMX0l2ICsgTE9XUkVHTUFTSyhyZXQpLCAwLCByZXQsIDApOworICAgICAgICB0Y2dfb3V0MzIocywgYXJnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYXJnID09IChpbnQzMl90KWFyZykgeworICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19NT1ZMX0V2SXogKyBQX1JFWFcsIDAsIHJldCk7CisgICAgICAgIHRjZ19vdXQzMihzLCBhcmcpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVHJ5IGEgNyBieXRlIHBjLXJlbGF0aXZlIGxlYSBiZWZvcmUgdGhlIDEwIGJ5dGUgbW92cS4gICovCisgICAgZGlmZiA9IGFyZyAtICgodWludHB0cl90KXMtPmNvZGVfcHRyICsgNyk7CisgICAgaWYgKGRpZmYgPT0gKGludDMyX3QpZGlmZikgeworICAgICAgICB0Y2dfb3V0X29wYyhzLCBPUENfTEVBIHwgUF9SRVhXLCByZXQsIDAsIDApOworICAgICAgICB0Y2dfb3V0OChzLCAoTE9XUkVHTUFTSyhyZXQpIDw8IDMpIHwgNSk7CisgICAgICAgIHRjZ19vdXQzMihzLCBkaWZmKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19NT1ZMX0l2ICsgUF9SRVhXICsgTE9XUkVHTUFTSyhyZXQpLCAwLCByZXQsIDApOworICAgIHRjZ19vdXQ2NChzLCBhcmcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF9wdXNoaShUQ0dDb250ZXh0ICpzLCB0Y2dfdGFyZ2V0X2xvbmcgdmFsKQoreworICAgIGlmICh2YWwgPT0gKGludDhfdCl2YWwpIHsKKyAgICAgICAgdGNnX291dF9vcGMocywgT1BDX1BVU0hfSWIsIDAsIDAsIDApOworICAgICAgICB0Y2dfb3V0OChzLCB2YWwpOworICAgIH0gZWxzZSBpZiAodmFsID09IChpbnQzMl90KXZhbCkgeworICAgICAgICB0Y2dfb3V0X29wYyhzLCBPUENfUFVTSF9JdiwgMCwgMCwgMCk7CisgICAgICAgIHRjZ19vdXQzMihzLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfcHVzaChUQ0dDb250ZXh0ICpzLCBpbnQgcmVnKQoreworICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19QVVNIX3IzMiArIExPV1JFR01BU0socmVnKSwgMCwgcmVnLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfcG9wKFRDR0NvbnRleHQgKnMsIGludCByZWcpCit7CisgICAgdGNnX291dF9vcGMocywgT1BDX1BPUF9yMzIgKyBMT1dSRUdNQVNLKHJlZyksIDAsIHJlZywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2xkKFRDR0NvbnRleHQgKnMsIFRDR1R5cGUgdHlwZSwgVENHUmVnIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1JlZyBhcmcxLCBpbnRwdHJfdCBhcmcyKQoreworICAgIGludCBvcGMgPSBPUENfTU9WTF9HdkV2ICsgKHR5cGUgPT0gVENHX1RZUEVfSTY0ID8gUF9SRVhXIDogMCk7CisgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgb3BjLCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF9zdChUQ0dDb250ZXh0ICpzLCBUQ0dUeXBlIHR5cGUsIFRDR1JlZyBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dSZWcgYXJnMSwgaW50cHRyX3QgYXJnMikKK3sKKyAgICBpbnQgb3BjID0gT1BDX01PVkxfRXZHdiArICh0eXBlID09IFRDR19UWVBFX0k2NCA/IFBfUkVYVyA6IDApOworICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG9wYywgYXJnLCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfc3RpKFRDR0NvbnRleHQgKnMsIFRDR1R5cGUgdHlwZSwgVENHUmVnIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mcywgdGNnX3RhcmdldF9sb25nIHZhbCkKK3sKKyAgICBpbnQgb3BjID0gT1BDX01PVkxfRXZJeiArICh0eXBlID09IFRDR19UWVBFX0k2NCA/IFBfUkVYVyA6IDApOworICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG9wYywgMCwgYmFzZSwgb2ZzKTsKKyAgICB0Y2dfb3V0MzIocywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgdGNnX291dF9zaGlmdGkoVENHQ29udGV4dCAqcywgaW50IHN1Ym9wYywgaW50IHJlZywgaW50IGNvdW50KQoreworICAgIC8qIFByb3BhZ2F0ZSBhbiBvcGNvZGUgcHJlZml4LCBzdWNoIGFzIFBfREFUQTE2LiAgKi8KKyAgICBpbnQgZXh0ID0gc3Vib3BjICYgfjB4NzsKKyAgICBzdWJvcGMgJj0gMHg3OworCisgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfU0hJRlRfMSArIGV4dCwgc3Vib3BjLCByZWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX1NISUZUX0liICsgZXh0LCBzdWJvcGMsIHJlZyk7CisgICAgICAgIHRjZ19vdXQ4KHMsIGNvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2Jzd2FwMzIoVENHQ29udGV4dCAqcywgaW50IHJlZykKK3sKKyAgICB0Y2dfb3V0X29wYyhzLCBPUENfQlNXQVAgKyBMT1dSRUdNQVNLKHJlZyksIDAsIHJlZywgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X3JvbHdfOChUQ0dDb250ZXh0ICpzLCBpbnQgcmVnKQoreworICAgIHRjZ19vdXRfc2hpZnRpKHMsIFNISUZUX1JPTCArIFBfREFUQTE2LCByZWcsIDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF9leHQ4dShUQ0dDb250ZXh0ICpzLCBpbnQgZGVzdCwgaW50IHNyYykKK3sKKyAgICAvKiBtb3Z6YmwgKi8KKyAgICBhc3NlcnQoc3JjIDwgNCB8fCBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KTsKKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19NT1ZaQkwgKyBQX1JFWEJfUk0sIGRlc3QsIHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfZXh0OHMoVENHQ29udGV4dCAqcywgaW50IGRlc3QsIGludCBzcmMsIGludCByZXh3KQoreworICAgIC8qIG1vdnNibCAqLworICAgIGFzc2VydChzcmMgPCA0IHx8IFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQpOworICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX01PVlNCTCArIFBfUkVYQl9STSArIHJleHcsIGRlc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2V4dDE2dShUQ0dDb250ZXh0ICpzLCBpbnQgZGVzdCwgaW50IHNyYykKK3sKKyAgICAvKiBtb3Z6d2wgKi8KKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19NT1ZaV0wsIGRlc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2V4dDE2cyhUQ0dDb250ZXh0ICpzLCBpbnQgZGVzdCwgaW50IHNyYywgaW50IHJleHcpCit7CisgICAgLyogbW92c3dbbHFdICovCisgICAgdGNnX291dF9tb2RybShzLCBPUENfTU9WU1dMICsgcmV4dywgZGVzdCwgc3JjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfZXh0MzJ1KFRDR0NvbnRleHQgKnMsIGludCBkZXN0LCBpbnQgc3JjKQoreworICAgIC8qIDMyLWJpdCBtb3YgemVybyBleHRlbmRzLiAgKi8KKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19NT1ZMX0d2RXYsIGRlc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2V4dDMycyhUQ0dDb250ZXh0ICpzLCBpbnQgZGVzdCwgaW50IHNyYykKK3sKKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19NT1ZTTFEsIGRlc3QsIHNyYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X2Jzd2FwNjQoVENHQ29udGV4dCAqcywgaW50IHJlZykKK3sKKyAgICB0Y2dfb3V0X29wYyhzLCBPUENfQlNXQVAgKyBQX1JFWFcgKyBMT1dSRUdNQVNLKHJlZyksIDAsIHJlZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRnZW5fYXJpdGhpKFRDR0NvbnRleHQgKnMsIGludCBjLCBpbnQgcjAsCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgdmFsLCBpbnQgY2YpCit7CisgICAgaW50IHJleHcgPSAwOworCisgICAgaWYgKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQpIHsKKyAgICAgICAgcmV4dyA9IGMgJiAtODsKKyAgICAgICAgYyAmPSA3OworICAgIH0KKworICAgIC8qID8/PyBXaGlsZSBJTkMgaXMgMiBieXRlcyBzaG9ydGVyIHRoYW4gQURETCAkMSwgdGhleSBhbHNvIGluZHVjZQorICAgICAgIHBhcnRpYWwgZmxhZ3MgdXBkYXRlIHN0YWxscyBvbiBQZW50aXVtNCBhbmQgYXJlIG5vdCByZWNvbW1lbmRlZAorICAgICAgIGJ5IGN1cnJlbnQgSW50ZWwgb3B0aW1pemF0aW9uIG1hbnVhbHMuICAqLworICAgIGlmICghY2YgJiYgKGMgPT0gQVJJVEhfQUREIHx8IGMgPT0gQVJJVEhfU1VCKSAmJiAodmFsID09IDEgfHwgdmFsID09IC0xKSkgeworICAgICAgICBpbnQgaXNfaW5jID0gKGMgPT0gQVJJVEhfQUREKSBeICh2YWwgPCAwKTsKKyAgICAgICAgaWYgKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQpIHsKKyAgICAgICAgICAgIC8qIFRoZSBzaW5nbGUtYnl0ZSBpbmNyZW1lbnQgZW5jb2RpbmdzIGFyZSByZS10YXNrZWQgYXMgdGhlCisgICAgICAgICAgICAgICBSRVggcHJlZml4ZXMuICBVc2UgdGhlIE1PRFJNIGVuY29kaW5nLiAgKi8KKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX0dSUDUgKyByZXh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfaW5jID8gRVhUNV9JTkNfRXYgOiBFWFQ1X0RFQ19FdiksIHIwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXQ4KHMsIChpc19pbmMgPyBPUENfSU5DX3IzMiA6IE9QQ19ERUNfcjMyKSArIHIwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGMgPT0gQVJJVEhfQU5EKSB7CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICBpZiAodmFsID09IDB4ZmZmZmZmZmZ1KSB7CisgICAgICAgICAgICAgICAgdGNnX291dF9leHQzMnUocywgcjAsIHIwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsID09ICh1aW50MzJfdCl2YWwpIHsKKyAgICAgICAgICAgICAgICAvKiBBTkQgd2l0aCBubyBoaWdoIGJpdHMgc2V0IGNhbiB1c2UgYSAzMi1iaXQgb3BlcmF0aW9uLiAgKi8KKyAgICAgICAgICAgICAgICByZXh3ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmFsID09IDB4ZmZ1ICYmIChyMCA8IDQgfHwgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkpIHsKKyAgICAgICAgICAgIHRjZ19vdXRfZXh0OHUocywgcjAsIHIwKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsID09IDB4ZmZmZnUpIHsKKyAgICAgICAgICAgIHRjZ19vdXRfZXh0MTZ1KHMsIHIwLCByMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmFsID09IChpbnQ4X3QpdmFsKSB7CisgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX0FSSVRIX0V2SWIgKyByZXh3LCBjLCByMCk7CisgICAgICAgIHRjZ19vdXQ4KHMsIHZhbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHJleHcgPT0gMCB8fCB2YWwgPT0gKGludDMyX3QpdmFsKSB7CisgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX0FSSVRIX0V2SXogKyByZXh3LCBjLCByMCk7CisgICAgICAgIHRjZ19vdXQzMihzLCB2YWwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGNnX2Fib3J0KCk7Cit9CisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfYWRkaShUQ0dDb250ZXh0ICpzLCBpbnQgcmVnLCB0Y2dfdGFyZ2V0X2xvbmcgdmFsKQoreworICAgIGlmICh2YWwgIT0gMCkgeworICAgICAgICB0Z2VuX2FyaXRoaShzLCBBUklUSF9BREQgKyBQX1JFWFcsIHJlZywgdmFsLCAwKTsKKyAgICB9Cit9CisKKy8qIFVzZSBTTUFMTCAhPSAwIHRvIGZvcmNlIGEgc2hvcnQgZm9yd2FyZCBicmFuY2guICAqLworc3RhdGljIHZvaWQgdGNnX291dF9qeHgoVENHQ29udGV4dCAqcywgaW50IG9wYywgaW50IGxhYmVsX2luZGV4LCBpbnQgc21hbGwpCit7CisgICAgaW50MzJfdCB2YWwsIHZhbDE7CisgICAgVENHTGFiZWwgKmwgPSAmcy0+bGFiZWxzW2xhYmVsX2luZGV4XTsKKworICAgIGlmIChsLT5oYXNfdmFsdWUpIHsKKyAgICAgICAgdmFsID0gbC0+dS52YWx1ZSAtIChpbnRwdHJfdClzLT5jb2RlX3B0cjsKKyAgICAgICAgdmFsMSA9IHZhbCAtIDI7CisgICAgICAgIGlmICgoaW50OF90KXZhbDEgPT0gdmFsMSkgeworICAgICAgICAgICAgaWYgKG9wYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRjZ19vdXQ4KHMsIE9QQ19KTVBfc2hvcnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0OChzLCBPUENfSkNDX3Nob3J0ICsgb3BjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ19vdXQ4KHMsIHZhbDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHNtYWxsKSB7CisgICAgICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3BjID09IC0xKSB7CisgICAgICAgICAgICAgICAgdGNnX291dDgocywgT1BDX0pNUF9sb25nKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0MzIocywgdmFsIC0gNSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19KQ0NfbG9uZyArIG9wYywgMCwgMCwgMCk7CisgICAgICAgICAgICAgICAgdGNnX291dDMyKHMsIHZhbCAtIDYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzbWFsbCkgeworICAgICAgICBpZiAob3BjID09IC0xKSB7CisgICAgICAgICAgICB0Y2dfb3V0OChzLCBPUENfSk1QX3Nob3J0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXQ4KHMsIE9QQ19KQ0Nfc2hvcnQgKyBvcGMpOworICAgICAgICB9CisgICAgICAgIHRjZ19vdXRfcmVsb2Mocywgcy0+Y29kZV9wdHIsIFJfMzg2X1BDOCwgbGFiZWxfaW5kZXgsIC0xKTsKKyAgICAgICAgcy0+Y29kZV9wdHIgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAob3BjID09IC0xKSB7CisgICAgICAgICAgICB0Y2dfb3V0OChzLCBPUENfSk1QX2xvbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF9vcGMocywgT1BDX0pDQ19sb25nICsgb3BjLCAwLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfb3V0X3JlbG9jKHMsIHMtPmNvZGVfcHRyLCBSXzM4Nl9QQzMyLCBsYWJlbF9pbmRleCwgLTQpOworICAgICAgICBzLT5jb2RlX3B0ciArPSA0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGNnX291dF9jbXAoVENHQ29udGV4dCAqcywgVENHQXJnIGFyZzEsIFRDR0FyZyBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0X2FyZzIsIGludCByZXh3KQoreworICAgIGlmIChjb25zdF9hcmcyKSB7CisgICAgICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgICAgIC8qIHRlc3QgciwgciAqLworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfVEVTVEwgKyByZXh3LCBhcmcxLCBhcmcxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRnZW5fYXJpdGhpKHMsIEFSSVRIX0NNUCArIHJleHcsIGFyZzEsIGFyZzIsIDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGdlbl9hcml0aHIocywgQVJJVEhfQ01QICsgcmV4dywgYXJnMSwgYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0Y2dfb3V0X2JyY29uZDMyKFRDR0NvbnRleHQgKnMsIFRDR0NvbmQgY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHQXJnIGFyZzEsIFRDR0FyZyBhcmcyLCBpbnQgY29uc3RfYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhYmVsX2luZGV4LCBpbnQgc21hbGwpCit7CisgICAgdGNnX291dF9jbXAocywgYXJnMSwgYXJnMiwgY29uc3RfYXJnMiwgMCk7CisgICAgdGNnX291dF9qeHgocywgdGNnX2NvbmRfdG9famNjW2NvbmRdLCBsYWJlbF9pbmRleCwgc21hbGwpOworfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorc3RhdGljIHZvaWQgdGNnX291dF9icmNvbmQ2NChUQ0dDb250ZXh0ICpzLCBUQ0dDb25kIGNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBhcmcxLCBUQ0dBcmcgYXJnMiwgaW50IGNvbnN0X2FyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWJlbF9pbmRleCwgaW50IHNtYWxsKQoreworICAgIHRjZ19vdXRfY21wKHMsIGFyZzEsIGFyZzIsIGNvbnN0X2FyZzIsIFBfUkVYVyk7CisgICAgdGNnX291dF9qeHgocywgdGNnX2NvbmRfdG9famNjW2NvbmRdLCBsYWJlbF9pbmRleCwgc21hbGwpOworfQorI2Vsc2UKKy8qIFhYWDogd2UgaW1wbGVtZW50IGl0IGF0IHRoZSB0YXJnZXQgbGV2ZWwgdG8gYXZvaWQgaGF2aW5nIHRvCisgICBoYW5kbGUgY3Jvc3MgYmFzaWMgYmxvY2tzIHRlbXBvcmFyaWVzICovCitzdGF0aWMgdm9pZCB0Y2dfb3V0X2JyY29uZDIoVENHQ29udGV4dCAqcywgY29uc3QgVENHQXJnICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqY29uc3RfYXJncywgaW50IHNtYWxsKQoreworICAgIGludCBsYWJlbF9uZXh0OworICAgIGxhYmVsX25leHQgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgc3dpdGNoKGFyZ3NbNF0pIHsKKyAgICBjYXNlIFRDR19DT05EX0VROgorICAgICAgICB0Y2dfb3V0X2JyY29uZDMyKHMsIFRDR19DT05EX05FLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsX25leHQsIDEpOworICAgICAgICB0Y2dfb3V0X2JyY29uZDMyKHMsIFRDR19DT05EX0VRLCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9ORToKKyAgICAgICAgdGNnX291dF9icmNvbmQzMihzLCBUQ0dfQ09ORF9ORSwgYXJnc1swXSwgYXJnc1syXSwgY29uc3RfYXJnc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzVdLCBzbWFsbCk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTkUsIGFyZ3NbMV0sIGFyZ3NbM10sIGNvbnN0X2FyZ3NbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s1XSwgc21hbGwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRDR19DT05EX0xUOgorICAgICAgICB0Y2dfb3V0X2JyY29uZDMyKHMsIFRDR19DT05EX0xULCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTFRVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9MRToKKyAgICAgICAgdGNnX291dF9icmNvbmQzMihzLCBUQ0dfQ09ORF9MVCwgYXJnc1sxXSwgYXJnc1szXSwgY29uc3RfYXJnc1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzVdLCBzbWFsbCk7CisgICAgICAgIHRjZ19vdXRfanh4KHMsIEpDQ19KTkUsIGxhYmVsX25leHQsIDEpOworICAgICAgICB0Y2dfb3V0X2JyY29uZDMyKHMsIFRDR19DT05EX0xFVSwgYXJnc1swXSwgYXJnc1syXSwgY29uc3RfYXJnc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzVdLCBzbWFsbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVENHX0NPTkRfR1Q6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR1QsIGFyZ3NbMV0sIGFyZ3NbM10sIGNvbnN0X2FyZ3NbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s1XSwgc21hbGwpOworICAgICAgICB0Y2dfb3V0X2p4eChzLCBKQ0NfSk5FLCBsYWJlbF9uZXh0LCAxKTsKKyAgICAgICAgdGNnX291dF9icmNvbmQzMihzLCBUQ0dfQ09ORF9HVFUsIGFyZ3NbMF0sIGFyZ3NbMl0sIGNvbnN0X2FyZ3NbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s1XSwgc21hbGwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRDR19DT05EX0dFOgorICAgICAgICB0Y2dfb3V0X2JyY29uZDMyKHMsIFRDR19DT05EX0dULCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR0VVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9MVFU6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTFRVLCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTFRVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9MRVU6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTFRVLCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfTEVVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9HVFU6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR1RVLCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR1RVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUQ0dfQ09ORF9HRVU6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR1RVLCBhcmdzWzFdLCBhcmdzWzNdLCBjb25zdF9hcmdzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pORSwgbGFiZWxfbmV4dCwgMSk7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgVENHX0NPTkRfR0VVLCBhcmdzWzBdLCBhcmdzWzJdLCBjb25zdF9hcmdzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0sIHNtYWxsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorICAgIHRjZ19vdXRfbGFiZWwocywgbGFiZWxfbmV4dCwgcy0+Y29kZV9wdHIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfc2V0Y29uZDMyKFRDR0NvbnRleHQgKnMsIFRDR0NvbmQgY29uZCwgVENHQXJnIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgYXJnMSwgVENHQXJnIGFyZzIsIGludCBjb25zdF9hcmcyKQoreworICAgIHRjZ19vdXRfY21wKHMsIGFyZzEsIGFyZzIsIGNvbnN0X2FyZzIsIDApOworICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX1NFVENDIHwgdGNnX2NvbmRfdG9famNjW2NvbmRdLCAwLCBkZXN0KTsKKyAgICB0Y2dfb3V0X2V4dDh1KHMsIGRlc3QsIGRlc3QpOworfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorc3RhdGljIHZvaWQgdGNnX291dF9zZXRjb25kNjQoVENHQ29udGV4dCAqcywgVENHQ29uZCBjb25kLCBUQ0dBcmcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBhcmcxLCBUQ0dBcmcgYXJnMiwgaW50IGNvbnN0X2FyZzIpCit7CisgICAgdGNnX291dF9jbXAocywgYXJnMSwgYXJnMiwgY29uc3RfYXJnMiwgUF9SRVhXKTsKKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19TRVRDQyB8IHRjZ19jb25kX3RvX2pjY1tjb25kXSwgMCwgZGVzdCk7CisgICAgdGNnX291dF9leHQ4dShzLCBkZXN0LCBkZXN0KTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0Y2dfb3V0X3NldGNvbmQyKFRDR0NvbnRleHQgKnMsIGNvbnN0IFRDR0FyZyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpjb25zdF9hcmdzKQoreworICAgIFRDR0FyZyBuZXdfYXJnc1s2XTsKKyAgICBpbnQgbGFiZWxfdHJ1ZSwgbGFiZWxfb3ZlcjsKKworICAgIG1lbWNweShuZXdfYXJncywgYXJncysxLCA1KnNpemVvZihUQ0dBcmcpKTsKKworICAgIGlmIChhcmdzWzBdID09IGFyZ3NbMV0gfHwgYXJnc1swXSA9PSBhcmdzWzJdCisgICAgICAgIHx8ICghY29uc3RfYXJnc1szXSAmJiBhcmdzWzBdID09IGFyZ3NbM10pCisgICAgICAgIHx8ICghY29uc3RfYXJnc1s0XSAmJiBhcmdzWzBdID09IGFyZ3NbNF0pKSB7CisgICAgICAgIC8qIFdoZW4gdGhlIGRlc3RpbmF0aW9uIG92ZXJsYXBzIHdpdGggb25lIG9mIHRoZSBhcmd1bWVudAorICAgICAgICAgICByZWdpc3RlcnMsIGRvbid0IGRvIGFueXRoaW5nIHRyaWNreS4gICovCisgICAgICAgIGxhYmVsX3RydWUgPSBnZW5fbmV3X2xhYmVsKCk7CisgICAgICAgIGxhYmVsX292ZXIgPSBnZW5fbmV3X2xhYmVsKCk7CisKKyAgICAgICAgbmV3X2FyZ3NbNV0gPSBsYWJlbF90cnVlOworICAgICAgICB0Y2dfb3V0X2JyY29uZDIocywgbmV3X2FyZ3MsIGNvbnN0X2FyZ3MrMSwgMSk7CisKKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0kzMiwgYXJnc1swXSwgMCk7CisgICAgICAgIHRjZ19vdXRfanh4KHMsIEpDQ19KTVAsIGxhYmVsX292ZXIsIDEpOworICAgICAgICB0Y2dfb3V0X2xhYmVsKHMsIGxhYmVsX3RydWUsIHMtPmNvZGVfcHRyKTsKKworICAgICAgICB0Y2dfb3V0X21vdmkocywgVENHX1RZUEVfSTMyLCBhcmdzWzBdLCAxKTsKKyAgICAgICAgdGNnX291dF9sYWJlbChzLCBsYWJlbF9vdmVyLCBzLT5jb2RlX3B0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2hlbiB0aGUgZGVzdGluYXRpb24gZG9lcyBub3Qgb3ZlcmxhcCBvbmUgb2YgdGhlIGFyZ3VtZW50cywKKyAgICAgICAgICAgY2xlYXIgdGhlIGRlc3RpbmF0aW9uIGZpcnN0LCBqdW1wIGlmIGNvbmQgZmFsc2UsIGFuZCBlbWl0IGFuCisgICAgICAgICAgIGluY3JlbWVudCBpbiB0aGUgdHJ1ZSBjYXNlLiAgVGhpcyByZXN1bHRzIGluIHNtYWxsZXIgY29kZS4gICovCisKKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0kzMiwgYXJnc1swXSwgMCk7CisKKyAgICAgICAgbGFiZWxfb3ZlciA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgbmV3X2FyZ3NbNF0gPSB0Y2dfaW52ZXJ0X2NvbmQobmV3X2FyZ3NbNF0pOworICAgICAgICBuZXdfYXJnc1s1XSA9IGxhYmVsX292ZXI7CisgICAgICAgIHRjZ19vdXRfYnJjb25kMihzLCBuZXdfYXJncywgY29uc3RfYXJncysxLCAxKTsKKworICAgICAgICB0Z2VuX2FyaXRoaShzLCBBUklUSF9BREQsIGFyZ3NbMF0sIDEsIDApOworICAgICAgICB0Y2dfb3V0X2xhYmVsKHMsIGxhYmVsX292ZXIsIHMtPmNvZGVfcHRyKTsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdGNnX291dF9tb3Zjb25kMzIoVENHQ29udGV4dCAqcywgVENHQ29uZCBjb25kLCBUQ0dBcmcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBjMSwgVENHQXJnIGMyLCBpbnQgY29uc3RfYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgdjEpCit7CisgICAgdGNnX291dF9jbXAocywgYzEsIGMyLCBjb25zdF9jMiwgMCk7CisgICAgaWYgKGhhdmVfY21vdikgeworICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19DTU9WQ0MgfCB0Y2dfY29uZF90b19qY2NbY29uZF0sIGRlc3QsIHYxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgb3ZlciA9IGdlbl9uZXdfbGFiZWwoKTsKKyAgICAgICAgdGNnX291dF9qeHgocywgdGNnX2NvbmRfdG9famNjW3RjZ19pbnZlcnRfY29uZChjb25kKV0sIG92ZXIsIDEpOworICAgICAgICB0Y2dfb3V0X21vdihzLCBUQ0dfVFlQRV9JMzIsIGRlc3QsIHYxKTsKKyAgICAgICAgdGNnX291dF9sYWJlbChzLCBvdmVyLCBzLT5jb2RlX3B0cik7CisgICAgfQorfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorc3RhdGljIHZvaWQgdGNnX291dF9tb3Zjb25kNjQoVENHQ29udGV4dCAqcywgVENHQ29uZCBjb25kLCBUQ0dBcmcgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBjMSwgVENHQXJnIGMyLCBpbnQgY29uc3RfYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgdjEpCit7CisgICAgdGNnX291dF9jbXAocywgYzEsIGMyLCBjb25zdF9jMiwgUF9SRVhXKTsKKyAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19DTU9WQ0MgfCB0Y2dfY29uZF90b19qY2NbY29uZF0gfCBQX1JFWFcsIGRlc3QsIHYxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0Y2dfb3V0X2JyYW5jaChUQ0dDb250ZXh0ICpzLCBpbnQgY2FsbCwgdWludHB0cl90IGRlc3QpCit7CisgICAgaW50cHRyX3QgZGlzcCA9IGRlc3QgLSAoaW50cHRyX3Qpcy0+Y29kZV9wdHIgLSA1OworCisgICAgaWYgKGRpc3AgPT0gKGludDMyX3QpZGlzcCkgeworICAgICAgICB0Y2dfb3V0X29wYyhzLCBjYWxsID8gT1BDX0NBTExfSnogOiBPUENfSk1QX2xvbmcsIDAsIDAsIDApOworICAgICAgICB0Y2dfb3V0MzIocywgZGlzcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX1BUUiwgVENHX1JFR19SMTAsIGRlc3QpOworICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19HUlA1LAorICAgICAgICAgICAgICAgICAgICAgIGNhbGwgPyBFWFQ1X0NBTExOX0V2IDogRVhUNV9KTVBOX0V2LCBUQ0dfUkVHX1IxMCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF9jYWxsaShUQ0dDb250ZXh0ICpzLCB1aW50cHRyX3QgZGVzdCkKK3sKKyAgICB0Y2dfb3V0X2JyYW5jaChzLCAxLCBkZXN0KTsKK30KKworc3RhdGljIHZvaWQgdGNnX291dF9qbXAoVENHQ29udGV4dCAqcywgdWludHB0cl90IGRlc3QpCit7CisgICAgdGNnX291dF9icmFuY2gocywgMCwgZGVzdCk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19TT0ZUTU1VKQorLyogaGVscGVyIHNpZ25hdHVyZTogaGVscGVyX3JldF9sZF9tbXUoQ1BVU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJhKQorICovCitzdGF0aWMgY29uc3Qgdm9pZCAqIGNvbnN0IHFlbXVfbGRfaGVscGVyc1sxNl0gPSB7CisgICAgW01PX1VCXSAgID0gaGVscGVyX3JldF9sZHViX21tdSwKKyAgICBbTU9fTEVVV10gPSBoZWxwZXJfbGVfbGR1d19tbXUsCisgICAgW01PX0xFVUxdID0gaGVscGVyX2xlX2xkdWxfbW11LAorICAgIFtNT19MRVFdICA9IGhlbHBlcl9sZV9sZHFfbW11LAorICAgIFtNT19CRVVXXSA9IGhlbHBlcl9iZV9sZHV3X21tdSwKKyAgICBbTU9fQkVVTF0gPSBoZWxwZXJfYmVfbGR1bF9tbXUsCisgICAgW01PX0JFUV0gID0gaGVscGVyX2JlX2xkcV9tbXUsCit9OworCisvKiBoZWxwZXIgc2lnbmF0dXJlOiBoZWxwZXJfcmV0X3N0X21tdShDUFVTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnR4eF90IHZhbCwgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByYSkKKyAqLworc3RhdGljIGNvbnN0IHZvaWQgKiBjb25zdCBxZW11X3N0X2hlbHBlcnNbMTZdID0geworICAgIFtNT19VQl0gICA9IGhlbHBlcl9yZXRfc3RiX21tdSwKKyAgICBbTU9fTEVVV10gPSBoZWxwZXJfbGVfc3R3X21tdSwKKyAgICBbTU9fTEVVTF0gPSBoZWxwZXJfbGVfc3RsX21tdSwKKyAgICBbTU9fTEVRXSAgPSBoZWxwZXJfbGVfc3RxX21tdSwKKyAgICBbTU9fQkVVV10gPSBoZWxwZXJfYmVfc3R3X21tdSwKKyAgICBbTU9fQkVVTF0gPSBoZWxwZXJfYmVfc3RsX21tdSwKKyAgICBbTU9fQkVRXSAgPSBoZWxwZXJfYmVfc3RxX21tdSwKK307CisKKy8qIFBlcmZvcm0gdGhlIFRMQiBsb2FkIGFuZCBjb21wYXJlLgorCisgICBJbnB1dHM6CisgICBBRERSTE8gYW5kIEFERFJISSBjb250YWluIHRoZSBsb3cgYW5kIGhpZ2ggcGFydCBvZiB0aGUgYWRkcmVzcy4KKworICAgTUVNX0lOREVYIGFuZCBTX0JJVFMgYXJlIHRoZSBtZW1vcnkgY29udGV4dCBhbmQgbG9nMiBzaXplIG9mIHRoZSBsb2FkLgorCisgICBXSElDSCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIENQVVRMQkVudHJ5IHN0cnVjdHVyZSBvZiB0aGUgc2xvdCB0byByZWFkLgorICAgVGhpcyBzaG91bGQgYmUgb2Zmc2V0b2YgYWRkcl9yZWFkIG9yIGFkZHJfd3JpdGUuCisKKyAgIE91dHB1dHM6CisgICBMQUJFTF9QVFJTIGlzIGZpbGxlZCB3aXRoIDEgKDMyLWJpdCBhZGRyZXNzZXMpIG9yIDIgKDY0LWJpdCBhZGRyZXNzZXMpCisgICBwb3NpdGlvbnMgb2YgdGhlIGRpc3BsYWNlbWVudHMgb2YgZm9yd2FyZCBqdW1wcyB0byB0aGUgVExCIG1pc3MgY2FzZS4KKworICAgU2Vjb25kIGFyZ3VtZW50IHJlZ2lzdGVyIGlzIGxvYWRlZCB3aXRoIHRoZSBsb3cgcGFydCBvZiB0aGUgYWRkcmVzcy4KKyAgIEluIHRoZSBUTEIgaGl0IGNhc2UsIGl0IGhhcyBiZWVuIGFkanVzdGVkIGFzIGluZGljYXRlZCBieSB0aGUgVExCCisgICBhbmQgc28gaXMgYSBob3N0IGFkZHJlc3MuICBJbiB0aGUgVExCIG1pc3MgY2FzZSwgaXQgY29udGludWVzIHRvCisgICBob2xkIGEgZ3Vlc3QgYWRkcmVzcy4KKworICAgRmlyc3QgYXJndW1lbnQgcmVnaXN0ZXIgaXMgY2xvYmJlcmVkLiAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXRfdGxiX2xvYWQoVENHQ29udGV4dCAqcywgVENHUmVnIGFkZHJsbywgVENHUmVnIGFkZHJoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1faW5kZXgsIFRDR01lbU9wIHNfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipsYWJlbF9wdHIsIGludCB3aGljaCkKK3sKKyAgICBjb25zdCBUQ0dSZWcgcjAgPSBUQ0dfUkVHX0wwOworICAgIGNvbnN0IFRDR1JlZyByMSA9IFRDR19SRUdfTDE7CisgICAgVENHVHlwZSB0dHlwZSA9IFRDR19UWVBFX0kzMjsKKyAgICBUQ0dUeXBlIGh0eXBlID0gVENHX1RZUEVfSTMyOworICAgIGludCB0cmV4dyA9IDAsIGhyZXh3ID0gMDsKKworICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgIGlmIChUQVJHRVRfTE9OR19CSVRTID09IDY0KSB7CisgICAgICAgICAgICB0dHlwZSA9IFRDR19UWVBFX0k2NDsKKyAgICAgICAgICAgIHRyZXh3ID0gUF9SRVhXOworICAgICAgICB9CisgICAgICAgIGlmIChUQ0dfVFlQRV9QVFIgPT0gVENHX1RZUEVfSTY0KSB7CisgICAgICAgICAgICBodHlwZSA9IFRDR19UWVBFX0k2NDsKKyAgICAgICAgICAgIGhyZXh3ID0gUF9SRVhXOworICAgICAgICB9CisgICAgfQorCisgICAgdGNnX291dF9tb3YocywgaHR5cGUsIHIwLCBhZGRybG8pOworICAgIHRjZ19vdXRfbW92KHMsIHR0eXBlLCByMSwgYWRkcmxvKTsKKworICAgIHRjZ19vdXRfc2hpZnRpKHMsIFNISUZUX1NIUiArIGhyZXh3LCByMCwKKyAgICAgICAgICAgICAgICAgICBUQVJHRVRfUEFHRV9CSVRTIC0gQ1BVX1RMQl9FTlRSWV9CSVRTKTsKKworICAgIHRnZW5fYXJpdGhpKHMsIEFSSVRIX0FORCArIHRyZXh3LCByMSwKKyAgICAgICAgICAgICAgICBUQVJHRVRfUEFHRV9NQVNLIHwgKCgxIDw8IHNfYml0cykgLSAxKSwgMCk7CisgICAgdGdlbl9hcml0aGkocywgQVJJVEhfQU5EICsgaHJleHcsIHIwLAorICAgICAgICAgICAgICAgIChDUFVfVExCX1NJWkUgLSAxKSA8PCBDUFVfVExCX0VOVFJZX0JJVFMsIDApOworCisgICAgdGNnX291dF9tb2RybV9zaWJfb2Zmc2V0KHMsIE9QQ19MRUEgKyBocmV4dywgcjAsIFRDR19BUkVHMCwgcjAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKENQVUFyY2hTdGF0ZSwgdGxiX3RhYmxlW21lbV9pbmRleF1bMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgd2hpY2gpOworCisgICAgLyogY21wIDAocjApLCByMSAqLworICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19DTVBfR3ZFdiArIHRyZXh3LCByMSwgcjAsIDApOworCisgICAgLyogUHJlcGFyZSBmb3IgYm90aCB0aGUgZmFzdCBwYXRoIGFkZCBvZiB0aGUgdGxiIGFkZGVuZCwgYW5kIHRoZSBzbG93CisgICAgICAgcGF0aCBmdW5jdGlvbiBhcmd1bWVudCBzZXR1cC4gIFRoZXJlIGFyZSB0d28gY2FzZXMgd29ydGggbm90ZToKKyAgICAgICBGb3IgMzItYml0IGd1ZXN0IGFuZCB4ODZfNjQgaG9zdCwgTU9WTCB6ZXJvLWV4dGVuZHMgdGhlIGd1ZXN0IGFkZHJlc3MKKyAgICAgICBiZWZvcmUgdGhlIGZhc3RwYXRoIEFERFEgYmVsb3cuICBGb3IgNjQtYml0IGd1ZXN0IGFuZCB4MzIgaG9zdCwgTU9WUQorICAgICAgIGNvcGllcyB0aGUgZW50aXJlIGd1ZXN0IGFkZHJlc3MgZm9yIHRoZSBzbG93IHBhdGgsIHdoaWxlIHRydW5jYXRpb24KKyAgICAgICBmb3IgdGhlIDMyLWJpdCBob3N0IGhhcHBlbnMgd2l0aCB0aGUgZmFzdHBhdGggQURETCBiZWxvdy4gICovCisgICAgdGNnX291dF9tb3YocywgdHR5cGUsIHIxLCBhZGRybG8pOworCisgICAgLyogam5lIHNsb3dfcGF0aCAqLworICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19KQ0NfbG9uZyArIEpDQ19KTkUsIDAsIDAsIDApOworICAgIGxhYmVsX3B0clswXSA9IHMtPmNvZGVfcHRyOworICAgIHMtPmNvZGVfcHRyICs9IDQ7CisKKyAgICBpZiAoVEFSR0VUX0xPTkdfQklUUyA+IFRDR19UQVJHRVRfUkVHX0JJVFMpIHsKKyAgICAgICAgLyogY21wIDQocjApLCBhZGRyaGkgKi8KKyAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX0NNUF9HdkV2LCBhZGRyaGksIHIwLCA0KTsKKworICAgICAgICAvKiBqbmUgc2xvd19wYXRoICovCisgICAgICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19KQ0NfbG9uZyArIEpDQ19KTkUsIDAsIDAsIDApOworICAgICAgICBsYWJlbF9wdHJbMV0gPSBzLT5jb2RlX3B0cjsKKyAgICAgICAgcy0+Y29kZV9wdHIgKz0gNDsKKyAgICB9CisKKyAgICAvKiBUTEIgSGl0LiAgKi8KKworICAgIC8qIGFkZCBhZGRlbmQocjApLCByMSAqLworICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19BRERfR3ZFdiArIGhyZXh3LCByMSwgcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoQ1BVVExCRW50cnksIGFkZGVuZCkgLSB3aGljaCk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIGNvbnRleHQgb2YgYSBjYWxsIHRvIHRoZSBvdXQgb2YgbGluZSBoZWxwZXIgY29kZSBmb3IgdGhlIHNsb3cgcGF0aAorICogZm9yIGEgbG9hZCBvciBzdG9yZSwgc28gdGhhdCB3ZSBjYW4gbGF0ZXIgZ2VuZXJhdGUgdGhlIGNvcnJlY3QgaGVscGVyIGNvZGUKKyAqLworc3RhdGljIHZvaWQgYWRkX3FlbXVfbGRzdF9sYWJlbChUQ0dDb250ZXh0ICpzLCBpbnQgaXNfbGQsIFRDR01lbU9wIG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHUmVnIGRhdGFsbywgVENHUmVnIGRhdGFoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHUmVnIGFkZHJsbywgVENHUmVnIGFkZHJoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lbV9pbmRleCwgdWludDhfdCAqcmFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipsYWJlbF9wdHIpCit7CisgICAgVENHTGFiZWxRZW11TGRzdCAqbGFiZWwgPSBuZXdfbGRzdF9sYWJlbChzKTsKKworICAgIGxhYmVsLT5pc19sZCA9IGlzX2xkOworICAgIGxhYmVsLT5vcGMgPSBvcGM7CisgICAgbGFiZWwtPmRhdGFsb19yZWcgPSBkYXRhbG87CisgICAgbGFiZWwtPmRhdGFoaV9yZWcgPSBkYXRhaGk7CisgICAgbGFiZWwtPmFkZHJsb19yZWcgPSBhZGRybG87CisgICAgbGFiZWwtPmFkZHJoaV9yZWcgPSBhZGRyaGk7CisgICAgbGFiZWwtPm1lbV9pbmRleCA9IG1lbV9pbmRleDsKKyAgICBsYWJlbC0+cmFkZHIgPSByYWRkcjsKKyAgICBsYWJlbC0+bGFiZWxfcHRyWzBdID0gbGFiZWxfcHRyWzBdOworICAgIGlmIChUQVJHRVRfTE9OR19CSVRTID4gVENHX1RBUkdFVF9SRUdfQklUUykgeworICAgICAgICBsYWJlbC0+bGFiZWxfcHRyWzFdID0gbGFiZWxfcHRyWzFdOworICAgIH0KK30KKworLyoKKyAqIEdlbmVyYXRlIGNvZGUgZm9yIHRoZSBzbG93IHBhdGggZm9yIGEgbG9hZCBhdCB0aGUgZW5kIG9mIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIHRjZ19vdXRfcWVtdV9sZF9zbG93X3BhdGgoVENHQ29udGV4dCAqcywgVENHTGFiZWxRZW11TGRzdCAqbCkKK3sKKyAgICBUQ0dNZW1PcCBvcGMgPSBsLT5vcGM7CisgICAgVENHUmVnIGRhdGFfcmVnOworICAgIHVpbnQ4X3QgKipsYWJlbF9wdHIgPSAmbC0+bGFiZWxfcHRyWzBdOworCisgICAgLyogcmVzb2x2ZSBsYWJlbCBhZGRyZXNzICovCisgICAgKih1aW50MzJfdCAqKWxhYmVsX3B0clswXSA9ICh1aW50MzJfdCkocy0+Y29kZV9wdHIgLSBsYWJlbF9wdHJbMF0gLSA0KTsKKyAgICBpZiAoVEFSR0VUX0xPTkdfQklUUyA+IFRDR19UQVJHRVRfUkVHX0JJVFMpIHsKKyAgICAgICAgKih1aW50MzJfdCAqKWxhYmVsX3B0clsxXSA9ICh1aW50MzJfdCkocy0+Y29kZV9wdHIgLSBsYWJlbF9wdHJbMV0gLSA0KTsKKyAgICB9CisKKyAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMikgeworICAgICAgICBpbnQgb2ZzID0gMDsKKworICAgICAgICB0Y2dfb3V0X3N0KHMsIFRDR19UWVBFX1BUUiwgVENHX0FSRUcwLCBUQ0dfUkVHX0VTUCwgb2ZzKTsKKyAgICAgICAgb2ZzICs9IDQ7CisKKyAgICAgICAgdGNnX291dF9zdChzLCBUQ0dfVFlQRV9JMzIsIGwtPmFkZHJsb19yZWcsIFRDR19SRUdfRVNQLCBvZnMpOworICAgICAgICBvZnMgKz0gNDsKKworICAgICAgICBpZiAoVEFSR0VUX0xPTkdfQklUUyA9PSA2NCkgeworICAgICAgICAgICAgdGNnX291dF9zdChzLCBUQ0dfVFlQRV9JMzIsIGwtPmFkZHJoaV9yZWcsIFRDR19SRUdfRVNQLCBvZnMpOworICAgICAgICAgICAgb2ZzICs9IDQ7CisgICAgICAgIH0KKworICAgICAgICB0Y2dfb3V0X3N0aShzLCBUQ0dfVFlQRV9JMzIsIFRDR19SRUdfRVNQLCBvZnMsIGwtPm1lbV9pbmRleCk7CisgICAgICAgIG9mcyArPSA0OworCisgICAgICAgIHRjZ19vdXRfc3RpKHMsIFRDR19UWVBFX0kzMiwgVENHX1JFR19FU1AsIG9mcywgKHVpbnRwdHJfdClsLT5yYWRkcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfUFRSLCB0Y2dfdGFyZ2V0X2NhbGxfaWFyZ19yZWdzWzBdLCBUQ0dfQVJFRzApOworICAgICAgICAvKiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIGFscmVhZHkgbG9hZGVkIHdpdGggYWRkcmxvLiAgKi8KKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0kzMiwgdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1syXSwKKyAgICAgICAgICAgICAgICAgICAgIGwtPm1lbV9pbmRleCk7CisgICAgICAgIHRjZ19vdXRfbW92aShzLCBUQ0dfVFlQRV9QVFIsIHRjZ190YXJnZXRfY2FsbF9pYXJnX3JlZ3NbM10sCisgICAgICAgICAgICAgICAgICAgICAodWludHB0cl90KWwtPnJhZGRyKTsKKyAgICB9CisKKyAgICB0Y2dfb3V0X2NhbGxpKHMsICh1aW50cHRyX3QpcWVtdV9sZF9oZWxwZXJzW29wYyAmIH5NT19TSUdOXSk7CisKKyAgICBkYXRhX3JlZyA9IGwtPmRhdGFsb19yZWc7CisgICAgc3dpdGNoIChvcGMgJiBNT19TU0laRSkgeworICAgIGNhc2UgTU9fU0I6CisgICAgICAgIHRjZ19vdXRfZXh0OHMocywgZGF0YV9yZWcsIFRDR19SRUdfRUFYLCBQX1JFWFcpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PX1NXOgorICAgICAgICB0Y2dfb3V0X2V4dDE2cyhzLCBkYXRhX3JlZywgVENHX1JFR19FQVgsIFBfUkVYVyk7CisgICAgICAgIGJyZWFrOworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBjYXNlIE1PX1NMOgorICAgICAgICB0Y2dfb3V0X2V4dDMycyhzLCBkYXRhX3JlZywgVENHX1JFR19FQVgpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgTU9fVUI6CisgICAgY2FzZSBNT19VVzoKKyAgICAgICAgLyogTm90ZSB0aGF0IHRoZSBoZWxwZXJzIGhhdmUgemVyby1leHRlbmRlZCB0byB0Y2dfdGFyZ2V0X2xvbmcuICAqLworICAgIGNhc2UgTU9fVUw6CisgICAgICAgIHRjZ19vdXRfbW92KHMsIFRDR19UWVBFX0kzMiwgZGF0YV9yZWcsIFRDR19SRUdfRUFYKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT19ROgorICAgICAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTY0LCBkYXRhX3JlZywgVENHX1JFR19SQVgpOworICAgICAgICB9IGVsc2UgaWYgKGRhdGFfcmVnID09IFRDR19SRUdfRURYKSB7CisgICAgICAgICAgICAvKiB4Y2hnICVlZHgsICVlYXggKi8KKyAgICAgICAgICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19YQ0hHX2F4X3IzMiArIFRDR19SRUdfRURYLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIHRjZ19vdXRfbW92KHMsIFRDR19UWVBFX0kzMiwgbC0+ZGF0YWhpX3JlZywgVENHX1JFR19FQVgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTMyLCBkYXRhX3JlZywgVENHX1JFR19FQVgpOworICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTMyLCBsLT5kYXRhaGlfcmVnLCBUQ0dfUkVHX0VEWCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorCisgICAgLyogSnVtcCB0byB0aGUgY29kZSBjb3JyZXNwb25kaW5nIHRvIG5leHQgSVIgb2YgcWVtdV9zdCAqLworICAgIHRjZ19vdXRfam1wKHMsICh1aW50cHRyX3QpbC0+cmFkZHIpOworfQorCisvKgorICogR2VuZXJhdGUgY29kZSBmb3IgdGhlIHNsb3cgcGF0aCBmb3IgYSBzdG9yZSBhdCB0aGUgZW5kIG9mIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIHRjZ19vdXRfcWVtdV9zdF9zbG93X3BhdGgoVENHQ29udGV4dCAqcywgVENHTGFiZWxRZW11TGRzdCAqbCkKK3sKKyAgICBUQ0dNZW1PcCBvcGMgPSBsLT5vcGM7CisgICAgVENHTWVtT3Agc19iaXRzID0gb3BjICYgTU9fU0laRTsKKyAgICB1aW50OF90ICoqbGFiZWxfcHRyID0gJmwtPmxhYmVsX3B0clswXTsKKyAgICBUQ0dSZWcgcmV0YWRkcjsKKworICAgIC8qIHJlc29sdmUgbGFiZWwgYWRkcmVzcyAqLworICAgICoodWludDMyX3QgKilsYWJlbF9wdHJbMF0gPSAodWludDMyX3QpKHMtPmNvZGVfcHRyIC0gbGFiZWxfcHRyWzBdIC0gNCk7CisgICAgaWYgKFRBUkdFVF9MT05HX0JJVFMgPiBUQ0dfVEFSR0VUX1JFR19CSVRTKSB7CisgICAgICAgICoodWludDMyX3QgKilsYWJlbF9wdHJbMV0gPSAodWludDMyX3QpKHMtPmNvZGVfcHRyIC0gbGFiZWxfcHRyWzFdIC0gNCk7CisgICAgfQorCisgICAgaWYgKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIpIHsKKyAgICAgICAgaW50IG9mcyA9IDA7CisKKyAgICAgICAgdGNnX291dF9zdChzLCBUQ0dfVFlQRV9QVFIsIFRDR19BUkVHMCwgVENHX1JFR19FU1AsIG9mcyk7CisgICAgICAgIG9mcyArPSA0OworCisgICAgICAgIHRjZ19vdXRfc3QocywgVENHX1RZUEVfSTMyLCBsLT5hZGRybG9fcmVnLCBUQ0dfUkVHX0VTUCwgb2ZzKTsKKyAgICAgICAgb2ZzICs9IDQ7CisKKyAgICAgICAgaWYgKFRBUkdFVF9MT05HX0JJVFMgPT0gNjQpIHsKKyAgICAgICAgICAgIHRjZ19vdXRfc3QocywgVENHX1RZUEVfSTMyLCBsLT5hZGRyaGlfcmVnLCBUQ0dfUkVHX0VTUCwgb2ZzKTsKKyAgICAgICAgICAgIG9mcyArPSA0OworICAgICAgICB9CisKKyAgICAgICAgdGNnX291dF9zdChzLCBUQ0dfVFlQRV9JMzIsIGwtPmRhdGFsb19yZWcsIFRDR19SRUdfRVNQLCBvZnMpOworICAgICAgICBvZnMgKz0gNDsKKworICAgICAgICBpZiAoc19iaXRzID09IE1PXzY0KSB7CisgICAgICAgICAgICB0Y2dfb3V0X3N0KHMsIFRDR19UWVBFX0kzMiwgbC0+ZGF0YWhpX3JlZywgVENHX1JFR19FU1AsIG9mcyk7CisgICAgICAgICAgICBvZnMgKz0gNDsKKyAgICAgICAgfQorCisgICAgICAgIHRjZ19vdXRfc3RpKHMsIFRDR19UWVBFX0kzMiwgVENHX1JFR19FU1AsIG9mcywgbC0+bWVtX2luZGV4KTsKKyAgICAgICAgb2ZzICs9IDQ7CisKKyAgICAgICAgcmV0YWRkciA9IFRDR19SRUdfRUFYOworICAgICAgICB0Y2dfb3V0X21vdmkocywgVENHX1RZUEVfSTMyLCByZXRhZGRyLCAodWludHB0cl90KWwtPnJhZGRyKTsKKyAgICAgICAgdGNnX291dF9zdChzLCBUQ0dfVFlQRV9JMzIsIHJldGFkZHIsIFRDR19SRUdfRVNQLCBvZnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19vdXRfbW92KHMsIFRDR19UWVBFX1BUUiwgdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1swXSwgVENHX0FSRUcwKTsKKyAgICAgICAgLyogVGhlIHNlY29uZCBhcmd1bWVudCBpcyBhbHJlYWR5IGxvYWRlZCB3aXRoIGFkZHJsby4gICovCisgICAgICAgIHRjZ19vdXRfbW92KHMsIChzX2JpdHMgPT0gTU9fNjQgPyBUQ0dfVFlQRV9JNjQgOiBUQ0dfVFlQRV9JMzIpLAorICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2NhbGxfaWFyZ19yZWdzWzJdLCBsLT5kYXRhbG9fcmVnKTsKKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0kzMiwgdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1szXSwKKyAgICAgICAgICAgICAgICAgICAgIGwtPm1lbV9pbmRleCk7CisKKyAgICAgICAgaWYgKEFSUkFZX1NJWkUodGNnX3RhcmdldF9jYWxsX2lhcmdfcmVncykgPiA0KSB7CisgICAgICAgICAgICByZXRhZGRyID0gdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1s0XTsKKyAgICAgICAgICAgIHRjZ19vdXRfbW92aShzLCBUQ0dfVFlQRV9QVFIsIHJldGFkZHIsICh1aW50cHRyX3QpbC0+cmFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0YWRkciA9IFRDR19SRUdfUkFYOworICAgICAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX1BUUiwgcmV0YWRkciwgKHVpbnRwdHJfdClsLT5yYWRkcik7CisgICAgICAgICAgICB0Y2dfb3V0X3N0KHMsIFRDR19UWVBFX1BUUiwgcmV0YWRkciwgVENHX1JFR19FU1AsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogIlRhaWwgY2FsbCIgdG8gdGhlIGhlbHBlciwgd2l0aCB0aGUgcmV0dXJuIGFkZHJlc3MgYmFjayBpbmxpbmUuICAqLworICAgIHRjZ19vdXRfcHVzaChzLCByZXRhZGRyKTsKKyAgICB0Y2dfb3V0X2ptcChzLCAodWludHB0cl90KXFlbXVfc3RfaGVscGVyc1tvcGNdKTsKK30KKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgZGVmaW5lZChfX2xpbnV4X18pCisjIGluY2x1ZGUgPGFzbS9wcmN0bC5oPgorIyBpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworaW50IGFyY2hfcHJjdGwoaW50IGNvZGUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKK3N0YXRpYyBpbnQgZ3Vlc3RfYmFzZV9mbGFnczsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9ndWVzdF9iYXNlX3NlZyh2b2lkKQoreworICAgIGlmIChhcmNoX3ByY3RsKEFSQ0hfU0VUX0dTLCBHVUVTVF9CQVNFKSA9PSAwKSB7CisgICAgICAgIGd1ZXN0X2Jhc2VfZmxhZ3MgPSBQX0dTOworICAgIH0KK30KKyNlbHNlCisjIGRlZmluZSBndWVzdF9iYXNlX2ZsYWdzIDAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXR1cF9ndWVzdF9iYXNlX3NlZyh2b2lkKSB7IH0KKyNlbmRpZiAvKiBTT0ZUTU1VICovCisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfcWVtdV9sZF9kaXJlY3QoVENHQ29udGV4dCAqcywgVENHUmVnIGRhdGFsbywgVENHUmVnIGRhdGFoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHUmVnIGJhc2UsIGludHB0cl90IG9mcywgaW50IHNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHTWVtT3AgbWVtb3ApCit7CisgICAgY29uc3QgVENHTWVtT3AgcmVhbF9ic3dhcCA9IG1lbW9wICYgTU9fQlNXQVA7CisgICAgVENHTWVtT3AgYnN3YXAgPSByZWFsX2Jzd2FwOworICAgIGludCBtb3ZvcCA9IE9QQ19NT1ZMX0d2RXY7CisKKyAgICBpZiAoaGF2ZV9tb3ZiZSAmJiByZWFsX2Jzd2FwKSB7CisgICAgICAgIGJzd2FwID0gMDsKKyAgICAgICAgbW92b3AgPSBPUENfTU9WQkVfR3lNeTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1lbW9wICYgTU9fU1NJWkUpIHsKKyAgICBjYXNlIE1PX1VCOgorICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WWkJMICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9fU0I6CisgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZTQkwgKyBQX1JFWFcgKyBzZWcsIGRhdGFsbywgYmFzZSwgb2ZzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNT19VVzoKKyAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX01PVlpXTCArIHNlZywgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICBpZiAocmVhbF9ic3dhcCkgeworICAgICAgICAgICAgdGNnX291dF9yb2x3XzgocywgZGF0YWxvKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PX1NXOgorICAgICAgICBpZiAocmVhbF9ic3dhcCkgeworICAgICAgICAgICAgaWYgKGhhdmVfbW92YmUpIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WQkVfR3lNeSArIFBfREFUQTE2ICsgc2VnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFsbywgYmFzZSwgb2ZzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WWldMICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgICAgICB0Y2dfb3V0X3JvbHdfOChzLCBkYXRhbG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfTU9WU1dMICsgUF9SRVhXLCBkYXRhbG8sIGRhdGFsbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WU1dMICsgUF9SRVhXICsgc2VnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9fVUw6CisgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG1vdm9wICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgIGlmIChic3dhcCkgeworICAgICAgICAgICAgdGNnX291dF9ic3dhcDMyKHMsIGRhdGFsbyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorICAgIGNhc2UgTU9fU0w6CisgICAgICAgIGlmIChyZWFsX2Jzd2FwKSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBtb3ZvcCArIHNlZywgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICBpZiAoYnN3YXApIHsKKyAgICAgICAgICAgIHRjZ19vdXRfYnN3YXAzMihzLCBkYXRhbG8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX291dF9leHQzMnMocywgZGF0YWxvLCBkYXRhbG8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX01PVlNMUSArIHNlZywgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBNT19ROgorICAgICAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkgeworICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgbW92b3AgKyBQX1JFWFcgKyBzZWcsIGRhdGFsbywgYmFzZSwgb2ZzKTsKKyAgICAgICAgICAgIGlmIChic3dhcCkgeworICAgICAgICAgICAgICAgIHRjZ19vdXRfYnN3YXA2NChzLCBkYXRhbG8pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlYWxfYnN3YXApIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IGRhdGFsbzsKKyAgICAgICAgICAgICAgICBkYXRhbG8gPSBkYXRhaGk7CisgICAgICAgICAgICAgICAgZGF0YWhpID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiYXNlICE9IGRhdGFsbykgeworICAgICAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG1vdm9wICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgbW92b3AgKyBzZWcsIGRhdGFoaSwgYmFzZSwgb2ZzICsgNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG1vdm9wICsgc2VnLCBkYXRhaGksIGJhc2UsIG9mcyArIDQpOworICAgICAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIG1vdm9wICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnN3YXApIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X2Jzd2FwMzIocywgZGF0YWxvKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X2Jzd2FwMzIocywgZGF0YWhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICB9Cit9CisKKy8qIFhYWDogcWVtdV9sZCBhbmQgcWVtdV9zdCBjb3VsZCBiZSBtb2RpZmllZCB0byBjbG9iYmVyIG9ubHkgRURYIGFuZAorICAgRUFYLiBJdCB3aWxsIGJlIHVzZWZ1bCBvbmNlIGZpeGVkIHJlZ2lzdGVycyBnbG9iYWxzIGFyZSBsZXNzCisgICBjb21tb24uICovCitzdGF0aWMgdm9pZCB0Y2dfb3V0X3FlbXVfbGQoVENHQ29udGV4dCAqcywgY29uc3QgVENHQXJnICphcmdzLCBib29sIGlzNjQpCit7CisgICAgVENHUmVnIGRhdGFsbywgZGF0YWhpLCBhZGRybG87CisgICAgVENHUmVnIGFkZHJoaSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKTsKKyAgICBUQ0dNZW1PcCBvcGM7CisjaWYgZGVmaW5lZChDT05GSUdfU09GVE1NVSkKKyAgICBpbnQgbWVtX2luZGV4OworICAgIFRDR01lbU9wIHNfYml0czsKKyAgICB1aW50OF90ICpsYWJlbF9wdHJbMl07CisjZW5kaWYKKworICAgIGRhdGFsbyA9ICphcmdzKys7CisgICAgZGF0YWhpID0gKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIgJiYgaXM2NCA/ICphcmdzKysgOiAwKTsKKyAgICBhZGRybG8gPSAqYXJncysrOworICAgIGFkZHJoaSA9IChUQVJHRVRfTE9OR19CSVRTID4gVENHX1RBUkdFVF9SRUdfQklUUyA/ICphcmdzKysgOiAwKTsKKyAgICBvcGMgPSAqYXJncysrOworCisjaWYgZGVmaW5lZChDT05GSUdfU09GVE1NVSkKKyAgICBtZW1faW5kZXggPSAqYXJncysrOworICAgIHNfYml0cyA9IG9wYyAmIE1PX1NJWkU7CisKKyAgICB0Y2dfb3V0X3RsYl9sb2FkKHMsIGFkZHJsbywgYWRkcmhpLCBtZW1faW5kZXgsIHNfYml0cywKKyAgICAgICAgICAgICAgICAgICAgIGxhYmVsX3B0ciwgb2Zmc2V0b2YoQ1BVVExCRW50cnksIGFkZHJfcmVhZCkpOworCisgICAgLyogVExCIEhpdC4gICovCisgICAgdGNnX291dF9xZW11X2xkX2RpcmVjdChzLCBkYXRhbG8sIGRhdGFoaSwgVENHX1JFR19MMSwgMCwgMCwgb3BjKTsKKworICAgIC8qIFJlY29yZCB0aGUgY3VycmVudCBjb250ZXh0IG9mIGEgbG9hZCBpbnRvIGxkc3QgbGFiZWwgKi8KKyAgICBhZGRfcWVtdV9sZHN0X2xhYmVsKHMsIDEsIG9wYywgZGF0YWxvLCBkYXRhaGksIGFkZHJsbywgYWRkcmhpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2luZGV4LCBzLT5jb2RlX3B0ciwgbGFiZWxfcHRyKTsKKyNlbHNlCisgICAgeworICAgICAgICBpbnQzMl90IG9mZnNldCA9IEdVRVNUX0JBU0U7CisgICAgICAgIFRDR1JlZyBiYXNlID0gYWRkcmxvOworICAgICAgICBpbnQgc2VnID0gMDsKKworICAgICAgICAvKiA/Pz8gV2UgYXNzdW1lIGFsbCBvcGVyYXRpb25zIGhhdmUgbGVmdCB1cyB3aXRoIHJlZ2lzdGVyIGNvbnRlbnRzCisgICAgICAgICAgIHRoYXQgYXJlIHplcm8gZXh0ZW5kZWQuICBTbyBmYXIgdGhpcyBhcHBlYXJzIHRvIGJlIHRydWUuICBJZiB3ZQorICAgICAgICAgICB3YW50IHRvIGVuZm9yY2UgdGhpcywgd2UgY2FuIGVpdGhlciBkbyBhbiBleHBsaWNpdCB6ZXJvLWV4dGVuc2lvbgorICAgICAgICAgICBoZXJlLCBvciAoaWYgR1VFU1RfQkFTRSA9PSAwLCBvciBhIHNlZ21lbnQgcmVnaXN0ZXIgaXMgaW4gdXNlKQorICAgICAgICAgICB1c2UgdGhlIEFERFIzMiBwcmVmaXguICBGb3Igbm93LCBkbyBub3RoaW5nLiAgKi8KKyAgICAgICAgaWYgKEdVRVNUX0JBU0UgJiYgZ3Vlc3RfYmFzZV9mbGFncykgeworICAgICAgICAgICAgc2VnID0gZ3Vlc3RfYmFzZV9mbGFnczsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCAmJiBvZmZzZXQgIT0gR1VFU1RfQkFTRSkgeworICAgICAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0k2NCwgVENHX1JFR19MMSwgR1VFU1RfQkFTRSk7CisgICAgICAgICAgICB0Z2VuX2FyaXRocihzLCBBUklUSF9BREQgKyBQX1JFWFcsIFRDR19SRUdfTDEsIGJhc2UpOworICAgICAgICAgICAgYmFzZSA9IFRDR19SRUdfTDE7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgdGNnX291dF9xZW11X2xkX2RpcmVjdChzLCBkYXRhbG8sIGRhdGFoaSwgYmFzZSwgb2Zmc2V0LCBzZWcsIG9wYyk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfcWVtdV9zdF9kaXJlY3QoVENHQ29udGV4dCAqcywgVENHUmVnIGRhdGFsbywgVENHUmVnIGRhdGFoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHUmVnIGJhc2UsIGludHB0cl90IG9mcywgaW50IHNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHTWVtT3AgbWVtb3ApCit7CisKKyAgICAvKiA/Pz8gSWRlYWxseSB3ZSB3b3VsZG4ndCBuZWVkIGEgc2NyYXRjaCByZWdpc3Rlci4gIEZvciB1c2VyLW9ubHksCisgICAgICAgd2UgY291bGQgcGVyZm9ybSB0aGUgYnN3YXAgdHdpY2UgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgICBpbnN0ZWFkIG9mIG1vdmluZyB0byB0aGUgc2NyYXRjaC4gIEJ1dCBhcyBpdCBpcywgdGhlIEwgY29uc3RyYWludAorICAgICAgIG1lYW5zIHRoYXQgVENHX1JFR19MMCBpcyBkZWZpbml0ZWx5IGZyZWUgaGVyZS4gICovCisgICAgY29uc3QgVENHUmVnIHNjcmF0Y2ggPSBUQ0dfUkVHX0wwOworICAgIGNvbnN0IFRDR01lbU9wIHJlYWxfYnN3YXAgPSBtZW1vcCAmIE1PX0JTV0FQOworICAgIFRDR01lbU9wIGJzd2FwID0gcmVhbF9ic3dhcDsKKyAgICBpbnQgbW92b3AgPSBPUENfTU9WTF9Fdkd2OworCisgICAgaWYgKGhhdmVfbW92YmUgJiYgcmVhbF9ic3dhcCkgeworICAgICAgICBic3dhcCA9IDA7CisgICAgICAgIG1vdm9wID0gT1BDX01PVkJFX015R3k7CisgICAgfQorCisgICAgc3dpdGNoIChtZW1vcCAmIE1PX1NJWkUpIHsKKyAgICBjYXNlIE1PXzg6CisgICAgICAgIC8qIEluIDMyLWJpdCBtb2RlLCA4LWJpdCBzdG9yZXMgY2FuIG9ubHkgaGFwcGVuIGZyb20gW2FiY2RdeC4KKyAgICAgICAgICAgVXNlIHRoZSBzY3JhdGNoIHJlZ2lzdGVyIGlmIG5lY2Vzc2FyeS4gICovCisgICAgICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyICYmIGRhdGFsbyA+PSA0KSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vdihzLCBUQ0dfVFlQRV9JMzIsIHNjcmF0Y2gsIGRhdGFsbyk7CisgICAgICAgICAgICBkYXRhbG8gPSBzY3JhdGNoOworICAgICAgICB9CisgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZCX0V2R3YgKyBQX1JFWEJfUiArIHNlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PXzE2OgorICAgICAgICBpZiAoYnN3YXApIHsKKyAgICAgICAgICAgIHRjZ19vdXRfbW92KHMsIFRDR19UWVBFX0kzMiwgc2NyYXRjaCwgZGF0YWxvKTsKKyAgICAgICAgICAgIHRjZ19vdXRfcm9sd184KHMsIHNjcmF0Y2gpOworICAgICAgICAgICAgZGF0YWxvID0gc2NyYXRjaDsKKyAgICAgICAgfQorICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBtb3ZvcCArIFBfREFUQTE2ICsgc2VnLCBkYXRhbG8sIGJhc2UsIG9mcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9fMzI6CisgICAgICAgIGlmIChic3dhcCkgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTMyLCBzY3JhdGNoLCBkYXRhbG8pOworICAgICAgICAgICAgdGNnX291dF9ic3dhcDMyKHMsIHNjcmF0Y2gpOworICAgICAgICAgICAgZGF0YWxvID0gc2NyYXRjaDsKKyAgICAgICAgfQorICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBtb3ZvcCArIHNlZywgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PXzY0OgorICAgICAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkgeworICAgICAgICAgICAgaWYgKGJzd2FwKSB7CisgICAgICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTY0LCBzY3JhdGNoLCBkYXRhbG8pOworICAgICAgICAgICAgICAgIHRjZ19vdXRfYnN3YXA2NChzLCBzY3JhdGNoKTsKKyAgICAgICAgICAgICAgICBkYXRhbG8gPSBzY3JhdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgbW92b3AgKyBQX1JFWFcgKyBzZWcsIGRhdGFsbywgYmFzZSwgb2ZzKTsKKyAgICAgICAgfSBlbHNlIGlmIChic3dhcCkgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfSTMyLCBzY3JhdGNoLCBkYXRhaGkpOworICAgICAgICAgICAgdGNnX291dF9ic3dhcDMyKHMsIHNjcmF0Y2gpOworICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX01PVkxfRXZHdiArIHNlZywgc2NyYXRjaCwgYmFzZSwgb2ZzKTsKKyAgICAgICAgICAgIHRjZ19vdXRfbW92KHMsIFRDR19UWVBFX0kzMiwgc2NyYXRjaCwgZGF0YWxvKTsKKyAgICAgICAgICAgIHRjZ19vdXRfYnN3YXAzMihzLCBzY3JhdGNoKTsKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZMX0V2R3YgKyBzZWcsIHNjcmF0Y2gsIGJhc2UsIG9mcys0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZWFsX2Jzd2FwKSB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBkYXRhbG87CisgICAgICAgICAgICAgICAgZGF0YWxvID0gZGF0YWhpOworICAgICAgICAgICAgICAgIGRhdGFoaSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBtb3ZvcCArIHNlZywgZGF0YWxvLCBiYXNlLCBvZnMpOworICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgbW92b3AgKyBzZWcsIGRhdGFoaSwgYmFzZSwgb2ZzKzQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGNnX291dF9xZW11X3N0KFRDR0NvbnRleHQgKnMsIGNvbnN0IFRDR0FyZyAqYXJncywgYm9vbCBpczY0KQoreworICAgIFRDR1JlZyBkYXRhbG8sIGRhdGFoaSwgYWRkcmxvOworICAgIFRDR1JlZyBhZGRyaGkgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CisgICAgVENHTWVtT3Agb3BjOworI2lmIGRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisgICAgaW50IG1lbV9pbmRleDsKKyAgICBUQ0dNZW1PcCBzX2JpdHM7CisgICAgdWludDhfdCAqbGFiZWxfcHRyWzJdOworI2VuZGlmCisKKyAgICBkYXRhbG8gPSAqYXJncysrOworICAgIGRhdGFoaSA9IChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyICYmIGlzNjQgPyAqYXJncysrIDogMCk7CisgICAgYWRkcmxvID0gKmFyZ3MrKzsKKyAgICBhZGRyaGkgPSAoVEFSR0VUX0xPTkdfQklUUyA+IFRDR19UQVJHRVRfUkVHX0JJVFMgPyAqYXJncysrIDogMCk7CisgICAgb3BjID0gKmFyZ3MrKzsKKworI2lmIGRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisgICAgbWVtX2luZGV4ID0gKmFyZ3MrKzsKKyAgICBzX2JpdHMgPSBvcGMgJiBNT19TSVpFOworCisgICAgdGNnX291dF90bGJfbG9hZChzLCBhZGRybG8sIGFkZHJoaSwgbWVtX2luZGV4LCBzX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICBsYWJlbF9wdHIsIG9mZnNldG9mKENQVVRMQkVudHJ5LCBhZGRyX3dyaXRlKSk7CisKKyAgICAvKiBUTEIgSGl0LiAgKi8KKyAgICB0Y2dfb3V0X3FlbXVfc3RfZGlyZWN0KHMsIGRhdGFsbywgZGF0YWhpLCBUQ0dfUkVHX0wxLCAwLCAwLCBvcGMpOworCisgICAgLyogUmVjb3JkIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgYSBzdG9yZSBpbnRvIGxkc3QgbGFiZWwgKi8KKyAgICBhZGRfcWVtdV9sZHN0X2xhYmVsKHMsIDAsIG9wYywgZGF0YWxvLCBkYXRhaGksIGFkZHJsbywgYWRkcmhpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2luZGV4LCBzLT5jb2RlX3B0ciwgbGFiZWxfcHRyKTsKKyNlbHNlCisgICAgeworICAgICAgICBpbnQzMl90IG9mZnNldCA9IEdVRVNUX0JBU0U7CisgICAgICAgIFRDR1JlZyBiYXNlID0gYWRkcmxvOworICAgICAgICBpbnQgc2VnID0gMDsKKworICAgICAgICAvKiA/Pz8gV2UgYXNzdW1lIGFsbCBvcGVyYXRpb25zIGhhdmUgbGVmdCB1cyB3aXRoIHJlZ2lzdGVyIGNvbnRlbnRzCisgICAgICAgICAgIHRoYXQgYXJlIHplcm8gZXh0ZW5kZWQuICBTbyBmYXIgdGhpcyBhcHBlYXJzIHRvIGJlIHRydWUuICBJZiB3ZQorICAgICAgICAgICB3YW50IHRvIGVuZm9yY2UgdGhpcywgd2UgY2FuIGVpdGhlciBkbyBhbiBleHBsaWNpdCB6ZXJvLWV4dGVuc2lvbgorICAgICAgICAgICBoZXJlLCBvciAoaWYgR1VFU1RfQkFTRSA9PSAwLCBvciBhIHNlZ21lbnQgcmVnaXN0ZXIgaXMgaW4gdXNlKQorICAgICAgICAgICB1c2UgdGhlIEFERFIzMiBwcmVmaXguICBGb3Igbm93LCBkbyBub3RoaW5nLiAgKi8KKyAgICAgICAgaWYgKEdVRVNUX0JBU0UgJiYgZ3Vlc3RfYmFzZV9mbGFncykgeworICAgICAgICAgICAgc2VnID0gZ3Vlc3RfYmFzZV9mbGFnczsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCAmJiBvZmZzZXQgIT0gR1VFU1RfQkFTRSkgeworICAgICAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX0k2NCwgVENHX1JFR19MMSwgR1VFU1RfQkFTRSk7CisgICAgICAgICAgICB0Z2VuX2FyaXRocihzLCBBUklUSF9BREQgKyBQX1JFWFcsIFRDR19SRUdfTDEsIGJhc2UpOworICAgICAgICAgICAgYmFzZSA9IFRDR19SRUdfTDE7CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgdGNnX291dF9xZW11X3N0X2RpcmVjdChzLCBkYXRhbG8sIGRhdGFoaSwgYmFzZSwgb2Zmc2V0LCBzZWcsIG9wYyk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X29wKFRDR0NvbnRleHQgKnMsIFRDR09wY29kZSBvcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUQ0dBcmcgKmFyZ3MsIGNvbnN0IGludCAqY29uc3RfYXJncykKK3sKKyAgICBpbnQgYywgdmV4b3AsIHJleHcgPSAwOworCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorIyBkZWZpbmUgT1BfMzJfNjQoeCkgXAorICAgICAgICBjYXNlIGdsdWUoZ2x1ZShJTkRFWF9vcF8sIHgpLCBfaTY0KTogXAorICAgICAgICAgICAgcmV4dyA9IFBfUkVYVzsgLyogRkFMTFRIUlUgKi8gICAgXAorICAgICAgICBjYXNlIGdsdWUoZ2x1ZShJTkRFWF9vcF8sIHgpLCBfaTMyKQorI2Vsc2UKKyMgZGVmaW5lIE9QXzMyXzY0KHgpIFwKKyAgICAgICAgY2FzZSBnbHVlKGdsdWUoSU5ERVhfb3BfLCB4KSwgX2kzMikKKyNlbmRpZgorCisgICAgc3dpdGNoKG9wYykgeworICAgIGNhc2UgSU5ERVhfb3BfZXhpdF90YjoKKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIFRDR19UWVBFX1BUUiwgVENHX1JFR19FQVgsIGFyZ3NbMF0pOworICAgICAgICB0Y2dfb3V0X2ptcChzLCAodWludHB0cl90KXRiX3JldF9hZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9nb3RvX3RiOgorICAgICAgICBpZiAocy0+dGJfam1wX29mZnNldCkgeworICAgICAgICAgICAgLyogZGlyZWN0IGp1bXAgbWV0aG9kICovCisgICAgICAgICAgICB0Y2dfb3V0OChzLCBPUENfSk1QX2xvbmcpOyAvKiBqbXAgaW0gKi8KKyAgICAgICAgICAgIHMtPnRiX2ptcF9vZmZzZXRbYXJnc1swXV0gPSBzLT5jb2RlX3B0ciAtIHMtPmNvZGVfYnVmOworICAgICAgICAgICAgdGNnX291dDMyKHMsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogaW5kaXJlY3QganVtcCBtZXRob2QgKi8KKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19HUlA1LCBFWFQ1X0pNUE5fRXYsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludHB0cl90KShzLT50Yl9uZXh0ICsgYXJnc1swXSkpOworICAgICAgICB9CisgICAgICAgIHMtPnRiX25leHRfb2Zmc2V0W2FyZ3NbMF1dID0gcy0+Y29kZV9wdHIgLSBzLT5jb2RlX2J1ZjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9jYWxsOgorICAgICAgICBpZiAoY29uc3RfYXJnc1swXSkgeworICAgICAgICAgICAgdGNnX291dF9jYWxsaShzLCBhcmdzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGNhbGwgKnJlZyAqLworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfR1JQNSwgRVhUNV9DQUxMTl9FdiwgYXJnc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9icjoKKyAgICAgICAgdGNnX291dF9qeHgocywgSkNDX0pNUCwgYXJnc1swXSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5ERVhfb3BfbW92aV9pMzI6CisgICAgICAgIHRjZ19vdXRfbW92aShzLCBUQ0dfVFlQRV9JMzIsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICBicmVhazsKKyAgICBPUF8zMl82NChsZDh1KToKKyAgICAgICAgLyogTm90ZSB0aGF0IHdlIGNhbiBpZ25vcmUgUkVYVyBmb3IgdGhlIHplcm8tZXh0ZW5kIHRvIDY0LWJpdC4gICovCisgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZaQkwsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICBicmVhazsKKyAgICBPUF8zMl82NChsZDhzKToKKyAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX01PVlNCTCArIHJleHcsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICBicmVhazsKKyAgICBPUF8zMl82NChsZDE2dSk6CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4gaWdub3JlIFJFWFcgZm9yIHRoZSB6ZXJvLWV4dGVuZCB0byA2NC1iaXQuICAqLworICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WWldMLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQobGQxNnMpOgorICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WU1dMICsgcmV4dywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgIGJyZWFrOworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBjYXNlIElOREVYX29wX2xkMzJ1X2k2NDoKKyNlbmRpZgorICAgIGNhc2UgSU5ERVhfb3BfbGRfaTMyOgorICAgICAgICB0Y2dfb3V0X2xkKHMsIFRDR19UWVBFX0kzMiwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgIGJyZWFrOworCisgICAgT1BfMzJfNjQoc3Q4KToKKyAgICAgICAgaWYgKGNvbnN0X2FyZ3NbMF0pIHsKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZCX0V2SXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgIHRjZ19vdXQ4KHMsIGFyZ3NbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF9tb2RybV9vZmZzZXQocywgT1BDX01PVkJfRXZHdiB8IFBfUkVYQl9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQoc3QxNik6CisgICAgICAgIGlmIChjb25zdF9hcmdzWzBdKSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WTF9Fdkl6IHwgUF9EQVRBMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgIHRjZ19vdXQxNihzLCBhcmdzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZMX0V2R3YgfCBQX0RBVEExNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBjYXNlIElOREVYX29wX3N0MzJfaTY0OgorI2VuZGlmCisgICAgY2FzZSBJTkRFWF9vcF9zdF9pMzI6CisgICAgICAgIGlmIChjb25zdF9hcmdzWzBdKSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfTU9WTF9Fdkl6LCAwLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgIHRjZ19vdXQzMihzLCBhcmdzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXRfc3QocywgVENHX1RZUEVfSTMyLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KGFkZCk6CisgICAgICAgIC8qIEZvciAzLW9wZXJhbmQgYWRkaXRpb24sIHVzZSBMRUEuICAqLworICAgICAgICBpZiAoYXJnc1swXSAhPSBhcmdzWzFdKSB7CisgICAgICAgICAgICBUQ0dBcmcgYTAgPSBhcmdzWzBdLCBhMSA9IGFyZ3NbMV0sIGEyID0gYXJnc1syXSwgYzMgPSAwOworCisgICAgICAgICAgICBpZiAoY29uc3RfYXJnc1syXSkgeworICAgICAgICAgICAgICAgIGMzID0gYTIsIGEyID0gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGEwID09IGEyKSB7CisgICAgICAgICAgICAgICAgLyogV2F0Y2ggb3V0IGZvciBkZXN0ID0gc3JjICsgZGVzdCwgc2luY2Ugd2UndmUgcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaGluZyBjb25zdHJhaW50IG9uIHRoZSBhZGQuICAqLworICAgICAgICAgICAgICAgIHRnZW5fYXJpdGhyKHMsIEFSSVRIX0FERCArIHJleHcsIGEwLCBhMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fc2liX29mZnNldChzLCBPUENfTEVBICsgcmV4dywgYTAsIGExLCBhMiwgMCwgYzMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYyA9IEFSSVRIX0FERDsKKyAgICAgICAgZ290byBnZW5fYXJpdGg7CisgICAgT1BfMzJfNjQoc3ViKToKKyAgICAgICAgYyA9IEFSSVRIX1NVQjsKKyAgICAgICAgZ290byBnZW5fYXJpdGg7CisgICAgT1BfMzJfNjQoYW5kKToKKyAgICAgICAgYyA9IEFSSVRIX0FORDsKKyAgICAgICAgZ290byBnZW5fYXJpdGg7CisgICAgT1BfMzJfNjQob3IpOgorICAgICAgICBjID0gQVJJVEhfT1I7CisgICAgICAgIGdvdG8gZ2VuX2FyaXRoOworICAgIE9QXzMyXzY0KHhvcik6CisgICAgICAgIGMgPSBBUklUSF9YT1I7CisgICAgICAgIGdvdG8gZ2VuX2FyaXRoOworICAgIGdlbl9hcml0aDoKKyAgICAgICAgaWYgKGNvbnN0X2FyZ3NbMl0pIHsKKyAgICAgICAgICAgIHRnZW5fYXJpdGhpKHMsIGMgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzJdLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRnZW5fYXJpdGhyKHMsIGMgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzJdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KGFuZGMpOgorICAgICAgICBpZiAoY29uc3RfYXJnc1syXSkgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgcmV4dyA/IFRDR19UWVBFX0k2NCA6IFRDR19UWVBFX0kzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgdGdlbl9hcml0aGkocywgQVJJVEhfQU5EICsgcmV4dywgYXJnc1swXSwgfmFyZ3NbMl0sIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF92ZXhfbW9kcm0ocywgT1BDX0FORE4gKyByZXh3LCBhcmdzWzBdLCBhcmdzWzJdLCBhcmdzWzFdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KG11bCk6CisgICAgICAgIGlmIChjb25zdF9hcmdzWzJdKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbDsKKyAgICAgICAgICAgIHZhbCA9IGFyZ3NbMl07CisgICAgICAgICAgICBpZiAodmFsID09IChpbnQ4X3QpdmFsKSB7CisgICAgICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfSU1VTF9HdkV2SWIgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0OChzLCB2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19JTVVMX0d2RXZJeiArIHJleHcsIGFyZ3NbMF0sIGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIHRjZ19vdXQzMihzLCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfSU1VTF9HdkV2ICsgcmV4dywgYXJnc1swXSwgYXJnc1syXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBPUF8zMl82NChkaXYyKToKKyAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfR1JQM19FdiArIHJleHcsIEVYVDNfSURJViwgYXJnc1s0XSk7CisgICAgICAgIGJyZWFrOworICAgIE9QXzMyXzY0KGRpdnUyKToKKyAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfR1JQM19FdiArIHJleHcsIEVYVDNfRElWLCBhcmdzWzRdKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBPUF8zMl82NChzaGwpOgorICAgICAgICBjID0gU0hJRlRfU0hMOworICAgICAgICB2ZXhvcCA9IE9QQ19TSExYOworICAgICAgICBnb3RvIGdlbl9zaGlmdF9tYXliZV92ZXg7CisgICAgT1BfMzJfNjQoc2hyKToKKyAgICAgICAgYyA9IFNISUZUX1NIUjsKKyAgICAgICAgdmV4b3AgPSBPUENfU0hSWDsKKyAgICAgICAgZ290byBnZW5fc2hpZnRfbWF5YmVfdmV4OworICAgIE9QXzMyXzY0KHNhcik6CisgICAgICAgIGMgPSBTSElGVF9TQVI7CisgICAgICAgIHZleG9wID0gT1BDX1NBUlg7CisgICAgICAgIGdvdG8gZ2VuX3NoaWZ0X21heWJlX3ZleDsKKyAgICBPUF8zMl82NChyb3RsKToKKyAgICAgICAgYyA9IFNISUZUX1JPTDsKKyAgICAgICAgZ290byBnZW5fc2hpZnQ7CisgICAgT1BfMzJfNjQocm90cik6CisgICAgICAgIGMgPSBTSElGVF9ST1I7CisgICAgICAgIGdvdG8gZ2VuX3NoaWZ0OworICAgIGdlbl9zaGlmdF9tYXliZV92ZXg6CisgICAgICAgIGlmIChoYXZlX2JtaTIgJiYgIWNvbnN0X2FyZ3NbMl0pIHsKKyAgICAgICAgICAgIHRjZ19vdXRfdmV4X21vZHJtKHMsIHZleG9wICsgcmV4dywgYXJnc1swXSwgYXJnc1syXSwgYXJnc1sxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBGQUxMVEhSVSAqLworICAgIGdlbl9zaGlmdDoKKyAgICAgICAgaWYgKGNvbnN0X2FyZ3NbMl0pIHsKKyAgICAgICAgICAgIHRjZ19vdXRfc2hpZnRpKHMsIGMgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzJdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm0ocywgT1BDX1NISUZUX2NsICsgcmV4dywgYywgYXJnc1swXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElOREVYX29wX2JyY29uZF9pMzI6CisgICAgICAgIHRjZ19vdXRfYnJjb25kMzIocywgYXJnc1syXSwgYXJnc1swXSwgYXJnc1sxXSwgY29uc3RfYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzNdLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9zZXRjb25kX2kzMjoKKyAgICAgICAgdGNnX291dF9zZXRjb25kMzIocywgYXJnc1szXSwgYXJnc1swXSwgYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSwgY29uc3RfYXJnc1syXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5ERVhfb3BfbW92Y29uZF9pMzI6CisgICAgICAgIHRjZ19vdXRfbW92Y29uZDMyKHMsIGFyZ3NbNV0sIGFyZ3NbMF0sIGFyZ3NbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMl0sIGNvbnN0X2FyZ3NbMl0sIGFyZ3NbM10pOworICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KGJzd2FwMTYpOgorICAgICAgICB0Y2dfb3V0X3JvbHdfOChzLCBhcmdzWzBdKTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQoYnN3YXAzMik6CisgICAgICAgIHRjZ19vdXRfYnN3YXAzMihzLCBhcmdzWzBdKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBPUF8zMl82NChuZWcpOgorICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19HUlAzX0V2ICsgcmV4dywgRVhUM19ORUcsIGFyZ3NbMF0pOworICAgICAgICBicmVhazsKKyAgICBPUF8zMl82NChub3QpOgorICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19HUlAzX0V2ICsgcmV4dywgRVhUM19OT1QsIGFyZ3NbMF0pOworICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KGV4dDhzKToKKyAgICAgICAgdGNnX291dF9leHQ4cyhzLCBhcmdzWzBdLCBhcmdzWzFdLCByZXh3KTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQoZXh0MTZzKToKKyAgICAgICAgdGNnX291dF9leHQxNnMocywgYXJnc1swXSwgYXJnc1sxXSwgcmV4dyk7CisgICAgICAgIGJyZWFrOworICAgIE9QXzMyXzY0KGV4dDh1KToKKyAgICAgICAgdGNnX291dF9leHQ4dShzLCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQoZXh0MTZ1KToKKyAgICAgICAgdGNnX291dF9leHQxNnUocywgYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTkRFWF9vcF9xZW11X2xkX2kzMjoKKyAgICAgICAgdGNnX291dF9xZW11X2xkKHMsIGFyZ3MsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX3FlbXVfbGRfaTY0OgorICAgICAgICB0Y2dfb3V0X3FlbXVfbGQocywgYXJncywgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5ERVhfb3BfcWVtdV9zdF9pMzI6CisgICAgICAgIHRjZ19vdXRfcWVtdV9zdChzLCBhcmdzLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9xZW11X3N0X2k2NDoKKyAgICAgICAgdGNnX291dF9xZW11X3N0KHMsIGFyZ3MsIDEpOworICAgICAgICBicmVhazsKKworICAgIE9QXzMyXzY0KG11bHUyKToKKyAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfR1JQM19FdiArIHJleHcsIEVYVDNfTVVMLCBhcmdzWzNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQobXVsczIpOgorICAgICAgICB0Y2dfb3V0X21vZHJtKHMsIE9QQ19HUlAzX0V2ICsgcmV4dywgRVhUM19JTVVMLCBhcmdzWzNdKTsKKyAgICAgICAgYnJlYWs7CisgICAgT1BfMzJfNjQoYWRkMik6CisgICAgICAgIGlmIChjb25zdF9hcmdzWzRdKSB7CisgICAgICAgICAgICB0Z2VuX2FyaXRoaShzLCBBUklUSF9BREQgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzRdLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRnZW5fYXJpdGhyKHMsIEFSSVRIX0FERCArIHJleHcsIGFyZ3NbMF0sIGFyZ3NbNF0pOworICAgICAgICB9CisgICAgICAgIGlmIChjb25zdF9hcmdzWzVdKSB7CisgICAgICAgICAgICB0Z2VuX2FyaXRoaShzLCBBUklUSF9BREMgKyByZXh3LCBhcmdzWzFdLCBhcmdzWzVdLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRnZW5fYXJpdGhyKHMsIEFSSVRIX0FEQyArIHJleHcsIGFyZ3NbMV0sIGFyZ3NbNV0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIE9QXzMyXzY0KHN1YjIpOgorICAgICAgICBpZiAoY29uc3RfYXJnc1s0XSkgeworICAgICAgICAgICAgdGdlbl9hcml0aGkocywgQVJJVEhfU1VCICsgcmV4dywgYXJnc1swXSwgYXJnc1s0XSwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Z2VuX2FyaXRocihzLCBBUklUSF9TVUIgKyByZXh3LCBhcmdzWzBdLCBhcmdzWzRdKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3RfYXJnc1s1XSkgeworICAgICAgICAgICAgdGdlbl9hcml0aGkocywgQVJJVEhfU0JCICsgcmV4dywgYXJnc1sxXSwgYXJnc1s1XSwgMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Z2VuX2FyaXRocihzLCBBUklUSF9TQkIgKyByZXh3LCBhcmdzWzFdLCBhcmdzWzVdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICBjYXNlIElOREVYX29wX2JyY29uZDJfaTMyOgorICAgICAgICB0Y2dfb3V0X2JyY29uZDIocywgYXJncywgY29uc3RfYXJncywgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSU5ERVhfb3Bfc2V0Y29uZDJfaTMyOgorICAgICAgICB0Y2dfb3V0X3NldGNvbmQyKHMsIGFyZ3MsIGNvbnN0X2FyZ3MpOworICAgICAgICBicmVhazsKKyNlbHNlIC8qIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQgKi8KKyAgICBjYXNlIElOREVYX29wX21vdmlfaTY0OgorICAgICAgICB0Y2dfb3V0X21vdmkocywgVENHX1RZUEVfSTY0LCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9sZDMyc19pNjQ6CisgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZTTFEsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX2xkX2k2NDoKKyAgICAgICAgdGNnX291dF9sZChzLCBUQ0dfVFlQRV9JNjQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX3N0X2k2NDoKKyAgICAgICAgaWYgKGNvbnN0X2FyZ3NbMF0pIHsKKyAgICAgICAgICAgIHRjZ19vdXRfbW9kcm1fb2Zmc2V0KHMsIE9QQ19NT1ZMX0V2SXogfCBQX1JFWFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgICAgIHRjZ19vdXQzMihzLCBhcmdzWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRjZ19vdXRfc3QocywgVENHX1RZUEVfSTY0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSU5ERVhfb3BfYnJjb25kX2k2NDoKKyAgICAgICAgdGNnX291dF9icmNvbmQ2NChzLCBhcmdzWzJdLCBhcmdzWzBdLCBhcmdzWzFdLCBjb25zdF9hcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbM10sIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX3NldGNvbmRfaTY0OgorICAgICAgICB0Y2dfb3V0X3NldGNvbmQ2NChzLCBhcmdzWzNdLCBhcmdzWzBdLCBhcmdzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzJdLCBjb25zdF9hcmdzWzJdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTkRFWF9vcF9tb3Zjb25kX2k2NDoKKyAgICAgICAgdGNnX291dF9tb3Zjb25kNjQocywgYXJnc1s1XSwgYXJnc1swXSwgYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1syXSwgY29uc3RfYXJnc1syXSwgYXJnc1szXSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBJTkRFWF9vcF9ic3dhcDY0X2k2NDoKKyAgICAgICAgdGNnX291dF9ic3dhcDY0KHMsIGFyZ3NbMF0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX2V4dDMydV9pNjQ6CisgICAgICAgIHRjZ19vdXRfZXh0MzJ1KHMsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElOREVYX29wX2V4dDMyc19pNjQ6CisgICAgICAgIHRjZ19vdXRfZXh0MzJzKHMsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICBicmVhazsKKyNlbmRpZgorCisgICAgT1BfMzJfNjQoZGVwb3NpdCk6CisgICAgICAgIGlmIChhcmdzWzNdID09IDAgJiYgYXJnc1s0XSA9PSA4KSB7CisgICAgICAgICAgICAvKiBsb2FkIGJpdHMgMC4uNyAqLworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfTU9WQl9Fdkd2IHwgUF9SRVhCX1IgfCBQX1JFWEJfUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMl0sIGFyZ3NbMF0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbM10gPT0gOCAmJiBhcmdzWzRdID09IDgpIHsKKyAgICAgICAgICAgIC8qIGxvYWQgYml0cyA4Li4xNSAqLworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfTU9WQl9Fdkd2LCBhcmdzWzJdLCBhcmdzWzBdICsgNCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1szXSA9PSAwICYmIGFyZ3NbNF0gPT0gMTYpIHsKKyAgICAgICAgICAgIC8qIGxvYWQgYml0cyAwLi4xNSAqLworICAgICAgICAgICAgdGNnX291dF9tb2RybShzLCBPUENfTU9WTF9Fdkd2IHwgUF9EQVRBMTYsIGFyZ3NbMl0sIGFyZ3NbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICB9CisKKyN1bmRlZiBPUF8zMl82NAorfQorCitzdGF0aWMgY29uc3QgVENHVGFyZ2V0T3BEZWYgeDg2X29wX2RlZnNbXSA9IHsKKyAgICB7IElOREVYX29wX2V4aXRfdGIsIHsgfSB9LAorICAgIHsgSU5ERVhfb3BfZ290b190YiwgeyB9IH0sCisgICAgeyBJTkRFWF9vcF9jYWxsLCB7ICJyaSIgfSB9LAorICAgIHsgSU5ERVhfb3BfYnIsIHsgfSB9LAorICAgIHsgSU5ERVhfb3BfbW92X2kzMiwgeyAiciIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9tb3ZpX2kzMiwgeyAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfbGQ4dV9pMzIsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfbGQ4c19pMzIsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfbGQxNnVfaTMyLCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2xkMTZzX2kzMiwgeyAiciIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9sZF9pMzIsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc3Q4X2kzMiwgeyAicWkiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc3QxNl9pMzIsIHsgInJpIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX3N0X2kzMiwgeyAicmkiLCAiciIgfSB9LAorCisgICAgeyBJTkRFWF9vcF9hZGRfaTMyLCB7ICJyIiwgInIiLCAicmkiIH0gfSwKKyAgICB7IElOREVYX29wX3N1Yl9pMzIsIHsgInIiLCAiMCIsICJyaSIgfSB9LAorICAgIHsgSU5ERVhfb3BfbXVsX2kzMiwgeyAiciIsICIwIiwgInJpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9kaXYyX2kzMiwgeyAiYSIsICJkIiwgIjAiLCAiMSIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9kaXZ1Ml9pMzIsIHsgImEiLCAiZCIsICIwIiwgIjEiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfYW5kX2kzMiwgeyAiciIsICIwIiwgInJpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9vcl9pMzIsIHsgInIiLCAiMCIsICJyaSIgfSB9LAorICAgIHsgSU5ERVhfb3BfeG9yX2kzMiwgeyAiciIsICIwIiwgInJpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9hbmRjX2kzMiwgeyAiciIsICJyIiwgInJpIiB9IH0sCisKKyAgICB7IElOREVYX29wX3NobF9pMzIsIHsgInIiLCAiMCIsICJDaSIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc2hyX2kzMiwgeyAiciIsICIwIiwgIkNpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zYXJfaTMyLCB7ICJyIiwgIjAiLCAiQ2kiIH0gfSwKKyAgICB7IElOREVYX29wX3JvdGxfaTMyLCB7ICJyIiwgIjAiLCAiY2kiIH0gfSwKKyAgICB7IElOREVYX29wX3JvdHJfaTMyLCB7ICJyIiwgIjAiLCAiY2kiIH0gfSwKKworICAgIHsgSU5ERVhfb3BfYnJjb25kX2kzMiwgeyAiciIsICJyaSIgfSB9LAorCisgICAgeyBJTkRFWF9vcF9ic3dhcDE2X2kzMiwgeyAiciIsICIwIiB9IH0sCisgICAgeyBJTkRFWF9vcF9ic3dhcDMyX2kzMiwgeyAiciIsICIwIiB9IH0sCisKKyAgICB7IElOREVYX29wX25lZ19pMzIsIHsgInIiLCAiMCIgfSB9LAorCisgICAgeyBJTkRFWF9vcF9ub3RfaTMyLCB7ICJyIiwgIjAiIH0gfSwKKworICAgIHsgSU5ERVhfb3BfZXh0OHNfaTMyLCB7ICJyIiwgInEiIH0gfSwKKyAgICB7IElOREVYX29wX2V4dDE2c19pMzIsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfZXh0OHVfaTMyLCB7ICJyIiwgInEiIH0gfSwKKyAgICB7IElOREVYX29wX2V4dDE2dV9pMzIsIHsgInIiLCAiciIgfSB9LAorCisgICAgeyBJTkRFWF9vcF9zZXRjb25kX2kzMiwgeyAicSIsICJyIiwgInJpIiB9IH0sCisKKyAgICB7IElOREVYX29wX2RlcG9zaXRfaTMyLCB7ICJRIiwgIjAiLCAiUSIgfSB9LAorICAgIHsgSU5ERVhfb3BfbW92Y29uZF9pMzIsIHsgInIiLCAiciIsICJyaSIsICJyIiwgIjAiIH0gfSwKKworICAgIHsgSU5ERVhfb3BfbXVsdTJfaTMyLCB7ICJhIiwgImQiLCAiYSIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9tdWxzMl9pMzIsIHsgImEiLCAiZCIsICJhIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2FkZDJfaTMyLCB7ICJyIiwgInIiLCAiMCIsICIxIiwgInJpIiwgInJpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zdWIyX2kzMiwgeyAiciIsICJyIiwgIjAiLCAiMSIsICJyaSIsICJyaSIgfSB9LAorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorICAgIHsgSU5ERVhfb3BfYnJjb25kMl9pMzIsIHsgInIiLCAiciIsICJyaSIsICJyaSIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc2V0Y29uZDJfaTMyLCB7ICJyIiwgInIiLCAiciIsICJyaSIsICJyaSIgfSB9LAorI2Vsc2UKKyAgICB7IElOREVYX29wX21vdl9pNjQsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfbW92aV9pNjQsIHsgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2xkOHVfaTY0LCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2xkOHNfaTY0LCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2xkMTZ1X2k2NCwgeyAiciIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9sZDE2c19pNjQsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfbGQzMnVfaTY0LCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2xkMzJzX2k2NCwgeyAiciIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9sZF9pNjQsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc3Q4X2k2NCwgeyAicmkiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3Bfc3QxNl9pNjQsIHsgInJpIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX3N0MzJfaTY0LCB7ICJyaSIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zdF9pNjQsIHsgInJlIiwgInIiIH0gfSwKKworICAgIHsgSU5ERVhfb3BfYWRkX2k2NCwgeyAiciIsICJyIiwgInJlIiB9IH0sCisgICAgeyBJTkRFWF9vcF9tdWxfaTY0LCB7ICJyIiwgIjAiLCAicmUiIH0gfSwKKyAgICB7IElOREVYX29wX2RpdjJfaTY0LCB7ICJhIiwgImQiLCAiMCIsICIxIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2RpdnUyX2k2NCwgeyAiYSIsICJkIiwgIjAiLCAiMSIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zdWJfaTY0LCB7ICJyIiwgIjAiLCAicmUiIH0gfSwKKyAgICB7IElOREVYX29wX2FuZF9pNjQsIHsgInIiLCAiMCIsICJyZVoiIH0gfSwKKyAgICB7IElOREVYX29wX29yX2k2NCwgeyAiciIsICIwIiwgInJlIiB9IH0sCisgICAgeyBJTkRFWF9vcF94b3JfaTY0LCB7ICJyIiwgIjAiLCAicmUiIH0gfSwKKyAgICB7IElOREVYX29wX2FuZGNfaTY0LCB7ICJyIiwgInIiLCAickkiIH0gfSwKKworICAgIHsgSU5ERVhfb3Bfc2hsX2k2NCwgeyAiciIsICIwIiwgIkNpIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zaHJfaTY0LCB7ICJyIiwgIjAiLCAiQ2kiIH0gfSwKKyAgICB7IElOREVYX29wX3Nhcl9pNjQsIHsgInIiLCAiMCIsICJDaSIgfSB9LAorICAgIHsgSU5ERVhfb3Bfcm90bF9pNjQsIHsgInIiLCAiMCIsICJjaSIgfSB9LAorICAgIHsgSU5ERVhfb3Bfcm90cl9pNjQsIHsgInIiLCAiMCIsICJjaSIgfSB9LAorCisgICAgeyBJTkRFWF9vcF9icmNvbmRfaTY0LCB7ICJyIiwgInJlIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zZXRjb25kX2k2NCwgeyAiciIsICJyIiwgInJlIiB9IH0sCisKKyAgICB7IElOREVYX29wX2Jzd2FwMTZfaTY0LCB7ICJyIiwgIjAiIH0gfSwKKyAgICB7IElOREVYX29wX2Jzd2FwMzJfaTY0LCB7ICJyIiwgIjAiIH0gfSwKKyAgICB7IElOREVYX29wX2Jzd2FwNjRfaTY0LCB7ICJyIiwgIjAiIH0gfSwKKyAgICB7IElOREVYX29wX25lZ19pNjQsIHsgInIiLCAiMCIgfSB9LAorICAgIHsgSU5ERVhfb3Bfbm90X2k2NCwgeyAiciIsICIwIiB9IH0sCisKKyAgICB7IElOREVYX29wX2V4dDhzX2k2NCwgeyAiciIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9leHQxNnNfaTY0LCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2V4dDMyc19pNjQsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfZXh0OHVfaTY0LCB7ICJyIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2V4dDE2dV9pNjQsIHsgInIiLCAiciIgfSB9LAorICAgIHsgSU5ERVhfb3BfZXh0MzJ1X2k2NCwgeyAiciIsICJyIiB9IH0sCisKKyAgICB7IElOREVYX29wX2RlcG9zaXRfaTY0LCB7ICJRIiwgIjAiLCAiUSIgfSB9LAorICAgIHsgSU5ERVhfb3BfbW92Y29uZF9pNjQsIHsgInIiLCAiciIsICJyZSIsICJyIiwgIjAiIH0gfSwKKworICAgIHsgSU5ERVhfb3BfbXVsdTJfaTY0LCB7ICJhIiwgImQiLCAiYSIsICJyIiB9IH0sCisgICAgeyBJTkRFWF9vcF9tdWxzMl9pNjQsIHsgImEiLCAiZCIsICJhIiwgInIiIH0gfSwKKyAgICB7IElOREVYX29wX2FkZDJfaTY0LCB7ICJyIiwgInIiLCAiMCIsICIxIiwgInJlIiwgInJlIiB9IH0sCisgICAgeyBJTkRFWF9vcF9zdWIyX2k2NCwgeyAiciIsICJyIiwgIjAiLCAiMSIsICJyZSIsICJyZSIgfSB9LAorI2VuZGlmCisKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0CisgICAgeyBJTkRFWF9vcF9xZW11X2xkX2kzMiwgeyAiciIsICJMIiB9IH0sCisgICAgeyBJTkRFWF9vcF9xZW11X3N0X2kzMiwgeyAiTCIsICJMIiB9IH0sCisgICAgeyBJTkRFWF9vcF9xZW11X2xkX2k2NCwgeyAiciIsICJMIiB9IH0sCisgICAgeyBJTkRFWF9vcF9xZW11X3N0X2k2NCwgeyAiTCIsICJMIiB9IH0sCisjZWxpZiBUQVJHRVRfTE9OR19CSVRTIDw9IFRDR19UQVJHRVRfUkVHX0JJVFMKKyAgICB7IElOREVYX29wX3FlbXVfbGRfaTMyLCB7ICJyIiwgIkwiIH0gfSwKKyAgICB7IElOREVYX29wX3FlbXVfc3RfaTMyLCB7ICJMIiwgIkwiIH0gfSwKKyAgICB7IElOREVYX29wX3FlbXVfbGRfaTY0LCB7ICJyIiwgInIiLCAiTCIgfSB9LAorICAgIHsgSU5ERVhfb3BfcWVtdV9zdF9pNjQsIHsgIkwiLCAiTCIsICJMIiB9IH0sCisjZWxzZQorICAgIHsgSU5ERVhfb3BfcWVtdV9sZF9pMzIsIHsgInIiLCAiTCIsICJMIiB9IH0sCisgICAgeyBJTkRFWF9vcF9xZW11X3N0X2kzMiwgeyAiTCIsICJMIiwgIkwiIH0gfSwKKyAgICB7IElOREVYX29wX3FlbXVfbGRfaTY0LCB7ICJyIiwgInIiLCAiTCIsICJMIiB9IH0sCisgICAgeyBJTkRFWF9vcF9xZW11X3N0X2k2NCwgeyAiTCIsICJMIiwgIkwiLCAiTCIgfSB9LAorI2VuZGlmCisgICAgeyAtMSB9LAorfTsKKworc3RhdGljIGludCB0Y2dfdGFyZ2V0X2NhbGxlZV9zYXZlX3JlZ3NbXSA9IHsKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0CisgICAgVENHX1JFR19SQlAsCisgICAgVENHX1JFR19SQlgsCisjaWYgZGVmaW5lZChfV0lONjQpCisgICAgVENHX1JFR19SREksCisgICAgVENHX1JFR19SU0ksCisjZW5kaWYKKyAgICBUQ0dfUkVHX1IxMiwKKyAgICBUQ0dfUkVHX1IxMywKKyAgICBUQ0dfUkVHX1IxNCwgLyogQ3VycmVudGx5IHVzZWQgZm9yIHRoZSBnbG9iYWwgZW52LiAqLworICAgIFRDR19SRUdfUjE1LAorI2Vsc2UKKyAgICBUQ0dfUkVHX0VCUCwgLyogQ3VycmVudGx5IHVzZWQgZm9yIHRoZSBnbG9iYWwgZW52LiAqLworICAgIFRDR19SRUdfRUJYLAorICAgIFRDR19SRUdfRVNJLAorICAgIFRDR19SRUdfRURJLAorI2VuZGlmCit9OworCisvKiBDb21wdXRlIGZyYW1lIHNpemUgdmlhIG1hY3JvcywgdG8gc2hhcmUgYmV0d2VlbiB0Y2dfdGFyZ2V0X3FlbXVfcHJvbG9ndWUKKyAgIGFuZCB0Y2dfcmVnaXN0ZXJfaml0LiAgKi8KKworI2RlZmluZSBQVVNIX1NJWkUgXAorICAgICgoMSArIEFSUkFZX1NJWkUodGNnX3RhcmdldF9jYWxsZWVfc2F2ZV9yZWdzKSkgXAorICAgICAqIChUQ0dfVEFSR0VUX1JFR19CSVRTIC8gOCkpCisKKyNkZWZpbmUgRlJBTUVfU0laRSBcCisgICAgKChQVVNIX1NJWkUgXAorICAgICAgKyBUQ0dfU1RBVElDX0NBTExfQVJHU19TSVpFIFwKKyAgICAgICsgQ1BVX1RFTVBfQlVGX05MT05HUyAqIHNpemVvZihsb25nKSBcCisgICAgICArIFRDR19UQVJHRVRfU1RBQ0tfQUxJR04gLSAxKSBcCisgICAgICYgfihUQ0dfVEFSR0VUX1NUQUNLX0FMSUdOIC0gMSkpCisKKy8qIEdlbmVyYXRlIGdsb2JhbCBRRU1VIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBjb2RlICovCitzdGF0aWMgdm9pZCB0Y2dfdGFyZ2V0X3FlbXVfcHJvbG9ndWUoVENHQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgc3RhY2tfYWRkZW5kOworCisgICAgLyogVEIgcHJvbG9ndWUgKi8KKworICAgIC8qIFJlc2VydmUgc29tZSBzdGFjayBzcGFjZSwgYWxzbyBmb3IgVENHIHRlbXBzLiAgKi8KKyAgICBzdGFja19hZGRlbmQgPSBGUkFNRV9TSVpFIC0gUFVTSF9TSVpFOworICAgIHRjZ19zZXRfZnJhbWUocywgVENHX1JFR19DQUxMX1NUQUNLLCBUQ0dfU1RBVElDX0NBTExfQVJHU19TSVpFLAorICAgICAgICAgICAgICAgICAgQ1BVX1RFTVBfQlVGX05MT05HUyAqIHNpemVvZihsb25nKSk7CisKKyAgICAvKiBTYXZlIGFsbCBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLiAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0Y2dfdGFyZ2V0X2NhbGxlZV9zYXZlX3JlZ3MpOyBpKyspIHsKKyAgICAgICAgdGNnX291dF9wdXNoKHMsIHRjZ190YXJnZXRfY2FsbGVlX3NhdmVfcmVnc1tpXSk7CisgICAgfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorICAgIHRjZ19vdXRfbGQocywgVENHX1RZUEVfUFRSLCBUQ0dfQVJFRzAsIFRDR19SRUdfRVNQLAorICAgICAgICAgICAgICAgKEFSUkFZX1NJWkUodGNnX3RhcmdldF9jYWxsZWVfc2F2ZV9yZWdzKSArIDEpICogNCk7CisgICAgdGNnX291dF9hZGRpKHMsIFRDR19SRUdfRVNQLCAtc3RhY2tfYWRkZW5kKTsKKyAgICAvKiBqbXAgKnRiLiAgKi8KKyAgICB0Y2dfb3V0X21vZHJtX29mZnNldChzLCBPUENfR1JQNSwgRVhUNV9KTVBOX0V2LCBUQ0dfUkVHX0VTUCwKKwkJICAgICAgICAgKEFSUkFZX1NJWkUodGNnX3RhcmdldF9jYWxsZWVfc2F2ZV9yZWdzKSArIDIpICogNAorCQkJICsgc3RhY2tfYWRkZW5kKTsKKyNlbHNlCisgICAgdGNnX291dF9tb3YocywgVENHX1RZUEVfUFRSLCBUQ0dfQVJFRzAsIHRjZ190YXJnZXRfY2FsbF9pYXJnX3JlZ3NbMF0pOworICAgIHRjZ19vdXRfYWRkaShzLCBUQ0dfUkVHX0VTUCwgLXN0YWNrX2FkZGVuZCk7CisgICAgLyogam1wICp0Yi4gICovCisgICAgdGNnX291dF9tb2RybShzLCBPUENfR1JQNSwgRVhUNV9KTVBOX0V2LCB0Y2dfdGFyZ2V0X2NhbGxfaWFyZ19yZWdzWzFdKTsKKyNlbmRpZgorCisgICAgLyogVEIgZXBpbG9ndWUgKi8KKyAgICB0Yl9yZXRfYWRkciA9IHMtPmNvZGVfcHRyOworCisgICAgdGNnX291dF9hZGRpKHMsIFRDR19SRUdfQ0FMTF9TVEFDSywgc3RhY2tfYWRkZW5kKTsKKworICAgIGZvciAoaSA9IEFSUkFZX1NJWkUodGNnX3RhcmdldF9jYWxsZWVfc2F2ZV9yZWdzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHRjZ19vdXRfcG9wKHMsIHRjZ190YXJnZXRfY2FsbGVlX3NhdmVfcmVnc1tpXSk7CisgICAgfQorICAgIHRjZ19vdXRfb3BjKHMsIE9QQ19SRVQsIDAsIDAsIDApOworCisjaWYgIWRlZmluZWQoQ09ORklHX1NPRlRNTVUpCisgICAgLyogVHJ5IHRvIHNldCB1cCBhIHNlZ21lbnQgcmVnaXN0ZXIgdG8gcG9pbnQgdG8gR1VFU1RfQkFTRS4gICovCisgICAgaWYgKEdVRVNUX0JBU0UpIHsKKyAgICAgICAgc2V0dXBfZ3Vlc3RfYmFzZV9zZWcoKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgdGNnX3RhcmdldF9pbml0KFRDR0NvbnRleHQgKnMpCit7CisjaWZkZWYgQ09ORklHX0NQVUlEX0gKKyAgICAgICAgdW5zaWduZWQgYSwgYiwgYywgZDsKKyAgICBpbnQgbWF4ID0gX19nZXRfY3B1aWRfbWF4KDAsIDApOworCisgICAgaWYgKG1heCA+PSAxKSB7CisgICAgICAgIF9fY3B1aWQoMSwgYSwgYiwgYywgZCk7CisjaWZuZGVmIGhhdmVfY21vdgorICAgICAgICAvKiBGb3IgMzItYml0LCA5OSUgY2VydGFpbnR5IHRoYXQgd2UncmUgcnVubmluZyBvbiBoYXJkd2FyZSB0aGF0CisgICAgICAgICAgIHN1cHBvcnRzIGNtb3YsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrLiAgSW4gY2FzZSBjbW92IGlzIG5vdAorICAgICAgICAgICBhdmFpbGFibGUsIHdlJ2xsIHVzZSBhIHNtYWxsIGZvcndhcmQgYnJhbmNoLiAgKi8KKyAgICAgICAgaGF2ZV9jbW92ID0gKGQgJiBiaXRfQ01PVikgIT0gMDsKKyNlbmRpZgorI2lmbmRlZiBoYXZlX21vdmJlCisgICAgICAgIC8qIE1PVkJFIGlzIG9ubHkgYXZhaWxhYmxlIG9uIEludGVsIEF0b20gYW5kIEhhc3dlbGwgQ1BVcywgc28gd2UKKyAgICAgICAgICAgbmVlZCB0byBwcm9iZSBmb3IgaXQuICAqLworICAgICAgICBoYXZlX21vdmJlID0gKGMgJiBiaXRfTU9WQkUpICE9IDA7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobWF4ID49IDcpIHsKKyAgICAgICAgLyogQk1JMSBpcyBhdmFpbGFibGUgb24gQU1EIFBpbGVkcml2ZXIgYW5kIEludGVsIEhhc3dlbGwgQ1BVcy4gICovCisgICAgICAgIF9fY3B1aWRfY291bnQoNywgMCwgYSwgYiwgYywgZCk7CisjaWZkZWYgYml0X0JNSQorICAgICAgICBoYXZlX2JtaTEgPSAoYiAmIGJpdF9CTUkpICE9IDA7CisjZW5kaWYKKyNpZm5kZWYgaGF2ZV9ibWkyCisgICAgICAgIGhhdmVfYm1pMiA9IChiICYgYml0X0JNSTIpICE9IDA7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDY0KSB7CisgICAgICAgIHRjZ19yZWdzZXRfc2V0MzIodGNnX3RhcmdldF9hdmFpbGFibGVfcmVnc1tUQ0dfVFlQRV9JMzJdLCAwLCAweGZmZmYpOworICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKHRjZ190YXJnZXRfYXZhaWxhYmxlX3JlZ3NbVENHX1RZUEVfSTY0XSwgMCwgMHhmZmZmKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfcmVnc2V0X3NldDMyKHRjZ190YXJnZXRfYXZhaWxhYmxlX3JlZ3NbVENHX1RZUEVfSTMyXSwgMCwgMHhmZik7CisgICAgfQorCisgICAgdGNnX3JlZ3NldF9jbGVhcih0Y2dfdGFyZ2V0X2NhbGxfY2xvYmJlcl9yZWdzKTsKKyAgICB0Y2dfcmVnc2V0X3NldF9yZWcodGNnX3RhcmdldF9jYWxsX2Nsb2JiZXJfcmVncywgVENHX1JFR19FQVgpOworICAgIHRjZ19yZWdzZXRfc2V0X3JlZyh0Y2dfdGFyZ2V0X2NhbGxfY2xvYmJlcl9yZWdzLCBUQ0dfUkVHX0VEWCk7CisgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHRjZ190YXJnZXRfY2FsbF9jbG9iYmVyX3JlZ3MsIFRDR19SRUdfRUNYKTsKKyAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkgeworI2lmICFkZWZpbmVkKF9XSU42NCkKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHRjZ190YXJnZXRfY2FsbF9jbG9iYmVyX3JlZ3MsIFRDR19SRUdfUkRJKTsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHRjZ190YXJnZXRfY2FsbF9jbG9iYmVyX3JlZ3MsIFRDR19SRUdfUlNJKTsKKyNlbmRpZgorICAgICAgICB0Y2dfcmVnc2V0X3NldF9yZWcodGNnX3RhcmdldF9jYWxsX2Nsb2JiZXJfcmVncywgVENHX1JFR19SOCk7CisgICAgICAgIHRjZ19yZWdzZXRfc2V0X3JlZyh0Y2dfdGFyZ2V0X2NhbGxfY2xvYmJlcl9yZWdzLCBUQ0dfUkVHX1I5KTsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHRjZ190YXJnZXRfY2FsbF9jbG9iYmVyX3JlZ3MsIFRDR19SRUdfUjEwKTsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHRjZ190YXJnZXRfY2FsbF9jbG9iYmVyX3JlZ3MsIFRDR19SRUdfUjExKTsKKyAgICB9CisKKyAgICB0Y2dfcmVnc2V0X2NsZWFyKHMtPnJlc2VydmVkX3JlZ3MpOworICAgIHRjZ19yZWdzZXRfc2V0X3JlZyhzLT5yZXNlcnZlZF9yZWdzLCBUQ0dfUkVHX0NBTExfU1RBQ0spOworCisgICAgdGNnX2FkZF90YXJnZXRfYWRkX29wX2RlZnMoeDg2X29wX2RlZnMpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgRGVidWdGcmFtZUNJRSBjaWU7CisgICAgRGVidWdGcmFtZUZERUhlYWRlciBmZGU7CisgICAgdWludDhfdCBmZGVfZGVmX2NmYVs0XTsKKyAgICB1aW50OF90IGZkZV9yZWdfb2ZzWzE0XTsKK30gRGVidWdGcmFtZTsKKworLyogV2UncmUgZXhwZWN0aW5nIGEgMiBieXRlIHVsZWIxMjggZW5jb2RlZCB2YWx1ZS4gICovCitRRU1VX0JVSUxEX0JVR19PTihGUkFNRV9TSVpFID49ICgxIDw8IDE0KSk7CisKKyNpZiAhZGVmaW5lZChfX0VMRl9fKQorICAgIC8qIEhvc3QgbWFjaGluZSB3aXRob3V0IEVMRi4gKi8KKyNlbGlmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyNkZWZpbmUgRUxGX0hPU1RfTUFDSElORSBFTV9YODZfNjQKK3N0YXRpYyBEZWJ1Z0ZyYW1lIGRlYnVnX2ZyYW1lID0geworICAgIC5jaWUubGVuID0gc2l6ZW9mKERlYnVnRnJhbWVDSUUpLTQsIC8qIGxlbmd0aCBhZnRlciAubGVuIG1lbWJlciAqLworICAgIC5jaWUuaWQgPSAtMSwKKyAgICAuY2llLnZlcnNpb24gPSAxLAorICAgIC5jaWUuY29kZV9hbGlnbiA9IDEsCisgICAgLmNpZS5kYXRhX2FsaWduID0gMHg3OCwgICAgICAgICAgICAgLyogc2xlYjEyOCAtOCAqLworICAgIC5jaWUucmV0dXJuX2NvbHVtbiA9IDE2LAorCisgICAgLyogVG90YWwgRkRFIHNpemUgZG9lcyBub3QgaW5jbHVkZSB0aGUgImxlbiIgbWVtYmVyLiAgKi8KKyAgICAuZmRlLmxlbiA9IHNpemVvZihEZWJ1Z0ZyYW1lKSAtIG9mZnNldG9mKERlYnVnRnJhbWUsIGZkZS5jaWVfb2Zmc2V0KSwKKworICAgIC5mZGVfZGVmX2NmYSA9IHsKKyAgICAgICAgMTIsIDcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV19DRkFfZGVmX2NmYSAlcnNwLCAuLi4gKi8KKyAgICAgICAgKEZSQU1FX1NJWkUgJiAweDdmKSB8IDB4ODAsICAgICAvKiAuLi4gdWxlYjEyOCBGUkFNRV9TSVpFICovCisgICAgICAgIChGUkFNRV9TSVpFID4+IDcpCisgICAgfSwKKyAgICAuZmRlX3JlZ19vZnMgPSB7CisgICAgICAgIDB4OTAsIDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXJpcCwgLTggKi8KKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBvcmRlcmluZyBtdXN0IG1hdGNoIHRjZ190YXJnZXRfY2FsbGVlX3NhdmVfcmVncy4gICovCisgICAgICAgIDB4ODYsIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXJicCwgLTE2ICovCisgICAgICAgIDB4ODMsIDMsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXJieCwgLTI0ICovCisgICAgICAgIDB4OGMsIDQsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXIxMiwgLTMyICovCisgICAgICAgIDB4OGQsIDUsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXIxMywgLTQwICovCisgICAgICAgIDB4OGUsIDYsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXIxNCwgLTQ4ICovCisgICAgICAgIDB4OGYsIDcsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJXIxNSwgLTU2ICovCisgICAgfQorfTsKKyNlbHNlCisjZGVmaW5lIEVMRl9IT1NUX01BQ0hJTkUgRU1fMzg2CitzdGF0aWMgRGVidWdGcmFtZSBkZWJ1Z19mcmFtZSA9IHsKKyAgICAuY2llLmxlbiA9IHNpemVvZihEZWJ1Z0ZyYW1lQ0lFKS00LCAvKiBsZW5ndGggYWZ0ZXIgLmxlbiBtZW1iZXIgKi8KKyAgICAuY2llLmlkID0gLTEsCisgICAgLmNpZS52ZXJzaW9uID0gMSwKKyAgICAuY2llLmNvZGVfYWxpZ24gPSAxLAorICAgIC5jaWUuZGF0YV9hbGlnbiA9IDB4N2MsICAgICAgICAgICAgIC8qIHNsZWIxMjggLTQgKi8KKyAgICAuY2llLnJldHVybl9jb2x1bW4gPSA4LAorCisgICAgLyogVG90YWwgRkRFIHNpemUgZG9lcyBub3QgaW5jbHVkZSB0aGUgImxlbiIgbWVtYmVyLiAgKi8KKyAgICAuZmRlLmxlbiA9IHNpemVvZihEZWJ1Z0ZyYW1lKSAtIG9mZnNldG9mKERlYnVnRnJhbWUsIGZkZS5jaWVfb2Zmc2V0KSwKKworICAgIC5mZGVfZGVmX2NmYSA9IHsKKyAgICAgICAgMTIsIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV19DRkFfZGVmX2NmYSAlZXNwLCAuLi4gKi8KKyAgICAgICAgKEZSQU1FX1NJWkUgJiAweDdmKSB8IDB4ODAsICAgICAvKiAuLi4gdWxlYjEyOCBGUkFNRV9TSVpFICovCisgICAgICAgIChGUkFNRV9TSVpFID4+IDcpCisgICAgfSwKKyAgICAuZmRlX3JlZ19vZnMgPSB7CisgICAgICAgIDB4ODgsIDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJWVpcCwgLTQgKi8KKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBvcmRlcmluZyBtdXN0IG1hdGNoIHRjZ190YXJnZXRfY2FsbGVlX3NhdmVfcmVncy4gICovCisgICAgICAgIDB4ODUsIDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogRFdfQ0ZBX29mZnNldCwgJWVicCwgLTggKi8KKyAgICAgICAgMHg4MywgMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV19DRkFfb2Zmc2V0LCAlZWJ4LCAtMTIgKi8KKyAgICAgICAgMHg4NiwgNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV19DRkFfb2Zmc2V0LCAlZXNpLCAtMTYgKi8KKyAgICAgICAgMHg4NywgNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV19DRkFfb2Zmc2V0LCAlZWRpLCAtMjAgKi8KKyAgICB9Cit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEVMRl9IT1NUX01BQ0hJTkUpCit2b2lkIHRjZ19yZWdpc3Rlcl9qaXQodm9pZCAqYnVmLCBzaXplX3QgYnVmX3NpemUpCit7CisgICAgZGVidWdfZnJhbWUuZmRlLmZ1bmNfc3RhcnQgPSAodWludHB0cl90KWJ1ZjsKKyAgICBkZWJ1Z19mcmFtZS5mZGUuZnVuY19sZW4gPSBidWZfc2l6ZTsKKworICAgIHRjZ19yZWdpc3Rlcl9qaXRfaW50KGJ1ZiwgYnVmX3NpemUsICZkZWJ1Z19mcmFtZSwgc2l6ZW9mKGRlYnVnX2ZyYW1lKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGNnL2kzODYvdGNnLXRhcmdldC5oIGIvYW5kcm9pZC9xZW11MS90Y2cvaTM4Ni90Y2ctdGFyZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlNDk5NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdGNnL2kzODYvdGNnLXRhcmdldC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogVGlueSBDb2RlIEdlbmVyYXRvciBmb3IgUUVNVQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgVENHX1RBUkdFVF9JMzg2IAorI2RlZmluZSBUQ0dfVEFSR0VUX0kzODYgMQorCisjdW5kZWYgVENHX1RBUkdFVF9XT1JEU19CSUdFTkRJQU4KKworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIFRDR19UQVJHRVRfUkVHX0JJVFMgIDY0CisjIGRlZmluZSBUQ0dfVEFSR0VUX05CX1JFR1MgICAxNgorI2Vsc2UKKyMgZGVmaW5lIFRDR19UQVJHRVRfUkVHX0JJVFMgIDMyCisjIGRlZmluZSBUQ0dfVEFSR0VUX05CX1JFR1MgICAgOAorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgICAgVENHX1JFR19FQVggPSAwLAorICAgIFRDR19SRUdfRUNYLAorICAgIFRDR19SRUdfRURYLAorICAgIFRDR19SRUdfRUJYLAorICAgIFRDR19SRUdfRVNQLAorICAgIFRDR19SRUdfRUJQLAorICAgIFRDR19SRUdfRVNJLAorICAgIFRDR19SRUdfRURJLAorCisgICAgLyogNjQtYml0IHJlZ2lzdGVyczsgYWx3YXlzIGRlZmluZSB0aGUgc3ltYm9scyB0byBhdm9pZAorICAgICAgIHRvbyBtdWNoIGlmLWRlZmZpbmcuICAqLworICAgIFRDR19SRUdfUjgsCisgICAgVENHX1JFR19SOSwKKyAgICBUQ0dfUkVHX1IxMCwKKyAgICBUQ0dfUkVHX1IxMSwKKyAgICBUQ0dfUkVHX1IxMiwKKyAgICBUQ0dfUkVHX1IxMywKKyAgICBUQ0dfUkVHX1IxNCwKKyAgICBUQ0dfUkVHX1IxNSwKKyAgICBUQ0dfUkVHX1JBWCA9IFRDR19SRUdfRUFYLAorICAgIFRDR19SRUdfUkNYID0gVENHX1JFR19FQ1gsCisgICAgVENHX1JFR19SRFggPSBUQ0dfUkVHX0VEWCwKKyAgICBUQ0dfUkVHX1JCWCA9IFRDR19SRUdfRUJYLAorICAgIFRDR19SRUdfUlNQID0gVENHX1JFR19FU1AsCisgICAgVENHX1JFR19SQlAgPSBUQ0dfUkVHX0VCUCwKKyAgICBUQ0dfUkVHX1JTSSA9IFRDR19SRUdfRVNJLAorICAgIFRDR19SRUdfUkRJID0gVENHX1JFR19FREksCit9IFRDR1JlZzsKKworCisvKiB1c2VkIGZvciBmdW5jdGlvbiBjYWxsIGdlbmVyYXRpb24gKi8KKyNkZWZpbmUgVENHX1JFR19DQUxMX1NUQUNLIFRDR19SRUdfRVNQIAorI2RlZmluZSBUQ0dfVEFSR0VUX1NUQUNLX0FMSUdOIDE2CisjaWYgZGVmaW5lZChfV0lONjQpCisjZGVmaW5lIFRDR19UQVJHRVRfQ0FMTF9TVEFDS19PRkZTRVQgMzIKKyNlbHNlCisjZGVmaW5lIFRDR19UQVJHRVRfQ0FMTF9TVEFDS19PRkZTRVQgMAorI2VuZGlmCisKK2V4dGVybiBib29sIGhhdmVfYm1pMTsKKy8qIG9wdGlvbmFsIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19kaXYyX2kzMiAgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfcm90X2kzMiAgICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDhzX2kzMiAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19leHQxNnNfaTMyICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXh0OHVfaTMyICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDE2dV9pMzIgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19ic3dhcDE2X2kzMiAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYnN3YXAzMl9pMzIgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX25lZ19pMzIgICAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19ub3RfaTMyICAgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYW5kY19pMzIgICAgICAgICBoYXZlX2JtaTEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfb3JjX2kzMiAgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2Vxdl9pMzIgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19uYW5kX2kzMiAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbm9yX2kzMiAgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2RlcG9zaXRfaTMyICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tb3Zjb25kX2kzMiAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYWRkMl9pMzIgICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX3N1YjJfaTMyICAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pMzIgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbXVsczJfaTMyICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX211bHVoX2kzMiAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tdWxzaF9pMzIgICAgICAgIDAKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZGl2Ml9pNjQgICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX3JvdF9pNjQgICAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19leHQ4c19pNjQgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXh0MTZzX2k2NCAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDMyc19pNjQgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19leHQ4dV9pNjQgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXh0MTZ1X2k2NCAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDMydV9pNjQgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19ic3dhcDE2X2k2NCAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYnN3YXAzMl9pNjQgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2Jzd2FwNjRfaTY0ICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19uZWdfaTY0ICAgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbm90X2k2NCAgICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2FuZGNfaTY0ICAgICAgICAgaGF2ZV9ibWkxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX29yY19pNjQgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19lcXZfaTY0ICAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbmFuZF9pNjQgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX25vcl9pNjQgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19kZXBvc2l0X2k2NCAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbW92Y29uZF9pNjQgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2FkZDJfaTY0ICAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19zdWIyX2k2NCAgICAgICAgIDEKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbXVsdTJfaTY0ICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX211bHMyX2k2NCAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tdWx1aF9pNjQgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbXVsc2hfaTY0ICAgICAgICAwCisjZW5kaWYKKworI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19uZXdfbGRzdCAgICAgICAgIDEKKworI2RlZmluZSBUQ0dfVEFSR0VUX2RlcG9zaXRfaTMyX3ZhbGlkKG9mcywgbGVuKSBcCisgICAgKCgob2ZzKSA9PSAwICYmIChsZW4pID09IDgpIHx8ICgob2ZzKSA9PSA4ICYmIChsZW4pID09IDgpIHx8IFwKKyAgICAgKChvZnMpID09IDAgJiYgKGxlbikgPT0gMTYpKQorI2RlZmluZSBUQ0dfVEFSR0VUX2RlcG9zaXRfaTY0X3ZhbGlkICAgIFRDR19UQVJHRVRfZGVwb3NpdF9pMzJfdmFsaWQKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyMgZGVmaW5lIFRDR19BUkVHMCBUQ0dfUkVHX1IxNAorI2Vsc2UKKyMgZGVmaW5lIFRDR19BUkVHMCBUQ0dfUkVHX0VCUAorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3Qgc3RvcCkKK3sKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy9vcHRpbWl6ZS5jIGIvYW5kcm9pZC9xZW11MS90Y2cvb3B0aW1pemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTU2NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvb3B0aW1pemUuYwpAQCAtMCwwICsxLDEyODcgQEAKKy8qCisgKiBPcHRpbWl6YXRpb25zIGZvciBUaW55IENvZGUgR2VuZXJhdG9yIGZvciBRRU1VCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MuCisgKiBDb250cmlidXRlZCBieSBLaXJpbGwgQmF0dXpvdiA8YmF0dXpvdmtAaXNwcmFzLnJ1PgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJjcHUuaCIKKyNpbmNsdWRlICJleGVjL2V4ZWMtYWxsLmgiCisjaW5jbHVkZSAidGNnLW9wLmgiCisKKyNkZWZpbmUgQ0FTRV9PUF8zMl82NCh4KSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2x1ZShnbHVlKGNhc2UgSU5ERVhfb3BfLCB4KSwgX2kzMik6ICAgIFwKKyAgICAgICAgZ2x1ZShnbHVlKGNhc2UgSU5ERVhfb3BfLCB4KSwgX2k2NCkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUQ0dfVEVNUF9VTkRFRiA9IDAsCisgICAgVENHX1RFTVBfQ09OU1QsCisgICAgVENHX1RFTVBfQ09QWSwKK30gdGNnX3RlbXBfc3RhdGU7CisKK3N0cnVjdCB0Y2dfdGVtcF9pbmZvIHsKKyAgICB0Y2dfdGVtcF9zdGF0ZSBzdGF0ZTsKKyAgICB1aW50MTZfdCBwcmV2X2NvcHk7CisgICAgdWludDE2X3QgbmV4dF9jb3B5OworICAgIHRjZ190YXJnZXRfdWxvbmcgdmFsOworICAgIHRjZ190YXJnZXRfdWxvbmcgbWFzazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGNnX3RlbXBfaW5mbyB0ZW1wc1tUQ0dfTUFYX1RFTVBTXTsKKworLyogUmVzZXQgVEVNUCdzIHN0YXRlIHRvIFRDR19URU1QX1VOREVGLiAgSWYgVEVNUCBvbmx5IGhhZCBvbmUgY29weSwgcmVtb3ZlCisgICB0aGUgY29weSBmbGFnIGZyb20gdGhlIGxlZnQgdGVtcC4gICovCitzdGF0aWMgdm9pZCByZXNldF90ZW1wKFRDR0FyZyB0ZW1wKQoreworICAgIGlmICh0ZW1wc1t0ZW1wXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT1BZKSB7CisgICAgICAgIGlmICh0ZW1wc1t0ZW1wXS5wcmV2X2NvcHkgPT0gdGVtcHNbdGVtcF0ubmV4dF9jb3B5KSB7CisgICAgICAgICAgICB0ZW1wc1t0ZW1wc1t0ZW1wXS5uZXh0X2NvcHldLnN0YXRlID0gVENHX1RFTVBfVU5ERUY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0ZW1wc1t0ZW1wc1t0ZW1wXS5uZXh0X2NvcHldLnByZXZfY29weSA9IHRlbXBzW3RlbXBdLnByZXZfY29weTsKKyAgICAgICAgICAgIHRlbXBzW3RlbXBzW3RlbXBdLnByZXZfY29weV0ubmV4dF9jb3B5ID0gdGVtcHNbdGVtcF0ubmV4dF9jb3B5OworICAgICAgICB9CisgICAgfQorICAgIHRlbXBzW3RlbXBdLnN0YXRlID0gVENHX1RFTVBfVU5ERUY7CisgICAgdGVtcHNbdGVtcF0ubWFzayA9IC0xOworfQorCisvKiBSZXNldCBhbGwgdGVtcG9yYXJpZXMsIGdpdmVuIHRoYXQgdGhlcmUgYXJlIE5CX1RFTVBTIG9mIHRoZW0uICAqLworc3RhdGljIHZvaWQgcmVzZXRfYWxsX3RlbXBzKGludCBuYl90ZW1wcykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfdGVtcHM7IGkrKykgeworICAgICAgICB0ZW1wc1tpXS5zdGF0ZSA9IFRDR19URU1QX1VOREVGOworICAgICAgICB0ZW1wc1tpXS5tYXNrID0gLTE7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wX2JpdHMoVENHT3Bjb2RlIG9wKQoreworICAgIGNvbnN0IFRDR09wRGVmICpkZWYgPSAmdGNnX29wX2RlZnNbb3BdOworICAgIHJldHVybiBkZWYtPmZsYWdzICYgVENHX09QRl82NEJJVCA/IDY0IDogMzI7Cit9CisKK3N0YXRpYyBUQ0dPcGNvZGUgb3BfdG9fbW92aShUQ0dPcGNvZGUgb3ApCit7CisgICAgc3dpdGNoIChvcF9iaXRzKG9wKSkgeworICAgIGNhc2UgMzI6CisgICAgICAgIHJldHVybiBJTkRFWF9vcF9tb3ZpX2kzMjsKKyAgICBjYXNlIDY0OgorICAgICAgICByZXR1cm4gSU5ERVhfb3BfbW92aV9pNjQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJvcF90b19tb3ZpOiB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSBvZiAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9wX2JpdHMuXG4iKTsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgVENHQXJnIGZpbmRfYmV0dGVyX2NvcHkoVENHQ29udGV4dCAqcywgVENHQXJnIHRlbXApCit7CisgICAgVENHQXJnIGk7CisKKyAgICAvKiBJZiB0aGlzIGlzIGFscmVhZHkgYSBnbG9iYWwsIHdlIGNhbid0IGRvIGJldHRlci4gKi8KKyAgICBpZiAodGVtcCA8IHMtPm5iX2dsb2JhbHMpIHsKKyAgICAgICAgcmV0dXJuIHRlbXA7CisgICAgfQorCisgICAgLyogU2VhcmNoIGZvciBhIGdsb2JhbCBmaXJzdC4gKi8KKyAgICBmb3IgKGkgPSB0ZW1wc1t0ZW1wXS5uZXh0X2NvcHkgOyBpICE9IHRlbXAgOyBpID0gdGVtcHNbaV0ubmV4dF9jb3B5KSB7CisgICAgICAgIGlmIChpIDwgcy0+bmJfZ2xvYmFscykgeworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBpdCBpcyBhIHRlbXAsIHNlYXJjaCBmb3IgYSB0ZW1wIGxvY2FsLiAqLworICAgIGlmICghcy0+dGVtcHNbdGVtcF0udGVtcF9sb2NhbCkgeworICAgICAgICBmb3IgKGkgPSB0ZW1wc1t0ZW1wXS5uZXh0X2NvcHkgOyBpICE9IHRlbXAgOyBpID0gdGVtcHNbaV0ubmV4dF9jb3B5KSB7CisgICAgICAgICAgICBpZiAocy0+dGVtcHNbaV0udGVtcF9sb2NhbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogRmFpbHVyZSB0byBmaW5kIGEgYmV0dGVyIHJlcHJlc2VudGF0aW9uLCByZXR1cm4gdGhlIHNhbWUgdGVtcC4gKi8KKyAgICByZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGJvb2wgdGVtcHNfYXJlX2NvcGllcyhUQ0dBcmcgYXJnMSwgVENHQXJnIGFyZzIpCit7CisgICAgVENHQXJnIGk7CisKKyAgICBpZiAoYXJnMSA9PSBhcmcyKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh0ZW1wc1thcmcxXS5zdGF0ZSAhPSBUQ0dfVEVNUF9DT1BZCisgICAgICAgIHx8IHRlbXBzW2FyZzJdLnN0YXRlICE9IFRDR19URU1QX0NPUFkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoaSA9IHRlbXBzW2FyZzFdLm5leHRfY29weSA7IGkgIT0gYXJnMSA7IGkgPSB0ZW1wc1tpXS5uZXh0X2NvcHkpIHsKKyAgICAgICAgaWYgKGkgPT0gYXJnMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHRjZ19vcHRfZ2VuX21vdihUQ0dDb250ZXh0ICpzLCBUQ0dBcmcgKmdlbl9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBkc3QsIFRDR0FyZyBzcmMpCit7CisgICAgcmVzZXRfdGVtcChkc3QpOworICAgIHRlbXBzW2RzdF0ubWFzayA9IHRlbXBzW3NyY10ubWFzazsKKyAgICBhc3NlcnQodGVtcHNbc3JjXS5zdGF0ZSAhPSBUQ0dfVEVNUF9DT05TVCk7CisKKyAgICBpZiAocy0+dGVtcHNbc3JjXS50eXBlID09IHMtPnRlbXBzW2RzdF0udHlwZSkgeworICAgICAgICBpZiAodGVtcHNbc3JjXS5zdGF0ZSAhPSBUQ0dfVEVNUF9DT1BZKSB7CisgICAgICAgICAgICB0ZW1wc1tzcmNdLnN0YXRlID0gVENHX1RFTVBfQ09QWTsKKyAgICAgICAgICAgIHRlbXBzW3NyY10ubmV4dF9jb3B5ID0gc3JjOworICAgICAgICAgICAgdGVtcHNbc3JjXS5wcmV2X2NvcHkgPSBzcmM7CisgICAgICAgIH0KKyAgICAgICAgdGVtcHNbZHN0XS5zdGF0ZSA9IFRDR19URU1QX0NPUFk7CisgICAgICAgIHRlbXBzW2RzdF0ubmV4dF9jb3B5ID0gdGVtcHNbc3JjXS5uZXh0X2NvcHk7CisgICAgICAgIHRlbXBzW2RzdF0ucHJldl9jb3B5ID0gc3JjOworICAgICAgICB0ZW1wc1t0ZW1wc1tkc3RdLm5leHRfY29weV0ucHJldl9jb3B5ID0gZHN0OworICAgICAgICB0ZW1wc1tzcmNdLm5leHRfY29weSA9IGRzdDsKKyAgICB9CisKKyAgICBnZW5fYXJnc1swXSA9IGRzdDsKKyAgICBnZW5fYXJnc1sxXSA9IHNyYzsKK30KKworc3RhdGljIHZvaWQgdGNnX29wdF9nZW5fbW92aShUQ0dBcmcgKmdlbl9hcmdzLCBUQ0dBcmcgZHN0LCBUQ0dBcmcgdmFsKQoreworICAgIHJlc2V0X3RlbXAoZHN0KTsKKyAgICB0ZW1wc1tkc3RdLnN0YXRlID0gVENHX1RFTVBfQ09OU1Q7CisgICAgdGVtcHNbZHN0XS52YWwgPSB2YWw7CisgICAgdGVtcHNbZHN0XS5tYXNrID0gdmFsOworICAgIGdlbl9hcmdzWzBdID0gZHN0OworICAgIGdlbl9hcmdzWzFdID0gdmFsOworfQorCitzdGF0aWMgVENHT3Bjb2RlIG9wX3RvX21vdihUQ0dPcGNvZGUgb3ApCit7CisgICAgc3dpdGNoIChvcF9iaXRzKG9wKSkgeworICAgIGNhc2UgMzI6CisgICAgICAgIHJldHVybiBJTkRFWF9vcF9tb3ZfaTMyOworICAgIGNhc2UgNjQ6CisgICAgICAgIHJldHVybiBJTkRFWF9vcF9tb3ZfaTY0OworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAib3BfdG9fbW92OiB1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSBvZiAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9wX2JpdHMuXG4iKTsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgVENHQXJnIGRvX2NvbnN0YW50X2ZvbGRpbmdfMihUQ0dPcGNvZGUgb3AsIFRDR0FyZyB4LCBUQ0dBcmcgeSkKK3sKKyAgICB1aW50NjRfdCBsNjQsIGg2NDsKKworICAgIHN3aXRjaCAob3ApIHsKKyAgICBDQVNFX09QXzMyXzY0KGFkZCk6CisgICAgICAgIHJldHVybiB4ICsgeTsKKworICAgIENBU0VfT1BfMzJfNjQoc3ViKToKKyAgICAgICAgcmV0dXJuIHggLSB5OworCisgICAgQ0FTRV9PUF8zMl82NChtdWwpOgorICAgICAgICByZXR1cm4geCAqIHk7CisKKyAgICBDQVNFX09QXzMyXzY0KGFuZCk6CisgICAgICAgIHJldHVybiB4ICYgeTsKKworICAgIENBU0VfT1BfMzJfNjQob3IpOgorICAgICAgICByZXR1cm4geCB8IHk7CisKKyAgICBDQVNFX09QXzMyXzY0KHhvcik6CisgICAgICAgIHJldHVybiB4IF4geTsKKworICAgIGNhc2UgSU5ERVhfb3Bfc2hsX2kzMjoKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCl4IDw8ICh1aW50MzJfdCl5OworCisgICAgY2FzZSBJTkRFWF9vcF9zaGxfaTY0OgorICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXggPDwgKHVpbnQ2NF90KXk7CisKKyAgICBjYXNlIElOREVYX29wX3Nocl9pMzI6CisgICAgICAgIHJldHVybiAodWludDMyX3QpeCA+PiAodWludDMyX3QpeTsKKworICAgIGNhc2UgSU5ERVhfb3Bfc2hyX2k2NDoKKyAgICAgICAgcmV0dXJuICh1aW50NjRfdCl4ID4+ICh1aW50NjRfdCl5OworCisgICAgY2FzZSBJTkRFWF9vcF9zYXJfaTMyOgorICAgICAgICByZXR1cm4gKGludDMyX3QpeCA+PiAoaW50MzJfdCl5OworCisgICAgY2FzZSBJTkRFWF9vcF9zYXJfaTY0OgorICAgICAgICByZXR1cm4gKGludDY0X3QpeCA+PiAoaW50NjRfdCl5OworCisgICAgY2FzZSBJTkRFWF9vcF9yb3RyX2kzMjoKKyAgICAgICAgcmV0dXJuIHJvcjMyKHgsIHkpOworCisgICAgY2FzZSBJTkRFWF9vcF9yb3RyX2k2NDoKKyAgICAgICAgcmV0dXJuIHJvcjY0KHgsIHkpOworCisgICAgY2FzZSBJTkRFWF9vcF9yb3RsX2kzMjoKKyAgICAgICAgcmV0dXJuIHJvbDMyKHgsIHkpOworCisgICAgY2FzZSBJTkRFWF9vcF9yb3RsX2k2NDoKKyAgICAgICAgcmV0dXJuIHJvbDY0KHgsIHkpOworCisgICAgQ0FTRV9PUF8zMl82NChub3QpOgorICAgICAgICByZXR1cm4gfng7CisKKyAgICBDQVNFX09QXzMyXzY0KG5lZyk6CisgICAgICAgIHJldHVybiAteDsKKworICAgIENBU0VfT1BfMzJfNjQoYW5kYyk6CisgICAgICAgIHJldHVybiB4ICYgfnk7CisKKyAgICBDQVNFX09QXzMyXzY0KG9yYyk6CisgICAgICAgIHJldHVybiB4IHwgfnk7CisKKyAgICBDQVNFX09QXzMyXzY0KGVxdik6CisgICAgICAgIHJldHVybiB+KHggXiB5KTsKKworICAgIENBU0VfT1BfMzJfNjQobmFuZCk6CisgICAgICAgIHJldHVybiB+KHggJiB5KTsKKworICAgIENBU0VfT1BfMzJfNjQobm9yKToKKyAgICAgICAgcmV0dXJuIH4oeCB8IHkpOworCisgICAgQ0FTRV9PUF8zMl82NChleHQ4cyk6CisgICAgICAgIHJldHVybiAoaW50OF90KXg7CisKKyAgICBDQVNFX09QXzMyXzY0KGV4dDE2cyk6CisgICAgICAgIHJldHVybiAoaW50MTZfdCl4OworCisgICAgQ0FTRV9PUF8zMl82NChleHQ4dSk6CisgICAgICAgIHJldHVybiAodWludDhfdCl4OworCisgICAgQ0FTRV9PUF8zMl82NChleHQxNnUpOgorICAgICAgICByZXR1cm4gKHVpbnQxNl90KXg7CisKKyAgICBjYXNlIElOREVYX29wX2V4dDMyc19pNjQ6CisgICAgICAgIHJldHVybiAoaW50MzJfdCl4OworCisgICAgY2FzZSBJTkRFWF9vcF9leHQzMnVfaTY0OgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KXg7CisKKyAgICBjYXNlIElOREVYX29wX211bHVoX2kzMjoKKyAgICAgICAgcmV0dXJuICgodWludDY0X3QpKHVpbnQzMl90KXggKiAodWludDMyX3QpeSkgPj4gMzI7CisgICAgY2FzZSBJTkRFWF9vcF9tdWxzaF9pMzI6CisgICAgICAgIHJldHVybiAoKGludDY0X3QpKGludDMyX3QpeCAqIChpbnQzMl90KXkpID4+IDMyOworCisgICAgY2FzZSBJTkRFWF9vcF9tdWx1aF9pNjQ6CisgICAgICAgIG11bHU2NCgmbDY0LCAmaDY0LCB4LCB5KTsKKyAgICAgICAgcmV0dXJuIGg2NDsKKyAgICBjYXNlIElOREVYX29wX211bHNoX2k2NDoKKyAgICAgICAgbXVsczY0KCZsNjQsICZoNjQsIHgsIHkpOworICAgICAgICByZXR1cm4gaDY0OworCisgICAgY2FzZSBJTkRFWF9vcF9kaXZfaTMyOgorICAgICAgICAvKiBBdm9pZCBjcmFzaGluZyBvbiBkaXZpZGUgYnkgemVybywgb3RoZXJ3aXNlIHVuZGVmaW5lZC4gICovCisgICAgICAgIHJldHVybiAoaW50MzJfdCl4IC8gKChpbnQzMl90KXkgPyA6IDEpOworICAgIGNhc2UgSU5ERVhfb3BfZGl2dV9pMzI6CisgICAgICAgIHJldHVybiAodWludDMyX3QpeCAvICgodWludDMyX3QpeSA/IDogMSk7CisgICAgY2FzZSBJTkRFWF9vcF9kaXZfaTY0OgorICAgICAgICByZXR1cm4gKGludDY0X3QpeCAvICgoaW50NjRfdCl5ID8gOiAxKTsKKyAgICBjYXNlIElOREVYX29wX2RpdnVfaTY0OgorICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXggLyAoKHVpbnQ2NF90KXkgPyA6IDEpOworCisgICAgY2FzZSBJTkRFWF9vcF9yZW1faTMyOgorICAgICAgICByZXR1cm4gKGludDMyX3QpeCAlICgoaW50MzJfdCl5ID8gOiAxKTsKKyAgICBjYXNlIElOREVYX29wX3JlbXVfaTMyOgorICAgICAgICByZXR1cm4gKHVpbnQzMl90KXggJSAoKHVpbnQzMl90KXkgPyA6IDEpOworICAgIGNhc2UgSU5ERVhfb3BfcmVtX2k2NDoKKyAgICAgICAgcmV0dXJuIChpbnQ2NF90KXggJSAoKGludDY0X3QpeSA/IDogMSk7CisgICAgY2FzZSBJTkRFWF9vcF9yZW11X2k2NDoKKyAgICAgICAgcmV0dXJuICh1aW50NjRfdCl4ICUgKCh1aW50NjRfdCl5ID8gOiAxKTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgb3BlcmF0aW9uICVkIGluIGRvX2NvbnN0YW50X2ZvbGRpbmcuXG4iLCBvcCk7CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIFRDR0FyZyBkb19jb25zdGFudF9mb2xkaW5nKFRDR09wY29kZSBvcCwgVENHQXJnIHgsIFRDR0FyZyB5KQoreworICAgIFRDR0FyZyByZXMgPSBkb19jb25zdGFudF9mb2xkaW5nXzIob3AsIHgsIHkpOworICAgIGlmIChvcF9iaXRzKG9wKSA9PSAzMikgeworICAgICAgICByZXMgJj0gMHhmZmZmZmZmZjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGJvb2wgZG9fY29uc3RhbnRfZm9sZGluZ19jb25kXzMyKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIFRDR0NvbmQgYykKK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIFRDR19DT05EX0VROgorICAgICAgICByZXR1cm4geCA9PSB5OworICAgIGNhc2UgVENHX0NPTkRfTkU6CisgICAgICAgIHJldHVybiB4ICE9IHk7CisgICAgY2FzZSBUQ0dfQ09ORF9MVDoKKyAgICAgICAgcmV0dXJuIChpbnQzMl90KXggPCAoaW50MzJfdCl5OworICAgIGNhc2UgVENHX0NPTkRfR0U6CisgICAgICAgIHJldHVybiAoaW50MzJfdCl4ID49IChpbnQzMl90KXk7CisgICAgY2FzZSBUQ0dfQ09ORF9MRToKKyAgICAgICAgcmV0dXJuIChpbnQzMl90KXggPD0gKGludDMyX3QpeTsKKyAgICBjYXNlIFRDR19DT05EX0dUOgorICAgICAgICByZXR1cm4gKGludDMyX3QpeCA+IChpbnQzMl90KXk7CisgICAgY2FzZSBUQ0dfQ09ORF9MVFU6CisgICAgICAgIHJldHVybiB4IDwgeTsKKyAgICBjYXNlIFRDR19DT05EX0dFVToKKyAgICAgICAgcmV0dXJuIHggPj0geTsKKyAgICBjYXNlIFRDR19DT05EX0xFVToKKyAgICAgICAgcmV0dXJuIHggPD0geTsKKyAgICBjYXNlIFRDR19DT05EX0dUVToKKyAgICAgICAgcmV0dXJuIHggPiB5OworICAgIGRlZmF1bHQ6CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIGJvb2wgZG9fY29uc3RhbnRfZm9sZGluZ19jb25kXzY0KHVpbnQ2NF90IHgsIHVpbnQ2NF90IHksIFRDR0NvbmQgYykKK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIFRDR19DT05EX0VROgorICAgICAgICByZXR1cm4geCA9PSB5OworICAgIGNhc2UgVENHX0NPTkRfTkU6CisgICAgICAgIHJldHVybiB4ICE9IHk7CisgICAgY2FzZSBUQ0dfQ09ORF9MVDoKKyAgICAgICAgcmV0dXJuIChpbnQ2NF90KXggPCAoaW50NjRfdCl5OworICAgIGNhc2UgVENHX0NPTkRfR0U6CisgICAgICAgIHJldHVybiAoaW50NjRfdCl4ID49IChpbnQ2NF90KXk7CisgICAgY2FzZSBUQ0dfQ09ORF9MRToKKyAgICAgICAgcmV0dXJuIChpbnQ2NF90KXggPD0gKGludDY0X3QpeTsKKyAgICBjYXNlIFRDR19DT05EX0dUOgorICAgICAgICByZXR1cm4gKGludDY0X3QpeCA+IChpbnQ2NF90KXk7CisgICAgY2FzZSBUQ0dfQ09ORF9MVFU6CisgICAgICAgIHJldHVybiB4IDwgeTsKKyAgICBjYXNlIFRDR19DT05EX0dFVToKKyAgICAgICAgcmV0dXJuIHggPj0geTsKKyAgICBjYXNlIFRDR19DT05EX0xFVToKKyAgICAgICAgcmV0dXJuIHggPD0geTsKKyAgICBjYXNlIFRDR19DT05EX0dUVToKKyAgICAgICAgcmV0dXJuIHggPiB5OworICAgIGRlZmF1bHQ6CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworc3RhdGljIGJvb2wgZG9fY29uc3RhbnRfZm9sZGluZ19jb25kX2VxKFRDR0NvbmQgYykKK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIFRDR19DT05EX0dUOgorICAgIGNhc2UgVENHX0NPTkRfTFRVOgorICAgIGNhc2UgVENHX0NPTkRfTFQ6CisgICAgY2FzZSBUQ0dfQ09ORF9HVFU6CisgICAgY2FzZSBUQ0dfQ09ORF9ORToKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBUQ0dfQ09ORF9HRToKKyAgICBjYXNlIFRDR19DT05EX0dFVToKKyAgICBjYXNlIFRDR19DT05EX0xFOgorICAgIGNhc2UgVENHX0NPTkRfTEVVOgorICAgIGNhc2UgVENHX0NPTkRfRVE6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIH0KK30KKworLyogUmV0dXJuIDIgaWYgdGhlIGNvbmRpdGlvbiBjYW4ndCBiZSBzaW1wbGlmaWVkLCBhbmQgdGhlIHJlc3VsdAorICAgb2YgdGhlIGNvbmRpdGlvbiAoMCBvciAxKSBpZiBpdCBjYW4gKi8KK3N0YXRpYyBUQ0dBcmcgZG9fY29uc3RhbnRfZm9sZGluZ19jb25kKFRDR09wY29kZSBvcCwgVENHQXJnIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgeSwgVENHQ29uZCBjKQoreworICAgIGlmICh0ZW1wc1t4XS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVCAmJiB0ZW1wc1t5XS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVCkgeworICAgICAgICBzd2l0Y2ggKG9wX2JpdHMob3ApKSB7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICByZXR1cm4gZG9fY29uc3RhbnRfZm9sZGluZ19jb25kXzMyKHRlbXBzW3hdLnZhbCwgdGVtcHNbeV0udmFsLCBjKTsKKyAgICAgICAgY2FzZSA2NDoKKyAgICAgICAgICAgIHJldHVybiBkb19jb25zdGFudF9mb2xkaW5nX2NvbmRfNjQodGVtcHNbeF0udmFsLCB0ZW1wc1t5XS52YWwsIGMpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRlbXBzX2FyZV9jb3BpZXMoeCwgeSkpIHsKKyAgICAgICAgcmV0dXJuIGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZF9lcShjKTsKKyAgICB9IGVsc2UgaWYgKHRlbXBzW3ldLnN0YXRlID09IFRDR19URU1QX0NPTlNUICYmIHRlbXBzW3ldLnZhbCA9PSAwKSB7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICBjYXNlIFRDR19DT05EX0xUVToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFRDR19DT05EX0dFVToKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMjsKKyAgICB9Cit9CisKKy8qIFJldHVybiAyIGlmIHRoZSBjb25kaXRpb24gY2FuJ3QgYmUgc2ltcGxpZmllZCwgYW5kIHRoZSByZXN1bHQKKyAgIG9mIHRoZSBjb25kaXRpb24gKDAgb3IgMSkgaWYgaXQgY2FuICovCitzdGF0aWMgVENHQXJnIGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZDIoVENHQXJnICpwMSwgVENHQXJnICpwMiwgVENHQ29uZCBjKQoreworICAgIFRDR0FyZyBhbCA9IHAxWzBdLCBhaCA9IHAxWzFdOworICAgIFRDR0FyZyBibCA9IHAyWzBdLCBiaCA9IHAyWzFdOworCisgICAgaWYgKHRlbXBzW2JsXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAmJiB0ZW1wc1tiaF0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgdWludDY0X3QgYiA9ICgodWludDY0X3QpdGVtcHNbYmhdLnZhbCA8PCAzMikgfCAodWludDMyX3QpdGVtcHNbYmxdLnZhbDsKKworICAgICAgICBpZiAodGVtcHNbYWxdLnN0YXRlID09IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAmJiB0ZW1wc1thaF0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGE7CisgICAgICAgICAgICBhID0gKCh1aW50NjRfdCl0ZW1wc1thaF0udmFsIDw8IDMyKSB8ICh1aW50MzJfdCl0ZW1wc1thbF0udmFsOworICAgICAgICAgICAgcmV0dXJuIGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZF82NChhLCBiLCBjKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgVENHX0NPTkRfTFRVOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSBUQ0dfQ09ORF9HRVU6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh0ZW1wc19hcmVfY29waWVzKGFsLCBibCkgJiYgdGVtcHNfYXJlX2NvcGllcyhhaCwgYmgpKSB7CisgICAgICAgIHJldHVybiBkb19jb25zdGFudF9mb2xkaW5nX2NvbmRfZXEoYyk7CisgICAgfQorICAgIHJldHVybiAyOworfQorCitzdGF0aWMgYm9vbCBzd2FwX2NvbW11dGF0aXZlKFRDR0FyZyBkZXN0LCBUQ0dBcmcgKnAxLCBUQ0dBcmcgKnAyKQoreworICAgIFRDR0FyZyBhMSA9ICpwMSwgYTIgPSAqcDI7CisgICAgaW50IHN1bSA9IDA7CisgICAgc3VtICs9IHRlbXBzW2ExXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVDsKKyAgICBzdW0gLT0gdGVtcHNbYTJdLnN0YXRlID09IFRDR19URU1QX0NPTlNUOworCisgICAgLyogUHJlZmVyIHRoZSBjb25zdGFudCBpbiBzZWNvbmQgYXJndW1lbnQsIGFuZCB0aGVuIHRoZSBmb3JtCisgICAgICAgb3AgYSwgYSwgYiwgd2hpY2ggaXMgYmV0dGVyIGhhbmRsZWQgb24gbm9uLVJJU0MgaG9zdHMuICovCisgICAgaWYgKHN1bSA+IDAgfHwgKHN1bSA9PSAwICYmIGRlc3QgPT0gYTIpKSB7CisgICAgICAgICpwMSA9IGEyOworICAgICAgICAqcDIgPSBhMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc3dhcF9jb21tdXRhdGl2ZTIoVENHQXJnICpwMSwgVENHQXJnICpwMikKK3sKKyAgICBpbnQgc3VtID0gMDsKKyAgICBzdW0gKz0gdGVtcHNbcDFbMF1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUOworICAgIHN1bSArPSB0ZW1wc1twMVsxXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1Q7CisgICAgc3VtIC09IHRlbXBzW3AyWzBdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVDsKKyAgICBzdW0gLT0gdGVtcHNbcDJbMV1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUOworICAgIGlmIChzdW0gPiAwKSB7CisgICAgICAgIFRDR0FyZyB0OworICAgICAgICB0ID0gcDFbMF0sIHAxWzBdID0gcDJbMF0sIHAyWzBdID0gdDsKKyAgICAgICAgdCA9IHAxWzFdLCBwMVsxXSA9IHAyWzFdLCBwMlsxXSA9IHQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIFByb3BhZ2F0ZSBjb25zdGFudHMgYW5kIGNvcGllcywgZm9sZCBjb25zdGFudCBleHByZXNzaW9ucy4gKi8KK3N0YXRpYyBUQ0dBcmcgKnRjZ19jb25zdGFudF9mb2xkaW5nKFRDR0NvbnRleHQgKnMsIHVpbnQxNl90ICp0Y2dfb3BjX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyAqYXJncywgVENHT3BEZWYgKnRjZ19vcF9kZWZzKQoreworICAgIGludCBpLCBuYl9vcHMsIG9wX2luZGV4LCBuYl90ZW1wcywgbmJfZ2xvYmFscywgbmJfY2FsbF9hcmdzOworICAgIHRjZ190YXJnZXRfdWxvbmcgbWFzaywgYWZmZWN0ZWQ7CisgICAgVENHT3Bjb2RlIG9wOworICAgIGNvbnN0IFRDR09wRGVmICpkZWY7CisgICAgVENHQXJnICpnZW5fYXJnczsKKyAgICBUQ0dBcmcgdG1wOworCisgICAgLyogQXJyYXkgVkFMUyBoYXMgYW4gZWxlbWVudCBmb3IgZWFjaCB0ZW1wLgorICAgICAgIElmIHRoaXMgdGVtcCBob2xkcyBhIGNvbnN0YW50IHRoZW4gaXRzIHZhbHVlIGlzIGtlcHQgaW4gVkFMUycgZWxlbWVudC4KKyAgICAgICBJZiB0aGlzIHRlbXAgaXMgYSBjb3B5IG9mIG90aGVyIG9uZXMgdGhlbiB0aGUgb3RoZXIgY29waWVzIGFyZQorICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBkb3VibHkgbGlua2VkIGNpcmN1bGFyIGxpc3QuICovCisKKyAgICBuYl90ZW1wcyA9IHMtPm5iX3RlbXBzOworICAgIG5iX2dsb2JhbHMgPSBzLT5uYl9nbG9iYWxzOworICAgIHJlc2V0X2FsbF90ZW1wcyhuYl90ZW1wcyk7CisKKyAgICBuYl9vcHMgPSB0Y2dfb3BjX3B0ciAtIHMtPmdlbl9vcGNfYnVmOworICAgIGdlbl9hcmdzID0gYXJnczsKKyAgICBmb3IgKG9wX2luZGV4ID0gMDsgb3BfaW5kZXggPCBuYl9vcHM7IG9wX2luZGV4KyspIHsKKyAgICAgICAgb3AgPSBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF07CisgICAgICAgIGRlZiA9ICZ0Y2dfb3BfZGVmc1tvcF07CisgICAgICAgIC8qIERvIGNvcHkgcHJvcGFnYXRpb24gKi8KKyAgICAgICAgaWYgKG9wID09IElOREVYX29wX2NhbGwpIHsKKyAgICAgICAgICAgIGludCBuYl9vYXJncyA9IGFyZ3NbMF0gPj4gMTY7CisgICAgICAgICAgICBpbnQgbmJfaWFyZ3MgPSBhcmdzWzBdICYgMHhmZmZmOworICAgICAgICAgICAgZm9yIChpID0gbmJfb2FyZ3MgKyAxOyBpIDwgbmJfb2FyZ3MgKyBuYl9pYXJncyArIDE7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZW1wc1thcmdzW2ldXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT1BZKSB7CisgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBmaW5kX2JldHRlcl9jb3B5KHMsIGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGRlZi0+bmJfb2FyZ3M7IGkgPCBkZWYtPm5iX29hcmdzICsgZGVmLT5uYl9pYXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbaV1dLnN0YXRlID09IFRDR19URU1QX0NPUFkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGZpbmRfYmV0dGVyX2NvcHkocywgYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogRm9yIGNvbW11dGF0aXZlIG9wZXJhdGlvbnMgbWFrZSBjb25zdGFudCBzZWNvbmQgYXJndW1lbnQgKi8KKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBDQVNFX09QXzMyXzY0KGFkZCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQobXVsKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhbmQpOgorICAgICAgICBDQVNFX09QXzMyXzY0KG9yKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NCh4b3IpOgorICAgICAgICBDQVNFX09QXzMyXzY0KGVxdik6CisgICAgICAgIENBU0VfT1BfMzJfNjQobmFuZCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQobm9yKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtdWx1aCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQobXVsc2gpOgorICAgICAgICAgICAgc3dhcF9jb21tdXRhdGl2ZShhcmdzWzBdLCAmYXJnc1sxXSwgJmFyZ3NbMl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENBU0VfT1BfMzJfNjQoYnJjb25kKToKKyAgICAgICAgICAgIGlmIChzd2FwX2NvbW11dGF0aXZlKC0xLCAmYXJnc1swXSwgJmFyZ3NbMV0pKSB7CisgICAgICAgICAgICAgICAgYXJnc1syXSA9IHRjZ19zd2FwX2NvbmQoYXJnc1syXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzZXRjb25kKToKKyAgICAgICAgICAgIGlmIChzd2FwX2NvbW11dGF0aXZlKGFyZ3NbMF0sICZhcmdzWzFdLCAmYXJnc1syXSkpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzNdID0gdGNnX3N3YXBfY29uZChhcmdzWzNdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBDQVNFX09QXzMyXzY0KG1vdmNvbmQpOgorICAgICAgICAgICAgaWYgKHN3YXBfY29tbXV0YXRpdmUoLTEsICZhcmdzWzFdLCAmYXJnc1syXSkpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzVdID0gdGNnX3N3YXBfY29uZChhcmdzWzVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEZvciBtb3Zjb25kLCB3ZSBjYW5vbmljYWxpemUgdGhlICJmYWxzZSIgaW5wdXQgcmVnIHRvIG1hdGNoCisgICAgICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVnIHNvIHRoYXQgdGhlIHRjZyBiYWNrZW5kIGNhbiBpbXBsZW1lbnQKKyAgICAgICAgICAgICAgIGEgIm1vdmUgaWYgdHJ1ZSIgb3BlcmF0aW9uLiAgKi8KKyAgICAgICAgICAgIGlmIChzd2FwX2NvbW11dGF0aXZlKGFyZ3NbMF0sICZhcmdzWzRdLCAmYXJnc1szXSkpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzVdID0gdGNnX2ludmVydF9jb25kKGFyZ3NbNV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENBU0VfT1BfMzJfNjQoYWRkMik6CisgICAgICAgICAgICBzd2FwX2NvbW11dGF0aXZlKGFyZ3NbMF0sICZhcmdzWzJdLCAmYXJnc1s0XSk7CisgICAgICAgICAgICBzd2FwX2NvbW11dGF0aXZlKGFyZ3NbMV0sICZhcmdzWzNdLCAmYXJnc1s1XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtdWx1Mik6CisgICAgICAgIENBU0VfT1BfMzJfNjQobXVsczIpOgorICAgICAgICAgICAgc3dhcF9jb21tdXRhdGl2ZShhcmdzWzBdLCAmYXJnc1syXSwgJmFyZ3NbM10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfYnJjb25kMl9pMzI6CisgICAgICAgICAgICBpZiAoc3dhcF9jb21tdXRhdGl2ZTIoJmFyZ3NbMF0sICZhcmdzWzJdKSkgeworICAgICAgICAgICAgICAgIGFyZ3NbNF0gPSB0Y2dfc3dhcF9jb25kKGFyZ3NbNF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfc2V0Y29uZDJfaTMyOgorICAgICAgICAgICAgaWYgKHN3YXBfY29tbXV0YXRpdmUyKCZhcmdzWzFdLCAmYXJnc1szXSkpIHsKKyAgICAgICAgICAgICAgICBhcmdzWzVdID0gdGNnX3N3YXBfY29uZChhcmdzWzVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBTaW1wbGlmeSBleHByZXNzaW9ucyBmb3IgInNoaWZ0L3JvdCByLCAwLCBhID0+IG1vdmkgciwgMCIsCisgICAgICAgICAgIGFuZCAic3ViIHIsIDAsIGEgPT4gbmVnIHIsIGEiIGNhc2UuICAqLworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIENBU0VfT1BfMzJfNjQoc2hsKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzaHIpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHNhcik6CisgICAgICAgIENBU0VfT1BfMzJfNjQocm90bCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQocm90cik6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1sxXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzFdXS52YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wX3RvX21vdmkob3ApOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIDApOworICAgICAgICAgICAgICAgIGFyZ3MgKz0gMzsKKyAgICAgICAgICAgICAgICBnZW5fYXJncyArPSAyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENBU0VfT1BfMzJfNjQoc3ViKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUQ0dPcGNvZGUgbmVnX29wOworICAgICAgICAgICAgICAgIGJvb2wgaGF2ZV9uZWc7CisKKyAgICAgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUHJvY2VlZCB3aXRoIHBvc3NpYmxlIGNvbnN0YW50IGZvbGRpbmcuICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gSU5ERVhfb3Bfc3ViX2kzMikgeworICAgICAgICAgICAgICAgICAgICBuZWdfb3AgPSBJTkRFWF9vcF9uZWdfaTMyOworICAgICAgICAgICAgICAgICAgICBoYXZlX25lZyA9IFRDR19UQVJHRVRfSEFTX25lZ19pMzI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmVnX29wID0gSU5ERVhfb3BfbmVnX2k2NDsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZV9uZWcgPSBUQ0dfVEFSR0VUX0hBU19uZWdfaTY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWhhdmVfbmVnKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1sxXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1sxXV0udmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gbmVnX29wOworICAgICAgICAgICAgICAgICAgICByZXNldF90ZW1wKGFyZ3NbMF0pOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJnc1swXSA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgICAgIGdlbl9hcmdzWzFdID0gYXJnc1syXTsKKyAgICAgICAgICAgICAgICAgICAgYXJncyArPSAzOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJncyArPSAyOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0FTRV9PUF8zMl82NCh4b3IpOgorICAgICAgICBDQVNFX09QXzMyXzY0KG5hbmQpOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMV1dLnN0YXRlICE9IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzJdXS52YWwgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIHRyeV9ub3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChub3IpOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMV1dLnN0YXRlICE9IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzJdXS52YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gdHJ5X25vdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBDQVNFX09QXzMyXzY0KGFuZGMpOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMl1dLnN0YXRlICE9IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1sxXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzFdXS52YWwgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpID0gMjsKKyAgICAgICAgICAgICAgICBnb3RvIHRyeV9ub3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcmMpOgorICAgICAgICBDQVNFX09QXzMyXzY0KGVxdik6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgIT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzFdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAgICAgICAgICYmIHRlbXBzW2FyZ3NbMV1dLnZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaSA9IDI7CisgICAgICAgICAgICAgICAgZ290byB0cnlfbm90OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHRyeV9ub3Q6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENHT3Bjb2RlIG5vdF9vcDsKKyAgICAgICAgICAgICAgICBib29sIGhhdmVfbm90OworCisgICAgICAgICAgICAgICAgaWYgKGRlZi0+ZmxhZ3MgJiBUQ0dfT1BGXzY0QklUKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdF9vcCA9IElOREVYX29wX25vdF9pNjQ7CisgICAgICAgICAgICAgICAgICAgIGhhdmVfbm90ID0gVENHX1RBUkdFVF9IQVNfbm90X2k2NDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBub3Rfb3AgPSBJTkRFWF9vcF9ub3RfaTMyOworICAgICAgICAgICAgICAgICAgICBoYXZlX25vdCA9IFRDR19UQVJHRVRfSEFTX25vdF9pMzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghaGF2ZV9ub3QpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG5vdF9vcDsKKyAgICAgICAgICAgICAgICByZXNldF90ZW1wKGFyZ3NbMF0pOworICAgICAgICAgICAgICAgIGdlbl9hcmdzWzBdID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICBnZW5fYXJnc1sxXSA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgYXJncyArPSAzOworICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNpbXBsaWZ5IGV4cHJlc3Npb24gZm9yICJvcCByLCBhLCBjb25zdCA9PiBtb3YgciwgYSIgY2FzZXMgKi8KKyAgICAgICAgc3dpdGNoIChvcCkgeworICAgICAgICBDQVNFX09QXzMyXzY0KGFkZCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoc3ViKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzaGwpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHNocik6CisgICAgICAgIENBU0VfT1BfMzJfNjQoc2FyKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChyb3RsKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChyb3RyKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcik6CisgICAgICAgIENBU0VfT1BfMzJfNjQoeG9yKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhbmRjKToKKyAgICAgICAgICAgIGlmICh0ZW1wc1thcmdzWzFdXS5zdGF0ZSAhPSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAgICAgICAgICYmIHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0udmFsID09IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX21vdjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENBU0VfT1BfMzJfNjQoYW5kKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcmMpOgorICAgICAgICBDQVNFX09QXzMyXzY0KGVxdik6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1sxXV0uc3RhdGUgIT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzJdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAgICAgICAgICYmIHRlbXBzW2FyZ3NbMl1dLnZhbCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGdvdG8gZG9fbW92MzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkb19tb3YzOgorICAgICAgICAgICAgICAgIGlmICh0ZW1wc19hcmVfY29waWVzKGFyZ3NbMF0sIGFyZ3NbMV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IElOREVYX29wX25vcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3Yob3ApOworICAgICAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3YocywgZ2VuX2FyZ3MsIGFyZ3NbMF0sIGFyZ3NbMV0pOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJncyArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzICs9IDM7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNpbXBsaWZ5IHVzaW5nIGtub3duLXplcm8gYml0cy4gQ3VycmVudGx5IG9ubHkgb3BzIHdpdGggYSBzaW5nbGUKKyAgICAgICAgICAgb3V0cHV0IGFyZ3VtZW50IGlzIHN1cHBvcnRlZC4gKi8KKyAgICAgICAgbWFzayA9IC0xOworICAgICAgICBhZmZlY3RlZCA9IC0xOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIENBU0VfT1BfMzJfNjQoZXh0OHMpOgorICAgICAgICAgICAgaWYgKCh0ZW1wc1thcmdzWzFdXS5tYXNrICYgMHg4MCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBDQVNFX09QXzMyXzY0KGV4dDh1KToKKyAgICAgICAgICAgIG1hc2sgPSAweGZmOworICAgICAgICAgICAgZ290byBhbmRfY29uc3Q7CisgICAgICAgIENBU0VfT1BfMzJfNjQoZXh0MTZzKToKKyAgICAgICAgICAgIGlmICgodGVtcHNbYXJnc1sxXV0ubWFzayAmIDB4ODAwMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBDQVNFX09QXzMyXzY0KGV4dDE2dSk6CisgICAgICAgICAgICBtYXNrID0gMHhmZmZmOworICAgICAgICAgICAgZ290byBhbmRfY29uc3Q7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfZXh0MzJzX2k2NDoKKyAgICAgICAgICAgIGlmICgodGVtcHNbYXJnc1sxXV0ubWFzayAmIDB4ODAwMDAwMDApICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBJTkRFWF9vcF9leHQzMnVfaTY0OgorICAgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmZVOworICAgICAgICAgICAgZ290byBhbmRfY29uc3Q7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhbmQpOgorICAgICAgICAgICAgbWFzayA9IHRlbXBzW2FyZ3NbMl1dLm1hc2s7CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgYW5kX2NvbnN0OgorICAgICAgICAgICAgICAgIGFmZmVjdGVkID0gdGVtcHNbYXJnc1sxXV0ubWFzayAmIH5tYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFzayA9IHRlbXBzW2FyZ3NbMV1dLm1hc2sgJiBtYXNrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhbmRjKToKKyAgICAgICAgICAgIC8qIEtub3duLXplcm9zIGRvZXMgbm90IGltcGx5IGtub3duLW9uZXMuICBUaGVyZWZvcmUgdW5sZXNzCisgICAgICAgICAgICAgICBhcmdzWzJdIGlzIGNvbnN0YW50LCB3ZSBjYW4ndCBpbmZlciBhbnl0aGluZyBmcm9tIGl0LiAgKi8KKyAgICAgICAgICAgIGlmICh0ZW1wc1thcmdzWzJdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVCkgeworICAgICAgICAgICAgICAgIG1hc2sgPSB+dGVtcHNbYXJnc1syXV0ubWFzazsKKyAgICAgICAgICAgICAgICBnb3RvIGFuZF9jb25zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIEJ1dCB3ZSBjZXJ0YWlubHkga25vdyBub3RoaW5nIG91dHNpZGUgYXJnc1sxXSBtYXkgYmUgc2V0LiAqLworICAgICAgICAgICAgbWFzayA9IHRlbXBzW2FyZ3NbMV1dLm1hc2s7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOREVYX29wX3Nhcl9pMzI6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gKGludDMyX3QpdGVtcHNbYXJnc1sxXV0ubWFzayA+PiB0ZW1wc1thcmdzWzJdXS52YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9zYXJfaTY0OgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IChpbnQ2NF90KXRlbXBzW2FyZ3NbMV1dLm1hc2sgPj4gdGVtcHNbYXJnc1syXV0udmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9zaHJfaTMyOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgbWFzayA9ICh1aW50MzJfdCl0ZW1wc1thcmdzWzFdXS5tYXNrID4+IHRlbXBzW2FyZ3NbMl1dLnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOREVYX29wX3Nocl9pNjQ6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICBtYXNrID0gKHVpbnQ2NF90KXRlbXBzW2FyZ3NbMV1dLm1hc2sgPj4gdGVtcHNbYXJnc1syXV0udmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzaGwpOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgbWFzayA9IHRlbXBzW2FyZ3NbMV1dLm1hc2sgPDwgdGVtcHNbYXJnc1syXV0udmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChuZWcpOgorICAgICAgICAgICAgLyogU2V0IHRvIDEgYWxsIGJpdHMgdG8gdGhlIGxlZnQgb2YgdGhlIHJpZ2h0bW9zdC4gICovCisgICAgICAgICAgICBtYXNrID0gLSh0ZW1wc1thcmdzWzFdXS5tYXNrICYgLXRlbXBzW2FyZ3NbMV1dLm1hc2spOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChkZXBvc2l0KToKKyAgICAgICAgICAgIHRtcCA9ICgoMXVsbCA8PCBhcmdzWzRdKSAtIDEpOworICAgICAgICAgICAgbWFzayA9ICgodGVtcHNbYXJnc1sxXV0ubWFzayAmIH4odG1wIDw8IGFyZ3NbM10pKQorICAgICAgICAgICAgICAgICAgICB8ICgodGVtcHNbYXJnc1syXV0ubWFzayAmIHRtcCkgPDwgYXJnc1szXSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcik6CisgICAgICAgIENBU0VfT1BfMzJfNjQoeG9yKToKKyAgICAgICAgICAgIG1hc2sgPSB0ZW1wc1thcmdzWzFdXS5tYXNrIHwgdGVtcHNbYXJnc1syXV0ubWFzazsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENBU0VfT1BfMzJfNjQoc2V0Y29uZCk6CisgICAgICAgICAgICBtYXNrID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENBU0VfT1BfMzJfNjQobW92Y29uZCk6CisgICAgICAgICAgICBtYXNrID0gdGVtcHNbYXJnc1szXV0ubWFzayB8IHRlbXBzW2FyZ3NbNF1dLm1hc2s7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDQVNFX09QXzMyXzY0KGxkOHUpOgorICAgICAgICBjYXNlIElOREVYX29wX3FlbXVfbGQ4dToKKyAgICAgICAgICAgIG1hc2sgPSAweGZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENBU0VfT1BfMzJfNjQobGQxNnUpOgorICAgICAgICBjYXNlIElOREVYX29wX3FlbXVfbGQxNnU6CisgICAgICAgICAgICBtYXNrID0gMHhmZmZmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbGQzMnVfaTY0OgorI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9xZW11X2xkMzJ1OgorI2VuZGlmCisgICAgICAgICAgICBtYXNrID0gMHhmZmZmZmZmZnU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDQVNFX09QXzMyXzY0KHFlbXVfbGQpOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRDR01lbU9wIG1vcCA9IGFyZ3NbZGVmLT5uYl9vYXJncyArIGRlZi0+bmJfaWFyZ3NdOworICAgICAgICAgICAgICAgIGlmICghKG1vcCAmIE1PX1NJR04pKSB7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAoMlVMTCA8PCAoKDggPDwgKG1vcCAmIE1PX1NJWkUpKSAtIDEpKSAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogMzItYml0IG9wcyAobm9uIDY0LWJpdCBvcHMgYW5kIG5vbiBsb2FkL3N0b3JlIG9wcykgZ2VuZXJhdGUgMzItYml0CisgICAgICAgICAgIHJlc3VsdHMgKi8KKyAgICAgICAgaWYgKCEoZGVmLT5mbGFncyAmIChUQ0dfT1BGX0NBTExfQ0xPQkJFUiB8IFRDR19PUEZfNjRCSVQpKSkgeworICAgICAgICAgICAgbWFzayAmPSAweGZmZmZmZmZmdTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFzayA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoZGVmLT5uYl9vYXJncyA9PSAxKTsKKyAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wX3RvX21vdmkob3ApOworICAgICAgICAgICAgdGNnX29wdF9nZW5fbW92aShnZW5fYXJncywgYXJnc1swXSwgMCk7CisgICAgICAgICAgICBhcmdzICs9IGRlZi0+bmJfb2FyZ3MgKyBkZWYtPm5iX2lhcmdzICsgZGVmLT5uYl9jYXJnczsKKyAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWZmZWN0ZWQgPT0gMCkgeworICAgICAgICAgICAgYXNzZXJ0KGRlZi0+bmJfb2FyZ3MgPT0gMSk7CisgICAgICAgICAgICBpZiAodGVtcHNfYXJlX2NvcGllcyhhcmdzWzBdLCBhcmdzWzFdKSkgeworICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IElOREVYX29wX25vcDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcHNbYXJnc1sxXV0uc3RhdGUgIT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3Yob3ApOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdihzLCBnZW5fYXJncywgYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gb3BfdG9fbW92aShvcCk7CisgICAgICAgICAgICAgICAgdGNnX29wdF9nZW5fbW92aShnZW5fYXJncywgYXJnc1swXSwgdGVtcHNbYXJnc1sxXV0udmFsKTsKKyAgICAgICAgICAgICAgICBnZW5fYXJncyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncyArPSBkZWYtPm5iX2lhcmdzICsgMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogU2ltcGxpZnkgZXhwcmVzc2lvbiBmb3IgIm9wIHIsIGEsIDAgPT4gbW92aSByLCAwIiBjYXNlcyAqLworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIENBU0VfT1BfMzJfNjQoYW5kKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtdWwpOgorICAgICAgICBDQVNFX09QXzMyXzY0KG11bHVoKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtdWxzaCk6CisgICAgICAgICAgICBpZiAoKHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0udmFsID09IDApKSB7CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gb3BfdG9fbW92aShvcCk7CisgICAgICAgICAgICAgICAgdGNnX29wdF9nZW5fbW92aShnZW5fYXJncywgYXJnc1swXSwgMCk7CisgICAgICAgICAgICAgICAgYXJncyArPSAzOworICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogU2ltcGxpZnkgZXhwcmVzc2lvbiBmb3IgIm9wIHIsIGEsIGEgPT4gbW92IHIsIGEiIGNhc2VzICovCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcik6CisgICAgICAgIENBU0VfT1BfMzJfNjQoYW5kKToKKyAgICAgICAgICAgIGlmICh0ZW1wc19hcmVfY29waWVzKGFyZ3NbMV0sIGFyZ3NbMl0pKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBzX2FyZV9jb3BpZXMoYXJnc1swXSwgYXJnc1sxXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfbm9wOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wX3RvX21vdihvcCk7CisgICAgICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdihzLCBnZW5fYXJncywgYXJnc1swXSwgYXJnc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZ3MgKz0gMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBTaW1wbGlmeSBleHByZXNzaW9uIGZvciAib3AgciwgYSwgYSA9PiBtb3ZpIHIsIDAiIGNhc2VzICovCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhbmRjKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzdWIpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHhvcik6CisgICAgICAgICAgICBpZiAodGVtcHNfYXJlX2NvcGllcyhhcmdzWzFdLCBhcmdzWzJdKSkgeworICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wX3RvX21vdmkob3ApOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIDApOworICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICAgICAgYXJncyArPSAzOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFByb3BhZ2F0ZSBjb25zdGFudHMgdGhyb3VnaCBjb3B5IG9wZXJhdGlvbnMgYW5kIGRvIGNvbnN0YW50CisgICAgICAgICAgIGZvbGRpbmcuICBDb25zdGFudHMgd2lsbCBiZSBzdWJzdGl0dXRlZCB0byBhcmd1bWVudHMgYnkgcmVnaXN0ZXIKKyAgICAgICAgICAgYWxsb2NhdG9yIHdoZXJlIG5lZWRlZCBhbmQgcG9zc2libGUuICBBbHNvIGRldGVjdCBjb3BpZXMuICovCisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtb3YpOgorICAgICAgICAgICAgaWYgKHRlbXBzX2FyZV9jb3BpZXMoYXJnc1swXSwgYXJnc1sxXSkpIHsKKyAgICAgICAgICAgICAgICBhcmdzICs9IDI7CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfbm9wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMV1dLnN0YXRlICE9IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgdGNnX29wdF9nZW5fbW92KHMsIGdlbl9hcmdzLCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgICAgICBnZW5fYXJncyArPSAyOworICAgICAgICAgICAgICAgIGFyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNvdXJjZSBhcmd1bWVudCBpcyBjb25zdGFudC4gIFJld3JpdGUgdGhlIG9wZXJhdGlvbiBhbmQKKyAgICAgICAgICAgICAgIGxldCBtb3ZpIGNhc2UgaGFuZGxlIGl0LiAqLworICAgICAgICAgICAgb3AgPSBvcF90b19tb3ZpKG9wKTsKKyAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wOworICAgICAgICAgICAgYXJnc1sxXSA9IHRlbXBzW2FyZ3NbMV1dLnZhbDsKKyAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICAgIENBU0VfT1BfMzJfNjQobW92aSk6CisgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3ZpKGdlbl9hcmdzLCBhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICBhcmdzICs9IDI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDQVNFX09QXzMyXzY0KG5vdCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQobmVnKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChleHQ4cyk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoZXh0OHUpOgorICAgICAgICBDQVNFX09QXzMyXzY0KGV4dDE2cyk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoZXh0MTZ1KToKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9leHQzMnNfaTY0OgorICAgICAgICBjYXNlIElOREVYX29wX2V4dDMydV9pNjQ6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1sxXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3ZpKG9wKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBkb19jb25zdGFudF9mb2xkaW5nKG9wLCB0ZW1wc1thcmdzWzFdXS52YWwsIDApOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIHRtcCk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICBhcmdzICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChhZGQpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHN1Yik6CisgICAgICAgIENBU0VfT1BfMzJfNjQobXVsKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChvcik6CisgICAgICAgIENBU0VfT1BfMzJfNjQoYW5kKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NCh4b3IpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHNobCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoc2hyKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzYXIpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHJvdGwpOgorICAgICAgICBDQVNFX09QXzMyXzY0KHJvdHIpOgorICAgICAgICBDQVNFX09QXzMyXzY0KGFuZGMpOgorICAgICAgICBDQVNFX09QXzMyXzY0KG9yYyk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoZXF2KToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChuYW5kKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChub3IpOgorICAgICAgICBDQVNFX09QXzMyXzY0KG11bHVoKToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtdWxzaCk6CisgICAgICAgIENBU0VfT1BfMzJfNjQoZGl2KToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChkaXZ1KToKKyAgICAgICAgQ0FTRV9PUF8zMl82NChyZW0pOgorICAgICAgICBDQVNFX09QXzMyXzY0KHJlbXUpOgorICAgICAgICAgICAgaWYgKHRlbXBzW2FyZ3NbMV1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3ZpKG9wKTsKKyAgICAgICAgICAgICAgICB0bXAgPSBkb19jb25zdGFudF9mb2xkaW5nKG9wLCB0ZW1wc1thcmdzWzFdXS52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wc1thcmdzWzJdXS52YWwpOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIHRtcCk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICBhcmdzICs9IDM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChkZXBvc2l0KToKKyAgICAgICAgICAgIGlmICh0ZW1wc1thcmdzWzFdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAgICAgICAgICYmIHRlbXBzW2FyZ3NbMl1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gb3BfdG9fbW92aShvcCk7CisgICAgICAgICAgICAgICAgdG1wID0gKCgxdWxsIDw8IGFyZ3NbNF0pIC0gMSk7CisgICAgICAgICAgICAgICAgdG1wID0gKHRlbXBzW2FyZ3NbMV1dLnZhbCAmIH4odG1wIDw8IGFyZ3NbM10pKQorICAgICAgICAgICAgICAgICAgICAgIHwgKCh0ZW1wc1thcmdzWzJdXS52YWwgJiB0bXApIDw8IGFyZ3NbM10pOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIHRtcCk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICBhcmdzICs9IDU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChzZXRjb25kKToKKyAgICAgICAgICAgIHRtcCA9IGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZChvcCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IDIpIHsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3ZpKG9wKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3ZpKGdlbl9hcmdzLCBhcmdzWzBdLCB0bXApOworICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDI7CisgICAgICAgICAgICAgICAgYXJncyArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBkb19kZWZhdWx0OworCisgICAgICAgIENBU0VfT1BfMzJfNjQoYnJjb25kKToKKyAgICAgICAgICAgIHRtcCA9IGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZChvcCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CisgICAgICAgICAgICBpZiAodG1wICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0X2FsbF90ZW1wcyhuYl90ZW1wcyk7CisgICAgICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IElOREVYX29wX2JyOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJnc1swXSA9IGFyZ3NbM107CisgICAgICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfbm9wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisKKyAgICAgICAgQ0FTRV9PUF8zMl82NChtb3Zjb25kKToKKyAgICAgICAgICAgIHRtcCA9IGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZChvcCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1s1XSk7CisgICAgICAgICAgICBpZiAodG1wICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodGVtcHNfYXJlX2NvcGllcyhhcmdzWzBdLCBhcmdzWzQtdG1wXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfbm9wOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcHNbYXJnc1s0LXRtcF1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wX3RvX21vdmkob3ApOworICAgICAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3ZpKGdlbl9hcmdzLCBhcmdzWzBdLCB0ZW1wc1thcmdzWzQtdG1wXV0udmFsKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBvcF90b19tb3Yob3ApOworICAgICAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3YocywgZ2VuX2FyZ3MsIGFyZ3NbMF0sIGFyZ3NbNC10bXBdKTsKKyAgICAgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJncyArPSA2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBkb19kZWZhdWx0OworCisgICAgICAgIGNhc2UgSU5ERVhfb3BfYWRkMl9pMzI6CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfc3ViMl9pMzI6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzNdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVAorICAgICAgICAgICAgICAgICYmIHRlbXBzW2FyZ3NbNF1dLnN0YXRlID09IFRDR19URU1QX0NPTlNUCisgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1s1XV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhbCA9IHRlbXBzW2FyZ3NbMl1dLnZhbDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhaCA9IHRlbXBzW2FyZ3NbM11dLnZhbDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBibCA9IHRlbXBzW2FyZ3NbNF1dLnZhbDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBiaCA9IHRlbXBzW2FyZ3NbNV1dLnZhbDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBhID0gKCh1aW50NjRfdClhaCA8PCAzMikgfCBhbDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBiID0gKCh1aW50NjRfdCliaCA8PCAzMikgfCBibDsKKyAgICAgICAgICAgICAgICBUQ0dBcmcgcmwsIHJoOworCisgICAgICAgICAgICAgICAgaWYgKG9wID09IElOREVYX29wX2FkZDJfaTMyKSB7CisgICAgICAgICAgICAgICAgICAgIGEgKz0gYjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhIC09IGI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2UgZW1pdCB0aGUgZXh0cmEgbm9wIHdoZW4gd2UgZW1pdCB0aGUgYWRkMi9zdWIyLiAgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQocy0+Z2VuX29wY19idWZbb3BfaW5kZXggKyAxXSA9PSBJTkRFWF9vcF9ub3ApOworCisgICAgICAgICAgICAgICAgcmwgPSBhcmdzWzBdOworICAgICAgICAgICAgICAgIHJoID0gYXJnc1sxXTsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBJTkRFWF9vcF9tb3ZpX2kzMjsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZlsrK29wX2luZGV4XSA9IElOREVYX29wX21vdmlfaTMyOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoJmdlbl9hcmdzWzBdLCBybCwgKHVpbnQzMl90KWEpOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoJmdlbl9hcmdzWzJdLCByaCwgKHVpbnQzMl90KShhID4+IDMyKSk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gNDsKKyAgICAgICAgICAgICAgICBhcmdzICs9IDY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9tdWx1Ml9pMzI6CisgICAgICAgICAgICBpZiAodGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAmJiB0ZW1wc1thcmdzWzNdXS5zdGF0ZSA9PSBUQ0dfVEVNUF9DT05TVCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGEgPSB0ZW1wc1thcmdzWzJdXS52YWw7CisgICAgICAgICAgICAgICAgdWludDMyX3QgYiA9IHRlbXBzW2FyZ3NbM11dLnZhbDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCByID0gKHVpbnQ2NF90KWEgKiBiOworICAgICAgICAgICAgICAgIFRDR0FyZyBybCwgcmg7CisKKyAgICAgICAgICAgICAgICAvKiBXZSBlbWl0IHRoZSBleHRyYSBub3Agd2hlbiB3ZSBlbWl0IHRoZSBtdWx1Mi4gICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHMtPmdlbl9vcGNfYnVmW29wX2luZGV4ICsgMV0gPT0gSU5ERVhfb3Bfbm9wKTsKKworICAgICAgICAgICAgICAgIHJsID0gYXJnc1swXTsKKyAgICAgICAgICAgICAgICByaCA9IGFyZ3NbMV07CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3BfbW92aV9pMzI7CisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbKytvcF9pbmRleF0gPSBJTkRFWF9vcF9tb3ZpX2kzMjsKKyAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3ZpKCZnZW5fYXJnc1swXSwgcmwsICh1aW50MzJfdClyKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3B0X2dlbl9tb3ZpKCZnZW5fYXJnc1syXSwgcmgsICh1aW50MzJfdCkociA+PiAzMikpOworICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDQ7CisgICAgICAgICAgICAgICAgYXJncyArPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBkb19kZWZhdWx0OworCisgICAgICAgIGNhc2UgSU5ERVhfb3BfYnJjb25kMl9pMzI6CisgICAgICAgICAgICB0bXAgPSBkb19jb25zdGFudF9mb2xkaW5nX2NvbmQyKCZhcmdzWzBdLCAmYXJnc1syXSwgYXJnc1s0XSk7CisgICAgICAgICAgICBpZiAodG1wICE9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0X2FsbF90ZW1wcyhuYl90ZW1wcyk7CisgICAgICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IElOREVYX29wX2JyOworICAgICAgICAgICAgICAgICAgICBnZW5fYXJnc1swXSA9IGFyZ3NbNV07CisgICAgICAgICAgICAgICAgICAgIGdlbl9hcmdzICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfbm9wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGFyZ3NbNF0gPT0gVENHX0NPTkRfTFQgfHwgYXJnc1s0XSA9PSBUQ0dfQ09ORF9HRSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1szXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1syXV0udmFsID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1szXV0udmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBTaW1wbGlmeSBMVC9HRSBjb21wYXJpc29ucyB2cyB6ZXJvIHRvIGEgc2luZ2xlIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICB2cyB0aGUgaGlnaCB3b3JkIG9mIHRoZSBpbnB1dC4gICovCisgICAgICAgICAgICAgICAgcmVzZXRfYWxsX3RlbXBzKG5iX3RlbXBzKTsKKyAgICAgICAgICAgICAgICBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF0gPSBJTkRFWF9vcF9icmNvbmRfaTMyOworICAgICAgICAgICAgICAgIGdlbl9hcmdzWzBdID0gYXJnc1sxXTsKKyAgICAgICAgICAgICAgICBnZW5fYXJnc1sxXSA9IGFyZ3NbM107CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3NbMl0gPSBhcmdzWzRdOworICAgICAgICAgICAgICAgIGdlbl9hcmdzWzNdID0gYXJnc1s1XTsKKyAgICAgICAgICAgICAgICBnZW5fYXJncyArPSA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX2RlZmF1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmdzICs9IDY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOREVYX29wX3NldGNvbmQyX2kzMjoKKyAgICAgICAgICAgIHRtcCA9IGRvX2NvbnN0YW50X2ZvbGRpbmdfY29uZDIoJmFyZ3NbMV0sICZhcmdzWzNdLCBhcmdzWzVdKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gMikgeworICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IElOREVYX29wX21vdmlfaTMyOworICAgICAgICAgICAgICAgIHRjZ19vcHRfZ2VuX21vdmkoZ2VuX2FyZ3MsIGFyZ3NbMF0sIHRtcCk7CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGFyZ3NbNV0gPT0gVENHX0NPTkRfTFQgfHwgYXJnc1s1XSA9PSBUQ0dfQ09ORF9HRSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1szXV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1s0XV0uc3RhdGUgPT0gVENHX1RFTVBfQ09OU1QKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1szXV0udmFsID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVtcHNbYXJnc1s0XV0udmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBTaW1wbGlmeSBMVC9HRSBjb21wYXJpc29ucyB2cyB6ZXJvIHRvIGEgc2luZ2xlIGNvbXBhcmUKKyAgICAgICAgICAgICAgICAgICB2cyB0aGUgaGlnaCB3b3JkIG9mIHRoZSBpbnB1dC4gICovCisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gSU5ERVhfb3Bfc2V0Y29uZF9pMzI7CisgICAgICAgICAgICAgICAgcmVzZXRfdGVtcChhcmdzWzBdKTsKKyAgICAgICAgICAgICAgICBnZW5fYXJnc1swXSA9IGFyZ3NbMF07CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3NbMV0gPSBhcmdzWzJdOworICAgICAgICAgICAgICAgIGdlbl9hcmdzWzJdID0gYXJnc1s0XTsKKyAgICAgICAgICAgICAgICBnZW5fYXJnc1szXSA9IGFyZ3NbNV07CisgICAgICAgICAgICAgICAgZ2VuX2FyZ3MgKz0gNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBkb19kZWZhdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncyArPSA2OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9jYWxsOgorICAgICAgICAgICAgbmJfY2FsbF9hcmdzID0gKGFyZ3NbMF0gPj4gMTYpICsgKGFyZ3NbMF0gJiAweGZmZmYpOworICAgICAgICAgICAgaWYgKCEoYXJnc1tuYl9jYWxsX2FyZ3MgKyAxXSAmIChUQ0dfQ0FMTF9OT19SRUFEX0dMT0JBTFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dfQ0FMTF9OT19XUklURV9HTE9CQUxTKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZ2xvYmFsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RlbXAoaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChhcmdzWzBdID4+IDE2KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzZXRfdGVtcChhcmdzW2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gbmJfY2FsbF9hcmdzICsgMzsKKyAgICAgICAgICAgIHdoaWxlIChpKSB7CisgICAgICAgICAgICAgICAgKmdlbl9hcmdzID0gKmFyZ3M7CisgICAgICAgICAgICAgICAgYXJncysrOworICAgICAgICAgICAgICAgIGdlbl9hcmdzKys7CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgZG9fZGVmYXVsdDoKKyAgICAgICAgICAgIC8qIERlZmF1bHQgY2FzZTogd2Uga25vdyBub3RoaW5nIGFib3V0IG9wZXJhdGlvbiAob3Igd2VyZSB1bmFibGUKKyAgICAgICAgICAgICAgIHRvIGNvbXB1dGUgdGhlIG9wZXJhdGlvbiByZXN1bHQpIHNvIG5vIHByb3BhZ2F0aW9uIGlzIGRvbmUuCisgICAgICAgICAgICAgICBXZSB0cmFzaCBldmVyeXRoaW5nIGlmIHRoZSBvcGVyYXRpb24gaXMgdGhlIGVuZCBvZiBhIGJhc2ljCisgICAgICAgICAgICAgICBibG9jaywgb3RoZXJ3aXNlIHdlIG9ubHkgdHJhc2ggdGhlIG91dHB1dCBhcmdzLiAgIm1hc2siIGlzCisgICAgICAgICAgICAgICB0aGUgbm9uLXplcm8gYml0cyBtYXNrIGZvciB0aGUgZmlyc3Qgb3V0cHV0IGFyZy4gICovCisgICAgICAgICAgICBpZiAoZGVmLT5mbGFncyAmIFRDR19PUEZfQkJfRU5EKSB7CisgICAgICAgICAgICAgICAgcmVzZXRfYWxsX3RlbXBzKG5iX3RlbXBzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bmJfb2FyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICByZXNldF90ZW1wKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBjb3JyZXNwb25kaW5nIGtub3duLXplcm8gYml0cyBtYXNrIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Qgb3V0cHV0IGFyZ3VtZW50IChvbmx5IG9uZSBzdXBwb3J0ZWQgc28gZmFyKS4gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHNbYXJnc1tpXV0ubWFzayA9IG1hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5uYl9hcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBnZW5fYXJnc1tpXSA9IGFyZ3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmdzICs9IGRlZi0+bmJfYXJnczsKKyAgICAgICAgICAgIGdlbl9hcmdzICs9IGRlZi0+bmJfYXJnczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGdlbl9hcmdzOworfQorCitUQ0dBcmcgKnRjZ19vcHRpbWl6ZShUQ0dDb250ZXh0ICpzLCB1aW50MTZfdCAqdGNnX29wY19wdHIsCisgICAgICAgIFRDR0FyZyAqYXJncywgVENHT3BEZWYgKnRjZ19vcF9kZWZzKQoreworICAgIFRDR0FyZyAqcmVzOworICAgIHJlcyA9IHRjZ19jb25zdGFudF9mb2xkaW5nKHMsIHRjZ19vcGNfcHRyLCBhcmdzLCB0Y2dfb3BfZGVmcyk7CisgICAgcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGNnL3RjZy1iZS1sZHN0LmggYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctYmUtbGRzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctYmUtbGRzdC5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBUQ0cgQmFja2VuZCBEYXRhOiBsb2FkLXN0b3JlIG9wdGltaXphdGlvbiBvbmx5LgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgQ09ORklHX1NPRlRNTVUKKyNkZWZpbmUgVENHX01BWF9RRU1VX0xEU1QgICAgICAgNjQwCisKK3R5cGVkZWYgc3RydWN0IFRDR0xhYmVsUWVtdUxkc3QgeworICAgIGludCBpc19sZDoxOyAgICAgICAgICAgIC8qIHFlbXVfbGQ6IDEsIHFlbXVfc3Q6IDAgKi8KKyAgICBUQ0dNZW1PcCBvcGM6NDsKKyAgICBUQ0dSZWcgYWRkcmxvX3JlZzsgICAgICAvKiByZWcgaW5kZXggZm9yIGxvdyB3b3JkIG9mIGd1ZXN0IHZpcnR1YWwgYWRkciAqLworICAgIFRDR1JlZyBhZGRyaGlfcmVnOyAgICAgIC8qIHJlZyBpbmRleCBmb3IgaGlnaCB3b3JkIG9mIGd1ZXN0IHZpcnR1YWwgYWRkciAqLworICAgIFRDR1JlZyBkYXRhbG9fcmVnOyAgICAgIC8qIHJlZyBpbmRleCBmb3IgbG93IHdvcmQgdG8gYmUgbG9hZGVkIG9yIHN0b3JlZCAqLworICAgIFRDR1JlZyBkYXRhaGlfcmVnOyAgICAgIC8qIHJlZyBpbmRleCBmb3IgaGlnaCB3b3JkIHRvIGJlIGxvYWRlZCBvciBzdG9yZWQgKi8KKyAgICBpbnQgbWVtX2luZGV4OyAgICAgICAgICAvKiBzb2Z0IE1NVSBtZW1vcnkgaW5kZXggKi8KKyAgICB1aW50OF90ICpyYWRkcjsgICAgICAgICAvKiBnZW4gY29kZSBhZGRyIG9mIHRoZSBuZXh0IElSIG9mIHFlbXVfbGQvc3QgSVIgKi8KKyAgICB1aW50OF90ICpsYWJlbF9wdHJbMl07ICAvKiBsYWJlbCBwb2ludGVycyB0byBiZSB1cGRhdGVkICovCit9IFRDR0xhYmVsUWVtdUxkc3Q7CisKK3R5cGVkZWYgc3RydWN0IFRDR0JhY2tlbmREYXRhIHsKKyAgICBpbnQgbmJfbGRzdF9sYWJlbHM7CisgICAgVENHTGFiZWxRZW11TGRzdCBsZHN0X2xhYmVsc1tUQ0dfTUFYX1FFTVVfTERTVF07Cit9IFRDR0JhY2tlbmREYXRhOworCisKKy8qCisgKiBJbml0aWFsaXplIFRCIGJhY2tlbmQgZGF0YSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUQi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF90Yl9pbml0KFRDR0NvbnRleHQgKnMpCit7CisgICAgcy0+YmUtPm5iX2xkc3RfbGFiZWxzID0gMDsKK30KKworLyoKKyAqIEdlbmVyYXRlIFRCIGZpbmFsaXphdGlvbiBhdCB0aGUgZW5kIG9mIGJsb2NrCisgKi8KKworc3RhdGljIHZvaWQgdGNnX291dF9xZW11X2xkX3Nsb3dfcGF0aChUQ0dDb250ZXh0ICpzLCBUQ0dMYWJlbFFlbXVMZHN0ICpsKTsKK3N0YXRpYyB2b2lkIHRjZ19vdXRfcWVtdV9zdF9zbG93X3BhdGgoVENHQ29udGV4dCAqcywgVENHTGFiZWxRZW11TGRzdCAqbCk7CisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfdGJfZmluYWxpemUoVENHQ29udGV4dCAqcykKK3sKKyAgICBUQ0dMYWJlbFFlbXVMZHN0ICpsYiA9IHMtPmJlLT5sZHN0X2xhYmVsczsKKyAgICBpbnQgaSwgbiA9IHMtPmJlLT5uYl9sZHN0X2xhYmVsczsKKworICAgIC8qIHFlbXVfbGQvc3Qgc2xvdyBwYXRocyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKGxiW2ldLmlzX2xkKSB7CisgICAgICAgICAgICB0Y2dfb3V0X3FlbXVfbGRfc2xvd19wYXRoKHMsIGxiICsgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfb3V0X3FlbXVfc3Rfc2xvd19wYXRoKHMsIGxiICsgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBUQ0dMYWJlbFFlbXVMZHN0IGVudHJ5LgorICovCisKK3N0YXRpYyBpbmxpbmUgVENHTGFiZWxRZW11TGRzdCAqbmV3X2xkc3RfbGFiZWwoVENHQ29udGV4dCAqcykKK3sKKyAgICBUQ0dCYWNrZW5kRGF0YSAqYmUgPSBzLT5iZTsKKyAgICBpbnQgbiA9IGJlLT5uYl9sZHN0X2xhYmVsczsKKworICAgIGFzc2VydChuIDwgVENHX01BWF9RRU1VX0xEU1QpOworICAgIGJlLT5uYl9sZHN0X2xhYmVscyA9IG4gKyAxOworICAgIHJldHVybiAmYmUtPmxkc3RfbGFiZWxzW25dOworfQorI2Vsc2UKKyNpbmNsdWRlICJ0Y2ctYmUtbnVsbC5oIgorI2VuZGlmIC8qIENPTkZJR19TT0ZUTU1VICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctYmUtbnVsbC5oIGIvYW5kcm9pZC9xZW11MS90Y2cvdGNnLWJlLW51bGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGM1N2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvdGNnLWJlLW51bGwuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogVENHIEJhY2tlbmQgRGF0YTogTm8gYmFja2VuZCBkYXRhCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKK3R5cGVkZWYgc3RydWN0IFRDR0JhY2tlbmREYXRhIHsKKyAgICAvKiBFbXB0eSAqLworICAgIGNoYXIgZHVtbXk7Cit9IFRDR0JhY2tlbmREYXRhOworCisKKy8qCisgKiBJbml0aWFsaXplIFRCIGJhY2tlbmQgZGF0YSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBUQi4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dF90Yl9pbml0KFRDR0NvbnRleHQgKnMpCit7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBUQiBmaW5hbGl6YXRpb24gYXQgdGhlIGVuZCBvZiBibG9jaworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfb3V0X3RiX2ZpbmFsaXplKFRDR0NvbnRleHQgKnMpCit7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctb3AuaCBiL2FuZHJvaWQvcWVtdTEvdGNnL3RjZy1vcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYWJmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctb3AuaApAQCAtMCwwICsxLDI4OTAgQEAKKy8qCisgKiBUaW55IENvZGUgR2VuZXJhdG9yIGZvciBRRU1VCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgInRjZy5oIgorCitpbnQgZ2VuX25ld19sYWJlbCh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3AwKFRDR09wY29kZSBvcGMpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3AxX2kzMihUQ0dPcGNvZGUgb3BjLCBUQ0d2X2kzMiBhcmcxKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wMV9pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDFpKFRDR09wY29kZSBvcGMsIFRDR0FyZyBhcmcxKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmcxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDJfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3AyX2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wMmlfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR0FyZyBhcmcyKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmcyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDJpX2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLCBUQ0dBcmcgYXJnMikKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3AyaWkoVENHT3Bjb2RlIG9wYywgVENHQXJnIGFyZzEsIFRDR0FyZyBhcmcyKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmcxOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3AzX2kzMihUQ0dPcGNvZGUgb3BjLCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmczKQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wM19pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMykKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDNpX2kzMihUQ0dPcGNvZGUgb3BjLCBUQ0d2X2kzMiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pMzIgYXJnMiwgVENHQXJnIGFyZzMpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZzM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wM2lfaTY0KFRDR09wY29kZSBvcGMsIFRDR3ZfaTY0IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBhcmcyLCBUQ0dBcmcgYXJnMykKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnMzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGRzdF9vcF9pMzIoVENHT3Bjb2RlIG9wYywgVENHdl9pMzIgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9wdHIgYmFzZSwgVENHQXJnIG9mZnNldCkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKHZhbCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9QVFIoYmFzZSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkc3Rfb3BfaTY0KFRDR09wY29kZSBvcGMsIFRDR3ZfaTY0IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfcHRyIGJhc2UsIFRDR0FyZyBvZmZzZXQpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0k2NCh2YWwpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfUFRSKGJhc2UpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDRfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzMsIFRDR3ZfaTMyIGFyZzQpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmczKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmc0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3A0X2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBhcmczLCBUQ0d2X2k2NCBhcmc0KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wNGlfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmczLCBUQ0dBcmcgYXJnNCkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzMpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3A0aV9pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzMsIFRDR0FyZyBhcmc0KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDRpaV9pMzIoVENHT3Bjb2RlIG9wYywgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgYXJnMywgVENHQXJnIGFyZzQpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZzM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDRpaV9pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dBcmcgYXJnMywgVENHQXJnIGFyZzQpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0k2NChhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0k2NChhcmcyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZzM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDVfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzMsIFRDR3ZfaTMyIGFyZzQsIFRDR3ZfaTMyIGFyZzUpCit7CisgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IG9wYzsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcxKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmcyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmczKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmc0KTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihhcmc1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3A1X2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBhcmczLCBUQ0d2X2k2NCBhcmc0LCBUQ0d2X2k2NCBhcmc1KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wNWlfaTMyKFRDR09wY29kZSBvcGMsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmczLCBUQ0d2X2kzMiBhcmc0LCBUQ0dBcmcgYXJnNSkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzMpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzQpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3A1aV9pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzMsIFRDR3ZfaTY0IGFyZzQsIFRDR0FyZyBhcmc1KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc1OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDVpaV9pMzIoVENHT3Bjb2RlIG9wYywgVENHdl9pMzIgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmcyLCBUQ0d2X2kzMiBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyBhcmc0LCBUQ0dBcmcgYXJnNSkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzMpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNDsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZzU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wNWlpX2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzIsIFRDR3ZfaTY0IGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHQXJnIGFyZzQsIFRDR0FyZyBhcmc1KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc0OworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3A2X2kzMihUQ0dPcGNvZGUgb3BjLCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmczLCBUQ0d2X2kzMiBhcmc0LCBUQ0d2X2kzMiBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmc2KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnNSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wNl9pNjQoVENHT3Bjb2RlIG9wYywgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMywgVENHdl9pNjQgYXJnNCwgVENHdl9pNjQgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnNikKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzMpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzQpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzUpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KGFyZzYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDZpX2kzMihUQ0dPcGNvZGUgb3BjLCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pMzIgYXJnMywgVENHdl9pMzIgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzUsIFRDR0FyZyBhcmc2KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JMzIoYXJnNSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDZpX2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMywgVENHdl9pNjQgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzUsIFRDR0FyZyBhcmc2KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc2OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcDZpaV9pMzIoVENHT3Bjb2RlIG9wYywgVENHdl9pMzIgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmcyLCBUQ0d2X2kzMiBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzQsIFRDR0FyZyBhcmc1LCBUQ0dBcmcgYXJnNikKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb3BjOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzEpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzIpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzMpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTMyKGFyZzQpOworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZzY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29wNmlpX2k2NChUQ0dPcGNvZGUgb3BjLCBUQ0d2X2k2NCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzIsIFRDR3ZfaTY0IGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnNCwgVENHQXJnIGFyZzUsIFRDR0FyZyBhcmc2KQoreworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvcGM7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMSk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMik7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnMyk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9JNjQoYXJnNCk7CisgICAgKnRjZ19jdHguZ2VuX29wcGFyYW1fcHRyKysgPSBhcmc1OworICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gYXJnNjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19hZGRfcGFyYW1faTMyKFRDR3ZfaTMyIHZhbCkKK3sKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMih2YWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2FkZF9wYXJhbV9pNjQoVENHdl9pNjQgdmFsKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihUQ0dWX0xPVyh2YWwpKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IEdFVF9UQ0dWX0kzMihUQ0dWX0hJR0godmFsKSk7CisjZWxzZQorICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gR0VUX1RDR1ZfSTY0KHZhbCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdlbl9zZXRfbGFiZWwoaW50IG4pCit7CisgICAgdGNnX2dlbl9vcDFpKElOREVYX29wX3NldF9sYWJlbCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2JyKGludCBsYWJlbCkKK3sKKyAgICB0Y2dfZ2VuX29wMWkoSU5ERVhfb3BfYnIsIGxhYmVsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZykKK3sKKyAgICBpZiAoIVRDR1ZfRVFVQUxfSTMyKHJldCwgYXJnKSkKKyAgICAgICAgdGNnX2dlbl9vcDJfaTMyKElOREVYX29wX21vdl9pMzIsIHJldCwgYXJnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92aV9pMzIoVENHdl9pMzIgcmV0LCBpbnQzMl90IGFyZykKK3sKKyAgICB0Y2dfZ2VuX29wMmlfaTMyKElOREVYX29wX21vdmlfaTMyLCByZXQsIGFyZyk7Cit9CisKKy8qIEEgdmVyc2lvbiBvZiBkaF9zaXplbWFzayBmcm9tIGRlZi1oZWxwZXIuaCB0aGF0IGRvZXNuJ3QgcmVseSBvbgorICAgcHJlcHJvY2Vzc29yIG1hZ2ljLiAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRjZ19nZW5fc2l6ZW1hc2soaW50IG4sIGludCBpc182NGJpdCwgaW50IGlzX3NpZ25lZCkKK3sKKyAgICByZXR1cm4gKGlzXzY0Yml0IDw8IG4qMikgfCAoaXNfc2lnbmVkIDw8IChuKjIgKyAxKSk7Cit9CisKKy8qIGhlbHBlciBjYWxscyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5faGVscGVyTih2b2lkICpmdW5jLCBpbnQgZmxhZ3MsIGludCBzaXplbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHQXJnIHJldCwgaW50IG5hcmdzLCBUQ0dBcmcgKmFyZ3MpCit7CisgICAgVENHdl9wdHIgZm47CisgICAgZm4gPSB0Y2dfY29uc3RfcHRyKGZ1bmMpOworICAgIHRjZ19nZW5fY2FsbE4oJnRjZ19jdHgsIGZuLCBmbGFncywgc2l6ZW1hc2ssIHJldCwKKyAgICAgICAgICAgICAgICAgIG5hcmdzLCBhcmdzKTsKKyAgICB0Y2dfdGVtcF9mcmVlX3B0cihmbik7Cit9CisKKy8qIE5vdGU6IEJvdGggdGNnX2dlbl9oZWxwZXIzMigpIGFuZCB0Y2dfZ2VuX2hlbHBlcjY0KCkgYXJlIGN1cnJlbnRseQorICAgcmVzZXJ2ZWQgZm9yIGhlbHBlcnMgaW4gdGNnLXJ1bnRpbWUuYy4gVGhlc2UgaGVscGVycyBhbGwgZG8gbm90IHJlYWQKKyAgIGdsb2JhbHMgYW5kIGRvIG5vdCBoYXZlIHNpZGUgZWZmZWN0cywgaGVuY2UgdGhlIGNhbGwgdG8gdGNnX2dlbl9jYWxsTigpCisgICB3aXRoIFRDR19DQUxMX05PX1JFQURfR0xPQkFMUyB8IFRDR19DQUxMX05PX1NJREVfRUZGRUNUUy4gVGhpcyBtYXkgbmVlZAorICAgdG8gYmUgYWRqdXN0ZWQgaWYgdGhlc2UgZnVuY3Rpb25zIHN0YXJ0IHRvIGJlIHVzZWQgd2l0aCBvdGhlciBoZWxwZXJzLiAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5faGVscGVyMzIodm9pZCAqZnVuYywgaW50IHNpemVtYXNrLCBUQ0d2X2kzMiByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhLCBUQ0d2X2kzMiBiKQoreworICAgIFRDR3ZfcHRyIGZuOworICAgIFRDR0FyZyBhcmdzWzJdOworICAgIGZuID0gdGNnX2NvbnN0X3B0cihmdW5jKTsKKyAgICBhcmdzWzBdID0gR0VUX1RDR1ZfSTMyKGEpOworICAgIGFyZ3NbMV0gPSBHRVRfVENHVl9JMzIoYik7CisgICAgdGNnX2dlbl9jYWxsTigmdGNnX2N0eCwgZm4sCisgICAgICAgICAgICAgICAgICBUQ0dfQ0FMTF9OT19SRUFEX0dMT0JBTFMgfCBUQ0dfQ0FMTF9OT19TSURFX0VGRkVDVFMsCisgICAgICAgICAgICAgICAgICBzaXplbWFzaywgR0VUX1RDR1ZfSTMyKHJldCksIDIsIGFyZ3MpOworICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5faGVscGVyNjQodm9pZCAqZnVuYywgaW50IHNpemVtYXNrLCBUQ0d2X2k2NCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBhLCBUQ0d2X2k2NCBiKQoreworICAgIFRDR3ZfcHRyIGZuOworICAgIFRDR0FyZyBhcmdzWzJdOworICAgIGZuID0gdGNnX2NvbnN0X3B0cihmdW5jKTsKKyAgICBhcmdzWzBdID0gR0VUX1RDR1ZfSTY0KGEpOworICAgIGFyZ3NbMV0gPSBHRVRfVENHVl9JNjQoYik7CisgICAgdGNnX2dlbl9jYWxsTigmdGNnX2N0eCwgZm4sCisgICAgICAgICAgICAgICAgICBUQ0dfQ0FMTF9OT19SRUFEX0dMT0JBTFMgfCBUQ0dfQ0FMTF9OT19TSURFX0VGRkVDVFMsCisgICAgICAgICAgICAgICAgICBzaXplbWFzaywgR0VUX1RDR1ZfSTY0KHJldCksIDIsIGFyZ3MpOworICAgIHRjZ190ZW1wX2ZyZWVfcHRyKGZuKTsKK30KKworLyogMzIgYml0IG9wcyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDh1X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2kzMihJTkRFWF9vcF9sZDh1X2kzMiwgcmV0LCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDhzX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2kzMihJTkRFWF9vcF9sZDhzX2kzMiwgcmV0LCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDE2dV9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X3B0ciBhcmcyLCB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pMzIoSU5ERVhfb3BfbGQxNnVfaTMyLCByZXQsIGFyZzIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkMTZzX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2kzMihJTkRFWF9vcF9sZDE2c19pMzIsIHJldCwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGRfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9wdHIgYXJnMiwgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkc3Rfb3BfaTMyKElOREVYX29wX2xkX2kzMiwgcmV0LCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdDhfaTMyKFRDR3ZfaTMyIGFyZzEsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2kzMihJTkRFWF9vcF9zdDhfaTMyLCBhcmcxLCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdDE2X2kzMihUQ0d2X2kzMiBhcmcxLCBUQ0d2X3B0ciBhcmcyLCB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pMzIoSU5ERVhfb3Bfc3QxNl9pMzIsIGFyZzEsIGFyZzIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3N0X2kzMihUQ0d2X2kzMiBhcmcxLCBUQ0d2X3B0ciBhcmcyLCB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pMzIoSU5ERVhfb3Bfc3RfaTMyLCBhcmcxLCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9hZGRfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3BfYWRkX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYWRkaV9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBpbnQzMl90IGFyZzIpCit7CisgICAgLyogc29tZSBjYXNlcyBjYW4gYmUgb3B0aW1pemVkIGhlcmUgKi8KKyAgICBpZiAoYXJnMiA9PSAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX2NvbnN0X2kzMihhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdWJfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfc3ViX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3ViZmlfaTMyKFRDR3ZfaTMyIHJldCwgaW50MzJfdCBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIFRDR3ZfaTMyIHQwID0gdGNnX2NvbnN0X2kzMihhcmcxKTsKKyAgICB0Y2dfZ2VuX3N1Yl9pMzIocmV0LCB0MCwgYXJnMik7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdWJpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICAvKiBzb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZSAqLworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pMzIgdDAgPSB0Y2dfY29uc3RfaTMyKGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2FuZF9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIGlmIChUQ0dWX0VRVUFMX0kzMihhcmcxLCBhcmcyKSkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3BfYW5kX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2FuZGlfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgdWludDMyX3QgYXJnMikKK3sKKyAgICBUQ0d2X2kzMiB0MDsKKyAgICAvKiBTb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZS4gICovCisgICAgc3dpdGNoIChhcmcyKSB7CisgICAgY2FzZSAwOgorICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHJldCwgMCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIDB4ZmZmZmZmZmZ1OgorICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmV0LCBhcmcxKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgMHhmZnU6CisgICAgICAgIC8qIERvbid0IHJlY3Vyc2Ugd2l0aCB0Y2dfZ2VuX2V4dDh1X2kzMi4gICovCisgICAgICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQ4dV9pMzIpIHsKKyAgICAgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9leHQ4dV9pMzIsIHJldCwgYXJnMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweGZmZmZ1OgorICAgICAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXh0MTZ1X2kzMikgeworICAgICAgICAgICAgdGNnX2dlbl9vcDJfaTMyKElOREVYX29wX2V4dDE2dV9pMzIsIHJldCwgYXJnMSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHQwID0gdGNnX2NvbnN0X2kzMihhcmcyKTsKKyAgICB0Y2dfZ2VuX2FuZF9pMzIocmV0LCBhcmcxLCB0MCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcl9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIGlmIChUQ0dWX0VRVUFMX0kzMihhcmcxLCBhcmcyKSkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfb3JfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fb3JpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICAvKiBTb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZS4gICovCisgICAgaWYgKGFyZzIgPT0gLTEpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihyZXQsIC0xKTsKKyAgICB9IGVsc2UgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoYXJnMik7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl94b3JfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHVl9FUVVBTF9JMzIoYXJnMSwgYXJnMikpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihyZXQsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF94b3JfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5feG9yaV9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBpbnQzMl90IGFyZzIpCit7CisgICAgLyogU29tZSBjYXNlcyBjYW4gYmUgb3B0aW1pemVkIGhlcmUuICAqLworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMSk7CisgICAgfSBlbHNlIGlmIChhcmcyID09IC0xICYmIFRDR19UQVJHRVRfSEFTX25vdF9pMzIpIHsKKyAgICAgICAgLyogRG9uJ3QgcmVjdXJzZSB3aXRoIHRjZ19nZW5fbm90X2kzMi4gICovCisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9ub3RfaTMyLCByZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX2NvbnN0X2kzMihhcmcyKTsKKyAgICAgICAgdGNnX2dlbl94b3JfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zaGxfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfc2hsX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2hsaV9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBpbnQzMl90IGFyZzIpCit7CisgICAgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoYXJnMik7CisgICAgICAgIHRjZ19nZW5fc2hsX2kzMihyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2hyX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX3Nocl9pMzIsIHJldCwgYXJnMSwgYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3NocmlfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgaW50MzJfdCBhcmcyKQoreworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pMzIgdDAgPSB0Y2dfY29uc3RfaTMyKGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3Nocl9pMzIocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3Nhcl9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9zYXJfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zYXJpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICBpZiAoYXJnMiA9PSAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX2NvbnN0X2kzMihhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zYXJfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9icmNvbmRfaTMyKFRDR0NvbmQgY29uZCwgVENHdl9pMzIgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pMzIgYXJnMiwgaW50IGxhYmVsX2luZGV4KQoreworICAgIGlmIChjb25kID09IFRDR19DT05EX0FMV0FZUykgeworICAgICAgICB0Y2dfZ2VuX2JyKGxhYmVsX2luZGV4KTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgIT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDRpaV9pMzIoSU5ERVhfb3BfYnJjb25kX2kzMiwgYXJnMSwgYXJnMiwgY29uZCwgbGFiZWxfaW5kZXgpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnJjb25kaV9pMzIoVENHQ29uZCBjb25kLCBUQ0d2X2kzMiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhcmcyLCBpbnQgbGFiZWxfaW5kZXgpCit7CisgICAgaWYgKGNvbmQgPT0gVENHX0NPTkRfQUxXQVlTKSB7CisgICAgICAgIHRjZ19nZW5fYnIobGFiZWxfaW5kZXgpOworICAgIH0gZWxzZSBpZiAoY29uZCAhPSBUQ0dfQ09ORF9ORVZFUikgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoYXJnMik7CisgICAgICAgIHRjZ19nZW5fYnJjb25kX2kzMihjb25kLCBhcmcxLCB0MCwgbGFiZWxfaW5kZXgpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zZXRjb25kX2kzMihUQ0dDb25kIGNvbmQsIFRDR3ZfaTMyIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKGNvbmQgPT0gVENHX0NPTkRfQUxXQVlTKSB7CisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIocmV0LCAxKTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgPT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihyZXQsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3A0aV9pMzIoSU5ERVhfb3Bfc2V0Y29uZF9pMzIsIHJldCwgYXJnMSwgYXJnMiwgY29uZCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zZXRjb25kaV9pMzIoVENHQ29uZCBjb25kLCBUQ0d2X2kzMiByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pMzIgYXJnMSwgaW50MzJfdCBhcmcyKQoreworICAgIGlmIChjb25kID09IFRDR19DT05EX0FMV0FZUykgeworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHJldCwgMSk7CisgICAgfSBlbHNlIGlmIChjb25kID09IFRDR19DT05EX05FVkVSKSB7CisgICAgICAgIHRjZ19nZW5fbW92aV9pMzIocmV0LCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoYXJnMik7CisgICAgICAgIHRjZ19nZW5fc2V0Y29uZF9pMzIoY29uZCwgcmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX211bF9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9tdWxfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tdWxpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoYXJnMik7CisgICAgdGNnX2dlbl9tdWxfaTMyKHJldCwgYXJnMSwgdDApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGl2X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Rpdl9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX2Rpdl9pMzIsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXYyX2kzMikgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0MCwgYXJnMSwgMzEpOworICAgICAgICB0Y2dfZ2VuX29wNV9pMzIoSU5ERVhfb3BfZGl2Ml9pMzIsIHJldCwgdDAsIGFyZzEsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplbWFzayA9IDA7CisgICAgICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDMyLWJpdCBhbmQgc2lnbmVkLiAgKi8KKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAwLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAwLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAwLCAxKTsKKyAgICAgICAgdGNnX2dlbl9oZWxwZXIzMih0Y2dfaGVscGVyX2Rpdl9pMzIsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fcmVtX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JlbV9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX3JlbV9pMzIsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXZfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3BfZGl2X2kzMiwgdDAsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX211bF9pMzIodDAsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXYyX2kzMikgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0MCwgYXJnMSwgMzEpOworICAgICAgICB0Y2dfZ2VuX29wNV9pMzIoSU5ERVhfb3BfZGl2Ml9pMzIsIHQwLCByZXQsIGFyZzEsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplbWFzayA9IDA7CisgICAgICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDMyLWJpdCBhbmQgc2lnbmVkLiAgKi8KKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAwLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAwLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAwLCAxKTsKKyAgICAgICAgdGNnX2dlbl9oZWxwZXIzMih0Y2dfaGVscGVyX3JlbV9pMzIsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGl2dV9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19kaXZfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9kaXZ1X2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfSEFTX2RpdjJfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHQwLCAwKTsKKyAgICAgICAgdGNnX2dlbl9vcDVfaTMyKElOREVYX29wX2RpdnUyX2kzMiwgcmV0LCB0MCwgYXJnMSwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgMzItYml0IGFuZCB1bnNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMCwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMCwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMCwgMCk7CisgICAgICAgIHRjZ19nZW5faGVscGVyMzIodGNnX2hlbHBlcl9kaXZ1X2kzMiwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9yZW11X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JlbV9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX3JlbXVfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSBpZiAoVENHX1RBUkdFVF9IQVNfZGl2X2kzMikgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX2RpdnVfaTMyLCB0MCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbXVsX2kzMih0MCwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfSEFTX2RpdjJfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKHQwLCAwKTsKKyAgICAgICAgdGNnX2dlbl9vcDVfaTMyKElOREVYX29wX2RpdnUyX2kzMiwgdDAsIHJldCwgYXJnMSwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgMzItYml0IGFuZCB1bnNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMCwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMCwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMCwgMCk7CisgICAgICAgIHRjZ19nZW5faGVscGVyMzIodGNnX2hlbHBlcl9yZW11X2kzMiwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tb3ZfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIGlmICghVENHVl9FUVVBTF9JNjQocmV0LCBhcmcpKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcpKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnKSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tb3ZpX2k2NChUQ0d2X2k2NCByZXQsIGludDY0X3QgYXJnKQoreworICAgIHRjZ19nZW5fbW92aV9pMzIoVENHVl9MT1cocmV0KSwgYXJnKTsKKyAgICB0Y2dfZ2VuX21vdmlfaTMyKFRDR1ZfSElHSChyZXQpLCBhcmcgPj4gMzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDh1X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGQ4dV9pMzIoVENHVl9MT1cocmV0KSwgYXJnMiwgb2Zmc2V0KTsKKyAgICB0Y2dfZ2VuX21vdmlfaTMyKFRDR1ZfSElHSChyZXQpLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGQ4c19pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X3B0ciBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkOHNfaTMyKFRDR1ZfTE9XKHJldCksIGFyZzIsIG9mZnNldCk7CisgICAgdGNnX2dlbl9zYXJpX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKHJldCksIDMxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGQxNnVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGQxNnVfaTMyKFRDR1ZfTE9XKHJldCksIGFyZzIsIG9mZnNldCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0hJR0gocmV0KSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkMTZzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkMTZzX2kzMihUQ0dWX0xPVyhyZXQpLCBhcmcyLCBvZmZzZXQpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfTE9XKHJldCksIDMxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGQzMnVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRfaTMyKFRDR1ZfTE9XKHJldCksIGFyZzIsIG9mZnNldCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0hJR0gocmV0KSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkMzJzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkX2kzMihUQ0dWX0xPVyhyZXQpLCBhcmcyLCBvZmZzZXQpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfTE9XKHJldCksIDMxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGRfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIC8qIHNpbmNlIGFyZzIgYW5kIHJldCBoYXZlIGRpZmZlcmVudCB0eXBlcywgdGhleSBjYW5ub3QgYmUgdGhlCisgICAgICAgc2FtZSB0ZW1wb3JhcnkgKi8KKyNpZmRlZiBUQ0dfVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHRjZ19nZW5fbGRfaTMyKFRDR1ZfSElHSChyZXQpLCBhcmcyLCBvZmZzZXQpOworICAgIHRjZ19nZW5fbGRfaTMyKFRDR1ZfTE9XKHJldCksIGFyZzIsIG9mZnNldCArIDQpOworI2Vsc2UKKyAgICB0Y2dfZ2VuX2xkX2kzMihUQ0dWX0xPVyhyZXQpLCBhcmcyLCBvZmZzZXQpOworICAgIHRjZ19nZW5fbGRfaTMyKFRDR1ZfSElHSChyZXQpLCBhcmcyLCBvZmZzZXQgKyA0KTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdDhfaTY0KFRDR3ZfaTY0IGFyZzEsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9zdDhfaTMyKFRDR1ZfTE9XKGFyZzEpLCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdDE2X2k2NChUQ0d2X2k2NCBhcmcxLCBUQ0d2X3B0ciBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX3N0MTZfaTMyKFRDR1ZfTE9XKGFyZzEpLCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdDMyX2k2NChUQ0d2X2k2NCBhcmcxLCBUQ0d2X3B0ciBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX3N0X2kzMihUQ0dWX0xPVyhhcmcxKSwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3RfaTY0KFRDR3ZfaTY0IGFyZzEsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyNpZmRlZiBUQ0dfVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgIHRjZ19nZW5fc3RfaTMyKFRDR1ZfSElHSChhcmcxKSwgYXJnMiwgb2Zmc2V0KTsKKyAgICB0Y2dfZ2VuX3N0X2kzMihUQ0dWX0xPVyhhcmcxKSwgYXJnMiwgb2Zmc2V0ICsgNCk7CisjZWxzZQorICAgIHRjZ19nZW5fc3RfaTMyKFRDR1ZfTE9XKGFyZzEpLCBhcmcyLCBvZmZzZXQpOworICAgIHRjZ19nZW5fc3RfaTMyKFRDR1ZfSElHSChhcmcxKSwgYXJnMiwgb2Zmc2V0ICsgNCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYWRkX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgdGNnX2dlbl9vcDZfaTMyKElOREVYX29wX2FkZDJfaTMyLCBUQ0dWX0xPVyhyZXQpLCBUQ0dWX0hJR0gocmV0KSwKKyAgICAgICAgICAgICAgICAgICAgVENHVl9MT1coYXJnMSksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9MT1coYXJnMiksCisgICAgICAgICAgICAgICAgICAgIFRDR1ZfSElHSChhcmcyKSk7CisgICAgLyogQWxsb3cgdGhlIG9wdGltaXplciByb29tIHRvIHJlcGxhY2UgYWRkMiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgdGNnX2dlbl9vcDAoSU5ERVhfb3Bfbm9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3ViX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgdGNnX2dlbl9vcDZfaTMyKElOREVYX29wX3N1YjJfaTMyLCBUQ0dWX0xPVyhyZXQpLCBUQ0dWX0hJR0gocmV0KSwKKyAgICAgICAgICAgICAgICAgICAgVENHVl9MT1coYXJnMSksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9MT1coYXJnMiksCisgICAgICAgICAgICAgICAgICAgIFRDR1ZfSElHSChhcmcyKSk7CisgICAgLyogQWxsb3cgdGhlIG9wdGltaXplciByb29tIHRvIHJlcGxhY2Ugc3ViMiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgdGNnX2dlbl9vcDAoSU5ERVhfb3Bfbm9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYW5kX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgdGNnX2dlbl9hbmRfaTMyKFRDR1ZfTE9XKHJldCksIFRDR1ZfTE9XKGFyZzEpLCBUQ0dWX0xPVyhhcmcyKSk7CisgICAgdGNnX2dlbl9hbmRfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSksIFRDR1ZfSElHSChhcmcyKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2FuZGlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIHRjZ19nZW5fYW5kaV9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSksIGFyZzIpOworICAgIHRjZ19nZW5fYW5kaV9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSwgYXJnMiA+PiAzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29yX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgdGNnX2dlbl9vcl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSksIFRDR1ZfTE9XKGFyZzIpKTsKKyAgICB0Y2dfZ2VuX29yX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZzEpLCBUQ0dWX0hJR0goYXJnMikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIHRjZ19nZW5fb3JpX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgYXJnMik7CisgICAgdGNnX2dlbl9vcmlfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSksIGFyZzIgPj4gMzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl94b3JfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX3hvcl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSksIFRDR1ZfTE9XKGFyZzIpKTsKKyAgICB0Y2dfZ2VuX3hvcl9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9ISUdIKGFyZzIpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5feG9yaV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgdGNnX2dlbl94b3JpX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgYXJnMik7CisgICAgdGNnX2dlbl94b3JpX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZzEpLCBhcmcyID4+IDMyKTsKK30KKworLyogWFhYOiB1c2UgZ2VuZXJpYyBjb2RlIHdoZW4gYmFzaWMgYmxvY2sgaGFuZGxpbmcgaXMgT0sgb3IgQ1BVCisgICBzcGVjaWZpYyBjb2RlICh4ODYpICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zaGxfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICBpbnQgc2l6ZW1hc2sgPSAwOworICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDY0LWJpdCBhbmQgc2lnbmVkLiAgKi8KKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDAsIDEsIDEpOworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMSk7CisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAxLCAxKTsKKworICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9zaGxfaTY0LCBzaXplbWFzaywgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2hsaV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgdGNnX2dlbl9zaGlmdGlfaTY0KHJldCwgYXJnMSwgYXJnMiwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3Nocl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIGludCBzaXplbWFzayA9IDA7CisgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgNjQtYml0IGFuZCBzaWduZWQuICAqLworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMSk7CisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAxLCAxKTsKKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDIsIDEsIDEpOworCisgICAgdGNnX2dlbl9oZWxwZXI2NCh0Y2dfaGVscGVyX3Nocl9pNjQsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zaHJpX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX3NoaWZ0aV9pNjQocmV0LCBhcmcxLCBhcmcyLCAxLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2FyX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAvKiBSZXR1cm4gdmFsdWUgYW5kIGJvdGggYXJndW1lbnRzIGFyZSA2NC1iaXQgYW5kIHNpZ25lZC4gICovCisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAxLCAxKTsKKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDEsIDEsIDEpOworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMSk7CisKKyAgICB0Y2dfZ2VuX2hlbHBlcjY0KHRjZ19oZWxwZXJfc2FyX2k2NCwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3NhcmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIHRjZ19nZW5fc2hpZnRpX2k2NChyZXQsIGFyZzEsIGFyZzIsIDEsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9icmNvbmRfaTY0KFRDR0NvbmQgY29uZCwgVENHdl9pNjQgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMiwgaW50IGxhYmVsX2luZGV4KQoreworICAgIGlmIChjb25kID09IFRDR19DT05EX0FMV0FZUykgeworICAgICAgICB0Y2dfZ2VuX2JyKGxhYmVsX2luZGV4KTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgIT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDZpaV9pMzIoSU5ERVhfb3BfYnJjb25kMl9pMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1ZfTE9XKGFyZzEpLCBUQ0dWX0hJR0goYXJnMSksIFRDR1ZfTE9XKGFyZzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX0hJR0goYXJnMiksIGNvbmQsIGxhYmVsX2luZGV4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3NldGNvbmRfaTY0KFRDR0NvbmQgY29uZCwgVENHdl9pNjQgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICBpZiAoY29uZCA9PSBUQ0dfQ09ORF9BTFdBWVMpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0xPVyhyZXQpLCAxKTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgPT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0xPVyhyZXQpLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX29wNmlfaTMyKElOREVYX29wX3NldGNvbmQyX2kzMiwgVENHVl9MT1cocmV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX0xPVyhhcmcxKSwgVENHVl9ISUdIKGFyZzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1ZfTE9XKGFyZzIpLCBUQ0dWX0hJR0goYXJnMiksIGNvbmQpOworICAgIH0KKyAgICB0Y2dfZ2VuX21vdmlfaTMyKFRDR1ZfSElHSChyZXQpLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbXVsX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgVENHdl9pNjQgdDA7CisgICAgVENHdl9pMzIgdDE7CisKKyAgICB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDRfaTMyKElOREVYX29wX211bHUyX2kzMiwgVENHVl9MT1codDApLCBUQ0dWX0hJR0godDApLAorICAgICAgICAgICAgICAgICAgICAgICAgVENHVl9MT1coYXJnMSksIFRDR1ZfTE9XKGFyZzIpKTsKKyAgICAgICAgLyogQWxsb3cgdGhlIG9wdGltaXplciByb29tIHRvIHJlcGxhY2UgbXVsdTIgd2l0aCB0d28gbW92ZXMuICAqLworICAgICAgICB0Y2dfZ2VuX29wMChJTkRFWF9vcF9ub3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19kZWJ1Z19hc3NlcnQoVENHX1RBUkdFVF9IQVNfbXVsdWhfaTMyKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX211bF9pMzIsIFRDR1ZfTE9XKHQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRDR1ZfTE9XKGFyZzEpLCBUQ0dWX0xPVyhhcmcyKSk7CisgICAgICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9tdWx1aF9pMzIsIFRDR1ZfSElHSCh0MCksCisgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX0xPVyhhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIH0KKworICAgIHRjZ19nZW5fbXVsX2kzMih0MSwgVENHVl9MT1coYXJnMSksIFRDR1ZfSElHSChhcmcyKSk7CisgICAgdGNnX2dlbl9hZGRfaTMyKFRDR1ZfSElHSCh0MCksIFRDR1ZfSElHSCh0MCksIHQxKTsKKyAgICB0Y2dfZ2VuX211bF9pMzIodDEsIFRDR1ZfSElHSChhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIHRjZ19nZW5fYWRkX2kzMihUQ0dWX0hJR0godDApLCBUQ0dWX0hJR0godDApLCB0MSk7CisKKyAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCB0MCk7CisgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGl2X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAvKiBSZXR1cm4gdmFsdWUgYW5kIGJvdGggYXJndW1lbnRzIGFyZSA2NC1iaXQgYW5kIHNpZ25lZC4gICovCisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAxLCAxKTsKKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDEsIDEsIDEpOworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMSk7CisKKyAgICB0Y2dfZ2VuX2hlbHBlcjY0KHRjZ19oZWxwZXJfZGl2X2k2NCwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JlbV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIGludCBzaXplbWFzayA9IDA7CisgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgNjQtYml0IGFuZCBzaWduZWQuICAqLworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMSk7CisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAxLCAxKTsKKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDIsIDEsIDEpOworCisgICAgdGNnX2dlbl9oZWxwZXI2NCh0Y2dfaGVscGVyX3JlbV9pNjQsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9kaXZ1X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAvKiBSZXR1cm4gdmFsdWUgYW5kIGJvdGggYXJndW1lbnRzIGFyZSA2NC1iaXQgYW5kIHVuc2lnbmVkLiAgKi8KKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDAsIDEsIDApOworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMCk7CisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAxLCAwKTsKKworICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9kaXZ1X2k2NCwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JlbXVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICBpbnQgc2l6ZW1hc2sgPSAwOworICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDY0LWJpdCBhbmQgdW5zaWduZWQuICAqLworICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMCk7CisgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAxLCAwKTsKKyAgICBzaXplbWFzayB8PSB0Y2dfZ2VuX3NpemVtYXNrKDIsIDEsIDApOworCisgICAgdGNnX2dlbl9oZWxwZXI2NCh0Y2dfaGVscGVyX3JlbXVfaTY0LCBzaXplbWFzaywgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICBpZiAoIVRDR1ZfRVFVQUxfSTY0KHJldCwgYXJnKSkKKyAgICAgICAgdGNnX2dlbl9vcDJfaTY0KElOREVYX29wX21vdl9pNjQsIHJldCwgYXJnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92aV9pNjQoVENHdl9pNjQgcmV0LCBpbnQ2NF90IGFyZykKK3sKKyAgICB0Y2dfZ2VuX29wMmlfaTY0KElOREVYX29wX21vdmlfaTY0LCByZXQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkOHVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9sZDh1X2k2NCwgcmV0LCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDhzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pNjQoSU5ERVhfb3BfbGQ4c19pNjQsIHJldCwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGQxNnVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pNjQoSU5ERVhfb3BfbGQxNnVfaTY0LCByZXQsIGFyZzIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkMTZzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX3RhcmdldF9sb25nIG9mZnNldCkKK3sKKyAgICB0Y2dfZ2VuX2xkc3Rfb3BfaTY0KElOREVYX29wX2xkMTZzX2k2NCwgcmV0LCBhcmcyLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9sZDMydV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X3B0ciBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9sZDMydV9pNjQsIHJldCwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbGQzMnNfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pNjQoSU5ERVhfb3BfbGQzMnNfaTY0LCByZXQsIGFyZzIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2xkX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9sZF9pNjQsIHJldCwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3Q4X2k2NChUQ0d2X2k2NCBhcmcxLCBUQ0d2X3B0ciBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X2xvbmcgb2Zmc2V0KQoreworICAgIHRjZ19nZW5fbGRzdF9vcF9pNjQoSU5ERVhfb3Bfc3Q4X2k2NCwgYXJnMSwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3QxNl9pNjQoVENHdl9pNjQgYXJnMSwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9zdDE2X2k2NCwgYXJnMSwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3QzMl9pNjQoVENHdl9pNjQgYXJnMSwgVENHdl9wdHIgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9zdDMyX2k2NCwgYXJnMSwgYXJnMiwgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3RfaTY0KFRDR3ZfaTY0IGFyZzEsIFRDR3ZfcHRyIGFyZzIsIHRjZ190YXJnZXRfbG9uZyBvZmZzZXQpCit7CisgICAgdGNnX2dlbl9sZHN0X29wX2k2NChJTkRFWF9vcF9zdF9pNjQsIGFyZzEsIGFyZzIsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2FkZF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9hZGRfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdWJfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3Bfc3ViX2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYW5kX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR1ZfRVFVQUxfSTY0KGFyZzEsIGFyZzIpKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9hbmRfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYW5kaV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCB1aW50NjRfdCBhcmcyKQoreworICAgIFRDR3ZfaTY0IHQwOworICAgIC8qIFNvbWUgY2FzZXMgY2FuIGJlIG9wdGltaXplZCBoZXJlLiAgKi8KKyAgICBzd2l0Y2ggKGFyZzIpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHRjZ19nZW5fbW92aV9pNjQocmV0LCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgMHhmZmZmZmZmZmZmZmZmZmZmdWxsOgorICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCBhcmcxKTsKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgMHhmZnVsbDoKKyAgICAgICAgLyogRG9uJ3QgcmVjdXJzZSB3aXRoIHRjZ19nZW5fZXh0OHVfaTMyLiAgKi8KKyAgICAgICAgaWYgKFRDR19UQVJHRVRfSEFTX2V4dDh1X2k2NCkgeworICAgICAgICAgICAgdGNnX2dlbl9vcDJfaTY0KElOREVYX29wX2V4dDh1X2k2NCwgcmV0LCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZmZmZnU6CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQxNnVfaTY0KSB7CisgICAgICAgICAgICB0Y2dfZ2VuX29wMl9pNjQoSU5ERVhfb3BfZXh0MTZ1X2k2NCwgcmV0LCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4ZmZmZmZmZmZ1bGw6CisgICAgICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQzMnVfaTY0KSB7CisgICAgICAgICAgICB0Y2dfZ2VuX29wMl9pNjQoSU5ERVhfb3BfZXh0MzJ1X2k2NCwgcmV0LCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgdDAgPSB0Y2dfY29uc3RfaTY0KGFyZzIpOworICAgIHRjZ19nZW5fYW5kX2k2NChyZXQsIGFyZzEsIHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29yX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR1ZfRVFVQUxfSTY0KGFyZzEsIGFyZzIpKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9vcl9pNjQsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIC8qIFNvbWUgY2FzZXMgY2FuIGJlIG9wdGltaXplZCBoZXJlLiAgKi8KKyAgICBpZiAoYXJnMiA9PSAtMSkgeworICAgICAgICB0Y2dfZ2VuX21vdmlfaTY0KHJldCwgLTEpOworICAgIH0gZWxzZSBpZiAoYXJnMiA9PSAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX2NvbnN0X2k2NChhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3hvcl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIGlmIChUQ0dWX0VRVUFMX0k2NChhcmcxLCBhcmcyKSkgeworICAgICAgICB0Y2dfZ2VuX21vdmlfaTY0KHJldCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3hvcl9pNjQsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl94b3JpX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICAvKiBTb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZS4gICovCisgICAgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgaWYgKGFyZzIgPT0gLTEgJiYgVENHX1RBUkdFVF9IQVNfbm90X2k2NCkgeworICAgICAgICAvKiBEb24ndCByZWN1cnNlIHdpdGggdGNnX2dlbl9ub3RfaTY0LiAgKi8KKyAgICAgICAgdGNnX2dlbl9vcDJfaTY0KElOREVYX29wX25vdF9pNjQsIHJldCwgYXJnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfY29uc3RfaTY0KGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3hvcl9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3NobF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9zaGxfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zaGxpX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICBpZiAoYXJnMiA9PSAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX2NvbnN0X2k2NChhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zaGxfaTY0KHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zaHJfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3Bfc2hyX2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2hyaV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ19jb25zdF9pNjQoYXJnMik7CisgICAgICAgIHRjZ19nZW5fc2hyX2k2NChyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2FyX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3Nhcl9pNjQsIHJldCwgYXJnMSwgYXJnMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3NhcmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTY0KHJldCwgYXJnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfY29uc3RfaTY0KGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3Nhcl9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2JyY29uZF9pNjQoVENHQ29uZCBjb25kLCBUQ0d2X2k2NCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBhcmcyLCBpbnQgbGFiZWxfaW5kZXgpCit7CisgICAgaWYgKGNvbmQgPT0gVENHX0NPTkRfQUxXQVlTKSB7CisgICAgICAgIHRjZ19nZW5fYnIobGFiZWxfaW5kZXgpOworICAgIH0gZWxzZSBpZiAoY29uZCAhPSBUQ0dfQ09ORF9ORVZFUikgeworICAgICAgICB0Y2dfZ2VuX29wNGlpX2k2NChJTkRFWF9vcF9icmNvbmRfaTY0LCBhcmcxLCBhcmcyLCBjb25kLCBsYWJlbF9pbmRleCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zZXRjb25kX2k2NChUQ0dDb25kIGNvbmQsIFRDR3ZfaTY0IHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKGNvbmQgPT0gVENHX0NPTkRfQUxXQVlTKSB7CisgICAgICAgIHRjZ19nZW5fbW92aV9pNjQocmV0LCAxKTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgPT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2k2NChyZXQsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3A0aV9pNjQoSU5ERVhfb3Bfc2V0Y29uZF9pNjQsIHJldCwgYXJnMSwgYXJnMiwgY29uZCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tdWxfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfbXVsX2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGl2X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Rpdl9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX2Rpdl9pNjQsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXYyX2k2NCkgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX2k2NCh0MCwgYXJnMSwgNjMpOworICAgICAgICB0Y2dfZ2VuX29wNV9pNjQoSU5ERVhfb3BfZGl2Ml9pNjQsIHJldCwgdDAsIGFyZzEsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplbWFzayA9IDA7CisgICAgICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDY0LWJpdCBhbmQgc2lnbmVkLiAgKi8KKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAxLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAxLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAxLCAxKTsKKyAgICAgICAgdGNnX2dlbl9oZWxwZXI2NCh0Y2dfaGVscGVyX2Rpdl9pNjQsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fcmVtX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JlbV9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3JlbV9pNjQsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXZfaTY0KSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfZGl2X2k2NCwgdDAsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX211bF9pNjQodDAsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfaTY0KHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19kaXYyX2k2NCkgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9zYXJpX2k2NCh0MCwgYXJnMSwgNjMpOworICAgICAgICB0Y2dfZ2VuX29wNV9pNjQoSU5ERVhfb3BfZGl2Ml9pNjQsIHQwLCByZXQsIGFyZzEsIHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzaXplbWFzayA9IDA7CisgICAgICAgIC8qIFJldHVybiB2YWx1ZSBhbmQgYm90aCBhcmd1bWVudHMgYXJlIDY0LWJpdCBhbmQgc2lnbmVkLiAgKi8KKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygwLCAxLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygxLCAxLCAxKTsKKyAgICAgICAgc2l6ZW1hc2sgfD0gdGNnX2dlbl9zaXplbWFzaygyLCAxLCAxKTsKKyAgICAgICAgdGNnX2dlbl9oZWxwZXI2NCh0Y2dfaGVscGVyX3JlbV9pNjQsIHNpemVtYXNrLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGl2dV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19kaXZfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9kaXZ1X2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfSEFTX2RpdjJfaTY0KSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTY0KHQwLCAwKTsKKyAgICAgICAgdGNnX2dlbl9vcDVfaTY0KElOREVYX29wX2RpdnUyX2k2NCwgcmV0LCB0MCwgYXJnMSwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgNjQtYml0IGFuZCB1bnNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMCk7CisgICAgICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9kaXZ1X2k2NCwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9yZW11X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JlbV9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3JlbXVfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSBpZiAoVENHX1RBUkdFVF9IQVNfZGl2X2k2NCkgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX2RpdnVfaTY0LCB0MCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfSEFTX2RpdjJfaTY0KSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX21vdmlfaTY0KHQwLCAwKTsKKyAgICAgICAgdGNnX2dlbl9vcDVfaTY0KElOREVYX29wX2RpdnUyX2k2NCwgdDAsIHJldCwgYXJnMSwgdDAsIGFyZzIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgNjQtYml0IGFuZCB1bnNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMCk7CisgICAgICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9yZW11X2k2NCwgc2l6ZW1hc2ssIHJldCwgYXJnMSwgYXJnMik7CisgICAgfQorfQorI2VuZGlmIC8qIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYWRkaV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBpbnQ2NF90IGFyZzIpCit7CisgICAgLyogc29tZSBjYXNlcyBjYW4gYmUgb3B0aW1pemVkIGhlcmUgKi8KKyAgICBpZiAoYXJnMiA9PSAwKSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX2NvbnN0X2k2NChhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfaTY0KHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdWJmaV9pNjQoVENHdl9pNjQgcmV0LCBpbnQ2NF90IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgVENHdl9pNjQgdDAgPSB0Y2dfY29uc3RfaTY0KGFyZzEpOworICAgIHRjZ19nZW5fc3ViX2k2NChyZXQsIHQwLCBhcmcyKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3N1YmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIC8qIHNvbWUgY2FzZXMgY2FuIGJlIG9wdGltaXplZCBoZXJlICovCisgICAgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ19jb25zdF9pNjQoYXJnMik7CisgICAgICAgIHRjZ19nZW5fc3ViX2k2NChyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2JyY29uZGlfaTY0KFRDR0NvbmQgY29uZCwgVENHdl9pNjQgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgYXJnMiwgaW50IGxhYmVsX2luZGV4KQoreworICAgIGlmIChjb25kID09IFRDR19DT05EX0FMV0FZUykgeworICAgICAgICB0Y2dfZ2VuX2JyKGxhYmVsX2luZGV4KTsKKyAgICB9IGVsc2UgaWYgKGNvbmQgIT0gVENHX0NPTkRfTkVWRVIpIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfY29uc3RfaTY0KGFyZzIpOworICAgICAgICB0Y2dfZ2VuX2JyY29uZF9pNjQoY29uZCwgYXJnMSwgdDAsIGxhYmVsX2luZGV4KTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc2V0Y29uZGlfaTY0KFRDR0NvbmQgY29uZCwgVENHdl9pNjQgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICBUQ0d2X2k2NCB0MCA9IHRjZ19jb25zdF9pNjQoYXJnMik7CisgICAgdGNnX2dlbl9zZXRjb25kX2k2NChjb25kLCByZXQsIGFyZzEsIHQwKTsKKyAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX211bGlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIFRDR3ZfaTY0IHQwID0gdGNnX2NvbnN0X2k2NChhcmcyKTsKKyAgICB0Y2dfZ2VuX211bF9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBvcHRpb25hbCBvcGVyYXRpb25zICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDhzX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZykKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXh0OHNfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9leHQ4c19pMzIsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHJldCwgYXJnLCAyNCk7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIocmV0LCByZXQsIDI0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDE2c19pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2V4dDE2c19pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDJfaTMyKElOREVYX29wX2V4dDE2c19pMzIsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHJldCwgYXJnLCAxNik7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIocmV0LCByZXQsIDE2KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDh1X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZykKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXh0OHVfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9leHQ4dV9pMzIsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTMyKHJldCwgYXJnLCAweGZmdSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHQxNnVfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQxNnVfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9leHQxNnVfaTMyLCByZXQsIGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMihyZXQsIGFyZywgMHhmZmZmdSk7CisgICAgfQorfQorCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlIHR3byBoaWdoIGJ5dGVzIGFyZSBzZXQgdG8gemVybyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXAxNl9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Jzd2FwMTZfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9ic3dhcDE2X2kzMiwgcmV0LCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIAorICAgICAgICB0Y2dfZ2VuX2V4dDh1X2kzMih0MCwgYXJnKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0MCwgdDAsIDgpOworICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHJldCwgYXJnLCA4KTsKKyAgICAgICAgdGNnX2dlbl9vcl9pMzIocmV0LCByZXQsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXAzMl9pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Jzd2FwMzJfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2kzMihJTkRFWF9vcF9ic3dhcDMyX2kzMiwgcmV0LCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwLCB0MTsKKyAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIAorICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHQwLCBhcmcsIDI0KTsKKyAgICAKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0MSwgYXJnLCAweDAwMDBmZjAwKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0MSwgdDEsIDgpOworICAgICAgICB0Y2dfZ2VuX29yX2kzMih0MCwgdDAsIHQxKTsKKyAgICAKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgYXJnLCA4KTsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0MSwgdDEsIDB4MDAwMGZmMDApOworICAgICAgICB0Y2dfZ2VuX29yX2kzMih0MCwgdDAsIHQxKTsKKyAgICAKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgYXJnLCAyNCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHJldCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7CisgICAgfQorfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZXh0OHNfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fZXh0OHNfaTMyKFRDR1ZfTE9XKHJldCksIFRDR1ZfTE9XKGFyZykpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfTE9XKHJldCksIDMxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZXh0MTZzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICB0Y2dfZ2VuX2V4dDE2c19pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnKSk7CisgICAgdGNnX2dlbl9zYXJpX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9MT1cocmV0KSwgMzEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHQzMnNfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fbW92X2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcpKTsKKyAgICB0Y2dfZ2VuX3NhcmlfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0xPVyhyZXQpLCAzMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDh1X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICB0Y2dfZ2VuX2V4dDh1X2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcpKTsKKyAgICB0Y2dfZ2VuX21vdmlfaTMyKFRDR1ZfSElHSChyZXQpLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZXh0MTZ1X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICB0Y2dfZ2VuX2V4dDE2dV9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnKSk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0hJR0gocmV0KSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDMydV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfTE9XKHJldCksIFRDR1ZfTE9XKGFyZykpOworICAgIHRjZ19nZW5fbW92aV9pMzIoVENHVl9ISUdIKHJldCksIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl90cnVuY19pNjRfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fbW92X2kzMihyZXQsIFRDR1ZfTE9XKGFyZykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHR1X2kzMl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfTE9XKHJldCksIGFyZyk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0hJR0gocmV0KSwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dF9pMzJfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pMzIgYXJnKQoreworICAgIHRjZ19nZW5fbW92X2kzMihUQ0dWX0xPVyhyZXQpLCBhcmcpOworICAgIHRjZ19nZW5fc2FyaV9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfTE9XKHJldCksIDMxKTsKK30KKworLyogTm90ZTogd2UgYXNzdW1lIHRoZSBzaXggaGlnaCBieXRlcyBhcmUgc2V0IHRvIHplcm8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2Jzd2FwMTZfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fbW92X2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZykpOworICAgIHRjZ19nZW5fYnN3YXAxNl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnKSk7Cit9CisKKy8qIE5vdGU6IHdlIGFzc3VtZSB0aGUgZm91ciBoaWdoIGJ5dGVzIGFyZSBzZXQgdG8gemVybyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXAzMl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnKSk7CisgICAgdGNnX2dlbl9ic3dhcDMyX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXA2NF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgVENHdl9pMzIgdDAsIHQxOworICAgIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworCisgICAgdGNnX2dlbl9ic3dhcDMyX2kzMih0MCwgVENHVl9MT1coYXJnKSk7CisgICAgdGNnX2dlbl9ic3dhcDMyX2kzMih0MSwgVENHVl9ISUdIKGFyZykpOworICAgIHRjZ19nZW5fbW92X2kzMihUQ0dWX0xPVyhyZXQpLCB0MSk7CisgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChyZXQpLCB0MCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKK30KKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDhzX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXh0OHNfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9leHQ4c19pNjQsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHJldCwgYXJnLCA1Nik7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pNjQocmV0LCByZXQsIDU2KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDE2c19pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2V4dDE2c19pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDJfaTY0KElOREVYX29wX2V4dDE2c19pNjQsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHJldCwgYXJnLCA0OCk7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pNjQocmV0LCByZXQsIDQ4KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDMyc19pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2V4dDMyc19pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDJfaTY0KElOREVYX29wX2V4dDMyc19pNjQsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHJldCwgYXJnLCAzMik7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pNjQocmV0LCByZXQsIDMyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dDh1X2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZykKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXh0OHVfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9leHQ4dV9pNjQsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHJldCwgYXJnLCAweGZmdSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHQxNnVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQxNnVfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9leHQxNnVfaTY0LCByZXQsIGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2k2NChyZXQsIGFyZywgMHhmZmZmdSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHQzMnVfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19leHQzMnVfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9leHQzMnVfaTY0LCByZXQsIGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2k2NChyZXQsIGFyZywgMHhmZmZmZmZmZnUpOworICAgIH0KK30KKworLyogTm90ZTogd2UgYXNzdW1lIHRoZSB0YXJnZXQgc3VwcG9ydHMgbW92ZSBiZXR3ZWVuIDMyIGFuZCA2NCBiaXQKKyAgIHJlZ2lzdGVycy4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBNSVBTNjQgdGFyZ2V0cy4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl90cnVuY19pNjRfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fbW92X2kzMihyZXQsIE1BS0VfVENHVl9JMzIoR0VUX1RDR1ZfSTY0KGFyZykpKTsKK30KKworLyogTm90ZTogd2UgYXNzdW1lIHRoZSB0YXJnZXQgc3VwcG9ydHMgbW92ZSBiZXR3ZWVuIDMyIGFuZCA2NCBiaXQKKyAgIHJlZ2lzdGVycyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZXh0dV9pMzJfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pMzIgYXJnKQoreworICAgIHRjZ19nZW5fZXh0MzJ1X2k2NChyZXQsIE1BS0VfVENHVl9JNjQoR0VUX1RDR1ZfSTMyKGFyZykpKTsKK30KKworLyogTm90ZTogd2UgYXNzdW1lIHRoZSB0YXJnZXQgc3VwcG9ydHMgbW92ZSBiZXR3ZWVuIDMyIGFuZCA2NCBiaXQKKyAgIHJlZ2lzdGVycyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZXh0X2kzMl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgdGNnX2dlbl9leHQzMnNfaTY0KHJldCwgTUFLRV9UQ0dWX0k2NChHRVRfVENHVl9JMzIoYXJnKSkpOworfQorCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlIHNpeCBoaWdoIGJ5dGVzIGFyZSBzZXQgdG8gemVybyAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXAxNl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Jzd2FwMTZfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9ic3dhcDE2X2k2NCwgcmV0LCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworCisgICAgICAgIHRjZ19nZW5fZXh0OHVfaTY0KHQwLCBhcmcpOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHQwLCB0MCwgOCk7CisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQocmV0LCBhcmcsIDgpOworICAgICAgICB0Y2dfZ2VuX29yX2k2NChyZXQsIHJldCwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCisvKiBOb3RlOiB3ZSBhc3N1bWUgdGhlIGZvdXIgaGlnaCBieXRlcyBhcmUgc2V0IHRvIHplcm8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2Jzd2FwMzJfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19ic3dhcDMyX2k2NCkgeworICAgICAgICB0Y2dfZ2VuX29wMl9pNjQoSU5ERVhfb3BfYnN3YXAzMl9pNjQsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCwgdDE7CisgICAgICAgIHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHQwLCBhcmcsIDI0KTsKKyAgICAgICAgdGNnX2dlbl9leHQzMnVfaTY0KHQwLCB0MCk7CisKKyAgICAgICAgdGNnX2dlbl9hbmRpX2k2NCh0MSwgYXJnLCAweDAwMDBmZjAwKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX2k2NCh0MSwgdDEsIDgpOworICAgICAgICB0Y2dfZ2VuX29yX2k2NCh0MCwgdDAsIHQxKTsKKworICAgICAgICB0Y2dfZ2VuX3NocmlfaTY0KHQxLCBhcmcsIDgpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCB0MSwgMHgwMDAwZmYwMCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHQwLCB0MCwgdDEpOworCisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDEsIGFyZywgMjQpOworICAgICAgICB0Y2dfZ2VuX29yX2k2NChyZXQsIHQwLCB0MSk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYnN3YXA2NF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2Jzd2FwNjRfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9ic3dhcDY0X2k2NCwgcmV0LCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBUQ0d2X2k2NCB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAKKyAgICAgICAgdGNnX2dlbl9zaGxpX2k2NCh0MCwgYXJnLCA1Nik7CisgICAgCisgICAgICAgIHRjZ19nZW5fYW5kaV9pNjQodDEsIGFyZywgMHgwMDAwZmYwMCk7CisgICAgICAgIHRjZ19nZW5fc2hsaV9pNjQodDEsIHQxLCA0MCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHQwLCB0MCwgdDEpOworICAgIAorICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCBhcmcsIDB4MDBmZjAwMDApOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHQxLCB0MSwgMjQpOworICAgICAgICB0Y2dfZ2VuX29yX2k2NCh0MCwgdDAsIHQxKTsKKworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCBhcmcsIDB4ZmYwMDAwMDApOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHQxLCB0MSwgOCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHQwLCB0MCwgdDEpOworCisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDEsIGFyZywgOCk7CisgICAgICAgIHRjZ19nZW5fYW5kaV9pNjQodDEsIHQxLCAweGZmMDAwMDAwKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQodDAsIHQwLCB0MSk7CisgICAgCisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDEsIGFyZywgMjQpOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCB0MSwgMHgwMGZmMDAwMCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHQwLCB0MCwgdDEpOworCisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDEsIGFyZywgNDApOworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCB0MSwgMHgwMDAwZmYwMCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHQwLCB0MCwgdDEpOworCisgICAgICAgIHRjZ19nZW5fc2hyaV9pNjQodDEsIGFyZywgNTYpOworICAgICAgICB0Y2dfZ2VuX29yX2k2NChyZXQsIHQwLCB0MSk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgIH0KK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX25lZ19pMzIoVENHdl9pMzIgcmV0LCBUQ0d2X2kzMiBhcmcpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX25lZ19pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDJfaTMyKElOREVYX29wX25lZ19pMzIsIHJldCwgYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ19jb25zdF9pMzIoMCk7CisgICAgICAgIHRjZ19nZW5fc3ViX2kzMihyZXQsIHQwLCBhcmcpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9uZWdfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19uZWdfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9uZWdfaTY0LCByZXQsIGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfY29uc3RfaTY0KDApOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQocmV0LCB0MCwgYXJnKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbm90X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZykKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbm90X2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wMl9pMzIoSU5ERVhfb3Bfbm90X2kzMiwgcmV0LCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5feG9yaV9pMzIocmV0LCBhcmcsIC0xKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX25vdF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcpCit7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorICAgIGlmIChUQ0dfVEFSR0VUX0hBU19ub3RfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AyX2k2NChJTkRFWF9vcF9ub3RfaTY0LCByZXQsIGFyZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl94b3JpX2k2NChyZXQsIGFyZywgLTEpOworICAgIH0KKyNlbHNlCisgICAgdGNnX2dlbl9ub3RfaTMyKFRDR1ZfTE9XKHJldCksIFRDR1ZfTE9XKGFyZykpOworICAgIHRjZ19nZW5fbm90X2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZykpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2Rpc2NhcmRfaTMyKFRDR3ZfaTMyIGFyZykKK3sKKyAgICB0Y2dfZ2VuX29wMV9pMzIoSU5ERVhfb3BfZGlzY2FyZCwgYXJnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGlzY2FyZF9pNjQoVENHdl9pNjQgYXJnKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICB0Y2dfZ2VuX2Rpc2NhcmRfaTMyKFRDR1ZfTE9XKGFyZykpOworICAgIHRjZ19nZW5fZGlzY2FyZF9pMzIoVENHVl9ISUdIKGFyZykpOworI2Vsc2UKKyAgICB0Y2dfZ2VuX29wMV9pNjQoSU5ERVhfb3BfZGlzY2FyZCwgYXJnKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9hbmRjX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2FuZGNfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9hbmRjX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTMyKHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHJldCwgYXJnMSwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9hbmRjX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorICAgIGlmIChUQ0dfVEFSR0VUX0hBU19hbmRjX2k2NCkgeworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfYW5kY19pNjQsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHRjZ19nZW5fbm90X2k2NCh0MCwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fYW5kX2k2NChyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0KKyNlbHNlCisgICAgdGNnX2dlbl9hbmRjX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIHRjZ19nZW5fYW5kY19pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9ISUdIKGFyZzIpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9lcXZfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXF2X2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3BfZXF2X2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3hvcl9pMzIocmV0LCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTMyKHJldCwgcmV0KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2Vxdl9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZXF2X2k2NCkgeworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfZXF2X2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3hvcl9pNjQocmV0LCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTY0KHJldCwgcmV0KTsKKyAgICB9CisjZWxzZQorICAgIHRjZ19nZW5fZXF2X2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIHRjZ19nZW5fZXF2X2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZzEpLCBUQ0dWX0hJR0goYXJnMikpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX25hbmRfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbmFuZF9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX25hbmRfaTMyLCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fYW5kX2kzMihyZXQsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX25vdF9pMzIocmV0LCByZXQpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbmFuZF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbmFuZF9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX25hbmRfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fYW5kX2k2NChyZXQsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX25vdF9pNjQocmV0LCByZXQpOworICAgIH0KKyNlbHNlCisgICAgdGNnX2dlbl9uYW5kX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIHRjZ19nZW5fbmFuZF9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9ISUdIKGFyZzIpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9ub3JfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbm9yX2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfbm9yX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX29yX2kzMihyZXQsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX25vdF9pMzIocmV0LCByZXQpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbm9yX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorICAgIGlmIChUQ0dfVEFSR0VUX0hBU19ub3JfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9ub3JfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fb3JfaTY0KHJldCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbm90X2k2NChyZXQsIHJldCk7CisgICAgfQorI2Vsc2UKKyAgICB0Y2dfZ2VuX25vcl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSksIFRDR1ZfTE9XKGFyZzIpKTsKKyAgICB0Y2dfZ2VuX25vcl9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSwgVENHVl9ISUdIKGFyZzIpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9vcmNfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfb3JjX2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfb3JjX2kzMiwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2kzMiB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTMyKHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pMzIocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX29yY19pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLCBUQ0d2X2k2NCBhcmcyKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfb3JjX2k2NCkgeworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3Bfb3JjX2k2NCwgcmV0LCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9ub3RfaTY0KHQwLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCBhcmcxLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICB9CisjZWxzZQorICAgIHRjZ19nZW5fb3JjX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwgVENHVl9MT1coYXJnMikpOworICAgIHRjZ19nZW5fb3JjX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9ISUdIKGFyZzEpLCBUQ0dWX0hJR0goYXJnMikpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JvdGxfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfcm90X2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfcm90bF9pMzIsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pMzIgdDAsIHQxOworCisgICAgICAgIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9zaGxfaTMyKHQwLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zdWJmaV9pMzIodDEsIDMyLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zaHJfaTMyKHQxLCBhcmcxLCB0MSk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHJldCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9yb3RsX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JvdF9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3JvdGxfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwLCB0MTsKKyAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX3NobF9pNjQodDAsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3N1YmZpX2k2NCh0MSwgNjQsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3Nocl9pNjQodDEsIGFyZzEsIHQxKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCB0MCwgdDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JvdGxpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICAvKiBzb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZSAqLworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMSk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19yb3RfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX2NvbnN0X2kzMihhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9yb3RsX2kzMihyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwLCB0MTsKKyAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHQwLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgYXJnMSwgMzIgLSBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pMzIocmV0LCB0MCwgdDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JvdGxpX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIGludDY0X3QgYXJnMikKK3sKKyAgICAvKiBzb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZSAqLworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTY0KHJldCwgYXJnMSk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19yb3RfaTY0KSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX2NvbnN0X2k2NChhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9yb3RsX2k2NChyZXQsIGFyZzEsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwLCB0MTsKKyAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX3NobGlfaTY0KHQwLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zaHJpX2k2NCh0MSwgYXJnMSwgNjQgLSBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCB0MCwgdDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JvdHJfaTMyKFRDR3ZfaTMyIHJldCwgVENHdl9pMzIgYXJnMSwgVENHdl9pMzIgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfcm90X2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3Bfcm90cl9pMzIsIHJldCwgYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pMzIgdDAsIHQxOworCisgICAgICAgIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9zaHJfaTMyKHQwLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zdWJmaV9pMzIodDEsIDMyLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9zaGxfaTMyKHQxLCBhcmcxLCB0MSk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHJldCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9yb3RyX2k2NChUQ0d2X2k2NCByZXQsIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3JvdF9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX3JvdHJfaTY0LCByZXQsIGFyZzEsIGFyZzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwLCB0MTsKKyAgICAgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX3Nocl9pNjQodDAsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3N1YmZpX2k2NCh0MSwgNjQsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX3NobF9pNjQodDEsIGFyZzEsIHQxKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCB0MCwgdDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3JvdHJpX2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICAvKiBzb21lIGNhc2VzIGNhbiBiZSBvcHRpbWl6ZWQgaGVyZSAqLworICAgIGlmIChhcmcyID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9yb3RsaV9pMzIocmV0LCBhcmcxLCAzMiAtIGFyZzIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fcm90cmlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwgaW50NjRfdCBhcmcyKQoreworICAgIC8qIHNvbWUgY2FzZXMgY2FuIGJlIG9wdGltaXplZCBoZXJlICovCisgICAgaWYgKGFyZzIgPT0gMCkgeworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmV0LCBhcmcxKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0Y2dfZ2VuX3JvdGxpX2k2NChyZXQsIGFyZzEsIDY0IC0gYXJnMik7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9kZXBvc2l0X2kzMihUQ0d2X2kzMiByZXQsIFRDR3ZfaTMyIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmcyLCB1bnNpZ25lZCBpbnQgb2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICB1aW50MzJfdCBtYXNrOworICAgIFRDR3ZfaTMyIHQxOworCisgICAgdGNnX2RlYnVnX2Fzc2VydChvZnMgPCAzMik7CisgICAgdGNnX2RlYnVnX2Fzc2VydChsZW4gPD0gMzIpOworICAgIHRjZ19kZWJ1Z19hc3NlcnQob2ZzICsgbGVuIDw9IDMyKTsKKworICAgIGlmIChvZnMgPT0gMCAmJiBsZW4gPT0gMzIpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKHJldCwgYXJnMik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2RlcG9zaXRfaTMyICYmIFRDR19UQVJHRVRfZGVwb3NpdF9pMzJfdmFsaWQob2ZzLCBsZW4pKSB7CisgICAgICAgIHRjZ19nZW5fb3A1aWlfaTMyKElOREVYX29wX2RlcG9zaXRfaTMyLCByZXQsIGFyZzEsIGFyZzIsIG9mcywgbGVuKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1hc2sgPSAoMXUgPDwgbGVuKSAtIDE7CisgICAgdDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisKKyAgICBpZiAob2ZzICsgbGVuIDwgMzIpIHsKKyAgICAgICAgdGNnX2dlbl9hbmRpX2kzMih0MSwgYXJnMiwgbWFzayk7CisgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodDEsIHQxLCBvZnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fc2hsaV9pMzIodDEsIGFyZzIsIG9mcyk7CisgICAgfQorICAgIHRjZ19nZW5fYW5kaV9pMzIocmV0LCBhcmcxLCB+KG1hc2sgPDwgb2ZzKSk7CisgICAgdGNnX2dlbl9vcl9pMzIocmV0LCByZXQsIHQxKTsKKworICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZGVwb3NpdF9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMiwgdW5zaWduZWQgaW50IG9mcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgdWludDY0X3QgbWFzazsKKyAgICBUQ0d2X2k2NCB0MTsKKworICAgIHRjZ19kZWJ1Z19hc3NlcnQob2ZzIDwgNjQpOworICAgIHRjZ19kZWJ1Z19hc3NlcnQobGVuIDw9IDY0KTsKKyAgICB0Y2dfZGVidWdfYXNzZXJ0KG9mcyArIGxlbiA8PSA2NCk7CisKKyAgICBpZiAob2ZzID09IDAgJiYgbGVuID09IDY0KSB7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChyZXQsIGFyZzIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChUQ0dfVEFSR0VUX0hBU19kZXBvc2l0X2k2NCAmJiBUQ0dfVEFSR0VUX2RlcG9zaXRfaTY0X3ZhbGlkKG9mcywgbGVuKSkgeworICAgICAgICB0Y2dfZ2VuX29wNWlpX2k2NChJTkRFWF9vcF9kZXBvc2l0X2k2NCwgcmV0LCBhcmcxLCBhcmcyLCBvZnMsIGxlbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisgICAgaWYgKG9mcyA+PSAzMikgeworICAgICAgICB0Y2dfZ2VuX2RlcG9zaXRfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHVl9MT1coYXJnMiksIG9mcyAtIDMyLCBsZW4pOworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChvZnMgKyBsZW4gPD0gMzIpIHsKKyAgICAgICAgdGNnX2dlbl9kZXBvc2l0X2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyhhcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX0xPVyhhcmcyKSwgb2ZzLCBsZW4pOworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChhcmcxKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIG1hc2sgPSAoMXVsbCA8PCBsZW4pIC0gMTsKKyAgICB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgIGlmIChvZnMgKyBsZW4gPCA2NCkgeworICAgICAgICB0Y2dfZ2VuX2FuZGlfaTY0KHQxLCBhcmcyLCBtYXNrKTsKKyAgICAgICAgdGNnX2dlbl9zaGxpX2k2NCh0MSwgdDEsIG9mcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9zaGxpX2k2NCh0MSwgYXJnMiwgb2ZzKTsKKyAgICB9CisgICAgdGNnX2dlbl9hbmRpX2k2NChyZXQsIGFyZzEsIH4obWFzayA8PCBvZnMpKTsKKyAgICB0Y2dfZ2VuX29yX2k2NChyZXQsIHJldCwgdDEpOworCisgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9jb25jYXRfaTMyX2k2NChUQ0d2X2k2NCBkZXN0LCBUQ0d2X2kzMiBsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBoaWdoKQoreworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICB0Y2dfZ2VuX21vdl9pMzIoVENHVl9MT1coZGVzdCksIGxvdyk7CisgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChkZXN0KSwgaGlnaCk7CisjZWxzZQorICAgIFRDR3ZfaTY0IHRtcCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAvKiBUaGVzZSBleHRlbnNpb25zIGFyZSBvbmx5IG5lZWRlZCBmb3IgdHlwZSBjb3JyZWN0bmVzcy4KKyAgICAgICBXZSBtYXkgYmUgYWJsZSB0byBkbyBiZXR0ZXIgZ2l2ZW4gdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KKyAgICB0Y2dfZ2VuX2V4dHVfaTMyX2k2NCh0bXAsIGhpZ2gpOworICAgIHRjZ19nZW5fZXh0dV9pMzJfaTY0KGRlc3QsIGxvdyk7CisgICAgLyogSWYgZGVwb3NpdCBpcyBhdmFpbGFibGUsIHVzZSBpdC4gIE90aGVyd2lzZSB1c2UgdGhlIGV4dHJhCisgICAgICAga25vd2xlZGdlIHRoYXQgd2UgaGF2ZSBvZiB0aGUgemVyby1leHRlbnNpb25zIGFib3ZlLiAgKi8KKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfZGVwb3NpdF9pNjQgJiYgVENHX1RBUkdFVF9kZXBvc2l0X2k2NF92YWxpZCgzMiwgMzIpKSB7CisgICAgICAgIHRjZ19nZW5fZGVwb3NpdF9pNjQoZGVzdCwgZGVzdCwgdG1wLCAzMiwgMzIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRjZ19nZW5fc2hsaV9pNjQodG1wLCB0bXAsIDMyKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQoZGVzdCwgZGVzdCwgdG1wKTsKKyAgICB9CisgICAgdGNnX3RlbXBfZnJlZV9pNjQodG1wKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9jb25jYXQzMl9pNjQoVENHdl9pNjQgZGVzdCwgVENHdl9pNjQgbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGhpZ2gpCit7CisgICAgdGNnX2dlbl9kZXBvc2l0X2k2NChkZXN0LCBsb3csIGhpZ2gsIDMyLCAzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4dHJfaTY0X2kzMihUQ0d2X2kzMiBsbywgVENHdl9pMzIgaGksIFRDR3ZfaTY0IGFyZykKK3sKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisgICAgdGNnX2dlbl9tb3ZfaTMyKGxvLCBUQ0dWX0xPVyhhcmcpKTsKKyAgICB0Y2dfZ2VuX21vdl9pMzIoaGksIFRDR1ZfSElHSChhcmcpKTsKKyNlbHNlCisgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgdGNnX2dlbl90cnVuY19pNjRfaTMyKGxvLCBhcmcpOworICAgIHRjZ19nZW5fc2hyaV9pNjQodDAsIGFyZywgMzIpOworICAgIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMihoaSwgdDApOworICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9leHRyMzJfaTY0KFRDR3ZfaTY0IGxvLCBUQ0d2X2k2NCBoaSwgVENHdl9pNjQgYXJnKQoreworICAgIHRjZ19nZW5fZXh0MzJ1X2k2NChsbywgYXJnKTsKKyAgICB0Y2dfZ2VuX3NocmlfaTY0KGhpLCBhcmcsIDMyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92Y29uZF9pMzIoVENHQ29uZCBjb25kLCBUQ0d2X2kzMiByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBjMSwgVENHdl9pMzIgYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiB2MSwgVENHdl9pMzIgdjIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX21vdmNvbmRfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3A2aV9pMzIoSU5ERVhfb3BfbW92Y29uZF9pMzIsIHJldCwgYzEsIGMyLCB2MSwgdjIsIGNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICBUQ0d2X2kzMiB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9zZXRjb25kX2kzMihjb25kLCB0MCwgYzEsIGMyKTsKKyAgICAgICAgdGNnX2dlbl9uZWdfaTMyKHQwLCB0MCk7CisgICAgICAgIHRjZ19nZW5fYW5kX2kzMih0MSwgdjEsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9hbmRjX2kzMihyZXQsIHYyLCB0MCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKHJldCwgcmV0LCB0MSk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbW92Y29uZF9pNjQoVENHQ29uZCBjb25kLCBUQ0d2X2k2NCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCBjMSwgVENHdl9pNjQgYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2k2NCB2MSwgVENHdl9pNjQgdjIpCit7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIFRDR3ZfaTMyIHQxID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgIHRjZ19nZW5fb3A2aV9pMzIoSU5ERVhfb3Bfc2V0Y29uZDJfaTMyLCB0MCwKKyAgICAgICAgICAgICAgICAgICAgIFRDR1ZfTE9XKGMxKSwgVENHVl9ISUdIKGMxKSwKKyAgICAgICAgICAgICAgICAgICAgIFRDR1ZfTE9XKGMyKSwgVENHVl9ISUdIKGMyKSwgY29uZCk7CisKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbW92Y29uZF9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMih0MSwgMCk7CisgICAgICAgIHRjZ19nZW5fbW92Y29uZF9pMzIoVENHX0NPTkRfTkUsIFRDR1ZfTE9XKHJldCksIHQwLCB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0dWX0xPVyh2MSksIFRDR1ZfTE9XKHYyKSk7CisgICAgICAgIHRjZ19nZW5fbW92Y29uZF9pMzIoVENHX0NPTkRfTkUsIFRDR1ZfSElHSChyZXQpLCB0MCwgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHVl9ISUdIKHYxKSwgVENHVl9ISUdIKHYyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2dlbl9uZWdfaTMyKHQwLCB0MCk7CisKKyAgICAgICAgdGNnX2dlbl9hbmRfaTMyKHQxLCBUQ0dWX0xPVyh2MSksIHQwKTsKKyAgICAgICAgdGNnX2dlbl9hbmRjX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0xPVyh2MiksIHQwKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1cocmV0KSwgdDEpOworCisgICAgICAgIHRjZ19nZW5fYW5kX2kzMih0MSwgVENHVl9ISUdIKHYxKSwgdDApOworICAgICAgICB0Y2dfZ2VuX2FuZGNfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0godjIpLCB0MCk7CisgICAgICAgIHRjZ19nZW5fb3JfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0gocmV0KSwgdDEpOworICAgIH0KKyAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworI2Vsc2UKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbW92Y29uZF9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDZpX2k2NChJTkRFWF9vcF9tb3Zjb25kX2k2NCwgcmV0LCBjMSwgYzIsIHYxLCB2MiwgY29uZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIFRDR3ZfaTY0IHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX3NldGNvbmRfaTY0KGNvbmQsIHQwLCBjMSwgYzIpOworICAgICAgICB0Y2dfZ2VuX25lZ19pNjQodDAsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9hbmRfaTY0KHQxLCB2MSwgdDApOworICAgICAgICB0Y2dfZ2VuX2FuZGNfaTY0KHJldCwgdjIsIHQwKTsKKyAgICAgICAgdGNnX2dlbl9vcl9pNjQocmV0LCByZXQsIHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2FkZDJfaTMyKFRDR3ZfaTMyIHJsLCBUQ0d2X2kzMiByaCwgVENHdl9pMzIgYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhaCwgVENHdl9pMzIgYmwsIFRDR3ZfaTMyIGJoKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19hZGQyX2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wNl9pMzIoSU5ERVhfb3BfYWRkMl9pMzIsIHJsLCByaCwgYWwsIGFoLCBibCwgYmgpOworICAgICAgICAvKiBBbGxvdyB0aGUgb3B0aW1pemVyIHJvb20gdG8gcmVwbGFjZSBhZGQyIHdpdGggdHdvIG1vdmVzLiAgKi8KKyAgICAgICAgdGNnX2dlbl9vcDAoSU5ERVhfb3Bfbm9wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgVENHdl9pNjQgdDEgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHRjZ19nZW5fY29uY2F0X2kzMl9pNjQodDAsIGFsLCBhaCk7CisgICAgICAgIHRjZ19nZW5fY29uY2F0X2kzMl9pNjQodDEsIGJsLCBiaCk7CisgICAgICAgIHRjZ19nZW5fYWRkX2k2NCh0MCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX2dlbl9leHRyX2k2NF9pMzIocmwsIHJoLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fc3ViMl9pMzIoVENHdl9pMzIgcmwsIFRDR3ZfaTMyIHJoLCBUQ0d2X2kzMiBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFoLCBUQ0d2X2kzMiBibCwgVENHdl9pMzIgYmgpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX3N1YjJfaTMyKSB7CisgICAgICAgIHRjZ19nZW5fb3A2X2kzMihJTkRFWF9vcF9zdWIyX2kzMiwgcmwsIHJoLCBhbCwgYWgsIGJsLCBiaCk7CisgICAgICAgIC8qIEFsbG93IHRoZSBvcHRpbWl6ZXIgcm9vbSB0byByZXBsYWNlIHN1YjIgd2l0aCB0d28gbW92ZXMuICAqLworICAgICAgICB0Y2dfZ2VuX29wMChJTkRFWF9vcF9ub3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBUQ0d2X2k2NCB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NCh0MCwgYWwsIGFoKTsKKyAgICAgICAgdGNnX2dlbl9jb25jYXRfaTMyX2k2NCh0MSwgYmwsIGJoKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfaTY0KHQwLCB0MCwgdDEpOworICAgICAgICB0Y2dfZ2VuX2V4dHJfaTY0X2kzMihybCwgcmgsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tdWx1Ml9pMzIoVENHdl9pMzIgcmwsIFRDR3ZfaTMyIHJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTMyIGFyZzEsIFRDR3ZfaTMyIGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX211bHUyX2kzMikgeworICAgICAgICB0Y2dfZ2VuX29wNF9pMzIoSU5ERVhfb3BfbXVsdTJfaTMyLCBybCwgcmgsIGFyZzEsIGFyZzIpOworICAgICAgICAvKiBBbGxvdyB0aGUgb3B0aW1pemVyIHJvb20gdG8gcmVwbGFjZSBtdWx1MiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgICAgIHRjZ19nZW5fb3AwKElOREVYX29wX25vcCk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19tdWx1aF9pMzIpIHsKKyAgICAgICAgVENHdl9pMzIgdCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX211bF9pMzIsIHQsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX29wM19pMzIoSU5ERVhfb3BfbXVsdWhfaTMyLCByaCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihybCwgdCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBUQ0d2X2k2NCB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9leHR1X2kzMl9pNjQodDAsIGFyZzEpOworICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX2k2NCh0MSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX2dlbl9leHRyX2k2NF9pMzIocmwsIHJoLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fbXVsczJfaTMyKFRDR3ZfaTMyIHJsLCBUQ0d2X2kzMiByaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0d2X2kzMiBhcmcxLCBUQ0d2X2kzMiBhcmcyKQoreworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19tdWxzMl9pMzIpIHsKKyAgICAgICAgdGNnX2dlbl9vcDRfaTMyKElOREVYX29wX211bHMyX2kzMiwgcmwsIHJoLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgLyogQWxsb3cgdGhlIG9wdGltaXplciByb29tIHRvIHJlcGxhY2UgbXVsczIgd2l0aCB0d28gbW92ZXMuICAqLworICAgICAgICB0Y2dfZ2VuX29wMChJTkRFWF9vcF9ub3ApOworICAgIH0gZWxzZSBpZiAoVENHX1RBUkdFVF9IQVNfbXVsc2hfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIHRjZ19nZW5fb3AzX2kzMihJTkRFWF9vcF9tdWxfaTMyLCB0LCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTMyKElOREVYX29wX211bHNoX2kzMiwgcmgsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX21vdl9pMzIocmwsIHQpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0KTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIgJiYgVENHX1RBUkdFVF9IQVNfbXVsdTJfaTMyKSB7CisgICAgICAgIFRDR3ZfaTMyIHQwID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICBUQ0d2X2kzMiB0MSA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgVENHdl9pMzIgdDIgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIFRDR3ZfaTMyIHQzID0gdGNnX3RlbXBfbmV3X2kzMigpOworICAgICAgICB0Y2dfZ2VuX29wNF9pMzIoSU5ERVhfb3BfbXVsdTJfaTMyLCB0MCwgdDEsIGFyZzEsIGFyZzIpOworICAgICAgICAvKiBBbGxvdyB0aGUgb3B0aW1pemVyIHJvb20gdG8gcmVwbGFjZSBtdWx1MiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgICAgIHRjZ19nZW5fb3AwKElOREVYX29wX25vcCk7CisgICAgICAgIC8qIEFkanVzdCBmb3IgbmVnYXRpdmUgaW5wdXRzLiAgKi8KKyAgICAgICAgdGNnX2dlbl9zYXJpX2kzMih0MiwgYXJnMSwgMzEpOworICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKHQzLCBhcmcyLCAzMSk7CisgICAgICAgIHRjZ19nZW5fYW5kX2kzMih0MiwgdDIsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX2FuZF9pMzIodDMsIHQzLCBhcmcxKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfaTMyKHJoLCB0MSwgdDIpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pMzIocmgsIHJoLCB0Myk7CisgICAgICAgIHRjZ19nZW5fbW92X2kzMihybCwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQxKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDIpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2kzMih0Myk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIFRDR3ZfaTY0IHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KHQwLCBhcmcxKTsKKyAgICAgICAgdGNnX2dlbl9leHRfaTMyX2k2NCh0MSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgdDAsIHQxKTsKKyAgICAgICAgdGNnX2dlbl9leHRyX2k2NF9pMzIocmwsIHJoLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fYWRkMl9pNjQoVENHdl9pNjQgcmwsIFRDR3ZfaTY0IHJoLCBUQ0d2X2k2NCBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFoLCBUQ0d2X2k2NCBibCwgVENHdl9pNjQgYmgpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX2FkZDJfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3A2X2k2NChJTkRFWF9vcF9hZGQyX2k2NCwgcmwsIHJoLCBhbCwgYWgsIGJsLCBiaCk7CisgICAgICAgIC8qIEFsbG93IHRoZSBvcHRpbWl6ZXIgcm9vbSB0byByZXBsYWNlIGFkZDIgd2l0aCB0d28gbW92ZXMuICAqLworICAgICAgICB0Y2dfZ2VuX29wMChJTkRFWF9vcF9ub3ApOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBUQ0d2X2k2NCB0MSA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfaTY0KHQwLCBhbCwgYmwpOworICAgICAgICB0Y2dfZ2VuX3NldGNvbmRfaTY0KFRDR19DT05EX0xUVSwgdDEsIHQwLCBhbCk7CisgICAgICAgIHRjZ19nZW5fYWRkX2k2NChyaCwgYWgsIGJoKTsKKyAgICAgICAgdGNnX2dlbl9hZGRfaTY0KHJoLCByaCwgdDEpOworICAgICAgICB0Y2dfZ2VuX21vdl9pNjQocmwsIHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9zdWIyX2k2NChUQ0d2X2k2NCBybCwgVENHdl9pNjQgcmgsIFRDR3ZfaTY0IGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYWgsIFRDR3ZfaTY0IGJsLCBUQ0d2X2k2NCBiaCkKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfc3ViMl9pNjQpIHsKKyAgICAgICAgdGNnX2dlbl9vcDZfaTY0KElOREVYX29wX3N1YjJfaTY0LCBybCwgcmgsIGFsLCBhaCwgYmwsIGJoKTsKKyAgICAgICAgLyogQWxsb3cgdGhlIG9wdGltaXplciByb29tIHRvIHJlcGxhY2Ugc3ViMiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgICAgIHRjZ19nZW5fb3AwKElOREVYX29wX25vcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIFRDR3ZfaTY0IHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQodDAsIGFsLCBibCk7CisgICAgICAgIHRjZ19nZW5fc2V0Y29uZF9pNjQoVENHX0NPTkRfTFRVLCB0MSwgYWwsIGJsKTsKKyAgICAgICAgdGNnX2dlbl9zdWJfaTY0KHJoLCBhaCwgYmgpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQocmgsIHJoLCB0MSk7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChybCwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQxKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX211bHUyX2k2NChUQ0d2X2k2NCBybCwgVENHdl9pNjQgcmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHdl9pNjQgYXJnMSwgVENHdl9pNjQgYXJnMikKK3sKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbXVsdTJfaTY0KSB7CisgICAgICAgIHRjZ19nZW5fb3A0X2k2NChJTkRFWF9vcF9tdWx1Ml9pNjQsIHJsLCByaCwgYXJnMSwgYXJnMik7CisgICAgICAgIC8qIEFsbG93IHRoZSBvcHRpbWl6ZXIgcm9vbSB0byByZXBsYWNlIG11bHUyIHdpdGggdHdvIG1vdmVzLiAgKi8KKyAgICAgICAgdGNnX2dlbl9vcDAoSU5ERVhfb3Bfbm9wKTsKKyAgICB9IGVsc2UgaWYgKFRDR19UQVJHRVRfSEFTX211bHVoX2k2NCkgeworICAgICAgICBUQ0d2X2k2NCB0ID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfbXVsX2k2NCwgdCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fb3AzX2k2NChJTkRFWF9vcF9tdWx1aF9pNjQsIHJoLCBhcmcxLCBhcmcyKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTY0KHJsLCB0KTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodCk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pNjQpIHsKKyAgICAgICAgVENHdl9pNjQgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIFRDR3ZfaTY0IHQxID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBUQ0d2X2k2NCB0MiA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgVENHdl9pNjQgdDMgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgICAgIHRjZ19nZW5fb3A0X2k2NChJTkRFWF9vcF9tdWx1Ml9pNjQsIHQwLCB0MSwgYXJnMSwgYXJnMik7CisgICAgICAgIC8qIEFsbG93IHRoZSBvcHRpbWl6ZXIgcm9vbSB0byByZXBsYWNlIG11bHUyIHdpdGggdHdvIG1vdmVzLiAgKi8KKyAgICAgICAgdGNnX2dlbl9vcDAoSU5ERVhfb3Bfbm9wKTsKKyAgICAgICAgLyogQWRqdXN0IGZvciBuZWdhdGl2ZSBpbnB1dHMuICAqLworICAgICAgICB0Y2dfZ2VuX3NhcmlfaTY0KHQyLCBhcmcxLCA2Myk7CisgICAgICAgIHRjZ19nZW5fc2FyaV9pNjQodDMsIGFyZzIsIDYzKTsKKyAgICAgICAgdGNnX2dlbl9hbmRfaTY0KHQyLCB0MiwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fYW5kX2k2NCh0MywgdDMsIGFyZzEpOworICAgICAgICB0Y2dfZ2VuX3N1Yl9pNjQocmgsIHQxLCB0Mik7CisgICAgICAgIHRjZ19nZW5fc3ViX2k2NChyaCwgcmgsIHQzKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTY0KHJsLCB0MCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodDEpOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0Mik7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB0MCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgaW50IHNpemVtYXNrID0gMDsKKyAgICAgICAgLyogUmV0dXJuIHZhbHVlIGFuZCBib3RoIGFyZ3VtZW50cyBhcmUgNjQtYml0IGFuZCB1bnNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMCk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMCk7CisgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9tdWx1aF9pNjQsIHNpemVtYXNrLCByaCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChybCwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9tdWxzMl9pNjQoVENHdl9pNjQgcmwsIFRDR3ZfaTY0IHJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR3ZfaTY0IGFyZzEsIFRDR3ZfaTY0IGFyZzIpCit7CisgICAgaWYgKFRDR19UQVJHRVRfSEFTX211bHMyX2k2NCkgeworICAgICAgICB0Y2dfZ2VuX29wNF9pNjQoSU5ERVhfb3BfbXVsczJfaTY0LCBybCwgcmgsIGFyZzEsIGFyZzIpOworICAgICAgICAvKiBBbGxvdyB0aGUgb3B0aW1pemVyIHJvb20gdG8gcmVwbGFjZSBtdWxzMiB3aXRoIHR3byBtb3Zlcy4gICovCisgICAgICAgIHRjZ19nZW5fb3AwKElOREVYX29wX25vcCk7CisgICAgfSBlbHNlIGlmIChUQ0dfVEFSR0VUX0hBU19tdWxzaF9pNjQpIHsKKyAgICAgICAgVENHdl9pNjQgdCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgdGNnX2dlbl9vcDNfaTY0KElOREVYX29wX211bF9pNjQsIHQsIGFyZzEsIGFyZzIpOworICAgICAgICB0Y2dfZ2VuX29wM19pNjQoSU5ERVhfb3BfbXVsc2hfaTY0LCByaCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChybCwgdCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTY0IHQwID0gdGNnX3RlbXBfbmV3X2k2NCgpOworICAgICAgICBpbnQgc2l6ZW1hc2sgPSAwOworICAgICAgICAvKiBSZXR1cm4gdmFsdWUgYW5kIGJvdGggYXJndW1lbnRzIGFyZSA2NC1iaXQgYW5kIHNpZ25lZC4gICovCisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMCwgMSwgMSk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMSwgMSwgMSk7CisgICAgICAgIHNpemVtYXNrIHw9IHRjZ19nZW5fc2l6ZW1hc2soMiwgMSwgMSk7CisgICAgICAgIHRjZ19nZW5fbXVsX2k2NCh0MCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5faGVscGVyNjQodGNnX2hlbHBlcl9tdWxzaF9pNjQsIHNpemVtYXNrLCByaCwgYXJnMSwgYXJnMik7CisgICAgICAgIHRjZ19nZW5fbW92X2k2NChybCwgdDApOworICAgICAgICB0Y2dfdGVtcF9mcmVlX2k2NCh0MCk7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUUVNVSBzcGVjaWZpYyBvcGVyYXRpb25zLiBUaGVpciB0eXBlIGRlcGVuZCBvbiB0aGUgUUVNVSBDUFUKKyAgIHR5cGUuICovCisjaWZuZGVmIFRBUkdFVF9MT05HX0JJVFMKKyNlcnJvciBtdXN0IGluY2x1ZGUgUUVNVSBoZWFkZXJzCisjZW5kaWYKKworI2lmIFRBUkdFVF9MT05HX0JJVFMgPT0gMzIKKyNkZWZpbmUgVENHdiBUQ0d2X2kzMgorI2RlZmluZSB0Y2dfdGVtcF9uZXcoKSB0Y2dfdGVtcF9uZXdfaTMyKCkKKyNkZWZpbmUgdGNnX2dsb2JhbF9yZWdfbmV3IHRjZ19nbG9iYWxfcmVnX25ld19pMzIKKyNkZWZpbmUgdGNnX2dsb2JhbF9tZW1fbmV3IHRjZ19nbG9iYWxfbWVtX25ld19pMzIKKyNkZWZpbmUgdGNnX3RlbXBfbG9jYWxfbmV3KCkgdGNnX3RlbXBfbG9jYWxfbmV3X2kzMigpCisjZGVmaW5lIHRjZ190ZW1wX2ZyZWUgdGNnX3RlbXBfZnJlZV9pMzIKKyNkZWZpbmUgVENHVl9VTlVTRUQoeCkgVENHVl9VTlVTRURfSTMyKHgpCisjZGVmaW5lIFRDR1ZfSVNfVU5VU0VEKHgpIFRDR1ZfSVNfVU5VU0VEX0kzMih4KQorI2RlZmluZSBUQ0dWX0VRVUFMKGEsIGIpIFRDR1ZfRVFVQUxfSTMyKGEsIGIpCisjZGVmaW5lIHRjZ19hZGRfcGFyYW1fdGwgdGNnX2FkZF9wYXJhbV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9xZW11X2xkX3RsIHRjZ19nZW5fcWVtdV9sZF9pMzIKKyNkZWZpbmUgdGNnX2dlbl9xZW11X3N0X3RsIHRjZ19nZW5fcWVtdV9zdF9pMzIKKyNlbHNlCisjZGVmaW5lIFRDR3YgVENHdl9pNjQKKyNkZWZpbmUgdGNnX3RlbXBfbmV3KCkgdGNnX3RlbXBfbmV3X2k2NCgpCisjZGVmaW5lIHRjZ19nbG9iYWxfcmVnX25ldyB0Y2dfZ2xvYmFsX3JlZ19uZXdfaTY0CisjZGVmaW5lIHRjZ19nbG9iYWxfbWVtX25ldyB0Y2dfZ2xvYmFsX21lbV9uZXdfaTY0CisjZGVmaW5lIHRjZ190ZW1wX2xvY2FsX25ldygpIHRjZ190ZW1wX2xvY2FsX25ld19pNjQoKQorI2RlZmluZSB0Y2dfdGVtcF9mcmVlIHRjZ190ZW1wX2ZyZWVfaTY0CisjZGVmaW5lIFRDR1ZfVU5VU0VEKHgpIFRDR1ZfVU5VU0VEX0k2NCh4KQorI2RlZmluZSBUQ0dWX0lTX1VOVVNFRCh4KSBUQ0dWX0lTX1VOVVNFRF9JNjQoeCkKKyNkZWZpbmUgVENHVl9FUVVBTChhLCBiKSBUQ0dWX0VRVUFMX0k2NChhLCBiKQorI2RlZmluZSB0Y2dfYWRkX3BhcmFtX3RsIHRjZ19hZGRfcGFyYW1faTY0CisjZGVmaW5lIHRjZ19nZW5fcWVtdV9sZF90bCB0Y2dfZ2VuX3FlbXVfbGRfaTY0CisjZGVmaW5lIHRjZ19nZW5fcWVtdV9zdF90bCB0Y2dfZ2VuX3FlbXVfc3RfaTY0CisjZW5kaWYKKworLyogZGVidWcgaW5mbzogd3JpdGUgdGhlIFBDIG9mIHRoZSBjb3JyZXNwb25kaW5nIFFFTVUgQ1BVIGluc3RydWN0aW9uICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9kZWJ1Z19pbnNuX3N0YXJ0KHVpbnQ2NF90IHBjKQoreworICAgIC8qIFhYWDogbXVzdCByZWFsbHkgdXNlIGEgMzIgYml0IHNpemUgZm9yIFRDR0FyZyBpbiBhbGwgY2FzZXMgKi8KKyNpZiBUQVJHRVRfTE9OR19CSVRTID4gVENHX1RBUkdFVF9SRUdfQklUUworICAgIHRjZ19nZW5fb3AyaWkoSU5ERVhfb3BfZGVidWdfaW5zbl9zdGFydCwgCisgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHBjKSwgKHVpbnQzMl90KShwYyA+PiAzMikpOworI2Vsc2UKKyAgICB0Y2dfZ2VuX29wMWkoSU5ERVhfb3BfZGVidWdfaW5zbl9zdGFydCwgcGMpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX2V4aXRfdGIodWludHB0cl90IHZhbCkKK3sKKyAgICB0Y2dfZ2VuX29wMWkoSU5ERVhfb3BfZXhpdF90YiwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fZ290b190Yih1bnNpZ25lZCBpZHgpCit7CisgICAgLyogV2Ugb25seSBzdXBwb3J0IHR3byBjaGFpbmVkIGV4aXRzLiAgKi8KKyAgICB0Y2dfZGVidWdfYXNzZXJ0KGlkeCA8PSAxKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfVENHCisgICAgLyogVmVyaWZ5IHRoYXQgd2UgaGF2bid0IHNlZW4gdGhpcyBudW1iZXJlZCBleGl0IGJlZm9yZS4gICovCisgICAgdGNnX2RlYnVnX2Fzc2VydCgodGNnX2N0eC5nb3RvX3RiX2lzc3VlX21hc2sgJiAoMSA8PCBpZHgpKSA9PSAwKTsKKyAgICB0Y2dfY3R4LmdvdG9fdGJfaXNzdWVfbWFzayB8PSAxIDw8IGlkeDsKKyNlbmRpZgorICAgIHRjZ19nZW5fb3AxaShJTkRFWF9vcF9nb3RvX3RiLCBpZHgpOworfQorCisKK3ZvaWQgdGNnX2dlbl9xZW11X2xkX2kzMihUQ0d2X2kzMiwgVENHdiwgVENHQXJnLCBUQ0dNZW1PcCk7Cit2b2lkIHRjZ19nZW5fcWVtdV9zdF9pMzIoVENHdl9pMzIsIFRDR3YsIFRDR0FyZywgVENHTWVtT3ApOwordm9pZCB0Y2dfZ2VuX3FlbXVfbGRfaTY0KFRDR3ZfaTY0LCBUQ0d2LCBUQ0dBcmcsIFRDR01lbU9wKTsKK3ZvaWQgdGNnX2dlbl9xZW11X3N0X2k2NChUQ0d2X2k2NCwgVENHdiwgVENHQXJnLCBUQ0dNZW1PcCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3FlbXVfbGQ4dShUQ0d2IHJldCwgVENHdiBhZGRyLCBpbnQgbWVtX2luZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9sZF90bChyZXQsIGFkZHIsIG1lbV9pbmRleCwgTU9fVUIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X2xkOHMoVENHdiByZXQsIFRDR3YgYWRkciwgaW50IG1lbV9pbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfbGRfdGwocmV0LCBhZGRyLCBtZW1faW5kZXgsIE1PX1NCKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fcWVtdV9sZDE2dShUQ0d2IHJldCwgVENHdiBhZGRyLCBpbnQgbWVtX2luZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9sZF90bChyZXQsIGFkZHIsIG1lbV9pbmRleCwgTU9fVEVVVyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3FlbXVfbGQxNnMoVENHdiByZXQsIFRDR3YgYWRkciwgaW50IG1lbV9pbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfbGRfdGwocmV0LCBhZGRyLCBtZW1faW5kZXgsIE1PX1RFU1cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X2xkMzJ1KFRDR3YgcmV0LCBUQ0d2IGFkZHIsIGludCBtZW1faW5kZXgpCit7CisgICAgdGNnX2dlbl9xZW11X2xkX3RsKHJldCwgYWRkciwgbWVtX2luZGV4LCBNT19URVVMKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19nZW5fcWVtdV9sZDMycyhUQ0d2IHJldCwgVENHdiBhZGRyLCBpbnQgbWVtX2luZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9sZF90bChyZXQsIGFkZHIsIG1lbV9pbmRleCwgTU9fVEVTTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfZ2VuX3FlbXVfbGQ2NChUQ0d2X2k2NCByZXQsIFRDR3YgYWRkciwgaW50IG1lbV9pbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfbGRfaTY0KHJldCwgYWRkciwgbWVtX2luZGV4LCBNT19URVEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X3N0OChUQ0d2IGFyZywgVENHdiBhZGRyLCBpbnQgbWVtX2luZGV4KQoreworICAgIHRjZ19nZW5fcWVtdV9zdF90bChhcmcsIGFkZHIsIG1lbV9pbmRleCwgTU9fVUIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X3N0MTYoVENHdiBhcmcsIFRDR3YgYWRkciwgaW50IG1lbV9pbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfc3RfdGwoYXJnLCBhZGRyLCBtZW1faW5kZXgsIE1PX1RFVVcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X3N0MzIoVENHdiBhcmcsIFRDR3YgYWRkciwgaW50IG1lbV9pbmRleCkKK3sKKyAgICB0Y2dfZ2VuX3FlbXVfc3RfdGwoYXJnLCBhZGRyLCBtZW1faW5kZXgsIE1PX1RFVUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX2dlbl9xZW11X3N0NjQoVENHdl9pNjQgYXJnLCBUQ0d2IGFkZHIsIGludCBtZW1faW5kZXgpCit7CisgICAgdGNnX2dlbl9xZW11X3N0X2k2NChhcmcsIGFkZHIsIG1lbV9pbmRleCwgTU9fVEVRKTsKK30KKworI2lmIFRBUkdFVF9MT05HX0JJVFMgPT0gNjQKKyNkZWZpbmUgdGNnX2dlbl9tb3ZpX3RsIHRjZ19nZW5fbW92aV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9tb3ZfdGwgdGNnX2dlbl9tb3ZfaTY0CisjZGVmaW5lIHRjZ19nZW5fbGQ4dV90bCB0Y2dfZ2VuX2xkOHVfaTY0CisjZGVmaW5lIHRjZ19nZW5fbGQ4c190bCB0Y2dfZ2VuX2xkOHNfaTY0CisjZGVmaW5lIHRjZ19nZW5fbGQxNnVfdGwgdGNnX2dlbl9sZDE2dV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9sZDE2c190bCB0Y2dfZ2VuX2xkMTZzX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2xkMzJ1X3RsIHRjZ19nZW5fbGQzMnVfaTY0CisjZGVmaW5lIHRjZ19nZW5fbGQzMnNfdGwgdGNnX2dlbl9sZDMyc19pNjQKKyNkZWZpbmUgdGNnX2dlbl9sZF90bCB0Y2dfZ2VuX2xkX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3N0OF90bCB0Y2dfZ2VuX3N0OF9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zdDE2X3RsIHRjZ19nZW5fc3QxNl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zdDMyX3RsIHRjZ19nZW5fc3QzMl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zdF90bCB0Y2dfZ2VuX3N0X2k2NAorI2RlZmluZSB0Y2dfZ2VuX2FkZF90bCB0Y2dfZ2VuX2FkZF9pNjQKKyNkZWZpbmUgdGNnX2dlbl9hZGRpX3RsIHRjZ19nZW5fYWRkaV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zdWJfdGwgdGNnX2dlbl9zdWJfaTY0CisjZGVmaW5lIHRjZ19nZW5fbmVnX3RsIHRjZ19nZW5fbmVnX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3N1YmZpX3RsIHRjZ19nZW5fc3ViZmlfaTY0CisjZGVmaW5lIHRjZ19nZW5fc3ViaV90bCB0Y2dfZ2VuX3N1YmlfaTY0CisjZGVmaW5lIHRjZ19nZW5fYW5kX3RsIHRjZ19nZW5fYW5kX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2FuZGlfdGwgdGNnX2dlbl9hbmRpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX29yX3RsIHRjZ19nZW5fb3JfaTY0CisjZGVmaW5lIHRjZ19nZW5fb3JpX3RsIHRjZ19nZW5fb3JpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3hvcl90bCB0Y2dfZ2VuX3hvcl9pNjQKKyNkZWZpbmUgdGNnX2dlbl94b3JpX3RsIHRjZ19nZW5feG9yaV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9ub3RfdGwgdGNnX2dlbl9ub3RfaTY0CisjZGVmaW5lIHRjZ19nZW5fc2hsX3RsIHRjZ19nZW5fc2hsX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3NobGlfdGwgdGNnX2dlbl9zaGxpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3Nocl90bCB0Y2dfZ2VuX3Nocl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zaHJpX3RsIHRjZ19nZW5fc2hyaV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9zYXJfdGwgdGNnX2dlbl9zYXJfaTY0CisjZGVmaW5lIHRjZ19nZW5fc2FyaV90bCB0Y2dfZ2VuX3NhcmlfaTY0CisjZGVmaW5lIHRjZ19nZW5fYnJjb25kX3RsIHRjZ19nZW5fYnJjb25kX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2JyY29uZGlfdGwgdGNnX2dlbl9icmNvbmRpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3NldGNvbmRfdGwgdGNnX2dlbl9zZXRjb25kX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3NldGNvbmRpX3RsIHRjZ19nZW5fc2V0Y29uZGlfaTY0CisjZGVmaW5lIHRjZ19nZW5fbXVsX3RsIHRjZ19nZW5fbXVsX2k2NAorI2RlZmluZSB0Y2dfZ2VuX211bGlfdGwgdGNnX2dlbl9tdWxpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2Rpdl90bCB0Y2dfZ2VuX2Rpdl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9yZW1fdGwgdGNnX2dlbl9yZW1faTY0CisjZGVmaW5lIHRjZ19nZW5fZGl2dV90bCB0Y2dfZ2VuX2RpdnVfaTY0CisjZGVmaW5lIHRjZ19nZW5fcmVtdV90bCB0Y2dfZ2VuX3JlbXVfaTY0CisjZGVmaW5lIHRjZ19nZW5fZGlzY2FyZF90bCB0Y2dfZ2VuX2Rpc2NhcmRfaTY0CisjZGVmaW5lIHRjZ19nZW5fdHJ1bmNfdGxfaTMyIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMgorI2RlZmluZSB0Y2dfZ2VuX3RydW5jX2k2NF90bCB0Y2dfZ2VuX21vdl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9leHR1X2kzMl90bCB0Y2dfZ2VuX2V4dHVfaTMyX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dF9pMzJfdGwgdGNnX2dlbl9leHRfaTMyX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dHVfdGxfaTY0IHRjZ19nZW5fbW92X2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dF90bF9pNjQgdGNnX2dlbl9tb3ZfaTY0CisjZGVmaW5lIHRjZ19nZW5fZXh0OHVfdGwgdGNnX2dlbl9leHQ4dV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9leHQ4c190bCB0Y2dfZ2VuX2V4dDhzX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dDE2dV90bCB0Y2dfZ2VuX2V4dDE2dV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9leHQxNnNfdGwgdGNnX2dlbl9leHQxNnNfaTY0CisjZGVmaW5lIHRjZ19nZW5fZXh0MzJ1X3RsIHRjZ19nZW5fZXh0MzJ1X2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dDMyc190bCB0Y2dfZ2VuX2V4dDMyc19pNjQKKyNkZWZpbmUgdGNnX2dlbl9ic3dhcDE2X3RsIHRjZ19nZW5fYnN3YXAxNl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9ic3dhcDMyX3RsIHRjZ19nZW5fYnN3YXAzMl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9ic3dhcDY0X3RsIHRjZ19nZW5fYnN3YXA2NF9pNjQKKyNkZWZpbmUgdGNnX2dlbl9jb25jYXRfdGxfaTY0IHRjZ19nZW5fY29uY2F0MzJfaTY0CisjZGVmaW5lIHRjZ19nZW5fZXh0cl9pNjRfdGwgdGNnX2dlbl9leHRyMzJfaTY0CisjZGVmaW5lIHRjZ19nZW5fYW5kY190bCB0Y2dfZ2VuX2FuZGNfaTY0CisjZGVmaW5lIHRjZ19nZW5fZXF2X3RsIHRjZ19nZW5fZXF2X2k2NAorI2RlZmluZSB0Y2dfZ2VuX25hbmRfdGwgdGNnX2dlbl9uYW5kX2k2NAorI2RlZmluZSB0Y2dfZ2VuX25vcl90bCB0Y2dfZ2VuX25vcl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9vcmNfdGwgdGNnX2dlbl9vcmNfaTY0CisjZGVmaW5lIHRjZ19nZW5fcm90bF90bCB0Y2dfZ2VuX3JvdGxfaTY0CisjZGVmaW5lIHRjZ19nZW5fcm90bGlfdGwgdGNnX2dlbl9yb3RsaV9pNjQKKyNkZWZpbmUgdGNnX2dlbl9yb3RyX3RsIHRjZ19nZW5fcm90cl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9yb3RyaV90bCB0Y2dfZ2VuX3JvdHJpX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2RlcG9zaXRfdGwgdGNnX2dlbl9kZXBvc2l0X2k2NAorI2RlZmluZSB0Y2dfY29uc3RfdGwgdGNnX2NvbnN0X2k2NAorI2RlZmluZSB0Y2dfY29uc3RfbG9jYWxfdGwgdGNnX2NvbnN0X2xvY2FsX2k2NAorI2RlZmluZSB0Y2dfZ2VuX21vdmNvbmRfdGwgdGNnX2dlbl9tb3Zjb25kX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2FkZDJfdGwgdGNnX2dlbl9hZGQyX2k2NAorI2RlZmluZSB0Y2dfZ2VuX3N1YjJfdGwgdGNnX2dlbl9zdWIyX2k2NAorI2RlZmluZSB0Y2dfZ2VuX211bHUyX3RsIHRjZ19nZW5fbXVsdTJfaTY0CisjZGVmaW5lIHRjZ19nZW5fbXVsczJfdGwgdGNnX2dlbl9tdWxzMl9pNjQKKyNlbHNlCisjZGVmaW5lIHRjZ19nZW5fbW92aV90bCB0Y2dfZ2VuX21vdmlfaTMyCisjZGVmaW5lIHRjZ19nZW5fbW92X3RsIHRjZ19nZW5fbW92X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2xkOHVfdGwgdGNnX2dlbl9sZDh1X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2xkOHNfdGwgdGNnX2dlbl9sZDhzX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2xkMTZ1X3RsIHRjZ19nZW5fbGQxNnVfaTMyCisjZGVmaW5lIHRjZ19nZW5fbGQxNnNfdGwgdGNnX2dlbl9sZDE2c19pMzIKKyNkZWZpbmUgdGNnX2dlbl9sZDMydV90bCB0Y2dfZ2VuX2xkX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2xkMzJzX3RsIHRjZ19nZW5fbGRfaTMyCisjZGVmaW5lIHRjZ19nZW5fbGRfdGwgdGNnX2dlbl9sZF9pMzIKKyNkZWZpbmUgdGNnX2dlbl9zdDhfdGwgdGNnX2dlbl9zdDhfaTMyCisjZGVmaW5lIHRjZ19nZW5fc3QxNl90bCB0Y2dfZ2VuX3N0MTZfaTMyCisjZGVmaW5lIHRjZ19nZW5fc3QzMl90bCB0Y2dfZ2VuX3N0X2kzMgorI2RlZmluZSB0Y2dfZ2VuX3N0X3RsIHRjZ19nZW5fc3RfaTMyCisjZGVmaW5lIHRjZ19nZW5fYWRkX3RsIHRjZ19nZW5fYWRkX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2FkZGlfdGwgdGNnX2dlbl9hZGRpX2kzMgorI2RlZmluZSB0Y2dfZ2VuX3N1Yl90bCB0Y2dfZ2VuX3N1Yl9pMzIKKyNkZWZpbmUgdGNnX2dlbl9uZWdfdGwgdGNnX2dlbl9uZWdfaTMyCisjZGVmaW5lIHRjZ19nZW5fc3ViZmlfdGwgdGNnX2dlbl9zdWJmaV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9zdWJpX3RsIHRjZ19nZW5fc3ViaV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9hbmRfdGwgdGNnX2dlbl9hbmRfaTMyCisjZGVmaW5lIHRjZ19nZW5fYW5kaV90bCB0Y2dfZ2VuX2FuZGlfaTMyCisjZGVmaW5lIHRjZ19nZW5fb3JfdGwgdGNnX2dlbl9vcl9pMzIKKyNkZWZpbmUgdGNnX2dlbl9vcmlfdGwgdGNnX2dlbl9vcmlfaTMyCisjZGVmaW5lIHRjZ19nZW5feG9yX3RsIHRjZ19nZW5feG9yX2kzMgorI2RlZmluZSB0Y2dfZ2VuX3hvcmlfdGwgdGNnX2dlbl94b3JpX2kzMgorI2RlZmluZSB0Y2dfZ2VuX25vdF90bCB0Y2dfZ2VuX25vdF9pMzIKKyNkZWZpbmUgdGNnX2dlbl9zaGxfdGwgdGNnX2dlbl9zaGxfaTMyCisjZGVmaW5lIHRjZ19nZW5fc2hsaV90bCB0Y2dfZ2VuX3NobGlfaTMyCisjZGVmaW5lIHRjZ19nZW5fc2hyX3RsIHRjZ19nZW5fc2hyX2kzMgorI2RlZmluZSB0Y2dfZ2VuX3NocmlfdGwgdGNnX2dlbl9zaHJpX2kzMgorI2RlZmluZSB0Y2dfZ2VuX3Nhcl90bCB0Y2dfZ2VuX3Nhcl9pMzIKKyNkZWZpbmUgdGNnX2dlbl9zYXJpX3RsIHRjZ19nZW5fc2FyaV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9icmNvbmRfdGwgdGNnX2dlbl9icmNvbmRfaTMyCisjZGVmaW5lIHRjZ19nZW5fYnJjb25kaV90bCB0Y2dfZ2VuX2JyY29uZGlfaTMyCisjZGVmaW5lIHRjZ19nZW5fc2V0Y29uZF90bCB0Y2dfZ2VuX3NldGNvbmRfaTMyCisjZGVmaW5lIHRjZ19nZW5fc2V0Y29uZGlfdGwgdGNnX2dlbl9zZXRjb25kaV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9tdWxfdGwgdGNnX2dlbl9tdWxfaTMyCisjZGVmaW5lIHRjZ19nZW5fbXVsaV90bCB0Y2dfZ2VuX211bGlfaTMyCisjZGVmaW5lIHRjZ19nZW5fZGl2X3RsIHRjZ19nZW5fZGl2X2kzMgorI2RlZmluZSB0Y2dfZ2VuX3JlbV90bCB0Y2dfZ2VuX3JlbV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9kaXZ1X3RsIHRjZ19nZW5fZGl2dV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9yZW11X3RsIHRjZ19nZW5fcmVtdV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9kaXNjYXJkX3RsIHRjZ19nZW5fZGlzY2FyZF9pMzIKKyNkZWZpbmUgdGNnX2dlbl90cnVuY190bF9pMzIgdGNnX2dlbl9tb3ZfaTMyCisjZGVmaW5lIHRjZ19nZW5fdHJ1bmNfaTY0X3RsIHRjZ19nZW5fdHJ1bmNfaTY0X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2V4dHVfaTMyX3RsIHRjZ19nZW5fbW92X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2V4dF9pMzJfdGwgdGNnX2dlbl9tb3ZfaTMyCisjZGVmaW5lIHRjZ19nZW5fZXh0dV90bF9pNjQgdGNnX2dlbl9leHR1X2kzMl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9leHRfdGxfaTY0IHRjZ19nZW5fZXh0X2kzMl9pNjQKKyNkZWZpbmUgdGNnX2dlbl9leHQ4dV90bCB0Y2dfZ2VuX2V4dDh1X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2V4dDhzX3RsIHRjZ19nZW5fZXh0OHNfaTMyCisjZGVmaW5lIHRjZ19nZW5fZXh0MTZ1X3RsIHRjZ19nZW5fZXh0MTZ1X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2V4dDE2c190bCB0Y2dfZ2VuX2V4dDE2c19pMzIKKyNkZWZpbmUgdGNnX2dlbl9leHQzMnVfdGwgdGNnX2dlbl9tb3ZfaTMyCisjZGVmaW5lIHRjZ19nZW5fZXh0MzJzX3RsIHRjZ19nZW5fbW92X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2Jzd2FwMTZfdGwgdGNnX2dlbl9ic3dhcDE2X2kzMgorI2RlZmluZSB0Y2dfZ2VuX2Jzd2FwMzJfdGwgdGNnX2dlbl9ic3dhcDMyX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2NvbmNhdF90bF9pNjQgdGNnX2dlbl9jb25jYXRfaTMyX2k2NAorI2RlZmluZSB0Y2dfZ2VuX2V4dHJfdGxfaTY0IHRjZ19nZW5fZXh0cl9pMzJfaTY0CisjZGVmaW5lIHRjZ19nZW5fYW5kY190bCB0Y2dfZ2VuX2FuZGNfaTMyCisjZGVmaW5lIHRjZ19nZW5fZXF2X3RsIHRjZ19nZW5fZXF2X2kzMgorI2RlZmluZSB0Y2dfZ2VuX25hbmRfdGwgdGNnX2dlbl9uYW5kX2kzMgorI2RlZmluZSB0Y2dfZ2VuX25vcl90bCB0Y2dfZ2VuX25vcl9pMzIKKyNkZWZpbmUgdGNnX2dlbl9vcmNfdGwgdGNnX2dlbl9vcmNfaTMyCisjZGVmaW5lIHRjZ19nZW5fcm90bF90bCB0Y2dfZ2VuX3JvdGxfaTMyCisjZGVmaW5lIHRjZ19nZW5fcm90bGlfdGwgdGNnX2dlbl9yb3RsaV9pMzIKKyNkZWZpbmUgdGNnX2dlbl9yb3RyX3RsIHRjZ19nZW5fcm90cl9pMzIKKyNkZWZpbmUgdGNnX2dlbl9yb3RyaV90bCB0Y2dfZ2VuX3JvdHJpX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2RlcG9zaXRfdGwgdGNnX2dlbl9kZXBvc2l0X2kzMgorI2RlZmluZSB0Y2dfY29uc3RfdGwgdGNnX2NvbnN0X2kzMgorI2RlZmluZSB0Y2dfY29uc3RfbG9jYWxfdGwgdGNnX2NvbnN0X2xvY2FsX2kzMgorI2RlZmluZSB0Y2dfZ2VuX21vdmNvbmRfdGwgdGNnX2dlbl9tb3Zjb25kX2kzMgorI2RlZmluZSB0Y2dfZ2VuX2FkZDJfdGwgdGNnX2dlbl9hZGQyX2kzMgorI2RlZmluZSB0Y2dfZ2VuX3N1YjJfdGwgdGNnX2dlbl9zdWIyX2kzMgorI2RlZmluZSB0Y2dfZ2VuX211bHUyX3RsIHRjZ19nZW5fbXVsdTJfaTMyCisjZGVmaW5lIHRjZ19nZW5fbXVsczJfdGwgdGNnX2dlbl9tdWxzMl9pMzIKKyNlbmRpZgorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorIyBkZWZpbmUgdGNnX2dlbl9sZF9wdHIoUiwgQSwgTykgXAorICAgIHRjZ19nZW5fbGRfaTMyKFRDR1ZfUFRSX1RPX05BVChSKSwgKEEpLCAoTykpCisjIGRlZmluZSB0Y2dfZ2VuX2Rpc2NhcmRfcHRyKEEpIFwKKyAgICB0Y2dfZ2VuX2Rpc2NhcmRfaTMyKFRDR1ZfUFRSX1RPX05BVChBKSkKKyMgZGVmaW5lIHRjZ19nZW5fYWRkX3B0cihSLCBBLCBCKSBcCisgICAgdGNnX2dlbl9hZGRfaTMyKFRDR1ZfUFRSX1RPX05BVChSKSwgVENHVl9QVFJfVE9fTkFUKEEpLCBUQ0dWX1BUUl9UT19OQVQoQikpCisjIGRlZmluZSB0Y2dfZ2VuX2FkZGlfcHRyKFIsIEEsIEIpIFwKKyAgICB0Y2dfZ2VuX2FkZGlfaTMyKFRDR1ZfUFRSX1RPX05BVChSKSwgVENHVl9QVFJfVE9fTkFUKEEpLCAoQikpCisjIGRlZmluZSB0Y2dfZ2VuX2V4dF9pMzJfcHRyKFIsIEEpIFwKKyAgICB0Y2dfZ2VuX21vdl9pMzIoVENHVl9QVFJfVE9fTkFUKFIpLCAoQSkpCisjZWxzZQorIyBkZWZpbmUgdGNnX2dlbl9sZF9wdHIoUiwgQSwgTykgXAorICAgIHRjZ19nZW5fbGRfaTY0KFRDR1ZfUFRSX1RPX05BVChSKSwgKEEpLCAoTykpCisjIGRlZmluZSB0Y2dfZ2VuX2Rpc2NhcmRfcHRyKEEpIFwKKyAgICB0Y2dfZ2VuX2Rpc2NhcmRfaTY0KFRDR1ZfUFRSX1RPX05BVChBKSkKKyMgZGVmaW5lIHRjZ19nZW5fYWRkX3B0cihSLCBBLCBCKSBcCisgICAgdGNnX2dlbl9hZGRfaTY0KFRDR1ZfUFRSX1RPX05BVChSKSwgVENHVl9QVFJfVE9fTkFUKEEpLCBUQ0dWX1BUUl9UT19OQVQoQikpCisjIGRlZmluZSB0Y2dfZ2VuX2FkZGlfcHRyKFIsIEEsIEIpIFwKKyAgICB0Y2dfZ2VuX2FkZGlfaTY0KFRDR1ZfUFRSX1RPX05BVChSKSwgVENHVl9QVFJfVE9fTkFUKEEpLCAoQikpCisjIGRlZmluZSB0Y2dfZ2VuX2V4dF9pMzJfcHRyKFIsIEEpIFwKKyAgICB0Y2dfZ2VuX2V4dF9pMzJfaTY0KFRDR1ZfUFRSX1RPX05BVChSKSwgKEEpKQorI2VuZGlmIC8qIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGNnL3RjZy1vcGMuaCBiL2FuZHJvaWQvcWVtdTEvdGNnL3RjZy1vcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE3MDdkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvdGNnLW9wYy5oCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogVGlueSBDb2RlIEdlbmVyYXRvciBmb3IgUUVNVQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoKKyAqIERFRihuYW1lLCBvYXJncywgaWFyZ3MsIGNhcmdzLCBmbGFncykKKyAqLworCisvKiBwcmVkZWZpbmVkIG9wcyAqLworREVGKGVuZCwgMCwgMCwgMCwgVENHX09QRl9OT1RfUFJFU0VOVCkgLyogbXVzdCBiZSBrZXB0IGZpcnN0ICovCitERUYobm9wLCAwLCAwLCAwLCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorREVGKG5vcDEsIDAsIDAsIDEsIFRDR19PUEZfTk9UX1BSRVNFTlQpCitERUYobm9wMiwgMCwgMCwgMiwgVENHX09QRl9OT1RfUFJFU0VOVCkKK0RFRihub3AzLCAwLCAwLCAzLCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorCisvKiB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycyAqLworREVGKG5vcG4sIDAsIDAsIDEsIFRDR19PUEZfTk9UX1BSRVNFTlQpCisKK0RFRihkaXNjYXJkLCAxLCAwLCAwLCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorREVGKHNldF9sYWJlbCwgMCwgMCwgMSwgVENHX09QRl9CQl9FTkQgfCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorCisvKiB2YXJpYWJsZSBudW1iZXIgb2YgcGFyYW1ldGVycyAqLworREVGKGNhbGwsIDAsIDEsIDIsIFRDR19PUEZfQ0FMTF9DTE9CQkVSKQorCitERUYoYnIsIDAsIDAsIDEsIFRDR19PUEZfQkJfRU5EKQorCisjZGVmaW5lIElNUEwoWCkgKF9fYnVpbHRpbl9jb25zdGFudF9wKFgpICYmICEoWCkgPyBUQ0dfT1BGX05PVF9QUkVTRU5UIDogMCkKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisjIGRlZmluZSBJTVBMNjQgIFRDR19PUEZfNjRCSVQgfCBUQ0dfT1BGX05PVF9QUkVTRU5UCisjZWxzZQorIyBkZWZpbmUgSU1QTDY0ICBUQ0dfT1BGXzY0QklUCisjZW5kaWYKKworREVGKG1vdl9pMzIsIDEsIDEsIDAsIDApCitERUYobW92aV9pMzIsIDEsIDAsIDEsIDApCitERUYoc2V0Y29uZF9pMzIsIDEsIDIsIDEsIDApCitERUYobW92Y29uZF9pMzIsIDEsIDQsIDEsIElNUEwoVENHX1RBUkdFVF9IQVNfbW92Y29uZF9pMzIpKQorLyogbG9hZC9zdG9yZSAqLworREVGKGxkOHVfaTMyLCAxLCAxLCAxLCAwKQorREVGKGxkOHNfaTMyLCAxLCAxLCAxLCAwKQorREVGKGxkMTZ1X2kzMiwgMSwgMSwgMSwgMCkKK0RFRihsZDE2c19pMzIsIDEsIDEsIDEsIDApCitERUYobGRfaTMyLCAxLCAxLCAxLCAwKQorREVGKHN0OF9pMzIsIDAsIDIsIDEsIDApCitERUYoc3QxNl9pMzIsIDAsIDIsIDEsIDApCitERUYoc3RfaTMyLCAwLCAyLCAxLCAwKQorLyogYXJpdGggKi8KK0RFRihhZGRfaTMyLCAxLCAyLCAwLCAwKQorREVGKHN1Yl9pMzIsIDEsIDIsIDAsIDApCitERUYobXVsX2kzMiwgMSwgMiwgMCwgMCkKK0RFRihkaXZfaTMyLCAxLCAyLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2Rpdl9pMzIpKQorREVGKGRpdnVfaTMyLCAxLCAyLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2Rpdl9pMzIpKQorREVGKHJlbV9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfcmVtX2kzMikpCitERUYocmVtdV9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfcmVtX2kzMikpCitERUYoZGl2Ml9pMzIsIDIsIDMsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfZGl2Ml9pMzIpKQorREVGKGRpdnUyX2kzMiwgMiwgMywgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19kaXYyX2kzMikpCitERUYoYW5kX2kzMiwgMSwgMiwgMCwgMCkKK0RFRihvcl9pMzIsIDEsIDIsIDAsIDApCitERUYoeG9yX2kzMiwgMSwgMiwgMCwgMCkKKy8qIHNoaWZ0cy9yb3RhdGVzICovCitERUYoc2hsX2kzMiwgMSwgMiwgMCwgMCkKK0RFRihzaHJfaTMyLCAxLCAyLCAwLCAwKQorREVGKHNhcl9pMzIsIDEsIDIsIDAsIDApCitERUYocm90bF9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfcm90X2kzMikpCitERUYocm90cl9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfcm90X2kzMikpCitERUYoZGVwb3NpdF9pMzIsIDEsIDIsIDIsIElNUEwoVENHX1RBUkdFVF9IQVNfZGVwb3NpdF9pMzIpKQorCitERUYoYnJjb25kX2kzMiwgMCwgMiwgMiwgVENHX09QRl9CQl9FTkQpCisKK0RFRihhZGQyX2kzMiwgMiwgNCwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19hZGQyX2kzMikpCitERUYoc3ViMl9pMzIsIDIsIDQsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfc3ViMl9pMzIpKQorREVGKG11bHUyX2kzMiwgMiwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pMzIpKQorREVGKG11bHMyX2kzMiwgMiwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWxzMl9pMzIpKQorREVGKG11bHVoX2kzMiwgMSwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWx1aF9pMzIpKQorREVGKG11bHNoX2kzMiwgMSwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWxzaF9pMzIpKQorREVGKGJyY29uZDJfaTMyLCAwLCA0LCAyLCBUQ0dfT1BGX0JCX0VORCB8IElNUEwoVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMikpCitERUYoc2V0Y29uZDJfaTMyLCAxLCA0LCAxLCBJTVBMKFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIpKQorCitERUYoZXh0OHNfaTMyLCAxLCAxLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2V4dDhzX2kzMikpCitERUYoZXh0MTZzX2kzMiwgMSwgMSwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19leHQxNnNfaTMyKSkKK0RFRihleHQ4dV9pMzIsIDEsIDEsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfZXh0OHVfaTMyKSkKK0RFRihleHQxNnVfaTMyLCAxLCAxLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2V4dDE2dV9pMzIpKQorREVGKGJzd2FwMTZfaTMyLCAxLCAxLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2Jzd2FwMTZfaTMyKSkKK0RFRihic3dhcDMyX2kzMiwgMSwgMSwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19ic3dhcDMyX2kzMikpCitERUYobm90X2kzMiwgMSwgMSwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19ub3RfaTMyKSkKK0RFRihuZWdfaTMyLCAxLCAxLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX25lZ19pMzIpKQorREVGKGFuZGNfaTMyLCAxLCAyLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX2FuZGNfaTMyKSkKK0RFRihvcmNfaTMyLCAxLCAyLCAwLCBJTVBMKFRDR19UQVJHRVRfSEFTX29yY19pMzIpKQorREVGKGVxdl9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfZXF2X2kzMikpCitERUYobmFuZF9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfbmFuZF9pMzIpKQorREVGKG5vcl9pMzIsIDEsIDIsIDAsIElNUEwoVENHX1RBUkdFVF9IQVNfbm9yX2kzMikpCisKK0RFRihtb3ZfaTY0LCAxLCAxLCAwLCBJTVBMNjQpCitERUYobW92aV9pNjQsIDEsIDAsIDEsIElNUEw2NCkKK0RFRihzZXRjb25kX2k2NCwgMSwgMiwgMSwgSU1QTDY0KQorREVGKG1vdmNvbmRfaTY0LCAxLCA0LCAxLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX21vdmNvbmRfaTY0KSkKKy8qIGxvYWQvc3RvcmUgKi8KK0RFRihsZDh1X2k2NCwgMSwgMSwgMSwgSU1QTDY0KQorREVGKGxkOHNfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYobGQxNnVfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYobGQxNnNfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYobGQzMnVfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYobGQzMnNfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYobGRfaTY0LCAxLCAxLCAxLCBJTVBMNjQpCitERUYoc3Q4X2k2NCwgMCwgMiwgMSwgSU1QTDY0KQorREVGKHN0MTZfaTY0LCAwLCAyLCAxLCBJTVBMNjQpCitERUYoc3QzMl9pNjQsIDAsIDIsIDEsIElNUEw2NCkKK0RFRihzdF9pNjQsIDAsIDIsIDEsIElNUEw2NCkKKy8qIGFyaXRoICovCitERUYoYWRkX2k2NCwgMSwgMiwgMCwgSU1QTDY0KQorREVGKHN1Yl9pNjQsIDEsIDIsIDAsIElNUEw2NCkKK0RFRihtdWxfaTY0LCAxLCAyLCAwLCBJTVBMNjQpCitERUYoZGl2X2k2NCwgMSwgMiwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19kaXZfaTY0KSkKK0RFRihkaXZ1X2k2NCwgMSwgMiwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19kaXZfaTY0KSkKK0RFRihyZW1faTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX3JlbV9pNjQpKQorREVGKHJlbXVfaTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX3JlbV9pNjQpKQorREVGKGRpdjJfaTY0LCAyLCAzLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX2RpdjJfaTY0KSkKK0RFRihkaXZ1Ml9pNjQsIDIsIDMsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfZGl2Ml9pNjQpKQorREVGKGFuZF9pNjQsIDEsIDIsIDAsIElNUEw2NCkKK0RFRihvcl9pNjQsIDEsIDIsIDAsIElNUEw2NCkKK0RFRih4b3JfaTY0LCAxLCAyLCAwLCBJTVBMNjQpCisvKiBzaGlmdHMvcm90YXRlcyAqLworREVGKHNobF9pNjQsIDEsIDIsIDAsIElNUEw2NCkKK0RFRihzaHJfaTY0LCAxLCAyLCAwLCBJTVBMNjQpCitERUYoc2FyX2k2NCwgMSwgMiwgMCwgSU1QTDY0KQorREVGKHJvdGxfaTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX3JvdF9pNjQpKQorREVGKHJvdHJfaTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX3JvdF9pNjQpKQorREVGKGRlcG9zaXRfaTY0LCAxLCAyLCAyLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX2RlcG9zaXRfaTY0KSkKKworREVGKGJyY29uZF9pNjQsIDAsIDIsIDIsIFRDR19PUEZfQkJfRU5EIHwgSU1QTDY0KQorREVGKGV4dDhzX2k2NCwgMSwgMSwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19leHQ4c19pNjQpKQorREVGKGV4dDE2c19pNjQsIDEsIDEsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfZXh0MTZzX2k2NCkpCitERUYoZXh0MzJzX2k2NCwgMSwgMSwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19leHQzMnNfaTY0KSkKK0RFRihleHQ4dV9pNjQsIDEsIDEsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfZXh0OHVfaTY0KSkKK0RFRihleHQxNnVfaTY0LCAxLCAxLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX2V4dDE2dV9pNjQpKQorREVGKGV4dDMydV9pNjQsIDEsIDEsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfZXh0MzJ1X2k2NCkpCitERUYoYnN3YXAxNl9pNjQsIDEsIDEsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfYnN3YXAxNl9pNjQpKQorREVGKGJzd2FwMzJfaTY0LCAxLCAxLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX2Jzd2FwMzJfaTY0KSkKK0RFRihic3dhcDY0X2k2NCwgMSwgMSwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19ic3dhcDY0X2k2NCkpCitERUYobm90X2k2NCwgMSwgMSwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19ub3RfaTY0KSkKK0RFRihuZWdfaTY0LCAxLCAxLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX25lZ19pNjQpKQorREVGKGFuZGNfaTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX2FuZGNfaTY0KSkKK0RFRihvcmNfaTY0LCAxLCAyLCAwLCBJTVBMNjQgfCBJTVBMKFRDR19UQVJHRVRfSEFTX29yY19pNjQpKQorREVGKGVxdl9pNjQsIDEsIDIsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfZXF2X2k2NCkpCitERUYobmFuZF9pNjQsIDEsIDIsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfbmFuZF9pNjQpKQorREVGKG5vcl9pNjQsIDEsIDIsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfbm9yX2k2NCkpCisKK0RFRihhZGQyX2k2NCwgMiwgNCwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19hZGQyX2k2NCkpCitERUYoc3ViMl9pNjQsIDIsIDQsIDAsIElNUEw2NCB8IElNUEwoVENHX1RBUkdFVF9IQVNfc3ViMl9pNjQpKQorREVGKG11bHUyX2k2NCwgMiwgMiwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pNjQpKQorREVGKG11bHMyX2k2NCwgMiwgMiwgMCwgSU1QTDY0IHwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWxzMl9pNjQpKQorREVGKG11bHVoX2k2NCwgMSwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWx1aF9pNjQpKQorREVGKG11bHNoX2k2NCwgMSwgMiwgMCwgSU1QTChUQ0dfVEFSR0VUX0hBU19tdWxzaF9pNjQpKQorCisvKiBRRU1VIHNwZWNpZmljICovCisjaWYgVEFSR0VUX0xPTkdfQklUUyA+IFRDR19UQVJHRVRfUkVHX0JJVFMKK0RFRihkZWJ1Z19pbnNuX3N0YXJ0LCAwLCAwLCAyLCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorI2Vsc2UKK0RFRihkZWJ1Z19pbnNuX3N0YXJ0LCAwLCAwLCAxLCBUQ0dfT1BGX05PVF9QUkVTRU5UKQorI2VuZGlmCitERUYoZXhpdF90YiwgMCwgMCwgMSwgVENHX09QRl9CQl9FTkQpCitERUYoZ290b190YiwgMCwgMCwgMSwgVENHX09QRl9CQl9FTkQpCisKKyNkZWZpbmUgSU1QTF9ORVdfTERTVCBcCisgICAgKFRDR19PUEZfQ0FMTF9DTE9CQkVSIHwgVENHX09QRl9TSURFX0VGRkVDVFMgXAorICAgICB8IElNUEwoVENHX1RBUkdFVF9IQVNfbmV3X2xkc3QpKQorCisjaWYgVEFSR0VUX0xPTkdfQklUUyA8PSBUQ0dfVEFSR0VUX1JFR19CSVRTCitERUYocWVtdV9sZF9pMzIsIDEsIDEsIDIsIElNUExfTkVXX0xEU1QpCitERUYocWVtdV9zdF9pMzIsIDAsIDIsIDIsIElNUExfTkVXX0xEU1QpCisjIGlmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKK0RFRihxZW11X2xkX2k2NCwgMSwgMSwgMiwgSU1QTF9ORVdfTERTVCB8IFRDR19PUEZfNjRCSVQpCitERUYocWVtdV9zdF9pNjQsIDAsIDIsIDIsIElNUExfTkVXX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorIyBlbHNlCitERUYocWVtdV9sZF9pNjQsIDIsIDEsIDIsIElNUExfTkVXX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfc3RfaTY0LCAwLCAzLCAyLCBJTVBMX05FV19MRFNUIHwgVENHX09QRl82NEJJVCkKKyMgZW5kaWYKKyNlbHNlCitERUYocWVtdV9sZF9pMzIsIDEsIDIsIDIsIElNUExfTkVXX0xEU1QpCitERUYocWVtdV9zdF9pMzIsIDAsIDMsIDIsIElNUExfTkVXX0xEU1QpCitERUYocWVtdV9sZF9pNjQsIDIsIDIsIDIsIElNUExfTkVXX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfc3RfaTY0LCAwLCA0LCAyLCBJTVBMX05FV19MRFNUIHwgVENHX09QRl82NEJJVCkKKyNlbmRpZgorCisjdW5kZWYgSU1QTF9ORVdfTERTVAorCisjZGVmaW5lIElNUExfT0xEX0xEU1QgXAorICAgIChUQ0dfT1BGX0NBTExfQ0xPQkJFUiB8IFRDR19PUEZfU0lERV9FRkZFQ1RTIFwKKyAgICAgfCBJTVBMKCFUQ0dfVEFSR0VUX0hBU19uZXdfbGRzdCkpCisKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfbGQ4dSwgMSwgMSwgMSwgSU1QTF9PTERfTERTVCkKKyNlbHNlCitERUYocWVtdV9sZDh1LCAxLCAyLCAxLCBJTVBMX09MRF9MRFNUKQorI2VuZGlmCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfbGQ4cywgMSwgMSwgMSwgSU1QTF9PTERfTERTVCkKKyNlbHNlCitERUYocWVtdV9sZDhzLCAxLCAyLCAxLCBJTVBMX09MRF9MRFNUKQorI2VuZGlmCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfbGQxNnUsIDEsIDEsIDEsIElNUExfT0xEX0xEU1QpCisjZWxzZQorREVGKHFlbXVfbGQxNnUsIDEsIDIsIDEsIElNUExfT0xEX0xEU1QpCisjZW5kaWYKKyNpZiBUQVJHRVRfTE9OR19CSVRTID09IDMyCitERUYocWVtdV9sZDE2cywgMSwgMSwgMSwgSU1QTF9PTERfTERTVCkKKyNlbHNlCitERUYocWVtdV9sZDE2cywgMSwgMiwgMSwgSU1QTF9PTERfTERTVCkKKyNlbmRpZgorI2lmIFRBUkdFVF9MT05HX0JJVFMgPT0gMzIKK0RFRihxZW11X2xkMzIsIDEsIDEsIDEsIElNUExfT0xEX0xEU1QpCisjZWxzZQorREVGKHFlbXVfbGQzMiwgMSwgMiwgMSwgSU1QTF9PTERfTERTVCkKKyNlbmRpZgorI2lmIFRBUkdFVF9MT05HX0JJVFMgPT0gMzIKK0RFRihxZW11X2xkNjQsIDIsIDEsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorI2Vsc2UKK0RFRihxZW11X2xkNjQsIDIsIDIsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorI2VuZGlmCisKKyNpZiBUQVJHRVRfTE9OR19CSVRTID09IDMyCitERUYocWVtdV9zdDgsIDAsIDIsIDEsIElNUExfT0xEX0xEU1QpCisjZWxzZQorREVGKHFlbXVfc3Q4LCAwLCAzLCAxLCBJTVBMX09MRF9MRFNUKQorI2VuZGlmCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfc3QxNiwgMCwgMiwgMSwgSU1QTF9PTERfTERTVCkKKyNlbHNlCitERUYocWVtdV9zdDE2LCAwLCAzLCAxLCBJTVBMX09MRF9MRFNUKQorI2VuZGlmCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfc3QzMiwgMCwgMiwgMSwgSU1QTF9PTERfTERTVCkKKyNlbHNlCitERUYocWVtdV9zdDMyLCAwLCAzLCAxLCBJTVBMX09MRF9MRFNUKQorI2VuZGlmCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgorREVGKHFlbXVfc3Q2NCwgMCwgMywgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCisjZWxzZQorREVGKHFlbXVfc3Q2NCwgMCwgNCwgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCisjZW5kaWYKKworI2Vsc2UgLyogVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMiAqLworCitERUYocWVtdV9sZDh1LCAxLCAxLCAxLCBJTVBMX09MRF9MRFNUIHwgVENHX09QRl82NEJJVCkKK0RFRihxZW11X2xkOHMsIDEsIDEsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfbGQxNnUsIDEsIDEsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfbGQxNnMsIDEsIDEsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfbGQzMiwgMSwgMSwgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCitERUYocWVtdV9sZDMydSwgMSwgMSwgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCitERUYocWVtdV9sZDMycywgMSwgMSwgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCitERUYocWVtdV9sZDY0LCAxLCAxLCAxLCBJTVBMX09MRF9MRFNUIHwgVENHX09QRl82NEJJVCkKKworREVGKHFlbXVfc3Q4LCAwLCAyLCAxLCBJTVBMX09MRF9MRFNUIHwgVENHX09QRl82NEJJVCkKK0RFRihxZW11X3N0MTYsIDAsIDIsIDEsIElNUExfT0xEX0xEU1QgfCBUQ0dfT1BGXzY0QklUKQorREVGKHFlbXVfc3QzMiwgMCwgMiwgMSwgSU1QTF9PTERfTERTVCB8IFRDR19PUEZfNjRCSVQpCitERUYocWVtdV9zdDY0LCAwLCAyLCAxLCBJTVBMX09MRF9MRFNUIHwgVENHX09QRl82NEJJVCkKKworI2VuZGlmIC8qIFRDR19UQVJHRVRfUkVHX0JJVFMgIT0gMzIgKi8KKworI3VuZGVmIElNUExfT0xEX0xEU1QKKworI3VuZGVmIElNUEwKKyN1bmRlZiBJTVBMNjQKKyN1bmRlZiBERUYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdGNnL3RjZy1ydW50aW1lLmggYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctcnVudGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWJlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2ctcnVudGltZS5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpZm5kZWYgVENHX1JVTlRJTUVfSAorI2RlZmluZSBUQ0dfUlVOVElNRV9ICisKKy8qIHRjZy1ydW50aW1lLmMgKi8KK2ludDMyX3QgdGNnX2hlbHBlcl9kaXZfaTMyKGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKK2ludDMyX3QgdGNnX2hlbHBlcl9yZW1faTMyKGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKK3VpbnQzMl90IHRjZ19oZWxwZXJfZGl2dV9pMzIodWludDMyX3QgYXJnMSwgdWludDMyX3QgYXJnMik7Cit1aW50MzJfdCB0Y2dfaGVscGVyX3JlbXVfaTMyKHVpbnQzMl90IGFyZzEsIHVpbnQzMl90IGFyZzIpOworCitpbnQ2NF90IHRjZ19oZWxwZXJfc2hsX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMik7CitpbnQ2NF90IHRjZ19oZWxwZXJfc2hyX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMik7CitpbnQ2NF90IHRjZ19oZWxwZXJfc2FyX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMik7CitpbnQ2NF90IHRjZ19oZWxwZXJfZGl2X2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMik7CitpbnQ2NF90IHRjZ19oZWxwZXJfcmVtX2k2NChpbnQ2NF90IGFyZzEsIGludDY0X3QgYXJnMik7CitpbnQ2NF90IHRjZ19oZWxwZXJfbXVsc2hfaTY0KGludDY0X3QgYXJnMSwgaW50NjRfdCBhcmcyKTsKK3VpbnQ2NF90IHRjZ19oZWxwZXJfZGl2dV9pNjQodWludDY0X3QgYXJnMSwgdWludDY0X3QgYXJnMik7Cit1aW50NjRfdCB0Y2dfaGVscGVyX3JlbXVfaTY0KHVpbnQ2NF90IGFyZzEsIHVpbnQ2NF90IGFyZzIpOwordWludDY0X3QgdGNnX2hlbHBlcl9tdWx1aF9pNjQodWludDY0X3QgYXJnMSwgdWludDY0X3QgYXJnMik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90Y2cvdGNnLmMgYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUwNzYzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvdGNnLmMKQEAgLTAsMCArMSwyOTMzIEBACisvKgorICogVGlueSBDb2RlIEdlbmVyYXRvciBmb3IgUUVNVQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyogZGVmaW5lIGl0IHRvIHVzZSBsaXZlbmVzcyBhbmFseXNpcyAoYmV0dGVyIGNvZGUpICovCisjZGVmaW5lIFVTRV9MSVZFTkVTU19BTkFMWVNJUworI2RlZmluZSBVU0VfVENHX09QVElNSVpBVElPTlMKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisvKiBEZWZpbmUgdG8ganVtcCB0aGUgRUxGIGZpbGUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIEdEQi4gICovCisjdW5kZWYgREVCVUdfSklUCisKKyNpZiAhZGVmaW5lZChDT05GSUdfREVCVUdfVENHKSAmJiAhZGVmaW5lZChOREVCVUcpCisvKiBkZWZpbmUgaXQgdG8gc3VwcHJlc3MgdmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKGZhc3RlcikgKi8KKyNkZWZpbmUgTkRFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9jYWNoZS11dGlscy5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKworLyogTm90ZTogdGhlIGxvbmcgdGVybSBwbGFuIGlzIHRvIHJlZHVjZSB0aGUgZGVwZW5kZW5jaWVzIG9uIHRoZSBRRU1VCisgICBDUFUgZGVmaW5pdGlvbnMuIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIGZvciBxZW11X2xkL3N0CisgICBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgTk9fQ1BVX0lPX0RFRlMKKyNpbmNsdWRlICJjcHUuaCIKKworI2luY2x1ZGUgInRjZy1vcC5oIgorCisjaWYgVUlOVFBUUl9NQVggPT0gVUlOVDMyX01BWAorIyBkZWZpbmUgRUxGX0NMQVNTICBFTEZDTEFTUzMyCisjZWxzZQorIyBkZWZpbmUgRUxGX0NMQVNTICBFTEZDTEFTUzY0CisjZW5kaWYKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorIyBkZWZpbmUgRUxGX0RBVEEgICBFTEZEQVRBMk1TQgorI2Vsc2UKKyMgZGVmaW5lIEVMRl9EQVRBICAgRUxGREFUQTJMU0IKKyNlbmRpZgorCisjaW5jbHVkZSAiZWxmLmgiCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gdGNnLXRhcmdldC5jIGFuZCB1c2VkIGhlcmUuICovCitzdGF0aWMgdm9pZCB0Y2dfdGFyZ2V0X2luaXQoVENHQ29udGV4dCAqcyk7CitzdGF0aWMgdm9pZCB0Y2dfdGFyZ2V0X3FlbXVfcHJvbG9ndWUoVENHQ29udGV4dCAqcyk7CitzdGF0aWMgdm9pZCBwYXRjaF9yZWxvYyh1aW50OF90ICpjb2RlX3B0ciwgaW50IHR5cGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdmFsdWUsIGludHB0cl90IGFkZGVuZCk7CisKKy8qIFRoZSBDSUUgYW5kIEZERSBoZWFkZXIgZGVmaW5pdGlvbnMgd2lsbCBiZSBjb21tb24gdG8gYWxsIGhvc3RzLiAgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBsZW4gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgoc2l6ZW9mKHZvaWQgKikpKSkpOworICAgIHVpbnQzMl90IGlkOworICAgIHVpbnQ4X3QgdmVyc2lvbjsKKyAgICBjaGFyIGF1Z21lbnRhdGlvblsxXTsKKyAgICB1aW50OF90IGNvZGVfYWxpZ247CisgICAgdWludDhfdCBkYXRhX2FsaWduOworICAgIHVpbnQ4X3QgcmV0dXJuX2NvbHVtbjsKK30gRGVidWdGcmFtZUNJRTsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVV9QQUNLRUQgeworICAgIHVpbnQzMl90IGxlbiBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKChzaXplb2Yodm9pZCAqKSkpKSk7CisgICAgdWludDMyX3QgY2llX29mZnNldDsKKyAgICB1aW50cHRyX3QgZnVuY19zdGFydDsKKyAgICB1aW50cHRyX3QgZnVuY19sZW47Cit9IERlYnVnRnJhbWVGREVIZWFkZXI7CisKK3N0YXRpYyB2b2lkIHRjZ19yZWdpc3Rlcl9qaXRfaW50KHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkZWJ1Z19mcmFtZSwgc2l6ZV90IGRlYnVnX2ZyYW1lX3NpemUpCisgICAgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgZGVjbGFyZWQgYW5kIHVzZWQgaW4gdGNnLXRhcmdldC5jLiAqLworc3RhdGljIGludCB0YXJnZXRfcGFyc2VfY29uc3RyYWludChUQ0dBcmdDb25zdHJhaW50ICpjdCwgY29uc3QgY2hhciAqKnBjdF9zdHIpOworc3RhdGljIHZvaWQgdGNnX291dF9sZChUQ0dDb250ZXh0ICpzLCBUQ0dUeXBlIHR5cGUsIFRDR1JlZyByZXQsIFRDR1JlZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBhcmcyKTsKK3N0YXRpYyB2b2lkIHRjZ19vdXRfbW92KFRDR0NvbnRleHQgKnMsIFRDR1R5cGUgdHlwZSwgVENHUmVnIHJldCwgVENHUmVnIGFyZyk7CitzdGF0aWMgdm9pZCB0Y2dfb3V0X21vdmkoVENHQ29udGV4dCAqcywgVENHVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRDR1JlZyByZXQsIHRjZ190YXJnZXRfbG9uZyBhcmcpOworc3RhdGljIHZvaWQgdGNnX291dF9vcChUQ0dDb250ZXh0ICpzLCBUQ0dPcGNvZGUgb3BjLCBjb25zdCBUQ0dBcmcgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqY29uc3RfYXJncyk7CitzdGF0aWMgdm9pZCB0Y2dfb3V0X3N0KFRDR0NvbnRleHQgKnMsIFRDR1R5cGUgdHlwZSwgVENHUmVnIGFyZywgVENHUmVnIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGFyZzIpOworc3RhdGljIGludCB0Y2dfdGFyZ2V0X2NvbnN0X21hdGNoKHRjZ190YXJnZXRfbG9uZyB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVENHQXJnQ29uc3RyYWludCAqYXJnX2N0KTsKK3N0YXRpYyB2b2lkIHRjZ19vdXRfdGJfaW5pdChUQ0dDb250ZXh0ICpzKTsKK3N0YXRpYyB2b2lkIHRjZ19vdXRfdGJfZmluYWxpemUoVENHQ29udGV4dCAqcyk7CisKKworVENHT3BEZWYgdGNnX29wX2RlZnNbXSA9IHsKKyNkZWZpbmUgREVGKHMsIG9hcmdzLCBpYXJncywgY2FyZ3MsIGZsYWdzKSB7ICNzLCBvYXJncywgaWFyZ3MsIGNhcmdzLCBpYXJncyArIG9hcmdzICsgY2FyZ3MsIGZsYWdzIH0sCisjaW5jbHVkZSAidGNnLW9wYy5oIgorI3VuZGVmIERFRgorfTsKK2NvbnN0IHNpemVfdCB0Y2dfb3BfZGVmc19tYXggPSBBUlJBWV9TSVpFKHRjZ19vcF9kZWZzKTsKKworc3RhdGljIFRDR1JlZ1NldCB0Y2dfdGFyZ2V0X2F2YWlsYWJsZV9yZWdzWzJdOworc3RhdGljIFRDR1JlZ1NldCB0Y2dfdGFyZ2V0X2NhbGxfY2xvYmJlcl9yZWdzOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX291dDgoVENHQ29udGV4dCAqcywgdWludDhfdCB2KQoreworICAgICpzLT5jb2RlX3B0cisrID0gdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXQxNihUQ0dDb250ZXh0ICpzLCB1aW50MTZfdCB2KQoreworICAgIHVpbnQ4X3QgKnAgPSBzLT5jb2RlX3B0cjsKKyAgICAqKHVpbnQxNl90ICopcCA9IHY7CisgICAgcy0+Y29kZV9wdHIgPSBwICsgMjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXQzMihUQ0dDb250ZXh0ICpzLCB1aW50MzJfdCB2KQoreworICAgIHVpbnQ4X3QgKnAgPSBzLT5jb2RlX3B0cjsKKyAgICAqKHVpbnQzMl90ICopcCA9IHY7CisgICAgcy0+Y29kZV9wdHIgPSBwICsgNDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRjZ19vdXQ2NChUQ0dDb250ZXh0ICpzLCB1aW50NjRfdCB2KQoreworICAgIHVpbnQ4X3QgKnAgPSBzLT5jb2RlX3B0cjsKKyAgICAqKHVpbnQ2NF90ICopcCA9IHY7CisgICAgcy0+Y29kZV9wdHIgPSBwICsgODsKK30KKworLyogbGFiZWwgcmVsb2NhdGlvbiBwcm9jZXNzaW5nICovCisKK3N0YXRpYyB2b2lkIHRjZ19vdXRfcmVsb2MoVENHQ29udGV4dCAqcywgdWludDhfdCAqY29kZV9wdHIsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFiZWxfaW5kZXgsIGludHB0cl90IGFkZGVuZCkKK3sKKyAgICBUQ0dMYWJlbCAqbDsKKyAgICBUQ0dSZWxvY2F0aW9uICpyOworCisgICAgbCA9ICZzLT5sYWJlbHNbbGFiZWxfaW5kZXhdOworICAgIGlmIChsLT5oYXNfdmFsdWUpIHsKKyAgICAgICAgLyogRklYTUU6IFRoaXMgbWF5IGJyZWFrIHJlbG9jYXRpb25zIG9uIFJJU0MgdGFyZ2V0cyB0aGF0CisgICAgICAgICAgIG1vZGlmeSBpbnN0cnVjdGlvbiBmaWVsZHMgaW4gcGxhY2UuICBUaGUgY2FsbGVyIG1heSBub3QgaGF2ZSAKKyAgICAgICAgICAgd3JpdHRlbiB0aGUgaW5pdGlhbCB2YWx1ZS4gICovCisgICAgICAgIHBhdGNoX3JlbG9jKGNvZGVfcHRyLCB0eXBlLCBsLT51LnZhbHVlLCBhZGRlbmQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFkZCBhIG5ldyByZWxvY2F0aW9uIGVudHJ5ICovCisgICAgICAgIHIgPSB0Y2dfbWFsbG9jKHNpemVvZihUQ0dSZWxvY2F0aW9uKSk7CisgICAgICAgIHItPnR5cGUgPSB0eXBlOworICAgICAgICByLT5wdHIgPSBjb2RlX3B0cjsKKyAgICAgICAgci0+YWRkZW5kID0gYWRkZW5kOworICAgICAgICByLT5uZXh0ID0gbC0+dS5maXJzdF9yZWxvYzsKKyAgICAgICAgbC0+dS5maXJzdF9yZWxvYyA9IHI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0Y2dfb3V0X2xhYmVsKFRDR0NvbnRleHQgKnMsIGludCBsYWJlbF9pbmRleCwgdm9pZCAqcHRyKQoreworICAgIFRDR0xhYmVsICpsOworICAgIFRDR1JlbG9jYXRpb24gKnI7CisgICAgaW50cHRyX3QgdmFsdWUgPSAoaW50cHRyX3QpcHRyOworCisgICAgbCA9ICZzLT5sYWJlbHNbbGFiZWxfaW5kZXhdOworICAgIGlmIChsLT5oYXNfdmFsdWUpIHsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorICAgIHIgPSBsLT51LmZpcnN0X3JlbG9jOworICAgIHdoaWxlIChyICE9IE5VTEwpIHsKKyAgICAgICAgcGF0Y2hfcmVsb2Moci0+cHRyLCByLT50eXBlLCB2YWx1ZSwgci0+YWRkZW5kKTsKKyAgICAgICAgciA9IHItPm5leHQ7CisgICAgfQorICAgIGwtPmhhc192YWx1ZSA9IDE7CisgICAgbC0+dS52YWx1ZSA9IHZhbHVlOworfQorCitpbnQgZ2VuX25ld19sYWJlbCh2b2lkKQoreworICAgIFRDR0NvbnRleHQgKnMgPSAmdGNnX2N0eDsKKyAgICBpbnQgaWR4OworICAgIFRDR0xhYmVsICpsOworCisgICAgaWYgKHMtPm5iX2xhYmVscyA+PSBUQ0dfTUFYX0xBQkVMUykKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgaWR4ID0gcy0+bmJfbGFiZWxzKys7CisgICAgbCA9ICZzLT5sYWJlbHNbaWR4XTsKKyAgICBsLT5oYXNfdmFsdWUgPSAwOworICAgIGwtPnUuZmlyc3RfcmVsb2MgPSBOVUxMOworICAgIHJldHVybiBpZHg7Cit9CisKKyNpbmNsdWRlICJ0Y2ctdGFyZ2V0LmMiCisKKy8qIHBvb2wgYmFzZWQgbWVtb3J5IGFsbG9jYXRpb24gKi8KK3ZvaWQgKnRjZ19tYWxsb2NfaW50ZXJuYWwoVENHQ29udGV4dCAqcywgaW50IHNpemUpCit7CisgICAgVENHUG9vbCAqcDsKKyAgICBpbnQgcG9vbF9zaXplOworICAgIAorICAgIGlmIChzaXplID4gVENHX1BPT0xfQ0hVTktfU0laRSkgeworICAgICAgICAvKiBiaWcgbWFsbG9jOiBpbnNlcnQgYSBuZXcgcG9vbCAoWFhYOiBjb3VsZCBvcHRpbWl6ZSkgKi8KKyAgICAgICAgcCA9IGdfbWFsbG9jKHNpemVvZihUQ0dQb29sKSArIHNpemUpOworICAgICAgICBwLT5zaXplID0gc2l6ZTsKKyAgICAgICAgcC0+bmV4dCA9IHMtPnBvb2xfZmlyc3RfbGFyZ2U7CisgICAgICAgIHMtPnBvb2xfZmlyc3RfbGFyZ2UgPSBwOworICAgICAgICByZXR1cm4gcC0+ZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBwID0gcy0+cG9vbF9jdXJyZW50OworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIHAgPSBzLT5wb29sX2ZpcnN0OworICAgICAgICAgICAgaWYgKCFwKQorICAgICAgICAgICAgICAgIGdvdG8gbmV3X3Bvb2w7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXAtPm5leHQpIHsKKyAgICAgICAgICAgIG5ld19wb29sOgorICAgICAgICAgICAgICAgIHBvb2xfc2l6ZSA9IFRDR19QT09MX0NIVU5LX1NJWkU7CisgICAgICAgICAgICAgICAgcCA9IGdfbWFsbG9jKHNpemVvZihUQ0dQb29sKSArIHBvb2xfc2l6ZSk7CisgICAgICAgICAgICAgICAgcC0+c2l6ZSA9IHBvb2xfc2l6ZTsKKyAgICAgICAgICAgICAgICBwLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAocy0+cG9vbF9jdXJyZW50KSAKKyAgICAgICAgICAgICAgICAgICAgcy0+cG9vbF9jdXJyZW50LT5uZXh0ID0gcDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPnBvb2xfZmlyc3QgPSBwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwID0gcC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5wb29sX2N1cnJlbnQgPSBwOworICAgIHMtPnBvb2xfY3VyID0gcC0+ZGF0YSArIHNpemU7CisgICAgcy0+cG9vbF9lbmQgPSBwLT5kYXRhICsgcC0+c2l6ZTsKKyAgICByZXR1cm4gcC0+ZGF0YTsKK30KKwordm9pZCB0Y2dfcG9vbF9yZXNldChUQ0dDb250ZXh0ICpzKQoreworICAgIFRDR1Bvb2wgKnAsICp0OworICAgIGZvciAocCA9IHMtPnBvb2xfZmlyc3RfbGFyZ2U7IHA7IHAgPSB0KSB7CisgICAgICAgIHQgPSBwLT5uZXh0OworICAgICAgICBnX2ZyZWUocCk7CisgICAgfQorICAgIHMtPnBvb2xfZmlyc3RfbGFyZ2UgPSBOVUxMOworICAgIHMtPnBvb2xfY3VyID0gcy0+cG9vbF9lbmQgPSBOVUxMOworICAgIHMtPnBvb2xfY3VycmVudCA9IE5VTEw7Cit9CisKKyNpbmNsdWRlICJoZWxwZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVENHSGVscGVySW5mbyB7CisgICAgdm9pZCAqZnVuYzsKKyAgICBjb25zdCBjaGFyICpuYW1lOworfSBUQ0dIZWxwZXJJbmZvOworCitzdGF0aWMgY29uc3QgVENHSGVscGVySW5mbyBhbGxfaGVscGVyc1tdID0geworI2RlZmluZSBHRU5fSEVMUEVSIDIKKyNpbmNsdWRlICJoZWxwZXIuaCIKKworICAgIC8qIEluY2x1ZGUgdGNnLXJ1bnRpbWUuYyBmdW5jdGlvbnMuICAqLworICAgIHsgdGNnX2hlbHBlcl9kaXZfaTMyLCAiZGl2X2kzMiIgfSwKKyAgICB7IHRjZ19oZWxwZXJfcmVtX2kzMiwgInJlbV9pMzIiIH0sCisgICAgeyB0Y2dfaGVscGVyX2RpdnVfaTMyLCAiZGl2dV9pMzIiIH0sCisgICAgeyB0Y2dfaGVscGVyX3JlbXVfaTMyLCAicmVtdV9pMzIiIH0sCisKKyAgICB7IHRjZ19oZWxwZXJfc2hsX2k2NCwgInNobF9pNjQiIH0sCisgICAgeyB0Y2dfaGVscGVyX3Nocl9pNjQsICJzaHJfaTY0IiB9LAorICAgIHsgdGNnX2hlbHBlcl9zYXJfaTY0LCAic2FyX2k2NCIgfSwKKyAgICB7IHRjZ19oZWxwZXJfZGl2X2k2NCwgImRpdl9pNjQiIH0sCisgICAgeyB0Y2dfaGVscGVyX3JlbV9pNjQsICJyZW1faTY0IiB9LAorICAgIHsgdGNnX2hlbHBlcl9kaXZ1X2k2NCwgImRpdnVfaTY0IiB9LAorICAgIHsgdGNnX2hlbHBlcl9yZW11X2k2NCwgInJlbXVfaTY0IiB9LAorICAgIHsgdGNnX2hlbHBlcl9tdWxzaF9pNjQsICJtdWxzaF9pNjQiIH0sCisgICAgeyB0Y2dfaGVscGVyX211bHVoX2k2NCwgIm11bHVoX2k2NCIgfSwKK307CisKK3ZvaWQgdGNnX2NvbnRleHRfaW5pdChUQ0dDb250ZXh0ICpzKQoreworICAgIGludCBvcCwgdG90YWxfYXJncywgbiwgaTsKKyAgICBUQ0dPcERlZiAqZGVmOworICAgIFRDR0FyZ0NvbnN0cmFpbnQgKmFyZ3NfY3Q7CisgICAgaW50ICpzb3J0ZWRfYXJnczsKKyAgICBHSGFzaFRhYmxlICpoZWxwZXJfdGFibGU7CisKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisgICAgcy0+bmJfZ2xvYmFscyA9IDA7CisgICAgCisgICAgLyogQ291bnQgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBhbmQgYWxsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICBzcGFjZSAqLworICAgIHRvdGFsX2FyZ3MgPSAwOworICAgIGZvcihvcCA9IDA7IG9wIDwgTkJfT1BTOyBvcCsrKSB7CisgICAgICAgIGRlZiA9ICZ0Y2dfb3BfZGVmc1tvcF07CisgICAgICAgIG4gPSBkZWYtPm5iX2lhcmdzICsgZGVmLT5uYl9vYXJnczsKKyAgICAgICAgdG90YWxfYXJncyArPSBuOworICAgIH0KKworICAgIGFyZ3NfY3QgPSBnX21hbGxvYyhzaXplb2YoVENHQXJnQ29uc3RyYWludCkgKiB0b3RhbF9hcmdzKTsKKyAgICBzb3J0ZWRfYXJncyA9IGdfbWFsbG9jKHNpemVvZihpbnQpICogdG90YWxfYXJncyk7CisKKyAgICBmb3Iob3AgPSAwOyBvcCA8IE5CX09QUzsgb3ArKykgeworICAgICAgICBkZWYgPSAmdGNnX29wX2RlZnNbb3BdOworICAgICAgICBkZWYtPmFyZ3NfY3QgPSBhcmdzX2N0OworICAgICAgICBkZWYtPnNvcnRlZF9hcmdzID0gc29ydGVkX2FyZ3M7CisgICAgICAgIG4gPSBkZWYtPm5iX2lhcmdzICsgZGVmLT5uYl9vYXJnczsKKyAgICAgICAgc29ydGVkX2FyZ3MgKz0gbjsKKyAgICAgICAgYXJnc19jdCArPSBuOworICAgIH0KKworICAgIC8qIFJlZ2lzdGVyIGhlbHBlcnMuICAqLworICAgIC8qIFVzZSBnX2RpcmVjdF9oYXNoL2VxdWFsIGZvciBkaXJlY3QgcG9pbnRlciBjb21wYXJpc29ucyBvbiBmdW5jLiAgKi8KKyAgICBzLT5oZWxwZXJzID0gaGVscGVyX3RhYmxlID0gZ19oYXNoX3RhYmxlX25ldyhOVUxMLCBOVUxMKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFsbF9oZWxwZXJzKTsgKytpKSB7CisgICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQoaGVscGVyX3RhYmxlLCAoZ3BvaW50ZXIpYWxsX2hlbHBlcnNbaV0uZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYWxsX2hlbHBlcnNbaV0ubmFtZSk7CisgICAgfQorCisgICAgdGNnX3RhcmdldF9pbml0KHMpOworfQorCit2b2lkIHRjZ19wcm9sb2d1ZV9pbml0KFRDR0NvbnRleHQgKnMpCit7CisgICAgLyogaW5pdCBnbG9iYWwgcHJvbG9ndWUgYW5kIGVwaWxvZ3VlICovCisgICAgcy0+Y29kZV9idWYgPSBzLT5jb2RlX2dlbl9wcm9sb2d1ZTsKKyAgICBzLT5jb2RlX3B0ciA9IHMtPmNvZGVfYnVmOworICAgIHRjZ190YXJnZXRfcWVtdV9wcm9sb2d1ZShzKTsKKyAgICBmbHVzaF9pY2FjaGVfcmFuZ2UoKHVpbnRwdHJfdClzLT5jb2RlX2J1ZiwgKHVpbnRwdHJfdClzLT5jb2RlX3B0cik7CisKKyNpZmRlZiBERUJVR19ESVNBUworICAgIGlmIChxZW11X2xvZ2xldmVsX21hc2soQ1BVX0xPR19UQl9PVVRfQVNNKSkgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IHMtPmNvZGVfcHRyIC0gcy0+Y29kZV9idWY7CisgICAgICAgIHFlbXVfbG9nKCJQUk9MT0dVRTogW3NpemU9JXp1XVxuIiwgc2l6ZSk7CisgICAgICAgIGxvZ19kaXNhcyhzLT5jb2RlX2J1Ziwgc2l6ZSk7CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworICAgICAgICBxZW11X2xvZ19mbHVzaCgpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIHRjZ19zZXRfZnJhbWUoVENHQ29udGV4dCAqcywgaW50IHJlZywgaW50cHRyX3Qgc3RhcnQsIGludHB0cl90IHNpemUpCit7CisgICAgcy0+ZnJhbWVfc3RhcnQgPSBzdGFydDsKKyAgICBzLT5mcmFtZV9lbmQgPSBzdGFydCArIHNpemU7CisgICAgcy0+ZnJhbWVfcmVnID0gcmVnOworfQorCit2b2lkIHRjZ19mdW5jX3N0YXJ0KFRDR0NvbnRleHQgKnMpCit7CisgICAgdGNnX3Bvb2xfcmVzZXQocyk7CisgICAgcy0+bmJfdGVtcHMgPSBzLT5uYl9nbG9iYWxzOworCisgICAgLyogTm8gdGVtcHMgaGF2ZSBiZWVuIHByZXZpb3VzbHkgYWxsb2NhdGVkIGZvciBzaXplIG9yIGxvY2FsaXR5LiAgKi8KKyAgICBtZW1zZXQocy0+ZnJlZV90ZW1wcywgMCwgc2l6ZW9mKHMtPmZyZWVfdGVtcHMpKTsKKworICAgIHMtPmxhYmVscyA9IHRjZ19tYWxsb2Moc2l6ZW9mKFRDR0xhYmVsKSAqIFRDR19NQVhfTEFCRUxTKTsKKyAgICBzLT5uYl9sYWJlbHMgPSAwOworICAgIHMtPmN1cnJlbnRfZnJhbWVfb2Zmc2V0ID0gcy0+ZnJhbWVfc3RhcnQ7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfVENHCisgICAgcy0+Z290b190Yl9pc3N1ZV9tYXNrID0gMDsKKyNlbmRpZgorCisgICAgcy0+Z2VuX29wY19wdHIgPSBzLT5nZW5fb3BjX2J1ZjsKKyAgICBzLT5nZW5fb3BwYXJhbV9wdHIgPSBzLT5nZW5fb3BwYXJhbV9idWY7CisKKyAgICBzLT5iZSA9IHRjZ19tYWxsb2Moc2l6ZW9mKFRDR0JhY2tlbmREYXRhKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfdGVtcF9hbGxvYyhUQ0dDb250ZXh0ICpzLCBpbnQgbikKK3sKKyAgICBpZiAobiA+IFRDR19NQVhfVEVNUFMpCisgICAgICAgIHRjZ19hYm9ydCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y2dfZ2xvYmFsX3JlZ19uZXdfaW50ZXJuYWwoVENHVHlwZSB0eXBlLCBpbnQgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgVENHQ29udGV4dCAqcyA9ICZ0Y2dfY3R4OworICAgIFRDR1RlbXAgKnRzOworICAgIGludCBpZHg7CisKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisgICAgaWYgKHR5cGUgIT0gVENHX1RZUEVfSTMyKQorICAgICAgICB0Y2dfYWJvcnQoKTsKKyNlbmRpZgorICAgIGlmICh0Y2dfcmVnc2V0X3Rlc3RfcmVnKHMtPnJlc2VydmVkX3JlZ3MsIHJlZykpCisgICAgICAgIHRjZ19hYm9ydCgpOworICAgIGlkeCA9IHMtPm5iX2dsb2JhbHM7CisgICAgdGNnX3RlbXBfYWxsb2Mocywgcy0+bmJfZ2xvYmFscyArIDEpOworICAgIHRzID0gJnMtPnRlbXBzW3MtPm5iX2dsb2JhbHNdOworICAgIHRzLT5iYXNlX3R5cGUgPSB0eXBlOworICAgIHRzLT50eXBlID0gdHlwZTsKKyAgICB0cy0+Zml4ZWRfcmVnID0gMTsKKyAgICB0cy0+cmVnID0gcmVnOworICAgIHRzLT5uYW1lID0gbmFtZTsKKyAgICBzLT5uYl9nbG9iYWxzKys7CisgICAgdGNnX3JlZ3NldF9zZXRfcmVnKHMtPnJlc2VydmVkX3JlZ3MsIHJlZyk7CisgICAgcmV0dXJuIGlkeDsKK30KKworVENHdl9pMzIgdGNnX2dsb2JhbF9yZWdfbmV3X2kzMihpbnQgcmVnLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpZHg7CisKKyAgICBpZHggPSB0Y2dfZ2xvYmFsX3JlZ19uZXdfaW50ZXJuYWwoVENHX1RZUEVfSTMyLCByZWcsIG5hbWUpOworICAgIHJldHVybiBNQUtFX1RDR1ZfSTMyKGlkeCk7Cit9CisKK1RDR3ZfaTY0IHRjZ19nbG9iYWxfcmVnX25ld19pNjQoaW50IHJlZywgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaWR4OworCisgICAgaWR4ID0gdGNnX2dsb2JhbF9yZWdfbmV3X2ludGVybmFsKFRDR19UWVBFX0k2NCwgcmVnLCBuYW1lKTsKKyAgICByZXR1cm4gTUFLRV9UQ0dWX0k2NChpZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y2dfZ2xvYmFsX21lbV9uZXdfaW50ZXJuYWwoVENHVHlwZSB0eXBlLCBpbnQgcmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIFRDR0NvbnRleHQgKnMgPSAmdGNnX2N0eDsKKyAgICBUQ0dUZW1wICp0czsKKyAgICBpbnQgaWR4OworCisgICAgaWR4ID0gcy0+bmJfZ2xvYmFsczsKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyCisgICAgaWYgKHR5cGUgPT0gVENHX1RZUEVfSTY0KSB7CisgICAgICAgIGNoYXIgYnVmWzY0XTsKKyAgICAgICAgdGNnX3RlbXBfYWxsb2Mocywgcy0+bmJfZ2xvYmFscyArIDIpOworICAgICAgICB0cyA9ICZzLT50ZW1wc1tzLT5uYl9nbG9iYWxzXTsKKyAgICAgICAgdHMtPmJhc2VfdHlwZSA9IHR5cGU7CisgICAgICAgIHRzLT50eXBlID0gVENHX1RZUEVfSTMyOworICAgICAgICB0cy0+Zml4ZWRfcmVnID0gMDsKKyAgICAgICAgdHMtPm1lbV9hbGxvY2F0ZWQgPSAxOworICAgICAgICB0cy0+bWVtX3JlZyA9IHJlZzsKKyNpZmRlZiBUQ0dfVEFSR0VUX1dPUkRTX0JJR0VORElBTgorICAgICAgICB0cy0+bWVtX29mZnNldCA9IG9mZnNldCArIDQ7CisjZWxzZQorICAgICAgICB0cy0+bWVtX29mZnNldCA9IG9mZnNldDsKKyNlbmRpZgorICAgICAgICBwc3RyY3B5KGJ1Ziwgc2l6ZW9mKGJ1ZiksIG5hbWUpOworICAgICAgICBwc3RyY2F0KGJ1Ziwgc2l6ZW9mKGJ1ZiksICJfMCIpOworICAgICAgICB0cy0+bmFtZSA9IHN0cmR1cChidWYpOworICAgICAgICB0cysrOworCisgICAgICAgIHRzLT5iYXNlX3R5cGUgPSB0eXBlOworICAgICAgICB0cy0+dHlwZSA9IFRDR19UWVBFX0kzMjsKKyAgICAgICAgdHMtPmZpeGVkX3JlZyA9IDA7CisgICAgICAgIHRzLT5tZW1fYWxsb2NhdGVkID0gMTsKKyAgICAgICAgdHMtPm1lbV9yZWcgPSByZWc7CisjaWZkZWYgVENHX1RBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICAgICAgdHMtPm1lbV9vZmZzZXQgPSBvZmZzZXQ7CisjZWxzZQorICAgICAgICB0cy0+bWVtX29mZnNldCA9IG9mZnNldCArIDQ7CisjZW5kaWYKKyAgICAgICAgcHN0cmNweShidWYsIHNpemVvZihidWYpLCBuYW1lKTsKKyAgICAgICAgcHN0cmNhdChidWYsIHNpemVvZihidWYpLCAiXzEiKTsKKyAgICAgICAgdHMtPm5hbWUgPSBzdHJkdXAoYnVmKTsKKworICAgICAgICBzLT5uYl9nbG9iYWxzICs9IDI7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIHRjZ190ZW1wX2FsbG9jKHMsIHMtPm5iX2dsb2JhbHMgKyAxKTsKKyAgICAgICAgdHMgPSAmcy0+dGVtcHNbcy0+bmJfZ2xvYmFsc107CisgICAgICAgIHRzLT5iYXNlX3R5cGUgPSB0eXBlOworICAgICAgICB0cy0+dHlwZSA9IHR5cGU7CisgICAgICAgIHRzLT5maXhlZF9yZWcgPSAwOworICAgICAgICB0cy0+bWVtX2FsbG9jYXRlZCA9IDE7CisgICAgICAgIHRzLT5tZW1fcmVnID0gcmVnOworICAgICAgICB0cy0+bWVtX29mZnNldCA9IG9mZnNldDsKKyAgICAgICAgdHMtPm5hbWUgPSBuYW1lOworICAgICAgICBzLT5uYl9nbG9iYWxzKys7CisgICAgfQorICAgIHJldHVybiBpZHg7Cit9CisKK1RDR3ZfaTMyIHRjZ19nbG9iYWxfbWVtX25ld19pMzIoaW50IHJlZywgaW50cHRyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpZHggPSB0Y2dfZ2xvYmFsX21lbV9uZXdfaW50ZXJuYWwoVENHX1RZUEVfSTMyLCByZWcsIG9mZnNldCwgbmFtZSk7CisgICAgcmV0dXJuIE1BS0VfVENHVl9JMzIoaWR4KTsKK30KKworVENHdl9pNjQgdGNnX2dsb2JhbF9tZW1fbmV3X2k2NChpbnQgcmVnLCBpbnRwdHJfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGlkeCA9IHRjZ19nbG9iYWxfbWVtX25ld19pbnRlcm5hbChUQ0dfVFlQRV9JNjQsIHJlZywgb2Zmc2V0LCBuYW1lKTsKKyAgICByZXR1cm4gTUFLRV9UQ0dWX0k2NChpZHgpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0Y2dfdGVtcF9uZXdfaW50ZXJuYWwoVENHVHlwZSB0eXBlLCBpbnQgdGVtcF9sb2NhbCkKK3sKKyAgICBUQ0dDb250ZXh0ICpzID0gJnRjZ19jdHg7CisgICAgVENHVGVtcCAqdHM7CisgICAgaW50IGlkeCwgazsKKworICAgIGsgPSB0eXBlICsgKHRlbXBfbG9jYWwgPyBUQ0dfVFlQRV9DT1VOVCA6IDApOworICAgIGlkeCA9IGZpbmRfZmlyc3RfYml0KHMtPmZyZWVfdGVtcHNba10ubCwgVENHX01BWF9URU1QUyk7CisgICAgaWYgKGlkeCA8IFRDR19NQVhfVEVNUFMpIHsKKyAgICAgICAgLyogVGhlcmUgaXMgYWxyZWFkeSBhbiBhdmFpbGFibGUgdGVtcCB3aXRoIHRoZSByaWdodCB0eXBlLiAgKi8KKyAgICAgICAgY2xlYXJfYml0KGlkeCwgcy0+ZnJlZV90ZW1wc1trXS5sKTsKKworICAgICAgICB0cyA9ICZzLT50ZW1wc1tpZHhdOworICAgICAgICB0cy0+dGVtcF9hbGxvY2F0ZWQgPSAxOworICAgICAgICBhc3NlcnQodHMtPmJhc2VfdHlwZSA9PSB0eXBlKTsKKyAgICAgICAgYXNzZXJ0KHRzLT50ZW1wX2xvY2FsID09IHRlbXBfbG9jYWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlkeCA9IHMtPm5iX3RlbXBzOworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICAgICAgaWYgKHR5cGUgPT0gVENHX1RZUEVfSTY0KSB7CisgICAgICAgICAgICB0Y2dfdGVtcF9hbGxvYyhzLCBzLT5uYl90ZW1wcyArIDIpOworICAgICAgICAgICAgdHMgPSAmcy0+dGVtcHNbcy0+bmJfdGVtcHNdOworICAgICAgICAgICAgdHMtPmJhc2VfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0cy0+dHlwZSA9IFRDR19UWVBFX0kzMjsKKyAgICAgICAgICAgIHRzLT50ZW1wX2FsbG9jYXRlZCA9IDE7CisgICAgICAgICAgICB0cy0+dGVtcF9sb2NhbCA9IHRlbXBfbG9jYWw7CisgICAgICAgICAgICB0cy0+bmFtZSA9IE5VTEw7CisgICAgICAgICAgICB0cysrOworICAgICAgICAgICAgdHMtPmJhc2VfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0cy0+dHlwZSA9IFRDR19UWVBFX0kzMjsKKyAgICAgICAgICAgIHRzLT50ZW1wX2FsbG9jYXRlZCA9IDE7CisgICAgICAgICAgICB0cy0+dGVtcF9sb2NhbCA9IHRlbXBfbG9jYWw7CisgICAgICAgICAgICB0cy0+bmFtZSA9IE5VTEw7CisgICAgICAgICAgICBzLT5uYl90ZW1wcyArPSAyOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICB0Y2dfdGVtcF9hbGxvYyhzLCBzLT5uYl90ZW1wcyArIDEpOworICAgICAgICAgICAgdHMgPSAmcy0+dGVtcHNbcy0+bmJfdGVtcHNdOworICAgICAgICAgICAgdHMtPmJhc2VfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0cy0+dHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0cy0+dGVtcF9hbGxvY2F0ZWQgPSAxOworICAgICAgICAgICAgdHMtPnRlbXBfbG9jYWwgPSB0ZW1wX2xvY2FsOworICAgICAgICAgICAgdHMtPm5hbWUgPSBOVUxMOworICAgICAgICAgICAgcy0+bmJfdGVtcHMrKzsKKyAgICAgICAgfQorICAgIH0KKworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1RDRykKKyAgICBzLT50ZW1wc19pbl91c2UrKzsKKyNlbmRpZgorICAgIHJldHVybiBpZHg7Cit9CisKK1RDR3ZfaTMyIHRjZ190ZW1wX25ld19pbnRlcm5hbF9pMzIoaW50IHRlbXBfbG9jYWwpCit7CisgICAgaW50IGlkeDsKKworICAgIGlkeCA9IHRjZ190ZW1wX25ld19pbnRlcm5hbChUQ0dfVFlQRV9JMzIsIHRlbXBfbG9jYWwpOworICAgIHJldHVybiBNQUtFX1RDR1ZfSTMyKGlkeCk7Cit9CisKK1RDR3ZfaTY0IHRjZ190ZW1wX25ld19pbnRlcm5hbF9pNjQoaW50IHRlbXBfbG9jYWwpCit7CisgICAgaW50IGlkeDsKKworICAgIGlkeCA9IHRjZ190ZW1wX25ld19pbnRlcm5hbChUQ0dfVFlQRV9JNjQsIHRlbXBfbG9jYWwpOworICAgIHJldHVybiBNQUtFX1RDR1ZfSTY0KGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIHRjZ190ZW1wX2ZyZWVfaW50ZXJuYWwoaW50IGlkeCkKK3sKKyAgICBUQ0dDb250ZXh0ICpzID0gJnRjZ19jdHg7CisgICAgVENHVGVtcCAqdHM7CisgICAgaW50IGs7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19UQ0cpCisgICAgcy0+dGVtcHNfaW5fdXNlLS07CisgICAgaWYgKHMtPnRlbXBzX2luX3VzZSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJNb3JlIHRlbXBvcmFyaWVzIGZyZWVkIHRoYW4gYWxsb2NhdGVkIVxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICBhc3NlcnQoaWR4ID49IHMtPm5iX2dsb2JhbHMgJiYgaWR4IDwgcy0+bmJfdGVtcHMpOworICAgIHRzID0gJnMtPnRlbXBzW2lkeF07CisgICAgYXNzZXJ0KHRzLT50ZW1wX2FsbG9jYXRlZCAhPSAwKTsKKyAgICB0cy0+dGVtcF9hbGxvY2F0ZWQgPSAwOworCisgICAgayA9IHRzLT5iYXNlX3R5cGUgKyAodHMtPnRlbXBfbG9jYWwgPyBUQ0dfVFlQRV9DT1VOVCA6IDApOworICAgIHNldF9iaXQoaWR4LCBzLT5mcmVlX3RlbXBzW2tdLmwpOworfQorCit2b2lkIHRjZ190ZW1wX2ZyZWVfaTMyKFRDR3ZfaTMyIGFyZykKK3sKKyAgICB0Y2dfdGVtcF9mcmVlX2ludGVybmFsKEdFVF9UQ0dWX0kzMihhcmcpKTsKK30KKwordm9pZCB0Y2dfdGVtcF9mcmVlX2k2NChUQ0d2X2k2NCBhcmcpCit7CisgICAgdGNnX3RlbXBfZnJlZV9pbnRlcm5hbChHRVRfVENHVl9JNjQoYXJnKSk7Cit9CisKK1RDR3ZfaTMyIHRjZ19jb25zdF9pMzIoaW50MzJfdCB2YWwpCit7CisgICAgVENHdl9pMzIgdDA7CisgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMih0MCwgdmFsKTsKKyAgICByZXR1cm4gdDA7Cit9CisKK1RDR3ZfaTY0IHRjZ19jb25zdF9pNjQoaW50NjRfdCB2YWwpCit7CisgICAgVENHdl9pNjQgdDA7CisgICAgdDAgPSB0Y2dfdGVtcF9uZXdfaTY0KCk7CisgICAgdGNnX2dlbl9tb3ZpX2k2NCh0MCwgdmFsKTsKKyAgICByZXR1cm4gdDA7Cit9CisKK1RDR3ZfaTMyIHRjZ19jb25zdF9sb2NhbF9pMzIoaW50MzJfdCB2YWwpCit7CisgICAgVENHdl9pMzIgdDA7CisgICAgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXdfaTMyKCk7CisgICAgdGNnX2dlbl9tb3ZpX2kzMih0MCwgdmFsKTsKKyAgICByZXR1cm4gdDA7Cit9CisKK1RDR3ZfaTY0IHRjZ19jb25zdF9sb2NhbF9pNjQoaW50NjRfdCB2YWwpCit7CisgICAgVENHdl9pNjQgdDA7CisgICAgdDAgPSB0Y2dfdGVtcF9sb2NhbF9uZXdfaTY0KCk7CisgICAgdGNnX2dlbl9tb3ZpX2k2NCh0MCwgdmFsKTsKKyAgICByZXR1cm4gdDA7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19UQ0cpCit2b2lkIHRjZ19jbGVhcl90ZW1wX2NvdW50KHZvaWQpCit7CisgICAgVENHQ29udGV4dCAqcyA9ICZ0Y2dfY3R4OworICAgIHMtPnRlbXBzX2luX3VzZSA9IDA7Cit9CisKK2ludCB0Y2dfY2hlY2tfdGVtcF9jb3VudCh2b2lkKQoreworICAgIFRDR0NvbnRleHQgKnMgPSAmdGNnX2N0eDsKKyAgICBpZiAocy0+dGVtcHNfaW5fdXNlKSB7CisgICAgICAgIC8qIENsZWFyIHRoZSBjb3VudCBzbyB0aGF0IHdlIGRvbid0IGdpdmUgYW5vdGhlcgorICAgICAgICAgKiB3YXJuaW5nIGltbWVkaWF0ZWx5IG5leHQgdGltZSBhcm91bmQuCisgICAgICAgICAqLworICAgICAgICBzLT50ZW1wc19pbl91c2UgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogTm90ZTogd2UgY29udmVydCB0aGUgNjQgYml0IGFyZ3MgdG8gMzIgYml0IGFuZCBkbyBzb21lIGFsaWdubWVudAorICAgYW5kIGVuZGlhbiBzd2FwLiBNYXliZSBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZG8gdGhlIGFsaWdubWVudAorICAgYW5kIGVuZGlhbiBzd2FwIGluIHRjZ19yZWdfYWxsb2NfY2FsbCgpLiAqLwordm9pZCB0Y2dfZ2VuX2NhbGxOKFRDR0NvbnRleHQgKnMsIFRDR3ZfcHRyIGZ1bmMsIHVuc2lnbmVkIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZW1hc2ssIFRDR0FyZyByZXQsIGludCBuYXJncywgVENHQXJnICphcmdzKQoreworICAgIGludCBpOworICAgIGludCByZWFsX2FyZ3M7CisgICAgaW50IG5iX3JldHM7CisgICAgVENHQXJnICpucGFyYW07CisKKyNpZiBkZWZpbmVkKFRDR19UQVJHRVRfRVhURU5EX0FSR1MpICYmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gNjQKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7ICsraSkgeworICAgICAgICBpbnQgaXNfNjRiaXQgPSBzaXplbWFzayAmICgxIDw8IChpKzEpKjIpOworICAgICAgICBpbnQgaXNfc2lnbmVkID0gc2l6ZW1hc2sgJiAoMiA8PCAoaSsxKSoyKTsKKyAgICAgICAgaWYgKCFpc182NGJpdCkgeworICAgICAgICAgICAgVENHdl9pNjQgdGVtcCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKyAgICAgICAgICAgIFRDR3ZfaTY0IG9yaWcgPSBNQUtFX1RDR1ZfSTY0KGFyZ3NbaV0pOworICAgICAgICAgICAgaWYgKGlzX3NpZ25lZCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fZXh0MzJzX2k2NCh0ZW1wLCBvcmlnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9leHQzMnVfaTY0KHRlbXAsIG9yaWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJnc1tpXSA9IEdFVF9UQ0dWX0k2NCh0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBUQ0dfVEFSR0VUX0VYVEVORF9BUkdTICovCisKKyAgICAqcy0+Z2VuX29wY19wdHIrKyA9IElOREVYX29wX2NhbGw7CisgICAgbnBhcmFtID0gcy0+Z2VuX29wcGFyYW1fcHRyKys7CisgICAgaWYgKHJldCAhPSBUQ0dfQ0FMTF9EVU1NWV9BUkcpIHsKKyNpZiBUQ0dfVEFSR0VUX1JFR19CSVRTIDwgNjQKKyAgICAgICAgaWYgKHNpemVtYXNrICYgMSkgeworI2lmZGVmIFRDR19UQVJHRVRfV09SRFNfQklHRU5ESUFOCisgICAgICAgICAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSByZXQgKyAxOworICAgICAgICAgICAgKnMtPmdlbl9vcHBhcmFtX3B0cisrID0gcmV0OworI2Vsc2UKKyAgICAgICAgICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IHJldDsKKyAgICAgICAgICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IHJldCArIDE7CisjZW5kaWYKKyAgICAgICAgICAgIG5iX3JldHMgPSAyOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSByZXQ7CisgICAgICAgICAgICBuYl9yZXRzID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG5iX3JldHMgPSAwOworICAgIH0KKyAgICByZWFsX2FyZ3MgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKSB7CisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA8IDY0CisgICAgICAgIGludCBpc182NGJpdCA9IHNpemVtYXNrICYgKDEgPDwgKGkrMSkqMik7CisgICAgICAgIGlmIChpc182NGJpdCkgeworI2lmZGVmIFRDR19UQVJHRVRfQ0FMTF9BTElHTl9BUkdTCisgICAgICAgICAgICAvKiBzb21lIHRhcmdldHMgd2FudCBhbGlnbmVkIDY0IGJpdCBhcmdzICovCisgICAgICAgICAgICBpZiAocmVhbF9hcmdzICYgMSkgeworICAgICAgICAgICAgICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IFRDR19DQUxMX0RVTU1ZX0FSRzsKKyAgICAgICAgICAgICAgICByZWFsX2FyZ3MrKzsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCSAgICAvKiBJZiBzdGFjayBncm93cyB1cCwgdGhlbiB3ZSB3aWxsIGJlIHBsYWNpbmcgc3VjY2Vzc2l2ZQorCSAgICAgICBhcmd1bWVudHMgYXQgbG93ZXIgYWRkcmVzc2VzLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvCisJICAgICAgIHJldmVyc2UgdGhlIG9yZGVyIGNvbXBhcmVkIHRvIGhvdyB3ZSB3b3VsZCBub3JtYWxseQorCSAgICAgICB0cmVhdCBlaXRoZXIgYmlnIG9yIGxpdHRsZS1lbmRpYW4uICBGb3IgdGhvc2UgYXJndW1lbnRzCisJICAgICAgIHRoYXQgd2lsbCB3aW5kIHVwIGluIHJlZ2lzdGVycywgdGhpcyBzdGlsbCB3b3JrcyBmb3IKKwkgICAgICAgSFBQQSAodGhlIG9ubHkgY3VycmVudCBTVEFDS19HUk9XU1VQIHRhcmdldCkgc2luY2UgdGhlCisJICAgICAgIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgKmFsc28qIGFsbG9jYXRlZCBpbiBkZWNyZWFzaW5nCisJICAgICAgIG9yZGVyLiAgSWYgYW5vdGhlciBzdWNoIHRhcmdldCBpcyBhZGRlZCwgdGhpcyBsb2dpYyBtYXkKKwkgICAgICAgaGF2ZSB0byBnZXQgbW9yZSBjb21wbGljYXRlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4KKwkgICAgICAgc3RhY2sgYXJndW1lbnRzIGFuZCByZWdpc3RlciBhcmd1bWVudHMuICAqLworI2lmIGRlZmluZWQoVENHX1RBUkdFVF9XT1JEU19CSUdFTkRJQU4pICE9IGRlZmluZWQoVENHX1RBUkdFVF9TVEFDS19HUk9XU1VQKQorICAgICAgICAgICAgKnMtPmdlbl9vcHBhcmFtX3B0cisrID0gYXJnc1tpXSArIDE7CisgICAgICAgICAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSBhcmdzW2ldOworI2Vsc2UKKyAgICAgICAgICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZ3NbaV07CisgICAgICAgICAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSBhcmdzW2ldICsgMTsKKyNlbmRpZgorICAgICAgICAgICAgcmVhbF9hcmdzICs9IDI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFRDR19UQVJHRVRfUkVHX0JJVFMgPCA2NCAqLworCisgICAgICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IGFyZ3NbaV07CisgICAgICAgIHJlYWxfYXJncysrOworICAgIH0KKyAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSBHRVRfVENHVl9QVFIoZnVuYyk7CisKKyAgICAqcy0+Z2VuX29wcGFyYW1fcHRyKysgPSBmbGFnczsKKworICAgICpucGFyYW0gPSAobmJfcmV0cyA8PCAxNikgfCAocmVhbF9hcmdzICsgMSk7CisKKyAgICAvKiB0b3RhbCBwYXJhbWV0ZXJzLCBuZWVkZWQgdG8gZ28gYmFja3dhcmQgaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbSAqLworICAgICpzLT5nZW5fb3BwYXJhbV9wdHIrKyA9IDEgKyBuYl9yZXRzICsgcmVhbF9hcmdzICsgMzsKKworI2lmIGRlZmluZWQoVENHX1RBUkdFVF9FWFRFTkRfQVJHUykgJiYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAorICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgKytpKSB7CisgICAgICAgIGludCBpc182NGJpdCA9IHNpemVtYXNrICYgKDEgPDwgKGkrMSkqMik7CisgICAgICAgIGlmICghaXNfNjRiaXQpIHsKKyAgICAgICAgICAgIFRDR3ZfaTY0IHRlbXAgPSBNQUtFX1RDR1ZfSTY0KGFyZ3NbaV0pOworICAgICAgICAgICAgdGNnX3RlbXBfZnJlZV9pNjQodGVtcCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVENHX1RBUkdFVF9FWFRFTkRfQVJHUyAqLworfQorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgordm9pZCB0Y2dfZ2VuX3NoaWZ0aV9pNjQoVENHdl9pNjQgcmV0LCBUQ0d2X2k2NCBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGMsIGludCByaWdodCwgaW50IGFyaXRoKQoreworICAgIGlmIChjID09IDApIHsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfTE9XKHJldCksIFRDR1ZfTE9XKGFyZzEpKTsKKyAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSkpOworICAgIH0gZWxzZSBpZiAoYyA+PSAzMikgeworICAgICAgICBjIC09IDMyOworICAgICAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgICAgIGlmIChhcml0aCkgeworICAgICAgICAgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9ISUdIKGFyZzEpLCBjKTsKKyAgICAgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSksIDMxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMihUQ0dWX0xPVyhyZXQpLCBUQ0dWX0hJR0goYXJnMSksIGMpOworICAgICAgICAgICAgICAgIHRjZ19nZW5fbW92aV9pMzIoVENHVl9ISUdIKHJldCksIDApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMihUQ0dWX0hJR0gocmV0KSwgVENHVl9MT1coYXJnMSksIGMpOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZpX2kzMihUQ0dWX0xPVyhyZXQpLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFRDR3ZfaTMyIHQwLCB0MTsKKworICAgICAgICB0MCA9IHRjZ190ZW1wX25ld19pMzIoKTsKKyAgICAgICAgdDEgPSB0Y2dfdGVtcF9uZXdfaTMyKCk7CisgICAgICAgIGlmIChyaWdodCkgeworICAgICAgICAgICAgdGNnX2dlbl9zaGxpX2kzMih0MCwgVENHVl9ISUdIKGFyZzEpLCAzMiAtIGMpOworICAgICAgICAgICAgaWYgKGFyaXRoKQorICAgICAgICAgICAgICAgIHRjZ19nZW5fc2FyaV9pMzIodDEsIFRDR1ZfSElHSChhcmcxKSwgYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGNnX2dlbl9zaHJpX2kzMih0MSwgVENHVl9ISUdIKGFyZzEpLCBjKTsKKyAgICAgICAgICAgIHRjZ19nZW5fc2hyaV9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1coYXJnMSksIGMpOworICAgICAgICAgICAgdGNnX2dlbl9vcl9pMzIoVENHVl9MT1cocmV0KSwgVENHVl9MT1cocmV0KSwgdDApOworICAgICAgICAgICAgdGNnX2dlbl9tb3ZfaTMyKFRDR1ZfSElHSChyZXQpLCB0MSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX3NocmlfaTMyKHQwLCBUQ0dWX0xPVyhhcmcxKSwgMzIgLSBjKTsKKyAgICAgICAgICAgIC8qIE5vdGU6IHJldCBjYW4gYmUgdGhlIHNhbWUgYXMgYXJnMSwgc28gd2UgdXNlIHQxICovCisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKHQxLCBUQ0dWX0xPVyhhcmcxKSwgYyk7CisgICAgICAgICAgICB0Y2dfZ2VuX3NobGlfaTMyKFRDR1ZfSElHSChyZXQpLCBUQ0dWX0hJR0goYXJnMSksIGMpOworICAgICAgICAgICAgdGNnX2dlbl9vcl9pMzIoVENHVl9ISUdIKHJldCksIFRDR1ZfSElHSChyZXQpLCB0MCk7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdl9pMzIoVENHVl9MT1cocmV0KSwgdDEpOworICAgICAgICB9CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTMyKHQwKTsKKyAgICAgICAgdGNnX3RlbXBfZnJlZV9pMzIodDEpOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIFRDR01lbU9wIHRjZ19jYW5vbmljYWxpemVfbWVtb3AoVENHTWVtT3Agb3AsIGJvb2wgaXM2NCwgYm9vbCBzdCkKK3sKKyAgICBzd2l0Y2ggKG9wICYgTU9fU0laRSkgeworICAgIGNhc2UgTU9fODoKKyAgICAgICAgb3AgJj0gfk1PX0JTV0FQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PXzE2OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1PXzMyOgorICAgICAgICBpZiAoIWlzNjQpIHsKKyAgICAgICAgICAgIG9wICY9IH5NT19TSUdOOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU9fNjQ6CisgICAgICAgIGlmICghaXM2NCkgeworICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzdCkgeworICAgICAgICBvcCAmPSB+TU9fU0lHTjsKKyAgICB9CisgICAgcmV0dXJuIG9wOworfQorCitzdGF0aWMgY29uc3QgVENHT3Bjb2RlIG9sZF9sZF9vcGNbOF0gPSB7CisgICAgW01PX1VCXSA9IElOREVYX29wX3FlbXVfbGQ4dSwKKyAgICBbTU9fU0JdID0gSU5ERVhfb3BfcWVtdV9sZDhzLAorICAgIFtNT19VV10gPSBJTkRFWF9vcF9xZW11X2xkMTZ1LAorICAgIFtNT19TV10gPSBJTkRFWF9vcF9xZW11X2xkMTZzLAorI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICBbTU9fVUxdID0gSU5ERVhfb3BfcWVtdV9sZDMyLAorICAgIFtNT19TTF0gPSBJTkRFWF9vcF9xZW11X2xkMzIsCisjZWxzZQorICAgIFtNT19VTF0gPSBJTkRFWF9vcF9xZW11X2xkMzJ1LAorICAgIFtNT19TTF0gPSBJTkRFWF9vcF9xZW11X2xkMzJzLAorI2VuZGlmCisgICAgW01PX1FdICA9IElOREVYX29wX3FlbXVfbGQ2NCwKK307CisKK3N0YXRpYyBjb25zdCBUQ0dPcGNvZGUgb2xkX3N0X29wY1s0XSA9IHsKKyAgICBbTU9fVUJdID0gSU5ERVhfb3BfcWVtdV9zdDgsCisgICAgW01PX1VXXSA9IElOREVYX29wX3FlbXVfc3QxNiwKKyAgICBbTU9fVUxdID0gSU5ERVhfb3BfcWVtdV9zdDMyLAorICAgIFtNT19RXSAgPSBJTkRFWF9vcF9xZW11X3N0NjQsCit9OworCit2b2lkIHRjZ19nZW5fcWVtdV9sZF9pMzIoVENHdl9pMzIgdmFsLCBUQ0d2IGFkZHIsIFRDR0FyZyBpZHgsIFRDR01lbU9wIG1lbW9wKQoreworICAgIG1lbW9wID0gdGNnX2Nhbm9uaWNhbGl6ZV9tZW1vcChtZW1vcCwgMCwgMCk7CisKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbmV3X2xkc3QpIHsKKyAgICAgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IElOREVYX29wX3FlbXVfbGRfaTMyOworICAgICAgICB0Y2dfYWRkX3BhcmFtX2kzMih2YWwpOworICAgICAgICB0Y2dfYWRkX3BhcmFtX3RsKGFkZHIpOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IG1lbW9wOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFRoZSBvbGQgb3Bjb2RlcyBvbmx5IHN1cHBvcnQgdGFyZ2V0LWVuZGlhbiBtZW1vcnkgb3BlcmF0aW9ucy4gICovCisgICAgYXNzZXJ0KChtZW1vcCAmIE1PX0JTV0FQKSA9PSBNT19URSB8fCAobWVtb3AgJiBNT19TSVpFKSA9PSBNT184KTsKKyAgICBhc3NlcnQob2xkX2xkX29wY1ttZW1vcCAmIE1PX1NTSVpFXSAhPSAwKTsKKworICAgIGlmIChUQ0dfVEFSR0VUX1JFR19CSVRTID09IDMyKSB7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvbGRfbGRfb3BjW21lbW9wICYgTU9fU1NJWkVdOworICAgICAgICB0Y2dfYWRkX3BhcmFtX2kzMih2YWwpOworICAgICAgICB0Y2dfYWRkX3BhcmFtX3RsKGFkZHIpOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB2YWw2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb2xkX2xkX29wY1ttZW1vcCAmIE1PX1NTSVpFXTsKKyAgICAgICAgdGNnX2FkZF9wYXJhbV9pNjQodmFsNjQpOworICAgICAgICB0Y2dfYWRkX3BhcmFtX3RsKGFkZHIpOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKKworICAgICAgICB0Y2dfZ2VuX3RydW5jX2k2NF9pMzIodmFsLCB2YWw2NCk7CisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHZhbDY0KTsKKyAgICB9Cit9CisKK3ZvaWQgdGNnX2dlbl9xZW11X3N0X2kzMihUQ0d2X2kzMiB2YWwsIFRDR3YgYWRkciwgVENHQXJnIGlkeCwgVENHTWVtT3AgbWVtb3ApCit7CisgICAgbWVtb3AgPSB0Y2dfY2Fub25pY2FsaXplX21lbW9wKG1lbW9wLCAwLCAxKTsKKworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19uZXdfbGRzdCkgeworICAgICAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gSU5ERVhfb3BfcWVtdV9zdF9pMzI7CisgICAgICAgIHRjZ19hZGRfcGFyYW1faTMyKHZhbCk7CisgICAgICAgIHRjZ19hZGRfcGFyYW1fdGwoYWRkcik7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gbWVtb3A7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gaWR4OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVGhlIG9sZCBvcGNvZGVzIG9ubHkgc3VwcG9ydCB0YXJnZXQtZW5kaWFuIG1lbW9yeSBvcGVyYXRpb25zLiAgKi8KKyAgICBhc3NlcnQoKG1lbW9wICYgTU9fQlNXQVApID09IE1PX1RFIHx8IChtZW1vcCAmIE1PX1NJWkUpID09IE1PXzgpOworICAgIGFzc2VydChvbGRfc3Rfb3BjW21lbW9wICYgTU9fU0laRV0gIT0gMCk7CisKKyAgICBpZiAoVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMikgeworICAgICAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb2xkX3N0X29wY1ttZW1vcCAmIE1PX1NJWkVdOworICAgICAgICB0Y2dfYWRkX3BhcmFtX2kzMih2YWwpOworICAgICAgICB0Y2dfYWRkX3BhcmFtX3RsKGFkZHIpOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKKyAgICB9IGVsc2UgeworICAgICAgICBUQ0d2X2k2NCB2YWw2NCA9IHRjZ190ZW1wX25ld19pNjQoKTsKKworICAgICAgICB0Y2dfZ2VuX2V4dHVfaTMyX2k2NCh2YWw2NCwgdmFsKTsKKworICAgICAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb2xkX3N0X29wY1ttZW1vcCAmIE1PX1NJWkVdOworICAgICAgICB0Y2dfYWRkX3BhcmFtX2k2NCh2YWw2NCk7CisgICAgICAgIHRjZ19hZGRfcGFyYW1fdGwoYWRkcik7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gaWR4OworCisgICAgICAgIHRjZ190ZW1wX2ZyZWVfaTY0KHZhbDY0KTsKKyAgICB9Cit9CisKK3ZvaWQgdGNnX2dlbl9xZW11X2xkX2k2NChUQ0d2X2k2NCB2YWwsIFRDR3YgYWRkciwgVENHQXJnIGlkeCwgVENHTWVtT3AgbWVtb3ApCit7CisgICAgbWVtb3AgPSB0Y2dfY2Fub25pY2FsaXplX21lbW9wKG1lbW9wLCAxLCAwKTsKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICBpZiAoKG1lbW9wICYgTU9fU0laRSkgPCBNT182NCkgeworICAgICAgICB0Y2dfZ2VuX3FlbXVfbGRfaTMyKFRDR1ZfTE9XKHZhbCksIGFkZHIsIGlkeCwgbWVtb3ApOworICAgICAgICBpZiAobWVtb3AgJiBNT19TSUdOKSB7CisgICAgICAgICAgICB0Y2dfZ2VuX3NhcmlfaTMyKFRDR1ZfSElHSCh2YWwpLCBUQ0dWX0xPVyh2YWwpLCAzMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y2dfZ2VuX21vdmlfaTMyKFRDR1ZfSElHSCh2YWwpLCAwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoVENHX1RBUkdFVF9IQVNfbmV3X2xkc3QpIHsKKyAgICAgICAgKnRjZ19jdHguZ2VuX29wY19wdHIrKyA9IElOREVYX29wX3FlbXVfbGRfaTY0OworICAgICAgICB0Y2dfYWRkX3BhcmFtX2k2NCh2YWwpOworICAgICAgICB0Y2dfYWRkX3BhcmFtX3RsKGFkZHIpOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IG1lbW9wOworICAgICAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFRoZSBvbGQgb3Bjb2RlcyBvbmx5IHN1cHBvcnQgdGFyZ2V0LWVuZGlhbiBtZW1vcnkgb3BlcmF0aW9ucy4gICovCisgICAgYXNzZXJ0KChtZW1vcCAmIE1PX0JTV0FQKSA9PSBNT19URSB8fCAobWVtb3AgJiBNT19TSVpFKSA9PSBNT184KTsKKyAgICBhc3NlcnQob2xkX2xkX29wY1ttZW1vcCAmIE1PX1NTSVpFXSAhPSAwKTsKKworICAgICp0Y2dfY3R4Lmdlbl9vcGNfcHRyKysgPSBvbGRfbGRfb3BjW21lbW9wICYgTU9fU1NJWkVdOworICAgIHRjZ19hZGRfcGFyYW1faTY0KHZhbCk7CisgICAgdGNnX2FkZF9wYXJhbV90bChhZGRyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKK30KKwordm9pZCB0Y2dfZ2VuX3FlbXVfc3RfaTY0KFRDR3ZfaTY0IHZhbCwgVENHdiBhZGRyLCBUQ0dBcmcgaWR4LCBUQ0dNZW1PcCBtZW1vcCkKK3sKKyAgICBtZW1vcCA9IHRjZ19jYW5vbmljYWxpemVfbWVtb3AobWVtb3AsIDEsIDEpOworCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorICAgIGlmICgobWVtb3AgJiBNT19TSVpFKSA8IE1PXzY0KSB7CisgICAgICAgIHRjZ19nZW5fcWVtdV9zdF9pMzIoVENHVl9MT1codmFsKSwgYWRkciwgaWR4LCBtZW1vcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChUQ0dfVEFSR0VUX0hBU19uZXdfbGRzdCkgeworICAgICAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gSU5ERVhfb3BfcWVtdV9zdF9pNjQ7CisgICAgICAgIHRjZ19hZGRfcGFyYW1faTY0KHZhbCk7CisgICAgICAgIHRjZ19hZGRfcGFyYW1fdGwoYWRkcik7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gbWVtb3A7CisgICAgICAgICp0Y2dfY3R4Lmdlbl9vcHBhcmFtX3B0cisrID0gaWR4OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogVGhlIG9sZCBvcGNvZGVzIG9ubHkgc3VwcG9ydCB0YXJnZXQtZW5kaWFuIG1lbW9yeSBvcGVyYXRpb25zLiAgKi8KKyAgICBhc3NlcnQoKG1lbW9wICYgTU9fQlNXQVApID09IE1PX1RFIHx8IChtZW1vcCAmIE1PX1NJWkUpID09IE1PXzgpOworICAgIGFzc2VydChvbGRfc3Rfb3BjW21lbW9wICYgTU9fU0laRV0gIT0gMCk7CisKKyAgICAqdGNnX2N0eC5nZW5fb3BjX3B0cisrID0gb2xkX3N0X29wY1ttZW1vcCAmIE1PX1NJWkVdOworICAgIHRjZ19hZGRfcGFyYW1faTY0KHZhbCk7CisgICAgdGNnX2FkZF9wYXJhbV90bChhZGRyKTsKKyAgICAqdGNnX2N0eC5nZW5fb3BwYXJhbV9wdHIrKyA9IGlkeDsKK30KKworc3RhdGljIHZvaWQgdGNnX3JlZ19hbGxvY19zdGFydChUQ0dDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIFRDR1RlbXAgKnRzOworICAgIGZvcihpID0gMDsgaSA8IHMtPm5iX2dsb2JhbHM7IGkrKykgeworICAgICAgICB0cyA9ICZzLT50ZW1wc1tpXTsKKyAgICAgICAgaWYgKHRzLT5maXhlZF9yZWcpIHsKKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX1JFRzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX01FTTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoaSA9IHMtPm5iX2dsb2JhbHM7IGkgPCBzLT5uYl90ZW1wczsgaSsrKSB7CisgICAgICAgIHRzID0gJnMtPnRlbXBzW2ldOworICAgICAgICBpZiAodHMtPnRlbXBfbG9jYWwpIHsKKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX01FTTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX0RFQUQ7CisgICAgICAgIH0KKyAgICAgICAgdHMtPm1lbV9hbGxvY2F0ZWQgPSAwOworICAgICAgICB0cy0+Zml4ZWRfcmVnID0gMDsKKyAgICB9CisgICAgZm9yKGkgPSAwOyBpIDwgVENHX1RBUkdFVF9OQl9SRUdTOyBpKyspIHsKKyAgICAgICAgcy0+cmVnX3RvX3RlbXBbaV0gPSAtMTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICp0Y2dfZ2V0X2FyZ19zdHJfaWR4KFRDR0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCkKK3sKKyAgICBUQ0dUZW1wICp0czsKKworICAgIGFzc2VydChpZHggPj0gMCAmJiBpZHggPCBzLT5uYl90ZW1wcyk7CisgICAgdHMgPSAmcy0+dGVtcHNbaWR4XTsKKyAgICBpZiAoaWR4IDwgcy0+bmJfZ2xvYmFscykgeworICAgICAgICBwc3RyY3B5KGJ1ZiwgYnVmX3NpemUsIHRzLT5uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodHMtPnRlbXBfbG9jYWwpIAorICAgICAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgImxvYyVkIiwgaWR4IC0gcy0+bmJfZ2xvYmFscyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICJ0bXAlZCIsIGlkeCAtIHMtPm5iX2dsb2JhbHMpOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorCitjaGFyICp0Y2dfZ2V0X2FyZ19zdHJfaTMyKFRDR0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBUQ0d2X2kzMiBhcmcpCit7CisgICAgcmV0dXJuIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBidWZfc2l6ZSwgR0VUX1RDR1ZfSTMyKGFyZykpOworfQorCitjaGFyICp0Y2dfZ2V0X2FyZ19zdHJfaTY0KFRDR0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBUQ0d2X2k2NCBhcmcpCit7CisgICAgcmV0dXJuIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBidWZfc2l6ZSwgR0VUX1RDR1ZfSTY0KGFyZykpOworfQorCisvKiBGaW5kIGhlbHBlciBuYW1lLiAgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqdGNnX2ZpbmRfaGVscGVyKFRDR0NvbnRleHQgKnMsIHVpbnRwdHJfdCB2YWwpCit7CisgICAgY29uc3QgY2hhciAqcmV0ID0gTlVMTDsKKyAgICBpZiAocy0+aGVscGVycykgeworICAgICAgICByZXQgPSBnX2hhc2hfdGFibGVfbG9va3VwKHMtPmhlbHBlcnMsIChncG9pbnRlcil2YWwpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbmRfbmFtZVtdID0KK3sKKyAgICBbVENHX0NPTkRfTkVWRVJdID0gIm5ldmVyIiwKKyAgICBbVENHX0NPTkRfQUxXQVlTXSA9ICJhbHdheXMiLAorICAgIFtUQ0dfQ09ORF9FUV0gPSAiZXEiLAorICAgIFtUQ0dfQ09ORF9ORV0gPSAibmUiLAorICAgIFtUQ0dfQ09ORF9MVF0gPSAibHQiLAorICAgIFtUQ0dfQ09ORF9HRV0gPSAiZ2UiLAorICAgIFtUQ0dfQ09ORF9MRV0gPSAibGUiLAorICAgIFtUQ0dfQ09ORF9HVF0gPSAiZ3QiLAorICAgIFtUQ0dfQ09ORF9MVFVdID0gImx0dSIsCisgICAgW1RDR19DT05EX0dFVV0gPSAiZ2V1IiwKKyAgICBbVENHX0NPTkRfTEVVXSA9ICJsZXUiLAorICAgIFtUQ0dfQ09ORF9HVFVdID0gImd0dSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGRzdF9uYW1lW10gPQoreworICAgIFtNT19VQl0gICA9ICJ1YiIsCisgICAgW01PX1NCXSAgID0gInNiIiwKKyAgICBbTU9fTEVVV10gPSAibGV1dyIsCisgICAgW01PX0xFU1ddID0gImxlc3ciLAorICAgIFtNT19MRVVMXSA9ICJsZXVsIiwKKyAgICBbTU9fTEVTTF0gPSAibGVzbCIsCisgICAgW01PX0xFUV0gID0gImxlcSIsCisgICAgW01PX0JFVVddID0gImJldXciLAorICAgIFtNT19CRVNXXSA9ICJiZXN3IiwKKyAgICBbTU9fQkVVTF0gPSAiYmV1bCIsCisgICAgW01PX0JFU0xdID0gImJlc2wiLAorICAgIFtNT19CRVFdICA9ICJiZXEiLAorfTsKKwordm9pZCB0Y2dfZHVtcF9vcHMoVENHQ29udGV4dCAqcykKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqb3BjX3B0cjsKKyAgICBjb25zdCBUQ0dBcmcgKmFyZ3M7CisgICAgVENHQXJnIGFyZzsKKyAgICBUQ0dPcGNvZGUgYzsKKyAgICBpbnQgaSwgaywgbmJfb2FyZ3MsIG5iX2lhcmdzLCBuYl9jYXJncywgZmlyc3RfaW5zbjsKKyAgICBjb25zdCBUQ0dPcERlZiAqZGVmOworICAgIGNoYXIgYnVmWzEyOF07CisKKyAgICBmaXJzdF9pbnNuID0gMTsKKyAgICBvcGNfcHRyID0gcy0+Z2VuX29wY19idWY7CisgICAgYXJncyA9IHMtPmdlbl9vcHBhcmFtX2J1ZjsKKyAgICB3aGlsZSAob3BjX3B0ciA8IHMtPmdlbl9vcGNfcHRyKSB7CisgICAgICAgIGMgPSAqb3BjX3B0cisrOworICAgICAgICBkZWYgPSAmdGNnX29wX2RlZnNbY107CisgICAgICAgIGlmIChjID09IElOREVYX29wX2RlYnVnX2luc25fc3RhcnQpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IHBjOworI2lmIFRBUkdFVF9MT05HX0JJVFMgPiBUQ0dfVEFSR0VUX1JFR19CSVRTCisgICAgICAgICAgICBwYyA9ICgodWludDY0X3QpYXJnc1sxXSA8PCAzMikgfCBhcmdzWzBdOworI2Vsc2UKKyAgICAgICAgICAgIHBjID0gYXJnc1swXTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCFmaXJzdF9pbnNuKSB7CisgICAgICAgICAgICAgICAgcWVtdV9sb2coIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxZW11X2xvZygiIC0tLS0gMHglIiBQUkl4NjQsIHBjKTsKKyAgICAgICAgICAgIGZpcnN0X2luc24gPSAwOworICAgICAgICAgICAgbmJfb2FyZ3MgPSBkZWYtPm5iX29hcmdzOworICAgICAgICAgICAgbmJfaWFyZ3MgPSBkZWYtPm5iX2lhcmdzOworICAgICAgICAgICAgbmJfY2FyZ3MgPSBkZWYtPm5iX2NhcmdzOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gSU5ERVhfb3BfY2FsbCkgeworICAgICAgICAgICAgVENHQXJnIGFyZzsKKworICAgICAgICAgICAgLyogdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLworICAgICAgICAgICAgYXJnID0gKmFyZ3MrKzsKKyAgICAgICAgICAgIG5iX29hcmdzID0gYXJnID4+IDE2OworICAgICAgICAgICAgbmJfaWFyZ3MgPSBhcmcgJiAweGZmZmY7CisgICAgICAgICAgICBuYl9jYXJncyA9IGRlZi0+bmJfY2FyZ3M7CisKKyAgICAgICAgICAgIHFlbXVfbG9nKCIgJXMgIiwgZGVmLT5uYW1lKTsKKworICAgICAgICAgICAgLyogZnVuY3Rpb24gbmFtZSAqLworICAgICAgICAgICAgcWVtdV9sb2coIiVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tuYl9vYXJncyArIG5iX2lhcmdzIC0gMV0pKTsKKyAgICAgICAgICAgIC8qIGZsYWdzICovCisgICAgICAgICAgICBxZW11X2xvZygiLCQweCUiIFRDR19QUklseCwgYXJnc1tuYl9vYXJncyArIG5iX2lhcmdzXSk7CisgICAgICAgICAgICAvKiBuYiBvdXQgYXJncyAqLworICAgICAgICAgICAgcWVtdV9sb2coIiwkJWQiLCBuYl9vYXJncyk7CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBuYl9vYXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcWVtdV9sb2coIiwiKTsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiJXMiLCB0Y2dfZ2V0X2FyZ19zdHJfaWR4KHMsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAobmJfaWFyZ3MgLSAxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcWVtdV9sb2coIiwiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnc1tuYl9vYXJncyArIGldID09IFRDR19DQUxMX0RVTU1ZX0FSRykgeworICAgICAgICAgICAgICAgICAgICBxZW11X2xvZygiPGR1bW15PiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIlcyIsIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW25iX29hcmdzICsgaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBJTkRFWF9vcF9tb3ZpX2kzMiB8fCBjID09IElOREVYX29wX21vdmlfaTY0KSB7CisgICAgICAgICAgICB0Y2dfdGFyZ2V0X3Vsb25nIHZhbDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAgICAgICAgIG5iX29hcmdzID0gZGVmLT5uYl9vYXJnczsKKyAgICAgICAgICAgIG5iX2lhcmdzID0gZGVmLT5uYl9pYXJnczsKKyAgICAgICAgICAgIG5iX2NhcmdzID0gZGVmLT5uYl9jYXJnczsKKyAgICAgICAgICAgIHFlbXVfbG9nKCIgJXMgJXMsJCIsIGRlZi0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBzaXplb2YoYnVmKSwgYXJnc1swXSkpOworICAgICAgICAgICAgdmFsID0gYXJnc1sxXTsKKyAgICAgICAgICAgIG5hbWUgPSB0Y2dfZmluZF9oZWxwZXIocywgdmFsKTsKKyAgICAgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICAgICAgcWVtdV9sb2coIiVzIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjID09IElOREVYX29wX21vdmlfaTMyKSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIweCV4IiwgKHVpbnQzMl90KXZhbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9sb2coIjB4JSIgUFJJeDY0ICwgKHVpbnQ2NF90KXZhbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcWVtdV9sb2coIiAlcyAiLCBkZWYtPm5hbWUpOworICAgICAgICAgICAgaWYgKGMgPT0gSU5ERVhfb3Bfbm9wbikgeworICAgICAgICAgICAgICAgIC8qIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgICAgICBuYl9jYXJncyA9ICphcmdzOworICAgICAgICAgICAgICAgIG5iX29hcmdzID0gMDsKKyAgICAgICAgICAgICAgICBuYl9pYXJncyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5iX29hcmdzID0gZGVmLT5uYl9vYXJnczsKKyAgICAgICAgICAgICAgICBuYl9pYXJncyA9IGRlZi0+bmJfaWFyZ3M7CisgICAgICAgICAgICAgICAgbmJfY2FyZ3MgPSBkZWYtPm5iX2NhcmdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5iX29hcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIlcyIsIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaysrXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbmJfaWFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChrICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9sb2coIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcWVtdV9sb2coIiVzIiwgdGNnX2dldF9hcmdfc3RyX2lkeChzLCBidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1trKytdKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgSU5ERVhfb3BfYnJjb25kX2kzMjoKKyAgICAgICAgICAgIGNhc2UgSU5ERVhfb3Bfc2V0Y29uZF9pMzI6CisgICAgICAgICAgICBjYXNlIElOREVYX29wX21vdmNvbmRfaTMyOgorICAgICAgICAgICAgY2FzZSBJTkRFWF9vcF9icmNvbmQyX2kzMjoKKyAgICAgICAgICAgIGNhc2UgSU5ERVhfb3Bfc2V0Y29uZDJfaTMyOgorICAgICAgICAgICAgY2FzZSBJTkRFWF9vcF9icmNvbmRfaTY0OgorICAgICAgICAgICAgY2FzZSBJTkRFWF9vcF9zZXRjb25kX2k2NDoKKyAgICAgICAgICAgIGNhc2UgSU5ERVhfb3BfbW92Y29uZF9pNjQ6CisgICAgICAgICAgICAgICAgaWYgKGFyZ3Nba10gPCBBUlJBWV9TSVpFKGNvbmRfbmFtZSkgJiYgY29uZF9uYW1lW2FyZ3Nba11dKSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIsJXMiLCBjb25kX25hbWVbYXJnc1trKytdXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9sb2coIiwkMHglIiBUQ0dfUFJJbHgsIGFyZ3NbaysrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTkRFWF9vcF9xZW11X2xkX2kzMjoKKyAgICAgICAgICAgIGNhc2UgSU5ERVhfb3BfcWVtdV9zdF9pMzI6CisgICAgICAgICAgICBjYXNlIElOREVYX29wX3FlbXVfbGRfaTY0OgorICAgICAgICAgICAgY2FzZSBJTkRFWF9vcF9xZW11X3N0X2k2NDoKKyAgICAgICAgICAgICAgICBpZiAoYXJnc1trXSA8IEFSUkFZX1NJWkUobGRzdF9uYW1lKSAmJiBsZHN0X25hbWVbYXJnc1trXV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9sb2coIiwlcyIsIGxkc3RfbmFtZVthcmdzW2srK11dKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBxZW11X2xvZygiLCQweCUiIFRDR19QUklseCwgYXJnc1trKytdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKDsgaSA8IG5iX2NhcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoayAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHFlbXVfbG9nKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3NbaysrXTsKKyAgICAgICAgICAgICAgICBxZW11X2xvZygiJDB4JSIgVENHX1BSSWx4LCBhcmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworICAgICAgICBhcmdzICs9IG5iX2lhcmdzICsgbmJfb2FyZ3MgKyBuYl9jYXJnczsKKyAgICB9Cit9CisKKy8qIHdlIGdpdmUgbW9yZSBwcmlvcml0eSB0byBjb25zdHJhaW50cyB3aXRoIGxlc3MgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGdldF9jb25zdHJhaW50X3ByaW9yaXR5KGNvbnN0IFRDR09wRGVmICpkZWYsIGludCBrKQoreworICAgIGNvbnN0IFRDR0FyZ0NvbnN0cmFpbnQgKmFyZ19jdDsKKworICAgIGludCBpLCBuOworICAgIGFyZ19jdCA9ICZkZWYtPmFyZ3NfY3Rba107CisgICAgaWYgKGFyZ19jdC0+Y3QgJiBUQ0dfQ1RfQUxJQVMpIHsKKyAgICAgICAgLyogYW4gYWxpYXMgaXMgZXF1aXZhbGVudCB0byBhIHNpbmdsZSByZWdpc3RlciAqLworICAgICAgICBuID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIShhcmdfY3QtPmN0ICYgVENHX0NUX1JFRykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbiA9IDA7CisgICAgICAgIGZvcihpID0gMDsgaSA8IFRDR19UQVJHRVRfTkJfUkVHUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGNnX3JlZ3NldF90ZXN0X3JlZyhhcmdfY3QtPnUucmVncywgaSkpCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBUQ0dfVEFSR0VUX05CX1JFR1MgLSBuICsgMTsKK30KKworLyogc29ydCBmcm9tIGhpZ2hlc3QgcHJpb3JpdHkgdG8gbG93ZXN0ICovCitzdGF0aWMgdm9pZCBzb3J0X2NvbnN0cmFpbnRzKFRDR09wRGVmICpkZWYsIGludCBzdGFydCwgaW50IG4pCit7CisgICAgaW50IGksIGosIHAxLCBwMiwgdG1wOworCisgICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBkZWYtPnNvcnRlZF9hcmdzW3N0YXJ0ICsgaV0gPSBzdGFydCArIGk7CisgICAgaWYgKG4gPD0gMSkKKyAgICAgICAgcmV0dXJuOworICAgIGZvcihpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKKyAgICAgICAgZm9yKGogPSBpICsgMTsgaiA8IG47IGorKykgeworICAgICAgICAgICAgcDEgPSBnZXRfY29uc3RyYWludF9wcmlvcml0eShkZWYsIGRlZi0+c29ydGVkX2FyZ3Nbc3RhcnQgKyBpXSk7CisgICAgICAgICAgICBwMiA9IGdldF9jb25zdHJhaW50X3ByaW9yaXR5KGRlZiwgZGVmLT5zb3J0ZWRfYXJnc1tzdGFydCArIGpdKTsKKyAgICAgICAgICAgIGlmIChwMSA8IHAyKSB7CisgICAgICAgICAgICAgICAgdG1wID0gZGVmLT5zb3J0ZWRfYXJnc1tzdGFydCArIGldOworICAgICAgICAgICAgICAgIGRlZi0+c29ydGVkX2FyZ3Nbc3RhcnQgKyBpXSA9IGRlZi0+c29ydGVkX2FyZ3Nbc3RhcnQgKyBqXTsKKyAgICAgICAgICAgICAgICBkZWYtPnNvcnRlZF9hcmdzW3N0YXJ0ICsgal0gPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdGNnX2FkZF90YXJnZXRfYWRkX29wX2RlZnMoY29uc3QgVENHVGFyZ2V0T3BEZWYgKnRkZWZzKQoreworICAgIFRDR09wY29kZSBvcDsKKyAgICBUQ0dPcERlZiAqZGVmOworICAgIGNvbnN0IGNoYXIgKmN0X3N0cjsKKyAgICBpbnQgaSwgbmJfYXJnczsKKworICAgIGZvcig7OykgeworICAgICAgICBpZiAodGRlZnMtPm9wID09IChUQ0dPcGNvZGUpLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgb3AgPSB0ZGVmcy0+b3A7CisgICAgICAgIGFzc2VydCgodW5zaWduZWQpb3AgPCBOQl9PUFMpOworICAgICAgICBkZWYgPSAmdGNnX29wX2RlZnNbb3BdOworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX1RDRykKKyAgICAgICAgLyogRHVwbGljYXRlIGVudHJ5IGluIG9wIGRlZmluaXRpb25zPyAqLworICAgICAgICBhc3NlcnQoIWRlZi0+dXNlZCk7CisgICAgICAgIGRlZi0+dXNlZCA9IDE7CisjZW5kaWYKKyAgICAgICAgbmJfYXJncyA9IGRlZi0+bmJfaWFyZ3MgKyBkZWYtPm5iX29hcmdzOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBuYl9hcmdzOyBpKyspIHsKKyAgICAgICAgICAgIGN0X3N0ciA9IHRkZWZzLT5hcmdzX2N0X3N0cltpXTsKKyAgICAgICAgICAgIC8qIEluY29tcGxldGUgVENHVGFyZ2V0T3BEZWYgZW50cnk/ICovCisgICAgICAgICAgICBhc3NlcnQoY3Rfc3RyICE9IE5VTEwpOworICAgICAgICAgICAgdGNnX3JlZ3NldF9jbGVhcihkZWYtPmFyZ3NfY3RbaV0udS5yZWdzKTsKKyAgICAgICAgICAgIGRlZi0+YXJnc19jdFtpXS5jdCA9IDA7CisgICAgICAgICAgICBpZiAoY3Rfc3RyWzBdID49ICcwJyAmJiBjdF9zdHJbMF0gPD0gJzknKSB7CisgICAgICAgICAgICAgICAgaW50IG9hcmc7CisgICAgICAgICAgICAgICAgb2FyZyA9IGN0X3N0clswXSAtICcwJzsKKyAgICAgICAgICAgICAgICBhc3NlcnQob2FyZyA8IGRlZi0+bmJfb2FyZ3MpOworICAgICAgICAgICAgICAgIGFzc2VydChkZWYtPmFyZ3NfY3Rbb2FyZ10uY3QgJiBUQ0dfQ1RfUkVHKTsKKyAgICAgICAgICAgICAgICAvKiBUQ0dfQ1RfQUxJQVMgaXMgZm9yIHRoZSBvdXRwdXQgYXJndW1lbnRzLiBUaGUgaW5wdXQKKyAgICAgICAgICAgICAgICAgICBhcmd1bWVudCBpcyB0YWdnZWQgd2l0aCBUQ0dfQ1RfSUFMSUFTLiAqLworICAgICAgICAgICAgICAgIGRlZi0+YXJnc19jdFtpXSA9IGRlZi0+YXJnc19jdFtvYXJnXTsKKyAgICAgICAgICAgICAgICBkZWYtPmFyZ3NfY3Rbb2FyZ10uY3QgPSBUQ0dfQ1RfQUxJQVM7CisgICAgICAgICAgICAgICAgZGVmLT5hcmdzX2N0W29hcmddLmFsaWFzX2luZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBkZWYtPmFyZ3NfY3RbaV0uY3QgfD0gVENHX0NUX0lBTElBUzsKKyAgICAgICAgICAgICAgICBkZWYtPmFyZ3NfY3RbaV0uYWxpYXNfaW5kZXggPSBvYXJnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpjdF9zdHIgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmN0X3N0cikgeworICAgICAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZi0+YXJnc19jdFtpXS5jdCB8PSBUQ0dfQ1RfQ09OU1Q7CisgICAgICAgICAgICAgICAgICAgICAgICBjdF9zdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9wYXJzZV9jb25zdHJhaW50KCZkZWYtPmFyZ3NfY3RbaV0sICZjdF9zdHIpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBjb25zdHJhaW50ICclcycgZm9yIGFyZyAlZCBvZiBvcGVyYXRpb24gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0X3N0ciwgaSwgZGVmLT5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogVENHVGFyZ2V0T3BEZWYgZW50cnkgd2l0aCB0b28gbXVjaCBpbmZvcm1hdGlvbj8gKi8KKyAgICAgICAgYXNzZXJ0KGkgPT0gVENHX01BWF9PUF9BUkdTIHx8IHRkZWZzLT5hcmdzX2N0X3N0cltpXSA9PSBOVUxMKTsKKworICAgICAgICAvKiBzb3J0IHRoZSBjb25zdHJhaW50cyAoWFhYOiB0aGlzIGlzIGp1c3QgYW4gaGV1cmlzdGljKSAqLworICAgICAgICBzb3J0X2NvbnN0cmFpbnRzKGRlZiwgMCwgZGVmLT5uYl9vYXJncyk7CisgICAgICAgIHNvcnRfY29uc3RyYWludHMoZGVmLCBkZWYtPm5iX29hcmdzLCBkZWYtPm5iX2lhcmdzKTsKKworI2lmIDAKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIHByaW50ZigiJXM6IHNvcnRlZD0iLCBkZWYtPm5hbWUpOworICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGVmLT5uYl9vYXJncyArIGRlZi0+bmJfaWFyZ3M7IGkrKykKKyAgICAgICAgICAgICAgICBwcmludGYoIiAlZCIsIGRlZi0+c29ydGVkX2FyZ3NbaV0pOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGRlZnMrKzsKKyAgICB9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19UQ0cpCisgICAgaSA9IDA7CisgICAgZm9yIChvcCA9IDA7IG9wIDwgQVJSQVlfU0laRSh0Y2dfb3BfZGVmcyk7IG9wKyspIHsKKyAgICAgICAgY29uc3QgVENHT3BEZWYgKmRlZiA9ICZ0Y2dfb3BfZGVmc1tvcF07CisgICAgICAgIGlmIChkZWYtPmZsYWdzICYgVENHX09QRl9OT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgLyogV3JvbmcgZW50cnkgaW4gb3AgZGVmaW5pdGlvbnM/ICovCisgICAgICAgICAgICBpZiAoZGVmLT51c2VkKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wIGRlZmluaXRpb24gZm9yICVzXG4iLCBkZWYtPm5hbWUpOworICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTWlzc2luZyBlbnRyeSBpbiBvcCBkZWZpbml0aW9ucz8gKi8KKyAgICAgICAgICAgIGlmICghZGVmLT51c2VkKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIG9wIGRlZmluaXRpb24gZm9yICVzXG4iLCBkZWYtPm5hbWUpOworICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IDEpIHsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorI2VuZGlmCit9CisKKyNpZmRlZiBVU0VfTElWRU5FU1NfQU5BTFlTSVMKKworLyogc2V0IGEgbm9wIGZvciBhbiBvcGVyYXRpb24gdXNpbmcgJ25iX2FyZ3MnICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGNnX3NldF9ub3AoVENHQ29udGV4dCAqcywgdWludDE2X3QgKm9wY19wdHIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR0FyZyAqYXJncywgaW50IG5iX2FyZ3MpCit7CisgICAgaWYgKG5iX2FyZ3MgPT0gMCkgeworICAgICAgICAqb3BjX3B0ciA9IElOREVYX29wX25vcDsKKyAgICB9IGVsc2UgeworICAgICAgICAqb3BjX3B0ciA9IElOREVYX29wX25vcG47CisgICAgICAgIGFyZ3NbMF0gPSBuYl9hcmdzOworICAgICAgICBhcmdzW25iX2FyZ3MgLSAxXSA9IG5iX2FyZ3M7CisgICAgfQorfQorCisvKiBsaXZlbmVzcyBhbmFseXNpczogZW5kIG9mIGZ1bmN0aW9uOiBhbGwgdGVtcHMgYXJlIGRlYWQsIGFuZCBnbG9iYWxzCisgICBzaG91bGQgYmUgaW4gbWVtb3J5LiAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19sYV9mdW5jX2VuZChUQ0dDb250ZXh0ICpzLCB1aW50OF90ICpkZWFkX3RlbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICptZW1fdGVtcHMpCit7CisgICAgbWVtc2V0KGRlYWRfdGVtcHMsIDEsIHMtPm5iX3RlbXBzKTsKKyAgICBtZW1zZXQobWVtX3RlbXBzLCAxLCBzLT5uYl9nbG9iYWxzKTsKKyAgICBtZW1zZXQobWVtX3RlbXBzICsgcy0+bmJfZ2xvYmFscywgMCwgcy0+bmJfdGVtcHMgLSBzLT5uYl9nbG9iYWxzKTsKK30KKworLyogbGl2ZW5lc3MgYW5hbHlzaXM6IGVuZCBvZiBiYXNpYyBibG9jazogYWxsIHRlbXBzIGFyZSBkZWFkLCBnbG9iYWxzCisgICBhbmQgbG9jYWwgdGVtcHMgc2hvdWxkIGJlIGluIG1lbW9yeS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0Y2dfbGFfYmJfZW5kKFRDR0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRlYWRfdGVtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICptZW1fdGVtcHMpCit7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQoZGVhZF90ZW1wcywgMSwgcy0+bmJfdGVtcHMpOworICAgIG1lbXNldChtZW1fdGVtcHMsIDEsIHMtPm5iX2dsb2JhbHMpOworICAgIGZvcihpID0gcy0+bmJfZ2xvYmFsczsgaSA8IHMtPm5iX3RlbXBzOyBpKyspIHsKKyAgICAgICAgbWVtX3RlbXBzW2ldID0gcy0+dGVtcHNbaV0udGVtcF9sb2NhbDsKKyAgICB9Cit9CisKKy8qIExpdmVuZXNzIGFuYWx5c2lzIDogdXBkYXRlIHRoZSBvcGNfZGVhZF9hcmdzIGFycmF5IHRvIHRlbGwgaWYgYQorICAgZ2l2ZW4gaW5wdXQgYXJndW1lbnRzIGlzIGRlYWQuIEluc3RydWN0aW9ucyB1cGRhdGluZyBkZWFkCisgICB0ZW1wb3JhcmllcyBhcmUgcmVtb3ZlZC4gKi8KK3N0YXRpYyB2b2lkIHRjZ19saXZlbmVzc19hbmFseXNpcyhUQ0dDb250ZXh0ICpzKQoreworICAgIGludCBpLCBvcF9pbmRleCwgbmJfYXJncywgbmJfaWFyZ3MsIG5iX29hcmdzLCBhcmcsIG5iX29wczsKKyAgICBUQ0dPcGNvZGUgb3AsIG9wX25ldywgb3BfbmV3MjsKKyAgICBUQ0dBcmcgKmFyZ3M7CisgICAgY29uc3QgVENHT3BEZWYgKmRlZjsKKyAgICB1aW50OF90ICpkZWFkX3RlbXBzLCAqbWVtX3RlbXBzOworICAgIHVpbnQxNl90IGRlYWRfYXJnczsKKyAgICB1aW50OF90IHN5bmNfYXJnczsKKyAgICBib29sIGhhdmVfb3BfbmV3MjsKKyAgICAKKyAgICBzLT5nZW5fb3BjX3B0cisrOyAvKiBza2lwIGVuZCAqLworCisgICAgbmJfb3BzID0gcy0+Z2VuX29wY19wdHIgLSBzLT5nZW5fb3BjX2J1ZjsKKworICAgIHMtPm9wX2RlYWRfYXJncyA9IHRjZ19tYWxsb2MobmJfb3BzICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgcy0+b3Bfc3luY19hcmdzID0gdGNnX21hbGxvYyhuYl9vcHMgKiBzaXplb2YodWludDhfdCkpOworICAgIAorICAgIGRlYWRfdGVtcHMgPSB0Y2dfbWFsbG9jKHMtPm5iX3RlbXBzKTsKKyAgICBtZW1fdGVtcHMgPSB0Y2dfbWFsbG9jKHMtPm5iX3RlbXBzKTsKKyAgICB0Y2dfbGFfZnVuY19lbmQocywgZGVhZF90ZW1wcywgbWVtX3RlbXBzKTsKKworICAgIGFyZ3MgPSBzLT5nZW5fb3BwYXJhbV9wdHI7CisgICAgb3BfaW5kZXggPSBuYl9vcHMgLSAxOworICAgIHdoaWxlIChvcF9pbmRleCA+PSAwKSB7CisgICAgICAgIG9wID0gcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdOworICAgICAgICBkZWYgPSAmdGNnX29wX2RlZnNbb3BdOworICAgICAgICBzd2l0Y2gob3ApIHsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9jYWxsOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjYWxsX2ZsYWdzOworCisgICAgICAgICAgICAgICAgbmJfYXJncyA9IGFyZ3NbLTFdOworICAgICAgICAgICAgICAgIGFyZ3MgLT0gbmJfYXJnczsKKyAgICAgICAgICAgICAgICBuYl9pYXJncyA9IGFyZ3NbMF0gJiAweGZmZmY7CisgICAgICAgICAgICAgICAgbmJfb2FyZ3MgPSBhcmdzWzBdID4+IDE2OworICAgICAgICAgICAgICAgIGFyZ3MrKzsKKyAgICAgICAgICAgICAgICBjYWxsX2ZsYWdzID0gYXJnc1tuYl9vYXJncyArIG5iX2lhcmdzXTsKKworICAgICAgICAgICAgICAgIC8qIHB1cmUgZnVuY3Rpb25zIGNhbiBiZSByZW1vdmVkIGlmIHRoZWlyIHJlc3VsdCBpcyBub3QKKyAgICAgICAgICAgICAgICAgICB1c2VkICovCisgICAgICAgICAgICAgICAgaWYgKGNhbGxfZmxhZ3MgJiBUQ0dfQ0FMTF9OT19TSURFX0VGRkVDVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbmJfb2FyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVhZF90ZW1wc1thcmddIHx8IG1lbV90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb19ub3RfcmVtb3ZlX2NhbGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGNnX3NldF9ub3Aocywgcy0+Z2VuX29wY19idWYgKyBvcF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyAtIDEsIG5iX2FyZ3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG9fbm90X3JlbW92ZV9jYWxsOgorCisgICAgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBhcmdzIGFyZSBkZWFkICovCisgICAgICAgICAgICAgICAgICAgIGRlYWRfYXJncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHN5bmNfYXJncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IG5iX29hcmdzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhZF9hcmdzIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbV90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19hcmdzIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGVhZF90ZW1wc1thcmddID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbV90ZW1wc1thcmddID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghKGNhbGxfZmxhZ3MgJiBUQ0dfQ0FMTF9OT19SRUFEX0dMT0JBTFMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWxzIHNob3VsZCBiZSBzeW5jZWQgdG8gbWVtb3J5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobWVtX3RlbXBzLCAxLCBzLT5uYl9nbG9iYWxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIShjYWxsX2ZsYWdzICYgKFRDR19DQUxMX05PX1dSSVRFX0dMT0JBTFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDR19DQUxMX05PX1JFQURfR0xPQkFMUykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbG9iYWxzIHNob3VsZCBnbyBiYWNrIHRvIG1lbW9yeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGRlYWRfdGVtcHMsIDEsIHMtPm5iX2dsb2JhbHMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgYXJncyBhcmUgbGl2ZSAqLworICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IG5iX29hcmdzOyBpIDwgbmJfaWFyZ3MgKyBuYl9vYXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyAhPSBUQ0dfQ0FMTF9EVU1NWV9BUkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWRfYXJncyB8PSAoMSA8PCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhZF90ZW1wc1thcmddID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5vcF9kZWFkX2FyZ3Nbb3BfaW5kZXhdID0gZGVhZF9hcmdzOworICAgICAgICAgICAgICAgICAgICBzLT5vcF9zeW5jX2FyZ3Nbb3BfaW5kZXhdID0gc3luY19hcmdzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhcmdzLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9kZWJ1Z19pbnNuX3N0YXJ0OgorICAgICAgICAgICAgYXJncyAtPSBkZWYtPm5iX2FyZ3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9ub3BuOgorICAgICAgICAgICAgbmJfYXJncyA9IGFyZ3NbLTFdOworICAgICAgICAgICAgYXJncyAtPSBuYl9hcmdzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfZGlzY2FyZDoKKyAgICAgICAgICAgIGFyZ3MtLTsKKyAgICAgICAgICAgIC8qIG1hcmsgdGhlIHRlbXBvcmFyeSBhcyBkZWFkICovCisgICAgICAgICAgICBkZWFkX3RlbXBzW2FyZ3NbMF1dID0gMTsKKyAgICAgICAgICAgIG1lbV90ZW1wc1thcmdzWzBdXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9lbmQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIElOREVYX29wX2FkZDJfaTMyOgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3BfYWRkX2kzMjsKKyAgICAgICAgICAgIGdvdG8gZG9fYWRkc3ViMjsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9zdWIyX2kzMjoKKyAgICAgICAgICAgIG9wX25ldyA9IElOREVYX29wX3N1Yl9pMzI7CisgICAgICAgICAgICBnb3RvIGRvX2FkZHN1YjI7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfYWRkMl9pNjQ6CisgICAgICAgICAgICBvcF9uZXcgPSBJTkRFWF9vcF9hZGRfaTY0OworICAgICAgICAgICAgZ290byBkb19hZGRzdWIyOworICAgICAgICBjYXNlIElOREVYX29wX3N1YjJfaTY0OgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3Bfc3ViX2k2NDsKKyAgICAgICAgZG9fYWRkc3ViMjoKKyAgICAgICAgICAgIGFyZ3MgLT0gNjsKKyAgICAgICAgICAgIG5iX2lhcmdzID0gNDsKKyAgICAgICAgICAgIG5iX29hcmdzID0gMjsKKyAgICAgICAgICAgIC8qIFRlc3QgaWYgdGhlIGhpZ2ggcGFydCBvZiB0aGUgb3BlcmF0aW9uIGlzIGRlYWQsIGJ1dCBub3QKKyAgICAgICAgICAgICAgIHRoZSBsb3cgcGFydC4gIFRoZSByZXN1bHQgY2FuIGJlIG9wdGltaXplZCB0byBhIHNpbXBsZQorICAgICAgICAgICAgICAgYWRkIG9yIHN1Yi4gIFRoaXMgaGFwcGVucyBvZnRlbiBmb3IgeDg2XzY0IGd1ZXN0IHdoZW4gdGhlCisgICAgICAgICAgICAgICBjcHUgbW9kZSBpcyBzZXQgdG8gMzIgYml0LiAgKi8KKyAgICAgICAgICAgIGlmIChkZWFkX3RlbXBzW2FyZ3NbMV1dICYmICFtZW1fdGVtcHNbYXJnc1sxXV0pIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmdzWzBdXSAmJiAhbWVtX3RlbXBzW2FyZ3NbMF1dKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9fcmVtb3ZlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIHNpbmdsZSBvcGVyYXRpb24gcGx1cyBub3AuICAqLworICAgICAgICAgICAgICAgIHMtPmdlbl9vcGNfYnVmW29wX2luZGV4XSA9IG9wID0gb3BfbmV3OworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBhcmdzWzJdOworICAgICAgICAgICAgICAgIGFyZ3NbMl0gPSBhcmdzWzRdOworICAgICAgICAgICAgICAgIGFzc2VydChzLT5nZW5fb3BjX2J1ZltvcF9pbmRleCArIDFdID09IElOREVYX29wX25vcCk7CisgICAgICAgICAgICAgICAgdGNnX3NldF9ub3Aocywgcy0+Z2VuX29wY19idWYgKyBvcF9pbmRleCArIDEsIGFyZ3MgKyAzLCAzKTsKKyAgICAgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggYW5kIG1hcmsgdGhlIHNpbmdsZS13b3JkIG9wZXJhdGlvbiBsaXZlLiAgKi8KKyAgICAgICAgICAgICAgICBuYl9pYXJncyA9IDI7CisgICAgICAgICAgICAgICAgbmJfb2FyZ3MgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBkb19ub3RfcmVtb3ZlOworCisgICAgICAgIGNhc2UgSU5ERVhfb3BfbXVsdTJfaTMyOgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3BfbXVsX2kzMjsKKyAgICAgICAgICAgIG9wX25ldzIgPSBJTkRFWF9vcF9tdWx1aF9pMzI7CisgICAgICAgICAgICBoYXZlX29wX25ldzIgPSBUQ0dfVEFSR0VUX0hBU19tdWx1aF9pMzI7CisgICAgICAgICAgICBnb3RvIGRvX211bDI7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbXVsczJfaTMyOgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3BfbXVsX2kzMjsKKyAgICAgICAgICAgIG9wX25ldzIgPSBJTkRFWF9vcF9tdWxzaF9pMzI7CisgICAgICAgICAgICBoYXZlX29wX25ldzIgPSBUQ0dfVEFSR0VUX0hBU19tdWxzaF9pMzI7CisgICAgICAgICAgICBnb3RvIGRvX211bDI7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbXVsdTJfaTY0OgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3BfbXVsX2k2NDsKKyAgICAgICAgICAgIG9wX25ldzIgPSBJTkRFWF9vcF9tdWx1aF9pNjQ7CisgICAgICAgICAgICBoYXZlX29wX25ldzIgPSBUQ0dfVEFSR0VUX0hBU19tdWx1aF9pNjQ7CisgICAgICAgICAgICBnb3RvIGRvX211bDI7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbXVsczJfaTY0OgorICAgICAgICAgICAgb3BfbmV3ID0gSU5ERVhfb3BfbXVsX2k2NDsKKyAgICAgICAgICAgIG9wX25ldzIgPSBJTkRFWF9vcF9tdWxzaF9pNjQ7CisgICAgICAgICAgICBoYXZlX29wX25ldzIgPSBUQ0dfVEFSR0VUX0hBU19tdWxzaF9pNjQ7CisgICAgICAgICAgICBnb3RvIGRvX211bDI7CisgICAgICAgIGRvX211bDI6CisgICAgICAgICAgICBhcmdzIC09IDQ7CisgICAgICAgICAgICBuYl9pYXJncyA9IDI7CisgICAgICAgICAgICBuYl9vYXJncyA9IDI7CisgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmdzWzFdXSAmJiAhbWVtX3RlbXBzW2FyZ3NbMV1dKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlYWRfdGVtcHNbYXJnc1swXV0gJiYgIW1lbV90ZW1wc1thcmdzWzBdXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBCb3RoIHBhcnRzIG9mIHRoZSBvcGVyYXRpb24gYXJlIGRlYWQuICAqLworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX3JlbW92ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogVGhlIGhpZ2ggcGFydCBvZiB0aGUgb3BlcmF0aW9uIGlzIGRlYWQ7IGdlbmVyYXRlIHRoZSBsb3cuICovCisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gb3AgPSBvcF9uZXc7CisgICAgICAgICAgICAgICAgYXJnc1sxXSA9IGFyZ3NbMl07CisgICAgICAgICAgICAgICAgYXJnc1syXSA9IGFyZ3NbM107CisgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVfb3BfbmV3MiAmJiBkZWFkX3RlbXBzW2FyZ3NbMF1dCisgICAgICAgICAgICAgICAgICAgICAgICYmICFtZW1fdGVtcHNbYXJnc1swXV0pIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgbG93IHBhcnQgb2YgdGhlIG9wZXJhdGlvbiBpcyBkZWFkOyBnZW5lcmF0ZSB0aGUgaGlnaC4gICovCisgICAgICAgICAgICAgICAgcy0+Z2VuX29wY19idWZbb3BfaW5kZXhdID0gb3AgPSBvcF9uZXcyOworICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBhcmdzWzFdOworICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBhcmdzWzJdOworICAgICAgICAgICAgICAgIGFyZ3NbMl0gPSBhcmdzWzNdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX25vdF9yZW1vdmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQocy0+Z2VuX29wY19idWZbb3BfaW5kZXggKyAxXSA9PSBJTkRFWF9vcF9ub3ApOworICAgICAgICAgICAgdGNnX3NldF9ub3Aocywgcy0+Z2VuX29wY19idWYgKyBvcF9pbmRleCArIDEsIGFyZ3MgKyAzLCAxKTsKKyAgICAgICAgICAgIC8qIE1hcmsgdGhlIHNpbmdsZS13b3JkIG9wZXJhdGlvbiBsaXZlLiAgKi8KKyAgICAgICAgICAgIG5iX29hcmdzID0gMTsKKyAgICAgICAgICAgIGdvdG8gZG9fbm90X3JlbW92ZTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogWFhYOiBvcHRpbWl6ZSBieSBoYXJkY29kaW5nIGNvbW1vbiBjYXNlcyAoZS5nLiB0cmlhZGljIG9wcykgKi8KKyAgICAgICAgICAgIGFyZ3MgLT0gZGVmLT5uYl9hcmdzOworICAgICAgICAgICAgbmJfaWFyZ3MgPSBkZWYtPm5iX2lhcmdzOworICAgICAgICAgICAgbmJfb2FyZ3MgPSBkZWYtPm5iX29hcmdzOworCisgICAgICAgICAgICAvKiBUZXN0IGlmIHRoZSBvcGVyYXRpb24gY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBhbGwKKyAgICAgICAgICAgICAgIGl0cyBvdXRwdXRzIGFyZSBkZWFkLiBXZSBhc3N1bWUgdGhhdCBuYl9vYXJncyA9PSAwCisgICAgICAgICAgICAgICBpbXBsaWVzIHNpZGUgZWZmZWN0cyAqLworICAgICAgICAgICAgaWYgKCEoZGVmLT5mbGFncyAmIFRDR19PUEZfU0lERV9FRkZFQ1RTKSAmJiBuYl9vYXJncyAhPSAwKSB7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbmJfb2FyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRlYWRfdGVtcHNbYXJnXSB8fCBtZW1fdGVtcHNbYXJnXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb19ub3RfcmVtb3ZlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9fcmVtb3ZlOgorICAgICAgICAgICAgICAgIHRjZ19zZXRfbm9wKHMsIHMtPmdlbl9vcGNfYnVmICsgb3BfaW5kZXgsIGFyZ3MsIGRlZi0+bmJfYXJncyk7CisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgICAgICAgICAgICAgcy0+ZGVsX29wX2NvdW50Kys7CisjZW5kaWYKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb19ub3RfcmVtb3ZlOgorCisgICAgICAgICAgICAgICAgLyogb3V0cHV0IGFyZ3MgYXJlIGRlYWQgKi8KKyAgICAgICAgICAgICAgICBkZWFkX2FyZ3MgPSAwOworICAgICAgICAgICAgICAgIHN5bmNfYXJncyA9IDA7CisgICAgICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgbmJfb2FyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWFkX2FyZ3MgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbV90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2FyZ3MgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVhZF90ZW1wc1thcmddID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbWVtX3RlbXBzW2FyZ10gPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGlmIGVuZCBvZiBiYXNpYyBibG9jaywgdXBkYXRlICovCisgICAgICAgICAgICAgICAgaWYgKGRlZi0+ZmxhZ3MgJiBUQ0dfT1BGX0JCX0VORCkgeworICAgICAgICAgICAgICAgICAgICB0Y2dfbGFfYmJfZW5kKHMsIGRlYWRfdGVtcHMsIG1lbV90ZW1wcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWYtPmZsYWdzICYgVENHX09QRl9TSURFX0VGRkVDVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZ2xvYmFscyBzaG91bGQgYmUgc3luY2VkIHRvIG1lbW9yeSAqLworICAgICAgICAgICAgICAgICAgICBtZW1zZXQobWVtX3RlbXBzLCAxLCBzLT5uYl9nbG9iYWxzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBpbnB1dCBhcmdzIGFyZSBsaXZlICovCisgICAgICAgICAgICAgICAgZm9yKGkgPSBuYl9vYXJnczsgaSA8IG5iX29hcmdzICsgbmJfaWFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdzW2ldOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVhZF90ZW1wc1thcmddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWFkX2FyZ3MgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVhZF90ZW1wc1thcmddID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+b3BfZGVhZF9hcmdzW29wX2luZGV4XSA9IGRlYWRfYXJnczsKKyAgICAgICAgICAgICAgICBzLT5vcF9zeW5jX2FyZ3Nbb3BfaW5kZXhdID0gc3luY19hcmdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgb3BfaW5kZXgtLTsKKyAgICB9CisKKyAgICBpZiAoYXJncyAhPSBzLT5nZW5fb3BwYXJhbV9idWYpIHsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorfQorI2Vsc2UKKy8qIGR1bW15IGxpdmVuZXNzIGFuYWx5c2lzICovCitzdGF0aWMgdm9pZCB0Y2dfbGl2ZW5lc3NfYW5hbHlzaXMoVENHQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbmJfb3BzOworICAgIG5iX29wcyA9IHMtPmdlbl9vcGNfcHRyIC0gcy0+Z2VuX29wY19idWY7CisKKyAgICBzLT5vcF9kZWFkX2FyZ3MgPSB0Y2dfbWFsbG9jKG5iX29wcyAqIHNpemVvZih1aW50MTZfdCkpOworICAgIG1lbXNldChzLT5vcF9kZWFkX2FyZ3MsIDAsIG5iX29wcyAqIHNpemVvZih1aW50MTZfdCkpOworICAgIHMtPm9wX3N5bmNfYXJncyA9IHRjZ19tYWxsb2MobmJfb3BzICogc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBtZW1zZXQocy0+b3Bfc3luY19hcmdzLCAwLCBuYl9vcHMgKiBzaXplb2YodWludDhfdCkpOworfQorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgdm9pZCBkdW1wX3JlZ3MoVENHQ29udGV4dCAqcykKK3sKKyAgICBUQ0dUZW1wICp0czsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBmb3IoaSA9IDA7IGkgPCBzLT5uYl90ZW1wczsgaSsrKSB7CisgICAgICAgIHRzID0gJnMtPnRlbXBzW2ldOworICAgICAgICBwcmludGYoIiAgJTEwczogIiwgdGNnX2dldF9hcmdfc3RyX2lkeChzLCBidWYsIHNpemVvZihidWYpLCBpKSk7CisgICAgICAgIHN3aXRjaCh0cy0+dmFsX3R5cGUpIHsKKyAgICAgICAgY2FzZSBURU1QX1ZBTF9SRUc6CisgICAgICAgICAgICBwcmludGYoIiVzIiwgdGNnX3RhcmdldF9yZWdfbmFtZXNbdHMtPnJlZ10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEVNUF9WQUxfTUVNOgorICAgICAgICAgICAgcHJpbnRmKCIlZCglcykiLCAoaW50KXRzLT5tZW1fb2Zmc2V0LCB0Y2dfdGFyZ2V0X3JlZ19uYW1lc1t0cy0+bWVtX3JlZ10pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVEVNUF9WQUxfQ09OU1Q6CisgICAgICAgICAgICBwcmludGYoIiQweCUiIFRDR19QUklseCwgdHMtPnZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURU1QX1ZBTF9ERUFEOgorICAgICAgICAgICAgcHJpbnRmKCJEIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiPz8/Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgVENHX1RBUkdFVF9OQl9SRUdTOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnJlZ190b190ZW1wW2ldID49IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCAKKyAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X3JlZ19uYW1lc1tpXSwgCisgICAgICAgICAgICAgICAgICAgdGNnX2dldF9hcmdfc3RyX2lkeChzLCBidWYsIHNpemVvZihidWYpLCBzLT5yZWdfdG9fdGVtcFtpXSkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19yZWdzKFRDR0NvbnRleHQgKnMpCit7CisgICAgaW50IHJlZywgazsKKyAgICBUQ0dUZW1wICp0czsKKyAgICBjaGFyIGJ1Zls2NF07CisKKyAgICBmb3IocmVnID0gMDsgcmVnIDwgVENHX1RBUkdFVF9OQl9SRUdTOyByZWcrKykgeworICAgICAgICBrID0gcy0+cmVnX3RvX3RlbXBbcmVnXTsKKyAgICAgICAgaWYgKGsgPj0gMCkgeworICAgICAgICAgICAgdHMgPSAmcy0+dGVtcHNba107CisgICAgICAgICAgICBpZiAodHMtPnZhbF90eXBlICE9IFRFTVBfVkFMX1JFRyB8fAorICAgICAgICAgICAgICAgIHRzLT5yZWcgIT0gcmVnKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJJbmNvbnNpc3RlbmN5IGZvciByZWdpc3RlciAlczpcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICB0Y2dfdGFyZ2V0X3JlZ19uYW1lc1tyZWddKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yKGsgPSAwOyBrIDwgcy0+bmJfdGVtcHM7IGsrKykgeworICAgICAgICB0cyA9ICZzLT50ZW1wc1trXTsKKyAgICAgICAgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcgJiYKKyAgICAgICAgICAgICF0cy0+Zml4ZWRfcmVnICYmCisgICAgICAgICAgICBzLT5yZWdfdG9fdGVtcFt0cy0+cmVnXSAhPSBrKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJJbmNvbnNpc3RlbmN5IGZvciB0ZW1wICVzOlxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgIHRjZ19nZXRfYXJnX3N0cl9pZHgocywgYnVmLCBzaXplb2YoYnVmKSwgaykpOworICAgICAgICBmYWlsOgorICAgICAgICAgICAgICAgIHByaW50ZigicmVnIHN0YXRlOlxuIik7CisgICAgICAgICAgICAgICAgZHVtcF9yZWdzKHMpOworICAgICAgICAgICAgICAgIHRjZ19hYm9ydCgpOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHRlbXBfYWxsb2NhdGVfZnJhbWUoVENHQ29udGV4dCAqcywgaW50IHRlbXApCit7CisgICAgVENHVGVtcCAqdHM7CisgICAgdHMgPSAmcy0+dGVtcHNbdGVtcF07CisjaWYgIShkZWZpbmVkKF9fc3BhcmNfXykgJiYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NCkKKyAgICAvKiBTcGFyYzY0IHN0YWNrIGlzIGFjY2Vzc2VkIHdpdGggb2Zmc2V0IG9mIDIwNDcgKi8KKyAgICBzLT5jdXJyZW50X2ZyYW1lX29mZnNldCA9IChzLT5jdXJyZW50X2ZyYW1lX29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRjZ190YXJnZXRfbG9uZylzaXplb2YodGNnX3RhcmdldF9sb25nKSAtIDEpICYKKyAgICAgICAgfihzaXplb2YodGNnX3RhcmdldF9sb25nKSAtIDEpOworI2VuZGlmCisgICAgaWYgKHMtPmN1cnJlbnRfZnJhbWVfb2Zmc2V0ICsgKHRjZ190YXJnZXRfbG9uZylzaXplb2YodGNnX3RhcmdldF9sb25nKSA+CisgICAgICAgIHMtPmZyYW1lX2VuZCkgeworICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICB9CisgICAgdHMtPm1lbV9vZmZzZXQgPSBzLT5jdXJyZW50X2ZyYW1lX29mZnNldDsKKyAgICB0cy0+bWVtX3JlZyA9IHMtPmZyYW1lX3JlZzsKKyAgICB0cy0+bWVtX2FsbG9jYXRlZCA9IDE7CisgICAgcy0+Y3VycmVudF9mcmFtZV9vZmZzZXQgKz0gc2l6ZW9mKHRjZ190YXJnZXRfbG9uZyk7Cit9CisKKy8qIHN5bmMgcmVnaXN0ZXIgJ3JlZycgYnkgc2F2aW5nIGl0IHRvIHRoZSBjb3JyZXNwb25kaW5nIHRlbXBvcmFyeSAqLworc3RhdGljIGlubGluZSB2b2lkIHRjZ19yZWdfc3luYyhUQ0dDb250ZXh0ICpzLCBpbnQgcmVnKQoreworICAgIFRDR1RlbXAgKnRzOworICAgIGludCB0ZW1wOworCisgICAgdGVtcCA9IHMtPnJlZ190b190ZW1wW3JlZ107CisgICAgdHMgPSAmcy0+dGVtcHNbdGVtcF07CisgICAgYXNzZXJ0KHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpOworICAgIGlmICghdHMtPm1lbV9jb2hlcmVudCAmJiAhdHMtPmZpeGVkX3JlZykgeworICAgICAgICBpZiAoIXRzLT5tZW1fYWxsb2NhdGVkKSB7CisgICAgICAgICAgICB0ZW1wX2FsbG9jYXRlX2ZyYW1lKHMsIHRlbXApOworICAgICAgICB9CisgICAgICAgIHRjZ19vdXRfc3QocywgdHMtPnR5cGUsIHJlZywgdHMtPm1lbV9yZWcsIHRzLT5tZW1fb2Zmc2V0KTsKKyAgICB9CisgICAgdHMtPm1lbV9jb2hlcmVudCA9IDE7Cit9CisKKy8qIGZyZWUgcmVnaXN0ZXIgJ3JlZycgYnkgc3BpbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgdGVtcG9yYXJ5IGlmIG5lY2Vzc2FyeSAqLworc3RhdGljIHZvaWQgdGNnX3JlZ19mcmVlKFRDR0NvbnRleHQgKnMsIGludCByZWcpCit7CisgICAgaW50IHRlbXA7CisKKyAgICB0ZW1wID0gcy0+cmVnX3RvX3RlbXBbcmVnXTsKKyAgICBpZiAodGVtcCAhPSAtMSkgeworICAgICAgICB0Y2dfcmVnX3N5bmMocywgcmVnKTsKKyAgICAgICAgcy0+dGVtcHNbdGVtcF0udmFsX3R5cGUgPSBURU1QX1ZBTF9NRU07CisgICAgICAgIHMtPnJlZ190b190ZW1wW3JlZ10gPSAtMTsKKyAgICB9Cit9CisKKy8qIEFsbG9jYXRlIGEgcmVnaXN0ZXIgYmVsb25naW5nIHRvIHJlZzEgJiB+cmVnMiAqLworc3RhdGljIGludCB0Y2dfcmVnX2FsbG9jKFRDR0NvbnRleHQgKnMsIFRDR1JlZ1NldCByZWcxLCBUQ0dSZWdTZXQgcmVnMikKK3sKKyAgICBpbnQgaSwgcmVnOworICAgIFRDR1JlZ1NldCByZWdfY3Q7CisKKyAgICB0Y2dfcmVnc2V0X2FuZG5vdChyZWdfY3QsIHJlZzEsIHJlZzIpOworCisgICAgLyogZmlyc3QgdHJ5IGZyZWUgcmVnaXN0ZXJzICovCisgICAgZm9yKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0Y2dfdGFyZ2V0X3JlZ19hbGxvY19vcmRlcik7IGkrKykgeworICAgICAgICByZWcgPSB0Y2dfdGFyZ2V0X3JlZ19hbGxvY19vcmRlcltpXTsKKyAgICAgICAgaWYgKHRjZ19yZWdzZXRfdGVzdF9yZWcocmVnX2N0LCByZWcpICYmIHMtPnJlZ190b190ZW1wW3JlZ10gPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gcmVnOworICAgIH0KKworICAgIC8qIFhYWDogZG8gYmV0dGVyIHNwaWxsIGNob2ljZSAqLworICAgIGZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUodGNnX3RhcmdldF9yZWdfYWxsb2Nfb3JkZXIpOyBpKyspIHsKKyAgICAgICAgcmVnID0gdGNnX3RhcmdldF9yZWdfYWxsb2Nfb3JkZXJbaV07CisgICAgICAgIGlmICh0Y2dfcmVnc2V0X3Rlc3RfcmVnKHJlZ19jdCwgcmVnKSkgeworICAgICAgICAgICAgdGNnX3JlZ19mcmVlKHMsIHJlZyk7CisgICAgICAgICAgICByZXR1cm4gcmVnOworICAgICAgICB9CisgICAgfQorCisgICAgdGNnX2Fib3J0KCk7Cit9CisKKy8qIG1hcmsgYSB0ZW1wb3JhcnkgYXMgZGVhZC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZW1wX2RlYWQoVENHQ29udGV4dCAqcywgaW50IHRlbXApCit7CisgICAgVENHVGVtcCAqdHM7CisKKyAgICB0cyA9ICZzLT50ZW1wc1t0ZW1wXTsKKyAgICBpZiAoIXRzLT5maXhlZF9yZWcpIHsKKyAgICAgICAgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpIHsKKyAgICAgICAgICAgIHMtPnJlZ190b190ZW1wW3RzLT5yZWddID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlbXAgPCBzLT5uYl9nbG9iYWxzIHx8IHRzLT50ZW1wX2xvY2FsKSB7CisgICAgICAgICAgICB0cy0+dmFsX3R5cGUgPSBURU1QX1ZBTF9NRU07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cy0+dmFsX3R5cGUgPSBURU1QX1ZBTF9ERUFEOworICAgICAgICB9CisgICAgfQorfQorCisvKiBzeW5jIGEgdGVtcG9yYXJ5IHRvIG1lbW9yeS4gJ2FsbG9jYXRlZF9yZWdzJyBpcyB1c2VkIGluIGNhc2UgYQorICAgdGVtcG9yYXJ5IHJlZ2lzdGVycyBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgdG8gc3RvcmUgYSBjb25zdGFudC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZW1wX3N5bmMoVENHQ29udGV4dCAqcywgaW50IHRlbXAsIFRDR1JlZ1NldCBhbGxvY2F0ZWRfcmVncykKK3sKKyAgICBUQ0dUZW1wICp0czsKKworICAgIHRzID0gJnMtPnRlbXBzW3RlbXBdOworICAgIGlmICghdHMtPmZpeGVkX3JlZykgeworICAgICAgICBzd2l0Y2godHMtPnZhbF90eXBlKSB7CisgICAgICAgIGNhc2UgVEVNUF9WQUxfQ09OU1Q6CisgICAgICAgICAgICB0cy0+cmVnID0gdGNnX3JlZ19hbGxvYyhzLCB0Y2dfdGFyZ2V0X2F2YWlsYWJsZV9yZWdzW3RzLT50eXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9yZWdzKTsKKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX1JFRzsKKyAgICAgICAgICAgIHMtPnJlZ190b190ZW1wW3RzLT5yZWddID0gdGVtcDsKKyAgICAgICAgICAgIHRzLT5tZW1fY29oZXJlbnQgPSAwOworICAgICAgICAgICAgdGNnX291dF9tb3ZpKHMsIHRzLT50eXBlLCB0cy0+cmVnLCB0cy0+dmFsKTsKKyAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoKi8KKyAgICAgICAgY2FzZSBURU1QX1ZBTF9SRUc6CisgICAgICAgICAgICB0Y2dfcmVnX3N5bmMocywgdHMtPnJlZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURU1QX1ZBTF9ERUFEOgorICAgICAgICBjYXNlIFRFTVBfVkFMX01FTToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIHNhdmUgYSB0ZW1wb3JhcnkgdG8gbWVtb3J5LiAnYWxsb2NhdGVkX3JlZ3MnIGlzIHVzZWQgaW4gY2FzZSBhCisgICB0ZW1wb3JhcnkgcmVnaXN0ZXJzIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCB0byBzdG9yZSBhIGNvbnN0YW50LiAqLworc3RhdGljIGlubGluZSB2b2lkIHRlbXBfc2F2ZShUQ0dDb250ZXh0ICpzLCBpbnQgdGVtcCwgVENHUmVnU2V0IGFsbG9jYXRlZF9yZWdzKQoreworI2lmZGVmIFVTRV9MSVZFTkVTU19BTkFMWVNJUworICAgIC8qIFRoZSBsaXZlbmVzcyBhbmFseXNpcyBhbHJlYWR5IGVuc3VyZXMgdGhhdCBnbG9iYWxzIGFyZSBiYWNrCisgICAgICAgaW4gbWVtb3J5LiBLZWVwIGFuIGFzc2VydCBmb3Igc2FmZXR5LiAqLworICAgIGFzc2VydChzLT50ZW1wc1t0ZW1wXS52YWxfdHlwZSA9PSBURU1QX1ZBTF9NRU0gfHwgcy0+dGVtcHNbdGVtcF0uZml4ZWRfcmVnKTsKKyNlbHNlCisgICAgdGVtcF9zeW5jKHMsIHRlbXAsIGFsbG9jYXRlZF9yZWdzKTsKKyAgICB0ZW1wX2RlYWQocywgdGVtcCk7CisjZW5kaWYKK30KKworLyogc2F2ZSBnbG9iYWxzIHRvIHRoZWlyIGNhbm9uaWNhbCBsb2NhdGlvbiBhbmQgYXNzdW1lIHRoZXkgY2FuIGJlCisgICBtb2RpZmllZCBiZSB0aGUgZm9sbG93aW5nIGNvZGUuICdhbGxvY2F0ZWRfcmVncycgaXMgdXNlZCBpbiBjYXNlIGEKKyAgIHRlbXBvcmFyeSByZWdpc3RlcnMgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIHRvIHN0b3JlIGEgY29uc3RhbnQuICovCitzdGF0aWMgdm9pZCBzYXZlX2dsb2JhbHMoVENHQ29udGV4dCAqcywgVENHUmVnU2V0IGFsbG9jYXRlZF9yZWdzKQoreworICAgIGludCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgcy0+bmJfZ2xvYmFsczsgaSsrKSB7CisgICAgICAgIHRlbXBfc2F2ZShzLCBpLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgfQorfQorCisvKiBzeW5jIGdsb2JhbHMgdG8gdGhlaXIgY2Fub25pY2FsIGxvY2F0aW9uIGFuZCBhc3N1bWUgdGhleSBjYW4gYmUKKyAgIHJlYWQgYnkgdGhlIGZvbGxvd2luZyBjb2RlLiAnYWxsb2NhdGVkX3JlZ3MnIGlzIHVzZWQgaW4gY2FzZSBhCisgICB0ZW1wb3JhcnkgcmVnaXN0ZXJzIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCB0byBzdG9yZSBhIGNvbnN0YW50LiAqLworc3RhdGljIHZvaWQgc3luY19nbG9iYWxzKFRDR0NvbnRleHQgKnMsIFRDR1JlZ1NldCBhbGxvY2F0ZWRfcmVncykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9nbG9iYWxzOyBpKyspIHsKKyNpZmRlZiBVU0VfTElWRU5FU1NfQU5BTFlTSVMKKyAgICAgICAgYXNzZXJ0KHMtPnRlbXBzW2ldLnZhbF90eXBlICE9IFRFTVBfVkFMX1JFRyB8fCBzLT50ZW1wc1tpXS5maXhlZF9yZWcgfHwKKyAgICAgICAgICAgICAgIHMtPnRlbXBzW2ldLm1lbV9jb2hlcmVudCk7CisjZWxzZQorICAgICAgICB0ZW1wX3N5bmMocywgaSwgYWxsb2NhdGVkX3JlZ3MpOworI2VuZGlmCisgICAgfQorfQorCisvKiBhdCB0aGUgZW5kIG9mIGEgYmFzaWMgYmxvY2ssIHdlIGFzc3VtZSBhbGwgdGVtcG9yYXJpZXMgYXJlIGRlYWQgYW5kCisgICBhbGwgZ2xvYmFscyBhcmUgc3RvcmVkIGF0IHRoZWlyIGNhbm9uaWNhbCBsb2NhdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHRjZ19yZWdfYWxsb2NfYmJfZW5kKFRDR0NvbnRleHQgKnMsIFRDR1JlZ1NldCBhbGxvY2F0ZWRfcmVncykKK3sKKyAgICBUQ0dUZW1wICp0czsKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gcy0+bmJfZ2xvYmFsczsgaSA8IHMtPm5iX3RlbXBzOyBpKyspIHsKKyAgICAgICAgdHMgPSAmcy0+dGVtcHNbaV07CisgICAgICAgIGlmICh0cy0+dGVtcF9sb2NhbCkgeworICAgICAgICAgICAgdGVtcF9zYXZlKHMsIGksIGFsbG9jYXRlZF9yZWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBVU0VfTElWRU5FU1NfQU5BTFlTSVMKKyAgICAgICAgICAgIC8qIFRoZSBsaXZlbmVzcyBhbmFseXNpcyBhbHJlYWR5IGVuc3VyZXMgdGhhdCB0ZW1wcyBhcmUgZGVhZC4KKyAgICAgICAgICAgICAgIEtlZXAgYW4gYXNzZXJ0IGZvciBzYWZldHkuICovCisgICAgICAgICAgICBhc3NlcnQodHMtPnZhbF90eXBlID09IFRFTVBfVkFMX0RFQUQpOworI2Vsc2UKKyAgICAgICAgICAgIHRlbXBfZGVhZChzLCBpKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgc2F2ZV9nbG9iYWxzKHMsIGFsbG9jYXRlZF9yZWdzKTsKK30KKworI2RlZmluZSBJU19ERUFEX0FSRyhuKSAoKGRlYWRfYXJncyA+PiAobikpICYgMSkKKyNkZWZpbmUgTkVFRF9TWU5DX0FSRyhuKSAoKHN5bmNfYXJncyA+PiAobikpICYgMSkKKworc3RhdGljIHZvaWQgdGNnX3JlZ19hbGxvY19tb3ZpKFRDR0NvbnRleHQgKnMsIGNvbnN0IFRDR0FyZyAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkZWFkX2FyZ3MsIHVpbnQ4X3Qgc3luY19hcmdzKQoreworICAgIFRDR1RlbXAgKm90czsKKyAgICB0Y2dfdGFyZ2V0X3Vsb25nIHZhbDsKKworICAgIG90cyA9ICZzLT50ZW1wc1thcmdzWzBdXTsKKyAgICB2YWwgPSBhcmdzWzFdOworCisgICAgaWYgKG90cy0+Zml4ZWRfcmVnKSB7CisgICAgICAgIC8qIGZvciBmaXhlZCByZWdpc3RlcnMsIHdlIGRvIG5vdCBkbyBhbnkgY29uc3RhbnQKKyAgICAgICAgICAgcHJvcGFnYXRpb24gKi8KKyAgICAgICAgdGNnX291dF9tb3ZpKHMsIG90cy0+dHlwZSwgb3RzLT5yZWcsIHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhlIG1vdmkgaXMgbm90IGV4cGxpY2l0bHkgZ2VuZXJhdGVkIGhlcmUgKi8KKyAgICAgICAgaWYgKG90cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfUkVHKQorICAgICAgICAgICAgcy0+cmVnX3RvX3RlbXBbb3RzLT5yZWddID0gLTE7CisgICAgICAgIG90cy0+dmFsX3R5cGUgPSBURU1QX1ZBTF9DT05TVDsKKyAgICAgICAgb3RzLT52YWwgPSB2YWw7CisgICAgfQorICAgIGlmIChORUVEX1NZTkNfQVJHKDApKSB7CisgICAgICAgIHRlbXBfc3luYyhzLCBhcmdzWzBdLCBzLT5yZXNlcnZlZF9yZWdzKTsKKyAgICB9CisgICAgaWYgKElTX0RFQURfQVJHKDApKSB7CisgICAgICAgIHRlbXBfZGVhZChzLCBhcmdzWzBdKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRjZ19yZWdfYWxsb2NfbW92KFRDR0NvbnRleHQgKnMsIGNvbnN0IFRDR09wRGVmICpkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUQ0dBcmcgKmFyZ3MsIHVpbnQxNl90IGRlYWRfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3luY19hcmdzKQoreworICAgIFRDR1JlZ1NldCBhbGxvY2F0ZWRfcmVnczsKKyAgICBUQ0dUZW1wICp0cywgKm90czsKKyAgICBjb25zdCBUQ0dBcmdDb25zdHJhaW50ICphcmdfY3QsICpvYXJnX2N0OworCisgICAgdGNnX3JlZ3NldF9zZXQoYWxsb2NhdGVkX3JlZ3MsIHMtPnJlc2VydmVkX3JlZ3MpOworICAgIG90cyA9ICZzLT50ZW1wc1thcmdzWzBdXTsKKyAgICB0cyA9ICZzLT50ZW1wc1thcmdzWzFdXTsKKyAgICBvYXJnX2N0ID0gJmRlZi0+YXJnc19jdFswXTsKKyAgICBhcmdfY3QgPSAmZGVmLT5hcmdzX2N0WzFdOworCisgICAgLyogSWYgdGhlIHNvdXJjZSB2YWx1ZSBpcyBub3QgaW4gYSByZWdpc3RlciwgYW5kIHdlJ3JlIGdvaW5nIHRvIGJlCisgICAgICAgZm9yY2VkIHRvIGhhdmUgaXQgaW4gYSByZWdpc3RlciBpbiBvcmRlciB0byBwZXJmb3JtIHRoZSBjb3B5LAorICAgICAgIHRoZW4gY29weSB0aGUgU09VUkNFIHZhbHVlIGludG8gaXRzIG93biByZWdpc3RlciBmaXJzdC4gIFRoYXQgd2F5CisgICAgICAgd2UgZG9uJ3QgaGF2ZSB0byByZWxvYWQgU09VUkNFIHRoZSBuZXh0IHRpbWUgaXQgaXMgdXNlZC4gKi8KKyAgICBpZiAoKChORUVEX1NZTkNfQVJHKDApIHx8IG90cy0+Zml4ZWRfcmVnKSAmJiB0cy0+dmFsX3R5cGUgIT0gVEVNUF9WQUxfUkVHKQorICAgICAgICB8fCB0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfTUVNKSB7CisgICAgICAgIHRzLT5yZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIGFyZ19jdC0+dS5yZWdzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgICAgIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfTUVNKSB7CisgICAgICAgICAgICB0Y2dfb3V0X2xkKHMsIHRzLT50eXBlLCB0cy0+cmVnLCB0cy0+bWVtX3JlZywgdHMtPm1lbV9vZmZzZXQpOworICAgICAgICAgICAgdHMtPm1lbV9jb2hlcmVudCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodHMtPnZhbF90eXBlID09IFRFTVBfVkFMX0NPTlNUKSB7CisgICAgICAgICAgICB0Y2dfb3V0X21vdmkocywgdHMtPnR5cGUsIHRzLT5yZWcsIHRzLT52YWwpOworICAgICAgICB9CisgICAgICAgIHMtPnJlZ190b190ZW1wW3RzLT5yZWddID0gYXJnc1sxXTsKKyAgICAgICAgdHMtPnZhbF90eXBlID0gVEVNUF9WQUxfUkVHOworICAgIH0KKworICAgIGlmIChJU19ERUFEX0FSRygwKSAmJiAhb3RzLT5maXhlZF9yZWcpIHsKKyAgICAgICAgLyogbW92IHRvIGEgbm9uLXNhdmVkIGRlYWQgcmVnaXN0ZXIgbWFrZXMgbm8gc2Vuc2UgKGV2ZW4gd2l0aAorICAgICAgICAgICBsaXZlbmVzcyBhbmFseXNpcyBkaXNhYmxlZCkuICovCisgICAgICAgIGFzc2VydChORUVEX1NZTkNfQVJHKDApKTsKKyAgICAgICAgLyogVGhlIGNvZGUgYWJvdmUgc2hvdWxkIGhhdmUgbW92ZWQgdGhlIHRlbXAgdG8gYSByZWdpc3Rlci4gKi8KKyAgICAgICAgYXNzZXJ0KHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpOworICAgICAgICBpZiAoIW90cy0+bWVtX2FsbG9jYXRlZCkgeworICAgICAgICAgICAgdGVtcF9hbGxvY2F0ZV9mcmFtZShzLCBhcmdzWzBdKTsKKyAgICAgICAgfQorICAgICAgICB0Y2dfb3V0X3N0KHMsIG90cy0+dHlwZSwgdHMtPnJlZywgb3RzLT5tZW1fcmVnLCBvdHMtPm1lbV9vZmZzZXQpOworICAgICAgICBpZiAoSVNfREVBRF9BUkcoMSkpIHsKKyAgICAgICAgICAgIHRlbXBfZGVhZChzLCBhcmdzWzFdKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wX2RlYWQocywgYXJnc1swXSk7CisgICAgfSBlbHNlIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfQ09OU1QpIHsKKyAgICAgICAgLyogcHJvcGFnYXRlIGNvbnN0YW50ICovCisgICAgICAgIGlmIChvdHMtPnZhbF90eXBlID09IFRFTVBfVkFMX1JFRykgeworICAgICAgICAgICAgcy0+cmVnX3RvX3RlbXBbb3RzLT5yZWddID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgb3RzLT52YWxfdHlwZSA9IFRFTVBfVkFMX0NPTlNUOworICAgICAgICBvdHMtPnZhbCA9IHRzLT52YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVGhlIGNvZGUgaW4gdGhlIGZpcnN0IGlmIGJsb2NrIHNob3VsZCBoYXZlIG1vdmVkIHRoZQorICAgICAgICAgICB0ZW1wIHRvIGEgcmVnaXN0ZXIuICovCisgICAgICAgIGFzc2VydCh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfUkVHKTsKKyAgICAgICAgaWYgKElTX0RFQURfQVJHKDEpICYmICF0cy0+Zml4ZWRfcmVnICYmICFvdHMtPmZpeGVkX3JlZykgeworICAgICAgICAgICAgLyogdGhlIG1vdiBjYW4gYmUgc3VwcHJlc3NlZCAqLworICAgICAgICAgICAgaWYgKG90cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfUkVHKSB7CisgICAgICAgICAgICAgICAgcy0+cmVnX3RvX3RlbXBbb3RzLT5yZWddID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdHMtPnJlZyA9IHRzLT5yZWc7CisgICAgICAgICAgICB0ZW1wX2RlYWQocywgYXJnc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAob3RzLT52YWxfdHlwZSAhPSBURU1QX1ZBTF9SRUcpIHsKKyAgICAgICAgICAgICAgICAvKiBXaGVuIGFsbG9jYXRpbmcgYSBuZXcgcmVnaXN0ZXIsIG1ha2Ugc3VyZSB0byBub3Qgc3BpbGwgdGhlCisgICAgICAgICAgICAgICAgICAgaW5wdXQgb25lLiAqLworICAgICAgICAgICAgICAgIHRjZ19yZWdzZXRfc2V0X3JlZyhhbGxvY2F0ZWRfcmVncywgdHMtPnJlZyk7CisgICAgICAgICAgICAgICAgb3RzLT5yZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIG9hcmdfY3QtPnUucmVncywgYWxsb2NhdGVkX3JlZ3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX291dF9tb3Yocywgb3RzLT50eXBlLCBvdHMtPnJlZywgdHMtPnJlZyk7CisgICAgICAgIH0KKyAgICAgICAgb3RzLT52YWxfdHlwZSA9IFRFTVBfVkFMX1JFRzsKKyAgICAgICAgb3RzLT5tZW1fY29oZXJlbnQgPSAwOworICAgICAgICBzLT5yZWdfdG9fdGVtcFtvdHMtPnJlZ10gPSBhcmdzWzBdOworICAgICAgICBpZiAoTkVFRF9TWU5DX0FSRygwKSkgeworICAgICAgICAgICAgdGNnX3JlZ19zeW5jKHMsIG90cy0+cmVnKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdGNnX3JlZ19hbGxvY19vcChUQ0dDb250ZXh0ICpzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVENHT3BEZWYgKmRlZiwgVENHT3Bjb2RlIG9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVENHQXJnICphcmdzLCB1aW50MTZfdCBkZWFkX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3luY19hcmdzKQoreworICAgIFRDR1JlZ1NldCBhbGxvY2F0ZWRfcmVnczsKKyAgICBpbnQgaSwgaywgbmJfaWFyZ3MsIG5iX29hcmdzLCByZWc7CisgICAgVENHQXJnIGFyZzsKKyAgICBjb25zdCBUQ0dBcmdDb25zdHJhaW50ICphcmdfY3Q7CisgICAgVENHVGVtcCAqdHM7CisgICAgVENHQXJnIG5ld19hcmdzW1RDR19NQVhfT1BfQVJHU107CisgICAgaW50IGNvbnN0X2FyZ3NbVENHX01BWF9PUF9BUkdTXTsKKworICAgIG5iX29hcmdzID0gZGVmLT5uYl9vYXJnczsKKyAgICBuYl9pYXJncyA9IGRlZi0+bmJfaWFyZ3M7CisKKyAgICAvKiBjb3B5IGNvbnN0YW50cyAqLworICAgIG1lbWNweShuZXdfYXJncyArIG5iX29hcmdzICsgbmJfaWFyZ3MsIAorICAgICAgICAgICBhcmdzICsgbmJfb2FyZ3MgKyBuYl9pYXJncywgCisgICAgICAgICAgIHNpemVvZihUQ0dBcmcpICogZGVmLT5uYl9jYXJncyk7CisKKyAgICAvKiBzYXRpc2Z5IGlucHV0IGNvbnN0cmFpbnRzICovIAorICAgIHRjZ19yZWdzZXRfc2V0KGFsbG9jYXRlZF9yZWdzLCBzLT5yZXNlcnZlZF9yZWdzKTsKKyAgICBmb3IoayA9IDA7IGsgPCBuYl9pYXJnczsgaysrKSB7CisgICAgICAgIGkgPSBkZWYtPnNvcnRlZF9hcmdzW25iX29hcmdzICsga107CisgICAgICAgIGFyZyA9IGFyZ3NbaV07CisgICAgICAgIGFyZ19jdCA9ICZkZWYtPmFyZ3NfY3RbaV07CisgICAgICAgIHRzID0gJnMtPnRlbXBzW2FyZ107CisgICAgICAgIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfTUVNKSB7CisgICAgICAgICAgICByZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIGFyZ19jdC0+dS5yZWdzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgICAgICAgICB0Y2dfb3V0X2xkKHMsIHRzLT50eXBlLCByZWcsIHRzLT5tZW1fcmVnLCB0cy0+bWVtX29mZnNldCk7CisgICAgICAgICAgICB0cy0+dmFsX3R5cGUgPSBURU1QX1ZBTF9SRUc7CisgICAgICAgICAgICB0cy0+cmVnID0gcmVnOworICAgICAgICAgICAgdHMtPm1lbV9jb2hlcmVudCA9IDE7CisgICAgICAgICAgICBzLT5yZWdfdG9fdGVtcFtyZWddID0gYXJnOworICAgICAgICB9IGVsc2UgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9DT05TVCkgeworICAgICAgICAgICAgaWYgKHRjZ190YXJnZXRfY29uc3RfbWF0Y2godHMtPnZhbCwgYXJnX2N0KSkgeworICAgICAgICAgICAgICAgIC8qIGNvbnN0YW50IGlzIE9LIGZvciBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgICAgIGNvbnN0X2FyZ3NbaV0gPSAxOworICAgICAgICAgICAgICAgIG5ld19hcmdzW2ldID0gdHMtPnZhbDsKKyAgICAgICAgICAgICAgICBnb3RvIGlhcmdfZW5kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIG1vdmUgdG8gYSByZWdpc3RlciAqLworICAgICAgICAgICAgICAgIHJlZyA9IHRjZ19yZWdfYWxsb2MocywgYXJnX2N0LT51LnJlZ3MsIGFsbG9jYXRlZF9yZWdzKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X21vdmkocywgdHMtPnR5cGUsIHJlZywgdHMtPnZhbCk7CisgICAgICAgICAgICAgICAgdHMtPnZhbF90eXBlID0gVEVNUF9WQUxfUkVHOworICAgICAgICAgICAgICAgIHRzLT5yZWcgPSByZWc7CisgICAgICAgICAgICAgICAgdHMtPm1lbV9jb2hlcmVudCA9IDA7CisgICAgICAgICAgICAgICAgcy0+cmVnX3RvX3RlbXBbcmVnXSA9IGFyZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnQodHMtPnZhbF90eXBlID09IFRFTVBfVkFMX1JFRyk7CisgICAgICAgIGlmIChhcmdfY3QtPmN0ICYgVENHX0NUX0lBTElBUykgeworICAgICAgICAgICAgaWYgKHRzLT5maXhlZF9yZWcpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBmaXhlZCByZWdpc3Rlciwgd2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgIGlmIHRoZSBhbGlhcyBpcyBub3QgdGhlIHNhbWUgcmVnaXN0ZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAoYXJnICE9IGFyZ3NbYXJnX2N0LT5hbGlhc19pbmRleF0pCisgICAgICAgICAgICAgICAgICAgIGdvdG8gYWxsb2NhdGVfaW5fcmVnOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGUgaW5wdXQgaXMgYWxpYXNlZCB0byBhbiBvdXRwdXQgYW5kIGlmIGl0IGlzCisgICAgICAgICAgICAgICAgICAgbm90IGRlYWQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uLCB3ZSBtdXN0IGFsbG9jYXRlCisgICAgICAgICAgICAgICAgICAgYSBuZXcgcmVnaXN0ZXIgYW5kIG1vdmUgaXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIUlTX0RFQURfQVJHKGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gYWxsb2NhdGVfaW5fcmVnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZWcgPSB0cy0+cmVnOworICAgICAgICBpZiAodGNnX3JlZ3NldF90ZXN0X3JlZyhhcmdfY3QtPnUucmVncywgcmVnKSkgeworICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyA6IHRoZSBjb25zdHJhaW50IGlzIHNhdGlzZmllZCAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICBhbGxvY2F0ZV9pbl9yZWc6CisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyByZWdpc3RlciBtYXRjaGluZyB0aGUgY29uc3RyYWludCAKKyAgICAgICAgICAgICAgIGFuZCBtb3ZlIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIgaW50byBpdCAqLworICAgICAgICAgICAgcmVnID0gdGNnX3JlZ19hbGxvYyhzLCBhcmdfY3QtPnUucmVncywgYWxsb2NhdGVkX3JlZ3MpOworICAgICAgICAgICAgdGNnX291dF9tb3YocywgdHMtPnR5cGUsIHJlZywgdHMtPnJlZyk7CisgICAgICAgIH0KKyAgICAgICAgbmV3X2FyZ3NbaV0gPSByZWc7CisgICAgICAgIGNvbnN0X2FyZ3NbaV0gPSAwOworICAgICAgICB0Y2dfcmVnc2V0X3NldF9yZWcoYWxsb2NhdGVkX3JlZ3MsIHJlZyk7CisgICAgaWFyZ19lbmQ6IDsKKyAgICB9CisgICAgCisgICAgLyogbWFyayBkZWFkIHRlbXBvcmFyaWVzIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIHJlZ2lzdGVycyAqLworICAgIGZvciAoaSA9IG5iX29hcmdzOyBpIDwgbmJfb2FyZ3MgKyBuYl9pYXJnczsgaSsrKSB7CisgICAgICAgIGlmIChJU19ERUFEX0FSRyhpKSkgeworICAgICAgICAgICAgdGVtcF9kZWFkKHMsIGFyZ3NbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRlZi0+ZmxhZ3MgJiBUQ0dfT1BGX0JCX0VORCkgeworICAgICAgICB0Y2dfcmVnX2FsbG9jX2JiX2VuZChzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlZi0+ZmxhZ3MgJiBUQ0dfT1BGX0NBTExfQ0xPQkJFUikgeworICAgICAgICAgICAgLyogWFhYOiBwZXJtaXQgZ2VuZXJpYyBjbG9iYmVyIHJlZ2lzdGVyIGxpc3QgPyAqLyAKKyAgICAgICAgICAgIGZvcihyZWcgPSAwOyByZWcgPCBUQ0dfVEFSR0VUX05CX1JFR1M7IHJlZysrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRjZ19yZWdzZXRfdGVzdF9yZWcodGNnX3RhcmdldF9jYWxsX2Nsb2JiZXJfcmVncywgcmVnKSkgeworICAgICAgICAgICAgICAgICAgICB0Y2dfcmVnX2ZyZWUocywgcmVnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlZi0+ZmxhZ3MgJiBUQ0dfT1BGX1NJREVfRUZGRUNUUykgeworICAgICAgICAgICAgLyogc3luYyBnbG9iYWxzIGlmIHRoZSBvcCBoYXMgc2lkZSBlZmZlY3RzIGFuZCBtaWdodCB0cmlnZ2VyCisgICAgICAgICAgICAgICBhbiBleGNlcHRpb24uICovCisgICAgICAgICAgICBzeW5jX2dsb2JhbHMocywgYWxsb2NhdGVkX3JlZ3MpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBzYXRpc2Z5IHRoZSBvdXRwdXQgY29uc3RyYWludHMgKi8KKyAgICAgICAgdGNnX3JlZ3NldF9zZXQoYWxsb2NhdGVkX3JlZ3MsIHMtPnJlc2VydmVkX3JlZ3MpOworICAgICAgICBmb3IoayA9IDA7IGsgPCBuYl9vYXJnczsgaysrKSB7CisgICAgICAgICAgICBpID0gZGVmLT5zb3J0ZWRfYXJnc1trXTsKKyAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV07CisgICAgICAgICAgICBhcmdfY3QgPSAmZGVmLT5hcmdzX2N0W2ldOworICAgICAgICAgICAgdHMgPSAmcy0+dGVtcHNbYXJnXTsKKyAgICAgICAgICAgIGlmIChhcmdfY3QtPmN0ICYgVENHX0NUX0FMSUFTKSB7CisgICAgICAgICAgICAgICAgcmVnID0gbmV3X2FyZ3NbYXJnX2N0LT5hbGlhc19pbmRleF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGlmIGZpeGVkIHJlZ2lzdGVyLCB3ZSB0cnkgdG8gdXNlIGl0ICovCisgICAgICAgICAgICAgICAgcmVnID0gdHMtPnJlZzsKKyAgICAgICAgICAgICAgICBpZiAodHMtPmZpeGVkX3JlZyAmJgorICAgICAgICAgICAgICAgICAgICB0Y2dfcmVnc2V0X3Rlc3RfcmVnKGFyZ19jdC0+dS5yZWdzLCByZWcpKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb2FyZ19lbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZyA9IHRjZ19yZWdfYWxsb2MocywgYXJnX2N0LT51LnJlZ3MsIGFsbG9jYXRlZF9yZWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRjZ19yZWdzZXRfc2V0X3JlZyhhbGxvY2F0ZWRfcmVncywgcmVnKTsKKyAgICAgICAgICAgIC8qIGlmIGEgZml4ZWQgcmVnaXN0ZXIgaXMgdXNlZCwgdGhlbiBhIG1vdmUgd2lsbCBiZSBkb25lIGFmdGVyd2FyZHMgKi8KKyAgICAgICAgICAgIGlmICghdHMtPmZpeGVkX3JlZykgeworICAgICAgICAgICAgICAgIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfUkVHKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlZ190b190ZW1wW3RzLT5yZWddID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX1JFRzsKKyAgICAgICAgICAgICAgICB0cy0+cmVnID0gcmVnOworICAgICAgICAgICAgICAgIC8qIHRlbXAgdmFsdWUgaXMgbW9kaWZpZWQsIHNvIHRoZSB2YWx1ZSBrZXB0IGluIG1lbW9yeSBpcworICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbGx5IG5vdCB0aGUgc2FtZSAqLworICAgICAgICAgICAgICAgIHRzLT5tZW1fY29oZXJlbnQgPSAwOworICAgICAgICAgICAgICAgIHMtPnJlZ190b190ZW1wW3JlZ10gPSBhcmc7CisgICAgICAgICAgICB9CisgICAgICAgIG9hcmdfZW5kOgorICAgICAgICAgICAgbmV3X2FyZ3NbaV0gPSByZWc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBlbWl0IGluc3RydWN0aW9uICovCisgICAgdGNnX291dF9vcChzLCBvcGMsIG5ld19hcmdzLCBjb25zdF9hcmdzKTsKKyAgICAKKyAgICAvKiBtb3ZlIHRoZSBvdXRwdXRzIGluIHRoZSBjb3JyZWN0IHJlZ2lzdGVyIGlmIG5lZWRlZCAqLworICAgIGZvcihpID0gMDsgaSA8IG5iX29hcmdzOyBpKyspIHsKKyAgICAgICAgdHMgPSAmcy0+dGVtcHNbYXJnc1tpXV07CisgICAgICAgIHJlZyA9IG5ld19hcmdzW2ldOworICAgICAgICBpZiAodHMtPmZpeGVkX3JlZyAmJiB0cy0+cmVnICE9IHJlZykgeworICAgICAgICAgICAgdGNnX291dF9tb3YocywgdHMtPnR5cGUsIHRzLT5yZWcsIHJlZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE5FRURfU1lOQ19BUkcoaSkpIHsKKyAgICAgICAgICAgIHRjZ19yZWdfc3luYyhzLCByZWcpOworICAgICAgICB9CisgICAgICAgIGlmIChJU19ERUFEX0FSRyhpKSkgeworICAgICAgICAgICAgdGVtcF9kZWFkKHMsIGFyZ3NbaV0pOworICAgICAgICB9CisgICAgfQorfQorCisjaWZkZWYgVENHX1RBUkdFVF9TVEFDS19HUk9XU1VQCisjZGVmaW5lIFNUQUNLX0RJUih4KSAoLSh4KSkKKyNlbHNlCisjZGVmaW5lIFNUQUNLX0RJUih4KSAoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IHRjZ19yZWdfYWxsb2NfY2FsbChUQ0dDb250ZXh0ICpzLCBjb25zdCBUQ0dPcERlZiAqZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENHT3Bjb2RlIG9wYywgY29uc3QgVENHQXJnICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGVhZF9hcmdzLCB1aW50OF90IHN5bmNfYXJncykKK3sKKyAgICBpbnQgbmJfaWFyZ3MsIG5iX29hcmdzLCBmbGFncywgbmJfcmVncywgaSwgcmVnLCBuYl9wYXJhbXM7CisgICAgVENHQXJnIGFyZywgZnVuY19hcmc7CisgICAgVENHVGVtcCAqdHM7CisgICAgaW50cHRyX3Qgc3RhY2tfb2Zmc2V0OworICAgIHNpemVfdCBjYWxsX3N0YWNrX3NpemU7CisgICAgdWludHB0cl90IGZ1bmNfYWRkcjsKKyAgICBpbnQgY29uc3RfZnVuY19hcmcsIGFsbG9jYXRlX2FyZ3M7CisgICAgVENHUmVnU2V0IGFsbG9jYXRlZF9yZWdzOworICAgIGNvbnN0IFRDR0FyZ0NvbnN0cmFpbnQgKmFyZ19jdDsKKworICAgIGFyZyA9ICphcmdzKys7CisKKyAgICBuYl9vYXJncyA9IGFyZyA+PiAxNjsKKyAgICBuYl9pYXJncyA9IGFyZyAmIDB4ZmZmZjsKKyAgICBuYl9wYXJhbXMgPSBuYl9pYXJncyAtIDE7CisKKyAgICBmbGFncyA9IGFyZ3NbbmJfb2FyZ3MgKyBuYl9pYXJnc107CisKKyAgICBuYl9yZWdzID0gQVJSQVlfU0laRSh0Y2dfdGFyZ2V0X2NhbGxfaWFyZ19yZWdzKTsKKyAgICBpZiAobmJfcmVncyA+IG5iX3BhcmFtcykKKyAgICAgICAgbmJfcmVncyA9IG5iX3BhcmFtczsKKworICAgIC8qIGFzc2lnbiBzdGFjayBzbG90cyBmaXJzdCAqLworICAgIGNhbGxfc3RhY2tfc2l6ZSA9IChuYl9wYXJhbXMgLSBuYl9yZWdzKSAqIHNpemVvZih0Y2dfdGFyZ2V0X2xvbmcpOworICAgIGNhbGxfc3RhY2tfc2l6ZSA9IChjYWxsX3N0YWNrX3NpemUgKyBUQ0dfVEFSR0VUX1NUQUNLX0FMSUdOIC0gMSkgJiAKKyAgICAgICAgfihUQ0dfVEFSR0VUX1NUQUNLX0FMSUdOIC0gMSk7CisgICAgYWxsb2NhdGVfYXJncyA9IChjYWxsX3N0YWNrX3NpemUgPiBUQ0dfU1RBVElDX0NBTExfQVJHU19TSVpFKTsKKyAgICBpZiAoYWxsb2NhdGVfYXJncykgeworICAgICAgICAvKiBYWFg6IGlmIG1vcmUgdGhhbiBUQ0dfU1RBVElDX0NBTExfQVJHU19TSVpFIGlzIG5lZWRlZCwKKyAgICAgICAgICAgcHJlYWxsb2NhdGUgY2FsbCBzdGFjayAqLworICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICB9CisKKyAgICBzdGFja19vZmZzZXQgPSBUQ0dfVEFSR0VUX0NBTExfU1RBQ0tfT0ZGU0VUOworICAgIGZvcihpID0gbmJfcmVnczsgaSA8IG5iX3BhcmFtczsgaSsrKSB7CisgICAgICAgIGFyZyA9IGFyZ3NbbmJfb2FyZ3MgKyBpXTsKKyNpZmRlZiBUQ0dfVEFSR0VUX1NUQUNLX0dST1dTVVAKKyAgICAgICAgc3RhY2tfb2Zmc2V0IC09IHNpemVvZih0Y2dfdGFyZ2V0X2xvbmcpOworI2VuZGlmCisgICAgICAgIGlmIChhcmcgIT0gVENHX0NBTExfRFVNTVlfQVJHKSB7CisgICAgICAgICAgICB0cyA9ICZzLT50ZW1wc1thcmddOworICAgICAgICAgICAgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X3N0KHMsIHRzLT50eXBlLCB0cy0+cmVnLCBUQ0dfUkVHX0NBTExfU1RBQ0ssIHN0YWNrX29mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9NRU0pIHsKKyAgICAgICAgICAgICAgICByZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIHRjZ190YXJnZXRfYXZhaWxhYmxlX3JlZ3NbdHMtPnR5cGVdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2VydmVkX3JlZ3MpOworICAgICAgICAgICAgICAgIC8qIFhYWDogbm90IGNvcnJlY3QgaWYgcmVhZGluZyB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sgKi8KKyAgICAgICAgICAgICAgICB0Y2dfb3V0X2xkKHMsIHRzLT50eXBlLCByZWcsIHRzLT5tZW1fcmVnLCB0cy0+bWVtX29mZnNldCk7CisgICAgICAgICAgICAgICAgdGNnX291dF9zdChzLCB0cy0+dHlwZSwgcmVnLCBUQ0dfUkVHX0NBTExfU1RBQ0ssIHN0YWNrX29mZnNldCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9DT05TVCkgeworICAgICAgICAgICAgICAgIHJlZyA9IHRjZ19yZWdfYWxsb2MocywgdGNnX3RhcmdldF9hdmFpbGFibGVfcmVnc1t0cy0+dHlwZV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVzZXJ2ZWRfcmVncyk7CisgICAgICAgICAgICAgICAgLyogWFhYOiBzaWduIGV4dGVuZCBtYXkgYmUgbmVlZGVkIG9uIHNvbWUgdGFyZ2V0cyAqLworICAgICAgICAgICAgICAgIHRjZ19vdXRfbW92aShzLCB0cy0+dHlwZSwgcmVnLCB0cy0+dmFsKTsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X3N0KHMsIHRzLT50eXBlLCByZWcsIFRDR19SRUdfQ0FMTF9TVEFDSywgc3RhY2tfb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZm5kZWYgVENHX1RBUkdFVF9TVEFDS19HUk9XU1VQCisgICAgICAgIHN0YWNrX29mZnNldCArPSBzaXplb2YodGNnX3RhcmdldF9sb25nKTsKKyNlbmRpZgorICAgIH0KKyAgICAKKyAgICAvKiBhc3NpZ24gaW5wdXQgcmVnaXN0ZXJzICovCisgICAgdGNnX3JlZ3NldF9zZXQoYWxsb2NhdGVkX3JlZ3MsIHMtPnJlc2VydmVkX3JlZ3MpOworICAgIGZvcihpID0gMDsgaSA8IG5iX3JlZ3M7IGkrKykgeworICAgICAgICBhcmcgPSBhcmdzW25iX29hcmdzICsgaV07CisgICAgICAgIGlmIChhcmcgIT0gVENHX0NBTExfRFVNTVlfQVJHKSB7CisgICAgICAgICAgICB0cyA9ICZzLT50ZW1wc1thcmddOworICAgICAgICAgICAgcmVnID0gdGNnX3RhcmdldF9jYWxsX2lhcmdfcmVnc1tpXTsKKyAgICAgICAgICAgIHRjZ19yZWdfZnJlZShzLCByZWcpOworICAgICAgICAgICAgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpIHsKKyAgICAgICAgICAgICAgICBpZiAodHMtPnJlZyAhPSByZWcpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNnX291dF9tb3YocywgdHMtPnR5cGUsIHJlZywgdHMtPnJlZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfTUVNKSB7CisgICAgICAgICAgICAgICAgdGNnX291dF9sZChzLCB0cy0+dHlwZSwgcmVnLCB0cy0+bWVtX3JlZywgdHMtPm1lbV9vZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfQ09OU1QpIHsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IHNpZ24gZXh0ZW5kID8gKi8KKyAgICAgICAgICAgICAgICB0Y2dfb3V0X21vdmkocywgdHMtPnR5cGUsIHJlZywgdHMtPnZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRjZ19hYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKGFsbG9jYXRlZF9yZWdzLCByZWcpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGFzc2lnbiBmdW5jdGlvbiBhZGRyZXNzICovCisgICAgZnVuY19hcmcgPSBhcmdzW25iX29hcmdzICsgbmJfaWFyZ3MgLSAxXTsKKyAgICBhcmdfY3QgPSAmZGVmLT5hcmdzX2N0WzBdOworICAgIHRzID0gJnMtPnRlbXBzW2Z1bmNfYXJnXTsKKyAgICBmdW5jX2FkZHIgPSB0cy0+dmFsOworICAgIGNvbnN0X2Z1bmNfYXJnID0gMDsKKyAgICBpZiAodHMtPnZhbF90eXBlID09IFRFTVBfVkFMX01FTSkgeworICAgICAgICByZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIGFyZ19jdC0+dS5yZWdzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgICAgIHRjZ19vdXRfbGQocywgdHMtPnR5cGUsIHJlZywgdHMtPm1lbV9yZWcsIHRzLT5tZW1fb2Zmc2V0KTsKKyAgICAgICAgZnVuY19hcmcgPSByZWc7CisgICAgICAgIHRjZ19yZWdzZXRfc2V0X3JlZyhhbGxvY2F0ZWRfcmVncywgcmVnKTsKKyAgICB9IGVsc2UgaWYgKHRzLT52YWxfdHlwZSA9PSBURU1QX1ZBTF9SRUcpIHsKKyAgICAgICAgcmVnID0gdHMtPnJlZzsKKyAgICAgICAgaWYgKCF0Y2dfcmVnc2V0X3Rlc3RfcmVnKGFyZ19jdC0+dS5yZWdzLCByZWcpKSB7CisgICAgICAgICAgICByZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIGFyZ19jdC0+dS5yZWdzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgICAgICAgICB0Y2dfb3V0X21vdihzLCB0cy0+dHlwZSwgcmVnLCB0cy0+cmVnKTsKKyAgICAgICAgfQorICAgICAgICBmdW5jX2FyZyA9IHJlZzsKKyAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKGFsbG9jYXRlZF9yZWdzLCByZWcpOworICAgIH0gZWxzZSBpZiAodHMtPnZhbF90eXBlID09IFRFTVBfVkFMX0NPTlNUKSB7CisgICAgICAgIGlmICh0Y2dfdGFyZ2V0X2NvbnN0X21hdGNoKGZ1bmNfYWRkciwgYXJnX2N0KSkgeworICAgICAgICAgICAgY29uc3RfZnVuY19hcmcgPSAxOworICAgICAgICAgICAgZnVuY19hcmcgPSBmdW5jX2FkZHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWcgPSB0Y2dfcmVnX2FsbG9jKHMsIGFyZ19jdC0+dS5yZWdzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgICAgICAgICB0Y2dfb3V0X21vdmkocywgdHMtPnR5cGUsIHJlZywgZnVuY19hZGRyKTsKKyAgICAgICAgICAgIGZ1bmNfYXJnID0gcmVnOworICAgICAgICAgICAgdGNnX3JlZ3NldF9zZXRfcmVnKGFsbG9jYXRlZF9yZWdzLCByZWcpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGNnX2Fib3J0KCk7CisgICAgfQorICAgICAgICAKKyAgICAKKyAgICAvKiBtYXJrIGRlYWQgdGVtcG9yYXJpZXMgYW5kIGZyZWUgdGhlIGFzc29jaWF0ZWQgcmVnaXN0ZXJzICovCisgICAgZm9yKGkgPSBuYl9vYXJnczsgaSA8IG5iX2lhcmdzICsgbmJfb2FyZ3M7IGkrKykgeworICAgICAgICBpZiAoSVNfREVBRF9BUkcoaSkpIHsKKyAgICAgICAgICAgIHRlbXBfZGVhZChzLCBhcmdzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBjbG9iYmVyIGNhbGwgcmVnaXN0ZXJzICovCisgICAgZm9yKHJlZyA9IDA7IHJlZyA8IFRDR19UQVJHRVRfTkJfUkVHUzsgcmVnKyspIHsKKyAgICAgICAgaWYgKHRjZ19yZWdzZXRfdGVzdF9yZWcodGNnX3RhcmdldF9jYWxsX2Nsb2JiZXJfcmVncywgcmVnKSkgeworICAgICAgICAgICAgdGNnX3JlZ19mcmVlKHMsIHJlZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTYXZlIGdsb2JhbHMgaWYgdGhleSBtaWdodCBiZSB3cml0dGVuIGJ5IHRoZSBoZWxwZXIsIHN5bmMgdGhlbSBpZgorICAgICAgIHRoZXkgbWlnaHQgYmUgcmVhZC4gKi8KKyAgICBpZiAoZmxhZ3MgJiBUQ0dfQ0FMTF9OT19SRUFEX0dMT0JBTFMpIHsKKyAgICAgICAgLyogTm90aGluZyB0byBkbyAqLworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBUQ0dfQ0FMTF9OT19XUklURV9HTE9CQUxTKSB7CisgICAgICAgIHN5bmNfZ2xvYmFscyhzLCBhbGxvY2F0ZWRfcmVncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2F2ZV9nbG9iYWxzKHMsIGFsbG9jYXRlZF9yZWdzKTsKKyAgICB9CisKKyAgICB0Y2dfb3V0X29wKHMsIG9wYywgJmZ1bmNfYXJnLCAmY29uc3RfZnVuY19hcmcpOworCisgICAgLyogYXNzaWduIG91dHB1dCByZWdpc3RlcnMgYW5kIGVtaXQgbW92ZXMgaWYgbmVlZGVkICovCisgICAgZm9yKGkgPSAwOyBpIDwgbmJfb2FyZ3M7IGkrKykgeworICAgICAgICBhcmcgPSBhcmdzW2ldOworICAgICAgICB0cyA9ICZzLT50ZW1wc1thcmddOworICAgICAgICByZWcgPSB0Y2dfdGFyZ2V0X2NhbGxfb2FyZ19yZWdzW2ldOworICAgICAgICBhc3NlcnQocy0+cmVnX3RvX3RlbXBbcmVnXSA9PSAtMSk7CisgICAgICAgIGlmICh0cy0+Zml4ZWRfcmVnKSB7CisgICAgICAgICAgICBpZiAodHMtPnJlZyAhPSByZWcpIHsKKyAgICAgICAgICAgICAgICB0Y2dfb3V0X21vdihzLCB0cy0+dHlwZSwgdHMtPnJlZywgcmVnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0cy0+dmFsX3R5cGUgPT0gVEVNUF9WQUxfUkVHKSB7CisgICAgICAgICAgICAgICAgcy0+cmVnX3RvX3RlbXBbdHMtPnJlZ10gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRzLT52YWxfdHlwZSA9IFRFTVBfVkFMX1JFRzsKKyAgICAgICAgICAgIHRzLT5yZWcgPSByZWc7CisgICAgICAgICAgICB0cy0+bWVtX2NvaGVyZW50ID0gMDsKKyAgICAgICAgICAgIHMtPnJlZ190b190ZW1wW3JlZ10gPSBhcmc7CisgICAgICAgICAgICBpZiAoTkVFRF9TWU5DX0FSRyhpKSkgeworICAgICAgICAgICAgICAgIHRjZ19yZWdfc3luYyhzLCByZWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKElTX0RFQURfQVJHKGkpKSB7CisgICAgICAgICAgICAgICAgdGVtcF9kZWFkKHMsIGFyZ3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBuYl9pYXJncyArIG5iX29hcmdzICsgZGVmLT5uYl9jYXJncyArIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPRklMRVIKKworc3RhdGljIGludDY0X3QgdGNnX3RhYmxlX29wX2NvdW50W05CX09QU107CisKK3N0YXRpYyB2b2lkIGR1bXBfb3BfY291bnQodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBGSUxFICpmOworICAgIGYgPSBmb3BlbigiL3RtcC9vcC5sb2ciLCAidyIpOworICAgIGZvcihpID0gSU5ERVhfb3BfZW5kOyBpIDwgTkJfT1BTOyBpKyspIHsKKyAgICAgICAgZnByaW50ZihmLCAiJXMgJSIgUFJJZDY0ICJcbiIsIHRjZ19vcF9kZWZzW2ldLm5hbWUsIHRjZ190YWJsZV9vcF9jb3VudFtpXSk7CisgICAgfQorICAgIGZjbG9zZShmKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgaW50IHRjZ19nZW5fY29kZV9jb21tb24oVENHQ29udGV4dCAqcywgdWludDhfdCAqZ2VuX2NvZGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHNlYXJjaF9wYykKK3sKKyAgICBUQ0dPcGNvZGUgb3BjOworICAgIGludCBvcF9pbmRleDsKKyAgICBjb25zdCBUQ0dPcERlZiAqZGVmOworICAgIGNvbnN0IFRDR0FyZyAqYXJnczsKKworI2lmZGVmIERFQlVHX0RJU0FTCisgICAgaWYgKHVubGlrZWx5KHFlbXVfbG9nbGV2ZWxfbWFzayhDUFVfTE9HX1RCX09QKSkpIHsKKyAgICAgICAgcWVtdV9sb2coIk9QOlxuIik7CisgICAgICAgIHRjZ19kdW1wX29wcyhzKTsKKyAgICAgICAgcWVtdV9sb2coIlxuIik7CisgICAgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUFJPRklMRVIKKyAgICBzLT5vcHRfdGltZSAtPSBwcm9maWxlX2dldGNsb2NrKCk7CisjZW5kaWYKKworI2lmZGVmIFVTRV9UQ0dfT1BUSU1JWkFUSU9OUworICAgIHMtPmdlbl9vcHBhcmFtX3B0ciA9CisgICAgICAgIHRjZ19vcHRpbWl6ZShzLCBzLT5nZW5fb3BjX3B0ciwgcy0+Z2VuX29wcGFyYW1fYnVmLCB0Y2dfb3BfZGVmcyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIHMtPm9wdF90aW1lICs9IHByb2ZpbGVfZ2V0Y2xvY2soKTsKKyAgICBzLT5sYV90aW1lIC09IHByb2ZpbGVfZ2V0Y2xvY2soKTsKKyNlbmRpZgorCisgICAgdGNnX2xpdmVuZXNzX2FuYWx5c2lzKHMpOworCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgcy0+bGFfdGltZSArPSBwcm9maWxlX2dldGNsb2NrKCk7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0RJU0FTCisgICAgaWYgKHVubGlrZWx5KHFlbXVfbG9nbGV2ZWxfbWFzayhDUFVfTE9HX1RCX09QX09QVCkpKSB7CisgICAgICAgIHFlbXVfbG9nKCJPUCBhZnRlciBvcHRpbWl6YXRpb24gYW5kIGxpdmVuZXNzIGFuYWx5c2lzOlxuIik7CisgICAgICAgIHRjZ19kdW1wX29wcyhzKTsKKyAgICAgICAgcWVtdV9sb2coIlxuIik7CisgICAgfQorI2VuZGlmCisKKyAgICB0Y2dfcmVnX2FsbG9jX3N0YXJ0KHMpOworCisgICAgcy0+Y29kZV9idWYgPSBnZW5fY29kZV9idWY7CisgICAgcy0+Y29kZV9wdHIgPSBnZW5fY29kZV9idWY7CisKKyAgICB0Y2dfb3V0X3RiX2luaXQocyk7CisKKyAgICBhcmdzID0gcy0+Z2VuX29wcGFyYW1fYnVmOworICAgIG9wX2luZGV4ID0gMDsKKworICAgIGZvcig7OykgeworICAgICAgICBvcGMgPSBzLT5nZW5fb3BjX2J1ZltvcF9pbmRleF07CisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgICAgIHRjZ190YWJsZV9vcF9jb3VudFtvcGNdKys7CisjZW5kaWYKKyAgICAgICAgZGVmID0gJnRjZ19vcF9kZWZzW29wY107CisjaWYgMAorICAgICAgICBwcmludGYoIiVzOiAlZCAlZCAlZFxuIiwgZGVmLT5uYW1lLAorICAgICAgICAgICAgICAgZGVmLT5uYl9vYXJncywgZGVmLT5uYl9pYXJncywgZGVmLT5uYl9jYXJncyk7CisgICAgICAgIC8vICAgICAgICBkdW1wX3JlZ3Mocyk7CisjZW5kaWYKKyAgICAgICAgc3dpdGNoKG9wYykgeworICAgICAgICBjYXNlIElOREVYX29wX21vdl9pMzI6CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbW92X2k2NDoKKyAgICAgICAgICAgIHRjZ19yZWdfYWxsb2NfbW92KHMsIGRlZiwgYXJncywgcy0+b3BfZGVhZF9hcmdzW29wX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm9wX3N5bmNfYXJnc1tvcF9pbmRleF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbW92aV9pMzI6CisgICAgICAgIGNhc2UgSU5ERVhfb3BfbW92aV9pNjQ6CisgICAgICAgICAgICB0Y2dfcmVnX2FsbG9jX21vdmkocywgYXJncywgcy0+b3BfZGVhZF9hcmdzW29wX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vcF9zeW5jX2FyZ3Nbb3BfaW5kZXhdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOREVYX29wX2RlYnVnX2luc25fc3RhcnQ6CisgICAgICAgICAgICAvKiBkZWJ1ZyBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfbm9wOgorICAgICAgICBjYXNlIElOREVYX29wX25vcDE6CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfbm9wMjoKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9ub3AzOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfbm9wbjoKKyAgICAgICAgICAgIGFyZ3MgKz0gYXJnc1swXTsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9kaXNjYXJkOgorICAgICAgICAgICAgdGVtcF9kZWFkKHMsIGFyZ3NbMF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5ERVhfb3Bfc2V0X2xhYmVsOgorICAgICAgICAgICAgdGNnX3JlZ19hbGxvY19iYl9lbmQocywgcy0+cmVzZXJ2ZWRfcmVncyk7CisgICAgICAgICAgICB0Y2dfb3V0X2xhYmVsKHMsIGFyZ3NbMF0sIHMtPmNvZGVfcHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOREVYX29wX2NhbGw6CisgICAgICAgICAgICBhcmdzICs9IHRjZ19yZWdfYWxsb2NfY2FsbChzLCBkZWYsIG9wYywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm9wX2RlYWRfYXJnc1tvcF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vcF9zeW5jX2FyZ3Nbb3BfaW5kZXhdKTsKKyAgICAgICAgICAgIGdvdG8gbmV4dDsKKyAgICAgICAgY2FzZSBJTkRFWF9vcF9lbmQ6CisgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBTYW5pdHkgY2hlY2sgdGhhdCB3ZSd2ZSBub3QgaW50cm9kdWNlZCBhbnkgdW5oYW5kbGVkIG9wY29kZXMuICovCisgICAgICAgICAgICBpZiAoZGVmLT5mbGFncyAmIFRDR19PUEZfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgICAgICAgICB0Y2dfYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdGU6IGluIG9yZGVyIHRvIHNwZWVkIHVwIHRoZSBjb2RlLCBpdCB3b3VsZCBiZSBtdWNoCisgICAgICAgICAgICAgICBmYXN0ZXIgdG8gaGF2ZSBzcGVjaWFsaXplZCByZWdpc3RlciBhbGxvY2F0b3IgZnVuY3Rpb25zIGZvcgorICAgICAgICAgICAgICAgc29tZSBjb21tb24gYXJndW1lbnQgcGF0dGVybnMgKi8KKyAgICAgICAgICAgIHRjZ19yZWdfYWxsb2Nfb3AocywgZGVmLCBvcGMsIGFyZ3MsIHMtPm9wX2RlYWRfYXJnc1tvcF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm9wX3N5bmNfYXJnc1tvcF9pbmRleF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXJncyArPSBkZWYtPm5iX2FyZ3M7CisgICAgbmV4dDoKKyAgICAgICAgaWYgKHNlYXJjaF9wYyA+PSAwICYmIHNlYXJjaF9wYyA8IHMtPmNvZGVfcHRyIC0gZ2VuX2NvZGVfYnVmKSB7CisgICAgICAgICAgICByZXR1cm4gb3BfaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgb3BfaW5kZXgrKzsKKyNpZm5kZWYgTkRFQlVHCisgICAgICAgIGNoZWNrX3JlZ3Mocyk7CisjZW5kaWYKKyAgICB9CisgdGhlX2VuZDoKKyAgICAvKiBHZW5lcmF0ZSBUQiBmaW5hbGl6YXRpb24gYXQgdGhlIGVuZCBvZiBibG9jayAqLworICAgIHRjZ19vdXRfdGJfZmluYWxpemUocyk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgdGNnX2dlbl9jb2RlKFRDR0NvbnRleHQgKnMsIHVpbnQ4X3QgKmdlbl9jb2RlX2J1ZikKK3sKKyNpZmRlZiBDT05GSUdfUFJPRklMRVIKKyAgICB7CisgICAgICAgIGludCBuOworICAgICAgICBuID0gKHMtPmdlbl9vcGNfcHRyIC0gcy0+Z2VuX29wY19idWYpOworICAgICAgICBzLT5vcF9jb3VudCArPSBuOworICAgICAgICBpZiAobiA+IHMtPm9wX2NvdW50X21heCkKKyAgICAgICAgICAgIHMtPm9wX2NvdW50X21heCA9IG47CisKKyAgICAgICAgcy0+dGVtcF9jb3VudCArPSBzLT5uYl90ZW1wczsKKyAgICAgICAgaWYgKHMtPm5iX3RlbXBzID4gcy0+dGVtcF9jb3VudF9tYXgpCisgICAgICAgICAgICBzLT50ZW1wX2NvdW50X21heCA9IHMtPm5iX3RlbXBzOworICAgIH0KKyNlbmRpZgorCisgICAgdGNnX2dlbl9jb2RlX2NvbW1vbihzLCBnZW5fY29kZV9idWYsIC0xKTsKKworICAgIC8qIGZsdXNoIGluc3RydWN0aW9uIGNhY2hlICovCisgICAgZmx1c2hfaWNhY2hlX3JhbmdlKCh1aW50cHRyX3QpZ2VuX2NvZGVfYnVmLCAodWludHB0cl90KXMtPmNvZGVfcHRyKTsKKworICAgIHJldHVybiBzLT5jb2RlX3B0ciAtICBnZW5fY29kZV9idWY7Cit9CisKKy8qIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIG1pY3JvIG9wZXJhdGlvbiBzdWNoIGFzIHRoZSBwYyBhZnRlciBpcyA8CisgICBvZmZzZXQgYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRCLiAgVGhlIGNvbnRlbnRzIG9mIGdlbl9jb2RlX2J1ZiBtdXN0CisgICBub3QgYmUgY2hhbmdlZCwgdGhvdWdoIHdyaXRpbmcgdGhlIHNhbWUgdmFsdWVzIGlzIG9rLgorICAgUmV0dXJuIC0xIGlmIG5vdCBmb3VuZC4gKi8KK2ludCB0Y2dfZ2VuX2NvZGVfc2VhcmNoX3BjKFRDR0NvbnRleHQgKnMsIHVpbnQ4X3QgKmdlbl9jb2RlX2J1ZiwgbG9uZyBvZmZzZXQpCit7CisgICAgcmV0dXJuIHRjZ19nZW5fY29kZV9jb21tb24ocywgZ2VuX2NvZGVfYnVmLCBvZmZzZXQpOworfQorCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCit2b2lkIHRjZ19kdW1wX2luZm8oRklMRSAqZiwgZnByaW50Zl9mdW5jdGlvbiBjcHVfZnByaW50ZikKK3sKKyAgICBUQ0dDb250ZXh0ICpzID0gJnRjZ19jdHg7CisgICAgaW50NjRfdCB0b3Q7CisKKyAgICB0b3QgPSBzLT5pbnRlcm1fdGltZSArIHMtPmNvZGVfdGltZTsKKyAgICBjcHVfZnByaW50ZihmLCAiSklUIGN5Y2xlcyAgICAgICAgICAlIiBQUklkNjQgIiAoJTAuM2YgcyBhdCAyLjQgR0h6KVxuIiwKKyAgICAgICAgICAgICAgICB0b3QsIHRvdCAvIDIuNGU5KTsKKyAgICBjcHVfZnByaW50ZihmLCAidHJhbnNsYXRlZCBUQnMgICAgICAlIiBQUklkNjQgIiAoYWJvcnRlZD0lIiBQUklkNjQgIiAlMC4xZiUlKVxuIiwgCisgICAgICAgICAgICAgICAgcy0+dGJfY291bnQsIAorICAgICAgICAgICAgICAgIHMtPnRiX2NvdW50MSAtIHMtPnRiX2NvdW50LAorICAgICAgICAgICAgICAgIHMtPnRiX2NvdW50MSA/IChkb3VibGUpKHMtPnRiX2NvdW50MSAtIHMtPnRiX2NvdW50KSAvIHMtPnRiX2NvdW50MSAqIDEwMC4wIDogMCk7CisgICAgY3B1X2ZwcmludGYoZiwgImF2ZyBvcHMvVEIgICAgICAgICAgJTAuMWYgbWF4PSVkXG4iLCAKKyAgICAgICAgICAgICAgICBzLT50Yl9jb3VudCA/IChkb3VibGUpcy0+b3BfY291bnQgLyBzLT50Yl9jb3VudCA6IDAsIHMtPm9wX2NvdW50X21heCk7CisgICAgY3B1X2ZwcmludGYoZiwgImRlbGV0ZWQgb3BzL1RCICAgICAgJTAuMmZcbiIsCisgICAgICAgICAgICAgICAgcy0+dGJfY291bnQgPyAKKyAgICAgICAgICAgICAgICAoZG91YmxlKXMtPmRlbF9vcF9jb3VudCAvIHMtPnRiX2NvdW50IDogMCk7CisgICAgY3B1X2ZwcmludGYoZiwgImF2ZyB0ZW1wcy9UQiAgICAgICAgJTAuMmYgbWF4PSVkXG4iLAorICAgICAgICAgICAgICAgIHMtPnRiX2NvdW50ID8gCisgICAgICAgICAgICAgICAgKGRvdWJsZSlzLT50ZW1wX2NvdW50IC8gcy0+dGJfY291bnQgOiAwLAorICAgICAgICAgICAgICAgIHMtPnRlbXBfY291bnRfbWF4KTsKKyAgICAKKyAgICBjcHVfZnByaW50ZihmLCAiY3ljbGVzL29wICAgICAgICAgICAlMC4xZlxuIiwgCisgICAgICAgICAgICAgICAgcy0+b3BfY291bnQgPyAoZG91YmxlKXRvdCAvIHMtPm9wX2NvdW50IDogMCk7CisgICAgY3B1X2ZwcmludGYoZiwgImN5Y2xlcy9pbiBieXRlICAgICAgJTAuMWZcbiIsIAorICAgICAgICAgICAgICAgIHMtPmNvZGVfaW5fbGVuID8gKGRvdWJsZSl0b3QgLyBzLT5jb2RlX2luX2xlbiA6IDApOworICAgIGNwdV9mcHJpbnRmKGYsICJjeWNsZXMvb3V0IGJ5dGUgICAgICUwLjFmXG4iLCAKKyAgICAgICAgICAgICAgICBzLT5jb2RlX291dF9sZW4gPyAoZG91YmxlKXRvdCAvIHMtPmNvZGVfb3V0X2xlbiA6IDApOworICAgIGlmICh0b3QgPT0gMCkKKyAgICAgICAgdG90ID0gMTsKKyAgICBjcHVfZnByaW50ZihmLCAiICBnZW5faW50ZXJtIHRpbWUgICAlMC4xZiUlXG4iLCAKKyAgICAgICAgICAgICAgICAoZG91YmxlKXMtPmludGVybV90aW1lIC8gdG90ICogMTAwLjApOworICAgIGNwdV9mcHJpbnRmKGYsICIgIGdlbl9jb2RlIHRpbWUgICAgICUwLjFmJSVcbiIsIAorICAgICAgICAgICAgICAgIChkb3VibGUpcy0+Y29kZV90aW1lIC8gdG90ICogMTAwLjApOworICAgIGNwdV9mcHJpbnRmKGYsICJvcHRpbS4vY29kZSB0aW1lICAgICUwLjFmJSVcbiIsCisgICAgICAgICAgICAgICAgKGRvdWJsZSlzLT5vcHRfdGltZSAvIChzLT5jb2RlX3RpbWUgPyBzLT5jb2RlX3RpbWUgOiAxKQorICAgICAgICAgICAgICAgICogMTAwLjApOworICAgIGNwdV9mcHJpbnRmKGYsICJsaXZlbmVzcy9jb2RlIHRpbWUgICUwLjFmJSVcbiIsIAorICAgICAgICAgICAgICAgIChkb3VibGUpcy0+bGFfdGltZSAvIChzLT5jb2RlX3RpbWUgPyBzLT5jb2RlX3RpbWUgOiAxKSAqIDEwMC4wKTsKKyAgICBjcHVfZnByaW50ZihmLCAiY3B1X3Jlc3RvcmUgY291bnQgICAlIiBQUklkNjQgIlxuIiwKKyAgICAgICAgICAgICAgICBzLT5yZXN0b3JlX2NvdW50KTsKKyAgICBjcHVfZnByaW50ZihmLCAiICBhdmcgY3ljbGVzICAgICAgICAlMC4xZlxuIiwKKyAgICAgICAgICAgICAgICBzLT5yZXN0b3JlX2NvdW50ID8gKGRvdWJsZSlzLT5yZXN0b3JlX3RpbWUgLyBzLT5yZXN0b3JlX2NvdW50IDogMCk7CisKKyAgICBkdW1wX29wX2NvdW50KCk7Cit9CisjZWxzZQordm9pZCB0Y2dfZHVtcF9pbmZvKEZJTEUgKmYsIGZwcmludGZfZnVuY3Rpb24gY3B1X2ZwcmludGYpCit7CisgICAgY3B1X2ZwcmludGYoZiwgIltUQ0cgcHJvZmlsZXIgbm90IGNvbXBpbGVkXVxuIik7Cit9CisjZW5kaWYKKworI2lmZGVmIEVMRl9IT1NUX01BQ0hJTkUKKy8qIEluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUsIHRoZSBiYWNrZW5kIG5lZWRzIHRvIGRvIHRocmVlIHRoaW5nczoKKworICAgKDEpIERlZmluZSBFTEZfSE9TVF9NQUNISU5FIHRvIGluZGljYXRlIGJvdGggd2hhdCB2YWx1ZSB0bworICAgICAgIHB1dCBpbnRvIHRoZSBFTEYgaW1hZ2UgYW5kIHRvIGluZGljYXRlIHN1cHBvcnQgZm9yIHRoZSBmZWF0dXJlLgorCisgICAoMikgRGVmaW5lIHRjZ19yZWdpc3Rlcl9qaXQuICBUaGlzIHNob3VsZCBjcmVhdGUgYSBidWZmZXIgY29udGFpbmluZworICAgICAgIHRoZSBjb250ZW50cyBvZiBhIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBwb3N0LQorICAgICAgIHByb2xvZ3VlIHVud2luZCBpbmZvIGZvciB0aGUgdGNnIG1hY2hpbmUuCisKKyAgICgzKSBDYWxsIHRjZ19yZWdpc3Rlcl9qaXRfaW50LCB3aXRoIHRoZSBjb25zdHJ1Y3RlZCAuZGVidWdfZnJhbWUuCisqLworCisvKiBCZWdpbiBHREIgaW50ZXJmYWNlLiAgVEhFIEZPTExPV0lORyBNVVNUIE1BVENIIEdEQiBET0NTLiAgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSklUX05PQUNUSU9OID0gMCwKKyAgICBKSVRfUkVHSVNURVJfRk4sCisgICAgSklUX1VOUkVHSVNURVJfRk4KK30gaml0X2FjdGlvbnNfdDsKKworc3RydWN0IGppdF9jb2RlX2VudHJ5IHsKKyAgICBzdHJ1Y3Qgaml0X2NvZGVfZW50cnkgKm5leHRfZW50cnk7CisgICAgc3RydWN0IGppdF9jb2RlX2VudHJ5ICpwcmV2X2VudHJ5OworICAgIGNvbnN0IHZvaWQgKnN5bWZpbGVfYWRkcjsKKyAgICB1aW50NjRfdCBzeW1maWxlX3NpemU7Cit9OworCitzdHJ1Y3Qgaml0X2Rlc2NyaXB0b3IgeworICAgIHVpbnQzMl90IHZlcnNpb247CisgICAgdWludDMyX3QgYWN0aW9uX2ZsYWc7CisgICAgc3RydWN0IGppdF9jb2RlX2VudHJ5ICpyZWxldmFudF9lbnRyeTsKKyAgICBzdHJ1Y3Qgaml0X2NvZGVfZW50cnkgKmZpcnN0X2VudHJ5OworfTsKKwordm9pZCBfX2ppdF9kZWJ1Z19yZWdpc3Rlcl9jb2RlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Cit2b2lkIF9faml0X2RlYnVnX3JlZ2lzdGVyX2NvZGUodm9pZCkKK3sKKyAgICBhc20oIiIpOworfQorCisvKiBNdXN0IHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSB0aGUgdmVyc2lvbiwgYmVjYXVzZSBHREIgbWF5IGNoZWNrCisgICB0aGUgdmVyc2lvbiBiZWZvcmUgd2UgY2FuIHNldCBpdC4gICovCitzdHJ1Y3Qgaml0X2Rlc2NyaXB0b3IgX19qaXRfZGVidWdfZGVzY3JpcHRvciA9IHsgMSwgMCwgMCwgMCB9OworCisvKiBFbmQgR0RCIGludGVyZmFjZS4gICovCisKK3N0YXRpYyBpbnQgZmluZF9zdHJpbmcoY29uc3QgY2hhciAqc3RydGFiLCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgY29uc3QgY2hhciAqcCA9IHN0cnRhYiArIDE7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoc3RyY21wKHAsIHN0cikgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHAgLSBzdHJ0YWI7CisgICAgICAgIH0KKyAgICAgICAgcCArPSBzdHJsZW4ocCkgKyAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGNnX3JlZ2lzdGVyX2ppdF9pbnQodm9pZCAqYnVmX3B0ciwgc2l6ZV90IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGVidWdfZnJhbWUsIHNpemVfdCBkZWJ1Z19mcmFtZV9zaXplKQoreworICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBEZWJ1Z0luZm8geworICAgICAgICB1aW50MzJfdCAgbGVuOworICAgICAgICB1aW50MTZfdCAgdmVyc2lvbjsKKyAgICAgICAgdWludDMyX3QgIGFiYnJldjsKKyAgICAgICAgdWludDhfdCAgIHB0cl9zaXplOworICAgICAgICB1aW50OF90ICAgY3VfZGllOworICAgICAgICB1aW50MTZfdCAgY3VfbGFuZzsKKyAgICAgICAgdWludHB0cl90IGN1X2xvd19wYzsKKyAgICAgICAgdWludHB0cl90IGN1X2hpZ2hfcGM7CisgICAgICAgIHVpbnQ4X3QgICBmbl9kaWU7CisgICAgICAgIGNoYXIgICAgICBmbl9uYW1lWzE2XTsKKyAgICAgICAgdWludHB0cl90IGZuX2xvd19wYzsKKyAgICAgICAgdWludHB0cl90IGZuX2hpZ2hfcGM7CisgICAgICAgIHVpbnQ4X3QgICBjdV9lb2M7CisgICAgfTsKKworICAgIHN0cnVjdCBFbGZJbWFnZSB7CisgICAgICAgIEVsZlcoRWhkcikgZWhkcjsKKyAgICAgICAgRWxmVyhQaGRyKSBwaGRyOworICAgICAgICBFbGZXKFNoZHIpIHNoZHJbN107CisgICAgICAgIEVsZlcoU3ltKSAgc3ltWzJdOworICAgICAgICBzdHJ1Y3QgRGVidWdJbmZvIGRpOworICAgICAgICB1aW50OF90ICAgIGRhWzI0XTsKKyAgICAgICAgY2hhciAgICAgICBzdHJbODBdOworICAgIH07CisKKyAgICBzdHJ1Y3QgRWxmSW1hZ2UgKmltZzsKKworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgRWxmSW1hZ2UgaW1nX3RlbXBsYXRlID0geworICAgICAgICAuZWhkciA9IHsKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX01BRzBdID0gRUxGTUFHMCwKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX01BRzFdID0gRUxGTUFHMSwKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX01BRzJdID0gRUxGTUFHMiwKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX01BRzNdID0gRUxGTUFHMywKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX0NMQVNTXSA9IEVMRl9DTEFTUywKKyAgICAgICAgICAgIC5lX2lkZW50W0VJX0RBVEFdID0gRUxGX0RBVEEsCisgICAgICAgICAgICAuZV9pZGVudFtFSV9WRVJTSU9OXSA9IEVWX0NVUlJFTlQsCisgICAgICAgICAgICAuZV90eXBlID0gRVRfRVhFQywKKyAgICAgICAgICAgIC5lX21hY2hpbmUgPSBFTEZfSE9TVF9NQUNISU5FLAorICAgICAgICAgICAgLmVfdmVyc2lvbiA9IEVWX0NVUlJFTlQsCisgICAgICAgICAgICAuZV9waG9mZiA9IG9mZnNldG9mKHN0cnVjdCBFbGZJbWFnZSwgcGhkciksCisgICAgICAgICAgICAuZV9zaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBFbGZJbWFnZSwgc2hkciksCisgICAgICAgICAgICAuZV9laHNpemUgPSBzaXplb2YoRWxmVyhTaGRyKSksCisgICAgICAgICAgICAuZV9waGVudHNpemUgPSBzaXplb2YoRWxmVyhQaGRyKSksCisgICAgICAgICAgICAuZV9waG51bSA9IDEsCisgICAgICAgICAgICAuZV9zaGVudHNpemUgPSBzaXplb2YoRWxmVyhTaGRyKSksCisgICAgICAgICAgICAuZV9zaG51bSA9IEFSUkFZX1NJWkUoaW1nLT5zaGRyKSwKKyAgICAgICAgICAgIC5lX3Noc3RybmR4ID0gQVJSQVlfU0laRShpbWctPnNoZHIpIC0gMSwKKyNpZmRlZiBFTEZfSE9TVF9GTEFHUworICAgICAgICAgICAgLmVfZmxhZ3MgPSBFTEZfSE9TVF9GTEFHUywKKyNlbmRpZgorI2lmZGVmIEVMRl9PU0FCSQorICAgICAgICAgICAgLmVfaWRlbnRbRUlfT1NBQkldID0gRUxGX09TQUJJLAorI2VuZGlmCisgICAgICAgIH0sCisgICAgICAgIC5waGRyID0geworICAgICAgICAgICAgLnBfdHlwZSA9IFBUX0xPQUQsCisgICAgICAgICAgICAucF9mbGFncyA9IFBGX1gsCisgICAgICAgIH0sCisgICAgICAgIC5zaGRyID0geworICAgICAgICAgICAgWzBdID0geyAuc2hfdHlwZSA9IFNIVF9OVUxMIH0sCisgICAgICAgICAgICAvKiBUcmljazogVGhlIGNvbnRlbnRzIG9mIGNvZGVfZ2VuX2J1ZmZlciBhcmUgbm90IHByZXNlbnQgaW4KKyAgICAgICAgICAgICAgIHRoaXMgZmFrZSBFTEYgZmlsZTsgdGhhdCBnb3QgYWxsb2NhdGVkIGVsc2V3aGVyZS4gIFRoZXJlZm9yZQorICAgICAgICAgICAgICAgd2UgbWFyayAudGV4dCBhcyBTSFRfTk9CSVRTIChzaW1pbGFyIHRvIC5ic3MpIHNvIHRoYXQgcmVhZGVycworICAgICAgICAgICAgICAgd2lsbCBub3QgbG9vayBmb3IgY29udGVudHMuICBXZSBjYW4gcmVjb3JkIGFueSBhZGRyZXNzLiAgKi8KKyAgICAgICAgICAgIFsxXSA9IHsgLyogLnRleHQgKi8KKyAgICAgICAgICAgICAgICAuc2hfdHlwZSA9IFNIVF9OT0JJVFMsCisgICAgICAgICAgICAgICAgLnNoX2ZsYWdzID0gU0hGX0VYRUNJTlNUUiB8IFNIRl9BTExPQywKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbMl0gPSB7IC8qIC5kZWJ1Z19pbmZvICovCisgICAgICAgICAgICAgICAgLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFMsCisgICAgICAgICAgICAgICAgLnNoX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBFbGZJbWFnZSwgZGkpLAorICAgICAgICAgICAgICAgIC5zaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBEZWJ1Z0luZm8pLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFszXSA9IHsgLyogLmRlYnVnX2FiYnJldiAqLworICAgICAgICAgICAgICAgIC5zaF90eXBlID0gU0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgIC5zaF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgRWxmSW1hZ2UsIGRhKSwKKyAgICAgICAgICAgICAgICAuc2hfc2l6ZSA9IHNpemVvZihpbWctPmRhKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbNF0gPSB7IC8qIC5kZWJ1Z19mcmFtZSAqLworICAgICAgICAgICAgICAgIC5zaF90eXBlID0gU0hUX1BST0dCSVRTLAorICAgICAgICAgICAgICAgIC5zaF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IEVsZkltYWdlKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBbNV0gPSB7IC8qIC5zeW10YWIgKi8KKyAgICAgICAgICAgICAgICAuc2hfdHlwZSA9IFNIVF9TWU1UQUIsCisgICAgICAgICAgICAgICAgLnNoX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBFbGZJbWFnZSwgc3ltKSwKKyAgICAgICAgICAgICAgICAuc2hfc2l6ZSA9IHNpemVvZihpbWctPnN5bSksCisgICAgICAgICAgICAgICAgLnNoX2luZm8gPSAxLAorICAgICAgICAgICAgICAgIC5zaF9saW5rID0gQVJSQVlfU0laRShpbWctPnNoZHIpIC0gMSwKKyAgICAgICAgICAgICAgICAuc2hfZW50c2l6ZSA9IHNpemVvZihFbGZXKFN5bSkpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFs2XSA9IHsgLyogLnN0cnRhYiAqLworICAgICAgICAgICAgICAgIC5zaF90eXBlID0gU0hUX1NUUlRBQiwKKyAgICAgICAgICAgICAgICAuc2hfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IEVsZkltYWdlLCBzdHIpLAorICAgICAgICAgICAgICAgIC5zaF9zaXplID0gc2l6ZW9mKGltZy0+c3RyKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLnN5bSA9IHsKKyAgICAgICAgICAgIFsxXSA9IHsgLyogY29kZV9nZW5fYnVmZmVyICovCisgICAgICAgICAgICAgICAgLnN0X2luZm8gPSBFTEZfU1RfSU5GTyhTVEJfR0xPQkFMLCBTVFRfRlVOQyksCisgICAgICAgICAgICAgICAgLnN0X3NobmR4ID0gMSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLmRpID0geworICAgICAgICAgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3QgRGVidWdJbmZvKSAtIDQsCisgICAgICAgICAgICAudmVyc2lvbiA9IDIsCisgICAgICAgICAgICAucHRyX3NpemUgPSBzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgIC5jdV9kaWUgPSAxLAorICAgICAgICAgICAgLmN1X2xhbmcgPSAweDgwMDEsICAvKiBEV19MQU5HX01pcHNfQXNzZW1ibGVyICovCisgICAgICAgICAgICAuZm5fZGllID0gMiwKKyAgICAgICAgICAgIC5mbl9uYW1lID0gImNvZGVfZ2VuX2J1ZmZlciIKKyAgICAgICAgfSwKKyAgICAgICAgLmRhID0geworICAgICAgICAgICAgMSwgICAgICAgICAgLyogYWJicmV2IG51bWJlciAodGhlIGN1KSAqLworICAgICAgICAgICAgMHgxMSwgMSwgICAgLyogRFdfVEFHX2NvbXBpbGVfdW5pdCwgaGFzIGNoaWxkcmVuICovCisgICAgICAgICAgICAweDEzLCAweDUsICAvKiBEV19BVF9sYW5ndWFnZSwgRFdfRk9STV9kYXRhMiAqLworICAgICAgICAgICAgMHgxMSwgMHgxLCAgLyogRFdfQVRfbG93X3BjLCBEV19GT1JNX2FkZHIgKi8KKyAgICAgICAgICAgIDB4MTIsIDB4MSwgIC8qIERXX0FUX2hpZ2hfcGMsIERXX0ZPUk1fYWRkciAqLworICAgICAgICAgICAgMCwgMCwgICAgICAgLyogZW5kIG9mIGFiYnJldiAqLworICAgICAgICAgICAgMiwgICAgICAgICAgLyogYWJicmV2IG51bWJlciAodGhlIGZuKSAqLworICAgICAgICAgICAgMHgyZSwgMCwgICAgLyogRFdfVEFHX3N1YnByb2dyYW0sIG5vIGNoaWxkcmVuICovCisgICAgICAgICAgICAweDMsIDB4OCwgICAvKiBEV19BVF9uYW1lLCBEV19GT1JNX3N0cmluZyAqLworICAgICAgICAgICAgMHgxMSwgMHgxLCAgLyogRFdfQVRfbG93X3BjLCBEV19GT1JNX2FkZHIgKi8KKyAgICAgICAgICAgIDB4MTIsIDB4MSwgIC8qIERXX0FUX2hpZ2hfcGMsIERXX0ZPUk1fYWRkciAqLworICAgICAgICAgICAgMCwgMCwgICAgICAgLyogZW5kIG9mIGFiYnJldiAqLworICAgICAgICAgICAgMCAgICAgICAgICAgLyogbm8gbW9yZSBhYmJyZXYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLnN0ciA9ICJcMCIgIi50ZXh0XDAiICIuZGVidWdfaW5mb1wwIiAiLmRlYnVnX2FiYnJldlwwIgorICAgICAgICAgICAgICAgIi5kZWJ1Z19mcmFtZVwwIiAiLnN5bXRhYlwwIiAiLnN0cnRhYlwwIiAiY29kZV9nZW5fYnVmZmVyIiwKKyAgICB9OworCisgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlIGppdCBlbnRyeTsgc3RhdGljYWxseSBhbGxvY2F0ZSBpdC4gICovCisgICAgc3RhdGljIHN0cnVjdCBqaXRfY29kZV9lbnRyeSBvbmVfZW50cnk7CisKKyAgICB1aW50cHRyX3QgYnVmID0gKHVpbnRwdHJfdClidWZfcHRyOworICAgIHNpemVfdCBpbWdfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgRWxmSW1hZ2UpICsgZGVidWdfZnJhbWVfc2l6ZTsKKworICAgIGltZyA9IGdfbWFsbG9jKGltZ19zaXplKTsKKyAgICAqaW1nID0gaW1nX3RlbXBsYXRlOworICAgIG1lbWNweShpbWcgKyAxLCBkZWJ1Z19mcmFtZSwgZGVidWdfZnJhbWVfc2l6ZSk7CisKKyAgICBpbWctPnBoZHIucF92YWRkciA9IGJ1ZjsKKyAgICBpbWctPnBoZHIucF9wYWRkciA9IGJ1ZjsKKyAgICBpbWctPnBoZHIucF9tZW1zeiA9IGJ1Zl9zaXplOworCisgICAgaW1nLT5zaGRyWzFdLnNoX25hbWUgPSBmaW5kX3N0cmluZyhpbWctPnN0ciwgIi50ZXh0Iik7CisgICAgaW1nLT5zaGRyWzFdLnNoX2FkZHIgPSBidWY7CisgICAgaW1nLT5zaGRyWzFdLnNoX3NpemUgPSBidWZfc2l6ZTsKKworICAgIGltZy0+c2hkclsyXS5zaF9uYW1lID0gZmluZF9zdHJpbmcoaW1nLT5zdHIsICIuZGVidWdfaW5mbyIpOworICAgIGltZy0+c2hkclszXS5zaF9uYW1lID0gZmluZF9zdHJpbmcoaW1nLT5zdHIsICIuZGVidWdfYWJicmV2Iik7CisKKyAgICBpbWctPnNoZHJbNF0uc2hfbmFtZSA9IGZpbmRfc3RyaW5nKGltZy0+c3RyLCAiLmRlYnVnX2ZyYW1lIik7CisgICAgaW1nLT5zaGRyWzRdLnNoX3NpemUgPSBkZWJ1Z19mcmFtZV9zaXplOworCisgICAgaW1nLT5zaGRyWzVdLnNoX25hbWUgPSBmaW5kX3N0cmluZyhpbWctPnN0ciwgIi5zeW10YWIiKTsKKyAgICBpbWctPnNoZHJbNl0uc2hfbmFtZSA9IGZpbmRfc3RyaW5nKGltZy0+c3RyLCAiLnN0cnRhYiIpOworCisgICAgaW1nLT5zeW1bMV0uc3RfbmFtZSA9IGZpbmRfc3RyaW5nKGltZy0+c3RyLCAiY29kZV9nZW5fYnVmZmVyIik7CisgICAgaW1nLT5zeW1bMV0uc3RfdmFsdWUgPSBidWY7CisgICAgaW1nLT5zeW1bMV0uc3Rfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgaW1nLT5kaS5jdV9sb3dfcGMgPSBidWY7CisgICAgaW1nLT5kaS5jdV9oaWdoX3BjID0gYnVmICsgYnVmX3NpemU7CisgICAgaW1nLT5kaS5mbl9sb3dfcGMgPSBidWY7CisgICAgaW1nLT5kaS5mbl9oaWdoX3BjID0gYnVmICsgYnVmX3NpemU7CisKKyNpZmRlZiBERUJVR19KSVQKKyAgICAvKiBFbmFibGUgdGhpcyBibG9jayB0byBiZSBhYmxlIHRvIGRlYnVnIHRoZSBFTEYgaW1hZ2UgZmlsZSBjcmVhdGlvbi4KKyAgICAgICBPbmUgY2FuIHVzZSByZWFkZWxmLCBvYmpkdW1wLCBvciBvdGhlciBpbnNwZWN0aW9uIHV0aWxpdGllcy4gICovCisgICAgeworICAgICAgICBGSUxFICpmID0gZm9wZW4oIi90bXAvcWVtdS5qaXQiLCAidytiIik7CisgICAgICAgIGlmIChmKSB7CisgICAgICAgICAgICBpZiAoZndyaXRlKGltZywgaW1nX3NpemUsIDEsIGYpICE9IGltZ19zaXplKSB7CisgICAgICAgICAgICAgICAgLyogQXZvaWQgc3R1cGlkIHVudXNlZCByZXR1cm4gdmFsdWUgd2FybmluZyBmb3IgZndyaXRlLiAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgb25lX2VudHJ5LnN5bWZpbGVfYWRkciA9IGltZzsKKyAgICBvbmVfZW50cnkuc3ltZmlsZV9zaXplID0gaW1nX3NpemU7CisKKyAgICBfX2ppdF9kZWJ1Z19kZXNjcmlwdG9yLmFjdGlvbl9mbGFnID0gSklUX1JFR0lTVEVSX0ZOOworICAgIF9faml0X2RlYnVnX2Rlc2NyaXB0b3IucmVsZXZhbnRfZW50cnkgPSAmb25lX2VudHJ5OworICAgIF9faml0X2RlYnVnX2Rlc2NyaXB0b3IuZmlyc3RfZW50cnkgPSAmb25lX2VudHJ5OworICAgIF9faml0X2RlYnVnX3JlZ2lzdGVyX2NvZGUoKTsKK30KKyNlbHNlCisvKiBObyBzdXBwb3J0IGZvciB0aGUgZmVhdHVyZS4gIFByb3ZpZGUgdGhlIGVudHJ5IHBvaW50IGV4cGVjdGVkIGJ5IGV4ZWMuYywKKyAgIGFuZCBpbXBsZW1lbnQgdGhlIGludGVybmFsIGZ1bmN0aW9uIHdlIGRlY2xhcmVkIGVhcmxpZXIuICAqLworCitzdGF0aWMgdm9pZCB0Y2dfcmVnaXN0ZXJfaml0X2ludCh2b2lkICpidWYsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGVidWdfZnJhbWUsIHNpemVfdCBkZWJ1Z19mcmFtZV9zaXplKQoreworfQorCit2b2lkIHRjZ19yZWdpc3Rlcl9qaXQodm9pZCAqYnVmLCBzaXplX3QgYnVmX3NpemUpCit7Cit9CisjZW5kaWYgLyogRUxGX0hPU1RfTUFDSElORSAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS90Y2cvdGNnLmggYi9hbmRyb2lkL3FlbXUxL3RjZy90Y2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJiZjEwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS90Y2cvdGNnLmgKQEAgLTAsMCArMSw4NTcgQEAKKy8qCisgKiBUaW55IENvZGUgR2VuZXJhdG9yIGZvciBRRU1VCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFRDR19ICisjZGVmaW5lIFRDR19ICisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvYml0b3BzLmgiCisjaW5jbHVkZSAidGNnLXRhcmdldC5oIgorCisvKiBEZWZhdWx0IHRhcmdldCB3b3JkIHNpemUgdG8gcG9pbnRlciBzaXplLiAgKi8KKyNpZm5kZWYgVENHX1RBUkdFVF9SRUdfQklUUworIyBpZiBVSU5UUFRSX01BWCA9PSBVSU5UMzJfTUFYCisjICBkZWZpbmUgVENHX1RBUkdFVF9SRUdfQklUUyAzMgorIyBlbGlmIFVJTlRQVFJfTUFYID09IFVJTlQ2NF9NQVgKKyMgIGRlZmluZSBUQ0dfVEFSR0VUX1JFR19CSVRTIDY0CisjIGVsc2UKKyMgIGVycm9yIFVua25vd24gcG9pbnRlciBzaXplIGZvciB0Y2cgdGFyZ2V0CisjIGVuZGlmCisjZW5kaWYKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKK3R5cGVkZWYgaW50MzJfdCB0Y2dfdGFyZ2V0X2xvbmc7Cit0eXBlZGVmIHVpbnQzMl90IHRjZ190YXJnZXRfdWxvbmc7CisjZGVmaW5lIFRDR19QUklseCBQUkl4MzIKKyNkZWZpbmUgVENHX1BSSWxkIFBSSWQzMgorI2VsaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSA2NAordHlwZWRlZiBpbnQ2NF90IHRjZ190YXJnZXRfbG9uZzsKK3R5cGVkZWYgdWludDY0X3QgdGNnX3RhcmdldF91bG9uZzsKKyNkZWZpbmUgVENHX1BSSWx4IFBSSXg2NAorI2RlZmluZSBUQ0dfUFJJbGQgUFJJZDY0CisjZWxzZQorI2Vycm9yIHVuc3VwcG9ydGVkCisjZW5kaWYKKworI2luY2x1ZGUgInRjZy1ydW50aW1lLmgiCisKKyNpZiBUQ0dfVEFSR0VUX05CX1JFR1MgPD0gMzIKK3R5cGVkZWYgdWludDMyX3QgVENHUmVnU2V0OworI2VsaWYgVENHX1RBUkdFVF9OQl9SRUdTIDw9IDY0Cit0eXBlZGVmIHVpbnQ2NF90IFRDR1JlZ1NldDsKKyNlbHNlCisjZXJyb3IgdW5zdXBwb3J0ZWQKKyNlbmRpZgorCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorLyogVHVybiBzb21lIHVuZGVmIG1hY3JvcyBpbnRvIGZhbHNlIG1hY3Jvcy4gICovCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2Rpdl9pNjQgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19yZW1faTY0ICAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZGl2Ml9pNjQgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX3JvdF9pNjQgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19leHQ4c19pNjQgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXh0MTZzX2k2NCAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDMyc19pNjQgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19leHQ4dV9pNjQgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXh0MTZ1X2k2NCAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2V4dDMydV9pNjQgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19ic3dhcDE2X2k2NCAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYnN3YXAzMl9pNjQgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2Jzd2FwNjRfaTY0ICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19uZWdfaTY0ICAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbm90X2k2NCAgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2FuZGNfaTY0ICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19vcmNfaTY0ICAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZXF2X2k2NCAgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX25hbmRfaTY0ICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19ub3JfaTY0ICAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZGVwb3NpdF9pNjQgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX21vdmNvbmRfaTY0ICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19hZGQyX2k2NCAgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfc3ViMl9pNjQgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX211bHUyX2k2NCAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tdWxzMl9pNjQgICAgICAgIDAKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfbXVsdWhfaTY0ICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX211bHNoX2k2NCAgICAgICAgMAorLyogVHVybiBzb21lIHVuZGVmIG1hY3JvcyBpbnRvIHRydWUgbWFjcm9zLiAgKi8KKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfYWRkMl9pMzIgICAgICAgICAxCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX3N1YjJfaTMyICAgICAgICAgMQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19tdWx1Ml9pMzIgICAgICAgIDEKKyNlbmRpZgorCisjaWZuZGVmIFRDR19UQVJHRVRfZGVwb3NpdF9pMzJfdmFsaWQKKyNkZWZpbmUgVENHX1RBUkdFVF9kZXBvc2l0X2kzMl92YWxpZChvZnMsIGxlbikgMQorI2VuZGlmCisjaWZuZGVmIFRDR19UQVJHRVRfZGVwb3NpdF9pNjRfdmFsaWQKKyNkZWZpbmUgVENHX1RBUkdFVF9kZXBvc2l0X2k2NF92YWxpZChvZnMsIGxlbikgMQorI2VuZGlmCisKKy8qIE9ubHkgb25lIG9mIERJViBvciBESVYyIHNob3VsZCBiZSBkZWZpbmVkLiAgKi8KKyNpZiBkZWZpbmVkKFRDR19UQVJHRVRfSEFTX2Rpdl9pMzIpCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2RpdjJfaTMyICAgICAgICAgMAorI2VsaWYgZGVmaW5lZChUQ0dfVEFSR0VUX0hBU19kaXYyX2kzMikKKyNkZWZpbmUgVENHX1RBUkdFVF9IQVNfZGl2X2kzMiAgICAgICAgICAwCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX3JlbV9pMzIgICAgICAgICAgMAorI2VuZGlmCisjaWYgZGVmaW5lZChUQ0dfVEFSR0VUX0hBU19kaXZfaTY0KQorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19kaXYyX2k2NCAgICAgICAgIDAKKyNlbGlmIGRlZmluZWQoVENHX1RBUkdFVF9IQVNfZGl2Ml9pNjQpCisjZGVmaW5lIFRDR19UQVJHRVRfSEFTX2Rpdl9pNjQgICAgICAgICAgMAorI2RlZmluZSBUQ0dfVEFSR0VUX0hBU19yZW1faTY0ICAgICAgICAgIDAKKyNlbmRpZgorCit0eXBlZGVmIGVudW0gVENHT3Bjb2RlIHsKKyNkZWZpbmUgREVGKG5hbWUsIG9hcmdzLCBpYXJncywgY2FyZ3MsIGZsYWdzKSBJTkRFWF9vcF8gIyMgbmFtZSwKKyNpbmNsdWRlICJ0Y2ctb3BjLmgiCisjdW5kZWYgREVGCisgICAgTkJfT1BTLAorfSBUQ0dPcGNvZGU7CisKKyNkZWZpbmUgdGNnX3JlZ3NldF9jbGVhcihkKSAoZCkgPSAwCisjZGVmaW5lIHRjZ19yZWdzZXRfc2V0KGQsIHMpIChkKSA9IChzKQorI2RlZmluZSB0Y2dfcmVnc2V0X3NldDMyKGQsIHJlZywgdmFsMzIpIChkKSB8PSAodmFsMzIpIDw8IChyZWcpCisjZGVmaW5lIHRjZ19yZWdzZXRfc2V0X3JlZyhkLCByKSAoZCkgfD0gMUwgPDwgKHIpCisjZGVmaW5lIHRjZ19yZWdzZXRfcmVzZXRfcmVnKGQsIHIpIChkKSAmPSB+KDFMIDw8IChyKSkKKyNkZWZpbmUgdGNnX3JlZ3NldF90ZXN0X3JlZyhkLCByKSAoKChkKSA+PiAocikpICYgMSkKKyNkZWZpbmUgdGNnX3JlZ3NldF9vcihkLCBhLCBiKSAoZCkgPSAoYSkgfCAoYikKKyNkZWZpbmUgdGNnX3JlZ3NldF9hbmQoZCwgYSwgYikgKGQpID0gKGEpICYgKGIpCisjZGVmaW5lIHRjZ19yZWdzZXRfYW5kbm90KGQsIGEsIGIpIChkKSA9IChhKSAmIH4oYikKKyNkZWZpbmUgdGNnX3JlZ3NldF9ub3QoZCwgYSkgKGQpID0gfihhKQorCit0eXBlZGVmIHN0cnVjdCBUQ0dSZWxvY2F0aW9uIHsKKyAgICBzdHJ1Y3QgVENHUmVsb2NhdGlvbiAqbmV4dDsKKyAgICBpbnQgdHlwZTsKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50cHRyX3QgYWRkZW5kOworfSBUQ0dSZWxvY2F0aW9uOyAKKwordHlwZWRlZiBzdHJ1Y3QgVENHTGFiZWwgeworICAgIGludCBoYXNfdmFsdWU7CisgICAgdW5pb24geworICAgICAgICB1aW50cHRyX3QgdmFsdWU7CisgICAgICAgIFRDR1JlbG9jYXRpb24gKmZpcnN0X3JlbG9jOworICAgIH0gdTsKK30gVENHTGFiZWw7CisKK3R5cGVkZWYgc3RydWN0IFRDR1Bvb2wgeworICAgIHN0cnVjdCBUQ0dQb29sICpuZXh0OworICAgIGludCBzaXplOworICAgIHVpbnQ4X3QgZGF0YVswXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCkpOworfSBUQ0dQb29sOworCisjZGVmaW5lIFRDR19QT09MX0NIVU5LX1NJWkUgMzI3NjgKKworI2RlZmluZSBUQ0dfTUFYX0xBQkVMUyA1MTIKKworI2RlZmluZSBUQ0dfTUFYX1RFTVBTIDEwMjQKKworLyogd2hlbiB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIG9mIGEgY2FsbGVkIGZ1bmN0aW9uIGlzIHNtYWxsZXIgdGhhbgorICAgdGhpcyB2YWx1ZSwgdGhleSBhcmUgc3RhdGljYWxseSBhbGxvY2F0ZWQgaW4gdGhlIFRCIHN0YWNrIGZyYW1lICovCisjZGVmaW5lIFRDR19TVEFUSUNfQ0FMTF9BUkdTX1NJWkUgMTI4CisKK3R5cGVkZWYgZW51bSBUQ0dUeXBlIHsKKyAgICBUQ0dfVFlQRV9JMzIsCisgICAgVENHX1RZUEVfSTY0LAorICAgIFRDR19UWVBFX0NPVU5ULCAvKiBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzICovCisKKyAgICAvKiBBbiBhbGlhcyBmb3IgdGhlIHNpemUgb2YgdGhlIGhvc3QgcmVnaXN0ZXIuICAqLworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyAgICBUQ0dfVFlQRV9SRUcgPSBUQ0dfVFlQRV9JMzIsCisjZWxzZQorICAgIFRDR19UWVBFX1JFRyA9IFRDR19UWVBFX0k2NCwKKyNlbmRpZgorCisgICAgLyogQW4gYWxpYXMgZm9yIHRoZSBzaXplIG9mIHRoZSBuYXRpdmUgcG9pbnRlci4gICovCisjaWYgVUlOVFBUUl9NQVggPT0gVUlOVDMyX01BWAorICAgIFRDR19UWVBFX1BUUiA9IFRDR19UWVBFX0kzMiwKKyNlbHNlCisgICAgVENHX1RZUEVfUFRSID0gVENHX1RZUEVfSTY0LAorI2VuZGlmCisKKyAgICAvKiBBbiBhbGlhcyBmb3IgdGhlIHNpemUgb2YgdGhlIHRhcmdldCAibG9uZyIsIGFrYSByZWdpc3Rlci4gICovCisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSA2NAorICAgIFRDR19UWVBFX1RMID0gVENHX1RZUEVfSTY0LAorI2Vsc2UKKyAgICBUQ0dfVFlQRV9UTCA9IFRDR19UWVBFX0kzMiwKKyNlbmRpZgorfSBUQ0dUeXBlOworCisvKiBDb25zdGFudHMgZm9yIHFlbXVfbGQgYW5kIHFlbXVfc3QgZm9yIHRoZSBNZW1vcnkgT3BlcmF0aW9uIGZpZWxkLiAgKi8KK3R5cGVkZWYgZW51bSBUQ0dNZW1PcCB7CisgICAgTU9fOCAgICAgPSAwLAorICAgIE1PXzE2ICAgID0gMSwKKyAgICBNT18zMiAgICA9IDIsCisgICAgTU9fNjQgICAgPSAzLAorICAgIE1PX1NJWkUgID0gMywgICAvKiBNYXNrIGZvciB0aGUgYWJvdmUuICAqLworCisgICAgTU9fU0lHTiAgPSA0LCAgIC8qIFNpZ24tZXh0ZW5kZWQsIG90aGVyd2lzZSB6ZXJvLWV4dGVuZGVkLiAgKi8KKworICAgIE1PX0JTV0FQID0gOCwgICAvKiBIb3N0IHJldmVyc2UgZW5kaWFuLiAgKi8KKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgIE1PX0xFICAgID0gTU9fQlNXQVAsCisgICAgTU9fQkUgICAgPSAwLAorI2Vsc2UKKyAgICBNT19MRSAgICA9IDAsCisgICAgTU9fQkUgICAgPSBNT19CU1dBUCwKKyNlbmRpZgorI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KKyAgICBNT19URSAgICA9IE1PX0JFLAorI2Vsc2UKKyAgICBNT19URSAgICA9IE1PX0xFLAorI2VuZGlmCisKKyAgICAvKiBDb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlLCBmb3IgZWFzZSBvZiB1c2UuICAqLworICAgIE1PX1VCICAgID0gTU9fOCwKKyAgICBNT19VVyAgICA9IE1PXzE2LAorICAgIE1PX1VMICAgID0gTU9fMzIsCisgICAgTU9fU0IgICAgPSBNT19TSUdOIHwgTU9fOCwKKyAgICBNT19TVyAgICA9IE1PX1NJR04gfCBNT18xNiwKKyAgICBNT19TTCAgICA9IE1PX1NJR04gfCBNT18zMiwKKyAgICBNT19RICAgICA9IE1PXzY0LAorCisgICAgTU9fTEVVVyAgPSBNT19MRSB8IE1PX1VXLAorICAgIE1PX0xFVUwgID0gTU9fTEUgfCBNT19VTCwKKyAgICBNT19MRVNXICA9IE1PX0xFIHwgTU9fU1csCisgICAgTU9fTEVTTCAgPSBNT19MRSB8IE1PX1NMLAorICAgIE1PX0xFUSAgID0gTU9fTEUgfCBNT19RLAorCisgICAgTU9fQkVVVyAgPSBNT19CRSB8IE1PX1VXLAorICAgIE1PX0JFVUwgID0gTU9fQkUgfCBNT19VTCwKKyAgICBNT19CRVNXICA9IE1PX0JFIHwgTU9fU1csCisgICAgTU9fQkVTTCAgPSBNT19CRSB8IE1PX1NMLAorICAgIE1PX0JFUSAgID0gTU9fQkUgfCBNT19RLAorCisgICAgTU9fVEVVVyAgPSBNT19URSB8IE1PX1VXLAorICAgIE1PX1RFVUwgID0gTU9fVEUgfCBNT19VTCwKKyAgICBNT19URVNXICA9IE1PX1RFIHwgTU9fU1csCisgICAgTU9fVEVTTCAgPSBNT19URSB8IE1PX1NMLAorICAgIE1PX1RFUSAgID0gTU9fVEUgfCBNT19RLAorCisgICAgTU9fU1NJWkUgPSBNT19TSVpFIHwgTU9fU0lHTiwKK30gVENHTWVtT3A7CisKK3R5cGVkZWYgdGNnX3RhcmdldF91bG9uZyBUQ0dBcmc7CisKKy8qIERlZmluZSBhIHR5cGUgYW5kIGFjY2Vzc29yIG1hY3JvcyBmb3IgdmFyaWFibGVzLiAgVXNpbmcgYSBzdHJ1Y3QgaXMKKyAgIG5pY2UgYmVjYXVzZSBpdCBnaXZlcyBzb21lIGxldmVsIG9mIHR5cGUgc2FmZWx5LiAgSWRlYWxseSB0aGUgY29tcGlsZXIKKyAgIGJlIGFibGUgdG8gc2VlIHRocm91Z2ggYWxsIHRoaXMuICBIb3dldmVyIGluIHByYWN0aWNlIHRoaXMgaXMgbm90IHRydWUsCisgICBlc3BlY2lhbGx5IG9uIHRhcmdldHMgd2l0aCBicmFpbmRhbWFnZWQgQUJJcyAoZS5nLiBpMzg2KS4KKyAgIFdlIHVzZSBwbGFpbiBpbnQgYnkgZGVmYXVsdCB0byBhdm9pZCB0aGlzIHJ1bnRpbWUgb3ZlcmhlYWQuCisgICBVc2VycyBvZiB0Y2dfZ2VuXyogZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0IGFueSBvZiB0aGlzLCBhbmQgc2hvdWxkCisgICB0cmVhdCBUQ0d2IGFzIGFuIG9wYXF1ZSB0eXBlLgorICAgSW4gYWRkaXRpb24gd2UgZG8gdHlwZWNoZWNraW5nIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFibGVzLiAgVENHdl9pMzIKKyAgIGFuZCBUQ0d2X2k2NCBhcmUgMzIvNjQtYml0IHZhcmlhYmxlcyByZXNwZWN0aXZlbHkuICBUQ0d2IGFuZCBUQ0d2X3B0cgorICAgYXJlIGFsaWFzZXMgZm9yIHRhcmdldF91bG9uZyBhbmQgaG9zdCBwb2ludGVyIHNpemVkIHZhbHVlcyByZXNwZWN0aXZlbHkuCisgKi8KKworI2lmZGVmIENPTkZJR19ERUJVR19UQ0cKKyNkZWZpbmUgREVCVUdfVENHViAxCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1RDR1YKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgaTMyOworfSBUQ0d2X2kzMjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBpbnQgaTY0OworfSBUQ0d2X2k2NDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpcHRyOworfSBUQ0d2X3B0cjsKKworI2RlZmluZSBNQUtFX1RDR1ZfSTMyKGkpIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICBcCisgICAgKHsgVENHdl9pMzIgbWFrZV90Y2d2X3RtcCA9IHtpfTsgbWFrZV90Y2d2X3RtcDt9KQorI2RlZmluZSBNQUtFX1RDR1ZfSTY0KGkpIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICBcCisgICAgKHsgVENHdl9pNjQgbWFrZV90Y2d2X3RtcCA9IHtpfTsgbWFrZV90Y2d2X3RtcDt9KQorI2RlZmluZSBNQUtFX1RDR1ZfUFRSKGkpIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICBcCisgICAgKHsgVENHdl9wdHIgbWFrZV90Y2d2X3RtcCA9IHtpfTsgbWFrZV90Y2d2X3RtcDsgfSkKKyNkZWZpbmUgR0VUX1RDR1ZfSTMyKHQpICgodCkuaTMyKQorI2RlZmluZSBHRVRfVENHVl9JNjQodCkgKCh0KS5pNjQpCisjZGVmaW5lIEdFVF9UQ0dWX1BUUih0KSAoKHQpLmlwdHIpCisjaWYgVENHX1RBUkdFVF9SRUdfQklUUyA9PSAzMgorI2RlZmluZSBUQ0dWX0xPVyh0KSBNQUtFX1RDR1ZfSTMyKEdFVF9UQ0dWX0k2NCh0KSkKKyNkZWZpbmUgVENHVl9ISUdIKHQpIE1BS0VfVENHVl9JMzIoR0VUX1RDR1ZfSTY0KHQpICsgMSkKKyNlbmRpZgorCisjZWxzZSAvKiAhREVCVUdfVENHViAqLworCit0eXBlZGVmIGludCBUQ0d2X2kzMjsKK3R5cGVkZWYgaW50IFRDR3ZfaTY0OworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyNkZWZpbmUgVENHdl9wdHIgVENHdl9pMzIKKyNlbHNlCisjZGVmaW5lIFRDR3ZfcHRyIFRDR3ZfaTY0CisjZW5kaWYKKyNkZWZpbmUgTUFLRV9UQ0dWX0kzMih4KSAoeCkKKyNkZWZpbmUgTUFLRV9UQ0dWX0k2NCh4KSAoeCkKKyNkZWZpbmUgTUFLRV9UQ0dWX1BUUih4KSAoeCkKKyNkZWZpbmUgR0VUX1RDR1ZfSTMyKHQpICh0KQorI2RlZmluZSBHRVRfVENHVl9JNjQodCkgKHQpCisjZGVmaW5lIEdFVF9UQ0dWX1BUUih0KSAodCkKKworI2lmIFRDR19UQVJHRVRfUkVHX0JJVFMgPT0gMzIKKyNkZWZpbmUgVENHVl9MT1codCkgKHQpCisjZGVmaW5lIFRDR1ZfSElHSCh0KSAoKHQpICsgMSkKKyNlbmRpZgorCisjZW5kaWYgLyogREVCVUdfVENHViAqLworCisjZGVmaW5lIFRDR1ZfRVFVQUxfSTMyKGEsIGIpIChHRVRfVENHVl9JMzIoYSkgPT0gR0VUX1RDR1ZfSTMyKGIpKQorI2RlZmluZSBUQ0dWX0VRVUFMX0k2NChhLCBiKSAoR0VUX1RDR1ZfSTY0KGEpID09IEdFVF9UQ0dWX0k2NChiKSkKKyNkZWZpbmUgVENHVl9FUVVBTF9QVFIoYSwgYikgKEdFVF9UQ0dWX1BUUihhKSA9PSBHRVRfVENHVl9QVFIoYikpCisKKy8qIER1bW15IGRlZmluaXRpb24gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuICAqLworI2RlZmluZSBUQ0dWX1VOVVNFRF9JMzIoeCkgeCA9IE1BS0VfVENHVl9JMzIoLTEpCisjZGVmaW5lIFRDR1ZfVU5VU0VEX0k2NCh4KSB4ID0gTUFLRV9UQ0dWX0k2NCgtMSkKKyNkZWZpbmUgVENHVl9VTlVTRURfUFRSKHgpIHggPSBNQUtFX1RDR1ZfUFRSKC0xKQorCisjZGVmaW5lIFRDR1ZfSVNfVU5VU0VEX0kzMih4KSAoR0VUX1RDR1ZfSTMyKHgpID09IC0xKQorI2RlZmluZSBUQ0dWX0lTX1VOVVNFRF9JNjQoeCkgKEdFVF9UQ0dWX0k2NCh4KSA9PSAtMSkKKyNkZWZpbmUgVENHVl9JU19VTlVTRURfUFRSKHgpIChHRVRfVENHVl9QVFIoeCkgPT0gLTEpCisKKy8qIGNhbGwgZmxhZ3MgKi8KKy8qIEhlbHBlciBkb2VzIG5vdCByZWFkIGdsb2JhbHMgKGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIGFuIGV4Y2VwdGlvbikuIEl0CisgICBpbXBsaWVzIFRDR19DQUxMX05PX1dSSVRFX0dMT0JBTFMuICovCisjZGVmaW5lIFRDR19DQUxMX05PX1JFQURfR0xPQkFMUyAgICAweDAwMTAKKy8qIEhlbHBlciBkb2VzIG5vdCB3cml0ZSBnbG9iYWxzICovCisjZGVmaW5lIFRDR19DQUxMX05PX1dSSVRFX0dMT0JBTFMgICAweDAwMjAKKy8qIEhlbHBlciBjYW4gYmUgc2FmZWx5IHN1cHByZXNzZWQgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC4gKi8KKyNkZWZpbmUgVENHX0NBTExfTk9fU0lERV9FRkZFQ1RTICAgIDB4MDA0MAorCisvKiBjb252ZW5pZW5jZSB2ZXJzaW9uIG9mIG1vc3QgdXNlZCBjYWxsIGZsYWdzICovCisjZGVmaW5lIFRDR19DQUxMX05PX1JXRyAgICAgICAgIFRDR19DQUxMX05PX1JFQURfR0xPQkFMUworI2RlZmluZSBUQ0dfQ0FMTF9OT19XRyAgICAgICAgICBUQ0dfQ0FMTF9OT19XUklURV9HTE9CQUxTCisjZGVmaW5lIFRDR19DQUxMX05PX1NFICAgICAgICAgIFRDR19DQUxMX05PX1NJREVfRUZGRUNUUworI2RlZmluZSBUQ0dfQ0FMTF9OT19SV0dfU0UgICAgICAoVENHX0NBTExfTk9fUldHIHwgVENHX0NBTExfTk9fU0UpCisjZGVmaW5lIFRDR19DQUxMX05PX1dHX1NFICAgICAgIChUQ0dfQ0FMTF9OT19XRyB8IFRDR19DQUxMX05PX1NFKQorCisvKiB1c2VkIHRvIGFsaWduIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgVENHX0NBTExfRFVNTVlfVENHViAgICAgTUFLRV9UQ0dWX0kzMigtMSkKKyNkZWZpbmUgVENHX0NBTExfRFVNTVlfQVJHICAgICAgKChUQ0dBcmcpKC0xKSkKKworLyogQ29uZGl0aW9ucy4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgbGFpZCBvdXQgZm9yIGVhc3kgbWFuaXB1bGF0aW9uIGJ5CisgICB0aGUgZnVuY3Rpb25zIGJlbG93OgorICAgICBiaXQgMCBpcyB1c2VkIGZvciBpbnZlcnRpbmc7CisgICAgIGJpdCAxIGlzIHNpZ25lZCwKKyAgICAgYml0IDIgaXMgdW5zaWduZWQsCisgICAgIGJpdCAzIGlzIHVzZWQgd2l0aCBiaXQgMCBmb3Igc3dhcHBpbmcgc2lnbmVkL3Vuc2lnbmVkLiAgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgLyogbm9uLXNpZ25lZCAqLworICAgIFRDR19DT05EX05FVkVSICA9IDAgfCAwIHwgMCB8IDAsCisgICAgVENHX0NPTkRfQUxXQVlTID0gMCB8IDAgfCAwIHwgMSwKKyAgICBUQ0dfQ09ORF9FUSAgICAgPSA4IHwgMCB8IDAgfCAwLAorICAgIFRDR19DT05EX05FICAgICA9IDggfCAwIHwgMCB8IDEsCisgICAgLyogc2lnbmVkICovCisgICAgVENHX0NPTkRfTFQgICAgID0gMCB8IDAgfCAyIHwgMCwKKyAgICBUQ0dfQ09ORF9HRSAgICAgPSAwIHwgMCB8IDIgfCAxLAorICAgIFRDR19DT05EX0xFICAgICA9IDggfCAwIHwgMiB8IDAsCisgICAgVENHX0NPTkRfR1QgICAgID0gOCB8IDAgfCAyIHwgMSwKKyAgICAvKiB1bnNpZ25lZCAqLworICAgIFRDR19DT05EX0xUVSAgICA9IDAgfCA0IHwgMCB8IDAsCisgICAgVENHX0NPTkRfR0VVICAgID0gMCB8IDQgfCAwIHwgMSwKKyAgICBUQ0dfQ09ORF9MRVUgICAgPSA4IHwgNCB8IDAgfCAwLAorICAgIFRDR19DT05EX0dUVSAgICA9IDggfCA0IHwgMCB8IDEsCit9IFRDR0NvbmQ7CisKKy8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdGhlIGNvbXBhcmlzb24uICAqLworc3RhdGljIGlubGluZSBUQ0dDb25kIHRjZ19pbnZlcnRfY29uZChUQ0dDb25kIGMpCit7CisgICAgcmV0dXJuIChUQ0dDb25kKShjIF4gMSk7Cit9CisKKy8qIFN3YXAgdGhlIG9wZXJhbmRzIGluIGEgY29tcGFyaXNvbi4gICovCitzdGF0aWMgaW5saW5lIFRDR0NvbmQgdGNnX3N3YXBfY29uZChUQ0dDb25kIGMpCit7CisgICAgcmV0dXJuIGMgJiA2ID8gKFRDR0NvbmQpKGMgXiA5KSA6IGM7Cit9CisKKy8qIENyZWF0ZSBhbiAidW5zaWduZWQiIHZlcnNpb24gb2YgYSAic2lnbmVkIiBjb21wYXJpc29uLiAgKi8KK3N0YXRpYyBpbmxpbmUgVENHQ29uZCB0Y2dfdW5zaWduZWRfY29uZChUQ0dDb25kIGMpCit7CisgICAgcmV0dXJuIGMgJiAyID8gKFRDR0NvbmQpKGMgXiA2KSA6IGM7Cit9CisKKy8qIE11c3QgYSBjb21wYXJpc29uIGJlIGNvbnNpZGVyZWQgdW5zaWduZWQ/ICAqLworc3RhdGljIGlubGluZSBib29sIGlzX3Vuc2lnbmVkX2NvbmQoVENHQ29uZCBjKQoreworICAgIHJldHVybiAoYyAmIDQpICE9IDA7Cit9CisKKy8qIENyZWF0ZSBhICJoaWdoIiB2ZXJzaW9uIG9mIGEgZG91YmxlLXdvcmQgY29tcGFyaXNvbi4KKyAgIFRoaXMgcmVtb3ZlcyBlcXVhbGl0eSBmcm9tIGEgTFRFIG9yIEdURSBjb21wYXJpc29uLiAgKi8KK3N0YXRpYyBpbmxpbmUgVENHQ29uZCB0Y2dfaGlnaF9jb25kKFRDR0NvbmQgYykKK3sKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlIFRDR19DT05EX0dFOgorICAgIGNhc2UgVENHX0NPTkRfTEU6CisgICAgY2FzZSBUQ0dfQ09ORF9HRVU6CisgICAgY2FzZSBUQ0dfQ09ORF9MRVU6CisgICAgICAgIHJldHVybiAoVENHQ29uZCkoYyBeIDgpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBjOworICAgIH0KK30KKworI2RlZmluZSBURU1QX1ZBTF9ERUFEICAwCisjZGVmaW5lIFRFTVBfVkFMX1JFRyAgIDEKKyNkZWZpbmUgVEVNUF9WQUxfTUVNICAgMgorI2RlZmluZSBURU1QX1ZBTF9DT05TVCAzCisKKy8qIFhYWDogb3B0aW1pemUgbWVtb3J5IGxheW91dCAqLwordHlwZWRlZiBzdHJ1Y3QgVENHVGVtcCB7CisgICAgVENHVHlwZSBiYXNlX3R5cGU7CisgICAgVENHVHlwZSB0eXBlOworICAgIGludCB2YWxfdHlwZTsKKyAgICBpbnQgcmVnOworICAgIHRjZ190YXJnZXRfbG9uZyB2YWw7CisgICAgaW50IG1lbV9yZWc7CisgICAgaW50cHRyX3QgbWVtX29mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgZml4ZWRfcmVnOjE7CisgICAgdW5zaWduZWQgaW50IG1lbV9jb2hlcmVudDoxOworICAgIHVuc2lnbmVkIGludCBtZW1fYWxsb2NhdGVkOjE7CisgICAgdW5zaWduZWQgaW50IHRlbXBfbG9jYWw6MTsgLyogSWYgdHJ1ZSwgdGhlIHRlbXAgaXMgc2F2ZWQgYWNyb3NzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWMgYmxvY2tzLiBPdGhlcndpc2UsIGl0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlZCBhY3Jvc3MgYmFzaWMgYmxvY2tzLiAqLworICAgIHVuc2lnbmVkIGludCB0ZW1wX2FsbG9jYXRlZDoxOyAvKiBuZXZlciB1c2VkIGZvciBjb2RlIGdlbiAqLworICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IFRDR1RlbXA7CisKK3R5cGVkZWYgc3RydWN0IFRDR0NvbnRleHQgVENHQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVENHVGVtcFNldCB7CisgICAgdW5zaWduZWQgbG9uZyBsW0JJVFNfVE9fTE9OR1MoVENHX01BWF9URU1QUyldOworfSBUQ0dUZW1wU2V0OworCitzdHJ1Y3QgVENHQ29udGV4dCB7CisgICAgdWludDhfdCAqcG9vbF9jdXIsICpwb29sX2VuZDsKKyAgICBUQ0dQb29sICpwb29sX2ZpcnN0LCAqcG9vbF9jdXJyZW50LCAqcG9vbF9maXJzdF9sYXJnZTsKKyAgICBUQ0dMYWJlbCAqbGFiZWxzOworICAgIGludCBuYl9sYWJlbHM7CisgICAgaW50IG5iX2dsb2JhbHM7CisgICAgaW50IG5iX3RlbXBzOworCisgICAgLyogZ290b190YiBzdXBwb3J0ICovCisgICAgdWludDhfdCAqY29kZV9idWY7CisgICAgdWludHB0cl90ICp0Yl9uZXh0OworICAgIHVpbnQxNl90ICp0Yl9uZXh0X29mZnNldDsKKyAgICB1aW50MTZfdCAqdGJfam1wX29mZnNldDsgLyogIT0gTlVMTCBpZiBVU0VfRElSRUNUX0pVTVAgKi8KKworICAgIC8qIGxpdmVuZXNzIGFuYWx5c2lzICovCisgICAgdWludDE2X3QgKm9wX2RlYWRfYXJnczsgLyogZm9yIGVhY2ggb3BlcmF0aW9uLCBlYWNoIGJpdCB0ZWxscyBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGlzIGRlYWQgKi8KKyAgICB1aW50OF90ICpvcF9zeW5jX2FyZ3M7ICAvKiBmb3IgZWFjaCBvcGVyYXRpb24sIGVhY2ggYml0IHRlbGxzIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGFyZ3VtZW50IG5lZWRzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYyB0byBtZW1vcnkuICovCisgICAgCisgICAgLyogdGVsbHMgaW4gd2hpY2ggdGVtcG9yYXJ5IGEgZ2l2ZW4gcmVnaXN0ZXIgaXMuIEl0IGRvZXMgbm90IHRha2UKKyAgICAgICBpbnRvIGFjY291bnQgZml4ZWQgcmVnaXN0ZXJzICovCisgICAgaW50IHJlZ190b190ZW1wW1RDR19UQVJHRVRfTkJfUkVHU107CisgICAgVENHUmVnU2V0IHJlc2VydmVkX3JlZ3M7CisgICAgaW50cHRyX3QgY3VycmVudF9mcmFtZV9vZmZzZXQ7CisgICAgaW50cHRyX3QgZnJhbWVfc3RhcnQ7CisgICAgaW50cHRyX3QgZnJhbWVfZW5kOworICAgIGludCBmcmFtZV9yZWc7CisKKyAgICB1aW50OF90ICpjb2RlX3B0cjsKKyAgICBUQ0dUZW1wIHRlbXBzW1RDR19NQVhfVEVNUFNdOyAvKiBnbG9iYWxzIGZpcnN0LCB0ZW1wcyBhZnRlciAqLworICAgIFRDR1RlbXBTZXQgZnJlZV90ZW1wc1tUQ0dfVFlQRV9DT1VOVCAqIDJdOworCisgICAgR0hhc2hUYWJsZSAqaGVscGVyczsKKworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIC8qIHByb2ZpbGluZyBpbmZvICovCisgICAgaW50NjRfdCB0Yl9jb3VudDE7CisgICAgaW50NjRfdCB0Yl9jb3VudDsKKyAgICBpbnQ2NF90IG9wX2NvdW50OyAvKiB0b3RhbCBpbnNuIGNvdW50ICovCisgICAgaW50IG9wX2NvdW50X21heDsgLyogbWF4IGluc24gcGVyIFRCICovCisgICAgaW50NjRfdCB0ZW1wX2NvdW50OworICAgIGludCB0ZW1wX2NvdW50X21heDsKKyAgICBpbnQ2NF90IGRlbF9vcF9jb3VudDsKKyAgICBpbnQ2NF90IGNvZGVfaW5fbGVuOworICAgIGludDY0X3QgY29kZV9vdXRfbGVuOworICAgIGludDY0X3QgaW50ZXJtX3RpbWU7CisgICAgaW50NjRfdCBjb2RlX3RpbWU7CisgICAgaW50NjRfdCBsYV90aW1lOworICAgIGludDY0X3Qgb3B0X3RpbWU7CisgICAgaW50NjRfdCByZXN0b3JlX2NvdW50OworICAgIGludDY0X3QgcmVzdG9yZV90aW1lOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREVCVUdfVENHCisgICAgaW50IHRlbXBzX2luX3VzZTsKKyAgICBpbnQgZ290b190Yl9pc3N1ZV9tYXNrOworI2VuZGlmCisKKyAgICB1aW50MTZfdCBnZW5fb3BjX2J1ZltPUENfQlVGX1NJWkVdOworICAgIFRDR0FyZyBnZW5fb3BwYXJhbV9idWZbT1BQQVJBTV9CVUZfU0laRV07CisKKyAgICB1aW50MTZfdCAqZ2VuX29wY19wdHI7CisgICAgVENHQXJnICpnZW5fb3BwYXJhbV9wdHI7CisgICAgdGFyZ2V0X3Vsb25nIGdlbl9vcGNfcGNbT1BDX0JVRl9TSVpFXTsKKyAgICB1aW50MTZfdCBnZW5fb3BjX2ljb3VudFtPUENfQlVGX1NJWkVdOworICAgIHVpbnQ4X3QgZ2VuX29wY19pbnN0cl9zdGFydFtPUENfQlVGX1NJWkVdOworCisgICAgLyogQ29kZSBnZW5lcmF0aW9uICovCisgICAgaW50IGNvZGVfZ2VuX21heF9ibG9ja3M7CisgICAgdWludDhfdCAqY29kZV9nZW5fcHJvbG9ndWU7CisgICAgdWludDhfdCAqY29kZV9nZW5fYnVmZmVyOworICAgIHNpemVfdCBjb2RlX2dlbl9idWZmZXJfc2l6ZTsKKyAgICAvKiB0aHJlc2hvbGQgdG8gZmx1c2ggdGhlIHRyYW5zbGF0ZWQgY29kZSBidWZmZXIgKi8KKyAgICBzaXplX3QgY29kZV9nZW5fYnVmZmVyX21heF9zaXplOworICAgIHVpbnQ4X3QgKmNvZGVfZ2VuX3B0cjsKKworICAgIFRCQ29udGV4dCB0Yl9jdHg7CisKKyAgICAvKiBUaGUgVENHQmFja2VuZERhdGEgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gdGNnLXRhcmdldC5jLiAgKi8KKyAgICBzdHJ1Y3QgVENHQmFja2VuZERhdGEgKmJlOworfTsKKworZXh0ZXJuIFRDR0NvbnRleHQgdGNnX2N0eDsKKworLyogcG9vbCBiYXNlZCBtZW1vcnkgYWxsb2NhdGlvbiAqLworCit2b2lkICp0Y2dfbWFsbG9jX2ludGVybmFsKFRDR0NvbnRleHQgKnMsIGludCBzaXplKTsKK3ZvaWQgdGNnX3Bvb2xfcmVzZXQoVENHQ29udGV4dCAqcyk7Cit2b2lkIHRjZ19wb29sX2RlbGV0ZShUQ0dDb250ZXh0ICpzKTsKKworc3RhdGljIGlubGluZSB2b2lkICp0Y2dfbWFsbG9jKGludCBzaXplKQoreworICAgIFRDR0NvbnRleHQgKnMgPSAmdGNnX2N0eDsKKyAgICB1aW50OF90ICpwdHIsICpwdHJfZW5kOworICAgIHNpemUgPSAoc2l6ZSArIHNpemVvZihsb25nKSAtIDEpICYgfihzaXplb2YobG9uZykgLSAxKTsKKyAgICBwdHIgPSBzLT5wb29sX2N1cjsKKyAgICBwdHJfZW5kID0gcHRyICsgc2l6ZTsKKyAgICBpZiAodW5saWtlbHkocHRyX2VuZCA+IHMtPnBvb2xfZW5kKSkgeworICAgICAgICByZXR1cm4gdGNnX21hbGxvY19pbnRlcm5hbCgmdGNnX2N0eCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+cG9vbF9jdXIgPSBwdHJfZW5kOworICAgICAgICByZXR1cm4gcHRyOworICAgIH0KK30KKwordm9pZCB0Y2dfY29udGV4dF9pbml0KFRDR0NvbnRleHQgKnMpOwordm9pZCB0Y2dfcHJvbG9ndWVfaW5pdChUQ0dDb250ZXh0ICpzKTsKK3ZvaWQgdGNnX2Z1bmNfc3RhcnQoVENHQ29udGV4dCAqcyk7CisKK2ludCB0Y2dfZ2VuX2NvZGUoVENHQ29udGV4dCAqcywgdWludDhfdCAqZ2VuX2NvZGVfYnVmKTsKK2ludCB0Y2dfZ2VuX2NvZGVfc2VhcmNoX3BjKFRDR0NvbnRleHQgKnMsIHVpbnQ4X3QgKmdlbl9jb2RlX2J1ZiwgbG9uZyBvZmZzZXQpOworCit2b2lkIHRjZ19zZXRfZnJhbWUoVENHQ29udGV4dCAqcywgaW50IHJlZywgaW50cHRyX3Qgc3RhcnQsIGludHB0cl90IHNpemUpOworCitUQ0d2X2kzMiB0Y2dfZ2xvYmFsX3JlZ19uZXdfaTMyKGludCByZWcsIGNvbnN0IGNoYXIgKm5hbWUpOworVENHdl9pMzIgdGNnX2dsb2JhbF9tZW1fbmV3X2kzMihpbnQgcmVnLCBpbnRwdHJfdCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpOworVENHdl9pMzIgdGNnX3RlbXBfbmV3X2ludGVybmFsX2kzMihpbnQgdGVtcF9sb2NhbCk7CitzdGF0aWMgaW5saW5lIFRDR3ZfaTMyIHRjZ190ZW1wX25ld19pMzIodm9pZCkKK3sKKyAgICByZXR1cm4gdGNnX3RlbXBfbmV3X2ludGVybmFsX2kzMigwKTsKK30KK3N0YXRpYyBpbmxpbmUgVENHdl9pMzIgdGNnX3RlbXBfbG9jYWxfbmV3X2kzMih2b2lkKQoreworICAgIHJldHVybiB0Y2dfdGVtcF9uZXdfaW50ZXJuYWxfaTMyKDEpOworfQordm9pZCB0Y2dfdGVtcF9mcmVlX2kzMihUQ0d2X2kzMiBhcmcpOworY2hhciAqdGNnX2dldF9hcmdfc3RyX2kzMihUQ0dDb250ZXh0ICpzLCBjaGFyICpidWYsIGludCBidWZfc2l6ZSwgVENHdl9pMzIgYXJnKTsKKworVENHdl9pNjQgdGNnX2dsb2JhbF9yZWdfbmV3X2k2NChpbnQgcmVnLCBjb25zdCBjaGFyICpuYW1lKTsKK1RDR3ZfaTY0IHRjZ19nbG9iYWxfbWVtX25ld19pNjQoaW50IHJlZywgaW50cHRyX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKTsKK1RDR3ZfaTY0IHRjZ190ZW1wX25ld19pbnRlcm5hbF9pNjQoaW50IHRlbXBfbG9jYWwpOworc3RhdGljIGlubGluZSBUQ0d2X2k2NCB0Y2dfdGVtcF9uZXdfaTY0KHZvaWQpCit7CisgICAgcmV0dXJuIHRjZ190ZW1wX25ld19pbnRlcm5hbF9pNjQoMCk7Cit9CitzdGF0aWMgaW5saW5lIFRDR3ZfaTY0IHRjZ190ZW1wX2xvY2FsX25ld19pNjQodm9pZCkKK3sKKyAgICByZXR1cm4gdGNnX3RlbXBfbmV3X2ludGVybmFsX2k2NCgxKTsKK30KK3ZvaWQgdGNnX3RlbXBfZnJlZV9pNjQoVENHdl9pNjQgYXJnKTsKK2NoYXIgKnRjZ19nZXRfYXJnX3N0cl9pNjQoVENHQ29udGV4dCAqcywgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIFRDR3ZfaTY0IGFyZyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19UQ0cpCisvKiBJZiB5b3UgY2FsbCB0Y2dfY2xlYXJfdGVtcF9jb3VudCgpIGF0IHRoZSBzdGFydCBvZiBhIHNlY3Rpb24gb2YKKyAqIGNvZGUgd2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGxlYWsgYW55IFRDRyB0ZW1wb3JhcmllcywgdGhlbgorICogY2FsbGluZyB0Y2dfY2hlY2tfdGVtcF9jb3VudCgpIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2lsbAorICogcmV0dXJuIDEgaWYgdGhlIHNlY3Rpb24gZGlkIGluIGZhY3QgbGVhayBhIHRlbXBvcmFyeS4KKyAqLwordm9pZCB0Y2dfY2xlYXJfdGVtcF9jb3VudCh2b2lkKTsKK2ludCB0Y2dfY2hlY2tfdGVtcF9jb3VudCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIHRjZ19jbGVhcl90ZW1wX2NvdW50KCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0Y2dfY2hlY2tfdGVtcF9jb3VudCgpIDAKKyNlbmRpZgorCit2b2lkIHRjZ19kdW1wX2luZm8oRklMRSAqZiwgZnByaW50Zl9mdW5jdGlvbiBjcHVfZnByaW50Zik7CisKKyNkZWZpbmUgVENHX0NUX0FMSUFTICAweDgwCisjZGVmaW5lIFRDR19DVF9JQUxJQVMgMHg0MAorI2RlZmluZSBUQ0dfQ1RfUkVHICAgIDB4MDEKKyNkZWZpbmUgVENHX0NUX0NPTlNUICAweDAyIC8qIGFueSBjb25zdGFudCBvZiByZWdpc3RlciBzaXplICovCisKK3R5cGVkZWYgc3RydWN0IFRDR0FyZ0NvbnN0cmFpbnQgeworICAgIHVpbnQxNl90IGN0OworICAgIHVpbnQ4X3QgYWxpYXNfaW5kZXg7CisgICAgdW5pb24geworICAgICAgICBUQ0dSZWdTZXQgcmVnczsKKyAgICB9IHU7Cit9IFRDR0FyZ0NvbnN0cmFpbnQ7CisKKyNkZWZpbmUgVENHX01BWF9PUF9BUkdTIDE2CisKKy8qIEJpdHMgZm9yIFRDR09wRGVmLT5mbGFncywgOCBiaXRzIGF2YWlsYWJsZS4gICovCitlbnVtIHsKKyAgICAvKiBJbnN0cnVjdGlvbiBkZWZpbmVzIHRoZSBlbmQgb2YgYSBiYXNpYyBibG9jay4gICovCisgICAgVENHX09QRl9CQl9FTkQgICAgICAgPSAweDAxLAorICAgIC8qIEluc3RydWN0aW9uIGNsb2JiZXJzIGNhbGwgcmVnaXN0ZXJzIGFuZCBwb3RlbnRpYWxseSB1cGRhdGUgZ2xvYmFscy4gICovCisgICAgVENHX09QRl9DQUxMX0NMT0JCRVIgPSAweDAyLAorICAgIC8qIEluc3RydWN0aW9uIGhhcyBzaWRlIGVmZmVjdHM6IGl0IGNhbm5vdCBiZSByZW1vdmVkIGlmIGl0cyBvdXRwdXRzCisgICAgICAgYXJlIG5vdCB1c2VkLCBhbmQgbWlnaHQgdHJpZ2dlciBleGNlcHRpb25zLiAgKi8KKyAgICBUQ0dfT1BGX1NJREVfRUZGRUNUUyA9IDB4MDQsCisgICAgLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZHMgYXJlIDY0LWJpdHMgKG90aGVyd2lzZSAzMi1iaXRzKS4gICovCisgICAgVENHX09QRl82NEJJVCAgICAgICAgPSAweDA4LAorICAgIC8qIEluc3RydWN0aW9uIGlzIG9wdGlvbmFsIGFuZCBub3QgaW1wbGVtZW50ZWQgYnkgdGhlIGhvc3QsIG9yIGluc24KKyAgICAgICBpcyBnZW5lcmljIGFuZCBzaG91bGQgbm90IGJlIGltcGxlbWVuZWQgYnkgdGhlIGhvc3QuICAqLworICAgIFRDR19PUEZfTk9UX1BSRVNFTlQgID0gMHgxMCwKK307CisKK3R5cGVkZWYgc3RydWN0IFRDR09wRGVmIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQ4X3QgbmJfb2FyZ3MsIG5iX2lhcmdzLCBuYl9jYXJncywgbmJfYXJnczsKKyAgICB1aW50OF90IGZsYWdzOworICAgIFRDR0FyZ0NvbnN0cmFpbnQgKmFyZ3NfY3Q7CisgICAgaW50ICpzb3J0ZWRfYXJnczsKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19UQ0cpCisgICAgaW50IHVzZWQ7CisjZW5kaWYKK30gVENHT3BEZWY7CisKK2V4dGVybiBUQ0dPcERlZiB0Y2dfb3BfZGVmc1tdOworZXh0ZXJuIGNvbnN0IHNpemVfdCB0Y2dfb3BfZGVmc19tYXg7CisKK3R5cGVkZWYgc3RydWN0IFRDR1RhcmdldE9wRGVmIHsKKyAgICBUQ0dPcGNvZGUgb3A7CisgICAgY29uc3QgY2hhciAqYXJnc19jdF9zdHJbVENHX01BWF9PUF9BUkdTXTsKK30gVENHVGFyZ2V0T3BEZWY7CisKKyNkZWZpbmUgdGNnX2Fib3J0KCkgXAorZG8ge1wKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiB0Y2cgZmF0YWwgZXJyb3JcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7XAorICAgIGFib3J0KCk7XAorfSB3aGlsZSAoMCkKKworI2lmZGVmIENPTkZJR19ERUJVR19UQ0cKKyMgZGVmaW5lIHRjZ19kZWJ1Z19hc3NlcnQoWCkgZG8geyBhc3NlcnQoWCk7IH0gd2hpbGUgKDApCisjZWxpZiBRRU1VX0dOVUNfUFJFUkVRKDQsIDUpCisjIGRlZmluZSB0Y2dfZGVidWdfYXNzZXJ0KFgpIFwKKyAgICBkbyB7IGlmICghKFgpKSB7IF9fYnVpbHRpbl91bnJlYWNoYWJsZSgpOyB9IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgdGNnX2RlYnVnX2Fzc2VydChYKSBkbyB7ICh2b2lkKShYKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCit2b2lkIHRjZ19hZGRfdGFyZ2V0X2FkZF9vcF9kZWZzKGNvbnN0IFRDR1RhcmdldE9wRGVmICp0ZGVmcyk7CisKKyNpZiBVSU5UUFRSX01BWCA9PSBVSU5UMzJfTUFYCisjZGVmaW5lIFRDR1ZfTkFUX1RPX1BUUihuKSBNQUtFX1RDR1ZfUFRSKEdFVF9UQ0dWX0kzMihuKSkKKyNkZWZpbmUgVENHVl9QVFJfVE9fTkFUKG4pIE1BS0VfVENHVl9JMzIoR0VUX1RDR1ZfUFRSKG4pKQorCisjZGVmaW5lIHRjZ19jb25zdF9wdHIoVikgVENHVl9OQVRfVE9fUFRSKHRjZ19jb25zdF9pMzIoKGludHB0cl90KShWKSkpCisjZGVmaW5lIHRjZ19nbG9iYWxfcmVnX25ld19wdHIoUiwgTikgXAorICAgIFRDR1ZfTkFUX1RPX1BUUih0Y2dfZ2xvYmFsX3JlZ19uZXdfaTMyKChSKSwgKE4pKSkKKyNkZWZpbmUgdGNnX2dsb2JhbF9tZW1fbmV3X3B0cihSLCBPLCBOKSBcCisgICAgVENHVl9OQVRfVE9fUFRSKHRjZ19nbG9iYWxfbWVtX25ld19pMzIoKFIpLCAoTyksIChOKSkpCisjZGVmaW5lIHRjZ190ZW1wX25ld19wdHIoKSBUQ0dWX05BVF9UT19QVFIodGNnX3RlbXBfbmV3X2kzMigpKQorI2RlZmluZSB0Y2dfdGVtcF9mcmVlX3B0cihUKSB0Y2dfdGVtcF9mcmVlX2kzMihUQ0dWX1BUUl9UT19OQVQoVCkpCisjZWxzZQorI2RlZmluZSBUQ0dWX05BVF9UT19QVFIobikgTUFLRV9UQ0dWX1BUUihHRVRfVENHVl9JNjQobikpCisjZGVmaW5lIFRDR1ZfUFRSX1RPX05BVChuKSBNQUtFX1RDR1ZfSTY0KEdFVF9UQ0dWX1BUUihuKSkKKworI2RlZmluZSB0Y2dfY29uc3RfcHRyKFYpIFRDR1ZfTkFUX1RPX1BUUih0Y2dfY29uc3RfaTY0KChpbnRwdHJfdCkoVikpKQorI2RlZmluZSB0Y2dfZ2xvYmFsX3JlZ19uZXdfcHRyKFIsIE4pIFwKKyAgICBUQ0dWX05BVF9UT19QVFIodGNnX2dsb2JhbF9yZWdfbmV3X2k2NCgoUiksIChOKSkpCisjZGVmaW5lIHRjZ19nbG9iYWxfbWVtX25ld19wdHIoUiwgTywgTikgXAorICAgIFRDR1ZfTkFUX1RPX1BUUih0Y2dfZ2xvYmFsX21lbV9uZXdfaTY0KChSKSwgKE8pLCAoTikpKQorI2RlZmluZSB0Y2dfdGVtcF9uZXdfcHRyKCkgVENHVl9OQVRfVE9fUFRSKHRjZ190ZW1wX25ld19pNjQoKSkKKyNkZWZpbmUgdGNnX3RlbXBfZnJlZV9wdHIoVCkgdGNnX3RlbXBfZnJlZV9pNjQoVENHVl9QVFJfVE9fTkFUKFQpKQorI2VuZGlmCisKK3ZvaWQgdGNnX2dlbl9jYWxsTihUQ0dDb250ZXh0ICpzLCBUQ0d2X3B0ciBmdW5jLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgaW50IHNpemVtYXNrLCBUQ0dBcmcgcmV0LCBpbnQgbmFyZ3MsIFRDR0FyZyAqYXJncyk7CisKK3ZvaWQgdGNnX2dlbl9zaGlmdGlfaTY0KFRDR3ZfaTY0IHJldCwgVENHdl9pNjQgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjLCBpbnQgcmlnaHQsIGludCBhcml0aCk7CisKK1RDR0FyZyAqdGNnX29wdGltaXplKFRDR0NvbnRleHQgKnMsIHVpbnQxNl90ICp0Y2dfb3BjX3B0ciwgVENHQXJnICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgVENHT3BEZWYgKnRjZ19vcF9kZWYpOworCisvKiBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLwordm9pZCB0Y2dfZHVtcF9vcHMoVENHQ29udGV4dCAqcyk7CisKK3ZvaWQgZHVtcF9vcHMoY29uc3QgdWludDE2X3QgKm9wY19idWYsIGNvbnN0IFRDR0FyZyAqb3BwYXJhbV9idWYpOworVENHdl9pMzIgdGNnX2NvbnN0X2kzMihpbnQzMl90IHZhbCk7CitUQ0d2X2k2NCB0Y2dfY29uc3RfaTY0KGludDY0X3QgdmFsKTsKK1RDR3ZfaTMyIHRjZ19jb25zdF9sb2NhbF9pMzIoaW50MzJfdCB2YWwpOworVENHdl9pNjQgdGNnX2NvbnN0X2xvY2FsX2k2NChpbnQ2NF90IHZhbCk7CisKKy8qKgorICogdGNnX3FlbXVfdGJfZXhlYzoKKyAqIEBlbnY6IENQVUFyY2hTdGF0ZSAqIGZvciB0aGUgQ1BVCisgKiBAdGJfcHRyOiBhZGRyZXNzIG9mIGdlbmVyYXRlZCBjb2RlIGZvciB0aGUgVEIgdG8gZXhlY3V0ZQorICoKKyAqIFN0YXJ0IGV4ZWN1dGluZyBjb2RlIGZyb20gYSBnaXZlbiB0cmFuc2xhdGlvbiBibG9jay4KKyAqIFdoZXJlIHRyYW5zbGF0aW9uIGJsb2NrcyBoYXZlIGJlZW4gbGlua2VkLCBleGVjdXRpb24KKyAqIG1heSBwcm9jZWVkIGZyb20gdGhlIGdpdmVuIFRCIGludG8gc3VjY2Vzc2l2ZSBvbmVzLgorICogQ29udHJvbCBldmVudHVhbGx5IHJldHVybnMgb25seSB3aGVuIHNvbWUgYWN0aW9uIGlzIG5lZWRlZAorICogZnJvbSB0aGUgdG9wLWxldmVsIGxvb3A6IGVpdGhlciBjb250cm9sIG11c3QgcGFzcyB0byBhIFRCCisgKiB3aGljaCBoYXMgbm90IHlldCBiZWVuIGRpcmVjdGx5IGxpbmtlZCwgb3IgYW4gYXN5bmNocm9ub3VzCisgKiBldmVudCBzdWNoIGFzIGFuIGludGVycnVwdCBuZWVkcyBoYW5kbGluZy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBUQiB0byBleGVjdXRlCisgKiAoaWYga25vd247IG90aGVyd2lzZSB6ZXJvKS4gVGhpcyBwb2ludGVyIGlzIGFzc3VtZWQgdG8gYmUKKyAqIDQtYWxpZ25lZCwgYW5kIHRoZSBib3R0b20gdHdvIGJpdHMgYXJlIHVzZWQgdG8gcmV0dXJuIGZ1cnRoZXIKKyAqIGluZm9ybWF0aW9uOgorICogIDAsIDE6IHRoZSBsaW5rIGJldHdlZW4gdGhpcyBUQiBhbmQgdGhlIG5leHQgaXMgdmlhIHRoZSBzcGVjaWZpZWQKKyAqICAgICAgICBUQiBpbmRleCAoMCBvciAxKS4gVGhhdCBpcywgd2UgbGVmdCB0aGUgVEIgdmlhICh0aGUgZXF1aXZhbGVudAorICogICAgICAgIG9mKSAiZ290b190YiA8aW5kZXg+Ii4gVGhlIG1haW4gbG9vcCB1c2VzIHRoaXMgdG8gZGV0ZXJtaW5lCisgKiAgICAgICAgaG93IHRvIGxpbmsgdGhlIFRCIGp1c3QgZXhlY3V0ZWQgdG8gdGhlIG5leHQuCisgKiAgMjogICAgd2UgYXJlIHVzaW5nIGluc3RydWN0aW9uIGNvdW50aW5nIGNvZGUgZ2VuZXJhdGlvbiwgYW5kIHdlCisgKiAgICAgICAgZGlkIG5vdCBzdGFydCBleGVjdXRpbmcgdGhpcyBUQiBiZWNhdXNlIHRoZSBpbnN0cnVjdGlvbiBjb3VudGVyCisgKiAgICAgICAgd291bGQgaGl0IHplcm8gbWlkd2F5IHRocm91Z2ggaXQuIEluIHRoaXMgY2FzZSB0aGUgbmV4dC1UQiBwb2ludGVyCisgKiAgICAgICAgcmV0dXJuZWQgaXMgdGhlIFRCIHdlIHdlcmUgYWJvdXQgdG8gZXhlY3V0ZSwgYW5kIHRoZSBjYWxsZXIgbXVzdAorICogICAgICAgIGFycmFuZ2UgdG8gZXhlY3V0ZSB0aGUgcmVtYWluaW5nIGNvdW50IG9mIGluc3RydWN0aW9ucy4KKyAqICAzOiAgICB3ZSBzdG9wcGVkIGJlY2F1c2UgdGhlIENQVSdzIGV4aXRfcmVxdWVzdCBmbGFnIHdhcyBzZXQKKyAqICAgICAgICAodXN1YWxseSBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgYW4gaW50ZXJydXB0IHRoYXQgbmVlZHMgdG8gYmUKKyAqICAgICAgICBoYW5kbGVkKS4gVGhlIG5leHQtVEIgcG9pbnRlciByZXR1cm5lZCBpcyB0aGUgVEIgd2Ugd2VyZQorICogICAgICAgIGFib3V0IHRvIGV4ZWN1dGUgd2hlbiB3ZSBub3RpY2VkIHRoZSBwZW5kaW5nIGV4aXQgcmVxdWVzdC4KKyAqCisgKiBJZiB0aGUgYm90dG9tIHR3byBiaXRzIGluZGljYXRlIGFuIGV4aXQtdmlhLWluZGV4IHRoZW4gdGhlIENQVQorICogc3RhdGUgaXMgY29ycmVjdGx5IHN5bmNocm9uaXNlZCBhbmQgcmVhZHkgZm9yIGV4ZWN1dGlvbiBvZiB0aGUgbmV4dAorICogVEIgKGFuZCBpbiBwYXJ0aWN1bGFyIHRoZSBndWVzdCBQQyBpcyB0aGUgYWRkcmVzcyB0byBleGVjdXRlIG5leHQpLgorICogT3RoZXJ3aXNlLCB3ZSBnYXZlIHVwIG9uIGV4ZWN1dGlvbiBvZiB0aGlzIFRCIGJlZm9yZSBpdCBzdGFydGVkLCBhbmQKKyAqIHRoZSBjYWxsZXIgbXVzdCBmaXggdXAgdGhlIENQVSBzdGF0ZSBieSBjYWxsaW5nIGNwdV9wY19mcm9tX3RiKCkKKyAqIHdpdGggdGhlIG5leHQtVEIgcG9pbnRlciB3ZSByZXR1cm4uCisgKgorICogTm90ZSB0aGF0IFRDRyB0YXJnZXRzIG1heSB1c2UgYSBkaWZmZXJlbnQgZGVmaW5pdGlvbiBvZiB0Y2dfcWVtdV90Yl9leGVjCisgKiB0byB0aGlzIGRlZmF1bHQgKHdoaWNoIGp1c3QgY2FsbHMgdGhlIHByb2xvZ3VlLmNvZGUgZW1pdHRlZCBieQorICogdGNnX3RhcmdldF9xZW11X3Byb2xvZ3VlKCkpLgorICovCisjZGVmaW5lIFRCX0VYSVRfTUFTSyAzCisjZGVmaW5lIFRCX0VYSVRfSURYMCAwCisjZGVmaW5lIFRCX0VYSVRfSURYMSAxCisjZGVmaW5lIFRCX0VYSVRfSUNPVU5UX0VYUElSRUQgMgorI2RlZmluZSBUQl9FWElUX1JFUVVFU1RFRCAzCisKKyNpZiAhZGVmaW5lZCh0Y2dfcWVtdV90Yl9leGVjKQorIyBkZWZpbmUgdGNnX3FlbXVfdGJfZXhlYyhlbnYsIHRiX3B0cikgXAorICAgICgodWludHB0cl90ICgqKSh2b2lkICosIHZvaWQgKikpdGNnX2N0eC5jb2RlX2dlbl9wcm9sb2d1ZSkoZW52LCB0Yl9wdHIpCisjZW5kaWYKKwordm9pZCB0Y2dfcmVnaXN0ZXJfaml0KHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKKworLyoKKyAqIE1lbW9yeSBoZWxwZXJzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IFRDRyBnZW5lcmF0ZWQgY29kZS4KKyAqLworI2lmZGVmIENPTkZJR19TT0ZUTU1VCisvKiBWYWx1ZSB6ZXJvLWV4dGVuZGVkIHRvIHRjZyByZWdpc3RlciBzaXplLiAgKi8KK3RjZ190YXJnZXRfdWxvbmcgaGVscGVyX3JldF9sZHViX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKK3RjZ190YXJnZXRfdWxvbmcgaGVscGVyX2xlX2xkdXdfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit0Y2dfdGFyZ2V0X3Vsb25nIGhlbHBlcl9sZV9sZHVsX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOwordWludDY0X3QgaGVscGVyX2xlX2xkcV9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKK3RjZ190YXJnZXRfdWxvbmcgaGVscGVyX2JlX2xkdXdfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit0Y2dfdGFyZ2V0X3Vsb25nIGhlbHBlcl9iZV9sZHVsX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOwordWludDY0X3QgaGVscGVyX2JlX2xkcV9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKKworLyogVmFsdWUgc2lnbi1leHRlbmRlZCB0byB0Y2cgcmVnaXN0ZXIgc2l6ZS4gICovCit0Y2dfdGFyZ2V0X3Vsb25nIGhlbHBlcl9yZXRfbGRzYl9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit0Y2dfdGFyZ2V0X3Vsb25nIGhlbHBlcl9sZV9sZHN3X21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOwordGNnX3RhcmdldF91bG9uZyBoZWxwZXJfbGVfbGRzbF9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKK3RjZ190YXJnZXRfdWxvbmcgaGVscGVyX2JlX2xkc3dfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit0Y2dfdGFyZ2V0X3Vsb25nIGhlbHBlcl9iZV9sZHNsX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOworCit2b2lkIGhlbHBlcl9yZXRfc3RiX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIHVpbnQ4X3QgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKK3ZvaWQgaGVscGVyX2xlX3N0d19tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCB1aW50MTZfdCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit2b2lkIGhlbHBlcl9sZV9zdGxfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgdWludDMyX3QgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOwordm9pZCBoZWxwZXJfbGVfc3RxX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIHVpbnQ2NF90IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKK3ZvaWQgaGVscGVyX2JlX3N0d19tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCB1aW50MTZfdCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBtbXVfaWR4LCB1aW50cHRyX3QgcmV0YWRkcik7Cit2b2lkIGhlbHBlcl9iZV9zdGxfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgdWludDMyX3QgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW11X2lkeCwgdWludHB0cl90IHJldGFkZHIpOwordm9pZCBoZWxwZXJfYmVfc3RxX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIHVpbnQ2NF90IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsIHVpbnRwdHJfdCByZXRhZGRyKTsKKworLyogVGVtcG9yYXJ5IGFsaWFzZXMgdW50aWwgYmFja2VuZHMgYXJlIGNvbnZlcnRlZC4gICovCisjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgorIyBkZWZpbmUgaGVscGVyX3JldF9sZHN3X21tdSAgaGVscGVyX2JlX2xkc3dfbW11CisjIGRlZmluZSBoZWxwZXJfcmV0X2xkdXdfbW11ICBoZWxwZXJfYmVfbGR1d19tbXUKKyMgZGVmaW5lIGhlbHBlcl9yZXRfbGRzbF9tbXUgIGhlbHBlcl9iZV9sZHNsX21tdQorIyBkZWZpbmUgaGVscGVyX3JldF9sZHVsX21tdSAgaGVscGVyX2JlX2xkdWxfbW11CisjIGRlZmluZSBoZWxwZXJfcmV0X2xkcV9tbXUgICBoZWxwZXJfYmVfbGRxX21tdQorIyBkZWZpbmUgaGVscGVyX3JldF9zdHdfbW11ICAgaGVscGVyX2JlX3N0d19tbXUKKyMgZGVmaW5lIGhlbHBlcl9yZXRfc3RsX21tdSAgIGhlbHBlcl9iZV9zdGxfbW11CisjIGRlZmluZSBoZWxwZXJfcmV0X3N0cV9tbXUgICBoZWxwZXJfYmVfc3RxX21tdQorI2Vsc2UKKyMgZGVmaW5lIGhlbHBlcl9yZXRfbGRzd19tbXUgIGhlbHBlcl9sZV9sZHN3X21tdQorIyBkZWZpbmUgaGVscGVyX3JldF9sZHV3X21tdSAgaGVscGVyX2xlX2xkdXdfbW11CisjIGRlZmluZSBoZWxwZXJfcmV0X2xkc2xfbW11ICBoZWxwZXJfbGVfbGRzbF9tbXUKKyMgZGVmaW5lIGhlbHBlcl9yZXRfbGR1bF9tbXUgIGhlbHBlcl9sZV9sZHVsX21tdQorIyBkZWZpbmUgaGVscGVyX3JldF9sZHFfbW11ICAgaGVscGVyX2xlX2xkcV9tbXUKKyMgZGVmaW5lIGhlbHBlcl9yZXRfc3R3X21tdSAgIGhlbHBlcl9sZV9zdHdfbW11CisjIGRlZmluZSBoZWxwZXJfcmV0X3N0bF9tbXUgICBoZWxwZXJfbGVfc3RsX21tdQorIyBkZWZpbmUgaGVscGVyX3JldF9zdHFfbW11ICAgaGVscGVyX2xlX3N0cV9tbXUKKyNlbmRpZgorCit1aW50OF90IGhlbHBlcl9sZGJfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgaW50IG1tdV9pZHgpOwordWludDE2X3QgaGVscGVyX2xkd19tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLCBpbnQgbW11X2lkeCk7Cit1aW50MzJfdCBoZWxwZXJfbGRsX21tdShDUFVBcmNoU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIGFkZHIsIGludCBtbXVfaWR4KTsKK3VpbnQ2NF90IGhlbHBlcl9sZHFfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwgaW50IG1tdV9pZHgpOworCit2b2lkIGhlbHBlcl9zdGJfbW11KENQVUFyY2hTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWwsIGludCBtbXVfaWR4KTsKK3ZvaWQgaGVscGVyX3N0d19tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YWwsIGludCBtbXVfaWR4KTsKK3ZvaWQgaGVscGVyX3N0bF9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWwsIGludCBtbXVfaWR4KTsKK3ZvaWQgaGVscGVyX3N0cV9tbXUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWwsIGludCBtbXVfaWR4KTsKKyNlbmRpZiAvKiBDT05GSUdfU09GVE1NVSAqLworCisjZW5kaWYgLyogVENHX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdHJhbnNsYXRlLWFsbC5jIGIvYW5kcm9pZC9xZW11MS90cmFuc2xhdGUtYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc3YjAwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdHJhbnNsYXRlLWFsbC5jCkBAIC0wLDAgKzEsMTg2NCBAQAorLyoKKyAqICBIb3N0IGNvZGUgZ2VuZXJhdGlvbgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjZGVmaW5lIE5PX0NQVV9JT19ERUZTCisjaW5jbHVkZSAiY3B1LmgiCisjaW5jbHVkZSAiZXhlYy9leGVjLWFsbC5oIgorI2luY2x1ZGUgImRpc2FzL2Rpc2FzLmgiCisjaW5jbHVkZSAidGNnLmgiCisjaW5jbHVkZSAiZXhlYy9jcHV0bGIuaCIKKyNpbmNsdWRlICJ0cmFuc2xhdGUtYWxsLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorCisvLyNkZWZpbmUgREVCVUdfVEJfSU5WQUxJREFURQorLy8jZGVmaW5lIERFQlVHX0ZMVVNICisvKiBtYWtlIHZhcmlvdXMgVEIgY29uc2lzdGVuY3kgY2hlY2tzICovCisvLyNkZWZpbmUgREVCVUdfVEJfQ0hFQ0sKKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisvKiBUQiBjb25zaXN0ZW5jeSBjaGVja3Mgb25seSBpbXBsZW1lbnRlZCBmb3IgdXNlcm1vZGUgZW11bGF0aW9uLiAgKi8KKyN1bmRlZiBERUJVR19UQl9DSEVDSworI2VuZGlmCisKKyNkZWZpbmUgU01DX0JJVE1BUF9VU0VfVEhSRVNIT0xEIDEwCisKK3R5cGVkZWYgc3RydWN0IFBhZ2VEZXNjIHsKKyAgICAvKiBsaXN0IG9mIFRCcyBpbnRlcnNlY3RpbmcgdGhpcyByYW0gcGFnZSAqLworICAgIFRyYW5zbGF0aW9uQmxvY2sgKmZpcnN0X3RiOworICAgIC8qIGluIG9yZGVyIHRvIG9wdGltaXplIHNlbGYgbW9kaWZ5aW5nIGNvZGUsIHdlIGNvdW50IHRoZSBudW1iZXIKKyAgICAgICBvZiBsb29rdXBzIHdlIGRvIHRvIGEgZ2l2ZW4gcGFnZSB0byB1c2UgYSBiaXRtYXAgKi8KKyAgICB1bnNpZ25lZCBpbnQgY29kZV93cml0ZV9jb3VudDsKKyAgICB1aW50OF90ICpjb2RlX2JpdG1hcDsKKyNpZiBkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyNlbmRpZgorfSBQYWdlRGVzYzsKKworLyogSW4gc3lzdGVtIG1vZGUgd2Ugd2FudCBMMV9NQVAgdG8gYmUgYmFzZWQgb24gcmFtIG9mZnNldHMsCisgICB3aGlsZSBpbiB1c2VyIG1vZGUgd2Ugd2FudCBpdCB0byBiZSBiYXNlZCBvbiB2aXJ0dWFsIGFkZHJlc3Nlcy4gICovCisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyNpZiBIT1NUX0xPTkdfQklUUyA8IFRBUkdFVF9QSFlTX0FERFJfU1BBQ0VfQklUUworIyBkZWZpbmUgTDFfTUFQX0FERFJfU1BBQ0VfQklUUyAgSE9TVF9MT05HX0JJVFMKKyNlbHNlCisjIGRlZmluZSBMMV9NQVBfQUREUl9TUEFDRV9CSVRTICBUQVJHRVRfUEhZU19BRERSX1NQQUNFX0JJVFMKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIEwxX01BUF9BRERSX1NQQUNFX0JJVFMgIFRBUkdFVF9WSVJUX0FERFJfU1BBQ0VfQklUUworI2VuZGlmCisKKy8qIFRoZSBiaXRzIHJlbWFpbmluZyBhZnRlciBOIGxvd2VyIGxldmVscyBvZiBwYWdlIHRhYmxlcy4gICovCisjZGVmaW5lIFZfTDFfQklUU19SRU0gXAorICAgICgoTDFfTUFQX0FERFJfU1BBQ0VfQklUUyAtIFRBUkdFVF9QQUdFX0JJVFMpICUgTDJfQklUUykKKworI2lmIFZfTDFfQklUU19SRU0gPCA0CisjZGVmaW5lIFZfTDFfQklUUyAgKFZfTDFfQklUU19SRU0gKyBMMl9CSVRTKQorI2Vsc2UKKyNkZWZpbmUgVl9MMV9CSVRTICBWX0wxX0JJVFNfUkVNCisjZW5kaWYKKworI2RlZmluZSBWX0wxX1NJWkUgICgodGFyZ2V0X3Vsb25nKTEgPDwgVl9MMV9CSVRTKQorCisjZGVmaW5lIFZfTDFfU0hJRlQgKEwxX01BUF9BRERSX1NQQUNFX0JJVFMgLSBUQVJHRVRfUEFHRV9CSVRTIC0gVl9MMV9CSVRTKQorCit1aW50cHRyX3QgcWVtdV9yZWFsX2hvc3RfcGFnZV9zaXplOwordWludHB0cl90IHFlbXVfaG9zdF9wYWdlX3NpemU7Cit1aW50cHRyX3QgcWVtdV9ob3N0X3BhZ2VfbWFzazsKKworLyogVGhpcyBpcyBhIG11bHRpLWxldmVsIG1hcCBvbiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorICAgVGhlIGJvdHRvbSBsZXZlbCBoYXMgcG9pbnRlcnMgdG8gUGFnZURlc2MuICAqLworc3RhdGljIHZvaWQgKmwxX21hcFtWX0wxX1NJWkVdOworc3RhdGljIHZvaWQqIGwxX3BoeXNfbWFwW1ZfTDFfU0laRV07CisKKy8qIGNvZGUgZ2VuZXJhdGlvbiBjb250ZXh0ICovCitUQ0dDb250ZXh0IHRjZ19jdHg7CisKKy8qIFhYWDogc3VwcHJlc3MgdGhhdCAqLwordW5zaWduZWQgbG9uZyBjb2RlX2dlbl9tYXhfYmxvY2tfc2l6ZSh2b2lkKQoreworICAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1heDsKKworICAgIGlmIChtYXggPT0gMCkgeworICAgICAgICBtYXggPSBUQ0dfTUFYX09QX1NJWkU7CisjZGVmaW5lIERFRihuYW1lLCBpYXJnLCBvYXJnLCBjYXJnLCBmbGFncykgREVGMigoaWFyZykgKyAob2FyZykgKyAoY2FyZykpCisjZGVmaW5lIERFRjIoY29weV9zaXplKSBtYXggPSAoY29weV9zaXplID4gbWF4KSA/IGNvcHlfc2l6ZSA6IG1heDsKKyNpbmNsdWRlICJ0Y2ctb3BjLmgiCisjdW5kZWYgREVGCisjdW5kZWYgREVGMgorICAgICAgICBtYXggKj0gT1BDX01BWF9TSVpFOworICAgIH0KKworICAgIHJldHVybiBtYXg7Cit9CisKK3N0YXRpYyB2b2lkIHRiX2xpbmtfcGFnZShUcmFuc2xhdGlvbkJsb2NrICp0YiwgdGJfcGFnZV9hZGRyX3QgcGh5c19wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Yl9wYWdlX2FkZHJfdCBwaHlzX3BhZ2UyKTsKKwordm9pZCBjcHVfZ2VuX2luaXQodm9pZCkKK3sKKyAgICB0Y2dfY29udGV4dF9pbml0KCZ0Y2dfY3R4KTsKK30KKworLyogcmV0dXJuIG5vbiB6ZXJvIGlmIHRoZSB2ZXJ5IGZpcnN0IGluc3RydWN0aW9uIGlzIGludmFsaWQgc28gdGhhdAorICAgdGhlIHZpcnR1YWwgQ1BVIGNhbiB0cmlnZ2VyIGFuIGV4Y2VwdGlvbi4KKworICAgJypnZW5fY29kZV9zaXplX3B0cicgY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIChob3N0CisgICBjb2RlKS4KKyovCitpbnQgY3B1X2dlbl9jb2RlKENQVUFyY2hTdGF0ZSAqZW52LCBUcmFuc2xhdGlvbkJsb2NrICp0YiwgaW50ICpnZW5fY29kZV9zaXplX3B0cikKK3sKKyAgICBUQ0dDb250ZXh0ICpzID0gJnRjZ19jdHg7CisgICAgdWludDhfdCAqZ2VuX2NvZGVfYnVmOworICAgIGludCBnZW5fY29kZV9zaXplOworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIGludDY0X3QgdGk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIHMtPnRiX2NvdW50MSsrOyAvKiBpbmNsdWRlcyBhYm9ydGVkIHRyYW5zbGF0aW9ucyBiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgKi8KKyAgICB0aSA9IHByb2ZpbGVfZ2V0Y2xvY2soKTsKKyNlbmRpZgorICAgIHRjZ19mdW5jX3N0YXJ0KHMpOworCisgICAgZ2VuX2ludGVybWVkaWF0ZV9jb2RlKGVudiwgdGIpOworCisgICAgLyogZ2VuZXJhdGUgbWFjaGluZSBjb2RlICovCisgICAgZ2VuX2NvZGVfYnVmID0gdGItPnRjX3B0cjsKKyAgICB0Yi0+dGJfbmV4dF9vZmZzZXRbMF0gPSAweGZmZmY7CisgICAgdGItPnRiX25leHRfb2Zmc2V0WzFdID0gMHhmZmZmOworICAgIHMtPnRiX25leHRfb2Zmc2V0ID0gdGItPnRiX25leHRfb2Zmc2V0OworI2lmZGVmIFVTRV9ESVJFQ1RfSlVNUAorICAgIHMtPnRiX2ptcF9vZmZzZXQgPSB0Yi0+dGJfam1wX29mZnNldDsKKyAgICBzLT50Yl9uZXh0ID0gTlVMTDsKKyAgICAvKiB0aGUgZm9sbG93aW5nIHR3byBlbnRyaWVzIGFyZSBvcHRpb25hbCAob25seSB1c2VkIGZvciBzdHJpbmcgb3BzKSAqLworICAgIC8qIFhYWDogbm90IHVzZWQgPyAqLworICAgIHRiLT50Yl9qbXBfb2Zmc2V0WzJdID0gMHhmZmZmOworICAgIHRiLT50Yl9qbXBfb2Zmc2V0WzNdID0gMHhmZmZmOworI2Vsc2UKKyAgICBzLT50Yl9qbXBfb2Zmc2V0ID0gTlVMTDsKKyAgICBzLT50Yl9uZXh0ID0gdGItPnRiX25leHQ7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIHMtPnRiX2NvdW50Kys7CisgICAgcy0+aW50ZXJtX3RpbWUgKz0gcHJvZmlsZV9nZXRjbG9jaygpIC0gdGk7CisgICAgcy0+Y29kZV90aW1lIC09IHByb2ZpbGVfZ2V0Y2xvY2soKTsKKyNlbmRpZgorICAgIGdlbl9jb2RlX3NpemUgPSB0Y2dfZ2VuX2NvZGUocywgZ2VuX2NvZGVfYnVmKTsKKyAgICAqZ2VuX2NvZGVfc2l6ZV9wdHIgPSBnZW5fY29kZV9zaXplOworI2lmZGVmIENPTkZJR19QUk9GSUxFUgorICAgIHMtPmNvZGVfdGltZSArPSBwcm9maWxlX2dldGNsb2NrKCk7CisgICAgcy0+Y29kZV9pbl9sZW4gKz0gdGItPnNpemU7CisgICAgcy0+Y29kZV9vdXRfbGVuICs9IGdlbl9jb2RlX3NpemU7CisjZW5kaWYKKworI2lmZGVmIERFQlVHX0RJU0FTCisgICAgaWYgKHFlbXVfbG9nbGV2ZWxfbWFzayhDUFVfTE9HX1RCX09VVF9BU00pKSB7CisgICAgICAgIHFlbXVfbG9nKCJPVVQ6IFtzaXplPSVkXVxuIiwgKmdlbl9jb2RlX3NpemVfcHRyKTsKKyAgICAgICAgbG9nX2Rpc2FzKHRiLT50Y19wdHIsICpnZW5fY29kZV9zaXplX3B0cik7CisgICAgICAgIHFlbXVfbG9nKCJcbiIpOworICAgICAgICBxZW11X2xvZ19mbHVzaCgpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKiBUaGUgY3B1IHN0YXRlIGNvcnJlc3BvbmRpbmcgdG8gJ3NlYXJjaGVkX3BjJyBpcyByZXN0b3JlZC4KKyAqLworc3RhdGljIGludCBjcHVfcmVzdG9yZV9zdGF0ZV9mcm9tX3RiKFRyYW5zbGF0aW9uQmxvY2sgKnRiLCBDUFVBcmNoU3RhdGUgKmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3Qgc2VhcmNoZWRfcGMpCit7CisgICAgVENHQ29udGV4dCAqcyA9ICZ0Y2dfY3R4OworICAgIGludCBqOworICAgIHVpbnRwdHJfdCB0Y19wdHI7CisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgaW50NjRfdCB0aTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgdGkgPSBwcm9maWxlX2dldGNsb2NrKCk7CisjZW5kaWYKKyAgICB0Y2dfZnVuY19zdGFydChzKTsKKworICAgIGdlbl9pbnRlcm1lZGlhdGVfY29kZV9wYyhlbnYsIHRiKTsKKworICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgIC8qIFJlc2V0IHRoZSBjeWNsZSBjb3VudGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2suICAqLworICAgICAgICBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3cgKz0gdGItPmljb3VudDsKKyAgICAgICAgLyogQ2xlYXIgdGhlIElPIGZsYWcuICAqLworICAgICAgICBlbnYtPmNhbl9kb19pbyA9IDA7CisgICAgfQorCisgICAgLyogZmluZCBvcGMgaW5kZXggY29ycmVzcG9uZGluZyB0byBzZWFyY2hfcGMgKi8KKyAgICB0Y19wdHIgPSAodWludHB0cl90KXRiLT50Y19wdHI7CisgICAgaWYgKHNlYXJjaGVkX3BjIDwgdGNfcHRyKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBzLT50Yl9uZXh0X29mZnNldCA9IHRiLT50Yl9uZXh0X29mZnNldDsKKyNpZmRlZiBVU0VfRElSRUNUX0pVTVAKKyAgICBzLT50Yl9qbXBfb2Zmc2V0ID0gdGItPnRiX2ptcF9vZmZzZXQ7CisgICAgcy0+dGJfbmV4dCA9IE5VTEw7CisjZWxzZQorICAgIHMtPnRiX2ptcF9vZmZzZXQgPSBOVUxMOworICAgIHMtPnRiX25leHQgPSB0Yi0+dGJfbmV4dDsKKyNlbmRpZgorICAgIGogPSB0Y2dfZ2VuX2NvZGVfc2VhcmNoX3BjKHMsICh1aW50OF90ICopdGNfcHRyLCBzZWFyY2hlZF9wYyAtIHRjX3B0cik7CisgICAgaWYgKGogPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogbm93IGZpbmQgc3RhcnQgb2YgaW5zdHJ1Y3Rpb24gYmVmb3JlICovCisgICAgd2hpbGUgKHMtPmdlbl9vcGNfaW5zdHJfc3RhcnRbal0gPT0gMCkgeworICAgICAgICBqLS07CisgICAgfQorICAgIGVudi0+aWNvdW50X2RlY3IudTE2LmxvdyAtPSBzLT5nZW5fb3BjX2ljb3VudFtqXTsKKworICAgIHJlc3RvcmVfc3RhdGVfdG9fb3BjKGVudiwgdGIsIGopOworCisjaWZkZWYgQ09ORklHX1BST0ZJTEVSCisgICAgcy0+cmVzdG9yZV90aW1lICs9IHByb2ZpbGVfZ2V0Y2xvY2soKSAtIHRpOworICAgIHMtPnJlc3RvcmVfY291bnQrKzsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitib29sIGNwdV9yZXN0b3JlX3N0YXRlKENQVUFyY2hTdGF0ZSAqZW52LCB1aW50cHRyX3QgcmV0YWRkcikKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKworICAgIHRiID0gdGJfZmluZF9wYyhyZXRhZGRyKTsKKyAgICBpZiAodGIpIHsKKyAgICAgICAgY3B1X3Jlc3RvcmVfc3RhdGVfZnJvbV90Yih0YiwgZW52LCByZXRhZGRyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIF9XSU4zMgorc3RhdGljIGlubGluZSB2b2lkIG1hcF9leGVjKHZvaWQgKmFkZHIsIGxvbmcgc2l6ZSkKK3sKKyAgICBEV09SRCBvbGRfcHJvdGVjdDsKKyAgICBWaXJ0dWFsUHJvdGVjdChhZGRyLCBzaXplLAorICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUsICZvbGRfcHJvdGVjdCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG1hcF9leGVjKHZvaWQgKmFkZHIsIGxvbmcgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIHBhZ2Vfc2l6ZTsKKworICAgIHBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgc3RhcnQgPSAodW5zaWduZWQgbG9uZylhZGRyOworICAgIHN0YXJ0ICY9IH4ocGFnZV9zaXplIC0gMSk7CisKKyAgICBlbmQgPSAodW5zaWduZWQgbG9uZylhZGRyICsgc2l6ZTsKKyAgICBlbmQgKz0gcGFnZV9zaXplIC0gMTsKKyAgICBlbmQgJj0gfihwYWdlX3NpemUgLSAxKTsKKworICAgIG1wcm90ZWN0KCh2b2lkICopc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHBhZ2VfaW5pdCh2b2lkKQoreworICAgIC8qIE5PVEU6IHdlIGNhbiBhbHdheXMgc3VwcG9zZSB0aGF0IHFlbXVfaG9zdF9wYWdlX3NpemUgPj0KKyAgICAgICBUQVJHRVRfUEFHRV9TSVpFICovCisjaWZkZWYgX1dJTjMyCisgICAgeworICAgICAgICBTWVNURU1fSU5GTyBzeXN0ZW1faW5mbzsKKworICAgICAgICBHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1faW5mbyk7CisgICAgICAgIHFlbXVfcmVhbF9ob3N0X3BhZ2Vfc2l6ZSA9IHN5c3RlbV9pbmZvLmR3UGFnZVNpemU7CisgICAgfQorI2Vsc2UKKyAgICBxZW11X3JlYWxfaG9zdF9wYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworI2VuZGlmCisgICAgaWYgKHFlbXVfaG9zdF9wYWdlX3NpemUgPT0gMCkgeworICAgICAgICBxZW11X2hvc3RfcGFnZV9zaXplID0gcWVtdV9yZWFsX2hvc3RfcGFnZV9zaXplOworICAgIH0KKyAgICBpZiAocWVtdV9ob3N0X3BhZ2Vfc2l6ZSA8IFRBUkdFVF9QQUdFX1NJWkUpIHsKKyAgICAgICAgcWVtdV9ob3N0X3BhZ2Vfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7CisgICAgfQorICAgIHFlbXVfaG9zdF9wYWdlX21hc2sgPSB+KHFlbXVfaG9zdF9wYWdlX3NpemUgLSAxKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JTRCkgJiYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIHsKKyNpZmRlZiBIQVZFX0tJTkZPX0dFVFZNTUFQCisgICAgICAgIHN0cnVjdCBraW5mb192bWVudHJ5ICpmcmVlcDsKKyAgICAgICAgaW50IGksIGNudDsKKworICAgICAgICBmcmVlcCA9IGtpbmZvX2dldHZtbWFwKGdldHBpZCgpLCAmY250KTsKKyAgICAgICAgaWYgKGZyZWVwKSB7CisgICAgICAgICAgICBtbWFwX2xvY2soKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRhZGRyLCBlbmRhZGRyOworCisgICAgICAgICAgICAgICAgc3RhcnRhZGRyID0gZnJlZXBbaV0ua3ZlX3N0YXJ0OworICAgICAgICAgICAgICAgIGVuZGFkZHIgPSBmcmVlcFtpXS5rdmVfZW5kOworICAgICAgICAgICAgICAgIGlmIChoMmdfdmFsaWQoc3RhcnRhZGRyKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydGFkZHIgPSBoMmcoc3RhcnRhZGRyKSAmIFRBUkdFVF9QQUdFX01BU0s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgyZ192YWxpZChlbmRhZGRyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kYWRkciA9IGgyZyhlbmRhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2V0X2ZsYWdzKHN0YXJ0YWRkciwgZW5kYWRkciwgUEFHRV9SRVNFUlZFRCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisjaWYgVEFSR0VUX0FCSV9CSVRTIDw9IEwxX01BUF9BRERSX1NQQUNFX0JJVFMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZGFkZHIgPSB+MHVsOworICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zZXRfZmxhZ3Moc3RhcnRhZGRyLCBlbmRhZGRyLCBQQUdFX1JFU0VSVkVEKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShmcmVlcCk7CisgICAgICAgICAgICBtbWFwX3VubG9jaygpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBGSUxFICpmOworCisgICAgICAgIGxhc3RfYnJrID0gKHVuc2lnbmVkIGxvbmcpc2JyaygwKTsKKworICAgICAgICBmID0gZm9wZW4oIi9jb21wYXQvbGludXgvcHJvYy9zZWxmL21hcHMiLCAiciIpOworICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgbW1hcF9sb2NrKCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0YWRkciwgZW5kYWRkcjsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKworICAgICAgICAgICAgICAgIG4gPSBmc2NhbmYoZiwgIiVseC0lbHggJSpbXlxuXVxuIiwgJnN0YXJ0YWRkciwgJmVuZGFkZHIpOworCisgICAgICAgICAgICAgICAgaWYgKG4gPT0gMiAmJiBoMmdfdmFsaWQoc3RhcnRhZGRyKSkgeworICAgICAgICAgICAgICAgICAgICBzdGFydGFkZHIgPSBoMmcoc3RhcnRhZGRyKSAmIFRBUkdFVF9QQUdFX01BU0s7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGgyZ192YWxpZChlbmRhZGRyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kYWRkciA9IGgyZyhlbmRhZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZGFkZHIgPSB+MHVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2V0X2ZsYWdzKHN0YXJ0YWRkciwgZW5kYWRkciwgUEFHRV9SRVNFUlZFRCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoIWZlb2YoZikpOworCisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICBtbWFwX3VubG9jaygpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIFBhZ2VEZXNjICpwYWdlX2ZpbmRfYWxsb2ModGJfcGFnZV9hZGRyX3QgaW5kZXgsIGludCBhbGxvYykKK3sKKyAgICBQYWdlRGVzYyAqcGQ7CisgICAgdm9pZCAqKmxwOworICAgIGludCBpOworCisjaWYgZGVmaW5lZChDT05GSUdfVVNFUl9PTkxZKQorICAgIC8qIFdlIGNhbid0IHVzZSBnX21hbGxvYyBiZWNhdXNlIGl0IG1heSByZWN1cnNlIGludG8gYSBsb2NrZWQgbXV0ZXguICovCisjIGRlZmluZSBBTExPQyhQLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQID0gbW1hcChOVUxMLCBTSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCAgICBcCisgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApOyAgIFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIEFMTE9DKFAsIFNJWkUpIFwKKyAgICBkbyB7IFAgPSBnX21hbGxvYzAoU0laRSk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworICAgIC8qIExldmVsIDEuICBBbHdheXMgYWxsb2NhdGVkLiAgKi8KKyAgICBscCA9IGwxX21hcCArICgoaW5kZXggPj4gVl9MMV9TSElGVCkgJiAoVl9MMV9TSVpFIC0gMSkpOworCisgICAgLyogTGV2ZWwgMi4uTi0xLiAgKi8KKyAgICBmb3IgKGkgPSBWX0wxX1NISUZUIC8gTDJfQklUUyAtIDE7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgdm9pZCAqKnAgPSAqbHA7CisKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFhbGxvYykgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxMT0MocCwgc2l6ZW9mKHZvaWQgKikgKiBMMl9TSVpFKTsKKyAgICAgICAgICAgICpscCA9IHA7CisgICAgICAgIH0KKworICAgICAgICBscCA9IHAgKyAoKGluZGV4ID4+IChpICogTDJfQklUUykpICYgKEwyX1NJWkUgLSAxKSk7CisgICAgfQorCisgICAgcGQgPSAqbHA7CisgICAgaWYgKHBkID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFhbGxvYykgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgQUxMT0MocGQsIHNpemVvZihQYWdlRGVzYykgKiBMMl9TSVpFKTsKKyAgICAgICAgKmxwID0gcGQ7CisgICAgfQorCisjdW5kZWYgQUxMT0MKKworICAgIHJldHVybiBwZCArIChpbmRleCAmIChMMl9TSVpFIC0gMSkpOworfQorCitzdGF0aWMgaW5saW5lIFBhZ2VEZXNjICpwYWdlX2ZpbmQodGJfcGFnZV9hZGRyX3QgaW5kZXgpCit7CisgICAgcmV0dXJuIHBhZ2VfZmluZF9hbGxvYyhpbmRleCwgMCk7Cit9CisKK1BoeXNQYWdlRGVzYyAqcGh5c19wYWdlX2ZpbmRfYWxsb2MoaHdhZGRyIGluZGV4LCBpbnQgYWxsb2MpCit7CisgICAgdm9pZCAqKmxwOworICAgIFBoeXNQYWdlRGVzYyAqcGQ7CisgICAgaW50IGk7CisKKyAgICAvKiBMZXZlbCAxLiBBbHdheXMgYWxsb2NhdGVkLiAqLworICAgIGxwID0gbDFfcGh5c19tYXAgKyAoKGluZGV4ID4+IFZfTDFfU0hJRlQpICYgKFZfTDFfU0laRSAtIDEpKTsKKworICAgIC8qIExldmVsIDIuLk4tMSAqLworICAgIGZvciAoaSA9IFZfTDFfU0hJRlQgLyBMMl9CSVRTIC0gMTsgaSA+IDA7IGktLSkgeworICAgICAgICB2b2lkICoqcCA9ICpscDsKKworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIWFsbG9jKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gZ19tYWxsb2MwKHNpemVvZih2b2lkICopICogTDJfU0laRSk7CisgICAgICAgICAgICAqbHAgPSBwOworICAgICAgICB9CisKKyAgICAgICAgbHAgPSBwICsgKChpbmRleCA+PiAoaSAqIEwyX0JJVFMpKSAmIChMMl9TSVpFIC0gMSkpOworICAgIH0KKworICAgIHBkID0gKmxwOworICAgIGlmIChwZCA9PSBOVUxMKSB7CisgICAgICAgIGlmICghYWxsb2MpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBkID0gZ19tYWxsb2Moc2l6ZW9mKFBoeXNQYWdlRGVzYykgKiBMMl9TSVpFKTsKKyAgICAgICAgKmxwID0gcGQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMMl9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIHBkW2ldLnBoeXNfb2Zmc2V0ID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgICAgICBwZFtpXS5yZWdpb25fb2Zmc2V0ID0gKGluZGV4ICsgaSkgPDwgVEFSR0VUX1BBR0VfQklUUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKChQaHlzUGFnZURlc2MgKilwZCkgKyAoaW5kZXggJiAoTDJfU0laRSAtIDEpKTsKK30KKworUGh5c1BhZ2VEZXNjICpwaHlzX3BhZ2VfZmluZChod2FkZHIgaW5kZXgpCit7CisgICAgcmV0dXJuIHBoeXNfcGFnZV9maW5kX2FsbG9jKGluZGV4LCAwKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCisjZGVmaW5lIG1tYXBfbG9jaygpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbW1hcF91bmxvY2soKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKy8qIEN1cnJlbnRseSBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWxsb2NhdGUgYmlnIGNodW5rcyBvZiBkYXRhIGluCisgICB1c2VyIG1vZGUuIEl0IHdpbGwgY2hhbmdlIHdoZW4gYSBkZWRpY2F0ZWQgbGliYyB3aWxsIGJlIHVzZWQuICAqLworLyogPz8/IDY0LWJpdCBob3N0cyBvdWdodCB0byBoYXZlIG5vIHByb2JsZW0gbW1hcGluZyBkYXRhIG91dHNpZGUgdGhlCisgICByZWdpb24gaW4gd2hpY2ggdGhlIGd1ZXN0IG5lZWRzIHRvIHJ1bi4gIFJldmlzaXQgdGhpcy4gICovCisjZGVmaW5lIFVTRV9TVEFUSUNfQ09ERV9HRU5fQlVGRkVSCisjZW5kaWYKKworLyogPz8/IFNob3VsZCBjb25maWd1cmUgZm9yIHRoaXMsIG5vdCBsaXN0IG9wZXJhdGluZyBzeXN0ZW1zIGhlcmUuICAqLworI2lmIChkZWZpbmVkKF9fbGludXhfXykgXAorICAgIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSBcCisgICAgfHwgZGVmaW5lZChfX0RyYWdvbkZseV9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSBcCisgICAgfHwgZGVmaW5lZChfX05ldEJTRF9fKSkKKyMgZGVmaW5lIFVTRV9NTUFQCisjZW5kaWYKKworLyogTWluaW11bSBzaXplIG9mIHRoZSBjb2RlIGdlbiBidWZmZXIuICBUaGlzIG51bWJlciBpcyByYW5kb21seSBjaG9zZW4sCisgICBidXQgbm90IHNvIHNtYWxsIHRoYXQgd2UgY2FuJ3QgaGF2ZSBhIGZhaXIgbnVtYmVyIG9mIFRCJ3MgbGl2ZS4gICovCisjZGVmaW5lIE1JTl9DT0RFX0dFTl9CVUZGRVJfU0laRSAgICAgKDEwMjR1ICogMTAyNCkKKworLyogTWF4aW11bSBzaXplIG9mIHRoZSBjb2RlIGdlbiBidWZmZXIgd2UnZCBsaWtlIHRvIHVzZS4gIFVubGVzcyBvdGhlcndpc2UKKyAgIGluZGljYXRlZCwgdGhpcyBpcyBjb25zdHJhaW5lZCBieSB0aGUgcmFuZ2Ugb2YgZGlyZWN0IGJyYW5jaGVzIG9uIHRoZQorICAgaG9zdCBjcHUsIGFzIHVzZWQgYnkgdGhlIFRDRyBpbXBsZW1lbnRhdGlvbiBvZiBnb3RvX3RiLiAgKi8KKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjIGRlZmluZSBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkUgICgydWwgKiAxMDI0ICogMTAyNCAqIDEwMjQpCisjZWxpZiBkZWZpbmVkKF9fc3BhcmNfXykKKyMgZGVmaW5lIE1BWF9DT0RFX0dFTl9CVUZGRVJfU0laRSAgKDJ1bCAqIDEwMjQgKiAxMDI0ICogMTAyNCkKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisjIGRlZmluZSBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkUgICgxMjh1bCAqIDEwMjQgKiAxMDI0KQorI2VsaWYgZGVmaW5lZChfX2FybV9fKQorIyBkZWZpbmUgTUFYX0NPREVfR0VOX0JVRkZFUl9TSVpFICAoMTZ1ICogMTAyNCAqIDEwMjQpCisjZWxpZiBkZWZpbmVkKF9fczM5MHhfXykKKyAgLyogV2UgaGF2ZSBhICstIDRHQiByYW5nZSBvbiB0aGUgYnJhbmNoZXM7IGxlYXZlIHNvbWUgc2xvcC4gICovCisjIGRlZmluZSBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkUgICgzdWwgKiAxMDI0ICogMTAyNCAqIDEwMjQpCisjZWxzZQorIyBkZWZpbmUgTUFYX0NPREVfR0VOX0JVRkZFUl9TSVpFICAoKHNpemVfdCktMSkKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfQ09ERV9HRU5fQlVGRkVSX1NJWkVfMSAoMzJ1ICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgREVGQVVMVF9DT0RFX0dFTl9CVUZGRVJfU0laRSBcCisgIChERUZBVUxUX0NPREVfR0VOX0JVRkZFUl9TSVpFXzEgPCBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkUgXAorICAgPyBERUZBVUxUX0NPREVfR0VOX0JVRkZFUl9TSVpFXzEgOiBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkUpCisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHNpemVfY29kZV9nZW5fYnVmZmVyKHNpemVfdCB0Yl9zaXplKQoreworICAgIC8qIFNpemUgdGhlIGJ1ZmZlci4gICovCisgICAgaWYgKHRiX3NpemUgPT0gMCkgeworI2lmZGVmIFVTRV9TVEFUSUNfQ09ERV9HRU5fQlVGRkVSCisgICAgICAgIHRiX3NpemUgPSBERUZBVUxUX0NPREVfR0VOX0JVRkZFUl9TSVpFOworI2Vsc2UKKyAgICAgICAgLyogPz8/IE5lZWRzIGFkanVzdG1lbnRzLiAgKi8KKyAgICAgICAgLyogPz8/IElmIHdlIHJlbGF4IHRoZSByZXF1aXJlbWVudCB0aGF0IENPTkZJR19VU0VSX09OTFkgdXNlIHRoZQorICAgICAgICAgICBzdGF0aWMgYnVmZmVyLCB3ZSBjb3VsZCBzaXplIHRoaXMgb24gUkVTRVJWRURfVkEsIG9uIHRoZSB0ZXh0CisgICAgICAgICAgIHNlZ21lbnQgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSwgb3IgY29udGludWUgdG8gdXNlIHRoZSBkZWZhdWx0LiAgKi8KKyAgICAgICAgdGJfc2l6ZSA9ICh1bnNpZ25lZCBsb25nKShyYW1fc2l6ZSAvIDQpOworI2VuZGlmCisgICAgfQorICAgIGlmICh0Yl9zaXplIDwgTUlOX0NPREVfR0VOX0JVRkZFUl9TSVpFKSB7CisgICAgICAgIHRiX3NpemUgPSBNSU5fQ09ERV9HRU5fQlVGRkVSX1NJWkU7CisgICAgfQorICAgIGlmICh0Yl9zaXplID4gTUFYX0NPREVfR0VOX0JVRkZFUl9TSVpFKSB7CisgICAgICAgIHRiX3NpemUgPSBNQVhfQ09ERV9HRU5fQlVGRkVSX1NJWkU7CisgICAgfQorICAgIHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUgPSB0Yl9zaXplOworICAgIHJldHVybiB0Yl9zaXplOworfQorCisjaWZkZWYgVVNFX1NUQVRJQ19DT0RFX0dFTl9CVUZGRVIKK3N0YXRpYyB1aW50OF90IHN0YXRpY19jb2RlX2dlbl9idWZmZXJbREVGQVVMVF9DT0RFX0dFTl9CVUZGRVJfU0laRV0KKyAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENPREVfR0VOX0FMSUdOKSkpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmFsbG9jX2NvZGVfZ2VuX2J1ZmZlcih2b2lkKQoreworICAgIG1hcF9leGVjKHN0YXRpY19jb2RlX2dlbl9idWZmZXIsIHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUpOworICAgIHJldHVybiBzdGF0aWNfY29kZV9nZW5fYnVmZmVyOworfQorI2VsaWYgZGVmaW5lZChVU0VfTU1BUCkKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYWxsb2NfY29kZV9nZW5fYnVmZmVyKHZvaWQpCit7CisgICAgaW50IGZsYWdzID0gTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTOworICAgIHVpbnRwdHJfdCBzdGFydCA9IDA7CisgICAgdm9pZCAqYnVmOworCisgICAgLyogQ29uc3RyYWluIHRoZSBwb3NpdGlvbiBvZiB0aGUgYnVmZmVyIGJhc2VkIG9uIHRoZSBob3N0IGNwdS4KKyAgICAgICBOb3RlIHRoYXQgdGhlc2UgYWRkcmVzc2VzIGFyZSBjaG9zZW4gaW4gY29uY2VydCB3aXRoIHRoZQorICAgICAgIGFkZHJlc3NlcyBhc3NpZ25lZCBpbiB0aGUgcmVsZXZhbnQgbGlua2VyIHNjcmlwdCBmaWxlLiAgKi8KKyMgaWYgZGVmaW5lZChfX1BJRV9fKSB8fCBkZWZpbmVkKF9fUElDX18pCisgICAgLyogRG9uJ3QgYm90aGVyIHNldHRpbmcgYSBwcmVmZXJyZWQgbG9jYXRpb24gaWYgd2UncmUgYnVpbGRpbmcKKyAgICAgICBhIHBvc2l0aW9uLWluZGVwZW5kZW50IGV4ZWN1dGFibGUuICBXZSdyZSBtb3JlIGxpa2VseSB0byBnZXQKKyAgICAgICBhbiBhZGRyZXNzIG5lYXIgdGhlIG1haW4gZXhlY3V0YWJsZSBpZiB3ZSBsZXQgdGhlIGtlcm5lbAorICAgICAgIGNob29zZSB0aGUgYWRkcmVzcy4gICovCisjIGVsaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiBkZWZpbmVkKE1BUF8zMkJJVCkKKyAgICAvKiBGb3JjZSB0aGUgbWVtb3J5IGRvd24gaW50byBsb3cgbWVtb3J5IHdpdGggdGhlIGV4ZWN1dGFibGUuCisgICAgICAgTGVhdmUgdGhlIGNob2ljZSBvZiBleGFjdCBsb2NhdGlvbiB3aXRoIHRoZSBrZXJuZWwuICAqLworICAgIGZsYWdzIHw9IE1BUF8zMkJJVDsKKyAgICAvKiBDYW5ub3QgZXhwZWN0IHRvIG1hcCBtb3JlIHRoYW4gODAwTUIgaW4gbG93IG1lbW9yeS4gICovCisgICAgaWYgKHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUgPiA4MDB1ICogMTAyNCAqIDEwMjQpIHsKKyAgICAgICAgdGNnX2N0eC5jb2RlX2dlbl9idWZmZXJfc2l6ZSA9IDgwMHUgKiAxMDI0ICogMTAyNDsKKyAgICB9CisjIGVsaWYgZGVmaW5lZChfX3NwYXJjX18pCisgICAgc3RhcnQgPSAweDQwMDAwMDAwdWw7CisjIGVsaWYgZGVmaW5lZChfX3MzOTB4X18pCisgICAgc3RhcnQgPSAweDkwMDAwMDAwdWw7CisjIGVuZGlmCisKKyAgICBidWYgPSBtbWFwKCh2b2lkICopc3RhcnQsIHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEIHwgUFJPVF9FWEVDLCBmbGFncywgLTEsIDApOworICAgIHJldHVybiBidWYgPT0gTUFQX0ZBSUxFRCA/IE5VTEwgOiBidWY7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkICphbGxvY19jb2RlX2dlbl9idWZmZXIodm9pZCkKK3sKKyAgICB2b2lkICpidWYgPSBnX21hbGxvYyh0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9zaXplKTsKKworICAgIGlmIChidWYpIHsKKyAgICAgICAgbWFwX2V4ZWMoYnVmLCB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9zaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZiAvKiBVU0VfU1RBVElDX0NPREVfR0VOX0JVRkZFUiwgVVNFX01NQVAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGNvZGVfZ2VuX2FsbG9jKHNpemVfdCB0Yl9zaXplKQoreworICAgIHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUgPSBzaXplX2NvZGVfZ2VuX2J1ZmZlcih0Yl9zaXplKTsKKyAgICB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciA9IGFsbG9jX2NvZGVfZ2VuX2J1ZmZlcigpOworICAgIGlmICh0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIGR5bmFtaWMgdHJhbnNsYXRvciBidWZmZXJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHFlbXVfbWFkdmlzZSh0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciwgdGNnX2N0eC5jb2RlX2dlbl9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgIFFFTVVfTUFEVl9IVUdFUEFHRSk7CisKKyAgICAvKiBTdGVhbCByb29tIGZvciB0aGUgcHJvbG9ndWUgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgVGhpcyBlbnN1cmVzCisgICAgICAgKHZpYSB0aGUgTUFYX0NPREVfR0VOX0JVRkZFUl9TSVpFIGxpbWl0cyBhYm92ZSkgdGhhdCBkaXJlY3QgYnJhbmNoZXMKKyAgICAgICBmcm9tIFRCJ3MgdG8gdGhlIHByb2xvZ3VlIGFyZSBnb2luZyB0byBiZSBpbiByYW5nZS4gIEl0IGFsc28gbWVhbnMKKyAgICAgICB0aGF0IHdlIGRvbid0IG5lZWQgdG8gbWFyayAoYWRkaXRpb25hbCkgcG9ydGlvbnMgb2YgdGhlIGRhdGEgc2VnbWVudAorICAgICAgIGFzIGV4ZWN1dGFibGUuICAqLworICAgIHRjZ19jdHguY29kZV9nZW5fcHJvbG9ndWUgPSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciArCisgICAgICAgICAgICB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9zaXplIC0gMTAyNDsKKyAgICB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9zaXplIC09IDEwMjQ7CisKKyAgICB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9tYXhfc2l6ZSA9IHRjZ19jdHguY29kZV9nZW5fYnVmZmVyX3NpemUgLQorICAgICAgICAoVENHX01BWF9PUF9TSVpFICogT1BDX0JVRl9TSVpFKTsKKyAgICB0Y2dfY3R4LmNvZGVfZ2VuX21heF9ibG9ja3MgPSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9zaXplIC8KKyAgICAgICAgICAgIENPREVfR0VOX0FWR19CTE9DS19TSVpFOworICAgIHRjZ19jdHgudGJfY3R4LnRicyA9CisgICAgICAgICAgICBnX21hbGxvYyh0Y2dfY3R4LmNvZGVfZ2VuX21heF9ibG9ja3MgKiBzaXplb2YoVHJhbnNsYXRpb25CbG9jaykpOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgdGhlIFFFTVUgY3B1cy4gJ3RiX3NpemUnIGlzIHRoZSBzaXplCisgICAoaW4gYnl0ZXMpIGFsbG9jYXRlZCB0byB0aGUgdHJhbnNsYXRpb24gYnVmZmVyLiBaZXJvIG1lYW5zIGRlZmF1bHQKKyAgIHNpemUuICovCit2b2lkIHRjZ19leGVjX2luaXQodW5zaWduZWQgbG9uZyB0Yl9zaXplKQoreworICAgIGNwdV9nZW5faW5pdCgpOworICAgIGNvZGVfZ2VuX2FsbG9jKHRiX3NpemUpOworICAgIHRjZ19jdHguY29kZV9nZW5fcHRyID0gdGNnX2N0eC5jb2RlX2dlbl9idWZmZXI7CisgICAgcGFnZV9pbml0KCk7CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgfHwgIWRlZmluZWQoQ09ORklHX1VTRV9HVUVTVF9CQVNFKQorICAgIC8qIFRoZXJlJ3Mgbm8gZ3Vlc3QgYmFzZSB0byB0YWtlIGludG8gYWNjb3VudCwgc28gZ28gYWhlYWQgYW5kCisgICAgICAgaW5pdGlhbGl6ZSB0aGUgcHJvbG9ndWUgbm93LiAgKi8KKyAgICB0Y2dfcHJvbG9ndWVfaW5pdCgmdGNnX2N0eCk7CisjZW5kaWYKK30KKworYm9vbCB0Y2dfZW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciAhPSBOVUxMOworfQorCisvKiBBbGxvY2F0ZSBhIG5ldyB0cmFuc2xhdGlvbiBibG9jay4gRmx1c2ggdGhlIHRyYW5zbGF0aW9uIGJ1ZmZlciBpZgorICAgdG9vIG1hbnkgdHJhbnNsYXRpb24gYmxvY2tzIG9yIHRvbyBtdWNoIGdlbmVyYXRlZCBjb2RlLiAqLworc3RhdGljIFRyYW5zbGF0aW9uQmxvY2sgKnRiX2FsbG9jKHRhcmdldF91bG9uZyBwYykKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKworICAgIGlmICh0Y2dfY3R4LnRiX2N0eC5uYl90YnMgPj0gdGNnX2N0eC5jb2RlX2dlbl9tYXhfYmxvY2tzIHx8CisgICAgICAgICh0Y2dfY3R4LmNvZGVfZ2VuX3B0ciAtIHRjZ19jdHguY29kZV9nZW5fYnVmZmVyKSA+PQorICAgICAgICAgdGNnX2N0eC5jb2RlX2dlbl9idWZmZXJfbWF4X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRiID0gJnRjZ19jdHgudGJfY3R4LnRic1t0Y2dfY3R4LnRiX2N0eC5uYl90YnMrK107CisgICAgdGItPnBjID0gcGM7CisgICAgdGItPmNmbGFncyA9IDA7CisgICAgcmV0dXJuIHRiOworfQorCit2b2lkIHRiX2ZyZWUoVHJhbnNsYXRpb25CbG9jayAqdGIpCit7CisgICAgLyogSW4gcHJhY3RpY2UgdGhpcyBpcyBtb3N0bHkgdXNlZCBmb3Igc2luZ2xlIHVzZSB0ZW1wb3JhcnkgVEIKKyAgICAgICBJZ25vcmUgdGhlIGhhcmQgY2FzZXMgYW5kIGp1c3QgYmFjayB1cCBpZiB0aGlzIFRCIGhhcHBlbnMgdG8KKyAgICAgICBiZSB0aGUgbGFzdCBvbmUgZ2VuZXJhdGVkLiAgKi8KKyAgICBpZiAodGNnX2N0eC50Yl9jdHgubmJfdGJzID4gMCAmJgorICAgICAgICAgICAgdGIgPT0gJnRjZ19jdHgudGJfY3R4LnRic1t0Y2dfY3R4LnRiX2N0eC5uYl90YnMgLSAxXSkgeworICAgICAgICB0Y2dfY3R4LmNvZGVfZ2VuX3B0ciA9IHRiLT50Y19wdHI7CisgICAgICAgIHRjZ19jdHgudGJfY3R4Lm5iX3Ricy0tOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGludmFsaWRhdGVfcGFnZV9iaXRtYXAoUGFnZURlc2MgKnApCit7CisgICAgaWYgKHAtPmNvZGVfYml0bWFwKSB7CisgICAgICAgIGdfZnJlZShwLT5jb2RlX2JpdG1hcCk7CisgICAgICAgIHAtPmNvZGVfYml0bWFwID0gTlVMTDsKKyAgICB9CisgICAgcC0+Y29kZV93cml0ZV9jb3VudCA9IDA7Cit9CisKKy8qIFNldCB0byBOVUxMIGFsbCB0aGUgJ2ZpcnN0X3RiJyBmaWVsZHMgaW4gYWxsIFBhZ2VEZXNjcy4gKi8KK3N0YXRpYyB2b2lkIHBhZ2VfZmx1c2hfdGJfMShpbnQgbGV2ZWwsIHZvaWQgKipscCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmICgqbHAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgIFBhZ2VEZXNjICpwZCA9ICpscDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTDJfU0laRTsgKytpKSB7CisgICAgICAgICAgICBwZFtpXS5maXJzdF90YiA9IE5VTEw7CisgICAgICAgICAgICBpbnZhbGlkYXRlX3BhZ2VfYml0bWFwKHBkICsgaSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB2b2lkICoqcHAgPSAqbHA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEwyX1NJWkU7ICsraSkgeworICAgICAgICAgICAgcGFnZV9mbHVzaF90Yl8xKGxldmVsIC0gMSwgcHAgKyBpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcGFnZV9mbHVzaF90Yih2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IFZfTDFfU0laRTsgaSsrKSB7CisgICAgICAgIHBhZ2VfZmx1c2hfdGJfMShWX0wxX1NISUZUIC8gTDJfQklUUyAtIDEsIGwxX21hcCArIGkpOworICAgIH0KK30KKworLyogZmx1c2ggYWxsIHRoZSB0cmFuc2xhdGlvbiBibG9ja3MgKi8KKy8qIFhYWDogdGJfZmx1c2ggaXMgY3VycmVudGx5IG5vdCB0aHJlYWQgc2FmZSAqLwordm9pZCB0Yl9mbHVzaChDUFVBcmNoU3RhdGUgKmVudjEpCit7CisgICAgQ1BVU3RhdGUgKmNwdTsKKyNpZiBkZWZpbmVkKERFQlVHX0ZMVVNIKQorICAgIHByaW50ZigicWVtdTogZmx1c2ggY29kZV9zaXplPSVsZCBuYl90YnM9JWQgYXZnX3RiX3NpemU9JWxkXG4iLAorICAgICAgICAgICAodW5zaWduZWQgbG9uZykodGNnX2N0eC5jb2RlX2dlbl9wdHIgLSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciksCisgICAgICAgICAgIHRjZ19jdHgudGJfY3R4Lm5iX3RicywgdGNnX2N0eC50Yl9jdHgubmJfdGJzID4gMCA/CisgICAgICAgICAgICgodW5zaWduZWQgbG9uZykodGNnX2N0eC5jb2RlX2dlbl9wdHIgLSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcikpIC8KKyAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgubmJfdGJzIDogMCk7CisjZW5kaWYKKyAgICBpZiAoKHVuc2lnbmVkIGxvbmcpKHRjZ19jdHguY29kZV9nZW5fcHRyIC0gdGNnX2N0eC5jb2RlX2dlbl9idWZmZXIpCisgICAgICAgID4gdGNnX2N0eC5jb2RlX2dlbl9idWZmZXJfc2l6ZSkgeworICAgICAgICBjcHVfYWJvcnQoZW52MSwgIkludGVybmFsIGVycm9yOiBjb2RlIGJ1ZmZlciBvdmVyZmxvd1xuIik7CisgICAgfQorICAgIHRjZ19jdHgudGJfY3R4Lm5iX3RicyA9IDA7CisKKyAgICBDUFVfRk9SRUFDSChjcHUpIHsKKyAgICAgICAgQ1BVQXJjaFN0YXRlICplbnYgPSBjcHUtPmVudl9wdHI7CisgICAgICAgIG1lbXNldCAoZW52LT50Yl9qbXBfY2FjaGUsIDAsIFRCX0pNUF9DQUNIRV9TSVpFICogc2l6ZW9mICh2b2lkICopKTsKKyAgICB9CisKKyAgICBtZW1zZXQodGNnX2N0eC50Yl9jdHgudGJfcGh5c19oYXNoLCAwLAorICAgICAgICAgICAgQ09ERV9HRU5fUEhZU19IQVNIX1NJWkUgKiBzaXplb2Yodm9pZCAqKSk7CisgICAgcGFnZV9mbHVzaF90YigpOworCisgICAgdGNnX2N0eC5jb2RlX2dlbl9wdHIgPSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcjsKKyAgICAvKiBYWFg6IGZsdXNoIHByb2Nlc3NvciBpY2FjaGUgYXQgdGhpcyBwb2ludCBpZiBjYWNoZSBmbHVzaCBpcworICAgICAgIGV4cGVuc2l2ZSAqLworICAgIHRjZ19jdHgudGJfY3R4LnRiX2ZsdXNoX2NvdW50Kys7Cit9CisKKyNpZmRlZiBERUJVR19UQl9DSEVDSworCitzdGF0aWMgdm9pZCB0Yl9pbnZhbGlkYXRlX2NoZWNrKHRhcmdldF91bG9uZyBhZGRyZXNzKQoreworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworICAgIGludCBpOworCisgICAgYWRkcmVzcyAmPSBUQVJHRVRfUEFHRV9NQVNLOworICAgIGZvciAoaSA9IDA7IGkgPCBDT0RFX0dFTl9QSFlTX0hBU0hfU0laRTsgaSsrKSB7CisgICAgICAgIGZvciAodGIgPSB0Yl9jdHgudGJfcGh5c19oYXNoW2ldOyB0YiAhPSBOVUxMOyB0YiA9IHRiLT5waHlzX2hhc2hfbmV4dCkgeworICAgICAgICAgICAgaWYgKCEoYWRkcmVzcyArIFRBUkdFVF9QQUdFX1NJWkUgPD0gdGItPnBjIHx8CisgICAgICAgICAgICAgICAgICBhZGRyZXNzID49IHRiLT5wYyArIHRiLT5zaXplKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW52YWxpZGF0ZTogYWRkcmVzcz0iIFRBUkdFVF9GTVRfbHgKKyAgICAgICAgICAgICAgICAgICAgICAgIiBQQz0lMDhseCBzaXplPSUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsIChsb25nKXRiLT5wYywgdGItPnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKiB2ZXJpZnkgdGhhdCBhbGwgdGhlIHBhZ2VzIGhhdmUgY29ycmVjdCByaWdodHMgZm9yIGNvZGUgKi8KK3N0YXRpYyB2b2lkIHRiX3BhZ2VfY2hlY2sodm9pZCkKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKyAgICBpbnQgaSwgZmxhZ3MxLCBmbGFnczI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09ERV9HRU5fUEhZU19IQVNIX1NJWkU7IGkrKykgeworICAgICAgICBmb3IgKHRiID0gdGNnX2N0eC50Yl9jdHgudGJfcGh5c19oYXNoW2ldOyB0YiAhPSBOVUxMOworICAgICAgICAgICAgICAgIHRiID0gdGItPnBoeXNfaGFzaF9uZXh0KSB7CisgICAgICAgICAgICBmbGFnczEgPSBwYWdlX2dldF9mbGFncyh0Yi0+cGMpOworICAgICAgICAgICAgZmxhZ3MyID0gcGFnZV9nZXRfZmxhZ3ModGItPnBjICsgdGItPnNpemUgLSAxKTsKKyAgICAgICAgICAgIGlmICgoZmxhZ3MxICYgUEFHRV9XUklURSkgfHwgKGZsYWdzMiAmIFBBR0VfV1JJVEUpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBwYWdlIGZsYWdzOiBQQz0lMDhseCBzaXplPSUwNHggZjE9JXggZjI9JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChsb25nKXRiLT5wYywgdGItPnNpemUsIGZsYWdzMSwgZmxhZ3MyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Yl9oYXNoX3JlbW92ZShUcmFuc2xhdGlvbkJsb2NrICoqcHRiLCBUcmFuc2xhdGlvbkJsb2NrICp0YikKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjE7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHRiMSA9ICpwdGI7CisgICAgICAgIGlmICh0YjEgPT0gdGIpIHsKKyAgICAgICAgICAgICpwdGIgPSB0YjEtPnBoeXNfaGFzaF9uZXh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHRiID0gJnRiMS0+cGh5c19oYXNoX25leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGJfcGFnZV9yZW1vdmUoVHJhbnNsYXRpb25CbG9jayAqKnB0YiwgVHJhbnNsYXRpb25CbG9jayAqdGIpCit7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGIxOworICAgIHVuc2lnbmVkIGludCBuMTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgdGIxID0gKnB0YjsKKyAgICAgICAgbjEgPSAodWludHB0cl90KXRiMSAmIDM7CisgICAgICAgIHRiMSA9IChUcmFuc2xhdGlvbkJsb2NrICopKCh1aW50cHRyX3QpdGIxICYgfjMpOworICAgICAgICBpZiAodGIxID09IHRiKSB7CisgICAgICAgICAgICAqcHRiID0gdGIxLT5wYWdlX25leHRbbjFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHRiID0gJnRiMS0+cGFnZV9uZXh0W24xXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0Yl9qbXBfcmVtb3ZlKFRyYW5zbGF0aW9uQmxvY2sgKnRiLCBpbnQgbikKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjEsICoqcHRiOworICAgIHVuc2lnbmVkIGludCBuMTsKKworICAgIHB0YiA9ICZ0Yi0+am1wX25leHRbbl07CisgICAgdGIxID0gKnB0YjsKKyAgICBpZiAodGIxKSB7CisgICAgICAgIC8qIGZpbmQgdGIobikgaW4gY2lyY3VsYXIgbGlzdCAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICB0YjEgPSAqcHRiOworICAgICAgICAgICAgbjEgPSAodWludHB0cl90KXRiMSAmIDM7CisgICAgICAgICAgICB0YjEgPSAoVHJhbnNsYXRpb25CbG9jayAqKSgodWludHB0cl90KXRiMSAmIH4zKTsKKyAgICAgICAgICAgIGlmIChuMSA9PSBuICYmIHRiMSA9PSB0YikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4xID09IDIpIHsKKyAgICAgICAgICAgICAgICBwdGIgPSAmdGIxLT5qbXBfZmlyc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB0YiA9ICZ0YjEtPmptcF9uZXh0W24xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBub3cgd2UgY2FuIHN1cHByZXNzIHRiKG4pIGZyb20gdGhlIGxpc3QgKi8KKyAgICAgICAgKnB0YiA9IHRiLT5qbXBfbmV4dFtuXTsKKworICAgICAgICB0Yi0+am1wX25leHRbbl0gPSBOVUxMOworICAgIH0KK30KKworLyogcmVzZXQgdGhlIGp1bXAgZW50cnkgJ24nIG9mIGEgVEIgc28gdGhhdCBpdCBpcyBub3QgY2hhaW5lZCB0bworICAgYW5vdGhlciBUQiAqLworc3RhdGljIGlubGluZSB2b2lkIHRiX3Jlc2V0X2p1bXAoVHJhbnNsYXRpb25CbG9jayAqdGIsIGludCBuKQoreworICAgIHRiX3NldF9qbXBfdGFyZ2V0KHRiLCBuLCAodWludHB0cl90KSh0Yi0+dGNfcHRyICsgdGItPnRiX25leHRfb2Zmc2V0W25dKSk7Cit9CisKKy8qIGludmFsaWRhdGUgb25lIFRCICovCit2b2lkIHRiX3BoeXNfaW52YWxpZGF0ZShUcmFuc2xhdGlvbkJsb2NrICp0YiwgdGJfcGFnZV9hZGRyX3QgcGFnZV9hZGRyKQoreworICAgIENQVVN0YXRlICpjcHU7CisgICAgUGFnZURlc2MgKnA7CisgICAgdW5zaWduZWQgaW50IGgsIG4xOworICAgIHRiX3BhZ2VfYWRkcl90IHBoeXNfcGM7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGIxLCAqdGIyOworCisgICAgLyogcmVtb3ZlIHRoZSBUQiBmcm9tIHRoZSBoYXNoIGxpc3QgKi8KKyAgICBwaHlzX3BjID0gdGItPnBhZ2VfYWRkclswXSArICh0Yi0+cGMgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgaCA9IHRiX3BoeXNfaGFzaF9mdW5jKHBoeXNfcGMpOworICAgIHRiX2hhc2hfcmVtb3ZlKCZ0Y2dfY3R4LnRiX2N0eC50Yl9waHlzX2hhc2hbaF0sIHRiKTsKKworICAgIC8qIHJlbW92ZSB0aGUgVEIgZnJvbSB0aGUgcGFnZSBsaXN0ICovCisgICAgaWYgKHRiLT5wYWdlX2FkZHJbMF0gIT0gcGFnZV9hZGRyKSB7CisgICAgICAgIHAgPSBwYWdlX2ZpbmQodGItPnBhZ2VfYWRkclswXSA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgdGJfcGFnZV9yZW1vdmUoJnAtPmZpcnN0X3RiLCB0Yik7CisgICAgICAgIGludmFsaWRhdGVfcGFnZV9iaXRtYXAocCk7CisgICAgfQorICAgIGlmICh0Yi0+cGFnZV9hZGRyWzFdICE9IC0xICYmIHRiLT5wYWdlX2FkZHJbMV0gIT0gcGFnZV9hZGRyKSB7CisgICAgICAgIHAgPSBwYWdlX2ZpbmQodGItPnBhZ2VfYWRkclsxXSA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgdGJfcGFnZV9yZW1vdmUoJnAtPmZpcnN0X3RiLCB0Yik7CisgICAgICAgIGludmFsaWRhdGVfcGFnZV9iaXRtYXAocCk7CisgICAgfQorCisgICAgdGNnX2N0eC50Yl9jdHgudGJfaW52YWxpZGF0ZWRfZmxhZyA9IDE7CisKKyAgICAvKiByZW1vdmUgdGhlIFRCIGZyb20gdGhlIGhhc2ggbGlzdCAqLworICAgIGggPSB0Yl9qbXBfY2FjaGVfaGFzaF9mdW5jKHRiLT5wYyk7CisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1LT5lbnZfcHRyOworICAgICAgICBpZiAoZW52LT50Yl9qbXBfY2FjaGVbaF0gPT0gdGIpIHsKKyAgICAgICAgICAgIGVudi0+dGJfam1wX2NhY2hlW2hdID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN1cHByZXNzIHRoaXMgVEIgZnJvbSB0aGUgdHdvIGp1bXAgbGlzdHMgKi8KKyAgICB0Yl9qbXBfcmVtb3ZlKHRiLCAwKTsKKyAgICB0Yl9qbXBfcmVtb3ZlKHRiLCAxKTsKKworICAgIC8qIHN1cHByZXNzIGFueSByZW1haW5pbmcganVtcHMgdG8gdGhpcyBUQiAqLworICAgIHRiMSA9IHRiLT5qbXBfZmlyc3Q7CisgICAgZm9yICg7OykgeworICAgICAgICBuMSA9ICh1aW50cHRyX3QpdGIxICYgMzsKKyAgICAgICAgaWYgKG4xID09IDIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRiMSA9IChUcmFuc2xhdGlvbkJsb2NrICopKCh1aW50cHRyX3QpdGIxICYgfjMpOworICAgICAgICB0YjIgPSB0YjEtPmptcF9uZXh0W24xXTsKKyAgICAgICAgdGJfcmVzZXRfanVtcCh0YjEsIG4xKTsKKyAgICAgICAgdGIxLT5qbXBfbmV4dFtuMV0gPSBOVUxMOworICAgICAgICB0YjEgPSB0YjI7CisgICAgfQorICAgIHRiLT5qbXBfZmlyc3QgPSAoVHJhbnNsYXRpb25CbG9jayAqKSgodWludHB0cl90KXRiIHwgMik7IC8qIGZhaWwgc2FmZSAqLworCisgICAgdGNnX2N0eC50Yl9jdHgudGJfcGh5c19pbnZhbGlkYXRlX2NvdW50Kys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYml0cyh1aW50OF90ICp0YWIsIGludCBzdGFydCwgaW50IGxlbikKK3sKKyAgICBpbnQgZW5kLCBtYXNrLCBlbmQxOworCisgICAgZW5kID0gc3RhcnQgKyBsZW47CisgICAgdGFiICs9IHN0YXJ0ID4+IDM7CisgICAgbWFzayA9IDB4ZmYgPDwgKHN0YXJ0ICYgNyk7CisgICAgaWYgKChzdGFydCAmIH43KSA9PSAoZW5kICYgfjcpKSB7CisgICAgICAgIGlmIChzdGFydCA8IGVuZCkgeworICAgICAgICAgICAgbWFzayAmPSB+KDB4ZmYgPDwgKGVuZCAmIDcpKTsKKyAgICAgICAgICAgICp0YWIgfD0gbWFzazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICp0YWIrKyB8PSBtYXNrOworICAgICAgICBzdGFydCA9IChzdGFydCArIDgpICYgfjc7CisgICAgICAgIGVuZDEgPSBlbmQgJiB+NzsKKyAgICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kMSkgeworICAgICAgICAgICAgKnRhYisrID0gMHhmZjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgICAgICBtYXNrID0gfigweGZmIDw8IChlbmQgJiA3KSk7CisgICAgICAgICAgICAqdGFiIHw9IG1hc2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX3BhZ2VfYml0bWFwKFBhZ2VEZXNjICpwKQoreworICAgIGludCBuLCB0Yl9zdGFydCwgdGJfZW5kOworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworCisgICAgcC0+Y29kZV9iaXRtYXAgPSBnX21hbGxvYzAoVEFSR0VUX1BBR0VfU0laRSAvIDgpOworCisgICAgdGIgPSBwLT5maXJzdF90YjsKKyAgICB3aGlsZSAodGIgIT0gTlVMTCkgeworICAgICAgICBuID0gKHVpbnRwdHJfdCl0YiAmIDM7CisgICAgICAgIHRiID0gKFRyYW5zbGF0aW9uQmxvY2sgKikoKHVpbnRwdHJfdCl0YiAmIH4zKTsKKyAgICAgICAgLyogTk9URTogdGhpcyBpcyBzdWJ0bGUgYXMgYSBUQiBtYXkgc3BhbiB0d28gcGh5c2ljYWwgcGFnZXMgKi8KKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgLyogTk9URTogdGJfZW5kIG1heSBiZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBwYWdlLCBidXQKKyAgICAgICAgICAgICAgIGl0IGlzIG5vdCBhIHByb2JsZW0gKi8KKyAgICAgICAgICAgIHRiX3N0YXJ0ID0gdGItPnBjICYgflRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgICAgICB0Yl9lbmQgPSB0Yl9zdGFydCArIHRiLT5zaXplOworICAgICAgICAgICAgaWYgKHRiX2VuZCA+IFRBUkdFVF9QQUdFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICB0Yl9lbmQgPSBUQVJHRVRfUEFHRV9TSVpFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGJfc3RhcnQgPSAwOworICAgICAgICAgICAgdGJfZW5kID0gKCh0Yi0+cGMgKyB0Yi0+c2l6ZSkgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2JpdHMocC0+Y29kZV9iaXRtYXAsIHRiX3N0YXJ0LCB0Yl9lbmQgLSB0Yl9zdGFydCk7CisgICAgICAgIHRiID0gdGItPnBhZ2VfbmV4dFtuXTsKKyAgICB9Cit9CisKK1RyYW5zbGF0aW9uQmxvY2sgKnRiX2dlbl9jb2RlKENQVUFyY2hTdGF0ZSAqZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Vsb25nIHBjLCB0YXJnZXRfdWxvbmcgY3NfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgaW50IGNmbGFncykKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKyAgICB1aW50OF90ICp0Y19wdHI7CisgICAgdGJfcGFnZV9hZGRyX3QgcGh5c19wYywgcGh5c19wYWdlMjsKKyAgICB0YXJnZXRfdWxvbmcgdmlydF9wYWdlMjsKKyAgICBpbnQgY29kZV9nZW5fc2l6ZTsKKworICAgIHBoeXNfcGMgPSBnZXRfcGFnZV9hZGRyX2NvZGUoZW52LCBwYyk7CisgICAgdGIgPSB0Yl9hbGxvYyhwYyk7CisgICAgaWYgKCF0YikgeworICAgICAgICAvKiBmbHVzaCBtdXN0IGJlIGRvbmUgKi8KKyAgICAgICAgdGJfZmx1c2goZW52KTsKKyAgICAgICAgLyogY2Fubm90IGZhaWwgYXQgdGhpcyBwb2ludCAqLworICAgICAgICB0YiA9IHRiX2FsbG9jKHBjKTsKKyAgICAgICAgLyogRG9uJ3QgZm9yZ2V0IHRvIGludmFsaWRhdGUgcHJldmlvdXMgVEIgaW5mby4gICovCisgICAgICAgIHRjZ19jdHgudGJfY3R4LnRiX2ludmFsaWRhdGVkX2ZsYWcgPSAxOworICAgIH0KKyAgICB0Y19wdHIgPSB0Y2dfY3R4LmNvZGVfZ2VuX3B0cjsKKyAgICB0Yi0+dGNfcHRyID0gdGNfcHRyOworICAgIHRiLT5jc19iYXNlID0gY3NfYmFzZTsKKyAgICB0Yi0+ZmxhZ3MgPSBmbGFnczsKKyAgICB0Yi0+Y2ZsYWdzID0gY2ZsYWdzOworICAgIGNwdV9nZW5fY29kZShlbnYsIHRiLCAmY29kZV9nZW5fc2l6ZSk7CisgICAgdGNnX2N0eC5jb2RlX2dlbl9wdHIgPSAodm9pZCAqKSgoKHVpbnRwdHJfdCl0Y2dfY3R4LmNvZGVfZ2VuX3B0ciArCisgICAgICAgICAgICBjb2RlX2dlbl9zaXplICsgQ09ERV9HRU5fQUxJR04gLSAxKSAmIH4oQ09ERV9HRU5fQUxJR04gLSAxKSk7CisKKyAgICAvKiBjaGVjayBuZXh0IHBhZ2UgaWYgbmVlZGVkICovCisgICAgdmlydF9wYWdlMiA9IChwYyArIHRiLT5zaXplIC0gMSkgJiBUQVJHRVRfUEFHRV9NQVNLOworICAgIHBoeXNfcGFnZTIgPSAtMTsKKyAgICBpZiAoKHBjICYgVEFSR0VUX1BBR0VfTUFTSykgIT0gdmlydF9wYWdlMikgeworICAgICAgICBwaHlzX3BhZ2UyID0gZ2V0X3BhZ2VfYWRkcl9jb2RlKGVudiwgdmlydF9wYWdlMik7CisgICAgfQorICAgIHRiX2xpbmtfcGFnZSh0YiwgcGh5c19wYywgcGh5c19wYWdlMik7CisgICAgcmV0dXJuIHRiOworfQorCisvKgorICogSW52YWxpZGF0ZSBhbGwgVEJzIHdoaWNoIGludGVyc2VjdCB3aXRoIHRoZSB0YXJnZXQgcGh5c2ljYWwgYWRkcmVzcyByYW5nZQorICogW3N0YXJ0O2VuZFsuIE5PVEU6IHN0YXJ0IGFuZCBlbmQgbWF5IHJlZmVyIHRvICpkaWZmZXJlbnQqIHBoeXNpY2FsIHBhZ2VzLgorICogJ2lzX2NwdV93cml0ZV9hY2Nlc3MnIHNob3VsZCBiZSB0cnVlIGlmIGNhbGxlZCBmcm9tIGEgcmVhbCBjcHUgd3JpdGUKKyAqIGFjY2VzczogdGhlIHZpcnR1YWwgQ1BVIHdpbGwgZXhpdCB0aGUgY3VycmVudCBUQiBpZiBjb2RlIGlzIG1vZGlmaWVkIGluc2lkZQorICogdGhpcyBUQi4KKyAqLwordm9pZCB0Yl9pbnZhbGlkYXRlX3BoeXNfcmFuZ2UodGJfcGFnZV9hZGRyX3Qgc3RhcnQsIHRiX3BhZ2VfYWRkcl90IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19jcHVfd3JpdGVfYWNjZXNzKQoreworICAgIHdoaWxlIChzdGFydCA8IGVuZCkgeworICAgICAgICB0Yl9pbnZhbGlkYXRlX3BoeXNfcGFnZV9yYW5nZShzdGFydCwgZW5kLCBpc19jcHVfd3JpdGVfYWNjZXNzKTsKKyAgICAgICAgc3RhcnQgJj0gVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgc3RhcnQgKz0gVEFSR0VUX1BBR0VfU0laRTsKKyAgICB9Cit9CisKKy8qCisgKiBJbnZhbGlkYXRlIGFsbCBUQnMgd2hpY2ggaW50ZXJzZWN0IHdpdGggdGhlIHRhcmdldCBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlCisgKiBbc3RhcnQ7ZW5kWy4gTk9URTogc3RhcnQgYW5kIGVuZCBtdXN0IHJlZmVyIHRvIHRoZSAqc2FtZSogcGh5c2ljYWwgcGFnZS4KKyAqICdpc19jcHVfd3JpdGVfYWNjZXNzJyBzaG91bGQgYmUgdHJ1ZSBpZiBjYWxsZWQgZnJvbSBhIHJlYWwgY3B1IHdyaXRlCisgKiBhY2Nlc3M6IHRoZSB2aXJ0dWFsIENQVSB3aWxsIGV4aXQgdGhlIGN1cnJlbnQgVEIgaWYgY29kZSBpcyBtb2RpZmllZCBpbnNpZGUKKyAqIHRoaXMgVEIuCisgKi8KK3ZvaWQgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfcmFuZ2UodGJfcGFnZV9hZGRyX3Qgc3RhcnQsIHRiX3BhZ2VfYWRkcl90IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2NwdV93cml0ZV9hY2Nlc3MpCit7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGIsICp0Yl9uZXh0LCAqc2F2ZWRfdGI7CisgICAgQ1BVU3RhdGUgKmNwdSA9IGN1cnJlbnRfY3B1OworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1ID8gY3B1LT5lbnZfcHRyIDogTlVMTDsKKyAgICB0Yl9wYWdlX2FkZHJfdCB0Yl9zdGFydCwgdGJfZW5kOworICAgIFBhZ2VEZXNjICpwOworICAgIGludCBuOworI2lmZGVmIFRBUkdFVF9IQVNfUFJFQ0lTRV9TTUMKKyAgICBpbnQgY3VycmVudF90Yl9ub3RfZm91bmQgPSBpc19jcHVfd3JpdGVfYWNjZXNzOworICAgIFRyYW5zbGF0aW9uQmxvY2sgKmN1cnJlbnRfdGIgPSBOVUxMOworICAgIGludCBjdXJyZW50X3RiX21vZGlmaWVkID0gMDsKKyAgICB0YXJnZXRfdWxvbmcgY3VycmVudF9wYyA9IDA7CisgICAgdGFyZ2V0X3Vsb25nIGN1cnJlbnRfY3NfYmFzZSA9IDA7CisgICAgaW50IGN1cnJlbnRfZmxhZ3MgPSAwOworI2VuZGlmIC8qIFRBUkdFVF9IQVNfUFJFQ0lTRV9TTUMgKi8KKworICAgIHAgPSBwYWdlX2ZpbmQoc3RhcnQgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFwLT5jb2RlX2JpdG1hcCAmJgorICAgICAgICArK3AtPmNvZGVfd3JpdGVfY291bnQgPj0gU01DX0JJVE1BUF9VU0VfVEhSRVNIT0xEICYmCisgICAgICAgIGlzX2NwdV93cml0ZV9hY2Nlc3MpIHsKKyAgICAgICAgLyogYnVpbGQgY29kZSBiaXRtYXAgKi8KKyAgICAgICAgYnVpbGRfcGFnZV9iaXRtYXAocCk7CisgICAgfQorCisgICAgLyogd2UgcmVtb3ZlIGFsbCB0aGUgVEJzIGluIHRoZSByYW5nZSBbc3RhcnQsIGVuZFsgKi8KKyAgICAvKiBYWFg6IHNlZSBpZiBpbiBzb21lIGNhc2VzIGl0IGNvdWxkIGJlIGZhc3RlciB0byBpbnZhbGlkYXRlIGFsbAorICAgICAgIHRoZSBjb2RlICovCisgICAgdGIgPSBwLT5maXJzdF90YjsKKyAgICB3aGlsZSAodGIgIT0gTlVMTCkgeworICAgICAgICBuID0gKHVpbnRwdHJfdCl0YiAmIDM7CisgICAgICAgIHRiID0gKFRyYW5zbGF0aW9uQmxvY2sgKikoKHVpbnRwdHJfdCl0YiAmIH4zKTsKKyAgICAgICAgdGJfbmV4dCA9IHRiLT5wYWdlX25leHRbbl07CisgICAgICAgIC8qIE5PVEU6IHRoaXMgaXMgc3VidGxlIGFzIGEgVEIgbWF5IHNwYW4gdHdvIHBoeXNpY2FsIHBhZ2VzICovCisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIC8qIE5PVEU6IHRiX2VuZCBtYXkgYmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgcGFnZSwgYnV0CisgICAgICAgICAgICAgICBpdCBpcyBub3QgYSBwcm9ibGVtICovCisgICAgICAgICAgICB0Yl9zdGFydCA9IHRiLT5wYWdlX2FkZHJbMF0gKyAodGItPnBjICYgflRBUkdFVF9QQUdFX01BU0spOworICAgICAgICAgICAgdGJfZW5kID0gdGJfc3RhcnQgKyB0Yi0+c2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRiX3N0YXJ0ID0gdGItPnBhZ2VfYWRkclsxXTsKKyAgICAgICAgICAgIHRiX2VuZCA9IHRiX3N0YXJ0ICsgKCh0Yi0+cGMgKyB0Yi0+c2l6ZSkgJiB+VEFSR0VUX1BBR0VfTUFTSyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEodGJfZW5kIDw9IHN0YXJ0IHx8IHRiX3N0YXJ0ID49IGVuZCkpIHsKKyNpZmRlZiBUQVJHRVRfSEFTX1BSRUNJU0VfU01DCisgICAgICAgICAgICBpZiAoY3VycmVudF90Yl9ub3RfZm91bmQpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RiX25vdF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgY3VycmVudF90YiA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGVudi0+bWVtX2lvX3BjKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vdyB3ZSBoYXZlIGEgcmVhbCBjcHUgZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF90YiA9IHRiX2ZpbmRfcGMoZW52LT5tZW1faW9fcGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXJyZW50X3RiID09IHRiICYmCisgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGItPmNmbGFncyAmIENGX0NPVU5UX01BU0spICE9IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgbW9kaWZ5aW5nIHRoZSBjdXJyZW50IFRCLCB3ZSBtdXN0IHN0b3AKKyAgICAgICAgICAgICAgICBpdHMgZXhlY3V0aW9uLiBXZSBjb3VsZCBiZSBtb3JlIHByZWNpc2UgYnkgY2hlY2tpbmcKKyAgICAgICAgICAgICAgICB0aGF0IHRoZSBtb2RpZmljYXRpb24gaXMgYWZ0ZXIgdGhlIGN1cnJlbnQgUEMsIGJ1dCBpdAorICAgICAgICAgICAgICAgIHdvdWxkIHJlcXVpcmUgYSBzcGVjaWFsaXplZCBmdW5jdGlvbiB0byBwYXJ0aWFsbHkKKyAgICAgICAgICAgICAgICByZXN0b3JlIHRoZSBDUFUgc3RhdGUgKi8KKworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGJfbW9kaWZpZWQgPSAxOworICAgICAgICAgICAgICAgIGNwdV9yZXN0b3JlX3N0YXRlX2Zyb21fdGIoY3VycmVudF90YiwgZW52LCBlbnYtPm1lbV9pb19wYyk7CisgICAgICAgICAgICAgICAgY3B1X2dldF90Yl9jcHVfc3RhdGUoZW52LCAmY3VycmVudF9wYywgJmN1cnJlbnRfY3NfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9mbGFncyk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVEFSR0VUX0hBU19QUkVDSVNFX1NNQyAqLworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBkbyB0aGF0IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBhIHNpZ25hbAorICAgICAgICAgICAgICAgb2NjdXJzIHdoaWxlIGRvaW5nIHRiX3BoeXNfaW52YWxpZGF0ZSgpICovCisgICAgICAgICAgICBzYXZlZF90YiA9IE5VTEw7CisgICAgICAgICAgICBpZiAoZW52KSB7CisgICAgICAgICAgICAgICAgc2F2ZWRfdGIgPSBlbnYtPmN1cnJlbnRfdGI7CisgICAgICAgICAgICAgICAgZW52LT5jdXJyZW50X3RiID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRiX3BoeXNfaW52YWxpZGF0ZSh0YiwgLTEpOworICAgICAgICAgICAgaWYgKGVudikgeworICAgICAgICAgICAgICAgIGVudi0+Y3VycmVudF90YiA9IHNhdmVkX3RiOworICAgICAgICAgICAgICAgIGlmIChjcHUtPmludGVycnVwdF9yZXF1ZXN0ICYmIGVudi0+Y3VycmVudF90YikgeworICAgICAgICAgICAgICAgICAgICBjcHVfaW50ZXJydXB0KGNwdSwgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRiID0gdGJfbmV4dDsKKyAgICB9CisjaWYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICAvKiBpZiBubyBjb2RlIHJlbWFpbmluZywgbm8gbmVlZCB0byBjb250aW51ZSB0byB1c2Ugc2xvdyB3cml0ZXMgKi8KKyAgICBpZiAoIXAtPmZpcnN0X3RiKSB7CisgICAgICAgIGludmFsaWRhdGVfcGFnZV9iaXRtYXAocCk7CisgICAgICAgIGlmIChpc19jcHVfd3JpdGVfYWNjZXNzKSB7CisgICAgICAgICAgICB0bGJfdW5wcm90ZWN0X2NvZGVfcGh5cyhlbnYsIHN0YXJ0LCBlbnYtPm1lbV9pb192YWRkcik7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZmRlZiBUQVJHRVRfSEFTX1BSRUNJU0VfU01DCisgICAgaWYgKGN1cnJlbnRfdGJfbW9kaWZpZWQpIHsKKyAgICAgICAgLyogd2UgZ2VuZXJhdGUgYSBibG9jayBjb250YWluaW5nIGp1c3QgdGhlIGluc3RydWN0aW9uCisgICAgICAgICAgIG1vZGlmeWluZyB0aGUgbWVtb3J5LiBJdCB3aWxsIGVuc3VyZSB0aGF0IGl0IGNhbm5vdCBtb2RpZnkKKyAgICAgICAgICAgaXRzZWxmICovCisgICAgICAgIGVudi0+Y3VycmVudF90YiA9IE5VTEw7CisgICAgICAgIHRiX2dlbl9jb2RlKGVudiwgY3VycmVudF9wYywgY3VycmVudF9jc19iYXNlLCBjdXJyZW50X2ZsYWdzLCAxKTsKKyAgICAgICAgY3B1X3Jlc3VtZV9mcm9tX3NpZ25hbChlbnYsIE5VTEwpOworICAgIH0KKyNlbmRpZgorfQorCisvKiBsZW4gbXVzdCBiZSA8PSA4IGFuZCBzdGFydCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgbGVuICovCit2b2lkIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX2Zhc3QodGJfcGFnZV9hZGRyX3Qgc3RhcnQsIGludCBsZW4pCit7CisgICAgUGFnZURlc2MgKnA7CisgICAgaW50IG9mZnNldCwgYjsKKworI2lmIDAKKyAgICBpZiAoMSkgeworICAgICAgICBxZW11X2xvZygibW9kaWZ5aW5nIGNvZGUgYXQgMHgleCBzaXplPSVkIEVJUD0leCBQQz0lMDh4XG4iLAorICAgICAgICAgICAgICAgICAgY3B1X3NpbmdsZV9lbnYtPm1lbV9pb192YWRkciwgbGVuLAorICAgICAgICAgICAgICAgICAgY3B1X3NpbmdsZV9lbnYtPmVpcCwKKyAgICAgICAgICAgICAgICAgIGNwdV9zaW5nbGVfZW52LT5laXAgKworICAgICAgICAgICAgICAgICAgKGludHB0cl90KWNwdV9zaW5nbGVfZW52LT5zZWdzW1JfQ1NdLmJhc2UpOworICAgIH0KKyNlbmRpZgorICAgIHAgPSBwYWdlX2ZpbmQoc3RhcnQgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHAtPmNvZGVfYml0bWFwKSB7CisgICAgICAgIG9mZnNldCA9IHN0YXJ0ICYgflRBUkdFVF9QQUdFX01BU0s7CisgICAgICAgIGIgPSBwLT5jb2RlX2JpdG1hcFtvZmZzZXQgPj4gM10gPj4gKG9mZnNldCAmIDcpOworICAgICAgICBpZiAoYiAmICgoMSA8PCBsZW4pIC0gMSkpIHsKKyAgICAgICAgICAgIGdvdG8gZG9faW52YWxpZGF0ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgZG9faW52YWxpZGF0ZToKKyAgICAgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfcmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgbGVuLCAxKTsKKyAgICB9Cit9CisKK3ZvaWQgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfZmFzdDAoaHdhZGRyIHN0YXJ0LCBpbnQgbGVuKSB7CisgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfZmFzdChzdGFydCwgbGVuKTsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19TT0ZUTU1VKQorc3RhdGljIHZvaWQgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2UodGJfcGFnZV9hZGRyX3QgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBwYywgdm9pZCAqcHVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NrZWQpCit7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGI7CisgICAgUGFnZURlc2MgKnA7CisgICAgaW50IG47CisjaWZkZWYgVEFSR0VUX0hBU19QUkVDSVNFX1NNQworICAgIFRyYW5zbGF0aW9uQmxvY2sgKmN1cnJlbnRfdGIgPSBOVUxMOworICAgIENQVUFyY2hTdGF0ZSAqZW52ID0gY3B1X3NpbmdsZV9lbnY7CisgICAgaW50IGN1cnJlbnRfdGJfbW9kaWZpZWQgPSAwOworICAgIHRhcmdldF91bG9uZyBjdXJyZW50X3BjID0gMDsKKyAgICB0YXJnZXRfdWxvbmcgY3VycmVudF9jc19iYXNlID0gMDsKKyAgICBpbnQgY3VycmVudF9mbGFncyA9IDA7CisjZW5kaWYKKworICAgIGFkZHIgJj0gVEFSR0VUX1BBR0VfTUFTSzsKKyAgICBwID0gcGFnZV9maW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdGIgPSBwLT5maXJzdF90YjsKKyNpZmRlZiBUQVJHRVRfSEFTX1BSRUNJU0VfU01DCisgICAgaWYgKHRiICYmIHBjICE9IDApIHsKKyAgICAgICAgY3VycmVudF90YiA9IHRiX2ZpbmRfcGMocGMpOworICAgIH0KKyNlbmRpZgorICAgIHdoaWxlICh0YiAhPSBOVUxMKSB7CisgICAgICAgIG4gPSAodWludHB0cl90KXRiICYgMzsKKyAgICAgICAgdGIgPSAoVHJhbnNsYXRpb25CbG9jayAqKSgodWludHB0cl90KXRiICYgfjMpOworI2lmZGVmIFRBUkdFVF9IQVNfUFJFQ0lTRV9TTUMKKyAgICAgICAgaWYgKGN1cnJlbnRfdGIgPT0gdGIgJiYKKyAgICAgICAgICAgIChjdXJyZW50X3RiLT5jZmxhZ3MgJiBDRl9DT1VOVF9NQVNLKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIG1vZGlmeWluZyB0aGUgY3VycmVudCBUQiwgd2UgbXVzdCBzdG9wCisgICAgICAgICAgICAgICAgICAgaXRzIGV4ZWN1dGlvbi4gV2UgY291bGQgYmUgbW9yZSBwcmVjaXNlIGJ5IGNoZWNraW5nCisgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgbW9kaWZpY2F0aW9uIGlzIGFmdGVyIHRoZSBjdXJyZW50IFBDLCBidXQgaXQKKyAgICAgICAgICAgICAgICAgICB3b3VsZCByZXF1aXJlIGEgc3BlY2lhbGl6ZWQgZnVuY3Rpb24gdG8gcGFydGlhbGx5CisgICAgICAgICAgICAgICAgICAgcmVzdG9yZSB0aGUgQ1BVIHN0YXRlICovCisKKyAgICAgICAgICAgIGN1cnJlbnRfdGJfbW9kaWZpZWQgPSAxOworICAgICAgICAgICAgY3B1X3Jlc3RvcmVfc3RhdGVfZnJvbV90YihjdXJyZW50X3RiLCBlbnYsIHBjKTsKKyAgICAgICAgICAgIGNwdV9nZXRfdGJfY3B1X3N0YXRlKGVudiwgJmN1cnJlbnRfcGMsICZjdXJyZW50X2NzX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9mbGFncyk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBUQVJHRVRfSEFTX1BSRUNJU0VfU01DICovCisgICAgICAgIHRiX3BoeXNfaW52YWxpZGF0ZSh0YiwgYWRkcik7CisgICAgICAgIHRiID0gdGItPnBhZ2VfbmV4dFtuXTsKKyAgICB9CisgICAgcC0+Zmlyc3RfdGIgPSBOVUxMOworI2lmZGVmIFRBUkdFVF9IQVNfUFJFQ0lTRV9TTUMKKyAgICBpZiAoY3VycmVudF90Yl9tb2RpZmllZCkgeworICAgICAgICAvKiB3ZSBnZW5lcmF0ZSBhIGJsb2NrIGNvbnRhaW5pbmcganVzdCB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgbW9kaWZ5aW5nIHRoZSBtZW1vcnkuIEl0IHdpbGwgZW5zdXJlIHRoYXQgaXQgY2Fubm90IG1vZGlmeQorICAgICAgICAgICBpdHNlbGYgKi8KKyAgICAgICAgZW52LT5jdXJyZW50X3RiID0gTlVMTDsKKyAgICAgICAgdGJfZ2VuX2NvZGUoZW52LCBjdXJyZW50X3BjLCBjdXJyZW50X2NzX2Jhc2UsIGN1cnJlbnRfZmxhZ3MsIDEpOworICAgICAgICBpZiAobG9ja2VkKSB7CisgICAgICAgICAgICBtbWFwX3VubG9jaygpOworICAgICAgICB9CisgICAgICAgIGNwdV9yZXN1bWVfZnJvbV9zaWduYWwoZW52LCBwdWMpOworICAgIH0KKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIGFkZCB0aGUgdGIgaW4gdGhlIHRhcmdldCBwYWdlIGFuZCBwcm90ZWN0IGl0IGlmIG5lY2Vzc2FyeSAqLworc3RhdGljIGlubGluZSB2b2lkIHRiX2FsbG9jX3BhZ2UoVHJhbnNsYXRpb25CbG9jayAqdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbiwgdGJfcGFnZV9hZGRyX3QgcGFnZV9hZGRyKQoreworICAgIFBhZ2VEZXNjICpwOworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisgICAgYm9vbCBwYWdlX2FscmVhZHlfcHJvdGVjdGVkOworI2VuZGlmCisKKyAgICB0Yi0+cGFnZV9hZGRyW25dID0gcGFnZV9hZGRyOworICAgIHAgPSBwYWdlX2ZpbmRfYWxsb2MocGFnZV9hZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMsIDEpOworICAgIHRiLT5wYWdlX25leHRbbl0gPSBwLT5maXJzdF90YjsKKyNpZm5kZWYgQ09ORklHX1VTRVJfT05MWQorICAgIHBhZ2VfYWxyZWFkeV9wcm90ZWN0ZWQgPSBwLT5maXJzdF90YiAhPSBOVUxMOworI2VuZGlmCisgICAgcC0+Zmlyc3RfdGIgPSAoVHJhbnNsYXRpb25CbG9jayAqKSgodWludHB0cl90KXRiIHwgbik7CisgICAgaW52YWxpZGF0ZV9wYWdlX2JpdG1hcChwKTsKKworI2lmIGRlZmluZWQoVEFSR0VUX0hBU19TTUMpIHx8IDEKKworI2lmIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkKKyAgICBpZiAocC0+ZmxhZ3MgJiBQQUdFX1dSSVRFKSB7CisgICAgICAgIHRhcmdldF91bG9uZyBhZGRyOworICAgICAgICBQYWdlRGVzYyAqcDI7CisgICAgICAgIGludCBwcm90OworCisgICAgICAgIC8qIGZvcmNlIHRoZSBob3N0IHBhZ2UgYXMgbm9uIHdyaXRhYmxlICh3cml0ZXMgd2lsbCBoYXZlIGEKKyAgICAgICAgICAgcGFnZSBmYXVsdCArIG1wcm90ZWN0IG92ZXJoZWFkKSAqLworICAgICAgICBwYWdlX2FkZHIgJj0gcWVtdV9ob3N0X3BhZ2VfbWFzazsKKyAgICAgICAgcHJvdCA9IDA7CisgICAgICAgIGZvciAoYWRkciA9IHBhZ2VfYWRkcjsgYWRkciA8IHBhZ2VfYWRkciArIHFlbXVfaG9zdF9wYWdlX3NpemU7CisgICAgICAgICAgICBhZGRyICs9IFRBUkdFVF9QQUdFX1NJWkUpIHsKKworICAgICAgICAgICAgcDIgPSBwYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgICAgIGlmICghcDIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3QgfD0gcDItPmZsYWdzOworICAgICAgICAgICAgcDItPmZsYWdzICY9IH5QQUdFX1dSSVRFOworICAgICAgICAgIH0KKyAgICAgICAgbXByb3RlY3QoZzJoKHBhZ2VfYWRkciksIHFlbXVfaG9zdF9wYWdlX3NpemUsCisgICAgICAgICAgICAgICAgIChwcm90ICYgUEFHRV9CSVRTKSAmIH5QQUdFX1dSSVRFKTsKKyNpZmRlZiBERUJVR19UQl9JTlZBTElEQVRFCisgICAgICAgIHByaW50ZigicHJvdGVjdGluZyBjb2RlIHBhZ2U6IDB4IiBUQVJHRVRfRk1UX2x4ICJcbiIsCisgICAgICAgICAgICAgICBwYWdlX2FkZHIpOworI2VuZGlmCisgICAgfQorI2Vsc2UKKyAgICAvKiBpZiBzb21lIGNvZGUgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGVuIHRoZSBwYWdlcyBhcmUgYWxyZWFkeQorICAgICAgIHByb3RlY3RlZC4gU28gd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG9ubHkgdGhlIGZpcnN0IFRCIGlzCisgICAgICAgYWxsb2NhdGVkIGluIGEgcGh5c2ljYWwgcGFnZSAqLworICAgIGlmICghcGFnZV9hbHJlYWR5X3Byb3RlY3RlZCkgeworICAgICAgICB0bGJfcHJvdGVjdF9jb2RlKHBhZ2VfYWRkcik7CisgICAgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBUQVJHRVRfSEFTX1NNQyAqLworfQorCisvKiBhZGQgYSBuZXcgVEIgYW5kIGxpbmsgaXQgdG8gdGhlIHBoeXNpY2FsIHBhZ2UgdGFibGVzLiBwaHlzX3BhZ2UyIGlzCisgICAoLTEpIHRvIGluZGljYXRlIHRoYXQgb25seSBvbmUgcGFnZSBjb250YWlucyB0aGUgVEIuICovCitzdGF0aWMgdm9pZCB0Yl9saW5rX3BhZ2UoVHJhbnNsYXRpb25CbG9jayAqdGIsIHRiX3BhZ2VfYWRkcl90IHBoeXNfcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGJfcGFnZV9hZGRyX3QgcGh5c19wYWdlMikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaDsKKyAgICBUcmFuc2xhdGlvbkJsb2NrICoqcHRiOworCisgICAgLyogR3JhYiB0aGUgbW1hcCBsb2NrIHRvIHN0b3AgYW5vdGhlciB0aHJlYWQgaW52YWxpZGF0aW5nIHRoaXMgVEIKKyAgICAgICBiZWZvcmUgd2UgYXJlIGRvbmUuICAqLworICAgIG1tYXBfbG9jaygpOworICAgIC8qIGFkZCBpbiB0aGUgcGh5c2ljYWwgaGFzaCB0YWJsZSAqLworICAgIGggPSB0Yl9waHlzX2hhc2hfZnVuYyhwaHlzX3BjKTsKKyAgICBwdGIgPSAmdGNnX2N0eC50Yl9jdHgudGJfcGh5c19oYXNoW2hdOworICAgIHRiLT5waHlzX2hhc2hfbmV4dCA9ICpwdGI7CisgICAgKnB0YiA9IHRiOworCisgICAgLyogYWRkIGluIHRoZSBwYWdlIGxpc3QgKi8KKyAgICB0Yl9hbGxvY19wYWdlKHRiLCAwLCBwaHlzX3BjICYgVEFSR0VUX1BBR0VfTUFTSyk7CisgICAgaWYgKHBoeXNfcGFnZTIgIT0gLTEpIHsKKyAgICAgICAgdGJfYWxsb2NfcGFnZSh0YiwgMSwgcGh5c19wYWdlMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGItPnBhZ2VfYWRkclsxXSA9IC0xOworICAgIH0KKworICAgIHRiLT5qbXBfZmlyc3QgPSAoVHJhbnNsYXRpb25CbG9jayAqKSgodWludHB0cl90KXRiIHwgMik7CisgICAgdGItPmptcF9uZXh0WzBdID0gTlVMTDsKKyAgICB0Yi0+am1wX25leHRbMV0gPSBOVUxMOworCisgICAgLyogaW5pdCBvcmlnaW5hbCBqdW1wIGFkZHJlc3NlcyAqLworICAgIGlmICh0Yi0+dGJfbmV4dF9vZmZzZXRbMF0gIT0gMHhmZmZmKSB7CisgICAgICAgIHRiX3Jlc2V0X2p1bXAodGIsIDApOworICAgIH0KKyAgICBpZiAodGItPnRiX25leHRfb2Zmc2V0WzFdICE9IDB4ZmZmZikgeworICAgICAgICB0Yl9yZXNldF9qdW1wKHRiLCAxKTsKKyAgICB9CisKKyNpZmRlZiBERUJVR19UQl9DSEVDSworICAgIHRiX3BhZ2VfY2hlY2soKTsKKyNlbmRpZgorICAgIG1tYXBfdW5sb2NrKCk7Cit9CisKKy8qIGZpbmQgdGhlIFRCICd0Yicgc3VjaCB0aGF0IHRiWzBdLnRjX3B0ciA8PSB0Y19wdHIgPAorICAgdGJbMV0udGNfcHRyLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQgKi8KK1RyYW5zbGF0aW9uQmxvY2sgKnRiX2ZpbmRfcGModWludHB0cl90IHRjX3B0cikKK3sKKyAgICBpbnQgbV9taW4sIG1fbWF4LCBtOworICAgIHVpbnRwdHJfdCB2OworICAgIFRyYW5zbGF0aW9uQmxvY2sgKnRiOworCisgICAgaWYgKHRjZ19jdHgudGJfY3R4Lm5iX3RicyA8PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodGNfcHRyIDwgKHVpbnRwdHJfdCl0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciB8fAorICAgICAgICB0Y19wdHIgPj0gKHVpbnRwdHJfdCl0Y2dfY3R4LmNvZGVfZ2VuX3B0cikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogYmluYXJ5IHNlYXJjaCAoY2YgS251dGgpICovCisgICAgbV9taW4gPSAwOworICAgIG1fbWF4ID0gdGNnX2N0eC50Yl9jdHgubmJfdGJzIC0gMTsKKyAgICB3aGlsZSAobV9taW4gPD0gbV9tYXgpIHsKKyAgICAgICAgbSA9IChtX21pbiArIG1fbWF4KSA+PiAxOworICAgICAgICB0YiA9ICZ0Y2dfY3R4LnRiX2N0eC50YnNbbV07CisgICAgICAgIHYgPSAodWludHB0cl90KXRiLT50Y19wdHI7CisgICAgICAgIGlmICh2ID09IHRjX3B0cikgeworICAgICAgICAgICAgcmV0dXJuIHRiOworICAgICAgICB9IGVsc2UgaWYgKHRjX3B0ciA8IHYpIHsKKyAgICAgICAgICAgIG1fbWF4ID0gbSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX21pbiA9IG0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAmdGNnX2N0eC50Yl9jdHgudGJzW21fbWF4XTsKK30KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorI2lmIGRlZmluZWQoVEFSR0VUX0hBU19JQ0UpICYmICFkZWZpbmVkKENPTkZJR19VU0VSX09OTFkpCit2b2lkIHRiX2ludmFsaWRhdGVfcGh5c19hZGRyKGh3YWRkciBhZGRyKQoreworICAgIHJhbV9hZGRyX3QgcmFtX2FkZHI7CisgICAgTWVtb3J5UmVnaW9uICptcjsKKyAgICBod2FkZHIgbCA9IDE7CisKKyAgICBtciA9IGFkZHJlc3Nfc3BhY2VfdHJhbnNsYXRlKCZhZGRyZXNzX3NwYWNlX21lbW9yeSwgYWRkciwgJmFkZHIsICZsLCBmYWxzZSk7CisgICAgaWYgKCEobWVtb3J5X3JlZ2lvbl9pc19yYW0obXIpCisgICAgICAgICAgfHwgbWVtb3J5X3JlZ2lvbl9pc19yb21kKG1yKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByYW1fYWRkciA9IChtZW1vcnlfcmVnaW9uX2dldF9yYW1fYWRkcihtcikgJiBUQVJHRVRfUEFHRV9NQVNLKQorICAgICAgICArIGFkZHI7CisgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2VfcmFuZ2UocmFtX2FkZHIsIHJhbV9hZGRyICsgMSwgMCk7Cit9CisjZW5kaWYgLyogVEFSR0VUX0hBU19JQ0UgJiYgIWRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKK3ZvaWQgdGJfY2hlY2tfd2F0Y2hwb2ludChDUFVBcmNoU3RhdGUgKmVudikKK3sKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKworICAgIHRiID0gdGJfZmluZF9wYyhlbnYtPm1lbV9pb19wYyk7CisgICAgaWYgKCF0YikgeworICAgICAgICBjcHVfYWJvcnQoZW52LCAiY2hlY2tfd2F0Y2hwb2ludDogY291bGQgbm90IGZpbmQgVEIgZm9yIHBjPSVwIiwKKyAgICAgICAgICAgICAgICAgICh2b2lkICopZW52LT5tZW1faW9fcGMpOworICAgIH0KKyAgICBjcHVfcmVzdG9yZV9zdGF0ZV9mcm9tX3RiKHRiLCBlbnYsIGVudi0+bWVtX2lvX3BjKTsKKyAgICB0Yl9waHlzX2ludmFsaWRhdGUodGIsIC0xKTsKK30KKworI2lmbmRlZiBDT05GSUdfVVNFUl9PTkxZCisvKiBtYXNrIG11c3QgbmV2ZXIgYmUgemVybywgZXhjZXB0IGZvciBBMjAgY2hhbmdlIGNhbGwgKi8KK3ZvaWQgY3B1X2ludGVycnVwdChDUFVTdGF0ZSAqY3B1LCBpbnQgbWFzaykKK3sKKyAgICBDUFVBcmNoU3RhdGUgKmVudiA9IGNwdS0+ZW52X3B0cjsKKyAgICBpbnQgb2xkX21hc2s7CisKKyAgICBvbGRfbWFzayA9IGNwdS0+aW50ZXJydXB0X3JlcXVlc3Q7CisgICAgY3B1LT5pbnRlcnJ1cHRfcmVxdWVzdCB8PSBtYXNrOworCisgICAgLyoKKyAgICAgKiBJZiBjYWxsZWQgZnJvbSBpb3RocmVhZCBjb250ZXh0LCB3YWtlIHRoZSB0YXJnZXQgY3B1IGluCisgICAgICogY2FzZSBpdHMgaGFsdGVkLgorICAgICAqLworICAgIGlmICghcWVtdV9jcHVfaXNfc2VsZihjcHUpKSB7CisgICAgICAgIHFlbXVfY3B1X2tpY2soY3B1KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh1c2VfaWNvdW50KSB7CisgICAgICAgIGVudi0+aWNvdW50X2RlY3IudTE2LmhpZ2ggPSAweGZmZmY7CisgICAgICAgIGlmICghY2FuX2RvX2lvKGVudikKKyAgICAgICAgICAgICYmIChtYXNrICYgfm9sZF9tYXNrKSAhPSAwKSB7CisgICAgICAgICAgICBjcHVfYWJvcnQoZW52LCAiUmFpc2VkIGludGVycnVwdCB3aGlsZSBub3QgaW4gSS9PIGZ1bmN0aW9uIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjcHUtPnRjZ19leGl0X3JlcSA9IDE7CisgICAgfQorfQorCisvKiBpbiBkZXRlcm1pbmlzdGljIGV4ZWN1dGlvbiBtb2RlLCBpbnN0cnVjdGlvbnMgZG9pbmcgZGV2aWNlIEkvT3MKKyAgIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgVEIgKi8KK3ZvaWQgY3B1X2lvX3JlY29tcGlsZShDUFVBcmNoU3RhdGUgKmVudiwgdWludHB0cl90IHJldGFkZHIpCit7CisgICAgVHJhbnNsYXRpb25CbG9jayAqdGI7CisgICAgdWludDMyX3QgbiwgY2ZsYWdzOworICAgIHRhcmdldF91bG9uZyBwYywgY3NfYmFzZTsKKyAgICB1aW50NjRfdCBmbGFnczsKKworICAgIHRiID0gdGJfZmluZF9wYyhyZXRhZGRyKTsKKyAgICBpZiAoIXRiKSB7CisgICAgICAgIGNwdV9hYm9ydChlbnYsICJjcHVfaW9fcmVjb21waWxlOiBjb3VsZCBub3QgZmluZCBUQiBmb3IgcGM9JXAiLAorICAgICAgICAgICAgICAgICAgKHZvaWQgKilyZXRhZGRyKTsKKyAgICB9CisgICAgbiA9IGVudi0+aWNvdW50X2RlY3IudTE2LmxvdyArIHRiLT5pY291bnQ7CisgICAgY3B1X3Jlc3RvcmVfc3RhdGVfZnJvbV90Yih0YiwgZW52LCByZXRhZGRyKTsKKyAgICAvKiBDYWxjdWxhdGUgaG93IG1hbnkgaW5zdHJ1Y3Rpb25zIGhhZCBiZWVuIGV4ZWN1dGVkIGJlZm9yZSB0aGUgZmF1bHQKKyAgICAgICBvY2N1cnJlZC4gICovCisgICAgbiA9IG4gLSBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3c7CisgICAgLyogR2VuZXJhdGUgYSBuZXcgVEIgZW5kaW5nIG9uIHRoZSBJL08gaW5zbi4gICovCisgICAgbisrOworICAgIC8qIE9uIE1JUFMgYW5kIFNILCBkZWxheSBzbG90IGluc3RydWN0aW9ucyBjYW4gb25seSBiZSByZXN0YXJ0ZWQgaWYKKyAgICAgICB0aGV5IHdlcmUgYWxyZWFkeSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIFRCLiAgSWYgdGhpcyBpcyBub3QKKyAgICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gYSBUQiB0aGVuIHJlLWV4ZWN1dGUgdGhlIHByZWNlZGluZworICAgICAgIGJyYW5jaC4gICovCisjaWYgZGVmaW5lZChUQVJHRVRfTUlQUykKKyAgICBpZiAoKGVudi0+aGZsYWdzICYgTUlQU19IRkxBR19CTUFTSykgIT0gMCAmJiBuID4gMSkgeworICAgICAgICBlbnYtPmFjdGl2ZV90Yy5QQyAtPSA0OworICAgICAgICBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3crKzsKKyAgICAgICAgZW52LT5oZmxhZ3MgJj0gfk1JUFNfSEZMQUdfQk1BU0s7CisgICAgfQorI2VsaWYgZGVmaW5lZChUQVJHRVRfU0g0KQorICAgIGlmICgoZW52LT5mbGFncyAmICgoREVMQVlfU0xPVCB8IERFTEFZX1NMT1RfQ09ORElUSU9OQUwpKSkgIT0gMAorICAgICAgICAgICAgJiYgbiA+IDEpIHsKKyAgICAgICAgZW52LT5wYyAtPSAyOworICAgICAgICBlbnYtPmljb3VudF9kZWNyLnUxNi5sb3crKzsKKyAgICAgICAgZW52LT5mbGFncyAmPSB+KERFTEFZX1NMT1QgfCBERUxBWV9TTE9UX0NPTkRJVElPTkFMKTsKKyAgICB9CisjZW5kaWYKKyAgICAvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICAqLworICAgIGlmIChuID4gQ0ZfQ09VTlRfTUFTSykgeworICAgICAgICBjcHVfYWJvcnQoZW52LCAiVEIgdG9vIGJpZyBkdXJpbmcgcmVjb21waWxlIik7CisgICAgfQorCisgICAgY2ZsYWdzID0gbiB8IENGX0xBU1RfSU87CisgICAgcGMgPSB0Yi0+cGM7CisgICAgY3NfYmFzZSA9IHRiLT5jc19iYXNlOworICAgIGZsYWdzID0gdGItPmZsYWdzOworICAgIHRiX3BoeXNfaW52YWxpZGF0ZSh0YiwgLTEpOworICAgIC8qIEZJWE1FOiBJbiB0aGVvcnkgdGhpcyBjb3VsZCByYWlzZSBhbiBleGNlcHRpb24uICBJbiBwcmFjdGljZQorICAgICAgIHdlIGhhdmUgYWxyZWFkeSB0cmFuc2xhdGVkIHRoZSBibG9jayBvbmNlIHNvIGl0J3MgcHJvYmFibHkgb2suICAqLworICAgIHRiX2dlbl9jb2RlKGVudiwgcGMsIGNzX2Jhc2UsIGZsYWdzLCBjZmxhZ3MpOworICAgIC8qIFRPRE86IElmIGVudi0+cGMgIT0gdGItPnBjIChpLmUuIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbiB3YXMgbm90CisgICAgICAgdGhlIGZpcnN0IGluIHRoZSBUQikgdGhlbiB3ZSBlbmQgdXAgZ2VuZXJhdGluZyBhIHdob2xlIG5ldyBUQiBhbmQKKyAgICAgICByZXBlYXRpbmcgdGhlIGZhdWx0LCB3aGljaCBpcyBob3JyaWJseSBpbmVmZmljaWVudC4KKyAgICAgICBCZXR0ZXIgd291bGQgYmUgdG8gZXhlY3V0ZSBqdXN0IHRoaXMgaW5zbiB1bmNhY2hlZCwgb3IgZ2VuZXJhdGUgYQorICAgICAgIHNlY29uZCBuZXcgVEIuICAqLworICAgIGNwdV9yZXN1bWVfZnJvbV9zaWduYWwoZW52LCBOVUxMKTsKK30KKwordm9pZCB0Yl9mbHVzaF9qbXBfY2FjaGUoQ1BVQXJjaFN0YXRlICplbnYsIHRhcmdldF91bG9uZyBhZGRyKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgLyogRGlzY2FyZCBqdW1wIGNhY2hlIGVudHJpZXMgZm9yIGFueSB0YiB3aGljaCBtaWdodCBwb3RlbnRpYWxseQorICAgICAgIG92ZXJsYXAgdGhlIGZsdXNoZWQgcGFnZS4gICovCisgICAgaSA9IHRiX2ptcF9jYWNoZV9oYXNoX3BhZ2UoYWRkciAtIFRBUkdFVF9QQUdFX1NJWkUpOworICAgIG1lbXNldCgmZW52LT50Yl9qbXBfY2FjaGVbaV0sIDAsCisgICAgICAgICAgIFRCX0pNUF9QQUdFX1NJWkUgKiBzaXplb2YoVHJhbnNsYXRpb25CbG9jayAqKSk7CisKKyAgICBpID0gdGJfam1wX2NhY2hlX2hhc2hfcGFnZShhZGRyKTsKKyAgICBtZW1zZXQoJmVudi0+dGJfam1wX2NhY2hlW2ldLCAwLAorICAgICAgICAgICBUQl9KTVBfUEFHRV9TSVpFICogc2l6ZW9mKFRyYW5zbGF0aW9uQmxvY2sgKikpOworfQorCit2b2lkIGR1bXBfZXhlY19pbmZvKEZJTEUgKmYsIGZwcmludGZfZnVuY3Rpb24gY3B1X2ZwcmludGYpCit7CisgICAgaW50IGksIHRhcmdldF9jb2RlX3NpemUsIG1heF90YXJnZXRfY29kZV9zaXplOworICAgIGludCBkaXJlY3Rfam1wX2NvdW50LCBkaXJlY3Rfam1wMl9jb3VudCwgY3Jvc3NfcGFnZTsKKyAgICBUcmFuc2xhdGlvbkJsb2NrICp0YjsKKworICAgIHRhcmdldF9jb2RlX3NpemUgPSAwOworICAgIG1heF90YXJnZXRfY29kZV9zaXplID0gMDsKKyAgICBjcm9zc19wYWdlID0gMDsKKyAgICBkaXJlY3Rfam1wX2NvdW50ID0gMDsKKyAgICBkaXJlY3Rfam1wMl9jb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHRjZ19jdHgudGJfY3R4Lm5iX3RiczsgaSsrKSB7CisgICAgICAgIHRiID0gJnRjZ19jdHgudGJfY3R4LnRic1tpXTsKKyAgICAgICAgdGFyZ2V0X2NvZGVfc2l6ZSArPSB0Yi0+c2l6ZTsKKyAgICAgICAgaWYgKHRiLT5zaXplID4gbWF4X3RhcmdldF9jb2RlX3NpemUpIHsKKyAgICAgICAgICAgIG1heF90YXJnZXRfY29kZV9zaXplID0gdGItPnNpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRiLT5wYWdlX2FkZHJbMV0gIT0gLTEpIHsKKyAgICAgICAgICAgIGNyb3NzX3BhZ2UrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAodGItPnRiX25leHRfb2Zmc2V0WzBdICE9IDB4ZmZmZikgeworICAgICAgICAgICAgZGlyZWN0X2ptcF9jb3VudCsrOworICAgICAgICAgICAgaWYgKHRiLT50Yl9uZXh0X29mZnNldFsxXSAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3Rfam1wMl9jb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIFhYWDogYXZvaWQgdXNpbmcgZG91YmxlcyA/ICovCisgICAgY3B1X2ZwcmludGYoZiwgIlRyYW5zbGF0aW9uIGJ1ZmZlciBzdGF0ZTpcbiIpOworICAgIGNwdV9mcHJpbnRmKGYsICJnZW4gY29kZSBzaXplICAgICAgICV0ZC8lemRcbiIsCisgICAgICAgICAgICAgICAgdGNnX2N0eC5jb2RlX2dlbl9wdHIgLSB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlciwKKyAgICAgICAgICAgICAgICB0Y2dfY3R4LmNvZGVfZ2VuX2J1ZmZlcl9tYXhfc2l6ZSk7CisgICAgY3B1X2ZwcmludGYoZiwgIlRCIGNvdW50ICAgICAgICAgICAgJWQvJWRcbiIsCisgICAgICAgICAgICB0Y2dfY3R4LnRiX2N0eC5uYl90YnMsIHRjZ19jdHguY29kZV9nZW5fbWF4X2Jsb2Nrcyk7CisgICAgY3B1X2ZwcmludGYoZiwgIlRCIGF2ZyB0YXJnZXQgc2l6ZSAgJWQgbWF4PSVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgubmJfdGJzID8gdGFyZ2V0X2NvZGVfc2l6ZSAvCisgICAgICAgICAgICAgICAgICAgIHRjZ19jdHgudGJfY3R4Lm5iX3RicyA6IDAsCisgICAgICAgICAgICBtYXhfdGFyZ2V0X2NvZGVfc2l6ZSk7CisgICAgY3B1X2ZwcmludGYoZiwgIlRCIGF2ZyBob3N0IHNpemUgICAgJXRkIGJ5dGVzIChleHBhbnNpb24gcmF0aW86ICUwLjFmKVxuIiwKKyAgICAgICAgICAgIHRjZ19jdHgudGJfY3R4Lm5iX3RicyA/ICh0Y2dfY3R4LmNvZGVfZ2VuX3B0ciAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2N0eC5jb2RlX2dlbl9idWZmZXIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY3R4LnRiX2N0eC5uYl90YnMgOiAwLAorICAgICAgICAgICAgICAgIHRhcmdldF9jb2RlX3NpemUgPyAoZG91YmxlKSAodGNnX2N0eC5jb2RlX2dlbl9wdHIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2N0eC5jb2RlX2dlbl9idWZmZXIpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9jb2RlX3NpemUgOiAwKTsKKyAgICBjcHVfZnByaW50ZihmLCAiY3Jvc3MgcGFnZSBUQiBjb3VudCAlZCAoJWQlJSlcbiIsIGNyb3NzX3BhZ2UsCisgICAgICAgICAgICB0Y2dfY3R4LnRiX2N0eC5uYl90YnMgPyAoY3Jvc3NfcGFnZSAqIDEwMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgubmJfdGJzIDogMCk7CisgICAgY3B1X2ZwcmludGYoZiwgImRpcmVjdCBqdW1wIGNvdW50ICAgJWQgKCVkJSUpICgyIGp1bXBzPSVkICVkJSUpXG4iLAorICAgICAgICAgICAgICAgIGRpcmVjdF9qbXBfY291bnQsCisgICAgICAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgubmJfdGJzID8gKGRpcmVjdF9qbXBfY291bnQgKiAxMDApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZ19jdHgudGJfY3R4Lm5iX3RicyA6IDAsCisgICAgICAgICAgICAgICAgZGlyZWN0X2ptcDJfY291bnQsCisgICAgICAgICAgICAgICAgdGNnX2N0eC50Yl9jdHgubmJfdGJzID8gKGRpcmVjdF9qbXAyX2NvdW50ICogMTAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2dfY3R4LnRiX2N0eC5uYl90YnMgOiAwKTsKKyAgICBjcHVfZnByaW50ZihmLCAiXG5TdGF0aXN0aWNzOlxuIik7CisgICAgY3B1X2ZwcmludGYoZiwgIlRCIGZsdXNoIGNvdW50ICAgICAgJWRcbiIsIHRjZ19jdHgudGJfY3R4LnRiX2ZsdXNoX2NvdW50KTsKKyAgICBjcHVfZnByaW50ZihmLCAiVEIgaW52YWxpZGF0ZSBjb3VudCAlZFxuIiwKKyAgICAgICAgICAgIHRjZ19jdHgudGJfY3R4LnRiX3BoeXNfaW52YWxpZGF0ZV9jb3VudCk7CisgICAgY3B1X2ZwcmludGYoZiwgIlRMQiBmbHVzaCBjb3VudCAgICAgJWRcbiIsIHRsYl9mbHVzaF9jb3VudCk7CisgICAgdGNnX2R1bXBfaW5mbyhmLCBjcHVfZnByaW50Zik7Cit9CisKKyNlbHNlIC8qIENPTkZJR19VU0VSX09OTFkgKi8KKwordm9pZCBjcHVfaW50ZXJydXB0KENQVVN0YXRlICpjcHUsIGludCBtYXNrKQoreworICAgIGNwdS0+aW50ZXJydXB0X3JlcXVlc3QgfD0gbWFzazsKKyAgICBjcHUtPnRjZ19leGl0X3JlcSA9IDE7Cit9CisKKy8qCisgKiBXYWxrcyBndWVzdCBwcm9jZXNzIG1lbW9yeSAicmVnaW9ucyIgb25lIGJ5IG9uZQorICogYW5kIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9uICdmbicgZm9yIGVhY2ggcmVnaW9uLgorICovCitzdHJ1Y3Qgd2Fsa19tZW1vcnlfcmVnaW9uc19kYXRhIHsKKyAgICB3YWxrX21lbW9yeV9yZWdpb25zX2ZuIGZuOworICAgIHZvaWQgKnByaXY7CisgICAgdWludHB0cl90IHN0YXJ0OworICAgIGludCBwcm90OworfTsKKworc3RhdGljIGludCB3YWxrX21lbW9yeV9yZWdpb25zX2VuZChzdHJ1Y3Qgd2Fsa19tZW1vcnlfcmVnaW9uc19kYXRhICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYmlfdWxvbmcgZW5kLCBpbnQgbmV3X3Byb3QpCit7CisgICAgaWYgKGRhdGEtPnN0YXJ0ICE9IC0xdWwpIHsKKyAgICAgICAgaW50IHJjID0gZGF0YS0+Zm4oZGF0YS0+cHJpdiwgZGF0YS0+c3RhcnQsIGVuZCwgZGF0YS0+cHJvdCk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkYXRhLT5zdGFydCA9IChuZXdfcHJvdCA/IGVuZCA6IC0xdWwpOworICAgIGRhdGEtPnByb3QgPSBuZXdfcHJvdDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhbGtfbWVtb3J5X3JlZ2lvbnNfMShzdHJ1Y3Qgd2Fsa19tZW1vcnlfcmVnaW9uc19kYXRhICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpX3Vsb25nIGJhc2UsIGludCBsZXZlbCwgdm9pZCAqKmxwKQoreworICAgIGFiaV91bG9uZyBwYTsKKyAgICBpbnQgaSwgcmM7CisKKyAgICBpZiAoKmxwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHdhbGtfbWVtb3J5X3JlZ2lvbnNfZW5kKGRhdGEsIGJhc2UsIDApOworICAgIH0KKworICAgIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgIFBhZ2VEZXNjICpwZCA9ICpscDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTDJfU0laRTsgKytpKSB7CisgICAgICAgICAgICBpbnQgcHJvdCA9IHBkW2ldLmZsYWdzOworCisgICAgICAgICAgICBwYSA9IGJhc2UgfCAoaSA8PCBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgICAgIGlmIChwcm90ICE9IGRhdGEtPnByb3QpIHsKKyAgICAgICAgICAgICAgICByYyA9IHdhbGtfbWVtb3J5X3JlZ2lvbnNfZW5kKGRhdGEsIHBhLCBwcm90KTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqKnBwID0gKmxwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMMl9TSVpFOyArK2kpIHsKKyAgICAgICAgICAgIHBhID0gYmFzZSB8ICgoYWJpX3Vsb25nKWkgPDwKKyAgICAgICAgICAgICAgICAoVEFSR0VUX1BBR0VfQklUUyArIEwyX0JJVFMgKiBsZXZlbCkpOworICAgICAgICAgICAgcmMgPSB3YWxrX21lbW9yeV9yZWdpb25zXzEoZGF0YSwgcGEsIGxldmVsIC0gMSwgcHAgKyBpKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB3YWxrX21lbW9yeV9yZWdpb25zKHZvaWQgKnByaXYsIHdhbGtfbWVtb3J5X3JlZ2lvbnNfZm4gZm4pCit7CisgICAgc3RydWN0IHdhbGtfbWVtb3J5X3JlZ2lvbnNfZGF0YSBkYXRhOworICAgIHVpbnRwdHJfdCBpOworCisgICAgZGF0YS5mbiA9IGZuOworICAgIGRhdGEucHJpdiA9IHByaXY7CisgICAgZGF0YS5zdGFydCA9IC0xdWw7CisgICAgZGF0YS5wcm90ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBWX0wxX1NJWkU7IGkrKykgeworICAgICAgICBpbnQgcmMgPSB3YWxrX21lbW9yeV9yZWdpb25zXzEoJmRhdGEsIChhYmlfdWxvbmcpaSA8PCBWX0wxX1NISUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVl9MMV9TSElGVCAvIEwyX0JJVFMgLSAxLCBsMV9tYXAgKyBpKTsKKworICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHdhbGtfbWVtb3J5X3JlZ2lvbnNfZW5kKCZkYXRhLCAwLCAwKTsKK30KKworc3RhdGljIGludCBkdW1wX3JlZ2lvbih2b2lkICpwcml2LCBhYmlfdWxvbmcgc3RhcnQsCisgICAgYWJpX3Vsb25nIGVuZCwgdW5zaWduZWQgbG9uZyBwcm90KQoreworICAgIEZJTEUgKmYgPSAoRklMRSAqKXByaXY7CisKKyAgICAodm9pZCkgZnByaW50ZihmLCBUQVJHRVRfQUJJX0ZNVF9seCItIlRBUkdFVF9BQklfRk1UX2x4CisgICAgICAgICIgIlRBUkdFVF9BQklfRk1UX2x4IiAlYyVjJWNcbiIsCisgICAgICAgIHN0YXJ0LCBlbmQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAoKHByb3QgJiBQQUdFX1JFQUQpID8gJ3InIDogJy0nKSwKKyAgICAgICAgKChwcm90ICYgUEFHRV9XUklURSkgPyAndycgOiAnLScpLAorICAgICAgICAoKHByb3QgJiBQQUdFX0VYRUMpID8gJ3gnIDogJy0nKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogZHVtcCBtZW1vcnkgbWFwcGluZ3MgKi8KK3ZvaWQgcGFnZV9kdW1wKEZJTEUgKmYpCit7CisgICAgY29uc3QgaW50IGxlbmd0aCA9IHNpemVvZihhYmlfdWxvbmcpICogMjsKKyAgICAodm9pZCkgZnByaW50ZihmLCAiJS0qcyAlLSpzICUtKnMgJXNcbiIsCisgICAgICAgICAgICBsZW5ndGgsICJzdGFydCIsIGxlbmd0aCwgImVuZCIsIGxlbmd0aCwgInNpemUiLCAicHJvdCIpOworICAgIHdhbGtfbWVtb3J5X3JlZ2lvbnMoZiwgZHVtcF9yZWdpb24pOworfQorCitpbnQgcGFnZV9nZXRfZmxhZ3ModGFyZ2V0X3Vsb25nIGFkZHJlc3MpCit7CisgICAgUGFnZURlc2MgKnA7CisKKyAgICBwID0gcGFnZV9maW5kKGFkZHJlc3MgPj4gVEFSR0VUX1BBR0VfQklUUyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gcC0+ZmxhZ3M7Cit9CisKKy8qIE1vZGlmeSB0aGUgZmxhZ3Mgb2YgYSBwYWdlIGFuZCBpbnZhbGlkYXRlIHRoZSBjb2RlIGlmIG5lY2Vzc2FyeS4KKyAgIFRoZSBmbGFnIFBBR0VfV1JJVEVfT1JHIGlzIHBvc2l0aW9uZWQgYXV0b21hdGljYWxseSBkZXBlbmRpbmcKKyAgIG9uIFBBR0VfV1JJVEUuICBUaGUgbW1hcF9sb2NrIHNob3VsZCBhbHJlYWR5IGJlIGhlbGQuICAqLwordm9pZCBwYWdlX3NldF9mbGFncyh0YXJnZXRfdWxvbmcgc3RhcnQsIHRhcmdldF91bG9uZyBlbmQsIGludCBmbGFncykKK3sKKyAgICB0YXJnZXRfdWxvbmcgYWRkciwgbGVuOworCisgICAgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYWRkcmVzc2VzIG91dHNpZGUgdGhlCisgICAgICAgZ3Vlc3QgYWRkcmVzcyBzcGFjZS4gIElmIHRoaXMgYXNzZXJ0IGZpcmVzLCBpdCBwcm9iYWJseSBpbmRpY2F0ZXMKKyAgICAgICBhIG1pc3NpbmcgY2FsbCB0byBoMmdfdmFsaWQuICAqLworI2lmIFRBUkdFVF9BQklfQklUUyA+IEwxX01BUF9BRERSX1NQQUNFX0JJVFMKKyAgICBhc3NlcnQoZW5kIDwgKChhYmlfdWxvbmcpMSA8PCBMMV9NQVBfQUREUl9TUEFDRV9CSVRTKSk7CisjZW5kaWYKKyAgICBhc3NlcnQoc3RhcnQgPCBlbmQpOworCisgICAgc3RhcnQgPSBzdGFydCAmIFRBUkdFVF9QQUdFX01BU0s7CisgICAgZW5kID0gVEFSR0VUX1BBR0VfQUxJR04oZW5kKTsKKworICAgIGlmIChmbGFncyAmIFBBR0VfV1JJVEUpIHsKKyAgICAgICAgZmxhZ3MgfD0gUEFHRV9XUklURV9PUkc7CisgICAgfQorCisgICAgZm9yIChhZGRyID0gc3RhcnQsIGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgbGVuICE9IDA7CisgICAgICAgICBsZW4gLT0gVEFSR0VUX1BBR0VfU0laRSwgYWRkciArPSBUQVJHRVRfUEFHRV9TSVpFKSB7CisgICAgICAgIFBhZ2VEZXNjICpwID0gcGFnZV9maW5kX2FsbG9jKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUywgMSk7CisKKyAgICAgICAgLyogSWYgdGhlIHdyaXRlIHByb3RlY3Rpb24gYml0IGlzIHNldCwgdGhlbiB3ZSBpbnZhbGlkYXRlCisgICAgICAgICAgIHRoZSBjb2RlIGluc2lkZS4gICovCisgICAgICAgIGlmICghKHAtPmZsYWdzICYgUEFHRV9XUklURSkgJiYKKyAgICAgICAgICAgIChmbGFncyAmIFBBR0VfV1JJVEUpICYmCisgICAgICAgICAgICBwLT5maXJzdF90YikgeworICAgICAgICAgICAgdGJfaW52YWxpZGF0ZV9waHlzX3BhZ2UoYWRkciwgMCwgTlVMTCwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIHAtPmZsYWdzID0gZmxhZ3M7CisgICAgfQorfQorCitpbnQgcGFnZV9jaGVja19yYW5nZSh0YXJnZXRfdWxvbmcgc3RhcnQsIHRhcmdldF91bG9uZyBsZW4sIGludCBmbGFncykKK3sKKyAgICBQYWdlRGVzYyAqcDsKKyAgICB0YXJnZXRfdWxvbmcgZW5kOworICAgIHRhcmdldF91bG9uZyBhZGRyOworCisgICAgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggYWRkcmVzc2VzIG91dHNpZGUgdGhlCisgICAgICAgZ3Vlc3QgYWRkcmVzcyBzcGFjZS4gIElmIHRoaXMgYXNzZXJ0IGZpcmVzLCBpdCBwcm9iYWJseSBpbmRpY2F0ZXMKKyAgICAgICBhIG1pc3NpbmcgY2FsbCB0byBoMmdfdmFsaWQuICAqLworI2lmIFRBUkdFVF9BQklfQklUUyA+IEwxX01BUF9BRERSX1NQQUNFX0JJVFMKKyAgICBhc3NlcnQoc3RhcnQgPCAoKGFiaV91bG9uZykxIDw8IEwxX01BUF9BRERSX1NQQUNFX0JJVFMpKTsKKyNlbmRpZgorCisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoc3RhcnQgKyBsZW4gLSAxIDwgc3RhcnQpIHsKKyAgICAgICAgLyogV2UndmUgd3JhcHBlZCBhcm91bmQuICAqLworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogbXVzdCBkbyBiZWZvcmUgd2UgbG9vc2UgYml0cyBpbiB0aGUgbmV4dCBzdGVwICovCisgICAgZW5kID0gVEFSR0VUX1BBR0VfQUxJR04oc3RhcnQgKyBsZW4pOworICAgIHN0YXJ0ID0gc3RhcnQgJiBUQVJHRVRfUEFHRV9NQVNLOworCisgICAgZm9yIChhZGRyID0gc3RhcnQsIGxlbiA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgbGVuICE9IDA7CisgICAgICAgICBsZW4gLT0gVEFSR0VUX1BBR0VfU0laRSwgYWRkciArPSBUQVJHRVRfUEFHRV9TSVpFKSB7CisgICAgICAgIHAgPSBwYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEocC0+ZmxhZ3MgJiBQQUdFX1ZBTElEKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChmbGFncyAmIFBBR0VfUkVBRCkgJiYgIShwLT5mbGFncyAmIFBBR0VfUkVBRCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ3MgJiBQQUdFX1dSSVRFKSB7CisgICAgICAgICAgICBpZiAoIShwLT5mbGFncyAmIFBBR0VfV1JJVEVfT1JHKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHVucHJvdGVjdCB0aGUgcGFnZSBpZiBpdCB3YXMgcHV0IHJlYWQtb25seSBiZWNhdXNlIGl0CisgICAgICAgICAgICAgICBjb250YWlucyB0cmFuc2xhdGVkIGNvZGUgKi8KKyAgICAgICAgICAgIGlmICghKHAtPmZsYWdzICYgUEFHRV9XUklURSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhZ2VfdW5wcm90ZWN0KGFkZHIsIDAsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogY2FsbGVkIGZyb20gc2lnbmFsIGhhbmRsZXI6IGludmFsaWRhdGUgdGhlIGNvZGUgYW5kIHVucHJvdGVjdCB0aGUKKyAgIHBhZ2UuIFJldHVybiBUUlVFIGlmIHRoZSBmYXVsdCB3YXMgc3VjY2Vzc2Z1bGx5IGhhbmRsZWQuICovCitpbnQgcGFnZV91bnByb3RlY3QodGFyZ2V0X3Vsb25nIGFkZHJlc3MsIHVpbnRwdHJfdCBwYywgdm9pZCAqcHVjKQoreworICAgIHVuc2lnbmVkIGludCBwcm90OworICAgIFBhZ2VEZXNjICpwOworICAgIHRhcmdldF91bG9uZyBob3N0X3N0YXJ0LCBob3N0X2VuZCwgYWRkcjsKKworICAgIC8qIFRlY2huaWNhbGx5IHRoaXMgaXNuJ3Qgc2FmZSBpbnNpZGUgYSBzaWduYWwgaGFuZGxlci4gIEhvd2V2ZXIgd2UKKyAgICAgICBrbm93IHRoaXMgb25seSBldmVyIGhhcHBlbnMgaW4gYSBzeW5jaHJvbm91cyBTRUdWIGhhbmRsZXIsIHNvIGluCisgICAgICAgcHJhY3RpY2UgaXQgc2VlbXMgdG8gYmUgb2suICAqLworICAgIG1tYXBfbG9jaygpOworCisgICAgcCA9IHBhZ2VfZmluZChhZGRyZXNzID4+IFRBUkdFVF9QQUdFX0JJVFMpOworICAgIGlmICghcCkgeworICAgICAgICBtbWFwX3VubG9jaygpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgcGFnZSB3YXMgcmVhbGx5IHdyaXRhYmxlLCB0aGVuIHdlIGNoYW5nZSBpdHMKKyAgICAgICBwcm90ZWN0aW9uIGJhY2sgdG8gd3JpdGFibGUgKi8KKyAgICBpZiAoKHAtPmZsYWdzICYgUEFHRV9XUklURV9PUkcpICYmICEocC0+ZmxhZ3MgJiBQQUdFX1dSSVRFKSkgeworICAgICAgICBob3N0X3N0YXJ0ID0gYWRkcmVzcyAmIHFlbXVfaG9zdF9wYWdlX21hc2s7CisgICAgICAgIGhvc3RfZW5kID0gaG9zdF9zdGFydCArIHFlbXVfaG9zdF9wYWdlX3NpemU7CisKKyAgICAgICAgcHJvdCA9IDA7CisgICAgICAgIGZvciAoYWRkciA9IGhvc3Rfc3RhcnQgOyBhZGRyIDwgaG9zdF9lbmQgOyBhZGRyICs9IFRBUkdFVF9QQUdFX1NJWkUpIHsKKyAgICAgICAgICAgIHAgPSBwYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKKyAgICAgICAgICAgIHAtPmZsYWdzIHw9IFBBR0VfV1JJVEU7CisgICAgICAgICAgICBwcm90IHw9IHAtPmZsYWdzOworCisgICAgICAgICAgICAvKiBhbmQgc2luY2UgdGhlIGNvbnRlbnQgd2lsbCBiZSBtb2RpZmllZCwgd2UgbXVzdCBpbnZhbGlkYXRlCisgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyB0cmFuc2xhdGVkIGNvZGUuICovCisgICAgICAgICAgICB0Yl9pbnZhbGlkYXRlX3BoeXNfcGFnZShhZGRyLCBwYywgcHVjLCB0cnVlKTsKKyNpZmRlZiBERUJVR19UQl9DSEVDSworICAgICAgICAgICAgdGJfaW52YWxpZGF0ZV9jaGVjayhhZGRyKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIG1wcm90ZWN0KCh2b2lkICopZzJoKGhvc3Rfc3RhcnQpLCBxZW11X2hvc3RfcGFnZV9zaXplLAorICAgICAgICAgICAgICAgICBwcm90ICYgUEFHRV9CSVRTKTsKKworICAgICAgICBtbWFwX3VubG9jaygpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgbW1hcF91bmxvY2soKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVVNFUl9PTkxZICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3RyYW5zbGF0ZS1hbGwuaCBiL2FuZHJvaWQvcWVtdTEvdHJhbnNsYXRlLWFsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NGFlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3RyYW5zbGF0ZS1hbGwuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogIFRyYW5zbGF0ZWQgYmxvY2sgaGFuZGxpbmcKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBUUkFOU0xBVEVfQUxMX0gKKyNkZWZpbmUgVFJBTlNMQVRFX0FMTF9ICisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKy8qIFNpemUgb2YgdGhlIEwyIChhbmQgTDMsIGV0YykgcGFnZSB0YWJsZXMuICAqLworI2RlZmluZSBMMl9CSVRTIDEwCisjZGVmaW5lIEwyX1NJWkUgKDEgPDwgTDJfQklUUykKKworI2RlZmluZSBQX0wyX0xFVkVMUyBcCisgICAgKCgoVEFSR0VUX1BIWVNfQUREUl9TUEFDRV9CSVRTIC0gVEFSR0VUX1BBR0VfQklUUyAtIDEpIC8gTDJfQklUUykgKyAxKQorCisvKiB0cmFuc2xhdGUtYWxsLmMgKi8KK2Jvb2wgdGNnX2VuYWJsZWQodm9pZCk7Cit2b2lkIHRiX2ludmFsaWRhdGVfcGh5c19wYWdlX2Zhc3QodGJfcGFnZV9hZGRyX3Qgc3RhcnQsIGludCBsZW4pOwordm9pZCB0Yl9jaGVja193YXRjaHBvaW50KENQVUFyY2hTdGF0ZSAqZW52KTsKKworI2VuZGlmIC8qIFRSQU5TTEFURV9BTExfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91aS9jb25zb2xlLmMgYi9hbmRyb2lkL3FlbXUxL3VpL2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzk1Yjg5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS9jb25zb2xlLmMKQEAgLTAsMCArMSwxODMxIEBACisvKgorICogUUVNVSBncmFwaGljYWwgY29uc29sZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInVpL2NvbnNvbGUuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisKKy8vI2RlZmluZSBERUJVR19DT05TT0xFCisjZGVmaW5lIERFRkFVTFRfQkFDS1NDUk9MTCA1MTIKKyNkZWZpbmUgTUFYX0NPTlNPTEVTIDEyCisKKyNkZWZpbmUgUUVNVV9SR0JBKHIsIGcsIGIsIGEpICgoKGEpIDw8IDI0KSB8ICgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkKKyNkZWZpbmUgUUVNVV9SR0IociwgZywgYikgUUVNVV9SR0JBKHIsIGcsIGIsIDB4ZmYpCisKKyNpZmRlZiBDT05GSUdfU0tJTk5JTkcKKy8vIFNraW5uaW5nIG92ZXJ3cml0ZXMgdGhlc2UgZnVuY3Rpb25zIHRvIHB1dCB0aGUgc2tpbiBpbiBiZXR3ZWVuCitEaXNwbGF5U3RhdGUgKnFlbXVfZ3JhcGhpY19jb25zb2xlX2luaXQodmdhX2h3X3VwZGF0ZV9wdHIgdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2FfaHdfaW52YWxpZGF0ZV9wdHIgaW52YWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X3NjcmVlbl9kdW1wX3B0ciBzY3JlZW5fZHVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X3RleHRfdXBkYXRlX3B0ciB0ZXh0X3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKTsKKyN1bmRlZiBncmFwaGljX2NvbnNvbGVfaW5pdAorI2RlZmluZSBncmFwaGljX2NvbnNvbGVfaW5pdCBxZW11X2dyYXBoaWNfY29uc29sZV9pbml0CisKK3ZvaWQgb3JpZ2luYWxfcWVtdV9jb25zb2xlX3Jlc2l6ZShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworI3VuZGVmIHFlbXVfY29uc29sZV9yZXNpemUKKyNkZWZpbmUgcWVtdV9jb25zb2xlX3Jlc2l6ZSBvcmlnaW5hbF9xZW11X2NvbnNvbGVfcmVzaXplCisjZW5kaWYKKworaW50IG11bHRpdG91Y2hfZW5hYmxlZCA9IDA7CitzdGF0aWMgUUVNVURpc3BsYXlDbG9zZUNhbGxiYWNrICpxZW11X2Rpc3BsYXlfY2xvc2VfY2FsbGJhY2sgPSBOVUxMOworc3RhdGljIHZvaWQgKnFlbXVfZGlzcGxheV9jbG9zZV9jYWxsYmFja19vcGFxdWUgPSBOVUxMOworCit2b2lkIHFlbXVfc2V0X2Rpc3BsYXlfY2xvc2VfaGFuZGxlcihRRU1VRGlzcGxheUNsb3NlQ2FsbGJhY2sgKmNiLCB2b2lkICpvcGFxdWUpCit7CisgICAgcWVtdV9kaXNwbGF5X2Nsb3NlX2NhbGxiYWNrID0gY2I7CisgICAgcWVtdV9kaXNwbGF5X2Nsb3NlX2NhbGxiYWNrX29wYXF1ZSA9IG9wYXF1ZTsKK30KKworaW50IHFlbXVfcnVuX2Rpc3BsYXlfY2xvc2VfaGFuZGxlcih2b2lkKQoreworICAgIGlmIChxZW11X2Rpc3BsYXlfY2xvc2VfY2FsbGJhY2sgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gcWVtdV9kaXNwbGF5X2Nsb3NlX2NhbGxiYWNrKHFlbXVfZGlzcGxheV9jbG9zZV9jYWxsYmFja19vcGFxdWUpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgIHVpbnQ4X3QgZmdjb2w6NDsKKyAgICB1aW50OF90IGJnY29sOjQ7CisgICAgdWludDhfdCBib2xkOjE7CisgICAgdWludDhfdCB1bGluZToxOworICAgIHVpbnQ4X3QgYmxpbms6MTsKKyAgICB1aW50OF90IGludmVyczoxOworICAgIHVpbnQ4X3QgdW52aXNpYmxlOjE7Cit9IFRleHRBdHRyaWJ1dGVzOworCit0eXBlZGVmIHN0cnVjdCBUZXh0Q2VsbCB7CisgICAgdWludDhfdCBjaDsKKyAgICBUZXh0QXR0cmlidXRlcyB0X2F0dHJpYjsKK30gVGV4dENlbGw7CisKKyNkZWZpbmUgTUFYX0VTQ19QQVJBTVMgMworCitlbnVtIFRUWVN0YXRlIHsKKyAgICBUVFlfU1RBVEVfTk9STSwKKyAgICBUVFlfU1RBVEVfRVNDLAorICAgIFRUWV9TVEFURV9DU0ksCit9OworCit0eXBlZGVmIHN0cnVjdCBRRU1VRklGTyB7CisgICAgdWludDhfdCAqYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBpbnQgY291bnQsIHdwdHIsIHJwdHI7Cit9IFFFTVVGSUZPOworCitzdGF0aWMgaW50IHFlbXVfZmlmb193cml0ZShRRU1VRklGTyAqZiwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuMSkKK3sKKyAgICBpbnQgbCwgbGVuOworCisgICAgbCA9IGYtPmJ1Zl9zaXplIC0gZi0+Y291bnQ7CisgICAgaWYgKGxlbjEgPiBsKQorICAgICAgICBsZW4xID0gbDsKKyAgICBsZW4gPSBsZW4xOworICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgIGwgPSBmLT5idWZfc2l6ZSAtIGYtPndwdHI7CisgICAgICAgIGlmIChsID4gbGVuKQorICAgICAgICAgICAgbCA9IGxlbjsKKyAgICAgICAgbWVtY3B5KGYtPmJ1ZiArIGYtPndwdHIsIGJ1ZiwgbCk7CisgICAgICAgIGYtPndwdHIgKz0gbDsKKyAgICAgICAgaWYgKGYtPndwdHIgPj0gZi0+YnVmX3NpemUpCisgICAgICAgICAgICBmLT53cHRyID0gMDsKKyAgICAgICAgYnVmICs9IGw7CisgICAgICAgIGxlbiAtPSBsOworICAgIH0KKyAgICBmLT5jb3VudCArPSBsZW4xOworICAgIHJldHVybiBsZW4xOworfQorCitzdGF0aWMgaW50IHFlbXVfZmlmb19yZWFkKFFFTVVGSUZPICpmLCB1aW50OF90ICpidWYsIGludCBsZW4xKQoreworICAgIGludCBsLCBsZW47CisKKyAgICBpZiAobGVuMSA+IGYtPmNvdW50KQorICAgICAgICBsZW4xID0gZi0+Y291bnQ7CisgICAgbGVuID0gbGVuMTsKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBsID0gZi0+YnVmX3NpemUgLSBmLT5ycHRyOworICAgICAgICBpZiAobCA+IGxlbikKKyAgICAgICAgICAgIGwgPSBsZW47CisgICAgICAgIG1lbWNweShidWYsIGYtPmJ1ZiArIGYtPnJwdHIsIGwpOworICAgICAgICBmLT5ycHRyICs9IGw7CisgICAgICAgIGlmIChmLT5ycHRyID49IGYtPmJ1Zl9zaXplKQorICAgICAgICAgICAgZi0+cnB0ciA9IDA7CisgICAgICAgIGJ1ZiArPSBsOworICAgICAgICBsZW4gLT0gbDsKKyAgICB9CisgICAgZi0+Y291bnQgLT0gbGVuMTsKKyAgICByZXR1cm4gbGVuMTsKK30KKwordHlwZWRlZiBlbnVtIHsKKyAgICBHUkFQSElDX0NPTlNPTEUsCisgICAgVEVYVF9DT05TT0xFLAorICAgIFRFWFRfQ09OU09MRV9GSVhFRF9TSVpFCit9IGNvbnNvbGVfdHlwZV90OworCisvKiA/Pz8gVGhpcyBpcyBtaXMtbmFtZWQuCisgICBJdCBpcyB1c2VkIGZvciBib3RoIHRleHQgYW5kIGdyYXBoaWNhbCBjb25zb2xlcy4gICovCitzdHJ1Y3QgUWVtdUNvbnNvbGUgeworICAgIGNvbnNvbGVfdHlwZV90IGNvbnNvbGVfdHlwZTsKKyAgICBEaXNwbGF5U3RhdGUgKmRzOworICAgIC8qIEdyYXBoaWMgY29uc29sZSBzdGF0ZS4gICovCisgICAgdmdhX2h3X3VwZGF0ZV9wdHIgaHdfdXBkYXRlOworICAgIHZnYV9od19pbnZhbGlkYXRlX3B0ciBod19pbnZhbGlkYXRlOworICAgIHZnYV9od19zY3JlZW5fZHVtcF9wdHIgaHdfc2NyZWVuX2R1bXA7CisgICAgdmdhX2h3X3RleHRfdXBkYXRlX3B0ciBod190ZXh0X3VwZGF0ZTsKKyAgICB2b2lkICpodzsKKworICAgIGludCBnX3dpZHRoLCBnX2hlaWdodDsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgdG90YWxfaGVpZ2h0OworICAgIGludCBiYWNrc2Nyb2xsX2hlaWdodDsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgeF9zYXZlZCwgeV9zYXZlZDsKKyAgICBpbnQgeV9kaXNwbGF5ZWQ7CisgICAgaW50IHlfYmFzZTsKKyAgICBUZXh0QXR0cmlidXRlcyB0X2F0dHJpYl9kZWZhdWx0OyAvKiBkZWZhdWx0IHRleHQgYXR0cmlidXRlcyAqLworICAgIFRleHRBdHRyaWJ1dGVzIHRfYXR0cmliOyAvKiBjdXJyZW50bHkgYWN0aXZlIHRleHQgYXR0cmlidXRlcyAqLworICAgIFRleHRDZWxsICpjZWxsczsKKyAgICBpbnQgdGV4dF94WzJdLCB0ZXh0X3lbMl0sIGN1cnNvcl9pbnZhbGlkYXRlOworICAgIGludCBlY2hvOworCisgICAgaW50IHVwZGF0ZV94MDsKKyAgICBpbnQgdXBkYXRlX3kwOworICAgIGludCB1cGRhdGVfeDE7CisgICAgaW50IHVwZGF0ZV95MTsKKworICAgIGVudW0gVFRZU3RhdGUgc3RhdGU7CisgICAgaW50IGVzY19wYXJhbXNbTUFYX0VTQ19QQVJBTVNdOworICAgIGludCBuYl9lc2NfcGFyYW1zOworCisgICAgQ2hhckRyaXZlclN0YXRlICpjaHI7CisgICAgLyogZmlmbyBmb3Iga2V5IHByZXNzZWQgKi8KKyAgICBRRU1VRklGTyBvdXRfZmlmbzsKKyAgICB1aW50OF90IG91dF9maWZvX2J1ZlsxNl07CisgICAgUUVNVVRpbWVyICprYmRfdGltZXI7Cit9OworCitzdGF0aWMgRGlzcGxheVN0YXRlICpkaXNwbGF5X3N0YXRlOworc3RhdGljIFFlbXVDb25zb2xlICphY3RpdmVfY29uc29sZTsKK3N0YXRpYyBRZW11Q29uc29sZSAqY29uc29sZXNbTUFYX0NPTlNPTEVTXTsKK3N0YXRpYyBpbnQgbmJfY29uc29sZXMgPSAwOworCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKy8qIEdyYXBoaWMgY29uc29sZSB3aWR0aCwgaGVpZ2h0IGFuZCBiaXRzIHBlciBwaXhlbC4KKyAqIFRoZXNlIGRlZmF1bHQgdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlICItYW5kcm9pZC1ndWkiIG9wdGlvbi4KKyAqLworaW50IGFuZHJvaWRfZGlzcGxheV93aWR0aCAgID0gNjQwOworaW50IGFuZHJvaWRfZGlzcGxheV9oZWlnaHQgID0gNDgwOworaW50IGFuZHJvaWRfZGlzcGxheV9icHAgICAgID0gMzI7CisjZW5kaWYKKwordm9pZCB2Z2FfaHdfdXBkYXRlKHZvaWQpCit7CisgICAgaWYgKGFjdGl2ZV9jb25zb2xlICYmIGFjdGl2ZV9jb25zb2xlLT5od191cGRhdGUpCisgICAgICAgIGFjdGl2ZV9jb25zb2xlLT5od191cGRhdGUoYWN0aXZlX2NvbnNvbGUtPmh3KTsKK30KKwordm9pZCB2Z2FfaHdfaW52YWxpZGF0ZSh2b2lkKQoreworICAgIGlmIChhY3RpdmVfY29uc29sZSAmJiBhY3RpdmVfY29uc29sZS0+aHdfaW52YWxpZGF0ZSkKKyAgICAgICAgYWN0aXZlX2NvbnNvbGUtPmh3X2ludmFsaWRhdGUoYWN0aXZlX2NvbnNvbGUtPmh3KTsKK30KKwordm9pZCB2Z2FfaHdfc2NyZWVuX2R1bXAoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgUWVtdUNvbnNvbGUgKnByZXZpb3VzX2FjdGl2ZV9jb25zb2xlOworCisgICAgcHJldmlvdXNfYWN0aXZlX2NvbnNvbGUgPSBhY3RpdmVfY29uc29sZTsKKyAgICBhY3RpdmVfY29uc29sZSA9IGNvbnNvbGVzWzBdOworICAgIC8qIFRoZXJlIGlzIGN1cnJlbnRseSBubyB3YXkgb2Ygc3BlY2lmeWluZyB3aGljaCBzY3JlZW4gd2Ugd2FudCB0byBkdW1wLAorICAgICAgIHNvIGFsd2F5cyBkdW1wIHRoZSBmaXJzdCBvbmUuICAqLworICAgIGlmIChjb25zb2xlc1swXS0+aHdfc2NyZWVuX2R1bXApCisgICAgICAgIGNvbnNvbGVzWzBdLT5od19zY3JlZW5fZHVtcChjb25zb2xlc1swXS0+aHcsIGZpbGVuYW1lKTsKKyAgICBhY3RpdmVfY29uc29sZSA9IHByZXZpb3VzX2FjdGl2ZV9jb25zb2xlOworfQorCit2b2lkIHZnYV9od190ZXh0X3VwZGF0ZShjb25zb2xlX2NoX3QgKmNoYXJkYXRhKQoreworICAgIGlmIChhY3RpdmVfY29uc29sZSAmJiBhY3RpdmVfY29uc29sZS0+aHdfdGV4dF91cGRhdGUpCisgICAgICAgIGFjdGl2ZV9jb25zb2xlLT5od190ZXh0X3VwZGF0ZShhY3RpdmVfY29uc29sZS0+aHcsIGNoYXJkYXRhKTsKK30KKworLyogY29udmVydCBhIFJHQkEgY29sb3IgdG8gYSBjb2xvciBpbmRleCB1c2FibGUgaW4gZ3JhcGhpYyBwcmltaXRpdmVzICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZnYV9nZXRfY29sb3IoRGlzcGxheVN0YXRlICpkcywgdW5zaWduZWQgaW50IHJnYmEpCit7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGIsIGNvbG9yOworCisgICAgc3dpdGNoKGRzX2dldF9iaXRzX3Blcl9waXhlbChkcykpIHsKKyNpZiAwCisgICAgY2FzZSA4OgorICAgICAgICByID0gKHJnYmEgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgZyA9IChyZ2JhID4+IDgpICYgMHhmZjsKKyAgICAgICAgYiA9IChyZ2JhKSAmIDB4ZmY7CisgICAgICAgIGNvbG9yID0gKHJnYl90b19pbmRleFtyXSAqIDYgKiA2KSArCisgICAgICAgICAgICAocmdiX3RvX2luZGV4W2ddICogNikgKworICAgICAgICAgICAgKHJnYl90b19pbmRleFtiXSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSAxNToKKyAgICAgICAgciA9IChyZ2JhID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGcgPSAocmdiYSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGIgPSAocmdiYSkgJiAweGZmOworICAgICAgICBjb2xvciA9ICgociA+PiAzKSA8PCAxMCkgfCAoKGcgPj4gMykgPDwgNSkgfCAoYiA+PiAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgciA9IChyZ2JhID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGcgPSAocmdiYSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGIgPSAocmdiYSkgJiAweGZmOworICAgICAgICBjb2xvciA9ICgociA+PiAzKSA8PCAxMSkgfCAoKGcgPj4gMikgPDwgNSkgfCAoYiA+PiAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICBkZWZhdWx0OgorICAgICAgICBjb2xvciA9IHJnYmE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY29sb3I7Cit9CisKK3ZvaWQgdmdhX2ZpbGxfcmVjdChEaXNwbGF5U3RhdGUgKmRzLCBpbnQgcG9zeCwgaW50IHBvc3ksCisgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdWludDMyX3QgY29sb3IpCit7CisgICAgdWludDhfdCAqZCwgKmQxOworICAgIGludCB4LCB5LCBicHA7CisKKyAgICBicHAgPSAoZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKGRzKSArIDcpID4+IDM7CisgICAgZDEgPSBkc19nZXRfZGF0YShkcykgKworICAgICAgICBkc19nZXRfbGluZXNpemUoZHMpICogcG9zeSArIGJwcCAqIHBvc3g7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGQgPSBkMTsKKyAgICAgICAgc3dpdGNoKGJwcCkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICooKHVpbnQ4X3QgKilkKSA9IGNvbG9yOworICAgICAgICAgICAgICAgIGQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICooKHVpbnQxNl90ICopZCkgPSBjb2xvcjsKKyAgICAgICAgICAgICAgICBkICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKWQpID0gY29sb3I7CisgICAgICAgICAgICAgICAgZCArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZDEgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICB9Cit9CisKKy8qIGNvcHkgZnJvbSAoeHMsIHlzKSB0byAoeGQsIHlkKSBhIHJlY3RhbmdsZSBvZiBzaXplICh3LCBoKSAqLworc3RhdGljIHZvaWQgdmdhX2JpdGJsdChEaXNwbGF5U3RhdGUgKmRzLCBpbnQgeHMsIGludCB5cywgaW50IHhkLCBpbnQgeWQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzOworICAgIHVpbnQ4X3QgKmQ7CisgICAgaW50IHdiLCB5LCBicHA7CisKKyAgICBicHAgPSAoZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKGRzKSArIDcpID4+IDM7CisgICAgd2IgPSB3ICogYnBwOworICAgIGlmICh5ZCA8PSB5cykgeworICAgICAgICBzID0gZHNfZ2V0X2RhdGEoZHMpICsKKyAgICAgICAgICAgIGRzX2dldF9saW5lc2l6ZShkcykgKiB5cyArIGJwcCAqIHhzOworICAgICAgICBkID0gZHNfZ2V0X2RhdGEoZHMpICsKKyAgICAgICAgICAgIGRzX2dldF9saW5lc2l6ZShkcykgKiB5ZCArIGJwcCAqIHhkOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBtZW1tb3ZlKGQsIHMsIHdiKTsKKyAgICAgICAgICAgIGQgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICAgICAgICAgIHMgKz0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSBkc19nZXRfZGF0YShkcykgKworICAgICAgICAgICAgZHNfZ2V0X2xpbmVzaXplKGRzKSAqICh5cyArIGggLSAxKSArIGJwcCAqIHhzOworICAgICAgICBkID0gZHNfZ2V0X2RhdGEoZHMpICsKKyAgICAgICAgICAgIGRzX2dldF9saW5lc2l6ZShkcykgKiAoeWQgKyBoIC0gMSkgKyBicHAgKiB4ZDsKKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBtZW1tb3ZlKGQsIHMsIHdiKTsKKyAgICAgICAgICAgIGQgLT0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICAgICAgICAgIHMgLT0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYmFzaWMgY2hhciBkaXNwbGF5ICovCisKKyNkZWZpbmUgRk9OVF9IRUlHSFQgMTYKKyNkZWZpbmUgRk9OVF9XSURUSCA4CisKKyNpbmNsdWRlICJ2Z2Fmb250LmgiCisKKyNkZWZpbmUgY2Jzd2FwXzMyKF9feCkgXAorKCh1aW50MzJfdCkoIFwKKyAgICAgICAgKCgodWludDMyX3QpKF9feCkgJiAodWludDMyX3QpMHgwMDAwMDBmZlVMKSA8PCAyNCkgfCBcCisgICAgICAgICgoKHVpbnQzMl90KShfX3gpICYgKHVpbnQzMl90KTB4MDAwMGZmMDBVTCkgPDwgIDgpIHwgXAorICAgICAgICAoKCh1aW50MzJfdCkoX194KSAmICh1aW50MzJfdCkweDAwZmYwMDAwVUwpID4+ICA4KSB8IFwKKyAgICAgICAgKCgodWludDMyX3QpKF9feCkgJiAodWludDMyX3QpMHhmZjAwMDAwMFVMKSA+PiAyNCkgKSkKKworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisjZGVmaW5lIFBBVCh4KSB4CisjZWxzZQorI2RlZmluZSBQQVQoeCkgY2Jzd2FwXzMyKHgpCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGRtYXNrMTZbMTZdID0geworICAgIFBBVCgweDAwMDAwMDAwKSwKKyAgICBQQVQoMHgwMDAwMDBmZiksCisgICAgUEFUKDB4MDAwMGZmMDApLAorICAgIFBBVCgweDAwMDBmZmZmKSwKKyAgICBQQVQoMHgwMGZmMDAwMCksCisgICAgUEFUKDB4MDBmZjAwZmYpLAorICAgIFBBVCgweDAwZmZmZjAwKSwKKyAgICBQQVQoMHgwMGZmZmZmZiksCisgICAgUEFUKDB4ZmYwMDAwMDApLAorICAgIFBBVCgweGZmMDAwMGZmKSwKKyAgICBQQVQoMHhmZjAwZmYwMCksCisgICAgUEFUKDB4ZmYwMGZmZmYpLAorICAgIFBBVCgweGZmZmYwMDAwKSwKKyAgICBQQVQoMHhmZmZmMDBmZiksCisgICAgUEFUKDB4ZmZmZmZmMDApLAorICAgIFBBVCgweGZmZmZmZmZmKSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBkbWFzazRbNF0gPSB7CisgICAgUEFUKDB4MDAwMDAwMDApLAorICAgIFBBVCgweDAwMDBmZmZmKSwKKyAgICBQQVQoMHhmZmZmMDAwMCksCisgICAgUEFUKDB4ZmZmZmZmZmYpLAorfTsKKworc3RhdGljIHVpbnQzMl90IGNvbG9yX3RhYmxlWzJdWzhdOworCitlbnVtIGNvbG9yX25hbWVzIHsKKyAgICBDT0xPUl9CTEFDSyAgID0gMCwKKyAgICBDT0xPUl9SRUQgICAgID0gMSwKKyAgICBDT0xPUl9HUkVFTiAgID0gMiwKKyAgICBDT0xPUl9ZRUxMT1cgID0gMywKKyAgICBDT0xPUl9CTFVFICAgID0gNCwKKyAgICBDT0xPUl9NQUdFTlRBID0gNSwKKyAgICBDT0xPUl9DWUFOICAgID0gNiwKKyAgICBDT0xPUl9XSElURSAgID0gNworfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGNvbG9yX3RhYmxlX3JnYlsyXVs4XSA9IHsKKyAgICB7ICAgLyogZGFyayAqLworICAgICAgICBRRU1VX1JHQigweDAwLCAweDAwLCAweDAwKSwgIC8qIGJsYWNrICovCisgICAgICAgIFFFTVVfUkdCKDB4YWEsIDB4MDAsIDB4MDApLCAgLyogcmVkICovCisgICAgICAgIFFFTVVfUkdCKDB4MDAsIDB4YWEsIDB4MDApLCAgLyogZ3JlZW4gKi8KKyAgICAgICAgUUVNVV9SR0IoMHhhYSwgMHhhYSwgMHgwMCksICAvKiB5ZWxsb3cgKi8KKyAgICAgICAgUUVNVV9SR0IoMHgwMCwgMHgwMCwgMHhhYSksICAvKiBibHVlICovCisgICAgICAgIFFFTVVfUkdCKDB4YWEsIDB4MDAsIDB4YWEpLCAgLyogbWFnZW50YSAqLworICAgICAgICBRRU1VX1JHQigweDAwLCAweGFhLCAweGFhKSwgIC8qIGN5YW4gKi8KKyAgICAgICAgUUVNVV9SR0IoMHhhYSwgMHhhYSwgMHhhYSksICAvKiB3aGl0ZSAqLworICAgIH0sCisgICAgeyAgIC8qIGJyaWdodCAqLworICAgICAgICBRRU1VX1JHQigweDAwLCAweDAwLCAweDAwKSwgIC8qIGJsYWNrICovCisgICAgICAgIFFFTVVfUkdCKDB4ZmYsIDB4MDAsIDB4MDApLCAgLyogcmVkICovCisgICAgICAgIFFFTVVfUkdCKDB4MDAsIDB4ZmYsIDB4MDApLCAgLyogZ3JlZW4gKi8KKyAgICAgICAgUUVNVV9SR0IoMHhmZiwgMHhmZiwgMHgwMCksICAvKiB5ZWxsb3cgKi8KKyAgICAgICAgUUVNVV9SR0IoMHgwMCwgMHgwMCwgMHhmZiksICAvKiBibHVlICovCisgICAgICAgIFFFTVVfUkdCKDB4ZmYsIDB4MDAsIDB4ZmYpLCAgLyogbWFnZW50YSAqLworICAgICAgICBRRU1VX1JHQigweDAwLCAweGZmLCAweGZmKSwgIC8qIGN5YW4gKi8KKyAgICAgICAgUUVNVV9SR0IoMHhmZiwgMHhmZiwgMHhmZiksICAvKiB3aGl0ZSAqLworICAgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvbF9leHBhbmQoRGlzcGxheVN0YXRlICpkcywgdW5zaWduZWQgaW50IGNvbCkKK3sKKyAgICBzd2l0Y2goZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKGRzKSkgeworICAgIGNhc2UgODoKKyAgICAgICAgY29sIHw9IGNvbCA8PCA4OworICAgICAgICBjb2wgfD0gY29sIDw8IDE2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE1OgorICAgIGNhc2UgMTY6CisgICAgICAgIGNvbCB8PSBjb2wgPDwgMTY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBjb2w7Cit9CisjaWZkZWYgREVCVUdfQ09OU09MRQorc3RhdGljIHZvaWQgY29uc29sZV9wcmludF90ZXh0X2F0dHJpYnV0ZXMoVGV4dEF0dHJpYnV0ZXMgKnRfYXR0cmliLCBjaGFyIGNoKQoreworICAgIGlmICh0X2F0dHJpYi0+Ym9sZCkgeworICAgICAgICBwcmludGYoImIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAiKTsKKyAgICB9CisgICAgaWYgKHRfYXR0cmliLT51bGluZSkgeworICAgICAgICBwcmludGYoInUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAiKTsKKyAgICB9CisgICAgaWYgKHRfYXR0cmliLT5ibGluaykgeworICAgICAgICBwcmludGYoImwiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAiKTsKKyAgICB9CisgICAgaWYgKHRfYXR0cmliLT5pbnZlcnMpIHsKKyAgICAgICAgcHJpbnRmKCJpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgIik7CisgICAgfQorICAgIGlmICh0X2F0dHJpYi0+dW52aXNpYmxlKSB7CisgICAgICAgIHByaW50ZigibiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiICIpOworICAgIH0KKworICAgIHByaW50ZigiIGZnOiAlZCBiZzogJWQgY2g6JyUyWCcgJyVjJ1xuIiwgdF9hdHRyaWItPmZnY29sLCB0X2F0dHJpYi0+Ymdjb2wsIGNoLCBjaCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgdmdhX3B1dGNoYXJ4eShEaXNwbGF5U3RhdGUgKmRzLCBpbnQgeCwgaW50IHksIGludCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEF0dHJpYnV0ZXMgKnRfYXR0cmliKQoreworICAgIHVpbnQ4X3QgKmQ7CisgICAgY29uc3QgdWludDhfdCAqZm9udF9wdHI7CisgICAgdW5zaWduZWQgaW50IGZvbnRfZGF0YSwgbGluZXNpemUsIHhvcmNvbCwgYnBwOworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCBmZ2NvbCwgYmdjb2w7CisKKyNpZmRlZiBERUJVR19DT05TT0xFCisgICAgcHJpbnRmKCJ4OiAlMmkgeTogJTJpIiwgeCwgeSk7CisgICAgY29uc29sZV9wcmludF90ZXh0X2F0dHJpYnV0ZXModF9hdHRyaWIsIGNoKTsKKyNlbmRpZgorCisgICAgaWYgKHRfYXR0cmliLT5pbnZlcnMpIHsKKyAgICAgICAgYmdjb2wgPSBjb2xvcl90YWJsZVt0X2F0dHJpYi0+Ym9sZF1bdF9hdHRyaWItPmZnY29sXTsKKyAgICAgICAgZmdjb2wgPSBjb2xvcl90YWJsZVt0X2F0dHJpYi0+Ym9sZF1bdF9hdHRyaWItPmJnY29sXTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZ2NvbCA9IGNvbG9yX3RhYmxlW3RfYXR0cmliLT5ib2xkXVt0X2F0dHJpYi0+Zmdjb2xdOworICAgICAgICBiZ2NvbCA9IGNvbG9yX3RhYmxlW3RfYXR0cmliLT5ib2xkXVt0X2F0dHJpYi0+Ymdjb2xdOworICAgIH0KKworICAgIGJwcCA9IChkc19nZXRfYml0c19wZXJfcGl4ZWwoZHMpICsgNykgPj4gMzsKKyAgICBkID0gZHNfZ2V0X2RhdGEoZHMpICsKKyAgICAgICAgZHNfZ2V0X2xpbmVzaXplKGRzKSAqIHkgKiBGT05UX0hFSUdIVCArIGJwcCAqIHggKiBGT05UX1dJRFRIOworICAgIGxpbmVzaXplID0gZHNfZ2V0X2xpbmVzaXplKGRzKTsKKyAgICBmb250X3B0ciA9IHZnYWZvbnQxNiArIEZPTlRfSEVJR0hUICogY2g7CisgICAgeG9yY29sID0gYmdjb2wgXiBmZ2NvbDsKKyAgICBzd2l0Y2goZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKGRzKSkgeworICAgIGNhc2UgODoKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgRk9OVF9IRUlHSFQ7IGkrKykgeworICAgICAgICAgICAgZm9udF9kYXRhID0gKmZvbnRfcHRyKys7CisgICAgICAgICAgICBpZiAodF9hdHRyaWItPnVsaW5lCisgICAgICAgICAgICAgICAgJiYgKChpID09IEZPTlRfSEVJR0hUIC0gMikgfHwgKGkgPT0gRk9OVF9IRUlHSFQgLSAzKSkpIHsKKyAgICAgICAgICAgICAgICBmb250X2RhdGEgPSAweEZGRkY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbMF0gPSAoZG1hc2sxNlsoZm9udF9kYXRhID4+IDQpXSAmIHhvcmNvbCkgXiBiZ2NvbDsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkKVsxXSA9IChkbWFzazE2Wyhmb250X2RhdGEgPj4gMCkgJiAweGZdICYgeG9yY29sKSBeIGJnY29sOworICAgICAgICAgICAgZCArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMTU6CisgICAgICAgIGZvcihpID0gMDsgaSA8IEZPTlRfSEVJR0hUOyBpKyspIHsKKyAgICAgICAgICAgIGZvbnRfZGF0YSA9ICpmb250X3B0cisrOworICAgICAgICAgICAgaWYgKHRfYXR0cmliLT51bGluZQorICAgICAgICAgICAgICAgICYmICgoaSA9PSBGT05UX0hFSUdIVCAtIDIpIHx8IChpID09IEZPTlRfSEVJR0hUIC0gMykpKSB7CisgICAgICAgICAgICAgICAgZm9udF9kYXRhID0gMHhGRkZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCh1aW50MzJfdCAqKWQpWzBdID0gKGRtYXNrNFsoZm9udF9kYXRhID4+IDYpXSAmIHhvcmNvbCkgXiBiZ2NvbDsKKyAgICAgICAgICAgICgodWludDMyX3QgKilkKVsxXSA9IChkbWFzazRbKGZvbnRfZGF0YSA+PiA0KSAmIDNdICYgeG9yY29sKSBeIGJnY29sOworICAgICAgICAgICAgKCh1aW50MzJfdCAqKWQpWzJdID0gKGRtYXNrNFsoZm9udF9kYXRhID4+IDIpICYgM10gJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbM10gPSAoZG1hc2s0Wyhmb250X2RhdGEgPj4gMCkgJiAzXSAmIHhvcmNvbCkgXiBiZ2NvbDsKKyAgICAgICAgICAgIGQgKz0gbGluZXNpemU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgRk9OVF9IRUlHSFQ7IGkrKykgeworICAgICAgICAgICAgZm9udF9kYXRhID0gKmZvbnRfcHRyKys7CisgICAgICAgICAgICBpZiAodF9hdHRyaWItPnVsaW5lICYmICgoaSA9PSBGT05UX0hFSUdIVCAtIDIpIHx8IChpID09IEZPTlRfSEVJR0hUIC0gMykpKSB7CisgICAgICAgICAgICAgICAgZm9udF9kYXRhID0gMHhGRkZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCh1aW50MzJfdCAqKWQpWzBdID0gKC0oKGZvbnRfZGF0YSA+PiA3KSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbMV0gPSAoLSgoZm9udF9kYXRhID4+IDYpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbMl0gPSAoLSgoZm9udF9kYXRhID4+IDUpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbM10gPSAoLSgoZm9udF9kYXRhID4+IDQpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbNF0gPSAoLSgoZm9udF9kYXRhID4+IDMpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbNV0gPSAoLSgoZm9udF9kYXRhID4+IDIpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbNl0gPSAoLSgoZm9udF9kYXRhID4+IDEpICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICAoKHVpbnQzMl90ICopZClbN10gPSAoLSgoZm9udF9kYXRhID4+IDApICYgMSkgJiB4b3Jjb2wpIF4gYmdjb2w7CisgICAgICAgICAgICBkICs9IGxpbmVzaXplOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGV4dF9jb25zb2xlX3Jlc2l6ZShRZW11Q29uc29sZSAqcykKK3sKKyAgICBUZXh0Q2VsbCAqY2VsbHMsICpjLCAqYzE7CisgICAgaW50IHcxLCB4LCB5LCBsYXN0X3dpZHRoOworCisgICAgbGFzdF93aWR0aCA9IHMtPndpZHRoOworICAgIHMtPndpZHRoID0gcy0+Z193aWR0aCAvIEZPTlRfV0lEVEg7CisgICAgcy0+aGVpZ2h0ID0gcy0+Z19oZWlnaHQgLyBGT05UX0hFSUdIVDsKKworICAgIHcxID0gbGFzdF93aWR0aDsKKyAgICBpZiAocy0+d2lkdGggPCB3MSkKKyAgICAgICAgdzEgPSBzLT53aWR0aDsKKworICAgIGNlbGxzID0gZ19tYWxsb2Mocy0+d2lkdGggKiBzLT50b3RhbF9oZWlnaHQgKiBzaXplb2YoVGV4dENlbGwpKTsKKyAgICBmb3IoeSA9IDA7IHkgPCBzLT50b3RhbF9oZWlnaHQ7IHkrKykgeworICAgICAgICBjID0gJmNlbGxzW3kgKiBzLT53aWR0aF07CisgICAgICAgIGlmICh3MSA+IDApIHsKKyAgICAgICAgICAgIGMxID0gJnMtPmNlbGxzW3kgKiBsYXN0X3dpZHRoXTsKKyAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHcxOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqYysrID0gKmMxKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yKHggPSB3MTsgeCA8IHMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGMtPmNoID0gJyAnOworICAgICAgICAgICAgYy0+dF9hdHRyaWIgPSBzLT50X2F0dHJpYl9kZWZhdWx0OworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgfQorICAgIGdfZnJlZShzLT5jZWxscyk7CisgICAgcy0+Y2VsbHMgPSBjZWxsczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRleHRfdXBkYXRlX3h5KFFlbXVDb25zb2xlICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgcy0+dGV4dF94WzBdID0gTUlOKHMtPnRleHRfeFswXSwgeCk7CisgICAgcy0+dGV4dF94WzFdID0gTUFYKHMtPnRleHRfeFsxXSwgeCk7CisgICAgcy0+dGV4dF95WzBdID0gTUlOKHMtPnRleHRfeVswXSwgeSk7CisgICAgcy0+dGV4dF95WzFdID0gTUFYKHMtPnRleHRfeVsxXSwgeSk7Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfeHkoUWVtdUNvbnNvbGUgKnMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZiAocy0+dXBkYXRlX3gwID4geCAqIEZPTlRfV0lEVEgpCisgICAgICAgIHMtPnVwZGF0ZV94MCA9IHggKiBGT05UX1dJRFRIOworICAgIGlmIChzLT51cGRhdGVfeTAgPiB5ICogRk9OVF9IRUlHSFQpCisgICAgICAgIHMtPnVwZGF0ZV95MCA9IHkgKiBGT05UX0hFSUdIVDsKKyAgICBpZiAocy0+dXBkYXRlX3gxIDwgKHggKyAxKSAqIEZPTlRfV0lEVEgpCisgICAgICAgIHMtPnVwZGF0ZV94MSA9ICh4ICsgMSkgKiBGT05UX1dJRFRIOworICAgIGlmIChzLT51cGRhdGVfeTEgPCAoeSArIDEpICogRk9OVF9IRUlHSFQpCisgICAgICAgIHMtPnVwZGF0ZV95MSA9ICh5ICsgMSkgKiBGT05UX0hFSUdIVDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3h5KFFlbXVDb25zb2xlICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgVGV4dENlbGwgKmM7CisgICAgaW50IHkxLCB5MjsKKworICAgIGlmIChzID09IGFjdGl2ZV9jb25zb2xlKSB7CisgICAgICAgIGlmICghZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKHMtPmRzKSkgeworICAgICAgICAgICAgdGV4dF91cGRhdGVfeHkocywgeCwgeSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB5MSA9IChzLT55X2Jhc2UgKyB5KSAlIHMtPnRvdGFsX2hlaWdodDsKKyAgICAgICAgeTIgPSB5MSAtIHMtPnlfZGlzcGxheWVkOworICAgICAgICBpZiAoeTIgPCAwKQorICAgICAgICAgICAgeTIgKz0gcy0+dG90YWxfaGVpZ2h0OworICAgICAgICBpZiAoeTIgPCBzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIGMgPSAmcy0+Y2VsbHNbeTEgKiBzLT53aWR0aCArIHhdOworICAgICAgICAgICAgdmdhX3B1dGNoYXJ4eShzLT5kcywgeCwgeTIsIGMtPmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmKGMtPnRfYXR0cmliKSk7CisgICAgICAgICAgICBpbnZhbGlkYXRlX3h5KHMsIHgsIHkyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY29uc29sZV9zaG93X2N1cnNvcihRZW11Q29uc29sZSAqcywgaW50IHNob3cpCit7CisgICAgVGV4dENlbGwgKmM7CisgICAgaW50IHksIHkxOworCisgICAgaWYgKHMgPT0gYWN0aXZlX2NvbnNvbGUpIHsKKyAgICAgICAgaW50IHggPSBzLT54OworCisgICAgICAgIGlmICghZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKHMtPmRzKSkgeworICAgICAgICAgICAgcy0+Y3Vyc29yX2ludmFsaWRhdGUgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHggPj0gcy0+d2lkdGgpIHsKKyAgICAgICAgICAgIHggPSBzLT53aWR0aCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgeTEgPSAocy0+eV9iYXNlICsgcy0+eSkgJSBzLT50b3RhbF9oZWlnaHQ7CisgICAgICAgIHkgPSB5MSAtIHMtPnlfZGlzcGxheWVkOworICAgICAgICBpZiAoeSA8IDApCisgICAgICAgICAgICB5ICs9IHMtPnRvdGFsX2hlaWdodDsKKyAgICAgICAgaWYgKHkgPCBzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIGMgPSAmcy0+Y2VsbHNbeTEgKiBzLT53aWR0aCArIHhdOworICAgICAgICAgICAgaWYgKHNob3cpIHsKKyAgICAgICAgICAgICAgICBUZXh0QXR0cmlidXRlcyB0X2F0dHJpYiA9IHMtPnRfYXR0cmliX2RlZmF1bHQ7CisgICAgICAgICAgICAgICAgdF9hdHRyaWIuaW52ZXJzID0gISh0X2F0dHJpYi5pbnZlcnMpOyAvKiBpbnZlcnQgZmcgYW5kIGJnICovCisgICAgICAgICAgICAgICAgdmdhX3B1dGNoYXJ4eShzLT5kcywgeCwgeSwgYy0+Y2gsICZ0X2F0dHJpYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZnYV9wdXRjaGFyeHkocy0+ZHMsIHgsIHksIGMtPmNoLCAmKGMtPnRfYXR0cmliKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnZhbGlkYXRlX3h5KHMsIHgsIHkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb25zb2xlX3JlZnJlc2goUWVtdUNvbnNvbGUgKnMpCit7CisgICAgVGV4dENlbGwgKmM7CisgICAgaW50IHgsIHksIHkxOworCisgICAgaWYgKHMgIT0gYWN0aXZlX2NvbnNvbGUpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIWRzX2dldF9iaXRzX3Blcl9waXhlbChzLT5kcykpIHsKKyAgICAgICAgcy0+dGV4dF94WzBdID0gMDsKKyAgICAgICAgcy0+dGV4dF95WzBdID0gMDsKKyAgICAgICAgcy0+dGV4dF94WzFdID0gcy0+d2lkdGggLSAxOworICAgICAgICBzLT50ZXh0X3lbMV0gPSBzLT5oZWlnaHQgLSAxOworICAgICAgICBzLT5jdXJzb3JfaW52YWxpZGF0ZSA9IDE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2Z2FfZmlsbF9yZWN0KHMtPmRzLCAwLCAwLCBkc19nZXRfd2lkdGgocy0+ZHMpLCBkc19nZXRfaGVpZ2h0KHMtPmRzKSwKKyAgICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlWzBdW0NPTE9SX0JMQUNLXSk7CisgICAgeTEgPSBzLT55X2Rpc3BsYXllZDsKKyAgICBmb3IoeSA9IDA7IHkgPCBzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICBjID0gcy0+Y2VsbHMgKyB5MSAqIHMtPndpZHRoOworICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICB2Z2FfcHV0Y2hhcnh5KHMtPmRzLCB4LCB5LCBjLT5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJihjLT50X2F0dHJpYikpOworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIGlmICgrK3kxID09IHMtPnRvdGFsX2hlaWdodCkKKyAgICAgICAgICAgIHkxID0gMDsKKyAgICB9CisgICAgY29uc29sZV9zaG93X2N1cnNvcihzLCAxKTsKKyAgICBkcHlfdXBkYXRlKHMtPmRzLCAwLCAwLCBkc19nZXRfd2lkdGgocy0+ZHMpLCBkc19nZXRfaGVpZ2h0KHMtPmRzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfc2Nyb2xsKGludCB5ZGVsdGEpCit7CisgICAgUWVtdUNvbnNvbGUgKnM7CisgICAgaW50IGksIHkxOworCisgICAgcyA9IGFjdGl2ZV9jb25zb2xlOworICAgIGlmICghcyB8fCAocy0+Y29uc29sZV90eXBlID09IEdSQVBISUNfQ09OU09MRSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh5ZGVsdGEgPiAwKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHlkZWx0YTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+eV9kaXNwbGF5ZWQgPT0gcy0+eV9iYXNlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCsrcy0+eV9kaXNwbGF5ZWQgPT0gcy0+dG90YWxfaGVpZ2h0KQorICAgICAgICAgICAgICAgIHMtPnlfZGlzcGxheWVkID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHlkZWx0YSA9IC15ZGVsdGE7CisgICAgICAgIGkgPSBzLT5iYWNrc2Nyb2xsX2hlaWdodDsKKyAgICAgICAgaWYgKGkgPiBzLT50b3RhbF9oZWlnaHQgLSBzLT5oZWlnaHQpCisgICAgICAgICAgICBpID0gcy0+dG90YWxfaGVpZ2h0IC0gcy0+aGVpZ2h0OworICAgICAgICB5MSA9IHMtPnlfYmFzZSAtIGk7CisgICAgICAgIGlmICh5MSA8IDApCisgICAgICAgICAgICB5MSArPSBzLT50b3RhbF9oZWlnaHQ7CisgICAgICAgIGZvcihpID0gMDsgaSA8IHlkZWx0YTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+eV9kaXNwbGF5ZWQgPT0geTEpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoLS1zLT55X2Rpc3BsYXllZCA8IDApCisgICAgICAgICAgICAgICAgcy0+eV9kaXNwbGF5ZWQgPSBzLT50b3RhbF9oZWlnaHQgLSAxOworICAgICAgICB9CisgICAgfQorICAgIGNvbnNvbGVfcmVmcmVzaChzKTsKK30KKworc3RhdGljIHZvaWQgY29uc29sZV9wdXRfbGYoUWVtdUNvbnNvbGUgKnMpCit7CisgICAgVGV4dENlbGwgKmM7CisgICAgaW50IHgsIHkxOworCisgICAgcy0+eSsrOworICAgIGlmIChzLT55ID49IHMtPmhlaWdodCkgeworICAgICAgICBzLT55ID0gcy0+aGVpZ2h0IC0gMTsKKworICAgICAgICBpZiAocy0+eV9kaXNwbGF5ZWQgPT0gcy0+eV9iYXNlKSB7CisgICAgICAgICAgICBpZiAoKytzLT55X2Rpc3BsYXllZCA9PSBzLT50b3RhbF9oZWlnaHQpCisgICAgICAgICAgICAgICAgcy0+eV9kaXNwbGF5ZWQgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgrK3MtPnlfYmFzZSA9PSBzLT50b3RhbF9oZWlnaHQpCisgICAgICAgICAgICBzLT55X2Jhc2UgPSAwOworICAgICAgICBpZiAocy0+YmFja3Njcm9sbF9oZWlnaHQgPCBzLT50b3RhbF9oZWlnaHQpCisgICAgICAgICAgICBzLT5iYWNrc2Nyb2xsX2hlaWdodCsrOworICAgICAgICB5MSA9IChzLT55X2Jhc2UgKyBzLT5oZWlnaHQgLSAxKSAlIHMtPnRvdGFsX2hlaWdodDsKKyAgICAgICAgYyA9ICZzLT5jZWxsc1t5MSAqIHMtPndpZHRoXTsKKyAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgYy0+Y2ggPSAnICc7CisgICAgICAgICAgICBjLT50X2F0dHJpYiA9IHMtPnRfYXR0cmliX2RlZmF1bHQ7CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMgPT0gYWN0aXZlX2NvbnNvbGUgJiYgcy0+eV9kaXNwbGF5ZWQgPT0gcy0+eV9iYXNlKSB7CisgICAgICAgICAgICBpZiAoIWRzX2dldF9iaXRzX3Blcl9waXhlbChzLT5kcykpIHsKKyAgICAgICAgICAgICAgICBzLT50ZXh0X3hbMF0gPSAwOworICAgICAgICAgICAgICAgIHMtPnRleHRfeVswXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+dGV4dF94WzFdID0gcy0+d2lkdGggLSAxOworICAgICAgICAgICAgICAgIHMtPnRleHRfeVsxXSA9IHMtPmhlaWdodCAtIDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2Z2FfYml0Ymx0KHMtPmRzLCAwLCBGT05UX0hFSUdIVCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGggKiBGT05UX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAocy0+aGVpZ2h0IC0gMSkgKiBGT05UX0hFSUdIVCk7CisgICAgICAgICAgICB2Z2FfZmlsbF9yZWN0KHMtPmRzLCAwLCAocy0+aGVpZ2h0IC0gMSkgKiBGT05UX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGggKiBGT05UX1dJRFRILCBGT05UX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfdGFibGVbMF1bcy0+dF9hdHRyaWJfZGVmYXVsdC5iZ2NvbF0pOworICAgICAgICAgICAgcy0+dXBkYXRlX3gwID0gMDsKKyAgICAgICAgICAgIHMtPnVwZGF0ZV95MCA9IDA7CisgICAgICAgICAgICBzLT51cGRhdGVfeDEgPSBzLT53aWR0aCAqIEZPTlRfV0lEVEg7CisgICAgICAgICAgICBzLT51cGRhdGVfeTEgPSBzLT5oZWlnaHQgKiBGT05UX0hFSUdIVDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogU2V0IGNvbnNvbGUgYXR0cmlidXRlcyBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZXNjYXBlIGNvZGVzLgorICogTk9URTogSSBrbm93IHRoaXMgY29kZSBpcyBub3QgdmVyeSBlZmZpY2llbnQgKGNoZWNraW5nIGV2ZXJ5IGNvbG9yIGZvciBpdAorICogc2VsZikgYnV0IGl0IGlzIG1vcmUgcmVhZGFibGUgYW5kIGJldHRlciBtYWludGFpbmFibGUuCisgKi8KK3N0YXRpYyB2b2lkIGNvbnNvbGVfaGFuZGxlX2VzY2FwZShRZW11Q29uc29sZSAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaT0wOyBpPHMtPm5iX2VzY19wYXJhbXM7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHMtPmVzY19wYXJhbXNbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgMDogLyogcmVzZXQgYWxsIGNvbnNvbGUgYXR0cmlidXRlcyB0byBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgcy0+dF9hdHRyaWIgPSBzLT50X2F0dHJpYl9kZWZhdWx0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJvbGQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLnVsaW5lID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5ibGluayA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICAgICAgcy0+dF9hdHRyaWIuaW52ZXJzID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi51bnZpc2libGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMjoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5ib2xkID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgcy0+dF9hdHRyaWIudWxpbmUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNToKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5ibGluayA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmludmVycyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLnVudmlzaWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLworICAgICAgICAgICAgY2FzZSAzMDoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9CTEFDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzE6CisgICAgICAgICAgICAgICAgcy0+dF9hdHRyaWIuZmdjb2w9Q09MT1JfUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9HUkVFTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzM6CisgICAgICAgICAgICAgICAgcy0+dF9hdHRyaWIuZmdjb2w9Q09MT1JfWUVMTE9XOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNDoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9CTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9NQUdFTlRBOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNjoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9DWUFOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5mZ2NvbD1DT0xPUl9XSElURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCisgICAgICAgICAgICBjYXNlIDQwOgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX0JMQUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5iZ2NvbD1DT0xPUl9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyOgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX0dSRUVOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICBzLT50X2F0dHJpYi5iZ2NvbD1DT0xPUl9ZRUxMT1c7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX0JMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX01BR0VOVEE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ2OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX0NZQU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgICAgIHMtPnRfYXR0cmliLmJnY29sPUNPTE9SX1dISVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb25zb2xlX2NsZWFyX3h5KFFlbXVDb25zb2xlICpzLCBpbnQgeCwgaW50IHkpCit7CisgICAgaW50IHkxID0gKHMtPnlfYmFzZSArIHkpICUgcy0+dG90YWxfaGVpZ2h0OworICAgIFRleHRDZWxsICpjID0gJnMtPmNlbGxzW3kxICogcy0+d2lkdGggKyB4XTsKKyAgICBjLT5jaCA9ICcgJzsKKyAgICBjLT50X2F0dHJpYiA9IHMtPnRfYXR0cmliX2RlZmF1bHQ7CisgICAgdXBkYXRlX3h5KHMsIHgsIHkpOworfQorCitzdGF0aWMgdm9pZCBjb25zb2xlX3B1dGNoYXIoUWVtdUNvbnNvbGUgKnMsIGludCBjaCkKK3sKKyAgICBUZXh0Q2VsbCAqYzsKKyAgICBpbnQgeTEsIGk7CisgICAgaW50IHgsIHk7CisKKyAgICBzd2l0Y2gocy0+c3RhdGUpIHsKKyAgICBjYXNlIFRUWV9TVEFURV9OT1JNOgorICAgICAgICBzd2l0Y2goY2gpIHsKKyAgICAgICAgY2FzZSAnXHInOiAgLyogY2FycmlhZ2UgcmV0dXJuICovCisgICAgICAgICAgICBzLT54ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcbic6ICAvKiBuZXdsaW5lICovCisgICAgICAgICAgICBjb25zb2xlX3B1dF9sZihzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcYic6ICAvKiBiYWNrc3BhY2UgKi8KKyAgICAgICAgICAgIGlmIChzLT54ID4gMCkKKyAgICAgICAgICAgICAgICBzLT54LS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnXHQnOiAgLyogdGFic3BhY2UgKi8KKyAgICAgICAgICAgIGlmIChzLT54ICsgKDggLSAocy0+eCAlIDgpKSA+IHMtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgcy0+eCA9IDA7CisgICAgICAgICAgICAgICAgY29uc29sZV9wdXRfbGYocyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnggPSBzLT54ICsgKDggLSAocy0+eCAlIDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcYSc6ICAvKiBhbGVydCBha2EuIGJlbGwgKi8KKyAgICAgICAgICAgIC8qIFRPRE86IGhhcyB0byBiZSBpbXBsZW1lbnRlZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAvKiBTSSAoc2hpZnQgaW4pLCBjaGFyYWN0ZXIgc2V0IDAgKGlnbm9yZWQpICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIC8qIFNPIChzaGlmdCBvdXQpLCBjaGFyYWN0ZXIgc2V0IDEgKGlnbm9yZWQpICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNzogICAgLyogZXNjIChpbnRyb2R1Y2luZyBhbiBlc2NhcGUgc2VxdWVuY2UpICovCisgICAgICAgICAgICBzLT5zdGF0ZSA9IFRUWV9TVEFURV9FU0M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChzLT54ID49IHMtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgLyogbGluZSB3cmFwICovCisgICAgICAgICAgICAgICAgcy0+eCA9IDA7CisgICAgICAgICAgICAgICAgY29uc29sZV9wdXRfbGYocyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5MSA9IChzLT55X2Jhc2UgKyBzLT55KSAlIHMtPnRvdGFsX2hlaWdodDsKKyAgICAgICAgICAgIGMgPSAmcy0+Y2VsbHNbeTEgKiBzLT53aWR0aCArIHMtPnhdOworICAgICAgICAgICAgYy0+Y2ggPSBjaDsKKyAgICAgICAgICAgIGMtPnRfYXR0cmliID0gcy0+dF9hdHRyaWI7CisgICAgICAgICAgICB1cGRhdGVfeHkocywgcy0+eCwgcy0+eSk7CisgICAgICAgICAgICBzLT54Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRUWV9TVEFURV9FU0M6IC8qIGNoZWNrIGlmIGl0IGlzIGEgdGVybWluYWwgZXNjYXBlIHNlcXVlbmNlICovCisgICAgICAgIGlmIChjaCA9PSAnWycpIHsKKyAgICAgICAgICAgIGZvcihpPTA7aTxNQVhfRVNDX1BBUkFNUztpKyspCisgICAgICAgICAgICAgICAgcy0+ZXNjX3BhcmFtc1tpXSA9IDA7CisgICAgICAgICAgICBzLT5uYl9lc2NfcGFyYW1zID0gMDsKKyAgICAgICAgICAgIHMtPnN0YXRlID0gVFRZX1NUQVRFX0NTSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnN0YXRlID0gVFRZX1NUQVRFX05PUk07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUVFlfU1RBVEVfQ1NJOiAvKiBoYW5kbGUgZXNjYXBlIHNlcXVlbmNlIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgIGlmIChzLT5uYl9lc2NfcGFyYW1zIDwgTUFYX0VTQ19QQVJBTVMpIHsKKyAgICAgICAgICAgICAgICBzLT5lc2NfcGFyYW1zW3MtPm5iX2VzY19wYXJhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgcy0+ZXNjX3BhcmFtc1tzLT5uYl9lc2NfcGFyYW1zXSAqIDEwICsgY2ggLSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5uYl9lc2NfcGFyYW1zKys7CisgICAgICAgICAgICBpZiAoY2ggPT0gJzsnKQorICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIERFQlVHX0NPTlNPTEUKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXNjYXBlIHNlcXVlbmNlIENTSSVkOyVkJWMsICVkIHBhcmFtZXRlcnNcbiIsCisgICAgICAgICAgICAgICAgICAgIHMtPmVzY19wYXJhbXNbMF0sIHMtPmVzY19wYXJhbXNbMV0sIGNoLCBzLT5uYl9lc2NfcGFyYW1zKTsKKyNlbmRpZgorICAgICAgICAgICAgcy0+c3RhdGUgPSBUVFlfU1RBVEVfTk9STTsKKyAgICAgICAgICAgIHN3aXRjaChjaCkgeworICAgICAgICAgICAgY2FzZSAnQSc6CisgICAgICAgICAgICAgICAgLyogbW92ZSBjdXJzb3IgdXAgKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+ZXNjX3BhcmFtc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmVzY19wYXJhbXNbMF0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT55IC09IHMtPmVzY19wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgaWYgKHMtPnkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIC8qIG1vdmUgY3Vyc29yIGRvd24gKi8KKyAgICAgICAgICAgICAgICBpZiAocy0+ZXNjX3BhcmFtc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmVzY19wYXJhbXNbMF0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT55ICs9IHMtPmVzY19wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgaWYgKHMtPnkgPj0gcy0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnkgPSBzLT5oZWlnaHQgLSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIC8qIG1vdmUgY3Vyc29yIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgaWYgKHMtPmVzY19wYXJhbXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzLT5lc2NfcGFyYW1zWzBdID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+eCArPSBzLT5lc2NfcGFyYW1zWzBdOworICAgICAgICAgICAgICAgIGlmIChzLT54ID49IHMtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnggPSBzLT53aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgLyogbW92ZSBjdXJzb3IgbGVmdCAqLworICAgICAgICAgICAgICAgIGlmIChzLT5lc2NfcGFyYW1zWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZXNjX3BhcmFtc1swXSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPnggLT0gcy0+ZXNjX3BhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBpZiAocy0+eCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+eCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgLyogbW92ZSBjdXJzb3IgdG8gY29sdW1uICovCisgICAgICAgICAgICAgICAgcy0+eCA9IHMtPmVzY19wYXJhbXNbMF0gLSAxOworICAgICAgICAgICAgICAgIGlmIChzLT54IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzLT54ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICAgIGNhc2UgJ0gnOgorICAgICAgICAgICAgICAgIC8qIG1vdmUgY3Vyc29yIHRvIHJvdywgY29sdW1uICovCisgICAgICAgICAgICAgICAgcy0+eCA9IHMtPmVzY19wYXJhbXNbMV0gLSAxOworICAgICAgICAgICAgICAgIGlmIChzLT54IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzLT54ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+eSA9IHMtPmVzY19wYXJhbXNbMF0gLSAxOworICAgICAgICAgICAgICAgIGlmIChzLT55IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzLT55ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMtPmVzY19wYXJhbXNbMF0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIHRvIGVuZCBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gcy0+eTsgeSA8IHMtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID09IHMtPnkgJiYgeCA8IHMtPngpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfY2xlYXJfeHkocywgeCwgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAvKiBjbGVhciBmcm9tIGJlZ2lubmluZyBvZiBzY3JlZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8PSBzLT55OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT0gcy0+eSAmJiB4ID4gcy0+eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZV9jbGVhcl94eShzLCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGVudGlyZSBzY3JlZW4gKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8PSBzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlX2NsZWFyX3h5KHMsIHgsIHkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICAgICAgc3dpdGNoIChzLT5lc2NfcGFyYW1zWzBdKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIC8qIGNsZWFyIHRvIGVvbCAqLworICAgICAgICAgICAgICAgIGZvcih4ID0gcy0+eDsgeCA8IHMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfY2xlYXJfeHkocywgeCwgcy0+eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgZnJvbSBiZWdpbm5pbmcgb2YgbGluZSAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDw9IHMtPng7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZV9jbGVhcl94eShzLCB4LCBzLT55KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGVudGlyZSBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfY2xlYXJfeHkocywgeCwgcy0+eSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOgorICAgICAgICAgICAgY29uc29sZV9oYW5kbGVfZXNjYXBlKHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICAvKiByZXBvcnQgY3Vyc29yIHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgLyogVE9ETzogc2VuZCBFU0Nbcm93O2NvbFIgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIC8qIHNhdmUgY3Vyc29yIHBvc2l0aW9uICovCisgICAgICAgICAgICAgICAgcy0+eF9zYXZlZCA9IHMtPng7CisgICAgICAgICAgICAgICAgcy0+eV9zYXZlZCA9IHMtPnk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworICAgICAgICAgICAgICAgIHMtPnggPSBzLT54X3NhdmVkOworICAgICAgICAgICAgICAgIHMtPnkgPSBzLT55X3NhdmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyNpZmRlZiBERUJVR19DT05TT0xFCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmhhbmRsZWQgZXNjYXBlIGNoYXJhY3RlciAnJWMnXG4iLCBjaCk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNvbnNvbGVfc2VsZWN0KHVuc2lnbmVkIGludCBpbmRleCkKK3sKKyAgICBRZW11Q29uc29sZSAqczsKKworICAgIGlmIChpbmRleCA+PSBNQVhfQ09OU09MRVMpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoYWN0aXZlX2NvbnNvbGUpIHsKKyAgICBhY3RpdmVfY29uc29sZS0+Z193aWR0aCA9IGRzX2dldF93aWR0aChhY3RpdmVfY29uc29sZS0+ZHMpOworICAgIGFjdGl2ZV9jb25zb2xlLT5nX2hlaWdodCA9IGRzX2dldF9oZWlnaHQoYWN0aXZlX2NvbnNvbGUtPmRzKTsKKyAgICB9CisgICAgcyA9IGNvbnNvbGVzW2luZGV4XTsKKyAgICBpZiAocykgeworICAgICAgICBEaXNwbGF5U3RhdGUgKmRzID0gcy0+ZHM7CisgICAgICAgIGFjdGl2ZV9jb25zb2xlID0gczsKKyAgICAgICAgaWYgKGRzX2dldF9iaXRzX3Blcl9waXhlbChzLT5kcykpIHsKKyAgICAgICAgICAgIGRzLT5zdXJmYWNlID0gcWVtdV9yZXNpemVfZGlzcGxheXN1cmZhY2UoZHMsIHMtPmdfd2lkdGgsIHMtPmdfaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmRzLT5zdXJmYWNlLT53aWR0aCA9IHMtPndpZHRoOworICAgICAgICAgICAgcy0+ZHMtPnN1cmZhY2UtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBkcHlfcmVzaXplKHMtPmRzKTsKKyAgICAgICAgdmdhX2h3X2ludmFsaWRhdGUoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uc29sZV9wdXRzKENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCit7CisgICAgUWVtdUNvbnNvbGUgKnMgPSBjaHItPm9wYXF1ZTsKKyAgICBpbnQgaTsKKworICAgIHMtPnVwZGF0ZV94MCA9IHMtPndpZHRoICogRk9OVF9XSURUSDsKKyAgICBzLT51cGRhdGVfeTAgPSBzLT5oZWlnaHQgKiBGT05UX0hFSUdIVDsKKyAgICBzLT51cGRhdGVfeDEgPSAwOworICAgIHMtPnVwZGF0ZV95MSA9IDA7CisgICAgY29uc29sZV9zaG93X2N1cnNvcihzLCAwKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBjb25zb2xlX3B1dGNoYXIocywgYnVmW2ldKTsKKyAgICB9CisgICAgY29uc29sZV9zaG93X2N1cnNvcihzLCAxKTsKKyAgICBpZiAoZHNfZ2V0X2JpdHNfcGVyX3BpeGVsKHMtPmRzKSAmJiBzLT51cGRhdGVfeDAgPCBzLT51cGRhdGVfeDEpIHsKKyAgICAgICAgZHB5X3VwZGF0ZShzLT5kcywgcy0+dXBkYXRlX3gwLCBzLT51cGRhdGVfeTAsCisgICAgICAgICAgICAgICAgICAgcy0+dXBkYXRlX3gxIC0gcy0+dXBkYXRlX3gwLAorICAgICAgICAgICAgICAgICAgIHMtPnVwZGF0ZV95MSAtIHMtPnVwZGF0ZV95MCk7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfc2VuZF9ldmVudChDaGFyRHJpdmVyU3RhdGUgKmNociwgaW50IGV2ZW50KQoreworICAgIFFlbXVDb25zb2xlICpzID0gY2hyLT5vcGFxdWU7CisgICAgaW50IGk7CisKKyAgICBpZiAoZXZlbnQgPT0gQ0hSX0VWRU5UX0ZPQ1VTKSB7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG5iX2NvbnNvbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjb25zb2xlc1tpXSA9PSBzKSB7CisgICAgICAgICAgICAgICAgY29uc29sZV9zZWxlY3QoaSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGtiZF9zZW5kX2NoYXJzKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRZW11Q29uc29sZSAqcyA9IG9wYXF1ZTsKKyAgICBpbnQgbGVuOworICAgIHVpbnQ4X3QgYnVmWzE2XTsKKworICAgIGxlbiA9IHFlbXVfY2hyX2Nhbl9yZWFkKHMtPmNocik7CisgICAgaWYgKGxlbiA+IHMtPm91dF9maWZvLmNvdW50KQorICAgICAgICBsZW4gPSBzLT5vdXRfZmlmby5jb3VudDsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBpZiAobGVuID4gKGludClzaXplb2YoYnVmKSkKKyAgICAgICAgICAgIGxlbiA9IChpbnQpc2l6ZW9mKGJ1Zik7CisgICAgICAgIHFlbXVfZmlmb19yZWFkKCZzLT5vdXRfZmlmbywgYnVmLCBsZW4pOworICAgICAgICBxZW11X2Nocl9yZWFkKHMtPmNociwgYnVmLCBsZW4pOworICAgIH0KKyAgICAvKiBjaGFyYWN0ZXJzIGFyZSBwZW5kaW5nOiB3ZSBzZW5kIHRoZW0gYSBiaXQgbGF0ZXIgKFhYWDoKKyAgICAgICBob3JyaWJsZSwgc2hvdWxkIGNoYW5nZSBjaGFyIGRldmljZSBBUEkpICovCisgICAgaWYgKHMtPm91dF9maWZvLmNvdW50ID4gMCkgeworICAgICAgICB0aW1lcl9tb2Qocy0+a2JkX3RpbWVyLCBxZW11X2Nsb2NrX2dldF9tcyhRRU1VX0NMT0NLX1JFQUxUSU1FKSArIDEpOworICAgIH0KK30KKworLyogY2FsbGVkIHdoZW4gYW4gYXNjaWkga2V5IGlzIHByZXNzZWQgKi8KK3ZvaWQga2JkX3B1dF9rZXlzeW0oaW50IGtleXN5bSkKK3sKKyAgICBRZW11Q29uc29sZSAqczsKKyAgICB1aW50OF90IGJ1ZlsxNl0sICpxOworICAgIGludCBjOworCisgICAgcyA9IGFjdGl2ZV9jb25zb2xlOworICAgIGlmICghcyB8fCAocy0+Y29uc29sZV90eXBlID09IEdSQVBISUNfQ09OU09MRSkpCisgICAgICAgIHJldHVybjsKKworICAgIHN3aXRjaChrZXlzeW0pIHsKKyAgICBjYXNlIFFFTVVfS0VZX0NUUkxfVVA6CisgICAgICAgIGNvbnNvbGVfc2Nyb2xsKC0xKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRU1VX0tFWV9DVFJMX0RPV046CisgICAgICAgIGNvbnNvbGVfc2Nyb2xsKDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFTVVfS0VZX0NUUkxfUEFHRVVQOgorICAgICAgICBjb25zb2xlX3Njcm9sbCgtMTApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFTVVfS0VZX0NUUkxfUEFHRURPV046CisgICAgICAgIGNvbnNvbGVfc2Nyb2xsKDEwKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogY29udmVydCB0aGUgUUVNVSBrZXlzeW0gdG8gVlQxMDAga2V5IHN0cmluZyAqLworICAgICAgICBxID0gYnVmOworICAgICAgICBpZiAoa2V5c3ltID49IDB4ZTEwMCAmJiBrZXlzeW0gPD0gMHhlMTFmKSB7CisgICAgICAgICAgICAqcSsrID0gJ1wwMzMnOworICAgICAgICAgICAgKnErKyA9ICdbJzsKKyAgICAgICAgICAgIGMgPSBrZXlzeW0gLSAweGUxMDA7CisgICAgICAgICAgICBpZiAoYyA+PSAxMCkKKyAgICAgICAgICAgICAgICAqcSsrID0gJzAnICsgKGMgLyAxMCk7CisgICAgICAgICAgICAqcSsrID0gJzAnICsgKGMgJSAxMCk7CisgICAgICAgICAgICAqcSsrID0gJ34nOworICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA+PSAweGUxMjAgJiYga2V5c3ltIDw9IDB4ZTE3ZikgeworICAgICAgICAgICAgKnErKyA9ICdcMDMzJzsKKyAgICAgICAgICAgICpxKysgPSAnWyc7CisgICAgICAgICAgICAqcSsrID0ga2V5c3ltICYgMHhmZjsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5lY2hvICYmIChrZXlzeW0gPT0gJ1xyJyB8fCBrZXlzeW0gPT0gJ1xuJykpIHsKKyAgICAgICAgICAgIGNvbnNvbGVfcHV0cyhzLT5jaHIsIChjb25zdCB1aW50OF90ICopICJcciIsIDEpOworICAgICAgICAgICAgKnErKyA9ICdcbic7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnErKyA9IGtleXN5bTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+ZWNobykgeworICAgICAgICAgICAgY29uc29sZV9wdXRzKHMtPmNociwgYnVmLCBxIC0gYnVmKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+Y2hyLT5jaHJfcmVhZCkgeworICAgICAgICAgICAgcWVtdV9maWZvX3dyaXRlKCZzLT5vdXRfZmlmbywgYnVmLCBxIC0gYnVmKTsKKyAgICAgICAgICAgIGtiZF9zZW5kX2NoYXJzKHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGV4dF9jb25zb2xlX2ludmFsaWRhdGUodm9pZCAqb3BhcXVlKQoreworICAgIFFlbXVDb25zb2xlICpzID0gKFFlbXVDb25zb2xlICopIG9wYXF1ZTsKKyAgICBpZiAoIWRzX2dldF9iaXRzX3Blcl9waXhlbChzLT5kcykgJiYgcy0+Y29uc29sZV90eXBlID09IFRFWFRfQ09OU09MRSkgeworICAgICAgICBzLT5nX3dpZHRoID0gZHNfZ2V0X3dpZHRoKHMtPmRzKTsKKyAgICAgICAgcy0+Z19oZWlnaHQgPSBkc19nZXRfaGVpZ2h0KHMtPmRzKTsKKyAgICAgICAgdGV4dF9jb25zb2xlX3Jlc2l6ZShzKTsKKyAgICB9CisgICAgY29uc29sZV9yZWZyZXNoKHMpOworfQorCitzdGF0aWMgdm9pZCB0ZXh0X2NvbnNvbGVfdXBkYXRlKHZvaWQgKm9wYXF1ZSwgY29uc29sZV9jaF90ICpjaGFyZGF0YSkKK3sKKyAgICBRZW11Q29uc29sZSAqcyA9IChRZW11Q29uc29sZSAqKSBvcGFxdWU7CisgICAgaW50IGksIGosIHNyYzsKKworICAgIGlmIChzLT50ZXh0X3hbMF0gPD0gcy0+dGV4dF94WzFdKSB7CisgICAgICAgIHNyYyA9IChzLT55X2Jhc2UgKyBzLT50ZXh0X3lbMF0pICogcy0+d2lkdGg7CisgICAgICAgIGNoYXJkYXRhICs9IHMtPnRleHRfeVswXSAqIHMtPndpZHRoOworICAgICAgICBmb3IgKGkgPSBzLT50ZXh0X3lbMF07IGkgPD0gcy0+dGV4dF95WzFdOyBpICsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPndpZHRoOyBqICsrLCBzcmMgKyspCisgICAgICAgICAgICAgICAgY29uc29sZV93cml0ZV9jaChjaGFyZGF0YSArKywgcy0+Y2VsbHNbc3JjXS5jaCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jZWxsc1tzcmNdLnRfYXR0cmliLmZnY29sIDw8IDEyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5jZWxsc1tzcmNdLnRfYXR0cmliLmJnY29sIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmNlbGxzW3NyY10udF9hdHRyaWIuYm9sZCA8PCAyMSkpOworICAgICAgICBkcHlfdXBkYXRlKHMtPmRzLCBzLT50ZXh0X3hbMF0sIHMtPnRleHRfeVswXSwKKyAgICAgICAgICAgICAgICAgICBzLT50ZXh0X3hbMV0gLSBzLT50ZXh0X3hbMF0sIGkgLSBzLT50ZXh0X3lbMF0pOworICAgICAgICBzLT50ZXh0X3hbMF0gPSBzLT53aWR0aDsKKyAgICAgICAgcy0+dGV4dF95WzBdID0gcy0+aGVpZ2h0OworICAgICAgICBzLT50ZXh0X3hbMV0gPSAwOworICAgICAgICBzLT50ZXh0X3lbMV0gPSAwOworICAgIH0KKyAgICBpZiAocy0+Y3Vyc29yX2ludmFsaWRhdGUpIHsKKyAgICAgICAgZHB5X2N1cnNvcihzLT5kcywgcy0+eCwgcy0+eSk7CisgICAgICAgIHMtPmN1cnNvcl9pbnZhbGlkYXRlID0gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBRZW11Q29uc29sZSAqZ2V0X2dyYXBoaWNfY29uc29sZShEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIGludCBpOworICAgIFFlbXVDb25zb2xlICpzOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb25zb2xlczsgaSsrKSB7CisgICAgICAgIHMgPSBjb25zb2xlc1tpXTsKKyAgICAgICAgaWYgKHMtPmNvbnNvbGVfdHlwZSA9PSBHUkFQSElDX0NPTlNPTEUgJiYgcy0+ZHMgPT0gZHMpCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBRZW11Q29uc29sZSAqbmV3X2NvbnNvbGUoRGlzcGxheVN0YXRlICpkcywgY29uc29sZV90eXBlX3QgY29uc29sZV90eXBlKQoreworICAgIFFlbXVDb25zb2xlICpzOworICAgIGludCBpOworCisgICAgaWYgKG5iX2NvbnNvbGVzID49IE1BWF9DT05TT0xFUykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcyA9IGdfbWFsbG9jMChzaXplb2YoUWVtdUNvbnNvbGUpKTsKKyAgICBpZiAoIWFjdGl2ZV9jb25zb2xlIHx8ICgoYWN0aXZlX2NvbnNvbGUtPmNvbnNvbGVfdHlwZSAhPSBHUkFQSElDX0NPTlNPTEUpICYmCisgICAgICAgIChjb25zb2xlX3R5cGUgPT0gR1JBUEhJQ19DT05TT0xFKSkpIHsKKyAgICAgICAgYWN0aXZlX2NvbnNvbGUgPSBzOworICAgIH0KKyAgICBzLT5kcyA9IGRzOworICAgIHMtPmNvbnNvbGVfdHlwZSA9IGNvbnNvbGVfdHlwZTsKKyAgICBpZiAoY29uc29sZV90eXBlICE9IEdSQVBISUNfQ09OU09MRSkgeworICAgICAgICBjb25zb2xlc1tuYl9jb25zb2xlcysrXSA9IHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSEFDSzogUHV0IGdyYXBoaWNhbCBjb25zb2xlcyBiZWZvcmUgdGV4dCBjb25zb2xlcy4gICovCisgICAgICAgIGZvciAoaSA9IG5iX2NvbnNvbGVzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICBpZiAoY29uc29sZXNbaSAtIDFdLT5jb25zb2xlX3R5cGUgPT0gR1JBUEhJQ19DT05TT0xFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29uc29sZXNbaV0gPSBjb25zb2xlc1tpIC0gMV07CisgICAgICAgIH0KKyAgICAgICAgY29uc29sZXNbaV0gPSBzOworICAgICAgICBuYl9jb25zb2xlcysrOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIERpc3BsYXlTdXJmYWNlKiBkZWZhdWx0YWxsb2NhdG9yX2NyZWF0ZV9kaXNwbGF5c3VyZmFjZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgRGlzcGxheVN1cmZhY2UgKnN1cmZhY2UgPSAoRGlzcGxheVN1cmZhY2UqKSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlTdXJmYWNlKSk7CisKKyAgICBpbnQgbGluZXNpemUgPSB3aWR0aCAqIDQ7CisgICAgcWVtdV9hbGxvY19kaXNwbGF5KHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBxZW11X2RlZmF1bHRfcGl4ZWxmb3JtYXQoMzIpLCAwKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKworc3RhdGljIERpc3BsYXlTdXJmYWNlKiBkZWZhdWx0YWxsb2NhdG9yX3Jlc2l6ZV9kaXNwbGF5c3VyZmFjZShEaXNwbGF5U3VyZmFjZSAqc3VyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgbGluZXNpemUgPSB3aWR0aCAqIDQ7CisgICAgcWVtdV9hbGxvY19kaXNwbGF5KHN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBxZW11X2RlZmF1bHRfcGl4ZWxmb3JtYXQoMzIpLCAwKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKwordm9pZCBxZW11X2FsbG9jX2Rpc3BsYXkoRGlzcGxheVN1cmZhY2UgKnN1cmZhY2UsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgUGl4ZWxGb3JtYXQgcGYsIGludCBuZXdmbGFncykKK3sKKyAgICB2b2lkICpkYXRhOworICAgIHN1cmZhY2UtPndpZHRoID0gd2lkdGg7CisgICAgc3VyZmFjZS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHN1cmZhY2UtPmxpbmVzaXplID0gbGluZXNpemU7CisgICAgc3VyZmFjZS0+cGYgPSBwZjsKKyAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBRRU1VX0FMTE9DQVRFRF9GTEFHKSB7CisgICAgICAgIGRhdGEgPSBnX3JlYWxsb2Moc3VyZmFjZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJmYWNlLT5saW5lc2l6ZSAqIHN1cmZhY2UtPmhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YSA9IGdfbWFsbG9jKHN1cmZhY2UtPmxpbmVzaXplICogc3VyZmFjZS0+aGVpZ2h0KTsKKyAgICB9CisgICAgc3VyZmFjZS0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBzdXJmYWNlLT5mbGFncyA9IG5ld2ZsYWdzIHwgUUVNVV9BTExPQ0FURURfRkxBRzsKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgIHN1cmZhY2UtPmZsYWdzIHw9IFFFTVVfQklHX0VORElBTl9GTEFHOworI2VuZGlmCit9CisKK0Rpc3BsYXlTdXJmYWNlKiBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZV9mcm9tKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgRGlzcGxheVN1cmZhY2UgKnN1cmZhY2UgPSAoRGlzcGxheVN1cmZhY2UqKSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlTdXJmYWNlKSk7CisKKyAgICBzdXJmYWNlLT53aWR0aCA9IHdpZHRoOworICAgIHN1cmZhY2UtPmhlaWdodCA9IGhlaWdodDsKKyAgICBzdXJmYWNlLT5saW5lc2l6ZSA9IGxpbmVzaXplOworICAgIHN1cmZhY2UtPnBmID0gcWVtdV9kZWZhdWx0X3BpeGVsZm9ybWF0KGJwcCk7CisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyAgICBzdXJmYWNlLT5mbGFncyA9IFFFTVVfQklHX0VORElBTl9GTEFHOworI2VuZGlmCisgICAgc3VyZmFjZS0+ZGF0YSA9IGRhdGE7CisKKyAgICByZXR1cm4gc3VyZmFjZTsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdGFsbG9jYXRvcl9mcmVlX2Rpc3BsYXlzdXJmYWNlKERpc3BsYXlTdXJmYWNlICpzdXJmYWNlKQoreworICAgIGlmIChzdXJmYWNlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoc3VyZmFjZS0+ZmxhZ3MgJiBRRU1VX0FMTE9DQVRFRF9GTEFHKQorICAgICAgICBnX2ZyZWUoc3VyZmFjZS0+ZGF0YSk7CisgICAgZ19mcmVlKHN1cmZhY2UpOworfQorCitzdGF0aWMgc3RydWN0IERpc3BsYXlBbGxvY2F0b3IgZGVmYXVsdF9hbGxvY2F0b3IgPSB7CisgICAgZGVmYXVsdGFsbG9jYXRvcl9jcmVhdGVfZGlzcGxheXN1cmZhY2UsCisgICAgZGVmYXVsdGFsbG9jYXRvcl9yZXNpemVfZGlzcGxheXN1cmZhY2UsCisgICAgZGVmYXVsdGFsbG9jYXRvcl9mcmVlX2Rpc3BsYXlzdXJmYWNlCit9OworCitzdGF0aWMgdm9pZCBkdW1iX2Rpc3BsYXlfaW5pdCh2b2lkKQoreworICAgIERpc3BsYXlTdGF0ZSAqZHMgPSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlTdGF0ZSkpOworICAgIGRzLT5hbGxvY2F0b3IgPSAmZGVmYXVsdF9hbGxvY2F0b3I7CisgICAgZHMtPnN1cmZhY2UgPSBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZShkcywgNjQwLCA0ODApOworICAgIHJlZ2lzdGVyX2Rpc3BsYXlzdGF0ZShkcyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlZ2lzdGVyIGRpc3BsYXkgKi8KKwordm9pZCByZWdpc3Rlcl9kaXNwbGF5c3RhdGUoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICBEaXNwbGF5U3RhdGUgKipzOworICAgIHMgPSAmZGlzcGxheV9zdGF0ZTsKKyAgICB3aGlsZSAoKnMgIT0gTlVMTCkKKyAgICAgICAgcyA9ICYoKnMpLT5uZXh0OworICAgIGRzLT5uZXh0ID0gTlVMTDsKKyAgICAqcyA9IGRzOworfQorCitEaXNwbGF5U3RhdGUgKmdldF9kaXNwbGF5c3RhdGUodm9pZCkKK3sKKyAgICBpZiAoIWRpc3BsYXlfc3RhdGUpIHsKKyAgICAgICAgZHVtYl9kaXNwbGF5X2luaXQgKCk7CisgICAgfQorICAgIHJldHVybiBkaXNwbGF5X3N0YXRlOworfQorCitEaXNwbGF5QWxsb2NhdG9yICpyZWdpc3Rlcl9kaXNwbGF5YWxsb2NhdG9yKERpc3BsYXlTdGF0ZSAqZHMsIERpc3BsYXlBbGxvY2F0b3IgKmRhKQoreworICAgIGlmKGRzLT5hbGxvY2F0b3IgPT0gICZkZWZhdWx0X2FsbG9jYXRvcikgeworICAgICAgICBEaXNwbGF5U3VyZmFjZSAqc3VyZjsKKyAgICAgICAgc3VyZiA9IGRhLT5jcmVhdGVfZGlzcGxheXN1cmZhY2UoZHNfZ2V0X3dpZHRoKGRzKSwgZHNfZ2V0X2hlaWdodChkcykpOworICAgICAgICBkZWZhdWx0YWxsb2NhdG9yX2ZyZWVfZGlzcGxheXN1cmZhY2UoZHMtPnN1cmZhY2UpOworICAgICAgICBkcy0+c3VyZmFjZSA9IHN1cmY7CisgICAgICAgIGRzLT5hbGxvY2F0b3IgPSBkYTsKKyAgICB9CisgICAgcmV0dXJuIGRzLT5hbGxvY2F0b3I7Cit9CisKK0Rpc3BsYXlTdGF0ZSAqZ3JhcGhpY19jb25zb2xlX2luaXQodmdhX2h3X3VwZGF0ZV9wdHIgdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2FfaHdfaW52YWxpZGF0ZV9wdHIgaW52YWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X3NjcmVlbl9kdW1wX3B0ciBzY3JlZW5fZHVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2h3X3RleHRfdXBkYXRlX3B0ciB0ZXh0X3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIFFlbXVDb25zb2xlICpzOworICAgIERpc3BsYXlTdGF0ZSAqZHM7CisKKyAgICBkcyA9IChEaXNwbGF5U3RhdGUgKikgZ19tYWxsb2MwKHNpemVvZihEaXNwbGF5U3RhdGUpKTsKKyAgICBkcy0+YWxsb2NhdG9yID0gJmRlZmF1bHRfYWxsb2NhdG9yOworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgZHMtPnN1cmZhY2UgPSBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZShkcywgYW5kcm9pZF9kaXNwbGF5X3dpZHRoLCBhbmRyb2lkX2Rpc3BsYXlfaGVpZ2h0KTsKKyNlbHNlCisgICAgZHMtPnN1cmZhY2UgPSBxZW11X2NyZWF0ZV9kaXNwbGF5c3VyZmFjZShkcywgNjQwLCA0ODApOworI2VuZGlmCisKKyAgICBzID0gbmV3X2NvbnNvbGUoZHMsIEdSQVBISUNfQ09OU09MRSk7CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBxZW11X2ZyZWVfZGlzcGxheXN1cmZhY2UoZHMpOworICAgICAgICBnX2ZyZWUoZHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcy0+aHdfdXBkYXRlID0gdXBkYXRlOworICAgIHMtPmh3X2ludmFsaWRhdGUgPSBpbnZhbGlkYXRlOworICAgIHMtPmh3X3NjcmVlbl9kdW1wID0gc2NyZWVuX2R1bXA7CisgICAgcy0+aHdfdGV4dF91cGRhdGUgPSB0ZXh0X3VwZGF0ZTsKKyAgICBzLT5odyA9IG9wYXF1ZTsKKworICAgIHJlZ2lzdGVyX2Rpc3BsYXlzdGF0ZShkcyk7CisgICAgcmV0dXJuIGRzOworfQorCitpbnQgaXNfZ3JhcGhpY19jb25zb2xlKHZvaWQpCit7CisgICAgcmV0dXJuIGFjdGl2ZV9jb25zb2xlICYmIGFjdGl2ZV9jb25zb2xlLT5jb25zb2xlX3R5cGUgPT0gR1JBUEhJQ19DT05TT0xFOworfQorCitpbnQgaXNfZml4ZWRzaXplX2NvbnNvbGUodm9pZCkKK3sKKyAgICByZXR1cm4gYWN0aXZlX2NvbnNvbGUgJiYgYWN0aXZlX2NvbnNvbGUtPmNvbnNvbGVfdHlwZSAhPSBURVhUX0NPTlNPTEU7Cit9CisKK3ZvaWQgY29uc29sZV9jb2xvcl9pbml0KERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBjb2xvcl90YWJsZVtqXVtpXSA9IGNvbF9leHBhbmQoZHMsCisgICAgICAgICAgICAgICAgICAgdmdhX2dldF9jb2xvcihkcywgY29sb3JfdGFibGVfcmdiW2pdW2ldKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbl90ZXh0X2NvbnNvbGVzOworc3RhdGljIENoYXJEcml2ZXJTdGF0ZSAqdGV4dF9jb25zb2xlc1sxMjhdOworCitzdGF0aWMgdm9pZCB0ZXh0X2NvbnNvbGVfc2V0X2VjaG8oQ2hhckRyaXZlclN0YXRlICpjaHIsIGJvb2wgZWNobykKK3sKKyAgICBRZW11Q29uc29sZSAqcyA9IGNoci0+b3BhcXVlOworCisgICAgcy0+ZWNobyA9IGVjaG87Cit9CisKK3N0YXRpYyB2b2lkIHRleHRfY29uc29sZV9kb19pbml0KENoYXJEcml2ZXJTdGF0ZSAqY2hyLCBEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIFFlbXVDb25zb2xlICpzOworICAgIHN0YXRpYyBpbnQgY29sb3JfaW5pdGVkOworCisgICAgcyA9IGNoci0+b3BhcXVlOworCisgICAgY2hyLT5jaHJfd3JpdGUgPSBjb25zb2xlX3B1dHM7CisgICAgY2hyLT5jaHJfc2VuZF9ldmVudCA9IGNvbnNvbGVfc2VuZF9ldmVudDsKKworICAgIHMtPm91dF9maWZvLmJ1ZiA9IHMtPm91dF9maWZvX2J1ZjsKKyAgICBzLT5vdXRfZmlmby5idWZfc2l6ZSA9IHNpemVvZihzLT5vdXRfZmlmb19idWYpOworICAgIHMtPmtiZF90aW1lciA9IHRpbWVyX25ldyhRRU1VX0NMT0NLX1JFQUxUSU1FLCBTQ0FMRV9NUywga2JkX3NlbmRfY2hhcnMsIHMpOworICAgIHMtPmRzID0gZHM7CisKKyAgICBpZiAoIWNvbG9yX2luaXRlZCkgeworICAgICAgICBjb2xvcl9pbml0ZWQgPSAxOworICAgICAgICBjb25zb2xlX2NvbG9yX2luaXQocy0+ZHMpOworICAgIH0KKyAgICBzLT55X2Rpc3BsYXllZCA9IDA7CisgICAgcy0+eV9iYXNlID0gMDsKKyAgICBzLT50b3RhbF9oZWlnaHQgPSBERUZBVUxUX0JBQ0tTQ1JPTEw7CisgICAgcy0+eCA9IDA7CisgICAgcy0+eSA9IDA7CisgICAgaWYgKHMtPmNvbnNvbGVfdHlwZSA9PSBURVhUX0NPTlNPTEUpIHsKKyAgICAgICAgcy0+Z193aWR0aCA9IGRzX2dldF93aWR0aChzLT5kcyk7CisgICAgICAgIHMtPmdfaGVpZ2h0ID0gZHNfZ2V0X2hlaWdodChzLT5kcyk7CisgICAgfQorCisgICAgcy0+aHdfaW52YWxpZGF0ZSA9IHRleHRfY29uc29sZV9pbnZhbGlkYXRlOworICAgIHMtPmh3X3RleHRfdXBkYXRlID0gdGV4dF9jb25zb2xlX3VwZGF0ZTsKKyAgICBzLT5odyA9IHM7CisKKyAgICAvKiBTZXQgdGV4dCBhdHRyaWJ1dGUgZGVmYXVsdHMgKi8KKyAgICBzLT50X2F0dHJpYl9kZWZhdWx0LmJvbGQgPSAwOworICAgIHMtPnRfYXR0cmliX2RlZmF1bHQudWxpbmUgPSAwOworICAgIHMtPnRfYXR0cmliX2RlZmF1bHQuYmxpbmsgPSAwOworICAgIHMtPnRfYXR0cmliX2RlZmF1bHQuaW52ZXJzID0gMDsKKyAgICBzLT50X2F0dHJpYl9kZWZhdWx0LnVudmlzaWJsZSA9IDA7CisgICAgcy0+dF9hdHRyaWJfZGVmYXVsdC5mZ2NvbCA9IENPTE9SX1dISVRFOworICAgIHMtPnRfYXR0cmliX2RlZmF1bHQuYmdjb2wgPSBDT0xPUl9CTEFDSzsKKyAgICAvKiBzZXQgY3VycmVudCB0ZXh0IGF0dHJpYnV0ZXMgdG8gZGVmYXVsdCAqLworICAgIHMtPnRfYXR0cmliID0gcy0+dF9hdHRyaWJfZGVmYXVsdDsKKyAgICB0ZXh0X2NvbnNvbGVfcmVzaXplKHMpOworCisgICAgaWYgKGNoci0+bGFiZWwpIHsKKyAgICAgICAgY2hhciBtc2dbMTI4XTsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBzLT50X2F0dHJpYi5iZ2NvbCA9IENPTE9SX0JMVUU7CisgICAgICAgIGxlbiA9IHNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICIlcyBjb25zb2xlXHJcbiIsIGNoci0+bGFiZWwpOworICAgICAgICBjb25zb2xlX3B1dHMoY2hyLCAodWludDhfdCopbXNnLCBsZW4pOworICAgICAgICBzLT50X2F0dHJpYiA9IHMtPnRfYXR0cmliX2RlZmF1bHQ7CisgICAgfQorCisgICAgcWVtdV9jaHJfZ2VuZXJpY19vcGVuKGNocik7CisgICAgaWYgKGNoci0+aW5pdCkKKyAgICAgICAgY2hyLT5pbml0KGNocik7Cit9CisKK0NoYXJEcml2ZXJTdGF0ZSAqdGV4dF9jb25zb2xlX2luaXQoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgQ2hhckRyaXZlclN0YXRlICpjaHI7CisgICAgUWVtdUNvbnNvbGUgKnM7CisgICAgdW5zaWduZWQgd2lkdGg7CisgICAgdW5zaWduZWQgaGVpZ2h0OworCisgICAgY2hyID0gZ19tYWxsb2MwKHNpemVvZihDaGFyRHJpdmVyU3RhdGUpKTsKKworICAgIGlmIChuX3RleHRfY29uc29sZXMgPT0gMTI4KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdGV4dCBjb25zb2xlc1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHRleHRfY29uc29sZXNbbl90ZXh0X2NvbnNvbGVzXSA9IGNocjsKKyAgICBuX3RleHRfY29uc29sZXMrKzsKKworICAgIHdpZHRoID0gcWVtdV9vcHRfZ2V0X251bWJlcihvcHRzLCAid2lkdGgiLCAwKTsKKyAgICBpZiAod2lkdGggPT0gMCkKKyAgICAgICAgd2lkdGggPSBxZW11X29wdF9nZXRfbnVtYmVyKG9wdHMsICJjb2xzIiwgMCkgKiBGT05UX1dJRFRIOworCisgICAgaGVpZ2h0ID0gcWVtdV9vcHRfZ2V0X251bWJlcihvcHRzLCAiaGVpZ2h0IiwgMCk7CisgICAgaWYgKGhlaWdodCA9PSAwKQorICAgICAgICBoZWlnaHQgPSBxZW11X29wdF9nZXRfbnVtYmVyKG9wdHMsICJyb3dzIiwgMCkgKiBGT05UX0hFSUdIVDsKKworICAgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CisgICAgICAgIHMgPSBuZXdfY29uc29sZShOVUxMLCBURVhUX0NPTlNPTEUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMgPSBuZXdfY29uc29sZShOVUxMLCBURVhUX0NPTlNPTEVfRklYRURfU0laRSk7CisgICAgfQorCisgICAgaWYgKCFzKSB7CisgICAgICAgIGZyZWUoY2hyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcy0+Y2hyID0gY2hyOworICAgIHMtPmdfd2lkdGggPSB3aWR0aDsKKyAgICBzLT5nX2hlaWdodCA9IGhlaWdodDsKKyAgICBjaHItPm9wYXF1ZSA9IHM7CisgICAgY2hyLT5jaHJfc2V0X2VjaG8gPSB0ZXh0X2NvbnNvbGVfc2V0X2VjaG87CisgICAgcmV0dXJuIGNocjsKK30KKworQ2hhckRyaXZlclN0YXRlKiB0ZXh0X2NvbnNvbGVfaW5pdF9jb21wYXQoY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0IGNoYXIgKnApCit7CisgICAgUWVtdU9wdHMgKm9wdHM7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgY2hhciB0ZW1wWzMyXTsKKworICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKHFlbXVfZmluZF9vcHRzKCJjaGFyZGV2IiksIGxhYmVsLCAxKTsKKyAgICBpZiAoTlVMTCA9PSBvcHRzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgd2lkdGggPSBzdHJ0b3VsKHAsIChjaGFyICoqKSZwLCAxMCk7CisgICAgICAgIGlmICgqcCA9PSAnQycpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHdpZHRoICo9IEZPTlRfV0lEVEg7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYodGVtcCwgc2l6ZW9mIHRlbXAsICIlZCIsIHdpZHRoKTsKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJ3aWR0aCIsIHRlbXApOworICAgICAgICBpZiAoKnAgPT0gJ3gnKSB7CisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBoZWlnaHQgPSBzdHJ0b3VsKHAsIChjaGFyICoqKSZwLCAxMCk7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ0MnKSB7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIGhlaWdodCAqPSBGT05UX0hFSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNucHJpbnRmKHRlbXAsIHNpemVvZiB0ZW1wLCAiJWQiLCBoZWlnaHQpOworICAgICAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJoZWlnaHQiLCB0ZW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGV4dF9jb25zb2xlX2luaXQob3B0cyk7Cit9CisKK3ZvaWQgdGV4dF9jb25zb2xlc19zZXRfZGlzcGxheShEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5fdGV4dF9jb25zb2xlczsgaSsrKSB7CisgICAgICAgIHRleHRfY29uc29sZV9kb19pbml0KHRleHRfY29uc29sZXNbaV0sIGRzKTsKKyAgICB9CisKKyAgICBuX3RleHRfY29uc29sZXMgPSAwOworfQorCit2b2lkIHFlbXVfY29uc29sZV9yZXNpemUoRGlzcGxheVN0YXRlICpkcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIFFlbXVDb25zb2xlICpzID0gZ2V0X2dyYXBoaWNfY29uc29sZShkcyk7CisgICAgaWYgKCFzKSByZXR1cm47CisKKyAgICBzLT5nX3dpZHRoID0gd2lkdGg7CisgICAgcy0+Z19oZWlnaHQgPSBoZWlnaHQ7CisgICAgaWYgKGlzX2dyYXBoaWNfY29uc29sZSgpKSB7CisgICAgICAgIGRzLT5zdXJmYWNlID0gcWVtdV9yZXNpemVfZGlzcGxheXN1cmZhY2UoZHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBkcHlfcmVzaXplKGRzKTsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9jb25zb2xlX2NvcHkoRGlzcGxheVN0YXRlICpkcywgaW50IHNyY194LCBpbnQgc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LCBpbnQgdywgaW50IGgpCit7CisgICAgaWYgKGlzX2dyYXBoaWNfY29uc29sZSgpKSB7CisgICAgICAgIGRweV9jb3B5KGRzLCBzcmNfeCwgc3JjX3ksIGRzdF94LCBkc3RfeSwgdywgaCk7CisgICAgfQorfQorCitQaXhlbEZvcm1hdCBxZW11X2RpZmZlcmVudF9lbmRpYW5uZXNzX3BpeGVsZm9ybWF0KGludCBicHApCit7CisgICAgUGl4ZWxGb3JtYXQgcGY7CisKKyAgICBtZW1zZXQoJnBmLCAweDAwLCBzaXplb2YoUGl4ZWxGb3JtYXQpKTsKKworICAgIHBmLmJpdHNfcGVyX3BpeGVsID0gYnBwOworICAgIHBmLmJ5dGVzX3Blcl9waXhlbCA9IGJwcCAvIDg7CisgICAgcGYuZGVwdGggPSBicHAgPT0gMzIgPyAyNCA6IGJwcDsKKworICAgIHN3aXRjaCAoYnBwKSB7CisgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICBwZi5ybWFzayA9IDB4MDAwMDAwRkY7CisgICAgICAgICAgICBwZi5nbWFzayA9IDB4MDAwMEZGMDA7CisgICAgICAgICAgICBwZi5ibWFzayA9IDB4MDBGRjAwMDA7CisgICAgICAgICAgICBwZi5ybWF4ID0gMjU1OworICAgICAgICAgICAgcGYuZ21heCA9IDI1NTsKKyAgICAgICAgICAgIHBmLmJtYXggPSAyNTU7CisgICAgICAgICAgICBwZi5yc2hpZnQgPSAwOworICAgICAgICAgICAgcGYuZ3NoaWZ0ID0gODsKKyAgICAgICAgICAgIHBmLmJzaGlmdCA9IDE2OworICAgICAgICAgICAgcGYucmJpdHMgPSA4OworICAgICAgICAgICAgcGYuZ2JpdHMgPSA4OworICAgICAgICAgICAgcGYuYmJpdHMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICBwZi5ybWFzayA9IDB4MDAwMEZGMDA7CisgICAgICAgICAgICBwZi5nbWFzayA9IDB4MDBGRjAwMDA7CisgICAgICAgICAgICBwZi5ibWFzayA9IDB4RkYwMDAwMDA7CisgICAgICAgICAgICBwZi5hbWFzayA9IDB4MDAwMDAwMDA7CisgICAgICAgICAgICBwZi5hbWF4ID0gMjU1OworICAgICAgICAgICAgcGYucm1heCA9IDI1NTsKKyAgICAgICAgICAgIHBmLmdtYXggPSAyNTU7CisgICAgICAgICAgICBwZi5ibWF4ID0gMjU1OworICAgICAgICAgICAgcGYuYXNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHBmLnJzaGlmdCA9IDg7CisgICAgICAgICAgICBwZi5nc2hpZnQgPSAxNjsKKyAgICAgICAgICAgIHBmLmJzaGlmdCA9IDI0OworICAgICAgICAgICAgcGYucmJpdHMgPSA4OworICAgICAgICAgICAgcGYuZ2JpdHMgPSA4OworICAgICAgICAgICAgcGYuYmJpdHMgPSA4OworICAgICAgICAgICAgcGYuYWJpdHMgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHBmOworfQorCitQaXhlbEZvcm1hdCBxZW11X2RlZmF1bHRfcGl4ZWxmb3JtYXQoaW50IGJwcCkKK3sKKyAgICBQaXhlbEZvcm1hdCBwZjsKKworICAgIG1lbXNldCgmcGYsIDB4MDAsIHNpemVvZihQaXhlbEZvcm1hdCkpOworCisgICAgcGYuYml0c19wZXJfcGl4ZWwgPSBicHA7CisgICAgcGYuYnl0ZXNfcGVyX3BpeGVsID0gYnBwIC8gODsKKyAgICBwZi5kZXB0aCA9IGJwcCA9PSAzMiA/IDI0IDogYnBwOworCisgICAgc3dpdGNoIChicHApIHsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIHBmLmJpdHNfcGVyX3BpeGVsID0gMTY7CisgICAgICAgICAgICBwZi5ieXRlc19wZXJfcGl4ZWwgPSAyOworICAgICAgICAgICAgcGYucm1hc2sgPSAweDAwMDA3YzAwOworICAgICAgICAgICAgcGYuZ21hc2sgPSAweDAwMDAwM0UwOworICAgICAgICAgICAgcGYuYm1hc2sgPSAweDAwMDAwMDFGOworICAgICAgICAgICAgcGYucm1heCA9IDMxOworICAgICAgICAgICAgcGYuZ21heCA9IDMxOworICAgICAgICAgICAgcGYuYm1heCA9IDMxOworICAgICAgICAgICAgcGYucnNoaWZ0ID0gMTA7CisgICAgICAgICAgICBwZi5nc2hpZnQgPSA1OworICAgICAgICAgICAgcGYuYnNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHBmLnJiaXRzID0gNTsKKyAgICAgICAgICAgIHBmLmdiaXRzID0gNTsKKyAgICAgICAgICAgIHBmLmJiaXRzID0gNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgcGYucm1hc2sgPSAweDAwMDBGODAwOworICAgICAgICAgICAgcGYuZ21hc2sgPSAweDAwMDAwN0UwOworICAgICAgICAgICAgcGYuYm1hc2sgPSAweDAwMDAwMDFGOworICAgICAgICAgICAgcGYucm1heCA9IDMxOworICAgICAgICAgICAgcGYuZ21heCA9IDYzOworICAgICAgICAgICAgcGYuYm1heCA9IDMxOworICAgICAgICAgICAgcGYucnNoaWZ0ID0gMTE7CisgICAgICAgICAgICBwZi5nc2hpZnQgPSA1OworICAgICAgICAgICAgcGYuYnNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHBmLnJiaXRzID0gNTsKKyAgICAgICAgICAgIHBmLmdiaXRzID0gNjsKKyAgICAgICAgICAgIHBmLmJiaXRzID0gNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgcGYucm1hc2sgPSAweDAwRkYwMDAwOworICAgICAgICAgICAgcGYuZ21hc2sgPSAweDAwMDBGRjAwOworICAgICAgICAgICAgcGYuYm1hc2sgPSAweDAwMDAwMEZGOworICAgICAgICAgICAgcGYucm1heCA9IDI1NTsKKyAgICAgICAgICAgIHBmLmdtYXggPSAyNTU7CisgICAgICAgICAgICBwZi5ibWF4ID0gMjU1OworICAgICAgICAgICAgcGYucnNoaWZ0ID0gMTY7CisgICAgICAgICAgICBwZi5nc2hpZnQgPSA4OworICAgICAgICAgICAgcGYuYnNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHBmLnJiaXRzID0gODsKKyAgICAgICAgICAgIHBmLmdiaXRzID0gODsKKyAgICAgICAgICAgIHBmLmJiaXRzID0gODsKKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIHBmLnJtYXNrID0gMHgwMEZGMDAwMDsKKyAgICAgICAgICAgIHBmLmdtYXNrID0gMHgwMDAwRkYwMDsKKyAgICAgICAgICAgIHBmLmJtYXNrID0gMHgwMDAwMDBGRjsKKyAgICAgICAgICAgIHBmLmFtYXggPSAyNTU7CisgICAgICAgICAgICBwZi5ybWF4ID0gMjU1OworICAgICAgICAgICAgcGYuZ21heCA9IDI1NTsKKyAgICAgICAgICAgIHBmLmJtYXggPSAyNTU7CisgICAgICAgICAgICBwZi5hc2hpZnQgPSAyNDsKKyAgICAgICAgICAgIHBmLnJzaGlmdCA9IDE2OworICAgICAgICAgICAgcGYuZ3NoaWZ0ID0gODsKKyAgICAgICAgICAgIHBmLmJzaGlmdCA9IDA7CisgICAgICAgICAgICBwZi5yYml0cyA9IDg7CisgICAgICAgICAgICBwZi5nYml0cyA9IDg7CisgICAgICAgICAgICBwZi5iYml0cyA9IDg7CisgICAgICAgICAgICBwZi5hYml0cyA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcGY7Cit9CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorCit2b2lkCit1bnJlZ2lzdGVyX2Rpc3BsYXl1cGRhdGVsaXN0ZW5lcihEaXNwbGF5U3RhdGUgKmRzLCBEaXNwbGF5VXBkYXRlTGlzdGVuZXIgKmR1bCkKK3sKKyAgICBEaXNwbGF5VXBkYXRlTGlzdGVuZXIgKipwbm9kZSA9ICZkcy0+dXBkYXRlX2xpc3RlbmVyczsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICgqcG5vZGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKnBub2RlID09IGR1bCkgeworICAgICAgICAgICAgKnBub2RlID0gZHVsLT5uZXh0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGUgPSAmKCpwbm9kZSktPm5leHQ7CisgICAgfQorICAgIGR1bC0+bmV4dCA9IE5VTEw7Cit9CisKK3ZvaWQKK2FuZHJvaWRfZGlzcGxheV9yZXNldChEaXNwbGF5U3RhdGUqIGRzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzcHApCit7CisgICAgRGlzcGxheVN1cmZhY2UqICBzdXJmYWNlOworICAgIGludCAgICAgICAgICAgICAgYnl0ZXNwcCA9IChiaXRzcHArNykvODsKKyAgICBpbnQgICAgICAgICAgICAgIHBpdGNoID0gKGJ5dGVzcHAqd2lkdGggKyAzKSAmIH4zOworCisgICAgcWVtdV9mcmVlX2Rpc3BsYXlzdXJmYWNlKGRzKTsKKworICAgIHN1cmZhY2UgPSAoRGlzcGxheVN1cmZhY2UqKSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlTdXJmYWNlKSk7CisKKyAgICBzdXJmYWNlLT53aWR0aCA9IHdpZHRoOworICAgIHN1cmZhY2UtPmhlaWdodCA9IGhlaWdodDsKKyAgICBzdXJmYWNlLT5saW5lc2l6ZSA9IHBpdGNoOworICAgIHN1cmZhY2UtPnBmID0gcWVtdV9kZWZhdWx0X3BpeGVsZm9ybWF0KGJpdHNwcCk7CisgICAgc3VyZmFjZS0+ZGF0YSA9ICh1aW50OF90KikgZ19tYWxsb2Moc3VyZmFjZS0+bGluZXNpemUgKiBzdXJmYWNlLT5oZWlnaHQpOworI2lmZGVmIEhPU1RfV09SRFNfQklHRU5ESUFOCisgICAgc3VyZmFjZS0+ZmxhZ3MgPSBRRU1VX0FMTE9DQVRFRF9GTEFHIHwgUUVNVV9CSUdfRU5ESUFOX0ZMQUc7CisjZWxzZQorICAgIHN1cmZhY2UtPmZsYWdzID0gUUVNVV9BTExPQ0FURURfRkxBRzsKKyNlbmRpZgorCisgICAgZHMtPnN1cmZhY2UgPSBzdXJmYWNlOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL2N1cnNlcy5jIGIvYW5kcm9pZC9xZW11MS91aS9jdXJzZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGYxZTEyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS9jdXJzZXMuYwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIFFFTVUgY3Vyc2VzL25jdXJzZXMgZGlzcGxheSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcnplaiBaYWJvcm93c2tpICA8YmFscm9nQHphYm9yLm9yZz4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDxjdXJzZXMuaD4KKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjZW5kaWYKKworI2lmZGVmIF9fT3BlbkJTRF9fCisjZGVmaW5lIHJlc2l6ZV90ZXJtIHJlc2l6ZXRlcm0KKyNlbmRpZgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorCisjZGVmaW5lIEZPTlRfSEVJR0hUIDE2CisjZGVmaW5lIEZPTlRfV0lEVEggOAorCitzdGF0aWMgY29uc29sZV9jaF90IHNjcmVlblsxNjAgKiAxMDBdOworc3RhdGljIFdJTkRPVyAqc2NyZWVucGFkID0gTlVMTDsKK3N0YXRpYyBpbnQgd2lkdGgsIGhlaWdodCwgZ3dpZHRoLCBnaGVpZ2h0LCBpbnZhbGlkYXRlOworc3RhdGljIGludCBweCwgcHksIHNtaW54LCBzbWlueSwgc21heHgsIHNtYXh5OworCitzdGF0aWMgdm9pZCBjdXJzZXNfdXBkYXRlKERpc3BsYXlTdGF0ZSAqZHMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGNodHlwZSAqbGluZTsKKworICAgIGxpbmUgPSAoKGNodHlwZSAqKSBzY3JlZW4pICsgeSAqIHdpZHRoOworICAgIGZvciAoaCArPSB5OyB5IDwgaDsgeSArKywgbGluZSArPSB3aWR0aCkKKyAgICAgICAgbXZ3YWRkY2huc3RyKHNjcmVlbnBhZCwgeSwgMCwgbGluZSwgd2lkdGgpOworCisgICAgcG5vdXRyZWZyZXNoKHNjcmVlbnBhZCwgcHksIHB4LCBzbWlueSwgc21pbngsIHNtYXh5IC0gMSwgc21heHggLSAxKTsKKyAgICByZWZyZXNoKCk7Cit9CisKK3N0YXRpYyB2b2lkIGN1cnNlc19jYWxjX3BhZCh2b2lkKQoreworICAgIGlmIChpc19maXhlZHNpemVfY29uc29sZSgpKSB7CisgICAgICAgIHdpZHRoID0gZ3dpZHRoOworICAgICAgICBoZWlnaHQgPSBnaGVpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIHdpZHRoID0gQ09MUzsKKyAgICAgICAgaGVpZ2h0ID0gTElORVM7CisgICAgfQorCisgICAgaWYgKHNjcmVlbnBhZCkKKyAgICAgICAgZGVsd2luKHNjcmVlbnBhZCk7CisKKyAgICBjbGVhcigpOworICAgIHJlZnJlc2goKTsKKworICAgIHNjcmVlbnBhZCA9IG5ld3BhZChoZWlnaHQsIHdpZHRoKTsKKworICAgIGlmICh3aWR0aCA+IENPTFMpIHsKKyAgICAgICAgcHggPSAod2lkdGggLSBDT0xTKSAvIDI7CisgICAgICAgIHNtaW54ID0gMDsKKyAgICAgICAgc21heHggPSBDT0xTOworICAgIH0gZWxzZSB7CisgICAgICAgIHB4ID0gMDsKKyAgICAgICAgc21pbnggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgICAgIHNtYXh4ID0gc21pbnggKyB3aWR0aDsKKyAgICB9CisKKyAgICBpZiAoaGVpZ2h0ID4gTElORVMpIHsKKyAgICAgICAgcHkgPSAoaGVpZ2h0IC0gTElORVMpIC8gMjsKKyAgICAgICAgc21pbnkgPSAwOworICAgICAgICBzbWF4eSA9IExJTkVTOworICAgIH0gZWxzZSB7CisgICAgICAgIHB5ID0gMDsKKyAgICAgICAgc21pbnkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKyAgICAgICAgc21heHkgPSBzbWlueSArIGhlaWdodDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGN1cnNlc19yZXNpemUoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICBpZiAoZHNfZ2V0X3dpZHRoKGRzKSA9PSBnd2lkdGggJiYgZHNfZ2V0X2hlaWdodChkcykgPT0gZ2hlaWdodCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZ3dpZHRoID0gZHNfZ2V0X3dpZHRoKGRzKTsKKyAgICBnaGVpZ2h0ID0gZHNfZ2V0X2hlaWdodChkcyk7CisKKyAgICBjdXJzZXNfY2FsY19wYWQoKTsKKyAgICBkcy0+c3VyZmFjZS0+d2lkdGggPSB3aWR0aCAqIEZPTlRfV0lEVEg7CisgICAgZHMtPnN1cmZhY2UtPmhlaWdodCA9IGhlaWdodCAqIEZPTlRfSEVJR0hUOworfQorCisjaWZuZGVmIF9XSU4zMgorI2lmIGRlZmluZWQoU0lHV0lOQ0gpICYmIGRlZmluZWQoS0VZX1JFU0laRSkKK3N0YXRpYyB2b2lkIGN1cnNlc193aW5jaF9oYW5kbGVyKGludCBzaWdudW0pCit7CisgICAgc3RydWN0IHdpbnNpemUgeworICAgICAgICB1bnNpZ25lZCBzaG9ydCB3c19yb3c7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdzX2NvbDsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgd3NfeHBpeGVsOyAgIC8qIHVudXNlZCAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCB3c195cGl4ZWw7ICAgLyogdW51c2VkICovCisgICAgfSB3czsKKworICAgIC8qIHRlcm1pbmFsIHNpemUgY2hhbmdlZCAqLworICAgIGlmIChpb2N0bCgxLCBUSU9DR1dJTlNaLCAmd3MpID09IC0xKQorICAgICAgICByZXR1cm47CisKKyAgICByZXNpemVfdGVybSh3cy53c19yb3csIHdzLndzX2NvbCk7CisgICAgY3Vyc2VzX2NhbGNfcGFkKCk7CisgICAgaW52YWxpZGF0ZSA9IDE7CisKKyAgICAvKiBzb21lIHN5c3RlbXMgcmVxdWlyZSB0aGlzICovCisgICAgc2lnbmFsKFNJR1dJTkNILCBjdXJzZXNfd2luY2hfaGFuZGxlcik7Cit9CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjdXJzZXNfY3Vyc29yX3Bvc2l0aW9uKERpc3BsYXlTdGF0ZSAqZHMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpZiAoeCA+PSAwKSB7CisgICAgICAgIHggPSBzbWlueCArIHggLSBweDsKKyAgICAgICAgeSA9IHNtaW55ICsgeSAtIHB5OworCisgICAgICAgIGlmICh4ID49IDAgJiYgeSA+PSAwICYmIHggPCBDT0xTICYmIHkgPCBMSU5FUykgeworICAgICAgICAgICAgbW92ZSh5LCB4KTsKKyAgICAgICAgICAgIGN1cnNfc2V0KDEpOworICAgICAgICAgICAgLyogaXQgc2VlbXMgdGhhdCBjdXJzX3NldCgxKSBtdXN0IGFsd2F5cyBiZSBjYWxsZWQgYmVmb3JlCisgICAgICAgICAgICAgKiBjdXJzX3NldCgyKSBmb3IgdGhlIGxhdHRlciB0byBoYXZlIGVmZmVjdCAqLworICAgICAgICAgICAgaWYgKCFpc19ncmFwaGljX2NvbnNvbGUoKSkKKyAgICAgICAgICAgICAgICBjdXJzX3NldCgyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN1cnNfc2V0KDApOworfQorCisvKiBnZW5lcmljIGtleWJvYXJkIGNvbnZlcnNpb24gKi8KKworI2luY2x1ZGUgImN1cnNlc19rZXlzLmgiCisKK3N0YXRpYyBrYmRfbGF5b3V0X3QgKmtiZF9sYXlvdXQgPSBOVUxMOworc3RhdGljIGludCBrZXljb2RlMmtleXN5bVtDVVJTRVNfS0VZU107CisKK3N0YXRpYyB2b2lkIGN1cnNlc19yZWZyZXNoKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgaW50IGNociwgbmV4dGNociwga2V5c3ltLCBrZXljb2RlOworCisgICAgaWYgKGludmFsaWRhdGUpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgICAgICBjdXJzZXNfY2FsY19wYWQoKTsKKyAgICAgICAgZHMtPnN1cmZhY2UtPndpZHRoID0gRk9OVF9XSURUSCAqIHdpZHRoOworICAgICAgICBkcy0+c3VyZmFjZS0+aGVpZ2h0ID0gRk9OVF9IRUlHSFQgKiBoZWlnaHQ7CisgICAgICAgIHZnYV9od19pbnZhbGlkYXRlKCk7CisgICAgICAgIGludmFsaWRhdGUgPSAwOworICAgIH0KKworICAgIHZnYV9od190ZXh0X3VwZGF0ZShzY3JlZW4pOworCisgICAgbmV4dGNociA9IEVSUjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICAvKiB3aGlsZSB0aGVyZSBhcmUgYW55IHBlbmRpbmcga2V5IHN0cm9rZXMgdG8gcHJvY2VzcyAqLworICAgICAgICBpZiAobmV4dGNociA9PSBFUlIpCisgICAgICAgICAgICBjaHIgPSBnZXRjaCgpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNociA9IG5leHRjaHI7CisgICAgICAgICAgICBuZXh0Y2hyID0gRVJSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNociA9PSBFUlIpCisgICAgICAgICAgICBicmVhazsKKworI2lmZGVmIEtFWV9SRVNJWkUKKyAgICAgICAgLyogdGhpcyBzaG91bGRuJ3Qgb2NjdXIgd2hlbiB3ZSB1c2UgYSBjdXN0b20gU0lHV0lOQ0ggaGFuZGxlciAqLworICAgICAgICBpZiAoY2hyID09IEtFWV9SRVNJWkUpIHsKKyAgICAgICAgICAgIGNsZWFyKCk7CisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgICAgICBjdXJzZXNfY2FsY19wYWQoKTsKKyAgICAgICAgICAgIGN1cnNlc191cGRhdGUoZHMsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgZHMtPnN1cmZhY2UtPndpZHRoID0gRk9OVF9XSURUSCAqIHdpZHRoOworICAgICAgICAgICAgZHMtPnN1cmZhY2UtPmhlaWdodCA9IEZPTlRfSEVJR0hUICogaGVpZ2h0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGtleWNvZGUgPSBjdXJzZXMya2V5Y29kZVtjaHJdOworICAgICAgICBpZiAoa2V5Y29kZSA9PSAtMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIGFsdCBrZXkgKi8KKyAgICAgICAgaWYgKGtleWNvZGUgPT0gMSkgeworICAgICAgICAgICAgbmV4dGNociA9IGdldGNoKCk7CisKKyAgICAgICAgICAgIGlmIChuZXh0Y2hyICE9IEVSUikgeworICAgICAgICAgICAgICAgIGtleWNvZGUgPSBjdXJzZXMya2V5Y29kZVtuZXh0Y2hyXTsKKyAgICAgICAgICAgICAgICBuZXh0Y2hyID0gRVJSOworICAgICAgICAgICAgICAgIGlmIChrZXljb2RlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGtleWNvZGUgfD0gQUxUOworCisgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBrZXlzIHJlc2VydmVkIGZvciBxZW11ICovCisgICAgICAgICAgICAgICAgaWYgKGtleWNvZGUgPj0gUUVNVV9LRVlfQ09OU09MRTAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGUgPCBRRU1VX0tFWV9DT05TT0xFMCArIDkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd25vdXRyZWZyZXNoKHN0ZHNjcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVfc2VsZWN0KGtleWNvZGUgLSBRRU1VX0tFWV9DT05TT0xFMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChrYmRfbGF5b3V0ICYmICEoa2V5Y29kZSAmIEdSRVkpKSB7CisgICAgICAgICAgICBrZXlzeW0gPSBrZXljb2RlMmtleXN5bVtrZXljb2RlICYgS0VZX01BU0tdOworICAgICAgICAgICAgaWYgKGtleXN5bSA9PSAtMSkKKyAgICAgICAgICAgICAgICBrZXlzeW0gPSBjaHI7CisKKyAgICAgICAgICAgIGtleWNvZGUgJj0gfktFWV9NQVNLOworICAgICAgICAgICAga2V5Y29kZSB8PSBrZXlzeW0yc2NhbmNvZGUoa2JkX2xheW91dCwga2V5c3ltKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc19ncmFwaGljX2NvbnNvbGUoKSkgeworICAgICAgICAgICAgLyogc2luY2UgdGVybWluYWxzIGRvbid0IGtub3cgYWJvdXQga2V5IHByZXNzIGFuZCByZWxlYXNlCisgICAgICAgICAgICAgKiBldmVudHMsIHdlIG5lZWQgdG8gZW1pdCBib3RoIGZvciBlYWNoIGtleSByZWNlaXZlZCAqLworICAgICAgICAgICAgaWYgKGtleWNvZGUgJiBTSElGVCkKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleWNvZGUoU0hJRlRfQ09ERSk7CisgICAgICAgICAgICBpZiAoa2V5Y29kZSAmIENOVFJMKQorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShDTlRSTF9DT0RFKTsKKyAgICAgICAgICAgIGlmIChrZXljb2RlICYgQUxUKQorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShBTFRfQ09ERSk7CisgICAgICAgICAgICBpZiAoa2V5Y29kZSAmIEdSRVkpCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKEdSRVlfQ09ERSk7CisgICAgICAgICAgICBrYmRfcHV0X2tleWNvZGUoa2V5Y29kZSAmIEtFWV9NQVNLKTsKKyAgICAgICAgICAgIGlmIChrZXljb2RlICYgR1JFWSkKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleWNvZGUoR1JFWV9DT0RFKTsKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZSgoa2V5Y29kZSAmIEtFWV9NQVNLKSB8IEtFWV9SRUxFQVNFKTsKKyAgICAgICAgICAgIGlmIChrZXljb2RlICYgQUxUKQorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShBTFRfQ09ERSB8IEtFWV9SRUxFQVNFKTsKKyAgICAgICAgICAgIGlmIChrZXljb2RlICYgQ05UUkwpCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKENOVFJMX0NPREUgfCBLRVlfUkVMRUFTRSk7CisgICAgICAgICAgICBpZiAoa2V5Y29kZSAmIFNISUZUKQorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShTSElGVF9DT0RFIHwgS0VZX1JFTEVBU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga2V5c3ltID0gY3Vyc2VzMmtleXN5bVtjaHJdOworICAgICAgICAgICAgaWYgKGtleXN5bSA9PSAtMSkKKyAgICAgICAgICAgICAgICBrZXlzeW0gPSBjaHI7CisKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKGtleXN5bSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGN1cnNlc19jbGVhbnVwKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBlbmR3aW4oKTsKK30KKworc3RhdGljIHZvaWQgY3Vyc2VzX2F0ZXhpdCh2b2lkKQoreworICAgIGN1cnNlc19jbGVhbnVwKE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjdXJzZXNfc2V0dXAodm9pZCkKK3sKKyAgICBpbnQgaSwgY29sb3VyX2RlZmF1bHRbOF0gPSB7CisgICAgICAgIENPTE9SX0JMQUNLLCBDT0xPUl9CTFVFLCBDT0xPUl9HUkVFTiwgQ09MT1JfQ1lBTiwKKyAgICAgICAgQ09MT1JfUkVELCBDT0xPUl9NQUdFTlRBLCBDT0xPUl9ZRUxMT1csIENPTE9SX1dISVRFLAorICAgIH07CisKKyAgICAvKiBpbnB1dCBhcyByYXcgYXMgcG9zc2libGUsIGxldCBldmVyeXRoaW5nIGJlIGludGVycHJldGVkCisgICAgICogYnkgdGhlIGd1ZXN0IHN5c3RlbSAqLworICAgIGluaXRzY3IoKTsgbm9lY2hvKCk7IGludHJmbHVzaChzdGRzY3IsIEZBTFNFKTsKKyAgICBub2RlbGF5KHN0ZHNjciwgVFJVRSk7IG5vbmwoKTsga2V5cGFkKHN0ZHNjciwgVFJVRSk7CisgICAgc3RhcnRfY29sb3IoKTsgcmF3KCk7IHNjcm9sbG9rKHN0ZHNjciwgRkFMU0UpOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICsrKQorICAgICAgICBpbml0X3BhaXIoaSwgY29sb3VyX2RlZmF1bHRbaSAmIDddLCBjb2xvdXJfZGVmYXVsdFtpID4+IDNdKTsKK30KKworc3RhdGljIHZvaWQgY3Vyc2VzX2tleWJvYXJkX3NldHVwKHZvaWQpCit7CisgICAgaW50IGksIGtleWNvZGUsIGtleXN5bTsKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorICAgIC8qIGFsd2F5cyB1c2UgZ2VuZXJpYyBrZXltYXBzICovCisgICAgaWYgKCFrZXlib2FyZF9sYXlvdXQpCisgICAgICAgIGtleWJvYXJkX2xheW91dCA9ICJlbi11cyI7CisjZW5kaWYKKyAgICBpZihrZXlib2FyZF9sYXlvdXQpIHsKKyAgICAgICAga2JkX2xheW91dCA9IGluaXRfa2V5Ym9hcmRfbGF5b3V0KG5hbWUya2V5c3ltLCBrZXlib2FyZF9sYXlvdXQpOworICAgICAgICBpZiAoIWtiZF9sYXlvdXQpCisgICAgICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBDVVJTRVNfS0VZUzsgaSArKykKKyAgICAgICAga2V5Y29kZTJrZXlzeW1baV0gPSAtMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDVVJTRVNfS0VZUzsgaSArKykgeworICAgICAgICBpZiAoY3Vyc2VzMmtleWNvZGVbaV0gPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBrZXljb2RlID0gY3Vyc2VzMmtleWNvZGVbaV0gJiBLRVlfTUFTSzsKKyAgICAgICAgaWYgKGtleWNvZGUya2V5c3ltW2tleWNvZGVdID49IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKGtleXN5bSA9IDA7IGtleXN5bSA8IENVUlNFU19LRVlTOyBrZXlzeW0gKyspCisgICAgICAgICAgICBpZiAoY3Vyc2VzMmtleWNvZGVba2V5c3ltXSA9PSBrZXljb2RlKSB7CisgICAgICAgICAgICAgICAga2V5Y29kZTJrZXlzeW1ba2V5Y29kZV0gPSBrZXlzeW07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKGtleXN5bSA+PSBDVVJTRVNfS0VZUykKKyAgICAgICAgICAgIGtleWNvZGUya2V5c3ltW2tleWNvZGVdID0gaTsKKyAgICB9Cit9CisKK3ZvaWQgY3Vyc2VzX2Rpc3BsYXlfaW5pdChEaXNwbGF5U3RhdGUgKmRzLCBpbnQgZnVsbF9zY3JlZW4pCit7CisgICAgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2w7CisjaWZuZGVmIF9XSU4zMgorICAgIGlmICghaXNhdHR5KDEpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2UgbmVlZCBhIHRlcm1pbmFsIG91dHB1dFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorI2VuZGlmCisKKyAgICBjdXJzZXNfc2V0dXAoKTsKKyAgICBjdXJzZXNfa2V5Ym9hcmRfc2V0dXAoKTsKKyAgICBhdGV4aXQoY3Vyc2VzX2F0ZXhpdCk7CisKKyNpZm5kZWYgX1dJTjMyCisjaWYgZGVmaW5lZChTSUdXSU5DSCkgJiYgZGVmaW5lZChLRVlfUkVTSVpFKQorICAgIC8qIHNvbWUgY3Vyc2VzIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIGEgaGFuZGxlciwgYnV0IHdlCisgICAgICogd2FudCB0byBiZSBzdXJlIHRoaXMgaXMgaGFuZGxlZCByZWdhcmRsZXNzIG9mIHRoZSBsaWJyYXJ5ICovCisgICAgc2lnbmFsKFNJR1dJTkNILCBjdXJzZXNfd2luY2hfaGFuZGxlcik7CisjZW5kaWYKKyNlbmRpZgorCisgICAgZGNsID0gKERpc3BsYXlDaGFuZ2VMaXN0ZW5lciAqKSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlDaGFuZ2VMaXN0ZW5lcikpOworICAgIGRjbC0+ZHB5X3VwZGF0ZSA9IGN1cnNlc191cGRhdGU7CisgICAgZGNsLT5kcHlfcmVzaXplID0gY3Vyc2VzX3Jlc2l6ZTsKKyAgICBkY2wtPmRweV9yZWZyZXNoID0gY3Vyc2VzX3JlZnJlc2g7CisgICAgZGNsLT5kcHlfdGV4dF9jdXJzb3IgPSBjdXJzZXNfY3Vyc29yX3Bvc2l0aW9uOworICAgIHJlZ2lzdGVyX2Rpc3BsYXljaGFuZ2VsaXN0ZW5lcihkcywgZGNsKTsKKyAgICBxZW11X2ZyZWVfZGlzcGxheXN1cmZhY2UoZHMpOworICAgIGRzLT5zdXJmYWNlID0gcWVtdV9jcmVhdGVfZGlzcGxheXN1cmZhY2VfZnJvbSg2NDAsIDQwMCwgMCwgMCwgKHVpbnQ4X3QqKSBzY3JlZW4pOworCisgICAgaW52YWxpZGF0ZSA9IDE7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL2N1cnNlc19rZXlzLmggYi9hbmRyb2lkL3FlbXUxL3VpL2N1cnNlc19rZXlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyMmE4OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvY3Vyc2VzX2tleXMuaApAQCAtMCwwICsxLDQ4MyBAQAorLyoKKyAqIEtleWNvZGUgYW5kIGtleXN5bXMgY29udmVyc2lvbiB0YWJsZXMgZm9yIGN1cnNlcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyemVqIFphYm9yb3dza2kgIDxiYWxyb2dAemFib3Iub3JnPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAia2V5bWFwcy5oIgorCisKKyNkZWZpbmUgS0VZX1JFTEVBU0UgICAgICAgICAweDgwCisjZGVmaW5lIEtFWV9NQVNLICAgICAgICAgICAgMHg3ZgorI2RlZmluZSBTSElGVF9DT0RFICAgICAgICAgIDB4MmEKKyNkZWZpbmUgU0hJRlQgICAgICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgR1JFWV9DT0RFICAgICAgICAgICAweGUwCisjZGVmaW5lIEdSRVkgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIENOVFJMX0NPREUgICAgICAgICAgMHgxZAorI2RlZmluZSBDTlRSTCAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBBTFRfQ09ERSAgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgQUxUICAgICAgICAgICAgICAgICAweDA0MDAKKworLyogY3Vyc2VzIHdvbid0IGRldGVjdCBhIENvbnRyb2wgKyBBbHQgKyAxLCBzbyB1c2UgQWx0ICsgMSAqLworI2RlZmluZSBRRU1VX0tFWV9DT05TT0xFMCAgICgyIHwgQUxUKSAgIC8qIChjdXJzZXMya2V5Y29kZVsnMSddIHwgQUxUKSAqLworCisjZGVmaW5lIENVUlNFU19LRVlTICAgICAgICAgS0VZX01BWCAgICAgLyogS0VZX01BWCBkZWZpbmVkIGluIDxjdXJzZXMuaD4gKi8KKworc3RhdGljIGNvbnN0IGludCBjdXJzZXMya2V5Y29kZVtDVVJTRVNfS0VZU10gPSB7CisgICAgWzAgLi4uIChDVVJTRVNfS0VZUyAtIDEpXSA9IC0xLAorCisgICAgWzB4MDFiXSA9IDEsIC8qIEVzY2FwZSAqLworICAgIFsnMSddID0gMiwKKyAgICBbJzInXSA9IDMsCisgICAgWyczJ10gPSA0LAorICAgIFsnNCddID0gNSwKKyAgICBbJzUnXSA9IDYsCisgICAgWyc2J10gPSA3LAorICAgIFsnNyddID0gOCwKKyAgICBbJzgnXSA9IDksCisgICAgWyc5J10gPSAxMCwKKyAgICBbJzAnXSA9IDExLAorICAgIFsnLSddID0gMTIsCisgICAgWyc9J10gPSAxMywKKyAgICBbMHgwN2ZdID0gMTQsIC8qIEJhY2tzcGFjZSAqLworICAgIFsweDEwN10gPSAxNCwgLyogQmFja3NwYWNlICovCisKKyAgICBbJ1x0J10gPSAxNSwgLyogVGFiICovCisgICAgWydxJ10gPSAxNiwKKyAgICBbJ3cnXSA9IDE3LAorICAgIFsnZSddID0gMTgsCisgICAgWydyJ10gPSAxOSwKKyAgICBbJ3QnXSA9IDIwLAorICAgIFsneSddID0gMjEsCisgICAgWyd1J10gPSAyMiwKKyAgICBbJ2knXSA9IDIzLAorICAgIFsnbyddID0gMjQsCisgICAgWydwJ10gPSAyNSwKKyAgICBbJ1snXSA9IDI2LAorICAgIFsnXSddID0gMjcsCisgICAgWydcbiddID0gMjgsIC8qIFJldHVybiAqLworICAgIFsnXHInXSA9IDI4LCAvKiBSZXR1cm4gKi8KKyAgICBbMHgxNTddID0gMjgsIC8qIFJldHVybiAqLworCisgICAgWydhJ10gPSAzMCwKKyAgICBbJ3MnXSA9IDMxLAorICAgIFsnZCddID0gMzIsCisgICAgWydmJ10gPSAzMywKKyAgICBbJ2cnXSA9IDM0LAorICAgIFsnaCddID0gMzUsCisgICAgWydqJ10gPSAzNiwKKyAgICBbJ2snXSA9IDM3LAorICAgIFsnbCddID0gMzgsCisgICAgWyc7J10gPSAzOSwKKyAgICBbJ1wnJ10gPSA0MCwgLyogU2luZ2xlIHF1b3RlICovCisgICAgWydgJ10gPSA0MSwKKyAgICBbJ1xcJ10gPSA0MywgLyogQmFja3NsYXNoICovCisKKyAgICBbJ3onXSA9IDQ0LAorICAgIFsneCddID0gNDUsCisgICAgWydjJ10gPSA0NiwKKyAgICBbJ3YnXSA9IDQ3LAorICAgIFsnYiddID0gNDgsCisgICAgWyduJ10gPSA0OSwKKyAgICBbJ20nXSA9IDUwLAorICAgIFsnLCddID0gNTEsCisgICAgWycuJ10gPSA1MiwKKyAgICBbJy8nXSA9IDUzLAorCisgICAgWycgJ10gPSA1NywKKworICAgIFsweDEwOV0gPSA1OSwgLyogRnVuY3Rpb24gS2V5IDEgKi8KKyAgICBbMHgxMGFdID0gNjAsIC8qIEZ1bmN0aW9uIEtleSAyICovCisgICAgWzB4MTBiXSA9IDYxLCAvKiBGdW5jdGlvbiBLZXkgMyAqLworICAgIFsweDEwY10gPSA2MiwgLyogRnVuY3Rpb24gS2V5IDQgKi8KKyAgICBbMHgxMGRdID0gNjMsIC8qIEZ1bmN0aW9uIEtleSA1ICovCisgICAgWzB4MTBlXSA9IDY0LCAvKiBGdW5jdGlvbiBLZXkgNiAqLworICAgIFsweDEwZl0gPSA2NSwgLyogRnVuY3Rpb24gS2V5IDcgKi8KKyAgICBbMHgxMTBdID0gNjYsIC8qIEZ1bmN0aW9uIEtleSA4ICovCisgICAgWzB4MTExXSA9IDY3LCAvKiBGdW5jdGlvbiBLZXkgOSAqLworICAgIFsweDExMl0gPSA2OCwgLyogRnVuY3Rpb24gS2V5IDEwICovCisgICAgWzB4MTEzXSA9IDg3LCAvKiBGdW5jdGlvbiBLZXkgMTEgKi8KKyAgICBbMHgxMTRdID0gODgsIC8qIEZ1bmN0aW9uIEtleSAxMiAqLworCisgICAgWzB4MTA2XSA9IDcxIHwgR1JFWSwgLyogSG9tZSAqLworICAgIFsweDEwM10gPSA3MiB8IEdSRVksIC8qIFVwIEFycm93ICovCisgICAgWzB4MTUzXSA9IDczIHwgR1JFWSwgLyogUGFnZSBVcCAqLworICAgIFsweDEwNF0gPSA3NSB8IEdSRVksIC8qIExlZnQgQXJyb3cgKi8KKyAgICBbMHgxMDVdID0gNzcgfCBHUkVZLCAvKiBSaWdodCBBcnJvdyAqLworICAgIFsweDE2OF0gPSA3OSB8IEdSRVksIC8qIEVuZCAqLworICAgIFsweDEwMl0gPSA4MCB8IEdSRVksIC8qIERvd24gQXJyb3cgKi8KKyAgICBbMHgxNTJdID0gODEgfCBHUkVZLCAvKiBQYWdlIERvd24gKi8KKyAgICBbMHgxNGJdID0gODIgfCBHUkVZLCAvKiBJbnNlcnQgKi8KKyAgICBbMHgxNGFdID0gODMgfCBHUkVZLCAvKiBEZWxldGUgKi8KKworICAgIFsnISddID0gMiB8IFNISUZULAorICAgIFsnQCddID0gMyB8IFNISUZULAorICAgIFsnIyddID0gNCB8IFNISUZULAorICAgIFsnJCddID0gNSB8IFNISUZULAorICAgIFsnJSddID0gNiB8IFNISUZULAorICAgIFsnXiddID0gNyB8IFNISUZULAorICAgIFsnJiddID0gOCB8IFNISUZULAorICAgIFsnKiddID0gOSB8IFNISUZULAorICAgIFsnKCddID0gMTAgfCBTSElGVCwKKyAgICBbJyknXSA9IDExIHwgU0hJRlQsCisgICAgWydfJ10gPSAxMiB8IFNISUZULAorICAgIFsnKyddID0gMTMgfCBTSElGVCwKKworICAgIFsweDE2MV0gPSAxNSB8IFNISUZULCAvKiBTaGlmdCArIFRhYiAqLworICAgIFsnUSddID0gMTYgfCBTSElGVCwKKyAgICBbJ1cnXSA9IDE3IHwgU0hJRlQsCisgICAgWydFJ10gPSAxOCB8IFNISUZULAorICAgIFsnUiddID0gMTkgfCBTSElGVCwKKyAgICBbJ1QnXSA9IDIwIHwgU0hJRlQsCisgICAgWydZJ10gPSAyMSB8IFNISUZULAorICAgIFsnVSddID0gMjIgfCBTSElGVCwKKyAgICBbJ0knXSA9IDIzIHwgU0hJRlQsCisgICAgWydPJ10gPSAyNCB8IFNISUZULAorICAgIFsnUCddID0gMjUgfCBTSElGVCwKKyAgICBbJ3snXSA9IDI2IHwgU0hJRlQsCisgICAgWyd9J10gPSAyNyB8IFNISUZULAorCisgICAgWydBJ10gPSAzMCB8IFNISUZULAorICAgIFsnUyddID0gMzEgfCBTSElGVCwKKyAgICBbJ0QnXSA9IDMyIHwgU0hJRlQsCisgICAgWydGJ10gPSAzMyB8IFNISUZULAorICAgIFsnRyddID0gMzQgfCBTSElGVCwKKyAgICBbJ0gnXSA9IDM1IHwgU0hJRlQsCisgICAgWydKJ10gPSAzNiB8IFNISUZULAorICAgIFsnSyddID0gMzcgfCBTSElGVCwKKyAgICBbJ0wnXSA9IDM4IHwgU0hJRlQsCisgICAgWyc6J10gPSAzOSB8IFNISUZULAorICAgIFsnIiddID0gNDAgfCBTSElGVCwKKyAgICBbJ34nXSA9IDQxIHwgU0hJRlQsCisgICAgWyd8J10gPSA0MyB8IFNISUZULAorCisgICAgWydaJ10gPSA0NCB8IFNISUZULAorICAgIFsnWCddID0gNDUgfCBTSElGVCwKKyAgICBbJ0MnXSA9IDQ2IHwgU0hJRlQsCisgICAgWydWJ10gPSA0NyB8IFNISUZULAorICAgIFsnQiddID0gNDggfCBTSElGVCwKKyAgICBbJ04nXSA9IDQ5IHwgU0hJRlQsCisgICAgWydNJ10gPSA1MCB8IFNISUZULAorICAgIFsnPCddID0gNTEgfCBTSElGVCwKKyAgICBbJz4nXSA9IDUyIHwgU0hJRlQsCisgICAgWyc/J10gPSA1MyB8IFNISUZULAorCisgICAgWzB4MTE1XSA9IDU5IHwgU0hJRlQsIC8qIFNoaWZ0ICsgRnVuY3Rpb24gS2V5IDEgKi8KKyAgICBbMHgxMTZdID0gNjAgfCBTSElGVCwgLyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgMiAqLworICAgIFsweDExN10gPSA2MSB8IFNISUZULCAvKiBTaGlmdCArIEZ1bmN0aW9uIEtleSAzICovCisgICAgWzB4MTE4XSA9IDYyIHwgU0hJRlQsIC8qIFNoaWZ0ICsgRnVuY3Rpb24gS2V5IDQgKi8KKyAgICBbMHgxMTldID0gNjMgfCBTSElGVCwgLyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgNSAqLworICAgIFsweDExYV0gPSA2NCB8IFNISUZULCAvKiBTaGlmdCArIEZ1bmN0aW9uIEtleSA2ICovCisgICAgWzB4MTFiXSA9IDY1IHwgU0hJRlQsIC8qIFNoaWZ0ICsgRnVuY3Rpb24gS2V5IDcgKi8KKyAgICBbMHgxMWNdID0gNjYgfCBTSElGVCwgLyogU2hpZnQgKyBGdW5jdGlvbiBLZXkgOCAqLworCisgICAgWzB4MDExXSA9IDE2IHwgQ05UUkwsIC8qIENvbnRyb2wgKyBxICovCisgICAgWzB4MDE3XSA9IDE3IHwgQ05UUkwsIC8qIENvbnRyb2wgKyB3ICovCisgICAgWzB4MDA1XSA9IDE4IHwgQ05UUkwsIC8qIENvbnRyb2wgKyBlICovCisgICAgWzB4MDEyXSA9IDE5IHwgQ05UUkwsIC8qIENvbnRyb2wgKyByICovCisgICAgWzB4MDE0XSA9IDIwIHwgQ05UUkwsIC8qIENvbnRyb2wgKyB0ICovCisgICAgWzB4MDE5XSA9IDIxIHwgQ05UUkwsIC8qIENvbnRyb2wgKyB5ICovCisgICAgWzB4MDE1XSA9IDIyIHwgQ05UUkwsIC8qIENvbnRyb2wgKyB1ICovCisgICAgLyogQ29udHJvbCArIGkgY29sbGlkZXMgd2l0aCBUYWIgKi8KKyAgICBbMHgwMGZdID0gMjQgfCBDTlRSTCwgLyogQ29udHJvbCArIG8gKi8KKyAgICBbMHgwMTBdID0gMjUgfCBDTlRSTCwgLyogQ29udHJvbCArIHAgKi8KKworICAgIFsweDAwMV0gPSAzMCB8IENOVFJMLCAvKiBDb250cm9sICsgYSAqLworICAgIFsweDAxM10gPSAzMSB8IENOVFJMLCAvKiBDb250cm9sICsgcyAqLworICAgIFsweDAwNF0gPSAzMiB8IENOVFJMLCAvKiBDb250cm9sICsgZCAqLworICAgIFsweDAwNl0gPSAzMyB8IENOVFJMLCAvKiBDb250cm9sICsgZiAqLworICAgIFsweDAwN10gPSAzNCB8IENOVFJMLCAvKiBDb250cm9sICsgZyAqLworICAgIFsweDAwOF0gPSAzNSB8IENOVFJMLCAvKiBDb250cm9sICsgaCAqLworICAgIC8qIENvbnRyb2wgKyBqIGNvbGxpZGVzIHdpdGggUmV0dXJuICovCisgICAgWzB4MDBiXSA9IDM3IHwgQ05UUkwsIC8qIENvbnRyb2wgKyBrICovCisgICAgWzB4MDBjXSA9IDM4IHwgQ05UUkwsIC8qIENvbnRyb2wgKyBsICovCisKKyAgICBbMHgwMWFdID0gNDQgfCBDTlRSTCwgLyogQ29udHJvbCArIHogKi8KKyAgICBbMHgwMThdID0gNDUgfCBDTlRSTCwgLyogQ29udHJvbCArIHggKi8KKyAgICBbMHgwMDNdID0gNDYgfCBDTlRSTCwgLyogQ29udHJvbCArIGMgKi8KKyAgICBbMHgwMTZdID0gNDcgfCBDTlRSTCwgLyogQ29udHJvbCArIHYgKi8KKyAgICBbMHgwMDJdID0gNDggfCBDTlRSTCwgLyogQ29udHJvbCArIGIgKi8KKyAgICBbMHgwMGVdID0gNDkgfCBDTlRSTCwgLyogQ29udHJvbCArIG4gKi8KKyAgICAvKiBDb250cm9sICsgbSBjb2xsaWRlcyB3aXRoIHRoZSBrZXljb2RlIGZvciBFbnRlciAqLworCit9OworCitzdGF0aWMgY29uc3QgaW50IGN1cnNlczJrZXlzeW1bQ1VSU0VTX0tFWVNdID0geworICAgIFswIC4uLiAoQ1VSU0VTX0tFWVMgLSAxKV0gPSAtMSwKKworICAgIFsnXG4nXSA9ICdcbicsCisgICAgWydcciddID0gJ1xuJywKKworICAgIFsweDA3Zl0gPSBRRU1VX0tFWV9CQUNLU1BBQ0UsCisKKyAgICBbMHgxMDJdID0gUUVNVV9LRVlfRE9XTiwKKyAgICBbMHgxMDNdID0gUUVNVV9LRVlfVVAsCisgICAgWzB4MTA0XSA9IFFFTVVfS0VZX0xFRlQsCisgICAgWzB4MTA1XSA9IFFFTVVfS0VZX1JJR0hULAorICAgIFsweDEwNl0gPSBRRU1VX0tFWV9IT01FLAorICAgIFsweDEwN10gPSBRRU1VX0tFWV9CQUNLU1BBQ0UsCisKKyAgICBbMHgxNGFdID0gUUVNVV9LRVlfREVMRVRFLAorICAgIFsweDE1Ml0gPSBRRU1VX0tFWV9QQUdFRE9XTiwKKyAgICBbMHgxNTNdID0gUUVNVV9LRVlfUEFHRVVQLAorICAgIFsweDE1N10gPSAnXG4nLAorICAgIFsweDE2OF0gPSBRRU1VX0tFWV9FTkQsCisKK307CisKK3N0YXRpYyBjb25zdCBuYW1lMmtleXN5bV90IG5hbWUya2V5c3ltW10gPSB7CisgICAgLyogUGxhaW4gQVNDSUkgKi8KKyAgICB7ICJzcGFjZSIsIDB4MDIwIH0sCisgICAgeyAiZXhjbGFtIiwgMHgwMjEgfSwKKyAgICB7ICJxdW90ZWRibCIsIDB4MDIyIH0sCisgICAgeyAibnVtYmVyc2lnbiIsIDB4MDIzIH0sCisgICAgeyAiZG9sbGFyIiwgMHgwMjQgfSwKKyAgICB7ICJwZXJjZW50IiwgMHgwMjUgfSwKKyAgICB7ICJhbXBlcnNhbmQiLCAweDAyNiB9LAorICAgIHsgImFwb3N0cm9waGUiLCAweDAyNyB9LAorICAgIHsgInBhcmVubGVmdCIsIDB4MDI4IH0sCisgICAgeyAicGFyZW5yaWdodCIsIDB4MDI5IH0sCisgICAgeyAiYXN0ZXJpc2siLCAweDAyYSB9LAorICAgIHsgInBsdXMiLCAweDAyYiB9LAorICAgIHsgImNvbW1hIiwgMHgwMmMgfSwKKyAgICB7ICJtaW51cyIsIDB4MDJkIH0sCisgICAgeyAicGVyaW9kIiwgMHgwMmUgfSwKKyAgICB7ICJzbGFzaCIsIDB4MDJmIH0sCisgICAgeyAiMCIsIDB4MDMwIH0sCisgICAgeyAiMSIsIDB4MDMxIH0sCisgICAgeyAiMiIsIDB4MDMyIH0sCisgICAgeyAiMyIsIDB4MDMzIH0sCisgICAgeyAiNCIsIDB4MDM0IH0sCisgICAgeyAiNSIsIDB4MDM1IH0sCisgICAgeyAiNiIsIDB4MDM2IH0sCisgICAgeyAiNyIsIDB4MDM3IH0sCisgICAgeyAiOCIsIDB4MDM4IH0sCisgICAgeyAiOSIsIDB4MDM5IH0sCisgICAgeyAiY29sb24iLCAweDAzYSB9LAorICAgIHsgInNlbWljb2xvbiIsIDB4MDNiIH0sCisgICAgeyAibGVzcyIsIDB4MDNjIH0sCisgICAgeyAiZXF1YWwiLCAweDAzZCB9LAorICAgIHsgImdyZWF0ZXIiLCAweDAzZSB9LAorICAgIHsgInF1ZXN0aW9uIiwgMHgwM2YgfSwKKyAgICB7ICJhdCIsIDB4MDQwIH0sCisgICAgeyAiQSIsIDB4MDQxIH0sCisgICAgeyAiQiIsIDB4MDQyIH0sCisgICAgeyAiQyIsIDB4MDQzIH0sCisgICAgeyAiRCIsIDB4MDQ0IH0sCisgICAgeyAiRSIsIDB4MDQ1IH0sCisgICAgeyAiRiIsIDB4MDQ2IH0sCisgICAgeyAiRyIsIDB4MDQ3IH0sCisgICAgeyAiSCIsIDB4MDQ4IH0sCisgICAgeyAiSSIsIDB4MDQ5IH0sCisgICAgeyAiSiIsIDB4MDRhIH0sCisgICAgeyAiSyIsIDB4MDRiIH0sCisgICAgeyAiTCIsIDB4MDRjIH0sCisgICAgeyAiTSIsIDB4MDRkIH0sCisgICAgeyAiTiIsIDB4MDRlIH0sCisgICAgeyAiTyIsIDB4MDRmIH0sCisgICAgeyAiUCIsIDB4MDUwIH0sCisgICAgeyAiUSIsIDB4MDUxIH0sCisgICAgeyAiUiIsIDB4MDUyIH0sCisgICAgeyAiUyIsIDB4MDUzIH0sCisgICAgeyAiVCIsIDB4MDU0IH0sCisgICAgeyAiVSIsIDB4MDU1IH0sCisgICAgeyAiViIsIDB4MDU2IH0sCisgICAgeyAiVyIsIDB4MDU3IH0sCisgICAgeyAiWCIsIDB4MDU4IH0sCisgICAgeyAiWSIsIDB4MDU5IH0sCisgICAgeyAiWiIsIDB4MDVhIH0sCisgICAgeyAiYnJhY2tldGxlZnQiLCAweDA1YiB9LAorICAgIHsgImJhY2tzbGFzaCIsIDB4MDVjIH0sCisgICAgeyAiYnJhY2tldHJpZ2h0IiwgMHgwNWQgfSwKKyAgICB7ICJhc2NpaWNpcmN1bSIsIDB4MDVlIH0sCisgICAgeyAidW5kZXJzY29yZSIsIDB4MDVmIH0sCisgICAgeyAiZ3JhdmUiLCAweDA2MCB9LAorICAgIHsgImEiLCAweDA2MSB9LAorICAgIHsgImIiLCAweDA2MiB9LAorICAgIHsgImMiLCAweDA2MyB9LAorICAgIHsgImQiLCAweDA2NCB9LAorICAgIHsgImUiLCAweDA2NSB9LAorICAgIHsgImYiLCAweDA2NiB9LAorICAgIHsgImciLCAweDA2NyB9LAorICAgIHsgImgiLCAweDA2OCB9LAorICAgIHsgImkiLCAweDA2OSB9LAorICAgIHsgImoiLCAweDA2YSB9LAorICAgIHsgImsiLCAweDA2YiB9LAorICAgIHsgImwiLCAweDA2YyB9LAorICAgIHsgIm0iLCAweDA2ZCB9LAorICAgIHsgIm4iLCAweDA2ZSB9LAorICAgIHsgIm8iLCAweDA2ZiB9LAorICAgIHsgInAiLCAweDA3MCB9LAorICAgIHsgInEiLCAweDA3MSB9LAorICAgIHsgInIiLCAweDA3MiB9LAorICAgIHsgInMiLCAweDA3MyB9LAorICAgIHsgInQiLCAweDA3NCB9LAorICAgIHsgInUiLCAweDA3NSB9LAorICAgIHsgInYiLCAweDA3NiB9LAorICAgIHsgInciLCAweDA3NyB9LAorICAgIHsgIngiLCAweDA3OCB9LAorICAgIHsgInkiLCAweDA3OSB9LAorICAgIHsgInoiLCAweDA3YSB9LAorICAgIHsgImJyYWNlbGVmdCIsIDB4MDdiIH0sCisgICAgeyAiYmFyIiwgMHgwN2MgfSwKKyAgICB7ICJicmFjZXJpZ2h0IiwgMHgwN2QgfSwKKyAgICB7ICJhc2NpaXRpbGRlIiwgMHgwN2UgfSwKKworICAgIC8qIExhdGluLTEgZXh0ZW5zaW9ucyAqLworICAgIHsgIm5vYnJlYWtzcGFjZSIsIDB4MGEwIH0sCisgICAgeyAiZXhjbGFtZG93biIsIDB4MGExIH0sCisgICAgeyAiY2VudCIsIDB4MGEyIH0sCisgICAgeyAic3RlcmxpbmciLCAweDBhMyB9LAorICAgIHsgImN1cnJlbmN5IiwgMHgwYTQgfSwKKyAgICB7ICJ5ZW4iLCAweDBhNSB9LAorICAgIHsgImJyb2tlbmJhciIsIDB4MGE2IH0sCisgICAgeyAic2VjdGlvbiIsIDB4MGE3IH0sCisgICAgeyAiZGlhZXJlc2lzIiwgMHgwYTggfSwKKyAgICB7ICJjb3B5cmlnaHQiLCAweDBhOSB9LAorICAgIHsgIm9yZGZlbWluaW5lIiwgMHgwYWEgfSwKKyAgICB7ICJndWlsbGVtb3RsZWZ0IiwgMHgwYWIgfSwKKyAgICB7ICJub3RzaWduIiwgMHgwYWMgfSwKKyAgICB7ICJoeXBoZW4iLCAweDBhZCB9LAorICAgIHsgInJlZ2lzdGVyZWQiLCAweDBhZSB9LAorICAgIHsgIm1hY3JvbiIsIDB4MGFmIH0sCisgICAgeyAiZGVncmVlIiwgMHgwYjAgfSwKKyAgICB7ICJwbHVzbWludXMiLCAweDBiMSB9LAorICAgIHsgInR3b3N1cGVyaW9yIiwgMHgwYjIgfSwKKyAgICB7ICJ0aHJlZXN1cGVyaW9yIiwgMHgwYjMgfSwKKyAgICB7ICJhY3V0ZSIsIDB4MGI0IH0sCisgICAgeyAibXUiLCAweDBiNSB9LAorICAgIHsgInBhcmFncmFwaCIsIDB4MGI2IH0sCisgICAgeyAicGVyaW9kY2VudGVyZWQiLCAweDBiNyB9LAorICAgIHsgImNlZGlsbGEiLCAweDBiOCB9LAorICAgIHsgIm9uZXN1cGVyaW9yIiwgMHgwYjkgfSwKKyAgICB7ICJtYXNjdWxpbmUiLCAweDBiYSB9LAorICAgIHsgImd1aWxsZW1vdHJpZ2h0IiwgMHgwYmIgfSwKKyAgICB7ICJvbmVxdWFydGVyIiwgMHgwYmMgfSwKKyAgICB7ICJvbmVoYWxmIiwgMHgwYmQgfSwKKyAgICB7ICJ0aHJlZXF1YXJ0ZXJzIiwgMHgwYmUgfSwKKyAgICB7ICJxdWVzdGlvbmRvd24iLCAweDBiZiB9LAorICAgIHsgIkFncmF2ZSIsIDB4MGMwIH0sCisgICAgeyAiQWFjdXRlIiwgMHgwYzEgfSwKKyAgICB7ICJBY2lyY3VtZmxleCIsIDB4MGMyIH0sCisgICAgeyAiQXRpbGRlIiwgMHgwYzMgfSwKKyAgICB7ICJBZGlhZXJlc2lzIiwgMHgwYzQgfSwKKyAgICB7ICJBcmluZyIsIDB4MGM1IH0sCisgICAgeyAiQUUiLCAweDBjNiB9LAorICAgIHsgIkNjZWRpbGxhIiwgMHgwYzcgfSwKKyAgICB7ICJFZ3JhdmUiLCAweDBjOCB9LAorICAgIHsgIkVhY3V0ZSIsIDB4MGM5IH0sCisgICAgeyAiRWNpcmN1bWZsZXgiLCAweDBjYSB9LAorICAgIHsgIkVkaWFlcmVzaXMiLCAweDBjYiB9LAorICAgIHsgIklncmF2ZSIsIDB4MGNjIH0sCisgICAgeyAiSWFjdXRlIiwgMHgwY2QgfSwKKyAgICB7ICJJY2lyY3VtZmxleCIsIDB4MGNlIH0sCisgICAgeyAiSWRpYWVyZXNpcyIsIDB4MGNmIH0sCisgICAgeyAiRVRIIiwgMHgwZDAgfSwKKyAgICB7ICJFdGgiLCAweDBkMCB9LAorICAgIHsgIk50aWxkZSIsIDB4MGQxIH0sCisgICAgeyAiT2dyYXZlIiwgMHgwZDIgfSwKKyAgICB7ICJPYWN1dGUiLCAweDBkMyB9LAorICAgIHsgIk9jaXJjdW1mbGV4IiwgMHgwZDQgfSwKKyAgICB7ICJPdGlsZGUiLCAweDBkNSB9LAorICAgIHsgIk9kaWFlcmVzaXMiLCAweDBkNiB9LAorICAgIHsgIm11bHRpcGx5IiwgMHgwZDcgfSwKKyAgICB7ICJPb2JsaXF1ZSIsIDB4MGQ4IH0sCisgICAgeyAiT3NsYXNoIiwgMHgwZDggfSwKKyAgICB7ICJVZ3JhdmUiLCAweDBkOSB9LAorICAgIHsgIlVhY3V0ZSIsIDB4MGRhIH0sCisgICAgeyAiVWNpcmN1bWZsZXgiLCAweDBkYiB9LAorICAgIHsgIlVkaWFlcmVzaXMiLCAweDBkYyB9LAorICAgIHsgIllhY3V0ZSIsIDB4MGRkIH0sCisgICAgeyAiVEhPUk4iLCAweDBkZSB9LAorICAgIHsgIlRob3JuIiwgMHgwZGUgfSwKKyAgICB7ICJzc2hhcnAiLCAweDBkZiB9LAorICAgIHsgImFncmF2ZSIsIDB4MGUwIH0sCisgICAgeyAiYWFjdXRlIiwgMHgwZTEgfSwKKyAgICB7ICJhY2lyY3VtZmxleCIsIDB4MGUyIH0sCisgICAgeyAiYXRpbGRlIiwgMHgwZTMgfSwKKyAgICB7ICJhZGlhZXJlc2lzIiwgMHgwZTQgfSwKKyAgICB7ICJhcmluZyIsIDB4MGU1IH0sCisgICAgeyAiYWUiLCAweDBlNiB9LAorICAgIHsgImNjZWRpbGxhIiwgMHgwZTcgfSwKKyAgICB7ICJlZ3JhdmUiLCAweDBlOCB9LAorICAgIHsgImVhY3V0ZSIsIDB4MGU5IH0sCisgICAgeyAiZWNpcmN1bWZsZXgiLCAweDBlYSB9LAorICAgIHsgImVkaWFlcmVzaXMiLCAweDBlYiB9LAorICAgIHsgImlncmF2ZSIsIDB4MGVjIH0sCisgICAgeyAiaWFjdXRlIiwgMHgwZWQgfSwKKyAgICB7ICJpY2lyY3VtZmxleCIsIDB4MGVlIH0sCisgICAgeyAiaWRpYWVyZXNpcyIsIDB4MGVmIH0sCisgICAgeyAiZXRoIiwgMHgwZjAgfSwKKyAgICB7ICJudGlsZGUiLCAweDBmMSB9LAorICAgIHsgIm9ncmF2ZSIsIDB4MGYyIH0sCisgICAgeyAib2FjdXRlIiwgMHgwZjMgfSwKKyAgICB7ICJvY2lyY3VtZmxleCIsIDB4MGY0IH0sCisgICAgeyAib3RpbGRlIiwgMHgwZjUgfSwKKyAgICB7ICJvZGlhZXJlc2lzIiwgMHgwZjYgfSwKKyAgICB7ICJkaXZpc2lvbiIsIDB4MGY3IH0sCisgICAgeyAib3NsYXNoIiwgMHgwZjggfSwKKyAgICB7ICJvb2JsaXF1ZSIsIDB4MGY4IH0sCisgICAgeyAidWdyYXZlIiwgMHgwZjkgfSwKKyAgICB7ICJ1YWN1dGUiLCAweDBmYSB9LAorICAgIHsgInVjaXJjdW1mbGV4IiwgMHgwZmIgfSwKKyAgICB7ICJ1ZGlhZXJlc2lzIiwgMHgwZmMgfSwKKyAgICB7ICJ5YWN1dGUiLCAweDBmZCB9LAorICAgIHsgInRob3JuIiwgMHgwZmUgfSwKKyAgICB7ICJ5ZGlhZXJlc2lzIiwgMHgwZmYgfSwKKworICAgIC8qIFNwZWNpYWwga2V5cyAqLworICAgIHsgIkJhY2tTcGFjZSIsIDB4MDdmIH0sCisgICAgeyAiVGFiIiwgJ1x0JyB9LAorICAgIHsgIlJldHVybiIsICdccicgfSwKKyAgICB7ICJSaWdodCIsIDB4MTA1IH0sCisgICAgeyAiTGVmdCIsIDB4MTA0IH0sCisgICAgeyAiVXAiLCAweDEwMyB9LAorICAgIHsgIkRvd24iLCAweDEwMiB9LAorICAgIHsgIlBhZ2VfRG93biIsIDB4MTUyIH0sCisgICAgeyAiUGFnZV9VcCIsIDB4MTUzIH0sCisgICAgeyAiSW5zZXJ0IiwgMHgxNGIgfSwKKyAgICB7ICJEZWxldGUiLCAweDE0YSB9LAorICAgIHsgIkhvbWUiLCAweDEwNiB9LAorICAgIHsgIkVuZCIsIDB4MTY4IH0sCisgICAgeyAiRjEiLCAweDEwOSB9LAorICAgIHsgIkYyIiwgMHgxMGEgfSwKKyAgICB7ICJGMyIsIDB4MTBiIH0sCisgICAgeyAiRjQiLCAweDEwYyB9LAorICAgIHsgIkY1IiwgMHgxMGQgfSwKKyAgICB7ICJGNiIsIDB4MTBlIH0sCisgICAgeyAiRjciLCAweDEwZiB9LAorICAgIHsgIkY4IiwgMHgxMTAgfSwKKyAgICB7ICJGOSIsIDB4MTExIH0sCisgICAgeyAiRjEwIiwgMHgxMTIgfSwKKyAgICB7ICJGMTEiLCAweDExMyB9LAorICAgIHsgIkYxMiIsIDB4MTE0IH0sCisgICAgeyAiRjEzIiwgMHgxMTUgfSwKKyAgICB7ICJGMTQiLCAweDExNiB9LAorICAgIHsgIkYxNSIsIDB4MTE3IH0sCisgICAgeyAiRjE2IiwgMHgxMTggfSwKKyAgICB7ICJGMTciLCAweDExOSB9LAorICAgIHsgIkYxOCIsIDB4MTFhIH0sCisgICAgeyAiRjE5IiwgMHgxMWIgfSwKKyAgICB7ICJGMjAiLCAweDExYyB9LAorICAgIHsgIkVzY2FwZSIsIDI3IH0sCisKKyAgICB7IE5VTEwsIDAgfSwKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL2QzZGVzLmMgYi9hbmRyb2lkL3FlbXUxL3VpL2QzZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjODQwZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvZDNkZXMuYwpAQCAtMCwwICsxLDQyNCBAQAorLyoKKyAqIFRoaXMgaXMgRDNERVMgKFY1LjA5KSBieSBSaWNoYXJkIE91dGVyYnJpZGdlIHdpdGggdGhlIGRvdWJsZSBhbmQKKyAqIHRyaXBsZS1sZW5ndGggc3VwcG9ydCByZW1vdmVkIGZvciB1c2UgaW4gVk5DLiAgQWxzbyB0aGUgYnl0ZWJpdFtdIGFycmF5CisgKiBoYXMgYmVlbiByZXZlcnNlZCBzbyB0aGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiBlYWNoIGJ5dGUgb2YgdGhlCisgKiBrZXkgaXMgaWdub3JlZCwgbm90IHRoZSBsZWFzdCBzaWduaWZpY2FudC4KKyAqCisgKiBUaGVzZSBjaGFuZ2VzIGFyZToKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVQmVCBMYWJvcmF0b3JpZXMgQ2FtYnJpZGdlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKy8qIEQzREVTIChWNS4wOSkgLQorICoKKyAqIEEgcG9ydGFibGUsIHB1YmxpYyBkb21haW4sIHZlcnNpb24gb2YgdGhlIERhdGEgRW5jcnlwdGlvbiBTdGFuZGFyZC4KKyAqCisgKiBXcml0dGVuIHdpdGggU3ltYW50ZWMncyBUSElOSyAoTGlnaHRzcGVlZCkgQyBieSBSaWNoYXJkIE91dGVyYnJpZGdlLgorICogVGhhbmtzIHRvOiBEYW4gSG9leSBmb3IgaGlzIGV4Y2VsbGVudCBJbml0aWFsIGFuZCBJbnZlcnNlIHBlcm11dGF0aW9uCisgKiBjb2RlOyAgSmltIEdpbGxvZ2x5ICYgUGhpbCBLYXJuIGZvciB0aGUgREVTIGtleSBzY2hlZHVsZSBjb2RlOyBEZW5uaXMKKyAqIEZlcmd1c29uLCBFcmljIFlvdW5nIGFuZCBEYW5hIEhvdyBmb3IgY29tcGFyaW5nIG5vdGVzOyBhbmQgUmF5IExhdSwKKyAqIGZvciBodW1vdXJpbmcgbWUgb24uCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg4LDE5ODksMTk5MCwxOTkxLDE5OTIgYnkgUmljaGFyZCBPdXRlcmJyaWRnZS4KKyAqIChHRW5pZSA6IE9VVEVSOyBDSVMgOiBbNzE3NTUsMjA0XSkgR3JhdmVuIEltYWdlcnksIDE5OTIuCisgKi8KKworI2luY2x1ZGUgImQzZGVzLmgiCisKK3N0YXRpYyB2b2lkIHNjcnVuY2godW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nICopOworc3RhdGljIHZvaWQgdW5zY3J1bih1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGNoYXIgKik7CitzdGF0aWMgdm9pZCBkZXNmdW5jKHVuc2lnbmVkIGxvbmcgKiwgdW5zaWduZWQgbG9uZyAqKTsKK3N0YXRpYyB2b2lkIGNvb2tleSh1bnNpZ25lZCBsb25nICopOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBLbkxbMzJdID0geyAwTCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYnl0ZWJpdFs4XQk9IHsKKwkwMSwgMDIsIDA0LCAwMTAsIDAyMCwgMDQwLCAwMTAwLCAwMjAwIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGJpZ2J5dGVbMjRdID0geworCTB4ODAwMDAwTCwJMHg0MDAwMDBMLAkweDIwMDAwMEwsCTB4MTAwMDAwTCwKKwkweDgwMDAwTCwJMHg0MDAwMEwsCTB4MjAwMDBMLAkweDEwMDAwTCwKKwkweDgwMDBMLAkweDQwMDBMLAkweDIwMDBMLAkweDEwMDBMLAorCTB4ODAwTCwgCTB4NDAwTCwgCTB4MjAwTCwgCTB4MTAwTCwKKwkweDgwTCwJCTB4NDBMLAkJMHgyMEwsCQkweDEwTCwKKwkweDhMLAkJMHg0TCwJCTB4MkwsCQkweDFMCX07CisKKy8qIFVzZSB0aGUga2V5IHNjaGVkdWxlIHNwZWNpZmllZCBpbiB0aGUgU3RhbmRhcmQgKEFOU0kgWDMuOTItMTk4MSkuICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBjMVs1Nl0gPSB7CisJNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgIDgsCSAwLCA1NywgNDksIDQxLCAzMywgMjUsIDE3LAorCSA5LCAgMSwgNTgsIDUwLCA0MiwgMzQsIDI2LAkxOCwgMTAsICAyLCA1OSwgNTEsIDQzLCAzNSwKKwk2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLCAxNCwJIDYsIDYxLCA1MywgNDUsIDM3LCAyOSwgMjEsCisJMTMsICA1LCA2MCwgNTIsIDQ0LCAzNiwgMjgsCTIwLCAxMiwgIDQsIDI3LCAxOSwgMTEsICAzIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRvdHJvdFsxNl0gPSB7CisJMSwyLDQsNiw4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBjMls0OF0gPSB7CisJMTMsIDE2LCAxMCwgMjMsICAwLCAgNCwgIDIsIDI3LCAxNCwgIDUsIDIwLCAgOSwKKwkyMiwgMTgsIDExLCAgMywgMjUsICA3LCAxNSwgIDYsIDI2LCAxOSwgMTIsICAxLAorCTQwLCA1MSwgMzAsIDM2LCA0NiwgNTQsIDI5LCAzOSwgNTAsIDQ0LCAzMiwgNDcsCisJNDMsIDQ4LCAzOCwgNTUsIDMzLCA1MiwgNDUsIDQxLCA0OSwgMzUsIDI4LCAzMSB9OworCisvKiBUaGFua3MgdG8gSmFtZXMgR2lsbG9nbHkgJiBQaGlsIEthcm4hICovCit2b2lkIGRlc2tleSh1bnNpZ25lZCBjaGFyICprZXksIGludCBlZGYpCit7CisJcmVnaXN0ZXIgaW50IGksIGosIGwsIG0sIG47CisJdW5zaWduZWQgY2hhciBwYzFtWzU2XSwgcGNyWzU2XTsKKwl1bnNpZ25lZCBsb25nIGtuWzMyXTsKKworCWZvciAoIGogPSAwOyBqIDwgNTY7IGorKyApIHsKKwkJbCA9IHBjMVtqXTsKKwkJbSA9IGwgJiAwNzsKKwkJcGMxbVtqXSA9IChrZXlbbCA+PiAzXSAmIGJ5dGViaXRbbV0pID8gMSA6IDA7CisJCX0KKwlmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApIHsKKwkJaWYoIGVkZiA9PSBERTEgKSBtID0gKDE1IC0gaSkgPDwgMTsKKwkJZWxzZSBtID0gaSA8PCAxOworCQluID0gbSArIDE7CisJCWtuW21dID0ga25bbl0gPSAwTDsKKwkJZm9yKCBqID0gMDsgaiA8IDI4OyBqKysgKSB7CisJCQlsID0gaiArIHRvdHJvdFtpXTsKKwkJCWlmKCBsIDwgMjggKSBwY3Jbal0gPSBwYzFtW2xdOworCQkJZWxzZSBwY3Jbal0gPSBwYzFtW2wgLSAyOF07CisJCQl9CisJCWZvciggaiA9IDI4OyBqIDwgNTY7IGorKyApIHsKKwkJICAgIGwgPSBqICsgdG90cm90W2ldOworCQkgICAgaWYoIGwgPCA1NiApIHBjcltqXSA9IHBjMW1bbF07CisJCSAgICBlbHNlIHBjcltqXSA9IHBjMW1bbCAtIDI4XTsKKwkJICAgIH0KKwkJZm9yKCBqID0gMDsgaiA8IDI0OyBqKysgKSB7CisJCQlpZiggcGNyW3BjMltqXV0gKSBrblttXSB8PSBiaWdieXRlW2pdOworCQkJaWYoIHBjcltwYzJbaisyNF1dICkga25bbl0gfD0gYmlnYnl0ZVtqXTsKKwkJCX0KKwkJfQorCWNvb2tleShrbik7CisJcmV0dXJuOworCX0KKworc3RhdGljIHZvaWQgY29va2V5KHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnJhdzEpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqY29vaywgKnJhdzA7CisJdW5zaWduZWQgbG9uZyBkb3VnaFszMl07CisJcmVnaXN0ZXIgaW50IGk7CisKKwljb29rID0gZG91Z2g7CisJZm9yKCBpID0gMDsgaSA8IDE2OyBpKyssIHJhdzErKyApIHsKKwkJcmF3MCA9IHJhdzErKzsKKwkJKmNvb2sJID0gKCpyYXcwICYgMHgwMGZjMDAwMEwpIDw8IDY7CisJCSpjb29rCXw9ICgqcmF3MCAmIDB4MDAwMDBmYzBMKSA8PCAxMDsKKwkJKmNvb2sJfD0gKCpyYXcxICYgMHgwMGZjMDAwMEwpID4+IDEwOworCQkqY29vaysrIHw9ICgqcmF3MSAmIDB4MDAwMDBmYzBMKSA+PiA2OworCQkqY29vawkgPSAoKnJhdzAgJiAweDAwMDNmMDAwTCkgPDwgMTI7CisJCSpjb29rCXw9ICgqcmF3MCAmIDB4MDAwMDAwM2ZMKSA8PCAxNjsKKwkJKmNvb2sJfD0gKCpyYXcxICYgMHgwMDAzZjAwMEwpID4+IDQ7CisJCSpjb29rKysgfD0gKCpyYXcxICYgMHgwMDAwMDAzZkwpOworCQl9CisJdXNla2V5KGRvdWdoKTsKKwlyZXR1cm47CisJfQorCit2b2lkIGNwa2V5KHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKmludG8pCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqZnJvbSwgKmVuZHA7CisKKwlmcm9tID0gS25MLCBlbmRwID0gJktuTFszMl07CisJd2hpbGUoIGZyb20gPCBlbmRwICkgKmludG8rKyA9ICpmcm9tKys7CisJcmV0dXJuOworCX0KKwordm9pZCB1c2VrZXkocmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqZnJvbSkKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nICp0bywgKmVuZHA7CisKKwl0byA9IEtuTCwgZW5kcCA9ICZLbkxbMzJdOworCXdoaWxlKCB0byA8IGVuZHAgKSAqdG8rKyA9ICpmcm9tKys7CisJcmV0dXJuOworCX0KKwordm9pZCBkZXModW5zaWduZWQgY2hhciAqaW5ibG9jaywgdW5zaWduZWQgY2hhciAqb3V0YmxvY2spCit7CisJdW5zaWduZWQgbG9uZyB3b3JrWzJdOworCisJc2NydW5jaChpbmJsb2NrLCB3b3JrKTsKKwlkZXNmdW5jKHdvcmssIEtuTCk7CisJdW5zY3J1bih3b3JrLCBvdXRibG9jayk7CisJcmV0dXJuOworCX0KKworc3RhdGljIHZvaWQgc2NydW5jaChyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvdXRvZiwgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqaW50bykKK3sKKwkqaW50bwkgPSAoKm91dG9mKysgJiAweGZmTCkgPDwgMjQ7CisJKmludG8JfD0gKCpvdXRvZisrICYgMHhmZkwpIDw8IDE2OworCSppbnRvCXw9ICgqb3V0b2YrKyAmIDB4ZmZMKSA8PCA4OworCSppbnRvKysgfD0gKCpvdXRvZisrICYgMHhmZkwpOworCSppbnRvCSA9ICgqb3V0b2YrKyAmIDB4ZmZMKSA8PCAyNDsKKwkqaW50bwl8PSAoKm91dG9mKysgJiAweGZmTCkgPDwgMTY7CisJKmludG8JfD0gKCpvdXRvZisrICYgMHhmZkwpIDw8IDg7CisJKmludG8JfD0gKCpvdXRvZiAgICYgMHhmZkwpOworCXJldHVybjsKKwl9CisKK3N0YXRpYyB2b2lkIHVuc2NydW4ocmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqb3V0b2YsIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmludG8pCit7CisJKmludG8rKyA9ICh1bnNpZ25lZCBjaGFyKSgoKm91dG9mID4+IDI0KSAmIDB4ZmZMKTsKKwkqaW50bysrID0gKHVuc2lnbmVkIGNoYXIpKCgqb3V0b2YgPj4gMTYpICYgMHhmZkwpOworCSppbnRvKysgPSAodW5zaWduZWQgY2hhcikoKCpvdXRvZiA+PiAgOCkgJiAweGZmTCk7CisJKmludG8rKyA9ICh1bnNpZ25lZCBjaGFyKSgqb3V0b2YrKwkgJiAweGZmTCk7CisJKmludG8rKyA9ICh1bnNpZ25lZCBjaGFyKSgoKm91dG9mID4+IDI0KSAmIDB4ZmZMKTsKKwkqaW50bysrID0gKHVuc2lnbmVkIGNoYXIpKCgqb3V0b2YgPj4gMTYpICYgMHhmZkwpOworCSppbnRvKysgPSAodW5zaWduZWQgY2hhcikoKCpvdXRvZiA+PiAgOCkgJiAweGZmTCk7CisJKmludG8JPSAgKHVuc2lnbmVkIGNoYXIpKCpvdXRvZgkgJiAweGZmTCk7CisJcmV0dXJuOworCX0KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU1AxWzY0XSA9IHsKKwkweDAxMDEwNDAwTCwgMHgwMDAwMDAwMEwsIDB4MDAwMTAwMDBMLCAweDAxMDEwNDA0TCwKKwkweDAxMDEwMDA0TCwgMHgwMDAxMDQwNEwsIDB4MDAwMDAwMDRMLCAweDAwMDEwMDAwTCwKKwkweDAwMDAwNDAwTCwgMHgwMTAxMDQwMEwsIDB4MDEwMTA0MDRMLCAweDAwMDAwNDAwTCwKKwkweDAxMDAwNDA0TCwgMHgwMTAxMDAwNEwsIDB4MDEwMDAwMDBMLCAweDAwMDAwMDA0TCwKKwkweDAwMDAwNDA0TCwgMHgwMTAwMDQwMEwsIDB4MDEwMDA0MDBMLCAweDAwMDEwNDAwTCwKKwkweDAwMDEwNDAwTCwgMHgwMTAxMDAwMEwsIDB4MDEwMTAwMDBMLCAweDAxMDAwNDA0TCwKKwkweDAwMDEwMDA0TCwgMHgwMTAwMDAwNEwsIDB4MDEwMDAwMDRMLCAweDAwMDEwMDA0TCwKKwkweDAwMDAwMDAwTCwgMHgwMDAwMDQwNEwsIDB4MDAwMTA0MDRMLCAweDAxMDAwMDAwTCwKKwkweDAwMDEwMDAwTCwgMHgwMTAxMDQwNEwsIDB4MDAwMDAwMDRMLCAweDAxMDEwMDAwTCwKKwkweDAxMDEwNDAwTCwgMHgwMTAwMDAwMEwsIDB4MDEwMDAwMDBMLCAweDAwMDAwNDAwTCwKKwkweDAxMDEwMDA0TCwgMHgwMDAxMDAwMEwsIDB4MDAwMTA0MDBMLCAweDAxMDAwMDA0TCwKKwkweDAwMDAwNDAwTCwgMHgwMDAwMDAwNEwsIDB4MDEwMDA0MDRMLCAweDAwMDEwNDA0TCwKKwkweDAxMDEwNDA0TCwgMHgwMDAxMDAwNEwsIDB4MDEwMTAwMDBMLCAweDAxMDAwNDA0TCwKKwkweDAxMDAwMDA0TCwgMHgwMDAwMDQwNEwsIDB4MDAwMTA0MDRMLCAweDAxMDEwNDAwTCwKKwkweDAwMDAwNDA0TCwgMHgwMTAwMDQwMEwsIDB4MDEwMDA0MDBMLCAweDAwMDAwMDAwTCwKKwkweDAwMDEwMDA0TCwgMHgwMDAxMDQwMEwsIDB4MDAwMDAwMDBMLCAweDAxMDEwMDA0TCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBTUDJbNjRdID0geworCTB4ODAxMDgwMjBMLCAweDgwMDA4MDAwTCwgMHgwMDAwODAwMEwsIDB4MDAxMDgwMjBMLAorCTB4MDAxMDAwMDBMLCAweDAwMDAwMDIwTCwgMHg4MDEwMDAyMEwsIDB4ODAwMDgwMjBMLAorCTB4ODAwMDAwMjBMLCAweDgwMTA4MDIwTCwgMHg4MDEwODAwMEwsIDB4ODAwMDAwMDBMLAorCTB4ODAwMDgwMDBMLCAweDAwMTAwMDAwTCwgMHgwMDAwMDAyMEwsIDB4ODAxMDAwMjBMLAorCTB4MDAxMDgwMDBMLCAweDAwMTAwMDIwTCwgMHg4MDAwODAyMEwsIDB4MDAwMDAwMDBMLAorCTB4ODAwMDAwMDBMLCAweDAwMDA4MDAwTCwgMHgwMDEwODAyMEwsIDB4ODAxMDAwMDBMLAorCTB4MDAxMDAwMjBMLCAweDgwMDAwMDIwTCwgMHgwMDAwMDAwMEwsIDB4MDAxMDgwMDBMLAorCTB4MDAwMDgwMjBMLCAweDgwMTA4MDAwTCwgMHg4MDEwMDAwMEwsIDB4MDAwMDgwMjBMLAorCTB4MDAwMDAwMDBMLCAweDAwMTA4MDIwTCwgMHg4MDEwMDAyMEwsIDB4MDAxMDAwMDBMLAorCTB4ODAwMDgwMjBMLCAweDgwMTAwMDAwTCwgMHg4MDEwODAwMEwsIDB4MDAwMDgwMDBMLAorCTB4ODAxMDAwMDBMLCAweDgwMDA4MDAwTCwgMHgwMDAwMDAyMEwsIDB4ODAxMDgwMjBMLAorCTB4MDAxMDgwMjBMLCAweDAwMDAwMDIwTCwgMHgwMDAwODAwMEwsIDB4ODAwMDAwMDBMLAorCTB4MDAwMDgwMjBMLCAweDgwMTA4MDAwTCwgMHgwMDEwMDAwMEwsIDB4ODAwMDAwMjBMLAorCTB4MDAxMDAwMjBMLCAweDgwMDA4MDIwTCwgMHg4MDAwMDAyMEwsIDB4MDAxMDAwMjBMLAorCTB4MDAxMDgwMDBMLCAweDAwMDAwMDAwTCwgMHg4MDAwODAwMEwsIDB4MDAwMDgwMjBMLAorCTB4ODAwMDAwMDBMLCAweDgwMTAwMDIwTCwgMHg4MDEwODAyMEwsIDB4MDAxMDgwMDBMIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIFNQM1s2NF0gPSB7CisJMHgwMDAwMDIwOEwsIDB4MDgwMjAyMDBMLCAweDAwMDAwMDAwTCwgMHgwODAyMDAwOEwsCisJMHgwODAwMDIwMEwsIDB4MDAwMDAwMDBMLCAweDAwMDIwMjA4TCwgMHgwODAwMDIwMEwsCisJMHgwMDAyMDAwOEwsIDB4MDgwMDAwMDhMLCAweDA4MDAwMDA4TCwgMHgwMDAyMDAwMEwsCisJMHgwODAyMDIwOEwsIDB4MDAwMjAwMDhMLCAweDA4MDIwMDAwTCwgMHgwMDAwMDIwOEwsCisJMHgwODAwMDAwMEwsIDB4MDAwMDAwMDhMLCAweDA4MDIwMjAwTCwgMHgwMDAwMDIwMEwsCisJMHgwMDAyMDIwMEwsIDB4MDgwMjAwMDBMLCAweDA4MDIwMDA4TCwgMHgwMDAyMDIwOEwsCisJMHgwODAwMDIwOEwsIDB4MDAwMjAyMDBMLCAweDAwMDIwMDAwTCwgMHgwODAwMDIwOEwsCisJMHgwMDAwMDAwOEwsIDB4MDgwMjAyMDhMLCAweDAwMDAwMjAwTCwgMHgwODAwMDAwMEwsCisJMHgwODAyMDIwMEwsIDB4MDgwMDAwMDBMLCAweDAwMDIwMDA4TCwgMHgwMDAwMDIwOEwsCisJMHgwMDAyMDAwMEwsIDB4MDgwMjAyMDBMLCAweDA4MDAwMjAwTCwgMHgwMDAwMDAwMEwsCisJMHgwMDAwMDIwMEwsIDB4MDAwMjAwMDhMLCAweDA4MDIwMjA4TCwgMHgwODAwMDIwMEwsCisJMHgwODAwMDAwOEwsIDB4MDAwMDAyMDBMLCAweDAwMDAwMDAwTCwgMHgwODAyMDAwOEwsCisJMHgwODAwMDIwOEwsIDB4MDAwMjAwMDBMLCAweDA4MDAwMDAwTCwgMHgwODAyMDIwOEwsCisJMHgwMDAwMDAwOEwsIDB4MDAwMjAyMDhMLCAweDAwMDIwMjAwTCwgMHgwODAwMDAwOEwsCisJMHgwODAyMDAwMEwsIDB4MDgwMDAyMDhMLCAweDAwMDAwMjA4TCwgMHgwODAyMDAwMEwsCisJMHgwMDAyMDIwOEwsIDB4MDAwMDAwMDhMLCAweDA4MDIwMDA4TCwgMHgwMDAyMDIwMEwgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU1A0WzY0XSA9IHsKKwkweDAwODAyMDAxTCwgMHgwMDAwMjA4MUwsIDB4MDAwMDIwODFMLCAweDAwMDAwMDgwTCwKKwkweDAwODAyMDgwTCwgMHgwMDgwMDA4MUwsIDB4MDA4MDAwMDFMLCAweDAwMDAyMDAxTCwKKwkweDAwMDAwMDAwTCwgMHgwMDgwMjAwMEwsIDB4MDA4MDIwMDBMLCAweDAwODAyMDgxTCwKKwkweDAwMDAwMDgxTCwgMHgwMDAwMDAwMEwsIDB4MDA4MDAwODBMLCAweDAwODAwMDAxTCwKKwkweDAwMDAwMDAxTCwgMHgwMDAwMjAwMEwsIDB4MDA4MDAwMDBMLCAweDAwODAyMDAxTCwKKwkweDAwMDAwMDgwTCwgMHgwMDgwMDAwMEwsIDB4MDAwMDIwMDFMLCAweDAwMDAyMDgwTCwKKwkweDAwODAwMDgxTCwgMHgwMDAwMDAwMUwsIDB4MDAwMDIwODBMLCAweDAwODAwMDgwTCwKKwkweDAwMDAyMDAwTCwgMHgwMDgwMjA4MEwsIDB4MDA4MDIwODFMLCAweDAwMDAwMDgxTCwKKwkweDAwODAwMDgwTCwgMHgwMDgwMDAwMUwsIDB4MDA4MDIwMDBMLCAweDAwODAyMDgxTCwKKwkweDAwMDAwMDgxTCwgMHgwMDAwMDAwMEwsIDB4MDAwMDAwMDBMLCAweDAwODAyMDAwTCwKKwkweDAwMDAyMDgwTCwgMHgwMDgwMDA4MEwsIDB4MDA4MDAwODFMLCAweDAwMDAwMDAxTCwKKwkweDAwODAyMDAxTCwgMHgwMDAwMjA4MUwsIDB4MDAwMDIwODFMLCAweDAwMDAwMDgwTCwKKwkweDAwODAyMDgxTCwgMHgwMDAwMDA4MUwsIDB4MDAwMDAwMDFMLCAweDAwMDAyMDAwTCwKKwkweDAwODAwMDAxTCwgMHgwMDAwMjAwMUwsIDB4MDA4MDIwODBMLCAweDAwODAwMDgxTCwKKwkweDAwMDAyMDAxTCwgMHgwMDAwMjA4MEwsIDB4MDA4MDAwMDBMLCAweDAwODAyMDAxTCwKKwkweDAwMDAwMDgwTCwgMHgwMDgwMDAwMEwsIDB4MDAwMDIwMDBMLCAweDAwODAyMDgwTCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBTUDVbNjRdID0geworCTB4MDAwMDAxMDBMLCAweDAyMDgwMTAwTCwgMHgwMjA4MDAwMEwsIDB4NDIwMDAxMDBMLAorCTB4MDAwODAwMDBMLCAweDAwMDAwMTAwTCwgMHg0MDAwMDAwMEwsIDB4MDIwODAwMDBMLAorCTB4NDAwODAxMDBMLCAweDAwMDgwMDAwTCwgMHgwMjAwMDEwMEwsIDB4NDAwODAxMDBMLAorCTB4NDIwMDAxMDBMLCAweDQyMDgwMDAwTCwgMHgwMDA4MDEwMEwsIDB4NDAwMDAwMDBMLAorCTB4MDIwMDAwMDBMLCAweDQwMDgwMDAwTCwgMHg0MDA4MDAwMEwsIDB4MDAwMDAwMDBMLAorCTB4NDAwMDAxMDBMLCAweDQyMDgwMTAwTCwgMHg0MjA4MDEwMEwsIDB4MDIwMDAxMDBMLAorCTB4NDIwODAwMDBMLCAweDQwMDAwMTAwTCwgMHgwMDAwMDAwMEwsIDB4NDIwMDAwMDBMLAorCTB4MDIwODAxMDBMLCAweDAyMDAwMDAwTCwgMHg0MjAwMDAwMEwsIDB4MDAwODAxMDBMLAorCTB4MDAwODAwMDBMLCAweDQyMDAwMTAwTCwgMHgwMDAwMDEwMEwsIDB4MDIwMDAwMDBMLAorCTB4NDAwMDAwMDBMLCAweDAyMDgwMDAwTCwgMHg0MjAwMDEwMEwsIDB4NDAwODAxMDBMLAorCTB4MDIwMDAxMDBMLCAweDQwMDAwMDAwTCwgMHg0MjA4MDAwMEwsIDB4MDIwODAxMDBMLAorCTB4NDAwODAxMDBMLCAweDAwMDAwMTAwTCwgMHgwMjAwMDAwMEwsIDB4NDIwODAwMDBMLAorCTB4NDIwODAxMDBMLCAweDAwMDgwMTAwTCwgMHg0MjAwMDAwMEwsIDB4NDIwODAxMDBMLAorCTB4MDIwODAwMDBMLCAweDAwMDAwMDAwTCwgMHg0MDA4MDAwMEwsIDB4NDIwMDAwMDBMLAorCTB4MDAwODAxMDBMLCAweDAyMDAwMTAwTCwgMHg0MDAwMDEwMEwsIDB4MDAwODAwMDBMLAorCTB4MDAwMDAwMDBMLCAweDQwMDgwMDAwTCwgMHgwMjA4MDEwMEwsIDB4NDAwMDAxMDBMIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIFNQNls2NF0gPSB7CisJMHgyMDAwMDAxMEwsIDB4MjA0MDAwMDBMLCAweDAwMDA0MDAwTCwgMHgyMDQwNDAxMEwsCisJMHgyMDQwMDAwMEwsIDB4MDAwMDAwMTBMLCAweDIwNDA0MDEwTCwgMHgwMDQwMDAwMEwsCisJMHgyMDAwNDAwMEwsIDB4MDA0MDQwMTBMLCAweDAwNDAwMDAwTCwgMHgyMDAwMDAxMEwsCisJMHgwMDQwMDAxMEwsIDB4MjAwMDQwMDBMLCAweDIwMDAwMDAwTCwgMHgwMDAwNDAxMEwsCisJMHgwMDAwMDAwMEwsIDB4MDA0MDAwMTBMLCAweDIwMDA0MDEwTCwgMHgwMDAwNDAwMEwsCisJMHgwMDQwNDAwMEwsIDB4MjAwMDQwMTBMLCAweDAwMDAwMDEwTCwgMHgyMDQwMDAxMEwsCisJMHgyMDQwMDAxMEwsIDB4MDAwMDAwMDBMLCAweDAwNDA0MDEwTCwgMHgyMDQwNDAwMEwsCisJMHgwMDAwNDAxMEwsIDB4MDA0MDQwMDBMLCAweDIwNDA0MDAwTCwgMHgyMDAwMDAwMEwsCisJMHgyMDAwNDAwMEwsIDB4MDAwMDAwMTBMLCAweDIwNDAwMDEwTCwgMHgwMDQwNDAwMEwsCisJMHgyMDQwNDAxMEwsIDB4MDA0MDAwMDBMLCAweDAwMDA0MDEwTCwgMHgyMDAwMDAxMEwsCisJMHgwMDQwMDAwMEwsIDB4MjAwMDQwMDBMLCAweDIwMDAwMDAwTCwgMHgwMDAwNDAxMEwsCisJMHgyMDAwMDAxMEwsIDB4MjA0MDQwMTBMLCAweDAwNDA0MDAwTCwgMHgyMDQwMDAwMEwsCisJMHgwMDQwNDAxMEwsIDB4MjA0MDQwMDBMLCAweDAwMDAwMDAwTCwgMHgyMDQwMDAxMEwsCisJMHgwMDAwMDAxMEwsIDB4MDAwMDQwMDBMLCAweDIwNDAwMDAwTCwgMHgwMDQwNDAxMEwsCisJMHgwMDAwNDAwMEwsIDB4MDA0MDAwMTBMLCAweDIwMDA0MDEwTCwgMHgwMDAwMDAwMEwsCisJMHgyMDQwNDAwMEwsIDB4MjAwMDAwMDBMLCAweDAwNDAwMDEwTCwgMHgyMDAwNDAxMEwgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgU1A3WzY0XSA9IHsKKwkweDAwMjAwMDAwTCwgMHgwNDIwMDAwMkwsIDB4MDQwMDA4MDJMLCAweDAwMDAwMDAwTCwKKwkweDAwMDAwODAwTCwgMHgwNDAwMDgwMkwsIDB4MDAyMDA4MDJMLCAweDA0MjAwODAwTCwKKwkweDA0MjAwODAyTCwgMHgwMDIwMDAwMEwsIDB4MDAwMDAwMDBMLCAweDA0MDAwMDAyTCwKKwkweDAwMDAwMDAyTCwgMHgwNDAwMDAwMEwsIDB4MDQyMDAwMDJMLCAweDAwMDAwODAyTCwKKwkweDA0MDAwODAwTCwgMHgwMDIwMDgwMkwsIDB4MDAyMDAwMDJMLCAweDA0MDAwODAwTCwKKwkweDA0MDAwMDAyTCwgMHgwNDIwMDAwMEwsIDB4MDQyMDA4MDBMLCAweDAwMjAwMDAyTCwKKwkweDA0MjAwMDAwTCwgMHgwMDAwMDgwMEwsIDB4MDAwMDA4MDJMLCAweDA0MjAwODAyTCwKKwkweDAwMjAwODAwTCwgMHgwMDAwMDAwMkwsIDB4MDQwMDAwMDBMLCAweDAwMjAwODAwTCwKKwkweDA0MDAwMDAwTCwgMHgwMDIwMDgwMEwsIDB4MDAyMDAwMDBMLCAweDA0MDAwODAyTCwKKwkweDA0MDAwODAyTCwgMHgwNDIwMDAwMkwsIDB4MDQyMDAwMDJMLCAweDAwMDAwMDAyTCwKKwkweDAwMjAwMDAyTCwgMHgwNDAwMDAwMEwsIDB4MDQwMDA4MDBMLCAweDAwMjAwMDAwTCwKKwkweDA0MjAwODAwTCwgMHgwMDAwMDgwMkwsIDB4MDAyMDA4MDJMLCAweDA0MjAwODAwTCwKKwkweDAwMDAwODAyTCwgMHgwNDAwMDAwMkwsIDB4MDQyMDA4MDJMLCAweDA0MjAwMDAwTCwKKwkweDAwMjAwODAwTCwgMHgwMDAwMDAwMEwsIDB4MDAwMDAwMDJMLCAweDA0MjAwODAyTCwKKwkweDAwMDAwMDAwTCwgMHgwMDIwMDgwMkwsIDB4MDQyMDAwMDBMLCAweDAwMDAwODAwTCwKKwkweDA0MDAwMDAyTCwgMHgwNDAwMDgwMEwsIDB4MDAwMDA4MDBMLCAweDAwMjAwMDAyTCB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBTUDhbNjRdID0geworCTB4MTAwMDEwNDBMLCAweDAwMDAxMDAwTCwgMHgwMDA0MDAwMEwsIDB4MTAwNDEwNDBMLAorCTB4MTAwMDAwMDBMLCAweDEwMDAxMDQwTCwgMHgwMDAwMDA0MEwsIDB4MTAwMDAwMDBMLAorCTB4MDAwNDAwNDBMLCAweDEwMDQwMDAwTCwgMHgxMDA0MTA0MEwsIDB4MDAwNDEwMDBMLAorCTB4MTAwNDEwMDBMLCAweDAwMDQxMDQwTCwgMHgwMDAwMTAwMEwsIDB4MDAwMDAwNDBMLAorCTB4MTAwNDAwMDBMLCAweDEwMDAwMDQwTCwgMHgxMDAwMTAwMEwsIDB4MDAwMDEwNDBMLAorCTB4MDAwNDEwMDBMLCAweDAwMDQwMDQwTCwgMHgxMDA0MDA0MEwsIDB4MTAwNDEwMDBMLAorCTB4MDAwMDEwNDBMLCAweDAwMDAwMDAwTCwgMHgwMDAwMDAwMEwsIDB4MTAwNDAwNDBMLAorCTB4MTAwMDAwNDBMLCAweDEwMDAxMDAwTCwgMHgwMDA0MTA0MEwsIDB4MDAwNDAwMDBMLAorCTB4MDAwNDEwNDBMLCAweDAwMDQwMDAwTCwgMHgxMDA0MTAwMEwsIDB4MDAwMDEwMDBMLAorCTB4MDAwMDAwNDBMLCAweDEwMDQwMDQwTCwgMHgwMDAwMTAwMEwsIDB4MDAwNDEwNDBMLAorCTB4MTAwMDEwMDBMLCAweDAwMDAwMDQwTCwgMHgxMDAwMDA0MEwsIDB4MTAwNDAwMDBMLAorCTB4MTAwNDAwNDBMLCAweDEwMDAwMDAwTCwgMHgwMDA0MDAwMEwsIDB4MTAwMDEwNDBMLAorCTB4MDAwMDAwMDBMLCAweDEwMDQxMDQwTCwgMHgwMDA0MDA0MEwsIDB4MTAwMDAwNDBMLAorCTB4MTAwNDAwMDBMLCAweDEwMDAxMDAwTCwgMHgxMDAwMTA0MEwsIDB4MDAwMDAwMDBMLAorCTB4MTAwNDEwNDBMLCAweDAwMDQxMDAwTCwgMHgwMDA0MTAwMEwsIDB4MDAwMDEwNDBMLAorCTB4MDAwMDEwNDBMLCAweDAwMDQwMDQwTCwgMHgxMDAwMDAwMEwsIDB4MTAwNDEwMDBMIH07CisKK3N0YXRpYyB2b2lkIGRlc2Z1bmMocmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqYmxvY2ssIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKmtleXMpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBmdmFsLCB3b3JrLCByaWdodCwgbGVmdHQ7CisJcmVnaXN0ZXIgaW50IHJvdW5kOworCisJbGVmdHQgPSBibG9ja1swXTsKKwlyaWdodCA9IGJsb2NrWzFdOworCXdvcmsgPSAoKGxlZnR0ID4+IDQpIF4gcmlnaHQpICYgMHgwZjBmMGYwZkw7CisJcmlnaHQgXj0gd29yazsKKwlsZWZ0dCBePSAod29yayA8PCA0KTsKKwl3b3JrID0gKChsZWZ0dCA+PiAxNikgXiByaWdodCkgJiAweDAwMDBmZmZmTDsKKwlyaWdodCBePSB3b3JrOworCWxlZnR0IF49ICh3b3JrIDw8IDE2KTsKKwl3b3JrID0gKChyaWdodCA+PiAyKSBeIGxlZnR0KSAmIDB4MzMzMzMzMzNMOworCWxlZnR0IF49IHdvcms7CisJcmlnaHQgXj0gKHdvcmsgPDwgMik7CisJd29yayA9ICgocmlnaHQgPj4gOCkgXiBsZWZ0dCkgJiAweDAwZmYwMGZmTDsKKwlsZWZ0dCBePSB3b3JrOworCXJpZ2h0IF49ICh3b3JrIDw8IDgpOworCXJpZ2h0ID0gKChyaWdodCA8PCAxKSB8ICgocmlnaHQgPj4gMzEpICYgMUwpKSAmIDB4ZmZmZmZmZmZMOworCXdvcmsgPSAobGVmdHQgXiByaWdodCkgJiAweGFhYWFhYWFhTDsKKwlsZWZ0dCBePSB3b3JrOworCXJpZ2h0IF49IHdvcms7CisJbGVmdHQgPSAoKGxlZnR0IDw8IDEpIHwgKChsZWZ0dCA+PiAzMSkgJiAxTCkpICYgMHhmZmZmZmZmZkw7CisKKwlmb3IoIHJvdW5kID0gMDsgcm91bmQgPCA4OyByb3VuZCsrICkgeworCQl3b3JrICA9IChyaWdodCA8PCAyOCkgfCAocmlnaHQgPj4gNCk7CisJCXdvcmsgXj0gKmtleXMrKzsKKwkJZnZhbCAgPSBTUDdbIHdvcmsJCSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDVbKHdvcmsgPj4gIDgpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQM1sod29yayA+PiAxNikgJiAweDNmTF07CisJCWZ2YWwgfD0gU1AxWyh3b3JrID4+IDI0KSAmIDB4M2ZMXTsKKwkJd29yayAgPSByaWdodCBeICprZXlzKys7CisJCWZ2YWwgfD0gU1A4WyB3b3JrCQkgJiAweDNmTF07CisJCWZ2YWwgfD0gU1A2Wyh3b3JrID4+ICA4KSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDRbKHdvcmsgPj4gMTYpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQMlsod29yayA+PiAyNCkgJiAweDNmTF07CisJCWxlZnR0IF49IGZ2YWw7CisJCXdvcmsgID0gKGxlZnR0IDw8IDI4KSB8IChsZWZ0dCA+PiA0KTsKKwkJd29yayBePSAqa2V5cysrOworCQlmdmFsICA9IFNQN1sgd29yawkJICYgMHgzZkxdOworCQlmdmFsIHw9IFNQNVsod29yayA+PiAgOCkgJiAweDNmTF07CisJCWZ2YWwgfD0gU1AzWyh3b3JrID4+IDE2KSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDFbKHdvcmsgPj4gMjQpICYgMHgzZkxdOworCQl3b3JrICA9IGxlZnR0IF4gKmtleXMrKzsKKwkJZnZhbCB8PSBTUDhbIHdvcmsJCSAmIDB4M2ZMXTsKKwkJZnZhbCB8PSBTUDZbKHdvcmsgPj4gIDgpICYgMHgzZkxdOworCQlmdmFsIHw9IFNQNFsod29yayA+PiAxNikgJiAweDNmTF07CisJCWZ2YWwgfD0gU1AyWyh3b3JrID4+IDI0KSAmIDB4M2ZMXTsKKwkJcmlnaHQgXj0gZnZhbDsKKwkJfQorCisJcmlnaHQgPSAocmlnaHQgPDwgMzEpIHwgKHJpZ2h0ID4+IDEpOworCXdvcmsgPSAobGVmdHQgXiByaWdodCkgJiAweGFhYWFhYWFhTDsKKwlsZWZ0dCBePSB3b3JrOworCXJpZ2h0IF49IHdvcms7CisJbGVmdHQgPSAobGVmdHQgPDwgMzEpIHwgKGxlZnR0ID4+IDEpOworCXdvcmsgPSAoKGxlZnR0ID4+IDgpIF4gcmlnaHQpICYgMHgwMGZmMDBmZkw7CisJcmlnaHQgXj0gd29yazsKKwlsZWZ0dCBePSAod29yayA8PCA4KTsKKwl3b3JrID0gKChsZWZ0dCA+PiAyKSBeIHJpZ2h0KSAmIDB4MzMzMzMzMzNMOworCXJpZ2h0IF49IHdvcms7CisJbGVmdHQgXj0gKHdvcmsgPDwgMik7CisJd29yayA9ICgocmlnaHQgPj4gMTYpIF4gbGVmdHQpICYgMHgwMDAwZmZmZkw7CisJbGVmdHQgXj0gd29yazsKKwlyaWdodCBePSAod29yayA8PCAxNik7CisJd29yayA9ICgocmlnaHQgPj4gNCkgXiBsZWZ0dCkgJiAweDBmMGYwZjBmTDsKKwlsZWZ0dCBePSB3b3JrOworCXJpZ2h0IF49ICh3b3JrIDw8IDQpOworCSpibG9jaysrID0gcmlnaHQ7CisJKmJsb2NrID0gbGVmdHQ7CisJcmV0dXJuOworCX0KKworLyogVmFsaWRhdGlvbiBzZXRzOgorICoKKyAqIFNpbmdsZS1sZW5ndGgga2V5LCBzaW5nbGUtbGVuZ3RoIHBsYWludGV4dCAtCisgKiBLZXkJICA6IDAxMjMgNDU2NyA4OWFiIGNkZWYKKyAqIFBsYWluICA6IDAxMjMgNDU2NyA4OWFiIGNkZTcKKyAqIENpcGhlciA6IGM5NTcgNDQyNSA2YTVlIGQzMWQKKyAqCisgKiBEb3VibGUtbGVuZ3RoIGtleSwgc2luZ2xlLWxlbmd0aCBwbGFpbnRleHQgLQorICogS2V5CSAgOiAwMTIzIDQ1NjcgODlhYiBjZGVmIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyAqIFBsYWluICA6IDAxMjMgNDU2NyA4OWFiIGNkZTcKKyAqIENpcGhlciA6IDdmMWQgMGE3NyA4MjZiIDhhZmYKKyAqCisgKiBEb3VibGUtbGVuZ3RoIGtleSwgZG91YmxlLWxlbmd0aCBwbGFpbnRleHQgLQorICogS2V5CSAgOiAwMTIzIDQ1NjcgODlhYiBjZGVmIGZlZGMgYmE5OCA3NjU0IDMyMTAKKyAqIFBsYWluICA6IDAxMjMgNDU2NyA4OWFiIGNkZWYgMDEyMyA0NTY3IDg5YWIgY2RmZgorICogQ2lwaGVyIDogMjdhMCA4NDQwIDQwNmEgZGY2MCAyNzhmIDQ3Y2YgNDJkNiAxNWQ3CisgKgorICogVHJpcGxlLWxlbmd0aCBrZXksIHNpbmdsZS1sZW5ndGggcGxhaW50ZXh0IC0KKyAqIEtleQkgIDogMDEyMyA0NTY3IDg5YWIgY2RlZiBmZWRjIGJhOTggNzY1NCAzMjEwIDg5YWIgY2RlZiAwMTIzIDQ1NjcKKyAqIFBsYWluICA6IDAxMjMgNDU2NyA4OWFiIGNkZTcKKyAqIENpcGhlciA6IGRlMGIgN2MwNiBhZTVlIDBlZDUKKyAqCisgKiBUcmlwbGUtbGVuZ3RoIGtleSwgZG91YmxlLWxlbmd0aCBwbGFpbnRleHQgLQorICogS2V5CSAgOiAwMTIzIDQ1NjcgODlhYiBjZGVmIGZlZGMgYmE5OCA3NjU0IDMyMTAgODlhYiBjZGVmIDAxMjMgNDU2NworICogUGxhaW4gIDogMDEyMyA0NTY3IDg5YWIgY2RlZiAwMTIzIDQ1NjcgODlhYiBjZGZmCisgKiBDaXBoZXIgOiBhZDBkIDFiMzAgYWMxNyBjZjA3IDBlZDEgMWM2MyA4MWU0IDRkZTUKKyAqCisgKiBkM2RlcyBWNS4wYSByd28gOTIwOC4wNyAxODo0NCBHcmF2ZW4gSW1hZ2VyeQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL2QzZGVzLmggYi9hbmRyb2lkL3FlbXUxL3VpL2QzZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjYjZiNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvZDNkZXMuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogVGhpcyBpcyBEM0RFUyAoVjUuMDkpIGJ5IFJpY2hhcmQgT3V0ZXJicmlkZ2Ugd2l0aCB0aGUgZG91YmxlIGFuZAorICogdHJpcGxlLWxlbmd0aCBzdXBwb3J0IHJlbW92ZWQgZm9yIHVzZSBpbiBWTkMuCisgKgorICogVGhlc2UgY2hhbmdlcyBhcmU6CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBEM0RFU19ICisjZGVmaW5lIEQzREVTX0ggMQorCisvKiBkM2Rlcy5oIC0KKyAqCisgKglIZWFkZXJzIGFuZCBkZWZpbmVzIGZvciBkM2Rlcy5jCisgKglHcmF2ZW4gSW1hZ2VyeSwgMTk5Mi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsMTk4OSwxOTkwLDE5OTEsMTk5MiBieSBSaWNoYXJkIE91dGVyYnJpZGdlCisgKgkoR0VuaWUgOiBPVVRFUjsgQ0lTIDogWzcxNzU1LDIwNF0pCisgKi8KKworI2RlZmluZSBFTjAJMAkvKiBNT0RFID09IGVuY3J5cHQgKi8KKyNkZWZpbmUgREUxCTEJLyogTU9ERSA9PSBkZWNyeXB0ICovCisKK3ZvaWQgZGVza2V5KHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKy8qCQkgICAgICBoZXhrZXlbOF0gICAgIE1PREUKKyAqIFNldHMgdGhlIGludGVybmFsIGtleSByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIGhleGFkZWNpbWFsCisgKiBrZXkgY29udGFpbmVkIGluIHRoZSA4IGJ5dGVzIG9mIGhleGtleSwgYWNjb3JkaW5nIHRvIHRoZSBERVMsCisgKiBmb3IgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIGFjY29yZGluZyB0byBNT0RFLgorICovCisKK3ZvaWQgdXNla2V5KHVuc2lnbmVkIGxvbmcgKik7CisvKgkJICAgIGNvb2tlZGtleVszMl0KKyAqIExvYWRzIHRoZSBpbnRlcm5hbCBrZXkgcmVnaXN0ZXIgd2l0aCB0aGUgZGF0YSBpbiBjb29rZWRrZXkuCisgKi8KKwordm9pZCBjcGtleSh1bnNpZ25lZCBsb25nICopOworLyoJCSAgIGNvb2tlZGtleVszMl0KKyAqIENvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGludGVybmFsIGtleSByZWdpc3RlciBpbnRvIHRoZSBzdG9yYWdlCisgKiBsb2NhdGVkIGF0ICZjb29rZWRrZXlbMF0uCisgKi8KKwordm9pZCBkZXModW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworLyoJCSAgICBmcm9tWzhdCSAgICAgIHRvWzhdCisgKiBFbmNyeXB0cy9EZWNyeXB0cyAoYWNjb3JkaW5nIHRvIHRoZSBrZXkgY3VycmVudGx5IGxvYWRlZCBpbiB0aGUKKyAqIGludGVybmFsIGtleSByZWdpc3Rlcikgb25lIGJsb2NrIG9mIGVpZ2h0IGJ5dGVzIGF0IGFkZHJlc3MgJ2Zyb20nCisgKiBpbnRvIHRoZSBibG9jayBhdCBhZGRyZXNzICd0bycuICBUaGV5IGNhbiBiZSB0aGUgc2FtZS4KKyAqLworCisvKiBkM2Rlcy5oIFY1LjA5IHJ3byA5MjA4LjA0IDE1OjA2IEdyYXZlbiBJbWFnZXJ5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91aS9pbnB1dC5jIGIvYW5kcm9pZC9xZW11MS91aS9pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzY0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3VpL2lucHV0LmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgIm5ldC9uZXQuaCIKKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKyNpbmNsdWRlICJ1aS9jb25zb2xlLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWpzb24uaCIKKworI2lmZGVmIENPTkZJR19TS0lOTklORworUUVNVVB1dE1vdXNlRW50cnkgKm9yaWdpbmFsX3FlbXVfYWRkX21vdXNlX2V2ZW50X2hhbmRsZXIoUUVNVVB1dE1vdXNlRXZlbnQgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBhYnNvbHV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworI3VuZGVmIHFlbXVfYWRkX21vdXNlX2V2ZW50X2hhbmRsZXIKKyNkZWZpbmUgcWVtdV9hZGRfbW91c2VfZXZlbnRfaGFuZGxlciBvcmlnaW5hbF9xZW11X2FkZF9tb3VzZV9ldmVudF9oYW5kbGVyCisjZW5kaWYKK3N0YXRpYyBRVEFJTFFfSEVBRCgsIFFFTVVQdXRLQkRFbnRyeSkga2JkX2hhbmRsZXJzID0KKyAgICBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihrYmRfaGFuZGxlcnMpOworc3RhdGljIFFUQUlMUV9IRUFEKCwgUUVNVVB1dExFREVudHJ5KSBsZWRfaGFuZGxlcnMgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihsZWRfaGFuZGxlcnMpOworc3RhdGljIFFUQUlMUV9IRUFEKCwgUUVNVVB1dE1vdXNlRW50cnkpIG1vdXNlX2hhbmRsZXJzID0KKyAgICBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihtb3VzZV9oYW5kbGVycyk7CitzdGF0aWMgTm90aWZpZXJMaXN0IG1vdXNlX21vZGVfbm90aWZpZXJzID0KKyAgICBOT1RJRklFUl9MSVNUX0lOSVRJQUxJWkVSKG1vdXNlX21vZGVfbm90aWZpZXJzKTsKKwordm9pZCBxZW11X2FkZF9rYmRfZXZlbnRfaGFuZGxlcihRRU1VUHV0S0JERXZlbnQgKmZ1bmMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VUHV0S0JERW50cnkgKnM7CisKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIHMgPSBnX21hbGxvYzAoc2l6ZW9mKFFFTVVQdXRLQkRFbnRyeSkpOworCisgICAgICAgIHMtPnB1dF9rYmRfZXZlbnQgPSBmdW5jOworICAgICAgICBzLT5vcGFxdWUgPSBvcGFxdWU7CisKKyAgICAgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZrYmRfaGFuZGxlcnMsIHMsIG5leHQpOworICAgIH0KK30KKwordm9pZCBxZW11X3JlbW92ZV9rYmRfZXZlbnRfaGFuZGxlcihRRU1VUHV0S0JERXZlbnQgKmZ1bmMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VUHV0S0JERW50cnkgKmN1cnNvciwgKmN1cnNvcl9uZXh0OworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShjdXJzb3IsICZrYmRfaGFuZGxlcnMsIG5leHQsIGN1cnNvcl9uZXh0KSB7CisgICAgICAgICAgICBpZiAoY3Vyc29yLT5wdXRfa2JkX2V2ZW50ID09IGZ1bmMgJiYgY3Vyc29yLT5vcGFxdWUgPT0gb3BhcXVlKSB7CisgICAgICAgICAgICAgICAgUVRBSUxRX1JFTU9WRSgma2JkX2hhbmRsZXJzLCBjdXJzb3IsIG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19tb2RlX2NoYW5nZSh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgY3VycmVudF9pc19hYnNvbHV0ZSwgY3VycmVudF9oYXNfYWJzb2x1dGU7CisgICAgaW50IGlzX2Fic29sdXRlOworICAgIGludCBoYXNfYWJzb2x1dGU7CisKKyAgICBpc19hYnNvbHV0ZSA9IGtiZF9tb3VzZV9pc19hYnNvbHV0ZSgpOworICAgIGhhc19hYnNvbHV0ZSA9IGtiZF9tb3VzZV9oYXNfYWJzb2x1dGUoKTsKKworICAgIGlmIChpc19hYnNvbHV0ZSAhPSBjdXJyZW50X2lzX2Fic29sdXRlIHx8CisgICAgICAgIGhhc19hYnNvbHV0ZSAhPSBjdXJyZW50X2hhc19hYnNvbHV0ZSkgeworICAgICAgICBub3RpZmllcl9saXN0X25vdGlmeSgmbW91c2VfbW9kZV9ub3RpZmllcnMsIE5VTEwpOworICAgIH0KKworICAgIGN1cnJlbnRfaXNfYWJzb2x1dGUgPSBpc19hYnNvbHV0ZTsKKyAgICBjdXJyZW50X2hhc19hYnNvbHV0ZSA9IGhhc19hYnNvbHV0ZTsKK30KKworUUVNVVB1dE1vdXNlRW50cnkgKnFlbXVfYWRkX21vdXNlX2V2ZW50X2hhbmRsZXIoUUVNVVB1dE1vdXNlRXZlbnQgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvcGFxdWUsIGludCBhYnNvbHV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUUVNVVB1dE1vdXNlRW50cnkgKnM7CisgICAgc3RhdGljIGludCBtb3VzZV9pbmRleCA9IDA7CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihRRU1VUHV0TW91c2VFbnRyeSkpOworCisgICAgcy0+cWVtdV9wdXRfbW91c2VfZXZlbnQgPSBmdW5jOworICAgIHMtPnFlbXVfcHV0X21vdXNlX2V2ZW50X29wYXF1ZSA9IG9wYXF1ZTsKKyAgICBzLT5xZW11X3B1dF9tb3VzZV9ldmVudF9hYnNvbHV0ZSA9IGFic29sdXRlOworICAgIHMtPnFlbXVfcHV0X21vdXNlX2V2ZW50X25hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgICBzLT5pbmRleCA9IG1vdXNlX2luZGV4Kys7CisKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJm1vdXNlX2hhbmRsZXJzLCBzLCBub2RlKTsKKworICAgIGNoZWNrX21vZGVfY2hhbmdlKCk7CisKKyAgICByZXR1cm4gczsKK30KKwordm9pZCBxZW11X2FjdGl2YXRlX21vdXNlX2V2ZW50X2hhbmRsZXIoUUVNVVB1dE1vdXNlRW50cnkgKmVudHJ5KQoreworICAgIFFUQUlMUV9SRU1PVkUoJm1vdXNlX2hhbmRsZXJzLCBlbnRyeSwgbm9kZSk7CisgICAgUVRBSUxRX0lOU0VSVF9IRUFEKCZtb3VzZV9oYW5kbGVycywgZW50cnksIG5vZGUpOworCisgICAgY2hlY2tfbW9kZV9jaGFuZ2UoKTsKK30KKwordm9pZCBxZW11X3JlbW92ZV9tb3VzZV9ldmVudF9oYW5kbGVyKFFFTVVQdXRNb3VzZUVudHJ5ICplbnRyeSkKK3sKKyAgICBRVEFJTFFfUkVNT1ZFKCZtb3VzZV9oYW5kbGVycywgZW50cnksIG5vZGUpOworCisgICAgZ19mcmVlKGVudHJ5LT5xZW11X3B1dF9tb3VzZV9ldmVudF9uYW1lKTsKKyAgICBnX2ZyZWUoZW50cnkpOworCisgICAgY2hlY2tfbW9kZV9jaGFuZ2UoKTsKK30KKworUUVNVVB1dExFREVudHJ5ICpxZW11X2FkZF9sZWRfZXZlbnRfaGFuZGxlcihRRU1VUHV0TEVERXZlbnQgKmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBRRU1VUHV0TEVERW50cnkgKnM7CisKKyAgICBzID0gZ19tYWxsb2MwKHNpemVvZihRRU1VUHV0TEVERW50cnkpKTsKKworICAgIHMtPnB1dF9sZWQgPSBmdW5jOworICAgIHMtPm9wYXF1ZSA9IG9wYXF1ZTsKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwoJmxlZF9oYW5kbGVycywgcywgbmV4dCk7CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgcWVtdV9yZW1vdmVfbGVkX2V2ZW50X2hhbmRsZXIoUUVNVVB1dExFREVudHJ5ICplbnRyeSkKK3sKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFFUQUlMUV9SRU1PVkUoJmxlZF9oYW5kbGVycywgZW50cnksIG5leHQpOworICAgIGdfZnJlZShlbnRyeSk7Cit9CisKK3ZvaWQga2JkX3B1dF9rZXljb2RlKGludCBrZXljb2RlKQoreworICAgIFFFTVVQdXRLQkRFbnRyeSAqY3Vyc29yOworICAgIFFUQUlMUV9GT1JFQUNIKGN1cnNvciwgJmtiZF9oYW5kbGVycywgbmV4dCkgeworICAgICAgICBjdXJzb3ItPnB1dF9rYmRfZXZlbnQoY3Vyc29yLT5vcGFxdWUsIGtleWNvZGUpOworICAgIH0KK30KKwordm9pZCBrYmRfcHV0X2xlZHN0YXRlKGludCBsZWRzdGF0ZSkKK3sKKyAgICBRRU1VUHV0TEVERW50cnkgKmN1cnNvcjsKKworICAgIFFUQUlMUV9GT1JFQUNIKGN1cnNvciwgJmxlZF9oYW5kbGVycywgbmV4dCkgeworICAgICAgICBjdXJzb3ItPnB1dF9sZWQoY3Vyc29yLT5vcGFxdWUsIGxlZHN0YXRlKTsKKyAgICB9Cit9CisKK3ZvaWQga2JkX21vdXNlX2V2ZW50KGludCBkeCwgaW50IGR5LCBpbnQgZHosIGludCBidXR0b25zX3N0YXRlKQoreworICAgIFFFTVVQdXRNb3VzZUVudHJ5ICplbnRyeTsKKyAgICBRRU1VUHV0TW91c2VFdmVudCAqbW91c2VfZXZlbnQ7CisgICAgdm9pZCAqbW91c2VfZXZlbnRfb3BhcXVlOworI2lmbmRlZiBDT05GSUdfU0tJTk5JTkcKKyAgICBpbnQgd2lkdGg7CisjZW5kaWYKKworICAgIGlmIChRVEFJTFFfRU1QVFkoJm1vdXNlX2hhbmRsZXJzKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZW50cnkgPSBRVEFJTFFfRklSU1QoJm1vdXNlX2hhbmRsZXJzKTsKKworICAgIG1vdXNlX2V2ZW50ID0gZW50cnktPnFlbXVfcHV0X21vdXNlX2V2ZW50OworICAgIG1vdXNlX2V2ZW50X29wYXF1ZSA9IGVudHJ5LT5xZW11X3B1dF9tb3VzZV9ldmVudF9vcGFxdWU7CisKKyAgICBpZiAobW91c2VfZXZlbnQpIHsKKyNpZm5kZWYgQ09ORklHX1NLSU5OSU5HCisgICAgICAgIGlmIChncmFwaGljX3JvdGF0ZSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LT5xZW11X3B1dF9tb3VzZV9ldmVudF9hYnNvbHV0ZSkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gMHg3ZmZmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGdyYXBoaWNfd2lkdGggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW91c2VfZXZlbnQobW91c2VfZXZlbnRfb3BhcXVlLCB3aWR0aCAtIGR5LCBkeCwgZHosIGJ1dHRvbnNfc3RhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW91c2VfZXZlbnQobW91c2VfZXZlbnRfb3BhcXVlLCBkeCwgZHksIGR6LCBidXR0b25zX3N0YXRlKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgbW91c2VfZXZlbnQobW91c2VfZXZlbnRfb3BhcXVlLCBkeCwgZHksIGR6LCBidXR0b25zX3N0YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKworaW50IGtiZF9tb3VzZV9pc19hYnNvbHV0ZSh2b2lkKQoreworICAgIGlmIChRVEFJTFFfRU1QVFkoJm1vdXNlX2hhbmRsZXJzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gUVRBSUxRX0ZJUlNUKCZtb3VzZV9oYW5kbGVycyktPnFlbXVfcHV0X21vdXNlX2V2ZW50X2Fic29sdXRlOworfQorCitpbnQga2JkX21vdXNlX2hhc19hYnNvbHV0ZSh2b2lkKQoreworICAgIFFFTVVQdXRNb3VzZUVudHJ5ICplbnRyeTsKKworICAgIFFUQUlMUV9GT1JFQUNIKGVudHJ5LCAmbW91c2VfaGFuZGxlcnMsIG5vZGUpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5xZW11X3B1dF9tb3VzZV9ldmVudF9hYnNvbHV0ZSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5mb19taWNlX2l0ZXIoUU9iamVjdCAqZGF0YSwgdm9pZCAqb3BhcXVlKQoreworICAgIFFEaWN0ICptb3VzZTsKKyAgICBNb25pdG9yICptb24gPSBvcGFxdWU7CisKKyAgICBtb3VzZSA9IHFvYmplY3RfdG9fcWRpY3QoZGF0YSk7CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJWMgTW91c2UgIyUiIFBSSWQ2NCAiOiAlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgKHFkaWN0X2dldF9ib29sKG1vdXNlLCAiY3VycmVudCIpID8gJyonIDogJyAnKSwKKyAgICAgICAgICAgICAgICAgICBxZGljdF9nZXRfaW50KG1vdXNlLCAiaW5kZXgiKSwgcWRpY3RfZ2V0X3N0cihtb3VzZSwgIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgICBxZGljdF9nZXRfYm9vbChtb3VzZSwgImFic29sdXRlIikgPyAiIChhYnNvbHV0ZSkiIDogIiIpOworfQorCit2b2lkIGRvX2luZm9fbWljZV9wcmludChNb25pdG9yICptb24sIGNvbnN0IFFPYmplY3QgKmRhdGEpCit7CisgICAgUUxpc3QgKm1pY2VfbGlzdDsKKworICAgIG1pY2VfbGlzdCA9IHFvYmplY3RfdG9fcWxpc3QoZGF0YSk7CisgICAgaWYgKHFsaXN0X2VtcHR5KG1pY2VfbGlzdCkpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiTm8gbW91c2UgZGV2aWNlcyBjb25uZWN0ZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcWxpc3RfaXRlcihtaWNlX2xpc3QsIGluZm9fbWljZV9pdGVyLCBtb24pOworfQorCit2b2lkIGRvX2luZm9fbWljZShNb25pdG9yICptb24sIFFPYmplY3QgKipyZXRfZGF0YSkKK3sKKyAgICBRRU1VUHV0TW91c2VFbnRyeSAqY3Vyc29yOworICAgIFFMaXN0ICptaWNlX2xpc3Q7CisgICAgaW50IGN1cnJlbnQ7CisKKyAgICBtaWNlX2xpc3QgPSBxbGlzdF9uZXcoKTsKKworICAgIGlmIChRVEFJTFFfRU1QVFkoJm1vdXNlX2hhbmRsZXJzKSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjdXJyZW50ID0gUVRBSUxRX0ZJUlNUKCZtb3VzZV9oYW5kbGVycyktPmluZGV4OworCisgICAgUVRBSUxRX0ZPUkVBQ0goY3Vyc29yLCAmbW91c2VfaGFuZGxlcnMsIG5vZGUpIHsKKyAgICAgICAgUU9iamVjdCAqb2JqOworICAgICAgICBvYmogPSBxb2JqZWN0X2Zyb21fanNvbmYoInsgJ25hbWUnOiAlcywiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAnaW5kZXgnOiAlZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAnY3VycmVudCc6ICVpLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICdhYnNvbHV0ZSc6ICVpIH0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLT5xZW11X3B1dF9tb3VzZV9ldmVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci0+aW5kZXggPT0gY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhY3Vyc29yLT5xZW11X3B1dF9tb3VzZV9ldmVudF9hYnNvbHV0ZSk7CisgICAgICAgIHFsaXN0X2FwcGVuZF9vYmoobWljZV9saXN0LCBvYmopOworICAgIH0KKworb3V0OgorICAgICpyZXRfZGF0YSA9IFFPQkpFQ1QobWljZV9saXN0KTsKK30KKwordm9pZCBkb19tb3VzZV9zZXQoTW9uaXRvciAqbW9uLCBjb25zdCBRRGljdCAqcWRpY3QpCit7CisgICAgUUVNVVB1dE1vdXNlRW50cnkgKmN1cnNvcjsKKyAgICBpbnQgaW5kZXggPSBxZGljdF9nZXRfaW50KHFkaWN0LCAiaW5kZXgiKTsKKyAgICBpbnQgZm91bmQgPSAwOworCisgICAgaWYgKFFUQUlMUV9FTVBUWSgmbW91c2VfaGFuZGxlcnMpKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIk5vIG1vdXNlIGRldmljZXMgY29ubmVjdGVkXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFUQUlMUV9GT1JFQUNIKGN1cnNvciwgJm1vdXNlX2hhbmRsZXJzLCBub2RlKSB7CisgICAgICAgIGlmIChjdXJzb3ItPmluZGV4ID09IGluZGV4KSB7CisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICBxZW11X2FjdGl2YXRlX21vdXNlX2V2ZW50X2hhbmRsZXIoY3Vyc29yKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJNb3VzZSBhdCBnaXZlbiBpbmRleCBub3QgZm91bmRcbiIpOworICAgIH0KKworICAgIGNoZWNrX21vZGVfY2hhbmdlKCk7Cit9CisKK3ZvaWQgcWVtdV9hZGRfbW91c2VfbW9kZV9jaGFuZ2Vfbm90aWZpZXIoTm90aWZpZXIgKm5vdGlmeSkKK3sKKyAgICBub3RpZmllcl9saXN0X2FkZCgmbW91c2VfbW9kZV9ub3RpZmllcnMsIG5vdGlmeSk7Cit9CisKK3ZvaWQgcWVtdV9yZW1vdmVfbW91c2VfbW9kZV9jaGFuZ2Vfbm90aWZpZXIoTm90aWZpZXIgKm5vdGlmeSkKK3sKKyAgICBub3RpZmllcl9yZW1vdmUobm90aWZ5KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdWkva2V5bWFwcy5jIGIvYW5kcm9pZC9xZW11MS91aS9rZXltYXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiNGIyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkva2V5bWFwcy5jCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogUUVNVSBrZXlzeW0gdG8ga2V5Y29kZSBjb252ZXJzaW9uIHVzaW5nIHJkZXNrdG9wIGtleW1hcHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgSm9oYW5uZXMgU2NoaW5kZWxpbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAia2V5bWFwcy5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKworc3RhdGljIGludCBnZXRfa2V5c3ltKGNvbnN0IG5hbWUya2V5c3ltX3QgKnRhYmxlLAorCQkgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IG5hbWUya2V5c3ltX3QgKnA7CisgICAgZm9yKHAgPSB0YWJsZTsgcC0+bmFtZSAhPSBOVUxMOyBwKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAocC0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gcC0+a2V5c3ltOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBhZGRfdG9fa2V5X3JhbmdlKHN0cnVjdCBrZXlfcmFuZ2UgKiprcnAsIGludCBjb2RlKSB7CisgICAgc3RydWN0IGtleV9yYW5nZSAqa3I7CisgICAgZm9yIChrciA9ICprcnA7IGtyOyBrciA9IGtyLT5uZXh0KSB7CisJaWYgKGNvZGUgPj0ga3ItPnN0YXJ0ICYmIGNvZGUgPD0ga3ItPmVuZCkKKwkgICAgYnJlYWs7CisJaWYgKGNvZGUgPT0ga3ItPnN0YXJ0IC0gMSkgeworCSAgICBrci0+c3RhcnQtLTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChjb2RlID09IGtyLT5lbmQgKyAxKSB7CisJICAgIGtyLT5lbmQrKzsKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoa3IgPT0gTlVMTCkgeworCWtyID0gZ19tYWxsb2MwKHNpemVvZigqa3IpKTsKKyAgICAgICAga3ItPnN0YXJ0ID0ga3ItPmVuZCA9IGNvZGU7CisgICAgICAgIGtyLT5uZXh0ID0gKmtycDsKKyAgICAgICAgKmtycCA9IGtyOworICAgIH0KK30KKworc3RhdGljIGtiZF9sYXlvdXRfdCAqcGFyc2Vfa2V5Ym9hcmRfbGF5b3V0KGNvbnN0IG5hbWUya2V5c3ltX3QgKnRhYmxlLAorCQkJCQkgICBjb25zdCBjaGFyICpsYW5ndWFnZSwKKwkJCQkJICAga2JkX2xheW91dF90ICogaykKK3sKKyAgICBGSUxFICpmOworICAgIC8qIFRoaXMgZmlsZSBpcyB1c2VkIGJ5IGJvdGgsIFVJIGFuZCBjb3JlIGNvbXBvbmVudHMuIFRoZXJlIGFyZSBkaWZmZXJlbmNlcworICAgICAqIGluIHRoZSB3YXkgaG93IGtleW1hcCBmaWxlIHBhdGggaXMgb2J0YWluZWQgZm9yIHRoZXNlIHR3byBkaWZmZXJlbnQKKyAgICAgKiBjb25maWd1cmF0aW9ucy4gKi8KKyAgICBjaGFyICogZmlsZW5hbWU7CisgICAgY2hhciBsaW5lWzEwMjRdOworICAgIGludCBsZW47CisKKyAgICBmaWxlbmFtZSA9IHFlbXVfZmluZF9maWxlKFFFTVVfRklMRV9UWVBFX0tFWU1BUCwgbGFuZ3VhZ2UpOworICAgIGlmICghZmlsZW5hbWUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiQ291bGQgbm90IHJlYWQga2V5bWFwIGZpbGU6ICclcydcbiIsIGxhbmd1YWdlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFrKQorCWsgPSBnX21hbGxvYzAoc2l6ZW9mKGtiZF9sYXlvdXRfdCkpOworICAgIGlmICghKGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIkNvdWxkIG5vdCByZWFkIGtleW1hcCBmaWxlOiAnJXMnXG4iLCBsYW5ndWFnZSk7CisJcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvcig7OykgeworCWlmIChmZ2V0cyhsaW5lLCAxMDI0LCBmKSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbiA9IHN0cmxlbihsaW5lKTsKKyAgICAgICAgaWYgKGxlbiA+IDAgJiYgbGluZVtsZW4gLSAxXSA9PSAnXG4nKQorICAgICAgICAgICAgbGluZVtsZW4gLSAxXSA9ICdcMCc7CisgICAgICAgIGlmIChsaW5lWzBdID09ICcjJykKKwkgICAgY29udGludWU7CisJaWYgKCFzdHJuY21wKGxpbmUsICJtYXAgIiwgNCkpCisJICAgIGNvbnRpbnVlOworCWlmICghc3RybmNtcChsaW5lLCAiaW5jbHVkZSAiLCA4KSkgeworCSAgICBwYXJzZV9rZXlib2FyZF9sYXlvdXQodGFibGUsIGxpbmUgKyA4LCBrKTsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgY2hhciAqZW5kX29mX2tleXN5bSA9IGxpbmU7CisJICAgIHdoaWxlICgqZW5kX29mX2tleXN5bSAhPSAwICYmICplbmRfb2Zfa2V5c3ltICE9ICcgJykKKwkJZW5kX29mX2tleXN5bSsrOworCSAgICBpZiAoKmVuZF9vZl9rZXlzeW0pIHsKKwkJaW50IGtleXN5bTsKKwkJKmVuZF9vZl9rZXlzeW0gPSAwOworCQlrZXlzeW0gPSBnZXRfa2V5c3ltKHRhYmxlLCBsaW5lKTsKKwkJaWYgKGtleXN5bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vCQkgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiB1bmtub3duIGtleXN5bSAlc1xuIiwgbGluZSk7CisJCX0gZWxzZSB7CisJCSAgICBjb25zdCBjaGFyICpyZXN0ID0gZW5kX29mX2tleXN5bSArIDE7CisJCSAgICBjaGFyICpyZXN0MjsKKwkJICAgIGludCBrZXljb2RlID0gc3RydG9sKHJlc3QsICZyZXN0MiwgMCk7CisKKwkJICAgIGlmIChyZXN0ICYmIHN0cnN0cihyZXN0LCAibnVtbG9jayIpKSB7CisJCQlhZGRfdG9fa2V5X3JhbmdlKCZrLT5rZXlwYWRfcmFuZ2UsIGtleWNvZGUpOworCQkJYWRkX3RvX2tleV9yYW5nZSgmay0+bnVtbG9ja19yYW5nZSwga2V5c3ltKTsKKwkJCS8vZnByaW50ZihzdGRlcnIsICJrZXlwYWQga2V5c3ltICUwNHgga2V5Y29kZSAlZFxuIiwga2V5c3ltLCBrZXljb2RlKTsKKwkJICAgIH0KKworCQkgICAgLyogaWYoa2V5Y29kZSYweDgwKQorCQkgICAgICAga2V5Y29kZT0oa2V5Y29kZTw8OCleMHg4MGUwOyAqLworCQkgICAgaWYgKGtleXN5bSA8IE1BWF9OT1JNQUxfS0VZQ09ERSkgeworCQkJLy9mcHJpbnRmKHN0ZGVyciwiU2V0dGluZyBrZXlzeW0gJXMgKCVkKSB0byAlZFxuIixsaW5lLGtleXN5bSxrZXljb2RlKTsKKwkJCWstPmtleXN5bTJrZXljb2RlW2tleXN5bV0gPSBrZXljb2RlOworCQkgICAgfSBlbHNlIHsKKwkJCWlmIChrLT5leHRyYV9jb3VudCA+PSBNQVhfRVhUUkFfQ09VTlQpIHsKKwkJCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJCQkgICAgIldhcm5pbmc6IENvdWxkIG5vdCBhc3NpZ24ga2V5c3ltICVzICgweCV4KSBiZWNhdXNlIG9mIG1lbW9yeSBjb25zdHJhaW50cy5cbiIsCisJCQkJICAgIGxpbmUsIGtleXN5bSk7CisJCQl9IGVsc2UgeworI2lmIDAKKwkJCSAgICBmcHJpbnRmKHN0ZGVyciwgIlNldHRpbmcgJWQ6ICVkLCVkXG4iLAorCQkJCSAgICBrLT5leHRyYV9jb3VudCwga2V5c3ltLCBrZXljb2RlKTsKKyNlbmRpZgorCQkJICAgIGstPmtleXN5bTJrZXljb2RlX2V4dHJhW2stPmV4dHJhX2NvdW50XS4KKwkJCQlrZXlzeW0gPSBrZXlzeW07CisJCQkgICAgay0+a2V5c3ltMmtleWNvZGVfZXh0cmFbay0+ZXh0cmFfY291bnRdLgorCQkJCWtleWNvZGUgPSBrZXljb2RlOworCQkJICAgIGstPmV4dHJhX2NvdW50Kys7CisJCQl9CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKyAgICB9CisgICAgZmNsb3NlKGYpOworICAgIHJldHVybiBrOworfQorCisKK3ZvaWQgKmluaXRfa2V5Ym9hcmRfbGF5b3V0KGNvbnN0IG5hbWUya2V5c3ltX3QgKnRhYmxlLCBjb25zdCBjaGFyICpsYW5ndWFnZSkKK3sKKyAgICByZXR1cm4gcGFyc2Vfa2V5Ym9hcmRfbGF5b3V0KHRhYmxlLCBsYW5ndWFnZSwgTlVMTCk7Cit9CisKKworaW50IGtleXN5bTJzY2FuY29kZSh2b2lkICprYmRfbGF5b3V0LCBpbnQga2V5c3ltKQoreworICAgIGtiZF9sYXlvdXRfdCAqayA9IGtiZF9sYXlvdXQ7CisgICAgaWYgKGtleXN5bSA8IE1BWF9OT1JNQUxfS0VZQ09ERSkgeworCWlmIChrLT5rZXlzeW0ya2V5Y29kZVtrZXlzeW1dID09IDApCisJICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogbm8gc2NhbmNvZGUgZm91bmQgZm9yIGtleXN5bSAlZFxuIiwKKwkJICAgIGtleXN5bSk7CisJcmV0dXJuIGstPmtleXN5bTJrZXljb2RlW2tleXN5bV07CisgICAgfSBlbHNlIHsKKwlpbnQgaTsKKyNpZmRlZiBYS19JU09fTGVmdF9UYWIKKwlpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYikKKwkgICAga2V5c3ltID0gWEtfVGFiOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IGstPmV4dHJhX2NvdW50OyBpKyspCisJICAgIGlmIChrLT5rZXlzeW0ya2V5Y29kZV9leHRyYVtpXS5rZXlzeW0gPT0ga2V5c3ltKQorCQlyZXR1cm4gay0+a2V5c3ltMmtleWNvZGVfZXh0cmFbaV0ua2V5Y29kZTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrZXljb2RlX2lzX2tleXBhZCh2b2lkICprYmRfbGF5b3V0LCBpbnQga2V5Y29kZSkKK3sKKyAgICBrYmRfbGF5b3V0X3QgKmsgPSBrYmRfbGF5b3V0OworICAgIHN0cnVjdCBrZXlfcmFuZ2UgKmtyOworCisgICAgZm9yIChrciA9IGstPmtleXBhZF9yYW5nZTsga3I7IGtyID0ga3ItPm5leHQpCisgICAgICAgIGlmIChrZXljb2RlID49IGtyLT5zdGFydCAmJiBrZXljb2RlIDw9IGtyLT5lbmQpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGtleXN5bV9pc19udW1sb2NrKHZvaWQgKmtiZF9sYXlvdXQsIGludCBrZXlzeW0pCit7CisgICAga2JkX2xheW91dF90ICprID0ga2JkX2xheW91dDsKKyAgICBzdHJ1Y3Qga2V5X3JhbmdlICprcjsKKworICAgIGZvciAoa3IgPSBrLT5udW1sb2NrX3JhbmdlOyBrcjsga3IgPSBrci0+bmV4dCkKKyAgICAgICAgaWYgKGtleXN5bSA+PSBrci0+c3RhcnQgJiYga2V5c3ltIDw9IGtyLT5lbmQpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdWkva2V5bWFwcy5oIGIvYW5kcm9pZC9xZW11MS91aS9rZXltYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNmVmZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkva2V5bWFwcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBRRU1VIGtleXN5bSB0byBrZXljb2RlIGNvbnZlcnNpb24gdXNpbmcgcmRlc2t0b3Aga2V5bWFwcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBKb2hhbm5lcyBTY2hpbmRlbGluCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19RRU1VX0tFWU1BUFNfSF9fCisjZGVmaW5lIF9fUUVNVV9LRVlNQVBTX0hfXworCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIqIG5hbWU7CisJaW50IGtleXN5bTsKK30gbmFtZTJrZXlzeW1fdDsKKworc3RydWN0IGtleV9yYW5nZSB7CisgICAgaW50IHN0YXJ0OworICAgIGludCBlbmQ7CisgICAgc3RydWN0IGtleV9yYW5nZSAqbmV4dDsKK307CisKKyNkZWZpbmUgTUFYX05PUk1BTF9LRVlDT0RFIDUxMgorI2RlZmluZSBNQVhfRVhUUkFfQ09VTlQgMjU2Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3Qga2V5c3ltMmtleWNvZGVbTUFYX05PUk1BTF9LRVlDT0RFXTsKKyAgICBzdHJ1Y3QgeworCWludCBrZXlzeW07CisJdWludDE2X3Qga2V5Y29kZTsKKyAgICB9IGtleXN5bTJrZXljb2RlX2V4dHJhW01BWF9FWFRSQV9DT1VOVF07CisgICAgaW50IGV4dHJhX2NvdW50OworICAgIHN0cnVjdCBrZXlfcmFuZ2UgKmtleXBhZF9yYW5nZTsKKyAgICBzdHJ1Y3Qga2V5X3JhbmdlICpudW1sb2NrX3JhbmdlOworfSBrYmRfbGF5b3V0X3Q7CisKKwordm9pZCAqaW5pdF9rZXlib2FyZF9sYXlvdXQoY29uc3QgbmFtZTJrZXlzeW1fdCAqdGFibGUsIGNvbnN0IGNoYXIgKmxhbmd1YWdlKTsKK2ludCBrZXlzeW0yc2NhbmNvZGUodm9pZCAqa2JkX2xheW91dCwgaW50IGtleXN5bSk7CitpbnQga2V5Y29kZV9pc19rZXlwYWQodm9pZCAqa2JkX2xheW91dCwgaW50IGtleWNvZGUpOworaW50IGtleXN5bV9pc19udW1sb2NrKHZvaWQgKmtiZF9sYXlvdXQsIGludCBrZXlzeW0pOworCisjZW5kaWYgLyogX19RRU1VX0tFWU1BUFNfSF9fICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL3NkbF9rZXlzeW0uaCBiL2FuZHJvaWQvcWVtdTEvdWkvc2RsX2tleXN5bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTA0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3VpL3NkbF9rZXlzeW0uaApAQCAtMCwwICsxLDI3NyBAQAorCisjaW5jbHVkZSAia2V5bWFwcy5oIgorCitzdGF0aWMgY29uc3QgbmFtZTJrZXlzeW1fdCBuYW1lMmtleXN5bVtdPXsKKy8qIGFzY2lpICovCisgICAgeyAic3BhY2UiLCAgICAgICAgICAgICAgICAweDAyMH0sCisgICAgeyAiZXhjbGFtIiwgICAgICAgICAgICAgICAweDAyMX0sCisgICAgeyAicXVvdGVkYmwiLCAgICAgICAgICAgICAweDAyMn0sCisgICAgeyAibnVtYmVyc2lnbiIsICAgICAgICAgICAweDAyM30sCisgICAgeyAiZG9sbGFyIiwgICAgICAgICAgICAgICAweDAyNH0sCisgICAgeyAicGVyY2VudCIsICAgICAgICAgICAgICAweDAyNX0sCisgICAgeyAiYW1wZXJzYW5kIiwgICAgICAgICAgICAweDAyNn0sCisgICAgeyAiYXBvc3Ryb3BoZSIsICAgICAgICAgICAweDAyN30sCisgICAgeyAicGFyZW5sZWZ0IiwgICAgICAgICAgICAweDAyOH0sCisgICAgeyAicGFyZW5yaWdodCIsICAgICAgICAgICAweDAyOX0sCisgICAgeyAiYXN0ZXJpc2siLCAgICAgICAgICAgICAweDAyYX0sCisgICAgeyAicGx1cyIsICAgICAgICAgICAgICAgICAweDAyYn0sCisgICAgeyAiY29tbWEiLCAgICAgICAgICAgICAgICAweDAyY30sCisgICAgeyAibWludXMiLCAgICAgICAgICAgICAgICAweDAyZH0sCisgICAgeyAicGVyaW9kIiwgICAgICAgICAgICAgICAweDAyZX0sCisgICAgeyAic2xhc2giLCAgICAgICAgICAgICAgICAweDAyZn0sCisgICAgeyAiMCIsICAgICAgICAgICAgICAgICAgICAweDAzMH0sCisgICAgeyAiMSIsICAgICAgICAgICAgICAgICAgICAweDAzMX0sCisgICAgeyAiMiIsICAgICAgICAgICAgICAgICAgICAweDAzMn0sCisgICAgeyAiMyIsICAgICAgICAgICAgICAgICAgICAweDAzM30sCisgICAgeyAiNCIsICAgICAgICAgICAgICAgICAgICAweDAzNH0sCisgICAgeyAiNSIsICAgICAgICAgICAgICAgICAgICAweDAzNX0sCisgICAgeyAiNiIsICAgICAgICAgICAgICAgICAgICAweDAzNn0sCisgICAgeyAiNyIsICAgICAgICAgICAgICAgICAgICAweDAzN30sCisgICAgeyAiOCIsICAgICAgICAgICAgICAgICAgICAweDAzOH0sCisgICAgeyAiOSIsICAgICAgICAgICAgICAgICAgICAweDAzOX0sCisgICAgeyAiY29sb24iLCAgICAgICAgICAgICAgICAweDAzYX0sCisgICAgeyAic2VtaWNvbG9uIiwgICAgICAgICAgICAweDAzYn0sCisgICAgeyAibGVzcyIsICAgICAgICAgICAgICAgICAweDAzY30sCisgICAgeyAiZXF1YWwiLCAgICAgICAgICAgICAgICAweDAzZH0sCisgICAgeyAiZ3JlYXRlciIsICAgICAgICAgICAgICAweDAzZX0sCisgICAgeyAicXVlc3Rpb24iLCAgICAgICAgICAgICAweDAzZn0sCisgICAgeyAiYXQiLCAgICAgICAgICAgICAgICAgICAweDA0MH0sCisgICAgeyAiQSIsICAgICAgICAgICAgICAgICAgICAweDA0MX0sCisgICAgeyAiQiIsICAgICAgICAgICAgICAgICAgICAweDA0Mn0sCisgICAgeyAiQyIsICAgICAgICAgICAgICAgICAgICAweDA0M30sCisgICAgeyAiRCIsICAgICAgICAgICAgICAgICAgICAweDA0NH0sCisgICAgeyAiRSIsICAgICAgICAgICAgICAgICAgICAweDA0NX0sCisgICAgeyAiRiIsICAgICAgICAgICAgICAgICAgICAweDA0Nn0sCisgICAgeyAiRyIsICAgICAgICAgICAgICAgICAgICAweDA0N30sCisgICAgeyAiSCIsICAgICAgICAgICAgICAgICAgICAweDA0OH0sCisgICAgeyAiSSIsICAgICAgICAgICAgICAgICAgICAweDA0OX0sCisgICAgeyAiSiIsICAgICAgICAgICAgICAgICAgICAweDA0YX0sCisgICAgeyAiSyIsICAgICAgICAgICAgICAgICAgICAweDA0Yn0sCisgICAgeyAiTCIsICAgICAgICAgICAgICAgICAgICAweDA0Y30sCisgICAgeyAiTSIsICAgICAgICAgICAgICAgICAgICAweDA0ZH0sCisgICAgeyAiTiIsICAgICAgICAgICAgICAgICAgICAweDA0ZX0sCisgICAgeyAiTyIsICAgICAgICAgICAgICAgICAgICAweDA0Zn0sCisgICAgeyAiUCIsICAgICAgICAgICAgICAgICAgICAweDA1MH0sCisgICAgeyAiUSIsICAgICAgICAgICAgICAgICAgICAweDA1MX0sCisgICAgeyAiUiIsICAgICAgICAgICAgICAgICAgICAweDA1Mn0sCisgICAgeyAiUyIsICAgICAgICAgICAgICAgICAgICAweDA1M30sCisgICAgeyAiVCIsICAgICAgICAgICAgICAgICAgICAweDA1NH0sCisgICAgeyAiVSIsICAgICAgICAgICAgICAgICAgICAweDA1NX0sCisgICAgeyAiViIsICAgICAgICAgICAgICAgICAgICAweDA1Nn0sCisgICAgeyAiVyIsICAgICAgICAgICAgICAgICAgICAweDA1N30sCisgICAgeyAiWCIsICAgICAgICAgICAgICAgICAgICAweDA1OH0sCisgICAgeyAiWSIsICAgICAgICAgICAgICAgICAgICAweDA1OX0sCisgICAgeyAiWiIsICAgICAgICAgICAgICAgICAgICAweDA1YX0sCisgICAgeyAiYnJhY2tldGxlZnQiLCAgICAgICAgICAweDA1Yn0sCisgICAgeyAiYmFja3NsYXNoIiwgICAgICAgICAgICAweDA1Y30sCisgICAgeyAiYnJhY2tldHJpZ2h0IiwgICAgICAgICAweDA1ZH0sCisgICAgeyAiYXNjaWljaXJjdW0iLCAgICAgICAgICAweDA1ZX0sCisgICAgeyAidW5kZXJzY29yZSIsICAgICAgICAgICAweDA1Zn0sCisgICAgeyAiZ3JhdmUiLCAgICAgICAgICAgICAgICAweDA2MH0sCisgICAgeyAiYSIsICAgICAgICAgICAgICAgICAgICAweDA2MX0sCisgICAgeyAiYiIsICAgICAgICAgICAgICAgICAgICAweDA2Mn0sCisgICAgeyAiYyIsICAgICAgICAgICAgICAgICAgICAweDA2M30sCisgICAgeyAiZCIsICAgICAgICAgICAgICAgICAgICAweDA2NH0sCisgICAgeyAiZSIsICAgICAgICAgICAgICAgICAgICAweDA2NX0sCisgICAgeyAiZiIsICAgICAgICAgICAgICAgICAgICAweDA2Nn0sCisgICAgeyAiZyIsICAgICAgICAgICAgICAgICAgICAweDA2N30sCisgICAgeyAiaCIsICAgICAgICAgICAgICAgICAgICAweDA2OH0sCisgICAgeyAiaSIsICAgICAgICAgICAgICAgICAgICAweDA2OX0sCisgICAgeyAiaiIsICAgICAgICAgICAgICAgICAgICAweDA2YX0sCisgICAgeyAiayIsICAgICAgICAgICAgICAgICAgICAweDA2Yn0sCisgICAgeyAibCIsICAgICAgICAgICAgICAgICAgICAweDA2Y30sCisgICAgeyAibSIsICAgICAgICAgICAgICAgICAgICAweDA2ZH0sCisgICAgeyAibiIsICAgICAgICAgICAgICAgICAgICAweDA2ZX0sCisgICAgeyAibyIsICAgICAgICAgICAgICAgICAgICAweDA2Zn0sCisgICAgeyAicCIsICAgICAgICAgICAgICAgICAgICAweDA3MH0sCisgICAgeyAicSIsICAgICAgICAgICAgICAgICAgICAweDA3MX0sCisgICAgeyAiciIsICAgICAgICAgICAgICAgICAgICAweDA3Mn0sCisgICAgeyAicyIsICAgICAgICAgICAgICAgICAgICAweDA3M30sCisgICAgeyAidCIsICAgICAgICAgICAgICAgICAgICAweDA3NH0sCisgICAgeyAidSIsICAgICAgICAgICAgICAgICAgICAweDA3NX0sCisgICAgeyAidiIsICAgICAgICAgICAgICAgICAgICAweDA3Nn0sCisgICAgeyAidyIsICAgICAgICAgICAgICAgICAgICAweDA3N30sCisgICAgeyAieCIsICAgICAgICAgICAgICAgICAgICAweDA3OH0sCisgICAgeyAieSIsICAgICAgICAgICAgICAgICAgICAweDA3OX0sCisgICAgeyAieiIsICAgICAgICAgICAgICAgICAgICAweDA3YX0sCisgICAgeyAiYnJhY2VsZWZ0IiwgICAgICAgICAgICAweDA3Yn0sCisgICAgeyAiYmFyIiwgICAgICAgICAgICAgICAgICAweDA3Y30sCisgICAgeyAiYnJhY2VyaWdodCIsICAgICAgICAgICAweDA3ZH0sCisgICAgeyAiYXNjaWl0aWxkZSIsICAgICAgICAgICAweDA3ZX0sCisKKy8qIGxhdGluIDEgZXh0ZW5zaW9ucyAqLworeyAibm9icmVha3NwYWNlIiwgICAgICAgICAweDBhMH0sCit7ICJleGNsYW1kb3duIiwgICAgICAgICAgIDB4MGExfSwKK3sgImNlbnQiLCAgICAgICAgIAkgIDB4MGEyfSwKK3sgInN0ZXJsaW5nIiwgICAgICAgICAgICAgMHgwYTN9LAoreyAiY3VycmVuY3kiLCAgICAgICAgICAgICAweDBhNH0sCit7ICJ5ZW4iLCAgICAgICAgICAgICAgICAgIDB4MGE1fSwKK3sgImJyb2tlbmJhciIsICAgICAgICAgICAgMHgwYTZ9LAoreyAic2VjdGlvbiIsICAgICAgICAgICAgICAweDBhN30sCit7ICJkaWFlcmVzaXMiLCAgICAgICAgICAgIDB4MGE4fSwKK3sgImNvcHlyaWdodCIsICAgICAgICAgICAgMHgwYTl9LAoreyAib3JkZmVtaW5pbmUiLCAgICAgICAgICAweDBhYX0sCit7ICJndWlsbGVtb3RsZWZ0IiwgICAgICAgIDB4MGFifSwKK3sgIm5vdHNpZ24iLCAgICAgICAgICAgICAgMHgwYWN9LAoreyAiaHlwaGVuIiwgICAgICAgICAgICAgICAweDBhZH0sCit7ICJyZWdpc3RlcmVkIiwgICAgICAgICAgIDB4MGFlfSwKK3sgIm1hY3JvbiIsICAgICAgICAgICAgICAgMHgwYWZ9LAoreyAiZGVncmVlIiwgICAgICAgICAgICAgICAweDBiMH0sCit7ICJwbHVzbWludXMiLCAgICAgICAgICAgIDB4MGIxfSwKK3sgInR3b3N1cGVyaW9yIiwgICAgICAgICAgMHgwYjJ9LAoreyAidGhyZWVzdXBlcmlvciIsICAgICAgICAweDBiM30sCit7ICJhY3V0ZSIsICAgICAgICAgICAgICAgIDB4MGI0fSwKK3sgIm11IiwgICAgICAgICAgICAgICAgICAgMHgwYjV9LAoreyAicGFyYWdyYXBoIiwgICAgICAgICAgICAweDBiNn0sCit7ICJwZXJpb2RjZW50ZXJlZCIsICAgICAgIDB4MGI3fSwKK3sgImNlZGlsbGEiLCAgICAgICAgICAgICAgMHgwYjh9LAoreyAib25lc3VwZXJpb3IiLCAgICAgICAgICAweDBiOX0sCit7ICJtYXNjdWxpbmUiLCAgICAgICAgICAgIDB4MGJhfSwKK3sgImd1aWxsZW1vdHJpZ2h0IiwgICAgICAgMHgwYmJ9LAoreyAib25lcXVhcnRlciIsICAgICAgICAgICAweDBiY30sCit7ICJvbmVoYWxmIiwgICAgICAgICAgICAgIDB4MGJkfSwKK3sgInRocmVlcXVhcnRlcnMiLCAgICAgICAgMHgwYmV9LAoreyAicXVlc3Rpb25kb3duIiwgICAgICAgICAweDBiZn0sCit7ICJBZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGMwfSwKK3sgIkFhY3V0ZSIsICAgICAgICAgICAgICAgMHgwYzF9LAoreyAiQWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBjMn0sCit7ICJBdGlsZGUiLCAgICAgICAgICAgICAgIDB4MGMzfSwKK3sgIkFkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwYzR9LAoreyAiQXJpbmciLCAgICAgICAgICAgICAgICAweDBjNX0sCit7ICJBRSIsICAgICAgICAgICAgICAgICAgIDB4MGM2fSwKK3sgIkNjZWRpbGxhIiwgICAgICAgICAgICAgMHgwYzd9LAoreyAiRWdyYXZlIiwgICAgICAgICAgICAgICAweDBjOH0sCit7ICJFYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGM5fSwKK3sgIkVjaXJjdW1mbGV4IiwgICAgICAgICAgMHgwY2F9LAoreyAiRWRpYWVyZXNpcyIsICAgICAgICAgICAweDBjYn0sCit7ICJJZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGNjfSwKK3sgIklhY3V0ZSIsICAgICAgICAgICAgICAgMHgwY2R9LAoreyAiSWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBjZX0sCit7ICJJZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGNmfSwKK3sgIkVUSCIsICAgICAgICAgICAgICAgICAgMHgwZDB9LAoreyAiRXRoIiwgICAgICAgICAgICAgICAgICAweDBkMH0sCit7ICJOdGlsZGUiLCAgICAgICAgICAgICAgIDB4MGQxfSwKK3sgIk9ncmF2ZSIsICAgICAgICAgICAgICAgMHgwZDJ9LAoreyAiT2FjdXRlIiwgICAgICAgICAgICAgICAweDBkM30sCit7ICJPY2lyY3VtZmxleCIsICAgICAgICAgIDB4MGQ0fSwKK3sgIk90aWxkZSIsICAgICAgICAgICAgICAgMHgwZDV9LAoreyAiT2RpYWVyZXNpcyIsICAgICAgICAgICAweDBkNn0sCit7ICJtdWx0aXBseSIsICAgICAgICAgICAgIDB4MGQ3fSwKK3sgIk9vYmxpcXVlIiwgICAgICAgICAgICAgMHgwZDh9LAoreyAiT3NsYXNoIiwgICAgICAgICAgICAgICAweDBkOH0sCit7ICJVZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGQ5fSwKK3sgIlVhY3V0ZSIsICAgICAgICAgICAgICAgMHgwZGF9LAoreyAiVWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBkYn0sCit7ICJVZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGRjfSwKK3sgIllhY3V0ZSIsICAgICAgICAgICAgICAgMHgwZGR9LAoreyAiVEhPUk4iLCAgICAgICAgICAgICAgICAweDBkZX0sCit7ICJUaG9ybiIsICAgICAgICAgICAgICAgIDB4MGRlfSwKK3sgInNzaGFycCIsICAgICAgICAgICAgICAgMHgwZGZ9LAoreyAiYWdyYXZlIiwgICAgICAgICAgICAgICAweDBlMH0sCit7ICJhYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGUxfSwKK3sgImFjaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZTJ9LAoreyAiYXRpbGRlIiwgICAgICAgICAgICAgICAweDBlM30sCit7ICJhZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGU0fSwKK3sgImFyaW5nIiwgICAgICAgICAgICAgICAgMHgwZTV9LAoreyAiYWUiLCAgICAgICAgICAgICAgICAgICAweDBlNn0sCit7ICJjY2VkaWxsYSIsICAgICAgICAgICAgIDB4MGU3fSwKK3sgImVncmF2ZSIsICAgICAgICAgICAgICAgMHgwZTh9LAoreyAiZWFjdXRlIiwgICAgICAgICAgICAgICAweDBlOX0sCit7ICJlY2lyY3VtZmxleCIsICAgICAgICAgIDB4MGVhfSwKK3sgImVkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZWJ9LAoreyAiaWdyYXZlIiwgICAgICAgICAgICAgICAweDBlY30sCit7ICJpYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGVkfSwKK3sgImljaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZWV9LAoreyAiaWRpYWVyZXNpcyIsICAgICAgICAgICAweDBlZn0sCit7ICJldGgiLCAgICAgICAgICAgICAgICAgIDB4MGYwfSwKK3sgIm50aWxkZSIsICAgICAgICAgICAgICAgMHgwZjF9LAoreyAib2dyYXZlIiwgICAgICAgICAgICAgICAweDBmMn0sCit7ICJvYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGYzfSwKK3sgIm9jaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZjR9LAoreyAib3RpbGRlIiwgICAgICAgICAgICAgICAweDBmNX0sCit7ICJvZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGY2fSwKK3sgImRpdmlzaW9uIiwgICAgICAgICAgICAgMHgwZjd9LAoreyAib3NsYXNoIiwgICAgICAgICAgICAgICAweDBmOH0sCit7ICJvb2JsaXF1ZSIsICAgICAgICAgICAgIDB4MGY4fSwKK3sgInVncmF2ZSIsICAgICAgICAgICAgICAgMHgwZjl9LAoreyAidWFjdXRlIiwgICAgICAgICAgICAgICAweDBmYX0sCit7ICJ1Y2lyY3VtZmxleCIsICAgICAgICAgIDB4MGZifSwKK3sgInVkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZmN9LAoreyAieWFjdXRlIiwgICAgICAgICAgICAgICAweDBmZH0sCit7ICJ0aG9ybiIsICAgICAgICAgICAgICAgIDB4MGZlfSwKK3sgInlkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZmZ9LAoreyJFdXJvU2lnbiIsIFNETEtfRVVST30sCisKKyAgICAvKiBtb2RpZmllcnMgKi8KK3siQ29udHJvbF9MIiwgU0RMS19MQ1RSTH0sCit7IkNvbnRyb2xfUiIsIFNETEtfUkNUUkx9LAoreyJBbHRfTCIsIFNETEtfTEFMVH0sCit7IkFsdF9SIiwgU0RMS19SQUxUfSwKK3siQ2Fwc19Mb2NrIiwgU0RMS19DQVBTTE9DS30sCit7Ik1ldGFfTCIsIFNETEtfTE1FVEF9LAoreyJNZXRhX1IiLCBTRExLX1JNRVRBfSwKK3siU2hpZnRfTCIsIFNETEtfTFNISUZUfSwKK3siU2hpZnRfUiIsIFNETEtfUlNISUZUfSwKK3siU3VwZXJfTCIsIFNETEtfTFNVUEVSfSwKK3siU3VwZXJfUiIsIFNETEtfUlNVUEVSfSwKKworICAgIC8qIHNwZWNpYWwga2V5cyAqLworeyJCYWNrU3BhY2UiLCBTRExLX0JBQ0tTUEFDRX0sCit7IlRhYiIsIFNETEtfVEFCfSwKK3siUmV0dXJuIiwgU0RMS19SRVRVUk59LAoreyJSaWdodCIsIFNETEtfUklHSFR9LAoreyJMZWZ0IiwgU0RMS19MRUZUfSwKK3siVXAiLCBTRExLX1VQfSwKK3siRG93biIsIFNETEtfRE9XTn0sCit7IlBhZ2VfRG93biIsIFNETEtfUEFHRURPV059LAoreyJQYWdlX1VwIiwgU0RMS19QQUdFVVB9LAoreyJJbnNlcnQiLCBTRExLX0lOU0VSVH0sCit7IkRlbGV0ZSIsIFNETEtfREVMRVRFfSwKK3siSG9tZSIsIFNETEtfSE9NRX0sCit7IkVuZCIsIFNETEtfRU5EfSwKK3siU2Nyb2xsX0xvY2siLCBTRExLX1NDUk9MTE9DS30sCit7IkYxIiwgU0RMS19GMX0sCit7IkYyIiwgU0RMS19GMn0sCit7IkYzIiwgU0RMS19GM30sCit7IkY0IiwgU0RMS19GNH0sCit7IkY1IiwgU0RMS19GNX0sCit7IkY2IiwgU0RMS19GNn0sCit7IkY3IiwgU0RMS19GN30sCit7IkY4IiwgU0RMS19GOH0sCit7IkY5IiwgU0RMS19GOX0sCit7IkYxMCIsIFNETEtfRjEwfSwKK3siRjExIiwgU0RMS19GMTF9LAoreyJGMTIiLCBTRExLX0YxMn0sCit7IkYxMyIsIFNETEtfRjEzfSwKK3siRjE0IiwgU0RMS19GMTR9LAoreyJGMTUiLCBTRExLX0YxNX0sCit7IlN5c19SZXEiLCBTRExLX1NZU1JFUX0sCit7IktQXzAiLCBTRExLX0tQMH0sCit7IktQXzEiLCBTRExLX0tQMX0sCit7IktQXzIiLCBTRExLX0tQMn0sCit7IktQXzMiLCBTRExLX0tQM30sCit7IktQXzQiLCBTRExLX0tQNH0sCit7IktQXzUiLCBTRExLX0tQNX0sCit7IktQXzYiLCBTRExLX0tQNn0sCit7IktQXzciLCBTRExLX0tQN30sCit7IktQXzgiLCBTRExLX0tQOH0sCit7IktQXzkiLCBTRExLX0tQOX0sCit7IktQX0FkZCIsIFNETEtfS1BfUExVU30sCit7IktQX0RlY2ltYWwiLCBTRExLX0tQX1BFUklPRH0sCit7IktQX0RpdmlkZSIsIFNETEtfS1BfRElWSURFfSwKK3siS1BfRW50ZXIiLCBTRExLX0tQX0VOVEVSfSwKK3siS1BfRXF1YWwiLCBTRExLX0tQX0VRVUFMU30sCit7IktQX011bHRpcGx5IiwgU0RMS19LUF9NVUxUSVBMWX0sCit7IktQX1N1YnRyYWN0IiwgU0RMS19LUF9NSU5VU30sCit7ImhlbHAiLCBTRExLX0hFTFB9LAoreyJNZW51IiwgU0RMS19NRU5VfSwKK3siUG93ZXIiLCBTRExLX1BPV0VSfSwKK3siUHJpbnQiLCBTRExLX1BSSU5UfSwKK3siTW9kZV9zd2l0Y2giLCBTRExLX01PREV9LAoreyJNdWx0aV9LZXkiLCBTRExLX0NPTVBPU0V9LAoreyJOdW1fTG9jayIsIFNETEtfTlVNTE9DS30sCit7IlBhdXNlIiwgU0RMS19QQVVTRX0sCit7IkVzY2FwZSIsIFNETEtfRVNDQVBFfSwKKwore05VTEwsIDB9LAorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdWkvdmdhZm9udC5oIGIvYW5kcm9pZC9xZW11MS91aS92Z2Fmb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwNmRkNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvdmdhZm9udC5oCkBAIC0wLDAgKzEsNDYxMSBAQAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmdhZm9udDE2WzI1NiAqIDE2XSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEgMHgwMSAnXkEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGE1LCAvKiAxMDEwMDEwMSAqLworCTB4ODEsIC8qIDEwMDAwMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweDgxLCAvKiAxMDAwMDAwMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQgMHgwNCAnXkQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcgMHgwNyAnXkcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4YzMsIC8qIDExMDAwMDExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDQyLCAvKiAwMTAwMDAxMCAqLworCTB4NDIsIC8qIDAxMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwIDB4MGEgJ15KJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhiZCwgLyogMTAxMTExMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWEsIC8qIDAwMDExMDEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzIDB4MGQgJ15NJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzMsIC8qIDAwMTEwMDExICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4N2YsIC8qIDAxMTExMTExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4NjMsIC8qIDAxMTAwMDExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDY3LCAvKiAwMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2IDB4MTAgJ15QJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg4MCwgLyogMTAwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDIsIC8qIDAwMDAwMDEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5IDB4MTMgJ15TJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDdiLCAvKiAwMTExMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyIDB4MTYgJ15WJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1IDB4MTkgJ15ZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI4IDB4MWMgJ15cJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMxIDB4MWYgJ15fJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNCAweDIyICciJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ODYsIC8qIDEwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNyAweDI1ICclJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDg2LCAvKiAxMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MCAweDI4ICcoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MyAweDJiICcrJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NiAweDJlICcuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OSAweDMxICcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MiAweDM0ICc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NSAweDM3ICc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OCAweDNhICc6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MSAweDNkICc9JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NCAweDQwICdAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NyAweDQzICdDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MCAweDQ2ICdGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNhLCAvKiAwMDExMTAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MyAweDQ5ICdJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NiAweDRjICdMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhjZSwgLyogMTEwMDExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OSAweDRmICdPJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MiAweDUyICdSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg1YSwgLyogMDEwMTEwMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NSAweDU1ICdVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhlZSwgLyogMTExMDExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OCAweDU4ICdYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MSAweDViICdbJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDAyLCAvKiAwMDAwMDAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NCAweDVlICdeJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NyAweDYxICdhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDAgMHg2NCAnZCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDMgMHg2NyAnZycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDYgMHg2YSAnaicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDkgMHg2ZCAnbScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTIgMHg3MCAncCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTUgMHg3MyAncycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTggMHg3NiAndicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjEgMHg3OSAneScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjQgMHg3YyAnfCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjcgMHg3ZiAnfycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI4IDB4ODAgJ8KAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjkgMHg4MSAnwoEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMCAweDgyICfCgicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJ8KDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzIgMHg4NCAnwoQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMyAweDg1ICfChScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJ8KGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzUgMHg4NyAnwocnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNiAweDg4ICfCiCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJ8KJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzggMHg4YSAnwoonICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOSAweDhiICfCiycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQwIDB4OGMgJ8KMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDEgMHg4ZCAnwo0nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MiAweDhlICfCjicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQzIDB4OGYgJ8KPJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDQgMHg5MCAnwpAnICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NjgsIC8qIDAxMTAxMDAwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NSAweDkxICfCkScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg2ZSwgLyogMDExMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJ8KSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDcgMHg5MyAnwpMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0OCAweDk0ICfClCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJ8KVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTAgMHg5NiAnwpYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MSAweDk3ICfClycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJ8KYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTMgMHg5OSAnwpknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NCAweDlhICfCmicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU1IDB4OWIgJ8KbJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTYgMHg5YyAnwpwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NCwgLyogMDExMDAxMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NyAweDlkICfCnScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU4IDB4OWUgJ8KeJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGM0LCAvKiAxMTAwMDEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTkgMHg5ZiAnwp8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MCAweGEwICfCoCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTYxIDB4YTEgJ8KhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjIgMHhhMiAnwqInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MyAweGEzICfCoycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY0IDB4YTQgJ8KkJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjUgMHhhNSAnwqUnICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NiAweGE2ICfCpicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY3IDB4YTcgJ8KnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjggMHhhOCAnwqgnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OSAweGE5ICfCqScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTcwIDB4YWEgJ8KqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzEgMHhhYiAnwqsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDg2LCAvKiAxMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MiAweGFjICfCrCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhlMCwgLyogMTExMDAwMDAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4OWEsIC8qIDEwMDExMDEwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTczIDB4YWQgJ8KtJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzQgMHhhZSAnwq4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NSAweGFmICfCrycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTc2IDB4YjAgJ8KwJyAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisKKwkvKiAxNzcgMHhiMSAnwrEnICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKworCS8qIDE3OCAweGIyICfCsicgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCisJLyogMTc5IDB4YjMgJ8KzJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxODAgMHhiNCAnwrQnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MSAweGI1ICfCtScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTgyIDB4YjYgJ8K2JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODMgMHhiNyAnwrcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NCAweGI4ICfCuCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTg1IDB4YjkgJ8K5JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODYgMHhiYSAnwronICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NyAweGJiICfCuycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMTg4IDB4YmMgJ8K8JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxODkgMHhiZCAnwr0nICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MCAweGJlICfCvicgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTkxIDB4YmYgJ8K/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTIgMHhjMCAnw4AnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MyAweGMxICfDgScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk0IDB4YzIgJ8OCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTUgMHhjMyAnw4MnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5NiAweGM0ICfDhCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk3IDB4YzUgJ8OFJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTggMHhjNiAnw4YnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MWYsIC8qIDAwMDExMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5OSAweGM3ICfDhycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjAwIDB4YzggJ8OIJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMDEgMHhjOSAnw4knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwMiAweGNhICfDiicgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjAzIDB4Y2IgJ8OLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDQgMHhjYyAnw4wnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNSAweGNkICfDjScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA2IDB4Y2UgJ8OOJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDcgMHhjZiAnw48nICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwOCAweGQwICfDkCcgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA5IDB4ZDEgJ8ORJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTAgMHhkMiAnw5InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxMSAweGQzICfDkycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEyIDB4ZDQgJ8OUJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMTMgMHhkNSAnw5UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MWYsIC8qIDAwMDExMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxNCAweGQ2ICfDlicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjE1IDB4ZDcgJ8OXJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMTYgMHhkOCAnw5gnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxNyAweGQ5ICfDmScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjE4IDB4ZGEgJ8OaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTkgMHhkYiAnw5snICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDIyMCAweGRjICfDnCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCisJLyogMjIxIDB4ZGQgJ8OdJyAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisKKwkvKiAyMjIgMHhkZSAnw54nICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKworCS8qIDIyMyAweGRmICfDnycgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI0IDB4ZTAgJ8OgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjUgMHhlMSAnw6EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNiAweGUyICfDoicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI3IDB4ZTMgJ8OjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjggMHhlNCAnw6QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOSAweGU1ICfDpScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMwIDB4ZTYgJ8OmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzEgMHhlNyAnw6cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMiAweGU4ICfDqCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMzIDB4ZTkgJ8OpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzQgMHhlYSAnw6onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNSAweGViICfDqycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM2IDB4ZWMgJ8OsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzcgMHhlZCAnw60nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMywgLyogMDAwMDAwMTEgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZjMsIC8qIDExMTEwMDExICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzOCAweGVlICfDricgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM5IDB4ZWYgJ8OvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDAgMHhmMCAnw7AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MSAweGYxICfDsScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQyIDB4ZjIgJ8OyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDMgMHhmMyAnw7MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NCAweGY0ICfDtCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMjQ1IDB4ZjUgJ8O1JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDYgMHhmNiAnw7YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NyAweGY3ICfDtycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQ4IDB4ZjggJ8O4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDkgMHhmOSAnw7knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MCAweGZhICfDuicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjUxIDB4ZmIgJ8O7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTIgMHhmYyAnw7wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MyAweGZkICfDvScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjU0IDB4ZmUgJ8O+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTUgMHhmZiAnw78nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdWkvdm5jLWFuZHJvaWQuYyBiL2FuZHJvaWQvcWVtdTEvdWkvdm5jLWFuZHJvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE1OTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS92bmMtYW5kcm9pZC5jCkBAIC0wLDAgKzEsMjQwNCBAQAorLyoKKyAqIFFFTVUgVk5DIGRpc3BsYXkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFudGhvbnkgTGlndW9yaSA8YW50aG9ueUBjb2RlbW9ua2V5LndzPgorICogQ29weXJpZ2h0IChDKSAyMDA2IEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAidm5jLmgiCisjaW5jbHVkZSAic3lzZW11L3N5c2VtdS5oIgorI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgorI2luY2x1ZGUgInFlbXUvdGltZXIuaCIKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworI2luY2x1ZGUgInFlbXUvYWNsLmgiCisjZW5kaWYKKworI2RlZmluZSBWTkNfUkVGUkVTSF9JTlRFUlZBTCAoMTAwMCAvIDMwKQorCisjaW5jbHVkZSAidm5jX2tleXN5bS5oIgorI2luY2x1ZGUgImQzZGVzLmgiCisKKyNkZWZpbmUgY291bnRfYml0cyhjLCB2KSB7IFwKKyAgICBmb3IgKGMgPSAwOyB2OyB2ID4+PSAxKSBcCisgICAgeyBcCisgICAgICAgIGMgKz0gdiAmIDE7IFwKKyAgICB9IFwKK30KKworCitzdGF0aWMgVm5jRGlzcGxheSAqdm5jX2Rpc3BsYXk7IC8qIG5lZWRlZCBmb3IgaW5mbyB2bmMgKi8KK3N0YXRpYyBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgKmRjbDsKKworc3RhdGljIGNoYXIgKmFkZHJfdG9fc3RyaW5nKGNvbnN0IGNoYXIgKmZvcm1hdCwgU29ja0FkZHJlc3MqICBzYSkKK3sKKyAgICBjaGFyICphZGRyOworICAgIGNoYXIgaG9zdFsyNTZdOworICAgIGNoYXIgc2VydlszMl07CisgICAgaW50IGVycjsKKyAgICBzaXplX3QgYWRkcmxlbjsKKworI2lmIDEgLyogQU5EUk9JRCAqLworICAgIGVyciA9IHNvY2tfYWRkcmVzc19nZXRfbnVtZXJpY19pbmZvIChzYSwgaG9zdCwgc2l6ZW9mKGhvc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LCBzaXplb2Yoc2VydikpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBWTkNfREVCVUcoIkNhbm5vdCByZXNvbHZlIGFkZHJlc3MgJyVzJzogJXNcbiIsCisgICAgICAgICAgICAgICAgICBzb2NrX2FkZHJlc3NfdG9fc3RyaW5nKHNhKSwgZXJybm9fc3RyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoKGVyciA9IGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKilzYSwgc2FsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCBzaXplb2YoaG9zdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2LCBzaXplb2Yoc2VydiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKSkgIT0gMCkgeworICAgICAgICBWTkNfREVCVUcoIkNhbm5vdCByZXNvbHZlIGFkZHJlc3MgJWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgZXJyLCBnYWlfc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgLyogRW5vdWdoIGZvciB0aGUgZXhpc3RpbmcgZm9ybWF0ICsgdGhlIDIgdmFycyB3ZSdyZQorICAgICAqIHN1YnN0aXR1dGluZyBpbi4gKi8KKyAgICBhZGRybGVuID0gc3RybGVuKGZvcm1hdCkgKyBzdHJsZW4oaG9zdCkgKyBzdHJsZW4oc2Vydik7CisgICAgYWRkciA9IGdfbWFsbG9jKGFkZHJsZW4gKyAxKTsKKyAgICBzbnByaW50ZihhZGRyLCBhZGRybGVuLCBmb3JtYXQsIGhvc3QsIHNlcnYpOworICAgIGFkZHJbYWRkcmxlbl0gPSAnXDAnOworCisgICAgcmV0dXJuIGFkZHI7Cit9CisKKworY2hhciAqdm5jX3NvY2tldF9sb2NhbF9hZGRyKGNvbnN0IGNoYXIgKmZvcm1hdCwgaW50IGZkKSB7CisgICAgU29ja0FkZHJlc3MgIHNhOworCisgICAgaWYgKHNvY2tldF9nZXRfYWRkcmVzcyhmZCwgJnNhKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGFkZHJfdG9fc3RyaW5nKGZvcm1hdCwgJnNhKTsKK30KKworCitjaGFyICp2bmNfc29ja2V0X3JlbW90ZV9hZGRyKGNvbnN0IGNoYXIgKmZvcm1hdCwgaW50IGZkKSB7CisgICAgU29ja0FkZHJlc3MgIHNhOworCisgICAgaWYgKHNvY2tldF9nZXRfcGVlcl9hZGRyZXNzKGZkLCAmc2EpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gYWRkcl90b19zdHJpbmcoZm9ybWF0LCAmc2EpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdm5jX2F1dGhfbmFtZShWbmNEaXNwbGF5ICp2ZCkgeworICAgIHN3aXRjaCAodmQtPmF1dGgpIHsKKyAgICBjYXNlIFZOQ19BVVRIX0lOVkFMSUQ6CisgICAgICAgIHJldHVybiAiaW52YWxpZCI7CisgICAgY2FzZSBWTkNfQVVUSF9OT05FOgorICAgICAgICByZXR1cm4gIm5vbmUiOworICAgIGNhc2UgVk5DX0FVVEhfVk5DOgorICAgICAgICByZXR1cm4gInZuYyI7CisgICAgY2FzZSBWTkNfQVVUSF9SQTI6CisgICAgICAgIHJldHVybiAicmEyIjsKKyAgICBjYXNlIFZOQ19BVVRIX1JBMk5FOgorICAgICAgICByZXR1cm4gInJhMm5lIjsKKyAgICBjYXNlIFZOQ19BVVRIX1RJR0hUOgorICAgICAgICByZXR1cm4gInRpZ2h0IjsKKyAgICBjYXNlIFZOQ19BVVRIX1VMVFJBOgorICAgICAgICByZXR1cm4gInVsdHJhIjsKKyAgICBjYXNlIFZOQ19BVVRIX1RMUzoKKyAgICAgICAgcmV0dXJuICJ0bHMiOworICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFQ6CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgc3dpdGNoICh2ZC0+c3ViYXV0aCkgeworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1BMQUlOOgorICAgICAgICAgICAgcmV0dXJuICJ2ZW5jcnlwdCtwbGFpbiI7CisgICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFRfVExTTk9ORToKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQrdGxzK25vbmUiOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1RMU1ZOQzoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQrdGxzK3ZuYyI7CisgICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFRfVExTUExBSU46CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3RscytwbGFpbiI7CisgICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOU5PTkU6CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3g1MDkrbm9uZSI7CisgICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOVZOQzoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQreDUwOSt2bmMiOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlQTEFJTjoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQreDUwOStwbGFpbiI7CisgICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFRfVExTU0FTTDoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQrdGxzK3Nhc2wiOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlTQVNMOgorICAgICAgICAgICAgcmV0dXJuICJ2ZW5jcnlwdCt4NTA5K3Nhc2wiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuICJ2ZW5jcnlwdCI7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHJldHVybiAidmVuY3J5cHQiOworI2VuZGlmCisgICAgY2FzZSBWTkNfQVVUSF9TQVNMOgorICAgICAgICByZXR1cm4gInNhc2wiOworICAgIH0KKyAgICByZXR1cm4gInVua25vd24iOworfQorCitzdGF0aWMgdm9pZCBkb19pbmZvX3ZuY19jbGllbnQoTW9uaXRvciAqbW9uLCBWbmNTdGF0ZSAqY2xpZW50KQoreworICAgIGNoYXIgKmNsaWVudEFkZHIgPQorICAgICAgICB2bmNfc29ja2V0X3JlbW90ZV9hZGRyKCIgICAgIGFkZHJlc3M6ICVzOiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+Y3NvY2spOworICAgIGlmICghY2xpZW50QWRkcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiQ2xpZW50OlxuIik7CisgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJXMiLCBjbGllbnRBZGRyKTsKKyAgICBmcmVlKGNsaWVudEFkZHIpOworCisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICBpZiAoY2xpZW50LT50bHMuc2Vzc2lvbiAmJgorICAgICAgICBjbGllbnQtPnRscy5kbmFtZSkKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICB4NTA5IGRuYW1lOiAlc1xuIiwgY2xpZW50LT50bHMuZG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICB4NTA5IGRuYW1lOiBub25lXG4iKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WTkNfU0FTTAorICAgIGlmIChjbGllbnQtPnNhc2wuY29ubiAmJgorICAgICAgICBjbGllbnQtPnNhc2wudXNlcm5hbWUpCisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgICB1c2VybmFtZTogJXNcbiIsIGNsaWVudC0+c2FzbC51c2VybmFtZSk7CisgICAgZWxzZQorICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICAgdXNlcm5hbWU6IG5vbmVcbiIpOworI2VuZGlmCit9CisKK3ZvaWQgZG9faW5mb192bmMoTW9uaXRvciAqbW9uKQoreworICAgIGlmICh2bmNfZGlzcGxheSA9PSBOVUxMIHx8IHZuY19kaXNwbGF5LT5kaXNwbGF5ID09IE5VTEwpIHsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiU2VydmVyOiBkaXNhYmxlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciAqc2VydmVyQWRkciA9IHZuY19zb2NrZXRfbG9jYWxfYWRkcigiICAgICBhZGRyZXNzOiAlczolc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmNfZGlzcGxheS0+bHNvY2spOworCisgICAgICAgIGlmICghc2VydmVyQWRkcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJTZXJ2ZXI6XG4iKTsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiJXMiLCBzZXJ2ZXJBZGRyKTsKKyAgICAgICAgZnJlZShzZXJ2ZXJBZGRyKTsKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICAgICAgICBhdXRoOiAlc1xuIiwgdm5jX2F1dGhfbmFtZSh2bmNfZGlzcGxheSkpOworCisgICAgICAgIGlmICh2bmNfZGlzcGxheS0+Y2xpZW50cykgeworICAgICAgICAgICAgVm5jU3RhdGUgKmNsaWVudCA9IHZuY19kaXNwbGF5LT5jbGllbnRzOworICAgICAgICAgICAgd2hpbGUgKGNsaWVudCkgeworICAgICAgICAgICAgICAgIGRvX2luZm9fdm5jX2NsaWVudChtb24sIGNsaWVudCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gY2xpZW50LT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiQ2xpZW50OiBub25lXG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCB2bmNfaGFzX2ZlYXR1cmUoVm5jU3RhdGUgKnZzLCBpbnQgZmVhdHVyZSkgeworICAgIHJldHVybiAodnMtPmZlYXR1cmVzICYgKDEgPDwgZmVhdHVyZSkpOworfQorCisvKiBUT0RPCisgICAxKSBHZXQgdGhlIHF1ZXVlIHdvcmtpbmcgZm9yIElPLgorICAgMikgdGhlcmUgaXMgc29tZSB3ZWlyZG5lc3Mgd2hlbiB1c2luZyB0aGUgLVMgb3B0aW9uICh0aGUgc2NyZWVuIGlzIGdyZXkKKyAgICAgIGFuZCBub3QgdG90YWxseSBpbnZhbGlkYXRlZAorICAgMykgcmVzb2x1dGlvbnMgPiAxMDI0CisqLworCitzdGF0aWMgdm9pZCB2bmNfdXBkYXRlX2NsaWVudCh2b2lkICpvcGFxdWUpOworc3RhdGljIHZvaWQgdm5jX2Rpc2Nvbm5lY3Rfc3RhcnQoVm5jU3RhdGUgKnZzKTsKK3N0YXRpYyB2b2lkIHZuY19kaXNjb25uZWN0X2ZpbmlzaChWbmNTdGF0ZSAqdnMpOworCitzdGF0aWMgdm9pZCB2bmNfY29sb3JkZXB0aChWbmNTdGF0ZSAqdnMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdm5jX3NldF9iaXQodWludDMyX3QgKmQsIGludCBrKQoreworICAgIGRbayA+PiA1XSB8PSAxIDw8IChrICYgMHgxZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bmNfY2xlYXJfYml0KHVpbnQzMl90ICpkLCBpbnQgaykKK3sKKyAgICBkW2sgPj4gNV0gJj0gfigxIDw8IChrICYgMHgxZikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5jX3NldF9iaXRzKHVpbnQzMl90ICpkLCBpbnQgbiwgaW50IG5iX3dvcmRzKQoreworICAgIGludCBqOworCisgICAgaiA9IDA7CisgICAgd2hpbGUgKG4gPj0gMzIpIHsKKyAgICAgICAgZFtqKytdID0gLTE7CisgICAgICAgIG4gLT0gMzI7CisgICAgfQorICAgIGlmIChuID4gMCkKKyAgICAgICAgZFtqKytdID0gKDEgPDwgbikgLSAxOworICAgIHdoaWxlIChqIDwgbmJfd29yZHMpCisgICAgICAgIGRbaisrXSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZuY19nZXRfYml0KGNvbnN0IHVpbnQzMl90ICpkLCBpbnQgaykKK3sKKyAgICByZXR1cm4gKGRbayA+PiA1XSA+PiAoayAmIDB4MWYpKSAmIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZuY19hbmRfYml0cyhjb25zdCB1aW50MzJfdCAqZDEsIGNvbnN0IHVpbnQzMl90ICpkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfd29yZHMpCit7CisgICAgaW50IGk7CisgICAgZm9yKGkgPSAwOyBpIDwgbmJfd29yZHM7IGkrKykgeworICAgICAgICBpZiAoKGQxW2ldICYgZDJbaV0pICE9IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZuY191cGRhdGUoVm5jU3RhdGUgKnZzLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBzdHJ1Y3QgVm5jU3VyZmFjZSAqcyA9ICZ2cy0+Z3Vlc3Q7CisgICAgaW50IGk7CisKKyAgICBoICs9IHk7CisKKyAgICAvKiByb3VuZCB4IGRvd24gdG8gZW5zdXJlIHRoZSBsb29wIG9ubHkgc3BhbnMgb25lIDE2LXBpeGVsIGJsb2NrIHBlciwKKyAgICAgICBpdGVyYXRpb24uICBvdGhlcndpc2UsIGlmICh4ICUgMTYpICE9IDAsIHRoZSBsYXN0IGl0ZXJhdGlvbiBtYXkgc3BhbgorICAgICAgIHR3byAxNi1waXhlbCBibG9ja3MgYnV0IHdlIG9ubHkgbWFyayB0aGUgZmlyc3QgYXMgZGlydHkKKyAgICAqLworICAgIHcgKz0gKHggJSAxNik7CisgICAgeCAtPSAoeCAlIDE2KTsKKworICAgIHggPSBNSU4oeCwgcy0+ZHMtPndpZHRoKTsKKyAgICB5ID0gTUlOKHksIHMtPmRzLT5oZWlnaHQpOworICAgIHcgPSBNSU4oeCArIHcsIHMtPmRzLT53aWR0aCkgLSB4OworICAgIGggPSBNSU4oaCwgcy0+ZHMtPmhlaWdodCk7CisKKyAgICBmb3IgKDsgeSA8IGg7IHkrKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkgKz0gMTYpCisgICAgICAgICAgICB2bmNfc2V0X2JpdChzLT5kaXJ0eVt5XSwgKHggKyBpKSAvIDE2KTsKK30KKworc3RhdGljIHZvaWQgdm5jX2RweV91cGRhdGUoRGlzcGxheVN0YXRlICpkcywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgVm5jRGlzcGxheSAqdmQgPSBkcy0+b3BhcXVlOworICAgIFZuY1N0YXRlICp2cyA9IHZkLT5jbGllbnRzOworICAgIHdoaWxlICh2cyAhPSBOVUxMKSB7CisgICAgICAgIHZuY191cGRhdGUodnMsIHgsIHksIHcsIGgpOworICAgICAgICB2cyA9IHZzLT5uZXh0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZShWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuY29kaW5nKQoreworICAgIHZuY193cml0ZV91MTYodnMsIHgpOworICAgIHZuY193cml0ZV91MTYodnMsIHkpOworICAgIHZuY193cml0ZV91MTYodnMsIHcpOworICAgIHZuY193cml0ZV91MTYodnMsIGgpOworCisgICAgdm5jX3dyaXRlX3MzMih2cywgZW5jb2RpbmcpOworfQorCit2b2lkIGJ1ZmZlcl9yZXNlcnZlKEJ1ZmZlciAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworICAgIGlmICgoYnVmZmVyLT5jYXBhY2l0eSAtIGJ1ZmZlci0+b2Zmc2V0KSA8IGxlbikgeworICAgICAgICBidWZmZXItPmNhcGFjaXR5ICs9IChsZW4gKyAxMDI0KTsKKyAgICAgICAgYnVmZmVyLT5idWZmZXIgPSBnX3JlYWxsb2MoYnVmZmVyLT5idWZmZXIsIGJ1ZmZlci0+Y2FwYWNpdHkpOworICAgICAgICBpZiAoYnVmZmVyLT5idWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ2bmM6IG91dCBvZiBtZW1vcnlcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGJ1ZmZlcl9lbXB0eShCdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICByZXR1cm4gYnVmZmVyLT5vZmZzZXQgPT0gMDsKK30KKwordWludDhfdCAqYnVmZmVyX2VuZChCdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICByZXR1cm4gYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPm9mZnNldDsKK30KKwordm9pZCBidWZmZXJfcmVzZXQoQnVmZmVyICpidWZmZXIpCit7CisgICAgICAgIGJ1ZmZlci0+b2Zmc2V0ID0gMDsKK30KKwordm9pZCBidWZmZXJfYXBwZW5kKEJ1ZmZlciAqYnVmZmVyLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIG1lbWNweShidWZmZXItPmJ1ZmZlciArIGJ1ZmZlci0+b2Zmc2V0LCBkYXRhLCBsZW4pOworICAgIGJ1ZmZlci0+b2Zmc2V0ICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgdm5jX3Jlc2l6ZShWbmNTdGF0ZSAqdnMpCit7CisgICAgRGlzcGxheVN0YXRlICpkcyA9IHZzLT5kczsKKyAgICBpbnQgc2l6ZV9jaGFuZ2VkOworCisgICAgLyogZ3Vlc3Qgc3VyZmFjZSAqLworICAgIGlmICghdnMtPmd1ZXN0LmRzKQorICAgICAgICB2cy0+Z3Vlc3QuZHMgPSBnX21hbGxvYzAoc2l6ZW9mKCp2cy0+Z3Vlc3QuZHMpKTsKKyAgICBpZiAoZHNfZ2V0X2J5dGVzX3Blcl9waXhlbChkcykgIT0gdnMtPmd1ZXN0LmRzLT5wZi5ieXRlc19wZXJfcGl4ZWwpCisgICAgICAgIGNvbnNvbGVfY29sb3JfaW5pdChkcyk7CisgICAgdm5jX2NvbG9yZGVwdGgodnMpOworICAgIHNpemVfY2hhbmdlZCA9IGRzX2dldF93aWR0aChkcykgIT0gdnMtPmd1ZXN0LmRzLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgIGRzX2dldF9oZWlnaHQoZHMpICE9IHZzLT5ndWVzdC5kcy0+aGVpZ2h0OworICAgICoodnMtPmd1ZXN0LmRzKSA9ICooZHMtPnN1cmZhY2UpOworICAgIGlmIChzaXplX2NoYW5nZWQpIHsKKyAgICAgICAgaWYgKHZzLT5jc29jayAhPSAtMSAmJiB2bmNfaGFzX2ZlYXR1cmUodnMsIFZOQ19GRUFUVVJFX1JFU0laRSkpIHsKKyAgICAgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7ICAvKiBtc2cgaWQgKi8KKyAgICAgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7CisgICAgICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsgLyogbnVtYmVyIG9mIHJlY3RzICovCisgICAgICAgICAgICB2bmNfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCAwLCAwLCBkc19nZXRfd2lkdGgoZHMpLCBkc19nZXRfaGVpZ2h0KGRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5DX0VOQ09ESU5HX0RFU0tUT1BSRVNJWkUpOworICAgICAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZW1zZXQodnMtPmd1ZXN0LmRpcnR5LCAweEZGLCBzaXplb2YodnMtPmd1ZXN0LmRpcnR5KSk7CisKKyAgICAvKiBzZXJ2ZXIgc3VyZmFjZSAqLworICAgIGlmICghdnMtPnNlcnZlci5kcykKKyAgICAgICAgdnMtPnNlcnZlci5kcyA9IGdfbWFsbG9jMChzaXplb2YoKnZzLT5zZXJ2ZXIuZHMpKTsKKyAgICBpZiAodnMtPnNlcnZlci5kcy0+ZGF0YSkKKyAgICAgICAgZ19mcmVlKHZzLT5zZXJ2ZXIuZHMtPmRhdGEpOworICAgICoodnMtPnNlcnZlci5kcykgPSAqKGRzLT5zdXJmYWNlKTsKKyAgICB2cy0+c2VydmVyLmRzLT5kYXRhID0gZ19tYWxsb2MwKHZzLT5zZXJ2ZXIuZHMtPmxpbmVzaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzLT5zZXJ2ZXIuZHMtPmhlaWdodCk7CisgICAgbWVtc2V0KHZzLT5zZXJ2ZXIuZGlydHksIDB4RkYsIHNpemVvZih2cy0+Z3Vlc3QuZGlydHkpKTsKK30KKworc3RhdGljIHZvaWQgdm5jX2RweV9yZXNpemUoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICBWbmNEaXNwbGF5ICp2ZCA9IGRzLT5vcGFxdWU7CisgICAgVm5jU3RhdGUgKnZzID0gdmQtPmNsaWVudHM7CisgICAgd2hpbGUgKHZzICE9IE5VTEwpIHsKKyAgICAgICAgdm5jX3Jlc2l6ZSh2cyk7CisgICAgICAgIHZzID0gdnMtPm5leHQ7CisgICAgfQorfQorCisvKiBmYXN0ZXN0IGNvZGUgKi8KK3N0YXRpYyB2b2lkIHZuY193cml0ZV9waXhlbHNfY29weShWbmNTdGF0ZSAqdnMsIHZvaWQgKnBpeGVscywgaW50IHNpemUpCit7CisgICAgdm5jX3dyaXRlKHZzLCBwaXhlbHMsIHNpemUpOworfQorCisvKiBzbG93ZXN0IGJ1dCBnZW5lcmljIGNvZGUuICovCitzdGF0aWMgdm9pZCB2bmNfY29udmVydF9waXhlbChWbmNTdGF0ZSAqdnMsIHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgdikKK3sKKyAgICB1aW50OF90IHIsIGcsIGI7CisKKyAgICByID0gKCgoKHYgJiB2cy0+c2VydmVyLmRzLT5wZi5ybWFzaykgPj4gdnMtPnNlcnZlci5kcy0+cGYucnNoaWZ0KSA8PCB2cy0+Y2xpZW50ZHMucGYucmJpdHMpID4+CisgICAgICAgIHZzLT5zZXJ2ZXIuZHMtPnBmLnJiaXRzKTsKKyAgICBnID0gKCgoKHYgJiB2cy0+c2VydmVyLmRzLT5wZi5nbWFzaykgPj4gdnMtPnNlcnZlci5kcy0+cGYuZ3NoaWZ0KSA8PCB2cy0+Y2xpZW50ZHMucGYuZ2JpdHMpID4+CisgICAgICAgIHZzLT5zZXJ2ZXIuZHMtPnBmLmdiaXRzKTsKKyAgICBiID0gKCgoKHYgJiB2cy0+c2VydmVyLmRzLT5wZi5ibWFzaykgPj4gdnMtPnNlcnZlci5kcy0+cGYuYnNoaWZ0KSA8PCB2cy0+Y2xpZW50ZHMucGYuYmJpdHMpID4+CisgICAgICAgIHZzLT5zZXJ2ZXIuZHMtPnBmLmJiaXRzKTsKKyAgICB2ID0gKHIgPDwgdnMtPmNsaWVudGRzLnBmLnJzaGlmdCkgfAorICAgICAgICAoZyA8PCB2cy0+Y2xpZW50ZHMucGYuZ3NoaWZ0KSB8CisgICAgICAgIChiIDw8IHZzLT5jbGllbnRkcy5wZi5ic2hpZnQpOworICAgIHN3aXRjaCh2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsKSB7CisgICAgY2FzZSAxOgorICAgICAgICBidWZbMF0gPSB2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICh2cy0+Y2xpZW50ZHMuZmxhZ3MgJiBRRU1VX0JJR19FTkRJQU5fRkxBRykgeworICAgICAgICAgICAgYnVmWzBdID0gdiA+PiA4OworICAgICAgICAgICAgYnVmWzFdID0gdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IHYgPj4gODsKKyAgICAgICAgICAgIGJ1ZlswXSA9IHY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICBjYXNlIDQ6CisgICAgICAgIGlmICh2cy0+Y2xpZW50ZHMuZmxhZ3MgJiBRRU1VX0JJR19FTkRJQU5fRkxBRykgeworICAgICAgICAgICAgYnVmWzBdID0gdiA+PiAyNDsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IHYgPj4gMTY7CisgICAgICAgICAgICBidWZbMl0gPSB2ID4+IDg7CisgICAgICAgICAgICBidWZbM10gPSB2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmWzNdID0gdiA+PiAyNDsKKyAgICAgICAgICAgIGJ1ZlsyXSA9IHYgPj4gMTY7CisgICAgICAgICAgICBidWZbMV0gPSB2ID4+IDg7CisgICAgICAgICAgICBidWZbMF0gPSB2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdm5jX3dyaXRlX3BpeGVsc19nZW5lcmljKFZuY1N0YXRlICp2cywgdm9pZCAqcGl4ZWxzMSwgaW50IHNpemUpCit7CisgICAgdWludDhfdCBidWZbNF07CisKKyAgICBpZiAodnMtPnNlcnZlci5kcy0+cGYuYnl0ZXNfcGVyX3BpeGVsID09IDQpIHsKKyAgICAgICAgdWludDMyX3QgKnBpeGVscyA9IHBpeGVsczE7CisgICAgICAgIGludCBuLCBpOworICAgICAgICBuID0gc2l6ZSA+PiAyOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHZuY19jb252ZXJ0X3BpeGVsKHZzLCBidWYsIHBpeGVsc1tpXSk7CisgICAgICAgICAgICB2bmNfd3JpdGUodnMsIGJ1ZiwgdnMtPmNsaWVudGRzLnBmLmJ5dGVzX3Blcl9waXhlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHZzLT5zZXJ2ZXIuZHMtPnBmLmJ5dGVzX3Blcl9waXhlbCA9PSAyKSB7CisgICAgICAgIHVpbnQxNl90ICpwaXhlbHMgPSBwaXhlbHMxOworICAgICAgICBpbnQgbiwgaTsKKyAgICAgICAgbiA9IHNpemUgPj4gMTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2bmNfY29udmVydF9waXhlbCh2cywgYnVmLCBwaXhlbHNbaV0pOworICAgICAgICAgICAgdm5jX3dyaXRlKHZzLCBidWYsIHZzLT5jbGllbnRkcy5wZi5ieXRlc19wZXJfcGl4ZWwpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh2cy0+c2VydmVyLmRzLT5wZi5ieXRlc19wZXJfcGl4ZWwgPT0gMSkgeworICAgICAgICB1aW50OF90ICpwaXhlbHMgPSBwaXhlbHMxOworICAgICAgICBpbnQgbiwgaTsKKyAgICAgICAgbiA9IHNpemU7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdm5jX2NvbnZlcnRfcGl4ZWwodnMsIGJ1ZiwgcGl4ZWxzW2ldKTsKKyAgICAgICAgICAgIHZuY193cml0ZSh2cywgYnVmLCB2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAidm5jX3dyaXRlX3BpeGVsc19nZW5lcmljOiBWbmNTdGF0ZSBjb2xvciBkZXB0aCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJhbWVidWZmZXJfdXBkYXRlX3JhdyhWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnJvdzsKKworICAgIHJvdyA9IHZzLT5zZXJ2ZXIuZHMtPmRhdGEgKyB5ICogZHNfZ2V0X2xpbmVzaXplKHZzLT5kcykgKyB4ICogZHNfZ2V0X2J5dGVzX3Blcl9waXhlbCh2cy0+ZHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgdnMtPndyaXRlX3BpeGVscyh2cywgcm93LCB3ICogZHNfZ2V0X2J5dGVzX3Blcl9waXhlbCh2cy0+ZHMpKTsKKyAgICAgICAgcm93ICs9IGRzX2dldF9saW5lc2l6ZSh2cy0+ZHMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGV4dGlsZV9lbmNfY29yZCh1aW50OF90ICpwdHIsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIHB0clswXSA9ICgoeCAmIDB4MEYpIDw8IDQpIHwgKHkgJiAweDBGKTsKKyAgICBwdHJbMV0gPSAoKCh3IC0gMSkgJiAweDBGKSA8PCA0KSB8ICgoaCAtIDEpICYgMHgwRik7Cit9CisKKyNkZWZpbmUgQlBQIDgKKyNpbmNsdWRlICJ2bmNoZXh0aWxlLmgiCisjdW5kZWYgQlBQCisKKyNkZWZpbmUgQlBQIDE2CisjaW5jbHVkZSAidm5jaGV4dGlsZS5oIgorI3VuZGVmIEJQUAorCisjZGVmaW5lIEJQUCAzMgorI2luY2x1ZGUgInZuY2hleHRpbGUuaCIKKyN1bmRlZiBCUFAKKworI2RlZmluZSBHRU5FUklDCisjZGVmaW5lIEJQUCA4CisjaW5jbHVkZSAidm5jaGV4dGlsZS5oIgorI3VuZGVmIEJQUAorI3VuZGVmIEdFTkVSSUMKKworI2RlZmluZSBHRU5FUklDCisjZGVmaW5lIEJQUCAxNgorI2luY2x1ZGUgInZuY2hleHRpbGUuaCIKKyN1bmRlZiBCUFAKKyN1bmRlZiBHRU5FUklDCisKKyNkZWZpbmUgR0VORVJJQworI2RlZmluZSBCUFAgMzIKKyNpbmNsdWRlICJ2bmNoZXh0aWxlLmgiCisjdW5kZWYgQlBQCisjdW5kZWYgR0VORVJJQworCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZV9oZXh0aWxlKFZuY1N0YXRlICp2cywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGhhc19mZywgaGFzX2JnOworICAgIHVpbnQ4X3QgKmxhc3RfZmcsICpsYXN0X2JnOworCisgICAgbGFzdF9mZyA9ICh1aW50OF90ICopIGdfbWFsbG9jKHZzLT5zZXJ2ZXIuZHMtPnBmLmJ5dGVzX3Blcl9waXhlbCk7CisgICAgbGFzdF9iZyA9ICh1aW50OF90ICopIGdfbWFsbG9jKHZzLT5zZXJ2ZXIuZHMtPnBmLmJ5dGVzX3Blcl9waXhlbCk7CisgICAgaGFzX2ZnID0gaGFzX2JnID0gMDsKKyAgICBmb3IgKGogPSB5OyBqIDwgKHkgKyBoKTsgaiArPSAxNikgeworICAgICAgICBmb3IgKGkgPSB4OyBpIDwgKHggKyB3KTsgaSArPSAxNikgeworICAgICAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlKHZzLCBpLCBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTigxNiwgeCArIHcgLSBpKSwgTUlOKDE2LCB5ICsgaCAtIGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYmcsIGxhc3RfZmcsICZoYXNfYmcsICZoYXNfZmcpOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUobGFzdF9mZyk7CisgICAgZnJlZShsYXN0X2JnKTsKKworfQorCitzdGF0aWMgdm9pZCB2bmNfemxpYl9pbml0KFZuY1N0YXRlICp2cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGk9MDsgaSA8IChpbnQpKHNpemVvZih2cy0+emxpYl9zdHJlYW0pIC8gc2l6ZW9mKHpfc3RyZWFtKSk7IGkrKykKKyAgICAgICAgdnMtPnpsaWJfc3RyZWFtW2ldLm9wYXF1ZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZuY196bGliX3N0YXJ0KFZuY1N0YXRlICp2cykKK3sKKyAgICBidWZmZXJfcmVzZXQoJnZzLT56bGliKTsKKworICAgIC8vIG1ha2UgdGhlIG91dHB1dCBidWZmZXIgYmUgdGhlIHpsaWIgYnVmZmVyLCBzbyB3ZSBjYW4gY29tcHJlc3MgaXQgbGF0ZXIKKyAgICB2cy0+emxpYl90bXAgPSB2cy0+b3V0cHV0OworICAgIHZzLT5vdXRwdXQgPSB2cy0+emxpYjsKK30KKworc3RhdGljIGludCB2bmNfemxpYl9zdG9wKFZuY1N0YXRlICp2cywgaW50IHN0cmVhbV9pZCkKK3sKKyAgICB6X3N0cmVhbXAgenN0cmVhbSA9ICZ2cy0+emxpYl9zdHJlYW1bc3RyZWFtX2lkXTsKKyAgICBpbnQgcHJldmlvdXNfb3V0OworCisgICAgLy8gc3dpdGNoIGJhY2sgdG8gbm9ybWFsIG91dHB1dC96bGliIGJ1ZmZlcnMKKyAgICB2cy0+emxpYiA9IHZzLT5vdXRwdXQ7CisgICAgdnMtPm91dHB1dCA9IHZzLT56bGliX3RtcDsKKworICAgIC8vIGNvbXByZXNzIHRoZSB6bGliIGJ1ZmZlcgorCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RyZWFtCisgICAgLy8gWFhYIG5lZWQgb25lIHN0cmVhbSBwZXIgc2Vzc2lvbgorICAgIGlmICh6c3RyZWFtLT5vcGFxdWUgIT0gdnMpIHsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBWTkNfREVCVUcoIlZOQzogaW5pdGlhbGl6aW5nIHpsaWIgc3RyZWFtICVkXG4iLCBzdHJlYW1faWQpOworICAgICAgICBWTkNfREVCVUcoIlZOQzogb3BhcXVlID0gJXAgfCB2cyA9ICVwXG4iLCB6c3RyZWFtLT5vcGFxdWUsIHZzKTsKKyAgICAgICAgenN0cmVhbS0+emFsbG9jID0gWl9OVUxMOworICAgICAgICB6c3RyZWFtLT56ZnJlZSA9IFpfTlVMTDsKKworICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoenN0cmVhbSwgdnMtPnRpZ2h0X2NvbXByZXNzaW9uLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpOworCisgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJWTkM6IGVycm9yIGluaXRpYWxpemluZyB6bGliXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHpzdHJlYW0tPm9wYXF1ZSA9IHZzOworICAgIH0KKworICAgIC8vIFhYWCB3aGF0IHRvIGRvIGlmIHRpZ2h0X2NvbXByZXNzaW9uIGNoYW5nZWQgaW4gYmV0d2Vlbj8KKworICAgIC8vIHJlc2VydmUgbWVtb3J5IGluIG91dHB1dCBidWZmZXIKKyAgICBidWZmZXJfcmVzZXJ2ZSgmdnMtPm91dHB1dCwgdnMtPnpsaWIub2Zmc2V0ICsgNjQpOworCisgICAgLy8gc2V0IHBvaW50ZXJzCisgICAgenN0cmVhbS0+bmV4dF9pbiA9IHZzLT56bGliLmJ1ZmZlcjsKKyAgICB6c3RyZWFtLT5hdmFpbF9pbiA9IHZzLT56bGliLm9mZnNldDsKKyAgICB6c3RyZWFtLT5uZXh0X291dCA9IHZzLT5vdXRwdXQuYnVmZmVyICsgdnMtPm91dHB1dC5vZmZzZXQ7CisgICAgenN0cmVhbS0+YXZhaWxfb3V0ID0gdnMtPm91dHB1dC5jYXBhY2l0eSAtIHZzLT5vdXRwdXQub2Zmc2V0OworICAgIHpzdHJlYW0tPmRhdGFfdHlwZSA9IFpfQklOQVJZOworICAgIHByZXZpb3VzX291dCA9IHpzdHJlYW0tPnRvdGFsX291dDsKKworICAgIC8vIHN0YXJ0IGVuY29kaW5nCisgICAgaWYgKGRlZmxhdGUoenN0cmVhbSwgWl9TWU5DX0ZMVVNIKSAhPSBaX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVk5DOiBlcnJvciBkdXJpbmcgemxpYiBjb21wcmVzc2lvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2cy0+b3V0cHV0Lm9mZnNldCA9IHZzLT5vdXRwdXQuY2FwYWNpdHkgLSB6c3RyZWFtLT5hdmFpbF9vdXQ7CisgICAgcmV0dXJuIHpzdHJlYW0tPnRvdGFsX291dCAtIHByZXZpb3VzX291dDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfemxpYihWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGludCBvbGRfb2Zmc2V0LCBuZXdfb2Zmc2V0LCBieXRlc193cml0dGVuOworCisgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgeCwgeSwgdywgaCwgVk5DX0VOQ09ESU5HX1pMSUIpOworCisgICAgLy8gcmVtZW1iZXIgd2hlcmUgd2UgcHV0IGluIHRoZSBmb2xsb3ctdXAgc2l6ZQorICAgIG9sZF9vZmZzZXQgPSB2cy0+b3V0cHV0Lm9mZnNldDsKKyAgICB2bmNfd3JpdGVfczMyKHZzLCAwKTsKKworICAgIC8vIGNvbXByZXNzIHRoZSBzdHJlYW0KKyAgICB2bmNfemxpYl9zdGFydCh2cyk7CisgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfcmF3KHZzLCB4LCB5LCB3LCBoKTsKKyAgICBieXRlc193cml0dGVuID0gdm5jX3psaWJfc3RvcCh2cywgMCk7CisKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gaGFjayBpbiB0aGUgc2l6ZQorICAgIG5ld19vZmZzZXQgPSB2cy0+b3V0cHV0Lm9mZnNldDsKKyAgICB2cy0+b3V0cHV0Lm9mZnNldCA9IG9sZF9vZmZzZXQ7CisgICAgdm5jX3dyaXRlX3UzMih2cywgYnl0ZXNfd3JpdHRlbik7CisgICAgdnMtPm91dHB1dC5vZmZzZXQgPSBuZXdfb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZShWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIHN3aXRjaCh2cy0+dm5jX2VuY29kaW5nKSB7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1pMSUI6CisgICAgICAgICAgICBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZV96bGliKHZzLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19IRVhUSUxFOgorICAgICAgICAgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgeCwgeSwgdywgaCwgVk5DX0VOQ09ESU5HX0hFWFRJTEUpOworICAgICAgICAgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfaGV4dGlsZSh2cywgeCwgeSwgdywgaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIHgsIHksIHcsIGgsIFZOQ19FTkNPRElOR19SQVcpOworICAgICAgICAgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfcmF3KHZzLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdm5jX2NvcHkoVm5jU3RhdGUgKnZzLCBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCB3LCBpbnQgaCkKK3sKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOyAgLyogbXNnIGlkICovCisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsgLyogbnVtYmVyIG9mIHJlY3RzICovCisgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgZHN0X3gsIGRzdF95LCB3LCBoLCBWTkNfRU5DT0RJTkdfQ09QWVJFQ1QpOworICAgIHZuY193cml0ZV91MTYodnMsIHNyY194KTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCBzcmNfeSk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgdm5jX2RweV9jb3B5KERpc3BsYXlTdGF0ZSAqZHMsIGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgZHN0X3gsIGludCBkc3RfeSwgaW50IHcsIGludCBoKQoreworICAgIFZuY0Rpc3BsYXkgKnZkID0gZHMtPm9wYXF1ZTsKKyAgICBWbmNTdGF0ZSAqdnMsICp2bjsKKworICAgIGZvciAodnMgPSB2ZC0+Y2xpZW50czsgdnMgIT0gTlVMTDsgdnMgPSB2bikgeworICAgICAgICB2biA9IHZzLT5uZXh0OworICAgICAgICBpZiAodm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9DT1BZUkVDVCkpIHsKKyAgICAgICAgICAgIHZzLT5mb3JjZV91cGRhdGUgPSAxOworICAgICAgICAgICAgdm5jX3VwZGF0ZV9jbGllbnQodnMpOworICAgICAgICAgICAgLyogdnMgbWlnaHQgYmUgZnJlZSgpZWQgaGVyZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh2cyA9IHZkLT5jbGllbnRzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KSB7CisgICAgICAgIGlmICh2bmNfaGFzX2ZlYXR1cmUodnMsIFZOQ19GRUFUVVJFX0NPUFlSRUNUKSkKKyAgICAgICAgICAgIHZuY19jb3B5KHZzLCBzcmNfeCwgc3JjX3ksIGRzdF94LCBkc3RfeSwgdywgaCk7CisgICAgICAgIGVsc2UgLyogVE9ETyAqLworICAgICAgICAgICAgdm5jX3VwZGF0ZSh2cywgZHN0X3gsIGRzdF95LCB3LCBoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmluZF9hbmRfY2xlYXJfZGlydHlfaGVpZ2h0KHN0cnVjdCBWbmNTdXJmYWNlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIGludCBsYXN0X3gsIGludCB4KQoreworICAgIGludCBoOworCisgICAgZm9yIChoID0gMTsgaCA8IChzLT5kcy0+aGVpZ2h0IC0geSk7IGgrKykgeworICAgICAgICBpbnQgdG1wX3g7CisgICAgICAgIGlmICghdm5jX2dldF9iaXQocy0+ZGlydHlbeSArIGhdLCBsYXN0X3gpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAodG1wX3ggPSBsYXN0X3g7IHRtcF94IDwgeDsgdG1wX3grKykKKyAgICAgICAgICAgIHZuY19jbGVhcl9iaXQocy0+ZGlydHlbeSArIGhdLCB0bXBfeCk7CisgICAgfQorCisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB2b2lkIHZuY191cGRhdGVfY2xpZW50KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisgICAgaWYgKHZzLT5uZWVkX3VwZGF0ZSAmJiB2cy0+Y3NvY2sgIT0gLTEpIHsKKyAgICAgICAgaW50IHk7CisgICAgICAgIHVpbnQ4X3QgKmd1ZXN0X3JvdzsKKyAgICAgICAgdWludDhfdCAqc2VydmVyX3JvdzsKKyAgICAgICAgaW50IGNtcF9ieXRlczsKKyAgICAgICAgdWludDMyX3Qgd2lkdGhfbWFza1tWTkNfRElSVFlfV09SRFNdOworICAgICAgICBpbnQgbl9yZWN0YW5nbGVzOworICAgICAgICBpbnQgc2F2ZWRfb2Zmc2V0OworICAgICAgICBpbnQgaGFzX2RpcnR5ID0gMDsKKworICAgICAgICBpZiAodnMtPm91dHB1dC5vZmZzZXQgJiYgIXZzLT5hdWRpb19jYXAgJiYgIXZzLT5mb3JjZV91cGRhdGUpIHsKKyAgICAgICAgICAgIC8qIGtlcm5lbCBzZW5kIGJ1ZmZlcnMgYXJlIGZ1bGwgLT4gZHJvcCBmcmFtZXMgdG8gdGhyb3R0bGUgKi8KKyAgICAgICAgICAgIHRpbWVyX21vZCh2cy0+dGltZXIsIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsgVk5DX1JFRlJFU0hfSU5URVJWQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmdhX2h3X3VwZGF0ZSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdhbGsgdGhyb3VnaCB0aGUgZ3Vlc3QgZGlydHkgbWFwLgorICAgICAgICAgKiBDaGVjayBhbmQgY29weSBtb2RpZmllZCBiaXRzIGZyb20gZ3Vlc3QgdG8gc2VydmVyIHN1cmZhY2UuCisgICAgICAgICAqIFVwZGF0ZSBzZXJ2ZXIgZGlydHkgbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgdm5jX3NldF9iaXRzKHdpZHRoX21hc2ssIChkc19nZXRfd2lkdGgodnMtPmRzKSAvIDE2KSwgVk5DX0RJUlRZX1dPUkRTKTsKKyAgICAgICAgY21wX2J5dGVzID0gMTYgKiBkc19nZXRfYnl0ZXNfcGVyX3BpeGVsKHZzLT5kcyk7CisgICAgICAgIGd1ZXN0X3JvdyAgPSB2cy0+Z3Vlc3QuZHMtPmRhdGE7CisgICAgICAgIHNlcnZlcl9yb3cgPSB2cy0+c2VydmVyLmRzLT5kYXRhOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgdnMtPmd1ZXN0LmRzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaWYgKHZuY19hbmRfYml0cyh2cy0+Z3Vlc3QuZGlydHlbeV0sIHdpZHRoX21hc2ssIFZOQ19ESVJUWV9XT1JEUykpIHsKKyAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpndWVzdF9wdHI7CisgICAgICAgICAgICAgICAgdWludDhfdCAqc2VydmVyX3B0cjsKKworICAgICAgICAgICAgICAgIGd1ZXN0X3B0ciAgPSBndWVzdF9yb3c7CisgICAgICAgICAgICAgICAgc2VydmVyX3B0ciA9IHNlcnZlcl9yb3c7CisKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdnMtPmd1ZXN0LmRzLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgIHggKz0gMTYsIGd1ZXN0X3B0ciArPSBjbXBfYnl0ZXMsIHNlcnZlcl9wdHIgKz0gY21wX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdm5jX2dldF9iaXQodnMtPmd1ZXN0LmRpcnR5W3ldLCAoeCAvIDE2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsZWFyX2JpdCh2cy0+Z3Vlc3QuZGlydHlbeV0sICh4IC8gMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChzZXJ2ZXJfcHRyLCBndWVzdF9wdHIsIGNtcF9ieXRlcykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2VydmVyX3B0ciwgZ3Vlc3RfcHRyLCBjbXBfYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICB2bmNfc2V0X2JpdCh2cy0+c2VydmVyLmRpcnR5W3ldLCAoeCAvIDE2KSk7CisgICAgICAgICAgICAgICAgICAgIGhhc19kaXJ0eSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGd1ZXN0X3JvdyAgKz0gZHNfZ2V0X2xpbmVzaXplKHZzLT5kcyk7CisgICAgICAgICAgICBzZXJ2ZXJfcm93ICs9IGRzX2dldF9saW5lc2l6ZSh2cy0+ZHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoYXNfZGlydHkgJiYgIXZzLT5hdWRpb19jYXAgJiYgIXZzLT5mb3JjZV91cGRhdGUpIHsKKyAgICAgICAgICAgIHRpbWVyX21vZCh2cy0+dGltZXIsIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsgVk5DX1JFRlJFU0hfSU5URVJWQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgdm5jIGNsaWVudCB1c2luZyB0aGUgc2VydmVyCisgICAgICAgICAqIHN1cmZhY2UgYW5kIHNlcnZlciBkaXJ0eSBtYXAuICBndWVzdCBzdXJmYWNlIHVwZGF0ZXMKKyAgICAgICAgICogaGFwcGVuaW5nIGluIHBhcmFsbGVsIGRvbid0IGRpc3R1cmIgdXMsIHRoZSBuZXh0IHBhc3Mgd2lsbAorICAgICAgICAgKiBzZW5kIHRoZW0gdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICovCisgICAgICAgIG5fcmVjdGFuZ2xlcyA9IDA7CisgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7ICAvKiBtc2cgaWQgKi8KKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICAgICAgc2F2ZWRfb2Zmc2V0ID0gdnMtPm91dHB1dC5vZmZzZXQ7CisgICAgICAgIHZuY193cml0ZV91MTYodnMsIDApOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCB2cy0+c2VydmVyLmRzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBpbnQgbGFzdF94ID0gLTE7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdnMtPnNlcnZlci5kcy0+d2lkdGggLyAxNjsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHZuY19nZXRfYml0KHZzLT5zZXJ2ZXIuZGlydHlbeV0sIHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfeCA9IHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsZWFyX2JpdCh2cy0+c2VydmVyLmRpcnR5W3ldLCB4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF94ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCA9IGZpbmRfYW5kX2NsZWFyX2RpcnR5X2hlaWdodCgmdnMtPnNlcnZlciwgeSwgbGFzdF94LCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCBsYXN0X3ggKiAxNiwgeSwgKHggLSBsYXN0X3gpICogMTYsIGgpOworICAgICAgICAgICAgICAgICAgICAgICAgbl9yZWN0YW5nbGVzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdF94ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3RfeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGludCBoID0gZmluZF9hbmRfY2xlYXJfZGlydHlfaGVpZ2h0KCZ2cy0+c2VydmVyLCB5LCBsYXN0X3gsIHgpOworICAgICAgICAgICAgICAgIHNlbmRfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCBsYXN0X3ggKiAxNiwgeSwgKHggLSBsYXN0X3gpICogMTYsIGgpOworICAgICAgICAgICAgICAgIG5fcmVjdGFuZ2xlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZzLT5vdXRwdXQuYnVmZmVyW3NhdmVkX29mZnNldF0gPSAobl9yZWN0YW5nbGVzID4+IDgpICYgMHhGRjsKKyAgICAgICAgdnMtPm91dHB1dC5idWZmZXJbc2F2ZWRfb2Zmc2V0ICsgMV0gPSBuX3JlY3RhbmdsZXMgJiAweEZGOworICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICB2cy0+Zm9yY2VfdXBkYXRlID0gMDsKKworICAgIH0KKworICAgIGlmICh2cy0+Y3NvY2sgIT0gLTEpIHsKKyAgICAgICAgdGltZXJfbW9kKHZzLT50aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkgKyBWTkNfUkVGUkVTSF9JTlRFUlZBTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm5jX2Rpc2Nvbm5lY3RfZmluaXNoKHZzKTsKKyAgICB9CisKK30KKworLyogYXVkaW8gKi8KK3N0YXRpYyB2b2lkIGF1ZGlvX2NhcHR1cmVfbm90aWZ5KHZvaWQgKm9wYXF1ZSwgYXVkY25vdGlmaWNhdGlvbl9lIGNtZCkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQVVEX0NOT1RJRllfRElTQUJMRToKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAyNTUpOworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDEpOworICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAwKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9DTk9USUZZX0VOQUJMRToKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAyNTUpOworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDEpOworICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhdWRpb19jYXB0dXJlX2Rlc3Ryb3kodm9pZCAqb3BhcXVlKQoreworfQorCitzdGF0aWMgdm9pZCBhdWRpb19jYXB0dXJlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisKKyAgICB2bmNfd3JpdGVfdTgodnMsIDI1NSk7CisgICAgdm5jX3dyaXRlX3U4KHZzLCAxKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCAyKTsKKyAgICB2bmNfd3JpdGVfdTMyKHZzLCBzaXplKTsKKyAgICB2bmNfd3JpdGUodnMsIGJ1Ziwgc2l6ZSk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fYWRkKFZuY1N0YXRlICp2cykKK3sKKyAgICBNb25pdG9yICptb24gPSBjdXJfbW9uOworICAgIHN0cnVjdCBhdWRpb19jYXB0dXJlX29wcyBvcHM7CisKKyAgICBpZiAodnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJhdWRpbyBhbHJlYWR5IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3BzLm5vdGlmeSA9IGF1ZGlvX2NhcHR1cmVfbm90aWZ5OworICAgIG9wcy5kZXN0cm95ID0gYXVkaW9fY2FwdHVyZV9kZXN0cm95OworICAgIG9wcy5jYXB0dXJlID0gYXVkaW9fY2FwdHVyZTsKKworICAgIHZzLT5hdWRpb19jYXAgPSBBVURfYWRkX2NhcHR1cmUoJnZzLT5hcywgJm9wcywgdnMpOworICAgIGlmICghdnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJGYWlsZWQgdG8gYWRkIGF1ZGlvIGNhcHR1cmVcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXVkaW9fZGVsKFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAodnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBBVURfZGVsX2NhcHR1cmUodnMtPmF1ZGlvX2NhcCwgdnMpOworICAgICAgICB2cy0+YXVkaW9fY2FwID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZuY19kaXNjb25uZWN0X3N0YXJ0KFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAodnMtPmNzb2NrID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmNzb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBjbG9zZXNvY2tldCh2cy0+Y3NvY2spOworICAgIHZzLT5jc29jayA9IC0xOworfQorCitzdGF0aWMgdm9pZCB2bmNfZGlzY29ubmVjdF9maW5pc2goVm5jU3RhdGUgKnZzKQoreworICAgIHRpbWVyX2RlbCh2cy0+dGltZXIpOworICAgIHRpbWVyX2ZyZWUodnMtPnRpbWVyKTsKKyAgICBpZiAodnMtPmlucHV0LmJ1ZmZlcikgZ19mcmVlKHZzLT5pbnB1dC5idWZmZXIpOworICAgIGlmICh2cy0+b3V0cHV0LmJ1ZmZlcikgZ19mcmVlKHZzLT5vdXRwdXQuYnVmZmVyKTsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIHZuY190bHNfY2xpZW50X2NsZWFudXAodnMpOworI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgdm5jX3Nhc2xfY2xpZW50X2NsZWFudXAodnMpOworI2VuZGlmIC8qIENPTkZJR19WTkNfU0FTTCAqLworICAgIGF1ZGlvX2RlbCh2cyk7CisKKyAgICBWbmNTdGF0ZSAqcCwgKnBhcmVudCA9IE5VTEw7CisgICAgZm9yIChwID0gdnMtPnZkLT5jbGllbnRzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CisgICAgICAgIGlmIChwID09IHZzKSB7CisgICAgICAgICAgICBpZiAocGFyZW50KQorICAgICAgICAgICAgICAgIHBhcmVudC0+bmV4dCA9IHAtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnMtPnZkLT5jbGllbnRzID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IHA7CisgICAgfQorICAgIGlmICghdnMtPnZkLT5jbGllbnRzKQorICAgICAgICBkY2wtPmlkbGUgPSAxOworCisgICAgZ19mcmVlKHZzLT5zZXJ2ZXIuZHMtPmRhdGEpOworICAgIGdfZnJlZSh2cy0+c2VydmVyLmRzKTsKKyAgICBnX2ZyZWUodnMtPmd1ZXN0LmRzKTsKKyAgICBnX2ZyZWUodnMpOworfQorCitpbnQgdm5jX2NsaWVudF9pb19lcnJvcihWbmNTdGF0ZSAqdnMsIGludCByZXQsIGludCBsYXN0X2Vycm5vKQoreworICAgIGlmIChyZXQgPT0gMCB8fCByZXQgPT0gLTEpIHsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgc3dpdGNoIChsYXN0X2Vycm5vKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFSU5UUjoKKyAgICAgICAgICAgICAgICBjYXNlIEVBR0FJTjoKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgICAgICBjYXNlIFdTQUVXT1VMREJMT0NLOgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVk5DX0RFQlVHKCJDbG9zaW5nIGRvd24gY2xpZW50IHNvY2s6IHJldCAlZCwgZXJybm8gJWRcbiIsCisgICAgICAgICAgICAgICAgICByZXQsIHJldCA8IDAgPyBsYXN0X2Vycm5vIDogMCk7CisgICAgICAgIHZuY19kaXNjb25uZWN0X3N0YXJ0KHZzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIHZuY19jbGllbnRfZXJyb3IoVm5jU3RhdGUgKnZzKQoreworICAgIFZOQ19ERUJVRygiQ2xvc2luZyBkb3duIGNsaWVudCBzb2NrOiBwcm90b2NvbCBlcnJvclxuIik7CisgICAgdm5jX2Rpc2Nvbm5lY3Rfc3RhcnQodnMpOworfQorCisKKy8qCisgKiBDYWxsZWQgdG8gd3JpdGUgYSBjaHVuayBvZiBkYXRhIHRvIHRoZSBjbGllbnQgc29ja2V0LiBUaGUgZGF0YSBtYXkKKyAqIGJlIHRoZSByYXcgZGF0YSwgb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGVuY29kZWQgYnkgU0FTTC4KKyAqIFRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiBlaXRoZXIgc3RyYWlnaHQgb250byB0aGUgc29ja2V0LCBvcgorICogd3JpdHRlbiB2aWEgdGhlIEdOVVRMUyB3cmFwcGVycywgaWYgVExTL1NTTCBlbmNyeXB0aW9uIGlzIGVuYWJsZWQKKyAqCisgKiBOQiwgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBoYXZlIDIgbGF5ZXJzIG9mIGVuY3J5cHRpb24sCisgKiBib3RoIFNBU0wsIGFuZCB0aGlzIFRMUyBsYXllci4gSXQgaXMgaGlnaGx5IHVubGlrZWx5IGluIHByYWN0aWNlCisgKiB0aG91Z2gsIHNpbmNlIFNBU0wgZW5jcnlwdGlvbiB3aWxsIHR5cGljYWxseSBiZSBhIG5vLW9wIGlmIFRMUworICogaXMgYWN0aXZlCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4KKyAqIHRoZSByZXF1ZXN0ZWQgJ2RhdGFsZW4nIGlmIHRoZSBzb2NrZXQgd291bGQgYmxvY2suIFJldHVybnMKKyAqIC0xIG9uIGVycm9yLCBhbmQgZGlzY29ubmVjdHMgdGhlIGNsaWVudCBzb2NrZXQuCisgKi8KK2xvbmcgdm5jX2NsaWVudF93cml0ZV9idWYoVm5jU3RhdGUgKnZzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sKKyAgICBsb25nIHJldDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIGlmICh2cy0+dGxzLnNlc3Npb24pIHsKKyAgICAgICAgcmV0ID0gZ251dGxzX3dyaXRlKHZzLT50bHMuc2Vzc2lvbiwgZGF0YSwgZGF0YWxlbik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEdOVVRMU19FX0FHQUlOKQorICAgICAgICAgICAgICAgIGVycm5vID0gRUFHQUlOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1RMUyAqLworICAgICAgICByZXQgPSBzb2NrZXRfc2VuZCh2cy0+Y3NvY2ssIGRhdGEsIGRhdGFsZW4pOworICAgIFZOQ19ERUJVRygiV3JvdGUgd2lyZSAlcCAlemQgLT4gJWxkXG4iLCBkYXRhLCBkYXRhbGVuLCByZXQpOworICAgIHJldHVybiB2bmNfY2xpZW50X2lvX2Vycm9yKHZzLCByZXQsIHNvY2tldF9lcnJvcigpKTsKK30KKworCisvKgorICogQ2FsbGVkIHRvIHdyaXRlIGJ1ZmZlcmVkIGRhdGEgdG8gdGhlIGNsaWVudCBzb2NrZXQsIHdoZW4gbm90CisgKiB1c2luZyBhbnkgU0FTTCBTU0YgZW5jcnlwdGlvbiBsYXllcnMuIFdpbGwgd3JpdGUgYXMgbXVjaCBkYXRhCisgKiBhcyBwb3NzaWJsZSB3aXRob3V0IGJsb2NraW5nLiBJZiBhbGwgYnVmZmVyZWQgZGF0YSBpcyB3cml0dGVuLAorICogd2lsbCBzd2l0Y2ggdGhlIEZEIHBvbGwoKSBoYW5kbGVyIGJhY2sgdG8gcmVhZCBtb25pdG9yaW5nLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuCisgKiB0aGUgYnVmZmVyZWQgb3V0cHV0IGRhdGEgaWYgdGhlIHNvY2tldCB3b3VsZCBibG9jay4gUmV0dXJucworICogLTEgb24gZXJyb3IsIGFuZCBkaXNjb25uZWN0cyB0aGUgY2xpZW50IHNvY2tldC4KKyAqLworc3RhdGljIGxvbmcgdm5jX2NsaWVudF93cml0ZV9wbGFpbihWbmNTdGF0ZSAqdnMpCit7CisgICAgbG9uZyByZXQ7CisKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICBWTkNfREVCVUcoIldyaXRlIFBsYWluOiBQZW5kaW5nIG91dHB1dCAlcCBzaXplICV6ZCBvZmZzZXQgJXpkLiBXYWl0IFNTRiAlZFxuIiwKKyAgICAgICAgICAgICAgdnMtPm91dHB1dC5idWZmZXIsIHZzLT5vdXRwdXQuY2FwYWNpdHksIHZzLT5vdXRwdXQub2Zmc2V0LAorICAgICAgICAgICAgICB2cy0+c2FzbC53YWl0V3JpdGVTU0YpOworCisgICAgaWYgKHZzLT5zYXNsLmNvbm4gJiYKKyAgICAgICAgdnMtPnNhc2wucnVuU1NGICYmCisgICAgICAgIHZzLT5zYXNsLndhaXRXcml0ZVNTRikgeworICAgICAgICByZXQgPSB2bmNfY2xpZW50X3dyaXRlX2J1Zih2cywgdnMtPm91dHB1dC5idWZmZXIsIHZzLT5zYXNsLndhaXRXcml0ZVNTRik7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICB2cy0+c2FzbC53YWl0V3JpdGVTU0YgLT0gcmV0OworICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19WTkNfU0FTTCAqLworICAgICAgICByZXQgPSB2bmNfY2xpZW50X3dyaXRlX2J1Zih2cywgdnMtPm91dHB1dC5idWZmZXIsIHZzLT5vdXRwdXQub2Zmc2V0KTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1tb3ZlKHZzLT5vdXRwdXQuYnVmZmVyLCB2cy0+b3V0cHV0LmJ1ZmZlciArIHJldCwgKHZzLT5vdXRwdXQub2Zmc2V0IC0gcmV0KSk7CisgICAgdnMtPm91dHB1dC5vZmZzZXQgLT0gcmV0OworCisgICAgaWYgKHZzLT5vdXRwdXQub2Zmc2V0ID09IDApIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmNzb2NrLCBOVUxMLCB2bmNfY2xpZW50X3JlYWQsIE5VTEwsIHZzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBGaXJzdCBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgZGF0YSB0byBiZSB3cml0dGVuIHRvCisgKiB0aGUgY2xpZW50IHNvY2tldC4gV2lsbCBkZWxlZ2F0ZSBhY3R1YWwgd29yayBhY2NvcmRpbmcgdG8gd2hldGhlcgorICogU0FTTCBTU0YgbGF5ZXJzIGFyZSBlbmFibGVkICh0aHVzIHJlcXVpcmluZyBlbmNyeXB0aW9uIGNhbGxzKQorICovCit2b2lkIHZuY19jbGllbnRfd3JpdGUodm9pZCAqb3BhcXVlKQoreworICAgIFZuY1N0YXRlICp2cyA9IG9wYXF1ZTsKKworI2lmZGVmIENPTkZJR19WTkNfU0FTTAorICAgIGlmICh2cy0+c2FzbC5jb25uICYmCisgICAgICAgIHZzLT5zYXNsLnJ1blNTRiAmJgorICAgICAgICAhdnMtPnNhc2wud2FpdFdyaXRlU1NGKSB7CisgICAgICAgIHZuY19jbGllbnRfd3JpdGVfc2FzbCh2cyk7CisgICAgfSBlbHNlCisjZW5kaWYgLyogQ09ORklHX1ZOQ19TQVNMICovCisgICAgICAgIHZuY19jbGllbnRfd3JpdGVfcGxhaW4odnMpOworfQorCit2b2lkIHZuY19yZWFkX3doZW4oVm5jU3RhdGUgKnZzLCBWbmNSZWFkRXZlbnQgKmZ1bmMsIHNpemVfdCBleHBlY3RpbmcpCit7CisgICAgdnMtPnJlYWRfaGFuZGxlciA9IGZ1bmM7CisgICAgdnMtPnJlYWRfaGFuZGxlcl9leHBlY3QgPSBleHBlY3Rpbmc7Cit9CisKKworLyoKKyAqIENhbGxlZCB0byByZWFkIGEgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBjbGllbnQgc29ja2V0LiBUaGUgZGF0YSBtYXkKKyAqIGJlIHRoZSByYXcgZGF0YSwgb3IgbWF5IG5lZWQgdG8gYmUgZnVydGhlciBkZWNvZGVkIGJ5IFNBU0wuCisgKiBUaGUgZGF0YSB3aWxsIGJlIHJlYWQgZWl0aGVyIHN0cmFpZ2h0IGZyb20gdG8gdGhlIHNvY2tldCwgb3IKKyAqIHJlYWQgdmlhIHRoZSBHTlVUTFMgd3JhcHBlcnMsIGlmIFRMUy9TU0wgZW5jcnlwdGlvbiBpcyBlbmFibGVkCisgKgorICogTkIsIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gaGF2ZSAyIGxheWVycyBvZiBlbmNyeXB0aW9uLAorICogYm90aCBTQVNMLCBhbmQgdGhpcyBUTFMgbGF5ZXIuIEl0IGlzIGhpZ2hseSB1bmxpa2VseSBpbiBwcmFjdGljZQorICogdGhvdWdoLCBzaW5jZSBTQVNMIGVuY3J5cHRpb24gd2lsbCB0eXBpY2FsbHkgYmUgYSBuby1vcCBpZiBUTFMKKyAqIGlzIGFjdGl2ZQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuCisgKiB0aGUgcmVxdWVzdGVkICdkYXRhbGVuJyBpZiB0aGUgc29ja2V0IHdvdWxkIGJsb2NrLiBSZXR1cm5zCisgKiAtMSBvbiBlcnJvciwgYW5kIGRpc2Nvbm5lY3RzIHRoZSBjbGllbnQgc29ja2V0LgorICovCitsb25nIHZuY19jbGllbnRfcmVhZF9idWYoVm5jU3RhdGUgKnZzLCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sKKyAgICBsb25nIHJldDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIGlmICh2cy0+dGxzLnNlc3Npb24pIHsKKyAgICAgICAgcmV0ID0gZ251dGxzX3JlYWQodnMtPnRscy5zZXNzaW9uLCBkYXRhLCBkYXRhbGVuKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gR05VVExTX0VfQUdBSU4pCisgICAgICAgICAgICAgICAgZXJybm8gPSBFQUdBSU47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisgICAgICAgIHJldCA9IHNvY2tldF9yZWN2KHZzLT5jc29jaywgZGF0YSwgZGF0YWxlbik7CisgICAgVk5DX0RFQlVHKCJSZWFkIHdpcmUgJXAgJXpkIC0+ICVsZFxuIiwgZGF0YSwgZGF0YWxlbiwgcmV0KTsKKyAgICByZXR1cm4gdm5jX2NsaWVudF9pb19lcnJvcih2cywgcmV0LCBzb2NrZXRfZXJyb3IoKSk7Cit9CisKKworLyoKKyAqIENhbGxlZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgY2xpZW50IHNvY2tldCB0byB0aGUgaW5wdXQgYnVmZmVyLAorICogd2hlbiBub3QgdXNpbmcgYW55IFNBU0wgU1NGIGVuY3J5cHRpb24gbGF5ZXJzLiBXaWxsIHJlYWQgYXMgbXVjaAorICogZGF0YSBhcyBwb3NzaWJsZSB3aXRob3V0IGJsb2NraW5nLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIG9uIGVycm9yLCBhbmQKKyAqIGRpc2Nvbm5lY3RzIHRoZSBjbGllbnQgc29ja2V0LgorICovCitzdGF0aWMgbG9uZyB2bmNfY2xpZW50X3JlYWRfcGxhaW4oVm5jU3RhdGUgKnZzKQoreworICAgIGludCByZXQ7CisgICAgVk5DX0RFQlVHKCJSZWFkIHBsYWluICVwIHNpemUgJXpkIG9mZnNldCAlemRcbiIsCisgICAgICAgICAgICAgIHZzLT5pbnB1dC5idWZmZXIsIHZzLT5pbnB1dC5jYXBhY2l0eSwgdnMtPmlucHV0Lm9mZnNldCk7CisgICAgYnVmZmVyX3Jlc2VydmUoJnZzLT5pbnB1dCwgNDA5Nik7CisgICAgcmV0ID0gdm5jX2NsaWVudF9yZWFkX2J1Zih2cywgYnVmZmVyX2VuZCgmdnMtPmlucHV0KSwgNDA5Nik7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiAwOworICAgIHZzLT5pbnB1dC5vZmZzZXQgKz0gcmV0OworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIEZpcnN0IGZ1bmN0aW9uIGNhbGxlZCB3aGVuZXZlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gYmUgcmVhZCBmcm9tCisgKiB0aGUgY2xpZW50IHNvY2tldC4gV2lsbCBkZWxlZ2F0ZSBhY3R1YWwgd29yayBhY2NvcmRpbmcgdG8gd2hldGhlcgorICogU0FTTCBTU0YgbGF5ZXJzIGFyZSBlbmFibGVkICh0aHVzIHJlcXVpcmluZyBkZWNyeXB0aW9uIGNhbGxzKQorICovCit2b2lkIHZuY19jbGllbnRfcmVhZCh2b2lkICpvcGFxdWUpCit7CisgICAgVm5jU3RhdGUgKnZzID0gb3BhcXVlOworICAgIGxvbmcgcmV0OworCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgaWYgKHZzLT5zYXNsLmNvbm4gJiYgdnMtPnNhc2wucnVuU1NGKQorICAgICAgICByZXQgPSB2bmNfY2xpZW50X3JlYWRfc2FzbCh2cyk7CisgICAgZWxzZQorI2VuZGlmIC8qIENPTkZJR19WTkNfU0FTTCAqLworICAgICAgICByZXQgPSB2bmNfY2xpZW50X3JlYWRfcGxhaW4odnMpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmICh2cy0+Y3NvY2sgPT0gLTEpCisgICAgICAgICAgICB2bmNfZGlzY29ubmVjdF9maW5pc2godnMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd2hpbGUgKHZzLT5yZWFkX2hhbmRsZXIgJiYgdnMtPmlucHV0Lm9mZnNldCA+PSB2cy0+cmVhZF9oYW5kbGVyX2V4cGVjdCkgeworICAgICAgICBzaXplX3QgbGVuID0gdnMtPnJlYWRfaGFuZGxlcl9leHBlY3Q7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gdnMtPnJlYWRfaGFuZGxlcih2cywgdnMtPmlucHV0LmJ1ZmZlciwgbGVuKTsKKyAgICAgICAgaWYgKHZzLT5jc29jayA9PSAtMSkgeworICAgICAgICAgICAgdm5jX2Rpc2Nvbm5lY3RfZmluaXNoKHZzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBtZW1tb3ZlKHZzLT5pbnB1dC5idWZmZXIsIHZzLT5pbnB1dC5idWZmZXIgKyBsZW4sICh2cy0+aW5wdXQub2Zmc2V0IC0gbGVuKSk7CisgICAgICAgICAgICB2cy0+aW5wdXQub2Zmc2V0IC09IGxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZzLT5yZWFkX2hhbmRsZXJfZXhwZWN0ID0gcmV0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIHZuY193cml0ZShWbmNTdGF0ZSAqdnMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgYnVmZmVyX3Jlc2VydmUoJnZzLT5vdXRwdXQsIGxlbik7CisKKyAgICBpZiAodnMtPmNzb2NrICE9IC0xICYmIGJ1ZmZlcl9lbXB0eSgmdnMtPm91dHB1dCkpIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmNzb2NrLCBOVUxMLCB2bmNfY2xpZW50X3JlYWQsIHZuY19jbGllbnRfd3JpdGUsIHZzKTsKKyAgICB9CisKKyAgICBidWZmZXJfYXBwZW5kKCZ2cy0+b3V0cHV0LCBkYXRhLCBsZW4pOworfQorCit2b2lkIHZuY193cml0ZV9zMzIoVm5jU3RhdGUgKnZzLCBpbnQzMl90IHZhbHVlKQoreworICAgIHZuY193cml0ZV91MzIodnMsICoodWludDMyX3QgKikmdmFsdWUpOworfQorCit2b2lkIHZuY193cml0ZV91MzIoVm5jU3RhdGUgKnZzLCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICB1aW50OF90IGJ1Zls0XTsKKworICAgIGJ1ZlswXSA9ICh2YWx1ZSA+PiAyNCkgJiAweEZGOworICAgIGJ1ZlsxXSA9ICh2YWx1ZSA+PiAxNikgJiAweEZGOworICAgIGJ1ZlsyXSA9ICh2YWx1ZSA+PiAgOCkgJiAweEZGOworICAgIGJ1ZlszXSA9IHZhbHVlICYgMHhGRjsKKworICAgIHZuY193cml0ZSh2cywgYnVmLCA0KTsKK30KKwordm9pZCB2bmNfd3JpdGVfdTE2KFZuY1N0YXRlICp2cywgdWludDE2X3QgdmFsdWUpCit7CisgICAgdWludDhfdCBidWZbMl07CisKKyAgICBidWZbMF0gPSAodmFsdWUgPj4gOCkgJiAweEZGOworICAgIGJ1ZlsxXSA9IHZhbHVlICYgMHhGRjsKKworICAgIHZuY193cml0ZSh2cywgYnVmLCAyKTsKK30KKwordm9pZCB2bmNfd3JpdGVfdTgoVm5jU3RhdGUgKnZzLCB1aW50OF90IHZhbHVlKQoreworICAgIHZuY193cml0ZSh2cywgKGNoYXIgKikmdmFsdWUsIDEpOworfQorCit2b2lkIHZuY19mbHVzaChWbmNTdGF0ZSAqdnMpCit7CisgICAgaWYgKHZzLT5jc29jayAhPSAtMSAmJiB2cy0+b3V0cHV0Lm9mZnNldCkKKyAgICAgICAgdm5jX2NsaWVudF93cml0ZSh2cyk7Cit9CisKK3VpbnQ4X3QgcmVhZF91OCh1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiBkYXRhW29mZnNldF07Cit9CisKK3VpbnQxNl90IHJlYWRfdTE2KHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuICgoZGF0YVtvZmZzZXRdICYgMHhGRikgPDwgOCkgfCAoZGF0YVtvZmZzZXQgKyAxXSAmIDB4RkYpOworfQorCitpbnQzMl90IHJlYWRfczMyKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBvZmZzZXQpCit7CisgICAgcmV0dXJuIChpbnQzMl90KSgoZGF0YVtvZmZzZXRdIDw8IDI0KSB8IChkYXRhW29mZnNldCArIDFdIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAoZGF0YVtvZmZzZXQgKyAyXSA8PCA4KSB8IGRhdGFbb2Zmc2V0ICsgM10pOworfQorCit1aW50MzJfdCByZWFkX3UzMih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAoKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfCAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfAorICAgICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfCBkYXRhW29mZnNldCArIDNdKTsKK30KKworc3RhdGljIHZvaWQgY2xpZW50X2N1dF90ZXh0KFZuY1N0YXRlICp2cywgc2l6ZV90IGxlbiwgdWludDhfdCAqdGV4dCkKK3sKK30KKworc3RhdGljIHZvaWQgY2hlY2tfcG9pbnRlcl90eXBlX2NoYW5nZShWbmNTdGF0ZSAqdnMsIGludCBhYnNvbHV0ZSkKK3sKKyAgICBpZiAodm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9QT0lOVEVSX1RZUEVfQ0hBTkdFKSAmJiB2cy0+YWJzb2x1dGUgIT0gYWJzb2x1dGUpIHsKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICAgICAgdm5jX3dyaXRlX3UxNih2cywgMSk7CisgICAgICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIGFic29sdXRlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzX2dldF93aWR0aCh2cy0+ZHMpLCBkc19nZXRfaGVpZ2h0KHZzLT5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5DX0VOQ09ESU5HX1BPSU5URVJfVFlQRV9DSEFOR0UpOworICAgICAgICB2bmNfZmx1c2godnMpOworICAgIH0KKyAgICB2cy0+YWJzb2x1dGUgPSBhYnNvbHV0ZTsKK30KKworc3RhdGljIHZvaWQgcG9pbnRlcl9ldmVudChWbmNTdGF0ZSAqdnMsIGludCBidXR0b25fbWFzaywgaW50IHgsIGludCB5KQoreworICAgIGludCBidXR0b25zID0gMDsKKyAgICBpbnQgZHogPSAwOworCisgICAgaWYgKGJ1dHRvbl9tYXNrICYgMHgwMSkKKyAgICAgICAgYnV0dG9ucyB8PSBNT1VTRV9FVkVOVF9MQlVUVE9OOworICAgIGlmIChidXR0b25fbWFzayAmIDB4MDIpCisgICAgICAgIGJ1dHRvbnMgfD0gTU9VU0VfRVZFTlRfTUJVVFRPTjsKKyAgICBpZiAoYnV0dG9uX21hc2sgJiAweDA0KQorICAgICAgICBidXR0b25zIHw9IE1PVVNFX0VWRU5UX1JCVVRUT047CisgICAgaWYgKGJ1dHRvbl9tYXNrICYgMHgwOCkKKyAgICAgICAgZHogPSAtMTsKKyAgICBpZiAoYnV0dG9uX21hc2sgJiAweDEwKQorICAgICAgICBkeiA9IDE7CisKKyAgICBpZiAodnMtPmFic29sdXRlKSB7CisgICAgICAgIGtiZF9tb3VzZV9ldmVudCh4ICogMHg3RkZGIC8gKGRzX2dldF93aWR0aCh2cy0+ZHMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICB5ICogMHg3RkZGIC8gKGRzX2dldF9oZWlnaHQodnMtPmRzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgZHosIGJ1dHRvbnMpOworICAgIH0gZWxzZSBpZiAodm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9QT0lOVEVSX1RZUEVfQ0hBTkdFKSkgeworICAgICAgICB4IC09IDB4N0ZGRjsKKyAgICAgICAgeSAtPSAweDdGRkY7CisKKyAgICAgICAga2JkX21vdXNlX2V2ZW50KHgsIHksIGR6LCBidXR0b25zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodnMtPmxhc3RfeCAhPSAtMSkKKyAgICAgICAgICAgIGtiZF9tb3VzZV9ldmVudCh4IC0gdnMtPmxhc3RfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IC0gdnMtPmxhc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeiwgYnV0dG9ucyk7CisgICAgICAgIHZzLT5sYXN0X3ggPSB4OworICAgICAgICB2cy0+bGFzdF95ID0geTsKKyAgICB9CisKKyAgICBjaGVja19wb2ludGVyX3R5cGVfY2hhbmdlKHZzLCBrYmRfbW91c2VfaXNfYWJzb2x1dGUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2tleXMoVm5jU3RhdGUgKnZzKQoreworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGlmICh2cy0+bW9kaWZpZXJzX3N0YXRlW2ldKSB7CisgICAgICAgICAgICBpZiAoaSAmIDB4ODApCisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKDB4ZTApOworICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKGkgfCAweDgwKTsKKyAgICAgICAgICAgIHZzLT5tb2RpZmllcnNfc3RhdGVbaV0gPSAwOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVzc19rZXkoVm5jU3RhdGUgKnZzLCBpbnQga2V5c3ltKQoreworICAgIGtiZF9wdXRfa2V5Y29kZShrZXlzeW0yc2NhbmNvZGUodnMtPnZkLT5rYmRfbGF5b3V0LCBrZXlzeW0pICYgMHg3Zik7CisgICAga2JkX3B1dF9rZXljb2RlKGtleXN5bTJzY2FuY29kZSh2cy0+dmQtPmtiZF9sYXlvdXQsIGtleXN5bSkgfCAweDgwKTsKK30KKworc3RhdGljIHZvaWQgZG9fa2V5X2V2ZW50KFZuY1N0YXRlICp2cywgaW50IGRvd24sIGludCBrZXljb2RlLCBpbnQgc3ltKQoreworICAgIC8qIFFFTVUgY29uc29sZSBzd2l0Y2ggKi8KKyAgICBzd2l0Y2goa2V5Y29kZSkgeworICAgIGNhc2UgMHgyYTogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgKi8KKyAgICBjYXNlIDB4MzY6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBTaGlmdCAqLworICAgIGNhc2UgMHgxZDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgQ1RSTCAqLworICAgIGNhc2UgMHg5ZDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IENUUkwgKi8KKyAgICBjYXNlIDB4Mzg6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IEFMVCAqLworICAgIGNhc2UgMHhiODogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IEFMVCAqLworICAgICAgICBpZiAoZG93bikKKyAgICAgICAgICAgIHZzLT5tb2RpZmllcnNfc3RhdGVba2V5Y29kZV0gPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2cy0+bW9kaWZpZXJzX3N0YXRlW2tleWNvZGVdID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAyIC4uLiAweDBhOiAvKiAnMScgdG8gJzknIGtleXMgKi8KKyAgICAgICAgaWYgKGRvd24gJiYgdnMtPm1vZGlmaWVyc19zdGF0ZVsweDFkXSAmJiB2cy0+bW9kaWZpZXJzX3N0YXRlWzB4MzhdKSB7CisgICAgICAgICAgICAvKiBSZXNldCB0aGUgbW9kaWZpZXJzIHNlbnQgdG8gdGhlIGN1cnJlbnQgY29uc29sZSAqLworICAgICAgICAgICAgcmVzZXRfa2V5cyh2cyk7CisgICAgICAgICAgICBjb25zb2xlX3NlbGVjdChrZXljb2RlIC0gMHgwMik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDNhOiAgICAgICAgICAgICAgICAgICAgICAgIC8qIENhcHNMb2NrICovCisgICAgY2FzZSAweDQ1OiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bUxvY2sgKi8KKyAgICAgICAgaWYgKCFkb3duKQorICAgICAgICAgICAgdnMtPm1vZGlmaWVyc19zdGF0ZVtrZXljb2RlXSBePSAxOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoa2V5Y29kZV9pc19rZXlwYWQodnMtPnZkLT5rYmRfbGF5b3V0LCBrZXljb2RlKSkgeworICAgICAgICAvKiBJZiB0aGUgbnVtbG9jayBzdGF0ZSBuZWVkcyB0byBjaGFuZ2UgdGhlbiBzaW11bGF0ZSBhbiBhZGRpdGlvbmFsCisgICAgICAgICAgIGtleXByZXNzIGJlZm9yZSBzZW5kaW5nIHRoaXMgb25lLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgdXNlcgorICAgICAgICAgICB0b2dnbGVzIG51bWxvY2sgYXdheSBmcm9tIHRoZSBWTkMgd2luZG93LgorICAgICAgICAqLworICAgICAgICBpZiAoa2V5c3ltX2lzX251bWxvY2sodnMtPnZkLT5rYmRfbGF5b3V0LCBzeW0gJiAweEZGRkYpKSB7CisgICAgICAgICAgICBpZiAoIXZzLT5tb2RpZmllcnNfc3RhdGVbMHg0NV0pIHsKKyAgICAgICAgICAgICAgICB2cy0+bW9kaWZpZXJzX3N0YXRlWzB4NDVdID0gMTsKKyAgICAgICAgICAgICAgICBwcmVzc19rZXkodnMsIDB4ZmY3Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodnMtPm1vZGlmaWVyc19zdGF0ZVsweDQ1XSkgeworICAgICAgICAgICAgICAgIHZzLT5tb2RpZmllcnNfc3RhdGVbMHg0NV0gPSAwOworICAgICAgICAgICAgICAgIHByZXNzX2tleSh2cywgMHhmZjdmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc19ncmFwaGljX2NvbnNvbGUoKSkgeworICAgICAgICBpZiAoa2V5Y29kZSAmIDB4ODApCisgICAgICAgICAgICBrYmRfcHV0X2tleWNvZGUoMHhlMCk7CisgICAgICAgIGlmIChkb3duKQorICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKGtleWNvZGUgJiAweDdmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKGtleWNvZGUgfCAweDgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBRRU1VIGNvbnNvbGUgZW11bGF0aW9uICovCisgICAgICAgIGlmIChkb3duKSB7CisgICAgICAgICAgICBpbnQgbnVtbG9jayA9IHZzLT5tb2RpZmllcnNfc3RhdGVbMHg0NV07CisgICAgICAgICAgICBzd2l0Y2ggKGtleWNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgMHgyYTogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgU2hpZnQgKi8KKyAgICAgICAgICAgIGNhc2UgMHgzNjogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IFNoaWZ0ICovCisgICAgICAgICAgICBjYXNlIDB4MWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IENUUkwgKi8KKyAgICAgICAgICAgIGNhc2UgMHg5ZDogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IENUUkwgKi8KKyAgICAgICAgICAgIGNhc2UgMHgzODogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgQUxUICovCisgICAgICAgICAgICBjYXNlIDB4Yjg6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBBTFQgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhjODoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShRRU1VX0tFWV9VUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4ZDA6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfRE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Y2I6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfTEVGVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Y2Q6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfUklHSFQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGQzOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX0RFTEVURSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Yzc6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfSE9NRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Y2Y6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfRU5EKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhjOToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShRRU1VX0tFWV9QQUdFVVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGQxOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX1BBR0VET1dOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweDQ3OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnNycgOiBRRU1VX0tFWV9IT01FKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0ODoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzgnIDogUUVNVV9LRVlfVVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDQ5OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnOScgOiBRRU1VX0tFWV9QQUdFVVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDRiOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnNCcgOiBRRU1VX0tFWV9MRUZUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0YzoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bSgnNScpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDRkOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnNicgOiBRRU1VX0tFWV9SSUdIVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NGY6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0obnVtbG9jayA/ICcxJyA6IFFFTVVfS0VZX0VORCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NTA6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0obnVtbG9jayA/ICcyJyA6IFFFTVVfS0VZX0RPV04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDUxOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnMycgOiBRRU1VX0tFWV9QQUdFRE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NTI6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oJzAnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg1MzoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJy4nIDogUUVNVV9LRVlfREVMRVRFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAweGI1OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKCcvJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Mzc6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oJyonKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0YToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bSgnLScpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDRlOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKCcrJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4OWM6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oJ1xuJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oc3ltKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQga2V5X2V2ZW50KFZuY1N0YXRlICp2cywgaW50IGRvd24sIHVpbnQzMl90IHN5bSkKK3sKKyAgICBpbnQga2V5Y29kZTsKKworICAgIGlmIChzeW0gPj0gJ0EnICYmIHN5bSA8PSAnWicgJiYgaXNfZ3JhcGhpY19jb25zb2xlKCkpCisgICAgICAgIHN5bSA9IHN5bSAtICdBJyArICdhJzsKKworICAgIGtleWNvZGUgPSBrZXlzeW0yc2NhbmNvZGUodnMtPnZkLT5rYmRfbGF5b3V0LCBzeW0gJiAweEZGRkYpOworICAgIGRvX2tleV9ldmVudCh2cywgZG93biwga2V5Y29kZSwgc3ltKTsKK30KKworc3RhdGljIHZvaWQgZXh0X2tleV9ldmVudChWbmNTdGF0ZSAqdnMsIGludCBkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeW0sIHVpbnQxNl90IGtleWNvZGUpCit7CisgICAgLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVzIGEga2V5Ym9hcmQgbGF5b3V0LCBhbHdheXMgdXNlIGl0ICovCisgICAgaWYgKGtleWJvYXJkX2xheW91dCkKKyAgICAgICAga2V5X2V2ZW50KHZzLCBkb3duLCBzeW0pOworICAgIGVsc2UKKyAgICAgICAgZG9fa2V5X2V2ZW50KHZzLCBkb3duLCBrZXljb2RlLCBzeW0pOworfQorCitzdGF0aWMgdm9pZCBmcmFtZWJ1ZmZlcl91cGRhdGVfcmVxdWVzdChWbmNTdGF0ZSAqdnMsIGludCBpbmNyZW1lbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3Bvc2l0aW9uLCBpbnQgeV9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpZiAoeF9wb3NpdGlvbiA+IGRzX2dldF93aWR0aCh2cy0+ZHMpKQorICAgICAgICB4X3Bvc2l0aW9uID0gZHNfZ2V0X3dpZHRoKHZzLT5kcyk7CisgICAgaWYgKHlfcG9zaXRpb24gPiBkc19nZXRfaGVpZ2h0KHZzLT5kcykpCisgICAgICAgIHlfcG9zaXRpb24gPSBkc19nZXRfaGVpZ2h0KHZzLT5kcyk7CisgICAgaWYgKHhfcG9zaXRpb24gKyB3ID49IGRzX2dldF93aWR0aCh2cy0+ZHMpKQorICAgICAgICB3ID0gZHNfZ2V0X3dpZHRoKHZzLT5kcykgIC0geF9wb3NpdGlvbjsKKyAgICBpZiAoeV9wb3NpdGlvbiArIGggPj0gZHNfZ2V0X2hlaWdodCh2cy0+ZHMpKQorICAgICAgICBoID0gZHNfZ2V0X2hlaWdodCh2cy0+ZHMpIC0geV9wb3NpdGlvbjsKKworICAgIGludCBpOworICAgIHZzLT5uZWVkX3VwZGF0ZSA9IDE7CisgICAgaWYgKCFpbmNyZW1lbnRhbCkgeworICAgICAgICB2cy0+Zm9yY2VfdXBkYXRlID0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICAgICAgdm5jX3NldF9iaXRzKHZzLT5ndWVzdC5kaXJ0eVt5X3Bvc2l0aW9uICsgaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRzX2dldF93aWR0aCh2cy0+ZHMpIC8gMTYpLCBWTkNfRElSVFlfV09SRFMpOworICAgICAgICAgICAgdm5jX3NldF9iaXRzKHZzLT5zZXJ2ZXIuZGlydHlbeV9wb3NpdGlvbiArIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgIChkc19nZXRfd2lkdGgodnMtPmRzKSAvIDE2KSwgVk5DX0RJUlRZX1dPUkRTKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2VuZF9leHRfa2V5X2V2ZW50X2FjayhWbmNTdGF0ZSAqdnMpCit7CisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOworICAgIHZuY193cml0ZV91MTYodnMsIDEpOworICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIDAsIDAsIGRzX2dldF93aWR0aCh2cy0+ZHMpLCBkc19nZXRfaGVpZ2h0KHZzLT5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWTkNfRU5DT0RJTkdfRVhUX0tFWV9FVkVOVCk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9leHRfYXVkaW9fYWNrKFZuY1N0YXRlICp2cykKK3sKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOworICAgIHZuY193cml0ZV91OCh2cywgMCk7CisgICAgdm5jX3dyaXRlX3UxNih2cywgMSk7CisgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgMCwgMCwgZHNfZ2V0X3dpZHRoKHZzLT5kcyksIGRzX2dldF9oZWlnaHQodnMtPmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOQ19FTkNPRElOR19BVURJTyk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2VuY29kaW5ncyhWbmNTdGF0ZSAqdnMsIGludDMyX3QgKmVuY29kaW5ncywgc2l6ZV90IG5fZW5jb2RpbmdzKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGludCBlbmMgPSAwOworCisgICAgdm5jX3psaWJfaW5pdCh2cyk7CisgICAgdnMtPmZlYXR1cmVzID0gMDsKKyAgICB2cy0+dm5jX2VuY29kaW5nID0gMDsKKyAgICB2cy0+dGlnaHRfY29tcHJlc3Npb24gPSA5OworICAgIHZzLT50aWdodF9xdWFsaXR5ID0gOTsKKyAgICB2cy0+YWJzb2x1dGUgPSAtMTsKKworICAgIGZvciAoaSA9IG5fZW5jb2RpbmdzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZW5jID0gZW5jb2RpbmdzW2ldOworICAgICAgICBzd2l0Y2ggKGVuYykgeworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19SQVc6CisgICAgICAgICAgICB2cy0+dm5jX2VuY29kaW5nID0gZW5jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX0NPUFlSRUNUOgorICAgICAgICAgICAgdnMtPmZlYXR1cmVzIHw9IFZOQ19GRUFUVVJFX0NPUFlSRUNUX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfSEVYVElMRToKKyAgICAgICAgICAgIHZzLT5mZWF0dXJlcyB8PSBWTkNfRkVBVFVSRV9IRVhUSUxFX01BU0s7CisgICAgICAgICAgICB2cy0+dm5jX2VuY29kaW5nID0gZW5jOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1pMSUI6CisgICAgICAgICAgICB2cy0+ZmVhdHVyZXMgfD0gVk5DX0ZFQVRVUkVfWkxJQl9NQVNLOworICAgICAgICAgICAgdnMtPnZuY19lbmNvZGluZyA9IGVuYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19ERVNLVE9QUkVTSVpFOgorICAgICAgICAgICAgdnMtPmZlYXR1cmVzIHw9IFZOQ19GRUFUVVJFX1JFU0laRV9NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1BPSU5URVJfVFlQRV9DSEFOR0U6CisgICAgICAgICAgICB2cy0+ZmVhdHVyZXMgfD0gVk5DX0ZFQVRVUkVfUE9JTlRFUl9UWVBFX0NIQU5HRV9NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX0VYVF9LRVlfRVZFTlQ6CisgICAgICAgICAgICBzZW5kX2V4dF9rZXlfZXZlbnRfYWNrKHZzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19BVURJTzoKKyAgICAgICAgICAgIHNlbmRfZXh0X2F1ZGlvX2Fjayh2cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfV01WaToKKyAgICAgICAgICAgIHZzLT5mZWF0dXJlcyB8PSBWTkNfRkVBVFVSRV9XTVZJX01BU0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfQ09NUFJFU1NMRVZFTDAgLi4uIFZOQ19FTkNPRElOR19DT01QUkVTU0xFVkVMMCArIDk6CisgICAgICAgICAgICB2cy0+dGlnaHRfY29tcHJlc3Npb24gPSAoZW5jICYgMHgwRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfUVVBTElUWUxFVkVMMCAuLi4gVk5DX0VOQ09ESU5HX1FVQUxJVFlMRVZFTDAgKyA5OgorICAgICAgICAgICAgdnMtPnRpZ2h0X3F1YWxpdHkgPSAoZW5jICYgMHgwRik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFZOQ19ERUJVRygiVW5rbm93biBlbmNvZGluZzogJWQgKDB4JS44eCk6ICVkXG4iLCBpLCBlbmMsIGVuYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNoZWNrX3BvaW50ZXJfdHlwZV9jaGFuZ2UodnMsIGtiZF9tb3VzZV9pc19hYnNvbHV0ZSgpKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3BpeGVsX2NvbnZlcnNpb24oVm5jU3RhdGUgKnZzKQoreworICAgIGlmICgodnMtPmNsaWVudGRzLmZsYWdzICYgUUVNVV9CSUdfRU5ESUFOX0ZMQUcpID09CisgICAgICAgICh2cy0+ZHMtPnN1cmZhY2UtPmZsYWdzICYgUUVNVV9CSUdfRU5ESUFOX0ZMQUcpICYmCisgICAgICAgICFtZW1jbXAoJih2cy0+Y2xpZW50ZHMucGYpLCAmKHZzLT5kcy0+c3VyZmFjZS0+cGYpLCBzaXplb2YoUGl4ZWxGb3JtYXQpKSkgeworICAgICAgICB2cy0+d3JpdGVfcGl4ZWxzID0gdm5jX3dyaXRlX3BpeGVsc19jb3B5OworICAgICAgICBzd2l0Y2ggKHZzLT5kcy0+c3VyZmFjZS0+cGYuYml0c19wZXJfcGl4ZWwpIHsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV84OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV8xNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6CisgICAgICAgICAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfMzI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB2cy0+d3JpdGVfcGl4ZWxzID0gdm5jX3dyaXRlX3BpeGVsc19nZW5lcmljOworICAgICAgICBzd2l0Y2ggKHZzLT5kcy0+c3VyZmFjZS0+cGYuYml0c19wZXJfcGl4ZWwpIHsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV9nZW5lcmljXzg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHZzLT5zZW5kX2hleHRpbGVfdGlsZSA9IHNlbmRfaGV4dGlsZV90aWxlX2dlbmVyaWNfMTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHZzLT5zZW5kX2hleHRpbGVfdGlsZSA9IHNlbmRfaGV4dGlsZV90aWxlX2dlbmVyaWNfMzI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbF9mb3JtYXQoVm5jU3RhdGUgKnZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19wZXJfcGl4ZWwsIGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZ19lbmRpYW5fZmxhZywgaW50IHRydWVfY29sb3JfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZF9tYXgsIGludCBncmVlbl9tYXgsIGludCBibHVlX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZF9zaGlmdCwgaW50IGdyZWVuX3NoaWZ0LCBpbnQgYmx1ZV9zaGlmdCkKK3sKKyAgICBpZiAoIXRydWVfY29sb3JfZmxhZykgeworICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZzLT5jbGllbnRkcyA9ICoodnMtPmd1ZXN0LmRzKTsKKyAgICB2cy0+Y2xpZW50ZHMucGYucm1heCA9IHJlZF9tYXg7CisgICAgY291bnRfYml0cyh2cy0+Y2xpZW50ZHMucGYucmJpdHMsIHJlZF9tYXgpOworICAgIHZzLT5jbGllbnRkcy5wZi5yc2hpZnQgPSByZWRfc2hpZnQ7CisgICAgdnMtPmNsaWVudGRzLnBmLnJtYXNrID0gcmVkX21heCA8PCByZWRfc2hpZnQ7CisgICAgdnMtPmNsaWVudGRzLnBmLmdtYXggPSBncmVlbl9tYXg7CisgICAgY291bnRfYml0cyh2cy0+Y2xpZW50ZHMucGYuZ2JpdHMsIGdyZWVuX21heCk7CisgICAgdnMtPmNsaWVudGRzLnBmLmdzaGlmdCA9IGdyZWVuX3NoaWZ0OworICAgIHZzLT5jbGllbnRkcy5wZi5nbWFzayA9IGdyZWVuX21heCA8PCBncmVlbl9zaGlmdDsKKyAgICB2cy0+Y2xpZW50ZHMucGYuYm1heCA9IGJsdWVfbWF4OworICAgIGNvdW50X2JpdHModnMtPmNsaWVudGRzLnBmLmJiaXRzLCBibHVlX21heCk7CisgICAgdnMtPmNsaWVudGRzLnBmLmJzaGlmdCA9IGJsdWVfc2hpZnQ7CisgICAgdnMtPmNsaWVudGRzLnBmLmJtYXNrID0gYmx1ZV9tYXggPDwgYmx1ZV9zaGlmdDsKKyAgICB2cy0+Y2xpZW50ZHMucGYuYml0c19wZXJfcGl4ZWwgPSBiaXRzX3Blcl9waXhlbDsKKyAgICB2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsID0gYml0c19wZXJfcGl4ZWwgLyA4OworICAgIHZzLT5jbGllbnRkcy5wZi5kZXB0aCA9IGJpdHNfcGVyX3BpeGVsID09IDMyID8gMjQgOiBiaXRzX3Blcl9waXhlbDsKKyAgICB2cy0+Y2xpZW50ZHMuZmxhZ3MgPSBiaWdfZW5kaWFuX2ZsYWcgPyBRRU1VX0JJR19FTkRJQU5fRkxBRyA6IDB4MDA7CisKKyAgICBzZXRfcGl4ZWxfY29udmVyc2lvbih2cyk7CisKKyAgICB2Z2FfaHdfaW52YWxpZGF0ZSgpOworICAgIHZnYV9od191cGRhdGUoKTsKK30KKworc3RhdGljIHZvaWQgcGl4ZWxfZm9ybWF0X21lc3NhZ2UgKFZuY1N0YXRlICp2cykgeworICAgIGNoYXIgcGFkWzNdID0geyAwLCAwLCAwIH07CisKKyAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuYml0c19wZXJfcGl4ZWwpOyAvKiBiaXRzLXBlci1waXhlbCAqLworICAgIHZuY193cml0ZV91OCh2cywgdnMtPmRzLT5zdXJmYWNlLT5wZi5kZXB0aCk7IC8qIGRlcHRoICovCisKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgIHZuY193cml0ZV91OCh2cywgMSk7ICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4tZmxhZyAqLworI2Vsc2UKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOyAgICAgICAgICAgICAvKiBiaWctZW5kaWFuLWZsYWcgKi8KKyNlbmRpZgorICAgIHZuY193cml0ZV91OCh2cywgMSk7ICAgICAgICAgICAgIC8qIHRydWUtY29sb3ItZmxhZyAqLworICAgIHZuY193cml0ZV91MTYodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYucm1heCk7ICAgICAvKiByZWQtbWF4ICovCisgICAgdm5jX3dyaXRlX3UxNih2cywgdnMtPmRzLT5zdXJmYWNlLT5wZi5nbWF4KTsgICAgIC8qIGdyZWVuLW1heCAqLworICAgIHZuY193cml0ZV91MTYodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuYm1heCk7ICAgICAvKiBibHVlLW1heCAqLworICAgIHZuY193cml0ZV91OCh2cywgdnMtPmRzLT5zdXJmYWNlLT5wZi5yc2hpZnQpOyAgICAvKiByZWQtc2hpZnQgKi8KKyAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuZ3NoaWZ0KTsgICAgLyogZ3JlZW4tc2hpZnQgKi8KKyAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuYnNoaWZ0KTsgICAgLyogYmx1ZS1zaGlmdCAqLworICAgIGlmICh2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsID09IDMyKQorICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV8zMjsKKyAgICBlbHNlIGlmICh2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsID09IDE2KQorICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV8xNjsKKyAgICBlbHNlIGlmICh2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsID09IDgpCisgICAgICAgIHZzLT5zZW5kX2hleHRpbGVfdGlsZSA9IHNlbmRfaGV4dGlsZV90aWxlXzg7CisgICAgdnMtPmNsaWVudGRzID0gKih2cy0+ZHMtPnN1cmZhY2UpOworICAgIHZzLT5jbGllbnRkcy5mbGFncyAmPSB+UUVNVV9BTExPQ0FURURfRkxBRzsKKyAgICB2cy0+d3JpdGVfcGl4ZWxzID0gdm5jX3dyaXRlX3BpeGVsc19jb3B5OworCisgICAgdm5jX3dyaXRlKHZzLCBwYWQsIDMpOyAgICAgICAgICAgLyogcGFkZGluZyAqLworfQorCitzdGF0aWMgdm9pZCB2bmNfZHB5X3NldGRhdGEoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIHZuY19jb2xvcmRlcHRoKFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAodm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9XTVZJKSkgeworICAgICAgICAvKiBTZW5kaW5nIGEgV01WaSBtZXNzYWdlIHRvIG5vdGlmeSB0aGUgY2xpZW50Ki8KKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsgIC8qIG1zZyBpZCAqLworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDApOworICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsgLyogbnVtYmVyIG9mIHJlY3RzICovCisgICAgICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIDAsIDAsIGRzX2dldF93aWR0aCh2cy0+ZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzX2dldF9oZWlnaHQodnMtPmRzKSwgVk5DX0VOQ09ESU5HX1dNVmkpOworICAgICAgICBwaXhlbF9mb3JtYXRfbWVzc2FnZSh2cyk7CisgICAgICAgIHZuY19mbHVzaCh2cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3BpeGVsX2NvbnZlcnNpb24odnMpOworICAgIH0KK30KKworc3RhdGljIGludCBwcm90b2NvbF9jbGllbnRfbXNnKFZuY1N0YXRlICp2cywgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCBsaW1pdDsKKworICAgIHN3aXRjaCAoZGF0YVswXSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIDIwOworCisgICAgICAgIHNldF9waXhlbF9mb3JtYXQodnMsIHJlYWRfdTgoZGF0YSwgNCksIHJlYWRfdTgoZGF0YSwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91OChkYXRhLCA2KSwgcmVhZF91OChkYXRhLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3UxNihkYXRhLCA4KSwgcmVhZF91MTYoZGF0YSwgMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTE2KGRhdGEsIDEyKSwgcmVhZF91OChkYXRhLCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91OChkYXRhLCAxNSksIHJlYWRfdTgoZGF0YSwgMTYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gNDsKKworICAgICAgICBpZiAobGVuID09IDQpIHsKKyAgICAgICAgICAgIGxpbWl0ID0gcmVhZF91MTYoZGF0YSwgMik7CisgICAgICAgICAgICBpZiAobGltaXQgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiA0ICsgKGxpbWl0ICogNCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbGltaXQgPSByZWFkX3UxNihkYXRhLCAyKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCB2YWwgPSByZWFkX3MzMihkYXRhLCA0ICsgKGkgKiA0KSk7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSArIDQgKyAoaSAqIDQpLCAmdmFsLCBzaXplb2YodmFsKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXRfZW5jb2RpbmdzKHZzLCAoaW50MzJfdCAqKShkYXRhICsgNCksIGxpbWl0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gMTA7CisKKyAgICAgICAgZnJhbWVidWZmZXJfdXBkYXRlX3JlcXVlc3QodnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTgoZGF0YSwgMSksIHJlYWRfdTE2KGRhdGEsIDIpLCByZWFkX3UxNihkYXRhLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91MTYoZGF0YSwgNiksIHJlYWRfdTE2KGRhdGEsIDgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gODsKKworICAgICAgICBrZXlfZXZlbnQodnMsIHJlYWRfdTgoZGF0YSwgMSksIHJlYWRfdTMyKGRhdGEsIDQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gNjsKKworICAgICAgICBwb2ludGVyX2V2ZW50KHZzLCByZWFkX3U4KGRhdGEsIDEpLCByZWFkX3UxNihkYXRhLCAyKSwgcmVhZF91MTYoZGF0YSwgNCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGlmIChsZW4gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiA4OworCisgICAgICAgIGlmIChsZW4gPT0gOCkgeworICAgICAgICAgICAgdWludDMyX3QgZGxlbiA9IHJlYWRfdTMyKGRhdGEsIDQpOworICAgICAgICAgICAgaWYgKGRsZW4gPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiA4ICsgZGxlbjsKKyAgICAgICAgfQorCisgICAgICAgIGNsaWVudF9jdXRfdGV4dCh2cywgcmVhZF91MzIoZGF0YSwgNCksIGRhdGEgKyA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNTU6CisgICAgICAgIGlmIChsZW4gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiAyOworCisgICAgICAgIHN3aXRjaCAocmVhZF91OChkYXRhLCAxKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAobGVuID09IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEyOworCisgICAgICAgICAgICBleHRfa2V5X2V2ZW50KHZzLCByZWFkX3UxNihkYXRhLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91MzIoZGF0YSwgNCksIHJlYWRfdTMyKGRhdGEsIDgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBpZiAobGVuID09IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocmVhZF91MTYgKGRhdGEsIDIpKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgYXVkaW9fYWRkKHZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBhdWRpb19kZWwodnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwOworICAgICAgICAgICAgICAgIHN3aXRjaCAocmVhZF91OChkYXRhLCA0KSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogdnMtPmFzLmZtdCA9IEFVRF9GTVRfVTg7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMTogdnMtPmFzLmZtdCA9IEFVRF9GTVRfUzg7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjogdnMtPmFzLmZtdCA9IEFVRF9GTVRfVTE2OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHZzLT5hcy5mbXQgPSBBVURfRk1UX1MxNjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0OiB2cy0+YXMuZm10ID0gQVVEX0ZNVF9VMzI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogdnMtPmFzLmZtdCA9IEFVRF9GTVRfUzMyOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgYXVkaW8gZm9ybWF0ICVkXG4iLCByZWFkX3U4KGRhdGEsIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2cy0+YXMubmNoYW5uZWxzID0gcmVhZF91OChkYXRhLCA1KTsKKyAgICAgICAgICAgICAgICBpZiAodnMtPmFzLm5jaGFubmVscyAhPSAxICYmIHZzLT5hcy5uY2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgYXVkaW8gY2hhbm5lbCBjb291bnQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3U4KGRhdGEsIDUpKTsKKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2cy0+YXMuZnJlcSA9IHJlYWRfdTMyKGRhdGEsIDYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYgKCJJbnZhbGlkIGF1ZGlvIG1lc3NhZ2UgJWRcbiIsIHJlYWRfdTgoZGF0YSwgNCkpOworICAgICAgICAgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiTXNnOiAlZFxuIiwgcmVhZF91MTYoZGF0YSwgMCkpOworICAgICAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBwcmludGYoIk1zZzogJWRcbiIsIGRhdGFbMF0pOworICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdm5jX3JlYWRfd2hlbih2cywgcHJvdG9jb2xfY2xpZW50X21zZywgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvdG9jb2xfY2xpZW50X2luaXQoVm5jU3RhdGUgKnZzLCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIGludCBzaXplOworCisgICAgdm5jX3dyaXRlX3UxNih2cywgZHNfZ2V0X3dpZHRoKHZzLT5kcykpOworICAgIHZuY193cml0ZV91MTYodnMsIGRzX2dldF9oZWlnaHQodnMtPmRzKSk7CisKKyAgICBwaXhlbF9mb3JtYXRfbWVzc2FnZSh2cyk7CisKKyAgICBpZiAocWVtdV9uYW1lKQorICAgICAgICBzaXplID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlFFTVUgKCVzKSIsIHFlbXVfbmFtZSk7CisgICAgZWxzZQorICAgICAgICBzaXplID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlFFTVUiKTsKKworICAgIHZuY193cml0ZV91MzIodnMsIHNpemUpOworICAgIHZuY193cml0ZSh2cywgYnVmLCBzaXplKTsKKyAgICB2bmNfZmx1c2godnMpOworCisgICAgdm5jX3JlYWRfd2hlbih2cywgcHJvdG9jb2xfY2xpZW50X21zZywgMSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzdGFydF9jbGllbnRfaW5pdChWbmNTdGF0ZSAqdnMpCit7CisgICAgdm5jX3JlYWRfd2hlbih2cywgcHJvdG9jb2xfY2xpZW50X2luaXQsIDEpOworfQorCitzdGF0aWMgdm9pZCBtYWtlX2NoYWxsZW5nZShWbmNTdGF0ZSAqdnMpCit7CisgICAgaW50IGk7CisKKyAgICBzcmFuZCh0aW1lKE5VTEwpK2dldHBpZCgpK2dldHBpZCgpKjk4NzY1NCtyYW5kKCkpOworCisgICAgZm9yIChpID0gMCA7IGkgPCAoaW50KXNpemVvZih2cy0+Y2hhbGxlbmdlKSA7IGkrKykKKyAgICAgICAgdnMtPmNoYWxsZW5nZVtpXSA9IChpbnQpICgyNTYuMCpyYW5kKCkvKFJBTkRfTUFYKzEuMCkpOworfQorCitzdGF0aWMgaW50IHByb3RvY29sX2NsaWVudF9hdXRoX3ZuYyhWbmNTdGF0ZSAqdnMsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgdW5zaWduZWQgY2hhciByZXNwb25zZVtWTkNfQVVUSF9DSEFMTEVOR0VfU0laRV07CisgICAgaW50IGksIGosIHB3bGVuOworICAgIHVuc2lnbmVkIGNoYXIga2V5WzhdOworCisgICAgaWYgKCF2cy0+dmQtPnBhc3N3b3JkIHx8ICF2cy0+dmQtPnBhc3N3b3JkWzBdKSB7CisgICAgICAgIFZOQ19ERUJVRygiTm8gcGFzc3dvcmQgY29uZmlndXJlZCBvbiBzZXJ2ZXIiKTsKKyAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgMSk7IC8qIFJlamVjdCBhdXRoICovCisgICAgICAgIGlmICh2cy0+bWlub3IgPj0gOCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXJyW10gPSAiQXV0aGVudGljYXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIHNpemVvZihlcnIpKTsKKyAgICAgICAgICAgIHZuY193cml0ZSh2cywgZXJyLCBzaXplb2YoZXJyKSk7CisgICAgICAgIH0KKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG1lbWNweShyZXNwb25zZSwgdnMtPmNoYWxsZW5nZSwgVk5DX0FVVEhfQ0hBTExFTkdFX1NJWkUpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBleHBlY3RlZCBjaGFsbGVuZ2UgcmVzcG9uc2UgKi8KKyAgICBwd2xlbiA9IHN0cmxlbih2cy0+dmQtPnBhc3N3b3JkKTsKKyAgICBmb3IgKGk9MDsgaSA8IChpbnQpc2l6ZW9mKGtleSk7IGkrKykKKyAgICAgICAga2V5W2ldID0gaTxwd2xlbiA/IHZzLT52ZC0+cGFzc3dvcmRbaV0gOiAwOworICAgIGRlc2tleShrZXksIEVOMCk7CisgICAgZm9yIChqID0gMDsgaiA8IFZOQ19BVVRIX0NIQUxMRU5HRV9TSVpFOyBqICs9IDgpCisgICAgICAgIGRlcyhyZXNwb25zZStqLCByZXNwb25zZStqKTsKKworICAgIC8qIENvbXBhcmUgZXhwZWN0ZWQgdnMgYWN0dWFsIGNoYWxsZW5nZSByZXNwb25zZSAqLworICAgIGlmIChtZW1jbXAocmVzcG9uc2UsIGRhdGEsIFZOQ19BVVRIX0NIQUxMRU5HRV9TSVpFKSAhPSAwKSB7CisgICAgICAgIFZOQ19ERUJVRygiQ2xpZW50IGNoYWxsZW5nZSByZXBvbnNlIGRpZCBub3QgbWF0Y2hcbiIpOworICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCAxKTsgLyogUmVqZWN0IGF1dGggKi8KKyAgICAgICAgaWYgKHZzLT5taW5vciA+PSA4KSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBlcnJbXSA9ICJBdXRoZW50aWNhdGlvbiBmYWlsZWQiOworICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgc2l6ZW9mKGVycikpOworICAgICAgICAgICAgdm5jX3dyaXRlKHZzLCBlcnIsIHNpemVvZihlcnIpKTsKKyAgICAgICAgfQorICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBWTkNfREVCVUcoIkFjY2VwdGluZyBWTkMgY2hhbGxlbmdlIHJlc3BvbnNlXG4iKTsKKyAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgMCk7IC8qIEFjY2VwdCBhdXRoICovCisgICAgICAgIHZuY19mbHVzaCh2cyk7CisKKyAgICAgICAgc3RhcnRfY2xpZW50X2luaXQodnMpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzdGFydF9hdXRoX3ZuYyhWbmNTdGF0ZSAqdnMpCit7CisgICAgbWFrZV9jaGFsbGVuZ2UodnMpOworICAgIC8qIFNlbmQgY2xpZW50IGEgJ3JhbmRvbScgY2hhbGxlbmdlICovCisgICAgdm5jX3dyaXRlKHZzLCB2cy0+Y2hhbGxlbmdlLCBzaXplb2YodnMtPmNoYWxsZW5nZSkpOworICAgIHZuY19mbHVzaCh2cyk7CisKKyAgICB2bmNfcmVhZF93aGVuKHZzLCBwcm90b2NvbF9jbGllbnRfYXV0aF92bmMsIHNpemVvZih2cy0+Y2hhbGxlbmdlKSk7Cit9CisKKworc3RhdGljIGludCBwcm90b2NvbF9jbGllbnRfYXV0aChWbmNTdGF0ZSAqdnMsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgLyogV2Ugb25seSBhZHZlcnRpc2UgMSBhdXRoIHNjaGVtZSBhdCBhIHRpbWUsIHNvIGNsaWVudAorICAgICAqIG11c3QgcGljayB0aGUgb25lIHdlIHNlbnQuIFZlcmlmeSB0aGlzICovCisgICAgaWYgKGRhdGFbMF0gIT0gdnMtPnZkLT5hdXRoKSB7IC8qIFJlamVjdCBhdXRoICovCisgICAgICAgVk5DX0RFQlVHKCJSZWplY3QgYXV0aCAlZCBiZWNhdXNlIGl0IGRpZG4ndCBtYXRjaCBhZHZlcnRpemVkXG4iLCAoaW50KWRhdGFbMF0pOworICAgICAgIHZuY193cml0ZV91MzIodnMsIDEpOworICAgICAgIGlmICh2cy0+bWlub3IgPj0gOCkgeworICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBlcnJbXSA9ICJBdXRoZW50aWNhdGlvbiBmYWlsZWQiOworICAgICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCBzaXplb2YoZXJyKSk7CisgICAgICAgICAgIHZuY193cml0ZSh2cywgZXJyLCBzaXplb2YoZXJyKSk7CisgICAgICAgfQorICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgIH0gZWxzZSB7IC8qIEFjY2VwdCByZXF1ZXN0ZWQgYXV0aCAqLworICAgICAgIFZOQ19ERUJVRygiQ2xpZW50IHJlcXVlc3RlZCBhdXRoICVkXG4iLCAoaW50KWRhdGFbMF0pOworICAgICAgIHN3aXRjaCAodnMtPnZkLT5hdXRoKSB7CisgICAgICAgY2FzZSBWTkNfQVVUSF9OT05FOgorICAgICAgICAgICBWTkNfREVCVUcoIkFjY2VwdCBhdXRoIG5vbmVcbiIpOworICAgICAgICAgICBpZiAodnMtPm1pbm9yID49IDgpIHsKKyAgICAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIDApOyAvKiBBY2NlcHQgYXV0aCBjb21wbGV0aW9uICovCisgICAgICAgICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICAgICB9CisgICAgICAgICAgIHN0YXJ0X2NsaWVudF9pbml0KHZzKTsKKyAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIFZOQ19BVVRIX1ZOQzoKKyAgICAgICAgICAgVk5DX0RFQlVHKCJTdGFydCBWTkMgYXV0aFxuIik7CisgICAgICAgICAgIHN0YXJ0X2F1dGhfdm5jKHZzKTsKKyAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgICAgIGNhc2UgVk5DX0FVVEhfVkVOQ1JZUFQ6CisgICAgICAgICAgIFZOQ19ERUJVRygiQWNjZXB0IFZlTkNyeXB0IGF1dGhcbiIpOzsKKyAgICAgICAgICAgc3RhcnRfYXV0aF92ZW5jcnlwdCh2cyk7CisgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICAgICBjYXNlIFZOQ19BVVRIX1NBU0w6CisgICAgICAgICAgIFZOQ19ERUJVRygiQWNjZXB0IFNBU0wgYXV0aFxuIik7CisgICAgICAgICAgIHN0YXJ0X2F1dGhfc2FzbCh2cyk7CisgICAgICAgICAgIGJyZWFrOworI2VuZGlmIC8qIENPTkZJR19WTkNfU0FTTCAqLworCisgICAgICAgZGVmYXVsdDogLyogU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSwgYnV0IGp1c3QgaW4gY2FzZSAqLworICAgICAgICAgICBWTkNfREVCVUcoIlJlamVjdCBhdXRoICVkIHNlcnZlciBjb2RlIGJ1Z1xuIiwgdnMtPnZkLT5hdXRoKTsKKyAgICAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAxKTsKKyAgICAgICAgICAgaWYgKHZzLT5taW5vciA+PSA4KSB7CisgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBlcnJbXSA9ICJBdXRoZW50aWNhdGlvbiBmYWlsZWQiOworICAgICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgc2l6ZW9mKGVycikpOworICAgICAgICAgICAgICAgdm5jX3dyaXRlKHZzLCBlcnIsIHNpemVvZihlcnIpKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb3RvY29sX3ZlcnNpb24oVm5jU3RhdGUgKnZzLCB1aW50OF90ICp2ZXJzaW9uLCBzaXplX3QgbGVuKQoreworICAgIGNoYXIgbG9jYWxbMTNdOworCisgICAgbWVtY3B5KGxvY2FsLCB2ZXJzaW9uLCAxMik7CisgICAgbG9jYWxbMTJdID0gMDsKKworICAgIGlmIChzc2NhbmYobG9jYWwsICJSRkIgJTAzZC4lMDNkXG4iLCAmdnMtPm1ham9yLCAmdnMtPm1pbm9yKSAhPSAyKSB7CisgICAgICAgIFZOQ19ERUJVRygiTWFsZm9ybWVkIHByb3RvY29sIHZlcnNpb24gJXNcbiIsIGxvY2FsKTsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBWTkNfREVCVUcoIkNsaWVudCByZXF1ZXN0IHByb3RvY29sIHZlcnNpb24gJWQuJWRcbiIsIHZzLT5tYWpvciwgdnMtPm1pbm9yKTsKKyAgICBpZiAodnMtPm1ham9yICE9IDMgfHwKKyAgICAgICAgKHZzLT5taW5vciAhPSAzICYmCisgICAgICAgICB2cy0+bWlub3IgIT0gNCAmJgorICAgICAgICAgdnMtPm1pbm9yICE9IDUgJiYKKyAgICAgICAgIHZzLT5taW5vciAhPSA3ICYmCisgICAgICAgICB2cy0+bWlub3IgIT0gOCkpIHsKKyAgICAgICAgVk5DX0RFQlVHKCJVbnN1cHBvcnRlZCBjbGllbnQgdmVyc2lvblxuIik7CisgICAgICAgIHZuY193cml0ZV91MzIodnMsIFZOQ19BVVRIX0lOVkFMSUQpOworICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8qIFNvbWUgYnJva2VuIGNsaWVudHMgcmVwb3J0IHYzLjQgb3IgdjMuNSwgd2hpY2ggc3BlYyByZXF1aXJlcyB0byBiZSB0cmVhdGVkCisgICAgICogYXMgZXF1aXZhbGVudCB0byB2My4zIGJ5IHNlcnZlcnMKKyAgICAgKi8KKyAgICBpZiAodnMtPm1pbm9yID09IDQgfHwgdnMtPm1pbm9yID09IDUpCisgICAgICAgIHZzLT5taW5vciA9IDM7CisKKyAgICBpZiAodnMtPm1pbm9yID09IDMpIHsKKyAgICAgICAgaWYgKHZzLT52ZC0+YXV0aCA9PSBWTkNfQVVUSF9OT05FKSB7CisgICAgICAgICAgICBWTkNfREVCVUcoIlRlbGwgY2xpZW50IGF1dGggbm9uZVxuIik7CisgICAgICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCB2cy0+dmQtPmF1dGgpOworICAgICAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgICAgIHN0YXJ0X2NsaWVudF9pbml0KHZzKTsKKyAgICAgICB9IGVsc2UgaWYgKHZzLT52ZC0+YXV0aCA9PSBWTkNfQVVUSF9WTkMpIHsKKyAgICAgICAgICAgIFZOQ19ERUJVRygiVGVsbCBjbGllbnQgVk5DIGF1dGhcbiIpOworICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgdnMtPnZkLT5hdXRoKTsKKyAgICAgICAgICAgIHZuY19mbHVzaCh2cyk7CisgICAgICAgICAgICBzdGFydF9hdXRoX3ZuYyh2cyk7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFZOQ19ERUJVRygiVW5zdXBwb3J0ZWQgYXV0aCAlZCBmb3IgcHJvdG9jb2wgMy4zXG4iLCB2cy0+dmQtPmF1dGgpOworICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgVk5DX0FVVEhfSU5WQUxJRCk7CisgICAgICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFZOQ19ERUJVRygiVGVsbGluZyBjbGllbnQgd2Ugc3VwcG9ydCBhdXRoICVkXG4iLCB2cy0+dmQtPmF1dGgpOworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDEpOyAvKiBudW0gYXV0aCAqLworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT52ZC0+YXV0aCk7CisgICAgICAgIHZuY19yZWFkX3doZW4odnMsIHByb3RvY29sX2NsaWVudF9hdXRoLCAxKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm5jX2Nvbm5lY3QoVm5jRGlzcGxheSAqdmQsIGludCBjc29jaykKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBnX21hbGxvYzAoc2l6ZW9mKFZuY1N0YXRlKSk7CisgICAgdnMtPmNzb2NrID0gY3NvY2s7CisKKyAgICBWTkNfREVCVUcoIk5ldyBjbGllbnQgb24gc29ja2V0ICVkXG4iLCBjc29jayk7CisgICAgZGNsLT5pZGxlID0gMDsKKyAgICBzb2NrZXRfc2V0X25vbmJsb2NrKHZzLT5jc29jayk7CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmNzb2NrLCBOVUxMLCB2bmNfY2xpZW50X3JlYWQsIE5VTEwsIHZzKTsKKworICAgIHZzLT52ZCA9IHZkOworICAgIHZzLT5kcyA9IHZkLT5kczsKKyAgICB2cy0+dGltZXIgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19SRUFMVElNRSwgU0NBTEVfTVMsIHZuY191cGRhdGVfY2xpZW50LCB2cyk7CisgICAgdnMtPmxhc3RfeCA9IC0xOworICAgIHZzLT5sYXN0X3kgPSAtMTsKKworICAgIHZzLT5hcy5mcmVxID0gNDQxMDA7CisgICAgdnMtPmFzLm5jaGFubmVscyA9IDI7CisgICAgdnMtPmFzLmZtdCA9IEFVRF9GTVRfUzE2OworICAgIHZzLT5hcy5lbmRpYW5uZXNzID0gMDsKKworICAgIHZuY19yZXNpemUodnMpOworICAgIHZuY193cml0ZSh2cywgIlJGQiAwMDMuMDA4XG4iLCAxMik7CisgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICB2bmNfcmVhZF93aGVuKHZzLCBwcm90b2NvbF92ZXJzaW9uLCAxMik7CisgICAgcmVzZXRfa2V5cyh2cyk7CisKKyAgICB2cy0+bmV4dCA9IHZkLT5jbGllbnRzOworICAgIHZkLT5jbGllbnRzID0gdnM7CisKKyAgICB2bmNfdXBkYXRlX2NsaWVudCh2cyk7CisgICAgLyogdnMgbWlnaHQgYmUgZnJlZSgpZWQgaGVyZSAqLworfQorCitzdGF0aWMgdm9pZCB2bmNfbGlzdGVuX3JlYWQodm9pZCAqb3BhcXVlKQoreworICAgIFZuY0Rpc3BsYXkgKnZzID0gb3BhcXVlOworCisgICAgLyogQ2F0Y2gtdXAgKi8KKyAgICB2Z2FfaHdfdXBkYXRlKCk7CisKKyAgICBpbnQgY3NvY2sgPSBzb2NrZXRfYWNjZXB0KHZzLT5sc29jaywgTlVMTCk7CisgICAgaWYgKGNzb2NrICE9IC0xKSB7CisgICAgICAgIHZuY19jb25uZWN0KHZzLCBjc29jayk7CisgICAgfQorfQorCit2b2lkIHZuY19kaXNwbGF5X2luaXQoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGdfbWFsbG9jMChzaXplb2YoKnZzKSk7CisKKyAgICBkY2wgPSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlDaGFuZ2VMaXN0ZW5lcikpOworCisgICAgZHMtPm9wYXF1ZSA9IHZzOworICAgIGRjbC0+aWRsZSA9IDE7CisgICAgdm5jX2Rpc3BsYXkgPSB2czsKKworICAgIHZzLT5sc29jayA9IC0xOworCisgICAgdnMtPmRzID0gZHM7CisKKyAgICBpZiAoa2V5Ym9hcmRfbGF5b3V0KQorICAgICAgICB2cy0+a2JkX2xheW91dCA9IGluaXRfa2V5Ym9hcmRfbGF5b3V0KG5hbWUya2V5c3ltLCBrZXlib2FyZF9sYXlvdXQpOworICAgIGVsc2UKKyAgICAgICAgdnMtPmtiZF9sYXlvdXQgPSBpbml0X2tleWJvYXJkX2xheW91dChuYW1lMmtleXN5bSwgImVuLXVzIik7CisKKyAgICBpZiAoIXZzLT5rYmRfbGF5b3V0KQorICAgICAgICBleGl0KDEpOworCisgICAgZGNsLT5kcHlfY29weSA9IHZuY19kcHlfY29weTsKKyAgICBkY2wtPmRweV91cGRhdGUgPSB2bmNfZHB5X3VwZGF0ZTsKKyAgICBkY2wtPmRweV9yZXNpemUgPSB2bmNfZHB5X3Jlc2l6ZTsKKyAgICBkY2wtPmRweV9zZXRkYXRhID0gdm5jX2RweV9zZXRkYXRhOworICAgIHJlZ2lzdGVyX2Rpc3BsYXljaGFuZ2VsaXN0ZW5lcihkcywgZGNsKTsKK30KKworCit2b2lkIHZuY19kaXNwbGF5X2Nsb3NlKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgVm5jRGlzcGxheSAqdnMgPSBkcyA/IChWbmNEaXNwbGF5ICopZHMtPm9wYXF1ZSA6IHZuY19kaXNwbGF5OworCisgICAgaWYgKCF2cykKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh2cy0+ZGlzcGxheSkgeworICAgICAgICBnX2ZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgfQorICAgIGlmICh2cy0+bHNvY2sgIT0gLTEpIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmxzb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgY2xvc2UodnMtPmxzb2NrKTsKKyAgICAgICAgdnMtPmxzb2NrID0gLTE7CisgICAgfQorICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICB2cy0+dGxzLng1MDl2ZXJpZnkgPSAwOworI2VuZGlmCit9CisKK2ludCB2bmNfZGlzcGxheV9wYXNzd29yZChEaXNwbGF5U3RhdGUgKmRzLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGRzID8gKFZuY0Rpc3BsYXkgKilkcy0+b3BhcXVlIDogdm5jX2Rpc3BsYXk7CisKKyAgICBpZiAodnMtPnBhc3N3b3JkKSB7CisgICAgICAgIGdfZnJlZSh2cy0+cGFzc3dvcmQpOworICAgICAgICB2cy0+cGFzc3dvcmQgPSBOVUxMOworICAgIH0KKyAgICBpZiAocGFzc3dvcmQgJiYgcGFzc3dvcmRbMF0pIHsKKyAgICAgICAgaWYgKCEodnMtPnBhc3N3b3JkID0gZ19zdHJkdXAocGFzc3dvcmQpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY2hhciAqdm5jX2Rpc3BsYXlfbG9jYWxfYWRkcihEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIFZuY0Rpc3BsYXkgKnZzID0gZHMgPyAoVm5jRGlzcGxheSAqKWRzLT5vcGFxdWUgOiB2bmNfZGlzcGxheTsKKworICAgIHJldHVybiB2bmNfc29ja2V0X2xvY2FsX2FkZHIoIiVzOiVzIiwgdnMtPmxzb2NrKTsKK30KKworaW50IHZuY19kaXNwbGF5X29wZW4oRGlzcGxheVN0YXRlICpkcywgY29uc3QgY2hhciAqZGlzcGxheSkKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGRzID8gKFZuY0Rpc3BsYXkgKilkcy0+b3BhcXVlIDogdm5jX2Rpc3BsYXk7CisgICAgY29uc3QgY2hhciAqb3B0aW9uczsKKyAgICBpbnQgcGFzc3dvcmQgPSAwOworICAgIGludCByZXZlcnNlID0gMDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIGludCB0bHMgPSAwLCB4NTA5ID0gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WTkNfU0FTTAorICAgIGludCBzYXNsID0gMDsKKyAgICBpbnQgc2FzbEVycjsKKyAgICBpbnQgYWNsID0gMDsKKyNlbmRpZgorCisgICAgaWYgKCF2bmNfZGlzcGxheSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHZuY19kaXNwbGF5X2Nsb3NlKGRzKTsKKyAgICBpZiAoc3RyY21wKGRpc3BsYXksICJub25lIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoISh2cy0+ZGlzcGxheSA9IHN0cmR1cChkaXNwbGF5KSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIG9wdGlvbnMgPSBkaXNwbGF5OworICAgIHdoaWxlICgob3B0aW9ucyA9IHN0cmNocihvcHRpb25zLCAnLCcpKSkgeworICAgICAgICBvcHRpb25zKys7CisgICAgICAgIGlmIChzdHJuY21wKG9wdGlvbnMsICJwYXNzd29yZCIsIDgpID09IDApIHsKKyAgICAgICAgICAgIHBhc3N3b3JkID0gMTsgLyogUmVxdWlyZSBwYXNzd29yZCBhdXRoICovCisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvcHRpb25zLCAicmV2ZXJzZSIsIDcpID09IDApIHsKKyAgICAgICAgICAgIHJldmVyc2UgPSAxOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9ucywgInRvPSIsIDMpID09IDApIHsKKyAgICAgICAgICAgIC8vdG9fcG9ydCA9IGF0b2kob3B0aW9ucyszKSArIDU5MDA7CisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvcHRpb25zLCAic2FzbCIsIDQpID09IDApIHsKKyAgICAgICAgICAgIHNhc2wgPSAxOyAvKiBSZXF1aXJlIFNBU0wgYXV0aCAqLworI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbnMsICJ0bHMiLCAzKSA9PSAwKSB7CisgICAgICAgICAgICB0bHMgPSAxOyAvKiBSZXF1aXJlIFRMUyAqLworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9ucywgIng1MDkiLCA0KSA9PSAwKSB7CisgICAgICAgICAgICBjaGFyICpzdGFydCwgKmVuZDsKKyAgICAgICAgICAgIHg1MDkgPSAxOyAvKiBSZXF1aXJlIHg1MDkgY2VydGlmaWNhdGVzICovCisgICAgICAgICAgICBpZiAoc3RybmNtcChvcHRpb25zLCAieDUwOXZlcmlmeSIsIDEwKSA9PSAwKQorICAgICAgICAgICAgICAgIHZzLT50bHMueDUwOXZlcmlmeSA9IDE7IC8qIC4uLmFuZCB2ZXJpZnkgY2xpZW50IGNlcnRzICovCisKKyAgICAgICAgICAgIC8qIE5vdyBjaGVjayBmb3IgJ3g1MDk9L3NvbWUvcGF0aCcgcG9zdGZpeAorICAgICAgICAgICAgICogYW5kIHVzZSB0aGF0IHRvIHNldHVwIHg1MDkgY2VydGlmaWNhdGUva2V5IHBhdGhzICovCisgICAgICAgICAgICBzdGFydCA9IHN0cmNocihvcHRpb25zLCAnPScpOworICAgICAgICAgICAgZW5kID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisgICAgICAgICAgICBpZiAoc3RhcnQgJiYgKCFlbmQgfHwgKHN0YXJ0IDwgZW5kKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gZW5kID8gZW5kLShzdGFydCsxKSA6IHN0cmxlbihzdGFydCsxKTsKKyAgICAgICAgICAgICAgICBjaGFyICpwYXRoID0gZ19zdHJuZHVwKHN0YXJ0ICsgMSwgbGVuKTsKKworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiVHJ5aW5nIGNlcnRpZmljYXRlIHBhdGggJyVzJ1xuIiwgcGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHZuY190bHNfc2V0X3g1MDlfY3JlZHNfZGlyKHZzLCBwYXRoKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZmluZCB4NTA5IGNlcnRpZmljYXRlcy9rZXlzIGluICVzXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZ19mcmVlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICBnX2ZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICAgICAgICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ19mcmVlKHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGNlcnRpZmljYXRlIHBhdGggcHJvdmlkZWRcbiIpOworICAgICAgICAgICAgICAgIGdfZnJlZSh2cy0+ZGlzcGxheSk7CisgICAgICAgICAgICAgICAgdnMtPmRpc3BsYXkgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9ucywgImFjbCIsIDMpID09IDApIHsKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICAgICAgICAgIGFjbCA9IDE7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgaWYgKGFjbCAmJiB4NTA5ICYmIHZzLT50bHMueDUwOXZlcmlmeSkgeworICAgICAgICBpZiAoISh2cy0+dGxzLmFjbCA9IHFlbXVfYWNsX2luaXQoInZuYy54NTA5ZG5hbWUiKSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSB4NTA5IGRuYW1lIEFDTFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgaWYgKGFjbCAmJiBzYXNsKSB7CisgICAgICAgIGlmICghKHZzLT5zYXNsLmFjbCA9IHFlbXVfYWNsX2luaXQoInZuYy51c2VybmFtZSIpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIHVzZXJuYW1lIEFDTFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIENvbWJpbmF0aW9ucyB3ZSBzdXBwb3J0IGhlcmU6CisgICAgICoKKyAgICAgKiAgLSBuby1hdXRoICAgICAgICAgICAgICAgIChjbGVhciB0ZXh0LCBubyBhdXRoKQorICAgICAqICAtIHBhc3N3b3JkICAgICAgICAgICAgICAgKGNsZWFyIHRleHQsIHdlYWsgYXV0aCkKKyAgICAgKiAgLSBzYXNsICAgICAgICAgICAgICAgICAgIChlbmNyeXB0LCBnb29kIGF1dGggKklGKiB1c2luZyBLZXJiZXJvcyB2aWEgR1NTQVBJKQorICAgICAqICAtIHRscyAgICAgICAgICAgICAgICAgICAgKGVuY3J5cHQsIHdlYWsgYW5vbnltb3VzIGNyZWRzLCBubyBhdXRoKQorICAgICAqICAtIHRscyArIHBhc3N3b3JkICAgICAgICAgKGVuY3J5cHQsIHdlYWsgYW5vbnltb3VzIGNyZWRzLCB3ZWFrIGF1dGgpCisgICAgICogIC0gdGxzICsgc2FzbCAgICAgICAgICAgICAoZW5jcnlwdCwgd2VhayBhbm9ueW1vdXMgY3JlZHMsIGdvb2QgYXV0aCkKKyAgICAgKiAgLSB0bHMgKyB4NTA5ICAgICAgICAgICAgIChlbmNyeXB0LCBnb29kIHg1MDkgY3JlZHMsIG5vIGF1dGgpCisgICAgICogIC0gdGxzICsgeDUwOSArIHBhc3N3b3JkICAoZW5jcnlwdCwgZ29vZCB4NTA5IGNyZWRzLCB3ZWFrIGF1dGgpCisgICAgICogIC0gdGxzICsgeDUwOSArIHNhc2wgICAgICAoZW5jcnlwdCwgZ29vZCB4NTA5IGNyZWRzLCBnb29kIGF1dGgpCisgICAgICoKKyAgICAgKiBOQjEuIFRMUyBpcyBhIHN0YWNrYWJsZSBhdXRoIHNjaGVtZS4KKyAgICAgKiBOQjIuIHRoZSB4NTA5IHNjaGVtZXMgaGF2ZSBvcHRpb24gdG8gdmFsaWRhdGUgYSBjbGllbnQgY2VydCBkbmFtZQorICAgICAqLworICAgIGlmIChwYXNzd29yZCkgeworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgICAgIGlmICh0bHMpIHsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFQ7CisgICAgICAgICAgICBpZiAoeDUwOSkgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCB4NTA5IHBhc3N3b3JkIGF1dGhcbiIpOworICAgICAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOVZOQzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIFRMUyBwYXNzd29yZCBhdXRoXG4iKTsKKyAgICAgICAgICAgICAgICB2cy0+c3ViYXV0aCA9IFZOQ19BVVRIX1ZFTkNSWVBUX1RMU1ZOQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1RMUyAqLworICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIHBhc3N3b3JkIGF1dGhcbiIpOworICAgICAgICAgICAgdnMtPmF1dGggPSBWTkNfQVVUSF9WTkM7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgfSBlbHNlIGlmIChzYXNsKSB7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgaWYgKHRscykgeworICAgICAgICAgICAgdnMtPmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVDsKKyAgICAgICAgICAgIGlmICh4NTA5KSB7CisgICAgICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIHg1MDkgU0FTTCBhdXRoXG4iKTsKKyAgICAgICAgICAgICAgICB2cy0+c3ViYXV0aCA9IFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlTQVNMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggVExTIFNBU0wgYXV0aFxuIik7CisgICAgICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVF9UTFNTQVNMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggU0FTTCBhdXRoXG4iKTsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfU0FTTDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9JTlZBTElEOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX1ZOQ19UTFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfVk5DX1NBU0wgKi8KKyAgICB9IGVsc2UgeworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgICAgIGlmICh0bHMpIHsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFQ7CisgICAgICAgICAgICBpZiAoeDUwOSkgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCB4NTA5IG5vIGF1dGhcbiIpOworICAgICAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOU5PTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCBUTFMgbm8gYXV0aFxuIik7CisgICAgICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVF9UTFNOT05FOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggbm8gYXV0aFxuIik7CisgICAgICAgICAgICB2cy0+YXV0aCA9IFZOQ19BVVRIX05PTkU7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgaWYgKChzYXNsRXJyID0gc2FzbF9zZXJ2ZXJfaW5pdChOVUxMLCAicWVtdSIpKSAhPSBTQVNMX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgU0FTTCBhdXRoICVzIiwKKyAgICAgICAgICAgICAgICBzYXNsX2VycnN0cmluZyhzYXNsRXJyLCBOVUxMLCBOVUxMKSk7CisgICAgICAgIGZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgIC8qIGNvbm5lY3QgdG8gdmlld2VyICovCisgICAgICAgIGlmIChzdHJuY21wKGRpc3BsYXksICJ1bml4OiIsIDUpID09IDApCisgICAgICAgICAgICB2cy0+bHNvY2sgPSB1bml4X2Nvbm5lY3QoZGlzcGxheSs1KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnMtPmxzb2NrID0gaW5ldF9jb25uZWN0KGRpc3BsYXksIFNPQ0tFVF9TVFJFQU0pOworICAgICAgICBpZiAoLTEgPT0gdnMtPmxzb2NrKSB7CisgICAgICAgICAgICBmcmVlKHZzLT5kaXNwbGF5KTsKKyAgICAgICAgICAgIHZzLT5kaXNwbGF5ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBjc29jayA9IHZzLT5sc29jazsKKyAgICAgICAgICAgIHZzLT5sc29jayA9IC0xOworICAgICAgICAgICAgdm5jX2Nvbm5lY3QodnMsIGNzb2NrKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxpc3RlbiBmb3IgY29ubmVjdHMgKi8KKyAgICAgICAgY2hhciAqZHB5OworICAgICAgICBkcHkgPSBnX21hbGxvYygyNTYpOworICAgICAgICBpZiAoc3RybmNtcChkaXNwbGF5LCAidW5peDoiLCA1KSA9PSAwKSB7CisgICAgICAgICAgICBwc3RyY3B5KGRweSwgMjU2LCAidW5peDoiKTsKKyAgICAgICAgICAgIHZzLT5sc29jayA9IHVuaXhfbGlzdGVuKGRpc3BsYXkrNSwgZHB5KzUsIDI1Ni01KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZzLT5sc29jayA9IGluZXRfbGlzdGVuKGRpc3BsYXksIGRweSwgMjU2LCBTT0NLRVRfU1RSRUFNLCA1OTAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoLTEgPT0gdnMtPmxzb2NrKSB7CisgICAgICAgICAgICBmcmVlKGRweSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmVlKHZzLT5kaXNwbGF5KTsKKyAgICAgICAgICAgIHZzLT5kaXNwbGF5ID0gZHB5OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBxZW11X3NldF9mZF9oYW5kbGVyMih2cy0+bHNvY2ssIE5VTEwsIHZuY19saXN0ZW5fcmVhZCwgTlVMTCwgdnMpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91aS92bmMtdGxzLmggYi9hbmRyb2lkL3FlbXUxL3VpL3ZuYy10bHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEyMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS92bmMtdGxzLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIFFFTVUgVk5DIGRpc3BsYXkgZHJpdmVyLiBUTFMgaGVscGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbnRob255IExpZ3VvcmkgPGFudGhvbnlAY29kZW1vbmtleS53cz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworCisjaWZuZGVmIF9fUUVNVV9WTkNfVExTX0hfXworI2RlZmluZSBfX1FFTVVfVk5DX1RMU19IX18KKworI2luY2x1ZGUgPGdudXRscy9nbnV0bHMuaD4KKyNpbmNsdWRlIDxnbnV0bHMveDUwOS5oPgorCisjaW5jbHVkZSAicWVtdS9hY2wuaCIKKworZW51bSB7CisgICAgVk5DX1dJUkVNT0RFX0NMRUFSLAorICAgIFZOQ19XSVJFTU9ERV9UTFMsCit9OworCit0eXBlZGVmIHN0cnVjdCBWbmNEaXNwbGF5VExTIFZuY0Rpc3BsYXlUTFM7Cit0eXBlZGVmIHN0cnVjdCBWbmNTdGF0ZVRMUyBWbmNTdGF0ZVRMUzsKKworLyogU2VydmVyIHN0YXRlICovCitzdHJ1Y3QgVm5jRGlzcGxheVRMUyB7CisgICAgaW50IHg1MDl2ZXJpZnk7IC8qIE5vbi16ZXJvIGlmIHNlcnZlciByZXF1ZXN0cyAmIHZhbGlkYXRlcyBjbGllbnQgY2VydCAqLworICAgIHFlbXVfYWNsICphY2w7CisKKyAgICAvKiBQYXRocyB0byB4NTA5IGNlcnRzL2tleXMgKi8KKyAgICBjaGFyICp4NTA5Y2FjZXJ0OworICAgIGNoYXIgKng1MDljYWNybDsKKyAgICBjaGFyICp4NTA5Y2VydDsKKyAgICBjaGFyICp4NTA5a2V5OworfTsKKworLyogUGVyIGNsaWVudCBzdGF0ZSAqLworc3RydWN0IFZuY1N0YXRlVExTIHsKKyAgICAvKiBXaGV0aGVyIGRhdGEgaXMgYmVpbmcgVExTIGVuY3J5cHRlZCB5ZXQgKi8KKyAgICBpbnQgd2lyZW1vZGU7CisgICAgZ251dGxzX3Nlc3Npb25fdCBzZXNzaW9uOworCisgICAgLyogQ2xpZW50J3MgRGlzdGluZ3Vpc2hlZCBOYW1lIGZyb20gdGhlIHg1MDkgY2VydCAqLworICAgIGNoYXIgKmRuYW1lOworfTsKKworaW50IHZuY190bHNfY2xpZW50X3NldHVwKFZuY1N0YXRlICp2cywgaW50IHg1MDlDcmVkcyk7Cit2b2lkIHZuY190bHNfY2xpZW50X2NsZWFudXAoVm5jU3RhdGUgKnZzKTsKKworaW50IHZuY190bHNfdmFsaWRhdGVfY2VydGlmaWNhdGUoVm5jU3RhdGUgKnZzKTsKKworaW50IHZuY190bHNfc2V0X3g1MDlfY3JlZHNfZGlyKFZuY0Rpc3BsYXkgKnZkLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgpOworCisKKyNlbmRpZiAvKiBfX1FFTVVfVk5DX1RMU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91aS92bmMuYyBiL2FuZHJvaWQvcWVtdTEvdWkvdm5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjMDJlMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvdm5jLmMKQEAgLTAsMCArMSwyMzk4IEBACisvKgorICogUUVNVSBWTkMgZGlzcGxheSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQW50aG9ueSBMaWd1b3JpIDxhbnRob255QGNvZGVtb25rZXkud3M+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVkIEhhdCwgSW5jCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJ2bmMuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAicWVtdS9zb2NrZXRzLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInFlbXUvYWNsLmgiCisKKyNkZWZpbmUgVk5DX1JFRlJFU0hfSU5URVJWQUwgKDEwMDAgLyAzMCkKKworI2luY2x1ZGUgInZuY19rZXlzeW0uaCIKKyNpbmNsdWRlICJkM2Rlcy5oIgorCisjZGVmaW5lIGNvdW50X2JpdHMoYywgdikgeyBcCisgICAgZm9yIChjID0gMDsgdjsgdiA+Pj0gMSkgXAorICAgIHsgXAorICAgICAgICBjICs9IHYgJiAxOyBcCisgICAgfSBcCit9CisKKworc3RhdGljIFZuY0Rpc3BsYXkgKnZuY19kaXNwbGF5OyAvKiBuZWVkZWQgZm9yIGluZm8gdm5jICovCitzdGF0aWMgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2w7CisKK3N0YXRpYyBjaGFyICphZGRyX3RvX3N0cmluZyhjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBzYWxlbikgeworICAgIGNoYXIgKmFkZHI7CisgICAgY2hhciBob3N0W05JX01BWEhPU1RdOworICAgIGNoYXIgc2VydltOSV9NQVhTRVJWXTsKKyAgICBpbnQgZXJyOworICAgIHNpemVfdCBhZGRybGVuOworCisgICAgaWYgKChlcnIgPSBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopc2EsIHNhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgc2l6ZW9mKGhvc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydiwgc2l6ZW9mKHNlcnYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVikpICE9IDApIHsKKyAgICAgICAgVk5DX0RFQlVHKCJDYW5ub3QgcmVzb2x2ZSBhZGRyZXNzICVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgIGVyciwgZ2FpX3N0cmVycm9yKGVycikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBFbm91Z2ggZm9yIHRoZSBleGlzdGluZyBmb3JtYXQgKyB0aGUgMiB2YXJzIHdlJ3JlCisgICAgICogc3Vic3RpdHV0aW5nIGluLiAqLworICAgIGFkZHJsZW4gPSBzdHJsZW4oZm9ybWF0KSArIHN0cmxlbihob3N0KSArIHN0cmxlbihzZXJ2KTsKKyAgICBhZGRyID0gZ19tYWxsb2MoYWRkcmxlbiArIDEpOworICAgIHNucHJpbnRmKGFkZHIsIGFkZHJsZW4sIGZvcm1hdCwgaG9zdCwgc2Vydik7CisgICAgYWRkclthZGRybGVuXSA9ICdcMCc7CisKKyAgICByZXR1cm4gYWRkcjsKK30KKworCitjaGFyICp2bmNfc29ja2V0X2xvY2FsX2FkZHIoY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgZmQpIHsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKyAgICBzb2NrbGVuX3Qgc2FsZW47CisKKyAgICBzYWxlbiA9IHNpemVvZihzYSk7CisgICAgaWYgKGdldHNvY2tuYW1lKGZkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZzYWxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBhZGRyX3RvX3N0cmluZyhmb3JtYXQsICZzYSwgc2FsZW4pOworfQorCitjaGFyICp2bmNfc29ja2V0X3JlbW90ZV9hZGRyKGNvbnN0IGNoYXIgKmZvcm1hdCwgaW50IGZkKSB7CisgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgc29ja2xlbl90IHNhbGVuOworCisgICAgc2FsZW4gPSBzaXplb2Yoc2EpOworICAgIGlmIChnZXRwZWVybmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCAmc2FsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gYWRkcl90b19zdHJpbmcoZm9ybWF0LCAmc2EsIHNhbGVuKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnZuY19hdXRoX25hbWUoVm5jRGlzcGxheSAqdmQpIHsKKyAgICBzd2l0Y2ggKHZkLT5hdXRoKSB7CisgICAgY2FzZSBWTkNfQVVUSF9JTlZBTElEOgorICAgICAgICByZXR1cm4gImludmFsaWQiOworICAgIGNhc2UgVk5DX0FVVEhfTk9ORToKKyAgICAgICAgcmV0dXJuICJub25lIjsKKyAgICBjYXNlIFZOQ19BVVRIX1ZOQzoKKyAgICAgICAgcmV0dXJuICJ2bmMiOworICAgIGNhc2UgVk5DX0FVVEhfUkEyOgorICAgICAgICByZXR1cm4gInJhMiI7CisgICAgY2FzZSBWTkNfQVVUSF9SQTJORToKKyAgICAgICAgcmV0dXJuICJyYTJuZSI7CisgICAgY2FzZSBWTkNfQVVUSF9USUdIVDoKKyAgICAgICAgcmV0dXJuICJ0aWdodCI7CisgICAgY2FzZSBWTkNfQVVUSF9VTFRSQToKKyAgICAgICAgcmV0dXJuICJ1bHRyYSI7CisgICAgY2FzZSBWTkNfQVVUSF9UTFM6CisgICAgICAgIHJldHVybiAidGxzIjsKKyAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUOgorI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgICAgIHN3aXRjaCAodmQtPnN1YmF1dGgpIHsKKyAgICAgICAgY2FzZSBWTkNfQVVUSF9WRU5DUllQVF9QTEFJTjoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQrcGxhaW4iOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1RMU05PTkU6CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3Rscytub25lIjsKKyAgICAgICAgY2FzZSBWTkNfQVVUSF9WRU5DUllQVF9UTFNWTkM6CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3Rscyt2bmMiOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1RMU1BMQUlOOgorICAgICAgICAgICAgcmV0dXJuICJ2ZW5jcnlwdCt0bHMrcGxhaW4iOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlOT05FOgorICAgICAgICAgICAgcmV0dXJuICJ2ZW5jcnlwdCt4NTA5K25vbmUiOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlWTkM6CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3g1MDkrdm5jIjsKKyAgICAgICAgY2FzZSBWTkNfQVVUSF9WRU5DUllQVF9YNTA5UExBSU46CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3g1MDkrcGxhaW4iOworICAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUX1RMU1NBU0w6CisgICAgICAgICAgICByZXR1cm4gInZlbmNyeXB0K3RscytzYXNsIjsKKyAgICAgICAgY2FzZSBWTkNfQVVUSF9WRU5DUllQVF9YNTA5U0FTTDoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQreDUwOStzYXNsIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAidmVuY3J5cHQiOworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXR1cm4gInZlbmNyeXB0IjsKKyNlbmRpZgorICAgIGNhc2UgVk5DX0FVVEhfU0FTTDoKKyAgICAgICAgcmV0dXJuICJzYXNsIjsKKyAgICB9CisgICAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIHZvaWQgZG9faW5mb192bmNfY2xpZW50KE1vbml0b3IgKm1vbiwgVm5jU3RhdGUgKmNsaWVudCkKK3sKKyAgICBjaGFyICpjbGllbnRBZGRyID0KKyAgICAgICAgdm5jX3NvY2tldF9yZW1vdGVfYWRkcigiICAgICBhZGRyZXNzOiAlczolc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmNzb2NrKTsKKyAgICBpZiAoIWNsaWVudEFkZHIpCisgICAgICAgIHJldHVybjsKKworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIkNsaWVudDpcbiIpOworICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiVzIiwgY2xpZW50QWRkcik7CisgICAgZnJlZShjbGllbnRBZGRyKTsKKworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgaWYgKGNsaWVudC0+dGxzLnNlc3Npb24gJiYKKyAgICAgICAgY2xpZW50LT50bHMuZG5hbWUpCisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgeDUwOSBkbmFtZTogJXNcbiIsIGNsaWVudC0+dGxzLmRuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgeDUwOSBkbmFtZTogbm9uZVxuIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICBpZiAoY2xpZW50LT5zYXNsLmNvbm4gJiYKKyAgICAgICAgY2xpZW50LT5zYXNsLnVzZXJuYW1lKQorICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICIgICAgdXNlcm5hbWU6ICVzXG4iLCBjbGllbnQtPnNhc2wudXNlcm5hbWUpOworICAgIGVsc2UKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiICAgIHVzZXJuYW1lOiBub25lXG4iKTsKKyNlbmRpZgorfQorCit2b2lkIGRvX2luZm9fdm5jKE1vbml0b3IgKm1vbikKK3sKKyAgICBpZiAodm5jX2Rpc3BsYXkgPT0gTlVMTCB8fCB2bmNfZGlzcGxheS0+ZGlzcGxheSA9PSBOVUxMKSB7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIlNlcnZlcjogZGlzYWJsZWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgKnNlcnZlckFkZHIgPSB2bmNfc29ja2V0X2xvY2FsX2FkZHIoIiAgICAgYWRkcmVzczogJXM6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5jX2Rpc3BsYXktPmxzb2NrKTsKKworICAgICAgICBpZiAoIXNlcnZlckFkZHIpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbW9uaXRvcl9wcmludGYobW9uLCAiU2VydmVyOlxuIik7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiVzIiwgc2VydmVyQWRkcik7CisgICAgICAgIGZyZWUoc2VydmVyQWRkcik7CisgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIiAgICAgICAgYXV0aDogJXNcbiIsIHZuY19hdXRoX25hbWUodm5jX2Rpc3BsYXkpKTsKKworICAgICAgICBpZiAodm5jX2Rpc3BsYXktPmNsaWVudHMpIHsKKyAgICAgICAgICAgIFZuY1N0YXRlICpjbGllbnQgPSB2bmNfZGlzcGxheS0+Y2xpZW50czsKKyAgICAgICAgICAgIHdoaWxlIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBkb19pbmZvX3ZuY19jbGllbnQobW9uLCBjbGllbnQpOworICAgICAgICAgICAgICAgIGNsaWVudCA9IGNsaWVudC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vbml0b3JfcHJpbnRmKG1vbiwgIkNsaWVudDogbm9uZVxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3Qgdm5jX2hhc19mZWF0dXJlKFZuY1N0YXRlICp2cywgaW50IGZlYXR1cmUpIHsKKyAgICByZXR1cm4gKHZzLT5mZWF0dXJlcyAmICgxIDw8IGZlYXR1cmUpKTsKK30KKworLyogVE9ETworICAgMSkgR2V0IHRoZSBxdWV1ZSB3b3JraW5nIGZvciBJTy4KKyAgIDIpIHRoZXJlIGlzIHNvbWUgd2VpcmRuZXNzIHdoZW4gdXNpbmcgdGhlIC1TIG9wdGlvbiAodGhlIHNjcmVlbiBpcyBncmV5CisgICAgICBhbmQgbm90IHRvdGFsbHkgaW52YWxpZGF0ZWQKKyAgIDMpIHJlc29sdXRpb25zID4gMTAyNAorKi8KKworc3RhdGljIHZvaWQgdm5jX3VwZGF0ZV9jbGllbnQodm9pZCAqb3BhcXVlKTsKK3N0YXRpYyB2b2lkIHZuY19kaXNjb25uZWN0X3N0YXJ0KFZuY1N0YXRlICp2cyk7CitzdGF0aWMgdm9pZCB2bmNfZGlzY29ubmVjdF9maW5pc2goVm5jU3RhdGUgKnZzKTsKKworc3RhdGljIHZvaWQgdm5jX2NvbG9yZGVwdGgoVm5jU3RhdGUgKnZzKTsKKworc3RhdGljIGlubGluZSB2b2lkIHZuY19zZXRfYml0KHVpbnQzMl90ICpkLCBpbnQgaykKK3sKKyAgICBkW2sgPj4gNV0gfD0gMSA8PCAoayAmIDB4MWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdm5jX2NsZWFyX2JpdCh1aW50MzJfdCAqZCwgaW50IGspCit7CisgICAgZFtrID4+IDVdICY9IH4oMSA8PCAoayAmIDB4MWYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZuY19zZXRfYml0cyh1aW50MzJfdCAqZCwgaW50IG4sIGludCBuYl93b3JkcykKK3sKKyAgICBpbnQgajsKKworICAgIGogPSAwOworICAgIHdoaWxlIChuID49IDMyKSB7CisgICAgICAgIGRbaisrXSA9IC0xOworICAgICAgICBuIC09IDMyOworICAgIH0KKyAgICBpZiAobiA+IDApCisgICAgICAgIGRbaisrXSA9ICgxIDw8IG4pIC0gMTsKKyAgICB3aGlsZSAoaiA8IG5iX3dvcmRzKQorICAgICAgICBkW2orK10gPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bmNfZ2V0X2JpdChjb25zdCB1aW50MzJfdCAqZCwgaW50IGspCit7CisgICAgcmV0dXJuIChkW2sgPj4gNV0gPj4gKGsgJiAweDFmKSkgJiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB2bmNfYW5kX2JpdHMoY29uc3QgdWludDMyX3QgKmQxLCBjb25zdCB1aW50MzJfdCAqZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3dvcmRzKQoreworICAgIGludCBpOworICAgIGZvcihpID0gMDsgaSA8IG5iX3dvcmRzOyBpKyspIHsKKyAgICAgICAgaWYgKChkMVtpXSAmIGQyW2ldKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2bmNfdXBkYXRlKFZuY1N0YXRlICp2cywgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgc3RydWN0IFZuY1N1cmZhY2UgKnMgPSAmdnMtPmd1ZXN0OworICAgIGludCBpOworCisgICAgaCArPSB5OworCisgICAgLyogcm91bmQgeCBkb3duIHRvIGVuc3VyZSB0aGUgbG9vcCBvbmx5IHNwYW5zIG9uZSAxNi1waXhlbCBibG9jayBwZXIsCisgICAgICAgaXRlcmF0aW9uLiAgb3RoZXJ3aXNlLCBpZiAoeCAlIDE2KSAhPSAwLCB0aGUgbGFzdCBpdGVyYXRpb24gbWF5IHNwYW4KKyAgICAgICB0d28gMTYtcGl4ZWwgYmxvY2tzIGJ1dCB3ZSBvbmx5IG1hcmsgdGhlIGZpcnN0IGFzIGRpcnR5CisgICAgKi8KKyAgICB3ICs9ICh4ICUgMTYpOworICAgIHggLT0gKHggJSAxNik7CisKKyAgICB4ID0gTUlOKHgsIHMtPmRzLT53aWR0aCk7CisgICAgeSA9IE1JTih5LCBzLT5kcy0+aGVpZ2h0KTsKKyAgICB3ID0gTUlOKHggKyB3LCBzLT5kcy0+d2lkdGgpIC0geDsKKyAgICBoID0gTUlOKGgsIHMtPmRzLT5oZWlnaHQpOworCisgICAgZm9yICg7IHkgPCBoOyB5KyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpICs9IDE2KQorICAgICAgICAgICAgdm5jX3NldF9iaXQocy0+ZGlydHlbeV0sICh4ICsgaSkgLyAxNik7Cit9CisKK3N0YXRpYyB2b2lkIHZuY19kcHlfdXBkYXRlKERpc3BsYXlTdGF0ZSAqZHMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIFZuY0Rpc3BsYXkgKnZkID0gZHMtPm9wYXF1ZTsKKyAgICBWbmNTdGF0ZSAqdnMgPSB2ZC0+Y2xpZW50czsKKyAgICB3aGlsZSAodnMgIT0gTlVMTCkgeworICAgICAgICB2bmNfdXBkYXRlKHZzLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgdnMgPSB2cy0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUoVm5jU3RhdGUgKnZzLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmNvZGluZykKK3sKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCB4KTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCB5KTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCB3KTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCBoKTsKKworICAgIHZuY193cml0ZV9zMzIodnMsIGVuY29kaW5nKTsKK30KKwordm9pZCBidWZmZXJfcmVzZXJ2ZShCdWZmZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKyAgICBpZiAoKGJ1ZmZlci0+Y2FwYWNpdHkgLSBidWZmZXItPm9mZnNldCkgPCBsZW4pIHsKKyAgICAgICAgYnVmZmVyLT5jYXBhY2l0eSArPSAobGVuICsgMTAyNCk7CisgICAgICAgIGJ1ZmZlci0+YnVmZmVyID0gZ19yZWFsbG9jKGJ1ZmZlci0+YnVmZmVyLCBidWZmZXItPmNhcGFjaXR5KTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+YnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidm5jOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBidWZmZXJfZW1wdHkoQnVmZmVyICpidWZmZXIpCit7CisgICAgcmV0dXJuIGJ1ZmZlci0+b2Zmc2V0ID09IDA7Cit9CisKK3VpbnQ4X3QgKmJ1ZmZlcl9lbmQoQnVmZmVyICpidWZmZXIpCit7CisgICAgcmV0dXJuIGJ1ZmZlci0+YnVmZmVyICsgYnVmZmVyLT5vZmZzZXQ7Cit9CisKK3ZvaWQgYnVmZmVyX3Jlc2V0KEJ1ZmZlciAqYnVmZmVyKQoreworICAgICAgICBidWZmZXItPm9mZnNldCA9IDA7Cit9CisKK3ZvaWQgYnVmZmVyX2FwcGVuZChCdWZmZXIgKmJ1ZmZlciwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBtZW1jcHkoYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPm9mZnNldCwgZGF0YSwgbGVuKTsKKyAgICBidWZmZXItPm9mZnNldCArPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIHZuY19yZXNpemUoVm5jU3RhdGUgKnZzKQoreworICAgIERpc3BsYXlTdGF0ZSAqZHMgPSB2cy0+ZHM7CisgICAgaW50IHNpemVfY2hhbmdlZDsKKworICAgIC8qIGd1ZXN0IHN1cmZhY2UgKi8KKyAgICBpZiAoIXZzLT5ndWVzdC5kcykKKyAgICAgICAgdnMtPmd1ZXN0LmRzID0gZ19tYWxsb2MwKHNpemVvZigqdnMtPmd1ZXN0LmRzKSk7CisgICAgaWYgKGRzX2dldF9ieXRlc19wZXJfcGl4ZWwoZHMpICE9IHZzLT5ndWVzdC5kcy0+cGYuYnl0ZXNfcGVyX3BpeGVsKQorICAgICAgICBjb25zb2xlX2NvbG9yX2luaXQoZHMpOworICAgIHZuY19jb2xvcmRlcHRoKHZzKTsKKyAgICBzaXplX2NoYW5nZWQgPSBkc19nZXRfd2lkdGgoZHMpICE9IHZzLT5ndWVzdC5kcy0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICBkc19nZXRfaGVpZ2h0KGRzKSAhPSB2cy0+Z3Vlc3QuZHMtPmhlaWdodDsKKyAgICAqKHZzLT5ndWVzdC5kcykgPSAqKGRzLT5zdXJmYWNlKTsKKyAgICBpZiAoc2l6ZV9jaGFuZ2VkKSB7CisgICAgICAgIGlmICh2cy0+Y3NvY2sgIT0gLTEgJiYgdm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9SRVNJWkUpKSB7CisgICAgICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDApOyAgLyogbXNnIGlkICovCisgICAgICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDApOworICAgICAgICAgICAgdm5jX3dyaXRlX3UxNih2cywgMSk7IC8qIG51bWJlciBvZiByZWN0cyAqLworICAgICAgICAgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgMCwgMCwgZHNfZ2V0X3dpZHRoKGRzKSwgZHNfZ2V0X2hlaWdodChkcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOQ19FTkNPRElOR19ERVNLVE9QUkVTSVpFKTsKKyAgICAgICAgICAgIHZuY19mbHVzaCh2cyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtc2V0KHZzLT5ndWVzdC5kaXJ0eSwgMHhGRiwgc2l6ZW9mKHZzLT5ndWVzdC5kaXJ0eSkpOworCisgICAgLyogc2VydmVyIHN1cmZhY2UgKi8KKyAgICBpZiAoIXZzLT5zZXJ2ZXIuZHMpCisgICAgICAgIHZzLT5zZXJ2ZXIuZHMgPSBnX21hbGxvYzAoc2l6ZW9mKCp2cy0+c2VydmVyLmRzKSk7CisgICAgaWYgKHZzLT5zZXJ2ZXIuZHMtPmRhdGEpCisgICAgICAgIGdfZnJlZSh2cy0+c2VydmVyLmRzLT5kYXRhKTsKKyAgICAqKHZzLT5zZXJ2ZXIuZHMpID0gKihkcy0+c3VyZmFjZSk7CisgICAgdnMtPnNlcnZlci5kcy0+ZGF0YSA9IGdfbWFsbG9jMCh2cy0+c2VydmVyLmRzLT5saW5lc2l6ZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cy0+c2VydmVyLmRzLT5oZWlnaHQpOworICAgIG1lbXNldCh2cy0+c2VydmVyLmRpcnR5LCAweEZGLCBzaXplb2YodnMtPmd1ZXN0LmRpcnR5KSk7Cit9CisKK3N0YXRpYyB2b2lkIHZuY19kcHlfcmVzaXplKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgVm5jRGlzcGxheSAqdmQgPSBkcy0+b3BhcXVlOworICAgIFZuY1N0YXRlICp2cyA9IHZkLT5jbGllbnRzOworICAgIHdoaWxlICh2cyAhPSBOVUxMKSB7CisgICAgICAgIHZuY19yZXNpemUodnMpOworICAgICAgICB2cyA9IHZzLT5uZXh0OworICAgIH0KK30KKworLyogZmFzdGVzdCBjb2RlICovCitzdGF0aWMgdm9pZCB2bmNfd3JpdGVfcGl4ZWxzX2NvcHkoVm5jU3RhdGUgKnZzLCB2b2lkICpwaXhlbHMsIGludCBzaXplKQoreworICAgIHZuY193cml0ZSh2cywgcGl4ZWxzLCBzaXplKTsKK30KKworLyogc2xvd2VzdCBidXQgZ2VuZXJpYyBjb2RlLiAqLworc3RhdGljIHZvaWQgdm5jX2NvbnZlcnRfcGl4ZWwoVm5jU3RhdGUgKnZzLCB1aW50OF90ICpidWYsIHVpbnQzMl90IHYpCit7CisgICAgdWludDhfdCByLCBnLCBiOworCisgICAgciA9ICgoKCh2ICYgdnMtPnNlcnZlci5kcy0+cGYucm1hc2spID4+IHZzLT5zZXJ2ZXIuZHMtPnBmLnJzaGlmdCkgPDwgdnMtPmNsaWVudGRzLnBmLnJiaXRzKSA+PgorICAgICAgICB2cy0+c2VydmVyLmRzLT5wZi5yYml0cyk7CisgICAgZyA9ICgoKCh2ICYgdnMtPnNlcnZlci5kcy0+cGYuZ21hc2spID4+IHZzLT5zZXJ2ZXIuZHMtPnBmLmdzaGlmdCkgPDwgdnMtPmNsaWVudGRzLnBmLmdiaXRzKSA+PgorICAgICAgICB2cy0+c2VydmVyLmRzLT5wZi5nYml0cyk7CisgICAgYiA9ICgoKCh2ICYgdnMtPnNlcnZlci5kcy0+cGYuYm1hc2spID4+IHZzLT5zZXJ2ZXIuZHMtPnBmLmJzaGlmdCkgPDwgdnMtPmNsaWVudGRzLnBmLmJiaXRzKSA+PgorICAgICAgICB2cy0+c2VydmVyLmRzLT5wZi5iYml0cyk7CisgICAgdiA9IChyIDw8IHZzLT5jbGllbnRkcy5wZi5yc2hpZnQpIHwKKyAgICAgICAgKGcgPDwgdnMtPmNsaWVudGRzLnBmLmdzaGlmdCkgfAorICAgICAgICAoYiA8PCB2cy0+Y2xpZW50ZHMucGYuYnNoaWZ0KTsKKyAgICBzd2l0Y2godnMtPmNsaWVudGRzLnBmLmJ5dGVzX3Blcl9waXhlbCkgeworICAgIGNhc2UgMToKKyAgICAgICAgYnVmWzBdID0gdjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBpZiAodnMtPmNsaWVudGRzLmZsYWdzICYgUUVNVV9CSUdfRU5ESUFOX0ZMQUcpIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IHYgPj4gODsKKyAgICAgICAgICAgIGJ1ZlsxXSA9IHY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZbMV0gPSB2ID4+IDg7CisgICAgICAgICAgICBidWZbMF0gPSB2OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgY2FzZSA0OgorICAgICAgICBpZiAodnMtPmNsaWVudGRzLmZsYWdzICYgUUVNVV9CSUdfRU5ESUFOX0ZMQUcpIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IHYgPj4gMjQ7CisgICAgICAgICAgICBidWZbMV0gPSB2ID4+IDE2OworICAgICAgICAgICAgYnVmWzJdID0gdiA+PiA4OworICAgICAgICAgICAgYnVmWzNdID0gdjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZlszXSA9IHYgPj4gMjQ7CisgICAgICAgICAgICBidWZbMl0gPSB2ID4+IDE2OworICAgICAgICAgICAgYnVmWzFdID0gdiA+PiA4OworICAgICAgICAgICAgYnVmWzBdID0gdjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZuY193cml0ZV9waXhlbHNfZ2VuZXJpYyhWbmNTdGF0ZSAqdnMsIHZvaWQgKnBpeGVsczEsIGludCBzaXplKQoreworICAgIHVpbnQ4X3QgYnVmWzRdOworCisgICAgaWYgKHZzLT5zZXJ2ZXIuZHMtPnBmLmJ5dGVzX3Blcl9waXhlbCA9PSA0KSB7CisgICAgICAgIHVpbnQzMl90ICpwaXhlbHMgPSBwaXhlbHMxOworICAgICAgICBpbnQgbiwgaTsKKyAgICAgICAgbiA9IHNpemUgPj4gMjsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2bmNfY29udmVydF9waXhlbCh2cywgYnVmLCBwaXhlbHNbaV0pOworICAgICAgICAgICAgdm5jX3dyaXRlKHZzLCBidWYsIHZzLT5jbGllbnRkcy5wZi5ieXRlc19wZXJfcGl4ZWwpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh2cy0+c2VydmVyLmRzLT5wZi5ieXRlc19wZXJfcGl4ZWwgPT0gMikgeworICAgICAgICB1aW50MTZfdCAqcGl4ZWxzID0gcGl4ZWxzMTsKKyAgICAgICAgaW50IG4sIGk7CisgICAgICAgIG4gPSBzaXplID4+IDE7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdm5jX2NvbnZlcnRfcGl4ZWwodnMsIGJ1ZiwgcGl4ZWxzW2ldKTsKKyAgICAgICAgICAgIHZuY193cml0ZSh2cywgYnVmLCB2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodnMtPnNlcnZlci5kcy0+cGYuYnl0ZXNfcGVyX3BpeGVsID09IDEpIHsKKyAgICAgICAgdWludDhfdCAqcGl4ZWxzID0gcGl4ZWxzMTsKKyAgICAgICAgaW50IG4sIGk7CisgICAgICAgIG4gPSBzaXplOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHZuY19jb252ZXJ0X3BpeGVsKHZzLCBidWYsIHBpeGVsc1tpXSk7CisgICAgICAgICAgICB2bmNfd3JpdGUodnMsIGJ1ZiwgdnMtPmNsaWVudGRzLnBmLmJ5dGVzX3Blcl9waXhlbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInZuY193cml0ZV9waXhlbHNfZ2VuZXJpYzogVm5jU3RhdGUgY29sb3IgZGVwdGggbm90IHN1cHBvcnRlZFxuIik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZV9yYXcoVm5jU3RhdGUgKnZzLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpyb3c7CisKKyAgICByb3cgPSB2cy0+c2VydmVyLmRzLT5kYXRhICsgeSAqIGRzX2dldF9saW5lc2l6ZSh2cy0+ZHMpICsgeCAqIGRzX2dldF9ieXRlc19wZXJfcGl4ZWwodnMtPmRzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CisgICAgICAgIHZzLT53cml0ZV9waXhlbHModnMsIHJvdywgdyAqIGRzX2dldF9ieXRlc19wZXJfcGl4ZWwodnMtPmRzKSk7CisgICAgICAgIHJvdyArPSBkc19nZXRfbGluZXNpemUodnMtPmRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhleHRpbGVfZW5jX2NvcmQodWludDhfdCAqcHRyLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBwdHJbMF0gPSAoKHggJiAweDBGKSA8PCA0KSB8ICh5ICYgMHgwRik7CisgICAgcHRyWzFdID0gKCgodyAtIDEpICYgMHgwRikgPDwgNCkgfCAoKGggLSAxKSAmIDB4MEYpOworfQorCisjZGVmaW5lIEJQUCA4CisjaW5jbHVkZSAidm5jaGV4dGlsZS5oIgorI3VuZGVmIEJQUAorCisjZGVmaW5lIEJQUCAxNgorI2luY2x1ZGUgInZuY2hleHRpbGUuaCIKKyN1bmRlZiBCUFAKKworI2RlZmluZSBCUFAgMzIKKyNpbmNsdWRlICJ2bmNoZXh0aWxlLmgiCisjdW5kZWYgQlBQCisKKyNkZWZpbmUgR0VORVJJQworI2RlZmluZSBCUFAgOAorI2luY2x1ZGUgInZuY2hleHRpbGUuaCIKKyN1bmRlZiBCUFAKKyN1bmRlZiBHRU5FUklDCisKKyNkZWZpbmUgR0VORVJJQworI2RlZmluZSBCUFAgMTYKKyNpbmNsdWRlICJ2bmNoZXh0aWxlLmgiCisjdW5kZWYgQlBQCisjdW5kZWYgR0VORVJJQworCisjZGVmaW5lIEdFTkVSSUMKKyNkZWZpbmUgQlBQIDMyCisjaW5jbHVkZSAidm5jaGV4dGlsZS5oIgorI3VuZGVmIEJQUAorI3VuZGVmIEdFTkVSSUMKKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfaGV4dGlsZShWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGludCBpLCBqOworICAgIGludCBoYXNfZmcsIGhhc19iZzsKKyAgICB1aW50OF90ICpsYXN0X2ZnLCAqbGFzdF9iZzsKKworICAgIGxhc3RfZmcgPSAodWludDhfdCAqKSBnX21hbGxvYyh2cy0+c2VydmVyLmRzLT5wZi5ieXRlc19wZXJfcGl4ZWwpOworICAgIGxhc3RfYmcgPSAodWludDhfdCAqKSBnX21hbGxvYyh2cy0+c2VydmVyLmRzLT5wZi5ieXRlc19wZXJfcGl4ZWwpOworICAgIGhhc19mZyA9IGhhc19iZyA9IDA7CisgICAgZm9yIChqID0geTsgaiA8ICh5ICsgaCk7IGogKz0gMTYpIHsKKyAgICAgICAgZm9yIChpID0geDsgaSA8ICh4ICsgdyk7IGkgKz0gMTYpIHsKKyAgICAgICAgICAgIHZzLT5zZW5kX2hleHRpbGVfdGlsZSh2cywgaSwgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4oMTYsIHggKyB3IC0gaSksIE1JTigxNiwgeSArIGggLSBqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2JnLCBsYXN0X2ZnLCAmaGFzX2JnLCAmaGFzX2ZnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcmVlKGxhc3RfZmcpOworICAgIGZyZWUobGFzdF9iZyk7CisKK30KKworc3RhdGljIHZvaWQgdm5jX3psaWJfaW5pdChWbmNTdGF0ZSAqdnMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpPTA7IGk8KHNpemVvZih2cy0+emxpYl9zdHJlYW0pIC8gc2l6ZW9mKHpfc3RyZWFtKSk7IGkrKykKKyAgICAgICAgdnMtPnpsaWJfc3RyZWFtW2ldLm9wYXF1ZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZuY196bGliX3N0YXJ0KFZuY1N0YXRlICp2cykKK3sKKyAgICBidWZmZXJfcmVzZXQoJnZzLT56bGliKTsKKworICAgIC8vIG1ha2UgdGhlIG91dHB1dCBidWZmZXIgYmUgdGhlIHpsaWIgYnVmZmVyLCBzbyB3ZSBjYW4gY29tcHJlc3MgaXQgbGF0ZXIKKyAgICB2cy0+emxpYl90bXAgPSB2cy0+b3V0cHV0OworICAgIHZzLT5vdXRwdXQgPSB2cy0+emxpYjsKK30KKworc3RhdGljIGludCB2bmNfemxpYl9zdG9wKFZuY1N0YXRlICp2cywgaW50IHN0cmVhbV9pZCkKK3sKKyAgICB6X3N0cmVhbXAgenN0cmVhbSA9ICZ2cy0+emxpYl9zdHJlYW1bc3RyZWFtX2lkXTsKKyAgICBpbnQgcHJldmlvdXNfb3V0OworCisgICAgLy8gc3dpdGNoIGJhY2sgdG8gbm9ybWFsIG91dHB1dC96bGliIGJ1ZmZlcnMKKyAgICB2cy0+emxpYiA9IHZzLT5vdXRwdXQ7CisgICAgdnMtPm91dHB1dCA9IHZzLT56bGliX3RtcDsKKworICAgIC8vIGNvbXByZXNzIHRoZSB6bGliIGJ1ZmZlcgorCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RyZWFtCisgICAgLy8gWFhYIG5lZWQgb25lIHN0cmVhbSBwZXIgc2Vzc2lvbgorICAgIGlmICh6c3RyZWFtLT5vcGFxdWUgIT0gdnMpIHsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBWTkNfREVCVUcoIlZOQzogaW5pdGlhbGl6aW5nIHpsaWIgc3RyZWFtICVkXG4iLCBzdHJlYW1faWQpOworICAgICAgICBWTkNfREVCVUcoIlZOQzogb3BhcXVlID0gJXAgfCB2cyA9ICVwXG4iLCB6c3RyZWFtLT5vcGFxdWUsIHZzKTsKKyAgICAgICAgenN0cmVhbS0+emFsbG9jID0gWl9OVUxMOworICAgICAgICB6c3RyZWFtLT56ZnJlZSA9IFpfTlVMTDsKKworICAgICAgICBlcnIgPSBkZWZsYXRlSW5pdDIoenN0cmVhbSwgdnMtPnRpZ2h0X2NvbXByZXNzaW9uLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfTUVNX0xFVkVMLCBaX0RFRkFVTFRfU1RSQVRFR1kpOworCisgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJWTkM6IGVycm9yIGluaXRpYWxpemluZyB6bGliXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHpzdHJlYW0tPm9wYXF1ZSA9IHZzOworICAgIH0KKworICAgIC8vIFhYWCB3aGF0IHRvIGRvIGlmIHRpZ2h0X2NvbXByZXNzaW9uIGNoYW5nZWQgaW4gYmV0d2Vlbj8KKworICAgIC8vIHJlc2VydmUgbWVtb3J5IGluIG91dHB1dCBidWZmZXIKKyAgICBidWZmZXJfcmVzZXJ2ZSgmdnMtPm91dHB1dCwgdnMtPnpsaWIub2Zmc2V0ICsgNjQpOworCisgICAgLy8gc2V0IHBvaW50ZXJzCisgICAgenN0cmVhbS0+bmV4dF9pbiA9IHZzLT56bGliLmJ1ZmZlcjsKKyAgICB6c3RyZWFtLT5hdmFpbF9pbiA9IHZzLT56bGliLm9mZnNldDsKKyAgICB6c3RyZWFtLT5uZXh0X291dCA9IHZzLT5vdXRwdXQuYnVmZmVyICsgdnMtPm91dHB1dC5vZmZzZXQ7CisgICAgenN0cmVhbS0+YXZhaWxfb3V0ID0gdnMtPm91dHB1dC5jYXBhY2l0eSAtIHZzLT5vdXRwdXQub2Zmc2V0OworICAgIHpzdHJlYW0tPmRhdGFfdHlwZSA9IFpfQklOQVJZOworICAgIHByZXZpb3VzX291dCA9IHpzdHJlYW0tPnRvdGFsX291dDsKKworICAgIC8vIHN0YXJ0IGVuY29kaW5nCisgICAgaWYgKGRlZmxhdGUoenN0cmVhbSwgWl9TWU5DX0ZMVVNIKSAhPSBaX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVk5DOiBlcnJvciBkdXJpbmcgemxpYiBjb21wcmVzc2lvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB2cy0+b3V0cHV0Lm9mZnNldCA9IHZzLT5vdXRwdXQuY2FwYWNpdHkgLSB6c3RyZWFtLT5hdmFpbF9vdXQ7CisgICAgcmV0dXJuIHpzdHJlYW0tPnRvdGFsX291dCAtIHByZXZpb3VzX291dDsKK30KKworc3RhdGljIHZvaWQgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfemxpYihWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIGludCBvbGRfb2Zmc2V0LCBuZXdfb2Zmc2V0LCBieXRlc193cml0dGVuOworCisgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgeCwgeSwgdywgaCwgVk5DX0VOQ09ESU5HX1pMSUIpOworCisgICAgLy8gcmVtZW1iZXIgd2hlcmUgd2UgcHV0IGluIHRoZSBmb2xsb3ctdXAgc2l6ZQorICAgIG9sZF9vZmZzZXQgPSB2cy0+b3V0cHV0Lm9mZnNldDsKKyAgICB2bmNfd3JpdGVfczMyKHZzLCAwKTsKKworICAgIC8vIGNvbXByZXNzIHRoZSBzdHJlYW0KKyAgICB2bmNfemxpYl9zdGFydCh2cyk7CisgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfcmF3KHZzLCB4LCB5LCB3LCBoKTsKKyAgICBieXRlc193cml0dGVuID0gdm5jX3psaWJfc3RvcCh2cywgMCk7CisKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gaGFjayBpbiB0aGUgc2l6ZQorICAgIG5ld19vZmZzZXQgPSB2cy0+b3V0cHV0Lm9mZnNldDsKKyAgICB2cy0+b3V0cHV0Lm9mZnNldCA9IG9sZF9vZmZzZXQ7CisgICAgdm5jX3dyaXRlX3UzMih2cywgYnl0ZXNfd3JpdHRlbik7CisgICAgdnMtPm91dHB1dC5vZmZzZXQgPSBuZXdfb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZShWbmNTdGF0ZSAqdnMsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQoreworICAgIHN3aXRjaCh2cy0+dm5jX2VuY29kaW5nKSB7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1pMSUI6CisgICAgICAgICAgICBzZW5kX2ZyYW1lYnVmZmVyX3VwZGF0ZV96bGliKHZzLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19IRVhUSUxFOgorICAgICAgICAgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgeCwgeSwgdywgaCwgVk5DX0VOQ09ESU5HX0hFWFRJTEUpOworICAgICAgICAgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfaGV4dGlsZSh2cywgeCwgeSwgdywgaCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIHgsIHksIHcsIGgsIFZOQ19FTkNPRElOR19SQVcpOworICAgICAgICAgICAgc2VuZF9mcmFtZWJ1ZmZlcl91cGRhdGVfcmF3KHZzLCB4LCB5LCB3LCBoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdm5jX2NvcHkoVm5jU3RhdGUgKnZzLCBpbnQgc3JjX3gsIGludCBzcmNfeSwgaW50IGRzdF94LCBpbnQgZHN0X3ksIGludCB3LCBpbnQgaCkKK3sKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOyAgLyogbXNnIGlkICovCisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsgLyogbnVtYmVyIG9mIHJlY3RzICovCisgICAgdm5jX2ZyYW1lYnVmZmVyX3VwZGF0ZSh2cywgZHN0X3gsIGRzdF95LCB3LCBoLCBWTkNfRU5DT0RJTkdfQ09QWVJFQ1QpOworICAgIHZuY193cml0ZV91MTYodnMsIHNyY194KTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCBzcmNfeSk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgdm5jX2RweV9jb3B5KERpc3BsYXlTdGF0ZSAqZHMsIGludCBzcmNfeCwgaW50IHNyY195LCBpbnQgZHN0X3gsIGludCBkc3RfeSwgaW50IHcsIGludCBoKQoreworICAgIFZuY0Rpc3BsYXkgKnZkID0gZHMtPm9wYXF1ZTsKKyAgICBWbmNTdGF0ZSAqdnMsICp2bjsKKworICAgIGZvciAodnMgPSB2ZC0+Y2xpZW50czsgdnMgIT0gTlVMTDsgdnMgPSB2bikgeworICAgICAgICB2biA9IHZzLT5uZXh0OworICAgICAgICBpZiAodm5jX2hhc19mZWF0dXJlKHZzLCBWTkNfRkVBVFVSRV9DT1BZUkVDVCkpIHsKKyAgICAgICAgICAgIHZzLT5mb3JjZV91cGRhdGUgPSAxOworICAgICAgICAgICAgdm5jX3VwZGF0ZV9jbGllbnQodnMpOworICAgICAgICAgICAgLyogdnMgbWlnaHQgYmUgZnJlZSgpZWQgaGVyZSAqLworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh2cyA9IHZkLT5jbGllbnRzOyB2cyAhPSBOVUxMOyB2cyA9IHZzLT5uZXh0KSB7CisgICAgICAgIGlmICh2bmNfaGFzX2ZlYXR1cmUodnMsIFZOQ19GRUFUVVJFX0NPUFlSRUNUKSkKKyAgICAgICAgICAgIHZuY19jb3B5KHZzLCBzcmNfeCwgc3JjX3ksIGRzdF94LCBkc3RfeSwgdywgaCk7CisgICAgICAgIGVsc2UgLyogVE9ETyAqLworICAgICAgICAgICAgdm5jX3VwZGF0ZSh2cywgZHN0X3gsIGRzdF95LCB3LCBoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmluZF9hbmRfY2xlYXJfZGlydHlfaGVpZ2h0KHN0cnVjdCBWbmNTdXJmYWNlICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIGludCBsYXN0X3gsIGludCB4KQoreworICAgIGludCBoOworCisgICAgZm9yIChoID0gMTsgaCA8IChzLT5kcy0+aGVpZ2h0IC0geSk7IGgrKykgeworICAgICAgICBpbnQgdG1wX3g7CisgICAgICAgIGlmICghdm5jX2dldF9iaXQocy0+ZGlydHlbeSArIGhdLCBsYXN0X3gpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAodG1wX3ggPSBsYXN0X3g7IHRtcF94IDwgeDsgdG1wX3grKykKKyAgICAgICAgICAgIHZuY19jbGVhcl9iaXQocy0+ZGlydHlbeSArIGhdLCB0bXBfeCk7CisgICAgfQorCisgICAgcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB2b2lkIHZuY191cGRhdGVfY2xpZW50KHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisgICAgaWYgKHZzLT5uZWVkX3VwZGF0ZSAmJiB2cy0+Y3NvY2sgIT0gLTEpIHsKKyAgICAgICAgaW50IHk7CisgICAgICAgIHVpbnQ4X3QgKmd1ZXN0X3JvdzsKKyAgICAgICAgdWludDhfdCAqc2VydmVyX3JvdzsKKyAgICAgICAgaW50IGNtcF9ieXRlczsKKyAgICAgICAgdWludDMyX3Qgd2lkdGhfbWFza1tWTkNfRElSVFlfV09SRFNdOworICAgICAgICBpbnQgbl9yZWN0YW5nbGVzOworICAgICAgICBpbnQgc2F2ZWRfb2Zmc2V0OworICAgICAgICBpbnQgaGFzX2RpcnR5ID0gMDsKKworICAgICAgICBpZiAodnMtPm91dHB1dC5vZmZzZXQgJiYgIXZzLT5hdWRpb19jYXAgJiYgIXZzLT5mb3JjZV91cGRhdGUpIHsKKyAgICAgICAgICAgIC8qIGtlcm5lbCBzZW5kIGJ1ZmZlcnMgYXJlIGZ1bGwgLT4gZHJvcCBmcmFtZXMgdG8gdGhyb3R0bGUgKi8KKyAgICAgICAgICAgIHRpbWVyX21vZCh2cy0+dGltZXIsIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsgVk5DX1JFRlJFU0hfSU5URVJWQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdmdhX2h3X3VwZGF0ZSgpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFdhbGsgdGhyb3VnaCB0aGUgZ3Vlc3QgZGlydHkgbWFwLgorICAgICAgICAgKiBDaGVjayBhbmQgY29weSBtb2RpZmllZCBiaXRzIGZyb20gZ3Vlc3QgdG8gc2VydmVyIHN1cmZhY2UuCisgICAgICAgICAqIFVwZGF0ZSBzZXJ2ZXIgZGlydHkgbWFwLgorICAgICAgICAgKi8KKyAgICAgICAgdm5jX3NldF9iaXRzKHdpZHRoX21hc2ssIChkc19nZXRfd2lkdGgodnMtPmRzKSAvIDE2KSwgVk5DX0RJUlRZX1dPUkRTKTsKKyAgICAgICAgY21wX2J5dGVzID0gMTYgKiBkc19nZXRfYnl0ZXNfcGVyX3BpeGVsKHZzLT5kcyk7CisgICAgICAgIGd1ZXN0X3JvdyAgPSB2cy0+Z3Vlc3QuZHMtPmRhdGE7CisgICAgICAgIHNlcnZlcl9yb3cgPSB2cy0+c2VydmVyLmRzLT5kYXRhOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgdnMtPmd1ZXN0LmRzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaWYgKHZuY19hbmRfYml0cyh2cy0+Z3Vlc3QuZGlydHlbeV0sIHdpZHRoX21hc2ssIFZOQ19ESVJUWV9XT1JEUykpIHsKKyAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpndWVzdF9wdHI7CisgICAgICAgICAgICAgICAgdWludDhfdCAqc2VydmVyX3B0cjsKKworICAgICAgICAgICAgICAgIGd1ZXN0X3B0ciAgPSBndWVzdF9yb3c7CisgICAgICAgICAgICAgICAgc2VydmVyX3B0ciA9IHNlcnZlcl9yb3c7CisKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdnMtPmd1ZXN0LmRzLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgIHggKz0gMTYsIGd1ZXN0X3B0ciArPSBjbXBfYnl0ZXMsIHNlcnZlcl9wdHIgKz0gY21wX2J5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdm5jX2dldF9iaXQodnMtPmd1ZXN0LmRpcnR5W3ldLCAoeCAvIDE2KSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsZWFyX2JpdCh2cy0+Z3Vlc3QuZGlydHlbeV0sICh4IC8gMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChzZXJ2ZXJfcHRyLCBndWVzdF9wdHIsIGNtcF9ieXRlcykgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2VydmVyX3B0ciwgZ3Vlc3RfcHRyLCBjbXBfYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICB2bmNfc2V0X2JpdCh2cy0+c2VydmVyLmRpcnR5W3ldLCAoeCAvIDE2KSk7CisgICAgICAgICAgICAgICAgICAgIGhhc19kaXJ0eSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGd1ZXN0X3JvdyAgKz0gZHNfZ2V0X2xpbmVzaXplKHZzLT5kcyk7CisgICAgICAgICAgICBzZXJ2ZXJfcm93ICs9IGRzX2dldF9saW5lc2l6ZSh2cy0+ZHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoYXNfZGlydHkgJiYgIXZzLT5hdWRpb19jYXAgJiYgIXZzLT5mb3JjZV91cGRhdGUpIHsKKyAgICAgICAgICAgIHRpbWVyX21vZCh2cy0+dGltZXIsIHFlbXVfY2xvY2tfZ2V0X21zKFFFTVVfQ0xPQ0tfUkVBTFRJTUUpICsgVk5DX1JFRlJFU0hfSU5URVJWQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VuZCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgdm5jIGNsaWVudCB1c2luZyB0aGUgc2VydmVyCisgICAgICAgICAqIHN1cmZhY2UgYW5kIHNlcnZlciBkaXJ0eSBtYXAuICBndWVzdCBzdXJmYWNlIHVwZGF0ZXMKKyAgICAgICAgICogaGFwcGVuaW5nIGluIHBhcmFsbGVsIGRvbid0IGRpc3R1cmIgdXMsIHRoZSBuZXh0IHBhc3Mgd2lsbAorICAgICAgICAgKiBzZW5kIHRoZW0gdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICovCisgICAgICAgIG5fcmVjdGFuZ2xlcyA9IDA7CisgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7ICAvKiBtc2cgaWQgKi8KKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICAgICAgc2F2ZWRfb2Zmc2V0ID0gdnMtPm91dHB1dC5vZmZzZXQ7CisgICAgICAgIHZuY193cml0ZV91MTYodnMsIDApOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCB2cy0+c2VydmVyLmRzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBpbnQgbGFzdF94ID0gLTE7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdnMtPnNlcnZlci5kcy0+d2lkdGggLyAxNjsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHZuY19nZXRfYml0KHZzLT5zZXJ2ZXIuZGlydHlbeV0sIHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0X3ggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfeCA9IHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdm5jX2NsZWFyX2JpdCh2cy0+c2VydmVyLmRpcnR5W3ldLCB4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF94ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCA9IGZpbmRfYW5kX2NsZWFyX2RpcnR5X2hlaWdodCgmdnMtPnNlcnZlciwgeSwgbGFzdF94LCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCBsYXN0X3ggKiAxNiwgeSwgKHggLSBsYXN0X3gpICogMTYsIGgpOworICAgICAgICAgICAgICAgICAgICAgICAgbl9yZWN0YW5nbGVzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdF94ID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3RfeCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGludCBoID0gZmluZF9hbmRfY2xlYXJfZGlydHlfaGVpZ2h0KCZ2cy0+c2VydmVyLCB5LCBsYXN0X3gsIHgpOworICAgICAgICAgICAgICAgIHNlbmRfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCBsYXN0X3ggKiAxNiwgeSwgKHggLSBsYXN0X3gpICogMTYsIGgpOworICAgICAgICAgICAgICAgIG5fcmVjdGFuZ2xlcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZzLT5vdXRwdXQuYnVmZmVyW3NhdmVkX29mZnNldF0gPSAobl9yZWN0YW5nbGVzID4+IDgpICYgMHhGRjsKKyAgICAgICAgdnMtPm91dHB1dC5idWZmZXJbc2F2ZWRfb2Zmc2V0ICsgMV0gPSBuX3JlY3RhbmdsZXMgJiAweEZGOworICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICB2cy0+Zm9yY2VfdXBkYXRlID0gMDsKKworICAgIH0KKworICAgIGlmICh2cy0+Y3NvY2sgIT0gLTEpIHsKKyAgICAgICAgdGltZXJfbW9kKHZzLT50aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkgKyBWTkNfUkVGUkVTSF9JTlRFUlZBTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm5jX2Rpc2Nvbm5lY3RfZmluaXNoKHZzKTsKKyAgICB9CisKK30KKworLyogYXVkaW8gKi8KK3N0YXRpYyB2b2lkIGF1ZGlvX2NhcHR1cmVfbm90aWZ5KHZvaWQgKm9wYXF1ZSwgYXVkY25vdGlmaWNhdGlvbl9lIGNtZCkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgQVVEX0NOT1RJRllfRElTQUJMRToKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAyNTUpOworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDEpOworICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAwKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRF9DTk9USUZZX0VOQUJMRToKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAyNTUpOworICAgICAgICB2bmNfd3JpdGVfdTgodnMsIDEpOworICAgICAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhdWRpb19jYXB0dXJlX2Rlc3Ryb3kodm9pZCAqb3BhcXVlKQoreworfQorCitzdGF0aWMgdm9pZCBhdWRpb19jYXB0dXJlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisKKyAgICB2bmNfd3JpdGVfdTgodnMsIDI1NSk7CisgICAgdm5jX3dyaXRlX3U4KHZzLCAxKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCAyKTsKKyAgICB2bmNfd3JpdGVfdTMyKHZzLCBzaXplKTsKKyAgICB2bmNfd3JpdGUodnMsIGJ1Ziwgc2l6ZSk7CisgICAgdm5jX2ZsdXNoKHZzKTsKK30KKworc3RhdGljIHZvaWQgYXVkaW9fYWRkKFZuY1N0YXRlICp2cykKK3sKKyAgICBNb25pdG9yICptb24gPSBjdXJfbW9uOworICAgIHN0cnVjdCBhdWRpb19jYXB0dXJlX29wcyBvcHM7CisKKyAgICBpZiAodnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJhdWRpbyBhbHJlYWR5IHJ1bm5pbmdcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgb3BzLm5vdGlmeSA9IGF1ZGlvX2NhcHR1cmVfbm90aWZ5OworICAgIG9wcy5kZXN0cm95ID0gYXVkaW9fY2FwdHVyZV9kZXN0cm95OworICAgIG9wcy5jYXB0dXJlID0gYXVkaW9fY2FwdHVyZTsKKworICAgIHZzLT5hdWRpb19jYXAgPSBBVURfYWRkX2NhcHR1cmUoJnZzLT5hcywgJm9wcywgdnMpOworICAgIGlmICghdnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBtb25pdG9yX3ByaW50Zihtb24sICJGYWlsZWQgdG8gYWRkIGF1ZGlvIGNhcHR1cmVcbiIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXVkaW9fZGVsKFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAodnMtPmF1ZGlvX2NhcCkgeworICAgICAgICBBVURfZGVsX2NhcHR1cmUodnMtPmF1ZGlvX2NhcCwgdnMpOworICAgICAgICB2cy0+YXVkaW9fY2FwID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZuY19kaXNjb25uZWN0X3N0YXJ0KFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAodnMtPmNzb2NrID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmNzb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBjbG9zZXNvY2tldCh2cy0+Y3NvY2spOworICAgIHZzLT5jc29jayA9IC0xOworfQorCitzdGF0aWMgdm9pZCB2bmNfZGlzY29ubmVjdF9maW5pc2goVm5jU3RhdGUgKnZzKQoreworICAgIHRpbWVyX2RlbCh2cy0+dGltZXIpOworICAgIHRpbWVyX2ZyZWUodnMtPnRpbWVyKTsKKyAgICBpZiAodnMtPmlucHV0LmJ1ZmZlcikgZ19mcmVlKHZzLT5pbnB1dC5idWZmZXIpOworICAgIGlmICh2cy0+b3V0cHV0LmJ1ZmZlcikgZ19mcmVlKHZzLT5vdXRwdXQuYnVmZmVyKTsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIHZuY190bHNfY2xpZW50X2NsZWFudXAodnMpOworI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgdm5jX3Nhc2xfY2xpZW50X2NsZWFudXAodnMpOworI2VuZGlmIC8qIENPTkZJR19WTkNfU0FTTCAqLworICAgIGF1ZGlvX2RlbCh2cyk7CisKKyAgICBWbmNTdGF0ZSAqcCwgKnBhcmVudCA9IE5VTEw7CisgICAgZm9yIChwID0gdnMtPnZkLT5jbGllbnRzOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7CisgICAgICAgIGlmIChwID09IHZzKSB7CisgICAgICAgICAgICBpZiAocGFyZW50KQorICAgICAgICAgICAgICAgIHBhcmVudC0+bmV4dCA9IHAtPm5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnMtPnZkLT5jbGllbnRzID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IHA7CisgICAgfQorICAgIGlmICghdnMtPnZkLT5jbGllbnRzKQorICAgICAgICBkY2wtPmlkbGUgPSAxOworCisgICAgZ19mcmVlKHZzLT5zZXJ2ZXIuZHMtPmRhdGEpOworICAgIGdfZnJlZSh2cy0+c2VydmVyLmRzKTsKKyAgICBnX2ZyZWUodnMtPmd1ZXN0LmRzKTsKKyAgICBnX2ZyZWUodnMpOworfQorCitpbnQgdm5jX2NsaWVudF9pb19lcnJvcihWbmNTdGF0ZSAqdnMsIGludCByZXQsIGludCBsYXN0X2Vycm5vKQoreworICAgIGlmIChyZXQgPT0gMCB8fCByZXQgPT0gLTEpIHsKKyAgICAgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICAgICAgc3dpdGNoIChsYXN0X2Vycm5vKSB7CisgICAgICAgICAgICAgICAgY2FzZSBFSU5UUjoKKyAgICAgICAgICAgICAgICBjYXNlIEVBR0FJTjoKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgICAgICAgICBjYXNlIFdTQUVXT1VMREJMT0NLOgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVk5DX0RFQlVHKCJDbG9zaW5nIGRvd24gY2xpZW50IHNvY2s6IHJldCAlZCwgZXJybm8gJWRcbiIsCisgICAgICAgICAgICAgICAgICByZXQsIHJldCA8IDAgPyBsYXN0X2Vycm5vIDogMCk7CisgICAgICAgIHZuY19kaXNjb25uZWN0X3N0YXJ0KHZzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCit2b2lkIHZuY19jbGllbnRfZXJyb3IoVm5jU3RhdGUgKnZzKQoreworICAgIFZOQ19ERUJVRygiQ2xvc2luZyBkb3duIGNsaWVudCBzb2NrOiBwcm90b2NvbCBlcnJvclxuIik7CisgICAgdm5jX2Rpc2Nvbm5lY3Rfc3RhcnQodnMpOworfQorCisKKy8qCisgKiBDYWxsZWQgdG8gd3JpdGUgYSBjaHVuayBvZiBkYXRhIHRvIHRoZSBjbGllbnQgc29ja2V0LiBUaGUgZGF0YSBtYXkKKyAqIGJlIHRoZSByYXcgZGF0YSwgb3IgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGVuY29kZWQgYnkgU0FTTC4KKyAqIFRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiBlaXRoZXIgc3RyYWlnaHQgb250byB0aGUgc29ja2V0LCBvcgorICogd3JpdHRlbiB2aWEgdGhlIEdOVVRMUyB3cmFwcGVycywgaWYgVExTL1NTTCBlbmNyeXB0aW9uIGlzIGVuYWJsZWQKKyAqCisgKiBOQiwgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBoYXZlIDIgbGF5ZXJzIG9mIGVuY3J5cHRpb24sCisgKiBib3RoIFNBU0wsIGFuZCB0aGlzIFRMUyBsYXllci4gSXQgaXMgaGlnaGx5IHVubGlrZWx5IGluIHByYWN0aWNlCisgKiB0aG91Z2gsIHNpbmNlIFNBU0wgZW5jcnlwdGlvbiB3aWxsIHR5cGljYWxseSBiZSBhIG5vLW9wIGlmIFRMUworICogaXMgYWN0aXZlCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4KKyAqIHRoZSByZXF1ZXN0ZWQgJ2RhdGFsZW4nIGlmIHRoZSBzb2NrZXQgd291bGQgYmxvY2suIFJldHVybnMKKyAqIC0xIG9uIGVycm9yLCBhbmQgZGlzY29ubmVjdHMgdGhlIGNsaWVudCBzb2NrZXQuCisgKi8KK2xvbmcgdm5jX2NsaWVudF93cml0ZV9idWYoVm5jU3RhdGUgKnZzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sKKyAgICBsb25nIHJldDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIGlmICh2cy0+dGxzLnNlc3Npb24pIHsKKyAgICAgICAgcmV0ID0gZ251dGxzX3dyaXRlKHZzLT50bHMuc2Vzc2lvbiwgZGF0YSwgZGF0YWxlbik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEdOVVRMU19FX0FHQUlOKQorICAgICAgICAgICAgICAgIGVycm5vID0gRUFHQUlOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVycm5vID0gRUlPOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1RMUyAqLworICAgICAgICByZXQgPSBzZW5kKHZzLT5jc29jaywgKGNvbnN0IHZvaWQgKilkYXRhLCBkYXRhbGVuLCAwKTsKKyAgICBWTkNfREVCVUcoIldyb3RlIHdpcmUgJXAgJXpkIC0+ICVsZFxuIiwgZGF0YSwgZGF0YWxlbiwgcmV0KTsKKyAgICByZXR1cm4gdm5jX2NsaWVudF9pb19lcnJvcih2cywgcmV0LCBzb2NrZXRfZXJyb3IoKSk7Cit9CisKKworLyoKKyAqIENhbGxlZCB0byB3cml0ZSBidWZmZXJlZCBkYXRhIHRvIHRoZSBjbGllbnQgc29ja2V0LCB3aGVuIG5vdAorICogdXNpbmcgYW55IFNBU0wgU1NGIGVuY3J5cHRpb24gbGF5ZXJzLiBXaWxsIHdyaXRlIGFzIG11Y2ggZGF0YQorICogYXMgcG9zc2libGUgd2l0aG91dCBibG9ja2luZy4gSWYgYWxsIGJ1ZmZlcmVkIGRhdGEgaXMgd3JpdHRlbiwKKyAqIHdpbGwgc3dpdGNoIHRoZSBGRCBwb2xsKCkgaGFuZGxlciBiYWNrIHRvIHJlYWQgbW9uaXRvcmluZy4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgd2hpY2ggbWF5IGJlIGxlc3MgdGhhbgorICogdGhlIGJ1ZmZlcmVkIG91dHB1dCBkYXRhIGlmIHRoZSBzb2NrZXQgd291bGQgYmxvY2suIFJldHVybnMKKyAqIC0xIG9uIGVycm9yLCBhbmQgZGlzY29ubmVjdHMgdGhlIGNsaWVudCBzb2NrZXQuCisgKi8KK3N0YXRpYyBsb25nIHZuY19jbGllbnRfd3JpdGVfcGxhaW4oVm5jU3RhdGUgKnZzKQoreworICAgIGxvbmcgcmV0OworCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgVk5DX0RFQlVHKCJXcml0ZSBQbGFpbjogUGVuZGluZyBvdXRwdXQgJXAgc2l6ZSAlemQgb2Zmc2V0ICV6ZC4gV2FpdCBTU0YgJWRcbiIsCisgICAgICAgICAgICAgIHZzLT5vdXRwdXQuYnVmZmVyLCB2cy0+b3V0cHV0LmNhcGFjaXR5LCB2cy0+b3V0cHV0Lm9mZnNldCwKKyAgICAgICAgICAgICAgdnMtPnNhc2wud2FpdFdyaXRlU1NGKTsKKworICAgIGlmICh2cy0+c2FzbC5jb25uICYmCisgICAgICAgIHZzLT5zYXNsLnJ1blNTRiAmJgorICAgICAgICB2cy0+c2FzbC53YWl0V3JpdGVTU0YpIHsKKyAgICAgICAgcmV0ID0gdm5jX2NsaWVudF93cml0ZV9idWYodnMsIHZzLT5vdXRwdXQuYnVmZmVyLCB2cy0+c2FzbC53YWl0V3JpdGVTU0YpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgdnMtPnNhc2wud2FpdFdyaXRlU1NGIC09IHJldDsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1NBU0wgKi8KKyAgICAgICAgcmV0ID0gdm5jX2NsaWVudF93cml0ZV9idWYodnMsIHZzLT5vdXRwdXQuYnVmZmVyLCB2cy0+b3V0cHV0Lm9mZnNldCk7CisgICAgaWYgKCFyZXQpCisgICAgICAgIHJldHVybiAwOworCisgICAgbWVtbW92ZSh2cy0+b3V0cHV0LmJ1ZmZlciwgdnMtPm91dHB1dC5idWZmZXIgKyByZXQsICh2cy0+b3V0cHV0Lm9mZnNldCAtIHJldCkpOworICAgIHZzLT5vdXRwdXQub2Zmc2V0IC09IHJldDsKKworICAgIGlmICh2cy0+b3V0cHV0Lm9mZnNldCA9PSAwKSB7CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHZzLT5jc29jaywgTlVMTCwgdm5jX2NsaWVudF9yZWFkLCBOVUxMLCB2cyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworCisvKgorICogRmlyc3QgZnVuY3Rpb24gY2FsbGVkIHdoZW5ldmVyIHRoZXJlIGlzIGRhdGEgdG8gYmUgd3JpdHRlbiB0bworICogdGhlIGNsaWVudCBzb2NrZXQuIFdpbGwgZGVsZWdhdGUgYWN0dWFsIHdvcmsgYWNjb3JkaW5nIHRvIHdoZXRoZXIKKyAqIFNBU0wgU1NGIGxheWVycyBhcmUgZW5hYmxlZCAodGh1cyByZXF1aXJpbmcgZW5jcnlwdGlvbiBjYWxscykKKyAqLwordm9pZCB2bmNfY2xpZW50X3dyaXRlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBsb25nIHJldDsKKyAgICBWbmNTdGF0ZSAqdnMgPSBvcGFxdWU7CisKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICBpZiAodnMtPnNhc2wuY29ubiAmJgorICAgICAgICB2cy0+c2FzbC5ydW5TU0YgJiYKKyAgICAgICAgIXZzLT5zYXNsLndhaXRXcml0ZVNTRikKKyAgICAgICAgcmV0ID0gdm5jX2NsaWVudF93cml0ZV9zYXNsKHZzKTsKKyAgICBlbHNlCisjZW5kaWYgLyogQ09ORklHX1ZOQ19TQVNMICovCisgICAgICAgIHJldCA9IHZuY19jbGllbnRfd3JpdGVfcGxhaW4odnMpOworfQorCit2b2lkIHZuY19yZWFkX3doZW4oVm5jU3RhdGUgKnZzLCBWbmNSZWFkRXZlbnQgKmZ1bmMsIHNpemVfdCBleHBlY3RpbmcpCit7CisgICAgdnMtPnJlYWRfaGFuZGxlciA9IGZ1bmM7CisgICAgdnMtPnJlYWRfaGFuZGxlcl9leHBlY3QgPSBleHBlY3Rpbmc7Cit9CisKKworLyoKKyAqIENhbGxlZCB0byByZWFkIGEgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBjbGllbnQgc29ja2V0LiBUaGUgZGF0YSBtYXkKKyAqIGJlIHRoZSByYXcgZGF0YSwgb3IgbWF5IG5lZWQgdG8gYmUgZnVydGhlciBkZWNvZGVkIGJ5IFNBU0wuCisgKiBUaGUgZGF0YSB3aWxsIGJlIHJlYWQgZWl0aGVyIHN0cmFpZ2h0IGZyb20gdG8gdGhlIHNvY2tldCwgb3IKKyAqIHJlYWQgdmlhIHRoZSBHTlVUTFMgd3JhcHBlcnMsIGlmIFRMUy9TU0wgZW5jcnlwdGlvbiBpcyBlbmFibGVkCisgKgorICogTkIsIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdG8gaGF2ZSAyIGxheWVycyBvZiBlbmNyeXB0aW9uLAorICogYm90aCBTQVNMLCBhbmQgdGhpcyBUTFMgbGF5ZXIuIEl0IGlzIGhpZ2hseSB1bmxpa2VseSBpbiBwcmFjdGljZQorICogdGhvdWdoLCBzaW5jZSBTQVNMIGVuY3J5cHRpb24gd2lsbCB0eXBpY2FsbHkgYmUgYSBuby1vcCBpZiBUTFMKKyAqIGlzIGFjdGl2ZQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuCisgKiB0aGUgcmVxdWVzdGVkICdkYXRhbGVuJyBpZiB0aGUgc29ja2V0IHdvdWxkIGJsb2NrLiBSZXR1cm5zCisgKiAtMSBvbiBlcnJvciwgYW5kIGRpc2Nvbm5lY3RzIHRoZSBjbGllbnQgc29ja2V0LgorICovCitsb25nIHZuY19jbGllbnRfcmVhZF9idWYoVm5jU3RhdGUgKnZzLCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YWxlbikKK3sKKyAgICBsb25nIHJldDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIGlmICh2cy0+dGxzLnNlc3Npb24pIHsKKyAgICAgICAgcmV0ID0gZ251dGxzX3JlYWQodnMtPnRscy5zZXNzaW9uLCBkYXRhLCBkYXRhbGVuKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gR05VVExTX0VfQUdBSU4pCisgICAgICAgICAgICAgICAgZXJybm8gPSBFQUdBSU47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisgICAgICAgIHJldCA9IHJlY3YodnMtPmNzb2NrLCAodm9pZCAqKWRhdGEsIGRhdGFsZW4sIDApOworICAgIFZOQ19ERUJVRygiUmVhZCB3aXJlICVwICV6ZCAtPiAlbGRcbiIsIGRhdGEsIGRhdGFsZW4sIHJldCk7CisgICAgcmV0dXJuIHZuY19jbGllbnRfaW9fZXJyb3IodnMsIHJldCwgc29ja2V0X2Vycm9yKCkpOworfQorCisKKy8qCisgKiBDYWxsZWQgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGNsaWVudCBzb2NrZXQgdG8gdGhlIGlucHV0IGJ1ZmZlciwKKyAqIHdoZW4gbm90IHVzaW5nIGFueSBTQVNMIFNTRiBlbmNyeXB0aW9uIGxheWVycy4gV2lsbCByZWFkIGFzIG11Y2gKKyAqIGRhdGEgYXMgcG9zc2libGUgd2l0aG91dCBibG9ja2luZy4KKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBvbiBlcnJvciwgYW5kCisgKiBkaXNjb25uZWN0cyB0aGUgY2xpZW50IHNvY2tldC4KKyAqLworc3RhdGljIGxvbmcgdm5jX2NsaWVudF9yZWFkX3BsYWluKFZuY1N0YXRlICp2cykKK3sKKyAgICBpbnQgcmV0OworICAgIFZOQ19ERUJVRygiUmVhZCBwbGFpbiAlcCBzaXplICV6ZCBvZmZzZXQgJXpkXG4iLAorICAgICAgICAgICAgICB2cy0+aW5wdXQuYnVmZmVyLCB2cy0+aW5wdXQuY2FwYWNpdHksIHZzLT5pbnB1dC5vZmZzZXQpOworICAgIGJ1ZmZlcl9yZXNlcnZlKCZ2cy0+aW5wdXQsIDQwOTYpOworICAgIHJldCA9IHZuY19jbGllbnRfcmVhZF9idWYodnMsIGJ1ZmZlcl9lbmQoJnZzLT5pbnB1dCksIDQwOTYpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB2cy0+aW5wdXQub2Zmc2V0ICs9IHJldDsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBGaXJzdCBmdW5jdGlvbiBjYWxsZWQgd2hlbmV2ZXIgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGJlIHJlYWQgZnJvbQorICogdGhlIGNsaWVudCBzb2NrZXQuIFdpbGwgZGVsZWdhdGUgYWN0dWFsIHdvcmsgYWNjb3JkaW5nIHRvIHdoZXRoZXIKKyAqIFNBU0wgU1NGIGxheWVycyBhcmUgZW5hYmxlZCAodGh1cyByZXF1aXJpbmcgZGVjcnlwdGlvbiBjYWxscykKKyAqLwordm9pZCB2bmNfY2xpZW50X3JlYWQodm9pZCAqb3BhcXVlKQoreworICAgIFZuY1N0YXRlICp2cyA9IG9wYXF1ZTsKKyAgICBsb25nIHJldDsKKworI2lmZGVmIENPTkZJR19WTkNfU0FTTAorICAgIGlmICh2cy0+c2FzbC5jb25uICYmIHZzLT5zYXNsLnJ1blNTRikKKyAgICAgICAgcmV0ID0gdm5jX2NsaWVudF9yZWFkX3Nhc2wodnMpOworICAgIGVsc2UKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1NBU0wgKi8KKyAgICAgICAgcmV0ID0gdm5jX2NsaWVudF9yZWFkX3BsYWluKHZzKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBpZiAodnMtPmNzb2NrID09IC0xKQorICAgICAgICAgICAgdm5jX2Rpc2Nvbm5lY3RfZmluaXNoKHZzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICh2cy0+cmVhZF9oYW5kbGVyICYmIHZzLT5pbnB1dC5vZmZzZXQgPj0gdnMtPnJlYWRfaGFuZGxlcl9leHBlY3QpIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHZzLT5yZWFkX2hhbmRsZXJfZXhwZWN0OworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIHJldCA9IHZzLT5yZWFkX2hhbmRsZXIodnMsIHZzLT5pbnB1dC5idWZmZXIsIGxlbik7CisgICAgICAgIGlmICh2cy0+Y3NvY2sgPT0gLTEpIHsKKyAgICAgICAgICAgIHZuY19kaXNjb25uZWN0X2ZpbmlzaCh2cyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgbWVtbW92ZSh2cy0+aW5wdXQuYnVmZmVyLCB2cy0+aW5wdXQuYnVmZmVyICsgbGVuLCAodnMtPmlucHV0Lm9mZnNldCAtIGxlbikpOworICAgICAgICAgICAgdnMtPmlucHV0Lm9mZnNldCAtPSBsZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2cy0+cmVhZF9oYW5kbGVyX2V4cGVjdCA9IHJldDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB2bmNfd3JpdGUoVm5jU3RhdGUgKnZzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIGJ1ZmZlcl9yZXNlcnZlKCZ2cy0+b3V0cHV0LCBsZW4pOworCisgICAgaWYgKHZzLT5jc29jayAhPSAtMSAmJiBidWZmZXJfZW1wdHkoJnZzLT5vdXRwdXQpKSB7CisgICAgICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHZzLT5jc29jaywgTlVMTCwgdm5jX2NsaWVudF9yZWFkLCB2bmNfY2xpZW50X3dyaXRlLCB2cyk7CisgICAgfQorCisgICAgYnVmZmVyX2FwcGVuZCgmdnMtPm91dHB1dCwgZGF0YSwgbGVuKTsKK30KKwordm9pZCB2bmNfd3JpdGVfczMyKFZuY1N0YXRlICp2cywgaW50MzJfdCB2YWx1ZSkKK3sKKyAgICB2bmNfd3JpdGVfdTMyKHZzLCAqKHVpbnQzMl90ICopJnZhbHVlKTsKK30KKwordm9pZCB2bmNfd3JpdGVfdTMyKFZuY1N0YXRlICp2cywgdWludDMyX3QgdmFsdWUpCit7CisgICAgdWludDhfdCBidWZbNF07CisKKyAgICBidWZbMF0gPSAodmFsdWUgPj4gMjQpICYgMHhGRjsKKyAgICBidWZbMV0gPSAodmFsdWUgPj4gMTYpICYgMHhGRjsKKyAgICBidWZbMl0gPSAodmFsdWUgPj4gIDgpICYgMHhGRjsKKyAgICBidWZbM10gPSB2YWx1ZSAmIDB4RkY7CisKKyAgICB2bmNfd3JpdGUodnMsIGJ1ZiwgNCk7Cit9CisKK3ZvaWQgdm5jX3dyaXRlX3UxNihWbmNTdGF0ZSAqdnMsIHVpbnQxNl90IHZhbHVlKQoreworICAgIHVpbnQ4X3QgYnVmWzJdOworCisgICAgYnVmWzBdID0gKHZhbHVlID4+IDgpICYgMHhGRjsKKyAgICBidWZbMV0gPSB2YWx1ZSAmIDB4RkY7CisKKyAgICB2bmNfd3JpdGUodnMsIGJ1ZiwgMik7Cit9CisKK3ZvaWQgdm5jX3dyaXRlX3U4KFZuY1N0YXRlICp2cywgdWludDhfdCB2YWx1ZSkKK3sKKyAgICB2bmNfd3JpdGUodnMsIChjaGFyICopJnZhbHVlLCAxKTsKK30KKwordm9pZCB2bmNfZmx1c2goVm5jU3RhdGUgKnZzKQoreworICAgIGlmICh2cy0+Y3NvY2sgIT0gLTEgJiYgdnMtPm91dHB1dC5vZmZzZXQpCisgICAgICAgIHZuY19jbGllbnRfd3JpdGUodnMpOworfQorCit1aW50OF90IHJlYWRfdTgodWludDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gZGF0YVtvZmZzZXRdOworfQorCit1aW50MTZfdCByZWFkX3UxNih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAoKGRhdGFbb2Zmc2V0XSAmIDB4RkYpIDw8IDgpIHwgKGRhdGFbb2Zmc2V0ICsgMV0gJiAweEZGKTsKK30KKworaW50MzJfdCByZWFkX3MzMih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KQoreworICAgIHJldHVybiAoaW50MzJfdCkoKGRhdGFbb2Zmc2V0XSA8PCAyNCkgfCAoZGF0YVtvZmZzZXQgKyAxXSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgKGRhdGFbb2Zmc2V0ICsgMl0gPDwgOCkgfCBkYXRhW29mZnNldCArIDNdKTsKK30KKwordWludDMyX3QgcmVhZF91MzIodWludDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCkKK3sKKyAgICByZXR1cm4gKChkYXRhW29mZnNldF0gPDwgMjQpIHwgKGRhdGFbb2Zmc2V0ICsgMV0gPDwgMTYpIHwKKyAgICAgICAgICAgIChkYXRhW29mZnNldCArIDJdIDw8IDgpIHwgZGF0YVtvZmZzZXQgKyAzXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsaWVudF9jdXRfdGV4dChWbmNTdGF0ZSAqdnMsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKnRleHQpCit7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3BvaW50ZXJfdHlwZV9jaGFuZ2UoVm5jU3RhdGUgKnZzLCBpbnQgYWJzb2x1dGUpCit7CisgICAgaWYgKHZuY19oYXNfZmVhdHVyZSh2cywgVk5DX0ZFQVRVUkVfUE9JTlRFUl9UWVBFX0NIQU5HRSkgJiYgdnMtPmFic29sdXRlICE9IGFic29sdXRlKSB7CisgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7CisgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7CisgICAgICAgIHZuY193cml0ZV91MTYodnMsIDEpOworICAgICAgICB2bmNfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCBhYnNvbHV0ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc19nZXRfd2lkdGgodnMtPmRzKSwgZHNfZ2V0X2hlaWdodCh2cy0+ZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOQ19FTkNPRElOR19QT0lOVEVSX1RZUEVfQ0hBTkdFKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICB9CisgICAgdnMtPmFic29sdXRlID0gYWJzb2x1dGU7Cit9CisKK3N0YXRpYyB2b2lkIHBvaW50ZXJfZXZlbnQoVm5jU3RhdGUgKnZzLCBpbnQgYnV0dG9uX21hc2ssIGludCB4LCBpbnQgeSkKK3sKKyAgICBpbnQgYnV0dG9ucyA9IDA7CisgICAgaW50IGR6ID0gMDsKKworICAgIGlmIChidXR0b25fbWFzayAmIDB4MDEpCisgICAgICAgIGJ1dHRvbnMgfD0gTU9VU0VfRVZFTlRfTEJVVFRPTjsKKyAgICBpZiAoYnV0dG9uX21hc2sgJiAweDAyKQorICAgICAgICBidXR0b25zIHw9IE1PVVNFX0VWRU5UX01CVVRUT047CisgICAgaWYgKGJ1dHRvbl9tYXNrICYgMHgwNCkKKyAgICAgICAgYnV0dG9ucyB8PSBNT1VTRV9FVkVOVF9SQlVUVE9OOworICAgIGlmIChidXR0b25fbWFzayAmIDB4MDgpCisgICAgICAgIGR6ID0gLTE7CisgICAgaWYgKGJ1dHRvbl9tYXNrICYgMHgxMCkKKyAgICAgICAgZHogPSAxOworCisgICAgaWYgKHZzLT5hYnNvbHV0ZSkgeworICAgICAgICBrYmRfbW91c2VfZXZlbnQoeCAqIDB4N0ZGRiAvIChkc19nZXRfd2lkdGgodnMtPmRzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgeSAqIDB4N0ZGRiAvIChkc19nZXRfaGVpZ2h0KHZzLT5kcykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR6LCBidXR0b25zKTsKKyAgICB9IGVsc2UgaWYgKHZuY19oYXNfZmVhdHVyZSh2cywgVk5DX0ZFQVRVUkVfUE9JTlRFUl9UWVBFX0NIQU5HRSkpIHsKKyAgICAgICAgeCAtPSAweDdGRkY7CisgICAgICAgIHkgLT0gMHg3RkZGOworCisgICAgICAgIGtiZF9tb3VzZV9ldmVudCh4LCB5LCBkeiwgYnV0dG9ucyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZzLT5sYXN0X3ggIT0gLTEpCisgICAgICAgICAgICBrYmRfbW91c2VfZXZlbnQoeCAtIHZzLT5sYXN0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtIHZzLT5sYXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHosIGJ1dHRvbnMpOworICAgICAgICB2cy0+bGFzdF94ID0geDsKKyAgICAgICAgdnMtPmxhc3RfeSA9IHk7CisgICAgfQorCisgICAgY2hlY2tfcG9pbnRlcl90eXBlX2NoYW5nZSh2cywga2JkX21vdXNlX2lzX2Fic29sdXRlKCkpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9rZXlzKFZuY1N0YXRlICp2cykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAodnMtPm1vZGlmaWVyc19zdGF0ZVtpXSkgeworICAgICAgICAgICAgaWYgKGkgJiAweDgwKQorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZSgweGUwKTsKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShpIHwgMHg4MCk7CisgICAgICAgICAgICB2cy0+bW9kaWZpZXJzX3N0YXRlW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlc3Nfa2V5KFZuY1N0YXRlICp2cywgaW50IGtleXN5bSkKK3sKKyAgICBrYmRfcHV0X2tleWNvZGUoa2V5c3ltMnNjYW5jb2RlKHZzLT52ZC0+a2JkX2xheW91dCwga2V5c3ltKSAmIDB4N2YpOworICAgIGtiZF9wdXRfa2V5Y29kZShrZXlzeW0yc2NhbmNvZGUodnMtPnZkLT5rYmRfbGF5b3V0LCBrZXlzeW0pIHwgMHg4MCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2tleV9ldmVudChWbmNTdGF0ZSAqdnMsIGludCBkb3duLCBpbnQga2V5Y29kZSwgaW50IHN5bSkKK3sKKyAgICAvKiBRRU1VIGNvbnNvbGUgc3dpdGNoICovCisgICAgc3dpdGNoKGtleWNvZGUpIHsKKyAgICBjYXNlIDB4MmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IFNoaWZ0ICovCisgICAgY2FzZSAweDM2OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgU2hpZnQgKi8KKyAgICBjYXNlIDB4MWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IENUUkwgKi8KKyAgICBjYXNlIDB4OWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBDVFJMICovCisgICAgY2FzZSAweDM4OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBBTFQgKi8KKyAgICBjYXNlIDB4Yjg6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBBTFQgKi8KKyAgICAgICAgaWYgKGRvd24pCisgICAgICAgICAgICB2cy0+bW9kaWZpZXJzX3N0YXRlW2tleWNvZGVdID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnMtPm1vZGlmaWVyc19zdGF0ZVtrZXljb2RlXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMiAuLi4gMHgwYTogLyogJzEnIHRvICc5JyBrZXlzICovCisgICAgICAgIGlmIChkb3duICYmIHZzLT5tb2RpZmllcnNfc3RhdGVbMHgxZF0gJiYgdnMtPm1vZGlmaWVyc19zdGF0ZVsweDM4XSkgeworICAgICAgICAgICAgLyogUmVzZXQgdGhlIG1vZGlmaWVycyBzZW50IHRvIHRoZSBjdXJyZW50IGNvbnNvbGUgKi8KKyAgICAgICAgICAgIHJlc2V0X2tleXModnMpOworICAgICAgICAgICAgY29uc29sZV9zZWxlY3Qoa2V5Y29kZSAtIDB4MDIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgzYTogICAgICAgICAgICAgICAgICAgICAgICAvKiBDYXBzTG9jayAqLworICAgIGNhc2UgMHg0NTogICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1Mb2NrICovCisgICAgICAgIGlmICghZG93bikKKyAgICAgICAgICAgIHZzLT5tb2RpZmllcnNfc3RhdGVba2V5Y29kZV0gXj0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGtleWNvZGVfaXNfa2V5cGFkKHZzLT52ZC0+a2JkX2xheW91dCwga2V5Y29kZSkpIHsKKyAgICAgICAgLyogSWYgdGhlIG51bWxvY2sgc3RhdGUgbmVlZHMgdG8gY2hhbmdlIHRoZW4gc2ltdWxhdGUgYW4gYWRkaXRpb25hbAorICAgICAgICAgICBrZXlwcmVzcyBiZWZvcmUgc2VuZGluZyB0aGlzIG9uZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIHVzZXIKKyAgICAgICAgICAgdG9nZ2xlcyBudW1sb2NrIGF3YXkgZnJvbSB0aGUgVk5DIHdpbmRvdy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGtleXN5bV9pc19udW1sb2NrKHZzLT52ZC0+a2JkX2xheW91dCwgc3ltICYgMHhGRkZGKSkgeworICAgICAgICAgICAgaWYgKCF2cy0+bW9kaWZpZXJzX3N0YXRlWzB4NDVdKSB7CisgICAgICAgICAgICAgICAgdnMtPm1vZGlmaWVyc19zdGF0ZVsweDQ1XSA9IDE7CisgICAgICAgICAgICAgICAgcHJlc3Nfa2V5KHZzLCAweGZmN2YpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHZzLT5tb2RpZmllcnNfc3RhdGVbMHg0NV0pIHsKKyAgICAgICAgICAgICAgICB2cy0+bW9kaWZpZXJzX3N0YXRlWzB4NDVdID0gMDsKKyAgICAgICAgICAgICAgICBwcmVzc19rZXkodnMsIDB4ZmY3Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfZ3JhcGhpY19jb25zb2xlKCkpIHsKKyAgICAgICAgaWYgKGtleWNvZGUgJiAweDgwKQorICAgICAgICAgICAga2JkX3B1dF9rZXljb2RlKDB4ZTApOworICAgICAgICBpZiAoZG93bikKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShrZXljb2RlICYgMHg3Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGtiZF9wdXRfa2V5Y29kZShrZXljb2RlIHwgMHg4MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUUVNVSBjb25zb2xlIGVtdWxhdGlvbiAqLworICAgICAgICBpZiAoZG93bikgeworICAgICAgICAgICAgaW50IG51bWxvY2sgPSB2cy0+bW9kaWZpZXJzX3N0YXRlWzB4NDVdOworICAgICAgICAgICAgc3dpdGNoIChrZXljb2RlKSB7CisgICAgICAgICAgICBjYXNlIDB4MmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IFNoaWZ0ICovCisgICAgICAgICAgICBjYXNlIDB4MzY6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBTaGlmdCAqLworICAgICAgICAgICAgY2FzZSAweDFkOiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBDVFJMICovCisgICAgICAgICAgICBjYXNlIDB4OWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaWdodCBDVFJMICovCisgICAgICAgICAgICBjYXNlIDB4Mzg6ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IEFMVCAqLworICAgICAgICAgICAgY2FzZSAweGI4OiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgQUxUICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Yzg6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfVVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGQwOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX0RPV04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGNiOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX0xFRlQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGNkOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX1JJR0hUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhkMzoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShRRU1VX0tFWV9ERUxFVEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGM3OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX0hPTUUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweGNmOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKFFFTVVfS0VZX0VORCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4Yzk6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oUUVNVV9LRVlfUEFHRVVQKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHhkMToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShRRU1VX0tFWV9QQUdFRE9XTik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHg0NzoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzcnIDogUUVNVV9LRVlfSE9NRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NDg6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0obnVtbG9jayA/ICc4JyA6IFFFTVVfS0VZX1VQKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0OToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzknIDogUUVNVV9LRVlfUEFHRVVQKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0YjoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzQnIDogUUVNVV9LRVlfTEVGVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NGM6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oJzUnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0ZDoKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzYnIDogUUVNVV9LRVlfUklHSFQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDRmOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnMScgOiBRRU1VX0tFWV9FTkQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDUwOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKG51bWxvY2sgPyAnMicgOiBRRU1VX0tFWV9ET1dOKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg1MToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bShudW1sb2NrID8gJzMnIDogUUVNVV9LRVlfUEFHRURPV04pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDUyOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKCcwJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NTM6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0obnVtbG9jayA/ICcuJyA6IFFFTVVfS0VZX0RFTEVURSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMHhiNToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bSgnLycpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDM3OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKCcqJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4NGE6CisgICAgICAgICAgICAgICAga2JkX3B1dF9rZXlzeW0oJy0nKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHg0ZToKKyAgICAgICAgICAgICAgICBrYmRfcHV0X2tleXN5bSgnKycpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDljOgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKCdcbicpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGtiZF9wdXRfa2V5c3ltKHN5bSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGtleV9ldmVudChWbmNTdGF0ZSAqdnMsIGludCBkb3duLCB1aW50MzJfdCBzeW0pCit7CisgICAgaW50IGtleWNvZGU7CisKKyAgICBpZiAoc3ltID49ICdBJyAmJiBzeW0gPD0gJ1onICYmIGlzX2dyYXBoaWNfY29uc29sZSgpKQorICAgICAgICBzeW0gPSBzeW0gLSAnQScgKyAnYSc7CisKKyAgICBrZXljb2RlID0ga2V5c3ltMnNjYW5jb2RlKHZzLT52ZC0+a2JkX2xheW91dCwgc3ltICYgMHhGRkZGKTsKKyAgICBkb19rZXlfZXZlbnQodnMsIGRvd24sIGtleWNvZGUsIHN5bSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4dF9rZXlfZXZlbnQoVm5jU3RhdGUgKnZzLCBpbnQgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ltLCB1aW50MTZfdCBrZXljb2RlKQoreworICAgIC8qIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhIGtleWJvYXJkIGxheW91dCwgYWx3YXlzIHVzZSBpdCAqLworICAgIGlmIChrZXlib2FyZF9sYXlvdXQpCisgICAgICAgIGtleV9ldmVudCh2cywgZG93biwgc3ltKTsKKyAgICBlbHNlCisgICAgICAgIGRvX2tleV9ldmVudCh2cywgZG93biwga2V5Y29kZSwgc3ltKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVidWZmZXJfdXBkYXRlX3JlcXVlc3QoVm5jU3RhdGUgKnZzLCBpbnQgaW5jcmVtZW50YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3NpdGlvbiwgaW50IHlfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgaWYgKHhfcG9zaXRpb24gPiBkc19nZXRfd2lkdGgodnMtPmRzKSkKKyAgICAgICAgeF9wb3NpdGlvbiA9IGRzX2dldF93aWR0aCh2cy0+ZHMpOworICAgIGlmICh5X3Bvc2l0aW9uID4gZHNfZ2V0X2hlaWdodCh2cy0+ZHMpKQorICAgICAgICB5X3Bvc2l0aW9uID0gZHNfZ2V0X2hlaWdodCh2cy0+ZHMpOworICAgIGlmICh4X3Bvc2l0aW9uICsgdyA+PSBkc19nZXRfd2lkdGgodnMtPmRzKSkKKyAgICAgICAgdyA9IGRzX2dldF93aWR0aCh2cy0+ZHMpICAtIHhfcG9zaXRpb247CisgICAgaWYgKHlfcG9zaXRpb24gKyBoID49IGRzX2dldF9oZWlnaHQodnMtPmRzKSkKKyAgICAgICAgaCA9IGRzX2dldF9oZWlnaHQodnMtPmRzKSAtIHlfcG9zaXRpb247CisKKyAgICBpbnQgaTsKKyAgICB2cy0+bmVlZF91cGRhdGUgPSAxOworICAgIGlmICghaW5jcmVtZW50YWwpIHsKKyAgICAgICAgdnMtPmZvcmNlX3VwZGF0ZSA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgICAgIHZuY19zZXRfYml0cyh2cy0+Z3Vlc3QuZGlydHlbeV9wb3NpdGlvbiArIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgIChkc19nZXRfd2lkdGgodnMtPmRzKSAvIDE2KSwgVk5DX0RJUlRZX1dPUkRTKTsKKyAgICAgICAgICAgIHZuY19zZXRfYml0cyh2cy0+c2VydmVyLmRpcnR5W3lfcG9zaXRpb24gKyBpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZHNfZ2V0X3dpZHRoKHZzLT5kcykgLyAxNiksIFZOQ19ESVJUWV9XT1JEUyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXh0X2tleV9ldmVudF9hY2soVm5jU3RhdGUgKnZzKQoreworICAgIHZuY193cml0ZV91OCh2cywgMCk7CisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCAxKTsKKyAgICB2bmNfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCAwLCAwLCBkc19nZXRfd2lkdGgodnMtPmRzKSwgZHNfZ2V0X2hlaWdodCh2cy0+ZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVk5DX0VOQ09ESU5HX0VYVF9LRVlfRVZFTlQpOworICAgIHZuY19mbHVzaCh2cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZXh0X2F1ZGlvX2FjayhWbmNTdGF0ZSAqdnMpCit7CisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICB2bmNfd3JpdGVfdTgodnMsIDApOworICAgIHZuY193cml0ZV91MTYodnMsIDEpOworICAgIHZuY19mcmFtZWJ1ZmZlcl91cGRhdGUodnMsIDAsIDAsIGRzX2dldF93aWR0aCh2cy0+ZHMpLCBkc19nZXRfaGVpZ2h0KHZzLT5kcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWTkNfRU5DT0RJTkdfQVVESU8pOworICAgIHZuY19mbHVzaCh2cyk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9lbmNvZGluZ3MoVm5jU3RhdGUgKnZzLCBpbnQzMl90ICplbmNvZGluZ3MsIHNpemVfdCBuX2VuY29kaW5ncykKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgZW5jID0gMDsKKworICAgIHZuY196bGliX2luaXQodnMpOworICAgIHZzLT5mZWF0dXJlcyA9IDA7CisgICAgdnMtPnZuY19lbmNvZGluZyA9IDA7CisgICAgdnMtPnRpZ2h0X2NvbXByZXNzaW9uID0gOTsKKyAgICB2cy0+dGlnaHRfcXVhbGl0eSA9IDk7CisgICAgdnMtPmFic29sdXRlID0gLTE7CisKKyAgICBmb3IgKGkgPSBuX2VuY29kaW5ncyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGVuYyA9IGVuY29kaW5nc1tpXTsKKyAgICAgICAgc3dpdGNoIChlbmMpIHsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfUkFXOgorICAgICAgICAgICAgdnMtPnZuY19lbmNvZGluZyA9IGVuYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19DT1BZUkVDVDoKKyAgICAgICAgICAgIHZzLT5mZWF0dXJlcyB8PSBWTkNfRkVBVFVSRV9DT1BZUkVDVF9NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX0hFWFRJTEU6CisgICAgICAgICAgICB2cy0+ZmVhdHVyZXMgfD0gVk5DX0ZFQVRVUkVfSEVYVElMRV9NQVNLOworICAgICAgICAgICAgdnMtPnZuY19lbmNvZGluZyA9IGVuYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19aTElCOgorICAgICAgICAgICAgdnMtPmZlYXR1cmVzIHw9IFZOQ19GRUFUVVJFX1pMSUJfTUFTSzsKKyAgICAgICAgICAgIHZzLT52bmNfZW5jb2RpbmcgPSBlbmM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfREVTS1RPUFJFU0laRToKKyAgICAgICAgICAgIHZzLT5mZWF0dXJlcyB8PSBWTkNfRkVBVFVSRV9SRVNJWkVfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19QT0lOVEVSX1RZUEVfQ0hBTkdFOgorICAgICAgICAgICAgdnMtPmZlYXR1cmVzIHw9IFZOQ19GRUFUVVJFX1BPSU5URVJfVFlQRV9DSEFOR0VfTUFTSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZOQ19FTkNPRElOR19FWFRfS0VZX0VWRU5UOgorICAgICAgICAgICAgc2VuZF9leHRfa2V5X2V2ZW50X2Fjayh2cyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWTkNfRU5DT0RJTkdfQVVESU86CisgICAgICAgICAgICBzZW5kX2V4dF9hdWRpb19hY2sodnMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1dNVmk6CisgICAgICAgICAgICB2cy0+ZmVhdHVyZXMgfD0gVk5DX0ZFQVRVUkVfV01WSV9NQVNLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX0NPTVBSRVNTTEVWRUwwIC4uLiBWTkNfRU5DT0RJTkdfQ09NUFJFU1NMRVZFTDAgKyA5OgorICAgICAgICAgICAgdnMtPnRpZ2h0X2NvbXByZXNzaW9uID0gKGVuYyAmIDB4MEYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVk5DX0VOQ09ESU5HX1FVQUxJVFlMRVZFTDAgLi4uIFZOQ19FTkNPRElOR19RVUFMSVRZTEVWRUwwICsgOToKKyAgICAgICAgICAgIHZzLT50aWdodF9xdWFsaXR5ID0gKGVuYyAmIDB4MEYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWTkNfREVCVUcoIlVua25vd24gZW5jb2Rpbmc6ICVkICgweCUuOHgpOiAlZFxuIiwgaSwgZW5jLCBlbmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja19wb2ludGVyX3R5cGVfY2hhbmdlKHZzLCBrYmRfbW91c2VfaXNfYWJzb2x1dGUoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbF9jb252ZXJzaW9uKFZuY1N0YXRlICp2cykKK3sKKyAgICBpZiAoKHZzLT5jbGllbnRkcy5mbGFncyAmIFFFTVVfQklHX0VORElBTl9GTEFHKSA9PQorICAgICAgICAodnMtPmRzLT5zdXJmYWNlLT5mbGFncyAmIFFFTVVfQklHX0VORElBTl9GTEFHKSAmJgorICAgICAgICAhbWVtY21wKCYodnMtPmNsaWVudGRzLnBmKSwgJih2cy0+ZHMtPnN1cmZhY2UtPnBmKSwgc2l6ZW9mKFBpeGVsRm9ybWF0KSkpIHsKKyAgICAgICAgdnMtPndyaXRlX3BpeGVscyA9IHZuY193cml0ZV9waXhlbHNfY29weTsKKyAgICAgICAgc3dpdGNoICh2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsKSB7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfMTY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIHZzLT5zZW5kX2hleHRpbGVfdGlsZSA9IHNlbmRfaGV4dGlsZV90aWxlXzMyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdnMtPndyaXRlX3BpeGVscyA9IHZuY193cml0ZV9waXhlbHNfZ2VuZXJpYzsKKyAgICAgICAgc3dpdGNoICh2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsKSB7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfZ2VuZXJpY184OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV9nZW5lcmljXzE2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV9nZW5lcmljXzMyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcGl4ZWxfZm9ybWF0KFZuY1N0YXRlICp2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaWdfZW5kaWFuX2ZsYWcsIGludCB0cnVlX2NvbG9yX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWRfbWF4LCBpbnQgZ3JlZW5fbWF4LCBpbnQgYmx1ZV9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWRfc2hpZnQsIGludCBncmVlbl9zaGlmdCwgaW50IGJsdWVfc2hpZnQpCit7CisgICAgaWYgKCF0cnVlX2NvbG9yX2ZsYWcpIHsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2cy0+Y2xpZW50ZHMgPSAqKHZzLT5ndWVzdC5kcyk7CisgICAgdnMtPmNsaWVudGRzLnBmLnJtYXggPSByZWRfbWF4OworICAgIGNvdW50X2JpdHModnMtPmNsaWVudGRzLnBmLnJiaXRzLCByZWRfbWF4KTsKKyAgICB2cy0+Y2xpZW50ZHMucGYucnNoaWZ0ID0gcmVkX3NoaWZ0OworICAgIHZzLT5jbGllbnRkcy5wZi5ybWFzayA9IHJlZF9tYXggPDwgcmVkX3NoaWZ0OworICAgIHZzLT5jbGllbnRkcy5wZi5nbWF4ID0gZ3JlZW5fbWF4OworICAgIGNvdW50X2JpdHModnMtPmNsaWVudGRzLnBmLmdiaXRzLCBncmVlbl9tYXgpOworICAgIHZzLT5jbGllbnRkcy5wZi5nc2hpZnQgPSBncmVlbl9zaGlmdDsKKyAgICB2cy0+Y2xpZW50ZHMucGYuZ21hc2sgPSBncmVlbl9tYXggPDwgZ3JlZW5fc2hpZnQ7CisgICAgdnMtPmNsaWVudGRzLnBmLmJtYXggPSBibHVlX21heDsKKyAgICBjb3VudF9iaXRzKHZzLT5jbGllbnRkcy5wZi5iYml0cywgYmx1ZV9tYXgpOworICAgIHZzLT5jbGllbnRkcy5wZi5ic2hpZnQgPSBibHVlX3NoaWZ0OworICAgIHZzLT5jbGllbnRkcy5wZi5ibWFzayA9IGJsdWVfbWF4IDw8IGJsdWVfc2hpZnQ7CisgICAgdnMtPmNsaWVudGRzLnBmLmJpdHNfcGVyX3BpeGVsID0gYml0c19wZXJfcGl4ZWw7CisgICAgdnMtPmNsaWVudGRzLnBmLmJ5dGVzX3Blcl9waXhlbCA9IGJpdHNfcGVyX3BpeGVsIC8gODsKKyAgICB2cy0+Y2xpZW50ZHMucGYuZGVwdGggPSBiaXRzX3Blcl9waXhlbCA9PSAzMiA/IDI0IDogYml0c19wZXJfcGl4ZWw7CisgICAgdnMtPmNsaWVudGRzLmZsYWdzID0gYmlnX2VuZGlhbl9mbGFnID8gUUVNVV9CSUdfRU5ESUFOX0ZMQUcgOiAweDAwOworCisgICAgc2V0X3BpeGVsX2NvbnZlcnNpb24odnMpOworCisgICAgdmdhX2h3X2ludmFsaWRhdGUoKTsKKyAgICB2Z2FfaHdfdXBkYXRlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHBpeGVsX2Zvcm1hdF9tZXNzYWdlIChWbmNTdGF0ZSAqdnMpIHsKKyAgICBjaGFyIHBhZFszXSA9IHsgMCwgMCwgMCB9OworCisgICAgdm5jX3dyaXRlX3U4KHZzLCB2cy0+ZHMtPnN1cmZhY2UtPnBmLmJpdHNfcGVyX3BpeGVsKTsgLyogYml0cy1wZXItcGl4ZWwgKi8KKyAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuZGVwdGgpOyAvKiBkZXB0aCAqLworCisjaWZkZWYgSE9TVF9XT1JEU19CSUdFTkRJQU4KKyAgICB2bmNfd3JpdGVfdTgodnMsIDEpOyAgICAgICAgICAgICAvKiBiaWctZW5kaWFuLWZsYWcgKi8KKyNlbHNlCisgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsgICAgICAgICAgICAgLyogYmlnLWVuZGlhbi1mbGFnICovCisjZW5kaWYKKyAgICB2bmNfd3JpdGVfdTgodnMsIDEpOyAgICAgICAgICAgICAvKiB0cnVlLWNvbG9yLWZsYWcgKi8KKyAgICB2bmNfd3JpdGVfdTE2KHZzLCB2cy0+ZHMtPnN1cmZhY2UtPnBmLnJtYXgpOyAgICAgLyogcmVkLW1heCAqLworICAgIHZuY193cml0ZV91MTYodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYuZ21heCk7ICAgICAvKiBncmVlbi1tYXggKi8KKyAgICB2bmNfd3JpdGVfdTE2KHZzLCB2cy0+ZHMtPnN1cmZhY2UtPnBmLmJtYXgpOyAgICAgLyogYmx1ZS1tYXggKi8KKyAgICB2bmNfd3JpdGVfdTgodnMsIHZzLT5kcy0+c3VyZmFjZS0+cGYucnNoaWZ0KTsgICAgLyogcmVkLXNoaWZ0ICovCisgICAgdm5jX3dyaXRlX3U4KHZzLCB2cy0+ZHMtPnN1cmZhY2UtPnBmLmdzaGlmdCk7ICAgIC8qIGdyZWVuLXNoaWZ0ICovCisgICAgdm5jX3dyaXRlX3U4KHZzLCB2cy0+ZHMtPnN1cmZhY2UtPnBmLmJzaGlmdCk7ICAgIC8qIGJsdWUtc2hpZnQgKi8KKyAgICBpZiAodnMtPmRzLT5zdXJmYWNlLT5wZi5iaXRzX3Blcl9waXhlbCA9PSAzMikKKyAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfMzI7CisgICAgZWxzZSBpZiAodnMtPmRzLT5zdXJmYWNlLT5wZi5iaXRzX3Blcl9waXhlbCA9PSAxNikKKyAgICAgICAgdnMtPnNlbmRfaGV4dGlsZV90aWxlID0gc2VuZF9oZXh0aWxlX3RpbGVfMTY7CisgICAgZWxzZSBpZiAodnMtPmRzLT5zdXJmYWNlLT5wZi5iaXRzX3Blcl9waXhlbCA9PSA4KQorICAgICAgICB2cy0+c2VuZF9oZXh0aWxlX3RpbGUgPSBzZW5kX2hleHRpbGVfdGlsZV84OworICAgIHZzLT5jbGllbnRkcyA9ICoodnMtPmRzLT5zdXJmYWNlKTsKKyAgICB2cy0+Y2xpZW50ZHMuZmxhZ3MgJj0gflFFTVVfQUxMT0NBVEVEX0ZMQUc7CisgICAgdnMtPndyaXRlX3BpeGVscyA9IHZuY193cml0ZV9waXhlbHNfY29weTsKKworICAgIHZuY193cml0ZSh2cywgcGFkLCAzKTsgICAgICAgICAgIC8qIHBhZGRpbmcgKi8KK30KKworc3RhdGljIHZvaWQgdm5jX2RweV9zZXRkYXRhKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgLyogV2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyAqLworfQorCitzdGF0aWMgdm9pZCB2bmNfY29sb3JkZXB0aChWbmNTdGF0ZSAqdnMpCit7CisgICAgaWYgKHZuY19oYXNfZmVhdHVyZSh2cywgVk5DX0ZFQVRVUkVfV01WSSkpIHsKKyAgICAgICAgLyogU2VuZGluZyBhIFdNVmkgbWVzc2FnZSB0byBub3RpZnkgdGhlIGNsaWVudCovCisgICAgICAgIHZuY193cml0ZV91OCh2cywgMCk7ICAvKiBtc2cgaWQgKi8KKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAwKTsKKyAgICAgICAgdm5jX3dyaXRlX3UxNih2cywgMSk7IC8qIG51bWJlciBvZiByZWN0cyAqLworICAgICAgICB2bmNfZnJhbWVidWZmZXJfdXBkYXRlKHZzLCAwLCAwLCBkc19nZXRfd2lkdGgodnMtPmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc19nZXRfaGVpZ2h0KHZzLT5kcyksIFZOQ19FTkNPRElOR19XTVZpKTsKKyAgICAgICAgcGl4ZWxfZm9ybWF0X21lc3NhZ2UodnMpOworICAgICAgICB2bmNfZmx1c2godnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9waXhlbF9jb252ZXJzaW9uKHZzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHJvdG9jb2xfY2xpZW50X21zZyhWbmNTdGF0ZSAqdnMsIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW4pCit7CisgICAgaW50IGk7CisgICAgdWludDE2X3QgbGltaXQ7CisKKyAgICBzd2l0Y2ggKGRhdGFbMF0pIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChsZW4gPT0gMSkKKyAgICAgICAgICAgIHJldHVybiAyMDsKKworICAgICAgICBzZXRfcGl4ZWxfZm9ybWF0KHZzLCByZWFkX3U4KGRhdGEsIDQpLCByZWFkX3U4KGRhdGEsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTgoZGF0YSwgNiksIHJlYWRfdTgoZGF0YSwgNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91MTYoZGF0YSwgOCksIHJlYWRfdTE2KGRhdGEsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3UxNihkYXRhLCAxMiksIHJlYWRfdTgoZGF0YSwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTgoZGF0YSwgMTUpLCByZWFkX3U4KGRhdGEsIDE2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIDQ7CisKKyAgICAgICAgaWYgKGxlbiA9PSA0KSB7CisgICAgICAgICAgICBsaW1pdCA9IHJlYWRfdTE2KGRhdGEsIDIpOworICAgICAgICAgICAgaWYgKGxpbWl0ID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gNCArIChsaW1pdCAqIDQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGxpbWl0ID0gcmVhZF91MTYoZGF0YSwgMik7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsID0gcmVhZF9zMzIoZGF0YSwgNCArIChpICogNCkpOworICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyA0ICsgKGkgKiA0KSwgJnZhbCwgc2l6ZW9mKHZhbCkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0X2VuY29kaW5ncyh2cywgKGludDMyX3QgKikoZGF0YSArIDQpLCBsaW1pdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIDEwOworCisgICAgICAgIGZyYW1lYnVmZmVyX3VwZGF0ZV9yZXF1ZXN0KHZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3U4KGRhdGEsIDEpLCByZWFkX3UxNihkYXRhLCAyKSwgcmVhZF91MTYoZGF0YSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTE2KGRhdGEsIDYpLCByZWFkX3UxNihkYXRhLCA4KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIDg7CisKKyAgICAgICAga2V5X2V2ZW50KHZzLCByZWFkX3U4KGRhdGEsIDEpLCByZWFkX3UzMihkYXRhLCA0KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGxlbiA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIDY7CisKKyAgICAgICAgcG9pbnRlcl9ldmVudCh2cywgcmVhZF91OChkYXRhLCAxKSwgcmVhZF91MTYoZGF0YSwgMiksIHJlYWRfdTE2KGRhdGEsIDQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gODsKKworICAgICAgICBpZiAobGVuID09IDgpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGRsZW4gPSByZWFkX3UzMihkYXRhLCA0KTsKKyAgICAgICAgICAgIGlmIChkbGVuID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gOCArIGRsZW47CisgICAgICAgIH0KKworICAgICAgICBjbGllbnRfY3V0X3RleHQodnMsIHJlYWRfdTMyKGRhdGEsIDQpLCBkYXRhICsgOCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU1OgorICAgICAgICBpZiAobGVuID09IDEpCisgICAgICAgICAgICByZXR1cm4gMjsKKworICAgICAgICBzd2l0Y2ggKHJlYWRfdTgoZGF0YSwgMSkpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHJldHVybiAxMjsKKworICAgICAgICAgICAgZXh0X2tleV9ldmVudCh2cywgcmVhZF91MTYoZGF0YSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdTMyKGRhdGEsIDQpLCByZWFkX3UzMihkYXRhLCA4KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgICAgIHJldHVybiA0OworCisgICAgICAgICAgICBzd2l0Y2ggKHJlYWRfdTE2IChkYXRhLCAyKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGF1ZGlvX2FkZCh2cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgYXVkaW9fZGVsKHZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlYWRfdTgoZGF0YSwgNCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHZzLT5hcy5mbXQgPSBBVURfRk1UX1U4OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHZzLT5hcy5mbXQgPSBBVURfRk1UX1M4OyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHZzLT5hcy5mbXQgPSBBVURfRk1UX1UxNjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOiB2cy0+YXMuZm10ID0gQVVEX0ZNVF9TMTY7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogdnMtPmFzLmZtdCA9IEFVRF9GTVRfVTMyOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDU6IHZzLT5hcy5mbXQgPSBBVURfRk1UX1MzMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGF1ZGlvIGZvcm1hdCAlZFxuIiwgcmVhZF91OChkYXRhLCA0KSk7CisgICAgICAgICAgICAgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdnMtPmFzLm5jaGFubmVscyA9IHJlYWRfdTgoZGF0YSwgNSk7CisgICAgICAgICAgICAgICAgaWYgKHZzLT5hcy5uY2hhbm5lbHMgIT0gMSAmJiB2cy0+YXMubmNoYW5uZWxzICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGF1ZGlvIGNoYW5uZWwgY29vdW50ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91OChkYXRhLCA1KSk7CisgICAgICAgICAgICAgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdnMtPmFzLmZyZXEgPSByZWFkX3UzMihkYXRhLCA2KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmICgiSW52YWxpZCBhdWRpbyBtZXNzYWdlICVkXG4iLCByZWFkX3U4KGRhdGEsIDQpKTsKKyAgICAgICAgICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIk1zZzogJWRcbiIsIHJlYWRfdTE2KGRhdGEsIDApKTsKKyAgICAgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJNc2c6ICVkXG4iLCBkYXRhWzBdKTsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZuY19yZWFkX3doZW4odnMsIHByb3RvY29sX2NsaWVudF9tc2csIDEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb3RvY29sX2NsaWVudF9pbml0KFZuY1N0YXRlICp2cywgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBpbnQgc2l6ZTsKKworICAgIHZuY193cml0ZV91MTYodnMsIGRzX2dldF93aWR0aCh2cy0+ZHMpKTsKKyAgICB2bmNfd3JpdGVfdTE2KHZzLCBkc19nZXRfaGVpZ2h0KHZzLT5kcykpOworCisgICAgcGl4ZWxfZm9ybWF0X21lc3NhZ2UodnMpOworCisgICAgaWYgKHFlbXVfbmFtZSkKKyAgICAgICAgc2l6ZSA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJRRU1VICglcykiLCBxZW11X25hbWUpOworICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJRRU1VIik7CisKKyAgICB2bmNfd3JpdGVfdTMyKHZzLCBzaXplKTsKKyAgICB2bmNfd3JpdGUodnMsIGJ1Ziwgc2l6ZSk7CisgICAgdm5jX2ZsdXNoKHZzKTsKKworICAgIHZuY19yZWFkX3doZW4odnMsIHByb3RvY29sX2NsaWVudF9tc2csIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhcnRfY2xpZW50X2luaXQoVm5jU3RhdGUgKnZzKQoreworICAgIHZuY19yZWFkX3doZW4odnMsIHByb3RvY29sX2NsaWVudF9pbml0LCAxKTsKK30KKworc3RhdGljIHZvaWQgbWFrZV9jaGFsbGVuZ2UoVm5jU3RhdGUgKnZzKQoreworICAgIGludCBpOworCisgICAgc3JhbmQodGltZShOVUxMKStnZXRwaWQoKStnZXRwaWQoKSo5ODc2NTQrcmFuZCgpKTsKKworICAgIGZvciAoaSA9IDAgOyBpIDwgc2l6ZW9mKHZzLT5jaGFsbGVuZ2UpIDsgaSsrKQorICAgICAgICB2cy0+Y2hhbGxlbmdlW2ldID0gKGludCkgKDI1Ni4wKnJhbmQoKS8oUkFORF9NQVgrMS4wKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvdG9jb2xfY2xpZW50X2F1dGhfdm5jKFZuY1N0YXRlICp2cywgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHJlc3BvbnNlW1ZOQ19BVVRIX0NIQUxMRU5HRV9TSVpFXTsKKyAgICBpbnQgaSwgaiwgcHdsZW47CisgICAgdW5zaWduZWQgY2hhciBrZXlbOF07CisKKyAgICBpZiAoIXZzLT52ZC0+cGFzc3dvcmQgfHwgIXZzLT52ZC0+cGFzc3dvcmRbMF0pIHsKKyAgICAgICAgVk5DX0RFQlVHKCJObyBwYXNzd29yZCBjb25maWd1cmVkIG9uIHNlcnZlciIpOworICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCAxKTsgLyogUmVqZWN0IGF1dGggKi8KKyAgICAgICAgaWYgKHZzLT5taW5vciA+PSA4KSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBlcnJbXSA9ICJBdXRoZW50aWNhdGlvbiBmYWlsZWQiOworICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgc2l6ZW9mKGVycikpOworICAgICAgICAgICAgdm5jX3dyaXRlKHZzLCBlcnIsIHNpemVvZihlcnIpKTsKKyAgICAgICAgfQorICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbWVtY3B5KHJlc3BvbnNlLCB2cy0+Y2hhbGxlbmdlLCBWTkNfQVVUSF9DSEFMTEVOR0VfU0laRSk7CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGV4cGVjdGVkIGNoYWxsZW5nZSByZXNwb25zZSAqLworICAgIHB3bGVuID0gc3RybGVuKHZzLT52ZC0+cGFzc3dvcmQpOworICAgIGZvciAoaT0wOyBpPHNpemVvZihrZXkpOyBpKyspCisgICAgICAgIGtleVtpXSA9IGk8cHdsZW4gPyB2cy0+dmQtPnBhc3N3b3JkW2ldIDogMDsKKyAgICBkZXNrZXkoa2V5LCBFTjApOworICAgIGZvciAoaiA9IDA7IGogPCBWTkNfQVVUSF9DSEFMTEVOR0VfU0laRTsgaiArPSA4KQorICAgICAgICBkZXMocmVzcG9uc2UraiwgcmVzcG9uc2Uraik7CisKKyAgICAvKiBDb21wYXJlIGV4cGVjdGVkIHZzIGFjdHVhbCBjaGFsbGVuZ2UgcmVzcG9uc2UgKi8KKyAgICBpZiAobWVtY21wKHJlc3BvbnNlLCBkYXRhLCBWTkNfQVVUSF9DSEFMTEVOR0VfU0laRSkgIT0gMCkgeworICAgICAgICBWTkNfREVCVUcoIkNsaWVudCBjaGFsbGVuZ2UgcmVwb25zZSBkaWQgbm90IG1hdGNoXG4iKTsKKyAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgMSk7IC8qIFJlamVjdCBhdXRoICovCisgICAgICAgIGlmICh2cy0+bWlub3IgPj0gOCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXJyW10gPSAiQXV0aGVudGljYXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIHNpemVvZihlcnIpKTsKKyAgICAgICAgICAgIHZuY193cml0ZSh2cywgZXJyLCBzaXplb2YoZXJyKSk7CisgICAgICAgIH0KKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVk5DX0RFQlVHKCJBY2NlcHRpbmcgVk5DIGNoYWxsZW5nZSByZXNwb25zZVxuIik7CisgICAgICAgIHZuY193cml0ZV91MzIodnMsIDApOyAvKiBBY2NlcHQgYXV0aCAqLworICAgICAgICB2bmNfZmx1c2godnMpOworCisgICAgICAgIHN0YXJ0X2NsaWVudF9pbml0KHZzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhcnRfYXV0aF92bmMoVm5jU3RhdGUgKnZzKQoreworICAgIG1ha2VfY2hhbGxlbmdlKHZzKTsKKyAgICAvKiBTZW5kIGNsaWVudCBhICdyYW5kb20nIGNoYWxsZW5nZSAqLworICAgIHZuY193cml0ZSh2cywgdnMtPmNoYWxsZW5nZSwgc2l6ZW9mKHZzLT5jaGFsbGVuZ2UpKTsKKyAgICB2bmNfZmx1c2godnMpOworCisgICAgdm5jX3JlYWRfd2hlbih2cywgcHJvdG9jb2xfY2xpZW50X2F1dGhfdm5jLCBzaXplb2YodnMtPmNoYWxsZW5nZSkpOworfQorCisKK3N0YXRpYyBpbnQgcHJvdG9jb2xfY2xpZW50X2F1dGgoVm5jU3RhdGUgKnZzLCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKQoreworICAgIC8qIFdlIG9ubHkgYWR2ZXJ0aXNlIDEgYXV0aCBzY2hlbWUgYXQgYSB0aW1lLCBzbyBjbGllbnQKKyAgICAgKiBtdXN0IHBpY2sgdGhlIG9uZSB3ZSBzZW50LiBWZXJpZnkgdGhpcyAqLworICAgIGlmIChkYXRhWzBdICE9IHZzLT52ZC0+YXV0aCkgeyAvKiBSZWplY3QgYXV0aCAqLworICAgICAgIFZOQ19ERUJVRygiUmVqZWN0IGF1dGggJWQgYmVjYXVzZSBpdCBkaWRuJ3QgbWF0Y2ggYWR2ZXJ0aXplZFxuIiwgKGludClkYXRhWzBdKTsKKyAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCAxKTsKKyAgICAgICBpZiAodnMtPm1pbm9yID49IDgpIHsKKyAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXJyW10gPSAiQXV0aGVudGljYXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgc2l6ZW9mKGVycikpOworICAgICAgICAgICB2bmNfd3JpdGUodnMsIGVyciwgc2l6ZW9mKGVycikpOworICAgICAgIH0KKyAgICAgICB2bmNfY2xpZW50X2Vycm9yKHZzKTsKKyAgICB9IGVsc2UgeyAvKiBBY2NlcHQgcmVxdWVzdGVkIGF1dGggKi8KKyAgICAgICBWTkNfREVCVUcoIkNsaWVudCByZXF1ZXN0ZWQgYXV0aCAlZFxuIiwgKGludClkYXRhWzBdKTsKKyAgICAgICBzd2l0Y2ggKHZzLT52ZC0+YXV0aCkgeworICAgICAgIGNhc2UgVk5DX0FVVEhfTk9ORToKKyAgICAgICAgICAgVk5DX0RFQlVHKCJBY2NlcHQgYXV0aCBub25lXG4iKTsKKyAgICAgICAgICAgaWYgKHZzLT5taW5vciA+PSA4KSB7CisgICAgICAgICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCAwKTsgLyogQWNjZXB0IGF1dGggY29tcGxldGlvbiAqLworICAgICAgICAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBzdGFydF9jbGllbnRfaW5pdCh2cyk7CisgICAgICAgICAgIGJyZWFrOworCisgICAgICAgY2FzZSBWTkNfQVVUSF9WTkM6CisgICAgICAgICAgIFZOQ19ERUJVRygiU3RhcnQgVk5DIGF1dGhcbiIpOworICAgICAgICAgICBzdGFydF9hdXRoX3ZuYyh2cyk7CisgICAgICAgICAgIGJyZWFrOworCisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICBjYXNlIFZOQ19BVVRIX1ZFTkNSWVBUOgorICAgICAgICAgICBWTkNfREVCVUcoIkFjY2VwdCBWZU5DcnlwdCBhdXRoXG4iKTs7CisgICAgICAgICAgIHN0YXJ0X2F1dGhfdmVuY3J5cHQodnMpOworICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1RMUyAqLworCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgICAgY2FzZSBWTkNfQVVUSF9TQVNMOgorICAgICAgICAgICBWTkNfREVCVUcoIkFjY2VwdCBTQVNMIGF1dGhcbiIpOworICAgICAgICAgICBzdGFydF9hdXRoX3Nhc2wodnMpOworICAgICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1NBU0wgKi8KKworICAgICAgIGRlZmF1bHQ6IC8qIFNob3VsZCBub3QgYmUgcG9zc2libGUsIGJ1dCBqdXN0IGluIGNhc2UgKi8KKyAgICAgICAgICAgVk5DX0RFQlVHKCJSZWplY3QgYXV0aCAlZCBzZXJ2ZXIgY29kZSBidWdcbiIsIHZzLT52ZC0+YXV0aCk7CisgICAgICAgICAgIHZuY193cml0ZV91OCh2cywgMSk7CisgICAgICAgICAgIGlmICh2cy0+bWlub3IgPj0gOCkgeworICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZXJyW10gPSAiQXV0aGVudGljYXRpb24gZmFpbGVkIjsKKyAgICAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIHNpemVvZihlcnIpKTsKKyAgICAgICAgICAgICAgIHZuY193cml0ZSh2cywgZXJyLCBzaXplb2YoZXJyKSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm90b2NvbF92ZXJzaW9uKFZuY1N0YXRlICp2cywgdWludDhfdCAqdmVyc2lvbiwgc2l6ZV90IGxlbikKK3sKKyAgICBjaGFyIGxvY2FsWzEzXTsKKworICAgIG1lbWNweShsb2NhbCwgdmVyc2lvbiwgMTIpOworICAgIGxvY2FsWzEyXSA9IDA7CisKKyAgICBpZiAoc3NjYW5mKGxvY2FsLCAiUkZCICUwM2QuJTAzZFxuIiwgJnZzLT5tYWpvciwgJnZzLT5taW5vcikgIT0gMikgeworICAgICAgICBWTkNfREVCVUcoIk1hbGZvcm1lZCBwcm90b2NvbCB2ZXJzaW9uICVzXG4iLCBsb2NhbCk7CisgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVk5DX0RFQlVHKCJDbGllbnQgcmVxdWVzdCBwcm90b2NvbCB2ZXJzaW9uICVkLiVkXG4iLCB2cy0+bWFqb3IsIHZzLT5taW5vcik7CisgICAgaWYgKHZzLT5tYWpvciAhPSAzIHx8CisgICAgICAgICh2cy0+bWlub3IgIT0gMyAmJgorICAgICAgICAgdnMtPm1pbm9yICE9IDQgJiYKKyAgICAgICAgIHZzLT5taW5vciAhPSA1ICYmCisgICAgICAgICB2cy0+bWlub3IgIT0gNyAmJgorICAgICAgICAgdnMtPm1pbm9yICE9IDgpKSB7CisgICAgICAgIFZOQ19ERUJVRygiVW5zdXBwb3J0ZWQgY2xpZW50IHZlcnNpb25cbiIpOworICAgICAgICB2bmNfd3JpdGVfdTMyKHZzLCBWTkNfQVVUSF9JTlZBTElEKTsKKyAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgdm5jX2NsaWVudF9lcnJvcih2cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBTb21lIGJyb2tlbiBjbGllbnRzIHJlcG9ydCB2My40IG9yIHYzLjUsIHdoaWNoIHNwZWMgcmVxdWlyZXMgdG8gYmUgdHJlYXRlZAorICAgICAqIGFzIGVxdWl2YWxlbnQgdG8gdjMuMyBieSBzZXJ2ZXJzCisgICAgICovCisgICAgaWYgKHZzLT5taW5vciA9PSA0IHx8IHZzLT5taW5vciA9PSA1KQorICAgICAgICB2cy0+bWlub3IgPSAzOworCisgICAgaWYgKHZzLT5taW5vciA9PSAzKSB7CisgICAgICAgIGlmICh2cy0+dmQtPmF1dGggPT0gVk5DX0FVVEhfTk9ORSkgeworICAgICAgICAgICAgVk5DX0RFQlVHKCJUZWxsIGNsaWVudCBhdXRoIG5vbmVcbiIpOworICAgICAgICAgICAgdm5jX3dyaXRlX3UzMih2cywgdnMtPnZkLT5hdXRoKTsKKyAgICAgICAgICAgIHZuY19mbHVzaCh2cyk7CisgICAgICAgICAgICBzdGFydF9jbGllbnRfaW5pdCh2cyk7CisgICAgICAgfSBlbHNlIGlmICh2cy0+dmQtPmF1dGggPT0gVk5DX0FVVEhfVk5DKSB7CisgICAgICAgICAgICBWTkNfREVCVUcoIlRlbGwgY2xpZW50IFZOQyBhdXRoXG4iKTsKKyAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIHZzLT52ZC0+YXV0aCk7CisgICAgICAgICAgICB2bmNfZmx1c2godnMpOworICAgICAgICAgICAgc3RhcnRfYXV0aF92bmModnMpOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBWTkNfREVCVUcoIlVuc3VwcG9ydGVkIGF1dGggJWQgZm9yIHByb3RvY29sIDMuM1xuIiwgdnMtPnZkLT5hdXRoKTsKKyAgICAgICAgICAgIHZuY193cml0ZV91MzIodnMsIFZOQ19BVVRIX0lOVkFMSUQpOworICAgICAgICAgICAgdm5jX2ZsdXNoKHZzKTsKKyAgICAgICAgICAgIHZuY19jbGllbnRfZXJyb3IodnMpOworICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBWTkNfREVCVUcoIlRlbGxpbmcgY2xpZW50IHdlIHN1cHBvcnQgYXV0aCAlZFxuIiwgdnMtPnZkLT5hdXRoKTsKKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCAxKTsgLyogbnVtIGF1dGggKi8KKyAgICAgICAgdm5jX3dyaXRlX3U4KHZzLCB2cy0+dmQtPmF1dGgpOworICAgICAgICB2bmNfcmVhZF93aGVuKHZzLCBwcm90b2NvbF9jbGllbnRfYXV0aCwgMSk7CisgICAgICAgIHZuY19mbHVzaCh2cyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZuY19jb25uZWN0KFZuY0Rpc3BsYXkgKnZkLCBpbnQgY3NvY2spCit7CisgICAgVm5jU3RhdGUgKnZzID0gZ19tYWxsb2MwKHNpemVvZihWbmNTdGF0ZSkpOworICAgIHZzLT5jc29jayA9IGNzb2NrOworCisgICAgVk5DX0RFQlVHKCJOZXcgY2xpZW50IG9uIHNvY2tldCAlZFxuIiwgY3NvY2spOworICAgIGRjbC0+aWRsZSA9IDA7CisgICAgc29ja2V0X3NldF9ub25ibG9jayh2cy0+Y3NvY2spOworICAgIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHZzLT5jc29jaywgTlVMTCwgdm5jX2NsaWVudF9yZWFkLCBOVUxMLCB2cyk7CisKKyAgICB2cy0+dmQgPSB2ZDsKKyAgICB2cy0+ZHMgPSB2ZC0+ZHM7CisgICAgdnMtPnRpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfUkVBTFRJTUUsIFNDQUxFX01TLCB2bmNfdXBkYXRlX2NsaWVudCwgdnMpOworICAgIHZzLT5sYXN0X3ggPSAtMTsKKyAgICB2cy0+bGFzdF95ID0gLTE7CisKKyAgICB2cy0+YXMuZnJlcSA9IDQ0MTAwOworICAgIHZzLT5hcy5uY2hhbm5lbHMgPSAyOworICAgIHZzLT5hcy5mbXQgPSBBVURfRk1UX1MxNjsKKyAgICB2cy0+YXMuZW5kaWFubmVzcyA9IDA7CisKKyAgICB2bmNfcmVzaXplKHZzKTsKKyAgICB2bmNfd3JpdGUodnMsICJSRkIgMDAzLjAwOFxuIiwgMTIpOworICAgIHZuY19mbHVzaCh2cyk7CisgICAgdm5jX3JlYWRfd2hlbih2cywgcHJvdG9jb2xfdmVyc2lvbiwgMTIpOworICAgIHJlc2V0X2tleXModnMpOworCisgICAgdnMtPm5leHQgPSB2ZC0+Y2xpZW50czsKKyAgICB2ZC0+Y2xpZW50cyA9IHZzOworCisgICAgdm5jX3VwZGF0ZV9jbGllbnQodnMpOworICAgIC8qIHZzIG1pZ2h0IGJlIGZyZWUoKWVkIGhlcmUgKi8KK30KKworc3RhdGljIHZvaWQgdm5jX2xpc3Rlbl9yZWFkKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IG9wYXF1ZTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihhZGRyKTsKKworICAgIC8qIENhdGNoLXVwICovCisgICAgdmdhX2h3X3VwZGF0ZSgpOworCisgICAgaW50IGNzb2NrID0gYWNjZXB0KHZzLT5sc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmYWRkcmxlbik7CisgICAgaWYgKGNzb2NrICE9IC0xKSB7CisgICAgICAgIHZuY19jb25uZWN0KHZzLCBjc29jayk7CisgICAgfQorfQorCit2b2lkIHZuY19kaXNwbGF5X2luaXQoRGlzcGxheVN0YXRlICpkcykKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGdfbWFsbG9jMChzaXplb2YoKnZzKSk7CisKKyAgICBkY2wgPSBnX21hbGxvYzAoc2l6ZW9mKERpc3BsYXlDaGFuZ2VMaXN0ZW5lcikpOworCisgICAgZHMtPm9wYXF1ZSA9IHZzOworICAgIGRjbC0+aWRsZSA9IDE7CisgICAgdm5jX2Rpc3BsYXkgPSB2czsKKworICAgIHZzLT5sc29jayA9IC0xOworCisgICAgdnMtPmRzID0gZHM7CisKKyAgICBpZiAoa2V5Ym9hcmRfbGF5b3V0KQorICAgICAgICB2cy0+a2JkX2xheW91dCA9IGluaXRfa2V5Ym9hcmRfbGF5b3V0KG5hbWUya2V5c3ltLCBrZXlib2FyZF9sYXlvdXQpOworICAgIGVsc2UKKyAgICAgICAgdnMtPmtiZF9sYXlvdXQgPSBpbml0X2tleWJvYXJkX2xheW91dChuYW1lMmtleXN5bSwgImVuLXVzIik7CisKKyAgICBpZiAoIXZzLT5rYmRfbGF5b3V0KQorICAgICAgICBleGl0KDEpOworCisgICAgZGNsLT5kcHlfY29weSA9IHZuY19kcHlfY29weTsKKyAgICBkY2wtPmRweV91cGRhdGUgPSB2bmNfZHB5X3VwZGF0ZTsKKyAgICBkY2wtPmRweV9yZXNpemUgPSB2bmNfZHB5X3Jlc2l6ZTsKKyAgICBkY2wtPmRweV9zZXRkYXRhID0gdm5jX2RweV9zZXRkYXRhOworICAgIHJlZ2lzdGVyX2Rpc3BsYXljaGFuZ2VsaXN0ZW5lcihkcywgZGNsKTsKK30KKworCit2b2lkIHZuY19kaXNwbGF5X2Nsb3NlKERpc3BsYXlTdGF0ZSAqZHMpCit7CisgICAgVm5jRGlzcGxheSAqdnMgPSBkcyA/IChWbmNEaXNwbGF5ICopZHMtPm9wYXF1ZSA6IHZuY19kaXNwbGF5OworCisgICAgaWYgKCF2cykKKyAgICAgICAgcmV0dXJuOworICAgIGlmICh2cy0+ZGlzcGxheSkgeworICAgICAgICBnX2ZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgfQorICAgIGlmICh2cy0+bHNvY2sgIT0gLTEpIHsKKyAgICAgICAgcWVtdV9zZXRfZmRfaGFuZGxlcjIodnMtPmxzb2NrLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgY2xvc2UodnMtPmxzb2NrKTsKKyAgICAgICAgdnMtPmxzb2NrID0gLTE7CisgICAgfQorICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICB2cy0+dGxzLng1MDl2ZXJpZnkgPSAwOworI2VuZGlmCit9CisKK2ludCB2bmNfZGlzcGxheV9wYXNzd29yZChEaXNwbGF5U3RhdGUgKmRzLCBjb25zdCBjaGFyICpwYXNzd29yZCkKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGRzID8gKFZuY0Rpc3BsYXkgKilkcy0+b3BhcXVlIDogdm5jX2Rpc3BsYXk7CisKKyAgICBpZiAodnMtPnBhc3N3b3JkKSB7CisgICAgICAgIGdfZnJlZSh2cy0+cGFzc3dvcmQpOworICAgICAgICB2cy0+cGFzc3dvcmQgPSBOVUxMOworICAgIH0KKyAgICBpZiAocGFzc3dvcmQgJiYgcGFzc3dvcmRbMF0pIHsKKyAgICAgICAgaWYgKCEodnMtPnBhc3N3b3JkID0gZ19zdHJkdXAocGFzc3dvcmQpKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworY2hhciAqdm5jX2Rpc3BsYXlfbG9jYWxfYWRkcihEaXNwbGF5U3RhdGUgKmRzKQoreworICAgIFZuY0Rpc3BsYXkgKnZzID0gZHMgPyAoVm5jRGlzcGxheSAqKWRzLT5vcGFxdWUgOiB2bmNfZGlzcGxheTsKKworICAgIHJldHVybiB2bmNfc29ja2V0X2xvY2FsX2FkZHIoIiVzOiVzIiwgdnMtPmxzb2NrKTsKK30KKworaW50IHZuY19kaXNwbGF5X29wZW4oRGlzcGxheVN0YXRlICpkcywgY29uc3QgY2hhciAqZGlzcGxheSkKK3sKKyAgICBWbmNEaXNwbGF5ICp2cyA9IGRzID8gKFZuY0Rpc3BsYXkgKilkcy0+b3BhcXVlIDogdm5jX2Rpc3BsYXk7CisgICAgY29uc3QgY2hhciAqb3B0aW9uczsKKyAgICBpbnQgcGFzc3dvcmQgPSAwOworICAgIGludCByZXZlcnNlID0gMDsKKyAgICBpbnQgdG9fcG9ydCA9IDA7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICBpbnQgdGxzID0gMCwgeDUwOSA9IDA7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICBpbnQgc2FzbCA9IDA7CisgICAgaW50IHNhc2xFcnI7CisjZW5kaWYKKyAgICBpbnQgYWNsID0gMDsKKworICAgIGlmICghdm5jX2Rpc3BsYXkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB2bmNfZGlzcGxheV9jbG9zZShkcyk7CisgICAgaWYgKHN0cmNtcChkaXNwbGF5LCAibm9uZSIpID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCEodnMtPmRpc3BsYXkgPSBzdHJkdXAoZGlzcGxheSkpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBvcHRpb25zID0gZGlzcGxheTsKKyAgICB3aGlsZSAoKG9wdGlvbnMgPSBzdHJjaHIob3B0aW9ucywgJywnKSkpIHsKKyAgICAgICAgb3B0aW9ucysrOworICAgICAgICBpZiAoc3RybmNtcChvcHRpb25zLCAicGFzc3dvcmQiLCA4KSA9PSAwKSB7CisgICAgICAgICAgICBwYXNzd29yZCA9IDE7IC8qIFJlcXVpcmUgcGFzc3dvcmQgYXV0aCAqLworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9ucywgInJldmVyc2UiLCA3KSA9PSAwKSB7CisgICAgICAgICAgICByZXZlcnNlID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbnMsICJ0bz0iLCAzKSA9PSAwKSB7CisgICAgICAgICAgICB0b19wb3J0ID0gYXRvaShvcHRpb25zKzMpICsgNTkwMDsKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG9wdGlvbnMsICJzYXNsIiwgNCkgPT0gMCkgeworICAgICAgICAgICAgc2FzbCA9IDE7IC8qIFJlcXVpcmUgU0FTTCBhdXRoICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3B0aW9ucywgInRscyIsIDMpID09IDApIHsKKyAgICAgICAgICAgIHRscyA9IDE7IC8qIFJlcXVpcmUgVExTICovCisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvcHRpb25zLCAieDUwOSIsIDQpID09IDApIHsKKyAgICAgICAgICAgIGNoYXIgKnN0YXJ0LCAqZW5kOworICAgICAgICAgICAgeDUwOSA9IDE7IC8qIFJlcXVpcmUgeDUwOSBjZXJ0aWZpY2F0ZXMgKi8KKyAgICAgICAgICAgIGlmIChzdHJuY21wKG9wdGlvbnMsICJ4NTA5dmVyaWZ5IiwgMTApID09IDApCisgICAgICAgICAgICAgICAgdnMtPnRscy54NTA5dmVyaWZ5ID0gMTsgLyogLi4uYW5kIHZlcmlmeSBjbGllbnQgY2VydHMgKi8KKworICAgICAgICAgICAgLyogTm93IGNoZWNrIGZvciAneDUwOT0vc29tZS9wYXRoJyBwb3N0Zml4CisgICAgICAgICAgICAgKiBhbmQgdXNlIHRoYXQgdG8gc2V0dXAgeDUwOSBjZXJ0aWZpY2F0ZS9rZXkgcGF0aHMgKi8KKyAgICAgICAgICAgIHN0YXJ0ID0gc3RyY2hyKG9wdGlvbnMsICc9Jyk7CisgICAgICAgICAgICBlbmQgPSBzdHJjaHIob3B0aW9ucywgJywnKTsKKyAgICAgICAgICAgIGlmIChzdGFydCAmJiAoIWVuZCB8fCAoc3RhcnQgPCBlbmQpKSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBlbmQgPyBlbmQtKHN0YXJ0KzEpIDogc3RybGVuKHN0YXJ0KzEpOworICAgICAgICAgICAgICAgIGNoYXIgKnBhdGggPSBnX3N0cm5kdXAoc3RhcnQgKyAxLCBsZW4pOworCisgICAgICAgICAgICAgICAgVk5DX0RFQlVHKCJUcnlpbmcgY2VydGlmaWNhdGUgcGF0aCAnJXMnXG4iLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAodm5jX3Rsc19zZXRfeDUwOV9jcmVkc19kaXIodnMsIHBhdGgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kIHg1MDkgY2VydGlmaWNhdGVzL2tleXMgaW4gJXNcbiIsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICBnX2ZyZWUocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGdfZnJlZSh2cy0+ZGlzcGxheSk7CisgICAgICAgICAgICAgICAgICAgIHZzLT5kaXNwbGF5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnX2ZyZWUocGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gY2VydGlmaWNhdGUgcGF0aCBwcm92aWRlZFxuIik7CisgICAgICAgICAgICAgICAgZ19mcmVlKHZzLT5kaXNwbGF5KTsKKyAgICAgICAgICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvcHRpb25zLCAiYWNsIiwgMykgPT0gMCkgeworICAgICAgICAgICAgYWNsID0gMTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgaWYgKGFjbCAmJiB4NTA5ICYmIHZzLT50bHMueDUwOXZlcmlmeSkgeworICAgICAgICBpZiAoISh2cy0+dGxzLmFjbCA9IHFlbXVfYWNsX2luaXQoInZuYy54NTA5ZG5hbWUiKSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSB4NTA5IGRuYW1lIEFDTFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgaWYgKGFjbCAmJiBzYXNsKSB7CisgICAgICAgIGlmICghKHZzLT5zYXNsLmFjbCA9IHFlbXVfYWNsX2luaXQoInZuYy51c2VybmFtZSIpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIHVzZXJuYW1lIEFDTFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIENvbWJpbmF0aW9ucyB3ZSBzdXBwb3J0IGhlcmU6CisgICAgICoKKyAgICAgKiAgLSBuby1hdXRoICAgICAgICAgICAgICAgIChjbGVhciB0ZXh0LCBubyBhdXRoKQorICAgICAqICAtIHBhc3N3b3JkICAgICAgICAgICAgICAgKGNsZWFyIHRleHQsIHdlYWsgYXV0aCkKKyAgICAgKiAgLSBzYXNsICAgICAgICAgICAgICAgICAgIChlbmNyeXB0LCBnb29kIGF1dGggKklGKiB1c2luZyBLZXJiZXJvcyB2aWEgR1NTQVBJKQorICAgICAqICAtIHRscyAgICAgICAgICAgICAgICAgICAgKGVuY3J5cHQsIHdlYWsgYW5vbnltb3VzIGNyZWRzLCBubyBhdXRoKQorICAgICAqICAtIHRscyArIHBhc3N3b3JkICAgICAgICAgKGVuY3J5cHQsIHdlYWsgYW5vbnltb3VzIGNyZWRzLCB3ZWFrIGF1dGgpCisgICAgICogIC0gdGxzICsgc2FzbCAgICAgICAgICAgICAoZW5jcnlwdCwgd2VhayBhbm9ueW1vdXMgY3JlZHMsIGdvb2QgYXV0aCkKKyAgICAgKiAgLSB0bHMgKyB4NTA5ICAgICAgICAgICAgIChlbmNyeXB0LCBnb29kIHg1MDkgY3JlZHMsIG5vIGF1dGgpCisgICAgICogIC0gdGxzICsgeDUwOSArIHBhc3N3b3JkICAoZW5jcnlwdCwgZ29vZCB4NTA5IGNyZWRzLCB3ZWFrIGF1dGgpCisgICAgICogIC0gdGxzICsgeDUwOSArIHNhc2wgICAgICAoZW5jcnlwdCwgZ29vZCB4NTA5IGNyZWRzLCBnb29kIGF1dGgpCisgICAgICoKKyAgICAgKiBOQjEuIFRMUyBpcyBhIHN0YWNrYWJsZSBhdXRoIHNjaGVtZS4KKyAgICAgKiBOQjIuIHRoZSB4NTA5IHNjaGVtZXMgaGF2ZSBvcHRpb24gdG8gdmFsaWRhdGUgYSBjbGllbnQgY2VydCBkbmFtZQorICAgICAqLworICAgIGlmIChwYXNzd29yZCkgeworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgICAgIGlmICh0bHMpIHsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFQ7CisgICAgICAgICAgICBpZiAoeDUwOSkgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCB4NTA5IHBhc3N3b3JkIGF1dGhcbiIpOworICAgICAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOVZOQzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIFRMUyBwYXNzd29yZCBhdXRoXG4iKTsKKyAgICAgICAgICAgICAgICB2cy0+c3ViYXV0aCA9IFZOQ19BVVRIX1ZFTkNSWVBUX1RMU1ZOQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZiAvKiBDT05GSUdfVk5DX1RMUyAqLworICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIHBhc3N3b3JkIGF1dGhcbiIpOworICAgICAgICAgICAgdnMtPmF1dGggPSBWTkNfQVVUSF9WTkM7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICAgICAgfQorI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgfSBlbHNlIGlmIChzYXNsKSB7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgaWYgKHRscykgeworICAgICAgICAgICAgdnMtPmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVDsKKyAgICAgICAgICAgIGlmICh4NTA5KSB7CisgICAgICAgICAgICAgICAgVk5DX0RFQlVHKCJJbml0aWFsaXppbmcgVk5DIHNlcnZlciB3aXRoIHg1MDkgU0FTTCBhdXRoXG4iKTsKKyAgICAgICAgICAgICAgICB2cy0+c3ViYXV0aCA9IFZOQ19BVVRIX1ZFTkNSWVBUX1g1MDlTQVNMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggVExTIFNBU0wgYXV0aFxuIik7CisgICAgICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVF9UTFNTQVNMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmIC8qIENPTkZJR19WTkNfVExTICovCisgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggU0FTTCBhdXRoXG4iKTsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfU0FTTDsKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9JTlZBTElEOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX1ZOQ19UTFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfVk5DX1NBU0wgKi8KKyAgICB9IGVsc2UgeworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgICAgIGlmICh0bHMpIHsKKyAgICAgICAgICAgIHZzLT5hdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFQ7CisgICAgICAgICAgICBpZiAoeDUwOSkgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCB4NTA5IG5vIGF1dGhcbiIpOworICAgICAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOU5PTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFZOQ19ERUJVRygiSW5pdGlhbGl6aW5nIFZOQyBzZXJ2ZXIgd2l0aCBUTFMgbm8gYXV0aFxuIik7CisgICAgICAgICAgICAgICAgdnMtPnN1YmF1dGggPSBWTkNfQVVUSF9WRU5DUllQVF9UTFNOT05FOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICBWTkNfREVCVUcoIkluaXRpYWxpemluZyBWTkMgc2VydmVyIHdpdGggbm8gYXV0aFxuIik7CisgICAgICAgICAgICB2cy0+YXV0aCA9IFZOQ19BVVRIX05PTkU7CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICAgICAgICAgIHZzLT5zdWJhdXRoID0gVk5DX0FVVEhfSU5WQUxJRDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisgICAgaWYgKChzYXNsRXJyID0gc2FzbF9zZXJ2ZXJfaW5pdChOVUxMLCAicWVtdSIpKSAhPSBTQVNMX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgU0FTTCBhdXRoICVzIiwKKyAgICAgICAgICAgICAgICBzYXNsX2VycnN0cmluZyhzYXNsRXJyLCBOVUxMLCBOVUxMKSk7CisgICAgICAgIGZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgIC8qIGNvbm5lY3QgdG8gdmlld2VyICovCisgICAgICAgIGlmIChzdHJuY21wKGRpc3BsYXksICJ1bml4OiIsIDUpID09IDApCisgICAgICAgICAgICB2cy0+bHNvY2sgPSB1bml4X2Nvbm5lY3QoZGlzcGxheSs1KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdnMtPmxzb2NrID0gaW5ldF9jb25uZWN0KGRpc3BsYXksIFNPQ0tfU1RSRUFNKTsKKyAgICAgICAgaWYgKC0xID09IHZzLT5sc29jaykgeworICAgICAgICAgICAgZnJlZSh2cy0+ZGlzcGxheSk7CisgICAgICAgICAgICB2cy0+ZGlzcGxheSA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgY3NvY2sgPSB2cy0+bHNvY2s7CisgICAgICAgICAgICB2cy0+bHNvY2sgPSAtMTsKKyAgICAgICAgICAgIHZuY19jb25uZWN0KHZzLCBjc29jayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBsaXN0ZW4gZm9yIGNvbm5lY3RzICovCisgICAgICAgIGNoYXIgKmRweTsKKyAgICAgICAgZHB5ID0gZ19tYWxsb2MoMjU2KTsKKyAgICAgICAgaWYgKHN0cm5jbXAoZGlzcGxheSwgInVuaXg6IiwgNSkgPT0gMCkgeworICAgICAgICAgICAgcHN0cmNweShkcHksIDI1NiwgInVuaXg6Iik7CisgICAgICAgICAgICB2cy0+bHNvY2sgPSB1bml4X2xpc3RlbihkaXNwbGF5KzUsIGRweSs1LCAyNTYtNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2cy0+bHNvY2sgPSBpbmV0X2xpc3RlbihkaXNwbGF5LCBkcHksIDI1NiwgU09DS19TVFJFQU0sIDU5MDApOworICAgICAgICB9CisgICAgICAgIGlmICgtMSA9PSB2cy0+bHNvY2spIHsKKyAgICAgICAgICAgIGZyZWUoZHB5KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyZWUodnMtPmRpc3BsYXkpOworICAgICAgICAgICAgdnMtPmRpc3BsYXkgPSBkcHk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHFlbXVfc2V0X2ZkX2hhbmRsZXIyKHZzLT5sc29jaywgTlVMTCwgdm5jX2xpc3Rlbl9yZWFkLCBOVUxMLCB2cyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3VpL3ZuYy5oIGIvYW5kcm9pZC9xZW11MS91aS92bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFjNDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS92bmMuaApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIFFFTVUgVk5DIGRpc3BsYXkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFudGhvbnkgTGlndW9yaSA8YW50aG9ueUBjb2RlbW9ua2V5LndzPgorICogQ29weXJpZ2h0IChDKSAyMDA2IEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlZCBIYXQsIEluYworICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fUUVNVV9WTkNfSAorI2RlZmluZSBfX1FFTVVfVk5DX0gKKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAidWkvY29uc29sZS5oIgorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorI2luY2x1ZGUgImF1ZGlvL2F1ZGlvLmgiCisjaW5jbHVkZSA8emxpYi5oPgorCisjaW5jbHVkZSAia2V5bWFwcy5oIgorCisvLyAjZGVmaW5lIF9WTkNfREVCVUcgMQorCisjaWZkZWYgX1ZOQ19ERUJVRworI2RlZmluZSBWTkNfREVCVUcoZm10LCAuLi4pIGRvIHsgZnByaW50ZihzdGRlcnIsIGZtdCwgIyMgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgVk5DX0RFQlVHKGZtdCwgLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29yZSBkYXRhIHN0cnVjdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEJ1ZmZlcgoreworICAgIHNpemVfdCBjYXBhY2l0eTsKKyAgICBzaXplX3Qgb2Zmc2V0OworICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKK30gQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCBWbmNTdGF0ZSBWbmNTdGF0ZTsKKwordHlwZWRlZiBpbnQgVm5jUmVhZEV2ZW50KFZuY1N0YXRlICp2cywgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbik7CisKK3R5cGVkZWYgdm9pZCBWbmNXcml0ZVBpeGVscyhWbmNTdGF0ZSAqdnMsIHZvaWQgKmRhdGEsIGludCBzaXplKTsKKwordHlwZWRlZiB2b2lkIFZuY1NlbmRIZXh0aWxlVGlsZShWbmNTdGF0ZSAqdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsYXN0X2JnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsYXN0X2ZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhhc19iZywgaW50ICpoYXNfZmcpOworCisjZGVmaW5lIFZOQ19NQVhfV0lEVEggMjA0OAorI2RlZmluZSBWTkNfTUFYX0hFSUdIVCAyMDQ4CisjZGVmaW5lIFZOQ19ESVJUWV9XT1JEUyAoVk5DX01BWF9XSURUSCAvICgxNiAqIDMyKSkKKworI2RlZmluZSBWTkNfQVVUSF9DSEFMTEVOR0VfU0laRSAxNgorCit0eXBlZGVmIHN0cnVjdCBWbmNEaXNwbGF5IFZuY0Rpc3BsYXk7CisKKyNpZmRlZiBDT05GSUdfVk5DX1RMUworI2luY2x1ZGUgInZuYy10bHMuaCIKKyNpbmNsdWRlICJ2bmMtYXV0aC12ZW5jcnlwdC5oIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZOQ19TQVNMCisjaW5jbHVkZSAidm5jLWF1dGgtc2FzbC5oIgorI2VuZGlmCisKKworc3RydWN0IFZuY0Rpc3BsYXkKK3sKKyAgICBpbnQgbHNvY2s7CisgICAgRGlzcGxheVN0YXRlICpkczsKKyAgICBWbmNTdGF0ZSAqY2xpZW50czsKKyAgICBrYmRfbGF5b3V0X3QgKmtiZF9sYXlvdXQ7CisKKyAgICBjaGFyICpkaXNwbGF5OworICAgIGNoYXIgKnBhc3N3b3JkOworICAgIGludCBhdXRoOworI2lmZGVmIENPTkZJR19WTkNfVExTCisgICAgaW50IHN1YmF1dGg7IC8qIFVzZWQgYnkgVmVOQ3J5cHQgKi8KKyAgICBWbmNEaXNwbGF5VExTIHRsczsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19WTkNfU0FTTAorICAgIFZuY0Rpc3BsYXlTQVNMIHNhc2w7CisjZW5kaWYKK307CisKK3N0cnVjdCBWbmNTdXJmYWNlCit7CisgICAgdWludDMyX3QgZGlydHlbVk5DX01BWF9IRUlHSFRdW1ZOQ19ESVJUWV9XT1JEU107CisgICAgRGlzcGxheVN1cmZhY2UgKmRzOworfTsKKworc3RydWN0IFZuY1N0YXRlCit7CisgICAgUUVNVVRpbWVyICp0aW1lcjsKKyAgICBpbnQgY3NvY2s7CisKKyAgICBEaXNwbGF5U3RhdGUgKmRzOworICAgIHN0cnVjdCBWbmNTdXJmYWNlIGd1ZXN0OyAgIC8qIGd1ZXN0IHZpc2libGUgc3VyZmFjZSAoYWthIGRzLT5zdXJmYWNlKSAqLworICAgIHN0cnVjdCBWbmNTdXJmYWNlIHNlcnZlcjsgIC8qIHZuYyBzZXJ2ZXIgc3VyZmFjZSAqLworCisgICAgVm5jRGlzcGxheSAqdmQ7CisgICAgaW50IG5lZWRfdXBkYXRlOworICAgIGludCBmb3JjZV91cGRhdGU7CisgICAgdWludDMyX3QgZmVhdHVyZXM7CisgICAgaW50IGFic29sdXRlOworICAgIGludCBsYXN0X3g7CisgICAgaW50IGxhc3RfeTsKKworICAgIHVpbnQzMl90IHZuY19lbmNvZGluZzsKKyAgICB1aW50OF90IHRpZ2h0X3F1YWxpdHk7CisgICAgdWludDhfdCB0aWdodF9jb21wcmVzc2lvbjsKKworICAgIGludCBtYWpvcjsKKyAgICBpbnQgbWlub3I7CisKKyAgICBjaGFyIGNoYWxsZW5nZVtWTkNfQVVUSF9DSEFMTEVOR0VfU0laRV07CisjaWZkZWYgQ09ORklHX1ZOQ19UTFMKKyAgICBWbmNTdGF0ZVRMUyB0bHM7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk5DX1NBU0wKKyAgICBWbmNTdGF0ZVNBU0wgc2FzbDsKKyNlbmRpZgorCisgICAgQnVmZmVyIG91dHB1dDsKKyAgICBCdWZmZXIgaW5wdXQ7CisgICAgLyogY3VycmVudCBvdXRwdXQgbW9kZSBpbmZvcm1hdGlvbiAqLworICAgIFZuY1dyaXRlUGl4ZWxzICp3cml0ZV9waXhlbHM7CisgICAgVm5jU2VuZEhleHRpbGVUaWxlICpzZW5kX2hleHRpbGVfdGlsZTsKKyAgICBEaXNwbGF5U3VyZmFjZSBjbGllbnRkczsKKworICAgIENhcHR1cmVWb2ljZU91dCAqYXVkaW9fY2FwOworICAgIHN0cnVjdCBhdWRzZXR0aW5ncyBhczsKKworICAgIFZuY1JlYWRFdmVudCAqcmVhZF9oYW5kbGVyOworICAgIHNpemVfdCByZWFkX2hhbmRsZXJfZXhwZWN0OworICAgIC8qIGlucHV0ICovCisgICAgdWludDhfdCBtb2RpZmllcnNfc3RhdGVbMjU2XTsKKworICAgIEJ1ZmZlciB6bGliOworICAgIEJ1ZmZlciB6bGliX3RtcDsKKyAgICB6X3N0cmVhbSB6bGliX3N0cmVhbVs0XTsKKworICAgIFZuY1N0YXRlICpuZXh0OworfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBdXRoZW50aWNhdGlvbiBtb2RlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSB7CisgICAgVk5DX0FVVEhfSU5WQUxJRCA9IDAsCisgICAgVk5DX0FVVEhfTk9ORSA9IDEsCisgICAgVk5DX0FVVEhfVk5DID0gMiwKKyAgICBWTkNfQVVUSF9SQTIgPSA1LAorICAgIFZOQ19BVVRIX1JBMk5FID0gNiwKKyAgICBWTkNfQVVUSF9USUdIVCA9IDE2LAorICAgIFZOQ19BVVRIX1VMVFJBID0gMTcsCisgICAgVk5DX0FVVEhfVExTID0gMTgsICAgICAgLyogU3VwcG9ydGVkIGluIEdUSy1WTkMgJiBWSU5PICovCisgICAgVk5DX0FVVEhfVkVOQ1JZUFQgPSAxOSwgLyogU3VwcG9ydGVkIGluIEdUSy1WTkMgJiBWZU5DcnlwdCAqLworICAgIFZOQ19BVVRIX1NBU0wgPSAyMCwgICAgIC8qIFN1cHBvcnRlZCBpbiBHVEstVk5DICYgVklOTyAqLworfTsKKworZW51bSB7CisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfUExBSU4gPSAyNTYsCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfVExTTk9ORSA9IDI1NywKKyAgICBWTkNfQVVUSF9WRU5DUllQVF9UTFNWTkMgPSAyNTgsCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfVExTUExBSU4gPSAyNTksCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOU5PTkUgPSAyNjAsCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOVZOQyA9IDI2MSwKKyAgICBWTkNfQVVUSF9WRU5DUllQVF9YNTA5UExBSU4gPSAyNjIsCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfWDUwOVNBU0wgPSAyNjMsCisgICAgVk5DX0FVVEhfVkVOQ1JZUFRfVExTU0FTTCA9IDI2NCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRW5jb2RpbmcgdHlwZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1JBVyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0NPUFlSRUNUICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1JSRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0NPUlJFICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0hFWFRJTEUgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1pMSUIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1RJR0hUICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1pMSUJIRVggICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1RSTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMGYKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1pSTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1pZV1JMRSAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0NPTVBSRVNTTEVWRUwwICAgICAgIDB4RkZGRkZGMDAgLyogLTI1NiAqLworI2RlZmluZSBWTkNfRU5DT0RJTkdfUVVBTElUWUxFVkVMMCAgICAgICAgMHhGRkZGRkZFMCAvKiAtMzIgICovCisjZGVmaW5lIFZOQ19FTkNPRElOR19YQ1VSU09SICAgICAgICAgICAgICAweEZGRkZGRjEwIC8qIC0yNDAgKi8KKyNkZWZpbmUgVk5DX0VOQ09ESU5HX1JJQ0hfQ1VSU09SICAgICAgICAgIDB4RkZGRkZGMTEgLyogLTIzOSAqLworI2RlZmluZSBWTkNfRU5DT0RJTkdfUE9JTlRFUl9QT1MgICAgICAgICAgMHhGRkZGRkYxOCAvKiAtMjMyICovCisjZGVmaW5lIFZOQ19FTkNPRElOR19MQVNUUkVDVCAgICAgICAgICAgICAweEZGRkZGRjIwIC8qIC0yMjQgKi8KKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0RFU0tUT1BSRVNJWkUgICAgICAgIDB4RkZGRkZGMjEgLyogLTIyMyAqLworI2RlZmluZSBWTkNfRU5DT0RJTkdfUE9JTlRFUl9UWVBFX0NIQU5HRSAgMFhGRkZGRkVGRiAvKiAtMjU3ICovCisjZGVmaW5lIFZOQ19FTkNPRElOR19FWFRfS0VZX0VWRU5UICAgICAgICAwWEZGRkZGRUZFIC8qIC0yNTggKi8KKyNkZWZpbmUgVk5DX0VOQ09ESU5HX0FVRElPICAgICAgICAgICAgICAgIDBYRkZGRkZFRkQgLyogLTI1OSAqLworI2RlZmluZSBWTkNfRU5DT0RJTkdfV01WaSAgICAgICAgICAgICAgICAgMHg1NzRENTY2OQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPdGhlciB0aWdodCBjb25zdGFudHMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBWZW5kb3JzIGtub3duIGJ5IFRpZ2h0Vk5DOiBzdGFuZGFyZCBWTkMvUmVhbFZOQywgVHJpZGlhVk5DLCBhbmQgVGlnaHRWTkMuCisgKi8KKworI2RlZmluZSBWTkNfVElHSFRfQ0NCX1JFU0VUX01BU0sgICAoMHgwZikKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9UWVBFX01BU0sgICAgKDB4MGYgPDwgNCkKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9UWVBFX0ZJTEwgICAgKDB4MDggPDwgNCkKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9UWVBFX0pQRUcgICAgKDB4MDkgPDwgNCkKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9CQVNJQ19NQVggICAgKDB4MDcgPDwgNCkKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9CQVNJQ19aTElCICAgKDB4MDMgPDwgNCkKKyNkZWZpbmUgVk5DX1RJR0hUX0NDQl9CQVNJQ19GSUxURVIgKDB4MDQgPDwgNCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmVhdHVyZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfUkVTSVpFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfSEVYVElMRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfUE9JTlRFUl9UWVBFX0NIQU5HRSAgICAgIDIKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfV01WSSAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfVElHSFQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfWkxJQiAgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfQ09QWVJFQ1QgICAgICAgICAgICAgICAgIDYKKworI2RlZmluZSBWTkNfRkVBVFVSRV9SRVNJWkVfTUFTSyAgICAgICAgICAgICAgKDEgPDwgVk5DX0ZFQVRVUkVfUkVTSVpFKQorI2RlZmluZSBWTkNfRkVBVFVSRV9IRVhUSUxFX01BU0sgICAgICAgICAgICAgKDEgPDwgVk5DX0ZFQVRVUkVfSEVYVElMRSkKKyNkZWZpbmUgVk5DX0ZFQVRVUkVfUE9JTlRFUl9UWVBFX0NIQU5HRV9NQVNLICgxIDw8IFZOQ19GRUFUVVJFX1BPSU5URVJfVFlQRV9DSEFOR0UpCisjZGVmaW5lIFZOQ19GRUFUVVJFX1dNVklfTUFTSyAgICAgICAgICAgICAgICAoMSA8PCBWTkNfRkVBVFVSRV9XTVZJKQorI2RlZmluZSBWTkNfRkVBVFVSRV9USUdIVF9NQVNLICAgICAgICAgICAgICAgKDEgPDwgVk5DX0ZFQVRVUkVfVElHSFQpCisjZGVmaW5lIFZOQ19GRUFUVVJFX1pMSUJfTUFTSyAgICAgICAgICAgICAgICAoMSA8PCBWTkNfRkVBVFVSRV9aTElCKQorI2RlZmluZSBWTkNfRkVBVFVSRV9DT1BZUkVDVF9NQVNLICAgICAgICAgICAgKDEgPDwgVk5DX0ZFQVRVUkVfQ09QWVJFQ1QpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZXJuYWwgQVBJcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRXZlbnQgbG9vcCBmdW5jdGlvbnMgKi8KK3ZvaWQgdm5jX2NsaWVudF9yZWFkKHZvaWQgKm9wYXF1ZSk7Cit2b2lkIHZuY19jbGllbnRfd3JpdGUodm9pZCAqb3BhcXVlKTsKKworbG9uZyB2bmNfY2xpZW50X3JlYWRfYnVmKFZuY1N0YXRlICp2cywgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4pOworbG9uZyB2bmNfY2xpZW50X3dyaXRlX2J1ZihWbmNTdGF0ZSAqdnMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhbGVuKTsKKworLyogUHJvdG9jb2wgSS9PIGZ1bmN0aW9ucyAqLwordm9pZCB2bmNfd3JpdGUoVm5jU3RhdGUgKnZzLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK3ZvaWQgdm5jX3dyaXRlX3UzMihWbmNTdGF0ZSAqdnMsIHVpbnQzMl90IHZhbHVlKTsKK3ZvaWQgdm5jX3dyaXRlX3MzMihWbmNTdGF0ZSAqdnMsIGludDMyX3QgdmFsdWUpOwordm9pZCB2bmNfd3JpdGVfdTE2KFZuY1N0YXRlICp2cywgdWludDE2X3QgdmFsdWUpOwordm9pZCB2bmNfd3JpdGVfdTgoVm5jU3RhdGUgKnZzLCB1aW50OF90IHZhbHVlKTsKK3ZvaWQgdm5jX2ZsdXNoKFZuY1N0YXRlICp2cyk7Cit2b2lkIHZuY19yZWFkX3doZW4oVm5jU3RhdGUgKnZzLCBWbmNSZWFkRXZlbnQgKmZ1bmMsIHNpemVfdCBleHBlY3RpbmcpOworCisKKy8qIEJ1ZmZlciBJL08gZnVuY3Rpb25zICovCit1aW50OF90IHJlYWRfdTgodWludDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCk7Cit1aW50MTZfdCByZWFkX3UxNih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KTsKK2ludDMyX3QgcmVhZF9zMzIodWludDhfdCAqZGF0YSwgc2l6ZV90IG9mZnNldCk7Cit1aW50MzJfdCByZWFkX3UzMih1aW50OF90ICpkYXRhLCBzaXplX3Qgb2Zmc2V0KTsKKworLyogUHJvdG9jb2wgc3RhZ2UgZnVuY3Rpb25zICovCit2b2lkIHZuY19jbGllbnRfZXJyb3IoVm5jU3RhdGUgKnZzKTsKK2ludCB2bmNfY2xpZW50X2lvX2Vycm9yKFZuY1N0YXRlICp2cywgaW50IHJldCwgaW50IGxhc3RfZXJybm8pOworCit2b2lkIHN0YXJ0X2NsaWVudF9pbml0KFZuY1N0YXRlICp2cyk7Cit2b2lkIHN0YXJ0X2F1dGhfdm5jKFZuY1N0YXRlICp2cyk7CisKKy8qIEJ1ZmZlciBtYW5hZ2VtZW50ICovCit2b2lkIGJ1ZmZlcl9yZXNlcnZlKEJ1ZmZlciAqYnVmZmVyLCBzaXplX3QgbGVuKTsKK2ludCBidWZmZXJfZW1wdHkoQnVmZmVyICpidWZmZXIpOwordWludDhfdCAqYnVmZmVyX2VuZChCdWZmZXIgKmJ1ZmZlcik7Cit2b2lkIGJ1ZmZlcl9yZXNldChCdWZmZXIgKmJ1ZmZlcik7Cit2b2lkIGJ1ZmZlcl9hcHBlbmQoQnVmZmVyICpidWZmZXIsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisKKy8qIE1pc2MgaGVscGVycyAqLworCitjaGFyICp2bmNfc29ja2V0X2xvY2FsX2FkZHIoY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgZmQpOworY2hhciAqdm5jX3NvY2tldF9yZW1vdGVfYWRkcihjb25zdCBjaGFyICpmb3JtYXQsIGludCBmZCk7CisKKyNlbmRpZiAvKiBfX1FFTVVfVk5DX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdWkvdm5jX2tleXN5bS5oIGIvYW5kcm9pZC9xZW11MS91aS92bmNfa2V5c3ltLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjYjg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdWkvdm5jX2tleXN5bS5oCkBAIC0wLDAgKzEsMzI0IEBACisKKyNpbmNsdWRlICJrZXltYXBzLmgiCisKK3N0YXRpYyBjb25zdCBuYW1lMmtleXN5bV90IG5hbWUya2V5c3ltW109eworLyogYXNjaWkgKi8KKyAgICB7ICJzcGFjZSIsICAgICAgICAgICAgICAgIDB4MDIwfSwKKyAgICB7ICJleGNsYW0iLCAgICAgICAgICAgICAgIDB4MDIxfSwKKyAgICB7ICJxdW90ZWRibCIsICAgICAgICAgICAgIDB4MDIyfSwKKyAgICB7ICJudW1iZXJzaWduIiwgICAgICAgICAgIDB4MDIzfSwKKyAgICB7ICJkb2xsYXIiLCAgICAgICAgICAgICAgIDB4MDI0fSwKKyAgICB7ICJwZXJjZW50IiwgICAgICAgICAgICAgIDB4MDI1fSwKKyAgICB7ICJhbXBlcnNhbmQiLCAgICAgICAgICAgIDB4MDI2fSwKKyAgICB7ICJhcG9zdHJvcGhlIiwgICAgICAgICAgIDB4MDI3fSwKKyAgICB7ICJwYXJlbmxlZnQiLCAgICAgICAgICAgIDB4MDI4fSwKKyAgICB7ICJwYXJlbnJpZ2h0IiwgICAgICAgICAgIDB4MDI5fSwKKyAgICB7ICJhc3RlcmlzayIsICAgICAgICAgICAgIDB4MDJhfSwKKyAgICB7ICJwbHVzIiwgICAgICAgICAgICAgICAgIDB4MDJifSwKKyAgICB7ICJjb21tYSIsICAgICAgICAgICAgICAgIDB4MDJjfSwKKyAgICB7ICJtaW51cyIsICAgICAgICAgICAgICAgIDB4MDJkfSwKKyAgICB7ICJwZXJpb2QiLCAgICAgICAgICAgICAgIDB4MDJlfSwKKyAgICB7ICJzbGFzaCIsICAgICAgICAgICAgICAgIDB4MDJmfSwKKyAgICB7ICIwIiwgICAgICAgICAgICAgICAgICAgIDB4MDMwfSwKKyAgICB7ICIxIiwgICAgICAgICAgICAgICAgICAgIDB4MDMxfSwKKyAgICB7ICIyIiwgICAgICAgICAgICAgICAgICAgIDB4MDMyfSwKKyAgICB7ICIzIiwgICAgICAgICAgICAgICAgICAgIDB4MDMzfSwKKyAgICB7ICI0IiwgICAgICAgICAgICAgICAgICAgIDB4MDM0fSwKKyAgICB7ICI1IiwgICAgICAgICAgICAgICAgICAgIDB4MDM1fSwKKyAgICB7ICI2IiwgICAgICAgICAgICAgICAgICAgIDB4MDM2fSwKKyAgICB7ICI3IiwgICAgICAgICAgICAgICAgICAgIDB4MDM3fSwKKyAgICB7ICI4IiwgICAgICAgICAgICAgICAgICAgIDB4MDM4fSwKKyAgICB7ICI5IiwgICAgICAgICAgICAgICAgICAgIDB4MDM5fSwKKyAgICB7ICJjb2xvbiIsICAgICAgICAgICAgICAgIDB4MDNhfSwKKyAgICB7ICJzZW1pY29sb24iLCAgICAgICAgICAgIDB4MDNifSwKKyAgICB7ICJsZXNzIiwgICAgICAgICAgICAgICAgIDB4MDNjfSwKKyAgICB7ICJlcXVhbCIsICAgICAgICAgICAgICAgIDB4MDNkfSwKKyAgICB7ICJncmVhdGVyIiwgICAgICAgICAgICAgIDB4MDNlfSwKKyAgICB7ICJxdWVzdGlvbiIsICAgICAgICAgICAgIDB4MDNmfSwKKyAgICB7ICJhdCIsICAgICAgICAgICAgICAgICAgIDB4MDQwfSwKKyAgICB7ICJBIiwgICAgICAgICAgICAgICAgICAgIDB4MDQxfSwKKyAgICB7ICJCIiwgICAgICAgICAgICAgICAgICAgIDB4MDQyfSwKKyAgICB7ICJDIiwgICAgICAgICAgICAgICAgICAgIDB4MDQzfSwKKyAgICB7ICJEIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ0fSwKKyAgICB7ICJFIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ1fSwKKyAgICB7ICJGIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ2fSwKKyAgICB7ICJHIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ3fSwKKyAgICB7ICJIIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ4fSwKKyAgICB7ICJJIiwgICAgICAgICAgICAgICAgICAgIDB4MDQ5fSwKKyAgICB7ICJKIiwgICAgICAgICAgICAgICAgICAgIDB4MDRhfSwKKyAgICB7ICJLIiwgICAgICAgICAgICAgICAgICAgIDB4MDRifSwKKyAgICB7ICJMIiwgICAgICAgICAgICAgICAgICAgIDB4MDRjfSwKKyAgICB7ICJNIiwgICAgICAgICAgICAgICAgICAgIDB4MDRkfSwKKyAgICB7ICJOIiwgICAgICAgICAgICAgICAgICAgIDB4MDRlfSwKKyAgICB7ICJPIiwgICAgICAgICAgICAgICAgICAgIDB4MDRmfSwKKyAgICB7ICJQIiwgICAgICAgICAgICAgICAgICAgIDB4MDUwfSwKKyAgICB7ICJRIiwgICAgICAgICAgICAgICAgICAgIDB4MDUxfSwKKyAgICB7ICJSIiwgICAgICAgICAgICAgICAgICAgIDB4MDUyfSwKKyAgICB7ICJTIiwgICAgICAgICAgICAgICAgICAgIDB4MDUzfSwKKyAgICB7ICJUIiwgICAgICAgICAgICAgICAgICAgIDB4MDU0fSwKKyAgICB7ICJVIiwgICAgICAgICAgICAgICAgICAgIDB4MDU1fSwKKyAgICB7ICJWIiwgICAgICAgICAgICAgICAgICAgIDB4MDU2fSwKKyAgICB7ICJXIiwgICAgICAgICAgICAgICAgICAgIDB4MDU3fSwKKyAgICB7ICJYIiwgICAgICAgICAgICAgICAgICAgIDB4MDU4fSwKKyAgICB7ICJZIiwgICAgICAgICAgICAgICAgICAgIDB4MDU5fSwKKyAgICB7ICJaIiwgICAgICAgICAgICAgICAgICAgIDB4MDVhfSwKKyAgICB7ICJicmFja2V0bGVmdCIsICAgICAgICAgIDB4MDVifSwKKyAgICB7ICJiYWNrc2xhc2giLCAgICAgICAgICAgIDB4MDVjfSwKKyAgICB7ICJicmFja2V0cmlnaHQiLCAgICAgICAgIDB4MDVkfSwKKyAgICB7ICJhc2NpaWNpcmN1bSIsICAgICAgICAgIDB4MDVlfSwKKyAgICB7ICJ1bmRlcnNjb3JlIiwgICAgICAgICAgIDB4MDVmfSwKKyAgICB7ICJncmF2ZSIsICAgICAgICAgICAgICAgIDB4MDYwfSwKKyAgICB7ICJhIiwgICAgICAgICAgICAgICAgICAgIDB4MDYxfSwKKyAgICB7ICJiIiwgICAgICAgICAgICAgICAgICAgIDB4MDYyfSwKKyAgICB7ICJjIiwgICAgICAgICAgICAgICAgICAgIDB4MDYzfSwKKyAgICB7ICJkIiwgICAgICAgICAgICAgICAgICAgIDB4MDY0fSwKKyAgICB7ICJlIiwgICAgICAgICAgICAgICAgICAgIDB4MDY1fSwKKyAgICB7ICJmIiwgICAgICAgICAgICAgICAgICAgIDB4MDY2fSwKKyAgICB7ICJnIiwgICAgICAgICAgICAgICAgICAgIDB4MDY3fSwKKyAgICB7ICJoIiwgICAgICAgICAgICAgICAgICAgIDB4MDY4fSwKKyAgICB7ICJpIiwgICAgICAgICAgICAgICAgICAgIDB4MDY5fSwKKyAgICB7ICJqIiwgICAgICAgICAgICAgICAgICAgIDB4MDZhfSwKKyAgICB7ICJrIiwgICAgICAgICAgICAgICAgICAgIDB4MDZifSwKKyAgICB7ICJsIiwgICAgICAgICAgICAgICAgICAgIDB4MDZjfSwKKyAgICB7ICJtIiwgICAgICAgICAgICAgICAgICAgIDB4MDZkfSwKKyAgICB7ICJuIiwgICAgICAgICAgICAgICAgICAgIDB4MDZlfSwKKyAgICB7ICJvIiwgICAgICAgICAgICAgICAgICAgIDB4MDZmfSwKKyAgICB7ICJwIiwgICAgICAgICAgICAgICAgICAgIDB4MDcwfSwKKyAgICB7ICJxIiwgICAgICAgICAgICAgICAgICAgIDB4MDcxfSwKKyAgICB7ICJyIiwgICAgICAgICAgICAgICAgICAgIDB4MDcyfSwKKyAgICB7ICJzIiwgICAgICAgICAgICAgICAgICAgIDB4MDczfSwKKyAgICB7ICJ0IiwgICAgICAgICAgICAgICAgICAgIDB4MDc0fSwKKyAgICB7ICJ1IiwgICAgICAgICAgICAgICAgICAgIDB4MDc1fSwKKyAgICB7ICJ2IiwgICAgICAgICAgICAgICAgICAgIDB4MDc2fSwKKyAgICB7ICJ3IiwgICAgICAgICAgICAgICAgICAgIDB4MDc3fSwKKyAgICB7ICJ4IiwgICAgICAgICAgICAgICAgICAgIDB4MDc4fSwKKyAgICB7ICJ5IiwgICAgICAgICAgICAgICAgICAgIDB4MDc5fSwKKyAgICB7ICJ6IiwgICAgICAgICAgICAgICAgICAgIDB4MDdhfSwKKyAgICB7ICJicmFjZWxlZnQiLCAgICAgICAgICAgIDB4MDdifSwKKyAgICB7ICJiYXIiLCAgICAgICAgICAgICAgICAgIDB4MDdjfSwKKyAgICB7ICJicmFjZXJpZ2h0IiwgICAgICAgICAgIDB4MDdkfSwKKyAgICB7ICJhc2NpaXRpbGRlIiwgICAgICAgICAgIDB4MDdlfSwKKworLyogbGF0aW4gMSBleHRlbnNpb25zICovCit7ICJub2JyZWFrc3BhY2UiLCAgICAgICAgIDB4MGEwfSwKK3sgImV4Y2xhbWRvd24iLCAgICAgICAgICAgMHgwYTF9LAoreyAiY2VudCIsICAgICAgICAgCSAgMHgwYTJ9LAoreyAic3RlcmxpbmciLCAgICAgICAgICAgICAweDBhM30sCit7ICJjdXJyZW5jeSIsICAgICAgICAgICAgIDB4MGE0fSwKK3sgInllbiIsICAgICAgICAgICAgICAgICAgMHgwYTV9LAoreyAiYnJva2VuYmFyIiwgICAgICAgICAgICAweDBhNn0sCit7ICJzZWN0aW9uIiwgICAgICAgICAgICAgIDB4MGE3fSwKK3sgImRpYWVyZXNpcyIsICAgICAgICAgICAgMHgwYTh9LAoreyAiY29weXJpZ2h0IiwgICAgICAgICAgICAweDBhOX0sCit7ICJvcmRmZW1pbmluZSIsICAgICAgICAgIDB4MGFhfSwKK3sgImd1aWxsZW1vdGxlZnQiLCAgICAgICAgMHgwYWJ9LAoreyAibm90c2lnbiIsICAgICAgICAgICAgICAweDBhY30sCit7ICJoeXBoZW4iLCAgICAgICAgICAgICAgIDB4MGFkfSwKK3sgInJlZ2lzdGVyZWQiLCAgICAgICAgICAgMHgwYWV9LAoreyAibWFjcm9uIiwgICAgICAgICAgICAgICAweDBhZn0sCit7ICJkZWdyZWUiLCAgICAgICAgICAgICAgIDB4MGIwfSwKK3sgInBsdXNtaW51cyIsICAgICAgICAgICAgMHgwYjF9LAoreyAidHdvc3VwZXJpb3IiLCAgICAgICAgICAweDBiMn0sCit7ICJ0aHJlZXN1cGVyaW9yIiwgICAgICAgIDB4MGIzfSwKK3sgImFjdXRlIiwgICAgICAgICAgICAgICAgMHgwYjR9LAoreyAibXUiLCAgICAgICAgICAgICAgICAgICAweDBiNX0sCit7ICJwYXJhZ3JhcGgiLCAgICAgICAgICAgIDB4MGI2fSwKK3sgInBlcmlvZGNlbnRlcmVkIiwgICAgICAgMHgwYjd9LAoreyAiY2VkaWxsYSIsICAgICAgICAgICAgICAweDBiOH0sCit7ICJvbmVzdXBlcmlvciIsICAgICAgICAgIDB4MGI5fSwKK3sgIm1hc2N1bGluZSIsICAgICAgICAgICAgMHgwYmF9LAoreyAiZ3VpbGxlbW90cmlnaHQiLCAgICAgICAweDBiYn0sCit7ICJvbmVxdWFydGVyIiwgICAgICAgICAgIDB4MGJjfSwKK3sgIm9uZWhhbGYiLCAgICAgICAgICAgICAgMHgwYmR9LAoreyAidGhyZWVxdWFydGVycyIsICAgICAgICAweDBiZX0sCit7ICJxdWVzdGlvbmRvd24iLCAgICAgICAgIDB4MGJmfSwKK3sgIkFncmF2ZSIsICAgICAgICAgICAgICAgMHgwYzB9LAoreyAiQWFjdXRlIiwgICAgICAgICAgICAgICAweDBjMX0sCit7ICJBY2lyY3VtZmxleCIsICAgICAgICAgIDB4MGMyfSwKK3sgIkF0aWxkZSIsICAgICAgICAgICAgICAgMHgwYzN9LAoreyAiQWRpYWVyZXNpcyIsICAgICAgICAgICAweDBjNH0sCit7ICJBcmluZyIsICAgICAgICAgICAgICAgIDB4MGM1fSwKK3sgIkFFIiwgICAgICAgICAgICAgICAgICAgMHgwYzZ9LAoreyAiQ2NlZGlsbGEiLCAgICAgICAgICAgICAweDBjN30sCit7ICJFZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGM4fSwKK3sgIkVhY3V0ZSIsICAgICAgICAgICAgICAgMHgwYzl9LAoreyAiRWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBjYX0sCit7ICJFZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGNifSwKK3sgIklncmF2ZSIsICAgICAgICAgICAgICAgMHgwY2N9LAoreyAiSWFjdXRlIiwgICAgICAgICAgICAgICAweDBjZH0sCit7ICJJY2lyY3VtZmxleCIsICAgICAgICAgIDB4MGNlfSwKK3sgIklkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwY2Z9LAoreyAiRVRIIiwgICAgICAgICAgICAgICAgICAweDBkMH0sCit7ICJFdGgiLCAgICAgICAgICAgICAgICAgIDB4MGQwfSwKK3sgIk50aWxkZSIsICAgICAgICAgICAgICAgMHgwZDF9LAoreyAiT2dyYXZlIiwgICAgICAgICAgICAgICAweDBkMn0sCit7ICJPYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGQzfSwKK3sgIk9jaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZDR9LAoreyAiT3RpbGRlIiwgICAgICAgICAgICAgICAweDBkNX0sCit7ICJPZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGQ2fSwKK3sgIm11bHRpcGx5IiwgICAgICAgICAgICAgMHgwZDd9LAoreyAiT29ibGlxdWUiLCAgICAgICAgICAgICAweDBkOH0sCit7ICJPc2xhc2giLCAgICAgICAgICAgICAgIDB4MGQ4fSwKK3sgIlVncmF2ZSIsICAgICAgICAgICAgICAgMHgwZDl9LAoreyAiVWFjdXRlIiwgICAgICAgICAgICAgICAweDBkYX0sCit7ICJVY2lyY3VtZmxleCIsICAgICAgICAgIDB4MGRifSwKK3sgIlVkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZGN9LAoreyAiWWFjdXRlIiwgICAgICAgICAgICAgICAweDBkZH0sCit7ICJUSE9STiIsICAgICAgICAgICAgICAgIDB4MGRlfSwKK3sgIlRob3JuIiwgICAgICAgICAgICAgICAgMHgwZGV9LAoreyAic3NoYXJwIiwgICAgICAgICAgICAgICAweDBkZn0sCit7ICJhZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGUwfSwKK3sgImFhY3V0ZSIsICAgICAgICAgICAgICAgMHgwZTF9LAoreyAiYWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBlMn0sCit7ICJhdGlsZGUiLCAgICAgICAgICAgICAgIDB4MGUzfSwKK3sgImFkaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZTR9LAoreyAiYXJpbmciLCAgICAgICAgICAgICAgICAweDBlNX0sCit7ICJhZSIsICAgICAgICAgICAgICAgICAgIDB4MGU2fSwKK3sgImNjZWRpbGxhIiwgICAgICAgICAgICAgMHgwZTd9LAoreyAiZWdyYXZlIiwgICAgICAgICAgICAgICAweDBlOH0sCit7ICJlYWN1dGUiLCAgICAgICAgICAgICAgIDB4MGU5fSwKK3sgImVjaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZWF9LAoreyAiZWRpYWVyZXNpcyIsICAgICAgICAgICAweDBlYn0sCit7ICJpZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGVjfSwKK3sgImlhY3V0ZSIsICAgICAgICAgICAgICAgMHgwZWR9LAoreyAiaWNpcmN1bWZsZXgiLCAgICAgICAgICAweDBlZX0sCit7ICJpZGlhZXJlc2lzIiwgICAgICAgICAgIDB4MGVmfSwKK3sgImV0aCIsICAgICAgICAgICAgICAgICAgMHgwZjB9LAoreyAibnRpbGRlIiwgICAgICAgICAgICAgICAweDBmMX0sCit7ICJvZ3JhdmUiLCAgICAgICAgICAgICAgIDB4MGYyfSwKK3sgIm9hY3V0ZSIsICAgICAgICAgICAgICAgMHgwZjN9LAoreyAib2NpcmN1bWZsZXgiLCAgICAgICAgICAweDBmNH0sCit7ICJvdGlsZGUiLCAgICAgICAgICAgICAgIDB4MGY1fSwKK3sgIm9kaWFlcmVzaXMiLCAgICAgICAgICAgMHgwZjZ9LAoreyAiZGl2aXNpb24iLCAgICAgICAgICAgICAweDBmN30sCit7ICJvc2xhc2giLCAgICAgICAgICAgICAgIDB4MGY4fSwKK3sgIm9vYmxpcXVlIiwgICAgICAgICAgICAgMHgwZjh9LAoreyAidWdyYXZlIiwgICAgICAgICAgICAgICAweDBmOX0sCit7ICJ1YWN1dGUiLCAgICAgICAgICAgICAgIDB4MGZhfSwKK3sgInVjaXJjdW1mbGV4IiwgICAgICAgICAgMHgwZmJ9LAoreyAidWRpYWVyZXNpcyIsICAgICAgICAgICAweDBmY30sCit7ICJ5YWN1dGUiLCAgICAgICAgICAgICAgIDB4MGZkfSwKK3sgInRob3JuIiwgICAgICAgICAgICAgICAgMHgwZmV9LAoreyAieWRpYWVyZXNpcyIsICAgICAgICAgICAweDBmZn0sCit7IkV1cm9TaWduIiwgMHgyMGFjfSwgIC8qIFhLX0V1cm9TaWduICovCisKKyAgICAvKiBtb2RpZmllcnMgKi8KK3siSVNPX0xldmVsM19TaGlmdCIsIDB4ZmUwM30sIC8qIFhLX0lTT19MZXZlbDNfU2hpZnQgKi8KK3siQ29udHJvbF9MIiwgMHhmZmUzfSwgLyogWEtfQ29udHJvbF9MICovCit7IkNvbnRyb2xfUiIsIDB4ZmZlNH0sIC8qIFhLX0NvbnRyb2xfUiAqLworeyJBbHRfTCIsIDB4ZmZlOX0sICAgICAvKiBYS19BbHRfTCAqLworeyJBbHRfUiIsIDB4ZmZlYX0sICAgICAvKiBYS19BbHRfUiAqLworeyJDYXBzX0xvY2siLCAweGZmZTV9LCAvKiBYS19DYXBzX0xvY2sgKi8KK3siTWV0YV9MIiwgMHhmZmU3fSwgICAgLyogWEtfTWV0YV9MICovCit7Ik1ldGFfUiIsIDB4ZmZlOH0sICAgIC8qIFhLX01ldGFfUiAqLworeyJTaGlmdF9MIiwgMHhmZmUxfSwgICAvKiBYS19TaGlmdF9MICovCit7IlNoaWZ0X1IiLCAweGZmZTJ9LCAgIC8qIFhLX1NoaWZ0X1IgKi8KK3siU3VwZXJfTCIsIDB4ZmZlYn0sICAgLyogWEtfU3VwZXJfTCAqLworeyJTdXBlcl9SIiwgMHhmZmVjfSwgICAvKiBYS19TdXBlcl9SICovCisKKyAgICAvKiBzcGVjaWFsIGtleXMgKi8KK3siQmFja1NwYWNlIiwgMHhmZjA4fSwgLyogWEtfQmFja1NwYWNlICovCit7IlRhYiIsIDB4ZmYwOX0sICAgICAgIC8qIFhLX1RhYiAqLworeyJSZXR1cm4iLCAweGZmMGR9LCAgICAvKiBYS19SZXR1cm4gKi8KK3siUmlnaHQiLCAweGZmNTN9LCAgICAgLyogWEtfUmlnaHQgKi8KK3siTGVmdCIsIDB4ZmY1MX0sICAgICAgLyogWEtfTGVmdCAqLworeyJVcCIsIDB4ZmY1Mn0sICAgICAgICAvKiBYS19VcCAqLworeyJEb3duIiwgMHhmZjU0fSwgICAgICAvKiBYS19Eb3duICovCit7IlBhZ2VfRG93biIsIDB4ZmY1Nn0sIC8qIFhLX1BhZ2VfRG93biAqLworeyJQYWdlX1VwIiwgMHhmZjU1fSwgICAvKiBYS19QYWdlX1VwICovCit7Ikluc2VydCIsIDB4ZmY2M30sICAgIC8qIFhLX0luc2VydCAqLworeyJEZWxldGUiLCAweGZmZmZ9LCAgICAvKiBYS19EZWxldGUgKi8KK3siSG9tZSIsIDB4ZmY1MH0sICAgICAgLyogWEtfSG9tZSAqLworeyJFbmQiLCAweGZmNTd9LCAgICAgICAvKiBYS19FbmQgKi8KK3siU2Nyb2xsX0xvY2siLCAweGZmMTR9LCAvKiBYS19TY3JvbGxfTG9jayAqLworeyJLUF9Ib21lIiwgMHhmZjk1fSwKK3siS1BfTGVmdCIsIDB4ZmY5Nn0sCit7IktQX1VwIiwgMHhmZjk3fSwKK3siS1BfUmlnaHQiLCAweGZmOTh9LAoreyJLUF9Eb3duIiwgMHhmZjk5fSwKK3siS1BfUHJpb3IiLCAweGZmOWF9LAoreyJLUF9QYWdlX1VwIiwgMHhmZjlhfSwKK3siS1BfTmV4dCIsIDB4ZmY5Yn0sCit7IktQX1BhZ2VfRG93biIsIDB4ZmY5Yn0sCit7IktQX0VuZCIsIDB4ZmY5Y30sCit7IktQX0JlZ2luIiwgMHhmZjlkfSwKK3siS1BfSW5zZXJ0IiwgMHhmZjllfSwKK3siS1BfRGVsZXRlIiwgMHhmZjlmfSwKK3siRjEiLCAweGZmYmV9LCAgICAgICAgLyogWEtfRjEgKi8KK3siRjIiLCAweGZmYmZ9LCAgICAgICAgLyogWEtfRjIgKi8KK3siRjMiLCAweGZmYzB9LCAgICAgICAgLyogWEtfRjMgKi8KK3siRjQiLCAweGZmYzF9LCAgICAgICAgLyogWEtfRjQgKi8KK3siRjUiLCAweGZmYzJ9LCAgICAgICAgLyogWEtfRjUgKi8KK3siRjYiLCAweGZmYzN9LCAgICAgICAgLyogWEtfRjYgKi8KK3siRjciLCAweGZmYzR9LCAgICAgICAgLyogWEtfRjcgKi8KK3siRjgiLCAweGZmYzV9LCAgICAgICAgLyogWEtfRjggKi8KK3siRjkiLCAweGZmYzZ9LCAgICAgICAgLyogWEtfRjkgKi8KK3siRjEwIiwgMHhmZmM3fSwgICAgICAgLyogWEtfRjEwICovCit7IkYxMSIsIDB4ZmZjOH0sICAgICAgIC8qIFhLX0YxMSAqLworeyJGMTIiLCAweGZmYzl9LCAgICAgICAvKiBYS19GMTIgKi8KK3siRjEzIiwgMHhmZmNhfSwgICAgICAgLyogWEtfRjEzICovCit7IkYxNCIsIDB4ZmZjYn0sICAgICAgIC8qIFhLX0YxNCAqLworeyJGMTUiLCAweGZmY2N9LCAgICAgICAvKiBYS19GMTUgKi8KK3siU3lzX1JlcSIsIDB4ZmYxNX0sICAgLyogWEtfU3lzX1JlcSAqLworeyJLUF8wIiwgMHhmZmIwfSwgICAgICAvKiBYS19LUF8wICovCit7IktQXzEiLCAweGZmYjF9LCAgICAgIC8qIFhLX0tQXzEgKi8KK3siS1BfMiIsIDB4ZmZiMn0sICAgICAgLyogWEtfS1BfMiAqLworeyJLUF8zIiwgMHhmZmIzfSwgICAgICAvKiBYS19LUF8zICovCit7IktQXzQiLCAweGZmYjR9LCAgICAgIC8qIFhLX0tQXzQgKi8KK3siS1BfNSIsIDB4ZmZiNX0sICAgICAgLyogWEtfS1BfNSAqLworeyJLUF82IiwgMHhmZmI2fSwgICAgICAvKiBYS19LUF82ICovCit7IktQXzciLCAweGZmYjd9LCAgICAgIC8qIFhLX0tQXzcgKi8KK3siS1BfOCIsIDB4ZmZiOH0sICAgICAgLyogWEtfS1BfOCAqLworeyJLUF85IiwgMHhmZmI5fSwgICAgICAvKiBYS19LUF85ICovCit7IktQX0FkZCIsIDB4ZmZhYn0sICAgIC8qIFhLX0tQX0FkZCAqLworeyJLUF9TZXBhcmF0b3IiLCAweGZmYWN9LC8qIFhLX0tQX1NlcGFyYXRvciAqLworeyJLUF9EZWNpbWFsIiwgMHhmZmFlfSwgIC8qIFhLX0tQX0RlY2ltYWwgKi8KK3siS1BfRGl2aWRlIiwgMHhmZmFmfSwgICAvKiBYS19LUF9EaXZpZGUgKi8KK3siS1BfRW50ZXIiLCAweGZmOGR9LCAgICAvKiBYS19LUF9FbnRlciAqLworeyJLUF9FcXVhbCIsIDB4ZmZiZH0sICAgIC8qIFhLX0tQX0VxdWFsICovCit7IktQX011bHRpcGx5IiwgMHhmZmFhfSwgLyogWEtfS1BfTXVsdGlwbHkgKi8KK3siS1BfU3VidHJhY3QiLCAweGZmYWR9LCAvKiBYS19LUF9TdWJ0cmFjdCAqLworeyJoZWxwIiwgMHhmZjZhfSwgICAgICAgIC8qIFhLX0hlbHAgKi8KK3siTWVudSIsIDB4ZmY2N30sICAgICAgICAvKiBYS19NZW51ICovCit7IlByaW50IiwgMHhmZjYxfSwgICAgICAgLyogWEtfUHJpbnQgKi8KK3siTW9kZV9zd2l0Y2giLCAweGZmN2V9LCAvKiBYS19Nb2RlX3N3aXRjaCAqLworeyJOdW1fTG9jayIsIDB4ZmY3Zn0sICAgIC8qIFhLX051bV9Mb2NrICovCit7IlBhdXNlIiwgMHhmZjEzfSwgICAgICAgLyogWEtfUGF1c2UgKi8KK3siRXNjYXBlIiwgMHhmZjFifSwgICAgICAvKiBYS19Fc2NhcGUgKi8KKworLyogZGVhZCBrZXlzICovCit7ImRlYWRfZ3JhdmUiLCAweGZlNTB9LCAvKiBYS19kZWFkX2dyYXZlICovCit7ImRlYWRfYWN1dGUiLCAweGZlNTF9LCAvKiBYS19kZWFkX2FjdXRlICovCit7ImRlYWRfY2lyY3VtZmxleCIsIDB4ZmU1Mn0sIC8qIFhLX2RlYWRfY2lyY3VtZmxleCAqLworeyJkZWFkX3RpbGRlIiwgMHhmZTUzfSwgLyogWEtfZGVhZF90aWxkZSAqLworeyJkZWFkX21hY3JvbiIsIDB4ZmU1NH0sIC8qIFhLX2RlYWRfbWFjcm9uICovCit7ImRlYWRfYnJldmUiLCAweGZlNTV9LCAvKiBYS19kZWFkX2JyZXZlICovCit7ImRlYWRfYWJvdmVkb3QiLCAweGZlNTZ9LCAvKiBYS19kZWFkX2Fib3ZlZG90ICovCit7ImRlYWRfZGlhZXJlc2lzIiwgMHhmZTU3fSwgLyogWEtfZGVhZF9kaWFlcmVzaXMgKi8KK3siZGVhZF9hYm92ZXJpbmciLCAweGZlNTh9LCAvKiBYS19kZWFkX2Fib3ZlcmluZyAqLworeyJkZWFkX2RvdWJsZWFjdXRlIiwgMHhmZTU5fSwgLyogWEtfZGVhZF9kb3VibGVhY3V0ZSAqLworeyJkZWFkX2Nhcm9uIiwgMHhmZTVhfSwgLyogWEtfZGVhZF9jYXJvbiAqLworeyJkZWFkX2NlZGlsbGEiLCAweGZlNWJ9LCAvKiBYS19kZWFkX2NlZGlsbGEgKi8KK3siZGVhZF9vZ29uZWsiLCAweGZlNWN9LCAvKiBYS19kZWFkX29nb25layAqLworeyJkZWFkX2lvdGEiLCAweGZlNWR9LCAvKiBYS19kZWFkX2lvdGEgKi8KK3siZGVhZF92b2ljZWRfc291bmQiLCAweGZlNWV9LCAvKiBYS19kZWFkX3ZvaWNlZF9zb3VuZCAqLworeyJkZWFkX3NlbWl2b2ljZWRfc291bmQiLCAweGZlNWZ9LCAvKiBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgKi8KK3siZGVhZF9iZWxvd2RvdCIsIDB4ZmU2MH0sIC8qIFhLX2RlYWRfYmVsb3dkb3QgKi8KK3siZGVhZF9ob29rIiwgMHhmZTYxfSwgLyogWEtfZGVhZF9ob29rICovCit7ImRlYWRfaG9ybiIsIDB4ZmU2Mn0sIC8qIFhLX2RlYWRfaG9ybiAqLworCisKKyAgICAvKiBsb2NhbGl6ZWQga2V5cyAqLworeyJCYWNrQXBvc3Ryb3BoZSIsIDB4ZmYyMX0sCit7Ik11aGVua2FuIiwgMHhmZjIyfSwKK3siS2F0YWthbmEiLCAweGZmMjd9LAoreyJIYW5rYWt1IiwgMHhmZjI5fSwKK3siWmVua2FrdV9IYW5rYWt1IiwgMHhmZjJhfSwKK3siSGVua2FuX01vZGVfUmVhbCIsIDB4ZmYyM30sCit7Ikhlbmthbl9Nb2RlX1VsdHJhIiwgMHhmZjNlfSwKK3siYmFja3NsYXNoX2phIiwgMHhmZmE1fSwKK3siS2F0YWthbmFfUmVhbCIsIDB4ZmYyNX0sCit7IkVpc3VfdG9nZ2xlIiwgMHhmZjMwfSwKKwore05VTEwsMH0sCit9OwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91aS92bmNoZXh0aWxlLmggYi9hbmRyb2lkL3FlbXUxL3VpL3ZuY2hleHRpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzAwNzVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91aS92bmNoZXh0aWxlLmgKQEAgLTAsMCArMSwyMDkgQEAKKyNkZWZpbmUgQ09OQ0FUX0koYSwgYikgYSAjIyBiCisjZGVmaW5lIENPTkNBVChhLCBiKSBDT05DQVRfSShhLCBiKQorI2RlZmluZSBwaXhlbF90IENPTkNBVCh1aW50LCBDT05DQVQoQlBQLCBfdCkpCisjaWZkZWYgR0VORVJJQworI2RlZmluZSBOQU1FIENPTkNBVChnZW5lcmljXywgQlBQKQorI2Vsc2UKKyNkZWZpbmUgTkFNRSBCUFAKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBDT05DQVQoc2VuZF9oZXh0aWxlX3RpbGVfLCBOQU1FKShWbmNTdGF0ZSAqdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxhc3RfYmdfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbGFzdF9mZ18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhhc19iZywgaW50ICpoYXNfZmcpCit7CisgICAgdWludDhfdCAqcm93ID0gdnMtPnNlcnZlci5kcy0+ZGF0YSArIHkgKiBkc19nZXRfbGluZXNpemUodnMtPmRzKSArIHggKiBkc19nZXRfYnl0ZXNfcGVyX3BpeGVsKHZzLT5kcyk7CisgICAgcGl4ZWxfdCAqaXJvdyA9IChwaXhlbF90ICopcm93OworICAgIGludCBqLCBpOworICAgIHBpeGVsX3QgKmxhc3RfYmcgPSAocGl4ZWxfdCAqKWxhc3RfYmdfOworICAgIHBpeGVsX3QgKmxhc3RfZmcgPSAocGl4ZWxfdCAqKWxhc3RfZmdfOworICAgIHBpeGVsX3QgYmcgPSAwOworICAgIHBpeGVsX3QgZmcgPSAwOworICAgIGludCBuX2NvbG9ycyA9IDA7CisgICAgaW50IGJnX2NvdW50ID0gMDsKKyAgICBpbnQgZmdfY291bnQgPSAwOworICAgIGludCBmbGFncyA9IDA7CisgICAgdWludDhfdCBkYXRhWyh2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsICsgMikgKiAxNiAqIDE2XTsKKyAgICBpbnQgbl9kYXRhID0gMDsKKyAgICBpbnQgbl9zdWJ0aWxlcyA9IDA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisJZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworCSAgICBzd2l0Y2ggKG5fY29sb3JzKSB7CisJICAgIGNhc2UgMDoKKwkJYmcgPSBpcm93W2ldOworCQluX2NvbG9ycyA9IDE7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCWlmIChpcm93W2ldICE9IGJnKSB7CisJCSAgICBmZyA9IGlyb3dbaV07CisJCSAgICBuX2NvbG9ycyA9IDI7CisJCX0KKwkJYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJaWYgKGlyb3dbaV0gIT0gYmcgJiYgaXJvd1tpXSAhPSBmZykgeworCQkgICAgbl9jb2xvcnMgPSAzOworCQl9IGVsc2UgeworCQkgICAgaWYgKGlyb3dbaV0gPT0gYmcpCisJCQliZ19jb3VudCsrOworCQkgICAgZWxzZSBpZiAoaXJvd1tpXSA9PSBmZykKKwkJCWZnX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCWJyZWFrOworCSAgICB9CisJfQorCWlmIChuX2NvbG9ycyA+IDIpCisJICAgIGJyZWFrOworCWlyb3cgKz0gZHNfZ2V0X2xpbmVzaXplKHZzLT5kcykgLyBzaXplb2YocGl4ZWxfdCk7CisgICAgfQorCisgICAgaWYgKG5fY29sb3JzID4gMSAmJiBmZ19jb3VudCA+IGJnX2NvdW50KSB7CisJcGl4ZWxfdCB0bXAgPSBmZzsKKwlmZyA9IGJnOworCWJnID0gdG1wOworICAgIH0KKworICAgIGlmICghKmhhc19iZyB8fCAqbGFzdF9iZyAhPSBiZykgeworCWZsYWdzIHw9IDB4MDI7CisJKmhhc19iZyA9IDE7CisJKmxhc3RfYmcgPSBiZzsKKyAgICB9CisKKyAgICBpZiAobl9jb2xvcnMgPCAzICYmICghKmhhc19mZyB8fCAqbGFzdF9mZyAhPSBmZykpIHsKKwlmbGFncyB8PSAweDA0OworCSpoYXNfZmcgPSAxOworCSpsYXN0X2ZnID0gZmc7CisgICAgfQorCisgICAgc3dpdGNoIChuX2NvbG9ycykgeworICAgIGNhc2UgMToKKwluX2RhdGEgPSAwOworCWJyZWFrOworICAgIGNhc2UgMjoKKwlmbGFncyB8PSAweDA4OworCisJaXJvdyA9IChwaXhlbF90ICopcm93OworCisJZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworCSAgICBpbnQgbWluX3ggPSAtMTsKKwkgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworCQlpZiAoaXJvd1tpXSA9PSBmZykgeworCQkgICAgaWYgKG1pbl94ID09IC0xKQorCQkJbWluX3ggPSBpOworCQl9IGVsc2UgaWYgKG1pbl94ICE9IC0xKSB7CisJCSAgICBoZXh0aWxlX2VuY19jb3JkKGRhdGEgKyBuX2RhdGEsIG1pbl94LCBqLCBpIC0gbWluX3gsIDEpOworCQkgICAgbl9kYXRhICs9IDI7CisJCSAgICBuX3N1YnRpbGVzKys7CisJCSAgICBtaW5feCA9IC0xOworCQl9CisJICAgIH0KKwkgICAgaWYgKG1pbl94ICE9IC0xKSB7CisJCWhleHRpbGVfZW5jX2NvcmQoZGF0YSArIG5fZGF0YSwgbWluX3gsIGosIGkgLSBtaW5feCwgMSk7CisJCW5fZGF0YSArPSAyOworCQluX3N1YnRpbGVzKys7CisJICAgIH0KKwkgICAgaXJvdyArPSBkc19nZXRfbGluZXNpemUodnMtPmRzKSAvIHNpemVvZihwaXhlbF90KTsKKwl9CisJYnJlYWs7CisgICAgY2FzZSAzOgorCWZsYWdzIHw9IDB4MTg7CisKKwlpcm93ID0gKHBpeGVsX3QgKilyb3c7CisKKwlpZiAoISpoYXNfYmcgfHwgKmxhc3RfYmcgIT0gYmcpCisJICAgIGZsYWdzIHw9IDB4MDI7CisKKwlmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisJICAgIGludCBoYXNfY29sb3IgPSAwOworCSAgICBpbnQgbWluX3ggPSAtMTsKKwkgICAgcGl4ZWxfdCBjb2xvciA9IDA7IC8qIHNodXQgdXAgZ2NjICovCisKKwkgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworCQlpZiAoIWhhc19jb2xvcikgeworCQkgICAgaWYgKGlyb3dbaV0gPT0gYmcpCisJCQljb250aW51ZTsKKwkJICAgIGNvbG9yID0gaXJvd1tpXTsKKwkJICAgIG1pbl94ID0gaTsKKwkJICAgIGhhc19jb2xvciA9IDE7CisJCX0gZWxzZSBpZiAoaXJvd1tpXSAhPSBjb2xvcikgeworCQkgICAgaGFzX2NvbG9yID0gMDsKKyNpZmRlZiBHRU5FUklDCisgICAgICAgICAgICAgICAgICAgIHZuY19jb252ZXJ0X3BpeGVsKHZzLCBkYXRhICsgbl9kYXRhLCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIG5fZGF0YSArPSB2cy0+Y2xpZW50ZHMucGYuYnl0ZXNfcGVyX3BpeGVsOworI2Vsc2UKKwkJICAgIG1lbWNweShkYXRhICsgbl9kYXRhLCAmY29sb3IsIHNpemVvZihjb2xvcikpOworICAgICAgICAgICAgICAgICAgICBuX2RhdGEgKz0gc2l6ZW9mKHBpeGVsX3QpOworI2VuZGlmCisJCSAgICBoZXh0aWxlX2VuY19jb3JkKGRhdGEgKyBuX2RhdGEsIG1pbl94LCBqLCBpIC0gbWluX3gsIDEpOworCQkgICAgbl9kYXRhICs9IDI7CisJCSAgICBuX3N1YnRpbGVzKys7CisKKwkJICAgIG1pbl94ID0gLTE7CisJCSAgICBpZiAoaXJvd1tpXSAhPSBiZykgeworCQkJY29sb3IgPSBpcm93W2ldOworCQkJbWluX3ggPSBpOworCQkJaGFzX2NvbG9yID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICAgIGlmIChoYXNfY29sb3IpIHsKKyNpZmRlZiBHRU5FUklDCisgICAgICAgICAgICAgICAgdm5jX2NvbnZlcnRfcGl4ZWwodnMsIGRhdGEgKyBuX2RhdGEsIGNvbG9yKTsKKyAgICAgICAgICAgICAgICBuX2RhdGEgKz0gdnMtPmNsaWVudGRzLnBmLmJ5dGVzX3Blcl9waXhlbDsKKyNlbHNlCisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyBuX2RhdGEsICZjb2xvciwgc2l6ZW9mKGNvbG9yKSk7CisgICAgICAgICAgICAgICAgbl9kYXRhICs9IHNpemVvZihwaXhlbF90KTsKKyNlbmRpZgorCQloZXh0aWxlX2VuY19jb3JkKGRhdGEgKyBuX2RhdGEsIG1pbl94LCBqLCBpIC0gbWluX3gsIDEpOworCQluX2RhdGEgKz0gMjsKKwkJbl9zdWJ0aWxlcysrOworCSAgICB9CisJICAgIGlyb3cgKz0gZHNfZ2V0X2xpbmVzaXplKHZzLT5kcykgLyBzaXplb2YocGl4ZWxfdCk7CisJfQorCisJLyogQSBTdWJyZWN0c0NvbG91cmVkIHN1YnRpbGUgaW52YWxpZGF0ZXMgdGhlIGZvcmVncm91bmQgY29sb3IgKi8KKwkqaGFzX2ZnID0gMDsKKwlpZiAobl9kYXRhID4gKHcgKiBoICogKGludClzaXplb2YocGl4ZWxfdCkpKSB7CisJICAgIG5fY29sb3JzID0gNDsKKwkgICAgZmxhZ3MgPSAweDAxOworCSAgICAqaGFzX2JnID0gMDsKKworCSAgICAvKiB3ZSByZWFsbHkgZG9uJ3QgaGF2ZSB0byBpbnZhbGlkYXRlIGVpdGhlciB0aGUgYmcgb3IgZmcKKwkgICAgICAgYnV0IHdlJ3ZlIGxvc3QgdGhlIG9sZCB2YWx1ZXMuICBvaCB3ZWxsLiAqLworCX0KKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKworICAgIGlmIChuX2NvbG9ycyA+IDMpIHsKKwlmbGFncyA9IDB4MDE7CisJKmhhc19mZyA9IDA7CisJKmhhc19iZyA9IDA7CisJbl9jb2xvcnMgPSA0OworICAgIH0KKworICAgIHZuY193cml0ZV91OCh2cywgZmxhZ3MpOworICAgIGlmIChuX2NvbG9ycyA8IDQpIHsKKwlpZiAoZmxhZ3MgJiAweDAyKQorCSAgICB2cy0+d3JpdGVfcGl4ZWxzKHZzLCBsYXN0X2JnLCBzaXplb2YocGl4ZWxfdCkpOworCWlmIChmbGFncyAmIDB4MDQpCisJICAgIHZzLT53cml0ZV9waXhlbHModnMsIGxhc3RfZmcsIHNpemVvZihwaXhlbF90KSk7CisJaWYgKG5fc3VidGlsZXMpIHsKKwkgICAgdm5jX3dyaXRlX3U4KHZzLCBuX3N1YnRpbGVzKTsKKwkgICAgdm5jX3dyaXRlKHZzLCBkYXRhLCBuX2RhdGEpOworCX0KKyAgICB9IGVsc2UgeworCWZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKwkgICAgdnMtPndyaXRlX3BpeGVscyh2cywgcm93LCB3ICogZHNfZ2V0X2J5dGVzX3Blcl9waXhlbCh2cy0+ZHMpKTsKKwkgICAgcm93ICs9IGRzX2dldF9saW5lc2l6ZSh2cy0+ZHMpOworCX0KKyAgICB9Cit9CisKKyN1bmRlZiBOQU1FCisjdW5kZWYgcGl4ZWxfdAorI3VuZGVmIENPTkNBVF9JCisjdW5kZWYgQ09OQ0FUCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvYWVzLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvYWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3NmE5YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9hZXMuYwpAQCAtMCwwICsxLDYzMSBAQAorLyoqCisgKgorICogYWVzLmMgLSBpbnRlZ3JhdGVkIGluIFFFTVUgYnkgRmFicmljZSBCZWxsYXJkIGZyb20gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyoKKyAqIHJpam5kYWVsLWFsZy1mc3QuYworICoKKyAqIEB2ZXJzaW9uIDMuMCAoRGVjZW1iZXIgMjAwMCkKKyAqCisgKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUgZm9yIHRoZSBSaWpuZGFlbCBjaXBoZXIgKG5vdyBBRVMpCisgKgorICogQGF1dGhvciBWaW5jZW50IFJpam1lbiA8dmluY2VudC5yaWptZW5AZXNhdC5rdWxldXZlbi5hYy5iZT4KKyAqIEBhdXRob3IgQW50b29uIEJvc3NlbGFlcnMgPGFudG9vbi5ib3NzZWxhZXJzQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgKiBAYXV0aG9yIFBhdWxvIEJhcnJldG8gPHBhdWxvLmJhcnJldG9AdGVycmEuY29tLmJyPgorICoKKyAqIFRoaXMgY29kZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgJydBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvYWVzLmgiCisjaW5jbHVkZSAidXRpbC9hZXMuaCIKKworc3RhdGljIGNvbnN0IHUzMiByY29uW10gPSB7CisJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAsIC8qIGZvciAxMjgtYml0IGJsb2NrcywgUmlqbmRhZWwgbmV2ZXIgdXNlcyBtb3JlIHRoYW4gMTAgcmNvbiB2YWx1ZXMgKi8KK307CisKKyNpZmRlZiBRRU1VX1VTRV9JTlRFUk5BTF9PUEVOU1NMCisKKy8qKgorICogRXhwYW5kIHRoZSBjaXBoZXIga2V5IGludG8gdGhlIGVuY3J5cHRpb24ga2V5IHNjaGVkdWxlLgorICovCitpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKwkJCUFFU19LRVkgKmtleSkgeworCisJdTMyICpyazsKKyAgIAlpbnQgaSA9IDA7CisJdTMyIHRlbXA7CisKKwlpZiAoIXVzZXJLZXkgfHwgIWtleSkKKwkJcmV0dXJuIC0xOworCWlmIChiaXRzICE9IDEyOCAmJiBiaXRzICE9IDE5MiAmJiBiaXRzICE9IDI1NikKKwkJcmV0dXJuIC0yOworCisJcmsgPSBrZXktPnJkX2tleTsKKworCWlmIChiaXRzPT0xMjgpCisJCWtleS0+cm91bmRzID0gMTA7CisJZWxzZSBpZiAoYml0cz09MTkyKQorCQlrZXktPnJvdW5kcyA9IDEyOworCWVsc2UKKwkJa2V5LT5yb3VuZHMgPSAxNDsKKworCXJrWzBdID0gR0VUVTMyKHVzZXJLZXkgICAgICk7CisJcmtbMV0gPSBHRVRVMzIodXNlcktleSArICA0KTsKKwlya1syXSA9IEdFVFUzMih1c2VyS2V5ICsgIDgpOworCXJrWzNdID0gR0VUVTMyKHVzZXJLZXkgKyAxMik7CisJaWYgKGJpdHMgPT0gMTI4KSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wICA9IHJrWzNdOworCQkJcmtbNF0gPSBya1swXSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAgOCkgJiAweGZmXSAmIDB4MDBmZjAwMDApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFFU19UZTRbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHgwMDAwMDBmZikgXgorCQkJCXJjb25baV07CisJCQlya1s1XSA9IHJrWzFdIF4gcmtbNF07CisJCQlya1s2XSA9IHJrWzJdIF4gcmtbNV07CisJCQlya1s3XSA9IHJrWzNdIF4gcmtbNl07CisJCQlpZiAoKytpID09IDEwKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyayArPSA0OworCQl9CisJfQorCXJrWzRdID0gR0VUVTMyKHVzZXJLZXkgKyAxNik7CisJcmtbNV0gPSBHRVRVMzIodXNlcktleSArIDIwKTsKKwlpZiAoYml0cyA9PSAxOTIpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCXRlbXAgPSBya1sgNV07CisJCQlya1sgNl0gPSBya1sgMF0gXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFFU19UZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KKwkJCQlyY29uW2ldOworCQkJcmtbIDddID0gcmtbIDFdIF4gcmtbIDZdOworCQkJcmtbIDhdID0gcmtbIDJdIF4gcmtbIDddOworCQkJcmtbIDldID0gcmtbIDNdIF4gcmtbIDhdOworCQkJaWYgKCsraSA9PSA4KSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlya1sxMF0gPSBya1sgNF0gXiBya1sgOV07CisJCQlya1sxMV0gPSBya1sgNV0gXiBya1sxMF07CisJCQlyayArPSA2OworCQl9CisJfQorCXJrWzZdID0gR0VUVTMyKHVzZXJLZXkgKyAyNCk7CisJcmtbN10gPSBHRVRVMzIodXNlcktleSArIDI4KTsKKwlpZiAoYml0cyA9PSAyNTYpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCXRlbXAgPSBya1sgN107CisJCQlya1sgOF0gPSBya1sgMF0gXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFFU19UZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KKwkJCQlyY29uW2ldOworCQkJcmtbIDldID0gcmtbIDFdIF4gcmtbIDhdOworCQkJcmtbMTBdID0gcmtbIDJdIF4gcmtbIDldOworCQkJcmtbMTFdID0gcmtbIDNdIF4gcmtbMTBdOworCQkJaWYgKCsraSA9PSA3KSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQl0ZW1wID0gcmtbMTFdOworCQkJcmtbMTJdID0gcmtbIDRdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFFU19UZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUVTX1RlNFsodGVtcCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFFU19UZTRbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKTsKKwkJCXJrWzEzXSA9IHJrWyA1XSBeIHJrWzEyXTsKKwkJCXJrWzE0XSA9IHJrWyA2XSBeIHJrWzEzXTsKKwkJCXJrWzE1XSA9IHJrWyA3XSBeIHJrWzE0XTsKKworCQkJcmsgKz0gODsKKyAgICAgICAgCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogRXhwYW5kIHRoZSBjaXBoZXIga2V5IGludG8gdGhlIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlLgorICovCitpbnQgQUVTX3NldF9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKwkJCSBBRVNfS0VZICprZXkpIHsKKworICAgICAgICB1MzIgKnJrOworCWludCBpLCBqLCBzdGF0dXM7CisJdTMyIHRlbXA7CisKKwkvKiBmaXJzdCwgc3RhcnQgd2l0aCBhbiBlbmNyeXB0aW9uIHNjaGVkdWxlICovCisJc3RhdHVzID0gQUVTX3NldF9lbmNyeXB0X2tleSh1c2VyS2V5LCBiaXRzLCBrZXkpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCisJcmsgPSBrZXktPnJkX2tleTsKKworCS8qIGludmVydCB0aGUgb3JkZXIgb2YgdGhlIHJvdW5kIGtleXM6ICovCisJZm9yIChpID0gMCwgaiA9IDQqKGtleS0+cm91bmRzKTsgaSA8IGo7IGkgKz0gNCwgaiAtPSA0KSB7CisJCXRlbXAgPSBya1tpICAgIF07IHJrW2kgICAgXSA9IHJrW2ogICAgXTsgcmtbaiAgICBdID0gdGVtcDsKKwkJdGVtcCA9IHJrW2kgKyAxXTsgcmtbaSArIDFdID0gcmtbaiArIDFdOyBya1tqICsgMV0gPSB0ZW1wOworCQl0ZW1wID0gcmtbaSArIDJdOyBya1tpICsgMl0gPSBya1tqICsgMl07IHJrW2ogKyAyXSA9IHRlbXA7CisJCXRlbXAgPSBya1tpICsgM107IHJrW2kgKyAzXSA9IHJrW2ogKyAzXTsgcmtbaiArIDNdID0gdGVtcDsKKwl9CisJLyogYXBwbHkgdGhlIGludmVyc2UgTWl4Q29sdW1uIHRyYW5zZm9ybSB0byBhbGwgcm91bmQga2V5cyBidXQgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdDogKi8KKwlmb3IgKGkgPSAxOyBpIDwgKGtleS0+cm91bmRzKTsgaSsrKSB7CisJCXJrICs9IDQ7CisJCXJrWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDBbQUVTX1RlNFsocmtbMF0gPj4gMjQpICAgICAgIF0gJiAweGZmXSBeCisgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQxW0FFU19UZTRbKHJrWzBdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMltBRVNfVGU0Wyhya1swXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDNbQUVTX1RlNFsocmtbMF0gICAgICApICYgMHhmZl0gJiAweGZmXTsKKwkJcmtbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMFtBRVNfVGU0Wyhya1sxXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDFbQUVTX1RlNFsocmtbMV0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQyW0FFU19UZTRbKHJrWzFdID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkM1tBRVNfVGU0Wyhya1sxXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOworCQlya1syXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQwW0FFU19UZTRbKHJrWzJdID4+IDI0KSAgICAgICBdICYgMHhmZl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMVtBRVNfVGU0Wyhya1syXSA+PiAxNikgJiAweGZmXSAmIDB4ZmZdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDJbQUVTX1RlNFsocmtbMl0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCisgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQzW0FFU19UZTRbKHJrWzJdICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisJCXJrWzNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDBbQUVTX1RlNFsocmtbM10gPj4gMjQpICAgICAgIF0gJiAweGZmXSBeCisgICAgICAgICAgICAgICAgICAgICAgICBBRVNfVGQxW0FFU19UZTRbKHJrWzNdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgICAgICAgICAgICAgICAgQUVTX1RkMltBRVNfVGU0Wyhya1szXSA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19UZDNbQUVTX1RlNFsocmtbM10gICAgICApICYgMHhmZl0gJiAweGZmXTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgQUVTX0FTTQorLyoKKyAqIEVuY3J5cHQgYSBzaW5nbGUgYmxvY2sKKyAqIGluIGFuZCBvdXQgY2FuIG92ZXJsYXAKKyAqLwordm9pZCBBRVNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisKKwljb25zdCB1MzIgKnJrOworCXUzMiBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDM7CisjaWZuZGVmIEZVTExfVU5ST0xMCisJaW50IHI7CisjZW5kaWYgLyogP0ZVTExfVU5ST0xMICovCisKKwlhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSk7CisJcmsgPSBrZXktPnJkX2tleTsKKworCS8qCisJICogbWFwIGJ5dGUgYXJyYXkgYmxvY2sgdG8gY2lwaGVyIHN0YXRlCisJICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleToKKwkgKi8KKwlzMCA9IEdFVFUzMihpbiAgICAgKSBeIHJrWzBdOworCXMxID0gR0VUVTMyKGluICsgIDQpIF4gcmtbMV07CisJczIgPSBHRVRVMzIoaW4gKyAgOCkgXiBya1syXTsKKwlzMyA9IEdFVFUzMihpbiArIDEyKSBeIHJrWzNdOworI2lmZGVmIEZVTExfVU5ST0xMCisJLyogcm91bmQgMTogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1sgNF07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbIDVdOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWyA2XTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1sgN107CisgICAJLyogcm91bmQgMjogKi8KKyAgICAgICAgczAgPSBBRVNfVGUwW3QwID4+IDI0XSBeIEFFU19UZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QzICYgMHhmZl0gXiBya1sgOF07CisgICAgICAgIHMxID0gQUVTX1RlMFt0MSA+PiAyNF0gXiBBRVNfVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MCAmIDB4ZmZdIF4gcmtbIDldOworICAgICAgICBzMiA9IEFFU19UZTBbdDIgPj4gMjRdIF4gQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDEgJiAweGZmXSBeIHJrWzEwXTsKKyAgICAgICAgczMgPSBBRVNfVGUwW3QzID4+IDI0XSBeIEFFU19UZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QyICYgMHhmZl0gXiBya1sxMV07CisJLyogcm91bmQgMzogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1sxMl07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbMTNdOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWzE0XTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1sxNV07CisgICAJLyogcm91bmQgNDogKi8KKyAgICAgICAgczAgPSBBRVNfVGUwW3QwID4+IDI0XSBeIEFFU19UZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QzICYgMHhmZl0gXiBya1sxNl07CisgICAgICAgIHMxID0gQUVTX1RlMFt0MSA+PiAyNF0gXiBBRVNfVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MCAmIDB4ZmZdIF4gcmtbMTddOworICAgICAgICBzMiA9IEFFU19UZTBbdDIgPj4gMjRdIF4gQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDEgJiAweGZmXSBeIHJrWzE4XTsKKyAgICAgICAgczMgPSBBRVNfVGUwW3QzID4+IDI0XSBeIEFFU19UZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QyICYgMHhmZl0gXiBya1sxOV07CisJLyogcm91bmQgNTogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1syMF07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbMjFdOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWzIyXTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1syM107CisgICAJLyogcm91bmQgNjogKi8KKyAgICAgICAgczAgPSBBRVNfVGUwW3QwID4+IDI0XSBeIEFFU19UZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QzICYgMHhmZl0gXiBya1syNF07CisgICAgICAgIHMxID0gQUVTX1RlMFt0MSA+PiAyNF0gXiBBRVNfVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MCAmIDB4ZmZdIF4gcmtbMjVdOworICAgICAgICBzMiA9IEFFU19UZTBbdDIgPj4gMjRdIF4gQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDEgJiAweGZmXSBeIHJrWzI2XTsKKyAgICAgICAgczMgPSBBRVNfVGUwW3QzID4+IDI0XSBeIEFFU19UZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QyICYgMHhmZl0gXiBya1syN107CisJLyogcm91bmQgNzogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1syOF07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbMjldOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWzMwXTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1szMV07CisgICAJLyogcm91bmQgODogKi8KKyAgICAgICAgczAgPSBBRVNfVGUwW3QwID4+IDI0XSBeIEFFU19UZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QzICYgMHhmZl0gXiBya1szMl07CisgICAgICAgIHMxID0gQUVTX1RlMFt0MSA+PiAyNF0gXiBBRVNfVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MCAmIDB4ZmZdIF4gcmtbMzNdOworICAgICAgICBzMiA9IEFFU19UZTBbdDIgPj4gMjRdIF4gQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDEgJiAweGZmXSBeIHJrWzM0XTsKKyAgICAgICAgczMgPSBBRVNfVGUwW3QzID4+IDI0XSBeIEFFU19UZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QyICYgMHhmZl0gXiBya1szNV07CisJLyogcm91bmQgOTogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1szNl07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbMzddOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWzM4XTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1szOV07CisgICAgaWYgKGtleS0+cm91bmRzID4gMTApIHsKKyAgICAgICAgLyogcm91bmQgMTA6ICovCisgICAgICAgIHMwID0gQUVTX1RlMFt0MCA+PiAyNF0gXiBBRVNfVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MyAmIDB4ZmZdIF4gcmtbNDBdOworICAgICAgICBzMSA9IEFFU19UZTBbdDEgPj4gMjRdIF4gQUVTX1RlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDAgJiAweGZmXSBeIHJrWzQxXTsKKyAgICAgICAgczIgPSBBRVNfVGUwW3QyID4+IDI0XSBeIEFFU19UZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QxICYgMHhmZl0gXiBya1s0Ml07CisgICAgICAgIHMzID0gQUVTX1RlMFt0MyA+PiAyNF0gXiBBRVNfVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MiAmIDB4ZmZdIF4gcmtbNDNdOworICAgICAgICAvKiByb3VuZCAxMTogKi8KKyAgICAgICAgdDAgPSBBRVNfVGUwW3MwID4+IDI0XSBeIEFFU19UZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MzICYgMHhmZl0gXiBya1s0NF07CisgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbNDVdOworICAgICAgICB0MiA9IEFFU19UZTBbczIgPj4gMjRdIF4gQUVTX1RlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczEgJiAweGZmXSBeIHJrWzQ2XTsKKyAgICAgICAgdDMgPSBBRVNfVGUwW3MzID4+IDI0XSBeIEFFU19UZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MyICYgMHhmZl0gXiBya1s0N107CisgICAgICAgIGlmIChrZXktPnJvdW5kcyA+IDEyKSB7CisgICAgICAgICAgICAvKiByb3VuZCAxMjogKi8KKyAgICAgICAgICAgIHMwID0gQUVTX1RlMFt0MCA+PiAyNF0gXiBBRVNfVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MyAmIDB4ZmZdIF4gcmtbNDhdOworICAgICAgICAgICAgczEgPSBBRVNfVGUwW3QxID4+IDI0XSBeIEFFU19UZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3QwICYgMHhmZl0gXiBya1s0OV07CisgICAgICAgICAgICBzMiA9IEFFU19UZTBbdDIgPj4gMjRdIF4gQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbdDEgJiAweGZmXSBeIHJrWzUwXTsKKyAgICAgICAgICAgIHMzID0gQUVTX1RlMFt0MyA+PiAyNF0gXiBBRVNfVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1t0MiAmIDB4ZmZdIF4gcmtbNTFdOworICAgICAgICAgICAgLyogcm91bmQgMTM6ICovCisgICAgICAgICAgICB0MCA9IEFFU19UZTBbczAgPj4gMjRdIF4gQUVTX1RlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczMgJiAweGZmXSBeIHJrWzUyXTsKKyAgICAgICAgICAgIHQxID0gQUVTX1RlMFtzMSA+PiAyNF0gXiBBRVNfVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RlM1tzMCAmIDB4ZmZdIF4gcmtbNTNdOworICAgICAgICAgICAgdDIgPSBBRVNfVGUwW3MyID4+IDI0XSBeIEFFU19UZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGUzW3MxICYgMHhmZl0gXiBya1s1NF07CisgICAgICAgICAgICB0MyA9IEFFU19UZTBbczMgPj4gMjRdIF4gQUVTX1RlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIEFFU19UZTNbczIgJiAweGZmXSBeIHJrWzU1XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByayArPSBrZXktPnJvdW5kcyA8PCAyOworI2Vsc2UgIC8qICFGVUxMX1VOUk9MTCAqLworICAgIC8qCisgICAgICogTnIgLSAxIGZ1bGwgcm91bmRzOgorICAgICAqLworICAgIHIgPSBrZXktPnJvdW5kcyA+PiAxOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdDAgPQorICAgICAgICAgICAgQUVTX1RlMFsoczAgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RlMVsoczEgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlMlsoczIgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlM1soczMgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbNF07CisgICAgICAgIHQxID0KKyAgICAgICAgICAgIEFFU19UZTBbKHMxID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIEFFU19UZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTNbKHMwICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzVdOworICAgICAgICB0MiA9CisgICAgICAgICAgICBBRVNfVGUwWyhzMiA+PiAyNCkgICAgICAgXSBeCisgICAgICAgICAgICBBRVNfVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGUzWyhzMSAgICAgICkgJiAweGZmXSBeCisgICAgICAgICAgICBya1s2XTsKKyAgICAgICAgdDMgPQorICAgICAgICAgICAgQUVTX1RlMFsoczMgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RlMVsoczAgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlMlsoczEgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlM1soczIgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbN107CisKKyAgICAgICAgcmsgKz0gODsKKyAgICAgICAgaWYgKC0tciA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHMwID0KKyAgICAgICAgICAgIEFFU19UZTBbKHQwID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIEFFU19UZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTNbKHQzICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzBdOworICAgICAgICBzMSA9CisgICAgICAgICAgICBBRVNfVGUwWyh0MSA+PiAyNCkgICAgICAgXSBeCisgICAgICAgICAgICBBRVNfVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGUzWyh0MCAgICAgICkgJiAweGZmXSBeCisgICAgICAgICAgICBya1sxXTsKKyAgICAgICAgczIgPQorICAgICAgICAgICAgQUVTX1RlMFsodDIgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RlMVsodDMgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlMlsodDAgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RlM1sodDEgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbMl07CisgICAgICAgIHMzID0KKyAgICAgICAgICAgIEFFU19UZTBbKHQzID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIEFFU19UZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZTNbKHQyICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzNdOworICAgIH0KKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKyAgICAvKgorCSAqIGFwcGx5IGxhc3Qgcm91bmQgYW5kCisJICogbWFwIGNpcGhlciBzdGF0ZSB0byBieXRlIGFycmF5IGJsb2NrOgorCSAqLworCXMwID0KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDAgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZTRbKHQxID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0MiA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDMgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzBdOworCVBVVFUzMihvdXQgICAgICwgczApOworCXMxID0KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDEgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZTRbKHQyID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0MyA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzFdOworCVBVVFUzMihvdXQgKyAgNCwgczEpOworCXMyID0KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDIgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZTRbKHQzID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0MCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDEgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzJdOworCVBVVFUzMihvdXQgKyAgOCwgczIpOworCXMzID0KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDMgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZTRbKHQwID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGU0Wyh0MSA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RlNFsodDIgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzNdOworCVBVVFUzMihvdXQgKyAxMiwgczMpOworfQorCisvKgorICogRGVjcnlwdCBhIHNpbmdsZSBibG9jaworICogaW4gYW5kIG91dCBjYW4gb3ZlcmxhcAorICovCit2b2lkIEFFU19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSBjb25zdCBBRVNfS0VZICprZXkpIHsKKworCWNvbnN0IHUzMiAqcms7CisJdTMyIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0MzsKKyNpZm5kZWYgRlVMTF9VTlJPTEwKKwlpbnQgcjsKKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKworCWFzc2VydChpbiAmJiBvdXQgJiYga2V5KTsKKwlyayA9IGtleS0+cmRfa2V5OworCisJLyoKKwkgKiBtYXAgYnl0ZSBhcnJheSBibG9jayB0byBjaXBoZXIgc3RhdGUKKwkgKiBhbmQgYWRkIGluaXRpYWwgcm91bmQga2V5OgorCSAqLworICAgIHMwID0gR0VUVTMyKGluICAgICApIF4gcmtbMF07CisgICAgczEgPSBHRVRVMzIoaW4gKyAgNCkgXiBya1sxXTsKKyAgICBzMiA9IEdFVFUzMihpbiArICA4KSBeIHJrWzJdOworICAgIHMzID0gR0VUVTMyKGluICsgMTIpIF4gcmtbM107CisjaWZkZWYgRlVMTF9VTlJPTEwKKyAgICAvKiByb3VuZCAxOiAqLworICAgIHQwID0gQUVTX1RkMFtzMCA+PiAyNF0gXiBBRVNfVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMSAmIDB4ZmZdIF4gcmtbIDRdOworICAgIHQxID0gQUVTX1RkMFtzMSA+PiAyNF0gXiBBRVNfVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMiAmIDB4ZmZdIF4gcmtbIDVdOworICAgIHQyID0gQUVTX1RkMFtzMiA+PiAyNF0gXiBBRVNfVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMyAmIDB4ZmZdIF4gcmtbIDZdOworICAgIHQzID0gQUVTX1RkMFtzMyA+PiAyNF0gXiBBRVNfVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMCAmIDB4ZmZdIF4gcmtbIDddOworICAgIC8qIHJvdW5kIDI6ICovCisgICAgczAgPSBBRVNfVGQwW3QwID4+IDI0XSBeIEFFU19UZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QxICYgMHhmZl0gXiBya1sgOF07CisgICAgczEgPSBBRVNfVGQwW3QxID4+IDI0XSBeIEFFU19UZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QyICYgMHhmZl0gXiBya1sgOV07CisgICAgczIgPSBBRVNfVGQwW3QyID4+IDI0XSBeIEFFU19UZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QzICYgMHhmZl0gXiBya1sxMF07CisgICAgczMgPSBBRVNfVGQwW3QzID4+IDI0XSBeIEFFU19UZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QwICYgMHhmZl0gXiBya1sxMV07CisgICAgLyogcm91bmQgMzogKi8KKyAgICB0MCA9IEFFU19UZDBbczAgPj4gMjRdIF4gQUVTX1RkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczEgJiAweGZmXSBeIHJrWzEyXTsKKyAgICB0MSA9IEFFU19UZDBbczEgPj4gMjRdIF4gQUVTX1RkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczIgJiAweGZmXSBeIHJrWzEzXTsKKyAgICB0MiA9IEFFU19UZDBbczIgPj4gMjRdIF4gQUVTX1RkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczMgJiAweGZmXSBeIHJrWzE0XTsKKyAgICB0MyA9IEFFU19UZDBbczMgPj4gMjRdIF4gQUVTX1RkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczAgJiAweGZmXSBeIHJrWzE1XTsKKyAgICAvKiByb3VuZCA0OiAqLworICAgIHMwID0gQUVTX1RkMFt0MCA+PiAyNF0gXiBBRVNfVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MSAmIDB4ZmZdIF4gcmtbMTZdOworICAgIHMxID0gQUVTX1RkMFt0MSA+PiAyNF0gXiBBRVNfVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MiAmIDB4ZmZdIF4gcmtbMTddOworICAgIHMyID0gQUVTX1RkMFt0MiA+PiAyNF0gXiBBRVNfVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MyAmIDB4ZmZdIF4gcmtbMThdOworICAgIHMzID0gQUVTX1RkMFt0MyA+PiAyNF0gXiBBRVNfVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MCAmIDB4ZmZdIF4gcmtbMTldOworICAgIC8qIHJvdW5kIDU6ICovCisgICAgdDAgPSBBRVNfVGQwW3MwID4+IDI0XSBeIEFFU19UZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MxICYgMHhmZl0gXiBya1syMF07CisgICAgdDEgPSBBRVNfVGQwW3MxID4+IDI0XSBeIEFFU19UZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MyICYgMHhmZl0gXiBya1syMV07CisgICAgdDIgPSBBRVNfVGQwW3MyID4+IDI0XSBeIEFFU19UZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MzICYgMHhmZl0gXiBya1syMl07CisgICAgdDMgPSBBRVNfVGQwW3MzID4+IDI0XSBeIEFFU19UZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MwICYgMHhmZl0gXiBya1syM107CisgICAgLyogcm91bmQgNjogKi8KKyAgICBzMCA9IEFFU19UZDBbdDAgPj4gMjRdIF4gQUVTX1RkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDEgJiAweGZmXSBeIHJrWzI0XTsKKyAgICBzMSA9IEFFU19UZDBbdDEgPj4gMjRdIF4gQUVTX1RkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDIgJiAweGZmXSBeIHJrWzI1XTsKKyAgICBzMiA9IEFFU19UZDBbdDIgPj4gMjRdIF4gQUVTX1RkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDMgJiAweGZmXSBeIHJrWzI2XTsKKyAgICBzMyA9IEFFU19UZDBbdDMgPj4gMjRdIF4gQUVTX1RkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDAgJiAweGZmXSBeIHJrWzI3XTsKKyAgICAvKiByb3VuZCA3OiAqLworICAgIHQwID0gQUVTX1RkMFtzMCA+PiAyNF0gXiBBRVNfVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMSAmIDB4ZmZdIF4gcmtbMjhdOworICAgIHQxID0gQUVTX1RkMFtzMSA+PiAyNF0gXiBBRVNfVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMiAmIDB4ZmZdIF4gcmtbMjldOworICAgIHQyID0gQUVTX1RkMFtzMiA+PiAyNF0gXiBBRVNfVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMyAmIDB4ZmZdIF4gcmtbMzBdOworICAgIHQzID0gQUVTX1RkMFtzMyA+PiAyNF0gXiBBRVNfVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMCAmIDB4ZmZdIF4gcmtbMzFdOworICAgIC8qIHJvdW5kIDg6ICovCisgICAgczAgPSBBRVNfVGQwW3QwID4+IDI0XSBeIEFFU19UZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QxICYgMHhmZl0gXiBya1szMl07CisgICAgczEgPSBBRVNfVGQwW3QxID4+IDI0XSBeIEFFU19UZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QyICYgMHhmZl0gXiBya1szM107CisgICAgczIgPSBBRVNfVGQwW3QyID4+IDI0XSBeIEFFU19UZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QzICYgMHhmZl0gXiBya1szNF07CisgICAgczMgPSBBRVNfVGQwW3QzID4+IDI0XSBeIEFFU19UZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QwICYgMHhmZl0gXiBya1szNV07CisgICAgLyogcm91bmQgOTogKi8KKyAgICB0MCA9IEFFU19UZDBbczAgPj4gMjRdIF4gQUVTX1RkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczEgJiAweGZmXSBeIHJrWzM2XTsKKyAgICB0MSA9IEFFU19UZDBbczEgPj4gMjRdIF4gQUVTX1RkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczIgJiAweGZmXSBeIHJrWzM3XTsKKyAgICB0MiA9IEFFU19UZDBbczIgPj4gMjRdIF4gQUVTX1RkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczMgJiAweGZmXSBeIHJrWzM4XTsKKyAgICB0MyA9IEFFU19UZDBbczMgPj4gMjRdIF4gQUVTX1RkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczAgJiAweGZmXSBeIHJrWzM5XTsKKyAgICBpZiAoa2V5LT5yb3VuZHMgPiAxMCkgeworICAgICAgICAvKiByb3VuZCAxMDogKi8KKyAgICAgICAgczAgPSBBRVNfVGQwW3QwID4+IDI0XSBeIEFFU19UZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QxICYgMHhmZl0gXiBya1s0MF07CisgICAgICAgIHMxID0gQUVTX1RkMFt0MSA+PiAyNF0gXiBBRVNfVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MiAmIDB4ZmZdIF4gcmtbNDFdOworICAgICAgICBzMiA9IEFFU19UZDBbdDIgPj4gMjRdIF4gQUVTX1RkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDMgJiAweGZmXSBeIHJrWzQyXTsKKyAgICAgICAgczMgPSBBRVNfVGQwW3QzID4+IDI0XSBeIEFFU19UZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QwICYgMHhmZl0gXiBya1s0M107CisgICAgICAgIC8qIHJvdW5kIDExOiAqLworICAgICAgICB0MCA9IEFFU19UZDBbczAgPj4gMjRdIF4gQUVTX1RkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczEgJiAweGZmXSBeIHJrWzQ0XTsKKyAgICAgICAgdDEgPSBBRVNfVGQwW3MxID4+IDI0XSBeIEFFU19UZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MyICYgMHhmZl0gXiBya1s0NV07CisgICAgICAgIHQyID0gQUVTX1RkMFtzMiA+PiAyNF0gXiBBRVNfVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMyAmIDB4ZmZdIF4gcmtbNDZdOworICAgICAgICB0MyA9IEFFU19UZDBbczMgPj4gMjRdIF4gQUVTX1RkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczAgJiAweGZmXSBeIHJrWzQ3XTsKKyAgICAgICAgaWYgKGtleS0+cm91bmRzID4gMTIpIHsKKyAgICAgICAgICAgIC8qIHJvdW5kIDEyOiAqLworICAgICAgICAgICAgczAgPSBBRVNfVGQwW3QwID4+IDI0XSBeIEFFU19UZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QxICYgMHhmZl0gXiBya1s0OF07CisgICAgICAgICAgICBzMSA9IEFFU19UZDBbdDEgPj4gMjRdIF4gQUVTX1RkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbdDIgJiAweGZmXSBeIHJrWzQ5XTsKKyAgICAgICAgICAgIHMyID0gQUVTX1RkMFt0MiA+PiAyNF0gXiBBRVNfVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1t0MyAmIDB4ZmZdIF4gcmtbNTBdOworICAgICAgICAgICAgczMgPSBBRVNfVGQwW3QzID4+IDI0XSBeIEFFU19UZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3QwICYgMHhmZl0gXiBya1s1MV07CisgICAgICAgICAgICAvKiByb3VuZCAxMzogKi8KKyAgICAgICAgICAgIHQwID0gQUVTX1RkMFtzMCA+PiAyNF0gXiBBRVNfVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMSAmIDB4ZmZdIF4gcmtbNTJdOworICAgICAgICAgICAgdDEgPSBBRVNfVGQwW3MxID4+IDI0XSBeIEFFU19UZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gQUVTX1RkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBBRVNfVGQzW3MyICYgMHhmZl0gXiBya1s1M107CisgICAgICAgICAgICB0MiA9IEFFU19UZDBbczIgPj4gMjRdIF4gQUVTX1RkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBBRVNfVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIEFFU19UZDNbczMgJiAweGZmXSBeIHJrWzU0XTsKKyAgICAgICAgICAgIHQzID0gQUVTX1RkMFtzMyA+PiAyNF0gXiBBRVNfVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIEFFU19UZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gQUVTX1RkM1tzMCAmIDB4ZmZdIF4gcmtbNTVdOworICAgICAgICB9CisgICAgfQorCXJrICs9IGtleS0+cm91bmRzIDw8IDI7CisjZWxzZSAgLyogIUZVTExfVU5ST0xMICovCisgICAgLyoKKyAgICAgKiBOciAtIDEgZnVsbCByb3VuZHM6CisgICAgICovCisgICAgciA9IGtleS0+cm91bmRzID4+IDE7CisgICAgZm9yICg7OykgeworICAgICAgICB0MCA9CisgICAgICAgICAgICBBRVNfVGQwWyhzMCA+PiAyNCkgICAgICAgXSBeCisgICAgICAgICAgICBBRVNfVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQzWyhzMSAgICAgICkgJiAweGZmXSBeCisgICAgICAgICAgICBya1s0XTsKKyAgICAgICAgdDEgPQorICAgICAgICAgICAgQUVTX1RkMFsoczEgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RkMVsoczAgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkMlsoczMgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkM1soczIgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbNV07CisgICAgICAgIHQyID0KKyAgICAgICAgICAgIEFFU19UZDBbKHMyID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIEFFU19UZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZDNbKHMzICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzZdOworICAgICAgICB0MyA9CisgICAgICAgICAgICBBRVNfVGQwWyhzMyA+PiAyNCkgICAgICAgXSBeCisgICAgICAgICAgICBBRVNfVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQzWyhzMCAgICAgICkgJiAweGZmXSBeCisgICAgICAgICAgICBya1s3XTsKKworICAgICAgICByayArPSA4OworICAgICAgICBpZiAoLS1yID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgczAgPQorICAgICAgICAgICAgQUVTX1RkMFsodDAgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RkMVsodDMgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkMlsodDIgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkM1sodDEgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbMF07CisgICAgICAgIHMxID0KKyAgICAgICAgICAgIEFFU19UZDBbKHQxID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIEFFU19UZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIEFFU19UZDNbKHQyICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzFdOworICAgICAgICBzMiA9CisgICAgICAgICAgICBBRVNfVGQwWyh0MiA+PiAyNCkgICAgICAgXSBeCisgICAgICAgICAgICBBRVNfVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBBRVNfVGQzWyh0MyAgICAgICkgJiAweGZmXSBeCisgICAgICAgICAgICBya1syXTsKKyAgICAgICAgczMgPQorICAgICAgICAgICAgQUVTX1RkMFsodDMgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgQUVTX1RkMVsodDIgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkMlsodDEgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgICAgQUVTX1RkM1sodDAgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbM107CisgICAgfQorI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLworICAgIC8qCisJICogYXBwbHkgbGFzdCByb3VuZCBhbmQKKwkgKiBtYXAgY2lwaGVyIHN0YXRlIHRvIGJ5dGUgYXJyYXkgYmxvY2s6CisJICovCisgICAJczAgPQorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MCA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RkNFsodDMgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZDRbKHQyID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKyAgIAkJcmtbMF07CisJUFVUVTMyKG91dCAgICAgLCBzMCk7CisgICAJczEgPQorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MSA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RkNFsodDAgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZDRbKHQzID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MiAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKyAgIAkJcmtbMV07CisJUFVUVTMyKG91dCArICA0LCBzMSk7CisgICAJczIgPQorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MiA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RkNFsodDEgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZDRbKHQwID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MyAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKyAgIAkJcmtbMl07CisJUFVUVTMyKG91dCArICA4LCBzMik7CisgICAJczMgPQorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MyA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDApIF4KKyAgICAgICAgICAgICAgICAoQUVTX1RkNFsodDIgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisgICAgICAgICAgICAgICAgKEFFU19UZDRbKHQxID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkgXgorICAgICAgICAgICAgICAgIChBRVNfVGQ0Wyh0MCAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmYpIF4KKyAgIAkJcmtbM107CisJUFVUVTMyKG91dCArIDEyLCBzMyk7Cit9CisKKyNlbmRpZiAvKiBBRVNfQVNNICovCisKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICppdmVjLCBjb25zdCBpbnQgZW5jKQoreworCisJdW5zaWduZWQgbG9uZyBuOworCXVuc2lnbmVkIGxvbmcgbGVuID0gbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgdG1wW0FFU19CTE9DS19TSVpFXTsKKworCWFzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMpOworCisJaWYgKGVuYykgeworCQl3aGlsZSAobGVuID49IEFFU19CTE9DS19TSVpFKSB7CisJCQlmb3Iobj0wOyBuIDwgQUVTX0JMT0NLX1NJWkU7ICsrbikKKwkJCQl0bXBbbl0gPSBpbltuXSBeIGl2ZWNbbl07CisJCQlBRVNfZW5jcnlwdCh0bXAsIG91dCwga2V5KTsKKwkJCW1lbWNweShpdmVjLCBvdXQsIEFFU19CTE9DS19TSVpFKTsKKwkJCWxlbiAtPSBBRVNfQkxPQ0tfU0laRTsKKwkJCWluICs9IEFFU19CTE9DS19TSVpFOworCQkJb3V0ICs9IEFFU19CTE9DS19TSVpFOworCQl9CisJCWlmIChsZW4pIHsKKwkJCWZvcihuPTA7IG4gPCBsZW47ICsrbikKKwkJCQl0bXBbbl0gPSBpbltuXSBeIGl2ZWNbbl07CisJCQlmb3Iobj1sZW47IG4gPCBBRVNfQkxPQ0tfU0laRTsgKytuKQorCQkJCXRtcFtuXSA9IGl2ZWNbbl07CisJCQlBRVNfZW5jcnlwdCh0bXAsIHRtcCwga2V5KTsKKwkJCW1lbWNweShvdXQsIHRtcCwgQUVTX0JMT0NLX1NJWkUpOworCQkJbWVtY3B5KGl2ZWMsIHRtcCwgQUVTX0JMT0NLX1NJWkUpOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGxlbiA+PSBBRVNfQkxPQ0tfU0laRSkgeworCQkJbWVtY3B5KHRtcCwgaW4sIEFFU19CTE9DS19TSVpFKTsKKwkJCUFFU19kZWNyeXB0KGluLCBvdXQsIGtleSk7CisJCQlmb3Iobj0wOyBuIDwgQUVTX0JMT0NLX1NJWkU7ICsrbikKKwkJCQlvdXRbbl0gXj0gaXZlY1tuXTsKKwkJCW1lbWNweShpdmVjLCB0bXAsIEFFU19CTE9DS19TSVpFKTsKKwkJCWxlbiAtPSBBRVNfQkxPQ0tfU0laRTsKKwkJCWluICs9IEFFU19CTE9DS19TSVpFOworCQkJb3V0ICs9IEFFU19CTE9DS19TSVpFOworCQl9CisJCWlmIChsZW4pIHsKKwkJCW1lbWNweSh0bXAsIGluLCBBRVNfQkxPQ0tfU0laRSk7CisJCQlBRVNfZGVjcnlwdCh0bXAsIHRtcCwga2V5KTsKKwkJCWZvcihuPTA7IG4gPCBsZW47ICsrbikKKwkJCQlvdXRbbl0gPSB0bXBbbl0gXiBpdmVjW25dOworCQkJbWVtY3B5KGl2ZWMsIHRtcCwgQUVTX0JMT0NLX1NJWkUpOworCQl9CisJfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9hZXMuaCBiL2FuZHJvaWQvcWVtdTEvdXRpbC9hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjZhMmRlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL2Flcy5oCkBAIC0wLDAgKzEsNzAzIEBACisvKgorICogQUVTIGdsb2JhbCBjb25zdGFudHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgR29vZ2xlLCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICBNYXJrdXMgQXJtYnJ1c3RlciA8YXJtYnJ1QHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yCisgKiBsYXRlci4gIFNlZSB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisjaWZuZGVmIFFFTVVfVVRJTF9BRVNfSAorI2RlZmluZSBRRU1VX1VUSUxfQUVTX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHVpbnQzMl90IHUzMjsKK3R5cGVkZWYgdWludDhfdCB1ODsKKworLyogVGhpcyBjb250cm9scyBsb29wLXVucm9sbGluZyBpbiBhZXNfY29yZS5jICovCisjdW5kZWYgRlVMTF9VTlJPTEwKKyMgZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiAoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQorIyBkZWZpbmUgUFVUVTMyKGN0LCBzdCkgeyAoY3QpWzBdID0gKHU4KSgoc3QpID4+IDI0KTsgKGN0KVsxXSA9ICh1OCkoKHN0KSA+PiAxNik7IChjdClbMl0gPSAodTgpKChzdCkgPj4gIDgpOyAoY3QpWzNdID0gKHU4KShzdCk7IH0KKworLyoKK0FFU19UZTBbeF0gPSBTIFt4XS5bMDIsIDAxLCAwMSwgMDNdOworQUVTX1RlMVt4XSA9IFMgW3hdLlswMywgMDIsIDAxLCAwMV07CitBRVNfVGUyW3hdID0gUyBbeF0uWzAxLCAwMywgMDIsIDAxXTsKK0FFU19UZTNbeF0gPSBTIFt4XS5bMDEsIDAxLCAwMywgMDJdOworQUVTX1RlNFt4XSA9IFMgW3hdLlswMSwgMDEsIDAxLCAwMV07CisKK0FFU19UZDBbeF0gPSBTaVt4XS5bMGUsIDA5LCAwZCwgMGJdOworQUVTX1RkMVt4XSA9IFNpW3hdLlswYiwgMGUsIDA5LCAwZF07CitBRVNfVGQyW3hdID0gU2lbeF0uWzBkLCAwYiwgMGUsIDA5XTsKK0FFU19UZDNbeF0gPSBTaVt4XS5bMDksIDBkLCAwYiwgMGVdOworQUVTX1RkNFt4XSA9IFNpW3hdLlswMSwgMDEsIDAxLCAwMV07CisqLworCitjb25zdCB1aW50MzJfdCBBRVNfVGUwWzI1Nl0gPSB7CisgICAgICAgIDB4YzY2MzYzYTVVLCAweGY4N2M3Yzg0VSwgMHhlZTc3Nzc5OVUsIDB4ZjY3YjdiOGRVLAorICAgICAgICAweGZmZjJmMjBkVSwgMHhkNjZiNmJiZFUsIDB4ZGU2ZjZmYjFVLCAweDkxYzVjNTU0VSwKKyAgICAgICAgMHg2MDMwMzA1MFUsIDB4MDIwMTAxMDNVLCAweGNlNjc2N2E5VSwgMHg1NjJiMmI3ZFUsCisgICAgICAgIDB4ZTdmZWZlMTlVLCAweGI1ZDdkNzYyVSwgMHg0ZGFiYWJlNlUsIDB4ZWM3Njc2OWFVLAorICAgICAgICAweDhmY2FjYTQ1VSwgMHgxZjgyODI5ZFUsIDB4ODljOWM5NDBVLCAweGZhN2Q3ZDg3VSwKKyAgICAgICAgMHhlZmZhZmExNVUsIDB4YjI1OTU5ZWJVLCAweDhlNDc0N2M5VSwgMHhmYmYwZjAwYlUsCisgICAgICAgIDB4NDFhZGFkZWNVLCAweGIzZDRkNDY3VSwgMHg1ZmEyYTJmZFUsIDB4NDVhZmFmZWFVLAorICAgICAgICAweDIzOWM5Y2JmVSwgMHg1M2E0YTRmN1UsIDB4ZTQ3MjcyOTZVLCAweDliYzBjMDViVSwKKyAgICAgICAgMHg3NWI3YjdjMlUsIDB4ZTFmZGZkMWNVLCAweDNkOTM5M2FlVSwgMHg0YzI2MjY2YVUsCisgICAgICAgIDB4NmMzNjM2NWFVLCAweDdlM2YzZjQxVSwgMHhmNWY3ZjcwMlUsIDB4ODNjY2NjNGZVLAorICAgICAgICAweDY4MzQzNDVjVSwgMHg1MWE1YTVmNFUsIDB4ZDFlNWU1MzRVLCAweGY5ZjFmMTA4VSwKKyAgICAgICAgMHhlMjcxNzE5M1UsIDB4YWJkOGQ4NzNVLCAweDYyMzEzMTUzVSwgMHgyYTE1MTUzZlUsCisgICAgICAgIDB4MDgwNDA0MGNVLCAweDk1YzdjNzUyVSwgMHg0NjIzMjM2NVUsIDB4OWRjM2MzNWVVLAorICAgICAgICAweDMwMTgxODI4VSwgMHgzNzk2OTZhMVUsIDB4MGEwNTA1MGZVLCAweDJmOWE5YWI1VSwKKyAgICAgICAgMHgwZTA3MDcwOVUsIDB4MjQxMjEyMzZVLCAweDFiODA4MDliVSwgMHhkZmUyZTIzZFUsCisgICAgICAgIDB4Y2RlYmViMjZVLCAweDRlMjcyNzY5VSwgMHg3ZmIyYjJjZFUsIDB4ZWE3NTc1OWZVLAorICAgICAgICAweDEyMDkwOTFiVSwgMHgxZDgzODM5ZVUsIDB4NTgyYzJjNzRVLCAweDM0MWExYTJlVSwKKyAgICAgICAgMHgzNjFiMWIyZFUsIDB4ZGM2ZTZlYjJVLCAweGI0NWE1YWVlVSwgMHg1YmEwYTBmYlUsCisgICAgICAgIDB4YTQ1MjUyZjZVLCAweDc2M2IzYjRkVSwgMHhiN2Q2ZDY2MVUsIDB4N2RiM2IzY2VVLAorICAgICAgICAweDUyMjkyOTdiVSwgMHhkZGUzZTMzZVUsIDB4NWUyZjJmNzFVLCAweDEzODQ4NDk3VSwKKyAgICAgICAgMHhhNjUzNTNmNVUsIDB4YjlkMWQxNjhVLCAweDAwMDAwMDAwVSwgMHhjMWVkZWQyY1UsCisgICAgICAgIDB4NDAyMDIwNjBVLCAweGUzZmNmYzFmVSwgMHg3OWIxYjFjOFUsIDB4YjY1YjViZWRVLAorICAgICAgICAweGQ0NmE2YWJlVSwgMHg4ZGNiY2I0NlUsIDB4NjdiZWJlZDlVLCAweDcyMzkzOTRiVSwKKyAgICAgICAgMHg5NDRhNGFkZVUsIDB4OTg0YzRjZDRVLCAweGIwNTg1OGU4VSwgMHg4NWNmY2Y0YVUsCisgICAgICAgIDB4YmJkMGQwNmJVLCAweGM1ZWZlZjJhVSwgMHg0ZmFhYWFlNVUsIDB4ZWRmYmZiMTZVLAorICAgICAgICAweDg2NDM0M2M1VSwgMHg5YTRkNGRkN1UsIDB4NjYzMzMzNTVVLCAweDExODU4NTk0VSwKKyAgICAgICAgMHg4YTQ1NDVjZlUsIDB4ZTlmOWY5MTBVLCAweDA0MDIwMjA2VSwgMHhmZTdmN2Y4MVUsCisgICAgICAgIDB4YTA1MDUwZjBVLCAweDc4M2MzYzQ0VSwgMHgyNTlmOWZiYVUsIDB4NGJhOGE4ZTNVLAorICAgICAgICAweGEyNTE1MWYzVSwgMHg1ZGEzYTNmZVUsIDB4ODA0MDQwYzBVLCAweDA1OGY4ZjhhVSwKKyAgICAgICAgMHgzZjkyOTJhZFUsIDB4MjE5ZDlkYmNVLCAweDcwMzgzODQ4VSwgMHhmMWY1ZjUwNFUsCisgICAgICAgIDB4NjNiY2JjZGZVLCAweDc3YjZiNmMxVSwgMHhhZmRhZGE3NVUsIDB4NDIyMTIxNjNVLAorICAgICAgICAweDIwMTAxMDMwVSwgMHhlNWZmZmYxYVUsIDB4ZmRmM2YzMGVVLCAweGJmZDJkMjZkVSwKKyAgICAgICAgMHg4MWNkY2Q0Y1UsIDB4MTgwYzBjMTRVLCAweDI2MTMxMzM1VSwgMHhjM2VjZWMyZlUsCisgICAgICAgIDB4YmU1ZjVmZTFVLCAweDM1OTc5N2EyVSwgMHg4ODQ0NDRjY1UsIDB4MmUxNzE3MzlVLAorICAgICAgICAweDkzYzRjNDU3VSwgMHg1NWE3YTdmMlUsIDB4ZmM3ZTdlODJVLCAweDdhM2QzZDQ3VSwKKyAgICAgICAgMHhjODY0NjRhY1UsIDB4YmE1ZDVkZTdVLCAweDMyMTkxOTJiVSwgMHhlNjczNzM5NVUsCisgICAgICAgIDB4YzA2MDYwYTBVLCAweDE5ODE4MTk4VSwgMHg5ZTRmNGZkMVUsIDB4YTNkY2RjN2ZVLAorICAgICAgICAweDQ0MjIyMjY2VSwgMHg1NDJhMmE3ZVUsIDB4M2I5MDkwYWJVLCAweDBiODg4ODgzVSwKKyAgICAgICAgMHg4YzQ2NDZjYVUsIDB4YzdlZWVlMjlVLCAweDZiYjhiOGQzVSwgMHgyODE0MTQzY1UsCisgICAgICAgIDB4YTdkZWRlNzlVLCAweGJjNWU1ZWUyVSwgMHgxNjBiMGIxZFUsIDB4YWRkYmRiNzZVLAorICAgICAgICAweGRiZTBlMDNiVSwgMHg2NDMyMzI1NlUsIDB4NzQzYTNhNGVVLCAweDE0MGEwYTFlVSwKKyAgICAgICAgMHg5MjQ5NDlkYlUsIDB4MGMwNjA2MGFVLCAweDQ4MjQyNDZjVSwgMHhiODVjNWNlNFUsCisgICAgICAgIDB4OWZjMmMyNWRVLCAweGJkZDNkMzZlVSwgMHg0M2FjYWNlZlUsIDB4YzQ2MjYyYTZVLAorICAgICAgICAweDM5OTE5MWE4VSwgMHgzMTk1OTVhNFUsIDB4ZDNlNGU0MzdVLCAweGYyNzk3OThiVSwKKyAgICAgICAgMHhkNWU3ZTczMlUsIDB4OGJjOGM4NDNVLCAweDZlMzczNzU5VSwgMHhkYTZkNmRiN1UsCisgICAgICAgIDB4MDE4ZDhkOGNVLCAweGIxZDVkNTY0VSwgMHg5YzRlNGVkMlUsIDB4NDlhOWE5ZTBVLAorICAgICAgICAweGQ4NmM2Y2I0VSwgMHhhYzU2NTZmYVUsIDB4ZjNmNGY0MDdVLCAweGNmZWFlYTI1VSwKKyAgICAgICAgMHhjYTY1NjVhZlUsIDB4ZjQ3YTdhOGVVLCAweDQ3YWVhZWU5VSwgMHgxMDA4MDgxOFUsCisgICAgICAgIDB4NmZiYWJhZDVVLCAweGYwNzg3ODg4VSwgMHg0YTI1MjU2ZlUsIDB4NWMyZTJlNzJVLAorICAgICAgICAweDM4MWMxYzI0VSwgMHg1N2E2YTZmMVUsIDB4NzNiNGI0YzdVLCAweDk3YzZjNjUxVSwKKyAgICAgICAgMHhjYmU4ZTgyM1UsIDB4YTFkZGRkN2NVLCAweGU4NzQ3NDljVSwgMHgzZTFmMWYyMVUsCisgICAgICAgIDB4OTY0YjRiZGRVLCAweDYxYmRiZGRjVSwgMHgwZDhiOGI4NlUsIDB4MGY4YThhODVVLAorICAgICAgICAweGUwNzA3MDkwVSwgMHg3YzNlM2U0MlUsIDB4NzFiNWI1YzRVLCAweGNjNjY2NmFhVSwKKyAgICAgICAgMHg5MDQ4NDhkOFUsIDB4MDYwMzAzMDVVLCAweGY3ZjZmNjAxVSwgMHgxYzBlMGUxMlUsCisgICAgICAgIDB4YzI2MTYxYTNVLCAweDZhMzUzNTVmVSwgMHhhZTU3NTdmOVUsIDB4NjliOWI5ZDBVLAorICAgICAgICAweDE3ODY4NjkxVSwgMHg5OWMxYzE1OFUsIDB4M2ExZDFkMjdVLCAweDI3OWU5ZWI5VSwKKyAgICAgICAgMHhkOWUxZTEzOFUsIDB4ZWJmOGY4MTNVLCAweDJiOTg5OGIzVSwgMHgyMjExMTEzM1UsCisgICAgICAgIDB4ZDI2OTY5YmJVLCAweGE5ZDlkOTcwVSwgMHgwNzhlOGU4OVUsIDB4MzM5NDk0YTdVLAorICAgICAgICAweDJkOWI5YmI2VSwgMHgzYzFlMWUyMlUsIDB4MTU4Nzg3OTJVLCAweGM5ZTllOTIwVSwKKyAgICAgICAgMHg4N2NlY2U0OVUsIDB4YWE1NTU1ZmZVLCAweDUwMjgyODc4VSwgMHhhNWRmZGY3YVUsCisgICAgICAgIDB4MDM4YzhjOGZVLCAweDU5YTFhMWY4VSwgMHgwOTg5ODk4MFUsIDB4MWEwZDBkMTdVLAorICAgICAgICAweDY1YmZiZmRhVSwgMHhkN2U2ZTYzMVUsIDB4ODQ0MjQyYzZVLCAweGQwNjg2OGI4VSwKKyAgICAgICAgMHg4MjQxNDFjM1UsIDB4Mjk5OTk5YjBVLCAweDVhMmQyZDc3VSwgMHgxZTBmMGYxMVUsCisgICAgICAgIDB4N2JiMGIwY2JVLCAweGE4NTQ1NGZjVSwgMHg2ZGJiYmJkNlUsIDB4MmMxNjE2M2FVLAorfTsKK2NvbnN0IHVpbnQzMl90IEFFU19UZTFbMjU2XSA9IHsKKyAgICAgICAgMHhhNWM2NjM2M1UsIDB4ODRmODdjN2NVLCAweDk5ZWU3Nzc3VSwgMHg4ZGY2N2I3YlUsCisgICAgICAgIDB4MGRmZmYyZjJVLCAweGJkZDY2YjZiVSwgMHhiMWRlNmY2ZlUsIDB4NTQ5MWM1YzVVLAorICAgICAgICAweDUwNjAzMDMwVSwgMHgwMzAyMDEwMVUsIDB4YTljZTY3NjdVLCAweDdkNTYyYjJiVSwKKyAgICAgICAgMHgxOWU3ZmVmZVUsIDB4NjJiNWQ3ZDdVLCAweGU2NGRhYmFiVSwgMHg5YWVjNzY3NlUsCisgICAgICAgIDB4NDU4ZmNhY2FVLCAweDlkMWY4MjgyVSwgMHg0MDg5YzljOVUsIDB4ODdmYTdkN2RVLAorICAgICAgICAweDE1ZWZmYWZhVSwgMHhlYmIyNTk1OVUsIDB4Yzk4ZTQ3NDdVLCAweDBiZmJmMGYwVSwKKyAgICAgICAgMHhlYzQxYWRhZFUsIDB4NjdiM2Q0ZDRVLCAweGZkNWZhMmEyVSwgMHhlYTQ1YWZhZlUsCisgICAgICAgIDB4YmYyMzljOWNVLCAweGY3NTNhNGE0VSwgMHg5NmU0NzI3MlUsIDB4NWI5YmMwYzBVLAorICAgICAgICAweGMyNzViN2I3VSwgMHgxY2UxZmRmZFUsIDB4YWUzZDkzOTNVLCAweDZhNGMyNjI2VSwKKyAgICAgICAgMHg1YTZjMzYzNlUsIDB4NDE3ZTNmM2ZVLCAweDAyZjVmN2Y3VSwgMHg0ZjgzY2NjY1UsCisgICAgICAgIDB4NWM2ODM0MzRVLCAweGY0NTFhNWE1VSwgMHgzNGQxZTVlNVUsIDB4MDhmOWYxZjFVLAorICAgICAgICAweDkzZTI3MTcxVSwgMHg3M2FiZDhkOFUsIDB4NTM2MjMxMzFVLCAweDNmMmExNTE1VSwKKyAgICAgICAgMHgwYzA4MDQwNFUsIDB4NTI5NWM3YzdVLCAweDY1NDYyMzIzVSwgMHg1ZTlkYzNjM1UsCisgICAgICAgIDB4MjgzMDE4MThVLCAweGExMzc5Njk2VSwgMHgwZjBhMDUwNVUsIDB4YjUyZjlhOWFVLAorICAgICAgICAweDA5MGUwNzA3VSwgMHgzNjI0MTIxMlUsIDB4OWIxYjgwODBVLCAweDNkZGZlMmUyVSwKKyAgICAgICAgMHgyNmNkZWJlYlUsIDB4Njk0ZTI3MjdVLCAweGNkN2ZiMmIyVSwgMHg5ZmVhNzU3NVUsCisgICAgICAgIDB4MWIxMjA5MDlVLCAweDllMWQ4MzgzVSwgMHg3NDU4MmMyY1UsIDB4MmUzNDFhMWFVLAorICAgICAgICAweDJkMzYxYjFiVSwgMHhiMmRjNmU2ZVUsIDB4ZWViNDVhNWFVLCAweGZiNWJhMGEwVSwKKyAgICAgICAgMHhmNmE0NTI1MlUsIDB4NGQ3NjNiM2JVLCAweDYxYjdkNmQ2VSwgMHhjZTdkYjNiM1UsCisgICAgICAgIDB4N2I1MjI5MjlVLCAweDNlZGRlM2UzVSwgMHg3MTVlMmYyZlUsIDB4OTcxMzg0ODRVLAorICAgICAgICAweGY1YTY1MzUzVSwgMHg2OGI5ZDFkMVUsIDB4MDAwMDAwMDBVLCAweDJjYzFlZGVkVSwKKyAgICAgICAgMHg2MDQwMjAyMFUsIDB4MWZlM2ZjZmNVLCAweGM4NzliMWIxVSwgMHhlZGI2NWI1YlUsCisgICAgICAgIDB4YmVkNDZhNmFVLCAweDQ2OGRjYmNiVSwgMHhkOTY3YmViZVUsIDB4NGI3MjM5MzlVLAorICAgICAgICAweGRlOTQ0YTRhVSwgMHhkNDk4NGM0Y1UsIDB4ZThiMDU4NThVLCAweDRhODVjZmNmVSwKKyAgICAgICAgMHg2YmJiZDBkMFUsIDB4MmFjNWVmZWZVLCAweGU1NGZhYWFhVSwgMHgxNmVkZmJmYlUsCisgICAgICAgIDB4YzU4NjQzNDNVLCAweGQ3OWE0ZDRkVSwgMHg1NTY2MzMzM1UsIDB4OTQxMTg1ODVVLAorICAgICAgICAweGNmOGE0NTQ1VSwgMHgxMGU5ZjlmOVUsIDB4MDYwNDAyMDJVLCAweDgxZmU3ZjdmVSwKKyAgICAgICAgMHhmMGEwNTA1MFUsIDB4NDQ3ODNjM2NVLCAweGJhMjU5ZjlmVSwgMHhlMzRiYThhOFUsCisgICAgICAgIDB4ZjNhMjUxNTFVLCAweGZlNWRhM2EzVSwgMHhjMDgwNDA0MFUsIDB4OGEwNThmOGZVLAorICAgICAgICAweGFkM2Y5MjkyVSwgMHhiYzIxOWQ5ZFUsIDB4NDg3MDM4MzhVLCAweDA0ZjFmNWY1VSwKKyAgICAgICAgMHhkZjYzYmNiY1UsIDB4YzE3N2I2YjZVLCAweDc1YWZkYWRhVSwgMHg2MzQyMjEyMVUsCisgICAgICAgIDB4MzAyMDEwMTBVLCAweDFhZTVmZmZmVSwgMHgwZWZkZjNmM1UsIDB4NmRiZmQyZDJVLAorICAgICAgICAweDRjODFjZGNkVSwgMHgxNDE4MGMwY1UsIDB4MzUyNjEzMTNVLCAweDJmYzNlY2VjVSwKKyAgICAgICAgMHhlMWJlNWY1ZlUsIDB4YTIzNTk3OTdVLCAweGNjODg0NDQ0VSwgMHgzOTJlMTcxN1UsCisgICAgICAgIDB4NTc5M2M0YzRVLCAweGYyNTVhN2E3VSwgMHg4MmZjN2U3ZVUsIDB4NDc3YTNkM2RVLAorICAgICAgICAweGFjYzg2NDY0VSwgMHhlN2JhNWQ1ZFUsIDB4MmIzMjE5MTlVLCAweDk1ZTY3MzczVSwKKyAgICAgICAgMHhhMGMwNjA2MFUsIDB4OTgxOTgxODFVLCAweGQxOWU0ZjRmVSwgMHg3ZmEzZGNkY1UsCisgICAgICAgIDB4NjY0NDIyMjJVLCAweDdlNTQyYTJhVSwgMHhhYjNiOTA5MFUsIDB4ODMwYjg4ODhVLAorICAgICAgICAweGNhOGM0NjQ2VSwgMHgyOWM3ZWVlZVUsIDB4ZDM2YmI4YjhVLCAweDNjMjgxNDE0VSwKKyAgICAgICAgMHg3OWE3ZGVkZVUsIDB4ZTJiYzVlNWVVLCAweDFkMTYwYjBiVSwgMHg3NmFkZGJkYlUsCisgICAgICAgIDB4M2JkYmUwZTBVLCAweDU2NjQzMjMyVSwgMHg0ZTc0M2EzYVUsIDB4MWUxNDBhMGFVLAorICAgICAgICAweGRiOTI0OTQ5VSwgMHgwYTBjMDYwNlUsIDB4NmM0ODI0MjRVLCAweGU0Yjg1YzVjVSwKKyAgICAgICAgMHg1ZDlmYzJjMlUsIDB4NmViZGQzZDNVLCAweGVmNDNhY2FjVSwgMHhhNmM0NjI2MlUsCisgICAgICAgIDB4YTgzOTkxOTFVLCAweGE0MzE5NTk1VSwgMHgzN2QzZTRlNFUsIDB4OGJmMjc5NzlVLAorICAgICAgICAweDMyZDVlN2U3VSwgMHg0MzhiYzhjOFUsIDB4NTk2ZTM3MzdVLCAweGI3ZGE2ZDZkVSwKKyAgICAgICAgMHg4YzAxOGQ4ZFUsIDB4NjRiMWQ1ZDVVLCAweGQyOWM0ZTRlVSwgMHhlMDQ5YTlhOVUsCisgICAgICAgIDB4YjRkODZjNmNVLCAweGZhYWM1NjU2VSwgMHgwN2YzZjRmNFUsIDB4MjVjZmVhZWFVLAorICAgICAgICAweGFmY2E2NTY1VSwgMHg4ZWY0N2E3YVUsIDB4ZTk0N2FlYWVVLCAweDE4MTAwODA4VSwKKyAgICAgICAgMHhkNTZmYmFiYVUsIDB4ODhmMDc4NzhVLCAweDZmNGEyNTI1VSwgMHg3MjVjMmUyZVUsCisgICAgICAgIDB4MjQzODFjMWNVLCAweGYxNTdhNmE2VSwgMHhjNzczYjRiNFUsIDB4NTE5N2M2YzZVLAorICAgICAgICAweDIzY2JlOGU4VSwgMHg3Y2ExZGRkZFUsIDB4OWNlODc0NzRVLCAweDIxM2UxZjFmVSwKKyAgICAgICAgMHhkZDk2NGI0YlUsIDB4ZGM2MWJkYmRVLCAweDg2MGQ4YjhiVSwgMHg4NTBmOGE4YVUsCisgICAgICAgIDB4OTBlMDcwNzBVLCAweDQyN2MzZTNlVSwgMHhjNDcxYjViNVUsIDB4YWFjYzY2NjZVLAorICAgICAgICAweGQ4OTA0ODQ4VSwgMHgwNTA2MDMwM1UsIDB4MDFmN2Y2ZjZVLCAweDEyMWMwZTBlVSwKKyAgICAgICAgMHhhM2MyNjE2MVUsIDB4NWY2YTM1MzVVLCAweGY5YWU1NzU3VSwgMHhkMDY5YjliOVUsCisgICAgICAgIDB4OTExNzg2ODZVLCAweDU4OTljMWMxVSwgMHgyNzNhMWQxZFUsIDB4YjkyNzllOWVVLAorICAgICAgICAweDM4ZDllMWUxVSwgMHgxM2ViZjhmOFUsIDB4YjMyYjk4OThVLCAweDMzMjIxMTExVSwKKyAgICAgICAgMHhiYmQyNjk2OVUsIDB4NzBhOWQ5ZDlVLCAweDg5MDc4ZThlVSwgMHhhNzMzOTQ5NFUsCisgICAgICAgIDB4YjYyZDliOWJVLCAweDIyM2MxZTFlVSwgMHg5MjE1ODc4N1UsIDB4MjBjOWU5ZTlVLAorICAgICAgICAweDQ5ODdjZWNlVSwgMHhmZmFhNTU1NVUsIDB4Nzg1MDI4MjhVLCAweDdhYTVkZmRmVSwKKyAgICAgICAgMHg4ZjAzOGM4Y1UsIDB4Zjg1OWExYTFVLCAweDgwMDk4OTg5VSwgMHgxNzFhMGQwZFUsCisgICAgICAgIDB4ZGE2NWJmYmZVLCAweDMxZDdlNmU2VSwgMHhjNjg0NDI0MlUsIDB4YjhkMDY4NjhVLAorICAgICAgICAweGMzODI0MTQxVSwgMHhiMDI5OTk5OVUsIDB4Nzc1YTJkMmRVLCAweDExMWUwZjBmVSwKKyAgICAgICAgMHhjYjdiYjBiMFUsIDB4ZmNhODU0NTRVLCAweGQ2NmRiYmJiVSwgMHgzYTJjMTYxNlUsCit9OworY29uc3QgdWludDMyX3QgQUVTX1RlMlsyNTZdID0geworICAgICAgICAweDYzYTVjNjYzVSwgMHg3Yzg0Zjg3Y1UsIDB4Nzc5OWVlNzdVLCAweDdiOGRmNjdiVSwKKyAgICAgICAgMHhmMjBkZmZmMlUsIDB4NmJiZGQ2NmJVLCAweDZmYjFkZTZmVSwgMHhjNTU0OTFjNVUsCisgICAgICAgIDB4MzA1MDYwMzBVLCAweDAxMDMwMjAxVSwgMHg2N2E5Y2U2N1UsIDB4MmI3ZDU2MmJVLAorICAgICAgICAweGZlMTllN2ZlVSwgMHhkNzYyYjVkN1UsIDB4YWJlNjRkYWJVLCAweDc2OWFlYzc2VSwKKyAgICAgICAgMHhjYTQ1OGZjYVUsIDB4ODI5ZDFmODJVLCAweGM5NDA4OWM5VSwgMHg3ZDg3ZmE3ZFUsCisgICAgICAgIDB4ZmExNWVmZmFVLCAweDU5ZWJiMjU5VSwgMHg0N2M5OGU0N1UsIDB4ZjAwYmZiZjBVLAorICAgICAgICAweGFkZWM0MWFkVSwgMHhkNDY3YjNkNFUsIDB4YTJmZDVmYTJVLCAweGFmZWE0NWFmVSwKKyAgICAgICAgMHg5Y2JmMjM5Y1UsIDB4YTRmNzUzYTRVLCAweDcyOTZlNDcyVSwgMHhjMDViOWJjMFUsCisgICAgICAgIDB4YjdjMjc1YjdVLCAweGZkMWNlMWZkVSwgMHg5M2FlM2Q5M1UsIDB4MjY2YTRjMjZVLAorICAgICAgICAweDM2NWE2YzM2VSwgMHgzZjQxN2UzZlUsIDB4ZjcwMmY1ZjdVLCAweGNjNGY4M2NjVSwKKyAgICAgICAgMHgzNDVjNjgzNFUsIDB4YTVmNDUxYTVVLCAweGU1MzRkMWU1VSwgMHhmMTA4ZjlmMVUsCisgICAgICAgIDB4NzE5M2UyNzFVLCAweGQ4NzNhYmQ4VSwgMHgzMTUzNjIzMVUsIDB4MTUzZjJhMTVVLAorICAgICAgICAweDA0MGMwODA0VSwgMHhjNzUyOTVjN1UsIDB4MjM2NTQ2MjNVLCAweGMzNWU5ZGMzVSwKKyAgICAgICAgMHgxODI4MzAxOFUsIDB4OTZhMTM3OTZVLCAweDA1MGYwYTA1VSwgMHg5YWI1MmY5YVUsCisgICAgICAgIDB4MDcwOTBlMDdVLCAweDEyMzYyNDEyVSwgMHg4MDliMWI4MFUsIDB4ZTIzZGRmZTJVLAorICAgICAgICAweGViMjZjZGViVSwgMHgyNzY5NGUyN1UsIDB4YjJjZDdmYjJVLCAweDc1OWZlYTc1VSwKKyAgICAgICAgMHgwOTFiMTIwOVUsIDB4ODM5ZTFkODNVLCAweDJjNzQ1ODJjVSwgMHgxYTJlMzQxYVUsCisgICAgICAgIDB4MWIyZDM2MWJVLCAweDZlYjJkYzZlVSwgMHg1YWVlYjQ1YVUsIDB4YTBmYjViYTBVLAorICAgICAgICAweDUyZjZhNDUyVSwgMHgzYjRkNzYzYlUsIDB4ZDY2MWI3ZDZVLCAweGIzY2U3ZGIzVSwKKyAgICAgICAgMHgyOTdiNTIyOVUsIDB4ZTMzZWRkZTNVLCAweDJmNzE1ZTJmVSwgMHg4NDk3MTM4NFUsCisgICAgICAgIDB4NTNmNWE2NTNVLCAweGQxNjhiOWQxVSwgMHgwMDAwMDAwMFUsIDB4ZWQyY2MxZWRVLAorICAgICAgICAweDIwNjA0MDIwVSwgMHhmYzFmZTNmY1UsIDB4YjFjODc5YjFVLCAweDViZWRiNjViVSwKKyAgICAgICAgMHg2YWJlZDQ2YVUsIDB4Y2I0NjhkY2JVLCAweGJlZDk2N2JlVSwgMHgzOTRiNzIzOVUsCisgICAgICAgIDB4NGFkZTk0NGFVLCAweDRjZDQ5ODRjVSwgMHg1OGU4YjA1OFUsIDB4Y2Y0YTg1Y2ZVLAorICAgICAgICAweGQwNmJiYmQwVSwgMHhlZjJhYzVlZlUsIDB4YWFlNTRmYWFVLCAweGZiMTZlZGZiVSwKKyAgICAgICAgMHg0M2M1ODY0M1UsIDB4NGRkNzlhNGRVLCAweDMzNTU2NjMzVSwgMHg4NTk0MTE4NVUsCisgICAgICAgIDB4NDVjZjhhNDVVLCAweGY5MTBlOWY5VSwgMHgwMjA2MDQwMlUsIDB4N2Y4MWZlN2ZVLAorICAgICAgICAweDUwZjBhMDUwVSwgMHgzYzQ0NzgzY1UsIDB4OWZiYTI1OWZVLCAweGE4ZTM0YmE4VSwKKyAgICAgICAgMHg1MWYzYTI1MVUsIDB4YTNmZTVkYTNVLCAweDQwYzA4MDQwVSwgMHg4ZjhhMDU4ZlUsCisgICAgICAgIDB4OTJhZDNmOTJVLCAweDlkYmMyMTlkVSwgMHgzODQ4NzAzOFUsIDB4ZjUwNGYxZjVVLAorICAgICAgICAweGJjZGY2M2JjVSwgMHhiNmMxNzdiNlUsIDB4ZGE3NWFmZGFVLCAweDIxNjM0MjIxVSwKKyAgICAgICAgMHgxMDMwMjAxMFUsIDB4ZmYxYWU1ZmZVLCAweGYzMGVmZGYzVSwgMHhkMjZkYmZkMlUsCisgICAgICAgIDB4Y2Q0YzgxY2RVLCAweDBjMTQxODBjVSwgMHgxMzM1MjYxM1UsIDB4ZWMyZmMzZWNVLAorICAgICAgICAweDVmZTFiZTVmVSwgMHg5N2EyMzU5N1UsIDB4NDRjYzg4NDRVLCAweDE3MzkyZTE3VSwKKyAgICAgICAgMHhjNDU3OTNjNFUsIDB4YTdmMjU1YTdVLCAweDdlODJmYzdlVSwgMHgzZDQ3N2EzZFUsCisgICAgICAgIDB4NjRhY2M4NjRVLCAweDVkZTdiYTVkVSwgMHgxOTJiMzIxOVUsIDB4NzM5NWU2NzNVLAorICAgICAgICAweDYwYTBjMDYwVSwgMHg4MTk4MTk4MVUsIDB4NGZkMTllNGZVLCAweGRjN2ZhM2RjVSwKKyAgICAgICAgMHgyMjY2NDQyMlUsIDB4MmE3ZTU0MmFVLCAweDkwYWIzYjkwVSwgMHg4ODgzMGI4OFUsCisgICAgICAgIDB4NDZjYThjNDZVLCAweGVlMjljN2VlVSwgMHhiOGQzNmJiOFUsIDB4MTQzYzI4MTRVLAorICAgICAgICAweGRlNzlhN2RlVSwgMHg1ZWUyYmM1ZVUsIDB4MGIxZDE2MGJVLCAweGRiNzZhZGRiVSwKKyAgICAgICAgMHhlMDNiZGJlMFUsIDB4MzI1NjY0MzJVLCAweDNhNGU3NDNhVSwgMHgwYTFlMTQwYVUsCisgICAgICAgIDB4NDlkYjkyNDlVLCAweDA2MGEwYzA2VSwgMHgyNDZjNDgyNFUsIDB4NWNlNGI4NWNVLAorICAgICAgICAweGMyNWQ5ZmMyVSwgMHhkMzZlYmRkM1UsIDB4YWNlZjQzYWNVLCAweDYyYTZjNDYyVSwKKyAgICAgICAgMHg5MWE4Mzk5MVUsIDB4OTVhNDMxOTVVLCAweGU0MzdkM2U0VSwgMHg3OThiZjI3OVUsCisgICAgICAgIDB4ZTczMmQ1ZTdVLCAweGM4NDM4YmM4VSwgMHgzNzU5NmUzN1UsIDB4NmRiN2RhNmRVLAorICAgICAgICAweDhkOGMwMThkVSwgMHhkNTY0YjFkNVUsIDB4NGVkMjljNGVVLCAweGE5ZTA0OWE5VSwKKyAgICAgICAgMHg2Y2I0ZDg2Y1UsIDB4NTZmYWFjNTZVLCAweGY0MDdmM2Y0VSwgMHhlYTI1Y2ZlYVUsCisgICAgICAgIDB4NjVhZmNhNjVVLCAweDdhOGVmNDdhVSwgMHhhZWU5NDdhZVUsIDB4MDgxODEwMDhVLAorICAgICAgICAweGJhZDU2ZmJhVSwgMHg3ODg4ZjA3OFUsIDB4MjU2ZjRhMjVVLCAweDJlNzI1YzJlVSwKKyAgICAgICAgMHgxYzI0MzgxY1UsIDB4YTZmMTU3YTZVLCAweGI0Yzc3M2I0VSwgMHhjNjUxOTdjNlUsCisgICAgICAgIDB4ZTgyM2NiZThVLCAweGRkN2NhMWRkVSwgMHg3NDljZTg3NFUsIDB4MWYyMTNlMWZVLAorICAgICAgICAweDRiZGQ5NjRiVSwgMHhiZGRjNjFiZFUsIDB4OGI4NjBkOGJVLCAweDhhODUwZjhhVSwKKyAgICAgICAgMHg3MDkwZTA3MFUsIDB4M2U0MjdjM2VVLCAweGI1YzQ3MWI1VSwgMHg2NmFhY2M2NlUsCisgICAgICAgIDB4NDhkODkwNDhVLCAweDAzMDUwNjAzVSwgMHhmNjAxZjdmNlUsIDB4MGUxMjFjMGVVLAorICAgICAgICAweDYxYTNjMjYxVSwgMHgzNTVmNmEzNVUsIDB4NTdmOWFlNTdVLCAweGI5ZDA2OWI5VSwKKyAgICAgICAgMHg4NjkxMTc4NlUsIDB4YzE1ODk5YzFVLCAweDFkMjczYTFkVSwgMHg5ZWI5Mjc5ZVUsCisgICAgICAgIDB4ZTEzOGQ5ZTFVLCAweGY4MTNlYmY4VSwgMHg5OGIzMmI5OFUsIDB4MTEzMzIyMTFVLAorICAgICAgICAweDY5YmJkMjY5VSwgMHhkOTcwYTlkOVUsIDB4OGU4OTA3OGVVLCAweDk0YTczMzk0VSwKKyAgICAgICAgMHg5YmI2MmQ5YlUsIDB4MWUyMjNjMWVVLCAweDg3OTIxNTg3VSwgMHhlOTIwYzllOVUsCisgICAgICAgIDB4Y2U0OTg3Y2VVLCAweDU1ZmZhYTU1VSwgMHgyODc4NTAyOFUsIDB4ZGY3YWE1ZGZVLAorICAgICAgICAweDhjOGYwMzhjVSwgMHhhMWY4NTlhMVUsIDB4ODk4MDA5ODlVLCAweDBkMTcxYTBkVSwKKyAgICAgICAgMHhiZmRhNjViZlUsIDB4ZTYzMWQ3ZTZVLCAweDQyYzY4NDQyVSwgMHg2OGI4ZDA2OFUsCisgICAgICAgIDB4NDFjMzgyNDFVLCAweDk5YjAyOTk5VSwgMHgyZDc3NWEyZFUsIDB4MGYxMTFlMGZVLAorICAgICAgICAweGIwY2I3YmIwVSwgMHg1NGZjYTg1NFUsIDB4YmJkNjZkYmJVLCAweDE2M2EyYzE2VSwKK307Citjb25zdCB1aW50MzJfdCBBRVNfVGUzWzI1Nl0gPSB7CisKKyAgICAgICAgMHg2MzYzYTVjNlUsIDB4N2M3Yzg0ZjhVLCAweDc3Nzc5OWVlVSwgMHg3YjdiOGRmNlUsCisgICAgICAgIDB4ZjJmMjBkZmZVLCAweDZiNmJiZGQ2VSwgMHg2ZjZmYjFkZVUsIDB4YzVjNTU0OTFVLAorICAgICAgICAweDMwMzA1MDYwVSwgMHgwMTAxMDMwMlUsIDB4Njc2N2E5Y2VVLCAweDJiMmI3ZDU2VSwKKyAgICAgICAgMHhmZWZlMTllN1UsIDB4ZDdkNzYyYjVVLCAweGFiYWJlNjRkVSwgMHg3Njc2OWFlY1UsCisgICAgICAgIDB4Y2FjYTQ1OGZVLCAweDgyODI5ZDFmVSwgMHhjOWM5NDA4OVUsIDB4N2Q3ZDg3ZmFVLAorICAgICAgICAweGZhZmExNWVmVSwgMHg1OTU5ZWJiMlUsIDB4NDc0N2M5OGVVLCAweGYwZjAwYmZiVSwKKyAgICAgICAgMHhhZGFkZWM0MVUsIDB4ZDRkNDY3YjNVLCAweGEyYTJmZDVmVSwgMHhhZmFmZWE0NVUsCisgICAgICAgIDB4OWM5Y2JmMjNVLCAweGE0YTRmNzUzVSwgMHg3MjcyOTZlNFUsIDB4YzBjMDViOWJVLAorICAgICAgICAweGI3YjdjMjc1VSwgMHhmZGZkMWNlMVUsIDB4OTM5M2FlM2RVLCAweDI2MjY2YTRjVSwKKyAgICAgICAgMHgzNjM2NWE2Y1UsIDB4M2YzZjQxN2VVLCAweGY3ZjcwMmY1VSwgMHhjY2NjNGY4M1UsCisgICAgICAgIDB4MzQzNDVjNjhVLCAweGE1YTVmNDUxVSwgMHhlNWU1MzRkMVUsIDB4ZjFmMTA4ZjlVLAorICAgICAgICAweDcxNzE5M2UyVSwgMHhkOGQ4NzNhYlUsIDB4MzEzMTUzNjJVLCAweDE1MTUzZjJhVSwKKyAgICAgICAgMHgwNDA0MGMwOFUsIDB4YzdjNzUyOTVVLCAweDIzMjM2NTQ2VSwgMHhjM2MzNWU5ZFUsCisgICAgICAgIDB4MTgxODI4MzBVLCAweDk2OTZhMTM3VSwgMHgwNTA1MGYwYVUsIDB4OWE5YWI1MmZVLAorICAgICAgICAweDA3MDcwOTBlVSwgMHgxMjEyMzYyNFUsIDB4ODA4MDliMWJVLCAweGUyZTIzZGRmVSwKKyAgICAgICAgMHhlYmViMjZjZFUsIDB4MjcyNzY5NGVVLCAweGIyYjJjZDdmVSwgMHg3NTc1OWZlYVUsCisgICAgICAgIDB4MDkwOTFiMTJVLCAweDgzODM5ZTFkVSwgMHgyYzJjNzQ1OFUsIDB4MWExYTJlMzRVLAorICAgICAgICAweDFiMWIyZDM2VSwgMHg2ZTZlYjJkY1UsIDB4NWE1YWVlYjRVLCAweGEwYTBmYjViVSwKKyAgICAgICAgMHg1MjUyZjZhNFUsIDB4M2IzYjRkNzZVLCAweGQ2ZDY2MWI3VSwgMHhiM2IzY2U3ZFUsCisgICAgICAgIDB4MjkyOTdiNTJVLCAweGUzZTMzZWRkVSwgMHgyZjJmNzE1ZVUsIDB4ODQ4NDk3MTNVLAorICAgICAgICAweDUzNTNmNWE2VSwgMHhkMWQxNjhiOVUsIDB4MDAwMDAwMDBVLCAweGVkZWQyY2MxVSwKKyAgICAgICAgMHgyMDIwNjA0MFUsIDB4ZmNmYzFmZTNVLCAweGIxYjFjODc5VSwgMHg1YjViZWRiNlUsCisgICAgICAgIDB4NmE2YWJlZDRVLCAweGNiY2I0NjhkVSwgMHhiZWJlZDk2N1UsIDB4MzkzOTRiNzJVLAorICAgICAgICAweDRhNGFkZTk0VSwgMHg0YzRjZDQ5OFUsIDB4NTg1OGU4YjBVLCAweGNmY2Y0YTg1VSwKKyAgICAgICAgMHhkMGQwNmJiYlUsIDB4ZWZlZjJhYzVVLCAweGFhYWFlNTRmVSwgMHhmYmZiMTZlZFUsCisgICAgICAgIDB4NDM0M2M1ODZVLCAweDRkNGRkNzlhVSwgMHgzMzMzNTU2NlUsIDB4ODU4NTk0MTFVLAorICAgICAgICAweDQ1NDVjZjhhVSwgMHhmOWY5MTBlOVUsIDB4MDIwMjA2MDRVLCAweDdmN2Y4MWZlVSwKKyAgICAgICAgMHg1MDUwZjBhMFUsIDB4M2MzYzQ0NzhVLCAweDlmOWZiYTI1VSwgMHhhOGE4ZTM0YlUsCisgICAgICAgIDB4NTE1MWYzYTJVLCAweGEzYTNmZTVkVSwgMHg0MDQwYzA4MFUsIDB4OGY4ZjhhMDVVLAorICAgICAgICAweDkyOTJhZDNmVSwgMHg5ZDlkYmMyMVUsIDB4MzgzODQ4NzBVLCAweGY1ZjUwNGYxVSwKKyAgICAgICAgMHhiY2JjZGY2M1UsIDB4YjZiNmMxNzdVLCAweGRhZGE3NWFmVSwgMHgyMTIxNjM0MlUsCisgICAgICAgIDB4MTAxMDMwMjBVLCAweGZmZmYxYWU1VSwgMHhmM2YzMGVmZFUsIDB4ZDJkMjZkYmZVLAorICAgICAgICAweGNkY2Q0YzgxVSwgMHgwYzBjMTQxOFUsIDB4MTMxMzM1MjZVLCAweGVjZWMyZmMzVSwKKyAgICAgICAgMHg1ZjVmZTFiZVUsIDB4OTc5N2EyMzVVLCAweDQ0NDRjYzg4VSwgMHgxNzE3MzkyZVUsCisgICAgICAgIDB4YzRjNDU3OTNVLCAweGE3YTdmMjU1VSwgMHg3ZTdlODJmY1UsIDB4M2QzZDQ3N2FVLAorICAgICAgICAweDY0NjRhY2M4VSwgMHg1ZDVkZTdiYVUsIDB4MTkxOTJiMzJVLCAweDczNzM5NWU2VSwKKyAgICAgICAgMHg2MDYwYTBjMFUsIDB4ODE4MTk4MTlVLCAweDRmNGZkMTllVSwgMHhkY2RjN2ZhM1UsCisgICAgICAgIDB4MjIyMjY2NDRVLCAweDJhMmE3ZTU0VSwgMHg5MDkwYWIzYlUsIDB4ODg4ODgzMGJVLAorICAgICAgICAweDQ2NDZjYThjVSwgMHhlZWVlMjljN1UsIDB4YjhiOGQzNmJVLCAweDE0MTQzYzI4VSwKKyAgICAgICAgMHhkZWRlNzlhN1UsIDB4NWU1ZWUyYmNVLCAweDBiMGIxZDE2VSwgMHhkYmRiNzZhZFUsCisgICAgICAgIDB4ZTBlMDNiZGJVLCAweDMyMzI1NjY0VSwgMHgzYTNhNGU3NFUsIDB4MGEwYTFlMTRVLAorICAgICAgICAweDQ5NDlkYjkyVSwgMHgwNjA2MGEwY1UsIDB4MjQyNDZjNDhVLCAweDVjNWNlNGI4VSwKKyAgICAgICAgMHhjMmMyNWQ5ZlUsIDB4ZDNkMzZlYmRVLCAweGFjYWNlZjQzVSwgMHg2MjYyYTZjNFUsCisgICAgICAgIDB4OTE5MWE4MzlVLCAweDk1OTVhNDMxVSwgMHhlNGU0MzdkM1UsIDB4Nzk3OThiZjJVLAorICAgICAgICAweGU3ZTczMmQ1VSwgMHhjOGM4NDM4YlUsIDB4MzczNzU5NmVVLCAweDZkNmRiN2RhVSwKKyAgICAgICAgMHg4ZDhkOGMwMVUsIDB4ZDVkNTY0YjFVLCAweDRlNGVkMjljVSwgMHhhOWE5ZTA0OVUsCisgICAgICAgIDB4NmM2Y2I0ZDhVLCAweDU2NTZmYWFjVSwgMHhmNGY0MDdmM1UsIDB4ZWFlYTI1Y2ZVLAorICAgICAgICAweDY1NjVhZmNhVSwgMHg3YTdhOGVmNFUsIDB4YWVhZWU5NDdVLCAweDA4MDgxODEwVSwKKyAgICAgICAgMHhiYWJhZDU2ZlUsIDB4Nzg3ODg4ZjBVLCAweDI1MjU2ZjRhVSwgMHgyZTJlNzI1Y1UsCisgICAgICAgIDB4MWMxYzI0MzhVLCAweGE2YTZmMTU3VSwgMHhiNGI0Yzc3M1UsIDB4YzZjNjUxOTdVLAorICAgICAgICAweGU4ZTgyM2NiVSwgMHhkZGRkN2NhMVUsIDB4NzQ3NDljZThVLCAweDFmMWYyMTNlVSwKKyAgICAgICAgMHg0YjRiZGQ5NlUsIDB4YmRiZGRjNjFVLCAweDhiOGI4NjBkVSwgMHg4YThhODUwZlUsCisgICAgICAgIDB4NzA3MDkwZTBVLCAweDNlM2U0MjdjVSwgMHhiNWI1YzQ3MVUsIDB4NjY2NmFhY2NVLAorICAgICAgICAweDQ4NDhkODkwVSwgMHgwMzAzMDUwNlUsIDB4ZjZmNjAxZjdVLCAweDBlMGUxMjFjVSwKKyAgICAgICAgMHg2MTYxYTNjMlUsIDB4MzUzNTVmNmFVLCAweDU3NTdmOWFlVSwgMHhiOWI5ZDA2OVUsCisgICAgICAgIDB4ODY4NjkxMTdVLCAweGMxYzE1ODk5VSwgMHgxZDFkMjczYVUsIDB4OWU5ZWI5MjdVLAorICAgICAgICAweGUxZTEzOGQ5VSwgMHhmOGY4MTNlYlUsIDB4OTg5OGIzMmJVLCAweDExMTEzMzIyVSwKKyAgICAgICAgMHg2OTY5YmJkMlUsIDB4ZDlkOTcwYTlVLCAweDhlOGU4OTA3VSwgMHg5NDk0YTczM1UsCisgICAgICAgIDB4OWI5YmI2MmRVLCAweDFlMWUyMjNjVSwgMHg4Nzg3OTIxNVUsIDB4ZTllOTIwYzlVLAorICAgICAgICAweGNlY2U0OTg3VSwgMHg1NTU1ZmZhYVUsIDB4MjgyODc4NTBVLCAweGRmZGY3YWE1VSwKKyAgICAgICAgMHg4YzhjOGYwM1UsIDB4YTFhMWY4NTlVLCAweDg5ODk4MDA5VSwgMHgwZDBkMTcxYVUsCisgICAgICAgIDB4YmZiZmRhNjVVLCAweGU2ZTYzMWQ3VSwgMHg0MjQyYzY4NFUsIDB4Njg2OGI4ZDBVLAorICAgICAgICAweDQxNDFjMzgyVSwgMHg5OTk5YjAyOVUsIDB4MmQyZDc3NWFVLCAweDBmMGYxMTFlVSwKKyAgICAgICAgMHhiMGIwY2I3YlUsIDB4NTQ1NGZjYThVLCAweGJiYmJkNjZkVSwgMHgxNjE2M2EyY1UsCit9OworY29uc3QgdWludDMyX3QgQUVTX1RlNFsyNTZdID0geworICAgICAgICAweDYzNjM2MzYzVSwgMHg3YzdjN2M3Y1UsIDB4Nzc3Nzc3NzdVLCAweDdiN2I3YjdiVSwKKyAgICAgICAgMHhmMmYyZjJmMlUsIDB4NmI2YjZiNmJVLCAweDZmNmY2ZjZmVSwgMHhjNWM1YzVjNVUsCisgICAgICAgIDB4MzAzMDMwMzBVLCAweDAxMDEwMTAxVSwgMHg2NzY3Njc2N1UsIDB4MmIyYjJiMmJVLAorICAgICAgICAweGZlZmVmZWZlVSwgMHhkN2Q3ZDdkN1UsIDB4YWJhYmFiYWJVLCAweDc2NzY3Njc2VSwKKyAgICAgICAgMHhjYWNhY2FjYVUsIDB4ODI4MjgyODJVLCAweGM5YzljOWM5VSwgMHg3ZDdkN2Q3ZFUsCisgICAgICAgIDB4ZmFmYWZhZmFVLCAweDU5NTk1OTU5VSwgMHg0NzQ3NDc0N1UsIDB4ZjBmMGYwZjBVLAorICAgICAgICAweGFkYWRhZGFkVSwgMHhkNGQ0ZDRkNFUsIDB4YTJhMmEyYTJVLCAweGFmYWZhZmFmVSwKKyAgICAgICAgMHg5YzljOWM5Y1UsIDB4YTRhNGE0YTRVLCAweDcyNzI3MjcyVSwgMHhjMGMwYzBjMFUsCisgICAgICAgIDB4YjdiN2I3YjdVLCAweGZkZmRmZGZkVSwgMHg5MzkzOTM5M1UsIDB4MjYyNjI2MjZVLAorICAgICAgICAweDM2MzYzNjM2VSwgMHgzZjNmM2YzZlUsIDB4ZjdmN2Y3ZjdVLCAweGNjY2NjY2NjVSwKKyAgICAgICAgMHgzNDM0MzQzNFUsIDB4YTVhNWE1YTVVLCAweGU1ZTVlNWU1VSwgMHhmMWYxZjFmMVUsCisgICAgICAgIDB4NzE3MTcxNzFVLCAweGQ4ZDhkOGQ4VSwgMHgzMTMxMzEzMVUsIDB4MTUxNTE1MTVVLAorICAgICAgICAweDA0MDQwNDA0VSwgMHhjN2M3YzdjN1UsIDB4MjMyMzIzMjNVLCAweGMzYzNjM2MzVSwKKyAgICAgICAgMHgxODE4MTgxOFUsIDB4OTY5Njk2OTZVLCAweDA1MDUwNTA1VSwgMHg5YTlhOWE5YVUsCisgICAgICAgIDB4MDcwNzA3MDdVLCAweDEyMTIxMjEyVSwgMHg4MDgwODA4MFUsIDB4ZTJlMmUyZTJVLAorICAgICAgICAweGViZWJlYmViVSwgMHgyNzI3MjcyN1UsIDB4YjJiMmIyYjJVLCAweDc1NzU3NTc1VSwKKyAgICAgICAgMHgwOTA5MDkwOVUsIDB4ODM4MzgzODNVLCAweDJjMmMyYzJjVSwgMHgxYTFhMWExYVUsCisgICAgICAgIDB4MWIxYjFiMWJVLCAweDZlNmU2ZTZlVSwgMHg1YTVhNWE1YVUsIDB4YTBhMGEwYTBVLAorICAgICAgICAweDUyNTI1MjUyVSwgMHgzYjNiM2IzYlUsIDB4ZDZkNmQ2ZDZVLCAweGIzYjNiM2IzVSwKKyAgICAgICAgMHgyOTI5MjkyOVUsIDB4ZTNlM2UzZTNVLCAweDJmMmYyZjJmVSwgMHg4NDg0ODQ4NFUsCisgICAgICAgIDB4NTM1MzUzNTNVLCAweGQxZDFkMWQxVSwgMHgwMDAwMDAwMFUsIDB4ZWRlZGVkZWRVLAorICAgICAgICAweDIwMjAyMDIwVSwgMHhmY2ZjZmNmY1UsIDB4YjFiMWIxYjFVLCAweDViNWI1YjViVSwKKyAgICAgICAgMHg2YTZhNmE2YVUsIDB4Y2JjYmNiY2JVLCAweGJlYmViZWJlVSwgMHgzOTM5MzkzOVUsCisgICAgICAgIDB4NGE0YTRhNGFVLCAweDRjNGM0YzRjVSwgMHg1ODU4NTg1OFUsIDB4Y2ZjZmNmY2ZVLAorICAgICAgICAweGQwZDBkMGQwVSwgMHhlZmVmZWZlZlUsIDB4YWFhYWFhYWFVLCAweGZiZmJmYmZiVSwKKyAgICAgICAgMHg0MzQzNDM0M1UsIDB4NGQ0ZDRkNGRVLCAweDMzMzMzMzMzVSwgMHg4NTg1ODU4NVUsCisgICAgICAgIDB4NDU0NTQ1NDVVLCAweGY5ZjlmOWY5VSwgMHgwMjAyMDIwMlUsIDB4N2Y3ZjdmN2ZVLAorICAgICAgICAweDUwNTA1MDUwVSwgMHgzYzNjM2MzY1UsIDB4OWY5ZjlmOWZVLCAweGE4YThhOGE4VSwKKyAgICAgICAgMHg1MTUxNTE1MVUsIDB4YTNhM2EzYTNVLCAweDQwNDA0MDQwVSwgMHg4ZjhmOGY4ZlUsCisgICAgICAgIDB4OTI5MjkyOTJVLCAweDlkOWQ5ZDlkVSwgMHgzODM4MzgzOFUsIDB4ZjVmNWY1ZjVVLAorICAgICAgICAweGJjYmNiY2JjVSwgMHhiNmI2YjZiNlUsIDB4ZGFkYWRhZGFVLCAweDIxMjEyMTIxVSwKKyAgICAgICAgMHgxMDEwMTAxMFUsIDB4ZmZmZmZmZmZVLCAweGYzZjNmM2YzVSwgMHhkMmQyZDJkMlUsCisgICAgICAgIDB4Y2RjZGNkY2RVLCAweDBjMGMwYzBjVSwgMHgxMzEzMTMxM1UsIDB4ZWNlY2VjZWNVLAorICAgICAgICAweDVmNWY1ZjVmVSwgMHg5Nzk3OTc5N1UsIDB4NDQ0NDQ0NDRVLCAweDE3MTcxNzE3VSwKKyAgICAgICAgMHhjNGM0YzRjNFUsIDB4YTdhN2E3YTdVLCAweDdlN2U3ZTdlVSwgMHgzZDNkM2QzZFUsCisgICAgICAgIDB4NjQ2NDY0NjRVLCAweDVkNWQ1ZDVkVSwgMHgxOTE5MTkxOVUsIDB4NzM3MzczNzNVLAorICAgICAgICAweDYwNjA2MDYwVSwgMHg4MTgxODE4MVUsIDB4NGY0ZjRmNGZVLCAweGRjZGNkY2RjVSwKKyAgICAgICAgMHgyMjIyMjIyMlUsIDB4MmEyYTJhMmFVLCAweDkwOTA5MDkwVSwgMHg4ODg4ODg4OFUsCisgICAgICAgIDB4NDY0NjQ2NDZVLCAweGVlZWVlZWVlVSwgMHhiOGI4YjhiOFUsIDB4MTQxNDE0MTRVLAorICAgICAgICAweGRlZGVkZWRlVSwgMHg1ZTVlNWU1ZVUsIDB4MGIwYjBiMGJVLCAweGRiZGJkYmRiVSwKKyAgICAgICAgMHhlMGUwZTBlMFUsIDB4MzIzMjMyMzJVLCAweDNhM2EzYTNhVSwgMHgwYTBhMGEwYVUsCisgICAgICAgIDB4NDk0OTQ5NDlVLCAweDA2MDYwNjA2VSwgMHgyNDI0MjQyNFUsIDB4NWM1YzVjNWNVLAorICAgICAgICAweGMyYzJjMmMyVSwgMHhkM2QzZDNkM1UsIDB4YWNhY2FjYWNVLCAweDYyNjI2MjYyVSwKKyAgICAgICAgMHg5MTkxOTE5MVUsIDB4OTU5NTk1OTVVLCAweGU0ZTRlNGU0VSwgMHg3OTc5Nzk3OVUsCisgICAgICAgIDB4ZTdlN2U3ZTdVLCAweGM4YzhjOGM4VSwgMHgzNzM3MzczN1UsIDB4NmQ2ZDZkNmRVLAorICAgICAgICAweDhkOGQ4ZDhkVSwgMHhkNWQ1ZDVkNVUsIDB4NGU0ZTRlNGVVLCAweGE5YTlhOWE5VSwKKyAgICAgICAgMHg2YzZjNmM2Y1UsIDB4NTY1NjU2NTZVLCAweGY0ZjRmNGY0VSwgMHhlYWVhZWFlYVUsCisgICAgICAgIDB4NjU2NTY1NjVVLCAweDdhN2E3YTdhVSwgMHhhZWFlYWVhZVUsIDB4MDgwODA4MDhVLAorICAgICAgICAweGJhYmFiYWJhVSwgMHg3ODc4Nzg3OFUsIDB4MjUyNTI1MjVVLCAweDJlMmUyZTJlVSwKKyAgICAgICAgMHgxYzFjMWMxY1UsIDB4YTZhNmE2YTZVLCAweGI0YjRiNGI0VSwgMHhjNmM2YzZjNlUsCisgICAgICAgIDB4ZThlOGU4ZThVLCAweGRkZGRkZGRkVSwgMHg3NDc0NzQ3NFUsIDB4MWYxZjFmMWZVLAorICAgICAgICAweDRiNGI0YjRiVSwgMHhiZGJkYmRiZFUsIDB4OGI4YjhiOGJVLCAweDhhOGE4YThhVSwKKyAgICAgICAgMHg3MDcwNzA3MFUsIDB4M2UzZTNlM2VVLCAweGI1YjViNWI1VSwgMHg2NjY2NjY2NlUsCisgICAgICAgIDB4NDg0ODQ4NDhVLCAweDAzMDMwMzAzVSwgMHhmNmY2ZjZmNlUsIDB4MGUwZTBlMGVVLAorICAgICAgICAweDYxNjE2MTYxVSwgMHgzNTM1MzUzNVUsIDB4NTc1NzU3NTdVLCAweGI5YjliOWI5VSwKKyAgICAgICAgMHg4Njg2ODY4NlUsIDB4YzFjMWMxYzFVLCAweDFkMWQxZDFkVSwgMHg5ZTllOWU5ZVUsCisgICAgICAgIDB4ZTFlMWUxZTFVLCAweGY4ZjhmOGY4VSwgMHg5ODk4OTg5OFUsIDB4MTExMTExMTFVLAorICAgICAgICAweDY5Njk2OTY5VSwgMHhkOWQ5ZDlkOVUsIDB4OGU4ZThlOGVVLCAweDk0OTQ5NDk0VSwKKyAgICAgICAgMHg5YjliOWI5YlUsIDB4MWUxZTFlMWVVLCAweDg3ODc4Nzg3VSwgMHhlOWU5ZTllOVUsCisgICAgICAgIDB4Y2VjZWNlY2VVLCAweDU1NTU1NTU1VSwgMHgyODI4MjgyOFUsIDB4ZGZkZmRmZGZVLAorICAgICAgICAweDhjOGM4YzhjVSwgMHhhMWExYTFhMVUsIDB4ODk4OTg5ODlVLCAweDBkMGQwZDBkVSwKKyAgICAgICAgMHhiZmJmYmZiZlUsIDB4ZTZlNmU2ZTZVLCAweDQyNDI0MjQyVSwgMHg2ODY4Njg2OFUsCisgICAgICAgIDB4NDE0MTQxNDFVLCAweDk5OTk5OTk5VSwgMHgyZDJkMmQyZFUsIDB4MGYwZjBmMGZVLAorICAgICAgICAweGIwYjBiMGIwVSwgMHg1NDU0NTQ1NFUsIDB4YmJiYmJiYmJVLCAweDE2MTYxNjE2VSwKK307Citjb25zdCB1aW50MzJfdCBBRVNfVGQwWzI1Nl0gPSB7CisgICAgICAgIDB4NTFmNGE3NTBVLCAweDdlNDE2NTUzVSwgMHgxYTE3YTRjM1UsIDB4M2EyNzVlOTZVLAorICAgICAgICAweDNiYWI2YmNiVSwgMHgxZjlkNDVmMVUsIDB4YWNmYTU4YWJVLCAweDRiZTMwMzkzVSwKKyAgICAgICAgMHgyMDMwZmE1NVUsIDB4YWQ3NjZkZjZVLCAweDg4Y2M3NjkxVSwgMHhmNTAyNGMyNVUsCisgICAgICAgIDB4NGZlNWQ3ZmNVLCAweGM1MmFjYmQ3VSwgMHgyNjM1NDQ4MFUsIDB4YjU2MmEzOGZVLAorICAgICAgICAweGRlYjE1YTQ5VSwgMHgyNWJhMWI2N1UsIDB4NDVlYTBlOThVLCAweDVkZmVjMGUxVSwKKyAgICAgICAgMHhjMzJmNzUwMlUsIDB4ODE0Y2YwMTJVLCAweDhkNDY5N2EzVSwgMHg2YmQzZjljNlUsCisgICAgICAgIDB4MDM4ZjVmZTdVLCAweDE1OTI5Yzk1VSwgMHhiZjZkN2FlYlUsIDB4OTU1MjU5ZGFVLAorICAgICAgICAweGQ0YmU4MzJkVSwgMHg1ODc0MjFkM1UsIDB4NDllMDY5MjlVLCAweDhlYzljODQ0VSwKKyAgICAgICAgMHg3NWMyODk2YVUsIDB4ZjQ4ZTc5NzhVLCAweDk5NTgzZTZiVSwgMHgyN2I5NzFkZFUsCisgICAgICAgIDB4YmVlMTRmYjZVLCAweGYwODhhZDE3VSwgMHhjOTIwYWM2NlUsIDB4N2RjZTNhYjRVLAorICAgICAgICAweDYzZGY0YTE4VSwgMHhlNTFhMzE4MlUsIDB4OTc1MTMzNjBVLCAweDYyNTM3ZjQ1VSwKKyAgICAgICAgMHhiMTY0NzdlMFUsIDB4YmI2YmFlODRVLCAweGZlODFhMDFjVSwgMHhmOTA4MmI5NFUsCisgICAgICAgIDB4NzA0ODY4NThVLCAweDhmNDVmZDE5VSwgMHg5NGRlNmM4N1UsIDB4NTI3YmY4YjdVLAorICAgICAgICAweGFiNzNkMzIzVSwgMHg3MjRiMDJlMlUsIDB4ZTMxZjhmNTdVLCAweDY2NTVhYjJhVSwKKyAgICAgICAgMHhiMmViMjgwN1UsIDB4MmZiNWMyMDNVLCAweDg2YzU3YjlhVSwgMHhkMzM3MDhhNVUsCisgICAgICAgIDB4MzAyODg3ZjJVLCAweDIzYmZhNWIyVSwgMHgwMjAzNmFiYVUsIDB4ZWQxNjgyNWNVLAorICAgICAgICAweDhhY2YxYzJiVSwgMHhhNzc5YjQ5MlUsIDB4ZjMwN2YyZjBVLCAweDRlNjllMmExVSwKKyAgICAgICAgMHg2NWRhZjRjZFUsIDB4MDYwNWJlZDVVLCAweGQxMzQ2MjFmVSwgMHhjNGE2ZmU4YVUsCisgICAgICAgIDB4MzQyZTUzOWRVLCAweGEyZjM1NWEwVSwgMHgwNThhZTEzMlUsIDB4YTRmNmViNzVVLAorICAgICAgICAweDBiODNlYzM5VSwgMHg0MDYwZWZhYVUsIDB4NWU3MTlmMDZVLCAweGJkNmUxMDUxVSwKKyAgICAgICAgMHgzZTIxOGFmOVUsIDB4OTZkZDA2M2RVLCAweGRkM2UwNWFlVSwgMHg0ZGU2YmQ0NlUsCisgICAgICAgIDB4OTE1NDhkYjVVLCAweDcxYzQ1ZDA1VSwgMHgwNDA2ZDQ2ZlUsIDB4NjA1MDE1ZmZVLAorICAgICAgICAweDE5OThmYjI0VSwgMHhkNmJkZTk5N1UsIDB4ODk0MDQzY2NVLCAweDY3ZDk5ZTc3VSwKKyAgICAgICAgMHhiMGU4NDJiZFUsIDB4MDc4OThiODhVLCAweGU3MTk1YjM4VSwgMHg3OWM4ZWVkYlUsCisgICAgICAgIDB4YTE3YzBhNDdVLCAweDdjNDIwZmU5VSwgMHhmODg0MWVjOVUsIDB4MDAwMDAwMDBVLAorICAgICAgICAweDA5ODA4NjgzVSwgMHgzMjJiZWQ0OFUsIDB4MWUxMTcwYWNVLCAweDZjNWE3MjRlVSwKKyAgICAgICAgMHhmZDBlZmZmYlUsIDB4MGY4NTM4NTZVLCAweDNkYWVkNTFlVSwgMHgzNjJkMzkyN1UsCisgICAgICAgIDB4MGEwZmQ5NjRVLCAweDY4NWNhNjIxVSwgMHg5YjViNTRkMVUsIDB4MjQzNjJlM2FVLAorICAgICAgICAweDBjMGE2N2IxVSwgMHg5MzU3ZTcwZlUsIDB4YjRlZTk2ZDJVLCAweDFiOWI5MTllVSwKKyAgICAgICAgMHg4MGMwYzU0ZlUsIDB4NjFkYzIwYTJVLCAweDVhNzc0YjY5VSwgMHgxYzEyMWExNlUsCisgICAgICAgIDB4ZTI5M2JhMGFVLCAweGMwYTAyYWU1VSwgMHgzYzIyZTA0M1UsIDB4MTIxYjE3MWRVLAorICAgICAgICAweDBlMDkwZDBiVSwgMHhmMjhiYzdhZFUsIDB4MmRiNmE4YjlVLCAweDE0MWVhOWM4VSwKKyAgICAgICAgMHg1N2YxMTk4NVUsIDB4YWY3NTA3NGNVLCAweGVlOTlkZGJiVSwgMHhhMzdmNjBmZFUsCisgICAgICAgIDB4ZjcwMTI2OWZVLCAweDVjNzJmNWJjVSwgMHg0NDY2M2JjNVUsIDB4NWJmYjdlMzRVLAorICAgICAgICAweDhiNDMyOTc2VSwgMHhjYjIzYzZkY1UsIDB4YjZlZGZjNjhVLCAweGI4ZTRmMTYzVSwKKyAgICAgICAgMHhkNzMxZGNjYVUsIDB4NDI2Mzg1MTBVLCAweDEzOTcyMjQwVSwgMHg4NGM2MTEyMFUsCisgICAgICAgIDB4ODU0YTI0N2RVLCAweGQyYmIzZGY4VSwgMHhhZWY5MzIxMVUsIDB4YzcyOWExNmRVLAorICAgICAgICAweDFkOWUyZjRiVSwgMHhkY2IyMzBmM1UsIDB4MGQ4NjUyZWNVLCAweDc3YzFlM2QwVSwKKyAgICAgICAgMHgyYmIzMTY2Y1UsIDB4YTk3MGI5OTlVLCAweDExOTQ0OGZhVSwgMHg0N2U5NjQyMlUsCisgICAgICAgIDB4YThmYzhjYzRVLCAweGEwZjAzZjFhVSwgMHg1NjdkMmNkOFUsIDB4MjIzMzkwZWZVLAorICAgICAgICAweDg3NDk0ZWM3VSwgMHhkOTM4ZDFjMVUsIDB4OGNjYWEyZmVVLCAweDk4ZDQwYjM2VSwKKyAgICAgICAgMHhhNmY1ODFjZlUsIDB4YTU3YWRlMjhVLCAweGRhYjc4ZTI2VSwgMHgzZmFkYmZhNFUsCisgICAgICAgIDB4MmMzYTlkZTRVLCAweDUwNzg5MjBkVSwgMHg2YTVmY2M5YlUsIDB4NTQ3ZTQ2NjJVLAorICAgICAgICAweGY2OGQxM2MyVSwgMHg5MGQ4YjhlOFUsIDB4MmUzOWY3NWVVLCAweDgyYzNhZmY1VSwKKyAgICAgICAgMHg5ZjVkODBiZVUsIDB4NjlkMDkzN2NVLCAweDZmZDUyZGE5VSwgMHhjZjI1MTJiM1UsCisgICAgICAgIDB4YzhhYzk5M2JVLCAweDEwMTg3ZGE3VSwgMHhlODljNjM2ZVUsIDB4ZGIzYmJiN2JVLAorICAgICAgICAweGNkMjY3ODA5VSwgMHg2ZTU5MThmNFUsIDB4ZWM5YWI3MDFVLCAweDgzNGY5YWE4VSwKKyAgICAgICAgMHhlNjk1NmU2NVUsIDB4YWFmZmU2N2VVLCAweDIxYmNjZjA4VSwgMHhlZjE1ZThlNlUsCisgICAgICAgIDB4YmFlNzliZDlVLCAweDRhNmYzNmNlVSwgMHhlYTlmMDlkNFUsIDB4MjliMDdjZDZVLAorICAgICAgICAweDMxYTRiMmFmVSwgMHgyYTNmMjMzMVUsIDB4YzZhNTk0MzBVLCAweDM1YTI2NmMwVSwKKyAgICAgICAgMHg3NDRlYmMzN1UsIDB4ZmM4MmNhYTZVLCAweGUwOTBkMGIwVSwgMHgzM2E3ZDgxNVUsCisgICAgICAgIDB4ZjEwNDk4NGFVLCAweDQxZWNkYWY3VSwgMHg3ZmNkNTAwZVUsIDB4MTc5MWY2MmZVLAorICAgICAgICAweDc2NGRkNjhkVSwgMHg0M2VmYjA0ZFUsIDB4Y2NhYTRkNTRVLCAweGU0OTYwNGRmVSwKKyAgICAgICAgMHg5ZWQxYjVlM1UsIDB4NGM2YTg4MWJVLCAweGMxMmMxZmI4VSwgMHg0NjY1NTE3ZlUsCisgICAgICAgIDB4OWQ1ZWVhMDRVLCAweDAxOGMzNTVkVSwgMHhmYTg3NzQ3M1UsIDB4ZmIwYjQxMmVVLAorICAgICAgICAweGIzNjcxZDVhVSwgMHg5MmRiZDI1MlUsIDB4ZTkxMDU2MzNVLCAweDZkZDY0NzEzVSwKKyAgICAgICAgMHg5YWQ3NjE4Y1UsIDB4MzdhMTBjN2FVLCAweDU5ZjgxNDhlVSwgMHhlYjEzM2M4OVUsCisgICAgICAgIDB4Y2VhOTI3ZWVVLCAweGI3NjFjOTM1VSwgMHhlMTFjZTVlZFUsIDB4N2E0N2IxM2NVLAorICAgICAgICAweDljZDJkZjU5VSwgMHg1NWYyNzMzZlUsIDB4MTgxNGNlNzlVLCAweDczYzczN2JmVSwKKyAgICAgICAgMHg1M2Y3Y2RlYVUsIDB4NWZmZGFhNWJVLCAweGRmM2Q2ZjE0VSwgMHg3ODQ0ZGI4NlUsCisgICAgICAgIDB4Y2FhZmYzODFVLCAweGI5NjhjNDNlVSwgMHgzODI0MzQyY1UsIDB4YzJhMzQwNWZVLAorICAgICAgICAweDE2MWRjMzcyVSwgMHhiY2UyMjUwY1UsIDB4MjgzYzQ5OGJVLCAweGZmMGQ5NTQxVSwKKyAgICAgICAgMHgzOWE4MDE3MVUsIDB4MDgwY2IzZGVVLCAweGQ4YjRlNDljVSwgMHg2NDU2YzE5MFUsCisgICAgICAgIDB4N2JjYjg0NjFVLCAweGQ1MzJiNjcwVSwgMHg0ODZjNWM3NFUsIDB4ZDBiODU3NDJVLAorfTsKK2NvbnN0IHVpbnQzMl90IEFFU19UZDFbMjU2XSA9IHsKKyAgICAgICAgMHg1MDUxZjRhN1UsIDB4NTM3ZTQxNjVVLCAweGMzMWExN2E0VSwgMHg5NjNhMjc1ZVUsCisgICAgICAgIDB4Y2IzYmFiNmJVLCAweGYxMWY5ZDQ1VSwgMHhhYmFjZmE1OFUsIDB4OTM0YmUzMDNVLAorICAgICAgICAweDU1MjAzMGZhVSwgMHhmNmFkNzY2ZFUsIDB4OTE4OGNjNzZVLCAweDI1ZjUwMjRjVSwKKyAgICAgICAgMHhmYzRmZTVkN1UsIDB4ZDdjNTJhY2JVLCAweDgwMjYzNTQ0VSwgMHg4ZmI1NjJhM1UsCisgICAgICAgIDB4NDlkZWIxNWFVLCAweDY3MjViYTFiVSwgMHg5ODQ1ZWEwZVUsIDB4ZTE1ZGZlYzBVLAorICAgICAgICAweDAyYzMyZjc1VSwgMHgxMjgxNGNmMFUsIDB4YTM4ZDQ2OTdVLCAweGM2NmJkM2Y5VSwKKyAgICAgICAgMHhlNzAzOGY1ZlUsIDB4OTUxNTkyOWNVLCAweGViYmY2ZDdhVSwgMHhkYTk1NTI1OVUsCisgICAgICAgIDB4MmRkNGJlODNVLCAweGQzNTg3NDIxVSwgMHgyOTQ5ZTA2OVUsIDB4NDQ4ZWM5YzhVLAorICAgICAgICAweDZhNzVjMjg5VSwgMHg3OGY0OGU3OVUsIDB4NmI5OTU4M2VVLCAweGRkMjdiOTcxVSwKKyAgICAgICAgMHhiNmJlZTE0ZlUsIDB4MTdmMDg4YWRVLCAweDY2YzkyMGFjVSwgMHhiNDdkY2UzYVUsCisgICAgICAgIDB4MTg2M2RmNGFVLCAweDgyZTUxYTMxVSwgMHg2MDk3NTEzM1UsIDB4NDU2MjUzN2ZVLAorICAgICAgICAweGUwYjE2NDc3VSwgMHg4NGJiNmJhZVUsIDB4MWNmZTgxYTBVLCAweDk0ZjkwODJiVSwKKyAgICAgICAgMHg1ODcwNDg2OFUsIDB4MTk4ZjQ1ZmRVLCAweDg3OTRkZTZjVSwgMHhiNzUyN2JmOFUsCisgICAgICAgIDB4MjNhYjczZDNVLCAweGUyNzI0YjAyVSwgMHg1N2UzMWY4ZlUsIDB4MmE2NjU1YWJVLAorICAgICAgICAweDA3YjJlYjI4VSwgMHgwMzJmYjVjMlUsIDB4OWE4NmM1N2JVLCAweGE1ZDMzNzA4VSwKKyAgICAgICAgMHhmMjMwMjg4N1UsIDB4YjIyM2JmYTVVLCAweGJhMDIwMzZhVSwgMHg1Y2VkMTY4MlUsCisgICAgICAgIDB4MmI4YWNmMWNVLCAweDkyYTc3OWI0VSwgMHhmMGYzMDdmMlUsIDB4YTE0ZTY5ZTJVLAorICAgICAgICAweGNkNjVkYWY0VSwgMHhkNTA2MDViZVUsIDB4MWZkMTM0NjJVLCAweDhhYzRhNmZlVSwKKyAgICAgICAgMHg5ZDM0MmU1M1UsIDB4YTBhMmYzNTVVLCAweDMyMDU4YWUxVSwgMHg3NWE0ZjZlYlUsCisgICAgICAgIDB4MzkwYjgzZWNVLCAweGFhNDA2MGVmVSwgMHgwNjVlNzE5ZlUsIDB4NTFiZDZlMTBVLAorICAgICAgICAweGY5M2UyMThhVSwgMHgzZDk2ZGQwNlUsIDB4YWVkZDNlMDVVLCAweDQ2NGRlNmJkVSwKKyAgICAgICAgMHhiNTkxNTQ4ZFUsIDB4MDU3MWM0NWRVLCAweDZmMDQwNmQ0VSwgMHhmZjYwNTAxNVUsCisgICAgICAgIDB4MjQxOTk4ZmJVLCAweDk3ZDZiZGU5VSwgMHhjYzg5NDA0M1UsIDB4Nzc2N2Q5OWVVLAorICAgICAgICAweGJkYjBlODQyVSwgMHg4ODA3ODk4YlUsIDB4MzhlNzE5NWJVLCAweGRiNzljOGVlVSwKKyAgICAgICAgMHg0N2ExN2MwYVUsIDB4ZTk3YzQyMGZVLCAweGM5Zjg4NDFlVSwgMHgwMDAwMDAwMFUsCisgICAgICAgIDB4ODMwOTgwODZVLCAweDQ4MzIyYmVkVSwgMHhhYzFlMTE3MFUsIDB4NGU2YzVhNzJVLAorICAgICAgICAweGZiZmQwZWZmVSwgMHg1NjBmODUzOFUsIDB4MWUzZGFlZDVVLCAweDI3MzYyZDM5VSwKKyAgICAgICAgMHg2NDBhMGZkOVUsIDB4MjE2ODVjYTZVLCAweGQxOWI1YjU0VSwgMHgzYTI0MzYyZVUsCisgICAgICAgIDB4YjEwYzBhNjdVLCAweDBmOTM1N2U3VSwgMHhkMmI0ZWU5NlUsIDB4OWUxYjliOTFVLAorICAgICAgICAweDRmODBjMGM1VSwgMHhhMjYxZGMyMFUsIDB4Njk1YTc3NGJVLCAweDE2MWMxMjFhVSwKKyAgICAgICAgMHgwYWUyOTNiYVUsIDB4ZTVjMGEwMmFVLCAweDQzM2MyMmUwVSwgMHgxZDEyMWIxN1UsCisgICAgICAgIDB4MGIwZTA5MGRVLCAweGFkZjI4YmM3VSwgMHhiOTJkYjZhOFUsIDB4YzgxNDFlYTlVLAorICAgICAgICAweDg1NTdmMTE5VSwgMHg0Y2FmNzUwN1UsIDB4YmJlZTk5ZGRVLCAweGZkYTM3ZjYwVSwKKyAgICAgICAgMHg5ZmY3MDEyNlUsIDB4YmM1YzcyZjVVLCAweGM1NDQ2NjNiVSwgMHgzNDViZmI3ZVUsCisgICAgICAgIDB4NzY4YjQzMjlVLCAweGRjY2IyM2M2VSwgMHg2OGI2ZWRmY1UsIDB4NjNiOGU0ZjFVLAorICAgICAgICAweGNhZDczMWRjVSwgMHgxMDQyNjM4NVUsIDB4NDAxMzk3MjJVLCAweDIwODRjNjExVSwKKyAgICAgICAgMHg3ZDg1NGEyNFUsIDB4ZjhkMmJiM2RVLCAweDExYWVmOTMyVSwgMHg2ZGM3MjlhMVUsCisgICAgICAgIDB4NGIxZDllMmZVLCAweGYzZGNiMjMwVSwgMHhlYzBkODY1MlUsIDB4ZDA3N2MxZTNVLAorICAgICAgICAweDZjMmJiMzE2VSwgMHg5OWE5NzBiOVUsIDB4ZmExMTk0NDhVLCAweDIyNDdlOTY0VSwKKyAgICAgICAgMHhjNGE4ZmM4Y1UsIDB4MWFhMGYwM2ZVLCAweGQ4NTY3ZDJjVSwgMHhlZjIyMzM5MFUsCisgICAgICAgIDB4Yzc4NzQ5NGVVLCAweGMxZDkzOGQxVSwgMHhmZThjY2FhMlUsIDB4MzY5OGQ0MGJVLAorICAgICAgICAweGNmYTZmNTgxVSwgMHgyOGE1N2FkZVUsIDB4MjZkYWI3OGVVLCAweGE0M2ZhZGJmVSwKKyAgICAgICAgMHhlNDJjM2E5ZFUsIDB4MGQ1MDc4OTJVLCAweDliNmE1ZmNjVSwgMHg2MjU0N2U0NlUsCisgICAgICAgIDB4YzJmNjhkMTNVLCAweGU4OTBkOGI4VSwgMHg1ZTJlMzlmN1UsIDB4ZjU4MmMzYWZVLAorICAgICAgICAweGJlOWY1ZDgwVSwgMHg3YzY5ZDA5M1UsIDB4YTk2ZmQ1MmRVLCAweGIzY2YyNTEyVSwKKyAgICAgICAgMHgzYmM4YWM5OVUsIDB4YTcxMDE4N2RVLCAweDZlZTg5YzYzVSwgMHg3YmRiM2JiYlUsCisgICAgICAgIDB4MDljZDI2NzhVLCAweGY0NmU1OTE4VSwgMHgwMWVjOWFiN1UsIDB4YTg4MzRmOWFVLAorICAgICAgICAweDY1ZTY5NTZlVSwgMHg3ZWFhZmZlNlUsIDB4MDgyMWJjY2ZVLCAweGU2ZWYxNWU4VSwKKyAgICAgICAgMHhkOWJhZTc5YlUsIDB4Y2U0YTZmMzZVLCAweGQ0ZWE5ZjA5VSwgMHhkNjI5YjA3Y1UsCisgICAgICAgIDB4YWYzMWE0YjJVLCAweDMxMmEzZjIzVSwgMHgzMGM2YTU5NFUsIDB4YzAzNWEyNjZVLAorICAgICAgICAweDM3NzQ0ZWJjVSwgMHhhNmZjODJjYVUsIDB4YjBlMDkwZDBVLCAweDE1MzNhN2Q4VSwKKyAgICAgICAgMHg0YWYxMDQ5OFUsIDB4Zjc0MWVjZGFVLCAweDBlN2ZjZDUwVSwgMHgyZjE3OTFmNlUsCisgICAgICAgIDB4OGQ3NjRkZDZVLCAweDRkNDNlZmIwVSwgMHg1NGNjYWE0ZFUsIDB4ZGZlNDk2MDRVLAorICAgICAgICAweGUzOWVkMWI1VSwgMHgxYjRjNmE4OFUsIDB4YjhjMTJjMWZVLCAweDdmNDY2NTUxVSwKKyAgICAgICAgMHgwNDlkNWVlYVUsIDB4NWQwMThjMzVVLCAweDczZmE4Nzc0VSwgMHgyZWZiMGI0MVUsCisgICAgICAgIDB4NWFiMzY3MWRVLCAweDUyOTJkYmQyVSwgMHgzM2U5MTA1NlUsIDB4MTM2ZGQ2NDdVLAorICAgICAgICAweDhjOWFkNzYxVSwgMHg3YTM3YTEwY1UsIDB4OGU1OWY4MTRVLCAweDg5ZWIxMzNjVSwKKyAgICAgICAgMHhlZWNlYTkyN1UsIDB4MzViNzYxYzlVLCAweGVkZTExY2U1VSwgMHgzYzdhNDdiMVUsCisgICAgICAgIDB4NTk5Y2QyZGZVLCAweDNmNTVmMjczVSwgMHg3OTE4MTRjZVUsIDB4YmY3M2M3MzdVLAorICAgICAgICAweGVhNTNmN2NkVSwgMHg1YjVmZmRhYVUsIDB4MTRkZjNkNmZVLCAweDg2Nzg0NGRiVSwKKyAgICAgICAgMHg4MWNhYWZmM1UsIDB4M2ViOTY4YzRVLCAweDJjMzgyNDM0VSwgMHg1ZmMyYTM0MFUsCisgICAgICAgIDB4NzIxNjFkYzNVLCAweDBjYmNlMjI1VSwgMHg4YjI4M2M0OVUsIDB4NDFmZjBkOTVVLAorICAgICAgICAweDcxMzlhODAxVSwgMHhkZTA4MGNiM1UsIDB4OWNkOGI0ZTRVLCAweDkwNjQ1NmMxVSwKKyAgICAgICAgMHg2MTdiY2I4NFUsIDB4NzBkNTMyYjZVLCAweDc0NDg2YzVjVSwgMHg0MmQwYjg1N1UsCit9OworY29uc3QgdWludDMyX3QgQUVTX1RkMlsyNTZdID0geworICAgICAgICAweGE3NTA1MWY0VSwgMHg2NTUzN2U0MVUsIDB4YTRjMzFhMTdVLCAweDVlOTYzYTI3VSwKKyAgICAgICAgMHg2YmNiM2JhYlUsIDB4NDVmMTFmOWRVLCAweDU4YWJhY2ZhVSwgMHgwMzkzNGJlM1UsCisgICAgICAgIDB4ZmE1NTIwMzBVLCAweDZkZjZhZDc2VSwgMHg3NjkxODhjY1UsIDB4NGMyNWY1MDJVLAorICAgICAgICAweGQ3ZmM0ZmU1VSwgMHhjYmQ3YzUyYVUsIDB4NDQ4MDI2MzVVLCAweGEzOGZiNTYyVSwKKyAgICAgICAgMHg1YTQ5ZGViMVUsIDB4MWI2NzI1YmFVLCAweDBlOTg0NWVhVSwgMHhjMGUxNWRmZVUsCisgICAgICAgIDB4NzUwMmMzMmZVLCAweGYwMTI4MTRjVSwgMHg5N2EzOGQ0NlUsIDB4ZjljNjZiZDNVLAorICAgICAgICAweDVmZTcwMzhmVSwgMHg5Yzk1MTU5MlUsIDB4N2FlYmJmNmRVLCAweDU5ZGE5NTUyVSwKKyAgICAgICAgMHg4MzJkZDRiZVUsIDB4MjFkMzU4NzRVLCAweDY5Mjk0OWUwVSwgMHhjODQ0OGVjOVUsCisgICAgICAgIDB4ODk2YTc1YzJVLCAweDc5NzhmNDhlVSwgMHgzZTZiOTk1OFUsIDB4NzFkZDI3YjlVLAorICAgICAgICAweDRmYjZiZWUxVSwgMHhhZDE3ZjA4OFUsIDB4YWM2NmM5MjBVLCAweDNhYjQ3ZGNlVSwKKyAgICAgICAgMHg0YTE4NjNkZlUsIDB4MzE4MmU1MWFVLCAweDMzNjA5NzUxVSwgMHg3ZjQ1NjI1M1UsCisgICAgICAgIDB4NzdlMGIxNjRVLCAweGFlODRiYjZiVSwgMHhhMDFjZmU4MVUsIDB4MmI5NGY5MDhVLAorICAgICAgICAweDY4NTg3MDQ4VSwgMHhmZDE5OGY0NVUsIDB4NmM4Nzk0ZGVVLCAweGY4Yjc1MjdiVSwKKyAgICAgICAgMHhkMzIzYWI3M1UsIDB4MDJlMjcyNGJVLCAweDhmNTdlMzFmVSwgMHhhYjJhNjY1NVUsCisgICAgICAgIDB4MjgwN2IyZWJVLCAweGMyMDMyZmI1VSwgMHg3YjlhODZjNVUsIDB4MDhhNWQzMzdVLAorICAgICAgICAweDg3ZjIzMDI4VSwgMHhhNWIyMjNiZlUsIDB4NmFiYTAyMDNVLCAweDgyNWNlZDE2VSwKKyAgICAgICAgMHgxYzJiOGFjZlUsIDB4YjQ5MmE3NzlVLCAweGYyZjBmMzA3VSwgMHhlMmExNGU2OVUsCisgICAgICAgIDB4ZjRjZDY1ZGFVLCAweGJlZDUwNjA1VSwgMHg2MjFmZDEzNFUsIDB4ZmU4YWM0YTZVLAorICAgICAgICAweDUzOWQzNDJlVSwgMHg1NWEwYTJmM1UsIDB4ZTEzMjA1OGFVLCAweGViNzVhNGY2VSwKKyAgICAgICAgMHhlYzM5MGI4M1UsIDB4ZWZhYTQwNjBVLCAweDlmMDY1ZTcxVSwgMHgxMDUxYmQ2ZVUsCisKKyAgICAgICAgMHg4YWY5M2UyMVUsIDB4MDYzZDk2ZGRVLCAweDA1YWVkZDNlVSwgMHhiZDQ2NGRlNlUsCisgICAgICAgIDB4OGRiNTkxNTRVLCAweDVkMDU3MWM0VSwgMHhkNDZmMDQwNlUsIDB4MTVmZjYwNTBVLAorICAgICAgICAweGZiMjQxOTk4VSwgMHhlOTk3ZDZiZFUsIDB4NDNjYzg5NDBVLCAweDllNzc2N2Q5VSwKKyAgICAgICAgMHg0MmJkYjBlOFUsIDB4OGI4ODA3ODlVLCAweDViMzhlNzE5VSwgMHhlZWRiNzljOFUsCisgICAgICAgIDB4MGE0N2ExN2NVLCAweDBmZTk3YzQyVSwgMHgxZWM5Zjg4NFUsIDB4MDAwMDAwMDBVLAorICAgICAgICAweDg2ODMwOTgwVSwgMHhlZDQ4MzIyYlUsIDB4NzBhYzFlMTFVLCAweDcyNGU2YzVhVSwKKyAgICAgICAgMHhmZmZiZmQwZVUsIDB4Mzg1NjBmODVVLCAweGQ1MWUzZGFlVSwgMHgzOTI3MzYyZFUsCisgICAgICAgIDB4ZDk2NDBhMGZVLCAweGE2MjE2ODVjVSwgMHg1NGQxOWI1YlUsIDB4MmUzYTI0MzZVLAorICAgICAgICAweDY3YjEwYzBhVSwgMHhlNzBmOTM1N1UsIDB4OTZkMmI0ZWVVLCAweDkxOWUxYjliVSwKKyAgICAgICAgMHhjNTRmODBjMFUsIDB4MjBhMjYxZGNVLCAweDRiNjk1YTc3VSwgMHgxYTE2MWMxMlUsCisgICAgICAgIDB4YmEwYWUyOTNVLCAweDJhZTVjMGEwVSwgMHhlMDQzM2MyMlUsIDB4MTcxZDEyMWJVLAorICAgICAgICAweDBkMGIwZTA5VSwgMHhjN2FkZjI4YlUsIDB4YThiOTJkYjZVLCAweGE5YzgxNDFlVSwKKyAgICAgICAgMHgxOTg1NTdmMVUsIDB4MDc0Y2FmNzVVLCAweGRkYmJlZTk5VSwgMHg2MGZkYTM3ZlUsCisgICAgICAgIDB4MjY5ZmY3MDFVLCAweGY1YmM1YzcyVSwgMHgzYmM1NDQ2NlUsIDB4N2UzNDViZmJVLAorICAgICAgICAweDI5NzY4YjQzVSwgMHhjNmRjY2IyM1UsIDB4ZmM2OGI2ZWRVLCAweGYxNjNiOGU0VSwKKyAgICAgICAgMHhkY2NhZDczMVUsIDB4ODUxMDQyNjNVLCAweDIyNDAxMzk3VSwgMHgxMTIwODRjNlUsCisgICAgICAgIDB4MjQ3ZDg1NGFVLCAweDNkZjhkMmJiVSwgMHgzMjExYWVmOVUsIDB4YTE2ZGM3MjlVLAorICAgICAgICAweDJmNGIxZDllVSwgMHgzMGYzZGNiMlUsIDB4NTJlYzBkODZVLCAweGUzZDA3N2MxVSwKKyAgICAgICAgMHgxNjZjMmJiM1UsIDB4Yjk5OWE5NzBVLCAweDQ4ZmExMTk0VSwgMHg2NDIyNDdlOVUsCisgICAgICAgIDB4OGNjNGE4ZmNVLCAweDNmMWFhMGYwVSwgMHgyY2Q4NTY3ZFUsIDB4OTBlZjIyMzNVLAorICAgICAgICAweDRlYzc4NzQ5VSwgMHhkMWMxZDkzOFUsIDB4YTJmZThjY2FVLCAweDBiMzY5OGQ0VSwKKyAgICAgICAgMHg4MWNmYTZmNVUsIDB4ZGUyOGE1N2FVLCAweDhlMjZkYWI3VSwgMHhiZmE0M2ZhZFUsCisgICAgICAgIDB4OWRlNDJjM2FVLCAweDkyMGQ1MDc4VSwgMHhjYzliNmE1ZlUsIDB4NDY2MjU0N2VVLAorICAgICAgICAweDEzYzJmNjhkVSwgMHhiOGU4OTBkOFUsIDB4Zjc1ZTJlMzlVLCAweGFmZjU4MmMzVSwKKyAgICAgICAgMHg4MGJlOWY1ZFUsIDB4OTM3YzY5ZDBVLCAweDJkYTk2ZmQ1VSwgMHgxMmIzY2YyNVUsCisgICAgICAgIDB4OTkzYmM4YWNVLCAweDdkYTcxMDE4VSwgMHg2MzZlZTg5Y1UsIDB4YmI3YmRiM2JVLAorICAgICAgICAweDc4MDljZDI2VSwgMHgxOGY0NmU1OVUsIDB4YjcwMWVjOWFVLCAweDlhYTg4MzRmVSwKKyAgICAgICAgMHg2ZTY1ZTY5NVUsIDB4ZTY3ZWFhZmZVLCAweGNmMDgyMWJjVSwgMHhlOGU2ZWYxNVUsCisgICAgICAgIDB4OWJkOWJhZTdVLCAweDM2Y2U0YTZmVSwgMHgwOWQ0ZWE5ZlUsIDB4N2NkNjI5YjBVLAorICAgICAgICAweGIyYWYzMWE0VSwgMHgyMzMxMmEzZlUsIDB4OTQzMGM2YTVVLCAweDY2YzAzNWEyVSwKKyAgICAgICAgMHhiYzM3NzQ0ZVUsIDB4Y2FhNmZjODJVLCAweGQwYjBlMDkwVSwgMHhkODE1MzNhN1UsCisgICAgICAgIDB4OTg0YWYxMDRVLCAweGRhZjc0MWVjVSwgMHg1MDBlN2ZjZFUsIDB4ZjYyZjE3OTFVLAorICAgICAgICAweGQ2OGQ3NjRkVSwgMHhiMDRkNDNlZlUsIDB4NGQ1NGNjYWFVLCAweDA0ZGZlNDk2VSwKKyAgICAgICAgMHhiNWUzOWVkMVUsIDB4ODgxYjRjNmFVLCAweDFmYjhjMTJjVSwgMHg1MTdmNDY2NVUsCisgICAgICAgIDB4ZWEwNDlkNWVVLCAweDM1NWQwMThjVSwgMHg3NDczZmE4N1UsIDB4NDEyZWZiMGJVLAorICAgICAgICAweDFkNWFiMzY3VSwgMHhkMjUyOTJkYlUsIDB4NTYzM2U5MTBVLCAweDQ3MTM2ZGQ2VSwKKyAgICAgICAgMHg2MThjOWFkN1UsIDB4MGM3YTM3YTFVLCAweDE0OGU1OWY4VSwgMHgzYzg5ZWIxM1UsCisgICAgICAgIDB4MjdlZWNlYTlVLCAweGM5MzViNzYxVSwgMHhlNWVkZTExY1UsIDB4YjEzYzdhNDdVLAorICAgICAgICAweGRmNTk5Y2QyVSwgMHg3MzNmNTVmMlUsIDB4Y2U3OTE4MTRVLCAweDM3YmY3M2M3VSwKKyAgICAgICAgMHhjZGVhNTNmN1UsIDB4YWE1YjVmZmRVLCAweDZmMTRkZjNkVSwgMHhkYjg2Nzg0NFUsCisgICAgICAgIDB4ZjM4MWNhYWZVLCAweGM0M2ViOTY4VSwgMHgzNDJjMzgyNFUsIDB4NDA1ZmMyYTNVLAorICAgICAgICAweGMzNzIxNjFkVSwgMHgyNTBjYmNlMlUsIDB4NDk4YjI4M2NVLCAweDk1NDFmZjBkVSwKKyAgICAgICAgMHgwMTcxMzlhOFUsIDB4YjNkZTA4MGNVLCAweGU0OWNkOGI0VSwgMHhjMTkwNjQ1NlUsCisgICAgICAgIDB4ODQ2MTdiY2JVLCAweGI2NzBkNTMyVSwgMHg1Yzc0NDg2Y1UsIDB4NTc0MmQwYjhVLAorfTsKK2NvbnN0IHVpbnQzMl90IEFFU19UZDNbMjU2XSA9IHsKKyAgICAgICAgMHhmNGE3NTA1MVUsIDB4NDE2NTUzN2VVLCAweDE3YTRjMzFhVSwgMHgyNzVlOTYzYVUsCisgICAgICAgIDB4YWI2YmNiM2JVLCAweDlkNDVmMTFmVSwgMHhmYTU4YWJhY1UsIDB4ZTMwMzkzNGJVLAorICAgICAgICAweDMwZmE1NTIwVSwgMHg3NjZkZjZhZFUsIDB4Y2M3NjkxODhVLCAweDAyNGMyNWY1VSwKKyAgICAgICAgMHhlNWQ3ZmM0ZlUsIDB4MmFjYmQ3YzVVLCAweDM1NDQ4MDI2VSwgMHg2MmEzOGZiNVUsCisgICAgICAgIDB4YjE1YTQ5ZGVVLCAweGJhMWI2NzI1VSwgMHhlYTBlOTg0NVUsIDB4ZmVjMGUxNWRVLAorICAgICAgICAweDJmNzUwMmMzVSwgMHg0Y2YwMTI4MVUsIDB4NDY5N2EzOGRVLCAweGQzZjljNjZiVSwKKyAgICAgICAgMHg4ZjVmZTcwM1UsIDB4OTI5Yzk1MTVVLCAweDZkN2FlYmJmVSwgMHg1MjU5ZGE5NVUsCisgICAgICAgIDB4YmU4MzJkZDRVLCAweDc0MjFkMzU4VSwgMHhlMDY5Mjk0OVUsIDB4YzljODQ0OGVVLAorICAgICAgICAweGMyODk2YTc1VSwgMHg4ZTc5NzhmNFUsIDB4NTgzZTZiOTlVLCAweGI5NzFkZDI3VSwKKyAgICAgICAgMHhlMTRmYjZiZVUsIDB4ODhhZDE3ZjBVLCAweDIwYWM2NmM5VSwgMHhjZTNhYjQ3ZFUsCisgICAgICAgIDB4ZGY0YTE4NjNVLCAweDFhMzE4MmU1VSwgMHg1MTMzNjA5N1UsIDB4NTM3ZjQ1NjJVLAorICAgICAgICAweDY0NzdlMGIxVSwgMHg2YmFlODRiYlUsIDB4ODFhMDFjZmVVLCAweDA4MmI5NGY5VSwKKyAgICAgICAgMHg0ODY4NTg3MFUsIDB4NDVmZDE5OGZVLCAweGRlNmM4Nzk0VSwgMHg3YmY4Yjc1MlUsCisgICAgICAgIDB4NzNkMzIzYWJVLCAweDRiMDJlMjcyVSwgMHgxZjhmNTdlM1UsIDB4NTVhYjJhNjZVLAorICAgICAgICAweGViMjgwN2IyVSwgMHhiNWMyMDMyZlUsIDB4YzU3YjlhODZVLCAweDM3MDhhNWQzVSwKKyAgICAgICAgMHgyODg3ZjIzMFUsIDB4YmZhNWIyMjNVLCAweDAzNmFiYTAyVSwgMHgxNjgyNWNlZFUsCisgICAgICAgIDB4Y2YxYzJiOGFVLCAweDc5YjQ5MmE3VSwgMHgwN2YyZjBmM1UsIDB4NjllMmExNGVVLAorICAgICAgICAweGRhZjRjZDY1VSwgMHgwNWJlZDUwNlUsIDB4MzQ2MjFmZDFVLCAweGE2ZmU4YWM0VSwKKyAgICAgICAgMHgyZTUzOWQzNFUsIDB4ZjM1NWEwYTJVLCAweDhhZTEzMjA1VSwgMHhmNmViNzVhNFUsCisgICAgICAgIDB4ODNlYzM5MGJVLCAweDYwZWZhYTQwVSwgMHg3MTlmMDY1ZVUsIDB4NmUxMDUxYmRVLAorICAgICAgICAweDIxOGFmOTNlVSwgMHhkZDA2M2Q5NlUsIDB4M2UwNWFlZGRVLCAweGU2YmQ0NjRkVSwKKyAgICAgICAgMHg1NDhkYjU5MVUsIDB4YzQ1ZDA1NzFVLCAweDA2ZDQ2ZjA0VSwgMHg1MDE1ZmY2MFUsCisgICAgICAgIDB4OThmYjI0MTlVLCAweGJkZTk5N2Q2VSwgMHg0MDQzY2M4OVUsIDB4ZDk5ZTc3NjdVLAorICAgICAgICAweGU4NDJiZGIwVSwgMHg4OThiODgwN1UsIDB4MTk1YjM4ZTdVLCAweGM4ZWVkYjc5VSwKKyAgICAgICAgMHg3YzBhNDdhMVUsIDB4NDIwZmU5N2NVLCAweDg0MWVjOWY4VSwgMHgwMDAwMDAwMFUsCisgICAgICAgIDB4ODA4NjgzMDlVLCAweDJiZWQ0ODMyVSwgMHgxMTcwYWMxZVUsIDB4NWE3MjRlNmNVLAorICAgICAgICAweDBlZmZmYmZkVSwgMHg4NTM4NTYwZlUsIDB4YWVkNTFlM2RVLCAweDJkMzkyNzM2VSwKKyAgICAgICAgMHgwZmQ5NjQwYVUsIDB4NWNhNjIxNjhVLCAweDViNTRkMTliVSwgMHgzNjJlM2EyNFUsCisgICAgICAgIDB4MGE2N2IxMGNVLCAweDU3ZTcwZjkzVSwgMHhlZTk2ZDJiNFUsIDB4OWI5MTllMWJVLAorICAgICAgICAweGMwYzU0ZjgwVSwgMHhkYzIwYTI2MVUsIDB4Nzc0YjY5NWFVLCAweDEyMWExNjFjVSwKKyAgICAgICAgMHg5M2JhMGFlMlUsIDB4YTAyYWU1YzBVLCAweDIyZTA0MzNjVSwgMHgxYjE3MWQxMlUsCisgICAgICAgIDB4MDkwZDBiMGVVLCAweDhiYzdhZGYyVSwgMHhiNmE4YjkyZFUsIDB4MWVhOWM4MTRVLAorICAgICAgICAweGYxMTk4NTU3VSwgMHg3NTA3NGNhZlUsIDB4OTlkZGJiZWVVLCAweDdmNjBmZGEzVSwKKyAgICAgICAgMHgwMTI2OWZmN1UsIDB4NzJmNWJjNWNVLCAweDY2M2JjNTQ0VSwgMHhmYjdlMzQ1YlUsCisgICAgICAgIDB4NDMyOTc2OGJVLCAweDIzYzZkY2NiVSwgMHhlZGZjNjhiNlUsIDB4ZTRmMTYzYjhVLAorICAgICAgICAweDMxZGNjYWQ3VSwgMHg2Mzg1MTA0MlUsIDB4OTcyMjQwMTNVLCAweGM2MTEyMDg0VSwKKyAgICAgICAgMHg0YTI0N2Q4NVUsIDB4YmIzZGY4ZDJVLCAweGY5MzIxMWFlVSwgMHgyOWExNmRjN1UsCisgICAgICAgIDB4OWUyZjRiMWRVLCAweGIyMzBmM2RjVSwgMHg4NjUyZWMwZFUsIDB4YzFlM2QwNzdVLAorICAgICAgICAweGIzMTY2YzJiVSwgMHg3MGI5OTlhOVUsIDB4OTQ0OGZhMTFVLCAweGU5NjQyMjQ3VSwKKyAgICAgICAgMHhmYzhjYzRhOFUsIDB4ZjAzZjFhYTBVLCAweDdkMmNkODU2VSwgMHgzMzkwZWYyMlUsCisgICAgICAgIDB4NDk0ZWM3ODdVLCAweDM4ZDFjMWQ5VSwgMHhjYWEyZmU4Y1UsIDB4ZDQwYjM2OThVLAorICAgICAgICAweGY1ODFjZmE2VSwgMHg3YWRlMjhhNVUsIDB4Yjc4ZTI2ZGFVLCAweGFkYmZhNDNmVSwKKyAgICAgICAgMHgzYTlkZTQyY1UsIDB4Nzg5MjBkNTBVLCAweDVmY2M5YjZhVSwgMHg3ZTQ2NjI1NFUsCisgICAgICAgIDB4OGQxM2MyZjZVLCAweGQ4YjhlODkwVSwgMHgzOWY3NWUyZVUsIDB4YzNhZmY1ODJVLAorICAgICAgICAweDVkODBiZTlmVSwgMHhkMDkzN2M2OVUsIDB4ZDUyZGE5NmZVLCAweDI1MTJiM2NmVSwKKyAgICAgICAgMHhhYzk5M2JjOFUsIDB4MTg3ZGE3MTBVLCAweDljNjM2ZWU4VSwgMHgzYmJiN2JkYlUsCisgICAgICAgIDB4MjY3ODA5Y2RVLCAweDU5MThmNDZlVSwgMHg5YWI3MDFlY1UsIDB4NGY5YWE4ODNVLAorICAgICAgICAweDk1NmU2NWU2VSwgMHhmZmU2N2VhYVUsIDB4YmNjZjA4MjFVLCAweDE1ZThlNmVmVSwKKyAgICAgICAgMHhlNzliZDliYVUsIDB4NmYzNmNlNGFVLCAweDlmMDlkNGVhVSwgMHhiMDdjZDYyOVUsCisgICAgICAgIDB4YTRiMmFmMzFVLCAweDNmMjMzMTJhVSwgMHhhNTk0MzBjNlUsIDB4YTI2NmMwMzVVLAorICAgICAgICAweDRlYmMzNzc0VSwgMHg4MmNhYTZmY1UsIDB4OTBkMGIwZTBVLCAweGE3ZDgxNTMzVSwKKyAgICAgICAgMHgwNDk4NGFmMVUsIDB4ZWNkYWY3NDFVLCAweGNkNTAwZTdmVSwgMHg5MWY2MmYxN1UsCisgICAgICAgIDB4NGRkNjhkNzZVLCAweGVmYjA0ZDQzVSwgMHhhYTRkNTRjY1UsIDB4OTYwNGRmZTRVLAorICAgICAgICAweGQxYjVlMzllVSwgMHg2YTg4MWI0Y1UsIDB4MmMxZmI4YzFVLCAweDY1NTE3ZjQ2VSwKKyAgICAgICAgMHg1ZWVhMDQ5ZFUsIDB4OGMzNTVkMDFVLCAweDg3NzQ3M2ZhVSwgMHgwYjQxMmVmYlUsCisgICAgICAgIDB4NjcxZDVhYjNVLCAweGRiZDI1MjkyVSwgMHgxMDU2MzNlOVUsIDB4ZDY0NzEzNmRVLAorICAgICAgICAweGQ3NjE4YzlhVSwgMHhhMTBjN2EzN1UsIDB4ZjgxNDhlNTlVLCAweDEzM2M4OWViVSwKKyAgICAgICAgMHhhOTI3ZWVjZVUsIDB4NjFjOTM1YjdVLCAweDFjZTVlZGUxVSwgMHg0N2IxM2M3YVUsCisgICAgICAgIDB4ZDJkZjU5OWNVLCAweGYyNzMzZjU1VSwgMHgxNGNlNzkxOFUsIDB4YzczN2JmNzNVLAorICAgICAgICAweGY3Y2RlYTUzVSwgMHhmZGFhNWI1ZlUsIDB4M2Q2ZjE0ZGZVLCAweDQ0ZGI4Njc4VSwKKyAgICAgICAgMHhhZmYzODFjYVUsIDB4NjhjNDNlYjlVLCAweDI0MzQyYzM4VSwgMHhhMzQwNWZjMlUsCisgICAgICAgIDB4MWRjMzcyMTZVLCAweGUyMjUwY2JjVSwgMHgzYzQ5OGIyOFUsIDB4MGQ5NTQxZmZVLAorICAgICAgICAweGE4MDE3MTM5VSwgMHgwY2IzZGUwOFUsIDB4YjRlNDljZDhVLCAweDU2YzE5MDY0VSwKKyAgICAgICAgMHhjYjg0NjE3YlUsIDB4MzJiNjcwZDVVLCAweDZjNWM3NDQ4VSwgMHhiODU3NDJkMFUsCit9OworY29uc3QgdWludDMyX3QgQUVTX1RkNFsyNTZdID0geworICAgICAgICAweDUyNTI1MjUyVSwgMHgwOTA5MDkwOVUsIDB4NmE2YTZhNmFVLCAweGQ1ZDVkNWQ1VSwKKyAgICAgICAgMHgzMDMwMzAzMFUsIDB4MzYzNjM2MzZVLCAweGE1YTVhNWE1VSwgMHgzODM4MzgzOFUsCisgICAgICAgIDB4YmZiZmJmYmZVLCAweDQwNDA0MDQwVSwgMHhhM2EzYTNhM1UsIDB4OWU5ZTllOWVVLAorICAgICAgICAweDgxODE4MTgxVSwgMHhmM2YzZjNmM1UsIDB4ZDdkN2Q3ZDdVLCAweGZiZmJmYmZiVSwKKyAgICAgICAgMHg3YzdjN2M3Y1UsIDB4ZTNlM2UzZTNVLCAweDM5MzkzOTM5VSwgMHg4MjgyODI4MlUsCisgICAgICAgIDB4OWI5YjliOWJVLCAweDJmMmYyZjJmVSwgMHhmZmZmZmZmZlUsIDB4ODc4Nzg3ODdVLAorICAgICAgICAweDM0MzQzNDM0VSwgMHg4ZThlOGU4ZVUsIDB4NDM0MzQzNDNVLCAweDQ0NDQ0NDQ0VSwKKyAgICAgICAgMHhjNGM0YzRjNFUsIDB4ZGVkZWRlZGVVLCAweGU5ZTllOWU5VSwgMHhjYmNiY2JjYlUsCisgICAgICAgIDB4NTQ1NDU0NTRVLCAweDdiN2I3YjdiVSwgMHg5NDk0OTQ5NFUsIDB4MzIzMjMyMzJVLAorICAgICAgICAweGE2YTZhNmE2VSwgMHhjMmMyYzJjMlUsIDB4MjMyMzIzMjNVLCAweDNkM2QzZDNkVSwKKyAgICAgICAgMHhlZWVlZWVlZVUsIDB4NGM0YzRjNGNVLCAweDk1OTU5NTk1VSwgMHgwYjBiMGIwYlUsCisgICAgICAgIDB4NDI0MjQyNDJVLCAweGZhZmFmYWZhVSwgMHhjM2MzYzNjM1UsIDB4NGU0ZTRlNGVVLAorICAgICAgICAweDA4MDgwODA4VSwgMHgyZTJlMmUyZVUsIDB4YTFhMWExYTFVLCAweDY2NjY2NjY2VSwKKyAgICAgICAgMHgyODI4MjgyOFUsIDB4ZDlkOWQ5ZDlVLCAweDI0MjQyNDI0VSwgMHhiMmIyYjJiMlUsCisgICAgICAgIDB4NzY3Njc2NzZVLCAweDViNWI1YjViVSwgMHhhMmEyYTJhMlUsIDB4NDk0OTQ5NDlVLAorICAgICAgICAweDZkNmQ2ZDZkVSwgMHg4YjhiOGI4YlUsIDB4ZDFkMWQxZDFVLCAweDI1MjUyNTI1VSwKKyAgICAgICAgMHg3MjcyNzI3MlUsIDB4ZjhmOGY4ZjhVLCAweGY2ZjZmNmY2VSwgMHg2NDY0NjQ2NFUsCisgICAgICAgIDB4ODY4Njg2ODZVLCAweDY4Njg2ODY4VSwgMHg5ODk4OTg5OFUsIDB4MTYxNjE2MTZVLAorICAgICAgICAweGQ0ZDRkNGQ0VSwgMHhhNGE0YTRhNFUsIDB4NWM1YzVjNWNVLCAweGNjY2NjY2NjVSwKKyAgICAgICAgMHg1ZDVkNWQ1ZFUsIDB4NjU2NTY1NjVVLCAweGI2YjZiNmI2VSwgMHg5MjkyOTI5MlUsCisgICAgICAgIDB4NmM2YzZjNmNVLCAweDcwNzA3MDcwVSwgMHg0ODQ4NDg0OFUsIDB4NTA1MDUwNTBVLAorICAgICAgICAweGZkZmRmZGZkVSwgMHhlZGVkZWRlZFUsIDB4YjliOWI5YjlVLCAweGRhZGFkYWRhVSwKKyAgICAgICAgMHg1ZTVlNWU1ZVUsIDB4MTUxNTE1MTVVLCAweDQ2NDY0NjQ2VSwgMHg1NzU3NTc1N1UsCisgICAgICAgIDB4YTdhN2E3YTdVLCAweDhkOGQ4ZDhkVSwgMHg5ZDlkOWQ5ZFUsIDB4ODQ4NDg0ODRVLAorICAgICAgICAweDkwOTA5MDkwVSwgMHhkOGQ4ZDhkOFUsIDB4YWJhYmFiYWJVLCAweDAwMDAwMDAwVSwKKyAgICAgICAgMHg4YzhjOGM4Y1UsIDB4YmNiY2JjYmNVLCAweGQzZDNkM2QzVSwgMHgwYTBhMGEwYVUsCisgICAgICAgIDB4ZjdmN2Y3ZjdVLCAweGU0ZTRlNGU0VSwgMHg1ODU4NTg1OFUsIDB4MDUwNTA1MDVVLAorICAgICAgICAweGI4YjhiOGI4VSwgMHhiM2IzYjNiM1UsIDB4NDU0NTQ1NDVVLCAweDA2MDYwNjA2VSwKKyAgICAgICAgMHhkMGQwZDBkMFUsIDB4MmMyYzJjMmNVLCAweDFlMWUxZTFlVSwgMHg4ZjhmOGY4ZlUsCisgICAgICAgIDB4Y2FjYWNhY2FVLCAweDNmM2YzZjNmVSwgMHgwZjBmMGYwZlUsIDB4MDIwMjAyMDJVLAorICAgICAgICAweGMxYzFjMWMxVSwgMHhhZmFmYWZhZlUsIDB4YmRiZGJkYmRVLCAweDAzMDMwMzAzVSwKKyAgICAgICAgMHgwMTAxMDEwMVUsIDB4MTMxMzEzMTNVLCAweDhhOGE4YThhVSwgMHg2YjZiNmI2YlUsCisgICAgICAgIDB4M2EzYTNhM2FVLCAweDkxOTE5MTkxVSwgMHgxMTExMTExMVUsIDB4NDE0MTQxNDFVLAorICAgICAgICAweDRmNGY0ZjRmVSwgMHg2NzY3Njc2N1UsIDB4ZGNkY2RjZGNVLCAweGVhZWFlYWVhVSwKKyAgICAgICAgMHg5Nzk3OTc5N1UsIDB4ZjJmMmYyZjJVLCAweGNmY2ZjZmNmVSwgMHhjZWNlY2VjZVUsCisgICAgICAgIDB4ZjBmMGYwZjBVLCAweGI0YjRiNGI0VSwgMHhlNmU2ZTZlNlUsIDB4NzM3MzczNzNVLAorICAgICAgICAweDk2OTY5Njk2VSwgMHhhY2FjYWNhY1UsIDB4NzQ3NDc0NzRVLCAweDIyMjIyMjIyVSwKKyAgICAgICAgMHhlN2U3ZTdlN1UsIDB4YWRhZGFkYWRVLCAweDM1MzUzNTM1VSwgMHg4NTg1ODU4NVUsCisgICAgICAgIDB4ZTJlMmUyZTJVLCAweGY5ZjlmOWY5VSwgMHgzNzM3MzczN1UsIDB4ZThlOGU4ZThVLAorICAgICAgICAweDFjMWMxYzFjVSwgMHg3NTc1NzU3NVUsIDB4ZGZkZmRmZGZVLCAweDZlNmU2ZTZlVSwKKyAgICAgICAgMHg0NzQ3NDc0N1UsIDB4ZjFmMWYxZjFVLCAweDFhMWExYTFhVSwgMHg3MTcxNzE3MVUsCisgICAgICAgIDB4MWQxZDFkMWRVLCAweDI5MjkyOTI5VSwgMHhjNWM1YzVjNVUsIDB4ODk4OTg5ODlVLAorICAgICAgICAweDZmNmY2ZjZmVSwgMHhiN2I3YjdiN1UsIDB4NjI2MjYyNjJVLCAweDBlMGUwZTBlVSwKKyAgICAgICAgMHhhYWFhYWFhYVUsIDB4MTgxODE4MThVLCAweGJlYmViZWJlVSwgMHgxYjFiMWIxYlUsCisgICAgICAgIDB4ZmNmY2ZjZmNVLCAweDU2NTY1NjU2VSwgMHgzZTNlM2UzZVUsIDB4NGI0YjRiNGJVLAorICAgICAgICAweGM2YzZjNmM2VSwgMHhkMmQyZDJkMlUsIDB4Nzk3OTc5NzlVLCAweDIwMjAyMDIwVSwKKyAgICAgICAgMHg5YTlhOWE5YVUsIDB4ZGJkYmRiZGJVLCAweGMwYzBjMGMwVSwgMHhmZWZlZmVmZVUsCisgICAgICAgIDB4Nzg3ODc4NzhVLCAweGNkY2RjZGNkVSwgMHg1YTVhNWE1YVUsIDB4ZjRmNGY0ZjRVLAorICAgICAgICAweDFmMWYxZjFmVSwgMHhkZGRkZGRkZFUsIDB4YThhOGE4YThVLCAweDMzMzMzMzMzVSwKKyAgICAgICAgMHg4ODg4ODg4OFUsIDB4MDcwNzA3MDdVLCAweGM3YzdjN2M3VSwgMHgzMTMxMzEzMVUsCisgICAgICAgIDB4YjFiMWIxYjFVLCAweDEyMTIxMjEyVSwgMHgxMDEwMTAxMFUsIDB4NTk1OTU5NTlVLAorICAgICAgICAweDI3MjcyNzI3VSwgMHg4MDgwODA4MFUsIDB4ZWNlY2VjZWNVLCAweDVmNWY1ZjVmVSwKKyAgICAgICAgMHg2MDYwNjA2MFUsIDB4NTE1MTUxNTFVLCAweDdmN2Y3ZjdmVSwgMHhhOWE5YTlhOVUsCisgICAgICAgIDB4MTkxOTE5MTlVLCAweGI1YjViNWI1VSwgMHg0YTRhNGE0YVUsIDB4MGQwZDBkMGRVLAorICAgICAgICAweDJkMmQyZDJkVSwgMHhlNWU1ZTVlNVUsIDB4N2E3YTdhN2FVLCAweDlmOWY5ZjlmVSwKKyAgICAgICAgMHg5MzkzOTM5M1UsIDB4YzljOWM5YzlVLCAweDljOWM5YzljVSwgMHhlZmVmZWZlZlUsCisgICAgICAgIDB4YTBhMGEwYTBVLCAweGUwZTBlMGUwVSwgMHgzYjNiM2IzYlUsIDB4NGQ0ZDRkNGRVLAorICAgICAgICAweGFlYWVhZWFlVSwgMHgyYTJhMmEyYVUsIDB4ZjVmNWY1ZjVVLCAweGIwYjBiMGIwVSwKKyAgICAgICAgMHhjOGM4YzhjOFUsIDB4ZWJlYmViZWJVLCAweGJiYmJiYmJiVSwgMHgzYzNjM2MzY1UsCisgICAgICAgIDB4ODM4MzgzODNVLCAweDUzNTM1MzUzVSwgMHg5OTk5OTk5OVUsIDB4NjE2MTYxNjFVLAorICAgICAgICAweDE3MTcxNzE3VSwgMHgyYjJiMmIyYlUsIDB4MDQwNDA0MDRVLCAweDdlN2U3ZTdlVSwKKyAgICAgICAgMHhiYWJhYmFiYVUsIDB4Nzc3Nzc3NzdVLCAweGQ2ZDZkNmQ2VSwgMHgyNjI2MjYyNlUsCisgICAgICAgIDB4ZTFlMWUxZTFVLCAweDY5Njk2OTY5VSwgMHgxNDE0MTQxNFUsIDB4NjM2MzYzNjNVLAorICAgICAgICAweDU1NTU1NTU1VSwgMHgyMTIxMjEyMVUsIDB4MGMwYzBjMGNVLCAweDdkN2Q3ZDdkVSwKK307CisKKworI2VuZGlmIC8vUUVNVV9VVElMX0FFU19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvYml0bWFwLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2YmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9iaXRtYXAuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIEJpdG1hcCBNb2R1bGUKKyAqCisgKiBTdG9sZW4gZnJvbSBsaW51eC9zcmMvbGliL2JpdG1hcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIENvcmVudGluIENoYXJ5CisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgInFlbXUvYml0b3BzLmgiCisjaW5jbHVkZSAicWVtdS9iaXRtYXAuaCIKKworLyoKKyAqIGJpdG1hcHMgcHJvdmlkZSBhbiBhcnJheSBvZiBiaXRzLCBpbXBsZW1lbnRlZCB1c2luZyBhbiBhbgorICogYXJyYXkgb2YgdW5zaWduZWQgbG9uZ3MuICBUaGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYQorICogZ2l2ZW4gYml0bWFwIGRvZXMgX25vdF8gbmVlZCB0byBiZSBhbiBleGFjdCBtdWx0aXBsZSBvZgorICogQklUU19QRVJfTE9ORy4KKyAqCisgKiBUaGUgcG9zc2libGUgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QsIHBhcnRpYWxseSB1c2VkIHdvcmQKKyAqIG9mIGEgYml0bWFwIGFyZSAnZG9uJ3QgY2FyZScuICBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMKKyAqIG5vIHBhcnRpY3VsYXIgZWZmb3J0IHRvIGtlZXAgdGhlbSB6ZXJvLiAgSXQgZW5zdXJlcyB0aGF0CisgKiB0aGVpciB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgdGhlIHJlc3VsdHMgb2YgYW55IG9wZXJhdGlvbi4KKyAqIFRoZSBiaXRtYXAgb3BlcmF0aW9ucyB0aGF0IHJldHVybiBCb29sZWFuIChiaXRtYXBfZW1wdHksCisgKiBmb3IgZXhhbXBsZSkgb3Igc2NhbGFyIChiaXRtYXBfd2VpZ2h0LCBmb3IgZXhhbXBsZSkgcmVzdWx0cworICogY2FyZWZ1bGx5IGZpbHRlciBvdXQgdGhlc2UgdW51c2VkIGJpdHMgZnJvbSBpbXBhY3RpbmcgdGhlaXIKKyAqIHJlc3VsdHMuCisgKgorICogVGhlc2Ugb3BlcmF0aW9ucyBhY3R1YWxseSBob2xkIHRvIGEgc2xpZ2h0bHkgc3Ryb25nZXIgcnVsZToKKyAqIGlmIHlvdSBkb24ndCBpbnB1dCBhbnkgYml0bWFwcyB0byB0aGVzZSBvcHMgdGhhdCBoYXZlIHNvbWUKKyAqIHVudXNlZCBiaXRzIHNldCwgdGhlbiB0aGV5IHdvbid0IG91dHB1dCBhbnkgc2V0IHVudXNlZCBiaXRzCisgKiBpbiBvdXRwdXQgYml0bWFwcy4KKyAqCisgKiBUaGUgYnl0ZSBvcmRlcmluZyBvZiBiaXRtYXBzIGlzIG1vcmUgbmF0dXJhbCBvbiBsaXR0bGUKKyAqIGVuZGlhbiBhcmNoaXRlY3R1cmVzLgorICovCisKK2ludCBzbG93X2JpdG1hcF9lbXB0eShjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAsIGxvbmcgYml0cykKK3sKKyAgICBsb25nIGssIGxpbSA9IGJpdHMvQklUU19QRVJfTE9ORzsKKworICAgIGZvciAoayA9IDA7IGsgPCBsaW07ICsraykgeworICAgICAgICBpZiAoYml0bWFwW2tdKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgaWYgKGJpdG1hcFtrXSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhiaXRzKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworaW50IHNsb3dfYml0bWFwX2Z1bGwoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwLCBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbGltOyArK2spIHsKKyAgICAgICAgaWYgKH5iaXRtYXBba10pIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJpdHMgJSBCSVRTX1BFUl9MT05HKSB7CisgICAgICAgIGlmICh+Yml0bWFwW2tdICYgQklUTUFQX0xBU1RfV09SRF9NQVNLKGJpdHMpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitpbnQgc2xvd19iaXRtYXBfZXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbGltOyArK2spIHsKKyAgICAgICAgaWYgKGJpdG1hcDFba10gIT0gYml0bWFwMltrXSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgaWYgKChiaXRtYXAxW2tdIF4gYml0bWFwMltrXSkgJiBCSVRNQVBfTEFTVF9XT1JEX01BU0soYml0cykpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgc2xvd19iaXRtYXBfY29tcGxlbWVudCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbGltOyArK2spIHsKKyAgICAgICAgZHN0W2tdID0gfnNyY1trXTsKKyAgICB9CisKKyAgICBpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgZHN0W2tdID0gfnNyY1trXSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhiaXRzKTsKKyAgICB9Cit9CisKK2ludCBzbG93X2JpdG1hcF9hbmQodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrOworICAgIGxvbmcgbnIgPSBCSVRTX1RPX0xPTkdTKGJpdHMpOworICAgIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKworICAgIGZvciAoayA9IDA7IGsgPCBucjsgaysrKSB7CisgICAgICAgIHJlc3VsdCB8PSAoZHN0W2tdID0gYml0bWFwMVtrXSAmIGJpdG1hcDJba10pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0ICE9IDA7Cit9CisKK3ZvaWQgc2xvd19iaXRtYXBfb3IodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrOworICAgIGxvbmcgbnIgPSBCSVRTX1RPX0xPTkdTKGJpdHMpOworCisgICAgZm9yIChrID0gMDsgayA8IG5yOyBrKyspIHsKKyAgICAgICAgZHN0W2tdID0gYml0bWFwMVtrXSB8IGJpdG1hcDJba107CisgICAgfQorfQorCit2b2lkIHNsb3dfYml0bWFwX3hvcih1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAyLCBsb25nIGJpdHMpCit7CisgICAgbG9uZyBrOworICAgIGxvbmcgbnIgPSBCSVRTX1RPX0xPTkdTKGJpdHMpOworCisgICAgZm9yIChrID0gMDsgayA8IG5yOyBrKyspIHsKKyAgICAgICAgZHN0W2tdID0gYml0bWFwMVtrXSBeIGJpdG1hcDJba107CisgICAgfQorfQorCitpbnQgc2xvd19iaXRtYXBfYW5kbm90KHVuc2lnbmVkIGxvbmcgKmRzdCwgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMiwgbG9uZyBiaXRzKQoreworICAgIGxvbmcgazsKKyAgICBsb25nIG5yID0gQklUU19UT19MT05HUyhiaXRzKTsKKyAgICB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnI7IGsrKykgeworICAgICAgICByZXN1bHQgfD0gKGRzdFtrXSA9IGJpdG1hcDFba10gJiB+Yml0bWFwMltrXSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQgIT0gMDsKK30KKworI2RlZmluZSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KSAofjBVTCA8PCAoKHN0YXJ0KSAlIEJJVFNfUEVSX0xPTkcpKQorCit2b2lkIGJpdG1hcF9zZXQodW5zaWduZWQgbG9uZyAqbWFwLCBsb25nIHN0YXJ0LCBsb25nIG5yKQoreworICAgIHVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CisgICAgY29uc3QgbG9uZyBzaXplID0gc3RhcnQgKyBucjsKKyAgICBpbnQgYml0c190b19zZXQgPSBCSVRTX1BFUl9MT05HIC0gKHN0YXJ0ICUgQklUU19QRVJfTE9ORyk7CisgICAgdW5zaWduZWQgbG9uZyBtYXNrX3RvX3NldCA9IEJJVE1BUF9GSVJTVF9XT1JEX01BU0soc3RhcnQpOworCisgICAgd2hpbGUgKG5yIC0gYml0c190b19zZXQgPj0gMCkgeworICAgICAgICAqcCB8PSBtYXNrX3RvX3NldDsKKyAgICAgICAgbnIgLT0gYml0c190b19zZXQ7CisgICAgICAgIGJpdHNfdG9fc2V0ID0gQklUU19QRVJfTE9ORzsKKyAgICAgICAgbWFza190b19zZXQgPSB+MFVMOworICAgICAgICBwKys7CisgICAgfQorICAgIGlmIChucikgeworICAgICAgICBtYXNrX3RvX3NldCAmPSBCSVRNQVBfTEFTVF9XT1JEX01BU0soc2l6ZSk7CisgICAgICAgICpwIHw9IG1hc2tfdG9fc2V0OworICAgIH0KK30KKwordm9pZCBiaXRtYXBfY2xlYXIodW5zaWduZWQgbG9uZyAqbWFwLCBsb25nIHN0YXJ0LCBsb25nIG5yKQoreworICAgIHVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CisgICAgY29uc3QgbG9uZyBzaXplID0gc3RhcnQgKyBucjsKKyAgICBpbnQgYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKyAgICB1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworICAgIHdoaWxlIChuciAtIGJpdHNfdG9fY2xlYXIgPj0gMCkgeworICAgICAgICAqcCAmPSB+bWFza190b19jbGVhcjsKKyAgICAgICAgbnIgLT0gYml0c190b19jbGVhcjsKKyAgICAgICAgYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkc7CisgICAgICAgIG1hc2tfdG9fY2xlYXIgPSB+MFVMOworICAgICAgICBwKys7CisgICAgfQorICAgIGlmIChucikgeworICAgICAgICBtYXNrX3RvX2NsZWFyICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKyAgICAgICAgKnAgJj0gfm1hc2tfdG9fY2xlYXI7CisgICAgfQorfQorCisjZGVmaW5lIEFMSUdOX01BU0soeCxtYXNrKSAgICAgICgoKHgpKyhtYXNrKSkmfihtYXNrKSkKKworLyoqCisgKiBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYSAtIGZpbmQgYSBjb250aWd1b3VzIGFsaWduZWQgemVybyBhcmVhCisgKiBAbWFwOiBUaGUgYWRkcmVzcyB0byBiYXNlIHRoZSBzZWFyY2ggb24KKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICogQHN0YXJ0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQG5yOiBUaGUgbnVtYmVyIG9mIHplcm9lZCBiaXRzIHdlJ3JlIGxvb2tpbmcgZm9yCisgKiBAYWxpZ25fbWFzazogQWxpZ25tZW50IG1hc2sgZm9yIHplcm8gYXJlYQorICoKKyAqIFRoZSBAYWxpZ25fbWFzayBzaG91bGQgYmUgb25lIGxlc3MgdGhhbiBhIHBvd2VyIG9mIDI7IHRoZSBlZmZlY3QgaXMgdGhhdAorICogdGhlIGJpdCBvZmZzZXQgb2YgYWxsIHplcm8gYXJlYXMgdGhpcyBmdW5jdGlvbiBmaW5kcyBpcyBtdWx0aXBsZXMgb2YgdGhhdAorICogcG93ZXIgb2YgMi4gQSBAYWxpZ25fbWFzayBvZiAwIG1lYW5zIG5vIGFsaWdubWVudCBpcyByZXF1aXJlZC4KKyAqLwordW5zaWduZWQgbG9uZyBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYSh1bnNpZ25lZCBsb25nICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrKQoreworICAgIHVuc2lnbmVkIGxvbmcgaW5kZXgsIGVuZCwgaTsKK2FnYWluOgorICAgIGluZGV4ID0gZmluZF9uZXh0X3plcm9fYml0KG1hcCwgc2l6ZSwgc3RhcnQpOworCisgICAgLyogQWxpZ24gYWxsb2NhdGlvbiAqLworICAgIGluZGV4ID0gQUxJR05fTUFTSyhpbmRleCwgYWxpZ25fbWFzayk7CisKKyAgICBlbmQgPSBpbmRleCArIG5yOworICAgIGlmIChlbmQgPiBzaXplKSB7CisgICAgICAgIHJldHVybiBlbmQ7CisgICAgfQorICAgIGkgPSBmaW5kX25leHRfYml0KG1hcCwgZW5kLCBpbmRleCk7CisgICAgaWYgKGkgPCBlbmQpIHsKKyAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworfQorCitpbnQgc2xvd19iaXRtYXBfaW50ZXJzZWN0cyhjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMiwgbG9uZyBiaXRzKQoreworICAgIGxvbmcgaywgbGltID0gYml0cy9CSVRTX1BFUl9MT05HOworCisgICAgZm9yIChrID0gMDsgayA8IGxpbTsgKytrKSB7CisgICAgICAgIGlmIChiaXRtYXAxW2tdICYgYml0bWFwMltrXSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgaWYgKChiaXRtYXAxW2tdICYgYml0bWFwMltrXSkgJiBCSVRNQVBfTEFTVF9XT1JEX01BU0soYml0cykpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL2JpdG9wcy5jIGIvYW5kcm9pZC9xZW11MS91dGlsL2JpdG9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2MzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvYml0b3BzLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA4IElCTSBDb3Jwb3JhdGlvbgorICogV3JpdHRlbiBieSBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CisgKiAoSW5zcGlyZWQgYnkgRGF2aWQgSG93ZWxsJ3MgZmluZF9uZXh0X2JpdCBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJxZW11L2JpdG9wcy5oIgorCisjZGVmaW5lIEJJVE9QX1dPUkQobnIpCQkoKG5yKSAvIEJJVFNfUEVSX0xPTkcpCisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uLgorICovCit1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgQklUT1BfV09SRChvZmZzZXQpOworICAgIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gb2Zmc2V0ICYgfihCSVRTX1BFUl9MT05HLTEpOworICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisgICAgaWYgKG9mZnNldCA+PSBzaXplKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKyAgICBzaXplIC09IHJlc3VsdDsKKyAgICBvZmZzZXQgJT0gQklUU19QRVJfTE9ORzsKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHRtcCA9ICoocCsrKTsKKyAgICAgICAgdG1wICY9ICh+MFVMIDw8IG9mZnNldCk7CisgICAgICAgIGlmIChzaXplIDwgQklUU19QRVJfTE9ORykgeworICAgICAgICAgICAgZ290byBmb3VuZF9maXJzdDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICBnb3RvIGZvdW5kX21pZGRsZTsKKyAgICAgICAgfQorICAgICAgICBzaXplIC09IEJJVFNfUEVSX0xPTkc7CisgICAgICAgIHJlc3VsdCArPSBCSVRTX1BFUl9MT05HOworICAgIH0KKyAgICB3aGlsZSAoc2l6ZSA+PSA0KkJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBkMSwgZDIsIGQzOworICAgICAgICB0bXAgPSAqcDsKKyAgICAgICAgZDEgPSAqKHArMSk7CisgICAgICAgIGQyID0gKihwKzIpOworICAgICAgICBkMyA9ICoocCszKTsKKyAgICAgICAgaWYgKHRtcCkgeworICAgICAgICAgICAgZ290byBmb3VuZF9taWRkbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQxIHwgZDIgfCBkMykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcCArPSA0OworICAgICAgICByZXN1bHQgKz0gNCpCSVRTX1BFUl9MT05HOworICAgICAgICBzaXplIC09IDQqQklUU19QRVJfTE9ORzsKKyAgICB9CisgICAgd2hpbGUgKHNpemUgPj0gQklUU19QRVJfTE9ORykgeworICAgICAgICBpZiAoKHRtcCA9ICoocCsrKSkpIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfbWlkZGxlOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSBCSVRTX1BFUl9MT05HOworICAgICAgICBzaXplIC09IEJJVFNfUEVSX0xPTkc7CisgICAgfQorICAgIGlmICghc2l6ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICB0bXAgPSAqcDsKKworZm91bmRfZmlyc3Q6CisgICAgdG1wICY9ICh+MFVMID4+IChCSVRTX1BFUl9MT05HIC0gc2l6ZSkpOworICAgIGlmICh0bXAgPT0gMFVMKSB7CQkvKiBBcmUgYW55IGJpdHMgc2V0PyAqLworICAgICAgICByZXR1cm4gcmVzdWx0ICsgc2l6ZTsJLyogTm9wZS4gKi8KKyAgICB9Citmb3VuZF9taWRkbGU6CisgICAgcmV0dXJuIHJlc3VsdCArIGN0emwodG1wKTsKK30KKworLyoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgZmluZF97Zmlyc3QsbmV4dH1femVyb19iaXQgd2FzIHN0b2xlbiBmcm9tCisgKiBMaW51cycgYXNtLWFscGhhL2JpdG9wcy5oLgorICovCit1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnAgPSBhZGRyICsgQklUT1BfV09SRChvZmZzZXQpOworICAgIHVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gb2Zmc2V0ICYgfihCSVRTX1BFUl9MT05HLTEpOworICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisgICAgaWYgKG9mZnNldCA+PSBzaXplKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKyAgICBzaXplIC09IHJlc3VsdDsKKyAgICBvZmZzZXQgJT0gQklUU19QRVJfTE9ORzsKKyAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgIHRtcCA9ICoocCsrKTsKKyAgICAgICAgdG1wIHw9IH4wVUwgPj4gKEJJVFNfUEVSX0xPTkcgLSBvZmZzZXQpOworICAgICAgICBpZiAoc2l6ZSA8IEJJVFNfUEVSX0xPTkcpIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfZmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKH50bXApIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfbWlkZGxlOworICAgICAgICB9CisgICAgICAgIHNpemUgLT0gQklUU19QRVJfTE9ORzsKKyAgICAgICAgcmVzdWx0ICs9IEJJVFNfUEVSX0xPTkc7CisgICAgfQorICAgIHdoaWxlIChzaXplICYgfihCSVRTX1BFUl9MT05HLTEpKSB7CisgICAgICAgIGlmICh+KHRtcCA9ICoocCsrKSkpIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmRfbWlkZGxlOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSBCSVRTX1BFUl9MT05HOworICAgICAgICBzaXplIC09IEJJVFNfUEVSX0xPTkc7CisgICAgfQorICAgIGlmICghc2l6ZSkgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICB0bXAgPSAqcDsKKworZm91bmRfZmlyc3Q6CisgICAgdG1wIHw9IH4wVUwgPDwgc2l6ZTsKKyAgICBpZiAodG1wID09IH4wVUwpIHsJLyogQXJlIGFueSBiaXRzIHplcm8/ICovCisgICAgICAgIHJldHVybiByZXN1bHQgKyBzaXplOwkvKiBOb3BlLiAqLworICAgIH0KK2ZvdW5kX21pZGRsZToKKyAgICByZXR1cm4gcmVzdWx0ICsgY3R6bCh+dG1wKTsKK30KKwordW5zaWduZWQgbG9uZyBmaW5kX2xhc3RfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIHdvcmRzOworICAgIHVuc2lnbmVkIGxvbmcgdG1wOworCisgICAgLyogU3RhcnQgYXQgZmluYWwgd29yZC4gKi8KKyAgICB3b3JkcyA9IHNpemUgLyBCSVRTX1BFUl9MT05HOworCisgICAgLyogUGFydGlhbCBmaW5hbCB3b3JkPyAqLworICAgIGlmIChzaXplICYgKEJJVFNfUEVSX0xPTkctMSkpIHsKKyAgICAgICAgdG1wID0gKGFkZHJbd29yZHNdICYgKH4wVUwgPj4gKEJJVFNfUEVSX0xPTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKHNpemUgJiAoQklUU19QRVJfTE9ORy0xKSkpKSk7CisgICAgICAgIGlmICh0bXApIHsKKyAgICAgICAgICAgIGdvdG8gZm91bmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAod29yZHMpIHsKKyAgICAgICAgdG1wID0gYWRkclstLXdvcmRzXTsKKyAgICAgICAgaWYgKHRtcCkgeworICAgICAgICBmb3VuZDoKKyAgICAgICAgICAgIHJldHVybiB3b3JkcyAqIEJJVFNfUEVSX0xPTkcgKyBCSVRTX1BFUl9MT05HIC0gMSAtIGNsemwodG1wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdCBmb3VuZCAqLworICAgIHJldHVybiBzaXplOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL2NhY2hlLXV0aWxzLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvY2FjaGUtdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcwMDMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL2NhY2hlLXV0aWxzLmMKQEAgLTAsMCArMSw4NiBAQAorI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9jYWNoZS11dGlscy5oIgorCisjaWYgZGVmaW5lZChfQVJDSF9QUEMpCitzdHJ1Y3QgcWVtdV9jYWNoZV9jb25mIHFlbXVfY2FjaGVfY29uZiA9IHsKKyAgICAuZGNhY2hlX2JzaXplID0gMTYsCisgICAgLmljYWNoZV9ic2l6ZSA9IDE2Cit9OworCisjaWYgZGVmaW5lZCBfQUlYCisjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCit2b2lkIHFlbXVfY2FjaGVfdXRpbHNfaW5pdCh2b2lkKQoreworICAgIHFlbXVfY2FjaGVfY29uZi5pY2FjaGVfYnNpemUgPSBfc3lzdGVtX2NvbmZpZ3VyYXRpb24uaWNhY2hlX2xpbmU7CisgICAgcWVtdV9jYWNoZV9jb25mLmRjYWNoZV9ic2l6ZSA9IF9zeXN0ZW1fY29uZmlndXJhdGlvbi5kY2FjaGVfbGluZTsKK30KKworI2VsaWYgZGVmaW5lZCBfX2xpbnV4X18KKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAiZWxmLmgiCisKK3ZvaWQgcWVtdV9jYWNoZV91dGlsc19pbml0KHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyBkc2l6ZSA9IHFlbXVfZ2V0YXV4dmFsKEFUX0RDQUNIRUJTSVpFKTsKKyAgICB1bnNpZ25lZCBsb25nIGlzaXplID0gcWVtdV9nZXRhdXh2YWwoQVRfSUNBQ0hFQlNJWkUpOworCisgICAgaWYgKGRzaXplID09IDAgfHwgaXNpemUgPT0gMCkgeworICAgICAgICBpZiAoZHNpemUgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRhdXh2YWwgQVRfRENBQ0hFQlNJWkUgZmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNpemUgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRhdXh2YWwgQVRfSUNBQ0hFQlNJWkUgZmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBleGl0KDEpOworCisgICAgfQorICAgIHFlbXVfY2FjaGVfY29uZi5kY2FjaGVfYnNpemUgPSBkc2l6ZTsKKyAgICBxZW11X2NhY2hlX2NvbmYuaWNhY2hlX2JzaXplID0gaXNpemU7Cit9CisKKyNlbGlmIGRlZmluZWQgX19BUFBMRV9fCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKK3ZvaWQgcWVtdV9jYWNoZV91dGlsc19pbml0KHZvaWQpCit7CisgICAgc2l6ZV90IGxlbjsKKyAgICB1bnNpZ25lZCBjYWNoZWxpbmU7CisgICAgaW50IG5hbWVbMl0gPSB7IENUTF9IVywgSFdfQ0FDSEVMSU5FIH07CisKKyAgICBsZW4gPSBzaXplb2YoY2FjaGVsaW5lKTsKKyAgICBpZiAoc3lzY3RsKG5hbWUsIDIsICZjYWNoZWxpbmUsICZsZW4sIE5VTEwsIDApKSB7CisgICAgICAgIHBlcnJvcigic3lzY3RsIENUTF9IVyBIV19DQUNIRUxJTkUgZmFpbGVkIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWVtdV9jYWNoZV9jb25mLmRjYWNoZV9ic2l6ZSA9IGNhY2hlbGluZTsKKyAgICAgICAgcWVtdV9jYWNoZV9jb25mLmljYWNoZV9ic2l6ZSA9IGNhY2hlbGluZTsKKyAgICB9Cit9CisKKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKQorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKK3ZvaWQgcWVtdV9jYWNoZV91dGlsc19pbml0KHZvaWQpCit7CisgICAgc2l6ZV90IGxlbiA9IDQ7CisgICAgdW5zaWduZWQgY2FjaGVsaW5lOworCisgICAgaWYgKHN5c2N0bGJ5bmFtZSAoIm1hY2hkZXAuY2FjaGVsaW5lX3NpemUiLCAmY2FjaGVsaW5lLCAmbGVuLCBOVUxMLCAwKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN5c2N0bGJ5bmFtZSBtYWNoZGVwLmNhY2hlbGluZV9zaXplIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBxZW11X2NhY2hlX2NvbmYuZGNhY2hlX2JzaXplID0gY2FjaGVsaW5lOworICAgIHFlbXVfY2FjaGVfY29uZi5pY2FjaGVfYnNpemUgPSBjYWNoZWxpbmU7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9BUkNIX1BQQyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL2NvbXBhdGZkLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvY29tcGF0ZmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQ4MzhmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL2NvbXBhdGZkLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBzaWduYWxmZC9ldmVudGZkIGNvbXBhdGliaWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA4CisgKgorICogQXV0aG9yczoKKyAqICBBbnRob255IExpZ3VvcmkgICA8YWxpZ3VvcmlAdXMuaWJtLmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICogQ29udHJpYnV0aW9ucyBhZnRlciAyMDEyLTAxLTEzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIGluY2x1ZGUgPHN5cy9zeXNjYWxsLmg+IG9uIExpbnV4LgorI2RlZmluZSBfR05VX1NPVVJDRSAxCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvY29tcGF0ZmQuaCIKKyNpbmNsdWRlICJxZW11L3RocmVhZC5oIgorCisjaWZkZWYgQ09ORklHX1NJR05BTEZECisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorCitzdHJ1Y3Qgc2lnZmRfY29tcGF0X2luZm8KK3sKKyAgICBzaWdzZXRfdCBtYXNrOworICAgIGludCBmZDsKK307CisKK3N0YXRpYyB2b2lkICpzaWd3YWl0X2NvbXBhdCh2b2lkICpvcGFxdWUpCit7CisgICAgc3RydWN0IHNpZ2ZkX2NvbXBhdF9pbmZvICppbmZvID0gb3BhcXVlOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IHNpZzsKKyAgICAgICAgaW50IGVycjsKKworICAgICAgICBlcnIgPSBzaWd3YWl0KCZpbmZvLT5tYXNrLCAmc2lnKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJ1Y3QgcWVtdV9zaWduYWxmZF9zaWdpbmZvIGJ1ZmZlcjsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOworCisgICAgICAgICAgICBtZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgYnVmZmVyLnNzaV9zaWdubyA9IHNpZzsKKworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHNpemVvZihidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBsZW47CisKKyAgICAgICAgICAgICAgICBsZW4gPSB3cml0ZShpbmZvLT5mZCwgKGNoYXIgKikmYnVmZmVyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IC0xICYmIGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHFlbXVfc2lnbmFsZmRfY29tcGF0KGNvbnN0IHNpZ3NldF90ICptYXNrKQoreworICAgIHN0cnVjdCBzaWdmZF9jb21wYXRfaW5mbyAqaW5mbzsKKyAgICBRZW11VGhyZWFkIHRocmVhZDsKKyAgICBpbnQgZmRzWzJdOworCisgICAgaW5mbyA9IG1hbGxvYyhzaXplb2YoKmluZm8pKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHBpcGUoZmRzKSA9PSAtMSkgeworICAgICAgICBmcmVlKGluZm8pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcWVtdV9zZXRfY2xvZXhlYyhmZHNbMF0pOworICAgIHFlbXVfc2V0X2Nsb2V4ZWMoZmRzWzFdKTsKKworICAgIG1lbWNweSgmaW5mby0+bWFzaywgbWFzaywgc2l6ZW9mKCptYXNrKSk7CisgICAgaW5mby0+ZmQgPSBmZHNbMV07CisKKyAgICBxZW11X3RocmVhZF9jcmVhdGUoJnRocmVhZCwgInNpZ25hbGZkX2NvbXBhdCIsIHNpZ3dhaXRfY29tcGF0LCBpbmZvLCBRRU1VX1RIUkVBRF9ERVRBQ0hFRCk7CisKKyAgICByZXR1cm4gZmRzWzBdOworfQorCitpbnQgcWVtdV9zaWduYWxmZChjb25zdCBzaWdzZXRfdCAqbWFzaykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19TSUdOQUxGRCkKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gc3lzY2FsbChTWVNfc2lnbmFsZmQsIC0xLCBtYXNrLCBfTlNJRyAvIDgpOworICAgIGlmIChyZXQgIT0gLTEpIHsKKyAgICAgICAgcWVtdV9zZXRfY2xvZXhlYyhyZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHFlbXVfc2lnbmFsZmRfY29tcGF0KG1hc2spOworfQorCitib29sIHFlbXVfc2lnbmFsZmRfYXZhaWxhYmxlKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NJR05BTEZECisgICAgc2lnc2V0X3QgbWFzazsKKyAgICBpbnQgZmQ7CisgICAgYm9vbCBvazsKKyAgICBzaWdlbXB0eXNldCgmbWFzayk7CisgICAgZXJybm8gPSAwOworICAgIGZkID0gc3lzY2FsbChTWVNfc2lnbmFsZmQsIC0xLCAmbWFzaywgX05TSUcgLyA4KTsKKyAgICBvayA9IChlcnJubyAhPSBFTk9TWVMpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICB9CisgICAgcmV0dXJuIG9rOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9jdXRpbHMuYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9jdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVjYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL2N1dGlscy5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogU2ltcGxlIEMgZnVuY3Rpb25zIHRvIHN1cHBsZW1lbnQgdGhlIEMgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgorI2luY2x1ZGUgInFlbXUvaW92LmgiCisKK3ZvaWQgc3RycGFkY3B5KGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpzdHIsIGNoYXIgcGFkKQoreworICAgIGludCBsZW4gPSBxZW11X3N0cm5sZW4oc3RyLCBidWZfc2l6ZSk7CisgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgIG1lbXNldChidWYgKyBsZW4sIHBhZCwgYnVmX3NpemUgLSBsZW4pOworfQorCit2b2lkIHBzdHJjcHkoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBpbnQgYzsKKyAgICBjaGFyICpxID0gYnVmOworCisgICAgaWYgKGJ1Zl9zaXplIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIGZvcig7OykgeworICAgICAgICBjID0gKnN0cisrOworICAgICAgICBpZiAoYyA9PSAwIHx8IHEgPj0gYnVmICsgYnVmX3NpemUgLSAxKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICpxKysgPSBjOworICAgIH0KKyAgICAqcSA9ICdcMCc7Cit9CisKKy8qIHN0cmNhdCBhbmQgdHJ1bmNhdGUuICovCitjaGFyICpwc3RyY2F0KGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpzKQoreworICAgIGludCBsZW47CisgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgaWYgKGxlbiA8IGJ1Zl9zaXplKQorICAgICAgICBwc3RyY3B5KGJ1ZiArIGxlbiwgYnVmX3NpemUgLSBsZW4sIHMpOworICAgIHJldHVybiBidWY7Cit9CisKK2ludCBzdHJzdGFydChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqKnB0cikKK3sKKyAgICBjb25zdCBjaGFyICpwLCAqcTsKKyAgICBwID0gc3RyOworICAgIHEgPSB2YWw7CisgICAgd2hpbGUgKCpxICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKCpwICE9ICpxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHArKzsKKyAgICAgICAgcSsrOworICAgIH0KKyAgICBpZiAocHRyKQorICAgICAgICAqcHRyID0gcDsKKyAgICByZXR1cm4gMTsKK30KKworaW50IHN0cmlzdGFydChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnZhbCwgY29uc3QgY2hhciAqKnB0cikKK3sKKyAgICBjb25zdCBjaGFyICpwLCAqcTsKKyAgICBwID0gc3RyOworICAgIHEgPSB2YWw7CisgICAgd2hpbGUgKCpxICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKHFlbXVfdG91cHBlcigqcCkgIT0gcWVtdV90b3VwcGVyKCpxKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwKys7CisgICAgICAgIHErKzsKKyAgICB9CisgICAgaWYgKHB0cikKKyAgICAgICAgKnB0ciA9IHA7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIFhYWDogdXNlIGhvc3Qgc3RybmxlbiBpZiBhdmFpbGFibGUgPyAqLworaW50IHFlbXVfc3Rybmxlbihjb25zdCBjaGFyICpzLCBpbnQgbWF4X2xlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvcihpID0gMDsgaSA8IG1heF9sZW47IGkrKykgeworICAgICAgICBpZiAoc1tpXSA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworY2hhciAqcWVtdV9zdHJzZXAoY2hhciAqKmlucHV0LCBjb25zdCBjaGFyICpkZWxpbSkKK3sKKyAgICBjaGFyICpyZXN1bHQgPSAqaW5wdXQ7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKnA7CisKKyAgICAgICAgZm9yIChwID0gcmVzdWx0OyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjaHIoZGVsaW0sICpwKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgqcCA9PSAnXDAnKSB7CisgICAgICAgICAgICAqaW5wdXQgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICAgICAgKmlucHV0ID0gcCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordGltZV90IG1rdGltZWdtKHN0cnVjdCB0bSAqdG0pCit7CisgICAgdGltZV90IHQ7CisgICAgaW50IHkgPSB0bS0+dG1feWVhciArIDE5MDAsIG0gPSB0bS0+dG1fbW9uICsgMSwgZCA9IHRtLT50bV9tZGF5OworICAgIGlmIChtIDwgMykgeworICAgICAgICBtICs9IDEyOworICAgICAgICB5LS07CisgICAgfQorICAgIHQgPSA4NjQwMFVMTCAqIChkICsgKDE1MyAqIG0gLSA0NTcpIC8gNSArIDM2NSAqIHkgKyB5IC8gNCAtIHkgLyAxMDAgKworICAgICAgICAgICAgICAgICB5IC8gNDAwIC0gNzE5NDY5KTsKKyAgICB0ICs9IDM2MDAgKiB0bS0+dG1faG91ciArIDYwICogdG0tPnRtX21pbiArIHRtLT50bV9zZWM7CisgICAgcmV0dXJuIHQ7Cit9CisKK2ludCBxZW11X2ZscyhpbnQgaSkKK3sKKyAgICByZXR1cm4gMzIgLSBjbHozMihpKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSBkYXRhIGdvZXMgb24gZGlzaywgYnV0IGlmIHBvc3NpYmxlIGRvIG5vdCBib3RoZXIgdG8KKyAqIHdyaXRlIG91dCB0aGUgaW5vZGUganVzdCBmb3IgdGltZXN0YW1wIHVwZGF0ZXMuCisgKgorICogVW5mb3J0dW5hdGVseSBldmVuIGluIDIwMDkgbWFueSBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3Qgc3VwcG9ydAorICogZmRhdGFzeW5jIGFuZCBoYXZlIHRvIGZhbGwgYmFjayB0byBmc3luYy4KKyAqLworaW50IHFlbXVfZmRhdGFzeW5jKGludCBmZCkKK3sKKyNpZmRlZiBDT05GSUdfRkRBVEFTWU5DCisgICAgcmV0dXJuIGZkYXRhc3luYyhmZCk7CisjZWxzZQorICAgIHJldHVybiBmc3luYyhmZCk7CisjZW5kaWYKK30KKworLyoKKyAqIFNlYXJjaGVzIGZvciBhbiBhcmVhIHdpdGggbm9uLXplcm8gY29udGVudCBpbiBhIGJ1ZmZlcgorICoKKyAqIEF0dGVudGlvbiEgVGhlIGxlbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YKKyAqIEJVRkZFUl9GSU5EX05PTlpFUk9fT0ZGU0VUX1VOUk9MTF9GQUNUT1IgKiBzaXplb2YoVkVDVFlQRSkKKyAqIGFuZCBhZGRyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YoVkVDVFlQRSkgZHVlIHRvCisgKiByZXN0cmljdGlvbiBvZiBvcHRpbWl6YXRpb25zIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogY2FuX3VzZV9idWZmZXJfZmluZF9ub256ZXJvX29mZnNldCgpIGNhbiBiZSB1c2VkIHRvIGNoZWNrCisgKiB0aGVzZSByZXF1aXJlbWVudHMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBub24temVybyBhcmVhIHJvdW5kZWQKKyAqIGRvd24gdG8gYSBtdWx0aXBsZSBvZiBzaXplb2YoVkVDVFlQRSkgZm9yIHRoZSBmaXJzdAorICogQlVGRkVSX0ZJTkRfTk9OWkVST19PRkZTRVRfVU5ST0xMX0ZBQ1RPUiBjaHVua3MgYW5kIGRvd24gdG8KKyAqIEJVRkZFUl9GSU5EX05PTlpFUk9fT0ZGU0VUX1VOUk9MTF9GQUNUT1IgKiBzaXplb2YoVkVDVFlQRSkKKyAqIGFmdGVyd2FyZHMuCisgKgorICogSWYgdGhlIGJ1ZmZlciBpcyBhbGwgemVybyB0aGUgcmV0dXJuIHZhbHVlIGlzIGVxdWFsIHRvIGxlbi4KKyAqLworCitzaXplX3QgYnVmZmVyX2ZpbmRfbm9uemVyb19vZmZzZXQoY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIGNvbnN0IFZFQ1RZUEUgKnAgPSBidWY7CisgICAgY29uc3QgVkVDVFlQRSB6ZXJvID0gKFZFQ1RZUEUpezB9OworICAgIHNpemVfdCBpOworCisgICAgYXNzZXJ0KGNhbl91c2VfYnVmZmVyX2ZpbmRfbm9uemVyb19vZmZzZXQoYnVmLCBsZW4pKTsKKworICAgIGlmICghbGVuKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBCVUZGRVJfRklORF9OT05aRVJPX09GRlNFVF9VTlJPTExfRkFDVE9SOyBpKyspIHsKKyAgICAgICAgaWYgKCFBTExfRVEocFtpXSwgemVybykpIHsKKyAgICAgICAgICAgIHJldHVybiBpICogc2l6ZW9mKFZFQ1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gQlVGRkVSX0ZJTkRfTk9OWkVST19PRkZTRVRfVU5ST0xMX0ZBQ1RPUjsKKyAgICAgICAgIGkgPCBsZW4gLyBzaXplb2YoVkVDVFlQRSk7CisgICAgICAgICBpICs9IEJVRkZFUl9GSU5EX05PTlpFUk9fT0ZGU0VUX1VOUk9MTF9GQUNUT1IpIHsKKyAgICAgICAgVkVDVFlQRSB0bXAwID0gcFtpICsgMF0gfCBwW2kgKyAxXTsKKyAgICAgICAgVkVDVFlQRSB0bXAxID0gcFtpICsgMl0gfCBwW2kgKyAzXTsKKyAgICAgICAgVkVDVFlQRSB0bXAyID0gcFtpICsgNF0gfCBwW2kgKyA1XTsKKyAgICAgICAgVkVDVFlQRSB0bXAzID0gcFtpICsgNl0gfCBwW2kgKyA3XTsKKyAgICAgICAgVkVDVFlQRSB0bXAwMSA9IHRtcDAgfCB0bXAxOworICAgICAgICBWRUNUWVBFIHRtcDIzID0gdG1wMiB8IHRtcDM7CisgICAgICAgIGlmICghQUxMX0VRKHRtcDAxIHwgdG1wMjMsIHplcm8pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpICogc2l6ZW9mKFZFQ1RZUEUpOworfQorCisvKgorICogQ2hlY2tzIGlmIGEgYnVmZmVyIGlzIGFsbCB6ZXJvZXMKKyAqCisgKiBBdHRlbnRpb24hIFRoZSBsZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKiBzaXplb2YobG9uZykgZHVlIHRvCisgKiByZXN0cmljdGlvbiBvZiBvcHRpbWl6YXRpb25zIGluIHRoaXMgZnVuY3Rpb24uCisgKi8KK2Jvb2wgYnVmZmVyX2lzX3plcm8oY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworICAgIC8qCisgICAgICogVXNlIGxvbmcgYXMgdGhlIGJpZ2dlc3QgYXZhaWxhYmxlIGludGVybmFsIGRhdGEgdHlwZSB0aGF0IGZpdHMgaW50byB0aGUKKyAgICAgKiBDUFUgcmVnaXN0ZXIgYW5kIHVucm9sbCB0aGUgbG9vcCB0byBzbW9vdGggb3V0IHRoZSBlZmZlY3Qgb2YgbWVtb3J5CisgICAgICogbGF0ZW5jeS4KKyAgICAgKi8KKworICAgIHNpemVfdCBpOworICAgIGxvbmcgZDAsIGQxLCBkMiwgZDM7CisgICAgY29uc3QgbG9uZyAqIGNvbnN0IGRhdGEgPSBidWY7CisKKyAgICAvKiB1c2UgdmVjdG9yIG9wdGltaXplZCB6ZXJvIGNoZWNrIGlmIHBvc3NpYmxlICovCisgICAgaWYgKGNhbl91c2VfYnVmZmVyX2ZpbmRfbm9uemVyb19vZmZzZXQoYnVmLCBsZW4pKSB7CisgICAgICAgIHJldHVybiBidWZmZXJfZmluZF9ub256ZXJvX29mZnNldChidWYsIGxlbikgPT0gbGVuOworICAgIH0KKworICAgIGFzc2VydChsZW4gJSAoNCAqIHNpemVvZihsb25nKSkgPT0gMCk7CisgICAgbGVuIC89IHNpemVvZihsb25nKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkgeworICAgICAgICBkMCA9IGRhdGFbaSArIDBdOworICAgICAgICBkMSA9IGRhdGFbaSArIDFdOworICAgICAgICBkMiA9IGRhdGFbaSArIDJdOworICAgICAgICBkMyA9IGRhdGFbaSArIDNdOworCisgICAgICAgIGlmIChkMCB8fCBkMSB8fCBkMiB8fCBkMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNpZm5kZWYgX1dJTjMyCisvKiBTZXRzIGEgc3BlY2lmaWMgZmxhZyAqLworaW50IGZjbnRsX3NldGZsKGludCBmZCwgaW50IGZsYWcpCit7CisgICAgaW50IGZsYWdzOworCisgICAgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCk7CisgICAgaWYgKGZsYWdzID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgaWYgKGZjbnRsKGZkLCBGX1NFVEZMLCBmbGFncyB8IGZsYWcpID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludDY0X3Qgc3VmZml4X211bChjaGFyIHN1ZmZpeCwgaW50NjRfdCB1bml0KQoreworICAgIHN3aXRjaCAocWVtdV90b3VwcGVyKHN1ZmZpeCkpIHsKKyAgICBjYXNlIFNUUlRPU1pfREVGU1VGRklYX0I6CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgU1RSVE9TWl9ERUZTVUZGSVhfS0I6CisgICAgICAgIHJldHVybiB1bml0OworICAgIGNhc2UgU1RSVE9TWl9ERUZTVUZGSVhfTUI6CisgICAgICAgIHJldHVybiB1bml0ICogdW5pdDsKKyAgICBjYXNlIFNUUlRPU1pfREVGU1VGRklYX0dCOgorICAgICAgICByZXR1cm4gdW5pdCAqIHVuaXQgKiB1bml0OworICAgIGNhc2UgU1RSVE9TWl9ERUZTVUZGSVhfVEI6CisgICAgICAgIHJldHVybiB1bml0ICogdW5pdCAqIHVuaXQgKiB1bml0OworICAgIGNhc2UgU1RSVE9TWl9ERUZTVUZGSVhfUEI6CisgICAgICAgIHJldHVybiB1bml0ICogdW5pdCAqIHVuaXQgKiB1bml0ICogdW5pdDsKKyAgICBjYXNlIFNUUlRPU1pfREVGU1VGRklYX0VCOgorICAgICAgICByZXR1cm4gdW5pdCAqIHVuaXQgKiB1bml0ICogdW5pdCAqIHVuaXQgKiB1bml0OworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qCisgKiBDb252ZXJ0IHN0cmluZyB0byBieXRlcywgYWxsb3dpbmcgZWl0aGVyIEIvYiBmb3IgYnl0ZXMsIEsvayBmb3IgS0IsCisgKiBNL20gZm9yIE1CLCBHL2cgZm9yIEdCIG9yIFQvdCBmb3IgVEIuIEVuZCBwb2ludGVyIHdpbGwgYmUgcmV0dXJuZWQKKyAqIGluICplbmQsIGlmIG5vdCBOVUxMLiBSZXR1cm4gLUVSQU5HRSBvbiBvdmVyZmxvdywgUmV0dXJuIC1FSU5WQUwgb24KKyAqIG90aGVyIGVycm9yLgorICovCitpbnQ2NF90IHN0cnRvc3pfc3VmZml4X3VuaXQoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGRlZmF1bHRfc3VmZml4LCBpbnQ2NF90IHVuaXQpCit7CisgICAgaW50NjRfdCByZXR2YWwgPSAtRUlOVkFMOworICAgIGNoYXIgKmVuZHB0cjsKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAgaW50IG11bF9yZXF1aXJlZCA9IDA7CisgICAgZG91YmxlIHZhbCwgbXVsLCBpbnRlZ3JhbCwgZnJhY3Rpb247CisKKyAgICBlcnJubyA9IDA7CisgICAgdmFsID0gc3RydG9kKG5wdHIsICZlbmRwdHIpOworICAgIGlmIChpc25hbih2YWwpIHx8IGVuZHB0ciA9PSBucHRyIHx8IGVycm5vICE9IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmcmFjdGlvbiA9IG1vZGYodmFsLCAmaW50ZWdyYWwpOworICAgIGlmIChmcmFjdGlvbiAhPSAwKSB7CisgICAgICAgIG11bF9yZXF1aXJlZCA9IDE7CisgICAgfQorICAgIGMgPSAqZW5kcHRyOworICAgIG11bCA9IHN1ZmZpeF9tdWwoYywgdW5pdCk7CisgICAgaWYgKG11bCA+PSAwKSB7CisgICAgICAgIGVuZHB0cisrOworICAgIH0gZWxzZSB7CisgICAgICAgIG11bCA9IHN1ZmZpeF9tdWwoZGVmYXVsdF9zdWZmaXgsIHVuaXQpOworICAgICAgICBhc3NlcnQobXVsID49IDApOworICAgIH0KKyAgICBpZiAobXVsID09IDEgJiYgbXVsX3JlcXVpcmVkKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKCh2YWwgKiBtdWwgPj0gSU5UNjRfTUFYKSB8fCB2YWwgPCAwKSB7CisgICAgICAgIHJldHZhbCA9IC1FUkFOR0U7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0dmFsID0gdmFsICogbXVsOworCitmYWlsOgorICAgIGlmIChlbmQpIHsKKyAgICAgICAgKmVuZCA9IGVuZHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitpbnQ2NF90IHN0cnRvc3pfc3VmZml4KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmQsIGNvbnN0IGNoYXIgZGVmYXVsdF9zdWZmaXgpCit7CisgICAgcmV0dXJuIHN0cnRvc3pfc3VmZml4X3VuaXQobnB0ciwgZW5kLCBkZWZhdWx0X3N1ZmZpeCwgMTAyNCk7Cit9CisKK2ludDY0X3Qgc3RydG9zeihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kKQoreworICAgIHJldHVybiBzdHJ0b3N6X3N1ZmZpeChucHRyLCBlbmQsIFNUUlRPU1pfREVGU1VGRklYX01CKTsKK30KKworLyoqCisgKiBwYXJzZV91aW50OgorICoKKyAqIEBzOiBTdHJpbmcgdG8gcGFyc2UKKyAqIEB2YWx1ZTogRGVzdGluYXRpb24gZm9yIHBhcnNlZCBpbnRlZ2VyIHZhbHVlCisgKiBAZW5kcHRyOiBEZXN0aW5hdGlvbiBmb3IgcG9pbnRlciB0byBmaXJzdCBjaGFyYWN0ZXIgbm90IGNvbnN1bWVkCisgKiBAYmFzZTogaW50ZWdlciBiYXNlLCBiZXR3ZWVuIDIgYW5kIDM2IGluY2x1c2l2ZSwgb3IgMAorICoKKyAqIFBhcnNlIHVuc2lnbmVkIGludGVnZXIKKyAqCisgKiBQYXJzZWQgc3ludGF4IGlzIGxpa2Ugc3RydG91bGwoKSdzOiBhcmJpdHJhcnkgd2hpdGVzcGFjZSwgYSBzaW5nbGUgb3B0aW9uYWwKKyAqICcrJyBvciAnLScsIGFuIG9wdGlvbmFsICIweCIgaWYgQGJhc2UgaXMgMCBvciAxNiwgb25lIG9yIG1vcmUgZGlnaXRzLgorICoKKyAqIElmIEBzIGlzIG51bGwsIG9yIEBiYXNlIGlzIGludmFsaWQsIG9yIEBzIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhbgorICogaW50ZWdlciBpbiB0aGUgc3ludGF4IGFib3ZlLCBzZXQgKkB2YWx1ZSB0byAwLCAqQGVuZHB0ciB0byBAcywgYW5kCisgKiByZXR1cm4gLUVJTlZBTC4KKyAqCisgKiBTZXQgKkBlbmRwdHIgdG8gcG9pbnQgcmlnaHQgYmV5b25kIHRoZSBwYXJzZWQgaW50ZWdlciAoZXZlbiBpZiB0aGUgaW50ZWdlcgorICogb3ZlcmZsb3dzIG9yIGlzIG5lZ2F0aXZlLCBhbGwgZGlnaXRzIHdpbGwgYmUgcGFyc2VkIGFuZCAqQGVuZHB0ciB3aWxsCisgKiBwb2ludCByaWdodCBiZXlvbmQgdGhlbSkuCisgKgorICogSWYgdGhlIGludGVnZXIgaXMgbmVnYXRpdmUsIHNldCAqQHZhbHVlIHRvIDAsIGFuZCByZXR1cm4gLUVSQU5HRS4KKyAqCisgKiBJZiB0aGUgaW50ZWdlciBvdmVyZmxvd3MgdW5zaWduZWQgbG9uZyBsb25nLCBzZXQgKkB2YWx1ZSB0bworICogVUxMT05HX01BWCwgYW5kIHJldHVybiAtRVJBTkdFLgorICoKKyAqIEVsc2UsIHNldCAqQHZhbHVlIHRvIHRoZSBwYXJzZWQgaW50ZWdlciwgYW5kIHJldHVybiAwLgorICovCitpbnQgcGFyc2VfdWludChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbHVlLCBjaGFyICoqZW5kcHRyLAorICAgICAgICAgICAgICAgaW50IGJhc2UpCit7CisgICAgaW50IHIgPSAwOworICAgIGNoYXIgKmVuZHAgPSAoY2hhciAqKXM7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbCA9IDA7CisKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgciA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGVycm5vID0gMDsKKyAgICB2YWwgPSBzdHJ0b3VsbChzLCAmZW5kcCwgYmFzZSk7CisgICAgaWYgKGVycm5vKSB7CisgICAgICAgIHIgPSAtZXJybm87CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGlmIChlbmRwID09IHMpIHsKKyAgICAgICAgciA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIC8qIG1ha2Ugc3VyZSB3ZSByZWplY3QgbmVnYXRpdmUgbnVtYmVyczogKi8KKyAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcykpIHsKKyAgICAgICAgcysrOworICAgIH0KKyAgICBpZiAoKnMgPT0gJy0nKSB7CisgICAgICAgIHZhbCA9IDA7CisgICAgICAgIHIgPSAtRVJBTkdFOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKK291dDoKKyAgICAqdmFsdWUgPSB2YWw7CisgICAgKmVuZHB0ciA9IGVuZHA7CisgICAgcmV0dXJuIHI7Cit9CisKKy8qKgorICogcGFyc2VfdWludF9mdWxsOgorICoKKyAqIEBzOiBTdHJpbmcgdG8gcGFyc2UKKyAqIEB2YWx1ZTogRGVzdGluYXRpb24gZm9yIHBhcnNlZCBpbnRlZ2VyIHZhbHVlCisgKiBAYmFzZTogaW50ZWdlciBiYXNlLCBiZXR3ZWVuIDIgYW5kIDM2IGluY2x1c2l2ZSwgb3IgMAorICoKKyAqIFBhcnNlIHVuc2lnbmVkIGludGVnZXIgZnJvbSBlbnRpcmUgc3RyaW5nCisgKgorICogSGF2ZSB0aGUgc2FtZSBiZWhhdmlvciBvZiBwYXJzZV91aW50KCksIGJ1dCB3aXRoIGFuIGFkZGl0aW9uYWwgY2hlY2sKKyAqIGZvciBhZGRpdGlvbmFsIGRhdGEgYWZ0ZXIgdGhlIHBhcnNlZCBudW1iZXIuIElmIGV4dHJhIGNoYXJhY3RlcnMgYXJlIHByZXNlbnQKKyAqIGFmdGVyIHRoZSBwYXJzZWQgbnVtYmVyLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gLUVJTlZBTCwgYW5kICpAdiB3aWxsCisgKiBiZSBzZXQgdG8gMC4KKyAqLworaW50IHBhcnNlX3VpbnRfZnVsbChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbHVlLCBpbnQgYmFzZSkKK3sKKyAgICBjaGFyICplbmRwOworICAgIGludCByOworCisgICAgciA9IHBhcnNlX3VpbnQocywgdmFsdWUsICZlbmRwLCBiYXNlKTsKKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIGlmICgqZW5kcCkgeworICAgICAgICAqdmFsdWUgPSAwOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IHFlbXVfcGFyc2VfZmQoY29uc3QgY2hhciAqcGFyYW0pCit7CisgICAgaW50IGZkOworICAgIGNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKyAgICBmZCA9IHN0cnRvbChwYXJhbSwgJmVuZHB0ciwgMTApOworICAgIGlmICgqZW5kcHRyIHx8IChmZCA9PSAwICYmIHBhcmFtID09IGVuZHB0cikpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gZmQ7Cit9CisKKy8qIHJvdW5kIGRvd24gdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMiovCitpbnQ2NF90IHBvdzJmbG9vcihpbnQ2NF90IHZhbHVlKQoreworICAgIGlmICghaXNfcG93ZXJfb2ZfMih2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSAweDgwMDAwMDAwMDAwMDAwMDBVTEwgPj4gY2x6NjQodmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiAgVUxFQjEyOCAoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MRUIxMjgpCisgKiBJbnB1dCBpcyBsaW1pdGVkIHRvIDE0LWJpdCBudW1iZXJzCisgKi8KK2ludCB1bGViMTI4X2VuY29kZV9zbWFsbCh1aW50OF90ICpvdXQsIHVpbnQzMl90IG4pCit7CisgICAgZ19hc3NlcnQobiA8PSAweDNmZmYpOworICAgIGlmIChuIDwgMHg4MCkgeworICAgICAgICAqb3V0KysgPSBuOworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAqb3V0KysgPSAobiAmIDB4N2YpIHwgMHg4MDsKKyAgICAgICAgKm91dCsrID0gbiA+PiA3OworICAgICAgICByZXR1cm4gMjsKKyAgICB9Cit9CisKK2ludCB1bGViMTI4X2RlY29kZV9zbWFsbChjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgKm4pCit7CisgICAgaWYgKCEoKmluICYgMHg4MCkpIHsKKyAgICAgICAgKm4gPSAqaW4rKzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKm4gPSAqaW4rKyAmIDB4N2Y7CisgICAgICAgIC8qIHdlIGV4Y2VlZCAxNCBiaXQgbnVtYmVyICovCisgICAgICAgIGlmICgqaW4gJiAweDgwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgKm4gfD0gKmluKysgPDwgNzsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorCisvKgorICogaGVscGVyIHRvIHBhcnNlIGRlYnVnIGVudmlyb25tZW50IHZhcmlhYmxlcworICovCitpbnQgcGFyc2VfZGVidWdfZW52KGNvbnN0IGNoYXIgKm5hbWUsIGludCBtYXgsIGludCBpbml0aWFsKQoreworICAgIGNoYXIgKmRlYnVnX2VudiA9IGdldGVudihuYW1lKTsKKyAgICBjaGFyICppbnYgPSBOVUxMOworICAgIGludCBkZWJ1ZzsKKworICAgIGlmICghZGVidWdfZW52KSB7CisgICAgICAgIHJldHVybiBpbml0aWFsOworICAgIH0KKyAgICBkZWJ1ZyA9IHN0cnRvbChkZWJ1Z19lbnYsICZpbnYsIDEwKTsKKyAgICBpZiAoaW52ID09IGRlYnVnX2VudikgeworICAgICAgICByZXR1cm4gaW5pdGlhbDsKKyAgICB9CisgICAgaWYgKGRlYnVnIDwgMCB8fCBkZWJ1ZyA+IG1heCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6ICVzIG5vdCBpbiBbMCwgJWRdIiwgbmFtZSwgbWF4KTsKKyAgICAgICAgcmV0dXJuIGluaXRpYWw7CisgICAgfQorICAgIHJldHVybiBkZWJ1ZzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9lbnZsaXN0LmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvZW52bGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYzA2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvZW52bGlzdC5jCkBAIC0wLDAgKzEsMjQxIEBACisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L3F1ZXVlLmgiCisjaW5jbHVkZSAicWVtdS9lbnZsaXN0LmgiCisKK3N0cnVjdCBlbnZsaXN0X2VudHJ5IHsKKwljb25zdCBjaGFyICpldl92YXI7CQkJLyogYWN0dWFsIGVudiB2YWx1ZSAqLworCVFMSVNUX0VOVFJZKGVudmxpc3RfZW50cnkpIGV2X2xpbms7Cit9OworCitzdHJ1Y3QgZW52bGlzdCB7CisJUUxJU1RfSEVBRCgsIGVudmxpc3RfZW50cnkpIGVsX2VudHJpZXM7CS8qIGFjdHVhbCBlbnRyaWVzICovCisJc2l6ZV90IGVsX2NvdW50OwkJCS8qIG51bWJlciBvZiBlbnRyaWVzICovCit9OworCitzdGF0aWMgaW50IGVudmxpc3RfcGFyc2UoZW52bGlzdF90ICplbnZsaXN0LAorICAgIGNvbnN0IGNoYXIgKmVudiwgaW50ICgqKShlbnZsaXN0X3QgKiwgY29uc3QgY2hhciAqKSk7CisKKy8qCisgKiBBbGxvY2F0ZXMgbmV3IGVudmxpc3QgYW5kIHJldHVybnMgcG9pbnRlciB0byB0aGF0IG9yCisgKiBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2Vudmxpc3RfdCAqCitlbnZsaXN0X2NyZWF0ZSh2b2lkKQoreworCWVudmxpc3RfdCAqZW52bGlzdDsKKworCWlmICgoZW52bGlzdCA9IG1hbGxvYyhzaXplb2YgKCplbnZsaXN0KSkpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlRTElTVF9JTklUKCZlbnZsaXN0LT5lbF9lbnRyaWVzKTsKKwllbnZsaXN0LT5lbF9jb3VudCA9IDA7CisKKwlyZXR1cm4gKGVudmxpc3QpOworfQorCisvKgorICogUmVsZWFzZXMgZ2l2ZW4gZW52bGlzdCBhbmQgaXRzIGVudHJpZXMuCisgKi8KK3ZvaWQKK2Vudmxpc3RfZnJlZShlbnZsaXN0X3QgKmVudmxpc3QpCit7CisJc3RydWN0IGVudmxpc3RfZW50cnkgKmVudHJ5OworCisJYXNzZXJ0KGVudmxpc3QgIT0gTlVMTCk7CisKKwl3aGlsZSAoZW52bGlzdC0+ZWxfZW50cmllcy5saF9maXJzdCAhPSBOVUxMKSB7CisJCWVudHJ5ID0gZW52bGlzdC0+ZWxfZW50cmllcy5saF9maXJzdDsKKwkJUUxJU1RfUkVNT1ZFKGVudHJ5LCBldl9saW5rKTsKKworCQlmcmVlKChjaGFyICopZW50cnktPmV2X3Zhcik7CisJCWZyZWUoZW50cnkpOworCX0KKwlmcmVlKGVudmxpc3QpOworfQorCisvKgorICogUGFyc2VzIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNldC9tb2RpZnkgZW52aXJvbm1lbnQKKyAqIHZhcmlhYmxlIGVudHJpZXMgYW5kIHVwZGF0ZXMgZ2l2ZW4gZW5saXN0IGFjY29yZGluZ2x5LgorICoKKyAqIEZvciBleGFtcGxlOgorICogICAgIGVudmxpc3RfcGFyc2UoZWwsICJIT01FPWZvbyxTSEVMTD0vYmluL3NoIik7CisgKgorICogaW5zZXJ0cy9zZXRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBIT01FIGFuZCBTSEVMTC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb3RoZXJ3aXNlLgorICovCitpbnQKK2Vudmxpc3RfcGFyc2Vfc2V0KGVudmxpc3RfdCAqZW52bGlzdCwgY29uc3QgY2hhciAqZW52KQoreworCXJldHVybiAoZW52bGlzdF9wYXJzZShlbnZsaXN0LCBlbnYsICZlbnZsaXN0X3NldGVudikpOworfQorCisvKgorICogUGFyc2VzIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHVuc2V0IGVudmlyb25tZW50IHZhcmlhYmxlCisgKiBlbnRyaWVzIGFuZCByZW1vdmVzIGdpdmVuIHZhcmlhYmxlcyBmcm9tIGdpdmVuIGVudmxpc3QuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZS4KKyAqLworaW50CitlbnZsaXN0X3BhcnNlX3Vuc2V0KGVudmxpc3RfdCAqZW52bGlzdCwgY29uc3QgY2hhciAqZW52KQoreworCXJldHVybiAoZW52bGlzdF9wYXJzZShlbnZsaXN0LCBlbnYsICZlbnZsaXN0X3Vuc2V0ZW52KSk7Cit9CisKKy8qCisgKiBQYXJzZXMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc2V0LCBtb2RpZnkgb3IgdW5zZXQgZW50cmllcworICogYW5kIGNhbGxzIGdpdmVuIGNhbGxiYWNrIGZvciBlYWNoIGVudHJ5LgorICoKKyAqIFJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorZW52bGlzdF9wYXJzZShlbnZsaXN0X3QgKmVudmxpc3QsIGNvbnN0IGNoYXIgKmVudiwKKyAgICBpbnQgKCpjYWxsYmFjaykoZW52bGlzdF90ICosIGNvbnN0IGNoYXIgKikpCit7CisJY2hhciAqdG1wZW52LCAqZW52dmFyOworCWNoYXIgKmVudnNhdmUgPSBOVUxMOworCisJYXNzZXJ0KGNhbGxiYWNrICE9IE5VTEwpOworCisJaWYgKChlbnZsaXN0ID09IE5VTEwpIHx8IChlbnYgPT0gTlVMTCkpCisJCXJldHVybiAoRUlOVkFMKTsKKworCS8qCisJICogV2UgbmVlZCB0byBtYWtlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBlbnYgc3RyaW5nCisJICogYXMgc3RydG9rX3IoMykgbW9kaWZpZXMgaXQgd2hpbGUgaXQgdG9rZW5pemVzLgorCSAqLworCWlmICgodG1wZW52ID0gc3RyZHVwKGVudikpID09IE5VTEwpCisJCXJldHVybiAoZXJybm8pOworCisJZW52dmFyID0gc3RydG9rX3IodG1wZW52LCAiLCIsICZlbnZzYXZlKTsKKwl3aGlsZSAoZW52dmFyICE9IE5VTEwpIHsKKwkJaWYgKCgqY2FsbGJhY2spKGVudmxpc3QsIGVudnZhcikgIT0gMCkgeworCQkJZnJlZSh0bXBlbnYpOworCQkJcmV0dXJuIChlcnJubyk7CisJCX0KKwkJZW52dmFyID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmZW52c2F2ZSk7CisJfQorCisJZnJlZSh0bXBlbnYpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBTZXRzIGVudmlyb25tZW50IHZhbHVlIHRvIGVudmxpc3QgaW4gc2ltaWxhciBtYW5uZXIKKyAqIHRoYW4gcHV0ZW52KDMpLgorICoKKyAqIFJldHVybnMgMCBpbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UuCisgKi8KK2ludAorZW52bGlzdF9zZXRlbnYoZW52bGlzdF90ICplbnZsaXN0LCBjb25zdCBjaGFyICplbnYpCit7CisJc3RydWN0IGVudmxpc3RfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwljb25zdCBjaGFyICplcV9zaWduOworCXNpemVfdCBlbnZuYW1lX2xlbjsKKworCWlmICgoZW52bGlzdCA9PSBOVUxMKSB8fCAoZW52ID09IE5VTEwpKQorCQlyZXR1cm4gKEVJTlZBTCk7CisKKwkvKiBmaW5kIG91dCBmaXJzdCBlcXVhbHMgc2lnbiBpbiBnaXZlbiBlbnYgKi8KKwlpZiAoKGVxX3NpZ24gPSBzdHJjaHIoZW52LCAnPScpKSA9PSBOVUxMKQorCQlyZXR1cm4gKEVJTlZBTCk7CisJZW52bmFtZV9sZW4gPSBlcV9zaWduIC0gZW52ICsgMTsKKworCS8qCisJICogSWYgdGhlcmUgYWxyZWFkeSBleGlzdHMgdmFyaWFibGUgd2l0aCBnaXZlbiBuYW1lCisJICogd2UgcmVtb3ZlIGFuZCByZWxlYXNlIGl0IGJlZm9yZSBhbGxvY2F0aW5nIGEgd2hvbGUKKwkgKiBuZXcgZW50cnkuCisJICovCisJZm9yIChlbnRyeSA9IGVudmxpc3QtPmVsX2VudHJpZXMubGhfZmlyc3Q7IGVudHJ5ICE9IE5VTEw7CisJICAgIGVudHJ5ID0gZW50cnktPmV2X2xpbmsubGVfbmV4dCkgeworCQlpZiAoc3RybmNtcChlbnRyeS0+ZXZfdmFyLCBlbnYsIGVudm5hbWVfbGVuKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVudHJ5ICE9IE5VTEwpIHsKKwkJUUxJU1RfUkVNT1ZFKGVudHJ5LCBldl9saW5rKTsKKwkJZnJlZSgoY2hhciAqKWVudHJ5LT5ldl92YXIpOworCQlmcmVlKGVudHJ5KTsKKwl9IGVsc2UgeworCQllbnZsaXN0LT5lbF9jb3VudCsrOworCX0KKworCWlmICgoZW50cnkgPSBtYWxsb2Moc2l6ZW9mICgqZW50cnkpKSkgPT0gTlVMTCkKKwkJcmV0dXJuIChlcnJubyk7CisJaWYgKChlbnRyeS0+ZXZfdmFyID0gc3RyZHVwKGVudikpID09IE5VTEwpIHsKKwkJZnJlZShlbnRyeSk7CisJCXJldHVybiAoZXJybm8pOworCX0KKwlRTElTVF9JTlNFUlRfSEVBRCgmZW52bGlzdC0+ZWxfZW50cmllcywgZW50cnksIGV2X2xpbmspOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFJlbW92ZXMgZ2l2ZW4gZW52IHZhbHVlIGZyb20gZW52bGlzdCBpbiBzaW1pbGFyIG1hbm5lcgorICogdGhhbiB1bnNldGVudigzKS4gIFJldHVybnMgMCBpbiBzdWNjZXNzLCBlcnJubyBvdGhlcndpc2UuCisgKi8KK2ludAorZW52bGlzdF91bnNldGVudihlbnZsaXN0X3QgKmVudmxpc3QsIGNvbnN0IGNoYXIgKmVudikKK3sKKwlzdHJ1Y3QgZW52bGlzdF9lbnRyeSAqZW50cnk7CisJc2l6ZV90IGVudm5hbWVfbGVuOworCisJaWYgKChlbnZsaXN0ID09IE5VTEwpIHx8IChlbnYgPT0gTlVMTCkpCisJCXJldHVybiAoRUlOVkFMKTsKKworCS8qIGVudiBpcyBub3QgYWxsb3dlZCB0byBjb250YWluICc9JyAqLworCWlmIChzdHJjaHIoZW52LCAnPScpICE9IE5VTEwpCisJCXJldHVybiAoRUlOVkFMKTsKKworCS8qCisJICogRmluZCBvdXQgdGhlIHJlcXVlc3RlZCBlbnRyeSBhbmQgcmVtb3ZlCisJICogaXQgZnJvbSB0aGUgbGlzdC4KKwkgKi8KKwllbnZuYW1lX2xlbiA9IHN0cmxlbihlbnYpOworCWZvciAoZW50cnkgPSBlbnZsaXN0LT5lbF9lbnRyaWVzLmxoX2ZpcnN0OyBlbnRyeSAhPSBOVUxMOworCSAgICBlbnRyeSA9IGVudHJ5LT5ldl9saW5rLmxlX25leHQpIHsKKwkJaWYgKHN0cm5jbXAoZW50cnktPmV2X3ZhciwgZW52LCBlbnZuYW1lX2xlbikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZW50cnkgIT0gTlVMTCkgeworCQlRTElTVF9SRU1PVkUoZW50cnksIGV2X2xpbmspOworCQlmcmVlKChjaGFyICopZW50cnktPmV2X3Zhcik7CisJCWZyZWUoZW50cnkpOworCisJCWVudmxpc3QtPmVsX2NvdW50LS07CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGdpdmVuIGVudmxpc3QgYXMgYXJyYXkgb2Ygc3RyaW5ncyAoaW4gc2FtZSBmb3JtIHRoYXQKKyAqIGdsb2JhbCB2YXJpYWJsZSBlbnZpcm9uIGlzKS4gIENhbGxlciBtdXN0IGZyZWUgcmV0dXJuZWQgbWVtb3J5CisgKiBieSBjYWxsaW5nIGZyZWUoMykgZm9yIGVhY2ggZWxlbWVudCBhbmQgZm9yIHRoZSBhcnJheS4gIFJldHVybmVkCisgKiBhcnJheSBhbmQgZ2l2ZW4gZW52bGlzdCBhcmUgbm90IHJlbGF0ZWQgKG5vIGNvbW1vbiByZWZlcmVuY2VzKS4KKyAqCisgKiBJZiBjYWxsZXIgcHJvdmlkZXMgY291bnQgcG9pbnRlciwgbnVtYmVyIG9mIGl0ZW1zIGluIGFycmF5IGlzCisgKiBzdG9yZWQgdGhlcmUuICBJbiBjYXNlIG9mIGVycm9yLCBOVUxMIGlzIHJldHVybmVkIGFuZCBubyBtZW1vcnkKKyAqIGlzIGFsbG9jYXRlZC4KKyAqLworY2hhciAqKgorZW52bGlzdF90b19lbnZpcm9uKGNvbnN0IGVudmxpc3RfdCAqZW52bGlzdCwgc2l6ZV90ICpjb3VudCkKK3sKKwlzdHJ1Y3QgZW52bGlzdF9lbnRyeSAqZW50cnk7CisJY2hhciAqKmVudiwgKipwZW52OworCisJcGVudiA9IGVudiA9IG1hbGxvYygoZW52bGlzdC0+ZWxfY291bnQgKyAxKSAqIHNpemVvZiAoY2hhciAqKSk7CisJaWYgKGVudiA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJZm9yIChlbnRyeSA9IGVudmxpc3QtPmVsX2VudHJpZXMubGhfZmlyc3Q7IGVudHJ5ICE9IE5VTEw7CisJICAgIGVudHJ5ID0gZW50cnktPmV2X2xpbmsubGVfbmV4dCkgeworCQkqKHBlbnYrKykgPSBzdHJkdXAoZW50cnktPmV2X3Zhcik7CisJfQorCSpwZW52ID0gTlVMTDsgLyogTlVMTCB0ZXJtaW5hdGUgdGhlIGxpc3QgKi8KKworCWlmIChjb3VudCAhPSBOVUxMKQorCQkqY291bnQgPSBlbnZsaXN0LT5lbF9jb3VudDsKKworCXJldHVybiAoZW52KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9lcnJvci5jIGIvYW5kcm9pZC9xZW11MS91dGlsL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlMzYyYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9lcnJvci5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogUUVNVSBFcnJvciBPYmplY3RzCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcuTElCIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWFwaS9lcnJvci5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3Fqc29uLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWRpY3QuaCIKKyNpbmNsdWRlICJxYXBpLXR5cGVzLmgiCisjaW5jbHVkZSAicWFwaS9xbXAvcWVycm9yLmgiCisKK3N0cnVjdCBFcnJvcgoreworICAgIGNoYXIgKm1zZzsKKyAgICBFcnJvckNsYXNzIGVycl9jbGFzczsKK307CisKK3ZvaWQgZXJyb3Jfc2V0KEVycm9yICoqZXJycCwgRXJyb3JDbGFzcyBlcnJfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIEVycm9yICplcnI7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAgIGlmIChlcnJwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoKmVycnAgPT0gTlVMTCk7CisKKyAgICBlcnIgPSBnX21hbGxvYzAoc2l6ZW9mKCplcnIpKTsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIGVyci0+bXNnID0gZ19zdHJkdXBfdnByaW50ZihmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGVyci0+ZXJyX2NsYXNzID0gZXJyX2NsYXNzOworCisgICAgKmVycnAgPSBlcnI7CisKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworfQorCit2b2lkIGVycm9yX3NldF9lcnJubyhFcnJvciAqKmVycnAsIGludCBvc19lcnJubywgRXJyb3JDbGFzcyBlcnJfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICBFcnJvciAqZXJyOworICAgIGNoYXIgKm1zZzE7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKKworICAgIGlmIChlcnJwID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhc3NlcnQoKmVycnAgPT0gTlVMTCk7CisKKyAgICBlcnIgPSBnX21hbGxvYzAoc2l6ZW9mKCplcnIpKTsKKworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIG1zZzEgPSBnX3N0cmR1cF92cHJpbnRmKGZtdCwgYXApOworICAgIGlmIChvc19lcnJubyAhPSAwKSB7CisgICAgICAgIGVyci0+bXNnID0gZ19zdHJkdXBfcHJpbnRmKCIlczogJXMiLCBtc2cxLCBzdHJlcnJvcihvc19lcnJubykpOworICAgICAgICBnX2ZyZWUobXNnMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyLT5tc2cgPSBtc2cxOworICAgIH0KKyAgICB2YV9lbmQoYXApOworICAgIGVyci0+ZXJyX2NsYXNzID0gZXJyX2NsYXNzOworCisgICAgKmVycnAgPSBlcnI7CisKKyAgICBlcnJubyA9IHNhdmVkX2Vycm5vOworfQorCit2b2lkIGVycm9yX3NldGdfZmlsZV9vcGVuKEVycm9yICoqZXJycCwgaW50IG9zX2Vycm5vLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBlcnJvcl9zZXRnX2Vycm5vKGVycnAsIG9zX2Vycm5vLCAiQ291bGQgbm90IG9wZW4gJyVzJyIsIGZpbGVuYW1lKTsKK30KKworI2lmZGVmIF9XSU4zMgorCit2b2lkIGVycm9yX3NldF93aW4zMihFcnJvciAqKmVycnAsIGludCB3aW4zMl9lcnIsIEVycm9yQ2xhc3MgZXJyX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgRXJyb3IgKmVycjsKKyAgICBjaGFyICptc2cxOworICAgIHZhX2xpc3QgYXA7CisKKyAgICBpZiAoZXJycCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXNzZXJ0KCplcnJwID09IE5VTEwpOworCisgICAgZXJyID0gZ19tYWxsb2MwKHNpemVvZigqZXJyKSk7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICBtc2cxID0gZ19zdHJkdXBfdnByaW50ZihmbXQsIGFwKTsKKyAgICBpZiAod2luMzJfZXJyICE9IDApIHsKKyAgICAgICAgY2hhciAqbXNnMiA9IGdfd2luMzJfZXJyb3JfbWVzc2FnZSh3aW4zMl9lcnIpOworICAgICAgICBlcnItPm1zZyA9IGdfc3RyZHVwX3ByaW50ZigiJXM6ICVzIChlcnJvcjogJXgpIiwgbXNnMSwgbXNnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXdpbjMyX2Vycik7CisgICAgICAgIGdfZnJlZShtc2cyKTsKKyAgICAgICAgZ19mcmVlKG1zZzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyci0+bXNnID0gbXNnMTsKKyAgICB9CisgICAgdmFfZW5kKGFwKTsKKyAgICBlcnItPmVycl9jbGFzcyA9IGVycl9jbGFzczsKKworICAgICplcnJwID0gZXJyOworfQorCisjZW5kaWYKKworRXJyb3IgKmVycm9yX2NvcHkoY29uc3QgRXJyb3IgKmVycikKK3sKKyAgICBFcnJvciAqZXJyX25ldzsKKworICAgIGVycl9uZXcgPSBnX21hbGxvYzAoc2l6ZW9mKCplcnIpKTsKKyAgICBlcnJfbmV3LT5tc2cgPSBnX3N0cmR1cChlcnItPm1zZyk7CisgICAgZXJyX25ldy0+ZXJyX2NsYXNzID0gZXJyLT5lcnJfY2xhc3M7CisKKyAgICByZXR1cm4gZXJyX25ldzsKK30KKworYm9vbCBlcnJvcl9pc19zZXQoRXJyb3IgKiplcnJwKQoreworICAgIHJldHVybiAoZXJycCAmJiAqZXJycCk7Cit9CisKK0Vycm9yQ2xhc3MgZXJyb3JfZ2V0X2NsYXNzKGNvbnN0IEVycm9yICplcnIpCit7CisgICAgcmV0dXJuIGVyci0+ZXJyX2NsYXNzOworfQorCitjb25zdCBjaGFyICplcnJvcl9nZXRfcHJldHR5KEVycm9yICplcnIpCit7CisgICAgcmV0dXJuIGVyci0+bXNnOworfQorCit2b2lkIGVycm9yX2ZyZWUoRXJyb3IgKmVycikKK3sKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGdfZnJlZShlcnItPm1zZyk7CisgICAgICAgIGdfZnJlZShlcnIpOworICAgIH0KK30KKwordm9pZCBlcnJvcl9wcm9wYWdhdGUoRXJyb3IgKipkc3RfZXJyLCBFcnJvciAqbG9jYWxfZXJyKQoreworICAgIGlmIChkc3RfZXJyICYmICEqZHN0X2VycikgeworICAgICAgICAqZHN0X2VyciA9IGxvY2FsX2VycjsKKyAgICB9IGVsc2UgaWYgKGxvY2FsX2VycikgeworICAgICAgICBlcnJvcl9mcmVlKGxvY2FsX2Vycik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL2hleGR1bXAuYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9oZXhkdW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5YjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9oZXhkdW1wLmMKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIEhlbHBlciB0byBoZXhkdW1wIGEgYnVmZmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBHZXJkIEhvZmZtYW5uIDxrcmF4ZWxAcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBQZXRlciBDcm9zdGh3YWl0ZSA8cGV0ZXIuY3Jvc3Rod2FpdGVAeGlsaW54LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBYaWxpbngsIEluYworICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKiBDb250cmlidXRpb25zIGFmdGVyIDIwMTItMDEtMTMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHUEwsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCit2b2lkIHFlbXVfaGV4ZHVtcChjb25zdCBjaGFyICpidWYsIEZJTEUgKmZwLCBjb25zdCBjaGFyICpwcmVmaXgsIHNpemVfdCBzaXplKQoreworICAgIHVuc2lnbmVkIGludCBiOworCisgICAgZm9yIChiID0gMDsgYiA8IHNpemU7IGIrKykgeworICAgICAgICBpZiAoKGIgJSAxNikgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihmcCwgIiVzOiAlMDR4OiIsIHByZWZpeCwgYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChiICUgNCkgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihmcCwgIiAiKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiICUwMngiLCAodW5zaWduZWQgY2hhcilidWZbYl0pOworICAgICAgICBpZiAoKGIgJSAxNikgPT0gMTUpIHsKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoYiAlIDE2KSAhPSAwKSB7CisgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9ob3N0LXV0aWxzLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvaG9zdC11dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNzg0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvaG9zdC11dGlscy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBVdGlsaXR5IGNvbXB1dGUgb3BlcmF0aW9ucyB1c2VkIGJ5IHRyYW5zbGF0ZWQgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQXVyZWxpZW4gSmFybm8KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInFlbXUvaG9zdC11dGlscy5oIgorCisvKiBMb25nIGludGVnZXIgaGVscGVycyAqLworI2lmbmRlZiBDT05GSUdfSU5UMTI4CitzdGF0aWMgaW5saW5lIHZvaWQgbXVsNjQodWludDY0X3QgKnBsb3csIHVpbnQ2NF90ICpwaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBhLCB1aW50NjRfdCBiKQoreworICAgIHR5cGVkZWYgdW5pb24geworICAgICAgICB1aW50NjRfdCBsbDsKKyAgICAgICAgc3RydWN0IHsKKyNpZmRlZiBIT1NUX1dPUkRTX0JJR0VORElBTgorICAgICAgICAgICAgdWludDMyX3QgaGlnaCwgbG93OworI2Vsc2UKKyAgICAgICAgICAgIHVpbnQzMl90IGxvdywgaGlnaDsKKyNlbmRpZgorICAgICAgICB9IGw7CisgICAgfSBMTDsKKyAgICBMTCBybCwgcm0sIHJuLCByaCwgYTAsIGIwOworICAgIHVpbnQ2NF90IGM7CisKKyAgICBhMC5sbCA9IGE7CisgICAgYjAubGwgPSBiOworCisgICAgcmwubGwgPSAodWludDY0X3QpYTAubC5sb3cgKiBiMC5sLmxvdzsKKyAgICBybS5sbCA9ICh1aW50NjRfdClhMC5sLmxvdyAqIGIwLmwuaGlnaDsKKyAgICBybi5sbCA9ICh1aW50NjRfdClhMC5sLmhpZ2ggKiBiMC5sLmxvdzsKKyAgICByaC5sbCA9ICh1aW50NjRfdClhMC5sLmhpZ2ggKiBiMC5sLmhpZ2g7CisKKyAgICBjID0gKHVpbnQ2NF90KXJsLmwuaGlnaCArIHJtLmwubG93ICsgcm4ubC5sb3c7CisgICAgcmwubC5oaWdoID0gYzsKKyAgICBjID4+PSAzMjsKKyAgICBjID0gYyArIHJtLmwuaGlnaCArIHJuLmwuaGlnaCArIHJoLmwubG93OworICAgIHJoLmwubG93ID0gYzsKKyAgICByaC5sLmhpZ2ggKz0gKHVpbnQzMl90KShjID4+IDMyKTsKKworICAgICpwbG93ID0gcmwubGw7CisgICAgKnBoaWdoID0gcmgubGw7Cit9CisKKy8qIFVuc2lnbmVkIDY0eDY0IC0+IDEyOCBtdWx0aXBsaWNhdGlvbiAqLwordm9pZCBtdWx1NjQgKHVpbnQ2NF90ICpwbG93LCB1aW50NjRfdCAqcGhpZ2gsIHVpbnQ2NF90IGEsIHVpbnQ2NF90IGIpCit7CisgICAgbXVsNjQocGxvdywgcGhpZ2gsIGEsIGIpOworfQorCisvKiBTaWduZWQgNjR4NjQgLT4gMTI4IG11bHRpcGxpY2F0aW9uICovCit2b2lkIG11bHM2NCAodWludDY0X3QgKnBsb3csIHVpbnQ2NF90ICpwaGlnaCwgaW50NjRfdCBhLCBpbnQ2NF90IGIpCit7CisgICAgdWludDY0X3Qgcmg7CisKKyAgICBtdWw2NChwbG93LCAmcmgsIGEsIGIpOworCisgICAgLyogQWRqdXN0IGZvciBzaWducy4gICovCisgICAgaWYgKGIgPCAwKSB7CisgICAgICAgIHJoIC09IGE7CisgICAgfQorICAgIGlmIChhIDwgMCkgeworICAgICAgICByaCAtPSBiOworICAgIH0KKyAgICAqcGhpZ2ggPSByaDsKK30KKyNlbmRpZiAvKiAhQ09ORklHX0lOVDEyOCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL2lvdi5jIGIvYW5kcm9pZC9xZW11MS91dGlsL2lvdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvaW92LmMKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBIZWxwZXJzIGZvciBnZXR0aW5nIGxpbmVhcml6ZWQgYnVmZmVycyBmcm9tIGlvdiAvIGZpbGxpbmcgYnVmZmVycyBpbnRvIGlvdnMKKyAqCisgKiBDb3B5cmlnaHQgSUJNLCBDb3JwLiAyMDA3LCAyMDA4CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqIEF1dGhvcihzKToKKyAqICBBbnRob255IExpZ3VvcmkgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKiAgQW1pdCBTaGFoIDxhbWl0LnNoYWhAcmVkaGF0LmNvbT4KKyAqICBNaWNoYWVsIFRva2FyZXYgPG1qdEB0bHMubXNrLnJ1PgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMi4gIFNlZQorICogdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKiBDb250cmlidXRpb25zIGFmdGVyIDIwMTItMDEtMTMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHUEwsIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJxZW11L2lvdi5oIgorCisjaWZkZWYgX1dJTjMyCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbHNlCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworc2l6ZV90IGlvdl9mcm9tX2J1Zihjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgaW50IGlvdl9jbnQsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKQoreworICAgIHNpemVfdCBkb25lOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDAsIGRvbmUgPSAwOyAob2Zmc2V0IHx8IGRvbmUgPCBieXRlcykgJiYgaSA8IGlvdl9jbnQ7IGkrKykgeworICAgICAgICBpZiAob2Zmc2V0IDwgaW92W2ldLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBNSU4oaW92W2ldLmlvdl9sZW4gLSBvZmZzZXQsIGJ5dGVzIC0gZG9uZSk7CisgICAgICAgICAgICBtZW1jcHkoaW92W2ldLmlvdl9iYXNlICsgb2Zmc2V0LCBidWYgKyBkb25lLCBsZW4pOworICAgICAgICAgICAgZG9uZSArPSBsZW47CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0IC09IGlvdltpXS5pb3ZfbGVuOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3NpemVfdCBpb3ZfdG9fYnVmKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKQoreworICAgIHNpemVfdCBkb25lOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDAsIGRvbmUgPSAwOyAob2Zmc2V0IHx8IGRvbmUgPCBieXRlcykgJiYgaSA8IGlvdl9jbnQ7IGkrKykgeworICAgICAgICBpZiAob2Zmc2V0IDwgaW92W2ldLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBNSU4oaW92W2ldLmlvdl9sZW4gLSBvZmZzZXQsIGJ5dGVzIC0gZG9uZSk7CisgICAgICAgICAgICBtZW1jcHkoYnVmICsgZG9uZSwgaW92W2ldLmlvdl9iYXNlICsgb2Zmc2V0LCBsZW4pOworICAgICAgICAgICAgZG9uZSArPSBsZW47CisgICAgICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb2Zmc2V0IC09IGlvdltpXS5pb3ZfbGVuOworICAgICAgICB9CisgICAgfQorICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3NpemVfdCBpb3ZfbWVtc2V0KGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIGludCBmaWxsYywgc2l6ZV90IGJ5dGVzKQoreworICAgIHNpemVfdCBkb25lOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDAsIGRvbmUgPSAwOyAob2Zmc2V0IHx8IGRvbmUgPCBieXRlcykgJiYgaSA8IGlvdl9jbnQ7IGkrKykgeworICAgICAgICBpZiAob2Zmc2V0IDwgaW92W2ldLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIHNpemVfdCBsZW4gPSBNSU4oaW92W2ldLmlvdl9sZW4gLSBvZmZzZXQsIGJ5dGVzIC0gZG9uZSk7CisgICAgICAgICAgICBtZW1zZXQoaW92W2ldLmlvdl9iYXNlICsgb2Zmc2V0LCBmaWxsYywgbGVuKTsKKyAgICAgICAgICAgIGRvbmUgKz0gbGVuOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSBpb3ZbaV0uaW92X2xlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQob2Zmc2V0ID09IDApOworICAgIHJldHVybiBkb25lOworfQorCitzaXplX3QgaW92X3NpemUoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGNvbnN0IHVuc2lnbmVkIGludCBpb3ZfY250KQoreworICAgIHNpemVfdCBsZW47CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBsZW4gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBpb3ZfY250OyBpKyspIHsKKyAgICAgICAgbGVuICs9IGlvdltpXS5pb3ZfbGVuOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCisvKiBoZWxwZXIgZnVuY3Rpb24gZm9yIGlvdl9zZW5kX3JlY3YoKSAqLworc3RhdGljIHNzaXplX3QKK2RvX3NlbmRfcmVjdihpbnQgc29ja2ZkLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgaW92X2NudCwgYm9vbCBkb19zZW5kKQoreworI2lmZGVmIENPTkZJR19QT1NJWAorICAgIHNzaXplX3QgcmV0OworICAgIHN0cnVjdCBtc2doZHIgbXNnOworICAgIG1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisgICAgbXNnLm1zZ19pb3YgPSBpb3Y7CisgICAgbXNnLm1zZ19pb3ZsZW4gPSBpb3ZfY250OworICAgIGRvIHsKKyAgICAgICAgcmV0ID0gZG9fc2VuZAorICAgICAgICAgICAgPyBzZW5kbXNnKHNvY2tmZCwgJm1zZywgMCkKKyAgICAgICAgICAgIDogcmVjdm1zZyhzb2NrZmQsICZtc2csIDApOworICAgIH0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIC8qIGVsc2Ugc2VuZCBwaWVjZS1ieS1waWVjZSAqLworICAgIC8qWFhYIE5vdGU6IHdpbmRvd3MgaGFzIFdTQVNlbmQoKSBhbmQgV1NBUmVjdigpICovCisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgc3NpemVfdCByZXQgPSAwOworICAgIHdoaWxlIChpIDwgaW92X2NudCkgeworICAgICAgICBzc2l6ZV90IHIgPSBkb19zZW5kCisgICAgICAgICAgICA/IHNlbmQoc29ja2ZkLCBpb3ZbaV0uaW92X2Jhc2UsIGlvdltpXS5pb3ZfbGVuLCAwKQorICAgICAgICAgICAgOiByZWN2KHNvY2tmZCwgaW92W2ldLmlvdl9iYXNlLCBpb3ZbaV0uaW92X2xlbiwgMCk7CisgICAgICAgIGlmIChyID4gMCkgeworICAgICAgICAgICAgcmV0ICs9IHI7CisgICAgICAgIH0gZWxzZSBpZiAoIXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGVsc2UgaXQgaXMgc29tZSAib3RoZXIiIGVycm9yLAorICAgICAgICAgICAgICogb25seSByZXR1cm4gaWYgdGhlcmUgd2FzIG5vIGRhdGEgcHJvY2Vzc2VkLiAqLworICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiByZXQ7CisjZW5kaWYKK30KKworc3NpemVfdCBpb3Zfc2VuZF9yZWN2KGludCBzb2NrZmQsIHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBpb3ZfY250LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX3NlbmQpCit7CisgICAgc3NpemVfdCB0b3RhbCA9IDA7CisgICAgc3NpemVfdCByZXQ7CisgICAgc2l6ZV90IG9yaWdfbGVuLCB0YWlsOworICAgIHVuc2lnbmVkIG5pb3Y7CisKKyAgICB3aGlsZSAoYnl0ZXMgPiAwKSB7CisgICAgICAgIC8qIEZpbmQgdGhlIHN0YXJ0IHBvc2l0aW9uLCBza2lwcGluZyBgb2Zmc2V0JyBieXRlczoKKyAgICAgICAgICogZmlyc3QsIHNraXAgYWxsIGZ1bGwtc2l6ZWQgdmVjdG9yIGVsZW1lbnRzLCAqLworICAgICAgICBmb3IgKG5pb3YgPSAwOyBuaW92IDwgaW92X2NudCAmJiBvZmZzZXQgPj0gaW92W25pb3ZdLmlvdl9sZW47ICsrbmlvdikgeworICAgICAgICAgICAgb2Zmc2V0IC09IGlvdltuaW92XS5pb3ZfbGVuOworICAgICAgICB9CisKKyAgICAgICAgLyogbmlvdiA9PSBpb3ZfY250IHdvdWxkIG9ubHkgYmUgdmFsaWQgaWYgYnl0ZXMgPT0gMCwgd2hpY2gKKyAgICAgICAgICogd2UgYWxyZWFkeSBydWxlZCBvdXQgaW4gdGhlIGxvb3AgY29uZGl0aW9uLiAgKi8KKyAgICAgICAgYXNzZXJ0KG5pb3YgPCBpb3ZfY250KTsKKyAgICAgICAgaW92ICs9IG5pb3Y7CisgICAgICAgIGlvdl9jbnQgLT0gbmlvdjsKKworICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgICAvKiBzZWNvbmQsIHNraXAgYG9mZnNldCcgYnl0ZXMgZnJvbSB0aGUgKG5vdykgZmlyc3QgZWxlbWVudCwKKyAgICAgICAgICAgICAqIHVuZG8gaXQgb24gZXhpdCAqLworICAgICAgICAgICAgaW92WzBdLmlvdl9iYXNlICs9IG9mZnNldDsKKyAgICAgICAgICAgIGlvdlswXS5pb3ZfbGVuIC09IG9mZnNldDsKKyAgICAgICAgfQorICAgICAgICAvKiBGaW5kIHRoZSBlbmQgcG9zaXRpb24gc2tpcHBpbmcgYGJ5dGVzJyBieXRlczogKi8KKyAgICAgICAgLyogZmlyc3QsIHNraXAgYWxsIGZ1bGwtc2l6ZWQgZWxlbWVudHMgKi8KKyAgICAgICAgdGFpbCA9IGJ5dGVzOworICAgICAgICBmb3IgKG5pb3YgPSAwOyBuaW92IDwgaW92X2NudCAmJiBpb3Zbbmlvdl0uaW92X2xlbiA8PSB0YWlsOyArK25pb3YpIHsKKyAgICAgICAgICAgIHRhaWwgLT0gaW92W25pb3ZdLmlvdl9sZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRhaWwpIHsKKyAgICAgICAgICAgIC8qIHNlY29uZCwgZml4dXAgdGhlIGxhc3QgZWxlbWVudCwgYW5kIHJlbWVtYmVyIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgICogbGVuZ3RoICovCisgICAgICAgICAgICBhc3NlcnQobmlvdiA8IGlvdl9jbnQpOworICAgICAgICAgICAgYXNzZXJ0KGlvdltuaW92XS5pb3ZfbGVuID4gdGFpbCk7CisgICAgICAgICAgICBvcmlnX2xlbiA9IGlvdltuaW92XS5pb3ZfbGVuOworICAgICAgICAgICAgaW92W25pb3YrK10uaW92X2xlbiA9IHRhaWw7CisgICAgICAgICAgICByZXQgPSBkb19zZW5kX3JlY3Yoc29ja2ZkLCBpb3YsIG5pb3YsIGRvX3NlbmQpOworICAgICAgICAgICAgLyogVW5kbyB0aGUgY2hhbmdlcyBhYm92ZSBiZWZvcmUgY2hlY2tpbmcgZm9yIGVycm9ycyAqLworICAgICAgICAgICAgaW92W25pb3YtMV0uaW92X2xlbiA9IG9yaWdfbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gZG9fc2VuZF9yZWN2KHNvY2tmZCwgaW92LCBuaW92LCBkb19zZW5kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0KSB7CisgICAgICAgICAgICBpb3ZbMF0uaW92X2Jhc2UgLT0gb2Zmc2V0OworICAgICAgICAgICAgaW92WzBdLmlvdl9sZW4gKz0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGFzc2VydChlcnJubyAhPSBFSU5UUik7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOICYmIHRvdGFsID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXQgPT0gMCAmJiAhZG9fc2VuZCkgeworICAgICAgICAgICAgLyogcmVjdiByZXR1cm5zIDAgd2hlbiB0aGUgcGVlciBoYXMgcGVyZm9ybWVkIGFuIG9yZGVybHkKKyAgICAgICAgICAgICAqIHNodXRkb3duLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBQcmVwYXJlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8KKyAgICAgICAgb2Zmc2V0ICs9IHJldDsKKyAgICAgICAgdG90YWwgKz0gcmV0OworICAgICAgICBieXRlcyAtPSByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsOworfQorCisKK3ZvaWQgaW92X2hleGR1bXAoY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGNvbnN0IHVuc2lnbmVkIGludCBpb3ZfY250LAorICAgICAgICAgICAgICAgICBGSUxFICpmcCwgY29uc3QgY2hhciAqcHJlZml4LCBzaXplX3QgbGltaXQpCit7CisgICAgdW5zaWduZWQgaW50IHY7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGNoYXIgKmJ1ZjsKKworICAgIGZvciAodiA9IDA7IHYgPCBpb3ZfY250OyB2KyspIHsKKyAgICAgICAgc2l6ZSArPSBpb3Zbdl0uaW92X2xlbjsKKyAgICB9CisgICAgc2l6ZSA9IHNpemUgPiBsaW1pdCA/IGxpbWl0IDogc2l6ZTsKKyAgICBidWYgPSBnX21hbGxvYyhzaXplKTsKKyAgICBpb3ZfdG9fYnVmKGlvdiwgaW92X2NudCwgMCwgYnVmLCBzaXplKTsKKyAgICBxZW11X2hleGR1bXAoYnVmLCBmcCwgcHJlZml4LCBzaXplKTsKKyAgICBnX2ZyZWUoYnVmKTsKK30KKwordW5zaWduZWQgaW92X2NvcHkoc3RydWN0IGlvdmVjICpkc3RfaW92LCB1bnNpZ25lZCBpbnQgZHN0X2lvdl9jbnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgaW92X2NudCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworICAgIHNpemVfdCBsZW47CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpb3ZfY250ICYmIGogPCBkc3RfaW92X2NudCAmJiBieXRlczsgaSsrKSB7CisgICAgICAgIGlmIChvZmZzZXQgPj0gaW92W2ldLmlvdl9sZW4pIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSBpb3ZbaV0uaW92X2xlbjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGxlbiA9IE1JTihieXRlcywgaW92W2ldLmlvdl9sZW4gLSBvZmZzZXQpOworCisgICAgICAgIGRzdF9pb3Zbal0uaW92X2Jhc2UgPSBpb3ZbaV0uaW92X2Jhc2UgKyBvZmZzZXQ7CisgICAgICAgIGRzdF9pb3Zbal0uaW92X2xlbiA9IGxlbjsKKyAgICAgICAgaisrOworICAgICAgICBieXRlcyAtPSBsZW47CisgICAgICAgIG9mZnNldCA9IDA7CisgICAgfQorICAgIGFzc2VydChvZmZzZXQgPT0gMCk7CisgICAgcmV0dXJuIGo7Cit9CisKKy8qIGlvIHZlY3RvcnMgKi8KKwordm9pZCBxZW11X2lvdmVjX2luaXQoUUVNVUlPVmVjdG9yICpxaW92LCBpbnQgYWxsb2NfaGludCkKK3sKKyAgICBxaW92LT5pb3YgPSBnX21hbGxvYyhhbGxvY19oaW50ICogc2l6ZW9mKHN0cnVjdCBpb3ZlYykpOworICAgIHFpb3YtPm5pb3YgPSAwOworICAgIHFpb3YtPm5hbGxvYyA9IGFsbG9jX2hpbnQ7CisgICAgcWlvdi0+c2l6ZSA9IDA7Cit9CisKK3ZvaWQgcWVtdV9pb3ZlY19pbml0X2V4dGVybmFsKFFFTVVJT1ZlY3RvciAqcWlvdiwgc3RydWN0IGlvdmVjICppb3YsIGludCBuaW92KQoreworICAgIGludCBpOworCisgICAgcWlvdi0+aW92ID0gaW92OworICAgIHFpb3YtPm5pb3YgPSBuaW92OworICAgIHFpb3YtPm5hbGxvYyA9IC0xOworICAgIHFpb3YtPnNpemUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuaW92OyBpKyspCisgICAgICAgIHFpb3YtPnNpemUgKz0gaW92W2ldLmlvdl9sZW47Cit9CisKK3ZvaWQgcWVtdV9pb3ZlY19hZGQoUUVNVUlPVmVjdG9yICpxaW92LCB2b2lkICpiYXNlLCBzaXplX3QgbGVuKQoreworICAgIGFzc2VydChxaW92LT5uYWxsb2MgIT0gLTEpOworCisgICAgaWYgKHFpb3YtPm5pb3YgPT0gcWlvdi0+bmFsbG9jKSB7CisgICAgICAgIHFpb3YtPm5hbGxvYyA9IDIgKiBxaW92LT5uYWxsb2MgKyAxOworICAgICAgICBxaW92LT5pb3YgPSBnX3JlYWxsb2MocWlvdi0+aW92LCBxaW92LT5uYWxsb2MgKiBzaXplb2Yoc3RydWN0IGlvdmVjKSk7CisgICAgfQorICAgIHFpb3YtPmlvdltxaW92LT5uaW92XS5pb3ZfYmFzZSA9IGJhc2U7CisgICAgcWlvdi0+aW92W3Fpb3YtPm5pb3ZdLmlvdl9sZW4gPSBsZW47CisgICAgcWlvdi0+c2l6ZSArPSBsZW47CisgICAgKytxaW92LT5uaW92OworfQorCisvKgorICogQ29uY2F0ZW5hdGVzIChwYXJ0aWFsKSBpb3ZlY3MgZnJvbSBzcmNfaW92IHRvIHRoZSBlbmQgb2YgZHN0LgorICogSXQgc3RhcnRzIGNvcHlpbmcgYWZ0ZXIgc2tpcHBpbmcgYHNvZmZzZXQnIGJ5dGVzIGF0IHRoZQorICogYmVnaW5uaW5nIG9mIHNyYyBhbmQgYWRkcyBpbmRpdmlkdWFsIHZlY3RvcnMgZnJvbSBzcmMgdG8KKyAqIGRzdCBjb3BpZXMgdXAgdG8gYHNieXRlcycgYnl0ZXMgdG90YWwsIG9yIHVwIHRvIHRoZSBlbmQKKyAqIG9mIHNyY19pb3YgaWYgaXQgY29tZXMgZmlyc3QuICBUaGlzIHdheSwgaXQgaXMgb2theSB0byBzcGVjaWZ5CisgKiB2ZXJ5IGxhcmdlIHZhbHVlIGZvciBgc2J5dGVzJyB0byBpbmRpY2F0ZSAidXAgdG8gdGhlIGVuZAorICogb2Ygc3JjIi4KKyAqIE9ubHkgdmVjdG9yIHBvaW50ZXJzIGFyZSBwcm9jZXNzZWQsIG5vdCB0aGUgYWN0dWFsIGRhdGEgYnVmZmVycy4KKyAqLwordm9pZCBxZW11X2lvdmVjX2NvbmNhdF9pb3YoUUVNVUlPVmVjdG9yICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW92ZWMgKnNyY19pb3YsIHVuc2lnbmVkIGludCBzcmNfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNvZmZzZXQsIHNpemVfdCBzYnl0ZXMpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgc2l6ZV90IGRvbmU7CisKKyAgICBpZiAoIXNieXRlcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChkc3QtPm5hbGxvYyAhPSAtMSk7CisgICAgZm9yIChpID0gMCwgZG9uZSA9IDA7IGRvbmUgPCBzYnl0ZXMgJiYgaSA8IHNyY19jbnQ7IGkrKykgeworICAgICAgICBpZiAoc29mZnNldCA8IHNyY19pb3ZbaV0uaW92X2xlbikgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IE1JTihzcmNfaW92W2ldLmlvdl9sZW4gLSBzb2Zmc2V0LCBzYnl0ZXMgLSBkb25lKTsKKyAgICAgICAgICAgIHFlbXVfaW92ZWNfYWRkKGRzdCwgc3JjX2lvdltpXS5pb3ZfYmFzZSArIHNvZmZzZXQsIGxlbik7CisgICAgICAgICAgICBkb25lICs9IGxlbjsKKyAgICAgICAgICAgIHNvZmZzZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc29mZnNldCAtPSBzcmNfaW92W2ldLmlvdl9sZW47CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KHNvZmZzZXQgPT0gMCk7IC8qIG9mZnNldCBiZXlvbmQgZW5kIG9mIHNyYyAqLworfQorCisvKgorICogQ29uY2F0ZW5hdGVzIChwYXJ0aWFsKSBpb3ZlY3MgZnJvbSBzcmMgdG8gdGhlIGVuZCBvZiBkc3QuCisgKiBJdCBzdGFydHMgY29weWluZyBhZnRlciBza2lwcGluZyBgc29mZnNldCcgYnl0ZXMgYXQgdGhlCisgKiBiZWdpbm5pbmcgb2Ygc3JjIGFuZCBhZGRzIGluZGl2aWR1YWwgdmVjdG9ycyBmcm9tIHNyYyB0bworICogZHN0IGNvcGllcyB1cCB0byBgc2J5dGVzJyBieXRlcyB0b3RhbCwgb3IgdXAgdG8gdGhlIGVuZAorICogb2Ygc3JjIGlmIGl0IGNvbWVzIGZpcnN0LiAgVGhpcyB3YXksIGl0IGlzIG9rYXkgdG8gc3BlY2lmeQorICogdmVyeSBsYXJnZSB2YWx1ZSBmb3IgYHNieXRlcycgdG8gaW5kaWNhdGUgInVwIHRvIHRoZSBlbmQKKyAqIG9mIHNyYyIuCisgKiBPbmx5IHZlY3RvciBwb2ludGVycyBhcmUgcHJvY2Vzc2VkLCBub3QgdGhlIGFjdHVhbCBkYXRhIGJ1ZmZlcnMuCisgKi8KK3ZvaWQgcWVtdV9pb3ZlY19jb25jYXQoUUVNVUlPVmVjdG9yICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgIFFFTVVJT1ZlY3RvciAqc3JjLCBzaXplX3Qgc29mZnNldCwgc2l6ZV90IHNieXRlcykKK3sKKyAgICBxZW11X2lvdmVjX2NvbmNhdF9pb3YoZHN0LCBzcmMtPmlvdiwgc3JjLT5uaW92LCBzb2Zmc2V0LCBzYnl0ZXMpOworfQorCit2b2lkIHFlbXVfaW92ZWNfZGVzdHJveShRRU1VSU9WZWN0b3IgKnFpb3YpCit7CisgICAgYXNzZXJ0KHFpb3YtPm5hbGxvYyAhPSAtMSk7CisKKyAgICBxZW11X2lvdmVjX3Jlc2V0KHFpb3YpOworICAgIGdfZnJlZShxaW92LT5pb3YpOworICAgIHFpb3YtPm5hbGxvYyA9IDA7CisgICAgcWlvdi0+aW92ID0gTlVMTDsKK30KKwordm9pZCBxZW11X2lvdmVjX3Jlc2V0KFFFTVVJT1ZlY3RvciAqcWlvdikKK3sKKyAgICBhc3NlcnQocWlvdi0+bmFsbG9jICE9IC0xKTsKKworICAgIHFpb3YtPm5pb3YgPSAwOworICAgIHFpb3YtPnNpemUgPSAwOworfQorCitzaXplX3QgcWVtdV9pb3ZlY190b19idWYoUUVNVUlPVmVjdG9yICpxaW92LCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKQoreworICAgIHJldHVybiBpb3ZfdG9fYnVmKHFpb3YtPmlvdiwgcWlvdi0+bmlvdiwgb2Zmc2V0LCBidWYsIGJ5dGVzKTsKK30KKworc2l6ZV90IHFlbXVfaW92ZWNfZnJvbV9idWYoUUVNVUlPVmVjdG9yICpxaW92LCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpCit7CisgICAgcmV0dXJuIGlvdl9mcm9tX2J1ZihxaW92LT5pb3YsIHFpb3YtPm5pb3YsIG9mZnNldCwgYnVmLCBieXRlcyk7Cit9CisKK3NpemVfdCBxZW11X2lvdmVjX21lbXNldChRRU1VSU9WZWN0b3IgKnFpb3YsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxjLCBzaXplX3QgYnl0ZXMpCit7CisgICAgcmV0dXJuIGlvdl9tZW1zZXQocWlvdi0+aW92LCBxaW92LT5uaW92LCBvZmZzZXQsIGZpbGxjLCBieXRlcyk7Cit9CisKK3NpemVfdCBpb3ZfZGlzY2FyZF9mcm9udChzdHJ1Y3QgaW92ZWMgKippb3YsIHVuc2lnbmVkIGludCAqaW92X2NudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpCit7CisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICBzdHJ1Y3QgaW92ZWMgKmN1cjsKKworICAgIGZvciAoY3VyID0gKmlvdjsgKmlvdl9jbnQgPiAwOyBjdXIrKykgeworICAgICAgICBpZiAoY3VyLT5pb3ZfbGVuID4gYnl0ZXMpIHsKKyAgICAgICAgICAgIGN1ci0+aW92X2Jhc2UgKz0gYnl0ZXM7CisgICAgICAgICAgICBjdXItPmlvdl9sZW4gLT0gYnl0ZXM7CisgICAgICAgICAgICB0b3RhbCArPSBieXRlczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZXMgLT0gY3VyLT5pb3ZfbGVuOworICAgICAgICB0b3RhbCArPSBjdXItPmlvdl9sZW47CisgICAgICAgICppb3ZfY250IC09IDE7CisgICAgfQorCisgICAgKmlvdiA9IGN1cjsKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3NpemVfdCBpb3ZfZGlzY2FyZF9iYWNrKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgKmlvdl9jbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpCit7CisgICAgc2l6ZV90IHRvdGFsID0gMDsKKyAgICBzdHJ1Y3QgaW92ZWMgKmN1cjsKKworICAgIGlmICgqaW92X2NudCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGN1ciA9IGlvdiArICgqaW92X2NudCAtIDEpOworCisgICAgd2hpbGUgKCppb3ZfY250ID4gMCkgeworICAgICAgICBpZiAoY3VyLT5pb3ZfbGVuID4gYnl0ZXMpIHsKKyAgICAgICAgICAgIGN1ci0+aW92X2xlbiAtPSBieXRlczsKKyAgICAgICAgICAgIHRvdGFsICs9IGJ5dGVzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBieXRlcyAtPSBjdXItPmlvdl9sZW47CisgICAgICAgIHRvdGFsICs9IGN1ci0+aW92X2xlbjsKKyAgICAgICAgY3VyLS07CisgICAgICAgICppb3ZfY250IC09IDE7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL21vZHVsZS5jIGIvYW5kcm9pZC9xZW11MS91dGlsL21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2MzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvbW9kdWxlLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFFFTVUgTW9kdWxlIEluZnJhc3RydWN0dXJlCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAwOQorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqIENvbnRyaWJ1dGlvbnMgYWZ0ZXIgMjAxMi0wMS0xMyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdQTCwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9xdWV1ZS5oIgorI2luY2x1ZGUgInFlbXUvbW9kdWxlLmgiCisKK3R5cGVkZWYgc3RydWN0IE1vZHVsZUVudHJ5Cit7CisgICAgdm9pZCAoKmluaXQpKHZvaWQpOworICAgIFFUQUlMUV9FTlRSWShNb2R1bGVFbnRyeSkgbm9kZTsKK30gTW9kdWxlRW50cnk7CisKK3R5cGVkZWYgUVRBSUxRX0hFQUQoLCBNb2R1bGVFbnRyeSkgTW9kdWxlVHlwZUxpc3Q7CisKK3N0YXRpYyBNb2R1bGVUeXBlTGlzdCBpbml0X3R5cGVfbGlzdFtNT0RVTEVfSU5JVF9NQVhdOworCitzdGF0aWMgdm9pZCBpbml0X3R5cGVzKHZvaWQpCit7CisgICAgc3RhdGljIGludCBpbml0ZWQ7CisgICAgaW50IGk7CisKKyAgICBpZiAoaW5pdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTU9EVUxFX0lOSVRfTUFYOyBpKyspIHsKKyAgICAgICAgUVRBSUxRX0lOSVQoJmluaXRfdHlwZV9saXN0W2ldKTsKKyAgICB9CisKKyAgICBpbml0ZWQgPSAxOworfQorCisKK3N0YXRpYyBNb2R1bGVUeXBlTGlzdCAqZmluZF90eXBlKG1vZHVsZV9pbml0X3R5cGUgdHlwZSkKK3sKKyAgICBNb2R1bGVUeXBlTGlzdCAqbDsKKworICAgIGluaXRfdHlwZXMoKTsKKworICAgIGwgPSAmaW5pdF90eXBlX2xpc3RbdHlwZV07CisKKyAgICByZXR1cm4gbDsKK30KKwordm9pZCByZWdpc3Rlcl9tb2R1bGVfaW5pdCh2b2lkICgqZm4pKHZvaWQpLCBtb2R1bGVfaW5pdF90eXBlIHR5cGUpCit7CisgICAgTW9kdWxlRW50cnkgKmU7CisgICAgTW9kdWxlVHlwZUxpc3QgKmw7CisKKyAgICBlID0gZ19tYWxsb2MwKHNpemVvZigqZSkpOworICAgIGUtPmluaXQgPSBmbjsKKworICAgIGwgPSBmaW5kX3R5cGUodHlwZSk7CisKKyAgICBRVEFJTFFfSU5TRVJUX1RBSUwobCwgZSwgbm9kZSk7Cit9CisKK3ZvaWQgbW9kdWxlX2NhbGxfaW5pdChtb2R1bGVfaW5pdF90eXBlIHR5cGUpCit7CisgICAgTW9kdWxlVHlwZUxpc3QgKmw7CisgICAgTW9kdWxlRW50cnkgKmU7CisKKyAgICBsID0gZmluZF90eXBlKHR5cGUpOworCisgICAgUVRBSUxRX0ZPUkVBQ0goZSwgbCwgbm9kZSkgeworICAgICAgICBlLT5pbml0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL25vdGlmeS5jIGIvYW5kcm9pZC9xZW11MS91dGlsL25vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTVkZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvbm90aWZ5LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIE5vdGlmaWVyIGxpc3RzCisgKgorICogQ29weXJpZ2h0IElCTSwgQ29ycC4gMjAxMAorICoKKyAqIEF1dGhvcnM6CisgKiAgQW50aG9ueSBMaWd1b3JpICAgPGFsaWd1b3JpQHVzLmlibS5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyLiAgU2VlCisgKiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqIENvbnRyaWJ1dGlvbnMgYWZ0ZXIgMjAxMi0wMS0xMyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdQTCwgdmVyc2lvbiAyIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS9ub3RpZnkuaCIKKwordm9pZCBub3RpZmllcl9saXN0X2luaXQoTm90aWZpZXJMaXN0ICpsaXN0KQoreworICAgIFFMSVNUX0lOSVQoJmxpc3QtPm5vdGlmaWVycyk7Cit9CisKK3ZvaWQgbm90aWZpZXJfbGlzdF9hZGQoTm90aWZpZXJMaXN0ICpsaXN0LCBOb3RpZmllciAqbm90aWZpZXIpCit7CisgICAgUUxJU1RfSU5TRVJUX0hFQUQoJmxpc3QtPm5vdGlmaWVycywgbm90aWZpZXIsIG5vZGUpOworfQorCit2b2lkIG5vdGlmaWVyX3JlbW92ZShOb3RpZmllciAqbm90aWZpZXIpCit7CisgICAgUUxJU1RfUkVNT1ZFKG5vdGlmaWVyLCBub2RlKTsKK30KKwordm9pZCBub3RpZmllcl9saXN0X25vdGlmeShOb3RpZmllckxpc3QgKmxpc3QsIHZvaWQgKmRhdGEpCit7CisgICAgTm90aWZpZXIgKm5vdGlmaWVyLCAqbmV4dDsKKworICAgIFFMSVNUX0ZPUkVBQ0hfU0FGRShub3RpZmllciwgJmxpc3QtPm5vdGlmaWVycywgbm9kZSwgbmV4dCkgeworICAgICAgICBub3RpZmllci0+bm90aWZ5KG5vdGlmaWVyLCBkYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgbm90aWZpZXJfd2l0aF9yZXR1cm5fbGlzdF9pbml0KE5vdGlmaWVyV2l0aFJldHVybkxpc3QgKmxpc3QpCit7CisgICAgUUxJU1RfSU5JVCgmbGlzdC0+bm90aWZpZXJzKTsKK30KKwordm9pZCBub3RpZmllcl93aXRoX3JldHVybl9saXN0X2FkZChOb3RpZmllcldpdGhSZXR1cm5MaXN0ICpsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmllcldpdGhSZXR1cm4gKm5vdGlmaWVyKQoreworICAgIFFMSVNUX0lOU0VSVF9IRUFEKCZsaXN0LT5ub3RpZmllcnMsIG5vdGlmaWVyLCBub2RlKTsKK30KKwordm9pZCBub3RpZmllcl93aXRoX3JldHVybl9yZW1vdmUoTm90aWZpZXJXaXRoUmV0dXJuICpub3RpZmllcikKK3sKKyAgICBRTElTVF9SRU1PVkUobm90aWZpZXIsIG5vZGUpOworfQorCitpbnQgbm90aWZpZXJfd2l0aF9yZXR1cm5fbGlzdF9ub3RpZnkoTm90aWZpZXJXaXRoUmV0dXJuTGlzdCAqbGlzdCwgdm9pZCAqZGF0YSkKK3sKKyAgICBOb3RpZmllcldpdGhSZXR1cm4gKm5vdGlmaWVyLCAqbmV4dDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIFFMSVNUX0ZPUkVBQ0hfU0FGRShub3RpZmllciwgJmxpc3QtPm5vdGlmaWVycywgbm9kZSwgbmV4dCkgeworICAgICAgICByZXQgPSBub3RpZmllci0+bm90aWZ5KG5vdGlmaWVyLCBkYXRhKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL29zZGVwLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvb3NkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzI2YjRlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL29zZGVwLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBRRU1VIGxvdyBsZXZlbCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorCisvKiBOZWVkZWQgZWFybHkgZm9yIENPTkZJR19CU0QgZXRjLiAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19NQURWSVNFKSB8fCBkZWZpbmVkKENPTkZJR19QT1NJWF9NQURWSVNFKQorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TT0xBUklTCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXR2ZnMuaD4KKy8qIFNlZSBNeVNRTCBidWcgIzcxNTYgKGh0dHA6Ly9idWdzLm15c3FsLmNvbS9idWcucGhwP2lkPTcxNTYpIGZvcgorICAgZGlzY3Vzc2lvbiBhYm91dCBTb2xhcmlzIGhlYWRlciBwcm9ibGVtcyAqLworZXh0ZXJuIGludCBtYWR2aXNlKGNhZGRyX3QsIHNpemVfdCwgaW50KTsKKyNlbmRpZgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgorI2luY2x1ZGUgIm1vbml0b3IvbW9uaXRvci5oIgorCitzdGF0aWMgYm9vbCBmaXBzX2VuYWJsZWQgPSBmYWxzZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnFlbXVfdmVyc2lvbiA9IFFFTVVfVkVSU0lPTjsKKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRCAgLy8gU2VlIGFuZHJvaWQvc29ja2V0cy5jIGluc3RlYWQuCitpbnQgc29ja2V0X3NldF9jb3JrKGludCBmZCwgaW50IHYpCit7CisjaWYgZGVmaW5lZChTT0xfVENQKSAmJiBkZWZpbmVkKFRDUF9DT1JLKQorICAgIHJldHVybiBxZW11X3NldHNvY2tvcHQoZmQsIFNPTF9UQ1AsIFRDUF9DT1JLLCAmdiwgc2l6ZW9mKHYpKTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHNvY2tldF9zZXRfbm9kZWxheShpbnQgZmQpCit7CisgICAgaW50IHYgPSAxOworICAgIHJldHVybiBxZW11X3NldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJnYsIHNpemVvZih2KSk7Cit9CisjZW5kaWYgIC8vICFDT05GSUdfQU5EUk9JRAorCitpbnQgcWVtdV9tYWR2aXNlKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4sIGludCBhZHZpY2UpCit7CisgICAgaWYgKGFkdmljZSA9PSBRRU1VX01BRFZfSU5WQUxJRCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyNpZiBkZWZpbmVkKENPTkZJR19NQURWSVNFKQorICAgIHJldHVybiBtYWR2aXNlKGFkZHIsIGxlbiwgYWR2aWNlKTsKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BPU0lYX01BRFZJU0UpCisgICAgcmV0dXJuIHBvc2l4X21hZHZpc2UoYWRkciwgbGVuLCBhZHZpY2UpOworI2Vsc2UKKyAgICBlcnJubyA9IEVJTlZBTDsKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorI2lmbmRlZiBfV0lOMzIKKy8qCisgKiBEdXBzIGFuIGZkIGFuZCBzZXRzIHRoZSBmbGFncworICovCitzdGF0aWMgaW50IHFlbXVfZHVwX2ZsYWdzKGludCBmZCwgaW50IGZsYWdzKQoreworICAgIGludCByZXQ7CisgICAgaW50IHNlcnJubzsKKyAgICBpbnQgZHVwX2ZsYWdzOworCisjaWZkZWYgRl9EVVBGRF9DTE9FWEVDCisgICAgcmV0ID0gZmNudGwoZmQsIEZfRFVQRkRfQ0xPRVhFQywgMCk7CisjZWxzZQorICAgIHJldCA9IGR1cChmZCk7CisgICAgaWYgKHJldCAhPSAtMSkgeworICAgICAgICBxZW11X3NldF9jbG9leGVjKHJldCk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHJldCA9PSAtMSkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZHVwX2ZsYWdzID0gZmNudGwocmV0LCBGX0dFVEZMKTsKKyAgICBpZiAoZHVwX2ZsYWdzID09IC0xKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKGZsYWdzICYgT19TWU5DKSAhPSAoZHVwX2ZsYWdzICYgT19TWU5DKSkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFNldC91bnNldCBmbGFncyB0aGF0IHdlIGNhbiB3aXRoIGZjbnRsICovCisgICAgaWYgKGZjbnRsKHJldCwgRl9TRVRGTCwgZmxhZ3MpID09IC0xKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBUcnVuY2F0ZSB0aGUgZmlsZSBpbiB0aGUgY2FzZXMgdGhhdCBvcGVuKCkgd291bGQgdHJ1bmNhdGUgaXQgKi8KKyAgICBpZiAoZmxhZ3MgJiBPX1RSVU5DIHx8CisgICAgICAgICAgICAoKGZsYWdzICYgKE9fQ1JFQVQgfCBPX0VYQ0wpKSA9PSAoT19DUkVBVCB8IE9fRVhDTCkpKSB7CisgICAgICAgIGlmIChmdHJ1bmNhdGUocmV0LCAwKSA9PSAtMSkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKKworZmFpbDoKKyAgICBzZXJybm8gPSBlcnJubzsKKyAgICBpZiAocmV0ICE9IC0xKSB7CisgICAgICAgIGNsb3NlKHJldCk7CisgICAgfQorICAgIGVycm5vID0gc2Vycm5vOworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBxZW11X3BhcnNlX2Zkc2V0KGNvbnN0IGNoYXIgKnBhcmFtKQoreworICAgIHJldHVybiBxZW11X3BhcnNlX2ZkKHBhcmFtKTsKK30KKyNlbmRpZgorI2VuZGlmICAvLyAhQ09ORklHX0FORFJPSUQKKworLyoKKyAqIE9wZW5zIGEgZmlsZSB3aXRoIEZEX0NMT0VYRUMgc2V0CisgKi8KK2ludCBxZW11X29wZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzLCAuLi4pCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgbW9kZSA9IDA7CisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyNpZm5kZWYgX1dJTjMyCisgICAgY29uc3QgY2hhciAqZmRzZXRfaWRfc3RyOworCisgICAgLyogQXR0ZW1wdCBkdXAgb2YgZmQgZnJvbSBmZCBzZXQgKi8KKyAgICBpZiAoc3Ryc3RhcnQobmFtZSwgIi9kZXYvZmRzZXQvIiwgJmZkc2V0X2lkX3N0cikpIHsKKyAgICAgICAgaW50NjRfdCBmZHNldF9pZDsKKyAgICAgICAgaW50IGZkLCBkdXBmZDsKKworICAgICAgICBmZHNldF9pZCA9IHFlbXVfcGFyc2VfZmRzZXQoZmRzZXRfaWRfc3RyKTsKKyAgICAgICAgaWYgKGZkc2V0X2lkID09IC0xKSB7CisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZkID0gbW9uaXRvcl9mZHNldF9nZXRfZmQoZmRzZXRfaWQsIGZsYWdzKTsKKyAgICAgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBkdXBmZCA9IHFlbXVfZHVwX2ZsYWdzKGZkLCBmbGFncyk7CisgICAgICAgIGlmIChkdXBmZCA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gbW9uaXRvcl9mZHNldF9kdXBfZmRfYWRkKGZkc2V0X2lkLCBkdXBmZCk7CisgICAgICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgICAgIGNsb3NlKGR1cGZkKTsKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkdXBmZDsKKyAgICB9CisjZW5kaWYKKyNlbmRpZiAgLy8gIUNPTkZJR19BTkRST0lECisKKyAgICBpZiAoZmxhZ3MgJiBPX0NSRUFUKSB7CisgICAgICAgIHZhX2xpc3QgYXA7CisKKyAgICAgICAgdmFfc3RhcnQoYXAsIGZsYWdzKTsKKyAgICAgICAgbW9kZSA9IHZhX2FyZyhhcCwgaW50KTsKKyAgICAgICAgdmFfZW5kKGFwKTsKKyAgICB9CisKKyNpZmRlZiBPX0NMT0VYRUMKKyAgICByZXQgPSBvcGVuKG5hbWUsIGZsYWdzIHwgT19DTE9FWEVDLCBtb2RlKTsKKyNlbHNlCisgICAgcmV0ID0gb3BlbihuYW1lLCBmbGFncywgbW9kZSk7CisgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgIHFlbXVfc2V0X2Nsb2V4ZWMocmV0KTsKKyAgICB9CisjZW5kaWYKKworI2lmZGVmIE9fRElSRUNUCisgICAgaWYgKHJldCA9PSAtMSAmJiBlcnJubyA9PSBFSU5WQUwgJiYgKGZsYWdzICYgT19ESVJFQ1QpKSB7CisgICAgICAgIGVycm9yX3JlcG9ydCgiZmlsZSBzeXN0ZW0gbWF5IG5vdCBzdXBwb3J0IE9fRElSRUNUIik7CisgICAgICAgIGVycm5vID0gRUlOVkFMOyAvKiBpbiBjYXNlIGl0IHdhcyBjbG9iYmVyZWQgKi8KKyAgICB9CisjZW5kaWYgLyogT19ESVJFQ1QgKi8KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBxZW11X2Nsb3NlKGludCBmZCkKK3sKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKyAgICBpbnQ2NF90IGZkc2V0X2lkOworCisgICAgLyogQ2xvc2UgZmQgdGhhdCB3YXMgZHVwJ2QgZnJvbSBhbiBmZHNldCAqLworICAgIGZkc2V0X2lkID0gbW9uaXRvcl9mZHNldF9kdXBfZmRfZmluZChmZCk7CisgICAgaWYgKGZkc2V0X2lkICE9IC0xKSB7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gY2xvc2UoZmQpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIG1vbml0b3JfZmRzZXRfZHVwX2ZkX3JlbW92ZShmZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBjbG9zZShmZCk7Cit9CisKKy8qCisgKiBBIHZhcmlhbnQgb2Ygd3JpdGUoMikgd2hpY2ggaGFuZGxlcyBwYXJ0aWFsIHdyaXRlLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLgorICogU2V0IGVycm5vIGlmIGZld2VyIHRoYW4gYGNvdW50JyBieXRlcyBhcmUgd3JpdHRlbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvbid0IHdvcmsgd2l0aCBub24tYmxvY2tpbmcgZmQncy4KKyAqIEFueSBvZiB0aGUgcG9zc2liaWxpdGllcyB3aXRoIG5vbi1ibG9raW5nIGZkJ3MgaXMgYmFkOgorICogICAtIHJldHVybiBhIHNob3J0IHdyaXRlICh0aGVuIG5hbWUgaXMgd3JvbmcpCisgKiAgIC0gYnVzeSB3YWl0IGFkZGluZyAoZXJybm8gPT0gRUFHQUlOKSB0byB0aGUgbG9vcAorICovCitzc2l6ZV90IHFlbXVfd3JpdGVfZnVsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworICAgIHNzaXplX3QgcmV0ID0gMDsKKyAgICBzc2l6ZV90IHRvdGFsID0gMDsKKworICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICByZXQgPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50IC09IHJldDsKKyAgICAgICAgYnVmICs9IHJldDsKKyAgICAgICAgdG90YWwgKz0gcmV0OworICAgIH0KKworICAgIHJldHVybiB0b3RhbDsKK30KKworLyoKKyAqIE9wZW5zIGEgc29ja2V0IHdpdGggRkRfQ0xPRVhFQyBzZXQKKyAqLworaW50IHFlbXVfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCit7CisgICAgaW50IHJldDsKKworI2lmZGVmIFNPQ0tfQ0xPRVhFQworICAgIHJldCA9IHNvY2tldChkb21haW4sIHR5cGUgfCBTT0NLX0NMT0VYRUMsIHByb3RvY29sKTsKKyAgICBpZiAocmV0ICE9IC0xIHx8IGVycm5vICE9IEVJTlZBTCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorICAgIHJldCA9IHNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgcWVtdV9zZXRfY2xvZXhlYyhyZXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKyNpZm5kZWYgQ09ORklHX0FORFJPSUQKKy8qCisgKiBBY2NlcHQgYSBjb25uZWN0aW9uIGFuZCBzZXQgRkRfQ0xPRVhFQworICovCitpbnQgcWVtdV9hY2NlcHQoaW50IHMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuKQoreworICAgIGludCByZXQ7CisKKyNpZmRlZiBDT05GSUdfQUNDRVBUNAorICAgIHJldCA9IGFjY2VwdDQocywgYWRkciwgYWRkcmxlbiwgU09DS19DTE9FWEVDKTsKKyAgICBpZiAocmV0ICE9IC0xIHx8IGVycm5vICE9IEVOT1NZUykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorICAgIHJldCA9IGFjY2VwdChzLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgcWVtdV9zZXRfY2xvZXhlYyhyZXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoKKyAqIEEgdmFyaWFudCBvZiBzZW5kKDIpIHdoaWNoIGhhbmRsZXMgcGFydGlhbCB3cml0ZS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgd2hpY2ggaXMgb25seQorICogc21hbGxlciB0aGFuIGBjb3VudCcgaWYgdGhlcmUgaXMgYW4gZXJyb3IuCisgKgorICogVGhpcyBmdW5jdGlvbiB3b24ndCB3b3JrIHdpdGggbm9uLWJsb2NraW5nIGZkJ3MuCisgKiBBbnkgb2YgdGhlIHBvc3NpYmlsaXRpZXMgd2l0aCBub24tYmxva2luZyBmZCdzIGlzIGJhZDoKKyAqICAgLSByZXR1cm4gYSBzaG9ydCB3cml0ZSAodGhlbiBuYW1lIGlzIHdyb25nKQorICogICAtIGJ1c3kgd2FpdCBhZGRpbmcgKGVycm5vID09IEVBR0FJTikgdG8gdGhlIGxvb3AKKyAqLworc3NpemVfdCBxZW11X3NlbmRfZnVsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgZmxhZ3MpCit7CisgICAgc3NpemVfdCByZXQgPSAwOworICAgIHNzaXplX3QgdG90YWwgPSAwOworCisgICAgd2hpbGUgKGNvdW50KSB7CisgICAgICAgIHJldCA9IHNlbmQoZmQsIGJ1ZiwgY291bnQsIGZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCAtPSByZXQ7CisgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgIHRvdGFsICs9IHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gdG90YWw7Cit9CisKKy8qCisgKiBBIHZhcmlhbnQgb2YgcmVjdigyKSB3aGljaCBoYW5kbGVzIHBhcnRpYWwgd3JpdGUuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdHJhbnNmZXJyZWQsIHdoaWNoIGlzIG9ubHkKKyAqIHNtYWxsZXIgdGhhbiBgY291bnQnIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd29uJ3Qgd29yayB3aXRoIG5vbi1ibG9ja2luZyBmZCdzLgorICogQW55IG9mIHRoZSBwb3NzaWJpbGl0aWVzIHdpdGggbm9uLWJsb2tpbmcgZmQncyBpcyBiYWQ6CisgKiAgIC0gcmV0dXJuIGEgc2hvcnQgd3JpdGUgKHRoZW4gbmFtZSBpcyB3cm9uZykKKyAqICAgLSBidXN5IHdhaXQgYWRkaW5nIChlcnJubyA9PSBFQUdBSU4pIHRvIHRoZSBsb29wCisgKi8KK3NzaXplX3QgcWVtdV9yZWN2X2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgaW50IGZsYWdzKQoreworICAgIHNzaXplX3QgcmV0ID0gMDsKKyAgICBzc2l6ZV90IHRvdGFsID0gMDsKKworICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICByZXQgPSBxZW11X3JlY3YoZmQsIGJ1ZiwgY291bnQsIGZsYWdzKTsKKyAgICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjb3VudCAtPSByZXQ7CisgICAgICAgIGJ1ZiArPSByZXQ7CisgICAgICAgIHRvdGFsICs9IHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gdG90YWw7Cit9CisKK3ZvaWQgcWVtdV9zZXRfdmVyc2lvbihjb25zdCBjaGFyICp2ZXJzaW9uKQoreworICAgIHFlbXVfdmVyc2lvbiA9IHZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIgKnFlbXVfZ2V0X3ZlcnNpb24odm9pZCkKK3sKKyAgICByZXR1cm4gcWVtdV92ZXJzaW9uOworfQorCit2b2lkIGZpcHNfc2V0X3N0YXRlKGJvb2wgcmVxdWVzdGVkKQoreworI2lmZGVmIF9fbGludXhfXworICAgIGlmIChyZXF1ZXN0ZWQpIHsKKyAgICAgICAgRklMRSAqZmRzID0gZm9wZW4oIi9wcm9jL3N5cy9jcnlwdG8vZmlwc19lbmFibGVkIiwgInIiKTsKKyAgICAgICAgaWYgKGZkcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmaXBzX2VuYWJsZWQgPSAoZmdldGMoZmRzKSA9PSAnMScpOworICAgICAgICAgICAgZmNsb3NlKGZkcyk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIGZpcHNfZW5hYmxlZCA9IGZhbHNlOworI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisjaWZkZWYgX0ZJUFNfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZJUFMgbW9kZSAlcyAocmVxdWVzdGVkICVzKVxuIiwKKwkgICAgKGZpcHNfZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpLAorCSAgICAocmVxdWVzdGVkID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworI2VuZGlmCit9CisKK2Jvb2wgZmlwc19nZXRfc3RhdGUodm9pZCkKK3sKKyAgICByZXR1cm4gZmlwc19lbmFibGVkOworfQorCisjaWZuZGVmIENPTkZJR19BTkRST0lECisjaWZkZWYgX1dJTjMyCitzdGF0aWMgdm9pZCBzb2NrZXRfY2xlYW51cCh2b2lkKQoreworICAgIFdTQUNsZWFudXAoKTsKK30KKyNlbmRpZgorCitpbnQgc29ja2V0X2luaXQodm9pZCkKK3sKKyNpZmRlZiBfV0lOMzIKKyAgICBXU0FEQVRBIERhdGE7CisgICAgaW50IHJldCwgZXJyOworCisgICAgcmV0ID0gV1NBU3RhcnR1cChNQUtFV09SRCgyLCAyKSwgJkRhdGEpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXU0FTdGFydHVwOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdGV4aXQoc29ja2V0X2NsZWFudXApOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vICFDT05GSUdfQU5EUk9JRAorCisjaWZuZGVmIENPTkZJR19JT1ZFQworLyogaGVscGVyIGZ1bmN0aW9uIGZvciBpb3Zfc2VuZF9yZWN2KCkgKi8KK3N0YXRpYyBzc2l6ZV90CityZWFkdl93cml0ZXYoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdl9jbnQsIGJvb2wgZG9fd3JpdGUpCit7CisgICAgdW5zaWduZWQgaSA9IDA7CisgICAgc3NpemVfdCByZXQgPSAwOworICAgIHdoaWxlIChpIDwgaW92X2NudCkgeworICAgICAgICBzc2l6ZV90IHIgPSBkb193cml0ZQorICAgICAgICAgICAgPyB3cml0ZShmZCwgaW92W2ldLmlvdl9iYXNlLCBpb3ZbaV0uaW92X2xlbikKKyAgICAgICAgICAgIDogcmVhZChmZCwgaW92W2ldLmlvdl9iYXNlLCBpb3ZbaV0uaW92X2xlbik7CisgICAgICAgIGlmIChyID4gMCkgeworICAgICAgICAgICAgcmV0ICs9IHI7CisgICAgICAgIH0gZWxzZSBpZiAoIXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGVsc2UgaXQgaXMgc29tZSAib3RoZXIiIGVycm9yLAorICAgICAgICAgICAgICogb25seSByZXR1cm4gaWYgdGhlcmUgd2FzIG5vIGRhdGEgcHJvY2Vzc2VkLiAqLworICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK3JlYWR2KGludCBmZCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZfY250KQoreworICAgIHJldHVybiByZWFkdl93cml0ZXYoZmQsIGlvdiwgaW92X2NudCwgZmFsc2UpOworfQorCitzc2l6ZV90Cit3cml0ZXYoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdl9jbnQpCit7CisgICAgcmV0dXJuIHJlYWR2X3dyaXRldihmZCwgaW92LCBpb3ZfY250LCB0cnVlKTsKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfV0lOMzIpICYmICFRRU1VX0dOVUNfUFJFUkVRKDQsNCkKKy8vIE9sZGVyIE1pbmd3MzIgZGlkbid0IHByb3ZpZGUgdGhlc2UuCitpbnQgYXNwcmludGYoIGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgLi4uICk7CitpbnQgdmFzcHJpbnRmKCBjaGFyICoqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgKTsKKworaW50IHZhc3ByaW50ZiggY2hhciAqKnNwdHIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmd2ICkKK3sKKyAgICBpbnQgd2FudGVkID0gdnNucHJpbnRmKCAqc3B0ciA9IE5VTEwsIDAsIGZtdCwgYXJndiApOworICAgIGlmKCAod2FudGVkID4gMCkgJiYgKCgqc3B0ciA9IG1hbGxvYyggMSArIHdhbnRlZCApKSAhPSBOVUxMKSApCisgICAgICAgIHJldHVybiB2c3ByaW50ZiggKnNwdHIsIGZtdCwgYXJndiApOworCisgICAgcmV0dXJuIHdhbnRlZDsKK30KKworaW50IGFzcHJpbnRmKCBjaGFyICoqc3B0ciwgY29uc3QgY2hhciAqZm10LCAuLi4gKQoreworICAgIGludCByZXR2YWw7CisgICAgdmFfbGlzdCBhcmd2OworICAgIHZhX3N0YXJ0KCBhcmd2LCBmbXQgKTsKKyAgICByZXR2YWwgPSB2YXNwcmludGYoIHNwdHIsIGZtdCwgYXJndiApOworICAgIHZhX2VuZCggYXJndiApOworICAgIHJldHVybiByZXR2YWw7Cit9CisjZW5kaWYgIC8vIF9XSU4zMiAmJiAhUUVNVV9HTlVDX1BSRVJFUSg0LDQpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvb3NsaWItcG9zaXguYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9vc2xpYi1wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjM0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvb3NsaWItcG9zaXguYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIG9zLXBvc2l4LWxpYi5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDggRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqIFFFTVUgbGlicmFyeSBmdW5jdGlvbnMgb24gUE9TSVggd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIFFFTVUgYW5kCisgKiB0aGUgUUVNVSB0b29scy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyogVGhlIGZvbGxvd2luZyBibG9jayBvZiBjb2RlIHRlbXBvcmFyaWx5IHJlbmFtZXMgdGhlIGRhZW1vbigpIGZ1bmN0aW9uIHNvIHRoZQorICAgY29tcGlsZXIgZG9lcyBub3Qgc2VlIHRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCBpdCBpbiBzdGRsaWIuaCBvbiBPU1ggKi8KKyNpZmRlZiBfX0FQUExFX18KKyNkZWZpbmUgZGFlbW9uIHFlbXVfZmFrZV9kYWVtb25fZnVuY3Rpb24KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyN1bmRlZiBkYWVtb24KK2V4dGVybiBpbnQgZGFlbW9uKGludCwgaW50KTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pICYmIChkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX19hcm1fXykpCisgICAvKiBVc2UgMiBNaUIgYWxpZ25tZW50IHNvIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBjYW4gYmUgdXNlZCBieSBLVk0uCisgICAgICBWYWxncmluZCBkb2VzIG5vdCBzdXBwb3J0IGFsaWdubWVudHMgbGFyZ2VyIHRoYW4gMSBNaUIsCisgICAgICB0aGVyZWZvcmUgd2UgbmVlZCBzcGVjaWFsIGNvZGUgd2hpY2ggaGFuZGxlcyBydW5uaW5nIG9uIFZhbGdyaW5kLiAqLworIyAgZGVmaW5lIFFFTVVfVk1BTExPQ19BTElHTiAoNTEyICogNDA5NikKKyNlbGlmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKF9fczM5MHhfXykKKyAgIC8qIFVzZSAxIE1pQiAoc2VnbWVudCBzaXplKSBhbGlnbm1lbnQgc28gZ21hcCBjYW4gYmUgdXNlZCBieSBLVk0uICovCisjICBkZWZpbmUgUUVNVV9WTUFMTE9DX0FMSUdOICgyNTYgKiA0MDk2KQorI2Vsc2UKKyMgIGRlZmluZSBRRU1VX1ZNQUxMT0NfQUxJR04gZ2V0cGFnZXNpemUoKQorI2VuZGlmCisKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorI2luY2x1ZGUgPGdsaWIvZ3ByaW50Zi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjb25maWctaG9zdC5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZmRlZiBDT05GSUdfTElOVVgKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2VuZGlmCisKK2ludCBxZW11X2dldF90aHJlYWRfaWQodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKyAgICByZXR1cm4gc3lzY2FsbChTWVNfZ2V0dGlkKTsKKyNlbHNlCisgICAgcmV0dXJuIGdldHBpZCgpOworI2VuZGlmCit9CisKK2ludCBxZW11X2RhZW1vbihpbnQgbm9jaGRpciwgaW50IG5vY2xvc2UpCit7CisgICAgcmV0dXJuIGRhZW1vbihub2NoZGlyLCBub2Nsb3NlKTsKK30KKwordm9pZCAqcWVtdV9vb21fY2hlY2sodm9pZCAqcHRyKQoreworICAgIGlmIChwdHIgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnk6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICpxZW11X21lbWFsaWduKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0cjsKKyNpZiBkZWZpbmVkKF9QT1NJWF9DX1NPVVJDRSkgJiYgIWRlZmluZWQoX19zdW5fXykKKyAgICBpbnQgcmV0OworICAgIHJldCA9IHBvc2l4X21lbWFsaWduKCZwdHIsIGFsaWdubWVudCwgc2l6ZSk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlICV6dSBCOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBzaXplLCBzdHJlcnJvcihyZXQpKTsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisjZWxpZiBkZWZpbmVkKENPTkZJR19CU0QpCisgICAgcHRyID0gcWVtdV9vb21fY2hlY2sodmFsbG9jKHNpemUpKTsKKyNlbHNlCisgICAgcHRyID0gcWVtdV9vb21fY2hlY2sobWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKSk7CisjZW5kaWYKKyAgICAvL3RyYWNlX3FlbXVfbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplLCBwdHIpOworICAgIHJldHVybiBwdHI7Cit9CisKKy8qIGFsbG9jIHNoYXJlZCBtZW1vcnkgcGFnZXMgKi8KK3ZvaWQgKnFlbXVfdm1hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gcWVtdV9tZW1hbGlnbihnZXRwYWdlc2l6ZSgpLCBzaXplKTsKK30KKworLyogYWxsb2Mgc2hhcmVkIG1lbW9yeSBwYWdlcyAqLwordm9pZCAqcWVtdV9hbm9uX3JhbV9hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKyAgICBzaXplX3QgYWxpZ24gPSBRRU1VX1ZNQUxMT0NfQUxJR047CisgICAgc2l6ZV90IHRvdGFsID0gc2l6ZSArIGFsaWduIC0gZ2V0cGFnZXNpemUoKTsKKyAgICB2b2lkICpwdHIgPSBtbWFwKDAsIHRvdGFsLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisgICAgc2l6ZV90IG9mZnNldCA9IFFFTVVfQUxJR05fVVAoKHVpbnRwdHJfdClwdHIsIGFsaWduKSAtICh1aW50cHRyX3QpcHRyOworCisgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHB0ciArPSBvZmZzZXQ7CisgICAgdG90YWwgLT0gb2Zmc2V0OworCisgICAgaWYgKG9mZnNldCA+IDApIHsKKyAgICAgICAgbXVubWFwKHB0ciAtIG9mZnNldCwgb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHRvdGFsID4gc2l6ZSkgeworICAgICAgICBtdW5tYXAocHRyICsgc2l6ZSwgdG90YWwgLSBzaXplKTsKKyAgICB9CisKKyAgICAvL3RyYWNlX3FlbXVfYW5vbl9yYW1fYWxsb2Moc2l6ZSwgcHRyKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkIHFlbXVfdmZyZWUodm9pZCAqcHRyKQoreworICAgIC8vdHJhY2VfcWVtdV92ZnJlZShwdHIpOworICAgIGZyZWUocHRyKTsKK30KKwordm9pZCBxZW11X2Fub25fcmFtX2ZyZWUodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICAvL3RyYWNlX3FlbXVfYW5vbl9yYW1fZnJlZShwdHIsIHNpemUpOworICAgIGlmIChwdHIpIHsKKyAgICAgICAgbXVubWFwKHB0ciwgc2l6ZSk7CisgICAgfQorfQorCit2b2lkIHFlbXVfc2V0X2Jsb2NrKGludCBmZCkKK3sKKyAgICBpbnQgZjsKKyAgICBmID0gZmNudGwoZmQsIEZfR0VURkwpOworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBmICYgfk9fTk9OQkxPQ0spOworfQorCit2b2lkIHFlbXVfc2V0X25vbmJsb2NrKGludCBmZCkKK3sKKyAgICBpbnQgZjsKKyAgICBmID0gZmNudGwoZmQsIEZfR0VURkwpOworICAgIGZjbnRsKGZkLCBGX1NFVEZMLCBmIHwgT19OT05CTE9DSyk7Cit9CisKK2ludCBzb2NrZXRfc2V0X2Zhc3RfcmV1c2UoaW50IGZkKQoreworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgcmV0dXJuIHNvY2tldF9zZXRfeHJldXNlYWRkcihmZCk7CisjZWxzZQorICAgIGludCB2YWwgPSAxLCByZXQ7CisKKyAgICByZXQgPSBxZW11X3NldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKKyAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCisgICAgYXNzZXJ0KHJldCA9PSAwKTsKKworICAgIHJldHVybiByZXQ7CisjZW5kaWYKK30KKwordm9pZCBxZW11X3NldF9jbG9leGVjKGludCBmZCkKK3sKKyAgICBpbnQgZjsKKyAgICBmID0gZmNudGwoZmQsIEZfR0VURkQpOworICAgIGZjbnRsKGZkLCBGX1NFVEZELCBmIHwgRkRfQ0xPRVhFQyk7Cit9CisKKy8qCisgKiBDcmVhdGVzIGEgcGlwZSB3aXRoIEZEX0NMT0VYRUMgc2V0IG9uIGJvdGggZmlsZSBkZXNjcmlwdG9ycworICovCitpbnQgcWVtdV9waXBlKGludCBwaXBlZmRbMl0pCit7CisgICAgaW50IHJldDsKKworI2lmZGVmIENPTkZJR19QSVBFMgorICAgIHJldCA9IHBpcGUyKHBpcGVmZCwgT19DTE9FWEVDKTsKKyAgICBpZiAocmV0ICE9IC0xIHx8IGVycm5vICE9IEVOT1NZUykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorICAgIHJldCA9IHBpcGUocGlwZWZkKTsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgcWVtdV9zZXRfY2xvZXhlYyhwaXBlZmRbMF0pOworICAgICAgICBxZW11X3NldF9jbG9leGVjKHBpcGVmZFsxXSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHFlbXVfdXRpbWVucyhjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2WzJdLCB0dl9ub3c7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IGk7CisjaWZkZWYgQ09ORklHX1VUSU1FTlNBVAorICAgIGludCByZXQ7CisKKyAgICByZXQgPSB1dGltZW5zYXQoQVRfRkRDV0QsIHBhdGgsIHRpbWVzLCBBVF9TWU1MSU5LX05PRk9MTE9XKTsKKyAgICBpZiAocmV0ICE9IC0xIHx8IGVycm5vICE9IEVOT1NZUykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyNlbmRpZgorICAgIC8qIEZhbGxiYWNrOiB1c2UgdXRpbWVzKCkgaW5zdGVhZCBvZiB1dGltZW5zYXQoKSAqLworCisgICAgLyogaGFwcHkgaWYgc3BlY2lhbCBjYXNlcyAqLworICAgIGlmICh0aW1lc1swXS50dl9uc2VjID09IFVUSU1FX09NSVQgJiYgdGltZXNbMV0udHZfbnNlYyA9PSBVVElNRV9PTUlUKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAodGltZXNbMF0udHZfbnNlYyA9PSBVVElNRV9OT1cgJiYgdGltZXNbMV0udHZfbnNlYyA9PSBVVElNRV9OT1cpIHsKKyAgICAgICAgcmV0dXJuIHV0aW1lcyhwYXRoLCBOVUxMKTsKKyAgICB9CisKKyAgICAvKiBwcmVwYXJlIGZvciBoYXJkIGNhc2VzICovCisgICAgaWYgKHRpbWVzWzBdLnR2X25zZWMgPT0gVVRJTUVfTk9XIHx8IHRpbWVzWzFdLnR2X25zZWMgPT0gVVRJTUVfTk9XKSB7CisgICAgICAgIGdldHRpbWVvZmRheSgmdHZfbm93LCBOVUxMKTsKKyAgICB9CisgICAgaWYgKHRpbWVzWzBdLnR2X25zZWMgPT0gVVRJTUVfT01JVCB8fCB0aW1lc1sxXS50dl9uc2VjID09IFVUSU1FX09NSVQpIHsKKyAgICAgICAgc3RhdChwYXRoLCAmc3QpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgaWYgKHRpbWVzW2ldLnR2X25zZWMgPT0gVVRJTUVfTk9XKSB7CisgICAgICAgICAgICB0dltpXS50dl9zZWMgPSB0dl9ub3cudHZfc2VjOworICAgICAgICAgICAgdHZbaV0udHZfdXNlYyA9IHR2X25vdy50dl91c2VjOworICAgICAgICB9IGVsc2UgaWYgKHRpbWVzW2ldLnR2X25zZWMgPT0gVVRJTUVfT01JVCkgeworICAgICAgICAgICAgdHZbaV0udHZfc2VjID0gKGkgPT0gMCkgPyBzdC5zdF9hdGltZSA6IHN0LnN0X210aW1lOworICAgICAgICAgICAgdHZbaV0udHZfdXNlYyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0dltpXS50dl9zZWMgPSB0aW1lc1tpXS50dl9zZWM7CisgICAgICAgICAgICB0dltpXS50dl91c2VjID0gdGltZXNbaV0udHZfbnNlYyAvIDEwMDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdXRpbWVzKHBhdGgsICZ0dlswXSk7Cit9CisKK2NoYXIgKgorcWVtdV9nZXRfbG9jYWxfc3RhdGVfcGF0aG5hbWUoY29uc3QgY2hhciAqcmVsYXRpdmVfcGF0aG5hbWUpCit7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICByZXR1cm4gTlVMTDsKKyNlbHNlCisgICAgcmV0dXJuIGdfc3RyZHVwX3ByaW50ZigiJXMvJXMiLCBDT05GSUdfUUVNVV9MT0NBTFNUQVRFRElSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGF0aG5hbWUpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvb3NsaWItd2luMzIuYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9vc2xpYi13aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzViZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvb3NsaWItd2luMzIuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIG9zLXdpbjMyLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0LCBJbmMuCisgKgorICogUUVNVSBsaWJyYXJ5IGZ1bmN0aW9ucyBmb3Igd2luMzIgd2hpY2ggYXJlIHNoYXJlZCBiZXR3ZWVuIFFFTVUgYW5kCisgKiB0aGUgUUVNVSB0b29scy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY29uZmlnLWhvc3QuaCIKKyNpbmNsdWRlICJzeXNlbXUvc3lzZW11LmgiCisjaW5jbHVkZSAidHJhY2UuaCIKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKworLyogdGhpcyBtdXN0IGNvbWUgYWZ0ZXIgaW5jbHVkaW5nICJ0cmFjZS5oIiAqLworI2luY2x1ZGUgPHNobG9iai5oPgorCit2b2lkICpxZW11X29vbV9jaGVjayh2b2lkICpwdHIpCit7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeTogJWx1XG4iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKnFlbXVfbWVtYWxpZ24oc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcHRyOworCisgICAgaWYgKCFzaXplKSB7CisgICAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHB0ciA9IHFlbXVfb29tX2NoZWNrKFZpcnR1YWxBbGxvYyhOVUxMLCBzaXplLCBNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSkpOworICAgIC8vdHJhY2VfcWVtdV9tZW1hbGlnbihhbGlnbm1lbnQsIHNpemUsIHB0cik7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqcWVtdV92bWFsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0cjsKKworICAgIC8qIEZJWE1FOiB0aGlzIGlzIG5vdCBleGFjdGx5IG9wdGltYWwgc29sdXRpb24gc2luY2UgVmlydHVhbEFsbG9jCisgICAgICAgaGFzIDY0S2IgZ3JhbnVsYXJpdHksIGJ1dCBhdCBsZWFzdCBpdCBndWFyYW50ZWVzIHVzIHRoYXQgdGhlCisgICAgICAgbWVtb3J5IGlzIHBhZ2UgYWxpZ25lZC4gKi8KKyAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgcHRyID0gcWVtdV9vb21fY2hlY2soVmlydHVhbEFsbG9jKE5VTEwsIHNpemUsIE1FTV9DT01NSVQsIFBBR0VfUkVBRFdSSVRFKSk7CisgICAgLy90cmFjZV9xZW11X3ZtYWxsb2Moc2l6ZSwgcHRyKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkICpxZW11X2Fub25fcmFtX2FsbG9jKHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnB0cjsKKworICAgIC8qIEZJWE1FOiB0aGlzIGlzIG5vdCBleGFjdGx5IG9wdGltYWwgc29sdXRpb24gc2luY2UgVmlydHVhbEFsbG9jCisgICAgICAgaGFzIDY0S2IgZ3JhbnVsYXJpdHksIGJ1dCBhdCBsZWFzdCBpdCBndWFyYW50ZWVzIHVzIHRoYXQgdGhlCisgICAgICAgbWVtb3J5IGlzIHBhZ2UgYWxpZ25lZC4gKi8KKyAgICBwdHIgPSBWaXJ0dWFsQWxsb2MoTlVMTCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9SRUFEV1JJVEUpOworICAgIC8vdHJhY2VfcWVtdV9hbm9uX3JhbV9hbGxvYyhzaXplLCBwdHIpOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgcWVtdV92ZnJlZSh2b2lkICpwdHIpCit7CisgICAgLy90cmFjZV9xZW11X3ZmcmVlKHB0cik7CisgICAgaWYgKHB0cikgeworICAgICAgICBWaXJ0dWFsRnJlZShwdHIsIDAsIE1FTV9SRUxFQVNFKTsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9hbm9uX3JhbV9mcmVlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisgICAgLy90cmFjZV9xZW11X2Fub25fcmFtX2ZyZWUocHRyLCBzaXplKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAgIFZpcnR1YWxGcmVlKHB0ciwgMCwgTUVNX1JFTEVBU0UpOworICAgIH0KK30KKworLyogRklYTUU6IGFkZCBwcm9wZXIgbG9ja2luZyAqLworc3RydWN0IHRtICpnbXRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVwLCBzdHJ1Y3QgdG0gKnJlc3VsdCkKK3sKKyAgICBzdHJ1Y3QgdG0gKnAgPSBnbXRpbWUodGltZXApOworICAgIG1lbXNldChyZXN1bHQsIDAsIHNpemVvZigqcmVzdWx0KSk7CisgICAgaWYgKHApIHsKKyAgICAgICAgKnJlc3VsdCA9ICpwOworICAgICAgICBwID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKworLyogRklYTUU6IGFkZCBwcm9wZXIgbG9ja2luZyAqLworc3RydWN0IHRtICpsb2NhbHRpbWVfcihjb25zdCB0aW1lX3QgKnRpbWVwLCBzdHJ1Y3QgdG0gKnJlc3VsdCkKK3sKKyAgICBzdHJ1Y3QgdG0gKnAgPSBsb2NhbHRpbWUodGltZXApOworICAgIG1lbXNldChyZXN1bHQsIDAsIHNpemVvZigqcmVzdWx0KSk7CisgICAgaWYgKHApIHsKKyAgICAgICAgKnJlc3VsdCA9ICpwOworICAgICAgICBwID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcDsKK30KKwordm9pZCBxZW11X3NldF9ibG9jayhpbnQgZmQpCit7CisgICAgdW5zaWduZWQgbG9uZyBvcHQgPSAwOworICAgIFdTQUV2ZW50U2VsZWN0KGZkLCBOVUxMLCAwKTsKKyAgICBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7Cit9CisKK3ZvaWQgcWVtdV9zZXRfbm9uYmxvY2soaW50IGZkKQoreworICAgIHVuc2lnbmVkIGxvbmcgb3B0ID0gMTsKKyAgICBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgJm9wdCk7CisjaWZuZGVmIENPTkZJR19BTkRST0lECisgICAgcWVtdV9mZF9yZWdpc3RlcihmZCk7CisjZW5kaWYKK30KKworaW50IHNvY2tldF9zZXRfZmFzdF9yZXVzZShpbnQgZmQpCit7CisgICAgLyogRW5hYmxpbmcgdGhlIHJldXNlIG9mIGFuIGVuZHBvaW50IHRoYXQgd2FzIHVzZWQgYnkgYSBzb2NrZXQgc3RpbGwgaW4KKyAgICAgKiBUSU1FX1dBSVQgc3RhdGUgaXMgdXN1YWxseSBwZXJmb3JtZWQgYnkgc2V0dGluZyBTT19SRVVTRUFERFIuIE9uIFdpbmRvd3MKKyAgICAgKiBmYXN0IHJldXNlIGlzIHRoZSBkZWZhdWx0IGFuZCBTT19SRVVTRUFERFIgZG9lcyBzdHJhbmdlIHRoaW5ncy4gU28gd2UKKyAgICAgKiBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuIE1vcmUgaW5mbyBjYW4gYmUgZm91bmQgYXQ6CisgICAgICogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczc0MDYyMS5hc3B4ICovCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICppYSkKK3sKKyAgICB1aW50MzJfdCBhZGRyID0gaW5ldF9hZGRyKGNwKTsKKyAgICBpZiAoYWRkciA9PSAweGZmZmZmZmZmKSB7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGlhLT5zX2FkZHIgPSBhZGRyOworICAgIHJldHVybiAxOworfQorCit2b2lkIHFlbXVfc2V0X2Nsb2V4ZWMoaW50IGZkKQoreworfQorCisvKiBPZmZzZXQgYmV0d2VlbiAxLzEvMTYwMSBhbmQgMS8xLzE5NzAgaW4gMTAwIG5hbm9zZWMgdW5pdHMgKi8KKyNkZWZpbmUgX1czMl9GVF9PRkZTRVQgKDExNjQ0NDczNjAwMDAwMDAwMFVMTCkKKworaW50IHFlbXVfZ2V0dGltZW9mZGF5KHFlbXVfdGltZXZhbCAqdHApCit7CisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbnMxMDA7IC8qdGltZSBzaW5jZSAxIEphbiAxNjAxIGluIDEwMG5zIHVuaXRzICovCisgICAgRklMRVRJTUUgZnQ7CisgIH0gIF9ub3c7CisKKyAgaWYodHApIHsKKyAgICAgIEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lICgmX25vdy5mdCk7CisgICAgICB0cC0+dHZfdXNlYz0obG9uZykoKF9ub3cubnMxMDAgLyAxMFVMTCkgJSAxMDAwMDAwVUxMICk7CisgICAgICB0cC0+dHZfc2VjPSAobG9uZykoKF9ub3cubnMxMDAgLSBfVzMyX0ZUX09GRlNFVCkgLyAxMDAwMDAwMFVMTCk7CisgIH0KKyAgLyogQWx3YXlzIHJldHVybiAwIGFzIHBlciBPcGVuIEdyb3VwIEJhc2UgU3BlY2lmaWNhdGlvbnMgSXNzdWUgNi4KKyAgICAgRG8gbm90IHNldCBlcnJubyBvbiBlcnJvci4gICovCisgIHJldHVybiAwOworfQorCitpbnQgcWVtdV9nZXRfdGhyZWFkX2lkKHZvaWQpCit7CisgICAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworfQorCitjaGFyICoKK3FlbXVfZ2V0X2xvY2FsX3N0YXRlX3BhdGhuYW1lKGNvbnN0IGNoYXIgKnJlbGF0aXZlX3BhdGhuYW1lKQoreworICAgIEhSRVNVTFQgcmVzdWx0OworICAgIGNoYXIgYmFzZV9wYXRoW01BWF9QQVRIKzFdID0gIiI7CisKKyAgICByZXN1bHQgPSBTSEdldEZvbGRlclBhdGgoTlVMTCwgQ1NJRExfQ09NTU9OX0FQUERBVEEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNIR0ZQX1RZUEVfQ1VSUkVOVCAqLyAwLCBiYXNlX3BhdGgpOworICAgIGlmIChyZXN1bHQgIT0gU19PSykgeworICAgICAgICAvKiBtaXNjb25maWd1cmVkIGVudmlyb25tZW50ICovCisgICAgICAgIGdfY3JpdGljYWwoIkNTSURMX0NPTU1PTl9BUFBEQVRBIHVuYXZhaWxhYmxlOiAlbGQiLCAobG9uZylyZXN1bHQpOworICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICByZXR1cm4gZ19zdHJkdXBfcHJpbnRmKCIlcyIgR19ESVJfU0VQQVJBVE9SX1MgIiVzIiwgYmFzZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVfcGF0aG5hbWUpOworfQorCisjaWZkZWYgQ09ORklHX0FORFJPSUQKK2ludCBmZnMoaW50IHgpIHsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICB1bnNpZ25lZCB1eCA9ICh1bnNpZ25lZCl4OworICAgIHdoaWxlICh1eCkgeworICAgICAgICBpZiAodXggJiAxKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCArIDE7CisgICAgICAgIHV4ID4+PSAxOworICAgICAgICArK3Jlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9wYXRoLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjhkMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcGF0aC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBDb2RlIHRvIG1hbmdsZSBwYXRobmFtZXMgaW50byB0aG9zZSBtYXRjaGluZyBhIGdpdmVuIHByZWZpeC4KKyAgIGVnLiBvcGVuKCIvbGliL2Zvby5zbyIpID0+IG9wZW4oIi91c3IvZ25lbXVsL2kzODYtbGludXgvbGliL2Zvby5zbyIpOworCisgICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoaXMgYXJlYSBkb2VzIG5vdCBjaGFuZ2UuCisqLworI2lmZGVmIF9fbGludXhfXworI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKworc3RydWN0IHBhdGhlbGVtCit7CisgICAgLyogTmFtZSBvZiB0aGlzLCBlZy4gbGliICovCisgICAgY2hhciAqbmFtZTsKKyAgICAvKiBGdWxsIHBhdGggbmFtZSwgZWcuIC91c3IvZ25lbXVsL3g4Ni1saW51eC9saWIuICovCisgICAgY2hhciAqcGF0aG5hbWU7CisgICAgc3RydWN0IHBhdGhlbGVtICpwYXJlbnQ7CisgICAgLyogQ2hpbGRyZW4gKi8KKyAgICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7CisgICAgc3RydWN0IHBhdGhlbGVtICplbnRyaWVzWzBdOworfTsKKworc3RhdGljIHN0cnVjdCBwYXRoZWxlbSAqYmFzZTsKKworLyogRmlyc3QgTiBjaGFycyBvZiBTMSBtYXRjaCBTMiwgYW5kIFMyIGlzIE4gY2hhcnMgbG9uZy4gKi8KK3N0YXRpYyBpbnQgc3RybmVxKGNvbnN0IGNoYXIgKnMxLCB1bnNpZ25lZCBpbnQgbiwgY29uc3QgY2hhciAqczIpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBpZiAoczFbaV0gIT0gczJbaV0pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gczJbaV0gPT0gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYXRoZWxlbSAqYWRkX2VudHJ5KHN0cnVjdCBwYXRoZWxlbSAqcm9vdCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0eXBlKTsKKworc3RhdGljIHN0cnVjdCBwYXRoZWxlbSAqbmV3X2VudHJ5KGNvbnN0IGNoYXIgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhdGhlbGVtICpwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgcGF0aGVsZW0gKm5ldyA9IG1hbGxvYyhzaXplb2YoKm5ldykpOworICAgIG5ldy0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgICBuZXctPnBhdGhuYW1lID0gZ19zdHJkdXBfcHJpbnRmKCIlcy8lcyIsIHJvb3QsIG5hbWUpOworICAgIG5ldy0+bnVtX2VudHJpZXMgPSAwOworICAgIHJldHVybiBuZXc7Cit9CisKKyNkZWZpbmUgc3RyZXEoYSxiKSAoc3RyY21wKChhKSwgKGIpKSA9PSAwKQorCisvKiBOb3QgYWxsIHN5c3RlbXMgcHJvdmlkZSB0aGlzIGZlYXR1cmUgKi8KKyNpZiBkZWZpbmVkKERUX0RJUikgJiYgZGVmaW5lZChEVF9VTktOT1dOKSAmJiBkZWZpbmVkKERUX0xOSykKKyMgZGVmaW5lIGRpcmVudF90eXBlKGRpcmVudCkgKChkaXJlbnQpLT5kX3R5cGUpCisjIGRlZmluZSBpc19kaXJfbWF5YmUodHlwZSkgXAorICAgICgodHlwZSkgPT0gRFRfRElSIHx8ICh0eXBlKSA9PSBEVF9VTktOT1dOIHx8ICh0eXBlKSA9PSBEVF9MTkspCisjZWxzZQorIyBkZWZpbmUgZGlyZW50X3R5cGUoZGlyZW50KSAoMSkKKyMgZGVmaW5lIGlzX2Rpcl9tYXliZSh0eXBlKSAgKHR5cGUpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwYXRoZWxlbSAqYWRkX2Rpcl9tYXliZShzdHJ1Y3QgcGF0aGVsZW0gKnBhdGgpCit7CisgICAgRElSICpkaXI7CisKKyAgICBpZiAoKGRpciA9IG9wZW5kaXIocGF0aC0+cGF0aG5hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQgKmRpcmVudDsKKworICAgICAgICB3aGlsZSAoKGRpcmVudCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFzdHJlcShkaXJlbnQtPmRfbmFtZSwiLiIpICYmICFzdHJlcShkaXJlbnQtPmRfbmFtZSwiLi4iKSl7CisgICAgICAgICAgICAgICAgcGF0aCA9IGFkZF9lbnRyeShwYXRoLCBkaXJlbnQtPmRfbmFtZSwgZGlyZW50X3R5cGUoZGlyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2VkaXIoZGlyKTsKKyAgICB9CisgICAgcmV0dXJuIHBhdGg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGF0aGVsZW0gKmFkZF9lbnRyeShzdHJ1Y3QgcGF0aGVsZW0gKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdHlwZSkKK3sKKyAgICBzdHJ1Y3QgcGF0aGVsZW0gKiplOworCisgICAgcm9vdC0+bnVtX2VudHJpZXMrKzsKKworICAgIHJvb3QgPSByZWFsbG9jKHJvb3QsIHNpemVvZigqcm9vdCkKKyAgICAgICAgICAgICAgICAgICArIHNpemVvZihyb290LT5lbnRyaWVzWzBdKSpyb290LT5udW1fZW50cmllcyk7CisgICAgZSA9ICZyb290LT5lbnRyaWVzW3Jvb3QtPm51bV9lbnRyaWVzLTFdOworCisgICAgKmUgPSBuZXdfZW50cnkocm9vdC0+cGF0aG5hbWUsIHJvb3QsIG5hbWUpOworICAgIGlmIChpc19kaXJfbWF5YmUodHlwZSkpIHsKKyAgICAgICAgKmUgPSBhZGRfZGlyX21heWJlKCplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcm9vdDsKK30KKworLyogVGhpcyBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRyZWUgaXMgc3RhYmlsaXplZCAoaWUuIG5vIG1vcmUgcmVhbGxvY3MhKS4gKi8KK3N0YXRpYyB2b2lkIHNldF9wYXJlbnRzKHN0cnVjdCBwYXRoZWxlbSAqY2hpbGQsIHN0cnVjdCBwYXRoZWxlbSAqcGFyZW50KQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hpbGQtPm51bV9lbnRyaWVzOyBpKyspCisgICAgICAgIHNldF9wYXJlbnRzKGNoaWxkLT5lbnRyaWVzW2ldLCBjaGlsZCk7Cit9CisKKy8qIEZJWE1FOiBEb2Vzbid0IGhhbmRsZSBESVIvLi4gd2hlcmUgRElSIGlzIG5vdCBpbiBlbXVsYXRlZCBkaXIuICovCitzdGF0aWMgY29uc3QgY2hhciAqCitmb2xsb3dfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aGVsZW0gKmN1cnNvciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgbmFtZWxlbjsKKworICAgIG5hbWUgKz0gc3Ryc3BuKG5hbWUsICIvIik7CisgICAgbmFtZWxlbiA9IHN0cmNzcG4obmFtZSwgIi8iKTsKKworICAgIGlmIChuYW1lbGVuID09IDApCisgICAgICAgIHJldHVybiBjdXJzb3ItPnBhdGhuYW1lOworCisgICAgaWYgKHN0cm5lcShuYW1lLCBuYW1lbGVuLCAiLi4iKSkKKyAgICAgICAgcmV0dXJuIGZvbGxvd19wYXRoKGN1cnNvci0+cGFyZW50LCBuYW1lICsgbmFtZWxlbik7CisKKyAgICBpZiAoc3RybmVxKG5hbWUsIG5hbWVsZW4sICIuIikpCisgICAgICAgIHJldHVybiBmb2xsb3dfcGF0aChjdXJzb3IsIG5hbWUgKyBuYW1lbGVuKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdXJzb3ItPm51bV9lbnRyaWVzOyBpKyspCisgICAgICAgIGlmIChzdHJuZXEobmFtZSwgbmFtZWxlbiwgY3Vyc29yLT5lbnRyaWVzW2ldLT5uYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBmb2xsb3dfcGF0aChjdXJzb3ItPmVudHJpZXNbaV0sIG5hbWUgKyBuYW1lbGVuKTsKKworICAgIC8qIE5vdCBmb3VuZCAqLworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGluaXRfcGF0aHMoY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGNoYXIgcHJlZl9idWZbUEFUSF9NQVhdOworCisgICAgaWYgKHByZWZpeFswXSA9PSAnXDAnIHx8CisgICAgICAgICFzdHJjbXAocHJlZml4LCAiLyIpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocHJlZml4WzBdICE9ICcvJykgeworICAgICAgICBjaGFyICpjd2QgPSBnZXRjd2QoTlVMTCwgMCk7CisgICAgICAgIHNpemVfdCBwcmVmX2J1Zl9sZW4gPSBzaXplb2YocHJlZl9idWYpOworCisgICAgICAgIGlmICghY3dkKQorICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgcHN0cmNweShwcmVmX2J1Ziwgc2l6ZW9mKHByZWZfYnVmKSwgY3dkKTsKKyAgICAgICAgcHN0cmNhdChwcmVmX2J1ZiwgcHJlZl9idWZfbGVuLCAiLyIpOworICAgICAgICBwc3RyY2F0KHByZWZfYnVmLCBwcmVmX2J1Zl9sZW4sIHByZWZpeCk7CisgICAgICAgIGZyZWUoY3dkKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcHN0cmNweShwcmVmX2J1Ziwgc2l6ZW9mKHByZWZfYnVmKSwgcHJlZml4ICsgMSk7CisKKyAgICBiYXNlID0gbmV3X2VudHJ5KCIiLCBOVUxMLCBwcmVmX2J1Zik7CisgICAgYmFzZSA9IGFkZF9kaXJfbWF5YmUoYmFzZSk7CisgICAgaWYgKGJhc2UtPm51bV9lbnRyaWVzID09IDApIHsKKyAgICAgICAgZnJlZSAoYmFzZSk7CisgICAgICAgIGJhc2UgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9wYXJlbnRzKGJhc2UsIGJhc2UpOworICAgIH0KK30KKworLyogTG9vayBmb3IgcGF0aCBpbiBlbXVsYXRpb24gZGlyLCBvdGhlcndpc2UgcmV0dXJuIG5hbWUuICovCitjb25zdCBjaGFyICpwYXRoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgLyogT25seSBkbyBhYnNvbHV0ZSBwYXRoczogcXVpY2sgYW5kIGRpcnR5LCBidXQgc2hvdWxkIG1vc3RseSBiZSBPSy4KKyAgICAgICBDb3VsZCBkbyByZWxhdGl2ZSBieSB0cmFja2luZyBjd2QuICovCisgICAgaWYgKCFiYXNlIHx8ICFuYW1lIHx8IG5hbWVbMF0gIT0gJy8nKQorICAgICAgICByZXR1cm4gbmFtZTsKKworICAgIHJldHVybiBmb2xsb3dfcGF0aChiYXNlLCBuYW1lKSA/OiBuYW1lOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtY29uZmlnLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODEzY2UxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtY29uZmlnLmMKQEAgLTAsMCArMSw2NzIgQEAKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorI2luY2x1ZGUgInFlbXUvZXJyb3ItcmVwb3J0LmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKyNpbmNsdWRlICJxZW11L2NvbmZpZy1maWxlLmgiCisjaW5jbHVkZSAiaHcvcWRldi5oIgorCitzdGF0aWMgUWVtdU9wdHNMaXN0IHFlbXVfZHJpdmVfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJkcml2ZSIsCisgICAgLmhlYWQgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihxZW11X2RyaXZlX29wdHMuaGVhZCksCisgICAgLmRlc2MgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gImJ1cyIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgICAgIC5oZWxwID0gImJ1cyBudW1iZXIiLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInVuaXQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgICAgICAuaGVscCA9ICJ1bml0IG51bWJlciAoaS5lLiBsdW4gZm9yIHNjc2kpIiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJpZiIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgICAgIC5oZWxwID0gImludGVyZmFjZSAoaWRlLCBzY3NpLCBzZCwgbXRkLCBmbG9wcHksIHBmbGFzaCwgdmlydGlvKSIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaW5kZXgiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiY3lscyIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgICAgIC5oZWxwID0gIm51bWJlciBvZiBjeWxpbmRlcnMgKGlkZSBkaXNrIGdlb21ldHJ5KSIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaGVhZHMiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgICAgICAuaGVscCA9ICJudW1iZXIgb2YgaGVhZHMgKGlkZSBkaXNrIGdlb21ldHJ5KSIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAic2VjcyIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgICAgIC5oZWxwID0gIm51bWJlciBvZiBzZWN0b3JzIChpZGUgZGlzayBnZW9tZXRyeSkiLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInRyYW5zIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICAgICAgLmhlbHAgPSAiY2hzIHRyYW5zbGF0aW9uIChhdXRvLCBsYmEuIG5vbmUpIiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJtZWRpYSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgICAgIC5oZWxwID0gIm1lZGlhIHR5cGUgKGRpc2ssIGNkcm9tKSIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAic25hcHNob3QiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImZpbGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgICAgICAuaGVscCA9ICJkaXNrIGltYWdlIiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJjYWNoZSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgICAgIC5oZWxwID0gImhvc3QgY2FjaGUgdXNhZ2UgKG5vbmUsIHdyaXRlYmFjaywgd3JpdGV0aHJvdWdoLCB1bnNhZmUpIiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJhaW8iLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgICAgICAuaGVscCA9ICJob3N0IEFJTyBpbXBsZW1lbnRhdGlvbiAodGhyZWFkcywgbmF0aXZlKSIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiZm9ybWF0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICAgICAgLmhlbHAgPSAiZGlzayBmb3JtYXQgKHJhdywgcWNvdzIsIC4uLikiLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInNlcmlhbCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJyZXJyb3IiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAid2Vycm9yIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImFkZHIiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgICAgICAuaGVscCA9ICJwY2kgYWRkcmVzcyAodmlydGlvIG9ubHkpIiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJyZWFkb25seSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisgICAgICAgIH0sCisgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfQorICAgIH0sCit9OworCitzdGF0aWMgUWVtdU9wdHNMaXN0IHFlbXVfY2hhcmRldl9vcHRzID0geworICAgIC5uYW1lID0gImNoYXJkZXYiLAorICAgIC5pbXBsaWVkX29wdF9uYW1lID0gImJhY2tlbmQiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9jaGFyZGV2X29wdHMuaGVhZCksCisgICAgLmRlc2MgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gImJhY2tlbmQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAicGF0aCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJob3N0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInBvcnQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAibG9jYWxhZGRyIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImxvY2FscG9ydCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJ0byIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJpcHY0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJpcHY2IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJ3YWl0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJzZXJ2ZXIiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImRlbGF5IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJ0ZWxuZXQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gIndpZHRoIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfTlVNQkVSLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImhlaWdodCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJjb2xzIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfTlVNQkVSLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInJvd3MiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAibXV4IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJzaWduYWwiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gIm5hbWUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiZGVidWciLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0sCisgICAgICAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfQorICAgIH0sCit9OworCitRZW11T3B0c0xpc3QgcWVtdV9mc2Rldl9vcHRzID0geworICAgIC5uYW1lID0gImZzZGV2IiwKKyAgICAuaW1wbGllZF9vcHRfbmFtZSA9ICJmc3R5cGUiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9mc2Rldl9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJmc3R5cGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgIC5uYW1lID0gInBhdGgiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgIC5uYW1lID0gInNlY3VyaXR5X21vZGVsIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LAorICAgICAgICB7IC8qRW5kIG9mIGxpc3QgKi8gfQorICAgIH0sCit9OworCitRZW11T3B0c0xpc3QgcWVtdV92aXJ0ZnNfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJ2aXJ0ZnMiLAorICAgIC5pbXBsaWVkX29wdF9uYW1lID0gImZzdHlwZSIsCisgICAgLmhlYWQgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihxZW11X3ZpcnRmc19vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJmc3R5cGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgIC5uYW1lID0gInBhdGgiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgIC5uYW1lID0gIm1vdW50X3RhZyIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSwgeworICAgICAgICAgICAgLm5hbWUgPSAic2VjdXJpdHlfbW9kZWwiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sCisKKyAgICAgICAgeyAvKkVuZCBvZiBsaXN0ICovIH0KKyAgICB9LAorfTsKKworc3RhdGljIFFlbXVPcHRzTGlzdCBxZW11X2RldmljZV9vcHRzID0geworICAgIC5uYW1lID0gImRldmljZSIsCisgICAgLmltcGxpZWRfb3B0X25hbWUgPSAiZHJpdmVyIiwKKyAgICAuaGVhZCA9IFFUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKHFlbXVfZGV2aWNlX29wdHMuaGVhZCksCisgICAgLmRlc2MgPSB7CisgICAgICAgIC8qCisgICAgICAgICAqIG5vIGVsZW1lbnRzID0+IGFjY2VwdCBhbnkKKyAgICAgICAgICogc2FuaXR5IGNoZWNraW5nIHdpbGwgaGFwcGVuIGxhdGVyCisgICAgICAgICAqIHdoZW4gc2V0dGluZyBkZXZpY2UgcHJvcGVydGllcworICAgICAgICAgKi8KKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKK3N0YXRpYyBRZW11T3B0c0xpc3QgcWVtdV9uZXRkZXZfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJuZXRkZXYiLAorICAgIC5pbXBsaWVkX29wdF9uYW1lID0gInR5cGUiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9uZXRkZXZfb3B0cy5oZWFkKSwKKyAgICAuZGVzYyA9IHsKKyAgICAgICAgLyoKKyAgICAgICAgICogbm8gZWxlbWVudHMgPT4gYWNjZXB0IGFueSBwYXJhbXMKKyAgICAgICAgICogdmFsaWRhdGlvbiB3aWxsIGhhcHBlbiBsYXRlcgorICAgICAgICAgKi8KKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKK3N0YXRpYyBRZW11T3B0c0xpc3QgcWVtdV9uZXRfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJuZXQiLAorICAgIC5pbXBsaWVkX29wdF9uYW1lID0gInR5cGUiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9uZXRfb3B0cy5oZWFkKSwKKyAgICAuZGVzYyA9IHsKKyAgICAgICAgLyoKKyAgICAgICAgICogbm8gZWxlbWVudHMgPT4gYWNjZXB0IGFueSBwYXJhbXMKKyAgICAgICAgICogdmFsaWRhdGlvbiB3aWxsIGhhcHBlbiBsYXRlcgorICAgICAgICAgKi8KKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKK3N0YXRpYyBRZW11T3B0c0xpc3QgcWVtdV9ydGNfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJydGMiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9ydGNfb3B0cy5oZWFkKSwKKyAgICAuZGVzYyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAiYmFzZSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJjbG9jayIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJkcmlmdGZpeCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKK3N0YXRpYyBRZW11T3B0c0xpc3QgcWVtdV9nbG9iYWxfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJnbG9iYWwiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9nbG9iYWxfb3B0cy5oZWFkKSwKKyAgICAuZGVzYyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAiZHJpdmVyIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInByb3BlcnR5IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInZhbHVlIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LAorICAgICAgICB7IC8qIGVuZCBvZiBsaXN0ICovIH0KKyAgICB9LAorfTsKKworc3RhdGljIFFlbXVPcHRzTGlzdCBxZW11X21vbl9vcHRzID0geworICAgIC5uYW1lID0gIm1vbiIsCisgICAgLmltcGxpZWRfb3B0X25hbWUgPSAiY2hhcmRldiIsCisgICAgLmhlYWQgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihxZW11X21vbl9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJtb2RlIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImNoYXJkZXYiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAicHJldHR5IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKKyNpZmRlZiBDT05GSUdfU0lNUExFX1RSQUNFCitzdGF0aWMgUWVtdU9wdHNMaXN0IHFlbXVfdHJhY2Vfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJ0cmFjZSIsCisgICAgLmltcGxpZWRfb3B0X25hbWUgPSAidHJhY2UiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV90cmFjZV9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJmaWxlIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LAorICAgICAgICB7IC8qIGVuZCBpZiBsaXN0ICovIH0KKyAgICB9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgUWVtdU9wdHNMaXN0IHFlbXVfY3B1ZGVmX29wdHMgPSB7CisgICAgLm5hbWUgPSAiY3B1ZGVmIiwKKyAgICAuaGVhZCA9IFFUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKHFlbXVfY3B1ZGVmX29wdHMuaGVhZCksCisgICAgLmRlc2MgPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC5uYW1lID0gIm5hbWUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAibGV2ZWwiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAidmVuZG9yIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImZhbWlseSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJtb2RlbCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJzdGVwcGluZyIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJmZWF0dXJlX2VkeCIsICAgICAgLyogY3B1aWQgMDAwMF8wMDAxLmVkeCAqLworICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiZmVhdHVyZV9lY3giLCAgICAgIC8qIGNwdWlkIDAwMDBfMDAwMS5lY3ggKi8KKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImV4dGZlYXR1cmVfZWR4IiwgICAvKiBjcHVpZCA4MDAwXzAwMDEuZWR4ICovCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJleHRmZWF0dXJlX2VjeCIsICAgLyogY3B1aWQgODAwMF8wMDAxLmVjeCAqLworICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAieGxldmVsIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfTlVNQkVSLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gIm1vZGVsX2lkIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInZlbmRvcl9vdmVycmlkZSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBlbmQgb2YgbGlzdCAqLyB9CisgICAgfSwKK307CisKK1FlbXVPcHRzTGlzdCBxZW11X3NwaWNlX29wdHMgPSB7CisgICAgLm5hbWUgPSAic3BpY2UiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIocWVtdV9zcGljZV9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJwb3J0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfTlVNQkVSLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInRscy1wb3J0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfTlVNQkVSLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImFkZHIiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaXB2NCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaXB2NiIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAicGFzc3dvcmQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiZGlzYWJsZS10aWNrZXRpbmciLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gIng1MDktZGlyIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gIng1MDkta2V5LWZpbGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAieDUwOS1rZXktcGFzc3dvcmQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAieDUwOS1jZXJ0LWZpbGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAieDUwOS1jYWNlcnQtZmlsZSIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJ4NTA5LWRoLWtleS1maWxlIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInRscy1jaXBoZXJzIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInRscy1jaGFubmVsIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInBsYWludGV4dC1jaGFubmVsIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImltYWdlLWNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImpwZWctd2FuLWNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInpsaWItZ2x6LXdhbi1jb21wcmVzc2lvbiIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJzdHJlYW1pbmctdmlkZW8iLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiYWdlbnQtbW91c2UiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9CT09MLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInBsYXliYWNrLWNvbXByZXNzaW9uIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBlbmQgaWYgbGlzdCAqLyB9CisgICAgfSwKK307CisKK1FlbXVPcHRzTGlzdCBxZW11X29wdGlvbl9yb21fb3B0cyA9IHsKKyAgICAubmFtZSA9ICJvcHRpb24tcm9tIiwKKyAgICAuaW1wbGllZF9vcHRfbmFtZSA9ICJyb21maWxlIiwKKyAgICAuaGVhZCA9IFFUQUlMUV9IRUFEX0lOSVRJQUxJWkVSKHFlbXVfb3B0aW9uX3JvbV9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJib290aW5kZXgiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0sIHsKKyAgICAgICAgICAgIC5uYW1lID0gInJvbWZpbGUiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0sCisgICAgICAgIHsgLyogZW5kIGlmIGxpc3QgKi8gfQorICAgIH0sCit9OworCitzdGF0aWMgUWVtdU9wdHNMaXN0ICp2bV9jb25maWdfZ3JvdXBzWzMyXSA9IHsKKyAgICAmcWVtdV9kcml2ZV9vcHRzLAorICAgICZxZW11X2NoYXJkZXZfb3B0cywKKyAgICAmcWVtdV9kZXZpY2Vfb3B0cywKKyAgICAmcWVtdV9uZXRkZXZfb3B0cywKKyAgICAmcWVtdV9uZXRfb3B0cywKKyAgICAmcWVtdV9ydGNfb3B0cywKKyAgICAmcWVtdV9nbG9iYWxfb3B0cywKKyAgICAmcWVtdV9tb25fb3B0cywKKyAgICAmcWVtdV9jcHVkZWZfb3B0cywKKyNpZmRlZiBDT05GSUdfU0lNUExFX1RSQUNFCisgICAgJnFlbXVfdHJhY2Vfb3B0cywKKyNlbmRpZgorICAgICZxZW11X29wdGlvbl9yb21fb3B0cywKKyAgICBOVUxMLAorfTsKKworc3RhdGljIFFlbXVPcHRzTGlzdCAqZmluZF9saXN0KFFlbXVPcHRzTGlzdCAqKmxpc3RzLCBjb25zdCBjaGFyICpncm91cCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGxpc3RzW2ldICE9IE5VTEw7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKGxpc3RzW2ldLT5uYW1lLCBncm91cCkgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAobGlzdHNbaV0gPT0gTlVMTCkgeworICAgICAgICBlcnJvcl9yZXBvcnQoInRoZXJlIGlzIG5vIG9wdGlvbiBncm91cCBcIiVzXCIiLCBncm91cCk7CisgICAgfQorICAgIHJldHVybiBsaXN0c1tpXTsKK30KKworUWVtdU9wdHNMaXN0ICpxZW11X2ZpbmRfb3B0cyhjb25zdCBjaGFyICpncm91cCkKK3sKKyAgICByZXR1cm4gZmluZF9saXN0KHZtX2NvbmZpZ19ncm91cHMsIGdyb3VwKTsKK30KKwordm9pZCBxZW11X2FkZF9vcHRzKFFlbXVPcHRzTGlzdCAqbGlzdCkKK3sKKyAgICBpbnQgZW50cmllcywgaTsKKworICAgIGVudHJpZXMgPSBBUlJBWV9TSVpFKHZtX2NvbmZpZ19ncm91cHMpOworICAgIGVudHJpZXMtLTsgLyoga2VlcCBsaXN0IE5VTEwgdGVybWluYXRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWYgKHZtX2NvbmZpZ19ncm91cHNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgdm1fY29uZmlnX2dyb3Vwc1tpXSA9IGxpc3Q7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJyYW4gb3V0IG9mIHNwYWNlIGluIHZtX2NvbmZpZ19ncm91cHMiKTsKKyAgICBhYm9ydCgpOworfQorCitpbnQgcWVtdV9zZXRfb3B0aW9uKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyIGdyb3VwWzY0XSwgaWRbNjRdLCBhcmdbNjRdOworICAgIFFlbXVPcHRzTGlzdCAqbGlzdDsKKyAgICBRZW11T3B0cyAqb3B0czsKKyAgICBpbnQgcmMsIG9mZnNldDsKKworICAgIHJjID0gc3NjYW5mKHN0ciwgIiU2M1teLl0uJTYzW14uXS4lNjNbXj1dJW4iLCBncm91cCwgaWQsIGFyZywgJm9mZnNldCk7CisgICAgaWYgKHJjIDwgMyB8fCBzdHJbb2Zmc2V0XSAhPSAnPScpIHsKKyAgICAgICAgZXJyb3JfcmVwb3J0KCJjYW4ndCBwYXJzZTogXCIlc1wiIiwgc3RyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGxpc3QgPSBxZW11X2ZpbmRfb3B0cyhncm91cCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgb3B0cyA9IHFlbXVfb3B0c19maW5kKGxpc3QsIGlkKTsKKyAgICBpZiAoIW9wdHMpIHsKKyAgICAgICAgZXJyb3JfcmVwb3J0KCJ0aGVyZSBpcyBubyAlcyBcIiVzXCIgZGVmaW5lZCIsCisgICAgICAgICAgICAgICAgICAgICBsaXN0LT5uYW1lLCBpZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAocWVtdV9vcHRfc2V0KG9wdHMsIGFyZywgc3RyK29mZnNldCsxKSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgcWVtdV9nbG9iYWxfb3B0aW9uKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjaGFyIGRyaXZlcls2NF0sIHByb3BlcnR5WzY0XTsKKyAgICBRZW11T3B0cyAqb3B0czsKKyAgICBpbnQgcmMsIG9mZnNldDsKKworICAgIHJjID0gc3NjYW5mKHN0ciwgIiU2M1teLl0uJTYzW149XSVuIiwgZHJpdmVyLCBwcm9wZXJ0eSwgJm9mZnNldCk7CisgICAgaWYgKHJjIDwgMiB8fCBzdHJbb2Zmc2V0XSAhPSAnPScpIHsKKyAgICAgICAgZXJyb3JfcmVwb3J0KCJjYW4ndCBwYXJzZTogXCIlc1wiIiwgc3RyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKCZxZW11X2dsb2JhbF9vcHRzLCBOVUxMLCAwKTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgImRyaXZlciIsIGRyaXZlcik7CisgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwcm9wZXJ0eSIsIHByb3BlcnR5KTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgInZhbHVlIiwgc3RyK29mZnNldCsxKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RydWN0IENvbmZpZ1dyaXRlRGF0YSB7CisgICAgUWVtdU9wdHNMaXN0ICpsaXN0OworICAgIEZJTEUgKmZwOworfTsKKworc3RhdGljIGludCBjb25maWdfd3JpdGVfb3B0KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpvcGFxdWUpCit7CisgICAgc3RydWN0IENvbmZpZ1dyaXRlRGF0YSAqZGF0YSA9IG9wYXF1ZTsKKworICAgIGZwcmludGYoZGF0YS0+ZnAsICIgICVzID0gXCIlc1wiXG4iLCBuYW1lLCB2YWx1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX29wdHMoUWVtdU9wdHMgKm9wdHMsIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBzdHJ1Y3QgQ29uZmlnV3JpdGVEYXRhICpkYXRhID0gb3BhcXVlOworICAgIGNvbnN0IGNoYXIgKmlkID0gcWVtdV9vcHRzX2lkKG9wdHMpOworCisgICAgaWYgKGlkKSB7CisgICAgICAgIGZwcmludGYoZGF0YS0+ZnAsICJbJXMgXCIlc1wiXVxuIiwgZGF0YS0+bGlzdC0+bmFtZSwgaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoZGF0YS0+ZnAsICJbJXNdXG4iLCBkYXRhLT5saXN0LT5uYW1lKTsKKyAgICB9CisgICAgcWVtdV9vcHRfZm9yZWFjaChvcHRzLCBjb25maWdfd3JpdGVfb3B0LCBkYXRhLCAwKTsKKyAgICBmcHJpbnRmKGRhdGEtPmZwLCAiXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBxZW11X2NvbmZpZ193cml0ZShGSUxFICpmcCkKK3sKKyAgICBzdHJ1Y3QgQ29uZmlnV3JpdGVEYXRhIGRhdGEgPSB7IC5mcCA9IGZwIH07CisgICAgUWVtdU9wdHNMaXN0ICoqbGlzdHMgPSB2bV9jb25maWdfZ3JvdXBzOworICAgIGludCBpOworCisgICAgZnByaW50ZihmcCwgIiMgcWVtdSBjb25maWcgZmlsZVxuXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBsaXN0c1tpXSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgZGF0YS5saXN0ID0gbGlzdHNbaV07CisgICAgICAgIHFlbXVfb3B0c19mb3JlYWNoKGRhdGEubGlzdCwgY29uZmlnX3dyaXRlX29wdHMsICZkYXRhLCAwKTsKKyAgICB9Cit9CisKK2ludCBxZW11X2NvbmZpZ19wYXJzZShGSUxFICpmcCwgUWVtdU9wdHNMaXN0ICoqbGlzdHMsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworICAgIGNoYXIgbGluZVsxMDI0XSwgZ3JvdXBbNjRdLCBpZFs2NF0sIGFyZ1s2NF0sIHZhbHVlWzEwMjRdOworICAgIExvY2F0aW9uIGxvYzsKKyAgICBRZW11T3B0c0xpc3QgKmxpc3QgPSBOVUxMOworICAgIFFlbXVPcHRzICpvcHRzID0gTlVMTDsKKyAgICBpbnQgcmVzID0gLTEsIGxubyA9IDA7CisKKyAgICBsb2NfcHVzaF9ub25lKCZsb2MpOworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSAhPSBOVUxMKSB7CisgICAgICAgIGxvY19zZXRfZmlsZShmbmFtZSwgKytsbm8pOworICAgICAgICBpZiAobGluZVswXSA9PSAnXG4nKSB7CisgICAgICAgICAgICAvKiBza2lwIGVtcHR5IGxpbmVzICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluZVswXSA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzc2NhbmYobGluZSwgIlslNjNzIFwiJTYzW15cIl1cIl0iLCBncm91cCwgaWQpID09IDIpIHsKKyAgICAgICAgICAgIC8qIGdyb3VwIHdpdGggaWQgKi8KKyAgICAgICAgICAgIGxpc3QgPSBmaW5kX2xpc3QobGlzdHMsIGdyb3VwKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICBvcHRzID0gcWVtdV9vcHRzX2NyZWF0ZShsaXN0LCBpZCwgMSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3NjYW5mKGxpbmUsICJbJTYzW15dXV0iLCBncm91cCkgPT0gMSkgeworICAgICAgICAgICAgLyogZ3JvdXAgd2l0aG91dCBpZCAqLworICAgICAgICAgICAgbGlzdCA9IGZpbmRfbGlzdChsaXN0cywgZ3JvdXApOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKGxpc3QsIE5VTEwsIDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiICU2M3MgPSBcIiUxMDIzW15cIl1cIiIsIGFyZywgdmFsdWUpID09IDIpIHsKKyAgICAgICAgICAgIC8qIGFyZyA9IHZhbHVlICovCisgICAgICAgICAgICBpZiAob3B0cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyb3JfcmVwb3J0KCJubyBncm91cCBkZWZpbmVkIik7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocWVtdV9vcHRfc2V0KG9wdHMsIGFyZywgdmFsdWUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVycm9yX3JlcG9ydCgicGFyc2UgZXJyb3IiKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmIChmZXJyb3IoZnApKSB7CisgICAgICAgIGVycm9yX3JlcG9ydCgiZXJyb3IgcmVhZGluZyBmaWxlIik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXMgPSAwOworb3V0OgorICAgIGxvY19wb3AoJmxvYyk7CisgICAgcmV0dXJuIHJlczsKK30KKworaW50IHFlbXVfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaW50IHJldDsKKworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICByZXQgPSBxZW11X2NvbmZpZ19wYXJzZShmLCB2bV9jb25maWdfZ3JvdXBzLCBmaWxlbmFtZSk7CisgICAgZmNsb3NlKGYpOworCisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LWVycm9yLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmFkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1lcnJvci5jCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogRXJyb3IgcmVwb3J0aW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFJlZCBIYXQgSW5jLgorICoKKyAqIEF1dGhvcnM6CisgKiAgTWFya3VzIEFybWJydXN0ZXIgPGFybWJydUByZWRoYXQuY29tPiwKKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtb25pdG9yL21vbml0b3IuaCIKKworLyoKKyAqIFByaW50IHRvIGN1cnJlbnQgbW9uaXRvciBpZiB3ZSBoYXZlIG9uZSwgZWxzZSB0byBzdGRlcnIuCisgKiBUT0RPIHNob3VsZCByZXR1cm4gaW50LCBzbyBjYWxsZXJzIGNhbiBjYWxjdWxhdGUgd2lkdGgsIGJ1dCB0aGF0CisgKiByZXF1aXJlcyBzdXJnZXJ5IHRvIG1vbml0b3JfdnByaW50ZigpLiAgTGVmdCBmb3IgYW5vdGhlciBkYXkuCisgKi8KK3ZvaWQgZXJyb3JfdnByaW50Zihjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisgICAgaWYgKGN1cl9tb24pIHsKKyAgICAgICAgbW9uaXRvcl92cHJpbnRmKGN1cl9tb24sIGZtdCwgYXApOworICAgIH0gZWxzZSB7CisgICAgICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisgICAgfQorfQorCisvKgorICogUHJpbnQgdG8gY3VycmVudCBtb25pdG9yIGlmIHdlIGhhdmUgb25lLCBlbHNlIHRvIHN0ZGVyci4KKyAqIFRPRE8ganVzdCBsaWtlIGVycm9yX3ZwcmludGYoKQorICovCit2b2lkIGVycm9yX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgICB2YV9saXN0IGFwOworCisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgZXJyb3JfdnByaW50ZihmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIGVycm9yX3ByaW50Zl91bmxlc3NfcW1wKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICBpZiAoIW1vbml0b3JfY3VyX2lzX3FtcCgpKSB7CisgICAgICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgICAgICBlcnJvcl92cHJpbnRmKGZtdCwgYXApOworICAgICAgICB2YV9lbmQoYXApOworICAgIH0KK30KKworc3RhdGljIExvY2F0aW9uIHN0ZF9sb2MgPSB7CisgICAgLmtpbmQgPSBMT0NfTk9ORQorfTsKK3N0YXRpYyBMb2NhdGlvbiAqY3VyX2xvYyA9ICZzdGRfbG9jOworCisvKgorICogUHVzaCBsb2NhdGlvbiBzYXZlZCBpbiBMT0Mgb250byB0aGUgbG9jYXRpb24gc3RhY2ssIHJldHVybiBpdC4KKyAqIFRoZSB0b3Agb2YgdGhhdCBzdGFjayBpcyB0aGUgY3VycmVudCBsb2NhdGlvbi4KKyAqIE5lZWRzIGEgbWF0Y2hpbmcgbG9jX3BvcCgpLgorICovCitMb2NhdGlvbiAqbG9jX3B1c2hfcmVzdG9yZShMb2NhdGlvbiAqbG9jKQoreworICAgIGFzc2VydCghbG9jLT5wcmV2KTsKKyAgICBsb2MtPnByZXYgPSBjdXJfbG9jOworICAgIGN1cl9sb2MgPSBsb2M7CisgICAgcmV0dXJuIGxvYzsKK30KKworLyoKKyAqIEluaXRpYWxpemUgKkxPQyB0byAibm93aGVyZSIsIHB1c2ggaXQgb250byB0aGUgbG9jYXRpb24gc3RhY2suCisgKiBUaGUgdG9wIG9mIHRoYXQgc3RhY2sgaXMgdGhlIGN1cnJlbnQgbG9jYXRpb24uCisgKiBOZWVkcyBhIG1hdGNoaW5nIGxvY19wb3AoKS4KKyAqIFJldHVybiBMT0MuCisgKi8KK0xvY2F0aW9uICpsb2NfcHVzaF9ub25lKExvY2F0aW9uICpsb2MpCit7CisgICAgbG9jLT5raW5kID0gTE9DX05PTkU7CisgICAgbG9jLT5wcmV2ID0gTlVMTDsKKyAgICByZXR1cm4gbG9jX3B1c2hfcmVzdG9yZShsb2MpOworfQorCisvKgorICogUG9wIHRoZSBsb2NhdGlvbiBzdGFjay4KKyAqIExPQyBtdXN0IGJlIHRoZSBjdXJyZW50IGxvY2F0aW9uLCBpLmUuIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgorICovCitMb2NhdGlvbiAqbG9jX3BvcChMb2NhdGlvbiAqbG9jKQoreworICAgIGFzc2VydChjdXJfbG9jID09IGxvYyAmJiBsb2MtPnByZXYpOworICAgIGN1cl9sb2MgPSBsb2MtPnByZXY7CisgICAgbG9jLT5wcmV2ID0gTlVMTDsKKyAgICByZXR1cm4gbG9jOworfQorCisvKgorICogU2F2ZSB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiBMT0MsIHJldHVybiBMT0MuCisgKi8KK0xvY2F0aW9uICpsb2Nfc2F2ZShMb2NhdGlvbiAqbG9jKQoreworICAgICpsb2MgPSAqY3VyX2xvYzsKKyAgICBsb2MtPnByZXYgPSBOVUxMOworICAgIHJldHVybiBsb2M7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gdGhlIG9uZSBzYXZlZCBpbiBMT0MuCisgKi8KK3ZvaWQgbG9jX3Jlc3RvcmUoTG9jYXRpb24gKmxvYykKK3sKKyAgICBMb2NhdGlvbiAqcHJldiA9IGN1cl9sb2MtPnByZXY7CisgICAgYXNzZXJ0KCFsb2MtPnByZXYpOworICAgICpjdXJfbG9jID0gKmxvYzsKKyAgICBjdXJfbG9jLT5wcmV2ID0gcHJldjsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgY3VycmVudCBsb2NhdGlvbiB0byAibm93aGVyZSBpbiBwYXJ0aWN1bGFyIi4KKyAqLwordm9pZCBsb2Nfc2V0X25vbmUodm9pZCkKK3sKKyAgICBjdXJfbG9jLT5raW5kID0gTE9DX05PTkU7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gYXJndW1lbnQgQVJHVltJRFguLklEWCtDTlQtMV0uCisgKi8KK3ZvaWQgbG9jX3NldF9jbWRsaW5lKGNoYXIgKiphcmd2LCBpbnQgaWR4LCBpbnQgY250KQoreworICAgIGN1cl9sb2MtPmtpbmQgPSBMT0NfQ01ETElORTsKKyAgICBjdXJfbG9jLT5udW0gPSBjbnQ7CisgICAgY3VyX2xvYy0+cHRyID0gYXJndiArIGlkeDsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBmaWxlIEZOQU1FLCBsaW5lIExOTy4KKyAqLwordm9pZCBsb2Nfc2V0X2ZpbGUoY29uc3QgY2hhciAqZm5hbWUsIGludCBsbm8pCit7CisgICAgYXNzZXJ0IChmbmFtZSB8fCBjdXJfbG9jLT5raW5kID09IExPQ19GSUxFKTsKKyAgICBjdXJfbG9jLT5raW5kID0gTE9DX0ZJTEU7CisgICAgY3VyX2xvYy0+bnVtID0gbG5vOworICAgIGlmIChmbmFtZSkgeworICAgICAgICBjdXJfbG9jLT5wdHIgPSBmbmFtZTsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nbmFtZTsKKworLyoKKyAqIFNldCB0aGUgcHJvZ3JhbSBuYW1lIGZvciBlcnJvcl9wcmludF9sb2MoKS4KKyAqLwordm9pZCBlcnJvcl9zZXRfcHJvZ25hbWUoY29uc3QgY2hhciAqYXJndjApCit7CisgICAgY29uc3QgY2hhciAqcCA9IHN0cnJjaHIoYXJndjAsICcvJyk7CisgICAgcHJvZ25hbWUgPSBwID8gcCArIDEgOiBhcmd2MDsKK30KKworY29uc3QgY2hhciAqZXJyb3JfZ2V0X3Byb2duYW1lKHZvaWQpCit7CisgICAgcmV0dXJuIHByb2duYW1lOworfQorCisvKgorICogUHJpbnQgY3VycmVudCBsb2NhdGlvbiB0byBjdXJyZW50IG1vbml0b3IgaWYgd2UgaGF2ZSBvbmUsIGVsc2UgdG8gc3RkZXJyLgorICovCit2b2lkIGVycm9yX3ByaW50X2xvYyh2b2lkKQoreworICAgIGNvbnN0IGNoYXIgKnNlcCA9ICIiOworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICphcmdwOworCisgICAgaWYgKCFjdXJfbW9uICYmIHByb2duYW1lKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IiwgcHJvZ25hbWUpOworICAgICAgICBzZXAgPSAiICI7CisgICAgfQorICAgIHN3aXRjaCAoY3VyX2xvYy0+a2luZCkgeworICAgIGNhc2UgTE9DX0NNRExJTkU6CisgICAgICAgIGFyZ3AgPSBjdXJfbG9jLT5wdHI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJfbG9jLT5udW07IGkrKykgeworICAgICAgICAgICAgZXJyb3JfcHJpbnRmKCIlcyVzIiwgc2VwLCBhcmdwW2ldKTsKKyAgICAgICAgICAgIHNlcCA9ICIgIjsKKyAgICAgICAgfQorICAgICAgICBlcnJvcl9wcmludGYoIjogIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTE9DX0ZJTEU6CisgICAgICAgIGVycm9yX3ByaW50ZigiJXM6IiwgKGNvbnN0IGNoYXIgKiljdXJfbG9jLT5wdHIpOworICAgICAgICBpZiAoY3VyX2xvYy0+bnVtKSB7CisgICAgICAgICAgICBlcnJvcl9wcmludGYoIiVkOiIsIGN1cl9sb2MtPm51bSk7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JfcHJpbnRmKCIgIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGVycm9yX3ByaW50ZigiJXMiLCBzZXApOworICAgIH0KK30KKworLyoKKyAqIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgdG8gY3VycmVudCBtb25pdG9yIGlmIHdlIGhhdmUgb25lLCBlbHNlIHRvIHN0ZGVyci4KKyAqIFByZXBlbmQgdGhlIGN1cnJlbnQgbG9jYXRpb24gYW5kIGFwcGVuZCBhIG5ld2xpbmUuCisgKiBJdCdzIHdyb25nIHRvIGNhbGwgdGhpcyBpbiBhIFFNUCBtb25pdG9yLiAgVXNlIHFlcnJvcl9yZXBvcnQoKSB0aGVyZS4KKyAqLwordm9pZCBlcnJvcl9yZXBvcnQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKworICAgIGVycm9yX3ByaW50X2xvYygpOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIGVycm9yX3ZwcmludGYoZm10LCBhcCk7CisgICAgdmFfZW5kKGFwKTsKKyAgICBlcnJvcl9wcmludGYoIlxuIik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1vcHRpb24uYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LW9wdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTllZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1vcHRpb24uYwpAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIENvbW1hbmRsaW5lIG9wdGlvbiBwYXJzaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDA5IEtldmluIFdvbGYgPGt3b2xmQHJlZGhhdC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJxZW11L2Vycm9yLXJlcG9ydC5oIgorI2luY2x1ZGUgInFhcGkvcW1wL3R5cGVzLmgiCisjaW5jbHVkZSAicWVtdS9vcHRpb24uaCIKKyNpbmNsdWRlICJxYXBpL3FtcC9xZXJyb3IuaCIKKworLyoKKyAqIEV4dHJhY3RzIHRoZSBuYW1lIG9mIGFuIG9wdGlvbiBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RyaW5nIChwIHBvaW50cyBhdCB0aGUKKyAqIGZpcnN0IGJ5dGUgb2YgdGhlIG9wdGlvbiBuYW1lKQorICoKKyAqIFRoZSBvcHRpb24gbmFtZSBpcyBkZWxpbWl0ZWQgYnkgZGVsaW0gKHVzdWFsbHkgLCBvciA9KSBvciB0aGUgc3RyaW5nIGVuZAorICogYW5kIGlzIGNvcGllZCBpbnRvIGJ1Zi4gSWYgdGhlIG9wdGlvbiBuYW1lIGlzIGxvbmdlciB0aGFuIGJ1Zl9zaXplLCBpdCBpcworICogdHJ1bmNhdGVkLiBidWYgaXMgYWx3YXlzIHplcm8gdGVybWluYXRlZC4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVsaW1pdGVyL3plcm8gYnl0ZSBhZnRlciB0aGUgb3B0aW9uCisgKiBuYW1lIGluIHAuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9vcHRfbmFtZShjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqcCwgY2hhciBkZWxpbSkKK3sKKyAgICBjaGFyICpxOworCisgICAgcSA9IGJ1ZjsKKyAgICB3aGlsZSAoKnAgIT0gJ1wwJyAmJiAqcCAhPSBkZWxpbSkgeworICAgICAgICBpZiAocSAmJiAocSAtIGJ1ZikgPCBidWZfc2l6ZSAtIDEpCisgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgaWYgKHEpCisgICAgICAgICpxID0gJ1wwJzsKKworICAgIHJldHVybiBwOworfQorCisvKgorICogRXh0cmFjdHMgdGhlIHZhbHVlIG9mIGFuIG9wdGlvbiBmcm9tIHRoZSBwYXJhbWV0ZXIgc3RyaW5nIHAgKHAgcG9pbnRzIGF0IHRoZQorICogZmlyc3QgYnl0ZSBvZiB0aGUgb3B0aW9uIHZhbHVlKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY29tcGFyYWJsZSB0byBnZXRfb3B0X25hbWUgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHRoZQorICogZGVsaW1pdGVyIGlzIGZpeGVkIHRvIGJlIGNvbW1hIHdoaWNoIHN0YXJ0cyBhIG5ldyBvcHRpb24uIFRvIHNwZWNpZnkgYW4KKyAqIG9wdGlvbiB2YWx1ZSB0aGF0IGNvbnRhaW5zIGNvbW1hcywgZG91YmxlIGVhY2ggY29tbWEuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9vcHRfdmFsdWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnApCit7CisgICAgY2hhciAqcTsKKworICAgIHEgPSBidWY7CisgICAgd2hpbGUgKCpwICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKCpwID09ICcsJykgeworICAgICAgICAgICAgaWYgKCoocCArIDEpICE9ICcsJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfQorICAgICAgICBpZiAocSAmJiAocSAtIGJ1ZikgPCBidWZfc2l6ZSAtIDEpCisgICAgICAgICAgICAqcSsrID0gKnA7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgaWYgKHEpCisgICAgICAgICpxID0gJ1wwJzsKKworICAgIHJldHVybiBwOworfQorCitpbnQgZ2V0X25leHRfcGFyYW1fdmFsdWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICoqcHN0cikKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgb3B0aW9uWzEyOF07CisKKyAgICBwID0gKnBzdHI7CisgICAgZm9yKDs7KSB7CisgICAgICAgIHAgPSBnZXRfb3B0X25hbWUob3B0aW9uLCBzaXplb2Yob3B0aW9uKSwgcCwgJz0nKTsKKyAgICAgICAgaWYgKCpwICE9ICc9JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwKys7CisgICAgICAgIGlmICghc3RyY21wKHRhZywgb3B0aW9uKSkgeworICAgICAgICAgICAgKnBzdHIgPSBnZXRfb3B0X3ZhbHVlKGJ1ZiwgYnVmX3NpemUsIHApOworICAgICAgICAgICAgaWYgKCoqcHN0ciA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAoKnBzdHIpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RybGVuKGJ1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gZ2V0X29wdF92YWx1ZShOVUxMLCAwLCBwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnAgIT0gJywnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfcGFyYW1fdmFsdWUoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqc3RyKQoreworICAgIHJldHVybiBnZXRfbmV4dF9wYXJhbV92YWx1ZShidWYsIGJ1Zl9zaXplLCB0YWcsICZzdHIpOworfQorCitpbnQgY2hlY2tfcGFyYW1zKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKnBhcmFtcywgY29uc3QgY2hhciAqc3RyKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgaW50IGk7CisKKyAgICBwID0gc3RyOworICAgIHdoaWxlICgqcCAhPSAnXDAnKSB7CisgICAgICAgIHAgPSBnZXRfb3B0X25hbWUoYnVmLCBidWZfc2l6ZSwgcCwgJz0nKTsKKyAgICAgICAgaWYgKCpwICE9ICc9JykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHArKzsKKyAgICAgICAgZm9yIChpID0gMDsgcGFyYW1zW2ldICE9IE5VTEw7IGkrKykgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAocGFyYW1zW2ldLCBidWYpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtc1tpXSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcCA9IGdldF9vcHRfdmFsdWUoTlVMTCwgMCwgcCk7CisgICAgICAgIGlmICgqcCAhPSAnLCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWFyY2hlcyBhbiBvcHRpb24gbGlzdCBmb3IgYW4gb3B0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUKKyAqLworUUVNVU9wdGlvblBhcmFtZXRlciAqZ2V0X29wdGlvbl9wYXJhbWV0ZXIoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCwKKyAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIHdoaWxlIChsaXN0ICYmIGxpc3QtPm5hbWUpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobGlzdC0+bmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisgICAgICAgIGxpc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwYXJzZV9vcHRpb25fYm9vbChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50ICpyZXQpCit7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAodmFsdWUsICJvbiIpKSB7CisgICAgICAgICAgICAqcmV0ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhbHVlLCAib2ZmIikpIHsKKyAgICAgICAgICAgICpyZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLCBuYW1lLCAiJ29uJyBvciAnb2ZmJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnJldCA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbl9udW1iZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHVpbnQ2NF90ICpyZXQpCit7CisgICAgY2hhciAqcG9zdGZpeDsKKyAgICB1aW50NjRfdCBudW1iZXI7CisKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBudW1iZXIgPSBzdHJ0b3VsbCh2YWx1ZSwgJnBvc3RmaXgsIDApOworICAgICAgICBpZiAoKnBvc3RmaXggIT0gJ1wwJykgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLCBuYW1lLCAiYSBudW1iZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqcmV0ID0gbnVtYmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwgbmFtZSwgImEgbnVtYmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9uX3NpemUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIHVpbnQ2NF90ICpyZXQpCit7CisgICAgY2hhciAqcG9zdGZpeDsKKyAgICBkb3VibGUgc2l6ZWY7CisKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBzaXplZiA9IHN0cnRvZCh2YWx1ZSwgJnBvc3RmaXgpOworICAgICAgICBzd2l0Y2ggKCpwb3N0Zml4KSB7CisgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgc2l6ZWYgKj0gMTAyNDsKKyAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICBzaXplZiAqPSAxMDI0OworICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgIHNpemVmICo9IDEwMjQ7CisgICAgICAgIGNhc2UgJ0snOgorICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgIHNpemVmICo9IDEwMjQ7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAqcmV0ID0gKHVpbnQ2NF90KSBzaXplZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLCBuYW1lLCAiYSBzaXplIik7CisgICAgICAgICAgICBlcnJvcl9wcmludGZfdW5sZXNzX3FtcCgiWW91IG1heSB1c2UgaywgTSwgRyBvciBUIHN1ZmZpeGVzIGZvciAiCisgICAgICAgICAgICAgICAgICAgICJraWxvYnl0ZXMsIG1lZ2FieXRlcywgZ2lnYWJ5dGVzIGFuZCB0ZXJhYnl0ZXMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSwgbmFtZSwgImEgc2l6ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgaW4gYSBnaXZlbiBvcHRpb24gbGlzdC4gVGhlIHBhcnNpbmcgb2YgdGhlCisgKiB2YWx1ZSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIG9wdGlvbjoKKyAqCisgKiBPUFRfRkxBRyAodXNlcyB2YWx1ZS5uKToKKyAqICAgICAgSWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIHRoZSBmbGFnIGlzIHNldCB0byAxLgorICogICAgICBPdGhlcndpc2UgdGhlIHZhbHVlIG11c3QgYmUgIm9uIiAoc2V0IHRvIDEpIG9yICJvZmYiIChzZXQgdG8gMCkKKyAqCisgKiBPUFRfU1RSSU5HICh1c2VzIHZhbHVlLnMpOgorICogICAgICB2YWx1ZSBpcyBzdHJkdXAoKWVkIGFuZCBhc3NpZ25lZCBhcyBvcHRpb24gdmFsdWUKKyAqCisgKiBPUFRfU0laRSAodXNlcyB2YWx1ZS5uKToKKyAqICAgICAgVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLiBTdWZmaXhlcyBmb3Iga2lsb2J5dGVzIGV0Yy4gYXJlCisgKiAgICAgIGFsbG93ZWQgKHBvd2VycyBvZiAxMDI0KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzLCAtMSBpbiBlcnJvciBjYXNlcworICovCitpbnQgc2V0X29wdGlvbl9wYXJhbWV0ZXIoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBpbnQgZmxhZzsKKworICAgIC8vIEZpbmQgYSBtYXRjaGluZyBwYXJhbWV0ZXIKKyAgICBsaXN0ID0gZ2V0X29wdGlvbl9wYXJhbWV0ZXIobGlzdCwgbmFtZSk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uICclcydcbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gUHJvY2VzcyBwYXJhbWV0ZXIKKyAgICBzd2l0Y2ggKGxpc3QtPnR5cGUpIHsKKyAgICBjYXNlIE9QVF9GTEFHOgorICAgICAgICBpZiAocGFyc2Vfb3B0aW9uX2Jvb2wobmFtZSwgdmFsdWUsICZmbGFnKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbGlzdC0+dmFsdWUubiA9IGZsYWc7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRfU1RSSU5HOgorICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgbGlzdC0+dmFsdWUucyA9IGdfc3RyZHVwKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9uICclcycgbmVlZHMgYSBwYXJhbWV0ZXJcbiIsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPUFRfU0laRToKKyAgICAgICAgaWYgKHBhcnNlX29wdGlvbl9zaXplKG5hbWUsIHZhbHVlLCAmbGlzdC0+dmFsdWUubikgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJCdWc6IE9wdGlvbiAnJXMnIGhhcyBhbiB1bmtub3duIHR5cGVcbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXRzIHRoZSBnaXZlbiBwYXJhbWV0ZXIgdG8gYW4gaW50ZWdlciBpbnN0ZWFkIG9mIGEgc3RyaW5nLgorICogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgdXNlZCB0byBzZXQgc3RyaW5nIG9wdGlvbnMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGluIGVycm9yIGNhc2VzCisgKi8KK2ludCBzZXRfb3B0aW9uX3BhcmFtZXRlcl9pbnQoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCwgY29uc3QgY2hhciAqbmFtZSwKKyAgICB1aW50NjRfdCB2YWx1ZSkKK3sKKyAgICAvLyBGaW5kIGEgbWF0Y2hpbmcgcGFyYW1ldGVyCisgICAgbGlzdCA9IGdldF9vcHRpb25fcGFyYW1ldGVyKGxpc3QsIG5hbWUpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbiAnJXMnXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFByb2Nlc3MgcGFyYW1ldGVyCisgICAgc3dpdGNoIChsaXN0LT50eXBlKSB7CisgICAgY2FzZSBPUFRfRkxBRzoKKyAgICBjYXNlIE9QVF9OVU1CRVI6CisgICAgY2FzZSBPUFRfU0laRToKKyAgICAgICAgbGlzdC0+dmFsdWUubiA9IHZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWVzIGEgb3B0aW9uIGxpc3QuIElmIGl0IGNvbnRhaW5zIHN0cmluZ3MsIHRoZSBzdHJpbmdzIGFyZSBmcmVlZCBhcyB3ZWxsLgorICovCit2b2lkIGZyZWVfb3B0aW9uX3BhcmFtZXRlcnMoUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCkKK3sKKyAgICBRRU1VT3B0aW9uUGFyYW1ldGVyICpjdXIgPSBsaXN0OworCisgICAgd2hpbGUgKGN1ciAmJiBjdXItPm5hbWUpIHsKKyAgICAgICAgaWYgKGN1ci0+dHlwZSA9PSBPUFRfU1RSSU5HKSB7CisgICAgICAgICAgICBnX2ZyZWUoY3VyLT52YWx1ZS5zKTsKKyAgICAgICAgfQorICAgICAgICBjdXIrKzsKKyAgICB9CisKKyAgICBnX2ZyZWUobGlzdCk7Cit9CisKKy8qCisgKiBDb3VudCB2YWxpZCBvcHRpb25zIGluIGxpc3QKKyAqLworc3RhdGljIHNpemVfdCBjb3VudF9vcHRpb25fcGFyYW1ldGVycyhRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0KQoreworICAgIHNpemVfdCBudW1fb3B0aW9ucyA9IDA7CisKKyAgICB3aGlsZSAobGlzdCAmJiBsaXN0LT5uYW1lKSB7CisgICAgICAgIG51bV9vcHRpb25zKys7CisgICAgICAgIGxpc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtX29wdGlvbnM7Cit9CisKKy8qCisgKiBBcHBlbmQgYW4gb3B0aW9uIGxpc3QgKGxpc3QpIHRvIGFuIG9wdGlvbiBsaXN0IChkZXN0KS4KKyAqCisgKiBJZiBkZXN0IGlzIE5VTEwsIGEgbmV3IGNvcHkgb2YgbGlzdCBpcyBjcmVhdGVkLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIGRlc3QgKG9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgY29weSkKKyAqLworUUVNVU9wdGlvblBhcmFtZXRlciAqYXBwZW5kX29wdGlvbl9wYXJhbWV0ZXJzKFFFTVVPcHRpb25QYXJhbWV0ZXIgKmRlc3QsCisgICAgUUVNVU9wdGlvblBhcmFtZXRlciAqbGlzdCkKK3sKKyAgICBzaXplX3QgbnVtX29wdGlvbnMsIG51bV9kZXN0X29wdGlvbnM7CisKKyAgICBudW1fb3B0aW9ucyA9IGNvdW50X29wdGlvbl9wYXJhbWV0ZXJzKGRlc3QpOworICAgIG51bV9kZXN0X29wdGlvbnMgPSBudW1fb3B0aW9uczsKKworICAgIG51bV9vcHRpb25zICs9IGNvdW50X29wdGlvbl9wYXJhbWV0ZXJzKGxpc3QpOworCisgICAgZGVzdCA9IGdfcmVhbGxvYyhkZXN0LCAobnVtX29wdGlvbnMgKyAxKSAqIHNpemVvZihRRU1VT3B0aW9uUGFyYW1ldGVyKSk7CisgICAgZGVzdFtudW1fZGVzdF9vcHRpb25zXS5uYW1lID0gTlVMTDsKKworICAgIHdoaWxlIChsaXN0ICYmIGxpc3QtPm5hbWUpIHsKKyAgICAgICAgaWYgKGdldF9vcHRpb25fcGFyYW1ldGVyKGRlc3QsIGxpc3QtPm5hbWUpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlc3RbbnVtX2Rlc3Rfb3B0aW9ucysrXSA9ICpsaXN0OworICAgICAgICAgICAgZGVzdFtudW1fZGVzdF9vcHRpb25zXS5uYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsaXN0Kys7CisgICAgfQorCisgICAgcmV0dXJuIGRlc3Q7Cit9CisKKy8qCisgKiBQYXJzZXMgYSBwYXJhbWV0ZXIgc3RyaW5nIChwYXJhbSkgaW50byBhbiBvcHRpb24gbGlzdCAoZGVzdCkuCisgKgorICogbGlzdCBpcyB0aGUgdGVtcGxhdGUgb3B0aW9uIGxpc3QuIElmIGRlc3QgaXMgTlVMTCwgYSBuZXcgY29weSBvZiBsaXN0IGlzCisgKiBjcmVhdGVkLiBJZiBsaXN0IGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gZmFpbHMuCisgKgorICogQSBwYXJhbWV0ZXIgc3RyaW5nIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMsIHNlcGFyYXRlZCBieSBjb21tYXMuCisgKiBFYWNoIHBhcmFtZXRlciBjb25zaXN0cyBvZiBpdHMgbmFtZSBhbmQgcG9zc2libHkgb2YgYSB2YWx1ZS4gSW4gdGhlIGxhdHRlcgorICogY2FzZSwgdGhlIHZhbHVlIGlzIGRlbGltaXRlZCBieSBhbiA9IGNoYXJhY3Rlci4gVG8gc3BlY2lmeSBhIHZhbHVlIHdoaWNoCisgKiBjb250YWlucyBjb21tYXMsIGRvdWJsZSBlYWNoIGNvbW1hIHNvIGl0IHdvbid0IGJlIHJlY29nbml6ZWQgYXMgdGhlIGVuZCBvZgorICogdGhlIHBhcmFtZXRlci4KKyAqCisgKiBGb3IgbW9yZSBkZXRhaWxzIG9mIHRoZSBwYXJzaW5nIHNlZSBhYm92ZS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiBkZXN0IChvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGNvcHkpCisgKiBvciBOVUxMIGluIGVycm9yIGNhc2VzCisgKi8KK1FFTVVPcHRpb25QYXJhbWV0ZXIgKnBhcnNlX29wdGlvbl9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIgKnBhcmFtLAorICAgIFFFTVVPcHRpb25QYXJhbWV0ZXIgKmxpc3QsIFFFTVVPcHRpb25QYXJhbWV0ZXIgKmRlc3QpCit7CisgICAgUUVNVU9wdGlvblBhcmFtZXRlciAqYWxsb2NhdGVkID0gTlVMTDsKKyAgICBjaGFyIG5hbWVbMjU2XTsKKyAgICBjaGFyIHZhbHVlWzI1Nl07CisgICAgY2hhciAqcGFyYW1fZGVsaW0sICp2YWx1ZV9kZWxpbTsKKyAgICBjaGFyIG5leHRfZGVsaW07CisKKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChkZXN0ID09IE5VTEwpIHsKKyAgICAgICAgZGVzdCA9IGFsbG9jYXRlZCA9IGFwcGVuZF9vcHRpb25fcGFyYW1ldGVycyhOVUxMLCBsaXN0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoKnBhcmFtKSB7CisKKyAgICAgICAgLy8gRmluZCBwYXJhbWV0ZXIgbmFtZSBhbmQgdmFsdWUgaW4gdGhlIHN0cmluZworICAgICAgICBwYXJhbV9kZWxpbSA9IHN0cmNocihwYXJhbSwgJywnKTsKKyAgICAgICAgdmFsdWVfZGVsaW0gPSBzdHJjaHIocGFyYW0sICc9Jyk7CisKKyAgICAgICAgaWYgKHZhbHVlX2RlbGltICYmICh2YWx1ZV9kZWxpbSA8IHBhcmFtX2RlbGltIHx8ICFwYXJhbV9kZWxpbSkpIHsKKyAgICAgICAgICAgIG5leHRfZGVsaW0gPSAnPSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXh0X2RlbGltID0gJywnOworICAgICAgICAgICAgdmFsdWVfZGVsaW0gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW0gPSBnZXRfb3B0X25hbWUobmFtZSwgc2l6ZW9mKG5hbWUpLCBwYXJhbSwgbmV4dF9kZWxpbSk7CisgICAgICAgIGlmICh2YWx1ZV9kZWxpbSkgeworICAgICAgICAgICAgcGFyYW0gPSBnZXRfb3B0X3ZhbHVlKHZhbHVlLCBzaXplb2YodmFsdWUpLCBwYXJhbSArIDEpOworICAgICAgICB9CisgICAgICAgIGlmICgqcGFyYW0gIT0gJ1wwJykgeworICAgICAgICAgICAgcGFyYW0rKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgcGFyYW1ldGVyCisgICAgICAgIGlmIChzZXRfb3B0aW9uX3BhcmFtZXRlcihkZXN0LCBuYW1lLCB2YWx1ZV9kZWxpbSA/IHZhbHVlIDogTlVMTCkpIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkZXN0OworCitmYWlsOgorICAgIC8vIE9ubHkgZnJlZSB0aGUgbGlzdCBpZiBpdCB3YXMgbmV3bHkgYWxsb2NhdGVkCisgICAgZnJlZV9vcHRpb25fcGFyYW1ldGVycyhhbGxvY2F0ZWQpOworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogUHJpbnRzIGFsbCBvcHRpb25zIG9mIGEgbGlzdCB0aGF0IGhhdmUgYSB2YWx1ZSB0byBzdGRvdXQKKyAqLwordm9pZCBwcmludF9vcHRpb25fcGFyYW1ldGVycyhRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0KQoreworICAgIHdoaWxlIChsaXN0ICYmIGxpc3QtPm5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChsaXN0LT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIE9QVF9TVFJJTkc6CisgICAgICAgICAgICAgICAgIGlmIChsaXN0LT52YWx1ZS5zICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXM9JyVzJyAiLCBsaXN0LT5uYW1lLCBsaXN0LT52YWx1ZS5zKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUFRfRkxBRzoKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzPSVzICIsIGxpc3QtPm5hbWUsIGxpc3QtPnZhbHVlLm4gPyAib24iIDogIm9mZiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPUFRfU0laRToKKyAgICAgICAgICAgIGNhc2UgT1BUX05VTUJFUjoKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzPSUiIFBSSWQ2NCAiICIsIGxpc3QtPm5hbWUsIGxpc3QtPnZhbHVlLm4pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzPSh1bmtvd24gdHlwZSkgIiwgbGlzdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCsrOworICAgIH0KK30KKworLyoKKyAqIFByaW50cyBhbiBvdmVydmlldyBvZiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMKKyAqLwordm9pZCBwcmludF9vcHRpb25faGVscChRRU1VT3B0aW9uUGFyYW1ldGVyICpsaXN0KQoreworICAgIHByaW50ZigiU3VwcG9ydGVkIG9wdGlvbnM6XG4iKTsKKyAgICB3aGlsZSAobGlzdCAmJiBsaXN0LT5uYW1lKSB7CisgICAgICAgIHByaW50ZigiJS0xNnMgJXNcbiIsIGxpc3QtPm5hbWUsCisgICAgICAgICAgICBsaXN0LT5oZWxwID8gbGlzdC0+aGVscCA6ICJObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUiKTsKKyAgICAgICAgbGlzdCsrOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBRZW11T3B0IHsKKyAgICBjb25zdCBjaGFyICAgKm5hbWU7CisgICAgY29uc3QgY2hhciAgICpzdHI7CisKKyAgICBjb25zdCBRZW11T3B0RGVzYyAqZGVzYzsKKyAgICB1bmlvbiB7CisgICAgICAgIGludCAgICAgIGJvb2xlYW47CisgICAgICAgIHVpbnQ2NF90IHVpbnQ7CisgICAgfSB2YWx1ZTsKKworICAgIFFlbXVPcHRzICAgICAqb3B0czsKKyAgICBRVEFJTFFfRU5UUlkoUWVtdU9wdCkgbmV4dDsKK307CisKK3N0cnVjdCBRZW11T3B0cyB7CisgICAgY2hhciAqaWQ7CisgICAgUWVtdU9wdHNMaXN0ICpsaXN0OworICAgIExvY2F0aW9uIGxvYzsKKyAgICBRVEFJTFFfSEVBRChRZW11T3B0SGVhZCwgUWVtdU9wdCkgaGVhZDsKKyAgICBRVEFJTFFfRU5UUlkoUWVtdU9wdHMpIG5leHQ7Cit9OworCitzdGF0aWMgUWVtdU9wdCAqcWVtdV9vcHRfZmluZChRZW11T3B0cyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBRZW11T3B0ICpvcHQ7CisKKyAgICBRVEFJTFFfRk9SRUFDSF9SRVZFUlNFKG9wdCwgJm9wdHMtPmhlYWQsIFFlbXVPcHRIZWFkLCBuZXh0KSB7CisgICAgICAgIGlmIChzdHJjbXAob3B0LT5uYW1lLCBuYW1lKSAhPSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBvcHQ7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICpxZW11X29wdF9nZXQoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgUWVtdU9wdCAqb3B0ID0gcWVtdV9vcHRfZmluZChvcHRzLCBuYW1lKTsKKyAgICByZXR1cm4gb3B0ID8gb3B0LT5zdHIgOiBOVUxMOworfQorCitpbnQgcWVtdV9vcHRfZ2V0X2Jvb2woUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkZWZ2YWwpCit7CisgICAgUWVtdU9wdCAqb3B0ID0gcWVtdV9vcHRfZmluZChvcHRzLCBuYW1lKTsKKworICAgIGlmIChvcHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlZnZhbDsKKyAgICBhc3NlcnQob3B0LT5kZXNjICYmIG9wdC0+ZGVzYy0+dHlwZSA9PSBRRU1VX09QVF9CT09MKTsKKyAgICByZXR1cm4gb3B0LT52YWx1ZS5ib29sZWFuOworfQorCit1aW50NjRfdCBxZW11X29wdF9nZXRfbnVtYmVyKFFlbXVPcHRzICpvcHRzLCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBkZWZ2YWwpCit7CisgICAgUWVtdU9wdCAqb3B0ID0gcWVtdV9vcHRfZmluZChvcHRzLCBuYW1lKTsKKworICAgIGlmIChvcHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlZnZhbDsKKyAgICBhc3NlcnQob3B0LT5kZXNjICYmIG9wdC0+ZGVzYy0+dHlwZSA9PSBRRU1VX09QVF9OVU1CRVIpOworICAgIHJldHVybiBvcHQtPnZhbHVlLnVpbnQ7Cit9CisKK3VpbnQ2NF90IHFlbXVfb3B0X2dldF9zaXplKFFlbXVPcHRzICpvcHRzLCBjb25zdCBjaGFyICpuYW1lLCB1aW50NjRfdCBkZWZ2YWwpCit7CisgICAgUWVtdU9wdCAqb3B0ID0gcWVtdV9vcHRfZmluZChvcHRzLCBuYW1lKTsKKworICAgIGlmIChvcHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlZnZhbDsKKyAgICBhc3NlcnQob3B0LT5kZXNjICYmIG9wdC0+ZGVzYy0+dHlwZSA9PSBRRU1VX09QVF9TSVpFKTsKKyAgICByZXR1cm4gb3B0LT52YWx1ZS51aW50OworfQorCitzdGF0aWMgaW50IHFlbXVfb3B0X3BhcnNlKFFlbXVPcHQgKm9wdCkKK3sKKyAgICBpZiAob3B0LT5kZXNjID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHN3aXRjaCAob3B0LT5kZXNjLT50eXBlKSB7CisgICAgY2FzZSBRRU1VX09QVF9TVFJJTkc6CisgICAgICAgIC8qIG5vdGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBRRU1VX09QVF9CT09MOgorICAgICAgICByZXR1cm4gcGFyc2Vfb3B0aW9uX2Jvb2wob3B0LT5uYW1lLCBvcHQtPnN0ciwgJm9wdC0+dmFsdWUuYm9vbGVhbik7CisgICAgY2FzZSBRRU1VX09QVF9OVU1CRVI6CisgICAgICAgIHJldHVybiBwYXJzZV9vcHRpb25fbnVtYmVyKG9wdC0+bmFtZSwgb3B0LT5zdHIsICZvcHQtPnZhbHVlLnVpbnQpOworICAgIGNhc2UgUUVNVV9PUFRfU0laRToKKyAgICAgICAgcmV0dXJuIHBhcnNlX29wdGlvbl9zaXplKG9wdC0+bmFtZSwgb3B0LT5zdHIsICZvcHQtPnZhbHVlLnVpbnQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0KCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBxZW11X29wdF9kZWwoUWVtdU9wdCAqb3B0KQoreworICAgIFFUQUlMUV9SRU1PVkUoJm9wdC0+b3B0cy0+aGVhZCwgb3B0LCBuZXh0KTsKKyAgICBnX2ZyZWUoKC8qICFjb25zdCAqLyBjaGFyKilvcHQtPm5hbWUpOworICAgIGdfZnJlZSgoLyogIWNvbnN0ICovIGNoYXIqKW9wdC0+c3RyKTsKKyAgICBnX2ZyZWUob3B0KTsKK30KKworaW50IHFlbXVfb3B0X3NldChRZW11T3B0cyAqb3B0cywgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgUWVtdU9wdCAqb3B0OworICAgIGNvbnN0IFFlbXVPcHREZXNjICpkZXNjID0gb3B0cy0+bGlzdC0+ZGVzYzsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGRlc2NbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChkZXNjW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChkZXNjW2ldLm5hbWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvKiBlbXB0eSBsaXN0IC0+IGFsbG93IGFueSAqLzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9JTlZBTElEX1BBUkFNRVRFUiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcHQgPSBnX21hbGxvYzAoc2l6ZW9mKCpvcHQpKTsKKyAgICBvcHQtPm5hbWUgPSBnX3N0cmR1cChuYW1lKTsKKyAgICBvcHQtPm9wdHMgPSBvcHRzOworICAgIFFUQUlMUV9JTlNFUlRfVEFJTCgmb3B0cy0+aGVhZCwgb3B0LCBuZXh0KTsKKyAgICBpZiAoZGVzY1tpXS5uYW1lICE9IE5VTEwpIHsKKyAgICAgICAgb3B0LT5kZXNjID0gZGVzYytpOworICAgIH0KKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgb3B0LT5zdHIgPSBnX3N0cmR1cCh2YWx1ZSk7CisgICAgfQorICAgIGlmIChxZW11X29wdF9wYXJzZShvcHQpIDwgMCkgeworICAgICAgICBxZW11X29wdF9kZWwob3B0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IHFlbXVfb3B0X2ZvcmVhY2goUWVtdU9wdHMgKm9wdHMsIHFlbXVfb3B0X2xvb3BmdW5jIGZ1bmMsIHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBhYm9ydF9vbl9mYWlsdXJlKQoreworICAgIFFlbXVPcHQgKm9wdDsKKyAgICBpbnQgcmMgPSAwOworCisgICAgUVRBSUxRX0ZPUkVBQ0gob3B0LCAmb3B0cy0+aGVhZCwgbmV4dCkgeworICAgICAgICByYyA9IGZ1bmMob3B0LT5uYW1lLCBvcHQtPnN0ciwgb3BhcXVlKTsKKyAgICAgICAgaWYgKGFib3J0X29uX2ZhaWx1cmUgICYmICByYyAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworUWVtdU9wdHMgKnFlbXVfb3B0c19maW5kKFFlbXVPcHRzTGlzdCAqbGlzdCwgY29uc3QgY2hhciAqaWQpCit7CisgICAgUWVtdU9wdHMgKm9wdHM7CisKKyAgICBRVEFJTFFfRk9SRUFDSChvcHRzLCAmbGlzdC0+aGVhZCwgbmV4dCkgeworICAgICAgICBpZiAoIW9wdHMtPmlkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKG9wdHMtPmlkLCBpZCkgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdHM7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGlkX3dlbGxmb3JtZWQoY29uc3QgY2hhciAqaWQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoIXFlbXVfaXNhbHBoYShpZFswXSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGlkW2ldOyBpKyspIHsKKyAgICAgICAgaWYgKCFxZW11X2lzYWxudW0oaWRbaV0pICYmICFzdHJjaHIoIi0uXyIsIGlkW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK1FlbXVPcHRzICpxZW11X29wdHNfY3JlYXRlKFFlbXVPcHRzTGlzdCAqbGlzdCwgY29uc3QgY2hhciAqaWQsIGludCBmYWlsX2lmX2V4aXN0cykKK3sKKyAgICBRZW11T3B0cyAqb3B0cyA9IE5VTEw7CisKKyAgICBpZiAoaWQpIHsKKyAgICAgICAgaWYgKCFpZF93ZWxsZm9ybWVkKGlkKSkgeworICAgICAgICAgICAgcWVycm9yX3JlcG9ydChRRVJSX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFLCAiaWQiLCAiYW4gaWRlbnRpZmllciIpOworICAgICAgICAgICAgZXJyb3JfcHJpbnRmX3VubGVzc19xbXAoIklkZW50aWZpZXJzIGNvbnNpc3Qgb2YgbGV0dGVycywgZGlnaXRzLCAnLScsICcuJywgJ18nLCBzdGFydGluZyB3aXRoIGEgbGV0dGVyLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvcHRzID0gcWVtdV9vcHRzX2ZpbmQobGlzdCwgaWQpOworICAgICAgICBpZiAob3B0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZmFpbF9pZl9leGlzdHMpIHsKKyAgICAgICAgICAgICAgICBxZXJyb3JfcmVwb3J0KFFFUlJfRFVQTElDQVRFX0lELCBpZCwgbGlzdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBvcHRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG9wdHMgPSBnX21hbGxvYzAoc2l6ZW9mKCpvcHRzKSk7CisgICAgaWYgKGlkKSB7CisgICAgICAgIG9wdHMtPmlkID0gZ19zdHJkdXAoaWQpOworICAgIH0KKyAgICBvcHRzLT5saXN0ID0gbGlzdDsKKyAgICBsb2Nfc2F2ZSgmb3B0cy0+bG9jKTsKKyAgICBRVEFJTFFfSU5JVCgmb3B0cy0+aGVhZCk7CisgICAgUVRBSUxRX0lOU0VSVF9UQUlMKCZsaXN0LT5oZWFkLCBvcHRzLCBuZXh0KTsKKyAgICByZXR1cm4gb3B0czsKK30KKwordm9pZCBxZW11X29wdHNfcmVzZXQoUWVtdU9wdHNMaXN0ICpsaXN0KQoreworICAgIFFlbXVPcHRzICpvcHRzLCAqbmV4dF9vcHRzOworCisgICAgUVRBSUxRX0ZPUkVBQ0hfU0FGRShvcHRzLCAmbGlzdC0+aGVhZCwgbmV4dCwgbmV4dF9vcHRzKSB7CisgICAgICAgIHFlbXVfb3B0c19kZWwob3B0cyk7CisgICAgfQorfQorCit2b2lkIHFlbXVfb3B0c19sb2NfcmVzdG9yZShRZW11T3B0cyAqb3B0cykKK3sKKyAgICBsb2NfcmVzdG9yZSgmb3B0cy0+bG9jKTsKK30KKworaW50IHFlbXVfb3B0c19zZXQoUWVtdU9wdHNMaXN0ICpsaXN0LCBjb25zdCBjaGFyICppZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIFFlbXVPcHRzICpvcHRzOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUobGlzdCwgaWQsIDEpOworICAgIGlmIChvcHRzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gcWVtdV9vcHRfc2V0KG9wdHMsIG5hbWUsIHZhbHVlKTsKK30KKworY29uc3QgY2hhciAqcWVtdV9vcHRzX2lkKFFlbXVPcHRzICpvcHRzKQoreworICAgIHJldHVybiBvcHRzLT5pZDsKK30KKwordm9pZCBxZW11X29wdHNfZGVsKFFlbXVPcHRzICpvcHRzKQoreworICAgIFFlbXVPcHQgKm9wdDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgb3B0ID0gUVRBSUxRX0ZJUlNUKCZvcHRzLT5oZWFkKTsKKyAgICAgICAgaWYgKG9wdCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHFlbXVfb3B0X2RlbChvcHQpOworICAgIH0KKyAgICBRVEFJTFFfUkVNT1ZFKCZvcHRzLT5saXN0LT5oZWFkLCBvcHRzLCBuZXh0KTsKKyAgICBnX2ZyZWUob3B0cy0+aWQpOworICAgIGdfZnJlZShvcHRzKTsKK30KKworaW50IHFlbXVfb3B0c19wcmludChRZW11T3B0cyAqb3B0cywgdm9pZCAqZHVtbXkpCit7CisgICAgUWVtdU9wdCAqb3B0OworCisgICAgZnByaW50ZihzdGRlcnIsICIlczogJXM6Iiwgb3B0cy0+bGlzdC0+bmFtZSwKKyAgICAgICAgICAgIG9wdHMtPmlkID8gb3B0cy0+aWQgOiAiPG5vaWQ+Iik7CisgICAgUVRBSUxRX0ZPUkVBQ0gob3B0LCAmb3B0cy0+aGVhZCwgbmV4dCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlcz1cIiVzXCIiLCBvcHQtPm5hbWUsIG9wdC0+c3RyKTsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIHJldHVybiAwOworfQorCitpbnQgcWVtdV9vcHRzX2RvX3BhcnNlKFFlbXVPcHRzICpvcHRzLCBjb25zdCBjaGFyICpwYXJhbXMsIGNvbnN0IGNoYXIgKmZpcnN0bmFtZSkKK3sKKyAgICBjaGFyIG9wdGlvblsxMjhdLCB2YWx1ZVsxMDI0XTsKKyAgICBjb25zdCBjaGFyICpwLCpwZSwqcGM7CisKKyAgICBmb3IgKHAgPSBwYXJhbXM7ICpwICE9ICdcMCc7IHArKykgeworICAgICAgICBwZSA9IHN0cmNocihwLCAnPScpOworICAgICAgICBwYyA9IHN0cmNocihwLCAnLCcpOworICAgICAgICBpZiAoIXBlIHx8IChwYyAmJiBwYyA8IHBlKSkgeworICAgICAgICAgICAgLyogZm91bmQgImZvbyxtb3JlIiAqLworICAgICAgICAgICAgaWYgKHAgPT0gcGFyYW1zICYmIGZpcnN0bmFtZSkgeworICAgICAgICAgICAgICAgIC8qIGltcGxpY2l0bHkgbmFtZWQgZmlyc3Qgb3B0aW9uICovCisgICAgICAgICAgICAgICAgcHN0cmNweShvcHRpb24sIHNpemVvZihvcHRpb24pLCBmaXJzdG5hbWUpOworICAgICAgICAgICAgICAgIHAgPSBnZXRfb3B0X3ZhbHVlKHZhbHVlLCBzaXplb2YodmFsdWUpLCBwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogb3B0aW9uIHdpdGhvdXQgdmFsdWUsIHByb2JhYmx5IGEgZmxhZyAqLworICAgICAgICAgICAgICAgIHAgPSBnZXRfb3B0X25hbWUob3B0aW9uLCBzaXplb2Yob3B0aW9uKSwgcCwgJywnKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChvcHRpb24sICJubyIsIDIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShvcHRpb24sIG9wdGlvbisyLCBzdHJsZW4ob3B0aW9uKzIpKzEpOworICAgICAgICAgICAgICAgICAgICBwc3RyY3B5KHZhbHVlLCBzaXplb2YodmFsdWUpLCAib2ZmIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHN0cmNweSh2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgIm9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZm91bmQgImZvbz1iYXIsbW9yZSIgKi8KKyAgICAgICAgICAgIHAgPSBnZXRfb3B0X25hbWUob3B0aW9uLCBzaXplb2Yob3B0aW9uKSwgcCwgJz0nKTsKKyAgICAgICAgICAgIGlmICgqcCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHAgPSBnZXRfb3B0X3ZhbHVlKHZhbHVlLCBzaXplb2YodmFsdWUpLCBwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKG9wdGlvbiwgImlkIikgIT0gMCkgeworICAgICAgICAgICAgLyogc3RvcmUgYW5kIHBhcnNlICovCisgICAgICAgICAgICBpZiAocWVtdV9vcHRfc2V0KG9wdHMsIG9wdGlvbiwgdmFsdWUpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgqcCAhPSAnLCcpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitRZW11T3B0cyAqcWVtdV9vcHRzX3BhcnNlKFFlbXVPcHRzTGlzdCAqbGlzdCwgY29uc3QgY2hhciAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVybWl0X2FiYnJldikKK3sKKyAgICBjb25zdCBjaGFyICpmaXJzdG5hbWU7CisgICAgY2hhciB2YWx1ZVsxMDI0XSwgKmlkID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwOworICAgIFFlbXVPcHRzICpvcHRzOworCisgICAgYXNzZXJ0KCFwZXJtaXRfYWJicmV2IHx8IGxpc3QtPmltcGxpZWRfb3B0X25hbWUpOworICAgIGZpcnN0bmFtZSA9IHBlcm1pdF9hYmJyZXYgPyBsaXN0LT5pbXBsaWVkX29wdF9uYW1lIDogTlVMTDsKKworICAgIGlmIChzdHJuY21wKHBhcmFtcywgImlkPSIsIDMpID09IDApIHsKKyAgICAgICAgZ2V0X29wdF92YWx1ZSh2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgcGFyYW1zKzMpOworICAgICAgICBpZCA9IHZhbHVlOworICAgIH0gZWxzZSBpZiAoKHAgPSBzdHJzdHIocGFyYW1zLCAiLGlkPSIpKSAhPSBOVUxMKSB7CisgICAgICAgIGdldF9vcHRfdmFsdWUodmFsdWUsIHNpemVvZih2YWx1ZSksIHArNCk7CisgICAgICAgIGlkID0gdmFsdWU7CisgICAgfQorICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKGxpc3QsIGlkLCAxKTsKKyAgICBpZiAob3B0cyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChxZW11X29wdHNfZG9fcGFyc2Uob3B0cywgcGFyYW1zLCBmaXJzdG5hbWUpICE9IDApIHsKKyAgICAgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG9wdHM7Cit9CisKK3N0YXRpYyB2b2lkIHFlbXVfb3B0c19mcm9tX3FkaWN0XzEoY29uc3QgY2hhciAqa2V5LCBRT2JqZWN0ICpvYmosIHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBjaGFyIGJ1ZlszMl07CisgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgaW50IG47CisKKyAgICBpZiAoIXN0cmNtcChrZXksICJpZCIpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHFvYmplY3RfdHlwZShvYmopKSB7CisgICAgY2FzZSBRVFlQRV9RU1RSSU5HOgorICAgICAgICB2YWx1ZSA9IHFzdHJpbmdfZ2V0X3N0cihxb2JqZWN0X3RvX3FzdHJpbmcob2JqKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUVRZUEVfUUlOVDoKKyAgICAgICAgbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgICAgICBxaW50X2dldF9pbnQocW9iamVjdF90b19xaW50KG9iaikpKTsKKyAgICAgICAgYXNzZXJ0KG4gPCAoaW50KXNpemVvZihidWYpKTsKKyAgICAgICAgdmFsdWUgPSBidWY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUVRZUEVfUUZMT0FUOgorICAgICAgICBuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMTdnIiwKKyAgICAgICAgICAgICAgICAgICAgIHFmbG9hdF9nZXRfZG91YmxlKHFvYmplY3RfdG9fcWZsb2F0KG9iaikpKTsKKyAgICAgICAgYXNzZXJ0KG4gPCAoaW50KXNpemVvZihidWYpKTsKKyAgICAgICAgdmFsdWUgPSBidWY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUVRZUEVfUUJPT0w6CisgICAgICAgIHBzdHJjcHkoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICBxYm9vbF9nZXRfaW50KHFvYmplY3RfdG9fcWJvb2wob2JqKSkgPyAib24iIDogIm9mZiIpOworICAgICAgICB2YWx1ZSA9IGJ1ZjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAodm9pZCluOworICAgIHFlbXVfb3B0X3NldChvcGFxdWUsIGtleSwgdmFsdWUpOworfQorCisvKgorICogQ3JlYXRlIFFlbXVPcHRzIGZyb20gYSBRRGljdC4KKyAqIFVzZSB2YWx1ZSBvZiBrZXkgImlkIiBhcyBJRCBpZiBpdCBleGlzdHMgYW5kIGlzIGEgUVN0cmluZy4KKyAqIE9ubHkgUVN0cmluZ3MsIFFJbnRzLCBRRmxvYXRzIGFuZCBRQm9vbHMgYXJlIGNvcGllZC4gIEVudHJpZXMgd2l0aAorICogb3RoZXIgdHlwZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgKi8KK1FlbXVPcHRzICpxZW11X29wdHNfZnJvbV9xZGljdChRZW11T3B0c0xpc3QgKmxpc3QsIGNvbnN0IFFEaWN0ICpxZGljdCkKK3sKKyAgICBRZW11T3B0cyAqb3B0czsKKworICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKGxpc3QsIHFkaWN0X2dldF90cnlfc3RyKHFkaWN0LCAiaWQiKSwgMSk7CisgICAgaWYgKG9wdHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBxZGljdF9pdGVyKHFkaWN0LCBxZW11X29wdHNfZnJvbV9xZGljdF8xLCBvcHRzKTsKKyAgICByZXR1cm4gb3B0czsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSBRZW11T3B0cyB0byBRRGljdC4KKyAqIFRoZSBRRGljdCB2YWx1ZXMgYXJlIG9mIHR5cGUgUVN0cmluZy4KKyAqIFRPRE8gV2UnbGwgd2FudCB0byB1c2UgdHlwZXMgYXBwcm9wcmlhdGUgZm9yIG9wdC0+ZGVzYy0+dHlwZSwgYnV0CisgKiB0aGlzIGlzIGVub3VnaCBmb3Igbm93LgorICovCitRRGljdCAqcWVtdV9vcHRzX3RvX3FkaWN0KFFlbXVPcHRzICpvcHRzLCBRRGljdCAqcWRpY3QpCit7CisgICAgUWVtdU9wdCAqb3B0OworICAgIFFPYmplY3QgKnZhbDsKKworICAgIGlmICghcWRpY3QpIHsKKyAgICAgICAgcWRpY3QgPSBxZGljdF9uZXcoKTsKKyAgICB9CisgICAgaWYgKG9wdHMtPmlkKSB7CisgICAgICAgIHFkaWN0X3B1dChxZGljdCwgImlkIiwgcXN0cmluZ19mcm9tX3N0cihvcHRzLT5pZCkpOworICAgIH0KKyAgICBRVEFJTFFfRk9SRUFDSChvcHQsICZvcHRzLT5oZWFkLCBuZXh0KSB7CisgICAgICAgIHZhbCA9IFFPQkpFQ1QocXN0cmluZ19mcm9tX3N0cihvcHQtPnN0cikpOworICAgICAgICBxZGljdF9wdXRfb2JqKHFkaWN0LCBvcHQtPm5hbWUsIHZhbCk7CisgICAgfQorICAgIHJldHVybiBxZGljdDsKK30KKworLyogVmFsaWRhdGUgcGFyc2VkIG9wdHMgYWdhaW5zdCBkZXNjcmlwdGlvbnMgd2hlcmUgbm8KKyAqIGRlc2NyaXB0aW9ucyB3ZXJlIHByb3ZpZGVkIGluIHRoZSBRZW11T3B0c0xpc3QuCisgKi8KK2ludCBxZW11X29wdHNfdmFsaWRhdGUoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IFFlbXVPcHREZXNjICpkZXNjKQoreworICAgIFFlbXVPcHQgKm9wdDsKKworICAgIGFzc2VydChvcHRzLT5saXN0LT5kZXNjWzBdLm5hbWUgPT0gTlVMTCk7CisKKyAgICBRVEFJTFFfRk9SRUFDSChvcHQsICZvcHRzLT5oZWFkLCBuZXh0KSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGRlc2NbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZGVzY1tpXS5uYW1lLCBvcHQtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY1tpXS5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHFlcnJvcl9yZXBvcnQoUUVSUl9JTlZBTElEX1BBUkFNRVRFUiwgb3B0LT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIG9wdC0+ZGVzYyA9ICZkZXNjW2ldOworCisgICAgICAgIGlmIChxZW11X29wdF9wYXJzZShvcHQpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBxZW11X29wdHNfZm9yZWFjaChRZW11T3B0c0xpc3QgKmxpc3QsIHFlbXVfb3B0c19sb29wZnVuYyBmdW5jLCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFib3J0X29uX2ZhaWx1cmUpCit7CisgICAgTG9jYXRpb24gbG9jOworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGludCByYyA9IDA7CisKKyAgICBsb2NfcHVzaF9ub25lKCZsb2MpOworICAgIFFUQUlMUV9GT1JFQUNIKG9wdHMsICZsaXN0LT5oZWFkLCBuZXh0KSB7CisgICAgICAgIGxvY19yZXN0b3JlKCZvcHRzLT5sb2MpOworICAgICAgICByYyB8PSBmdW5jKG9wdHMsIG9wYXF1ZSk7CisgICAgICAgIGlmIChhYm9ydF9vbl9mYWlsdXJlICAmJiAgcmMgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBsb2NfcG9wKCZsb2MpOworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LXNvY2tldHMtYW5kcm9pZC5jIGIvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtc29ja2V0cy1hbmRyb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyYzdlMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LXNvY2tldHMtYW5kcm9pZC5jCkBAIC0wLDAgKzEsNjQ3IEBACisvKgorICogIGluZXQgYW5kIHVuaXggc29ja2V0IGZ1bmN0aW9ucyBmb3IgcWVtdQorICoKKyAqICAoYykgMjAwOCBHZXJkIEhvZmZtYW5uIDxrcmF4ZWxAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHVuZGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAicWVtdS9zb2NrZXRzLmgiCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIgLyogZm9yIHFlbXVfaXNkaWdpdCAqLworCisjaWZuZGVmIEFJX0FERFJDT05GSUcKKyMgZGVmaW5lIEFJX0FERFJDT05GSUcgMAorI2VuZGlmCisKKyNpZm5kZWYgSU5FVDZfQUREUlNUUkxFTgorIyBkZWZpbmUgSU5FVDZfQUREUlNUUkxFTiAgNDYKKyNlbmRpZgorCitzdGF0aWMgaW50IHNvY2tldHNfZGVidWcgPSAwOworCisvKiB1c2VkIHRlbXBvcmFyZWx5IHVudGlsIGFsbCB1c2VycyBhcmUgY29udmVydGVkIHRvIFFlbXVPcHRzICovCitzdGF0aWMgUWVtdU9wdHNMaXN0IGR1bW15X29wdHMgPSB7CisgICAgLm5hbWUgPSAiZHVtbXkiLAorICAgIC5oZWFkID0gUVRBSUxRX0hFQURfSU5JVElBTElaRVIoZHVtbXlfb3B0cy5oZWFkKSwKKyAgICAuZGVzYyA9IHsKKyAgICAgICAgeworICAgICAgICAgICAgLm5hbWUgPSAicGF0aCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJob3N0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInBvcnQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAidG8iLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaXB2NCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAiaXB2NiIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX0JPT0wsCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJzb2NrZXQiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9OVU1CRVIsCisjZW5kaWYKKyAgICAgICAgfSwKKyAgICAgICAgeyAvKiBlbmQgaWYgbGlzdCAqLyB9CisgICAgfSwKK307CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnNvY2tfYWRkcmVzc19zdHJmYW1pbHkoU29ja0FkZHJlc3MgKnMpCit7CisgICAgc3dpdGNoIChzb2NrX2FkZHJlc3NfZ2V0X2ZhbWlseShzKSkgeworICAgIGNhc2UgU09DS0VUX0lONjogICByZXR1cm4gImlwdjYiOworICAgIGNhc2UgU09DS0VUX0lORVQ6ICByZXR1cm4gImlwdjQiOworICAgIGNhc2UgU09DS0VUX1VOSVg6ICByZXR1cm4gInVuaXgiOworICAgIGRlZmF1bHQ6ICAgICAgICAgICByZXR1cm4gIj8/Pz8iOworICAgIH0KK30KKworaW50IGluZXRfbGlzdGVuX29wdHMoUWVtdU9wdHMgKm9wdHMsIGludCBwb3J0X29mZnNldCkKK3sKKyAgICBTb2NrQWRkcmVzcyoqICBsaXN0OworICAgIFNvY2tBZGRyZXNzKiAgIGU7CisgICAgdW5zaWduZWQgICAgICAgZmxhZ3MgPSBTT0NLRVRfTElTVF9QQVNTSVZFOworICAgIGNvbnN0IGNoYXIgKmFkZHI7CisgICAgY2hhciBwb3J0WzMzXTsKKyAgICBjaGFyIHVhZGRyWzI1NisxXTsKKyAgICBjaGFyIHVwb3J0WzMzXTsKKyAgICBpbnQgc2xpc3Rlbix0byx0cnlfbmV4dCxubjsKKworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgY29uc3QgY2hhciogc29ja2V0X2ZkID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJzb2NrZXQiKTsKKyAgICBpZiAoc29ja2V0X2ZkKSB7CisgICAgICAgIHJldHVybiBhdG9pKHNvY2tldF9mZCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpID09IE5VTEwpIHx8CisgICAgICAgIChxZW11X29wdF9nZXQob3B0cywgInBvcnQiKSA9PSBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBob3N0IGFuZC9vciBwb3J0IG5vdCBzcGVjaWZpZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHN0cmNweShwb3J0LCBzaXplb2YocG9ydCksIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpKTsKKyAgICBhZGRyID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJob3N0Iik7CisKKyAgICB0byA9IHFlbXVfb3B0X2dldF9udW1iZXIob3B0cywgInRvIiwgMCk7CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY0IiwgMCkpCisgICAgICAgIGZsYWdzIHw9IFNPQ0tFVF9MSVNUX0ZPUkNFX0lORVQ7CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY2IiwgMCkpCisgICAgICAgIGZsYWdzIHw9IFNPQ0tFVF9MSVNUX0ZPUkNFX0lONjsKKworICAgIC8qIGxvb2t1cCAqLworICAgIGlmIChwb3J0X29mZnNldCkKKyAgICAgICAgc25wcmludGYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBhdG9pKHBvcnQpICsgcG9ydF9vZmZzZXQpOworCisgICAgbGlzdCA9IHNvY2tfYWRkcmVzc19saXN0X2NyZWF0ZSggc3RybGVuKGFkZHIpID8gYWRkciA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogZ2V0YWRkcmluZm8oJXMsJXMpOiAlc1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGFkZHIsIHBvcnQsIGVycm5vX3N0cik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBjcmVhdGUgc29ja2V0ICsgYmluZCAqLworICAgIGZvciAobm4gPSAwOyBsaXN0W25uXSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgIFNvY2tldEZhbWlseSAgZmFtaWx5OworCisgICAgICAgIGUgICAgICA9IGxpc3Rbbm5dOworICAgICAgICBmYW1pbHkgPSBzb2NrX2FkZHJlc3NfZ2V0X2ZhbWlseShlKTsKKworICAgICAgICBzb2NrX2FkZHJlc3NfZ2V0X251bWVyaWNfaW5mbyhlLCB1YWRkciwgc2l6ZW9mIHVhZGRyLCB1cG9ydCwgc2l6ZW9mIHVwb3J0KTsKKyAgICAgICAgc2xpc3RlbiA9IHNvY2tldF9jcmVhdGUoZmFtaWx5LCBTT0NLRVRfU1RSRUFNKTsKKyAgICAgICAgaWYgKHNsaXN0ZW4gPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19zdHJmYW1pbHkoZSksIGVycm5vX3N0cik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNvY2tldF9zZXRfeHJldXNlYWRkcihzbGlzdGVuKTsKKyNpZmRlZiBJUFY2X1Y2T05MWQorICAgICAgICAvKiBsaXN0ZW4gb24gYm90aCBpcHY0IGFuZCBpcHY2ICovCisgICAgICAgIGlmIChmYW1pbHkgPT0gU09DS0VUX0lONikgeworICAgICAgICAgICAgc29ja2V0X3NldF9pcHY2b25seShzbGlzdGVuKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKHNvY2tldF9iaW5kKHNsaXN0ZW4sIGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc29ja2V0c19kZWJ1ZykKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBiaW5kKCVzLCVzLCVkKTogT0tcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19zdHJmYW1pbHkoZSksIHVhZGRyLCBzb2NrX2FkZHJlc3NfZ2V0X3BvcnQoZSkpOworICAgICAgICAgICAgICAgIGdvdG8gbGlzdGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc29ja2V0X2Nsb3NlKHNsaXN0ZW4pOworICAgICAgICAgICAgdHJ5X25leHQgPSB0byAmJiAoc29ja19hZGRyZXNzX2dldF9wb3J0KGUpIDw9IHRvICsgcG9ydF9vZmZzZXQpOworICAgICAgICAgICAgaWYgKCF0cnlfbmV4dCB8fCBzb2NrZXRzX2RlYnVnKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogYmluZCglcywlcywlZCk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrX2FkZHJlc3Nfc3RyZmFtaWx5KGUpLCB1YWRkciwgc29ja19hZGRyZXNzX2dldF9wb3J0KGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGlmICh0cnlfbmV4dCkgeworICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19zZXRfcG9ydChlLCBzb2NrX2FkZHJlc3NfZ2V0X3BvcnQoZSkgKyAxKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNvY2tfYWRkcmVzc19saXN0X2ZyZWUobGlzdCk7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogRkFJTEVEXG4iLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiAtMTsKKworbGlzdGVuOgorICAgIGlmIChzb2NrZXRfbGlzdGVuKHNsaXN0ZW4sMSkgIT0gMCkgeworICAgICAgICBwZXJyb3IoImxpc3RlbiIpOworICAgICAgICBzb2NrZXRfY2xvc2Uoc2xpc3Rlbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc25wcmludGYodXBvcnQsIHNpemVvZih1cG9ydCksICIlZCIsIHNvY2tfYWRkcmVzc19nZXRfcG9ydChlKSAtIHBvcnRfb2Zmc2V0KTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgImhvc3QiLCB1YWRkcik7CisgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwb3J0IiwgdXBvcnQpOworICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaXB2NiIsIChlLT5mYW1pbHkgPT0gU09DS0VUX0lONikgPyAib24iIDogIm9mZiIpOworICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaXB2NCIsIChlLT5mYW1pbHkgIT0gU09DS0VUX0lONikgPyAib24iIDogIm9mZiIpOworICAgIHNvY2tfYWRkcmVzc19saXN0X2ZyZWUobGlzdCk7CisgICAgcmV0dXJuIHNsaXN0ZW47Cit9CisKK2ludCBpbmV0X2Nvbm5lY3Rfb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBTb2NrQWRkcmVzcyoqICBsaXN0OworICAgIFNvY2tBZGRyZXNzKiAgIGU7CisgICAgdW5zaWduZWQgICAgICAgZmxhZ3MgPSAwOworICAgIGNvbnN0IGNoYXIgKmFkZHI7CisgICAgY29uc3QgY2hhciAqcG9ydDsKKyAgICBpbnQgc29jaywgbm47CisKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGNvbnN0IGNoYXIqIHNvY2tldF9mZCA9IHFlbXVfb3B0X2dldChvcHRzLCAic29ja2V0Iik7CisgICAgaWYgKHNvY2tldF9mZCkgeworICAgICAgICByZXR1cm4gYXRvaShzb2NrZXRfZmQpOworICAgIH0KKyNlbmRpZgorCisgICAgYWRkciA9IHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpOworICAgIHBvcnQgPSBxZW11X29wdF9nZXQob3B0cywgInBvcnQiKTsKKyAgICBpZiAoYWRkciA9PSBOVUxMIHx8IHBvcnQgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZXRfY29ubmVjdDogaG9zdCBhbmQvb3IgcG9ydCBub3Qgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChxZW11X29wdF9nZXRfYm9vbChvcHRzLCAiaXB2NCIsIDApKSB7CisgICAgICAgIGZsYWdzICY9IFNPQ0tFVF9MSVNUX0ZPUkNFX0lONjsKKyAgICAgICAgZmxhZ3MgfD0gU09DS0VUX0xJU1RfRk9SQ0VfSU5FVDsKKyAgICB9CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY2IiwgMCkpIHsKKyAgICAgICAgZmxhZ3MgJj0gU09DS0VUX0xJU1RfRk9SQ0VfSU5FVDsKKyAgICAgICAgZmxhZ3MgfD0gU09DS0VUX0xJU1RfRk9SQ0VfSU42OworICAgIH0KKworICAgIC8qIGxvb2t1cCAqLworICAgIGxpc3QgPSBzb2NrX2FkZHJlc3NfbGlzdF9jcmVhdGUoYWRkciwgcG9ydCwgZmxhZ3MpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImdldGFkZHJpbmZvKCVzLCVzKTogJXNcbiIsCisgICAgICAgICAgICAgICAgYWRkciwgcG9ydCwgZXJybm9fc3RyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZvciAobm4gPSAwOyBsaXN0W25uXSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgIGUgICAgID0gbGlzdFtubl07CisgICAgICAgIHNvY2sgPSBzb2NrZXRfY3JlYXRlKHNvY2tfYWRkcmVzc19nZXRfZmFtaWx5KGUpLCBTT0NLRVRfU1RSRUFNKTsKKyAgICAgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBzb2NrX2FkZHJlc3Nfc3RyZmFtaWx5KGUpLCBlcnJub19zdHIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc29ja2V0X3NldF94cmV1c2VhZGRyKHNvY2spOworCisgICAgICAgIC8qIGNvbm5lY3QgdG8gcGVlciAqLworICAgICAgICBpZiAoc29ja2V0X2Nvbm5lY3Qoc29jayxlKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChzb2NrZXRzX2RlYnVnKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvbm5lY3QoJXMsJXMsJXMsJXMpOiAlc1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc29ja19hZGRyZXNzX3N0cmZhbWlseShlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc190b19zdHJpbmcoZSksIGFkZHIsIHBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBzb2NrZXRfY2xvc2Uoc29jayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29ja2V0c19kZWJ1ZykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvbm5lY3QoJXMsJXMsJXMsJXMpOiBPS1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc29ja19hZGRyZXNzX3N0cmZhbWlseShlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc190b19zdHJpbmcoZSksIGFkZHIsIHBvcnQpOworCisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgc29jayA9IC0xOworRVhJVDoKKyAgICBzb2NrX2FkZHJlc3NfbGlzdF9mcmVlKGxpc3QpOworICAgIHJldHVybiBzb2NrOworfQorCitpbnQgaW5ldF9kZ3JhbV9vcHRzKFFlbXVPcHRzICpvcHRzKQoreworICAgIFNvY2tBZGRyZXNzKiogIHBlZXJfbGlzdCA9IE5VTEw7CisgICAgU29ja0FkZHJlc3MqKiAgbG9jYWxfbGlzdCA9IE5VTEw7CisgICAgU29ja0FkZHJlc3MqICAgZTsKKyAgICB1bnNpZ25lZCAgICAgICBmbGFncyA9IDA7CisgICAgY29uc3QgY2hhciAqYWRkcjsKKyAgICBjb25zdCBjaGFyICpwb3J0OworICAgIGNoYXIgdWFkZHJbSU5FVDZfQUREUlNUUkxFTisxXTsKKyAgICBjaGFyIHVwb3J0WzMzXTsKKyAgICBpbnQgc29jayA9IC0xOworICAgIGludCBubjsKKworICAgIC8qIGxvb2t1cCBwZWVyIGFkZHIgKi8KKyAgICBhZGRyID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJob3N0Iik7CisgICAgcG9ydCA9IHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpOworICAgIGlmIChhZGRyID09IE5VTEwgfHwgc3RybGVuKGFkZHIpID09IDApIHsKKyAgICAgICAgYWRkciA9ICJsb2NhbGhvc3QiOworICAgIH0KKyAgICBpZiAocG9ydCA9PSBOVUxMIHx8IHN0cmxlbihwb3J0KSA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW5ldF9kZ3JhbTogcG9ydCBub3Qgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZsYWdzID0gU09DS0VUX0xJU1RfREdSQU07CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY0IiwgMCkpIHsKKyAgICAgICAgZmxhZ3MgJj0gU09DS0VUX0xJU1RfRk9SQ0VfSU42OworICAgICAgICBmbGFncyB8PSBTT0NLRVRfTElTVF9GT1JDRV9JTkVUOworICAgIH0KKyAgICBpZiAocWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgImlwdjYiLCAwKSkgeworICAgICAgICBmbGFncyAmPSBTT0NLRVRfTElTVF9GT1JDRV9JTkVUOworICAgICAgICBmbGFncyB8PSBTT0NLRVRfTElTVF9GT1JDRV9JTjY7CisgICAgfQorCisgICAgcGVlcl9saXN0ID0gc29ja19hZGRyZXNzX2xpc3RfY3JlYXRlKGFkZHIsIHBvcnQsIGZsYWdzKTsKKyAgICBpZiAocGVlcl9saXN0ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImdldGFkZHJpbmZvKCVzLCVzKTogJXNcbiIsCisgICAgICAgICAgICAgICAgYWRkciwgcG9ydCwgZXJybm9fc3RyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGxvb2t1cCBsb2NhbCBhZGRyICovCisgICAgYWRkciA9IHFlbXVfb3B0X2dldChvcHRzLCAibG9jYWxhZGRyIik7CisgICAgcG9ydCA9IHFlbXVfb3B0X2dldChvcHRzLCAibG9jYWxwb3J0Iik7CisgICAgaWYgKGFkZHIgPT0gTlVMTCB8fCBzdHJsZW4oYWRkcikgPT0gMCkgeworICAgICAgICBhZGRyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFwb3J0IHx8IHN0cmxlbihwb3J0KSA9PSAwKQorICAgICAgICBwb3J0ID0gIjAiOworCisgICAgZmxhZ3MgPSBTT0NLRVRfTElTVF9ER1JBTSB8IFNPQ0tFVF9MSVNUX1BBU1NJVkU7CisgICAgbG9jYWxfbGlzdCA9IHNvY2tfYWRkcmVzc19saXN0X2NyZWF0ZShhZGRyLCBwb3J0LCBmbGFncyk7CisgICAgaWYgKGxvY2FsX2xpc3QgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZ2V0YWRkcmluZm8oJXMsJXMpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhZGRyLCBwb3J0LCBlcnJub19zdHIpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHNvY2tfYWRkcmVzc19nZXRfbnVtZXJpY19pbmZvKGxvY2FsX2xpc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YWRkciwgSU5FVDZfQUREUlNUUkxFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwb3J0LCAzMikpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZ2V0bmFtZWluZm86IG9vcHNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBmb3IgKG5uID0gMDsgcGVlcl9saXN0W25uXSAhPSBOVUxMOyBubisrKSB7CisgICAgICAgIFNvY2tBZGRyZXNzICpsb2NhbCA9IGxvY2FsX2xpc3RbMF07CisgICAgICAgIGUgICAgPSBwZWVyX2xpc3Rbbm5dOworICAgICAgICBzb2NrID0gc29ja2V0X2NyZWF0ZShzb2NrX2FkZHJlc3NfZ2V0X2ZhbWlseShlKSwgU09DS0VUX0RHUkFNKTsKKyAgICAgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBzb2NrX2FkZHJlc3Nfc3RyZmFtaWx5KGUpLCBlcnJub19zdHIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc29ja2V0X3NldF94cmV1c2VhZGRyKHNvY2spOworCisgICAgICAgIC8qIGJpbmQgc29ja2V0ICovCisgICAgICAgIGlmIChzb2NrZXRfYmluZChzb2NrLCBsb2NhbCkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IGJpbmQoJXMsJXMsJXMpOiBPS1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHNvY2tfYWRkcmVzc19zdHJmYW1pbHkobG9jYWwpLCBhZGRyLCBwb3J0KTsKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShzb2NrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogY29ubmVjdCB0byBwZWVyICovCisgICAgICAgIGlmIChzb2NrZXRfY29ubmVjdChzb2NrLGUpIDwgMCkgeworICAgICAgICAgICAgaWYgKHNvY2tldHNfZGVidWcpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY29ubmVjdCglcywlcywlcywlcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrX2FkZHJlc3Nfc3RyZmFtaWx5KGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc29ja19hZGRyZXNzX3RvX3N0cmluZyhlKSwgYWRkciwgcG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHNvY2tldF9jbG9zZShzb2NrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzb2NrZXRzX2RlYnVnKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY29ubmVjdCglcywlcywlcywlcyk6IE9LXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrX2FkZHJlc3Nfc3RyZmFtaWx5KGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc29ja19hZGRyZXNzX3RvX3N0cmluZyhlKSwgYWRkciwgcG9ydCk7CisKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBzb2NrID0gLTE7CitFWElUOgorICAgIGlmIChsb2NhbF9saXN0KQorICAgICAgICBzb2NrX2FkZHJlc3NfbGlzdF9mcmVlKGxvY2FsX2xpc3QpOworICAgIGlmIChwZWVyX2xpc3QpCisgICAgICAgIHNvY2tfYWRkcmVzc19saXN0X2ZyZWUocGVlcl9saXN0KTsKKyAgICByZXR1cm4gc29jazsKK30KKworLyogY29tcGF0aWJpbGl0eSB3cmFwcGVyICovCitzdGF0aWMgaW50IGluZXRfcGFyc2UoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpvcHRzdHIsICpoOworICAgIGNoYXIgYWRkcls2NV07CisgICAgY2hhciBwb3J0WzMzXTsKKyAgICBpbnQgcG9zOworCisgICAgLyogcGFyc2UgYWRkcmVzcyAqLworICAgIGlmIChzdHJbMF0gPT0gJzonKSB7CisgICAgICAgIC8qIG5vIGhvc3QgZ2l2ZW4gKi8KKyAgICAgICAgYWRkclswXSA9ICdcMCc7CisgICAgICAgIGlmICgxICE9IHNzY2FuZihzdHIsIjolMzJbXixdJW4iLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBvcnRvbmx5IHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICdbJykgeworICAgICAgICAvKiBJUHY2IGFkZHIgKi8KKyAgICAgICAgaWYgKDIgIT0gc3NjYW5mKHN0ciwiWyU2NFteXV1dOiUzMlteLF0lbiIsYWRkcixwb3J0LCZwb3MpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpcHY2IHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImlwdjYiLCAib24iKTsKKyAgICB9IGVsc2UgaWYgKHFlbXVfaXNkaWdpdChzdHJbMF0pKSB7CisgICAgICAgIC8qIElQdjQgYWRkciAqLworICAgICAgICBpZiAoMiAhPSBzc2NhbmYoc3RyLCIlNjRbMC05Ll06JTMyW14sXSVuIixhZGRyLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGlwdjQgcGFyc2UgZXJyb3IgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaXB2NCIsICJvbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGhvc3RuYW1lICovCisgICAgICAgIGlmICgyICE9IHNzY2FuZihzdHIsIiU2NFteOl06JTMyW14sXSVuIixhZGRyLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGhvc3RuYW1lIHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBxZW11X29wdF9zZXQob3B0cywgImhvc3QiLCBhZGRyKTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgInBvcnQiLCBwb3J0KTsKKworICAgIC8qIHBhcnNlIG9wdGlvbnMgKi8KKyAgICBvcHRzdHIgPSBzdHIgKyBwb3M7CisgICAgaCA9IHN0cnN0cihvcHRzdHIsICIsdG89Iik7CisgICAgaWYgKGgpCisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAidG8iLCBoKzQpOworICAgIGlmIChzdHJzdHIob3B0c3RyLCAiLGlwdjQiKSkKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJpcHY0IiwgIm9uIik7CisgICAgaWYgKHN0cnN0cihvcHRzdHIsICIsaXB2NiIpKQorICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImlwdjYiLCAib24iKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGggPSBzdHJzdHIob3B0c3RyLCAiLHNvY2tldD0iKTsKKyAgICBpZiAoaCkgeworICAgICAgICBpbnQgc29ja2V0X2ZkOworICAgICAgICBjaGFyIHN0cl9mZFsxMl07CisgICAgICAgIGlmICgxICE9IHNzY2FuZihoKzcsIiVkIiwmc29ja2V0X2ZkKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBzb2NrZXQgZmQgcGFyc2UgZXJyb3IgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoKzcpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChzb2NrZXRfZmQgPCAwIHx8IHNvY2tldF9mZCA+PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCBmZCByYW5nZSBlcnJvciAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvY2tldF9mZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYoc3RyX2ZkLCBzaXplb2Ygc3RyX2ZkLCAiJWQiLCBzb2NrZXRfZmQpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInNvY2tldCIsIHN0cl9mZCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBpbmV0X2xpc3Rlbihjb25zdCBjaGFyICpzdHIsIGNoYXIgKm9zdHIsIGludCBvbGVuLAorICAgICAgICAgICAgICAgIGludCBzb2NrdHlwZSwgaW50IHBvcnRfb2Zmc2V0KQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGNoYXIgKm9wdHN0cjsKKyAgICBpbnQgc29jayA9IC0xOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUoJmR1bW15X29wdHMsIE5VTEwsIDApOworICAgIGlmIChpbmV0X3BhcnNlKG9wdHMsIHN0cikgPT0gMCkgeworICAgICAgICBzb2NrID0gaW5ldF9saXN0ZW5fb3B0cyhvcHRzLCBwb3J0X29mZnNldCk7CisgICAgICAgIGlmIChzb2NrICE9IC0xICYmIG9zdHIpIHsKKyAgICAgICAgICAgIG9wdHN0ciA9IHN0cmNocihzdHIsICcsJyk7CisgICAgICAgICAgICBpZiAocWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgImlwdjYiLCAwKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKG9zdHIsIG9sZW4sICJbJXNdOiVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHN0ciA/IG9wdHN0ciA6ICIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYob3N0ciwgb2xlbiwgIiVzOiVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHN0ciA/IG9wdHN0ciA6ICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBxZW11X29wdHNfZGVsKG9wdHMpOworICAgIHJldHVybiBzb2NrOworfQorCitpbnQgaW5ldF9jb25uZWN0KGNvbnN0IGNoYXIgKnN0ciwgaW50IHNvY2t0eXBlKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGludCBzb2NrID0gLTE7CisKKyAgICBvcHRzID0gcWVtdV9vcHRzX2NyZWF0ZSgmZHVtbXlfb3B0cywgTlVMTCwgMCk7CisgICAgaWYgKGluZXRfcGFyc2Uob3B0cywgc3RyKSA9PSAwKQorICAgICAgICBzb2NrID0gaW5ldF9jb25uZWN0X29wdHMob3B0cyk7CisgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICByZXR1cm4gc29jazsKK30KKworI2lmbmRlZiBfV0lOMzIKKworaW50IHVuaXhfbGlzdGVuX29wdHMoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgY29uc3QgY2hhciAqcGF0aCA9IHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpOworICAgIGNoYXIgICAgICAgIHVucGF0aFtQQVRIX01BWF07CisgICAgY29uc3QgY2hhciAqdXBhdGg7CisgICAgaW50IHNvY2ssIGZkOworCisgICAgaWYgKHBhdGggJiYgc3RybGVuKHBhdGgpKSB7CisgICAgICAgIHVwYXRoID0gcGF0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICp0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworICAgICAgICBzbnByaW50Zih1bnBhdGgsIHNpemVvZih1bnBhdGgpLCAiJXMvcWVtdS1zb2NrZXQtWFhYWFhYIiwKKyAgICAgICAgICAgICAgICAgdG1wZGlyID8gdG1wZGlyIDogIi90bXAiKTsKKyAgICAgICAgdXBhdGggPSB1bnBhdGg7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZHVtbXkgZmQgdXNhZ2Ugc2lsZW5jZXMgdGhlIG1rdGVtcCgpIHVuc2VjdXJlIHdhcm5pbmcuCisgICAgICAgICAqIFVzaW5nIG1rc3RlbXAoKSBkb2Vzbid0IG1ha2UgdGhpbmdzIG1vcmUgc2VjdXJlIGhlcmUKKyAgICAgICAgICogdGhvdWdoLiAgYmluZCgpIGNvbXBsYWlucyBhYm91dCBleGlzdGluZyBmaWxlcywgc28gd2UgaGF2ZQorICAgICAgICAgKiB0byB1bmxpbmsgZmlyc3QgYW5kIHRodXMgcmUtb3BlbiB0aGUgcmFjZSB3aW5kb3cuICBUaGUKKyAgICAgICAgICogd29yc3QgY2FzZSBwb3NzaWJsZSBpcyBiaW5kKCkgZmFpbGluZywgaS5lLiBhIERvUyBhdHRhY2suCisgICAgICAgICAqLworICAgICAgICBmZCA9IG1rc3RlbXAodW5wYXRoKTsgY2xvc2UoZmQpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInBhdGgiLCB1bnBhdGgpOworICAgIH0KKworICAgIHNvY2sgPSBzb2NrZXRfdW5peF9zZXJ2ZXIodXBhdGgsIFNPQ0tFVF9TVFJFQU0pOworCisgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmluZCh1bml4OiVzKTogJXNcbiIsIHVwYXRoLCBlcnJub19zdHIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoc29ja2V0c19kZWJ1ZykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJiaW5kKHVuaXg6JXMpOiBPS1xuIiwgdXBhdGgpOworCisgICAgcmV0dXJuIHNvY2s7CisKK2VycjoKKyAgICBzb2NrZXRfY2xvc2Uoc29jayk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgdW5peF9jb25uZWN0X29wdHMoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgU29ja0FkZHJlc3MgIHVuOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBpbnQgcmV0LCBzb2NrOworCisgICAgc29jayA9IHNvY2tldF9jcmVhdGVfdW5peChTT0NLRVRfU1RSRUFNKTsKKyAgICBpZiAoc29jayA8IDApIHsKKyAgICAgICAgcGVycm9yKCJzb2NrZXQodW5peCkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHNvY2tfYWRkcmVzc19pbml0X3VuaXgoJnVuLCBwYXRoKTsKKyAgICByZXQgPSBzb2NrZXRfY29ubmVjdChzb2NrLCAmdW4pOworICAgIHNvY2tfYWRkcmVzc19kb25lKCZ1bik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb25uZWN0KHVuaXg6JXMpOiAlc1xuIiwgcGF0aCwgZXJybm9fc3RyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworCisgICAgaWYgKHNvY2tldHNfZGVidWcpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29ubmVjdCh1bml4OiVzKTogT0tcbiIsIHBhdGgpOworICAgIHJldHVybiBzb2NrOworfQorCisvKiBjb21wYXRpYmlsaXR5IHdyYXBwZXIgKi8KK2ludCB1bml4X2xpc3Rlbihjb25zdCBjaGFyICpzdHIsIGNoYXIgKm9zdHIsIGludCBvbGVuKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGNoYXIgKnBhdGgsICpvcHRzdHI7CisgICAgaW50IHNvY2ssIGxlbjsKKworICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKCZkdW1teV9vcHRzLCBOVUxMLCAwKTsKKworICAgIG9wdHN0ciA9IHN0cmNocihzdHIsICcsJyk7CisgICAgaWYgKG9wdHN0cikgeworICAgICAgICBsZW4gPSBvcHRzdHIgLSBzdHI7CisgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIHBhdGggPSBnX21hbGxvYyhsZW4rMSk7CisgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBsZW4rMSwgIiUuKnMiLCBsZW4sIHN0cik7CisgICAgICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInBhdGgiLCBwYXRoKTsKKyAgICAgICAgICAgIGdfZnJlZShwYXRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHN0cik7CisgICAgfQorCisgICAgc29jayA9IHVuaXhfbGlzdGVuX29wdHMob3B0cyk7CisKKyAgICBpZiAoc29jayAhPSAtMSAmJiBvc3RyKQorICAgICAgICBzbnByaW50Zihvc3RyLCBvbGVuLCAiJXMlcyIsIHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpLCBvcHRzdHIgPyBvcHRzdHIgOiAiIik7CisgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICByZXR1cm4gc29jazsKK30KKworaW50IHVuaXhfY29ubmVjdChjb25zdCBjaGFyICpwYXRoKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGludCBzb2NrOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUoJmR1bW15X29wdHMsIE5VTEwsIDApOworICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHBhdGgpOworICAgIHNvY2sgPSB1bml4X2Nvbm5lY3Rfb3B0cyhvcHRzKTsKKyAgICBxZW11X29wdHNfZGVsKG9wdHMpOworICAgIHJldHVybiBzb2NrOworfQorCisjZWxzZQorCitpbnQgdW5peF9saXN0ZW5fb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1bml4X2Nvbm5lY3Rfb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1bml4X2xpc3Rlbihjb25zdCBjaGFyICpwYXRoLCBjaGFyICpvc3RyLCBpbnQgb2xlbikKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1bml4X2Nvbm5lY3QoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19BTkRST0lEIC8qIHNlZSBzb2NrZXRzLmMgKi8KKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyB2b2lkIHNvY2tldF9jbGVhbnVwKHZvaWQpCit7CisgICAgV1NBQ2xlYW51cCgpOworfQorI2VuZGlmCisKK2ludCBzb2NrZXRfaW5pdCh2b2lkKQoreworI2lmZGVmIF9XSU4zMgorICAgIFdTQURBVEEgRGF0YTsKKyAgICBpbnQgcmV0LCBlcnI7CisKKyAgICByZXQgPSBXU0FTdGFydHVwKE1BS0VXT1JEKDIsMiksICZEYXRhKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZXJyID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV1NBU3RhcnR1cDogJWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXRleGl0KHNvY2tldF9jbGVhbnVwKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qICFDT05GSUdfQU5EUk9JRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtc29ja2V0cy5jIGIvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtc29ja2V0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDNhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS1zb2NrZXRzLmMKQEAgLTAsMCArMSw3MTcgQEAKKy8qCisgKiAgaW5ldCBhbmQgdW5peCBzb2NrZXQgZnVuY3Rpb25zIGZvciBxZW11CisgKgorICogIChjKSAyMDA4IEdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdW5kZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIiAvKiBmb3IgcWVtdV9pc2RpZ2l0ICovCisKKyNpZm5kZWYgQUlfQUREUkNPTkZJRworIyBkZWZpbmUgQUlfQUREUkNPTkZJRyAwCisjZW5kaWYKKworc3RhdGljIGludCBzb2NrZXRzX2RlYnVnID0gMDsKK3N0YXRpYyBjb25zdCBpbnQgb249MSwgb2ZmPTA7CisKKy8qIHVzZWQgdGVtcG9yYXJlbHkgdW50aWwgYWxsIHVzZXJzIGFyZSBjb252ZXJ0ZWQgdG8gUWVtdU9wdHMgKi8KK3N0YXRpYyBRZW11T3B0c0xpc3QgZHVtbXlfb3B0cyA9IHsKKyAgICAubmFtZSA9ICJkdW1teSIsCisgICAgLmhlYWQgPSBRVEFJTFFfSEVBRF9JTklUSUFMSVpFUihkdW1teV9vcHRzLmhlYWQpLAorICAgIC5kZXNjID0geworICAgICAgICB7CisgICAgICAgICAgICAubmFtZSA9ICJwYXRoIiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfU1RSSU5HLAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gImhvc3QiLAorICAgICAgICAgICAgLnR5cGUgPSBRRU1VX09QVF9TVFJJTkcsCisgICAgICAgIH0seworICAgICAgICAgICAgLm5hbWUgPSAicG9ydCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX1NUUklORywKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJ0byIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJpcHY0IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyAgICAgICAgfSx7CisgICAgICAgICAgICAubmFtZSA9ICJpcHY2IiwKKyAgICAgICAgICAgIC50eXBlID0gUUVNVV9PUFRfQk9PTCwKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgICAgICB9LHsKKyAgICAgICAgICAgIC5uYW1lID0gInNvY2tldCIsCisgICAgICAgICAgICAudHlwZSA9IFFFTVVfT1BUX05VTUJFUiwKKyNlbmRpZgorICAgICAgICB9LAorICAgICAgICB7IC8qIGVuZCBpZiBsaXN0ICovIH0KKyAgICB9LAorfTsKKworc3RhdGljIGludCBpbmV0X2dldHBvcnQoc3RydWN0IGFkZHJpbmZvICplKQoreworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqaTQ7CisgICAgc3RydWN0IHNvY2thZGRyX2luNiAqaTY7CisKKyAgICBzd2l0Y2ggKGUtPmFpX2ZhbWlseSkgeworICAgIGNhc2UgUEZfSU5FVDY6CisgICAgICAgIGk2ID0gKHZvaWQqKWUtPmFpX2FkZHI7CisgICAgICAgIHJldHVybiBudG9ocyhpNi0+c2luNl9wb3J0KTsKKyAgICBjYXNlIFBGX0lORVQ6CisgICAgICAgIGk0ID0gKHZvaWQqKWUtPmFpX2FkZHI7CisgICAgICAgIHJldHVybiBudG9ocyhpNC0+c2luX3BvcnQpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5ldF9zZXRwb3J0KHN0cnVjdCBhZGRyaW5mbyAqZSwgaW50IHBvcnQpCit7CisgICAgc3RydWN0IHNvY2thZGRyX2luICppNDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42ICppNjsKKworICAgIHN3aXRjaCAoZS0+YWlfZmFtaWx5KSB7CisgICAgY2FzZSBQRl9JTkVUNjoKKyAgICAgICAgaTYgPSAodm9pZCopZS0+YWlfYWRkcjsKKyAgICAgICAgaTYtPnNpbjZfcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBGX0lORVQ6CisgICAgICAgIGk0ID0gKHZvaWQqKWUtPmFpX2FkZHI7CisgICAgICAgIGk0LT5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmluZXRfc3RyZmFtaWx5KGludCBmYW1pbHkpCit7CisgICAgc3dpdGNoIChmYW1pbHkpIHsKKyAgICBjYXNlIFBGX0lORVQ2OiByZXR1cm4gImlwdjYiOworICAgIGNhc2UgUEZfSU5FVDogIHJldHVybiAiaXB2NCI7CisgICAgY2FzZSBQRl9VTklYOiAgcmV0dXJuICJ1bml4IjsKKyAgICB9CisgICAgcmV0dXJuICJ1bmtub3duIjsKK30KKworc3RhdGljIHZvaWQgaW5ldF9wcmludF9hZGRyaW5mbyhjb25zdCBjaGFyICp0YWcsIHN0cnVjdCBhZGRyaW5mbyAqcmVzKQoreworICAgIHN0cnVjdCBhZGRyaW5mbyAqZTsKKyAgICBjaGFyIHVhZGRyW0lORVQ2X0FERFJTVFJMRU4rMV07CisgICAgY2hhciB1cG9ydFszM107CisKKyAgICBmb3IgKGUgPSByZXM7IGUgIT0gTlVMTDsgZSA9IGUtPmFpX25leHQpIHsKKyAgICAgICAgZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciopZS0+YWlfYWRkcixlLT5haV9hZGRybGVuLAorICAgICAgICAgICAgICAgICAgICB1YWRkcixJTkVUNl9BRERSU1RSTEVOLHVwb3J0LDMyLAorICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBnZXRhZGRyaW5mbzogZmFtaWx5ICVzLCBob3N0ICVzLCBwb3J0ICVzXG4iLAorICAgICAgICAgICAgICAgIHRhZywgaW5ldF9zdHJmYW1pbHkoZS0+YWlfZmFtaWx5KSwgdWFkZHIsIHVwb3J0KTsKKyAgICB9Cit9CisKK2ludCBpbmV0X2xpc3Rlbl9vcHRzKFFlbXVPcHRzICpvcHRzLCBpbnQgcG9ydF9vZmZzZXQpCit7CisgICAgc3RydWN0IGFkZHJpbmZvIGFpLCpyZXMsKmU7CisgICAgY29uc3QgY2hhciAqYWRkcjsKKyAgICBjaGFyIHBvcnRbMzNdOworICAgIGNoYXIgdWFkZHJbSU5FVDZfQUREUlNUUkxFTisxXTsKKyAgICBjaGFyIHVwb3J0WzMzXTsKKyAgICBpbnQgc2xpc3RlbixyYyx0byx0cnlfbmV4dDsKKworICAgIG1lbXNldCgmYWksMCwgc2l6ZW9mKGFpKSk7CisgICAgYWkuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKKyAgICBhaS5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgICAgYWkuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworI2lmZGVmIENPTkZJR19BTkRST0lECisgICAgY29uc3QgY2hhciogc29ja2V0X2ZkID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJzb2NrZXQiKTsKKyAgICBpZiAoc29ja2V0X2ZkKSB7CisgICAgICAgIHJldHVybiBhdG9pKHNvY2tldF9mZCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoKHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpID09IE5VTEwpIHx8CisgICAgICAgIChxZW11X29wdF9nZXQob3B0cywgInBvcnQiKSA9PSBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBob3N0IGFuZC9vciBwb3J0IG5vdCBzcGVjaWZpZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcHN0cmNweShwb3J0LCBzaXplb2YocG9ydCksIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpKTsKKyAgICBhZGRyID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJob3N0Iik7CisKKyAgICB0byA9IHFlbXVfb3B0X2dldF9udW1iZXIob3B0cywgInRvIiwgMCk7CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY0IiwgMCkpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ7CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY2IiwgMCkpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ2OworCisgICAgLyogbG9va3VwICovCisgICAgaWYgKHBvcnRfb2Zmc2V0KQorICAgICAgICBzbnByaW50Zihwb3J0LCBzaXplb2YocG9ydCksICIlZCIsIGF0b2kocG9ydCkgKyBwb3J0X29mZnNldCk7CisgICAgcmMgPSBnZXRhZGRyaW5mbyhzdHJsZW4oYWRkcikgPyBhZGRyIDogTlVMTCwgcG9ydCwgJmFpLCAmcmVzKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZ2V0YWRkcmluZm8oJXMsJXMpOiAlc1xuIiwgYWRkciwgcG9ydCwKKyAgICAgICAgICAgICAgICBnYWlfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc29ja2V0c19kZWJ1ZykKKyAgICAgICAgaW5ldF9wcmludF9hZGRyaW5mbyhfX0ZVTkNUSU9OX18sIHJlcyk7CisKKyAgICAvKiBjcmVhdGUgc29ja2V0ICsgYmluZCAqLworICAgIGZvciAoZSA9IHJlczsgZSAhPSBOVUxMOyBlID0gZS0+YWlfbmV4dCkgeworICAgICAgICBnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKillLT5haV9hZGRyLGUtPmFpX2FkZHJsZW4sCisJCSAgICAgICAgdWFkZHIsSU5FVDZfQUREUlNUUkxFTix1cG9ydCwzMiwKKwkJICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKKyAgICAgICAgc2xpc3RlbiA9IHFlbXVfc29ja2V0KGUtPmFpX2ZhbWlseSwgZS0+YWlfc29ja3R5cGUsIGUtPmFpX3Byb3RvY29sKTsKKyAgICAgICAgaWYgKHNsaXN0ZW4gPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZXRfc3RyZmFtaWx5KGUtPmFpX2ZhbWlseSksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHFlbXVfc2V0c29ja29wdChzbGlzdGVuLFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLCh2b2lkKikmb24sc2l6ZW9mKG9uKSk7CisjaWZkZWYgSVBWNl9WNk9OTFkKKyAgICAgICAgaWYgKGUtPmFpX2ZhbWlseSA9PSBQRl9JTkVUNikgeworICAgICAgICAgICAgLyogbGlzdGVuIG9uIGJvdGggaXB2NCBhbmQgaXB2NiAqLworICAgICAgICAgICAgcWVtdV9zZXRzb2Nrb3B0KHNsaXN0ZW4sSVBQUk9UT19JUFY2LElQVjZfVjZPTkxZLCh2b2lkKikmb2ZmLAorICAgICAgICAgICAgICAgIHNpemVvZihvZmYpKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKGJpbmQoc2xpc3RlbiwgZS0+YWlfYWRkciwgZS0+YWlfYWRkcmxlbikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzb2NrZXRzX2RlYnVnKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IGJpbmQoJXMsJXMsJWQpOiBPS1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5ldF9zdHJmYW1pbHkoZS0+YWlfZmFtaWx5KSwgdWFkZHIsIGluZXRfZ2V0cG9ydChlKSk7CisgICAgICAgICAgICAgICAgZ290byBsaXN0ZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnlfbmV4dCA9IHRvICYmIChpbmV0X2dldHBvcnQoZSkgPD0gdG8gKyBwb3J0X29mZnNldCk7CisgICAgICAgICAgICBpZiAoIXRyeV9uZXh0IHx8IHNvY2tldHNfZGVidWcpCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBiaW5kKCVzLCVzLCVkKTogJXNcbiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZXRfc3RyZmFtaWx5KGUtPmFpX2ZhbWlseSksIHVhZGRyLCBpbmV0X2dldHBvcnQoZSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgaWYgKHRyeV9uZXh0KSB7CisgICAgICAgICAgICAgICAgaW5ldF9zZXRwb3J0KGUsIGluZXRfZ2V0cG9ydChlKSArIDEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2Vzb2NrZXQoc2xpc3Rlbik7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IEZBSUxFRFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICByZXR1cm4gLTE7CisKK2xpc3RlbjoKKyAgICBpZiAobGlzdGVuKHNsaXN0ZW4sMSkgIT0gMCkgeworICAgICAgICBwZXJyb3IoImxpc3RlbiIpOworICAgICAgICBjbG9zZXNvY2tldChzbGlzdGVuKTsKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc25wcmludGYodXBvcnQsIHNpemVvZih1cG9ydCksICIlZCIsIGluZXRfZ2V0cG9ydChlKSAtIHBvcnRfb2Zmc2V0KTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgImhvc3QiLCB1YWRkcik7CisgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJwb3J0IiwgdXBvcnQpOworICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaXB2NiIsIChlLT5haV9mYW1pbHkgPT0gUEZfSU5FVDYpID8gIm9uIiA6ICJvZmYiKTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgImlwdjQiLCAoZS0+YWlfZmFtaWx5ICE9IFBGX0lORVQ2KSA/ICJvbiIgOiAib2ZmIik7CisgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIHNsaXN0ZW47Cit9CisKK2ludCBpbmV0X2Nvbm5lY3Rfb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gYWksKnJlcywqZTsKKyAgICBjb25zdCBjaGFyICphZGRyOworICAgIGNvbnN0IGNoYXIgKnBvcnQ7CisgICAgY2hhciB1YWRkcltJTkVUNl9BRERSU1RSTEVOKzFdOworICAgIGNoYXIgdXBvcnRbMzNdOworICAgIGludCBzb2NrLHJjOworCisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICBjb25zdCBjaGFyKiBzb2NrZXRfZmQgPSBxZW11X29wdF9nZXQob3B0cywgInNvY2tldCIpOworICAgIGlmIChzb2NrZXRfZmQpIHsKKyAgICAgICAgcmV0dXJuIGF0b2koc29ja2V0X2ZkKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1lbXNldCgmYWksMCwgc2l6ZW9mKGFpKSk7CisgICAgYWkuYWlfZmxhZ3MgPSBBSV9DQU5PTk5BTUUgfCBBSV9BRERSQ09ORklHOworICAgIGFpLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKyAgICBhaS5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworCisgICAgYWRkciA9IHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpOworICAgIHBvcnQgPSBxZW11X29wdF9nZXQob3B0cywgInBvcnQiKTsKKyAgICBpZiAoYWRkciA9PSBOVUxMIHx8IHBvcnQgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImluZXRfY29ubmVjdDogaG9zdCBhbmQvb3IgcG9ydCBub3Qgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChxZW11X29wdF9nZXRfYm9vbChvcHRzLCAiaXB2NCIsIDApKQorICAgICAgICBhaS5haV9mYW1pbHkgPSBQRl9JTkVUOworICAgIGlmIChxZW11X29wdF9nZXRfYm9vbChvcHRzLCAiaXB2NiIsIDApKQorICAgICAgICBhaS5haV9mYW1pbHkgPSBQRl9JTkVUNjsKKworICAgIC8qIGxvb2t1cCAqLworICAgIGlmICgwICE9IChyYyA9IGdldGFkZHJpbmZvKGFkZHIsIHBvcnQsICZhaSwgJnJlcykpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJnZXRhZGRyaW5mbyglcywlcyk6ICVzXG4iLCBhZGRyLCBwb3J0LAorICAgICAgICAgICAgICAgIGdhaV9zdHJlcnJvcihyYykpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNvY2tldHNfZGVidWcpCisgICAgICAgIGluZXRfcHJpbnRfYWRkcmluZm8oX19GVU5DVElPTl9fLCByZXMpOworCisgICAgZm9yIChlID0gcmVzOyBlICE9IE5VTEw7IGUgPSBlLT5haV9uZXh0KSB7CisgICAgICAgIGlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKillLT5haV9hZGRyLGUtPmFpX2FkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWFkZHIsSU5FVDZfQUREUlNUUkxFTix1cG9ydCwzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKSAhPSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IGdldG5hbWVpbmZvOiBvb3BzXG4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc29jayA9IHFlbXVfc29ja2V0KGUtPmFpX2ZhbWlseSwgZS0+YWlfc29ja3R5cGUsIGUtPmFpX3Byb3RvY29sKTsKKyAgICAgICAgaWYgKHNvY2sgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBpbmV0X3N0cmZhbWlseShlLT5haV9mYW1pbHkpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9zZXRzb2Nrb3B0KHNvY2ssU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsKHZvaWQqKSZvbixzaXplb2Yob24pKTsKKworICAgICAgICAvKiBjb25uZWN0IHRvIHBlZXIgKi8KKyAgICAgICAgaWYgKGNvbm5lY3Qoc29jayxlLT5haV9hZGRyLGUtPmFpX2FkZHJsZW4pIDwgMCkgeworICAgICAgICAgICAgaWYgKHNvY2tldHNfZGVidWcgfHwgTlVMTCA9PSBlLT5haV9uZXh0KQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvbm5lY3QoJXMsJXMsJXMsJXMpOiAlc1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5ldF9zdHJmYW1pbHkoZS0+YWlfZmFtaWx5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUtPmFpX2Nhbm9ubmFtZSwgdWFkZHIsIHVwb3J0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgY2xvc2Vzb2NrZXQoc29jayk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29ja2V0c19kZWJ1ZykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvbm5lY3QoJXMsJXMsJXMsJXMpOiBPS1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbmV0X3N0cmZhbWlseShlLT5haV9mYW1pbHkpLAorICAgICAgICAgICAgICAgICAgICBlLT5haV9jYW5vbm5hbWUsIHVhZGRyLCB1cG9ydCk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICByZXR1cm4gc29jazsKKyAgICB9CisgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgaW5ldF9kZ3JhbV9vcHRzKFFlbXVPcHRzICpvcHRzKQoreworICAgIHN0cnVjdCBhZGRyaW5mbyBhaSwgKnBlZXIgPSBOVUxMLCAqbG9jYWwgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmFkZHI7CisgICAgY29uc3QgY2hhciAqcG9ydDsKKyAgICBjaGFyIHVhZGRyW0lORVQ2X0FERFJTVFJMRU4rMV07CisgICAgY2hhciB1cG9ydFszM107CisgICAgaW50IHNvY2sgPSAtMSwgcmM7CisKKyAgICAvKiBsb29rdXAgcGVlciBhZGRyICovCisgICAgbWVtc2V0KCZhaSwwLCBzaXplb2YoYWkpKTsKKyAgICBhaS5haV9mbGFncyA9IEFJX0NBTk9OTkFNRSB8IEFJX0FERFJDT05GSUc7CisgICAgYWkuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworICAgIGFpLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKworICAgIGFkZHIgPSBxZW11X29wdF9nZXQob3B0cywgImhvc3QiKTsKKyAgICBwb3J0ID0gcWVtdV9vcHRfZ2V0KG9wdHMsICJwb3J0Iik7CisgICAgaWYgKGFkZHIgPT0gTlVMTCB8fCBzdHJsZW4oYWRkcikgPT0gMCkgeworICAgICAgICBhZGRyID0gImxvY2FsaG9zdCI7CisgICAgfQorICAgIGlmIChwb3J0ID09IE5VTEwgfHwgc3RybGVuKHBvcnQpID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbmV0X2RncmFtOiBwb3J0IG5vdCBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY0IiwgMCkpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ7CisgICAgaWYgKHFlbXVfb3B0X2dldF9ib29sKG9wdHMsICJpcHY2IiwgMCkpCisgICAgICAgIGFpLmFpX2ZhbWlseSA9IFBGX0lORVQ2OworCisgICAgaWYgKDAgIT0gKHJjID0gZ2V0YWRkcmluZm8oYWRkciwgcG9ydCwgJmFpLCAmcGVlcikpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJnZXRhZGRyaW5mbyglcywlcyk6ICVzXG4iLCBhZGRyLCBwb3J0LAorICAgICAgICAgICAgICAgIGdhaV9zdHJlcnJvcihyYykpOworCXJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNvY2tldHNfZGVidWcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogcGVlciAoJXM6JXMpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIHBvcnQpOworICAgICAgICBpbmV0X3ByaW50X2FkZHJpbmZvKF9fRlVOQ1RJT05fXywgcGVlcik7CisgICAgfQorCisgICAgLyogbG9va3VwIGxvY2FsIGFkZHIgKi8KKyAgICBtZW1zZXQoJmFpLDAsIHNpemVvZihhaSkpOworICAgIGFpLmFpX2ZsYWdzID0gQUlfUEFTU0lWRTsKKyAgICBhaS5haV9mYW1pbHkgPSBwZWVyLT5haV9mYW1pbHk7CisgICAgYWkuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworCisgICAgYWRkciA9IHFlbXVfb3B0X2dldChvcHRzLCAibG9jYWxhZGRyIik7CisgICAgcG9ydCA9IHFlbXVfb3B0X2dldChvcHRzLCAibG9jYWxwb3J0Iik7CisgICAgaWYgKGFkZHIgPT0gTlVMTCB8fCBzdHJsZW4oYWRkcikgPT0gMCkgeworICAgICAgICBhZGRyID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFwb3J0IHx8IHN0cmxlbihwb3J0KSA9PSAwKQorICAgICAgICBwb3J0ID0gIjAiOworCisgICAgaWYgKDAgIT0gKHJjID0gZ2V0YWRkcmluZm8oYWRkciwgcG9ydCwgJmFpLCAmbG9jYWwpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZ2V0YWRkcmluZm8oJXMsJXMpOiAlc1xuIiwgYWRkciwgcG9ydCwKKyAgICAgICAgICAgICAgICBnYWlfc3RyZXJyb3IocmMpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc29ja2V0c19kZWJ1ZykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBsb2NhbCAoJXM6JXMpXG4iLCBfX0ZVTkNUSU9OX18sIGFkZHIsIHBvcnQpOworICAgICAgICBpbmV0X3ByaW50X2FkZHJpbmZvKF9fRlVOQ1RJT05fXywgbG9jYWwpOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBzb2NrZXQgKi8KKyAgICBzb2NrID0gcWVtdV9zb2NrZXQocGVlci0+YWlfZmFtaWx5LCBwZWVyLT5haV9zb2NrdHlwZSwgcGVlci0+YWlfcHJvdG9jb2wpOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCglcyk6ICVzXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgaW5ldF9zdHJmYW1pbHkocGVlci0+YWlfZmFtaWx5KSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIHFlbXVfc2V0c29ja29wdChzb2NrLFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLCh2b2lkKikmb24sc2l6ZW9mKG9uKSk7CisKKyAgICAvKiBiaW5kIHNvY2tldCAqLworICAgIGlmIChnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyKilsb2NhbC0+YWlfYWRkcixsb2NhbC0+YWlfYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgdWFkZHIsSU5FVDZfQUREUlNUUkxFTix1cG9ydCwzMiwKKyAgICAgICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1QgfCBOSV9OVU1FUklDU0VSVikgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBnZXRuYW1laW5mbzogb29wc1xuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChiaW5kKHNvY2ssIGxvY2FsLT5haV9hZGRyLCBsb2NhbC0+YWlfYWRkcmxlbikgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogYmluZCglcywlcywlZCk6IE9LXG4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgaW5ldF9zdHJmYW1pbHkobG9jYWwtPmFpX2ZhbWlseSksIHVhZGRyLCBpbmV0X2dldHBvcnQobG9jYWwpKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogY29ubmVjdCB0byBwZWVyICovCisgICAgaWYgKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIqKXBlZXItPmFpX2FkZHIsIHBlZXItPmFpX2FkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgIHVhZGRyLCBJTkVUNl9BRERSU1RSTEVOLCB1cG9ydCwgMzIsCisgICAgICAgICAgICAgICAgICAgIE5JX05VTUVSSUNIT1NUIHwgTklfTlVNRVJJQ1NFUlYpICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogZ2V0bmFtZWluZm86IG9vcHNcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoY29ubmVjdChzb2NrLHBlZXItPmFpX2FkZHIscGVlci0+YWlfYWRkcmxlbikgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvbm5lY3QoJXMsJXMsJXMsJXMpOiAlc1xuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGluZXRfc3RyZmFtaWx5KHBlZXItPmFpX2ZhbWlseSksCisgICAgICAgICAgICAgICAgcGVlci0+YWlfY2Fub25uYW1lLCB1YWRkciwgdXBvcnQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZyZWVhZGRyaW5mbyhsb2NhbCk7CisgICAgZnJlZWFkZHJpbmZvKHBlZXIpOworICAgIHJldHVybiBzb2NrOworCitlcnI6CisgICAgaWYgKC0xICE9IHNvY2spCisgICAgICAgIGNsb3Nlc29ja2V0KHNvY2spOworICAgIGlmIChsb2NhbCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKGxvY2FsKTsKKyAgICBpZiAocGVlcikKKyAgICAgICAgZnJlZWFkZHJpbmZvKHBlZXIpOworICAgIHJldHVybiAtMTsKK30KKworLyogY29tcGF0aWJpbGl0eSB3cmFwcGVyICovCitzdGF0aWMgaW50IGluZXRfcGFyc2UoUWVtdU9wdHMgKm9wdHMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBjb25zdCBjaGFyICpvcHRzdHIsICpoOworICAgIGNoYXIgYWRkcls2NV07CisgICAgY2hhciBwb3J0WzMzXTsKKyAgICBpbnQgcG9zOworCisgICAgLyogcGFyc2UgYWRkcmVzcyAqLworICAgIGlmIChzdHJbMF0gPT0gJzonKSB7CisgICAgICAgIC8qIG5vIGhvc3QgZ2l2ZW4gKi8KKyAgICAgICAgYWRkclswXSA9ICdcMCc7CisgICAgICAgIGlmICgxICE9IHNzY2FuZihzdHIsIjolMzJbXixdJW4iLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHBvcnRvbmx5IHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICdbJykgeworICAgICAgICAvKiBJUHY2IGFkZHIgKi8KKyAgICAgICAgaWYgKDIgIT0gc3NjYW5mKHN0ciwiWyU2NFteXV1dOiUzMlteLF0lbiIsYWRkcixwb3J0LCZwb3MpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBpcHY2IHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImlwdjYiLCAib24iKTsKKyAgICB9IGVsc2UgaWYgKHFlbXVfaXNkaWdpdChzdHJbMF0pKSB7CisgICAgICAgIC8qIElQdjQgYWRkciAqLworICAgICAgICBpZiAoMiAhPSBzc2NhbmYoc3RyLCIlNjRbMC05Ll06JTMyW14sXSVuIixhZGRyLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGlwdjQgcGFyc2UgZXJyb3IgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAiaXB2NCIsICJvbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGhvc3RuYW1lICovCisgICAgICAgIGlmICgyICE9IHNzY2FuZihzdHIsIiU2NFteOl06JTMyW14sXSVuIixhZGRyLHBvcnQsJnBvcykpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGhvc3RuYW1lIHBhcnNlIGVycm9yICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBxZW11X29wdF9zZXQob3B0cywgImhvc3QiLCBhZGRyKTsKKyAgICBxZW11X29wdF9zZXQob3B0cywgInBvcnQiLCBwb3J0KTsKKworICAgIC8qIHBhcnNlIG9wdGlvbnMgKi8KKyAgICBvcHRzdHIgPSBzdHIgKyBwb3M7CisgICAgaCA9IHN0cnN0cihvcHRzdHIsICIsdG89Iik7CisgICAgaWYgKGgpCisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAidG8iLCBoKzQpOworICAgIGlmIChzdHJzdHIob3B0c3RyLCAiLGlwdjQiKSkKKyAgICAgICAgcWVtdV9vcHRfc2V0KG9wdHMsICJpcHY0IiwgIm9uIik7CisgICAgaWYgKHN0cnN0cihvcHRzdHIsICIsaXB2NiIpKQorICAgICAgICBxZW11X29wdF9zZXQob3B0cywgImlwdjYiLCAib24iKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGggPSBzdHJzdHIob3B0c3RyLCAiLHNvY2tldD0iKTsKKyAgICBpZiAoaCkgeworICAgICAgICBpbnQgc29ja2V0X2ZkOworICAgICAgICBjaGFyIHN0cl9mZFsxMl07CisgICAgICAgIGlmICgxICE9IHNzY2FuZihoKzcsIiVkIiwmc29ja2V0X2ZkKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBzb2NrZXQgZmQgcGFyc2UgZXJyb3IgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoKzcpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChzb2NrZXRfZmQgPCAwIHx8IHNvY2tldF9mZCA+PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IHNvY2tldCBmZCByYW5nZSBlcnJvciAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvY2tldF9mZCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYoc3RyX2ZkLCBzaXplb2Ygc3RyX2ZkLCAiJWQiLCBzb2NrZXRfZmQpOworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInNvY2tldCIsIHN0cl9mZCk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBpbmV0X2xpc3Rlbihjb25zdCBjaGFyICpzdHIsIGNoYXIgKm9zdHIsIGludCBvbGVuLAorICAgICAgICAgICAgICAgIGludCBzb2NrdHlwZSwgaW50IHBvcnRfb2Zmc2V0KQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGNoYXIgKm9wdHN0cjsKKyAgICBpbnQgc29jayA9IC0xOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUoJmR1bW15X29wdHMsIE5VTEwsIDApOworICAgIGlmIChpbmV0X3BhcnNlKG9wdHMsIHN0cikgPT0gMCkgeworICAgICAgICBzb2NrID0gaW5ldF9saXN0ZW5fb3B0cyhvcHRzLCBwb3J0X29mZnNldCk7CisgICAgICAgIGlmIChzb2NrICE9IC0xICYmIG9zdHIpIHsKKyAgICAgICAgICAgIG9wdHN0ciA9IHN0cmNocihzdHIsICcsJyk7CisgICAgICAgICAgICBpZiAocWVtdV9vcHRfZ2V0X2Jvb2wob3B0cywgImlwdjYiLCAwKSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKG9zdHIsIG9sZW4sICJbJXNdOiVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHN0ciA/IG9wdHN0ciA6ICIiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYob3N0ciwgb2xlbiwgIiVzOiVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAiaG9zdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X2dldChvcHRzLCAicG9ydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHN0ciA/IG9wdHN0ciA6ICIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBxZW11X29wdHNfZGVsKG9wdHMpOworICAgIHJldHVybiBzb2NrOworfQorCitpbnQgaW5ldF9jb25uZWN0KGNvbnN0IGNoYXIgKnN0ciwgaW50IHNvY2t0eXBlKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGludCBzb2NrID0gLTE7CisKKyAgICBvcHRzID0gcWVtdV9vcHRzX2NyZWF0ZSgmZHVtbXlfb3B0cywgTlVMTCwgMCk7CisgICAgaWYgKGluZXRfcGFyc2Uob3B0cywgc3RyKSA9PSAwKQorICAgICAgICBzb2NrID0gaW5ldF9jb25uZWN0X29wdHMob3B0cyk7CisgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICByZXR1cm4gc29jazsKK30KKworI2lmbmRlZiBfV0lOMzIKKworaW50IHVuaXhfbGlzdGVuX29wdHMoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIHVuOworICAgIGNvbnN0IGNoYXIgKnBhdGggPSBxZW11X29wdF9nZXQob3B0cywgInBhdGgiKTsKKyAgICBpbnQgc29jaywgZmQ7CisKKyAgICBzb2NrID0gcWVtdV9zb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBwZXJyb3IoInNvY2tldCh1bml4KSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtc2V0KCZ1biwgMCwgc2l6ZW9mKHVuKSk7CisgICAgdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgaWYgKHBhdGggJiYgc3RybGVuKHBhdGgpKSB7CisgICAgICAgIHNucHJpbnRmKHVuLnN1bl9wYXRoLCBzaXplb2YodW4uc3VuX3BhdGgpLCAiJXMiLCBwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyICp0bXBkaXIgPSBnZXRlbnYoIlRNUERJUiIpOworICAgICAgICBzbnByaW50Zih1bi5zdW5fcGF0aCwgc2l6ZW9mKHVuLnN1bl9wYXRoKSwgIiVzL3FlbXUtc29ja2V0LVhYWFhYWCIsCisgICAgICAgICAgICAgICAgIHRtcGRpciA/IHRtcGRpciA6ICIvdG1wIik7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoaXMgZHVtbXkgZmQgdXNhZ2Ugc2lsZW5jZXMgdGhlIG1rdGVtcCgpIHVuc2VjdXJlIHdhcm5pbmcuCisgICAgICAgICAqIFVzaW5nIG1rc3RlbXAoKSBkb2Vzbid0IG1ha2UgdGhpbmdzIG1vcmUgc2VjdXJlIGhlcmUKKyAgICAgICAgICogdGhvdWdoLiAgYmluZCgpIGNvbXBsYWlucyBhYm91dCBleGlzdGluZyBmaWxlcywgc28gd2UgaGF2ZQorICAgICAgICAgKiB0byB1bmxpbmsgZmlyc3QgYW5kIHRodXMgcmUtb3BlbiB0aGUgcmFjZSB3aW5kb3cuICBUaGUKKyAgICAgICAgICogd29yc3QgY2FzZSBwb3NzaWJsZSBpcyBiaW5kKCkgZmFpbGluZywgaS5lLiBhIERvUyBhdHRhY2suCisgICAgICAgICAqLworICAgICAgICBmZCA9IG1rc3RlbXAodW4uc3VuX3BhdGgpOyBjbG9zZShmZCk7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHVuLnN1bl9wYXRoKTsKKyAgICB9CisKKyAgICB1bmxpbmsodW4uc3VuX3BhdGgpOworICAgIGlmIChiaW5kKHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIqKSAmdW4sIHNpemVvZih1bikpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJpbmQodW5peDolcyk6ICVzXG4iLCB1bi5zdW5fcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmIChsaXN0ZW4oc29jaywgMSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibGlzdGVuKHVuaXg6JXMpOiAlc1xuIiwgdW4uc3VuX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChzb2NrZXRzX2RlYnVnKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJpbmQodW5peDolcyk6IE9LXG4iLCB1bi5zdW5fcGF0aCk7CisgICAgcmV0dXJuIHNvY2s7CisKK2VycjoKKyAgICBjbG9zZXNvY2tldChzb2NrKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1bml4X2Nvbm5lY3Rfb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gdW47CisgICAgY29uc3QgY2hhciAqcGF0aCA9IHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpOworICAgIGludCBzb2NrOworCisgICAgaWYgKE5VTEwgPT0gcGF0aCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggY29ubmVjdDogbm8gcGF0aCBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc29jayA9IHFlbXVfc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBpZiAoc29jayA8IDApIHsKKyAgICAgICAgcGVycm9yKCJzb2NrZXQodW5peCkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmdW4sIDAsIHNpemVvZih1bikpOworICAgIHVuLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIHNucHJpbnRmKHVuLnN1bl9wYXRoLCBzaXplb2YodW4uc3VuX3BhdGgpLCAiJXMiLCBwYXRoKTsKKyAgICBpZiAoY29ubmVjdChzb2NrLCAoc3RydWN0IHNvY2thZGRyKikgJnVuLCBzaXplb2YodW4pKSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb25uZWN0KHVuaXg6JXMpOiAlc1xuIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHNvY2tldHNfZGVidWcpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29ubmVjdCh1bml4OiVzKTogT0tcbiIsIHBhdGgpOworICAgIHJldHVybiBzb2NrOworfQorCisvKiBjb21wYXRpYmlsaXR5IHdyYXBwZXIgKi8KK2ludCB1bml4X2xpc3Rlbihjb25zdCBjaGFyICpzdHIsIGNoYXIgKm9zdHIsIGludCBvbGVuKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGNoYXIgKnBhdGgsICpvcHRzdHI7CisgICAgaW50IHNvY2ssIGxlbjsKKworICAgIG9wdHMgPSBxZW11X29wdHNfY3JlYXRlKCZkdW1teV9vcHRzLCBOVUxMLCAwKTsKKworICAgIG9wdHN0ciA9IHN0cmNocihzdHIsICcsJyk7CisgICAgaWYgKG9wdHN0cikgeworICAgICAgICBsZW4gPSBvcHRzdHIgLSBzdHI7CisgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgIHBhdGggPSBnX21hbGxvYyhsZW4rMSk7CisgICAgICAgICAgICBzbnByaW50ZihwYXRoLCBsZW4rMSwgIiUuKnMiLCBsZW4sIHN0cik7CisgICAgICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInBhdGgiLCBwYXRoKTsKKyAgICAgICAgICAgIGdfZnJlZShwYXRoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHN0cik7CisgICAgfQorCisgICAgc29jayA9IHVuaXhfbGlzdGVuX29wdHMob3B0cyk7CisKKyAgICBpZiAoc29jayAhPSAtMSAmJiBvc3RyKQorICAgICAgICBzbnByaW50Zihvc3RyLCBvbGVuLCAiJXMlcyIsIHFlbXVfb3B0X2dldChvcHRzLCAicGF0aCIpLCBvcHRzdHIgPyBvcHRzdHIgOiAiIik7CisgICAgcWVtdV9vcHRzX2RlbChvcHRzKTsKKyAgICByZXR1cm4gc29jazsKK30KKworaW50IHVuaXhfY29ubmVjdChjb25zdCBjaGFyICpwYXRoKQoreworICAgIFFlbXVPcHRzICpvcHRzOworICAgIGludCBzb2NrOworCisgICAgb3B0cyA9IHFlbXVfb3B0c19jcmVhdGUoJmR1bW15X29wdHMsIE5VTEwsIDApOworICAgIHFlbXVfb3B0X3NldChvcHRzLCAicGF0aCIsIHBhdGgpOworICAgIHNvY2sgPSB1bml4X2Nvbm5lY3Rfb3B0cyhvcHRzKTsKKyAgICBxZW11X29wdHNfZGVsKG9wdHMpOworICAgIHJldHVybiBzb2NrOworfQorCisjZWxzZQorCitpbnQgdW5peF9saXN0ZW5fb3B0cyhRZW11T3B0cyAqb3B0cykKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgdW5peF9jb25uZWN0X29wdHMoUWVtdU9wdHMgKm9wdHMpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJ1bml4IHNvY2tldHMgYXJlIG5vdCBhdmFpbGFibGUgb24gd2luZG93c1xuIik7CisgICAgZXJybm8gPSBFTk9UU1VQOworICAgIHJldHVybiAtMTsKK30KKworaW50IHVuaXhfbGlzdGVuKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKm9zdHIsIGludCBvbGVuKQoreworICAgIGZwcmludGYoc3RkZXJyLCAidW5peCBzb2NrZXRzIGFyZSBub3QgYXZhaWxhYmxlIG9uIHdpbmRvd3NcbiIpOworICAgIGVycm5vID0gRU5PVFNVUDsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCB1bml4X2Nvbm5lY3QoY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVuaXggc29ja2V0cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB3aW5kb3dzXG4iKTsKKyAgICBlcnJubyA9IEVOT1RTVVA7CisgICAgcmV0dXJuIC0xOworfQorCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorc3RhdGljIHZvaWQgc29ja2V0X2NsZWFudXAodm9pZCkKK3sKKyAgICBXU0FDbGVhbnVwKCk7Cit9CisjZW5kaWYKKworaW50IHNvY2tldF9pbml0KHZvaWQpCit7CisjaWZkZWYgX1dJTjMyCisgICAgV1NBREFUQSBEYXRhOworICAgIGludCByZXQsIGVycjsKKworICAgIHJldCA9IFdTQVN0YXJ0dXAoTUFLRVdPUkQoMiwyKSwgJkRhdGEpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBlcnIgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXU0FTdGFydHVwOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhdGV4aXQoc29ja2V0X2NsZWFudXApOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS10aHJlYWQtcG9zaXguYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LXRocmVhZC1wb3NpeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOGY4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS10aHJlYWQtcG9zaXguYwpAQCAtMCwwICsxLDQ1MiBAQAorLyoKKyAqIFdyYXBwZXJzIGFyb3VuZCBtdXRleC9jb25kL3RocmVhZCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgUmVkIEhhdCwgSW5jLiAyMDA5CisgKgorICogQXV0aG9yOgorICogIE1hcmNlbG8gVG9zYXR0aSA8bXRvc2F0dGlAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIgb3IgbGF0ZXIuCisgKiBTZWUgdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgorI2VuZGlmCisjaW5jbHVkZSAicWVtdS90aHJlYWQuaCIKKyNpbmNsdWRlICJxZW11L2F0b21pYy5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9jcmFzaHJlcG9ydC9jcmFzaC1oYW5kbGVyLmgiCisKK3N0YXRpYyB2b2lkIGVycm9yX2V4aXQoaW50IGVyciwgY29uc3QgY2hhciAqbXNnKQoreworICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJXM6ICVzXG4iLCBtc2csIHN0cmVycm9yKGVycikpOworICAgIGNyYXNoaGFuZGxlcl9kaWVfZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciBpbiAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbXNnLCBzdHJlcnJvcihlcnIpLCBlcnIpOworfQorCit2b2lkIHFlbXVfbXV0ZXhfaW5pdChRZW11TXV0ZXggKm11dGV4KQoreworICAgIGludCBlcnI7CisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleGF0dHI7CisKKyAgICBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleGF0dHIpOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLKTsKKyAgICBlcnIgPSBwdGhyZWFkX211dGV4X2luaXQoJm11dGV4LT5sb2NrLCAmbXV0ZXhhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOworICAgIGlmIChlcnIpCisgICAgICAgIGVycm9yX2V4aXQoZXJyLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF9kZXN0cm95KFFlbXVNdXRleCAqbXV0ZXgpCit7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXV0ZXgtPmxvY2spOworICAgIGlmIChlcnIpCisgICAgICAgIGVycm9yX2V4aXQoZXJyLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF9sb2NrKFFlbXVNdXRleCAqbXV0ZXgpCit7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgtPmxvY2spOworICAgIGlmIChlcnIpCisgICAgICAgIGVycm9yX2V4aXQoZXJyLCBfX2Z1bmNfXyk7Cit9CisKK2ludCBxZW11X211dGV4X3RyeWxvY2soUWVtdU11dGV4ICptdXRleCkKK3sKKyAgICByZXR1cm4gcHRocmVhZF9tdXRleF90cnlsb2NrKCZtdXRleC0+bG9jayk7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF91bmxvY2soUWVtdU11dGV4ICptdXRleCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4LT5sb2NrKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBlcnJvcl9leGl0KGVyciwgX19mdW5jX18pOworfQorCit2b2lkIHFlbXVfY29uZF9pbml0KFFlbXVDb25kICpjb25kKQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfaW5pdCgmY29uZC0+Y29uZCwgTlVMTCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZXJyb3JfZXhpdChlcnIsIF9fZnVuY19fKTsKK30KKwordm9pZCBxZW11X2NvbmRfZGVzdHJveShRZW11Q29uZCAqY29uZCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9jb25kX2Rlc3Ryb3koJmNvbmQtPmNvbmQpOworICAgIGlmIChlcnIpCisgICAgICAgIGVycm9yX2V4aXQoZXJyLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgcWVtdV9jb25kX3NpZ25hbChRZW11Q29uZCAqY29uZCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gcHRocmVhZF9jb25kX3NpZ25hbCgmY29uZC0+Y29uZCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZXJyb3JfZXhpdChlcnIsIF9fZnVuY19fKTsKK30KKwordm9pZCBxZW11X2NvbmRfYnJvYWRjYXN0KFFlbXVDb25kICpjb25kKQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjb25kLT5jb25kKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBlcnJvcl9leGl0KGVyciwgX19mdW5jX18pOworfQorCit2b2lkIHFlbXVfY29uZF93YWl0KFFlbXVDb25kICpjb25kLCBRZW11TXV0ZXggKm11dGV4KQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBwdGhyZWFkX2NvbmRfd2FpdCgmY29uZC0+Y29uZCwgJm11dGV4LT5sb2NrKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBlcnJvcl9leGl0KGVyciwgX19mdW5jX18pOworfQorCit2b2lkIHFlbXVfc2VtX2luaXQoUWVtdVNlbWFwaG9yZSAqc2VtLCBpbnQgaW5pdCkKK3sKKyAgICBpbnQgcmM7CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorICAgIHJjID0gcHRocmVhZF9tdXRleF9pbml0KCZzZW0tPmxvY2ssIE5VTEwpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIGVycm9yX2V4aXQocmMsIF9fZnVuY19fKTsKKyAgICB9CisgICAgcmMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmc2VtLT5jb25kLCBOVUxMKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBlcnJvcl9leGl0KHJjLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIGlmIChpbml0IDwgMCkgeworICAgICAgICBlcnJvcl9leGl0KEVJTlZBTCwgX19mdW5jX18pOworICAgIH0KKyAgICBzZW0tPmNvdW50ID0gaW5pdDsKKyNlbHNlCisgICAgcmMgPSBzZW1faW5pdCgmc2VtLT5zZW0sIDAsIGluaXQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgZXJyb3JfZXhpdChlcnJubywgX19mdW5jX18pOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIHFlbXVfc2VtX2Rlc3Ryb3koUWVtdVNlbWFwaG9yZSAqc2VtKQoreworICAgIGludCByYzsKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCisgICAgcmMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmc2VtLT5jb25kKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIGVycm9yX2V4aXQocmMsIF9fZnVuY19fKTsKKyAgICB9CisgICAgcmMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnNlbS0+bG9jayk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBlcnJvcl9leGl0KHJjLCBfX2Z1bmNfXyk7CisgICAgfQorI2Vsc2UKKyAgICByYyA9IHNlbV9kZXN0cm95KCZzZW0tPnNlbSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBlcnJvcl9leGl0KGVycm5vLCBfX2Z1bmNfXyk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgcWVtdV9zZW1fcG9zdChRZW11U2VtYXBob3JlICpzZW0pCit7CisgICAgaW50IHJjOworCisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlbS0+bG9jayk7CisgICAgaWYgKHNlbS0+Y291bnQgPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgcmMgPSBFSU5WQUw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VtLT5jb3VudCsrOworICAgICAgICByYyA9IHB0aHJlYWRfY29uZF9zaWduYWwoJnNlbS0+Y29uZCk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZW0tPmxvY2spOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIGVycm9yX2V4aXQocmMsIF9fZnVuY19fKTsKKyAgICB9CisjZWxzZQorICAgIHJjID0gc2VtX3Bvc3QoJnNlbS0+c2VtKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIGVycm9yX2V4aXQoZXJybm8sIF9fZnVuY19fKTsKKyAgICB9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9hYnNfZGVhZGxpbmUoc3RydWN0IHRpbWVzcGVjICp0cywgaW50IG1zKQoreworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworICAgIHRzLT50dl9uc2VjID0gdHYudHZfdXNlYyAqIDEwMDAgKyAobXMgJSAxMDAwKSAqIDEwMDAwMDA7CisgICAgdHMtPnR2X3NlYyA9IHR2LnR2X3NlYyArIG1zIC8gMTAwMDsKKyAgICBpZiAodHMtPnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgeworICAgICAgICB0cy0+dHZfc2VjKys7CisgICAgICAgIHRzLT50dl9uc2VjIC09IDEwMDAwMDAwMDA7CisgICAgfQorfQorCitpbnQgcWVtdV9zZW1fdGltZWR3YWl0KFFlbXVTZW1hcGhvcmUgKnNlbSwgaW50IG1zKQoreworICAgIGludCByYzsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorICAgIHJjID0gMDsKKyAgICBjb21wdXRlX2Fic19kZWFkbGluZSgmdHMsIG1zKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnNlbS0+bG9jayk7CisgICAgd2hpbGUgKHNlbS0+Y291bnQgPT0gMCkgeworICAgICAgICByYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnNlbS0+Y29uZCwgJnNlbS0+bG9jaywgJnRzKTsKKyAgICAgICAgaWYgKHJjID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgICAgIGVycm9yX2V4aXQocmMsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmMgIT0gRVRJTUVET1VUKSB7CisgICAgICAgIC0tc2VtLT5jb3VudDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNlbS0+bG9jayk7CisgICAgcmV0dXJuIChyYyA9PSBFVElNRURPVVQgPyAtMSA6IDApOworI2Vsc2UKKyAgICBpZiAobXMgPD0gMCkgeworICAgICAgICAvKiBUaGlzIGlzIGNoZWFwZXIgdGhhbiBzZW1fdGltZWR3YWl0LiAgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgcmMgPSBzZW1fdHJ5d2FpdCgmc2VtLT5zZW0pOworICAgICAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgIGlmIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbXB1dGVfYWJzX2RlYWRsaW5lKCZ0cywgbXMpOworICAgICAgICBkbyB7CisgICAgICAgICAgICByYyA9IHNlbV90aW1lZHdhaXQoJnNlbS0+c2VtLCAmdHMpOworICAgICAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgICAgIGlmIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFVElNRURPVVQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIGVycm9yX2V4aXQoZXJybm8sIF9fZnVuY19fKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKwordm9pZCBxZW11X3NlbV93YWl0KFFlbXVTZW1hcGhvcmUgKnNlbSkKK3sKKyAgICBpbnQgcmM7CisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc2VtLT5sb2NrKTsKKyAgICB3aGlsZSAoc2VtLT5jb3VudCA9PSAwKSB7CisgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3dhaXQoJnNlbS0+Y29uZCwgJnNlbS0+bG9jayk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBlcnJvcl9leGl0KHJjLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgLS1zZW0tPmNvdW50OworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzZW0tPmxvY2spOworI2Vsc2UKKyAgICBkbyB7CisgICAgICAgIHJjID0gc2VtX3dhaXQoJnNlbS0+c2VtKTsKKyAgICB9IHdoaWxlIChyYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBlcnJvcl9leGl0KGVycm5vLCBfX2Z1bmNfXyk7CisgICAgfQorI2VuZGlmCit9CisKKyNpZmRlZiBfX2xpbnV4X18KKyNkZWZpbmUgZnV0ZXgoLi4uKSAgICAgICAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCBfX1ZBX0FSR1NfXykKKworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X3dha2UoUWVtdUV2ZW50ICpldiwgaW50IG4pCit7CisgICAgZnV0ZXgoZXYsIEZVVEVYX1dBS0UsIG4sIE5VTEwsIE5VTEwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnV0ZXhfd2FpdChRZW11RXZlbnQgKmV2LCB1bnNpZ25lZCB2YWwpCit7CisgICAgZnV0ZXgoZXYsIEZVVEVYX1dBSVQsIChpbnQpIHZhbCwgTlVMTCwgTlVMTCwgMCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X3dha2UoUWVtdUV2ZW50ICpldiwgaW50IG4pCit7CisgICAgaWYgKG4gPT0gMSkgeworICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZldi0+Y29uZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmZXYtPmNvbmQpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ1dGV4X3dhaXQoUWVtdUV2ZW50ICpldiwgdW5zaWduZWQgdmFsKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZXYtPmxvY2spOworICAgIGlmIChldi0+dmFsdWUgPT0gdmFsKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZldi0+Y29uZCwgJmV2LT5sb2NrKTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmV2LT5sb2NrKTsKK30KKyNlbmRpZgorCisvKiBWYWxpZCB0cmFuc2l0aW9uczoKKyAqIC0gZnJlZS0+c2V0LCB3aGVuIHNldHRpbmcgdGhlIGV2ZW50CisgKiAtIGJ1c3ktPnNldCwgd2hlbiBzZXR0aW5nIHRoZSBldmVudCwgZm9sbG93ZWQgYnkgZnV0ZXhfd2FrZQorICogLSBzZXQtPmZyZWUsIHdoZW4gcmVzZXR0aW5nIHRoZSBldmVudAorICogLSBmcmVlLT5idXN5LCB3aGVuIHdhaXRpbmcKKyAqCisgKiBzZXQtPmJ1c3kgZG9lcyBub3QgaGFwcGVuIChpdCBjYW4gYmUgb2JzZXJ2ZWQgZnJvbSB0aGUgb3V0c2lkZSBidXQKKyAqIGl0IHJlYWxseSBpcyBzZXQtPmZyZWUtPmJ1c3kpLgorICoKKyAqIGJ1c3ktPmZyZWUgcHJvdmFibHkgY2Fubm90IGhhcHBlbjsgdG8gZW5mb3JjZSBpdCwgdGhlIHNldC0+ZnJlZSB0cmFuc2l0aW9uCisgKiBpcyBkb25lIHdpdGggYW4gT1IsIHdoaWNoIGJlY29tZXMgYSBuby1vcCBpZiB0aGUgZXZlbnQgaGFzIGNvbmN1cnJlbnRseQorICogdHJhbnNpdGlvbmVkIHRvIGZyZWUgb3IgYnVzeS4KKyAqLworCisjZGVmaW5lIEVWX1NFVCAgICAgICAgIDAKKyNkZWZpbmUgRVZfRlJFRSAgICAgICAgMQorI2RlZmluZSBFVl9CVVNZICAgICAgIC0xCisKK3ZvaWQgcWVtdV9ldmVudF9pbml0KFFlbXVFdmVudCAqZXYsIGJvb2wgaW5pdCkKK3sKKyNpZm5kZWYgX19saW51eF9fCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZldi0+bG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmV2LT5jb25kLCBOVUxMKTsKKyNlbmRpZgorCisgICAgZXYtPnZhbHVlID0gKGluaXQgPyBFVl9TRVQgOiBFVl9GUkVFKTsKK30KKwordm9pZCBxZW11X2V2ZW50X2Rlc3Ryb3koUWVtdUV2ZW50ICpldikKK3sKKyNpZm5kZWYgX19saW51eF9fCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZldi0+bG9jayk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmV2LT5jb25kKTsKKyNlbmRpZgorfQorCit2b2lkIHFlbXVfZXZlbnRfc2V0KFFlbXVFdmVudCAqZXYpCit7CisgICAgaWYgKGF0b21pY19tYl9yZWFkKCZldi0+dmFsdWUpICE9ICh1bnNpZ25lZCBpbnQpRVZfU0VUKSB7CisgICAgICAgIGlmIChhdG9taWNfeGNoZygmZXYtPnZhbHVlLCBFVl9TRVQpID09ICh1bnNpZ25lZCBpbnQpRVZfQlVTWSkgeworICAgICAgICAgICAgLyogVGhlcmUgd2VyZSB3YWl0ZXJzLCB3YWtlIHRoZW0gdXAuICAqLworICAgICAgICAgICAgZnV0ZXhfd2FrZShldiwgSU5UX01BWCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9ldmVudF9yZXNldChRZW11RXZlbnQgKmV2KQoreworICAgIGlmIChhdG9taWNfbWJfcmVhZCgmZXYtPnZhbHVlKSA9PSBFVl9TRVQpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhlcmUgd2FzIGEgY29uY3VycmVudCByZXNldCAob3IgZXZlbiByZXNldCt3YWl0KSwKKyAgICAgICAgICogZG8gbm90aGluZy4gIE90aGVyd2lzZSBjaGFuZ2UgRVZfU0VULT5FVl9GUkVFLgorICAgICAgICAgKi8KKyAgICAgICAgYXRvbWljX29yKCZldi0+dmFsdWUsIEVWX0ZSRUUpOworICAgIH0KK30KKwordm9pZCBxZW11X2V2ZW50X3dhaXQoUWVtdUV2ZW50ICpldikKK3sKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKworICAgIHZhbHVlID0gYXRvbWljX21iX3JlYWQoJmV2LT52YWx1ZSk7CisgICAgaWYgKHZhbHVlICE9IEVWX1NFVCkgeworICAgICAgICBpZiAodmFsdWUgPT0gRVZfRlJFRSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExlYXZlIHRoZSBldmVudCByZXNldCBhbmQgdGVsbCBxZW11X2V2ZW50X3NldCB0aGF0IHRoZXJlCisgICAgICAgICAgICAgKiBhcmUgd2FpdGVycy4gIE5vIG5lZWQgdG8gcmV0cnksIGJlY2F1c2UgdGhlcmUgY2Fubm90IGJlCisgICAgICAgICAgICAgKiBhIGNvbmN1cmVudCBidXN5LT5mcmVlIHRyYW5zaXRpb24uICBBZnRlciB0aGUgQ0FTLCB0aGUKKyAgICAgICAgICAgICAqIGV2ZW50IHdpbGwgYmUgZWl0aGVyIHNldCBvciBidXN5LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoYXRvbWljX2NtcHhjaGcoJmV2LT52YWx1ZSwgRVZfRlJFRSwgRVZfQlVTWSkgPT0gRVZfU0VUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZ1dGV4X3dhaXQoZXYsIEVWX0JVU1kpOworICAgIH0KK30KKworCit2b2lkIHFlbXVfdGhyZWFkX2NyZWF0ZShRZW11VGhyZWFkICp0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpzdGFydF9yb3V0aW5lKSh2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcsIGludCBtb2RlKQoreworICAgIHNpZ3NldF90IHNldCwgb2xkc2V0OworICAgIGludCBlcnI7CisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKworICAgIGVyciA9IHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIGVycm9yX2V4aXQoZXJyLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIGlmIChtb2RlID09IFFFTVVfVEhSRUFEX0RFVEFDSEVEKSB7CisgICAgICAgIGVyciA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBlcnJvcl9leGl0KGVyciwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTGVhdmUgc2lnbmFsIGhhbmRsaW5nIHRvIHRoZSBpb3RocmVhZC4gICovCisgICAgc2lnZmlsbHNldCgmc2V0KTsKKyAgICBwdGhyZWFkX3NpZ21hc2soU0lHX1NFVE1BU0ssICZzZXQsICZvbGRzZXQpOworICAgIGVyciA9IHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQtPnRocmVhZCwgJmF0dHIsIHN0YXJ0X3JvdXRpbmUsIGFyZyk7CisgICAgaWYgKGVycikKKyAgICAgICAgZXJyb3JfZXhpdChlcnIsIF9fZnVuY19fKTsKKworICAgIHB0aHJlYWRfc2lnbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisKKyAgICBwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cik7Cit9CisKK3ZvaWQgcWVtdV90aHJlYWRfZ2V0X3NlbGYoUWVtdVRocmVhZCAqdGhyZWFkKQoreworICAgIHRocmVhZC0+dGhyZWFkID0gcHRocmVhZF9zZWxmKCk7Cit9CisKK2Jvb2wgcWVtdV90aHJlYWRfaXNfc2VsZihRZW11VGhyZWFkICp0aHJlYWQpCit7CisgICByZXR1cm4gcHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgdGhyZWFkLT50aHJlYWQpOworfQorCit2b2lkIHFlbXVfdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsKQoreworICAgIHB0aHJlYWRfZXhpdChyZXR2YWwpOworfQorCit2b2lkICpxZW11X3RocmVhZF9qb2luKFFlbXVUaHJlYWQgKnRocmVhZCkKK3sKKyAgICBpbnQgZXJyOworICAgIHZvaWQgKnJldDsKKworICAgIGVyciA9IHB0aHJlYWRfam9pbih0aHJlYWQtPnRocmVhZCwgJnJldCk7CisgICAgaWYgKGVycikgeworICAgICAgICBlcnJvcl9leGl0KGVyciwgX19mdW5jX18pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtdGhyZWFkLXdpbjMyLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS10aHJlYWQtd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDQ3ODZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9xZW11MS91dGlsL3FlbXUtdGhyZWFkLXdpbjMyLmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBXaW4zMiBpbXBsZW1lbnRhdGlvbiBmb3IgbXV0ZXgvY29uZC90aHJlYWQgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IFJlZCBIYXQsIEluYy4gMjAxMAorICoKKyAqIEF1dGhvcjoKKyAqICBQYW9sbyBCb256aW5pIDxwYm9uemluaUByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwsIHZlcnNpb24gMiBvciBsYXRlci4KKyAqIFNlZSB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICoKKyAqLworI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCisjaW5jbHVkZSAicWVtdS90aHJlYWQuaCIKKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKworc3RhdGljIHZvaWQgZXJyb3JfZXhpdChpbnQgZXJyLCBjb25zdCBjaGFyICptc2cpCit7CisgICAgY2hhciAqcHN0cjsKKworICAgIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICBOVUxMLCBlcnIsIDAsIChMUFRTVFIpJnBzdHIsIDIsIE5VTEwpOworICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJXM6ICVzXG4iLCBtc2csIHBzdHIpOworICAgIGNyYXNoaGFuZGxlcl9kaWVfZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbnRlcm5hbCBlcnJvciBpbiAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgbXNnLCBwc3RyLCBlcnIpOworfQorCit2b2lkIHFlbXVfbXV0ZXhfaW5pdChRZW11TXV0ZXggKm11dGV4KQoreworICAgIG11dGV4LT5vd25lciA9IDA7CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbXV0ZXgtPmxvY2spOworfQorCit2b2lkIHFlbXVfbXV0ZXhfZGVzdHJveShRZW11TXV0ZXggKm11dGV4KQoreworICAgIGFzc2VydChtdXRleC0+b3duZXIgPT0gMCk7CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZtdXRleC0+bG9jayk7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF9sb2NrKFFlbXVNdXRleCAqbXV0ZXgpCit7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJm11dGV4LT5sb2NrKTsKKworICAgIC8qIFdpbjMyIENSSVRJQ0FMX1NFQ1RJT05zIGFyZSByZWN1cnNpdmUuICBBc3NlcnQgdGhhdCB3ZSdyZSBub3QKKyAgICAgKiB1c2luZyB0aGVtIGFzIHN1Y2guCisgICAgICovCisgICAgYXNzZXJ0KG11dGV4LT5vd25lciA9PSAwKTsKKyAgICBtdXRleC0+b3duZXIgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKK30KKworaW50IHFlbXVfbXV0ZXhfdHJ5bG9jayhRZW11TXV0ZXggKm11dGV4KQoreworICAgIGludCBvd25lZDsKKworICAgIG93bmVkID0gVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24oJm11dGV4LT5sb2NrKTsKKyAgICBpZiAob3duZWQpIHsKKyAgICAgICAgYXNzZXJ0KG11dGV4LT5vd25lciA9PSAwKTsKKyAgICAgICAgbXV0ZXgtPm93bmVyID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgfQorICAgIHJldHVybiAhb3duZWQ7Cit9CisKK3ZvaWQgcWVtdV9tdXRleF91bmxvY2soUWVtdU11dGV4ICptdXRleCkKK3sKKyAgICBhc3NlcnQobXV0ZXgtPm93bmVyID09IEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKKyAgICBtdXRleC0+b3duZXIgPSAwOworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtdXRleC0+bG9jayk7Cit9CisKK3ZvaWQgcWVtdV9jb25kX2luaXQoUWVtdUNvbmQgKmNvbmQpCit7CisgICAgbWVtc2V0KGNvbmQsIDAsIHNpemVvZigqY29uZCkpOworCisgICAgY29uZC0+c2VtYSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCBMT05HX01BWCwgTlVMTCk7CisgICAgaWYgKCFjb25kLT5zZW1hKSB7CisgICAgICAgIGVycm9yX2V4aXQoR2V0TGFzdEVycm9yKCksIF9fZnVuY19fKTsKKyAgICB9CisgICAgY29uZC0+Y29udGludWVfZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCAgICAvKiBzZWN1cml0eSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAgLyogYXV0by1yZXNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsICAgLyogbm90IHNpZ25hbGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAvKiBuYW1lICovCisgICAgaWYgKCFjb25kLT5jb250aW51ZV9ldmVudCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorfQorCit2b2lkIHFlbXVfY29uZF9kZXN0cm95KFFlbXVDb25kICpjb25kKQoreworICAgIEJPT0wgcmVzdWx0OworICAgIHJlc3VsdCA9IENsb3NlSGFuZGxlKGNvbmQtPmNvbnRpbnVlX2V2ZW50KTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIGNvbmQtPmNvbnRpbnVlX2V2ZW50ID0gMDsKKyAgICByZXN1bHQgPSBDbG9zZUhhbmRsZShjb25kLT5zZW1hKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIGNvbmQtPnNlbWEgPSAwOworfQorCit2b2lkIHFlbXVfY29uZF9zaWduYWwoUWVtdUNvbmQgKmNvbmQpCit7CisgICAgRFdPUkQgcmVzdWx0OworCisgICAgLyoKKyAgICAgKiBTaWduYWwgb25seSB3aGVuIHRoZXJlIGFyZSB3YWl0ZXJzLiAgY29uZC0+d2FpdGVycyBpcworICAgICAqIGluY3JlbWVudGVkIGJ5IHB0aHJlYWRfY29uZF93YWl0IHVuZGVyIHRoZSBleHRlcm5hbCBsb2NrLAorICAgICAqIHNvIHdlIGFyZSBzYWZlIGFib3V0IHRoYXQuCisgICAgICovCisgICAgaWYgKGNvbmQtPndhaXRlcnMgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBXYWl0aW5nIHRocmVhZHMgZGVjcmVtZW50IGl0IG91dHNpZGUgdGhlIGV4dGVybmFsIGxvY2ssIGJ1dAorICAgICAqIG9ubHkgaWYgYW5vdGhlciB0aHJlYWQgaXMgZXhlY3V0aW5nIHB0aHJlYWRfY29uZF9icm9hZGNhc3QgYW5kCisgICAgICogaGFzIHRoZSBtdXRleC4gIFNvLCBpdCBhbHNvIGNhbm5vdCBiZSBkZWNyZW1lbnRlZCBjb25jdXJyZW50bHkKKyAgICAgKiB3aXRoIHRoaXMgcGFydGljdWxhciBhY2Nlc3MuCisgICAgICovCisgICAgY29uZC0+dGFyZ2V0ID0gY29uZC0+d2FpdGVycyAtIDE7CisgICAgcmVzdWx0ID0gU2lnbmFsT2JqZWN0QW5kV2FpdChjb25kLT5zZW1hLCBjb25kLT5jb250aW51ZV9ldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORklOSVRFLCBGQUxTRSk7CisgICAgaWYgKHJlc3VsdCA9PSBXQUlUX0FCQU5ET05FRCB8fCByZXN1bHQgPT0gV0FJVF9GQUlMRUQpIHsKKyAgICAgICAgZXJyb3JfZXhpdChHZXRMYXN0RXJyb3IoKSwgX19mdW5jX18pOworICAgIH0KK30KKwordm9pZCBxZW11X2NvbmRfYnJvYWRjYXN0KFFlbXVDb25kICpjb25kKQoreworICAgIEJPT0xFQU4gcmVzdWx0OworICAgIC8qCisgICAgICogQXMgaW4gcHRocmVhZF9jb25kX3NpZ25hbCwgYWNjZXNzIHRvIGNvbmQtPndhaXRlcnMgYW5kCisgICAgICogY29uZC0+dGFyZ2V0IGlzIGxvY2tlZCB2aWEgdGhlIGV4dGVybmFsIG11dGV4LgorICAgICAqLworICAgIGlmIChjb25kLT53YWl0ZXJzID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbmQtPnRhcmdldCA9IDA7CisgICAgcmVzdWx0ID0gUmVsZWFzZVNlbWFwaG9yZShjb25kLT5zZW1hLCBjb25kLT53YWl0ZXJzLCBOVUxMKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBdCB0aGlzIHBvaW50IGFsbCB3YWl0ZXJzIGNvbnRpbnVlLiBFYWNoIG9uZSB0YWtlcyBpdHMKKyAgICAgKiBzbGljZSBvZiB0aGUgc2VtYXBob3JlLiBOb3cgaXQncyBvdXIgdHVybiB0byB3YWl0OiBTaW5jZQorICAgICAqIHRoZSBleHRlcm5hbCBtdXRleCBpcyBoZWxkLCBubyB0aHJlYWQgY2FuIGxlYXZlIGNvbmRfd2FpdCwKKyAgICAgKiB5ZXQuIEZvciB0aGlzIHJlYXNvbiwgd2UgY2FuIGJlIHN1cmUgdGhhdCBubyB0aHJlYWQgZ2V0cworICAgICAqIGEgY2hhbmNlIHRvIGVhdCAqbW9yZSogdGhhbiBvbmUgc2xpY2UuIE9UT0gsIGl0IG1lYW5zCisgICAgICogdGhhdCB0aGUgbGFzdCB3YWl0ZXIgbXVzdCBzZW5kIHVzIGEgd2FrZS11cC4KKyAgICAgKi8KKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmQtPmNvbnRpbnVlX2V2ZW50LCBJTkZJTklURSk7Cit9CisKK3ZvaWQgcWVtdV9jb25kX3dhaXQoUWVtdUNvbmQgKmNvbmQsIFFlbXVNdXRleCAqbXV0ZXgpCit7CisgICAgLyoKKyAgICAgKiBUaGlzIGFjY2VzcyBpcyBwcm90ZWN0ZWQgdW5kZXIgdGhlIG11dGV4LgorICAgICAqLworICAgIGNvbmQtPndhaXRlcnMrKzsKKworICAgIC8qCisgICAgICogVW5sb2NrIGV4dGVybmFsIG11dGV4IGFuZCB3YWl0IGZvciBzaWduYWwuCisgICAgICogTk9URTogd2UndmUgaGVsZCBtdXRleCBsb2NrZWQgbG9uZyBlbm91Z2ggdG8gaW5jcmVtZW50CisgICAgICogd2FpdGVycyBjb3VudCBhYm92ZSwgc28gdGhlcmUncyBubyBwcm9ibGVtIHdpdGgKKyAgICAgKiBsZWF2aW5nIG11dGV4IHVubG9ja2VkIGJlZm9yZSB3ZSB3YWl0IG9uIHNlbWFwaG9yZS4KKyAgICAgKi8KKyAgICBxZW11X211dGV4X3VubG9jayhtdXRleCk7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdChjb25kLT5zZW1hLCBJTkZJTklURSk7CisKKyAgICAvKiBOb3cgd2FpdGVycyBtdXN0IHJlbmRlei12b3VzIHdpdGggdGhlIHNpZ25hbGluZyB0aHJlYWQgYW5kCisgICAgICogbGV0IGl0IGNvbnRpbnVlLiAgRm9yIGNvbmRfYnJvYWRjYXN0IHRoaXMgaGFzIGhlYXZ5IGNvbnRlbnRpb24KKyAgICAgKiBhbmQgdHJpZ2dlcnMgdGh1bmRlcmluZyBoZXJkLiAgU28gZ29lcyBsaWZlLgorICAgICAqCisgICAgICogRGVjcmVhc2Ugd2FpdGVycyBjb3VudC4gIFRoZSBtdXRleCBpcyBub3QgdGFrZW4sIHNvIHdlIGhhdmUKKyAgICAgKiB0byBkbyB0aGlzIGF0b21pY2FsbHkuCisgICAgICoKKyAgICAgKiBBbGwgd2FpdGVycyBjb250ZW5kIGZvciB0aGUgbXV0ZXggYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uCisgICAgICogdW50aWwgdGhlIHNpZ25hbGluZyB0aHJlYWQgcmVsaW5xdWlzaGVzIGl0LiAgVG8gZW5zdXJlCisgICAgICogZWFjaCB3YWl0ZXIgY29uc3VtZXMgZXhhY3RseSBvbmUgc2xpY2Ugb2YgdGhlIHNlbWFwaG9yZSwKKyAgICAgKiB0aGUgc2lnbmFsaW5nIHRocmVhZCBzdG9wcyB1bnRpbCBpdCBpcyB0b2xkIGJ5IHRoZSBsYXN0CisgICAgICogd2FpdGVyIHRoYXQgaXQgY2FuIGdvIG9uLgorICAgICAqLworICAgIGlmIChJbnRlcmxvY2tlZERlY3JlbWVudCgmY29uZC0+d2FpdGVycykgPT0gY29uZC0+dGFyZ2V0KSB7CisgICAgICAgIFNldEV2ZW50KGNvbmQtPmNvbnRpbnVlX2V2ZW50KTsKKyAgICB9CisKKyAgICBxZW11X211dGV4X2xvY2sobXV0ZXgpOworfQorCit2b2lkIHFlbXVfc2VtX2luaXQoUWVtdVNlbWFwaG9yZSAqc2VtLCBpbnQgaW5pdCkKK3sKKyAgICAvKiBNYW51YWwgcmVzZXQuICAqLworICAgIHNlbS0+c2VtYSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCBpbml0LCBMT05HX01BWCwgTlVMTCk7Cit9CisKK3ZvaWQgcWVtdV9zZW1fZGVzdHJveShRZW11U2VtYXBob3JlICpzZW0pCit7CisgICAgQ2xvc2VIYW5kbGUoc2VtLT5zZW1hKTsKK30KKwordm9pZCBxZW11X3NlbV9wb3N0KFFlbXVTZW1hcGhvcmUgKnNlbSkKK3sKKyAgICBSZWxlYXNlU2VtYXBob3JlKHNlbS0+c2VtYSwgMSwgTlVMTCk7Cit9CisKK2ludCBxZW11X3NlbV90aW1lZHdhaXQoUWVtdVNlbWFwaG9yZSAqc2VtLCBpbnQgbXMpCit7CisgICAgaW50IHJjID0gV2FpdEZvclNpbmdsZU9iamVjdChzZW0tPnNlbWEsIG1zKTsKKyAgICBpZiAocmMgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHJjICE9IFdBSVRfVElNRU9VVCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKwordm9pZCBxZW11X3NlbV93YWl0KFFlbXVTZW1hcGhvcmUgKnNlbSkKK3sKKyAgICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChzZW0tPnNlbWEsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wKSB7CisgICAgICAgIGVycm9yX2V4aXQoR2V0TGFzdEVycm9yKCksIF9fZnVuY19fKTsKKyAgICB9Cit9CisKK3ZvaWQgcWVtdV9ldmVudF9pbml0KFFlbXVFdmVudCAqZXYsIGJvb2wgaW5pdCkKK3sKKyAgICAvKiBNYW51YWwgcmVzZXQuICAqLworICAgIGV2LT5ldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIGluaXQsIE5VTEwpOworfQorCit2b2lkIHFlbXVfZXZlbnRfZGVzdHJveShRZW11RXZlbnQgKmV2KQoreworICAgIENsb3NlSGFuZGxlKGV2LT5ldmVudCk7Cit9CisKK3ZvaWQgcWVtdV9ldmVudF9zZXQoUWVtdUV2ZW50ICpldikKK3sKKyAgICBTZXRFdmVudChldi0+ZXZlbnQpOworfQorCit2b2lkIHFlbXVfZXZlbnRfcmVzZXQoUWVtdUV2ZW50ICpldikKK3sKKyAgICBSZXNldEV2ZW50KGV2LT5ldmVudCk7Cit9CisKK3ZvaWQgcWVtdV9ldmVudF93YWl0KFFlbXVFdmVudCAqZXYpCit7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdChldi0+ZXZlbnQsIElORklOSVRFKTsKK30KKworc3RydWN0IFFlbXVUaHJlYWREYXRhIHsKKyAgICAvKiBQYXNzZWQgdG8gd2luMzJfc3RhcnRfcm91dGluZS4gICovCisgICAgdm9pZCAgICAgICAgICAgICAqKCpzdGFydF9yb3V0aW5lKSh2b2lkICopOworICAgIHZvaWQgICAgICAgICAgICAgKmFyZzsKKyAgICBzaG9ydCAgICAgICAgICAgICBtb2RlOworCisgICAgLyogT25seSB1c2VkIGZvciBqb2luYWJsZSB0aHJlYWRzLiAqLworICAgIGJvb2wgICAgICAgICAgICAgIGV4aXRlZDsKKyAgICB2b2lkICAgICAgICAgICAgICpyZXQ7CisgICAgQ1JJVElDQUxfU0VDVElPTiAgY3M7Cit9OworCitzdGF0aWMgX190aHJlYWQgUWVtdVRocmVhZERhdGEgKnFlbXVfdGhyZWFkX2RhdGE7CisKK3N0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgd2luMzJfc3RhcnRfcm91dGluZSh2b2lkICphcmcpCit7CisgICAgUWVtdVRocmVhZERhdGEgKmRhdGEgPSAoUWVtdVRocmVhZERhdGEgKikgYXJnOworICAgIHZvaWQgKigqc3RhcnRfcm91dGluZSkodm9pZCAqKSA9IGRhdGEtPnN0YXJ0X3JvdXRpbmU7CisgICAgdm9pZCAqdGhyZWFkX2FyZyA9IGRhdGEtPmFyZzsKKworICAgIGlmIChkYXRhLT5tb2RlID09IFFFTVVfVEhSRUFEX0RFVEFDSEVEKSB7CisgICAgICAgIGdfZnJlZShkYXRhKTsKKyAgICAgICAgZGF0YSA9IE5VTEw7CisgICAgfQorICAgIHFlbXVfdGhyZWFkX2RhdGEgPSBkYXRhOworICAgIHFlbXVfdGhyZWFkX2V4aXQoc3RhcnRfcm91dGluZSh0aHJlYWRfYXJnKSk7CisgICAgYWJvcnQoKTsKK30KKwordm9pZCBxZW11X3RocmVhZF9leGl0KHZvaWQgKmFyZykKK3sKKyAgICBRZW11VGhyZWFkRGF0YSAqZGF0YSA9IHFlbXVfdGhyZWFkX2RhdGE7CisKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBhc3NlcnQoZGF0YS0+bW9kZSAhPSBRRU1VX1RIUkVBRF9ERVRBQ0hFRCk7CisgICAgICAgIGRhdGEtPnJldCA9IGFyZzsKKyAgICAgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJmRhdGEtPmNzKTsKKyAgICAgICAgZGF0YS0+ZXhpdGVkID0gdHJ1ZTsKKyAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmRhdGEtPmNzKTsKKyAgICB9CisgICAgX2VuZHRocmVhZGV4KDApOworfQorCit2b2lkICpxZW11X3RocmVhZF9qb2luKFFlbXVUaHJlYWQgKnRocmVhZCkKK3sKKyAgICBRZW11VGhyZWFkRGF0YSAqZGF0YTsKKyAgICB2b2lkICpyZXQ7CisgICAgSEFORExFIGhhbmRsZTsKKworICAgIGRhdGEgPSB0aHJlYWQtPmRhdGE7CisgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKgorICAgICAqIEJlY2F1c2UgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBRZW11VGhyZWFkIGNhbiBleGlzdCB2aWEKKyAgICAgKiBxZW11X3RocmVhZF9nZXRfc2VsZiwgd2UgbmVlZCB0byBzdG9yZSBhIHZhbHVlIHRoYXQgY2Fubm90CisgICAgICogbGVhayB0aGVyZS4gIFRoZSBzaW1wbGVzdCwgbm9uIHJhY3kgd2F5IGlzIHRvIHN0b3JlIHRoZSBUSUQsCisgICAgICogZGlzY2FyZCB0aGUgaGFuZGxlIHRoYXQgX2JlZ2ludGhyZWFkZXggZ2l2ZXMgYmFjaywgYW5kCisgICAgICogZ2V0IGFub3RoZXIgY29weSBvZiB0aGUgaGFuZGxlIGhlcmUuCisgICAgICovCisgICAgaGFuZGxlID0gcWVtdV90aHJlYWRfZ2V0X2hhbmRsZSh0aHJlYWQpOworICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChoYW5kbGUsIElORklOSVRFKTsKKyAgICAgICAgQ2xvc2VIYW5kbGUoaGFuZGxlKTsKKyAgICB9CisgICAgcmV0ID0gZGF0YS0+cmV0OworICAgIGFzc2VydChkYXRhLT5tb2RlICE9IFFFTVVfVEhSRUFEX0RFVEFDSEVEKTsKKyAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oJmRhdGEtPmNzKTsKKyAgICBnX2ZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBxZW11X3RocmVhZF9jcmVhdGUoUWVtdVRocmVhZCAqdGhyZWFkLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywgaW50IG1vZGUpCit7CisgICAgSEFORExFIGhUaHJlYWQ7CisgICAgc3RydWN0IFFlbXVUaHJlYWREYXRhICpkYXRhOworCisgICAgZGF0YSA9IGdfbWFsbG9jKHNpemVvZiAqZGF0YSk7CisgICAgZGF0YS0+c3RhcnRfcm91dGluZSA9IHN0YXJ0X3JvdXRpbmU7CisgICAgZGF0YS0+YXJnID0gYXJnOworICAgIGRhdGEtPm1vZGUgPSBtb2RlOworICAgIGRhdGEtPmV4aXRlZCA9IGZhbHNlOworCisgICAgaWYgKGRhdGEtPm1vZGUgIT0gUUVNVV9USFJFQURfREVUQUNIRUQpIHsKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmZGF0YS0+Y3MpOworICAgIH0KKworICAgIGhUaHJlYWQgPSAoSEFORExFKSBfYmVnaW50aHJlYWRleChOVUxMLCAwLCB3aW4zMl9zdGFydF9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAwLCAmdGhyZWFkLT50aWQpOworICAgIGlmICghaFRocmVhZCkgeworICAgICAgICBlcnJvcl9leGl0KEdldExhc3RFcnJvcigpLCBfX2Z1bmNfXyk7CisgICAgfQorICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOworICAgIHRocmVhZC0+ZGF0YSA9IChtb2RlID09IFFFTVVfVEhSRUFEX0RFVEFDSEVEKSA/IE5VTEwgOiBkYXRhOworfQorCit2b2lkIHFlbXVfdGhyZWFkX2dldF9zZWxmKFFlbXVUaHJlYWQgKnRocmVhZCkKK3sKKyAgICB0aHJlYWQtPmRhdGEgPSBxZW11X3RocmVhZF9kYXRhOworICAgIHRocmVhZC0+dGlkID0gR2V0Q3VycmVudFRocmVhZElkKCk7Cit9CisKK0hBTkRMRSBxZW11X3RocmVhZF9nZXRfaGFuZGxlKFFlbXVUaHJlYWQgKnRocmVhZCkKK3sKKyAgICBRZW11VGhyZWFkRGF0YSAqZGF0YTsKKyAgICBIQU5ETEUgaGFuZGxlOworCisgICAgZGF0YSA9IHRocmVhZC0+ZGF0YTsKKyAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYXNzZXJ0KGRhdGEtPm1vZGUgIT0gUUVNVV9USFJFQURfREVUQUNIRUQpOworICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZkYXRhLT5jcyk7CisgICAgaWYgKCFkYXRhLT5leGl0ZWQpIHsKKyAgICAgICAgaGFuZGxlID0gT3BlblRocmVhZChTWU5DSFJPTklaRSB8IFRIUkVBRF9TVVNQRU5EX1JFU1VNRSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZkYXRhLT5jcyk7CisgICAgcmV0dXJuIGhhbmRsZTsKK30KKworYm9vbCBxZW11X3RocmVhZF9pc19zZWxmKFFlbXVUaHJlYWQgKnRocmVhZCkKK3sKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCkgPT0gdGhyZWFkLT50aWQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS10aW1lci1jb21tb24uYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC9xZW11LXRpbWVyLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjVlNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwvcWVtdS10aW1lci1jb21tb24uYwpAQCAtMCwwICsxLDYzIEBACisvKgorICogUUVNVSBTeXN0ZW0gRW11bGF0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHJlYWwgdGltZSBob3N0IG1vbm90b25pYyB0aW1lciAqLworCisjaWZkZWYgX1dJTjMyCisKK2ludDY0X3QgY2xvY2tfZnJlcTsKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBpbml0X2dldF9jbG9jayh2b2lkKQoreworICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICBpbnQgcmV0OworICAgIHJldCA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjYWxpYnJhdGUgdGlja3NcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBjbG9ja19mcmVxID0gZnJlcS5RdWFkUGFydDsKK30KKworI2Vsc2UKKworaW50IHVzZV9ydF9jbG9jazsKKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSBpbml0X2dldF9jbG9jayh2b2lkKQoreworICAgIHVzZV9ydF9jbG9jayA9IDA7CisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IChkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMDApIFwKKyAgICB8fCBkZWZpbmVkKF9fRHJhZ29uRmx5X18pIHx8IGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKSBcCisgICAgfHwgZGVmaW5lZChfX09wZW5CU0RfXykKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpID09IDApIHsKKyAgICAgICAgICAgIHVzZV9ydF9jbG9jayA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9xZW11MS91dGlsL3VuaWNvZGUuYyBiL2FuZHJvaWQvcWVtdTEvdXRpbC91bmljb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjODY1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvcWVtdTEvdXRpbC91bmljb2RlLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBEZWFsaW5nIHdpdGggVW5pY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuCisgKgorICogQXV0aG9yczoKKyAqICBNYXJrdXMgQXJtYnJ1c3RlciA8YXJtYnJ1QHJlZGhhdC5jb20+CisgKgorICogVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCwgdmVyc2lvbiAyIG9yCisgKiBsYXRlci4gIFNlZSB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorICovCisKKyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgorCisvKioKKyAqIG1vZF91dGY4X2NvZGVwb2ludDoKKyAqIEBzOiBzdHJpbmcgZW5jb2RlZCBpbiBtb2RpZmllZCBVVEYtOAorICogQG46IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBAcywgaWYgbGVzcyB0aGFuIDYKKyAqIEBlbmQ6IHNldCB0byBlbmQgb2Ygc2VxdWVuY2Ugb24gcmV0dXJuCisgKgorICogQ29udmVydCB0aGUgbW9kaWZpZWQgVVRGLTggc2VxdWVuY2UgYXQgdGhlIHN0YXJ0IG9mIEBzLiAgTW9kaWZpZWQKKyAqIFVURi04IGlzIGV4YWN0bHkgbGlrZSBVVEYtOCwgZXhjZXB0IFUrMDAwMCBpcyBlbmNvZGVkIGFzCisgKiAiXHhDMFx4ODAiLgorICoKKyAqIElmIEBuIGlzIHplcm8gb3IgQHMgcG9pbnRzIHRvIGEgemVybyBieXRlLCB0aGUgc2VxdWVuY2UgaXMgaW52YWxpZCwKKyAqIGFuZCBAZW5kIGlzIHNldCB0byBAcy4KKyAqCisgKiBJZiBAcyBwb2ludHMgdG8gYW4gaW1wb3NzaWJsZSBieXRlICgweEZFIG9yIDB4RkYpIG9yIGEgY29udGludWF0aW9uCisgKiBieXRlLCB0aGUgc2VxdWVuY2UgaXMgaW52YWxpZCwgYW5kIEBlbmQgaXMgc2V0IHRvIEBzICsgMQorICoKKyAqIEVsc2UsIHRoZSBmaXJzdCBieXRlIGRldGVybWluZXMgaG93IG1hbnkgY29udGludWF0aW9uIGJ5dGVzIGFyZQorICogZXhwZWN0ZWQuICBJZiB0aGVyZSBhcmUgZmV3ZXIsIHRoZSBzZXF1ZW5jZSBpcyBpbnZhbGlkLCBhbmQgQGVuZCBpcworICogc2V0IHRvIEBzICsgMSArIGFjdHVhbCBudW1iZXIgb2YgY29udGludWF0aW9uIGJ5dGVzLiAgRWxzZSwgdGhlCisgKiBzZXF1ZW5jZSBpcyB3ZWxsLWZvcm1lZCwgYW5kIEBlbmQgaXMgc2V0IHRvIEBzICsgMSArIGV4cGVjdGVkCisgKiBudW1iZXIgb2YgY29udGludWF0aW9uIGJ5dGVzLgorICoKKyAqIEEgd2VsbC1mb3JtZWQgc2VxdWVuY2UgaXMgdmFsaWQgdW5sZXNzIGl0IGVuY29kZXMgYSBjb2RlcG9pbnQKKyAqIG91dHNpZGUgdGhlIFVuaWNvZGUgcmFuZ2UgVSswMDAwLi5VKzEwRkZGRiwgb25lIG9mIFVuaWNvZGUncyA2NgorICogbm9uY2hhcmFjdGVycywgYSBzdXJyb2dhdGUgY29kZXBvaW50LCBvciBpcyBvdmVybG9uZy4gIEV4Y2VwdCB0aGUKKyAqIG92ZXJsb25nIHNlcXVlbmNlICJceEMwXHg4MCIgaXMgdmFsaWQuCisgKgorICogQ29udmVyc2lvbiBzdWNjZWVkcyBpZiBhbmQgb25seSBpZiB0aGUgc2VxdWVuY2UgaXMgdmFsaWQuCisgKgorICogUmV0dXJuczogdGhlIFVuaWNvZGUgY29kZXBvaW50IG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKi8KK2ludCBtb2RfdXRmOF9jb2RlcG9pbnQoY29uc3QgY2hhciAqcywgc2l6ZV90IG4sIGNoYXIgKiplbmQpCit7CisgICAgc3RhdGljIGludCBtaW5fY3BbNV0gPSB7IDB4ODAsIDB4ODAwLCAweDEwMDAwLCAweDIwMDAwMCwgMHg0MDAwMDAwIH07CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKyAgICB1bnNpZ25lZCBieXRlLCBtYXNrLCBsZW4sIGk7CisgICAgaW50IGNwOworCisgICAgaWYgKG4gPT0gMCB8fCAqcyA9PSAwKSB7CisgICAgICAgIC8qIGVtcHR5IHNlcXVlbmNlICovCisgICAgICAgICplbmQgPSAoY2hhciAqKXM7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzOworICAgIGJ5dGUgPSAqcCsrOworICAgIGlmIChieXRlIDwgMHg4MCkgeworICAgICAgICBjcCA9IGJ5dGU7ICAgICAgICAgICAgICAvKiBvbmUgYnl0ZSBzZXF1ZW5jZSAqLworICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSAweEZFKSB7CisgICAgICAgIGNwID0gLTE7ICAgICAgICAgICAgICAgIC8qIGltcG9zc2libGUgYnl0ZXMgMHhGRSwgMHhGRiAqLworICAgIH0gZWxzZSBpZiAoKGJ5dGUgJiAweDQwKSA9PSAwKSB7CisgICAgICAgIGNwID0gLTE7ICAgICAgICAgICAgICAgIC8qIHVuZXhwZWN0ZWQgY29udGludWF0aW9uIGJ5dGUgKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBtdWx0aS1ieXRlIHNlcXVlbmNlICovCisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIGZvciAobWFzayA9IDB4ODA7IGJ5dGUgJiBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICAgICAgICBsZW4rKzsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQobGVuID4gMSAmJiBsZW4gPCA3KTsKKyAgICAgICAgY3AgPSBieXRlICYgKG1hc2sgLSAxKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBieXRlID0gaSA8IG4gPyAqcCA6IDA7CisgICAgICAgICAgICBpZiAoKGJ5dGUgJiAweEMwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgY3AgPSAtMTsgICAgICAgIC8qIGNvbnRpbnVhdGlvbiBieXRlIG1pc3NpbmcgKi8KKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGNwIDw8PSA2OworICAgICAgICAgICAgY3AgfD0gYnl0ZSAmIDB4M0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNwID4gMHgxMEZGRkYpIHsKKyAgICAgICAgICAgIGNwID0gLTE7ICAgICAgICAgICAgLyogYmV5b25kIFVuaWNvZGUgcmFuZ2UgKi8KKyAgICAgICAgfSBlbHNlIGlmICgoY3AgPj0gMHhGREQwICYmIGNwIDw9IDB4RkRFRikKKyAgICAgICAgICAgICAgICAgICB8fCAoY3AgJiAweEZGRkUpID09IDB4RkZGRSkgeworICAgICAgICAgICAgY3AgPSAtMTsgICAgICAgICAgICAvKiBub25jaGFyYWN0ZXIgKi8KKyAgICAgICAgfSBlbHNlIGlmIChjcCA+PSAweEQ4MDAgJiYgY3AgPD0gMHhERkZGKSB7CisgICAgICAgICAgICBjcCA9IC0xOyAgICAgICAgICAgIC8qIHN1cnJvZ2F0ZSBjb2RlIHBvaW50ICovCisgICAgICAgIH0gZWxzZSBpZiAoY3AgPCBtaW5fY3BbbGVuIC0gMl0gJiYgIShjcCA9PSAwICYmIGxlbiA9PSAyKSkgeworICAgICAgICAgICAgY3AgPSAtMTsgICAgICAgICAgICAvKiBvdmVybG9uZywgbm90IFx4QzBceDgwICovCisgICAgICAgIH0KKyAgICB9CisKK291dDoKKyAgICAqZW5kID0gKGNoYXIgKilwOworICAgIHJldHVybiBjcDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvcWVtdTEvdXRpbC95aWVsZC1hbmRyb2lkLmMgYi9hbmRyb2lkL3FlbXUxL3V0aWwveWllbGQtYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NTNhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3V0aWwveWllbGQtYW5kcm9pZC5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKKy8vIFdhaXQgdW50aWwgZmlsZSBkZXNjcmlwdG9yIHxmZHwgYmVjb21lcyByZWFkYWJsZS4KK3ZvaWQgeWllbGRfdW50aWxfZmRfcmVhZGFibGUoaW50IGZkKSB7CisgICAgZm9yICg7OykgeworICAgICAgIGZkX3NldCByZWFkX2ZkczsKKyAgICAgICBGRF9aRVJPKCZyZWFkX2Zkcyk7CisgICAgICAgRkRfU0VUKGZkLCAmcmVhZF9mZHMpOworICAgICAgIGludCByZXQgPSBzZWxlY3QoZmQgKyAxLCAmcmVhZF9mZHMsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgIGlmIChyZXQgPT0gMSB8fCAocmV0IDwgMCAmJiBlcnJubyAhPSAtRUlOVFIpKQorICAgICAgICAgICByZXR1cm47CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3FlbXUxL3ZsLWFuZHJvaWQuYyBiL2FuZHJvaWQvcWVtdTEvdmwtYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWI3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3FlbXUxL3ZsLWFuZHJvaWQuYwpAQCAtMCwwICsxLDM2NTggQEAKKy8qCisgKiBRRU1VIFN5c3RlbSBFbXVsYXRvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA4IEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKiB0aGUgZm9sbG93aW5nIGlzIG5lZWRlZCBvbiBMaW51eCB0byBkZWZpbmUgcHRzbmFtZSgpIGluIHN0ZGxpYi5oICovCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisjZGVmaW5lIF9HTlVfU09VUkNFIDEKKyNlbmRpZgorCisjaW5jbHVkZSAicWVtdS1jb21tb24uaCIKKyNpbmNsdWRlICJody9ody5oIgorI2luY2x1ZGUgImh3L2JvYXJkcy5oIgorI2luY2x1ZGUgImh3L2kzODYvcGMuaCIKKyNpbmNsdWRlICJody9hdWRpb2Rldi5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJody9sb2FkZXIuaCIKKyNpbmNsdWRlICJody9hbmRyb2lkL2dvbGRmaXNoL25hbmQuaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAidWkvY29uc29sZS5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJleGVjL2dkYnN0dWIuaCIKKyNpbmNsdWRlICJleGVjL2NvZGUtcHJvZmlsZS5oIgorI2luY2x1ZGUgInFlbXUvbG9nLmgiCisjaW5jbHVkZSAicWVtdS90aW1lci5oIgorI2luY2x1ZGUgInN5c2VtdS9jaGFyLmgiCisjaW5jbHVkZSAic3lzZW11L2Jsb2NrZGV2LmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKworI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9xZW11LXNldHVwLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9hbmRyb2lkLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9jYW1lcmEvY2FtZXJhLXNlcnZpY2UuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NvbnNvbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2NyYXNocmVwb3J0L2NyYXNoLWhhbmRsZXIuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2VtdWxhdGlvbi9idWZwcmludF9jb25maWdfZGlycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZmlsZXN5c3RlbXMvcGFydGl0aW9uX2NvbmZpZy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvZ3BzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC1xZW11MS1nbHVlL2VtdWxhdGlvbi9zZXJpYWxfbGluZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctcWVtdWQuaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvYW5kcm9pZF9xZW11ZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvaHctc2Vuc29ycy5oIgorI2luY2x1ZGUgImFuZHJvaWQvbG9nLXJvdGF0ZS5oIgorI2luY2x1ZGUgImFuZHJvaWQtcWVtdTEtZ2x1ZS9sb29wZXItcWVtdS5oIgorI2luY2x1ZGUgImFuZHJvaWQvbWV0cmljcy9tZXRyaWNzLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9tdWx0aXRvdWNoLXBvcnQuaCIKKyNpbmNsdWRlICJhbmRyb2lkL211bHRpdG91Y2gtc2NyZWVuLmgiCisjaW5jbHVkZSAiYW5kcm9pZC9uZXR3b3JrL2NvbnRyb2wuaCIKKyNpbmNsdWRlICJhbmRyb2lkL25ldHdvcmsvZ2xvYmFscy5oIgorI2luY2x1ZGUgImFuZHJvaWQvb3BlbmdsZXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29wZW5nbC9lbXVnbF9jb25maWcuaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvcWVtdS1jb250cm9sLWltcGwuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3NraW4vY2hhcm1hcC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc25hcHNob3QuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RjcGR1bXAuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3VwZGF0ZS1jaGVjay91cGRhdGVfY2hlY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2J1ZnByaW50LmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9kZWJ1Zy5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvZmlsZWxvY2suaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL2luaS5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvaXBhZGRyLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9wYXRoLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy9zb2NrZXRfZHJhaW5lci5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvc3RyYWxsb2MuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3V0aWxzL3RlbXBmaWxlLmgiCisjaW5jbHVkZSAiYW5kcm9pZC91dGlscy90aW1lem9uZS5oIgorI2luY2x1ZGUgImFuZHJvaWQvd2Vhci1hZ2VudC9hbmRyb2lkX3dlYXJfYWdlbnQuaCIKKyNpbmNsdWRlICJleGVjL2h3YWRkci5oIgorI2luY2x1ZGUgIm1pZ3JhdGlvbi9xZW11LWZpbGUuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3RlbGVwaG9ueS9tb2RlbV9kcml2ZXIuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8emxpYi5oPgorCisvKiBOZWVkZWQgZWFybHkgZm9yIENPTkZJR19CU0QgZXRjLiAqLworI2luY2x1ZGUgImNvbmZpZy1ob3N0LmgiCisKKyNpZm5kZWYgX1dJTjMyCisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyNpbmNsdWRlIDxuZXQvaWZfdGFwLmg+CisjZW5kaWYKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2lmZGVmIENPTkZJR19CU0QKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykKKyNpbmNsdWRlIDxsaWJ1dGlsLmg+CisjZWxzZQorI2luY2x1ZGUgPHV0aWwuaD4KKyNlbmRpZgorI2VsaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBkZWZpbmVkIChfX0ZyZWVCU0Rfa2VybmVsX18pCisjaW5jbHVkZSA8ZnJlZWJzZC9zdGRsaWIuaD4KKyNlbHNlCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8cHR5Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKy8qIEZvciB0aGUgYmVuZWZpdCBvZiBvbGRlciBsaW51eCBzeXN0ZW1zIHdoaWNoIGRvbid0IHN1cHBseSBpdCwKKyAgIHdlIHVzZSBhIGxvY2FsIGNvcHkgb2YgaHBldC5oLiAqLworLyogI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4gKi8KKyNpbmNsdWRlICJody90aW1lci9ocGV0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9wcGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KKyNlbmRpZgorCisjaWZkZWYgX19zdW5fXworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2V0aGVybmV0Lmg+CisjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvYXJwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+IC8vIG11c3QgY29tZSBhZnRlciBpcC5oCisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN0cm9wdHMuaD4KKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pCisjaW5jbHVkZSA8dXRpbC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WREUpCisjaW5jbHVkZSA8bGlidmRlcGx1Zy5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KKyNkZWZpbmUgZ2V0b3B0X2xvbmdfb25seSBnZXRvcHRfbG9uZworI2RlZmluZSBtZW1hbGlnbihhbGlnbiwgc2l6ZSkgbWFsbG9jKHNpemUpCisjZW5kaWYKKworI2luY2x1ZGUgInN5c2VtdS9jcHVzLmgiCisjaW5jbHVkZSAic3lzZW11L2FyY2hfaW5pdC5oIgorCisjaWZkZWYgQ09ORklHX0NPQ09BCitpbnQgcWVtdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOworI3VuZGVmIG1haW4KKyNkZWZpbmUgbWFpbiBxZW11X21haW4KKyNlbmRpZiAvKiBDT05GSUdfQ09DT0EgKi8KKworI2luY2x1ZGUgImh3L2h3LmgiCisjaW5jbHVkZSAiaHcvYm9hcmRzLmgiCisjaW5jbHVkZSAiaHcvaTM4Ni9wYy5oIgorI2luY2x1ZGUgImh3L2lzYS9pc2EuaCIKKyNpbmNsdWRlICJzeXNlbXUvd2F0Y2hkb2cuaCIKKyNpbmNsdWRlICJody9pMzg2L3NtYmlvcy5oIgorI2luY2x1ZGUgImh3L3hlbi94ZW4uaCIKKyNpbmNsdWRlICJuZXQvbmV0LmgiCisjaW5jbHVkZSAibW9uaXRvci9tb25pdG9yLmgiCisjaW5jbHVkZSAidWkvY29uc29sZS5oIgorI2luY2x1ZGUgInN5c2VtdS9zeXNlbXUuaCIKKyNpbmNsdWRlICJleGVjL2dkYnN0dWIuaCIKKyNpbmNsdWRlICJxZW11L3RpbWVyLmgiCisjaW5jbHVkZSAic3lzZW11L2NoYXIuaCIKKyNpbmNsdWRlICJxZW11L2NhY2hlLXV0aWxzLmgiCisjaW5jbHVkZSAiYmxvY2svYmxvY2suaCIKKyNpbmNsdWRlICJzeXNlbXUvZG1hLmgiCisjaW5jbHVkZSAiYXVkaW8vYXVkaW8uaCIKKyNpbmNsdWRlICJtaWdyYXRpb24vbWlncmF0aW9uLmgiCisjaW5jbHVkZSAic3lzZW11L2t2bS5oIgorI2luY2x1ZGUgImV4ZWMvaGF4LmgiCisjaWZkZWYgQ09ORklHX0tWTQorI2luY2x1ZGUgImFuZHJvaWQva3ZtLmgiCisjZW5kaWYKKyNpbmNsdWRlICJzeXNlbXUvYmFsbG9vbi5oIgorCisjaW5jbHVkZSAiYW5kcm9pZC9ib290LXByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWNvbnRyb2wuaCIKKyNpbmNsdWRlICJhbmRyb2lkL2h3LWxjZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvc25hcGhvc3QtYW5kcm9pZC5oIgorI2luY2x1ZGUgImFuZHJvaWQvdXRpbHMvYXN5bmMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL3ZlcnNpb24uaCIKKyNpbmNsdWRlICJhbmRyb2lkLXFlbXUxLWdsdWUvYXVkaW8tdGVzdC5oIgorCisvKiBpbiBhbmRyb2lkL3FlbXVsYXRvci5jICovCitleHRlcm4gdm9pZCAgYW5kcm9pZF9lbXVsYXRvcl9zZXRfYmFzZV9wb3J0KGludCAgcG9ydCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TS0lOUykKKyN1bmRlZiBtYWluCisjZGVmaW5lIG1haW4gcWVtdV9tYWluCisjZW5kaWYKKworI2luY2x1ZGUgImRpc2FzL2Rpc2FzLmgiCisKKyNpbmNsdWRlICJxZW11L3NvY2tldHMuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX1NMSVJQKQorI2luY2x1ZGUgImxpYnNsaXJwLmgiCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX1JBTV9TSVpFIDEyOAorCisvKiBNYXggbnVtYmVyIG9mIFVTQiBkZXZpY2VzIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUuICAqLworI2RlZmluZSBNQVhfVVNCX0NNRExJTkUgOAorCisvKiBNYXggbnVtYmVyIG9mIGJsdWV0b290aCBzd2l0Y2hlcyBvbiB0aGUgY29tbWFuZGxpbmUuICAqLworI2RlZmluZSBNQVhfQlRfQ01ETElORSAxMAorCisvKiBYWFg6IHVzZSBhIHR3byBsZXZlbCB0YWJsZSB0byBsaW1pdCBtZW1vcnkgdXNhZ2UgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmRhdGFfZGlyOworY29uc3QgY2hhciAqYmlvc19uYW1lID0gTlVMTDsKK3N0YXRpYyB2b2lkICppb3BvcnRfb3BhcXVlW01BWF9JT1BPUlRTXTsKK3N0YXRpYyBJT1BvcnRSZWFkRnVuYyAqaW9wb3J0X3JlYWRfdGFibGVbM11bTUFYX0lPUE9SVFNdOworc3RhdGljIElPUG9ydFdyaXRlRnVuYyAqaW9wb3J0X3dyaXRlX3RhYmxlWzNdW01BWF9JT1BPUlRTXTsKKyNpZmRlZiBNQVhfRFJJVkVTCisvKiBOb3RlOiBkcml2ZXNfdGFibGVbTUFYX0RSSVZFU10gaXMgYSBkdW1teSBibG9jayBkcml2ZXIgaWYgbm9uZSBhdmFpbGFibGUKKyAgIHRvIHN0b3JlIHRoZSBWTSBzbmFwc2hvdHMgKi8KK0RyaXZlSW5mbyBkcml2ZXNfdGFibGVbTUFYX0RSSVZFUysxXTsKK2ludCBuYl9kcml2ZXM7CisjZW5kaWYKK2VudW0gdmdhX3JldHJhY2VfbWV0aG9kIHZnYV9yZXRyYWNlX21ldGhvZCA9IFZHQV9SRVRSQUNFX0RVTUI7CitEaXNwbGF5VHlwZSBkaXNwbGF5X3R5cGUgPSBEVF9ERUZBVUxUOworY29uc3QgY2hhcioga2V5Ym9hcmRfbGF5b3V0ID0gTlVMTDsKK2ludDY0X3QgdGlja3NfcGVyX3NlYzsKK3JhbV9hZGRyX3QgcmFtX3NpemU7Citib29sIHhlbl9hbGxvd2VkOworY29uc3QgY2hhciAqbWVtX3BhdGggPSBOVUxMOworI2lmZGVmIE1BUF9QT1BVTEFURQoraW50IG1lbV9wcmVhbGxvYyA9IDA7IC8qIGZvcmNlIHByZWFsbG9jYXRpb24gb2YgcGh5c2ljYWwgdGFyZ2V0IG1lbW9yeSAqLworI2VuZGlmCitpbnQgbmJfbmljczsKK05JQ0luZm8gbmRfdGFibGVbTUFYX05JQ1NdOworaW50IHZtX3J1bm5pbmc7CitpbnQgYXV0b3N0YXJ0Oworc3RhdGljIGludCBydGNfdXRjID0gMTsKK3N0YXRpYyBpbnQgcnRjX2RhdGVfb2Zmc2V0ID0gLTE7IC8qIC0xIG1lYW5zIG5vIGNoYW5nZSAqLworaW50IGNpcnJ1c192Z2FfZW5hYmxlZCA9IDE7CitpbnQgc3RkX3ZnYV9lbmFibGVkID0gMDsKK2ludCB2bXN2Z2FfZW5hYmxlZCA9IDA7CitpbnQgeGVuZmJfZW5hYmxlZCA9IDA7CitzdGF0aWMgaW50IGZ1bGxfc2NyZWVuID0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR19TREwpIHx8IGRlZmluZWQoQ09ORklHX1FUKQorc3RhdGljIGludCBub19mcmFtZSA9IDA7CisjZW5kaWYKK2ludCBub19xdWl0ID0gMDsKK0NoYXJEcml2ZXJTdGF0ZSAqc2VyaWFsX2hkc1tNQVhfU0VSSUFMX1BPUlRTXTsKK2ludCAgICAgICAgICAgICAgc2VyaWFsX2hkc19jb3VudDsKKworQ2hhckRyaXZlclN0YXRlICpwYXJhbGxlbF9oZHNbTUFYX1BBUkFMTEVMX1BPUlRTXTsKK0NoYXJEcml2ZXJTdGF0ZSAqdmlydGNvbl9oZHNbTUFYX1ZJUlRJT19DT05TT0xFU107CisjaWZkZWYgVEFSR0VUX0kzODYKK2ludCB3aW4ya19pbnN0YWxsX2hhY2sgPSAwOworaW50IHJ0Y190ZF9oYWNrID0gMDsKKyNlbmRpZgoraW50IHVzYl9lbmFibGVkID0gMDsKK2ludCBzaW5nbGVzdGVwID0gMDsKK2ludCBzbXBfY3B1cyA9IDE7Citjb25zdCBjaGFyICp2bmNfZGlzcGxheTsKK2ludCBhY3BpX2VuYWJsZWQgPSAxOworaW50IG5vX2hwZXQgPSAwOworaW50IGhheF9kaXNhYmxlZCA9IDE7CitpbnQgbm9fdmlydGlvX2JhbGxvb24gPSAwOworaW50IGZkX2Jvb3RjaGsgPSAxOworaW50IG5vX3JlYm9vdCA9IDA7CitpbnQgbm9fc2h1dGRvd24gPSAwOworaW50IGN1cnNvcl9oaWRlID0gMTsKK2ludCBncmFwaGljX3JvdGF0ZSA9IDA7CitXYXRjaGRvZ1RpbWVyTW9kZWwgKndhdGNoZG9nID0gTlVMTDsKK2ludCB3YXRjaGRvZ19hY3Rpb24gPSBXRFRfUkVTRVQ7Citjb25zdCBjaGFyICpvcHRpb25fcm9tW01BWF9PUFRJT05fUk9NU107CitpbnQgbmJfb3B0aW9uX3JvbXM7CitpbnQgc2VtaWhvc3RpbmdfZW5hYmxlZCA9IDA7CisjaWZkZWYgVEFSR0VUX0FSTQoraW50IG9sZF9wYXJhbSA9IDA7CisjZW5kaWYKK2NvbnN0IGNoYXIgKnFlbXVfbmFtZTsKK2ludCBhbHRfZ3JhYiA9IDA7CisjaWYgZGVmaW5lZChUQVJHRVRfU1BBUkMpIHx8IGRlZmluZWQoVEFSR0VUX1BQQykKK3Vuc2lnbmVkIGludCBuYl9wcm9tX2VudnMgPSAwOworY29uc3QgY2hhciAqcHJvbV9lbnZzW01BWF9QUk9NX0VOVlNdOworI2VuZGlmCisjaWZkZWYgTUFYX0RSSVZFUworaW50IG5iX2RyaXZlc19vcHQ7CitzdHJ1Y3QgZHJpdmVfb3B0IGRyaXZlc19vcHRbTUFYX0RSSVZFU107CisjZW5kaWYKK2ludCBuYl9udW1hX25vZGVzOwordWludDY0X3Qgbm9kZV9tZW1bTUFYX05PREVTXTsKK3VpbnQ2NF90IG5vZGVfY3B1bWFza1tNQVhfTk9ERVNdOworCitzdGF0aWMgUUVNVVRpbWVyICpub2dyYXBoaWNfdGltZXI7CisKK3VpbnQ4X3QgcWVtdV91dWlkWzE2XTsKKworCitpbnQgICBxZW11X2NwdV9kZWxheTsKK2V4dGVybiBjaGFyKiBhdWRpb19pbnB1dF9zb3VyY2U7CisKK2V4dGVybiBjaGFyKiBhbmRyb2lkX29wX3BvcnRzOworZXh0ZXJuIGNoYXIqIGFuZHJvaWRfb3BfcG9ydDsKK2V4dGVybiBjaGFyKiBhbmRyb2lkX29wX3JlcG9ydF9jb25zb2xlOworZXh0ZXJuIGNoYXIqIG9wX2h0dHBfcHJveHk7CisvLyBQYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgc3BlY2lmaWMga2V5IGNoYXJhY3RlciBtYXAuCitjaGFyKiBvcF9jaGFybWFwX2ZpbGUgPSBOVUxMOworCisvKiBQYXRoIHRvIGhhcmR3YXJlIGluaXRpYWxpemF0aW9uIGZpbGUgcGFzc2VkIHdpdGggLWFuZHJvaWQtaHcgb3B0aW9uLiAqLworY2hhciogYW5kcm9pZF9vcF9od2luaSA9IE5VTEw7CisKKy8qIC1kbnMtc2VydmVyIG9wdGlvbiB2YWx1ZS4gKi8KK2NoYXIqIGFuZHJvaWRfb3BfZG5zX3NlcnZlciA9IE5VTEw7CisKKy8qIC1yYWRpbyBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX3JhZGlvID0gTlVMTDsKKworLyogLWdwcyBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX2dwcyA9IE5VTEw7CisKKy8qIC1hdWRpbyBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX2F1ZGlvID0gTlVMTDsKKworLyogLWNwdS1kZWxheSBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX2NwdV9kZWxheSA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfTkFORF9MSU1JVFMKKy8qIC1uYW5kLWxpbWl0cyBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX25hbmRfbGltaXRzID0gTlVMTDsKKyNlbmRpZiAgLy8gQ09ORklHX05BTkRfTElNSVRTCisKKy8qIC10Y3BkdW1wIG9wdGlvbiB2YWx1ZS4gKi8KK2NoYXIqIGFuZHJvaWRfb3BfdGNwZHVtcCA9IE5VTEw7CisKKy8qIC1sY2QtZGVuc2l0eSBvcHRpb24gdmFsdWUuICovCitjaGFyKiBhbmRyb2lkX29wX2xjZF9kZW5zaXR5ID0gTlVMTDsKKworLyogLXVpLXNldHRpbmdzIG9wdGlvbiB2YWx1ZS4gVGhpcyB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgVUkgd2hlbiBuZXcgVUkKKyAqIHByb2Nlc3MgaXMgYXR0YWNoaW5nIHRvIHRoZSBjb3JlLgorICovCitjaGFyKiBhbmRyb2lkX29wX3VpX3NldHRpbmdzID0gTlVMTDsKKworLy8gVE9ETyhkaWdpdCk6IFJlbW92ZSB0aGlzCitleHRlcm4gYm9vbCBhbmRyb2lkX29wX3dpcGVfZGF0YTsKK2V4dGVybiBib29sIGFuZHJvaWRfb3Bfd3JpdGFibGVfc3lzdGVtOworCitleHRlcm4gaW50IGFuZHJvaWRfZGlzcGxheV93aWR0aDsKK2V4dGVybiBpbnQgYW5kcm9pZF9kaXNwbGF5X2hlaWdodDsKK2V4dGVybiBpbnQgYW5kcm9pZF9kaXNwbGF5X2JwcDsKKworZXh0ZXJuIHZvaWQgIGRwcmludCggY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKTsKKworc3RhdGljIHZvaWQgYW5kcm9pZF9jaGVja19mb3JfdXBkYXRlcygpOworCitjb25zdCBjaGFyKiBkbnNfbG9nX2ZpbGVuYW1lID0gTlVMTDsKK2NvbnN0IGNoYXIqIGRyb3BfbG9nX2ZpbGVuYW1lID0gTlVMTDsKKworCisjZGVmaW5lIFRGUihleHByKSBkbyB7IGlmICgoZXhwcikgIT0gLTEpIGJyZWFrOyB9IHdoaWxlIChlcnJubyA9PSBFSU5UUikKKworLyogUmVwb3J0cyB0aGUgY29yZSBpbml0aWFsaXphdGlvbiBmYWlsdXJlIHRvIHRoZSBlcnJvciBzdGRvdXQgYW5kIHRvIHRoZSBVSQorICogc29ja2V0IGJlZm9yZSBleGl0aW5nIHRoZSBhcHBsaWNhdGlvbi4KKyAqIFBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgbWFjcm8gYXJlIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvcgorICogbWVzYWdlIHVzaW5nIHNwcmludGYgcm91dGluZS4KKyAqLworI2RlZmluZSAgUEFOSUMoLi4uKSBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pOworCisvKiBFeGl0cyB0aGUgY29yZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICovCisjZGVmaW5lICBRRU1VX0VYSVQoZXhpdF9jb2RlKSByZXR1cm4gZXhpdF9jb2RlCisKKyNkZWZpbmUgUUVNVV9DT1JFX1ZFUlNJT04gInFlbXUxICIgUUVNVV9WRVJTSU9OCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHg4NiBJU0EgYnVzIHN1cHBvcnQgKi8KKworaHdhZGRyIGlzYV9tZW1fYmFzZSA9IDA7CitQaWNTdGF0ZTIgKmlzYV9waWM7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIElPUG9ydFJlYWRGdW5jIGRlZmF1bHRfaW9wb3J0X3JlYWRiLCBkZWZhdWx0X2lvcG9ydF9yZWFkdywgZGVmYXVsdF9pb3BvcnRfcmVhZGw7CitzdGF0aWMgSU9Qb3J0V3JpdGVGdW5jIGRlZmF1bHRfaW9wb3J0X3dyaXRlYiwgZGVmYXVsdF9pb3BvcnRfd3JpdGV3LCBkZWZhdWx0X2lvcG9ydF93cml0ZWw7CisKK3N0YXRpYyB1aW50MzJfdCBpb3BvcnRfcmVhZChpbnQgaW5kZXgsIHVpbnQzMl90IGFkZHJlc3MpCit7CisgICAgc3RhdGljIElPUG9ydFJlYWRGdW5jICpkZWZhdWx0X2Z1bmNbM10gPSB7CisgICAgICAgIGRlZmF1bHRfaW9wb3J0X3JlYWRiLAorICAgICAgICBkZWZhdWx0X2lvcG9ydF9yZWFkdywKKyAgICAgICAgZGVmYXVsdF9pb3BvcnRfcmVhZGwKKyAgICB9OworICAgIElPUG9ydFJlYWRGdW5jICpmdW5jID0gaW9wb3J0X3JlYWRfdGFibGVbaW5kZXhdW2FkZHJlc3NdOworICAgIGlmICghZnVuYykKKyAgICAgICAgZnVuYyA9IGRlZmF1bHRfZnVuY1tpbmRleF07CisgICAgcmV0dXJuIGZ1bmMoaW9wb3J0X29wYXF1ZVthZGRyZXNzXSwgYWRkcmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvcG9ydF93cml0ZShpbnQgaW5kZXgsIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IGRhdGEpCit7CisgICAgc3RhdGljIElPUG9ydFdyaXRlRnVuYyAqZGVmYXVsdF9mdW5jWzNdID0geworICAgICAgICBkZWZhdWx0X2lvcG9ydF93cml0ZWIsCisgICAgICAgIGRlZmF1bHRfaW9wb3J0X3dyaXRldywKKyAgICAgICAgZGVmYXVsdF9pb3BvcnRfd3JpdGVsCisgICAgfTsKKyAgICBJT1BvcnRXcml0ZUZ1bmMgKmZ1bmMgPSBpb3BvcnRfd3JpdGVfdGFibGVbaW5kZXhdW2FkZHJlc3NdOworICAgIGlmICghZnVuYykKKyAgICAgICAgZnVuYyA9IGRlZmF1bHRfZnVuY1tpbmRleF07CisgICAgZnVuYyhpb3BvcnRfb3BhcXVlW2FkZHJlc3NdLCBhZGRyZXNzLCBkYXRhKTsKK30KKworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfaW9wb3J0X3JlYWRiKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcykKK3sKKyNpZmRlZiBERUJVR19VTlVTRURfSU9QT1JUCisgICAgZnByaW50ZihzdGRlcnIsICJ1bnVzZWQgaW5iOiBwb3J0PTB4JTA0eFxuIiwgYWRkcmVzcyk7CisjZW5kaWYKKyAgICByZXR1cm4gMHhmZjsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9pb3BvcnRfd3JpdGViKHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSkKK3sKKyNpZmRlZiBERUJVR19VTlVTRURfSU9QT1JUCisgICAgZnByaW50ZihzdGRlcnIsICJ1bnVzZWQgb3V0YjogcG9ydD0weCUwNHggZGF0YT0weCUwMnhcbiIsIGFkZHJlc3MsIGRhdGEpOworI2VuZGlmCit9CisKKy8qIGRlZmF1bHQgaXMgdG8gbWFrZSB0d28gYnl0ZSBhY2Nlc3NlcyAqLworc3RhdGljIHVpbnQzMl90IGRlZmF1bHRfaW9wb3J0X3JlYWR3KHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcykKK3sKKyAgICB1aW50MzJfdCBkYXRhOworICAgIGRhdGEgPSBpb3BvcnRfcmVhZCgwLCBhZGRyZXNzKTsKKyAgICBhZGRyZXNzID0gKGFkZHJlc3MgKyAxKSAmIChNQVhfSU9QT1JUUyAtIDEpOworICAgIGRhdGEgfD0gaW9wb3J0X3JlYWQoMCwgYWRkcmVzcykgPDwgODsKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9pb3BvcnRfd3JpdGV3KHZvaWQgKm9wYXF1ZSwgdWludDMyX3QgYWRkcmVzcywgdWludDMyX3QgZGF0YSkKK3sKKyAgICBpb3BvcnRfd3JpdGUoMCwgYWRkcmVzcywgZGF0YSAmIDB4ZmYpOworICAgIGFkZHJlc3MgPSAoYWRkcmVzcyArIDEpICYgKE1BWF9JT1BPUlRTIC0gMSk7CisgICAgaW9wb3J0X3dyaXRlKDAsIGFkZHJlc3MsIChkYXRhID4+IDgpICYgMHhmZik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBkZWZhdWx0X2lvcG9ydF9yZWFkbCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHJlc3MpCit7CisjaWZkZWYgREVCVUdfVU5VU0VEX0lPUE9SVAorICAgIGZwcmludGYoc3RkZXJyLCAidW51c2VkIGlubDogcG9ydD0weCUwNHhcbiIsIGFkZHJlc3MpOworI2VuZGlmCisgICAgcmV0dXJuIDB4ZmZmZmZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfaW9wb3J0X3dyaXRlbCh2b2lkICpvcGFxdWUsIHVpbnQzMl90IGFkZHJlc3MsIHVpbnQzMl90IGRhdGEpCit7CisjaWZkZWYgREVCVUdfVU5VU0VEX0lPUE9SVAorICAgIGZwcmludGYoc3RkZXJyLCAidW51c2VkIG91dGw6IHBvcnQ9MHglMDR4IGRhdGE9MHglMDJ4XG4iLCBhZGRyZXNzLCBkYXRhKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqLworLyogYmFsbG9vbmluZyAqLworCitzdGF0aWMgUUVNVUJhbGxvb25FdmVudCAqcWVtdV9iYWxsb29uX2V2ZW50Owordm9pZCAqcWVtdV9iYWxsb29uX2V2ZW50X29wYXF1ZTsKKwordm9pZCBxZW11X2FkZF9iYWxsb29uX2hhbmRsZXIoUUVNVUJhbGxvb25FdmVudCAqZnVuYywgdm9pZCAqb3BhcXVlKQoreworICAgIHFlbXVfYmFsbG9vbl9ldmVudCA9IGZ1bmM7CisgICAgcWVtdV9iYWxsb29uX2V2ZW50X29wYXF1ZSA9IG9wYXF1ZTsKK30KKwordm9pZCBxZW11X2JhbGxvb24ocmFtX2FkZHJfdCB0YXJnZXQpCit7CisgICAgaWYgKHFlbXVfYmFsbG9vbl9ldmVudCkKKyAgICAgICAgcWVtdV9iYWxsb29uX2V2ZW50KHFlbXVfYmFsbG9vbl9ldmVudF9vcGFxdWUsIHRhcmdldCk7Cit9CisKK3JhbV9hZGRyX3QgcWVtdV9iYWxsb29uX3N0YXR1cyh2b2lkKQoreworICAgIGlmIChxZW11X2JhbGxvb25fZXZlbnQpCisgICAgICAgIHJldHVybiBxZW11X2JhbGxvb25fZXZlbnQocWVtdV9iYWxsb29uX2V2ZW50X29wYXF1ZSwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGhvc3QgdGltZS9kYXRlIGFjY2VzcyAqLwordm9pZCBxZW11X2dldF90aW1lZGF0ZShzdHJ1Y3QgdG0gKnRtLCBpbnQgb2Zmc2V0KQoreworICAgIHRpbWVfdCB0aTsKKyAgICBzdHJ1Y3QgdG0gKnJldDsKKworICAgIHRpbWUoJnRpKTsKKyAgICB0aSArPSBvZmZzZXQ7CisgICAgaWYgKHJ0Y19kYXRlX29mZnNldCA9PSAtMSkgeworICAgICAgICBpZiAocnRjX3V0YykKKyAgICAgICAgICAgIHJldCA9IGdtdGltZSgmdGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSBsb2NhbHRpbWUoJnRpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aSAtPSBydGNfZGF0ZV9vZmZzZXQ7CisgICAgICAgIHJldCA9IGdtdGltZSgmdGkpOworICAgIH0KKworICAgIG1lbWNweSh0bSwgcmV0LCBzaXplb2Yoc3RydWN0IHRtKSk7Cit9CisKK2ludCBxZW11X3RpbWVkYXRlX2RpZmYoc3RydWN0IHRtICp0bSkKK3sKKyAgICB0aW1lX3Qgc2Vjb25kczsKKworICAgIGlmIChydGNfZGF0ZV9vZmZzZXQgPT0gLTEpCisgICAgICAgIGlmIChydGNfdXRjKQorICAgICAgICAgICAgc2Vjb25kcyA9IG1rdGltZWdtKHRtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2Vjb25kcyA9IG1rdGltZSh0bSk7CisgICAgZWxzZQorICAgICAgICBzZWNvbmRzID0gbWt0aW1lZ20odG0pICsgcnRjX2RhdGVfb2Zmc2V0OworCisgICAgcmV0dXJuIHNlY29uZHMgLSB0aW1lKE5VTEwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBRRU1VIEJsb2NrIGRldmljZXMgKi8KKworI2RlZmluZSBIRF9BTElBUyAiaW5kZXg9JWQsbWVkaWE9ZGlzayIKKyNkZWZpbmUgQ0RST01fQUxJQVMgImluZGV4PTIsbWVkaWE9Y2Ryb20iCisjZGVmaW5lIEZEX0FMSUFTICJpbmRleD0lZCxpZj1mbG9wcHkiCisjZGVmaW5lIFBGTEFTSF9BTElBUyAiaWY9cGZsYXNoIgorI2RlZmluZSBNVERfQUxJQVMgImlmPW10ZCIKKyNkZWZpbmUgU0RfQUxJQVMgImluZGV4PTAsaWY9c2QiCisKK3N0YXRpYyBpbnQgZHJpdmVfaW5pdF9mdW5jKFFlbXVPcHRzICpvcHRzLCB2b2lkICpvcGFxdWUpCit7CisgICAgaW50ICp1c2Vfc2NzaSA9IG9wYXF1ZTsKKyAgICBpbnQgZmF0YWxfZXJyb3IgPSAwOworCisgICAgaWYgKGRyaXZlX2luaXQob3B0cywgKnVzZV9zY3NpLCAmZmF0YWxfZXJyb3IpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGZhdGFsX2Vycm9yKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyaXZlX2VuYWJsZV9zbmFwc2hvdChRZW11T3B0cyAqb3B0cywgdm9pZCAqb3BhcXVlKQoreworICAgIGlmIChOVUxMID09IHFlbXVfb3B0X2dldChvcHRzLCAic25hcHNob3QiKSkgeworICAgICAgICBxZW11X29wdF9zZXQob3B0cywgInNuYXBzaG90IiwgIm9uIik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWZkZWYgTUFYX0RSSVZFUworc3RhdGljIGludCBkcml2ZV9vcHRfZ2V0X2ZyZWVfaWR4KHZvaWQpCit7CisgICAgaW50IGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX0RSSVZFUzsgaW5kZXgrKykKKyAgICAgICAgaWYgKCFkcml2ZXNfb3B0W2luZGV4XS51c2VkKSB7CisgICAgICAgICAgICBkcml2ZXNfb3B0W2luZGV4XS51c2VkID0gMTsKKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRyaXZlX2dldF9mcmVlX2lkeCh2b2lkKQoreworICAgIGludCBpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWF9EUklWRVM7IGluZGV4KyspCisgICAgICAgIGlmICghZHJpdmVzX3RhYmxlW2luZGV4XS51c2VkKSB7CisgICAgICAgICAgICBkcml2ZXNfdGFibGVbaW5kZXhdLnVzZWQgPSAxOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBkcml2ZV9hZGQoY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICBpbnQgaW5kZXggPSBkcml2ZV9vcHRfZ2V0X2ZyZWVfaWR4KCk7CisKKyAgICBpZiAobmJfZHJpdmVzX29wdCA+PSBNQVhfRFJJVkVTIHx8IGluZGV4ID09IC0xKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogdG9vIG1hbnkgZHJpdmVzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGRyaXZlc19vcHRbaW5kZXhdLmZpbGUgPSBmaWxlOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZzbnByaW50Zihkcml2ZXNfb3B0W2luZGV4XS5vcHQsCisgICAgICAgICAgICAgIHNpemVvZihkcml2ZXNfb3B0WzBdLm9wdCksIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICBuYl9kcml2ZXNfb3B0Kys7CisgICAgcmV0dXJuIGluZGV4OworfQorCit2b2lkIGRyaXZlX3JlbW92ZShpbnQgaW5kZXgpCit7CisgICAgZHJpdmVzX29wdFtpbmRleF0udXNlZCA9IDA7CisgICAgbmJfZHJpdmVzX29wdC0tOworfQorCitpbnQgZHJpdmVfZ2V0X2luZGV4KEJsb2NrSW50ZXJmYWNlVHlwZSB0eXBlLCBpbnQgYnVzLCBpbnQgdW5pdCkKK3sKKyAgICBpbnQgaW5kZXg7CisKKyAgICAvKiBzZWVrIGludGVyZmFjZSwgYnVzIGFuZCB1bml0ICovCisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhfRFJJVkVTOyBpbmRleCsrKQorICAgICAgICBpZiAoZHJpdmVzX3RhYmxlW2luZGV4XS50eXBlID09IHR5cGUgJiYKKwkgICAgZHJpdmVzX3RhYmxlW2luZGV4XS5idXMgPT0gYnVzICYmCisJICAgIGRyaXZlc190YWJsZVtpbmRleF0udW5pdCA9PSB1bml0ICYmCisJICAgIGRyaXZlc190YWJsZVtpbmRleF0udXNlZCkKKyAgICAgICAgcmV0dXJuIGluZGV4OworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgZHJpdmVfZ2V0X21heF9idXMoQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGUpCit7CisgICAgaW50IG1heF9idXM7CisgICAgaW50IGluZGV4OworCisgICAgbWF4X2J1cyA9IC0xOworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iX2RyaXZlczsgaW5kZXgrKykgeworICAgICAgICBpZihkcml2ZXNfdGFibGVbaW5kZXhdLnR5cGUgPT0gdHlwZSAmJgorICAgICAgICAgICBkcml2ZXNfdGFibGVbaW5kZXhdLmJ1cyA+IG1heF9idXMpCisgICAgICAgICAgICBtYXhfYnVzID0gZHJpdmVzX3RhYmxlW2luZGV4XS5idXM7CisgICAgfQorICAgIHJldHVybiBtYXhfYnVzOworfQorCitjb25zdCBjaGFyICpkcml2ZV9nZXRfc2VyaWFsKEJsb2NrRHJpdmVyU3RhdGUgKmJkcnYpCit7CisgICAgaW50IGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmJfZHJpdmVzOyBpbmRleCsrKQorICAgICAgICBpZiAoZHJpdmVzX3RhYmxlW2luZGV4XS5iZHJ2ID09IGJkcnYpCisgICAgICAgICAgICByZXR1cm4gZHJpdmVzX3RhYmxlW2luZGV4XS5zZXJpYWw7CisKKyAgICByZXR1cm4gIlwwIjsKK30KKworQmxvY2tJbnRlcmZhY2VFcnJvckFjdGlvbiBkcml2ZV9nZXRfb25lcnJvcihCbG9ja0RyaXZlclN0YXRlICpiZHJ2KQoreworICAgIGludCBpbmRleDsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5iX2RyaXZlczsgaW5kZXgrKykKKyAgICAgICAgaWYgKGRyaXZlc190YWJsZVtpbmRleF0uYmRydiA9PSBiZHJ2KQorICAgICAgICAgICAgcmV0dXJuIGRyaXZlc190YWJsZVtpbmRleF0ub25lcnJvcjsKKworICAgIHJldHVybiBCTE9DS19FUlJfU1RPUF9FTk9TUEM7Cit9CisKK3N0YXRpYyB2b2lkIGJkcnZfZm9ybWF0X3ByaW50KHZvaWQgKm9wYXF1ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAlcyIsIG5hbWUpOworfQorCit2b2lkIGRyaXZlX3VuaW5pdChCbG9ja0RyaXZlclN0YXRlICpiZHJ2KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9EUklWRVM7IGkrKykKKyAgICAgICAgaWYgKGRyaXZlc190YWJsZVtpXS5iZHJ2ID09IGJkcnYpIHsKKyAgICAgICAgICAgIGRyaXZlc190YWJsZVtpXS5iZHJ2ID0gTlVMTDsKKyAgICAgICAgICAgIGRyaXZlc190YWJsZVtpXS51c2VkID0gMDsKKyAgICAgICAgICAgIGRyaXZlX3JlbW92ZShkcml2ZXNfdGFibGVbaV0uZHJpdmVfb3B0X2lkeCk7CisgICAgICAgICAgICBuYl9kcml2ZXMtLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cit9CisKK2ludCBkcml2ZV9pbml0KHN0cnVjdCBkcml2ZV9vcHQgKmFyZywgaW50IHNuYXBzaG90LCB2b2lkICpvcGFxdWUpCit7CisgICAgY2hhciBidWZbMTI4XTsKKyAgICBjaGFyIGZpbGVbMTAyNF07CisgICAgY2hhciBkZXZuYW1lWzEyOF07CisgICAgY2hhciBzZXJpYWxbMjFdOworICAgIGNvbnN0IGNoYXIgKm1lZGlhc3RyID0gIiI7CisgICAgQmxvY2tJbnRlcmZhY2VUeXBlIHR5cGU7CisgICAgZW51bSB7IE1FRElBX0RJU0ssIE1FRElBX0NEUk9NIH0gbWVkaWE7CisgICAgaW50IGJ1c19pZCwgdW5pdF9pZDsKKyAgICBpbnQgY3lscywgaGVhZHMsIHNlY3MsIHRyYW5zbGF0aW9uOworICAgIEJsb2NrRHJpdmVyU3RhdGUgKmJkcnY7CisgICAgQmxvY2tEcml2ZXIgKmRydiA9IE5VTEw7CisgICAgUUVNVU1hY2hpbmUgKm1hY2hpbmUgPSBvcGFxdWU7CisgICAgaW50IG1heF9kZXZzOworICAgIGludCBpbmRleDsKKyAgICBpbnQgY2FjaGU7CisgICAgaW50IGJkcnZfZmxhZ3MsIG9uZXJyb3I7CisgICAgaW50IGRyaXZlc190YWJsZV9pZHg7CisgICAgY2hhciAqc3RyID0gYXJnLT5vcHQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwYXJhbXNbXSA9IHsgImJ1cyIsICJ1bml0IiwgImlmIiwgImluZGV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3lscyIsICJoZWFkcyIsICJzZWNzIiwgInRyYW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEiLCAic25hcHNob3QiLCAiZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhY2hlIiwgImZvcm1hdCIsICJzZXJpYWwiLCAid2Vycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH07CisKKyAgICBpZiAoY2hlY2tfcGFyYW1zKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHBhcmFtcywgc3RyKSA8IDApIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogdW5rbm93biBwYXJhbWV0ZXIgJyVzJyBpbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Ziwgc3RyKTsKKyAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmaWxlWzBdID0gMDsKKyAgICBjeWxzID0gaGVhZHMgPSBzZWNzID0gMDsKKyAgICBidXNfaWQgPSAwOworICAgIHVuaXRfaWQgPSAtMTsKKyAgICB0cmFuc2xhdGlvbiA9IEJJT1NfQVRBX1RSQU5TTEFUSU9OX0FVVE87CisgICAgaW5kZXggPSAtMTsKKyAgICBjYWNoZSA9IDM7CisKKyAgICBpZiAobWFjaGluZS0+dXNlX3Njc2kpIHsKKyAgICAgICAgdHlwZSA9IElGX1NDU0k7CisgICAgICAgIG1heF9kZXZzID0gTUFYX1NDU0lfREVWUzsKKyAgICAgICAgcHN0cmNweShkZXZuYW1lLCBzaXplb2YoZGV2bmFtZSksICJzY3NpIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9IElGX0lERTsKKyAgICAgICAgbWF4X2RldnMgPSBNQVhfSURFX0RFVlM7CisgICAgICAgIHBzdHJjcHkoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCAiaWRlIik7CisgICAgfQorICAgIG1lZGlhID0gTUVESUFfRElTSzsKKworICAgIC8qIGV4dHJhY3QgcGFyYW1ldGVycyAqLworCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiYnVzIiwgc3RyKSkgeworICAgICAgICBidXNfaWQgPSBzdHJ0b2woYnVmLCBOVUxMLCAwKTsKKwlpZiAoYnVzX2lkIDwgMCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgaW52YWxpZCBidXMgaWRcbiIsIHN0cik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAidW5pdCIsIHN0cikpIHsKKyAgICAgICAgdW5pdF9pZCA9IHN0cnRvbChidWYsIE5VTEwsIDApOworCWlmICh1bml0X2lkIDwgMCkgeworCSAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgaW52YWxpZCB1bml0IGlkXG4iLCBzdHIpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImlmIiwgc3RyKSkgeworICAgICAgICBwc3RyY3B5KGRldm5hbWUsIHNpemVvZihkZXZuYW1lKSwgYnVmKTsKKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAiaWRlIikpIHsKKwkgICAgdHlwZSA9IElGX0lERTsKKyAgICAgICAgICAgIG1heF9kZXZzID0gTUFYX0lERV9ERVZTOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAic2NzaSIpKSB7CisJICAgIHR5cGUgPSBJRl9TQ1NJOworICAgICAgICAgICAgbWF4X2RldnMgPSBNQVhfU0NTSV9ERVZTOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiZmxvcHB5IikpIHsKKwkgICAgdHlwZSA9IElGX0ZMT1BQWTsKKyAgICAgICAgICAgIG1heF9kZXZzID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInBmbGFzaCIpKSB7CisJICAgIHR5cGUgPSBJRl9QRkxBU0g7CisgICAgICAgICAgICBtYXhfZGV2cyA9IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgIm10ZCIpKSB7CisJICAgIHR5cGUgPSBJRl9NVEQ7CisgICAgICAgICAgICBtYXhfZGV2cyA9IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInNkIikpIHsKKwkgICAgdHlwZSA9IElGX1NEOworICAgICAgICAgICAgbWF4X2RldnMgPSAwOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAidmlydGlvIikpIHsKKyAgICAgICAgICAgIHR5cGUgPSBJRl9WSVJUSU87CisgICAgICAgICAgICBtYXhfZGV2cyA9IDA7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInhlbiIpKSB7CisJICAgIHR5cGUgPSBJRl9YRU47CisgICAgICAgICAgICBtYXhfZGV2cyA9IDA7CisJfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyB1bnN1cHBvcnRlZCBidXMgdHlwZSAnJXMnXG4iLCBzdHIsIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImluZGV4Iiwgc3RyKSkgeworICAgICAgICBpbmRleCA9IHN0cnRvbChidWYsIE5VTEwsIDApOworCWlmIChpbmRleCA8IDApIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgaW5kZXhcbiIsIHN0cik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAiY3lscyIsIHN0cikpIHsKKyAgICAgICAgY3lscyA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImhlYWRzIiwgc3RyKSkgeworICAgICAgICBoZWFkcyA9IHN0cnRvbChidWYsIE5VTEwsIDApOworICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgInNlY3MiLCBzdHIpKSB7CisgICAgICAgIHNlY3MgPSBzdHJ0b2woYnVmLCBOVUxMLCAwKTsKKyAgICB9CisKKyAgICBpZiAoY3lscyB8fCBoZWFkcyB8fCBzZWNzKSB7CisgICAgICAgIGlmIChjeWxzIDwgMSB8fCBjeWxzID4gMTYzODMpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIHBoeXNpY2FsIGN5bHMgbnVtYmVyXG4iLCBzdHIpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgICAgICBpZiAoaGVhZHMgPCAxIHx8IGhlYWRzID4gMTYpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIHBoeXNpY2FsIGhlYWRzIG51bWJlclxuIiwgc3RyKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICAgICAgaWYgKHNlY3MgPCAxIHx8IHNlY3MgPiA2MykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgcGh5c2ljYWwgc2VjcyBudW1iZXJcbiIsIHN0cik7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgaWYgKGdldF9wYXJhbV92YWx1ZShidWYsIHNpemVvZihidWYpLCAidHJhbnMiLCBzdHIpKSB7CisgICAgICAgIGlmICghY3lscykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJxZW11OiAnJXMnIHRyYW5zIG11c3QgYmUgdXNlZCB3aXRoIGN5bHMsaGVhZHMgYW5kIHNlY3NcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0cik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAibm9uZSIpKQorICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9OT05FOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImxiYSIpKQorICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9MQkE7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiYXV0byIpKQorICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9BVVRPOworCWVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgdHJhbnNsYXRpb24gdHlwZVxuIiwgc3RyKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJtZWRpYSIsIHN0cikpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAiZGlzayIpKSB7CisJICAgIG1lZGlhID0gTUVESUFfRElTSzsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiY2Ryb20iKSkgeworICAgICAgICAgICAgaWYgKGN5bHMgfHwgc2VjcyB8fCBoZWFkcykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgInFlbXU6ICclcycgaW52YWxpZCBwaHlzaWNhbCBDSFMgZm9ybWF0XG4iLCBzdHIpOworCSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCSAgICBtZWRpYSA9IE1FRElBX0NEUk9NOworCX0gZWxzZSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIG1lZGlhXG4iLCBzdHIpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgInNuYXBzaG90Iiwgc3RyKSkgeworICAgICAgICBpZiAoIXN0cmNtcChidWYsICJvbiIpKQorCSAgICBzbmFwc2hvdCA9IDE7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAib2ZmIikpCisJICAgIHNuYXBzaG90ID0gMDsKKwllbHNlIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgc25hcHNob3Qgb3B0aW9uXG4iLCBzdHIpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIGlmIChnZXRfcGFyYW1fdmFsdWUoYnVmLCBzaXplb2YoYnVmKSwgImNhY2hlIiwgc3RyKSkgeworICAgICAgICBpZiAoIXN0cmNtcChidWYsICJvZmYiKSB8fCAhc3RyY21wKGJ1ZiwgIm5vbmUiKSkKKyAgICAgICAgICAgIGNhY2hlID0gMDsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChidWYsICJ3cml0ZXRocm91Z2giKSkKKyAgICAgICAgICAgIGNhY2hlID0gMTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChidWYsICJ3cml0ZWJhY2siKSkKKyAgICAgICAgICAgIGNhY2hlID0gMjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogaW52YWxpZCBjYWNoZSBvcHRpb25cbiIpOworICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJmb3JtYXQiLCBzdHIpKSB7CisgICAgICAgaWYgKHN0cmNtcChidWYsICI/IikgPT0gMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiBTdXBwb3J0ZWQgZm9ybWF0czoiKTsKKyAgICAgICAgICAgIGJkcnZfaXRlcmF0ZV9mb3JtYXQoYmRydl9mb3JtYXRfcHJpbnQsIE5VTEwpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworCSAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHJ2ID0gYmRydl9maW5kX2Zvcm1hdChidWYpOworICAgICAgICBpZiAoIWRydikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJxZW11OiAnJXMnIGludmFsaWQgZm9ybWF0XG4iLCBidWYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFyZy0+ZmlsZSA9PSBOVUxMKQorICAgICAgICBnZXRfcGFyYW1fdmFsdWUoZmlsZSwgc2l6ZW9mKGZpbGUpLCAiZmlsZSIsIHN0cik7CisgICAgZWxzZQorICAgICAgICBwc3RyY3B5KGZpbGUsIHNpemVvZihmaWxlKSwgYXJnLT5maWxlKTsKKworICAgIGlmICghZ2V0X3BhcmFtX3ZhbHVlKHNlcmlhbCwgc2l6ZW9mKHNlcmlhbCksICJzZXJpYWwiLCBzdHIpKQorCSAgICBtZW1zZXQoc2VyaWFsLCAwLCAgc2l6ZW9mKHNlcmlhbCkpOworCisgICAgb25lcnJvciA9IEJMT0NLX0VSUl9TVE9QX0VOT1NQQzsKKyAgICBpZiAoZ2V0X3BhcmFtX3ZhbHVlKGJ1Ziwgc2l6ZW9mKHNlcmlhbCksICJ3ZXJyb3IiLCBzdHIpKSB7CisgICAgICAgIGlmICh0eXBlICE9IElGX0lERSAmJiB0eXBlICE9IElGX1NDU0kgJiYgdHlwZSAhPSBJRl9WSVJUSU8pIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAid2Vycm9yIGlzIG5vIHN1cHBvcnRlZCBieSB0aGlzIGZvcm1hdFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAiaWdub3JlIikpCisgICAgICAgICAgICBvbmVycm9yID0gQkxPQ0tfRVJSX0lHTk9SRTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChidWYsICJlbm9zcGMiKSkKKyAgICAgICAgICAgIG9uZXJyb3IgPSBCTE9DS19FUlJfU1RPUF9FTk9TUEM7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAic3RvcCIpKQorICAgICAgICAgICAgb25lcnJvciA9IEJMT0NLX0VSUl9TVE9QX0FOWTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChidWYsICJyZXBvcnQiKSkKKyAgICAgICAgICAgIG9uZXJyb3IgPSBCTE9DS19FUlJfUkVQT1JUOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogJyVzJyBpbnZhbGlkIHdyaXRlIGVycm9yIGFjdGlvblxuIiwgYnVmKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbXB1dGUgYnVzIGFuZCB1bml0IGFjY29yZGluZyBpbmRleCAqLworCisgICAgaWYgKGluZGV4ICE9IC0xKSB7CisgICAgICAgIGlmIChidXNfaWQgIT0gMCB8fCB1bml0X2lkICE9IC0xKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgInFlbXU6ICclcycgaW5kZXggY2Fubm90IGJlIHVzZWQgd2l0aCBidXMgYW5kIHVuaXRcbiIsIHN0cik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heF9kZXZzID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuaXRfaWQgPSBpbmRleDsKKyAgICAgICAgICAgIGJ1c19pZCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bml0X2lkID0gaW5kZXggJSBtYXhfZGV2czsKKyAgICAgICAgICAgIGJ1c19pZCA9IGluZGV4IC8gbWF4X2RldnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiB1c2VyIGRvZXNuJ3Qgc3BlY2lmeSBhIHVuaXRfaWQsCisgICAgICogdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IGZyZWUKKyAgICAgKi8KKworICAgIGlmICh1bml0X2lkID09IC0xKSB7CisgICAgICAgdW5pdF9pZCA9IDA7CisgICAgICAgd2hpbGUgKGRyaXZlX2dldF9pbmRleCh0eXBlLCBidXNfaWQsIHVuaXRfaWQpICE9IC0xKSB7CisgICAgICAgICAgIHVuaXRfaWQrKzsKKyAgICAgICAgICAgaWYgKG1heF9kZXZzICYmIHVuaXRfaWQgPj0gbWF4X2RldnMpIHsKKyAgICAgICAgICAgICAgIHVuaXRfaWQgLT0gbWF4X2RldnM7CisgICAgICAgICAgICAgICBidXNfaWQrKzsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayB1bml0IGlkICovCisKKyAgICBpZiAobWF4X2RldnMgJiYgdW5pdF9pZCA+PSBtYXhfZGV2cykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInFlbXU6ICclcycgdW5pdCAlZCB0b28gYmlnIChtYXggaXMgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyLCB1bml0X2lkLCBtYXhfZGV2cyAtIDEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBpZ25vcmUgbXVsdGlwbGUgZGVmaW5pdGlvbnMKKyAgICAgKi8KKworICAgIGlmIChkcml2ZV9nZXRfaW5kZXgodHlwZSwgYnVzX2lkLCB1bml0X2lkKSAhPSAtMSkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLyogaW5pdCAqLworCisgICAgaWYgKHR5cGUgPT0gSUZfSURFIHx8IHR5cGUgPT0gSUZfU0NTSSkKKyAgICAgICAgbWVkaWFzdHIgPSAobWVkaWEgPT0gTUVESUFfQ0RST00pID8gIi1jZCIgOiAiLWhkIjsKKyAgICBpZiAobWF4X2RldnMpCisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyVpJXMlaSIsCisgICAgICAgICAgICAgICAgIGRldm5hbWUsIGJ1c19pZCwgbWVkaWFzdHIsIHVuaXRfaWQpOworICAgIGVsc2UKKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzJXMlaSIsCisgICAgICAgICAgICAgICAgIGRldm5hbWUsIG1lZGlhc3RyLCB1bml0X2lkKTsKKyAgICBiZHJ2ID0gYmRydl9uZXcoYnVmKTsKKyAgICBkcml2ZXNfdGFibGVfaWR4ID0gZHJpdmVfZ2V0X2ZyZWVfaWR4KCk7CisgICAgZHJpdmVzX3RhYmxlW2RyaXZlc190YWJsZV9pZHhdLmJkcnYgPSBiZHJ2OworICAgIGRyaXZlc190YWJsZVtkcml2ZXNfdGFibGVfaWR4XS50eXBlID0gdHlwZTsKKyAgICBkcml2ZXNfdGFibGVbZHJpdmVzX3RhYmxlX2lkeF0uYnVzID0gYnVzX2lkOworICAgIGRyaXZlc190YWJsZVtkcml2ZXNfdGFibGVfaWR4XS51bml0ID0gdW5pdF9pZDsKKyAgICBkcml2ZXNfdGFibGVbZHJpdmVzX3RhYmxlX2lkeF0ub25lcnJvciA9IG9uZXJyb3I7CisgICAgZHJpdmVzX3RhYmxlW2RyaXZlc190YWJsZV9pZHhdLmRyaXZlX29wdF9pZHggPSBhcmcgLSBkcml2ZXNfb3B0OworICAgIHN0cm5jcHkoZHJpdmVzX3RhYmxlW2RyaXZlc190YWJsZV9pZHhdLnNlcmlhbCwgc2VyaWFsLCBzaXplb2Yoc2VyaWFsKSk7CisgICAgbmJfZHJpdmVzKys7CisKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgSUZfSURFOgorICAgIGNhc2UgSUZfU0NTSToKKyAgICBjYXNlIElGX1hFTjoKKyAgICAgICAgc3dpdGNoKG1lZGlhKSB7CisJY2FzZSBNRURJQV9ESVNLOgorICAgICAgICAgICAgaWYgKGN5bHMgIT0gMCkgeworICAgICAgICAgICAgICAgIGJkcnZfc2V0X2dlb21ldHJ5X2hpbnQoYmRydiwgY3lscywgaGVhZHMsIHNlY3MpOworICAgICAgICAgICAgICAgIGJkcnZfc2V0X3RyYW5zbGF0aW9uX2hpbnQoYmRydiwgdHJhbnNsYXRpb24pOworICAgICAgICAgICAgfQorCSAgICBicmVhazsKKwljYXNlIE1FRElBX0NEUk9NOgorICAgICAgICAgICAgYmRydl9zZXRfdHlwZV9oaW50KGJkcnYsIEJEUlZfVFlQRV9DRFJPTSk7CisJICAgIGJyZWFrOworCX0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRl9TRDoKKyAgICAgICAgLyogRklYTUU6IFRoaXMgaXNuJ3QgcmVhbGx5IGEgZmxvcHB5LCBidXQgaXQncyBhIHJlYXNvbmFibGUKKyAgICAgICAgICAgYXBwcm94aW1hdGlvbi4gICovCisgICAgY2FzZSBJRl9GTE9QUFk6CisgICAgICAgIGJkcnZfc2V0X3R5cGVfaGludChiZHJ2LCBCRFJWX1RZUEVfRkxPUFBZKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJRl9QRkxBU0g6CisgICAgY2FzZSBJRl9NVEQ6CisgICAgY2FzZSBJRl9WSVJUSU86CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUZfQ09VTlQ6CisgICAgY2FzZSBJRl9OT05FOgorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBpZiAoIWZpbGVbMF0pCisgICAgICAgIHJldHVybiAtMjsKKyAgICBiZHJ2X2ZsYWdzID0gMDsKKyAgICBpZiAoc25hcHNob3QpIHsKKyAgICAgICAgYmRydl9mbGFncyB8PSBCRFJWX09fU05BUFNIT1Q7CisgICAgICAgIGNhY2hlID0gMjsgLyogYWx3YXlzIHVzZSB3cml0ZS1iYWNrIHdpdGggc25hcHNob3QgKi8KKyAgICB9CisgICAgaWYgKGNhY2hlID09IDApIC8qIG5vIGNhY2hpbmcgKi8KKyAgICAgICAgYmRydl9mbGFncyB8PSBCRFJWX09fTk9DQUNIRTsKKyAgICBlbHNlIGlmIChjYWNoZSA9PSAyKSAvKiB3cml0ZS1iYWNrICovCisgICAgICAgIGJkcnZfZmxhZ3MgfD0gQkRSVl9PX0NBQ0hFX1dCOworICAgIGVsc2UgaWYgKGNhY2hlID09IDMpIC8qIG5vdCBzcGVjaWZpZWQgKi8KKyAgICAgICAgYmRydl9mbGFncyB8PSBCRFJWX09fQ0FDSEVfREVGOworICAgIGlmIChiZHJ2X29wZW4yKGJkcnYsIGZpbGUsIGJkcnZfZmxhZ3MsIGRydikgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicWVtdTogY291bGQgbm90IG9wZW4gZGlzayBpbWFnZSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChiZHJ2X2tleV9yZXF1aXJlZChiZHJ2KSkKKyAgICAgICAgYXV0b3N0YXJ0ID0gMDsKKyAgICByZXR1cm4gZHJpdmVzX3RhYmxlX2lkeDsKK30KKyNlbmRpZiAvKiBNQVhfRFJJVkVTICovCisKK3N0YXRpYyB2b2lkIG51bWFfYWRkKGNvbnN0IGNoYXIgKm9wdGFyZykKK3sKKyAgICBjaGFyIG9wdGlvblsxMjhdOworICAgIGNoYXIgKmVuZHB0cjsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUsIGVuZHZhbHVlOworICAgIGludCBub2RlbnI7CisKKyAgICBvcHRhcmcgPSBnZXRfb3B0X25hbWUob3B0aW9uLCAxMjgsIG9wdGFyZywgJywnKSArIDE7CisgICAgaWYgKCFzdHJjbXAob3B0aW9uLCAibm9kZSIpKSB7CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUob3B0aW9uLCAxMjgsICJub2RlaWQiLCBvcHRhcmcpID09IDApIHsKKyAgICAgICAgICAgIG5vZGVuciA9IG5iX251bWFfbm9kZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub2RlbnIgPSBzdHJ0b3VsbChvcHRpb24sIE5VTEwsIDEwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUob3B0aW9uLCAxMjgsICJtZW0iLCBvcHRhcmcpID09IDApIHsKKyAgICAgICAgICAgIG5vZGVfbWVtW25vZGVucl0gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJ0b3VsbChvcHRpb24sICZlbmRwdHIsIDApOworICAgICAgICAgICAgc3dpdGNoICgqZW5kcHRyKSB7CisgICAgICAgICAgICBjYXNlIDA6IGNhc2UgJ00nOiBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA8PD0gMjA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdHJzogY2FzZSAnZyc6CisgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDMwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZV9tZW1bbm9kZW5yXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRfcGFyYW1fdmFsdWUob3B0aW9uLCAxMjgsICJjcHVzIiwgb3B0YXJnKSA9PSAwKSB7CisgICAgICAgICAgICBub2RlX2NwdW1hc2tbbm9kZW5yXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvdWxsKG9wdGlvbiwgJmVuZHB0ciwgMTApOworICAgICAgICAgICAgaWYgKHZhbHVlID49IDY0KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSA2MzsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9ubHkgNjQgQ1BVcyBpbiBOVU1BIG1vZGUgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgqZW5kcHRyID09ICctJykgeworICAgICAgICAgICAgICAgICAgICBlbmR2YWx1ZSA9IHN0cnRvdWxsKGVuZHB0cisxLCAmZW5kcHRyLCAxMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmR2YWx1ZSA+PSA2MykgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kdmFsdWUgPSA2MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IDYzIENQVXMgaW4gTlVNQSBtb2RlIHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKDEgPDwgKGVuZHZhbHVlICsgMSkpIC0gKDEgPDwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMSA8PCB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlX2NwdW1hc2tbbm9kZW5yXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIG5iX251bWFfbm9kZXMrKzsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBtYWNoaW5lIHJlZ2lzdHJhdGlvbiAqLworCitzdGF0aWMgUUVNVU1hY2hpbmUgKmZpcnN0X21hY2hpbmUgPSBOVUxMOworUUVNVU1hY2hpbmUgKmN1cnJlbnRfbWFjaGluZSA9IE5VTEw7CisKK2ludCBxZW11X3JlZ2lzdGVyX21hY2hpbmUoUUVNVU1hY2hpbmUgKm0pCit7CisgICAgUUVNVU1hY2hpbmUgKipwbTsKKyAgICBwbSA9ICZmaXJzdF9tYWNoaW5lOworICAgIHdoaWxlICgqcG0gIT0gTlVMTCkKKyAgICAgICAgcG0gPSAmKCpwbSktPm5leHQ7CisgICAgbS0+bmV4dCA9IE5VTEw7CisgICAgKnBtID0gbTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFFFTVVNYWNoaW5lICpmaW5kX21hY2hpbmUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBRRU1VTWFjaGluZSAqbTsKKworICAgIGZvcihtID0gZmlyc3RfbWFjaGluZTsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgeworICAgICAgICBpZiAoIXN0cmNtcChtLT5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBtOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFFFTVVNYWNoaW5lICpmaW5kX2RlZmF1bHRfbWFjaGluZSh2b2lkKQoreworICAgIFFFTVVNYWNoaW5lICptOworCisgICAgZm9yKG0gPSBmaXJzdF9tYWNoaW5lOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisgICAgICAgIGlmIChtLT5pc19kZWZhdWx0KSB7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWFpbiBleGVjdXRpb24gbG9vcCAqLworCitzdGF0aWMgdm9pZCBndWlfdXBkYXRlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICB1aW50NjRfdCBpbnRlcnZhbCA9IEdVSV9SRUZSRVNIX0lOVEVSVkFMOworICAgIERpc3BsYXlTdGF0ZSAqZHMgPSBvcGFxdWU7CisgICAgRGlzcGxheUNoYW5nZUxpc3RlbmVyICpkY2wgPSBkcy0+bGlzdGVuZXJzOworCisgICAgZHB5X3JlZnJlc2goZHMpOworCisgICAgd2hpbGUgKGRjbCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkY2wtPmd1aV90aW1lcl9pbnRlcnZhbCAmJgorICAgICAgICAgICAgZGNsLT5ndWlfdGltZXJfaW50ZXJ2YWwgPCBpbnRlcnZhbCkKKyAgICAgICAgICAgIGludGVydmFsID0gZGNsLT5ndWlfdGltZXJfaW50ZXJ2YWw7CisgICAgICAgIGRjbCA9IGRjbC0+bmV4dDsKKyAgICB9CisgICAgdGltZXJfbW9kKGRzLT5ndWlfdGltZXIsIGludGVydmFsICsgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkpOworfQorCitzdGF0aWMgdm9pZCBub2dyYXBoaWNfdXBkYXRlKHZvaWQgKm9wYXF1ZSkKK3sKKyAgICB1aW50NjRfdCBpbnRlcnZhbCA9IEdVSV9SRUZSRVNIX0lOVEVSVkFMOworCisgICAgdGltZXJfbW9kKG5vZ3JhcGhpY190aW1lciwgaW50ZXJ2YWwgKyBxZW11X2Nsb2NrX2dldF9tcyhRRU1VX0NMT0NLX1JFQUxUSU1FKSk7Cit9CisKK3N0cnVjdCB2bV9jaGFuZ2Vfc3RhdGVfZW50cnkgeworICAgIFZNQ2hhbmdlU3RhdGVIYW5kbGVyICpjYjsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgUUxJU1RfRU5UUlkgKHZtX2NoYW5nZV9zdGF0ZV9lbnRyeSkgZW50cmllczsKK307CisKK3N0YXRpYyBRTElTVF9IRUFEKHZtX2NoYW5nZV9zdGF0ZV9oZWFkLCB2bV9jaGFuZ2Vfc3RhdGVfZW50cnkpIHZtX2NoYW5nZV9zdGF0ZV9oZWFkOworCitWTUNoYW5nZVN0YXRlRW50cnkgKnFlbXVfYWRkX3ZtX2NoYW5nZV9zdGF0ZV9oYW5kbGVyKFZNQ2hhbmdlU3RhdGVIYW5kbGVyICpjYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb3BhcXVlKQoreworICAgIFZNQ2hhbmdlU3RhdGVFbnRyeSAqZTsKKworICAgIGUgPSBnX21hbGxvYzAoc2l6ZW9mICgqZSkpOworCisgICAgZS0+Y2IgPSBjYjsKKyAgICBlLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgUUxJU1RfSU5TRVJUX0hFQUQoJnZtX2NoYW5nZV9zdGF0ZV9oZWFkLCBlLCBlbnRyaWVzKTsKKyAgICByZXR1cm4gZTsKK30KKwordm9pZCBxZW11X2RlbF92bV9jaGFuZ2Vfc3RhdGVfaGFuZGxlcihWTUNoYW5nZVN0YXRlRW50cnkgKmUpCit7CisgICAgUUxJU1RfUkVNT1ZFIChlLCBlbnRyaWVzKTsKKyAgICBnX2ZyZWUgKGUpOworfQorCit2b2lkIHZtX3N0YXRlX25vdGlmeShpbnQgcnVubmluZywgaW50IHJlYXNvbikKK3sKKyAgICBWTUNoYW5nZVN0YXRlRW50cnkgKmU7CisKKyAgICBmb3IgKGUgPSB2bV9jaGFuZ2Vfc3RhdGVfaGVhZC5saF9maXJzdDsgZTsgZSA9IGUtPmVudHJpZXMubGVfbmV4dCkgeworICAgICAgICBlLT5jYihlLT5vcGFxdWUsIHJ1bm5pbmcsIHJlYXNvbik7CisgICAgfQorfQorCit2b2lkIHZtX3N0YXJ0KHZvaWQpCit7CisgICAgaWYgKCF2bV9ydW5uaW5nKSB7CisgICAgICAgIGNwdV9lbmFibGVfdGlja3MoKTsKKyAgICAgICAgdm1fcnVubmluZyA9IDE7CisgICAgICAgIHZtX3N0YXRlX25vdGlmeSgxLCAwKTsKKyAgICAgICAgLy9xZW11X3JlYXJtX2FsYXJtX3RpbWVyKGFsYXJtX3RpbWVyKTsKKyAgICAgICAgcmVzdW1lX2FsbF92Y3B1cygpOworICAgIH0KK30KKworLyogcmVzZXQvc2h1dGRvd24gaGFuZGxlciAqLworCit0eXBlZGVmIHN0cnVjdCBRRU1VUmVzZXRFbnRyeSB7CisgICAgUUVNVVJlc2V0SGFuZGxlciAqZnVuYzsKKyAgICB2b2lkICpvcGFxdWU7CisgICAgaW50IG9yZGVyOworICAgIHN0cnVjdCBRRU1VUmVzZXRFbnRyeSAqbmV4dDsKK30gUUVNVVJlc2V0RW50cnk7CisKK3N0YXRpYyBRRU1VUmVzZXRFbnRyeSAqZmlyc3RfcmVzZXRfZW50cnk7CitzdGF0aWMgaW50IHJlc2V0X3JlcXVlc3RlZDsKK3N0YXRpYyBpbnQgc2h1dGRvd25fcmVxdWVzdGVkLCBzaHV0ZG93bl9zaWduYWwgPSAtMTsKK3N0YXRpYyBwaWRfdCBzaHV0ZG93bl9waWQ7CitzdGF0aWMgaW50IHBvd2VyZG93bl9yZXF1ZXN0ZWQ7CitpbnQgZGVidWdfcmVxdWVzdGVkOworc3RhdGljIGludCB2bXN0b3BfcmVxdWVzdGVkOworCitpbnQgcWVtdV9zaHV0ZG93bl9yZXF1ZXN0ZWQodm9pZCkKK3sKKyAgICBpbnQgciA9IHNodXRkb3duX3JlcXVlc3RlZDsKKyAgICBzaHV0ZG93bl9yZXF1ZXN0ZWQgPSAwOworICAgIHJldHVybiByOworfQorCitpbnQgcWVtdV9yZXNldF9yZXF1ZXN0ZWQodm9pZCkKK3sKKyAgICBpbnQgciA9IHJlc2V0X3JlcXVlc3RlZDsKKyAgICByZXNldF9yZXF1ZXN0ZWQgPSAwOworICAgIHJldHVybiByOworfQorCitpbnQgcWVtdV9wb3dlcmRvd25fcmVxdWVzdGVkKHZvaWQpCit7CisgICAgaW50IHIgPSBwb3dlcmRvd25fcmVxdWVzdGVkOworICAgIHBvd2VyZG93bl9yZXF1ZXN0ZWQgPSAwOworICAgIHJldHVybiByOworfQorCitpbnQgcWVtdV9kZWJ1Z19yZXF1ZXN0ZWQodm9pZCkKK3sKKyAgICBpbnQgciA9IGRlYnVnX3JlcXVlc3RlZDsKKyAgICBkZWJ1Z19yZXF1ZXN0ZWQgPSAwOworICAgIHJldHVybiByOworfQorCitpbnQgcWVtdV92bXN0b3BfcmVxdWVzdGVkKHZvaWQpCit7CisgICAgaW50IHIgPSB2bXN0b3BfcmVxdWVzdGVkOworICAgIHZtc3RvcF9yZXF1ZXN0ZWQgPSAwOworICAgIHJldHVybiByOworfQorCit2b2lkIHFlbXVfcmVnaXN0ZXJfcmVzZXQoUUVNVVJlc2V0SGFuZGxlciAqZnVuYywgaW50IG9yZGVyLCB2b2lkICpvcGFxdWUpCit7CisgICAgUUVNVVJlc2V0RW50cnkgKipwcmUsICpyZTsKKworICAgIHByZSA9ICZmaXJzdF9yZXNldF9lbnRyeTsKKyAgICB3aGlsZSAoKnByZSAhPSBOVUxMICYmICgqcHJlKS0+b3JkZXIgPj0gb3JkZXIpIHsKKyAgICAgICAgcHJlID0gJigqcHJlKS0+bmV4dDsKKyAgICB9CisgICAgcmUgPSBnX21hbGxvYzAoc2l6ZW9mKFFFTVVSZXNldEVudHJ5KSk7CisgICAgcmUtPmZ1bmMgPSBmdW5jOworICAgIHJlLT5vcGFxdWUgPSBvcGFxdWU7CisgICAgcmUtPm9yZGVyID0gb3JkZXI7CisgICAgcmUtPm5leHQgPSBOVUxMOworICAgICpwcmUgPSByZTsKK30KKwordm9pZCBxZW11X3N5c3RlbV9yZXNldCh2b2lkKQoreworICAgIFFFTVVSZXNldEVudHJ5ICpyZTsKKworICAgIC8qIHJlc2V0IGFsbCBkZXZpY2VzICovCisgICAgZm9yKHJlID0gZmlyc3RfcmVzZXRfZW50cnk7IHJlICE9IE5VTEw7IHJlID0gcmUtPm5leHQpIHsKKyAgICAgICAgcmUtPmZ1bmMocmUtPm9wYXF1ZSk7CisgICAgfQorfQorCit2b2lkIHFlbXVfc3lzdGVtX3Jlc2V0X3JlcXVlc3Qodm9pZCkKK3sKKyAgICBpZiAobm9fcmVib290KSB7CisgICAgICAgIHNodXRkb3duX3JlcXVlc3RlZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzZXRfcmVxdWVzdGVkID0gMTsKKyAgICB9CisgICAgcWVtdV9ub3RpZnlfZXZlbnQoKTsKK30KKwordm9pZCBxZW11X3N5c3RlbV9raWxsZWQoaW50IHNpZ25hbCwgcGlkX3QgcGlkKQoreworICAgIHNodXRkb3duX3NpZ25hbCA9IHNpZ25hbDsKKyAgICBzaHV0ZG93bl9waWQgPSBwaWQ7CisgICAgcWVtdV9zeXN0ZW1fc2h1dGRvd25fcmVxdWVzdCgpOworfQorCit2b2lkIHFlbXVfc3lzdGVtX3NodXRkb3duX3JlcXVlc3Qodm9pZCkKK3sKKyAgICBzaHV0ZG93bl9yZXF1ZXN0ZWQgPSAxOworICAgIHFlbXVfbm90aWZ5X2V2ZW50KCk7Cit9CisKK3ZvaWQgcWVtdV9zeXN0ZW1fcG93ZXJkb3duX3JlcXVlc3Qodm9pZCkKK3sKKyAgICBwb3dlcmRvd25fcmVxdWVzdGVkID0gMTsKKyAgICBxZW11X25vdGlmeV9ldmVudCgpOworfQorCitpbnQgdm1fY2FuX3J1bih2b2lkKQoreworICAgIGlmIChwb3dlcmRvd25fcmVxdWVzdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocmVzZXRfcmVxdWVzdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc2h1dGRvd25fcmVxdWVzdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZGVidWdfcmVxdWVzdGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCB2ZXJzaW9uKHZvaWQpCit7CisgICAgcHJpbnRmKCJRRU1VIFBDIGVtdWxhdG9yIHZlcnNpb24gIiBRRU1VX1ZFUlNJT04gIiAiIFFFTVVfUEtHVkVSU0lPTiAiLCBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOCBGYWJyaWNlIEJlbGxhcmRcbiIpOworfQorCitzdGF0aWMgdm9pZCBxZW11X2hlbHAodm9pZCkKK3sKKyAgICB2ZXJzaW9uKCk7CisgICAgcHJpbnRmKCJ1c2FnZTogJXMgW29wdGlvbnNdIFtkaXNrX2ltYWdlXVxuIgorICAgICAgICAgICAiXG4iCisgICAgICAgICAgICInZGlza19pbWFnZScgaXMgYSByYXcgaGFyZCBpbWFnZSBpbWFnZSBmb3IgSURFIGhhcmQgZGlzayAwXG4iCisgICAgICAgICAgICJcbiIKKyNkZWZpbmUgREVGKG9wdGlvbiwgb3B0X2FyZywgb3B0X2VudW0sIG9wdF9oZWxwKSAgICAgICAgXAorICAgICAgICAgICBvcHRfaGVscAorI2RlZmluZSBERUZIRUFESU5HKHRleHQpIHN0cmluZ2lmeSh0ZXh0KSAiXG4iCisjaW5jbHVkZSAicWVtdS1vcHRpb25zLmRlZiIKKyN1bmRlZiBERUYKKyN1bmRlZiBERUZIRUFESU5HCisjdW5kZWYgR0VOX0RPQ1MKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiRHVyaW5nIGVtdWxhdGlvbiwgdGhlIGZvbGxvd2luZyBrZXlzIGFyZSB1c2VmdWw6XG4iCisgICAgICAgICAgICJjdHJsLWFsdC1mICAgICAgdG9nZ2xlIGZ1bGwgc2NyZWVuXG4iCisgICAgICAgICAgICJjdHJsLWFsdC1uICAgICAgc3dpdGNoIHRvIHZpcnR1YWwgY29uc29sZSAnbidcbiIKKyAgICAgICAgICAgImN0cmwtYWx0ICAgICAgICB0b2dnbGUgbW91c2UgYW5kIGtleWJvYXJkIGdyYWJcbiIKKyAgICAgICAgICAgIlxuIgorICAgICAgICAgICAiV2hlbiB1c2luZyAtbm9ncmFwaGljLCBwcmVzcyAnY3RybC1hIGgnIHRvIGdldCBzb21lIGhlbHAuXG4iCisgICAgICAgICAgICwKKyAgICAgICAgICAgInFlbXUiLAorICAgICAgICAgICBERUZBVUxUX1JBTV9TSVpFLAorI2lmbmRlZiBfV0lOMzIKKyAgICAgICAgICAgREVGQVVMVF9ORVRXT1JLX1NDUklQVCwKKyAgICAgICAgICAgREVGQVVMVF9ORVRXT1JLX0RPV05fU0NSSVBULAorI2VuZGlmCisgICAgICAgICAgIERFRkFVTFRfR0RCU1RVQl9QT1JULAorICAgICAgICAgICAiL3RtcC9xZW11LmxvZyIpOworfQorCisjZGVmaW5lIEhBU19BUkcgMHgwMDAxCisKK2VudW0geworI2RlZmluZSBERUYob3B0aW9uLCBvcHRfYXJnLCBvcHRfZW51bSwgb3B0X2hlbHApICAgICAgICBcCisgICAgb3B0X2VudW0sCisjZGVmaW5lIERFRkhFQURJTkcodGV4dCkKKyNpbmNsdWRlICJxZW11LW9wdGlvbnMuZGVmIgorI3VuZGVmIERFRgorI3VuZGVmIERFRkhFQURJTkcKKyN1bmRlZiBHRU5fRE9DUworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUUVNVU9wdGlvbiB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgZmxhZ3M7CisgICAgaW50IGluZGV4OworfSBRRU1VT3B0aW9uOworCitzdGF0aWMgY29uc3QgUUVNVU9wdGlvbiBxZW11X29wdGlvbnNbXSA9IHsKKyAgICB7ICJoIiwgMCwgUUVNVV9PUFRJT05faCB9LAorI2RlZmluZSBERUYob3B0aW9uLCBvcHRfYXJnLCBvcHRfZW51bSwgb3B0X2hlbHApICAgICAgICBcCisgICAgeyBvcHRpb24sIG9wdF9hcmcsIG9wdF9lbnVtIH0sCisjZGVmaW5lIERFRkhFQURJTkcodGV4dCkKKyNpbmNsdWRlICJxZW11LW9wdGlvbnMuZGVmIgorI3VuZGVmIERFRgorI3VuZGVmIERFRkhFQURJTkcKKyN1bmRlZiBHRU5fRE9DUworICAgIHsgTlVMTCwgMCwgMCB9LAorfTsKKworc3RhdGljIGJvb2wgc2VsZWN0X3ZnYWh3IChjb25zdCBjaGFyICpwKQoreworICAgIGNvbnN0IGNoYXIgKm9wdHM7CisKKyAgICBjaXJydXNfdmdhX2VuYWJsZWQgPSAwOworICAgIHN0ZF92Z2FfZW5hYmxlZCA9IDA7CisgICAgdm1zdmdhX2VuYWJsZWQgPSAwOworICAgIHhlbmZiX2VuYWJsZWQgPSAwOworICAgIGlmIChzdHJzdGFydChwLCAic3RkIiwgJm9wdHMpKSB7CisgICAgICAgIHN0ZF92Z2FfZW5hYmxlZCA9IDE7CisgICAgfSBlbHNlIGlmIChzdHJzdGFydChwLCAiY2lycnVzIiwgJm9wdHMpKSB7CisgICAgICAgIGNpcnJ1c192Z2FfZW5hYmxlZCA9IDE7CisgICAgfSBlbHNlIGlmIChzdHJzdGFydChwLCAidm13YXJlIiwgJm9wdHMpKSB7CisgICAgICAgIHZtc3ZnYV9lbmFibGVkID0gMTsKKyAgICB9IGVsc2UgaWYgKHN0cnN0YXJ0KHAsICJ4ZW5mYiIsICZvcHRzKSkgeworICAgICAgICB4ZW5mYl9lbmFibGVkID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJzdGFydChwLCAibm9uZSIsICZvcHRzKSkgeworICAgIGludmFsaWRfdmdhOgorICAgICAgICBQQU5JQygiVW5rbm93biB2Z2EgdHlwZTogJXMiLCBwKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAoKm9wdHMpIHsKKyAgICAgICAgY29uc3QgY2hhciAqbmV4dG9wdDsKKworICAgICAgICBpZiAoc3Ryc3RhcnQob3B0cywgIixyZXRyYWNlPSIsICZuZXh0b3B0KSkgeworICAgICAgICAgICAgb3B0cyA9IG5leHRvcHQ7CisgICAgICAgICAgICBpZiAoc3Ryc3RhcnQob3B0cywgImR1bWIiLCAmbmV4dG9wdCkpCisgICAgICAgICAgICAgICAgdmdhX3JldHJhY2VfbWV0aG9kID0gVkdBX1JFVFJBQ0VfRFVNQjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cnN0YXJ0KG9wdHMsICJwcmVjaXNlIiwgJm5leHRvcHQpKQorICAgICAgICAgICAgICAgIHZnYV9yZXRyYWNlX21ldGhvZCA9IFZHQV9SRVRSQUNFX1BSRUNJU0U7CisgICAgICAgICAgICBlbHNlIGdvdG8gaW52YWxpZF92Z2E7CisgICAgICAgIH0gZWxzZSBnb3RvIGludmFsaWRfdmdhOworICAgICAgICBvcHRzID0gbmV4dG9wdDsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworI2RlZmluZSBNQVhfTkVUX0NMSUVOVFMgMzIKKworI2lmZGVmIF9XSU4zMgorLyogTG9vayBmb3Igc3VwcG9ydCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGV4ZWN1dGFibGUuICAqLworc3RhdGljIGNoYXIgKmZpbmRfZGF0YWRpcihjb25zdCBjaGFyICphcmd2MCkKK3sKKyAgICByZXR1cm4gb3NfZmluZF9kYXRhZGlyKGFyZ3YwKTsKK30KKyNlbHNlIC8qICFfV0lOMzIgKi8KKworLyogU2ltaWxhcmx5LCByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBleGVjdXRhYmxlICovCitzdGF0aWMgY2hhciAqZmluZF9kYXRhZGlyKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworICAgIGNoYXIgKnAgPSBOVUxMOworICAgIGNoYXIgYnVmW1BBVEhfTUFYXTsKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorICAgIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgbGVuID0gcmVhZGxpbmsoIi9wcm9jL3NlbGYvZXhlIiwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworICAgICAgICAgICAgcCA9IGJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyNlbGlmIGRlZmluZWQoX19GcmVlQlNEX18pCisgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBsZW4gPSByZWFkbGluaygiL3Byb2MvY3VycHJvYy9maWxlIiwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgYnVmW2xlbl0gPSAwOworICAgICAgICAgICAgcCA9IGJ1ZjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHdheSBvZiBmaWd1cmluZyBvdXQgdGhlIGFjdHVhbCBleGVjdXRhYmxlCisgICAgICAgbG9jYXRpb24gdGhlbiB0cnkgYXJndlswXS4gICovCisgICAgaWYgKCFwKSB7CisgICAgICAgIHAgPSByZWFscGF0aChhcmd2MCwgYnVmKTsKKyAgICAgICAgaWYgKCFwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBnX3N0cmR1cChkaXJuYW1lKGJ1ZikpOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyKgorcWVtdV9maW5kX2ZpbGVfd2l0aF9zdWJkaXIoY29uc3QgY2hhciogZGF0YV9kaXIsIGNvbnN0IGNoYXIqIHN1YmRpciwgY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICBpbnQgICBsZW4gPSBzdHJsZW4oZGF0YV9kaXIpICsgc3RybGVuKG5hbWUpICsgc3RybGVuKHN1YmRpcikgKyAyOworICAgIGNoYXIqIGJ1ZiA9IGdfbWFsbG9jMChsZW4pOworCisgICAgc25wcmludGYoYnVmLCBsZW4sICIlcy8lcyVzIiwgZGF0YV9kaXIsIHN1YmRpciwgbmFtZSk7CisgICAgVkVSQk9TRV9QUklOVChpbml0LCIgICAgdHJ5aW5nIHRvIGZpbmQ6ICVzXG4iLCBidWYpOworICAgIGlmIChhY2Nlc3MoYnVmLCBSX09LKSkgeworICAgICAgICBnX2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBidWY7Cit9CisKK2NoYXIgKnFlbXVfZmluZF9maWxlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN1YmRpcjsKKyAgICBjaGFyICpidWY7CisKKyAgICAvKiBJZiBuYW1lIGNvbnRhaW5zIHBhdGggc2VwYXJhdG9ycyB0aGVuIHRyeSBpdCBhcyBhIHN0cmFpZ2h0IHBhdGguICAqLworICAgIGlmICgoc3RyY2hyKG5hbWUsICcvJykgfHwgc3RyY2hyKG5hbWUsICdcXCcpKQorICAgICAgICAmJiBhY2Nlc3MobmFtZSwgUl9PSykgPT0gMCkgeworICAgICAgICByZXR1cm4gc3RyZHVwKG5hbWUpOworICAgIH0KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFFFTVVfRklMRV9UWVBFX0JJT1M6CisgICAgICAgIHN1YmRpciA9ICIiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFTVVfRklMRV9UWVBFX0tFWU1BUDoKKyAgICAgICAgc3ViZGlyID0gImtleW1hcHMvIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9CisgICAgYnVmID0gcWVtdV9maW5kX2ZpbGVfd2l0aF9zdWJkaXIoZGF0YV9kaXIsIHN1YmRpciwgbmFtZSk7CisjaWZkZWYgQ09ORklHX0FORFJPSUQKKyAgICBpZiAodHlwZSA9PSBRRU1VX0ZJTEVfVFlQRV9CSU9TKSB7CisgICAgICAgIC8qIFRoaXMgY2FzZSBjb3JyZXNwb25kcyB0byB0aGUgZW11bGF0b3IgYmVpbmcgdXNlZCBhcyBwYXJ0IG9mIGFuCisgICAgICAgICAqIFNESyBpbnN0YWxsYXRpb24uIE5PVEU6IGRhdGFfZGlyIGlzIHJlYWxseSAkYmluZGlyLiAqLworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICBidWYgPSBxZW11X2ZpbmRfZmlsZV93aXRoX3N1YmRpcihkYXRhX2RpciwgImxpYi9wYy1iaW9zLyIsIG5hbWUpOworICAgICAgICAvKiBUaGlzIGNhc2UgY29ycmVzcG9uZHMgdG8gcGxhdGZvcm0gYnVpbGRzLiAqLworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICBidWYgPSBxZW11X2ZpbmRfZmlsZV93aXRoX3N1YmRpcihkYXRhX2RpciwgIi4uL3Vzci9zaGFyZS9wYy1iaW9zLyIsIG5hbWUpOworICAgICAgICAvKiBGaW5hbGx5LCB0cnkgdGhpcyBmb3Igc3RhbmRhbG9uZSBidWlsZHMgdW5kZXIgZXh0ZXJuYWwvcWVtdSAqLworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICBidWYgPSBxZW11X2ZpbmRfZmlsZV93aXRoX3N1YmRpcihkYXRhX2RpciwgIi4uLy4uLy4uL3ByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODYvcGMtYmlvcy8iLCBuYW1lKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gYnVmOworfQorCisvKiBQYXJzZXMgYW4gaW50ZWdlcgorICogUGFyYXJtOgorICogIHN0ciAgICAgIFN0cmluZyBjb250YWluaW5nIGEgbnVtYmVyIHRvIGJlIHBhcnNlZC4KKyAqICByZXN1bHQgICBQYXNzZXMgdGhlIHBhcnNlZCBpbnRlZ2VyIGluIHRoaXMgYXJndW1lbnQKKyAqICByZXR1cm5zICAwIGlmIG9rLCAtMSBpZiBmYWlsZWQKKyAqLworaW50CitwYXJzZV9pbnQoY29uc3QgY2hhciAqc3RyLCBpbnQgKnJlc3VsdCkKK3sKKyAgICBjaGFyKiByOworICAgICpyZXN1bHQgPSBzdHJ0b2woc3RyLCAmciwgMCk7CisgICAgaWYgKHIgPT0gTlVMTCB8fCAqciAhPSAnXDAnKQorICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHBhcnNlcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgc3BlY2lmeWluZyBhIG5ldHdvcmsgcG9ydCAoZS5nLiwgIjgwIikgb3IKKyAqIHBvcnQgcmFuZ2UgKGUuZy4sICJbNjY2Ni03MDAwXSIpLiBJbiBjYXNlIG9mIGEgc2luZ2xlIHBvcnQsIGxwb3J0IGFuZCBocG9ydAorICogYXJlIHRoZSBzYW1lLiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICovCisKK2ludCBwYXJzZV9wb3J0X3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgc2hvcnQgKmxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKmhwb3J0KSB7CisKKyAgdW5zaWduZWQgaW50IGxvdyA9IDAsIGhpZ2ggPSAwOworICBjaGFyICpwLCAqYXJnID0gc3RyZHVwKHN0cik7CisKKyAgaWYgKCgqYXJnID09ICdbJykgJiYgKChwID0gc3RycmNocihhcmcsICddJykpICE9IE5VTEwpKSB7CisgICAgcCA9IGFyZyArIDE7ICAgLyogc2tpcCAnWycgKi8KKyAgICBsb3cgID0gYXRvaShzdHJ0b2socCwgIi0iKSk7CisgICAgaGlnaCA9IGF0b2koc3RydG9rKE5VTEwsICItIikpOworICAgIGlmICgobG93ID4gMCkgJiYgKGhpZ2ggPiAwKSAmJiAobG93IDwgaGlnaCkgJiYgKGhpZ2ggPD0gNjU1MzUpKSB7CisgICAgICAqbHBvcnQgPSBsb3c7CisgICAgICAqaHBvcnQgPSBoaWdoOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBsb3cgPSBhdG9pKGFyZyk7CisgICAgaWYgKCgwIDwgbG93KSAmJiAobG93IDw9IDY1NTM1KSkgeworICAgICAgKmxwb3J0ID0gbG93OworICAgICAgKmhwb3J0ID0gbG93OworICAgIH0KKyAgfQorICBmcmVlKGFyZyk7CisgIGlmIChsb3cgIT0gMCkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIC0xOworfQorCisvKgorICogSW1wbGVtZW50cyB0aGUgZ2VuZXJpYyBwb3J0IGZvcndhcmRpbmcgb3B0aW9uCisgKi8KK3N0YXRpYyBib29sIG5ldF9zbGlycF9mb3J3YXJkKGNvbnN0IGNoYXIgKm9wdGFyZykKK3sKKyAgICAvKgorICAgICAqIHdlIGV4cGVjdCB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAgICAgKiBkc3RfbmV0OmRzdF9tYXNrOmRzdF9wb3J0OnJlZGlyZWN0X2lwOnJlZGlyZWN0X3BvcnQgT1IKKyAgICAgKiBkc3RfbmV0OmRzdF9tYXNrOltkcF9yYW5nZV9zdGFydC1kcF9yYW5nZV9lbmRdOnJlZGlyZWN0X2lwOnJlZGlyZWN0X3BvcnQKKyAgICAgKi8KKyAgICBjaGFyICphcmd1bWVudCA9IHN0cmR1cChvcHRhcmcpLCAqcCA9IGFyZ3VtZW50OworICAgIGNoYXIgKmRzdF9uZXQsICpkc3RfbWFzaywgKmRzdF9wb3J0OworICAgIGNoYXIgKnJlZGlyZWN0X2lwLCAqcmVkaXJlY3RfcG9ydDsKKyAgICB1aW50MzJfdCBkbmV0LCBkbWFzaywgcmlwOworICAgIHVuc2lnbmVkIHNob3J0IGRscG9ydCA9IDAsIGRocG9ydCA9IDAsIHJwb3J0OworCisKKyAgICBkc3RfbmV0ID0gc3RydG9rKHAsICI6Iik7CisgICAgZHN0X21hc2sgPSBzdHJ0b2soTlVMTCwgIjoiKTsKKyAgICBkc3RfcG9ydCA9IHN0cnRvayhOVUxMLCAiOiIpOworICAgIHJlZGlyZWN0X2lwID0gc3RydG9rKE5VTEwsICI6Iik7CisgICAgcmVkaXJlY3RfcG9ydCA9IHN0cnRvayhOVUxMLCAiOiIpOworCisgICAgaWYgKGRzdF9uZXQgPT0gTlVMTCB8fCBkc3RfbWFzayA9PSBOVUxMIHx8IGRzdF9wb3J0ID09IE5VTEwgfHwKKyAgICAgICAgcmVkaXJlY3RfaXAgPT0gTlVMTCB8fCByZWRpcmVjdF9wb3J0ID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgZm9yIC1uZXQtZm9yd2FyZCwgd2UgZXhwZWN0ICIKKyAgICAgICAgICAgICAgICAiZHN0X25ldDpkc3RfbWFzazpkc3RfcG9ydDpyZWRpcmVjdF9pcDpyZWRpcmVjdF9wb3J0IG9yICIKKyAgICAgICAgICAgICAgICAiZHN0X25ldDpkc3RfbWFzazpbZHBfcmFuZ2Vfc3RhcnQtZHBfcmFuZ2VfZW5kXSIKKyAgICAgICAgICAgICAgICAiOnJlZGlyZWN0X2lwOnJlZGlyZWN0X3BvcnQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIG9wdGFyZyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBpbmV0X3N0cnRvaXAgY29udmVydHMgZG90dGVkIGFkZHJlc3MgdG8gaG9zdCBieXRlIG9yZGVyICovCisgICAgaWYgKGluZXRfc3RydG9pcChkc3RfbmV0LCAmZG5ldCkgPT0gLTEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGRlc3RpbmF0aW9uIElQIG5ldDogJXNcbiIsIGRzdF9uZXQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpbmV0X3N0cnRvaXAoZHN0X21hc2ssICZkbWFzaykgPT0gLTEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGRlc3RpbmF0aW9uIElQIG1hc2s6ICVzXG4iLCBkc3RfbWFzayk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGluZXRfc3RydG9pcChyZWRpcmVjdF9pcCwgJnJpcCkgPT0gLTEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHJlZGlyZWN0IElQIGFkZHJlc3M6ICVzXG4iLCByZWRpcmVjdF9pcCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfcG9ydF9yYW5nZShkc3RfcG9ydCwgJmRscG9ydCwgJmRocG9ydCkgPT0gLTEpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGRlc3RpbmF0aW9uIHBvcnQgb3IgcG9ydCByYW5nZVxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBycG9ydCA9IGF0b2kocmVkaXJlY3RfcG9ydCk7CisgICAgaWYgKCFycG9ydCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgcmVkaXJlY3QgcG9ydDogJXNcbiIsIHJlZGlyZWN0X3BvcnQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZG5ldCAmPSBkbWFzazsKKworICAgIHNsaXJwX2FkZF9uZXRfZm9yd2FyZChkbmV0LCBkbWFzaywgZGxwb3J0LCBkaHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJpcCwgcnBvcnQpOworCisgICAgZnJlZShhcmd1bWVudCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvKiBQYXJzZXMgYW4gLWFsbG93LXRjcCBvciAtYWxsb3ctdWRwIGFyZ3VtZW50IGFuZCBpbnNlcnRzIGEgY29ycmVzcG9uZGluZworICogZW50cnkgaW4gdGhlIGFsbG93cyBsaXN0ICovCitzdGF0aWMgYm9vbCBzbGlycF9hbGxvdyhjb25zdCBjaGFyICpvcHRhcmcsIHVfaW50OF90IHByb3RvKQoreworICAvKgorICAgKiB3ZSBleHBlY3QgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAqIGRzdF9pcDpkc3RfcG9ydCBPUiBkc3RfaXA6W2RzdF9scG9ydC1kc3RfaHBvcnRdCisgICAqLworICBjaGFyICphcmd1bWVudCA9IHN0cmR1cChvcHRhcmcpLCAqcCA9IGFyZ3VtZW50OworICBjaGFyICpkc3RfaXBfc3RyLCAqZHN0X3BvcnRfc3RyOworICB1aW50MzJfdCBkc3RfaXA7CisgIHVuc2lnbmVkIHNob3J0IGRzdF9scG9ydCA9IDAsIGRzdF9ocG9ydCA9IDA7CisKKyAgZHN0X2lwX3N0ciA9IHN0cnRvayhwLCAiOiIpOworICBkc3RfcG9ydF9zdHIgPSBzdHJ0b2soTlVMTCwgIjoiKTsKKworICBpZiAoZHN0X2lwX3N0ciA9PSBOVUxMIHx8IGRzdF9wb3J0X3N0ciA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAlcyBmb3IgLWFsbG93LiBXZSBleHBlY3QgIgorICAgICAgICAgICAgImRzdF9pcDpkc3RfcG9ydCBvciBkc3RfaXA6W2RzdF9scG9ydC1kc3RfaHBvcnRdXG4iLAorICAgICAgICAgICAgb3B0YXJnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoaW5ldF9zdHJ0b2lwKGRzdF9pcF9zdHIsICZkc3RfaXApID09IC0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGRlc3RpbmF0aW9uIElQIGFkZHJlc3M6ICVzXG4iLCBkc3RfaXBfc3RyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHBhcnNlX3BvcnRfcmFuZ2UoZHN0X3BvcnRfc3RyLCAmZHN0X2xwb3J0LCAmZHN0X2hwb3J0KSA9PSAtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkZXN0aW5hdGlvbiBwb3J0IG9yIHBvcnQgcmFuZ2VcbiIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNsaXJwX2FkZF9hbGxvdyhkc3RfaXAsIGRzdF9scG9ydCwgZHN0X2hwb3J0LCBwcm90byk7CisKKyAgZnJlZShhcmd1bWVudCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qIEFkZCBhIHNlcmlhbCBkZXZpY2UgYXQgYSBnaXZlbiBsb2NhdGlvbiBpbiB0aGUgZW11bGF0ZWQgaGFyZHdhcmUgdGFibGUuCisgKiBPbiBmYWlsdXJlLCB0aGlzIGZ1bmN0aW9uIGFib3J0cyB0aGUgcHJvZ3JhbSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBib29sIHNlcmlhbF9oZHNfYWRkX2F0KGludCAgaW5kZXgsIGNvbnN0IGNoYXIqIGRldm5hbWUpCit7CisgICAgY2hhciBsYWJlbFszMl07CisKKyAgICBpZiAoIWRldm5hbWUgfHwgIXN0cmNtcChkZXZuYW1lLCJub25lIikpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKGluZGV4ID49IE1BWF9TRVJJQUxfUE9SVFMpIHsKKyAgICAgICAgUEFOSUMoInFlbXU6IGludmFsaWQgc2VyaWFsIGluZGV4IGZvciAlcyAoJWQgPj0gJWQpIiwKKyAgICAgICAgICAgICAgZGV2bmFtZSwgaW5kZXgsIE1BWF9TRVJJQUxfUE9SVFMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzZXJpYWxfaGRzW2luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgIFBBTklDKCJxZW11OiBpbnZhbGlkIHNlcmlhbCBpbmRleCBmb3IgJXMgKCVkOiBhbHJlYWR5IHRha2VuISkiLAorICAgICAgICAgICAgICBkZXZuYW1lLCBpbmRleCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc25wcmludGYobGFiZWwsIHNpemVvZihsYWJlbCksICJzZXJpYWwlZCIsIGluZGV4KTsKKyAgICBzZXJpYWxfaGRzW2luZGV4XSA9IHFlbXVfY2hyX29wZW4obGFiZWwsIGRldm5hbWUsIE5VTEwpOworICAgIGlmICghc2VyaWFsX2hkc1tpbmRleF0pIHsKKyAgICAgICAgUEFOSUMoInFlbXU6IGNvdWxkIG5vdCBvcGVuIHNlcmlhbCBkZXZpY2UgJyVzJyIsIGRldm5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLyogRmluZCBhIGZyZWUgc2xvdCBpbiB0aGUgZW11bGF0ZWQgc2VyaWFsIGRldmljZSB0YWJsZSwgYW5kIHJlZ2lzdGVyCisgKiBpdC4gUmV0dXJuIHRoZSBhbGxvY2F0ZWQgdGFibGUgaW5kZXguCisgKi8KK3N0YXRpYyBpbnQKK3NlcmlhbF9oZHNfYWRkKGNvbnN0IGNoYXIqIGRldm5hbWUpCit7CisgICAgaW50ICBpbmRleDsKKworICAgIC8qIEZpbmQgZmlyc3QgZnJlZSBzbG90ICovCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFYX1NFUklBTF9QT1JUUzsgaW5kZXgrKykgeworICAgICAgICBpZiAoc2VyaWFsX2hkc1tpbmRleF0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFzZXJpYWxfaGRzX2FkZF9hdChpbmRleCwgZGV2bmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQQU5JQygicWVtdTogdG9vIG1hbnkgc2VyaWFsIGRldmljZXMgcmVnaXN0ZXJlZCAoJWQpIiwgaW5kZXgpOworICAgIHJldHVybiAtMTsKK30KKworLy8gQ2FsbGJhY2sgZm9yIGFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZygpLgorc3RhdGljIHZvaWQgYW5kcm9pZF9hZGRfbmFuZF9pbWFnZSh2b2lkICpvcGFxdWUsIGNvbnN0IGNoYXIgKnBhcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgcGFydF9zaXplLCBjb25zdCBjaGFyICpwYXJ0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWRQYXJ0aXRpb25UeXBlIHBhcnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkb25seSkgeworICAvLyBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIGZvciBuYW5kX2FkZF9kZXYoKS4KKyAgLy8gVGFrZSBjYXJlIG9mIGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBpbiBmaWxlIG5hbWVzLgorICBjaGFyIHRtcFtQQVRIX01BWCAqIDIgKyAxXTsKKyAgc25wcmludGYodG1wLCBzaXplb2YgdG1wLCAiJXMsc2l6ZT0weCUiIFBSSXg2NCwgcGFydF9uYW1lLCBwYXJ0X3NpemUpOworCisgIGNoYXIgKmVzY2FwZWRfcGFydF9maWxlID0gcGF0aF9lc2NhcGVfcGF0aChwYXJ0X2ZpbGUpOworICBpZiAoZXNjYXBlZF9wYXJ0X2ZpbGUpIHsKKyAgICBwc3RyY2F0KHRtcCwgc2l6ZW9mIHRtcCwgIixmaWxlPSIpOworICAgIHBzdHJjYXQodG1wLCBzaXplb2YgdG1wLCBlc2NhcGVkX3BhcnRfZmlsZSk7CisgICAgZnJlZShlc2NhcGVkX3BhcnRfZmlsZSk7CisgIH0KKworICBpZiAocGFydF90eXBlID09IEFORFJPSURfUEFSVElUSU9OX1RZUEVfRVhUNCkgeworICAgIC8vIFVzaW5nIGEgbmFuZCBkZXZpY2UgdG8gYXBwcm94aW1hdGUgYSBibG9jayBkZXZpY2UgdW50aWwgZnVsbAorICAgIC8vIHN1cHBvcnQgaXMgYWRkZWQuCisgICAgcHN0cmNhdCh0bXAsIHNpemVvZiB0bXAsICIscGFnZXNpemU9NTEyLGV4dHJhc2l6ZT0wIik7CisgIH0KKworICBpZiAocmVhZG9ubHkpIHsKKyAgICBwc3RyY2F0KHRtcCwgc2l6ZW9mKHRtcCksICIscmVhZG9ubHkiKTsKKyAgfQorCisgIG5hbmRfYWRkX2Rldih0bXApOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX2luaXRfbWV0cmljcyhpbnQgb3BlbmdsX2FsaXZlKQoreworICAgIGFuZHJvaWRfbWV0cmljc19zdGFydChFTVVMQVRPUl9WRVJTSU9OX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRU1VTEFUT1JfRlVMTF9WRVJTSU9OX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUUVNVV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Jhc2VfcG9ydCk7CisgICAgYW5kcm9pZF9tZXRyaWNzX3JlcG9ydF9jb21tb25faW5mbyhvcGVuZ2xfYWxpdmUpOworfQorCitzdGF0aWMgdm9pZCBhbmRyb2lkX3RlYXJkb3duX21ldHJpY3MoKQoreworICAgIGFuZHJvaWRfbWV0cmljc19zdG9wKCk7Cit9CisKKy8vIFNhdmUgU3lzdGVtIGJvb3QgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21tYW5kIGxpbmUKKyNkZWZpbmUgTUFYX05fQ01EX1BST1BTIDE2CitzdGF0aWMgY29uc3QgY2hhciogY21kX3Byb3BzW01BWF9OX0NNRF9QUk9QU107CitzdGF0aWMgICAgICAgaW50ICAgbl9jbWRfcHJvcHMgPSAwOworCitzdGF0aWMgdm9pZCBzYXZlX2NtZF9ib290X3Byb3BlcnR5KGNvbnN0IGNoYXIqIHByb3BTdHIpIHsKKyAgICBpZiAobl9jbWRfcHJvcHMgPj0gTUFYX05fQ01EX1BST1BTKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgY29tbWFuZC1saW5lIGJvb3QgcHJvcGVydGllcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgcHJvcGVydHkgaXMgaWdub3JlZDogXCIlc1wiXG4iLCBwcm9wU3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjbWRfcHJvcHNbbl9jbWRfcHJvcHMrK10gPSBwcm9wU3RyOworfQorCisvLyBQcm92aWRlIHRoZSBzYXZlZCBTeXN0ZW0gYm9vdCBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbW1hbmQgbGluZQorc3RhdGljIHZvaWQgcHJvY2Vzc19jbWRfYm9vdF9wcm9wZXJ0aWVzKCkgeworICAgIGludCBpZHg7CisgICAgZm9yKGlkeCA9IDA7IGlkeDxuX2NtZF9wcm9wczsgaWR4KyspIHsKKyAgICAgICAgYm9vdF9wcm9wZXJ0eV9wYXJzZV9vcHRpb24oY21kX3Byb3BzW2lkeF0pOworICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICoqZW52cCkKK3sKKyAgICBjb25zdCBjaGFyICpnZGJzdHViX2RldiA9IE5VTEw7CisgICAgdWludDMyX3QgYm9vdF9kZXZpY2VzX2JpdG1hcCA9IDA7CisgICAgaW50IGk7CisgICAgaW50IHNuYXBzaG90LCBsaW51eF9ib290LCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSBuZXRfYm9vdDsKKyAgICBjb25zdCBjaGFyICppY291bnRfb3B0aW9uID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICppbml0cmRfZmlsZW5hbWU7CisgICAgY29uc3QgY2hhciAqa2VybmVsX2ZpbGVuYW1lLCAqa2VybmVsX2NtZGxpbmU7CisgICAgY29uc3QgY2hhciAqYm9vdF9kZXZpY2VzID0gIiI7CisgICAgRGlzcGxheVN0YXRlICpkczsKKyAgICBEaXNwbGF5Q2hhbmdlTGlzdGVuZXIgKmRjbDsKKyAgICBpbnQgY3lscywgaGVhZHMsIHNlY3MsIHRyYW5zbGF0aW9uOworICAgIFFlbXVPcHRzICpoZGFfb3B0cyA9IE5VTEw7CisgICAgUWVtdU9wdHMgKmhkYl9vcHRzID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpuZXRfY2xpZW50c1tNQVhfTkVUX0NMSUVOVFNdOworICAgIGludCBuYl9uZXRfY2xpZW50czsKKyAgICBpbnQgb3B0aW5kOworICAgIGNvbnN0IGNoYXIgKnIsICpvcHRhcmc7CisgICAgQ2hhckRyaXZlclN0YXRlICptb25pdG9yX2hkID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICptb25pdG9yX2RldmljZTsKKyAgICBjb25zdCBjaGFyICpzZXJpYWxfZGV2aWNlc1tNQVhfU0VSSUFMX1BPUlRTXTsKKyAgICBpbnQgc2VyaWFsX2RldmljZV9pbmRleDsKKyAgICBjb25zdCBjaGFyICpwYXJhbGxlbF9kZXZpY2VzW01BWF9QQVJBTExFTF9QT1JUU107CisgICAgaW50IHBhcmFsbGVsX2RldmljZV9pbmRleDsKKyAgICBjb25zdCBjaGFyICp2aXJ0aW9fY29uc29sZXNbTUFYX1ZJUlRJT19DT05TT0xFU107CisgICAgaW50IHZpcnRpb19jb25zb2xlX2luZGV4OworICAgIGNvbnN0IGNoYXIgKmxvYWR2bSA9IE5VTEw7CisgICAgUUVNVU1hY2hpbmUgKm1hY2hpbmU7CisgICAgY29uc3QgY2hhciAqY3B1X21vZGVsOworICAgIGludCB0Yl9zaXplOworICAgIGNvbnN0IGNoYXIgKnBpZF9maWxlID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICppbmNvbWluZyA9IE5VTEw7CisgICAgY29uc3QgY2hhciogbG9nX21hc2sgPSBOVUxMOworICAgIGNvbnN0IGNoYXIqIGxvZ19maWxlID0gTlVMTDsKKyAgICBDUFVTdGF0ZSAqY3B1OworICAgIGludCBzaG93X3ZuY19wb3J0ID0gMDsKKyAgICBDSW5pRmlsZSAqaHdfaW5pID0gTlVMTDsKKyAgICBpbnQgYWRiX2F1dGggPSAxOworCisgICAgLyogRW5zdXJlIExvb3BlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB0aHJlYWQgaXMgYmFzZWQgb24gdGhlIFFFTVUKKyAgICAgKiBtYWluIGxvb3AuICovCisgICAgcWVtdV9sb29wZXJfc2V0Rm9yVGhyZWFkKCk7CisKKyAgICBpbml0X2Nsb2NrcygpOworCisgICAgcWVtdV9jYWNoZV91dGlsc19pbml0KCk7CisKKyAgICBRTElTVF9JTklUICgmdm1fY2hhbmdlX3N0YXRlX2hlYWQpOworICAgIG9zX3NldHVwX2Vhcmx5X3NpZ25hbF9oYW5kbGluZygpOworCisgICAgbW9kdWxlX2NhbGxfaW5pdChNT0RVTEVfSU5JVF9NQUNISU5FKTsKKyAgICBtYWNoaW5lID0gZmluZF9kZWZhdWx0X21hY2hpbmUoKTsKKyAgICBjcHVfbW9kZWwgPSBOVUxMOworICAgIGluaXRyZF9maWxlbmFtZSA9IE5VTEw7CisgICAgcmFtX3NpemUgPSAwOworICAgIHNuYXBzaG90ID0gMDsKKyAgICBrZXJuZWxfZmlsZW5hbWUgPSBOVUxMOworICAgIGtlcm5lbF9jbWRsaW5lID0gIiI7CisKKyAgICBjeWxzID0gaGVhZHMgPSBzZWNzID0gMDsKKyAgICB0cmFuc2xhdGlvbiA9IEJJT1NfQVRBX1RSQU5TTEFUSU9OX0FVVE87CisgICAgbW9uaXRvcl9kZXZpY2UgPSAidmM6ODBDeDI0QyI7CisKKyAgICBzZXJpYWxfZGV2aWNlc1swXSA9ICJ2Yzo4MEN4MjRDIjsKKyAgICBmb3IoaSA9IDE7IGkgPCBNQVhfU0VSSUFMX1BPUlRTOyBpKyspCisgICAgICAgIHNlcmlhbF9kZXZpY2VzW2ldID0gTlVMTDsKKyAgICBzZXJpYWxfZGV2aWNlX2luZGV4ID0gMDsKKworICAgIHBhcmFsbGVsX2RldmljZXNbMF0gPSAidmM6ODBDeDI0QyI7CisgICAgZm9yKGkgPSAxOyBpIDwgTUFYX1BBUkFMTEVMX1BPUlRTOyBpKyspCisgICAgICAgIHBhcmFsbGVsX2RldmljZXNbaV0gPSBOVUxMOworICAgIHBhcmFsbGVsX2RldmljZV9pbmRleCA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfVklSVElPX0NPTlNPTEVTOyBpKyspCisgICAgICAgIHZpcnRpb19jb25zb2xlc1tpXSA9IE5VTEw7CisgICAgdmlydGlvX2NvbnNvbGVfaW5kZXggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OT0RFUzsgaSsrKSB7CisgICAgICAgIG5vZGVfbWVtW2ldID0gMDsKKyAgICAgICAgbm9kZV9jcHVtYXNrW2ldID0gMDsKKyAgICB9CisKKyAgICBuYl9uZXRfY2xpZW50cyA9IDA7CisjaWZkZWYgTUFYX0RSSVZFUworICAgIG5iX2RyaXZlcyA9IDA7CisgICAgbmJfZHJpdmVzX29wdCA9IDA7CisjZW5kaWYKKyAgICBuYl9udW1hX25vZGVzID0gMDsKKworICAgIG5iX25pY3MgPSAwOworCisgICAgdGJfc2l6ZSA9IDA7CisgICAgYXV0b3N0YXJ0PSAxOworCisgICAgcmVnaXN0ZXJfd2F0Y2hkb2dzKCk7CisKKyAgICAvKiBtYWtlIHN1cmUgcWVtdWQgaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGFueSBjYWxscyB0byBpdCAqLworICAgIGFuZHJvaWRfcWVtdTFfcWVtdWRfaW5pdCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBib290IHByb3BlcnRpZXMuICovCisgICAgYm9vdF9wcm9wZXJ0eV9pbml0X3NlcnZpY2UoKTsKKyAgICBhbmRyb2lkX2h3X2NvbnRyb2xfaW5pdCgpOworCisgICAgc29ja2V0X2RyYWluZXJfc3RhcnQobG9vcGVyX2dldEZvclRocmVhZCgpKTsKKyAgICBhbmRyb2lkX3dlYXJfYWdlbnRfc3RhcnQobG9vcGVyX2dldEZvclRocmVhZCgpKTsKKworI2lmZGVmIENPTkZJR19LVk0KKyAgICAvKiBCeSBkZWZhdWx0LCBmb3JjZSBhdXRvLWRldGVjdGlvbiBmb3Iga3ZtICovCisgICAga3ZtX2FsbG93ZWQgPSAtMTsKKyNlbmRpZgorCisgICAgb3B0aW5kID0gMTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaWYgKG9wdGluZCA+PSBhcmdjKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHIgPSBhcmd2W29wdGluZF07CisgICAgICAgIGlmIChyWzBdICE9ICctJykgeworICAgICAgICAgICAgaGRhX29wdHMgPSBkcml2ZV9hZGQoYXJndltvcHRpbmQrK10sIEhEX0FMSUFTLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IFFFTVVPcHRpb24gKnBvcHQ7CisKKyAgICAgICAgICAgIG9wdGluZCsrOworICAgICAgICAgICAgLyogVHJlYXQgLS1mb28gdGhlIHNhbWUgYXMgLWZvby4gICovCisgICAgICAgICAgICBpZiAoclsxXSA9PSAnLScpCisgICAgICAgICAgICAgICAgcisrOworICAgICAgICAgICAgcG9wdCA9IHFlbXVfb3B0aW9uczsKKyAgICAgICAgICAgIGZvcig7OykgeworICAgICAgICAgICAgICAgIGlmICghcG9wdC0+bmFtZSkgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygiJXM6IGludmFsaWQgb3B0aW9uIC0tICclcyciLCBhcmd2WzBdLCByKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHBvcHQtPm5hbWUsIHIgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcG9wdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBvcHQtPmZsYWdzICYgSEFTX0FSRykgeworICAgICAgICAgICAgICAgIGlmIChvcHRpbmQgPj0gYXJnYykgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygiJXM6IG9wdGlvbiAnJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiwgYXJndlswXSwgcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3B0YXJnID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoKHBvcHQtPmluZGV4KSB7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX006CisgICAgICAgICAgICAgICAgbWFjaGluZSA9IGZpbmRfbWFjaGluZShvcHRhcmcpOworICAgICAgICAgICAgICAgIGlmICghbWFjaGluZSkgeworICAgICAgICAgICAgICAgICAgICBRRU1VTWFjaGluZSAqbTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTdXBwb3J0ZWQgbWFjaGluZXMgYXJlOlxuIik7CisgICAgICAgICAgICAgICAgICAgIGZvcihtID0gZmlyc3RfbWFjaGluZTsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlLTEwcyAlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm5hbWUsIG0tPmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aXNfZGVmYXVsdCA/ICIgKGRlZmF1bHQpIiA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKm9wdGFyZyAhPSAnPycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBTklDKCJJbnZhbGlkIG1hY2hpbmUgcGFyYW1ldGVyOiAlcyIsIG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFFFTVVfRVhJVCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fY3B1OgorICAgICAgICAgICAgICAgIC8qIGh3IGluaXRpYWxpemF0aW9uIHdpbGwgY2hlY2sgdGhpcyAqLworICAgICAgICAgICAgICAgIGlmICgqb3B0YXJnID09ICc/JykgeworLyogWFhYOiBpbXBsZW1lbnQgeHh4X2NwdV9saXN0IGZvciB0YXJnZXRzIHRoYXQgc3RpbGwgbWlzcyBpdCAqLworI2lmIGRlZmluZWQoY3B1X2xpc3QpCisgICAgICAgICAgICAgICAgICAgIGNwdV9saXN0KHN0ZG91dCwgJmZwcmludGYpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIFFFTVVfRVhJVCgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcHVfbW9kZWwgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9pbml0cmQ6CisgICAgICAgICAgICAgICAgaW5pdHJkX2ZpbGVuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9oZGE6CisgICAgICAgICAgICAgICAgaWYgKGN5bHMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgaGRhX29wdHMgPSBkcml2ZV9hZGQob3B0YXJnLCBIRF9BTElBUywgMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoZGFfb3B0cyA9IGRyaXZlX2FkZChvcHRhcmcsIEhEX0FMSUFTCisJCQkgICAgICIsY3lscz0lZCxoZWFkcz0lZCxzZWNzPSVkJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBjeWxzLCBoZWFkcywgc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPT0gQklPU19BVEFfVFJBTlNMQVRJT05fTEJBID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsdHJhbnM9bGJhIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uID09IEJJT1NfQVRBX1RSQU5TTEFUSU9OX05PTkUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIix0cmFucz1ub25lIiA6ICIiKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2hkYjoKKyAgICAgICAgICAgICAgICBoZGJfb3B0cyA9IGRyaXZlX2FkZChvcHRhcmcsIEhEX0FMSUFTLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9oZGM6CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2hkZDoKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQob3B0YXJnLCBIRF9BTElBUywgcG9wdC0+aW5kZXggLSBRRU1VX09QVElPTl9oZGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9kcml2ZToKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQoTlVMTCwgIiVzIiwgb3B0YXJnKTsKKwkgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9tdGRibG9jazoKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQob3B0YXJnLCBNVERfQUxJQVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9zZDoKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQob3B0YXJnLCBTRF9BTElBUyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3BmbGFzaDoKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQob3B0YXJnLCBQRkxBU0hfQUxJQVMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9zbmFwc2hvdDoKKyAgICAgICAgICAgICAgICBzbmFwc2hvdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2hkYWNoczoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICAgICAgICAgICAgICAgIHAgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgICAgIGN5bHMgPSBzdHJ0b2wocCwgKGNoYXIgKiopJnAsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoY3lscyA8IDEgfHwgY3lscyA+IDE2MzgzKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaHNfZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwICE9ICcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hzX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgaGVhZHMgPSBzdHJ0b2wocCwgKGNoYXIgKiopJnAsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZHMgPCAxIHx8IGhlYWRzID4gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNoc19mYWlsOworICAgICAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjaHNfZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICBzZWNzID0gc3RydG9sKHAsIChjaGFyICoqKSZwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3MgPCAxIHx8IHNlY3MgPiA2MykKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hzX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHAsICJub25lIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChwLCAibGJhIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9MQkE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKHAsICJhdXRvIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gPSBCSU9TX0FUQV9UUkFOU0xBVElPTl9BVVRPOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gY2hzX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKnAgIT0gJ1wwJykgeworICAgICAgICAgICAgICAgICAgICBjaHNfZmFpbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiBpbnZhbGlkIHBoeXNpY2FsIENIUyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisJCSAgICBpZiAoaGRhX29wdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBudW1bMTZdOworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYobnVtLCBzaXplb2YobnVtKSwgIiVkIiwgY3lscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBxZW11X29wdF9zZXQoaGRhX29wdHMsICJjeWxzIiwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKG51bSwgc2l6ZW9mKG51bSksICIlZCIsIGhlYWRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X3NldChoZGFfb3B0cywgImhlYWRzIiwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKG51bSwgc2l6ZW9mKG51bSksICIlZCIsIHNlY3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9vcHRfc2V0KGhkYV9vcHRzLCAic2VjcyIsIG51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24gPT0gQklPU19BVEFfVFJBTlNMQVRJT05fTEJBKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFlbXVfb3B0X3NldChoZGFfb3B0cywgInRyYW5zIiwgImxiYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0aW9uID09IEJJT1NfQVRBX1RSQU5TTEFUSU9OX05PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWVtdV9vcHRfc2V0KGhkYV9vcHRzLCAidHJhbnMiLCAibm9uZSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9udW1hOgorICAgICAgICAgICAgICAgIGlmIChuYl9udW1hX25vZGVzID49IE1BWF9OT0RFUykgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygicWVtdTogdG9vIG1hbnkgTlVNQSBub2RlcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnVtYV9hZGQob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbm9ncmFwaGljOgorICAgICAgICAgICAgICAgIGRpc3BsYXlfdHlwZSA9IERUX05PR1JBUEhJQzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDT05GSUdfQ1VSU0VTCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2N1cnNlczoKKyAgICAgICAgICAgICAgICBkaXNwbGF5X3R5cGUgPSBEVF9DVVJTRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fcG9ydHJhaXQ6CisgICAgICAgICAgICAgICAgZ3JhcGhpY19yb3RhdGUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9rZXJuZWw6CisgICAgICAgICAgICAgICAga2VybmVsX2ZpbGVuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9hcHBlbmQ6CisgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmUgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2Nkcm9tOgorICAgICAgICAgICAgICAgIGRyaXZlX2FkZChvcHRhcmcsIENEUk9NX0FMSUFTKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYm9vdDoKKyAgICAgICAgICAgICAgICBib290X2RldmljZXMgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgLyogV2UganVzdCBkbyBzb21lIGdlbmVyaWMgY29uc2lzdGVuY3kgY2hlY2tzICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBDb3VsZCBlYXNpbHkgYmUgZXh0ZW5kZWQgdG8gNjQgZGV2aWNlcyBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcDsKKworICAgICAgICAgICAgICAgICAgICBib290X2RldmljZXNfYml0bWFwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gYm9vdF9kZXZpY2VzOyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG93ZWQgYm9vdCBkZXZpY2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGEgYiAgICAgOiBmbG9wcHkgZGlzayBkcml2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGMgLi4uIGYgOiBJREUgZGlzayBkcml2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGcgLi4uIG0gOiBtYWNoaW5lIGltcGxlbWVudGF0aW9uIGRlcGVuZGFudCBkcml2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIG4gLi4uIHAgOiBuZXR3b3JrIGRldmljZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEl0J3MgdXAgdG8gZWFjaCBtYWNoaW5lIGltcGxlbWVudGF0aW9uIHRvIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGUgZ2l2ZW4gYm9vdCBkZXZpY2VzIG1hdGNoIHRoZSBhY3R1YWwgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGltcGxlbWVudGF0aW9uIGFuZCBmaXJtd2FyZSBmZWF0dXJlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwIDwgJ2EnIHx8ICpwID4gJ3EnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFOSUMoIkludmFsaWQgYm9vdCBkZXZpY2UgJyVjJyIsICpwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib290X2RldmljZXNfYml0bWFwICYgKDEgPDwgKCpwIC0gJ2EnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5JQygiQm9vdCBkZXZpY2UgJyVjJyB3YXMgZ2l2ZW4gdHdpY2UiLCpwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RfZGV2aWNlc19iaXRtYXAgfD0gMSA8PCAoKnAgLSAnYScpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9mZGE6CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2ZkYjoKKyAgICAgICAgICAgICAgICBkcml2ZV9hZGQob3B0YXJnLCBGRF9BTElBUywgcG9wdC0+aW5kZXggLSBRRU1VX09QVElPTl9mZGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX25vX2ZkX2Jvb3RjaGs6CisgICAgICAgICAgICAgICAgZmRfYm9vdGNoayA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbmV0OgorICAgICAgICAgICAgICAgIGlmIChuYl9uZXRfY2xpZW50cyA+PSBNQVhfTkVUX0NMSUVOVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgUEFOSUMoInFlbXU6IHRvbyBtYW55IG5ldHdvcmsgY2xpZW50cyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV0X2NsaWVudHNbbmJfbmV0X2NsaWVudHNdID0gb3B0YXJnOworICAgICAgICAgICAgICAgIG5iX25ldF9jbGllbnRzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWZkZWYgQ09ORklHX1NMSVJQCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3RmdHA6CisJCXRmdHBfcHJlZml4ID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9ib290cDoKKyAgICAgICAgICAgICAgICBib290cF9maWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fcmVkaXI6CisgICAgICAgICAgICAgICAgbmV0X3NsaXJwX3JlZGlyKE5VTEwsIG9wdGFyZywgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBIQVNfQVVESU8KKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYXVkaW9faGVscDoKKyAgICAgICAgICAgICAgICBBVURfaGVscCAoKTsKKyAgICAgICAgICAgICAgICBRRU1VX0VYSVQoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NvdW5kaHc6CisgICAgICAgICAgICAgICAgc2VsZWN0X3NvdW5kaHcgKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05faDoKKyAgICAgICAgICAgICAgICBxZW11X2hlbHAoKTsKKyAgICAgICAgICAgICAgICBRRU1VX0VYSVQoMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3ZlcnNpb246CisgICAgICAgICAgICAgICAgdmVyc2lvbigpOworICAgICAgICAgICAgICAgIFFFTVVfRVhJVCgwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbTogeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIGNoYXIgKnB0cjsKKworICAgICAgICAgICAgICAgIHZhbHVlID0gc3RydG91bChvcHRhcmcsICZwdHIsIDEwKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCpwdHIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgJ00nOiBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IDIwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdHJzogY2FzZSAnZyc6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlIDw8PSAzMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUEFOSUMoInFlbXU6IGludmFsaWQgcmFtIHNpemU6ICVzIiwgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogT24gMzItYml0IGhvc3RzLCBRRU1VIGlzIGxpbWl0ZWQgYnkgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gKDIwNDcgPDwgMjApICYmIEhPU1RfTE9OR19CSVRTID09IDMyKSB7CisgICAgICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiBhdCBtb3N0IDIwNDcgTUIgUkFNIGNhbiBiZSBzaW11bGF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSAodWludDY0X3QpKHJhbV9hZGRyX3QpdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgUEFOSUMoInFlbXU6IHJhbSBzaXplIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmFtX3NpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZDoKKyAgICAgICAgICAgICAgICBsb2dfbWFzayA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fczoKKyAgICAgICAgICAgICAgICBnZGJzdHViX2RldiA9ICJ0Y3A6OiIgREVGQVVMVF9HREJTVFVCX1BPUlQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2dkYjoKKyAgICAgICAgICAgICAgICBnZGJzdHViX2RldiA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fTDoKKyAgICAgICAgICAgICAgICBkYXRhX2RpciA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYmlvczoKKyAgICAgICAgICAgICAgICBiaW9zX25hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NpbmdsZXN0ZXA6CisgICAgICAgICAgICAgICAgc2luZ2xlc3RlcCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX1M6CisgICAgICAgICAgICAgICAgYXV0b3N0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZm5kZWYgX1dJTjMyCisJICAgIGNhc2UgUUVNVV9PUFRJT05fazoKKwkJa2V5Ym9hcmRfbGF5b3V0ID0gb3B0YXJnOworCQlicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9sb2NhbHRpbWU6CisgICAgICAgICAgICAgICAgcnRjX3V0YyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3ZnYToKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdF92Z2FodyAob3B0YXJnKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgZGVmaW5lZChUQVJHRVRfUFBDKSB8fCBkZWZpbmVkKFRBUkdFVF9TUEFSQykKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnA7CisgICAgICAgICAgICAgICAgICAgIGludCB3LCBoLCBkZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgcCA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICAgICAgdyA9IHN0cnRvbChwLCAoY2hhciAqKikmcCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAodyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBQQU5JQygicWVtdTogaW52YWxpZCByZXNvbHV0aW9uIG9yIGRlcHRoIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKnAgIT0gJ3gnKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBncmFwaGljX2Vycm9yOworICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgICAgIGggPSBzdHJ0b2wocCwgKGNoYXIgKiopJnAsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGggPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ3JhcGhpY19lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwID09ICd4JykgeworICAgICAgICAgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBzdHJ0b2wocCwgKGNoYXIgKiopJnAsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXB0aCAhPSA4ICYmIGRlcHRoICE9IDE1ICYmIGRlcHRoICE9IDE2ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIT0gMjQgJiYgZGVwdGggIT0gMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBncmFwaGljX2Vycm9yOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCpwID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZ3JhcGhpY19kZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ3JhcGhpY19lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNfd2lkdGggPSB3OworICAgICAgICAgICAgICAgICAgICBncmFwaGljX2hlaWdodCA9IGg7CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNfZGVwdGggPSBkZXB0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZWNocjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnI7CisgICAgICAgICAgICAgICAgICAgIHRlcm1fZXNjYXBlX2NoYXIgPSBzdHJ0b2wob3B0YXJnLCAmciwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyID09IG9wdGFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQmFkIGFyZ3VtZW50IHRvIGVjaHJcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX21vbml0b3I6CisgICAgICAgICAgICAgICAgbW9uaXRvcl9kZXZpY2UgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NlcmlhbDoKKyAgICAgICAgICAgICAgICBpZiAoc2VyaWFsX2RldmljZV9pbmRleCA+PSBNQVhfU0VSSUFMX1BPUlRTKSB7CisgICAgICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiB0b28gbWFueSBzZXJpYWwgcG9ydHMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcmlhbF9kZXZpY2VzW3NlcmlhbF9kZXZpY2VfaW5kZXhdID0gb3B0YXJnOworICAgICAgICAgICAgICAgIHNlcmlhbF9kZXZpY2VfaW5kZXgrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fd2F0Y2hkb2c6CisgICAgICAgICAgICAgICAgaSA9IHNlbGVjdF93YXRjaGRvZyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQQU5JQygiSW52YWxpZCB3YXRjaGRvZyBwYXJhbWV0ZXI6ICVzIiwgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUUVNVV9FWElUKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl93YXRjaGRvZ19hY3Rpb246CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdF93YXRjaGRvZ19hY3Rpb24ob3B0YXJnKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygiVW5rbm93biAtd2F0Y2hkb2ctYWN0aW9uIHBhcmFtZXRlciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3ZpcnRpb2NvbjoKKyAgICAgICAgICAgICAgICBpZiAodmlydGlvX2NvbnNvbGVfaW5kZXggPj0gTUFYX1ZJUlRJT19DT05TT0xFUykgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygicWVtdTogdG9vIG1hbnkgdmlydGlvIGNvbnNvbGVzIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aXJ0aW9fY29uc29sZXNbdmlydGlvX2NvbnNvbGVfaW5kZXhdID0gb3B0YXJnOworICAgICAgICAgICAgICAgIHZpcnRpb19jb25zb2xlX2luZGV4Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3BhcmFsbGVsOgorICAgICAgICAgICAgICAgIGlmIChwYXJhbGxlbF9kZXZpY2VfaW5kZXggPj0gTUFYX1BBUkFMTEVMX1BPUlRTKSB7CisgICAgICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiB0b28gbWFueSBwYXJhbGxlbCBwb3J0cyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGFyYWxsZWxfZGV2aWNlc1twYXJhbGxlbF9kZXZpY2VfaW5kZXhdID0gb3B0YXJnOworICAgICAgICAgICAgICAgIHBhcmFsbGVsX2RldmljZV9pbmRleCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9sb2Fkdm06CisgICAgICAgICAgICAgICAgbG9hZHZtID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9zYXZldm1fb25fZXhpdDoKKyAgICAgICAgICAgICAgICBzYXZldm1fb25fZXhpdCA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZnVsbF9zY3JlZW46CisgICAgICAgICAgICAgICAgZnVsbF9zY3JlZW4gPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19TREwKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbm9fZnJhbWU6CisgICAgICAgICAgICAgICAgbm9fZnJhbWUgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9hbHRfZ3JhYjoKKyAgICAgICAgICAgICAgICBhbHRfZ3JhYiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX25vX3F1aXQ6CisgICAgICAgICAgICAgICAgbm9fcXVpdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NkbDoKKyAgICAgICAgICAgICAgICBkaXNwbGF5X3R5cGUgPSBEVF9TREw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fcGlkZmlsZToKKyAgICAgICAgICAgICAgICBwaWRfZmlsZSA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fY29kZV9wcm9maWxlOgorICAgICAgICAgICAgICAgIGNvZGVfcHJvZmlsZV9kaXJuYW1lID0gb3B0YXJnOworICAgICAgICAgICAgICAgIHByaW50ZigiUHJvZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiAlc1xuIiwgY29kZV9wcm9maWxlX2Rpcm5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIFRBUkdFVF9JMzg2CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3dpbjJrX2hhY2s6CisgICAgICAgICAgICAgICAgd2luMmtfaW5zdGFsbF9oYWNrID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fcnRjX3RkX2hhY2s6CisgICAgICAgICAgICAgICAgcnRjX3RkX2hhY2sgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmbmRlZiBDT05GSUdfQU5EUk9JRAorICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9hY3BpdGFibGU6CisgICAgICAgICAgICAgICAgaWYoYWNwaV90YWJsZV9hZGQob3B0YXJnKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUEFOSUMoIldyb25nIGFjcGkgdGFibGUgcHJvdmlkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NtYmlvczoKKyAgICAgICAgICAgICAgICBkb19zbWJpb3Nfb3B0aW9uKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfS1ZNCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2VuYWJsZV9rdm06CisgICAgICAgICAgICAgICAga3ZtX2FsbG93ZWQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9kaXNhYmxlX2t2bToKKyAgICAgICAgICAgICAgICBrdm1fYWxsb3dlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0tWTSAqLworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9zbXA6CisgICAgICAgICAgICAgICAgc21wX2NwdXMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHNtcF9jcHVzICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDbGFzc2ljIHFlbXUgZG9lcyBub3Qgc3VwcG9ydCBTTVA7ICclcycgb3B0aW9uIGlzIGlnbm9yZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgc21wX2NwdXMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBRRU1VX09QVElPTl92bmM6CisgICAgICAgICAgICAgICAgZGlzcGxheV90eXBlID0gRFRfVk5DOworCQl2bmNfZGlzcGxheSA9IG9wdGFyZzsKKwkJYnJlYWs7CisjaWZkZWYgVEFSR0VUX0kzODYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbm9fYWNwaToKKyAgICAgICAgICAgICAgICBhY3BpX2VuYWJsZWQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9ub19ocGV0OgorICAgICAgICAgICAgICAgIG5vX2hwZXQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9ub192aXJ0aW9fYmFsbG9vbjoKKyAgICAgICAgICAgICAgICBub192aXJ0aW9fYmFsbG9vbiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbm9fcmVib290OgorICAgICAgICAgICAgICAgIG5vX3JlYm9vdCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX25vX3NodXRkb3duOgorICAgICAgICAgICAgICAgIG5vX3NodXRkb3duID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fc2hvd19jdXJzb3I6CisgICAgICAgICAgICAgICAgY3Vyc29yX2hpZGUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl91dWlkOgorICAgICAgICAgICAgICAgIGlmKHFlbXVfdXVpZF9wYXJzZShvcHRhcmcsIHFlbXVfdXVpZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFBBTklDKCJGYWlsIHRvIHBhcnNlIFVVSUQgc3RyaW5nLiBXcm9uZyBmb3JtYXQuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKwkgICAgY2FzZSBRRU1VX09QVElPTl9vcHRpb25fcm9tOgorCQlpZiAobmJfb3B0aW9uX3JvbXMgPj0gTUFYX09QVElPTl9ST01TKSB7CisJCSAgICBQQU5JQygiVG9vIG1hbnkgb3B0aW9uIFJPTXMiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisJCW9wdGlvbl9yb21bbmJfb3B0aW9uX3JvbXNdID0gb3B0YXJnOworCQluYl9vcHRpb25fcm9tcysrOworCQlicmVhazsKKyNpZiBkZWZpbmVkKFRBUkdFVF9BUk0pIHx8IGRlZmluZWQoVEFSR0VUX002OEspCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3NlbWlob3N0aW5nOgorICAgICAgICAgICAgICAgIHNlbWlob3N0aW5nX2VuYWJsZWQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX25hbWU6CisgICAgICAgICAgICAgICAgcWVtdV9uYW1lID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoVEFSR0VUX1NQQVJDKSB8fCBkZWZpbmVkKFRBUkdFVF9QUEMpCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3Byb21fZW52OgorICAgICAgICAgICAgICAgIGlmIChuYl9wcm9tX2VudnMgPj0gTUFYX1BST01fRU5WUykgeworICAgICAgICAgICAgICAgICAgICBQQU5JQygiVG9vIG1hbnkgcHJvbSB2YXJpYWJsZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb21fZW52c1tuYl9wcm9tX2VudnNdID0gb3B0YXJnOworICAgICAgICAgICAgICAgIG5iX3Byb21fZW52cysrOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgVEFSR0VUX0FSTQorICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9vbGRfcGFyYW06CisgICAgICAgICAgICAgICAgb2xkX3BhcmFtID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9jbG9jazoKKyAgICAgICAgICAgICAgICBjb25maWd1cmVfYWxhcm1zKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3N0YXJ0ZGF0ZToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0bSB0bTsKKyAgICAgICAgICAgICAgICAgICAgdGltZV90IHJ0Y19zdGFydF9kYXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAibm93IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ0Y19kYXRlX29mZnNldCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihvcHRhcmcsICIlZC0lZC0lZFQlZDolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtLnRtX3llYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtLnRtX21vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG0udG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG0udG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG0udG1fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bS50bV9zZWMpID09IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPSyAqLworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzc2NhbmYob3B0YXJnLCAiJWQtJWQtJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtLnRtX3llYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG0udG1fbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtLnRtX21kYXkpID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS50bV9ob3VyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS50bV9taW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLnRtX3NlYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZGF0ZV9mYWlsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdG0udG1feWVhciAtPSAxOTAwOworICAgICAgICAgICAgICAgICAgICAgICAgdG0udG1fbW9uLS07CisgICAgICAgICAgICAgICAgICAgICAgICBydGNfc3RhcnRfZGF0ZSA9IG1rdGltZWdtKCZ0bSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnRjX3N0YXJ0X2RhdGUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfZmFpbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5JQygiSW52YWxpZCBkYXRlIGZvcm1hdC4gVmFsaWQgZm9ybWF0IGFyZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInbm93JyBvciAnMjAwNi0wNi0xN1QxNjowMToyMScgb3IgJzIwMDYtMDYtMTcnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBydGNfZGF0ZV9vZmZzZXQgPSB0aW1lKE5VTEwpIC0gcnRjX3N0YXJ0X2RhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICAgICAgLyogVXNlciBtb2RlIG5ldHdvcmsgc3RhY2sgcmVzdHJpY3Rpb25zICovCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2Ryb3BfdWRwOgorICAgICAgICAgICAgICAgIHNsaXJwX2Ryb3BfdWRwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2Ryb3BfdGNwOgorICAgICAgICAgICAgICAgIHNsaXJwX2Ryb3BfdGNwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2FsbG93X3RjcDoKKyAgICAgICAgICAgICAgICBpZiAoIXNsaXJwX2FsbG93KG9wdGFyZywgSVBQUk9UT19UQ1ApKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYWxsb3dfdWRwOgorICAgICAgICAgICAgICAgIGlmICghc2xpcnBfYWxsb3cob3B0YXJnLCBJUFBST1RPX1VEUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZHJvcF9sb2c6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGSUxFKiBkcm9wX2xvZ19mZDsKKyAgICAgICAgICAgICAgICAgICAgZHJvcF9sb2dfZmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgICAgIGRyb3BfbG9nX2ZkID0gZm9wZW4ob3B0YXJnLCAidysiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWRyb3BfbG9nX2ZkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGRyb3AgbG9nOiAlc1xuIiwgb3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2xpcnBfZHJvcF9sb2dfZmQoZHJvcF9sb2dfZmQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9kbnNfbG9nOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRklMRSogZG5zX2xvZ19mZDsKKyAgICAgICAgICAgICAgICAgICAgZG5zX2xvZ19maWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgICAgICAgICAgICAgZG5zX2xvZ19mZCA9IGZvcGVuKG9wdGFyZywgIndiKyIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChkbnNfbG9nX2ZkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZG5zIGxvZzogJXNcbiIsIG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHNsaXJwX2Ruc19sb2dfZmQoZG5zX2xvZ19mZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbWF4X2Ruc19jb25uczoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZG5zX2Nvbm5zID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlX2ludChvcHRhcmcsICZtYXhfZG5zX2Nvbm5zKSkgeworICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInFlbXU6IHN5bnRheDogLW1heC1kbnMtY29ubnMgbWF4X2Nvbm5lY3Rpb25zXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWF4X2Ruc19jb25ucyA8PSAwIHx8ICBtYXhfZG5zX2Nvbm5zID09IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZyBmb3IgbWF4IGRucyBjb25uZWN0aW9uczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNsaXJwX3NldF9tYXhfZG5zX2Nvbm5zKG1heF9kbnNfY29ubnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9uZXRfZm9yd2FyZDoKKyAgICAgICAgICAgICAgICBpZiAoIW5ldF9zbGlycF9mb3J3YXJkKG9wdGFyZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9uZXRfZm9yd2FyZF90Y3Ayc2luazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNvY2tBZGRyZXNzIHNhZGRyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZV9ob3N0X3BvcnQoJnNhZGRyLCBvcHRhcmcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaXAvcG9ydCAlcyBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWZvcndhcmQtZHJvcHBlZC10Y3Ayc2luay4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2UgZXhwZWN0ICdzaW5rX2lwOnNpbmtfcG9ydCdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzbGlycF9mb3J3YXJkX2Ryb3BwZWRfdGNwMnNpbmsoc2FkZHIudS5pbmV0LmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWRkci51LmluZXQucG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fdGJfc2l6ZToKKyAgICAgICAgICAgICAgICB0Yl9zaXplID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHRiX3NpemUgPCAwKQorICAgICAgICAgICAgICAgICAgICB0Yl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05faWNvdW50OgorICAgICAgICAgICAgICAgIGljb3VudF9vcHRpb24gPSBvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2luY29taW5nOgorICAgICAgICAgICAgICAgIGluY29taW5nID0gb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworI2lmZGVmIENPTkZJR19YRU4KKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05feGVuX2RvbWlkOgorICAgICAgICAgICAgICAgIHhlbl9kb21pZCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05feGVuX2NyZWF0ZToKKyAgICAgICAgICAgICAgICB4ZW5fbW9kZSA9IFhFTl9DUkVBVEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3hlbl9hdHRhY2g6CisgICAgICAgICAgICAgICAgeGVuX21vZGUgPSBYRU5fQVRUQUNIOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9taWM6CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfc291cmNlID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbmFuZDoKKyAgICAgICAgICAgICAgICBuYW5kX2FkZF9kZXYob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBDT05GSUdfSEFYCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2VuYWJsZV9oYXg6CisgICAgICAgICAgICAgICAgaGF4X2Rpc2FibGVkID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fZGlzYWJsZV9oYXg6CisgICAgICAgICAgICAgICAgaGF4X2Rpc2FibGVkID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9hbmRyb2lkX3BvcnRzOgorICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfcG9ydHMgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2FuZHJvaWRfcG9ydDoKKyAgICAgICAgICAgICAgICBhbmRyb2lkX29wX3BvcnQgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2FuZHJvaWRfcmVwb3J0X2NvbnNvbGU6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF9yZXBvcnRfY29uc29sZSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05faHR0cF9wcm94eToKKyAgICAgICAgICAgICAgICBvcF9odHRwX3Byb3h5ID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9hbmRyb2lkX2h3OgorICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfaHdpbmkgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2Ruc19zZXJ2ZXI6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF9kbnNfc2VydmVyID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9yYWRpbzoKKyAgICAgICAgICAgICAgICBhbmRyb2lkX29wX3JhZGlvID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9ncHM6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF9ncHMgPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2F1ZGlvOgorICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfYXVkaW8gPSAoY2hhciopb3B0YXJnOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX2NwdV9kZWxheToKKyAgICAgICAgICAgICAgICBhbmRyb2lkX29wX2NwdV9kZWxheSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfTkFORF9MSU1JVFMKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbmFuZF9saW1pdHM6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF9uYW5kX2xpbWl0cyA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgIC8vIENPTkZJR19OQU5EX0xJTUlUUworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3RjcGR1bXA6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF90Y3BkdW1wID0gKGNoYXIqKW9wdGFyZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBRRU1VX09QVElPTl9ib290X3Byb3BlcnR5OgorICAgICAgICAgICAgICAgIHNhdmVfY21kX2Jvb3RfcHJvcGVydHkoKGNoYXIqKW9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fbGNkX2RlbnNpdHk6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF9sY2RfZGVuc2l0eSA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fdWlfc2V0dGluZ3M6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9vcF91aV9zZXR0aW5ncyA9IChjaGFyKilvcHRhcmc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYXVkaW9fdGVzdF9vdXQ6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9hdWRpb190ZXN0X3N0YXJ0X291dCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFFFTVVfT1BUSU9OX3RpbWV6b25lOgorICAgICAgICAgICAgICAgIGlmICh0aW1lem9uZV9zZXQoKGNoYXIqKW9wdGFyZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlbXVsYXRvcjogaXQgc2VlbXMgdGhlIHRpbWV6b25lICclcycgaXMgbm90IGluIHpvbmVpbmZvIGZvcm1hdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopb3B0YXJnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fc25hcHNob3Rfbm9fdGltZV91cGRhdGU6CisgICAgICAgICAgICAgICAgYW5kcm9pZF9zbmFwc2hvdF91cGRhdGVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgUUVNVV9PUFRJT05fYW5kcm9pZF9za2lwX2FkYl9hdXRoOgorICAgICAgICAgICAgICAgIGFkYl9hdXRoID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgb3NfcGFyc2VfY21kX2FyZ3MocG9wdC0+aW5kZXgsIG9wdGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGNoYXJhY3RlciBtYXAuICovCisgICAgaWYgKHNraW5fY2hhcm1hcF9zZXR1cChOVUxMKSkgeworICAgICAgICBQQU5JQygKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgZGVmYXVsdCBjaGFyYWN0ZXIgbWFwLiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBJZiBubyBkYXRhX2RpciBpcyBzcGVjaWZpZWQgdGhlbiB0cnkgdG8gZmluZCBpdCByZWxhdGl2ZSB0byB0aGUKKyAgICAgICBleGVjdXRhYmxlIHBhdGguICAqLworICAgIGlmICghZGF0YV9kaXIpIHsKKyAgICAgICAgZGF0YV9kaXIgPSBmaW5kX2RhdGFkaXIoYXJndlswXSk7CisgICAgfQorICAgIC8qIElmIGFsbCBlbHNlIGZhaWxzIHVzZSB0aGUgaW5zdGFsbCBwYXRjaCBzcGVjaWZpZWQgd2hlbiBidWlsZGluZy4gICovCisgICAgaWYgKCFkYXRhX2RpcikgeworICAgICAgICBkYXRhX2RpciA9IENPTkZJR19RRU1VX1NIQVJFRElSOworICAgIH0KKworICAgIGlmICghYW5kcm9pZF9vcF9od2luaSkgeworICAgICAgICBQQU5JQygiTWlzc2luZyAtYW5kcm9pZC1odyA8ZmlsZT4gb3B0aW9uISIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaHdfaW5pID0gaW5pRmlsZV9uZXdGcm9tRmlsZShhbmRyb2lkX29wX2h3aW5pKTsKKyAgICBpZiAoaHdfaW5pID09IE5VTEwpIHsKKyAgICAgICAgUEFOSUMoIkNvdWxkIG5vdCBmaW5kICVzIGZpbGUuIiwgYW5kcm9pZF9vcF9od2luaSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGFuZHJvaWRId0NvbmZpZ19pbml0KGFuZHJvaWRfaHcsIDApOworICAgIGFuZHJvaWRId0NvbmZpZ19yZWFkKGFuZHJvaWRfaHcsIGh3X2luaSk7CisKKyAgICAvKiBJZiB3ZSdyZSBsb2FkaW5nIFZNIGZyb20gYSBzbmFwc2hvdCwgbWFrZSBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgSFcgY29uZmlnCisgICAgICogbWF0Y2hlcyB0aGUgb25lIHdpdGggd2hpY2ggdGhlIFZNIGhhcyBiZWVuIHNhdmVkLiAqLworICAgIGlmIChsb2Fkdm0gJiYgKmxvYWR2bSAmJiAhc25hcGhvc3RfbWF0Y2hfY29uZmlncyhod19pbmksIGxvYWR2bSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW5pRmlsZV9mcmVlKGh3X2luaSk7CisKKyAgICBjb25zdCBjaGFyKiBrZXJuZWxTZXJpYWxEZXZpY2VQcmVmaXggPQorICAgICAgICAgICAgYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbFNlcmlhbFByZWZpeChhbmRyb2lkX2h3KTsKKyAgICBWRVJCT1NFX1BSSU5UKGluaXQsICJVc2luZyBrZXJuZWwgc2VyaWFsIGRldmljZSBwcmVmaXg6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGtlcm5lbFNlcmlhbERldmljZVByZWZpeCk7CisKKyAgICB7CisgICAgICAgIGludCB3aWR0aCAgPSBhbmRyb2lkX2h3LT5od19sY2Rfd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQgPSBhbmRyb2lkX2h3LT5od19sY2RfaGVpZ2h0OworICAgICAgICBpbnQgZGVwdGggID0gYW5kcm9pZF9ody0+aHdfbGNkX2RlcHRoOworCisgICAgICAgIC8qIEEgYml0IG9mIHNhbml0eSBjaGVja2luZyAqLworICAgICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCAgICB8fAorICAgICAgICAgICAgKGRlcHRoICE9IDE2ICYmIGRlcHRoICE9IDMyKSB8fAorICAgICAgICAgICAgKCh3aWR0aCAmIDEpICE9IDApICApCisgICAgICAgIHsKKyAgICAgICAgICAgIFBBTklDKCJJbnZhbGlkIGRpc3BsYXkgY29uZmlndXJhdGlvbiAoJWQsJWQsJWQpIiwKKyAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWRfZGlzcGxheV93aWR0aCAgPSB3aWR0aDsKKyAgICAgICAgYW5kcm9pZF9kaXNwbGF5X2hlaWdodCA9IGhlaWdodDsKKyAgICAgICAgYW5kcm9pZF9kaXNwbGF5X2JwcCAgICA9IGRlcHRoOworICAgIH0KKworI2lmZGVmIENPTkZJR19OQU5EX0xJTUlUUworICAgIC8qIEluaXQgbmFuZCBzdHVmZi4gKi8KKyAgICBpZiAoYW5kcm9pZF9vcF9uYW5kX2xpbWl0cykgeworICAgICAgICBuYW5kX3BhcnNlX2xpbWl0cyhhbmRyb2lkX29wX25hbmRfbGltaXRzKTsKKyAgICB9CisjZW5kaWYgIC8vIENPTkZJR19OQU5EX0xJTUlUUworCisgICAgVkVSQk9TRV9QUklOVChpbml0LCJBVkQgTmFtZTogJXMiLCBhbmRyb2lkX2h3LT5hdmRfbmFtZSk7CisKKyAgICAvLyBTZXR1cCBlbXVsYXRlZCBOQU5EIHBhcnRpdGlvbnMuCisgICAgeworICAgICAgICBjb25zdCBBbmRyb2lkUGFydGl0aW9uQ29uZmlndXJhdGlvbiBwYXJ0aXRpb25zID0geworICAgICAgICAgICAgLnJhbWRpc2tfcGF0aCA9IGFuZHJvaWRfaHctPmRpc2tfcmFtZGlza19wYXRoLAorICAgICAgICAgICAgLmZzdGFiX25hbWUgPSAiZnN0YWIuZ29sZGZpc2giLAorICAgICAgICAgICAgLnN5c3RlbV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLnNpemUgPSBhbmRyb2lkX2h3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAucGF0aCA9IGFuZHJvaWRfaHctPmRpc2tfc3lzdGVtUGFydGl0aW9uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBhbmRyb2lkX2h3LT5kaXNrX3N5c3RlbVBhcnRpdGlvbl9pbml0UGF0aCwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgLmRhdGFfcGFydGl0aW9uID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC5zaXplID0gYW5kcm9pZF9ody0+ZGlza19kYXRhUGFydGl0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gYW5kcm9pZF9ody0+ZGlza19kYXRhUGFydGl0aW9uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgIC5pbml0X3BhdGggPSBhbmRyb2lkX2h3LT5kaXNrX2RhdGFQYXJ0aXRpb25faW5pdFBhdGgsCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIC5jYWNoZV9wYXJ0aXRpb24gPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLnNpemUgPSBhbmRyb2lkX2h3LT5kaXNrX2NhY2hlUGFydGl0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgIC5wYXRoID0gYW5kcm9pZF9ody0+ZGlza19jYWNoZVBhcnRpdGlvbl9wYXRoLAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAua2VybmVsX3N1cHBvcnRzX3lhZmZzMiA9CisgICAgICAgICAgICAgICAgYW5kcm9pZEh3Q29uZmlnX2dldEtlcm5lbFlhZmZzMlN1cHBvcnQoYW5kcm9pZF9odykgPj0gMSwKKworICAgICAgICAgICAgLndpcGVfZGF0YSA9IGFuZHJvaWRfb3Bfd2lwZV9kYXRhLAorICAgICAgICAgICAgLndyaXRhYmxlX3N5c3RlbSA9IGFuZHJvaWRfb3Bfd3JpdGFibGVfc3lzdGVtLAorICAgICAgICB9OworCisgICAgICAgIGNoYXIgKmVycm9yID0gTlVMTDsKKworICAgICAgICBpZiAoIWFuZHJvaWRfcGFydGl0aW9uX2NvbmZpZ3VyYXRpb25fc2V0dXAoCisgICAgICAgICAgICAgICAgJnBhcnRpdGlvbnMsIGFuZHJvaWRfYWRkX25hbmRfaW1hZ2UsIE5VTEwsICZlcnJvcikpIHsKKyAgICAgICAgICAgIFBBTklDKCIlcyIsIGVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdCBTRC1DYXJkIHN0dWZmLiBGb3IgQW5kcm9pZCwgaXQgaXMgYWx3YXlzIGhkYSAqLworICAgIC8qIElmIHRoZSAtaGRhIG9wdGlvbiB3YXMgdXNlZCwgaWdub3JlIHRoZSBBbmRyb2lkLXByb3ZpZGVkIG9uZSAqLworICAgIGlmIChoZGFfb3B0cyA9PSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNkUGF0aCA9IGFuZHJvaWRfaHctPmh3X3NkQ2FyZF9wYXRoOworICAgICAgICBpZiAoc2RQYXRoICYmICpzZFBhdGgpIHsKKyAgICAgICAgICAgIGlmICghcGF0aF9leGlzdHMoc2RQYXRoKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogU0QgQ2FyZCBpbWFnZSBpcyBtaXNzaW5nOiAlc1xuIiwgc2RQYXRoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZWxvY2tfY3JlYXRlKHNkUGF0aCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogU0QgQ2FyZCBpbWFnZSBhbHJlYWR5IGluIHVzZTogJXNcbiIsIHNkUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFN1Y2Nlc3NmdWwgbG9ja2luZyAqLworICAgICAgICAgICAgICAgIGhkYV9vcHRzID0gZHJpdmVfYWRkKHNkUGF0aCwgSERfQUxJQVMsIDApOworICAgICAgICAgICAgICAgIC8qIFNldCB0aGlzIHByb3BlcnR5IG9yIGFueSBvcGVyYXRpb24gaW52b2x2aW5nIHRoZSBTRCBDYXJkCisgICAgICAgICAgICAgICAgICogd2lsbCBiZSB4MTAwIHNsb3dlciwgZHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgYmVpbmcKKyAgICAgICAgICAgICAgICAgKiBtb3VudGVkIGFzIE9fRElSRUNULiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5ICd1bnNhZmUnIGluCisgICAgICAgICAgICAgICAgICogdGhlIGNvbnRleHQgb2YgYW4gZW11bGF0b3IgY3Jhc2guIFRoZSBkYXRhIGlzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAgKiBzeW5jZWQgcHJvcGVybHkgd2hlbiB0aGUgZW11bGF0b3IgZXhpdHMgKGVpdGhlciBub3JtYWxseSBvciB0aHJvdWdoIF5DKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBxZW11X29wdF9zZXQoaGRhX29wdHMsICJjYWNoZSIsICJ1bnNhZmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoZGJfb3B0cyA9PSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNwYXRoID0gYW5kcm9pZF9ody0+ZGlza19zbmFwU3RvcmFnZV9wYXRoOworICAgICAgICBpZiAoc3BhdGggJiYgKnNwYXRoKSB7CisgICAgICAgICAgICBpZiAoIXBhdGhfZXhpc3RzKHNwYXRoKSkgeworICAgICAgICAgICAgICAgIFBBTklDKCJTbmFwc2hvdCBzdG9yYWdlIGZpbGUgZG9lcyBub3QgZXhpc3Q6ICVzIiwgc3BhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGVsb2NrX2NyZWF0ZShzcGF0aCkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFBBTklDKCJTbmFwc2hvdCBzdG9yYWdlIGFscmVhZHkgaW4gdXNlOiAlcyIsIHNwYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhkYl9vcHRzID0gZHJpdmVfYWRkKHNwYXRoLCBIRF9BTElBUywgMSk7CisgICAgICAgICAgICAvKiBTZWUgY29tbWVudCBhYm92ZSB0byB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIG5lZWRlZC4gKi8KKyAgICAgICAgICAgIHFlbXVfb3B0X3NldChoZGJfb3B0cywgImNhY2hlIiwgInVuc2FmZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2V0IHRoZSBWTSdzIG1heCBoZWFwIHNpemUsIHBhc3NlZCBhcyBhIGJvb3QgcHJvcGVydHkgKi8KKyAgICBpZiAoYW5kcm9pZF9ody0+dm1faGVhcFNpemUgPiAwKSB7CisgICAgICAgIGNoYXIgIHRtcFs2NF07CisgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICIlZG0iLCBhbmRyb2lkX2h3LT52bV9oZWFwU2l6ZSk7CisgICAgICAgIGJvb3RfcHJvcGVydHlfYWRkKCJkYWx2aWsudm0uaGVhcHNpemUiLHRtcCk7CisgICAgfQorCisgICAgLyogRnJvbSBBUEkgMTkgYW5kIGFib3ZlLCB0aGUgcGxhdGZvcm0gcHJvdmlkZXMgYW4gZXhwbGljaXQgcHJvcGVydHkgZm9yIGxvdyBtZW1vcnkgZGV2aWNlcy4gKi8KKyAgICBpZiAoYW5kcm9pZF9ody0+aHdfcmFtU2l6ZSA8PSA1MTIpIHsKKyAgICAgICAgYm9vdF9wcm9wZXJ0eV9hZGQoInJvLmNvbmZpZy5sb3dfcmFtIiwgInRydWUiKTsKKyAgICB9CisKKyAgICAvKiBCeXBhc3MgYWRiIHNlY3VyaXR5IG9yIG5vdC4gKi8KKyAgICBib290X3Byb3BlcnR5X2FkZCgicWVtdS5hZGIuc2VjdXJlIiwgYWRiX2F1dGggPyAiMSI6ICIwIik7CisKKyAgICAvKiBJbml0aWFsaXplIExDRCBkZW5zaXR5ICovCisgICAgaWYgKGFuZHJvaWRfaHctPmh3X2xjZF9kZW5zaXR5KSB7CisgICAgICAgIGxvbmcgZGVuc2l0eSA9IGFuZHJvaWRfaHctPmh3X2xjZF9kZW5zaXR5OworICAgICAgICBpZiAoZGVuc2l0eSA8PSAwKSB7CisgICAgICAgICAgICBQQU5JQygiSW52YWxpZCBody5sY2QuZGVuc2l0eSB2YWx1ZTogJWxkIiwgZGVuc2l0eSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBod0xjZF9zZXRCb290UHJvcGVydHkoZGVuc2l0eSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBwcmVzZW5jZSBvZiBoYXJkd2FyZSBuYXYgYnV0dG9uICovCisgICAgYm9vdF9wcm9wZXJ0eV9hZGQoInFlbXUuaHcubWFpbmtleXMiLCBhbmRyb2lkX2h3LT5od19tYWluS2V5cyA/ICIxIiA6ICIwIik7CisKKyAgICAvKiBJbml0aWFsaXplIFRDUCBkdW1wICovCisgICAgaWYgKGFuZHJvaWRfb3BfdGNwZHVtcCkgeworICAgICAgICBpZiAocWVtdV90Y3BkdW1wX3N0YXJ0KGFuZHJvaWRfb3BfdGNwZHVtcCkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBzdGFydCBwYWNrZXQgY2FwdHVyZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIG1vZGVtICovCisgICAgaWYgKGFuZHJvaWRfb3BfcmFkaW8pIHsKKyAgICAgICAgQ2hhckRyaXZlclN0YXRlKiAgY3MgPSBxZW11X2Nocl9vcGVuKCJyYWRpbyIsIGFuZHJvaWRfb3BfcmFkaW8sIE5VTEwpOworICAgICAgICBpZiAoY3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUEFOSUMoInVuc3VwcG9ydGVkIGNoYXJhY3RlciBkZXZpY2Ugc3BlY2lmaWNhdGlvbjogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VkIC1oZWxwLWNoYXItZGV2aWNlcyBmb3IgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfcmFkaW8pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZF9xZW11ZF9zZXRfY2hhbm5lbChBTkRST0lEX1FFTVVEX0dTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3NlcmlhbGxpbmVfZnJvbV9jcyhjcykpOworICAgIH0gZWxzZSBpZiAoYW5kcm9pZF9ody0+aHdfZ3NtTW9kZW0gIT0gMCApIHsKKyAgICAgICAgaWYgKGFuZHJvaWRfcWVtdWRfZ2V0X2NoYW5uZWwoQU5EUk9JRF9RRU1VRF9HU00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbmRyb2lkX21vZGVtX3NlcmlhbF9saW5lKSA8IDApIHsKKyAgICAgICAgICAgIFBBTklDKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBxZW11ZCAnZ3NtJyBjaGFubmVsIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgR1BTICovCisgICAgaWYgKGFuZHJvaWRfb3BfZ3BzKSB7CisgICAgICAgIENoYXJEcml2ZXJTdGF0ZSogIGNzID0gcWVtdV9jaHJfb3BlbigiZ3BzIiwgYW5kcm9pZF9vcF9ncHMsIE5VTEwpOworICAgICAgICBpZiAoY3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUEFOSUMoInVuc3VwcG9ydGVkIGNoYXJhY3RlciBkZXZpY2Ugc3BlY2lmaWNhdGlvbjogJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VkIC1oZWxwLWNoYXItZGV2aWNlcyBmb3IgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfZ3BzKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGFuZHJvaWRfcWVtdWRfc2V0X2NoYW5uZWwoQU5EUk9JRF9RRU1VRF9HUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9zZXJpYWxsaW5lX2Zyb21fY3MoY3MpKTsKKyAgICB9IGVsc2UgaWYgKGFuZHJvaWRfaHctPmh3X2dwcyAhPSAwKSB7CisgICAgICAgIGlmIChhbmRyb2lkX3FlbXVkX2dldF9jaGFubmVsKEFORFJPSURfUUVNVURfR1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5kcm9pZF9ncHNfc2VyaWFsX2xpbmUpIDwgMCApIHsKKyAgICAgICAgICAgIFBBTklDKCJjb3VsZCBub3QgaW5pdGlhbGl6ZSBxZW11ZCAnZ3BzJyBjaGFubmVsIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgYXVkaW8uICovCisgICAgaWYgKGFuZHJvaWRfb3BfYXVkaW8pIHsKKyAgICAgICAgaWYgKCAhYXVkaW9fY2hlY2tfYmFja2VuZF9uYW1lKCAwLCBhbmRyb2lkX29wX2F1ZGlvICkgKSB7CisgICAgICAgICAgICBQQU5JQygiJyVzJyBpcyBub3QgYSB2YWxpZCBhdWRpbyBvdXRwdXQgYmFja2VuZC4gc2VlIC1oZWxwLWF1ZGlvLW91dCIsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfb3BfYXVkaW8pOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgc2V0ZW52KCJRRU1VX0FVRElPX0RSViIsIGFuZHJvaWRfb3BfYXVkaW8sIDEpOworICAgIH0KKworCisgICAgLyogU2V0IExDRCBkZW5zaXR5IChpZiByZXF1aXJlZCBieSAtcWVtdSwgYW5kIEFWRCBpcyBtaXNzaW5nIGl0LiAqLworICAgIGlmIChhbmRyb2lkX29wX2xjZF9kZW5zaXR5ICYmICFhbmRyb2lkX2h3LT5od19sY2RfZGVuc2l0eSkgeworICAgICAgICBpbnQgZGVuc2l0eTsKKyAgICAgICAgaWYgKHBhcnNlX2ludChhbmRyb2lkX29wX2xjZF9kZW5zaXR5LCAmZGVuc2l0eSkgfHwgZGVuc2l0eSA8PSAwKSB7CisgICAgICAgICAgICBQQU5JQygiLWxjZC1kZW5zaXR5IDogJWQiLCBkZW5zaXR5KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGh3TGNkX3NldEJvb3RQcm9wZXJ0eShkZW5zaXR5KTsKKyAgICB9CisKKyAgICAvKiBJbml0aWFsaXplIGNhbWVyYSBlbXVsYXRpb24uICovCisgICAgYW5kcm9pZF9jYW1lcmFfc2VydmljZV9pbml0KCk7CisKKyAgICBpZiAoYW5kcm9pZF9vcF9jcHVfZGVsYXkpIHsKKyAgICAgICAgY2hhciogICBlbmQ7CisgICAgICAgIGxvbmcgICAgZGVsYXkgPSBzdHJ0b2woYW5kcm9pZF9vcF9jcHVfZGVsYXksICZlbmQsIDApOworICAgICAgICBpZiAoZW5kID09IE5VTEwgfHwgKmVuZCB8fCBkZWxheSA8IDAgfHwgZGVsYXkgPiAxMDAwICkgeworICAgICAgICAgICAgUEFOSUMoIm9wdGlvbiAtY3B1LWRlbGF5IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMDAiICk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVsYXkgPiAwKQorICAgICAgICAgICAgZGVsYXkgPSAoMTAwMC1kZWxheSk7CisKKyAgICAgICAgcWVtdV9jcHVfZGVsYXkgPSAoaW50KSBkZWxheTsKKyAgICB9CisKKyAgICBpZiAoYW5kcm9pZF9vcF9kbnNfc2VydmVyKSB7CisgICAgICAgIC8vIE5PVEU6IFRoZSBmcm9udC1lbmQgc2hvdWxkIGFsd2F5cyBhZGQgdGhlIC1kbnMtc2VydmVyIDxsaXN0PiBvcHRpb24gd2hlbiB0aGlzCisgICAgICAgIC8vIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2hlcmUgPGxpc3Q+IGNvbnRhaW5zIGEgbGlzdCBvZiByZXNvbHZlZCBJUCBhZGRyZXNzZXMuCisgICAgICAgIC8vIEFzIHN1Y2gsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIGVycm9ycyBoZXJlLgorICAgICAgICBzbGlycF9pbml0X2Ruc19zZXJ2ZXJzKGFuZHJvaWRfb3BfZG5zX3NlcnZlcik7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBPcGVuR0xFUyBlbXVsYXRpb24gKi8KKyAgICAvKiBxZW11LmdsZXMgd2lsbCBiZSByZWFkIGJ5IHRoZSBPcGVuR0wgRVMgZW11bGF0aW9uIGxpYnJhcmllcy4KKyAgICAgKiBJZiBzZXQgdG8gMCwgdGhlIHNvZnR3YXJlIEdMIEVTIHJlbmRlcmVyIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrLgorICAgICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLCB0aGlzIG1lYW5zIHRoZSBzeXN0ZW0gaW1hZ2UgcnVucworICAgICAqIGluc2lkZSBhbiBlbXVsYXRvciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBHUFUgZW11bGF0aW9uIGF0IGFsbC4KKyAgICAgKgorICAgICAqIFRoZSBHTCBFUyByZW5kZXJlciBjYW5ub3Qgc3RhcnQgcHJvcGVybHkgaWYgR1BVIGVtdWxhdGlvbiBpcyBkaXNhYmxlZAorICAgICAqIGJlY2F1c2UgdGhpcyByZXF1aXJlcyBjaGFuZ2luZyB0aGUgTERfTElCUkFSWV9QQVRIIGJlZm9yZSBsYXVuY2hpbmcKKyAgICAgKiB0aGUgZW11bGF0aW9uIGVuZ2luZS4gKi8KKworICAgIGJvb2wgb3BlbmdsX2VtdWxhdGlvbiA9IGFuZHJvaWRfaHctPmh3X2dwdV9lbmFibGVkOworICAgIGlmIChvcGVuZ2xfZW11bGF0aW9uIHx8IHN0cmNtcChhbmRyb2lkX2h3LT5od19ncHVfbW9kZSwgImd1ZXN0IikgPT0gMCkgeworICAgICAgICBjaGFyICB0bXBbNjRdOworICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiJWQiLCAweDIwMDAwKTsKKyAgICAgICAgYm9vdF9wcm9wZXJ0eV9hZGQoInJvLm9wZW5nbGVzLnZlcnNpb24iLCB0bXApOworICAgIH0KKworICAgIGJvb2wgb3BlbmdsX2Jyb2tlbiA9IGZhbHNlOworICAgIGJvb2wgb3BlbmdsX2hvc3RfZW11bGF0aW9uID0gKG9wZW5nbF9lbXVsYXRpb24gJiYKKyAgICAgICAgICAgIHN0cmNtcChhbmRyb2lkX2h3LT5od19ncHVfbW9kZSwgImd1ZXN0IikgIT0gMCk7CisgICAgaWYgKG9wZW5nbF9ob3N0X2VtdWxhdGlvbikgeworICAgICAgICAvLyBUcnkgdG8gaW5pdGlhbGl6ZSBFbXVHTC4gVGhpcyBvcGVyYXRpb24gY2FuIGZhaWwsIGJ1dCBkb250CisgICAgICAgIC8vIGV4aXQgaW1tZWRpYXRlbHkuIFdlIHdhbnQgdG8gd3JpdGUgdGhlIG1ldHJpY3MgdG8gdGhlIGZpbGUKKyAgICAgICAgLy8gYmVmb3JlIGRvaW5nIHRoaXMsIGFuZCB0aGlzIGlzIGRvbmUgbXVjaCBsYXRlciwgc28gcmVjb3JkCisgICAgICAgIC8vIHRoZSBlcnJvciBpbiB8b3BlbmdsX2Jyb2tlbnwgaW5zdGVhZC4KKyAgICAgICAgaWYgKGFuZHJvaWRfaW5pdE9wZW5nbGVzRW11bGF0aW9uKCkgIT0gMCB8fAorICAgICAgICAgICAgYW5kcm9pZF9zdGFydE9wZW5nbGVzUmVuZGVyZXIoYW5kcm9pZF9ody0+aHdfbGNkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9ody0+aHdfbGNkX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZEluZm9fZ2V0QXBpTGV2ZWwoYW5kcm9pZF9hdmRJbmZvKSkKKyAgICAgICAgICAgICAgICAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBvcGVuZ2xfYnJva2VuID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwaWRfZmlsZSAmJiBxZW11X2NyZWF0ZV9waWRmaWxlKHBpZF9maWxlKSAhPSAwKSB7CisgICAgICAgIG9zX3BpZGZpbGVfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogT3BlbiB0aGUgbG9nZmlsZSBhdCB0aGlzIHBvaW50LCBpZiBuZWNlc3NhcnkuIFdlIGNhbid0IG9wZW4gdGhlIGxvZ2ZpbGUKKyAgICAgKiB3aGVuIGVuY291bnRlcmluZyBlaXRoZXIgb2YgdGhlIGxvZ2dpbmcgb3B0aW9ucyAoLWQgb3IgLUQpIGJlY2F1c2UgdGhlCisgICAgICogb3RoZXIgb25lIG1heSBiZSBlbmNvdW50ZXJlZCBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLCBjaGFuZ2luZyB0aGUKKyAgICAgKiBsb2NhdGlvbiBvciBsZXZlbCBvZiBsb2dnaW5nLgorICAgICAqLworICAgIGlmIChsb2dfbWFzaykgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgaWYgKGxvZ19maWxlKSB7CisgICAgICAgICAgICBxZW11X3NldF9sb2dfZmlsZW5hbWUobG9nX2ZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgbWFzayA9IHFlbXVfc3RyX3RvX2xvZ19tYXNrKGxvZ19tYXNrKTsKKyAgICAgICAgaWYgKCFtYXNrKSB7CisgICAgICAgICAgICBxZW11X3ByaW50X2xvZ191c2FnZShzdGRvdXQpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcWVtdV9zZXRfbG9nKG1hc2spOworICAgIH0KKworI2lmIGRlZmluZWQoQ09ORklHX0tWTSkKKyAgICBpZiAoa3ZtX2FsbG93ZWQgPCAwKSB7CisgICAgICAgIGt2bV9hbGxvd2VkID0ga3ZtX2NoZWNrX2FsbG93ZWQoKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1hY2hpbmUtPm1heF9jcHVzID0gbWFjaGluZS0+bWF4X2NwdXMgPzogMTsgLyogRGVmYXVsdCB0byBVUCAqLworICAgIGlmIChzbXBfY3B1cyA+IG1hY2hpbmUtPm1heF9jcHVzKSB7CisgICAgICAgIFBBTklDKCJOdW1iZXIgb2YgU01QIGNwdXMgcmVxdWVzdGVkICglZCksIGV4Y2VlZHMgbWF4IGNwdXMgIgorICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgYnkgbWFjaGluZSBgJXMnICglZCkiLCBzbXBfY3B1cywgIG1hY2hpbmUtPm5hbWUsCisgICAgICAgICAgICAgICAgbWFjaGluZS0+bWF4X2NwdXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoZGlzcGxheV90eXBlID09IERUX05PR1JBUEhJQykgeworICAgICAgIGlmIChzZXJpYWxfZGV2aWNlX2luZGV4ID09IDApCisgICAgICAgICAgIHNlcmlhbF9kZXZpY2VzWzBdID0gInN0ZGlvIjsKKyAgICAgICBpZiAocGFyYWxsZWxfZGV2aWNlX2luZGV4ID09IDApCisgICAgICAgICAgIHBhcmFsbGVsX2RldmljZXNbMF0gPSAibnVsbCI7CisgICAgICAgaWYgKHN0cm5jbXAobW9uaXRvcl9kZXZpY2UsICJ2YyIsIDIpID09IDApCisgICAgICAgICAgIG1vbml0b3JfZGV2aWNlID0gInN0ZGlvIjsKKyAgICB9CisKKyAgICBpZiAocWVtdV9pbml0X21haW5fbG9vcCgpKSB7CisgICAgICAgIFBBTklDKCJxZW11X2luaXRfbWFpbl9sb29wIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoa2VybmVsX2ZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAga2VybmVsX2ZpbGVuYW1lID0gYW5kcm9pZF9ody0+a2VybmVsX3BhdGg7CisgICAgfQorICAgIGlmIChpbml0cmRfZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICBpbml0cmRfZmlsZW5hbWUgPSBhbmRyb2lkX2h3LT5kaXNrX3JhbWRpc2tfcGF0aDsKKyAgICB9CisKKyAgICBsaW51eF9ib290ID0gKGtlcm5lbF9maWxlbmFtZSAhPSBOVUxMKTsKKyAgICBuZXRfYm9vdCA9IChib290X2RldmljZXNfYml0bWFwID4+ICgnbicgLSAnYScpKSAmIDB4RjsKKworICAgIGlmICghbGludXhfYm9vdCAmJiAqa2VybmVsX2NtZGxpbmUgIT0gJ1wwJykgeworICAgICAgICBQQU5JQygiLWFwcGVuZCBvbmx5IGFsbG93ZWQgd2l0aCAta2VybmVsIG9wdGlvbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIWxpbnV4X2Jvb3QgJiYgaW5pdHJkX2ZpbGVuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgUEFOSUMoIi1pbml0cmQgb25seSBhbGxvd2VkIHdpdGggLWtlcm5lbCBvcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogYm9vdCB0byBmbG9wcHkgb3IgdGhlIGRlZmF1bHQgY2QgaWYgbm8gaGFyZCBkaXNrIGRlZmluZWQgeWV0ICovCisgICAgaWYgKCFib290X2RldmljZXNbMF0pIHsKKyAgICAgICAgYm9vdF9kZXZpY2VzID0gImNhZCI7CisgICAgfQorICAgIG9zX3NldF9saW5lX2J1ZmZlcmluZygpOworCisgICAgaWYgKGluaXRfdGltZXJfYWxhcm0oKSA8IDApIHsKKyAgICAgICAgUEFOSUMoImNvdWxkIG5vdCBpbml0aWFsaXplIGFsYXJtIHRpbWVyIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBjb25maWd1cmVfaWNvdW50KGljb3VudF9vcHRpb24pOworCisgICAgLyogaW5pdCBuZXR3b3JrIGNsaWVudHMgKi8KKyAgICBpZiAobmJfbmV0X2NsaWVudHMgPT0gMCkgeworICAgICAgICAvKiBpZiBubyBjbGllbnRzLCB3ZSB1c2UgYSBkZWZhdWx0IGNvbmZpZyAqLworICAgICAgICBuZXRfY2xpZW50c1tuYl9uZXRfY2xpZW50cysrXSA9ICJuaWMiOworI2lmZGVmIENPTkZJR19TTElSUAorICAgICAgICBuZXRfY2xpZW50c1tuYl9uZXRfY2xpZW50cysrXSA9ICJ1c2VyIjsKKyNlbmRpZgorICAgIH0KKworICAgIGZvcihpID0gMDtpIDwgbmJfbmV0X2NsaWVudHM7IGkrKykgeworICAgICAgICBpZiAobmV0X2NsaWVudF9wYXJzZShuZXRfY2xpZW50c1tpXSkgPCAwKSB7CisgICAgICAgICAgICBQQU5JQygiVW5hYmxlIHRvIHBhcnNlIG5ldCBjbGllbnRzIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXRfY2xpZW50X2NoZWNrKCk7CisKKyNpZmRlZiBUQVJHRVRfSTM4NgorICAgIC8qIFhYWDogdGhpcyBzaG91bGQgYmUgbW92ZWQgaW4gdGhlIFBDIG1hY2hpbmUgaW5zdGFudGlhdGlvbiBjb2RlICovCisgICAgaWYgKG5ldF9ib290ICE9IDApIHsKKyAgICAgICAgaW50IG5ldHJvbXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuYl9uaWNzICYmIGkgPCA0OyBpKyspIHsKKwkgICAgY29uc3QgY2hhciAqbW9kZWwgPSBuZF90YWJsZVtpXS5tb2RlbDsKKwkgICAgY2hhciBidWZbMTAyNF07CisgICAgICAgICAgICBjaGFyICpmaWxlbmFtZTsKKyAgICAgICAgICAgIGlmIChuZXRfYm9vdCAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gIm5lMmtfcGNpIjsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAicHhlLSVzLmJpbiIsIG1vZGVsKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHFlbXVfZmluZF9maWxlKFFFTVVfRklMRV9UWVBFX0JJT1MsIGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lICYmIGdldF9pbWFnZV9zaXplKGZpbGVuYW1lKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5iX29wdGlvbl9yb21zID49IE1BWF9PUFRJT05fUk9NUykgeworICAgICAgICAgICAgICAgICAgICAgICAgUEFOSUMoIlRvbyBtYW55IG9wdGlvbiBST01zIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcHRpb25fcm9tW25iX29wdGlvbl9yb21zXSA9IGdfc3RyZHVwKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIG5iX29wdGlvbl9yb21zKys7CisgICAgICAgICAgICAgICAgICAgIG5ldHJvbXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpbGVuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGdfZnJlZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZXRyb21zID09IDApIHsKKyAgICAgICAgICAgIFBBTklDKCJObyB2YWxpZCBQWEUgcm9tIGZvdW5kIGZvciBuZXR3b3JrIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIGluaXQgdGhlIG1lbW9yeSAqLworICAgIGlmIChyYW1fc2l6ZSA9PSAwKSB7CisgICAgICAgIHJhbV9zaXplID0gYW5kcm9pZF9ody0+aHdfcmFtU2l6ZSAqIDEwMjRMTCAqIDEwMjQ7CisgICAgICAgIGlmIChyYW1fc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByYW1fc2l6ZSA9IERFRkFVTFRfUkFNX1NJWkUgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFF1aXRlIG9mdGVuIChlc3BlY2lhbGx5IG9uIG9sZGVyIFhQIG1hY2hpbmVzKSBhdHRlbXB0cyB0byBhbGxvY2F0ZSBsYXJnZQorICAgICAqIFZNIFJBTSBpcyBnb2luZyB0byBmYWlsLCBhbmQgY3Jhc2ggdGhlIGVtdWxhdG9yLiBTaW5jZSBpdCdzIGZhaWxpbmcgZGVlcAorICAgICAqIGluc2lkZSBRRU1VLCBpdCdzIG5vdCByZWFsbHkgcG9zc2libGUgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIGEKKyAgICAgKiBtZWFuaW5nZnVsIGV4cGxhbmF0aW9uIGZvciB0aGUgY3Jhc2guIFNvLCBsZXRzIHNlZSBpZiBRRU1VIGlzIGdvaW5nIHRvIGJlCisgICAgICogYWJsZSB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgYW1vdW50IG9mIFJBTSwgYW5kIGlmIG5vdCwgbGV0cyB0cnkgdG8gY29tZSB1cAorICAgICAqIHdpdGggYSByZWNvbWVuZGF0aW9uLiAqLworICAgIHsKKyAgICAgICAgcmFtX2FkZHJfdCByX3JhbSA9IHJhbV9zaXplOworICAgICAgICB2b2lkKiBhbGxvY19jaGVjayA9IG1hbGxvYyhyX3JhbSk7CisgICAgICAgIHdoaWxlIChhbGxvY19jaGVjayA9PSBOVUxMICYmIHJfcmFtID4gMTAyNCAqIDEwMjQpIHsKKyAgICAgICAgLyogTWFrZSBpdCAyNSUgbGVzcyAqLworICAgICAgICAgICAgcl9yYW0gLT0gcl9yYW0gLyA0OworICAgICAgICAgICAgYWxsb2NfY2hlY2sgPSBtYWxsb2Mocl9yYW0pOworICAgICAgICB9CisgICAgICAgIGlmIChhbGxvY19jaGVjayAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKGFsbG9jX2NoZWNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocl9yYW0gIT0gcmFtX3NpemUpIHsKKyAgICAgICAgICAgIC8qIFJlcXVlc3RlZCBSQU0gaXMgdG9vIGxhcmdlLiBSZXBvcnQgdGhpcywgYXMgd2VsbCBhcyBjYWxjdWxhdGVkCisgICAgICAgICAgICAgKiByZWNvbWVuZGF0aW9uLiAqLworICAgICAgICAgICAgZHdhcm5pbmcoIlJlcXVlc3RlZCBSQU0gc2l6ZSBvZiAlZE1CIGlzIHRvbyBsYXJnZSBmb3IgeW91ciBlbnZpcm9ubWVudCwgYW5kIGlzIHJlZHVjZWQgdG8gJWRNQi4iLAorICAgICAgICAgICAgICAgICAgICAgKGludCkocmFtX3NpemUgLyAxMDI0IC8gMTAyNCksIChpbnQpKHJfcmFtIC8gMTAyNCAvIDEwMjQpKTsKKyAgICAgICAgICAgIHJhbV9zaXplID0gcl9yYW07CisgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgX1dJTjMyCisgICAgcWVtdV9sb2dfcm90YXRpb25faW5pdCgpOworI2VuZGlmCisKKyAgICAvKiBpbml0IHRoZSBkeW5hbWljIHRyYW5zbGF0b3IgKi8KKyAgICBjcHVfZXhlY19pbml0X2FsbCh0Yl9zaXplICogMTAyNCAqIDEwMjQpOworCisgICAgLyogaW5pdCBibG9jayBkcml2ZXIgKi8KKyAgICBiZHJ2X2luaXQoKTsKKworICAgIC8qIHdlIGFsd2F5cyBjcmVhdGUgdGhlIGNkcm9tIGRyaXZlLCBldmVuIGlmIG5vIGRpc2sgaXMgdGhlcmUgKi8KKyNpZiAwCisgICAgaWYgKG5iX2RyaXZlc19vcHQgPCBNQVhfRFJJVkVTKQorICAgICAgICBkcml2ZV9hZGQoTlVMTCwgQ0RST01fQUxJQVMpOworCisgICAgLyogd2UgYWx3YXlzIGNyZWF0ZSBhdCBsZWFzdCBvbmUgZmxvcHB5ICovCisKKyAgICBpZiAobmJfZHJpdmVzX29wdCA8IE1BWF9EUklWRVMpCisgICAgICAgIGRyaXZlX2FkZChOVUxMLCBGRF9BTElBUywgMCk7CisgICAgLyogd2UgYWx3YXlzIGNyZWF0ZSBvbmUgc2Qgc2xvdCwgZXZlbiBpZiBubyBjYXJkIGlzIGluIGl0ICovCisKKyAgICBpZiAoMSkgeworICAgICAgICBkcml2ZV9hZGQoTlVMTCwgU0RfQUxJQVMpOworICAgIH0KKyNlbmRpZgorCisgICAgLyogb3BlbiB0aGUgdmlydHVhbCBibG9jayBkZXZpY2VzICovCisgICAgaWYgKHNuYXBzaG90KQorICAgICAgICBxZW11X29wdHNfZm9yZWFjaChxZW11X2ZpbmRfb3B0cygiZHJpdmUiKSwgZHJpdmVfZW5hYmxlX3NuYXBzaG90LCBOVUxMLCAwKTsKKyAgICBpZiAocWVtdV9vcHRzX2ZvcmVhY2gocWVtdV9maW5kX29wdHMoImRyaXZlIiksIGRyaXZlX2luaXRfZnVuYywgJm1hY2hpbmUtPnVzZV9zY3NpLCAxKSAhPSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8vcmVnaXN0ZXJfc2F2ZXZtKE5VTEwsICJ0aW1lciIsIDAsIDIsIHRpbWVyX3NhdmUsIHRpbWVyX2xvYWQsICZ0aW1lcnNfc3RhdGUpOworCisgICAgU2F2ZVZNSGFuZGxlcnMqIG9wcyA9IGdfbWFsbG9jMChzaXplb2YoKm9wcykpOworICAgIG9wcy0+c2F2ZV9saXZlX3N0YXRlID0gcmFtX3NhdmVfbGl2ZTsKKyAgICBvcHMtPmxvYWRfc3RhdGUgPSByYW1fbG9hZDsKKworICAgIHJlZ2lzdGVyX3NhdmV2bV9saXZlKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgInJhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIC8qIG11c3QgYmUgYWZ0ZXIgdGVybWluYWwgaW5pdCwgU0RMIGxpYnJhcnkgY2hhbmdlcyBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICBvc19zZXR1cF9zaWduYWxfaGFuZGxpbmcoKTsKKworICAgIHFlbXVfaW5pdF9jcHVfbG9vcCgpOworICAgIHFlbXVfbXV0ZXhfbG9ja19pb3RocmVhZCgpOworCisgICAgLyogTWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG11bHRpcGxlIHN0ZGlvIG1vbml0b3JzICovCisgICAgaWYgKCFzdHJjbXAobW9uaXRvcl9kZXZpY2UsInN0ZGlvIikpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9TRVJJQUxfUE9SVFM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2bmFtZSA9IHNlcmlhbF9kZXZpY2VzW2ldOworICAgICAgICAgICAgaWYgKGRldm5hbWUgJiYgIXN0cmNtcChkZXZuYW1lLCJtb246c3RkaW8iKSkgeworICAgICAgICAgICAgICAgIG1vbml0b3JfZGV2aWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2bmFtZSAmJiAhc3RyY21wKGRldm5hbWUsInN0ZGlvIikpIHsKKyAgICAgICAgICAgICAgICBtb25pdG9yX2RldmljZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgc2VyaWFsX2RldmljZXNbaV0gPSAibW9uOnN0ZGlvIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuYl9udW1hX25vZGVzID4gMCkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAobmJfbnVtYV9ub2RlcyA+IHNtcF9jcHVzKSB7CisgICAgICAgICAgICBuYl9udW1hX25vZGVzID0gc21wX2NwdXM7CisgICAgICAgIH0KKworICAgICAgICAvKiBJZiBubyBtZW1vcnkgc2l6ZSBpZiBnaXZlbiBmb3IgYW55IG5vZGUsIGFzc3VtZSB0aGUgZGVmYXVsdCBjYXNlCisgICAgICAgICAqIGFuZCBkaXN0cmlidXRlIHRoZSBhdmFpbGFibGUgbWVtb3J5IGVxdWFsbHkgYWNyb3NzIGFsbCBub2RlcworICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX251bWFfbm9kZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG5vZGVfbWVtW2ldICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gbmJfbnVtYV9ub2RlcykgeworICAgICAgICAgICAgdWludDY0X3QgdXNlZG1lbSA9IDA7CisKKyAgICAgICAgICAgIC8qIE9uIExpbnV4LCB0aGUgZWFjaCBub2RlJ3MgYm9yZGVyIGhhcyB0byBiZSA4TUIgYWxpZ25lZCwKKyAgICAgICAgICAgICAqIHRoZSBmaW5hbCBub2RlIGdldHMgdGhlIHJlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9udW1hX25vZGVzIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbm9kZV9tZW1baV0gPSAocmFtX3NpemUgLyBuYl9udW1hX25vZGVzKSAmIH4oKDEgPDwgMjNVTCkgLSAxKTsKKyAgICAgICAgICAgICAgICB1c2VkbWVtICs9IG5vZGVfbWVtW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZV9tZW1baV0gPSByYW1fc2l6ZSAtIHVzZWRtZW07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfbnVtYV9ub2RlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobm9kZV9jcHVtYXNrW2ldICE9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogYXNzaWduaW5nIHRoZSBWQ1BVcyByb3VuZC1yb2JpbiBpcyBlYXNpZXIgdG8gaW1wbGVtZW50LCBndWVzdCBPU2VzCisgICAgICAgICAqIG11c3QgY29wZSB3aXRoIHRoaXMgYW55d2F5LCBiZWNhdXNlIHRoZXJlIGFyZSBCSU9TZXMgb3V0IHRoZXJlIGluCisgICAgICAgICAqIHJlYWwgbWFjaGluZXMgd2hpY2ggYWxzbyB1c2UgdGhpcyBzY2hlbWUuCisgICAgICAgICAqLworICAgICAgICBpZiAoaSA9PSBuYl9udW1hX25vZGVzKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc21wX2NwdXM7IGkrKykgeworICAgICAgICAgICAgICAgIG5vZGVfY3B1bWFza1tpICUgbmJfbnVtYV9ub2Rlc10gfD0gMSA8PCBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGt2bV9lbmFibGVkKCkpIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICByZXQgPSBrdm1faW5pdChzbXBfY3B1cyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBQQU5JQygiZmFpbGVkIHRvIGluaXRpYWxpemUgS1ZNIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIENPTkZJR19IQVgKKyAgICBpZiAoIWhheF9kaXNhYmxlZCkKKyAgICB7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaGF4X3NldF9yYW1zaXplKHJhbV9zaXplKTsKKyAgICAgICAgcmV0ID0gaGF4X2luaXQoc21wX2NwdXMpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkhBWE0gaXMgbm90IHdvcmtpbmcgYW5kIGVtdWxhdG9yIHJ1bnMgaW4gZW11bGF0aW9uIG1vZGVcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJIQVhNIGlzIHdvcmtpbmcgYW5kIGVtdWxhdG9yIHJ1bnMgaW4gZmFzdCB2aXJ0IG1vZGVcbiIpOworICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IGhheF9tYXhfcmFtID0gMDsKKyAgICAgICAgaWYgKGhheF9nZXRfbWF4X3JhbSgmaGF4X21heF9yYW0pID09IDApIHsKKyAgICAgICAgICAgIGNoYXIgc3RyWzMyXSA9IHswfTsKKyAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiJSJQUkl1NjQsIGhheF9tYXhfcmFtKTsKKyAgICAgICAgICAgIGNyYXNoaGFuZGxlcl9hZGRfc3RyaW5nKCJoYXhfbWF4X3JhbS50eHQiLCBzdHIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobW9uaXRvcl9kZXZpY2UpIHsKKyAgICAgICAgbW9uaXRvcl9oZCA9IHFlbXVfY2hyX29wZW4oIm1vbml0b3IiLCBtb25pdG9yX2RldmljZSwgTlVMTCk7CisgICAgICAgIGlmICghbW9uaXRvcl9oZCkgeworICAgICAgICAgICAgUEFOSUMoInFlbXU6IGNvdWxkIG5vdCBvcGVuIG1vbml0b3IgZGV2aWNlICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvcl9kZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfU0VSSUFMX1BPUlRTOyBpKyspIHsKKyAgICAgICAgaWYgKHNlcmlhbF9oZHNfYWRkKHNlcmlhbF9kZXZpY2VzW2ldKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1BBUkFMTEVMX1BPUlRTOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqZGV2bmFtZSA9IHBhcmFsbGVsX2RldmljZXNbaV07CisgICAgICAgIGlmIChkZXZuYW1lICYmIHN0cmNtcChkZXZuYW1lLCAibm9uZSIpKSB7CisgICAgICAgICAgICBjaGFyIGxhYmVsWzMyXTsKKyAgICAgICAgICAgIHNucHJpbnRmKGxhYmVsLCBzaXplb2YobGFiZWwpLCAicGFyYWxsZWwlZCIsIGkpOworICAgICAgICAgICAgcGFyYWxsZWxfaGRzW2ldID0gcWVtdV9jaHJfb3BlbihsYWJlbCwgZGV2bmFtZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIXBhcmFsbGVsX2hkc1tpXSkgeworICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiBjb3VsZCBub3Qgb3BlbiBwYXJhbGxlbCBkZXZpY2UgJyVzJyIsIGRldm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1ZJUlRJT19DT05TT0xFUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldm5hbWUgPSB2aXJ0aW9fY29uc29sZXNbaV07CisgICAgICAgIGlmIChkZXZuYW1lICYmIHN0cmNtcChkZXZuYW1lLCAibm9uZSIpKSB7CisgICAgICAgICAgICBjaGFyIGxhYmVsWzMyXTsKKyAgICAgICAgICAgIHNucHJpbnRmKGxhYmVsLCBzaXplb2YobGFiZWwpLCAidmlydGNvbiVkIiwgaSk7CisgICAgICAgICAgICB2aXJ0Y29uX2hkc1tpXSA9IHFlbXVfY2hyX29wZW4obGFiZWwsIGRldm5hbWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKCF2aXJ0Y29uX2hkc1tpXSkgeworICAgICAgICAgICAgICAgIFBBTklDKCJxZW11OiBjb3VsZCBub3Qgb3BlbiB2aXJ0aW8gY29uc29sZSAnJXMnIiwgZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb2R1bGVfY2FsbF9pbml0KE1PRFVMRV9JTklUX0RFVklDRSk7CisKKworICAgIC8qIENoZWNrIHRoZSBDUFUgQXJjaGl0ZWN0dXJlIHZhbHVlICovCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhcioga1N1cHBvcnRlZEFyY2hzW10gPSB7CisjaWYgZGVmaW5lZChUQVJHRVRfQVJNKQorICAgICAgICAgICAgImFybSIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9JMzg2KQorICAgICAgICAgICAgIng4NiIsCisjZW5kaWYKKyNpZiBkZWZpbmVkKFRBUkdFVF9YODZfNjQpCisgICAgICAgICAgICAieDg2XzY0IiwKKyNlbmRpZgorI2lmIGRlZmluZWQoVEFSR0VUX01JUFMpCisgICAgICAgICAgICAibWlwcyIsCisjZW5kaWYKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdXBwb3J0ZWRBcmNocyA9CisgICAgICAgICAgICAgICAgc2l6ZW9mKGtTdXBwb3J0ZWRBcmNocykgLyBzaXplb2Yoa1N1cHBvcnRlZEFyY2hzWzBdKTsKKyAgICAgICAgYm9vbCBzdXBwb3J0ZWRfYXJjaCA9IGZhbHNlOworICAgICAgICBzaXplX3QgbjsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGtOdW1TdXBwb3J0ZWRBcmNoczsgKytuKSB7CisgICAgICAgICAgICBpZiAoIXN0cmNtcChhbmRyb2lkX2h3LT5od19jcHVfYXJjaCwga1N1cHBvcnRlZEFyY2hzW25dKSkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9hcmNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXN1cHBvcnRlZF9hcmNoKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0tIEludmFsaWQgQ1BVIGFyY2hpdGVjdHVyZTogJXMsIHZhbGlkIHZhbHVlczoiLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2h3LT5od19jcHVfYXJjaCk7CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwga051bVN1cHBvcnRlZEFyY2hzOyArK24pIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlcyIsIGtTdXBwb3J0ZWRBcmNoc1tuXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdyYWIgQ1BVIG1vZGVsIGlmIHByb3ZpZGVkIGluIGhhcmR3YXJlLmluaSAqLworICAgIGlmICggICAgIWNwdV9tb2RlbAorICAgICAgICAgJiYgYW5kcm9pZF9ody0+aHdfY3B1X21vZGVsCisgICAgICAgICAmJiBhbmRyb2lkX2h3LT5od19jcHVfbW9kZWxbMF0gIT0gJ1wwJykKKyAgICB7CisgICAgICAgIGNwdV9tb2RlbCA9IGFuZHJvaWRfaHctPmh3X2NwdV9tb2RlbDsKKyAgICB9CisKKyAgICBWRVJCT1NFX1BSSU5UKGluaXQsICJLZXJuZWwgcGFyYW1ldGVyczogJXMiLCBrZXJuZWxfY21kbGluZSk7CisKKyAgICBtYWNoaW5lLT5pbml0KHJhbV9zaXplLAorICAgICAgICAgICAgICAgICAgICBib290X2RldmljZXMsCisgICAgICAgICAgICAgICAgICAgIGtlcm5lbF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAga2VybmVsX2NtZGxpbmUsCisgICAgICAgICAgICAgICAgICAgIGluaXRyZF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY3B1X21vZGVsKTsKKworICAgIC8qIEluaXRpYWxpemUgbXVsdGktdG91Y2ggZW11bGF0aW9uLiAqLworICAgIGlmIChhbmRyb2lkSHdDb25maWdfaXNTY3JlZW5NdWx0aVRvdWNoKGFuZHJvaWRfaHcpKSB7CisgICAgICAgIG10c19wb3J0X2NyZWF0ZShOVUxMLCBnUUFuZHJvaWRVc2VyRXZlbnRBZ2VudCwgZ1FBbmRyb2lkRGlzcGxheUFnZW50KTsKKyAgICB9CisKKyAgICAvKiBTZW5kIHRoZSBjb21tYW5kLWxpbmUgYm9vdCBwYXJhbWV0ZXJzIG5vdy4gVGhlIG90aGVyCisgICAgICogcGFyYW1ldGVycyBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIHNvIHRoZXNlIHdpbGwKKyAgICAgKiB0YWtlIHByZWNlbmRlbmNlLgorICAgICAqLworICAgIHByb2Nlc3NfY21kX2Jvb3RfcHJvcGVydGllcygpOworCisgICAgQ1BVX0ZPUkVBQ0goY3B1KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9udW1hX25vZGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChub2RlX2NwdW1hc2tbaV0gJiAoMSA8PCBjcHUtPmNwdV9pbmRleCkpIHsKKyAgICAgICAgICAgICAgICBjcHUtPm51bWFfbm9kZSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhbmRyb2lkX2h3X3NlbnNvcnNfaW5pdF9yZW1vdGVfY29udHJvbGxlcigpOworCisgICAgY3VycmVudF9tYWNoaW5lID0gbWFjaGluZTsKKworICAgIC8qIFNldCBLVk0ncyB2Y3B1IHN0YXRlIHRvIHFlbXUncyBpbml0aWFsIENQVU9sZFN0YXRlLiAqLworICAgIGlmIChrdm1fZW5hYmxlZCgpKSB7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0ga3ZtX3N5bmNfdmNwdXMoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFBBTklDKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB2Y3B1cyIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBDT05GSUdfSEFYCisgICAgaWYgKGhheF9lbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKGhheF9zeW5jX3ZjcHVzKCkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludGVybmFsIGVycm9yOiBpbml0aWFsIGhheCBzeW5jIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLyogY2FsbCBhbmRyb2lkLXNwZWNpZmljIHNldHVwIGZ1bmN0aW9uICovCisgICAgaWYgKCFxZW11X2FuZHJvaWRfZW11bGF0aW9uX3NldHVwKCkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYW5kcm9pZF9lbXVsYXRvcl9zZXRfYmFzZV9wb3J0KGFuZHJvaWRfYmFzZV9wb3J0KTsKKworICAgIC8qIGp1c3QgdXNlIHRoZSBmaXJzdCBkaXNwbGF5c3RhdGUgZm9yIHRoZSBtb21lbnQgKi8KKyAgICBkcyA9IGdldF9kaXNwbGF5c3RhdGUoKTsKKworICAgIC8qIEluaXRpYWxpemUgZGlzcGxheSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gKi8KKyAgICBhbmRyb2lkX2Rpc3BsYXlfcmVzZXQoZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZGlzcGxheV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kaXNwbGF5X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9kaXNwbGF5X2JwcCk7CisKKyAgICBpZiAoZGlzcGxheV90eXBlID09IERUX0RFRkFVTFQpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TREwpIHx8IGRlZmluZWQoQ09ORklHX0NPQ09BKQorICAgICAgICBkaXNwbGF5X3R5cGUgPSBEVF9TREw7CisjZWxpZiBkZWZpbmVkKENPTkZJR19RVCkKKyAgICAgICAgZGlzcGxheV90eXBlID0gRFRfUVQ7CisjZWxzZQorICAgICAgICBkaXNwbGF5X3R5cGUgPSBEVF9WTkM7CisgICAgICAgIHZuY19kaXNwbGF5ID0gImxvY2FsaG9zdDowLHRvPTk5IjsKKyAgICAgICAgc2hvd192bmNfcG9ydCA9IDE7CisjZW5kaWYKKyAgICB9CisKKworICAgIHN3aXRjaCAoZGlzcGxheV90eXBlKSB7CisgICAgY2FzZSBEVF9OT0dSQVBISUM6CisgICAgICAgIGJyZWFrOworI2lmIGRlZmluZWQoQ09ORklHX0NVUlNFUykKKyAgICBjYXNlIERUX0NVUlNFUzoKKyAgICAgICAgY3Vyc2VzX2Rpc3BsYXlfaW5pdChkcywgZnVsbF9zY3JlZW4pOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NETCkKKyAgICBjYXNlIERUX1NETDoKKyAgICAgICAgc2RsX2Rpc3BsYXlfaW5pdChkcywgZnVsbF9zY3JlZW4sIG5vX2ZyYW1lKTsKKyAgICAgICAgYnJlYWs7CisjZWxpZiBkZWZpbmVkKENPTkZJR19RVCkKKyAgICBjYXNlIERUX1FUOgorICAgICAgICBzZGxfZGlzcGxheV9pbml0KGRzLCBmdWxsX3NjcmVlbiwgbm9fZnJhbWUpOworICAgICAgICBicmVhazsKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPQ09BKQorICAgIGNhc2UgRFRfU0RMOgorICAgIGNhc2UgRFRfUVQ6CisgICAgICAgIGNvY29hX2Rpc3BsYXlfaW5pdChkcywgZnVsbF9zY3JlZW4pOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgRFRfVk5DOgorICAgICAgICB2bmNfZGlzcGxheV9pbml0KGRzKTsKKyAgICAgICAgaWYgKHZuY19kaXNwbGF5X29wZW4oZHMsIHZuY19kaXNwbGF5KSA8IDApIHsKKyAgICAgICAgICAgIFBBTklDKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBWTkMgZGlzcGxheSIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvd192bmNfcG9ydCkgeworICAgICAgICAgICAgcHJpbnRmKCJWTkMgc2VydmVyIHJ1bm5pbmcgb24gYCVzJ1xuIiwgdm5jX2Rpc3BsYXlfbG9jYWxfYWRkcihkcykpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkcHlfcmVzaXplKGRzKTsKKworICAgIGRjbCA9IGRzLT5saXN0ZW5lcnM7CisgICAgd2hpbGUgKGRjbCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkY2wtPmRweV9yZWZyZXNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRzLT5ndWlfdGltZXIgPSB0aW1lcl9uZXcoUUVNVV9DTE9DS19SRUFMVElNRSwgU0NBTEVfTVMsIGd1aV91cGRhdGUsIGRzKTsKKyAgICAgICAgICAgIHRpbWVyX21vZChkcy0+Z3VpX3RpbWVyLCBxZW11X2Nsb2NrX2dldF9tcyhRRU1VX0NMT0NLX1JFQUxUSU1FKSk7CisgICAgICAgIH0KKyAgICAgICAgZGNsID0gZGNsLT5uZXh0OworICAgIH0KKworICAgIGlmIChkaXNwbGF5X3R5cGUgPT0gRFRfTk9HUkFQSElDIHx8IGRpc3BsYXlfdHlwZSA9PSBEVF9WTkMpIHsKKyAgICAgICAgbm9ncmFwaGljX3RpbWVyID0gdGltZXJfbmV3KFFFTVVfQ0xPQ0tfUkVBTFRJTUUsIFNDQUxFX01TLCBub2dyYXBoaWNfdXBkYXRlLCBOVUxMKTsKKyAgICAgICAgdGltZXJfbW9kKG5vZ3JhcGhpY190aW1lciwgcWVtdV9jbG9ja19nZXRfbXMoUUVNVV9DTE9DS19SRUFMVElNRSkpOworICAgIH0KKworICAgIHRleHRfY29uc29sZXNfc2V0X2Rpc3BsYXkoZHMpOworICAgIHFlbXVfY2hyX2luaXRpYWxfcmVzZXQoKTsKKworICAgIGlmIChtb25pdG9yX2RldmljZSAmJiBtb25pdG9yX2hkKQorICAgICAgICBtb25pdG9yX2luaXQobW9uaXRvcl9oZCwgTU9OSVRPUl9VU0VfUkVBRExJTkUgfCBNT05JVE9SX0lTX0RFRkFVTFQpOworCisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1NFUklBTF9QT1JUUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldm5hbWUgPSBzZXJpYWxfZGV2aWNlc1tpXTsKKyAgICAgICAgaWYgKGRldm5hbWUgJiYgc3RyY21wKGRldm5hbWUsICJub25lIikpIHsKKyAgICAgICAgICAgIGlmIChzdHJzdGFydChkZXZuYW1lLCAidmMiLCAwKSkKKyAgICAgICAgICAgICAgICBxZW11X2Nocl9wcmludGYoc2VyaWFsX2hkc1tpXSwgInNlcmlhbCVkIGNvbnNvbGVcclxuIiwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBNQVhfUEFSQUxMRUxfUE9SVFM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICpkZXZuYW1lID0gcGFyYWxsZWxfZGV2aWNlc1tpXTsKKyAgICAgICAgaWYgKGRldm5hbWUgJiYgc3RyY21wKGRldm5hbWUsICJub25lIikpIHsKKyAgICAgICAgICAgIGlmIChzdHJzdGFydChkZXZuYW1lLCAidmMiLCAwKSkKKyAgICAgICAgICAgICAgICBxZW11X2Nocl9wcmludGYocGFyYWxsZWxfaGRzW2ldLCAicGFyYWxsZWwlZCBjb25zb2xlXHJcbiIsIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1ZJUlRJT19DT05TT0xFUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldm5hbWUgPSB2aXJ0aW9fY29uc29sZXNbaV07CisgICAgICAgIGlmICh2aXJ0Y29uX2hkc1tpXSAmJiBkZXZuYW1lKSB7CisgICAgICAgICAgICBpZiAoc3Ryc3RhcnQoZGV2bmFtZSwgInZjIiwgMCkpCisgICAgICAgICAgICAgICAgcWVtdV9jaHJfcHJpbnRmKHZpcnRjb25faGRzW2ldLCAidmlydGlvIGNvbnNvbGUlZFxyXG4iLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZGJzdHViX2RldiAmJiBnZGJzZXJ2ZXJfc3RhcnQoZ2Ric3R1Yl9kZXYpIDwgMCkgeworICAgICAgICBQQU5JQygicWVtdTogY291bGQgbm90IG9wZW4gZ2Ric2VydmVyIG9uIGRldmljZSAnJXMnIiwKKyAgICAgICAgICAgICAgICBnZGJzdHViX2Rldik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworCisgICAgaWYgKGxvYWR2bSkKKyAgICAgICAgZG9fbG9hZHZtKGN1cl9tb24sIGxvYWR2bSk7CisKKyAgICBpZiAoaW5jb21pbmcpIHsKKyAgICAgICAgYXV0b3N0YXJ0ID0gMDsgLyogZml4bWUgaG93IHRvIGRlYWwgd2l0aCAtZGFlbW9uaXplICovCisgICAgICAgIHFlbXVfc3RhcnRfaW5jb21pbmdfbWlncmF0aW9uKGluY29taW5nKTsKKyAgICB9CisKKyAgICBpZiAoYXV0b3N0YXJ0KQorICAgICAgICB2bV9zdGFydCgpOworCisgICAgb3Nfc2V0dXBfcG9zdCgpOworCisgICAgLyogSW5pdGlhbGl6ZSBtZXRyaWNzIHJpZ2h0IGJlZm9yZSBlbnRlcmluZyBtYWluIGxvb3AuCisgICAgICogV2Ugd2FudCB0byB0cmFjayBwZXJmb3JtYW5jZSBvZiBhIHJ1bm5pbmcgZW11bGF0b3IsIGlnbm9yaW5nIGFueSBlYXJseQorICAgICAqIGV4aXRzIGFzIGEgcmVzdWx0IG9mIGluY29ycmVjdCBzZXR1cC4KKyAgICAgKi8KKyAgICBhbmRyb2lkX2luaXRfbWV0cmljcyghb3BlbmdsX2Jyb2tlbik7CisgICAgaWYgKG9wZW5nbF9icm9rZW4pIHsKKyAgICAgICAgZGVycm9yKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSBPcGVuZ2xFUyBlbXVsYXRpb24sIHVzZSAnLWdwdSBvZmYnICIKKyAgICAgICAgICAgICAgICJ0byBkaXNhYmxlIGl0LiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBhbmRyb2lkX2NoZWNrX2Zvcl91cGRhdGVzKCk7CisKKyAgICBtYWluX2xvb3AoKTsKKyNpZmRlZiBDT05GSUdfQU5EUk9JRAorICAgIGNyYXNoaGFuZGxlcl9leGl0bW9kZSgiYWZ0ZXIgbWFpbl9sb29wIik7CisjZW5kaWYKKyAgICBxdWl0X3RpbWVycygpOworICAgIG5ldF9jbGVhbnVwKCk7CisgICAgYW5kcm9pZF93ZWFyX2FnZW50X3N0b3AoKTsKKyAgICBzb2NrZXRfZHJhaW5lcl9zdG9wKCk7CisgICAgYW5kcm9pZF9lbXVsYXRpb25fdGVhcmRvd24oKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhbmRyb2lkX2NoZWNrX2Zvcl91cGRhdGVzKCkgeworICAgIGFuZHJvaWRfY2hlY2tGb3JVcGRhdGVzKFFFTVVfQ09SRV9WRVJTSU9OKTsKK30KKwordm9pZAorYW5kcm9pZF9lbXVsYXRpb25fdGVhcmRvd24odm9pZCkKK3sKKyAgICBza2luX2NoYXJtYXBfZG9uZSgpOworICAgIGFuZHJvaWRfdGVhcmRvd25fbWV0cmljcygpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9yZWJ1aWxkLnNoIGIvYW5kcm9pZC9yZWJ1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkZDFiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3JlYnVpbGQuc2gKQEAgLTAsMCArMSwzMzQgQEAKKyMhL2Jpbi9zaAorIworIyB0aGlzIHNjcmlwdCBpcyB1c2VkIHRvIHJlYnVpbGQgYWxsIFFFTVUgYmluYXJpZXMgZm9yIHRoZSBob3N0CisjIHBsYXRmb3Jtcy4KKyMKKyMgYXNzdW1lIHRoYXQgdGhlIGRldmljZSB0cmVlIGlzIGluIFRPUAorIworCitzZXQgLWUKK2V4cG9ydCBMQU5HPUMKK2V4cG9ydCBMQ19BTEw9QworCitQUk9HRElSPSQoZGlybmFtZSAiJDAiKQorVkVSQk9TRT0xCisKK01JTkdXPQorTk9fVEVTVFM9CitPVVRfRElSPW9ianMKKworZm9yIE9QVDsgZG8KKyAgICBjYXNlICRPUFQgaW4KKyAgICAgICAgLS1hb3NwLXByZWJ1aWx0cy1kaXI9KikKKyAgICAgICAgICAgIEFORFJPSURfRU1VTEFUT1JfUFJFQlVJTFRTX0RJUj0ke09QVCMjLS1hb3NwLXByZWJ1aWx0cy1kaXI9fQorICAgICAgICAgICAgOzsKKyAgICAgICAgLS1taW5ndykKKyAgICAgICAgICAgIE1JTkdXPXRydWUKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tdmVyYm9zZSkKKyAgICAgICAgICAgIFZFUkJPU0U9JCgoICRWRVJCT1NFICsgMSApKQorICAgICAgICAgICAgOzsKKyAgICAgICAgLS12ZXJib3NpdHk9KikKKyAgICAgICAgICAgIFZFUkJPU0U9JHtPUFQjIy0tdmVyYm9zaXR5PX0KKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tbm8tdGVzdHMpCisgICAgICAgICAgICBOT19URVNUUz10cnVlCisgICAgICAgICAgICA7OworICAgICAgICAtLW91dC1kaXI9KikKKyAgICAgICAgICAgIE9VVF9ESVI9JHtPUFQjIy0tb3V0LWRpcj19CisgICAgICAgICAgICA7OworICAgICAgICAtLWhlbHB8LT8pCisgICAgICAgICAgICBWRVJCT1NFPTIKKyAgICAgICAgICAgIDs7CisgICAgICAgIC0tZGVidWcpCisgICAgICAgICAgICBPUFRERUJVRz10cnVlCisgICAgICAgICAgICA7OworICAgIGVzYWMKK2RvbmUKKworcGFuaWMgKCkgeworICAgIGVjaG8gIkVSUk9SOiAkQCIKKyAgICBleGl0IDEKK30KKworcnVuICgpIHsKKyAgICBpZiBbICIkVkVSQk9TRSIgLWd0IDIgXTsgdGhlbgorICAgICAgICBlY2hvICJDT01NQU5EOiAkQCIKKyAgICAgICAgIiRAIgorICAgIGVsaWYgWyAiJFZFUkJPU0UiIC1ndCAxIF07IHRoZW4KKyAgICAgICAgIiRAIgorICAgIGVsc2UKKyAgICAgICAgIiRAIiA+L2Rldi9udWxsIDI+JjEKKyAgICBmaQorfQorCitsb2cgKCkgeworICAgIGlmIFsgIiRWRVJCT1NFIiAtZ3QgMSBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJXNcbiIgIiQqIgorICAgIGZpCit9CisKK0hPU1RfT1M9JCh1bmFtZSAtcykKK2Nhc2UgJEhPU1RfT1MgaW4KKyAgICBMaW51eCkKKyAgICAgICAgSE9TVF9OVU1fQ1BVUz1gY2F0IC9wcm9jL2NwdWluZm8gfCBncmVwIHByb2Nlc3NvciB8IHdjIC1sYAorICAgICAgICA7OworICAgIERhcndpbnxGcmVlQlNEKQorICAgICAgICBIT1NUX05VTV9DUFVTPWBzeXNjdGwgLW4gaHcubmNwdWAKKyAgICAgICAgOzsKKyAgICBDWUdXSU4qfCpfTlQtKikKKyAgICAgICAgSE9TVF9OVU1fQ1BVUz0kTlVNQkVSX09GX1BST0NFU1NPUlMKKyAgICAgICAgOzsKKyAgICAqKSAgIyBsZXQncyBwbGF5IHNhZmUgaGVyZQorICAgICAgICBIT1NUX05VTV9DUFVTPTEKK2VzYWMKKworIyBSZXR1cm4gdGhlIHR5cGUgb2YgYSBnaXZlbiBmaWxlLCB1c2luZyB0aGUgL3Vzci9iaW4vZmlsZSBjb21tYW5kLgorIyAkMTogZXhlY3V0YWJsZSBwYXRoLgorIyBPdXQ6IGZpbGUgdHlwZSBzdHJpbmcsIG9yIGVtcHR5IGlmIHRoZSBwYXRoIGlzIHdyb25nLgorZ2V0X2ZpbGVfdHlwZSAoKSB7CisgICAgL3Vzci9iaW4vZmlsZSAiJDEiIDI+L2Rldi9udWxsCit9CisKKyMgUmV0dXJuIHRydWUgaWZmIHRoZSBmaWxlIHR5cGUgc3RyaW5nIHwkMXwgY29udGFpbnMgdGhlIGV4cGVjdGVkCisjIHN1YnN0cmluZyB8JDJ8LgorIyAkMTogZXhlY3V0YWJsZSBmaWxlIHR5cGUKKyMgJDI6IGV4cGVjdGVkIGZpbGUgdHlwZSBzdWJzdHJpbmcKK2NoZWNrX2ZpbGVfdHlwZV9zdWJzdHJpbmcgKCkgeworICAgIHByaW50ZiAiJXNcbiIgIiQxIiB8IGdyZXAgLXEgLUUgLWUgIiQyIgorfQorCisjIERlZmluZSBFWFBFQ1RFRF8zMkJJVF9GSUxFX1RZUEUgYW5kIEVYUEVDVEVEXzY0QklUX0ZJTEVfVFlQRSBkZXBlbmRpbmcKKyMgb24gdGhlIGN1cnJlbnQgdGFyZ2V0IHBsYXRmb3JtLiBUaGVuIEVYUEVDVEVEX0VNVUxBVE9SX0JJVE5FU1MgYW5kCisjIEVYUEVDVEVEX0VNVUxBVE9SX0ZJTEVfVFlQRSBhY2NvcmRpbmdseS4KK2lmIFsgIiRNSU5HVyIgXTsgdGhlbgorICAgIEVYUEVDVEVEXzMyQklUX0ZJTEVfVFlQRT0iUEUzMiBleGVjdXRhYmxlIFwoY29uc29sZVwpIEludGVsIDgwMzg2IgorICAgIEVYUEVDVEVEXzY0QklUX0ZJTEVfVFlQRT0iUEUzMlwrIGV4ZWN1dGFibGUgXChjb25zb2xlXCkgeDg2LTY0IgorICAgIEVYUEVDVEVEX0VNVUxBVE9SX0JJVE5FU1M9MzIKKyAgICBFWFBFQ1RFRF9FTVVMQVRPUl9GSUxFX1RZUEU9JEVYUEVDVEVEXzMyQklUX0ZJTEVfVFlQRQorICAgIFRBUkdFVF9PUz13aW5kb3dzCitlbGlmIFsgIiRIT1NUX09TIiA9ICJEYXJ3aW4iIF07IHRoZW4KKyAgICBFWFBFQ1RFRF8zMkJJVF9GSUxFX1RZUEU9Ik1hY2gtTyBleGVjdXRhYmxlIGkzODYiCisgICAgRVhQRUNURURfNjRCSVRfRklMRV9UWVBFPSJNYWNoLU8gNjQtYml0IGV4ZWN1dGFibGUgeDg2XzY0IgorICAgIEVYUEVDVEVEX0VNVUxBVE9SX0JJVE5FU1M9NjQKKyAgICBFWFBFQ1RFRF9FTVVMQVRPUl9GSUxFX1RZUEU9JEVYUEVDVEVEXzY0QklUX0ZJTEVfVFlQRQorICAgIFRBUkdFVF9PUz1kYXJ3aW4KK2Vsc2UKKyAgICBFWFBFQ1RFRF8zMkJJVF9GSUxFX1RZUEU9IkVMRiAzMi1iaXQgTFNCICtleGVjdXRhYmxlLCBJbnRlbCA4MDM4NiIKKyAgICBFWFBFQ1RFRF82NEJJVF9GSUxFX1RZUEU9IkVMRiA2NC1iaXQgTFNCICtleGVjdXRhYmxlLCB4ODYtNjQiCisgICAgRVhQRUNURURfRU1VTEFUT1JfQklUTkVTUz02NAorICAgIEVYUEVDVEVEX0VNVUxBVE9SX0ZJTEVfVFlQRT0kRVhQRUNURURfNjRCSVRfRklMRV9UWVBFCisgICAgVEFSR0VUX09TPWxpbnV4CitmaQorCisjIEJ1aWxkIHRoZSBiaW5hcmllcyBmcm9tIHNvdXJjZXMuCitjZCAiJFBST0dESVIiLy4uCitybSAtcmYgIiRPVVRfRElSIgorZWNobyAiQ29uZmlndXJpbmcgYnVpbGQuIgorZXhwb3J0IElOX0FORFJPSURfUkVCVUlMRF9TSD0xCitydW4gYW5kcm9pZC9jb25maWd1cmUuc2ggLS1vdXQtZGlyPSRPVVRfRElSICIkQCIgfHwKKyAgICBwYW5pYyAiQ29uZmlndXJhdGlvbiBlcnJvciwgcGxlYXNlIHJ1biAuL2FuZHJvaWQvY29uZmlndXJlLnNoIHRvIHNlZSB3aHkuIgorCitDT05GSUdfTUFLRT0kT1VUX0RJUi9idWlsZC9jb25maWcubWFrZQoraWYgWyAhIC1mICIkQ09ORklHX01BS0UiIF07IHRoZW4KKyAgICBwYW5pYyAiQ2Fubm90IGZpbmQ6ICRDT05GSUdfTUFLRSIKK2ZpCisKK2VjaG8gIkJ1aWxkaW5nIHNvdXJjZXMuIgorcnVuIG1ha2UgLWokSE9TVF9OVU1fQ1BVUyBCVUlMRF9PQkpTX0RJUj0iJE9VVF9ESVIiIHx8CisgICAgcGFuaWMgIkNvdWxkIG5vdCBidWlsZCBzb3VyY2VzLCBwbGVhc2UgcnVuICdtYWtlJyB0byBzZWUgd2h5LiIKKworUlVOXzMyQklUX1RFU1RTPQorUlVOXzY0QklUX1RFU1RTPXRydWUKK1JVTl9FTVVHRU5fVEVTVFM9dHJ1ZQorUlVOX0dFTl9FTlRSSUVTX1RFU1RTPXRydWUKKworVEVTVF9TSEVMTD0KK0VYRV9TVUZGSVg9CisKK2lmIFsgIiRIT1NUX09TIiA9ICJMaW51eCIgXTsgdGhlbgorICAgICMgTGludXggMzItYml0IGJpbmFyaWVzIGFyZSBvYnNvbGV0ZS4KKyAgICBSVU5fMzJCSVRfVEVTVFM9CitmaQorCitpZiBbICIkTUlOR1ciIF07IHRoZW4KKyAgICBURVNUX1NIRUxMPXdpbmUKKyAgICBFWEVfU1VGRklYPS5leGUKKworICAgICMgQ2hlY2sgZm9yIFdpbmUgb24gdGhpcyBtYWNoaW5lLgorICAgIGlmIFsgLXogIiROT19URVNUUyIgXTsgdGhlbgorICAgICAgICBXSU5FX0NNRD0kKHdoaWNoICRURVNUX1NIRUxMIDI+L2Rldi9udWxsIHx8IHRydWUpCisgICAgICAgIGlmIFsgLXogIiRXSU5FX0NNRCIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiV0FSTklORzogV2luZSBpcyBub3QgaW5zdGFsbGVkIG9uIHRoaXMgbWFjaGluZSEhIFVuaXQgdGVzdHMgd2lsbCBiZSBpZ25vcmVkISEiCisgICAgICAgICAgICBOT19URVNUUz10cnVlCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdJTkVfVkVSU0lPTj0kKCIkV0lORV9DTUQiIC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkKKyAgICAgICAgICAgIGNhc2UgJFdJTkVfVkVSU0lPTiBpbgorICAgICAgICAgICAgICAgIHdpbmUtMS44Lip8d2luZS0xLjkuKnx3aW5lLTEuMT8uKikKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICBlY2hvICJXQVJOSU5HOiBZb3VyIFdpbmUgdmVyc2lvbiAoJFdJTkVfVkVSU0lPTikgaXMgdG9vIG9sZCwgPj0gMS44IHJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICBlY2hvICJVbml0IHRlc3RzIHdpbGwgYmUgaWdub3JlZCEhIgorICAgICAgICAgICAgICAgICAgICBOT19URVNUUz10cnVlCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGZpCisgICAgZmkKKworICAgIFJVTl8zMkJJVF9URVNUUz10cnVlCitmaQorCisjIFJldHVybiB0aGUgbWluaW11bSBPUyBYIHZlcnNpb24gdGhhdCBhIERhcndpbiBiaW5hcnkgdGFyZ2V0cy4KKyMgJDE6IGV4ZWN1dGFibGUgcGF0aAorIyBPdXQ6IG1pbmltdW0gdmVyc2lvbiAoZS5nLiAnMTAuOCcpIG9yIGVtcHR5IHN0cmluZyBvbiBlcnJvci4KK2Rhcndpbl9taW5fdmVyc2lvbiAoKSB7CisgICAgb3Rvb2wgLWwgIiQxIiAyPi9kZXYvbnVsbCB8IGF3ayBcCisgICAgICAgICAgJ0JFR0lOIHsgQ01EPSIiIH0gJDEgPT0gImNtZCIgeyBDTUQ9JDIgfSAkMSA9PSAidmVyc2lvbiIgJiYgQ01EID09ICJMQ19WRVJTSU9OX01JTl9NQUNPU1giIHsgcHJpbnQgJDIgfScKK30KKworT1NYX0RFUExPWU1FTlRfVEFSR0VUPTEwLjgKKworIyBMaXN0IGFsbCBleGVjdXRhYmxlcyB0byBjaGVjayBsYXRlci4KK0VYRUNVVEFCTEVTPSJlbXVsYXRvciBlbXVsYXRvcjY0LWFybSBlbXVsYXRvcjY0LXg4NiBlbXVsYXRvcjY0LW1pcHMiCitpZiBbICIkSE9TVF9PUyIgIT0gIkRhcndpbiIgXTsgdGhlbgorICAgIEVYRUNVVEFCTEVTPSIkRVhFQ1VUQUJMRVMgZW11bGF0b3ItYXJtIGVtdWxhdG9yLXg4NiBlbXVsYXRvci1taXBzIgorZmkKKworaWYgWyAteiAiJE5PX1RFU1RTIiBdOyB0aGVuCisgICAgRkFJTFVSRVM9IiIKKworICAgIGVjaG8gIkNoZWNraW5nIGZvciAnZW11bGF0b3InIGxhdW5jaGVyIHByb2dyYW0uIgorICAgIEVNVUxBVE9SPSRPVVRfRElSL2VtdWxhdG9yJEVYRV9TVUZGSVgKKyAgICBpZiBbICEgLWYgIiRFTVVMQVRPUiIgXTsgdGhlbgorICAgICAgICBlY2hvICIgICAgLSBGQUlMOiAkRU1VTEFUT1IgaXMgbWlzc2luZyEiCisgICAgICAgIEZBSUxVUkVTPSIkRkFJTFVSRVMgZW11bGF0b3IiCisgICAgZmkKKworICAgIGVjaG8gIkNoZWNraW5nIHRoYXQgJ2VtdWxhdG9yJyBpcyBhICRFWFBFQ1RFRF9FTVVMQVRPUl9CSVRORVNTLWJpdCBwcm9ncmFtLiIKKyAgICBFTVVMQVRPUl9GSUxFX1RZUEU9JChnZXRfZmlsZV90eXBlICIkRU1VTEFUT1IiKQorICAgIGlmICEgY2hlY2tfZmlsZV90eXBlX3N1YnN0cmluZyAiJEVNVUxBVE9SX0ZJTEVfVFlQRSIgIiRFWFBFQ1RFRF9FTVVMQVRPUl9GSUxFX1RZUEUiOyB0aGVuCisgICAgICAgIGVjaG8gIiAgICAtIEZBSUw6ICRFTVVMQVRPUiBpcyBub3QgYSAzMi1iaXQgZXhlY3V0YWJsZSEiCisgICAgICAgIGVjaG8gIiAgICAgICAgRmlsZSB0eXBlOiAkRU1VTEFUT1JfRklMRV9UWVBFIgorICAgICAgICBlY2hvICIgICAgICAgIEV4cGVjdGVkIDogJEVYUEVDVEVEX0VNVUxBVE9SX0ZJTEVfVFlQRSIKKyAgICAgICAgRkFJTFVSRVM9IiRGQUlMVVJFUyBlbXVsYXRvci1iaXRuZXNzLWNoZWNrIgorICAgIGZpCisKKyAgICBpZiBbICIkSE9TVF9PUyIgPSAiRGFyd2luIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNoZWNraW5nIHRoYXQgRGFyd2luIGJpbmFyaWVzIHRhcmdldCBPU1ggJE9TWF9ERVBMT1lNRU5UX1RBUkdFVCIKKyAgICAgICAgZm9yIEVYRUMgaW4gJEVYRUNVVEFCTEVTOyBkbworICAgICAgICAgICAgTUlOX1ZFUlNJT049JChkYXJ3aW5fbWluX3ZlcnNpb24gIiRPVVRfRElSLyRFWEVDIikKKyAgICAgICAgICAgIGlmIFsgIiRNSU5fVkVSU0lPTiIgIT0gIiRPU1hfREVQTE9ZTUVOVF9UQVJHRVQiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICIgICAtIEZBSUw6ICRFWEVDIHRhcmdldHMgWyRNSU5fVkVSU0lPTl0sIGV4cGVjdGVkIFskT1NYX0RFUExPWU1FTlRfVEFSR0VUXSIKKyAgICAgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTICRFWEVDLWRhcndpbi10YXJnZXQiCisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZmkKKworICAgICMgTk9URTogbGliWzY0XU9wZW5nbFJlbmRlcl91bml0dGVzdHMgYXJlIHRlbXBvcmFyaWx5IGRpc2FibGVkIGJlY2F1c2UgdGhleQorICAgICMgICAgICAgZmFpbCB0byBydW4gb24gb3VyIGJ1aWxkIHNlcnZlcnMsIHdoaWNoIHVzZSBhIGRpZmZlcmVudCBsaWJzdGRjKysKKyAgICAjICAgICAgIHZlcnNpb24gOi0vCisKKyAgICBpZiBbICIkUlVOXzMyQklUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIlJ1bm5pbmcgMzItYml0IHVuaXQgdGVzdCBzdWl0ZS4iCisgICAgICAgIGZvciBVTklUX1RFU1QgaW4gYW5kcm9pZF9lbXVfdW5pdHRlc3RzIGVtdWdsX2NvbW1vbl9ob3N0X3VuaXR0ZXN0cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3JfbGlidWlfdW5pdHRlc3RzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbXVsYXRvcl9jcmFzaHJlcG9ydF91bml0dGVzdHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpYkdMY29tbW9uX3VuaXR0ZXN0czsgZG8KKyAgICAgICAgICAgIGZvciBURVNUIGluICRPVVRfRElSLyRVTklUX1RFU1QkRVhFX1NVRkZJWDsgZG8KKyAgICAgICAgICAgICAgICBlY2hvICIgICAtICR7VEVTVCMkT1VUX0RJUi99IgorICAgICAgICAgICAgICAgIHJ1biAkVEVTVF9TSEVMTCAkVEVTVCB8fCBGQUlMVVJFUz0iJEZBSUxVUkVTICR7VEVTVCMkT1VUX0RJUi99IgorICAgICAgICAgICAgZG9uZQorICAgICAgICBkb25lCisgICAgZmkKKworICAgIGlmIFsgIiRSVU5fNjRCSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgZWNobyAiUnVubmluZyA2NC1iaXQgdW5pdCB0ZXN0IHN1aXRlLiIKKyAgICAgICAgZm9yIFVOSVRfVEVTVCBpbiBhbmRyb2lkX2VtdTY0X3VuaXR0ZXN0cyBlbXVnbDY0X2NvbW1vbl9ob3N0X3VuaXR0ZXN0cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZW11bGF0b3I2NF9saWJ1aV91bml0dGVzdHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGVtdWxhdG9yNjRfY3Jhc2hyZXBvcnRfdW5pdHRlc3RzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaWI2NEdMY29tbW9uX3VuaXR0ZXN0czsgZG8KKyAgICAgICAgICAgICBmb3IgVEVTVCBpbiAkT1VUX0RJUi8kVU5JVF9URVNUJEVYRV9TVUZGSVg7IGRvCisgICAgICAgICAgICAgICAgIGVjaG8gIiAgIC0gJHtURVNUIyRPVVRfRElSL30iCisgICAgICAgICAgICAgICAgIHJ1biAkVEVTVF9TSEVMTCAkVEVTVCB8fCBGQUlMVVJFUz0iJEZBSUxVUkVTICR7VEVTVCMkT1VUX0RJUi99IgorICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGZpCisKKyAgICBpZiBbICIkUlVOX0VNVUdFTl9URVNUUyIgXTsgdGhlbgorICAgICAgICBFTVVHRU5fVU5JVFRFU1RTPSRPVVRfRElSL2J1aWxkL2ludGVybWVkaWF0ZXM2NC9lbXVnZW5fdW5pdHRlc3RzL2VtdWdlbl91bml0dGVzdHMKKyAgICAgICAgaWYgWyAhIC1mICIkRU1VR0VOX1VOSVRURVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiRkFJTDogTWlzc2luZyBiaW5hcnk6ICRFTVVHRU5fVU5JVFRFU1RTIgorICAgICAgICAgICAgRkFJTFVSRVM9IiRGQUlMVVJFUyBlbXVnZW5fdW5pdHRlc3RzLWJpbmFyeSIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiUnVubmluZyBlbXVnZW5fdW5pdHRlc3RzLiIKKyAgICAgICAgICAgIHJ1biAkRU1VR0VOX1VOSVRURVNUUyB8fAorICAgICAgICAgICAgICAgIEZBSUxVUkVTPSIkRkFJTFVSRVMgZW11Z2VuX3VuaXR0ZXN0cyIKKyAgICAgICAgZmkKKyAgICAgICAgZWNobyAiUnVubmluZyBlbXVnZW4gcmVncmVzc2lvbiB0ZXN0IHN1aXRlLiIKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIGJpbmFyeSBpcyBhbHdheXMgYnVpbHQgZm9yIHRoZSAnYnVpbGQnIG1hY2hpbmUgdHlwZSwKKyAgICAgICAgIyBJLmUuIGlmIC0tbWluZ3cgaXMgdXNlZCwgaXQncyBzdGlsbCBhIExpbnV4IGV4ZWN1dGFibGUuCisgICAgICAgIEVNVUdFTj0kT1VUX0RJUi9idWlsZC9pbnRlcm1lZGlhdGVzNjQvZW11Z2VuL2VtdWdlbgorICAgICAgICBpZiBbICEgLWYgIiRFTVVHRU4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkZBSUw6IE1pc3NpbmcgJ2VtdWdlbicgYmluYXJ5OiAkRU1VR0VOIgorICAgICAgICAgICAgRkFJTFVSRVM9IiRGQUlMVVJFUyBlbXVnZW4tYmluYXJ5IgorICAgICAgICBlbHNlCisgICAgICAgICAgICAjIFRoZSBmaXJzdCBjYXNlIGlzIGZvciBhIHJlbW90ZSBidWlsZCB3aXRoIHBhY2thZ2UtcmVsZWFzZS5zaAorICAgICAgICAgICAgVEVTVF9TQ1JJUFQ9JFBST0dESVIvLi4vb3BlbmdsL2hvc3QvdG9vbHMvZW11Z2VuL3Rlc3RzL3J1bi10ZXN0cy5zaAorICAgICAgICAgICAgaWYgWyAhIC1mICIkVEVTVF9TQ1JJUFQiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIHVzdWFsIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgIFRFU1RfU0NSSVBUPSRQUk9HRElSL2FuZHJvaWQtZW11Z2wvaG9zdC90b29scy9lbXVnZW4vdGVzdHMvcnVuLXRlc3RzLnNoCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgWyAhIC1mICIkVEVTVF9TQ1JJUFQiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICIgRkFJTDogTWlzc2luZyBzY3JpcHQ6ICRURVNUX1NDUklQVCIKKyAgICAgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTIGVtdWdlbi10ZXN0LXNjcmlwdCIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBydW4gJFRFU1RfU0NSSVBUIC0tZW11Z2VuPSRFTVVHRU4gfHwKKyAgICAgICAgICAgICAgICAgICAgRkFJTFVSRVM9IiRGQUlMVVJFUyBlbXVnZW4tdGVzdC1zdWl0ZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisgICAgZmkKKworICAgICMgQ2hlY2sgdGhlIGdlbi1lbnRyaWVzLnB5IHNjcmlwdC4KKyAgICBpZiBbICIkUlVOX0dFTl9FTlRSSUVTX1RFU1RTIiBdOyB0aGVuCisgICAgICAgIGVjaG8gIlJ1bm5pbmcgZ2VuLWVudHJpZXMucHkgdGVzdCBzdWl0ZS4iCisgICAgICAgIHJ1biBhbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvcnVuLXRlc3RzLnNoIHx8CisgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTIGdlbi1lbnRyaWVzX3Rlc3RzIgorICAgIGZpCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIHdpbmRvd3MgZXhlY3V0YWJsZXMgYWxsIGhhdmUgaWNvbnMuCisgICAgIyBGaXJzdCBuZWVkIHRvIGxvY2F0ZSB0aGUgd2luZHJlcyB0b29sLgorICAgIGlmIFsgIiRNSU5HVyIgXTsgdGhlbgorICAgICAgICBlY2hvICJDaGVja2luZyB3aW5kb3dzIGV4ZWN1dGFibGVzIGljb25zLiIKKyAgICAgICAgaWYgWyAhIC1mICIkQ09ORklHX01BS0UiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIkZBSUw6IENvdWxkIG5vdCBmaW5kIFwkQ09ORklHX01BS0UgIT8iCisgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTIG91dC1kaXItY29uZmlnLW1ha2UiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFdJTkRSRVM9JChhd2sgJy9eQlVJTERfVEFSR0VUX1dJTkRSRVM6PS8geyBwcmludCAkMjsgfSAkMSA9PSAiQlVJTERfVEFSR0VUX1dJTkRSRVMiIHsgcHJpbnQgJDM7IH0nICRDT05GSUdfTUFLRSkgfHwKKyAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJGQUlMOiBDb3VsZCBub3QgZmluZCBob3N0ICd3aW5kcmVzJyBwcm9ncmFtIgorICAgICAgICAgICAgICAgIEZBSUxVUkVTPSIkRkFJTFVSRVMgaG9zdC13aW5kcmVzIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEVYUEVDVEVEX0lDT05TPTE0CisgICAgICAgICAgICBmb3IgRVhFQyBpbiAkRVhFQ1VUQUJMRVM7IGRvCisgICAgICAgICAgICAgICAgRVhFQz0ke0VYRUN9LmV4ZQorICAgICAgICAgICAgICAgIGlmIFsgISAtZiAiJE9VVF9ESVIiLyRFWEVDIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZWNobyAiRkFJTDogTWlzc2luZyB3aW5kb3dzIGV4ZWN1dGFibGU6ICRFWEVDIgorICAgICAgICAgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTIHdpbmRvd3MtJEVYRUMiCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBOVU1fSUNPTlM9JCgkV0lORFJFUyAtLWlucHV0LWZvcm1hdD1jb2ZmIC0tb3V0cHV0LWZvcm1hdD1yYyAkT1VUX0RJUi8kRVhFQyB8IGdyZXAgUlRfSUNPTiB8IHdjIC1sKQorICAgICAgICAgICAgICAgICAgICBpZiBbICIkTlVNX0lDT05TIiAhPSAiJEVYUEVDVEVEX0lDT05TIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJGQUlMOiBJbnZhbGlkIGljb24gY291bnQgaW4gJEVYRUMgKCROVU1fSUNPTlMsIGV4cGVjdGVkICRFWFBFQ1RFRF9JQ09OUykiCisgICAgICAgICAgICAgICAgICAgICAgICBGQUlMVVJFUz0iJEZBSUxVUkVTIHdpbmRvd3MtJEVYRUMtaWNvbnMiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIFsgIiRGQUlMVVJFUyIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiVW5pdCB0ZXN0IGZhaWx1cmVzOiAkRkFJTFVSRVMiCisgICAgZmkKK2Vsc2UKKyAgICBlY2hvICJJZ25vcmluZyB1bml0IHRlc3RzIHN1aXRlLiIKK2ZpCisKK2VjaG8gIkRvbmUuICEhIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLUFOR0xFLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLUFOR0xFLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkNDY5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtQU5HTEUuc2gKQEAgLTAsMCArMSwyOTEgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy4gJChkaXJuYW1lICIkMCIpL3V0aWxzL2NvbW1vbi5zaGkKKworc2hlbGxfaW1wb3J0IHV0aWxzL2Fvc3BfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2VtdWxhdG9yX3ByZWJ1aWx0cy5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9pbnN0YWxsX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfbGlzdF9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9idWlsZGVyLnNoaQorCitQUk9HUkFNX1BBUkFNRVRFUlM9IiIKKworUFJPR1JBTV9ERVNDUklQVElPTj1cCisiQnVpbGQgcHJlYnVpbHQgQU5HTEUgZm9yIExpbnV4LCBXaW5kb3dzIGFuZCBEYXJ3aW4uIgorCitwYWNrYWdlX2J1aWxkZXJfcmVnaXN0ZXJfb3B0aW9ucworCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCitpbnN0YWxsX2Rpcl9yZWdpc3Rlcl9vcHRpb24gImNvbW1vbi9BTkdMRSIKKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gMCBdOyB0aGVuCisgICAgcGFuaWMgIlRoaXMgc2NyaXB0IHRha2VzIG5vIGFyZ3VtZW50cy4gU2VlIC0taGVscCBmb3IgZGV0YWlscy4iCitmaQorCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbgorYW9zcF9kaXJfcGFyc2Vfb3B0aW9uCitpbnN0YWxsX2Rpcl9wYXJzZV9vcHRpb24KKworcGFja2FnZV9idWlsZGVyX3Byb2Nlc3Nfb3B0aW9ucyBBTkdMRQorCisjIENsb25lIGEgZ2l0IHJlcG9zaXRvcnksIGFuZCBjaGVja291dCBhIHNwZWNpZmljIGJyYW5jaCAmIGNvbW1pdC4KKyMgJDE6IFNvdXJjZSBnaXQgVVJMLgorIyAkMjogRGVzdGluYXRpb24gZGlyZWN0b3J5LgorIyAkMzogQnJhbmNoIC8gQ29tbWl0CitnaXRfY2xvbmUgKCkgeworICAgIGxvY2FsIEdJVF9VUkwgRFNUX0RJUiBCUkFOQ0ggQ0hFQ0tfUkVWCisgICAgR0lUX1VSTD0kMQorICAgIERTVF9ESVI9JDIKKyAgICBCUkFOQ0g9JDMKKworICAgIGlmIFsgLWQgIiREU1RfRElSIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJHaXQgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzOiAkRFNUX0RJUiIKKyAgICBmaQorICAgIHJ1biBnaXQgY2xvbmUgIiRHSVRfVVJMIiAiJERTVF9ESVIiIHx8CisgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IGNsb25lIGdpdCByZXBvc2l0b3J5OiAkR0lUX1VSTCIKKyAgICBydW4gZ2l0IC1DICIkRFNUX0RJUiIgY2hlY2tvdXQgJEJSQU5DSCB8fAorICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjaGVja291dCAkR0lUX1VSTCAtICRCUkFOQ0giCit9CisKKyMgQnVpbGQgdGhlIEFOR0xFIHBhY2thZ2VzLgorIworIyAkMTogU291cmNlIGRpcmVjdG9yeS4KKyMgJDI6IFRoZSBkaXJlY3RvcnkgdGhlIG91dHB1dCBsaWJyYXJpZXMgYXJlIHBsYWNlZCBpbi4KK2J1aWxkX2FuZ2xlX3BhY2thZ2UgKCkgeworICAgIGxvY2FsIFBLR19GVUxMTkFNRT0iJChiYXNlbmFtZSAiJDEiKSIKKyAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgJFBLR19GVUxMTkFNRSIKKworICAgIGxvY2FsIFBLR19CVUlMRF9ESVI9IiQxIgorICAgIGxvY2FsIFBLR19MSUJfRElSPSIkMiIKKworICAgICMgQm9saWVycGxhdGUgc2V0dXAKKyAgICBydW4gbWtkaXIgLXAgIiRQS0dfQlVJTERfRElSIiAmJgorICAgIHJ1biBjZCAiJFBLR19CVUlMRF9ESVIiICYmCisgICAgZXhwb3J0IExERkxBR1M9Ii1MJF9TSFVfQlVJTERFUl9QUkVGSVgvbGliIiAmJgorICAgIGV4cG9ydCBDUFBGTEFHUz0iLUkkX1NIVV9CVUlMREVSX1BSRUZJWC9pbmNsdWRlIiAmJgorICAgIGV4cG9ydCBQS0dfQ09ORklHX0xJQkRJUj0iJF9TSFVfQlVJTERFUl9QUkVGSVgvbGliL3BrZ2NvbmZpZyIgJiYKKyAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPSIkUEtHX0NPTkZJR19MSUJESVI6JF9TSFVfQlVJTERFUl9QS0dfQ09ORklHX1BBVEgiICYmCisKKyAgICAjIEVuc3VyZSB0aGUgZ2NsaWVudCBjb21tYW5kIGlzIGF2YWlsYWJsZS4KKyAgICBnaXRfY2xvbmUgaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCBkZXBvdF90b29scyBjNTViYTIwYzYyOWVmNzAyY2Q0YmIwNmRhOTIzNWM0YmI3MjE3Zjk2ICYmCisgICAgZXhwb3J0IFBBVEg9YHB3ZGAvZGVwb3RfdG9vbHM6IiRQQVRIIiAmJgorCisgICAgIyBFbnN1cmUgbmluamEsIGluY2x1ZGVkIGluIHRoZSBkZXBvdCB0b29scywgaXMgdXNlZCB0byBnZW5lcmF0b3IgdGhlIGJ1aWxkCisgICAgIyBmaWxlcywgc2luY2UgaXQgaXMgYSBjcm9zcy1wbGF0Zm9ybSBzb2x1dGlvbi4KKyAgICBleHBvcnQgR1lQX0dFTkVSQVRPUlM9bmluamEgJiYKKworICAgICMgQ3JlYXRlIGdjbGllbnQgZmlsZSBhbmQgc3luYyB0aGUgYnVpbGQgZmlsZXMKKyAgICBydW4gcHl0aG9uIHNjcmlwdHMvYm9vdHN0cmFwLnB5ICYmCisKKyAgICAjIFN5bmMgdGhlIGFwcHJvcHJpYXRlIGJ1aWxkIGZpbGVzCisgICAgcnVuIGdjbGllbnQgc3luYyAmJgorCisgICAgIyBuaW5qYSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwbGF0Zm9ybSBpbiB0aGUgcHJldmlvdXNseSBjbG9uZWQgZGVwb3RfdG9vbHMKKyAgICBydW4gbmluamEgLUMgb3V0L0RlYnVnCisKKyAgICAjIFRoZSBzdGF0aWMgbGlicyBwcm9kdWNlZCBieSB0aGUgYnVpbGQgc2NyaXB0IGFyZSBqdXN0IHRoaW4gYXJjaGl2ZXMgc28KKyAgICAjIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgb2JqZWN0cyB0aGVtc2VsdmVzIC0+IHJlcGFja2FnZSB0aGVtIHRvIGFjdHVhbGx5CisgICAgIyBjb250YWluIHRoZSBvYmplY3QgZmlsZXMKKyAgICBmb3IgbGliIGluICRQS0dfTElCX0RJUi9saWIqLmE7IGRvCisgICAgICAgIGFyIC10ICRsaWIgfCBydW4geGFyZ3MgYXIgcnZzICRsaWIubmV3ICYmIG12ICRsaWIubmV3ICRsaWI7CisgICAgICAgIHJ1biByYW5saWIgJGxpYgorICAgIGRvbmUKK30KKworIyBCdWlsZCB0aGUgQU5HTEUgcGFja2FnZXMgdXNpbmcgbWluZ3cuCisjIEJhc2VkIG9uIHRoZSBodHRwczovL2dpdGh1Yi5jb20vTWFydGNodXMvUEtHQlVJTERzL2Jsb2IvbWFzdGVyL2FuZ2xlcHJvamVjdC9taW5ndy13NjQvUEtHQlVJTEQKKyMKKyMgJDE6IFNvdXJjZSBkaXJlY3RvcnkuCisjICQyOiBUaGUgZGlyZWN0b3J5IHRoZSBvdXRwdXQgbGlicmFyaWVzIGFyZSBwbGFjZWQgaW4uCittaW5nd19idWlsZF9hbmdsZV9wYWNrYWdlKCkgeworICAgIGxvY2FsIFBLR19GVUxMTkFNRT0iJChiYXNlbmFtZSAiJDEiKSIKKyAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgJFBLR19GVUxMTkFNRSIKKworICAgIGxvY2FsIFBLR19CVUlMRF9ESVI9IiQxIgorICAgIGxvY2FsIFBLR19MSUJfRElSPSIkMiIKKworICAgIHJ1biBta2RpciAtcCAiJFBLR19CVUlMRF9ESVIiICYmCisgICAgcnVuIGNkICIkUEtHX0JVSUxEX0RJUiIKKworICAgICMgU2V0dXAgdGhlIHJpZ2h0IHZlcnNpb24gb2YgbWluZ3cKKyAgICBsb2NhbCBNSU5HV19QUkVGSVggR1lQX1RBUkdFVAorICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIE1JTkdXX1BSRUZJWD1pNjg2CisgICAgICAgICAgICBHWVBfVEFSR0VUPXdpbjMyCisgICAgICAgICAgICAkQU9TUF9ESVIvZXh0ZXJuYWwvcWVtdS9hbmRyb2lkL3NjcmlwdHMvZ2VuLWFuZHJvaWQtc2RrLXRvb2xjaGFpbi5zaCBcCisgICAgICAgICAgICAgICAgLS1ob3N0PXdpbmRvd3MteDg2IFwKKyAgICAgICAgICAgICAgICAuL21pbmd3LXRvb2xjaGFpbgorICAgICAgICAgICAgOzsKKyAgICAgICAgd2luZG93cy14ODZfNjQpCisgICAgICAgICAgICBNSU5HV19QUkVGSVg9eDg2XzY0CisgICAgICAgICAgICBHWVBfVEFSR0VUPXdpbjY0CisgICAgICAgICAgICAkQU9TUF9ESVIvZXh0ZXJuYWwvcWVtdS9hbmRyb2lkL3NjcmlwdHMvZ2VuLWFuZHJvaWQtc2RrLXRvb2xjaGFpbi5zaCBcCisgICAgICAgICAgICAgICAgLS1ob3N0PXdpbmRvd3MteDg2XzY0IFwKKyAgICAgICAgICAgICAgICAuL21pbmd3LXRvb2xjaGFpbgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhwb3J0IFBBVEg9YHB3ZGAvbWluZ3ctdG9vbGNoYWluOiIkUEFUSCIKKworICAgICMgQm9pbGVycGxhdGUgc2V0dXAKKyAgICBleHBvcnQgTERGTEFHUz0iLUwkX1NIVV9CVUlMREVSX1BSRUZJWC9saWIiICYmCisgICAgZXhwb3J0IENQUEZMQUdTPSItSSRfU0hVX0JVSUxERVJfUFJFRklYL2luY2x1ZGUiICYmCisgICAgZXhwb3J0IFBLR19DT05GSUdfTElCRElSPSIkX1NIVV9CVUlMREVSX1BSRUZJWC9saWIvcGtnY29uZmlnIiAmJgorICAgIGV4cG9ydCBQS0dfQ09ORklHX1BBVEg9IiRQS0dfQ09ORklHX0xJQkRJUjokX1NIVV9CVUlMREVSX1BLR19DT05GSUdfUEFUSCIgJiYKKworICAgICMgRW5zdXJlIHRoZSBneXAgY29tbWFuZCBpcyBhdmFpbGFibGUuCisgICAgZ2l0X2Nsb25lIGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9leHRlcm5hbC9neXAgZ3lwIGJhYzQ2ODBlYzlhNWM1NWFiNjkyNDkwYjY3MzI5OTk2NDhlY2YxZTkgJiYKKyAgICBleHBvcnQgUEFUSD1gcHdkYC9neXA6IiRQQVRIIiAmJgorCisgICAgIyBQcm92aWRlIDMyLWJpdCB2ZXJzaW9ucyBvZiAqLmRlZiBmaWxlcworICAgIGNwIG1pbmd3LXc2NC9saWJFR0xfbWluZ3czMi5kZWYgc3JjL2xpYkVHTC8gJiYKKyAgICBjcCBtaW5ndy13NjQvbGliR0xFU3YyX21pbmd3MzIuZGVmIHNyYy9saWJHTEVTdjIvICYmCisKKyAgICAjIFByb3ZpZGUgYSBmaWxlIHRvIGV4cG9ydCBzeW1ib2xzIGRlY2xhcmVkIGluIFNoYWRlckxhbmcuaCBhcyBwYXJ0IG9mIGxpYkdMRVN2Mi5kbGwKKyAgICAjIChyZXF1aXJlZCB0byBidWlsZCBRdCBXZWJLaXQgd2hpY2ggdXNlcyBzaGFkZXIgaW50ZXJmYWNlKQorICAgIGNwIG1pbmd3LXc2NC9lbnRyeV9wb2ludHNfc2hhZGVyLmNwcCBzcmMvbGliR0xFU3YyLyAmJgorCisgICAgIyBSZW1vdmUgLmdpdCBkaXJlY3RvcnkgdG8gcHJldmVudDoKKyAgICAjIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgJy4uL2J1aWxkLWk2ODYtdzY0LW1pbmd3MzIvLmdpdC9pbmRleCcsIG5lZWRlZCBieSAnb3V0L0RlYnVnL29iai9nZW4vYW5nbGUvaWQvY29tbWl0LmgnLgorICAgIHJtIC1yZiAuZ2l0ICYmCisKKyAgICAjIE1ha2Ugc3VyZSBhbiBpbXBvcnQgbGlicmFyeSBpcyBjcmVhdGVkLCB0aGUgY29ycmVjdCAuZGVmIGZpbGUgaXMgdXNlZAorICAgICMgZHVyaW5nIHRoZSBidWlsZCBhbmQgZW50cnlfcG9pbnRzX3NoYWRlci5jcHAgaXMgY29tcGlsZWQKKyAgICBydW4gcGF0Y2ggLXAxIC1pICJtaW5ndy13NjQvYW5nbGVwcm9qZWN0LWluY2x1ZGUtaW1wb3J0LWxpYnJhcnktYW5kLXVzZS1kZWYtZmlsZS5wYXRjaCIgJiYKKworICAgICMgUHJvdmlkZSBvd24gaW1wbGVtZW50YXRpb24gb2YgbWJzdG93Y3NfcyBmb3IgV2luZG93cyBYUCBzdXBwb3J0CisgICAgcnVuIHBhdGNoIC1wMSAtaSAibWluZ3ctdzY0L3Byb3ZpZGVfbWJzdG93Y3Nfc19mb3JfeHAucGF0Y2giICYmCisKKyAgICAjIEV4ZWN1dGluZyAuYmF0IHNjcmlwdHMgb24gTGludXggaXMgYSBuby1nbyBzbyBtYWtlIHRoaXMgYSBuby1vcAorICAgIGVjaG8gIiIgPiBzcmMvY29weV9jb21waWxlcl9kbGwuYmF0ICYmCisgICAgY2htb2QgK3ggc3JjL2NvcHlfY29tcGlsZXJfZGxsLmJhdCAmJgorCisgICAgIyBTZXQgYnVpbGQgZmxhZ3MsIG1ha2Ugc3VyZSBhbGwgaGVhZGVyIGZpbGVzIGFyZSBmb3VuZAorICAgIGV4cG9ydCBDWFhGTEFHUz0iLU8yIC1nIC1waXBlIC1XYWxsIC1XcCwtRF9GT1JUSUZZX1NPVVJDRT0yIC1mZXhjZXB0aW9ucyAtLXBhcmFtPXNzcC1idWZmZXItc2l6ZT00IC1zdGQ9YysrMTEgLW1zc2UyIC1EVU5JQ09ERSAtRF9VTklDT0RFIC1nIC1Jc3JjIC1JaW5jbHVkZSIgJiYKKyAgICBleHBvcnQgQ1hYPSIkTUlOR1dfUFJFRklYLXc2NC1taW5ndzMyLWcrKyIgJiYKKyAgICBleHBvcnQgQVI9IiRNSU5HV19QUkVGSVgtdzY0LW1pbmd3MzItYXIiICYmCisKKyAgICAjIFRPRE86IHJlLWVuYWJsZSBidWlsZGluZyBBTEwgb2YgYW5nbGUsIG5vdCBqdXN0IHRoZSBzdGF0aWMgbGlicmFyaWVzCisgICAgIyBneXAgLUQgdXNlX296b25lPTAgLUQgT1M9d2luIC1EIFRBUkdFVD0kR1lQX1RBUkdFVCAtLWZvcm1hdCBtYWtlIC1EIFwKKyAgICAjICAgICBNU1ZTX1ZFUlNJT049IiIgLS1kZXB0aCAuIC1JIGJ1aWxkL2NvbW1vbi5neXBpIHNyYy9hbmdsZS5neXAgJiYKKworICAgICMgIyBGb3JjaW5nIG5vbi1jb25jdXJyZW50IGJ1aWxkIHRvIHByZXZlbnQgZmFpbHVyZQorICAgICMgcnVuIG1ha2UgLWoxIFY9MSAmJgorCisgICAgIyBzdGF0aWMgbGlicyBtdXN0IGJlIGJ1aWx0IHNlcGFyYXRlbHkKKyAgICBydW4gZ3lwIC1EIHVzZV9vem9uZT0wIC1EIE9TPXdpbiAtRCBUQVJHRVQ9JEdZUF9UQVJHRVQgLS1mb3JtYXQgbWFrZSAtRCBcCisgICAgICAgIE1TVlNfVkVSU0lPTj0iIiAtLWRlcHRoIC4gLUkgYnVpbGQvY29tbW9uLmd5cGkgc3JjL2FuZ2xlLmd5cCAtRCBcCisgICAgICAgIGFuZ2xlX2dsX2xpYnJhcnlfdHlwZT1zdGF0aWNfbGlicmFyeSAmJgorICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTIFY9MQorCisgICAgIyBUaGUgc3RhdGljIGxpYnMgcHJvZHVjZWQgYnkgdGhlIGJ1aWxkIHNjcmlwdCBhcmUganVzdCB0aGluIGFyY2hpdmVzIHNvCisgICAgIyB0aGV5IGRvbid0IGNvbnRhaW4gYW55IG9iamVjdHMgdGhlbXNlbHZlcyAtPiByZXBhY2thZ2UgdGhlbSB0byBhY3R1YWxseQorICAgICMgY29udGFpbiB0aGUgb2JqZWN0IGZpbGVzCisgICAgZm9yIGxpYiBpbiAkUEtHX0xJQl9ESVIvbGliKi5hOyBkbworICAgICAgICBhciAtdCAkbGliIHwgcnVuIHhhcmdzIGFyIHJ2cyAkbGliLm5ldyAmJiBtdiAkbGliLm5ldyAkbGliOworICAgICAgICBydW4gcmFubGliICRsaWIKKyAgICBkb25lCit9CisKKyMgVW5wYWNrIHBhY2thZ2Ugc291cmNlIGludG8gJChidWlsZGVyX3NyY19kaXIpIGlmIG5lZWRlZC4KKyMgJDE6IFBhY2thZ2UgYmFzZW5hbWUuCitjb3B5X2FuZ2xlX3NvdXJjZSAoKSB7CisgICAgbG9jYWwgUEtHX1NSQ19USU1FU1RBTVAgUEtHX1RJTUVTVEFNUAorICAgIFBLR19TUkNfVElNRVNUQU1QPSRQS0dfQlVJTERfRElSL3RpbWVzdGFtcC1hbmdsZQorICAgIGlmIFsgISAtZiAiJFBLR19TUkNfVElNRVNUQU1QIiBdOyB0aGVuCisgICAgICAgIGNvcHlfZGlyZWN0b3J5ICRBT1NQX0RJUi9leHRlcm5hbC9hbmdsZSAkUEtHX0JVSUxEX0RJUgorICAgICAgICB0b3VjaCAkUEtHX1NSQ19USU1FU1RBTVAKKyAgICBmaQorfQorCisjICQxOiBQYWNrYWdlIGJhc2VuYW1lIChlLmcuICdsaWJwdGhyZWFkLXN0dWJzLTAuMycpCisjICQyKzogRXh0cmEgY29uZmlndXJhdGlvbiBvcHRpb25zLgorYnVpbGRfYW5nbGVfbGlicmFyaWVzICgpIHsKKyAgICBsb2NhbCBQS0dfQlVJTERfRElSIFBLR19TUkNfVElNRVNUQU1QIFBLR19USU1FU1RBTVAgUEtHX0xJQl9ESVIKKyAgICBQS0dfQlVJTERfRElSPSRURU1QX0RJUi9idWlsZC0kU1lTVEVNL2FuZ2xlCisgICAgY29weV9hbmdsZV9zb3VyY2UKKyAgICBQS0dfVElNRVNUQU1QPSRURU1QX0RJUi9idWlsZC0kU1lTVEVNL2FuZ2xlLXRpbWVzdGFtcAorICAgIGlmIFsgISAtZiAiJFBLR19USU1FU1RBTVAiIC1vIC1uICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgd2luKikKKyAgICAgICAgICAgICAgICBQS0dfTElCX0RJUj0kUEtHX0JVSUxEX0RJUi9vdXQvRGVidWcvb2JqLnRhcmdldC9zcmMvCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGxpbnV4KikKKyAgICAgICAgICAgICAgICBQS0dfTElCX0RJUj0kUEtHX0JVSUxEX0RJUi9vdXQvRGVidWcvb2JqL3NyYy8KKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZGFyd2luKikKKyAgICAgICAgICAgICAgICAjIFJlcXVpcmVkIGZvciBwcm9wZXIgYnVpbGQgb24gRGFyd2luIQorICAgICAgICAgICAgICAgIFBLR19MSUJfRElSPSRQS0dfQlVJTERfRElSL291dC9EZWJ1Zy8KKyAgICAgICAgICAgICAgICBidWlsZGVyX2Rpc2FibGVfdmVyYm9zZV9pbnN0YWxsCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgd2luKikKKyAgICAgICAgICAgICAgICBtaW5nd19idWlsZF9hbmdsZV9wYWNrYWdlIFwKKyAgICAgICAgICAgICAgICAgICAgIiRQS0dfQlVJTERfRElSIiBcCisgICAgICAgICAgICAgICAgICAgICIkUEtHX0xJQl9ESVIiIFwKKyAgICAgICAgICAgICAgICAgICAgIiRAIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIGJ1aWxkX2FuZ2xlX3BhY2thZ2UgXAorICAgICAgICAgICAgICAgICAgICAiJFBLR19CVUlMRF9ESVIiIFwKKyAgICAgICAgICAgICAgICAgICAgIiRQS0dfTElCX0RJUiIgXAorICAgICAgICAgICAgICAgICAgICAiJEAiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgICMgV2UgZG9uJ3QgaGF2ZSBhIG1ha2UgaW5zdGFsbCBjb21tYW5kIGF0IGFsbCBzaW5jZSB0aGUgTWFrZWZpbGUgaXMKKyAgICAgICAgIyBhdXRvLWdlbmVyYXRlZCwgc28gd2UganVzdCBjb3B5IHRoZSBmaWxlcyB3ZSB3YW50IGRpcmVjdGx5LgorICAgICAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBcCisgICAgICAgICAgICAgICAgICAgICIkUEtHX0xJQl9ESVIiIFwKKyAgICAgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvbGliIiBcCisgICAgICAgICAgICAgICAgICAgIGxpYmFuZ2xlX2NvbW1vbi5hIFwKKyAgICAgICAgICAgICAgICAgICAgbGlicHJlcHJvY2Vzc29yLmEgXAorICAgICAgICAgICAgICAgICAgICBsaWJ0cmFuc2xhdG9yX2xpYi5hIFwKKyAgICAgICAgICAgICAgICAgICAgbGlidHJhbnNsYXRvcl9zdGF0aWMuYQorCisgICAgICAgIGNvcHlfZGlyZWN0b3J5IFwKKyAgICAgICAgICAgICAgICAiJFBLR19CVUlMRF9ESVIvaW5jbHVkZS9HTFNMQU5HIiBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvaW5jbHVkZS9HTFNMQU5HIgorCisgICAgICAgIHRvdWNoICIkUEtHX1RJTUVTVEFNUCIKKyAgICBmaQorfQorCitmb3IgU1lTVEVNIGluICRMT0NBTF9IT1NUX1NZU1RFTVM7IGRvCisgICAgKAorICAgICAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3Rfbm9fYmlucHJlZml4ICIkU1lTVEVNIiAiJEFPU1BfRElSIgorCisgICAgICAgIGJ1aWxkX2FuZ2xlX2xpYnJhcmllcworCisgICAgICAgICMgQ29weSBiaW5hcmllcyBuZWNlc3NhcnkgZm9yIHRoZSBidWlsZCBpdHNlbGYgYXMgd2VsbCBhcyBzdGF0aWMgbGlicmFyaWVzLgorICAgICAgICBjb3B5X2RpcmVjdG9yeSBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvIiBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNLyIKKworICAgICAgICBkdW1wICJbJFNZU1RFTV0gRG9uZSBidWlsZGluZyBBTkdMRSBsaWJyYXJpZXMiCisKKyAgICApIHx8IHBhbmljICJbJFNZU1RFTV0gQ291bGQgbm90IGJ1aWxkIEFOR0xFIGxpYnJhcmllcyEiCisKK2RvbmUKKworbG9nICJEb25lIGJ1aWxkaW5nIEFOR0xFIGxpYnJhcmllcy4iCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtYnJlYWtwYWQuc2ggYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtYnJlYWtwYWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhlMzIwYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1icmVha3BhZC5zaApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLiAkKGRpcm5hbWUgIiQwIikvdXRpbHMvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgdXRpbHMvYW9zcF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2luc3RhbGxfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCBwcmVidWlsdCBicmVha3BhZCBmb3IgTGludXgsIFdpbmRvd3MgYW5kIERhcndpbi4iCisKK3BhY2thZ2VfYnVpbGRlcl9yZWdpc3Rlcl9vcHRpb25zCisKK2Fvc3BfZGlyX3JlZ2lzdGVyX29wdGlvbgorcHJlYnVpbHRzX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiAiY29tbW9uL2JyZWFrcGFkIgorCitvcHRpb25fcGFyc2UgIiRAIgorCitpZiBbICIkUEFSQU1FVEVSX0NPVU5UIiAhPSAwIF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgdGFrZXMgbm8gYXJndW1lbnRzLiBTZWUgLS1oZWxwIGZvciBkZXRhaWxzLiIKK2ZpCisKK3ByZWJ1aWx0c19kaXJfcGFyc2Vfb3B0aW9uCithb3NwX2Rpcl9wYXJzZV9vcHRpb24KK2luc3RhbGxfZGlyX3BhcnNlX29wdGlvbgorCitwYWNrYWdlX2J1aWxkZXJfcHJvY2Vzc19vcHRpb25zIGJyZWFrcGFkCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK2lmIFsgIiREQVJXSU5fU1NIIiAtYSAiJERBUldJTl9TWVNURU1TIiBdOyB0aGVuCisgICAgIyBQZXJmb3JtIHJlbW90ZSBEYXJ3aW4gYnVpbGQgZmlyc3QuCisgICAgZHVtcCAiUmVtb3RlIGJyZWFrcGFkIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9icmVha3BhZC1idWlsZCIgXAorCisgICAgYnVpbGRlcl9ydW5fcmVtb3RlX2Rhcndpbl9idWlsZAorCisgICAgZm9yIFNZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIGJ1aWxkZXJfcmVtb3RlX2Rhcndpbl9yZXRyaWV2ZV9pbnN0YWxsX2RpciAkU1lTVEVNICRJTlNUQUxMX0RJUgorICAgIGRvbmUKK2ZpCisKK2ZvciBTWVNURU0gaW4gJExPQ0FMX0hPU1RfU1lTVEVNUzsgZG8KKyAgICAoCisgICAgICAgIGJ1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdF9ub19iaW5wcmVmaXggIiRTWVNURU0iICIkQU9TUF9ESVIiCisKKyAgICAgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIEJ1aWxkaW5nIGJyZWFrcGFkIgorCisgICAgICAgIGJ1aWxkZXJfdW5wYWNrX3BhY2thZ2Vfc291cmNlICJicmVha3BhZCIKKyAgICAgICAgYnVpbGRlcl91bnBhY2tfcGFja2FnZV9zb3VyY2UgImxpbnV4LXN5c2NhbGwtc3VwcG9ydCIKKyAgICAgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZSBicmVha3BhZCAiJEAiCisKKyAgICAgICAgIyBDb3B5IGJpbmFyaWVzIG5lY2Vzc2FyeSBmb3IgdGhlIGJ1aWxkIGl0c2VsZiBhcyB3ZWxsIGFzIHN0YXRpYworICAgICAgICAjIGxpYnJhcmllcy4KKworICAgICAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgICAgICBsaWIvbGliYnJlYWtwYWRfY2xpZW50LmEgXAorICAgICAgICAgICAgICAgIGxpYi9saWJicmVha3BhZC5hIFwKKyAgICAgICAgICAgICAgICBsaWIvbGliZGlzYXNtLmEgXAorCisgICAgICAgIGNvcHlfZGlyZWN0b3J5IFwKKyAgICAgICAgICAgICAgICAiJChidWlsZGVyX2luc3RhbGxfcHJlZml4KS9pbmNsdWRlL2JyZWFrcGFkIiBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNL2luY2x1ZGUvYnJlYWtwYWQiCisKKyAgICAgICAgY29weV9kaXJlY3RvcnlfZmlsZXMgXAorICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpIiBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNIiBcCisgICAgICAgICAgICAgICAgYmluL2R1bXBfc3ltcyQoYnVpbGRlcl9ob3N0X2V4dCkgXAorICAgICAgICAgICAgICAgIGJpbi9kdW1wX3N5bXNfZHdhcmYkKGJ1aWxkZXJfaG9zdF9leHQpIFwKKyAgICAgICAgICAgICAgICBiaW4vZHVtcF9zeW1zX21hY2hvJChidWlsZGVyX2hvc3RfZXh0KSBcCisgICAgICAgICAgICAgICAgYmluL3N5bV91cGxvYWQkKGJ1aWxkZXJfaG9zdF9leHQpIFwKKyAgICAgICAgICAgICAgICBiaW4vbWluaWR1bXBfc3RhY2t3YWxrJChidWlsZGVyX2hvc3RfZXh0KSBcCisgICAgICAgICAgICAgICAgYmluL21pbmlkdW1wX3VwbG9hZCQoYnVpbGRlcl9ob3N0X2V4dCkKKworICAgICkgfHwgcGFuaWMgIlskU1lTVEVNXSBDb3VsZCBub3QgYnVpbGQgYnJlYWtwYWQhIgorCitkb25lCisKK2xvZyAiRG9uZSBidWlsZGluZyBicmVha3BhZCIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1jdXJsLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLWN1cmwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RlOWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1jdXJsLnNoCkBAIC0wLDAgKzEsMzExIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuICQoZGlybmFtZSAiJDAiKS91dGlscy9jb21tb24uc2hpCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvaW5zdGFsbF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKKworUFJPR1JBTV9QQVJBTUVURVJTPSIiCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIkJ1aWxkIHByZWJ1aWx0IGN1cmwgZm9yIExpbnV4LCBXaW5kb3dzIGFuZCBEYXJ3aW4uIgorCitwYWNrYWdlX2J1aWxkZXJfcmVnaXN0ZXJfb3B0aW9ucworCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCitpbnN0YWxsX2Rpcl9yZWdpc3Rlcl9vcHRpb24gY3VybAorCitvcHRpb25fcGFyc2UgIiRAIgorCitpZiBbICIkUEFSQU1FVEVSX0NPVU5UIiAhPSAwIF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgdGFrZXMgbm8gYXJndW1lbnRzLiBTZWUgLS1oZWxwIGZvciBkZXRhaWxzLiIKK2ZpCisKK3ByZWJ1aWx0c19kaXJfcGFyc2Vfb3B0aW9uCithb3NwX2Rpcl9wYXJzZV9vcHRpb24KK2luc3RhbGxfZGlyX3BhcnNlX29wdGlvbgorCitwYWNrYWdlX2J1aWxkZXJfcHJvY2Vzc19vcHRpb25zIGN1cmwKK3BhY2thZ2VfYnVpbGRlcl9wYXJzZV9wYWNrYWdlX2xpc3QKKworIyBIYW5kbGUgemxpYiwgb25seSBvbiBXaW4zMiBiZWNhdXNlIHRoZSB6bGliIGNvbmZpZ3VyZSBzY3JpcHQKKyMgZG9lc24ndCBrbm93IGhvdyB0byBnZW5lcmF0ZSBhIHN0YXRpYyBsaWJyYXJ5IHdpdGggLWZQSUMhCitidWlsZF93aW5kb3dzX3psaWJfcGFja2FnZSAoKSB7CisgICAgbG9jYWwgWkxJQl9WRVJTSU9OIFpMSUJfUEFDS0FHRQorICAgIGxvY2FsIExPQyBMREZMQUdTCisgICAgbG9jYWwgUFJFRklYPSQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkKKyAgICBsb2NhbCBCVUlMRF9ESVI9JChidWlsZGVyX2J1aWxkX2RpcikKKyAgICBjYXNlICQoYnVpbGRlcl9ob3N0KSBpbgorICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIExPQz0tbTMyCisgICAgICAgICAgICBMREZMQUdTPS1tMzIKKyAgICAgICAgICAgIDs7CisgICAgICAgIHdpbmRvd3MteDg2XzY0KQorICAgICAgICAgICAgTE9DPS1tNjQKKyAgICAgICAgICAgIExERkxBR1M9LW02NAorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgWkxJQl9WRVJTSU9OPSQocGFja2FnZV9saXN0X2dldF92ZXJzaW9uIHpsaWIpCisgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIEJ1aWxkaW5nIHpsaWItJFpMSUJfVkVSU0lPTiIKKyAgICBaTElCX1BBQ0tBR0U9JChwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lIHpsaWIpCisgICAgdW5wYWNrX2FyY2hpdmUgIiQoYnVpbGRlcl9hcmNoaXZlX2RpcikvJFpMSUJfUEFDS0FHRSIgIiRCVUlMRF9ESVIiCisgICAgKAorICAgICAgICBydW4gY2QgIiRCVUlMRF9ESVIvemxpYi0kWkxJQl9WRVJTSU9OIiAmJgorICAgICAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPSQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvbGliL3BrZ2NvbmZpZyAmJgorICAgICAgICBleHBvcnQgQklOQVJZX1BBVEg9JFBSRUZJWC9iaW4gJiYKKyAgICAgICAgZXhwb3J0IElOQ0xVREVfUEFUSD0kUFJFRklYL2luY2x1ZGUgJiYKKyAgICAgICAgZXhwb3J0IExJQlJBUllfUEFUSD0kUFJFRklYL2xpYiAmJgorICAgICAgICBydW4gbWFrZSAtZndpbjMyL01ha2VmaWxlLmdjYyBpbnN0YWxsIFwKKyAgICAgICAgICAgICAgICBQUkVGSVg9JChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpIFwKKyAgICAgICAgICAgICAgICBMT0M9JExPQyBcCisgICAgICAgICAgICAgICAgTERGTEFHUz0kTERGTEFHUyAmJgorICAgICAgICB1bnNldCBQS0dfQ09ORklHX1BBVEggJiYKKyAgICAgICAgdW5zZXQgQ1JPU1NfUFJFRklYCisgICAgKQorfQorCisjIEJ1aWxkIGEgcGFja2FnZSB6bGliIGZvciBMaW51eCBhbmQgTWFjIE9TIFgKKyMKK2J1aWxkX3psaWJfcGFja2FnZSAoKSB7CisgICAgbG9jYWwgWkxJQl9WRVJTSU9OIFpMSUJfUEFDS0FHRQorICAgIGxvY2FsIExPQyBMREZMQUdTCisgICAgbG9jYWwgQlVJTERfRElSPSQoYnVpbGRlcl9idWlsZF9kaXIpCisgICAgY2FzZSAkKGJ1aWxkZXJfaG9zdCkgaW4KKyAgICAgICAgKi14ODYpCisgICAgICAgICAgICBMT0M9LW0zMgorICAgICAgICAgICAgTERGTEFHUz0tbTMyCisgICAgICAgICAgICA7OworICAgICAgICAqLXg4Nl82NCkKKyAgICAgICAgICAgIExPQz0tbTY0CisgICAgICAgICAgICBMREZMQUdTPS1tNjQKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworICAgIFpMSUJfVkVSU0lPTj0kKHBhY2thZ2VfbGlzdF9nZXRfdmVyc2lvbiB6bGliKQorICAgIGR1bXAgIiQoYnVpbGRlcl90ZXh0KSBCdWlsZGluZyB6bGliLSRaTElCX1ZFUlNJT04iCisgICAgWkxJQl9QQUNLQUdFPSQocGFja2FnZV9saXN0X2dldF9maWxlbmFtZSB6bGliKQorICAgIHVucGFja19hcmNoaXZlICIkKGJ1aWxkZXJfYXJjaGl2ZV9kaXIpLyRaTElCX1BBQ0tBR0UiICIkQlVJTERfRElSIgorICAgICgKKyAgICAgICAgcnVuIGNkICIkQlVJTERfRElSL3psaWItJFpMSUJfVkVSU0lPTiIgJiYKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfUEFUSD0kKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2xpYi9wa2djb25maWcgJiYKKyAgICAgICAgZXhwb3J0IENST1NTX1BSRUZJWD0kKGJ1aWxkZXJfZ251X2NvbmZpZ19ob3N0X3ByZWZpeCkgJiYKKyAgICAgICAgcnVuIC4vY29uZmlndXJlIC0tcHJlZml4PSQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkgJiYKKyAgICAgICAgcnVuIG1ha2UgLWokTlVNX0pPQlMgJiYKKyAgICAgICAgcnVuIG1ha2UgaW5zdGFsbCAmJgorICAgICAgICB1bnNldCBQS0dfQ09ORklHX1BBVEggJiYKKyAgICAgICAgdW5zZXQgQ1JPU1NfUFJFRklYCisgICAgKQorfQorCisjICQxKzogQ29uZmlndXJhdGlvbiBvcHRpb25zLgorYnVpbGRfcGFja2FnZV9vcGVuc3NsICgpIHsKKyAgICAjIFVucGFjayBwYWNrYWdlIHNvdXJjZSBpbnRvICQoYnVpbGRlcl9zcmNfZGlyKSBpZiBuZWVkZWQuCisgICAgbG9jYWwgUEtHX1NSQ0RfTkFNRT0kKHBhY2thZ2VfbGlzdF9nZXRfdW5wYWNrX3NyY19kaXIgIm9wZW5zc2wiKQorICAgIGxvY2FsIFBLR19TUkNfVElNRVNUQU1QPSQoYnVpbGRlcl9zcmNfZGlyKS90aW1lc3RhbXAtJHtQS0dfU1JDRF9OQU1FfQorICAgIGlmIFsgISAtZiAiJFBLR19TUkNfVElNRVNUQU1QIiBdOyB0aGVuCisgICAgICBwYWNrYWdlX2xpc3RfdW5wYWNrX2FuZF9wYXRjaCBcCisgICAgICAgICAgICAgICJvcGVuc3NsIiAiJChidWlsZGVyX2FyY2hpdmVfZGlyKSIgIiQoYnVpbGRlcl9zcmNfZGlyKSIKKyAgICAgIHRvdWNoICRQS0dfU1JDX1RJTUVTVEFNUAorICAgIGZpCisKKyAgICBzaGlmdAorICAgIGxvY2FsIFBLR19TUkNfRElSPSIkKGJ1aWxkZXJfc3JjX2RpcikvJFBLR19TUkNEX05BTUUiCisgICAgbG9jYWwgUEtHX0JVSUxEX0RJUj0kKGJ1aWxkZXJfYnVpbGRfZGlyKS8kUEtHX1NSQ0RfTkFNRQorICAgIGxvY2FsIFBLR19CTERfVElNRVNUQU1QPSQoYnVpbGRlcl9idWlsZF9kaXIpLyRQS0dfU1JDRF9OQU1FLXRpbWVzdGFtcAorICAgIGlmIFsgISAtZiAiJFBLR19CTERfVElNRVNUQU1QIiAtbyAtbiAiJE9QVF9GT1JDRSIgXTsgdGhlbgorICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgIyBSZXF1aXJlZCBmb3IgcHJvcGVyIGJ1aWxkIG9uIERhcndpbiEKKyAgICAgICAgICBidWlsZGVyX2Rpc2FibGVfdmVyYm9zZV9pbnN0YWxsCisgICAgICAgICAgOzsKKyAgICAgIGVzYWMKKyAgICAgICMgYnVpbGQgb3BlbnNzbCBwYWNrYWdlCisgICAgICBsb2NhbCBQS0dfRlVMTE5BTUU9IiQoYmFzZW5hbWUgIiR7UEtHX1NSQ19ESVJ9IikiCisgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgJFBLR19GVUxMTkFNRSIKKworICAgICAgbG9jYWwgQ09ORklHX0ZMQUdTCisgICAgICBsb2NhbCBJTlNUQUxMX0ZMQUdTCisKKyAgICAgIGNhc2UgJChidWlsZGVyX2hvc3QpIGluCisgICAgICAgIGxpbnV4LXg4Nl82NCkKKyAgICAgICAgICBDT05GSUdfRkxBR1M9ImxpbnV4LXg4Nl82NCIKKyAgICAgICAgICA7OworICAgICAgICBsaW51eC14ODYpCisgICAgICAgICAgQ09ORklHX0ZMQUdTPSJsaW51eC1nZW5lcmljMzIgMzg2IC1tMzIiCisgICAgICAgICAgOzsKKyAgICAgICAgd2luZG93cy14ODYpCisgICAgICAgICAgQ09ORklHX0ZMQUdTPSJtaW5ndyAzODYgLW0zMiIKKyAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzLXg4Nl82NCkKKyAgICAgICAgICBDT05GSUdfRkxBR1M9Im1pbmd3NjQiCisgICAgICAgICAgOzsKKyAgICAgICAgZGFyd2luLSopCisgICAgICAgICAgIyBOT1RFOiAnLWZQSUMgLWZuby1jb21tb24nIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIFBJRS1jb21wYXRpYmxlCisgICAgICAgICAgIyBzdGF0aWMgbGlicmFyaWVzLCBpLmUuIG9uZSB0aGF0IGNhbiBiZSBsaW5rZWQgaW50byBhIC5keWxpYi4KKyAgICAgICAgICBDT05GSUdfRkxBR1M9ImRhcndpbjY0LXg4Nl82NC1jYyAtZlBJQyAtZm5vLWNvbW1vbiIKKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgIHBhbmljICJIb3N0IHN5c3RlbSAnJChidWlsZGVyX2hvc3QpJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0ISIKKyAgICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICAjIE5PVEU6IFBhcmFsbGVsIGJ1aWxkcyBzb21ldGltZXMgZmFpbCBvbiBEYXJ3aW4gYW5kIExpbnV4LgorICAgICAgTlVNX0pPQlM9MQorCisgICAgICAoCisgICAgICAgIHJ1biBta2RpciAtcCAiJFBLR19CVUlMRF9ESVIiICYmCisgICAgICAgIHJ1biBjZCAiJFBLR19TUkNfRElSIiAmJgorICAgICAgICBleHBvcnQgTERGTEFHUz0iLUwkX1NIVV9CVUlMREVSX1BSRUZJWC9saWIiICYmCisgICAgICAgIGV4cG9ydCBDUFBGTEFHUz0iLUkkX1NIVV9CVUlMREVSX1BSRUZJWC9pbmNsdWRlIiAmJgorICAgICAgICBleHBvcnQgUEtHX0NPTkZJR19MSUJESVI9IiRfU0hVX0JVSUxERVJfUFJFRklYL2xpYi9wa2djb25maWciICYmCisgICAgICAgIGV4cG9ydCBQS0dfQ09ORklHX1BBVEg9IiRQS0dfQ09ORklHX0xJQkRJUjokX1NIVV9CVUlMREVSX1BLR19DT05GSUdfUEFUSCIgJiYKKyAgICAgICAgcnVuICIkUEtHX1NSQ19ESVIiL0NvbmZpZ3VyZSBcCisgICAgICAgICAgJENPTkZJR19GTEFHUyBcCisgICAgICAgICAgLW5vLXNoYXJlZCBcCisgICAgICAgICAgLS1wcmVmaXg9JF9TSFVfQlVJTERFUl9QUkVGSVggXAorICAgICAgICAgIC0tb3BlbnNzbGRpcj0kX1NIVV9CVUlMREVSX1BSRUZJWCBcCisgICAgICAgICAgLS1jcm9zcy1jb21waWxlLXByZWZpeD0kKGJ1aWxkZXJfZ251X2NvbmZpZ19ob3N0X3ByZWZpeCkgXAorICAgICAgICAgICIkQCIgJiYKKyAgICAgICAgcnVuIG1ha2UgTUFLRUZMQUdTPS1qJHtOVU1fSk9CU30gJiYKKyAgICAgICAgcnVuIG1ha2UgaW5zdGFsbF9zdyAkSU5TVEFMTF9GTEFHUyAmJgorICAgICAgICBydW4gbWFrZSBjbGVhbgorICAgICAgICAjIGluc3RhbGxfc3cgc2tpcHMgbWFuLCBldGMsIHNob3J0ZW5uaW5nIGJ1aWxkIHRpbWUKKyAgICAgICkgfHwKKyAgICAgIHBhbmljICJDb3VsZCBub3QgYnVpbGQgYW5kIGluc3RhbGwgJFBLR19GVUxMTkFNRSIKKyAgICAgICMgc3VjY2VzcworICAgICAgdG91Y2ggIiRQS0dfQkxEX1RJTUVTVEFNUCIKKyAgICBmaQorfQorCitpZiBbICIkREFSV0lOX1NTSCIgLWEgIiREQVJXSU5fU1lTVEVNUyIgXTsgdGhlbgorICAgICMgUGVyZm9ybSByZW1vdGUgRGFyd2luIGJ1aWxkIGZpcnN0LgorICAgIGR1bXAgIlJlbW90ZSBjdXJsIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9jdXJsLWJ1aWxkIgorCisgICAgYnVpbGRlcl9ydW5fcmVtb3RlX2Rhcndpbl9idWlsZAorCisgICAgZm9yIFNZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIGJ1aWxkZXJfcmVtb3RlX2Rhcndpbl9yZXRyaWV2ZV9pbnN0YWxsX2RpciAkU1lTVEVNICRJTlNUQUxMX0RJUgorICAgIGRvbmUKK2ZpCisKK2ZvciBTWVNURU0gaW4gJExPQ0FMX0hPU1RfU1lTVEVNUzsgZG8KKyAgICAoCisgICAgICAgIGJ1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCAiJFNZU1RFTSIgIiRBT1NQX0RJUiIKKworICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgICAgICBidWlsZF93aW5kb3dzX3psaWJfcGFja2FnZQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIGJ1aWxkX3psaWJfcGFja2FnZQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBidWlsZF9wYWNrYWdlX29wZW5zc2wKKworICAgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgbGliY3VybCIKKworICAgICAgICBidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSBjdXJsCisKKyAgICAgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZSBjdXJsIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLWRlYnVnIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLW9wdGltaXplIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS13YXJuaW5ncyBcCisgICAgICAgICAgICAtLWRpc2FibGUtd2Vycm9yIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1jdXJsZGVidWcgXAorICAgICAgICAgICAgLS1lbmFibGUtc3ltYm9sLWhpZGluZyBcCisgICAgICAgICAgICAtLWRpc2FibGUtYXJlcyBcCisgICAgICAgICAgICAtLWVuYWJsZS1kZXBlbmRlbmN5LXRyYWNraW5nIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1sYXJnZWZpbGUgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNoYXJlZCBcCisgICAgICAgICAgICAtLWRpc2FibGUtbGlidG9vbC1sb2NrIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLWh0dHAgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWZ0cCBcCisgICAgICAgICAgICAtLWRpc2FibGUtZmlsZSBcCisgICAgICAgICAgICAtLWRpc2FibGUtbGRhcCBcCisgICAgICAgICAgICAtLWRpc2FibGUtbGRhcHMgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXJ0c3AgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXByb3h5IFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1kaWN0IFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS10ZWxuZXQgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXRmdHAgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXBvcDMgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWltYXAgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNtdHAgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWdvcGhlciBcCisgICAgICAgICAgICAtLWRpc2FibGUtbWFudWFsIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1saWJjdXJsLW9wdGlvbiBcCisgICAgICAgICAgICAtLWRpc2FibGUtaXB2NiBcCisgICAgICAgICAgICAtLWRpc2FibGUtdmVyc2lvbmVkLXN5bWJvbHMgXAorICAgICAgICAgICAgLS1lbmFibGUtdGhyZWFkZWQtcmVzb2x2ZXIgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXZlcmJvc2UgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNzcGkgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWNyeXB0by1hdXRoIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1udGxtLXdiIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS10bHMtc3JwIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLWNvb2tpZXMgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNvbmFtZS1idW1wIFwKKyAgICAgICAgICAgIC0td2l0aC16bGliPSIkYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCIgXAorICAgICAgICAgICAgLS13aXRob3V0LXdpbnNzbCBcCisgICAgICAgICAgICAtLXdpdGhvdXQtZGFyd2luc3NsIFwKKyAgICAgICAgICAgIC0td2l0aC1zc2w9IiRidWlsZGVyX2luc3RhbGxfcHJlZml4IiBcCisgICAgICAgICAgICAtLXdpdGhvdXQtZ251dGxzIFwKKyAgICAgICAgICAgIC0td2l0aG91dC1wb2xhcnNzbCBcCisgICAgICAgICAgICAtLXdpdGhvdXQtY3lhc3NsIFwKKyAgICAgICAgICAgIC0td2l0aG91dC1uc3MgXAorICAgICAgICAgICAgLS13aXRob3V0LWF4dGxzIFwKKyAgICAgICAgICAgIC0td2l0aG91dC1saWJtZXRhbGluayBcCisgICAgICAgICAgICAtLXdpdGhvdXQtbGlic3NoMiBcCisgICAgICAgICAgICAtLXdpdGhvdXQtbGlicnRtcCBcCisgICAgICAgICAgICAtLXdpdGhvdXQtbGliaWRuIFwKKyAgICAgICAgICAgIC0td2l0aG91dC13aW5pZG4KKworICAgICAgICAjIENvcHkgbGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMKKyAgICAgICAgY29weV9kaXJlY3RvcnlfZmlsZXMgXAorICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpIiBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNIiBcCisgICAgICAgICAgICAgICAgbGliL2xpYmNyeXB0by5hIFwKKyAgICAgICAgICAgICAgICBsaWIvbGlic3NsLmEgXAorICAgICAgICAgICAgICAgIGxpYi9saWJ6LmEgXAorICAgICAgICAgICAgICAgIGxpYi9saWJjdXJsLmEgXAorICAgICAgICAgICAgICAgIGJpbi9vcGVuc3NsJChidWlsZGVyX2hvc3RfZXh0KQorCisgICAgICAgY29weV9kaXJlY3RvcnkgXAorICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvaW5jbHVkZS9jdXJsIiBcCisgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0vaW5jbHVkZS9jdXJsIgorICAgICAgIGNvcHlfZGlyZWN0b3J5IFwKKyAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2luY2x1ZGUvb3BlbnNzbCIgXAorICAgICAgICAgICAgICAgIiR7SU5TVEFMTF9ESVJ9LyR7U1lTVEVNfS9pbmNsdWRlL29wZW5zc2wiCisKKyAgICAgICAgIyBDb3B5IHRoZSBjdXJsIGV4ZWN1dGFibGU7IHRoaXMgaXMgbm90IG5lY2Vzc2FyeQorICAgICAgICAjIGJ1dCBzZXJ2ZXMgYXMgYSB2YWxpZGF0aW9uIHBvaW50CisgICAgICAgIGNvcHlfZGlyZWN0b3J5X2ZpbGVzIFwKKyAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpIiBcCisgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgIGJpbi9jdXJsJChidWlsZGVyX2hvc3RfZXh0KQorCisgICAgKSB8fCBwYW5pYyAiWyRTWVNURU1dIENvdWxkIG5vdCBidWlsZCBsaWJjdXJsISIKKworZG9uZQorCitsb2cgIkRvbmUgYnVpbGRpbmcgY3VybC4iCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtZTJmc3Byb2dzLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLWUyZnNwcm9ncy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MzM5YTdlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLWUyZnNwcm9ncy5zaApAQCAtMCwwICsxLDE2OCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLiAkKGRpcm5hbWUgIiQwIikvdXRpbHMvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgdXRpbHMvYW9zcF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2luc3RhbGxfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKKyMgVGhpcyBzY3JpcHQgY2Fubm90IGJ1aWxkIHdpbmRvd3MteDg2XzY0IGJpbmFyaWVzIC0gb25seSAzMi1iaXQgc3VwcG9ydAorIyBpcyBhY2hpZXZhYmxlIGFzIHRoZSA2NC1iaXQgZGlzdHJpYnV0aW9uIG9mIGUyZnNwcm9ncyByZXF1aXJlcyBhIG5ld2VyCisjIHZlcnNpb24gb2YgYSBkbGwgZGVwZW5kZW5jeSB0aGFuIGlzIGF2YWlsYWJsZS4gIFRoZSBhdmFpbGFibGUgZGVwZW5kZW5jaWVzCisjICh2ZXJzaW9uIDEuNDIuNykgZG8gbm90IGV4cG9ydCB0aGUgZXh0MmZzX2Nsb3NlX2ZyZWUgZnVuY3Rpb24gdGhhdCB3YXMKKyMgYWRkZWQgdG8gYSBsYXRlciB2ZXJzaW9uIG9mIGUyZnNwcm9ncyAoYXQgdmVyc2lvbiAxLjQyLjExKSwgYW5kIG5vIGVhcmx5CisjIGVub3VnaCBleGVjdXRhYmxlIHZlcnNpb24gb2YgZTJmc3Byb2dzIGlzIHJlYWRpbHkgYXZhaWxhYmxlIGZyb20gQ3lnd2luLgorY2FzZSAkKGdldF9idWlsZF9vcykgaW4KKyAgICBsaW51eCkKKyAgICAgICAgREVGQVVMVF9IT1NUX1NZU1RFTVM9ImxpbnV4LXg4Nl82NCx3aW5kb3dzLXg4NiIKKyAgICAgICAgOzsKK2VzYWMKKworUFJPR1JBTV9QQVJBTUVURVJTPSIiCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIkJ1aWxkIHByZWJ1aWx0IGUyZnNwcm9ncyBmb3IgTGludXggYW5kIERhcndpbi4iCisKK3BhY2thZ2VfYnVpbGRlcl9yZWdpc3Rlcl9vcHRpb25zCisKK2Fvc3BfZGlyX3JlZ2lzdGVyX29wdGlvbgorcHJlYnVpbHRzX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiBjb21tb24vZTJmc3Byb2dzCisKK29wdGlvbl9wYXJzZSAiJEAiCisKK2lmIFsgIiRQQVJBTUVURVJfQ09VTlQiICE9IDAgXTsgdGhlbgorICAgIHBhbmljICJUaGlzIHNjcmlwdCB0YWtlcyBubyBhcmd1bWVudHMuIFNlZSAtLWhlbHAgZm9yIGRldGFpbHMuIgorZmkKKworcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb24KK2Fvc3BfZGlyX3BhcnNlX29wdGlvbgoraW5zdGFsbF9kaXJfcGFyc2Vfb3B0aW9uCisKK3BhY2thZ2VfYnVpbGRlcl9wcm9jZXNzX29wdGlvbnMgZTJmc3Byb2dzCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKKyMgRm9yIHdpbmRvd3Mgd2UgaGF2ZSBhbHJlYWR5IGRvd25sb2FkZWQgdGhlIGV4ZWN1dGFibGVzCisjIHNvIGp1c3QgdW5jb21wcmVzcyB0aGVtIHRvIHRoZSBjb3JyZWN0IGRpcmVjdG9yeSBpbgorIyBwcmVwYXJhdGlvbiBmb3IgYW5kcm9pZC9yZWJ1aWxkLnNoLgorIyAkMTogRGVzdGluYXRpb24gZGlyZWN0b3J5IG9mIGRlcGVuZGVuY2llcworV0lORE9XU19ERVBFTkRFTkNJRVM9ImUyZnNwcm9ncy13aW5kb3dzIGN5Z3dpbiBsaWJjb21fZXJyMlwKKyAgICBsaWJlMnAyIGxpYmJsa2lkMSBsaWJ1dWlkMSBsaWJleHQyZnMyIGxpYmdjYzEgbGliaWNvbnYyIGxpYmludGw4IgordW5wYWNrX3dpbmRvd3NfZGVwZW5kZW5jaWVzICgpIHsKKyAgICBsb2NhbCBERVAgRFNURElSCisgICAgRFNURElSPSQxCisgICAgZm9yIERFUCBpbiAkV0lORE9XU19ERVBFTkRFTkNJRVM7IGRvCisgICAgICAgICNydW4gbWtkaXIgLXAgIiQoYnVpbGRlcl9zcmNfZGlyKS8kKHBhY2thZ2VfbGlzdF9nZXRfdW5wYWNrX3NyY19kaXIgJERFUCkiCisgICAgICAgIGJ1aWxkZXJfdW5wYWNrX3BhY2thZ2Vfc291cmNlICIkREVQIgorICAgIGRvbmUKKworICAgIGNvcHlfZGlyZWN0b3J5X2ZpbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfc3JjX2RpcikvdXNyL2JpbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiREU1RESVIvc2JpbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3lnYmxraWQtMS5kbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3lnY29tX2Vyci0yLmRsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICBjeWdlMnAtMi5kbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3lnZXh0MmZzLTIuZGxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5Z2djY19zLTEuZGxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5Z2ljb252LTIuZGxsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN5Z2ludGwtOC5kbGwgXAorICAgICAgICAgICAgICAgICAgICAgICAgY3lndXVpZC0xLmRsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICBjeWd3aW4xLmRsbAorCisgICAgY29weV9kaXJlY3RvcnlfZmlsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9zcmNfZGlyKS91c3IiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkRFNURElSIiBcCisgICAgICAgICAgICAgICAgICAgICAgICBzYmluL2UyZnNjay5leGUgXAorICAgICAgICAgICAgICAgICAgICAgICAgc2Jpbi9yZXNpemUyZnMuZXhlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vdHVuZTJmcy5leGUKK30KKworaWYgWyAiJERBUldJTl9TU0giIC1hICIkREFSV0lOX1NZU1RFTVMiIF07IHRoZW4KKyAgICAjIFBlcmZvcm0gcmVtb3RlIERhcndpbiBidWlsZCBmaXJzdC4KKyAgICBkdW1wICJSZW1vdGUgZTJmc3Byb2dzIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9lMmZzcHJvZ3MtYnVpbGQiCisKKyAgICBidWlsZGVyX3J1bl9yZW1vdGVfZGFyd2luX2J1aWxkCisKKyAgICBmb3IgU1lTVEVNIGluICREQVJXSU5fU1lTVEVNUzsgZG8KKyAgICAgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3JldHJpZXZlX2luc3RhbGxfZGlyICRTWVNURU0gJElOU1RBTExfRElSCisgICAgZG9uZQorZmkKKworZm9yIFNZU1RFTSBpbiAkTE9DQUxfSE9TVF9TWVNURU1TOyBkbworICAgICgKKyAgICAgICAgYnVpbGRlcl9wcmVwYXJlX2Zvcl9ob3N0X25vX2JpbnByZWZpeCAiJFNZU1RFTSIgIiRBT1NQX0RJUiIKKworICAgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgZTJmc3Byb2dzIgorCisgICAgICAgIENPTkZJR1VSRV9GTEFHUz0KKyAgICAgICAgdmFyX2FwcGVuZCBDT05GSUdVUkVfRkxBR1MgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1ubHMgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1kZWZyYWcgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1qYmQtZGVidWcgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1wcm9maWxlIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtdGVzdGlvLWRlYnVnIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtcnBhdGggXAorCisgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgd2luZG93cy14ODYpCisgICAgICAgICAgICAgICAgdW5wYWNrX3dpbmRvd3NfZGVwZW5kZW5jaWVzICIkSU5TVEFMTF9ESVIvJFNZU1RFTSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgd2luZG93cy14ODZfNjQpCisgICAgICAgICAgICAgICAgZHVtcCAiV0FSTklORzogd2luZG93cy14ODZfNjQgaXNuJ3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBzY3JpcHQhIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIGJ1aWxkZXJfdW5wYWNrX3BhY2thZ2Vfc291cmNlIGUyZnNwcm9ncworCisgICAgICAgICAgICAgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZV9mdWxsX2luc3RhbGwgZTJmc3Byb2dzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsIGluc3RhbGwtbGlicyIgXAorICAgICAgICAgICAgICAgICAgICAgICAgJENPTkZJR1VSRV9GTEFHUworCisgICAgICAgICAgICAgICAgIyBDb3B5IGJpbmFyaWVzIG5lY2Vzc2FyeSBmb3IgdGhlIGJ1aWxkIGl0c2VsZiBhcyB3ZWxsIGFzIHN0YXRpYworICAgICAgICAgICAgICAgICMgbGlicmFyaWVzLgorICAgICAgICAgICAgICAgIGNvcHlfZGlyZWN0b3J5X2ZpbGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vZTJmc2NrIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vZnNjay5leHQ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vbWtmcy5leHQ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vcmVzaXplMmZzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiaW4vdHVuZTJmcyBcCisKKyAgICAgICAgICAgICAgICAjIENvcHkgdGhlIGxpYnV1aWQgZmlsZXMgb24gbGludXguIE1hYyBoYXMgaXRzIG93biBsaWJ1dWlkLgorICAgICAgICAgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgICAgICAgICBsaW51eCopCisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlL3V1aWQvdXVpZC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWIvbGlidXVpZC5hCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworCisgICAgKSB8fCBwYW5pYyAiWyRTWVNURU1dIENvdWxkIG5vdCBidWlsZCBlMmZzcHJvZ3MhIgorCitkb25lCisKK2xvZyAiRG9uZSBidWlsZGluZyBlMmZzcHJvZ3MuIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLWxpYnhtbDIuc2ggYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtbGlieG1sMi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MjMzMTVlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLWxpYnhtbDIuc2gKQEAgLTAsMCArMSw5OCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLiAkKGRpcm5hbWUgIiQwIikvdXRpbHMvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgdXRpbHMvYW9zcF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2luc3RhbGxfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCBwcmVidWlsdCBsaWJ4bWwyIGZvciBMaW51eCwgV2luZG93cyBhbmQgRGFyd2luLiIKKworcGFja2FnZV9idWlsZGVyX3JlZ2lzdGVyX29wdGlvbnMKKworYW9zcF9kaXJfcmVnaXN0ZXJfb3B0aW9uCitwcmVidWlsdHNfZGlyX3JlZ2lzdGVyX29wdGlvbgoraW5zdGFsbF9kaXJfcmVnaXN0ZXJfb3B0aW9uICJjb21tb24vbGlieG1sMiIKKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gMCBdOyB0aGVuCisgICAgcGFuaWMgIlRoaXMgc2NyaXB0IHRha2VzIG5vIGFyZ3VtZW50cy4gU2VlIC0taGVscCBmb3IgZGV0YWlscy4iCitmaQorCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbgorYW9zcF9kaXJfcGFyc2Vfb3B0aW9uCitpbnN0YWxsX2Rpcl9wYXJzZV9vcHRpb24KKworcGFja2FnZV9idWlsZGVyX3Byb2Nlc3Nfb3B0aW9ucyBsaWJ4bWwyCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK2lmIFsgIiREQVJXSU5fU1NIIiAtYSAiJERBUldJTl9TWVNURU1TIiBdOyB0aGVuCisgICAgIyBQZXJmb3JtIHJlbW90ZSBEYXJ3aW4gYnVpbGQgZmlyc3QuCisgICAgZHVtcCAiUmVtb3RlIGxpYnhtbDIgYnVpbGQgZm9yOiAkREFSV0lOX1NZU1RFTVMiCisgICAgYnVpbGRlcl9wcmVwYXJlX3JlbW90ZV9kYXJ3aW5fYnVpbGQgXAorICAgICAgICAgICAgIi90bXAvJFVTRVItcmVidWlsZC1kYXJ3aW4tc3NoLSQkL2xpYnhtbDItYnVpbGQiCisKKyAgICBidWlsZGVyX3J1bl9yZW1vdGVfZGFyd2luX2J1aWxkCisKKyAgICBmb3IgU1lTVEVNIGluICREQVJXSU5fU1lTVEVNUzsgZG8KKyAgICAgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3JldHJpZXZlX2luc3RhbGxfZGlyICRTWVNURU0gJElOU1RBTExfRElSCisgICAgZG9uZQorZmkKKworZm9yIFNZU1RFTSBpbiAkTE9DQUxfSE9TVF9TWVNURU1TOyBkbworICAgICgKKyAgICAgICAgYnVpbGRlcl9wcmVwYXJlX2Zvcl9ob3N0X25vX2JpbnByZWZpeCAiJFNZU1RFTSIgIiRBT1NQX0RJUiIKKworICAgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgbGlieG1sMiIKKworICAgICAgICBidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSBsaWJ4bWwyCisKKyAgICAgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZSBsaWJ4bWwyIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2hhcmVkIFwKKyAgICAgICAgICAgICAgICAtLXdpdGhvdXQtZGVidWcgXAorICAgICAgICAgICAgICAgIC0td2l0aG91dC1kb2Nib29rIFwKKyAgICAgICAgICAgICAgICAtLXdpdGhvdXQtZnRwIFwKKyAgICAgICAgICAgICAgICAtLXdpdGhvdXQtaHR0cCBcCisgICAgICAgICAgICAgICAgLS13aXRob3V0LWhpc3RvcnkgXAorICAgICAgICAgICAgICAgIC0td2l0aG91dC1odG1sIFwKKyAgICAgICAgICAgICAgICAtLXdpdGhvdXQtaWNvbnYgXAorICAgICAgICAgICAgICAgIC0td2l0aG91dC1weXRob24gXAorICAgICAgICAgICAgICAgIC0td2l0aC1taW5pbXVtIFwKKworICAgICAgICAjIENvcHkgYmluYXJpZXMgbmVjZXNzYXJ5IGZvciB0aGUgYnVpbGQgaXRzZWxmIGFzIHdlbGwgYXMgc3RhdGljCisgICAgICAgICMgbGlicmFyaWVzLgorICAgICAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgICAgICBsaWIvbGlieG1sMi5hCisKKyAgICAgICAgY29weV9kaXJlY3RvcnkgXAorICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2luY2x1ZGUvbGlieG1sMi9saWJ4bWwiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0vaW5jbHVkZS9saWJ4bWwiCisKKyAgICApIHx8IHBhbmljICJbJFNZU1RFTV0gQ291bGQgbm90IGJ1aWxkIGxpYnhtbDIhIgorCitkb25lCisKK2xvZyAiRG9uZSBidWlsZGluZyBsaWJ4bWwyLiIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1tZXNhLWRlcHMuc2ggYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtbWVzYS1kZXBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YWY3MmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtbWVzYS1kZXBzLnNoCkBAIC0wLDAgKzEsMTQzIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuICQoZGlybmFtZSAiJDAiKS91dGlscy9jb21tb24uc2hpCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvaW5zdGFsbF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKKworUFJPR1JBTV9QQVJBTUVURVJTPSIiCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIkJ1aWxkIE1lc2EzRCBsaWJyYXJ5IGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuIgorCitwYWNrYWdlX2J1aWxkZXJfcmVnaXN0ZXJfb3B0aW9ucworCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCitpbnN0YWxsX2Rpcl9yZWdpc3Rlcl9vcHRpb24gbWVzYS1kZXBzCisKK29wdGlvbl9wYXJzZSAiJEAiCisKK2lmIFsgIiRQQVJBTUVURVJfQ09VTlQiICE9IDAgXTsgdGhlbgorICAgIHBhbmljICJUaGlzIHNjcmlwdCB0YWtlcyBubyBhcmd1bWVudHMuIFNlZSAtLWhlbHAgZm9yIGRldGFpbHMuIgorZmkKKworcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb24KK2Fvc3BfZGlyX3BhcnNlX29wdGlvbgoraW5zdGFsbF9kaXJfcGFyc2Vfb3B0aW9uCisKK3BhY2thZ2VfYnVpbGRlcl9wcm9jZXNzX29wdGlvbnMgbWVzYS1kZXBzCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK2lmIFsgLXogIiRPUFRfRk9SQ0UiIF07IHRoZW4KKyAgICBidWlsZGVyX2NoZWNrX2FsbF90aW1lc3RhbXBzICIkSU5TVEFMTF9ESVIiIG1lc2EtZGVwcworZmkKKworaWYgWyAiJERBUldJTl9TU0giIC1hICIkREFSV0lOX1NZU1RFTVMiIF07IHRoZW4KKyAgICAjIFBlcmZvcm0gcmVtb3RlIERhcndpbiBidWlsZCBmaXJzdC4KKyAgICBkdW1wICJSZW1vdGUgbWVzYS1kZXBzIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9tZXNhLWRlcHMtYnVpbGQiCisKKyAgICBidWlsZGVyX3J1bl9yZW1vdGVfZGFyd2luX2J1aWxkCisKKyAgICBmb3IgU1lTVEVNIGluICREQVJXSU5fU1lTVEVNUzsgZG8KKyAgICAgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3JldHJpZXZlX2luc3RhbGxfZGlyICRTWVNURU0gJElOU1RBTExfRElSCisgICAgICAgIHRpbWVzdGFtcF9zZXQgIiRJTlNUQUxMX0RJUi8kU1lTVEVNIiBtZXNhLWRlcHMKKyAgICBkb25lCitmaQorCitmb3IgU1lTVEVNIGluICRMT0NBTF9IT1NUX1NZU1RFTVM7IGRvCisgICAgKAorICAgICAgICBidWlsZGVyX2VuYWJsZV9jeHgxMQorICAgICAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QgIiRTWVNURU0iICIkQU9TUF9ESVIiICIkSU5TVEFMTF9ESVIvJFNZU1RFTSIKKworICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgIGxpbnV4LSopCisgICAgICAgICAgICAgICAgYnVpbGRlcl91bnBhY2tfcGFja2FnZV9zb3VyY2UgZ2xwcm90bworICAgICAgICAgICAgICAgIGJ1aWxkZXJfYnVpbGRfYXV0b3Rvb2xzX3BhY2thZ2UgZ2xwcm90bworICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgICAgICBleHBvcnQgTExWTV9DUk9TU19DT01QSUxJTkc9MQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgICoteDg2KQorICAgICAgICAgICAgICAgIExMVk1fVEFSR0VUUz14ODYKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKi14ODZfNjQpCisgICAgICAgICAgICAgICAgTExWTV9UQVJHRVRTPXg4Nl82NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHBhbmljICJVbmtub3duIHN5c3RlbSBDUFUgYXJjaGl0ZWN0dXJlOiAkU1lTVEVNIgorICAgICAgICBlc2FjCisKKyAgICAgICAgYnVpbGRlcl9yZXNldF9jb25maWd1cmVfZmxhZ3MgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQgXAorICAgICAgICAgICAgICAgIC0td2l0aC1waWMKKworICAgICAgICBidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSBsbHZtCisKKyAgICAgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZSBsbHZtIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtY2xhbmctYXJjbXQgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1jbGFuZy1wbHVnaW4tc3VwcG9ydCBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWNsYW5nLXN0YXRpYy1hbmFseXplciBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtb3B0aW1pemVkIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtYXNzZXJ0aW9ucyBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWxpYmZmaSBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWRvY3MgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1kb3h5Z2VuIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtdGltZXN0YW1wcyBcCisgICAgICAgICAgICAgICAgLS1lbmFibGUtdGFyZ2V0cz0kTExWTV9UQVJHRVRTIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtYmluZGluZ3MgXAorCisgICAgICAgIGZvciBTVUJESVIgaW4gaW5jbHVkZSBsaWIgc2hhcmUvYWNsb2NhbCBzaGFyZS9wa2djb25maWc7IGRvCisgICAgICAgICAgICBpZiBbIC1kICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpLyRTVUJESVIiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjb3B5X2RpcmVjdG9yeSBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJChidWlsZGVyX2luc3RhbGxfcHJlZml4KS8kU1VCRElSIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0vJFNVQkRJUiIKKyAgICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKKworICAgICAgICBydW4gbWtkaXIgLXAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNL2JpbiIKKyAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBkdW1teSBmaWxlIHRvIGVuc3VyZSB0aGF0IC4uLi9iaW4gZXhpc3RzLCBzaW5jZQorICAgICAgICAgICAgICAgICMgdGhlIE1lc2EgY29uZmlndXJlIHN0ZXAgd2lsbCBhYm9ydCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgICAgICAgIGVjaG8gIlRoaXMgZmlsZSBpcyByZXF1aXJlZCB0byBidWlsZCBNZXNhIiA+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkSU5TVEFMTF9ESVIvJFNZU1RFTS9iaW4vRE9fTk9UX1JFTU9WRSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAjIENvcHkgbGx2bS1jb25maWcgdG8gLi4uL2Jpbi4KKyAgICAgICAgICAgICAgICBydW4gY3AgLWYgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkvYmluL2xsdm0tY29uZmlnIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0vYmluLyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgdGltZXN0YW1wX3NldCAiJElOU1RBTExfRElSLyRTWVNURU0iIG1lc2EtZGVwcworCisgICAgKSB8fCBwYW5pYyAiWyRTWVNURU1dIENvdWxkIG5vdCBidWlsZCBNZXNhIGRlcGVuZGVuY2llcyEiCisKK2RvbmUKKworbG9nICJEb25lIGJ1aWxkaW5nIG1lc2EgZGVwZW5kZW5jaWVzLiIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1tZXNhLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLW1lc2Euc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmM1MzRjYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1tZXNhLnNoCkBAIC0wLDAgKzEsMjcxIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuICQoZGlybmFtZSAiJDAiKS91dGlscy9jb21tb24uc2hpCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvaW5zdGFsbF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKKworUFJPR1JBTV9QQVJBTUVURVJTPSIiCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIkEgc2NyaXB0IHVzZWQgdG8gcmVidWlsZCB0aGUgTWVzYSBzb2Z0d2FyZSBHTCBncmFwaGljcyBsaWJyYXJ5IGZyb20gc291cmNlcy4iCisKKyMgV2UgZG9uJ3Qga25vdyB5ZXQgaG93IHRvIGJ1aWxkIERhcndpbiBNZXNhIGJpbmFyaWVzLiBBcyBzdWNoLCBpZ25vcmUgdGhlCisjIHZhbHVlIG9mIEFORFJPSURfRU1VTEFUT1JfREFSV0lOX1NTSCBmb3Igbm93LiBJZiAtLWRhcndpbi1zc2g9PGhvc3RuYW1lPgorIyBpcyB1c2VkLCB0aGUgc2NyaXB0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIGV4cGxhaW5pbmcgdGhlIHJlYXNvbiB0aG91Z2guCit1bnNldCBBTkRST0lEX0VNVUxBVE9SX0RBUldJTl9TU0gKKworcGFja2FnZV9idWlsZGVyX3JlZ2lzdGVyX29wdGlvbnMKKworYW9zcF9kaXJfcmVnaXN0ZXJfb3B0aW9uCitwcmVidWlsdHNfZGlyX3JlZ2lzdGVyX29wdGlvbgoraW5zdGFsbF9kaXJfcmVnaXN0ZXJfb3B0aW9uIG1lc2EKKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gMCBdOyB0aGVuCisgICAgcGFuaWMgIlRoaXMgc2NyaXB0IHRha2VzIG5vIGFyZ3VtZW50cy4gU2VlIC0taGVscCBmb3IgZGV0YWlscy4iCitmaQorCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbgorYW9zcF9kaXJfcGFyc2Vfb3B0aW9uCitpbnN0YWxsX2Rpcl9wYXJzZV9vcHRpb24KKworcGFja2FnZV9idWlsZGVyX3Byb2Nlc3Nfb3B0aW9ucyBtZXNhCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK01FU0FfREVQU19JTlNUQUxMX0RJUj0kUFJFQlVJTFRTX0RJUi9tZXNhLWRlcHMKKworU0NPTlM9JCh3aGljaCBzY29ucyAyPi9kZXYvbnVsbCB8fCB0cnVlKQoraWYgWyAteiAiJFNDT05TIiBdOyB0aGVuCisgICAgcGFuaWMgIlBsZWFzZSBpbnN0YWxsIHRoZSAnc2NvbnMnIGJ1aWxkIHRvb2wgdG8gdXNlIHRoaXMgc2NyaXB0ISIKK2ZpCisKKyMgUmVidWlsZCBkZXBlbmRlbmNpZXMgaWYgbmVlZGVkLgorIyAkMTogU3lzdGVtIG5hbWUgKGUuLmcgZGFyd2luLXg4Nl82NCkKK2NoZWNrX21lc2FfZGVwZW5kZW5jaWVzICgpIHsKKyAgICBsb2NhbCBTWVNURU09IiQxIgorICAgIGlmICEgdGltZXN0YW1wX2NoZWNrICIkTUVTQV9ERVBTX0lOU1RBTExfRElSLyRTWVNURU0iIG1lc2EtZGVwczsgdGhlbgorICAgICAgICBkdW1wICJbJFNZU1RFTV0gTmVlZCB0byByZWJ1aWxkIE1lc2EgZGVwZW5kZW5jaWVzIGZpcnN0LiIKKyAgICAgICAgbG9jYWwgRVhUUkFfRkxBR1M9CisgICAgICAgIGxvY2FsIFZFUkJPU0lUWT0kKGdldF92ZXJib3NpdHkpCisgICAgICAgIHdoaWxlIFsgIiRWRVJCT1NJVFkiIC1ndCAxIF07IGRvCisgICAgICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICItLXZlcmJvc2UiCisgICAgICAgICAgICBWRVJCT1NJVFk9JCgoICRWRVJCT1NJVFkgLSAxICkpCisgICAgICAgIGRvbmUKKyAgICAgICAgaWYgWyAiJERBUldJTl9TU0giIF07IHRoZW4KKyAgICAgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfRkxBR1MgIi0tZGFyd2luLXNzaD0kREFSV0lOX1NTSCIKKyAgICAgICAgZmkKKyAgICAgICAgJChwcm9ncmFtX2RpcmVjdG9yeSkvYnVpbGQtbWVzYS1kZXBzLnNoIFwKKyAgICAgICAgICAgIC0tYW9zcC1kaXI9JEFPU1BfRElSIFwKKyAgICAgICAgICAgIC0tcHJlYnVpbHRzLWRpcj0kUFJFQlVJTFRTX0RJUiBcCisgICAgICAgICAgICAtLWJ1aWxkLWRpcj0kQlVJTERfRElSIFwKKyAgICAgICAgICAgIC0taG9zdD0kU1lTVEVNIFwKKyAgICAgICAgICAgIC0taW5zdGFsbC1kaXI9JE1FU0FfREVQU19JTlNUQUxMX0RJUiBcCisgICAgICAgICAgICAkRVhUUkFfRkxBR1MKKyAgICBmaQorfQorCitpZiBbIC16ICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgYnVpbGRlcl9jaGVja19hbGxfdGltZXN0YW1wcyAiJElOU1RBTExfRElSIiBtZXNhCitmaQorCitpZiBbICIkREFSV0lOX1NZU1RFTVMiIC1hICIkREFSV0lOX1NTSCIgXTsgdGhlbgorICAgICMgVE9ETyhkaWdpdCk6IEltcGxlbWVudCBNZXNhIGRhcndpbiBidWlsZHM/CisgICAgcGFuaWMgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIGJ1aWxkIERhcndpbiBNZXNhIGJpbmFyaWVzIGZvciBub3chIgorCisgICAgIyBCdWlsZGluZyBPU01lc2EgcmVtb3RlbHkuCisgICAgZHVtcCAiUmVtb3RlIE1lc2EgYnVpbGQgZm9yOiAkREFSV0lOX1NZU1RFTVMiCisgICAgZm9yIFNZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIGNoZWNrX21lc2FfZGVwZW5kZW5jaWVzICIkU1lTVEVNIgorICAgIGRvbmUKKworICAgIGlmIFsgIiRPUFRfT1NNRVNBIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgREFSV0lOX0JVSUxEX0ZMQUdTICItLW9zbWVzYSIKKyAgICBmaQorCisgICAgYnVpbGRlcl9wcmVwYXJlX3JlbW90ZV9kYXJ3aW5fYnVpbGQgXAorICAgICAgICAgICAgIi90bXAvJFVTRVItcmVidWlsZC1kYXJ3aW4tc3NoLSQkL21lc2EtYnVpbGQiCisKKyAgICBydW4gbWtkaXIgLXAgIiREQVJXSU5fUEtHX0RJUi9wcmVidWlsdHMiCisgICAgZm9yIFNZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIGNvcHlfZGlyZWN0b3J5ICIkSU5TVEFMTF9ESVIvJFNZU1RFTSIgXAorICAgICAgICAgICAgICAgICIkREFSV0lOX1BLR19ESVIvcHJlYnVpbHRzL21lc2EvJFNZU1RFTSIKKyAgICBkb25lCisKKyAgICBidWlsZGVyX3J1bl9yZW1vdGVfZGFyd2luX2J1aWxkCisKKyAgICBmb3IgU1lTVEVNIGluICREQVJXSU5fU1lTVEVNUzsgZG8KKyAgICAgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3JldHJpZXZlX2luc3RhbGxfZGlyICRTWVNURU0gJElOU1RBTExfRElSCisgICAgICAgIHRpbWVzdGFtcF9zZXQgIiRJTlNUQUxMX0RJUi8kU1lTVEVNIiBtZXNhCisgICAgZG9uZQorZmkKKworCitmb3IgU1lTVEVNIGluICRMT0NBTF9IT1NUX1NZU1RFTVM7IGRvCisgICAgY2hlY2tfbWVzYV9kZXBlbmRlbmNpZXMgIiRTWVNURU0iCisgICAgKAorICAgICAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPSRJTlNUQUxMX0RJUi8kU1lTVEVNL2xpYi9wa2djb25maWcKKworICAgICAgICBCVUlMRF9PU01FU0E9CisKKyAgICAgICAgYnVpbGRlcl9lbmFibGVfY3h4MTEKKworICAgICAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3Rfbm9fYmlucHJlZml4IFwKKyAgICAgICAgICAgICAgICAiJFNZU1RFTSIgXAorICAgICAgICAgICAgICAgICIkQU9TUF9ESVIiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iCisKKyAgICAgICAgYnVpbGRlcl9yZXNldF9jb25maWd1cmVfZmxhZ3MgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zdGF0aWMgXAorICAgICAgICAgICAgICAgIC0td2l0aC1waWMKKworICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgICoteDg2KQorICAgICAgICAgICAgICAgIExMVk1fVEFSR0VUUz14ODYKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKi14ODZfNjQpCisgICAgICAgICAgICAgICAgTExWTV9UQVJHRVRTPXg4Nl82NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHBhbmljICJVbmtub3duIHN5c3RlbSBDUFUgYXJjaGl0ZWN0dXJlOiAkU1lTVEVNIgorICAgICAgICBlc2FjCisKKyAgICAgICAgUEtHX05BTUU9JChwYWNrYWdlX2xpc3RfZ2V0X3NyY19kaXIgTWVzYUxpYikKKworICAgICAgICAjIFVucGFjayBzb3VyY2VzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgUEtHX1NSQ19ESVI9IiQoYnVpbGRlcl9zcmNfZGlyKS8kUEtHX05BTUUiCisgICAgICAgIGlmICEgdGltZXN0YW1wX2NoZWNrICIkKGJ1aWxkZXJfc3JjX2RpcikiICIkUEtHX05BTUUiOyB0aGVuCisgICAgICAgICAgICBidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSAiTWVzYUxpYiIKKyAgICAgICAgICAgIHRpbWVzdGFtcF9zZXQgIiQoYnVpbGRlcl9zcmNfZGlyKSIgIiRQS0dfTkFNRSIKKyAgICAgICAgZmkKKworICAgICAgICAjIFRoZSBTQ29ucyBidWlsZCBzY3JpcHRzIHB1dCBldmVyeXRoaW5nIHVuZGVyICRQS0dfU1JDX0RJUi9idWlsZAorICAgICAgICAjIFNvIGNsZWFyIHRoYXQgdXAganVzdCBpbiBjYXNlLgorICAgICAgICBydW4gcm0gLXJmICIkUEtHX1NSQ19ESVIiL2J1aWxkLyoKKworICAgICAgICBFWFRSQV9GTEFHUz0KKyAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICAgICAgZXhwb3J0IExERkxBR1M9Ii1zdGF0aWMgLXMgLVhsaW5rZXIgLS1idWlsZC1pZCIKKyAgICAgICAgICAgICAgICBleHBvcnQgQ1hYRkxBR1M9Ii1zdGQ9Z251KysxMSIKKyAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICJwbGF0Zm9ybT13aW5kb3dzIHRvb2xjaGFpbj1jcm9zc21pbmd3IgorICAgICAgICAgICAgICAgICMgJ2xpYmdsLWdkaScgaXMgdGhlIHRhcmdldCB0aGF0IGltcGxlbWVudHMgZGVza3RvcCBHTAorICAgICAgICAgICAgICAgICMgb24gdG9wIG9mIHRoZSBXaW4zMiBHREkgaW50ZXJmYWNlLiBUaGlzIGdlbmVyYXRlcyBhCisgICAgICAgICAgICAgICAgIyBsaWJyYXJ5IGNhbGxlZCBvcGVuZ2wzMi5kbGwgdG8gbWF0Y2ggdGhlIHBsYXRmb3JtJ3MKKyAgICAgICAgICAgICAgICAjIG9mZmljaWFsIE9wZW5HTCBzaGFyZWQgbGlicmFyeSBuYW1lLgorICAgICAgICAgICAgICAgIE1FU0FfVEFSR0VUPSJsaWJnbC1nZGkiCisgICAgICAgICAgICAgICAgT1NNRVNBX1RBUkdFVD0ibGliZ2wtb3NtZXNhIgorICAgICAgICAgICAgICAgIE1FU0FfTElCUz0ib3BlbmdsMzIuZGxsIgorICAgICAgICAgICAgICAgIEJVSUxEX09TTUVTQT10cnVlCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgbGludXgtKikKKyAgICAgICAgICAgICAgICAjICdsaWJnbC14bGliJyBpcyB0aGUgdGFyZ2V0IHRoYXQgaW1wbGVtZW50cyBkZXNrdG9wIEdMCisgICAgICAgICAgICAgICAgIyBhcyB3ZWxsIGFzIHRoZSBHTFggQVBJIG9uIHRvcCBvZiBzdGFuZGFyZCBYTGliLgorICAgICAgICAgICAgICAgICMgVGhpcyBnZW5lcmF0ZXMgYSBsaWJHTC5zby4KKyAgICAgICAgICAgICAgICBNRVNBX1RBUkdFVD0ibGliZ2wteGxpYiIKKyAgICAgICAgICAgICAgICBPU01FU0FfVEFSR0VUPSJsaWJnbC1vc21lc2EiCisgICAgICAgICAgICAgICAgTUVTQV9MSUJTPSJsaWJHTC5zbyIKKyAgICAgICAgICAgICAgICBCVUlMRF9PU01FU0E9dHJ1ZQorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgcGFuaWMgIkRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIE1lc2EgZm9yIHRoaXMgc3lzdGVtOiAkU1lTVEVNIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBpZiBbICIkKGdldF92ZXJib3NpdHkpIiAtZ3QgMiBdOyB0aGVuCisgICAgICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICJ2ZXJib3NlPXRydWUiCisgICAgICAgIGZpCisKKyAgICAgICAgUEtHX0JVSUxEX0RJUj0kKGJ1aWxkZXJfYnVpbGRfZGlyKS8kUEtHX05BTUUKKyAgICAgICAgaWYgISB0aW1lc3RhbXBfY2hlY2sgIiRQS0dfQlVJTERfRElSIiAiJFBLR19OQU1FIjsgdGhlbgorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgIGR1bXAgIiQoYnVpbGRlcl90ZXh0KSBCdWlsZGluZyAkUEtHX05BTUUiCisgICAgICAgICAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydCBMREZMQUdTPSItc3RhdGljIC1YbGlua2VyIC0tYnVpbGQtaWQiCisgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnQgQ1hYRkxBR1M9Ii1zdGQ9Z251KysxMSIKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIGV4cG9ydCBMTFZNPSRNRVNBX0RFUFNfSU5TVEFMTF9ESVIvJChidWlsZGVyX2hvc3QpICYmCisgICAgICAgICAgICAgICAgcnVuIHNjb25zIC1qJE5VTV9KT0JTIC1DICIkUEtHX1NSQ19ESVIiIFwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGQ9cmVsZWFzZSBcCisgICAgICAgICAgICAgICAgICAgIGxsdm09eWVzIFwKKyAgICAgICAgICAgICAgICAgICAgbWFjaGluZT0kTExWTV9UQVJHRVRTIFwKKyAgICAgICAgICAgICAgICAgICAgJEVYVFJBX0ZMQUdTIFwKKyAgICAgICAgICAgICAgICAgICAgJE1FU0FfVEFSR0VUIHx8IGV4aXQgJD8KKworICAgICAgICAgICAgICAgIGlmIFsgIiRCVUlMRF9PU01FU0EiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcnVuIHNjb25zIC1qJE5VTV9KT0JTIC1DICIkUEtHX1NSQ19ESVIiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkPXJlbGVhc2UgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bT15ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZT0kTExWTV9UQVJHRVRTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICRFWFRSQV9GTEFHUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAkT1NNRVNBX1RBUkdFVCB8fCBleGl0ICQ/CisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgTm93IGNvcHkgdGhlIHJlc3VsdCB0byB0ZW1wb3JhcnkgaW5zdGFsbCBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgcnVuIG1rZGlyIC1wICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2xpYiIgJiYKKyAgICAgICAgICAgICAgICBmb3IgTElCIGluICRNRVNBX0xJQlM7IGRvCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJExJQiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgKm9zbWVzYSopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FMTElVTV9UQVJHRVQ9Im9zbWVzYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQUxMSVVNX1RBUkdFVD0kTUVTQV9UQVJHRVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICAgICAgICAgIHJ1biBjcCAtZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJFBLR19TUkNfRElSIi9idWlsZC8kKGJ1aWxkZXJfaG9zdCkvZ2FsbGl1bS90YXJnZXRzLyRHQUxMSVVNX1RBUkdFVC8kTElCIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2xpYi8kTElCIgorICAgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgKSB8fCBwYW5pYyAiQ291bGQgbm90IGJ1aWxkICRTWVNURU0gTWVzYSBmcm9tIHNvdXJjZXMiCisKKyAgICAgICAgICAgIHRpbWVzdGFtcF9zZXQgIiRQS0dfQlVJTERfRElSIiAiJFBLR19OQU1FIgorICAgICAgICBmaQorCisgICAgICAgICMgQ29weSB0byBpbnN0YWxsIGxvY2F0aW9uLgorICAgICAgICBydW4gbWtkaXIgLXAgIiRJTlNUQUxMX0RJUiIvJFNZU1RFTS9saWIKKyAgICAgICAgZm9yIExJQiBpbiAkTUVTQV9MSUJTOyBkbworICAgICAgICAgICAgcnVuIGNwIC1mICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpL2xpYi8kTElCIiBcCisgICAgICAgICAgICAgICAgICAgICIkSU5TVEFMTF9ESVIvJFNZU1RFTS9saWIvJExJQiIKKyAgICAgICAgZG9uZQorCisgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgbGludXgtKikKKyAgICAgICAgICAgICAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIExpbnV4LCB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIFFUCisgICAgICAgICAgICAgICAgIyB3aWxsIGFjdHVhbGx5IHRyeSB0byBsb2FkIGxpYkdMLnNvLjEgYmVmb3JlIEdQVSBlbXVsYXRpb24KKyAgICAgICAgICAgICAgICAjIGlzIGluaXRpYWxpemVkLiBUaGlzIGlzIGFjdHVhbGx5IGEgbGluayB0byB0aGUgc3lzdGVtJ3MKKyAgICAgICAgICAgICAgICAjIGxpYkdMLnNvLCBhbmQgd2lsbCB0aHVzIHByZXZlbnQgdGhlIE1lc2EgdmVyc2lvbiBmcm9tCisgICAgICAgICAgICAgICAgIyBsb2FkaW5nLiBCeSBjcmVhdGluZyB0aGUgc3ltbGluaywgTWVzYSB3aWxsIGFsc28gYmUgdXNlZAorICAgICAgICAgICAgICAgICMgYnkgUVQuCisgICAgICAgICAgICAgICAgbG4gLXNmIGxpYkdMLnNvICIkSU5TVEFMTF9ESVIvJFNZU1RFTS9saWIvbGliR0wuc28uMSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICApIHx8IHBhbmljICJbJFNZU1RFTV0gQ291bGQgbm90IGJ1aWxkIG1lc2EhIgorCitkb25lCisKK2R1bXAgIkRvbmUuIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXByb3RvYnVmLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXByb3RvYnVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjMDVmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtcHJvdG9idWYuc2gKQEAgLTAsMCArMSw5NSBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLiAkKGRpcm5hbWUgIiQwIikvdXRpbHMvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgdXRpbHMvYW9zcF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2luc3RhbGxfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCBwcmVidWlsdCBwcm90b2J1ZiBmb3IgTGludXgsIFdpbmRvd3MgYW5kIERhcndpbi4iCisKK3BhY2thZ2VfYnVpbGRlcl9yZWdpc3Rlcl9vcHRpb25zCisKK2Fvc3BfZGlyX3JlZ2lzdGVyX29wdGlvbgorcHJlYnVpbHRzX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiBwcm90b2J1ZgorCitvcHRpb25fcGFyc2UgIiRAIgorCitpZiBbICIkUEFSQU1FVEVSX0NPVU5UIiAhPSAwIF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgdGFrZXMgbm8gYXJndW1lbnRzLiBTZWUgLS1oZWxwIGZvciBkZXRhaWxzLiIKK2ZpCisKK3ByZWJ1aWx0c19kaXJfcGFyc2Vfb3B0aW9uCithb3NwX2Rpcl9wYXJzZV9vcHRpb24KK2luc3RhbGxfZGlyX3BhcnNlX29wdGlvbgorCitwYWNrYWdlX2J1aWxkZXJfcHJvY2Vzc19vcHRpb25zIHByb3RvYnVmCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK2lmIFsgIiREQVJXSU5fU1NIIiAtYSAiJERBUldJTl9TWVNURU1TIiBdOyB0aGVuCisgICAgIyBQZXJmb3JtIHJlbW90ZSBEYXJ3aW4gYnVpbGQgZmlyc3QuCisgICAgZHVtcCAiUmVtb3RlIHByb3RvYnVmIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9wcm90b2J1Zi1idWlsZCIKKworICAgIGJ1aWxkZXJfcnVuX3JlbW90ZV9kYXJ3aW5fYnVpbGQKKworICAgIGZvciBTWVNURU0gaW4gJERBUldJTl9TWVNURU1TOyBkbworICAgICAgICBidWlsZGVyX3JlbW90ZV9kYXJ3aW5fcmV0cmlldmVfaW5zdGFsbF9kaXIgJFNZU1RFTSAkSU5TVEFMTF9ESVIKKyAgICBkb25lCitmaQorCitmb3IgU1lTVEVNIGluICRMT0NBTF9IT1NUX1NZU1RFTVM7IGRvCisgICAgKAorICAgICAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3Rfbm9fYmlucHJlZml4ICIkU1lTVEVNIiAiJEFPU1BfRElSIgorCisgICAgICAgIGR1bXAgIiQoYnVpbGRlcl90ZXh0KSBCdWlsZGluZyBwcm90b2J1ZiIKKworICAgICAgICBidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSBnb29nbGVtb2NrCisgICAgICAgIGJ1aWxkZXJfdW5wYWNrX3BhY2thZ2Vfc291cmNlIGdvb2dsZXRlc3QKKyAgICAgICAgYnVpbGRlcl91bnBhY2tfcGFja2FnZV9zb3VyY2UgcHJvdG9idWYKKworICAgICAgICAjIHByb3RvYnVmIHJlcXVpcmVzIHRoZSBhdXRvZ2VuIHNjcmlwdCB0byBiZSBydW4gYmVmb3JlIGl0IGNvdWxkIGJlCisgICAgICAgICMgYnVpbHQuIFRPRE8oZGlnaXQpOiBQdXQgdGhlIHJlc3VsdCBpbiBhIHBhdGNoLCBiZWNhdXNlIHRoaXMKKyAgICAgICAgIyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgZm9yIHRoZSByZW1vdGUgYnVpbGQgdW5sZXNzIGF1dG90b29scyBhcmUKKyAgICAgICAgIyBpbnN0YWxsZWQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLgorICAgICAgICAoCisgICAgICAgICAgICBQS0dfU1JDX0RJUj0kKGJ1aWxkZXJfc3JjX2RpcikvJChwYWNrYWdlX2xpc3RfZ2V0X3NyY19kaXIgcHJvdG9idWYpCisgICAgICAgICAgICBjZCAiJFBLR19TUkNfRElSIgorICAgICAgICAgICAgcnVuIC4vYXV0b2dlbi5zaAorICAgICAgICApIHx8IHBhbmljICJDb3VsZCBub3QgcnVuIGF1dG9nZW4uc2ggcmVxdWlyZWQgYnkgcHJvdG9idWYhIgorCisgICAgICAgIGJ1aWxkZXJfYnVpbGRfYXV0b3Rvb2xzX3BhY2thZ2UgcHJvdG9idWYgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1zaGFyZWQgXAorICAgICAgICAgICAgICAgIC0td2l0aG91dC16bGliIFwKKworICAgICAgICBjb3B5X2RpcmVjdG9yeSBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iCisKKyAgICApIHx8IHBhbmljICJbJFNZU1RFTV0gQ291bGQgbm90IGJ1aWxkIHByb3RvYnVmISIKKworZG9uZQorCitsb2cgIkRvbmUgYnVpbGRpbmcgcHJvdG9idWYuIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXFlbXUtYW5kcm9pZC1kZXBzLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXFlbXUtYW5kcm9pZC1kZXBzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0MjZhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvYnVpbGQtcWVtdS1hbmRyb2lkLWRlcHMuc2gKQEAgLTAsMCArMSw0NzAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy4gJChkaXJuYW1lICIkMCIpL3V0aWxzL2NvbW1vbi5zaGkKKworc2hlbGxfaW1wb3J0IHV0aWxzL2Fvc3BfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2VtdWxhdG9yX3ByZWJ1aWx0cy5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9pbnN0YWxsX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorCitwYWNrYWdlX2J1aWxkZXJfcmVnaXN0ZXJfb3B0aW9ucyBxZW11LWFuZHJvaWQtZGVwcworCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCitpbnN0YWxsX2Rpcl9yZWdpc3Rlcl9vcHRpb24KKworREVGQVVMVF9QUkVCVUlMVFNfU1VCRElSPXByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkCitERUZBVUxUX0lOU1RBTExfU1VCRElSPXFlbXUtYW5kcm9pZC1kZXBzCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCBxZW11LWFuZHJvaWQgZGVwZW5kZW5jeSBsaWJyYXJpZXMgaWYgbmVlZGVkLiBUaGlzIHNjcmlwdCBwcm9iZXMKKzxwcmVidWlsdHM+LyRERUZBVUxUX0lOU1RBTExfU1VCRElSLyBhbmQgd2lsbCByZWJ1aWxkIHRoZSBsaWJyYXJpZXMgZnJvbSBzb3VyY2VzCitpZiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBvZiA8cHJlYnVpbHRzPiBpczogXCRBT1NQLyRERUZBVUxUX1BSRUJVSUxUU19TVUJESVIKK1VzZSAtLXByZWJ1aWx0cy1kaXI9PHBhdGg+IG9yIGRlZmluZSBBTkRST0lEX0VNVUxBVE9SX1BSRUJVSUxUU19ESVIgaW4geW91cgorZW52aXJvbm1lbnQgdG8gY2hhbmdlIGl0LgorCitTb3VyY2UgdGFyYmFsbCBhcmUgcHJvYmVkIHVuZGVyIDxwcmVidWlsdHM+L2FyY2hpdmUvLiBJZiBub3QgYXZhaWxhYmxlLAordGhlICdkb3dubG9hZC1zb3VyY2VzLnNoJyBzY3JpcHQgd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkuCisKK1NpbWlsYXJseSwgdGhlIHNjcmlwdCB3aWxsIHRyeSB0byBhdXRvLWRldGVjdCB0aGUgQU9TUCBzb3VyY2UgdHJlZSwgdG8gdXNlCitwcmVidWlsdCBTREstY29tcGF0aWJsZSB0b29sY2hhaW5zLCBidXQgeW91IGNhbiB1c2UgLS1hb3NwLWRpcj08cGF0aD4gb3IKK2RlZmluZSBBTkRST0lEX0VNVUxBVE9SX0FPU1BfRElSIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gb3ZlcnJpZGUgdGhpcy4KKworQnkgZGVmYXVsdCwgdGhpcyBzY3JpcHQgYnVpbGRzIGJpbmFyaWVzIGZvciB0aGUgZm9sbG93aW5nIGhvc3Qgc3l0ZW1zOgorCisgICAgJERFRkFVTFRfSE9TVF9TWVNURU1TCisKK1lvdSBjYW4gdXNlIC0taG9zdD08bGlzdD4gdG8gY2hhbmdlIHRoaXMuCisKK0ZpbmFsIGJpbmFyaWVzIGFyZSBpbnN0YWxsZWQgaW50byA8cHJlYnVpbHRzPi8kREVGQVVMVF9JTlNUQUxMX1NVQkRJUi8gYnkKK2RlZmF1bHQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGlzIGxvY2F0aW9uIHdpdGggLS1pbnN0YWxsLWRpcj08ZGlyPi4KKworQnkgZGVmYXVsdCwgZXZlcnl0aGluZyBpcyByZWJ1aWx0IGluIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IGlzCithdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgc2NyaXB0IGNvbXBsZXRpb24gKGFuZCBhZnRlciB0aGUgYmluYXJpZXMgYXJlCitjb3BpZWQgaW50byBidWlsZC1wcmVmaXgvKS4gWW91IGNhbiB1c2UgLS1idWlsZC1kaXI9PHBhdGg+IHRvIHNwZWNpZnkgdGhlCitidWlsZCBkaXJlY3RvcnkgaW5zdGVhZC4gSW4gdGhpcyBjYXNlLCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIHJlbW92ZWQsCithbGxvd2luZyBvbmUgdG8gaW5zcGVjdCBidWlsZCBmYWlsdXJlcyBlYXNpbHkuIgorCitvcHRpb25fcGFyc2UgIiRAIgorCisjIworIyMgIFBhcmFtZXRlcnMgY2hlY2tzCisjIworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gIjAiIF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cywgc2VlIC0taGVscCBmb3IgZGV0YWlscy4iCitmaQorCitwYWNrYWdlX2J1aWxkZXJfcHJvY2Vzc19vcHRpb25zCisKK2Fvc3BfZGlyX3BhcnNlX29wdGlvbgorcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb24KK2luc3RhbGxfZGlyX3BhcnNlX29wdGlvbgorCitwYWNrYWdlX2J1aWxkZXJfcGFyc2VfcGFja2FnZV9saXN0CisKK2V4cG9ydCBQS0dfQ09ORklHPSQoZmluZF9wcm9ncmFtIHBrZy1jb25maWcpCitpZiBbICIkUEtHX0NPTkZJRyIgXTsgdGhlbgorICAgIGxvZyAiRm91bmQgcGtnLWNvbmZpZyBhdDogJFBLR19DT05GSUciCitlbHNlCisgICAgbG9nICJwa2ctY29uZmlnIGlzIG5vdCBpbnN0YWxsZWQgb24gdGhpcyBzeXN0ZW0uIgorZmkKKworIyBIYW5kbGUgemxpYiwgb25seSBvbiBXaW4zMiBiZWNhdXNlIHRoZSB6bGliIGNvbmZpZ3VyZSBzY3JpcHQKKyMgZG9lc24ndCBrbm93IGhvdyB0byBnZW5lcmF0ZSBhIHN0YXRpYyBsaWJyYXJ5IHdpdGggLWZQSUMhCitkb193aW5kb3dzX3psaWJfcGFja2FnZSAoKSB7CisgICAgbG9jYWwgWkxJQl9WRVJTSU9OIFpMSUJfUEFDS0FHRQorICAgIGxvY2FsIExPQyBMREZMQUdTCisgICAgbG9jYWwgUFJFRklYPSQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkKKyAgICBsb2NhbCBCVUlMRF9ESVI9JChidWlsZGVyX2J1aWxkX2RpcikKKyAgICBjYXNlICQoYnVpbGRlcl9ob3N0KSBpbgorICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIExPQz0tbTMyCisgICAgICAgICAgICBMREZMQUdTPS1tMzIKKyAgICAgICAgICAgIDs7CisgICAgICAgIHdpbmRvd3MteDg2XzY0KQorICAgICAgICAgICAgTE9DPS1tNjQKKyAgICAgICAgICAgIExERkxBR1M9LW02NAorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgWkxJQl9WRVJTSU9OPSQocGFja2FnZV9saXN0X2dldF92ZXJzaW9uIHpsaWIpCisgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIEJ1aWxkaW5nIHpsaWItJFpMSUJfVkVSU0lPTiIKKyAgICBaTElCX1BBQ0tBR0U9JChwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lIHpsaWIpCisgICAgdW5wYWNrX2FyY2hpdmUgIiQoYnVpbGRlcl9hcmNoaXZlX2RpcikvJFpMSUJfUEFDS0FHRSIgIiRCVUlMRF9ESVIiCisgICAgKAorICAgICAgICBydW4gY2QgIiRCVUlMRF9ESVIvemxpYi0kWkxJQl9WRVJTSU9OIiAmJgorICAgICAgICBleHBvcnQgQklOQVJZX1BBVEg9JFBSRUZJWC9iaW4gJiYKKyAgICAgICAgZXhwb3J0IElOQ0xVREVfUEFUSD0kUFJFRklYL2luY2x1ZGUgJiYKKyAgICAgICAgZXhwb3J0IExJQlJBUllfUEFUSD0kUFJFRklYL2xpYiAmJgorICAgICAgICBydW4gbWFrZSAtZndpbjMyL01ha2VmaWxlLmdjYyBpbnN0YWxsIFwKKyAgICAgICAgICAgICAgICBQUkVGSVg9JChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpIFwKKyAgICAgICAgICAgICAgICBMT0M9JExPQyBcCisgICAgICAgICAgICAgICAgTERGTEFHUz0kTERGTEFHUworICAgICkKK30KKworZG9femxpYl9wYWNrYWdlICgpIHsKKyAgICBsb2NhbCBaTElCX1ZFUlNJT04gWkxJQl9QQUNLQUdFCisgICAgbG9jYWwgTE9DIExERkxBR1MKKyAgICBsb2NhbCBCVUlMRF9ESVI9JChidWlsZGVyX2J1aWxkX2RpcikKKyAgICBjYXNlICQoYnVpbGRlcl9ob3N0KSBpbgorICAgICAgICAqLXg4NikKKyAgICAgICAgICAgIExPQz0tbTMyCisgICAgICAgICAgICBMREZMQUdTPS1tMzIKKyAgICAgICAgICAgIDs7CisgICAgICAgICoteDg2XzY0KQorICAgICAgICAgICAgTE9DPS1tNjQKKyAgICAgICAgICAgIExERkxBR1M9LW02NAorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgWkxJQl9WRVJTSU9OPSQocGFja2FnZV9saXN0X2dldF92ZXJzaW9uIHpsaWIpCisgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIEJ1aWxkaW5nIHpsaWItJFpMSUJfVkVSU0lPTiIKKyAgICBaTElCX1BBQ0tBR0U9JChwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lIHpsaWIpCisgICAgdW5wYWNrX2FyY2hpdmUgIiQoYnVpbGRlcl9hcmNoaXZlX2RpcikvJFpMSUJfUEFDS0FHRSIgIiRCVUlMRF9ESVIiCisgICAgKAorICAgICAgICBydW4gY2QgIiRCVUlMRF9ESVIvemxpYi0kWkxJQl9WRVJTSU9OIiAmJgorICAgICAgICBleHBvcnQgQ1JPU1NfUFJFRklYPSQoYnVpbGRlcl9nbnVfY29uZmlnX2hvc3RfcHJlZml4KSAmJgorICAgICAgICBydW4gLi9jb25maWd1cmUgLS1wcmVmaXg9JChidWlsZGVyX2luc3RhbGxfcHJlZml4KSAmJgorICAgICAgICBydW4gbWFrZSAtaiROVU1fSk9CUyAmJgorICAgICAgICBydW4gbWFrZSBpbnN0YWxsCisgICAgKQorfQorCityZXF1aXJlX3Byb2dyYW0gKCkgeworICAgIGxvY2FsIFZBUk5BTUUgUFJPR05BTUUgQ01ECisgICAgVkFSTkFNRT0kMQorICAgIFBST0dOQU1FPSQyCisgICAgQ01EPSQoZmluZF9wcm9ncmFtICIkUFJPR05BTUUiKQorICAgIGlmIFsgLXogIiRDTUQiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNhbm5vdCBmaW5kIHJlcXVpcmVkIGJ1aWxkIGV4ZWN1dGFibGU6ICRQUk9HTkFNRSIKKyAgICBmaQorICAgIGV2YWwgJFZBUk5BTUU9XCckQ01EXCcKK30KKworIyBVbnBhY2sgYW5kIHBhdGNoIEdMaWIgc291cmNlcworIyAkMTogVW52ZXJzaW9uZWQgcGFja2FnZSBuYW1lIChlLmcuICdnbGliJykKK3VucGFja19hbmRfcGF0Y2ggKCkgeworICAgIHBhY2thZ2VfbGlzdF91bnBhY2tfYW5kX3BhdGNoIFwKKyAgICAgICAgICAgICQxICIkKGJ1aWxkZXJfYXJjaGl2ZV9kaXIpIiAiJChidWlsZGVyX2J1aWxkX2RpcikiCit9CisKKyMgQ3Jvc3MtY29tcGlsaW5nIGdsaWIgZm9yIFdpbjMyIGlzIGJyb2tlbiBhbmQgcmVxdWlyZXMgc3BlY2lhbCBjYXJlLgorIyBUaGUgZm9sbG93aW5nIHdhcyBpbnNwaXJlZCBieSB0aGUgZ2xpYi5tayBmcm9tIE1YRSAoaHR0cDovL214ZS5jYy8pCisjICQxOiBiaXRuZXNzICgzMiBvciA2NCkKK2RvX3dpbmRvd3NfZ2xpYl9wYWNrYWdlICgpIHsKKyAgICBsb2NhbCBQUkVGSVg9JChidWlsZGVyX2luc3RhbGxfcHJlZml4KQorICAgIGxvY2FsIEdOVV9DT05GSUdfSE9TVF9QUkVGSVg9JChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpCisgICAgcGFja2FnZV9saXN0X3VucGFja19hbmRfcGF0Y2ggXAorICAgICAgICAgICAgZ2xpYiAiJChidWlsZGVyX2FyY2hpdmVfZGlyKSIgIiQoYnVpbGRlcl9idWlsZF9kaXIpIgorICAgIGxvY2FsIEdMSUJfVkVSU0lPTiBHTElCX1BBQ0tBR0UgR0xJQl9ESVIKKyAgICBHTElCX1ZFUlNJT049JChwYWNrYWdlX2xpc3RfZ2V0X3ZlcnNpb24gZ2xpYikKKyAgICBHTElCX0RJUj0kKGJ1aWxkZXJfYnVpbGRfZGlyKS9nbGliLSRHTElCX1ZFUlNJT04KKyAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgZ2xpYi0kR0xJQl9WRVJTSU9OIgorICAgIHJlcXVpcmVfcHJvZ3JhbSBHTElCX0dFTk1BUlNIQUwgZ2xpYi1nZW5tYXJzaGFsCisgICAgcmVxdWlyZV9wcm9ncmFtIEdMSUJfQ09NUElMRV9TQ0hFTUFTIGdsaWItY29tcGlsZS1zY2hlbWFzCisgICAgcmVxdWlyZV9wcm9ncmFtIEdMSUJfQ09NUElMRV9SRVNPVVJDRVMgZ2xpYi1jb21waWxlLXJlc291cmNlcworICAgICgKKyAgICAgICAgcnVuIGNkICIkR0xJQl9ESVIiICYmCisgICAgICAgIGV4cG9ydCBMREZMQUdTPSItTCRQUkVGSVgvbGliIC1MJFBSRUZJWC9saWIkMSIgJiYKKyAgICAgICAgZXhwb3J0IENQUEZMQUdTPSItSSRQUkVGSVgvaW5jbHVkZSAtSSRHTElCX0RJUiAtSSRHTElCX0RJUi9nbGliIiAmJgorICAgICAgICBleHBvcnQgQ0M9JHtHTlVfQ09ORklHX0hPU1RfUFJFRklYfWdjYyAmJgorICAgICAgICBleHBvcnQgQ1hYPSR7R05VX0NPTkZJR19IT1NUX1BSRUZJWH1jKysgJiYKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUc9JChmaW5kX3Byb2dyYW0gcGtnLWNvbmZpZykgJiYKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfUEFUSD0kUFJFRklYL2xpYi9wa2djb25maWcgJiYKKyAgICAgICAgcnVuIC4vY29uZmlndXJlIFwKKyAgICAgICAgICAgIC0tcHJlZml4PSRQUkVGSVggXAorICAgICAgICAgICAgJChidWlsZGVyX2dudV9jb25maWdfaG9zdF9mbGFnKSBcCisgICAgICAgICAgICAtLWRpc2FibGUtc2hhcmVkIFwKKyAgICAgICAgICAgIC0td2l0aC10aHJlYWRzPXdpbjMyIFwKKyAgICAgICAgICAgIC0td2l0aC1wY3JlPWludGVybmFsIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1kZWJ1ZyBcCisgICAgICAgICAgICAtLWRpc2FibGUtbWFuIFwKKyAgICAgICAgICAgIC0td2l0aC1saWJpY29udj1ubyBcCisgICAgICAgICAgICBHTElCX0dFTk1BUlNIQUw9JEdMSUJfR0VOTUFSU0hBTCBcCisgICAgICAgICAgICBHTElCX0NPTVBJTEVfU0NIRU1BUz0kR0xJQl9DT01QSUxFX1NDSEVNQVMgXAorICAgICAgICAgICAgR0xJQl9DT01QSUxFX1JFU09VUkNFUz0kR0xJQl9DT01QSUxFX1JFU09VUkNFUyAmJgorCisgICAgICAgICMgTmVjZXNzYXJ5IHRvIGJ1aWxkIGdpbyBzdHVmZiBwcm9wZXJseS4KKyAgICAgICAgcnVuIGxuIC1zICIkR0xJQl9DT01QSUxFX1JFU09VUkNFUyIgZ2lvLyAmJgorCisgICAgICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTIC1DIGdsaWIgaW5zdGFsbCBzYmluX1BST0dSQU1TPSBub2luc3RfUFJPR1JBTVM9ICYmCisgICAgICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTIC1DIGdtb2R1bGUgaW5zdGFsbCBiaW5fUFJPR1JBTVM9IHNiaW5fUFJPR1JBTVM9IG5vaW5zdF9QUk9HUkFNUz0gJiYKKyAgICAgICAgcnVuIG1ha2UgLWokTlVNX0pPQlMgLUMgZ3RocmVhZCBpbnN0YWxsIGJpbl9QUk9HUkFNUz0gc2Jpbl9QUk9HUkFNUz0gbm9pbnN0X1BST0dSQU1TPSAmJgorICAgICAgICBydW4gbWFrZSAtaiROVU1fSk9CUyAtQyBnb2JqZWN0IGluc3RhbGwgYmluX1BST0dSQU1TPSBzYmluX1BST0dSQU1TPSBub2luc3RfUFJPR1JBTVM9ICYmCisgICAgICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTIC1DIGdpbyBpbnN0YWxsIGJpbl9QUk9HUkFNUz0gc2Jpbl9QUk9HUkFNUz0gbm9pbnN0X1BST0dSQU1TPSBNSVNDX1NUVUZGPSAmJgorICAgICAgICBydW4gbWFrZSAtaiROVU1fSk9CUyBpbnN0YWxsLXBrZ2NvbmZpZ0RBVEEgJiYKKyAgICAgICAgcnVuIG1ha2UgLWokTlVNX0pPQlMgLUMgbTRtYWNyb3MgaW5zdGFsbCAmJgorCisgICAgICAgICMgTWlzc2luZyAtbG9sZTMyIHJlc3VsdHMgaW4gbGluayBmYWlsdXJlIGxhdGVyIQorICAgICAgICBzZWQgLWkgLWUgJ3N8XC1sZ2xpYi0yLjB8LWxnbGliLTIuMCAtbG9sZTMyfGcnIFwKKyAgICAgICAgICAgICRQUkVGSVgvbGliL3BrZ2NvbmZpZy9nbGliLTIuMC5wYworICAgICkKK30KKworIyBHZW5lcmljIHJvdXRpbmUgdXNlZCB0byB1bnBhY2sgYW5kIHJlYnVpbGQgYSBnZW5lcmljIGF1dG8tdG9vbHMgcGFja2FnZQorIyAkMTogcGFja2FnZSBuYW1lLCB1bnZlcnNpb25lZCBhbmQgdW5zdWZmaXhlZCAoZS5nLiAnbGlicG5nJykKKyMgJDIrOiBleHRyYSBjb25maWd1cmF0aW9uIGZsYWdzCitkb19hdXRvdG9vbHNfcGFja2FnZSAoKSB7CisgICAgYnVpbGRlcl91bnBhY2tfcGFja2FnZV9zb3VyY2UgJDEKKyAgICBidWlsZGVyX2J1aWxkX2F1dG90b29sc19wYWNrYWdlICIkQCIgLS1kaXNhYmxlLXNoYXJlZCAtLXdpdGgtcGljCit9CisKK2RvX2R0Y19wYWNrYWdlICgpIHsKKyAgICBsb2NhbCBQS0c9ZHRjCisgICAgdW5wYWNrX2FuZF9wYXRjaCAkUEtHCisgICAgUEtHX1ZFUlNJT049JChwYWNrYWdlX2xpc3RfZ2V0X3ZlcnNpb24gJFBLRykKKyAgICBQS0dfTkFNRT0kKHBhY2thZ2VfbGlzdF9nZXRfZmlsZW5hbWUgJFBLRykKKyAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgbGliZmR0IGZyb20gJFBLRy0kUEtHX1ZFUlNJT04iCisgICAgIyBOT1RFOiBDYW5ub3QgdXNlIHRoZSBkdGMgTWFrZWZpbGVzIGhlcmUsIGJ1dCBzaW5jZSB0aGUgbGlicmFyeSBpcworICAgICMgICAgICAgcmVhbGx5IHNpbXBsZSwganVzdCBjb21waWxlIHRoZSBzb3VyY2UgZmlsZXMgc3RyYWlnaHQgaW50byBhCisgICAgIyAgICAgICBsaWJyYXJ5LCB0aGVuICdpbnN0YWxsJyBpdCBtYW51YWxseSAhIQorICAgICgKKyAgICAgICAgcnVuIGNkICIkKGJ1aWxkZXJfYnVpbGRfZGlyKS8kUEtHLSRQS0dfVkVSU0lPTiIgJiYKKyAgICAgICAgQ0M9JChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpZ2NjCisgICAgICAgIEFSPSQoYnVpbGRlcl9nbnVfY29uZmlnX2hvc3RfcHJlZml4KWFyCisgICAgICAgIENDRkxBR1M9CisgICAgICAgIExJQk5BTUU9bGliZmR0LmEKKyAgICAgICAgdmFyX2FwcGVuZCBDQ0ZMQUdTICItSWxpYmZkdCIKKyAgICAgICAgY2FzZSAkKGJ1aWxkZXJfaG9zdCkgaW4KKyAgICAgICAgICAgIGxpbnV4LSp8ZGFyd2luLSopCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBDQ0ZMQUdTICItZlBJQyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICAgIHJ1biAkQ0MgLWMgJENDRkxBR1MgbGliZmR0LyouYworICAgICAgICBydW4gJEFSIGNycyAkTElCTkFNRSAqLm8KKyAgICAgICAgcnVuIG1rZGlyIC1wICIkUFJFRklYL2luY2x1ZGUiCisgICAgICAgIHJ1biBjcCBsaWJmZHQvKi5oICIkUFJFRklYIi9pbmNsdWRlLworICAgICAgICBydW4gbWtkaXIgLXAgIiRQUkVGSVgvbGliIgorICAgICAgICBydW4gY3AgJExJQk5BTUUgIiRQUkVGSVgvbGliIgorICAgICkgfHwgcGFuaWMgIkNhbm5vdCByZWJ1aWxkIGxpYmZkdCIKK30KKworIyAkMTogaG9zdCBvcyBuYW1lLgorIyAkMjogZW52aXJvbm1lbnQgc2hlbGwgc2NyaXB0LgorYnVpbGRfcWVtdV9hbmRyb2lkX2RlcHMgKCkgeworICAgIGJ1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCAiJDEiICIkQU9TUF9ESVIiCisKKyAgICBpZiBbIC16ICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgICAgIGlmIHRpbWVzdGFtcF9jaGVjayBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kKGJ1aWxkZXJfaG9zdCkiIHFlbXUtYW5kcm9pZC1kZXBzOyB0aGVuCisgICAgICAgICAgICBsb2cgIiQoYnVpbGRlcl90ZXh0KSBBbHJlYWR5IGJ1aWx0LiIKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGZpCisgICAgZmkKKworICAgIGxvY2FsIFBSRUZJWD0kKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpCisKKyAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPSRQUkVGSVgvbGliL3BrZ2NvbmZpZworICAgICMgSGFuZGxlIHpsaWIgZm9yIFdpbmRvd3MKKyAgICBjYXNlICQxIGluCisgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgIGRvX3dpbmRvd3NfemxpYl9wYWNrYWdlCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZG9femxpYl9wYWNrYWdlCisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgICMgbGliZmR0LCBmcm9tIHRoZSBkdGMgcGFja2FnZSwgaXMgbmVlZGVkLgorICAgIGRvX2R0Y19wYWNrYWdlIGR0YworCisgICAgIyBsaWJmZmkgaXMgcmVxdWlyZWQgYnkgZ2xpYi4KKyAgICBkb19hdXRvdG9vbHNfcGFja2FnZSBsaWJmZmkKKworICAgICMgTXVzdCBkZWZpbmUgTElCRkZJX0NGTEFHUyBhbmQgTElCRkZJX0xJQlMgdG8gZW5zdXJlCisgICAgIyB0aGF0IEdMaWIgcGlja3MgaXQgdXAgcHJvcGVybHkuIE5vdGUgdGhhdCBsaWJmZmkgcGxhY2VzCisgICAgIyBpdHMgaGVhZGVycyBhbmQgbGlicmFyaWVzIGluIHVuY29tbW9uIHBsYWNlcy4KKyAgICBMSUJGRklfVkVSU0lPTj0kKHBhY2thZ2VfbGlzdF9nZXRfdmVyc2lvbiBsaWJmZmkpCisgICAgTElCRkZJX0NGTEFHUz0iLUkkUFJFRklYL2xpYi9saWJmZmktJExJQkZGSV9WRVJTSU9OL2luY2x1ZGUiCisgICAgTElCRkZJX0xJQlM9IiRQUkVGSVgvbGliL2xpYmZmaS5sYSIKKyAgICBpZiBbICEgLWYgIiRMSUJGRklfTElCUyIgXTsgdGhlbgorICAgICAgICBMSUJGRklfTElCUz0iJFBSRUZJWC9saWI2NC9saWJmZmkubGEiCisgICAgZmkKKyAgICBpZiBbICEgLWYgIiRMSUJGRklfTElCUyIgXTsgdGhlbgorICAgICAgICBMSUJGRklfTElCUz0iJFBSRUZJWC9saWIzMi9saWJmZmkubGEiCisgICAgZmkKKyAgICBpZiBbICEgLWYgIiRMSUJGRklfTElCUyIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiQ2Fubm90IGxvY2F0ZSBsaWJmZmkgbGlicmFyaWVzISIKKyAgICBmaQorCisgICAgbG9nICJVc2luZyBMSUJGRklfQ0ZMQUdTPVskTElCRkZJX0NGTEFHU10iCisgICAgbG9nICJVc2luZyBMSUJGRklfTElCUz1bJExJQkZGSV9MSUJTXSIKKyAgICBleHBvcnQgTElCRkZJX0NGTEFHUyBMSUJGRklfTElCUworCisgICAgIyBsaWJpY29udiBhbmQgZ2V0dGV4dCBhcmUgbmVlZGVkIG9uIERhcndpbiBvbmx5CisgICAgY2FzZSAkMSBpbgorICAgICAgICBkYXJ3aW4tKikKKyAgICAgICAgICAgIGRvX2F1dG90b29sc19wYWNrYWdlIGxpYmljb252CisgICAgICAgICAgICBkb19hdXRvdG9vbHNfcGFja2FnZSBnZXR0ZXh0IFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtcnBhdGggXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1hY2wgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1jdXJzZXMgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1vcGVubXAgXAorICAgICAgICAgICAgICAgIC0tZGlzYWJsZS1qYXZhIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtbmF0aXZlLWphdmEgXAorICAgICAgICAgICAgICAgIC0td2l0aG91dC1lbWFjcyBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWMrKyBcCisgICAgICAgICAgICAgICAgLS13aXRob3V0LWxpYmV4cGF0LXByZWZpeAorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIGdsaWIgaXMgcmVxdWlyZWQgYnkgcGtnLWNvbmZpZyBhbmQgcWVtdS1hbmRyb2lkCisgICAgY2FzZSAkMSBpbgorICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIGRvX3dpbmRvd3NfZ2xpYl9wYWNrYWdlIDMyCisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzLXg4Nl82NCkKKyAgICAgICAgICAgIGRvX3dpbmRvd3NfZ2xpYl9wYWNrYWdlIDY0CisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZG9fYXV0b3Rvb2xzX3BhY2thZ2UgZ2xpYiBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWFsd2F5cy1idWlsZC10ZXN0cyBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLWRlYnVnIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtZmFtIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtaW5jbHVkZWQtcHJpbnRmIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtaW5zdGFsbGVkLXRlc3RzIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtbGliZWxmIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtbWFuIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtc2VsaW51eCBcCisgICAgICAgICAgICAgICAgLS1kaXNhYmxlLXhhdHRyIFwKKyAgICAgICAgICAgICAgICAtLWRpc2FibGUtY29tcGlsZS13YXJuaW5ncworICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIEV4cG9ydCB0aGVzZSB0byBlbnN1cmUgdGhhdCBwa2ctY29uZmlnIHBpY2tzIHRoZW0gdXAgcHJvcGVybHkuCisgICAgZXhwb3J0IEdMSUJfQ0ZMQUdTPSItSSRQUkVGSVgvaW5jbHVkZS9nbGliLTIuMCAtSSRQUkVGSVgvbGliL2dsaWItMi4wL2luY2x1ZGUiCisgICAgZXhwb3J0IEdMSUJfTElCUz0iJFBSRUZJWC9saWIvbGliZ2xpYi0yLjAubGEiCisgICAgY2FzZSAkKGdldF9idWlsZF9vcykgaW4KKyAgICAgICAgZGFyd2luKQorICAgICAgICAgICAgR0xJQl9MSUJTPSIkR0xJQl9MSUJTIC1XbCwtZnJhbWV3b3JrLENhcmJvbiAtV2wsLWZyYW1ld29yayxGb3VuZGF0aW9uIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICAjIHBrZy1jb25maWcgaXMgcmVxdWlyZWQgYnkgcWVtdS1hbmRyb2lkLCBhbmQgbm90IGF2YWlsYWJsZSBvbgorICAgICMgV2luZG93cyBhbmQgT1MgWAorICAgIGRvX2F1dG90b29sc19wYWNrYWdlIHBrZy1jb25maWcgXAorICAgICAgICAtLXdpdGhvdXQtcGMtcGF0aCBcCisgICAgICAgIC0tZGlzYWJsZS1ob3N0LXRvb2wKKworICAgICMgSGFuZGxlIGxpYnBuZworICAgIGRvX2F1dG90b29sc19wYWNrYWdlIGxpYnBuZworCisgICAgZG9fYXV0b3Rvb2xzX3BhY2thZ2UgcGl4bWFuIFwKKyAgICAgICAgLS1kaXNhYmxlLWd0ayBcCisgICAgICAgIC0tZGlzYWJsZS1saWJwbmcKKworICAgICMgSGFuZGxlIFNETDIKKyAgICBkb19hdXRvdG9vbHNfcGFja2FnZSBTREwyCisgICAgU0RMX0NPTkZJRz0kUFJFRklYL2Jpbi9zZGwyLWNvbmZpZworCisgICAgIyBkZWZhdWx0IHNkbDIucGMgbGlicyBkb2Vzbid0IHdvcmsgd2l0aCBvdXIgY3Jvc3MtY29tcGlsZXIsCisgICAgIyBhcHBlbmQgbWlzc2luZyBsaWJzCisgICAgY2FzZSAkMSBpbgorICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICBzZWQgLWkgLWUgJy9eTGliczogLUxcJHtsaWJkaXJ9IC9zLyQvIC1XbCwtLW5vLXVuZGVmaW5lZCAtbG0gLWxkaW5wdXQ4IC1sZHhndWlkIC1sZHhlcnI4IC1sdXNlcjMyIC1sZ2RpMzIgLWx3aW5tbSAtbGltbTMyIC1sb2xlMzIgLWxvbGVhdXQzMiAtbHNoZWxsMzIgLWx2ZXJzaW9uIC1sdXVpZCAtc3RhdGljLWxpYmdjYy8nICRQUkVGSVgvbGliL3BrZ2NvbmZpZy9zZGwyLnBjCisgICAgICAgICAgICA7OworICAgICAgICBkYXJ3aW4tKikKKyAgICAgICAgICAgIHNlZCAtaSAiIiAtZSAnL15MaWJzOiAtTFwke2xpYmRpcn0gL3MvJC8gLWxtIC1XbCwtZnJhbWV3b3JrLE9wZW5HTCAgLVdsLC1mcmFtZXdvcmssRm9yY2VGZWVkYmFjayAtbG9iamMgLVdsLC1mcmFtZXdvcmssQ29jb2EgLVdsLC1mcmFtZXdvcmssQ2FyYm9uIC1XbCwtZnJhbWV3b3JrLElPS2l0IC1XbCwtZnJhbWV3b3JrLENvcmVBdWRpbyAtV2wsLWZyYW1ld29yayxBdWRpb1Rvb2xib3ggLVdsLC1mcmFtZXdvcmssQXVkaW9Vbml0LycgJFBSRUZJWC9saWIvcGtnY29uZmlnL3NkbDIucGMKKyAgICAgICAgICAgIDs7CisgICAgICAgIGxpbnV4LSopCisgICAgICAgICAgICBzZWQgLWkgLWUgJy9eTGliczogLUxcJHtsaWJkaXJ9IC9zLyQvIC1XbCwtLW5vLXVuZGVmaW5lZCAtbG0gLWxkbCAtbHJ0LycgJFBSRUZJWC9saWIvcGtnY29uZmlnL3NkbDIucGMKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworCisKKyAgICBQS0dfQ09ORklHX0xJQkRJUj0kUFJFRklYL2xpYi9wa2djb25maWcKKyAgICBjYXNlICQxIGluCisgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgICMgVXNlIHRoZSBob3N0IHZlcnNpb24sIG9yIHRoZSBidWlsZCB3aWxsIGZyZWV6ZS4KKyAgICAgICAgICAgIFBLR19DT05GSUc9cGtnLWNvbmZpZworICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIFBLR19DT05GSUc9JFBSRUZJWC9iaW4vcGtnLWNvbmZpZworICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhwb3J0IFNETF9DT05GSUcgUEtHX0NPTkZJRyBQS0dfQ09ORklHX0xJQkRJUgorCisgICAgIyBDcmVhdGUgc2NyaXB0IHRvIHNldHVwIHRoZSBlbnZpcm9ubWVudCBjb3JyZWN0bHkgZm9yIHRoZQorICAgICMgbGF0ZXIgcWVtdS1hbmRyb2lkIGJ1aWxkLgorICAgIEVOVl9TSD0kKGJ1aWxkZXJfYnVpbGRfZGlyKS9lbnYtcWVtdS1wcmVidWlsdHMtJChidWlsZGVyX2hvc3QpLnNoCisgICAgY2F0ID4gJEVOVl9TSCA8PEVPRgorIyBBdXRvLWdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IC0gRE8gTk9UIEVESVQKK2V4cG9ydCBQUkVGSVg9JFBSRUZJWAorZXhwb3J0IExJQkZGSV9DRkxBR1M9IiRMSUJGRklfQ0ZMQUdTIgorZXhwb3J0IExJQkZGSV9MSUJTPSIkTElCRkZJX0xJQlMiCitleHBvcnQgR0xJQl9DRkxBR1M9IiRHTElCX0NGTEFHUyIKK2V4cG9ydCBHTElCX0xJQlM9IiRHTElCX0xJQlMiCitleHBvcnQgU0RMX0NPTkZJRz0kU0RMX0NPTkZJRworZXhwb3J0IFBLR19DT05GSUc9JFBLR19DT05GSUcKK2V4cG9ydCBQS0dfQ09ORklHX0xJQkRJUj0kUEtHX0NPTkZJR19MSUJESVIKK2V4cG9ydCBQS0dfQ09ORklHX1BBVEg9JFBLR19DT05GSUdfUEFUSAorZXhwb3J0IFBBVEg9JFBBVEgKK0VPRgorCisgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIENvcHlpbmcgcHJlYnVpbHRzIHRvICRJTlNUQUxMX0RJUi8kKGJ1aWxkZXJfaG9zdCkiCisKKyAgICBCSU5BUllfRElSPSRJTlNUQUxMX0RJUi8kKGJ1aWxkZXJfaG9zdCkKKyAgICBydW4gbWtkaXIgLXAgIiRCSU5BUllfRElSIiB8fAorICAgIHBhbmljICJDb3VsZCBub3QgY3JlYXRlIGZpbmFsIGRpcmVjdG9yeTogJEJJTkFSWV9ESVIiCisKKyAgICBsb2NhbCBTVUJESVIKKyAgICBmb3IgU1VCRElSIGluIGluY2x1ZGUgbGliIGxpYjMyIGxpYjY0IGJpbjsgZG8KKyAgICAgICAgaWYgWyAhIC1kICIkUFJFRklYLyRTVUJESVIiIF07IHRoZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisgICAgICAgIHJ1biBjb3B5X2RpcmVjdG9yeSAiJFBSRUZJWC8kU1VCRElSIiAiJEJJTkFSWV9ESVIvJFNVQkRJUiIKKyAgICBkb25lCisKKyAgICB1bnNldCBQS0dfQ09ORklHIFBLR19DT05GSUdfUEFUSCBQS0dfQ09ORklHX0xJQkRJUiBTRExfQ09ORklHCisgICAgdW5zZXQgTElCRkZJX0NGTEFHUyBMSUJGRklfTElCUyBHTElCX0NGTEFHUyBHTElCX0xJQlMKKworICAgIHRpbWVzdGFtcF9zZXQgIiRJTlNUQUxMX0RJUi8kKGJ1aWxkZXJfaG9zdCkiIHFlbXUtYW5kcm9pZC1kZXBzCit9CisKKyMgSWdub3JlIHByZWJ1aWx0IERhcndpbiBiaW5hcmllcyBpZiAtLWZvcmNlIGlzIG5vdCB1c2VkLgoraWYgWyAteiAiJE9QVF9GT1JDRSIgXTsgdGhlbgorICAgIGJ1aWxkZXJfY2hlY2tfYWxsX3RpbWVzdGFtcHMgIiRJTlNUQUxMX0RJUiIgcWVtdS1hbmRyb2lkLWRlcHMKK2ZpCisKK2lmIFsgIiREQVJXSU5fU1NIIiAtYSAiJERBUldJTl9TWVNURU1TIiBdOyB0aGVuCisgICAgIyBQZXJmb3JtIHJlbW90ZSBEYXJ3aW4gYnVpbGQgZmlyc3QuCisgICAgZHVtcCAiUmVtb3RlIHFlbXUtYW5kcm9pZC1kZXBzIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgICIvdG1wLyRVU0VSLXJlYnVpbGQtZGFyd2luLXNzaC0kJC9xZW11LWFuZHJvaWQtZGVwcy1idWlsZCIKKworICAgIGlmIFsgIiRPUFRfRk9SQ0UiIF07IHRoZW4KKyAgICAgICAgdmFyX2FwcGVuZCBEQVJXSU5fQlVJTERfRkxBR1MgIi0tZm9yY2UiCisgICAgZmkKKworICAgIGJ1aWxkZXJfcnVuX3JlbW90ZV9kYXJ3aW5fYnVpbGQKKworICAgIGZvciBTWVNURU0gaW4gJERBUldJTl9TWVNURU1TOyBkbworICAgICAgICBidWlsZGVyX3JlbW90ZV9kYXJ3aW5fcmV0cmlldmVfaW5zdGFsbF9kaXIgJFNZU1RFTSAkSU5TVEFMTF9ESVIKKyAgICAgICAgdGltZXN0YW1wX3NldCAiJElOU1RBTExfRElSLyRTWVNURU0iIHFlbXUtYW5kcm9pZC1kZXBzCisgICAgZG9uZQorZmkKKworZm9yIFNZU1RFTSBpbiAkTE9DQUxfSE9TVF9TWVNURU1TOyBkbworICAgIGJ1aWxkX3FlbXVfYW5kcm9pZF9kZXBzICRTWVNURU0KK2RvbmUKKworbG9nICJEb25lIGJ1aWxkaW5nIHFlbXUtYW5kcm9pZCBkZXBlbmRlbmNpZXMuIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXFlbXUtYW5kcm9pZC5zaCBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1xZW11LWFuZHJvaWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDA2ZTdiYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1xZW11LWFuZHJvaWQuc2gKQEAgLTAsMCArMSw0NzQgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy4gJChkaXJuYW1lICIkMCIpL3V0aWxzL2NvbW1vbi5zaGkKKworc2hlbGxfaW1wb3J0IHV0aWxzL2Fvc3BfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2VtdWxhdG9yX3ByZWJ1aWx0cy5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9pbnN0YWxsX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorCitERUZBVUxUX0lOU1RBTExfU1VCRElSPXFlbXUtYW5kcm9pZAorCitQUk9HUkFNX1BBUkFNRVRFUlM9IjxxZW11LWFuZHJvaWQ+IgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCB1cHN0cmVhbSB2ZXJzaW9uIG9mIHFlbXUtYW5kcm9pZCBzb3VyY2VzICgqd2l0aG91dCogQW5kcm9pZCBzdXBwb3J0KS4KK1RoaXMgc2NyaXB0IHdpbGwgcHJvYmUgPHByZWJ1aWx0cz4vJERFRkFVTFRfSU5TVEFMTF9TVUJESVIvIHRvIGxvb2sgZm9yCitwcmVidWlsdCBkZXBlbmRlbmNpZXMuIElmIG5vdCBhdmFpbGFibGUsIHRoZSAnYnVpbGQtcWVtdS1hbmRyb2lkLWRlcHMuc2gnCitzY3JpcHQgd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkuCisKK1RoZSBkZWZhdWx0IHZhbHVlIG9mIDxwcmVidWlsdHM+IGlzOiAkREVGQVVMVF9QUkVCVUlMVFNfRElSCitVc2UgLS1wcmVidWlsdHMtZGlyPTxwYXRoPiBvciBkZWZpbmUgQU5EUk9JRF9FTVVMQVRPUl9QUkVCVUlMVFNfRElSIGluIHlvdXIKK2Vudmlyb25tZW50IHRvIGNoYW5nZSBpdC4KKworU2ltaWxhcmx5LCB0aGUgc2NyaXB0IHdpbGwgdHJ5IHRvIGF1dG8tZGV0ZWN0IHRoZSBBT1NQIHNvdXJjZSB0cmVlLCB0byB1c2UKK3ByZWJ1aWx0IFNESy1jb21wYXRpYmxlIHRvb2xjaGFpbnMsIGJ1dCB5b3UgY2FuIHVzZSAtLWFvc3AtZGlyPTxwYXRoPiBvcgorZGVmaW5lIEFORFJPSURfRU1VTEFUT1JfQU9TUF9ESVIgaW4geW91ciBlbnZpcm9ubWVudCB0byBvdmVycmlkZSB0aGlzLgorCitCeSBkZWZhdWx0LCB0aGlzIHNjcmlwdCBidWlsZHMgYmluYXJpZXMgZm9yIHRoZSBmb2xsb3dpbmcgaG9zdCBzeXRlbXM6CisKKyAgICAkREVGQVVMVF9IT1NUX1NZU1RFTVMKKworWW91IGNhbiB1c2UgLS1ob3N0PTxsaXN0PiB0byBjaGFuZ2UgdGhpcy4KKworRmluYWwgYmluYXJpZXMgYXJlIGluc3RhbGxlZCBpbnRvIDxwcmVidWlsdHM+LyRERUZBVUxUX0lOU1RBTExfU1VCRElSLyBieQorZGVmYXVsdCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoaXMgbG9jYXRpb24gd2l0aCAtLWluc3RhbGwtZGlyPTxkaXI+LgorCitCeSBkZWZhdWx0LCBldmVyeXRoaW5nIGlzIHJlYnVpbHQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgaXMKK2F1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciBzY3JpcHQgY29tcGxldGlvbiAoYW5kIGFmdGVyIHRoZSBiaW5hcmllcyBhcmUKK2NvcGllZCBpbnRvIGJ1aWxkLXByZWZpeC8pLiBZb3UgY2FuIHVzZSAtLWJ1aWxkLWRpcj08cGF0aD4gdG8gc3BlY2lmeSB0aGUKK2J1aWxkIGRpcmVjdG9yeSBpbnN0ZWFkLiBJbiB0aGlzIGNhc2UsIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgcmVtb3ZlZCwKK2FsbG93aW5nIG9uZSB0byBpbnNwZWN0IGJ1aWxkIGZhaWx1cmVzIGVhc2lseS4iCisKK3BhY2thZ2VfYnVpbGRlcl9yZWdpc3Rlcl9vcHRpb25zCisKK1ZBTElEX1RBUkdFVFM9ImFybSxhcm02NCx4ODYseDg2XzY0LG1pcHMsbWlwczY0IgorREVGQVVMVF9UQVJHRVRTPSJhcm0sYXJtNjQsbWlwcyxtaXBzNjQseDg2LHg4Nl82NCIKKworT1BUX1RBUkdFVD0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tdGFyZ2V0PTxsaXN0PiIgT1BUX1RBUkdFVCBcCisgICAgICAgICJCdWlsZCBiaW5hcmllcyBmb3IgdGFyZ2V0cyBbJERFRkFVTFRfVEFSR0VUU10iCisKK09QVF9TUkNfRElSPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1zcmMtZGlyPTxkaXI+IiBPUFRfU1JDX0RJUiBcCisgICAgICAgICJTZXQgcWVtdTIgc291cmNlIGRpcmVjdG9yeSBbYXV0b2RldGVjdF0iCisKK09QVF9ERUJVRz0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tZGVidWciIE9QVF9ERUJVRyBcCisgICAgICAgICJHZW5lcmF0ZSBkZWJ1Z2dhYmxlIGJpbmFyaWVzLiIKKworT1BUX05PX1RFU1RTPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1uby10ZXN0cyIgT1BUX05PX1RFU1RTIFwKKyAgICAgICAgIkRvbid0IHJ1biBRRU1VMiB0ZXN0cyB0byBzcGVlZCB1cCBidWlsZC4iCisKK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiBxZW11LWFuZHJvaWQKKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gMCBdOyB0aGVuCisgICAgcGFuaWMgIlRoaXMgc2NyaXB0IHRha2VzIG5vIGFyZ3VtZW50cy4gU2VlIC0taGVscCBmb3IgZGV0YWlscy4iCitmaQorCitpZiBbICIkT1BUX1NSQ19ESVIiIF07IHRoZW4KKyAgICBRRU1VX1NSQ0RJUj0kT1BUX1NSQ19ESVIKK2Vsc2UKKyAgICBERUZBVUxUX1NSQ19ESVI9JChjZCAkKHByb2dyYW1fZGlyZWN0b3J5KS8uLi8uLiAmJiBwd2QgLVAgMj4vZGV2L251bGwgfHwgdHJ1ZSkKKyAgICBpZiBbICIkREVGQVVMVF9TUkNfRElSIiBdOyB0aGVuCisgICAgICAgIFFFTVVfU1JDRElSPSRERUZBVUxUX1NSQ19ESVIKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1zcmMtZGlyPSRRRU1VX1NSQ0RJUiIKKyAgICBlbHNlCisgICAgICAgIHBhbmljICJDb3VsZCBub3QgZmluZCBxZW11LWFuZHJvaWQgc291cmNlcy4gUGxlYXNlIHVzZSAtLXNyYy1kaXI9PGRpcj4uIgorICAgIGZpCitmaQoraWYgWyAhIC1mICIkUUVNVV9TUkNESVIvaW5jbHVkZS9xZW11LWNvbW1vbi5oIiBdOyB0aGVuCisgICAgcGFuaWMgIk5vdCBhIHZhbGlkIHFlbXUyIHNvdXJjZSBkaXJlY3Rvcnk6ICRRRU1VX1NSQ0RJUiIKK2ZpCitRRU1VX1NSQ0RJUj0kKGNkICIkUUVNVV9TUkNESVIiICYmIHB3ZCAtUCkKKworcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb24KK2Fvc3BfZGlyX3BhcnNlX29wdGlvbgoraW5zdGFsbF9kaXJfcGFyc2Vfb3B0aW9uCisKK3BhY2thZ2VfYnVpbGRlcl9wcm9jZXNzX29wdGlvbnMgcWVtdS1hbmRyb2lkCisKK1FFTVVfQU5EUk9JRF9ERVBTX0lOU1RBTExfRElSPSRQUkVCVUlMVFNfRElSL3FlbXUtYW5kcm9pZC1kZXBzCisKK2lmIFsgLXogIiRPUFRfSU5TVEFMTF9ESVIiIF07IHRoZW4KKyAgICAjIFRoZSBkZWZhdWx0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIC0tbm8tYW5kcm9pZCBiaW5hcmllcyBpcworICAgICMgJ3FlbXUtdXBzdHJlYW0nIGluc3RlYWQgb2YgJ3FlbXUtYW5kcm9pZCcKKyAgICBJTlNUQUxMX0RJUj0ke0lOU1RBTExfRElSJSUtYW5kcm9pZH0tdXBzdHJlYW0KK2ZpCisKKyMjCisjIyBIYW5kbGUgdGFyZ2V0IHN5c3RlbSBsaXN0CisjIworaWYgWyAiJE9QVF9UQVJHRVQiIF07IHRoZW4KKyAgICBUQVJHRVRTPSQoY29tbWFzX3RvX3NwYWNlcyAiJE9QVF9UQVJHRVQiKQorZWxzZQorICAgIFRBUkdFVFM9JChjb21tYXNfdG9fc3BhY2VzICIkREVGQVVMVF9UQVJHRVRTIikKKyAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXRhcmdldD0nJFRBUkdFVFMnIgorZmkKKworQkFEX1RBUkdFVFM9Citmb3IgVEFSR0VUIGluICRUQVJHRVRTOyBkbworICAgIGlmICEgbGlzdF9jb250YWlucyAiJFZBTElEX1RBUkdFVFMiICIkVEFSR0VUIjsgdGhlbgorICAgICAgICBCQURfVEFSR0VUUz0iJEJBRF9UQVJHRVRTICRUQVJHRVQiCisgICAgZmkKK2RvbmUKK2lmIFsgIiRCQURfVEFSR0VUUyIgXTsgdGhlbgorICAgIHBhbmljICJJbnZhbGlkIHRhcmdldCBuYW1lKHMpOiBbJEJBRF9UQVJHRVRTXSwgdXNlIG9uZSBvZjogJFZBTElEX1RBUkdFVFMiCitmaQorCitleHBvcnQgUEtHX0NPTkZJRz0kKGZpbmRfcHJvZ3JhbSBwa2ctY29uZmlnKQoraWYgWyAiJFBLR19DT05GSUciIF07IHRoZW4KKyAgICBsb2cgIkZvdW5kIHBrZy1jb25maWcgYXQ6ICRQS0dfQ09ORklHIgorZWxzZQorICAgIGxvZyAicGtnLWNvbmZpZyBpcyBub3QgaW5zdGFsbGVkIG9uIHRoaXMgc3lzdGVtLiIKK2ZpCisKKyMgQ2hlY2sgdGhhdCB3ZSBoYXZlIHRoZSByaWdodCBwcmVidWlsdHMKK0VYVFJBX0ZMQUdTPQoraWYgWyAiJERBUldJTl9TU0giIF07IHRoZW4KKyAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICItLWRhcndpbi1zc2g9JERBUldJTl9TU0giCitmaQorJChwcm9ncmFtX2RpcmVjdG9yeSkvYnVpbGQtcWVtdS1hbmRyb2lkLWRlcHMuc2ggXAorICAgIC0tdmVyYm9zaXR5PSQoZ2V0X3ZlcmJvc2l0eSkgXAorICAgIC0tcHJlYnVpbHRzLWRpcj0kUFJFQlVJTFRTX0RJUiBcCisgICAgLS1hb3NwLWRpcj0kQU9TUF9ESVIgXAorICAgIC0taG9zdD0kKHNwYWNlc190b19jb21tYXMgIiRIT1NUX1NZU1RFTVMiKSBcCisgICAgJEVYVFJBX0ZMQUdTIFwKKyAgICAgICAgfHwgcGFuaWMgImNvdWxkIG5vdCBjaGVjayBvciByZWJ1aWxkIHFlbXUtYW5kcm9pZCBkZXBlbmRlbmNpZXMuIgorCisjIExvY2FsIGJ1aWxkIG9mIHFlbXUtYW5kcm9pZCBiaW5hcmllcy4KKyMgJDE6IGhvc3Qgb3MgbmFtZS4KKyMgJDI6IEFPU1Agc291cmNlIGRpcmVjdG9yeQorYnVpbGRfcWVtdV9hbmRyb2lkICgpIHsKKyAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QgJDEgIiQyIgorCisgICAgUUVNVV9UQVJHRVRTPQorICAgIFFFTVVfVEFSR0VUX0xJU1Q9CisgICAgUUVNVV9UQVJHRVRfQlVJTERTPQorICAgIGZvciBUQVJHRVQgaW4gJFRBUkdFVFM7IGRvCisgICAgICAgIGNhc2UgJFRBUkdFVCBpbgorICAgICAgICAgICAgYXJtNjQpCisgICAgICAgICAgICAgICAgUUVNVV9UQVJHRVQ9YWFyY2g2NAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICB4ODYpCisgICAgICAgICAgICAgICAgUUVNVV9UQVJHRVQ9aTM4NgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBtaXBzKQorICAgICAgICAgICAgICAgIFFFTVVfVEFSR0VUPW1pcHNlbAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBtaXBzNjQpCisgICAgICAgICAgICAgICAgUUVNVV9UQVJHRVQ9bWlwczY0ZWwKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICBRRU1VX1RBUkdFVD0kVEFSR0VUCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICB2YXJfYXBwZW5kIFFFTVVfVEFSR0VUUyAiJFFFTVVfVEFSR0VUIgorICAgICAgICB2YXJfYXBwZW5kIFFFTVVfVEFSR0VUX0xJU1QgIiR7UUVNVV9UQVJHRVR9LXNvZnRtbXUiCisgICAgICAgIHZhcl9hcHBlbmQgUUVNVV9UQVJHRVRfQlVJTERTICIkUUVNVV9UQVJHRVQtc29mdG1tdS9xZW11LXN5c3RlbS0kUUVNVV9UQVJHRVQkKGJ1aWxkZXJfaG9zdF9leGVfZXh0ZW5zaW9uKSIKKyAgICBkb25lCisKKyAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQnVpbGRpbmcgcWVtdS1hbmRyb2lkIgorICAgIGxvZyAiUWVtdSB0YXJnZXRzOiAkUUVNVV9UQVJHRVRTIgorCisgICAgQlVJTERfRElSPSRURU1QX0RJUi9idWlsZC0kMS9xZW11LWFuZHJvaWQKKyAgICAoCisgICAgICAgIFBSRUZJWD0kUUVNVV9BTkRST0lEX0RFUFNfSU5TVEFMTF9ESVIvJDEKKworICAgICAgICBCVUlMRF9GTEFHUz0KKyAgICAgICAgaWYgWyAiJChnZXRfdmVyYm9zaXR5KSIgLWd0IDMgXTsgdGhlbgorICAgICAgICAgICAgdmFyX2FwcGVuZCBCVUlMRF9GTEFHUyAiVj0xIgorICAgICAgICBmaQorCisgICAgICAgICMgR2VuZXJhdGUgTElOSy0qIGZpbGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGJ1aWxkIGZpbGVzCisgICAgICAgICMgZm9yIHRoZSBlbXVsYXRvciBidWlsZCBzeXN0ZW0uCisgICAgICAgIExJTktQUk9HX0ZMQUdTPSJMSU5LUFJPRz0kQlVJTERfRElSL2xpbmstcHJvZyIKKworICAgICAgICBydW4gbWtkaXIgLXAgIiRCVUlMRF9ESVIiCisgICAgICAgIHJ1biBybSAtcmYgIiRCVUlMRF9ESVIiLyoKKyAgICAgICAgcnVuIGNkICIkQlVJTERfRElSIgorICAgICAgICBFWFRSQV9MREZMQUdTPSItTCRQUkVGSVgvbGliIgorICAgICAgICBjYXNlICQxIGluCisgICAgICAgICAgIGRhcndpbi0qKQorICAgICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLVdsLC1mcmFtZXdvcmssQ2FyYm9uIgorICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9IiRFWFRSQV9MREZMQUdTIC1zdGF0aWMtbGliZ2NjIC1zdGF0aWMtbGlic3RkYysrIgorICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBjYXNlICQxIGluCisgICAgICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgRVhUUkFfTERGTEFHUz0iJEVYVFJBX0xERkxBR1MgLWxkbCAtbG0iCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgICAgICBDUk9TU19QUkVGSVhfRkxBRz0KKyAgICAgICAgaWYgWyAiJChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpIiBdOyB0aGVuCisgICAgICAgICAgICBDUk9TU19QUkVGSVhfRkxBRz0iLS1jcm9zcy1wcmVmaXg9JChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpIgorICAgICAgICBmaQorICAgICAgICBFWFRSQV9DRkxBR1M9Ii1JJFBSRUZJWC9pbmNsdWRlIgorICAgICAgICBjYXNlICQxIGluCisgICAgICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICAgICAgIyBOZWNlc3NhcnkgdG8gYnVpbGQgdmVyc2lvbi5yYyBwcm9wZXJseS4KKyAgICAgICAgICAgICAgICAjIFZTX1ZFUlNJT05fSU5GTyBpcyBhIHJlbGF0aXZlbHkgbmV3IGZlYXR1cmVzIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAjIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNyb3NzLXRvb2xjaGFpbidzIHdpbmRyZXMgdG9vbC4KKyAgICAgICAgICAgICAgICBFWFRSQV9DRkxBR1M9IiRFWFRSQV9DRkxBR1MgLURWU19WRVJTSU9OX0lORk89MSIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZGFyd2luLSopCisgICAgICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTIC1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjgiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIEFVRElPX0JBQ0tFTkRTX0ZMQUc9CisgICAgICAgIGNhc2UgJDEgaW4KKyAgICAgICAgICAgIGxpbnV4LSopCisgICAgICAgICAgICAgICAgIyBVc2UgUHVsc2VBdWRpbyBvbiBMaW51eCBiZWNhdXNlIHRoZSBkZWZhdWx0IGJhY2tlbmQsCisgICAgICAgICAgICAgICAgIyBPU1MsIGRvZXMgbm90IHdvcmsKKyAgICAgICAgICAgICAgICBBVURJT19CQUNLRU5EU19GTEFHPSItLWF1ZGlvLWRydi1saXN0PXNkbCIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgd2luZG93cy0qKQorICAgICAgICAgICAgICAgICMgUHJlZmVyIHdpbmF1ZGlvIG9uIFdpbmRvd3Mgb3ZlciBkc291bmQuCisgICAgICAgICAgICAgICAgQVVESU9fQkFDS0VORFNfRkxBRz0iLS1hdWRpby1kcnYtbGlzdD13aW5hdWRpbyxkc291bmQiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIFBLR19DT05GSUdfUEFUSD0kUFJFRklYL2xpYi9wa2djb25maWcKKyAgICAgICAgUEtHX0NPTkZJR19MSUJESVI9JFBSRUZJWC9saWIvcGtnY29uZmlnCisgICAgICAgIGNhc2UgJDEgaW4KKyAgICAgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgaG9zdCB2ZXJzaW9uLCBvciB0aGUgYnVpbGQgd2lsbCBmcmVlemUuCisgICAgICAgICAgICAgICAgUEtHX0NPTkZJRz1wa2ctY29uZmlnCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgUEtHX0NPTkZJRz0kUFJFRklYL2Jpbi9wa2ctY29uZmlnCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgICMgQ3JlYXRlIGEgcGtnLWNvbmZpZyB3cmFwcGVyIHRoYXQgcmVkZWZpbmVzIHRoZSB8cHJlZml4fAorICAgICAgICAjIHZhcmlhYmxlIHRvIHRoZSByaWdodCBsb2NhdGlvbiwgdGhlbiBmb3JjZSBpdHMgdXNhZ2UuCisgICAgICAgIGNhdCA+IHBrZy1jb25maWcgPDxFT0YKKyMhL2Jpbi9zaAorJFBLR19DT05GSUcgLS1kZWZpbmUtdmFyaWFibGU9cHJlZml4PSRQUkVGSVggIlwkQCIKK0VPRgorICAgICAgICBjaG1vZCBhK3ggcGtnLWNvbmZpZworICAgICAgICBQS0dfQ09ORklHPSQocHdkIC1QKS9wa2ctY29uZmlnCisKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUcgUEtHX0NPTkZJR19QQVRIIFBLR19DT05GSUdfTElCRElSCisKKyAgICAgICAgIyBFeHBvcnQgdGhlc2UgdG8gZW5zdXJlIHRoYXQgcGtnLWNvbmZpZyBwaWNrcyB0aGVtIHVwIHByb3Blcmx5LgorICAgICAgICBleHBvcnQgR0xJQl9DRkxBR1M9Ii1JJFBSRUZJWC9pbmNsdWRlL2dsaWItMi4wIC1JJFBSRUZJWC9saWIvZ2xpYi0yLjAvaW5jbHVkZSIKKyAgICAgICAgZXhwb3J0IEdMSUJfTElCUz0iJFBSRUZJWC9saWIvbGliZ2xpYi0yLjAubGEiCisgICAgICAgIGNhc2UgJEJVSUxEX09TIGluCisgICAgICAgICAgICBkYXJ3aW4pCisgICAgICAgICAgICAgICAgR0xJQl9MSUJTPSIkR0xJQl9MSUJTIC1XbCwtZnJhbWV3b3JrLENhcmJvbiAtV2wsLWZyYW1ld29yayxGb3VuZGF0aW9uIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICAjIENyZWF0ZSBhIGxpbmtpbmcgcHJvZ3JhbSB0aGF0IHdpbGwgY2FwdHVyZSBpdHMgY29tbWFuZC1saW5lIHRvIGEgZmlsZS4KKyAgICAgICAgY2F0ID4gbGluay1wcm9nIDw8RU9GCisjIS9iaW4vc2gKKworIyBFeHRyYWN0IHRhcmdldCBmaWxlLgorc2Vlbl9vPQordGFyZ2V0PQorZm9yIG9wdDsgZG8KKyAgICBpZiBbICJcJG9wdCIgPSAiLW8iIF07IHRoZW4KKyAgICAgIHNlZW5fbz10cnVlCisgICAgZWxpZiBbICJcJHNlZW5fbyIgXTsgdGhlbgorICAgICAgdGFyZ2V0PVwkb3B0CisgICAgICBzZWVuX289CisgICAgZmkKK2RvbmUKKworaWYgWyAiXCR0YXJnZXQiIF07IHRoZW4KKyAgcHJpbnRmICIlc1xuIiAiXCRAIiA+ICRCVUlMRF9ESVIvTElOSy1cJHRhcmdldAorZmkKKyQoYnVpbGRlcl9nbnVfY29uZmlnX2hvc3RfcHJlZml4KWcrKyAiXCRAIgorRU9GCisgICAgICAgIGNobW9kIGEreCBsaW5rLXByb2cKKworICAgICAgICBTRExfQ09ORklHPSRQUkVGSVgvYmluL3NkbDItY29uZmlnCisgICAgICAgIGV4cG9ydCBTRExfQ09ORklHCisKKyAgICAgICAgREVCVUdfRkxBR1M9CisgICAgICAgIGlmIFsgIiRPUFRfREVCVUciIF07IHRoZW4KKyAgICAgICAgICAgIERFQlVHX0ZMQUdTPSItLWVuYWJsZS1kZWJ1ZyIKKyAgICAgICAgZmkKKworICAgICAgICBydW4gJFFFTVVfU1JDRElSL2NvbmZpZ3VyZSBcCisgICAgICAgICAgICAkQ1JPU1NfUFJFRklYX0ZMQUcgXAorICAgICAgICAgICAgLS10YXJnZXQtbGlzdD0iJFFFTVVfVEFSR0VUX0xJU1QiIFwKKyAgICAgICAgICAgIC0tcHJlZml4PSRQUkVGSVggXAorICAgICAgICAgICAgLS1leHRyYS1jZmxhZ3M9IiRFWFRSQV9DRkxBR1MiIFwKKyAgICAgICAgICAgIC0tZXh0cmEtbGRmbGFncz0iJEVYVFJBX0xERkxBR1MiIFwKKyAgICAgICAgICAgICRERUJVR19GTEFHUyBcCisgICAgICAgICAgICAkQVVESU9fQkFDS0VORFNfRkxBRyBcCisgICAgICAgICAgICAtLWRpc2FibGUtYXR0ciBcCisgICAgICAgICAgICAtLWRpc2FibGUtYmxvYnMgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWNhcC1uZyBcCisgICAgICAgICAgICAtLWRpc2FibGUtY29jb2EgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWN1cmwgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWN1cnNlcyBcCisgICAgICAgICAgICAtLWRpc2FibGUtZG9jcyBcCisgICAgICAgICAgICAtLWRpc2FibGUtZ2x1c3RlcmZzIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1ndGsgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWd1ZXN0LWFnZW50IFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1saWJuZnMgXAorICAgICAgICAgICAgLS1kaXNhYmxlLWxpYmlzY3NpIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1saWJzc2gyIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS1saWJ1c2IgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNlY2NvbXAgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXNwaWNlIFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS11c2ItcmVkaXIgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXVzZXIgXAorICAgICAgICAgICAgLS1kaXNhYmxlLXZkZSBcCisgICAgICAgICAgICAtLWRpc2FibGUtdmhkeCBcCisgICAgICAgICAgICAtLWRpc2FibGUtdmhvc3QtbmV0IFwKKyAgICAgICAgICAgIC0tZGlzYWJsZS12bmMtc2FzbCBcCisgICAgICAgICAgICAtLWRpc2FibGUtd2Vycm9yIFwKKyAgICAgICAgICAgIC0tZW5hYmxlLXNkbCBcCisgICAgICAgICAgICAtLXdpdGgtc2RsYWJpPTIuMCBcCisgICAgICAgICAgICAmJgorCisgICAgICAgICAgICBjYXNlICQxIGluCisgICAgICAgICAgICAgICAgd2luZG93cy0qKQorICAgICAgICAgICAgICAgICAgICAjIENhbm5vdCBidWlsZCBvcHRpb25yb20gd2hlbiBjcm9zcy1jb21waWxpbmcgdG8gV2luZG93cywKKyAgICAgICAgICAgICAgICAgICAgIyBzbyBkaXNhYmxlIHRoYXQgYnkgcmVtb3ZpbmcgdGhlIFJPTVM9IGxpbmUgZnJvbQorICAgICAgICAgICAgICAgICAgICAjIHRoZSBnZW5lcmF0ZWQgY29uZmlnLWhvc3QubWFrIGZpbGUuCisgICAgICAgICAgICAgICAgICAgIHNlZCAtaSAtZSAnL15ST01TPS9kJyBjb25maWctaG9zdC5tYWsKKworICAgICAgICAgICAgICAgICAgICAjIEZvciBXaW5kb3dzLCBjb25maWctaG9zdC5oIG11c3QgYmUgY3JlYXRlZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAjIGJlZm9yZSB0aGUgcmVzdCwgb3IgdGhlIHBhcmFsbGVsIGJ1aWxkIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIyBmYWlsIG1pc2VyYWJseS4KKyAgICAgICAgICAgICAgICAgICAgcnVuIG1ha2UgY29uZmlnLWhvc3QuaCAkQlVJTERfRkxBR1MKKyAgICAgICAgICAgICAgICAgICAgcnVuIG1ha2UgdmVyc2lvbi5vIHZlcnNpb24ubG8gJEJVSUxEX0ZMQUdTCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAgICMgTm93IGJ1aWxkIGV2ZXJ5dGhpbmcgZWxzZSBpbiBwYXJhbGxlbC4KKyAgICAgICAgICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTICRCVUlMRF9GTEFHUyAkTElOS1BST0dfRkxBR1MKKworICAgICAgICAgICAgZm9yIFFFTVVfRVhFIGluICRRRU1VX1RBUkdFVF9CVUlMRFM7IGRvCisgICAgICAgICAgICAgICAgaWYgWyAhIC1mICIkUUVNVV9FWEUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcGFuaWMgIiQoYnVpbGRlcl90ZXh0KSBDb3VsZCBub3QgYnVpbGQgJFFFTVVfRVhFISEiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgaWYgWyAteiAiJE9QVF9OT19URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGlmICEgcnVuIG1ha2UgLWokTlVNX0pPQlMgJEJVSUxEX0ZMQUdTIGNoZWNrIEdURVNURVJfRkxBR1M9Ii1tIHF1aWNrIC1rIgorICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcGFuaWMgIiQoYnVpbGRlcl90ZXh0KSBGYWlsdXJlIHdoZW4gcnVubmluZyBxZW11MiB1bml0dGVzdHMhISIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKworICAgICkgfHwgcGFuaWMgIkJ1aWxkIGZhaWxlZCEhIgorCisgICAgQklOQVJZX0RJUj0kSU5TVEFMTF9ESVIvJDEKKyAgICBydW4gbWtkaXIgLXAgIiRCSU5BUllfRElSIiB8fAorICAgIHBhbmljICJDb3VsZCBub3QgY3JlYXRlIGZpbmFsIGRpcmVjdG9yeTogJEJJTkFSWV9ESVIiCisKKyAgICBydW4gY3AgLXAgXAorICAgICAgICAiJEJVSUxEX0RJUiIvY29uZmlnLWhvc3QuaCBcCisgICAgICAgICIkQklOQVJZX0RJUiIvY29uZmlnLWhvc3QuaAorCisgICAgZm9yIFFFTVVfVEFSR0VUIGluICRRRU1VX1RBUkdFVFM7IGRvCisgICAgICAgIFFFTVVfRVhFPXFlbXUtc3lzdGVtLSR7UUVNVV9UQVJHRVR9JChidWlsZGVyX2hvc3RfZXhlX2V4dGVuc2lvbikKKyAgICAgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIENvcHlpbmcgJFFFTVVfRVhFIHRvICRCSU5BUllfRElSLyIKKworICAgICAgICBydW4gY3AgLXAgXAorICAgICAgICAgICAgIiRCVUlMRF9ESVIiLyRRRU1VX1RBUkdFVC1zb2Z0bW11LyRRRU1VX0VYRSBcCisgICAgICAgICAgICAiJEJJTkFSWV9ESVIiLyRRRU1VX0VYRQorCisgICAgICAgIG1rZGlyIC1wICIkQklOQVJZX0RJUiIvJFFFTVVfVEFSR0VULXNvZnRtbXUKKworICAgICAgICBydW4gY3AgLXAgXAorICAgICAgICAgICAgIiRCVUlMRF9ESVIiLyRRRU1VX1RBUkdFVC1zb2Z0bW11L2NvbmZpZy10YXJnZXQuaCBcCisgICAgICAgICAgICAiJEJJTkFSWV9ESVIiLyRRRU1VX1RBUkdFVC1zb2Z0bW11L2NvbmZpZy10YXJnZXQuaAorCisgICAgICAgIGlmIFsgLXogIiRPUFRfREVCVUciIF07IHRoZW4KKyAgICAgICAgICAgIHJ1biAke0dOVV9DT05GSUdfSE9TVF9QUkVGSVh9c3RyaXAgIiRCSU5BUllfRElSIi8kUUVNVV9FWEUKKyAgICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIENvcHkgTElOSy0qIGZpbGVzLCBhZGp1c3RpbmcgaGFyZC1jb2RlZCBwYXRocyBpbiB0aGVtLgorICAgIGZvciBMSU5LX0ZJTEUgaW4gIiRCVUlMRF9ESVIiL0xJTkstcWVtdS1zeXN0ZW0tKjsgZG8KKyAgICAgICAgc2VkIFwKKyAgICAgICAgICAgIC1lICdzfCcke1BSRUJVSUxUU19ESVJ9J3xAUFJFQlVJTFRTX0RJUkB8ZycgXAorICAgICAgICAgICAgLWUgJ3N8JyR7UUVNVV9TUkNESVJ9J3xAU1JDX0RJUkB8ZycgXAorICAgICAgICAgICAgLWUgJ3N8JyR7QlVJTERfRElSfSd8fGcnIFwKKyAgICAgICAgICAgICIkTElOS19GSUxFIiA+ICRJTlNUQUxMX0RJUi8kMS8kKGJhc2VuYW1lICIkTElOS19GSUxFIikKKyAgICBkb25lCisKKyAgICB1bnNldCBQS0dfQ09ORklHIFBLR19DT05GSUdfUEFUSCBQS0dfQ09ORklHX0xJQkRJUiBTRExfQ09ORklHCisgICAgdW5zZXQgTElCRkZJX0NGTEFHUyBMSUJGRklfTElCUyBHTElCX0NGTEFHUyBHTElCX0xJQlMKKworICAgIHRpbWVzdGFtcF9zZXQgIiRJTlNUQUxMX0RJUi8kMSIgcWVtdS1hbmRyb2lkCit9CisKK2lmIFsgIiREQVJXSU5fU1NIIiAtYSAiJERBUldJTl9TWVNURU1TIiBdOyB0aGVuCisgICAgZHVtcCAiUmVtb3RlIGJ1aWxkIGZvcjogJERBUldJTl9TWVNURU1TIgorICAgIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIFwKKyAgICAgICAgICAgIC90bXAvJFVTRVItcmVidWlsZC1kYXJ3aW4tc3NoLSQkL3FlbXUtYW5kcm9pZC1idWlsZAorCisgICAgY29weV9kaXJlY3RvcnkgIiRRRU1VX1NSQ0RJUiIgIiREQVJXSU5fUEtHX0RJUi9xZW11LXNyYyIKKworICAgIHJ1biBta2RpciAtcCAiJERBUldJTl9QS0dfRElSL3ByZWJ1aWx0cyIKKyAgICBmb3IgU1lTVEVNIGluICREQVJXSU5fU1lTVEVNUzsgZG8KKyAgICAgICAgY29weV9kaXJlY3RvcnkgIiRRRU1VX0FORFJPSURfREVQU19JTlNUQUxMX0RJUi8kU1lTVEVNIiBcCisgICAgICAgICAgICAgICAgIiREQVJXSU5fUEtHX0RJUi9wcmVidWlsdHMvcWVtdS1hbmRyb2lkLWRlcHMvJFNZU1RFTSIKKyAgICBkb25lCisKKyAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyBcCisgICAgICAgIC0tdGFyZ2V0PSQoc3BhY2VzX3RvX2NvbW1hcyAiJFRBUkdFVFMiKSBcCisgICAgICAgIC0tc3JjLWRpcj0kREFSV0lOX1JFTU9URV9ESVIvcWVtdS1zcmMgXAorICAgICAgICAtLW5vLXRlc3RzIFwKKyAgICAgICAgLS1wcmVidWlsdHMtZGlyPSREQVJXSU5fUkVNT1RFX0RJUi9wcmVidWlsdHMgXAorICAgICAgICAtLWluc3RhbGwtZGlyPSREQVJXSU5fUkVNT1RFX0RJUi9wcmVidWlsdHMvcWVtdS1hbmRyb2lkIFwKKworICAgIGJ1aWxkZXJfcnVuX3JlbW90ZV9kYXJ3aW5fYnVpbGQKKworICAgIGZvciBTWVNURU0gaW4gJERBUldJTl9TWVNURU1TOyBkbworICAgICAgICBsb2NhbCBCSU5BUllfRElSPSIkSU5TVEFMTF9ESVIvJFNZU1RFTSIKKyAgICAgICAgZHVtcCAiWyRTWVNURU1dIFJldHJpZXZpbmcgcmVtb3RlIGRhcndpbiBiaW5hcmllcy4iCisgICAgICAgIHJ1biBta2RpciAtcCAiJEJJTkFSWV9ESVIiIHx8CisgICAgICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeTogJEJJTkFSWV9ESVIiCisKKyAgICAgICAgbG9jYWwgUkVNT1RFX1NSQ0RJUj0iJERBUldJTl9TU0g6JERBUldJTl9SRU1PVEVfRElSL3ByZWJ1aWx0cy9xZW11LWFuZHJvaWQvJFNZU1RFTSIKKyAgICAgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3NjcCAtciBcCisgICAgICAgICAgICAiJFJFTU9URV9TUkNESVIiL3FlbXUtc3lzdGVtLSogXAorICAgICAgICAgICAgIiRSRU1PVEVfU1JDRElSIi9MSU5LLXFlbXUtc3lzdGVtLSogXAorICAgICAgICAgICAgIiRSRU1PVEVfU1JDRElSIi9jb25maWctaG9zdC5oIFwKKyAgICAgICAgICAgICIkUkVNT1RFX1NSQ0RJUiIvKi9jb25maWctdGFyZ2V0LmggXAorICAgICAgICAgICAgJEJJTkFSWV9ESVIvCisKKyAgICAgICAgdGltZXN0YW1wX3NldCAiJEJJTkFSWV9ESVIiIHFlbXUtYW5kcm9pZAorICAgIGRvbmUKK2ZpCisKK2ZvciBTWVNURU0gaW4gJExPQ0FMX0hPU1RfU1lTVEVNUzsgZG8KKyAgICBidWlsZF9xZW11X2FuZHJvaWQgJFNZU1RFTSAiJEFPU1BfRElSIgorZG9uZQorCitsb2cgIkRvbmUgYnVpbGRpbmcgcWVtdS1hbmRyb2lkLiIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1xdC5zaCBiL2FuZHJvaWQvc2NyaXB0cy9idWlsZC1xdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NWU3MWZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL2J1aWxkLXF0LnNoCkBAIC0wLDAgKzEsMzg5IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuICQoZGlybmFtZSAiJDAiKS91dGlscy9jb21tb24uc2hpCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvaW5zdGFsbF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJCdWlsZCBwcmVidWlsdCBRdCBob3N0IGxpYnJhcmllcy4KKworVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBkb3dubG9hZCB0aGUgUXQgc291cmNlIHRhcmJhbGwgZnJvbSBzb3VyY2UsIHRoZW4KK2V4dHJhY3QgaXQgYW5kIGJ1aWxkIHRoZSBRdCBob3N0IHRvb2xzIGFuZCBsaWJyYXJpZXMuCisiCisKK2Fvc3BfZGlyX3JlZ2lzdGVyX29wdGlvbgorcHJlYnVpbHRzX2Rpcl9yZWdpc3Rlcl9vcHRpb24KK2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiBxdAorcGFja2FnZV9idWlsZGVyX3JlZ2lzdGVyX29wdGlvbnMKKworT1BUX0RPV05MT0FEPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1kb3dubG9hZCIgT1BUX0RPV05MT0FEICJEb3dubG9hZCBzb3VyY2UgdGFyYmFsbC4iCisKK29wdGlvbl9wYXJzZSAiJEAiCisKK2lmIFsgIiRQQVJBTUVURVJfQ09VTlQiICE9IDAgXTsgdGhlbgorICAgIHBhbmljICJUaGlzIHNjcmlwdCB0YWtlcyBubyBhcmd1bWVudHMuIFNlZSAtLWhlbHAgZm9yIGRldGFpbHMuIgorZmkKKworcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb24KK2Fvc3BfZGlyX3BhcnNlX29wdGlvbgoraW5zdGFsbF9kaXJfcGFyc2Vfb3B0aW9uCisKK3BhY2thZ2VfYnVpbGRlcl9wcm9jZXNzX29wdGlvbnMgcXQKK3BhY2thZ2VfYnVpbGRlcl9wYXJzZV9wYWNrYWdlX2xpc3QKKworIyMjCisjIyMgIERvd25sb2FkIHRoZSBzb3VyY2UgdGFyYmFsbCBpZiBuZWVkZWQuCisjIyMKK1FUX1NSQ19OQU1FPXF0LWV2ZXJ5d2hlcmUtb3BlbnNvdXJjZS1zcmMtNS41LjAKK1FUX1NSQ19QQUNLQUdFPSRRVF9TUkNfTkFNRS50YXIueHoKK1FUX1NSQ19VUkw9aHR0cDovL2Rvd25sb2FkLnF0LmlvL2FyY2hpdmUvcXQvNS41LzUuNS4wL3NpbmdsZS8kUVRfU1JDX1BBQ0tBR0UKK1FUX1NSQ19QQUNLQUdFX1NIQTE9NDQwOWVmMTJkMTAxN2E5YjVlNjczM2VhMjc1OTZhNmNhNjM3YTg4YworCitRVF9TUkNfUEFUQ0hfRk9MREVSPSR7UVRfU1JDX05BTUV9LXBhdGNoZXMKK1FUX0FSQ0hJVkVfRElSPSQoYnVpbGRlcl9hcmNoaXZlX2RpcikKKworaWYgWyAteiAiJE9QVF9ET1dOTE9BRCIgLWEgISAtZiAiJFFUX0FSQ0hJVkVfRElSLyRRVF9TUkNfUEFDS0FHRSIgXTsgdGhlbgorICAgIGlmIFsgLXogIiRPUFRfRE9XTkxPQUQiIF07IHRoZW4KKyAgICAgICAgZWNobyAiVGhlIGZvbGxvd2luZyB0YXJiYWxsIGlzIG1pc3Npbmc6ICRRVF9BUkNISVZFX0RJUi8kUVRfU1JDX1BBQ0tBR0UiCisgICAgICAgIGVjaG8gIlBsZWFzZSB1c2UgdGhlIC0tZG93bmxvYWQgb3B0aW9uIHRvIGRvd25sb2FkIGl0LiBOb3RlIHRoYXQgdGhpcyBpcyIKKyAgICAgICAgZWNobyAiYSBodWdlIGZpbGUgb3ZlciAzMDAgTUIsIHRoZSBkb3dubG9hZCB3aWxsIHRha2UgdGltZS4iCisgICAgICAgIGV4aXQgMQorICAgIGZpCitmaQorCisjIERvd25sb2FkIGEgZmlsZS4KKyMgJDE6IFNvdXJjZSBVUkwKKyMgJDI6IERlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyMgJDM6IFtPcHRpb25hbF0gZXhwZWN0ZWQgU0hBLTEgc3VtIG9mIGRvd25sb2FkZWQgZmlsZS4KK2Rvd25sb2FkX3BhY2thZ2UgKCkgeworICAgICMgQXNzdW1lIHRoZSBwYWNrYWdlcyBhcmUgYWxyZWFkeSBkb3dubG9hZGVkIHVuZGVyICRRVF9BUkNISVZFX0RJUgorICAgIGxvY2FsIERTVF9ESVIgUEtHX1VSTCBQS0dfTkFNRSBTSEExU1VNIFJFQUxfU0hBMVNVTQorCisgICAgUEtHX1VSTD0kMQorICAgIFBLR19OQU1FPSQoYmFzZW5hbWUgIiRQS0dfVVJMIikKKyAgICBEU1RfRElSPSQyCisgICAgU0hBMVNVTT0kMworCisgICAgbG9nICJEb3dubG9hZGluZyAkUEtHX05BTUUuLi4iCisgICAgKGNkICIkRFNUX0RJUiIgJiYgcnVuIGN1cmwgLUwgLW8gIiRQS0dfTkFNRSIgIiRQS0dfVVJMIikgfHwKKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBkb3dubG9hZCAnJFBLR19VUkwnIgorCisgICAgaWYgWyAiJFNIQTFTVU0iIF07IHRoZW4KKyAgICAgICAgbG9nICJDaGVja2luZyAkUEtHX05BTUUgY29udGVudCIKKyAgICAgICAgUkVBTF9TSEExU1VNPSQoY29tcHV0ZV9maWxlX3NoYTEgIiREU1RfRElSIi8kUEtHX05BTUUpCisgICAgICAgIGlmIFsgIiRSRUFMX1NIQTFTVU0iICE9ICIkU0hBMVNVTSIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIkVycm9yOiBJbnZhbGlkIFNIQS0xIHN1bSBmb3IgJFBLR19OQU1FOiAkUkVBTF9TSEExU1VNIChleHBlY3RlZCAkU0hBMVNVTSkiCisgICAgICAgIGZpCisgICAgZmkKK30KKworaWYgWyAiJE9QVF9ET1dOTE9BRCIgXTsgdGhlbgorICAgIGRvd25sb2FkX3BhY2thZ2UgIiRRVF9TUkNfVVJMIiAiJFFUX0FSQ0hJVkVfRElSIiAiJFFUX1NSQ19QQUNLQUdFX1NIQTEiCitmaQorCisjIEF0b21pY2FsbHkgdXBkYXRlIHRhcmdldCBkaXJlY3RvcnkgJDEgd2l0aCB0aGUgY29udGVudCBvZiAkMi4KKyMgVGhpcyBhbHNvIHJlbW92ZXMgJDIgb24gc3VjY2Vzcy4KKyMgJDE6IHRhcmdldCBkaXJlY3RvcnkuCisjICQyOiBzb3VyY2UgZGlyZWN0b3J5LgorZGlyZWN0b3J5X2F0b21pY191cGRhdGUgKCkgeworICAgIGxvY2FsIERTVF9ESVI9IiQxIgorICAgIGxvY2FsIFNSQ19ESVI9IiQyIgorICAgIGlmIFsgLWQgIiREU1RfRElSIiBdOyB0aGVuCisgICAgICAgIHJ1biBybSAtZiAiJERTVF9ESVIiLm9sZCAmJgorICAgICAgICBydW4gbXYgIiREU1RfRElSIiAiJERTVF9ESVIiLm9sZAorICAgIGZpCisgICAgcnVuIG12ICIkU1JDX0RJUiIgIiREU1RfRElSIiAmJgorICAgIHJ1biBybSAtcmYgIiREU1RfRElSIi5vbGQKK30KKworIyAkMTogUGFja2FnZSBuYW1lIChlLmcuICdxdC1iYXNlJykKKyMgJDI6IExpc3Qgb2YgZXh0cmEgbW9kdWxlcyB0byBidWlsZCAoZS5nLiAncXRzdmcnKQorIyAkMys6IEV4dHJhIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KK2J1aWxkX3F0X3BhY2thZ2UgKCkgeworICAgIGxvY2FsIFBLR19OQU1FIFBLR19TUkNfRElSIFBLR19CVUlMRF9ESVIgUEtHX1NSQ19USU1FU1RBTVAgUEtHX1RJTUVTVEFNUAorICAgIGxvY2FsIFBLR19NT0RVTEVTCisgICAgUEtHX05BTUU9JChwYWNrYWdlX2xpc3RfZ2V0X3NyY19kaXIgJDEpCisgICAgUEtHX01PRFVMRVM9JDIKKyAgICBzaGlmdDsgc2hpZnQKKyAgICBQS0dfU1JDX0RJUj0kKGJ1aWxkZXJfc3JjX2RpcikvJFBLR19OQU1FCisgICAgUEtHX0JVSUxEX0RJUj0kKGJ1aWxkZXJfYnVpbGRfZGlyKS8kUEtHX05BTUUKKyAgICAoCisgICAgICAgIHJ1biBta2RpciAtcCAiJFBLR19CVUlMRF9ESVIiICYmCisgICAgICAgIHJ1biBjZCAiJFBLR19CVUlMRF9ESVIiICYmCisgICAgICAgIGV4cG9ydCBMREZMQUdTPSItTCRfU0hVX0JVSUxERVJfUFJFRklYL2xpYiIgJiYKKyAgICAgICAgZXhwb3J0IENQUEZMQUdTPSItSSRfU0hVX0JVSUxERVJfUFJFRklYL2luY2x1ZGUiICYmCisgICAgICAgIGV4cG9ydCBQS0dfQ09ORklHX0xJQkRJUj0iJF9TSFVfQlVJTERFUl9QUkVGSVgvbGliL3BrZ2NvbmZpZyIgJiYKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfUEFUSD0iJFBLR19DT05GSUdfTElCRElSOiRfU0hVX0JVSUxERVJfUEtHX0NPTkZJR19QQVRIIiAmJgorICAgICAgICBydW4gIiRQS0dfU1JDX0RJUiIvY29uZmlndXJlIFwKKyAgICAgICAgICAgIC1wcmVmaXggJF9TSFVfQlVJTERFUl9QUkVGSVggXAorICAgICAgICAgICAgIiRAIiAmJgorICAgICAgICBydW4gbWFrZSAtaiROVU1fSk9CUyBWPTEgJiYKKyAgICAgICAgcnVuIG1ha2UgaW5zdGFsbCAtaiROVU1fSk9CUyBWPTEKKyAgICApIHx8CisgICAgcGFuaWMgIkNvdWxkIG5vdCBidWlsZCBhbmQgaW5zdGFsbCAkMSIKK30KKworYnVpbGRfZGlzYWJsZV9jeHgxMQorCitpZiBbICIkREFSV0lOX1NTSCIgLWEgIiREQVJXSU5fU1lTVEVNUyIgXTsgdGhlbgorICAgICMgUGVyZm9ybSByZW1vdGUgRGFyd2luIGJ1aWxkIGZpcnN0LgorICAgIGR1bXAgIlJlbW90ZSBRdCBidWlsZCBmb3I6ICREQVJXSU5fU1lTVEVNUyIKKyAgICBidWlsZGVyX3ByZXBhcmVfcmVtb3RlX2Rhcndpbl9idWlsZCBcCisgICAgICAgICAgICAiL3RtcC8kVVNFUi1yZWJ1aWxkLWRhcndpbi1zc2gtJCQvcXQtYnVpbGQiCisKKyAgICBidWlsZGVyX3J1bl9yZW1vdGVfZGFyd2luX2J1aWxkCisKKyAgICBydW4gbWtkaXIgLXAgIiRJTlNUQUxMX0RJUiIgfHwKKyAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgY3JlYXRlIGZpbmFsIGRpcmVjdG9yeTogJElOU1RBTExfRElSIgorCisgICAgaWYgWyAtZCAiJElOU1RBTExfRElSIi9jb21tb24vaW5jbHVkZSBdOyB0aGVuCisgICAgICAgIHJ1biBybSAtcmYgIiRJTlNUQUxMX0RJUiIvY29tbW9uL2luY2x1ZGUub2xkCisgICAgICAgIHJ1biBtdiAiJElOU1RBTExfRElSIi9jb21tb24vaW5jbHVkZSAiJElOU1RBTExfRElSIi9jb21tb24vaW5jbHVkZS5vbGQKKyAgICBmaQorCisgICAgZm9yIFNZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIGJ1aWxkZXJfcmVtb3RlX2Rhcndpbl9yZXRyaWV2ZV9pbnN0YWxsX2RpciAkU1lTVEVNICRJTlNUQUxMX0RJUiAmJgorICAgICAgICBydW4gbWtkaXIgLXAgJElOU1RBTExfRElSL2NvbW1vbiAmJgorICAgICAgICBidWlsZGVyX3JlbW90ZV9kYXJ3aW5fcnN5bmMgLWhheiAtLWRlbGV0ZSBcCisgICAgICAgICAgICAgICAgJERBUldJTl9TU0g6JERBUldJTl9SRU1PVEVfRElSL2luc3RhbGwtcHJlZml4L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAkSU5TVEFMTF9ESVIvY29tbW9uLworICAgIGRvbmUKKworICAgIHJ1biBybSAtcmYgIiRJTlNUQUxMX0RJUi9jb21tb24vaW5jbHVkZS5vbGQiCitmaQorCitmb3IgU1lTVEVNIGluICRMT0NBTF9IT1NUX1NZU1RFTVM7IGRvCisgICAgKAorICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgIHdpbmRvd3MqKQorICAgICAgICAgICAgICAgIGJ1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCAiJFNZU1RFTSIgIiRBT1NQX0RJUiIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3Rfbm9fYmlucHJlZml4ICIkU1lTVEVNIiAiJEFPU1BfRElSIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICAjIFVucGFja2luZyB0aGUgc291cmNlcyBpZiBuZWVkZWQuCisgICAgICAgIFFUX1NSQ19USU1FU1RBTVA9JFRFTVBfRElSL3RpbWVzdGFtcC0kUVRfU1JDX05BTUUKKyAgICAgICAgaWYgWyAiJE9QVF9GT1JDRSIgXTsgdGhlbgorICAgICAgICAgICAgcm0gLWYgIiRRVF9TUkNfVElNRVNUQU1QIgorICAgICAgICBmaQorICAgICAgICBpZiBbICEgLWYgIiRRVF9TUkNfVElNRVNUQU1QIiBdOyB0aGVuCisgICAgICAgICAgICBkdW1wICJVbnBhY2tpbmcgJFFUX1NSQ19OQU1FIHNvdXJjZXMuIgorICAgICAgICAgICAgcnVuIG1rZGlyIC1wICIkKGJ1aWxkZXJfc3JjX2RpcikiICYmCisgICAgICAgICAgICB1bnBhY2tfYXJjaGl2ZSAiJFFUX0FSQ0hJVkVfRElSLyRRVF9TUkNfUEFDS0FHRSIgIiQoYnVpbGRlcl9zcmNfZGlyKSIgfHwKKyAgICAgICAgICAgICAgICBwYW5pYyAiRmFpbGVkIHRvIHVucGFjayBzb3VyY2UgcGFja2FnZTogJFFUX1NSQ19QQUNLQUdFIgorCisgICAgICAgICAgICBQQVRDSEVTX0ZPTERFUj0kUVRfQVJDSElWRV9ESVIvJFFUX1NSQ19QQVRDSF9GT0xERVIKKyAgICAgICAgICAgIGNwIC1SICIkUEFUQ0hFU19GT0xERVIiICIkKGJ1aWxkZXJfc3JjX2RpcikiIHx8CisgICAgICAgICAgICAgICAgcGFuaWMgIkZhaWxlZCB0byBjb3B5IFF0IHBhdGNoZXM6ICRQQVRDSEVTX0ZPTERFUiIKKworICAgICAgICAgICAgUEFUQ0hFU19ESVI9JChidWlsZGVyX3NyY19kaXIpLyR7UVRfU1JDX05BTUV9LXBhdGNoZXMKKyAgICAgICAgICAgIGlmIFsgISAtZCAiJFBBVENIRVNfRElSIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgcGFuaWMgIkZhaWxlZCB0byBmaW5kIHBhdGNoZXMgZGlyZWN0b3J5OiAkUEFUQ0hFU19ESVIiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZm9yIFBBVENIIGluICQobHMgIiRQQVRDSEVTX0RJUiIvKi5wYXRjaCAyPi9kZXYvbnVsbCk7IGRvCisgICAgICAgICAgICAgICAgZHVtcCAiQXBwbHlpbmcgcGF0Y2g6ICQoYmFzZW5hbWUgJFBBVENIKSIKKyAgICAgICAgICAgICAgICAoY2QgIiQoYnVpbGRlcl9zcmNfZGlyKSIvJFFUX1NSQ19OQU1FICYmIHBhdGNoIC1wMSkgPCAiJFBBVENIIiB8fAorICAgICAgICAgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IGFwcGx5IHBhdGNoOiAkUEFUQ0giCisgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICMgTmVlZCB0byBwYXRjaCB0aGlzIGZpbGUgdG8gYXZvaWQgaW5zdGFsbCBzeW5jcXQucGwgd2hpY2ggd2lsbAorICAgICAgICAgICAgIyBmYWlsIGhvcnJpYmx5IHdpdGggYW4gZXJyb3IgbGlrZToKKyAgICAgICAgICAgICMgIC4uLi4vPGJpbnByZWZpeD4tc3RyaXA6Li4uL2Jpbi9zeW5jcXQucGw6IEZpbGUgZm9ybWF0IG5vdCByZWNvZ25pemVkCisgICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBNYWtlZmlsZSB0cmllcyB0byBzdHJpcCBhIFBlcmwgc2NyaXB0LgorICAgICAgICAgICAgcnVuIHNlZCAtaSAnc3xeSU5TVEFMTFMgKz0gc3luY3F0fCNJTlNUQUxMUyArPSBzeW5jcXR8ZycgJChidWlsZGVyX3NyY19kaXIpLyRRVF9TUkNfTkFNRS9xdGJhc2UvcXRiYXNlLnBybworICAgICAgICAgICAgdG91Y2ggIiRRVF9TUkNfVElNRVNUQU1QIgorICAgICAgICBmaQorCisgICAgICAgICMgQ29uZmlndXJpbmcgdGhlIGJ1aWxkLiBUaGlzIHRha2VzIGEgbG90IG9mIHRpbWUgZHVlIHRvIFFNYWtlLgorICAgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgQ29uZmlndXJpbmcgUXQgYnVpbGQiCisKKyAgICAgICAgRVhUUkFfQ09ORklHVVJFX0ZMQUdTPQorICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0NPTkZJR1VSRV9GTEFHUyBcCisgICAgICAgICAgICAgICAgLW9wZW5zb3VyY2UgXAorICAgICAgICAgICAgICAgIC1jb25maXJtLWxpY2Vuc2UgXAorICAgICAgICAgICAgICAgIC1mb3JjZS1kZWJ1Zy1pbmZvIFwKKyAgICAgICAgICAgICAgICAtcmVsZWFzZSBcCisgICAgICAgICAgICAgICAgLW5vLWMrKzExIFwKKyAgICAgICAgICAgICAgICAtbm8tcnBhdGggXAorICAgICAgICAgICAgICAgIC1uby1ndGtzdHlsZSBcCisgICAgICAgICAgICAgICAgLXNoYXJlZCBcCisgICAgICAgICAgICAgICAgLW5vbWFrZSBleGFtcGxlcyBcCisgICAgICAgICAgICAgICAgLW5vbWFrZSB0ZXN0cyBcCisKKyAgICAgICAgaWYgWyAiJChnZXRfdmVyYm9zaXR5KSIgLWd0IDIgXTsgdGhlbgorICAgICAgICAgICAgdmFyX2FwcGVuZCBFWFRSQV9DT05GSUdVUkVfRkxBR1MgIi12IgorICAgICAgICBmaQorCisgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgbGludXgteDg2KQorICAgICAgICAgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfQ09ORklHVVJFX0ZMQUdTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1xdC14Y2IgXAorICAgICAgICAgICAgICAgICAgICAgICAgLXBsYXRmb3JtIGxpbnV4LWcrKy0zMgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBsaW51eC14ODZfNjQpCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBFWFRSQV9DT05GSUdVUkVfRkxBR1MgXAorICAgICAgICAgICAgICAgICAgICAgICAgLXF0LXhjYiBcCisgICAgICAgICAgICAgICAgICAgICAgICAtcGxhdGZvcm0gbGludXgtZysrLTY0CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIHdpbmRvd3MqKQorICAgICAgICAgICAgICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICAgICAgICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgICAgICAgICAgICAgIEJJTlBSRUZJWD1pNjg2LXc2NC1taW5ndzMyLQorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93cy14ODZfNjQpCisgICAgICAgICAgICAgICAgICAgICAgICBCSU5QUkVGSVg9eDg2XzY0LXc2NC1taW5ndzMyLQorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljICJVbnN1cHBvcnRlZCBzeXN0ZW06ICRTWVNURU0iCisgICAgICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0NPTkZJR1VSRV9GTEFHUyBcCisgICAgICAgICAgICAgICAgICAgIC14cGxhdGZvcm0gd2luMzItZysrIFwKKyAgICAgICAgICAgICAgICAgICAgLWRldmljZS1vcHRpb24gQ1JPU1NfQ09NUElMRT0kQklOUFJFRklYIFwKKyAgICAgICAgICAgICAgICAgICAgLW5vLXdhcm5pbmdzLWFyZS1lcnJvcnMKKyAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIExERkxBR1MgIi1YbGlua2VyIC0tYnVpbGQtaWQiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGRhcndpbiopCisgICAgICAgICAgICAgICAgIyAnLXNkayBtYWNvc3gnIHdpdGhvdXQgdGhlIHZlcnNpb24gZm9yY2VzIHRoZSB1c2Ugb2YgdGhlIGxhdGVzdAorICAgICAgICAgICAgICAgICMgb25lIGluc3RhbGxlZCBvbiB0aGUgYnVpbGQgbWFjaGluZS4gVG8gbWFrZSBzdXJlIG9uZSBrbm93cworICAgICAgICAgICAgICAgICMgdGhlIHZlcmlvbiB1c2VkLCBsZXQncyBkdW1wIGFsbCBzZGtzCisgICAgICAgICAgICAgICAgZWNobyAiVGhlIGxpc3Qgb2YgdGhlIGluc3RhbGxlZCBPUyBYIFNES3M6IgorICAgICAgICAgICAgICAgIHhjb2RlYnVpbGQgLXNob3dzZGtzIHwgZ3JlcCBtYWNvc3gKKyAgICAgICAgICAgICAgICBlY2hvICIodXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGZvciB0aGUgUXQgYnVpbGQpIgorCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBFWFRSQV9DT05GSUdVUkVfRkxBR1MgXAorICAgICAgICAgICAgICAgICAgICAtbm8tZnJhbWV3b3JrIFwKKyAgICAgICAgICAgICAgICAgICAgLXNkayBtYWNvc3gKKyAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIENGTEFHUyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC44CisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBDWFhGTEFHUyAtbW1hY29zeC12ZXJzaW9uLW1pbj0xMC44CisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBMREZMQUdTIC1tbWFjb3N4LXZlcnNpb24tbWluPTEwLjgKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgUVRfQlVJTERfRElSPSQoYnVpbGRlcl9idWlsZF9kaXIpCisKKyAgICAgICAgdmFyX2FwcGVuZCBMREZMQUdTICItTCRfU0hVX0JVSUxERVJfUFJFRklYL2xpYiIKKyAgICAgICAgdmFyX2FwcGVuZCBDUFBGTEFHUyAiLUkkX1NIVV9CVUlMREVSX1BSRUZJWC9pbmNsdWRlIgorCisgICAgICAgICgKKyAgICAgICAgICAgIHJ1biBta2RpciAtcCAiJFFUX0JVSUxEX0RJUiIgJiYKKyAgICAgICAgICAgIHJ1biBjZCAiJFFUX0JVSUxEX0RJUiIgJiYKKyAgICAgICAgICAgIGV4cG9ydCBDRkxBR1MgJiYKKyAgICAgICAgICAgIGV4cG9ydCBDWFhGTEFHUyAmJgorICAgICAgICAgICAgZXhwb3J0IExERkxBR1MgJiYKKyAgICAgICAgICAgIGV4cG9ydCBDUFBGTEFHUyAmJgorICAgICAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfTElCRElSPSIkX1NIVV9CVUlMREVSX1BSRUZJWC9saWIvcGtnY29uZmlnIiAmJgorICAgICAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfUEFUSD0iJFBLR19DT05GSUdfTElCRElSOiRfU0hVX0JVSUxERVJfUEtHX0NPTkZJR19QQVRIIiAmJgorICAgICAgICAgICAgcnVuICIkKGJ1aWxkZXJfc3JjX2RpcikiLyRRVF9TUkNfTkFNRS9jb25maWd1cmUgXAorICAgICAgICAgICAgICAgIC1wcmVmaXggJF9TSFVfQlVJTERFUl9QUkVGSVggXAorICAgICAgICAgICAgICAgICRFWFRSQV9DT05GSUdVUkVfRkxBR1MKKyAgICAgICAgKSB8fCBwYW5pYyAiQ291bGQgbm90IGNvbmZpZ3VyZSBRdCBidWlsZCEiCisKKyAgICAgICAgIyBCdWlsZCBldmVyeXRoaW5nIG5vdy4KKyAgICAgICAgUVRfTU9EVUxFUz0icXRiYXNlIHF0c3ZnIgorICAgICAgICBRVF9UQVJHRVRfQlVJTERfTU9EVUxFUz0KKyAgICAgICAgUVRfVEFSR0VUX0lOU1RBTExfTU9EVUxFUz0KKyAgICAgICAgZm9yIFFUX01PRFVMRSBpbiAkUVRfTU9EVUxFUzsgZG8KKyAgICAgICAgICAgIHZhcl9hcHBlbmQgUVRfVEFSR0VUX0JVSUxEX01PRFVMRVMgIm1vZHVsZS0kUVRfTU9EVUxFIgorICAgICAgICAgICAgdmFyX2FwcGVuZCBRVF9UQVJHRVRfSU5TVEFMTF9NT0RVTEVTICJtb2R1bGUtJFFUX01PRFVMRS1pbnN0YWxsX3N1YnRhcmdldHMiCisgICAgICAgIGRvbmUKKworICAgICAgICBRVF9NQUtFX0ZMQUdTPSItaiROVU1fSk9CUyIKKyAgICAgICAgaWYgWyAiJChnZXRfdmVyYm9zaXR5KSIgLWd0IDIgXTsgdGhlbgorICAgICAgICAgICAgdmFyX2FwcGVuZCBRVF9NQUtFX0ZMQUdTICJWPTEiCisgICAgICAgIGZpCisKKyAgICAgICAgZHVtcCAiJChidWlsZGVyX3RleHQpIEJ1aWxkaW5nIFF0IGJpbmFyaWVzIgorICAgICAgICAoCisgICAgICAgICAgICBydW4gY2QgIiRRVF9CVUlMRF9ESVIiICYmCisgICAgICAgICAgICBydW4gbWFrZSAkUVRfTUFLRV9GTEFHUyAkUVRfVEFSR0VUX0JVSUxEX01PRFVMRVMKKyAgICAgICAgKSB8fCBwYW5pYyAiQ291bGQgbm90IGJ1aWxkIFF0IGJpbmFyaWVzISIKKworICAgICAgICBkdW1wICIkKGJ1aWxkZXJfdGV4dCkgSW5zdGFsbGluZyBRdCBiaW5hcmllcyIKKyAgICAgICAgKAorICAgICAgICAgICAgcnVuIGNkICIkUVRfQlVJTERfRElSIiAmJgorICAgICAgICAgICAgcnVuIG1ha2UgJFFUX01BS0VfRkxBR1MgJFFUX1RBUkdFVF9JTlNUQUxMX01PRFVMRVMKKyAgICAgICAgKSB8fCBwYW5pYyAiQ291bGQgbm90IGluc3RhbGwgUXQgYmluYXJpZXMhIgorCisgICAgICAgICMgRmluZCBhbGwgUXQgc3RhdGljIGxpYnJhcmllcy4KKyAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgICAgIFFUX0RMTF9GSUxURVI9IiouZHlsaWIiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIHdpbmRvd3MqKQorICAgICAgICAgICAgICAgIFFUX0RMTF9GSUxURVI9IiouZGxsIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIFFUX0RMTF9GSUxURVI9Iiouc28qIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgUVRfU0hBUkVEX0xJQlM9JChjZCAiJChidWlsZGVyX2luc3RhbGxfcHJlZml4KSIgJiYgXAorICAgICAgICAgICAgICAgIGZpbmQgLiAtbmFtZSAiJFFUX0RMTF9GSUxURVIiIDI+L2Rldi9udWxsKQorICAgICAgICBpZiBbIC16ICIkUVRfU0hBUkVEX0xJQlMiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgZmluZCBhbnkgUXQgc2hhcmVkIGxpYnJhcnkhISIKKyAgICAgICAgZmkKKworICAgICAgICAjIENvcHkgYmluYXJpZXMgbmVjZXNzYXJ5IGZvciB0aGUgYnVpbGQgaXRzZWxmIGFzIHdlbGwgYXMgc3RhdGljCisgICAgICAgICMgbGlicmFyaWVzLgorICAgICAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSLyRTWVNURU0iIFwKKyAgICAgICAgICAgICAgICBiaW4vbW9jIFwKKyAgICAgICAgICAgICAgICBiaW4vcmNjIFwKKyAgICAgICAgICAgICAgICBiaW4vdWljIFwKKyAgICAgICAgICAgICAgICAkUVRfU0hBUkVEX0xJQlMKKworICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgIHdpbmRvd3MqKQorICAgICAgICAgICAgICAgICMgbGlicXRtYWluLmEgaXMgbmVlZGVkIG9uIFdpbmRvd3MgdG8gaW1wbGVtZW50IFdpbk1haW4gZXQgYWwuCisgICAgICAgICAgICAgICAgY29weV9kaXJlY3RvcnlfZmlsZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIkSU5TVEFMTF9ESVIvJFNZU1RFTSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGliL2xpYnF0bWFpbi5hCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGJ1aWxkX2RlYnVnX2luZm8gXAorICAgICAgICAgICAgICAgICIkKGJ1aWxkZXJfaW5zdGFsbF9wcmVmaXgpIiBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUi8kU1lTVEVNIiBcCisgICAgICAgICAgICAgICAgJFFUX1NIQVJFRF9MSUJTCisKKyAgICAgICAgIyBDb3B5IGhlYWRlcnMgaW50byBjb21tb24gZGlyZWN0b3J5IGFuZCBhZGQgc3ltbGluaworICAgICAgICBjb3B5X2RpcmVjdG9yeSBcCisgICAgICAgICAgICAgICAgIiQoYnVpbGRlcl9pbnN0YWxsX3ByZWZpeCkiL2luY2x1ZGUgXAorICAgICAgICAgICAgICAgICIkSU5TVEFMTF9ESVIiL2NvbW1vbi9pbmNsdWRlLm5ldworCisgICAgICAgIGRpcmVjdG9yeV9hdG9taWNfdXBkYXRlIFwKKyAgICAgICAgICAgICAgICAiJElOU1RBTExfRElSIi9jb21tb24vaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgIiRJTlNUQUxMX0RJUiIvY29tbW9uL2luY2x1ZGUubmV3CisKKyAgICAgICAgKGNkICIkSU5TVEFMTF9ESVIvJFNZU1RFTSIgJiYgcm0gLWYgaW5jbHVkZSAmJiBsbiAtc2YgLi4vY29tbW9uL2luY2x1ZGUgaW5jbHVkZSkKKworICAgICkgfHwgcGFuaWMgIlskU1lTVEVNXSBDb3VsZCBub3QgYnVpbGQgUXQhIgorCitkb25lCisKK2xvZyAiRG9uZSBidWlsZGluZyBRdC4iCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvZG93bmxvYWQtc291cmNlcy5zaCBiL2FuZHJvaWQvc2NyaXB0cy9kb3dubG9hZC1zb3VyY2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFjMDQ5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvZG93bmxvYWQtc291cmNlcy5zaApAQCAtMCwwICsxLDM3NCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLiAkKGRpcm5hbWUgIiQwIikvdXRpbHMvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKKworIyMjCisjIyMgIFV0aWxpdGllcworIyMjCisKKyMgQ3JlYXRlIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIGVuc3VyZSBpdCBpcyBkZXN0cm95ZWQgb24gc2NyaXB0IGV4aXQuCitfY2xlYW51cF90ZW1wX2RpciAoKSB7CisgICAgcm0gLXJmICIkVEVNUF9ESVIiCisgICAgZXhpdCAkMQorfQorCitfVEVNUF9ESVI9CisKKyMgUmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgdGhpcyBzY3JpcHQuIFRoaXMgY3JlYXRlcyB0aGUgZGlyZWN0b3J5CisjIGxhemlseSBhbmQgZW5zdXJlcyBpdCBpcyBhbHdheXMgZGVzdHJveWVkIG9uIHNjcmlwdCBleGl0LgorIyBPdXQ6IHRlbXBvcmFyeSBkaXJlY3RvcnkgcGF0aC4KK3RlbXBfZGlyICgpIHsKKyAgICBpZiBbIC16ICIkX1RFTVBfRElSIiBdOyB0aGVuCisgICAgICAgIF9URU1QX0RJUj0vdG1wLyRVU0VSLWRvd25sb2FkLXNvdXJjZXMtdGVtcC0kJAorICAgICAgICBzaWxlbnRfcnVuIG1rZGlyIC1wICIkX1RFTVBfRElSIiB8fCBwYW5pYyAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5OiAkX1RFTVBfRElSIgorICAgICAgICAjIEVuc3VyZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIGRlbGV0ZWQgb24gc2NyaXB0IGV4aXQKKyAgICAgICAgdHJhcCAiX2NsZWFudXBfdGVtcF9kaXIgMCIgRVhJVAorICAgICAgICB0cmFwICJfY2xlYW51cF90ZW1wX2RpciBcJD8iIFFVSVQgSU5UIEhVUAorICAgIGZpCisgICAgcHJpbnRmICVzICIkX1RFTVBfRElSIgorfQorCisjIERvd25sb2FkIGEgZmlsZS4KKyMgJDE6IFNvdXJjZSBVUkwKKyMgJDI6IERlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyMgJDM6IFtPcHRpb25hbF0gZXhwZWN0ZWQgU0hBLTEgc3VtIG9mIGRvd25sb2FkZWQgZmlsZS4KK2Rvd25sb2FkX3BhY2thZ2UgKCkgeworICAgICMgQXNzdW1lIHRoZSBwYWNrYWdlcyBhcmUgYWxyZWFkeSBkb3dubG9hZGVkIHVuZGVyICRBUkNISVZFX0RJUgorICAgIGxvY2FsIERTVF9ESVIgUEtHX1VSTCBQS0dfTkFNRSBTSEExU1VNIFJFQUxfU0hBMVNVTQorCisgICAgUEtHX1VSTD0kMQorICAgIFBLR19OQU1FPSQoYmFzZW5hbWUgIiRQS0dfVVJMIikKKyAgICBEU1RfRElSPSQyCisgICAgU0hBMVNVTT0kMworCisgICAgbG9nICJEb3dubG9hZGluZyAkUEtHX05BTUUuLi4iCisgICAgKGNkICIkRFNUX0RJUiIgJiYgcnVuIGN1cmwgLUwgLW8gIiRQS0dfTkFNRSIgIiRQS0dfVVJMIikgfHwKKyAgICAgICAgICAgIHBhbmljICJDYW4ndCBkb3dubG9hZCAnJFBLR19VUkwnIgorCisgICAgaWYgWyAiJFNIQTFTVU0iIF07IHRoZW4KKyAgICAgICAgbG9nICJDaGVja2luZyAkUEtHX05BTUUgY29udGVudCIKKyAgICAgICAgUkVBTF9TSEExU1VNPSQoY29tcHV0ZV9maWxlX3NoYTEgIiREU1RfRElSIi8kUEtHX05BTUUpCisgICAgICAgIGlmIFsgIiRSRUFMX1NIQTFTVU0iICE9ICIkU0hBMVNVTSIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIkVycm9yOiBJbnZhbGlkIFNIQS0xIHN1bSBmb3IgJFBLR19OQU1FOiAkUkVBTF9TSEExU1VNIChleHBlY3RlZCAkU0hBMVNVTSkiCisgICAgICAgIGZpCisgICAgZmkKK30KKworIyBVbmNvbXByZXNzIGEgdGFyYmFsbCBvciB6aXAgZmlsZS4KKyMgJDE6IFNvdXJjZSBwYWNrYWdlIHBhdGguCisjICQyOiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkuCit1bnBhY2tfcGFja2FnZSAoKSB7CisgICAgbG9jYWwgUEtHIFBLR19OQU1FIFBLR19CQVNFTkFNRSBEU1RfRElSCisgICAgUEtHPSQxCisgICAgRFNUX0RJUj0kMgorICAgIFBLR19OQU1FPSQoYmFzZW5hbWUgIiRQS0ciKQorICAgIGNhc2UgJFBLR19OQU1FIGluCisgICAgICAgICouemlwKQorICAgICAgICAgICAgUEtHX0JBU0VOQU1FPSR7UEtHX05BTUUlLnppcH0KKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmd6KQorICAgICAgICAgICAgUEtHX0JBU0VOQU1FPSR7UEtHX05BTUUlLnRhci5nen0KKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmJ6MikKKyAgICAgICAgICAgIFBLR19CQVNFTkFNRT0ke1BLR19OQU1FJS50YXIuYnoyfQorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIueHopCisgICAgICAgICAgICBQS0dfQkFTRU5BTUU9JHtQS0dfTkFNRSUudGFyLnh6fQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJVbnN1cHBvcnRlZCBwYWNrYWdlIHR5cGU6ICRQS0dfTkFNRSIKKyAgICBlc2FjCisKKyAgICBsb2cgIlVuY29tcHJlc3NpbmcgJFBLR19OQU1FIGludG8gJERTVF9ESVIiCisgICAgY2FzZSAkUEtHX05BTUUgaW4KKyAgICAgICAgKi50YXIuZ3p8Ki50YXIuYnoyfCoudGFyLnh6KQorICAgICAgICAgICAgcnVuIHRhciB4ZiAiJFBLRyIgLUMgIiREU1RfRElSIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi56aXApCisgICAgICAgICAgICBydW4gdW56aXAgLXEgLXUgIiRQS0ciIC1kICIkRFNUX0RJUiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiVW5rbm93biBhcmNoaXZlIHR5cGU6ICRQS0dfTkFNRSIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworfQorCisjIENsb25lIGEgZ2l0IHJlcG9zaXRvcnkgd2l0aCBhIG1heGltdW0gZGVwdGggb2YgMSwgYW5kIGNoZWNrb3V0IGEKKyMgc3BlY2lmaWMgYnJhbmNoLgorIyAkMTogU291cmNlIGdpdCBVUkwuCisjICQyOiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisjICQzOiBbT3B0aW9uYWxdIEJyYW5jaC9jb21taXQgdG8gY2hlY2tvdXQuCitnaXRfY2xvbmVfZGVwdGgxICgpIHsKKyAgICBsb2NhbCBHSVRfVVJMIERTVF9ESVIgQlJBTkNICisgICAgR0lUX1VSTD0kMQorICAgIERTVF9ESVI9JDIKKyAgICBCUkFOQ0g9JHszOi1tYXN0ZXJ9CisKKyAgICBpZiBbIC1kICIkRFNUX0RJUiIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiR2l0IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czogJERTVF9ESVIiCisgICAgZmkKKyAgICBydW4gZ2l0IGNsb25lIC0tZGVwdGggMSAtLWJyYW5jaCAiJEJSQU5DSCIgIiRHSVRfVVJMIiAiJERTVF9ESVIiIHx8CisgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IGNsb25lIGdpdCByZXBvc2l0b3J5OiAkR0lUX1VSTCIKK30KKworIyBDbG9uZSBhIGdpdCByZXBvc2l0b3J5LCBhbmQgY2hlY2tvdXQgYSBzcGVjaWZpYyBicmFuY2ggJiBjb21taXQuCisjICQxOiBTb3VyY2UgZ2l0IFVSTC4KKyMgJDI6IERlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyMgJDM6IEJyYW5jaCAvIENvbW1pdAorZ2l0X2Nsb25lICgpIHsKKyAgICBsb2NhbCBHSVRfVVJMIERTVF9ESVIgQlJBTkNIIENIRUNLX1JFVgorICAgIEdJVF9VUkw9JDEKKyAgICBEU1RfRElSPSQyCisgICAgQlJBTkNIPSQzCisKKyAgICBpZiBbIC1kICIkRFNUX0RJUiIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiR2l0IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0czogJERTVF9ESVIiCisgICAgZmkKKyAgICBydW4gZ2l0IGNsb25lICIkR0lUX1VSTCIgIiREU1RfRElSIiB8fAorICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjbG9uZSBnaXQgcmVwb3NpdG9yeTogJEdJVF9VUkwiCisgICAgcnVuIGdpdCAtQyAiJERTVF9ESVIiIGNoZWNrb3V0ICRCUkFOQ0ggfHwKKyAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgY2hlY2tvdXQgJEdJVF9VUkwgLSAkQlJBTkNIIgorfQorCisjIENoZWNrIGlmIGdpdCBicmFuY2ggZXhpc3RzIGluIHJlbW90ZSByZXBvc2l0b3J5CisjICQxOiBTb3VyY2UgZ2l0IFVSTC4KKyMgJDI6IEJyYW5jaCBOYW1lCitnaXRfcmVtb3RlX2JyYW5jaF9leGlzdHMgKCkgeworICAgIGdpdCBscy1yZW1vdGUgLS1leGl0LWNvZGUgIiQxIiAiJDIiID4gL2Rldi9udWxsCit9CisKKyMgQ2hlY2sgb3V0IGEgU1ZOIHJlcG9zaXRvcnkKKyMgJDE6IFNvdXJjZSBTVk4gVVJMCisjICQyOiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkKKyMgJDM6IFJldmlzaW9uIG51bWJlcgorc3ZuX2NoZWNrb3V0ICgpIHsKKyAgICBsb2NhbCBTVk5fVVJMIERTVF9ESVIgRFNUX1NVQkRJUiBWRVJTSU9OCisgICAgU1ZOX1VSTD0kMQorICAgIERTVF9ESVI9JChkaXJuYW1lICIkMiIpCisgICAgRFNUX1NVQkRJUj0kKGJhc2VuYW1lICIkMiIpCisgICAgVkVSU0lPTj0kMworCisgICAgKAorICAgICAgICBydW4gbWtkaXIgLXAgIiREU1RfRElSIiAmJgorICAgICAgICBydW4gY2QgIiREU1RfRElSIiAmJgorICAgICAgICBydW4gc3ZuIGNoZWNrb3V0IC1yICIkVkVSU0lPTiIgJChkaXJuYW1lICIkU1ZOX1VSTCIpICREU1RfU1VCRElSCisgICAgKSB8fCBwYW5pYyAiQ291bGQgbm90IGNoZWNrb3V0IFNWTiByZXBvc2l0b3J5OiAkU1ZOX1VSTCIKK30KKworIyAkMTogRGVzdGluYXRpb24gYXJjaGl2ZSBmaWxlLgorIyAkMjogU291cmNlIGRpcmVjdG9yeS4KK2NyZWF0ZV9zb3J0ZWRfdGFyX2FyY2hpdmUgKCkgeworICAgIGxvY2FsIEZJTEVTIFRBUkZMQUdTIFNSQ19ESVIgU1VCRElSIERTVF9GSUxFCisgICAgRFNUX0ZJTEU9JDEKKyAgICBTUkNfRElSPSQoZGlybmFtZSAiJDIiKQorICAgIFNVQkRJUj0kKGJhc2VuYW1lICIkMiIpCisgICAgIyBUbyBlbnN1cmUgdGhhdCB0aGUgdGFyYmFsbCBoYXMgcmVwcm9kdWNpYmxlIHJlc3VsdHMsIHdlIG5lZWQgdG86CisgICAgIyAtIEZvcmNlIHRoZSBtdGltZSBvZiBhbGwgZmlsZXMuCisgICAgIyAtIEZvcmNlIHRoZSB1c2VyL2dyb3VwIG5hbWVzCisgICAgIyAtIEVuc3VyZSBjb25zaXN0ZW50IG9yZGVyIGZvciBmaWxlcyBpbiB0aGUgYXJjaGl2ZS4KKyAgICAjIC0gUmVtb3ZlIGZpbGVzIHdpdGggc3BhY2VzIGluIHRoZWlyIG5hbWVzLCB0aGV5IGFyZSBwcm9ibGVtYXRpYyBhbmQgbm90CisgICAgIyAgIG5lZWRlZCBmb3Igb3VyIHVzZSBjYXNlLgorICAgIEZJTEVTPSQoY2QgIiRTUkNfRElSIiAmJiBmaW5kICIkU1VCRElSIiAtdHlwZSBmIHwgZ3JlcCAtdiAtZSAiICIgfCBzb3J0IHwgXAorICAgICAgICAgICAgdHIgJ1xuJyAnICcpCisgICAgVEFSRkxBR1M9CisgICAgY2FzZSAkKGdldF9idWlsZF9vcykgaW4KKyAgICAgICAgbGludXgpCisgICAgICAgICAgICB2YXJfYXBwZW5kIFRBUkZMQUdTICItLW93bmVyPWFuZHJvaWQgLS1ncm91cD1hbmRyb2lkIgorICAgICAgICAgICAgdmFyX2FwcGVuZCBUQVJGTEFHUyAiLS1tdGltZT0yMDE1LTAxLTAxIgorICAgIGVzYWMKKyAgICBydW4gdGFyIGNKZiAiJERTVF9GSUxFIiAkVEFSRkxBR1MgLUMgIiRTUkNfRElSIiAkRklMRVMgfHwKKyAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgY3JlYXRlIGFyY2hpdmUiCit9CisKKyMjIworIyMjICBDb21tYW5kLWxpbmUgcGFyc2luZworIyMjCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIlRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSB0YXJiYWxscyBvZiBBbmRyb2lkIGVtdWxhdG9yCitsaWJyYXJ5IGRlcGVuZGVuY2llcyAoZS5nLiBsaWJmZmksIGxpYnosIGdsaWIsIGV0Yy4uKSBhbmQgcGxhY2UgdGhlbSB1bmRlcgorPHByZWJ1aWx0cz4vYXJjaGl2ZSwgd2hlcmUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgPHByZWJ1aWx0cz4gaXM6CisKKyAgICAkREVGQVVMVF9QUkVCVUlMVFNfRElSCisKK1VzZSB0aGUgLS1wcmVidWlsdHMtZGlyPTxwYXRoPiBvcHRpb24gdG8gY2hhbmdlIGl0IHRvIGEgbmV3IHZhbHVlLCBvcgorYWx0ZXJuYXRpdmVseSwgZGVmaW5lIHRoZSBBTkRST0lEX0VNVUxBVE9SX1BSRUJVSUxUU19ESVIgZW52aXJvbm1lbnQKK3ZhcmlhYmxlLgorCitJdCByZWxpZXMgb24gYSBmaWxlIGxpc3RpbmcgYWxsIHBhY2thZ2VzIC8gZ2l0IHJlcG9zaXRvcmllcywgd2hpY2ggaXMgYnkKK2RlZmF1bHQ6CisKKyAgICA8cHJlYnVpbHRzPi9hcmNoaXZlL1BBQ0tBR0VTLlRYVAorCitZb3UgY2FuIHByb3ZpZGUgYW5vdGhlciBmaWxlIHdpdGggdGhlIC0tbGlzdD08ZmlsZT4gb3B0aW9uLgorCitJZiBvbmUgb2YgdGhlIGxpc3RlZCBmaWxlIGlzIG5vdCBpbiA8cHJlYnVpbHRzPi9hcmNoaXZlIGl0IHdpbGwgYmUgZG93bmxvYWRlZAorYXV0b21hdGljYWxseS4gSWYgdGhlIGZpbGUgaXMgcHJlc2VudCwgdGhlIHNjcmlwdCBjaGVja3MgaXRzIFNIQS0xIHRvIGF2b2lkCityZS1kb3dubG9hZGluZyBpdC4gWW91IGNhbiBob3dldmVyIHVzZSAtLWZvcmNlIHRvIGFsd2F5cyBkb3dubG9hZC4iCisKK1BST0dSQU1fUEFSQU1FVEVSUz0iIgorCitPUFRfRk9SQ0U9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWZvcmNlIiBPUFRfRk9SQ0UgIkFsd2F5cyBkb3dubG9hZCBmaWxlcy4iCisKK1BBQ0tBR0VfTElTVD0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tbGlzdD08ZmlsZT4iIFBBQ0tBR0VfTElTVCAiU3BlY2lmeSBwYWNrYWdlIGxpc3QgZmlsZSIKKworcHJlYnVpbHRzX2Rpcl9yZWdpc3Rlcl9vcHRpb24KKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJFBBUkFNRVRFUl9DT1VOVCIgIT0gIjAiIF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBzY3JpcHQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cy4gU2VlIC0taGVscC4iCitmaQorCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbgorCitpZiBbIC16ICIkUEFDS0FHRV9MSVNUIiBdOyB0aGVuCisgICAgUEFDS0FHRV9MSVNUPSRQUkVCVUlMVFNfRElSL2FyY2hpdmUvUEFDS0FHRVMuVFhUCisgICAgaWYgWyAhIC1mICIkUEFDS0FHRV9MSVNUIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIHBhY2thZ2UgbGlzdCBmaWxlLCB1c2UgLS1saXN0PTxmaWxlPjogJFBBQ0tBR0VfTElTVCIKKyAgICBmaQorZmkKKworUEFDS0FHRV9ESVI9JChkaXJuYW1lICIkUEFDS0FHRV9MSVNUIikKKworIyMjCisjIyMgIERvIHRoZSB3b3JrLgorIyMjCisKKyMgQ3JlYXRlIGFyY2hpdmUgZGlyZWN0b3J5LgorQVJDSElWRV9ESVI9JFBSRUJVSUxUU19ESVIvYXJjaGl2ZQorcnVuIG1rZGlyIC1wICIkQVJDSElWRV9ESVIiIHx8CisgICAgICAgIHBhbmljICJDb3VsZCBub3QgY3JlYXRlIGFyY2hpdmUgZGlyZWN0b3J5OiAkQVJDSElWRV9ESVIiCisKKyMgR2V0IGVhY2ggZGVwZW5kZW5jeSBpbmRpdmlkdWFsbHkuCisjIFRoaXMgaXMgYSBjYWxsYmFjayBmb3IgcGFja2FnZV9saXN0X3BhcnNlLCB3aGljaCBleHBlY3RzIHRoZSBkZWZpbml0aW9uCisjIG9mIGEgZmV3IGxvY2FsIHZhcmlhYmxlcyAoc2VlIHBhY2thZ2VfbGlzdF9wYXJzZXIuc2hpIGRvY3VtZW50YXRpb24pLgorZ2V0X3BhY2thZ2UgKCkgeworICAgIGxvY2FsIFBLR19GSUxFCisKKyAgICBpZiBbICIkUEtHX1VSTCIgXTsgdGhlbgorICAgICAgICBQS0dfTkFNRT0kKGJhc2VuYW1lICIkUEtHX1VSTCIpCisgICAgICAgIFBLR19GSUxFPSRBUkNISVZFX0RJUi8kUEtHX05BTUUKKyAgICBlbHNlCisgICAgICAgIHBhbmljICJNaXNzaW5nIFVSTD08dXJsPiBmaWVsZCBvbiBsaW5lICRMSU5FX05VTUJFUjogJFBBQ0tBR0VfTElTVCIKKyAgICBmaQorfQorCitwYWNrYWdlX2xpc3RfcGFyc2VfZmlsZSAiJFBBQ0tBR0VfTElTVCIKK2ZvciBQQUNLQUdFIGluICQocGFja2FnZV9saXN0X2dldF9wYWNrYWdlcyk7IGRvCisgICAgUEtHX1VSTD0kKHBhY2thZ2VfbGlzdF9nZXRfdXJsICRQQUNLQUdFKQorICAgIFBLR19HSVQ9JChwYWNrYWdlX2xpc3RfZ2V0X2dpdF91cmwgJFBBQ0tBR0UpCisgICAgUEtHX1NWTj0kKHBhY2thZ2VfbGlzdF9nZXRfc3ZuX3VybCAkUEFDS0FHRSkKKworICAgICMgQ2hlY2sgZXhpc3RpbmcgZmlsZSBhcmNoaXZlLCBpZiBhbnkuCisgICAgUEtHX0ZJTEU9JEFSQ0hJVkVfRElSLyQocGFja2FnZV9saXN0X2dldF9maWxlbmFtZSAkUEFDS0FHRSkKKyAgICBQS0dfU0hBMT0kKHBhY2thZ2VfbGlzdF9nZXRfc2hhMSAkUEFDS0FHRSkKKyAgICBpZiBbIC1mICIkUEtHX0ZJTEUiIC1hICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgICAgIHJ1biBybSAtZiAiJFBLR19GSUxFIgorICAgIGZpCisgICAgaWYgWyAtZiAiJFBLR19GSUxFIiAtYSAtbiAiJFBLR19TSEExIiBdOyB0aGVuCisgICAgICAgIGR1bXAgIkNoZWNraW5nIGV4aXN0aW5nIGZpbGU6ICRQS0dfRklMRSIKKyAgICAgICAgaWYgWyAiJFBLR19HSVQiIC1vICIkUEtHX1NWTiIgXTsgdGhlbgorICAgICAgICAgICAgIyBJTVBPUlRBTlQ6IEdpdCB0YXJiYWxscyBhcmUgbm90IGJ1aWx0IGluIGEgcmVwcm9kdWNpYmxlIHdheSBvbgorICAgICAgICAgICAgIyBEYXJ3aW4sIHNvIGNoZWNrIHRoZSBTSEEtMSBvZiBmaWxlcyB3aXRoaW4gdGhlIGFyY2hpdmUsCisgICAgICAgICAgICAjIGluc3RlYWQgb2YgdGhlIGFyY2hpdmUgZmlsZSBpbnN0ZWFkLgorICAgICAgICAgICAgQVJDSElWRV9TSEExPSQoY29tcHV0ZV9hcmNoaXZlX3NoYTEgIiRQS0dfRklMRSIpCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFSQ0hJVkVfU0hBMT0kKGNvbXB1dGVfZmlsZV9zaGExICIkUEtHX0ZJTEUiKQorICAgICAgICBmaQorICAgICAgICBpZiBbICIkQVJDSElWRV9TSEExIiAhPSAiJFBLR19TSEExIiBdOyB0aGVuCisgICAgICAgICAgICBkdW1wICJXQVJOSU5HOiBSZS1kb3dubG9hZGluZyBleGlzdGluZyBmaWxlIGR1ZSB0byBiYWQgU0hBLTEgKCRBUkNISVZFX1NIQTEsIGV4cGVjdGVkICRQS0dfU0hBMSk6ICRQS0dfRklMRSIKKyAgICAgICAgICAgIHJ1biBybSAtZiAiJFBLR19GSUxFIgorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIFJlLWRvd25sb2FkIGFyY2hpdmUgb3IgZ2l0IHJlcG9zaXRvcnkgaWYgbmVlZGVkLgorICAgIGlmIFsgISAtZiAiJFBLR19GSUxFIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRQS0dfVVJMIiBdOyB0aGVuCisgICAgICAgICAgICBkdW1wICJEb3dubG9hZGluZyAkUEtHX1VSTCIKKyAgICAgICAgICAgIGRvd25sb2FkX3BhY2thZ2UgIiRQS0dfVVJMIiAiJEFSQ0hJVkVfRElSIiAiJFBLR19TSEExIgorICAgICAgICBlbGlmIFsgIiRQS0dfR0lUIiBdOyB0aGVuCisgICAgICAgICAgICBQS0dfRklMRT0kKHBhY2thZ2VfbGlzdF9nZXRfZnVsbF9uYW1lICRQQUNLQUdFKQorICAgICAgICAgICAgUEtHX0JSQU5DSD0kKHBhY2thZ2VfbGlzdF9nZXRfdmVyc2lvbiAkUEFDS0FHRSkKKyAgICAgICAgICAgIGR1bXAgIkNsb25pbmcgJFBLR19HSVQgLSAkUEtHX0JSQU5DSCIKKyAgICAgICAgICAgIFRFTVBfRElSPSQodGVtcF9kaXIpCisgICAgICAgICAgICBpZiBbIC1kICIkVEVNUF9ESVIvJFBLR19GSUxFIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgcnVuIHJtIC1yZiAiJFRFTVBfRElSLyRQS0dfRklMRSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBpZiBnaXRfcmVtb3RlX2JyYW5jaF9leGlzdHMgIiRQS0dfR0lUIiAiJFBLR19CUkFOQ0giIDsgdGhlbgorICAgICAgICAgICAgICAgIGdpdF9jbG9uZV9kZXB0aDEgIiRQS0dfR0lUIiAiJFRFTVBfRElSLyRQS0dfRklMRSIgIiRQS0dfQlJBTkNIIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdpdF9jbG9uZSAiJFBLR19HSVQiICIkVEVNUF9ESVIvJFBLR19GSUxFIiAiJFBLR19CUkFOQ0giCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgcnVuIHJtIC1yZiAiJFRFTVBfRElSLyRQS0dfRklMRSIvLmdpdCoKKyAgICAgICAgICAgIGNyZWF0ZV9zb3J0ZWRfdGFyX2FyY2hpdmUgIiRBUkNISVZFX0RJUiIvJFBLR19GSUxFLnRhci54eiBcCisgICAgICAgICAgICAgICAgICAgICIkVEVNUF9ESVIvJFBLR19GSUxFIgorICAgICAgICAgICAgUEtHX0ZJTEU9JEFSQ0hJVkVfRElSLyRQS0dfRklMRS50YXIueHoKKyAgICAgICAgZWxpZiBbICIkUEtHX1NWTiIgXTsgdGhlbgorICAgICAgICAgICAgUEtHX0ZJTEU9JChwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lICRQQUNLQUdFKQorICAgICAgICAgICAgUEtHX1ZFUlNJT049JChwYWNrYWdlX2xpc3RfZ2V0X3ZlcnNpb24gJFBBQ0tBR0UpCisgICAgICAgICAgICBQS0dfU1JDX0RJUj0kKHBhY2thZ2VfbGlzdF9nZXRfc3JjX2RpciAkUEFDS0FHRSkKKyAgICAgICAgICAgIFBLR19TVUJESVI9JHtQS0dfU1JDX0RJUn0KKyAgICAgICAgICAgIGR1bXAgIkNoZWNraW5nIG91dCAkUEtHX1NWTkAkUEtHX1ZFUlNJT04iCisgICAgICAgICAgICBURU1QX0RJUj0kKHRlbXBfZGlyKQorICAgICAgICAgICAgaWYgWyAtZCAiJFRFTVBfRElSLyRQS0dfU1VCRElSIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgcnVuIHJtIC1yZiAiJFRFTVBfRElSLyRQS0dfU1VCRElSIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIHN2bl9jaGVja291dCAiJFBLR19TVk4iICIkVEVNUF9ESVIvJFBLR19TVUJESVIiICIkUEtHX1ZFUlNJT04iCisgICAgICAgICAgICBmaW5kICIkVEVNUF9ESVIvJFBLR19TVUJESVIiIC1uYW1lICIuc3ZuKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorICAgICAgICAgICAgY3JlYXRlX3NvcnRlZF90YXJfYXJjaGl2ZSAiJEFSQ0hJVkVfRElSIi8kUEtHX0ZJTEUgXAorICAgICAgICAgICAgICAgICAgICAiJFRFTVBfRElSIi8kUEtHX1NVQkRJUgorICAgICAgICAgICAgUEtHX0ZJTEU9JEFSQ0hJVkVfRElSLyRQS0dfRklMRQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwYW5pYyAiTWlzc2luZyBHSVQ9PHVybD4gb3IgVVJMPTx1cmw+IGZvciBwYWNrYWdlICRQQUNLQUdFIgorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIFRpbWUgdG8gY2hlY2sgdGhlIG5ldyBhcmNoaXZlIFNIQS0xCisgICAgaWYgWyAiJFBLR19TSEExIiBdOyB0aGVuCisgICAgICAgIGlmIFsgLW4gIiRQS0dfR0lUIiAtbyAtbiAiJFBLR19TVk4iIF07IHRoZW4KKyAgICAgICAgICAgIEFSQ0hJVkVfU0hBMT0kKGNvbXB1dGVfYXJjaGl2ZV9zaGExICIkUEtHX0ZJTEUiKQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBUkNISVZFX1NIQTE9JChjb21wdXRlX2ZpbGVfc2hhMSAiJFBLR19GSUxFIikKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAiJEFSQ0hJVkVfU0hBMSIgIT0gIiRQS0dfU0hBMSIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIlNIQS0xIG1pc21hdGNoIGZvciAkUEtHX0ZJTEU6ICRBUkNISVZFX1NIQTEgZXhwZWN0ZWQgJFBLR19TSEExIgorICAgICAgICBmaQorICAgIGZpCisKKyAgICAjIENoZWNrIHBhdGNoZXMgZmlsZSBpZiBhbnkuCisgICAgUEtHX1BBVENIRVM9JChwYWNrYWdlX2xpc3RfZ2V0X3BhdGNoZXMgJFBBQ0tBR0UpCisgICAgaWYgWyAiJFBLR19QQVRDSEVTIiBdOyB0aGVuCisgICAgICAgIFBLR19QQVRDSEVTX0ZJTEU9JEFSQ0hJVkVfRElSLyRQS0dfUEFUQ0hFUworICAgICAgICBkdW1wICJDaGVja2luZyBwYXRjaCBmaWxlICAgOiAkUEtHX1BBVENIRVNfRklMRSIKKyAgICAgICAgaWYgWyAhIC1mICIkUEtHX1BBVENIRVNfRklMRSIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIk1pc3NpbmcgcGF0Y2hlcyBmaWxlIGZyb20gbGluZSAkQ09VTlQ6ICRQS0dfUEFUQ0hFU19GSUxFIgorICAgICAgICBmaQorICAgIGZpCitkb25lCisKK2lmIFsgIiRQQUNLQUdFX0RJUiIgIT0gIiRBUkNISVZFX0RJUiIgXTsgdGhlbgorICAgIHJ1biBjcCAtZiAiJFBBQ0tBR0VfTElTVCIgIiRBUkNISVZFX0RJUiIvUEFDS0FHRVMuVFhUCitmaQorCitkdW1wICJEb25lLiIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9nZW4tYW5kcm9pZC1zZGstdG9vbGNoYWluLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2dlbi1hbmRyb2lkLXNkay10b29sY2hhaW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWQzNmVjZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9nZW4tYW5kcm9pZC1zZGstdG9vbGNoYWluLnNoCkBAIC0wLDAgKzEsNDY4IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisuICQoZGlybmFtZSAiJDAiKS91dGlscy9jb21tb24uc2hpCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorCitQUk9HUkFNX1BBUkFNRVRFUlM9IjxpbnN0YWxsLWRpcj4iCisKK1BST0dSQU1fREVTQ1JJUFRJT049XAorIkdlbmVyYXRlIGEgc3BlY2lhbCB0b29sY2hhaW4gd3JhcHBlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGJpbmFyaWVzIHRvIGJlCitpbmNsdWRlZCB3aXRoIHRoZSBBbmRyb2lkIFNESy4gVGhlc2UgYmluYXJpZXMgYXJlIGd1YXJhbnRlZWQgdG8gcnVuIG9uIHN5c3RlbXMKK29sZGVyIHRoYW4gdGhlIGJ1aWxkIG1hY2hpbmUuCisKK1RoaXMgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlIHByZWJ1aWx0IHRvb2xjaGFpbnMgZm91bmQgdW5kZXI6CisKKyAgXCRBT1NQL3ByZWJ1aWx0cy9nY2MvPHN5c3RlbT4vaG9zdC8KKworV2hlcmUgXCRBT1NQIGlzIHRoZSBwYXRoIHRvIGFuIEFPU1AgY2hlY2tvdXQsIGFuZCA8c3lzdGVtPiBjb3JyZXNwb25kcyB0byB0aGUKK2hvc3Qgc3lzdGVtIHRoaXMgc2NyaXB0IHJ1bnMgb24gKGkuZS4gbGludXgteDg2IG9yIGRhcndpbi14ODYpLgorCitJZiB5b3UgaGF2ZSB0aGUgJ2NjYWNoZScgcHJvZ3JhbSBpbnN0YWxsZWQsIHRoZSB3cmFwcGVyIHdpbGwgdXNlIGl0CithdXRvbWF0aWNhbGx5IHVubGVzcyB5b3UgdXNlIHRoZSAtLW5vLWNjYWNoZSBvcHRpb24uCisKK1RoZSBzY3JpcHQgd2lsbCBwdXQgdW5kZXIgPGluc3RhbGwtZGlyPi8gdmFyaW91cyB0b29scywgZS5nLgorJ3g4Nl82NC1saW51eC1jKysnIGZvciB0aGUgNjQtYml0IExpbnV4IGNvbXBpbGVyLgorCitZb3UgY2FuIHVzZSB0aGUgLS1wcmludD08dG9vbD4gb3B0aW9uIHRvIHByaW50IHRoZSBjb3JyZXNwb25kaW5nIG5hbWUKK29yIHBhdGgsICppbnN0ZWFkKiBvZiBjcmVhdGluZyBhIHRvb2xjaGFpbi4gVmFsaWQgdmFsdWVzIGZvciA8dG9vbD4gYXJlOgorCisgICBiaW5wcmVmaXggICAgICAgLT4gUHJpbnQgdGhlIGJpbnByZWZpeCAoZS5nLiAneDg2XzY0LWxpbnV4LScpCisgICBjYyAgICAgICAgICAgICAgLT4gUHJpbnQgdGhlIGNvbXBpbGVyIG5hbWUgKGUuZy4gJ3g4Nl82NF9saW51eC1jYycpCisgICBjKysgICAgICAgICAgICAgLT4gUHJpbnQgdGhlIGMrKyBjb21waWxlciBuYW1lLgorICAgbGQsIGFyLCBhcywgLi4uIC0+IFNhbWUgZm9yIG90aGVyIHRvb2xzLgorICAgc3lzcm9vdCAgICAgICAgIC0+IFByaW50IHRoZSBwYXRoIHRvIGRpcmVjdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgdG9vbGNoYWluLiIKKworYW9zcF9kaXJfcmVnaXN0ZXJfb3B0aW9uCisKK09QVF9IT1NUPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1ob3N0PTxzeXN0ZW0+IiBPUFRfSE9TVCAiSG9zdCBzeXN0ZW0gdG8gc3VwcG9ydC4iCisKK09QVF9CSU5QUkVGSVg9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWJpbnByZWZpeD08cHJlZml4PiIgT1BUX0JJTlBSRUZJWCAiU3BlY2lmeSB0b29sY2hhaW4gYmlucHJlZml4IFthdXRvZGV0ZWN0ZWRdIgorCitPUFRfUFJFRklYPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wcmVmaXg9PHByZWZpeD4iIE9QVF9QUkVGSVggIlNwZWNpZnkgZXh0cmEgaW5jbHVkZS9saWIgcHJlZml4LiIKKworT1BUX1BSSU5UPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wcmludD08dG9vbD4iIE9QVF9QUklOVCAiUHJpbnQgdGhlIGV4YWN0IG5hbWUgb2YgYSBzcGVjaWZpYyB0b29sLiIKKworT1BUX0NDQUNIRT0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tY2NhY2hlPTxwcm9ncmFtPiIgT1BUX0NDQUNIRSAiVXNlIHNwZWNpZmljIGNjYWNoZSBwcm9ncmFtLiIKKworT1BUX05PX0NDQUNIRT0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tbm8tY2NhY2hlIiBPUFRfTk9fQ0NBQ0hFICJEb24ndCB0cnkgdG8gcHJvYmUgYW5kIHVzZSBjY2FjaGUuIgorCitPUFRfQ1hYMTE9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWN4eDExIiBPUFRfQ1hYMTEgIkVuYWJsZSBDKysxMSBmZWF0dXJlcy4iCisKK29wdGlvbl9wYXJzZSAiJEAiCisKK2lmIFsgIiRQQVJBTUVURVJfQ09VTlQiICE9IDEgXTsgdGhlbgorICAgIHBhbmljICJUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNpbmdsZSBwYXJhbWV0ZXIhIFNlZSAtLWhlbHAuIgorZmkKKworSU5TVEFMTF9ESVI9JFBBUkFNRVRFUl8xCisKKyMgU2F2ZSBvcmlnaW5hbCBQQVRIIGZvciBsYXRlci4KK09SSUdJTkFMX1BBVEg9JFBBVEgKKworIyBEZXRlcm1pbmUgaG9zdCBzeXN0ZW0gdHlwZS4KK0JVSUxEX0hPU1Q9JChnZXRfYnVpbGRfb3MpCitCVUlMRF9BUkNIPSQoZ2V0X2J1aWxkX2FyY2gpCitCVUlMRF9CVUlMRF9UQVJHRVRfVEFHPSR7QlVJTERfSE9TVH0tJHtCVUlMRF9BUkNIfQorbG9nICJGb3VuZCBjdXJyZW50IGJ1aWxkIG1hY2hpbmU6ICRCVUlMRF9CVUlMRF9UQVJHRVRfVEFHIgorCisjIEhhbmRsZSBDQ0FDSEUgcmVsYXRlZCBhcmd1bWVudHMuCitDQ0FDSEU9CitpZiBbICIkT1BUX0NDQUNIRSIgXTsgdGhlbgorICAgIGlmIFsgIiRPUFRfTk9fQ0NBQ0hFIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJZb3UgY2Fubm90IHVzZSBib3RoIC0tY2NhY2hlPTxwcm9ncmFtPiBhbmQgLS1uby1jY2FjaGUgYXQgdGhlIHNhbWUgdGltZS4iCisgICAgZmkKKyAgICBDQ0FDSEU9JChmaW5kX3Byb2dyYW0gIiRPUFRfQ0NBQ0hFIikKKyAgICBpZiBbIC16ICIkQ0NBQ0hFIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIGNjYWNoZSBwcm9ncmFtOiAkT1BUX0NDQUNIRSIKKyAgICBmaQorZWxpZiBbIC16ICIkT1BUX05PX0NDQUNIRSIgXTsgdGhlbgorICAgIENDQUNIRT0kKGZpbmRfcHJvZ3JhbSBjY2FjaGUpCisgICAgaWYgWyAiJENDQUNIRSIgXTsgdGhlbgorICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLWNjYWNoZT0kQ0NBQ0hFIgorICAgIGZpCitmaQorCithb3NwX2Rpcl9wYXJzZV9vcHRpb24KKworIyBIYW5kbGUgLS1ob3N0IG9wdGlvbi4KK2lmIFsgIiRPUFRfSE9TVCIgXTsgdGhlbgorICAgIGNhc2UgJE9QVF9IT1NUIGluCisgICAgICAgIGxpbnV4LSp8ZGFyd2luLSp8d2luZG93cy0qKQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJJbnZhbGlkIC0taG9zdCB2YWx1ZTogJE9QVF9IT1NUIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisgICAgY2FzZSAkT1BUX0hPU1QgaW4KKyAgICAgICAgKi14ODZ8Ki14ODZfNjQpCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcGFuaWMgIkludmFsaWQgLS1ob3N0IHZhbHVlOiAkT1BUX0hPU1QiCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBIT1NUPSRPUFRfSE9TVAorZWxzZQorICAgIEhPU1Q9JEJVSUxEX0JVSUxEX1RBUkdFVF9UQUcKKyAgICBsb2cgIkF1dG8tY29uZmlnOiAtLWhvc3Q9JEhPU1QiCitmaQorCisjIEhhbmRsZSAtLWJpbnByZWZpeCBvcHRpb24uCitCSU5QUkVGSVg9CitpZiBbICIkT1BUX0JJTlBSRUZJWCIgXTsgdGhlbgorICAgICMgQWxsb3cgYSBmaW5hbCAtIGFmdGVyIHRoZSBiaW5wcmVmaXgKKyAgICBCSU5QUkVGSVg9JHtPUFRfQklOUFJFRklYJSUtfQorICAgIGlmIFsgIiRCSU5QUkVGSVgiIF07IHRoZW4KKyAgICAgICAgQklOUFJFRklYPSR7QklOUFJFRklYfS0KKyAgICBmaQorZmkKKworIyBHZW5lcmF0ZSBhIHNtYWxsIHRvb2xjaGFpbiB3cmFwcGVyIHByb2dyYW0KKyMKKyMgJDE6IHByb2dyYW0gbmFtZSwgd2l0aG91dCBhbnkgcHJlZml4IChlLmcuIGdjYywgZysrLCBhciwgZXRjLi4pCisjICQyOiBzb3VyY2UgcHJlZml4IChlLmcuICdpNTg2LW1pbmd3MzJtc3ZjLScpCisjICQzOiBkZXN0aW5hdGlvbiBwcmVmaXggKGUuZy4gJ2k1ODYtcHgtbWluZ3czMm1zdmMtJykKKyMgJDQ6IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgdGhlIGdlbmVyYXRlZCBwcm9ncmFtCisjICQ1OiBvcHRpb24sIENMQU5HIGluc3RhbGxhdGlvbiBwYXRoLgorIworIyBZb3UgbWF5IGFsc28gZGVmaW5lIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHRvIHBhc3MgZXh0cmEgdG9vbCBmbGFnczoKKyMKKyMgICAgRVhUUkFfQ0ZMQUdTCisjICAgIEVYVFJBX0NYWEZMQUdTCisjICAgIEVYVFJBX0xERkxBR1MKKyMgICAgRVhUUkFfQVJGTEFHUworIyAgICBFWFRSQV9BU0ZMQUdTCisjICAgIEVYVFJBX1dJTkRSRVNGTEFHUworIworIyBBcyB3ZWxsIGFzIGEgc3BlY2lhbCB2YXJpYWJsZSBjb250YWluaW5nIGNvbW1hbmRzIHRvIHNldHVwIHRoZQorIyBlbnZpcm9ubWVudCBiZWZvcmUgdG9vbCBpbnZva2F0aW9uOgorIworIyAgICBFWFRSQV9FTlZfU0VUVVAKKyMKK2dlbl93cmFwcGVyX3Byb2dyYW0gKCkKK3sKKyAgICBsb2NhbCBQUk9HPSIkMSIKKyAgICBsb2NhbCBTUkNfUFJFRklYPSIkMiIKKyAgICBsb2NhbCBEU1RfUFJFRklYPSIkMyIKKyAgICBsb2NhbCBEU1RfRklMRT0iJDQvJHtTUkNfUFJFRklYfSRQUk9HIgorICAgIGxvY2FsIENMQU5HX0JJTkRJUj0iJDUiCisgICAgbG9jYWwgRkxBR1M9IiIKKyAgICBsb2NhbCBMREZMQUdTPSIiCisKKyAgICBjYXNlICRQUk9HIGluCisgICAgICBjY3xnY2N8Y3BwfGNsYW5nKQorICAgICAgICAgIEZMQUdTPSRGTEFHUyIgJEVYVFJBX0NGTEFHUyIKKyAgICAgICAgICA7OworICAgICAgYysrfGcrK3xjbGFuZysrKQorICAgICAgICAgIEZMQUdTPSRGTEFHUyIgJEVYVFJBX0NYWEZMQUdTIgorICAgICAgICAgIDs7CisgICAgICBhcikgRkxBR1M9JEZMQUdTIiAkRVhUUkFfQVJGTEFHUyI7OworICAgICAgYXMpIEZMQUdTPSRGTEFHUyIgJEVYVFJBX0FTRkxBR1MiOzsKKyAgICAgIGxkfGxkLmJmZHxsZC5nb2xkKSBGTEFHUz0kRkxBR1MiICRFWFRSQV9MREZMQUdTIjs7CisgICAgICB3aW5kcmVzKSBGTEFHUz0kRkxBR1MiICRFWFRSQV9XSU5EUkVTRkxBR1MiOzsKKyAgICBlc2FjCisKKyAgICBsb2NhbCBEU1RfUFJPRz0iJFBST0ciCisgICAgaWYgWyAiJENMQU5HX0JJTkRJUiIgXTsgdGhlbgorICAgICAgICBDTEFOR19CSU5ESVI9JHtDTEFOR19CSU5ESVIlL30KKyAgICAgICAgY2FzZSAkUFJPRyBpbgorICAgICAgICAgICAgY2N8Z2NjfGNsYW5nKQorICAgICAgICAgICAgICAgIERTVF9QUk9HPWNsYW5nCisgICAgICAgICAgICAgICAgRFNUX1BSRUZJWD0kQ0xBTkdfQklORElSLworICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBjKyt8ZysrfGNsYW5nKyspCisgICAgICAgICAgICAgICAgRFNUX1BST0c9Y2xhbmcrKworICAgICAgICAgICAgICAgIERTVF9QUkVGSVg9JENMQU5HX0JJTkRJUi8KKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZmkKKworICAgIGlmIFsgLXogIiREU1RfUFJFRklYIiBdOyB0aGVuCisgICAgICAgICMgQXZvaWQgaW5maW5pdGUgbG9vcCBieSBnZXR0aW5nIHJlYWwgcGF0aCBvZiBkZXN0aW5hdGlvbgorICAgICAgICAjIHByb2dyYW0KKyAgICAgICAgRFNUX1BST0c9JCh3aGljaCAiJFBST0ciIDI+L2Rldi9udWxsIHx8IHRydWUpCisgICAgICAgIGlmIFsgLXogIiREU1RfUFJPRyIgXTsgdGhlbgorICAgICAgICAgICAgbG9nICJJZ25vcmluZzogJHtTUkNfUFJFRklYfSRQUk9HIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpCisgICAgICAgIERTVF9QUkVGSVg9JChkaXJuYW1lICIkRFNUX1BST0ciKS8KKyAgICAgICAgRFNUX1BST0c9JChiYXNlbmFtZSAiJERTVF9QUk9HIikKKyAgICBmaQorCisgICAgaWYgWyAhIC1mICIke0RTVF9QUkVGSVh9JERTVF9QUk9HIiBdOyB0aGVuCisgICAgICAgIGxvZyAiICBTa2lwcGluZzogJHtTUkNfUFJFRklYfSRQUk9HICBbbWlzc2luZyBkZXN0aW5hdGlvbiBwcm9ncmFtXSIKKyAgICAgICAgcmV0dXJuCisgICAgZmkKKworICAgIGlmIFsgIiRDQ0FDSEUiIF07IHRoZW4KKyAgICAgICAgRFNUX1BSRUZJWD0iJENDQUNIRSAkRFNUX1BSRUZJWCIKKyAgICBmaQorCisgICAgY2F0ID4gIiREU1RfRklMRSIgPDwgRU9GCisjIS9iaW4vc2gKKyMgQXV0by1nZW5lcmF0ZWQgYnkgJChwcm9ncmFtX25hbWUpLCBETyBOT1QgRURJVCEhCisKKyMgRW52aXJvbm1lbnQgc2V0dXAKKyRFWFRSQV9FTlZfU0VUVVAKKworIyBUb29sIGludm9rYXRpb24uCiske0RTVF9QUkVGSVh9JERTVF9QUk9HICRGTEFHUyAiXCRAIiAkTERGTEFHUworRU9GCisgICAgY2htb2QgK3ggIiREU1RfRklMRSIKKyAgICBsb2cgIiAgR2VuZXJhdGluZzogJHtTUkNfUFJFRklYfSRQUk9HIgorfQorCisjICQxOiBzb3VyY2UgcHJlZml4CisjICQyOiBkZXN0aW5hdGlvbiBwcmVmaXgKKyMgJDM6IGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KKyMgJDQ6IG9wdGlvbmFsLiBDbGFuZyBpbnN0YWxsYXRpb24gcGF0aC4KK2dlbl93cmFwcGVyX3Rvb2xjaGFpbiAoKSB7CisgICAgbG9jYWwgU1JDX1BSRUZJWD0iJDEiCisgICAgbG9jYWwgRFNUX1BSRUZJWD0iJDIiCisgICAgbG9jYWwgRFNUX0RJUj0iJDMiCisgICAgbG9jYWwgQ0xBTkdfQklORElSPSIkNCIKKyAgICBsb2NhbCBQUk9HCisgICAgbG9jYWwgUFJPR1JBTVM9ImNjIGdjYyBjbGFuZyBjKysgZysrIGNsYW5nKysgY3BwIGFzIGxkIGFyIHJhbmxpYiBzdHJpcCBzdHJpbmdzIG5tIG9iamR1bXAgb2JqY29weSBkbGx0b29sIgorCisgICAgbG9nICJHZW5lcmF0aW5nIHRvb2xjaGFpbiB3cmFwcGVycyBpbjogJERTVF9ESVIiCisgICAgcnVuIG1rZGlyIC1wICIkRFNUX0RJUiIKKworICAgIGlmIFsgLW4gIiRTUkNfUFJFRklYIiBdOyB0aGVuCisgICAgICAgIFNSQ19QUkVGSVg9JHtTUkNfUFJFRklYJSUtfS0KKyAgICBmaQorCisgICAgY2FzZSAkU1JDX1BSRUZJWCBpbgorICAgICAgICAqbWluZ3cqKQorICAgICAgICAgICAgUFJPR1JBTVM9IiRQUk9HUkFNUyB3aW5kcmVzIgorICAgICAgICAgICAgY2FzZSAkQ1VSUkVOVF9IT1NUIGluCisgICAgICAgICAgICAgICAgd2luZG93cy14ODYpCisgICAgICAgICAgICAgICAgICAgIEVYVFJBX1dJTkRSRVNGTEFHUz0iLS10YXJnZXQ9cGUtaTM4NiIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworCisgICAgaWYgWyAiJENDQUNIRSIgXTsgdGhlbgorICAgICAgICAjIElmIHRoaXMgaXMgY2xhbmcsIGRpc2FibGUgY2NhY2hlLWluZHVjZWQgd2FybmluZ3MgYW5kCisgICAgICAgICMgcmVzdG9yZSBjb2xvcmVkIGRpYWdub3N0aWNzLgorICAgICAgICAjIGh0dHA6Ly9wZXRlcmVpc2VudHJhdXQuYmxvZ3Nwb3QuZnIvMjAxMS8wNS9jY2FjaGUtYW5kLWNsYW5nLmh0bWwKKyAgICAgICAgaWYgKCR7RFNUX1BSRUZJWH1nY2MgLS12ZXJzaW9uIDI+L2Rldi9udWxsIHwgZ3JlcCAtLWNvbG9yPW5ldmVyIC1xIGNsYW5nKTsgdGhlbgorICAgICAgICAgICAgRVhUUkFfQ0xBTkdfRkxBR1M9Ii1RdW51c2VkLWFyZ3VtZW50cyAtZmNvbG9yLWRpYWdub3N0aWNzIgorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSIkRVhUUkFfQ0ZMQUdTICRFWFRSQV9DTEFOR19GTEFHUyIKKyAgICAgICAgICAgIEVYVFJBX0NYWEZMQUdTPSIkRVhUUkFfQ1hYRkxBR1MgJEVYVFJBX0NMQU5HX0ZMQUdTIgorICAgICAgICBmaQorICAgIGZpCisKKyAgICBmb3IgUFJPRyBpbiAkUFJPR1JBTVM7IGRvCisgICAgICAgIGdlbl93cmFwcGVyX3Byb2dyYW0gJFBST0cgIiRTUkNfUFJFRklYIiAiJERTVF9QUkVGSVgiICIkRFNUX0RJUiIgIiRDTEFOR19CSU5ESVIiCisgICAgZG9uZQorCisgICAgRVhUUkFfQ0ZMQUdTPQorICAgIEVYVFJBX0NYWEZMQUdTPQorICAgIEVYVFJBX0xERkxBR1M9CisgICAgRVhUUkFfQVJGTEFHUz0KKyAgICBFWFRSQV9BU0ZMQUdTPQorICAgIEVYVFJBX1dJTkRSRVNGTEFHUz0KKyAgICBFWFRSQV9FTlZfU0VUVVA9Cit9CisKKyMgUHJlcGFyZSB0aGUgYnVpbGQgZm9yIGEgZ2l2ZW4gaG9zdCBzeXN0ZW0uCisjICQxOiBIb3N0IHN5c3RlbSB0YWcgKGUuZy4gbGludXgteDg2XzY0KQorcHJlcGFyZV9idWlsZF9mb3JfaG9zdCAoKSB7CisgICAgbG9jYWwgQ1VSUkVOVF9IT1NUPSQxCisKKyAgICBDVVJSRU5UX1RFWFQ9IlskQ1VSUkVOVF9IT1NUXSIKKworICAgIFBSRUJVSUxUX1RPT0xDSEFJTl9ESVI9CisgICAgVE9PTENIQUlOX1BSRUZJWD0KKyAgICBFWFRSQV9FTlZfU0VUVVA9CisgICAgUFJFQlVJTFRfVE9PTENIQUlOX1NVQkRJUj0kKGFvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N1YmRpcl9mb3IgJENVUlJFTlRfSE9TVCkKKwlQUkVCVUlMVF9UT09MQ0hBSU5fRElSPSRBT1NQX0RJUi8kUFJFQlVJTFRfVE9PTENIQUlOX1NVQkRJUgorICAgIFRPT0xDSEFJTl9QUkVGSVg9JChhb3NwX3ByZWJ1aWx0X3Rvb2xjaGFpbl9wcmVmaXhfZm9yICRDVVJSRU5UX0hPU1QpCisJQ0xBTkdfQklORElSPQorICAgIGNhc2UgJENVUlJFTlRfSE9TVCBpbgorICAgICAgICBkYXJ3aW4tKikKKyAgICAgICAgICAgICMgRW5zdXJlIHdlIHVzZSB0aGUgMTAuOCBTREsgb3IgZWxzZS4KKyAgICAgICAgICAgIE9TWF9WRVJTSU9OPSQoc3dfdmVycyAtcHJvZHVjdFZlcnNpb24pCisgICAgICAgICAgICBPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9MTAuOAorICAgICAgICAgICAgT1NYX1NES19TVVBQT1JURUQ9IjEwLjYgMTAuNyAxMC44IDEwLjkiCisgICAgICAgICAgICBPU1hfU0RLX0lOU1RBTExFRF9MSVNUPSQoeGNvZGVidWlsZCAtc2hvd3Nka3MgMj4vZGV2L251bGwgfCBcCisgICAgICAgICAgICAgICAgICAgIGdyZXAgLS1jb2xvcj1uZXZlciBtYWNvc3ggfCBzZWQgLWUgInMvLiptYWNvc3gxMFwuLy9nIiB8IHNvcnQgLW4gfCBcCisgICAgICAgICAgICAgICAgICAgIHRyICdcbicgJyAnIHwgc2VkIC1lICdzL14vMTAuL2cnKQorICAgICAgICAgICAgaWYgWyAteiAiJE9TWF9TREtfSU5TVEFMTEVEX0xJU1QiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBwYW5pYyAiUGxlYXNlIGluc3RhbGwgWENvZGUgb24gdGhpcyBtYWNoaW5lISIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBsb2cgIk9TWDogSW5zdGFsbGVkIFNES3M6ICRPU1hfU0RLX0lOU1RBTExFRF9MSVNUIgorCisgICAgICAgICAgICBPU1hfU0RLX1ZFUlNJT049JChlY2hvICIkT1NYX1NES19JTlNUQUxMRURfTElTVCIgfCB0ciAnICcgJ1xuJyB8IGhlYWQgLTEpCisgICAgICAgICAgICBsb2cgIk9TWDogVXNpbmcgU0RLIHZlcnNpb24gJE9TWF9TREtfVkVSU0lPTiIKKworICAgICAgICAgICAgWENPREVfUEFUSD0kKHhjb2RlLXNlbGVjdCAtcHJpbnQtcGF0aCAyPi9kZXYvbnVsbCkKKyAgICAgICAgICAgIGxvZyAiT1NYOiBYQ29kZSBwYXRoOiAkWENPREVfUEFUSCIKKworICAgICAgICAgICAgT1NYX1NES19ST09UPSRYQ09ERV9QQVRIL1BsYXRmb3Jtcy9NYWNPU1gucGxhdGZvcm0vRGV2ZWxvcGVyL1NES3MvTWFjT1NYJHtPU1hfU0RLX1ZFUlNJT059LnNkaworICAgICAgICAgICAgbG9nICJPU1g6IExvb2tpbmcgZm9yICRPU1hfU0RLX1JPT1QiCisgICAgICAgICAgICBpZiBbICEgLWQgIiRPU1hfU0RLX1JPT1QiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBPU1hfU0RLX1JPT1Q9L0RldmVsb3Blci9TREtzL01hY09TWCR7T1NYX1NES19WRVJTSU9OfS5zZGsKKyAgICAgICAgICAgICAgICBsb2cgIk9TWDogTG9va2luZyBmb3IgJE9TWF9TREtfUk9PVCIKKyAgICAgICAgICAgICAgICBpZiBbICEgLWQgIiRPU1hfU0RLX1JPT1QiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBmaW5kIFNESyAkT1NYX1NES19WRVJTSU9OIGF0ICRPU1hfU0RLX1JPT1QiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBsb2cgIk9TWDogVXNpbmcgU0RLIGF0ICRPU1hfU0RLX1JPT1QiCisgICAgICAgICAgICBFWFRSQV9FTlZfU0VUVVA9ImV4cG9ydCBTREtST09UPSRPU1hfU0RLX1JPT1QiCisgICAgICAgICAgICBDTEFOR19CSU5ESVI9JFBSRUJVSUxUX1RPT0xDSEFJTl9ESVIvYmluCisgICAgICAgICAgICBQUkVCVUlMVF9UT09MQ0hBSU5fRElSPQorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiBbIC16ICIkT1BUX0JJTlBSRUZJWCIgXTsgdGhlbgorICAgICAgICBCSU5QUkVGSVg9JFRPT0xDSEFJTl9QUkVGSVgKKyAgICBmaQorCisgICAgY2FzZSAkQ1VSUkVOVF9IT1NUIGluCisgICAgICAgIGxpbnV4LXg4Nl82NCkKKyAgICAgICAgICAgIEdOVV9DT05GSUdfSE9TVD14ODZfNjQtbGludXgKKyAgICAgICAgICAgIDs7CisgICAgICAgIGxpbnV4LXg4NikKKyAgICAgICAgICAgIEdOVV9DT05GSUdfSE9TVD1pNjg2LWxpbnV4CisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIEdOVV9DT05GSUdfSE9TVD1pNjg2LXc2NC1taW5ndzMyCisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzLXg4Nl82NCkKKyAgICAgICAgICAgIEdOVV9DT05GSUdfSE9TVD14ODZfNjQtdzY0LW1pbmd3MzIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGRhcndpbi0qKQorICAgICAgICAgICAgIyBVc2UgaG9zdCBjb21waWxlci4KKyAgICAgICAgICAgIEdOVV9DT05GSUdfSE9TVD0KKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiSG9zdCBzeXN0ZW0gJyRDVVJSRU5UX0hPU1QnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQhIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiBbICIkT1BUX0JJTlBSRUZJWCIgXTsgdGhlbgorICAgICAgICBCSU5QUkVGSVg9JHtPUFRfQklOUFJFRklYJSUtfQorICAgIGVsc2UKKyAgICAgICAgQklOUFJFRklYPSRHTlVfQ09ORklHX0hPU1QKKyAgICBmaQorCisgICAgY2FzZSAkQ1VSUkVOVF9IT1NUIGluCisgICAgICAgIGRhcndpbi14ODZfNjQpCisKKyAgICAgICAgICAgIGNvbW1vbl9GTEFHUz0iLXRhcmdldCB4ODZfNjQtYXBwbGUtZGFyd2luMTIuMC4wIgorICAgICAgICAgICAgdmFyX2FwcGVuZCBjb21tb25fRkxBR1MgIiAtaXN5c3Jvb3QgJE9TWF9TREtfUk9PVCIKKyAgICAgICAgICAgIHZhcl9hcHBlbmQgY29tbW9uX0ZMQUdTICIgLW1tYWNvc3gtdmVyc2lvbi1taW49JE9TWF9ERVBMT1lNRU5UX1RBUkdFVCIKKyAgICAgICAgICAgIHZhcl9hcHBlbmQgY29tbW9uX0ZMQUdTICIgLURNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9JE9TWF9ERVBMT1lNRU5UX1RBUkdFVCIKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iJGNvbW1vbl9GTEFHUyIKKyAgICAgICAgICAgIEVYVFJBX0NYWEZMQUdTPSIkY29tbW9uX0ZMQUdTIgorICAgICAgICAgICAgaWYgWyAiJE9QVF9DWFgxMSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfQ1hYRkxBR1MgIi1zdGRsaWI9bGliYysrIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIEVYVFJBX0xERkxBR1M9Ii1zeXNsaWJyb290ICRPU1hfU0RLX1JPT1QiCisgICAgICAgICAgICA7OworICAgICAgICBkYXJ3aW4teDg2KQorICAgICAgICAgICAgcGFuaWMgIkhvc3Qgc3lzdGVtICckQ1VSUkVOVF9IT1NUJyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgc2NyaXB0ISIKKyAgICAgICAgICAgIDs7CisgICAgICAgICoteDg2KQorICAgICAgICAgICAgRVhUUkFfQ0ZMQUdTPSItbTMyIgorICAgICAgICAgICAgRVhUUkFfQ1hYRkxBR1M9Ii1tMzIiCisgICAgICAgICAgICA7OworICAgICAgICAqLXg4Nl82NCkKKyAgICAgICAgICAgIEVYVFJBX0NGTEFHUz0iLW02NCIKKyAgICAgICAgICAgIEVYVFJBX0NYWEZMQUdTPSItbTY0IgorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIHBhbmljICJIb3N0IHN5c3RlbSAnJENVUlJFTlRfSE9TVCcgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNjcmlwdCEiCisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgIGlmIFsgIiRPUFRfQ1hYMTEiIF07IHRoZW4KKyAgICAgICAgY2FzZSAkQ1VSUkVOVF9IT1NUIGluCisgICAgICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfQ1hYRkxBR1MgIi1zdGQ9YysrMTQiICItV2Vycm9yPWMrKzE0LWNvbXBhdCIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfQ1hYRkxBR1MgIi1zdGQ9YysrMTEiICItV2Vycm9yPWMrKzExLWNvbXBhdCIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZmkKKworICAgIENST1NTX1BSRUZJWD0ke0dOVV9DT05GSUdfSE9TVH0tCisKKyAgICBQQVRIPSRPUklHSU5BTF9QQVRICisKKyAgICBpZiBbICIkT1BUX1BSRUZJWCIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0NGTEFHUyAiLUkkT1BUX1BSRUZJWC9pbmNsdWRlIgorICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0NYWEZMQUdTICItSSRPUFRfUFJFRklYL2luY2x1ZGUiCisgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfTERGTEFHUyAiLUwkT1BUX1BSRUZJWC9saWIiCisgICAgZmkKKworICAgIGlmIFsgIiRPUFRfUFJJTlQiIF07IHRoZW4KKyAgICAgICAgIyBJZiAkQklOUFJFRklYIGlzIG5vdCBlbXB0eSwgZW5zdXJlIGl0IGhhcyBhIHRyYWlsaW5nIC0uCisgICAgICAgIGlmIFsgIiRCSU5QUkVGSVgiIF07IHRoZW4KKyAgICAgICAgICAgIEJJTlBSRUZJWD0ke0JJTlBSRUZJWCUlLX0tCisgICAgICAgIGZpCisgICAgICAgIGNhc2UgJE9QVF9QUklOVCBpbgorICAgICAgICAgICAgYmlucHJlZml4KQorICAgICAgICAgICAgICAgIHByaW50ZiAiJXNcbiIgIiRCSU5QUkVGSVgiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIHN5c3Jvb3QpCisgICAgICAgICAgICAgICAgbG9jYWwgU1VCRElSCisgICAgICAgICAgICAgICAgU1VCRElSPSIkKGFvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N5c3Jvb3Rfc3ViZGlyX2ZvciAiJHtDVVJSRU5UX0hPU1R9IikiCisgICAgICAgICAgICAgICAgaWYgWyAtbiAiJHtTVUJESVJ9IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIHByaW50ZiAiJHtBT1NQX0RJUn0vJHtTVUJESVJ9IgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgcHJpbnRmICIlc1xuIiAiJHtCSU5QUkVGSVh9JE9QVF9QUklOVCIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgICBpZiBbICIkQklOUFJFRklYIiBdOyB0aGVuCisgICAgICAgICAgICBsb2cgIiRDVVJSRU5UX1RFWFQgR2VuZXJhdGluZyAke0JJTlBSRUZJWCUlLX0gd3JhcHBlciB0b29sY2hhaW4gaW4gJElOU1RBTExfRElSIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2cgIiRDVVJSRU5UX1RFWFQgR2VuZXJhdGluZyBob3N0IHdyYXBwZXIgdG9vbGNoYWluIGluICRJTlNUQUxMX0RJUiIKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAiJENMQU5HX0JJTkRJUiIgXTsgdGhlbgorICAgICAgICAgICAgRFNUX1BSRUZJWD0iIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBEU1RfUFJFRklYPSRQUkVCVUlMVF9UT09MQ0hBSU5fRElSL2Jpbi8kVE9PTENIQUlOX1BSRUZJWAorICAgICAgICBmaQorICAgICAgICBnZW5fd3JhcHBlcl90b29sY2hhaW4gIiRCSU5QUkVGSVgiICIkRFNUX1BSRUZJWCIgIiRJTlNUQUxMX0RJUiIgIiRDTEFOR19CSU5ESVIiCisKKyAgICAgICAgIyBDcmVhdGUgcGtnY29uZmlnIGxpbmsgZm9yIG90aGVyIHNjcmlwdHMuCisgICAgICAgIGNhc2UgJENVUlJFTlRfSE9TVCBpbgorICAgICAgICAgICAgbGludXgtKikKKyAgICAgICAgICAgICAgICBsbiAtc2ZuICIkUFJFQlVJTFRfVE9PTENIQUlOX0RJUiIvc3lzcm9vdC91c3IvbGliL3BrZ2NvbmZpZyAiJElOU1RBTExfRElSIi9wa2djb25maWcKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZmkKK30KKworcHJlcGFyZV9idWlsZF9mb3JfaG9zdCAkSE9TVApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2dlbi1jaGFybWFwLnB5IGIvYW5kcm9pZC9zY3JpcHRzL2dlbi1jaGFybWFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODIwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvZ2VuLWNoYXJtYXAucHkKQEAgLTAsMCArMSwxOTAgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisjCisjIGEgcHl0aG9uIHNjcmlwdCB1c2VkIHRvIGdlbmVyYXRlIHNvbWUgQyBjb25zdGFudCB0YWJsZXMgZnJvbSBhIGtleSBjaGFybWFwIGZpbGUKKyMKKyMgdXNhZ2U6CisjICAgIHByb2duYW1lIGZpbGUua2NtID4gY2hhcm1hcC10YWIuaAorIworaW1wb3J0IHN5cywgb3MsIHN0cmluZywgcmUKKworaGVhZGVyID0gIiIiXAorI2luY2x1ZGUgImFuZHJvaWRfY2hhcm1hcC5oIgorCisvKiB0aGUgZm9sbG93aW5nIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSAnZ2VuLWNoYXJtYXAucHknIHNjcmlwdAorICogZG8gbm90IHRvdWNoLiB0aGUgZ2VuZXJhdGlvbiBjb21tYW5kIHdhczoKKyAqICAgZ2VuLWNoYXJtYXAucHlcCisiIiIKKworaGVhZGVyMiA9ICIiIgorICovCisiIiIKKwora21hcF9oZWFkZXIgPSAiIiJcCitzdGF0aWMgY29uc3QgQUtleUVudHJ5ICBfJShuYW1lKXNfa2V5c1tdID0KK3sKKyAgIC8qIGtleWNvZGUgICAgICAgICAgICAgICAgICAgYmFzZSAgIGNhcHMgICAgZm4gIGNhcHMrZm4gICBudW1iZXIgKi8KKyIiIgorCisKK2ttYXBfZm9vdGVyID0gIiIiXAorfTsKKworc3RhdGljIGNvbnN0IEFLZXlDaGFybWFwICBfJShuYW1lKXNfY2hhcm1hcCA9Cit7CisgICAgXyUobmFtZSlzX2tleXMsCisgICAgJShjb3VudClkLAorICAgICIlKG5hbWUpcyIKK307CisiIiIKKworCityZV9tYXBuYW1lID0gcmUuY29tcGlsZSggciIuKi8oXHcrKS5rY20iICkKK3JlX3N0YXJ0ID0gcmUuY29tcGlsZSggciIoXHcrKVxzKiguKikiICkKK3JlX2NoYXIgID0gcmUuY29tcGlsZSggciIoJy4nKVxzKiguKikiICkKK3JlX2hleCAgID0gcmUuY29tcGlsZSggciIoMHhcdyspXHMqKC4qKSIgKQorCitzcGVjaWFscyA9IHsgJ0NPTU1BJzogJ0NvbW1hJywKKyAgICAgICAgICAgICAnUEVSSU9EJzogJ1BlcmlvZCcsCisgICAgICAgICAgICAgJ0FUJzogJ0F0JywKKyAgICAgICAgICAgICAnTEVGVF9CUkFDS0VUJzogJ0xlZnRCcmFja2V0JywKKyAgICAgICAgICAgICAnUklHSFRfQlJBQ0tFVCc6ICdSaWdodEJyYWNrZXQnLAorICAgICAgICAgICAgICdTTEFTSCc6ICdTbGFzaCcsCisgICAgICAgICAgICAgJ0JBQ0tTTEFTSCc6ICdCYWNrc2xhc2gnLAorICAgICAgICAgICAgICdHUkFWRSc6ICdHcmF2ZScsCisgICAgICAgICAgICAgJ01JTlVTJzogJ01pbnVzJywKKyAgICAgICAgICAgICAnRVFVQUxTJzogJ0VxdWFscycsCisgICAgICAgICAgICAgJ1NFTUlDT0xPTic6ICdTZW1pY29sb24nLAorICAgICAgICAgICAgICdBUE9TVFJPUEhFJzogJ0Fwb3N0cm9waGUnLAorICAgICAgICAgICAgICdTUEFDRSc6ICdTcGFjZScsCisgICAgICAgICAgICAgJ0VOVEVSJzogJ05ld2xpbmUnLAorICAgICAgICAgICAgICdUQUInOiAnVGFiJywKKyAgICAgICAgICAgICAnU1RBUic6ICdTdGFyJywKKyAgICAgICAgICAgICAnUE9VTkQnOiAnUG91bmQnLAorICAgICAgICAgICAgICdQTFVTJzogJ1BsdXMnLAorICAgICAgICAgICAgICdERUwnOiAnRGVsJworICAgICAgICAgICB9CisKK2VudHJpZXMgPSBbXQorCitkZWYgbWF0Y2hfY2hhcl9vcl9oZXgobGluZSk6CisgICAgbSA9IHJlX2NoYXIubWF0Y2gobGluZSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgbSA9IHJlX2hleC5tYXRjaChsaW5lKQorICAgIHJldHVybiBtCisKK2RlZiBxdW90ZShzKToKKyAgICBpZiBzID09ICInJyciOgorICAgICAgICBzID0gIidcXCcnIgorICAgIGVsaWYgcyA9PSAiJ1xcJyI6CisgICAgICAgIHMgPSAiJ1xcXFwnIgorICAgIHJldHVybiBzCisKK2RlZiBwcm9jZXNzX2xpbmUobGluZSxyZXN1bHQpOgorICAgIG0gPSByZV9zdGFydC5tYXRjaChsaW5lKQorICAgIGlmIG5vdCBtOgorICAgICAgICBwcmludCAiYmFkIGJhZCBsaW5lOiAiICsgbGluZQorICAgICAgICByZXR1cm4gLTEKKyAgICBrZXljb2RlID0gbS5ncm91cCgxKQorICAgIGxpbmUgICAgPSBtLmdyb3VwKDIpCisgICAgbSA9IG1hdGNoX2NoYXJfb3JfaGV4KGxpbmUpCisgICAgaWYgbm90IG06CisgICAgICAgIHByaW50ICJjaGFyYWN0ZXIgZXhwZWN0ZWQgaW46ICIgKyBsaW5lCisgICAgICAgIHJldHVybiAtMQorICAgIGRpc3AgPSBxdW90ZShtLmdyb3VwKDEpKQorICAgIGxpbmUgPSBtLmdyb3VwKDIpCisgICAgbSA9IG1hdGNoX2NoYXJfb3JfaGV4KGxpbmUpCisgICAgaWYgbm90IG06CisgICAgICAgIHByaW50ICJjaGFyYWN0ZXIgZXhwZWN0ZWQgaW46ICIgKyBsaW5lCisgICAgICAgIHJldHVybiAtMQorICAgIG51bWJlciA9IHF1b3RlKG0uZ3JvdXAoMSkpCisgICAgbGluZSA9IG0uZ3JvdXAoMikKKyAgICBtID0gbWF0Y2hfY2hhcl9vcl9oZXgobGluZSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcHJpbnQgImNoYXJhY3RlciBleHBlY3RlZCBpbjogIiArIGxpbmUKKyAgICAgICAgcmV0dXJuIC0xCisgICAgYmFzZSA9IHF1b3RlKG0uZ3JvdXAoMSkpCisgICAgbGluZSA9IG0uZ3JvdXAoMikKKyAgICBtID0gbWF0Y2hfY2hhcl9vcl9oZXgobGluZSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcHJpbnQgImNoYXJhY3RlciBleHBlY3RlZCBpbjogIiArIGxpbmUKKyAgICAgICAgcmV0dXJuIC0xCisgICAgY2FwcyA9IHF1b3RlKG0uZ3JvdXAoMSkpCisgICAgbGluZSA9IG0uZ3JvdXAoMikKKyAgICBtID0gbWF0Y2hfY2hhcl9vcl9oZXgobGluZSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcHJpbnQgImNoYXJhY3RlciBleHBlY3RlZCBpbjogIiArIGxpbmUKKyAgICAgICAgcmV0dXJuIC0xCisgICAgZm4gPSBxdW90ZShtLmdyb3VwKDEpKQorICAgIGxpbmUgPSBtLmdyb3VwKDIpCisgICAgbSA9IG1hdGNoX2NoYXJfb3JfaGV4KGxpbmUpCisgICAgaWYgbm90IG06CisgICAgICAgIHByaW50ICJjaGFyYWN0ZXIgZXhwZWN0ZWQgaW46ICIgKyBsaW5lCisgICAgICAgIHJldHVybiAtMQorICAgIGNhcHNfZm4gPSBxdW90ZShtLmdyb3VwKDEpKQorCisgICAgaWYgc3BlY2lhbHMuaGFzX2tleShrZXljb2RlKToKKyAgICAgICAga2V5Y29kZSA9IHNwZWNpYWxzW2tleWNvZGVdCisgICAga2V5Y29kZSA9ICJrS2V5Q29kZSIgKyBrZXljb2RlCisKKyAgICByZXN1bHQuYXBwZW5kKCAoa2V5Y29kZSxiYXNlLGNhcHMsZm4sY2Fwc19mbixudW1iZXIpICkKKyAgICByZXR1cm4gMAorCitkZWYgcHJvY2Vzc19maWxlKCBmaWxlICk6CisgICAgcmVzdWx0ID0gW10KKyAgICBmcCA9IG9wZW4oZmlsZSwicmIiKQorICAgIGZvciBsaW5lIGluIGZwLnhyZWFkbGluZXMoKToKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiBub3QgbGluZTogICAjIHNraXAgZW1wdHkgbGluZXMKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGxpbmVbMF0gPT0gJyMnIG9yIGxpbmVbMF0gPT0gJ1snOiAgIyBza2lwCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBwcm9jZXNzX2xpbmUobGluZSxyZXN1bHQpIDwgMDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZnAuY2xvc2UoKQorICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgS01hcDoKKyAgICBkZWYgX19pbml0X18oc2VsZixuYW1lLHJlc3VsdHMpOgorICAgICAgICBzZWxmLm5hbWUgICAgPSBuYW1lCisgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlc3VsdHMKKworICAgIGRlZiBkdW1wKHNlbGYpOgorICAgICAgICB0ID0geyAnbmFtZSc6IHNlbGYubmFtZSwgJ2NvdW50JzpsZW4oc2VsZi5yZXN1bHRzKSB9CisgICAgICAgIHByaW50IGttYXBfaGVhZGVyICUgdAorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlc3VsdHM6CisgICAgICAgICAgICBwcmludCAiICAgIHsgJS0yMnMsICU1cywgJTVzLCAlNXMsICU2cywgJTVzIH0sIiAlIGl0ZW0KKyAgICAgICAgcHJpbnQga21hcF9mb290ZXIgJSB0CisKK2ttYXBzID0gW10KKworaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgcHJpbnQgInVzYWdlOiBwcm9nbmFtZSAgY2hhcm1hcC5rY20gW2NoYXJtYXAyLmtjbSAuLi5dID4gY2hhcm1hcC10YWIuaCIKK2Vsc2U6CisgICAgZ2VubGluZSA9ICIiCisgICAgZm9yIGZpbGVwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgbSA9IHJlX21hcG5hbWUubWF0Y2goZmlsZXBhdGgpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgcHJpbnQgIiVzIGlzIG5vdCBhIGtleWJvYXJkIGNoYXJtYXAgbmFtZSIgJSBmaWxlcGF0aAorICAgICAgICAgICAgb3MuZXhpdCgxKQorCisgICAgICAgIG1hcG5hbWUgPSBtLmdyb3VwKDEpCisgICAgICAgIGdlbmxpbmUgPSBnZW5saW5lICsgIiAiICsgbWFwbmFtZSArICIua2NtIgorCisgICAgZm9yIGZpbGVwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgbSA9IHJlX21hcG5hbWUubWF0Y2goZmlsZXBhdGgpCisgICAgICAgIG1hcG5hbWUgPSBtLmdyb3VwKDEpCisgICAgICAgIHJlc3VsdCA9IHByb2Nlc3NfZmlsZSggZmlsZXBhdGggKQorICAgICAgICBrbWFwID0gS01hcChtYXBuYW1lLHJlc3VsdCkKKyAgICAgICAga21hcHMuYXBwZW5kKGttYXApCisKKyAgICBwcmludCBoZWFkZXIgKyBnZW5saW5lICsgaGVhZGVyMgorICAgIGZvciBrbWFwIGluIGttYXBzOgorICAgICAgICBrbWFwLmR1bXAoKQorCisgICAgcHJpbnQgImNvbnN0IEFLZXlDaGFybWFwKiAgYW5kcm9pZF9jaGFybWFwc1slZF0gPSB7IiAlIGxlbihrbWFwcyksCisgICAgY29tbWEgPSAiIgorICAgIGZvciBrbWFwIGluIGttYXBzOgorICAgICAgICBwcmludCAiJXMmXyVzX2NoYXJtYXAiICUgKGNvbW1hLCBrbWFwLm5hbWUpLAorICAgICAgICBjb21tYSA9ICIsICIKKyAgICBwcmludCAifTsiCisgICAgcHJpbnQgImNvbnN0IGludCAgICAgICAgICAgYW5kcm9pZF9jaGFybWFwX2NvdW50ID0gJWQ7IiAlIGxlbihrbWFwcykKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSBiL2FuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNWZjNTlmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL2dlbi1lbnRyaWVzLnB5CkBAIC0wLDAgKzEsMzE0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgdG8gcGFyc2UgYSBsaXN0IG9mIERMTCBlbnRyeSBwb2ludHMuCisjIEV4cGVjdGVkIGZvcm1hdDoKKyMKKyMgICA8ZW1wdHktbGluZT4gICAtPiBpZ25vcmVkCisjICAgIzxjb21tZW50PiAgICAgLT4gaWdub3JlZAorIyAgICU8dmVyYmF0aW0+ICAgIC0+IHZlcmJhdGltIG91dHB1dCBmb3IgaGVhZGVyIGZpbGVzLgorIyAgICE8cHJlZml4PiAgICAgIC0+IHByZWZpeCBuYW1lIGZvciBoZWFkZXIgZmlsZXMuCisjICAgPHJldHVybi10eXBlPiA8ZnVuY3Rpb24tbmFtZT4gPHNpZ25hdHVyZT4gOyAtPiBlbnRyeSBwb2ludCBkZWNsYXJhdGlvbi4KKyMKKyMgQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvci4KKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgYXJncGFyc2UKKworcmVfZnVuYyA9IHJlLmNvbXBpbGUociIiIl4oLipbXCogXSkoW0EtWmEtel9dW0EtWmEtejAtOV9dKilcKCguKilcKTskIiIiKQorcmVfcGFyYW0gPSByZS5jb21waWxlKHIiIiJeKC4qW1wqIF0pKFtBLVphLXpfXVtBLVphLXowLTlfXSopJCIiIikKKworY2xhc3MgRW50cnk6CisgICAgIiIiU21hbGwgY2xhc3MgdXNlZCB0byBtb2RlbCBhIHNpbmdsZSBETEwgZW50cnkgcG9pbnQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmNfbmFtZSwgcmV0dXJuX3R5cGUsIHBhcmFtZXRlcnMpOgorICAgICAgICAiIiJJbml0aWFsaXplIEVudHJ5IGluc3RhbmNlLiB8ZnVuY19uYW1lfCBpcyB0aGUgZnVuY3Rpb24gbmFtZSwKKyAgICAgICAgICAgfHJldHVybl90eXBlfCBpdHMgcmV0dXJuIHR5cGUsIGFuZCB8cGFyYW1ldGVyc3wgaXMgYSBsaXN0IG9mCisgICAgICAgICAgICh0eXBlLG5hbWUpIHR1cGxlcyBmcm9tIHRoZSBlbnRyeSdzIHNpZ25hdHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZnVuY19uYW1lID0gZnVuY19uYW1lCisgICAgICAgIHNlbGYucmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZQorICAgICAgICBzZWxmLnBhcmFtZXRlcnMgPSAiIgorICAgICAgICBzZWxmLmNhbGwgPSAiIgorICAgICAgICBjb21tYSA9ICIiCisgICAgICAgIGZvciBwYXJhbSBpbiBwYXJhbWV0ZXJzOgorICAgICAgICAgICAgc2VsZi5wYXJhbWV0ZXJzICs9ICIlcyVzICVzIiAlIChjb21tYSwgcGFyYW1bMF0sIHBhcmFtWzFdKQorICAgICAgICAgICAgc2VsZi5jYWxsICs9ICIlcyVzIiAlIChjb21tYSwgcGFyYW1bMV0pCisgICAgICAgICAgICBjb21tYSA9ICIsICIKKworZGVmIGJhbm5lcl9jb21tYW5kKGFyZ3YpOgorICAgICIiIlJldHVybiBzYW5pdGl6ZWQgY29tbWFuZC1saW5lIGRlc2NyaXB0aW9uLgorICAgICAgIHxhcmd2fCBtdXN0IGJlIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgcGFyYW1ldGVycywgZS5nLiBzeXMuYXJndi4KKyAgICAgICBSZXR1cm4gYSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgY29tbWFuZCwgd2l0aCBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgIHBhdGhzIHJlbW92ZWQuIiIiCisKKyAgICAjIFJlbW92ZSBwYXRoIGZyb20gZmlyc3QgcGFyYW1ldGVyCisgICAgYXJndiA9IGFyZ3ZbOl0KKyAgICBhcmd2WzBdID0gImFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSIKKyAgICByZXR1cm4gJyAnLmpvaW4oYXJndikKKworZGVmIHBhcnNlX2VudHJpZXNfZmlsZShsaW5lcyk6CisgICAgIiIiUGFyc2UgYW4gLmVudHJpZXMgZmlsZSBhbmQgcmV0dXJuIGEgdHVwbGUgb2Y6CisgICAgICAgIGVudHJpZXM6IGxpc3Qgb2YgRW50cnkgaW5zdGFuY2VzIGZyb20gdGhlIGZpbGUuCisgICAgICAgIHByZWZpeF9uYW1lOiBwcmVmaXggbmFtZSBmcm9tIHRoZSBmaWxlLCBvciBOb25lLgorICAgICAgICB2ZXJiYXRpbTogbGlzdCBvZiB2ZXJiYXRpbSBsaW5lcyBmcm9tIHRoZSBmaWxlLgorICAgICAgICBlcnJvcnM6IGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBmaWxlLCBwcmVmaXhlZCBieSBsaW5lIG51bWJlci4KKyAgICAiIiIKKyAgICBlbnRyaWVzID0gW10KKyAgICB2ZXJiYXRpbSA9IFtdCisgICAgZXJyb3JzID0gW10KKyAgICBsaW5lbm8gPSAwCisgICAgcHJlZml4X25hbWUgPSBOb25lCisgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgIGxpbmVubyArPSAxCisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgbGVuKGxpbmUpID09IDA6ICAjIElnbm9yZSBlbXB0eSBsaW5lcworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGluZVswXSA9PSAnIyc6ICAjIElnbm9yZSBjb21tZW50cworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbGluZVswXSA9PSAnISc6ICAjIFByZWZpeCBuYW1lCisgICAgICAgICAgICBwcmVmaXhfbmFtZSA9IGxpbmVbMTpdCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBsaW5lWzBdID09ICclJzogICMgVmVyYmF0aW0gbGluZSBjb3B5CisgICAgICAgICAgICB2ZXJiYXRpbS5hcHBlbmQobGluZVsxOl0pCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIE11c3QgYmUgYSBmdW5jdGlvbiBzaWduYXR1cmUuCisgICAgICAgIG0gPSByZV9mdW5jLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiJWQ6ICclcyciICUgKGxpbmVubywgbGluZSkpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHJldHVybl90eXBlLCBmdW5jX25hbWUsIHBhcmFtZXRlcnMgPSBtLmdyb3VwcygpCisgICAgICAgIHJldHVybl90eXBlID0gcmV0dXJuX3R5cGUuc3RyaXAoKQorICAgICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5zdHJpcCgpCisgICAgICAgIHBhcmFtcyA9IFtdCisgICAgICAgIGZhaWx1cmUgPSBGYWxzZQorICAgICAgICBpZiBwYXJhbWV0ZXJzICE9ICJ2b2lkIjoKKyAgICAgICAgICAgIGZvciBwYXJhbWV0ZXIgaW4gcGFyYW1ldGVycy5zcGxpdCgnLCcpOgorICAgICAgICAgICAgICAgIHBhcmFtZXRlciA9IHBhcmFtZXRlci5zdHJpcCgpCisgICAgICAgICAgICAgICAgbSA9IHJlX3BhcmFtLm1hdGNoKHBhcmFtZXRlcikKKyAgICAgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiJWQ6IHBhcmFtZXRlciAnJXMnIiAlIChsaW5lbm8sIHBhcmFtZXRlcikpCisgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1fdHlwZSwgcGFyYW1fbmFtZSA9IG0uZ3JvdXBzKCkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgocGFyYW1fdHlwZS5zdHJpcCgpLCBwYXJhbV9uYW1lLnN0cmlwKCkpKQorCisgICAgICAgIGlmIG5vdCBmYWlsdXJlOgorICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoRW50cnkoZnVuY19uYW1lLCByZXR1cm5fdHlwZSwgcGFyYW1zKSkKKworICAgIHJldHVybiAoZW50cmllcywgcHJlZml4X25hbWUsIHZlcmJhdGltLCBlcnJvcnMpCisKKworZGVmIGdlbl9mdW5jdGlvbnNfaGVhZGVyKGVudHJpZXMsIHByZWZpeF9uYW1lLCB2ZXJiYXRpbSwgZmlsZW5hbWUsIHdpdGhfYXJncyk6CisgICAgIiIiR2VuZXJhdGUgYSBDIGhlYWRlciBjb250YWluaW5nIGEgbWFjcm8gbGlzdGluZyBhbGwgZW50cnkgcG9pbnRzLgorICAgICAgIHxlbnRyaWVzfCBpcyBhIGxpc3Qgb2YgRW50cnkgaW5zdGFuY2VzLgorICAgICAgIHxwcmVmaXhfbmFtZXwgaXMgYSBwcmVmaXgtbmFtZSwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdXBwZXItY2FzZS4KKyAgICAgICB8dmVyYmF0aW18IGlzIGEgbGlzdCBvZiB2ZXJiYXRpbSBsaW5lcyB0aGF0IG11c3QgYXBwZWFyIGJlZm9yZSB0aGUKKyAgICAgICBtYWNybyBkZWNsYXJhdGlvbi4gVXNlZnVsIHRvIGluc2VydCAjaW5jbHVkZSA8PiBzdGF0ZW1lbnRzLgorICAgICAgIHxmaWxlbmFtZXwgaXMgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGZpbGUuCisgICAgIiIiCisgICAgcHJlZml4X25hbWUgPSBwcmVmaXhfbmFtZS51cHBlcigpCisKKyAgICBwcmludCAiLy8gQXV0by1nZW5lcmF0ZWQgd2l0aDogJXMiICUgYmFubmVyX2NvbW1hbmQoc3lzLmFyZ3YpCisgICAgcHJpbnQgIi8vIERPIE5PVCBFRElUIFRISVMgRklMRSIKKyAgICBwcmludCAiIgorICAgIHByaW50ICIjaWZuZGVmICVzX0ZVTkNUSU9OU19IIiAlIHByZWZpeF9uYW1lCisgICAgcHJpbnQgIiNkZWZpbmUgJXNfRlVOQ1RJT05TX0giICUgcHJlZml4X25hbWUKKyAgICBwcmludCAiIgorICAgIGZvciBsaW5lIGluIHZlcmJhdGltOgorICAgICAgICBwcmludCBsaW5lCisKKyAgICBwcmludCAiI2RlZmluZSBMSVNUXyVzX0ZVTkNUSU9OUyhYKSBcXCIgJSBwcmVmaXhfbmFtZQorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBpZiB3aXRoX2FyZ3M6CisgICAgICAgICAgICBwcmludCAiICBYKCVzLCAlcywgKCVzKSwgKCVzKSkgXFwiICUgXAorICAgICAgICAgICAgICAgICAgICAoZW50cnkucmV0dXJuX3R5cGUsIGVudHJ5LmZ1bmNfbmFtZSwgZW50cnkucGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmNhbGwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiICBYKCVzLCAlcywgKCVzKSkgXFwiICUgXAorICAgICAgICAgICAgICAgICAgICAoZW50cnkucmV0dXJuX3R5cGUsIGVudHJ5LmZ1bmNfbmFtZSwgZW50cnkucGFyYW1ldGVycykKKworICAgIHByaW50ICIiCisgICAgcHJpbnQgIiIKKyAgICBwcmludCAiI2VuZGlmICAvLyAlc19GVU5DVElPTlNfSCIgJSBwcmVmaXhfbmFtZQorCisKK2RlZiBnZW5fZGxsX3dyYXBwZXIoZW50cmllcywgcHJlZml4X25hbWUsIHZlcmJhdGltLCBmaWxlbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBDIHNvdXJjZSBmaWxlIHRoYXQgY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgYWN0IGFzIHdyYXBwZXJzCisgICAgICAgZm9yIGVudHJ5IHBvaW50cyBsb2NhdGVkIGluIGFub3RoZXIgc2hhcmVkIGxpYnJhcnkuIFRoaXMgYWxsb3dzIHRoZQorICAgICAgIGNvZGUgdGhhdCBjYWxscyB0aGVzZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSBsYXp5LWxpbmtpbmcgdG8gc3lzdGVtCisgICAgICAgbGlicmFyaWVzLgorICAgICAgIHxlbnRyaWVzfCwgfHByZWZpeF9uYW1lfCwgfHZlcmJhdGltfCBhbmQgfGZpbGVuYW1lfCBhcmUgdGhlIHNhbWUgYXMKKyAgICAgICBmb3IgZ2VuX2Z1bmN0aW9uc19oZWFkZXIoKSBhYm92ZS4KKyAgICAiIiIKKyAgICB1cHBlcl9uYW1lID0gcHJlZml4X25hbWUudXBwZXIoKQorCisgICAgRU5UUllfUFJFRklYID0gIl9fZGxsXyIKKworICAgIHByaW50ICIvLyBBdXRvLWdlbmVyYXRlZCB3aXRoOiAlcyIgJSBiYW5uZXJfY29tbWFuZChzeXMuYXJndikKKyAgICBwcmludCAiLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFIgorICAgIHByaW50ICIiCisgICAgcHJpbnQgIiNpbmNsdWRlIDxkbGZjbi5oPiIKKyAgICBmb3IgbGluZSBpbiB2ZXJiYXRpbToKKyAgICAgICAgcHJpbnQgbGluZQorCisgICAgcHJpbnQgIiIKKyAgICBwcmludCAiLy8vIgorICAgIHByaW50ICIvLy8gIFcgUiBBIFAgUCBFIFIgICBQIE8gSSBOIFQgRSBSIFMiCisgICAgcHJpbnQgIi8vLyIKKyAgICBwcmludCAiIgorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBwdHJfbmFtZSA9IEVOVFJZX1BSRUZJWCArIGVudHJ5LmZ1bmNfbmFtZQorICAgICAgICBwcmludCAic3RhdGljICVzICgqJXMpKCVzKSA9IDA7IiAlIFwKKyAgICAgICAgICAgICAgICAoZW50cnkucmV0dXJuX3R5cGUsIHB0cl9uYW1lLCBlbnRyeS5wYXJhbWV0ZXJzKQorCisgICAgcHJpbnQgIiIKKyAgICBwcmludCAiLy8vIgorICAgIHByaW50ICIvLy8gIFcgUiBBIFAgUCBFIFIgICBGIFUgTiBDIFQgSSBPIE4gUyIKKyAgICBwcmludCAiLy8vIgorICAgIHByaW50ICIiCisKKyAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgcHJpbnQgIiVzICVzKCVzKSB7IiAlIFwKKyAgICAgICAgICAgICAgICAoZW50cnkucmV0dXJuX3R5cGUsIGVudHJ5LmZ1bmNfbmFtZSwgZW50cnkucGFyYW1ldGVycykKKyAgICAgICAgcHRyX25hbWUgPSBFTlRSWV9QUkVGSVggKyBlbnRyeS5mdW5jX25hbWUKKyAgICAgICAgaWYgZW50cnkucmV0dXJuX3R5cGUgIT0gInZvaWQiOgorICAgICAgICAgICAgcHJpbnQgIiAgcmV0dXJuICVzKCVzKTsiICUgKHB0cl9uYW1lLCBlbnRyeS5jYWxsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIiAgJXMoJXMpOyIgJSAocHRyX25hbWUsIGVudHJ5LmNhbGwpCisgICAgICAgIHByaW50ICJ9XG4iCisKKyAgICBwcmludCAiIgorICAgIHByaW50ICIvLy8iCisgICAgcHJpbnQgIi8vLyAgSSBOIEkgVCBJIEEgTCBJIFogQSBUIEkgTyBOICAgRiBVIE4gQyBUIEkgTyBOIgorICAgIHByaW50ICIvLy8iCisgICAgcHJpbnQgIiIKKworICAgIHByaW50ICJpbnQgJXNfZHlubGlua19pbml0KHZvaWQqIGxpYikgeyIgJSBwcmVmaXhfbmFtZQorICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICBwdHJfbmFtZSA9IEVOVFJZX1BSRUZJWCArIGVudHJ5LmZ1bmNfbmFtZQorICAgICAgICBwcmludCAiICAlcyA9ICglcygqKSglcykpZGxzeW0obGliLCBcIiVzXCIpOyIgJSBcCisgICAgICAgICAgICAgICAgKHB0cl9uYW1lLAorICAgICAgICAgICAgICAgICBlbnRyeS5yZXR1cm5fdHlwZSwKKyAgICAgICAgICAgICAgICAgZW50cnkucGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgZW50cnkuZnVuY19uYW1lKQorICAgICAgICBwcmludCAiICBpZiAoISVzKSByZXR1cm4gLTE7IiAlIHB0cl9uYW1lCisgICAgcHJpbnQgIiAgcmV0dXJuIDA7IgorICAgIHByaW50ICJ9IgorCisKK2RlZiBnZW5fd2luZG93c19kZWZfZmlsZShlbnRyaWVzKToKKyAgICAiIiJHZW5lcmF0ZSBhIHdpbmRvd3MgRExMIC5kZWYgZmlsZS4gfGVudHJpZXN8IGlzIGEgbGlzdCBvZiBFbnRyeSBpbnN0YW5jZXMuCisgICAgIiIiCisgICAgcHJpbnQgIkVYUE9SVFMiCisgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgIHByaW50ICIgICAgJXMiICUgZW50cnkuZnVuY19uYW1lCisKKworZGVmIGdlbl91bml4X3N5bV9maWxlKGVudHJpZXMpOgorICAgICIiIkdlbmVyYXRlIGFuIEVMRiBsaW5rZXIgdmVyc2lvbiBmaWxlLiB8ZW50cmllc3wgaXMgYSBsaXN0IG9mIEVudHJ5CisgICAgICAgaW5zdGFuY2VzLgorICAgICIiIgorICAgIHByaW50ICJWRVJTSU9OIHsiCisgICAgcHJpbnQgIlx0Z2xvYmFsOiIKKyAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgcHJpbnQgIlx0XHQlczsiICUgZW50cnkuZnVuY19uYW1lCisgICAgcHJpbnQgIlx0bG9jYWw6IgorICAgIHByaW50ICJcdFx0KjsiCisgICAgcHJpbnQgIn07IgorCitkZWYgZ2VuX3N5bWJvbHMoZW50cmllcywgdW5kZXJzY29yZSk6CisgICAgIiIiR2VuZXJhdGUgYSBsaXN0IG9mIHN5bWJvbHMgZnJvbSB8ZW50cmllc3wsIGEgbGlzdCBvZiBFbnRyeSBpbnN0YW5jZXMuCisgICAgICAgfHVuZGVyc2NvcmV8IGlzIGEgYm9vbGVhbi4gSWYgVHJ1ZSwgdGhlbiBwcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8gZWFjaAorICAgICAgIHN5bWJvbCBuYW1lLgorICAgICIiIgorICAgIHByZWZpeCA9ICIiCisgICAgaWYgdW5kZXJzY29yZToKKyAgICAgICAgcHJlZml4ID0gIl8iCisgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgIHByaW50ICIlcyVzIiAlIChwcmVmaXgsIGVudHJ5LmZ1bmNfbmFtZSkKKworZGVmIHBhcnNlX2ZpbGUoZmlsZW5hbWUsIGxpbmVzLCBtb2RlKToKKyAgICAiIiJHZW5lcmF0ZSBvbmUgb2YgcG9zc2libGUgb3V0cHV0cyBmcm9tIHxmaWxlbmFtZXwuIHxsaW5lc3wgbXVzdCBiZSBhIGxpc3QKKyAgICAgICBvZiB0ZXh0IGxpbmVzIGZyb20gdGhlIGZpbGUsIGFuZCB8bW9kZXwgaXMgb25lIG9mIHRoZSAtLW1vZGUgb3B0aW9uCisgICAgICAgdmFsdWVzLgorICAgICIiIgorICAgIGVudHJpZXMsIHByZWZpeF9uYW1lLCB2ZXJiYXRpbSwgZXJyb3JzID0gcGFyc2VfZW50cmllc19maWxlKGxpbmVzKQorICAgIGlmIGVycm9yczoKKyAgICAgICAgZm9yIGVycm9yIGluIGVycm9yczoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJFUlJPUjogJXM6JXMiICUgKGZpbGVuYW1lLCBlcnJvcikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIG5vdCBwcmVmaXhfbmFtZToKKyAgICAgICAgcHJlZml4X25hbWUgPSAidW5rbm93biIKKworICAgIGlmIG1vZGUgPT0gJ2RlZic6CisgICAgICAgIGdlbl93aW5kb3dzX2RlZl9maWxlKGVudHJpZXMpCisgICAgZWxpZiBtb2RlID09ICdzeW0nOgorICAgICAgICBnZW5fdW5peF9zeW1fZmlsZShlbnRyaWVzKQorICAgIGVsaWYgbW9kZSA9PSAnd3JhcHBlcic6CisgICAgICAgIGdlbl9kbGxfd3JhcHBlcihlbnRyaWVzLCBwcmVmaXhfbmFtZSwgdmVyYmF0aW0sIGZpbGVuYW1lKQorICAgIGVsaWYgbW9kZSA9PSAnc3ltYm9scyc6CisgICAgICAgIGdlbl9zeW1ib2xzKGVudHJpZXMsIEZhbHNlKQorICAgIGVsaWYgbW9kZSA9PSAnX3N5bWJvbHMnOgorICAgICAgICBnZW5fc3ltYm9scyhlbnRyaWVzLCBUcnVlKQorICAgIGVsaWYgbW9kZSA9PSAnZnVuY3Rpb25zJzoKKyAgICAgICAgZ2VuX2Z1bmN0aW9uc19oZWFkZXIoZW50cmllcywgcHJlZml4X25hbWUsIHZlcmJhdGltLCBmaWxlbmFtZSwgRmFsc2UpCisgICAgZWxpZiBtb2RlID09ICdmdW5jYXJncyc6CisgICAgICAgIGdlbl9mdW5jdGlvbnNfaGVhZGVyKGVudHJpZXMsIHByZWZpeF9uYW1lLCB2ZXJiYXRpbSwgZmlsZW5hbWUsIFRydWUpCisKKworIyBMaXN0IG9mIHZhbGlkIC0tbW9kZSBvcHRpb24gdmFsdWVzLgorbW9kZV9saXN0ID0gWworICAgICdkZWYnLCAnc3ltJywgJ3dyYXBwZXInLCAnc3ltYm9scycsICdfc3ltYm9scycsICdmdW5jdGlvbnMnLCAnZnVuY2FyZ3MnCitdCisKKyMgQXJndW1lbnQgcGFyc2luZy4KK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAorICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIsCisgICAgZGVzY3JpcHRpb249IiIiXAorQSBzY3JpcHQgdXNlZCB0byBwYXJzZSBhbiAuZW50cmllcyBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGZ1bmN0aW9uCitkZWNsYXJhdGlvbnMsIGFuZCBnZW5lcmF0ZSB2YXJpb3VzIG91dHB1dCBmaWxlcyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCit0aGUgLS1tb2RlIG9wdGlvbiwgd2hpY2ggY2FuIGJlOgorCisgIGRlZiAgICAgICAgR2VuZXJhdGUgYSB3aW5kb3dzIERMTCAuZGVmIGZpbGUuCisgIHN5bSAgICAgICAgR2VuZXJhdGUgYSBVbml4IC5zbyBsaW5rZXIgc2NyaXB0LgorICB3cmFwcGVyICAgIEdlbmVyYXRlIGEgQyBzb3VyY2UgZmlsZSBjb250YWluaW5nIHdyYXBwZXIgZnVuY3Rpb25zLgorICBzeW1ib2xzICAgIEdlbmVyYXRlIGEgc2ltcGxlIGxpc3Qgb2Ygc3ltYm9scywgb25lIHBlciBsaW5lLgorICBfc3ltYm9scyAgIEdlbmVyYXRlIGEgc2ltcGxlIGxpc3Qgb2Ygc3ltYm9scywgcHJlZml4ZWQgd2l0aCBfLgorICBmdW5jdGlvbnMgIEdlbmVyYXRlIGEgQyBoZWFkZXIgY29udGFpbmluZyBhIG1hY3JvIGxpc3RpbmcgYWxsIGZ1bmN0aW9ucy4KKyAgZnVuY2FyZ3MgICBMaWtlICdmdW5jdGlvbnMnLCBidXQgYWRkcyBmdW5jdGlvbiBjYWxsIGFyZ3VtZW50cyB0byBsaXN0aW5nLgorCisiIiIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCItLW1vZGUiLCBoZWxwPSJPdXRwdXQgbW9kZSIsIGNob2ljZXM9bW9kZV9saXN0KQorcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1vdXRwdXQiLCBoZWxwPSJvdXRwdXQgZmlsZSIpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJmaWxlIiwgaGVscD0iLmVudHJpZXMgZmlsZSBwYXRoIikKKworYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworaWYgbm90IGFyZ3MubW9kZToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiRVJST1I6IFBsZWFzZSB1c2UgLS1tb2RlPTxuYW1lPiwgc2VlIC0taGVscC4iCisgICAgc3lzLmV4aXQoMSkKKworaWYgYXJncy5vdXRwdXQ6CisgICAgc3lzLnN0ZG91dCA9IG9wZW4oYXJncy5vdXRwdXQsICJ3KyIpCisKK2lmIGFyZ3MuZmlsZSA9PSAnLS0nOgorICAgIHBhcnNlX2ZpbGUoIjxzdGRpbj4iLCBzeXMuc3RkaW4sIGFyZ3MubW9kZSkKK2Vsc2U6CisgICAgcGFyc2VfZmlsZShhcmdzLmZpbGUsIG9wZW4oYXJncy5maWxlKSwgYXJncy5tb2RlKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL2dlbi1ody1jb25maWcucHkgYi9hbmRyb2lkL3NjcmlwdHMvZ2VuLWh3LWNvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xY2ZjNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL2dlbi1ody1jb25maWcucHkKQEAgLTAsMCArMSwxNjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisjIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIHRoaXMgc2NyaXB0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgJ2FuZHJvaWQvYXZkL2h3LWNvbmZpZy5oJyBieQorIyBwYXJzaW5nICdhbmRyb2lkL2F2ZC9oYXJkd2FyZS1wcm9wZXJ0aWVzLmluaScKKyMKKyMKK2ltcG9ydCAgc3lzLCBvcywgc3RyaW5nLCByZQorCisjIGxvY2F0aW9uIG9mIHNvdXJjZSBmaWxlLCByZWxhdGl2ZSB0byBjdXJyZW50IHByb2dyYW0gZGlyZWN0b3J5CityZWxhdGl2ZVNvdXJjZVBhdGggPSAiLi4vYXZkL2hhcmR3YXJlLXByb3BlcnRpZXMuaW5pIgorCisjIGxvY2F0aW9uIG9mIHRhcmdldCBmaWxlLCByZWxhdGl2ZSB0byBjdXJyZW50IHByb2dyYW0gZGlyZWN0b3J5CityZWxhdGl2ZVRhcmdldFBhdGggPSAiLi4vYXZkL2h3LWNvbmZpZy1kZWZzLmgiCisKK2RlZiBxdW90ZVN0cmluZ0ZvckMoc3RyKToKKyAgICAiIiJxdW90ZSBhIHN0cmluZyBzbyBpdCBjYW4gYmUgdXNlZCBpbiBDIiIiCisgICAgcmV0dXJuICdcXCInLmpvaW4oJyInK3ArJyInIGZvciBwIGluIHN0ci5zcGxpdCgnIicpKQorCisjIGEgZGljdGlvbmFyeSB0aGF0IG1hcHMgaXRlbSB0eXBlcyBhcyB0aGV5IGFwcGVhciBpbiB0aGUgLmluaQorIyBmaWxlIGludG8gbWFjcm8gbmFtZXMgaW4gdGhlIGdlbmVyYXRlZCBDIGhlYWRlcgorIwordHlwZXNUb01hY3JvcyA9IHsKKyAgICAnaW50ZWdlcic6ICdIV0NGR19JTlQnLAorICAgICdzdHJpbmcnOiAnSFdDRkdfU1RSSU5HJywKKyAgICAnYm9vbGVhbic6ICdIV0NGR19CT09MJywKKyAgICAnZGlza1NpemUnOiAnSFdDRkdfRElTS1NJWkUnLAorICAgICdkb3VibGUnOiAnSFdDRkdfRE9VQkxFJworICAgIH0KKworIyB0aGUgbGlzdCBvZiBtYWNybyBuYW1lcworbWFjcm9OYW1lcyA9IHR5cGVzVG9NYWNyb3MudmFsdWVzKCkKKworIyB0YXJnZXQgcHJvZ3JhbSBoZWFkZXIKK3RhcmdldEhlYWRlciA9ICIiIlwKKy8qIHRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tICdoYXJkd2FyZS1wcm9wZXJ0aWVzLmluaScKKyAqIERPIE5PVCBFRElUIElULiBUbyByZS1nZW5lcmF0ZSBpdCwgdXNlIGFuZHJvaWQvc2NyaXB0cy9nZW4taHctY29uZmlnLnB5JworICovCisiIiIKKworIyBsb2NhdGUgc291cmNlIGFuZCB0YXJnZXQKK3Byb2dyYW1EaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCitpZiBsZW4oc3lzLmFyZ3YpICE9IDM6CisgICAgcHJpbnQgIlVzYWdlOiAlcyBzb3VyY2UgdGFyZ2V0XG4iICUgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICBzeXMuZXhpdCgxKQorCitzb3VyY2VGaWxlID0gc3lzLmFyZ3ZbMV0KK3RhcmdldEZpbGUgPSBzeXMuYXJndlsyXQorCisjIHBhcnNlIHRoZSBzb3VyY2UgZmlsZSBhbmQgcmVjb3JkIGl0ZW1zCisjIEkgd291bGQgbG92ZSB0byB1c2UgUHl0aG9uJ3MgQ29uZmlnUGFyc2VyLCBidXQgaXQgZG9lc24ndAorIyBzdXBwb3J0IGZpbGVzIHdpdGhvdXQgc2VjdGlvbnMsIG9yIG11bHRpcGx5IGRlZmluZWQgaXRlbXMKKyMKK2l0ZW1zICAgID0gW10KK2xhc3RJdGVtID0gTm9uZQorCitjbGFzcyBJdGVtOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZQorICAgICAgICBzZWxmLnR5cGUgICAgID0gdHlwZQorICAgICAgICBzZWxmLmRlZmF1bHQgID0gTm9uZQorICAgICAgICBzZWxmLmFic3RyYWN0ID0gIiIKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICIiCisgICAgICAgIHNlbGYuZW51bV92YWx1ZXMgPSBbXQorCisgICAgZGVmIGFkZChzZWxmLGtleSx2YWwpOgorICAgICAgICBpZiBrZXkgPT0gJ3R5cGUnOgorICAgICAgICAgICAgc2VsZi50eXBlID0gdmFsCisgICAgICAgIGVsaWYga2V5ID09ICdlbnVtJzoKKyAgICAgICAgICAgICMgQnVpbGQgbGlzdCBvZiBlbnVtZXJhdGVkIHZhbHVlcworICAgICAgICAgICAgc2VsZi5lbnVtX3ZhbHVlcyA9IFsgcy5zdHJpcCgpIGZvciBzIGluIHZhbC5zcGxpdCgnLCcpIF0KKyAgICAgICAgICAgICMgSWYgZGVmYXVsdCB2YWx1ZSBoYXMgYmVlbiBhbHJlYWR5IHNldCwgbWFrZSBzdXJlIGl0J3MgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdCBhbmQgbm90IHNlbGYuZGVmYXVsdCBpbiBzZWxmLmVudW1fdmFsdWVzOgorICAgICAgICAgICAgICAgIHByaW50ICJQcm9wZXJ0eSAnIiArIHNlbGYubmFtZSArICInOiBEZWZhdWx0IHZhbHVlICciICsgc2VsZi5kZWZhdWx0ICsgIicgaXMgbWlzc2luZyBpbiBlbnVtOiAiLAorICAgICAgICAgICAgICAgIHByaW50IHNlbGYuZW51bV92YWx1ZXMsCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgZWxpZiBrZXkgPT0gJ2RlZmF1bHQnOgorICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGFuIGVudW0sIG1ha2Ugc3VyZSB0aGF0IGRlZmF1bHQgdmFsdWUgaXMgaW4gdGhlIGxpc3QuCisgICAgICAgICAgICBpZiB2YWwgYW5kIHNlbGYuZW51bV92YWx1ZXMgYW5kIG5vdCB2YWwgaW4gc2VsZi5lbnVtX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBwcmludCAiUHJvcGVydHkgJyIgKyBzZWxmLm5hbWUgKyAiJzogRGVmYXVsdCB2YWx1ZSAnIiArIHZhbCArICInIGlzIG1pc3NpbmcgaW4gZW51bTogIiwKKyAgICAgICAgICAgICAgICBwcmludCBzZWxmLmVudW1fdmFsdWVzLAorICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdCA9IHZhbAorICAgICAgICBlbGlmIGtleSA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgc2VsZi5hYnN0cmFjdCA9IHZhbAorICAgICAgICBlbGlmIGtleSA9PSAnZGVzY3JpcHRpb24nOgorICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IHZhbAorCitmb3IgbGluZSBpbiBvcGVuKHNvdXJjZUZpbGUpOgorICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAjIGlnbm9yZSBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMKKyAgICBpZiBsZW4obGluZSkgPT0gMCBvciBsaW5lWzBdIGluICI7IyI6CisgICAgICAgIGNvbnRpbnVlCisgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJz0nKQorCisgICAga2V5ICAgPSBrZXkuc3RyaXAoKQorICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQorCisgICAgaWYga2V5ID09ICduYW1lJzoKKyAgICAgICAgaWYgbGFzdEl0ZW06IGl0ZW1zLmFwcGVuZChsYXN0SXRlbSkKKyAgICAgICAgbGFzdEl0ZW0gPSBJdGVtKHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIGxhc3RJdGVtLmFkZChrZXksIHZhbHVlKQorCitpZiBsYXN0SXRlbToKKyAgICBpdGVtcy5hcHBlbmQobGFzdEl0ZW0pCisKK2lmIHRhcmdldEZpbGUgPT0gJy0tJzoKKyAgICBvdXQgPSBzeXMuc3Rkb3V0CitlbHNlOgorICAgIG91dCA9IG9wZW4odGFyZ2V0RmlsZSwid2IiKQorCitvdXQud3JpdGUodGFyZ2V0SGVhZGVyKQorCisjIHdyaXRlIGd1YXJkcyB0byBwcmV2ZW50IGJhZCBjb21waWxlcworZm9yIG0gaW4gbWFjcm9OYW1lczoKKyAgICBvdXQud3JpdGUoIiIiXAorI2lmbmRlZiAlKG1hY3JvKXMKKyNlcnJvciAgJShtYWNybylzIG5vdCBkZWZpbmVkCisjZW5kaWYKKyIiIiAlIHsgJ21hY3JvJzptIH0pCitvdXQud3JpdGUoIlxuIikKKworZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgaWYgaXRlbS50eXBlID09IE5vbmU6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImlnbm9yaW5nIGNvbmZpZyBpdGVtIHdpdGggbm8gdHlwZSAnJXMnXG4iICUgaXRlbS5uYW1lKQorICAgICAgICBjb250aW51ZQorCisgICAgaWYgbm90IHR5cGVzVG9NYWNyb3MuaGFzX2tleShpdGVtLnR5cGUpOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJpZ25vcmluZyBjb25maWcgaXRlbSB3aXRoIHVua25vd24gdHlwZSAnJXMnOiAnJXMnXG4iICUgXAorICAgICAgICAgICAgICAgIChpdGVtLnR5cGUsIGl0ZW0ubmFtZSkpCisgICAgICAgIGNvbnRpbnVlCisKKyAgICBpZiBpdGVtLmRlZmF1bHQgPT0gTm9uZToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiaWdub3JpbmcgY29uZmlnIGl0ZW0gd2l0aCBubyBkZWZhdWx0ICclcycgKi8iICUgaXRlbS5uYW1lKQorICAgICAgICBjb250aW51ZQorCisgICAgIyBjb252ZXJ0IGRvdHMgaW50byB1bmRlcnNjb3JlcworICAgIHZhck1hY3JvICAgPSB0eXBlc1RvTWFjcm9zW2l0ZW0udHlwZV0KKyAgICB2YXJOYW1lU3RyID0gcXVvdGVTdHJpbmdGb3JDKGl0ZW0ubmFtZSkKKyAgICB2YXJOYW1lICAgID0gaXRlbS5uYW1lLnJlcGxhY2UoIi4iLCJfIikKKyAgICB2YXJEZWZhdWx0ID0gaXRlbS5kZWZhdWx0CisgICAgdmFyQWJzdHJhY3QgPSBxdW90ZVN0cmluZ0ZvckMoaXRlbS5hYnN0cmFjdCkKKyAgICB2YXJEZXNjICAgICA9IHF1b3RlU3RyaW5nRm9yQyhpdGVtLmRlc2NyaXB0aW9uKQorCisgICAgaWYgaXRlbS50eXBlIGluIFsgJ3N0cmluZycsICdib29sZWFuJywgJ2Rpc2tTaXplJyBdOgorICAgICAgICAjIHF1b3RlIGRlZmF1bHQgdmFsdWUgZm9yIHN0cmluZ3MKKyAgICAgICAgdmFyRGVmYXVsdCA9IHF1b3RlU3RyaW5nRm9yQyh2YXJEZWZhdWx0KQorCisgICAgb3V0LndyaXRlKCIlcyhcbiAgJXMsXG4gICVzLFxuICAlcyxcbiAgJXMsXG4gICVzKVxuXG4iICUgXAorICAgICAgICAgICAgKHZhck1hY3JvLHZhck5hbWUsdmFyTmFtZVN0cix2YXJEZWZhdWx0LHZhckFic3RyYWN0LHZhckRlc2MpKQorCisKK2ZvciBtIGluIG1hY3JvTmFtZXM6CisgICAgb3V0LndyaXRlKCIjdW5kZWYgJXNcbiIgJSBtKQorCitvdXQud3JpdGUoIi8qIGVuZCBvZiBhdXRvLWdlbmVyYXRlZCBmaWxlICovXG4iKQorb3V0LmNsb3NlKCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9nZW5lcmF0ZS1hbmRyb2lkLWljb25zLnNoIGIvYW5kcm9pZC9zY3JpcHRzL2dlbmVyYXRlLWFuZHJvaWQtaWNvbnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGM1MmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9nZW5lcmF0ZS1hbmRyb2lkLWljb25zLnNoCkBAIC0wLDAgKzEsMTA1IEBACisjIS9iaW4vc2gKKworUFJPR05BTUU9JChiYXNlbmFtZSAiJDAiKQorCisjIEEgbGl0dGxlIHNjcmlwdCB0byByZWdlbmVyYXRlIGFuZHJvaWQvaWNvbnMuaCBmcm9tIHRoZSBjb250ZW50IG9mIG9uZQorIyBvciBtb3JlIGZpbGVzLgorCitPUFRfSEVMUD0KKworRklMRVM9CisKK2RpZSAoKSB7CisgICAgZWNobyAiRVJST1I6ICRAIgorICAgIGV4aXQgMQorfQorCitmb3IgT1BUOyBkbworICAgIGNhc2UgJE9QVCBpbgorICAgICAgICAtLWhlbHB8LWh8LVw/KQorICAgICAgICAgICAgT1BUX0hFTFA9dHJ1ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgLSopCisgICAgICAgICAgICBkaWUgIkludmFsaWQgb3B0aW9uICRPUFQsIHNlZSAtLWhlbHAuIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi5wbmcpCisgICAgICAgICAgICBGSUxFUz0iJEZJTEVTICRPUFQiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgPiYyIGVjaG8gIldBUk5JTkc6IElnbm9yaW5nIG5vbi1wbmcgZmlsZTogJE9QVCIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitpZiBbICIkT1BUX0hFTFAiXTsgdGhlbgorICAgIGNhdCA8PEVPRgorVXNhZ2U6ICRQUk9HTkFNRSBbb3B0aW9uc10gaW1hZ2UxLnBuZyBbaW1hZ2UyLnBuZyAuLi5dCisKK1JlZ2VuZXJhdGUgdGhlIGNvbnRlbnQgb2YgYW5kcm9pZC9pY29ucy5oIGZyb20gYSBsaXN0IG9mIGZpbGVzLCB3aGljaAoraXMgdHlwaWNhbGx5IHRha2VuIGZyb20gaW1hZ2VzLy4gWW91IHdpbGwgbmVlZCB0aGUgJ3h4ZCcgdG9vbCBpbiB5b3VyIFBBVEguCisKK1R5cGljYWwgdXNhZ2UgaXM6CisKKyAgICRQUk9HTkFNRSBpbWFnZS8qLnBuZyA+IGFuZHJvaWQvaWNvbnMuaAorCitWYWxpZCBvcHRpb25zOgorICAgIC0taGVscHwtaHwtPyAgUHJpbnQgdGhpcyBtZXNzYWdlLgorCitFT0YKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgLXogIiRGSUxFUyIgXTsgdGhlbgorICAgIGRpZSAiUGxlYXNlIGdpdmUgYSBsaXN0IG9mIFBORyBmaWxlcyBhcyBhcmd1bWVudHMuIFNlZSAtLWhlbHAuIgorZmkKKworWFhEPSQod2hpY2ggeHhkIDI+L2Rldi9udWxsIHx8IHRydWUpCitpZiBbIC16ICIkWFhEIiBdOyB0aGVuCisgICAgZGllICJDb3VsZCBub3QgZmluZCAneHhkJyB0b29sIGluIHlvdXIgUEFUSC4gUGxlYXNlIGluc3RhbGwgaXQhIgorZmkKKworY2F0IDw8RU9GCisvKiBDb3B5cmlnaHQgJChkYXRlICslWSkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisvLyBETyBOT1QgRURJVAorCisvLyBBdXRvLWdlbmVyYXRlZCBvbiAkKGRhdGUgKyVZLSVtLSVkKSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKy8vICAgICAkMCAkQAorCitFT0YKKworZm9yIElNQUdFIGluICRGSUxFUzsgZG8KKyAgICBJTUFHRV9OQU1FPSQocHJpbnRmICIlcyIgIiRJTUFHRSIgfCB0ciAnLycgJ18nIHwgdHIgJy4nICdfJykKKyAgICBwcmludGYgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICVzW10gPSB7XG4iICIkSU1BR0VfTkFNRSIKKyAgICB4eGQgLWkgPCAkSU1BR0UKKyAgICBwcmludGYgIn07XG5cbiIKK2RvbmUKKworY2F0IDw8RU9GCitzdGF0aWMgY29uc3QgRmlsZUVudHJ5ICBfZmlsZV9lbnRyaWVzW10gPSB7CitFT0YKKworZm9yIElNQUdFIGluICRGSUxFUzsgZG8KKyAgICBJTUFHRV9OQU1FPSQocHJpbnRmICIlcyIgIiRJTUFHRSIgfCB0ciAnLycgJ18nIHwgdHIgJy4nICdfJykKKyAgICBjYXQgPDxFT0YKKyAgICB7CisgICAgICAgICIkKGJhc2VuYW1lICRJTUFHRSkiLAorICAgICAgICAkSU1BR0VfTkFNRSwKKyAgICAgICAgc2l6ZW9mKCRJTUFHRV9OQU1FKQorICAgIH0sCitFT0YKK2RvbmUKKworY2F0IDw8RU9GCit9OyAgLy8gIF9maWxlX2VudHJpZXNbXQorRU9GCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvbWlncmF0ZS1nbHVlLWNvZGUucHkgYi9hbmRyb2lkL3NjcmlwdHMvbWlncmF0ZS1nbHVlLWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI5M2RkMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9taWdyYXRlLWdsdWUtY29kZS5weQpAQCAtMCwwICsxLDE2MyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKKyMgU2V0IHRvIFRydWUgdG8gZW5hYmxlIGRlYnVnZ2luZy4KK0RFQlVHID0gRmFsc2UKKworZGVmIHByaW50X2ZpbGVzKGxpc3Rfb2ZfZmlsZXMsIG5hbWUpOgorICAgICIiIlByaW50IGEgbGlzdCBvZiBmaWxlcy4iIiIKKyAgICBwcmludCAiWyBTVEFSVCAlcyBdIiAlIG5hbWUKKyAgICBmb3IgYV9maWxlIGluIGxpc3Rfb2ZfZmlsZXM6CisgICAgICAgIHByaW50IGFfZmlsZQorICAgIHByaW50ICJbICAgRU5EICVzIF0iICUgbmFtZQorCitkZWYgZ2V0X3NjcmlwdF9kaXIoKToKKyAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgc2NyaXB0J3MgZGlyZWN0b3J5IGFzIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorCitkZWYgZ2V0X3NyY190b3BfZGlyKCk6CisgICAgIiIiUmV0dXJuIHRoZSB0b3AtbGV2ZWwgUUVNVTEgc291cmNlIHBhdGgsIGFzIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgc2NyaXB0X2RpciA9IGdldF9zY3JpcHRfZGlyKCkKKyAgICBhc3NlcnQgc2NyaXB0X2Rpci5lbmRzd2l0aCgiYW5kcm9pZC9zY3JpcHRzIikKKyAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzY3JpcHRfZGlyKSkKKworZGVmIGlzX3NvdXJjZV9maWxlbmFtZShuYW1lKToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgfG5hbWV8IGlzIGEgc291cmNlIG9yIGhlYWRlciBmaWxlbmFtZS4iIiIKKyAgICByZXR1cm4gYW55KG5hbWUuZW5kc3dpdGgoZXh0KSBmb3IgZXh0IGluIFsiLmMiLCAiLmNwcCIsICIuaCIsICIubSIsICIubW0iXSkKKworZGVmIHJlZ2V4X2VzY2FwZShzdHJpbmcpOgorICAgICIiIlJldHVybiBhbiBlc2NhcGVkIHZlcnNpb24gb2YgfHN0cmluZ3wgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBleGFjdAorICAgICAgIG1hdGNoIGluIGEgcmVndWxhciBleHByZXNzaW9uLiIiIgorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgnIicsICdcXCInKS5yZXBsYWNlKCcuJywgJ1xcLicpCisKK1JFX0lOQ0xVREVfQlJBQ0tFVFMgPSByZS5jb21waWxlKHIiXlxzKiNccyppbmNsdWRlXHMqPCguKik+IikKK1JFX0lOQ0xVREVfUVVPVEVTID0gcmUuY29tcGlsZShyIl5ccyojXHMqaW5jbHVkZVxzKlwiKC4qKVwiIikKKworZGVmIGdldF9zb3VyY2VfaW5jbHVkZXMoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBzb3VyY2UgZmlsZXMgaW5jbHVkZWQgZnJvbSB8ZmlsZW5hbWV8LiIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBsaW5lczoKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoJ1xuJykKKyAgICAgICAgICAgIG1hdGNoID0gUkVfSU5DTFVERV9CUkFDS0VUUy5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIG1hdGNoID0gUkVfSU5DTFVERV9RVU9URVMubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobWF0Y2guZ3JvdXAoMSkpCisKKyAgICByZXR1cm4gc29ydGVkKHJlc3VsdCkKKworUUVNVV9IRUFERVJTID0gWyJlbGYuaCIsICJxZW11LWNvbW1vbi5oIiwgInRyYWNlLmgiXQorUUVNVV9TVUJESVJTID0gWyJibG9jayIsICJkaXNhcyIsICJleGVjIiwgImZwdSIsICJodyIsICJtaWdyYXRpb24iLAorICAgICAgICAgICAgICAgICJtb25pdG9yIiwgIm5ldCIsICJxYXBpIiwgInFlbXUiLCAicW9tIiwgInN5c2VtdSIsICJ1aSJdCisKK2RlZiBpc19xZW11X2luY2x1ZGUoZmlsZXBhdGgpOgorICAgICIiIlJldHVybiBUcnVlIGlmZiB8ZmlsZXBhdGh8IGlzIGEgUUVNVSBoZWFkZXIgZmlsZSBuYW1lLiIiIgorICAgIGlmIGZpbGVwYXRoIGluIFFFTVVfSEVBREVSUzoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gYW55KGZpbGVwYXRoLnN0YXJ0c3dpdGgoeCArICIvIikgZm9yIHggaW4gUUVNVV9TVUJESVJTKQorCitkZWYgbWFpbigpOgorICAgICIiIgorICAgIEEgc2NyaXB0IHVzZWQgdG8gbWlncmF0ZSBzb3VyY2UgZmlsZXMgdGhhdCBkZXBlbmQgb24gUUVNVSBkZWNsYXJhdGlvbnMKKyAgICBmcm9tIGFuZHJvaWQvIHRvIGFuZHJvaWQtcWVtdTEtZ2x1ZS8uCisKKyAgICBUaGlzIHdvcmtzIGJ5OgorCisgICAgMSkgRmluZGluZyBhbGwgc291cmNlIGFuZCBoZWFkZXIgZmlsZXMgdW5kZXIgYW5kcm9pZC8gdGhhdCBpbmNsdWRlCisgICAgUUVNVS1zcGVjaWZpYyBoZWFkZXJzIChlLmcuICJxZW11LWNvbW1vbi5oIiwgInFlbXUvPHNvbWV0aGluZz4iKQorCisgICAgMikgQ29tcHV0ZSB0aGUgY2xvc3VyZSBvZiBhbGwgb3RoZXIgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBhbnkgb2YgdGhvc2UKKyAgICBmb3VuZCBkdXJpbmcgMSkKKworICAgIDMpIE1vdmUgYWxsIHN1Y2ggc291cmNlcyBpbnRvIGFuZHJvaWQtcWVtdTEtZ2x1ZS8sIGFkanVzdGluZyBzb3VyY2UgYW5kCisgICAgYnVpbGQgZmlsZXMgYWNjb3JkaW5nbHkuCisgICAgIiIiCisKKyAgICBzcmNfc3ViZGlyID0gImFuZHJvaWQiCisgICAgZHN0X3N1YmRpciA9ICJhbmRyb2lkLXFlbXUxLWdsdWUiCisKKyAgICBxZW11X3RvcF9kaXIgPSBnZXRfc3JjX3RvcF9kaXIoKQorICAgIGFuZHJvaWRfZGlyID0gb3MucGF0aC5qb2luKHFlbXVfdG9wX2Rpciwgc3JjX3N1YmRpcikKKworICAgICMgU3RlcCBBOiBHZXQgYWxsIHNvdXJjZSBmaWxlcyBhbmQgdGhlaXIgaW5jbHVkZXMgZnJvbSBhbmRyb2lkLworICAgIGFsbF9pbmNsdWRlcyA9IHt9CisKKyAgICBmb3IgZGlycGF0aCwgXywgZmlsZW5hbWVzIGluIG9zLndhbGsocWVtdV90b3BfZGlyKToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIFtmIGZvciBmIGluIGZpbGVuYW1lcyBpZiBpc19zb3VyY2VfZmlsZW5hbWUoZildOgorICAgICAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZmlsZW5hbWUpCisgICAgICAgICAgICBhbGxfaW5jbHVkZXNbZmlsZXBhdGhdID0gZ2V0X3NvdXJjZV9pbmNsdWRlcyhmaWxlcGF0aCkKKworICAgIGFuZHJvaWRfc291cmNlcyA9IHNldChbeCBmb3IgeCBpbiBhbGxfaW5jbHVkZXMua2V5cygpIGlmIFwKKyAgICAgICAgeC5zdGFydHN3aXRoKGFuZHJvaWRfZGlyKV0pCisKKyAgICBpZiBERUJVRzoKKyAgICAgICAgc291cmNlcyA9IFsiJXM6ICVzIiAlIChzcmMsIGFsbF9pbmNsdWRlc1tzcmNdKSBmb3Igc3JjIGluIFwKKyAgICAgICAgICAgIHNvcnRlZChhbmRyb2lkX3NvdXJjZXMpXQorICAgICAgICBwcmludF9maWxlcyhzb3VyY2VzLCAiQW5kcm9pZCBzb3VyY2UgZmlsZXMiKQorCisgICAgIyBTdGVwIEI6IERldGVybWluZSB3aGljaCBzb3VyY2UgZmlsZXMgaW5jbHVkZSBRRU1VLXNwZWNpZmljIGhlYWRlcnMuCisKKyAgICBxZW11X2RlcGVuZHMgPSBzZXQoKQorICAgIGZvciBmaWxlcGF0aCBpbiBhbmRyb2lkX3NvdXJjZXM6CisgICAgICAgIGZvciBpbmNsdWRlIGluIGFsbF9pbmNsdWRlc1tmaWxlcGF0aF06CisgICAgICAgICAgICBpZiBpc19xZW11X2luY2x1ZGUoaW5jbHVkZSk6CisgICAgICAgICAgICAgICAgcWVtdV9kZXBlbmRzLmFkZChmaWxlcGF0aCkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgaWYgREVCVUc6CisgICAgICAgIHByaW50X2ZpbGVzKHNvcnRlZChxZW11X2RlcGVuZHMpLCAiRmlyc3QgUUVNVSBkZXBlbmRzIikKKworICAgICMgU3RlcCBDOiBDb21wdXRlIGNsb3N1cmUgb2YgYWxsIFFFTVUgZGVwZW5kcyBzb3VyY2VzLgorCisgICAgcmV0cnkgPSBUcnVlCisgICAgd2hpbGUgcmV0cnk6CisgICAgICAgIHJldHJ5ID0gRmFsc2UKKyAgICAgICAgZm9yIHNyYyBpbiBhbGxfaW5jbHVkZXMua2V5cygpOgorICAgICAgICAgICAgaWYgc3JjIGluIHFlbXVfZGVwZW5kczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgI3ByaW50ICI/ICIgKyBzcmMKKyAgICAgICAgICAgIGZvciBpbmNsdWRlIGluIGdldF9zb3VyY2VfaW5jbHVkZXMoc3JjKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaW5jbHVkZS5zdGFydHN3aXRoKHNyY19zdWJkaXIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGluY2x1ZGVfcGF0aCA9IG9zLnBhdGguam9pbihxZW11X3RvcF9kaXIsIGluY2x1ZGUpCisgICAgICAgICAgICAgICAgI3ByaW50ICI/PyAlcyAtPiAlcyIgJSAoaW5jbHVkZSwgaW5jbHVkZV9wYXRoKQorICAgICAgICAgICAgICAgIGlmIGluY2x1ZGVfcGF0aCBpbiBxZW11X2RlcGVuZHM6CisgICAgICAgICAgICAgICAgICAgICNwcmludCAiXG4hICIgKyBzcmMKKyAgICAgICAgICAgICAgICAgICAgcWVtdV9kZXBlbmRzLmFkZChzcmMpCisgICAgICAgICAgICAgICAgICAgIHJldHJ5ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgcWVtdV9kZXBlbmRzID0gc29ydGVkKHFlbXVfZGVwZW5kcykKKworICAgIGlmIERFQlVHOgorICAgICAgICBwcmludF9maWxlcyhxZW11X2RlcGVuZHMsICJBbGwgUUVNVSBkZXBlbmRzIikKKworICAgICMgU3RlcCBEOiBQcmludCBjb21tYW5kcyB0byBtb3ZlIGFuZCByZW5hbWUgZmlsZXMgZnJvbSBzcmNfZGlyIGludG8gZHN0X2RpcgorICAgIHJlbmFtZXMgPSB7fQorICAgIGZvciBmaWxlcGF0aCBpbiBxZW11X2RlcGVuZHM6CisgICAgICAgIGlmIG5vdCBmaWxlcGF0aC5zdGFydHN3aXRoKGFuZHJvaWRfZGlyKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHNyY19zdWJwYXRoID0gZmlsZXBhdGhbbGVuKGFuZHJvaWRfZGlyKSArIDE6XQorICAgICAgICBzcmNfcGF0aCA9IHNyY19zdWJkaXIgKyAnLycgKyBzcmNfc3VicGF0aAorICAgICAgICBkc3RfcGF0aCA9IGRzdF9zdWJkaXIgKyAnLycgKyBzcmNfc3VicGF0aAorICAgICAgICByZW5hbWVzW3NyY19wYXRoXSA9IGRzdF9wYXRoCisKKyAgICBkc3RfZGlycyA9IHNldCgpCisgICAgZm9yIGRzdF9wYXRoIGluIHJlbmFtZXMudmFsdWVzKCk6CisgICAgICAgIGRzdF9kaXJzLmFkZChvcy5wYXRoLmRpcm5hbWUoZHN0X3BhdGgpKQorCisgICAgZm9yIGRzdF9kaXIgaW4gc29ydGVkKGRzdF9kaXJzKToKKyAgICAgICAgcHJpbnQgIm1rZGlyIC1wICVzIiAlIChkc3RfZGlyKQorCisgICAgZm9yIGtleSwgdmFsdWUgaW4gcmVuYW1lcy5pdGVyaXRlbXMoKToKKyAgICAgICAgcHJpbnQgImdpdCBtdiAlcyAlcyIgJSAoa2V5LCB2YWx1ZSkKKworICAgIGZvciBrZXksIHZhbHVlIGluIHJlbmFtZXMuaXRlcml0ZW1zKCk6CisgICAgICAgIHByaW50ICJnaXQgZ3JlcCAtbCAtRiBcIiVzXCIgfCB4YXJncyBzZWQgLWkgLWUgJ3N8JXN8JXN8ZyciICUgXAorICAgICAgICAgICAgICAgIChrZXksIHJlZ2V4X2VzY2FwZShrZXkpLCB2YWx1ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy9vZmZzZXRfbGF5b3V0LnB5IGIvYW5kcm9pZC9zY3JpcHRzL29mZnNldF9sYXlvdXQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmMyZjg3OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9vZmZzZXRfbGF5b3V0LnB5CkBAIC0wLDAgKzEsMTExIEBACisjIS91c3IvYmluL3B5dGhvbgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBnZXRvcHQKKworRFggPSBEWSA9IFBYID0gUFkgPSBLWCA9IEtZID0gMAorCitfUkVfTElORSA9IHJlLmNvbXBpbGUoIl5ccyooP1A8a2V5d29yZD5bXHctXSspXHMre1xzKiQiKQorX1JFX1hZID0gcmUuY29tcGlsZSgiXig/UDxzdGFydD5ccyopKD9QPHh5Plt4fHldXHMrKSg/UDxudW0+XGQrKSg/UDxlbmQ+XHMqKSQiKQorCitkZWYgbWFpbigpOgorICBQYXJzZUFyZ3MoKQorICBQYXJzZUlucHV0KCkKKworZGVmIFVzYWdlKCk6CisgIHByaW50ID4+c3lzLnN0ZGVyciwgIiIiCisgIFVzYWdlOiAlcyAtLWR4IG9mZnNldC14LWRpc3BsYXkgLS1keSBvZmZzZXQteS1kaXNwbGF5IC0tcHggb2Zmc2V0LXgtcGhvbmUtYnV0dG9ucyAtLXB5IG9mZnNldC15LXBob25lLWJ1dHRvbnMgLS1reCBvZmZzZXQteC1rZXlib2FyZCAtLWt5IG9mZnNldC15LWtleWJvYXJkIDwgbGF5b3V0ID4gbGF5b3V0Mi4KKworICBVbnNwZWNpZmllZCBvZmZzZXRzIGRlZmF1bHQgdG8gMCAodW5jaGFuZ2VkKS4KKyAgUmVhZHMgZnJvbSBzdGRpbiwgb3V0cHV0cyB0byBzdGRvdXQuCisgIFBob25lIGJ1dHRvbnM6IHNvZnQtbGVmdC90b3AvcmlnaC9ib3R0b20sIGhvbWUsIGRwYWQsIGRpYWwsIHBvd2VyLCBldGMuCisgIEtleWJvYXJkIGlzIHRoZSBzb2Z0IGtleWJvYXJkLgorCisgIElmIHlvdXIgc2hlbGwgZG9lc24ndCBsZXQgeW91IHVzZSBuZWdhdGl2ZSBpbnRlZ2VycywgdXNlIF8gZm9yIG1pbnVzIHNpZ24sCisgIGkuZS4gLS1keCBfNDAgLS1keSBfNDIgZm9yIDwtNDAsLTQyKS4KKyAgIiIiICUgKHN5cy5hcmd2WzBdKQorICBzeXMuZXhpdCgxKQorCitkZWYgUGFyc2VBcmdzKCk6CisgIGdsb2JhbCBEWCwgRFksIFBYLCBQWSwgS1gsIEtZCisgIHRyeToKKyAgICBvcHRpb25zLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICIiLCBbImR4PSIsICJkeT0iLCAicHg9IiwgInB5PSIsICJreD0iLCAia3k9Il0pCisgICAgZm9yIG9wdCwgdmFsdWUgaW4gb3B0aW9uczoKKyAgICAgIGlmIG9wdCBpbiBbIi0tZHgiXToKKyAgICAgICAgRFggPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbGlmIG9wdCBpbiBbIi0tZHkiXToKKyAgICAgICAgRFkgPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbGlmIG9wdCBpbiBbIi0tcHgiXToKKyAgICAgICAgUFggPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbGlmIG9wdCBpbiBbIi0tcHkiXToKKyAgICAgICAgUFkgPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbGlmIG9wdCBpbiBbIi0ta3giXToKKyAgICAgICAgS1ggPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbGlmIG9wdCBpbiBbIi0ta3kiXToKKyAgICAgICAgS1kgPSBpbnQodmFsdWUucmVwbGFjZSgiXyIsICItIikpCisgICAgICBlbHNlOgorICAgICAgICBVc2FnZSgpCisgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICBVc2FnZSgpCisKK2RlZiBQYXJzZUlucHV0KCk6CisgIGdsb2JhbCBEWCwgRFksIFBYLCBQWSwgS1gsIEtZCisKKyAgUEhPTkUgPSBbCSJzb2Z0LWxlZnQiLCAiaG9tZSIsICJiYWNrIiwgImRwYWQtdXAiLCAiZHBhZC1kb3duIiwgImRwYWQtbGVmdCIsICJkcGFkLXJpZ2h0IiwgImRwYWQtY2VudGVyIiwgInBob25lLWRpYWwiLCAicGhvbmUtaGFuZ3VwIiwgInBvd2VyIiwgInZvbHVtZS11cCIsICJ2b2x1bWUtZG93biIgXQorICBLRVlCT0FSRCA9IFsgICAiREVMIiwgIkNBUCIsICJDQVAyIiwgIlBFUklPRCIsICJFTlRFUiIsICJBTFQiLCAiU1lNIiwgIkFUIiwgIlNQQUNFIiwgIlNMQVNIIiwgIkNPTU1BIiwgIkFMVDIiIF0KKworICBtb2RlID0gTm9uZQorICB3aGlsZSBUcnVlOgorICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIGlmIG5vdCBsaW5lOgorICAgICAgcmV0dXJuCisgICAgbV9saW5lID0gX1JFX0xJTkUubWF0Y2gobGluZSkKKyAgICBpZiBtX2xpbmU6CisgICAgICBrZXl3b3JkID0gbV9saW5lLmdyb3VwKCJrZXl3b3JkIikKKyAgICAgIGlmIGtleXdvcmQgaW4gWyJkaXNwbGF5IiwgImJ1dHRvbiJdOgorICAgICAgICBtb2RlID0ga2V5d29yZAorICAgICAgICBpc19waG9uZSA9IEZhbHNlCisgICAgICAgIGlzX2tleWJvYXJkID0gRmFsc2UKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiTW9kZToiLCBtb2RlCisgICAgICBlbHNlOgorICAgICAgICBpZiBtb2RlID09ICJidXR0b24iIGFuZCAieyIgaW4gbGluZToKKyAgICAgICAgICBpc19waG9uZSA9IGtleXdvcmQgaW4gUEhPTkUKKyAgICAgICAgICBpc19rZXlib2FyZCA9IChsZW4oa2V5d29yZCkgPT0gMSBhbmQga2V5d29yZC5pc2FsbnVtKCkpCisgICAgICAgICAgaWYgbm90IGlzX2tleWJvYXJkOgorICAgICAgICAgICAgaXNfa2V5Ym9hcmQgPSBrZXl3b3JkIGluIEtFWUJPQVJECisgICAgZWxpZiAifSIgaW4gbGluZToKKyAgICAgIGlzX3Bob25lID0gRmFsc2UKKyAgICAgIGlzX2tleWJvYXJkID0gRmFsc2UKKyAgICAgIGlmIG1vZGUgPT0gImRpc3BsYXkiOgorICAgICAgICBtb2RlID0gTm9uZQorICAgIGVsc2U6CisgICAgICBtX3h5ID0gX1JFX1hZLm1hdGNoKGxpbmUpCisgICAgICBpZiBtX3h5OgorICAgICAgICB4ID0gMAorICAgICAgICB5ID0gMAorICAgICAgICBpZiBtb2RlID09ICJkaXNwbGF5IjoKKyAgICAgICAgICB4ID0gRFgKKyAgICAgICAgICB5ID0gRFkKKyAgICAgICAgZWxpZiBtb2RlID09ICJidXR0b24iIGFuZCBpc19waG9uZToKKyAgICAgICAgICB4ID0gUFgKKyAgICAgICAgICB5ID0gUFkKKyAgICAgICAgZWxpZiBtb2RlID09ICJidXR0b24iIGFuZCBpc19rZXlib2FyZDoKKyAgICAgICAgICB4ID0gS1gKKyAgICAgICAgICB5ID0gS1kKKyAgICAgICAgaWYgeCBvciB5OgorICAgICAgICAgIGQgPSBtX3h5Lmdyb3VwZGljdCgpCisgICAgICAgICAgbiA9IGludChkWyJudW0iXSkKKyAgICAgICAgICBpZiBkWyJ4eSJdLnN0YXJ0c3dpdGgoIngiKToKKyAgICAgICAgICAgIG4gKz0geAorICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuICs9IHkKKyAgICAgICAgICBkWyJudW0iXSA9IG4KKyAgICAgICAgICBsaW5lID0gIiUoc3RhcnQpcyUoeHkpcyUobnVtKXMlKGVuZClzIiAlIGQKKyAgICBzeXMuc3Rkb3V0LndyaXRlKGxpbmUpCisKKworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL3BhY2thZ2UtcmVsZWFzZS5zaCBiL2FuZHJvaWQvc2NyaXB0cy9wYWNrYWdlLXJlbGVhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWY0YmI3MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy9wYWNrYWdlLXJlbGVhc2Uuc2gKQEAgLTAsMCArMSw4OTUgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy4gJChkaXJuYW1lICIkMCIpL3V0aWxzL2NvbW1vbi5zaGkKKworc2hlbGxfaW1wb3J0IHV0aWxzL2Fvc3BfZGlyLnNoaQorc2hlbGxfaW1wb3J0IHV0aWxzL2Fvc3BfcHJlYnVpbHRzX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2J1aWxkZXIuc2hpCisKKyMjIworIyMjICBDT05GSUdVUkFUSU9OIERFRkFVTFRTCisjIyMKKworIyBEZWZhdWx0IHBhY2thZ2Ugb3V0cHV0IGRpcmVjdG9yeS4KK0RFRkFVTFRfUEtHX0RJUj0vdG1wCisKKyMgRGVmYXVsdCBwYWNrYWdlIG5hbWUgcHJlZml4LgorREVGQVVMVF9QS0dfUFJFRklYPWFuZHJvaWQtZW11bGF0b3IKKworIyBEZWZhdWx0IHBhY2thZ2UgcmV2aXNpb24gbmFtZS4KK0RFRkFVTFRfUkVWSVNJT049JChkYXRlICslWSVtJWQpCisKKyMgVGhlIGxpc3Qgb2YgR1BVIGVtdWxhdGlvbiBsaWJyYXJpZXMuCitFTVVHTF9MSUJSQVJJRVM9Ik9wZW5nbFJlbmRlciBFR0xfdHJhbnNsYXRvciBHTEVTX0NNX3RyYW5zbGF0b3IgR0xFU19WMl90cmFuc2xhdG9yIEdMRVMxMlRyYW5zbGF0b3IiCisKKyMgVGhlIGxpc3Qgb2YgRW11Z2wgYmFja2VuZCBkaXJlY3RvcmllcyB1bmRlciAkRVhFQ19ESVIvPGxpYj4vCitFTVVHTF9CQUNLRU5EX0RJUlM9ImdsZXNfbWVzYSBnbGVzX3N3aWZ0c2hhZGVyIGdsZXNfYW5nbGUiCisKKyMjIworIyMjICBVVElMSVRZIEZVTkNUSU9OUworIyMjCisKKyMgR2V0IHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgbWF0Y2hpbmcgYSBkaXJlY3RvcnkgbmFtZS4KKyMgJDE6IHN1YmRpcmVjdG9yeSBuYW1lIChlLmcuICdleHRlcm5hbC9xZW11JykKKyMgT3V0OiB2YXJpYWJsZSBuYW1lIChlLmcuICdBT1NQX0NPTU1JVF9leHRlcm5hbF9xZW11X2FuZHJvaWQnKQorX2dldF9hb3NwX3N1YmRpcl92YXJuYW1lICgpIHsKKyAgICBsb2NhbCBfX2Fvc3Bfc3ViZGlyPSIkMSIKKyAgICBlY2hvICJBT1NQX0NPTU1JVF8kKHByaW50ZiAiJXMiICIkX19hb3NwX3N1YmRpciIgfCB0ciAnLycgJ18nIHwgdHIgJy0nICdfJykiCit9CisKKyMgR2V0IHRoZSBjb21taXQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIEFPU1Agc291cmNlIHN1Yi1kaXJlY3RvcnkuCisjIE5PVEU6IE9uZSBtdXN0IGNhbGwgZXh0cmFjdF9zdWJkaXJfZ2l0X2hpc3RvcnkgcHJldmlvdXNseSEKKyMgJDE6IHN1YmRpcmVjdG9yeSBuYW1lIChlLmcuICdleHRlcm5hbC9xZW11JykKKyMgT3V0OiBsYXRlc3QgZ2l0IGNvbW1pdCBmb3IgZGlyZWN0b3J5LgorX2dldF9hb3NwX3N1YmRpcl9jb21taXQgKCkgeworICAgIHZhcl92YWx1ZSAkKF9nZXRfYW9zcF9zdWJkaXJfdmFybmFtZSAkMSkKK30KKworX2dldF9hb3NwX3N1YmRpcl9jb21taXRfZGVzY3JpcHRpb24gKCkgeworICAgIHZhcl92YWx1ZSAkKF9nZXRfYW9zcF9zdWJkaXJfdmFybmFtZSAkMSlfX1RFWFQKK30KKworIyBFeHRyYWN0IHRoZSBnaXQgY29tbWl0IFNIQTEgb2YgYSBnaXZlbiBkaXJlY3RvcnksIGFuZCBwdXQgaXRzIHZhbHVlCisjIGluIGEgZGVzdGluYXRpb24gdmFyaWFibGUuIElmIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGlzIG5vdCB0aGUgcm9vdAorIyBvZiBhIGdpdCBjaGVja291dCwgYWJvcnQuCisjICQxOiBEZXN0aW5hdGlvbiB2YXJpYWJsZSBuYW1lLgorIyAkMjogR2l0IGRpcmVjdG9yeS4KKyMgRXhhbXBsZTogICBleHRyYWN0X2NvbW1pdF9kZXNjcmlwdGlvbiBHVEVTVF9ERVNDICIkR1RFU1RfRElSIgorX2V4dHJhY3RfZ2l0X2NvbW1pdF9kZXNjcmlwdGlvbiAoKSB7CisgICAgbG9jYWwgVkFSTkFNRSBHSVRfRElSIFNIQTEKKyAgICBWQVJOQU1FPSQxCisgICAgR0lUX0RJUj0kMgorICAgICMgRXh0cmFjdCB0aGUgY29tbWl0IGRlc2NyaXB0aW9uLCB0aGVuIGVzY2FwZSAoJykgY2hhcmFjdGVycyBpbiBpdC4KKyAgICBTSEExPSQoY2QgJEdJVF9ESVIgJiYgZ2l0IGxvZyAtLW9uZWxpbmUgLS1uby1tZXJnZXMgLTEgLikgfHwgXAorICAgICAgICBwYW5pYyAiTm90IGEgR2l0IGRpcmVjdG9yeTogJEdJVF9ESVIiCisKKyAgICB2YXJfYXNzaWduICR7VkFSTkFNRX1fX1RFWFQgIiRTSEExIgorICAgIFNIQTE9JChlY2hvICIkU0hBMSIgfCBhd2sgJ3sgcHJpbnQgJDE7IH0nKQorICAgIHZhcl9hc3NpZ24gJHtWQVJOQU1FfSAkU0hBMQorfQorCisjIEV4dHJhY3QgdGhlIHByZXZpb3VzIGNvbW1pdCBvZiBhIGdpdmVuIEFPU1Agc291cmNlIHN1Yi1kaXJlY3RvcnkKKyMgZnJvbSB0aGUgUkVBRE1FIGZpbGUuCisjICQxOiBWYXJpYWJsZSBuYW1lLCB3aGljaCByZWNlaXZlcyB0aGUgdmFsdWUuCisjICQyOiBQYXRoIHRvIFJFQURNRSBmaWxlIChlLmcuICRBT1NQL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yL1JFQURNRSkKKyMgJDM6IEFPU1Agc291cmNlIHN1Yi1kaXJlY3RvcnkgKGUuZy4gZXh0ZXJuYWwvcWVtdSkKK19leHRyYWN0X3ByZXZpb3VzX2dpdF9jb21taXRfZnJvbV9yZWFkbWUgKCkgeworICAgIGxvY2FsIFNIQTEKKyAgICBTSEExPSQoYXdrICckMSA9PSAiJyQzJyIgeyBwcmludCAkMjsgfScgIiQyIikKKyAgICB2YXJfYXNzaWduICQxICIkU0hBMSIKK30KKworIyBFeHRyYWN0IHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBnaXQgaGlzdG9yeSBvZiBhIGdpdmVuIEFPU1Agc3ViLWRpcmVjdG9yeS4KKyMgT25lIGhhcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIF9nZXRfYW9zcF9zdWJkaXJfY29tbWl0IG9yCisjIF9nZXRfYW9zcF9zdWJkaXJfY29tbWl0X2Rlc2NyaXB0aW9uLgorIyAkMTogQU9TUCBzdWItZGlyZWN0b3J5LgorIyAkMjogQU9TUCByb290IGRpcmVjdG9yeS4KKyMgJDI6IFRhcmdldCBBT1NQIHByZWJ1aWx0cyBkaXJlY3RvcnkKK2V4dHJhY3Rfc3ViZGlyX2dpdF9oaXN0b3J5ICgpIHsKKyAgICBsb2NhbCBWQVJOQU1FPSIkKF9nZXRfYW9zcF9zdWJkaXJfdmFybmFtZSAkMSkiCisgICAgbG9jYWwgU1VCRElSPSIkMi8kMSIKKyAgICBsb2NhbCBUQVJHRVRfUFJFQlVJTFRTX0RJUj0iJDMiCisgICAgaWYgWyAhIC1kICIkU1VCRElSIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIHJlcXVpcmVkIHNvdXJjZSBkaXJlY3Rvcnk6ICRTVUJESVIiCisgICAgZmkKKyAgICBsb2cgIkZvdW5kIHNvdXJjZSBkaXJlY3Rvcnk6ICRTVUJESVIiCisgICAgX2V4dHJhY3RfZ2l0X2NvbW1pdF9kZXNjcmlwdGlvbiAkVkFSTkFNRSAiJFNVQkRJUiIKKyAgICBsb2cgIkZvdW5kIGN1cnJlbnQgJDEgY29tbWl0OiAkKHZhcl92YWx1ZSAkVkFSTkFNRSkiCisgICAgIyBJZiB0aGVyZSBpcyBhbiBvbGQgcHJlYnVpbHRzIGRpcmVjdG9yeSBzb21ld2hlcmUsIHJlYWQKKyAgICAjIHRoZSBvbGQgUkVBRE1FIGZpbGUgdG8gZXh0cmFjdCB0aGUgcHJldmlvdXMgY29tbWl0cyB0aGVyZS4KKyAgICBSRUFETUVfRklMRT0kVEFSR0VUX1BSRUJVSUxUU19ESVIvUkVBRE1FCisgICAgaWYgWyAtZiAiJFJFQURNRV9GSUxFIiBdOyB0aGVuCisgICAgICAgIF9leHRyYWN0X3ByZXZpb3VzX2dpdF9jb21taXRfZnJvbV9yZWFkbWUgXAorICAgICAgICAgICAgUFJFVl8kVkFSTkFNRSAiJFJFQURNRV9GSUxFIiAiJDEiCisgICAgICAgIGxvZyAiRm91bmQgcHJldmlvdXMgJDEgY29tbWl0OiAkKHZhcl92YWx1ZSBQUkVWXyRWQVJOQU1FKSIKKyAgICBmaQorfQorCisjIENvcHkgYSBmaWxlIHRvIGEgZGVzdGluYXRpb24sIGNyZWF0aW5nIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGlmIG5lZWRlZC4KKyMgJDE6IFNvdXJjZSBmaWxlIHBhdGgKKyMgJDI6IERlc3RpbmF0aW9uIGZpbGUgcGF0aAorY29weV9maWxlX2ludG8gKCkgeworICAgIGxvY2FsIFNSQ0ZJTEU9IiQxIgorICAgIGxvY2FsIERTVERJUj0iJHsyJSUvfSIKKyAgICBpZiBbICEgLWQgIiREU1RESVIiIF07IHRoZW4KKyAgICAgICAgcnVuIG1rZGlyIC1wICIkRFNURElSIiB8fAorICAgICAgICAgICAgICAgIHBhbmljICJDYW5ub3QgY3JlYXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3I6ICREU1RESVIiCisgICAgZmkKKyAgICBydW4gY3AgLXAgIiRTUkNGSUxFIiAiJERTVERJUi8kKGJhc2VuYW1lICIkU1JDRklMRSIpIgorfQorCisjIENvcHkgYSBsaXN0IG9mIGZpbGVzIGZyb20gb25lIHNvdXJjZSBkaXJlY3RvcnkgdG8gYSBkZXN0aW5hdGlvbiBvbmUuCisjICQxOiBTb3VyY2UgZGlyZWN0b3J5LgorIyAkMjogRGVzdGluYXRpb24gZGlyZWN0b3J5LgorIyAkMys6IExpc3Qgb2YgZmlsZXMgdG8gY29weSwgcmVsYXRpdmUgdG8gJDEgKGlmIGVtcHR5LCBhbGwgZmlsZXMgd2lsbCBiZSBjb3BpZWQpLgorY29weV9kaXJlY3RvcnlfZmlsZXMgKCkgeworICBsb2NhbCBTUkNESVIgRFNURElSIEZJTEVTCisgIFNSQ0RJUj0kMQorICBEU1RESVI9JDIKKyAgc2hpZnQ7IHNoaWZ0OworICBGSUxFUz0iJEAiCisKKyAgbWtkaXIgLXAgIiREU1RESVIiIHx8IHBhbmljICJDYW5ub3QgY3JlYXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeTogJERTVERJUiIKKyAgKGNkICRTUkNESVIgJiYgdGFyIGNmIC0gJEZJTEVTKSB8IChjZCAkRFNURElSICYmIHRhciB4ZiAtKSB8fAorICAgICAgICBwYW5pYyAiQ291bGQgbm90IGNvcHkgZmlsZXMgdG8gJERTVERJUiIKK30KKworIyBDb3B5IGFsbCBnaXQgc291cmNlcyBmcm9tIG9uZSBzb3VyY2UgZGlyZWN0b3J5IHRvIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorIyBUaGUgc291cmNlcyBhcmUgdGhvc2UgbGlzdGVkIGJ5ICdnaXQgbHMtZmlsZXMnLgorIyAkMTogU291cmNlIGRpcmVjdG9yeSAobXVzdCBiZSBhIGdpdCBjaGVja291dCkuCisjICQyOiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkuCitjb3B5X2RpcmVjdG9yeV9naXRfZmlsZXMgKCkgeworICBsb2NhbCBTUkNESVIgRFNURElSIFRNUF9GSUxFX0xJU1QgUkVUCisgIFNSQ0RJUj0kMQorICBEU1RESVI9JDIKKyAgbG9nICJDb3B5aW5nIGdpdCBzb3VyY2VzIGZyb20gJFNSQ0RJUiB0byAkRFNURElSIgorICAjIFRoZSBsaXN0IG9mIG5hbWVzIGNhbiBjb250YWluIHNwYWNlcywgc28gcHV0IHRoZW0gaW4gYSBmaWxlIHRvIGF2b2lkCisgICMgYW55IGlzc3Vlcy4KKyAgVE1QX0ZJTEVfTElTVD0kKG1rdGVtcCkKKyAgKGNkICRTUkNESVIgJiYgZ2l0IGxzLWZpbGVzKSA+ICRUTVBfRklMRV9MSVNUCisgIG1rZGlyIC1wICIkRFNURElSIiB8fCBwYW5pYyAiQ2Fubm90IGNyZWF0ZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnk6ICREU1RESVIiCisgIFJFVD0wCisgIChjZCAkU1JDRElSICYmIHRhciBjZiAtIC1UICRUTVBfRklMRV9MSVNUKSB8IChjZCAkRFNURElSICYmIHRhciB4ZiAtKSB8fCBcCisgICAgICAgIFJFVD0kPworICBybSAtZiAiJFRNUF9GSUxFX0xJU1QiCisgIHJldHVybiAkUkVUCit9CisKKyMgUmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YgYWxsIGZpbGVzIHVuZGVyIGEgZ2l2ZW4gdG9wLWxldmVsIGRpcmVjdG9yeSwKKyMgTWF0Y2hpbmcgb25lIG9yIG1vcmUgZmlsdGVycy4KKyMgJDE6IHRvcC1sZXZlbCBkaXJlY3RvcnkKKyMgJDIrOiBvcHRpb24gZmlsZSBmaWx0ZXJzLiBJZiBlbXB0eSwgYWxsIGZpbGVzIHVuZGVyICQxIGFyZSB0YWtlbi4KK2xpc3RfZmlsZXNfdW5kZXIgKCkgeworICAgIGxvY2FsIFRPUF9ESVI9IiQxIgorICAgIHNoaWZ0CisgICAgbG9jYWwgRklMVEVSUz0iJCoiCisgICAgaWYgWyAteiAiJEZJTFRFUlMiIF07IHRoZW4KKyAgICAgICAgRklMVEVSUz0iKiIKKyAgICBmaQorICAgIGxvY2FsIEZJTFRFUiBGSUxFIEZJTEVTIFRNUF9MSVNUCisgICAgVE1QX0xJU1Q9JChta3RlbXApCisgICAgZm9yIEZJTFRFUiBpbiAiJEZJTFRFUlMiOyBkbworICAgICAgICBGSUxFUz0kKCAoY2QgIiRUT1BfRElSIiAmJiBscyAtZCAkRklMVEVSKSAyPi9kZXYvbnVsbCB8fCB0cnVlKQorICAgICAgICBmb3IgRklMRSBpbiAkRklMRVM7IGRvCisgICAgICAgICAgICAoY2QgIiRUT1BfRElSIiAmJiBmaW5kICIkRklMRSIgLXR5cGUgZiAtbyAtdHlwZSBsIDI+L2Rldi9udWxsIHx8IHRydWUpID4+ICRUTVBfTElTVAorICAgICAgICBkb25lCisgICAgZG9uZQorICAgIGNhdCAkVE1QX0xJU1QgfCBzb3J0IC11ID4gJFRNUF9MSVNULnRtcAorICAgIHJtIC1mICRUTVBfTElTVAorICAgIG12ICRUTVBfTElTVC50bXAgJFRNUF9MSVNUCisgICAgY2F0ICIkVE1QX0xJU1QiCisgICAgcm0gLWYgIiRUTVBfTElTVCIKK30KKworIyBDcmVhdGUgYXJjaGl2ZQorIyAkMTogUGFja2FnZSBmaWxlCisjICQyOiBTb3VyY2UgZGlyZWN0b3J5CisjICQzKzogTGlzdCBvZiBmaWxlcy9kaXJlY3RvcmllcyB0byBwYWNrYWdlLgorcGFja2FnZV9hcmNoaXZlX2ZpbGVzICgpIHsKKyAgICBsb2NhbCBQS0dfRklMRSBQS0dfRElSIFRNUF9GSUxFX0xJU1QgVEFSRkxBR1MgUkVUIEZJTFRFUiBGSUxFIEZJTEVTCisgICAgUEtHX0ZJTEU9JDEKKyAgICBQS0dfRElSPSQyCisgICAgc2hpZnQ7IHNoaWZ0OworICAgICMgVHJ5IHRvIG1ha2UgcmVwcm9kdWNlYWJsZSB0YXJiYWxscyBieSBmb3JjaW5nIHRoZSBvcmRlciBvZiBmaWxlcworICAgICMgd2l0aGluIHRoZSBhcmNoaXZlLCBhcyB3ZWxsIGFzIHNldHRpbmcgdGhlIHVzZXIvZ3JvdXAgbmFtZXMgYW5kCisgICAgIyBkYXRlIHRvIGZpeGVkIHZhbHVlcy4KKyAgICBUTVBfRklMRV9MSVNUPSQobWt0ZW1wKQorICAgIGxpc3RfZmlsZXNfdW5kZXIgIiRQS0dfRElSIiAiJEAiID4gIiRUTVBfRklMRV9MSVNUIgorICAgIGNhc2UgJFBLR19GSUxFIGluCisgICAgICAgICoudGFyKQorICAgICAgICAgICAgVEFSRkxBR1M9IiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmd6KQorICAgICAgICAgICAgVEFSRkxBR1M9egorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIuYnoyKQorICAgICAgICAgICAgVEFSRkxBR1M9agorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIueHopCisgICAgICAgICAgICBUQVJGTEFHUz1KCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcGFuaWMgIkRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBwYWNrYWdlOiAkUEtHX0ZJTEUiCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBpZiBbICQoZ2V0X3ZlcmJvc2l0eSkgLWd0IDIgXTsgdGhlbgorICAgICAgICBUQVJGTEFHUz0ke1RBUkZMQUdTfXYKKyAgICBmaQorCisgICAgUkVUPTAKKyAgICBydW4gdGFyIGMke1RBUkZMQUdTfWYgIiRQS0dfRklMRSIgXAorICAgICAgICAgICAgLUMgIiRQS0dfRElSIiBcCisgICAgICAgICAgICAtVCAiJFRNUF9GSUxFX0xJU1QiIFwKKyAgICAgICAgICAgIC0tb3duZXI9YW5kcm9pZCBcCisgICAgICAgICAgICAtLWdyb3VwPWFuZHJvaWQgXAorICAgICAgICAgICAgLS1tdGltZT0iMjAxNS0wMS0wMSAwMDowMDowMCIgXAorICAgICAgICB8fCBSRVQ9JD8KKyAgICBybSAtZiAiJFRNUF9GSUxFX0xJU1QiCisgICAgcmV0dXJuICRSRVQKK30KKworIyBDb252ZXJ0IGEgbGlzdCBvZiBob3N0cyB0byBhIGxpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMuCisjIFRoaXMgYWxzbyByZW1vdmVzIGR1cGxpY2F0ZXMuCisjICQxOiBMaXN0IG9mIGhvc3Qgc3lzdGVtcyAoZS5nLiAnbGludXgteDg2XzY0IGRhcndpbi14ODZfNjQnKQorIyBPdXQ6IExpc3Qgb2Ygb3BlcmF0aW5nIHN5c3RlbXMgKGUuZy4gJ2xpbnV4IGRhcndpbicpCitjb252ZXJ0X2hvc3RfbGlzdF90b19vc19saXN0ICgpIHsKKyAgICBsb2NhbCBSRVQgSE9TVAorICAgIGZvciBIT1NUIGluICIkQCI7IGRvCisgICAgICAgIGNhc2UgJEhPU1QgaW4KKyAgICAgICAgICAgIGxpbnV4LSopCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBSRVQgImxpbnV4IgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBkYXJ3aW4tKikKKyAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIFJFVCAiZGFyd2luIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICB3aW5kb3dzLSopCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBSRVQgIndpbmRvd3MiCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICopCisgICAgICAgICAgICAgICAgdmFyX2FwcGVuZCBSRVQgIiRIT1NUIgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICBkb25lCisgICAgcHJpbnRmICVzICIkUkVUIiB8IHRyICcgJyAnXG4nIHwgc29ydCAtdSB8IHRyICdcbicgJyAnCit9CisKKyMgUmV0dXJuIHNoYXJlZCBsaWJyYXJ5IGV4dGVuc2lvbiBmb3IgYSBnaXZlbiBob3N0IHN5dGVtCisjICQxOiBob3N0IG9zIG5hbWUgKGUuZy4gJ3dpbmRvd3MnIG9yICd3aW5kb3dzLXg4Nl82NCcpCisjIE91dDogRExMIGV4dGVuc2lvbiAoZS5nLiAnLmRsbCcpCitkbGxfZXh0X2ZvciAoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICB3aW5kb3dzKikKKyAgICAgICAgICAgIHByaW50ZiAiLmRsbCIKKyAgICAgICAgICAgIDs7CisgICAgICAgIGRhcndpbiopCisgICAgICAgICAgICBwcmludGYgIi5keWxpYiIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwcmludGYgIi5zbyIKKyAgICBlc2FjCit9CisKKyMgUmV0dXJuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGZvciBhIGdpdmVuIGhvc3Qgc3lzdGVtCisjICQxOiBob3N0IG9zIG5hbWUgKGUuZy4gJ3dpbmRvd3MnIG9yICd3aW5kb3dzLXg4Nl82NCcpCisjIE91dDogZXhlIGV4dGVuc2lvbiAoZS5nLiAnLmV4ZScpCitleGVfZXh0X2ZvciAoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICB3aW5kb3dzKikKKyAgICAgICAgICAgIHByaW50ZiAiLmV4ZSIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwcmludGYgIiIKKyAgICBlc2FjCit9CisKKyMjIworIyMjICBDT01NQU5EIExJTkUgUEFSU0lORworIyMjCisKK09QVF9QS0dfRElSPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wYWNrYWdlLWRpcj08ZGlyPiIgT1BUX1BLR19ESVIgXAorICAgICAgICAiQ2hhbmdlIHBhY2thZ2Ugb3V0cHV0IGRpcmVjdG9yeSBbJERFRkFVTFRfUEtHX0RJUl0iCisKK09QVF9QS0dfUFJFRklYPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wYWNrYWdlLXByZWZpeD08cHJlZml4PiIgT1BUX1BLR19QUkVGSVggXAorICAgICAgICAiQ2hhbmdlIHBhY2thZ2UgbmFtZSBwcmVmaXggWyRERUZBVUxUX1BLR19QUkVGSVhdIgorT1BUX1JFVklTSU9OPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1yZXZpc2lvbj08bmFtZT4iIE9QVF9SRVZJU0lPTiBcCisgICAgICAgICJDaGFuZ2UgcmV2aXNpb24gWyRERUZBVUxUX1JFVklTSU9OXSIKKworT1BUX1NPVVJDRVM9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLXNvdXJjZXMiIE9QVF9TT1VSQ0VTICJBbHNvIGNyZWF0ZSBzb3VyY2VzIHBhY2thZ2UuIgorCitPUFRfQ09QWV9QUkVCVUlMVFM9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWNvcHktcHJlYnVpbHRzPTxkaXI+IiBPUFRfQ09QWV9QUkVCVUlMVFMgXAorICAgICAgICAiQ29weSBmaW5hbCBlbXVsYXRvciBiaW5hcmllcyB0byA8cGF0aD4vcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IiCisKK09QVF9HTEVTPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1nbGVzPTxuYW1lPiIgT1BUX0dMRVMgXAorICAgICAgICAiU3BlY2lmeSBHTEVTIGJhY2tlbmQgKCdkZ2wnIG9yICdhbmdsZScpIgorCitPUFRfTk9fU1RSSVA9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLW5vLXN0cmlwIiBPUFRfTk9fU1RSSVAgXAorICAgICAgICAiRG8gbm90IHN0cmlwIGZpbmFsIGJpbmFyaWVzLiIKKworT1BUX1NZTUJPTFM9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLXN5bWJvbHMiIE9QVF9TWU1CT0xTIFwKKyAgICAgICAiR2VuZXJhdGUgQnJlYWtwYWQgc3ltYm9scy4iCisKK09QVF9ERUJVRz0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tZGVidWciIE9QVF9ERUJVRyBcCisgICAgICAgICJCdWlsZCBkZWJ1ZyB2ZXJzaW9uIG9mIGVtdWxhdG9yIGJpbmFyaWVzLiIKKworT1BUX1BSRUJVSUxUX1FFTVUyPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wcmVidWlsdC1xZW11MiIgT1BUX1BSRUJVSUxUX1FFTVUyIFwKKyAgICAgICAiRG9uJ3QgYnVpbGQgUUVNVTIgZnJvbSBzb3VyY2VzLCB1c2UgcHJlYnVpbHRzLiIKKworT1BUX0NSQVNIX1NUQUdJTkc9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWNyYXNoLXN0YWdpbmciIE9QVF9DUkFTSF9TVEFHSU5HIFwKKyAgICAgICAiVXBsb2FkIGNyYXNoZXMgdG8gc3RhZ2luZy4iCisKK09QVF9DUkFTSF9QUk9EPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1jcmFzaC1wcm9kIiBPUFRfQ1JBU0hfUFJPRCBcCisgICAgICAgIlVwbG9hZCBjcmFzaGVzIHRvIHByb2R1Y3Rpb24uIgorCitwYWNrYWdlX2J1aWxkZXJfcmVnaXN0ZXJfb3B0aW9ucworYW9zcF9wcmVidWlsdHNfZGlyX3JlZ2lzdGVyX29wdGlvbnMKK3ByZWJ1aWx0c19kaXJfcmVnaXN0ZXJfb3B0aW9uCisKK1BST0dSQU1fUEFSQU1FVEVSUz0KKworUFJPR1JBTV9ERVNDUklQVElPTj1cCisiUmVidWlsZCB0aGUgZW11bGF0b3IgYmluYXJpZXMgZnJvbSBzb3VyY2UgYW5kIHBhY2thZ2UgdGhlbSBpbnRvIHRhcmJhbGxzCitmb3IgZWFzaWVyIGRpc3RyaWJ1dGlvbi4KKworTmV3IHBhY2thZ2VzIGFyZSBwbGFjZWQgYnkgZGVmYXVsdCBhdCAkREVGQVVMVF9QS0dfRElSCitVc2UgLS1wYWNrYWdlLWRpcj08cGF0aD4gdG8gdXNlIGFub3RoZXIgb3V0cHV0IGRpcmVjdG9yeS4KKworUGFja2FnZXMgbmFtZXMgYXJlIHByZWZpeGVkIHdpdGggJERFRkFVTFRfUEtHX1BSRUZJWC08cmV2aXNpb24+LCB3aGVyZQordGhlIDxyZXZpc2lvbj4gaXMgdGhlIGN1cnJlbnQgSVNPIGRhdGUgYnkgZGVmYXVsdC4gWW91IGNhbiB1c2UKKy0tcGFja2FnZS1wcmVmaXg9PHByZWZpeD4gYW5kIC0tcmV2aXNpb249PHJldmlzaW9uPiB0byBjaGFuZ2UgdGhpcy4KKworVXNlIC0tc291cmNlcyBvcHRpb24gdG8gYWxzbyBnZW5lcmF0ZSBhIHNvdXJjZSB0YXJiYWxsLgorCitVc2UgLS1kYXJ3aW4tc3NoPTxob3N0PiB0byBidWlsZCBwZXJmb3JtIGEgcmVtb3RlIGJ1aWxkIG9mIHRoZSBEYXJ3aW4KK2JpbmFyaWVzIG9uIGEgcmVtb3RlIGhvc3QgdGhyb3VnaCBzc2guIE5vdGUgdGhhdCB0aGlzIGZvcmNlcyAtLXNvdXJjZXMKK2FzIHdlbGwuIFlvdSBjYW4gYWxzbyBkZWZpbmUgQU5EUk9JRF9FTVVMQVRPUl9EQVJXSU5fU1NIIGluIHlvdXIKK2Vudmlyb25tZW50IHRvIHNldHVwIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24uCisKK1VzZSAtLXNzaC13cmFwcGVyPTxjb21tYW5kPiB0byBwcmVmaXggPGNvbW1hbmQ+IHRvIGFueSBTU0gvU0NQL1JTWU5DIGNvbW1hbmQKK3BlcmZvcm1lZCBieSB0aGlzIHNjcmlwdC4KKworVXNlIC0tY29weS1wcmVidWlsdHM9PHBhdGg+IHRvIHNwZWNpZnkgdGhlIHBhdGggb2YgYW4gQU9TUCB3b3Jrc3BhY2UvY2hlY2tvdXQsCithbmQgdG8gY29weSA2NC1iaXQgcHJlYnVpbHQgYmluYXJpZXMgZm9yIGFsbCAzIGhvc3QgcGxhdGZvcm1zIHRvCis8cGF0aD4vcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IvLgorCitUaGlzIG9wdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIC0tZGFyd2luLXNzaD08aG9zdD4gb3IKK0FORFJPSURfRU1VTEFUT1JfREFSV0lOX1NTSCB0byBidWlsZCB0aGUgRGFyd2luIGJpbmFyaWVzLiIKKworb3B0aW9uX3BhcnNlICIkQCIKKworaWYgWyAiJE9QVF9QS0dfUFJFRklYIiBdOyB0aGVuCisgICAgUEtHX1BSRUZJWD0kT1BUX1BLR19QUkVGSVgKK2Vsc2UKKyAgICBQS0dfUFJFRklYPSRERUZBVUxUX1BLR19QUkVGSVgKKyAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXBhY2thZ2UtcHJlZml4PSRQS0dfUFJFRklYIgorZmkKKworaWYgWyAiJE9QVF9SRVZJU0lPTiIgXTsgdGhlbgorICAgIFBLR19SRVZJU0lPTj0kT1BUX1JFVklTSU9OCitlbHNlCisgICAgUEtHX1JFVklTSU9OPSRERUZBVUxUX1JFVklTSU9OCisgICAgbG9nICJBdXRvLWNvbmZpZzogLS1yZXZpc2lvbj0kUEtHX1JFVklTSU9OIgorZmkKKworaWYgWyAiJE9QVF9QS0dfRElSIiBdOyB0aGVuCisgICAgUEtHX0RJUj0kT1BUX1BLR19ESVIKKyAgICBta2RpciAtcCAiJFBLR19ESVIiIHx8IHBhbmljICJDYW4ndCBjcmVhdGUgZGlyZWN0b3J5OiAkUEtHX0RJUiIKK2Vsc2UKKyAgICBQS0dfRElSPSRERUZBVUxUX1BLR19ESVIKKyAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXBhY2thZ2UtZGlyPSRQS0dfRElSIgorZmkKKworcGFja2FnZV9idWlsZGVyX3Byb2Nlc3Nfb3B0aW9ucyBxZW11LXBhY2thZ2UtYmluYXJpZXMKK2Fvc3BfcHJlYnVpbHRzX2Rpcl9wYXJzZV9vcHRpb25zCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbgorCitpZiBbIC16ICIkT1BUX1NPVVJDRVMiIC1hICIkREFSV0lOX1NTSCIgXTsgdGhlbgorICAgIE9QVF9TT1VSQ0VTPXRydWUKKyAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXNvdXJjZXMgIFtkYXJ3aW4tc3NoXSIKK2ZpCisKK1RBUkdFVF9BT1NQPQoraWYgWyAiJE9QVF9DT1BZX1BSRUJVSUxUUyIgXTsgdGhlbgorICAgIGlmIFsgLXogIiREQVJXSU5fU1NIIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJUaGUgLS1jb3B5LXByZWJ1aWx0cz08ZGlyPiBvcHRpb24gcmVxdWlyZXMgLS1kYXJ3aW4tc3NoPTxob3N0Pi4iCisgICAgZmkKKyAgICBUQVJHRVRfQU9TUD0kT1BUX0NPUFlfUFJFQlVJTFRTCisgICAgaWYgWyAhIC1kICIkVEFSR0VUX0FPU1AvcHJlYnVpbHRzL2FuZHJvaWQtZW11bGF0b3IiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBmaW5kIHByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yIGluOiAnJFRBUkdFVF9BT1NQJyIKKyAgICBmaQorICAgIFRBUkdFVF9QUkVCVUlMVFNfRElSPSRUQVJHRVRfQU9TUC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvcgorICAgIGxvZyAiVXNpbmcgQU9TUCBwcmVidWlsdHMgZGlyZWN0b3J5OiAkVEFSR0VUX1BSRUJVSUxUU19ESVIiCisgICAgbWtkaXIgLXAgIiRUQVJHRVRfUFJFQlVJTFRTX0RJUiIKK2VsaWYgWyAtZiAiJChwcm9ncmFtX2RpcmVjdG9yeSkvLi4vLi4vLi4vLi4vYnVpbGQvZW52c2V0dXAuc2giIF07IHRoZW4KKyAgICBUQVJHRVRfQU9TUD0kKGNkICQocHJvZ3JhbV9kaXJlY3RvcnkpLy4uLy4uLy4uLy4uICYmIHB3ZCAtUCkKKyAgICBsb2cgIkZvdW5kIEFPU1AgY2hlY2tvdXQgZGlyZWN0b3J5OiAkVEFSR0VUX0FPU1AiCisgICAgVEFSR0VUX1BSRUJVSUxUU19ESVI9JFRBUkdFVF9BT1NQL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yCisgICAgaWYgWyAhIC1kICIkVEFSR0VUX1BSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICAgICAgVEFSR0VUX1BSRUJVSUxUU19ESVI9CisgICAgZmkKK2Vsc2UKKyAgICBUQVJHRVRfQU9TUD0kKGNkICQocHJvZ3JhbV9kaXJlY3RvcnkpLy4uLy4uLy4uLy4uICYmIHB3ZCAtUCkKK2ZpCisKKyMjIworIyMjICBETyBUSEUgV09SSworIyMjCisKK1JFQlVJTERfRkxBR1M9Ii0tdmVyYm9zaXR5PSQoZ2V0X3ZlcmJvc2l0eSkiCisKK2xvZyAiQnVpbGRpbmcgZm9yIHRoZSBmb2xsb3dpbmcgc3lzdGVtczogJEhPU1RfU1lTVEVNUyIKKworIyBBc3N1bWUgdGhpcyBzY3JpcHQgaXMgdW5kZXIgYW5kcm9pZC9zY3JpcHRzLworUUVNVV9ESVI9JChjZCAkKHByb2dyYW1fZGlyZWN0b3J5KS8uLi8uLiAmJiBwd2QgLVApCitsb2cgIkZvdW5kIGVtdWxhdG9yIGRpcmVjdG9yeTogJFFFTVVfRElSIgorCitjZCAkUUVNVV9ESVIKK2lmIFsgISAtZCAiJFFFTVVfRElSIi8uZ2l0IF07IHRoZW4KKyAgICBwYW5pYyAiVGhpcyBkaXJlY3RvcnkgbXVzdCBiZSBhIGNoZWNrb3V0IG9mIFwkQU9TUC9wbGF0Zm9ybS9leHRlcm5hbC9xZW11ISIKK2ZpCitVTkNIRUNLRURfRklMRVM9JChnaXQgbHMtZmlsZXMgLW8gLXggb2Jqcy8pCitpZiBbICIkVU5DSEVDS0VEX0ZJTEVTIiBdOyB0aGVuCisgICAgZHVtcCAiRVJST1I6IFRoZXJlIGFyZSB1bmNoZWNrZWQgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISIKKyAgICBkdW1wICJQbGVhc2UgcmVtb3ZlIHRoZW06IgorICAgIGR1bXAgIiRVTkNIRUNLRURfRklMRVMiCisgICAgZXhpdCAxCitmaQorCisjIFRoZSBsaXN0IG9mIEFPU1AgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIHJlbGV2YW50IHNvdXJjZXMgZm9yIHRoaXMKKyMgc2NyaXB0LgorCisjIENyZWF0ZSBhIGZha2UgQU9TUCByb290LWRpcmVjdG9yeSB3aXRoIHN5bWxpbmtzIHRvIHRoZSBhY3R1YWwgc291cmNlCisjIGRpcmVjdG9yaWVzLCB0aGlzIG1ha2VzIGl0IGVhc2llciB0byBzdXBwb3J0IGFsdGVybmF0aXZlIFFFTVUyIHNvdXJjZSBkaXJzLgorQU9TUF9ST09UPSRRRU1VX0RJUi8uLi8uLgorQU9TUF9UTVBESVI9JFRFTVBfRElSL2Fvc3AKK3JtIC1yZiAiJEFPU1BfVE1QRElSIi8qCitta2RpciAtcCAiJEFPU1BfVE1QRElSIi9leHRlcm5hbAorbG4gLXMgIiRBT1NQX1JPT1QiL3ByZWJ1aWx0cyAiJEFPU1BfVE1QRElSIi9wcmVidWlsdHMKK2xuIC1zICIkQU9TUF9ST09UIi9leHRlcm5hbC9xZW11ICIkQU9TUF9UTVBESVIiL2V4dGVybmFsL3FlbXUKK2xuIC1zICIkQU9TUF9ST09UIi9leHRlcm5hbC9ndGVzdCAiJEFPU1BfVE1QRElSIi9leHRlcm5hbC9ndGVzdAorbG4gLXMgIiRBT1NQX1JPT1QiL2V4dGVybmFsL2dvb2dsZS1iZW5jaG1hcmsgIiRBT1NQX1RNUERJUiIvZXh0ZXJuYWwvZ29vZ2xlLWJlbmNobWFyaworCitBT1NQX1NPVVJDRV9TVUJESVJTPSJleHRlcm5hbC9xZW11IGV4dGVybmFsL3FlbXUgZXh0ZXJuYWwvZ3Rlc3QgZXh0ZXJuYWwvZ29vZ2xlLWJlbmNobWFyayIKKworZm9yIEFPU1BfU1VCRElSIGluICRBT1NQX1NPVVJDRV9TVUJESVJTOyBkbworICAgIGV4dHJhY3Rfc3ViZGlyX2dpdF9oaXN0b3J5IFwKKyAgICAgICAgICAgICRBT1NQX1NVQkRJUiBcCisgICAgICAgICAgICAiJEFPU1BfVE1QRElSIiBcCisgICAgICAgICAgICAiJFRBUkdFVF9QUkVCVUlMVFNfRElSIgorZG9uZQorCisjIyMKKyMjIyAgQ1JFQVRFIFNPVVJDRVMgUEFDS0FHRSBJUyBORUVERUQKKyMjIworCitTT1VSQ0VTX1BLR19GSUxFPQoraWYgWyAiJE9QVF9TT1VSQ0VTIiBdOyB0aGVuCisgICAgQlVJTERfRElSPSRURU1QX0RJUi9zb3VyY2VzLyRQS0dfUFJFRklYLSRQS0dfUkVWSVNJT04KKyAgICBQS0dfTkFNRT0iJFBLR19SRVZJU0lPTi1zb3VyY2VzIgorICAgIGZvciBBT1NQX1NVQkRJUiBpbiAkQU9TUF9TT1VSQ0VfU1VCRElSUzsgZG8KKyAgICAgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyAkQU9TUF9TVUJESVIgc291cmNlIGZpbGVzLiIKKyAgICAgICAgY29weV9kaXJlY3RvcnlfZ2l0X2ZpbGVzICIkQU9TUF9UTVBESVIiLyRBT1NQX1NVQkRJUiAiJEJVSUxEX0RJUiIvJChiYXNlbmFtZSAkQU9TUF9TVUJESVIpCisgICAgZG9uZQorCisgICAgZHVtcCAiWyRQS0dfTkFNRV0gR2VuZXJhdGluZyBSRUFETUUgZmlsZS4iCisgICAgY2F0ID4gIiRCVUlMRF9ESVIiL1JFQURNRSA8PEVPRgorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIHNvdXJjZXMgb2YgdGhlIEFuZHJvaWQgZW11bGF0b3IuCitVc2UgJy4vcmVidWlsZC5zaCcgdG8gcmVidWlsZCB0aGUgYmluYXJpZXMgZnJvbSBzY3JhdGNoLgorRU9GCisKKyAgICBkdW1wICJbJFBLR19OQU1FXSBHZW5lcmF0aW5nIHJlYnVpbGQgc2NyaXB0LiIKKyAgICBjYXQgPiAiJEJVSUxEX0RJUiIvcmVidWlsZC5zaCA8PEVPRgorIyEvYmluL3NoCisKKyMgQXV0by1nZW5lcmF0ZWQgc2NyaXB0IHVzZWQgdG8gcmVidWlsZCB0aGUgQW5kcm9pZCBlbXVsYXRvciBiaW5hcmllcworIyBmcm9tIHNvdXJjZXMuCisKK2NkIFwkKGRpcm5hbWUgIlwkMCIpICYmCisoY2QgcWVtdSAmJiAuL2FuZHJvaWQvcmVidWlsZC5zaCAtLWlnbm9yZS1hdWRpbyAiXCRAIikgJiYKK21rZGlyIC1wIGJpbi8gJiYKK2NwIC1yZnAgcWVtdS9vYmpzL2VtdWxhdG9yKiBiaW4vICYmCitlY2hvICJFbXVsYXRvciBiaW5hcmllcyBhcmUgdW5kZXIgXCQocHdkIC1QKS9iaW4vIgorRU9GCisKKyAgICBjaG1vZCAreCAiJEJVSUxEX0RJUiIvcmVidWlsZC5zaAorCisgICAgUEtHX0ZJTEU9JFBLR19ESVIvJFBLR19QUkVGSVgtJFBLR19SRVZJU0lPTi1zb3VyY2VzLnRhci5iejIKKyAgICBTT1VSQ0VTX1BLR19GSUxFPSRQS0dfRklMRQorICAgIGR1bXAgIlskUEtHX05BTUVdIENyZWF0aW5nIHRhcmJhbGwuLi4iCisgICAgcGFja2FnZV9hcmNoaXZlX2ZpbGVzICIkUEtHX0ZJTEUiICIkQlVJTERfRElSIi8uLiAkUEtHX1BSRUZJWC0kUEtHX1JFVklTSU9OCitmaQorCisjIyMKKyMjIyAgUEVSRk9STSBSRU1PVEUgREFSV0lOIEJVSUxEIElGIE5FRURFRAorIyMjCisKKyMgJDE6IFN5c3RlbSAob3MpIG5hbWUuCitjcmVhdGVfYmluYXJpZXNfcGFja2FnZSAoKSB7CisgICAgbG9jYWwgU1lTVEVNPSQxCisgICAgbG9jYWwgUEtHX05BTUU9JFBLR19SRVZJU0lPTi0kU1lTVEVNCisgICAgbG9jYWwgRExMRVhUPSQoZGxsX2V4dF9mb3IgJFNZU1RFTSkKKyAgICBsb2NhbCBFWEVFWFQ9JChleGVfZXh0X2ZvciAkU1lTVEVNKQorICAgIGxvY2FsIEZJTEUgTElCCisgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyBlbXVsYXRvciBiaW5hcmllcy4iCisgICAgVEVNUF9QS0dfRElSPSRURU1QX0RJUi8kU1lTVEVNLyRQS0dfUFJFRklYLSRQS0dfUkVWSVNJT04KKworCisgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyBlbXVsYXRvciBiaW5hcmllcy4iCisgICAgRklMRT1lbXVsYXRvciRFWEVFWFQKKyAgICBjb3B5X2ZpbGVfaW50byBvYmpzLyRGSUxFICIkVEVNUF9QS0dfRElSIi90b29scy8KKyAgICBFTVVMQVRPUl9CSU5BUklFUz0kKGxpc3RfZmlsZXNfdW5kZXIgb2JqcyAiZW11bGF0b3ItKiRFWEVFWFQiICJlbXVsYXRvcjY0LSokRVhFRVhUIikKKyAgICBjb3B5X2RpcmVjdG9yeV9maWxlcyBvYmpzICIkVEVNUF9QS0dfRElSIi90b29scy8gJEVNVUxBVE9SX0JJTkFSSUVTCisgICAgaWYgWyAtZCAib2Jqcy9iaW4iIF07IHRoZW4KKyAgICAgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyAzMi1iaXQgZXhlY3V0YWJsZXMuIgorICAgICAgICBjb3B5X2RpcmVjdG9yeSBvYmpzL2JpbiAiJFRFTVBfUEtHX0RJUiIvdG9vbHMvYmluCisgICAgZmkKKyAgICBpZiBbIC1kICJvYmpzL2JpbjY0IiBdOyB0aGVuCisgICAgICAgIGR1bXAgIlskUEtHX05BTUVdIENvcHlpbmcgNjQtYml0IGV4ZWN1dGFibGVzLiIKKyAgICAgICAgY29weV9kaXJlY3Rvcnkgb2Jqcy9iaW42NCAiJFRFTVBfUEtHX0RJUiIvdG9vbHMvYmluNjQKKyAgICBmaQorICAgIGlmIFsgLWQgIm9ianMvbGliIiBdOyB0aGVuCisgICAgICAgIGR1bXAgIlskUEtHX05BTUVdIENvcHlpbmcgMzItYml0IGxpYnJhcmllcyBhbmQgY29uZmlnIGZpbGVzLiIKKyAgICAgICAgY29weV9kaXJlY3Rvcnkgb2Jqcy9saWIgIiRURU1QX1BLR19ESVIiL3Rvb2xzL2xpYgorICAgIGZpCisgICAgaWYgWyAtZCAib2Jqcy9saWI2NCIgXTsgdGhlbgorICAgICAgICBkdW1wICJbJFBLR19OQU1FXSBDb3B5aW5nIDY0LWJpdCBsaWJyYXJpZXMuIgorICAgICAgICBjb3B5X2RpcmVjdG9yeSBvYmpzL2xpYjY0ICIkVEVNUF9QS0dfRElSIi90b29scy9saWI2NAorICAgIGZpCisgICAgaWYgWyAtZCAib2Jqcy9xZW11IiBdOyB0aGVuCisgICAgICAgIFFFTVVfQklOQVJJRVM9JChsaXN0X2ZpbGVzX3VuZGVyIG9ianMvcWVtdSBcCisgICAgICAgICAgICAgICAgIiRTWVNURU0tKi9xZW11LXN5c3RlbS0qIiAiJFNZU1RFTS0qL3FlbXUtdXBzdHJlYW0tKiIpCisgICAgICAgIGlmIFsgIiRRRU1VX0JJTkFSSUVTIiBdOyB0aGVuCisgICAgICAgICAgICBmb3IgUUVNVV9CSU5BUlkgaW4gJFFFTVVfQklOQVJJRVM7IGRvCisgICAgICAgICAgICAgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyAkUUVNVV9CSU5BUlkuIgorICAgICAgICAgICAgICAgIGNvcHlfZmlsZV9pbnRvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ianMvcWVtdS8kUUVNVV9CSU5BUlkgXAorICAgICAgICAgICAgICAgICAgICAgICAgIiRURU1QX1BLR19ESVIiL3Rvb2xzL3FlbXUvJChkaXJuYW1lICRRRU1VX0JJTkFSWSkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZmkKKyAgICBmaQorICAgIGlmIFsgLWQgIm9ianMvYnVpbGQvc3ltYm9scyIgXTsgdGhlbgorICAgICAgICBkdW1wICJbJFBLR19OQU1FXSBDb3B5aW5nIFN5bWJvbHMuIgorICAgICAgICBjb3B5X2RpcmVjdG9yeSBvYmpzL2J1aWxkL3N5bWJvbHMgIiRURU1QX1BLR19ESVIiL2J1aWxkL3N5bWJvbHMKKyAgICBmaQorCisgICAgIyBHZXQgcmlkIG9mIHNvbWUgZXh0cmEgZmlsZXMgd2UgZG9uJ3QgcmVhbGx5IHdhbnQKKyAgICBydW4gcm0gLWYgIiRURU1QX1BLR19ESVIiL3Rvb2xzL2xpYiovbGliKmVtdWdsX3Rlc3Rfc2hhcmVkX2xpYnJhcnkqCisKKyAgICBkdW1wICJbJFBLR19OQU1FXSBDcmVhdGluZyBSRUFETUUgZmlsZS4iCisgICAgY2F0ID4gJFRFTVBfUEtHX0RJUi9SRUFETUUgPDxFT0YKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIEFuZHJvaWQgZW11bGF0b3IgYmluYXJpZXMuIFlvdSBjYW4gdXNlIHRoZW0gZGlyZWN0bHkKK2J5IGRlZmluaW5nIEFORFJPSURfU0RLX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCwgdGhlbiBjYWxsIHRvb2xzL2VtdWxhdG9yCit3aXRoIHRoZSB1c3VhbCBzZXQgb2Ygb3B0aW9ucy4KKworVG8gaW5zdGFsbCB0aGVtIGRpcmVjdGx5IGludG8geW91ciBTREssIGNvcHkgdGhlbSB3aXRoOgorCisgICAgY3AgLXIgdG9vbHMvKiBcJEFORFJPSURfU0RLX1JPT1QvdG9vbHMvCitFT0YKKworICAgIGR1bXAgIlskUEtHX05BTUVdIENvcHlpbmcgbGljZW5zZSBmaWxlcy4iCisgICAgbWtkaXIgLXAgIiRURU1QX1BLR19ESVIiL2xpY2Vuc2VzLworICAgIGNwIGFuZHJvaWQvcWVtdTEvQ09QWUlORyBhbmRyb2lkL3FlbXUxL0NPUFlJTkcuTElCICIkVEVNUF9QS0dfRElSIi9saWNlbnNlcy8KKworICAgIGR1bXAgIlskUEtHX05BTUVdIENyZWF0aW5nIHRhcmJhbGwuIgorICAgIFBLR19GSUxFPSRQS0dfRElSLyRQS0dfUFJFRklYLSRQS0dfUkVWSVNJT04tJFNZU1RFTS50YXIuYnoyCisgICAgcGFja2FnZV9hcmNoaXZlX2ZpbGVzICIkUEtHX0ZJTEUiICIkVEVNUF9ESVIiLyRTWVNURU0gXAorICAgICAgICAgICAgJFBLR19QUkVGSVgtJFBLR19SRVZJU0lPTgorfQorCisjIFJlYnVpbGQgRGFyd2luIGJpbmFyaWVzIHJlbW90ZWx5IHRocm91Z2ggU1NICisjICQxOiBIb3N0IG5hbWUuCisjICQyOiBTb3VyY2UgcGFja2FnZSBmaWxlLgorIyAkMzogRGFyd2luIHByZWJ1aWx0cyBkaXJlY3RvcnkuCitidWlsZF9kYXJ3aW5fYmluYXJpZXNfb24gKCkgeworICAgIGxvY2FsIERBUldJTl9TU0ggUEtHX0ZJTEUgUEtHX0ZJTEVfQkFTRU5BTUUgRFNUX0RJUiBUQVJGTEFHUworICAgIGxvY2FsIEFPU1BfRElSIEFPU1BfUFJFQlVJTFRTX0RJUiBEQVJXSU5fRkxBR1MgU1lTVEVNIFFUX1NVQkRJUgorICAgIERBUldJTl9TU0g9JDEKKyAgICBQS0dfRklMRT0kMgorICAgIEFPU1BfUFJFQlVJTFRTX0RJUj0kMworICAgIEFPU1BfRElSPSRBT1NQX1BSRUJVSUxUU19ESVIvLi4KKworICAgICMgVGhlIHBhY2thZ2UgZmlsZSBpcyAuLi4uLi4vc29tZXRoaW5nLWRhcndpbi50YXIuYnoyCisgICAgIyBBbmQgc2hvdWxkIHVucGFjayB0byBhIHNpbmdsZSBkaXJlY3RvcnkgbmFtZWQgJ3NvbWV0aGluZy8nCisgICAgIyBzbyBleHRyYWN0IHRoZSBwcmVmaXggZnJvbSB0aGUgcGFja2FnZSBuYW1lLgorICAgIFBLR19GSUxFX0JBU0VOQU1FPSQoYmFzZW5hbWUgIiRQS0dfRklMRSIpCisgICAgUEtHX0ZJTEVfUFJFRklYPSR7UEtHX0ZJTEVfQkFTRU5BTUUlJS1zb3VyY2VzLnRhci5iejJ9CisgICAgaWYgWyAiJFBLR19GSUxFX1BSRUZJWCIgPSAiJFBLR19GSUxFX0JBU0VOQU1FIiBdOyB0aGVuCisgICAgICAgICMgU2FuaXR5IGNoZWNrLgorICAgICAgICBwYW5pYyAiQ2FuJ3QgZ2V0IHBhY2thZ2UgcHJlZml4IGZyb20gJFBLR19GSUxFX0JBU0VOQU1FIgorICAgIGZpCisKKyAgICAjIFdoZXJlIHRvIGRvIHRoZSB3b3JrIG9uIHRoZSByZW1vdGUgaG9zdC4KKyAgICBidWlsZGVyX3ByZXBhcmVfcmVtb3RlX2Rhcndpbl9idWlsZCBcCisgICAgICAgICAgICAvdG1wLyRVU0VSLWFuZHJvaWQtZW11bGF0b3IvJFBLR19GSUxFX1BSRUZJWAorCisgICAgQU9TUF9CVUlMRF9QUkVCVUlMVFM9JEFPU1BfUFJFQlVJTFRTX0RJUi9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkCisgICAgREFSV0lOX0JVSUxEX1BSRUJVSUxUUz0kREFSV0lOX1BLR19ESVIvYW9zcC9wcmVidWlsdHMvYW5kcm9pZC1lbXVsYXRvci1idWlsZAorICAgIEFPU1BfS0VSTkVMX1BSRUJVSUxUUz0kQU9TUF9QUkVCVUlMVFNfRElSL3FlbXUta2VybmVsCisgICAgREFSV0lOX0tFUk5FTF9QUkVCVUlMVFM9JERBUldJTl9QS0dfRElSL2Fvc3AvcHJlYnVpbHRzL3FlbXUta2VybmVsCisKKyAgICBjb3B5X2RpcmVjdG9yeSAiJEFPU1BfQlVJTERfUFJFQlVJTFRTIi9jdXJsL2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9jdXJsL2Rhcndpbi14ODZfNjQKKworICAgIGlmIFsgISAtZCAiJEFPU1BfS0VSTkVMX1BSRUJVSUxUUy94ODYvcGMtYmlvcyIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiTWlzc2luZyBwYy1iaW9zIHByZWJ1aWx0cyEiCisgICAgZmkKKyAgICBjb3B5X2RpcmVjdG9yeSAiJEFPU1BfS0VSTkVMX1BSRUJVSUxUUyIveDg2L3BjLWJpb3MgXAorICAgICAgICAgICAgIiREQVJXSU5fS0VSTkVMX1BSRUJVSUxUUyIveDg2L3BjLWJpb3MKKworICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL3FlbXUtYW5kcm9pZC1kZXBzL2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9xZW11LWFuZHJvaWQtZGVwcy9kYXJ3aW4teDg2XzY0CisKKyAgICBpZiBbICEgLWQgIiRBT1NQX0JVSUxEX1BSRUJVSUxUUy9jb21tb24vZTJmc3Byb2dzL2Rhcndpbi14ODZfNjQiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgZTJmc3Byb2dzIHByZWJ1aWx0cyEiCisgICAgZmkKKyAgICBjb3B5X2RpcmVjdG9yeSAiJEFPU1BfQlVJTERfUFJFQlVJTFRTIi9jb21tb24vZTJmc3Byb2dzL2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9jb21tb24vZTJmc3Byb2dzL2Rhcndpbi14ODZfNjQKKworICAgIGlmIFsgISAtZCAiJEFPU1BfQlVJTERfUFJFQlVJTFRTL2NvbW1vbi9saWJ4bWwyL2Rhcndpbi14ODZfNjQiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgRGFyd2luIGxpYnhtbDIgcHJlYnVpbHRzISIKKyAgICBmaQorICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL2NvbW1vbi9saWJ4bWwyL2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9jb21tb24vbGlieG1sMi9kYXJ3aW4teDg2XzY0CisKKyAgICBpZiBbICEgLWQgIiRBT1NQX0JVSUxEX1BSRUJVSUxUUy9jb21tb24vYnJlYWtwYWQvZGFyd2luLXg4Nl82NCIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiTWlzc2luZyBEYXJ3aW4gYnJlYWtwYWQgcHJlYnVpbHRzISIKKyAgICBmaQorICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL2NvbW1vbi9icmVha3BhZC9kYXJ3aW4teDg2XzY0IFwKKyAgICAgICAgICAgICIkREFSV0lOX0JVSUxEX1BSRUJVSUxUUyIvY29tbW9uL2JyZWFrcGFkL2Rhcndpbi14ODZfNjQKKworICAgIGlmIFsgISAtZCAiJEFPU1BfQlVJTERfUFJFQlVJTFRTIi9xdC9kYXJ3aW4teDg2XzY0IF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgRGFyd2luIFF0IHByZWJ1aWx0cyByZXF1aXJlZCBieSAtLXVpPXF0ICEhIgorICAgIGZpCisKKyAgICBjb3B5X2RpcmVjdG9yeSAiJEFPU1BfQlVJTERfUFJFQlVJTFRTIi9xdC9jb21tb24gXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9xdC9jb21tb24KKworICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL3F0L2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9xdC9kYXJ3aW4teDg2XzY0CisKKyAgICBpZiBbICEgLWQgIiRBT1NQX0JVSUxEX1BSRUJVSUxUUyIvY29tbW9uL0FOR0xFL2Rhcndpbi14ODZfNjQgXTsgdGhlbgorICAgICAgICBwYW5pYyAiTWlzc2luZyBEYXJ3aW4gQU5HTEUgcHJlYnVpbHRzISIKKyAgICBmaQorCisgICAgY29weV9kaXJlY3RvcnkgIiRBT1NQX0JVSUxEX1BSRUJVSUxUUyIvY29tbW9uL0FOR0xFL2Rhcndpbi14ODZfNjQgXAorICAgICAgICAgICAgIiREQVJXSU5fQlVJTERfUFJFQlVJTFRTIi9jb21tb24vQU5HTEUvZGFyd2luLXg4Nl82NAorCisgICAgaWYgWyAhIC1kICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL3Byb3RvYnVmIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgRGFyd2luIHByb3RvYnVmIHByZWJ1aWx0cyEiCisgICAgZmkKKworICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9CVUlMRF9QUkVCVUlMVFMiL3Byb3RvYnVmIFwKKyAgICAgICAgICAgICIkREFSV0lOX0JVSUxEX1BSRUJVSUxUUyIvcHJvdG9idWYKKworICAgIHJ1biB0YXIgeGYgIiRQS0dfRklMRSIgLUMgIiREQVJXSU5fUEtHX0RJUiIvLi4KKworICAgIGlmIFsgIiRBT1NQX1BSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICAgICAgdmFyX2FwcGVuZCBEQVJXSU5fQlVJTERfRkxBR1MgIi0tYW9zcC1wcmVidWlsdHMtZGlyPSREQVJXSU5fUkVNT1RFX0RJUi9hb3NwL3ByZWJ1aWx0cyIKKyAgICBlbHNlCisgICAgICAgIHZhcl9hcHBlbmQgREFSV0lOX0JVSUxEX0ZMQUdTICItLW5vLWFvc3AtcHJlYnVpbHRzIgorICAgIGZpCisgICAgaWYgWyAiJE9QVF9HTEVTIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgREFSV0lOX0JVSUxEX0ZMQUdTICItLWdsZXM9JE9QVF9HTEVTIgorICAgIGZpCisgICAgaWYgWyAiJE9QVF9OT19TVFJJUCIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyAiLS1uby1zdHJpcCIKKyAgICBmaQorICAgIGlmIFsgIiRPUFRfU1lNQk9MUyIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyAiLS1zeW1ib2xzIgorICAgIGZpCisgICAgaWYgWyAiJE9QVF9ERUJVRyIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyAiLS1kZWJ1ZyIKKyAgICBmaQorICAgIGlmIFsgIiRPUFRfUFJFQlVJTFRfUUVNVTIiIF07IHRoZW4KKyAgICAgICAgdmFyX2FwcGVuZCBEQVJXSU5fQlVJTERfRkxBR1MgIi0tcHJlYnVpbHQtcWVtdTIiCisgICAgZmkKKyAgICBpZiBbICIkT1BUX0NSQVNIX1NUQUdJTkciIF07IHRoZW4KKyAgICAgICAgdmFyX2FwcGVuZCBEQVJXSU5fQlVJTERfRkxBR1MgIi0tY3Jhc2gtc3RhZ2luZyIKKyAgICBlbGlmIFsgIiRPUFRfQ1JBU0hfUFJPRCIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyAiLS1jcmFzaC1wcm9kIgorICAgIGZpCisKKyAgICBjYXQgPiAkREFSV0lOX1BLR19ESVIvYnVpbGQuc2ggPDxFT0YKKyMhL2Jpbi9iYXNoIC1sCitjZCAkREFSV0lOX1JFTU9URV9ESVIvcWVtdSAmJgorLi9hbmRyb2lkL3JlYnVpbGQuc2ggJERBUldJTl9CVUlMRF9GTEFHUworRU9GCisgICAgYnVpbGRlcl9ydW5fcmVtb3RlX2Rhcndpbl9idWlsZCAiJERBUldJTl9QS0dfRElSL2J1aWxkLnNoIiB8fAorICAgICAgICBwYW5pYyAiQ2FuJ3QgcmVidWlsZCBiaW5hcmllcyBvbiBEYXJ3aW4sIHVzZSAtLXZlcmJvc2UgdG8gc2VlIHdoeSEiCisKKyAgICBkdW1wICJSZXRyaWV2aW5nIERhcndpbiBiaW5hcmllcyBmcm9tOiAkREFSV0lOX1NTSCIKKyAgICAjIGBwd2RgID09IGV4dGVybmFsL3FlbXUKKyAgICBybSAtcmYgb2Jqcy8qCisgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3JzeW5jIC1oYXogLS1kZWxldGUgXAorICAgICAgICAgICAgJERBUldJTl9TU0g6JERBUldJTl9SRU1PVEVfRElSL3FlbXUvb2JqcyAuCisgICAgZHVtcCAiRGVsZXRpbmcgZmlsZXMgb2ZmIGRhcndpbiBzeXN0ZW0iCisgICAgYnVpbGRlcl9yZW1vdGVfZGFyd2luX3J1biBybSAtcmYgJERBUldJTl9SRU1PVEVfRElSCisKKyAgICBpZiBbICEgLWQgIm9ianMvcWVtdSIgXTsgdGhlbgorICAgICAgICAjIEZvciAtLXByZWJ1aWx0LXFlbXUyCisgICAgICAgIFFFTVVfUFJFQlVJTFRTX0RJUj0kUFJFQlVJTFRTX0RJUi9xZW11LWFuZHJvaWQKKyAgICAgICAgUUVNVV9CSU5BUklFUz0kKGxpc3RfZmlsZXNfdW5kZXIgIiRRRU1VX1BSRUJVSUxUU19ESVIiIFwKKyAgICAgICAgICAgICAgICAiZGFyd2luLSovcWVtdS1zeXN0ZW0tKiIgImRhcndpbi0qL3FlbXUtdXBzdHJlYW0tKiIpCisgICAgICAgIGlmIFsgIiRRRU1VX0JJTkFSSUVTIiBdOyB0aGVuCisgICAgICAgICAgICBmb3IgUUVNVV9CSU5BUlkgaW4gJFFFTVVfQklOQVJJRVM7IGRvCisgICAgICAgICAgICAgICAgZHVtcCAiWyRQS0dfTkFNRV0gQ29weWluZyAkUUVNVV9CSU5BUlkiCisgICAgICAgICAgICAgICAgY29weV9maWxlX2ludG8gIiRRRU1VX1BSRUJVSUxUU19ESVIiLyRRRU1VX0JJTkFSWSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Jqcy9xZW11LyQoZGlybmFtZSAkUUVNVV9CSU5BUlkpCisgICAgICAgICAgICBkb25lCisgICAgICAgIGZpCisgICAgZmkKKworICAgIGNyZWF0ZV9iaW5hcmllc19wYWNrYWdlIGRhcndpbgorfQorCitpZiBbICIkREFSV0lOX1NTSCIgXTsgdGhlbgorICAgIGJ1aWxkX2Rhcndpbl9iaW5hcmllc19vbiBcCisgICAgICAgICAgICAiJERBUldJTl9TU0giIFwKKyAgICAgICAgICAgICIkU09VUkNFU19QS0dfRklMRSIgXAorICAgICAgICAgICAgIiRBT1NQX1BSRUJVSUxUU19ESVIiIHx8CisgICAgICAgIHBhbmljICJDYW5ub3QgcmVidWlsZCBEYXJ3aW4gYmluYXJpZXMgcmVtb3RlbHkiCitmaQorCisjIyMKKyMjIyAgUEVSRk9STSBMT0NBTCBCVUlMRFMKKyMjIworCitpZiBbICIkQU9TUF9QUkVCVUlMVFNfRElSIiBdOyB0aGVuCisgICAgdmFyX2FwcGVuZCBSRUJVSUxEX0ZMQUdTICItLWFvc3AtcHJlYnVpbHRzLWRpcj0kQU9TUF9QUkVCVUlMVFNfRElSIgorZWxzZQorICAgIHZhcl9hcHBlbmQgUkVCVUlMRF9GTEFHUyAiLS1uby1hb3NwLXByZWJ1aWx0cy1kaXIiCitmaQorCitpZiBbICIkT1BUX0dMRVMiIF07IHRoZW4KKyAgICB2YXJfYXBwZW5kIFJFQlVJTERfRkxBR1MgIi0tZ2xlcz0kT1BUX0dMRVMiCitmaQorCitpZiBbICIkT1BUX05PX1NUUklQIiBdOyB0aGVuCisgICAgdmFyX2FwcGVuZCBSRUJVSUxEX0ZMQUdTICItLW5vLXN0cmlwIgorZmkKKworaWYgWyAiJE9QVF9TWU1CT0xTIiBdOyB0aGVuCisgICAgdmFyX2FwcGVuZCBSRUJVSUxEX0ZMQUdTICItLXN5bWJvbHMiCitmaQorCitpZiBbICIkT1BUX0RFQlVHIiBdOyB0aGVuCisgICAgdmFyX2FwcGVuZCBSRUJVSUxEX0ZMQUdTICItLWRlYnVnIgorZmkKKworaWYgWyAiJE9QVF9QUkVCVUlMVF9RRU1VMiIgXTsgdGhlbgorICAgIHZhcl9hcHBlbmQgUkVCVUlMRF9GTEFHUyAiLS1wcmVidWlsdC1xZW11MiIKK2ZpCisKK2ZvciBTWVNURU0gaW4gJChjb252ZXJ0X2hvc3RfbGlzdF90b19vc19saXN0ICRMT0NBTF9IT1NUX1NZU1RFTVMpOyBkbworICAgIFBLR19OQU1FPSIkUEtHX1JFVklTSU9OLSRTWVNURU0iCisgICAgZHVtcCAiWyRQS0dfTkFNRV0gUmVidWlsZGluZyBiaW5hcmllcyBmcm9tIHNvdXJjZXMuIgorICAgIHJ1biBjZCAkUUVNVV9ESVIKKworICAgIGNhc2UgJFNZU1RFTSBpbgorICAgICAgICB3aW5kb3dzKQorICAgICAgICAgICAgcnVuIC4vYW5kcm9pZC9yZWJ1aWxkLnNoIC0tbWluZ3cgJFJFQlVJTERfRkxBR1MgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMgIlVzZSAuL2FuZHJvaWQvcmVidWlsZC5zaCAtLW1pbmd3IHRvIHNlZSB3aHkuIgorICAgICAgICAgICAgOzsKKworICAgICAgICAqKQorICAgICAgICAgICAgcnVuIC4vYW5kcm9pZC9yZWJ1aWxkLnNoICRSRUJVSUxEX0ZMQUdTIHx8CisgICAgICAgICAgICAgICAgICAgIHBhbmljICJVc2UgLi9hbmRyb2lkL3JlYnVpbGQuc2ggdG8gc2VlIHdoeS4iCisgICAgZXNhYworCisgICAgY3JlYXRlX2JpbmFyaWVzX3BhY2thZ2UgIiRTWVNURU0iCitkb25lCisKKyMjIworIyMjICBDT1BZIFBSRUJVSUxUUyBUTyBBT1NQL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yIElGIE5FRURFRAorIyMjCisKK2lmIFsgIiRPUFRfQ09QWV9QUkVCVUlMVFMiIF07IHRoZW4KKyAgICBmb3IgU1lTVEVNIGluIGxpbnV4IGRhcndpbiB3aW5kb3dzOyBkbworICAgICAgICBTUkNfRElSPSIkVEVNUF9ESVIiLyRTWVNURU0vJFBLR19QUkVGSVgtJFBLR19SRVZJU0lPTgorICAgICAgICBpZiBbICRTWVNURU0gPSAid2luZG93cyIgXTsgdGhlbgorICAgICAgICAgICAgU1lTVEVNX0FSQ0g9JFNZU1RFTQorICAgICAgICAgICAgQklUTkVTUz0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU1lTVEVNX0FSQ0g9JFNZU1RFTS14ODZfNjQKKyAgICAgICAgICAgIEJJVE5FU1M9NjQKKyAgICAgICAgZmkKKyAgICAgICAgRFNUX0RJUj0kVEFSR0VUX1BSRUJVSUxUU19ESVIvJFNZU1RFTV9BUkNICisgICAgICAgIGR1bXAgIlskU1lTVEVNX0FSQ0hdIENvcHlpbmcgZW11bGF0b3IgYmluYXJpZXMgaW50byAkRFNUX0RJUiIKKyAgICAgICAgcnVuIG1rZGlyIC1wICIkRFNUX0RJUiIgfHwgcGFuaWMgIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAkRFNUX0RJUiIKKyAgICAgICAgRExMRVhUPSQoZGxsX2V4dF9mb3IgJFNZU1RFTSkKKyAgICAgICAgRVhFRVhUPSQoZXhlX2V4dF9mb3IgJFNZU1RFTSkKKyAgICAgICAgRklMRVM9JChsaXN0X2ZpbGVzX3VuZGVyICIkU1JDX0RJUiIvdG9vbHMgXAorICAgICAgICAgICAgZW11bGF0b3IkRVhFRVhUIFwKKyAgICAgICAgICAgICJlbXVsYXRvciRCSVRORVNTLSokRVhFRVhUIiBcCisgICAgICAgICAgICBsaWIvY2EtYnVuZGxlLnBlbSBcCisgICAgICAgICAgICBsaWIvYWR2YW5jZWRGZWF0dXJlcy5pbmkgXAorICAgICAgICAgICAgbGliL3BjLWJpb3MgXAorICAgICAgICAgICAgInFlbXUvJFNZU1RFTS0qLyoiIFwKKyAgICAgICAgICAgICJiaW4kQklUTkVTUy8qIiBcCisgICAgICAgICAgICAibGliJEJJVE5FU1MvKiIgKQorCisgICAgICAgICMgdGVtcG9yYXJpbHkgaW5jbHVkZSBsaW51eCAzMiBiaXQgYmluYXJpZXMKKyAgICAgICAgaWYgWyAkU1lTVEVNID0gImxpbnV4IiBdOyB0aGVuCisgICAgICAgICAgICB2YXJfYXBwZW5kIEZJTEVTICQobGlzdF9maWxlc191bmRlciAiJFNSQ19ESVIiL3Rvb2xzIFwKKyAgICAgICAgICAgICAgICAgICAgImVtdWxhdG9yLSokRVhFRVhUIiAiYmluLyoiICJsaWIvKiIpCisgICAgICAgIGZpCisKKyAgICAgICAgY29weV9kaXJlY3RvcnlfZmlsZXMgIiRTUkNfRElSL3Rvb2xzIiAiJERTVF9ESVIiICIkRklMRVMiIHx8CisgICAgICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjb3B5IGJpbmFyaWVzIHRvICREU1RfRElSIgorICAgIGRvbmUKKyAgICBSRUFETUVfRklMRT0kVEFSR0VUX1BSRUJVSUxUU19ESVIvUkVBRE1FCisgICAgY2F0ID4gJFJFQURNRV9GSUxFIDw8RU9GCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBwcmVidWlsdCBlbXVsYXRvciBiaW5hcmllcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGJ5CitydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBvbiBhIDY0LWJpdCBMaW51eCBtYWNoaW5lOgorCisgIGV4dGVybmFsL3FlbXUvYW5kcm9pZC9zY3JpcHRzL3BhY2thZ2UtcmVsZWFzZS5zaCBcXAorICAgICAgLS1kYXJ3aW4tc3NoPTxob3N0PiBcXAorICAgICAgLS1jb3B5LXByZWJ1aWx0cz08cGF0aD4KKworV2hlcmUgPGhvc3Q+IGlzIHRoZSBob3N0IG5hbWUgb2YgYSBEYXJ3aW4gbWFjaGluZSwgYW5kIDxwYXRoPiBpcyB0aGUgcm9vdAorcGF0aCBvZiB0aGlzIEFPU1AgcmVwbyB3b3Jrc3BhY2UuCisKK0JlbG93IGlzIHRoZSBsaXN0IG9mIHNwZWNpZmljIGNvbW1pdHMgZm9yIGVhY2ggaW5wdXQgZGlyZWN0b3J5IHVzZWQ6CisKK0VPRgorICAgIGZvciBBT1NQX1NVQkRJUiBpbiAkQU9TUF9TT1VSQ0VfU1VCRElSUzsgZG8KKyAgICAgICAgcHJpbnRmICIlLTIwcyAlc1xuIiAiJEFPU1BfU1VCRElSIiAiJChfZ2V0X2Fvc3Bfc3ViZGlyX2NvbW1pdF9kZXNjcmlwdGlvbiAkQU9TUF9TVUJESVIpIiA+PiAkUkVBRE1FX0ZJTEUKKyAgICBkb25lCisKKyAgICBjYXQgPj4gJFJFQURNRV9GSUxFIDw8RU9GCisKK1N1bW1hcnkgb2YgY2hhbmdlczoKKworRU9GCisgICAgZm9yIEFPU1BfU1VCRElSIGluICRBT1NQX1NPVVJDRV9TVUJESVJTOyBkbworICAgICAgICBWQVJOQU1FPSQoX2dldF9hb3NwX3N1YmRpcl92YXJuYW1lICRBT1NQX1NVQkRJUikKKyAgICAgICAgQ1VSX1NIQTE9JCh2YXJfdmFsdWUgJFZBUk5BTUUpCisgICAgICAgIFBSRVZfU0hBMT0kKHZhcl92YWx1ZSBQUkVWXyRWQVJOQU1FKQorICAgICAgICBpZiBbICIkQ1VSX1NIQTEiICE9ICIkUFJFVl9TSEExIiBdOyB0aGVuCisgICAgICAgICAgICBHSVRfTE9HX0NPTU1BTkQ9ImNkICRBT1NQX1NVQkRJUiAmJiBnaXQgbG9nIC0tb25lbGluZSAtLW5vLW1lcmdlcyAkUFJFVl9TSEExLi4kQ1VSX1NIQTEgLiIKKyAgICAgICAgICAgIHByaW50ZiAiICAgICQgJXNcbiIgIiRHSVRfTE9HX0NPTU1BTkQiID4+ICRSRUFETUVfRklMRQorICAgICAgICAgICAgKGNkICRBT1NQX1RNUERJUiAmJiBldmFsICRHSVRfTE9HX0NPTU1BTkQpIHwgd2hpbGUgcmVhZCBMSU5FOyBkbworICAgICAgICAgICAgICAgIHByaW50ZiAiICAgICAgICAlc1xuIiAiJExJTkUiID4+ICRSRUFETUVfRklMRQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgcHJpbnRmICJcbiIgPj4gJFJFQURNRV9GSUxFCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhdCA+PiAkUkVBRE1FX0ZJTEUgPDxFT0YKKyAgICAjIE5vIGNoYW5nZXMgdG8gJEFPU1BfU1VCRElSCitFT0YKKyAgICAgICAgZmkKKyAgICBkb25lCitmaQorCisjIyMKKyMjIyAgRE9ORQorIyMjCisKK2R1bXAgIkRvbmUuIFNlZSAkUEtHX0RJUiIKK2xzIC1saCAiJFBLR19ESVIiLyRQS0dfUFJFRklYLSRQS0dfUkVWSVNJT04qCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvc2V0LWNwdS1nb3Zlcm5vci5zaCBiL2FuZHJvaWQvc2NyaXB0cy9zZXQtY3B1LWdvdmVybm9yLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljNTlhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvc2V0LWNwdS1nb3Zlcm5vci5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEEgc21hbGwgc2NyaXB0IHVzZWQgdG8gc2V0IHRoZSBDUFUgZ292ZXJub3IgdG8gZGlmZmVyZW50IHZhbHVlcy4KKworIyBDaGVjayBwYXJhbWV0ZXIKK2Nhc2UgJDEgaW4KKyAgICBvbmRlbWFuZHxwZXJmb3JtYW5jZXxwb3dlcnNhdmUpCisgICAgICAgIDs7CisgICAgKikKKyAgICAgICAgZWNobyA+JjIgIlBsZWFzZSB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyOiBcCitwb3dlcnNhdmUsIG9uZGVtYW5kLCBwZXJmb3JtYW5jZSIKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7Citlc2FjCisKKyMgQ2hlY2sgdGhhdCBrb25kZW1hbmQga2VybmVsIHRocmVhZCBpcyBub3QgcnVubmluZy4KK2lmICQocGdyZXAgLWxmIGtvbmRlbWFuZCA+L2Rldi9udWxsKTsgdGhlbgorICAgIGVjaG8gPiYyICJTb3JyeSwga29uZGVtYW5kIGtlcm5lbCB0aHJlYWQgaXMgcnVubmluZywgY2Fubm90IGNoYW5nZSBDUFUgZ292ZXJub3IiCisgICAgcmV0dXJuCitmaQorCisjIFBlcmZvcm0gdGhlIGNoYW5nZSB3aXRoIHN1ZG8KK3N1ZG8gc2ggLWMgIlwKKyAgICBmb3IgQ1BVRlJFUSBpbiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NwdWZyZXEvc2NhbGluZ19nb3Zlcm5vcjsgZG8gXAorICAgICAgICBpZiBbIC1mIFwiXCRDUFVGUkVRXCIgXTsgdGhlbiBcCisgICAgICAgICAgICBlY2hvIC1uICQxID4gXCRDUFVGUkVROyBcCisgICAgICAgIGZpIFwKKyAgICBkb25lIFwKKyIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy9ydW4tdGVzdHMuc2ggYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvcnVuLXRlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5Nzc0MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvcnVuLXRlc3RzLnNoCkBAIC0wLDAgKzEsOTYgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1BST0dESVI9JChkaXJuYW1lICIkMCIpCisKK1RPUERJUj0kKGNkICRQUk9HRElSLy4uLy4uICYmIHB3ZCAtUCkKKworIyBSZW1vdmUgbGVhZGluZyAuLyBpZiBhcHBsaWNhYmxlLgorUFJPR0RJUj0ke1BST0dESVIjLi99CisKKyMgQXNzdW1lIHdlIGFyZSB1bmRlciAuLi4vYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzLworIyBhbmQgbG9vayBmb3IgLi4uL2FuZHJvaWQvc2NyaXB0cy91dGlscy9jb21tb24uc2hpCisKK19TSFVfUFJPR0RJUj0kVE9QRElSL3V0aWxzCisuICRfU0hVX1BST0dESVIvY29tbW9uLnNoaQorCitzaGVsbF9pbXBvcnQgb3B0aW9uX3BhcnNlci5zaGkKKworUFJPR1JBTV9QQVJBTUVURVJTPQorCitQUk9HUkFNX0RFU0NSSVBUSU9OPVwKKyJSdW4gdGhlIHRlc3Qgc3VpdGUgZm9yIHRoZSBnZW4tZW50cmllcy5weSBzY3JpcHQuIFRoaXMgbG9va3MgZm9yCitmaWxlcyBuYW1lZCB0LjxudW1iZXI+LzxuYW1lPi5lbnRyaWVzLCBhbmQgdXNlcyB0aGVtIGFzIGlucHV0IHRvCisnZ2VuLWVudHJpZXMucHknLiBJdCB0aGVuIGNvbXBhcmVzIHRoZSBvdXRwdXQgdG8gdC48bnVtYmVyPi88bmFtZT4uPG1vZGU+IC4iCisKK09QVF9TQ1JJUFQ9JFRPUERJUi9nZW4tZW50cmllcy5weQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1zY3JpcHQ9PHNjcmlwdD4iIE9QVF9TQ1JJUFQgIlNwZWNpZnkgYWx0ZXJuYXRlIGdlbi1lbnRyaWVzLnB5IHNjcmlwdC4iICIkU0NSSVBUIgorCitPUFRfT1VUX0RJUj0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tb3V0LWRpcj08ZGlyPiIgT1BUX09VVF9ESVIgIkdlbmVyYXRlIG91dHB1dHMgaW50byA8ZGlyPiIKKworT1BUX1RPT0w9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLXRvb2w9PHRvb2w+IiBPUFRfVE9PTCAiTGF1bmNoIHZpc3VhbCBkaWZmIHRvb2wgaW4gY2FzZSBvZiBkaWZmZXJlbmNlcy4iCisKK29wdGlvbl9wYXJzZSAiJEAiCisKKyMgQ2hlY2sgZ2VuLWVudHJpZXMucHkgc2NyaXB0LgoraWYgWyAhIC1mICIkT1BUX1NDUklQVCIgXTsgdGhlbgorICAgIHBhbmljICJDYW5ub3QgZmluZCBzY3JpcHQ6ICRPUFRfU0NSSVBUIgorZmkKKworIyBDcmVhdGUgb3V0cHV0IGRpcmVjdG9yeS4KK09VVF9ESVI9CitpZiBbICIkT1BUX09VVF9ESVIiIF07IHRoZW4KKyAgICBPVVRfRElSPSRPUFRfT1VUX0RJUgorZWxzZQorICAgIE9VVF9ESVI9L3RtcC9lbXVsYXRvci1nZW4tZW50cmllcy10ZXN0aW5nCisgICAgZWNobyAiQXV0by1jb25maWc6IC0tb3V0LWRpcj0kT1VUX0RJUiIKK2ZpCitta2RpciAtcCAiJE9VVF9ESVIiICYmIHJtIC1yZiAiJE9VVF9ESVIvZ2VuLWVudHJpZXMiCisKK09VVF9ESVI9JE9VVF9ESVIvZ2VuLWVudHJpZXMKKworTU9ERVM9ImRlZiBzeW0gd3JhcHBlciBzeW1ib2xzIF9zeW1ib2xzIGZ1bmN0aW9ucyBmdW5jYXJncyIKKworIyBGaW5kIHRlc3QgZGlyZWN0b3JpZXMKK1RFU1RfRElSUz0kKGNkICIkUFJPR0RJUiIgJiYgZmluZCAuIC1uYW1lICJ0LioiIHwgc2VkIC1lICdzfF5cLi98fCcpCitmb3IgVEVTVF9ESVIgaW4gJFRFU1RfRElSUzsgZG8KKyAgICBJTj0kUFJPR0RJUi8kVEVTVF9ESVIKKyAgICBOQU1FUz0kKGNkICRJTiAmJiBmaW5kIC4gLW5hbWUgIiouZW50cmllcyIgfCBzZWQgLWUgJ3N8XlwuL3x8ZycgLWUgJ3N8XC5lbnRyaWVzJHx8ZycpCisgICAgT1VUPSRPVVRfRElSLyRURVNUX0RJUgorICAgIG1rZGlyIC1wICIkT1VUIgorICAgIGZvciBOQU1FIGluICROQU1FUzsgZG8KKyAgICAgICAgZWNobyAiUHJvY2Vzc2luZyAkVEVTVF9ESVIvJE5BTUUuZW50cmllcyIKKyAgICAgICAgcnVuIGNwIC1mICIkSU4vJE5BTUUuZW50cmllcyIgIiRPVVQvJE5BTUUuZW50cmllcyIKKyAgICAgICAgZm9yIE1PREUgaW4gJE1PREVTOyBkbworICAgICAgICAgICAgcnVuICRPUFRfU0NSSVBUIC0tbW9kZT0kTU9ERSAiJElOLyROQU1FLmVudHJpZXMiIC0tb3V0cHV0PSRPVVQvJE5BTUUuJE1PREUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKKyAgICBpZiAhIGRpZmYgLXFyICIkSU4iICIkT1VUIjsgdGhlbgorICAgICAgICBpZiBbICIkT1BUX1RPT0wiIF07IHRoZW4KKyAgICAgICAgICAgICRPUFRfVE9PTCAiJElOIiAiJE9VVCIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiRVJST1I6IEludmFsaWQgZGlmZmVyZW5jZXMgYmV0d2VlbiBhY3R1YWwgYW5kIGV4cGVjdGVkIG91dHB1dCEiCisgICAgICAgICAgICBkaWZmIC1idXJOICIkSU4iICIkT1VUIgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgZmkKK2RvbmUKKworZWNobyAiQWxsIGdvb2QhIgorZXhpdCAwCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5fc3ltYm9scyBiL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0Ll9zeW1ib2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjQzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5fc3ltYm9scwpAQCAtMCwwICsxLDEwIEBACitfaW5pdExpYnJhcnkKK19zZXRTdHJlYW1Nb2RlCitfaW5pdE9wZW5HTFJlbmRlcmVyCitfZ2V0SGFyZHdhcmVTdHJpbmdzCitfc2V0UG9zdENhbGxiYWNrCitfY3JlYXRlT3BlbkdMU3Vid2luZG93CitfZGVzdHJveU9wZW5HTFN1YndpbmRvdworX3NldE9wZW5HTERpc3BsYXlSb3RhdGlvbgorX3JlcGFpbnRPcGVuR0xEaXNwbGF5Citfc3RvcE9wZW5HTFJlbmRlcmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5kZWYgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMGQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0LmRlZgpAQCAtMCwwICsxLDExIEBACitFWFBPUlRTCisgICAgaW5pdExpYnJhcnkKKyAgICBzZXRTdHJlYW1Nb2RlCisgICAgaW5pdE9wZW5HTFJlbmRlcmVyCisgICAgZ2V0SGFyZHdhcmVTdHJpbmdzCisgICAgc2V0UG9zdENhbGxiYWNrCisgICAgY3JlYXRlT3BlbkdMU3Vid2luZG93CisgICAgZGVzdHJveU9wZW5HTFN1YndpbmRvdworICAgIHNldE9wZW5HTERpc3BsYXlSb3RhdGlvbgorICAgIHJlcGFpbnRPcGVuR0xEaXNwbGF5CisgICAgc3RvcE9wZW5HTFJlbmRlcmVyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5lbnRyaWVzIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZW50cmllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVmOTIzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZW50cmllcwpAQCAtMCwwICsxLDEwNiBAQAorIXJlbmRlcl9hcGkKKworJSNpbmNsdWRlICJyZW5kZXJfYXBpX3BsYXRmb3JtX3R5cGVzLmgiCislI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyUjaW5jbHVkZSA8c3RkZGVmLmg+CislI2luY2x1ZGUgPHN0ZGludC5oPgorCisldHlwZWRlZiB2b2lkICgqT25Qb3N0Rm4pKHZvaWQqIGNvbnRleHQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHlkaXIsCislICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyKiBwaXhlbHMpOworCisjIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgYW5kIHRyaWVzIHRvIGxvYWQgdGhlIGNvcnJlc3BvbmRpbmcgRUdML0dMRVMKKyMgdHJhbnNsYXRpb24gbGlicmFyaWVzLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0byBlbnN1cmUgdGhhdAorIyBldmVyeXRoaW5nIHdvcmtzLiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisjIElmIGl0IHJldHVybnMgYW4gZXJyb3IsIHlvdSBjYW5ub3QgdXNlIHRoZSBsaWJyYXJ5IGF0IGFsbC4KK2ludCBpbml0TGlicmFyeSh2b2lkKTsKKworIyBDaGFuZ2UgdGhlIHN0cmVhbSBtb2RlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBpbml0T3BlbkdMUmVuZGVyZXIoKQorIyB8bW9kZXwgaXMgb25lIG9mIFNUUkVBTV9ERUZBVUxULCBTVFJFQU1fVU5JWCwgU1RSRUFNX1RDUCBvciBTVFJFQU1fUElQRS4KK2ludCBzZXRTdHJlYW1Nb2RlKGludCBtb2RlKTsKKworCisjIGluaXRPcGVuR0xSZW5kZXJlciAtIGluaXRpYWxpemUgdGhlIE9wZW5HTCByZW5kZXJlciBwcm9jZXNzLgorIworIyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSB0aGUgZnJhbWVidWZmZXIgZGltZW5zaW9ucyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgdG8gdGhlCisjIGd1ZXN0IGRpc3BsYXkgZHJpdmVyLgorIworIyBhZGRyIGlzIGEgYnVmZmVyIG9mIGFkZHJMZW4gYnl0ZXMgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIGFkZHJlc3MgdGhhdCBjbGllbnRzCisjIHNob3VsZCBjb25uZWN0IHRvLiBUaGUgaW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiB0aGUgdHJhbnNwb3J0OgorIyAgIC0gVENQOiBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSBwb3J0IG51bWJlciBhcyBhIHN0cmluZy4gVGhlIHNlcnZlciBpcworIyAgICAgbGlzdGVuaW5nIG9ubHkgb24gdGhlIGxvb3BiYWNrIGFkZHJlc3MuCisjICAgLSBXaW4zMiBhbmQgVU5JWCBuYW1lZCBwaXBlczogVGhlIGJ1ZmZlciBjb250YWlucyB0aGUgZnVsbCBwYXRoIGNsaWVudHMKKyMgICAgIHNob3VsZCBjb25uZWN0IHRvLgorIworIyBUaGlzIGZ1bmN0aW9uIGlzICpOT1QqIHRocmVhZCBzYWZlIGFuZCBzaG91bGQgYmUgY2FsbGVkIGZpcnN0CisjIHRvIGluaXRpYWxpemUgdGhlIHJlbmRlcmVyIGFmdGVyIGluaXRMaWJyYXJ5KCkuCitpbnQgaW5pdE9wZW5HTFJlbmRlcmVyKGludCB3aWR0aCwgaW50IGhlaWdodCwgY2hhciogYWRkciwgc2l6ZV90IGFkZHJMZW4pOworCisjIGdldEhhcmR3YXJlU3RyaW5ncyAtIGRlc2NyaWJlIHRoZSBHUFUgaGFyZHdhcmUgYW5kIGRyaXZlci4KKyMgVGhlIHVuZGVybHlpbmcgR0wncyB2ZW5kb3IvcmVuZGVyZXIvdmVyc2lvbiBzdHJpbmdzIGFyZSByZXR1cm5lZCB0byB0aGUKKyMgY2FsbGVyLiBUaGUgcG9pbnRlcnMgYmVjb21lIGludmFsaWQgYWZ0ZXIgYSBjYWxsIHRvIHN0b3BPcGVuR0xSZW5kZXJlcigpLgordm9pZCBnZXRIYXJkd2FyZVN0cmluZ3MoY29uc3QgY2hhcioqIHZlbmRvciwgY29uc3QgY2hhcioqIHJlbmRlcmVyLCBjb25zdCBjaGFyKiogdmVyc2lvbik7CisKKyMgQSBwZXItZnJhbWUgY2FsbGJhY2sgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCBzZXRQb3N0Q2FsbGJhY2soKTsgdG8gcmVtb3ZlIGl0CisjIHBhc3MgTlVMTCBmb3IgYm90aCBwYXJhbWV0ZXJzLiBXaGlsZSBhIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIHRoZSByZW5kZXJlcgorIyB3aWxsIGNhbGwgaXQganVzdCBiZWZvcmUgZWFjaCBuZXcgZnJhbWUgaXMgZGlzcGxheWVkLCBwcm92aWRpbmcgYSBjb3B5IG9mCisjIHRoZSBmcmFtZWJ1ZmZlciBjb250ZW50cy4KKyMKKyMgVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZyb20gb25lIG9mIHRoZSByZW5kZXJlcidzIHRocmVhZHMsIHNvIHdpbGwKKyMgcHJvYmFibHkgbmVlZCBzeW5jaHJvbml6YXRpb24gb24gYW55IGRhdGEgc3RydWN0dXJlcyBpdCBtb2RpZmllcy4gVGhlCisjIHBpeGVscyBidWZmZXIgbWF5IGJlIG92ZXJ3cml0dGVuIGFzIHNvb24gYXMgdGhlIGNhbGxiYWNrIHJldHVybnM7IGlmIGl0CisjIG5lZWRzIHRoZSBwaXhlbHMgYWZ0ZXJ3YXJkcyBpdCBtdXN0IGNvcHkgdGhlbS4KKyMKKyMgVGhlIHBpeGVscyBidWZmZXIgaXMgaW50ZW50aW9uYWxseSBub3QgY29uc3Q6IHRoZSBjYWxsYmFjayBtYXkgbW9kaWZ5IHRoZQorIyBkYXRhIHdpdGhvdXQgY29weWluZyB0byBhbm90aGVyIGJ1ZmZlciBpZiBpdCB3YW50cywgZS5nLiBpbi1wbGFjZSBSR0JBIHRvCisjIFJHQiBjb252ZXJzaW9uLCBvciBpbi1wbGFjZSB5LWludmVyc2lvbi4KKyMKKyMgUGFyYW1ldGVycyBhcmU6CisjICAgY29udGV4dCAgICAgICAgVGhlIHBvaW50ZXIgb3B0aW9uYWxseSBwcm92aWRlZCB3aGVuIHRoZSBjYWxsYmFjayB3YXMKKyMgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkLiBUaGUgY2xpZW50IGNhbiB1c2UgdGhpcyB0byBwYXNzIHdoYXRldmVyCisjICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gaXQgd2FudHMgdG8gdGhlIGNhbGxiYWNrLgorIyAgIHdpZHRoLCBoZWlnaHQgIERpbWVuc2lvbnMgb2YgdGhlIGltYWdlLCBpbiBwaXhlbHMuIFJvd3MgYXJlIHRpZ2h0bHkKKyMgICAgICAgICAgICAgICAgICBwYWNrZWQ7IHRoZXJlIGlzIG5vIGludGVyLXJvdyBwYWRkaW5nLgorIyAgIHlkaXIgICAgICAgICAgIEluZGljYXRlcyByb3cgb3JkZXI6IDEgbWVhbnMgdG9wLXRvLWJvdHRvbSBvcmRlciwgLTEgbWVhbnMKKyMgICAgICAgICAgICAgICAgICBib3R0b20tdG8tdG9wIG9yZGVyLgorIyAgIGZvcm1hdCwgdHlwZSAgIEZvcm1hdCBhbmQgdHlwZSBHTCBlbnVtcywgYXMgdXNlZCBpbiBnbFRleEltYWdlMkQoKSBvcgorIyAgICAgICAgICAgICAgICAgIGdsUmVhZFBpeGVscygpLCBkZXNjcmliaW5nIHRoZSBwaXhlbCBmb3JtYXQuCisjICAgcGl4ZWxzICAgICAgICAgVGhlIGZyYW1lYnVmZmVyIGltYWdlLgorIworIyBJbiB0aGUgZmlyc3QgaW1wbGVtZW50YXRpb24sIHlkaXIgaXMgYWx3YXlzIC0xIChib3R0b20gdG8gdG9wKSwgZm9ybWF0IGFuZAorIyB0eXBlIGFyZSBhbHdheXMgR0xfUkdCQSBhbmQgR0xfVU5TSUdORURfQllURSwgYW5kIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwKKyMgYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmVzIHBhc3NlZCB0byBpbml0T3BlbkdMUmVuZGVyZXIoKS4KK3ZvaWQgc2V0UG9zdENhbGxiYWNrKE9uUG9zdEZuIG9uUG9zdCwgdm9pZCogb25Qb3N0Q29udGV4dCk7CisKKyMgY3JlYXRlT3BlbkdMU3Vid2luZG93IC0KKyMgICAgIENyZWF0ZSBhIG5hdGl2ZSBzdWJ3aW5kb3cgd2hpY2ggaXMgYSBjaGlsZCBvZiAnd2luZG93JworIyAgICAgdG8gYmUgdXNlZCBmb3IgZnJhbWVidWZmZXIgZGlzcGxheS4KKyMgICAgIHgseSx3aWR0aCxoZWlnaHQgYXJlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSByZW5kZXJpbmcgc3Vid2luZG93LgorIyAgICAgelJvdCBpcyB0aGUgcm90YXRpb24gdG8gYXBwbHkgb24gdGhlIGZyYW1lYnVmZmVyIGRpc3BsYXkgaW1hZ2UuCisjCisjICAgICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gdXNpbmcKKyMgICAgIGEgc29mdHdhcmUtb25seSByZW5kZXJlciBsaWtlIE9TTWVzYS4gSW4gdGhpcyBjYXNlLCB0aGUgY2xpZW50IHNob3VsZAorIyAgICAgY2FsbCBzZXRQb3N0Q2FsbGJhY2sgdG8gZ2V0IHRoZSBjb250ZW50IG9mIGVhY2ggbmV3IGZyYW1lIHdoZW4gaXQgaXMKKyMgICAgIHBvc3RlZCwgYW5kIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGRpc3BsYXlpbmcgaXQuCitib29sIGNyZWF0ZU9wZW5HTFN1YndpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgelJvdCk7CisKKyMgZGVzdHJveU9wZW5HTFN1YndpbmRvdyAtCisjICAgZGVzdHJveXMgdGhlIGNyZWF0ZWQgbmF0aXZlIHN1YndpbmRvdy4gT25jZSBkZXN0cm95ZWQsCisjICAgRnJhbWVidWZmZXIgY29udGVudCB3aWxsIG5vdCBiZSB2aXNpYmxlIHVudGlsIGEgbmV3CisjICAgc3Vid2luZG93IHdpbGwgYmUgY3JlYXRlZC4KKyMgICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCitib29sIGRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3codm9pZCk7CisKKyMgc2V0T3BlbkdMRGlzcGxheVJvdGF0aW9uIC0KKyMgICAgc2V0IHRoZSBmcmFtZWJ1ZmZlciBkaXNwbGF5IGltYWdlIHJvdGF0aW9uIGluIHVuaXRzCisjICAgIG9mIGRlZ3JlZXMgYXJvdW5kIHRoZSB6IGF4aXMKK3ZvaWQgc2V0T3BlbkdMRGlzcGxheVJvdGF0aW9uKGZsb2F0IHpSb3QpOworCisjIHJlcGFpbnRPcGVuR0xEaXNwbGF5IC0KKyMgICAgY2F1c2VzIHRoZSBPcGVuR0wgc3Vid2luZG93IHRvIGdldCByZXBhaW50ZWQgd2l0aCB0aGUKKyMgICAgbGF0ZXN0IGZyYW1lYnVmZmVyIGNvbnRlbnQuCit2b2lkIHJlcGFpbnRPcGVuR0xEaXNwbGF5KHZvaWQpOworCisjIHN0b3BPcGVuR0xSZW5kZXJlciAtIHN0b3BzIHRoZSBPcGVuR0wgcmVuZGVyZXIgcHJvY2Vzcy4KKyMgICAgIFRoaXMgZnVuY3Rpb25zIGlzI05PVCogdGhyZWFkIHNhZmUgYW5kIHNob3VsZCBiZSBjYWxsZWQKKyMgICAgIG9ubHkgaWYgcHJldmlvdXMgaW5pdE9wZW5HTFJlbmRlcmVyIGhhcyByZXR1cm5lZCB0cnVlLgoraW50IHN0b3BPcGVuR0xSZW5kZXJlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0LmZ1bmNhcmdzIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZnVuY2FyZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliNTZiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0LmZ1bmNhcmdzCkBAIC0wLDAgKzEsMjYgQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9ZnVuY2FyZ3MgYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZW50cmllcyAtLW91dHB1dD0vdG1wL2VtdWxhdG9yLWdlbi1lbnRyaWVzLXRlc3RpbmcvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5mdW5jYXJncworLy8gRE8gTk9UIEVESVQgVEhJUyBGSUxFCisKKyNpZm5kZWYgUkVOREVSX0FQSV9GVU5DVElPTlNfSAorI2RlZmluZSBSRU5ERVJfQVBJX0ZVTkNUSU9OU19ICisKKyNpbmNsdWRlICJyZW5kZXJfYXBpX3BsYXRmb3JtX3R5cGVzLmgiCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiB2b2lkICgqT25Qb3N0Rm4pKHZvaWQqIGNvbnRleHQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHlkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIqIHBpeGVscyk7CisjZGVmaW5lIExJU1RfUkVOREVSX0FQSV9GVU5DVElPTlMoWCkgXAorICBYKGludCwgaW5pdExpYnJhcnksICgpLCAoKSkgXAorICBYKGludCwgc2V0U3RyZWFtTW9kZSwgKGludCBtb2RlKSwgKG1vZGUpKSBcCisgIFgoaW50LCBpbml0T3BlbkdMUmVuZGVyZXIsIChpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNoYXIqIGFkZHIsIHNpemVfdCBhZGRyTGVuKSwgKHdpZHRoLCBoZWlnaHQsIGFkZHIsIGFkZHJMZW4pKSBcCisgIFgodm9pZCwgZ2V0SGFyZHdhcmVTdHJpbmdzLCAoY29uc3QgY2hhcioqIHZlbmRvciwgY29uc3QgY2hhcioqIHJlbmRlcmVyLCBjb25zdCBjaGFyKiogdmVyc2lvbiksICh2ZW5kb3IsIHJlbmRlcmVyLCB2ZXJzaW9uKSkgXAorICBYKHZvaWQsIHNldFBvc3RDYWxsYmFjaywgKE9uUG9zdEZuIG9uUG9zdCwgdm9pZCogb25Qb3N0Q29udGV4dCksIChvblBvc3QsIG9uUG9zdENvbnRleHQpKSBcCisgIFgoYm9vbCwgY3JlYXRlT3BlbkdMU3Vid2luZG93LCAoRkJOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0IHpSb3QpLCAod2luZG93LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6Um90KSkgXAorICBYKGJvb2wsIGRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3csICgpLCAoKSkgXAorICBYKHZvaWQsIHNldE9wZW5HTERpc3BsYXlSb3RhdGlvbiwgKGZsb2F0IHpSb3QpLCAoelJvdCkpIFwKKyAgWCh2b2lkLCByZXBhaW50T3BlbkdMRGlzcGxheSwgKCksICgpKSBcCisgIFgoaW50LCBzdG9wT3BlbkdMUmVuZGVyZXIsICgpLCAoKSkgXAorCisKKyNlbmRpZiAgLy8gUkVOREVSX0FQSV9GVU5DVElPTlNfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZnVuY3Rpb25zIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZnVuY3Rpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxODdkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5mdW5jdGlvbnMKQEAgLTAsMCArMSwyNiBAQAorLy8gQXV0by1nZW5lcmF0ZWQgd2l0aDogYW5kcm9pZC9zY3JpcHRzL2dlbi1lbnRyaWVzLnB5IC0tbW9kZT1mdW5jdGlvbnMgYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3QuZW50cmllcyAtLW91dHB1dD0vdG1wL2VtdWxhdG9yLWdlbi1lbnRyaWVzLXRlc3RpbmcvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5mdW5jdGlvbnMKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaWZuZGVmIFJFTkRFUl9BUElfRlVOQ1RJT05TX0gKKyNkZWZpbmUgUkVOREVSX0FQSV9GVU5DVElPTlNfSAorCisjaW5jbHVkZSAicmVuZGVyX2FwaV9wbGF0Zm9ybV90eXBlcy5oIgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgdm9pZCAoKk9uUG9zdEZuKSh2b2lkKiBjb250ZXh0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB5ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyKiBwaXhlbHMpOworI2RlZmluZSBMSVNUX1JFTkRFUl9BUElfRlVOQ1RJT05TKFgpIFwKKyAgWChpbnQsIGluaXRMaWJyYXJ5LCAoKSkgXAorICBYKGludCwgc2V0U3RyZWFtTW9kZSwgKGludCBtb2RlKSkgXAorICBYKGludCwgaW5pdE9wZW5HTFJlbmRlcmVyLCAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjaGFyKiBhZGRyLCBzaXplX3QgYWRkckxlbikpIFwKKyAgWCh2b2lkLCBnZXRIYXJkd2FyZVN0cmluZ3MsIChjb25zdCBjaGFyKiogdmVuZG9yLCBjb25zdCBjaGFyKiogcmVuZGVyZXIsIGNvbnN0IGNoYXIqKiB2ZXJzaW9uKSkgXAorICBYKHZvaWQsIHNldFBvc3RDYWxsYmFjaywgKE9uUG9zdEZuIG9uUG9zdCwgdm9pZCogb25Qb3N0Q29udGV4dCkpIFwKKyAgWChib29sLCBjcmVhdGVPcGVuR0xTdWJ3aW5kb3csIChGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgelJvdCkpIFwKKyAgWChib29sLCBkZXN0cm95T3BlbkdMU3Vid2luZG93LCAoKSkgXAorICBYKHZvaWQsIHNldE9wZW5HTERpc3BsYXlSb3RhdGlvbiwgKGZsb2F0IHpSb3QpKSBcCisgIFgodm9pZCwgcmVwYWludE9wZW5HTERpc3BsYXksICgpKSBcCisgIFgoaW50LCBzdG9wT3BlbkdMUmVuZGVyZXIsICgpKSBcCisKKworI2VuZGlmICAvLyBSRU5ERVJfQVBJX0ZVTkNUSU9OU19ICmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5zeW0gYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5zeW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU1ZjU0NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0LnN5bQpAQCAtMCwwICsxLDE1IEBACitWRVJTSU9OIHsKKwlnbG9iYWw6CisJCWluaXRMaWJyYXJ5OworCQlzZXRTdHJlYW1Nb2RlOworCQlpbml0T3BlbkdMUmVuZGVyZXI7CisJCWdldEhhcmR3YXJlU3RyaW5nczsKKwkJc2V0UG9zdENhbGxiYWNrOworCQljcmVhdGVPcGVuR0xTdWJ3aW5kb3c7CisJCWRlc3Ryb3lPcGVuR0xTdWJ3aW5kb3c7CisJCXNldE9wZW5HTERpc3BsYXlSb3RhdGlvbjsKKwkJcmVwYWludE9wZW5HTERpc3BsYXk7CisJCXN0b3BPcGVuR0xSZW5kZXJlcjsKKwlsb2NhbDoKKwkJKjsKK307CmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5zeW1ib2xzIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3Quc3ltYm9scwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2RlMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3Rlc3RzL2dlbi1lbnRyaWVzL3QuMDAxL3Rlc3Quc3ltYm9scwpAQCAtMCwwICsxLDEwIEBACitpbml0TGlicmFyeQorc2V0U3RyZWFtTW9kZQoraW5pdE9wZW5HTFJlbmRlcmVyCitnZXRIYXJkd2FyZVN0cmluZ3MKK3NldFBvc3RDYWxsYmFjaworY3JlYXRlT3BlbkdMU3Vid2luZG93CitkZXN0cm95T3BlbkdMU3Vid2luZG93CitzZXRPcGVuR0xEaXNwbGF5Um90YXRpb24KK3JlcGFpbnRPcGVuR0xEaXNwbGF5CitzdG9wT3BlbkdMUmVuZGVyZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy90ZXN0cy9nZW4tZW50cmllcy90LjAwMS90ZXN0LndyYXBwZXIgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC53cmFwcGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTBhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC53cmFwcGVyCkBAIC0wLDAgKzEsOTggQEAKKy8vIEF1dG8tZ2VuZXJhdGVkIHdpdGg6IGFuZHJvaWQvc2NyaXB0cy9nZW4tZW50cmllcy5weSAtLW1vZGU9d3JhcHBlciBhbmRyb2lkL3NjcmlwdHMvdGVzdHMvZ2VuLWVudHJpZXMvdC4wMDEvdGVzdC5lbnRyaWVzIC0tb3V0cHV0PS90bXAvZW11bGF0b3ItZ2VuLWVudHJpZXMtdGVzdGluZy9nZW4tZW50cmllcy90LjAwMS90ZXN0LndyYXBwZXIKKy8vIERPIE5PVCBFRElUIFRISVMgRklMRQorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlICJyZW5kZXJfYXBpX3BsYXRmb3JtX3R5cGVzLmgiCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiB2b2lkICgqT25Qb3N0Rm4pKHZvaWQqIGNvbnRleHQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHlkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIqIHBpeGVscyk7CisKKy8vLworLy8vICBXIFIgQSBQIFAgRSBSICAgUCBPIEkgTiBUIEUgUiBTCisvLy8KKworc3RhdGljIGludCAoKl9fZGxsX2luaXRMaWJyYXJ5KSgpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zZXRTdHJlYW1Nb2RlKShpbnQgbW9kZSkgPSAwOworc3RhdGljIGludCAoKl9fZGxsX2luaXRPcGVuR0xSZW5kZXJlcikoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjaGFyKiBhZGRyLCBzaXplX3QgYWRkckxlbikgPSAwOworc3RhdGljIHZvaWQgKCpfX2RsbF9nZXRIYXJkd2FyZVN0cmluZ3MpKGNvbnN0IGNoYXIqKiB2ZW5kb3IsIGNvbnN0IGNoYXIqKiByZW5kZXJlciwgY29uc3QgY2hhcioqIHZlcnNpb24pID0gMDsKK3N0YXRpYyB2b2lkICgqX19kbGxfc2V0UG9zdENhbGxiYWNrKShPblBvc3RGbiBvblBvc3QsIHZvaWQqIG9uUG9zdENvbnRleHQpID0gMDsKK3N0YXRpYyBib29sICgqX19kbGxfY3JlYXRlT3BlbkdMU3Vid2luZG93KShGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgelJvdCkgPSAwOworc3RhdGljIGJvb2wgKCpfX2RsbF9kZXN0cm95T3BlbkdMU3Vid2luZG93KSgpID0gMDsKK3N0YXRpYyB2b2lkICgqX19kbGxfc2V0T3BlbkdMRGlzcGxheVJvdGF0aW9uKShmbG9hdCB6Um90KSA9IDA7CitzdGF0aWMgdm9pZCAoKl9fZGxsX3JlcGFpbnRPcGVuR0xEaXNwbGF5KSgpID0gMDsKK3N0YXRpYyBpbnQgKCpfX2RsbF9zdG9wT3BlbkdMUmVuZGVyZXIpKCkgPSAwOworCisvLy8KKy8vLyAgVyBSIEEgUCBQIEUgUiAgIEYgVSBOIEMgVCBJIE8gTiBTCisvLy8KKworaW50IGluaXRMaWJyYXJ5KCkgeworICByZXR1cm4gX19kbGxfaW5pdExpYnJhcnkoKTsKK30KKworaW50IHNldFN0cmVhbU1vZGUoaW50IG1vZGUpIHsKKyAgcmV0dXJuIF9fZGxsX3NldFN0cmVhbU1vZGUobW9kZSk7Cit9CisKK2ludCBpbml0T3BlbkdMUmVuZGVyZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjaGFyKiBhZGRyLCBzaXplX3QgYWRkckxlbikgeworICByZXR1cm4gX19kbGxfaW5pdE9wZW5HTFJlbmRlcmVyKHdpZHRoLCBoZWlnaHQsIGFkZHIsIGFkZHJMZW4pOworfQorCit2b2lkIGdldEhhcmR3YXJlU3RyaW5ncyhjb25zdCBjaGFyKiogdmVuZG9yLCBjb25zdCBjaGFyKiogcmVuZGVyZXIsIGNvbnN0IGNoYXIqKiB2ZXJzaW9uKSB7CisgIF9fZGxsX2dldEhhcmR3YXJlU3RyaW5ncyh2ZW5kb3IsIHJlbmRlcmVyLCB2ZXJzaW9uKTsKK30KKwordm9pZCBzZXRQb3N0Q2FsbGJhY2soT25Qb3N0Rm4gb25Qb3N0LCB2b2lkKiBvblBvc3RDb250ZXh0KSB7CisgIF9fZGxsX3NldFBvc3RDYWxsYmFjayhvblBvc3QsIG9uUG9zdENvbnRleHQpOworfQorCitib29sIGNyZWF0ZU9wZW5HTFN1YndpbmRvdyhGQk5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgZmxvYXQgelJvdCkgeworICByZXR1cm4gX19kbGxfY3JlYXRlT3BlbkdMU3Vid2luZG93KHdpbmRvdywgeCwgeSwgd2lkdGgsIGhlaWdodCwgelJvdCk7Cit9CisKK2Jvb2wgZGVzdHJveU9wZW5HTFN1YndpbmRvdygpIHsKKyAgcmV0dXJuIF9fZGxsX2Rlc3Ryb3lPcGVuR0xTdWJ3aW5kb3coKTsKK30KKwordm9pZCBzZXRPcGVuR0xEaXNwbGF5Um90YXRpb24oZmxvYXQgelJvdCkgeworICBfX2RsbF9zZXRPcGVuR0xEaXNwbGF5Um90YXRpb24oelJvdCk7Cit9CisKK3ZvaWQgcmVwYWludE9wZW5HTERpc3BsYXkoKSB7CisgIF9fZGxsX3JlcGFpbnRPcGVuR0xEaXNwbGF5KCk7Cit9CisKK2ludCBzdG9wT3BlbkdMUmVuZGVyZXIoKSB7CisgIHJldHVybiBfX2RsbF9zdG9wT3BlbkdMUmVuZGVyZXIoKTsKK30KKworCisvLy8KKy8vLyAgSSBOIEkgVCBJIEEgTCBJIFogQSBUIEkgTyBOICAgRiBVIE4gQyBUIEkgTyBOCisvLy8KKworaW50IHJlbmRlcl9hcGlfZHlubGlua19pbml0KHZvaWQqIGxpYikgeworICBfX2RsbF9pbml0TGlicmFyeSA9IChpbnQoKikoKSlkbHN5bShsaWIsICJpbml0TGlicmFyeSIpOworICBpZiAoIV9fZGxsX2luaXRMaWJyYXJ5KSByZXR1cm4gLTE7CisgIF9fZGxsX3NldFN0cmVhbU1vZGUgPSAoaW50KCopKGludCBtb2RlKSlkbHN5bShsaWIsICJzZXRTdHJlYW1Nb2RlIik7CisgIGlmICghX19kbGxfc2V0U3RyZWFtTW9kZSkgcmV0dXJuIC0xOworICBfX2RsbF9pbml0T3BlbkdMUmVuZGVyZXIgPSAoaW50KCopKGludCB3aWR0aCwgaW50IGhlaWdodCwgY2hhciogYWRkciwgc2l6ZV90IGFkZHJMZW4pKWRsc3ltKGxpYiwgImluaXRPcGVuR0xSZW5kZXJlciIpOworICBpZiAoIV9fZGxsX2luaXRPcGVuR0xSZW5kZXJlcikgcmV0dXJuIC0xOworICBfX2RsbF9nZXRIYXJkd2FyZVN0cmluZ3MgPSAodm9pZCgqKShjb25zdCBjaGFyKiogdmVuZG9yLCBjb25zdCBjaGFyKiogcmVuZGVyZXIsIGNvbnN0IGNoYXIqKiB2ZXJzaW9uKSlkbHN5bShsaWIsICJnZXRIYXJkd2FyZVN0cmluZ3MiKTsKKyAgaWYgKCFfX2RsbF9nZXRIYXJkd2FyZVN0cmluZ3MpIHJldHVybiAtMTsKKyAgX19kbGxfc2V0UG9zdENhbGxiYWNrID0gKHZvaWQoKikoT25Qb3N0Rm4gb25Qb3N0LCB2b2lkKiBvblBvc3RDb250ZXh0KSlkbHN5bShsaWIsICJzZXRQb3N0Q2FsbGJhY2siKTsKKyAgaWYgKCFfX2RsbF9zZXRQb3N0Q2FsbGJhY2spIHJldHVybiAtMTsKKyAgX19kbGxfY3JlYXRlT3BlbkdMU3Vid2luZG93ID0gKGJvb2woKikoRkJOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0IHpSb3QpKWRsc3ltKGxpYiwgImNyZWF0ZU9wZW5HTFN1YndpbmRvdyIpOworICBpZiAoIV9fZGxsX2NyZWF0ZU9wZW5HTFN1YndpbmRvdykgcmV0dXJuIC0xOworICBfX2RsbF9kZXN0cm95T3BlbkdMU3Vid2luZG93ID0gKGJvb2woKikoKSlkbHN5bShsaWIsICJkZXN0cm95T3BlbkdMU3Vid2luZG93Iik7CisgIGlmICghX19kbGxfZGVzdHJveU9wZW5HTFN1YndpbmRvdykgcmV0dXJuIC0xOworICBfX2RsbF9zZXRPcGVuR0xEaXNwbGF5Um90YXRpb24gPSAodm9pZCgqKShmbG9hdCB6Um90KSlkbHN5bShsaWIsICJzZXRPcGVuR0xEaXNwbGF5Um90YXRpb24iKTsKKyAgaWYgKCFfX2RsbF9zZXRPcGVuR0xEaXNwbGF5Um90YXRpb24pIHJldHVybiAtMTsKKyAgX19kbGxfcmVwYWludE9wZW5HTERpc3BsYXkgPSAodm9pZCgqKSgpKWRsc3ltKGxpYiwgInJlcGFpbnRPcGVuR0xEaXNwbGF5Iik7CisgIGlmICghX19kbGxfcmVwYWludE9wZW5HTERpc3BsYXkpIHJldHVybiAtMTsKKyAgX19kbGxfc3RvcE9wZW5HTFJlbmRlcmVyID0gKGludCgqKSgpKWRsc3ltKGxpYiwgInN0b3BPcGVuR0xSZW5kZXJlciIpOworICBpZiAoIV9fZGxsX3N0b3BPcGVuR0xSZW5kZXJlcikgcmV0dXJuIC0xOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy91cGxvYWQtc3ltYm9scy5zaCBiL2FuZHJvaWQvc2NyaXB0cy91cGxvYWQtc3ltYm9scy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWUyYWZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3VwbG9hZC1zeW1ib2xzLnNoCkBAIC0wLDAgKzEsMTA3IEBACisjIS9iaW4vYmFzaAorCisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy4gJChkaXJuYW1lICIkMCIpL3V0aWxzL2NvbW1vbi5zaGkKKworc2hlbGxfaW1wb3J0IHV0aWxzL29wdGlvbl9wYXJzZXIuc2hpCisKK1BST0RVQ1Q9QW5kcm9pZEVtdWxhdG9yCitTVEFHSU5HX1VSTD1odHRwczovL2NsaWVudHMyLmdvb2dsZS5jb20vY3Ivc3RhZ2luZ19zeW1ib2wgIyBzdGFnaW5nCitQUk9EX1VSTD1odHRwczovL2NsaWVudHMyLmdvb2dsZS5jb20vY3Ivc3ltYm9sICMgcHJvZHVjdGlvbgorCisKKyMjIworIyMjICBDT01NQU5EIExJTkUgUEFSU0lORworIyMjCisKK09QVF9TWU1CT0xfRElSPQorb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1zeW1ib2wtZGlyPTxwYXRoPiIgT1BUX1NZTUJPTF9ESVIgXAorICAgICAgICJQYXRoIHRvIEJyZWFrcGFkIHN5bWJvbCBkaXIuIgorCitPUFRfQ1JBU0hfU1RBR0lORz0KK29wdGlvbl9yZWdpc3Rlcl92YXIgIi0tY3Jhc2gtc3RhZ2luZyIgT1BUX0NSQVNIX1NUQUdJTkcgXAorICAgICAgICJVcGxvYWQgY3Jhc2hlcyB0byBzdGFnaW5nLiIKKworT1BUX0NSQVNIX1BST0Q9CitvcHRpb25fcmVnaXN0ZXJfdmFyICItLWNyYXNoLXByb2QiIE9QVF9DUkFTSF9QUk9EIFwKKyAgICAgICAiVXBsb2FkIGNyYXNoZXMgdG8gcHJvZHVjdGlvbi4iCisKKworUFJPR1JBTV9ERVNDUklQVElPTj1cCisiVXBsb2FkcyBhIHN5bWJvbCBkaXJlY3RvcnkgdG8gZWl0aGVyIHN0YWdpbmcgb3IgcHJvZHVjdGlvbiBjcmFzaCBzZXJ2ZXIKKworVXNlIC0tY3Jhc2gtcHJvZCBvciAtLWNyYXNoLXN0YWdpbmcgdG8gc2VsZWN0IGJldHdlZW4gc2VydmVycworCitVc2UgLS1zeW1ib2wtZGlyIHRvIHByb3ZpZGUgc3ltYm9sIGRpcmVjdG9yeQorCitTeW1ib2wgZGlyZWN0b3J5IGNvbnRhaW5zIGFueSBzdHJ1Y3R1cmUgb2YgKi5zeW0gZmlsZXM6IgorCitvcHRpb25fcGFyc2UgIiRAIgorCitTWU1CT0xfRElSPQoraWYgWyAteiAiJE9QVF9TWU1CT0xfRElSIiBdOyB0aGVuCisgIHBhbmljICItLXN5bWJvbC1kaXI9PHBhdGg+IGlzIHJlcXVpcmVkIgorZWxzZQorICBTWU1CT0xfRElSPSIkT1BUX1NZTUJPTF9ESVIiCitmaQorCitpZiBbICIkT1BUX0NSQVNIX1BST0QiIF0gJiYgWyAiJE9QVF9DUkFTSF9TVEFHSU5HIiBdOyB0aGVuCisgIHBhbmljICJDYW4gbm90IHVzZSBib3RoIC0tY3Jhc2gtc3RhZ2luZyBhbmQgLS1jcmFzaC1wcm9kIGF0IHRoZSBzYW1lIHRpbWUiCitmaQorCitpZiBbIC16ICIkT1BUX0NSQVNIX1BST0QiIF0gJiYgWyAteiAiJE9QVF9DUkFTSF9TVEFHSU5HIiBdOyB0aGVuCisgIHBhbmljICJNdXN0IHVzZSBlaXRoZXIgLS1jcmFzaC1zdGFnaW5nIG9yIC0tY3Jhc2gtcHJvZCIKK2ZpCisKK1VSTD0KK2lmIFsgIiRPUFRfQ1JBU0hfUFJPRCIgXTsgdGhlbgorICBVUkw9JFBST0RfVVJMCitlbHNlCisgIFVSTD0kU1RBR0lOR19VUkwKK2ZpCisKK3Byb2Nlc3Nfc3ltYm9sICgpIHsKKyAgICBTWU1CT0xfRklMRT0iJDEiCisgICAgTElORT0kKHNlZCAtbiAtZSAxcCAiJFNZTUJPTF9GSUxFIikKKyAgICByZWFkIE1PRFVMRSBPUyBBUkNIIERFQlVHX0lERU5USUZJRVIgREVCVUdfRklMRSA8PDwiJExJTkUiCisgICAgaWYgWyAiJE1PRFVMRSIgIT0gTU9EVUxFIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNvcnJ1cHQgc3ltYm9sIGZpbGUgJFNZTUJPTF9GSUxFIgorICAgIGZpCisKKyAgICBDT0RFX0ZJTEU9JERFQlVHX0ZJTEUKKyAgICBDT0RFX0lERU5USUZJRVI9JERFQlVHX0lERU5USUZJRVIKKworICAgIGVjaG8gLW4gLWUgY3VybCBcCisgICAgICAgIC0tc2hvdy1lcnJvciBcCisgICAgICAgIC0tc2lsZW50IFwKKyAgICAgICAgLS1kdW1wLWhlYWRlciAvZGV2L251bGwgXAorICAgICAgICAtLWZvcm0gcHJvZHVjdD0iJFBST0RVQ1QiIFwKKyAgICAgICAgLS1mb3JtIGNvZGVGaWxlPSIkQ09ERV9GSUxFIiBcCisgICAgICAgIC0tZm9ybSBjb2RlSWRlbnRpZmllcj0iJENPREVfSURFTlRJRklFUiIgXAorICAgICAgICAtLWZvcm0gZGVidWdGaWxlPSIkREVCVUdfRklMRSIgXAorICAgICAgICAtLWZvcm0gZGVidWdJZGVudGlmaWVyPSIkREVCVUdfSURFTlRJRklFUiIgXAorICAgICAgICAtLWZvcm0gc3ltYm9sRmlsZT0iQCRTWU1CT0xfRklMRSIgXAorICAgICAgICAiJFVSTCIgXAorICAgICAgICAiXDAiCit9CisKK3Byb2Nlc3NfZGlyICgpIHsKKyAgICBmaW5kICRTWU1CT0xfRElSIC10eXBlIGYgLXByaW50MCAtbmFtZSAiKi5zeW0iIHwgd2hpbGUgcmVhZCAtZCAkJ1wwJyBmaWxlOyBkbworICAgICAgICBwcm9jZXNzX3N5bWJvbCAkZmlsZQorICAgIGRvbmUKK30KKworcHJvY2Vzc19kaXIgfCB4YXJncyAtMCAtbjEgLVAgNSAtdCBiYXNoIC1jCmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvYW9zcF9kaXIuc2hpIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2Fvc3BfZGlyLnNoaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWM3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2Fvc3BfZGlyLnNoaQpAQCAtMCwwICsxLDE1NSBAQAorIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZ1bmN0aW9ucyB1c2VkIHRvIGF1dG8tZGV0ZWN0IGFuZCBtYW5hZ2UgdGhlIEFPU1AgcHJlYnVpbHRzIGRpcmVjdG9yaWVzCisjIGZvciBvdGhlciBzY3JpcHRzLgorIworIyBVc2FnZToKKyMKKyMgIDEpIENhbGwgfGFvc3BfZGlyX3JlZ2lzdGVyX29wdGlvbnwgYmVmb3JlIGNhbGxpbmcgfG9wdGlvbl9wYXJzZXwgdG8KKyMgICAgIGFkZCB0aGUgLS1hb3NwLWRpcj08cGF0aD4gb3B0aW9uIHRvIHRoZSBjdXJyZW50IHNjcmlwdCdzIGNvbW1hbmQtbGluZS4KKyMKKyMgIDIpIENhbGwgfGFvc3BfZGlyX3BhcnNlX29wdGlvbnwgYWZ0ZXIgY2FsbGluZyB8b3B0aW9uX3BhcnNlfCBpbiBvcmRlciB0bworIyAgICAgcGFyc2UgYW5kIHZhbGlkYXRlIHRoZSBvcHRpb24gb3IgdGhlIGVudmlyb25tZW50LgorIworIyAgICAgT24gc3VjY2VzcywgdGhpcyBkZWZpbmVzIEFPU1BfRElSIGFuZCBBT1NQX1BSRUJVSUxUU19HQ0NfRElSCisKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorCithb3NwX2Rpcl9yZWdpc3Rlcl9vcHRpb24gKCkgeworCisgICAgT1BUX0FPU1BfRElSPQorICAgIG9wdGlvbl9yZWdpc3Rlcl92YXIgIi0tYW9zcC1kaXI9PGRpcj4iIE9QVF9BT1NQX0RJUiBcCisgICAgICAgICAgICAiU3BlY2lmeSBBT1NQIHJvb3QgZGlyZWN0b3J5LiBbYXV0b2RldGVjdF0iCit9CisKK2Fvc3BfZGlyX3BhcnNlX29wdGlvbiAoKSB7CisgICAgaWYgWyAiJE9QVF9BT1NQX0RJUiIgXTsgdGhlbgorICAgICAgICBpZiBbICEgLWQgIiRPUFRfQU9TUF9ESVIiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJOb3QgYSBkaXJlY3Rvcnk6ICRPUFRfQU9TUF9ESVIiCisgICAgICAgIGZpCisgICAgICAgIEFPU1BfRElSPSRPUFRfQU9TUF9ESVIKKyAgICAgICAgbG9nICJVc2luZyBBT1NQIGRpcjogJEFPU1BfRElSIgorICAgIGVsaWYgWyAiJEFORFJPSURfRU1VTEFUT1JfQU9TUF9ESVIiIF07IHRoZW4KKyAgICAgICAgQU9TUF9ESVI9JEFORFJPSURfRU1VTEFUT1JfQU9TUF9ESVIKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1hb3NwLWRpcj0kQU9TUF9ESVIgIFtlbnZpcm9ubWVudF0iCisgICAgZWxzZQorICAgICAgICAjIEFzc3VtZSB0aGF0IHRoZSBjdXJyZW50IHNjcmlwdCBpcyB1bmRlciBleHRlcm5hbC9xZW11L2FuZHJvaWQvc2NyaXB0cworICAgICAgICBsb2NhbCBQUk9CRV9ESVI9IiQocHJvZ3JhbV9kaXJlY3RvcnkpLy4uIgorICAgICAgICB3aGlsZSBbICIkUFJPQkVfRElSIiAhPSAiLyIgXTsgZG8KKyAgICAgICAgICAgIFBST0JFX0RJUj0kKGNkICIkUFJPQkVfRElSIiAyPi9kZXYvbnVsbCAmJiBwd2QgLVAgfHwgdHJ1ZSkKKyAgICAgICAgICAgIGlmIFsgLXogIiRQUk9CRV9ESVIiIC1vICIkUFJPQkVfRElSIiA9ICIvIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgZHVtcCAiUGxlYXNlIGRlZmluZSBBTkRST0lEX0VNVUxBVE9SX0FPU1BfRElSIGluIHlvdXIgZW52aXJvbm1lbnQsIgorICAgICAgICAgICAgICAgIGR1bXAgIm9yIHVzZSAtLWFvc3AtZGlyPTxwYXRoPiBvbiB0aGUgY29tbWFuZC1saW5lIHRvIHNwZWNpZnkgdGhlIgorICAgICAgICAgICAgICAgIGR1bXAgInJvb3Qgb2YgYSB2YWxpZCBBT1NQIHNvdXJjZSB0cmVlLiIKKyAgICAgICAgICAgICAgICBwYW5pYyAiQ2FuJ3QgZmluZCBBT1NQIHJvb3QuIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIFsgLWQgIiRQUk9CRV9ESVIvcHJlYnVpbHRzIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgQU9TUF9ESVI9JFBST0JFX0RJUgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgUFJPQkVfRElSPSRQUk9CRV9ESVIvLi4KKyAgICAgICAgZG9uZQorICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLWFvc3AtZGlyPSRBT1NQX0RJUiAgW2F1dG8tZGV0ZWN0XSIKKyAgICBmaQorCisgICAgQU9TUF9ESVI9JChjZCAiJEFPU1BfRElSIiAmJiBwd2QgLVAgMj4vZGV2L251bGwpCisgICAgQU9TUF9QUkVCVUlMVFNfR0NDX0RJUj0kQU9TUF9ESVIvcHJlYnVpbHRzL2djYworICAgIEFPU1BfUFJFQlVJTFRTX0NMQU5HX0RJUj0kQU9TUF9ESVIvcHJlYnVpbHRzL2NsYW5nCisgICAgaWYgWyAhIC1kICIkQU9TUF9QUkVCVUlMVFNfR0NDX0RJUiIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiTm90IGEgdmFsaWQgQU9TUCB0cmVlOiBtaXNzaW5nIGRpcmVjdG9yeTogJEFPU1BfUFJFQlVJTFRTX0dDQ19ESVIiCisgICAgZmkKKyAgICBpZiBbICEgLWQgIiRBT1NQX1BSRUJVSUxUU19DTEFOR19ESVIiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk5vdCBhIHZhbGlkIEFPU1AgdHJlZTogbWlzc2luZyBkaXJlY3Rvcnk6ICRBT1NQX1BSRUJVSUxUU19DTEFOR19ESVIiCisgICAgZmkKK30KKworIyBSZXR1cm4gdGhlIEFPU1Agc3ViZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHByZWJ1aWx0IHRvb2xjaGFpbiB0byBiZQorIyB1c2VkIGZvciBhIGdpdmVuIGhvc3Qgc3lzdGVtLgorIyAkMTogU3lzdGVtIG5hbWUgKGUuZy4gJ2xpbnV4JyBvciAnbGludXgteDg2XzY0JykKK2Fvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N1YmRpcl9mb3IgKCkgeworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgbGludXgqKQorICAgICAgICAgICAgcHJpbnRmICJwcmVidWlsdHMvZ2NjL2xpbnV4LXg4Ni9ob3N0L3g4Nl82NC1saW51eC1nbGliYzIuMTEtNC44IgorICAgICAgICAgICAgOzsKKyAgICAgICAgZGFyd2luKikKKyAgICAgICAgICAgIHByaW50ZiAicHJlYnVpbHRzL2NsYW5nL2Rhcndpbi14ODYvc2RrLzMuNSIKKyAgICAgICAgICAgIDs7CisgICAgICAgIHdpbmRvd3MqKQorICAgICAgICAgICAgcHJpbnRmICJwcmVidWlsdHMvZ2NjL2xpbnV4LXg4Ni9ob3N0L3g4Nl82NC13NjQtbWluZ3czMi00LjgiCisgICAgICAgICAgICA7OworICAgIGVzYWMKK30KKworIyBSZXR1cm4gdGhlIHN1YmRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBicmVha3BhZCBwcmVidWlsdHMgdG8gYmUKKyMgdXNlZCBmb3IgYSBnaXZlbiBob3N0IHN5c3RlbS4KKyMgJDE6IFN5c3RlbSBuYW1lIChlLmcuICdsaW51eC14ODYnIG9yICdsaW51eC14ODZfNjQnKQorYW9zcF9wcmVidWlsdF9icmVha3BhZF9zdWJkaXJfZm9yICgpIHsKKyAgICBwcmludGYgInByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkL2NvbW1vbi9icmVha3BhZC8kMSIKK30KKworIyBSZXR1cm4gdGhlIEFPU1Agc3ViZGlyZWN0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRvb2xjaGFpbidzIHN5c3Jvb3QuCisjICQxOiBTeXN0ZW0gbmFtZSAoZS5nLiAnbGludXgteDg2JyBvciAnbGludXgteDg2XzY0JykKK2Fvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N5c3Jvb3Rfc3ViZGlyX2ZvciAoKSB7CisgICAgbG9jYWwgUFJFQlVJTFRfRElSCisgICAgUFJFQlVJTFRfRElSPSIkKGFvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N1YmRpcl9mb3IgIiQxIikiCisgICAgY2FzZSAkMSBpbgorICAgICAgICBsaW51eCopCisgICAgICAgICAgICBwcmludGYgIiR7UFJFQlVJTFRfRElSfS94ODZfNjQtbGludXgiCisgICAgICAgICAgICA7OworICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgIyBXZSB1c2UgdGhlIGRldmVsb3BlciBtYWNoaW5lJ3Mgc3lzdGVtIFNESy4KKyAgICAgICAgICAgIHByaW50ZiAiIgorICAgICAgICAgICAgOzsKKyAgICAgICAgd2luZG93cyopCisgICAgICAgICAgICBwcmludGYgIiR7UFJFQlVJTFRfRElSfS94ODZfNjQtdzY0LW1pbmd3MzIiCisgICAgICAgICAgICA7OworICAgIGVzYWMKK30KKworYW9zcF9wcmVidWlsdF90b29sY2hhaW5fcHJlZml4X2ZvciAoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICBsaW51eCopCisgICAgICAgICAgICBwcmludGYgIng4Nl82NC1saW51eC0iCisgICAgICAgICAgICA7OworICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgcHJpbnRmICIiCisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzKikKKyAgICAgICAgICAgIHByaW50ZiAieDg2XzY0LXc2NC1taW5ndzMyLSIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworfQorCisjIEZpbmQgdGhlIEFPU1AgdG9wLWxldmVsIGRpcmVjdG9yeSwgc3RhcnRpbmcgZnJvbSBhIGdpdmVuIHN1Yi1kaXJlY3RvcnkuCisjICQxOiBTdGFydGluZyBkaXJlY3RvcnksIG11c3QgYmUgYSBzdWItZGlyZWN0b3J5IG9mIHRoZSBBT1NQIGNoZWNrb3V0LgorIyBPdXQ6IEFPU1AgZGlyZWN0b3J5IHBhdGggb24gc3VjY2VzcywgZW1wdHkgc3RyaW5nIG9uIGZhaWx1cmUuCithb3NwX2ZpbmRfdG9wX2Rpcl9mcm9tICgpIHsKKyAgICBsb2NhbCBQUk9CRV9ESVIKKyAgICBQUk9CRV9ESVI9JDEKKyAgICB3aGlsZSB0cnVlOyBkbworICAgICAgICBpZiBbIC16ICIkUFJPQkVfRElSIiAtbyAiJFBST0JFX0RJUiIgPSAiLyIgLW8gISAtZCAiJFBST0JFX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgIyBDb3VsZCBub3QgZmluZCBhbnl0aGluZywgd2VpcmQuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmkKKyAgICAgICAgIyBVc2UgcHJlYnVpbHRzL3FlbXUta2VybmVsLCBhcyB0aGUgdGVzdCBzdWItZGlyZWN0b3J5LCBnaXZlbiB0aGF0CisgICAgICAgICMgaXQgc2hvdWxkIGJlIHBhcnQgb2YgYWxsIGludGVyZXN0aW5nIEFPU1AgY2hlY2tvdXRzIChwbGF0Zm9ybSBhbmQKKyAgICAgICAgIyBTREsgb25lcykuCisgICAgICAgIGlmIFsgLWQgIiRQUk9CRV9ESVIiL3ByZWJ1aWx0cy9xZW11LWtlcm5lbCBdOyB0aGVuCisgICAgICAgICAgICBwcmludGYgIiVzIiAiJFBST0JFX0RJUiIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaQorICAgICAgICBQUk9CRV9ESVI9JChjZCAiJFBST0JFX0RJUiIvLi4gJiYgcHdkIC1QIHx8IHRydWUpCisgICAgZG9uZQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2Fvc3BfcHJlYnVpbHRzX2Rpci5zaGkgYi9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvYW9zcF9wcmVidWlsdHNfZGlyLnNoaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2U5ZGM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2Fvc3BfcHJlYnVpbHRzX2Rpci5zaGkKQEAgLTAsMCArMSw2OCBAQAorIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZ1bmN0aW9ucyB1c2VkIHRvIG1hbmFnZSAtLWFvc3AtcHJlYnVpbHRzLWRpcj08ZGlyPiBhbmQKKyMgLS1uby1hb3NwLXByZWJ1aWx0cyBvcHRpb25zLgorCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKKworYW9zcF9wcmVidWlsdHNfZGlyX3JlZ2lzdGVyX29wdGlvbnMgKCkgeworICAgIEFPU1BfUFJFQlVJTFRTX0RJUj0KKyAgICBPUFRfQU9TUF9QUkVCVUlMVFNfRElSPQorICAgIG9wdGlvbl9yZWdpc3Rlcl92YXIgIi0tYW9zcC1wcmVidWlsdHMtZGlyPTxkaXI+IiBPUFRfQU9TUF9QUkVCVUlMVFNfRElSIFwKKyAgICAgICAgICAgICJTZXQgbG9jYXRpb24gb2YgQU9TUCBwcmVidWlsdCB0b29sY2hhaW4gcm9vdCBbYXV0b2RldGVjdF0iCisKKyAgICBPUFRfTk9fQU9TUF9QUkVCVUlMVFM9CisgICAgb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1uby1hb3NwLXByZWJ1aWx0cyIgT1BUX05PX0FPU1BfUFJFQlVJTFRTIFwKKyAgICAgICAgICAgICJEbyBub3QgdXNlIHByZWJ1aWx0IEFPU1AgdG9vbGNoYWluIgorfQorCitfc2h1X2lzX2Fvc3BfcHJlYnVpbHRzX2RpciAoKSB7CisgICAgWyAtZCAiJDEiL2djYyAtYSAtZCAiJDEiL2NsYW5nIF0KK30KKworIyBQcm9iZSBhIGdpdmVuIGRpcmVjdG9yeSBwYXRoICQyIHRvIHNlZSBpZiBpdCBtYXRjaGVzIGFuICRBT1NQL3ByZWJ1aWx0cy8KKyMgZGlyZWN0b3J5LiBBbmQgaWYgaXQgZG9lcywgc2V0IHZhcmlhYmxlIG5hbWUgJDEgdG8gaXRzIHBhdGguCisjICQxOiBWYXJpYWJsZSBuYW1lCisjICQyOiBEaXJlY3RvcnkgdG8gcHJvYmUKK19zaHVfcHJvYmVfYW9zcF9wcmVidWlsdHNfZGlyICgpIHsKKyAgICBsb2cyICJQcm9iaW5nIEFPU1AgcHJlYnVpbHRzIGRpcjogJDIiCisgICAgaWYgWyAtZCAiJDIiL2djYyAtYSAtZCAiJDIiL2NsYW5nIF07IHRoZW4KKyAgICAgICAgdmFyX2Fzc2lnbiAkMSAiJDIiCisgICAgZmkKK30KKworYW9zcF9wcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbnMgKCkgeworICAgIGlmIFsgIiRPUFRfQU9TUF9QUkVCVUlMVFNfRElSIiBdOyB0aGVuCisgICAgICAgIGlmIFsgIiRPUFRfTk9fQU9TUF9QUkVCVUlMVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJPbmUgY2Fubm90IHVzZSAtLWFvc3AtcHJlYnVpbHRzLWRpciBhbmQgLS1uby1hb3NwLXByZWJ1aWx0cyBhdCB0aGUgc2FtZSB0aW1lISIKKyAgICAgICAgZmkKKyAgICAgICAgQU9TUF9QUkVCVUlMVFNfRElSPSRPUFRfQU9TUF9QUkVCVUlMVFNfRElSCisgICAgICAgIGlmIFsgISAtZCAiJEFPU1BfUFJFQlVJTFRTX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIkRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJEFPU1BfUFJFQlVJTFRTX0RJUiIKKyAgICAgICAgZmkKKyAgICBlbGlmIFsgLXogIiRPUFRfTk9fQU9TUF9QUkVCVUlMVFMiIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJEFPU1BfRElSIiBdOyB0aGVuCisgICAgICAgICAgICBfc2h1X3Byb2JlX2Fvc3BfcHJlYnVpbHRzX2RpciBBT1NQX1BSRUJVSUxUU19ESVIgXAorICAgICAgICAgICAgICAgICAgICAiJEFPU1BfRElSIi9wcmVidWlsdHMKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX3NodV9wcm9iZV9hb3NwX3ByZWJ1aWx0c19kaXIgQU9TUF9QUkVCVUlMVFNfRElSIFwKKyAgICAgICAgICAgICAgICAgICAgIiQocHJvZ3JhbV9kaXJlY3RvcnkpIi8uLi8uLi8uLi8uLi9wcmVidWlsdHMKKyAgICAgICAgZmkKKyAgICAgICAgaWYgWyAteiAiJEFPU1BfUFJFQlVJTFRTX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgcGFuaWMgIkNhbid0IGZpbmQgPEFPU1A+L3ByZWJ1aWx0cy8gZGlyLCBwbGVhc2UgdXNlIC0tYW9zcC1wcmVidWlsdHMtZGlyPTxkaXI+IG9yIC0tbm8tYW9zcC1wcmVidWlsdHMuIgorICAgICAgICBmaQorICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLWFvc3AtcHJlYnVpbHRzLWRpcj0kQU9TUF9QUkVCVUlMVFNfRElSICBbZGVmYXVsdF0iCisgICAgZmkKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvc2NyaXB0cy91dGlscy9jb21tb24uc2hpIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2NvbW1vbi5zaGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxMDYwNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy91dGlscy9jb21tb24uc2hpCkBAIC0wLDAgKzEsNjM0IEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQ29tbW9uIHJvdXRpbmVzIC0gZG8gbm90IGV4ZWN1dGUgZGlyZWN0bHkuCisKKyMgU2FuaXRpemUgZW52aXJvbm1lbnQKK3NldCAtZQorZXhwb3J0IExBTkc9QworZXhwb3J0IExDX0FMTD1DCisKK2lmIFsgLXogIiRfU0hVX1BST0dESVIiIF07IHRoZW4KKyAgICBfU0hVX1BST0dESVI9JChkaXJuYW1lICIkMCIpCitlbGlmIFsgISAtZiAiJF9TSFVfUFJPR0RJUiIvY29tbW9uLnNoaSBdOyB0aGVuCisgICAgZWNobyAiRVJST1I6IEludmFsaWQgX1NIVV9QUk9HRElSIHZhbHVlIChtaXNzaW5nIGNvbW1vbi5zaGkpOiAkX1NIVV9QUk9HRElSIgorZmkKKworX1NIVV9QUk9HTkFNRT0kKGJhc2VuYW1lICIkMCIpCisKKyMgUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIgdGhlbiBleGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuCitwYW5pYyAoKSB7CisgICAgZWNobyAiRVJST1I6ICRAIiA+JjIKKyAgICBleGl0IDEKK30KKworIyBJbnRlcm5hbCB2ZXJib3NpdHkgbGV2ZWwuIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIGluaGVyaXRlZCBmcm9tCisjIHRoZSBWRVJCT1NFIGVudmlyb25tZW50IHZhcmlhYmxlLgorX1NIVV9WRVJCT1NFPSR7VkVSQk9TRTotMX0KKworIyBJbmNyZW1lbnQgaW50ZXJuYWwgdmVyYm9zaXR5IGxldmVsLgoraW5jcmVtZW50X3ZlcmJvc2l0eSAoKSB7CisgICAgX1NIVV9WRVJCT1NFPSQoKCAkX1NIVV9WRVJCT1NFICsgMSApKQorfQorCisjIERlY3JlbWVudCBpbnRlcm5hbCB2ZXJib3NpdHkgbGV2ZWwuCitkZWNyZW1lbnRfdmVyYm9zaXR5ICgpIHsKKyAgICBfU0hVX1ZFUkJPU0U9JCgoICRfU0hVX1ZFUkJPU0UgLSAxICkpCit9CisKKyMgU2V0IHRoZSB2ZXJib3NpdHkgdG8gYSBnaXZlbiBsZXZlbC4KK3NldF92ZXJib3NpdHkgKCkgeworICAgIF9TSFVfVkVSQk9TRT0kMQorfQorCisjIFJldHVybiBpbnRlcm5hbCB2ZXJib3NpdHkgbGV2ZWwsIGNsYW1wZWQgdG8gMCBhcyBhIG1pbmltdW0gYm91bmQuCitnZXRfdmVyYm9zaXR5ICgpIHsKKyAgICBsb2NhbCBSRVQ9JF9TSFVfVkVSQk9TRQorICAgIGlmIFsgIiRSRVQiIC1sdCAwIF07IHRoZW4KKyAgICAgICAgUkVUPTAKKyAgICBmaQorICAgIGVjaG8gIiRSRVQiCit9CisKKyMgVXNlZCBpbnRlcm5hbGx5IHRvIGNvbmRpdGlvbmFsbHkgcHJpbnQgYSBtZXNzYWdlLgorIyAkMTogbWVzc2FnZSdzIHZlcmJvc2l0eSBsZXZlbC4gSWYgZ3JlYXRlciBvciBlcXVhbCB0aGFuICRfU0hVX1ZFUkJPU0UgdGhlbgorIyAgICAgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLgorIyAkMis6IG1lc3NhZ2UgdG8gcHJpbnQgdG8gc3Rkb3V0LgorZHVtcF9uICgpIHsKKyAgICBsb2NhbCBMRVZFTD0kMQorICAgIHNoaWZ0CisgICAgaWYgWyAiJExFVkVMIiAtbHQgIiRfU0hVX1ZFUkJPU0UiIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlc1xuIiAiJEAiCisgICAgZmkKK30KKworIyBEdW1wIGEgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQuCitkdW1wICgpIHsKKyAgICBkdW1wX24gMCAiJEAiCit9CisKKyMgRHVtcCBhIG1lc3NhZ2UgdG8gc3RhbmRhcmQgb3V0cHV0IGlmIC0tdmVyYm9zZSB3YXMgdXNlZC4KK2xvZyAoKSB7CisgICAgZHVtcF9uIDEgIiRAIgorfQorCisjIER1bXAgYSBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dCBpZiAtLXZlcmJvc2UgLS12ZXJib3NlIGlzIHVzZWQuCitsb2cyICgpIHsKKyAgICBkdW1wX24gMiAiJEAiCit9CisKKyMgUnVuIGEgY29tbWFuZCwgYnV0IHN1cHByZXNzIHN0ZG91dAorIyBrZWVwIHN0ZGVyciBvcGVuIGluIGNhc2UgZXJyb3IKK3NpbGVudF9ydW4gKCkgeworICAgICIkQCIgPi9kZXYvbnVsbAorfQorCisjIFJ1biBhIGNvbW1hbmQsIG91dHB1dCBkZXBlbmRzIG9uIHZlcmJvc2l0eSBsZXZlbAorcnVuICgpIHsKKyAgICBsb2NhbCBWRVJCT1NFPSRfU0hVX1ZFUkJPU0UKKyAgICBpZiBbICIkVkVSQk9TRSIgLWx0IDAgXTsgdGhlbgorICAgICAgICBWRVJCT1NFPTAKKyAgICBmaQorICAgIGlmIFsgIiRWRVJCT1NFIiAtZ3QgMSBdOyB0aGVuCisgICAgICAgIGVjaG8gIkNPTU1BTkQ6ICRAIgorICAgIGZpCisgICAgY2FzZSAkVkVSQk9TRSBpbgorICAgICAgICAwfDEpCisgICAgICAgICAgICAgIiRAIiA+L2Rldi9udWxsIDI+JjEKKyAgICAgICAgICAgICA7OworICAgICAgICAyKQorICAgICAgICAgICAgIiRAIiA+L2Rldi9udWxsCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgIiRAIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCit9CisKKyMgUmV0dXJuIHRoZSBjdXJyZW50IHNjcmlwdCdzIGRpcmVjdG9yeS4KK3Byb2dyYW1fZGlyZWN0b3J5ICgpIHsKKyAgICBwcmludGYgIiVzIiAiJF9TSFVfUFJPR0RJUiIKK30KKworIyBSZXR1cm4gdGhlIGN1cnJlbnQgc2NyaXB0J3MgZmlsZW5hbWUuCitwcm9ncmFtX25hbWUgKCkgeworICAgIHByaW50ZiAiJXMiICIkX1NIVV9QUk9HTkFNRSIKK30KKworIyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gbmFtZWQgdmFyaWFibGUuCisjICQxOiB2YXJpYWJsZSBuYW1lCisjCisjIGV4YW1wbGU6CisjICAgIEZPTz1CQVIKKyMgICAgQkFSPVpPTworIyAgICBlY2hvIGB2YXJfdmFsdWUgJEZPT2AKKyMgICAgd2lsbCBwcmludCAnWk9PJworIwordmFyX3ZhbHVlICgpIHsKKyAgICBldmFsIHByaW50ZiAlcyBcIlwkJDFcIgorfQorCisjIFJldHVybiBzdWNjZXNzIGlmIHZhcmlhYmxlICQxIGlzIHNldCBhbmQgbm9uLWVtcHR5LCBmYWlsdXJlIG90aGVyd2lzZS4KKyMgJDE6IFZhcmlhYmxlIG5hbWUuCisjIFVzYWdlIGV4YW1wbGU6CisjICAgaWYgdmFyX2lzX3NldCBGT087IHRoZW4KKyMgICAgICAuLiBEbyBzb21ldGhpbmcgdGhlIGhhbmRsZSBGT08gY29uZGl0aW9uLgorIyAgIGZpCit2YXJfaXNfc2V0ICgpIHsKKyAgICB0ZXN0IC1uICIkKHZhcl92YWx1ZSAkMSkiCit9CisKK192YXJfcXVvdGVfdmFsdWUgKCkgeworICAgIHByaW50ZiAlcyAiJDEiIHwgc2VkIC1lICJzfCd8XFwnXCInXCJcXCd8ZyIKK30KKworIyBTZXQgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gbmFtZSB2YXJpYWJsZXMuCisjICQxOiBWYXJpYWJsZSBuYW1lLgorIyAkMis6IFZhcmlhYmxlIHZhbHVlLgorIyBleGFtcGxlOgorIyAgICBGT089QkFSCisjICAgIHZhcl9hc3NpZ24gJEZPTyBiYXIKKyMgaXMgZXF1aXZhbGVudCB0bworIyAgICBCQVI9YmFyCit2YXJfYXNzaWduICgpIHsKKyAgICBsb2NhbCBfdmFyX2Fzc2lnbl92YXJuYW1lIF92YXJfYXNzaWduX3ZhbHVlCisgICAgX3Zhcl9hc3NpZ25fdmFybmFtZT0kMQorICAgIHNoaWZ0CisgICAgX3Zhcl9hc3NpZ25fdmFsdWU9JChfdmFyX3F1b3RlX3ZhbHVlICIkKiIpCisgICAgZXZhbCAkX3Zhcl9hc3NpZ25fdmFybmFtZT1cJyRfdmFyX2Fzc2lnbl92YWx1ZVwnCit9CisKKyMgQXBwZW5kIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgaXRlbXMgdG8gYSBnaXZlbiB2YXJpYWJsZS4KKyMgJDE6IFZhcmlhYmxlIG5hbWUuCisjICQyKzogVmFyaWFibGUgdmFsdWUuCisjIEV4YW1wbGU6CisjICAgRk9PPQorIyAgIHZhcl9hcHBlbmQgRk9PIGZvbyAgICAoRk9PIGlzIG5vdyAnZm9vJykKKyMgICB2YXJfYXBwZW5kIEZPTyBiYXIgICAgKEZPTyBpcyBub3cgJ2ZvbyBiYXInKQorIyAgIHZhcl9hcHBlbmQgRk9PIHpvbyAgICAoRk9PIGlzIG5vdyAnZm9vIGJhciB6b28nKQordmFyX2FwcGVuZCAoKSB7CisgICAgbG9jYWwgX3Zhcl9hcHBlbmRfdmFybmFtZQorICAgIF92YXJfYXBwZW5kX3Zhcm5hbWU9JDEKKyAgICBzaGlmdAorICAgIGlmIHRlc3QgIiQodmFyX3ZhbHVlICRfdmFyX2FwcGVuZF92YXJuYW1lKSI7IHRoZW4KKyAgICAgICAgZXZhbCAkX3Zhcl9hcHBlbmRfdmFybmFtZT1cJCRfdmFyX2FwcGVuZF92YXJuYW1lXCdcICQoX3Zhcl9xdW90ZV92YWx1ZSAiJCoiKVwnCisgICAgZWxzZQorICAgICAgICBldmFsICRfdmFyX2FwcGVuZF92YXJuYW1lPVwnJChfdmFyX3F1b3RlX3ZhbHVlICIkKiIpXCcKKyAgICBmaQorfQorCisjIEltcG9ydCBzaGVsbCBzY3JpcHQgJDEuIFNpbWlsYXIgdG8gc291cmNpbmcgdGhlIHNjcmlwdCBleGNlcHQKKyMgdGhhdCBlYWNoIHNjcmlwdCB3aWxsIG9ubHkgYmUgc291cmNlZCBvbmNlLCBldmVuIHdpdGggbXVsdGlwbGUKKyMgZGVwZW5kZW5jaWVzLgorc2hlbGxfaW1wb3J0ICgpIHsKKyAgICBsb2NhbCBTQ1JJUFQ9IiRfU0hVX1BST0dESVIvJDEiCisgICAgaWYgWyAhIC1mICIkU0NSSVBUIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIHNjcmlwdDogJFNDUklQVCIKKyAgICBmaQorICAgIGxvY2FsIFNDUklQVF9UQUc9X1NIVV9TSEVMTF9TQ1JJUFRfVEFHX18kezElJS5zaGl9CisgICAgU0NSSVBUX1RBRz0kKGVjaG8gIiRTQ1JJUFRfVEFHIiB8IHRyICctJyAnXycgfCB0ciAnLycgJ19fJykKKwljYXNlICQodmFyX3ZhbHVlICRTQ1JJUFRfVEFHKSBpbgorICAgICAgICBpbXBvcnRlZCkKKyAgICAgICAgICAgICMgU2NyaXB0IGlzIGFscmVhZHkgaW1wb3J0ZWQuCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgOzsKKyAgICAgICAgaW1wb3J0aW5nKQorICAgICAgICAgICAgIyBTY3JpcHQgaXMgYWxyZWFkeSBiZWluZyBpbXBvcnRlZCwgdGhpcyBpcworICAgICAgICAgICAgIyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCisgICAgICAgICAgICBwYW5pYyAiQ2lyY3VsYXIgZGVwZW5kZW5jeSB3aGVuIHRyeWluZyB0byBpbXBvcnQgJDEiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgIyBJbXBvcnQgdGhlIHNjcmlwdC4KKyAgICAgICAgICAgIHZhcl9hc3NpZ24gJFNDUklQVF9UQUcgaW1wb3J0aW5nCisgICAgICAgICAgICAuICIkU0NSSVBUIgorICAgICAgICAgICAgdmFyX2Fzc2lnbiAkU0NSSVBUX1RBRyBpbXBvcnRlZAorICAgICAgICAgICAgOzsKKyAgICBlc2FjCit9CisKKyMgVW5wYWNrIGEgZ2l2ZW4gYXJjaGl2ZSBpbnRvIGEgZ2l2ZW4gZGVzdGluYXRpb24gZGlyZWN0b3J5LgorIyAkMTogQXJjaGl2ZSBwYXRoCisjICQyOiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkKK3VucGFja19hcmNoaXZlICgpIHsKKyAgICBsb2NhbCBQS0dfUEFUSD0iJDEiCisgICAgbG9jYWwgREVTVF9ESVI9IiQyIgorICAgIGNhc2UgJFBLR19QQVRIIGluCisgICAgICAgICoudGFyLmd6fCoudGFyLmJ6MnwqLnRhci54eikKKyAgICAgICAgICAgIHNpbGVudF9ydW4gdGFyIHhmICIkUEtHX1BBVEgiIC1DICIkREVTVF9ESVIiCisgICAgICAgICAgICA7OworICAgICAgICAqLnppcCkKKyAgICAgICAgICAgIHNpbGVudF9ydW4gdW56aXAgLXEgLW8gLWQgIiRERVNUX0RJUiIgIiRQS0dfUEFUSCIKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiVW5zdXBwb3J0ZWQgcGFja2FnZSBmb3JtYXQ6ICRQS0dfUEFUSCIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworfQorCisjIFJldHVybiB0aGUgYnVpbGQgbWFjaGluZSdzIG9wZXJhdGluZyBzeXN0ZW0gdGFnLgorIyBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyMgICAgbGludXgKKyMgICAgZGFyd2luCisjICAgIGZyZWVic2QKKyMgICAgd2luZG93cyAgIChyZWFsbHkgTVN5cykKKyMgICAgY3lnd2luCitnZXRfYnVpbGRfb3MgKCkgeworICAgIGlmIFsgLXogIiRfU0hVX0JVSUxEX09TIiBdOyB0aGVuCisgICAgICAgIF9TSFVfQlVJTERfT1M9JCh1bmFtZSAtcykKKyAgICAgICAgY2FzZSAkX1NIVV9CVUlMRF9PUyBpbgorICAgICAgICAgICAgRGFyd2luKQorICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfT1M9ZGFyd2luCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIEZyZWVCU0QpICAjIG5vdGU6IHRoaXMgaXMgbm90IHRlc3RlZAorICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfT1M9ZnJlZWJzZAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBMaW51eCkKKyAgICAgICAgICAgICAgICAjIG5vdGUgdGhhdCBidWlsZGluZyAgMzItYml0IGJpbmFyaWVzIG9uIHg4Nl82NCBpcyBoYW5kbGVkIGxhdGVyCisgICAgICAgICAgICAgICAgX1NIVV9CVUlMRF9PUz1saW51eAorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBDWUdXSU4qfCpfTlQtKikKKyAgICAgICAgICAgICAgICBfU0hVX0JVSUxEX09TPXdpbmRvd3MKKyAgICAgICAgICAgICAgICBpZiBbICJ4JE9TVFlQRSIgPSB4Y3lnd2luIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfT1M9Y3lnd2luCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZmkKKyAgICBlY2hvICIkX1NIVV9CVUlMRF9PUyIKK30KKworIyBSZXR1cm4gdGhlIGJ1aWxkIG1hY2hpbmUncyBDUFUgYXJjaGl0ZWN0dXJlLgorIyBWYWxpZCByZXR1cm4gdmFsdWVzIGFyZToKKyMgICAgIHg4NgorIyAgICAgeDg2XzY0CitnZXRfYnVpbGRfYXJjaCAoKSB7CisgICAgbG9jYWwgVEVTVAorICAgIGlmIFsgLXogIiRfU0hVX0JVSUxEX0FSQ0giIF07IHRoZW4KKyAgICAgICAgY2FzZSAkKGdldF9idWlsZF9vcykgaW4KKyAgICAgICAgICAgIGxpbnV4fGRhcndpbikKKyAgICAgICAgICAgICAgICBfU0hVX0JVSUxEX0FSQ0g9JCh1bmFtZSAtbSkKKyAgICAgICAgICAgICAgICAjIEtlcm5lbCBiaXRuZXNzIG1pZ2h0IG5vdCBtYXRjaCB1c2VyIHNwYWNlLCBzbyB0ZXN0CisgICAgICAgICAgICAgICAgIyB0aGUgYml0bmVzcyBvZiBvdXIgc2hlbGwgdG8ga25vdyB3aGF0IHRoZSB1c2VyIGlzCisgICAgICAgICAgICAgICAgIyByZWFsbHkgcnVubmluZy4KKyAgICAgICAgICAgICAgICBURVNUPSQoL3Vzci9iaW4vZmlsZSAtTCAkU0hFTEwgMj4vZGV2L251bGwgfCBncmVwICd4ODZbXy1dNjQnKQorICAgICAgICAgICAgICAgIGlmIFsgIiRURVNUIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfQVJDSD14ODZfNjQKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICB3aW5kb3dzfGN5Z3dpbikKKyAgICAgICAgICAgICAgICBjYXNlICRQUk9DRVNTT1JfQVJDSElURUNUVVJFIGluCisgICAgICAgICAgICAgICAgICAgIEFETTY0KQorICAgICAgICAgICAgICAgICAgICAgICAgX1NIVV9CVUlMRF9BUkNIPXg4Nl82NAorICAgICAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfQVJDSD14ODYKKyAgICAgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgIF9TSFVfQlVJTERfQVJDSD0kKHVuYW1lIC1wKQorICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICBmaQorICAgIGVjaG8gIiRfU0hVX0JVSUxEX0FSQ0giCit9CisKKyMgUmV0dXJuIHRoZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBmb3IgYSBnaXZlbiBvcGVyYXRpbmcgc3lzdGVtIHRhZy4KKyMgJDE6IG9wZXJhdGluZyBzeXN0ZW0gdGFnLgorX3NodV9nZXRfZXhlX2V4dGVuc2lvbl9mb3IgKCkgeworICAgIGNhc2UgJDEgaW4KKyAgICAgICAgd2luZG93c3xjeWd3aW4pCisgICAgICAgICAgICBlY2hvICIuZXhlIgorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIGVjaG8gIiIKKyAgICBlc2FjCit9CisKKyMgUmV0dXJuIHRoZSBkeW5hbWljIGxpYnJhcnkgZXh0ZW5zaW9uIGZvciBhIGdpdmVuIG9wZXJhdGluZyBzeXN0ZW0gdGFnLgorIyAkMTogb3BlcmF0aW5nIHN5c3RlbSB0YWcuCitfc2h1X2dldF9kbGxfZXh0ZW5zaW9uX2ZvciAoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICBkYXJ3aW4pCisgICAgICAgICAgICBlY2hvICIuZHlsaWIiCisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzfGN5Z3dpbikKKyAgICAgICAgICAgIGVjaG8gIi5kbGwiCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZWNobyAiLnNvIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCit9CisKKyMgUmV0dXJuIHRoZSBleHRlbnNpb24gb2YgZXhlY3V0YWJsZXMgb24gdGhlIGJ1aWxkIG1hY2hpbmUuCitnZXRfYnVpbGRfZXhlX2V4dGVuc2lvbiAoKSB7CisgICAgaWYgWyAteiAiJF9TSFVfQlVJTERfRVhFX0VYVEVOU0lPTl9ERUZJTkVEIiBdOyB0aGVuCisgICAgICAgIF9TSFVfQlVJTERfRVhFX0VYVEVOU0lPTj0kKF9zaHVfZ2V0X2V4ZV9leHRlbnNpb25fZm9yICQoZ2V0X2J1aWxkX29zKSkKKyAgICAgICAgX1NIVV9CVUlMRF9FWEVfRVhURU5TSU9OX0RFRklORUQ9dHJ1ZQorICAgIGZpCisgICAgZWNobyAiJF9TSFVfQlVJTERfRVhFX0VYVEVOU0lPTiIKK30KKworIyBSZXR1cm4gdGhlIGV4dGVuc2lvbiBvZiBkeW5hbWljIGxpYnJhcmllcyBvbiB0aGUgYnVpbGQgbWFjaGluZS4KK2dldF9idWlsZF9kbGxfZXh0ZW5zaW9uICgpIHsKKyAgICBpZiBbIC16ICIkX1NIVV9CVUlMRF9ETExfRVhURU5TSU9OX0RFRklORUQiIF07IHRoZW4KKyAgICAgICAgX1NIVV9CVUlMRF9ETExfRVhURU5TSU9OPSQoX3NodV9nZXRfZGxsX2V4dGVuc2lvbl9mb3IgJChnZXRfYnVpbGRfb3MpKQorICAgICAgICBfU0hVX0JVSUxEX0RMTF9FWFRFTlNJT05fREVGSU5FRD10cnVlCisgICAgZmkKKyAgICBlY2hvICIkX1NIVV9CVUlMRF9ETExfRVhURU5TSU9OIgorfQorCisjIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVSBjb3JlcyBvbiB0aGUgYnVpbGQgbWFjaGluZS4KK2dldF9idWlsZF9udW1fY29yZXMgKCkgeworICAgIGNhc2UgJChnZXRfYnVpbGRfb3MpIGluCisgICAgICAgIGxpbnV4KQorICAgICAgICAgICAgZ3JlcCAtYyAtZSBwcm9jZXNzb3IgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8fCBlY2hvIDEKKyAgICAgICAgICAgIDs7CisgICAgICAgIGRhcndpbnxmcmVlYnNkKQorICAgICAgICAgICAgc3lzY3RsIC1uIGh3Lm5jcHUgMj4vZGV2L251bGwgfHwgZWNobyAxCisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzfGN5Z3dpbikKKyAgICAgICAgICAgIGVjaG8gIiR7TlVNQkVSX09GX1BST0NFU1NPUlM6LTF9IgorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIGVjaG8gIjEiCisgICAgICAgICAgICA7OworICAgIGVzYWMKK30KKworIyBDb252ZXJ0IGNvbW1hcyBpbnRvIHNwYWNlcy4KKyMgJDE6IGlucHV0IHN0cmluZworIyBPdXQ6IGlucHV0IHN0cmluZywgd2l0aCBlYWNoIGNvbW1hIHJlcGxhY2VkIGJ5IGEgc3BhY2UuCitjb21tYXNfdG9fc3BhY2VzICgpIHsKKyAgICBwcmludGYgIiVzIiAiJEAiIHwgdHIgJywnICcgJworfQorCisjIENvbnZlcnQgc3BhY2VzIGludG8gY29tbWFzCisjICQxKzogaW5wdXQgc3RyaW5nCisjIE91dDogaW5wdXQgc3RyaW5nLCB3aXRoIGNvbnRpZ3VvdXMgc3BhY2VzIHJlcGxhY2VkIGJ5IGEgY29tbWEuCisjIE5PVEU6IFRoaXMgYWxzbyBzdHJpcHMgbGVhZGluZy90cmFpbGluZyBzcGFjZS4KK3NwYWNlc190b19jb21tYXMgKCkgeworICAgIGxvY2FsIElURU0gUkVUCisgICAgZm9yIElURU0gaW4gJCo7IGRvCisgICAgICAgIGlmIFsgLXogIiRSRVQiIF07IHRoZW4KKyAgICAgICAgICAgIFJFVD0kSVRFTQorICAgICAgICBlbHNlCisgICAgICAgICAgICBSRVQ9IiRSRVQsJElURU0iCisgICAgICAgIGZpCisgICAgZG9uZQorICAgIHByaW50ZiAiJXMiICIkUkVUIgorfQorCisjIFJldHVybiBzdWNjZXNzIGlmZiBpdGVtIHwkMnwgaXMgaW4gbGlzdCB8JDF8LgorIyAkMTogaW5wdXQgbGlzdAorIyAkMjogaXRlbSB0byBmaW5kIGluIGxpc3QuCitsaXN0X2NvbnRhaW5zICgpIHsKKyAgICBsb2NhbCBJVEVNCisgICAgZm9yIElURU0gaW4gJChjb21tYXNfdG9fc3BhY2VzICIkMSIpOyBkbworICAgICAgICBpZiBbICIkSVRFTSIgPSAiJDIiIF07IHRoZW4KKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGZpCisgICAgZG9uZQorICAgIHJldHVybiAxCit9CisKKyMgQ29weSBhIGRpcmVjdG9yeSwgY3JlYXRlIHRhcmdldCBsb2NhdGlvbiBpZiBuZWVkZWQKKyMKKyMgJDE6IHNvdXJjZSBkaXJlY3RvcnkKKyMgJDI6IHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb24KKyMKK2NvcHlfZGlyZWN0b3J5ICgpCit7CisgICAgbG9jYWwgU1JDRElSPSIkMSIKKyAgICBsb2NhbCBEU1RESVI9IiQyIgorICAgIGlmIFsgISAtZCAiJFNSQ0RJUiIgXSA7IHRoZW4KKyAgICAgICAgcGFuaWMgIkNhbid0IGNvcHkgZnJvbSBub24tZGlyZWN0b3J5OiAkU1JDRElSIgorICAgIGZpCisgICAgbG9nICJDb3B5aW5nIGRpcmVjdG9yeTogZnJvbSBbJFNSQ0RJUl0gdG8gWyREU1RESVJdIgorICAgIG1rZGlyIC1wICIkRFNURElSIiAmJiAoY2QgIiRTUkNESVIiICYmIDI+L2Rldi9udWxsIHRhciBjZiAtICopIHwgKHRhciB4ZiAtIC1DICIkRFNURElSIikgfHwKKyAgICAgICAgICAgIHBhbmljICJDYW5ub3QgY29weSB0byBkaXJlY3Rvcnk6ICREU1RESVIiCit9CisKKyMgJDE6IHNvdXJjZSBkaXJlY3RvcnkKKyMgJDI6IHRhcmdldCBkaXJlY3RvcnkgbG9jYXRpb24KKyMgJDMrOiBsaXN0IG9mIGZpbGUgbmFtZXMgYW5kIGZpbHRlcnMuCitjb3B5X2RpcmVjdG9yeV9maWxlcyAoKQoreworICAgIGxvY2FsIFNSQ0RJUj0iJDEiCisgICAgbG9jYWwgRFNURElSPSIkMiIKKyAgICBzaGlmdAorICAgIHNoaWZ0CisgICAgaWYgWyAhIC1kICIkU1JDRElSIiBdIDsgdGhlbgorICAgICAgICBwYW5pYyAiQ2FuJ3QgY29weSBmcm9tIG5vbi1kaXJlY3Rvcnk6ICRTUkNESVIiCisgICAgZmkKKyAgICBsb2cgIkNvcHlpbmcgZGlyZWN0b3J5OiBmcm9tIFskU1JDRElSXSB0byBbJERTVERJUl0iCisgICAgbWtkaXIgLXAgIiREU1RESVIiIHx8IHBhbmljICJDYW5ub3QgY3JlYXRlIHRhcmdldCBkaXJlY3Rvcnk6ICREU1RESVIiCisgICAgKGNkICIkU1JDRElSIiAmJiAyPi9kZXYvbnVsbCB0YXIgY2YgLSAiJEAiIHwgXAorICAgICAgICAgICAgdGFyIHhmIC0gLUMgIiREU1RESVIiKSB8fAorICAgICAgICBwYW5pYyAiQ2Fubm90IGNvcHkgdG8gZGlyZWN0b3J5OiAkRFNURElSIgorfQorCisjIENvbXB1dGUgdGhlIFNIQS0xIHN1bSBvZiBhIGdpdmVuIGZpbGUuIEltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gdGhlCisjIGN1cnJlbnQgaG9zdCBtYWNoaW5lLgorIyAkMTogRmlsZSBwYXRoCisjIE91dDogU0hBLTEgc3VtIGFzIGFuIGhleGFkZWNpbWFsIHN0cmluZy4KK2NvbXB1dGVfZmlsZV9zaGExICgpIHsKKyAgICBjYXNlICQoZ2V0X2J1aWxkX29zKSBpbgorICAgICAgICBsaW51eCkKKyAgICAgICAgICAgIChzaGExc3VtICIkMSIgfCBhd2sgJ3sgcHJpbnQgJDE7IH0nKSAyPi9kZXYvbnVsbAorICAgICAgICAgICAgOzsKKyAgICAgICAgZGFyd2luKQorICAgICAgICAgICAgKG9wZW5zc2wgc2hhMSAiJDEiIHwgYXdrICd7IHByaW50ICQyOyB9JykgMj4vZGV2L251bGwKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiRG9uJ3Qga25vdyBob3cgdG8gY29tcHV0ZSBhIFNIQS0xIHN1bSBvbiB0aGlzIHBsYXRmb3JtOiBcCiskKGdldF9idWlsZF9vcykiCisgICAgZXNhYworfQorCisjIENvbXB1dGUgdGhlIFNIQS0xIHN1bSBvZiBhIGdpdmVuIHppcCBvciB0YXJiYWxsIGFyY2hpdmUuIFRoaXMgaXMgZG9uZSBieQorIyBnZW5lcmF0ZWQgYSBzb3J0ZWQgbGlzdCBvZiBhbGwgZmlsZXMgZnJvbSB0aGUgYXJjaGl2ZSwgYW5kIHRoZWlyIFNIQS0xLCB0aGVuCisjIGNvbXB1dGluZyB0aGUgU0hBLTEgb2YgdGhlIHJlc3VsdC4gVGhpcyBtZWFucyB0aGUgb3V0cHV0IGlzIG9ubHkgZGVwZW5kZW50CisjIG9uIHRoZSBhcmNoaXZlJ3MgY29udGVudCwgbm90IG9uIGFueSB1c2VyL2dyb3VwL210aW1lIGZpZWxkIHByZXNlbnQgaW4gdGhlCisjIGFjdHVhbCBhcmNoaXZlIGZpbGUuIFJlcXVpcmVkIGJlY2F1c2UgdGhlIERhcndpbiAndGFyJyBjb21tYW5kIGRvZXNuJ3Qgc2VlbQorIyB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIHJlcHJvZHVjaWJsZSBhcmNoaXZlcyAoYW5kIGV2ZW4gaWYgaXQgY291bGQsIHRoZXkKKyMgd291bGQgcHJvYmFibHkgYmUgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gdGhlIG9uZXMgZ2VuZXJhdGVkIG9uIExpbnV4KS4KKyMgJDE6IEFyY2hpdmUgZmlsZSBwYXRoCisjIE91dDogU0hBLTEgc3VtIGFzIGFuIGhleGFkZWNpbWFsIHN0cmluZy4KK2NvbXB1dGVfYXJjaGl2ZV9zaGExICgpIHsKKyAgICBsb2NhbCBMSVNUX0ZJTEUgTElTVF9ESVIgUkVUCisgICAgTElTVF9ESVI9JChta3RlbXAgLWQgL3RtcC9zaGExX2FyY2hpdmUuWFhYWFhYKQorICAgIExJU1RfRklMRT0kKG1rdGVtcCAvdG1wL3NoYTFfbGlzdC5YWFhYWFgpCisgICAgdW5wYWNrX2FyY2hpdmUgIiQxIiAiJExJU1RfRElSIgorICAgIFJFVD0wCisgICAgKAorICAgICAgICB1bnBhY2tfYXJjaGl2ZSAiJDEiICIkTElTVF9ESVIiICYmCisgICAgICAgIGNkICIkTElTVF9ESVIiICYmCisgICAgICAgIExBTkc9QyBMQ19BTEw9QyBmaW5kIC4gLXR5cGUgZiAtbyAtdHlwZSBsIHwgc29ydCAtdSAtcyB8IHhhcmdzIG9wZW5zc2wgc2hhMSA+ICIkTElTVF9GSUxFIgorICAgICAgICBjb21wdXRlX2ZpbGVfc2hhMSAiJExJU1RfRklMRSIKKyAgICApIHx8IFJFVD0kPworICAgIHJtIC1yZiAiJExJU1RfRElSIgorICAgIHJtIC1yZiAiJExJU1RfRklMRSIKKyAgICByZXR1cm4gJFJFVAorfQorCisjIFJldHVybiB0aGUgZmlsZSBwYXRoIG9mIGEgZ2l2ZW4gdGltZXN0YW1wCisjICQxOiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5CisjICQyOiBUaW1lc3RhbXAgZ3JvdXAgbmFtZQorX3NodV90aW1lc3RhbXBfZmlsZSAoKSB7CisgICAgcHJpbnRmICVzICIkMS90aW1lc3RhbXBzLyQyIgorfQorCit0aW1lc3RhbXBfY2hlY2sgKCkgeworICAgIHRlc3QgLWYgIiQoX3NodV90aW1lc3RhbXBfZmlsZSAiJDEiICIkMiIpIgorfQorCit0aW1lc3RhbXBfc2V0ICgpIHsKKyAgICBsb2NhbCBUSU1FU1RBTVA9IiQoX3NodV90aW1lc3RhbXBfZmlsZSAiJDEiICIkMiIpIgorICAgIHJ1biBta2RpciAtcCAiJChkaXJuYW1lICRUSU1FU1RBTVApIiAmJiBydW4gdG91Y2ggIiRUSU1FU1RBTVAiCit9CisKK3RpbWVzdGFtcF9jbGVhciAoKSB7CisgICAgcnVuIHJtIC1mICIkKF9zaHVfdGltZXN0YW1wX2ZpbGUgIiQxIiAiJDIiKSIKK30KKworIyBGaW5kIGEgZ2l2ZW4gcHJvZ3JhbSBpbiB0aGUgY3VycmVudCBwYXRoLiBUaGlzIGZ1bmN0aW9uIG5ldmVyIGZhaWxzLgorIyAkMTogUHJvZ3JhbSBuYW1lCisjIE91dDogcHJvZ3JhbSBwYXRoLCBpZiBmb3VuZCwgb3IgZW1wdHkgc3RyaW5nIG90aGVyd2lzZS4KK2ZpbmRfcHJvZ3JhbSAoKSB7CisgICAgd2hpY2ggIiQxIiAyPi9kZXYvbnVsbCB8fCB0cnVlCit9CisKKworIyBSZXR1cm4gdGhlIGR1bXBfc3ltcyB0b29sIHBhdGggZm9yIGEgZ2l2ZW4gaG9zdCBzeXN0ZW0uCisjICQxOiBTeXN0ZW0gbmFtZSAoZS5nLiAnbGludXgteDg2JyBvciAnbGludXgteDg2XzY0JykKK2Fvc3BfcHJlYnVpbHRfYnJlYWtwYWRfZHVtcF9zeW1zX2ZvciAoKSB7CisgICAgbG9jYWwgU1lNVE9PTD0iZHVtcF9zeW1zIgorICAgIGxvY2FsIEhPU1Q9IiQxIgorICAgIGlmIFsgIiQoZ2V0X2J1aWxkX29zKSIgPSAibGludXgiIF07IHRoZW4KKyAgICAgICAgY2FzZSAke0hPU1R9IGluCisgICAgICAgICAgICAqd2luZG93cyopCisgICAgICAgICAgICBTWU1UT09MPSR7U1lNVE9PTH1fZHdhcmYKKyAgICAgICAgICAgIEhPU1Q9JChnZXRfYnVpbGRfb3MpLSQoZ2V0X2J1aWxkX2FyY2gpCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZmkKKyAgICBsb2NhbCBTWU1UT09MX1BBVEg9IiRBT1NQX0RJUi8kKGFvc3BfcHJlYnVpbHRfYnJlYWtwYWRfc3ViZGlyX2ZvciAkSE9TVCkvYmluLyR7U1lNVE9PTH0iCisgICAgaWYgWyAhIC1mICIke1NZTVRPT0xfUEFUSH0iIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkJyZWFrcGFkIHByZWJ1aWx0ICR7U1lNVE9PTH0gY291bGQgbm90IGJlIGZvdW5kIGF0ICR7U1lNVE9PTF9QQVRIfSIKKyAgICBmaQorICAgIHByaW50ZiAlcyAiJHtTWU1UT09MX1BBVEh9IgorfQorCisjIEJ1aWxkIGRlYnVnX2luZm8gZnJvbSB1bnN0cmlwcGVkIGJpbmFyaWVzCisjIFBsYXRmb3JtIHNwZWNpZmljLiBPbiBtYWMsIGdlbmVyYXRlcyB0aGUgZFNZTXMgYWxvbmdzaWRlIHRoZSBsaWJyYXJpZXMKKyMKKyMgJDE6IFNyYyByb290IGRpcmVjdG9yeQorIyAkMjogVGFyZ2V0IHJvb3QgZGlyZWN0b3J5CisjICQzKzogTGlzdCBvZiBiaW5hcnkgcGF0aHMgcmVsYXRpdmUgdG8gU3JjIHJvb3QKK2J1aWxkX2RlYnVnX2luZm8gKCkgeworICAgIGxvY2FsIFNSQ19ST09UPSIkMSIKKyAgICBsb2NhbCBERVNUX1JPT1Q9IiQyIgorICAgIHNoaWZ0CisgICAgc2hpZnQKKyAgICBsb2NhbCBCSU5BUllfRklMRVM9IiRAIgorICAgIGZvciBCSU5BUlkgaW4gJEJJTkFSWV9GSUxFUzsgZG8KKyAgICAgICAgaWYgWyAiJChnZXRfYnVpbGRfb3MpIiA9ICJkYXJ3aW4iIF07IHRoZW4KKyAgICAgICAgICAgIERTWU1fRElSPSRERVNUX1JPT1QvJEJJTkFSWS5kU1lNCisgICAgICAgICAgICBpZiBbIC1MICIkU1JDX1JPT1QiLyRCSU5BUlkgXTsgdGhlbgorICAgICAgICAgICAgICAgIERFU1Q9YHJlYWRsaW5rICRTUkNfUk9PVC8kQklOQVJZYAorICAgICAgICAgICAgICAgIGxuIC1mcyAkREVTVC5kU1lNICREU1lNX0RJUgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzeW11dGlsIC0tb3V0PSREU1lNX0RJUiAkU1JDX1JPT1QvJEJJTkFSWSB8fAorICAgICAgICAgICAgICAgIHBhbmljICJGYWlsZWQgdG8gY3JlYXRlIGRzeW0gZm9yICRTUkNfUk9PVC8kQklOQVJZIgorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBkb25lCit9CisKKyMgQnVpbGQgYnJlYWtwYWQgc3ltYm9scyBmcm9tIHVuc3RyaXBwZWQgYmluYXJpZXMKKyMgQnVpbGRzIGEgc3ltYm9scyBkaXJlY3RvcnkgYXQgdGhlIGRlc3RpbmF0aW9uIHJvb3QgZGlyIGFuZCBwb3B1bGF0ZXMgaXQgd2l0aAorIyAqLnN5bSBleHRlbnNpb24gc3ltYm9sIGZpbGVzIG1pcnJvcmluZyB0aGUgYmluYXJ5IGZpbGUgcGF0aHMKKyMKKyMgRXhwZWN0cyBCcmVha3BhZCBwcmVidWlsdCB0byBiZSBidWlsdCwgcGFuaWNzIG90aGVyd2lzZS4KKyMgJDE6IFNyYyByb290IGRpcmVjdG9yeQorIyAkMjogVGFyZ2V0IHJvb3QgZGlyZWN0b3J5CisjICQzOiBIb3N0IHRhcmdldAorIyAkNCs6IExpc3Qgb2YgYmluYXJ5IHBhdGhzIHJlbGF0aXZlIHRvIFNyYyByb290CitidWlsZF9zeW1ib2xzICgpIHsKKyAgICBsb2NhbCBTUkNfUk9PVD0iJDEiCisgICAgbG9jYWwgREVTVF9ST09UPSIkMiIKKyAgICBsb2NhbCBIT1NUPSIkMyIKKyAgICBzaGlmdAorICAgIHNoaWZ0CisgICAgc2hpZnQKKyAgICBsb2NhbCBCSU5BUllfRklMRVM9IiRAIgorICAgIGxvY2FsIFNZTUJPTF9ESVI9IiRERVNUX1JPT1QiL3N5bWJvbHMKKyAgICBsb2NhbCBCSU5BUllfRlVMTE5BTUU9CisgICAgbG9jYWwgQklOQVJZX0RJUj0KKyAgICBsb2NhbCBTWU1UT09MPSIkKGFvc3BfcHJlYnVpbHRfYnJlYWtwYWRfZHVtcF9zeW1zX2ZvciAkSE9TVCkiCisgICAgaWYgWyAhIC1mICIkU1lNVE9PTCIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiQnJlYWtwYWQgcHJlYnVpbHQgc3ltYm9sIGR1bXBlciBjb3VsZCBub3QgYmUgZm91bmQgYXQgJFNZTVRPT0wiCisgICAgZmkKKyAgICBydW4gbWtkaXIgLXAgIiRTWU1CT0xfRElSIgorICAgIGZvciBCSU5BUlkgaW4gJEJJTkFSWV9GSUxFUzsgZG8KKyAgICAgICAgaWYgWyAtTCAiJFNSQ19ST09UIi8kQklOQVJZIF07IHRoZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisgICAgICAgIEJJTkFSWV9GVUxMTkFNRT0iJChiYXNlbmFtZSAiJEJJTkFSWSIpIgorICAgICAgICBCSU5BUllfRElSPSIkKGRpcm5hbWUgIiRCSU5BUlkiKSIKKyAgICAgICAgcnVuIG1rZGlyIC1wICRTWU1CT0xfRElSLyRCSU5BUllfRElSCisgICAgICAgIGlmIFsgIiQoZ2V0X2J1aWxkX29zKSIgPSAiZGFyd2luIiBdOyB0aGVuCisgICAgICAgICAgICBEU1lNX0RJUj0kKG1rdGVtcCAtZCAvdG1wLyRCSU5BUllfRlVMTE5BTUUuZHN5bS5YWFhYWFgpCisgICAgICAgICAgICBkc3ltdXRpbCAtLW91dD0kRFNZTV9ESVIgJFNSQ19ST09ULyRCSU5BUlkgfHwKKyAgICAgICAgICAgICAgICBwYW5pYyAiRmFpbGVkIHRvIGNyZWF0ZSBkc3ltIGZvciAkU1JDX1JPT1QvJEJJTkFSWSIKKyAgICAgICAgICAgICRTWU1UT09MIC1nICREU1lNX0RJUiAkU1JDX1JPT1QvJEJJTkFSWSA+ICRTWU1CT0xfRElSLyRCSU5BUlkuc3ltIHx8CisgICAgICAgICAgICAgICAgcGFuaWMgIkZhaWxlZCB0byBjcmVhdGUgc3ltYm9sIGZpbGUgZm9yICRTUkNfUk9PVC8kQklOQVJZIgorICAgICAgICAgICAgcm0gLXJmICIkRFNZTV9ESVIiCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICRTWU1UT09MICRTUkNfUk9PVC8kQklOQVJZID4gJFNZTUJPTF9ESVIvJEJJTkFSWS5zeW0gfHwKKyAgICAgICAgICAgICAgICBwYW5pYyAiRmFpbGVkIHRvIGNyZWF0ZSBzeW1ib2wgZmlsZSBmb3IgJFNSQ19ST09ULyRCSU5BUlkiCisgICAgICAgIGZpCisgICAgZG9uZQorfQorCisjIFN0cmlwcyBhIGxpYnJhcnkgaW4gcGxhY2UKKyMgRXhwZWN0cyBUT09MQ0hBSU5fV1JBUFBFUl9ESVIgdG8gYmUgdmFsaWQgKHNldCBieSBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QqKQorIyBQYW5pY3MgaWYgbm90IGZvdW5kCisjICQxOiBUYXJnZXQgcm9vdCBkaXJlY3RvcnkKKyMgJDIrOiBMaXN0IG9mIGxpYiBwYXRocyByZWxhdGl2ZSB0byAkMQorc3RyaXBfbGlicyAoKSB7CisgICAgbG9jYWwgREVTVF9ST09UPSIkMSIKKyAgICBzaGlmdAorICAgIGxvY2FsIExJQlM9IiRAIgorICAgIGlmIFsgLXogJFRPT0xDSEFJTl9XUkFQUEVSX0RJUiBdOyB0aGVuCisgICAgICAgIHBhbmljICJUT09MQ0hBSU5fV1JBUFBFUl9ESVIgbm90IHNldCwgd2FzIGJ1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCBjYWxsZWQ/IgorICAgIGZpCisgICAgaWYgWyAhIC1kICRUT09MQ0hBSU5fV1JBUFBFUl9ESVIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiVE9PTENIQUlOX1dSQVBQRVJfRElSIGlzIG5vdCBhIGRpcmVjdG9yeSIKKyAgICBmaQorICAgIGZvciBMSUIgaW4gJExJQlM7IGRvCisgICAgICAgIGlmIFsgIiQoZ2V0X2J1aWxkX29zKSIgPSAiZGFyd2luIiBdOyB0aGVuCisgICAgICAgICAgICBydW4gc3RyaXAgLVMgJERFU1RfUk9PVC8kTElCIHx8IHBhbmljICJDb3VsZCBub3Qgc3RyaXAgJERFU1RfUk9PVCIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9jYWwgT0JKQ09QWT0iJFRPT0xDSEFJTl9XUkFQUEVSX0RJUiIvJChidWlsZGVyX2dudV9jb25maWdfaG9zdF9wcmVmaXgpb2JqY29weQorICAgICAgICAgICAgaWYgWyAhIC1mICIkT0JKQ09QWSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHBhbmljICJDb3VsZCBub3QgZmluZCBvYmpjb3B5IGF0ICRPQkpDT1BZIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIHJ1biAiJE9CSkNPUFkiIC0tc3RyaXAtdW5uZWVkZWQgJERFU1RfUk9PVC8kTElCIHx8IFwKKyAgICAgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IHN0cmlwICRERVNUX1JPT1QvJExJQiIKKyAgICAgICAgZmkKKyAgICBkb25lCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaSBiL2FuZHJvaWQvc2NyaXB0cy91dGlscy9lbXVsYXRvcl9wcmVidWlsdHMuc2hpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWYyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvZW11bGF0b3JfcHJlYnVpbHRzLnNoaQpAQCAtMCwwICsxLDQxIEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisKK3NoZWxsX2ltcG9ydCB1dGlscy9hb3NwX2Rpci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9vcHRpb25fcGFyc2VyLnNoaQorCisjIERlZmF1bHQgbG9jYXRpb24gb2YgcHJlYnVpbHRzIGRpcmVjdG9yeS4KK0RFRkFVTFRfUFJFQlVJTFRTX0RJUj0vdG1wLyRVU0VSLWVtdWxhdG9yLXByZWJ1aWx0cworCitwcmVidWlsdHNfZGlyX3JlZ2lzdGVyX29wdGlvbiAoKSB7CisgICAgT1BUX1BSRUJVSUxUU19ESVI9CisgICAgb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1wcmVidWlsdHMtZGlyPTxkaXI+IiBPUFRfUFJFQlVJTFRTX0RJUiBcCisgICAgICAgICAgICAiU3BlY2lmeSBwcmVidWlsdHMgcm9vdCBkaXJlY3RvcnkgWyRERUZBVUxUX1BSRUJVSUxUU19ESVJdIgorfQorCitwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbiAoKSB7CisgICAgaWYgWyAiJE9QVF9QUkVCVUlMVFNfRElSIiBdOyB0aGVuCisgICAgICAgIFBSRUJVSUxUU19ESVI9JE9QVF9QUkVCVUlMVFNfRElSCisgICAgICAgIGxvZyAiVXNpbmcgcHJlYnVpbHRzIGRpcjogJFBSRUJVSUxUU19ESVIiCisgICAgZWxpZiBbICIkQU5EUk9JRF9FTVVMQVRPUl9QUkVCVUlMVFNfRElSIiBdOyB0aGVuCisgICAgICAgIFBSRUJVSUxUU19ESVI9JEFORFJPSURfRU1VTEFUT1JfUFJFQlVJTFRTX0RJUgorICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXByZWJ1aWx0cy1kaXI9JFBSRUJVSUxUU19ESVIgIFtlbnZpcm9ubWVudF0iCisgICAgZWxzZQorICAgICAgICBsb2NhbCBBT1NQX1RPUAorICAgICAgICBBT1NQX1RPUD0kKGFvc3BfZmluZF90b3BfZGlyX2Zyb20gIiQocHJvZ3JhbV9kaXJlY3RvcnkpIikKKyAgICAgICAgaWYgWyAteiAiJEFPU1BfVE9QIiBdOyB0aGVuCisgICAgICAgICAgICBwYW5pYyAiQ291bGQgbm90IGZpbmQgQU9TUCB0b3AtbGV2ZWwgZGlyZWN0b3J5LiBQbGVhc2UgdXNlIC0tcHJlYnVpbHRzLWRpcj08ZGlyPi4iCisgICAgICAgIGZpCisgICAgICAgIFBSRUJVSUxUU19ESVI9JEFPU1BfVE9QL3ByZWJ1aWx0cy9hbmRyb2lkLWVtdWxhdG9yLWJ1aWxkCisgICAgICAgIGlmIFsgISAtZCAiJFBSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJNaXNzaW5nIGRpcmVjdG9yeSwgcGxlYXNlIHVzZSAtLXByZWJ1aWx0cy1kaXI9PGRpcj46IFskUFJFQlVJTFRTX0RJUl0iCisgICAgICAgIGZpCisgICAgICAgIGxvZyAiQXV0by1jb25maWc6IC0tcHJlYnVpbHRzLWRpcj0kUFJFQlVJTFRTX0RJUiAgW2RlZmF1bHRdIgorICAgIGZpCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvaW5zdGFsbF9kaXIuc2hpIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2luc3RhbGxfZGlyLnNoaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzM2MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL2luc3RhbGxfZGlyLnNoaQpAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZ1bmN0aW9ucyB1c2VkIHRvIGhhbmRsZSBhbiAtLWluc3RhbGwtZGlyPTxkaXI+IG9wdGlvbiwgdGhpcyBjYW4gYmUgdXNlZAorIyB0byBzcGVjaWZ5IGFuIGluc3RhbGxhdGlvbiBwYXRoIHVuZGVyIDxwcmVidWlsdHM+LworIworIyBVc2FnZToKKyMKKyMgIDEpIENhbGwgJ2luc3RhbGxfZGlyX3JlZ2lzdGVyX29wdGlvbiA8bmFtZT4nIHRvIHJlZ2lzdGVyIHRoZSBvcHRpb24KKyMgICAgIGFuZCB1c2UgJzxwcmVidWlsdHM+LzxuYW1lPicgYXMgdGhlIGRlZmF1bHQgbG9jYXRpb24uIElmIDxuYW1lPiBpcworIyAgICAgZW1wdHksIHRoZW4gJzxwcmVidWlsdHM+L2luc3RhbGwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdC4KKyMKKyMgIDIpIEFmdGVyIHBhcnNpbmcgdGhlIG9wdGlvbnMsIGFuZCBfYWZ0ZXJfICdwcmVidWlsdHNfZGlyX3BhcnNlX29wdGlvbicsCisjICAgICBjYWxsICdpbnN0YWxsX2Rpcl9wYXJzZV9vcHRpb24nLiBUaGlzIHdpbGwgZGVmaW5lIHRoZSBJTlNUQUxMX0RJUgorIyAgICAgZ2xvYmFsIHZhcmlhYmxlIGNvcnJlc3BvaW5kaW5nIHRvIHlvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKyMKKworIyAkMTogaW5zdGFsbGF0aW9uIHN1Yi1kaXJlY3RvcnkuIE9wdGlvbmFsLCBkZWZhdWx0IGlzICdpbnN0YWxsJworaW5zdGFsbF9kaXJfcmVnaXN0ZXJfb3B0aW9uICgpIHsKKyAgICBERUZBVUxUX0lOU1RBTExfU1VCRElSPSR7MTotaW5zdGFsbH0KKyAgICBvcHRpb25fcmVnaXN0ZXJfdmFyICItLWluc3RhbGwtZGlyPTxkaXI+IiBPUFRfSU5TVEFMTF9ESVIgXAorICAgICAgICAiU2V0IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgWzxwcmVidWlsdHM+LyRERUZBVUxUX0lOU1RBTExfU1VCRElSXSIKK30KKworaW5zdGFsbF9kaXJfcGFyc2Vfb3B0aW9uICgpIHsKKyAgICBpZiBbICIkT1BUX0lOU1RBTExfRElSIiBdOyB0aGVuCisgICAgICAgIElOU1RBTExfRElSPSRPUFRfSU5TVEFMTF9ESVIKKyAgICAgICAgbG9nICJVc2luZyBpbnN0YWxsIGRpcjogJElOU1RBTExfRElSIgorICAgIGVsc2UKKyAgICAgICAgSU5TVEFMTF9ESVI9JFBSRUJVSUxUU19ESVIvJERFRkFVTFRfSU5TVEFMTF9TVUJESVIKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1pbnN0YWxsLWRpcj0kSU5TVEFMTF9ESVIgIFtkZWZhdWx0XSIKKyAgICBmaQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL29wdGlvbl9wYXJzZXIuc2hpIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL29wdGlvbl9wYXJzZXIuc2hpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjI1NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKQEAgLTAsMCArMSwzNDggQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBSb3V0aW5lcyB1c2VkIHRvIHNpbXBsaWZ5IGNvbW1hbmQtbGluZSBvcHRpb25zIHBhcnNpbmcuCisKKyMgVXNhZ2UgaXMgcHJldHR5IHNpbXBsZToKKyMKKyMgIDEpIFVzZSAnc2hlbGxfaW1wb3J0IG9wdGlvbl9wYXJzZXInIHRvIGltcG9ydCB0aGlzIGZpbGUuCisjCisjICAyKSBPcHRpb25hbDogU2V0IFBST0dSQU1fTkFNRSB0byB0aGUgbmFtZSBvZiB5b3VyIHByb2dyYW0uIElmIHVuc2V0LCB0aGUKKyMgICAgIHZhbHVlIG9mICQocHJvZ3JhbV9uYW1lKSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4gVGhpcyBpcyBvbmx5IHVzZWQgdG8KKyMgICAgIGRpc3BsYXkgaGVscC4KKyMKKyMgIDMpIE9wdGlvbmFsOiBTZXQgUFJPR1JBTV9QQVJBTUVURVJTIHRvIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHlvdXIKKyMgICAgIHByb2dyYW0ncyBwYXJhbWV0ZXJzIChub3Qgb3B0aW9ucykuIFRoaXMgaXMgb25seSB1c2VkIHRvIGRpc3BsYXkKKyMgICAgIGhlbHAuIFRoZSAncHJpbnRfaGVscCcgZnVuY3Rpb24gYWN0dWFsbHkgZHVtcHMgc29tZXRoaW5nIGxpa2U6CisjCisjICAgICAgICBVc2FnZTogJFBST0dSQU1fTkFNRSBbb3B0aW9uc10gJFBST0dSQU1fUEFSQU1FVEVSCisjCisjICA0KSBPcHRpb25hbDogU2V0IFBST0dSQU1fREVTQ1JJUFRJT04gdG8gYSBsb25nIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91cgorIyAgICAgcHJvZ3JhbSBkb2VzLiBJdCB3aWxsIGJlIHByaW50ZWQganVzdCBhZnRlciB0aGUgJ1VzYWdlOiAuLi4nIGxpbmUKKyMgICAgIGFib3ZlLgorIworIyAgNSkgUmVnaXN0ZXIgbmV3IG9wdGlvbnMgd2l0aCAnb3B0aW9uX3JlZ2lzdGVyJyBvciAnb3B0aW9uX3JlZ2lzdGVyX3ZhcicKKyMgICAgIGFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXM6CisjCisjICAgICAgICBvcHRpb25fcmVnaXN0ZXIgLS1teWZsYWcgc2V0X215ZmxhZyAiU2V0IGN1c3RvbSBmbGFnIgorIyAgICAgICAgb3B0aW9uX3JlZ2lzdGVyX3ZhciAnLS1mb289PGJhcj4nIEZPTyAiU2V0IGZvbyB2YWx1ZSB0byA8YmFyPiIKKyMKKyMgICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZWFjaCBmdW5jdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgNikgQ2FsbCAnb3B0aW9uX3BhcnNlJywgYXMgaW46CisjCisjICAgICAgICBvcHRpb25fcGFyc2UgIiRAIgorIworIyAgICAgVGhpcyBwYXJzZXMgYWxsIG9wdGlvbnMgYW5kIHBhcmFtZXRlcnMuIFRoaXMgYWxzbyBwcmludHMgcmVsZXZhbnQKKyMgICAgIGVycm9yIG1lc3NhZ2VzIGlmIHlvdSBzcGVjaWZ5IGFuIGludmFsaWQgb3B0aW9uLiBJdCBhbHNvIGFjY3VtdWxhdGVzCisjICAgICBhbGwgcGFyYW1ldGVycyBpbnRvICRQQVJBTV8xLCAkUEFSQU1fMiwgJFBBUkFNXzMsIC4uLiB1cCB1bnRpbAorIyAgICAgJFBBUkFNX0NPVU5UIHdoaWNoIGlzIGFsc28gc2V0IGJ5IHRoZSBmdW5jdGlvbi4KKyMKKyMgICAgIC0taGVscCBhbmQgLT8gYXJlIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCBhcyBvcHRpb25zLCBhcyB3ZWxsIGFzCisjICAgICAtLXZlcmJvc2UgYW5kIC0tcXVpZXQgc28geW91IGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIHRoZXNlLgorCisjIE5PVEU6IFdlIHRyYW5zbGF0ZSAnLScgaW50byAnXycgd2hlbiBzdG9yaW5nIHRoZSBvcHRpb25zIGluIGdsb2JhbCB2YXJpYWJsZXMKKyMKKworX1NIVV9PUFRJT05TPSIiCitfU0hVX09QVElPTl9GTEFHUz0iIgorX1NIVV9PUFRJT05fU0VUVElOR1M9IiIKKworIyBSZXR1cm4gdGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc2VyaWVzIG9mIHN0cmluZ3MKKyMKKyMgVXNhZ2U6ICBsZW49YG1heF9sZW5ndGggPHN0cmluZzE+IDxzdHJpbmcyPiAuLi5gCisjCitfc2h1X21heF9sZW5ndGggKCkgeworICAgIHByaW50ZiAlcyAiJEAiIHwgdHIgJyAnICdcbicgfCBcCisgICAgICAgICAgICBhd2sgJ0JFR0lOIHttYXg9MH0ge2xlbj1sZW5ndGgoJDEpOyBpZiAobGVuID4gbWF4KSBtYXg9bGVufSBFTkQge3ByaW50IG1heH0nCit9CisKKyMgVHJhbnNsYXRlIGRhc2hlcyB0byB1bmRlcnNjb3JlcworIyBVc2FnZTogIHN0cj1gX3NodV9kYXNoZXNfdG9fdW5kZXJzY29yZXMgPHZhbHVlcz5gCitfc2h1X2Rhc2hlc190b191bmRlcnNjb3JlcyAoKSB7CisgICAgcHJpbnRmICVzICIkQCIgfCB0ciAnLScgJ18nCit9CisKKyMgVHJhbnNsYXRlIHVuZGVyc2NvcmVzIHRvIGRhc2hlcworIyBVc2FnZTogc3RyPWBfc2h1X3VuZGVyc2NvcmVzX3RvX2Rhc2hlcyA8dmFsdWVzPmAKK19zaHVfdW5kZXJzY29yZXNfdG9fZGFzaGVzICgpCit7CisgICAgcHJpbnRmICVzICIkQCIgfCB0ciAnXycgJy0nCit9CisKKyMgU2V0IGEgZ2l2ZW4gb3B0aW9uIGF0dHJpYnV0ZQorIyAkMTogb3B0aW9uIG5hbWUKKyMgJDI6IG9wdGlvbiBhdHRyaWJ1dGUKKyMgJDM6IGF0dHJpYnV0ZSB2YWx1ZQorIworX3NodV9vcHRpb25fc2V0X2F0dHIgKCkgeworICAgIHZhcl9hc3NpZ24gX1NIVV9PUFRJT05TXyQxXyQyICIkMyIKK30KKworIyBHZXQgYSBnaXZlbiBvcHRpb24gYXR0cmlidXRlCisjICQxOiBvcHRpb24gbmFtZQorIyAkMjogb3B0aW9uIGF0dHJpYnV0ZQorIworX3NodV9vcHRpb25fZ2V0X2F0dHIgKCkgeworICAgIHZhcl92YWx1ZSBfU0hVX09QVElPTlNfJDFfJDIKK30KKworIyBSZWdpc3RlciBhIG5ldyBvcHRpb24KKyMgJDE6IG9wdGlvbgorIyAkMjogc21hbGwgYWJzdHJhY3QgZm9yIHRoZSBvcHRpb24KKyMgJDM6IG9wdGlvbmFsLiBkZWZhdWx0IHZhbHVlCisjCitfc2h1X3JlZ2lzdGVyX29wdGlvbl9pbnRlcm5hbCAoKSB7CisgICAgb3B0bGFiZWw9CisgICAgb3B0bmFtZT0KKyAgICBvcHR2YWx1ZT0KKyAgICBvcHR0eXBlPQorICAgIHdoaWxlIFsgLW4gIjEiIF0gOyBkbworICAgICAgICAjIENoZWNrIGZvciBzb21ldGhpbmcgbGlrZSAtLXNldHRpbmc9PHZhbHVlPgorICAgICAgICBpZiAocHJpbnRmICVzICIkMSIgfCBncmVwIC1xIC1FIC1lICdeLS1bXj1dKz08Lis+JCcpOyB0aGVuCisgICAgICAgICAgICBvcHRsYWJlbD0kKGV4cHIgLS0gIiQxIiA6ICdcKC0tW149XSpcKT0uKicpCisgICAgICAgICAgICBvcHR2YWx1ZT0kKGV4cHIgLS0gIiQxIiA6ICctLVtePV0qPVwoPC4qPlwpJykKKyAgICAgICAgICAgIG9wdHR5cGU9Imxvbmdfc2V0dGluZyIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisKKyAgICAgICAgIyBDaGVjayBmb3Igc29tZXRoaW5nIGxpa2UgLS1mbGFnCisgICAgICAgIGlmIChwcmludGYgJXMgIiQxIiB8IGdyZXAgLXEgLUUgLWUgJ14tLVtePV0rJCcpOyB0aGVuCisgICAgICAgICAgICBvcHRsYWJlbD0iJDEiCisgICAgICAgICAgICBvcHR0eXBlPSJsb25nX2ZsYWciCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorCisgICAgICAgICMgQ2hlY2sgZm9yIHNvbWV0aGluZyBsaWtlIC1mPHZhbHVlPgorICAgICAgICBpZiAocHJpbnRmICVzICIkMSIgfCBncmVwIC1xIC1FIC1lICdeLVtBLVphLXowLTldPC4rPiQnKTsgdGhlbgorICAgICAgICAgICAgb3B0bGFiZWw9JChleHByIC0tICIkMSIgOiAnXCgtLlwpLionKQorICAgICAgICAgICAgb3B0dmFsdWU9JChleHByIC0tICIkMSIgOiAnLS5cKDwuKj5cKScpCisgICAgICAgICAgICBvcHR0eXBlPSJzaG9ydF9zZXR0aW5nIgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKworICAgICAgICAjIENoZWNrIGZvciBzb21ldGhpbmcgbGlrZSAtZgorICAgICAgICBpZiAocHJpbnRmICVzICIkMSIgfCBncmVwIC1xIC1FIC1lICdeLS4kJyk7IHRoZW4KKyAgICAgICAgICAgIG9wdGxhYmVsPSIkMSIKKyAgICAgICAgICAgIG9wdHR5cGU9InNob3J0X2ZsYWciCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorCisgICAgICAgIGVjaG8gIkVSUk9SOiBJbnZhbGlkIG9wdGlvbiBmb3JtYXQ6ICQxIgorICAgICAgICBlY2hvICIgICAgICAgQ2hlY2sgcmVnaXN0ZXJfb3B0aW9uIGNhbGwiCisgICAgICAgIGV4aXQgMQorICAgIGRvbmUKKworICAgIGxvZyAibmV3IG9wdGlvbjogdHlwZT0nJG9wdHR5cGUnIG5hbWU9JyRvcHRsYWJlbCcgdmFsdWU9JyRvcHR2YWx1ZSciCisKKyAgICBvcHRuYW1lPSQoX3NodV9kYXNoZXNfdG9fdW5kZXJzY29yZXMgJG9wdGxhYmVsKQorICAgIE9QVElPTlM9IiRPUFRJT05TICRvcHRuYW1lIgorICAgIE9QVElPTlNfVEVYVD0iJE9QVElPTlNfVEVYVCAkMSIKKyAgICBfc2h1X29wdGlvbl9zZXRfYXR0ciAkb3B0bmFtZSBsYWJlbCAiJG9wdGxhYmVsIgorICAgIF9zaHVfb3B0aW9uX3NldF9hdHRyICRvcHRuYW1lIG90eXBlICIkb3B0dHlwZSIKKyAgICBfc2h1X29wdGlvbl9zZXRfYXR0ciAkb3B0bmFtZSB2YWx1ZSAiJG9wdHZhbHVlIgorICAgIF9zaHVfb3B0aW9uX3NldF9hdHRyICRvcHRuYW1lIHRleHQgIiQxIgorICAgIF9zaHVfb3B0aW9uX3NldF9hdHRyICRvcHRuYW1lIGFic3RyYWN0ICIkMiIKKyAgICBfc2h1X29wdGlvbl9zZXRfYXR0ciAkb3B0bmFtZSBkZWZhdWx0ICIkMyIKK30KKworIyBSZWdpc3RlciBhIG5ldyBvcHRpb24gd2l0aCBhIGZ1bmN0aW9uIGNhbGxiYWNrLgorIworIyAkMTogb3B0aW9uCisjICQyOiBuYW1lIG9mIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgb3B0aW9uIGlzIHBhcnNlZAorIyAkMzogc21hbGwgYWJzdHJhY3QgZm9yIHRoZSBvcHRpb24KKyMgJDQ6IG9wdGlvbmFsLiBkZWZhdWx0IHZhbHVlCisjCitvcHRpb25fcmVnaXN0ZXIgKCkgeworICAgIGxvY2FsIG9wdG5hbWUgb3B0dmFsdWUgb3B0dHlwZSBvcHRsYWJlbAorICAgIF9zaHVfcmVnaXN0ZXJfb3B0aW9uX2ludGVybmFsICIkMSIgIiQzIiAiJDQiCisgICAgX3NodV9vcHRpb25fc2V0X2F0dHIgJG9wdG5hbWUgZnVuY25hbWUgIiQyIgorfQorCisjIFJlZ2lzdGVyIGEgbmV3IG9wdGlvbiB3aXRoIGEgdmFyaWFibGUgc3RvcmUKKyMKKyMgJDE6IG9wdGlvbgorIyAkMjogbmFtZSBvZiB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgc2V0IGJ5IHRoaXMgb3B0aW9uCisjICQzOiBzbWFsbCBhYnN0cmFjdCBmb3IgdGhlIG9wdGlvbgorIworIyBOT1RFOiBUaGUgY3VycmVudCB2YWx1ZSBvZiAkMiBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0CisjCitvcHRpb25fcmVnaXN0ZXJfdmFyICgpIHsKKyAgICBsb2NhbCBvcHRuYW1lIG9wdHZhbHVlIG9wdHR5cGUgb3B0bGFiZWwKKyAgICBfc2h1X3JlZ2lzdGVyX29wdGlvbl9pbnRlcm5hbCAiJDEiICIkMyIgIiQodmFyX3ZhbHVlICQyKSIKKyAgICBfc2h1X29wdGlvbl9zZXRfYXR0ciAkb3B0bmFtZSB2YXJuYW1lICIkMiIKK30KKworIyBQcmludCB0aGUgaGVscCwgaW5jbHVkaW5nIGEgbGlzdCBvZiByZWdpc3RlcmVkIG9wdGlvbnMgZm9yIHRoaXMgcHJvZ3JhbQorIyBOb3RlOiBBc3N1bWVzIFBST0dSQU1fUEFSQU1FVEVSUyBhbmQgUFJPR1JBTV9ERVNDUklQVElPTiBleGlzdCBhbmQKKyMgICAgICAgY29ycmVzcG9uZCB0byB0aGUgcGFyYW1ldGVycyBsaXN0IGFuZCB0aGUgcHJvZ3JhbSBkZXNjcmlwdGlvbgorIworX3NodV9vcHRpb25fcHJpbnRfaGVscCAoKSB7CisgICAgbG9jYWwgb3B0IHRleHQgYWJzdHJhY3QgZGVmYXVsdCBBV0tfU0NSSVBUCisKKyAgICBpZiBbIC16ICIkUFJPR05BTUUiIF07IHRoZW4KKyAgICAgICAgUFJPR05BTUU9JChwcm9ncmFtX25hbWUpCisgICAgZmkKKworICAgIGVjaG8gIlVzYWdlOiAkUFJPR05BTUUgW29wdGlvbnNdICRQUk9HUkFNX1BBUkFNRVRFUlMiCisgICAgZWNobyAiIgorICAgIGlmIFsgLW4gIiRQUk9HUkFNX0RFU0NSSVBUSU9OIiBdIDsgdGhlbgorICAgICAgICBlY2hvICIkUFJPR1JBTV9ERVNDUklQVElPTiIKKyAgICAgICAgZWNobyAiIgorICAgIGZpCisgICAgZWNobyAiVmFsaWQgb3B0aW9ucyAoZGVmYXVsdHMgYXJlIGluIGJyYWNrZXRzKToiCisgICAgZWNobyAiIgorCisgICAgbWF4dz0kKF9zaHVfbWF4X2xlbmd0aCAiJE9QVElPTlNfVEVYVCIpCisgICAgQVdLX1NDUklQVD0kKGVjaG8gInsgcHJpbnRmIFwiJS0ke21heHd9c1wiLCBcJDEgfSIpCisgICAgZm9yIG9wdCBpbiAkT1BUSU9OUzsgZG8KKyAgICAgICAgdGV4dD0kKF9zaHVfb3B0aW9uX2dldF9hdHRyICRvcHQgdGV4dCB8IGF3ayAiJEFXS19TQ1JJUFQiKQorICAgICAgICBhYnN0cmFjdD0kKF9zaHVfb3B0aW9uX2dldF9hdHRyICRvcHQgYWJzdHJhY3QpCisgICAgICAgIGRlZmF1bHQ9JChfc2h1X29wdGlvbl9nZXRfYXR0ciAkb3B0IGRlZmF1bHQpCisgICAgICAgIGlmIFsgLW4gIiRkZWZhdWx0IiBdIDsgdGhlbgorICAgICAgICAgICAgZWNobyAiICAkdGV4dCAgICAgJGFic3RyYWN0IFskZGVmYXVsdF0iCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIiAgJHRleHQgICAgICRhYnN0cmFjdCIKKyAgICAgICAgZmkKKyAgICBkb25lCisgICAgZWNobyAiIgorfQorCitfc2h1X29wdGlvbl9wYW5pY19ub19hcmdzICgpIHsKKyAgICBwYW5pYyAiT3B0aW9uICckMScgZG9lcyBub3QgdGFrZSBhcmd1bWVudHMuIFNlZSAtLWhlbHAgZm9yIHVzYWdlLiIKK30KKworX3NodV9vcHRpb25fcGFuaWNfbWlzc2luZ19hcmcgKCkgeworICAgIHBhbmljICJPcHRpb24gJyQxJyByZXF1aXJlcyBhbiBhcmd1bWVudC4gU2VlIC0taGVscCBmb3IgdXNhZ2UuIgorfQorCisKKyMgUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIHNldCBQQVJBTUVURVJfQ09VTlQgYXMgd2VsbCBhcworIyBQQVJBTUVURVJfMSwgUEFSQU1FVEVSXzIsIC4uLiBQQVJBTUVURVJfPG4+LgorIworIyBUaGUgY2FsbGVyIG11c3QgaGF2ZSBjYWxsZWQgfG9wdGlvbl9yZWdpc3Rlcnwgb3IgfG9wdGlvbl9yZWdpc3Rlcl92YXJ8CisjIHRvIHJlZ2lzdGVyIHNwZWNpZmljIG9wdGlvbnMuCisjCisjICQxKzogY29tbWFuZC1saW5lIG9wdGlvbnMuCitvcHRpb25fcGFyc2UgKCkgeworICAgIGxvY2FsIG9wdCBvcHRuYW1lIG90eXBlIHZhbHVlIG5hbWUgZmluIGZ1bmNuYW1lCisgICAgUEFSQU1FVEVSX0NPVU5UPTAKKyAgICB3aGlsZSBbIC1uICIkMSIgXSA7IGRvCisgICAgICAgICMgSWYgdGhlIHBhcmFtZXRlciBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgZGFzaAorICAgICAgICAjIGl0IGlzIG5vdCBhbiBvcHRpb24uCisgICAgICAgIHBhcmFtPSQoZXhwciAtLSAiJDEiIDogJ15cKFteXC1dLipcKSQnIHx8IHRydWUpCisgICAgICAgIGlmIFsgLW4gIiRwYXJhbSIgXSA7IHRoZW4KKyAgICAgICAgICAgIFBBUkFNRVRFUl9DT1VOVD0kKCggJFBBUkFNRVRFUl9DT1VOVCArIDEgKSkKKyAgICAgICAgICAgIHZhcl9hc3NpZ24gUEFSQU1FVEVSXyRQQVJBTUVURVJfQ09VTlQgIiQxIgorICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisKKyAgICAgICAgd2hpbGUgWyAtbiAiMSIgXSA7IGRvCisgICAgICAgICAgICAjIFRyeSB0byBtYXRjaCBhIGxvbmcgc2V0dGluZywgaS5lLiAtLW9wdGlvbj12YWx1ZQorICAgICAgICAgICAgb3B0PSQoZXhwciAtLSAiJDEiIDogJ15cKC0tW149XSpcKT0uKiQnIHx8IHRydWUpCisgICAgICAgICAgICBpZiBbIC1uICIkb3B0IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIG90eXBlPSJsb25nX3NldHRpbmciCisgICAgICAgICAgICAgICAgdmFsdWU9JChleHByIC0tICIkMSIgOiAnXi0tW149XSo9XCguKlwpJCcgfHwgdHJ1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgIyBUcnkgdG8gbWF0Y2ggYSBsb25nIGZsYWcsIGkuZS4gLS1vcHRpb24KKyAgICAgICAgICAgIG9wdD0kKGV4cHIgLS0gIiQxIiA6ICdeXCgtLS4qXCkkJyB8fCB0cnVlKQorICAgICAgICAgICAgaWYgWyAtbiAiJG9wdCIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBvdHlwZT0ibG9uZ19mbGFnIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ5ZXMiCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIG1hdGNoIGEgc2hvcnQgc2V0dGluZywgaS5lLiAtbzx2YWx1ZT4KKyAgICAgICAgICAgIG9wdD0kKGV4cHIgLS0gIiQxIiA6ICdeXCgtW0EtWmEtejAtOV1cKS4uKiQnIHx8IHRydWUpCisgICAgICAgICAgICBpZiBbIC1uICIkb3B0IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIG90eXBlPSJzaG9ydF9zZXR0aW5nIgorICAgICAgICAgICAgICAgIHZhbHVlPSQoZXhwciAtLSAiJDEiIDogJ14tLlwoLipcKSQnKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIFRyeSB0byBtYXRjaCBhIHNob3J0IGZsYWcsIGkuZS4gLW8KKyAgICAgICAgICAgIG9wdD0kKGV4cHIgLS0gIiQxIiA6ICdeXCgtLlwpJCcgfHwgdHJ1ZSkKKyAgICAgICAgICAgIGlmIFsgLW4gIiRvcHQiIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgb3R5cGU9InNob3J0X2ZsYWciCisgICAgICAgICAgICAgICAgdmFsdWU9InllcyIKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgcGFuaWMgIlVua25vd24gb3B0aW9uICckMScuIFVzZSAtLWhlbHAgZm9yIGxpc3Qgb2YgdmFsaWQgdmFsdWVzLiIKKyAgICAgICAgZG9uZQorCisgICAgICAgICNlY2hvICJGb3VuZCBvcHQ9JyRvcHQnIG90eXBlPSckb3R5cGUnIHZhbHVlPSckdmFsdWUnIgorCisgICAgICAgIG5hbWU9JChfc2h1X2Rhc2hlc190b191bmRlcnNjb3JlcyAkb3B0KQorICAgICAgICBmb3VuZD0wCisgICAgICAgIGZvciB4b3B0IGluICRPUFRJT05TOyBkbworICAgICAgICAgICAgaWYgWyAiJG5hbWUiICE9ICIkeG9wdCIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgdHlwZSBpcyBjb3JyZWN0IGhlcmUKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBhbHNvIGFsbG93cyB1cyB0byBoYW5kbGUgLW8gPHZhbHVlPiBhcyAtbzx2YWx1ZT4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHhvdHlwZT0kKF9zaHVfb3B0aW9uX2dldF9hdHRyICRuYW1lIG90eXBlKQorICAgICAgICAgICAgaWYgWyAiJG90eXBlIiAhPSAiJHhvdHlwZSIgXSA7IHRoZW4KKyAgICAgICAgICAgICAgICBjYXNlICIkeG90eXBlIiBpbgorICAgICAgICAgICAgICAgICJzaG9ydF9mbGFnIikKKyAgICAgICAgICAgICAgICAgICAgX3NodV9vcHRpb25fcGFuaWNfbm9fYXJncyAiJG9wdCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAic2hvcnRfc2V0dGluZyIpCisgICAgICAgICAgICAgICAgICAgIGlmIFsgLXogIiQyIiBdIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgX3NodV9vcHRpb25fcGFuaWNfbWlzc2luZ19hcmcgIiRvcHQiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIkMiIKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAibG9uZ19mbGFnIikKKyAgICAgICAgICAgICAgICAgICAgX3NodV9vcHRpb25fcGFuaWNfbm9fYXJncyAiJG9wdCIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAibG9uZ19zZXR0aW5nIikKKyAgICAgICAgICAgICAgICAgICAgX3NodV9vcHRpb25fcGFuaWNfbWlzc2luZ19hcmcgIiRvcHQiCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgZXNhYworICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZvdW5kPTEKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBicmVhaworICAgICAgICBkb25lCisgICAgICAgIGlmIFsgIiRmb3VuZCIgPSAiMCIgXSA7IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJVbmtub3duIG9wdGlvbiAnJG9wdCcuIFNlZSAtLWhlbHAgZm9yIHVzYWdlLiIKKyAgICAgICAgZmkKKyAgICAgICAgIyBTZXQgdmFyaWFibGUgb3IgbGF1bmNoIG9wdGlvbi1zcGVjaWZpYyBmdW5jdGlvbi4KKyAgICAgICAgdmFybmFtZT0kKF9zaHVfb3B0aW9uX2dldF9hdHRyICRuYW1lIHZhcm5hbWUpCisgICAgICAgIGlmIFsgLW4gIiR2YXJuYW1lIiBdIDsgdGhlbgorICAgICAgICAgICAgdmFyX2Fzc2lnbiAkdmFybmFtZSAiJHZhbHVlIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFsICQoX3NodV9vcHRpb25fZ2V0X2F0dHIgJG5hbWUgZnVuY25hbWUpIFwnIiR2YWx1ZSJcJworICAgICAgICBmaQorICAgICAgICBzaGlmdAorICAgIGRvbmUKK30KKworCitfc2h1X2RvX29wdGlvbl9oZWxwICgpIHsKKyAgICBfc2h1X29wdGlvbl9wcmludF9oZWxwCisgICAgZXhpdCAwCit9CisKK29wdGlvbl9yZWdpc3RlciAiLS1oZWxwIiAgICAgX3NodV9kb19vcHRpb25faGVscCAgICJQcmludCB0aGlzIGhlbHAuIgorb3B0aW9uX3JlZ2lzdGVyICItLXZlcmJvc2UiICBpbmNyZW1lbnRfdmVyYm9zaXR5ICAgIkluY3JlbWVudCB2ZXJib3NpdHkuIgorb3B0aW9uX3JlZ2lzdGVyICItLXZlcmJvc2l0eT08bGV2ZWw+IiBzZXRfdmVyYm9zaXR5ICAgICAgIlNldCB2ZXJib3NpdHkgbGV2ZWwuIgorb3B0aW9uX3JlZ2lzdGVyICItLXF1aWV0IiAgICBkZWNyZW1lbnRfdmVyYm9zaXR5ICAgIkRlY3JlbWVudCB2ZXJib3NpdHkuIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkgYi9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvcGFja2FnZV9idWlsZGVyLnNoaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDMwZDAwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC9zY3JpcHRzL3V0aWxzL3BhY2thZ2VfYnVpbGRlci5zaGkKQEAgLTAsMCArMSw3NDYgQEAKKyMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBDb21tb24gZnVuY3Rpb25zIHVzZWQgdG8gaGVscCBidWlsZCBzb3VyY2UgcGFja2FnZXMgZm9yIHRoZSBBbmRyb2lkIGVtdWxhdG9yLgorCitzaGVsbF9pbXBvcnQgdXRpbHMvYW9zcF9kaXIuc2hpCitzaGVsbF9pbXBvcnQgdXRpbHMvb3B0aW9uX3BhcnNlci5zaGkKK3NoZWxsX2ltcG9ydCB1dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQorCisjIExpc3Qgb2YgdmFsaWQgaG9zdCBzeXN0ZW1zLgorX1NIVV9WQUxJRF9IT1NUX1NZU1RFTVM9ImxpbnV4LXg4NixsaW51eC14ODZfNjQsd2luZG93cy14ODYsd2luZG93cy14ODZfNjQsZGFyd2luLXg4NixkYXJ3aW4teDg2XzY0IgorCisjIENhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgJ29wdGlvbl9wYXJzZScgdG8gcmVnaXN0ZXIgb3B0aW9ucyByZWxhdGVkIHRvCisjIGJ1aWxkaW5nIHBhY2thZ2VzLiBUaGlzIHJlZ2lzdGVycyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisjCisjICAgLS1idWlsZC1kaXI9PGRpcj4KKyMgICAtLWpvYnM9PGNvdW50PgorIyAgIC1qPGNvdW50PgorIworcGFja2FnZV9idWlsZGVyX3JlZ2lzdGVyX29wdGlvbnMgKCkgeworICBPUFRfQlVJTERfRElSPQorICBvcHRpb25fcmVnaXN0ZXJfdmFyICItLWJ1aWxkLWRpcj08ZGlyPiIgT1BUX0JVSUxEX0RJUiAiU3BlY2lmeSBidWlsZCBkaXJlY3RvcnkiCisKKyAgT1BUX05VTV9KT0JTPQorICBvcHRpb25fcmVnaXN0ZXJfdmFyICItajxjb3VudD4iIE9QVF9OVU1fSk9CUyAiUnVuIDxjb3VudD4gcGFyYWxsZWwgYnVpbGQgam9icyBbJChnZXRfYnVpbGRfbnVtX2NvcmVzKV0iCisgIG9wdGlvbl9yZWdpc3Rlcl92YXIgIi0tam9icz08Y291bnQ+IiBPUFRfTlVNX0pPQlMgIlNhbWUgYXMgLWo8Y291bnQ+LiIKKworICBPUFRfQ0NBQ0hFPQorICBvcHRpb25fcmVnaXN0ZXJfdmFyICItLWNjYWNoZT08cHJvZ3JhbT4iIE9QVF9DQ0FDSEUgIlVzZSBzcGVjaWZpYyBjY2FjaGUgcHJvZ3JhbSBbYXV0b2RldGVjdF0iCisKKyAgT1BUX05PX0NDQUNIRT0KKyAgb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1uby1jY2FjaGUiIE9QVF9OT19DQ0FDSEUgIkRpc2FibGUgY2NhY2hlIHVzYWdlLiIKKworICBpZiBbIC16ICIkREVGQVVMVF9IT1NUX1NZU1RFTVMiIF07IHRoZW4KKyAgICBjYXNlICQoZ2V0X2J1aWxkX29zKSBpbgorICAgICAgbGludXgpCisgICAgICAgIERFRkFVTFRfSE9TVF9TWVNURU1TPSJsaW51eC14ODZfNjQsd2luZG93cy14ODZfNjQsd2luZG93cy14ODYiCisgICAgICAgIDs7CisgICAgICBkYXJ3aW4pCisgICAgICAgIERFRkFVTFRfSE9TVF9TWVNURU1TPSJkYXJ3aW4teDg2XzY0IgorICAgICAgICA7OworICAgICAgKikKKyAgICAgICAgcGFuaWMgIkRvbid0IGtub3cgaG93IHRvIGJ1aWxkIGJpbmFyaWVzIG9uIHRoaXMgc3lzdGVtIFskKGdldF9idWlsZF9vcyldIgorICAgIGVzYWMKKyAgZmkKKworICBPUFRfREFSV0lOX1NTSD0KKyAgb3B0aW9uX3JlZ2lzdGVyX3ZhciAiLS1kYXJ3aW4tc3NoPTxob3N0PiIgT1BUX0RBUldJTl9TU0ggIlBlcmZvcm0gcmVtb3RlIGJ1aWxkIHRocm91Z2ggU1NILiIKKworICBPUFRfU1NIX1dSQVBQRVI9CisgIG9wdGlvbl9yZWdpc3Rlcl92YXIgIi0tc3NoLXdyYXBwZXI9PGNvbW1hbmQ+IiBPUFRfU1NIX1dSQVBQRVIgIlByZWZpeCA8Y29tbWFuZD4gdG8gYWxsIFNTSCBjb21tYW5kcy4iCisKKyAgT1BUX0ZPUkNFPQorICBvcHRpb25fcmVnaXN0ZXJfdmFyICItLWZvcmNlIiBPUFRfRk9SQ0UgIkFsd2F5cyByZWJ1aWxkIGFsbC4iCisKKyAgT1BUX0hPU1Q9CisgIG9wdGlvbl9yZWdpc3Rlcl92YXIgIi0taG9zdD08aG9zdD4iIE9QVF9IT1NUICJTcGVjaWZ5IGhvc3Qgc3lzdGVtIG9mIGdlbmVyYXRlZCBiaW5hcmllcyBbJERFRkFVTFRfSE9TVF9TWVNURU1TXSIKK30KKworX3NodV9idWlsZGVyX2NsZWFudXBfdGVtcF9kaXIgKCkgeworICAgIHJtIC1yZiAiJFRFTVBfRElSIgorICAgIGV4aXQgJDEKK30KKworIyBTZXR1cCBEQVJXSU5fU1lTVEVNUyBhbmQgTE9DQUxfSE9TVF9TWVNURU1TCisjICQxOiBMaXN0IG9mIGhvc3Qgc3l0ZW1zLgorX3NodV9idWlsZGVyX3NldHVwX2xvY2FsX3N5c3RlbXMgKCkgeworICAgIGxvY2FsIEhPU1RfU1lTVEVNUz0iJChjb21tYXNfdG9fc3BhY2VzICIkMSIpIgorICAgIGxvY2FsIFNZU1RFTQorICAgICMgQ29tcHV0ZSB0aGUgbGlzdCBvZiBkYXJ3aW4gaG9zdCBzeXN0ZW1zLgorICAgIERBUldJTl9TWVNURU1TPQorICAgIGZvciBTWVNURU0gaW4gJEhPU1RfU1lTVEVNUzsgZG8KKyAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgICAgIHZhcl9hcHBlbmQgREFSV0lOX1NZU1RFTVMgIiRTWVNURU0iCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgIGRvbmUKKworICAgICMgQ29tcHV0ZSB0aGUgbGlzdCBvZiBsb2NhbCBob3N0IHN5c3RlbXMsIGkuZS4gdGhlIG9uZXMgdGhhdCB3aWxsIGJlIGJ1aWx0CisgICAgIyBvbiB0aGUgbWFjaGluZSBydW5uaW5nIHRoaXMgc2NyaXB0LCBhcyBvcHBvc2VkIHRvIHJlbW90ZWx5IHdpdGggU1NILgorICAgIExPQ0FMX0hPU1RfU1lTVEVNUz0kSE9TVF9TWVNURU1TCisgICAgaWYgWyAiJERBUldJTl9TWVNURU1TIiAtYSAiJChnZXRfYnVpbGRfb3MpIiAhPSAiZGFyd2luIiBdOyB0aGVuCisgICAgICAgIGlmIFsgLXogIiREQVJXSU5fU1NIIiBdOyB0aGVuCisgICAgICAgICAgICBwYW5pYyAiQ2Fubm90IGJ1aWxkIERhcndpbiBiaW5hcmllcyBvbiB0aGlzIG1hY2hpbmUsIHBsZWFzZSB1c2UgLS1kYXJ3aW4tc3NoPTxob3N0Pi4iCisgICAgICAgIGZpCisgICAgICAgIExPQ0FMX0hPU1RfU1lTVEVNUz0KKyAgICAgICAgZm9yIFNZU1RFTSBpbiAkSE9TVF9TWVNURU1TOyBkbworICAgICAgICAgICAgY2FzZSAkU1lTVEVNIGluCisgICAgICAgICAgICAgICAgZGFyd2luKikKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAqKQorICAgICAgICAgICAgICAgICAgICB2YXJfYXBwZW5kIExPQ0FMX0hPU1RfU1lTVEVNUyAiJFNZU1RFTSIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZG9uZQorICAgIGZpCit9CisKKyMgQ2FsbCB0aGlzIGFmdGVyICdvcHRpb25fcGFyc2UnIHRvIHByb2Nlc3MgdGhlIGJ1aWxkLXJlbGF0ZWQgb3B0aW9ucy4KKyMgVGhpcyBhbHNvIGRlZmluZXMgdGhlIGZvbGxvd2luZyBnbG9iYWwgdmFyaWFibGVzOgorIyAgLSBURU1QX0RJUjogVGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeS4KKyMgIC0gSE9TVF9TWVNURU1TOiBMaXN0IG9mIGhvc3Qgc3lzdGVtcyB0byBidWlsZCBiaW5hcmllcyBmb3IuCisjICAtIE5VTV9KT0JTOiBOdW1iZXIgb2YgY29uY3VycmVudCBidWlsZCBqb2JzIHRvIHBlcmZvcm0uCisjICAtIENDQUNIRTogUGF0aCB0byAnY2NhY2hlJyBwcm9ncmFtIGlzIHVzYWJsZS4KKyMgIC0gT0xEX1BBVEg6IFZhbHVlIG9mICRQQVRIIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisjCisjIFRoaXMgYWxzbyBlbnN1cmVzIHRoYXQgaWYgLS1idWlsZC1kaXI9PGRpcj4gd2FzIG5vdCB1c2VkLCB0aGUgdGVtcG9yYXJ5CisjIGRpcmVjdG9yeSBpcyBwcm9wZXJseSByZW1vdmVkIHdoZW4gdGhlIHNjcmlwdCBleGl0cy4KKyMKKyMgJDE6IHN1ZmZpeCBmb3IgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yaWVzIChlLmcuICdhbmRyb2lkLWVtdWxhdG9yJykKK3BhY2thZ2VfYnVpbGRlcl9wcm9jZXNzX29wdGlvbnMgKCkgeworICAgIGlmIFsgIiRPUFRfQlVJTERfRElSIiBdOyB0aGVuCisgICAgICAgIFRFTVBfRElSPSRPUFRfQlVJTERfRElSCisgICAgZWxzZQorICAgICAgICBURU1QX0RJUj0vdG1wLyRVU0VSLWJ1aWxkLSR7MTotdGVtcH0tJCQKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1idWlsZC1kaXI9JFRFTVBfRElSIgorICAgIGZpCisgICAgcnVuIG1rZGlyIC1wICIkVEVNUF9ESVIiIHx8CisgICAgcGFuaWMgIkNvdWxkIG5vdCBjcmVhdGUgYnVpbGQgZGlyZWN0b3J5OiAkVEVNUF9ESVIiCisKKyAgICBpZiBbIC16ICIkT1BUX0JVSUxEX0RJUiIgXTsgdGhlbgorICAgICAgICAjIEVuc3VyZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGlzIGRlbGV0ZWQgb24gc2NyaXB0IGV4aXQsIHVubGVzcworICAgICAgICAjIC0tYnVpbGQtZGlyPTxwYXRoPiB3YXMgdXNlZC4KKyAgICAgICAgdHJhcCAiX3NodV9idWlsZGVyX2NsZWFudXBfdGVtcF9kaXIgMCIgRVhJVAorICAgICAgICB0cmFwICJfc2h1X2J1aWxkZXJfY2xlYW51cF90ZW1wX2RpciBcJD8iIFFVSVQgSU5UIEhVUAorICAgIGZpCisKKyAgICBpZiBbICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgICAgIGxvZyAiQ2xlYW5pbmcgdXAgYnVpbGQgZGlyZWN0b3J5LiIKKyAgICAgICAgcnVuIHJtIC1yZiAiJFRFTVBfRElSIi9idWlsZC0qCisgICAgZmkKKworICAgIGlmIFsgIiRPUFRfTlVNX0pPQlMiIF07IHRoZW4KKyAgICAgICAgTlVNX0pPQlM9JE9QVF9OVU1fSk9CUworICAgICAgICBsb2cgIlBhcmFsbGVsIGpvYnMgY291bnQ6ICROVU1fSk9CUyIKKyAgICBlbHNlCisgICAgICAgIE5VTV9KT0JTPSQoZ2V0X2J1aWxkX251bV9jb3JlcykKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1qb2JzPSROVU1fSk9CUyIKKyAgICBmaQorCisgICAgaWYgWyAiJE9QVF9OT19DQ0FDSEUiIF07IHRoZW4KKyAgICAgICAgaWYgWyAiJE9QVF9DQ0FDSEUiIF07IHRoZW4KKyAgICAgICAgICAgIHBhbmljICJZb3UgY2FuJ3QgdXNlIGJvdGggLS1jYWNoZT08cHJvZ3JhbT4gYW5kIC0tbm8tY2NhY2hlIGF0IHRoZSBzYW1lIHRpbWUhIgorICAgICAgICBmaQorICAgICAgICBDQ0FDSEU9CisgICAgZWxpZiBbIC16ICIkT1BUX0NDQUNIRSIgXTsgdGhlbgorICAgICAgICBDQ0FDSEU9JChmaW5kX3Byb2dyYW0gY2NhY2hlKQorICAgICAgICBpZiBbICIkQ0NBQ0hFIiBdOyB0aGVuCisgICAgICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLWNjYWNoZT0kQ0NBQ0hFIgorICAgICAgICBlbHNlCisgICAgICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLW5vLWNjYWNoZSIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIGxvZyAiVXNpbmcgY2NhY2hlOiAkT1BUX0NDQUNIRSIKKyAgICBmaQorCisgICAgIyBDaGVjayBob3N0IHN5c3RlbShzKS4KKyAgICBpZiBbICIkT1BUX0hPU1QiIF07IHRoZW4KKyAgICAgICAgSE9TVF9TWVNURU1TPSQoY29tbWFzX3RvX3NwYWNlcyAiJE9QVF9IT1NUIikKKyAgICBlbHNlCisgICAgICAgIEhPU1RfU1lTVEVNUz0kREVGQVVMVF9IT1NUX1NZU1RFTVMKKyAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1ob3N0PSQoc3BhY2VzX3RvX2NvbW1hcyAiJEhPU1RfU1lTVEVNUyIpICBbZGVmYXVsdF0iCisgICAgZmkKKyAgICBIT1NUX1NZU1RFTVM9JChjb21tYXNfdG9fc3BhY2VzICIkSE9TVF9TWVNURU1TIikKKworICAgICMgQW4gU1NIIHdyYXBwZXIgaXMgdXNlZAorICAgIGlmIFsgIiRPUFRfU1NIX1dSQVBQRVIiIF07IHRoZW4KKyAgICAgICAgQU5EUk9JRF9FTVVMQVRPUl9TU0hfV1JBUFBFUj0kT1BUX1NTSF9XUkFQUEVSCisgICAgZWxpZiBbICIkQU5EUk9JRF9FTVVMQVRPUl9TU0hfV1JBUFBFUiIgXTsgdGhlbgorICAgICAgICBsb2cgIkF1dG8tY29uZmlnOiAtLXNzaC13cmFwcGVyPSRBTkRST0lEX0VNVUxBVE9SX1NTSF9XUkFQUEVSICBbQU5EUk9JRF9FTVVMQVRPUl9TU0hfV1JBUFBFUl0iCisgICAgZmkKKworICAgICMgU3BlY2lhbCBoYW5kbGluZyBmb3IgRGFyd2luIHRhcmdldCBzeXN0ZW1zLgorICAgICMjIEhhbmRsZSByZW1vdGUgZGFyd2luIGJ1aWxkCisgICAgREFSV0lOX1NTSD0KKyAgICBpZiBbICIkT1BUX0RBUldJTl9TU0giIF07IHRoZW4KKyAgICAgICAgREFSV0lOX1NTSD0kT1BUX0RBUldJTl9TU0gKKyAgICBlbGlmIFsgIiRBTkRST0lEX0VNVUxBVE9SX0RBUldJTl9TU0giIF07IHRoZW4KKyAgICAgICAgREFSV0lOX1NTSD0kQU5EUk9JRF9FTVVMQVRPUl9EQVJXSU5fU1NICisgICAgICAgIGxvZyAiQXV0by1jb25maWc6IC0tZGFyd2luLXNzaD0kREFSV0lOX1NTSCAgW0FORFJPSURfRU1VTEFUT1JfREFSV0lOX1NTSF0iCisgICAgZmkKKworICAgIGlmIFsgIiREQVJXSU5fU1NIIiBdOyB0aGVuCisgICAgICAgIEhBU19EQVJXSU49CisgICAgICAgIGZvciBTWVNURU0gaW4gJChjb21tYXNfdG9fc3BhY2VzICIkSE9TVF9TWVNURU1TIik7IGRvCisgICAgICAgICAgICBjYXNlICRTWVNURU0gaW4KKyAgICAgICAgICAgICAgICBkYXJ3aW4tKikKKyAgICAgICAgICAgICAgICAgICAgSEFTX0RBUldJTj10cnVlCisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgIGRvbmUKKyAgICAgICAgaWYgWyAteiAiJEhBU19EQVJXSU4iIF07IHRoZW4KKyAgICAgICAgICAgIHZhcl9hcHBlbmQgSE9TVF9TWVNURU1TICJkYXJ3aW4teDg2XzY0IgorICAgICAgICAgICAgbG9nICJBdXRvLWNvbmZpZzogLS1ob3N0PSQoc3BhY2VzX3RvX2NvbW1hcyAiJEhPU1RfU1lTVEVNUyIpJyAgW2Rhcndpbi1zc2ghXSIKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgIyBEZXRlY3QgYmFkIGhvc3Qgc3lzdGVtIG5hbWVzLCBhbmQgbGlzdCB0aGUgZ29vZCBvbmVzIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgbG9jYWwgQkFEX1NZU1RFTVMgU1lTVEVNCisgICAgZm9yIFNZU1RFTSBpbiAkSE9TVF9TWVNURU1TOyBkbworICAgICAgICBpZiAhIGxpc3RfY29udGFpbnMgIiRfU0hVX1ZBTElEX0hPU1RfU1lTVEVNUyIgIiRTWVNURU0iOyB0aGVuCisgICAgICAgICAgICBCQURfU1lTVEVNUz0iJEJBRF9TWVNURU1TICRTWVNURU0iCisgICAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIFsgIiRCQURfU1lTVEVNUyIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiSW52YWxpZCBob3N0IHN5c3RlbSBuYW1lKHMpOiBbJEJBRF9TWVNURU1TXSwgdXNlIG9uZSBvZjogJF9TSFVfVkFMSURfSE9TVF9TWVNURU1TIgorICAgIGZpCisKKyAgICAjIENvbXB1dGUgdGhlIGxpc3Qgb2YgZGFyd2luIGhvc3Qgc3lzdGVtcy4KKyAgICBfc2h1X2J1aWxkZXJfc2V0dXBfbG9jYWxfc3lzdGVtcyAiJEhPU1RfU1lTVEVNUyIKKworICAgICMgU2F2ZSBvcmlnaW5hbCBwYXRoLgorICAgIE9SSUdJTkFMX1BBVEg9JFBBVEgKK30KKworIyBGaW5kIHRoZSBwYWNrYWdlcyBsaXN0IGZpbGUgaW4gdGhlIHByZWJ1aWx0cyBkaXJlY3RvcnkgYW5kIHBhcnNlIGl0LgorcGFja2FnZV9idWlsZGVyX3BhcnNlX3BhY2thZ2VfbGlzdCAoKSB7CisgICAgbG9jYWwgQVJDSElWRV9ESVIgUEFDS0FHRV9MSVNUCisgICAgaWYgWyAteiAiJFBSRUJVSUxUU19ESVIiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgUFJFQlVJTFRTX0RJUiBkZWZpbml0aW9uLCBkaWQgeW91IGNhbGwgXAorICAgICAgICAgICAgICAgcGFja2FnZV9idWlsZGVyX3Byb2Nlc3Nfb3B0aW9ucz8iCisgICAgZmkKKyAgICBBUkNISVZFX0RJUj0kUFJFQlVJTFRTX0RJUi9hcmNoaXZlCisgICAgaWYgWyAhIC1kICIkQVJDSElWRV9ESVIiIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIk1pc3NpbmcgYXJjaGl2ZSBkaXJlY3RvcnksIHBsZWFzZSBydW4gZG93bmxvYWQtc291cmNlcy5zaDogJEFSQ0hJVkVfRElSIgorICAgIGZpCisgICAgX1NIVV9CVUlMREVSX0FSQ0hJVkVfRElSPSRBUkNISVZFX0RJUgorICAgIFBBQ0tBR0VfTElTVD0kQVJDSElWRV9ESVIvUEFDS0FHRVMuVFhUCisgICAgaWYgWyAhIC1mICIkUEFDS0FHRV9MSVNUIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIHBhY2thZ2UgbGlzdCBmaWxlOiAkUEFDS0FHRV9MSVNUIgorICAgIGZpCisgICAgcGFja2FnZV9saXN0X3BhcnNlX2ZpbGUgIiRQQUNLQUdFX0xJU1QiCit9CisKKyMgUmV0dXJuIHRoZSBjdXJyZW50IHByZWJ1aWx0cyBhcmNoaXZlIGRpcmVjdG9yeS4KKyMgT25lIG5lZWRzIHRvIGNhbGwgcGFja2FnZV9idWlsZGVyX3BhcnNlX3BhY2thZ2VfbGlzdCAoKSBiZWZvcmUKKyMgT3V0OiBwcmVidWlsdHMgYXJjaGl2ZSBkaXJlY3RvcnkgcGF0aC4KK2J1aWxkZXJfYXJjaGl2ZV9kaXIgKCkgeworICAgIHByaW50ZiAlcyAiJF9TSFVfQlVJTERFUl9BUkNISVZFX0RJUiIKK30KKworIyBDaGVjayBhbGwgdGltZXN0YW1wcyBhbmQgYWRqdXN0IEhPU1RfU1lTVEVNUyAvIERBUldJTl9TWVNURU1TIC8KKyMgTE9DQUxfSE9TVF9TWVNURU1TIGFjY29yZGluZ2x5IGZvciBhbGwgdGhlIHRoaW5ncy4KKyMgJDE6IHRvcC1sZXZlbCBpbnN0YWxsIGRpcmVjdG9yeQorIyAkMjogdGltZXN0YW1wIGxhYmVsCitidWlsZGVyX2NoZWNrX2FsbF90aW1lc3RhbXBzICgpIHsKKyAgICBsb2NhbCBORVdfSE9TVF9TWVNURU1TCisgICAgbG9jYWwgU1lTVEVNCisgICAgZm9yIFNZU1RFTSBpbiAkKGNvbW1hc190b19zcGFjZXMgIiRIT1NUX1NZU1RFTVMiKTsgZG8KKyAgICAgICAgaWYgdGltZXN0YW1wX2NoZWNrICIkMSIvJFNZU1RFTSAiJDIiOyB0aGVuCisgICAgICAgICAgICBsb2cgIlskU1lTVEVNXSBBbHJlYWR5IGJ1aWx0LiIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFyX2FwcGVuZCBORVdfSE9TVF9TWVNURU1TICIkU1lTVEVNIgorICAgICAgICBmaQorICAgIGRvbmUKKyAgICBIT1NUX1NZU1RFTVM9JE5FV19IT1NUX1NZU1RFTVMKKyAgICBfc2h1X2J1aWxkZXJfc2V0dXBfbG9jYWxfc3lzdGVtcyAiJEhPU1RfU1lTVEVNUyIKK30KKworIyBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gZW5hYmxlIEMrKzExIGZlYXR1cmVzLiBNdXN0IGhhcHBlbiBiZWZvcmUKKyMgYW55IGJ1aWxkX3ByZXBhcmVfeHh4eHggZnVuY3Rpb24gY2FsbC4KK2J1aWxkZXJfZW5hYmxlX2N4eDExICgpIHsKKyAgICBfU0hVX0JVSUxERVJfTk9fQ1hYMTE9Cit9CisKKyMgQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRpc2FibGUgQysrMTEgZmVhdHVyZXMuIE11c3QgaGFwcGVuIGJlZm9yZQorIyBhbnkgYnVpbGRfcHJlcGFyZV94eHh4IGZ1bmN0aW9uIGNhbGwuCitidWlsZF9kaXNhYmxlX2N4eDExICgpIHsKKyAgICBfU0hVX0JVSUxERVJfTk9fQ1hYMTE9dHJ1ZQorfQorCisjIFJ1biBhIGNvbW1hbmQgb24gdGhlIHJlbW90ZSBEYXJ3aW4gaG9zdCB3aGVuIC0tZGFyd2luLXNzaCBpcyB1c2VkLgorYnVpbGRlcl9yZW1vdGVfZGFyd2luX3J1biAoKSB7CisgICAgcnVuICRBTkRST0lEX0VNVUxBVE9SX1NTSF9XUkFQUEVSIHNzaCAgIiREQVJXSU5fU1NIIiAiJEAiCit9CisKKyMgUnVuIGEgJ3NjcCcgY29tbWFuZCBmcm9tL3RvIHRoZSBybW90ZSBEYXJ3aW4gaG9zdCB3aGVuIC0tZGFyd2luLXNzaCBpcyB1c2VkLgorYnVpbGRlcl9yZW1vdGVfZGFyd2luX3NjcCAoKSB7CisgICAgcnVuICRBTkRST0lEX0VNVUxBVE9SX1NTSF9XUkFQUEVSIHNjcCAiJEAiCit9CisKKyMgUnVuIGEgJ3JzeW5jIC1oYXggLS1kZWxldGUnIGNvbW1hbmQgdG8gcmV0cmlldmUgZmlsZXMgZnJvbSB0aGUgcmVtb3RlCisjIERhcndpbiBtYWNoaW5lIGFuZCBjb3B5IHRoZW0gYmFjayB0byB0aGUgbG9jYWwgb25lLiBUaGlzIHVzZXMgdGhlCisjICctaGF4IC0tZGVsZXRlJyByc3luYyBwYXJhbWV0ZXJzIGJ5IGRlZmF1bHQsCisjICQxKzogcGFyYW1ldGVycyB0byAncnN5bmMnIGNvbW1hbmQuCitidWlsZGVyX3JlbW90ZV9kYXJ3aW5fcnN5bmMgKCkgeworICAgIHJ1biAkQU5EUk9JRF9FTVVMQVRPUl9TU0hfV1JBUFBFUiByc3luYyAiJEAiCit9CisKKyMgJDE6IGRhcndpbiBob3N0IHN5c3RlbSBuYW1lIChlLmcuICRTWVNURU0pCisjICQyOiBsb2NhbCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChlLmcuICRJTlNUQUxMX0RJUikKK2J1aWxkZXJfcmVtb3RlX2Rhcndpbl9yZXRyaWV2ZV9pbnN0YWxsX2RpciAoKSB7CisgICAgZHVtcCAiWyQxXSBSZXRyaWV2aW5nIHJlbW90ZSBkYXJ3aW4gYmluYXJpZXMiCisgICAgbWtkaXIgLXAgIiQyIiB8fCBwYW5pYyAiQ291bGQgbm90IGNyZWF0ZSBmaW5hbCBkaXJlY3Rvcnk6ICQyIgorICAgIHJ1biAkQU5EUk9JRF9FTVVMQVRPUl9TU0hfV1JBUFBFUiByc3luYyAtaGF6IC0tZGVsZXRlIFwKKyAgICAgICAgJERBUldJTl9TU0g6JERBUldJTl9SRU1PVEVfRElSL2luc3RhbGwtcHJlZml4LyQxICIkMiIKK30KKworIyBQcmVwYXJlIGZvciBhIHJlbW90ZSBkYXJ3aW4gYnVpbGQuIFRoaXMgdGFrZXMgYXMgYSBwYXJhbWV0ZXIgdGhlCisjIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBlLi5nICcvdG1wL2Zvby9iYXIvJy4KKyMgVGhpcyBmdW5jdGlvbiBwb3B1bGF0ZXMgdGhlIGRpcmVjdG9yeSB3aXRoIHNvbWUgc2NyaXB0cyBhbmQKKyMgcHJlYnVpbHQgdG9vbGNoYWluIGJpbmFyaWVzIGlmIG5lY2Vzc2FyeSwgdGhlbiBkZWZpbmVzIHRoZQorIyBmb2xsb3dpbmcgdmFyaWFibGVzOgorIyAgICBEQVJXSU5fUEtHX0RJUjogdGVtcG9yYXJ5IHBhY2thZ2UgZGlyZWN0b3J5IChlLmcuICcvdG1wL2Zvby9iYXInKQorIyAgICBEQVJXSU5fUEtHX05BTUU6IHRlbXBvcmFyeSBwYWNrYWdlIG5hbWUgKGUuZy4gJ2JhcicpCisjICAgIERBUldJTl9SRU1PVEVfRElSOiByZW1vdGUgYnVpbGQgZGlyZWN0b3J5IHRvIHVzZS4KKyMgICAgREFSV0lOX0JVSUxEX0ZMQUdTOiBjb21tb24gYnVpbGQgZmxhZ3MgdG8gdXNlIHdpdGggYnVpbGQuc2gKKyMKKyMgVGhlIGNhbGxlciBzaG91bGQgdGhlbiBhZGQgYW55IGFwcHJvcHJpYXRlIHNvdXJjZXMgb3IgYmluYXJpZXMsIHRoZW4KKyMgY2FsbCB0aGUgZnVuY3Rpb24gYnVpbGRlcl9ydW5fcmVtb3RlX2J1aWxkIGRlY2xhcmVkIGJlbG93IHRvIGFjdHVhbGx5CisjIHBlcmZvcm0gdGhlIHJlbW90ZSBidWlsZCB0aHJvdWdoIFNTSAorIworIyBOT1RFOiBPbmx5IGNhbGwgdGhpcyB3aGVuIC0tZGFyd2luLXNzaCBvciBlcXVpdmFsZW50IGlzIHVzZWQuCisjCisjICQxOiBQYWNrYWdlIGRpcmVjdG9yeSAoZS5nLiAnL3RtcC9mb28vYmFyJykKKyMgJDI6IE9wdGlvbmFsIGFyY2hpdmUgZGlyZWN0b3J5LgorIworYnVpbGRlcl9wcmVwYXJlX3JlbW90ZV9kYXJ3aW5fYnVpbGQgKCkgeworICAgIGxvY2FsIFBLR19ESVI9JHsxJSUvfQorICAgIGxvY2FsIFBLR19OQU1FPSQoYmFzZW5hbWUgIiRQS0dfRElSIikKKyAgICBsb2NhbCBBUkNISVZFX0RJUj0iJHsyOi0kKGJ1aWxkZXJfYXJjaGl2ZV9kaXIpfSIKKyAgICBEQVJXSU5fUEtHX05BTUU9JFBLR19OQU1FCisgICAgREFSV0lOX1BLR19ESVI9IiRQS0dfRElSIgorICAgIERBUldJTl9SRU1PVEVfRElSPS90bXAvJFBLR19OQU1FCisgICAgbG9jYWwgVE9PTENIQUlOX1NVQkRJUj0kKGFvc3BfcHJlYnVpbHRfdG9vbGNoYWluX3N1YmRpcl9mb3IgZGFyd2luKQorCisgICAgaWYgWyAteiAiJERBUldJTl9TU0giIF07IHRoZW4KKyAgICAgICAgIyBTYW5pdHkgY2hlY2sKKyAgICAgICAgcGFuaWMgImJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkOiBObyBEQVJXSU5fU1NIIGRlZmluZWQhIgorICAgIGZpCisKKyAgICBEQVJXSU5fU1lTVEVNUz0kKGNvbW1hc190b19zcGFjZXMgIiREQVJXSU5fU1lTVEVNUyIpCisKKyAgICBsb2cgIlByZXBhcmluZyByZW1vdGUgZGFyd2luIGJ1aWxkLiIKKyAgICBydW4gbWtkaXIgLXAgIiRQS0dfRElSIiAmJiBydW4gcm0gLXJmICIkUEtHX0RJUiIvKgorICAgIHJ1biBta2RpciAtcCAiJFBLR19ESVIvYW9zcC9wcmVidWlsdHMvZ2NjIgorICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9ESVIiLyRUT09MQ0hBSU5fU1VCRElSIFwKKyAgICAgICAgICAgICIkUEtHX0RJUiIvYW9zcC8kVE9PTENIQUlOX1NVQkRJUgorICAgIGNvcHlfZGlyZWN0b3J5ICIkKHByb2dyYW1fZGlyZWN0b3J5KSIgIiRQS0dfRElSL3NjcmlwdHMiCisKKyAgICBsb2NhbCBCUkVBS1BBRF9TVUJESVIKKyAgICBmb3IgREFSV0lOX1NZU1RFTSBpbiAkREFSV0lOX1NZU1RFTVM7IGRvCisgICAgICAgIEJSRUFLUEFEX1NVQkRJUj0kKGFvc3BfcHJlYnVpbHRfYnJlYWtwYWRfc3ViZGlyX2ZvciAkREFSV0lOX1NZU1RFTSkKKyAgICAgICAgcnVuIG1rZGlyIC1wICIkUEtHX0RJUi9hb3NwLyRCUkVBS1BBRF9TVUJESVIiCisgICAgICAgIGNvcHlfZGlyZWN0b3J5ICIkQU9TUF9ESVIiLyRCUkVBS1BBRF9TVUJESVIgXAorICAgICAgICAgICAgIiRQS0dfRElSIi9hb3NwLyRCUkVBS1BBRF9TVUJESVIKKyAgICBkb25lCisKKyAgICBEQVJXSU5fQlVJTERfRkxBR1M9Ii0tdmVyYm9zaXR5PSQoZ2V0X3ZlcmJvc2l0eSkiCisKKyAgICBpZiBbICIkT1BUX05VTV9KT0JTIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgREFSV0lOX0JVSUxEX0ZMQUdTICItaiRPUFRfTlVNX0pPQlMiCisgICAgZmkKKyAgICBpZiBbICIkT1BUX05PX0NDQUNIRSIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIERBUldJTl9CVUlMRF9GTEFHUyAiLS1uby1jY2FjaGUiCisgICAgZmkKKworICAgIGlmIFsgIiRBUkNISVZFX0RJUiIgXTsgdGhlbgorICAgICAgICBjb3B5X2RpcmVjdG9yeSAiJEFSQ0hJVkVfRElSIiAiJERBUldJTl9QS0dfRElSIi9hcmNoaXZlCisgICAgZmkKKworICAgIERBUldJTl9SRU1PVEVfRElSPS90bXAvJERBUldJTl9QS0dfTkFNRQorCit9CisKKyMgQ2FsbCB0aGlzIGFmdGVyIGJ1aWxkZXJfcHJlcGFyZV9yZW1vdGVfZGFyd2luX2J1aWxkIGFuZCBwb3B1bGF0aW5nCisjICREQVJXSU5fUEtHX0RJUiB3aXRoIGJ1aWxkLnNoIGFuZCBhbnkgb3RoZXIgcmVxdWlyZWQgZmlsZXMgdG8gcnVuCisjIGEgcmVtb3RlIGRhcndpbiBidWlsZCB0aHJvdWdoIFNTSC4KKyMKKyMgJDE6IE9wdGlvbmFsIGJ1aWxkIHNjcmlwdCBwYXRoLiBJZiBlbXB0eSwgYSAnc3RhbmRhcmQnIGJ1aWxkLnNoIHNjcmlwdAorIyAgICAgaXMgZ2VuZXJhdGVkIGJ5IHRoaXMgZnVuY3Rpb24uIE90aGVyd2lzZSwgaXQgaXMgY29waWVkIHVuZGVyCisjICAgICAgJERBUldJTl9QS0dfRElSLyBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLgorYnVpbGRlcl9ydW5fcmVtb3RlX2Rhcndpbl9idWlsZCAoKSB7CisgICAgbG9jYWwgQlVJTERfU0g9IiQxIgorICAgIGlmIFsgLXogIiRCVUlMRF9TSCIgXTsgdGhlbgorICAgICAgICBCVUlMRF9TSD0iJERBUldJTl9QS0dfRElSIi9idWlsZC5zaAorCisgICAgICAgICMgR2VuZXJhdGUgYSBzY3JpcHQgdG8gcmVidWlsZCBhbGwgYmluYXJpZXMgZnJvbSBzb3VyY2VzLgorICAgICAgICAjIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSAnLWwnIGZsYWcgaXMgaW1wb3J0YW50IHRvIGVuc3VyZQorICAgICAgICAjIHRoYXQgdGhpcyBpcyBydW4gdW5kZXIgYSBsb2dpbiBzaGVsbC4gVGhpcyBlbnN1cmVzIHRoYXQKKyAgICAgICAgIyB+Ly5iYXNoX3Byb2ZpbGUgaXMgc291cmNlZCBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0LCB3aGljaAorICAgICAgICAjIHB1dHMgTWFjUG9ydHMnIC9vcHQvbG9jYWwvYmluIGluIHRoZSBQQVRIIHByb3Blcmx5LgorICAgICAgICAjCisgICAgICAgICMgSWYgbm90LCB0aGUgYnVpbGQgaXMgbGlrZWx5IHRvIGZhaWwgd2l0aCBhIGNyeXB0aWMgZXJyb3IgbWVzc2FnZQorICAgICAgICAjIGxpa2UgInJlYWRsaW5rOiBpbGxlZ2FsIG9wdGlvbiAtLSBmIgorICAgICAgICBjYXQgPiAkQlVJTERfU0ggPDxFT0YKKyMhL2Jpbi9iYXNoIC1sCitQUk9HRElSPVwkKGRpcm5hbWUgXCQwKQorXCRQUk9HRElSL3NjcmlwdHMvJChwcm9ncmFtX25hbWUpIFxcCisgICAgLS1idWlsZC1kaXI9JERBUldJTl9SRU1PVEVfRElSL2J1aWxkIFxcCisgICAgLS1ob3N0PSQoc3BhY2VzX3RvX2NvbW1hcyAiJERBUldJTl9TWVNURU1TIikgXFwKKyAgICAtLWluc3RhbGwtZGlyPSREQVJXSU5fUkVNT1RFX0RJUi9pbnN0YWxsLXByZWZpeCBcXAorICAgIC0tcHJlYnVpbHRzLWRpcj0kREFSV0lOX1JFTU9URV9ESVIgXFwKKyAgICAtLWFvc3AtZGlyPSREQVJXSU5fUkVNT1RFX0RJUi9hb3NwIFxcCisgICAgJERBUldJTl9CVUlMRF9GTEFHUworRU9GCisgICAgZWxzZSAgIyBCVUlMRF9TSCBub3QgZW1wdHkuCisgICAgICAgIGlmIFsgIiR7QlVJTERfU0gjJERBUldJTl9QS0dfRElSfSIgPSAiJEJVSUxEX1NIIiBdOyB0aGVuCisgICAgICAgICAgICAjIFRoZSBzY3JpcHQgaXMgbm90IHVuZGVyICREQVJXSU5fUEtHX0RJUiBzbyBjb3B5IGl0IHRoZXJlLgorICAgICAgICAgICAgcnVuIGNwICIkQlVJTERfU0giICIkREFSV0lOX1BLR19ESVIiL2J1aWxkLnNoIHx8CisgICAgICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBjb3B5IGJ1aWxkIHNjcmlwdCB0byAkREFSV0lOX1BLR19ESVIvOiAkQlVJTERfU0giCisgICAgICAgICAgICBCVUlMRF9TSD0kREFSV0lOX1BLR19ESVIvYnVpbGQuc2gKKyAgICAgICAgZmkKKyAgICBmaQorCisgICAgY2htb2QgYSt4ICIkQlVJTERfU0giCisKKyAgICBsb2cgIkVyYXNpbmcgcHJldmlvdXJzIHJlbW90ZSBidWlsZCBkaXJlY3RvcnkuIgorICAgIGJ1aWxkZXJfcmVtb3RlX2Rhcndpbl9ydW4gcm0gLXJmICREQVJXSU5fUkVNT1RFX0RJUgorCisgICAgbG9nICJDb3B5aW5nIGZpbGVzIHRvIHJlbW90ZSBkYXJ3aW4gaG9zdC4iCisgICAgKHRhciBjZiAtIC1DICIkREFSV0lOX1BLR19ESVIiLy4uICIkREFSV0lOX1BLR19OQU1FIikgfAorICAgICAgICAoYnVpbGRlcl9yZW1vdGVfZGFyd2luX3J1biB0YXIgeGYgLSAtQyAvdG1wKSB8fAorICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBzZW5kIGZpbGVzIHRvIHJlbW90ZSBkYXJ3aW4gaG9zdCIKKworICAgIHJtIC1yZiAiJERBUldJTl9QS0dfRElSIgorCisgICAgbG9nICJQZXJmb3JtaW5nIHJlbW90ZSBkYXJ3aW4gYnVpbGQuIgorICAgIGJ1aWxkZXJfcmVtb3RlX2Rhcndpbl9ydW4gJERBUldJTl9SRU1PVEVfRElSL2J1aWxkLnNoCit9CisKKyMgR2VuZXJhdGUgYSBzbWFsbCBzaGVsbCBzY3JpcHQgdGhhdCBjYW4gYmUgc291cmNlZCB0byBwcmVwYXJlIHRoZQorIyBidWlsZCBmb3IgYSBnaXZlbiBob3N0IHN5c3RlbS4KKyMgJDE6IEhvc3Qgc3lzdGVtIG5hbWUgKGUuZy4gbGludXgteDg2XzY0KQorIyAkMjogQU9TUCBzb3VyY2UgZGlyZWN0b3J5LgorIyAkMzogT3B0aW9uYWwgbGlzdCBvZiBwcmVmaXggZGlyZWN0b3JpZXMgKHNwYWNlLXNlcGFyYXRlZCkKK2J1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCAoKSB7CisgICAgX3NodV9idWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QgIiQxIiAiJDIiICJhdXRvIiAiJDMiCit9CisKKyMgU2FtZSBhcyBidWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QsIGJ1dCBlbnN1cmVzIHRoYXQgdGhlIHRvb2xjaGFpbiB3cmFwcGVyCisjIGRvZXNuJ3QgdXNlIGEgaG9zdC1zcGVjaWZpYyBiaW5wcmVmaXgsIGkuZS4gaXQgd2lsbCBiZSBuYW1lZCAnZ2NjJyBpbnN0ZWFkCisjIG9mICd4ODZfNjQtbGludXgtZ2NjJy4gVGhpcyBpcyByZXF1aXJlZCB0byBidWlsZCBjZXJ0YWluIG1vZHVsZXMuCisjICQxOiBIb3N0IHN5c3RlbSBuYW1lCisjICQyOiBBT1NQIHNvdXJjZSBkaXJlY3RvcnkuCisjICQzOiBPcHRpb25hbCBsaXN0IG9mIHByZWZpeCBkaXJlY3RvcmllcyAoc3BhY2Utc2VwYXJhdGVkKQorYnVpbGRlcl9wcmVwYXJlX2Zvcl9ob3N0X25vX2JpbnByZWZpeCAoKSB7CisgICAgX3NodV9idWlsZGVyX3ByZXBhcmVfZm9yX2hvc3QgIiQxIiAiJDIiICJub25lIiAiJDMiCit9CisKKworIyBHZW5lcmF0ZSBhIHNtYWxsIHNoZWxsIHNjcmlwdCB0aGF0IGNhbiBiZSBzb3VyY2VkIHRvIHByZXBhcmUgdGhlCisjIGJ1aWxkIGZvciBhIGdpdmVuIGhvc3Qgc3lzdGVtLgorIyAkMTogSG9zdCBzeXN0ZW0gbmFtZSAoZS5nLiBsaW51eC14ODZfNjQpCisjICQyOiBBT1NQIHNvdXJjZSBkaXJlY3RvcnkuCisjICQzOiBCaW5wcmVmaXgsIHNwZWNpYWwgdmFsdWVzICdhdXRvJyBhbmQgJ25vbmUnIGFyZSByZWNvZ25pemVkLgorIyAnYXV0bycgbWVhbnMgdGhlIGJpbnByZWZpeCB3aWxsIGRlcGVuZCBvbiAkMSwgYW5kICdub25lJyB0aGF0IG5vCisjIGJpbnByZWZpeCBzaG91bGQgYmUgdXNlZC4KKyMgJDQ6IE9wdGlvbmFsIGxpc3Qgb2YgcHJlZml4IGRpcmVjdG9yaWVzIChzcGFjZS1zZXBhcmF0ZWQpCitfc2h1X2J1aWxkZXJfcHJlcGFyZV9mb3JfaG9zdCAoKSB7CisgICAgX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVD0kMQorCisgICAgX1NIVV9CVUlMREVSX0NVUlJFTlRfVEVYVD0iWyRfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUXSIKKworICAgIF9TSFVfQlVJTERFUl9DT05GSUdVUkVfRkxBR1M9CisgICAgX1NIVV9CVUlMREVSX0hPU1RfRVhFX0VYVEVOU0lPTj0KKyAgICBjYXNlICRfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUIGluCisgICAgICAgIHdpbmRvd3MtKikKKyAgICAgICAgICAgIF9TSFVfQlVJTERFUl9IT1NUX0VYRV9FWFRFTlNJT049LmV4ZQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworCisgICAgY2FzZSAkX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVCBpbgorICAgICAgICBsaW51eC14ODZfNjQpCisgICAgICAgICAgICBfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUPXg4Nl82NC1saW51eAorICAgICAgICAgICAgOzsKKyAgICAgICAgbGludXgteDg2KQorICAgICAgICAgICAgX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVD1pNjg2LWxpbnV4CisgICAgICAgICAgICA7OworICAgICAgICB3aW5kb3dzLXg4NikKKyAgICAgICAgICAgIF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1Q9aTY4Ni13NjQtbWluZ3czMgorICAgICAgICAgICAgOzsKKyAgICAgICAgd2luZG93cy14ODZfNjQpCisgICAgICAgICAgICBfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUPXg4Nl82NC13NjQtbWluZ3czMgorICAgICAgICAgICAgOzsKKyAgICAgICAgZGFyd2luLSopCisgICAgICAgICAgICAjIFVzZSBob3N0IGNvbXBpbGVyLgorICAgICAgICAgICAgX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVD0KKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBwYW5pYyAiSG9zdCBzeXN0ZW0gJyRDVVJSRU5UX0hPU1QnIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBzY3JpcHQhIgorICAgICAgICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiBbICIkX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVCIgXTsgdGhlbgorICAgICAgICBfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUX0ZMQUc9Ii0taG9zdD0kX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVCIKKyAgICAgICAgX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVF9QUkVGSVg9JHtfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUfS0KKyAgICBlbHNlCisgICAgICAgIF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfRkxBRz0KKyAgICAgICAgX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVF9QUkVGSVg9CisgICAgZmkKKworICAgIGNhc2UgJDMgaW4KKyAgICAgICAgYXV0bykgIyBOb3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgOzsKKyAgICAgICAgbm9uZSkKKyAgICAgICAgICAgIF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfUFJFRklYPQorICAgICAgICAgICAgOzsKKyAgICAgICAgKikKKyAgICAgICAgICAgIF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfUFJFRklYPSQzCisgICAgICAgICAgICA7OworICAgIGVzYWMKKyAgICBsb2cgIiRfU0hVX0JVSUxERVJfQ1VSUkVOVF9URVhUIFVzaW5nIGJpbnByZWZpeCBbJF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfUFJFRklYXSIKKyAgICBQQVRIPSRPUklHSU5BTF9QQVRICisKKyAgICBfU0hVX0JVSUxERVJfQlVJTERfRElSPSRURU1QX0RJUi9idWlsZC0kX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVAorICAgIGxvZyAiJF9TSFVfQlVJTERFUl9DVVJSRU5UX1RFWFQgQ3JlYXRpbmcgYnVpbGQgZGlyZWN0b3J5OiAkX1NIVV9CVUlMREVSX0JVSUxEX0RJUiIKKyAgICBydW4gbWtkaXIgLXAgIiRfU0hVX0JVSUxERVJfQlVJTERfRElSIgorCisgICAgX1NIVV9CVUlMREVSX1NSQ19ESVI9JFRFTVBfRElSL3NyYworCisgICAgX1NIVV9CVUlMREVSX0VOVl9TSD0kX1NIVV9CVUlMREVSX0JVSUxEX0RJUi9lbnYuc2gKKworICAgIF9TSFVfQlVJTERFUl9QUkVGSVg9JFRFTVBfRElSL2luc3RhbGwtJF9TSFVfQlVJTERFUl9DVVJSRU5UX0hPU1QKKyAgICBfU0hVX0JVSUxERVJfVE9PTENIQUlOX1BSRUZJWD0kX1NIVV9CVUlMREVSX1BSRUZJWAorICAgIGxvY2FsIF9QUkVGSVgKKyAgICBmb3IgX1BSRUZJWCBpbiAkNDsgZG8KKyAgICAgICAgdmFyX2FwcGVuZCBfU0hVX0JVSUxERVJfVE9PTENIQUlOX1BSRUZJWCAiJF9QUkVGSVgiCisgICAgZG9uZQorICAgIGxvZyAiJF9TSFVfQlVJTERFUl9DVVJSRU5UX1RFWFQgVXNpbmcgdG9vbGNoYWluIGJ1aWxkIHByZWZpeDogJF9TSFVfQlVJTERFUl9UT09MQ0hBSU5fUFJFRklYIgorCisgICAgX1NIVV9CVUlMREVSX1BLR19DT05GSUdfUEFUSD0kX1NIVV9CVUlMREVSX1BSRUZJWC9zaGFyZS9wa2djb25maWc6JFBLR19DT05GSUdfUEFUSAorCisgICAgVE9PTENIQUlOX1dSQVBQRVJfRElSPSRfU0hVX0JVSUxERVJfQlVJTERfRElSL3Rvb2xjaGFpbi13cmFwcGVyCisKKyAgICBjYXNlICRfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUIGluCisgICAgICAgIGxpbnV4LSopCisgICAgICAgICAgICBfU0hVX0JVSUxERVJfUEtHX0NPTkZJR19QQVRIPSRUT09MQ0hBSU5fV1JBUFBFUl9ESVIvcGtnY29uZmlnOiRfU0hVX0JVSUxERVJfUEtHX0NPTkZJR19QQVRICisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgIGNhdCA+ICIkX1NIVV9CVUlMREVSX0VOVl9TSCIgPDxFT0YKKyMgQXV0by1nZW5lcmF0ZWQgLSBETyBOT1QgRURJVCEKKyMgU291cmNlIHRoaXMgc2hlbGwgc2NyaXB0IHRvIHByZXBhcmUgdGhlIGJ1aWxkIGZvciAkQ1VSUkVOVF9IT1NUIHN5c3RlbXMuCitfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUPSIkX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVCIKK19TSFVfQlVJTERFUl9DVVJSRU5UX1RFWFQ9IiRfU0hVX0JVSUxERVJfQ1VSUkVOVF9URVhUIgorX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVD0kX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVAorX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVF9QUkVGSVg9JF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfUFJFRklYCitfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUX0ZMQUc9JF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfRkxBRworX1NIVV9CVUlMREVSX0JVSUxEX0RJUj0iJF9TSFVfQlVJTERFUl9CVUlMRF9ESVIiCitfU0hVX0JVSUxERVJfUFJFRklYPSIkX1NIVV9CVUlMREVSX1BSRUZJWCIKK19TSFVfQlVJTERFUl9QS0dfQ09ORklHX1BBVEg9IiRfU0hVX0JVSUxERVJfUEtHX0NPTkZJR19QQVRIIgorX1NIVV9CVUlMREVSX0NPTkZJR1VSRV9GTEFHUz0iJF9TSFVfQlVJTERFUl9DT05GSUdVUkVfRkxBR1MiCitQQVRIPSIkUEFUSCIKK2V4cG9ydCBQQVRIIFwKKyAgICBfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUIFwKKyAgICBfU0hVX0JVSUxERVJfQ1VSUkVOVF9URVhUIFwKKyAgICBfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUIFwKKyAgICBfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUX1BSRUZJWCBcCisgICAgX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVF9GTEFHIFwKKyAgICBfU0hVX0JVSUxERVJfQlVJTERfRElSIFwKKyAgICBfU0hVX0JVSUxERVJfU1JDX0RJUiBcCisgICAgX1NIVV9CVUlMREVSX1BSRUZJWCBcCisgICAgX1NIVV9CVUlMREVSX1BLR19DT05GSUdfUEFUSCBcCisgICAgX1NIVV9CVUlMREVSX0NPTkZJR1VSRV9GTEFHUworRU9GCisgICAgVE9PTENIQUlOX1dSQVBQRVJfRElSPSRfU0hVX0JVSUxERVJfQlVJTERfRElSL3Rvb2xjaGFpbi13cmFwcGVyCisgICAgbG9nICIkX1NIVV9CVUlMREVSX0NVUlJFTlRfVEVYVCBHZW5lcmF0aW5nICRfU0hVX0JVSUxERVJfR05VX0NPTkZJR19IT1NUIHdyYXBwZXIgdG9vbGNoYWluIGluICRUT09MQ0hBSU5fV1JBUFBFUl9ESVIiCisgICAgbG9jYWwgRVhUUkFfRkxBR1MKKyAgICBpZiBbICIkQ0NBQ0hFIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgRVhUUkFfRkxBR1MgIi0tY2NhY2hlPSRDQ0FDSEUiCisgICAgZWxzZQorICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICItLW5vLWNjYWNoZSIKKyAgICBmaQorICAgIGZvciBfUFJFRklYIGluICRfU0hVX0JVSUxERVJfVE9PTENIQUlOX1BSRUZJWDsgZG8KKyAgICAgICAgdmFyX2FwcGVuZCBFWFRSQV9GTEFHUyAiLS1wcmVmaXg9JF9QUkVGSVgiCisgICAgZG9uZQorICAgIGlmIFsgISAiJF9TSFVfQlVJTERFUl9OT19DWFgxMSIgXTsgdGhlbgorICAgICAgICB2YXJfYXBwZW5kIEVYVFJBX0ZMQUdTICItLWN4eDExIgorICAgIGZpCisgICAgcnVuICQocHJvZ3JhbV9kaXJlY3RvcnkpL2dlbi1hbmRyb2lkLXNkay10b29sY2hhaW4uc2ggXAorICAgICAgICAgICAgLS1hb3NwLWRpcj0iJDIiIFwKKyAgICAgICAgICAgIC0taG9zdD0kX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVCBcCisgICAgICAgICAgICAtLWJpbnByZWZpeD0ke19TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfUFJFRklYOi0tfSBcCisgICAgICAgICAgICAkRVhUUkFfRkxBR1MgXAorICAgICAgICAgICAgJFRPT0xDSEFJTl9XUkFQUEVSX0RJUiB8fAorICAgICAgICAgICAgcGFuaWMgIkNhbm5vdCBnZW5lcmF0ZSB0b29sY2hhaW4gd3JhcHBlciEiCisgICAgY2F0ID4+ICIkX1NIVV9CVUlMREVSX0VOVl9TSCIgPDxFT0YKK1BBVEg9JFRPT0xDSEFJTl9XUkFQUEVSX0RJUjpcJFBBVEgKK2V4cG9ydCBQQVRICitFT0YKKyAgICBQQVRIPSRUT09MQ0hBSU5fV1JBUFBFUl9ESVI6JFBBVEgKKyAgICBsb2cgIiRfU0hVX0JVSUxERVJfQ1VSUkVOVF9URVhUIFBhdGg6ICQoZWNobyBcIiRQQVRIXCIgfCB0ciAnICcgJ1xuJykiCisKKyAgICAjIFJlYWQgdGhlIHNvdXJjZSBzY3JpcHQuCisgICAgLiAiJF9TSFVfQlVJTERFUl9FTlZfU0giCit9CisKK2J1aWxkZXJfdGV4dCAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX0NVUlJFTlRfVEVYVCIKK30KKworYnVpbGRlcl9ob3N0ICgpIHsKKyAgICBwcmludGYgJXMgIiRfU0hVX0JVSUxERVJfQ1VSUkVOVF9IT1NUIgorfQorCitidWlsZGVyX2hvc3RfZXhlX2V4dGVuc2lvbiAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX0hPU1RfRVhFX0VYVEVOU0lPTiIKK30KKworYnVpbGRlcl9idWlsZF9kaXIgKCkgeworICAgIHByaW50ZiAlcyAiJF9TSFVfQlVJTERFUl9CVUlMRF9ESVIiCit9CisKK2J1aWxkZXJfc3JjX2RpciAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX1NSQ19ESVIiCit9CisKK2J1aWxkZXJfaW5zdGFsbF9wcmVmaXggKCkgeworICAgIHByaW50ZiAlcyAiJF9TSFVfQlVJTERFUl9QUkVGSVgiCit9CisKK2J1aWxkZXJfZ251X2NvbmZpZyAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX0dOVV9DT05GSUciCit9CisKK2J1aWxkZXJfZ251X2NvbmZpZ19ob3N0X3ByZWZpeCAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX0dOVV9DT05GSUdfSE9TVF9QUkVGSVgiCit9CisKK2J1aWxkZXJfZ251X2NvbmZpZ19ob3N0X2ZsYWcgKCkgeworICAgIHByaW50ZiAlcyAiJF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfRkxBRyIKK30KKworYnVpbGRlcl9ob3N0X2V4dCAoKSB7CisgICAgcHJpbnRmICVzICIkX1NIVV9CVUlMREVSX0hPU1RfRVhFX0VYVEVOU0lPTiIKK30KKworYnVpbGRlcl9yZXNldF9jb25maWd1cmVfZmxhZ3MgKCkgeworICAgIF9TSFVfQlVJTERFUl9DT05GSUdVUkVfRkxBR1M9IiQqIgorfQorCitidWlsZGVyX2FkZF9jb25maWd1cmVfZmxhZ3MgKCkgeworICAgIHZhcl9hcHBlbmQgX1NIVV9CVUlMREVSX0NPTkZJR1VSRV9GTEFHUyAiJCoiCit9CisKKyMgQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGRpc2FibGUgdmVyYm9zZSBvdXRwdXQgZHVyaW5nIHRoZSAnbWFrZSBpbnN0YWxsJyBwYXNzCisjIG9mIGJ1aWxkZXJfYnVpbGRfYXV0b3Rvb2xzX3BhY2thZ2UoKS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNlcnRhaW4gcGFja2FnZXMKKyMgd2l0aCBicm9rZW4gTWFrZWZpbGVzIChlLmcuIGUyZnNwcm9ncyB3aGVuIGJ1aWx0IG9uIERhcndpbikuCitfU0hVX0JVSUxERVJfRElTQUJMRV9WRVJCT1NFX0lOU1RBTEw9CitidWlsZGVyX2Rpc2FibGVfdmVyYm9zZV9pbnN0YWxsICgpIHsKKyAgICBfU0hVX0JVSUxERVJfRElTQUJMRV9WRVJCT1NFX0lOU1RBTEw9dHJ1ZQorfQorCisjIENhbGwgdGhpcyBmdW5jdGlvbiB0byBkaXNhYmxlIHBhcmFsbGVsIGpvYnMgZHVyaW5nIHRoZSAnbWFrZSBpbnN0YWxsJyBwYXNzCisjIG9mIGJ1aWxkZXJfYnVpbGRfYXV0b3Rvb2xzX3BhY2thZ2UoKS4gVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGNlcnRhaW4gcGFja2FnZXMKKyMgd2l0aCBicm9rZW4gTWFrZWZpbGVzLgorX1NIVV9CVUlMREVSX0RJU0FCTEVfUEFSQUxMRUxfSU5TVEFMTD0KK2J1aWxkZXJfZGlzYWJsZV9wYXJhbGxlbF9pbnN0YWxsICgpIHsKKyAgICBfU0hVX0JVSUxERVJfRElTQUJMRV9QQVJBTExFTF9JTlNUQUxMPXRydWUKK30KKworIyBVbnBhY2sgcGFja2FnZSBzb3VyY2VzIGlmIG5lZWRlZCBpbnRvICQoYnVpbGRlcl9zcmNfZGlyKS4KKyMgJDE6IFBhY2thZ2UgYmFzZW5hbWUuCisjICQyOiBPcHRpb25hbCBhcmNoaXZlIHNvdXJjZSBkaXJlY3RvcnkuCitidWlsZGVyX3VucGFja19wYWNrYWdlX3NvdXJjZSAoKSB7CisgICAgbG9jYWwgUEtHX05BTUUgQVJDSElWRV9ESVIgVElNRVNUQU1QIFNSQ19ESVIKKyAgICBQS0dfTkFNRT0kKHBhY2thZ2VfbGlzdF9nZXRfdW5wYWNrX3NyY19kaXIgJDEpCisgICAgQVJDSElWRV9ESVI9JHsyOi0kKGJ1aWxkZXJfYXJjaGl2ZV9kaXIpfQorICAgIFNSQ19ESVI9JChidWlsZGVyX3NyY19kaXIpCisgICAgVElNRVNUQU1QPSRTUkNfRElSL3RpbWVzdGFtcC0kUEtHX05BTUUKKyAgICBpZiBbICEgLWYgIiRUSU1FU1RBTVAiIC1vICIkT1BUX0ZPUkNFIiBdOyB0aGVuCisgICAgICAgIHBhY2thZ2VfbGlzdF91bnBhY2tfYW5kX3BhdGNoICIkMSIgIiRBUkNISVZFX0RJUiIgIiRTUkNfRElSIgorICAgICAgICB0b3VjaCAkVElNRVNUQU1QCisgICAgZmkKK30KKworIyBCdWlsZCBhIGdpdmVuIGF1dG90b29scyBiYXNlZCBwYWNrYWdlIGFuZCBydW4gY3VzdG9taXplZCBpbnN0YWxsIGNvbW1hbmRzCisjCisjICQxOiBQYWNrYWdlIGJhc2VuYW1lCisjICQyOiBNYWtlIGNvbW1hbmRzLCBlLmcuIGluc3RhbGwKKyMgJDMrOiBBZGRpdGlvbmFsIGNvbmZpZ3VyZSBvcHRpb25zLgorYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZV9mdWxsX2luc3RhbGwgKCkgeworICAgIGxvY2FsIFBLR19OQU1FPSQocGFja2FnZV9saXN0X2dldF9zcmNfZGlyICQxKQorICAgIGxvY2FsIElOU1RBTExfQ09NTUFORFM9IiQyIgorICAgIGxvY2FsIFBLR19TUkNfRElSPSQoYnVpbGRlcl9zcmNfZGlyKS8kUEtHX05BTUUKKyAgICBsb2NhbCBQS0dfQlVJTERfRElSPSQoYnVpbGRlcl9idWlsZF9kaXIpLyRQS0dfTkFNRQorICAgIGxvY2FsIFBLR19USU1FU1RBTVA9JHtQS0dfQlVJTERfRElSfS10aW1lc3RhbXAKKworICAgIHNoaWZ0OyBzaGlmdDsKKworICAgIGlmIFsgLWYgIiRQS0dfVElNRVNUQU1QIiAtYSAteiAiJE9QVF9GT1JDRSIgXTsgdGhlbgorICAgICAgICAjIFJldHVybiBlYXJseSBpZiB0aGUgcGFja2FnZSB3YXMgYWxyZWFkeSBidWlsdC4KKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorCisgICAgY2FzZSAkX1NIVV9CVUlMREVSX0NVUlJFTlRfSE9TVCBpbgorICAgICAgICBkYXJ3aW4qKQorICAgICAgICAgICAgIyBSZXF1aXJlZCBmb3IgcHJvcGVyIEF1dG90b29scyBidWlsZHMgb24gRGFyd2luCisgICAgICAgICAgICBidWlsZGVyX2Rpc2FibGVfdmVyYm9zZV9pbnN0YWxsCisgICAgICAgICAgICA7OworICAgIGVzYWMKKworICAgIGxvY2FsIFBLR19GVUxMTkFNRT0iJChiYXNlbmFtZSAkUEtHX05BTUUpIgorICAgIGR1bXAgIiQoYnVpbGRlcl90ZXh0KSBCdWlsZGluZyAkUEtHX0ZVTExOQU1FIgorCisgICAgbG9jYWwgSU5TVEFMTF9GTEFHUworICAgIGlmIFsgLXogIiRfU0hVX0JVSUxERVJfRElTQUJMRV9QQVJBTExFTF9JTlNUQUxMIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgSU5TVEFMTF9GTEFHUyAiLWokTlVNX0pPQlMiCisgICAgZmkKKyAgICBpZiBbIC16ICIkX1NIVV9CVUlMREVSX0RJU0FCTEVfVkVSQk9TRV9JTlNUQUxMIiBdOyB0aGVuCisgICAgICAgIHZhcl9hcHBlbmQgSU5TVEFMTF9GTEFHUyAiVj0xIjsKKyAgICBmaQorICAgICgKKyAgICAgICAgcnVuIG1rZGlyIC1wICIkUEtHX0JVSUxEX0RJUiIgJiYKKyAgICAgICAgcnVuIGNkICIkUEtHX0JVSUxEX0RJUiIgJiYKKyAgICAgICAgZXhwb3J0IExERkxBR1M9Ii1MJF9TSFVfQlVJTERFUl9QUkVGSVgvbGliIiAmJgorICAgICAgICBleHBvcnQgQ1BQRkxBR1M9Ii1JJF9TSFVfQlVJTERFUl9QUkVGSVgvaW5jbHVkZSIgJiYKKyAgICAgICAgZXhwb3J0IFBLR19DT05GSUdfTElCRElSPSIkX1NIVV9CVUlMREVSX1BSRUZJWC9saWIvcGtnY29uZmlnIiAmJgorICAgICAgICBleHBvcnQgUEtHX0NPTkZJR19QQVRIPSIkUEtHX0NPTkZJR19MSUJESVI6JF9TSFVfQlVJTERFUl9QS0dfQ09ORklHX1BBVEgiICYmCisgICAgICAgIHJ1biAiJFBLR19TUkNfRElSIi9jb25maWd1cmUgXAorICAgICAgICAgICAgLS1wcmVmaXg9JF9TSFVfQlVJTERFUl9QUkVGSVggXAorICAgICAgICAgICAgJF9TSFVfQlVJTERFUl9HTlVfQ09ORklHX0hPU1RfRkxBRyBcCisgICAgICAgICAgICAkX1NIVV9CVUlMREVSX0NPTkZJR1VSRV9GTEFHUyBcCisgICAgICAgICAgICAiJEAiICYmCisgICAgICAgIHJ1biBtYWtlIC1qJE5VTV9KT0JTIFY9MSAmJgorICAgICAgICBydW4gbWFrZSAkSU5TVEFMTF9DT01NQU5EUyAkSU5TVEFMTF9GTEFHUworICAgICkgfHwKKyAgICBwYW5pYyAiQ291bGQgbm90IGJ1aWxkIGFuZCBpbnN0YWxsICRQS0dfRlVMTE5BTUUiCisKKyAgICB0b3VjaCAiJFBLR19USU1FU1RBTVAiCit9CisKKyMgQnVpbGQgd2l0aCB0aGUgZGVmYXVsdCAnbWFrZSBpbnN0YWxsJyBjb21tYW5kIGluIHRoZSBlbmQKKyMKKyMgJDE6IFBhY2thZ2UgYmFzZW5hbWUKKyMgJDIrOiBBZGRpdGlvbmFsIGNvbmZpZ3VyZSBvcHRpb25zLgorYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZSgpIHsKKyAgICBsb2NhbCBGSVJTVD0iJDEiCisgICAgc2hpZnQ7CisgICAgYnVpbGRlcl9idWlsZF9hdXRvdG9vbHNfcGFja2FnZV9mdWxsX2luc3RhbGwgIiRGSVJTVCIgaW5zdGFsbCAiJEAiCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkgYi9hbmRyb2lkL3NjcmlwdHMvdXRpbHMvcGFja2FnZV9saXN0X3BhcnNlci5zaGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyMjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvc2NyaXB0cy91dGlscy9wYWNrYWdlX2xpc3RfcGFyc2VyLnNoaQpAQCAtMCwwICsxLDQ2MyBAQAorIyBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZ1bmN0aW9ucyB1c2VkIHRvIHBhcnNlIGEgcGFja2FnZSBsaXN0IGZpbGUuCisjCisjIEEgUEFDS0FHRVMuVFhUIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorIworIyAgLSBFbXB0eSBsaW5lcywgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBkYXNoICgjKSBhcmUgaWdub3JlZC4KKyMgIC0gRWFjaCBsaW5lIGhhcyBzZXZlcmFsIGZpZWxkcyBsaWtlIDxOQU1FPj08VkFMVUU+CisjICAtIFZhbGlkIDxOQU1FPnMgYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZToKKyMKKyMgICAgICBVUkw9PHVybD4KKyMgICAgICAgICAgRG93bmxvYWQgVVJMIGZvciB0aGUgc291cmNlIHBhY2thZ2UuIFRoZSBwYWNrYWdlJ3MKKyMgICAgICAgICAgYmFzZW5hbWUgYW5kIHZlcnNpb24gbnVtYmVyIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gaXQuCisjCisjICAgICAgR0lUPTx1cmw+CisjICAgICAgICAgIEdJVCBVUkwgdG8gYmUgY2xvbmVkIGFuZCBwYWNrZWQgYXMgYSB0YXJiYWxsIGluIHRoZQorIyAgICAgICAgICBhcmNoaXZlIGRpcmVjdG9yeS4gUGFja2FnZSBuYW1lIHdpbGwgYmUgPGJhc2VuYW1lPi08cmV2aXNpb24+LnRhci54egorIyAgICAgICAgICB3aGVyZSA8YmFzZW5hbWU+IGlzIHRoZSBHSVQgdXJsIGJhc2VuYW1lLCBhbmQgPHJldmlzaW9uPiBpcyB0aGUKKyMgICAgICAgICAgYnJhbmNoIG9yIGNvbW1pdCBTSEExLgorIworIyAgICAgIFNWTj08dXJsPgorIyAgICAgICAgICBTVk4gVVJMIHRvIGJlIGNoZWNrZWQgb3V0IGFuZCBwYWNrZWQgYXMgYSB0YXJiYWxsIGluIHRoZSBhcmNoaXZlCisjICAgICAgICAgIGRpcmVjdG9yeS4gUGFja2FnZSBuYW1lIHdpbGwgYmUgPGJhc2VuYW1lPi08cmV2aXNpb24+LnRhci54egorIyAgICAgICAgICB3aGVyZSA8YmFzZW5hbWU+IGlzIHRoZSBTVk4gdXJsIGJhc2VuYW1lLCBhbmQgPHJldmlzaW9uPiBpcyB0aGUKKyMgICAgICAgICAgcmV2aXNpb24gbnVtYmVyIGFmdGVyIEAuCisjCisjICAgICAgQkFTRU5BTUU9PG5hbWU+CisjICAgICAgICAgIE9wdGlvbmFsIHBhY2thZ2UgYmFzZSBuYW1lLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBiYXNlIG5hbWUgd2lsbAorIyAgICAgICAgICBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgVVJML0dJVC9TVk4gdmFsdWUuCisjCisjICAgICAgQlJBTkNIPTxuYW1lPgorIyAgICAgICAgICBHSVQgYnJhbmNoIG5hbWUsIG9ubHkgbmVlZGVkIHdoZW4gR0lUPTx1cmw+IGlzIGFsc28gdXNlZCwgaWdub3JlZAorIyAgICAgICAgICBvdGhlcndpc2UuCisjCisjICAgICAgU0hBMT08c2hhMT4KKyMgICAgICAgICAgT3B0aW9uYWwgU0hBLTEgaGFzaCBmb3IgdGhlIHNvdXJjZSBwYWNrYWdlLiBJZiBVUkw9PHVybD4gaXMgdXNlZCwKKyMgICAgICAgICAgdGhpcyBpcyBvcHRpb25hbCwgYW5kIGlmIHByZXNlbnQsIHRoZSBjb250ZW50IG9mIHRoZSBkb3dubG9hZGVkCisjICAgICAgICAgIHBhY2thZ2Ugd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhpcyB2YWx1ZS4KKyMKKyMgICAgICAgICAgSWYgR0lUPTx1cmw+IGlzIHVzZWQsIHRoaXMgaXMgdGhlIFNIQTEgb2YgdGhlIGxpc3Qgb2YgZmlsZXMgaW5zaWRlCisjICAgICAgICAgIHRoZSB0YXJiYWxsIGNyZWF0ZWQgYnkgdGhlIGRvd25sb2FkZXIuIFRoZSBjb21taXQgaXRzZWxmIGlzCisjICAgICAgICAgIHNwZWNpZmllZCB0aHJvdWdoIEJSQU5DSD08bmFtZT4KKyMKKyMgICAgICBTUkNESVI9PHN1YmRpcj4KKyMgICAgICAgICAgT3B0aW9uYWwgc291cmNlIHN1Yi1kaXJlY3RvcnkgYWZ0ZXIgZXh0cmFjdGlvbiBvZiB0aGUKKyMgICAgICAgICAgcGFja2FnZS4gTm9ybWFsbHksIGZvby1iYXItMS4yLnRhci5neiBleHRyYWN0cyBpbnRvCisjICAgICAgICAgIGEgc3ViLWRpcmVjdG9yeSBuYW1lZCAnZm9vLWJhci0xLjInLCBidXQgdGhlcmUgYXJlIGEKKyMgICAgICAgICAgZmV3IGV4Y2VwdGlvbnMgd2hlcmUgdGhpcyBpcyBub3QgdGhlIGNhc2UuCisjCisjICAgICAgICAgIEZvciBleGFtcGxlLCB3aGVuIE1lc2FMaWItMTAuNC4yLnRhci5neiBpcyBleHRyYWN0ZWQsCisjICAgICAgICAgIHRoZSAnTWVzYS0xMC40LjInIGRpcmVjdG9yeSBpcyBjcmVhdGVkLiBTUkNESVI9PHN1YmRpcj4KKyMgICAgICAgICAgaXMgYSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgZGVyaXZlZCBmcm9tCisjICAgICAgICAgIHRoZSBwYWNrYWdlJ3MgZnVsbCBuYW1lLgorIworIyAgICAgIERTVERJUj08c3ViZGlyPgorIyAgICAgICAgICBPcHRpb25hbCBkZXN0aW5hdGlvbiBzdWItZGlyZWN0b3J5LiBJbiBjZXJ0YWluIGNhc2VzLCBpdCBpcworIyAgICAgICAgICBuZWNlc3NhcnkgdG8gcmVuYW1lIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZnJvbSBzb21ldGhpbmcKKyMgICAgICAgICAgZGlmZmVyZW50IGZyb20gU1JDRElSIChlLmcuIFF0IHBhY2thZ2VzIHNob3VsZCBhbGwgdW5jb21wcmVzcworIyAgICAgICAgICBpbnRvIHRoZSBzYW1lIHNvdXJjZSBkaXJlY3RvcnksIGJ1dCB0aGV5IGNvbWUgaW4gdGFyYmFsbHMgdGhhdAorIyAgICAgICAgICBleHRyYWN0IHRvIHNlcGFyYXRlIGRpcmVjdG9yaWVzIGxpa2UgcXRiYXNlLVhYWC8gYW5kIHF0c3ZnLVhYWC8uCisjCisjICAgICAgICAgIEJ5IHNldHRpbmcgYSBub24tZW1wdHkgdmFsdWUgaGVyZSwgdGhlIGNvbnRlbnQgb2YgU1JDRElSIHdpbGwgYmUKKyMgICAgICAgICAgcmVjdXJzaXZlbHkgY29waWVkIGludG8gdGhlIERTVERJUiBzdWItZGlyZWN0b3J5LiBUaGlzIGhhcHBlbnMKKyMgICAgICAgICAgYWZ0ZXIgYWxsIHBhdGNoZXMgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gU1JDRElSLgorIworIyBVc2FnZToKKyMKKyMgICAgMSkgQ2FsbCAncGFja2FnZV9saXN0X3BhcnNlX2ZpbGUgL3BhdGgvdG8vUEFDS0FHRVMuVFhUJyB0bworIyAgICAgICBwYXJzZSB0aGUgcGFja2FnZSBsaXN0IGZpbGUgYW5kIHJlY29yZCBpdHMgY29udGVudC4KKyMKKyMgICAgMikgVXNlIG90aGVyIHBhY2thZ2VfbGlzdF9nZXRfWFhYIGZ1bmN0aW9ucyB0byByZXRyaWV2ZQorIyAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBhIHBhY2thZ2UuIEVhY2ggcGFja2FnZSBpcyBpZGVudGlmaWVkCisjICAgICAgIGJ5IGl0cyAnYmFzZSBuYW1lJywgd2hpY2ggaXMgdGhlIHVudmVyc2lvbmVkIG5hbWUgb2YKKyMgICAgICAgdGhlIHBhY2thZ2UgKGUuZy4gJ3psaWItMi4xLjgudGFyLmd6JyBoYXMgYSBiYXNlIG5hbWUKKyMgICAgICAgb2YgJ3psaWInKS4KKyMKKyMgICAgMykgT25lIGNhbiB1c2UgJ3BhY2thZ2VfbGlzdF9nZXRfcGFja2FnZXMnIHRvIHJldHJpZXZlIGEgbGlzdAorIyAgICAgICBvZiBhbGwgdGhlIHBhY2thZ2UgYmFzZSBuYW1lcy4KKworIyBTZXQgdG8gMSB0byBlbmFibGUgZGVidWdnaW5nIHRoaXMgcGFyc2VyLCAwIHRvIGRpc2FibGUuCitfU0hVX0RFQlVHX1BBUlNFUj0wCisKK2lmIFsgIiRfU0hVX0RFQlVHX1BBUlNFUiIgPSAiMSIgXTsgdGhlbgorICAgIF9zaHVfcGFyc2VyX2xvZyAoKSB7CisgICAgICAgIGxvZyAiJEAiCisgICAgfQorZWxzZQorICAgIF9zaHVfcGFyc2VyX2xvZyAoKSB7IHRydWU7IH0KK2ZpCisKKyMgRXh0cmFjdCB0aGUgdmVyc2lvbiBvZiBhIGdpdmVuIHBhY2thZ2UtbmFtZS4gQXNzdW1lcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyMgICA8bmFtZT4tPHZlcnNpb24+PGV4dGVuc2lvbj4KKyMKKyMgV2hlcmUgPG5hbWU+IGNhbiBjb250YWluIGh5cGhlbnMgKC0pIGJ1dCBub3QgPHZlcnNpb24+IG9yIDxleHRlbnNpb24+LAorIyBhbmQgPGV4dGVuc2lvbj4gaXMgb25lIG9mIHRoZSBleHRlbnNpb25zIGtub3duIHRvIHBhY2thZ2VfZmlsZV9zdHJpcF9leHQKKyMgJDE6IFBhY2thZ2UgbmFtZSAoZS5nLiAnemxpYi0xLjIuOC50YXIuZ3onKQorIyBPdXQ6IFBhY2thZ2UgdmVyc2lvbiBudW1iZXIgKGUuZy4gJzEuMi44JykKK19zaHVfcGFja2FnZV9uYW1lX2V4dHJhY3RfdmVyc2lvbiAoKSB7CisgICAgcGFja2FnZV9maWxlX3N0cmlwX2V4dCAiJDEiIHwgc2VkIC1lICdzfC4qLVwoW14tXSpcKSR8XDF8ZycKK30KKworIyBFeHRyYWN0IHRoZSBiYXNlIG5hbWUgb2YgYSBnaXZlbiBwYWNrYWdlIGZpbGUuIEFzc3VtZXMgdGhlIHNhbWUgZm9ybWF0IGFzCisjIF9zaHVfcGFja2FnZV9uYW1lX2V4dHJhY3RfYmFzZW5hbWUuCisjICQxOiBQYWNrYWdlIG5hbWUgKGUuZy4gJ3psaWItMS4yLjgudGFyLmd6JykKKyMgT3V0OiBQYWNrYWdlIGJhc2UgbmFtZSAoZS5nLiAnemxpYicpCitfc2h1X3BhY2thZ2VfbmFtZV9leHRyYWN0X2Jhc2VuYW1lICgpIHsKKyAgICBwYWNrYWdlX2ZpbGVfc3RyaXBfZXh0ICIkMSIgfCBzZWQgLWUgJ3N8XlwoLipcKS1bXi1dKiR8XDF8ZycKK30KKworIyBSZXR1cm4gdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHdpdGhvdXQgaXRzIGFyY2hpdmUgc3VmZml4ICguemlwLy50YXIuZ3ovZXRjKS4KKyMgJDE6IFBhY2thZ2UgZmlsZSBwYXRoLgorIyBPdXQ6IFBhY2thZ2UgZmlsZSBwYXRoIHdpdGhvdXQgemlwL3RhcmJhbGwgZXh0ZW5zaW9uLgorcGFja2FnZV9maWxlX3N0cmlwX2V4dCAoKSB7CisgICAgY2FzZSAkMSBpbgorICAgICAgICAqLnppcCkKKyAgICAgICAgICAgIHByaW50ZiAlcyAiJHsxJS56aXB9IgorICAgICAgICAgICAgOzsKKyAgICAgICAgKi50YXIuZ3opCisgICAgICAgICAgICBwcmludGYgJXMgIiR7MSUudGFyLmd6fSIKKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLmJ6MikKKyAgICAgICAgICAgIHByaW50ZiAlcyAiJHsxJS50YXIuYnoyfSIKKyAgICAgICAgICAgIDs7CisgICAgICAgICoudGFyLnh6KQorICAgICAgICAgICAgcHJpbnRmICVzICIkezElLnRhci54en0iCisgICAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgcHJpbnRmICVzICIkMSIKKyAgICBlc2FjCit9CisKKyMgU2V0IHRoZSB2YWx1ZSBvZiBhIGdpdmVuIHBhY2thZ2UgZmllbGQuCisjICQxOiBQYWNrYWdlIGluZGV4IChlLmcuICcxJykKKyMgJDI6IEZpZWxkIG5hbWUgKGUuZy4gJ1VSTCcpCisjICQzOiBWYWx1ZQorX3NodV9wa2dfc2V0X3ZhciAoKSB7CisgICAgdmFyX2Fzc2lnbiBfU0hVX1BLR18kezJ9X18kezF9ICIkMyIKK30KKworIyBHZXQgdGhlIHZhbHVlIG9mIGEgZ2l2ZW4gcGFja2FnZSBmaWVsZC4KKyMgJDE6IFBhY2thZ2UgaW5kZXggKGUuZy4gJzEnKQorIyAkMjogRmllbGQgbmFtZSAoZS5nLiAnVVJMJykKK19zaHVfcGtnX2dldF92YXIgKCkgeworICAgIHZhcl92YWx1ZSBfU0hVX1BLR18kezJ9X18kezF9Cit9CisKKyMgRmluZCB0aGUgaW5kZXggb2YgYSBnaXZlbiBwYWNrYWdlIGZyb20gaXRzIGJhc2VuYW1lCisjICQxOiBQYWNrYWdlIGJhc2VuYW1lIChlLmcuICdwa2ctY29uZmlnJykKKyMgT3V0OiBpbmRleCBpbiBfU0hVX1BLR18gbGlzdHMgKGUuZy4gJzEnKSwgb3IgJycgaWYgbm90IGZvdW5kLgorX3NodV9wa2dfZmluZF9iYXNlbmFtZV9pbmRleCAoKSB7CisgICAgbG9jYWwgTj0wCisgICAgd2hpbGUgWyAiJE4iIC1sdCAiJF9TSFVfUEtHX0NPVU5UIiBdOyBkbworICAgICAgICBOPSQoKCAkTiArIDEgKSkKKyAgICAgICAgaWYgWyAiJChfc2h1X3BrZ19nZXRfdmFyICROIEJBU0VOQU1FKSIgPSAiJDEiIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIiROIgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZmkKKyAgICBkb25lCit9CisKKyMgUGFyc2UgdGhlIHBhY2thZ2UgbGlzdCBmaWxlLCBhbmQgcmVjb3JkIGl0cyBjb250ZW50LgorIyBPbmUgY2FuIGxhdGVyIHVzZSBwYWNrYWdlX2xpc3RfWFhYIGZ1bmN0aW9ucyB0byBwcm9iZSBpdHMgY29udGVudC4KKyMKKyMgJDE6IHBhY2thZ2UgbGlzdCBmaWxlLgorcGFja2FnZV9saXN0X3BhcnNlX2ZpbGUgKCkgeworICAgIGxvY2FsIFBBQ0tBR0VTPSIkMSIKKworICAgIF9zaHVfcGFyc2VyX2xvZyAiVHJ5aW5nIHRvIHBhcnNlOiAkUEFDS0FHRVMiCisKKyAgICAjIFNtYWxsIHNhbml0eSBjaGVjaworICAgIGlmIFsgISAtZiAiJFBBQ0tBR0VTIiBdOyB0aGVuCisgICAgICAgIHBhbmljICJNaXNzaW5nIHBhY2thZ2VzIGxpc3QgZmlsZTogJFBBQ0tBR0VTIgorICAgIGZpCisKKyAgICBsb2NhbCBQS0dfQkFTRU5BTUUgUEtHX1VSTCBQS0dfU0hBMSBQS0dfUEFUQ0hFUyBQS0dfRklMRSBQS0dfVkVSU0lPTgorICAgIGxvY2FsIFBLR19MSVNUIFBLR19TUkNfRElSIFBLR19HSVQgUEtHX0JSQU5DSAorICAgIGxvY2FsIE9MRF9JRlM9IiRJRlMiCisgICAgbG9jYWwgSUZTPSIkT0xEX0lGUyIKKyAgICBsb2NhbCBDT1VOVD0wCisgICAgbG9jYWwgTElORV9OVU1CRVI9MAorICAgIGxvY2FsIExJTkUKKyAgICBJRlM9IgorIgorICAgIGZvciBMSU5FIGluICQoY2F0ICIkMSIpOyBkbworICAgICAgICBJRlM9JE9MRF9JRlMKKyAgICAgICAgTElORV9OVU1CRVI9JCgoICRMSU5FX05VTUJFUiArIDEgKSkKKyAgICAgICAgX3NodV9wYXJzZXJfbG9nICIkTElORV9OVU1CRVI6IExJTkU9WyRMSU5FXSIKKyAgICAgICAgUEtHX1VSTD0KKyAgICAgICAgUEtHX0dJVD0KKyAgICAgICAgUEtHX1NWTj0KKyAgICAgICAgUEtHX0JSQU5DSD0KKyAgICAgICAgUEtHX0JBU0VOQU1FPQorICAgICAgICBQS0dfU0hBMT0KKyAgICAgICAgUEtHX0ZJTEU9CisgICAgICAgIFBLR19QQVRDSEVTPQorICAgICAgICBQS0dfVkVSU0lPTj0KKyAgICAgICAgUEtHX1NSQ19ESVI9CisgICAgICAgIFBLR19EU1RfRElSPQorCisgICAgICAgICMgU2tpcCBlbXB0eSBsaW5lcywgYW5kIGNvbW1lbnQgbGluZXMgdGhhdCBzdGFydCB3aXRoICMKKyAgICAgICAgaWYgWyAteiAiJExJTkUiIC1vICIke0xJTkUjI1wjfSIgIT0gIiR7TElORX0iIF07IHRoZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZpCisKKyAgICAgICAgbG9jYWwgRklFTEQKKyAgICAgICAgZm9yIEZJRUxEIGluICRMSU5FOyBkbworICAgICAgICAgICAgX3NodV9wYXJzZXJfbG9nICIgICBGSUVMRD1bJEZJRUxEXSIKKyAgICAgICAgICAgIGNhc2UgJEZJRUxEIGluCisgICAgICAgICAgICAgICAgU0hBMT0qKQorICAgICAgICAgICAgICAgICAgICBQS0dfU0hBMT0ke0ZJRUxEI1NIQTE9fQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIFVSTD0qKQorICAgICAgICAgICAgICAgICAgICBQS0dfVVJMPSR7RklFTEQjVVJMPX0KKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBCQVNFTkFNRT0qKQorICAgICAgICAgICAgICAgICAgICBQS0dfQkFTRU5BTUU9JHtGSUVMRCMjQkFTRU5BTUU9fQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIEJSQU5DSD0qKQorICAgICAgICAgICAgICAgICAgICBQS0dfQlJBTkNIPSR7RklFTEQjQlJBTkNIPX0KKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBHSVQ9KikKKyAgICAgICAgICAgICAgICAgICAgUEtHX0dJVD0ke0ZJRUxEI0dJVD19CisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgU1ZOPSopCisgICAgICAgICAgICAgICAgICAgIFBLR19TVk49JHtGSUVMRCNTVk49fQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIFBBVENIRVM9KikKKyAgICAgICAgICAgICAgICAgICAgUEtHX1BBVENIRVM9JHtGSUVMRCNQQVRDSEVTPX0KKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBTUkNESVI9KikKKyAgICAgICAgICAgICAgICAgICAgUEtHX1NSQ19ESVI9JHtGSUVMRCNTUkNESVI9fQorICAgICAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIERTVERJUj0qKQorICAgICAgICAgICAgICAgICAgICBQS0dfRFNUX0RJUj0ke0ZJRUxEI0RTVERJUj19CisgICAgICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAgICAgZHVtcCAiV0FSTklORzogVW5rbm93biBwYWNrYWdlIGZpZWxkIFskRklFTERdIG9uIGxpbmUgJExJTkVfTlVNQkVSOiAkMSIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgZG9uZQorCisgICAgICAgIGlmIFsgIiRQS0dfVVJMIiBdOyB0aGVuCisgICAgICAgICAgICBpZiBbICIkUEtHX0dJVCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHBhbmljICJDYW5ub3QgdXNlIGJvdGggVVJMPTx1cmw+IGFuZCBHSVQ9PHVybD4gb24gbGluZSAkTElORV9OVU1CRVI6ICQxIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGlmIFsgIiRQS0dfU1ZOIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgcGFuaWMgIkNhbm5vdCB1c2UgYm90aCBVUkw9PHVybD4gYW5kIFNWTj08dXJsPiBvbiBsaW5lICRMSU5FX05VTUJFUjogJDEiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgUEtHX0ZJTEU9JChiYXNlbmFtZSAiJFBLR19VUkwiKQorICAgICAgICAgICAgaWYgWyAteiAiJFBLR19CQVNFTkFNRSIgXTsgdGhlbgorICAgICAgICAgICAgICAgIFBLR19CQVNFTkFNRT0kKF9zaHVfcGFja2FnZV9uYW1lX2V4dHJhY3RfYmFzZW5hbWUgIiRQS0dfRklMRSIpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgUEtHX1ZFUlNJT049JChfc2h1X3BhY2thZ2VfbmFtZV9leHRyYWN0X3ZlcnNpb24gIiRQS0dfRklMRSIpCisgICAgICAgIGVsaWYgWyAiJFBLR19HSVQiIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgIiRQS0dfU1ZOIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgcGFuaWMgIkNhbm5vdCB1c2UgYm90aCBHSVQ9PHVybD4gYW5kIFNWTj08dXJsPiBvbiBsaW5lICRMSU5FX05VTUJFUjogJDEiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgaWYgWyAteiAiJFBLR19CUkFOQ0giIF07IHRoZW4KKyAgICAgICAgICAgICAgICBwYW5pYyAiTWlzc2luZyBCUkFOQ0g9PG5hbWU+IG9uIGxpbmUgJExJTkVfTlVNQkVSOiAkMSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBQS0dfRklMRT0kKGJhc2VuYW1lICIkUEtHX0dJVCIpCisgICAgICAgICAgICBQS0dfRklMRT0ke1BLR19GSUxFJS5naXR9ICAjIFJlbW92ZSBhbnkgLmdpdCBzdWZmaXguCisgICAgICAgICAgICBpZiBbIC16ICIkUEtHX0JBU0VOQU1FIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgUEtHX0JBU0VOQU1FPSRQS0dfRklMRQorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIFBLR19GSUxFPSRQS0dfQkFTRU5BTUUtJFBLR19CUkFOQ0gudGFyLnh6CisgICAgICAgICAgICBQS0dfVkVSU0lPTj0kUEtHX0JSQU5DSAorICAgICAgICBlbGlmIFsgIiRQS0dfU1ZOIiBdOyB0aGVuCisgICAgICAgICAgICBpZiBbIC16ICIkUEtHX0JSQU5DSCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIHBhbmljICJNaXNzaW5nIEJSQU5DSD08bmFtZT4gb24gbGluZSAkTElORV9OVU1CRVI6ICQxIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIFBLR19GSUxFPSQoYmFzZW5hbWUgIiRQS0dfU1ZOIikKKyAgICAgICAgICAgIGlmIFsgLXogIiRQS0dfQkFTRU5BTUUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBQS0dfQkFTRU5BTUU9JFBLR19GSUxFCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgUEtHX0ZJTEU9JFBLR19CQVNFTkFNRS0kUEtHX0JSQU5DSC50YXIueHoKKyAgICAgICAgICAgIFBLR19WRVJTSU9OPSRQS0dfQlJBTkNICisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhbmljICJNaXNzaW5nIFVSTD08dXJsPiwgR0lUPTx1cmw+IG9yIFNWTj08dXJsPiBmaWVsZCBpbiBwYWNrYWdlIGxpc3QgbGluZSAkTElORV9OVU1CRVI6ICQxIgorICAgICAgICBmaQorCisgICAgICAgIF9zaHVfcGFyc2VyX2xvZyAiICAgIEJBU0VOQU1FPSRQS0dfQkFTRU5BTUUgRklMRT0kUEtHX0ZJTEUiCisgICAgICAgIGlmIFsgLXogIiRQS0dfU1JDX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgUEtHX1NSQ19ESVI9JFBLR19CQVNFTkFNRS0kUEtHX1ZFUlNJT04KKyAgICAgICAgICAgIF9zaHVfcGFyc2VyX2xvZyAiICAgIFNSQ19ESVI9JFBLR19TUkNfRElSIgorICAgICAgICBmaQorCisgICAgICAgIGlmIFsgLXogIiRQS0dfRFNUX0RJUiIgXTsgdGhlbgorICAgICAgICAgICAgUEtHX0RTVF9ESVI9JFBLR19TUkNfRElSCisgICAgICAgIGZpCisgICAgICAgIF9zaHVfcGFyc2VyX2xvZyAiICAgICAgICBEU1RfRElSPSRQS0dfRFNUX0RJUiIKKworICAgICAgICAjIFNhdmUgdGhlIHBhY2thZ2UgaW5mb3JtYXRpb24gbm93LgorICAgICAgICBDT1VOVD0kKCggJENPVU5UICsgMSApKQorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBCQVNFTkFNRSAiJFBLR19CQVNFTkFNRSIKKyAgICAgICAgX3NodV9wa2dfc2V0X3ZhciAkQ09VTlQgVkVSU0lPTiAiJFBLR19WRVJTSU9OIgorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBGSUxFICIkUEtHX0ZJTEUiCisgICAgICAgIF9zaHVfcGtnX3NldF92YXIgJENPVU5UIFNSQ19ESVIgIiRQS0dfU1JDX0RJUiIKKyAgICAgICAgX3NodV9wa2dfc2V0X3ZhciAkQ09VTlQgRFNUX0RJUiAiJFBLR19EU1RfRElSIgorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBVUkwgIiRQS0dfVVJMIgorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBHSVQgIiRQS0dfR0lUIgorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBTVk4gIiRQS0dfU1ZOIgorICAgICAgICBfc2h1X3BrZ19zZXRfdmFyICRDT1VOVCBTSEExICIkUEtHX1NIQTEiCisgICAgICAgIF9zaHVfcGtnX3NldF92YXIgJENPVU5UIFBBVENIRVMgIiRQS0dfUEFUQ0hFUyIKKworICAgICAgICB2YXJfYXBwZW5kIFBLR19MSVNUICIkUEtHX0JBU0VOQU1FIgorICAgIGRvbmUKKworICAgIF9TSFVfUEtHX0NPVU5UPSRDT1VOVAorICAgIF9TSFVfUEtHX0xJU1Q9JFBLR19MSVNUCit9CisKKworIyBHZXQgdGhlIHZhbHVlIG9mIGEgbmFtZWQgZmllbGQgZm9yIGEgcGFja2FnZWQgaWRlbnRpZmllZCBieSBiYXNlbmFtZS4KKyMgJDE6IFBhY2thZ2UgYmFzZW5hbWUgKGUuZy4gJ3psaWInKQorIyAkMjogRmllbGQgbmFtZSAoZS5nLiAnVVJMJykKKyMgT3V0OiBmaWVsZCB2YWx1ZSwgb3IgZW1wdHkgaWYgbm90IGRlZmluZWQuCitfc2h1X3BhY2thZ2VfbGlzdF9nZXRfZmllbGQgKCkgeworICAgIGxvY2FsIE4KKyAgICBOPSQoX3NodV9wa2dfZmluZF9iYXNlbmFtZV9pbmRleCAiJDEiKQorICAgIGlmIFsgIiROIiBdOyB0aGVuCisgICAgICAgIF9zaHVfcGtnX2dldF92YXIgJE4gJDIKKyAgICBmaQorfQorCisjIFJldHVybiB0aGUgdmVyc2lvbiBvZiBhIGdpdmVuIHBhY2thZ2UuCisjICQxOiB1bnZlcnNpb25lZCBhbmQgdW4tc3VmZml4ZWQgcGFja2FnZSBwcmVmaXggKGUuZy4gJ3psaWInKQorIyBPdXQ6IHBhY2thZ2UgdmVyc2lvbiAoZS5nLiAnMS4yLjgnKQorcGFja2FnZV9saXN0X2dldF92ZXJzaW9uICgpIHsKKyAgICBsb2NhbCBOCisgICAgTj0kKF9zaHVfcGtnX2ZpbmRfYmFzZW5hbWVfaW5kZXggIiQxIikKKyAgICBpZiBbICIkTiIgXTsgdGhlbgorICAgICAgICBwcmludGYgJXMgJChfc2h1X3BrZ19nZXRfdmFyICROIFZFUlNJT04pCisgICAgZmkKK30KKworIyBSZXR1cm4gdGhlIGZ1bGwgbmFtZSBvZiBhIGdpdmVuIHBhY2thZ2UuCisjICQxOiB1bnZlcnNpb25lZCBhbmQgdW5zdWZmaXhlZCBwYWNrYWdlIHByZWZpeCAoZS5nLiAnemxpYicpCisjIE91dDogcGFja2FnZSBmdWxsIG5hbWUgKGUuZy4gJ3psaWItMS4yLjgnKQorcGFja2FnZV9saXN0X2dldF9mdWxsX25hbWUgKCkgeworICAgIGxvY2FsIE4KKyAgICBOPSQoX3NodV9wa2dfZmluZF9iYXNlbmFtZV9pbmRleCAiJDEiKQorICAgIGlmIFsgIiROIiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAlcyAkKF9zaHVfcGtnX2dldF92YXIgJE4gQkFTRU5BTUUpLSQoX3NodV9wa2dfZ2V0X3ZhciAkTiBWRVJTSU9OKQorICAgIGZpCit9CisKKyMgUmV0dXJuIHRoZSBhcmNoaXZlIGZpbGUgbmFtZSBvZiBhIGdpdmVuIHBhY2thZ2UuCisjICQxOiB1bnZlcnNpb25lZCBhbmQgdW4tc3VmZml4ZWQgcGFja2FnZSBwcmVmaXggKGUuZy4gJ3psaWInKQorIyBPdXQ6IHBhY2thZ2UgdGFyYmFsbCBuYW1lIChlLmcuICd6bGliLTEuMi44LnRhci5neicpCitwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lICgpIHsKKyAgICBfc2h1X3BhY2thZ2VfbGlzdF9nZXRfZmllbGQgIiQxIiBGSUxFCit9CisKKyMgUmV0dXJuIHRoZSBVUkwgb2YgYSBnaXZlbiBwYWNrYWdlLCBpZiBhbnkuCisjICQxOiB1bnZlcnNpb25lZCBhbmQgdW4tc3VmZml4ZWQgcGFja2FnZSBwcmVmaXggKGUuZy4gJ3psaWInKQorIyBPdXQ6IHBhY2thZ2UgVVJMIChlLmcuICdmdHA6Ly9zb21lc2VydmVyL3NvbWVwYXRoL3psaWItMS4yLjgudGFyLmd6JykKK3BhY2thZ2VfbGlzdF9nZXRfdXJsICgpIHsKKyAgICBfc2h1X3BhY2thZ2VfbGlzdF9nZXRfZmllbGQgIiQxIiBVUkwKK30KKworIyBSZXR1cm4gdGhlIGdpdCBVUkwgb2YgYSBnaXZlbiBwYWNrYWdlLCBpZiBhbnkuCisjICQxOiB1bnZlcnNpb25lZCBhbmQgdW4tc3VmZml4ZWQgcGFja2FnZSBwcmVmaXggKGUuZy4gJ3psaWInKQorIyBPdXQ6IHBhY2thZ2UgVVJMIChlLmcuICdnaXQ6Ly9naXQucWVtdS1wcm9qZWN0Lm9yZy9kdGMuZ2l0JykKK3BhY2thZ2VfbGlzdF9nZXRfZ2l0X3VybCAoKSB7CisgICAgX3NodV9wYWNrYWdlX2xpc3RfZ2V0X2ZpZWxkICIkMSIgR0lUCit9CisKKyMgUmV0dXJuIHRoZSBnaXQgU1ZNIG9mIGEgZ2l2ZW4gcGFja2FnZSwgaWYgYW55LgorIyAkMTogdW52ZXJzaW9uZWQgYW5kIHVuLXN1ZmZpeGVkIHBhY2thZ2UgcHJlZml4IChlLmcuICd6bGliJykKKyMgT3V0OiBwYWNrYWdlIFVSTCAoZS5nLiAnc3ZuOi8vc3ZuLnByb2plY3Qub3JnL3RydW5rL3NvbWV0aGluZ0B2ZXJzaW9uJykKK3BhY2thZ2VfbGlzdF9nZXRfc3ZuX3VybCAoKSB7CisgICAgX3NodV9wYWNrYWdlX2xpc3RfZ2V0X2ZpZWxkICIkMSIgU1ZOCit9CisKK3BhY2thZ2VfbGlzdF9nZXRfZ2l0X2JyYW5jaCAoKSB7CisgICAgX3NodV9wYWNrYWdlX2xpc3RfZ2V0X2ZpZWxkICIkMSIgQlJBTkNICit9CisKKyMgUmV0dXJuIHRoZSBTSEExIG9mIGEgZ2l2ZW4gcGFja2FnZSwgaWYgYW55LgorIyAkMTogdW52ZXJzaW9uZWQgYW5kIHVuLXN1ZmZpeGVkIHBhY2thZ2UgcHJlZml4IChlLmcuICd6bGliJykKKyMgT3V0OiBwYWNrYWdlIFNIQTEKK3BhY2thZ2VfbGlzdF9nZXRfc2hhMSAoKSB7CisgICAgX3NodV9wYWNrYWdlX2xpc3RfZ2V0X2ZpZWxkICIkMSIgU0hBMQorfQorCisjIFJldHVybiB0aGUgcGF0Y2hlcyB0YXJiYWxsIG9mIGEgZ2l2ZW4gcGFja2FnZSwgaWYgYW55LgorIyAkMTogdW52ZXJzaW9uZWQgYW5kIHVuLXN1ZmZpeGVkIHBhY2thZ2UgcHJlZml4IChlLmcuICdnbGliJykKKyMgT3V0OiBwYWNrYWdlIHRhcmJhbGwgbmFtZSAoZS5nLiAnZ2xpYi0yLjEuOC1wYXRjaGVzLnRhci54eicpCitwYWNrYWdlX2xpc3RfZ2V0X3BhdGNoZXMgKCkgeworICAgIF9zaHVfcGFja2FnZV9saXN0X2dldF9maWVsZCAiJDEiIFBBVENIRVMKK30KKworIyBSZXR1cm4gdGhlIHNvdXJjZSBzdWItZGlyZWN0b3J5IG5hbWUgb2YgYSBnaXZlbiBwYWNrYWdlLgorIyAkMTogdW52ZXJzaW9uZWQgYW5kIHVuLXN1ZmZpeGVkIHBhY2thZ2UgcHJlZml4IChlLmcuICdNZXNhTGliJykKKyMgT3V0OiBzb3VyY2Ugc3ViLWRpcmVjdG9yeSAoZS5nLiAnTWVzYS0xMC40LjInKQorcGFja2FnZV9saXN0X2dldF9zcmNfZGlyICgpIHsKKyAgICBfc2h1X3BhY2thZ2VfbGlzdF9nZXRfZmllbGQgIiQxIiBEU1RfRElSCit9CisKK3BhY2thZ2VfbGlzdF9nZXRfdW5wYWNrX3NyY19kaXIgKCkgeworICAgIF9zaHVfcGFja2FnZV9saXN0X2dldF9maWVsZCAiJDEiIFNSQ19ESVIKK30KKworIyBSZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHVudmVyc2lvbmVkIHBhY2thZ2UgbmFtZXMuCitwYWNrYWdlX2xpc3RfZ2V0X3BhY2thZ2VzICgpIHsKKyAgICBwcmludGYgJXMgIiRfU0hVX1BLR19MSVNUIgorfQorCisjIFVucGFjayBhbmQgZXZlbnR1YWxseSBwYXRjaCBhIGdpdmVuIHNvdXJjZSBwYWNrYWdlLgorIworIyAkMTogdW52ZXJzaW9uZWQgYW5kIHVuc3VmZml4ZWQgcGFja2FnZSBuYW1lIChlLmcuICd6bGliJykKKyMgJDI6IHNvdXJjZSBhcmNoaXZlIGRpcmVjdG9yeS4KKyMgJDM6IGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KK3BhY2thZ2VfbGlzdF91bnBhY2tfYW5kX3BhdGNoICgpIHsKKyAgICBsb2NhbCBQS0dfTkFNRT0iJDEiCisgICAgbG9jYWwgU1JDX0RJUj0iJDIiCisgICAgbG9jYWwgRFNUX0RJUj0iJDMiCisgICAgbG9jYWwgUEtHX1ZFUlNJT04gUEtHX1BBQ0tBR0UgUEtHX1BBVENIRVNfRElSIFBLR19QQVRDSEVTX1BBQ0tBR0UKKyAgICBsb2NhbCBQS0dfRElSIFBLR19EU1RfRElSIFBBVENIIFBLR19GVUxMTkFNRQorICAgIFBLR19WRVJTSU9OPSQocGFja2FnZV9saXN0X2dldF92ZXJzaW9uICRQS0dfTkFNRSkKKyAgICBpZiBbIC16ICIkUEtHX1ZFUlNJT04iIF07IHRoZW4KKyAgICAgICAgcGFuaWMgIkNhbm5vdCBmaW5kIHZlcnNpb24gZm9yIHBhY2thZ2UgJFBLR19OQU1FISIKKyAgICBmaQorICAgIFBLR19GVUxMTkFNRT0kKHBhY2thZ2VfbGlzdF9nZXRfZnVsbF9uYW1lICRQS0dfTkFNRSkKKyAgICBkdW1wICJFeHRyYWN0aW5nICRQS0dfRlVMTE5BTUUiCisgICAgUEtHX0ZJTEU9JChwYWNrYWdlX2xpc3RfZ2V0X2ZpbGVuYW1lICRQS0dfTkFNRSkKKyAgICBta2RpciAtcCAiJERTVF9ESVIiICYmCisgICAgdW5wYWNrX2FyY2hpdmUgIiRTUkNfRElSLyRQS0dfRklMRSIgIiREU1RfRElSIiB8fAorICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCB1bnBhY2sgJFBLR19GVUxMTkFNRSIKKyAgICBQS0dfRElSPSREU1RfRElSLyQocGFja2FnZV9saXN0X2dldF91bnBhY2tfc3JjX2RpciAkUEtHX05BTUUpCisgICAgaWYgWyAhIC1kICIkUEtHX0RJUiIgXTsgdGhlbgorICAgICAgICBwYW5pYyAiTWlzc2luZyBleHRyYWN0ZWQgZGlyZWN0b3J5OiAkUEtHX0RJUiIKKyAgICBmaQorICAgIFBLR19QQVRDSEVTX0RJUj0kUEtHX0ZVTExOQU1FLXBhdGNoZXMKKyAgICBQS0dfUEFUQ0hFU19GSUxFPSRTUkNfRElSLyR7UEtHX1BBVENIRVNfRElSfS50YXIueHoKKyAgICBpZiBbIC1mICIkUEtHX1BBVENIRVNfRklMRSIgXTsgdGhlbgorICAgICAgICBsb2cgIlBhdGNoaW5nICRQS0dfRlVMTE5BTUUiCisgICAgICAgIHVucGFja19hcmNoaXZlICIkUEtHX1BBVENIRVNfRklMRSIgIiREU1RfRElSIgorICAgICAgICBmb3IgUEFUQ0ggaW4gJChjZCAiJERTVF9ESVIiICYmIGxzICIkUEtHX1BBVENIRVNfRElSIi8qLnBhdGNoKTsgZG8KKyAgICAgICAgICAgIGxvZyAiQXBwbHlpbmcgcGF0Y2g6ICRQQVRDSCIKKyAgICAgICAgICAgIChjZCAiJFBLR19ESVIiICYmIHJ1biBwYXRjaCAtcDEgPCAiLi4vJFBBVENIIikgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFuaWMgIkNvdWxkIG5vdCBhcHBseSAkUEFUQ0giCisgICAgICAgIGRvbmUKKyAgICBmaQorICAgIFBLR19EU1RfRElSPSREU1RfRElSLyQocGFja2FnZV9saXN0X2dldF9zcmNfZGlyICRQS0dfTkFNRSkKKyAgICBpZiBbICIkUEtHX0RTVF9ESVIiICE9ICIkUEtHX0RJUiIgXTsgdGhlbgorICAgICAgICBsb2cgIkNvcHlpbmcgc291cmNlcyBmcm9tICRQS0dfRElSIGludG8gJFBLR19EU1RfRElSIgorICAgICAgICBjb3B5X2RpcmVjdG9yeSAiJFBLR19ESVIiICIkUEtHX0RTVF9ESVIiCisgICAgZmkKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGVzdHMvcHJlcGFyZS1yZWdpc3RyeS1mb3Itd2luZS5zaCBiL2FuZHJvaWQvdGVzdHMvcHJlcGFyZS1yZWdpc3RyeS1mb3Itd2luZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGVlNjRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90ZXN0cy9wcmVwYXJlLXJlZ2lzdHJ5LWZvci13aW5lLnNoCkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL2Jhc2gKKword2luZTY0IHJlZ2VkaXQgLSA8PCBFT0YKK1JFR0VESVQ0CisKK1tIS0VZX0xPQ0FMX01BQ0hJTkVcU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cSW5zdGFsbGVyXFVzZXJEYXRhXFMtMS01LTE4XFByb2R1Y3RzXQorRU9GCmRpZmYgLS1naXQgYS9hbmRyb2lkL3Rlc3RzL3Rlc3QtY29uc29sZS1kcm9wcy1iYWQtcmVxdWVzdHMuc2ggYi9hbmRyb2lkL3Rlc3RzL3Rlc3QtY29uc29sZS1kcm9wcy1iYWQtcmVxdWVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjkyOThmNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGVzdHMvdGVzdC1jb25zb2xlLWRyb3BzLWJhZC1yZXF1ZXN0cy5zaApAQCAtMCwwICsxLDU3IEBACisjIS9iaW4vc2gKKworIyBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gY2hlY2sgdGhhdCBpbnZhbGlkIHJlcXVlc3RzIG9uIHRoZSBjb25zb2xlCisjIHBvcnQgZ2V0IHRoZSBjb25uZWN0aW9uIGRyb3BwZWQgd2l0aCBhIHByb3BlciBLTy4KKworZGllICgpIHsKKyAgZWNobyAiRVJST1I6ICRAIgorICBleGl0IDEKK30KKworIyAkMTogRmlyc3Qgc3RyaW5nCisjICQyOiBTZWNvbmQgc3RyaW5nCisjICQzOiBFcnJvciBtZXNzYWdlIChvcHRpb25hbCkuCitleHBlY3Rfc3RyZXEgKCkgeworICBsb2NhbCBGSVJTVCBTRUNPTkQKKyAgRklSU1Q9JDEKKyAgU0VDT05EPSQyCisgIGlmIFsgIiRGSVJTVCIgIT0gIiRTRUNPTkQiIF07IHRoZW4KKyAgICBpZiBbICIkMyIgXTsgdGhlbgorICAgICAgICBwcmludGYgIiVzXG4iICIkMyIKKyAgICBmaQorICAgIGVjaG8gIkVSUk9SOiBTdHJpbmcgbWlzbWF0Y2giCisgICAgZWNobyAiRXhwZWN0ZWQ6IFskRklSU1RdIgorICAgIGVjaG8gIkFjdHVhbDogICBbJFNFQ09ORF0iCisgICAgZXhpdCAxCisgIGZpCit9CisKK2Nhc2UgIiRBTkRST0lEX1NFUklBTCIgaW4KKyAgZW11bGF0b3ItKikKKyAgICBFTVVMQVRPUl9QT1JUPSR7QU5EUk9JRF9TRVJJQUwjI2VtdWxhdG9yLX0KKyAgICA7OworICAqKQorICAgIEVNVUxBVE9SX1BPUlQ9NTU1NAorICAgIDs7Citlc2FjCisKK0NPTlNPTEVfMT0kKGVjaG8gInF1aXQiIHwgbmMgbG9jYWxob3N0ICRFTVVMQVRPUl9QT1JUKQorZXhwZWN0X3N0cmVxIFwKKyAgICAiJChwcmludGYgIkFuZHJvaWQgQ29uc29sZTogdHlwZSAnaGVscCcgZm9yIGEgbGlzdCBvZiBjb21tYW5kc1xyXG5PS1xyXG4iKSIgXAorICAgICIkQ09OU09MRV8xIiBcCisgICAgIk5vIGVtdWxhdG9yIGNvbnNvbGUgb24gcG9ydCAkRU1VTEFUT1JfUE9SVCIKKworQ09OU09MRV8yPSQoZWNobyAiR0VUIC9pbmRleC5odG1sIEhUVFAvMS4wXHJcbiIgfCBuYyBsb2NhbGhvc3QgJEVNVUxBVE9SX1BPUlQgfCB0YWlsIC0xKQorZXhwZWN0X3N0cmVxIFwKKyAgICAiJChwcmludGYgIktPOiBGb3JiaWRkZW4gSFRUUCByZXF1ZXN0LiBBYm9ydGluZ1xyXG4iKSIgXAorICAgICIkQ09OU09MRV8yIiBcCisgICAgIkhUVFAgcmVxdWVzdCB3YXMgbm90IGRyb3BwZWQgYXMgZXhwZWN0ZWQuIgorCitDT05TT0xFXzM9JChwcmludGYgIkhlbGxvIFx4ODBceDgwIFdvcmxkXHJcbiIgfCBuYyBsb2NhbGhvc3QgJEVNVUxBVE9SX1BPUlQgfCB0YWlsIC0xKQorZXhwZWN0X3N0cmVxIFwKKyAgICAiJChwcmludGYgIktPOiBGb3JiaWRkZW4gYmluYXJ5IHJlcXVlc3QuIEFib3J0aW5nXHJcbiIpIiBcCisgICAgIiRDT05TT0xFXzMiIFwKKyAgICAiQmluYXJ5IHJlcXVlc3Qgd2FzIG5vdCBkcm9wcGVkIGFzIGV4cGVjdGVkLiIKKworZWNobyAiT0siCitleGl0IDAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvUHJvdG9idWYubWsgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L1Byb3RvYnVmLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWMyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L1Byb3RvYnVmLm1rCkBAIC0wLDAgKzEsMTEgQEAKKyMgUHJvdG9idWYgc3VwcG9ydCBmb3IgdGhlIGVtdWxhdG9yIGNvZGUKKworUFJPVE9CVUZfVE9QX0RJUiA6PSAkKFBST1RPQlVGX1BSRUJVSUxUU19ESVIpLyQoQlVJTERfVEFSR0VUX1RBRykKK1BST1RPQ19UT09MIDo9ICQoUFJPVE9CVUZfUFJFQlVJTFRTX0RJUikvJChCVUlMRF9IT1NUX1RBRzY0KS9iaW4vcHJvdG9jCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSwgXAorICAgIGVtdWxhdG9yLXByb3RvYnVmLCBcCisgICAgJChQUk9UT0JVRl9UT1BfRElSKS9saWIvbGlicHJvdG9idWYuYSkKKworUFJPVE9CVUZfSU5DTFVERVMgOj0gJChQUk9UT0JVRl9UT1BfRElSKS9pbmNsdWRlCitQUk9UT0JVRl9TVEFUSUNfTElCUkFSSUVTIDo9IGVtdWxhdG9yLXByb3RvYnVmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L1F0NS5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvUXQ1Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTRiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L1F0NS5tawpAQCAtMCwwICsxLDMxIEBACitRVF9UT1BfRElSIDo9ICQoUVRfUFJFQlVJTFRTX0RJUikvJChCVUlMRF9UQVJHRVRfVEFHKQorUVRfVE9QNjRfRElSIDo9ICQoUVRfUFJFQlVJTFRTX0RJUikvJChCVUlMRF9UQVJHRVRfT1MpLXg4Nl82NAorUVRfTU9DX1RPT0wgOj0gJChRVF9UT1A2NF9ESVIpL2Jpbi9tb2MKK1FUX1JDQ19UT09MIDo9ICQoUVRfVE9QNjRfRElSKS9iaW4vcmNjCisjIFNwZWNpYWwtY2FzZTogdGhlICd1aWMnIHRvb2wgZGVwZW5kcyBvbiBRdDVDb3JlOiBhbHdheXMgZW5zdXJlIHRoYXQgdGhlCisjIHZlcnNpb24gdGhhdCBpcyBiZWluZyB1c2VkIGlzIGZyb20gdGhlIHByZWJ1aWx0cyBkaXJlY3RvcnkuIE90aGVyd2lzZQorIyB0aGUgZXhlY3V0YWJsZSBtYXkgZmFpbCB0byBzdGFydCBkdWUgdG8gZHluYW1pYyBsaW5raW5nIHByb2JsZW1zLgorUVRfVUlDX1RPT0xfTERQQVRIIDo9ICQoUVRfVE9QNjRfRElSKS9saWIKK1FUX1VJQ19UT09MIDo9ICQoUVRfVE9QNjRfRElSKS9iaW4vdWljCisKK1FUX0xETElCUyA6PSAtbFF0NVdpZGdldHMgLWxRdDVHdWkgLWxRdDVDb3JlCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICAjIE9uIFdpbmRvd3MsIGxpbmtpbmcgdG8gbWluZ3czMiBpcyByZXF1aXJlZC4gVGhlIGxpYnJhcnkgaXMgcHJvdmlkZWQKKyAgICAjIGJ5IHRoZSB0b29sY2hhaW4sIGFuZCBkZXBlbmRzIG9uIGEgbWFpbigpIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHF0bWFpbgorICAgICMgd2hpY2ggaXRzZWxmIGRlcGVuZHMgb24gcU1haW4oKS4gVGhlc2UgbXVzdCBhcHBlYXIgaW4gTERGTEFHUyBhbmQKKyAgICAjIG5vdCBMRExJQlMgc2luY2UgcU1haW4oKSBpcyBwcm92aWRlZCBieSBvYmplY3QvbGlicmFyaWVzIHRoYXQKKyAgICAjIGFwcGVhciBhZnRlciB0aGVzZSBpbiB0aGUgbGluayBjb21tYW5kLWxpbmUuCisgICAgUVRfTERGTEFHUyArPSBcCisgICAgICAgICAgICAtTCQoUVRfVE9QX0RJUikvYmluIFwKKyAgICAgICAgICAgIC1sbWluZ3czMiBcCisgICAgICAgICAgICAkKFFUX1RPUF9ESVIpL2xpYi9saWJxdG1haW4uYQorZWxzZQorICAgIFFUX0xERkxBR1MgOj0gLUwkKFFUX1RPUF9ESVIpL2xpYgorZW5kaWYKKworUVRfSU5DTFVERV9ESVIgOj0gJChRVF9QUkVCVUlMVFNfRElSKS9jb21tb24vaW5jbHVkZQorUVRfSU5DTFVERVMgOj0gXAorICAgICQoUVRfSU5DTFVERV9ESVIpIFwKKyAgICAkKFFUX0lOQ0xVREVfRElSKS9RdENvcmUgXAorICAgICQoUVRfSU5DTFVERV9ESVIpL1F0R3VpIFwKKyAgICAkKFFUX0lOQ0xVREVfRElSKS9RdFdpZGdldHMgXApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9SRUFETUUgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDE5ZDEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9SRUFETUUKQEAgLTAsMCArMSwyIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgc291cmNlcyBvZiB2YXJpb3VzIHRoaXJkLXBhcnR5IGxpYnJhcmllcyB1c2VkCitieSB0aGUgQW5kcm9pZCBlbXVsYXRvciBidWlsZC4gUGx1cyBhIGZldyBoZWxwZXIgc2NyaXB0cy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9SRUFETUUgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGVmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvUkVBRE1FCkBAIC0wLDAgKzEsNCBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBjb3B5IG9mIHRoZSAkQU9TUC9zeXN0ZW0vZXh0cmFzL2V4dDRfdXRpbHMKK2xpYnJhcnkgYXQgdGhlIGZvbGxvd2luZyBjb21taXQ6CisKKyAgICA5YzgyNTU0ZWUzMjg0YjU3ZGY5ZDhkZmRmMTE0NjcwNjZhYjA4NzdhCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvaW5jbHVkZS9tYWtlX2V4dDRmcy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL2luY2x1ZGUvbWFrZV9leHQ0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE3YWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL2luY2x1ZGUvbWFrZV9leHQ0ZnMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTUFLRV9FWFQ0RlNfSF8KKyNkZWZpbmUgX01BS0VfRVhUNEZTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHNlbGFiZWxfaGFuZGxlOworCitpbnQgbWFrZV9leHQ0ZnMoY29uc3QgY2hhciAqZmlsZW5hbWUsIGxvbmcgbG9uZyBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW91bnRwb2ludCwgc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhuZCk7CisKK2ludCBtYWtlX2V4dDRmc19mcm9tX2Rpcihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZGlybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgbGVuLCBjb25zdCBjaGFyICptb3VudHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VobmQpOworCitpbnQgbWFrZV9leHQ0ZnNfZXh0cmEoY29uc3QgY2hhciAqZmlsZW5hbWUsIGxvbmcgbG9uZyBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW91bnRwb2ludCwgc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhuZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lwZSwgaW50IHZlcmJvc2UpOworCitpbnQgbWFrZV9leHQ0ZnNfc3BhcnNlX2ZkKGludCBmZCwgbG9uZyBsb25nIGxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb3VudHBvaW50LCBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvaW5jbHVkZS9wcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jYXBhYmlsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUwNWNkYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9pbmNsdWRlL3ByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NhcGFiaWxpdHkuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUYWtlbiBmcm9tIGxpbnV4L2NhcGFiaWxpdHkuaCwgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zCisgKi8KKworI2lmbmRlZiBfU1lTVEVNX0NPUkVfSU5DTFVERV9QUklWQVRFX0FORFJPSURfRklMRVNZU1RFTV9DQVBBQklMSVRZX0gKKyNkZWZpbmUgX1NZU1RFTV9DT1JFX0lOQ0xVREVfUFJJVkFURV9BTkRST0lEX0ZJTEVTWVNURU1fQ0FQQUJJTElUWV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBfX3VzZXIKKyNkZWZpbmUgX191MzIgdWludDMyX3QKKyNkZWZpbmUgX19sZTMyIHVpbnQzMl90CisKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8xIDB4MTk5ODAzMzAKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18xIDEKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8yIDB4MjAwNzEwMjYKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18yIDIKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8zIDB4MjAwODA1MjIKKyNkZWZpbmUgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18zIDIKKwordHlwZWRlZiBzdHJ1Y3QgX191c2VyX2NhcF9oZWFkZXJfc3RydWN0IHsKKyBfX3UzMiB2ZXJzaW9uOworIGludCBwaWQ7Cit9IF9fdXNlciAqY2FwX3VzZXJfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9fdXNlcl9jYXBfZGF0YV9zdHJ1Y3QgeworIF9fdTMyIGVmZmVjdGl2ZTsKKyBfX3UzMiBwZXJtaXR0ZWQ7CisgX191MzIgaW5oZXJpdGFibGU7Cit9IF9fdXNlciAqY2FwX3VzZXJfZGF0YV90OworCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fTUFTSyAweEZGMDAwMDAwCisjZGVmaW5lIFZGU19DQVBfUkVWSVNJT05fU0hJRlQgMjQKKyNkZWZpbmUgVkZTX0NBUF9GTEFHU19NQVNLIH5WRlNfQ0FQX1JFVklTSU9OX01BU0sKKyNkZWZpbmUgVkZTX0NBUF9GTEFHU19FRkZFQ1RJVkUgMHgwMDAwMDEKKyNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTl8xIDB4MDEwMDAwMDAKKyNkZWZpbmUgVkZTX0NBUF9VMzJfMSAxCisjZGVmaW5lIFhBVFRSX0NBUFNfU1pfMSAoc2l6ZW9mKF9fbGUzMikqKDEgKyAyKlZGU19DQVBfVTMyXzEpKQorI2RlZmluZSBWRlNfQ0FQX1JFVklTSU9OXzIgMHgwMjAwMDAwMAorI2RlZmluZSBWRlNfQ0FQX1UzMl8yIDIKKyNkZWZpbmUgWEFUVFJfQ0FQU19TWl8yIChzaXplb2YoX19sZTMyKSooMSArIDIqVkZTX0NBUF9VMzJfMikpCisjZGVmaW5lIFhBVFRSX0NBUFNfU1ogWEFUVFJfQ0FQU19TWl8yCisjZGVmaW5lIFZGU19DQVBfVTMyIFZGU19DQVBfVTMyXzIKKyNkZWZpbmUgVkZTX0NBUF9SRVZJU0lPTiBWRlNfQ0FQX1JFVklTSU9OXzIKKworc3RydWN0IHZmc19jYXBfZGF0YSB7CisgX19sZTMyIG1hZ2ljX2V0YzsKKyBzdHJ1Y3QgeworIF9fbGUzMiBwZXJtaXR0ZWQ7CisgX19sZTMyIGluaGVyaXRhYmxlOworIH0gZGF0YVtWRlNfQ0FQX1UzMl07Cit9OworCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1ZFUlNJT04gX0xJTlVYX0NBUEFCSUxJVFlfVkVSU0lPTl8xCisjZGVmaW5lIF9MSU5VWF9DQVBBQklMSVRZX1UzMlMgX0xJTlVYX0NBUEFCSUxJVFlfVTMyU18xCisjZGVmaW5lIENBUF9DSE9XTiAwCisjZGVmaW5lIENBUF9EQUNfT1ZFUlJJREUgMQorI2RlZmluZSBDQVBfREFDX1JFQURfU0VBUkNIIDIKKyNkZWZpbmUgQ0FQX0ZPV05FUiAzCisjZGVmaW5lIENBUF9GU0VUSUQgNAorI2RlZmluZSBDQVBfS0lMTCA1CisjZGVmaW5lIENBUF9TRVRHSUQgNgorI2RlZmluZSBDQVBfU0VUVUlEIDcKKyNkZWZpbmUgQ0FQX1NFVFBDQVAgOAorI2RlZmluZSBDQVBfTElOVVhfSU1NVVRBQkxFIDkKKyNkZWZpbmUgQ0FQX05FVF9CSU5EX1NFUlZJQ0UgMTAKKyNkZWZpbmUgQ0FQX05FVF9CUk9BRENBU1QgMTEKKyNkZWZpbmUgQ0FQX05FVF9BRE1JTiAxMgorI2RlZmluZSBDQVBfTkVUX1JBVyAxMworI2RlZmluZSBDQVBfSVBDX0xPQ0sgMTQKKyNkZWZpbmUgQ0FQX0lQQ19PV05FUiAxNQorI2RlZmluZSBDQVBfU1lTX01PRFVMRSAxNgorI2RlZmluZSBDQVBfU1lTX1JBV0lPIDE3CisjZGVmaW5lIENBUF9TWVNfQ0hST09UIDE4CisjZGVmaW5lIENBUF9TWVNfUFRSQUNFIDE5CisjZGVmaW5lIENBUF9TWVNfUEFDQ1QgMjAKKyNkZWZpbmUgQ0FQX1NZU19BRE1JTiAyMQorI2RlZmluZSBDQVBfU1lTX0JPT1QgMjIKKyNkZWZpbmUgQ0FQX1NZU19OSUNFIDIzCisjZGVmaW5lIENBUF9TWVNfUkVTT1VSQ0UgMjQKKyNkZWZpbmUgQ0FQX1NZU19USU1FIDI1CisjZGVmaW5lIENBUF9TWVNfVFRZX0NPTkZJRyAyNgorI2RlZmluZSBDQVBfTUtOT0QgMjcKKyNkZWZpbmUgQ0FQX0xFQVNFIDI4CisjZGVmaW5lIENBUF9BVURJVF9XUklURSAyOQorI2RlZmluZSBDQVBfQVVESVRfQ09OVFJPTCAzMAorI2RlZmluZSBDQVBfU0VURkNBUCAzMQorI2RlZmluZSBDQVBfTUFDX09WRVJSSURFIDMyCisjZGVmaW5lIENBUF9NQUNfQURNSU4gMzMKKyNkZWZpbmUgQ0FQX1NZU0xPRyAzNAorI2RlZmluZSBDQVBfV0FLRV9BTEFSTSAzNQorI2RlZmluZSBDQVBfTEFTVF9DQVAgQ0FQX1dBS0VfQUxBUk0KKyNkZWZpbmUgY2FwX3ZhbGlkKHgpICgoeCkgPj0gMCAmJiAoeCkgPD0gQ0FQX0xBU1RfQ0FQKQorI2RlZmluZSBDQVBfVE9fSU5ERVgoeCkgKCh4KSA+PiA1KQorI2RlZmluZSBDQVBfVE9fTUFTSyh4KSAoMSA8PCAoKHgpICYgMzEpKQorCisjdW5kZWYgX191c2VyCisjdW5kZWYgX191MzIKKyN1bmRlZiBfX2xlMzIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc291cmNlcy5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zb3VyY2VzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMjEyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc291cmNlcy5tawpAQCAtMCwwICsxLDQ4IEBACitPTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0xJQkVYVDRfVVRJTFNfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xJQkVYVDRfVVRJTFNfQ0ZMQUdTIDo9IC1ESE9TVAorTElCRVhUNF9VVElMU19DRkxBR1MgKz0gLVduby1lcnJvcgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICBMSUJFWFQ0X1VUSUxTX0NGTEFHUyArPSAtRFVTRV9NSU5HVz0xCitlbmRpZgorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1saWJleHQ0X3V0aWxzKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9hbGxvY2F0ZS5jIFwKKyAgICBzcmMvY29udGVudHMuYyBcCisgICAgc3JjL2NyYzE2LmMgXAorICAgIHNyYy9leHQ0X3NiLmMgXAorICAgIHNyYy9leHQ0X3V0aWxzLmMgXAorICAgIHNyYy9leHRlbnQuYyBcCisgICAgc3JjL2luZGlyZWN0LmMgXAorICAgIHNyYy9tYWtlX2V4dDRmcy5jIFwKKyAgICBzcmMvc2hhMS5jIFwKKyAgICBzcmMvdXVpZC5jIFwKKyAgICBzcmMvd2lwZS5jIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChMSUJFWFQ0X1VUSUxTX0lOQ0xVREVTKSBcCisgICAgJChMSUJTUEFSU0VfSU5DTFVERVMpIFwKKyAgICAkKExJQlNFTElOVVhfSU5DTFVERVMpCitMT0NBTF9DRkxBR1MgOj0gJChMSUJFWFQ0X1VUSUxTX0NGTEFHUykKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLXByb2dyYW0sZW11bGF0b3IkKEJVSUxEX1RBUkdFVF9TVUZGSVgpX21ha2VfZXh0NGZzKQorTE9DQUxfU1JDX0ZJTEVTIDo9IHNyYy9tYWtlX2V4dDRmc19tYWluLmMKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoTElCRVhUNF9VVElMU19JTkNMVURFUykgXAorICAgICQoTElCU0VMSU5VWF9JTkNMVURFUykKK0xPQ0FMX0NGTEFHUyA6PSAkKExJQkVYVDRfVVRJTFNfQ0ZMQUdTKQorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgZW11bGF0b3ItbGliZXh0NF91dGlscyBcCisgICAgZW11bGF0b3ItbGlic3BhcnNlIFwKKyAgICBlbXVsYXRvci1saWJzZWxpbnV4IFwKKyAgICBlbXVsYXRvci16bGliCiskKGNhbGwgZW5kLWVtdWxhdG9yLXByb2dyYW0pCisKK0xPQ0FMX1BBVEggOj0gJChPTERfTE9DQUxfUEFUSCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvQW5kcm9pZC5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzFiZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTQ2IEBACisjIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2xpYmV4dDRfdXRpbHNfc3JjX2ZpbGVzIDo9IFwKKyAgICBtYWtlX2V4dDRmcy5jIFwKKyAgICBleHQ0Zml4dXAuYyBcCisgICAgZXh0NF91dGlscy5jIFwKKyAgICBhbGxvY2F0ZS5jIFwKKyAgICBjb250ZW50cy5jIFwKKyAgICBleHRlbnQuYyBcCisgICAgaW5kaXJlY3QuYyBcCisgICAgdXVpZC5jIFwKKyAgICBzaGExLmMgXAorICAgIHdpcGUuYyBcCisgICAgY3JjMTYuYyBcCisgICAgZXh0NF9zYi5jCisKKyMKKyMgLS0gQWxsIGhvc3QvdGFyZ2V0cyBpbmNsdWRpbmcgd2luZG93cworIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGxpYmV4dDRfdXRpbHNfc3JjX2ZpbGVzKQorTE9DQUxfTU9EVUxFIDo9IGxpYmV4dDRfdXRpbHNfaG9zdAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlic3BhcnNlX2hvc3QgXAorICAgIGxpYnoKK2lmbmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJzZWxpbnV4CitlbmRpZgoraW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gbWFrZV9leHQ0ZnNfbWFpbi5jCitMT0NBTF9NT0RVTEUgOj0gbWFrZV9leHQ0ZnMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gXAorICAgIGxpYmV4dDRfdXRpbHNfaG9zdCBcCisgICAgbGlic3BhcnNlX2hvc3QgXAorICAgIGxpYnoKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICBMT0NBTF9MRExJQlMgKz0gLWx3czJfMzIKK2Vsc2UKKyAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJzZWxpbnV4CisgIExPQ0FMX0NGTEFHUyA6PSAtREhPU1QKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCisKKyMKKyMgLS0gQWxsIGhvc3QvdGFyZ2V0cyBleGNsdWRpbmcgd2luZG93cworIworCitpZm5lcSAoJChCVUlMRF9UQVJHRVRfT1MpLHdpbmRvd3MpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQobGliZXh0NF91dGlsc19zcmNfZmlsZXMpCitMT0NBTF9NT0RVTEUgOj0gbGliZXh0NF91dGlscworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGlic2VsaW51eCBcCisgICAgbGlic3BhcnNlIFwKKyAgICBsaWJ6CitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gJChsaWJleHQ0X3V0aWxzX3NyY19maWxlcykKK0xPQ0FMX01PRFVMRSA6PSBsaWJleHQ0X3V0aWxzX3N0YXRpYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCisgICAgbGlic2VsaW51eCBcCisgICAgbGlic3BhcnNlX3N0YXRpYworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IG1ha2VfZXh0NGZzX21haW4uYworTE9DQUxfTU9EVUxFIDo9IG1ha2VfZXh0NGZzCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJleHQ0X3V0aWxzIFwKKyAgICBsaWJzZWxpbnV4IFwKKyAgICBsaWJ6CitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBleHQyc2ltZy5jCitMT0NBTF9NT0RVTEUgOj0gZXh0MnNpbWcKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorICAgIGxpYmV4dDRfdXRpbHMgXAorICAgIGxpYnNlbGludXggXAorICAgIGxpYnNwYXJzZSBcCisgICAgbGliegoraW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gZXh0MnNpbWcuYworTE9DQUxfTU9EVUxFIDo9IGV4dDJzaW1nCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IFwKKyAgICBsaWJleHQ0X3V0aWxzX2hvc3QgXAorICAgIGxpYnNlbGludXggXAorICAgIGxpYnNwYXJzZV9ob3N0IFwKKyAgICBsaWJ6CitpbmNsdWRlICQoQlVJTERfSE9TVF9FWEVDVVRBQkxFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IHNldHVwX2ZzLmMKK0xPQ0FMX01PRFVMRSA6PSBzZXR1cF9mcworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfU1JDX0ZJTEVTIDo9IGV4dDRmaXh1cF9tYWluLmMKK0xPQ0FMX01PRFVMRSA6PSBleHQ0Zml4dXAKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAorICAgIGxpYmV4dDRfdXRpbHMgXAorICAgIGxpYnNwYXJzZSBcCisgICAgbGliegoraW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVMgOj0gZXh0NGZpeHVwX21haW4uYworTE9DQUxfTU9EVUxFIDo9IGV4dDRmaXh1cAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBcCisgICAgbGliZXh0NF91dGlsc19ob3N0IFwKKyAgICBsaWJzcGFyc2VfaG9zdCBcCisgICAgbGliegoraW5jbHVkZSAkKEJVSUxEX0hPU1RfRVhFQ1VUQUJMRSkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBta3VzZXJpbWcuc2gKK0xPQ0FMX1NSQ19GSUxFUyA6PSBta3VzZXJpbWcuc2gKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFWEVDVVRBQkxFUworIyBXZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIHN1ZmZpeC4KK0xPQ0FMX01PRFVMRV9TVUZGSVggOj0KK0xPQ0FMX0JVSUxUX01PRFVMRV9TVEVNIDo9ICQobm90ZGlyICQoTE9DQUxfU1JDX0ZJTEVTKSkKK0xPQ0FMX0lTX0hPU1RfTU9EVUxFIDo9IHRydWUKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvTk9USUNFIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNDI5MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvTk9USUNFCkBAIC0wLDAgKzEsMTkwIEBACisKKyAgIENvcHlyaWdodCAoYykgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvYWxsb2NhdGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvYWxsb2NhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk3MjcwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9hbGxvY2F0ZS5jCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJhbGxvY2F0ZS5oIgorCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RydWN0IHJlZ2lvbl9saXN0IHsKKwlzdHJ1Y3QgcmVnaW9uICpmaXJzdDsKKwlzdHJ1Y3QgcmVnaW9uICpsYXN0OworCXN0cnVjdCByZWdpb24gKml0ZXI7CisJdTMyIHBhcnRpYWxfaXRlcjsKK307CisKK3N0cnVjdCBibG9ja19hbGxvY2F0aW9uIHsKKwlzdHJ1Y3QgcmVnaW9uX2xpc3QgbGlzdDsKKwlzdHJ1Y3QgcmVnaW9uX2xpc3Qgb29iX2xpc3Q7Cit9OworCitzdHJ1Y3QgcmVnaW9uIHsKKwl1MzIgYmxvY2s7CisJdTMyIGxlbjsKKwlpbnQgYmc7CisJc3RydWN0IHJlZ2lvbiAqbmV4dDsKKwlzdHJ1Y3QgcmVnaW9uICpwcmV2OworfTsKKworc3RydWN0IGJsb2NrX2dyb3VwX2luZm8geworCXUzMiBmaXJzdF9ibG9jazsKKwlpbnQgaGVhZGVyX2Jsb2NrczsKKwlpbnQgZGF0YV9ibG9ja3NfdXNlZDsKKwlpbnQgaGFzX3N1cGVyYmxvY2s7CisJdTggKmJpdG1hcHM7CisJdTggKmJsb2NrX2JpdG1hcDsKKwl1OCAqaW5vZGVfYml0bWFwOworCXU4ICppbm9kZV90YWJsZTsKKwl1MzIgZnJlZV9ibG9ja3M7CisJdTMyIGZpcnN0X2ZyZWVfYmxvY2s7CisJdTMyIGZyZWVfaW5vZGVzOworCXUzMiBmaXJzdF9mcmVlX2lub2RlOworCXUxNiBmbGFnczsKKwl1MTYgdXNlZF9kaXJzOworfTsKKworc3RydWN0IHhhdHRyX2xpc3RfZWxlbWVudCB7CisJc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlOworCXN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCB4YXR0cl9saXN0X2VsZW1lbnQgKm5leHQ7Cit9OworCitzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqY3JlYXRlX2FsbG9jYXRpb24oKQoreworCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX2FsbG9jYXRpb24pKTsKKwlhbGxvYy0+bGlzdC5maXJzdCA9IE5VTEw7CisJYWxsb2MtPmxpc3QubGFzdCA9IE5VTEw7CisJYWxsb2MtPm9vYl9saXN0LmZpcnN0ID0gTlVMTDsKKwlhbGxvYy0+b29iX2xpc3QubGFzdCA9IE5VTEw7CisJYWxsb2MtPmxpc3QuaXRlciA9IE5VTEw7CisJYWxsb2MtPmxpc3QucGFydGlhbF9pdGVyID0gMDsKKwlhbGxvYy0+b29iX2xpc3QuaXRlciA9IE5VTEw7CisJYWxsb2MtPm9vYl9saXN0LnBhcnRpYWxfaXRlciA9IDA7CisJcmV0dXJuIGFsbG9jOworfQorCitzdGF0aWMgc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyICp4YXR0cl9saXN0X2ZpbmQoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCB4YXR0cl9saXN0X2VsZW1lbnQgKmVsZW1lbnQ7CisJZm9yIChlbGVtZW50ID0gYXV4X2luZm8ueGF0dHJzOyBlbGVtZW50ICE9IE5VTEw7IGVsZW1lbnQgPSBlbGVtZW50LT5uZXh0KSB7CisJCWlmIChlbGVtZW50LT5pbm9kZSA9PSBpbm9kZSkKKwkJCXJldHVybiBlbGVtZW50LT5oZWFkZXI7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB4YXR0cl9saXN0X2luc2VydChzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqaGVhZGVyKQoreworCXN0cnVjdCB4YXR0cl9saXN0X2VsZW1lbnQgKmVsZW1lbnQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB4YXR0cl9saXN0X2VsZW1lbnQpKTsKKwllbGVtZW50LT5pbm9kZSA9IGlub2RlOworCWVsZW1lbnQtPmhlYWRlciA9IGhlYWRlcjsKKwllbGVtZW50LT5uZXh0ID0gYXV4X2luZm8ueGF0dHJzOworCWF1eF9pbmZvLnhhdHRycyA9IGVsZW1lbnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2lvbl9saXN0X3JlbW92ZShzdHJ1Y3QgcmVnaW9uX2xpc3QgKmxpc3QsIHN0cnVjdCByZWdpb24gKnJlZykKK3sKKwlpZiAocmVnLT5wcmV2KQorCQlyZWctPnByZXYtPm5leHQgPSByZWctPm5leHQ7CisKKwlpZiAocmVnLT5uZXh0KQorCQlyZWctPm5leHQtPnByZXYgPSByZWctPnByZXY7CisKKwlpZiAobGlzdC0+Zmlyc3QgPT0gcmVnKQorCQlsaXN0LT5maXJzdCA9IHJlZy0+bmV4dDsKKworCWlmIChsaXN0LT5sYXN0ID09IHJlZykKKwkJbGlzdC0+bGFzdCA9IHJlZy0+cHJldjsKKworCXJlZy0+bmV4dCA9IE5VTEw7CisJcmVnLT5wcmV2ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVnaW9uX2xpc3RfYXBwZW5kKHN0cnVjdCByZWdpb25fbGlzdCAqbGlzdCwgc3RydWN0IHJlZ2lvbiAqcmVnKQoreworCWlmIChsaXN0LT5maXJzdCA9PSBOVUxMKSB7CisJCWxpc3QtPmZpcnN0ID0gcmVnOworCQlsaXN0LT5sYXN0ID0gcmVnOworCQlsaXN0LT5pdGVyID0gcmVnOworCQlsaXN0LT5wYXJ0aWFsX2l0ZXIgPSAwOworCQlyZWctPnByZXYgPSBOVUxMOworCX0gZWxzZSB7CisJCWxpc3QtPmxhc3QtPm5leHQgPSByZWc7CisJCXJlZy0+cHJldiA9IGxpc3QtPmxhc3Q7CisJCWxpc3QtPmxhc3QgPSByZWc7CisJfQorCXJlZy0+bmV4dCA9IE5VTEw7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBkdW1wX3N0YXJ0aW5nX2Zyb20oc3RydWN0IHJlZ2lvbiAqcmVnKQoreworCWZvciAoOyByZWc7IHJlZyA9IHJlZy0+bmV4dCkgeworCQlwcmludGYoIiVwOiBCbG9ja3MgJWQtJWQgKCVkKVxuIiwgcmVnLAorCQkJCXJlZy0+YmcgKiBpbmZvLmJsb2Nrc19wZXJfZ3JvdXAgKyByZWctPmJsb2NrLAorCQkJCXJlZy0+YmcgKiBpbmZvLmJsb2Nrc19wZXJfZ3JvdXAgKyByZWctPmJsb2NrICsgcmVnLT5sZW4gLSAxLAorCQkJCXJlZy0+bGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcmVnaW9uX2xpc3RzKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYykgeworCisJcHJpbnRmKCJNYWluIGxpc3Q6XG4iKTsKKwlkdW1wX3N0YXJ0aW5nX2Zyb20oYWxsb2MtPmxpc3QuZmlyc3QpOworCisJcHJpbnRmKCJPT0IgbGlzdDpcbiIpOworCWR1bXBfc3RhcnRpbmdfZnJvbShhbGxvYy0+b29iX2xpc3QuZmlyc3QpOworfQorI2VuZGlmCisKK3ZvaWQgYXBwZW5kX3JlZ2lvbihzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsCisJCXUzMiBibG9jaywgdTMyIGxlbiwgaW50IGJnX251bSkKK3sKKwlzdHJ1Y3QgcmVnaW9uICpyZWc7CisJcmVnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnaW9uKSk7CisJcmVnLT5ibG9jayA9IGJsb2NrOworCXJlZy0+bGVuID0gbGVuOworCXJlZy0+YmcgPSBiZ19udW07CisJcmVnLT5uZXh0ID0gTlVMTDsKKworCXJlZ2lvbl9saXN0X2FwcGVuZCgmYWxsb2MtPmxpc3QsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jYXRlX2JnX2lub2RlX3RhYmxlKHN0cnVjdCBibG9ja19ncm91cF9pbmZvICpiZykKK3sKKwlpZiAoYmctPmlub2RlX3RhYmxlICE9IE5VTEwpCisJCXJldHVybjsKKworCXUzMiBibG9jayA9IGJnLT5maXJzdF9ibG9jayArIDI7CisKKwlpZiAoYmctPmhhc19zdXBlcmJsb2NrKQorCQlibG9jayArPSBhdXhfaW5mby5iZ19kZXNjX2Jsb2NrcyArIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrcyArIDE7CisKKwliZy0+aW5vZGVfdGFibGUgPSBjYWxsb2MoYXV4X2luZm8uaW5vZGVfdGFibGVfYmxvY2tzLCBpbmZvLmJsb2NrX3NpemUpOworCWlmIChiZy0+aW5vZGVfdGFibGUgPT0gTlVMTCkKKwkJY3JpdGljYWxfZXJyb3JfZXJybm8oImNhbGxvYyIpOworCisJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgYmctPmlub2RlX3RhYmxlLAorCQkJYXV4X2luZm8uaW5vZGVfdGFibGVfYmxvY2tzCSogaW5mby5ibG9ja19zaXplLCBibG9jayk7CisKKwliZy0+ZmxhZ3MgJj0gfkVYVDRfQkdfSU5PREVfVU5JTklUOworfQorCitzdGF0aWMgaW50IGJpdG1hcF9zZXRfYml0KHU4ICpiaXRtYXAsIHUzMiBiaXQpCit7CisJaWYgKGJpdG1hcFtiaXQgLyA4XSAmIDEgPDwgKGJpdCAlIDgpKQorCQlyZXR1cm4gMTsKKworCWJpdG1hcFtiaXQgLyA4XSB8PSAxIDw8IChiaXQgJSA4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaXRtYXBfc2V0XzhfYml0cyh1OCAqYml0bWFwLCB1MzIgYml0KQoreworCWludCByZXQgPSBiaXRtYXBbYml0IC8gOF07CisJYml0bWFwW2JpdCAvIDhdID0gMHhGRjsKKwlyZXR1cm4gcmV0OworfQorCisvKiBNYXJrcyBhIHRoZSBmaXJzdCBudW1fYmxvY2tzIGJsb2NrcyBpbiBhIGJsb2NrIGdyb3VwIGFzIHVzZWQsIGFuZCBhY2NvdW50cworIGZvciB0aGVtIGluIHRoZSBibG9jayBncm91cCBmcmVlIGJsb2NrIGluZm8uICovCitzdGF0aWMgaW50IHJlc2VydmVfYmxvY2tzKHN0cnVjdCBibG9ja19ncm91cF9pbmZvICpiZywgdTMyIHN0YXJ0LCB1MzIgbnVtKQoreworCXVuc2lnbmVkIGludCBpID0gMDsKKworCXUzMiBibG9jayA9IHN0YXJ0OworCWlmIChudW0gPiBiZy0+ZnJlZV9ibG9ja3MpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBudW0gJiYgYmxvY2sgJSA4ICE9IDA7IGkrKywgYmxvY2srKykgeworCQlpZiAoYml0bWFwX3NldF9iaXQoYmctPmJsb2NrX2JpdG1hcCwgYmxvY2spKSB7CisJCQllcnJvcigiYXR0ZW1wdGVkIHRvIHJlc2VydmUgYWxyZWFkeSByZXNlcnZlZCBibG9jayIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZm9yICg7IGkgKyA4IDw9IChudW0gJiB+Nyk7IGkgKz0gOCwgYmxvY2sgKz0gOCkgeworCQlpZiAoYml0bWFwX3NldF84X2JpdHMoYmctPmJsb2NrX2JpdG1hcCwgYmxvY2spKSB7CisJCQllcnJvcigiYXR0ZW1wdGVkIHRvIHJlc2VydmUgYWxyZWFkeSByZXNlcnZlZCBibG9jayIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZm9yICg7IGkgPCBudW07IGkrKywgYmxvY2srKykgeworCQlpZiAoYml0bWFwX3NldF9iaXQoYmctPmJsb2NrX2JpdG1hcCwgYmxvY2spKSB7CisJCQllcnJvcigiYXR0ZW1wdGVkIHRvIHJlc2VydmUgYWxyZWFkeSByZXNlcnZlZCBibG9jayIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJYmctPmZyZWVfYmxvY2tzIC09IG51bTsKKwlpZiAoc3RhcnQgPT0gYmctPmZpcnN0X2ZyZWVfYmxvY2spCisJCWJnLT5maXJzdF9mcmVlX2Jsb2NrID0gc3RhcnQgKyBudW07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ibG9ja3Moc3RydWN0IGJsb2NrX2dyb3VwX2luZm8gKmJnLCB1MzIgbnVtX2Jsb2NrcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgYmxvY2sgPSBiZy0+Zmlyc3RfZnJlZV9ibG9jayAtIDE7CisJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKywgYmxvY2stLSkKKwkJYmctPmJsb2NrX2JpdG1hcFtibG9jayAvIDhdICY9IH4oMSA8PCAoYmxvY2sgJSA4KSk7CisJYmctPmZyZWVfYmxvY2tzICs9IG51bV9ibG9ja3M7CisJYmctPmZpcnN0X2ZyZWVfYmxvY2sgLT0gbnVtX2Jsb2NrczsKK30KKworLyogUmVkdWNlcyBhbiBleGlzdGluZyBhbGxvY2F0aW9uIGJ5IGxlbiBibG9ja3MgYnkgcmV0dXJuIHRoZSBsYXN0IGJsb2NrcworICAgdG8gdGhlIGZyZWUgcG9vbCBpbiB0aGVpciBibG9jayBncm91cC4gQXNzdW1lcyB0aGF0IHRoZSBibG9ja3MgYmVpbmcKKyAgIHJldHVybmVkIHdlcmUgdGhlIGxhc3Qgb25lcyBhbGxvY2F0ZWQgb3V0IG9mIHRoZSBibG9jayBncm91cCAqLwordm9pZCByZWR1Y2VfYWxsb2NhdGlvbihzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBsZW4pCit7CisJd2hpbGUgKGxlbikgeworCQlzdHJ1Y3QgcmVnaW9uICpsYXN0X3JlZyA9IGFsbG9jLT5saXN0Lmxhc3Q7CisKKwkJaWYgKGxhc3RfcmVnLT5sZW4gPiBsZW4pIHsKKwkJCWZyZWVfYmxvY2tzKCZhdXhfaW5mby5iZ3NbbGFzdF9yZWctPmJnXSwgbGVuKTsKKwkJCWxhc3RfcmVnLT5sZW4gLT0gbGVuOworCQkJbGVuID0gMDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCByZWdpb24gKnJlZyA9IGFsbG9jLT5saXN0Lmxhc3QtPnByZXY7CisJCQlmcmVlX2Jsb2NrcygmYXV4X2luZm8uYmdzW2xhc3RfcmVnLT5iZ10sIGxhc3RfcmVnLT5sZW4pOworCQkJbGVuIC09IGxhc3RfcmVnLT5sZW47CisJCQlpZiAocmVnKSB7CisJCQkJcmVnLT5uZXh0ID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJYWxsb2MtPmxpc3QuZmlyc3QgPSBOVUxMOworCQkJCWFsbG9jLT5saXN0Lmxhc3QgPSBOVUxMOworCQkJCWFsbG9jLT5saXN0Lml0ZXIgPSBOVUxMOworCQkJCWFsbG9jLT5saXN0LnBhcnRpYWxfaXRlciA9IDA7CisJCQl9CisJCQlmcmVlKGxhc3RfcmVnKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW5pdF9iZyhzdHJ1Y3QgYmxvY2tfZ3JvdXBfaW5mbyAqYmcsIHVuc2lnbmVkIGludCBpKQoreworCWludCBoZWFkZXJfYmxvY2tzID0gMiArIGF1eF9pbmZvLmlub2RlX3RhYmxlX2Jsb2NrczsKKworCWJnLT5oYXNfc3VwZXJibG9jayA9IGV4dDRfYmdfaGFzX3N1cGVyX2Jsb2NrKGkpOworCisJaWYgKGJnLT5oYXNfc3VwZXJibG9jaykKKwkJaGVhZGVyX2Jsb2NrcyArPSAxICsgYXV4X2luZm8uYmdfZGVzY19ibG9ja3MgKyBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3M7CisKKwliZy0+Yml0bWFwcyA9IGNhbGxvYyhpbmZvLmJsb2NrX3NpemUsIDIpOworCWJnLT5ibG9ja19iaXRtYXAgPSBiZy0+Yml0bWFwczsKKwliZy0+aW5vZGVfYml0bWFwID0gYmctPmJpdG1hcHMgKyBpbmZvLmJsb2NrX3NpemU7CisKKwliZy0+aGVhZGVyX2Jsb2NrcyA9IGhlYWRlcl9ibG9ja3M7CisJYmctPmZpcnN0X2Jsb2NrID0gYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jayArIGkgKiBpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7CisKKwl1MzIgYmxvY2sgPSBiZy0+Zmlyc3RfYmxvY2s7CisJaWYgKGJnLT5oYXNfc3VwZXJibG9jaykKKwkJYmxvY2sgKz0gMSArIGF1eF9pbmZvLmJnX2Rlc2NfYmxvY2tzICsgIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrczsKKwlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBiZy0+Yml0bWFwcywgMiAqIGluZm8uYmxvY2tfc2l6ZSwKKwkJCWJsb2NrKTsKKworCWJnLT5kYXRhX2Jsb2Nrc191c2VkID0gMDsKKwliZy0+ZnJlZV9ibG9ja3MgPSBpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7CisJYmctPmZpcnN0X2ZyZWVfYmxvY2sgPSAwOworCWJnLT5mcmVlX2lub2RlcyA9IGluZm8uaW5vZGVzX3Blcl9ncm91cDsKKwliZy0+Zmlyc3RfZnJlZV9pbm9kZSA9IDE7CisJYmctPmZsYWdzID0gRVhUNF9CR19JTk9ERV9VTklOSVQ7CisKKwlpZiAocmVzZXJ2ZV9ibG9ja3MoYmcsIGJnLT5maXJzdF9mcmVlX2Jsb2NrLCBiZy0+aGVhZGVyX2Jsb2NrcykgPCAwKQorCQllcnJvcigiZmFpbGVkIHRvIHJlc2VydmUgJXUgYmxvY2tzIGluIGJsb2NrIGdyb3VwICV1XG4iLCBiZy0+aGVhZGVyX2Jsb2NrcywgaSk7CisKKwlpZiAoYmctPmZpcnN0X2Jsb2NrICsgaW5mby5ibG9ja3NfcGVyX2dyb3VwID4gYXV4X2luZm8ubGVuX2Jsb2NrcykgeworCQl1MzIgb3ZlcnJ1biA9IGJnLT5maXJzdF9ibG9jayArIGluZm8uYmxvY2tzX3Blcl9ncm91cCAtIGF1eF9pbmZvLmxlbl9ibG9ja3M7CisJCXJlc2VydmVfYmxvY2tzKGJnLCBpbmZvLmJsb2Nrc19wZXJfZ3JvdXAgLSBvdmVycnVuLCBvdmVycnVuKTsKKwl9Cit9CisKK3ZvaWQgYmxvY2tfYWxsb2NhdG9yX2luaXQoKQoreworCXVuc2lnbmVkIGludCBpOworCisJYXV4X2luZm8uYmdzID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfZ3JvdXBfaW5mbyksIGF1eF9pbmZvLmdyb3Vwcyk7CisJaWYgKGF1eF9pbmZvLmJncyA9PSBOVUxMKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiY2FsbG9jIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXV4X2luZm8uZ3JvdXBzOyBpKyspCisJCWluaXRfYmcoJmF1eF9pbmZvLmJnc1tpXSwgaSk7Cit9CisKK3ZvaWQgYmxvY2tfYWxsb2NhdG9yX2ZyZWUoKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGF1eF9pbmZvLmdyb3VwczsgaSsrKSB7CisJCWZyZWUoYXV4X2luZm8uYmdzW2ldLmJpdG1hcHMpOworCQlmcmVlKGF1eF9pbmZvLmJnc1tpXS5pbm9kZV90YWJsZSk7CisJfQorCWZyZWUoYXV4X2luZm8uYmdzKTsKK30KKworc3RhdGljIHUzMiBleHQ0X2FsbG9jYXRlX2Jsb2Nrc19mcm9tX2Jsb2NrX2dyb3VwKHUzMiBsZW4sIGludCBiZ19udW0pCit7CisJaWYgKGdldF9mcmVlX2Jsb2NrcyhiZ19udW0pIDwgbGVuKQorCQlyZXR1cm4gRVhUNF9BTExPQ0FURV9GQUlMRUQ7CisKKwl1MzIgYmxvY2sgPSBhdXhfaW5mby5iZ3NbYmdfbnVtXS5maXJzdF9mcmVlX2Jsb2NrOworCXN0cnVjdCBibG9ja19ncm91cF9pbmZvICpiZyA9ICZhdXhfaW5mby5iZ3NbYmdfbnVtXTsKKwlpZiAocmVzZXJ2ZV9ibG9ja3MoYmcsIGJnLT5maXJzdF9mcmVlX2Jsb2NrLCBsZW4pIDwgMCkgeworCQllcnJvcigiZmFpbGVkIHRvIHJlc2VydmUgJXUgYmxvY2tzIGluIGJsb2NrIGdyb3VwICV1XG4iLCBsZW4sIGJnX251bSk7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlhdXhfaW5mby5iZ3NbYmdfbnVtXS5kYXRhX2Jsb2Nrc191c2VkICs9IGxlbjsKKworCXJldHVybiBiZy0+Zmlyc3RfYmxvY2sgKyBibG9jazsKK30KKworLyogQWxsb2NhdGUgYSBzaW5nbGUgYmxvY2sgYW5kIHJldHVybiBpdHMgYmxvY2sgbnVtYmVyICovCit1MzIgYWxsb2NhdGVfYmxvY2soKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBhdXhfaW5mby5ncm91cHM7IGkrKykgeworCQl1MzIgYmxvY2sgPSBleHQ0X2FsbG9jYXRlX2Jsb2Nrc19mcm9tX2Jsb2NrX2dyb3VwKDEsIGkpOworCisJCWlmIChibG9jayAhPSBFWFQ0X0FMTE9DQVRFX0ZBSUxFRCkKKwkJCXJldHVybiBibG9jazsKKwl9CisKKwlyZXR1cm4gRVhUNF9BTExPQ0FURV9GQUlMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVnaW9uICpleHQ0X2FsbG9jYXRlX2Jlc3RfZml0X3BhcnRpYWwodTMyIGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgZm91bmRfYmcgPSAwOworCXUzMiBmb3VuZF9iZ19sZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IGF1eF9pbmZvLmdyb3VwczsgaSsrKSB7CisJCXUzMiBiZ19sZW4gPSBhdXhfaW5mby5iZ3NbaV0uZnJlZV9ibG9ja3M7CisKKwkJaWYgKChsZW4gPD0gYmdfbGVuICYmIChmb3VuZF9iZ19sZW4gPT0gMCB8fCBiZ19sZW4gPCBmb3VuZF9iZ19sZW4pKSB8fAorCQkgICAgKGxlbiA+IGZvdW5kX2JnX2xlbiAmJiBiZ19sZW4gPiBmb3VuZF9iZ19sZW4pKSB7CisJCQlmb3VuZF9iZyA9IGk7CisJCQlmb3VuZF9iZ19sZW4gPSBiZ19sZW47CisJCX0KKwl9CisKKwlpZiAoZm91bmRfYmdfbGVuKSB7CisJCXUzMiBhbGxvY2F0ZV9sZW4gPSBtaW4obGVuLCBmb3VuZF9iZ19sZW4pOworCQlzdHJ1Y3QgcmVnaW9uICpyZWc7CisJCXUzMiBibG9jayA9IGV4dDRfYWxsb2NhdGVfYmxvY2tzX2Zyb21fYmxvY2tfZ3JvdXAoYWxsb2NhdGVfbGVuLCBmb3VuZF9iZyk7CisJCWlmIChibG9jayA9PSBFWFQ0X0FMTE9DQVRFX0ZBSUxFRCkgeworCQkJZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSAlZCBibG9ja3MgaW4gYmxvY2sgZ3JvdXAgJWQiLCBhbGxvY2F0ZV9sZW4sIGZvdW5kX2JnKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXJlZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ2lvbikpOworCQlyZWctPmJsb2NrID0gYmxvY2s7CisJCXJlZy0+bGVuID0gYWxsb2NhdGVfbGVuOworCQlyZWctPm5leHQgPSBOVUxMOworCQlyZWctPnByZXYgPSBOVUxMOworCQlyZWctPmJnID0gZm91bmRfYmc7CisJCXJldHVybiByZWc7CisJfSBlbHNlIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSAldSBibG9ja3MsIG91dCBvZiBzcGFjZT8iLCBsZW4pOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IHJlZ2lvbiAqZXh0NF9hbGxvY2F0ZV9iZXN0X2ZpdCh1MzIgbGVuKQoreworCXN0cnVjdCByZWdpb24gKmZpcnN0X3JlZyA9IE5VTEw7CisJc3RydWN0IHJlZ2lvbiAqcHJldl9yZWcgPSBOVUxMOworCXN0cnVjdCByZWdpb24gKnJlZzsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXJlZyA9IGV4dDRfYWxsb2NhdGVfYmVzdF9maXRfcGFydGlhbChsZW4pOworCQlpZiAocmVnID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoZmlyc3RfcmVnID09IE5VTEwpCisJCQlmaXJzdF9yZWcgPSByZWc7CisKKwkJaWYgKHByZXZfcmVnKSB7CisJCQlwcmV2X3JlZy0+bmV4dCA9IHJlZzsKKwkJCXJlZy0+cHJldiA9IHByZXZfcmVnOworCQl9CisKKwkJcHJldl9yZWcgPSByZWc7CisJCWxlbiAtPSByZWctPmxlbjsKKwl9CisKKwlyZXR1cm4gZmlyc3RfcmVnOworfQorCisvKiBBbGxvY2F0ZSBsZW4gYmxvY2tzLiAgVGhlIGJsb2NrcyBtYXkgYmUgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBibG9jayBncm91cHMsCisgICBhbmQgYXJlIHJldHVybmVkIGluIGEgbGlua2VkIGxpc3Qgb2YgdGhlIGJsb2NrcyBpbiBlYWNoIGJsb2NrIGdyb3VwLiAgVGhlCisgICBhbGxvY2F0aW9uIGFsZ29yaXRobSBpczoKKyAgICAgIDEuICBJZiB0aGUgcmVtYWluaW5nIGFsbG9jYXRpb24gaXMgbGFyZ2VyIHRoYW4gYW55IGF2YWlsYWJsZSBjb250aWd1b3VzIHJlZ2lvbiwKKyAgICAgICAgICBhbGxvY2F0ZSB0aGUgbGFyZ2VzdCBjb250aWd1b3VzIHJlZ2lvbiBhbmQgbG9vcAorICAgICAgMi4gIE90aGVyd2lzZSwgYWxsb2NhdGUgdGhlIHNtYWxsZXN0IGNvbnRpZ3VvdXMgcmVnaW9uIHRoYXQgaXQgZml0cyBpbgorKi8KK3N0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvY2F0ZV9ibG9ja3ModTMyIGxlbikKK3sKKwlzdHJ1Y3QgcmVnaW9uICpyZWcgPSBleHQ0X2FsbG9jYXRlX2Jlc3RfZml0KGxlbik7CisKKwlpZiAocmVnID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jID0gY3JlYXRlX2FsbG9jYXRpb24oKTsKKwlhbGxvYy0+bGlzdC5maXJzdCA9IHJlZzsKKwlhbGxvYy0+bGlzdC5sYXN0ID0gcmVnOworCWFsbG9jLT5saXN0Lml0ZXIgPSBhbGxvYy0+bGlzdC5maXJzdDsKKwlhbGxvYy0+bGlzdC5wYXJ0aWFsX2l0ZXIgPSAwOworCXJldHVybiBhbGxvYzsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc2NvbnRpZ3VvdXMgcmVnaW9ucyB1c2VkIGJ5IGFuIGFsbG9jYXRpb24gKi8KK2ludCBibG9ja19hbGxvY2F0aW9uX251bV9yZWdpb25zKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcmVnaW9uICpyZWcgPSBhbGxvYy0+bGlzdC5maXJzdDsKKworCWZvciAoaSA9IDA7IHJlZyAhPSBOVUxMOyByZWcgPSByZWctPm5leHQpCisJCWkrKzsKKworCXJldHVybiBpOworfQorCitpbnQgYmxvY2tfYWxsb2NhdGlvbl9sZW4oc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCByZWdpb24gKnJlZyA9IGFsbG9jLT5saXN0LmZpcnN0OworCisJZm9yIChpID0gMDsgcmVnICE9IE5VTEw7IHJlZyA9IHJlZy0+bmV4dCkKKwkJaSArPSByZWctPmxlbjsKKworCXJldHVybiBpOworfQorCisvKiBSZXR1cm5zIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGJsb2NrJ3RoIGJsb2NrIGluIGFuIGFsbG9jYXRpb24gKi8KK3UzMiBnZXRfYmxvY2soc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCB1MzIgYmxvY2spCit7CisJc3RydWN0IHJlZ2lvbiAqcmVnID0gYWxsb2MtPmxpc3QuaXRlcjsKKwlibG9jayArPSBhbGxvYy0+bGlzdC5wYXJ0aWFsX2l0ZXI7CisKKwlmb3IgKDsgcmVnOyByZWcgPSByZWctPm5leHQpIHsKKwkJaWYgKGJsb2NrIDwgcmVnLT5sZW4pCisJCQlyZXR1cm4gcmVnLT5ibG9jayArIGJsb2NrOworCQlibG9jayAtPSByZWctPmxlbjsKKwl9CisJcmV0dXJuIEVYVDRfQUxMT0NBVEVfRkFJTEVEOworfQorCit1MzIgZ2V0X29vYl9ibG9jayhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgcmVnaW9uICpyZWcgPSBhbGxvYy0+b29iX2xpc3QuaXRlcjsKKwlibG9jayArPSBhbGxvYy0+b29iX2xpc3QucGFydGlhbF9pdGVyOworCisJZm9yICg7IHJlZzsgcmVnID0gcmVnLT5uZXh0KSB7CisJCWlmIChibG9jayA8IHJlZy0+bGVuKQorCQkJcmV0dXJuIHJlZy0+YmxvY2sgKyBibG9jazsKKwkJYmxvY2sgLT0gcmVnLT5sZW47CisJfQorCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKK30KKworLyogR2V0cyB0aGUgc3RhcnRpbmcgYmxvY2sgYW5kIGxlbmd0aCBpbiBibG9ja3Mgb2YgdGhlIGZpcnN0IHJlZ2lvbgorICAgb2YgYW4gYWxsb2NhdGlvbiAqLwordm9pZCBnZXRfcmVnaW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyICpibG9jaywgdTMyICpsZW4pCit7CisJKmJsb2NrID0gYWxsb2MtPmxpc3QuaXRlci0+YmxvY2s7CisJKmxlbiA9IGFsbG9jLT5saXN0Lml0ZXItPmxlbiAtIGFsbG9jLT5saXN0LnBhcnRpYWxfaXRlcjsKK30KKworLyogTW92ZSB0byB0aGUgbmV4dCByZWdpb24gaW4gYW4gYWxsb2NhdGlvbiAqLwordm9pZCBnZXRfbmV4dF9yZWdpb24oc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jKQoreworCWFsbG9jLT5saXN0Lml0ZXIgPSBhbGxvYy0+bGlzdC5pdGVyLT5uZXh0OworCWFsbG9jLT5saXN0LnBhcnRpYWxfaXRlciA9IDA7Cit9CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiBhIGJsb2NrIGdyb3VwICovCit1MzIgZ2V0X2ZyZWVfYmxvY2tzKHUzMiBiZykKK3sKKwlyZXR1cm4gYXV4X2luZm8uYmdzW2JnXS5mcmVlX2Jsb2NrczsKK30KKworaW50IGxhc3RfcmVnaW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYykKK3sKKwlyZXR1cm4gKGFsbG9jLT5saXN0Lml0ZXIgPT0gTlVMTCk7Cit9CisKK3ZvaWQgcmV3aW5kX2FsbG9jKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYykKK3sKKwlhbGxvYy0+bGlzdC5pdGVyID0gYWxsb2MtPmxpc3QuZmlyc3Q7CisJYWxsb2MtPmxpc3QucGFydGlhbF9pdGVyID0gMDsKK30KKworc3RhdGljIHN0cnVjdCByZWdpb24gKmRvX3NwbGl0X2FsbG9jYXRpb24oc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCB1MzIgbGVuKQoreworCXN0cnVjdCByZWdpb24gKnJlZyA9IGFsbG9jLT5saXN0Lml0ZXI7CisJc3RydWN0IHJlZ2lvbiAqbmV3OworCXN0cnVjdCByZWdpb24gKnRtcDsKKworCXdoaWxlIChyZWcgJiYgbGVuID49IHJlZy0+bGVuKSB7CisJCWxlbiAtPSByZWctPmxlbjsKKwkJcmVnID0gcmVnLT5uZXh0OworCX0KKworCWlmIChyZWcgPT0gTlVMTCAmJiBsZW4gPiAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChsZW4gPiAwKSB7CisJCW5ldyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHJlZ2lvbikpOworCisJCW5ldy0+YmcgPSByZWctPmJnOworCQluZXctPmJsb2NrID0gcmVnLT5ibG9jayArIGxlbjsKKwkJbmV3LT5sZW4gPSByZWctPmxlbiAtIGxlbjsKKwkJbmV3LT5uZXh0ID0gcmVnLT5uZXh0OworCQluZXctPnByZXYgPSByZWc7CisKKwkJcmVnLT5uZXh0ID0gbmV3OworCQlyZWctPmxlbiA9IGxlbjsKKworCQl0bXAgPSBhbGxvYy0+bGlzdC5pdGVyOworCQlhbGxvYy0+bGlzdC5pdGVyID0gbmV3OworCQlyZXR1cm4gdG1wOworCX0gZWxzZSB7CisJCXJldHVybiByZWc7CisJfQorfQorCisvKiBTcGxpdHMgYW4gYWxsb2NhdGlvbiBpbnRvIHR3byBhbGxvY2F0aW9ucy4gIFRoZSByZXR1cm5lZCBhbGxvY2F0aW9uIHdpbGwKKyAgIHBvaW50IHRvIHRoZSBmaXJzdCBoYWxmLCBhbmQgdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gcHRyIHdpbGwgcG9pbnQgdG8gdGhlCisgICBzZWNvbmQgaGFsZi4gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnaW9uICpzcGxpdF9hbGxvY2F0aW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyIGxlbikKK3sKKwkvKiBGaXJzdCBtYWtlIHN1cmUgdGhlcmUgaXMgYSBzcGxpdCBhdCB0aGUgY3VycmVudCBwdHIgKi8KKwlkb19zcGxpdF9hbGxvY2F0aW9uKGFsbG9jLCBhbGxvYy0+bGlzdC5wYXJ0aWFsX2l0ZXIpOworCisJLyogVGhlbiBzcGxpdCBvZmYgbGVuIGJsb2NrcyAqLworCXN0cnVjdCByZWdpb24gKm1pZGRsZSA9IGRvX3NwbGl0X2FsbG9jYXRpb24oYWxsb2MsIGxlbik7CisJYWxsb2MtPmxpc3QucGFydGlhbF9pdGVyID0gMDsKKwlyZXR1cm4gbWlkZGxlOworfQorCisvKiBSZXNlcnZlIHRoZSBuZXh0IGJsb2NrcyBmb3Igb29iIGRhdGEgKGluZGlyZWN0IG9yIGV4dGVudCBibG9ja3MpICovCitpbnQgcmVzZXJ2ZV9vb2JfYmxvY2tzKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgaW50IGJsb2NrcykKK3sKKwlzdHJ1Y3QgcmVnaW9uICpvb2IgPSBzcGxpdF9hbGxvY2F0aW9uKGFsbG9jLCBibG9ja3MpOworCXN0cnVjdCByZWdpb24gKm5leHQ7CisKKwlpZiAob29iID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXdoaWxlIChvb2IgJiYgb29iICE9IGFsbG9jLT5saXN0Lml0ZXIpIHsKKwkJbmV4dCA9IG9vYi0+bmV4dDsKKwkJcmVnaW9uX2xpc3RfcmVtb3ZlKCZhbGxvYy0+bGlzdCwgb29iKTsKKwkJcmVnaW9uX2xpc3RfYXBwZW5kKCZhbGxvYy0+b29iX2xpc3QsIG9vYik7CisJCW9vYiA9IG5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWR2YW5jZV9saXN0X3B0cihzdHJ1Y3QgcmVnaW9uX2xpc3QgKmxpc3QsIGludCBibG9ja3MpCit7CisJc3RydWN0IHJlZ2lvbiAqcmVnID0gbGlzdC0+aXRlcjsKKworCXdoaWxlIChyZWcgIT0gTlVMTCAmJiBibG9ja3MgPiAwKSB7CisJCWlmIChyZWctPmxlbiA+IGxpc3QtPnBhcnRpYWxfaXRlciArIGJsb2NrcykgeworCQkJbGlzdC0+cGFydGlhbF9pdGVyICs9IGJsb2NrczsKKwkJCXJldHVybiAwOworCQl9CisKKwkJYmxvY2tzIC09IChyZWctPmxlbiAtIGxpc3QtPnBhcnRpYWxfaXRlcik7CisJCWxpc3QtPnBhcnRpYWxfaXRlciA9IDA7CisJCXJlZyA9IHJlZy0+bmV4dDsKKwl9CisKKwlpZiAoYmxvY2tzID4gMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE1vdmUgdGhlIGFsbG9jYXRpb24gcG9pbnRlciBmb3J3YXJkICovCitpbnQgYWR2YW5jZV9ibG9ja3Moc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCBpbnQgYmxvY2tzKQoreworCXJldHVybiBhZHZhbmNlX2xpc3RfcHRyKCZhbGxvYy0+bGlzdCwgYmxvY2tzKTsKK30KKworaW50IGFkdmFuY2Vfb29iX2Jsb2NrcyhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIGludCBibG9ja3MpCit7CisJcmV0dXJuIGFkdmFuY2VfbGlzdF9wdHIoJmFsbG9jLT5vb2JfbGlzdCwgYmxvY2tzKTsKK30KKworaW50IGFwcGVuZF9vb2JfYWxsb2NhdGlvbihzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBsZW4pCit7CisJc3RydWN0IHJlZ2lvbiAqcmVnID0gZXh0NF9hbGxvY2F0ZV9iZXN0X2ZpdChsZW4pOworCisJaWYgKHJlZyA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgJWQgYmxvY2tzIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZvciAoOyByZWc7IHJlZyA9IHJlZy0+bmV4dCkKKwkJcmVnaW9uX2xpc3RfYXBwZW5kKCZhbGxvYy0+b29iX2xpc3QsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyBhbiBleHQ0X2lub2RlIHN0cnVjdHVyZSBmb3IgYW4gaW5vZGUgbnVtYmVyICovCitzdHJ1Y3QgZXh0NF9pbm9kZSAqZ2V0X2lub2RlKHUzMiBpbm9kZSkKK3sKKwlpbm9kZSAtPSAxOworCWludCBiZyA9IGlub2RlIC8gaW5mby5pbm9kZXNfcGVyX2dyb3VwOworCWlub2RlICU9IGluZm8uaW5vZGVzX3Blcl9ncm91cDsKKworCWFsbG9jYXRlX2JnX2lub2RlX3RhYmxlKCZhdXhfaW5mby5iZ3NbYmddKTsKKwlyZXR1cm4gKHN0cnVjdCBleHQ0X2lub2RlICopKGF1eF9pbmZvLmJnc1tiZ10uaW5vZGVfdGFibGUgKyBpbm9kZSAqCisJCWluZm8uaW5vZGVfc2l6ZSk7Cit9CisKK3N0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqZ2V0X3hhdHRyX2Jsb2NrX2Zvcl9pbm9kZShzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyICpibG9jayA9IHhhdHRyX2xpc3RfZmluZChpbm9kZSk7CisJaWYgKGJsb2NrICE9IE5VTEwpCisJCXJldHVybiBibG9jazsKKworCXUzMiBibG9ja19udW0gPSBhbGxvY2F0ZV9ibG9jaygpOworCWJsb2NrID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJaWYgKGJsb2NrID09IE5VTEwpIHsKKwkJZXJyb3IoImdldF94YXR0cjogZmFpbGVkIHRvIGFsbG9jYXRlICVkIiwgaW5mby5ibG9ja19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmxvY2stPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQ0X1hBVFRSX01BR0lDKTsKKwlibG9jay0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKDEpOworCWJsb2NrLT5oX2Jsb2NrcyA9IGNwdV90b19sZTMyKDEpOworCWlub2RlLT5pX2Jsb2Nrc19sbyA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGlub2RlLT5pX2Jsb2Nrc19sbykgKyAoaW5mby5ibG9ja19zaXplIC8gNTEyKSk7CisJaW5vZGUtPmlfZmlsZV9hY2xfbG8gPSBjcHVfdG9fbGUzMihibG9ja19udW0pOworCisJaW50IHJlc3VsdCA9IHNwYXJzZV9maWxlX2FkZF9kYXRhKGV4dDRfc3BhcnNlX2ZpbGUsIGJsb2NrLCBpbmZvLmJsb2NrX3NpemUsIGJsb2NrX251bSk7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCWVycm9yKCJnZXRfeGF0dHI6IHNwYXJzZV9maWxlX2FkZF9kYXRhIGZhaWx1cmUgJWQiLCByZXN1bHQpOworCQlmcmVlKGJsb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXhhdHRyX2xpc3RfaW5zZXJ0KGlub2RlLCBibG9jayk7CisJcmV0dXJuIGJsb2NrOworfQorCisvKiBNYXJrIHRoZSBmaXJzdCBsZW4gaW5vZGVzIGluIGEgYmxvY2sgZ3JvdXAgYXMgdXNlZCAqLwordTMyIHJlc2VydmVfaW5vZGVzKGludCBiZywgdTMyIG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgaW5vZGU7CisKKwlpZiAoZ2V0X2ZyZWVfaW5vZGVzKGJnKSA8IG51bSkKKwkJcmV0dXJuIEVYVDRfQUxMT0NBVEVfRkFJTEVEOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWlub2RlID0gYXV4X2luZm8uYmdzW2JnXS5maXJzdF9mcmVlX2lub2RlICsgaSAtIDE7CisJCWF1eF9pbmZvLmJnc1tiZ10uaW5vZGVfYml0bWFwW2lub2RlIC8gOF0gfD0gMSA8PCAoaW5vZGUgJSA4KTsKKwl9CisKKwlpbm9kZSA9IGF1eF9pbmZvLmJnc1tiZ10uZmlyc3RfZnJlZV9pbm9kZTsKKworCWF1eF9pbmZvLmJnc1tiZ10uZmlyc3RfZnJlZV9pbm9kZSArPSBudW07CisJYXV4X2luZm8uYmdzW2JnXS5mcmVlX2lub2RlcyAtPSBudW07CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIFJldHVybnMgdGhlIGZpcnN0IGZyZWUgaW5vZGUgbnVtYmVyCisgICBUT0RPOiBJbm9kZXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBpbiB0aGUgYmxvY2sgZ3JvdXAgb2YgdGhlIGRhdGE/ICovCit1MzIgYWxsb2NhdGVfaW5vZGUoKQoreworCXVuc2lnbmVkIGludCBiZzsKKwl1MzIgaW5vZGU7CisKKwlmb3IgKGJnID0gMDsgYmcgPCBhdXhfaW5mby5ncm91cHM7IGJnKyspIHsKKwkJaW5vZGUgPSByZXNlcnZlX2lub2RlcyhiZywgMSk7CisJCWlmIChpbm9kZSAhPSBFWFQ0X0FMTE9DQVRFX0ZBSUxFRCkKKwkJCXJldHVybiBiZyAqIGluZm8uaW5vZGVzX3Blcl9ncm91cCArIGlub2RlOworCX0KKworCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGluIGEgYmxvY2sgZ3JvdXAgKi8KK3UzMiBnZXRfZnJlZV9pbm9kZXModTMyIGJnKQoreworCXJldHVybiBhdXhfaW5mby5iZ3NbYmddLmZyZWVfaW5vZGVzOworfQorCisvKiBJbmNyZW1lbnRzIHRoZSBkaXJlY3RvcnkgY291bnQgb2YgdGhlIGJsb2NrIGdyb3VwIHRoYXQgY29udGFpbnMgaW5vZGUgKi8KK3ZvaWQgYWRkX2RpcmVjdG9yeSh1MzIgaW5vZGUpCit7CisJaW50IGJnID0gKGlub2RlIC0gMSkgLyBpbmZvLmlub2Rlc19wZXJfZ3JvdXA7CisJYXV4X2luZm8uYmdzW2JnXS51c2VkX2RpcnMgKz0gMTsKK30KKworLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGlub2RlcyBpbiBhIGJsb2NrIGdyb3VwIHRoYXQgYXJlIGRpcmVjdG9yaWVzICovCit1MTYgZ2V0X2RpcmVjdG9yaWVzKGludCBiZykKK3sKKwlyZXR1cm4gYXV4X2luZm8uYmdzW2JnXS51c2VkX2RpcnM7Cit9CisKKy8qIFJldHVybnMgdGhlIGZsYWdzIGZvciBhIGJsb2NrIGdyb3VwICovCit1MTYgZ2V0X2JnX2ZsYWdzKGludCBiZykKK3sKKwlyZXR1cm4gYXV4X2luZm8uYmdzW2JnXS5mbGFnczsKK30KKworLyogRnJlZXMgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgbGlua2VkIGxpc3Qgb2YgYWxsb2NhdGlvbiByZWdpb25zICovCit2b2lkIGZyZWVfYWxsb2Moc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jKQoreworCXN0cnVjdCByZWdpb24gKnJlZzsKKworCXJlZyA9IGFsbG9jLT5saXN0LmZpcnN0OworCXdoaWxlIChyZWcpIHsKKwkJc3RydWN0IHJlZ2lvbiAqbmV4dCA9IHJlZy0+bmV4dDsKKwkJZnJlZShyZWcpOworCQlyZWcgPSBuZXh0OworCX0KKworCXJlZyA9IGFsbG9jLT5vb2JfbGlzdC5maXJzdDsKKwl3aGlsZSAocmVnKSB7CisJCXN0cnVjdCByZWdpb24gKm5leHQgPSByZWctPm5leHQ7CisJCWZyZWUocmVnKTsKKwkJcmVnID0gbmV4dDsKKwl9CisKKwlmcmVlKGFsbG9jKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvYWxsb2NhdGUuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvYWxsb2NhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk5OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9hbGxvY2F0ZS5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BTExPQ0FURV9IXworI2RlZmluZSBfQUxMT0NBVEVfSF8KKworI2RlZmluZSBFWFQ0X0FMTE9DQVRFX0ZBSUxFRCAodTMyKSh+MCkKKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKworc3RydWN0IGJsb2NrX2FsbG9jYXRpb247CisKK3ZvaWQgYmxvY2tfYWxsb2NhdG9yX2luaXQoKTsKK3ZvaWQgYmxvY2tfYWxsb2NhdG9yX2ZyZWUoKTsKK3UzMiBhbGxvY2F0ZV9ibG9jaygpOworc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jYXRlX2Jsb2Nrcyh1MzIgbGVuKTsKK2ludCBibG9ja19hbGxvY2F0aW9uX251bV9yZWdpb25zKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYyk7CitpbnQgYmxvY2tfYWxsb2NhdGlvbl9sZW4oc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jKTsKK3N0cnVjdCBleHQ0X2lub2RlICpnZXRfaW5vZGUodTMyIGlub2RlKTsKK3N0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqZ2V0X3hhdHRyX2Jsb2NrX2Zvcl9pbm9kZShzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUpOwordm9pZCByZWR1Y2VfYWxsb2NhdGlvbihzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBsZW4pOwordTMyIGdldF9ibG9jayhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBibG9jayk7Cit1MzIgZ2V0X29vYl9ibG9jayhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIHUzMiBibG9jayk7Cit2b2lkIGdldF9uZXh0X3JlZ2lvbihzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpOwordm9pZCBnZXRfcmVnaW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyICpibG9jaywgdTMyICpsZW4pOwordTMyIGdldF9mcmVlX2Jsb2Nrcyh1MzIgYmcpOwordTMyIGdldF9mcmVlX2lub2Rlcyh1MzIgYmcpOwordTMyIHJlc2VydmVfaW5vZGVzKGludCBiZywgdTMyIGlub2Rlcyk7Cit2b2lkIGFkZF9kaXJlY3RvcnkodTMyIGlub2RlKTsKK3UxNiBnZXRfZGlyZWN0b3JpZXMoaW50IGJnKTsKK3UxNiBnZXRfYmdfZmxhZ3MoaW50IGJnKTsKK3ZvaWQgaW5pdF91bnVzZWRfaW5vZGVfdGFibGVzKHZvaWQpOwordTMyIGFsbG9jYXRlX2lub2RlKCk7Cit2b2lkIGZyZWVfYWxsb2Moc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jKTsKK2ludCByZXNlcnZlX29vYl9ibG9ja3Moc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCBpbnQgYmxvY2tzKTsKK2ludCBhZHZhbmNlX2Jsb2NrcyhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIGludCBibG9ja3MpOworaW50IGFkdmFuY2Vfb29iX2Jsb2NrcyhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MsIGludCBibG9ja3MpOworaW50IGxhc3RfcmVnaW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYyk7Cit2b2lkIHJld2luZF9hbGxvYyhzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpOwordm9pZCBhcHBlbmRfcmVnaW9uKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywKKwl1MzIgYmxvY2ssIHUzMiBsZW4sIGludCBiZyk7CitzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqY3JlYXRlX2FsbG9jYXRpb24oKTsKK2ludCBhcHBlbmRfb29iX2FsbG9jYXRpb24oc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCB1MzIgbGVuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2NvbnRlbnRzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2NvbnRlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlNTY5MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvY29udGVudHMuYwpAQCAtMCwwICsxLDQ3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBIQVZFX0FORFJPSURfT1MKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjZWxzZQorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NhcGFiaWxpdHkuaD4KKyNlbmRpZgorCisjZGVmaW5lIFhBVFRSX1NFTElOVVhfU1VGRklYICJzZWxpbnV4IgorI2RlZmluZSBYQVRUUl9DQVBTX1NVRkZJWCAiY2FwYWJpbGl0eSIKKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJtYWtlX2V4dDRmcy5oIgorI2luY2x1ZGUgImFsbG9jYXRlLmgiCisjaW5jbHVkZSAiY29udGVudHMuaCIKKyNpbmNsdWRlICJleHRlbnQuaCIKKyNpbmNsdWRlICJpbmRpcmVjdC5oIgorCisjaWZkZWYgVVNFX01JTkdXCisjZGVmaW5lIFNfSUZMTksgMCAgLyogdXNlZCBieSBtYWtlX2xpbmssIG5vdCBuZWVkZWQgdW5kZXIgbWluZ3cgKi8KKyNlbmRpZgorCitzdGF0aWMgdTMyIGRlbnRyeV9zaXplKHUzMiBlbnRyaWVzLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cmllcykKK3sKKwl1MzIgbGVuID0gMjQ7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGRlbnRyeV9sZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCWRlbnRyeV9sZW4gPSA4ICsgQUxJR04oc3RybGVuKGRlbnRyaWVzW2ldLmZpbGVuYW1lKSwgNCk7CisJCWlmIChsZW4gJSBpbmZvLmJsb2NrX3NpemUgKyBkZW50cnlfbGVuID4gaW5mby5ibG9ja19zaXplKQorCQkJbGVuICs9IGluZm8uYmxvY2tfc2l6ZSAtIChsZW4gJSBpbmZvLmJsb2NrX3NpemUpOworCQlsZW4gKz0gZGVudHJ5X2xlbjsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmFkZF9kZW50cnkodTggKmRhdGEsIHUzMiAqb2Zmc2V0LAorCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqcHJldiwgdTMyIGlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQl1OCBmaWxlX3R5cGUpCit7CisJdTggbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJdTE2IHJlY19sZW4gPSA4ICsgQUxJR04obmFtZV9sZW4sIDQpOworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZW50cnk7CisKKwl1MzIgc3RhcnRfYmxvY2sgPSAqb2Zmc2V0IC8gaW5mby5ibG9ja19zaXplOworCXUzMiBlbmRfYmxvY2sgPSAoKm9mZnNldCArIHJlY19sZW4gLSAxKSAvIGluZm8uYmxvY2tfc2l6ZTsKKwlpZiAoc3RhcnRfYmxvY2sgIT0gZW5kX2Jsb2NrKSB7CisJCS8qIEFkZGluZyB0aGlzIGRlbnRyeSB3aWxsIGNyb3NzIGEgYmxvY2sgYm91bmRhcnksIHNvIHBhZCB0aGUgcHJldmlvdXMKKwkJICAgZGVudHJ5IHRvIHRoZSBibG9jayBib3VuZGFyeSAqLworCQlpZiAoIXByZXYpCisJCQljcml0aWNhbF9lcnJvcigibm8gcHJldiIpOworCQlwcmV2LT5yZWNfbGVuICs9IGVuZF9ibG9jayAqIGluZm8uYmxvY2tfc2l6ZSAtICpvZmZzZXQ7CisJCSpvZmZzZXQgPSBlbmRfYmxvY2sgKiBpbmZvLmJsb2NrX3NpemU7CisJfQorCisJZGVudHJ5ID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGRhdGEgKyAqb2Zmc2V0KTsKKwlkZW50cnktPmlub2RlID0gaW5vZGU7CisJZGVudHJ5LT5yZWNfbGVuID0gcmVjX2xlbjsKKwlkZW50cnktPm5hbWVfbGVuID0gbmFtZV9sZW47CisJZGVudHJ5LT5maWxlX3R5cGUgPSBmaWxlX3R5cGU7CisJbWVtY3B5KGRlbnRyeS0+bmFtZSwgbmFtZSwgbmFtZV9sZW4pOworCisJKm9mZnNldCArPSByZWNfbGVuOworCXJldHVybiBkZW50cnk7Cit9CisKKy8qIENyZWF0ZXMgYSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhbiBhcnJheSBvZiBkaXJlY3RvcnkgZW50cmllcywgZGVudHJpZXMsCisgICBhbmQgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RydWN0dXJlIGluIGFuIGlub2RlLiAgVGhlIG5ldyBpbm9kZSdzCisgICAuLiBsaW5rIGlzIHNldCB0byBkaXJfaW5vZGVfbnVtLiAgU3RvcmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5vZGUgbnVtYmVyCisgICBvZiBlYWNoIGRpcmVjdG9yeSBlbnRyeSBpbnRvIGRlbnRyaWVzW2ldLmlub2RlLCB0byBiZSBmaWxsZWQgaW4gbGF0ZXIKKyAgIHdoZW4gdGhlIGlub2RlIGZvciB0aGUgZW50cnkgaXMgYWxsb2NhdGVkLiAgUmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZQorICAgbmV3IGRpcmVjdG9yeSAqLwordTMyIG1ha2VfZGlyZWN0b3J5KHUzMiBkaXJfaW5vZGVfbnVtLCB1MzIgZW50cmllcywgc3RydWN0IGRlbnRyeSAqZGVudHJpZXMsCisJdTMyIGRpcnMpCit7CisJc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlOworCXUzMiBibG9ja3M7CisJdTMyIGxlbjsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1MzIgaW5vZGVfbnVtOworCXU4ICpkYXRhOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZW50cnk7CisKKwlibG9ja3MgPSBESVZfUk9VTkRfVVAoZGVudHJ5X3NpemUoZW50cmllcywgZGVudHJpZXMpLCBpbmZvLmJsb2NrX3NpemUpOworCWxlbiA9IGJsb2NrcyAqIGluZm8uYmxvY2tfc2l6ZTsKKworCWlmIChkaXJfaW5vZGVfbnVtKSB7CisJCWlub2RlX251bSA9IGFsbG9jYXRlX2lub2RlKGluZm8pOworCX0gZWxzZSB7CisJCWRpcl9pbm9kZV9udW0gPSBFWFQ0X1JPT1RfSU5POworCQlpbm9kZV9udW0gPSBFWFQ0X1JPT1RfSU5POworCX0KKworCWlmIChpbm9kZV9udW0gPT0gRVhUNF9BTExPQ0FURV9GQUlMRUQpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBpbm9kZVxuIik7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlhZGRfZGlyZWN0b3J5KGlub2RlX251bSk7CisKKwlpbm9kZSA9IGdldF9pbm9kZShpbm9kZV9udW0pOworCWlmIChpbm9kZSA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gZ2V0IGlub2RlICV1IiwgaW5vZGVfbnVtKTsKKwkJcmV0dXJuIEVYVDRfQUxMT0NBVEVfRkFJTEVEOworCX0KKworCWRhdGEgPSBpbm9kZV9hbGxvY2F0ZV9kYXRhX2V4dGVudHMoaW5vZGUsIGxlbiwgbGVuKTsKKwlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgJXUgZXh0ZW50cyIsIGxlbik7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUjsKKwlpbm9kZS0+aV9saW5rc19jb3VudCA9IGRpcnMgKyAyOworCWlub2RlLT5pX2ZsYWdzIHw9IGF1eF9pbmZvLmRlZmF1bHRfaV9mbGFnczsKKworCWRlbnRyeSA9IE5VTEw7CisKKwlkZW50cnkgPSBhZGRfZGVudHJ5KGRhdGEsICZvZmZzZXQsIE5VTEwsIGlub2RlX251bSwgIi4iLCBFWFQ0X0ZUX0RJUik7CisJaWYgKCFkZW50cnkpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhZGQgLiBkaXJlY3RvcnkiKTsKKwkJcmV0dXJuIEVYVDRfQUxMT0NBVEVfRkFJTEVEOworCX0KKworCWRlbnRyeSA9IGFkZF9kZW50cnkoZGF0YSwgJm9mZnNldCwgZGVudHJ5LCBkaXJfaW5vZGVfbnVtLCAiLi4iLCBFWFQ0X0ZUX0RJUik7CisJaWYgKCFkZW50cnkpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhZGQgLi4gZGlyZWN0b3J5Iik7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCWRlbnRyeSA9IGFkZF9kZW50cnkoZGF0YSwgJm9mZnNldCwgZGVudHJ5LCAwLAorCQkJCWRlbnRyaWVzW2ldLmZpbGVuYW1lLCBkZW50cmllc1tpXS5maWxlX3R5cGUpOworCQlpZiAob2Zmc2V0ID4gbGVuIHx8IChvZmZzZXQgPT0gbGVuICYmIGkgIT0gZW50cmllcyAtIDEpKQorCQkJY3JpdGljYWxfZXJyb3IoImludGVybmFsIGVycm9yOiBkZW50cnkgZm9yICVzIGVuZHMgYXQgJWQsIHBhc3QgJWRcbiIsCisJCQkJZGVudHJpZXNbaV0uZmlsZW5hbWUsIG9mZnNldCwgbGVuKTsKKwkJZGVudHJpZXNbaV0uaW5vZGUgPSAmZGVudHJ5LT5pbm9kZTsKKwkJaWYgKCFkZW50cnkpIHsKKwkJCWVycm9yKCJmYWlsZWQgdG8gYWRkIGRpcmVjdG9yeSIpOworCQkJcmV0dXJuIEVYVDRfQUxMT0NBVEVfRkFJTEVEOworCQl9CisJfQorCisJLyogcGFkIHRoZSBsYXN0IGRlbnRyeSBvdXQgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KKwlkZW50cnktPnJlY19sZW4gKz0gbGVuIC0gb2Zmc2V0OworCisJcmV0dXJuIGlub2RlX251bTsKK30KKworLyogQ3JlYXRlcyBhIGZpbGUgb24gZGlzay4gIFJldHVybnMgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgbmV3IGZpbGUgKi8KK3UzMiBtYWtlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHU2NCBsZW4pCit7CisJc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlOworCXUzMiBpbm9kZV9udW07CisKKwlpbm9kZV9udW0gPSBhbGxvY2F0ZV9pbm9kZShpbmZvKTsKKwlpZiAoaW5vZGVfbnVtID09IEVYVDRfQUxMT0NBVEVfRkFJTEVEKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgaW5vZGVcbiIpOworCQlyZXR1cm4gRVhUNF9BTExPQ0FURV9GQUlMRUQ7CisJfQorCisJaW5vZGUgPSBnZXRfaW5vZGUoaW5vZGVfbnVtKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkgeworCQllcnJvcigiZmFpbGVkIHRvIGdldCBpbm9kZSAldSIsIGlub2RlX251bSk7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlpZiAobGVuID4gMCkKKwkJaW5vZGVfYWxsb2NhdGVfZmlsZV9leHRlbnRzKGlub2RlLCBsZW4sIGZpbGVuYW1lKTsKKworCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHOworCWlub2RlLT5pX2xpbmtzX2NvdW50ID0gMTsKKwlpbm9kZS0+aV9mbGFncyB8PSBhdXhfaW5mby5kZWZhdWx0X2lfZmxhZ3M7CisKKwlyZXR1cm4gaW5vZGVfbnVtOworfQorCisvKiBDcmVhdGVzIGEgZmlsZSBvbiBkaXNrLiAgUmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBuZXcgZmlsZSAqLwordTMyIG1ha2VfbGluayhjb25zdCBjaGFyICpsaW5rKQoreworCXN0cnVjdCBleHQ0X2lub2RlICppbm9kZTsKKwl1MzIgaW5vZGVfbnVtOworCXUzMiBsZW4gPSBzdHJsZW4obGluayk7CisKKwlpbm9kZV9udW0gPSBhbGxvY2F0ZV9pbm9kZShpbmZvKTsKKwlpZiAoaW5vZGVfbnVtID09IEVYVDRfQUxMT0NBVEVfRkFJTEVEKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgaW5vZGVcbiIpOworCQlyZXR1cm4gRVhUNF9BTExPQ0FURV9GQUlMRUQ7CisJfQorCisJaW5vZGUgPSBnZXRfaW5vZGUoaW5vZGVfbnVtKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkgeworCQllcnJvcigiZmFpbGVkIHRvIGdldCBpbm9kZSAldSIsIGlub2RlX251bSk7CisJCXJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKwl9CisKKwlpbm9kZS0+aV9tb2RlID0gU19JRkxOSzsKKwlpbm9kZS0+aV9saW5rc19jb3VudCA9IDE7CisJaW5vZGUtPmlfZmxhZ3MgfD0gYXV4X2luZm8uZGVmYXVsdF9pX2ZsYWdzOworCWlub2RlLT5pX3NpemVfbG8gPSBsZW47CisKKwlpZiAobGVuICsgMSA8PSBzaXplb2YoaW5vZGUtPmlfYmxvY2spKSB7CisJCS8qIEZhc3Qgc3ltbGluayAqLworCQltZW1jcHkoKGNoYXIqKWlub2RlLT5pX2Jsb2NrLCBsaW5rLCBsZW4pOworCX0gZWxzZSB7CisJCXU4ICpkYXRhID0gaW5vZGVfYWxsb2NhdGVfZGF0YV9pbmRpcmVjdChpbm9kZSwgaW5mby5ibG9ja19zaXplLCBpbmZvLmJsb2NrX3NpemUpOworCQltZW1jcHkoZGF0YSwgbGluaywgbGVuKTsKKwkJaW5vZGUtPmlfYmxvY2tzX2xvID0gaW5mby5ibG9ja19zaXplIC8gNTEyOworCX0KKworCXJldHVybiBpbm9kZV9udW07Cit9CisKK2ludCBpbm9kZV9zZXRfcGVybWlzc2lvbnModTMyIGlub2RlX251bSwgdTE2IG1vZGUsIHUxNiB1aWQsIHUxNiBnaWQsIHUzMiBtdGltZSkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUgPSBnZXRfaW5vZGUoaW5vZGVfbnVtKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAtMTsKKworCWlub2RlLT5pX21vZGUgfD0gbW9kZTsKKwlpbm9kZS0+aV91aWQgPSB1aWQ7CisJaW5vZGUtPmlfZ2lkID0gZ2lkOworCWlub2RlLT5pX210aW1lID0gbXRpbWU7CisJaW5vZGUtPmlfYXRpbWUgPSBtdGltZTsKKwlpbm9kZS0+aV9jdGltZSA9IG10aW1lOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBhdmFpbGFibGUgaW4gdGhlIHNwZWNpZmllZAorICogeGF0dHIgcmVnaW9uCisgKi8KK3N0YXRpYyBzaXplX3QgeGF0dHJfZnJlZV9zcGFjZShzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnksIGNoYXIgKmVuZCkKK3sKKwl3aGlsZSghSVNfTEFTVF9FTlRSWShlbnRyeSkgJiYgKCgoY2hhciAqKSBlbnRyeSkgPCBlbmQpKSB7CisJCWVuZCAgIC09IEVYVDRfWEFUVFJfU0laRShsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSk7CisJCWVudHJ5ICA9IEVYVDRfWEFUVFJfTkVYVChlbnRyeSk7CisJfQorCisJaWYgKCgoY2hhciAqKSBlbnRyeSkgPiBlbmQpIHsKKwkJZXJyb3IoInVuZXhwZWN0ZWQgcmVhZCBiZXlvbmQgZW5kIG9mIHhhdHRyIHNwYWNlIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBlbmQgLSAoKGNoYXIgKikgZW50cnkpOworfQorCisvKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZyZWUgc3BhY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgKiBsYXN0IHhhdHRyIGVsZW1lbnQKKyAqLworc3RhdGljIHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5KiB4YXR0cl9nZXRfbGFzdChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnkpCit7CisJZm9yICg7ICFJU19MQVNUX0VOVFJZKGVudHJ5KTsgZW50cnkgPSBFWFQ0X1hBVFRSX05FWFQoZW50cnkpKSB7CisJCS8vIHNraXAgZW50cnkKKwl9CisJcmV0dXJuIGVudHJ5OworfQorCisvKgorICogYXNzZXJ0IHRoYXQgdGhlIGVsZW1lbnRzIGluIHRoZSBleHQ0IHhhdHRyIHNlY3Rpb24gYXJlIGluIHNvcnRlZCBvcmRlcgorICoKKyAqIFRoZSBleHQ0IGZpbGVzeXN0ZW0gcmVxdWlyZXMgZXh0ZW5kZWQgYXR0cmlidXRlcyB0byBiZSBzb3J0ZWQgd2hlbgorICogdGhleSdyZSBub3Qgc3RvcmVkIGluIHRoZSBpbm9kZS4gVGhlIGtlcm5lbCBleHQ0IGNvZGUgdXNlcyB0aGUgZm9sbG93aW5nCisgKiBzb3J0aW5nIGFsZ29yaXRobToKKyAqCisgKiAxKSBGaXJzdCBzb3J0IGV4dGVuZGVkIGF0dHJpYnV0ZXMgYnkgdGhlaXIgbmFtZV9pbmRleC4gRm9yIGV4YW1wbGUsCisgKiAgICBFWFQ0X1hBVFRSX0lOREVYX1VTRVIgKDEpIGNvbWVzIGJlZm9yZSBFWFQ0X1hBVFRSX0lOREVYX1NFQ1VSSVRZICg2KS4KKyAqIDIpIElmIHRoZSBuYW1lX2luZGV4ZXMgYXJlIGVxdWFsLCB0aGVuIHNvcnRpbmcgaXMgYmFzZWQgb24gdGhlIGxlbmd0aAorICogICAgb2YgdGhlIG5hbWUuIEZvciBleGFtcGxlLCBYQVRUUl9TRUxJTlVYX1NVRkZJWCAoInNlbGludXgiKSBjb21lcyBiZWZvcmUKKyAqICAgIFhBVFRSX0NBUFNfU1VGRklYICgiY2FwYWJpbGl0eSIpIGJlY2F1c2UgInNlbGludXgiIGlzIHNob3J0ZXIgdGhhbiAiY2FwYWJpbGl0eSIKKyAqIDMpIElmIHRoZSBuYW1lX2luZGV4IGFuZCBuYW1lX2xlbmd0aCBhcmUgZXF1YWwsIHRoZW4gbWVtY21wKCkgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAqICAgIHdoaWNoIG5hbWUgY29tZXMgZmlyc3QuIEZvciBleGFtcGxlLCAic2VsaW51eCIgd291bGQgY29tZSBiZWZvcmUgInllbGludXgiLgorICoKKyAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGltcGxlbWVudCB0aGUgc29ydGluZyBmdW5jdGlvbiBkZWZpbmVkIGluCisgKiB0aGUgTGludXgga2VybmVsIGZpbGUgZnMvZXh0NC94YXR0ci5jIGZ1bmN0aW9uIGV4dDRfeGF0dHJfZmluZF9lbnRyeSgpLgorICovCitzdGF0aWMgdm9pZCB4YXR0cl9hc3NlcnRfc2FuZShzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnkpCit7CisJZm9yKCA7ICFJU19MQVNUX0VOVFJZKGVudHJ5KTsgZW50cnkgPSBFWFQ0X1hBVFRSX05FWFQoZW50cnkpKSB7CisJCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpuZXh0ID0gRVhUNF9YQVRUUl9ORVhUKGVudHJ5KTsKKwkJaWYgKElTX0xBU1RfRU5UUlkobmV4dCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWludCBjbXAgPSBuZXh0LT5lX25hbWVfaW5kZXggLSBlbnRyeS0+ZV9uYW1lX2luZGV4OworCQlpZiAoY21wID09IDApCisJCQljbXAgPSBuZXh0LT5lX25hbWVfbGVuIC0gZW50cnktPmVfbmFtZV9sZW47CisJCWlmIChjbXAgPT0gMCkKKwkJCWNtcCA9IG1lbWNtcChuZXh0LT5lX25hbWUsIGVudHJ5LT5lX25hbWUsIG5leHQtPmVfbmFtZV9sZW4pOworCQlpZiAoY21wIDwgMCkgeworCQkJZXJyb3IoIkJVRzogZXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbm90IHNvcnRlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGNtcCA9PSAwKSB7CisJCQllcnJvcigiQlVHOiBkdXBsaWNhdGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZXRlY3RlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgTkFNRV9IQVNIX1NISUZUIDUKKyNkZWZpbmUgVkFMVUVfSEFTSF9TSElGVCAxNgorCitzdGF0aWMgdm9pZCBleHQ0X3hhdHRyX2hhc2hfZW50cnkoc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyICpoZWFkZXIsCisJCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwl1MzIgaGFzaCA9IDA7CisJY2hhciAqbmFtZSA9IGVudHJ5LT5lX25hbWU7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgZW50cnktPmVfbmFtZV9sZW47IG4rKykgeworCQloYXNoID0gKGhhc2ggPDwgTkFNRV9IQVNIX1NISUZUKSBeCisJCQkoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBOQU1FX0hBU0hfU0hJRlQpKSBeCisJCQkqbmFtZSsrOworCX0KKworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayA9PSAwICYmIGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCkgeworCQl1MzIgKnZhbHVlID0gKHUzMiAqKSgoY2hhciAqKWhlYWRlciArCisJCQlsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKSk7CisJCWZvciAobiA9IChsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSArCisJCQlFWFQ0X1hBVFRSX1JPVU5EKSA+PiBFWFQ0X1hBVFRSX1BBRF9CSVRTOyBuOyBuLS0pIHsKKwkJCWhhc2ggPSAoaGFzaCA8PCBWQUxVRV9IQVNIX1NISUZUKSBeCisJCQkJKGhhc2ggPj4gKDgqc2l6ZW9mKGhhc2gpIC0gVkFMVUVfSEFTSF9TSElGVCkpIF4KKwkJCQlsZTMyX3RvX2NwdSgqdmFsdWUrKyk7CisJCX0KKwl9CisJZW50cnktPmVfaGFzaCA9IGNwdV90b19sZTMyKGhhc2gpOworfQorCisjdW5kZWYgTkFNRV9IQVNIX1NISUZUCisjdW5kZWYgVkFMVUVfSEFTSF9TSElGVAorCitzdGF0aWMgc3RydWN0IGV4dDRfeGF0dHJfZW50cnkqIHhhdHRyX2FkZHRvX3JhbmdlKAorCQl2b2lkICpibG9ja19zdGFydCwKKwkJdm9pZCAqYmxvY2tfZW5kLAorCQlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZmlyc3QsCisJCWludCBuYW1lX2luZGV4LAorCQljb25zdCBjaGFyICpuYW1lLAorCQljb25zdCB2b2lkICp2YWx1ZSwKKwkJc2l6ZV90IHZhbHVlX2xlbikKK3sKKwlzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKG5hbWVfbGVuID4gMjU1KQorCQlyZXR1cm4gTlVMTDsKKworCXNpemVfdCBhdmFpbGFibGVfc2l6ZSA9IHhhdHRyX2ZyZWVfc3BhY2UoZmlyc3QsIGJsb2NrX2VuZCk7CisJc2l6ZV90IG5lZWRlZF9zaXplID0gRVhUNF9YQVRUUl9MRU4obmFtZV9sZW4pICsgRVhUNF9YQVRUUl9TSVpFKHZhbHVlX2xlbik7CisKKwlpZiAobmVlZGVkX3NpemUgPiBhdmFpbGFibGVfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqbmV3X2VudHJ5ID0geGF0dHJfZ2V0X2xhc3QoZmlyc3QpOworCW1lbXNldChuZXdfZW50cnksIDAsIEVYVDRfWEFUVFJfTEVOKG5hbWVfbGVuKSk7CisKKwluZXdfZW50cnktPmVfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKwluZXdfZW50cnktPmVfbmFtZV9pbmRleCA9IG5hbWVfaW5kZXg7CisJbWVtY3B5KG5ld19lbnRyeS0+ZV9uYW1lLCBuYW1lLCBuYW1lX2xlbik7CisJbmV3X2VudHJ5LT5lX3ZhbHVlX2Jsb2NrID0gMDsKKwluZXdfZW50cnktPmVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTMyKHZhbHVlX2xlbik7CisKKwljaGFyICp2YWwgPSAoY2hhciAqKSBuZXdfZW50cnkgKyBhdmFpbGFibGVfc2l6ZSAtIEVYVDRfWEFUVFJfU0laRSh2YWx1ZV9sZW4pOworCXNpemVfdCBlX3ZhbHVlX29mZnMgPSB2YWwgLSAoY2hhciAqKSBibG9ja19zdGFydDsKKworCW5ld19lbnRyeS0+ZV92YWx1ZV9vZmZzID0gY3B1X3RvX2xlMTYoZV92YWx1ZV9vZmZzKTsKKwltZW1zZXQodmFsLCAwLCBFWFQ0X1hBVFRSX1NJWkUodmFsdWVfbGVuKSk7CisJbWVtY3B5KHZhbCwgdmFsdWUsIHZhbHVlX2xlbik7CisKKwl4YXR0cl9hc3NlcnRfc2FuZShmaXJzdCk7CisJcmV0dXJuIG5ld19lbnRyeTsKK30KKworc3RhdGljIGludCB4YXR0cl9hZGR0b19pbm9kZShzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LAorCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbikKK3sKKwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9oZWFkZXIgKmhkciA9IChzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9oZWFkZXIgKikgKGlub2RlICsgMSk7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmZpcnN0ID0gKHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICopIChoZHIgKyAxKTsKKwljaGFyICpibG9ja19lbmQgPSAoKGNoYXIgKikgaW5vZGUpICsgaW5mby5pbm9kZV9zaXplOworCisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKnJlc3VsdCA9CisJCXhhdHRyX2FkZHRvX3JhbmdlKGZpcnN0LCBibG9ja19lbmQsIGZpcnN0LCBuYW1lX2luZGV4LCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaGRyLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoRVhUNF9YQVRUUl9NQUdJQyk7CisJaW5vZGUtPmlfZXh0cmFfaXNpemUgPSBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGV4dDRfaW5vZGUpIC0gRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhhdHRyX2FkZHRvX2Jsb2NrKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKQoreworCXN0cnVjdCBleHQ0X3hhdHRyX2hlYWRlciAqaGVhZGVyID0gZ2V0X3hhdHRyX2Jsb2NrX2Zvcl9pbm9kZShpbm9kZSk7CisJaWYgKCFoZWFkZXIpCisJCXJldHVybiAtMTsKKworCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpmaXJzdCA9IChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSAoaGVhZGVyICsgMSk7CisJY2hhciAqYmxvY2tfZW5kID0gKChjaGFyICopIGhlYWRlcikgKyBpbmZvLmJsb2NrX3NpemU7CisKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqcmVzdWx0ID0KKwkJeGF0dHJfYWRkdG9fcmFuZ2UoaGVhZGVyLCBibG9ja19lbmQsIGZpcnN0LCBuYW1lX2luZGV4LCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJZXh0NF94YXR0cl9oYXNoX2VudHJ5KGhlYWRlciwgcmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHhhdHRyX2FkZCh1MzIgaW5vZGVfbnVtLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4pCit7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDA7CisKKwlzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUgPSBnZXRfaW5vZGUoaW5vZGVfbnVtKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAtMTsKKworCWludCByZXN1bHQgPSB4YXR0cl9hZGR0b19pbm9kZShpbm9kZSwgbmFtZV9pbmRleCwgbmFtZSwgdmFsdWUsIHZhbHVlX2xlbik7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCXJlc3VsdCA9IHhhdHRyX2FkZHRvX2Jsb2NrKGlub2RlLCBuYW1lX2luZGV4LCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGlub2RlX3NldF9zZWxpbnV4KHUzMiBpbm9kZV9udW0sIGNvbnN0IGNoYXIgKnNlY29uKQoreworCWlmICghc2Vjb24pCisJCXJldHVybiAwOworCisJcmV0dXJuIHhhdHRyX2FkZChpbm9kZV9udW0sIEVYVDRfWEFUVFJfSU5ERVhfU0VDVVJJVFksCisJCVhBVFRSX1NFTElOVVhfU1VGRklYLCBzZWNvbiwgc3RybGVuKHNlY29uKSArIDEpOworfQorCitpbnQgaW5vZGVfc2V0X2NhcGFiaWxpdGllcyh1MzIgaW5vZGVfbnVtLCB1aW50NjRfdCBjYXBhYmlsaXRpZXMpIHsKKwlpZiAoY2FwYWJpbGl0aWVzID09IDApCisJCXJldHVybiAwOworCisJc3RydWN0IHZmc19jYXBfZGF0YSBjYXBfZGF0YTsKKwltZW1zZXQoJmNhcF9kYXRhLCAwLCBzaXplb2YoY2FwX2RhdGEpKTsKKworCWNhcF9kYXRhLm1hZ2ljX2V0YyA9IFZGU19DQVBfUkVWSVNJT04gfCBWRlNfQ0FQX0ZMQUdTX0VGRkVDVElWRTsKKwljYXBfZGF0YS5kYXRhWzBdLnBlcm1pdHRlZCA9ICh1aW50MzJfdCkgKGNhcGFiaWxpdGllcyAmIDB4ZmZmZmZmZmYpOworCWNhcF9kYXRhLmRhdGFbMF0uaW5oZXJpdGFibGUgPSAwOworCWNhcF9kYXRhLmRhdGFbMV0ucGVybWl0dGVkID0gKHVpbnQzMl90KSAoY2FwYWJpbGl0aWVzID4+IDMyKTsKKwljYXBfZGF0YS5kYXRhWzFdLmluaGVyaXRhYmxlID0gMDsKKworCXJldHVybiB4YXR0cl9hZGQoaW5vZGVfbnVtLCBFWFQ0X1hBVFRSX0lOREVYX1NFQ1VSSVRZLAorCQlYQVRUUl9DQVBTX1NVRkZJWCwgJmNhcF9kYXRhLCBzaXplb2YoY2FwX2RhdGEpKTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9jb250ZW50cy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9jb250ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzIwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2NvbnRlbnRzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0RJUkVDVE9SWV9IXworI2RlZmluZSBfRElSRUNUT1JZX0hfCisKK3N0cnVjdCBkZW50cnkgeworCWNoYXIgKnBhdGg7CisJY2hhciAqZnVsbF9wYXRoOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNoYXIgKmxpbms7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXU4IGZpbGVfdHlwZTsKKwl1MTYgbW9kZTsKKwl1MTYgdWlkOworCXUxNiBnaWQ7CisJdTMyICppbm9kZTsKKwl1MzIgbXRpbWU7CisJY2hhciAqc2Vjb247CisJdWludDY0X3QgY2FwYWJpbGl0aWVzOworfTsKKwordTMyIG1ha2VfZGlyZWN0b3J5KHUzMiBkaXJfaW5vZGVfbnVtLCB1MzIgZW50cmllcywgc3RydWN0IGRlbnRyeSAqZGVudHJpZXMsCisJdTMyIGRpcnMpOwordTMyIG1ha2VfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdTY0IGxlbik7Cit1MzIgbWFrZV9saW5rKGNvbnN0IGNoYXIgKmxpbmspOworaW50IGlub2RlX3NldF9wZXJtaXNzaW9ucyh1MzIgaW5vZGVfbnVtLCB1MTYgbW9kZSwgdTE2IHVpZCwgdTE2IGdpZCwgdTMyIG10aW1lKTsKK2ludCBpbm9kZV9zZXRfc2VsaW51eCh1MzIgaW5vZGVfbnVtLCBjb25zdCBjaGFyICpzZWNvbik7CitpbnQgaW5vZGVfc2V0X2NhcGFiaWxpdGllcyh1MzIgaW5vZGVfbnVtLCB1aW50NjRfdCBjYXBhYmlsaXRpZXMpOworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2NyYzE2LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2NyYzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3NTgxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvY3JjMTYuYwpAQCAtMCwwICsxLDU4IEBACisvKi0KKyAqICBDT1BZUklHSFQgKEMpIDE5ODYgR2FyeSBTLiBCcm93bi4gIFlvdSBtYXkgdXNlIHRoaXMgcHJvZ3JhbSwgb3IKKyAqICBjb2RlIG9yIHRhYmxlcyBleHRyYWN0ZWQgZnJvbSBpdCwgYXMgZGVzaXJlZCB3aXRob3V0IHJlc3RyaWN0aW9uLgorICovCisKKy8qIENSQzMyIGNvZGUgZGVyaXZlZCBmcm9tIHdvcmsgYnkgR2FyeSBTLiBCcm93bi4gKi8KKworLyogQ29kZSB0YWtlbiBmcm9tIEZyZWVCU0QgOCAqLworCisvKiBDb252ZXJ0ZWQgdG8gY3JjMTYgKi8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKworc3RhdGljIHUxNiBjcmMxNl90YWJbXSA9IHsKKwkJMHgwMDAwLCAweEMwQzEsIDB4QzE4MSwgMHgwMTQwLCAweEMzMDEsIDB4MDNDMCwgMHgwMjgwLCAweEMyNDEsCisJCTB4QzYwMSwgMHgwNkMwLCAweDA3ODAsIDB4Qzc0MSwgMHgwNTAwLCAweEM1QzEsIDB4QzQ4MSwgMHgwNDQwLAorCQkweENDMDEsIDB4MENDMCwgMHgwRDgwLCAweENENDEsIDB4MEYwMCwgMHhDRkMxLCAweENFODEsIDB4MEU0MCwKKwkJMHgwQTAwLCAweENBQzEsIDB4Q0I4MSwgMHgwQjQwLCAweEM5MDEsIDB4MDlDMCwgMHgwODgwLCAweEM4NDEsCisJCTB4RDgwMSwgMHgxOEMwLCAweDE5ODAsIDB4RDk0MSwgMHgxQjAwLCAweERCQzEsIDB4REE4MSwgMHgxQTQwLAorCQkweDFFMDAsIDB4REVDMSwgMHhERjgxLCAweDFGNDAsIDB4REQwMSwgMHgxREMwLCAweDFDODAsIDB4REM0MSwKKwkJMHgxNDAwLCAweEQ0QzEsIDB4RDU4MSwgMHgxNTQwLCAweEQ3MDEsIDB4MTdDMCwgMHgxNjgwLCAweEQ2NDEsCisJCTB4RDIwMSwgMHgxMkMwLCAweDEzODAsIDB4RDM0MSwgMHgxMTAwLCAweEQxQzEsIDB4RDA4MSwgMHgxMDQwLAorCQkweEYwMDEsIDB4MzBDMCwgMHgzMTgwLCAweEYxNDEsIDB4MzMwMCwgMHhGM0MxLCAweEYyODEsIDB4MzI0MCwKKwkJMHgzNjAwLCAweEY2QzEsIDB4Rjc4MSwgMHgzNzQwLCAweEY1MDEsIDB4MzVDMCwgMHgzNDgwLCAweEY0NDEsCisJCTB4M0MwMCwgMHhGQ0MxLCAweEZEODEsIDB4M0Q0MCwgMHhGRjAxLCAweDNGQzAsIDB4M0U4MCwgMHhGRTQxLAorCQkweEZBMDEsIDB4M0FDMCwgMHgzQjgwLCAweEZCNDEsIDB4MzkwMCwgMHhGOUMxLCAweEY4ODEsIDB4Mzg0MCwKKwkJMHgyODAwLCAweEU4QzEsIDB4RTk4MSwgMHgyOTQwLCAweEVCMDEsIDB4MkJDMCwgMHgyQTgwLCAweEVBNDEsCisJCTB4RUUwMSwgMHgyRUMwLCAweDJGODAsIDB4RUY0MSwgMHgyRDAwLCAweEVEQzEsIDB4RUM4MSwgMHgyQzQwLAorCQkweEU0MDEsIDB4MjRDMCwgMHgyNTgwLCAweEU1NDEsIDB4MjcwMCwgMHhFN0MxLCAweEU2ODEsIDB4MjY0MCwKKwkJMHgyMjAwLCAweEUyQzEsIDB4RTM4MSwgMHgyMzQwLCAweEUxMDEsIDB4MjFDMCwgMHgyMDgwLCAweEUwNDEsCisJCTB4QTAwMSwgMHg2MEMwLCAweDYxODAsIDB4QTE0MSwgMHg2MzAwLCAweEEzQzEsIDB4QTI4MSwgMHg2MjQwLAorCQkweDY2MDAsIDB4QTZDMSwgMHhBNzgxLCAweDY3NDAsIDB4QTUwMSwgMHg2NUMwLCAweDY0ODAsIDB4QTQ0MSwKKwkJMHg2QzAwLCAweEFDQzEsIDB4QUQ4MSwgMHg2RDQwLCAweEFGMDEsIDB4NkZDMCwgMHg2RTgwLCAweEFFNDEsCisJCTB4QUEwMSwgMHg2QUMwLCAweDZCODAsIDB4QUI0MSwgMHg2OTAwLCAweEE5QzEsIDB4QTg4MSwgMHg2ODQwLAorCQkweDc4MDAsIDB4QjhDMSwgMHhCOTgxLCAweDc5NDAsIDB4QkIwMSwgMHg3QkMwLCAweDdBODAsIDB4QkE0MSwKKwkJMHhCRTAxLCAweDdFQzAsIDB4N0Y4MCwgMHhCRjQxLCAweDdEMDAsIDB4QkRDMSwgMHhCQzgxLCAweDdDNDAsCisJCTB4QjQwMSwgMHg3NEMwLCAweDc1ODAsIDB4QjU0MSwgMHg3NzAwLCAweEI3QzEsIDB4QjY4MSwgMHg3NjQwLAorCQkweDcyMDAsIDB4QjJDMSwgMHhCMzgxLCAweDczNDAsIDB4QjEwMSwgMHg3MUMwLCAweDcwODAsIDB4QjA0MSwKKwkJMHg1MDAwLCAweDkwQzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNDMCwgMHg1MjgwLCAweDkyNDEsCisJCTB4OTYwMSwgMHg1NkMwLCAweDU3ODAsIDB4OTc0MSwgMHg1NTAwLCAweDk1QzEsIDB4OTQ4MSwgMHg1NDQwLAorCQkweDlDMDEsIDB4NUNDMCwgMHg1RDgwLCAweDlENDEsIDB4NUYwMCwgMHg5RkMxLCAweDlFODEsIDB4NUU0MCwKKwkJMHg1QTAwLCAweDlBQzEsIDB4OUI4MSwgMHg1QjQwLCAweDk5MDEsIDB4NTlDMCwgMHg1ODgwLCAweDk4NDEsCisJCTB4ODgwMSwgMHg0OEMwLCAweDQ5ODAsIDB4ODk0MSwgMHg0QjAwLCAweDhCQzEsIDB4OEE4MSwgMHg0QTQwLAorCQkweDRFMDAsIDB4OEVDMSwgMHg4RjgxLCAweDRGNDAsIDB4OEQwMSwgMHg0REMwLCAweDRDODAsIDB4OEM0MSwKKwkJMHg0NDAwLCAweDg0QzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdDMCwgMHg0NjgwLCAweDg2NDEsCisJCTB4ODIwMSwgMHg0MkMwLCAweDQzODAsIDB4ODM0MSwgMHg0MTAwLCAweDgxQzEsIDB4ODA4MSwgMHg0MDQwLAorfTsKKwordTE2IGV4dDRfY3JjMTYodTE2IGNyY19pbiwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICAgICAgY29uc3QgdTggKnAgPSBidWY7CisgICAgICAgIHUxNiBjcmMgPSBjcmNfaW47CisKKyAgICAgICAgd2hpbGUgKHNpemUtLSkKKyAgICAgICAgICAgICAgICBjcmMgPSBjcmMxNl90YWJbKGNyYyBeICpwKyspICYgMHhGRl0gXiAoY3JjID4+IDgpOworCisgICAgICAgIHJldHVybiBjcmM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDJzaW1nLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDJzaW1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0MnNpbWcuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSAiZXh0NF91dGlscy5oIgorI2luY2x1ZGUgIm1ha2VfZXh0NGZzLmgiCisjaW5jbHVkZSAiYWxsb2NhdGUuaCIKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2RlZmluZSBvZmY2NF90IG9mZl90CisjZW5kaWYKKworI2lmbmRlZiBVU0VfTUlOR1cgLyogT19CSU5BUlkgaXMgd2luZG93cy1zcGVjaWZpYyBmbGFnICovCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGZzX2luZm8gaW5mbzsKKworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqcGF0aCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzIFsgb3B0aW9ucyBdIDxpbWFnZSBvciBibG9jayBkZXZpY2U+IDxvdXRwdXQgaW1hZ2U+XG4iLCBwYXRoKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1jIGluY2x1ZGUgQ1JDIGJsb2NrXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgLXYgdmVyYm9zZSBvdXRwdXRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAteiBnemlwIG91dHB1dFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgIC1TIGRvbid0IHVzZSBzcGFyc2Ugb3V0cHV0IGZvcm1hdFxuIik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9leHQoaW50IGZkKQoreworCW9mZjY0X3QgcmV0OworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrIHNiOworCisJcmV0ID0gbHNlZWs2NChmZCwgMTAyNCwgU0VFS19TRVQpOworCWlmIChyZXQgPCAwKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHNlZWsgdG8gc3VwZXJibG9jayIpOworCisJcmV0ID0gcmVhZChmZCwgJnNiLCBzaXplb2Yoc2IpKTsKKwlpZiAocmV0IDwgMCkKKwkJY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byByZWFkIHN1cGVyYmxvY2siKTsKKwlpZiAocmV0ICE9IHNpemVvZihzYikpCisJCWNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gcmVhZCBhbGwgb2Ygc3VwZXJibG9jayIpOworCisJZXh0NF9wYXJzZV9zYl9pbmZvKCZzYik7CisKKwlyZXQgPSBsc2VlazY0KGZkLCBpbmZvLmxlbiwgU0VFS19TRVQpOworCWlmIChyZXQgPCAwKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHNlZWsgdG8gZW5kIG9mIGlucHV0IGltYWdlIik7CisKKwlyZXQgPSBsc2VlazY0KGZkLCBpbmZvLmJsb2NrX3NpemUgKiAoYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jayArIDEpLCBTRUVLX1NFVCk7CisJaWYgKHJldCA8IDApCisJCWNyaXRpY2FsX2Vycm9yX2Vycm5vKCJmYWlsZWQgdG8gc2VlayB0byBibG9jayBncm91cCBkZXNjcmlwdG9ycyIpOworCisJcmV0ID0gcmVhZChmZCwgYXV4X2luZm8uYmdfZGVzYywgaW5mby5ibG9ja19zaXplICogYXV4X2luZm8uYmdfZGVzY19ibG9ja3MpOworCWlmIChyZXQgPCAwKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHJlYWQgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKwlpZiAocmV0ICE9IChpbnQpaW5mby5ibG9ja19zaXplICogKGludClhdXhfaW5mby5iZ19kZXNjX2Jsb2NrcykKKwkJY3JpdGljYWxfZXJyb3IoImZhaWxlZCB0byByZWFkIGFsbCBvZiBibG9jayBncm91cCBkZXNjcmlwdG9ycyIpOworCisJaWYgKHZlcmJvc2UpIHsKKwkJcHJpbnRmKCJGb3VuZCBmaWxlc3lzdGVtIHdpdGggcGFyYW1ldGVyczpcbiIpOworCQlwcmludGYoIiAgICBTaXplOiAlIlBSSXU2NCJcbiIsIGluZm8ubGVuKTsKKwkJcHJpbnRmKCIgICAgQmxvY2sgc2l6ZTogJWRcbiIsIGluZm8uYmxvY2tfc2l6ZSk7CisJCXByaW50ZigiICAgIEJsb2NrcyBwZXIgZ3JvdXA6ICVkXG4iLCBpbmZvLmJsb2Nrc19wZXJfZ3JvdXApOworCQlwcmludGYoIiAgICBJbm9kZXMgcGVyIGdyb3VwOiAlZFxuIiwgaW5mby5pbm9kZXNfcGVyX2dyb3VwKTsKKwkJcHJpbnRmKCIgICAgSW5vZGUgc2l6ZTogJWRcbiIsIGluZm8uaW5vZGVfc2l6ZSk7CisJCXByaW50ZigiICAgIExhYmVsOiAlc1xuIiwgaW5mby5sYWJlbCk7CisJCXByaW50ZigiICAgIEJsb2NrczogJSJQUkl1NjQiXG4iLCBhdXhfaW5mby5sZW5fYmxvY2tzKTsKKwkJcHJpbnRmKCIgICAgQmxvY2sgZ3JvdXBzOiAlZFxuIiwgYXV4X2luZm8uZ3JvdXBzKTsKKwkJcHJpbnRmKCIgICAgUmVzZXJ2ZWQgYmxvY2sgZ3JvdXAgc2l6ZTogJWRcbiIsIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2Nrcyk7CisJCXByaW50ZigiICAgIFVzZWQgJWQvJWQgaW5vZGVzIGFuZCAlZC8lZCBibG9ja3NcbiIsCisJCQkJYXV4X2luZm8uc2ItPnNfaW5vZGVzX2NvdW50IC0gYXV4X2luZm8uc2ItPnNfZnJlZV9pbm9kZXNfY291bnQsCisJCQkJYXV4X2luZm8uc2ItPnNfaW5vZGVzX2NvdW50LAorCQkJCWF1eF9pbmZvLnNiLT5zX2Jsb2Nrc19jb3VudF9sbyAtIGF1eF9pbmZvLnNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50X2xvLAorCQkJCWF1eF9pbmZvLnNiLT5zX2Jsb2Nrc19jb3VudF9sbyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYml0bWFwX2dldF9iaXQodTggKmJpdG1hcCwgdTMyIGJpdCkKK3sKKwlpZiAoYml0bWFwW2JpdCAvIDhdICYgMSA8PCAoYml0ICUgOCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfc3BhcnNlX2V4dChpbnQgZmQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBibG9jazsKKwlpbnQgc3RhcnRfY29udGlndW91c19ibG9jazsKKwl1OCAqYmxvY2tfYml0bWFwOworCW9mZjY0X3QgcmV0OworCisJYmxvY2tfYml0bWFwID0gbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSk7CisJaWYgKCFibG9ja19iaXRtYXApCisJCWNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgYmxvY2sgYml0bWFwIik7CisKKwlpZiAoYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jayA+IDApCisJCXNwYXJzZV9maWxlX2FkZF9maWxlKGV4dDRfc3BhcnNlX2ZpbGUsIGZpbGVuYW1lLCAwLAorCQkJCWluZm8uYmxvY2tfc2l6ZSAqIGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2ssIDApOworCisJZm9yIChpID0gMDsgaSA8IGF1eF9pbmZvLmdyb3VwczsgaSsrKSB7CisJCXUzMiBmaXJzdF9ibG9jayA9IGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2sgKyBpICogaW5mby5ibG9ja3NfcGVyX2dyb3VwOworCQl1MzIgbGFzdF9ibG9jayA9IG1pbihpbmZvLmJsb2Nrc19wZXJfZ3JvdXAsIGF1eF9pbmZvLmxlbl9ibG9ja3MgLSBmaXJzdF9ibG9jayk7CisKKwkJcmV0ID0gbHNlZWs2NChmZCwgKHU2NClpbmZvLmJsb2NrX3NpemUgKiBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcCwKKwkJCQlTRUVLX1NFVCk7CisJCWlmIChyZXQgPCAwKQorCQkJY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBzZWVrIHRvIGJsb2NrIGdyb3VwIGJpdG1hcCAlZCIsIGkpOworCisJCXJldCA9IHJlYWQoZmQsIGJsb2NrX2JpdG1hcCwgaW5mby5ibG9ja19zaXplKTsKKwkJaWYgKHJldCA8IDApCisJCQljcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHJlYWQgYmxvY2sgZ3JvdXAgYml0bWFwICVkIiwgaSk7CisJCWlmIChyZXQgIT0gKGludClpbmZvLmJsb2NrX3NpemUpCisJCQljcml0aWNhbF9lcnJvcigiZmFpbGVkIHRvIHJlYWQgYWxsIG9mIGJsb2NrIGdyb3VwIGJpdG1hcCAlZCIsIGkpOworCisJCXN0YXJ0X2NvbnRpZ3VvdXNfYmxvY2sgPSAtMTsKKwkJZm9yIChibG9jayA9IDA7IGJsb2NrIDwgbGFzdF9ibG9jazsgYmxvY2srKykgeworCQkJaWYgKHN0YXJ0X2NvbnRpZ3VvdXNfYmxvY2sgPj0gMCkgeworCQkJCWlmICghYml0bWFwX2dldF9iaXQoYmxvY2tfYml0bWFwLCBibG9jaykpIHsKKwkJCQkJdTMyIHN0YXJ0X2Jsb2NrID0gZmlyc3RfYmxvY2sgKyBzdGFydF9jb250aWd1b3VzX2Jsb2NrOworCQkJCQl1MzIgbGVuX2Jsb2NrcyA9IGJsb2NrIC0gc3RhcnRfY29udGlndW91c19ibG9jazsKKworCQkJCQlzcGFyc2VfZmlsZV9hZGRfZmlsZShleHQ0X3NwYXJzZV9maWxlLCBmaWxlbmFtZSwKKwkJCQkJCQkodTY0KWluZm8uYmxvY2tfc2l6ZSAqIHN0YXJ0X2Jsb2NrLAorCQkJCQkJCWluZm8uYmxvY2tfc2l6ZSAqIGxlbl9ibG9ja3MsIHN0YXJ0X2Jsb2NrKTsKKwkJCQkJc3RhcnRfY29udGlndW91c19ibG9jayA9IC0xOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGJpdG1hcF9nZXRfYml0KGJsb2NrX2JpdG1hcCwgYmxvY2spKQorCQkJCQlzdGFydF9jb250aWd1b3VzX2Jsb2NrID0gYmxvY2s7CisJCQl9CisJCX0KKworCQlpZiAoc3RhcnRfY29udGlndW91c19ibG9jayA+PSAwKSB7CisJCQl1MzIgc3RhcnRfYmxvY2sgPSBmaXJzdF9ibG9jayArIHN0YXJ0X2NvbnRpZ3VvdXNfYmxvY2s7CisJCQl1MzIgbGVuX2Jsb2NrcyA9IGxhc3RfYmxvY2sgLSBzdGFydF9jb250aWd1b3VzX2Jsb2NrOworCQkJc3BhcnNlX2ZpbGVfYWRkX2ZpbGUoZXh0NF9zcGFyc2VfZmlsZSwgZmlsZW5hbWUsCisJCQkJCSh1NjQpaW5mby5ibG9ja19zaXplICogc3RhcnRfYmxvY2ssCisJCQkJCWluZm8uYmxvY2tfc2l6ZSAqIGxlbl9ibG9ja3MsIHN0YXJ0X2Jsb2NrKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdDsKKwljb25zdCBjaGFyICppbiA9IE5VTEw7CisJY29uc3QgY2hhciAqb3V0ID0gTlVMTDsKKwlpbnQgZ3ppcCA9IDA7CisJaW50IHNwYXJzZSA9IDE7CisJaW50IGluZmQsIG91dGZkOworCWludCBjcmMgPSAwOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImN2elMiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnYyc6CisJCQljcmMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyYm9zZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlnemlwID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdTJzoKKwkJCXNwYXJzZSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChvcHRpbmQgPj0gYXJnYykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkV4cGVjdGVkIGltYWdlIG9yIGJsb2NrIGRldmljZSBhZnRlciBvcHRpb25zXG4iKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpbiA9IGFyZ3Zbb3B0aW5kKytdOworCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQgb3V0cHV0IGltYWdlIGFmdGVyIGlucHV0IGltYWdlXG4iKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlvdXQgPSBhcmd2W29wdGluZCsrXTsKKworCWlmIChvcHRpbmQgPCBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBhcmd1bWVudDogJXNcbiIsIGFyZ3Zbb3B0aW5kXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaW5mZCA9IG9wZW4oaW4sIE9fUkRPTkxZKTsKKworCWlmIChpbmZkIDwgMCkKKwkJY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBvcGVuIGlucHV0IGltYWdlIik7CisKKwlyZWFkX2V4dChpbmZkKTsKKworCWV4dDRfc3BhcnNlX2ZpbGUgPSBzcGFyc2VfZmlsZV9uZXcoaW5mby5ibG9ja19zaXplLCBpbmZvLmxlbik7CisKKwlidWlsZF9zcGFyc2VfZXh0KGluZmQsIGluKTsKKworCWNsb3NlKGluZmQpOworCisJaWYgKHN0cmNtcChvdXQsICItIikpIHsKKwkJb3V0ZmQgPSBvcGVuKG91dCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjQ0KTsKKwkJaWYgKG91dGZkIDwgMCkgeworCQkJZXJyb3JfZXJybm8oIm9wZW4iKTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwl9IGVsc2UgeworCQlvdXRmZCA9IFNURE9VVF9GSUxFTk87CisJfQorCisJd3JpdGVfZXh0NF9pbWFnZShvdXRmZCwgZ3ppcCwgc3BhcnNlLCBjcmMpOworCWNsb3NlKG91dGZkKTsKKworCXNwYXJzZV9maWxlX2Rlc3Ryb3koZXh0NF9zcGFyc2VfZmlsZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNTIzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NC5oCkBAIC0wLDAgKzEsNTc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioKKyAqKiogICBUaGlzIGhlYWRlciB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBhIExpbnV4IGtlcm5lbCBoZWFkZXIKKyAqKiogICBvZiB0aGUgc2FtZSBuYW1lLCB0byBtYWtlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgdXNlcnNwYWNlIHRvCisgKioqICAgY2FsbCBpbnRvIHRoZSBrZXJuZWwgYXZhaWxhYmxlIHRvIGxpYmMuICBJdCBjb250YWlucyBvbmx5IGNvbnN0YW50cywKKyAqKiogICBzdHJ1Y3R1cmVzLCBhbmQgbWFjcm9zIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBoZWFkZXIsIGFuZCB0aHVzLAorICoqKiAgIGNvbnRhaW5zIG5vIGNvcHlyaWdodGFibGUgaW5mb3JtYXRpb24uCisgKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9FWFQ0X0gKKyNkZWZpbmUgX0VYVDRfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyN1bmRlZiBFWFQ0RlNfREVCVUcKKworI2lmZGVmIEVYVDRGU19ERUJVRworI2RlZmluZSBleHQ0X2RlYnVnKGYsIGEuLi4pICAgZG8geyAgIHByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzIERFQlVHICglcywgJWQpOiAlczoiLCAgIF9fRklMRV9fLCBfX0xJTkVfXywgX19mdW5jX18pOyAgIHByaW50ayhLRVJOX0RFQlVHIGYsICMjIGEpOyAgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBleHQ0X2RlYnVnKGYsIGEuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgZm10LCBhLi4uKSAgIGV4dDRfZXJyb3JfaW5vZGUoX19mdW5jX18sIChpbm9kZSksIChmbXQpLCAjIyBhKTsKKworI2RlZmluZSBFWFQ0X0VSUk9SX0ZJTEUoZmlsZSwgZm10LCBhLi4uKSAgIGV4dDRfZXJyb3JfZmlsZShfX2Z1bmNfXywgKGZpbGUpLCAoZm10KSwgIyMgYSk7CisKK3R5cGVkZWYgaW50IGV4dDRfZ3JwYmxrX3Q7CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGV4dDRfZnNibGtfdDsKKwordHlwZWRlZiBfX3UzMiBleHQ0X2xibGtfdDsKKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZXh0NF9ncm91cF90OworCisjZGVmaW5lIEVYVDRfTUJfSElOVF9NRVJHRSAweDAwMDEKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfUkVTRVJWRUQgMHgwMDAyCisKKyNkZWZpbmUgRVhUNF9NQl9ISU5UX01FVEFEQVRBIDB4MDAwNAorCisjZGVmaW5lIEVYVDRfTUJfSElOVF9GSVJTVCAweDAwMDgKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfQkVTVCAweDAwMTAKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfREFUQSAweDAwMjAKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfTk9QUkVBTExPQyAweDAwNDAKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfR1JPVVBfQUxMT0MgMHgwMDgwCisKKyNkZWZpbmUgRVhUNF9NQl9ISU5UX0dPQUxfT05MWSAweDAxMDAKKworI2RlZmluZSBFWFQ0X01CX0hJTlRfVFJZX0dPQUwgMHgwMjAwCisKKyNkZWZpbmUgRVhUNF9NQl9ERUxBTExPQ19SRVNFUlZFRCAweDA0MDAKKworI2RlZmluZSBFWFQ0X01CX1NUUkVBTV9BTExPQyAweDA4MDAKKworc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9yZXF1ZXN0IHsKKworIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKyB1bnNpZ25lZCBpbnQgbGVuOworCisgZXh0NF9sYmxrX3QgbG9naWNhbDsKKworIGV4dDRfbGJsa190IGxsZWZ0OworCisgZXh0NF9sYmxrX3QgbHJpZ2h0OworCisgZXh0NF9mc2Jsa190IGdvYWw7CisKKyBleHQ0X2ZzYmxrX3QgcGxlZnQ7CisKKyBleHQ0X2ZzYmxrX3QgcHJpZ2h0OworCisgdW5zaWduZWQgaW50IGZsYWdzOworfTsKKworI2RlZmluZSBFWFQ0X0JBRF9JTk8gMSAgCisjZGVmaW5lIEVYVDRfUk9PVF9JTk8gMiAgCisjZGVmaW5lIEVYVDRfQk9PVF9MT0FERVJfSU5PIDUgIAorI2RlZmluZSBFWFQ0X1VOREVMX0RJUl9JTk8gNiAgCisjZGVmaW5lIEVYVDRfUkVTSVpFX0lOTyA3ICAKKyNkZWZpbmUgRVhUNF9KT1VSTkFMX0lOTyA4ICAKKworI2RlZmluZSBFWFQ0X0dPT0RfT0xEX0ZJUlNUX0lOTyAxMQorCisjZGVmaW5lIEVYVDRfTElOS19NQVggNjUwMDAKKworI2RlZmluZSBFWFQ0X01JTl9CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUgRVhUNF9NQVhfQkxPQ0tfU0laRSA2NTUzNgorI2RlZmluZSBFWFQ0X01JTl9CTE9DS19MT0dfU0laRSAxMAorI2RlZmluZSBFWFQ0X0JMT0NLX1NJWkUocykgKEVYVDRfTUlOX0JMT0NLX1NJWkUgPDwgKHMpLT5zX2xvZ19ibG9ja19zaXplKQorI2RlZmluZSBFWFQ0X0FERFJfUEVSX0JMT0NLKHMpIChFWFQ0X0JMT0NLX1NJWkUocykgLyBzaXplb2YoX191MzIpKQorI2RlZmluZSBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzKSAoKHMpLT5zX2xvZ19ibG9ja19zaXplICsgMTApCisjZGVmaW5lIEVYVDRfSU5PREVfU0laRShzKSAoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUNF9HT09EX09MRF9SRVYpID8gICBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgOiAgIChzKS0+c19pbm9kZV9zaXplKQorI2RlZmluZSBFWFQ0X0ZJUlNUX0lOTyhzKSAoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUNF9HT09EX09MRF9SRVYpID8gICBFWFQ0X0dPT0RfT0xEX0ZJUlNUX0lOTyA6ICAgKHMpLT5zX2ZpcnN0X2lubykKKyNkZWZpbmUgRVhUNF9CTE9DS19BTElHTihzaXplLCBibGtiaXRzKSBBTElHTigoc2l6ZSksICgxIDw8IChibGtiaXRzKSkpCisKK3N0cnVjdCBleHQ0X2dyb3VwX2Rlc2MKK3sKKyBfX2xlMzIgYmdfYmxvY2tfYml0bWFwX2xvOworIF9fbGUzMiBiZ19pbm9kZV9iaXRtYXBfbG87CisgX19sZTMyIGJnX2lub2RlX3RhYmxlX2xvOworIF9fbGUxNiBiZ19mcmVlX2Jsb2Nrc19jb3VudF9sbzsKKyBfX2xlMTYgYmdfZnJlZV9pbm9kZXNfY291bnRfbG87CisgX19sZTE2IGJnX3VzZWRfZGlyc19jb3VudF9sbzsKKyBfX2xlMTYgYmdfZmxhZ3M7CisgX191MzIgYmdfcmVzZXJ2ZWRbMl07CisgX19sZTE2IGJnX2l0YWJsZV91bnVzZWRfbG87CisgX19sZTE2IGJnX2NoZWNrc3VtOworIF9fbGUzMiBiZ19ibG9ja19iaXRtYXBfaGk7CisgX19sZTMyIGJnX2lub2RlX2JpdG1hcF9oaTsKKyBfX2xlMzIgYmdfaW5vZGVfdGFibGVfaGk7CisgX19sZTE2IGJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpOworIF9fbGUxNiBiZ19mcmVlX2lub2Rlc19jb3VudF9oaTsKKyBfX2xlMTYgYmdfdXNlZF9kaXJzX2NvdW50X2hpOworIF9fbGUxNiBiZ19pdGFibGVfdW51c2VkX2hpOworIF9fdTMyIGJnX3Jlc2VydmVkMlszXTsKK307CisKKyNkZWZpbmUgRVhUNF9CR19JTk9ERV9VTklOSVQgMHgwMDAxICAKKyNkZWZpbmUgRVhUNF9CR19CTE9DS19VTklOSVQgMHgwMDAyICAKKyNkZWZpbmUgRVhUNF9CR19JTk9ERV9aRVJPRUQgMHgwMDA0ICAKKworI2RlZmluZSBFWFQ0X01JTl9ERVNDX1NJWkUgMzIKKyNkZWZpbmUgRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUIDY0CisjZGVmaW5lIEVYVDRfTUFYX0RFU0NfU0laRSBFWFQ0X01JTl9CTE9DS19TSVpFCisjZGVmaW5lIEVYVDRfREVTQ19TSVpFKHMpIChFWFQ0X1NCKHMpLT5zX2Rlc2Nfc2l6ZSkKKyNkZWZpbmUgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHMpICgocyktPnNfYmxvY2tzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUNF9ERVNDX1BFUl9CTE9DSyhzKSAoRVhUNF9CTE9DS19TSVpFKHMpIC8gRVhUNF9ERVNDX1NJWkUocykpCisjZGVmaW5lIEVYVDRfSU5PREVTX1BFUl9HUk9VUChzKSAoKHMpLT5zX2lub2Rlc19wZXJfZ3JvdXApCisKKyNkZWZpbmUgRVhUNF9ORElSX0JMT0NLUyAxMgorI2RlZmluZSBFWFQ0X0lORF9CTE9DSyBFWFQ0X05ESVJfQkxPQ0tTCisjZGVmaW5lIEVYVDRfRElORF9CTE9DSyAoRVhUNF9JTkRfQkxPQ0sgKyAxKQorI2RlZmluZSBFWFQ0X1RJTkRfQkxPQ0sgKEVYVDRfRElORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDRfTl9CTE9DS1MgKEVYVDRfVElORF9CTE9DSyArIDEpCisKKyNkZWZpbmUgRVhUNF9TRUNSTV9GTCAweDAwMDAwMDAxICAKKyNkZWZpbmUgRVhUNF9VTlJNX0ZMIDB4MDAwMDAwMDIgIAorI2RlZmluZSBFWFQ0X0NPTVBSX0ZMIDB4MDAwMDAwMDQgIAorI2RlZmluZSBFWFQ0X1NZTkNfRkwgMHgwMDAwMDAwOCAgCisjZGVmaW5lIEVYVDRfSU1NVVRBQkxFX0ZMIDB4MDAwMDAwMTAgIAorI2RlZmluZSBFWFQ0X0FQUEVORF9GTCAweDAwMDAwMDIwICAKKyNkZWZpbmUgRVhUNF9OT0RVTVBfRkwgMHgwMDAwMDA0MCAgCisjZGVmaW5lIEVYVDRfTk9BVElNRV9GTCAweDAwMDAwMDgwICAKKworI2RlZmluZSBFWFQ0X0RJUlRZX0ZMIDB4MDAwMDAxMDAKKyNkZWZpbmUgRVhUNF9DT01QUkJMS19GTCAweDAwMDAwMjAwICAKKyNkZWZpbmUgRVhUNF9OT0NPTVBSX0ZMIDB4MDAwMDA0MDAgIAorI2RlZmluZSBFWFQ0X0VDT01QUl9GTCAweDAwMDAwODAwICAKKworI2RlZmluZSBFWFQ0X0lOREVYX0ZMIDB4MDAwMDEwMDAgIAorI2RlZmluZSBFWFQ0X0lNQUdJQ19GTCAweDAwMDAyMDAwICAKKyNkZWZpbmUgRVhUNF9KT1VSTkFMX0RBVEFfRkwgMHgwMDAwNDAwMCAgCisjZGVmaW5lIEVYVDRfTk9UQUlMX0ZMIDB4MDAwMDgwMDAgIAorI2RlZmluZSBFWFQ0X0RJUlNZTkNfRkwgMHgwMDAxMDAwMCAgCisjZGVmaW5lIEVYVDRfVE9QRElSX0ZMIDB4MDAwMjAwMDAgIAorI2RlZmluZSBFWFQ0X0hVR0VfRklMRV9GTCAweDAwMDQwMDAwICAKKyNkZWZpbmUgRVhUNF9FWFRFTlRTX0ZMIDB4MDAwODAwMDAgIAorI2RlZmluZSBFWFQ0X0VBX0lOT0RFX0ZMIDB4MDAyMDAwMDAgIAorI2RlZmluZSBFWFQ0X0VPRkJMT0NLU19GTCAweDAwNDAwMDAwICAKKyNkZWZpbmUgRVhUNF9SRVNFUlZFRF9GTCAweDgwMDAwMDAwICAKKworI2RlZmluZSBFWFQ0X0ZMX1VTRVJfVklTSUJMRSAweDAwNEJERkZGICAKKyNkZWZpbmUgRVhUNF9GTF9VU0VSX01PRElGSUFCTEUgMHgwMDRCODBGRiAgCisKKyNkZWZpbmUgRVhUNF9GTF9JTkhFUklURUQgKEVYVDRfU0VDUk1fRkwgfCBFWFQ0X1VOUk1fRkwgfCBFWFQ0X0NPTVBSX0ZMIHwgIEVYVDRfU1lOQ19GTCB8IEVYVDRfSU1NVVRBQkxFX0ZMIHwgRVhUNF9BUFBFTkRfRkwgfCAgRVhUNF9OT0RVTVBfRkwgfCBFWFQ0X05PQVRJTUVfRkwgfCAgRVhUNF9OT0NPTVBSX0ZMIHwgRVhUNF9KT1VSTkFMX0RBVEFfRkwgfCAgRVhUNF9OT1RBSUxfRkwgfCBFWFQ0X0RJUlNZTkNfRkwpCisKKyNkZWZpbmUgRVhUNF9SRUdfRkxNQVNLICh+KEVYVDRfRElSU1lOQ19GTCB8IEVYVDRfVE9QRElSX0ZMKSkKKworI2RlZmluZSBFWFQ0X09USEVSX0ZMTUFTSyAoRVhUNF9OT0RVTVBfRkwgfCBFWFQ0X05PQVRJTUVfRkwpCisKK3N0cnVjdCBleHQ0X25ld19ncm91cF9kYXRhIHsKKyBfX3UzMiBncm91cDsKKyBfX3U2NCBibG9ja19iaXRtYXA7CisgX191NjQgaW5vZGVfYml0bWFwOworIF9fdTY0IGlub2RlX3RhYmxlOworIF9fdTMyIGJsb2Nrc19jb3VudDsKKyBfX3UxNiByZXNlcnZlZF9ibG9ja3M7CisgX191MTYgdW51c2VkOworIF9fdTMyIGZyZWVfYmxvY2tzX2NvdW50OworfTsKKworI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFIDB4MDAwMQorCisjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUIDB4MDAwMgorI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFX1VOSU5JVF9FWFQgKEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUfCAgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkKKworI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSAweDAwMDQKKworI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfUFJFX0lPIDB4MDAwOAorI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfQ09OVkVSVCAweDAwMTAKKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX0lPX0NSRUFURV9FWFQgKEVYVDRfR0VUX0JMT0NLU19QUkVfSU98ICBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFX1VOSU5JVF9FWFQpCisKKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX0lPX0NPTlZFUlRfRVhUIChFWFQ0X0dFVF9CTE9DS1NfQ09OVkVSVHwgIEVYVDRfR0VUX0JMT0NLU19DUkVBVEVfVU5JTklUX0VYVCkKKworI2RlZmluZSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBIDB4MDAwMQorI2RlZmluZSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCAweDAwMDIKKyNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19WQUxJREFURUQgMHgwMDA0CisKKyNkZWZpbmUgRVhUNF9JT0NfR0VURkxBR1MgRlNfSU9DX0dFVEZMQUdTCisjZGVmaW5lIEVYVDRfSU9DX1NFVEZMQUdTIEZTX0lPQ19TRVRGTEFHUworI2RlZmluZSBFWFQ0X0lPQ19HRVRWRVJTSU9OIF9JT1IoJ2YnLCAzLCBsb25nKQorI2RlZmluZSBFWFQ0X0lPQ19TRVRWRVJTSU9OIF9JT1coJ2YnLCA0LCBsb25nKQorI2RlZmluZSBFWFQ0X0lPQ19HRVRWRVJTSU9OX09MRCBGU19JT0NfR0VUVkVSU0lPTgorI2RlZmluZSBFWFQ0X0lPQ19TRVRWRVJTSU9OX09MRCBGU19JT0NfU0VUVkVSU0lPTgorI2RlZmluZSBFWFQ0X0lPQ19HRVRSU1ZTWiBfSU9SKCdmJywgNSwgbG9uZykKKyNkZWZpbmUgRVhUNF9JT0NfU0VUUlNWU1ogX0lPVygnZicsIDYsIGxvbmcpCisjZGVmaW5lIEVYVDRfSU9DX0dST1VQX0VYVEVORCBfSU9XKCdmJywgNywgdW5zaWduZWQgbG9uZykKKyNkZWZpbmUgRVhUNF9JT0NfR1JPVVBfQUREIF9JT1coJ2YnLCA4LCBzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQpCisjZGVmaW5lIEVYVDRfSU9DX01JR1JBVEUgX0lPKCdmJywgOSkKKworI2RlZmluZSBFWFQ0X0lPQ19BTExPQ19EQV9CTEtTIF9JTygnZicsIDEyKQorI2RlZmluZSBFWFQ0X0lPQ19NT1ZFX0VYVCBfSU9XUignZicsIDE1LCBzdHJ1Y3QgbW92ZV9leHRlbnQpCisKKyNkZWZpbmUgRVhUNF9JT0MzMl9HRVRGTEFHUyBGU19JT0MzMl9HRVRGTEFHUworI2RlZmluZSBFWFQ0X0lPQzMyX1NFVEZMQUdTIEZTX0lPQzMyX1NFVEZMQUdTCisjZGVmaW5lIEVYVDRfSU9DMzJfR0VUVkVSU0lPTiBfSU9SKCdmJywgMywgaW50KQorI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT04gX0lPVygnZicsIDQsIGludCkKKyNkZWZpbmUgRVhUNF9JT0MzMl9HRVRSU1ZTWiBfSU9SKCdmJywgNSwgaW50KQorI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFJTVlNaIF9JT1coJ2YnLCA2LCBpbnQpCisjZGVmaW5lIEVYVDRfSU9DMzJfR1JPVVBfRVhURU5EIF9JT1coJ2YnLCA3LCB1bnNpZ25lZCBpbnQpCisjZGVmaW5lIEVYVDRfSU9DMzJfR0VUVkVSU0lPTl9PTEQgRlNfSU9DMzJfR0VUVkVSU0lPTgorI2RlZmluZSBFWFQ0X0lPQzMyX1NFVFZFUlNJT05fT0xEIEZTX0lPQzMyX1NFVFZFUlNJT04KKworI2RlZmluZSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMgMHhGRkZGRkZGRgorCitzdHJ1Y3QgZXh0NF9pbm9kZSB7CisgX19sZTE2IGlfbW9kZTsKKyBfX2xlMTYgaV91aWQ7CisgX19sZTMyIGlfc2l6ZV9sbzsKKyBfX2xlMzIgaV9hdGltZTsKKyBfX2xlMzIgaV9jdGltZTsKKyBfX2xlMzIgaV9tdGltZTsKKyBfX2xlMzIgaV9kdGltZTsKKyBfX2xlMTYgaV9naWQ7CisgX19sZTE2IGlfbGlua3NfY291bnQ7CisgX19sZTMyIGlfYmxvY2tzX2xvOworIF9fbGUzMiBpX2ZsYWdzOworIHVuaW9uIHsKKyBzdHJ1Y3QgeworIF9fbGUzMiBsX2lfdmVyc2lvbjsKKyB9IGxpbnV4MTsKKyBzdHJ1Y3QgeworIF9fdTMyIGhfaV90cmFuc2xhdG9yOworIH0gaHVyZDE7Cisgc3RydWN0IHsKKyBfX3UzMiBtX2lfcmVzZXJ2ZWQxOworIH0gbWFzaXgxOworIH0gb3NkMTsKKyBfX2xlMzIgaV9ibG9ja1tFWFQ0X05fQkxPQ0tTXTsKKyBfX2xlMzIgaV9nZW5lcmF0aW9uOworIF9fbGUzMiBpX2ZpbGVfYWNsX2xvOworIF9fbGUzMiBpX3NpemVfaGlnaDsKKyBfX2xlMzIgaV9vYnNvX2ZhZGRyOworIHVuaW9uIHsKKyBzdHJ1Y3QgeworIF9fbGUxNiBsX2lfYmxvY2tzX2hpZ2g7CisgX19sZTE2IGxfaV9maWxlX2FjbF9oaWdoOworIF9fbGUxNiBsX2lfdWlkX2hpZ2g7CisgX19sZTE2IGxfaV9naWRfaGlnaDsKKyBfX3UzMiBsX2lfcmVzZXJ2ZWQyOworIH0gbGludXgyOworIHN0cnVjdCB7CisgX19sZTE2IGhfaV9yZXNlcnZlZDE7CisgX191MTYgaF9pX21vZGVfaGlnaDsKKyBfX3UxNiBoX2lfdWlkX2hpZ2g7CisgX191MTYgaF9pX2dpZF9oaWdoOworIF9fdTMyIGhfaV9hdXRob3I7CisgfSBodXJkMjsKKyBzdHJ1Y3QgeworIF9fbGUxNiBoX2lfcmVzZXJ2ZWQxOworIF9fbGUxNiBtX2lfZmlsZV9hY2xfaGlnaDsKKyBfX3UzMiBtX2lfcmVzZXJ2ZWQyWzJdOworIH0gbWFzaXgyOworIH0gb3NkMjsKKyBfX2xlMTYgaV9leHRyYV9pc2l6ZTsKKyBfX2xlMTYgaV9wYWQxOworIF9fbGUzMiBpX2N0aW1lX2V4dHJhOworIF9fbGUzMiBpX210aW1lX2V4dHJhOworIF9fbGUzMiBpX2F0aW1lX2V4dHJhOworIF9fbGUzMiBpX2NydGltZTsKKyBfX2xlMzIgaV9jcnRpbWVfZXh0cmE7CisgX19sZTMyIGlfdmVyc2lvbl9oaTsKK307CisKK3N0cnVjdCBtb3ZlX2V4dGVudCB7CisgX191MzIgcmVzZXJ2ZWQ7CisgX191MzIgZG9ub3JfZmQ7CisgX191NjQgb3JpZ19zdGFydDsKKyBfX3U2NCBkb25vcl9zdGFydDsKKyBfX3U2NCBsZW47CisgX191NjQgbW92ZWRfbGVuOworfTsKKworI2RlZmluZSBFWFQ0X0VQT0NIX0JJVFMgMgorI2RlZmluZSBFWFQ0X0VQT0NIX01BU0sgKCgxIDw8IEVYVDRfRVBPQ0hfQklUUykgLSAxKQorI2RlZmluZSBFWFQ0X05TRUNfTUFTSyAofjBVTCA8PCBFWFQ0X0VQT0NIX0JJVFMpCisKKyNkZWZpbmUgRVhUNF9GSVRTX0lOX0lOT0RFKGV4dDRfaW5vZGUsIGVpbm9kZSwgZmllbGQpICAgKChvZmZzZXRvZih0eXBlb2YoKmV4dDRfaW5vZGUpLCBmaWVsZCkgKyAgIHNpemVvZigoZXh0NF9pbm9kZSktPmZpZWxkKSkgICA8PSAoRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICsgICAoZWlub2RlKS0+aV9leHRyYV9pc2l6ZSkpICAKKyNkZWZpbmUgRVhUNF9JTk9ERV9TRVRfWFRJTUUoeHRpbWUsIGlub2RlLCByYXdfaW5vZGUpICBkbyB7ICAgKHJhd19pbm9kZSktPnh0aW1lID0gY3B1X3RvX2xlMzIoKGlub2RlKS0+eHRpbWUudHZfc2VjKTsgICBpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgRVhUNF9JKGlub2RlKSwgeHRpbWUgIyMgX2V4dHJhKSkgICAocmF3X2lub2RlKS0+eHRpbWUgIyMgX2V4dHJhID0gICBleHQ0X2VuY29kZV9leHRyYV90aW1lKCYoaW5vZGUpLT54dGltZSk7ICB9IHdoaWxlICgwKQorI2RlZmluZSBFWFQ0X0VJTk9ERV9TRVRfWFRJTUUoeHRpbWUsIGVpbm9kZSwgcmF3X2lub2RlKSAgZG8geyAgIGlmIChFWFQ0X0ZJVFNfSU5fSU5PREUocmF3X2lub2RlLCBlaW5vZGUsIHh0aW1lKSkgICAocmF3X2lub2RlKS0+eHRpbWUgPSBjcHVfdG9fbGUzMigoZWlub2RlKS0+eHRpbWUudHZfc2VjKTsgICBpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgZWlub2RlLCB4dGltZSAjIyBfZXh0cmEpKSAgIChyYXdfaW5vZGUpLT54dGltZSAjIyBfZXh0cmEgPSAgIGV4dDRfZW5jb2RlX2V4dHJhX3RpbWUoJihlaW5vZGUpLT54dGltZSk7ICB9IHdoaWxlICgwKQorI2RlZmluZSBFWFQ0X0lOT0RFX0dFVF9YVElNRSh4dGltZSwgaW5vZGUsIHJhd19pbm9kZSkgIGRvIHsgICAoaW5vZGUpLT54dGltZS50dl9zZWMgPSAoc2lnbmVkKWxlMzJfdG9fY3B1KChyYXdfaW5vZGUpLT54dGltZSk7ICAgaWYgKEVYVDRfRklUU19JTl9JTk9ERShyYXdfaW5vZGUsIEVYVDRfSShpbm9kZSksIHh0aW1lICMjIF9leHRyYSkpICAgZXh0NF9kZWNvZGVfZXh0cmFfdGltZSgmKGlub2RlKS0+eHRpbWUsICAgcmF3X2lub2RlLT54dGltZSAjIyBfZXh0cmEpOyAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgRVhUNF9FSU5PREVfR0VUX1hUSU1FKHh0aW1lLCBlaW5vZGUsIHJhd19pbm9kZSkgIGRvIHsgICBpZiAoRVhUNF9GSVRTX0lOX0lOT0RFKHJhd19pbm9kZSwgZWlub2RlLCB4dGltZSkpICAgKGVpbm9kZSktPnh0aW1lLnR2X3NlYyA9ICAgKHNpZ25lZClsZTMyX3RvX2NwdSgocmF3X2lub2RlKS0+eHRpbWUpOyAgIGlmIChFWFQ0X0ZJVFNfSU5fSU5PREUocmF3X2lub2RlLCBlaW5vZGUsIHh0aW1lICMjIF9leHRyYSkpICAgZXh0NF9kZWNvZGVfZXh0cmFfdGltZSgmKGVpbm9kZSktPnh0aW1lLCAgIHJhd19pbm9kZS0+eHRpbWUgIyMgX2V4dHJhKTsgIH0gd2hpbGUgKDApCisjZGVmaW5lIGlfZGlza192ZXJzaW9uIG9zZDEubGludXgxLmxfaV92ZXJzaW9uCisKKyNkZWZpbmUgaV9yZXNlcnZlZDEgb3NkMS5saW51eDEubF9pX3Jlc2VydmVkMQorI2RlZmluZSBpX2ZpbGVfYWNsX2hpZ2ggb3NkMi5saW51eDIubF9pX2ZpbGVfYWNsX2hpZ2gKKyNkZWZpbmUgaV9ibG9ja3NfaGlnaCBvc2QyLmxpbnV4Mi5sX2lfYmxvY2tzX2hpZ2gKKyNkZWZpbmUgaV91aWRfbG93IGlfdWlkCisjZGVmaW5lIGlfZ2lkX2xvdyBpX2dpZAorI2RlZmluZSBpX3VpZF9oaWdoIG9zZDIubGludXgyLmxfaV91aWRfaGlnaAorI2RlZmluZSBpX2dpZF9oaWdoIG9zZDIubGludXgyLmxfaV9naWRfaGlnaAorI2RlZmluZSBpX3Jlc2VydmVkMiBvc2QyLmxpbnV4Mi5sX2lfcmVzZXJ2ZWQyCisKKyNkZWZpbmUgRVhUNF9WQUxJRF9GUyAweDAwMDEgIAorI2RlZmluZSBFWFQ0X0VSUk9SX0ZTIDB4MDAwMiAgCisjZGVmaW5lIEVYVDRfT1JQSEFOX0ZTIDB4MDAwNCAgCisKKyNkZWZpbmUgRVhUMl9GTEFHU19TSUdORURfSEFTSCAweDAwMDEgIAorI2RlZmluZSBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0ggMHgwMDAyICAKKyNkZWZpbmUgRVhUMl9GTEFHU19URVNUX0ZJTEVTWVMgMHgwMDA0ICAKKworI2RlZmluZSBFWFQ0X01PVU5UX09MREFMTE9DIDB4MDAwMDIgIAorI2RlZmluZSBFWFQ0X01PVU5UX0dSUElEIDB4MDAwMDQgIAorI2RlZmluZSBFWFQ0X01PVU5UX0RFQlVHIDB4MDAwMDggIAorI2RlZmluZSBFWFQ0X01PVU5UX0VSUk9SU19DT05UIDB4MDAwMTAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0VSUk9SU19STyAweDAwMDIwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9FUlJPUlNfUEFOSUMgMHgwMDA0MCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfTUlOSVhfREYgMHgwMDA4MCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfTk9MT0FEIDB4MDAxMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0RBVEFfRkxBR1MgMHgwMEMwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9EQVRBIDB4MDA0MDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX09SREVSRURfREFUQSAweDAwODAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9XUklURUJBQ0tfREFUQSAweDAwQzAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9VUERBVEVfSk9VUk5BTCAweDAxMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9OT19VSUQzMiAweDAyMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9YQVRUUl9VU0VSIDB4MDQwMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX1BPU0lYX0FDTCAweDA4MDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9OT19BVVRPX0RBX0FMTE9DIDB4MTAwMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0JBUlJJRVIgMHgyMDAwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfTk9CSCAweDQwMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9RVU9UQSAweDgwMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9VU1JRVU9UQSAweDEwMDAwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfR1JQUVVPVEEgMHgyMDAwMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0RJT1JFQURfTk9MT0NLIDB4NDAwMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9KT1VSTkFMX0NIRUNLU1VNIDB4ODAwMDAwICAKKyNkZWZpbmUgRVhUNF9NT1VOVF9KT1VSTkFMX0FTWU5DX0NPTU1JVCAweDEwMDAwMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0lfVkVSU0lPTiAweDIwMDAwMDAgIAorI2RlZmluZSBFWFQ0X01PVU5UX0RFTEFMTE9DIDB4ODAwMDAwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfREFUQV9FUlJfQUJPUlQgMHgxMDAwMDAwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfQkxPQ0tfVkFMSURJVFkgMHgyMDAwMDAwMCAgCisjZGVmaW5lIEVYVDRfTU9VTlRfRElTQ0FSRCAweDQwMDAwMDAwICAKKworI2RlZmluZSBjbGVhcl9vcHQobywgb3B0KSBvICY9IH5FWFQ0X01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KSBvIHw9IEVYVDRfTU9VTlRfIyNvcHQKKyNkZWZpbmUgdGVzdF9vcHQoc2IsIG9wdCkgKEVYVDRfU0Ioc2IpLT5zX21vdW50X29wdCAmICAgRVhUNF9NT1VOVF8jI29wdCkKKworI2RlZmluZSBleHQ0X3NldF9iaXQgZXh0Ml9zZXRfYml0CisjZGVmaW5lIGV4dDRfc2V0X2JpdF9hdG9taWMgZXh0Ml9zZXRfYml0X2F0b21pYworI2RlZmluZSBleHQ0X2NsZWFyX2JpdCBleHQyX2NsZWFyX2JpdAorI2RlZmluZSBleHQ0X2NsZWFyX2JpdF9hdG9taWMgZXh0Ml9jbGVhcl9iaXRfYXRvbWljCisjZGVmaW5lIGV4dDRfdGVzdF9iaXQgZXh0Ml90ZXN0X2JpdAorI2RlZmluZSBleHQ0X2ZpbmRfZmlyc3RfemVyb19iaXQgZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0CisjZGVmaW5lIGV4dDRfZmluZF9uZXh0X3plcm9fYml0IGV4dDJfZmluZF9uZXh0X3plcm9fYml0CisjZGVmaW5lIGV4dDRfZmluZF9uZXh0X2JpdCBleHQyX2ZpbmRfbmV4dF9iaXQKKworI2RlZmluZSBFWFQ0X0RGTF9NQVhfTU5UX0NPVU5UIDIwICAKKyNkZWZpbmUgRVhUNF9ERkxfQ0hFQ0tJTlRFUlZBTCAwICAKKworI2RlZmluZSBFWFQ0X0VSUk9SU19DT05USU5VRSAxICAKKyNkZWZpbmUgRVhUNF9FUlJPUlNfUk8gMiAgCisjZGVmaW5lIEVYVDRfRVJST1JTX1BBTklDIDMgIAorI2RlZmluZSBFWFQ0X0VSUk9SU19ERUZBVUxUIEVYVDRfRVJST1JTX0NPTlRJTlVFCisKK3N0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrIHsKKyAgX19sZTMyIHNfaW5vZGVzX2NvdW50OworIF9fbGUzMiBzX2Jsb2Nrc19jb3VudF9sbzsKKyBfX2xlMzIgc19yX2Jsb2Nrc19jb3VudF9sbzsKKyBfX2xlMzIgc19mcmVlX2Jsb2Nrc19jb3VudF9sbzsKKyAgX19sZTMyIHNfZnJlZV9pbm9kZXNfY291bnQ7CisgX19sZTMyIHNfZmlyc3RfZGF0YV9ibG9jazsKKyBfX2xlMzIgc19sb2dfYmxvY2tfc2l6ZTsKKyBfX2xlMzIgc19vYnNvX2xvZ19mcmFnX3NpemU7CisgIF9fbGUzMiBzX2Jsb2Nrc19wZXJfZ3JvdXA7CisgX19sZTMyIHNfb2Jzb19mcmFnc19wZXJfZ3JvdXA7CisgX19sZTMyIHNfaW5vZGVzX3Blcl9ncm91cDsKKyBfX2xlMzIgc19tdGltZTsKKyAgX19sZTMyIHNfd3RpbWU7CisgX19sZTE2IHNfbW50X2NvdW50OworIF9fbGUxNiBzX21heF9tbnRfY291bnQ7CisgX19sZTE2IHNfbWFnaWM7CisgX19sZTE2IHNfc3RhdGU7CisgX19sZTE2IHNfZXJyb3JzOworIF9fbGUxNiBzX21pbm9yX3Jldl9sZXZlbDsKKyAgX19sZTMyIHNfbGFzdGNoZWNrOworIF9fbGUzMiBzX2NoZWNraW50ZXJ2YWw7CisgX19sZTMyIHNfY3JlYXRvcl9vczsKKyBfX2xlMzIgc19yZXZfbGV2ZWw7CisgIF9fbGUxNiBzX2RlZl9yZXN1aWQ7CisgX19sZTE2IHNfZGVmX3Jlc2dpZDsKKworIF9fbGUzMiBzX2ZpcnN0X2lubzsKKyBfX2xlMTYgc19pbm9kZV9zaXplOworIF9fbGUxNiBzX2Jsb2NrX2dyb3VwX25yOworIF9fbGUzMiBzX2ZlYXR1cmVfY29tcGF0OworICBfX2xlMzIgc19mZWF0dXJlX2luY29tcGF0OworIF9fbGUzMiBzX2ZlYXR1cmVfcm9fY29tcGF0OworICBfX3U4IHNfdXVpZFsxNl07CisgIGNoYXIgc192b2x1bWVfbmFtZVsxNl07CisgIGNoYXIgc19sYXN0X21vdW50ZWRbNjRdOworICBfX2xlMzIgc19hbGdvcml0aG1fdXNhZ2VfYml0bWFwOworCisgX191OCBzX3ByZWFsbG9jX2Jsb2NrczsKKyBfX3U4IHNfcHJlYWxsb2NfZGlyX2Jsb2NrczsKKyBfX2xlMTYgc19yZXNlcnZlZF9nZHRfYmxvY2tzOworCisgIF9fdTggc19qb3VybmFsX3V1aWRbMTZdOworICBfX2xlMzIgc19qb3VybmFsX2ludW07CisgX19sZTMyIHNfam91cm5hbF9kZXY7CisgX19sZTMyIHNfbGFzdF9vcnBoYW47CisgX19sZTMyIHNfaGFzaF9zZWVkWzRdOworIF9fdTggc19kZWZfaGFzaF92ZXJzaW9uOworIF9fdTggc19yZXNlcnZlZF9jaGFyX3BhZDsKKyBfX2xlMTYgc19kZXNjX3NpemU7CisgIF9fbGUzMiBzX2RlZmF1bHRfbW91bnRfb3B0czsKKyBfX2xlMzIgc19maXJzdF9tZXRhX2JnOworIF9fbGUzMiBzX21rZnNfdGltZTsKKyBfX2xlMzIgc19qbmxfYmxvY2tzWzE3XTsKKworICBfX2xlMzIgc19ibG9ja3NfY291bnRfaGk7CisgX19sZTMyIHNfcl9ibG9ja3NfY291bnRfaGk7CisgX19sZTMyIHNfZnJlZV9ibG9ja3NfY291bnRfaGk7CisgX19sZTE2IHNfbWluX2V4dHJhX2lzaXplOworIF9fbGUxNiBzX3dhbnRfZXh0cmFfaXNpemU7CisgX19sZTMyIHNfZmxhZ3M7CisgX19sZTE2IHNfcmFpZF9zdHJpZGU7CisgX19sZTE2IHNfbW1wX2ludGVydmFsOworIF9fbGU2NCBzX21tcF9ibG9jazsKKyBfX2xlMzIgc19yYWlkX3N0cmlwZV93aWR0aDsKKyBfX3U4IHNfbG9nX2dyb3Vwc19wZXJfZmxleDsKKyBfX3U4IHNfcmVzZXJ2ZWRfY2hhcl9wYWQyOworIF9fbGUxNiBzX3Jlc2VydmVkX3BhZDsKKyBfX2xlNjQgc19rYnl0ZXNfd3JpdHRlbjsKKyBfX3UzMiBzX3Jlc2VydmVkWzE2MF07Cit9OworCisjZGVmaW5lIEVYVDRfU0Ioc2IpIChzYikKKworI2RlZmluZSBORVhUX09SUEhBTihpbm9kZSkgRVhUNF9JKGlub2RlKS0+aV9kdGltZQorCisjZGVmaW5lIEVYVDRfT1NfTElOVVggMAorI2RlZmluZSBFWFQ0X09TX0hVUkQgMQorI2RlZmluZSBFWFQ0X09TX01BU0lYIDIKKyNkZWZpbmUgRVhUNF9PU19GUkVFQlNEIDMKKyNkZWZpbmUgRVhUNF9PU19MSVRFUyA0CisKKyNkZWZpbmUgRVhUNF9HT09EX09MRF9SRVYgMCAgCisjZGVmaW5lIEVYVDRfRFlOQU1JQ19SRVYgMSAgCisKKyNkZWZpbmUgRVhUNF9DVVJSRU5UX1JFViBFWFQ0X0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQ0X01BWF9TVVBQX1JFViBFWFQ0X0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisjZGVmaW5lIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spICAgKChFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKSAhPSAwKQorI2RlZmluZSBFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgICgoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKKyNkZWZpbmUgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgICgoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCAmIGNwdV90b19sZTMyKG1hc2spKSAhPSAwKQorI2RlZmluZSBFWFQ0X1NFVF9DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDRfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spICAgRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKKyNkZWZpbmUgRVhUNF9DTEVBUl9DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0ICY9IH5jcHVfdG9fbGUzMihtYXNrKQorI2RlZmluZSBFWFQ0X0NMRUFSX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spICAgRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisjZGVmaW5lIEVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKSAgIEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCisKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgMHgwMDAxCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUyAweDAwMDIKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCAweDAwMDQKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUiAweDAwMDgKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUgMHgwMDEwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYIDB4MDAyMAorCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSIDB4MDAwMQorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUgMHgwMDAyCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSIDB4MDAwNAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRSAweDAwMDgKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9HRFRfQ1NVTSAweDAwMTAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9ESVJfTkxJTksgMHgwMDIwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRVhUUkFfSVNJWkUgMHgwMDQwCisKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0NPTVBSRVNTSU9OIDB4MDAwMQorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUgMHgwMDAyCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSIDB4MDAwNCAgCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9KT1VSTkFMX0RFViAweDAwMDggIAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRyAweDAwMTAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMgMHgwMDQwICAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUXzY0QklUIDB4MDA4MAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTU1QIDB4MDEwMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CRyAweDAyMDAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VBX0lOT0RFIDB4MDQwMCAgCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIDB4MTAwMCAgCisKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0NPTVBBVF9TVVBQIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1NVUFAgKEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXwgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUnwgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CR3wgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UU3wgICBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfNjRCSVR8ICAgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcpCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1VQUCAoRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8ICAgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFfCAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfR0RUX0NTVU18ICAgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9ESVJfTkxJTksgfCAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRVhUUkFfSVNJWkUgfCAgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSIHwgIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfSFVHRV9GSUxFKQorCisjZGVmaW5lIEVYVDRfREVGX1JFU1VJRCAwCisjZGVmaW5lIEVYVDRfREVGX1JFU0dJRCAwCisKKyNkZWZpbmUgRVhUNF9ERUZfSU5PREVfUkVBREFIRUFEX0JMS1MgMzIKKworI2RlZmluZSBFWFQ0X0RFRk1fREVCVUcgMHgwMDAxCisjZGVmaW5lIEVYVDRfREVGTV9CU0RHUk9VUFMgMHgwMDAyCisjZGVmaW5lIEVYVDRfREVGTV9YQVRUUl9VU0VSIDB4MDAwNAorI2RlZmluZSBFWFQ0X0RFRk1fQUNMIDB4MDAwOAorI2RlZmluZSBFWFQ0X0RFRk1fVUlEMTYgMHgwMDEwCisjZGVmaW5lIEVYVDRfREVGTV9KTU9ERSAweDAwNjAKKyNkZWZpbmUgRVhUNF9ERUZNX0pNT0RFX0RBVEEgMHgwMDIwCisjZGVmaW5lIEVYVDRfREVGTV9KTU9ERV9PUkRFUkVEIDB4MDA0MAorI2RlZmluZSBFWFQ0X0RFRk1fSk1PREVfV0JBQ0sgMHgwMDYwCisKKyNkZWZpbmUgRVhUNF9ERUZfTUlOX0JBVENIX1RJTUUgMAorI2RlZmluZSBFWFQ0X0RFRl9NQVhfQkFUQ0hfVElNRSAxNTAwMCAgCisKKyNkZWZpbmUgRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRSA0CisKKyNkZWZpbmUgRVhUNF9OQU1FX0xFTiAyNTUKKworc3RydWN0IGV4dDRfZGlyX2VudHJ5IHsKKyBfX2xlMzIgaW5vZGU7CisgX19sZTE2IHJlY19sZW47CisgX19sZTE2IG5hbWVfbGVuOworIGNoYXIgbmFtZVtFWFQ0X05BTUVfTEVOXTsKK307CisKK3N0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yIHsKKyBfX2xlMzIgaW5vZGU7CisgX19sZTE2IHJlY19sZW47CisgX191OCBuYW1lX2xlbjsKKyBfX3U4IGZpbGVfdHlwZTsKKyBjaGFyIG5hbWVbRVhUNF9OQU1FX0xFTl07Cit9OworCisjZGVmaW5lIEVYVDRfRlRfVU5LTk9XTiAwCisjZGVmaW5lIEVYVDRfRlRfUkVHX0ZJTEUgMQorI2RlZmluZSBFWFQ0X0ZUX0RJUiAyCisjZGVmaW5lIEVYVDRfRlRfQ0hSREVWIDMKKyNkZWZpbmUgRVhUNF9GVF9CTEtERVYgNAorI2RlZmluZSBFWFQ0X0ZUX0ZJRk8gNQorI2RlZmluZSBFWFQ0X0ZUX1NPQ0sgNgorI2RlZmluZSBFWFQ0X0ZUX1NZTUxJTksgNworCisjZGVmaW5lIEVYVDRfRlRfTUFYIDgKKworI2RlZmluZSBFWFQ0X0RJUl9QQUQgNAorI2RlZmluZSBFWFQ0X0RJUl9ST1VORCAoRVhUNF9ESVJfUEFEIC0gMSkKKyNkZWZpbmUgRVhUNF9ESVJfUkVDX0xFTihuYW1lX2xlbikgKCgobmFtZV9sZW4pICsgOCArIEVYVDRfRElSX1JPVU5EKSAmICAgfkVYVDRfRElSX1JPVU5EKQorI2RlZmluZSBFWFQ0X01BWF9SRUNfTEVOICgoMTw8MTYpLTEpCisKKyNkZWZpbmUgaXNfZHgoZGlyKSAoRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoZGlyLT5pX3NiLCAgIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSAmJiAgIChFWFQ0X0koZGlyKS0+aV9mbGFncyAmIEVYVDRfSU5ERVhfRkwpKQorI2RlZmluZSBFWFQ0X0RJUl9MSU5LX01BWChkaXIpICghaXNfZHgoZGlyKSAmJiAoZGlyKS0+aV9ubGluayA+PSBFWFQ0X0xJTktfTUFYKQorI2RlZmluZSBFWFQ0X0RJUl9MSU5LX0VNUFRZKGRpcikgKChkaXIpLT5pX25saW5rID09IDIgfHwgKGRpciktPmlfbmxpbmsgPT0gMSkKKworI2RlZmluZSBEWF9IQVNIX0xFR0FDWSAwCisjZGVmaW5lIERYX0hBU0hfSEFMRl9NRDQgMQorI2RlZmluZSBEWF9IQVNIX1RFQSAyCisjZGVmaW5lIERYX0hBU0hfTEVHQUNZX1VOU0lHTkVEIDMKKyNkZWZpbmUgRFhfSEFTSF9IQUxGX01ENF9VTlNJR05FRCA0CisjZGVmaW5lIERYX0hBU0hfVEVBX1VOU0lHTkVEIDUKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF9leHRlbnRzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRfZXh0ZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjkwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRfZXh0ZW50cy5oCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKgorICoqKiAgIFRoaXMgaGVhZGVyIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIGEgTGludXgga2VybmVsIGhlYWRlcgorICoqKiAgIG9mIHRoZSBzYW1lIG5hbWUsIHRvIG1ha2UgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciB1c2Vyc3BhY2UgdG8KKyAqKiogICBjYWxsIGludG8gdGhlIGtlcm5lbCBhdmFpbGFibGUgdG8gbGliYy4gIEl0IGNvbnRhaW5zIG9ubHkgY29uc3RhbnRzLAorICoqKiAgIHN0cnVjdHVyZXMsIGFuZCBtYWNyb3MgZ2VuZXJhdGVkIGZyb20gdGhlIG9yaWdpbmFsIGhlYWRlciwgYW5kIHRodXMsCisgKioqICAgY29udGFpbnMgbm8gY29weXJpZ2h0YWJsZSBpbmZvcm1hdGlvbi4KKyAqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX0VYVDRfRVhURU5UUworI2RlZmluZSBfRVhUNF9FWFRFTlRTCisKKyNpbmNsdWRlICJleHQ0LmgiCisKKyNkZWZpbmUgQUdHUkVTU0lWRV9URVNUXworCisjZGVmaW5lIEVYVEVOVFNfU1RBVFNfXworCisjZGVmaW5lIENIRUNLX0JJTlNFQVJDSF9fCisKKyNkZWZpbmUgRVhUX0RFQlVHX18KKyNpZmRlZiBFWFRfREVCVUcKKyNkZWZpbmUgZXh0X2RlYnVnKGEuLi4pIHByaW50ayhhKQorI2Vsc2UKKyNkZWZpbmUgZXh0X2RlYnVnKGEuLi4pCisjZW5kaWYKKworI2RlZmluZSBFWFRfU1RBVFNfCisKK3N0cnVjdCBleHQ0X2V4dGVudCB7CisgX19sZTMyIGVlX2Jsb2NrOworIF9fbGUxNiBlZV9sZW47CisgX19sZTE2IGVlX3N0YXJ0X2hpOworIF9fbGUzMiBlZV9zdGFydF9sbzsKK307CisKK3N0cnVjdCBleHQ0X2V4dGVudF9pZHggeworIF9fbGUzMiBlaV9ibG9jazsKKyBfX2xlMzIgZWlfbGVhZl9sbzsKKyBfX2xlMTYgZWlfbGVhZl9oaTsKKyBfX3UxNiBlaV91bnVzZWQ7Cit9OworCitzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyIHsKKyBfX2xlMTYgZWhfbWFnaWM7CisgX19sZTE2IGVoX2VudHJpZXM7CisgX19sZTE2IGVoX21heDsKKyBfX2xlMTYgZWhfZGVwdGg7CisgX19sZTMyIGVoX2dlbmVyYXRpb247Cit9OworCisjZGVmaW5lIEVYVDRfRVhUX01BR0lDIDB4ZjMwYQorCitzdHJ1Y3QgZXh0NF9leHRfcGF0aCB7CisgZXh0NF9mc2Jsa190IHBfYmxvY2s7CisgX191MTYgcF9kZXB0aDsKKyBzdHJ1Y3QgZXh0NF9leHRlbnQgKnBfZXh0OworIHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKnBfaWR4OworIHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKnBfaGRyOworIHN0cnVjdCBidWZmZXJfaGVhZCAqcF9iaDsKK307CisKKyNkZWZpbmUgRVhUNF9FWFRfQ0FDSEVfTk8gMAorI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9HQVAgMQorI2RlZmluZSBFWFQ0X0VYVF9DQUNIRV9FWFRFTlQgMgorCisjZGVmaW5lIEVYVF9DT05USU5VRSAwCisjZGVmaW5lIEVYVF9CUkVBSyAxCisjZGVmaW5lIEVYVF9SRVBFQVQgMgorCisjZGVmaW5lIEVYVF9NQVhfQkxPQ0sgMHhmZmZmZmZmZgorCisjZGVmaW5lIEVYVF9JTklUX01BWF9MRU4gKDFVTCA8PCAxNSkKKyNkZWZpbmUgRVhUX1VOSU5JVF9NQVhfTEVOIChFWFRfSU5JVF9NQVhfTEVOIC0gMSkKKworI2RlZmluZSBFWFRfRklSU1RfRVhURU5UKF9faGRyX18pICAgKChzdHJ1Y3QgZXh0NF9leHRlbnQgKikgKCgoY2hhciAqKSAoX19oZHJfXykpICsgICBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcikpKQorI2RlZmluZSBFWFRfRklSU1RfSU5ERVgoX19oZHJfXykgICAoKHN0cnVjdCBleHQ0X2V4dGVudF9pZHggKikgKCgoY2hhciAqKSAoX19oZHJfXykpICsgICBzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlcikpKQorI2RlZmluZSBFWFRfSEFTX0ZSRUVfSU5ERVgoX19wYXRoX18pICAgKGxlMTZfdG9fY3B1KChfX3BhdGhfXyktPnBfaGRyLT5laF9lbnRyaWVzKSAgIDwgbGUxNl90b19jcHUoKF9fcGF0aF9fKS0+cF9oZHItPmVoX21heCkpCisjZGVmaW5lIEVYVF9MQVNUX0VYVEVOVChfX2hkcl9fKSAgIChFWFRfRklSU1RfRVhURU5UKChfX2hkcl9fKSkgKyBsZTE2X3RvX2NwdSgoX19oZHJfXyktPmVoX2VudHJpZXMpIC0gMSkKKyNkZWZpbmUgRVhUX0xBU1RfSU5ERVgoX19oZHJfXykgICAoRVhUX0ZJUlNUX0lOREVYKChfX2hkcl9fKSkgKyBsZTE2X3RvX2NwdSgoX19oZHJfXyktPmVoX2VudHJpZXMpIC0gMSkKKyNkZWZpbmUgRVhUX01BWF9FWFRFTlQoX19oZHJfXykgICAoRVhUX0ZJUlNUX0VYVEVOVCgoX19oZHJfXykpICsgbGUxNl90b19jcHUoKF9faGRyX18pLT5laF9tYXgpIC0gMSkKKyNkZWZpbmUgRVhUX01BWF9JTkRFWChfX2hkcl9fKSAgIChFWFRfRklSU1RfSU5ERVgoKF9faGRyX18pKSArIGxlMTZfdG9fY3B1KChfX2hkcl9fKS0+ZWhfbWF4KSAtIDEpCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF9rZXJuZWxfaGVhZGVycy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X2tlcm5lbF9oZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyNGRjZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF9rZXJuZWxfaGVhZGVycy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9FWFQ0X1VUSUxTX0VYVDRfS0VSTkVMX0hFQURFUlNfSF8KKyNkZWZpbmUgX0VYVDRfVVRJTFNfRVhUNF9LRVJORUxfSEVBREVSU19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZiBfX0JJT05JQ19fCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZWxzZQorI2RlZmluZSBfX2xlNjQgdWludDY0X3QKKyNkZWZpbmUgX19sZTMyIHVpbnQzMl90CisjZGVmaW5lIF9fbGUxNiB1aW50MTZfdAorCisjZGVmaW5lIF9fYmU2NCB1aW50NjRfdAorI2RlZmluZSBfX2JlMzIgdWludDMyX3QKKyNkZWZpbmUgX19iZTE2IHVpbnQxNl90CisKKyNkZWZpbmUgX191NjQgdWludDY0X3QKKyNkZWZpbmUgX191MzIgdWludDMyX3QKKyNkZWZpbmUgX191MTYgdWludDE2X3QKKyNkZWZpbmUgX191OCB1aW50OF90CisjZW5kaWYKKworI2luY2x1ZGUgImV4dDQuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImV4dDRfZXh0ZW50cy5oIgorI2luY2x1ZGUgImpiZDIuaCIKKworI2lmbmRlZiBfX0JJT05JQ19fCisjdW5kZWYgX19sZTY0CisjdW5kZWYgX19sZTMyCisjdW5kZWYgX19sZTE2CisKKyN1bmRlZiBfX2JlNjQKKyN1bmRlZiBfX2JlMzIKKyN1bmRlZiBfX2JlMTYKKworI3VuZGVmIF9fdTY0CisjdW5kZWYgX191MzIKKyN1bmRlZiBfX3UxNgorI3VuZGVmIF9fdTgKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF9zYi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1MjdhMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF9zYi5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImV4dDRfc2IuaCIKKworaW50IGV4dDRfcGFyc2Vfc2Ioc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfaW5mbyAqaW5mbykKK3sKKwl1aW50NjRfdCBsZW5fYmxvY2tzOworCisgICAgICAgIGlmIChzYi0+c19tYWdpYyAhPSBFWFQ0X1NVUEVSX01BR0lDKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmICgoc2ItPnNfc3RhdGUgJiBFWFQ0X1ZBTElEX0ZTKSAhPSBFWFQ0X1ZBTElEX0ZTKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJaW5mby0+YmxvY2tfc2l6ZSA9IDEwMjQgPDwgc2ItPnNfbG9nX2Jsb2NrX3NpemU7CisJaW5mby0+YmxvY2tzX3Blcl9ncm91cCA9IHNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXA7CisJaW5mby0+aW5vZGVzX3Blcl9ncm91cCA9IHNiLT5zX2lub2Rlc19wZXJfZ3JvdXA7CisJaW5mby0+aW5vZGVfc2l6ZSA9IHNiLT5zX2lub2RlX3NpemU7CisJaW5mby0+aW5vZGVzID0gc2ItPnNfaW5vZGVzX2NvdW50OworCWluZm8tPmZlYXRfcm9fY29tcGF0ID0gc2ItPnNfZmVhdHVyZV9yb19jb21wYXQ7CisJaW5mby0+ZmVhdF9jb21wYXQgPSBzYi0+c19mZWF0dXJlX2NvbXBhdDsKKwlpbmZvLT5mZWF0X2luY29tcGF0ID0gc2ItPnNfZmVhdHVyZV9pbmNvbXBhdDsKKwlpbmZvLT5iZ19kZXNjX3Jlc2VydmVfYmxvY2tzID0gc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsKKwlpbmZvLT5sYWJlbCA9IHNiLT5zX3ZvbHVtZV9uYW1lOworCisJbGVuX2Jsb2NrcyA9ICgodWludDY0X3Qpc2ItPnNfYmxvY2tzX2NvdW50X2hpIDw8IDMyKSArCisgICAgICAgICAgICAgICAgc2ItPnNfYmxvY2tzX2NvdW50X2xvOworCWluZm8tPmxlbiA9ICh1aW50NjRfdClpbmZvLT5ibG9ja19zaXplICogbGVuX2Jsb2NrczsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3NiLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRfc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJmYTMzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3NiLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0VYVDRfVVRJTFNfRVhUNF9TQl9IXworI2RlZmluZSBfRVhUNF9VVElMU19FWFQ0X1NCX0hfCisKKyNpbmNsdWRlICJleHQ0X2tlcm5lbF9oZWFkZXJzLmgiCisKKyNkZWZpbmUgRVhUNF9TVVBFUl9NQUdJQyAweEVGNTMKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZnNfaW5mbyB7CisJaW50NjRfdCBsZW47CS8qIElmIHNldCB0byAwLCBhc2sgdGhlIGJsb2NrIGRldmljZSBmb3IgdGhlIHNpemUsCisJCQkgKiBpZiBsZXNzIHRoYW4gMCwgcmVzZXJ2ZSB0aGF0IG11Y2ggc3BhY2UgYXQgdGhlCisJCQkgKiBlbmQgb2YgdGhlIHBhcnRpdGlvbiwgZWxzZSB1c2UgdGhlIHNpemUgZ2l2ZW4uICovCisJdWludDMyX3QgYmxvY2tfc2l6ZTsKKwl1aW50MzJfdCBibG9ja3NfcGVyX2dyb3VwOworCXVpbnQzMl90IGlub2Rlc19wZXJfZ3JvdXA7CisJdWludDMyX3QgaW5vZGVfc2l6ZTsKKwl1aW50MzJfdCBpbm9kZXM7CisJdWludDMyX3Qgam91cm5hbF9ibG9ja3M7CisJdWludDE2X3QgZmVhdF9yb19jb21wYXQ7CisJdWludDE2X3QgZmVhdF9jb21wYXQ7CisJdWludDE2X3QgZmVhdF9pbmNvbXBhdDsKKwl1aW50MzJfdCBiZ19kZXNjX3Jlc2VydmVfYmxvY2tzOworCWNvbnN0IGNoYXIgKmxhYmVsOworCXVpbnQ4X3Qgbm9fam91cm5hbDsKK307CisKK2ludCBleHQ0X3BhcnNlX3NiKHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2luZm8gKmluZm8pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF91dGlscy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2Yzg2MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NF91dGlscy5jCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJ1dWlkLmgiCisjaW5jbHVkZSAiYWxsb2NhdGUuaCIKKyNpbmNsdWRlICJpbmRpcmVjdC5oIgorI2luY2x1ZGUgImV4dGVudC5oIgorCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgVVNFX01JTkdXCisjaW5jbHVkZSA8d2luc29jazIuaD4KKyNlbHNlCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyNpbmNsdWRlIDxzeXMvZGlzay5oPgorI2VuZGlmCisKK2ludCBmb3JjZSA9IDA7CitzdHJ1Y3QgZnNfaW5mbyBpbmZvOworc3RydWN0IGZzX2F1eF9pbmZvIGF1eF9pbmZvOworc3RydWN0IHNwYXJzZV9maWxlICpleHQ0X3NwYXJzZV9maWxlOworCitqbXBfYnVmIHNldGptcF9lbnY7CisKKy8qIHJldHVybnMgMSBpZiBhIGlzIGEgcG93ZXIgb2YgYiAqLworc3RhdGljIGludCBpc19wb3dlcl9vZihpbnQgYSwgaW50IGIpCit7CisJd2hpbGUgKGEgPiBiKSB7CisJCWlmIChhICUgYikKKwkJCXJldHVybiAwOworCQlhIC89IGI7CisJfQorCisJcmV0dXJuIChhID09IGIpID8gMSA6IDA7Cit9CisKKy8qIFJldHVybnMgMSBpZiB0aGUgYmcgY29udGFpbnMgYSBiYWNrdXAgc3VwZXJibG9jay4gIE9uIGZpbGVzeXN0ZW1zIHdpdGgKKyAgIHRoZSBzcGFyc2Vfc3VwZXIgZmVhdHVyZSwgb25seSBibG9jayBncm91cHMgMCwgMSwgYW5kIHBvd2VycyBvZiAzLCA1LAorICAgYW5kIDcgaGF2ZSBiYWNrdXAgc3VwZXJibG9ja3MuICBPdGhlcndpc2UsIGFsbCBibG9jayBncm91cHMgaGF2ZSBiYWNrdXAKKyAgIHN1cGVyYmxvY2tzICovCitpbnQgZXh0NF9iZ19oYXNfc3VwZXJfYmxvY2soaW50IGJnKQoreworCS8qIFdpdGhvdXQgc3BhcnNlX3N1cGVyLCBldmVyeSBibG9jayBncm91cCBoYXMgYSBzdXBlcmJsb2NrICovCisJaWYgKCEoaW5mby5mZWF0X3JvX2NvbXBhdCAmIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoYmcgPT0gMCB8fCBiZyA9PSAxKQorCQlyZXR1cm4gMTsKKworCWlmIChpc19wb3dlcl9vZihiZywgMykgfHwgaXNfcG93ZXJfb2YoYmcsIDUpIHx8IGlzX3Bvd2VyX29mKGJnLCA3KSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogV3JpdGUgdGhlIGZpbGVzeXN0ZW0gaW1hZ2UgdG8gYSBmaWxlICovCit2b2lkIHdyaXRlX2V4dDRfaW1hZ2UoaW50IGZkLCBpbnQgZ3osIGludCBzcGFyc2UsIGludCBjcmMpCit7CisJc3BhcnNlX2ZpbGVfd3JpdGUoZXh0NF9zcGFyc2VfZmlsZSwgZmQsIGd6LCBzcGFyc2UsIGNyYyk7Cit9CisKKy8qIENvbXB1dGUgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIGZpbGVzeXN0ZW0gZnJvbSB0aGUgYmFzaWMgaW5mbyAqLwordm9pZCBleHQ0X2NyZWF0ZV9mc19hdXhfaW5mbygpCit7CisJYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jayA9IChpbmZvLmJsb2NrX3NpemUgPiAxMDI0KSA/IDAgOiAxOworCWF1eF9pbmZvLmxlbl9ibG9ja3MgPSBpbmZvLmxlbiAvIGluZm8uYmxvY2tfc2l6ZTsKKwlhdXhfaW5mby5pbm9kZV90YWJsZV9ibG9ja3MgPSBESVZfUk9VTkRfVVAoaW5mby5pbm9kZXNfcGVyX2dyb3VwICogaW5mby5pbm9kZV9zaXplLAorCQlpbmZvLmJsb2NrX3NpemUpOworCWF1eF9pbmZvLmdyb3VwcyA9IERJVl9ST1VORF9VUChhdXhfaW5mby5sZW5fYmxvY2tzIC0gYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jaywKKwkJaW5mby5ibG9ja3NfcGVyX2dyb3VwKTsKKwlhdXhfaW5mby5ibG9ja3NfcGVyX2luZCA9IGluZm8uYmxvY2tfc2l6ZSAvIHNpemVvZih1MzIpOworCWF1eF9pbmZvLmJsb2Nrc19wZXJfZGluZCA9IGF1eF9pbmZvLmJsb2Nrc19wZXJfaW5kICogYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQ7CisJYXV4X2luZm8uYmxvY2tzX3Blcl90aW5kID0gYXV4X2luZm8uYmxvY2tzX3Blcl9kaW5kICogYXV4X2luZm8uYmxvY2tzX3Blcl9kaW5kOworCisJYXV4X2luZm8uYmdfZGVzY19ibG9ja3MgPQorCQlESVZfUk9VTkRfVVAoYXV4X2luZm8uZ3JvdXBzICogc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpLAorCQkJaW5mby5ibG9ja19zaXplKTsKKworCWF1eF9pbmZvLmRlZmF1bHRfaV9mbGFncyA9IEVYVDRfTk9BVElNRV9GTDsKKworCXUzMiBsYXN0X2dyb3VwX3NpemUgPSBhdXhfaW5mby5sZW5fYmxvY2tzICUgaW5mby5ibG9ja3NfcGVyX2dyb3VwOworCXUzMiBsYXN0X2hlYWRlcl9zaXplID0gMiArIGF1eF9pbmZvLmlub2RlX3RhYmxlX2Jsb2NrczsKKwlpZiAoZXh0NF9iZ19oYXNfc3VwZXJfYmxvY2soYXV4X2luZm8uZ3JvdXBzIC0gMSkpCisJCWxhc3RfaGVhZGVyX3NpemUgKz0gMSArIGF1eF9pbmZvLmJnX2Rlc2NfYmxvY2tzICsKKwkJCWluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrczsKKwlpZiAobGFzdF9ncm91cF9zaXplID4gMCAmJiBsYXN0X2dyb3VwX3NpemUgPCBsYXN0X2hlYWRlcl9zaXplKSB7CisJCWF1eF9pbmZvLmdyb3Vwcy0tOworCQlhdXhfaW5mby5sZW5fYmxvY2tzIC09IGxhc3RfZ3JvdXBfc2l6ZTsKKwl9CisKKwlhdXhfaW5mby5zYiA9IGNhbGxvYyhpbmZvLmJsb2NrX3NpemUsIDEpOworCS8qIEFsbG9jIGFuIGFycmF5IHRvIGhvbGQgdGhlIHBvaW50ZXJzIHRvIHRoZSBiYWNrdXAgc3VwZXJibG9ja3MgKi8KKwlhdXhfaW5mby5iYWNrdXBfc2IgPSBjYWxsb2MoYXV4X2luZm8uZ3JvdXBzLCBzaXplb2YoY2hhciAqKSk7CisKKwlpZiAoIWF1eF9pbmZvLnNiKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiY2FsbG9jIik7CisKKwlhdXhfaW5mby5iZ19kZXNjID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgYXV4X2luZm8uYmdfZGVzY19ibG9ja3MpOworCWlmICghYXV4X2luZm8uYmdfZGVzYykKKwkJY3JpdGljYWxfZXJyb3JfZXJybm8oImNhbGxvYyIpOworCWF1eF9pbmZvLnhhdHRycyA9IE5VTEw7Cit9CisKK3ZvaWQgZXh0NF9mcmVlX2ZzX2F1eF9pbmZvKCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaT0wOyBpPGF1eF9pbmZvLmdyb3VwczsgaSsrKSB7CisJCWlmIChhdXhfaW5mby5iYWNrdXBfc2JbaV0pCisJCQlmcmVlKGF1eF9pbmZvLmJhY2t1cF9zYltpXSk7CisJfQorCWZyZWUoYXV4X2luZm8uc2IpOworCWZyZWUoYXV4X2luZm8uYmdfZGVzYyk7Cit9CisKKy8qIEZpbGwgaW4gdGhlIHN1cGVyYmxvY2sgbWVtb3J5IGJ1ZmZlciBiYXNlZCBvbiB0aGUgZmlsZXN5c3RlbSBwYXJhbWV0ZXJzICovCit2b2lkIGV4dDRfZmlsbF9pbl9zYigpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNiID0gYXV4X2luZm8uc2I7CisKKwlzYi0+c19pbm9kZXNfY291bnQgPSBpbmZvLmlub2Rlc19wZXJfZ3JvdXAgKiBhdXhfaW5mby5ncm91cHM7CisJc2ItPnNfYmxvY2tzX2NvdW50X2xvID0gYXV4X2luZm8ubGVuX2Jsb2NrczsKKwlzYi0+c19yX2Jsb2Nrc19jb3VudF9sbyA9IDA7CisJc2ItPnNfZnJlZV9ibG9ja3NfY291bnRfbG8gPSAwOworCXNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gMDsKKwlzYi0+c19maXJzdF9kYXRhX2Jsb2NrID0gYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jazsKKwlzYi0+c19sb2dfYmxvY2tfc2l6ZSA9IGxvZ18yKGluZm8uYmxvY2tfc2l6ZSAvIDEwMjQpOworCXNiLT5zX29ic29fbG9nX2ZyYWdfc2l6ZSA9IGxvZ18yKGluZm8uYmxvY2tfc2l6ZSAvIDEwMjQpOworCXNiLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSBpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7CisJc2ItPnNfb2Jzb19mcmFnc19wZXJfZ3JvdXAgPSBpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7CisJc2ItPnNfaW5vZGVzX3Blcl9ncm91cCA9IGluZm8uaW5vZGVzX3Blcl9ncm91cDsKKwlzYi0+c19tdGltZSA9IDA7CisJc2ItPnNfd3RpbWUgPSAwOworCXNiLT5zX21udF9jb3VudCA9IDA7CisJc2ItPnNfbWF4X21udF9jb3VudCA9IDB4RkZGRjsKKwlzYi0+c19tYWdpYyA9IEVYVDRfU1VQRVJfTUFHSUM7CisJc2ItPnNfc3RhdGUgPSBFWFQ0X1ZBTElEX0ZTOworCXNiLT5zX2Vycm9ycyA9IEVYVDRfRVJST1JTX1JPOworCXNiLT5zX21pbm9yX3Jldl9sZXZlbCA9IDA7CisJc2ItPnNfbGFzdGNoZWNrID0gMDsKKwlzYi0+c19jaGVja2ludGVydmFsID0gMDsKKwlzYi0+c19jcmVhdG9yX29zID0gRVhUNF9PU19MSU5VWDsKKwlzYi0+c19yZXZfbGV2ZWwgPSBFWFQ0X0RZTkFNSUNfUkVWOworCXNiLT5zX2RlZl9yZXN1aWQgPSBFWFQ0X0RFRl9SRVNVSUQ7CisJc2ItPnNfZGVmX3Jlc2dpZCA9IEVYVDRfREVGX1JFU0dJRDsKKworCXNiLT5zX2ZpcnN0X2lubyA9IEVYVDRfR09PRF9PTERfRklSU1RfSU5POworCXNiLT5zX2lub2RlX3NpemUgPSBpbmZvLmlub2RlX3NpemU7CisJc2ItPnNfYmxvY2tfZ3JvdXBfbnIgPSAwOworCXNiLT5zX2ZlYXR1cmVfY29tcGF0ID0gaW5mby5mZWF0X2NvbXBhdDsKKwlzYi0+c19mZWF0dXJlX2luY29tcGF0ID0gaW5mby5mZWF0X2luY29tcGF0OworCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0ID0gaW5mby5mZWF0X3JvX2NvbXBhdDsKKwlnZW5lcmF0ZV91dWlkKCJleHRhbmRyb2lkL21ha2VfZXh0NGZzIiwgaW5mby5sYWJlbCwgc2ItPnNfdXVpZCk7CisJbWVtc2V0KHNiLT5zX3ZvbHVtZV9uYW1lLCAwLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwlzdHJuY3B5KHNiLT5zX3ZvbHVtZV9uYW1lLCBpbmZvLmxhYmVsLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKwltZW1zZXQoc2ItPnNfbGFzdF9tb3VudGVkLCAwLCBzaXplb2Yoc2ItPnNfbGFzdF9tb3VudGVkKSk7CisJc2ItPnNfYWxnb3JpdGhtX3VzYWdlX2JpdG1hcCA9IDA7CisKKwlzYi0+c19yZXNlcnZlZF9nZHRfYmxvY2tzID0gaW5mby5iZ19kZXNjX3Jlc2VydmVfYmxvY2tzOworCXNiLT5zX3ByZWFsbG9jX2Jsb2NrcyA9IDA7CisJc2ItPnNfcHJlYWxsb2NfZGlyX2Jsb2NrcyA9IDA7CisKKwkvL21lbWNweShzYi0+c19qb3VybmFsX3V1aWQsIHNiLT5zX3V1aWQsIHNpemVvZihzYi0+c19qb3VybmFsX3V1aWQpKTsKKwlpZiAoaW5mby5mZWF0X2NvbXBhdCAmIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpCisJCXNiLT5zX2pvdXJuYWxfaW51bSA9IEVYVDRfSk9VUk5BTF9JTk87CisJc2ItPnNfam91cm5hbF9kZXYgPSAwOworCXNiLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwlzYi0+c19oYXNoX3NlZWRbMF0gPSAwOyAvKiBGSVhNRSAqLworCXNiLT5zX2RlZl9oYXNoX3ZlcnNpb24gPSBEWF9IQVNIX1RFQTsKKwlzYi0+c19yZXNlcnZlZF9jaGFyX3BhZCA9IEVYVDRfSk5MX0JBQ0tVUF9CTE9DS1M7CisJc2ItPnNfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpOworCXNiLT5zX2RlZmF1bHRfbW91bnRfb3B0cyA9IDA7IC8qIEZJWE1FICovCisJc2ItPnNfZmlyc3RfbWV0YV9iZyA9IDA7CisJc2ItPnNfbWtmc190aW1lID0gMDsKKwkvL3NiLT5zX2pubF9ibG9ja3NbMTddOyAvKiBGSVhNRSAqLworCisJc2ItPnNfYmxvY2tzX2NvdW50X2hpID0gYXV4X2luZm8ubGVuX2Jsb2NrcyA+PiAzMjsKKwlzYi0+c19yX2Jsb2Nrc19jb3VudF9oaSA9IDA7CisJc2ItPnNfZnJlZV9ibG9ja3NfY291bnRfaGkgPSAwOworCXNiLT5zX21pbl9leHRyYV9pc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZSkgLQorCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJc2ItPnNfd2FudF9leHRyYV9pc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZSkgLQorCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJc2ItPnNfZmxhZ3MgPSAyOworCXNiLT5zX3JhaWRfc3RyaWRlID0gMDsKKwlzYi0+c19tbXBfaW50ZXJ2YWwgPSAwOworCXNiLT5zX21tcF9ibG9jayA9IDA7CisJc2ItPnNfcmFpZF9zdHJpcGVfd2lkdGggPSAwOworCXNiLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggPSAwOworCXNiLT5zX2tieXRlc193cml0dGVuID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhdXhfaW5mby5ncm91cHM7IGkrKykgeworCQl1NjQgZ3JvdXBfc3RhcnRfYmxvY2sgPSBhdXhfaW5mby5maXJzdF9kYXRhX2Jsb2NrICsgaSAqCisJCQlpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7CisJCXUzMiBoZWFkZXJfc2l6ZSA9IDA7CisJCWlmIChleHQ0X2JnX2hhc19zdXBlcl9ibG9jayhpKSkgeworCQkJaWYgKGkgIT0gMCkgeworCQkJCWF1eF9pbmZvLmJhY2t1cF9zYltpXSA9IGNhbGxvYyhpbmZvLmJsb2NrX3NpemUsIDEpOworCQkJCW1lbWNweShhdXhfaW5mby5iYWNrdXBfc2JbaV0sIHNiLCBpbmZvLmJsb2NrX3NpemUpOworCQkJCS8qIFVwZGF0ZSB0aGUgYmxvY2sgZ3JvdXAgbnIgb2YgdGhpcyBiYWNrdXAgc3VwZXJibG9jayAqLworCQkJCWF1eF9pbmZvLmJhY2t1cF9zYltpXS0+c19ibG9ja19ncm91cF9uciA9IGk7CisJCQkJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgYXV4X2luZm8uYmFja3VwX3NiW2ldLAorCQkJCQkJaW5mby5ibG9ja19zaXplLCBncm91cF9zdGFydF9ibG9jayk7CisJCQl9CisJCQlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBhdXhfaW5mby5iZ19kZXNjLAorCQkJCWF1eF9pbmZvLmJnX2Rlc2NfYmxvY2tzICogaW5mby5ibG9ja19zaXplLAorCQkJCWdyb3VwX3N0YXJ0X2Jsb2NrICsgMSk7CisJCQloZWFkZXJfc2l6ZSA9IDEgKyBhdXhfaW5mby5iZ19kZXNjX2Jsb2NrcyArIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrczsKKwkJfQorCisJCWF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfYmxvY2tfYml0bWFwID0gZ3JvdXBfc3RhcnRfYmxvY2sgKyBoZWFkZXJfc2l6ZTsKKwkJYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19pbm9kZV9iaXRtYXAgPSBncm91cF9zdGFydF9ibG9jayArIGhlYWRlcl9zaXplICsgMTsKKwkJYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19pbm9kZV90YWJsZSA9IGdyb3VwX3N0YXJ0X2Jsb2NrICsgaGVhZGVyX3NpemUgKyAyOworCisJCWF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQgPSBzYi0+c19ibG9ja3NfcGVyX2dyb3VwOworCQlhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gc2ItPnNfaW5vZGVzX3Blcl9ncm91cDsKKwkJYXV4X2luZm8uYmdfZGVzY1tpXS5iZ191c2VkX2RpcnNfY291bnQgPSAwOworCX0KK30KKwordm9pZCBleHQ0X3F1ZXVlX3NiKHZvaWQpCit7CisJLyogVGhlIHdyaXRlX2RhdGEqIGZ1bmN0aW9ucyBleHBlY3Qgb25seSBibG9jayBhbGlnbmVkIGNhbGxzLgorCSAqIFRoaXMgaXMgbm90IGFuIGlzc3VlLCBleGNlcHQgd2hlbiB3ZSB3cml0ZSBvdXQgdGhlIHN1cGVyCisJICogYmxvY2sgb24gYSBzeXN0ZW0gd2l0aCBhIGJsb2NrIHNpemUgPiAxSy4gIFNvLCB3ZSBuZWVkIHRvCisJICogZGVhbCB3aXRoIHRoYXQgaGVyZS4KKwkgKi8KKwlpZiAoaW5mby5ibG9ja19zaXplID4gMTAyNCkgeworCQl1OCAqYnVmID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJCW1lbWNweShidWYgKyAxMDI0LCAodTgqKWF1eF9pbmZvLnNiLCAxMDI0KTsKKwkJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgYnVmLCBpbmZvLmJsb2NrX3NpemUsIDApOworCX0gZWxzZSB7CisJCXNwYXJzZV9maWxlX2FkZF9kYXRhKGV4dDRfc3BhcnNlX2ZpbGUsIGF1eF9pbmZvLnNiLCAxMDI0LCAxKTsKKwl9Cit9CisKK3ZvaWQgZXh0NF9wYXJzZV9zYl9pbmZvKHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICpzYikKK3sKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUNF9TVVBFUl9NQUdJQykKKwkJZXJyb3IoInN1cGVyYmxvY2sgbWFnaWMgaW5jb3JyZWN0Iik7CisKKwlpZiAoKHNiLT5zX3N0YXRlICYgRVhUNF9WQUxJRF9GUykgIT0gRVhUNF9WQUxJRF9GUykKKwkJZXJyb3IoImZpbGVzeXN0ZW0gc3RhdGUgbm90IHZhbGlkIik7CisKKwlleHQ0X3BhcnNlX3NiKHNiLCAmaW5mbyk7CisKKwlleHQ0X2NyZWF0ZV9mc19hdXhfaW5mbygpOworCisJbWVtY3B5KGF1eF9pbmZvLnNiLCBzYiwgc2l6ZW9mKCpzYikpOworCisJaWYgKGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2sgIT0gc2ItPnNfZmlyc3RfZGF0YV9ibG9jaykKKwkJY3JpdGljYWxfZXJyb3IoImZpcnN0IGRhdGEgYmxvY2sgZG9lcyBub3QgbWF0Y2giKTsKK30KKwordm9pZCBleHQ0X2NyZWF0ZV9yZXNpemVfaW5vZGUoKQoreworCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICpyZXNlcnZlX2lub2RlX2FsbG9jID0gY3JlYXRlX2FsbG9jYXRpb24oKTsKKwl1MzIgcmVzZXJ2ZV9pbm9kZV9sZW4gPSAwOworCXVuc2lnbmVkIGludCBpOworCisJc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlID0gZ2V0X2lub2RlKEVYVDRfUkVTSVpFX0lOTyk7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBnZXQgcmVzaXplIGlub2RlIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYXV4X2luZm8uZ3JvdXBzOyBpKyspIHsKKwkJaWYgKGV4dDRfYmdfaGFzX3N1cGVyX2Jsb2NrKGkpKSB7CisJCQl1NjQgZ3JvdXBfc3RhcnRfYmxvY2sgPSBhdXhfaW5mby5maXJzdF9kYXRhX2Jsb2NrICsgaSAqCisJCQkJaW5mby5ibG9ja3NfcGVyX2dyb3VwOworCQkJdTMyIHJlc2VydmVkX2Jsb2NrX3N0YXJ0ID0gZ3JvdXBfc3RhcnRfYmxvY2sgKyAxICsKKwkJCQlhdXhfaW5mby5iZ19kZXNjX2Jsb2NrczsKKwkJCXUzMiByZXNlcnZlZF9ibG9ja19sZW4gPSBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3M7CisJCQlhcHBlbmRfcmVnaW9uKHJlc2VydmVfaW5vZGVfYWxsb2MsIHJlc2VydmVkX2Jsb2NrX3N0YXJ0LAorCQkJCXJlc2VydmVkX2Jsb2NrX2xlbiwgaSk7CisJCQlyZXNlcnZlX2lub2RlX2xlbiArPSByZXNlcnZlZF9ibG9ja19sZW47CisJCX0KKwl9CisKKwlpbm9kZV9hdHRhY2hfcmVzaXplKGlub2RlLCByZXNlcnZlX2lub2RlX2FsbG9jKTsKKworCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJaW5vZGUtPmlfbGlua3NfY291bnQgPSAxOworCisJZnJlZV9hbGxvYyhyZXNlcnZlX2lub2RlX2FsbG9jKTsKK30KKworLyogQWxsb2NhdGUgdGhlIGJsb2NrcyB0byBob2xkIGEgam91cm5hbCBpbm9kZSBhbmQgY29ubmVjdCB0aGVtIHRvIHRoZQorICAgcmVzZXJ2ZWQgam91cm5hbCBpbm9kZSAqLwordm9pZCBleHQ0X2NyZWF0ZV9qb3VybmFsX2lub2RlKCkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUgPSBnZXRfaW5vZGUoRVhUNF9KT1VSTkFMX0lOTyk7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBnZXQgam91cm5hbCBpbm9kZSIpOworCQlyZXR1cm47CisJfQorCisJdTggKmpvdXJuYWxfZGF0YSA9IGlub2RlX2FsbG9jYXRlX2RhdGFfZXh0ZW50cyhpbm9kZSwKKwkJCWluZm8uam91cm5hbF9ibG9ja3MgKiBpbmZvLmJsb2NrX3NpemUsCisJCQlpbmZvLmpvdXJuYWxfYmxvY2tzICogaW5mby5ibG9ja19zaXplKTsKKwlpZiAoIWpvdXJuYWxfZGF0YSkgeworCQllcnJvcigiZmFpbGVkIHRvIGFsbG9jYXRlIGV4dGVudHMgZm9yIGpvdXJuYWwgZGF0YSIpOworCQlyZXR1cm47CisJfQorCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKKwlpbm9kZS0+aV9saW5rc19jb3VudCA9IDE7CisKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqanNiID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopam91cm5hbF9kYXRhOworCWpzYi0+c19oZWFkZXIuaF9tYWdpYyA9IGh0b25sKEpCRDJfTUFHSUNfTlVNQkVSKTsKKwlqc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlID0gaHRvbmwoSkJEMl9TVVBFUkJMT0NLX1YyKTsKKwlqc2ItPnNfYmxvY2tzaXplID0gaHRvbmwoaW5mby5ibG9ja19zaXplKTsKKwlqc2ItPnNfbWF4bGVuID0gaHRvbmwoaW5mby5qb3VybmFsX2Jsb2Nrcyk7CisJanNiLT5zX25yX3VzZXJzID0gaHRvbmwoMSk7CisJanNiLT5zX2ZpcnN0ID0gaHRvbmwoMSk7CisJanNiLT5zX3NlcXVlbmNlID0gaHRvbmwoMSk7CisKKwltZW1jcHkoYXV4X2luZm8uc2ItPnNfam5sX2Jsb2NrcywgJmlub2RlLT5pX2Jsb2NrLCBzaXplb2YoaW5vZGUtPmlfYmxvY2spKTsKK30KKworLyogVXBkYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYW5kIGlub2RlcyBpbiB0aGUgZmlsZXN5c3RlbSBhbmQgaW4gZWFjaAorICAgYmxvY2sgZ3JvdXAgKi8KK3ZvaWQgZXh0NF91cGRhdGVfZnJlZSgpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXV4X2luZm8uZ3JvdXBzOyBpKyspIHsKKwkJdTMyIGJnX2ZyZWVfYmxvY2tzID0gZ2V0X2ZyZWVfYmxvY2tzKGkpOworCQl1MzIgYmdfZnJlZV9pbm9kZXMgPSBnZXRfZnJlZV9pbm9kZXMoaSk7CisJCXUxNiBjcmM7CisKKwkJYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGJnX2ZyZWVfYmxvY2tzOworCQlhdXhfaW5mby5zYi0+c19mcmVlX2Jsb2Nrc19jb3VudF9sbyArPSBiZ19mcmVlX2Jsb2NrczsKKworCQlhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gYmdfZnJlZV9pbm9kZXM7CisJCWF1eF9pbmZvLnNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50ICs9IGJnX2ZyZWVfaW5vZGVzOworCisJCWF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfdXNlZF9kaXJzX2NvdW50ICs9IGdldF9kaXJlY3RvcmllcyhpKTsKKworCQlhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZsYWdzID0gZ2V0X2JnX2ZsYWdzKGkpOworCisJCWNyYyA9IGV4dDRfY3JjMTYofjAsIGF1eF9pbmZvLnNiLT5zX3V1aWQsIHNpemVvZihhdXhfaW5mby5zYi0+c191dWlkKSk7CisJCWNyYyA9IGV4dDRfY3JjMTYoY3JjLCAmaSwgc2l6ZW9mKGkpKTsKKwkJY3JjID0gZXh0NF9jcmMxNihjcmMsICZhdXhfaW5mby5iZ19kZXNjW2ldLCBvZmZzZXRvZihzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjLCBiZ19jaGVja3N1bSkpOworCQlhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2NoZWNrc3VtID0gY3JjOworCX0KK30KKwordTY0IGdldF9ibG9ja19kZXZpY2Vfc2l6ZShpbnQgZmQpCit7CisJdTY0IHNpemUgPSAwOworCWludCByZXQ7CisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykKKwlyZXQgPSBpb2N0bChmZCwgQkxLR0VUU0laRTY0LCAmc2l6ZSk7CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKwlyZXQgPSBpb2N0bChmZCwgREtJT0NHRVRCTE9DS0NPVU5ULCAmc2l6ZSk7CisjZWxzZQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorCisJaWYgKHJldCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IGlzX2Jsb2NrX2RldmljZV9mZChpbnQgZmQpCit7CisjaWZkZWYgVVNFX01JTkdXCisJcmV0dXJuIDA7CisjZWxzZQorCXN0cnVjdCBzdGF0IHN0OworCWludCByZXQgPSBmc3RhdChmZCwgJnN0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gU19JU0JMSyhzdC5zdF9tb2RlKTsKKyNlbmRpZgorfQorCit1NjQgZ2V0X2ZpbGVfc2l6ZShpbnQgZmQpCit7CisJc3RydWN0IHN0YXQgYnVmOworCWludCByZXQ7CisJdTY0IHJlc2VydmVfbGVuID0gMDsKKwlzNjQgY29tcHV0ZWRfc2l6ZTsKKworCXJldCA9IGZzdGF0KGZkLCAmYnVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMDsKKworCWlmIChpbmZvLmxlbiA8IDApCisJCXJlc2VydmVfbGVuID0gLWluZm8ubGVuOworCisJaWYgKFNfSVNSRUcoYnVmLnN0X21vZGUpKQorCQljb21wdXRlZF9zaXplID0gYnVmLnN0X3NpemUgLSByZXNlcnZlX2xlbjsKKwllbHNlIGlmIChTX0lTQkxLKGJ1Zi5zdF9tb2RlKSkKKwkJY29tcHV0ZWRfc2l6ZSA9IGdldF9ibG9ja19kZXZpY2Vfc2l6ZShmZCkgLSByZXNlcnZlX2xlbjsKKwllbHNlCisJCWNvbXB1dGVkX3NpemUgPSAwOworCisJaWYgKGNvbXB1dGVkX3NpemUgPCAwKSB7CisJCXdhcm4oIkNvbXB1dGVkIGZpbGVzeXN0ZW0gc2l6ZSBsZXNzIHRoYW4gMCIpOworCQljb21wdXRlZF9zaXplID0gMDsKKwl9CisKKwlyZXR1cm4gY29tcHV0ZWRfc2l6ZTsKK30KKwordTY0IHBhcnNlX251bShjb25zdCBjaGFyICphcmcpCit7CisJY2hhciAqZW5kcHRyOworCXU2NCBudW0gPSBzdHJ0b3VsbChhcmcsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciA9PSAnaycgfHwgKmVuZHB0ciA9PSAnSycpCisJCW51bSAqPSAxMDI0TEw7CisJZWxzZSBpZiAoKmVuZHB0ciA9PSAnbScgfHwgKmVuZHB0ciA9PSAnTScpCisJCW51bSAqPSAxMDI0TEwgKiAxMDI0TEw7CisJZWxzZSBpZiAoKmVuZHB0ciA9PSAnZycgfHwgKmVuZHB0ciA9PSAnRycpCisJCW51bSAqPSAxMDI0TEwgKiAxMDI0TEwgKiAxMDI0TEw7CisKKwlyZXR1cm4gbnVtOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3V0aWxzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmY1MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0X3V0aWxzLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9FWFQ0X1VUSUxTX0hfCisjZGVmaW5lIF9FWFQ0X1VUSUxTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBfR05VX1NPVVJDRQorI2RlZmluZSBfR05VX1NPVVJDRQorI2VuZGlmCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjZGVmaW5lIGxzZWVrNjQgbHNlZWsKKyNkZWZpbmUgZnRydW5jYXRlNjQgZnRydW5jYXRlCisjZGVmaW5lIG1tYXA2NCBtbWFwCisjZGVmaW5lIG9mZjY0X3Qgb2ZmX3QKKyNlbmRpZgorCisjaW5jbHVkZSAiZXh0NF9zYi5oIgorCitleHRlcm4gaW50IGZvcmNlOworCisjZGVmaW5lIHdhcm4oZm10LCBhcmdzLi4uKSBkbyB7IGZwcmludGYoc3RkZXJyLCAid2FybmluZzogJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZXJyb3IoZm10LCBhcmdzLi4uKSBkbyB7IGZwcmludGYoc3RkZXJyLCAiZXJyb3I6ICVzOiAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7IGlmICghZm9yY2UpIGxvbmdqbXAoc2V0am1wX2VudiwgRVhJVF9GQUlMVVJFKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZXJyb3JfZXJybm8ocywgYXJncy4uLikgZXJyb3IocyAiOiAlcyIsICMjYXJncywgc3RyZXJyb3IoZXJybm8pKQorI2RlZmluZSBjcml0aWNhbF9lcnJvcihmbXQsIGFyZ3MuLi4pIGRvIHsgZnByaW50ZihzdGRlcnIsICJjcml0aWNhbCBlcnJvcjogJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjIyBhcmdzKTsgbG9uZ2ptcChzZXRqbXBfZW52LCBFWElUX0ZBSUxVUkUpOyB9IHdoaWxlICgwKQorI2RlZmluZSBjcml0aWNhbF9lcnJvcl9lcnJubyhzLCBhcmdzLi4uKSBjcml0aWNhbF9lcnJvcihzICI6ICVzIiwgIyNhcmdzLCBzdHJlcnJvcihlcnJubykpCisKKyNkZWZpbmUgRVhUNF9KTkxfQkFDS1VQX0JMT0NLUyAxCisKKyNpZm5kZWYgbWluIC8qIGFscmVhZHkgZGVmaW5lZCBieSB3aW5kb3dzLmggKi8KKyNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2RlZmluZSBESVZfUk9VTkRfVVAoeCwgeSkgKCgoeCkgKyAoeSkgLSAxKS8oeSkpCisjZGVmaW5lIEFMSUdOKHgsIHkpICgoeSkgKiBESVZfUk9VTkRfVVAoKHgpLCAoeSkpKQorCisvKiBYWFggKi8KKyNkZWZpbmUgY3B1X3RvX2xlMzIoeCkgKHgpCisjZGVmaW5lIGNwdV90b19sZTE2KHgpICh4KQorI2RlZmluZSBsZTMyX3RvX2NwdSh4KSAoeCkKKyNkZWZpbmUgbGUxNl90b19jcHUoeCkgKHgpCisKKyNpZmRlZiBfX0xQNjRfXwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHU2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgczY0OworI2Vsc2UKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHU2NDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBzNjQ7CisjZW5kaWYKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHUxNjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworc3RydWN0IGJsb2NrX2dyb3VwX2luZm87CitzdHJ1Y3QgeGF0dHJfbGlzdF9lbGVtZW50OworCitzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjIHsKKwl1MzIgYmdfYmxvY2tfYml0bWFwOworCXUzMiBiZ19pbm9kZV9iaXRtYXA7CisJdTMyIGJnX2lub2RlX3RhYmxlOworCXUxNiBiZ19mcmVlX2Jsb2Nrc19jb3VudDsKKwl1MTYgYmdfZnJlZV9pbm9kZXNfY291bnQ7CisJdTE2IGJnX3VzZWRfZGlyc19jb3VudDsKKwl1MTYgYmdfZmxhZ3M7CisJdTMyIGJnX3Jlc2VydmVkWzJdOworCXUxNiBiZ19yZXNlcnZlZDE2OworCXUxNiBiZ19jaGVja3N1bTsKK307CisKK3N0cnVjdCBmc19hdXhfaW5mbyB7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICoqYmFja3VwX3NiOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmJnX2Rlc2M7CisJc3RydWN0IGJsb2NrX2dyb3VwX2luZm8gKmJnczsKKwlzdHJ1Y3QgeGF0dHJfbGlzdF9lbGVtZW50ICp4YXR0cnM7CisJdTMyIGZpcnN0X2RhdGFfYmxvY2s7CisJdTY0IGxlbl9ibG9ja3M7CisJdTMyIGlub2RlX3RhYmxlX2Jsb2NrczsKKwl1MzIgZ3JvdXBzOworCXUzMiBiZ19kZXNjX2Jsb2NrczsKKwl1MzIgZGVmYXVsdF9pX2ZsYWdzOworCXUzMiBibG9ja3NfcGVyX2luZDsKKwl1MzIgYmxvY2tzX3Blcl9kaW5kOworCXUzMiBibG9ja3NfcGVyX3RpbmQ7Cit9OworCitleHRlcm4gc3RydWN0IGZzX2luZm8gaW5mbzsKK2V4dGVybiBzdHJ1Y3QgZnNfYXV4X2luZm8gYXV4X2luZm87CitleHRlcm4gc3RydWN0IHNwYXJzZV9maWxlICpleHQ0X3NwYXJzZV9maWxlOworCitleHRlcm4gam1wX2J1ZiBzZXRqbXBfZW52OworCitzdGF0aWMgaW5saW5lIGludCBsb2dfMihpbnQgaikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGogPiAwOyBpKyspCisJCWogPj49IDE7CisKKwlyZXR1cm4gaSAtIDE7Cit9CisKK2ludCBleHQ0X2JnX2hhc19zdXBlcl9ibG9jayhpbnQgYmcpOwordm9pZCB3cml0ZV9leHQ0X2ltYWdlKGludCBmZCwgaW50IGd6LCBpbnQgc3BhcnNlLCBpbnQgY3JjKTsKK3ZvaWQgZXh0NF9jcmVhdGVfZnNfYXV4X2luZm8odm9pZCk7Cit2b2lkIGV4dDRfZnJlZV9mc19hdXhfaW5mbyh2b2lkKTsKK3ZvaWQgZXh0NF9maWxsX2luX3NiKHZvaWQpOwordm9pZCBleHQ0X2NyZWF0ZV9yZXNpemVfaW5vZGUodm9pZCk7Cit2b2lkIGV4dDRfY3JlYXRlX2pvdXJuYWxfaW5vZGUodm9pZCk7Cit2b2lkIGV4dDRfdXBkYXRlX2ZyZWUodm9pZCk7Cit2b2lkIGV4dDRfcXVldWVfc2Iodm9pZCk7Cit1NjQgZ2V0X2Jsb2NrX2RldmljZV9zaXplKGludCBmZCk7CitpbnQgaXNfYmxvY2tfZGV2aWNlX2ZkKGludCBmZCk7Cit1NjQgZ2V0X2ZpbGVfc2l6ZShpbnQgZmQpOwordTY0IHBhcnNlX251bShjb25zdCBjaGFyICphcmcpOwordm9pZCBleHQ0X3BhcnNlX3NiX2luZm8oc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNiKTsKK3UxNiBleHQ0X2NyYzE2KHUxNiBjcmNfaW4sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHNpemUpOworCit0eXBlZGVmIHZvaWQgKCpmc19jb25maWdfZnVuY190KShjb25zdCBjaGFyICpwYXRoLCBpbnQgZGlyLCB1bnNpZ25lZCAqdWlkLCB1bnNpZ25lZCAqZ2lkLAorICAgICAgICB1bnNpZ25lZCAqbW9kZSwgdWludDY0X3QgKmNhcGFiaWxpdGllcyk7CisKK3N0cnVjdCBzZWxhYmVsX2hhbmRsZTsKKworaW50IG1ha2VfZXh0NGZzX2ludGVybmFsKGludCBmZCwgY29uc3QgY2hhciAqZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vdW50cG9pbnQsIGZzX2NvbmZpZ19mdW5jX3QgZnNfY29uZmlnX2Z1bmMsIGludCBnemlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFyc2UsIGludCBjcmMsIGludCB3aXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VobmQsIGludCB2ZXJib3NlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRmaXh1cC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0Zml4dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmVlZWZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0Zml4dXAuYwpAQCAtMCwwICsxLDg5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSAiZXh0NF91dGlscy5oIgorI2luY2x1ZGUgIm1ha2VfZXh0NGZzLmgiCisjaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCisjaW5jbHVkZSAiYWxsb2NhdGUuaCIKKyNpbmNsdWRlICJleHQ0Zml4dXAuaCIKKworI2luY2x1ZGUgPHNwYXJzZS9zcGFyc2UuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIFVTRV9NSU5HVworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fTUFDSF9fKQorI2RlZmluZSBsc2VlazY0IGxzZWVrCisjZGVmaW5lIG9mZjY0X3Qgb2ZmX3QKKyNlbmRpZgorCisvKiBUaGUgaW5vZGUgYmxvY2sgY291bnQgZm9yIGEgZmlsZS9kaXJlY3RvcnkgaXMgaW4gdW5pdHMgb2YgNTEyIGJ5dGUgYmxvY2tzLAorICogX05PVF8gdGhlIGZpbGVzeXN0ZW0gYmxvY2sgc2l6ZSEKKyAqLworI2RlZmluZSBJTk9ERV9CTE9DS19TSVpFIDUxMgorCisjZGVmaW5lIE1BWF9FWFQ0X0JMT0NLX1NJWkUgNDA5NgorCisvKiBUaGUgdHdvIG1vZGVzIHRoZSByZWN1cnNlX2RpcigpIGNhbiBiZSBpbiAqLworI2RlZmluZSBTQU5JVFlfQ0hFQ0tfUEFTUyAxCisjZGVmaW5lIE1BUktfSU5PREVfTlVNUyAgIDIKKyNkZWZpbmUgVVBEQVRFX0lOT0RFX05VTVMgMworCisvKiBNYWdpYyBudW1iZXJzIHRvIGluZGljYXRlIHdoYXQgc3RhdGUgdGhlIHVwZGF0ZSBwcm9jZXNzIGlzIGluICovCisjZGVmaW5lIE1BR0lDX1NUQVRFX01BUktJTkdfSU5VTVMgIDB4NzAwMDE1MTUxNTU2NTUxMmxsCisjZGVmaW5lIE1BR0lDX1NUQVRFX1VQREFUSU5HX0lOVU1TIDB4NjEyMTEzMTIxMTczNTEyM2xsCisjZGVmaW5lIE1BR0lDX1NUQVRFX1VQREFUSU5HX1NCICAgIDB4MTVlMTcxNTE1MTU1ODQ3N2xsCisKKy8qIEludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYWdpYyBudW1iZXJzICovCisjZGVmaW5lIFNUQVRFX1VOU0VUICAgICAgICAgIDAKKyNkZWZpbmUgU1RBVEVfTUFSS0lOR19JTlVNUyAgMQorI2RlZmluZSBTVEFURV9VUERBVElOR19JTlVNUyAyCisjZGVmaW5lIFNUQVRFX1VQREFUSU5HX1NCICAgIDMKKworLyogVXNlZCBmb3IgYXV0b21hdGVkIHRlc3Rpbmcgb2YgdGhpcyBwcm9ncmFtcyBhYmlsaXR5IHRvIHN0b3AgYW5kIGJlIHJlc3RhcnRlZCB3dGhvdXQgZXJyb3IgKi8KK3N0YXRpYyBpbnQgYmFpbF9waGFzZSA9IDA7CitzdGF0aWMgaW50IGJhaWxfbG9jID0gMDsKK3N0YXRpYyBpbnQgYmFpbF9jb3VudCA9IDA7CitzdGF0aWMgaW50IGNvdW50ID0gMDsKKworLyogZ2xvYmFsIGZsYWdzICovCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCBub193cml0ZSA9IDA7CisKK3N0YXRpYyBpbnQgbmV3X2lub2Rlc19wZXJfZ3JvdXAgPSAwOworCitzdGF0aWMgaW50IG5vX3dyaXRlX2ZpeHVwX3N0YXRlID0gMDsKKworc3RhdGljIGludCBjb21wdXRlX25ld19pbnVtKHVuc2lnbmVkIGludCBvbGRfaW51bSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZ3JvdXAsIG9mZnNldDsKKworICAgIGdyb3VwID0gKG9sZF9pbnVtIC0gMSkgLyBpbmZvLmlub2Rlc19wZXJfZ3JvdXA7CisgICAgb2Zmc2V0ID0gKG9sZF9pbnVtIC0xKSAlIGluZm8uaW5vZGVzX3Blcl9ncm91cDsKKworICAgIHJldHVybiAoZ3JvdXAgKiBuZXdfaW5vZGVzX3Blcl9ncm91cCkgKyBvZmZzZXQgKyAxOworfQorCisvKiBGdW5jdGlvbiB0byByZWFkIHRoZSBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHJlYWRfc2IoaW50IGZkLCBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqc2IpCit7CisgICAgb2ZmNjRfdCByZXQ7CisKKyAgICByZXQgPSBsc2VlazY0KGZkLCAxMDI0LCBTRUVLX1NFVCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGNyaXRpY2FsX2Vycm9yX2Vycm5vKCJmYWlsZWQgdG8gc2VlayB0byBzdXBlcmJsb2NrIik7CisKKyAgICByZXQgPSByZWFkKGZkLCBzYiwgc2l6ZW9mKCpzYikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHJlYWQgc3VwZXJibG9jayIpOworICAgIGlmIChyZXQgIT0gc2l6ZW9mKCpzYikpCisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gcmVhZCBhbGwgb2Ygc3VwZXJibG9jayIpOworfQorCisvKiBGdW5jdGlvbiB0byB3cml0ZSBhIHByaW1hcnkgb3IgYmFja3VwIHN1cGVyYmxvY2sgYXQgYSBnaXZlbiBvZmZzZXQgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3NiKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nIG9mZnNldCwgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNiKQoreworICAgIG9mZjY0X3QgcmV0OworCisgICAgaWYgKG5vX3dyaXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXQgPSBsc2VlazY0KGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBzZWVrIHRvIHN1cGVyYmxvY2siKTsKKworICAgIHJldCA9IHdyaXRlKGZkLCBzYiwgc2l6ZW9mKCpzYikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHdyaXRlIHN1cGVyYmxvY2siKTsKKyAgICBpZiAocmV0ICE9IHNpemVvZigqc2IpKQorICAgICAgICBjcml0aWNhbF9lcnJvcigiZmFpbGVkIHRvIHdyaXRlIGFsbCBvZiBzdXBlcmJsb2NrIik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZzX2ZpeHVwX3N0YXRlKGludCBmZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgbWFnaWM7CisgICAgaW50IHJldCwgbGVuOworCisgICAgaWYgKG5vX3dyaXRlKSB7CisgICAgICAgIHJldHVybiBub193cml0ZV9maXh1cF9zdGF0ZTsKKyAgICB9CisKKyAgICBsc2VlazY0KGZkLCAwLCBTRUVLX1NFVCk7CisgICAgbGVuID0gcmVhZChmZCwgJm1hZ2ljLCBzaXplb2YobWFnaWMpKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihtYWdpYykpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoImNhbm5vdCByZWFkIGZpeHVwX3N0YXRlXG4iKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1hZ2ljKSB7CisgICAgICAgIGNhc2UgTUFHSUNfU1RBVEVfTUFSS0lOR19JTlVNUzoKKyAgICAgICAgICAgIHJldCA9IFNUQVRFX01BUktJTkdfSU5VTVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQUdJQ19TVEFURV9VUERBVElOR19JTlVNUzoKKyAgICAgICAgICAgIHJldCA9IFNUQVRFX1VQREFUSU5HX0lOVU1TOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUFHSUNfU1RBVEVfVVBEQVRJTkdfU0I6CisgICAgICAgICAgICByZXQgPSBTVEFURV9VUERBVElOR19TQjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0ID0gU1RBVEVfVU5TRVQ7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ZzX2ZpeHVwX3N0YXRlKGludCBmZCwgaW50IHN0YXRlKQoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtYWdpYzsKKyAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKKyAgICBpbnQgbGVuOworCisgICAgaWYgKG5vX3dyaXRlKSB7CisgICAgICAgIG5vX3dyaXRlX2ZpeHVwX3N0YXRlID0gc3RhdGU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9NQVJLSU5HX0lOVU1TOgorICAgICAgICAgICAgbWFnaWMgPSBNQUdJQ19TVEFURV9NQVJLSU5HX0lOVU1TOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfVVBEQVRJTkdfSU5VTVM6CisgICAgICAgICAgICBtYWdpYyA9IE1BR0lDX1NUQVRFX1VQREFUSU5HX0lOVU1TOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfVVBEQVRJTkdfU0I6CisgICAgICAgICAgICBtYWdpYyA9IE1BR0lDX1NUQVRFX1VQREFUSU5HX1NCOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfVU5TRVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtYWdpYyA9IDBsbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxzZWVrNjQoZmQsIDAsIFNFRUtfU0VUKTsKKyAgICBsZW4gPSB3cml0ZShmZCwgJm1hZ2ljLCBzaXplb2YobWFnaWMpKTsKKyAgICBpZiAobGVuICE9IHNpemVvZihtYWdpYykpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoImNhbm5vdCB3cml0ZSBmaXh1cF9zdGF0ZVxuIik7CisgICAgfQorCisgICAgcmVhZF9zYihmZCwgJnNiKTsKKyAgICBpZiAobWFnaWMpIHsKKyAgICAgICAgLyogSWYgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHVwZGF0aW5nIHRoZSBmaWxlc3lzdGVtLCBtYWtlIGl0IHVubW91bnRhYmxlICovCisgICAgICAgIHNiLnNfZGVzY19zaXplIHw9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogd2UgYXJlIGRvbmUsIHNvIG1ha2UgdGhlIGZpbGVzeXN0ZW0gbW91bnRhYmxlIGFnYWluICovCisgICAgICAgIHNiLnNfZGVzY19zaXplICY9IH4xOworICAgIH0KKyAgICB3cml0ZV9zYihmZCwgMTAyNCwgJnNiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfZXh0KGludCBmZCkKK3sKKyAgICBvZmY2NF90IHJldDsKKyAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKKworICAgIHJlYWRfc2IoZmQsICZzYik7CisKKyAgICBleHQ0X3BhcnNlX3NiX2luZm8oJnNiKTsKKworICAgIGlmIChpbmZvLmZlYXRfaW5jb21wYXQgJiBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikgeworICAgICAgICBjcml0aWNhbF9lcnJvcigiRmlsZXN5c3RlbSBuZWVkcyByZWNvdmVyeSBmaXJzdCwgbW91bnQgYW5kIHVubW91bnQgdG8gZG8gdGhhdFxuIik7CisgICAgfQorCisgICAgLyogQ2xlYXIgdGhlIGxvdyBiaXQgd2hpY2ggaXMgc2V0IHdoaWxlIHRoaXMgdG9vbCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKiBJZiB0aGUgdG9vbCBjcmFzaGVzLCBpdCB3aWxsIHN0aWxsIGJlIHNldCB3aGVuIHdlIHJlc3RhcnQuCisgICAgICogVGhlIGxvdyBiaXQgaXMgc2V0IHRvIG1ha2UgdGhlIGZpbGVzeXN0ZW0gdW5tb3VudGFibGUgd2hpbGUKKyAgICAgKiBpdCBpcyBiZWluZyBmaXhlZCB1cC4gIEFsc28gYWxsb3cgMCwgd2hpY2ggbWVhbnMgdGhlIG9sZCBleHQyCisgICAgICogc2l6ZSBpcyBpbiB1c2UuCisgICAgICovCisgICAgaWYgKCgoc2Iuc19kZXNjX3NpemUgJiB+MSkgIT0gc2l6ZW9mKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MpKSAmJgorICAgICAgICAoKHNiLnNfZGVzY19zaXplICYgfjEpICE9IDApKQorICAgICAgICBjcml0aWNhbF9lcnJvcigiZXJyb3I6IGJnX2Rlc2Nfc2l6ZSAhPSBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYylcbiIpOworCisgICAgcmV0ID0gbHNlZWs2NChmZCwgaW5mby5sZW4sIFNFRUtfU0VUKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBzZWVrIHRvIGVuZCBvZiBpbnB1dCBpbWFnZSIpOworCisgICAgcmV0ID0gbHNlZWs2NChmZCwgaW5mby5ibG9ja19zaXplICogKGF1eF9pbmZvLmZpcnN0X2RhdGFfYmxvY2sgKyAxKSwgU0VFS19TRVQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHNlZWsgdG8gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworICAgIHJldCA9IHJlYWQoZmQsIGF1eF9pbmZvLmJnX2Rlc2MsIGluZm8uYmxvY2tfc2l6ZSAqIGF1eF9pbmZvLmJnX2Rlc2NfYmxvY2tzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byByZWFkIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3JzIik7CisgICAgaWYgKHJldCAhPSAoaW50KWluZm8uYmxvY2tfc2l6ZSAqIChpbnQpYXV4X2luZm8uYmdfZGVzY19ibG9ja3MpCisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gcmVhZCBhbGwgb2YgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiRm91bmQgZmlsZXN5c3RlbSB3aXRoIHBhcmFtZXRlcnM6XG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgU2l6ZTogJSJQUkl1NjQiXG4iLCBpbmZvLmxlbik7CisgICAgICAgIHByaW50ZigiICAgIEJsb2NrIHNpemU6ICVkXG4iLCBpbmZvLmJsb2NrX3NpemUpOworICAgICAgICBwcmludGYoIiAgICBCbG9ja3MgcGVyIGdyb3VwOiAlZFxuIiwgaW5mby5ibG9ja3NfcGVyX2dyb3VwKTsKKyAgICAgICAgcHJpbnRmKCIgICAgSW5vZGVzIHBlciBncm91cDogJWRcbiIsIGluZm8uaW5vZGVzX3Blcl9ncm91cCk7CisgICAgICAgIHByaW50ZigiICAgIElub2RlIHNpemU6ICVkXG4iLCBpbmZvLmlub2RlX3NpemUpOworICAgICAgICBwcmludGYoIiAgICBMYWJlbDogJXNcbiIsIGluZm8ubGFiZWwpOworICAgICAgICBwcmludGYoIiAgICBCbG9ja3M6ICUiUFJJdTY0IlxuIiwgYXV4X2luZm8ubGVuX2Jsb2Nrcyk7CisgICAgICAgIHByaW50ZigiICAgIEJsb2NrIGdyb3VwczogJWRcbiIsIGF1eF9pbmZvLmdyb3Vwcyk7CisgICAgICAgIHByaW50ZigiICAgIFJlc2VydmVkIGJsb2NrIGdyb3VwIHNpemU6ICVkXG4iLCBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3MpOworICAgICAgICBwcmludGYoIiAgICBVc2VkICVkLyVkIGlub2RlcyBhbmQgJWQvJWQgYmxvY2tzXG4iLAorICAgICAgICAgICAgICAgIGF1eF9pbmZvLnNiLT5zX2lub2Rlc19jb3VudCAtIGF1eF9pbmZvLnNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50LAorICAgICAgICAgICAgICAgIGF1eF9pbmZvLnNiLT5zX2lub2Rlc19jb3VudCwKKyAgICAgICAgICAgICAgICBhdXhfaW5mby5zYi0+c19ibG9ja3NfY291bnRfbG8gLSBhdXhfaW5mby5zYi0+c19mcmVlX2Jsb2Nrc19jb3VudF9sbywKKyAgICAgICAgICAgICAgICBhdXhfaW5mby5zYi0+c19ibG9ja3NfY291bnRfbG8pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfaW5vZGUoaW50IGZkLCB1bnNpZ25lZCBpbnQgaW51bSwgc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlKQoreworICAgIHVuc2lnbmVkIGludCBiZ19udW0sIGJnX29mZnNldDsKKyAgICBvZmY2NF90IGlub2RlX29mZnNldDsKKyAgICBpbnQgbGVuOworCisgICAgYmdfbnVtID0gKGludW0tMSkgLyBpbmZvLmlub2Rlc19wZXJfZ3JvdXA7CisgICAgYmdfb2Zmc2V0ID0gKGludW0tMSkgJSBpbmZvLmlub2Rlc19wZXJfZ3JvdXA7CisKKyAgICBpbm9kZV9vZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylhdXhfaW5mby5iZ19kZXNjW2JnX251bV0uYmdfaW5vZGVfdGFibGUgKiBpbmZvLmJsb2NrX3NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgKGJnX29mZnNldCAqIGluZm8uaW5vZGVfc2l6ZSk7CisKKyAgICBpZiAobHNlZWs2NChmZCwgaW5vZGVfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yX2Vycm5vKCJmYWlsZWQgdG8gc2VlayB0byBpbm9kZSAlZFxuIiwgaW51bSk7CisgICAgfQorCisgICAgbGVuPXJlYWQoZmQsIGlub2RlLCBzaXplb2YoKmlub2RlKSk7CisgICAgaWYgKGxlbiAhPSBzaXplb2YoKmlub2RlKSkgeworICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHJlYWQgaW5vZGUgJWRcbiIsIGludW0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfYmxvY2soaW50IGZkLCB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tfbnVtLCB2b2lkICpibG9jaykKK3sKKyAgICBvZmY2NF90IG9mZjsKKyAgICB1bnNpZ25lZCBpbnQgbGVuOworCisgICAgb2ZmID0gYmxvY2tfbnVtICogaW5mby5ibG9ja19zaXplOworCisgICAgaWYgKGxzZWVrNjQoZmQsIG9mZiwgU0VFS19TRVQpICwgMCkgeworICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHNlZWsgdG8gYmxvY2sgJWxsZFxuIiwgYmxvY2tfbnVtKTsKKyAgICB9CisKKyAgICBsZW49cmVhZChmZCwgYmxvY2ssIGluZm8uYmxvY2tfc2l6ZSk7CisgICAgaWYgKGxlbiAhPSBpbmZvLmJsb2NrX3NpemUpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byByZWFkIGJsb2NrICVsbGRcbiIsIGJsb2NrX251bSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYmxvY2soaW50IGZkLCB1bnNpZ25lZCBsb25nIGxvbmcgYmxvY2tfbnVtLCB2b2lkICpibG9jaykKK3sKKyAgICBvZmY2NF90IG9mZjsKKyAgICB1bnNpZ25lZCBpbnQgbGVuOworCisgICAgaWYgKG5vX3dyaXRlKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG9mZiA9IGJsb2NrX251bSAqIGluZm8uYmxvY2tfc2l6ZTsKKworICAgIGlmIChsc2VlazY0KGZkLCBvZmYsIFNFRUtfU0VUKSA8IDApIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBzZWVrIHRvIGJsb2NrICVsbGRcbiIsIGJsb2NrX251bSk7CisgICAgfQorCisgICAgbGVuPXdyaXRlKGZkLCBibG9jaywgaW5mby5ibG9ja19zaXplKTsKKyAgICBpZiAobGVuICE9IGluZm8uYmxvY2tfc2l6ZSkgeworICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHdyaXRlIGJsb2NrICVsbGRcbiIsIGJsb2NrX251bSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYml0bWFwX2dldF9iaXQodTggKmJpdG1hcCwgdTMyIGJpdCkKK3sKKyAgICAgICAgaWYgKGJpdG1hcFtiaXQgLyA4XSAmICgxIDw8IChiaXQgJSA4KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJpdG1hcF9jbGVhcl9iaXQodTggKmJpdG1hcCwgdTMyIGJpdCkKK3sKKyAgICAgICAgYml0bWFwW2JpdCAvIDhdICY9IH4oMSA8PCAoYml0ICUgOCkpOworCisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfaW5vZGVfYml0bWFwKGludCBmZCwgdW5zaWduZWQgaW50IGJnX251bSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaW5vZGVfYml0bWFwX2Jsb2NrX251bTsKKyAgICB1bnNpZ25lZCBjaGFyIGJsb2NrW01BWF9FWFQ0X0JMT0NLX1NJWkVdOworICAgIGludCBpLCBiaXRtYXBfdXBkYXRlZCA9IDA7CisKKyAgICAvKiBVc2luZyB0aGUgYmdfbnVtLCBhdXhfaW5mby5iZ19kZXNjW10sIGluZm8uaW5vZGVzX3Blcl9ncm91cCBhbmQKKyAgICAgKiBuZXdfaW5vZGVzX3Blcl9ncm91cCwgcmV0cmlldmUgdGhlIGlub2RlIGJpdG1hcCwgYW5kIG1ha2Ugc3VyZQorICAgICAqIHRoZSBiaXRzIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IHNpemUgYXJlIGNsZWFyCisgICAgICovCisgICAgaW5vZGVfYml0bWFwX2Jsb2NrX251bSA9IGF1eF9pbmZvLmJnX2Rlc2NbYmdfbnVtXS5iZ19pbm9kZV9iaXRtYXA7CisKKyAgICByZWFkX2Jsb2NrKGZkLCBpbm9kZV9iaXRtYXBfYmxvY2tfbnVtLCBibG9jayk7CisKKyAgICBmb3IgKGkgPSBpbmZvLmlub2Rlc19wZXJfZ3JvdXA7IGkgPCBuZXdfaW5vZGVzX3Blcl9ncm91cDsgaSsrKSB7CisgICAgICAgIGlmIChiaXRtYXBfZ2V0X2JpdChibG9jaywgaSkpIHsKKyAgICAgICAgICAgIGJpdG1hcF9jbGVhcl9iaXQoYmxvY2ssIGkpOworICAgICAgICAgICAgYml0bWFwX3VwZGF0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJpdG1hcF91cGRhdGVkKSB7CisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IHVwZGF0ZWQgaW5vZGUgYml0bWFwIGZvciBibG9jayBncm91cCAlZFxuIiwgYmdfbnVtKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZV9ibG9jayhmZCwgaW5vZGVfYml0bWFwX2Jsb2NrX251bSwgYmxvY2spOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyogVXBkYXRlIHRoZSBzdXBlcmJsb2NrIGFuZCBiZ2Rlc2Mgb2YgdGhlIHNwZWNpZmllZCBibG9jayBncm91cCAqLworc3RhdGljIGludCB1cGRhdGVfc3VwZXJibG9ja3NfYW5kX2JnX2Rlc2MoaW50IGZkLCBpbnQgc3RhdGUpCit7CisgICAgb2ZmNjRfdCByZXQ7CisgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgc2I7CisgICAgdW5zaWduZWQgaW50IG51bV9ibG9ja19ncm91cHMsIHRvdGFsX25ld19pbm9kZXM7CisgICAgdW5zaWduZWQgaW50IGk7CisKKworICAgIHJlYWRfc2IoZmQsICZzYik7CisKKyAgICAvKiBDb21wdXRlIGhvdyBtYW55IG1vcmUgaW5vZGVzIGFyZSBub3cgYXZhaWxhYmxlICovCisgICAgbnVtX2Jsb2NrX2dyb3VwcyA9IERJVl9ST1VORF9VUChhdXhfaW5mby5sZW5fYmxvY2tzLCBpbmZvLmJsb2Nrc19wZXJfZ3JvdXApOworICAgIHRvdGFsX25ld19pbm9kZXMgPSBudW1fYmxvY2tfZ3JvdXBzICogKG5ld19pbm9kZXNfcGVyX2dyb3VwIC0gc2Iuc19pbm9kZXNfcGVyX2dyb3VwKTsKKworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiY3JlYXRlZCAlZCBhZGRpdGlvbmFsIGlub2Rlc1xuIiwgdG90YWxfbmV3X2lub2Rlcyk7CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBmcmVlIGlub2RlcyBjb3VudCBpbiBlYWNoIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrX2dyb3VwczsgaSsrKSB7CisgICAgICAgaWYgKHN0YXRlID09IFNUQVRFX1VQREFUSU5HX1NCKSB7CisgICAgICAgICAgIGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQgKz0gKG5ld19pbm9kZXNfcGVyX2dyb3VwIC0gc2Iuc19pbm9kZXNfcGVyX2dyb3VwKTsKKyAgICAgICB9CisgICAgICAgY2hlY2tfaW5vZGVfYml0bWFwKGZkLCBpKTsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBzb21lIHNhbml0eSBjaGVja3MgKi8KKyAgICBpZiAoKHNiLnNfaW5vZGVzX2NvdW50ICsgdG90YWxfbmV3X2lub2RlcykgIT0gKG5ld19pbm9kZXNfcGVyX2dyb3VwICogbnVtX2Jsb2NrX2dyb3VwcykpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoIkZhaWxlZCBzYW5pdHkgY2hlY2sgb24gbmV3IGlub2RlIGNvdW50XG4iKTsKKyAgICB9CisgICAgaWYgKG5ld19pbm9kZXNfcGVyX2dyb3VwICUgKGluZm8uYmxvY2tfc2l6ZS9pbmZvLmlub2RlX3NpemUpKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJGYWlsZWQgc2FuaXR5IGNoZWNrIG9uIG5ldyBpbm9kZSBwZXIgZ3JvdXAgYWxpZ25tZW50XG4iKTsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUgdGhlIGZyZWUgaW5vZGVzIGNvdW50IGluIHRoZSBzdXBlcmJsb2NrICovCisgICAgc2Iuc19pbm9kZXNfY291bnQgKz0gdG90YWxfbmV3X2lub2RlczsKKyAgICBzYi5zX2ZyZWVfaW5vZGVzX2NvdW50ICs9IHRvdGFsX25ld19pbm9kZXM7CisgICAgc2Iuc19pbm9kZXNfcGVyX2dyb3VwID0gbmV3X2lub2Rlc19wZXJfZ3JvdXA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXV4X2luZm8uZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgaWYgKGV4dDRfYmdfaGFzX3N1cGVyX2Jsb2NrKGkpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2Jfb2Zmc2V0OworCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgIC8qIFRoZSBmaXJzdCBzdXBlcmJsb2NrIGlzIG9mZnNldCBieSAxSyB0byBsZWF2ZSByb29tIGZvciBib290IHNlY3RvcnMgKi8KKyAgICAgICAgICAgICAgc2Jfb2Zmc2V0ID0gMTAyNDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHNiX29mZnNldCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNiLnNfYmxvY2tfZ3JvdXBfbnIgPSBpOworICAgICAgICAgICAgLyogRG9uJ3Qgd3JpdGUgb3V0IHRoZSBiYWNrdXAgc3VwZXJibG9ja3Mgd2l0aCB0aGUgYml0IHNldCBpbiB0aGUgc19kZXNjX3NpemUKKyAgICAgICAgICAgICAqIHdoaWNoIHByZXZlbnRzIHRoZSBmaWxlc3lzdGVtIGZyb20gbW91bnRpbmcuICBUaGUgYml0IGZvciB0aGUgcHJpbWFyeQorICAgICAgICAgICAgICogc3VwZXJibG9jayB3aWxsIGJlIGNsZWFyZWQgb24gdGhlIGZpbmFsIGNhbGwgdG8gc2V0X2ZzX2ZpeHVwX3N0YXRlKCkgKi8KKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICBzYi5zX2Rlc2Nfc2l6ZSAmPSB+MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVfc2IoZmQsICh1bnNpZ25lZCBsb25nIGxvbmcpaSAqIGluZm8uYmxvY2tzX3Blcl9ncm91cCAqIGluZm8uYmxvY2tfc2l6ZSArIHNiX29mZnNldCwgJnNiKTsKKworICAgICAgICAgICAgcmV0ID0gbHNlZWs2NChmZCwgKCh1bnNpZ25lZCBsb25nIGxvbmcpaSAqIGluZm8uYmxvY2tzX3Blcl9ncm91cCAqIGluZm8uYmxvY2tfc2l6ZSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZm8uYmxvY2tfc2l6ZSAqIChhdXhfaW5mby5maXJzdF9kYXRhX2Jsb2NrICsgMSkpLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBjcml0aWNhbF9lcnJvcl9lcnJubygiZmFpbGVkIHRvIHNlZWsgdG8gYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworICAgICAgICAgICAgaWYgKCFub193cml0ZSkgeworICAgICAgICAgICAgICAgIHJldCA9IHdyaXRlKGZkLCBhdXhfaW5mby5iZ19kZXNjLCBpbmZvLmJsb2NrX3NpemUgKiBhdXhfaW5mby5iZ19kZXNjX2Jsb2Nrcyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGNyaXRpY2FsX2Vycm9yX2Vycm5vKCJmYWlsZWQgdG8gd3JpdGUgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IChpbnQpaW5mby5ibG9ja19zaXplICogKGludClhdXhfaW5mby5iZ19kZXNjX2Jsb2NrcykKKyAgICAgICAgICAgICAgICAgICAgY3JpdGljYWxfZXJyb3IoImZhaWxlZCB0byB3cml0ZSBhbGwgb2YgYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGJhaWxfcGhhc2UgPT0gNCkgJiYgKCh1bnNpZ25lZCBpbnQpYmFpbF9jb3VudCA9PSBpKSkgeworICAgICAgICAgICAgY3JpdGljYWxfZXJyb3IoImJhaWxpbmcgYXQgcGhhc2UgNFxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGdldF9kaXJlY3RfYmxvY2tzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBsb25nICpibG9ja19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY291bnQpCit7CisgICAgdW5zaWduZWQgaW50IGkgPSAwOworICAgIHVuc2lnbmVkIGludCByZXQgPSAwOworICAgIHVuc2lnbmVkIGludCBzZWN0b3JzX3Blcl9ibG9jazsKKworICAgIHNlY3RvcnNfcGVyX2Jsb2NrID0gaW5mby5ibG9ja19zaXplIC8gSU5PREVfQkxPQ0tfU0laRTsKKyAgICB3aGlsZSAoKGkgPCAoaW5vZGUtPmlfYmxvY2tzX2xvIC8gc2VjdG9yc19wZXJfYmxvY2spKSAmJiAoaSA8IEVYVDRfTkRJUl9CTE9DS1MpKSB7CisgICAgICAgIGJsb2NrX2xpc3RbaV0gPSBpbm9kZS0+aV9ibG9ja1tpXTsKKyAgICAgICAgaSsrOworICAgIH0KKworICAgICpjb3VudCArPSBpOworCisgICAgaWYgKChpbm9kZS0+aV9ibG9ja3NfbG8gLyBzZWN0b3JzX3Blcl9ibG9jaykgPiBFWFQ0X05ESVJfQkxPQ0tTKSB7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfaW5kaXJlY3RfYmxvY2tzKGludCBmZCwgc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tfbGlzdCwgdW5zaWduZWQgaW50ICpjb3VudCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB1bnNpZ25lZCBpbnQgKmluZGlyZWN0X2Jsb2NrOworICAgIHVuc2lnbmVkIGludCBzZWN0b3JzX3Blcl9ibG9jazsKKworICAgIHNlY3RvcnNfcGVyX2Jsb2NrID0gaW5mby5ibG9ja19zaXplIC8gSU5PREVfQkxPQ0tfU0laRTsKKworICAgIGluZGlyZWN0X2Jsb2NrID0gKHVuc2lnbmVkIGludCAqKW1hbGxvYyhpbmZvLmJsb2NrX3NpemUpOworICAgIGlmIChpbmRpcmVjdF9ibG9jayA9PSAwKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbmRpcmVjdF9ibG9ja1xuIik7CisgICAgfQorCisgICAgcmVhZF9ibG9jayhmZCwgaW5vZGUtPmlfYmxvY2tbRVhUNF9ORElSX0JMT0NLU10sIGluZGlyZWN0X2Jsb2NrKTsKKworICAgIGZvcihpID0gMDsgaSA8IChpbm9kZS0+aV9ibG9ja3NfbG8gLyBzZWN0b3JzX3Blcl9ibG9jayAtIEVYVDRfTkRJUl9CTE9DS1MpOyBpKyspIHsKKyAgICAgICBibG9ja19saXN0W0VYVDRfTkRJUl9CTE9DS1MraV0gPSBpbmRpcmVjdF9ibG9ja1tpXTsKKyAgICB9CisKKyAgICAqY291bnQgKz0gaTsKKworICAgIGZyZWUoaW5kaXJlY3RfYmxvY2spOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jsb2NrX2xpc3RfaW5kaXJlY3QoaW50IGZkLCBzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tfbGlzdCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgY291bnQ9MDsKKworICAgIGlmIChnZXRfZGlyZWN0X2Jsb2Nrcyhpbm9kZSwgYmxvY2tfbGlzdCwgJmNvdW50KSkgeworICAgICAgICBnZXRfaW5kaXJlY3RfYmxvY2tzKGZkLCBpbm9kZSwgYmxvY2tfbGlzdCwgJmNvdW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2V4dGVudF9lbnRzKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmV4dF9oZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tfbGlzdCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBzdHJ1Y3QgZXh0NF9leHRlbnQgKmV4dGVudDsKKyAgICBvZmY2NF90IGZzX2Jsb2NrX251bTsKKworICAgIGlmIChleHRfaGRyLT5laF9kZXB0aCAhPSAwKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJnZXRfZXh0ZW50X2VudHMgY2FsbGVkIHdpdGggZWhfZGVwdGggIT0gMFxuIik7CisgICAgfQorCisgICAgLyogVGhlIGV4dGVudCBlbnRyaWVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgaGVhZGVyLCBzbyBhZGQgMSB0byB0aGUgcG9pbnRlcgorICAgICAqIGFuZCBjYXN0IGl0IHRvIGFuIGV4dGVudCBwb2ludGVyLgorICAgICAqLworICAgIGV4dGVudCA9IChzdHJ1Y3QgZXh0NF9leHRlbnQgKikoZXh0X2hkciArIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IGV4dF9oZHItPmVoX2VudHJpZXM7IGkrKykgeworICAgICAgICAgZnNfYmxvY2tfbnVtID0gKChvZmY2NF90KWV4dGVudC0+ZWVfc3RhcnRfaGkgPDwgMzIpIHwgZXh0ZW50LT5lZV9zdGFydF9sbzsKKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBleHRlbnQtPmVlX2xlbjsgaisrKSB7CisgICAgICAgICAgICAgYmxvY2tfbGlzdFtleHRlbnQtPmVlX2Jsb2NrK2pdID0gZnNfYmxvY2tfbnVtK2o7CisgICAgICAgICB9CisgICAgICAgICBleHRlbnQrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZXh0ZW50X2lkeChpbnQgZmQsIHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmV4dF9oZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tfbGlzdCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4ICpleHRlbnRfaWR4OworICAgIHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKnRtcF9leHRfaGRyOworICAgIG9mZjY0X3QgZnNfYmxvY2tfbnVtOworICAgIHVuc2lnbmVkIGNoYXIgYmxvY2tbTUFYX0VYVDRfQkxPQ0tfU0laRV07CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoZXh0X2hkci0+ZWhfZGVwdGggPT0gMCkgeworICAgICAgICBjcml0aWNhbF9lcnJvcigiZ2V0X2V4dGVudF9pZHggY2FsbGVkIHdpdGggZWhfZGVwdGggPT0gMFxuIik7CisgICAgfQorCisgICAgLyogVGhlIGV4dGVudCBlbnRyaWVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgaGVhZGVyLCBzbyBhZGQgMSB0byB0aGUgcG9pbnRlcgorICAgICAqIGFuZCBjYXN0IGl0IHRvIGFuIGV4dGVudCBwb2ludGVyLgorICAgICAqLworICAgIGV4dGVudF9pZHggPSAoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqKShleHRfaGRyICsgMSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZXh0X2hkci0+ZWhfZW50cmllczsgaSsrKSB7CisgICAgICAgICBmc19ibG9ja19udW0gPSAoKG9mZjY0X3QpZXh0ZW50X2lkeC0+ZWlfbGVhZl9oaSA8PCAzMikgfCBleHRlbnRfaWR4LT5laV9sZWFmX2xvOworICAgICAgICAgcmVhZF9ibG9jayhmZCwgZnNfYmxvY2tfbnVtLCBibG9jayk7CisgICAgICAgICB0bXBfZXh0X2hkciA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopYmxvY2s7CisKKyAgICAgICAgIGlmICh0bXBfZXh0X2hkci0+ZWhfZGVwdGggPT0gMCkgeworICAgICAgICAgICAgIGdldF9leHRlbnRfZW50cyh0bXBfZXh0X2hkciwgYmxvY2tfbGlzdCk7IC8qIGxlYWYgbm9kZSwgZmlsbCBpbiBibG9ja19saXN0ICovCisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGdldF9leHRlbnRfaWR4KGZkLCB0bXBfZXh0X2hkciwgYmxvY2tfbGlzdCk7IC8qIHJlY3Vyc2UgZG93biB0aGUgdHJlZSAqLworICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9ibG9ja19saXN0X2V4dGVudHMoaW50IGZkLCBzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbG9uZyAqYmxvY2tfbGlzdCkKK3sKKyAgICBzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICpleHRlbnRfaGRyOworCisgICAgZXh0ZW50X2hkciA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopaW5vZGUtPmlfYmxvY2s7CisKKyAgICBpZiAoZXh0ZW50X2hkci0+ZWhfbWFnaWMgIT0gRVhUNF9FWFRfTUFHSUMpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoImV4dGVudCBoZWFkZXIgaGFzIHVuZXhwZWN0ZWQgbWFnaWMgdmFsdWUgMHglNC40eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50X2hkci0+ZWhfbWFnaWMpOworICAgIH0KKworICAgIGlmIChleHRlbnRfaGRyLT5laF9kZXB0aCA9PSAwKSB7CisgICAgICAgICBnZXRfZXh0ZW50X2VudHMoKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKilpbm9kZS0+aV9ibG9jaywgYmxvY2tfbGlzdCk7CisgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBnZXRfZXh0ZW50X2lkeChmZCwgKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKilpbm9kZS0+aV9ibG9jaywgYmxvY2tfbGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19lbnRyeV9kaXIoaW50IGZkLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlycCwgaW50IHBhc3MpCit7CisgICAgc3RydWN0IGV4dDRfaW5vZGUgaW5vZGU7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoZGlycC0+ZmlsZV90eXBlID09IEVYVDRfRlRfRElSKSB7CisgICAgICAgIHJldCA9IDE7CisgICAgfSBlbHNlIGlmIChkaXJwLT5maWxlX3R5cGUgPT0gRVhUNF9GVF9VTktOT1dOKSB7CisgICAgICAgIC8qIFNvbWVib2R5IHdhcyB0b28gbGF6eSB0byBmaWxsIGluIHRoZSBkaXIgZW50cnksCisgICAgICAgICAqIHNvIHdlIGhhdmUgdG8gZ28gZmV0Y2ggaXQgZnJvbSB0aGUgaW5vZGUuIEdycnIuCisgICAgICAgICAqLworICAgICAgICAvKiBpZiBVUERBVEVfSU5PREVfTlVNUyBwYXNzIGFuZCB0aGUgaW5vZGUgaGlnaCBiaXQgaXMgbm90CisgICAgICAgICAqIHNldCByZXR1cm4gZmFsc2Ugc28gd2UgZG9uJ3QgcmVjdXJzZSBkb3duIHRoZSB0cmVlIHRoYXQgaXMKKyAgICAgICAgICogYWxyZWFkeSB1cGRhdGVkLiAgT3RoZXJ3aXNlLCBmZXRjaCBpbm9kZSwgYW5kIHJldHVybiBhbnN3ZXIuCisgICAgICAgICAqLworICAgICAgICBpZiAoKHBhc3MgPT0gVVBEQVRFX0lOT0RFX05VTVMpICYmICEoZGlycC0+aW5vZGUgJiAweDgwMDAwMDAwKSkgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWRfaW5vZGUoZmQsIChkaXJwLT5pbm9kZSAmIDB4N2ZmZmZmZmYpLCAmaW5vZGUpOworICAgICAgICAgICAgaWYgKFNfSVNESVIoaW5vZGUuaV9tb2RlKSkgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlY3Vyc2VfZGlyKGludCBmZCwgc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLCBjaGFyICpkaXJidWYsIGludCBkaXJzaXplLCBpbnQgbW9kZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2NrX2xpc3Q7CisgICAgdW5zaWduZWQgaW50IG51bV9ibG9ja3M7CisgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcnAsICpwcmV2X2RpcnAgPSAwOworICAgIGNoYXIgbmFtZVsyNTZdOworICAgIHVuc2lnbmVkIGludCBpLCBsZWZ0b3Zlcl9zcGFjZSwgaXNfZGlyOworICAgIHN0cnVjdCBleHQ0X2lub2RlIHRtcF9pbm9kZTsKKyAgICBpbnQgdG1wX2RpcnNpemU7CisgICAgY2hhciAqdG1wX2RpcmJ1ZjsKKworICAgIHN3aXRjaCAobW9kZSkgeworICAgICAgICBjYXNlIFNBTklUWV9DSEVDS19QQVNTOgorICAgICAgICBjYXNlIE1BUktfSU5PREVfTlVNUzoKKyAgICAgICAgY2FzZSBVUERBVEVfSU5PREVfTlVNUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY3JpdGljYWxfZXJyb3IoInJlY3Vyc2VfZGlyKCkgY2FsbGVkIHdpdG4gdW5rbm93biBtb2RlIVxuIik7CisgICAgfQorCisgICAgaWYgKGRpcnNpemUgJSBpbmZvLmJsb2NrX3NpemUpIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoImRpcnNpemUgJWQgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2tfc2l6ZSAlZC4gIFRoaXMgaXMgdW5leHBlY3RlZCFcbiIsCisgICAgICAgICAgICAgICAgZGlyc2l6ZSwgaW5mby5ibG9ja19zaXplKTsKKyAgICB9CisKKyAgICBudW1fYmxvY2tzID0gZGlyc2l6ZSAvIGluZm8uYmxvY2tfc2l6ZTsKKworICAgIGJsb2NrX2xpc3QgPSBtYWxsb2MoKG51bV9ibG9ja3MgKyAxKSAqIHNpemVvZigqYmxvY2tfbGlzdCkpOworICAgIGlmIChibG9ja19saXN0ID09IDApIHsKKyAgICAgICAgY3JpdGljYWxfZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJsb2NrX2xpc3RcbiIpOworICAgIH0KKworICAgIGlmIChpbm9kZS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkgeworICAgICAgICBnZXRfYmxvY2tfbGlzdF9leHRlbnRzKGZkLCBpbm9kZSwgYmxvY2tfbGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQSBkaXJlY3RvcnkgdGhhdCByZXF1aXJlcyBkb3VibHkgb3IgdHJpcGx5IGluZGlyZWN0IGJsb2NrcyBpbiBodWdlIGluZGVlZCwKKyAgICAgICAgICogYW5kIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBub3QgZXhpc3QsIGVzcGVjaWFsbHkgc2luY2UgbWFrZV9leHQ0ZnMgb25seSBjcmVhdGVzCisgICAgICAgICAqIGRpcmVjdG9yaWVzIHdpdGggZXh0ZW50cywgYW5kIHRoZSBrZXJuZWwgd2lsbCB0b28sIGJ1dCBjaGVjayB0byBtYWtlIHN1cmUgdGhlCisgICAgICAgICAqIGRpcmVjdG9yeSBpcyBub3QgdGhhdCBiaWcgYW5kIGdpdmUgYW4gZXJyb3IgaWYgc28uICBPdXIgbGltaXQgaXMgMTIgZGlyZWN0IGJsb2NrcywKKyAgICAgICAgICogcGx1cyBibG9ja19zaXplLzQgc2luZ2x5IGluZGlyZWN0IGJsb2Nrcywgd2hpY2ggZm9yIGEgZmlsZXN5c3RlbSB3aXRoIDRLIGJsb2NrcworICAgICAgICAgKiBpcyBhIGRpcmVjdG9yeSAxMDM2IGJsb2NrcyBsb25nLCBvciA0LDI0Myw0NTYgYnl0ZXMgbG9uZyEgIEFzc3VtaW5nIGFuIGF2ZXJhZ2UKKyAgICAgICAgICogZmlsZW5hbWUgbGVuZ3RoIG9mIDIwICh3aGljaCBJIHRoaW5rIGlzIGdlbmVyb3VzKSB0aGF0cyAyMCArIDggYnl0ZXMgb3ZlcmhlYWQKKyAgICAgICAgICogcGVyIGVudHJ5LCBvciAxNTEsNTUyIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSEKKyAgICAgICAgICovCisgICAgICAgIGlmIChudW1fYmxvY2tzID4gKGluZm8uYmxvY2tfc2l6ZSAvIDQgKyBFWFQ0X05ESVJfQkxPQ0tTKSkgeworICAgICAgICAgICAgY3JpdGljYWxfZXJyb3IoIk5vbi1leHRlbnQgYmFzZWQgZGlyZWN0b3J5IGlzIHRvbyBiaWchXG4iKTsKKyAgICAgICAgfQorICAgICAgICBnZXRfYmxvY2tfbGlzdF9pbmRpcmVjdChmZCwgaW5vZGUsIGJsb2NrX2xpc3QpOworICAgIH0KKworICAgIC8qIFJlYWQgaW4gYWxsIHRoZSBibG9ja3MgZm9yIHRoaXMgZGlyZWN0b3J5ICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICByZWFkX2Jsb2NrKGZkLCBibG9ja19saXN0W2ldLCBkaXJidWYgKyAoaSAqIGluZm8uYmxvY2tfc2l6ZSkpOworICAgIH0KKworICAgIGRpcnAgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilkaXJidWY7CisgICAgd2hpbGUgKGRpcnAgPCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoZGlyYnVmICsgZGlyc2l6ZSkpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgbGVmdG92ZXJfc3BhY2UgPSAoY2hhciAqKShkaXJidWYgKyBkaXJzaXplKSAtIChjaGFyICopZGlycDsKKyAgICAgICAgaWYgKCgobW9kZSA9PSBTQU5JVFlfQ0hFQ0tfUEFTUykgfHwgKG1vZGUgPT0gVVBEQVRFX0lOT0RFX05VTVMpKSAmJgorICAgICAgICAgICAgKGxlZnRvdmVyX3NwYWNlIDw9IDgpICYmIHByZXZfZGlycCkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIGJ1ZyBpbiBhbiBvbGRlciB2ZXJzaW9uIG9mIG1ha2VfZXh0NGZzLCB3aGVyZSBpdAorICAgICAgICAgICAgICogZGlkbid0IHByb3Blcmx5IGluY2x1ZGUgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGluIHJlY19sZW4uCisgICAgICAgICAgICAgKiBVcGRhdGUgcmVjX2xlbiBvbiB0aGUgcHJldmlvdXMgZW50cnkgdG8gaW5jbHVkZSB0aGUgcmVzdCBvZgorICAgICAgICAgICAgICogdGhlIGJsb2NrIGFuZCBleGl0IHRoZSBsb29wLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiZml4aW5nIHVwIHNob3J0IHJlY19sZW4gZm9yIGRpcmV0b3J5IGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2RpcnAtPnJlY19sZW4gKz0gbGVmdG92ZXJfc3BhY2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXJwLT5pbm9kZSA9PSAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3RybmNweShuYW1lLCBkaXJwLT5uYW1lLCBkaXJwLT5uYW1lX2xlbik7CisgICAgICAgIG5hbWVbZGlycC0+bmFtZV9sZW5dPSdcMCc7CisKKyAgICAgICAgLyogT25seSByZWN1cnNlIG9uIHBhc3MgVVBEQVRFX0lOT0RFX05VTVMgaWYgdGhlIGhpZ2ggYml0IGlzIHNldC4KKyAgICAgICAgICogT3RoZXJ3aXNlLCB0aGlzIGlub2RlIGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXBkYXRlZAorICAgICAgICAgKiBhbmQgd2UnbGwgZG8gdGhlIHdyb25nIHRoaW5nLiAgQWxzbyBkb24ndCByZWN1cnNlIG9uIC4gb3IgLi4sCisgICAgICAgICAqIGFuZCBjZXJ0YWlubHkgbm90IG9uIG5vbi1kaXJlY3RvcmllcyEKKyAgICAgICAgICovCisgICAgICAgIC8qIEhybSwgbG9va3MgbGlrZSBmaWxlc3lzdGVtcyBtYWRlIGJ5IGZhc3Rib290IG9uIHN0aW5ncmF5IHNldCB0aGUgZmlsZV90eXBlCisgICAgICAgICAqIGZsYWcsIGJ1dCB0aGUgbG9zdCtmb3VuZCBkaXJlY3RvcnkgaGFzIHRoZSB0eXBlIHNldCB0byBVbmtub3duLCB3aGljaAorICAgICAgICAgKiBzZWVtcyB0byBpbXBseSBJIG5lZWQgdG8gcmVhZCB0aGUgaW5vZGUgYW5kIGdldCBpdC4KKyAgICAgICAgICovCisgICAgICAgIGlzX2RpciA9IGlzX2VudHJ5X2RpcihmZCwgZGlycCwgbW9kZSk7CisgICAgICAgIGlmICggaXNfZGlyICYmIChzdHJjbXAobmFtZSwgIi4iKSAmJiBzdHJjbXAobmFtZSwgIi4uIikpICYmCisgICAgICAgICAgICAoKG1vZGUgPT0gU0FOSVRZX0NIRUNLX1BBU1MpIHx8IChtb2RlID09IE1BUktfSU5PREVfTlVNUykgfHwKKyAgICAgICAgICAgICAgKChtb2RlID09IFVQREFURV9JTk9ERV9OVU1TKSAmJiAoZGlycC0+aW5vZGUgJiAweDgwMDAwMDAwKSkpICkgeworICAgICAgICAgICAgLyogQSBkaXJlY3RvcnkhICBSZWN1cnNlISAqLworICAgICAgICAgICAgcmVhZF9pbm9kZShmZCwgZGlycC0+aW5vZGUgJiAweDdmZmZmZmZmLCAmdG1wX2lub2RlKTsKKworICAgICAgICAgICAgaWYgKCFTX0lTRElSKHRtcF9pbm9kZS5pX21vZGUpKSB7CisgICAgICAgICAgICAgICAgY3JpdGljYWxfZXJyb3IoImlub2RlICVkIGZvciBuYW1lICVzIGRvZXMgbm90IHBvaW50IHRvIGEgZGlyZWN0b3J5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlycC0+aW5vZGUgJiAweDdmZmZmZmZmLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJpbm9kZSAlZCAlcyB1c2UgZXh0ZW50c1xuIiwgZGlycC0+aW5vZGUgJiAweDdmZmZmZmZmLAorICAgICAgICAgICAgICAgICAgICAgICAodG1wX2lub2RlLmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpID8gImRvZXMiIDogImRvZXMgbm90Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcF9kaXJzaXplID0gdG1wX2lub2RlLmlfYmxvY2tzX2xvICogSU5PREVfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJkaXIgc2l6ZSA9ICVkIGJ5dGVzXG4iLCB0bXBfZGlyc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcF9kaXJidWYgPSBtYWxsb2ModG1wX2RpcnNpemUpOworICAgICAgICAgICAgaWYgKHRtcF9kaXJidWYgPT0gMCkgeworICAgICAgICAgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0bXBfZGlyYnVmXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVjdXJzZV9kaXIoZmQsICZ0bXBfaW5vZGUsIHRtcF9kaXJidWYsIHRtcF9kaXJzaXplLCBtb2RlKTsKKworICAgICAgICAgICAgZnJlZSh0bXBfZGlyYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBpZiAoaXNfZGlyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJEaXJlY3RvcnkgJXNcbiIsIG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk5vbi1kaXJlY3RvcnkgJXNcbiIsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogUHJvY2VzcyBlbnRyeSBiYXNlZCBvbiBjdXJyZW50IG1vZGUuICBFaXRoZXIgc2V0IGhpZ2ggYml0IG9yIGNoYW5nZSBpbm9kZSBudW1iZXIgKi8KKyAgICAgICAgaWYgKG1vZGUgPT0gTUFSS19JTk9ERV9OVU1TKSB7CisgICAgICAgICAgICBkaXJwLT5pbm9kZSB8PSAweDgwMDAwMDAwOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gVVBEQVRFX0lOT0RFX05VTVMpIHsKKyAgICAgICAgICAgIGlmIChkaXJwLT5pbm9kZSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBkaXJwLT5pbm9kZSA9IGNvbXB1dGVfbmV3X2ludW0oZGlycC0+aW5vZGUgJiAweDdmZmZmZmZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgoYmFpbF9waGFzZSA9PSBtb2RlKSAmJiAoYmFpbF9sb2MgPT0gMSkgJiYgKGJhaWxfY291bnQgPT0gY291bnQpKSB7CisgICAgICAgICAgICBjcml0aWNhbF9lcnJvcigiQmFpbGluZyBhdCBwaGFzZSAlZCwgbG9jIDEgYW5kIGNvdW50ICVkXG4iLCBtb2RlLCBjb3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBQb2ludCBkaXJwIGF0IHRoZSBuZXh0IGVudHJ5ICovCisgICAgICAgIHByZXZfZGlycCA9IGRpcnA7CisgICAgICAgIGRpcnAgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIqKSgoY2hhciAqKWRpcnAgKyBkaXJwLT5yZWNfbGVuKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSBvdXQgYWxsIHRoZSBibG9ja3MgZm9yIHRoaXMgZGlyZWN0b3J5ICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgeworICAgICAgICB3cml0ZV9ibG9jayhmZCwgYmxvY2tfbGlzdFtpXSwgZGlyYnVmICsgKGkgKiBpbmZvLmJsb2NrX3NpemUpKTsKKyAgICAgICAgaWYgKChiYWlsX3BoYXNlID09IG1vZGUpICYmIChiYWlsX2xvYyA9PSAyKSAmJiAoYmFpbF9jb3VudCA8PSBjb3VudCkpIHsKKyAgICAgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJCYWlsaW5nIGF0IHBoYXNlICVkLCBsb2MgMiBhbmQgY291bnQgJWRcbiIsIG1vZGUsIGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyZWUoYmxvY2tfbGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGV4dDRmaXh1cChjaGFyICpmc2RldikKK3sKKyAgICByZXR1cm4gZXh0NGZpeHVwX2ludGVybmFsKGZzZGV2LCAwLCAwLCAwLCAwLCAwKTsKK30KKworaW50IGV4dDRmaXh1cF9pbnRlcm5hbChjaGFyICpmc2RldiwgaW50IHZfZmxhZywgaW50IG5fZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3BfcGhhc2UsIGludCBzdG9wX2xvYywgaW50IHN0b3BfY291bnQpCit7CisgICAgaW50IGZkOworICAgIHN0cnVjdCBleHQ0X2lub2RlIHJvb3RfaW5vZGU7CisgICAgdW5zaWduZWQgaW50IGRpcnNpemU7CisgICAgY2hhciAqZGlyYnVmOworCisgICAgaWYgKHNldGptcChzZXRqbXBfZW52KSkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsgLyogSGFuZGxlIGEgY2FsbCB0byBsb25nam1wKCkgKi8KKworICAgIHZlcmJvc2UgPSB2X2ZsYWc7CisgICAgbm9fd3JpdGUgPSBuX2ZsYWc7CisKKyAgICBiYWlsX3BoYXNlID0gc3RvcF9waGFzZTsKKyAgICBiYWlsX2xvYyA9IHN0b3BfbG9jOworICAgIGJhaWxfY291bnQgPSBzdG9wX2NvdW50OworCisgICAgZmQgPSBvcGVuKGZzZGV2LCBPX1JEV1IpOworCisgICAgaWYgKGZkIDwgMCkKKyAgICAgICAgY3JpdGljYWxfZXJyb3JfZXJybm8oImZhaWxlZCB0byBvcGVuIGZpbGVzeXN0ZW0gaW1hZ2UiKTsKKworICAgIHJlYWRfZXh0KGZkKTsKKworICAgIGlmICgoaW5mby5mZWF0X2luY29tcGF0ICYgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSA9PSAwKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJFeHBlY3RlZCBmaWxlc3lzdGVtIHRvIGhhdmUgZmlsZXR5cGUgZmxhZyBzZXRcbiIpOworICAgIH0KKworI2lmIDAgLy8gSWYgd2UgaGF2ZSB0byBmaXggdGhlIGRpcmVjdG9yeSByZWNfbGVuIGlzc3VlLCB3ZSBjYW4ndCB1c2UgdGhpcyBjaGVjaworICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgaW5vZGVzL2dyb3VwIGlzIGNvcGFjZXRpYyAqLworICAgIGlmIChpbmZvLmlub2Rlc19wZXJfYmxvY2tncm91cCAlIChpbmZvLmJsb2NrX3NpemUvaW5mby5pbm9kZV9zaXplKSA9PSAwKSB7CisgICAgICAgICAgICAgLyogVGhpcyBmaWxlc3lzdGVtIGhhcyBlaXRoZXIgYWxyZWFkeSBiZWVuIHVwZGF0ZWQsIG9yIHdhcworICAgICAgICAgICAgICAqIG1hZGUgY29ycmVjdGx5LgorICAgICAgICAgICAgICAqLworICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgIHByaW50ZigiJXM6IGZpbGVzeXN0ZW0gY29ycmVjdCwgbm8gd29yayB0byBkb1xuIiwgbWUpOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBleGl0KDApOworICAgIH0KKyNlbmRpZgorCisgICAgLyogQ29tcHV0ZSB3aGF0IHRoZSBuZXcgdmFsdWUgb2YgaW5vZGVzX3Blcl9ibG9ja2dyb3VwIHdpbGwgYmUgd2hlbiB3ZSdyZSBkb25lICovCisgICAgbmV3X2lub2Rlc19wZXJfZ3JvdXA9QUxJR04oaW5mby5pbm9kZXNfcGVyX2dyb3VwLChpbmZvLmJsb2NrX3NpemUvaW5mby5pbm9kZV9zaXplKSk7CisKKyAgICByZWFkX2lub2RlKGZkLCBFWFQ0X1JPT1RfSU5PLCAmcm9vdF9pbm9kZSk7CisKKyAgICBpZiAoIVNfSVNESVIocm9vdF9pbm9kZS5pX21vZGUpKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJyb290IGlub2RlICVkIGRvZXMgbm90IHBvaW50IHRvIGEgZGlyZWN0b3J5XG4iLCBFWFQ0X1JPT1RfSU5PKTsKKyAgICB9CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgcHJpbnRmKCJpbm9kZSAlZCAlcyB1c2UgZXh0ZW50c1xuIiwgRVhUNF9ST09UX0lOTywKKyAgICAgICAgICAgICAgIChyb290X2lub2RlLmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpID8gImRvZXMiIDogImRvZXMgbm90Iik7CisgICAgfQorCisgICAgZGlyc2l6ZSA9IHJvb3RfaW5vZGUuaV9ibG9ja3NfbG8gKiBJTk9ERV9CTE9DS19TSVpFOworICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIHByaW50Zigicm9vdCBkaXIgc2l6ZSA9ICVkIGJ5dGVzXG4iLCBkaXJzaXplKTsKKyAgICB9CisKKyAgICBkaXJidWYgPSBtYWxsb2MoZGlyc2l6ZSk7CisgICAgaWYgKGRpcmJ1ZiA9PSAwKSB7CisgICAgICAgIGNyaXRpY2FsX2Vycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkaXJidWZcbiIpOworICAgIH0KKworICAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgcGFzcyBmaXJzdCwgdHJ5IHRvIGNhdGNoIGFueSBlcnJvcnMgdGhhdCB3aWxsIG9jY3VyCisgICAgICogYmVmb3JlIHdlIGFjdHVhbGx5IGNoYW5nZSBhbnl0aGluZywgc28gd2UgZG9uJ3QgbGVhdmUgYSBmaWxlc3lzdGVtIGluIGEKKyAgICAgKiBjb3JydXB0ZWQsIHVucmVjb3ZlcmFibGUgc3RhdGUuICBTZXQgbm9fd3JpdGUsIG1ha2UgaXQgcXVpZXQsIGFuZCBkbyBhIHJlY3Vyc2UKKyAgICAgKiBwYXNzIGFuZCBhIHVwZGF0ZV9zdXBlcmJsb2NrIHBhc3MuICBTZXQgZmxhZ3MgYmFjayB0byByZXF1ZXN0ZWQgc3RhdGUgd2hlbiBkb25lLgorICAgICAqIE9ubHkgcGVyZm9ybSBzYW5pdHkgY2hlY2sgaWYgdGhlIHN0YXRlIGlzIHVuc2V0LiAgSWYgdGhlIHN0YXRlIGlzIF9OT1RfIHVuc2V0LAorICAgICAqIHRoZW4gdGhlIHRvb2wgaGFzIGFscmVhZHkgYmVlbiBydW4gYW5kIGludGVycnVwdGVkLCBhbmQgaXQgcHJlc3VtYWJseSByYW4gYW5kCisgICAgICogcGFzc2VkIHNhbml0eSBjaGVja2VkIGJlZm9yZSBpdCBnb3QgaW50ZXJydXB0ZWQuICBJdCBpcyBfTk9UXyBzYWZlIHRvIHJ1biBzYW5pdHkKKyAgICAgKiBjaGVjayBpZiBzdGF0ZSBpcyB1bnNldCBiZWNhdXNlIGl0IGFzc3VtZXMgaW5vZGVzIGFyZSB0byBiZSBjb21wdXRlZCB1c2luZyB0aGUKKyAgICAgKiBvbGQgaW5vZGVzL2dyb3VwLCBidXQgc29tZSBpbm9kZSBudW1iZXJzIG1heSBiZSB1cGRhdGVkIHRvIHRoZSBuZXcgbnVtYmVyLgorICAgICAqLworICAgIGlmIChnZXRfZnNfZml4dXBfc3RhdGUoZmQpID09IFNUQVRFX1VOU0VUKSB7CisgICAgICAgIHZlcmJvc2UgPSAwOworICAgICAgICBub193cml0ZSA9IDE7CisgICAgICAgIHJlY3Vyc2VfZGlyKGZkLCAmcm9vdF9pbm9kZSwgZGlyYnVmLCBkaXJzaXplLCBTQU5JVFlfQ0hFQ0tfUEFTUyk7CisgICAgICAgIHVwZGF0ZV9zdXBlcmJsb2Nrc19hbmRfYmdfZGVzYyhmZCwgU1RBVEVfVU5TRVQpOworICAgICAgICB2ZXJib3NlID0gdl9mbGFnOworICAgICAgICBub193cml0ZSA9IG5fZmxhZzsKKworICAgICAgICBzZXRfZnNfZml4dXBfc3RhdGUoZmQsIFNUQVRFX01BUktJTkdfSU5VTVMpOworICAgIH0KKworICAgIGlmIChnZXRfZnNfZml4dXBfc3RhdGUoZmQpID09IFNUQVRFX01BUktJTkdfSU5VTVMpIHsKKyAgICAgICAgY291bnQgPSAwOyAvKiBSZXNldCBkZWJ1Z2dpbmcgY291bnRlciAqLworICAgICAgICBpZiAoIXJlY3Vyc2VfZGlyKGZkLCAmcm9vdF9pbm9kZSwgZGlyYnVmLCBkaXJzaXplLCBNQVJLX0lOT0RFX05VTVMpKSB7CisgICAgICAgICAgICBzZXRfZnNfZml4dXBfc3RhdGUoZmQsIFNUQVRFX1VQREFUSU5HX0lOVU1TKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfZnNfZml4dXBfc3RhdGUoZmQpID09IFNUQVRFX1VQREFUSU5HX0lOVU1TKSB7CisgICAgICAgIGNvdW50ID0gMDsgLyogUmVzZXQgZGVidWdnaW5nIGNvdW50ZXIgKi8KKyAgICAgICAgaWYgKCFyZWN1cnNlX2RpcihmZCwgJnJvb3RfaW5vZGUsIGRpcmJ1ZiwgZGlyc2l6ZSwgVVBEQVRFX0lOT0RFX05VTVMpKSB7CisgICAgICAgICAgICBzZXRfZnNfZml4dXBfc3RhdGUoZmQsIFNUQVRFX1VQREFUSU5HX1NCKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfZnNfZml4dXBfc3RhdGUoZmQpID09IFNUQVRFX1VQREFUSU5HX1NCKSB7CisgICAgICAgIC8qIHNldCB0aGUgbmV3IGlub2Rlcy9ibG9ja2dyb3VwIG51bWJlciwKKyAgICAgICAgICogYW5kIHNldHMgdGhlIHN0YXRlIGJhY2sgdG8gMC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghdXBkYXRlX3N1cGVyYmxvY2tzX2FuZF9iZ19kZXNjKGZkLCBTVEFURV9VUERBVElOR19TQikpIHsKKyAgICAgICAgICAgIHNldF9mc19maXh1cF9zdGF0ZShmZCwgU1RBVEVfVU5TRVQpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dDRmaXh1cC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0Zml4dXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWEyMTEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0Zml4dXAuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW50IGV4dDRmaXh1cChjaGFyICpmc2Rldik7CitpbnQgZXh0NGZpeHVwX2ludGVybmFsKGNoYXIgKmZzZGV2LCBpbnQgdl9mbGFnLCBpbnQgbl9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcF9waGFzZSwgaW50IHN0b3BfbG9jLCBpbnQgc3RvcF9jb3VudCk7CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NGZpeHVwX21haW4uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0NGZpeHVwX21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2M3ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHQ0Zml4dXBfbWFpbi5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJleHQ0Zml4dXAuaCIKKworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqbWUpCit7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogdXNhZ2U6ICVzIFstdm5dIDxpbWFnZSBvciBibG9jayBkZXZpY2U+XG4iLCBtZSwgbWUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IG9wdDsKKyAgICBpbnQgdmVyYm9zZSA9IDA7CisgICAgaW50IG5vX3dyaXRlID0gMDsKKyAgICBjaGFyICpmc2RldjsKKyAgICBjaGFyICptZTsKKyAgICBpbnQgc3RvcF9waGFzZSA9IDAsIHN0b3BfbG9jID0gMCwgc3RvcF9jb3VudCA9IDA7CisKKyAgICBtZSA9IGJhc2VuYW1lKGFyZ3ZbMF0pOworCisgICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInZuZDoiKSkgIT0gLTEpIHsKKyAgICAgICAgc3dpdGNoIChvcHQpIHsKKyAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB2ZXJib3NlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIG5vX3dyaXRlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIHNzY2FuZihvcHRhcmcsICIlZCwlZCwlZCIsICZzdG9wX3BoYXNlLCAmc3RvcF9sb2MsICZzdG9wX2NvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA+PSBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXhwZWN0ZWQgaW1hZ2Ugb3IgYmxvY2sgZGV2aWNlIGFmdGVyIG9wdGlvbnNcbiIpOworICAgICAgICB1c2FnZShtZSk7CisgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgICBmc2RldiA9IGFyZ3Zbb3B0aW5kKytdOworCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIGFyZ3VtZW50OiAlc1xuIiwgYXJndltvcHRpbmRdKTsKKyAgICAgICAgdXNhZ2UobWUpOworICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorCisgICAgcmV0dXJuIGV4dDRmaXh1cF9pbnRlcm5hbChmc2RldiwgdmVyYm9zZSwgbm9fd3JpdGUsIHN0b3BfcGhhc2UsIHN0b3BfbG9jLCBzdG9wX2NvdW50KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvZXh0ZW50LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dGVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjMwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dGVudC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJleHRlbnQuaCIKKworI2luY2x1ZGUgPHNwYXJzZS9zcGFyc2UuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworCisvKiBDcmVhdGVzIGRhdGEgYnVmZmVycyBmb3IgdGhlIGZpcnN0IGJhY2tpbmdfbGVuIGJ5dGVzIG9mIGEgYmxvY2sgYWxsb2NhdGlvbgorICAgYW5kIHF1ZXVlcyB0aGVtIHRvIGJlIHdyaXR0ZW4gKi8KK3N0YXRpYyB1OCAqZXh0ZW50X2NyZWF0ZV9iYWNraW5nKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywKKwl1NjQgYmFja2luZ19sZW4pCit7CisJdTggKmRhdGEgPSBjYWxsb2MoYmFja2luZ19sZW4sIDEpOworCWlmICghZGF0YSkKKwkJY3JpdGljYWxfZXJyb3JfZXJybm8oImNhbGxvYyIpOworCisJdTggKnB0ciA9IGRhdGE7CisJZm9yICg7IGFsbG9jICE9IE5VTEwgJiYgYmFja2luZ19sZW4gPiAwOyBnZXRfbmV4dF9yZWdpb24oYWxsb2MpKSB7CisJCXUzMiByZWdpb25fYmxvY2s7CisJCXUzMiByZWdpb25fbGVuOworCQl1MzIgbGVuOworCQlnZXRfcmVnaW9uKGFsbG9jLCAmcmVnaW9uX2Jsb2NrLCAmcmVnaW9uX2xlbik7CisKKwkJbGVuID0gbWluKHJlZ2lvbl9sZW4gKiBpbmZvLmJsb2NrX3NpemUsIGJhY2tpbmdfbGVuKTsKKworCQlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBwdHIsIGxlbiwgcmVnaW9uX2Jsb2NrKTsKKwkJcHRyICs9IGxlbjsKKwkJYmFja2luZ19sZW4gLT0gbGVuOworCX0KKworCXJldHVybiBkYXRhOworfQorCisvKiBRdWV1ZXMgZWFjaCBjaHVuayBvZiBhIGZpbGUgdG8gYmUgd3JpdHRlbiB0byBjb250aWd1b3VzIGRhdGEgYmxvY2sKKyAgIHJlZ2lvbnMgKi8KK3N0YXRpYyB2b2lkIGV4dGVudF9jcmVhdGVfYmFja2luZ19maWxlKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywKKwl1NjQgYmFja2luZ19sZW4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCW9mZjY0X3Qgb2Zmc2V0ID0gMDsKKwlmb3IgKDsgYWxsb2MgIT0gTlVMTCAmJiBiYWNraW5nX2xlbiA+IDA7IGdldF9uZXh0X3JlZ2lvbihhbGxvYykpIHsKKwkJdTMyIHJlZ2lvbl9ibG9jazsKKwkJdTMyIHJlZ2lvbl9sZW47CisJCXUzMiBsZW47CisJCWdldF9yZWdpb24oYWxsb2MsICZyZWdpb25fYmxvY2ssICZyZWdpb25fbGVuKTsKKworCQlsZW4gPSBtaW4ocmVnaW9uX2xlbiAqIGluZm8uYmxvY2tfc2l6ZSwgYmFja2luZ19sZW4pOworCisJCXNwYXJzZV9maWxlX2FkZF9maWxlKGV4dDRfc3BhcnNlX2ZpbGUsIGZpbGVuYW1lLCBvZmZzZXQsIGxlbiwKKwkJCQlyZWdpb25fYmxvY2spOworCQlvZmZzZXQgKz0gbGVuOworCQliYWNraW5nX2xlbiAtPSBsZW47CisJfQorfQorCitzdGF0aWMgc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmRvX2lub2RlX2FsbG9jYXRlX2V4dGVudHMoCisJc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLCB1NjQgbGVuKQoreworCXUzMiBibG9ja19sZW4gPSBESVZfUk9VTkRfVVAobGVuLCBpbmZvLmJsb2NrX3NpemUpOworCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYyA9IGFsbG9jYXRlX2Jsb2NrcyhibG9ja19sZW4gKyAxKTsKKwl1MzIgZXh0ZW50X2Jsb2NrID0gMDsKKwl1MzIgZmlsZV9ibG9jayA9IDA7CisJc3RydWN0IGV4dDRfZXh0ZW50ICpleHRlbnQ7CisJdTY0IGJsb2NrczsKKworCWlmIChhbGxvYyA9PSBOVUxMKSB7CisJCWVycm9yKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYmxvY2tzXG4iLCBibG9ja19sZW4gKyAxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW50IGFsbG9jYXRpb25fbGVuID0gYmxvY2tfYWxsb2NhdGlvbl9udW1fcmVnaW9ucyhhbGxvYyk7CisJaWYgKGFsbG9jYXRpb25fbGVuIDw9IDMpIHsKKwkJcmVkdWNlX2FsbG9jYXRpb24oYWxsb2MsIDEpOworCX0gZWxzZSB7CisJCXJlc2VydmVfb29iX2Jsb2NrcyhhbGxvYywgMSk7CisJCWV4dGVudF9ibG9jayA9IGdldF9vb2JfYmxvY2soYWxsb2MsIDApOworCX0KKworCWlmICghZXh0ZW50X2Jsb2NrKSB7CisJCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmhkciA9CisJCQkoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKSZpbm9kZS0+aV9ibG9ja1swXTsKKwkJaGRyLT5laF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDOworCQloZHItPmVoX2VudHJpZXMgPSBhbGxvY2F0aW9uX2xlbjsKKwkJaGRyLT5laF9tYXggPSAzOworCQloZHItPmVoX2dlbmVyYXRpb24gPSAwOworCQloZHItPmVoX2RlcHRoID0gMDsKKworCQlleHRlbnQgPSAoc3RydWN0IGV4dDRfZXh0ZW50ICopJmlub2RlLT5pX2Jsb2NrWzNdOworCX0gZWxzZSB7CisJCXN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIgKmhkciA9CisJCQkoc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqKSZpbm9kZS0+aV9ibG9ja1swXTsKKwkJaGRyLT5laF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDOworCQloZHItPmVoX2VudHJpZXMgPSAxOworCQloZHItPmVoX21heCA9IDM7CisJCWhkci0+ZWhfZ2VuZXJhdGlvbiA9IDA7CisJCWhkci0+ZWhfZGVwdGggPSAxOworCisJCXN0cnVjdCBleHQ0X2V4dGVudF9pZHggKmlkeCA9CisJCQkoc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqKSZpbm9kZS0+aV9ibG9ja1szXTsKKwkJaWR4LT5laV9ibG9jayA9IDA7CisJCWlkeC0+ZWlfbGVhZl9sbyA9IGV4dGVudF9ibG9jazsKKwkJaWR4LT5laV9sZWFmX2hpID0gMDsKKwkJaWR4LT5laV91bnVzZWQgPSAwOworCisJCXU4ICpkYXRhID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJCWlmICghZGF0YSkKKwkJCWNyaXRpY2FsX2Vycm9yX2Vycm5vKCJjYWxsb2MiKTsKKworCQlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBkYXRhLCBpbmZvLmJsb2NrX3NpemUsCisJCQkJZXh0ZW50X2Jsb2NrKTsKKworCQlpZiAoKChpbnQpKGluZm8uYmxvY2tfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKSAvCisJCQkJc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudCkpKSA8IGFsbG9jYXRpb25fbGVuKSB7CisJCQllcnJvcigiRmlsZSBzaXplICUiUFJJdTY0IiBpcyB0b28gYmlnIHRvIGZpdCBpbiBhIHNpbmdsZSBleHRlbnQgYmxvY2tcbiIsCisJCQkJCWxlbik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWhkciA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopZGF0YTsKKwkJaGRyLT5laF9tYWdpYyA9IEVYVDRfRVhUX01BR0lDOworCQloZHItPmVoX2VudHJpZXMgPSBhbGxvY2F0aW9uX2xlbjsKKwkJaGRyLT5laF9tYXggPSAoaW5mby5ibG9ja19zaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2V4dGVudF9oZWFkZXIpKSAvCisJCQlzaXplb2Yoc3RydWN0IGV4dDRfZXh0ZW50KTsKKwkJaGRyLT5laF9nZW5lcmF0aW9uID0gMDsKKwkJaGRyLT5laF9kZXB0aCA9IDA7CisKKwkJZXh0ZW50ID0gKHN0cnVjdCBleHQ0X2V4dGVudCAqKShkYXRhICsKKwkJCXNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyKSk7CisJfQorCisJZm9yICg7ICFsYXN0X3JlZ2lvbihhbGxvYyk7IGV4dGVudCsrLCBnZXRfbmV4dF9yZWdpb24oYWxsb2MpKSB7CisJCXUzMiByZWdpb25fYmxvY2s7CisJCXUzMiByZWdpb25fbGVuOworCisJCWdldF9yZWdpb24oYWxsb2MsICZyZWdpb25fYmxvY2ssICZyZWdpb25fbGVuKTsKKwkJZXh0ZW50LT5lZV9ibG9jayA9IGZpbGVfYmxvY2s7CisJCWV4dGVudC0+ZWVfbGVuID0gcmVnaW9uX2xlbjsKKwkJZXh0ZW50LT5lZV9zdGFydF9oaSA9IDA7CisJCWV4dGVudC0+ZWVfc3RhcnRfbG8gPSByZWdpb25fYmxvY2s7CisJCWZpbGVfYmxvY2sgKz0gcmVnaW9uX2xlbjsKKwl9CisKKwlpZiAoZXh0ZW50X2Jsb2NrKQorCQlibG9ja19sZW4gKz0gMTsKKworCWJsb2NrcyA9ICh1NjQpYmxvY2tfbGVuICogaW5mby5ibG9ja19zaXplIC8gNTEyOworCisJaW5vZGUtPmlfZmxhZ3MgfD0gRVhUNF9FWFRFTlRTX0ZMOworCWlub2RlLT5pX3NpemVfbG8gPSBsZW47CisJaW5vZGUtPmlfc2l6ZV9oaWdoID0gbGVuID4+IDMyOworCWlub2RlLT5pX2Jsb2Nrc19sbyA9IGJsb2NrczsKKwlpbm9kZS0+b3NkMi5saW51eDIubF9pX2Jsb2Nrc19oaWdoID0gYmxvY2tzID4+IDMyOworCisJcmV3aW5kX2FsbG9jKGFsbG9jKTsKKworCXJldHVybiBhbGxvYzsKK30KKworLyogQWxsb2NhdGVzIGVub3VnaCBibG9ja3MgdG8gaG9sZCBsZW4gYnl0ZXMsIHdpdGggYmFja2luZ19sZW4gYnl0ZXMgaW4gYSBkYXRhCisgICBidWZmZXIsIGFuZCBjb25uZWN0cyB0aGVtIHRvIGFuIGlub2RlLiAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEKKyAgIGJ1ZmZlci4gKi8KK3U4ICppbm9kZV9hbGxvY2F0ZV9kYXRhX2V4dGVudHMoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLCB1NjQgbGVuLAorCXU2NCBiYWNraW5nX2xlbikKK3sKKwlzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2M7CisJdTggKmRhdGEgPSBOVUxMOworCisJYWxsb2MgPSBkb19pbm9kZV9hbGxvY2F0ZV9leHRlbnRzKGlub2RlLCBsZW4pOworCWlmIChhbGxvYyA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgZXh0ZW50cyBmb3IgJSJQUkl1NjQiIGJ5dGVzIiwgbGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGJhY2tpbmdfbGVuKSB7CisJCWRhdGEgPSBleHRlbnRfY3JlYXRlX2JhY2tpbmcoYWxsb2MsIGJhY2tpbmdfbGVuKTsKKwkJaWYgKCFkYXRhKQorCQkJZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgYmFja2luZyBmb3IgJSJQUkl1NjQiIGJ5dGVzIiwgYmFja2luZ19sZW4pOworCX0KKworCWZyZWVfYWxsb2MoYWxsb2MpOworCisJcmV0dXJuIGRhdGE7Cit9CisKKy8qIEFsbG9jYXRlcyBlbm91Z2ggYmxvY2tzIHRvIGhvbGQgbGVuIGJ5dGVzLCBxdWV1ZXMgdGhlbSB0byBiZSB3cml0dGVuCisgICBmcm9tIGEgZmlsZSwgYW5kIGNvbm5lY3RzIHRoZW0gdG8gYW4gaW5vZGUuICovCit2b2lkIGlub2RlX2FsbG9jYXRlX2ZpbGVfZXh0ZW50cyhzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIHU2NCBsZW4sCisJY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jOworCisJYWxsb2MgPSBkb19pbm9kZV9hbGxvY2F0ZV9leHRlbnRzKGlub2RlLCBsZW4pOworCWlmIChhbGxvYyA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgZXh0ZW50cyBmb3IgJSJQUkl1NjQiIGJ5dGVzIiwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWV4dGVudF9jcmVhdGVfYmFja2luZ19maWxlKGFsbG9jLCBsZW4sIGZpbGVuYW1lKTsKKworCWZyZWVfYWxsb2MoYWxsb2MpOworfQorCisvKiBBbGxvY2F0ZXMgZW5vdWdoIGJsb2NrcyB0byBob2xkIGxlbiBieXRlcyBhbmQgY29ubmVjdHMgdGhlbSB0byBhbiBpbm9kZSAqLwordm9pZCBpbm9kZV9hbGxvY2F0ZV9leHRlbnRzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdTY0IGxlbikKK3sKKwlzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2M7CisKKwlhbGxvYyA9IGRvX2lub2RlX2FsbG9jYXRlX2V4dGVudHMoaW5vZGUsIGxlbik7CisJaWYgKGFsbG9jID09IE5VTEwpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBleHRlbnRzIGZvciAlIlBSSXU2NCIgYnl0ZXMiLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJZnJlZV9hbGxvYyhhbGxvYyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2V4dGVudC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWRkZWIxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9leHRlbnQuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfRVhURU5UX0hfCisjZGVmaW5lIF9FWFRFTlRfSF8KKworI2luY2x1ZGUgImFsbG9jYXRlLmgiCisjaW5jbHVkZSAiZXh0NF91dGlscy5oIgorCit2b2lkIGlub2RlX2FsbG9jYXRlX2V4dGVudHMoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLCB1NjQgbGVuKTsKK3ZvaWQgaW5vZGVfYWxsb2NhdGVfZmlsZV9leHRlbnRzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdTY0IGxlbiwKKwljb25zdCBjaGFyICpmaWxlbmFtZSk7Cit1OCAqaW5vZGVfYWxsb2NhdGVfZGF0YV9leHRlbnRzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdTY0IGxlbiwKKwl1NjQgYmFja2luZ19sZW4pOwordm9pZCBmcmVlX2V4dGVudF9ibG9ja3MoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2luZGlyZWN0LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2luZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4NWE0MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvaW5kaXJlY3QuYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQ0X3V0aWxzLmgiCisjaW5jbHVkZSAiaW5kaXJlY3QuaCIKKyNpbmNsdWRlICJhbGxvY2F0ZS5oIgorCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogQ3JlYXRlcyBkYXRhIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBiYWNraW5nX2xlbiBieXRlcyBvZiBhIGJsb2NrIGFsbG9jYXRpb24KKyAgIGFuZCBxdWV1ZXMgdGhlbSB0byBiZSB3cml0dGVuICovCitzdGF0aWMgdTggKmNyZWF0ZV9iYWNraW5nKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywKKwkJdW5zaWduZWQgbG9uZyBiYWNraW5nX2xlbikKK3sKKwlpZiAoRElWX1JPVU5EX1VQKGJhY2tpbmdfbGVuLCBpbmZvLmJsb2NrX3NpemUpID4gRVhUNF9ORElSX0JMT0NLUykKKwkJY3JpdGljYWxfZXJyb3IoImluZGlyZWN0IGJhY2tpbmcgbGFyZ2VyIHRoYW4gJWQgYmxvY2tzIiwgRVhUNF9ORElSX0JMT0NLUyk7CisKKwl1OCAqZGF0YSA9IGNhbGxvYyhiYWNraW5nX2xlbiwgMSk7CisJaWYgKCFkYXRhKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiY2FsbG9jIik7CisKKwl1OCAqcHRyID0gZGF0YTsKKwlmb3IgKDsgYWxsb2MgIT0gTlVMTCAmJiBiYWNraW5nX2xlbiA+IDA7IGdldF9uZXh0X3JlZ2lvbihhbGxvYykpIHsKKwkJdTMyIHJlZ2lvbl9ibG9jazsKKwkJdTMyIHJlZ2lvbl9sZW47CisJCXUzMiBsZW47CisJCWdldF9yZWdpb24oYWxsb2MsICZyZWdpb25fYmxvY2ssICZyZWdpb25fbGVuKTsKKworCQlsZW4gPSBtaW4ocmVnaW9uX2xlbiAqIGluZm8uYmxvY2tfc2l6ZSwgYmFja2luZ19sZW4pOworCisJCXNwYXJzZV9maWxlX2FkZF9kYXRhKGV4dDRfc3BhcnNlX2ZpbGUsIHB0ciwgbGVuLCByZWdpb25fYmxvY2spOworCQlwdHIgKz0gbGVuOworCQliYWNraW5nX2xlbiAtPSBsZW47CisJfQorCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2VydmVfaW5kaXJlY3RfYmxvY2soc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCBpbnQgbGVuKQoreworCWlmIChyZXNlcnZlX29vYl9ibG9ja3MoYWxsb2MsIDEpKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gcmVzZXJ2ZSBvb2IgYmxvY2siKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhZHZhbmNlX2Jsb2NrcyhhbGxvYywgbGVuKSkgeworCQllcnJvcigiZmFpbGVkIHRvIGFkdmFuY2UgJWQgYmxvY2tzIiwgbGVuKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXJ2ZV9kaW5kaXJlY3RfYmxvY2soc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCBpbnQgbGVuKQoreworCWlmIChyZXNlcnZlX29vYl9ibG9ja3MoYWxsb2MsIDEpKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gcmVzZXJ2ZSBvb2IgYmxvY2siKTsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWludCBpbmRfYmxvY2tfbGVuID0gbWluKChpbnQpYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQsIGxlbik7CisKKwkJcmVzZXJ2ZV9pbmRpcmVjdF9ibG9jayhhbGxvYywgaW5kX2Jsb2NrX2xlbik7CisKKwkJbGVuIC09IGluZF9ibG9ja19sZW47CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJlc2VydmVfdGluZGlyZWN0X2Jsb2NrKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgaW50IGxlbikKK3sKKwlpZiAocmVzZXJ2ZV9vb2JfYmxvY2tzKGFsbG9jLCAxKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHJlc2VydmUgb29iIGJsb2NrIik7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAobGVuID4gMCkgeworCQlpbnQgZGluZF9ibG9ja19sZW4gPSBtaW4oKGludClhdXhfaW5mby5ibG9ja3NfcGVyX2RpbmQsIGxlbik7CisKKwkJcmVzZXJ2ZV9kaW5kaXJlY3RfYmxvY2soYWxsb2MsIGRpbmRfYmxvY2tfbGVuKTsKKworCQlsZW4gLT0gZGluZF9ibG9ja19sZW47CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2luZGlyZWN0X2Jsb2NrKHUzMiAqaW5kX2Jsb2NrLCBpbnQgbGVuLCBzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWluZF9ibG9ja1tpXSA9IGdldF9ibG9jayhhbGxvYywgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX2RpbmRpcmVjdF9ibG9jayh1MzIgKmRpbmRfYmxvY2ssIGludCBsZW4sIHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYykKK3sKKwlpbnQgaTsKKwl1MzIgaW5kX2Jsb2NrOworCisJZm9yIChpID0gMDsgbGVuID4gIDA7IGkrKykgeworCQlpbmRfYmxvY2sgPSBnZXRfb29iX2Jsb2NrKGFsbG9jLCAwKTsKKwkJaWYgKGFkdmFuY2Vfb29iX2Jsb2NrcyhhbGxvYywgMSkpIHsKKwkJCWVycm9yKCJmYWlsZWQgdG8gcmVzZXJ2ZSBvb2IgYmxvY2siKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRpbmRfYmxvY2tbaV0gPSBpbmRfYmxvY2s7CisKKwkJdTMyICppbmRfYmxvY2tfZGF0YSA9IGNhbGxvYyhpbmZvLmJsb2NrX3NpemUsIDEpOworCQlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBpbmRfYmxvY2tfZGF0YSwgaW5mby5ibG9ja19zaXplLAorCQkJCWluZF9ibG9jayk7CisJCWludCBpbmRfYmxvY2tfbGVuID0gbWluKChpbnQpYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQsIGxlbik7CisKKwkJZmlsbF9pbmRpcmVjdF9ibG9jayhpbmRfYmxvY2tfZGF0YSwgaW5kX2Jsb2NrX2xlbiwgYWxsb2MpOworCisJCWlmIChhZHZhbmNlX2Jsb2NrcyhhbGxvYywgaW5kX2Jsb2NrX2xlbikpIHsKKwkJCWVycm9yKCJmYWlsZWQgdG8gYWR2YW5jZSAlZCBibG9ja3MiLCBpbmRfYmxvY2tfbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWxlbiAtPSBpbmRfYmxvY2tfbGVuOworCX0KK30KKworc3RhdGljIHZvaWQgZmlsbF90aW5kaXJlY3RfYmxvY2sodTMyICp0aW5kX2Jsb2NrLCBpbnQgbGVuLCBzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpCit7CisJaW50IGk7CisJdTMyIGRpbmRfYmxvY2s7CisKKwlmb3IgKGkgPSAwOyBsZW4gPiAwOyBpKyspIHsKKwkJZGluZF9ibG9jayA9IGdldF9vb2JfYmxvY2soYWxsb2MsIDApOworCQlpZiAoYWR2YW5jZV9vb2JfYmxvY2tzKGFsbG9jLCAxKSkgeworCQkJZXJyb3IoImZhaWxlZCB0byByZXNlcnZlIG9vYiBibG9jayIpOworCQkJcmV0dXJuOworCQl9CisKKwkJdGluZF9ibG9ja1tpXSA9IGRpbmRfYmxvY2s7CisKKwkJdTMyICpkaW5kX2Jsb2NrX2RhdGEgPSBjYWxsb2MoaW5mby5ibG9ja19zaXplLCAxKTsKKwkJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgZGluZF9ibG9ja19kYXRhLCBpbmZvLmJsb2NrX3NpemUsCisJCQkJZGluZF9ibG9jayk7CisJCWludCBkaW5kX2Jsb2NrX2xlbiA9IG1pbigoaW50KWF1eF9pbmZvLmJsb2Nrc19wZXJfZGluZCwgbGVuKTsKKworCQlmaWxsX2RpbmRpcmVjdF9ibG9jayhkaW5kX2Jsb2NrX2RhdGEsIGRpbmRfYmxvY2tfbGVuLCBhbGxvYyk7CisKKwkJbGVuIC09IGRpbmRfYmxvY2tfbGVuOworCX0KK30KKworLyogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgYXR0YWNoIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlIHRvIGRpcmVjdCBpbm9kZQorICAgYmxvY2tzLCBhbmQgcmV0dXJuIHRoZSByZXN0ICovCitzdGF0aWMgaW50IGlub2RlX2F0dGFjaF9kaXJlY3RfYmxvY2tzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwKKwkJc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCB1MzIgKmJsb2NrX2xlbikKK3sKKwlpbnQgbGVuID0gbWluKCpibG9ja19sZW4sIEVYVDRfTkRJUl9CTE9DS1MpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlub2RlLT5pX2Jsb2NrW2ldID0gZ2V0X2Jsb2NrKGFsbG9jLCBpKTsKKwl9CisKKwlpZiAoYWR2YW5jZV9ibG9ja3MoYWxsb2MsIGxlbikpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhZHZhbmNlICVkIGJsb2NrcyIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqYmxvY2tfbGVuIC09IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgYXR0YWNoIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlIHRvIGluZGlyZWN0IGJsb2NrcywKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3QKKyAgIEFzc3VtZXMgdGhhdCB0aGUgYmxvY2tzIG5lY2Vzc2FyeSB0byBob2xkIHRoZSBpbmRpcmVjdCBibG9ja3Mgd2VyZSBpbmNsdWRlZAorICAgYXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiAqLworc3RhdGljIGludCBpbm9kZV9hdHRhY2hfaW5kaXJlY3RfYmxvY2tzKHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwKKwkJc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jLCB1MzIgKmJsb2NrX2xlbikKK3sKKwlpbnQgbGVuID0gbWluKCpibG9ja19sZW4sIGF1eF9pbmZvLmJsb2Nrc19wZXJfaW5kKTsKKworCWludCBpbmRfYmxvY2sgPSBnZXRfb29iX2Jsb2NrKGFsbG9jLCAwKTsKKwlpbm9kZS0+aV9ibG9ja1tFWFQ0X0lORF9CTE9DS10gPSBpbmRfYmxvY2s7CisKKwlpZiAoYWR2YW5jZV9vb2JfYmxvY2tzKGFsbG9jLCAxKSkgeworCQllcnJvcigiZmFpbGVkIHRvIGFkdmFuY2Ugb29iIGJsb2NrIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl1MzIgKmluZF9ibG9ja19kYXRhID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgaW5kX2Jsb2NrX2RhdGEsIGluZm8uYmxvY2tfc2l6ZSwKKwkJCWluZF9ibG9jayk7CisKKwlmaWxsX2luZGlyZWN0X2Jsb2NrKGluZF9ibG9ja19kYXRhLCBsZW4sIGFsbG9jKTsKKworCWlmIChhZHZhbmNlX2Jsb2NrcyhhbGxvYywgbGVuKSkgeworCQllcnJvcigiZmFpbGVkIHRvIGFkdmFuY2UgJWQgYmxvY2tzIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSpibG9ja19sZW4gLT0gbGVuOworCXJldHVybiAwOworfQorCisvKiBHaXZlbiBhbiBhbGxvY2F0aW9uLCBhdHRhY2ggYXMgbWFueSBibG9ja3MgYXMgcG9zc2libGUgdG8gZG91Ymx5IGluZGlyZWN0CisgICBibG9ja3MsIGFuZCByZXR1cm4gdGhlIHJlc3QuCisgICBBc3N1bWVzIHRoYXQgdGhlIGJsb2NrcyBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgaW5kaXJlY3QgYW5kIGRvdWJseSBpbmRpcmVjdAorICAgYmxvY2tzIHdlcmUgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiAqLworc3RhdGljIGludCBpbm9kZV9hdHRhY2hfZGluZGlyZWN0X2Jsb2NrcyhzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyICpibG9ja19sZW4pCit7CisJaW50IGxlbiA9IG1pbigqYmxvY2tfbGVuLCBhdXhfaW5mby5ibG9ja3NfcGVyX2RpbmQpOworCisJaW50IGRpbmRfYmxvY2sgPSBnZXRfb29iX2Jsb2NrKGFsbG9jLCAwKTsKKwlpbm9kZS0+aV9ibG9ja1tFWFQ0X0RJTkRfQkxPQ0tdID0gZGluZF9ibG9jazsKKworCWlmIChhZHZhbmNlX29vYl9ibG9ja3MoYWxsb2MsIDEpKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWR2YW5jZSBvb2IgYmxvY2siKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXUzMiAqZGluZF9ibG9ja19kYXRhID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgZGluZF9ibG9ja19kYXRhLCBpbmZvLmJsb2NrX3NpemUsCisJCQlkaW5kX2Jsb2NrKTsKKworCWZpbGxfZGluZGlyZWN0X2Jsb2NrKGRpbmRfYmxvY2tfZGF0YSwgbGVuLCBhbGxvYyk7CisKKwlpZiAoYWR2YW5jZV9ibG9ja3MoYWxsb2MsIGxlbikpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhZHZhbmNlICVkIGJsb2NrcyIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqYmxvY2tfbGVuIC09IGxlbjsKKwlyZXR1cm4gMDsKK30KKworLyogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgYXR0YWNoIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlIHRvIHRyaXBseSBpbmRpcmVjdAorICAgYmxvY2tzLCBhbmQgcmV0dXJuIHRoZSByZXN0LgorICAgQXNzdW1lcyB0aGF0IHRoZSBibG9ja3MgbmVjZXNzYXJ5IHRvIGhvbGQgdGhlIGluZGlyZWN0LCBkb3VibHkgaW5kaXJlY3QgYW5kCisgICB0cmlwbHkgaW5kaXJlY3QgYmxvY2tzIHdlcmUgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgYWxsb2NhdGlvbiAqLworc3RhdGljIGludCBpbm9kZV9hdHRhY2hfdGluZGlyZWN0X2Jsb2NrcyhzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyICpibG9ja19sZW4pCit7CisJaW50IGxlbiA9IG1pbigqYmxvY2tfbGVuLCBhdXhfaW5mby5ibG9ja3NfcGVyX3RpbmQpOworCisJaW50IHRpbmRfYmxvY2sgPSBnZXRfb29iX2Jsb2NrKGFsbG9jLCAwKTsKKwlpbm9kZS0+aV9ibG9ja1tFWFQ0X1RJTkRfQkxPQ0tdID0gdGluZF9ibG9jazsKKworCWlmIChhZHZhbmNlX29vYl9ibG9ja3MoYWxsb2MsIDEpKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWR2YW5jZSBvb2IgYmxvY2siKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXUzMiAqdGluZF9ibG9ja19kYXRhID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgdGluZF9ibG9ja19kYXRhLCBpbmZvLmJsb2NrX3NpemUsCisJCQl0aW5kX2Jsb2NrKTsKKworCWZpbGxfdGluZGlyZWN0X2Jsb2NrKHRpbmRfYmxvY2tfZGF0YSwgbGVuLCBhbGxvYyk7CisKKwlpZiAoYWR2YW5jZV9ibG9ja3MoYWxsb2MsIGxlbikpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhZHZhbmNlICVkIGJsb2NrcyIsIGxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqYmxvY2tfbGVuIC09IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVzZXJ2ZV9hbGxfaW5kaXJlY3RfYmxvY2tzKHN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyIGxlbikKK3sKKwlpZiAobGVuIDw9IEVYVDRfTkRJUl9CTE9DS1MpCisJCXJldHVybjsKKworCWxlbiAtPSBFWFQ0X05ESVJfQkxPQ0tTOworCWFkdmFuY2VfYmxvY2tzKGFsbG9jLCBFWFQ0X05ESVJfQkxPQ0tTKTsKKworCXUzMiBpbmRfYmxvY2tfbGVuID0gbWluKGF1eF9pbmZvLmJsb2Nrc19wZXJfaW5kLCBsZW4pOworCXJlc2VydmVfaW5kaXJlY3RfYmxvY2soYWxsb2MsIGluZF9ibG9ja19sZW4pOworCisJbGVuIC09IGluZF9ibG9ja19sZW47CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwl1MzIgZGluZF9ibG9ja19sZW4gPSBtaW4oYXV4X2luZm8uYmxvY2tzX3Blcl9kaW5kLCBsZW4pOworCXJlc2VydmVfZGluZGlyZWN0X2Jsb2NrKGFsbG9jLCBkaW5kX2Jsb2NrX2xlbik7CisKKwlsZW4gLT0gZGluZF9ibG9ja19sZW47CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwl1MzIgdGluZF9ibG9ja19sZW4gPSBtaW4oYXV4X2luZm8uYmxvY2tzX3Blcl90aW5kLCBsZW4pOworCXJlc2VydmVfdGluZGlyZWN0X2Jsb2NrKGFsbG9jLCB0aW5kX2Jsb2NrX2xlbik7CisKKwlsZW4gLT0gdGluZF9ibG9ja19sZW47CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm47CisKKwllcnJvcigiJWQgYmxvY2tzIHJlbWFpbmluZyIsIGxlbik7Cit9CisKK3N0YXRpYyB1MzIgaW5kaXJlY3RfYmxvY2tzX25lZWRlZCh1MzIgbGVuKQoreworCXUzMiBpbmQgPSAwOworCisJaWYgKGxlbiA8PSBFWFQ0X05ESVJfQkxPQ0tTKQorCQlyZXR1cm4gaW5kOworCisJbGVuIC09IEVYVDRfTkRJUl9CTE9DS1M7CisKKwkvKiBXZSB3aWxsIG5lZWQgYW4gaW5kaXJlY3QgYmxvY2sgZm9yIHRoZSByZXN0IG9mIHRoZSBibG9ja3MgKi8KKwlpbmQgKz0gRElWX1JPVU5EX1VQKGxlbiwgYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQpOworCisJaWYgKGxlbiA8PSBhdXhfaW5mby5ibG9ja3NfcGVyX2luZCkKKwkJcmV0dXJuIGluZDsKKworCWxlbiAtPSBhdXhfaW5mby5ibG9ja3NfcGVyX2luZDsKKworCWluZCArPSBESVZfUk9VTkRfVVAobGVuLCBhdXhfaW5mby5ibG9ja3NfcGVyX2RpbmQpOworCisJaWYgKGxlbiA8PSBhdXhfaW5mby5ibG9ja3NfcGVyX2RpbmQpCisJCXJldHVybiBpbmQ7CisKKwlsZW4gLT0gYXV4X2luZm8uYmxvY2tzX3Blcl9kaW5kOworCisJaW5kICs9IERJVl9ST1VORF9VUChsZW4sIGF1eF9pbmZvLmJsb2Nrc19wZXJfdGluZCk7CisKKwlpZiAobGVuIDw9IGF1eF9pbmZvLmJsb2Nrc19wZXJfdGluZCkKKwkJcmV0dXJuIGluZDsKKworCWNyaXRpY2FsX2Vycm9yKCJyZXF1ZXN0IHRvbyBsYXJnZSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2lub2RlX2F0dGFjaF9pbmRpcmVjdChzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYywgdTMyIGJsb2NrX2xlbikKK3sKKwl1MzIgY291bnQgPSBibG9ja19sZW47CisKKwlpZiAoaW5vZGVfYXR0YWNoX2RpcmVjdF9ibG9ja3MoaW5vZGUsIGFsbG9jLCAmY291bnQpKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYXR0YWNoIGRpcmVjdCBibG9ja3MgdG8gaW5vZGUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjb3VudCA+IDApIHsKKwkJaWYgKGlub2RlX2F0dGFjaF9pbmRpcmVjdF9ibG9ja3MoaW5vZGUsIGFsbG9jLCAmY291bnQpKSB7CisJCQllcnJvcigiZmFpbGVkIHRvIGF0dGFjaCBpbmRpcmVjdCBibG9ja3MgdG8gaW5vZGUiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChjb3VudCA+IDApIHsKKwkJaWYgKGlub2RlX2F0dGFjaF9kaW5kaXJlY3RfYmxvY2tzKGlub2RlLCBhbGxvYywgJmNvdW50KSkgeworCQkJZXJyb3IoImZhaWxlZCB0byBhdHRhY2ggZGluZGlyZWN0IGJsb2NrcyB0byBpbm9kZSIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJaWYgKGNvdW50ID4gMCkgeworCQlpZiAoaW5vZGVfYXR0YWNoX3RpbmRpcmVjdF9ibG9ja3MoaW5vZGUsIGFsbG9jLCAmY291bnQpKSB7CisJCQllcnJvcigiZmFpbGVkIHRvIGF0dGFjaCB0aW5kaXJlY3QgYmxvY2tzIHRvIGlub2RlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoY291bnQpIHsKKwkJZXJyb3IoImJsb2NrcyBsZWZ0IGFmdGVyIHRyaXBseS1pbmRpcmVjdCBhbGxvY2F0aW9uIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXdpbmRfYWxsb2MoYWxsb2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqZG9faW5vZGVfYWxsb2NhdGVfaW5kaXJlY3QoCisJCXUzMiBibG9ja19sZW4pCit7CisJdTMyIGluZGlyZWN0X2xlbiA9IGluZGlyZWN0X2Jsb2Nrc19uZWVkZWQoYmxvY2tfbGVuKTsKKworCXN0cnVjdCBibG9ja19hbGxvY2F0aW9uICphbGxvYyA9IGFsbG9jYXRlX2Jsb2NrcyhibG9ja19sZW4gKyBpbmRpcmVjdF9sZW4pOworCisJaWYgKGFsbG9jID09IE5VTEwpIHsKKwkJZXJyb3IoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBibG9ja3MiLCBibG9ja19sZW4gKyBpbmRpcmVjdF9sZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYWxsb2M7Cit9CisKKy8qIEFsbG9jYXRlcyBlbm91Z2ggYmxvY2tzIHRvIGhvbGQgbGVuIGJ5dGVzIGFuZCBjb25uZWN0cyB0aGVtIHRvIGFuIGlub2RlICovCit2b2lkIGlub2RlX2FsbG9jYXRlX2luZGlyZWN0KHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJc3RydWN0IGJsb2NrX2FsbG9jYXRpb24gKmFsbG9jOworCXUzMiBibG9ja19sZW4gPSBESVZfUk9VTkRfVVAobGVuLCBpbmZvLmJsb2NrX3NpemUpOworCXUzMiBpbmRpcmVjdF9sZW4gPSBpbmRpcmVjdF9ibG9ja3NfbmVlZGVkKGJsb2NrX2xlbik7CisKKwlhbGxvYyA9IGRvX2lub2RlX2FsbG9jYXRlX2luZGlyZWN0KGJsb2NrX2xlbik7CisJaWYgKGFsbG9jID09IE5VTEwpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBhbGxvY2F0ZSBleHRlbnRzIGZvciAlbHUgYnl0ZXMiLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJcmVzZXJ2ZV9hbGxfaW5kaXJlY3RfYmxvY2tzKGFsbG9jLCBibG9ja19sZW4pOworCXJld2luZF9hbGxvYyhhbGxvYyk7CisKKwlpZiAoZG9faW5vZGVfYXR0YWNoX2luZGlyZWN0KGlub2RlLCBhbGxvYywgYmxvY2tfbGVuKSkKKwkJZXJyb3IoImZhaWxlZCB0byBhdHRhY2ggYmxvY2tzIHRvIGluZGlyZWN0IGlub2RlIik7CisKKwlpbm9kZS0+aV9mbGFncyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzX2xvID0gKGJsb2NrX2xlbiArIGluZGlyZWN0X2xlbikgKiBpbmZvLmJsb2NrX3NpemUgLyA1MTI7CisJaW5vZGUtPmlfc2l6ZV9sbyA9IGxlbjsKKworCWZyZWVfYWxsb2MoYWxsb2MpOworfQorCit2b2lkIGlub2RlX2F0dGFjaF9yZXNpemUoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpCit7CisJdTMyIGJsb2NrX2xlbiA9IGJsb2NrX2FsbG9jYXRpb25fbGVuKGFsbG9jKTsKKwl1MzIgc3VwZXJibG9ja3MgPSBibG9ja19sZW4gLyBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3M7CisJdTMyIGksIGo7CisJdTY0IGJsb2NrczsKKwl1NjQgc2l6ZTsKKworCWlmIChibG9ja19sZW4gJSBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3MpCisJCWNyaXRpY2FsX2Vycm9yKCJyZXNlcnZlZCBibG9ja3Mgbm90IGEgbXVsdGlwbGUgb2YgJWQiLAorCQkJCWluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2Nrcyk7CisKKwlhcHBlbmRfb29iX2FsbG9jYXRpb24oYWxsb2MsIDEpOworCXUzMiBkaW5kX2Jsb2NrID0gZ2V0X29vYl9ibG9jayhhbGxvYywgMCk7CisKKwl1MzIgKmRpbmRfYmxvY2tfZGF0YSA9IGNhbGxvYyhpbmZvLmJsb2NrX3NpemUsIDEpOworCWlmICghZGluZF9ibG9ja19kYXRhKQorCQljcml0aWNhbF9lcnJvcl9lcnJubygiY2FsbG9jIik7CisJc3BhcnNlX2ZpbGVfYWRkX2RhdGEoZXh0NF9zcGFyc2VfZmlsZSwgZGluZF9ibG9ja19kYXRhLCBpbmZvLmJsb2NrX3NpemUsCisJCQlkaW5kX2Jsb2NrKTsKKworCXUzMiAqaW5kX2Jsb2NrX2RhdGEgPSBjYWxsb2MoaW5mby5ibG9ja19zaXplLCBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3MpOworCWlmICghaW5kX2Jsb2NrX2RhdGEpCisJCWNyaXRpY2FsX2Vycm9yX2Vycm5vKCJjYWxsb2MiKTsKKwlzcGFyc2VfZmlsZV9hZGRfZGF0YShleHQ0X3NwYXJzZV9maWxlLCBpbmRfYmxvY2tfZGF0YSwKKwkJCWluZm8uYmxvY2tfc2l6ZSAqIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrcywKKwkJCWdldF9ibG9jayhhbGxvYywgMCkpOworCisJZm9yIChpID0gMDsgaSA8IGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrczsgaSsrKSB7CisJCWludCByID0gKGkgLSBhdXhfaW5mby5iZ19kZXNjX2Jsb2NrcykgJSBpbmZvLmJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3M7CisJCWlmIChyIDwgMCkKKwkJCXIgKz0gaW5mby5iZ19kZXNjX3Jlc2VydmVfYmxvY2tzOworCisJCWRpbmRfYmxvY2tfZGF0YVtpXSA9IGdldF9ibG9jayhhbGxvYywgcik7CisKKwkJZm9yIChqID0gMTsgaiA8IHN1cGVyYmxvY2tzOyBqKyspIHsKKwkJCXUzMiBiID0gaiAqIGluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrcyArIHI7CisJCQlpbmRfYmxvY2tfZGF0YVtyICogYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQgKyBqIC0gMV0gPSBnZXRfYmxvY2soYWxsb2MsIGIpOworCQl9CisJfQorCisJdTMyIGxhc3RfYmxvY2sgPSBFWFQ0X05ESVJfQkxPQ0tTICsgYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQgKworCQkJYXV4X2luZm8uYmxvY2tzX3Blcl9pbmQgKiAoaW5mby5iZ19kZXNjX3Jlc2VydmVfYmxvY2tzIC0gMSkgKworCQkJc3VwZXJibG9ja3MgLSAyOworCisJYmxvY2tzID0gKCh1NjQpYmxvY2tfbGVuICsgMSkgKiBpbmZvLmJsb2NrX3NpemUgLyA1MTI7CisJc2l6ZSA9ICh1NjQpbGFzdF9ibG9jayAqIGluZm8uYmxvY2tfc2l6ZTsKKworCWlub2RlLT5pX2Jsb2NrW0VYVDRfRElORF9CTE9DS10gPSBkaW5kX2Jsb2NrOworCWlub2RlLT5pX2ZsYWdzID0gMDsKKwlpbm9kZS0+aV9ibG9ja3NfbG8gPSBibG9ja3M7CisJaW5vZGUtPm9zZDIubGludXgyLmxfaV9ibG9ja3NfaGlnaCA9IGJsb2NrcyA+PiAzMjsKKwlpbm9kZS0+aV9zaXplX2xvID0gc2l6ZTsKKwlpbm9kZS0+aV9zaXplX2hpZ2ggPSBzaXplID4+IDMyOworfQorCisvKiBBbGxvY2F0ZXMgZW5vdWdoIGJsb2NrcyB0byBob2xkIGxlbiBieXRlcywgd2l0aCBiYWNraW5nX2xlbiBieXRlcyBpbiBhIGRhdGEKKyAgIGJ1ZmZlciwgYW5kIGNvbm5lY3RzIHRoZW0gdG8gYW4gaW5vZGUuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YQorICAgYnVmZmVyLiAqLwordTggKmlub2RlX2FsbG9jYXRlX2RhdGFfaW5kaXJlY3Qoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJdW5zaWduZWQgbG9uZyBiYWNraW5nX2xlbikKK3sKKwlzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2M7CisJdTMyIGJsb2NrX2xlbiA9IERJVl9ST1VORF9VUChsZW4sIGluZm8uYmxvY2tfc2l6ZSk7CisJdTggKmRhdGEgPSBOVUxMOworCisJYWxsb2MgPSBkb19pbm9kZV9hbGxvY2F0ZV9pbmRpcmVjdChibG9ja19sZW4pOworCWlmIChhbGxvYyA9PSBOVUxMKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gYWxsb2NhdGUgZXh0ZW50cyBmb3IgJWx1IGJ5dGVzIiwgbGVuKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGJhY2tpbmdfbGVuKSB7CisJCWRhdGEgPSBjcmVhdGVfYmFja2luZyhhbGxvYywgYmFja2luZ19sZW4pOworCQlpZiAoIWRhdGEpCisJCQllcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBiYWNraW5nIGZvciAlbHUgYnl0ZXMiLCBiYWNraW5nX2xlbik7CisJfQorCisJcmV3aW5kX2FsbG9jKGFsbG9jKTsKKwlpZiAoZG9faW5vZGVfYXR0YWNoX2luZGlyZWN0KGlub2RlLCBhbGxvYywgYmxvY2tfbGVuKSkKKwkJZXJyb3IoImZhaWxlZCB0byBhdHRhY2ggYmxvY2tzIHRvIGluZGlyZWN0IGlub2RlIik7CisKKwlmcmVlX2FsbG9jKGFsbG9jKTsKKworCXJldHVybiBkYXRhOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9pbmRpcmVjdC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9pbmRpcmVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTg5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL2luZGlyZWN0LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0lORElSRUNUX0hfCisjZGVmaW5lIF9JTkRJUkVDVF9IXworCisjaW5jbHVkZSAiYWxsb2NhdGUuaCIKKwordm9pZCBpbm9kZV9hbGxvY2F0ZV9pbmRpcmVjdChzdHJ1Y3QgZXh0NF9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3U4ICppbm9kZV9hbGxvY2F0ZV9kYXRhX2luZGlyZWN0KHN0cnVjdCBleHQ0X2lub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBsZW4sCisJdW5zaWduZWQgbG9uZyBiYWNraW5nX2xlbik7Cit2b2lkIGlub2RlX2F0dGFjaF9yZXNpemUoc3RydWN0IGV4dDRfaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgYmxvY2tfYWxsb2NhdGlvbiAqYWxsb2MpOwordm9pZCBmcmVlX2luZGlyZWN0X2Jsb2NrcygpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvamJkMi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9qYmQyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNThjMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvamJkMi5oCkBAIC0wLDAgKzEsMTQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioKKyAqKiogICBUaGlzIGhlYWRlciB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBhIExpbnV4IGtlcm5lbCBoZWFkZXIKKyAqKiogICBvZiB0aGUgc2FtZSBuYW1lLCB0byBtYWtlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgdXNlcnNwYWNlIHRvCisgKioqICAgY2FsbCBpbnRvIHRoZSBrZXJuZWwgYXZhaWxhYmxlIHRvIGxpYmMuICBJdCBjb250YWlucyBvbmx5IGNvbnN0YW50cywKKyAqKiogICBzdHJ1Y3R1cmVzLCBhbmQgbWFjcm9zIGdlbmVyYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBoZWFkZXIsIGFuZCB0aHVzLAorICoqKiAgIGNvbnRhaW5zIG5vIGNvcHlyaWdodGFibGUgaW5mb3JtYXRpb24uCisgKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9MSU5VWF9KQkQyX0gKKyNkZWZpbmUgX0xJTlVYX0pCRDJfSAorCisjZGVmaW5lIEpCRDJfREVCVUcKKyNkZWZpbmUgamZzX2RlYnVnIGpiZF9kZWJ1ZworCisjZGVmaW5lIGpvdXJuYWxfb29tX3JldHJ5IDEKKworI3VuZGVmIEpCRDJfUEFSQU5PSURfSU9GQUlMCisKKyNkZWZpbmUgSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFIDUKKworI2RlZmluZSBqYmRfZGVidWcoZiwgYS4uLikgIAorCisjZGVmaW5lIEpCRDJfTUlOX0pPVVJOQUxfQkxPQ0tTIDEwMjQKKworI2RlZmluZSBKQkQyX01BR0lDX05VTUJFUiAweGMwM2IzOTk4VSAgCisKKyNkZWZpbmUgSkJEMl9ERVNDUklQVE9SX0JMT0NLIDEKKyNkZWZpbmUgSkJEMl9DT01NSVRfQkxPQ0sgMgorI2RlZmluZSBKQkQyX1NVUEVSQkxPQ0tfVjEgMworI2RlZmluZSBKQkQyX1NVUEVSQkxPQ0tfVjIgNAorI2RlZmluZSBKQkQyX1JFVk9LRV9CTE9DSyA1CisKK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfaGVhZGVyX3MKK3sKKyBfX2JlMzIgaF9tYWdpYzsKKyBfX2JlMzIgaF9ibG9ja3R5cGU7CisgX19iZTMyIGhfc2VxdWVuY2U7Cit9IGpvdXJuYWxfaGVhZGVyX3Q7CisKKyNkZWZpbmUgSkJEMl9DUkMzMl9DSEtTVU0gMQorI2RlZmluZSBKQkQyX01ENV9DSEtTVU0gMgorI2RlZmluZSBKQkQyX1NIQTFfQ0hLU1VNIDMKKworI2RlZmluZSBKQkQyX0NSQzMyX0NIS1NVTV9TSVpFIDQKKworI2RlZmluZSBKQkQyX0NIRUNLU1VNX0JZVEVTICgzMiAvIHNpemVvZihfX3UzMikpCisKK3N0cnVjdCBjb21taXRfaGVhZGVyIHsKKyBfX2JlMzIgaF9tYWdpYzsKKyBfX2JlMzIgaF9ibG9ja3R5cGU7CisgX19iZTMyIGhfc2VxdWVuY2U7CisgdW5zaWduZWQgY2hhciBoX2Noa3N1bV90eXBlOworIHVuc2lnbmVkIGNoYXIgaF9jaGtzdW1fc2l6ZTsKKyB1bnNpZ25lZCBjaGFyIGhfcGFkZGluZ1syXTsKKyBfX2JlMzIgaF9jaGtzdW1bSkJEMl9DSEVDS1NVTV9CWVRFU107CisgX19iZTY0IGhfY29tbWl0X3NlYzsKKyBfX2JlMzIgaF9jb21taXRfbnNlYzsKK307CisKK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfYmxvY2tfdGFnX3MKK3sKKyBfX2JlMzIgdF9ibG9ja25yOworIF9fYmUzMiB0X2ZsYWdzOworIF9fYmUzMiB0X2Jsb2NrbnJfaGlnaDsKK30gam91cm5hbF9ibG9ja190YWdfdDsKKworI2RlZmluZSBKQkQyX1RBR19TSVpFMzIgKG9mZnNldG9mKGpvdXJuYWxfYmxvY2tfdGFnX3QsIHRfYmxvY2tucl9oaWdoKSkKKyNkZWZpbmUgSkJEMl9UQUdfU0laRTY0IChzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpCisKK3R5cGVkZWYgc3RydWN0IGpiZDJfam91cm5hbF9yZXZva2VfaGVhZGVyX3MKK3sKKyBqb3VybmFsX2hlYWRlcl90IHJfaGVhZGVyOworIF9fYmUzMiByX2NvdW50OworfSBqYmQyX2pvdXJuYWxfcmV2b2tlX2hlYWRlcl90OworCisjZGVmaW5lIEpCRDJfRkxBR19FU0NBUEUgMSAgCisjZGVmaW5lIEpCRDJfRkxBR19TQU1FX1VVSUQgMiAgCisjZGVmaW5lIEpCRDJfRkxBR19ERUxFVEVEIDQgIAorI2RlZmluZSBKQkQyX0ZMQUdfTEFTVF9UQUcgOCAgCisKK3R5cGVkZWYgc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja19zCit7CisKKyBqb3VybmFsX2hlYWRlcl90IHNfaGVhZGVyOworCisgX19iZTMyIHNfYmxvY2tzaXplOworIF9fYmUzMiBzX21heGxlbjsKKyBfX2JlMzIgc19maXJzdDsKKworIF9fYmUzMiBzX3NlcXVlbmNlOworIF9fYmUzMiBzX3N0YXJ0OworCisgX19iZTMyIHNfZXJybm87CisKKyBfX2JlMzIgc19mZWF0dXJlX2NvbXBhdDsKKyBfX2JlMzIgc19mZWF0dXJlX2luY29tcGF0OworIF9fYmUzMiBzX2ZlYXR1cmVfcm9fY29tcGF0OworCisgX191OCBzX3V1aWRbMTZdOworCisgX19iZTMyIHNfbnJfdXNlcnM7CisKKyBfX2JlMzIgc19keW5zdXBlcjsKKworIF9fYmUzMiBzX21heF90cmFuc2FjdGlvbjsKKyBfX2JlMzIgc19tYXhfdHJhbnNfZGF0YTsKKworIF9fdTMyIHNfcGFkZGluZ1s0NF07CisKKyBfX3U4IHNfdXNlcnNbMTYqNDhdOworCit9IGpvdXJuYWxfc3VwZXJibG9ja190OworCisjZGVmaW5lIEpCRDJfSEFTX0NPTVBBVF9GRUFUVVJFKGosbWFzaykgICAoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYgICAoKGopLT5qX3N1cGVyYmxvY2stPnNfZmVhdHVyZV9jb21wYXQgJiBjcHVfdG9fYmUzMigobWFzaykpKSkKKyNkZWZpbmUgSkJEMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoaixtYXNrKSAgICgoaiktPmpfZm9ybWF0X3ZlcnNpb24gPj0gMiAmJiAgICgoaiktPmpfc3VwZXJibG9jay0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorI2RlZmluZSBKQkQyX0hBU19JTkNPTVBBVF9GRUFUVVJFKGosbWFzaykgICAoKGopLT5qX2Zvcm1hdF92ZXJzaW9uID49IDIgJiYgICAoKGopLT5qX3N1cGVyYmxvY2stPnNfZmVhdHVyZV9pbmNvbXBhdCAmIGNwdV90b19iZTMyKChtYXNrKSkpKQorCisjZGVmaW5lIEpCRDJfRkVBVFVSRV9DT01QQVRfQ0hFQ0tTVU0gMHgwMDAwMDAwMQorCisjZGVmaW5lIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UgMHgwMDAwMDAwMQorI2RlZmluZSBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQgMHgwMDAwMDAwMgorI2RlZmluZSBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfQVNZTkNfQ09NTUlUIDB4MDAwMDAwMDQKKworI2RlZmluZSBKQkQyX0tOT1dOX0NPTVBBVF9GRUFUVVJFUyBKQkQyX0ZFQVRVUkVfQ09NUEFUX0NIRUNLU1VNCisjZGVmaW5lIEpCRDJfS05PV05fUk9DT01QQVRfRkVBVFVSRVMgMAorI2RlZmluZSBKQkQyX0tOT1dOX0lOQ09NUEFUX0ZFQVRVUkVTIChKQkQyX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFIHwgICBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQgfCAgIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF9BU1lOQ19DT01NSVQpCisKKyNkZWZpbmUgQkpfTm9uZSAwICAKKyNkZWZpbmUgQkpfTWV0YWRhdGEgMSAgCisjZGVmaW5lIEJKX0ZvcmdldCAyICAKKyNkZWZpbmUgQkpfSU8gMyAgCisjZGVmaW5lIEJKX1NoYWRvdyA0ICAKKyNkZWZpbmUgQkpfTG9nQ3RsIDUgIAorI2RlZmluZSBCSl9SZXNlcnZlZCA2ICAKKyNkZWZpbmUgQkpfVHlwZXMgNworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9tYWtlX2V4dDRmcy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9tYWtlX2V4dDRmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZTdlMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL21ha2VfZXh0NGZzLmMKQEAgLTAsMCArMSw3MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAibWFrZV9leHQ0ZnMuaCIKKyNpbmNsdWRlICJleHQ0X3V0aWxzLmgiCisjaW5jbHVkZSAiYWxsb2NhdGUuaCIKKyNpbmNsdWRlICJjb250ZW50cy5oIgorI2luY2x1ZGUgInV1aWQuaCIKKyNpbmNsdWRlICJ3aXBlLmgiCisKKyNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZkZWYgVVNFX01JTkdXCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorCisvKiBUaGVzZSBtYXRjaCB0aGUgTGludXggZGVmaW5pdGlvbnMgb2YgdGhlc2UgZmxhZ3MuCisgICBMX3h4IGlzIGRlZmluZWQgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgd2luMzIgdmVyc2lvbnMuCisqLworI2RlZmluZSBMX1NfSVJVU1IgMDA0MDAKKyNkZWZpbmUgTF9TX0lXVVNSIDAwMjAwCisjZGVmaW5lIExfU19JWFVTUiAwMDEwMAorLyogTWluR1cgZGVmaW5lcyB0aGlzIG1hY3JvIGFzIHdlbGwgKi8KKyNpZmRlZiBTX0lSV1hVCisjdW5kZWYgU19JUldYVQorI2VuZGlmCisjZGVmaW5lIFNfSVJXWFUgKExfU19JUlVTUiB8IExfU19JV1VTUiB8IExfU19JWFVTUikKKyNkZWZpbmUgU19JUkdSUCAwMDA0MAorI2RlZmluZSBTX0lXR1JQIDAwMDIwCisjZGVmaW5lIFNfSVhHUlAgMDAwMTAKKyNkZWZpbmUgU19JUldYRyAoU19JUkdSUCB8IFNfSVdHUlAgfCBTX0lYR1JQKQorI2RlZmluZSBTX0lST1RIIDAwMDA0CisjZGVmaW5lIFNfSVdPVEggMDAwMDIKKyNkZWZpbmUgU19JWE9USCAwMDAwMQorI2RlZmluZSBTX0lSV1hPIChTX0lST1RIIHwgU19JV09USCB8IFNfSVhPVEgpCisjZGVmaW5lIFNfSVNVSUQgMDAwNDAwMAorI2RlZmluZSBTX0lTR0lEIDAwMDIwMDAKKyNkZWZpbmUgU19JU1ZUWCAwMDAxMDAwCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2xhYmVsLmg+CisjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CisKKyNkZWZpbmUgT19CSU5BUlkgMAorCisjZW5kaWYKKworI2lmZGVmIFVTRV9NSU5HVworc3RhdGljIGludCBzY2FuZGlyX3dpbihjb25zdCBjaGFyKiBwYXRoLCBzdHJ1Y3QgZGlyZW50ICoqKm5hbWVsaXN0KSB7CisgICAgaW50IHBhdGhTaXplID0gc3RybGVuKHBhdGgpOworICAgIGludCBuYW1lQnVmZmVyU2l6ZSA9IHBhdGhTaXplICsgMSArIDE7CisgICAgY2hhciogbmFtZUJ1ZmZlciA9IG1hbGxvYyhuYW1lQnVmZmVyU2l6ZSk7CisgICAgbWVtY3B5KG5hbWVCdWZmZXIsIHBhdGgsIHBhdGhTaXplKTsKKyAgICBzdHJjcHkobmFtZUJ1ZmZlciArIHBhdGhTaXplLCAiKiIpOworICAgIGludCBuYW1lQnVmZmVyU2l6ZVcgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQnVmZmVyLCBuYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICAgIHdjaGFyX3QqIG5hbWVCdWZmZXJXID0gY2FsbG9jKG5hbWVCdWZmZXJTaXplVywgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lQnVmZmVyLCBuYW1lQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVCdWZmZXJXLCBuYW1lQnVmZmVyU2l6ZVcpOworICAgIEhBTkRMRSBobmRsOworICAgIFdJTjMyX0ZJTkRfREFUQVcgZmlsZURhdGE7CisgICAgaG5kbCA9IEZpbmRGaXJzdEZpbGVXKG5hbWVCdWZmZXJXLCAmZmlsZURhdGEpOworICAgIGlmIChobmRsID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIGludCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgZnJlZShuYW1lQnVmZmVyKTsKKyAgICAgICAgZnJlZShuYW1lQnVmZmVyVyk7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfTk9fTU9SRV9GSUxFUykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gRU5PRU5UOworICAgICAgICB9CisgICAgfQorICAgIGludCBjYXBhY2l0eSA9IDQ7CisgICAgKm5hbWVsaXN0ID0gbWFsbG9jKGNhcGFjaXR5ICogc2l6ZW9mKHN0cnVjdCBkaXJlbnQgKikpOworICAgIGludCBpZHggPSAwOworICAgIGRvIHsKKyAgICAgICAgaWYgKHdjc2NtcChMIi4iLCBmaWxlRGF0YS5jRmlsZU5hbWUpICE9IDAKKyAgICAgICAgICAgICAgICAmJiB3Y3NjbXAoTCIuLiIsIGZpbGVEYXRhLmNGaWxlTmFtZSkgIT0gMCkgeworICAgICAgICAgICAgaWYgKGlkeCA+PSBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIGNhcGFjaXR5ICo9IDI7CisgICAgICAgICAgICAgICAgKm5hbWVsaXN0ID0gcmVhbGxvYygqbmFtZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5ICogc2l6ZW9mKHN0cnVjdCBkaXJlbnQgKikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpuYW1lbGlzdClbaWR4XSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGRpcmVudCkpOworICAgICAgICAgICAgYXNzZXJ0KHdjc2xlbihmaWxlRGF0YS5jRmlsZU5hbWUpIDwgTUFYX1BBVEgpOworICAgICAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VVEY4LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlRGF0YS5jRmlsZU5hbWUsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKm5hbWVsaXN0KVtpZHhdLT5kX25hbWUsIE1BWF9QQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIGlkeCArKzsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKEZpbmROZXh0RmlsZVcoaG5kbCwgJmZpbGVEYXRhKSk7CisgICAgRmluZENsb3NlKGhuZGwpOworICAgIGZyZWUobmFtZUJ1ZmZlcik7CisgICAgZnJlZShuYW1lQnVmZmVyVyk7CisgICAgcmV0dXJuIGlkeDsKK30KKyNlbmRpZgorCisvKiBUT0RPOiBOb3QgaW1wbGVtZW50ZWQ6CisgICBBbGxvY2F0aW5nIGJsb2NrcyBpbiB0aGUgc2FtZSBibG9jayBncm91cCBhcyB0aGUgZmlsZSBpbm9kZQorICAgSGFzaCBvciBiaW5hcnkgdHJlZSBkaXJlY3RvcmllcworICAgU3BlY2lhbCBmaWxlczogc29ja2V0cywgZGV2aWNlcywgZmlmb3MKKyAqLworCitzdGF0aWMgdTMyIGJ1aWxkX2RlZmF1bHRfZGlyZWN0b3J5X3N0cnVjdHVyZShjb25zdCBjaGFyICpkaXJfcGF0aCwKKwkJCQkJICAgICBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kKQoreworCXUzMiBpbm9kZTsKKwl1MzIgcm9vdF9pbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5IGRlbnRyaWVzID0geworCQkJLmZpbGVuYW1lID0gImxvc3QrZm91bmQiLAorCQkJLmZpbGVfdHlwZSA9IEVYVDRfRlRfRElSLAorCQkJLm1vZGUgPSBTX0lSV1hVLAorCQkJLnVpZCA9IDAsCisJCQkuZ2lkID0gMCwKKwkJCS5tdGltZSA9IDAsCisJfTsKKwlyb290X2lub2RlID0gbWFrZV9kaXJlY3RvcnkoMCwgMSwgJmRlbnRyaWVzLCAxKTsKKwlpbm9kZSA9IG1ha2VfZGlyZWN0b3J5KHJvb3RfaW5vZGUsIDAsIE5VTEwsIDApOworCSpkZW50cmllcy5pbm9kZSA9IGlub2RlOworCWlub2RlX3NldF9wZXJtaXNzaW9ucyhpbm9kZSwgZGVudHJpZXMubW9kZSwKKwkJZGVudHJpZXMudWlkLCBkZW50cmllcy5naWQsIGRlbnRyaWVzLm10aW1lKTsKKworI2lmbmRlZiBVU0VfTUlOR1cKKwlpZiAoc2VobmQpIHsKKwkJY2hhciAqcGF0aCA9IE5VTEw7CisJCWNoYXIgKnNlY29udGV4dCA9IE5VTEw7CisKKwkJYXNwcmludGYoJnBhdGgsICIlc2xvc3QrZm91bmQiLCBkaXJfcGF0aCk7CisJCWlmIChzZWxhYmVsX2xvb2t1cChzZWhuZCwgJnNlY29udGV4dCwgcGF0aCwgU19JRkRJUikgPCAwKSB7CisJCQllcnJvcigiY2Fubm90IGxvb2t1cCBzZWN1cml0eSBjb250ZXh0IGZvciAlcyIsIHBhdGgpOworCQl9IGVsc2UgeworCQkJaW5vZGVfc2V0X3NlbGludXgoaW5vZGUsIHNlY29udGV4dCk7CisJCQlmcmVlY29uKHNlY29udGV4dCk7CisJCX0KKwkJZnJlZShwYXRoKTsKKwl9CisjZW5kaWYKKworCXJldHVybiByb290X2lub2RlOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9kb3QoY29uc3Qgc3RydWN0IGRpcmVudCAqZCkKK3sKKyAgICByZXR1cm4gKHN0cmNtcChkLT5kX25hbWUsICIuLiIpICYmIHN0cmNtcChkLT5kX25hbWUsICIuIikpOworfQorCisvKiBSZWFkIGEgbG9jYWwgZGlyZWN0b3J5IGFuZCBjcmVhdGUgdGhlIHNhbWUgdHJlZSBpbiB0aGUgZ2VuZXJhdGVkIGZpbGVzeXN0ZW0uCisgICBDYWxscyBpdHNlbGYgcmVjdXJzaXZlbHkgd2l0aCBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgorICAgZnVsbF9wYXRoIGlzIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGgsIHdpdGggYSB0cmFpbGluZyBzbGFzaCwgdG8gdGhlCisgICBkaXJlY3Rvcnkgb24gZGlzayB0aGF0IHNob3VsZCBiZSBjb3BpZWQsIG9yIE5VTEwgaWYgdGhpcyBpcyBhIGRpcmVjdG9yeQorICAgdGhhdCBkb2VzIG5vdCBleGlzdCBvbiBkaXNrIChlLmcuIGxvc3QrZm91bmQpLgorICAgZGlyX3BhdGggaXMgYW4gYWJzb2x1dGUgcGF0aCwgd2l0aCB0cmFpbGluZyBzbGFzaCwgdG8gdGhlIHNhbWUgZGlyZWN0b3J5CisgICBpZiB0aGUgaW1hZ2Ugd2VyZSBtb3VudGVkIGF0IHRoZSBzcGVjaWZpZWQgbW91bnQgcG9pbnQgKi8KK3N0YXRpYyB1MzIgYnVpbGRfZGlyZWN0b3J5X3N0cnVjdHVyZShjb25zdCBjaGFyICpmdWxsX3BhdGgsIGNvbnN0IGNoYXIgKmRpcl9wYXRoLAorCQl1MzIgZGlyX2lub2RlLCBmc19jb25maWdfZnVuY190IGZzX2NvbmZpZ19mdW5jLAorCQlzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kLCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgZW50cmllcyA9IDA7CisJc3RydWN0IGRlbnRyeSAqZGVudHJpZXM7CisJc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBfc3RhdDsKKwlpbnQgcmV0OworCWludCBpOworCXUzMiBpbm9kZTsKKwl1MzIgZW50cnlfaW5vZGU7CisJdTMyIGRpcnMgPSAwOworI2lmbmRlZiBVU0VfTUlOR1cKKwlib29sIG5lZWRzX2xvc3RfYW5kX2ZvdW5kID0gZmFsc2U7CisjZW5kaWYKKworCWlmIChmdWxsX3BhdGgpIHsKKyNpZmRlZiBVU0VfTUlOR1cKKyAgICAgICAgICAgIGVudHJpZXMgPSBzY2FuZGlyX3dpbihmdWxsX3BhdGgsICZuYW1lbGlzdCk7CisjZWxzZQorICAgICAgICAgICAgZW50cmllcyA9IHNjYW5kaXIoZnVsbF9wYXRoLCAmbmFtZWxpc3QsIGZpbHRlcl9kb3QsICh2b2lkKilhbHBoYXNvcnQpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoZW50cmllcyA8IDApIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9lcnJubygic2NhbmRpciIpOworICAgICAgICAgICAgICAgIHJldHVybiBFWFQ0X0FMTE9DQVRFX0ZBSUxFRDsKKyAgICAgICAgICAgIH0KKwl9CisKKyNpZm5kZWYgVVNFX01JTkdXCisJaWYgKGRpcl9pbm9kZSA9PSAwKSB7CisJCS8qIHJvb3QgZGlyZWN0b3J5LCBjaGVjayBpZiBsb3N0K2ZvdW5kIGFscmVhZHkgZXhpc3RzICovCisJCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCisJCQlpZiAoc3RyY21wKG5hbWVsaXN0W2ldLT5kX25hbWUsICJsb3N0K2ZvdW5kIikgPT0gMCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gZW50cmllcykKKwkJCW5lZWRzX2xvc3RfYW5kX2ZvdW5kID0gdHJ1ZTsKKwl9CisjZW5kaWYKKworCWRlbnRyaWVzID0gY2FsbG9jKGVudHJpZXMsIHNpemVvZihzdHJ1Y3QgZGVudHJ5KSk7CisJaWYgKGRlbnRyaWVzID09IE5VTEwpCisJCWNyaXRpY2FsX2Vycm9yX2Vycm5vKCJtYWxsb2MiKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKKwkJZGVudHJpZXNbaV0uZmlsZW5hbWUgPSBzdHJkdXAobmFtZWxpc3RbaV0tPmRfbmFtZSk7CisJCWlmIChkZW50cmllc1tpXS5maWxlbmFtZSA9PSBOVUxMKQorCQkJY3JpdGljYWxfZXJyb3JfZXJybm8oInN0cmR1cCIpOworCisJCWFzcHJpbnRmKCZkZW50cmllc1tpXS5wYXRoLCAiJXMlcyIsIGRpcl9wYXRoLCBuYW1lbGlzdFtpXS0+ZF9uYW1lKTsKKwkJYXNwcmludGYoJmRlbnRyaWVzW2ldLmZ1bGxfcGF0aCwgIiVzJXMiLCBmdWxsX3BhdGgsIG5hbWVsaXN0W2ldLT5kX25hbWUpOworCisJCWZyZWUobmFtZWxpc3RbaV0pOworCisjaWZkZWYgVVNFX01JTkdXCisJCXJldCA9IHN0YXQoZGVudHJpZXNbaV0uZnVsbF9wYXRoLCAmX3N0YXQpOworI2Vsc2UKKwkJcmV0ID0gbHN0YXQoZGVudHJpZXNbaV0uZnVsbF9wYXRoLCAmX3N0YXQpOworI2VuZGlmCisJCWlmIChyZXQgPCAwKSB7CisJCQllcnJvcl9lcnJubygibHN0YXQiKTsKKwkJCWktLTsKKwkJCWVudHJpZXMtLTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGVudHJpZXNbaV0uc2l6ZSA9IF9zdGF0LnN0X3NpemU7CisJCWRlbnRyaWVzW2ldLm1vZGUgPSBfc3RhdC5zdF9tb2RlICYgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKTsKKwkJZGVudHJpZXNbaV0ubXRpbWUgPSBfc3RhdC5zdF9tdGltZTsKKwkJdWludDY0X3QgY2FwYWJpbGl0aWVzOworCQlpZiAoZnNfY29uZmlnX2Z1bmMgIT0gTlVMTCkgeworI2lmZGVmIEFORFJPSUQKKwkJCXVuc2lnbmVkIGludCBtb2RlID0gMDsKKwkJCXVuc2lnbmVkIGludCB1aWQgPSAwOworCQkJdW5zaWduZWQgaW50IGdpZCA9IDA7CisJCQlpbnQgZGlyID0gU19JU0RJUihfc3RhdC5zdF9tb2RlKTsKKwkJCWZzX2NvbmZpZ19mdW5jKGRlbnRyaWVzW2ldLnBhdGgsIGRpciwgJnVpZCwgJmdpZCwgJm1vZGUsICZjYXBhYmlsaXRpZXMpOworCQkJZGVudHJpZXNbaV0ubW9kZSA9IG1vZGU7CisJCQlkZW50cmllc1tpXS51aWQgPSB1aWQ7CisJCQlkZW50cmllc1tpXS5naWQgPSBnaWQ7CisJCQlkZW50cmllc1tpXS5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisjZWxzZQorCQkJZXJyb3IoImNhbid0IHNldCBhbmRyb2lkIHBlcm1pc3Npb25zIC0gYnVpbHQgd2l0aG91dCBhbmRyb2lkIHN1cHBvcnQiKTsKKyNlbmRpZgorCQl9CisjaWZuZGVmIFVTRV9NSU5HVworCQlpZiAoc2VobmQpIHsKKwkJCWlmIChzZWxhYmVsX2xvb2t1cChzZWhuZCwgJmRlbnRyaWVzW2ldLnNlY29uLCBkZW50cmllc1tpXS5wYXRoLCBfc3RhdC5zdF9tb2RlKSA8IDApIHsKKwkJCQllcnJvcigiY2Fubm90IGxvb2t1cCBzZWN1cml0eSBjb250ZXh0IGZvciAlcyIsIGRlbnRyaWVzW2ldLnBhdGgpOworCQkJfQorCisJCQlpZiAoZGVudHJpZXNbaV0uc2Vjb24gJiYgdmVyYm9zZSkKKwkJCQlwcmludGYoIkxhYmVsaW5nICVzIGFzICVzXG4iLCBkZW50cmllc1tpXS5wYXRoLCBkZW50cmllc1tpXS5zZWNvbik7CisJCX0KKyNlbmRpZgorCisJCWlmIChTX0lTUkVHKF9zdGF0LnN0X21vZGUpKSB7CisJCQlkZW50cmllc1tpXS5maWxlX3R5cGUgPSBFWFQ0X0ZUX1JFR19GSUxFOworCQl9IGVsc2UgaWYgKFNfSVNESVIoX3N0YXQuc3RfbW9kZSkpIHsKKwkJCWRlbnRyaWVzW2ldLmZpbGVfdHlwZSA9IEVYVDRfRlRfRElSOworCQkJZGlycysrOworCQl9IGVsc2UgaWYgKFNfSVNDSFIoX3N0YXQuc3RfbW9kZSkpIHsKKwkJCWRlbnRyaWVzW2ldLmZpbGVfdHlwZSA9IEVYVDRfRlRfQ0hSREVWOworCQl9IGVsc2UgaWYgKFNfSVNCTEsoX3N0YXQuc3RfbW9kZSkpIHsKKwkJCWRlbnRyaWVzW2ldLmZpbGVfdHlwZSA9IEVYVDRfRlRfQkxLREVWOworCQl9IGVsc2UgaWYgKFNfSVNGSUZPKF9zdGF0LnN0X21vZGUpKSB7CisJCQlkZW50cmllc1tpXS5maWxlX3R5cGUgPSBFWFQ0X0ZUX0ZJRk87CisJCX0KKyNpZm5kZWYgVVNFX01JTkdXCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoU19JU1NPQ0soX3N0YXQuc3RfbW9kZSkpIHsKKwkJCWRlbnRyaWVzW2ldLmZpbGVfdHlwZSA9IEVYVDRfRlRfU09DSzsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKF9zdGF0LnN0X21vZGUpKSB7CisJCQlkZW50cmllc1tpXS5maWxlX3R5cGUgPSBFWFQ0X0ZUX1NZTUxJTks7CisJCQlkZW50cmllc1tpXS5saW5rID0gY2FsbG9jKGluZm8uYmxvY2tfc2l6ZSwgMSk7CisJCQlyZWFkbGluayhkZW50cmllc1tpXS5mdWxsX3BhdGgsIGRlbnRyaWVzW2ldLmxpbmssIGluZm8uYmxvY2tfc2l6ZSAtIDEpOworCQl9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBlbHNlIHsKKwkJCWVycm9yKCJ1bmtub3duIGZpbGUgdHlwZSBvbiAlcyIsIGRlbnRyaWVzW2ldLnBhdGgpOworCQkJaS0tOworCQkJZW50cmllcy0tOworCQl9CisJfQorCWZyZWUobmFtZWxpc3QpOworCisjaWZuZGVmIFVTRV9NSU5HVworCWlmIChuZWVkc19sb3N0X2FuZF9mb3VuZCkgeworCQkvKiBpbnNlcnQgYSBsb3N0K2ZvdW5kIGRpcmVjdG9yeSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZW50cmllcyAqLworCQlzdHJ1Y3QgZGVudHJ5ICp0bXAgPSBjYWxsb2MoZW50cmllcyArIDEsIHNpemVvZihzdHJ1Y3QgZGVudHJ5KSk7CisJCW1lbXNldCh0bXAsIDAsIHNpemVvZihzdHJ1Y3QgZGVudHJ5KSk7CisJCW1lbWNweSh0bXAgKyAxLCBkZW50cmllcywgZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZGVudHJ5KSk7CisJCWRlbnRyaWVzID0gdG1wOworCisJCWRlbnRyaWVzWzBdLmZpbGVuYW1lID0gc3RyZHVwKCJsb3N0K2ZvdW5kIik7CisJCWFzcHJpbnRmKCZkZW50cmllc1swXS5wYXRoLCAiJXNsb3N0K2ZvdW5kIiwgZGlyX3BhdGgpOworCQlkZW50cmllc1swXS5mdWxsX3BhdGggPSBOVUxMOworCQlkZW50cmllc1swXS5zaXplID0gMDsKKwkJZGVudHJpZXNbMF0ubW9kZSA9IFNfSVJXWFU7CisJCWRlbnRyaWVzWzBdLmZpbGVfdHlwZSA9IEVYVDRfRlRfRElSOworCQlkZW50cmllc1swXS51aWQgPSAwOworCQlkZW50cmllc1swXS5naWQgPSAwOworCQlpZiAoc2VobmQpIHsKKwkJCWlmIChzZWxhYmVsX2xvb2t1cChzZWhuZCwgJmRlbnRyaWVzWzBdLnNlY29uLCBkZW50cmllc1swXS5wYXRoLCBkZW50cmllc1swXS5tb2RlKSA8IDApCisJCQkJZXJyb3IoImNhbm5vdCBsb29rdXAgc2VjdXJpdHkgY29udGV4dCBmb3IgJXMiLCBkZW50cmllc1swXS5wYXRoKTsKKwkJfQorCQllbnRyaWVzKys7CisJCWRpcnMrKzsKKwl9CisjZW5kaWYKKworCWlub2RlID0gbWFrZV9kaXJlY3RvcnkoZGlyX2lub2RlLCBlbnRyaWVzLCBkZW50cmllcywgZGlycyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCWlmIChkZW50cmllc1tpXS5maWxlX3R5cGUgPT0gRVhUNF9GVF9SRUdfRklMRSkgeworCQkJZW50cnlfaW5vZGUgPSBtYWtlX2ZpbGUoZGVudHJpZXNbaV0uZnVsbF9wYXRoLCBkZW50cmllc1tpXS5zaXplKTsKKwkJfSBlbHNlIGlmIChkZW50cmllc1tpXS5maWxlX3R5cGUgPT0gRVhUNF9GVF9ESVIpIHsKKwkJCWNoYXIgKnN1YmRpcl9mdWxsX3BhdGggPSBOVUxMOworCQkJY2hhciAqc3ViZGlyX2Rpcl9wYXRoOworCQkJaWYgKGRlbnRyaWVzW2ldLmZ1bGxfcGF0aCkgeworCQkJCXJldCA9IGFzcHJpbnRmKCZzdWJkaXJfZnVsbF9wYXRoLCAiJXMvIiwgZGVudHJpZXNbaV0uZnVsbF9wYXRoKTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJY3JpdGljYWxfZXJyb3JfZXJybm8oImFzcHJpbnRmIik7CisJCQl9CisJCQlyZXQgPSBhc3ByaW50Zigmc3ViZGlyX2Rpcl9wYXRoLCAiJXMvIiwgZGVudHJpZXNbaV0ucGF0aCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQljcml0aWNhbF9lcnJvcl9lcnJubygiYXNwcmludGYiKTsKKwkJCWVudHJ5X2lub2RlID0gYnVpbGRfZGlyZWN0b3J5X3N0cnVjdHVyZShzdWJkaXJfZnVsbF9wYXRoLAorCQkJCQlzdWJkaXJfZGlyX3BhdGgsIGlub2RlLCBmc19jb25maWdfZnVuYywgc2VobmQsIHZlcmJvc2UpOworCQkJZnJlZShzdWJkaXJfZnVsbF9wYXRoKTsKKwkJCWZyZWUoc3ViZGlyX2Rpcl9wYXRoKTsKKwkJfSBlbHNlIGlmIChkZW50cmllc1tpXS5maWxlX3R5cGUgPT0gRVhUNF9GVF9TWU1MSU5LKSB7CisJCQllbnRyeV9pbm9kZSA9IG1ha2VfbGluayhkZW50cmllc1tpXS5saW5rKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmtub3duIGZpbGUgdHlwZSBvbiAlcyIsIGRlbnRyaWVzW2ldLnBhdGgpOworCQkJZW50cnlfaW5vZGUgPSAwOworCQl9CisJCSpkZW50cmllc1tpXS5pbm9kZSA9IGVudHJ5X2lub2RlOworCisJCXJldCA9IGlub2RlX3NldF9wZXJtaXNzaW9ucyhlbnRyeV9pbm9kZSwgZGVudHJpZXNbaV0ubW9kZSwKKwkJCWRlbnRyaWVzW2ldLnVpZCwgZGVudHJpZXNbaV0uZ2lkLAorCQkJZGVudHJpZXNbaV0ubXRpbWUpOworCQlpZiAocmV0KQorCQkJZXJyb3IoImZhaWxlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gJXNcbiIsIGRlbnRyaWVzW2ldLnBhdGgpOworCisJCS8qCisJCSAqIEl0J3MgaW1wb3J0YW50IHRvIGNhbGwgaW5vZGVfc2V0X3NlbGludXgoKSBiZWZvcmUKKwkJICogaW5vZGVfc2V0X2NhcGFiaWxpdGllcygpLiBFeHRlbmRlZCBhdHRyaWJ1dGVzIG5lZWQgdG8KKwkJICogYmUgc3RvcmVkIHNvcnRlZCBvcmRlciwgYW5kIHdlIGd1YXJhbnRlZSB0aGlzIGJ5IG1ha2luZworCQkgKiB0aGUgY2FsbHMgaW4gdGhlIHByb3BlciBvcmRlci4KKwkJICogUGxlYXNlIHNlZSB4YXR0cl9hc3NlcnRfc2FuZSgpIGluIGNvbnRlbnRzLmMKKwkJICovCisJCXJldCA9IGlub2RlX3NldF9zZWxpbnV4KGVudHJ5X2lub2RlLCBkZW50cmllc1tpXS5zZWNvbik7CisJCWlmIChyZXQpCisJCQllcnJvcigiZmFpbGVkIHRvIHNldCBTRUxpbnV4IGNvbnRleHQgb24gJXNcbiIsIGRlbnRyaWVzW2ldLnBhdGgpOworCQlyZXQgPSBpbm9kZV9zZXRfY2FwYWJpbGl0aWVzKGVudHJ5X2lub2RlLCBkZW50cmllc1tpXS5jYXBhYmlsaXRpZXMpOworCQlpZiAocmV0KQorCQkJZXJyb3IoImZhaWxlZCB0byBzZXQgY2FwYWJpbGl0eSBvbiAlc1xuIiwgZGVudHJpZXNbaV0ucGF0aCk7CisKKwkJZnJlZShkZW50cmllc1tpXS5wYXRoKTsKKwkJZnJlZShkZW50cmllc1tpXS5mdWxsX3BhdGgpOworCQlmcmVlKGRlbnRyaWVzW2ldLmxpbmspOworCQlmcmVlKCh2b2lkICopZGVudHJpZXNbaV0uZmlsZW5hbWUpOworCQlmcmVlKGRlbnRyaWVzW2ldLnNlY29uKTsKKwl9CisKKwlmcmVlKGRlbnRyaWVzKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB1MzIgY29tcHV0ZV9ibG9ja19zaXplKCkKK3sKKwlyZXR1cm4gNDA5NjsKK30KKworc3RhdGljIHUzMiBjb21wdXRlX2pvdXJuYWxfYmxvY2tzKCkKK3sKKwl1MzIgam91cm5hbF9ibG9ja3MgPSBESVZfUk9VTkRfVVAoaW5mby5sZW4sIGluZm8uYmxvY2tfc2l6ZSkgLyA2NDsKKwlpZiAoam91cm5hbF9ibG9ja3MgPCAxMDI0KQorCQlqb3VybmFsX2Jsb2NrcyA9IDEwMjQ7CisJaWYgKGpvdXJuYWxfYmxvY2tzID4gMzI3NjgpCisJCWpvdXJuYWxfYmxvY2tzID0gMzI3Njg7CisJcmV0dXJuIGpvdXJuYWxfYmxvY2tzOworfQorCitzdGF0aWMgdTMyIGNvbXB1dGVfYmxvY2tzX3Blcl9ncm91cCgpCit7CisJcmV0dXJuIGluZm8uYmxvY2tfc2l6ZSAqIDg7Cit9CisKK3N0YXRpYyB1MzIgY29tcHV0ZV9pbm9kZXMoKQoreworCXJldHVybiBESVZfUk9VTkRfVVAoaW5mby5sZW4sIGluZm8uYmxvY2tfc2l6ZSkgLyA0OworfQorCitzdGF0aWMgdTMyIGNvbXB1dGVfaW5vZGVzX3Blcl9ncm91cCgpCit7CisJdTMyIGJsb2NrcyA9IERJVl9ST1VORF9VUChpbmZvLmxlbiwgaW5mby5ibG9ja19zaXplKTsKKwl1MzIgYmxvY2tfZ3JvdXBzID0gRElWX1JPVU5EX1VQKGJsb2NrcywgaW5mby5ibG9ja3NfcGVyX2dyb3VwKTsKKwl1MzIgaW5vZGVzID0gRElWX1JPVU5EX1VQKGluZm8uaW5vZGVzLCBibG9ja19ncm91cHMpOworCWlub2RlcyA9IEFMSUdOKGlub2RlcywgKGluZm8uYmxvY2tfc2l6ZSAvIGluZm8uaW5vZGVfc2l6ZSkpOworCisJLyogQWZ0ZXIgcHJvcGVybHkgcm91bmRpbmcgdXAgdGhlIG51bWJlciBvZiBpbm9kZXMvZ3JvdXAsCisJICogbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgdG90YWwgaW5vZGVzIGZpZWxkIGluIHRoZSBpbmZvIHN0cnVjdC4KKwkgKi8KKwlpbmZvLmlub2RlcyA9IGlub2RlcyAqIGJsb2NrX2dyb3VwczsKKworCXJldHVybiBpbm9kZXM7Cit9CisKK3N0YXRpYyB1MzIgY29tcHV0ZV9iZ19kZXNjX3Jlc2VydmVfYmxvY2tzKCkKK3sKKwl1MzIgYmxvY2tzID0gRElWX1JPVU5EX1VQKGluZm8ubGVuLCBpbmZvLmJsb2NrX3NpemUpOworCXUzMiBibG9ja19ncm91cHMgPSBESVZfUk9VTkRfVVAoYmxvY2tzLCBpbmZvLmJsb2Nrc19wZXJfZ3JvdXApOworCXUzMiBiZ19kZXNjX2Jsb2NrcyA9IERJVl9ST1VORF9VUChibG9ja19ncm91cHMgKiBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyksCisJCQlpbmZvLmJsb2NrX3NpemUpOworCisJdTMyIGJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3MgPQorCQkJRElWX1JPVU5EX1VQKGJsb2NrX2dyb3VwcyAqIDEwMjQgKiBzaXplb2Yoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyksCisJCQkJCWluZm8uYmxvY2tfc2l6ZSkgLSBiZ19kZXNjX2Jsb2NrczsKKworCWlmIChiZ19kZXNjX3Jlc2VydmVfYmxvY2tzID4gaW5mby5ibG9ja19zaXplIC8gc2l6ZW9mKHUzMikpCisJCWJnX2Rlc2NfcmVzZXJ2ZV9ibG9ja3MgPSBpbmZvLmJsb2NrX3NpemUgLyBzaXplb2YodTMyKTsKKworCXJldHVybiBiZ19kZXNjX3Jlc2VydmVfYmxvY2tzOworfQorCit2b2lkIHJlc2V0X2V4dDRmc19pbmZvKCkgeworICAgIC8vIFJlc2V0IGFsbCB0aGUgZ2xvYmFsIGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IG1ha2VfZXh0NGZzIHNvIGl0CisgICAgLy8gY2FuIGJlIGNhbGxlZCBhZ2Fpbi4KKyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgbWVtc2V0KCZhdXhfaW5mbywgMCwgc2l6ZW9mKGF1eF9pbmZvKSk7CisKKyAgICBpZiAoZXh0NF9zcGFyc2VfZmlsZSkgeworICAgICAgICBzcGFyc2VfZmlsZV9kZXN0cm95KGV4dDRfc3BhcnNlX2ZpbGUpOworICAgICAgICBleHQ0X3NwYXJzZV9maWxlID0gTlVMTDsKKyAgICB9Cit9CisKK2ludCBtYWtlX2V4dDRmc19zcGFyc2VfZmQoaW50IGZkLCBsb25nIGxvbmcgbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vdW50cG9pbnQsIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VobmQpCit7CisJcmVzZXRfZXh0NGZzX2luZm8oKTsKKwlpbmZvLmxlbiA9IGxlbjsKKworCXJldHVybiBtYWtlX2V4dDRmc19pbnRlcm5hbChmZCwgTlVMTCwgbW91bnRwb2ludCwgTlVMTCwgMCwgMSwgMCwgMCwgc2VobmQsIDApOworfQorCitpbnQgbWFrZV9leHQ0ZnMoY29uc3QgY2hhciAqZmlsZW5hbWUsIGxvbmcgbG9uZyBsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW91bnRwb2ludCwgc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhuZCkKK3sKKyAgICByZXR1cm4gbWFrZV9leHQ0ZnNfZnJvbV9kaXIoZmlsZW5hbWUsIE5VTEwsIGxlbiwgbW91bnRwb2ludCwgc2VobmQpOworfQorCitpbnQgbWFrZV9leHQ0ZnNfZnJvbV9kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmRpcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIGxlbiwgY29uc3QgY2hhciAqbW91bnRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kKSB7CisgICAgaW50IGZkOworICAgIGludCBzdGF0dXM7CisKKyAgICByZXNldF9leHQ0ZnNfaW5mbygpOworICAgIGluZm8ubGVuID0gbGVuOworCisgICAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NDQpOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgZXJyb3JfZXJybm8oIm9wZW4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBtYWtlX2V4dDRmc19pbnRlcm5hbChmZCwgZGlybmFtZSwgbW91bnRwb2ludCwgTlVMTCwgMCwgMCwgMCwgMSwgc2VobmQsIDApOworICAgIGNsb3NlKGZkKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHJldHVybiBhIG5ld2x5LW1hbGxvYydkIHN0cmluZyB0aGF0IGlzIGEgY29weSBvZiBzdHIuICBUaGUgbmV3IHN0cmluZworICAgaXMgZ3VhcmFudGVlZCB0byBoYXZlIGEgdHJhaWxpbmcgc2xhc2guICBJZiBhYnNvbHV0ZSBpcyB0cnVlLCB0aGUgbmV3IHN0cmluZworICAgaXMgYWxzbyBndWFyYW50ZWVkIHRvIGhhdmUgYSBsZWFkaW5nIHNsYXNoLgorKi8KK3N0YXRpYyBjaGFyICpjYW5vbmljYWxpemVfc2xhc2hlcyhjb25zdCBjaGFyICpzdHIsIGJvb2wgYWJzb2x1dGUpCit7CisJY2hhciAqcmV0OworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwlpbnQgbmV3bGVuID0gbGVuOworCWNoYXIgKnB0cjsKKworCWlmIChsZW4gPT0gMCkgeworCQlpZiAoYWJzb2x1dGUpCisJCQlyZXR1cm4gc3RyZHVwKCIvIik7CisJCWVsc2UKKwkJCXJldHVybiBzdHJkdXAoIiIpOworCX0KKworCWlmIChzdHJbMF0gIT0gJy8nICYmIGFic29sdXRlKSB7CisJCW5ld2xlbisrOworCX0KKwlpZiAoc3RyW2xlbiAtIDFdICE9ICcvJykgeworCQluZXdsZW4rKzsKKwl9CisJcmV0ID0gbWFsbG9jKG5ld2xlbiArIDEpOworCWlmICghcmV0KSB7CisJCWNyaXRpY2FsX2Vycm9yKCJtYWxsb2MiKTsKKwl9CisKKwlwdHIgPSByZXQ7CisJaWYgKHN0clswXSAhPSAnLycgJiYgYWJzb2x1dGUpIHsKKwkJKnB0cisrID0gJy8nOworCX0KKworCXN0cmNweShwdHIsIHN0cik7CisJcHRyICs9IGxlbjsKKworCWlmIChzdHJbbGVuIC0gMV0gIT0gJy8nKSB7CisJCSpwdHIrKyA9ICcvJzsKKwl9CisKKwlpZiAocHRyICE9IHJldCArIG5ld2xlbikgeworCQljcml0aWNhbF9lcnJvcigiYXNzZXJ0aW9uIGZhaWxlZFxuIik7CisJfQorCisJKnB0ciA9ICdcMCc7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY2hhciAqY2Fub25pY2FsaXplX2Fic19zbGFzaGVzKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlyZXR1cm4gY2Fub25pY2FsaXplX3NsYXNoZXMoc3RyLCB0cnVlKTsKK30KKworc3RhdGljIGNoYXIgKmNhbm9uaWNhbGl6ZV9yZWxfc2xhc2hlcyhjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIGNhbm9uaWNhbGl6ZV9zbGFzaGVzKHN0ciwgZmFsc2UpOworfQorCitpbnQgbWFrZV9leHQ0ZnNfaW50ZXJuYWwoaW50IGZkLCBjb25zdCBjaGFyICpfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9tb3VudHBvaW50LCBmc19jb25maWdfZnVuY190IGZzX2NvbmZpZ19mdW5jLCBpbnQgZ3ppcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3BhcnNlLCBpbnQgY3JjLCBpbnQgd2lwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kLCBpbnQgdmVyYm9zZSkKK3sKKwl1MzIgcm9vdF9pbm9kZV9udW07CisJdTE2IHJvb3RfbW9kZTsKKwljaGFyICptb3VudHBvaW50OworCWNoYXIgKmRpcmVjdG9yeSA9IE5VTEw7CisKKwlpZiAoc2V0am1wKHNldGptcF9lbnYpKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiBIYW5kbGUgYSBjYWxsIHRvIGxvbmdqbXAoKSAqLworCisJaWYgKF9tb3VudHBvaW50ID09IE5VTEwpIHsKKwkJbW91bnRwb2ludCA9IHN0cmR1cCgiIik7CisJfSBlbHNlIHsKKwkJbW91bnRwb2ludCA9IGNhbm9uaWNhbGl6ZV9hYnNfc2xhc2hlcyhfbW91bnRwb2ludCk7CisJfQorCisJaWYgKF9kaXJlY3RvcnkpIHsKKwkJZGlyZWN0b3J5ID0gY2Fub25pY2FsaXplX3JlbF9zbGFzaGVzKF9kaXJlY3RvcnkpOworCX0KKworCWlmIChpbmZvLmxlbiA8PSAwKQorCQlpbmZvLmxlbiA9IGdldF9maWxlX3NpemUoZmQpOworCisJaWYgKGluZm8ubGVuIDw9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJOZWVkIHNpemUgb2YgZmlsZXN5c3RlbVxuIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJaWYgKGluZm8uYmxvY2tfc2l6ZSA8PSAwKQorCQlpbmZvLmJsb2NrX3NpemUgPSBjb21wdXRlX2Jsb2NrX3NpemUoKTsKKworCS8qIFJvdW5kIGRvd24gdGhlIGZpbGVzeXN0ZW0gbGVuZ3RoIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUgKi8KKwlpbmZvLmxlbiAmPSB+KCh1NjQpaW5mby5ibG9ja19zaXplIC0gMSk7CisKKwlpZiAoaW5mby5qb3VybmFsX2Jsb2NrcyA9PSAwKQorCQlpbmZvLmpvdXJuYWxfYmxvY2tzID0gY29tcHV0ZV9qb3VybmFsX2Jsb2NrcygpOworCisJaWYgKGluZm8ubm9fam91cm5hbCA9PSAwKQorCQlpbmZvLmZlYXRfY29tcGF0ID0gRVhUNF9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTDsKKwllbHNlCisJCWluZm8uam91cm5hbF9ibG9ja3MgPSAwOworCisJaWYgKGluZm8uYmxvY2tzX3Blcl9ncm91cCA8PSAwKQorCQlpbmZvLmJsb2Nrc19wZXJfZ3JvdXAgPSBjb21wdXRlX2Jsb2Nrc19wZXJfZ3JvdXAoKTsKKworCWlmIChpbmZvLmlub2RlcyA8PSAwKQorCQlpbmZvLmlub2RlcyA9IGNvbXB1dGVfaW5vZGVzKCk7CisKKwlpZiAoaW5mby5pbm9kZV9zaXplIDw9IDApCisJCWluZm8uaW5vZGVfc2l6ZSA9IDI1NjsKKworCWlmIChpbmZvLmxhYmVsID09IE5VTEwpCisJCWluZm8ubGFiZWwgPSAiIjsKKworCWluZm8uaW5vZGVzX3Blcl9ncm91cCA9IGNvbXB1dGVfaW5vZGVzX3Blcl9ncm91cCgpOworCisJaW5mby5mZWF0X2NvbXBhdCB8PQorCQkJRVhUNF9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUgfAorCQkJRVhUNF9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUjsKKworCWluZm8uZmVhdF9yb19jb21wYXQgfD0KKwkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSIHwKKwkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSB8CisJCQlFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0dEVF9DU1VNOworCisJaW5mby5mZWF0X2luY29tcGF0IHw9CisJCQlFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUyB8CisJCQlFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEU7CisKKworCWluZm8uYmdfZGVzY19yZXNlcnZlX2Jsb2NrcyA9IGNvbXB1dGVfYmdfZGVzY19yZXNlcnZlX2Jsb2NrcygpOworCisJcHJpbnRmKCJDcmVhdGluZyBmaWxlc3lzdGVtIHdpdGggcGFyYW1ldGVyczpcbiIpOworCXByaW50ZigiICAgIFNpemU6ICUiUFJJdTY0IlxuIiwgaW5mby5sZW4pOworCXByaW50ZigiICAgIEJsb2NrIHNpemU6ICVkXG4iLCBpbmZvLmJsb2NrX3NpemUpOworCXByaW50ZigiICAgIEJsb2NrcyBwZXIgZ3JvdXA6ICVkXG4iLCBpbmZvLmJsb2Nrc19wZXJfZ3JvdXApOworCXByaW50ZigiICAgIElub2RlcyBwZXIgZ3JvdXA6ICVkXG4iLCBpbmZvLmlub2Rlc19wZXJfZ3JvdXApOworCXByaW50ZigiICAgIElub2RlIHNpemU6ICVkXG4iLCBpbmZvLmlub2RlX3NpemUpOworCXByaW50ZigiICAgIEpvdXJuYWwgYmxvY2tzOiAlZFxuIiwgaW5mby5qb3VybmFsX2Jsb2Nrcyk7CisJcHJpbnRmKCIgICAgTGFiZWw6ICVzXG4iLCBpbmZvLmxhYmVsKTsKKworCWV4dDRfY3JlYXRlX2ZzX2F1eF9pbmZvKCk7CisKKwlwcmludGYoIiAgICBCbG9ja3M6ICUiUFJJdTY0IlxuIiwgYXV4X2luZm8ubGVuX2Jsb2Nrcyk7CisJcHJpbnRmKCIgICAgQmxvY2sgZ3JvdXBzOiAlZFxuIiwgYXV4X2luZm8uZ3JvdXBzKTsKKwlwcmludGYoIiAgICBSZXNlcnZlZCBibG9jayBncm91cCBzaXplOiAlZFxuIiwgaW5mby5iZ19kZXNjX3Jlc2VydmVfYmxvY2tzKTsKKworCWV4dDRfc3BhcnNlX2ZpbGUgPSBzcGFyc2VfZmlsZV9uZXcoaW5mby5ibG9ja19zaXplLCBpbmZvLmxlbik7CisKKwlibG9ja19hbGxvY2F0b3JfaW5pdCgpOworCisJZXh0NF9maWxsX2luX3NiKCk7CisKKwlpZiAocmVzZXJ2ZV9pbm9kZXMoMCwgMTApID09IEVYVDRfQUxMT0NBVEVfRkFJTEVEKQorCQllcnJvcigiZmFpbGVkIHRvIHJlc2VydmUgZmlyc3QgMTAgaW5vZGVzIik7CisKKwlpZiAoaW5mby5mZWF0X2NvbXBhdCAmIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpCisJCWV4dDRfY3JlYXRlX2pvdXJuYWxfaW5vZGUoKTsKKworCWlmIChpbmZvLmZlYXRfY29tcGF0ICYgRVhUNF9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpCisJCWV4dDRfY3JlYXRlX3Jlc2l6ZV9pbm9kZSgpOworCisJaWYgKGRpcmVjdG9yeSkKKwkJcm9vdF9pbm9kZV9udW0gPSBidWlsZF9kaXJlY3Rvcnlfc3RydWN0dXJlKGRpcmVjdG9yeSwgbW91bnRwb2ludCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZzX2NvbmZpZ19mdW5jLCBzZWhuZCwgdmVyYm9zZSk7CisJZWxzZQorCQlyb290X2lub2RlX251bSA9IGJ1aWxkX2RlZmF1bHRfZGlyZWN0b3J5X3N0cnVjdHVyZShtb3VudHBvaW50LCBzZWhuZCk7CisKKwlyb290X21vZGUgPSBTX0lSV1hVIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USDsKKwlpbm9kZV9zZXRfcGVybWlzc2lvbnMocm9vdF9pbm9kZV9udW0sIHJvb3RfbW9kZSwgMCwgMCwgMCk7CisKKyNpZm5kZWYgVVNFX01JTkdXCisJaWYgKHNlaG5kKSB7CisJCWNoYXIgKnNlY29udGV4dCA9IE5VTEw7CisKKwkJaWYgKHNlbGFiZWxfbG9va3VwKHNlaG5kLCAmc2Vjb250ZXh0LCBtb3VudHBvaW50LCBTX0lGRElSKSA8IDApIHsKKwkJCWVycm9yKCJjYW5ub3QgbG9va3VwIHNlY3VyaXR5IGNvbnRleHQgZm9yICVzIiwgbW91bnRwb2ludCk7CisJCX0KKwkJaWYgKHNlY29udGV4dCkgeworCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIkxhYmVsaW5nICVzIGFzICVzXG4iLCBtb3VudHBvaW50LCBzZWNvbnRleHQpOworCQkJfQorCQkJaW5vZGVfc2V0X3NlbGludXgocm9vdF9pbm9kZV9udW0sIHNlY29udGV4dCk7CisJCX0KKwkJZnJlZWNvbihzZWNvbnRleHQpOworCX0KKyNlbmRpZgorCisJZXh0NF91cGRhdGVfZnJlZSgpOworCisJZXh0NF9xdWV1ZV9zYigpOworCisJcHJpbnRmKCJDcmVhdGVkIGZpbGVzeXN0ZW0gd2l0aCAlZC8lZCBpbm9kZXMgYW5kICVkLyVkIGJsb2Nrc1xuIiwKKwkJCWF1eF9pbmZvLnNiLT5zX2lub2Rlc19jb3VudCAtIGF1eF9pbmZvLnNiLT5zX2ZyZWVfaW5vZGVzX2NvdW50LAorCQkJYXV4X2luZm8uc2ItPnNfaW5vZGVzX2NvdW50LAorCQkJYXV4X2luZm8uc2ItPnNfYmxvY2tzX2NvdW50X2xvIC0gYXV4X2luZm8uc2ItPnNfZnJlZV9ibG9ja3NfY291bnRfbG8sCisJCQlhdXhfaW5mby5zYi0+c19ibG9ja3NfY291bnRfbG8pOworCisJaWYgKHdpcGUgJiYgV0lQRV9JU19TVVBQT1JURUQpIHsKKwkJd2lwZV9ibG9ja19kZXZpY2UoZmQsIGluZm8ubGVuKTsKKwl9CisKKwl3cml0ZV9leHQ0X2ltYWdlKGZkLCBnemlwLCBzcGFyc2UsIGNyYyk7CisKKwlzcGFyc2VfZmlsZV9kZXN0cm95KGV4dDRfc3BhcnNlX2ZpbGUpOworCWV4dDRfc3BhcnNlX2ZpbGUgPSBOVUxMOworCisJZnJlZShtb3VudHBvaW50KTsKKwlmcmVlKGRpcmVjdG9yeSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvbWFrZV9leHQ0ZnNfbWFpbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9tYWtlX2V4dDRmc19tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0ZTUxZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvbWFrZV9leHQ0ZnNfbWFpbi5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmIGRlZmluZWQoX19saW51eF9fKQorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyNpbmNsdWRlIDxzeXMvZGlzay5oPgorI2VuZGlmCisKKyNpZmRlZiBBTkRST0lECisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjZW5kaWYKKworI2lmbmRlZiBVU0VfTUlOR1cKKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2xhYmVsLmg+CisjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CisjZWxzZQorc3RydWN0IHNlbGFiZWxfaGFuZGxlOworI2VuZGlmCisKKyNpbmNsdWRlICJtYWtlX2V4dDRmcy5oIgorI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKworI2lmbmRlZiBVU0VfTUlOR1cgLyogT19CSU5BUlkgaXMgd2luZG93cy1zcGVjaWZpYyBmbGFnICovCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGZzX2luZm8gaW5mbzsKKworCitzdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwYXRoKQoreworCWZwcmludGYoc3RkZXJyLCAiJXMgWyAtbCA8bGVuPiBdIFsgLWogPGpvdXJuYWwgc2l6ZT4gXSBbIC1iIDxibG9ja19zaXplPiBdXG4iLCBiYXNlbmFtZShwYXRoKSk7CisJZnByaW50ZihzdGRlcnIsICIgICAgWyAtZyA8YmxvY2tzIHBlciBncm91cD4gXSBbIC1pIDxpbm9kZXM+IF0gWyAtSSA8aW5vZGUgc2l6ZT4gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgWyAtTCA8bGFiZWw+IF0gWyAtZiBdIFsgLWEgPGFuZHJvaWQgbW91bnRwb2ludD4gXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgWyAtUyBmaWxlX2NvbnRleHRzIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgIFsgLXogfCAtcyBdIFsgLXcgXSBbIC1jIF0gWyAtSiBdIFsgLXYgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgPGZpbGVuYW1lPiBbPGRpcmVjdG9yeT5dXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHQ7CisJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKmRpcmVjdG9yeSA9IE5VTEw7CisJY2hhciAqbW91bnRwb2ludCA9IE5VTEw7CisJZnNfY29uZmlnX2Z1bmNfdCBmc19jb25maWdfZnVuYyA9IE5VTEw7CisJaW50IGd6aXAgPSAwOworCWludCBzcGFyc2UgPSAwOworCWludCBjcmMgPSAwOworCWludCB3aXBlID0gMDsKKwlpbnQgZmQ7CisJaW50IGV4aXRjb2RlOworCWludCB2ZXJib3NlID0gMDsKKwlzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnNlaG5kID0gTlVMTDsKKyNpZm5kZWYgVVNFX01JTkdXCisJc3RydWN0IHNlbGludXhfb3B0IHNlb3B0c1tdID0geyB7IFNFTEFCRUxfT1BUX1BBVEgsICIiIH0gfTsKKyNlbmRpZgorCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImw6ajpiOmc6aTpJOkw6YTpTOmZ3ekpzY3R2IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2wnOgorCQkJaW5mby5sZW4gPSBwYXJzZV9udW0ob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdqJzoKKwkJCWluZm8uam91cm5hbF9ibG9ja3MgPSBwYXJzZV9udW0ob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWluZm8uYmxvY2tfc2l6ZSA9IHBhcnNlX251bShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJaW5mby5ibG9ja3NfcGVyX2dyb3VwID0gcGFyc2VfbnVtKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpbmZvLmlub2RlcyA9IHBhcnNlX251bShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ0knOgorCQkJaW5mby5pbm9kZV9zaXplID0gcGFyc2VfbnVtKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CisJCQlpbmZvLmxhYmVsID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJZm9yY2UgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorI2lmZGVmIEFORFJPSUQKKwkJCWZzX2NvbmZpZ19mdW5jID0gZnNfY29uZmlnOworCQkJbW91bnRwb2ludCA9IG9wdGFyZzsKKyNlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgImNhbid0IHNldCBhbmRyb2lkIHBlcm1pc3Npb25zIC0gYnVpbHQgd2l0aG91dCBhbmRyb2lkIHN1cHBvcnRcbiIpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXdpcGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3onOgorCQkJZ3ppcCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnSic6CisJCQlpbmZvLm5vX2pvdXJuYWwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJY3JjID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXNwYXJzZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IC10IChpbml0aWFsaXplIGlub2RlIHRhYmxlcykgaXMgZGVwcmVjYXRlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAnUyc6CisjaWZuZGVmIFVTRV9NSU5HVworCQkJc2VvcHRzWzBdLnZhbHVlID0gb3B0YXJnOworCQkJc2VobmQgPSBzZWxhYmVsX29wZW4oU0VMQUJFTF9DVFhfRklMRSwgc2VvcHRzLCAxKTsKKwkJCWlmICghc2VobmQpIHsKKwkJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2UgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qICc/JyAqLworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisKKyNpZiAhZGVmaW5lZChIT1NUKQorCS8vIFVzZSBvbmx5IGlmIC1TIG9wdGlvbiBub3QgcmVxdWVzdGVkCisJaWYgKCFzZWhuZCAmJiBtb3VudHBvaW50KSB7CisJCXNlaG5kID0gc2VsaW51eF9hbmRyb2lkX2ZpbGVfY29udGV4dF9oYW5kbGUoKTsKKworCQlpZiAoIXNlaG5kKSB7CisJCQlwZXJyb3Iob3B0YXJnKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHdpcGUgJiYgc3BhcnNlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNwZWNpZml5IGJvdGggd2lwZSBhbmQgc3BhcnNlXG4iKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAod2lwZSAmJiBnemlwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHNwZWNpZml5IGJvdGggd2lwZSBhbmQgZ3ppcFxuIik7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKG9wdGluZCA+PSBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXhwZWN0ZWQgZmlsZW5hbWUgYWZ0ZXIgb3B0aW9uc1xuIik7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJZmlsZW5hbWUgPSBhcmd2W29wdGluZCsrXTsKKworCWlmIChvcHRpbmQgPCBhcmdjKQorCQlkaXJlY3RvcnkgPSBhcmd2W29wdGluZCsrXTsKKworCWlmIChvcHRpbmQgPCBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBhcmd1bWVudDogJXNcbiIsIGFyZ3Zbb3B0aW5kXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJaWYgKHN0cmNtcChmaWxlbmFtZSwgIi0iKSkgeworCQlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY0NCk7CisJCWlmIChmZCA8IDApIHsKKwkJCXBlcnJvcigib3BlbiIpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gZWxzZSB7CisJCWZkID0gU1RET1VUX0ZJTEVOTzsKKwl9CisKKwlleGl0Y29kZSA9IG1ha2VfZXh0NGZzX2ludGVybmFsKGZkLCBkaXJlY3RvcnksIG1vdW50cG9pbnQsIGZzX2NvbmZpZ19mdW5jLCBnemlwLAorCQkJc3BhcnNlLCBjcmMsIHdpcGUsIHNlaG5kLCB2ZXJib3NlKTsKKwljbG9zZShmZCk7CisJaWYgKGV4aXRjb2RlICYmIHN0cmNtcChmaWxlbmFtZSwgIi0iKSkKKwkJdW5saW5rKGZpbGVuYW1lKTsKKwlyZXR1cm4gZXhpdGNvZGU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL21rdXNlcmltZy5zaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvbWt1c2VyaW1nLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0NDEyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL21rdXNlcmltZy5zaApAQCAtMCwwICsxLDYxIEBACisjIS9iaW4vYmFzaCAteAorIworIyBUbyBjYWxsIHRoaXMgc2NyaXB0LCBtYWtlIHN1cmUgbWFrZV9leHQ0ZnMgaXMgc29tZXdoZXJlIGluIFBBVEgKKworZnVuY3Rpb24gdXNhZ2UoKSB7CitjYXQ8PEVPVAorVXNhZ2U6Citta3VzZXJpbWcuc2ggWy1zXSBTUkNfRElSIE9VVFBVVF9GSUxFIEVYVF9WQVJJQU5UIE1PVU5UX1BPSU5UIFNJWkUgW0ZJTEVfQ09OVEVYVFNdCitFT1QKK30KKworZWNobyAiaW4gbWt1c2VyaW1nLnNoIFBBVEg9JFBBVEgiCisKK0VOQUJMRV9TUEFSU0VfSU1BR0U9CitpZiBbICIkMSIgPSAiLXMiIF07IHRoZW4KKyAgRU5BQkxFX1NQQVJTRV9JTUFHRT0iLXMiCisgIHNoaWZ0CitmaQorCitpZiBbICQjIC1uZSA1IC1hICQjIC1uZSA2IF07IHRoZW4KKyAgdXNhZ2UKKyAgZXhpdCAxCitmaQorCitTUkNfRElSPSQxCitpZiBbICEgLWQgJFNSQ19ESVIgXTsgdGhlbgorICBlY2hvICJDYW4gbm90IGZpbmQgZGlyZWN0b3J5ICRTUkNfRElSISIKKyAgZXhpdCAyCitmaQorCitPVVRQVVRfRklMRT0kMgorRVhUX1ZBUklBTlQ9JDMKK01PVU5UX1BPSU5UPSQ0CitTSVpFPSQ1CitGQz0kNgorCitjYXNlICRFWFRfVkFSSUFOVCBpbgorICBleHQ0KSA7OworICAqKSBlY2hvICJPbmx5IGV4dDQgaXMgc3VwcG9ydGVkISI7IGV4aXQgMyA7OworZXNhYworCitpZiBbIC16ICRNT1VOVF9QT0lOVCBdOyB0aGVuCisgIGVjaG8gIk1vdW50IHBvaW50IGlzIHJlcXVpcmVkIgorICBleGl0IDIKK2ZpCisKK2lmIFsgLXogJFNJWkUgXTsgdGhlbgorICBlY2hvICJOZWVkIHNpemUgb2YgZmlsZXN5c3RlbSIKKyAgZXhpdCAyCitmaQorCitpZiBbIC1uICIkRkMiIF07IHRoZW4KKyAgICBGQ09QVD0iLVMgJEZDIgorZmkKKworTUFLRV9FWFQ0RlNfQ01EPSJtYWtlX2V4dDRmcyAkRU5BQkxFX1NQQVJTRV9JTUFHRSAkRkNPUFQgLWwgJFNJWkUgLWEgJE1PVU5UX1BPSU5UICRPVVRQVVRfRklMRSAkU1JDX0RJUiIKK2VjaG8gJE1BS0VfRVhUNEZTX0NNRAorJE1BS0VfRVhUNEZTX0NNRAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgIGV4aXQgNAorZmkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvc2V0dXBfZnMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvc2V0dXBfZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM1NjNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy9zZXR1cF9mcy5jCkBAIC0wLDAgKzEsODUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9yZWJvb3QuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGN1dGlscy9hbmRyb2lkX3JlYm9vdC5oPgorI2luY2x1ZGUgPGN1dGlscy9wYXJ0aXRpb25fdXRpbHMuaD4KKworY29uc3QgY2hhciAqbWtmcyA9ICIvc3lzdGVtL2Jpbi9tYWtlX2V4dDRmcyI7CisKK2ludCBzZXR1cF9mcyhjb25zdCBjaGFyICpibG9ja2RldikKK3sKKyAgICBjaGFyIGJ1ZlsyNTZdLCBwYXRoWzEyOF07CisgICAgcGlkX3QgY2hpbGQ7CisgICAgaW50IHN0YXR1cywgbjsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICAgICAgLyogd2UgbWlnaHQgYmUgbG9va2luZyBhdCBhbiBpbmRpcmVjdCByZWZlcmVuY2UgKi8KKyAgICBuID0gcmVhZGxpbmsoYmxvY2tkZXYsIHBhdGgsIHNpemVvZihwYXRoKSAtIDEpOworICAgIGlmIChuID4gMCkgeworICAgICAgICBwYXRoW25dID0gMDsKKyAgICAgICAgaWYgKCFtZW1jbXAocGF0aCwgIi9kZXYvYmxvY2svIiwgMTEpKQorICAgICAgICAgICAgYmxvY2tkZXYgPSBwYXRoICsgMTE7CisgICAgfQorCisgICAgaWYgKHN0cmNocihibG9ja2RldiwnLycpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJub3QgYSBibG9jayBkZXZpY2UgbmFtZTogJXNcbiIsIGJsb2NrZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9zeXMvZnMvZXh0NC8lcyIsIGJsb2NrZGV2KTsKKyAgICBpZiAoYWNjZXNzKGJ1ZiwgRl9PSykgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZGV2aWNlICVzIGFscmVhZHkgaGFzIGEgZmlsZXN5c3RlbVxuIiwgYmxvY2tkZXYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9kZXYvYmxvY2svJXMiLCBibG9ja2Rldik7CisKKyAgICBpZiAoIXBhcnRpdGlvbl93aXBlZChidWYpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJkZXZpY2UgJXMgbm90IHdpcGVkLCBwcm9iYWJseSBlbmNyeXB0ZWQsIG5vdCB3aXBpbmdcbiIsIGJsb2NrZGV2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsIisrK1xuIik7CisKKyAgICBjaGlsZCA9IGZvcmsoKTsKKyAgICBpZiAoY2hpbGQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJlcnJvcjogc2V0dXBfZnM6IGZvcmsgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChjaGlsZCA9PSAwKSB7CisgICAgICAgIGV4ZWNsKG1rZnMsIG1rZnMsIGJ1ZiwgTlVMTCk7CisgICAgICAgIGV4aXQoLTEpOworICAgIH0KKworICAgIHdoaWxlICgocGlkPXdhaXRwaWQoLTEsICZzdGF0dXMsIDApKSAhPSBjaGlsZCkgeworICAgICAgICBpZiAocGlkID09IC0xKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBzZXR1cF9mczogd2FpdHBpZCBmYWlsZWQhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsIi0tLVxuIik7CisgICAgcmV0dXJuIDE7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBuZWVkX3JlYm9vdCA9IDA7CisKKyAgICB3aGlsZSAoYXJnYyA+IDEpIHsKKyAgICAgICAgaWYgKHN0cmxlbihhcmd2WzFdKSA8IDEyOCkKKyAgICAgICAgICAgIG5lZWRfcmVib290IHw9IHNldHVwX2ZzKGFyZ3ZbMV0pOworICAgICAgICBhcmd2Kys7CisgICAgICAgIGFyZ2MtLTsKKyAgICB9CisKKyAgICBpZiAobmVlZF9yZWJvb3QpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIlJFQk9PVCFcbiIpOworICAgICAgICBhbmRyb2lkX3JlYm9vdChBTkRST0lEX1JCX1JFU1RBUlQsIDAsIDApOworICAgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3NoYTEuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2VjMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3NoYTEuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoJJE5ldEJTRDogc2hhMS5jLHYgMS4xIDIwMDUvMTIvMjAgMjA6Mjk6NDAgY2hyaXN0b3MgRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBzaGExLmMsdiAxLjkgMTk5Ny8wNy8yMyAyMToxMjozMiBrc3RhaWxleSBFeHAgJAkqLworCisvKgorICogU0hBLTEgaW4gQworICogQnkgU3RldmUgUmVpZCA8c3RldmVAZWRtd2ViLmNvbT4KKyAqIDEwMCUgUHVibGljIERvbWFpbgorICoKKyAqIFRlc3QgVmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMSkKKyAqICJhYmMiCisgKiAgIEE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlECisgKiAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiCisgKiAgIDg0OTgzRTQ0IDFDM0JEMjZFIEJBQUU0QUExIEY5NTEyOUU1IEU1NDY3MEYxCisgKiBBIG1pbGxpb24gcmVwZXRpdGlvbnMgb2YgImEiCisgKiAgIDM0QUE5NzNDIEQ0QzREQUE0IEY2MUVFQjJCIERCQUQyNzMxIDY1MzQwMTZGCisgKi8KKworI2RlZmluZSBTSEExSEFORFNPRkYJCS8qIENvcGllcyBkYXRhIGJlZm9yZSBtZXNzaW5nIHdpdGggaXQuICovCisKKyNpZm5kZWYgVVNFX01JTkdXCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInNoYTEuaCIKKworI2lmIEhBVkVfTkJUT09MX0NPTkZJR19ICisjaW5jbHVkZSAibmJ0b29sX2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiAhSEFWRV9TSEExX0gKKworI2RlZmluZSByb2wodmFsdWUsIGJpdHMpICgoKHZhbHVlKSA8PCAoYml0cykpIHwgKCh2YWx1ZSkgPj4gKDMyIC0gKGJpdHMpKSkpCisKKy8qCisgKiBibGswKCkgYW5kIGJsaygpIHBlcmZvcm0gdGhlIGluaXRpYWwgZXhwYW5kLgorICogSSBnb3QgdGhlIGlkZWEgb2YgZXhwYW5kaW5nIGR1cmluZyB0aGUgcm91bmQgZnVuY3Rpb24gZnJvbSBTU0xlYXkKKyAqLworI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgorIyBkZWZpbmUgYmxrMChpKSAoYmxvY2stPmxbaV0gPSAocm9sKGJsb2NrLT5sW2ldLDI0KSYweEZGMDBGRjAwKSBcCisgICAgfChyb2woYmxvY2stPmxbaV0sOCkmMHgwMEZGMDBGRikpCisjZWxzZQorIyBkZWZpbmUgYmxrMChpKSBibG9jay0+bFtpXQorI2VuZGlmCisjZGVmaW5lIGJsayhpKSAoYmxvY2stPmxbaSYxNV0gPSByb2woYmxvY2stPmxbKGkrMTMpJjE1XV5ibG9jay0+bFsoaSs4KSYxNV0gXAorICAgIF5ibG9jay0+bFsoaSsyKSYxNV1eYmxvY2stPmxbaSYxNV0sMSkpCisKKy8qCisgKiAoUjArUjEpLCBSMiwgUjMsIFI0IGFyZSB0aGUgZGlmZmVyZW50IG9wZXJhdGlvbnMgKHJvdW5kcykgdXNlZCBpbiBTSEExCisgKi8KKyNkZWZpbmUgUjAodix3LHgseSx6LGkpIHorPSgodyYoeF55KSleeSkrYmxrMChpKSsweDVBODI3OTk5K3JvbCh2LDUpO3c9cm9sKHcsMzApOworI2RlZmluZSBSMSh2LHcseCx5LHosaSkgeis9KCh3Jih4XnkpKV55KStibGsoaSkrMHg1QTgyNzk5OStyb2wodiw1KTt3PXJvbCh3LDMwKTsKKyNkZWZpbmUgUjIodix3LHgseSx6LGkpIHorPSh3XnheeSkrYmxrKGkpKzB4NkVEOUVCQTErcm9sKHYsNSk7dz1yb2wodywzMCk7CisjZGVmaW5lIFIzKHYsdyx4LHkseixpKSB6Kz0oKCh3fHgpJnkpfCh3JngpKStibGsoaSkrMHg4RjFCQkNEQytyb2wodiw1KTt3PXJvbCh3LDMwKTsKKyNkZWZpbmUgUjQodix3LHgseSx6LGkpIHorPSh3XnheeSkrYmxrKGkpKzB4Q0E2MkMxRDYrcm9sKHYsNSk7dz1yb2wodywzMCk7CisKK3R5cGVkZWYgdW5pb24geworICAgIHVfY2hhciBjWzY0XTsKKyAgICB1X2ludCBsWzE2XTsKK30gQ0hBUjY0TE9ORzE2OworCisvKiBvbGQgc3BhcmM2NCBnY2MgY291bGQgbm90IGNvbXBpbGUgdGhpcyAqLworI3VuZGVmIFNQQVJDNjRfR0NDX1dPUktBUk9VTkQKKyNpZiBkZWZpbmVkKF9fc3BhcmM2NF9fKSAmJiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8IDMKKyNkZWZpbmUgU1BBUkM2NF9HQ0NfV09SS0FST1VORAorI2VuZGlmCisKKyNpZmRlZiBTUEFSQzY0X0dDQ19XT1JLQVJPVU5ECit2b2lkIGRvX1IwMSh1X2ludDMyX3QgKmEsIHVfaW50MzJfdCAqYiwgdV9pbnQzMl90ICpjLCB1X2ludDMyX3QgKmQsIHVfaW50MzJfdCAqZSwgQ0hBUjY0TE9ORzE2ICopOwordm9pZCBkb19SMih1X2ludDMyX3QgKmEsIHVfaW50MzJfdCAqYiwgdV9pbnQzMl90ICpjLCB1X2ludDMyX3QgKmQsIHVfaW50MzJfdCAqZSwgQ0hBUjY0TE9ORzE2ICopOwordm9pZCBkb19SMyh1X2ludDMyX3QgKmEsIHVfaW50MzJfdCAqYiwgdV9pbnQzMl90ICpjLCB1X2ludDMyX3QgKmQsIHVfaW50MzJfdCAqZSwgQ0hBUjY0TE9ORzE2ICopOwordm9pZCBkb19SNCh1X2ludDMyX3QgKmEsIHVfaW50MzJfdCAqYiwgdV9pbnQzMl90ICpjLCB1X2ludDMyX3QgKmQsIHVfaW50MzJfdCAqZSwgQ0hBUjY0TE9ORzE2ICopOworCisjZGVmaW5lIG5SMCh2LHcseCx5LHosaSkgUjAoKnYsKncsKngsKnksKnosaSkKKyNkZWZpbmUgblIxKHYsdyx4LHkseixpKSBSMSgqdiwqdywqeCwqeSwqeixpKQorI2RlZmluZSBuUjIodix3LHgseSx6LGkpIFIyKCp2LCp3LCp4LCp5LCp6LGkpCisjZGVmaW5lIG5SMyh2LHcseCx5LHosaSkgUjMoKnYsKncsKngsKnksKnosaSkKKyNkZWZpbmUgblI0KHYsdyx4LHkseixpKSBSNCgqdiwqdywqeCwqeSwqeixpKQorCit2b2lkCitkb19SMDEodV9pbnQzMl90ICphLCB1X2ludDMyX3QgKmIsIHVfaW50MzJfdCAqYywgdV9pbnQzMl90ICpkLCB1X2ludDMyX3QgKmUsIENIQVI2NExPTkcxNiAqYmxvY2spCit7CisgICAgblIwKGEsYixjLGQsZSwgMCk7IG5SMChlLGEsYixjLGQsIDEpOyBuUjAoZCxlLGEsYixjLCAyKTsgblIwKGMsZCxlLGEsYiwgMyk7CisgICAgblIwKGIsYyxkLGUsYSwgNCk7IG5SMChhLGIsYyxkLGUsIDUpOyBuUjAoZSxhLGIsYyxkLCA2KTsgblIwKGQsZSxhLGIsYywgNyk7CisgICAgblIwKGMsZCxlLGEsYiwgOCk7IG5SMChiLGMsZCxlLGEsIDkpOyBuUjAoYSxiLGMsZCxlLDEwKTsgblIwKGUsYSxiLGMsZCwxMSk7CisgICAgblIwKGQsZSxhLGIsYywxMik7IG5SMChjLGQsZSxhLGIsMTMpOyBuUjAoYixjLGQsZSxhLDE0KTsgblIwKGEsYixjLGQsZSwxNSk7CisgICAgblIxKGUsYSxiLGMsZCwxNik7IG5SMShkLGUsYSxiLGMsMTcpOyBuUjEoYyxkLGUsYSxiLDE4KTsgblIxKGIsYyxkLGUsYSwxOSk7Cit9CisKK3ZvaWQKK2RvX1IyKHVfaW50MzJfdCAqYSwgdV9pbnQzMl90ICpiLCB1X2ludDMyX3QgKmMsIHVfaW50MzJfdCAqZCwgdV9pbnQzMl90ICplLCBDSEFSNjRMT05HMTYgKmJsb2NrKQoreworICAgIG5SMihhLGIsYyxkLGUsMjApOyBuUjIoZSxhLGIsYyxkLDIxKTsgblIyKGQsZSxhLGIsYywyMik7IG5SMihjLGQsZSxhLGIsMjMpOworICAgIG5SMihiLGMsZCxlLGEsMjQpOyBuUjIoYSxiLGMsZCxlLDI1KTsgblIyKGUsYSxiLGMsZCwyNik7IG5SMihkLGUsYSxiLGMsMjcpOworICAgIG5SMihjLGQsZSxhLGIsMjgpOyBuUjIoYixjLGQsZSxhLDI5KTsgblIyKGEsYixjLGQsZSwzMCk7IG5SMihlLGEsYixjLGQsMzEpOworICAgIG5SMihkLGUsYSxiLGMsMzIpOyBuUjIoYyxkLGUsYSxiLDMzKTsgblIyKGIsYyxkLGUsYSwzNCk7IG5SMihhLGIsYyxkLGUsMzUpOworICAgIG5SMihlLGEsYixjLGQsMzYpOyBuUjIoZCxlLGEsYixjLDM3KTsgblIyKGMsZCxlLGEsYiwzOCk7IG5SMihiLGMsZCxlLGEsMzkpOworfQorCit2b2lkCitkb19SMyh1X2ludDMyX3QgKmEsIHVfaW50MzJfdCAqYiwgdV9pbnQzMl90ICpjLCB1X2ludDMyX3QgKmQsIHVfaW50MzJfdCAqZSwgQ0hBUjY0TE9ORzE2ICpibG9jaykKK3sKKyAgICBuUjMoYSxiLGMsZCxlLDQwKTsgblIzKGUsYSxiLGMsZCw0MSk7IG5SMyhkLGUsYSxiLGMsNDIpOyBuUjMoYyxkLGUsYSxiLDQzKTsKKyAgICBuUjMoYixjLGQsZSxhLDQ0KTsgblIzKGEsYixjLGQsZSw0NSk7IG5SMyhlLGEsYixjLGQsNDYpOyBuUjMoZCxlLGEsYixjLDQ3KTsKKyAgICBuUjMoYyxkLGUsYSxiLDQ4KTsgblIzKGIsYyxkLGUsYSw0OSk7IG5SMyhhLGIsYyxkLGUsNTApOyBuUjMoZSxhLGIsYyxkLDUxKTsKKyAgICBuUjMoZCxlLGEsYixjLDUyKTsgblIzKGMsZCxlLGEsYiw1Myk7IG5SMyhiLGMsZCxlLGEsNTQpOyBuUjMoYSxiLGMsZCxlLDU1KTsKKyAgICBuUjMoZSxhLGIsYyxkLDU2KTsgblIzKGQsZSxhLGIsYyw1Nyk7IG5SMyhjLGQsZSxhLGIsNTgpOyBuUjMoYixjLGQsZSxhLDU5KTsKK30KKwordm9pZAorZG9fUjQodV9pbnQzMl90ICphLCB1X2ludDMyX3QgKmIsIHVfaW50MzJfdCAqYywgdV9pbnQzMl90ICpkLCB1X2ludDMyX3QgKmUsIENIQVI2NExPTkcxNiAqYmxvY2spCit7CisgICAgblI0KGEsYixjLGQsZSw2MCk7IG5SNChlLGEsYixjLGQsNjEpOyBuUjQoZCxlLGEsYixjLDYyKTsgblI0KGMsZCxlLGEsYiw2Myk7CisgICAgblI0KGIsYyxkLGUsYSw2NCk7IG5SNChhLGIsYyxkLGUsNjUpOyBuUjQoZSxhLGIsYyxkLDY2KTsgblI0KGQsZSxhLGIsYyw2Nyk7CisgICAgblI0KGMsZCxlLGEsYiw2OCk7IG5SNChiLGMsZCxlLGEsNjkpOyBuUjQoYSxiLGMsZCxlLDcwKTsgblI0KGUsYSxiLGMsZCw3MSk7CisgICAgblI0KGQsZSxhLGIsYyw3Mik7IG5SNChjLGQsZSxhLGIsNzMpOyBuUjQoYixjLGQsZSxhLDc0KTsgblI0KGEsYixjLGQsZSw3NSk7CisgICAgblI0KGUsYSxiLGMsZCw3Nik7IG5SNChkLGUsYSxiLGMsNzcpOyBuUjQoYyxkLGUsYSxiLDc4KTsgblI0KGIsYyxkLGUsYSw3OSk7Cit9CisjZW5kaWYKKworLyoKKyAqIEhhc2ggYSBzaW5nbGUgNTEyLWJpdCBibG9jay4gVGhpcyBpcyB0aGUgY29yZSBvZiB0aGUgYWxnb3JpdGhtLgorICovCit2b2lkIFNIQTFUcmFuc2Zvcm0oc3RhdGUsIGJ1ZmZlcikKKyAgICB1X2ludDMyX3Qgc3RhdGVbNV07CisgICAgY29uc3QgdV9jaGFyIGJ1ZmZlcls2NF07Cit7CisgICAgdV9pbnQzMl90IGEsIGIsIGMsIGQsIGU7CisgICAgQ0hBUjY0TE9ORzE2ICpibG9jazsKKworI2lmZGVmIFNIQTFIQU5EU09GRgorICAgIENIQVI2NExPTkcxNiB3b3Jrc3BhY2U7CisjZW5kaWYKKworICAgIGFzc2VydChidWZmZXIgIT0gMCk7CisgICAgYXNzZXJ0KHN0YXRlICE9IDApOworCisjaWZkZWYgU0hBMUhBTkRTT0ZGCisgICAgYmxvY2sgPSAmd29ya3NwYWNlOworICAgICh2b2lkKW1lbWNweShibG9jaywgYnVmZmVyLCA2NCk7CisjZWxzZQorICAgIGJsb2NrID0gKENIQVI2NExPTkcxNiAqKSh2b2lkICopYnVmZmVyOworI2VuZGlmCisKKyAgICAvKiBDb3B5IGNvbnRleHQtPnN0YXRlW10gdG8gd29ya2luZyB2YXJzICovCisgICAgYSA9IHN0YXRlWzBdOworICAgIGIgPSBzdGF0ZVsxXTsKKyAgICBjID0gc3RhdGVbMl07CisgICAgZCA9IHN0YXRlWzNdOworICAgIGUgPSBzdGF0ZVs0XTsKKworI2lmZGVmIFNQQVJDNjRfR0NDX1dPUktBUk9VTkQKKyAgICBkb19SMDEoJmEsICZiLCAmYywgJmQsICZlLCBibG9jayk7CisgICAgZG9fUjIoJmEsICZiLCAmYywgJmQsICZlLCBibG9jayk7CisgICAgZG9fUjMoJmEsICZiLCAmYywgJmQsICZlLCBibG9jayk7CisgICAgZG9fUjQoJmEsICZiLCAmYywgJmQsICZlLCBibG9jayk7CisjZWxzZQorICAgIC8qIDQgcm91bmRzIG9mIDIwIG9wZXJhdGlvbnMgZWFjaC4gTG9vcCB1bnJvbGxlZC4gKi8KKyAgICBSMChhLGIsYyxkLGUsIDApOyBSMChlLGEsYixjLGQsIDEpOyBSMChkLGUsYSxiLGMsIDIpOyBSMChjLGQsZSxhLGIsIDMpOworICAgIFIwKGIsYyxkLGUsYSwgNCk7IFIwKGEsYixjLGQsZSwgNSk7IFIwKGUsYSxiLGMsZCwgNik7IFIwKGQsZSxhLGIsYywgNyk7CisgICAgUjAoYyxkLGUsYSxiLCA4KTsgUjAoYixjLGQsZSxhLCA5KTsgUjAoYSxiLGMsZCxlLDEwKTsgUjAoZSxhLGIsYyxkLDExKTsKKyAgICBSMChkLGUsYSxiLGMsMTIpOyBSMChjLGQsZSxhLGIsMTMpOyBSMChiLGMsZCxlLGEsMTQpOyBSMChhLGIsYyxkLGUsMTUpOworICAgIFIxKGUsYSxiLGMsZCwxNik7IFIxKGQsZSxhLGIsYywxNyk7IFIxKGMsZCxlLGEsYiwxOCk7IFIxKGIsYyxkLGUsYSwxOSk7CisgICAgUjIoYSxiLGMsZCxlLDIwKTsgUjIoZSxhLGIsYyxkLDIxKTsgUjIoZCxlLGEsYixjLDIyKTsgUjIoYyxkLGUsYSxiLDIzKTsKKyAgICBSMihiLGMsZCxlLGEsMjQpOyBSMihhLGIsYyxkLGUsMjUpOyBSMihlLGEsYixjLGQsMjYpOyBSMihkLGUsYSxiLGMsMjcpOworICAgIFIyKGMsZCxlLGEsYiwyOCk7IFIyKGIsYyxkLGUsYSwyOSk7IFIyKGEsYixjLGQsZSwzMCk7IFIyKGUsYSxiLGMsZCwzMSk7CisgICAgUjIoZCxlLGEsYixjLDMyKTsgUjIoYyxkLGUsYSxiLDMzKTsgUjIoYixjLGQsZSxhLDM0KTsgUjIoYSxiLGMsZCxlLDM1KTsKKyAgICBSMihlLGEsYixjLGQsMzYpOyBSMihkLGUsYSxiLGMsMzcpOyBSMihjLGQsZSxhLGIsMzgpOyBSMihiLGMsZCxlLGEsMzkpOworICAgIFIzKGEsYixjLGQsZSw0MCk7IFIzKGUsYSxiLGMsZCw0MSk7IFIzKGQsZSxhLGIsYyw0Mik7IFIzKGMsZCxlLGEsYiw0Myk7CisgICAgUjMoYixjLGQsZSxhLDQ0KTsgUjMoYSxiLGMsZCxlLDQ1KTsgUjMoZSxhLGIsYyxkLDQ2KTsgUjMoZCxlLGEsYixjLDQ3KTsKKyAgICBSMyhjLGQsZSxhLGIsNDgpOyBSMyhiLGMsZCxlLGEsNDkpOyBSMyhhLGIsYyxkLGUsNTApOyBSMyhlLGEsYixjLGQsNTEpOworICAgIFIzKGQsZSxhLGIsYyw1Mik7IFIzKGMsZCxlLGEsYiw1Myk7IFIzKGIsYyxkLGUsYSw1NCk7IFIzKGEsYixjLGQsZSw1NSk7CisgICAgUjMoZSxhLGIsYyxkLDU2KTsgUjMoZCxlLGEsYixjLDU3KTsgUjMoYyxkLGUsYSxiLDU4KTsgUjMoYixjLGQsZSxhLDU5KTsKKyAgICBSNChhLGIsYyxkLGUsNjApOyBSNChlLGEsYixjLGQsNjEpOyBSNChkLGUsYSxiLGMsNjIpOyBSNChjLGQsZSxhLGIsNjMpOworICAgIFI0KGIsYyxkLGUsYSw2NCk7IFI0KGEsYixjLGQsZSw2NSk7IFI0KGUsYSxiLGMsZCw2Nik7IFI0KGQsZSxhLGIsYyw2Nyk7CisgICAgUjQoYyxkLGUsYSxiLDY4KTsgUjQoYixjLGQsZSxhLDY5KTsgUjQoYSxiLGMsZCxlLDcwKTsgUjQoZSxhLGIsYyxkLDcxKTsKKyAgICBSNChkLGUsYSxiLGMsNzIpOyBSNChjLGQsZSxhLGIsNzMpOyBSNChiLGMsZCxlLGEsNzQpOyBSNChhLGIsYyxkLGUsNzUpOworICAgIFI0KGUsYSxiLGMsZCw3Nik7IFI0KGQsZSxhLGIsYyw3Nyk7IFI0KGMsZCxlLGEsYiw3OCk7IFI0KGIsYyxkLGUsYSw3OSk7CisjZW5kaWYKKworICAgIC8qIEFkZCB0aGUgd29ya2luZyB2YXJzIGJhY2sgaW50byBjb250ZXh0LnN0YXRlW10gKi8KKyAgICBzdGF0ZVswXSArPSBhOworICAgIHN0YXRlWzFdICs9IGI7CisgICAgc3RhdGVbMl0gKz0gYzsKKyAgICBzdGF0ZVszXSArPSBkOworICAgIHN0YXRlWzRdICs9IGU7CisKKyAgICAvKiBXaXBlIHZhcmlhYmxlcyAqLworICAgIGEgPSBiID0gYyA9IGQgPSBlID0gMDsKK30KKworCisvKgorICogU0hBMUluaXQgLSBJbml0aWFsaXplIG5ldyBjb250ZXh0CisgKi8KK3ZvaWQgU0hBMUluaXQoY29udGV4dCkKKyAgICBTSEExX0NUWCAqY29udGV4dDsKK3sKKworICAgIGFzc2VydChjb250ZXh0ICE9IDApOworCisgICAgLyogU0hBMSBpbml0aWFsaXphdGlvbiBjb25zdGFudHMgKi8KKyAgICBjb250ZXh0LT5zdGF0ZVswXSA9IDB4Njc0NTIzMDE7CisgICAgY29udGV4dC0+c3RhdGVbMV0gPSAweEVGQ0RBQjg5OworICAgIGNvbnRleHQtPnN0YXRlWzJdID0gMHg5OEJBRENGRTsKKyAgICBjb250ZXh0LT5zdGF0ZVszXSA9IDB4MTAzMjU0NzY7CisgICAgY29udGV4dC0+c3RhdGVbNF0gPSAweEMzRDJFMUYwOworICAgIGNvbnRleHQtPmNvdW50WzBdID0gY29udGV4dC0+Y291bnRbMV0gPSAwOworfQorCisKKy8qCisgKiBSdW4geW91ciBkYXRhIHRocm91Z2ggdGhpcy4KKyAqLwordm9pZCBTSEExVXBkYXRlKGNvbnRleHQsIGRhdGEsIGxlbikKKyAgICBTSEExX0NUWCAqY29udGV4dDsKKyAgICBjb25zdCB1X2NoYXIgKmRhdGE7CisgICAgdV9pbnQgbGVuOworeworICAgIHVfaW50IGksIGo7CisKKyAgICBhc3NlcnQoY29udGV4dCAhPSAwKTsKKyAgICBhc3NlcnQoZGF0YSAhPSAwKTsKKworICAgIGogPSBjb250ZXh0LT5jb3VudFswXTsKKyAgICBpZiAoKGNvbnRleHQtPmNvdW50WzBdICs9IGxlbiA8PCAzKSA8IGopCisJY29udGV4dC0+Y291bnRbMV0gKz0gKGxlbj4+MjkpKzE7CisgICAgaiA9IChqID4+IDMpICYgNjM7CisgICAgaWYgKChqICsgbGVuKSA+IDYzKSB7CisJKHZvaWQpbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbal0sIGRhdGEsIChpID0gNjQtaikpOworCVNIQTFUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsIGNvbnRleHQtPmJ1ZmZlcik7CisJZm9yICggOyBpICsgNjMgPCBsZW47IGkgKz0gNjQpCisJICAgIFNIQTFUcmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZkYXRhW2ldKTsKKwlqID0gMDsKKyAgICB9IGVsc2UgeworCWkgPSAwOworICAgIH0KKyAgICAodm9pZCltZW1jcHkoJmNvbnRleHQtPmJ1ZmZlcltqXSwgJmRhdGFbaV0sIGxlbiAtIGkpOworfQorCisKKy8qCisgKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4KKyAqLwordm9pZCBTSEExRmluYWwoZGlnZXN0LCBjb250ZXh0KQorICAgIHVfY2hhciBkaWdlc3RbMjBdOworICAgIFNIQTFfQ1RYKiBjb250ZXh0OworeworICAgIHVfaW50IGk7CisgICAgdV9jaGFyIGZpbmFsY291bnRbOF07CisKKyAgICBhc3NlcnQoZGlnZXN0ICE9IDApOworICAgIGFzc2VydChjb250ZXh0ICE9IDApOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCWZpbmFsY291bnRbaV0gPSAodV9jaGFyKSgoY29udGV4dC0+Y291bnRbKGkgPj0gNCA/IDAgOiAxKV0KKwkgPj4gKCgzLShpICYgMykpICogOCkgKSAmIDI1NSk7CSAvKiBFbmRpYW4gaW5kZXBlbmRlbnQgKi8KKyAgICB9CisgICAgU0hBMVVwZGF0ZShjb250ZXh0LCAoY29uc3QgdV9jaGFyICopIlwyMDAiLCAxKTsKKyAgICB3aGlsZSAoKGNvbnRleHQtPmNvdW50WzBdICYgNTA0KSAhPSA0NDgpCisJU0hBMVVwZGF0ZShjb250ZXh0LCAoY29uc3QgdV9jaGFyICopIlwwIiwgMSk7CisgICAgU0hBMVVwZGF0ZShjb250ZXh0LCBmaW5hbGNvdW50LCA4KTsgIC8qIFNob3VsZCBjYXVzZSBhIFNIQTFUcmFuc2Zvcm0oKSAqLworCisgICAgaWYgKGRpZ2VzdCkgeworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQorCSAgICBkaWdlc3RbaV0gPSAodV9jaGFyKQorCQkoKGNvbnRleHQtPnN0YXRlW2k+PjJdID4+ICgoMy0oaSAmIDMpKSAqIDgpICkgJiAyNTUpOworICAgIH0KK30KKworI2VuZGlmIC8qIEhBVkVfU0hBMV9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3NoYTEuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvc2hhMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGY3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3NoYTEuaApAQCAtMCwwICsxLDQzIEBACisvKgkkTmV0QlNEOiBzaGExLmgsdiAxLjEzIDIwMDUvMTIvMjYgMTg6NDE6MzYgcGVycnkgRXhwICQJKi8KKworLyoKKyAqIFNIQS0xIGluIEMKKyAqIEJ5IFN0ZXZlIFJlaWQgPHN0ZXZlQGVkbXdlYi5jb20+CisgKiAxMDAlIFB1YmxpYyBEb21haW4KKyAqLworCisjaWZuZGVmIF9TWVNfU0hBMV9IXworI2RlZmluZQlfU1lTX1NIQTFfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgVVNFX01JTkdXCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdV9jaGFyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKKworI2RlZmluZSBfX0JFR0lOX0RFQ0xTCisjZGVmaW5lIF9fRU5EX0RFQ0xTCisjZWxzZQorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0hBMV9ESUdFU1RfTEVOR1RICQkyMAorI2RlZmluZSBTSEExX0RJR0VTVF9TVFJJTkdfTEVOR1RICTQxCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50MzJfdCBzdGF0ZVs1XTsKKwl1aW50MzJfdCBjb3VudFsyXTsKKwl1X2NoYXIgYnVmZmVyWzY0XTsKK30gU0hBMV9DVFg7CisKK19fQkVHSU5fREVDTFMKK3ZvaWQJU0hBMVRyYW5zZm9ybSh1aW50MzJfdFs1XSwgY29uc3QgdV9jaGFyWzY0XSk7Cit2b2lkCVNIQTFJbml0KFNIQTFfQ1RYICopOwordm9pZAlTSEExVXBkYXRlKFNIQTFfQ1RYICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Cit2b2lkCVNIQTFGaW5hbCh1X2NoYXJbU0hBMV9ESUdFU1RfTEVOR1RIXSwgU0hBMV9DVFggKik7CitfX0VORF9ERUNMUworCisjZW5kaWYgLyogX1NZU19TSEExX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3Rlc3RfZXh0NGZpeHVwIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy90ZXN0X2V4dDRmaXh1cApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTIwYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy90ZXN0X2V4dDRmaXh1cApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vYmFzaAorCit0eXBlc2V0IC1pIEkgSVRFUkFUSU9OUyBQSEFTRSBMT0MgQ09VTlQgTUFYQ09VTlQKKworTUU9YGJhc2VuYW1lICQwYAorCitpZiBbICIkIyIgLW5lIDMgXQordGhlbgorICBlY2hvICIkTUU6IFVzYWdlOiAkTUUgPGl0ZXJhdGlvbnM+IDxtYXhjb3VudD4gPGZpbGVzeXN0ZW1faW1hZ2U+IiA+JjIKKyAgZXhpdCAxOworZmkKKworSVRFUkFUSU9OUz0iJDEiCitNQVhDT1VOVD0iJDIiCitPUklHX0ZTX0lNQUdFPSIkMyIKK0ZJWEVEX0ZTX0lNQUdFPSIvdG1wL2ZpeGVkZnNpbWFnZS4kJCIKK05FV19GU19JTUFHRT0iL3RtcC9uZXdmc2ltYWdlLiQkIgorCitpZiBbICEgLWYgIiRPUklHX0ZTX0lNQUdFIiBdCit0aGVuCisgIGVjaG8gIiRNRTogRmlsZXN5c3RlbSBpbWFnZSAkTkVXX0ZTX0lNQUdFIGRvZXMgbm90IGV4aXN0IiA+JjIKKyAgZXhpdCAxCitmaQorCit0cmFwICJybSAtZiAkTkVXX0ZTX0lNQUdFICRGSVhFRF9GU19JTUFHRSIgMCAxIDIgMyAxNQorCitybSAtZiAiJE5FV19GU19JTUFHRSIgIiRGSVhFRF9GU19JTUFHRSIKKworIyBDcmVhdGUgdGhlIGZpeGVkIGltYWdlIHRvIGNvbXBhcmUgYWdhaW5zdAorY3AgIiRPUklHX0ZTX0lNQUdFIiAiJEZJWEVEX0ZTX0lNQUdFIgorZXh0NGZpeHVwICIkRklYRURfRlNfSU1BR0UiCisKK2lmIFsgIiQ/IiAtbmUgMCBdCit0aGVuCisgIGVjaG8gIiRNRTogZXh0NGZpeHVwIGZhaWxlZCFcbiIKKyAgZXhpdCAxCitmaQorCitJPTAKK3doaWxlIFsgIiRJIiAtbHQgIiRJVEVSQVRJT05TIiBdCitkbworICAjIFRoZXJlIGlzIGFsc28gYSBwaGFzZSA0LCB3aGljaCBpcyB3cml0aW5nIG91dCB0aGUgdXBkYXRlZCBzdXBlcmJsb2NrcyBhbmQKKyAgIyBibG9jayBncm91cCBkZXNjcmlwdG9ycy4gIFRlc3QgdGhlIHdpdGggYSBzZXBhcmF0ZSBzY3JpcHQuCisgIGxldCBQSEFTRT0iJFJBTkRPTSIlMyAgICAgICAgICMgMCB0byAyCisgIGxldCBQSEFTRSsrICAgICAgICAgICAgICAgICAgICMgMSB0byAzCisgIGxldCBMT0M9IiRSQU5ET00iJTIgICAgICAgICAgICMgMCB0byAxCisgIGxldCBMT0MrKyAgICAgICAgICAgICAgICAgICAgICMgMSB0byAyCisgIGxldCBDT1VOVD0iJFJBTkRPTSIlIiRNQVhDT1VOVCIKKworICAjIE1ha2UgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBpbWFnZSB0byBmaXh1cAorICBjcCAiJE9SSUdfRlNfSU1BR0UiICIkTkVXX0ZTX0lNQUdFIgorCisgICMgUnVuIHRoZSBmaXh1cCB0b29sLCBidXQgZGllIHBhcnR3YXkgdGhyb3VnaCB0byBzZWUgaWYgd2UgY2FuIHJlY292ZXIKKyAgZXh0NGZpeHVwIC1kICIkUEhBU0UsJExPQywkQ09VTlQiICIkTkVXX0ZTX0lNQUdFIiAyPi9kZXYvbnVsbAorIAorICAjIHJ1biBpdCBhZ2FpbiB3aXRob3V0IC1kIHRvIGhhdmUgaXQgZmluaXNoIHRoZSBqb2IKKyAgZXh0NGZpeHVwICIkTkVXX0ZTX0lNQUdFIgorCisgIGlmIGNtcCAiJEZJWEVEX0ZTX0lNQUdFIiAiJE5FV19GU19JTUFHRSIKKyAgdGhlbgorICAgIDoKKyAgZWxzZQorICAgIGVjaG8gIiRNRTogdGVzdCBmYWlsZWQgd2l0aCBwYXJhbWV0ZXJzICRQSEFTRSwgJExPQywgJENPVU5UIgorICAgIGV4aXQgMQorICBmaQorCisgIHJtIC1mICIkTkVXX0ZTX0lNQUdFIgorCisgIGxldCBJKysKK2RvbmUKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy91dWlkLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2QyNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy91dWlkLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIFVTRV9NSU5HVworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisjZWxzZQorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJleHQ0X3V0aWxzLmgiCisjaW5jbHVkZSAic2hhMS5oIgorI2luY2x1ZGUgInV1aWQuaCIKKworLyogRGVmaW5pdGlvbiBmcm9tIFJGQy00MTIyICovCitzdHJ1Y3QgdXVpZCB7CisJdTMyIHRpbWVfbG93OworCXUxNiB0aW1lX21pZDsKKwl1MTYgdGltZV9oaV9hbmRfdmVyc2lvbjsKKwl1OCBjbGtfc2VxX2hpX3JlczsKKwl1OCBjbGtfc2VxX2xvdzsKKwl1MTYgbm9kZTBfMTsKKwl1MzIgbm9kZTJfNTsKK307CisKK3N0YXRpYyB2b2lkIHNoYTFfaGFzaChjb25zdCBjaGFyICpuYW1lc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUsCisJdW5zaWduZWQgY2hhciBzaGExW1NIQTFfRElHRVNUX0xFTkdUSF0pCit7CisJU0hBMV9DVFggY3R4OworCVNIQTFJbml0KCZjdHgpOworCVNIQTFVcGRhdGUoJmN0eCwgKGNvbnN0IHU4KiluYW1lc3BhY2UsIHN0cmxlbihuYW1lc3BhY2UpKTsKKwlTSEExVXBkYXRlKCZjdHgsIChjb25zdCB1OCopbmFtZSwgc3RybGVuKG5hbWUpKTsKKwlTSEExRmluYWwoc2hhMSwgJmN0eCk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfdXVpZChjb25zdCBjaGFyICpuYW1lc3BhY2UsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJlc3VsdFsxNl0pCit7CisJdW5zaWduZWQgY2hhciBzaGExW1NIQTFfRElHRVNUX0xFTkdUSF07CisJc3RydWN0IHV1aWQgKnV1aWQgPSAoc3RydWN0IHV1aWQgKilyZXN1bHQ7CisKKwlzaGExX2hhc2gobmFtZXNwYWNlLCBuYW1lLCAodW5zaWduZWQgY2hhciopc2hhMSk7CisJbWVtY3B5KHV1aWQsIHNoYTEsIHNpemVvZihzdHJ1Y3QgdXVpZCkpOworCisJdXVpZC0+dGltZV9sb3cgPSBudG9obCh1dWlkLT50aW1lX2xvdyk7CisJdXVpZC0+dGltZV9taWQgPSBudG9ocyh1dWlkLT50aW1lX21pZCk7CisJdXVpZC0+dGltZV9oaV9hbmRfdmVyc2lvbiA9IG50b2hzKHV1aWQtPnRpbWVfaGlfYW5kX3ZlcnNpb24pOworCXV1aWQtPnRpbWVfaGlfYW5kX3ZlcnNpb24gJj0gMHgwRkZGOworCXV1aWQtPnRpbWVfaGlfYW5kX3ZlcnNpb24gfD0gKDUgPDwgMTIpOworCXV1aWQtPmNsa19zZXFfaGlfcmVzICY9IH4oMSA8PCA2KTsKKwl1dWlkLT5jbGtfc2VxX2hpX3JlcyB8PSAxIDw8IDc7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3V1aWQuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvdXVpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWI0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3V1aWQuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVVVJRF9IXworI2RlZmluZSBfVVVJRF9IXworCisjaW5jbHVkZSAiZXh0NF91dGlscy5oIgorCit2b2lkIGdlbmVyYXRlX3V1aWQoY29uc3QgY2hhciAqbmFtZXNwYWNlLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXN1bHRbMTZdKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3dpcGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZXh0NF91dGlscy9zcmMvd2lwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjY2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3dpcGUuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKyNpbmNsdWRlICJ3aXBlLmgiCisKKyNpZiBXSVBFX0lTX1NVUFBPUlRFRAorCisjaWYgZGVmaW5lZChfX2xpbnV4X18pCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCisjaWZuZGVmIEJMS0RJU0NBUkQKKyNkZWZpbmUgQkxLRElTQ0FSRCBfSU8oMHgxMiwxMTkpCisjZW5kaWYKKworI2lmbmRlZiBCTEtTRUNESVNDQVJECisjZGVmaW5lIEJMS1NFQ0RJU0NBUkQgX0lPKDB4MTIsMTI1KQorI2VuZGlmCisKK2ludCB3aXBlX2Jsb2NrX2RldmljZShpbnQgZmQsIHM2NCBsZW4pCit7CisJdTY0IHJhbmdlWzJdOworCWludCByZXQ7CisKKwlpZiAoIWlzX2Jsb2NrX2RldmljZV9mZChmZCkpIHsKKwkJLy8gV2lwaW5nIG9ubHkgbWFrZXMgc2Vuc2Ugb24gYSBibG9jayBkZXZpY2UuCisJCXJldHVybiAwOworCX0KKworCXJhbmdlWzBdID0gMDsKKwlyYW5nZVsxXSA9IGxlbjsKKwlyZXQgPSBpb2N0bChmZCwgQkxLU0VDRElTQ0FSRCwgJnJhbmdlKTsKKwlpZiAocmV0IDwgMCkgeworCQlyYW5nZVswXSA9IDA7CisJCXJhbmdlWzFdID0gbGVuOworCQlyZXQgPSBpb2N0bChmZCwgQkxLRElTQ0FSRCwgJnJhbmdlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXdhcm4oIkRpc2NhcmQgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJd2FybigiV2lwZSB2aWEgc2VjdXJlIGRpc2NhcmQgZmFpbGVkLCB1c2VkIGRpc2NhcmQgaW5zdGVhZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjZWxzZSAgLyogX19saW51eF9fICovCisjZXJyb3IgIk1pc3NpbmcgYmxvY2sgZGV2aWNlIHdpcGluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBwbGF0Zm9ybSEiCisjZW5kaWYKKworI2Vsc2UgIC8qIFdJUEVfSVNfU1VQUE9SVEVEICovCisKK2ludCB3aXBlX2Jsb2NrX2RldmljZShpbnQgZmQsIHM2NCBsZW4pCit7CisJLyogV2lwaW5nIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4gKi8KKwlyZXR1cm4gMTsKK30KKworI2VuZGlmICAvKiBXSVBFX0lTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy93aXBlLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3dpcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDExOWUzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy93aXBlLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1dJUEVfSF8KKyNkZWZpbmUgX1dJUEVfSF8KKworI2luY2x1ZGUgImV4dDRfdXRpbHMuaCIKKworLyogU2V0IFdJUEVfSVNfU1VQUE9SVEVEIHRvIDEgaWYgdGhlIGN1cnJlbnQgcGxhdGZvcm0gc3VwcG9ydHMKKyAqIHdpcGluZyBvZiBibG9jayBkZXZpY2VzLiAwIG90aGVyd2lzZS4gRm9yIG5vdywgb25seSBMaW51eCBkb2VzLgorICovCisjaWZkZWYgX19saW51eF9fCisjICBkZWZpbmUgV0lQRV9JU19TVVBQT1JURUQgMQorI2Vsc2UKKyMgIGRlZmluZSBXSVBFX0lTX1NVUFBPUlRFRCAwCisjZW5kaWYKKworaW50IHdpcGVfYmxvY2tfZGV2aWNlKGludCBmZCwgczY0IGxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy94YXR0ci5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9leHQ0X3V0aWxzL3NyYy94YXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzIzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2V4dDRfdXRpbHMvc3JjL3hhdHRyLmgKQEAgLTAsMCArMSw0NSBAQAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaWZuZGVmIF9TWVNURU1fRVhUUkFTX0VYVDRfVVRJTFNfWEFUVFJfSAorI2RlZmluZSBfU1lTVEVNX0VYVFJBU19FWFQ0X1VUSUxTX1hBVFRSX0ggMQorCisjZGVmaW5lIEVYVDRfWEFUVFJfTUFHSUMgMHhFQTAyMDAwMAorI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX1NFQ1VSSVRZIDYKKworc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyIHsKKyAgICBfX2xlMzIgIGhfbWFnaWM7CisgICAgX19sZTMyICBoX3JlZmNvdW50OworICAgIF9fbGUzMiAgaF9ibG9ja3M7CisgICAgX19sZTMyICBoX2hhc2g7CisgICAgX19sZTMyICBoX2NoZWNrc3VtOworICAgIF9fdTMyICAgaF9yZXNlcnZlZFszXTsKK307CisKK3N0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2hlYWRlciB7CisgICAgX19sZTMyICBoX21hZ2ljOworfTsKKworc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgeworICAgIF9fdTggZV9uYW1lX2xlbjsKKyAgICBfX3U4IGVfbmFtZV9pbmRleDsKKyAgICBfX2xlMTYgZV92YWx1ZV9vZmZzOworICAgIF9fbGUzMiBlX3ZhbHVlX2Jsb2NrOworICAgIF9fbGUzMiBlX3ZhbHVlX3NpemU7CisgICAgX19sZTMyIGVfaGFzaDsKKyAgICBjaGFyIGVfbmFtZVswXTsKK307CisKKyNkZWZpbmUgRVhUNF9YQVRUUl9QQURfQklUUyAyCisjZGVmaW5lIEVYVDRfWEFUVFJfUEFEICgxPDxFWFQ0X1hBVFRSX1BBRF9CSVRTKQorI2RlZmluZSBFWFQ0X1hBVFRSX1JPVU5EIChFWFQ0X1hBVFRSX1BBRC0xKQorI2RlZmluZSBFWFQ0X1hBVFRSX0xFTihuYW1lX2xlbikgXAorICAgICgoKG5hbWVfbGVuKSArIEVYVDRfWEFUVFJfUk9VTkQgKyBcCisgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5KSkgJiB+RVhUNF9YQVRUUl9ST1VORCkKKyNkZWZpbmUgRVhUNF9YQVRUUl9ORVhUKGVudHJ5KSBcCisgICAgKChzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqKSggXAorICAgICAoY2hhciAqKShlbnRyeSkgKyBFWFQ0X1hBVFRSX0xFTigoZW50cnkpLT5lX25hbWVfbGVuKSkpCisjZGVmaW5lIEVYVDRfWEFUVFJfU0laRShzaXplKSBcCisgICAgKCgoc2l6ZSkgKyBFWFQ0X1hBVFRSX1JPVU5EKSAmIH5FWFQ0X1hBVFRSX1JPVU5EKQorI2RlZmluZSBJU19MQVNUX0VOVFJZKGVudHJ5KSAoKih1aW50MzJfdCAqKShlbnRyeSkgPT0gMCkKKworI2VuZGlmIC8qICFfU1lTVEVNX0VYVFJBU19FWFQ0X1VUSUxTX1hBVFRSX0ggKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvU2hsd2FwaS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGUtYmVuY2htYXJrL2NvbXBhdC9TaGx3YXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmMTc0NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvU2hsd2FwaS5oCkBAIC0wLDAgKzEsMyBAQAorLy8gR29vZ2xlIGJlbmNobWFyayBpbmNsdWRlcyBTaGx3YXBpLmggaW5zdGVhZCBvZiBzaGx3YXBpLmgKKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgPHNobHdhcGkuaD4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvVmVyc2lvbkhlbHBlcnMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvVmVyc2lvbkhlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzg5MmFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGUtYmVuY2htYXJrL2NvbXBhdC9WZXJzaW9uSGVscGVycy5oCkBAIC0wLDAgKzEsNCBAQAorI3ByYWdtYSBvbmNlCisKKy8vIFRoZSBBbmRyb2lkIGVtdWxhdG9yIG9ubHkgc3VwcG9ydHMgVmlzdGEgb3IgZ3JlYXRlci4KK3N0YXRpYyBpbmxpbmUgYm9vbCBJc1dpbmRvd3NYUE9yR3JlYXRlcigpIHsgcmV0dXJuIHRydWU7IH0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvV2luZG93cy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGUtYmVuY2htYXJrL2NvbXBhdC9XaW5kb3dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkZmJlOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9jb21wYXQvV2luZG93cy5oCkBAIC0wLDAgKzEsMyBAQAorLy8gR29vZ2xlIGJlbmNobWFyayBpbmNsdWRlcyBXaW5kb3dzLmggaW5zdGVhZCBvZiB3aW5kb3dzLmgKKyNwcmFnbWEgb25jZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9zb3VyY2VzLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGUtYmVuY2htYXJrL3NvdXJjZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5MWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvZ29vZ2xlLWJlbmNobWFyay9zb3VyY2VzLm1rCkBAIC0wLDAgKzEsNzQgQEAKKyMgQnVpbGQgZmlsZXMgZm9yIHRoZSBHb29nbGUgQmVuY2htYXJrIGxpYnJhcnkuCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2JlbmNobWFyaworIworIyBUaGlzIGFzc3VtZXMgdGhlIGZpbGVzIGFyZSB1bmRlciAkQU9TUC9leHRlcm5hbC9nb29nbGUtYmVuY2htYXJrCisjIChpZiB5b3UgZG9uJ3QgLCB1c2UgcmVwbyBzeW5jIHRvIHVwZGF0ZSB5b3VyIG1hbmlmZXN0IGFuZCB3b3Jrc3BhY2UpLgorIworIyBUaGUgY29tcGF0LyBkaXJlY3RvcnkgY29udGFpbnMgYSBmZXcgY29tcGF0aWJpbGl0eSBoZWFkZXJzIGZvcgorIyBjcm9zcy1jb21waWxhdGlvbiB3aXRoIE1pbmd3LgorCitPTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCisKK0dPT0dMRV9CRU5DSE1BUktfU09VUkNFU19ESVIgPz0gJChMT0NBTF9QQVRIKS8uLi9nb29nbGUtYmVuY2htYXJrCitHT09HTEVfQkVOQ0hNQVJLX1NPVVJDRVNfRElSIDo9ICQoR09PR0xFX0JFTkNITUFSS19TT1VSQ0VTX0RJUikKK2lmZXEgKCwkKHN0cmlwICQod2lsZGNhcmQgJChHT09HTEVfQkVOQ0hNQVJLX1NPVVJDRVNfRElSKSkpKQorICAgICQoZXJyb3IgQ2Fubm90IGZpbmQgR29vZ2xlIEJlbmNobWFyayBzb3VyY2VzIGRpcmVjdG9yeTogJChHT09HTEVfQkVOQ0hNQVJLX1NPVVJDRVNfRElSKSkKK2VuZGlmCisKK0xPQ0FMX1BBVEggOj0gJChHT09HTEVfQkVOQ0hNQVJLX1NPVVJDRVNfRElSKQorCitHT09HTEVfQkVOQ0hNQVJLX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorR09PR0xFX0JFTkNITUFSS19TVEFUSUNfTElCUkFSSUVTIDo9IGVtdWxhdG9yLWdiZW5jaAorR09PR0xFX0JFTkNITUFSS19MRExJQlMgOj0KKworIyBPbiBXaW5kb3dzLCB3ZSBuZWVkIHRvIHVzZSBvdXIgY3VzdG9tIHJlZ2V4IGxpYnJhcnkuCitpZmVxICh3aW5kb3dzLCQoQlVJTERfVEFSR0VUX09TKSkKK0dPT0dMRV9CRU5DSE1BUktfTERMSUJTICs9IC1sc2hsd2FwaQorR09PR0xFX0JFTkNITUFSS19TVEFUSUNfTElCUkFSSUVTICs9ICQoUkVHRVhfV0lOMzJfU1RBVElDX0xJQlJBUklFUykKK2VuZGlmCisKKyMgRGVmaW5lIHRoZSBlbXVsYXRvci1nYmVuY2ggbGlicmFyeS4KKyMgTm90ZSB0aGF0IHVzZXJzIHNob3VsZCB1c2UgR09PR0xFX0JFTkNITUFSS19JTkNMVURFUywgR09PR0xFX0JFTkNITUFSS19TVEFUSUNfTElCUkFSSUVTCisjIGFuZCBHT09HTEVfQkVOQ0hNQVJLX0xETElCUyB0byBwcm9wZXJseSB1c2UgaXQuCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1nYmVuY2gpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICQoR09PR0xFX0JFTkNITUFSS19JTkNMVURFUykgXAorCisjIE5PVEUgSEFWRV9TVERfUkVHRVggZG9lc24ndCBzZWVtIHRvIHdvcmsgd2l0aCBvdXIgdG9vbGNoYWlucy4KK0xPQ0FMX0NGTEFHUyArPSAtREhBVkVfUE9TSVhfUkVHRVg9MQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9iZW5jaG1hcmsuY2MgXAorICAgIHNyYy9jb2xvcnByaW50LmNjIFwKKyAgICBzcmMvY29tbWFuZGxpbmVmbGFncy5jYyBcCisgICAgc3JjL2NvbXBsZXhpdHkuY2MgXAorICAgIHNyYy9jb25zb2xlX3JlcG9ydGVyLmNjIFwKKyAgICBzcmMvY3N2X3JlcG9ydGVyLmNjIFwKKyAgICBzcmMvanNvbl9yZXBvcnRlci5jYyBcCisgICAgc3JjL2xvZy5jYyBcCisgICAgc3JjL3JlcG9ydGVyLmNjIFwKKyAgICBzcmMvcmVfcG9zaXguY2MgXAorICAgIHNyYy9zbGVlcC5jYyBcCisgICAgc3JjL3N0cmluZ191dGlsLmNjIFwKKyAgICBzcmMvc3lzaW5mby5jYyBcCisgICAgc3JjL3dhbGx0aW1lLmNjIFwKKworaWZlcSAod2luZG93cywkKEJVSUxEX1RBUkdFVF9PUykpCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIC4uL3FlbXUvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGUtYmVuY2htYXJrL2NvbXBhdC8kKEdPT0dMRV9CRU5DSE1BUktfQ09NUEFUX0RJUikgXAorICAgICQoUkVHRVhfV0lOMzJfSU5DTFVERVMpIFwKKworZW5kaWYgICMgQlVJTERfVEFSR0VUX09TID09IFdJTkRPV1MKKworJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCisjIEJ1aWxkIHRoZSBnb29nbGVfYmVuY2htYXJrWzY0XV9iYXNpY190ZXN0IHByb2dyYW0sIHVzZWQgdG8gY2hlY2sgdGhhdCB0aGUKKyMgbGlicmFyeSBsaW5rcyBhbmQgd29ya3MgcHJvcGVybHkuCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItYmVuY2htYXJrLGdvb2dsZV9iZW5jaG1hcmskKEJVSUxEX1RBUkdFVF9TVUZGSVgpX2Jhc2ljX3Rlc3QpCitMT0NBTF9TUkNfRklMRVMgOj0gdGVzdC9iYXNpY190ZXN0LmNjCiskKGNhbGwgZW5kLWVtdWxhdG9yLWJlbmNobWFyaykKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L0FuZHJvaWQubWsgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2dvb2dsZXRlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODYxNjliCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9nb29nbGV0ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMKKyMjIyAgR1Rlc3QgbGlicmFyaWVzLgorIyMjCisjIyMgIEdvb2dsZVRlc3QgaXMgdXNlZCB0byBidWlsZCB0aGUgZW11bGF0b3IncyBBbmRyb2lkLXNwZWNpZmljCisjIyMgIHVuaXQgdGVzdHMuIFRoZSBzb3VyY2VzIGFyZSBsb2NhdGVkIHVuZGVyCisjIyMgICRBTkRST0lEL2V4dGVybi9ndGVzdCBidXQgYmVjYXVzZSB3ZSBuZWVkIHRvIGJ1aWxkIGJvdGgKKyMjIyAgMzItYml0IGFuZCA2NC1iaXQgaG9zdCBsaWJyYXJpZXMsIGRvbid0IHJldXNlIHRoZQorIyMjICBBbmRyb2lkLm1rIHRoZXJlLCBkZWZpbmUgYSBtb2R1bGUgaGVyZSBpbnN0ZWFkLgorCitFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTX0RJUiA/PSAkKExPQ0FMX1BBVEgpLy4uL2d0ZXN0CitFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTX0RJUiA6PSAkKEVNVUxBVE9SX0dURVNUX1NPVVJDRVNfRElSKQoraWZlcSAoLCQoc3RyaXAgJCh3aWxkY2FyZCAkKEVNVUxBVE9SX0dURVNUX1NPVVJDRVNfRElSKSkpKQorICAgICQoZXJyb3IgQ2Fubm90IGZpbmQgR29vZ2xlVGVzdCBzb3VyY2VzIGRpcmVjdG9yeTogJChFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTX0RJUikpCitlbmRpZgorCitFTVVMQVRPUl9HVEVTVF9JTkNMVURFUyA6PSAkKEVNVUxBVE9SX0dURVNUX1NPVVJDRVNfRElSKS9pbmNsdWRlCitFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTIDo9IHNyYy9ndGVzdC1hbGwuY2Mgc3JjL2d0ZXN0X21haW4uY2MKKworb2xkX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorCitMT0NBTF9QQVRIIDo9ICQoRU1VTEFUT1JfR1RFU1RfU09VUkNFU19ESVIpCisKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1saWJyYXJ5LCBlbXVsYXRvci1saWJndGVzdCkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChFTVVMQVRPUl9HVEVTVF9JTkNMVURFUykKK0xPQ0FMX0NQUF9FWFRFTlNJT04gOj0gLmNjCitMT0NBTF9DRkxBR1MgKz0gLU8wIC1Xbm8tdW51c2VkLXZhcmlhYmxlCitMT0NBTF9TUkNfRklMRVMgOj0gJChFTVVMQVRPUl9HVEVTVF9TT1VSQ0VTKQorJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCitMT0NBTF9QQVRIIDo9ICQob2xkX0xPQ0FMX1BBVEgpCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9BbmRyb2lkLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3MDY1MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDEgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKwlqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKwlqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorCWpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKwlqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisJamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorCWpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorCWpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMgYXJtdjZfaWRjdC5TCisKKyMgdXNlIGFzaG1lbSBhcyBsaWJqcGVnIGRlY29kZXIncyBiYWNraW5nIHN0b3JlCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfQU5EUk9JRF9BU0hNRU0KK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisJam1lbS1hc2htZW0uYworCisjIHRoZSBvcmlnaW5hbCBhbmRyb2lkIG1lbW9yeSBtYW5hZ2VyLgorIyB1c2Ugc2RjYXJkIGFzIGxpYmpwZWcgZGVjb2RlcidzIGJhY2tpbmcgc3RvcmUKKyNMT0NBTF9TUkNfRklMRVMgKz0gXAorIwlqbWVtLWFuZHJvaWQuYworCitMT0NBTF9DRkxBR1MgKz0gLURBVk9JRF9UQUJMRVMgCitMT0NBTF9DRkxBR1MgKz0gLU8zIC1mc3RyaWN0LWFsaWFzaW5nIC1mcHJlZmV0Y2gtbG9vcC1hcnJheXMKKyNMT0NBTF9DRkxBR1MgKz0gLW1hcmNoPWFybXY2agorCisjIGVuYWJsZSB0aWxlIGJhc2VkIGRlY29kZQorTE9DQUxfQ0ZMQUdTICs9IC1EQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorCisjIGVuYWJsZSBhcm12NiBpZGN0IGFzc2VtYmx5CitMT0NBTF9DRkxBR1MgKz0gLURBTkRST0lEX0FSTVY2X0lEQ1QKKworTE9DQUxfTU9EVUxFOj0gbGlianBlZworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL0NsZWFuU3BlYy5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9DbGVhblNwZWMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0ZTFiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw0OSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKKyMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCisjIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgorIyBydW4gYmVmb3JlLgorIworIyBFLmcuOgorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQorIworIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKKyMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCisjCisjIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KKyMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KKyMKKyMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5CisjIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCisjIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91CisjIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKKyMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgRm9yIGV4YW1wbGU6CisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQorCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9NT0RVTEVfTElDRU5TRV9CU0RfTElLRQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL05PVElDRSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3NjI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9OT1RJQ0UKQEAgLTAsMCArMSwzOCBAQAorVGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsCit3aXRoIHJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgIkFTIElTIiwgYW5kIHlvdSwKK2l0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KKworVGhpcyBzb2Z0d2FyZSBpcyBjb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitBbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMKK3NvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlCitjb25kaXRpb25zOgorKDEpIElmIGFueSBwYXJ0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGlzCitSRUFETUUgZmlsZSBtdXN0IGJlIGluY2x1ZGVkLCB3aXRoIHRoaXMgY29weXJpZ2h0IGFuZCBuby13YXJyYW50eSBub3RpY2UKK3VuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMKK211c3QgYmUgY2xlYXJseSBpbmRpY2F0ZWQgaW4gYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24uCisoMikgSWYgb25seSBleGVjdXRhYmxlIGNvZGUgaXMgZGlzdHJpYnV0ZWQsIHRoZW4gdGhlIGFjY29tcGFueWluZworZG9jdW1lbnRhdGlvbiBtdXN0IHN0YXRlIHRoYXQgInRoaXMgc29mdHdhcmUgaXMgYmFzZWQgaW4gcGFydCBvbiB0aGUgd29yayBvZgordGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgorKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzCitmdWxsIHJlc3BvbnNpYmlsaXR5IGZvciBhbnkgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzOyB0aGUgYXV0aG9ycyBhY2NlcHQKK05PIExJQUJJTElUWSBmb3IgZGFtYWdlcyBvZiBhbnkga2luZC4KKworVGhlc2UgY29uZGl0aW9ucyBhcHBseSB0byBhbnkgc29mdHdhcmUgZGVyaXZlZCBmcm9tIG9yIGJhc2VkIG9uIHRoZSBJSkcgY29kZSwKK25vdCBqdXN0IHRvIHRoZSB1bm1vZGlmaWVkIGxpYnJhcnkuICBJZiB5b3UgdXNlIG91ciB3b3JrLCB5b3Ugb3VnaHQgdG8KK2Fja25vd2xlZGdlIHVzLgorCitQZXJtaXNzaW9uIGlzIE5PVCBncmFudGVkIGZvciB0aGUgdXNlIG9mIGFueSBJSkcgYXV0aG9yJ3MgbmFtZSBvciBjb21wYW55IG5hbWUKK2luIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQoraXQuICBUaGlzIHNvZnR3YXJlIG1heSBiZSByZWZlcnJlZCB0byBvbmx5IGFzICJ0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzCitzb2Z0d2FyZSIuCisKK1dlIHNwZWNpZmljYWxseSBwZXJtaXQgYW5kIGVuY291cmFnZSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgYXMgdGhlIGJhc2lzIG9mCitjb21tZXJjaWFsIHByb2R1Y3RzLCBwcm92aWRlZCB0aGF0IGFsbCB3YXJyYW50eSBvciBsaWFiaWxpdHkgY2xhaW1zIGFyZQorYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvUkVBRE1FIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNjMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL1JFQURNRQpAQCAtMCwwICsxLDM4NSBAQAorVGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUkVBRE1FIGZvciByZWxlYXNlIDZiIG9mIDI3LU1hci0xOTk4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBkaXN0cmlidXRpb24gY29udGFpbnMgdGhlIHNpeHRoIHB1YmxpYyByZWxlYXNlIG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHCitHcm91cCdzIGZyZWUgSlBFRyBzb2Z0d2FyZS4gIFlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKK3RvIHVzZSBpdCBmb3IgYW55IHB1cnBvc2UsIHN1YmplY3QgdG8gdGhlIGNvbmRpdGlvbnMgdW5kZXIgTEVHQUwgSVNTVUVTLCBiZWxvdy4KKworU2VyaW91cyB1c2VycyBvZiB0aGlzIHNvZnR3YXJlIChwYXJ0aWN1bGFybHkgdGhvc2UgaW5jb3Jwb3JhdGluZyBpdCBpbnRvCitsYXJnZXIgcHJvZ3JhbXMpIHNob3VsZCBjb250YWN0IElKRyBhdCBqcGVnLWluZm9AdXVuZXQudXUubmV0IHRvIGJlIGFkZGVkIHRvCitvdXIgZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3QuICBNYWlsaW5nIGxpc3QgbWVtYmVycyBhcmUgbm90aWZpZWQgb2YgdXBkYXRlcworYW5kIGhhdmUgYSBjaGFuY2UgdG8gcGFydGljaXBhdGUgaW4gdGVjaG5pY2FsIGRpc2N1c3Npb25zLCBldGMuCisKK1RoaXMgc29mdHdhcmUgaXMgdGhlIHdvcmsgb2YgVG9tIExhbmUsIFBoaWxpcCBHbGFkc3RvbmUsIEppbSBCb3VjaGVyLAorTGVlIENyb2NrZXIsIEp1bGlhbiBNaW5ndWlsbG9uLCBMdWlzIE9ydGl6LCBHZW9yZ2UgUGhpbGxpcHMsIERhdmlkZSBSb3NzaSwKK0d1aWRvIFZvbGxiZWRpbmcsIEdlJyBXZWlqZXJzLCBhbmQgb3RoZXIgbWVtYmVycyBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRworR3JvdXAuCisKK0lKRyBpcyBub3QgYWZmaWxpYXRlZCB3aXRoIHRoZSBvZmZpY2lhbCBJU08gSlBFRyBzdGFuZGFyZHMgY29tbWl0dGVlLgorCisKK0RPQ1VNRU5UQVRJT04gUk9BRE1BUAorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHNlY3Rpb25zOgorCitPVkVSVklFVyAgICAgICAgICAgIEdlbmVyYWwgZGVzY3JpcHRpb24gb2YgSlBFRyBhbmQgdGhlIElKRyBzb2Z0d2FyZS4KK0xFR0FMIElTU1VFUyAgICAgICAgQ29weXJpZ2h0LCBsYWNrIG9mIHdhcnJhbnR5LCB0ZXJtcyBvZiBkaXN0cmlidXRpb24uCitSRUZFUkVOQ0VTICAgICAgICAgIFdoZXJlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSlBFRy4KK0FSQ0hJVkUgTE9DQVRJT05TICAgV2hlcmUgdG8gZmluZCBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlLgorUkVMQVRFRCBTT0ZUV0FSRSAgICBPdGhlciBzdHVmZiB5b3Ugc2hvdWxkIGdldC4KK0ZJTEUgRk9STUFUIFdBUlMgICAgU29mdHdhcmUgKm5vdCogdG8gZ2V0LgorVE8gRE8gICAgICAgICAgICAgICBQbGFucyBmb3IgZnV0dXJlIElKRyByZWxlYXNlcy4KKworT3RoZXIgZG9jdW1lbnRhdGlvbiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZToKKworVXNlciBkb2N1bWVudGF0aW9uOgorICBpbnN0YWxsLmRvYyAgICAgICBIb3cgdG8gY29uZmlndXJlIGFuZCBpbnN0YWxsIHRoZSBJSkcgc29mdHdhcmUuCisgIHVzYWdlLmRvYyAgICAgICAgIFVzYWdlIGluc3RydWN0aW9ucyBmb3IgY2pwZWcsIGRqcGVnLCBqcGVndHJhbiwKKyAgICAgICAgICAgICAgICAgICAgcmRqcGdjb20sIGFuZCB3cmpwZ2NvbS4KKyAgKi4xICAgICAgICAgICAgICAgVW5peC1zdHlsZSBtYW4gcGFnZXMgZm9yIHByb2dyYW1zIChzYW1lIGluZm8gYXMgdXNhZ2UuZG9jKS4KKyAgd2l6YXJkLmRvYyAgICAgICAgQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciBKUEVHIHdpemFyZHMgb25seS4KKyAgY2hhbmdlLmxvZyAgICAgICAgVmVyc2lvbi10by12ZXJzaW9uIGNoYW5nZSBoaWdobGlnaHRzLgorUHJvZ3JhbW1lciBhbmQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbjoKKyAgbGlianBlZy5kb2MgICAgICAgSG93IHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGluIHlvdXIgb3duIHByb2dyYW1zLgorICBleGFtcGxlLmMgICAgICAgICBTYW1wbGUgY29kZSBmb3IgY2FsbGluZyB0aGUgSlBFRyBsaWJyYXJ5LgorICBzdHJ1Y3R1cmUuZG9jICAgICBPdmVydmlldyBvZiB0aGUgSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgc3RydWN0dXJlLgorICBmaWxlbGlzdC5kb2MgICAgICBSb2FkIG1hcCBvZiBJSkcgZmlsZXMuCisgIGNvZGVydWxlcy5kb2MgICAgIENvZGluZyBzdHlsZSBydWxlcyAtLS0gcGxlYXNlIHJlYWQgaWYgeW91IGNvbnRyaWJ1dGUgY29kZS4KKworUGxlYXNlIHJlYWQgYXQgbGVhc3QgdGhlIGZpbGVzIGluc3RhbGwuZG9jIGFuZCB1c2FnZS5kb2MuICBVc2VmdWwgaW5mb3JtYXRpb24KK2NhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBKUEVHIEZBUSAoRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMpIGFydGljbGUuICBTZWUKK0FSQ0hJVkUgTE9DQVRJT05TIGJlbG93IHRvIGZpbmQgb3V0IHdoZXJlIHRvIG9idGFpbiB0aGUgRkFRIGFydGljbGUuCisKK0lmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZSBKUEVHIGNvZGUgd29ya3MsIHdlIHN1Z2dlc3QgcmVhZGluZyBvbmUgb3IKK21vcmUgb2YgdGhlIFJFRkVSRU5DRVMsIHRoZW4gbG9va2luZyBhdCB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyAoaW4gcm91Z2hseQordGhlIG9yZGVyIGxpc3RlZCkgYmVmb3JlIGRpdmluZyBpbnRvIHRoZSBjb2RlLgorCisKK09WRVJWSUVXCis9PT09PT09PQorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgQyBzb2Z0d2FyZSB0byBpbXBsZW1lbnQgSlBFRyBpbWFnZSBjb21wcmVzc2lvbiBhbmQKK2RlY29tcHJlc3Npb24uICBKUEVHIChwcm9ub3VuY2VkICJqYXktcGVnIikgaXMgYSBzdGFuZGFyZGl6ZWQgY29tcHJlc3Npb24KK21ldGhvZCBmb3IgZnVsbC1jb2xvciBhbmQgZ3JheS1zY2FsZSBpbWFnZXMuICBKUEVHIGlzIGludGVuZGVkIGZvciBjb21wcmVzc2luZworInJlYWwtd29ybGQiIHNjZW5lczsgbGluZSBkcmF3aW5ncywgY2FydG9vbnMgYW5kIG90aGVyIG5vbi1yZWFsaXN0aWMgaW1hZ2VzCithcmUgbm90IGl0cyBzdHJvbmcgc3VpdC4gIEpQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdAorZXhhY3RseSBpZGVudGljYWwgdG8gdGhlIGlucHV0IGltYWdlLiAgSGVuY2UgeW91IG11c3Qgbm90IHVzZSBKUEVHIGlmIHlvdQoraGF2ZSB0byBoYXZlIGlkZW50aWNhbCBvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcGhvdG9ncmFwaGljIGltYWdlcywKK3ZlcnkgZ29vZCBjb21wcmVzc2lvbiBsZXZlbHMgY2FuIGJlIG9idGFpbmVkIHdpdGggbm8gdmlzaWJsZSBjaGFuZ2UsIGFuZAorcmVtYXJrYWJseSBoaWdoIGNvbXByZXNzaW9uIGxldmVscyBhcmUgcG9zc2libGUgaWYgeW91IGNhbiB0b2xlcmF0ZSBhCitsb3ctcXVhbGl0eSBpbWFnZS4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVmZXJlbmNlcywgb3IganVzdCBleHBlcmltZW50Cit3aXRoIHZhcmlvdXMgY29tcHJlc3Npb24gc2V0dGluZ3MuCisKK1RoaXMgc29mdHdhcmUgaW1wbGVtZW50cyBKUEVHIGJhc2VsaW5lLCBleHRlbmRlZC1zZXF1ZW50aWFsLCBhbmQgcHJvZ3Jlc3NpdmUKK2NvbXByZXNzaW9uIHByb2Nlc3Nlcy4gIFByb3Zpc2lvbiBpcyBtYWRlIGZvciBzdXBwb3J0aW5nIGFsbCB2YXJpYW50cyBvZiB0aGVzZQorcHJvY2Vzc2VzLCBhbHRob3VnaCBzb21lIHVuY29tbW9uIHBhcmFtZXRlciBzZXR0aW5ncyBhcmVuJ3QgaW1wbGVtZW50ZWQgeWV0LgorRm9yIGxlZ2FsIHJlYXNvbnMsIHdlIGFyZSBub3QgZGlzdHJpYnV0aW5nIGNvZGUgZm9yIHRoZSBhcml0aG1ldGljLWNvZGluZwordmFyaWFudHMgb2YgSlBFRzsgc2VlIExFR0FMIElTU1VFUy4gIFdlIGhhdmUgbWFkZSBubyBwcm92aXNpb24gZm9yIHN1cHBvcnRpbmcKK3RoZSBoaWVyYXJjaGljYWwgb3IgbG9zc2xlc3MgcHJvY2Vzc2VzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLgorCitXZSBwcm92aWRlIGEgc2V0IG9mIGxpYnJhcnkgcm91dGluZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgSlBFRyBpbWFnZSBmaWxlcywKK3BsdXMgdHdvIHNhbXBsZSBhcHBsaWNhdGlvbnMgImNqcGVnIiBhbmQgImRqcGVnIiwgd2hpY2ggdXNlIHRoZSBsaWJyYXJ5IHRvCitwZXJmb3JtIGNvbnZlcnNpb24gYmV0d2VlbiBKUEVHIGFuZCBzb21lIG90aGVyIHBvcHVsYXIgaW1hZ2UgZmlsZSBmb3JtYXRzLgorVGhlIGxpYnJhcnkgaXMgaW50ZW5kZWQgdG8gYmUgcmV1c2VkIGluIG90aGVyIGFwcGxpY2F0aW9ucy4KKworSW4gb3JkZXIgdG8gc3VwcG9ydCBmaWxlIGNvbnZlcnNpb24gYW5kIHZpZXdpbmcgc29mdHdhcmUsIHdlIGhhdmUgaW5jbHVkZWQKK2NvbnNpZGVyYWJsZSBmdW5jdGlvbmFsaXR5IGJleW9uZCB0aGUgYmFyZSBKUEVHIGNvZGluZy9kZWNvZGluZyBjYXBhYmlsaXR5OworZm9yIGV4YW1wbGUsIHRoZSBjb2xvciBxdWFudGl6YXRpb24gbW9kdWxlcyBhcmUgbm90IHN0cmljdGx5IHBhcnQgb2YgSlBFRworZGVjb2RpbmcsIGJ1dCB0aGV5IGFyZSBlc3NlbnRpYWwgZm9yIG91dHB1dCB0byBjb2xvcm1hcHBlZCBmaWxlIGZvcm1hdHMgb3IKK2NvbG9ybWFwcGVkIGRpc3BsYXlzLiAgVGhlc2UgZXh0cmEgZnVuY3Rpb25zIGNhbiBiZSBjb21waWxlZCBvdXQgb2YgdGhlCitsaWJyYXJ5IGlmIG5vdCByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLiAgV2UgaGF2ZSBhbHNvIGluY2x1ZGVkCisianBlZ3RyYW4iLCBhIHV0aWxpdHkgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nIGJldHdlZW4gZGlmZmVyZW50IEpQRUcKK3Byb2Nlc3NlcywgYW5kICJyZGpwZ2NvbSIgYW5kICJ3cmpwZ2NvbSIsIHR3byBzaW1wbGUgYXBwbGljYXRpb25zIGZvcgoraW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRleHR1YWwgY29tbWVudHMgaW4gSkZJRiBmaWxlcy4KKworVGhlIGVtcGhhc2lzIGluIGRlc2lnbmluZyB0aGlzIHNvZnR3YXJlIGhhcyBiZWVuIG9uIGFjaGlldmluZyBwb3J0YWJpbGl0eSBhbmQKK2ZsZXhpYmlsaXR5LCB3aGlsZSBhbHNvIG1ha2luZyBpdCBmYXN0IGVub3VnaCB0byBiZSB1c2VmdWwuICBJbiBwYXJ0aWN1bGFyLAordGhlIHNvZnR3YXJlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSByZWFkIGFzIGEgdHV0b3JpYWwgb24gSlBFRy4gIChTZWUgdGhlCitSRUZFUkVOQ0VTIHNlY3Rpb24gZm9yIGludHJvZHVjdG9yeSBtYXRlcmlhbC4pICBSYXRoZXIsIGl0IGlzIGludGVuZGVkIHRvCitiZSByZWxpYWJsZSwgcG9ydGFibGUsIGluZHVzdHJpYWwtc3RyZW5ndGggY29kZS4gIFdlIGRvIG5vdCBjbGFpbSB0byBoYXZlCithY2hpZXZlZCB0aGF0IGdvYWwgaW4gZXZlcnkgYXNwZWN0IG9mIHRoZSBzb2Z0d2FyZSwgYnV0IHdlIHN0cml2ZSBmb3IgaXQuCisKK1dlIHdlbGNvbWUgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGFzIGEgY29tcG9uZW50IG9mIGNvbW1lcmNpYWwgcHJvZHVjdHMuCitObyByb3lhbHR5IGlzIHJlcXVpcmVkLCBidXQgd2UgZG8gYXNrIGZvciBhbiBhY2tub3dsZWRnZW1lbnQgaW4gcHJvZHVjdAorZG9jdW1lbnRhdGlvbiwgYXMgZGVzY3JpYmVkIHVuZGVyIExFR0FMIElTU1VFUy4KKworCitMRUdBTCBJU1NVRVMKKz09PT09PT09PT09PQorCitJbiBwbGFpbiBFbmdsaXNoOgorCisxLiBXZSBkb24ndCBwcm9taXNlIHRoYXQgdGhpcyBzb2Z0d2FyZSB3b3Jrcy4gIChCdXQgaWYgeW91IGZpbmQgYW55IGJ1Z3MsCisgICBwbGVhc2UgbGV0IHVzIGtub3chKQorMi4gWW91IGNhbiB1c2UgdGhpcyBzb2Z0d2FyZSBmb3Igd2hhdGV2ZXIgeW91IHdhbnQuICBZb3UgZG9uJ3QgaGF2ZSB0byBwYXkgdXMuCiszLiBZb3UgbWF5IG5vdCBwcmV0ZW5kIHRoYXQgeW91IHdyb3RlIHRoaXMgc29mdHdhcmUuICBJZiB5b3UgdXNlIGl0IGluIGEKKyAgIHByb2dyYW0sIHlvdSBtdXN0IGFja25vd2xlZGdlIHNvbWV3aGVyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24gdGhhdAorICAgeW91J3ZlIHVzZWQgdGhlIElKRyBjb2RlLgorCitJbiBsZWdhbGVzZToKKworVGhlIGF1dGhvcnMgbWFrZSBOTyBXQVJSQU5UWSBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwKK3dpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiQVMgSVMiLCBhbmQgeW91LAoraXRzIHVzZXIsIGFzc3VtZSB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkgYW5kIGFjY3VyYWN5LgorCitUaGlzIHNvZnR3YXJlIGlzIGNvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK0FsbCBSaWdodHMgUmVzZXJ2ZWQgZXhjZXB0IGFzIHNwZWNpZmllZCBiZWxvdy4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcworc29mdHdhcmUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIGZvciBhbnkgcHVycG9zZSwgd2l0aG91dCBmZWUsIHN1YmplY3QgdG8gdGhlc2UKK2NvbmRpdGlvbnM6CisoMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKK1JFQURNRSBmaWxlIG11c3QgYmUgaW5jbHVkZWQsIHdpdGggdGhpcyBjb3B5cmlnaHQgYW5kIG5vLXdhcnJhbnR5IG5vdGljZQordW5hbHRlcmVkOyBhbmQgYW55IGFkZGl0aW9ucywgZGVsZXRpb25zLCBvciBjaGFuZ2VzIHRvIHRoZSBvcmlnaW5hbCBmaWxlcworbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KKygyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nCitkb2N1bWVudGF0aW9uIG11c3Qgc3RhdGUgdGhhdCAidGhpcyBzb2Z0d2FyZSBpcyBiYXNlZCBpbiBwYXJ0IG9uIHRoZSB3b3JrIG9mCit0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCIuCisoMykgUGVybWlzc2lvbiBmb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBvbmx5IGlmIHRoZSB1c2VyIGFjY2VwdHMKK2Z1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdAorTk8gTElBQklMSVRZIGZvciBkYW1hZ2VzIG9mIGFueSBraW5kLgorCitUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLAorbm90IGp1c3QgdG8gdGhlIHVubW9kaWZpZWQgbGlicmFyeS4gIElmIHlvdSB1c2Ugb3VyIHdvcmssIHlvdSBvdWdodCB0bworYWNrbm93bGVkZ2UgdXMuCisKK1Blcm1pc3Npb24gaXMgTk9UIGdyYW50ZWQgZm9yIHRoZSB1c2Ugb2YgYW55IElKRyBhdXRob3IncyBuYW1lIG9yIGNvbXBhbnkgbmFtZQoraW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHJlbGF0aW5nIHRvIHRoaXMgc29mdHdhcmUgb3IgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCitpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MKK3NvZnR3YXJlIi4KKworV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YKK2NvbW1lcmNpYWwgcHJvZHVjdHMsIHByb3ZpZGVkIHRoYXQgYWxsIHdhcnJhbnR5IG9yIGxpYWJpbGl0eSBjbGFpbXMgYXJlCithc3N1bWVkIGJ5IHRoZSBwcm9kdWN0IHZlbmRvci4KKworCithbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwKK3NvbGUgcHJvcHJpZXRvciBvZiBpdHMgY29weXJpZ2h0IGhvbGRlciwgQWxhZGRpbiBFbnRlcnByaXNlcyBvZiBNZW5sbyBQYXJrLCBDQS4KK2Fuc2kya25yLmMgaXMgTk9UIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGNvcHlyaWdodCBhbmQgY29uZGl0aW9ucywgYnV0IGluc3RlYWQKK2J5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksCit0aGF0IHlvdSBtdXN0IGluY2x1ZGUgc291cmNlIGNvZGUgaWYgeW91IHJlZGlzdHJpYnV0ZSBpdC4gIChTZWUgdGhlIGZpbGUKK2Fuc2kya25yLmMgZm9yIGZ1bGwgZGV0YWlscy4pICBIb3dldmVyLCBzaW5jZSBhbnNpMmtuci5jIGlzIG5vdCBuZWVkZWQgYXMgcGFydAorb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4KK3RoZSBmb3JlZ29pbmcgcGFyYWdyYXBocyBkby4KKworVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLgorSXQgaXMgY29weXJpZ2h0IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYnV0IGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgorVGhlIHNhbWUgaG9sZHMgZm9yIGl0cyBzdXBwb3J0aW5nIHNjcmlwdHMgKGNvbmZpZy5ndWVzcywgY29uZmlnLnN1YiwKK2x0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0CitieSBNLkkuVC4gYnV0IGlzIGFsc28gZnJlZWx5IGRpc3RyaWJ1dGFibGUuCisKK0l0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieQorcGF0ZW50cyBvd25lZCBieSBJQk0sIEFUJlQsIGFuZCBNaXRzdWJpc2hpLiAgSGVuY2UgYXJpdGhtZXRpYyBjb2RpbmcgY2Fubm90CitsZWdhbGx5IGJlIHVzZWQgd2l0aG91dCBvYnRhaW5pbmcgb25lIG9yIG1vcmUgbGljZW5zZXMuICBGb3IgdGhpcyByZWFzb24sCitzdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4KKyhTaW5jZSBhcml0aG1ldGljIGNvZGluZyBwcm92aWRlcyBvbmx5IGEgbWFyZ2luYWwgZ2FpbiBvdmVyIHRoZSB1bnBhdGVudGVkCitIdWZmbWFuIG1vZGUsIGl0IGlzIHVubGlrZWx5IHRoYXQgdmVyeSBtYW55IGltcGxlbWVudGF0aW9ucyB3aWxsIHN1cHBvcnQgaXQuKQorU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZworY29kZS4KKworVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuCitUbyBhdm9pZCBlbnRhbmdsZW1lbnQgd2l0aCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIEdJRiByZWFkaW5nIHN1cHBvcnQgaGFzCitiZWVuIHJlbW92ZWQgYWx0b2dldGhlciwgYW5kIHRoZSBHSUYgd3JpdGVyIGhhcyBiZWVuIHNpbXBsaWZpZWQgdG8gcHJvZHVjZQorInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlCityZXN1bHRpbmcgR0lGIGZpbGVzIGFyZSBsYXJnZXIgdGhhbiB1c3VhbCwgYnV0IGFyZSByZWFkYWJsZSBieSBhbGwgc3RhbmRhcmQKK0dJRiBkZWNvZGVycy4KKworV2UgYXJlIHJlcXVpcmVkIHRvIHN0YXRlIHRoYXQKKyAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCisgICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorCisKK1JFRkVSRU5DRVMKKz09PT09PT09PT0KKworV2UgaGlnaGx5IHJlY29tbWVuZCByZWFkaW5nIG9uZSBvciBtb3JlIG9mIHRoZXNlIHJlZmVyZW5jZXMgYmVmb3JlIHRyeWluZyB0bwordW5kZXJzdGFuZCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBzb2Z0d2FyZS4KKworVGhlIGJlc3Qgc2hvcnQgdGVjaG5pY2FsIGludHJvZHVjdGlvbiB0byB0aGUgSlBFRyBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMKKwlXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCisJQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCBuby4gNCksIHBwLiAzMC00NC4KKyhBZGphY2VudCBhcnRpY2xlcyBpbiB0aGF0IGlzc3VlIGRpc2N1c3MgTVBFRyBtb3Rpb24gcGljdHVyZSBjb21wcmVzc2lvbiwKK2FwcGxpY2F0aW9ucyBvZiBKUEVHLCBhbmQgcmVsYXRlZCB0b3BpY3MuKSAgSWYgeW91IGRvbid0IGhhdmUgdGhlIENBQ00gaXNzdWUKK2hhbmR5LCBhIFBvc3RTY3JpcHQgZmlsZSBjb250YWluaW5nIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIFdhbGxhY2UncyBhcnRpY2xlIGlzCithdmFpbGFibGUgYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL3dhbGxhY2UucHMuZ3ouICBUaGUgZmlsZSAoYWN0dWFsbHkKK2EgcHJlcHJpbnQgZm9yIGFuIGFydGljbGUgdGhhdCBhcHBlYXJlZCBpbiBJRUVFIFRyYW5zLiBDb25zdW1lciBFbGVjdHJvbmljcykKK29taXRzIHRoZSBzYW1wbGUgaW1hZ2VzIHRoYXQgYXBwZWFyZWQgaW4gQ0FDTSwgYnV0IGl0IGluY2x1ZGVzIGNvcnJlY3Rpb25zCithbmQgc29tZSBhZGRlZCBtYXRlcmlhbC4gIE5vdGU6IHRoZSBXYWxsYWNlIGFydGljbGUgaXMgY29weXJpZ2h0IEFDTSBhbmQgSUVFRSwKK2FuZCBpdCBtYXkgbm90IGJlIHVzZWQgZm9yIGNvbW1lcmNpYWwgcHVycG9zZXMuCisKK0Egc29tZXdoYXQgbGVzcyB0ZWNobmljYWwsIG1vcmUgbGVpc3VyZWx5IGludHJvZHVjdGlvbiB0byBKUEVHIGNhbiBiZSBmb3VuZCBpbgorIlRoZSBEYXRhIENvbXByZXNzaW9uIEJvb2siIGJ5IE1hcmsgTmVsc29uIGFuZCBKZWFuLWxvdXAgR2FpbGx5LCBwdWJsaXNoZWQgYnkKK00mVCBCb29rcyAoTmV3IFlvcmspLCAybmQgZWQuIDE5OTYsIElTQk4gMS01NTg1MS00MzQtMS4gIFRoaXMgYm9vayBwcm92aWRlcworZ29vZCBleHBsYW5hdGlvbnMgYW5kIGV4YW1wbGUgQyBjb2RlIGZvciBhIG11bHRpdHVkZSBvZiBjb21wcmVzc2lvbiBtZXRob2RzCitpbmNsdWRpbmcgSlBFRy4gIEl0IGlzIGFuIGV4Y2VsbGVudCBzb3VyY2UgaWYgeW91IGFyZSBjb21mb3J0YWJsZSByZWFkaW5nIEMKK2NvZGUgYnV0IGRvbid0IGtub3cgbXVjaCBhYm91dCBkYXRhIGNvbXByZXNzaW9uIGluIGdlbmVyYWwuICBUaGUgYm9vaydzIEpQRUcKK3NhbXBsZSBjb2RlIGlzIGZhciBmcm9tIGluZHVzdHJpYWwtc3RyZW5ndGgsIGJ1dCB3aGVuIHlvdSBhcmUgcmVhZHkgdG8gbG9vaworYXQgYSBmdWxsIGltcGxlbWVudGF0aW9uLCB5b3UndmUgZ290IG9uZSBoZXJlLi4uCisKK1RoZSBiZXN0IGZ1bGwgZGVzY3JpcHRpb24gb2YgSlBFRyBpcyB0aGUgdGV4dGJvb2sgIkpQRUcgU3RpbGwgSW1hZ2UgRGF0YQorQ29tcHJlc3Npb24gU3RhbmRhcmQiIGJ5IFdpbGxpYW0gQi4gUGVubmViYWtlciBhbmQgSm9hbiBMLiBNaXRjaGVsbCwgcHVibGlzaGVkCitieSBWYW4gTm9zdHJhbmQgUmVpbmhvbGQsIDE5OTMsIElTQk4gMC00NDItMDEyNzItMS4gIFByaWNlIFVTJDU5Ljk1LCA2MzggcHAuCitUaGUgYm9vayBpbmNsdWRlcyB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGUgSVNPIEpQRUcgc3RhbmRhcmRzIChESVMgMTA5MTgtMQorYW5kIGRyYWZ0IERJUyAxMDkxOC0yKS4gIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsZXRlIGV4cG9zaXRpb24gb2YgSlBFRworaW4gZXhpc3RlbmNlLCBhbmQgd2UgaGlnaGx5IHJlY29tbWVuZCBpdC4KKworVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUgZWxlY3Ryb25pY2FsbHk7IHlvdSBtdXN0IG9yZGVyIGEKK3BhcGVyIGNvcHkgdGhyb3VnaCBJU08gb3IgSVRVLiAgKFVubGVzcyB5b3UgZmVlbCBhIG5lZWQgdG8gb3duIGEgY2VydGlmaWVkCitvZmZpY2lhbCBjb3B5LCB3ZSByZWNvbW1lbmQgYnV5aW5nIHRoZSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCBib29rIGluc3RlYWQ7CitpdCdzIG11Y2ggY2hlYXBlciBhbmQgaW5jbHVkZXMgYSBncmVhdCBkZWFsIG9mIHVzZWZ1bCBleHBsYW5hdG9yeSBtYXRlcmlhbC4pCitJbiB0aGUgVVNBLCBjb3BpZXMgb2YgdGhlIHN0YW5kYXJkIG1heSBiZSBvcmRlcmVkIGZyb20gQU5TSSBTYWxlcyBhdCAoMjEyKQorNjQyLTQ5MDAsIG9yIGZyb20gR2xvYmFsIEVuZ2luZWVyaW5nIERvY3VtZW50cyBhdCAoODAwKSA4NTQtNzE3OS4gIChBTlNJCitkb2Vzbid0IHRha2UgY3JlZGl0IGNhcmQgb3JkZXJzLCBidXQgR2xvYmFsIGRvZXMuKSAgSXQncyBub3QgY2hlYXA6IGFzIG9mCisxOTkyLCBBTlNJIHdhcyBjaGFyZ2luZyAkOTUgZm9yIFBhcnQgMSBhbmQgJDQ3IGZvciBQYXJ0IDIsIHBsdXMgNyUKK3NoaXBwaW5nL2hhbmRsaW5nLiAgVGhlIHN0YW5kYXJkIGlzIGRpdmlkZWQgaW50byB0d28gcGFydHMsIFBhcnQgMSBiZWluZyB0aGUKK2FjdHVhbCBzcGVjaWZpY2F0aW9uLCB3aGlsZSBQYXJ0IDIgY292ZXJzIGNvbXBsaWFuY2UgdGVzdGluZyBtZXRob2RzLiAgUGFydCAxCitpcyB0aXRsZWQgIkRpZ2l0YWwgQ29tcHJlc3Npb24gYW5kIENvZGluZyBvZiBDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLAorUGFydCAxOiBSZXF1aXJlbWVudHMgYW5kIGd1aWRlbGluZXMiIGFuZCBoYXMgZG9jdW1lbnQgbnVtYmVycyBJU08vSUVDIElTCisxMDkxOC0xLCBJVFUtVCBULjgxLiAgUGFydCAyIGlzIHRpdGxlZCAiRGlnaXRhbCBDb21wcmVzc2lvbiBhbmQgQ29kaW5nIG9mCitDb250aW51b3VzLXRvbmUgU3RpbGwgSW1hZ2VzLCBQYXJ0IDI6IENvbXBsaWFuY2UgdGVzdGluZyIgYW5kIGhhcyBkb2N1bWVudAorbnVtYmVycyBJU08vSUVDIElTIDEwOTE4LTIsIElUVS1UIFQuODMuCisKK1NvbWUgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgSlBFRyBzdGFuZGFyZCBhcmUgZGVmaW5lZCBpbiBKUEVHIFBhcnQgMywKK2EgbmV3ZXIgSVNPIHN0YW5kYXJkIG51bWJlcmVkIElTTy9JRUMgSVMgMTA5MTgtMyBhbmQgSVRVLVQgVC44NC4gIElKRworY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgYW55IFBhcnQgMyBleHRlbnNpb25zLgorCitUaGUgSlBFRyBzdGFuZGFyZCBkb2VzIG5vdCBzcGVjaWZ5IGFsbCBkZXRhaWxzIG9mIGFuIGludGVyY2hhbmdlYWJsZSBmaWxlCitmb3JtYXQuICBGb3IgdGhlIG9taXR0ZWQgZGV0YWlscyB3ZSBmb2xsb3cgdGhlICJKRklGIiBjb252ZW50aW9ucywgcmV2aXNpb24KKzEuMDIuICBBIGNvcHkgb2YgdGhlIEpGSUYgc3BlYyBpcyBhdmFpbGFibGUgZnJvbToKKwlMaXRlcmF0dXJlIERlcGFydG1lbnQKKwlDLUN1YmUgTWljcm9zeXN0ZW1zLCBJbmMuCisJMTc3OCBNY0NhcnRoeSBCbHZkLgorCU1pbHBpdGFzLCBDQSA5NTAzNQorCXBob25lICg0MDgpIDk0NC02MzAwLCAgZmF4ICg0MDgpIDk0NC02MzE0CitBIFBvc3RTY3JpcHQgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBieSBGVFAgYXQKK2Z0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy9qZmlmLnBzLmd6LiAgVGhlcmUgaXMgYWxzbyBhIHBsYWluIHRleHQKK3ZlcnNpb24gYXQgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pmaWYudHh0Lmd6LCBidXQgaXQgaXMgbWlzc2luZwordGhlIGZpZ3VyZXMuCisKK1RoZSBUSUZGIDYuMCBmaWxlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBvYnRhaW5lZCBieSBGVFAgZnJvbQorZnRwOi8vZnRwLnNnaS5jb20vZ3JhcGhpY3MvdGlmZi9USUZGNi5wcy5nei4gIFRoZSBKUEVHIGluY29ycG9yYXRpb24gc2NoZW1lCitmb3VuZCBpbiB0aGUgVElGRiA2LjAgc3BlYyBvZiAzLUp1bmUtOTIgaGFzIGEgbnVtYmVyIG9mIHNlcmlvdXMgcHJvYmxlbXMuCitJSkcgZG9lcyBub3QgcmVjb21tZW5kIHVzZSBvZiB0aGUgVElGRiA2LjAgZGVzaWduIChUSUZGIENvbXByZXNzaW9uIHRhZyA2KS4KK0luc3RlYWQsIHdlIHJlY29tbWVuZCB0aGUgSlBFRyBkZXNpZ24gcHJvcG9zZWQgYnkgVElGRiBUZWNobmljYWwgTm90ZSAjMgorKENvbXByZXNzaW9uIHRhZyA3KS4gIENvcGllcyBvZiB0aGlzIE5vdGUgY2FuIGJlIG9idGFpbmVkIGZyb20gZnRwLnNnaS5jb20gb3IKK2Zyb20gZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnLy4gIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIG5leHQgcmV2aXNpb24KK29mIHRoZSBUSUZGIHNwZWMgd2lsbCByZXBsYWNlIHRoZSA2LjAgSlBFRyBkZXNpZ24gd2l0aCB0aGUgTm90ZSdzIGRlc2lnbi4KK0FsdGhvdWdoIElKRydzIG93biBjb2RlIGRvZXMgbm90IHN1cHBvcnQgVElGRi9KUEVHLCB0aGUgZnJlZSBsaWJ0aWZmIGxpYnJhcnkKK3VzZXMgb3VyIGxpYnJhcnkgdG8gaW1wbGVtZW50IFRJRkYvSlBFRyBwZXIgdGhlIE5vdGUuICBsaWJ0aWZmIGlzIGF2YWlsYWJsZQorZnJvbSBmdHA6Ly9mdHAuc2dpLmNvbS9ncmFwaGljcy90aWZmLy4KKworCitBUkNISVZFIExPQ0FUSU9OUworPT09PT09PT09PT09PT09PT0KKworVGhlICJvZmZpY2lhbCIgYXJjaGl2ZSBzaXRlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGZ0cC51dS5uZXQgKEludGVybmV0CithZGRyZXNzIDE5Mi40OC45Ni45KS4gIFRoZSBtb3N0IHJlY2VudCByZWxlYXNlZCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQKK3RoZXJlIGluIGRpcmVjdG9yeSBncmFwaGljcy9qcGVnLiAgVGhpcyBwYXJ0aWN1bGFyIHZlcnNpb24gd2lsbCBiZSBhcmNoaXZlZAorYXMgZnRwOi8vZnRwLnV1Lm5ldC9ncmFwaGljcy9qcGVnL2pwZWdzcmMudjZiLnRhci5nei4gIElmIHlvdSBkb24ndCBoYXZlCitkaXJlY3QgSW50ZXJuZXQgYWNjZXNzLCBVVU5FVCdzIGFyY2hpdmVzIGFyZSBhbHNvIGF2YWlsYWJsZSB2aWEgVVVDUDsgY29udGFjdAoraGVscEB1dW5ldC51dS5uZXQgZm9yIGluZm9ybWF0aW9uIG9uIHJldHJpZXZpbmcgZmlsZXMgdGhhdCB3YXkuCisKK051bWVyb3VzIEludGVybmV0IHNpdGVzIG1haW50YWluIGNvcGllcyBvZiB0aGUgVVVORVQgZmlsZXMuICBIb3dldmVyLCBvbmx5CitmdHAudXUubmV0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgbGF0ZXN0IG9mZmljaWFsIHZlcnNpb24uCisKK1lvdSBjYW4gYWxzbyBvYnRhaW4gdGhpcyBzb2Z0d2FyZSBpbiBET1MtY29tcGF0aWJsZSAiemlwIiBhcmNoaXZlIGZvcm1hdCBmcm9tCit0aGUgU2ltVGVsIGFyY2hpdmVzIChmdHA6Ly9mdHAuc2ltdGVsLm5ldC9wdWIvc2ltdGVsbmV0L21zZG9zL2dyYXBoaWNzLyksIG9yCitvbiBDb21wdVNlcnZlIGluIHRoZSBHcmFwaGljcyBTdXBwb3J0IGZvcnVtIChHTyBDSVM6R1JBUEhTVVApLCBsaWJyYXJ5IDEyCisiSlBFRyBUb29scyIuICBBZ2FpbiwgdGhlc2UgdmVyc2lvbnMgbWF5IHNvbWV0aW1lcyBsYWcgYmVoaW5kIHRoZSBmdHAudXUubmV0CityZWxlYXNlLgorCitUaGUgSlBFRyBGQVEgKEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zKSBhcnRpY2xlIGlzIGEgdXNlZnVsIHNvdXJjZSBvZgorZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBKUEVHLiAgSXQgaXMgdXBkYXRlZCBjb25zdGFudGx5IGFuZCB0aGVyZWZvcmUgaXMKK25vdCBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBGQVEgaXMgcG9zdGVkIGV2ZXJ5IHR3byB3ZWVrcyB0bworVXNlbmV0IG5ld3Nncm91cHMgY29tcC5ncmFwaGljcy5taXNjLCBuZXdzLmFuc3dlcnMsIGFuZCBvdGhlciBncm91cHMuCitJdCBpcyBhdmFpbGFibGUgb24gdGhlIFdvcmxkIFdpZGUgV2ViIGF0IGh0dHA6Ly93d3cuZmFxcy5vcmcvZmFxcy9qcGVnLWZhcS8KK2FuZCBvdGhlciBuZXdzLmFuc3dlcnMgYXJjaGl2ZSBzaXRlcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lhbCBuZXdzLmFuc3dlcnMKK2FyY2hpdmUgYXQgcnRmbS5taXQuZWR1OiBmdHA6Ly9ydGZtLm1pdC5lZHUvcHViL3VzZW5ldC9uZXdzLmFuc3dlcnMvanBlZy1mYXEvLgorSWYgeW91IGRvbid0IGhhdmUgV2ViIG9yIEZUUCBhY2Nlc3MsIHNlbmQgZS1tYWlsIHRvIG1haWwtc2VydmVyQHJ0Zm0ubWl0LmVkdQord2l0aCBib2R5CisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQxCisJc2VuZCB1c2VuZXQvbmV3cy5hbnN3ZXJzL2pwZWctZmFxL3BhcnQyCisKKworUkVMQVRFRCBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PQorCitOdW1lcm91cyB2aWV3aW5nIGFuZCBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMgbm93IHN1cHBvcnQgSlBFRy4gIChRdWl0ZSBhCitmZXcgb2YgdGhlbSB1c2UgdGhpcyBsaWJyYXJ5IHRvIGRvIHNvLikgIFRoZSBKUEVHIEZBUSBkZXNjcmliZWQgYWJvdmUgbGlzdHMKK3NvbWUgb2YgdGhlIG1vcmUgcG9wdWxhciBmcmVlIGFuZCBzaGFyZXdhcmUgdmlld2VycywgYW5kIHRlbGxzIHdoZXJlIHRvCitvYnRhaW4gdGhlbSBvbiBJbnRlcm5ldC4KKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgd2UgaGlnaGx5IHJlY29tbWVuZCBKZWYgUG9za2FuemVyJ3MgZnJlZQorUEJNUExVUyBzb2Z0d2FyZSwgd2hpY2ggcHJvdmlkZXMgbWFueSB1c2VmdWwgb3BlcmF0aW9ucyBvbiBQUE0tZm9ybWF0IGltYWdlCitmaWxlcy4gIEluIHBhcnRpY3VsYXIsIGl0IGNhbiBjb252ZXJ0IFBQTSBpbWFnZXMgdG8gYW5kIGZyb20gYSB3aWRlIHJhbmdlIG9mCitvdGhlciBmb3JtYXRzLCB0aHVzIG1ha2luZyBjanBlZy9kanBlZyBjb25zaWRlcmFibHkgbW9yZSB1c2VmdWwuICBUaGUgbGF0ZXN0Cit2ZXJzaW9uIGlzIGRpc3RyaWJ1dGVkIGJ5IHRoZSBOZXRQQk0gZ3JvdXAsIGFuZCBpcyBhdmFpbGFibGUgZnJvbSBudW1lcm91cworc2l0ZXMsIG5vdGFibHkgZnRwOi8vd3VhcmNoaXZlLnd1c3RsLmVkdS9ncmFwaGljcy9ncmFwaGljcy9wYWNrYWdlcy9OZXRQQk0vLgorVW5mb3J0dW5hdGVseSBQQk1QTFVTL05FVFBCTSBpcyBub3QgbmVhcmx5IGFzIHBvcnRhYmxlIGFzIHRoZSBJSkcgc29mdHdhcmUgaXM7Cit5b3UgYXJlIGxpa2VseSB0byBoYXZlIGRpZmZpY3VsdHkgbWFraW5nIGl0IHdvcmsgb24gYW55IG5vbi1Vbml4IG1hY2hpbmUuCisKK0EgZGlmZmVyZW50IGZyZWUgSlBFRyBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSB0aGUgUFZSRyBncm91cCBhdCBTdGFuZm9yZCwKK2lzIGF2YWlsYWJsZSBmcm9tIGZ0cDovL2hhdmVmdW4uc3RhbmZvcmQuZWR1L3B1Yi9qcGVnLy4gIFRoaXMgcHJvZ3JhbQoraXMgZGVzaWduZWQgZm9yIHJlc2VhcmNoIGFuZCBleHBlcmltZW50YXRpb24gcmF0aGVyIHRoYW4gcHJvZHVjdGlvbiB1c2U7CitpdCBpcyBzbG93ZXIsIGhhcmRlciB0byB1c2UsIGFuZCBsZXNzIHBvcnRhYmxlIHRoYW4gdGhlIElKRyBjb2RlLCBidXQgaXQKK2lzIGVhc2llciB0byByZWFkIGFuZCBtb2RpZnkuICBBbHNvLCB0aGUgUFZSRyBjb2RlIHN1cHBvcnRzIGxvc3NsZXNzIEpQRUcsCit3aGljaCB3ZSBkbyBub3QuICAoT24gdGhlIG90aGVyIGhhbmQsIGl0IGRvZXNuJ3QgZG8gcHJvZ3Jlc3NpdmUgSlBFRy4pCisKKworRklMRSBGT1JNQVQgV0FSUworPT09PT09PT09PT09PT09PQorCitTb21lIEpQRUcgcHJvZ3JhbXMgcHJvZHVjZSBmaWxlcyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG91ciBsaWJyYXJ5LgorVGhlIHJvb3Qgb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgSVNPIEpQRUcgY29tbWl0dGVlIGZhaWxlZCB0byBzcGVjaWZ5IGEKK2NvbmNyZXRlIGZpbGUgZm9ybWF0LiAgU29tZSB2ZW5kb3JzICJmaWxsZWQgaW4gdGhlIGJsYW5rcyIgb24gdGhlaXIgb3duLAorY3JlYXRpbmcgcHJvcHJpZXRhcnkgZm9ybWF0cyB0aGF0IG5vIG9uZSBlbHNlIGNvdWxkIHJlYWQuICAoRm9yIGV4YW1wbGUsIG5vbmUKK29mIHRoZSBlYXJseSBjb21tZXJjaWFsIEpQRUcgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgTWFjaW50b3NoIHdlcmUgYWJsZSB0bworZXhjaGFuZ2UgY29tcHJlc3NlZCBmaWxlcy4pCisKK1RoZSBmaWxlIGZvcm1hdCB3ZSBoYXZlIGFkb3B0ZWQgaXMgY2FsbGVkIEpGSUYgKHNlZSBSRUZFUkVOQ0VTKS4gIFRoaXMgZm9ybWF0CitoYXMgYmVlbiBhZ3JlZWQgdG8gYnkgYSBudW1iZXIgb2YgbWFqb3IgY29tbWVyY2lhbCBKUEVHIHZlbmRvcnMsIGFuZCBpdCBoYXMKK2JlY29tZSB0aGUgZGUgZmFjdG8gc3RhbmRhcmQuICBKRklGIGlzIGEgbWluaW1hbCBvciAibG93IGVuZCIgcmVwcmVzZW50YXRpb24uCitXZSByZWNvbW1lbmQgdGhlIHVzZSBvZiBUSUZGL0pQRUcgKFRJRkYgcmV2aXNpb24gNi4wIGFzIG1vZGlmaWVkIGJ5IFRJRkYKK1RlY2huaWNhbCBOb3RlICMyKSBmb3IgImhpZ2ggZW5kIiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIHJlY29yZCBhIGxvdCBvZgorYWRkaXRpb25hbCBkYXRhIGFib3V0IGFuIGltYWdlLiAgVElGRi9KUEVHIGlzIGZhaXJseSBuZXcgYW5kIG5vdCB5ZXQgd2lkZWx5CitzdXBwb3J0ZWQsIHVuZm9ydHVuYXRlbHkuCisKK1RoZSB1cGNvbWluZyBKUEVHIFBhcnQgMyBzdGFuZGFyZCBkZWZpbmVzIGEgZmlsZSBmb3JtYXQgY2FsbGVkIFNQSUZGLgorU1BJRkYgaXMgaW50ZXJvcGVyYWJsZSB3aXRoIEpGSUYsIGluIHRoZSBzZW5zZSB0aGF0IG1vc3QgSkZJRiBkZWNvZGVycyBzaG91bGQKK2JlIGFibGUgdG8gcmVhZCB0aGUgbW9zdCBjb21tb24gdmFyaWFudCBvZiBTUElGRi4gIFNQSUZGIGhhcyBzb21lIHRlY2huaWNhbAorYWR2YW50YWdlcyBvdmVyIEpGSUYsIGJ1dCBpdHMgbWFqb3IgY2xhaW0gdG8gZmFtZSBpcyBzaW1wbHkgdGhhdCBpdCBpcyBhbgorb2ZmaWNpYWwgc3RhbmRhcmQgcmF0aGVyIHRoYW4gYW4gaW5mb3JtYWwgb25lLiAgQXQgdGhpcyBwb2ludCBpdCBpcyB1bmNsZWFyCit3aGV0aGVyIFNQSUZGIHdpbGwgc3VwZXJzZWRlIEpGSUYgb3Igd2hldGhlciBKRklGIHdpbGwgcmVtYWluIHRoZSBkZS1mYWN0bworc3RhbmRhcmQuICBJSkcgaW50ZW5kcyB0byBzdXBwb3J0IFNQSUZGIG9uY2UgdGhlIHN0YW5kYXJkIGlzIGZyb3plbiwgYnV0IHdlCitoYXZlIG5vdCBkZWNpZGVkIHdoZXRoZXIgaXQgc2hvdWxkIGJlY29tZSBvdXIgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IG9yIG5vdC4KKyhJbiBhbnkgY2FzZSwgb3VyIGRlY29kZXIgd2lsbCByZW1haW4gY2FwYWJsZSBvZiByZWFkaW5nIEpGSUYgaW5kZWZpbml0ZWx5LikKKworVmFyaW91cyBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdHMgaW5jb3Jwb3JhdGluZyBKUEVHIGNvbXByZXNzaW9uIGFsc28gZXhpc3QuCitXZSBoYXZlIGxpdHRsZSBvciBubyBzeW1wYXRoeSBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGVzZSBmb3JtYXRzLiAgSW5kZWVkLAorb25lIG9mIHRoZSBvcmlnaW5hbCByZWFzb25zIGZvciBkZXZlbG9waW5nIHRoaXMgZnJlZSBzb2Z0d2FyZSB3YXMgdG8gaGVscAorZm9yY2UgY29udmVyZ2VuY2Ugb24gY29tbW9uLCBvcGVuIGZvcm1hdCBzdGFuZGFyZHMgZm9yIEpQRUcgZmlsZXMuICBEb24ndAordXNlIGEgcHJvcHJpZXRhcnkgZmlsZSBmb3JtYXQhCisKKworVE8gRE8KKz09PT09CisKK1RoZSBtYWpvciB0aHJ1c3QgZm9yIHY3IHdpbGwgcHJvYmFibHkgYmUgaW1wcm92ZW1lbnQgb2YgdmlzdWFsIHF1YWxpdHkuCitUaGUgY3VycmVudCBtZXRob2QgZm9yIHNjYWxpbmcgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgaXMga25vd24gbm90IHRvIGJlCit2ZXJ5IGdvb2QgYXQgbG93IFEgdmFsdWVzLiAgV2UgYWxzbyBpbnRlbmQgdG8gaW52ZXN0aWdhdGUgYmxvY2sgYm91bmRhcnkKK3Ntb290aGluZywgInBvb3IgbWFuJ3MgdmFyaWFibGUgcXVhbnRpemF0aW9uIiwgYW5kIG90aGVyIG1lYW5zIG9mIGltcHJvdmluZworcXVhbGl0eS12cy1maWxlLXNpemUgcGVyZm9ybWFuY2Ugd2l0aG91dCBzYWNyaWZpY2luZyBjb21wYXRpYmlsaXR5LgorCitJbiBmdXR1cmUgdmVyc2lvbnMsIHdlIGFyZSBjb25zaWRlcmluZyBzdXBwb3J0aW5nIHNvbWUgb2YgdGhlIHVwY29taW5nIEpQRUcKK1BhcnQgMyBleHRlbnNpb25zIC0tLSBwcmluY2lwYWxseSwgdmFyaWFibGUgcXVhbnRpemF0aW9uIGFuZCB0aGUgU1BJRkYgZmlsZQorZm9ybWF0LgorCitBcyBhbHdheXMsIHNwZWVkaW5nIHRoaW5ncyB1cCBpcyBvZiBncmVhdCBpbnRlcmVzdC4KKworUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMsIG9mZmVycyBvZiBoZWxwLCBldGMuIHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvVGhpcmRQYXJ0eVByb2plY3QucHJvcCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9UaGlyZFBhcnR5UHJvamVjdC5wcm9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGNjNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvVGhpcmRQYXJ0eVByb2plY3QucHJvcApAQCAtMCwwICsxLDkgQEAKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyNGcmkgSnVsIDE2IDEwOjAzOjA5IFBEVCAyMDEwCitjdXJyZW50VmVyc2lvbj04YQordmVyc2lvbj02YgoraXNOYXRpdmU9dHJ1ZQorbmFtZT1qcGVnCitrZXl3b3Jkcz1qcGVnCitvbkRldmljZT10cnVlCitob21lcGFnZT1odHRwXDovL3d3dy5pamcub3JnLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2Fuc2kya25yLjEgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvYW5zaTJrbnIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVlNWE2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2Fuc2kya25yLjEKQEAgLTAsMCArMSwzNiBAQAorLlRIIEFOU0kyS05SIDEgIjE5IEphbiAxOTk2IgorLlNIIE5BTUUKK2Fuc2kya25yIFwtIGNvbnZlcnQgQU5TSSBDIHRvIEtlcm5pZ2hhbiAmIFJpdGNoaWUgQworLlNIIFNZTk9QU0lTCisuSSBhbnNpMmtucgorWy0tdmFyYXJnc10gaW5wdXRfZmlsZSBbb3V0cHV0X2ZpbGVdCisuU0ggREVTQ1JJUFRJT04KK0lmIG5vIG91dHB1dF9maWxlIGlzIHN1cHBsaWVkLCBvdXRwdXQgZ29lcyB0byBzdGRvdXQuCisuYnIKK1RoZXJlIGFyZSBubyBlcnJvciBtZXNzYWdlcy4KKy5zcAorLkkgYW5zaTJrbnIKK3JlY29nbml6ZXMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgYnkgc2VlaW5nIGEgbm9uLWtleXdvcmQgaWRlbnRpZmllciBhdCB0aGUgbGVmdAorbWFyZ2luLCBmb2xsb3dlZCBieSBhIGxlZnQgcGFyZW50aGVzaXMsIHdpdGggYSByaWdodCBwYXJlbnRoZXNpcyBhcyB0aGUgbGFzdAorY2hhcmFjdGVyIG9uIHRoZSBsaW5lLCBhbmQgd2l0aCBhIGxlZnQgYnJhY2UgYXMgdGhlIGZpcnN0IHRva2VuIG9uIHRoZQorZm9sbG93aW5nIGxpbmUgKGlnbm9yaW5nIHBvc3NpYmxlIGludGVydmVuaW5nIGNvbW1lbnRzKS4gIEl0IHdpbGwgcmVjb2duaXplIGEKK211bHRpLWxpbmUgaGVhZGVyIHByb3ZpZGVkIHRoYXQgbm8gaW50ZXJ2ZW5pbmcgbGluZSBlbmRzIHdpdGggYSBsZWZ0IG9yIHJpZ2h0CiticmFjZSBvciBhIHNlbWljb2xvbi4gIFRoZXNlIGFsZ29yaXRobXMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBleGNlcHQKK3RoYXQgdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUuCisuc3AKK1RoZSBmb2xsb3dpbmcgY29uc3RydWN0cyB3aWxsIGNvbmZ1c2UgaXQ6CisuYnIKKyAgICAgLSBBbnkgb3RoZXIgY29uc3RydWN0IHRoYXQgc3RhcnRzIGF0IHRoZSBsZWZ0IG1hcmdpbiBhbmQgZm9sbG93cyB0aGUKK2Fib3ZlIHN5bnRheCAoc3VjaCBhcyBhIG1hY3JvIG9yIGZ1bmN0aW9uIGNhbGwpLgorLmJyCisgICAgIC0gU29tZSBtYWNyb3MgdGhhdCB0aW5rZXIgd2l0aCB0aGUgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiBoZWFkZXIuCisuc3AKK1RoZSAtLXZhcmFyZ3Mgc3dpdGNoIGlzIG9ic29sZXRlLCBhbmQgaXMgcmVjb2duaXplZCBvbmx5IGZvcgorYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBUaGUgcHJlc2VudCB2ZXJzaW9uIG9mCisuSSBhbnNpMmtucgord2lsbCBhbHdheXMgYXR0ZW1wdCB0byBjb252ZXJ0IGEgLi4uIGFyZ3VtZW50IHRvIHZhX2FsaXN0IGFuZCB2YV9kY2wuCisuU0ggQVVUSE9SCitMLiBQZXRlciBEZXV0c2NoIDxnaG9zdEBhbGFkZGluLmNvbT4gd3JvdGUgdGhlIG9yaWdpbmFsIGFuc2kya25yIGFuZAorY29udGludWVzIHRvIG1haW50YWluIHRoZSBjdXJyZW50IHZlcnNpb247IG1vc3Qgb2YgdGhlIGNvZGUgaW4gdGhlIGN1cnJlbnQKK3ZlcnNpb24gaXMgaGlzIHdvcmsuICBhbnNpMmtuciBhbHNvIGluY2x1ZGVzIGNvbnRyaWJ1dGlvbnMgYnkgRnJhbmNvaXMKK1BpbmFyZCA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+IGFuZCBKaW0gQXZlcmEgPGppbWFAbmV0Y29tLmNvbT4uCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvYW5zaTJrbnIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9hbnNpMmtuci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDVmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvYW5zaTJrbnIuYwpAQCAtMCwwICsxLDY5MyBAQAorLyogYW5zaTJrbnIuYyAqLworLyogQ29udmVydCBBTlNJIEMgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gSyZSICgidHJhZGl0aW9uYWwgQyIpIHN5bnRheCAqLworCisvKgorYW5zaTJrbnIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvciBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZSBmb3IgdGhlCitjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3IKK3dvcmtzIGF0IGFsbCwgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4gIFJlZmVyIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgKHRoZSAiR1BMIikgZm9yIGZ1bGwgZGV0YWlscy4KKworRXZlcnlvbmUgaXMgZ3JhbnRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSBhbmQgcmVkaXN0cmlidXRlIGFuc2kya25yLAorYnV0IG9ubHkgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBHUEwuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlCitpcyBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggYW5zaTJrbnIgc28geW91IGNhbiBrbm93Cit5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZSBpbiBhIGZpbGUgbmFtZWQgQ09QWUxFRlQuCitbSW4gdGhlIElKRyBkaXN0cmlidXRpb24sIHRoZSBHUEwgYXBwZWFycyBiZWxvdywgbm90IGluIGEgc2VwYXJhdGUgZmlsZS5dCitBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZAorb24gYWxsIGNvcGllcy4KKworV2UgZXhwbGljaXRseSBzdGF0ZSBoZXJlIHdoYXQgd2UgYmVsaWV2ZSBpcyBhbHJlYWR5IGltcGxpZWQgYnkgdGhlIEdQTDogaWYKK3RoZSBhbnNpMmtuciBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGFzIGEgc2VwYXJhdGUgc2V0IG9mIHNvdXJjZXMgYW5kIGEKK3NlcGFyYXRlIGV4ZWN1dGFibGUgZmlsZSB3aGljaCBhcmUgYWdncmVnYXRlZCBvbiBhIHN0b3JhZ2UgbWVkaXVtIHRvZ2V0aGVyCit3aXRoIGFub3RoZXIgcHJvZ3JhbSwgdGhpcyBpbiBpdHNlbGYgZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHByb2dyYW0gdW5kZXIKK3RoZSBHUEwsIG5vciBkb2VzIHRoZSBtZXJlIGZhY3QgdGhhdCBzdWNoIGEgcHJvZ3JhbSBvciB0aGUgcHJvY2VkdXJlcyBmb3IKK2NvbnN0cnVjdGluZyBpdCBpbnZva2UgdGhlIGFuc2kya25yIGV4ZWN1dGFibGUgYnJpbmcgYW55IG90aGVyIHBhcnQgb2YgdGhlCitwcm9ncmFtIHVuZGVyIHRoZSBHUEwuCisqLworCisvKgorLS0tLS0tLS0tLSBIZXJlIGlzIHRoZSBHTlUgR1BMIGZpbGUgQ09QWUxFRlQsIHJlZmVycmVkIHRvIGFib3ZlIC0tLS0tLS0tLS0KKy0tLS0tIFRoZXNlIHRlcm1zIGRvIE5PVCBhcHBseSB0byB0aGUgSlBFRyBzb2Z0d2FyZSBpdHNlbGY7IHNlZSBSRUFETUUgLS0tLS0tCisKKwkJICAgIEdIT1NUU0NSSVBUIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgIChDbGFyaWZpZWQgMTEgRmViIDE5ODgpCisKKyBDb3B5cmlnaHQgKEMpIDE5ODggUmljaGFyZCBNLiBTdGFsbG1hbgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGlzCisgbGljZW5zZSwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIHdvcmRpbmcKKyB0byBtYWtlIHRoZSB0ZXJtcyBmb3Igb3RoZXIgcHJvZ3JhbXMuCisKKyAgVGhlIGxpY2Vuc2UgYWdyZWVtZW50cyBvZiBtb3N0IHNvZnR3YXJlIGNvbXBhbmllcyBrZWVwIHlvdSBhdCB0aGUKK21lcmN5IG9mIHRob3NlIGNvbXBhbmllcy4gIEJ5IGNvbnRyYXN0LCBvdXIgZ2VuZXJhbCBwdWJsaWMgbGljZW5zZSBpcworaW50ZW5kZWQgdG8gZ2l2ZSBldmVyeW9uZSB0aGUgcmlnaHQgdG8gc2hhcmUgR2hvc3RzY3JpcHQuICBUbyBtYWtlIHN1cmUKK3RoYXQgeW91IGdldCB0aGUgcmlnaHRzIHdlIHdhbnQgeW91IHRvIGhhdmUsIHdlIG5lZWQgdG8gbWFrZQorcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdQordG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBIZW5jZSB0aGlzIGxpY2Vuc2UgYWdyZWVtZW50LgorCisgIFNwZWNpZmljYWxseSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gZ2l2ZQorYXdheSBjb3BpZXMgb2YgR2hvc3RzY3JpcHQsIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgZWxzZSBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSBHaG9zdHNjcmlwdCBvciB1c2UgcGllY2VzIG9mIGl0CitpbiBuZXcgZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gbWFrZSBzdXJlIHRoYXQgZXZlcnlvbmUgaGFzIHN1Y2ggcmlnaHRzLCB3ZSBoYXZlIHRvIGZvcmJpZCB5b3UgdG8KK2RlcHJpdmUgYW55b25lIGVsc2Ugb2YgdGhlc2UgcmlnaHRzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlCitjb3BpZXMgb2YgR2hvc3RzY3JpcHQsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHRlbGwgdGhlbSB0aGVpciByaWdodHMuCisKKyAgQWxzbywgZm9yIG91ciBvd24gcHJvdGVjdGlvbiwgd2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCBldmVyeW9uZSBmaW5kcworb3V0IHRoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIEdob3N0c2NyaXB0LiAgSWYgR2hvc3RzY3JpcHQgaXMKK21vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHdoYXQgd2UgZGlzdHJpYnV0ZWQsIHNvIHRoYXQgYW55IHByb2JsZW1zCitpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIG91ciByZXB1dGF0aW9uLgorCisgIFRoZXJlZm9yZSB3ZSAoUmljaGFyZCBNLiBTdGFsbG1hbiBhbmQgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKK0luYy4pIG1ha2UgdGhlIGZvbGxvd2luZyB0ZXJtcyB3aGljaCBzYXkgd2hhdCB5b3UgbXVzdCBkbyB0byBiZSBhbGxvd2VkCit0byBkaXN0cmlidXRlIG9yIGNoYW5nZSBHaG9zdHNjcmlwdC4KKworCisJCQlDT1BZSU5HIFBPTElDSUVTCisKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiBHaG9zdHNjcmlwdCBzb3VyY2UKK2NvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkKK2FuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGEgdmFsaWQgY29weXJpZ2h0IGFuZCBsaWNlbnNlCitub3RpY2UgIkNvcHlyaWdodCAoQykgMTk4OSBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0Rpc3RyaWJ1dGVkIGJ5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiIgKG9yIHdpdGggd2hhdGV2ZXIgeWVhciBpcworYXBwcm9wcmlhdGUpOyBrZWVwIGludGFjdCB0aGUgbm90aWNlcyBvbiBhbGwgZmlsZXMgdGhhdCByZWZlciB0byB0aGlzCitMaWNlbnNlIEFncmVlbWVudCBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIKK3JlY2lwaWVudHMgb2YgdGhlIEdob3N0c2NyaXB0IHByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQKK2Fsb25nIHdpdGggdGhlIHByb2dyYW0uICBZb3UgbWF5IGNoYXJnZSBhIGRpc3RyaWJ1dGlvbiBmZWUgZm9yIHRoZQorcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHkuCisKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiBHaG9zdHNjcmlwdCBvciBhbnkgcG9ydGlvbiBvZgoraXQsIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgb2YKK1BhcmFncmFwaCAxIGFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICBhKSBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMgc3RhdGluZworICAgIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlOyBhbmQKKworICAgIGIpIGNhdXNlIHRoZSB3aG9sZSBvZiBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsCisgICAgdGhhdCBpbiB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGEgZGVyaXZhdGl2ZSBvZiBHaG9zdHNjcmlwdAorICAgIG9yIGFueSBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKKyAgICBwYXJ0aWVzIG9uIHRlcm1zIGlkZW50aWNhbCB0byB0aG9zZSBjb250YWluZWQgaW4gdGhpcyBMaWNlbnNlCisgICAgQWdyZWVtZW50IChleGNlcHQgdGhhdCB5b3UgbWF5IGNob29zZSB0byBncmFudCBtb3JlIGV4dGVuc2l2ZQorICAgIHdhcnJhbnR5IHByb3RlY3Rpb24gdG8gc29tZSBvciBhbGwgdGhpcmQgcGFydGllcywgYXQgeW91ciBvcHRpb24pLgorCisgICAgYykgWW91IG1heSBjaGFyZ2UgYSBkaXN0cmlidXRpb24gZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mCisgICAgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkKKyAgICBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworTWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHVucmVsYXRlZCBwcm9ncmFtIHdpdGggdGhpcyBwcm9ncmFtIChvciBpdHMKK2Rlcml2YXRpdmUpIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nCit0aGUgb3RoZXIgcHJvZ3JhbSB1bmRlciB0aGUgc2NvcGUgb2YgdGhlc2UgdGVybXMuCisKKyAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIEdob3N0c2NyaXB0IChvciBhIHBvcnRpb24gb3IgZGVyaXZhdGl2ZQorb2YgaXQsIHVuZGVyIFBhcmFncmFwaCAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gdW5kZXIgdGhlCit0ZXJtcyBvZiBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlCitmb2xsb3dpbmc6CisKKyAgICBhKSBhY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgc291cmNlIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mCisgICAgUGFyYWdyYXBocyAxIGFuZCAyIGFib3ZlOyBvciwKKworICAgIGIpIGFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCisgICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5IGZyZWUgKGV4Y2VwdCBmb3IgYSBub21pbmFsCisgICAgc2hpcHBpbmcgY2hhcmdlKSBhIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUKKyAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YKKyAgICBQYXJhZ3JhcGhzIDEgYW5kIDIgYWJvdmU7IG9yLAorCisgICAgYykgYWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB3aGVyZSB0aGUKKyAgICBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZC4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gYWxvbmUuKQorCitGb3IgYW4gZXhlY3V0YWJsZSBmaWxlLCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvcgorYWxsIG1vZHVsZXMgaXQgY29udGFpbnM7IGJ1dCwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaXQgbmVlZCBub3QgaW5jbHVkZQorc291cmNlIGNvZGUgZm9yIG1vZHVsZXMgd2hpY2ggYXJlIHN0YW5kYXJkIGxpYnJhcmllcyB0aGF0IGFjY29tcGFueSB0aGUKK29wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgZmlsZSBydW5zLgorCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIHN1YmxpY2Vuc2UsIGRpc3RyaWJ1dGUgb3IgdHJhbnNmZXIgR2hvc3RzY3JpcHQKK2V4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlIEFncmVlbWVudC4gIEFueSBhdHRlbXB0CitvdGhlcndpc2UgdG8gY29weSwgc3VibGljZW5zZSwgZGlzdHJpYnV0ZSBvciB0cmFuc2ZlciBHaG9zdHNjcmlwdCBpcwordm9pZCBhbmQgeW91ciByaWdodHMgdG8gdXNlIHRoZSBwcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBhZ3JlZW1lbnQKK3NoYWxsIGJlIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlZC4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQKK2NvbXB1dGVyIHNvZnR3YXJlIHByb2dyYW1zIGZyb20geW91IHdpdGggdGhpcyBMaWNlbnNlIEFncmVlbWVudCB3aWxsIG5vdAoraGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsCitjb21wbGlhbmNlLgorCisgIDUuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIEdob3N0c2NyaXB0IGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24gYXQgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LiAgV2UgaGF2ZSBub3QKK3lldCB3b3JrZWQgb3V0IGEgc2ltcGxlIHJ1bGUgdGhhdCBjYW4gYmUgc3RhdGVkIGhlcmUsIGJ1dCB3ZSB3aWxsIG9mdGVuCitwZXJtaXQgdGhpcy4gIFdlIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZQorc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZQorc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUuCisKK1lvdXIgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zIGFib3V0IG91ciBsaWNlbnNpbmcgcG9saWNpZXMgYW5kIG91cgorc29mdHdhcmUgYXJlIHdlbGNvbWUhICBQbGVhc2UgY29udGFjdCB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBvciBjYWxsICg2MTcpIDg3Ni0zMjk2LgorCisJCSAgICAgICBOTyBXQVJSQU5UWQorCisgIEJFQ0FVU0UgR0hPU1RTQ1JJUFQgSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFdFIFBST1ZJREUgQUJTT0xVVEVMWQorTk8gV0FSUkFOVFksIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgU1RBVEUgTEFXLiAgRVhDRVBUCitXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORywgRlJFRSBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMsIFJJQ0hBUkQKK00uIFNUQUxMTUFOLCBBTEFERElOIEVOVEVSUFJJU0VTLCBMLiBQRVRFUiBERVVUU0NILCBBTkQvT1IgT1RIRVIgUEFSVElFUworUFJPVklERSBHSE9TVFNDUklQVCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUgorRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgVEhFCitFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgR0hPU1RTQ1JJUFQgSVMgV0lUSAorWU9VLiAgU0hPVUxEIEdIT1NUU0NSSVBUIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwKK05FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBXSUxMIFJJQ0hBUkQgTS4KK1NUQUxMTUFOLCBUSEUgRlJFRSBTT0ZUV0FSRSBGT1VOREFUSU9OLCBJTkMuLCBMLiBQRVRFUiBERVVUU0NILCBBTEFERElOCitFTlRFUlBSSVNFUywgQU5EL09SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTUFZIE1PRElGWSBBTkQgUkVESVNUUklCVVRFCitHSE9TVFNDUklQVCBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORworQU5ZIExPU1QgUFJPRklUUywgTE9TVCBNT05JRVMsIE9SIE9USEVSIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9SIElOQUJJTElUWSBUTyBVU0UKKyhJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVECitJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFCitQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpIEdIT1NUU0NSSVBULCBFVkVOIElGIFlPVQorSEFWRSBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUywgT1IgRk9SIEFOWSBDTEFJTQorQlkgQU5ZIE9USEVSIFBBUlRZLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2YgZmlsZSBDT1BZTEVGVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiBVc2FnZToKKwlhbnNpMmtuciBpbnB1dF9maWxlIFtvdXRwdXRfZmlsZV0KKyAqIElmIG5vIG91dHB1dF9maWxlIGlzIHN1cHBsaWVkLCBvdXRwdXQgZ29lcyB0byBzdGRvdXQuCisgKiBUaGVyZSBhcmUgbm8gZXJyb3IgbWVzc2FnZXMuCisgKgorICogYW5zaTJrbnIgcmVjb2duaXplcyBmdW5jdGlvbiBkZWZpbml0aW9ucyBieSBzZWVpbmcgYSBub24ta2V5d29yZAorICogaWRlbnRpZmllciBhdCB0aGUgbGVmdCBtYXJnaW4sIGZvbGxvd2VkIGJ5IGEgbGVmdCBwYXJlbnRoZXNpcywKKyAqIHdpdGggYSByaWdodCBwYXJlbnRoZXNpcyBhcyB0aGUgbGFzdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUsCisgKiBhbmQgd2l0aCBhIGxlZnQgYnJhY2UgYXMgdGhlIGZpcnN0IHRva2VuIG9uIHRoZSBmb2xsb3dpbmcgbGluZQorICogKGlnbm9yaW5nIHBvc3NpYmxlIGludGVydmVuaW5nIGNvbW1lbnRzKS4KKyAqIEl0IHdpbGwgcmVjb2duaXplIGEgbXVsdGktbGluZSBoZWFkZXIgcHJvdmlkZWQgdGhhdCBubyBpbnRlcnZlbmluZworICogbGluZSBlbmRzIHdpdGggYSBsZWZ0IG9yIHJpZ2h0IGJyYWNlIG9yIGEgc2VtaWNvbG9uLgorICogVGhlc2UgYWxnb3JpdGhtcyBpZ25vcmUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMsIGV4Y2VwdCB0aGF0CisgKiB0aGUgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZS4KKyAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyB3aWxsIGNvbmZ1c2UgaXQ6CisgKgktIEFueSBvdGhlciBjb25zdHJ1Y3QgdGhhdCBzdGFydHMgYXQgdGhlIGxlZnQgbWFyZ2luIGFuZAorICoJICAgIGZvbGxvd3MgdGhlIGFib3ZlIHN5bnRheCAoc3VjaCBhcyBhIG1hY3JvIG9yIGZ1bmN0aW9uIGNhbGwpLgorICoJLSBTb21lIG1hY3JvcyB0aGF0IHRpbmtlciB3aXRoIHRoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGhlYWRlci4KKyAqLworCisvKgorICogVGhlIG9yaWdpbmFsIGFuZCBwcmluY2lwYWwgYXV0aG9yIG9mIGFuc2kya25yIGlzIEwuIFBldGVyIERldXRzY2gKKyAqIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKKyAqIHRoYXQgZm9sbG93cyAoaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyKToKKwlscGQgOTYtMDEtMjEgYWRkZWQgY29kZSB0byBjb3BlIHdpdGggbm90IEhBVkVfQ09ORklHX0ggYW5kIHdpdGgKKwkJY29tcGlsZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCB2b2lkLCBhcyBzdWdnZXN0ZWQgYnkKKwkJVG9tIExhbmUKKwlscGQgOTYtMDEtMTUgY2hhbmdlZCB0byByZXF1aXJlIHRoYXQgdGhlIGZpcnN0IG5vbi1jb21tZW50IHRva2VuCisJCW9uIHRoZSBsaW5lIGZvbGxvd2luZyBhIGZ1bmN0aW9uIGhlYWRlciBiZSBhIGxlZnQgYnJhY2UsCisJCXRvIHJlZHVjZSBzZW5zaXRpdml0eSB0byBtYWNyb3MsIGFzIHN1Z2dlc3RlZCBieSBUb20gTGFuZQorCQk8dGdsQHNzcy5wZ2gucGEudXM+CisJbHBkIDk1LTA2LTIyIHJlbW92ZWQgI2lmbmRlZnMgd2hvc2Ugc29sZSBwdXJwb3NlIHdhcyB0byBkZWZpbmUKKwkJdW5kZWZpbmVkIHByZXByb2Nlc3NvciBzeW1ib2xzIGFzIDA7IGNoYW5nZWQgYWxsICNpZmRlZnMKKwkJZm9yIGNvbmZpZ3VyYXRpb24gc3ltYm9scyB0byAjaWZzCisJbHBkIDk1LTA0LTA1IGNoYW5nZWQgY29weXJpZ2h0IG5vdGljZSB0byBtYWtlIGl0IGNsZWFyIHRoYXQKKwkJaW5jbHVkaW5nIGFuc2kya25yIGluIGEgcHJvZ3JhbSBkb2VzIG5vdCBicmluZyB0aGUgZW50aXJlCisJCXByb2dyYW0gdW5kZXIgdGhlIEdQTAorCWxwZCA5NC0xMi0xOCBhZGRlZCBjb25kaXRpb25hbHMgZm9yIHN5c3RlbXMgd2hlcmUgY3R5cGUgbWFjcm9zCisJCWRvbid0IGhhbmRsZSA4LWJpdCBjaGFyYWN0ZXJzIHByb3Blcmx5LCBzdWdnZXN0ZWQgYnkKKwkJRnJhbmNvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT47CisJCXJlbW92ZWQgLS12YXJhcmdzIHN3aXRjaCAodGhpcyBpcyBub3cgdGhlIGRlZmF1bHQpCisJbHBkIDk0LTEwLTEwIHJlbW92ZWQgQ09ORklHX0JST0tFVFMgY29uZGl0aW9uYWwKKwlscGQgOTQtMDctMTYgYWRkZWQgc29tZSBjb25kaXRpb25hbHMgdG8gaGVscCBHTlUgYGNvbmZpZ3VyZScsCisJCXN1Z2dlc3RlZCBieSBGcmFuY29pcyBQaW5hcmQgPHBpbmFyZEBpcm8udW1vbnRyZWFsLmNhPjsKKwkJcHJvcGVybHkgZXJhc2UgcHJvdG90eXBlIGFyZ3MgaW4gZnVuY3Rpb24gcGFyYW1ldGVycywKKwkJY29udHJpYnV0ZWQgYnkgSmltIEF2ZXJhIDxqaW1hQG5ldGNvbS5jb20+OworCQljb3JyZWN0IGVycm9yIGluIHdyaXRlYmxhbmtzIChpdCBzaG91bGRuJ3QgZXJhc2UgRU9McykKKwlscGQgODkteHgteHggb3JpZ2luYWwgdmVyc2lvbgorICovCisKKy8qIE1vc3Qgb2YgdGhlIGNvbmRpdGlvbmFscyBoZXJlIGFyZSB0byBtYWtlIGFuc2kya25yIHdvcmsgd2l0aCAqLworLyogb3Igd2l0aG91dCB0aGUgR05VIGNvbmZpZ3VyZSBtYWNoaW5lcnkuICovCisKKyNpZiBIQVZFX0NPTkZJR19ICisjIGluY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpZiBIQVZFX0NPTkZJR19ICisKKy8qCisgICBGb3IgcHJvcGVybHkgYXV0b2NvbmZpZ3VyaW5nIGFuc2kya25yLCB1c2UgQUNfQ09ORklHX0hFQURFUihjb25maWcuaCkuCisgICBUaGlzIHdpbGwgZGVmaW5lIEhBVkVfQ09ORklHX0ggYW5kIHNvLCBhY3RpdmF0ZSB0aGUgZm9sbG93aW5nIGxpbmVzLgorICovCisKKyMgaWYgU1REQ19IRUFERVJTIHx8IEhBVkVfU1RSSU5HX0gKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorIyBlbHNlCisjICBpbmNsdWRlIDxzdHJpbmdzLmg+CisjIGVuZGlmCisKKyNlbHNlIC8qIG5vdCBIQVZFX0NPTkZJR19IICovCisKKy8qIE90aGVyd2lzZSBkbyBpdCB0aGUgaGFyZCB3YXkgKi8KKworIyBpZmRlZiBCU0QKKyMgIGluY2x1ZGUgPHN0cmluZ3MuaD4KKyMgZWxzZQorIyAgaWZkZWYgVk1TCisgICAgZXh0ZXJuIGludCBzdHJsZW4oKSwgc3RybmNtcCgpOworIyAgZWxzZQorIyAgIGluY2x1ZGUgPHN0cmluZy5oPgorIyAgZW5kaWYKKyMgZW5kaWYKKworI2VuZGlmIC8qIG5vdCBIQVZFX0NPTkZJR19IICovCisKKyNpZiBTVERDX0hFQURFUlMKKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZWxzZQorLyoKKyAgIG1hbGxvYyBhbmQgZnJlZSBzaG91bGQgYmUgZGVjbGFyZWQgaW4gc3RkbGliLmgsCisgICBidXQgaWYgeW91J3ZlIGdvdCBhIEsmUiBjb21waWxlciwgdGhleSBwcm9iYWJseSBhcmVuJ3QuCisgKi8KKyMgaWZkZWYgTVNET1MKKyMgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyBlbHNlCisjICBpZmRlZiBWTVMKKyAgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYygpOworICAgICBleHRlcm4gdm9pZCBmcmVlKCk7CisjICBlbHNlCisgICAgIGV4dGVybiBjaGFyICptYWxsb2MoKTsKKyAgICAgZXh0ZXJuIGludCBmcmVlKCk7CisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYKKworLyoKKyAqIFRoZSBjdHlwZSBtYWNyb3MgZG9uJ3QgYWx3YXlzIGhhbmRsZSA4LWJpdCBjaGFyYWN0ZXJzIGNvcnJlY3RseS4KKyAqIENvbXBlbnNhdGUgZm9yIHRoaXMgaGVyZS4KKyAqLworI2lmZGVmIGlzYXNjaWkKKyMgIHVuZGVmIEhBVkVfSVNBU0NJSQkJLyoganVzdCBpbiBjYXNlICovCisjICBkZWZpbmUgSEFWRV9JU0FTQ0lJIDEKKyNlbHNlCisjZW5kaWYKKyNpZiBTVERDX0hFQURFUlMgfHwgIUhBVkVfSVNBU0NJSQorIyAgZGVmaW5lIGlzX2FzY2lpKGMpIDEKKyNlbHNlCisjICBkZWZpbmUgaXNfYXNjaWkoYykgaXNhc2NpaShjKQorI2VuZGlmCisKKyNkZWZpbmUgaXNfc3BhY2UoYykgKGlzX2FzY2lpKGMpICYmIGlzc3BhY2UoYykpCisjZGVmaW5lIGlzX2FscGhhKGMpIChpc19hc2NpaShjKSAmJiBpc2FscGhhKGMpKQorI2RlZmluZSBpc19hbG51bShjKSAoaXNfYXNjaWkoYykgJiYgaXNhbG51bShjKSkKKworLyogU2Nhbm5pbmcgbWFjcm9zICovCisjZGVmaW5lIGlzaWRjaGFyKGNoKSAoaXNfYWxudW0oY2gpIHx8IChjaCkgPT0gJ18nKQorI2RlZmluZSBpc2lkZmlyc3RjaGFyKGNoKSAoaXNfYWxwaGEoY2gpIHx8IChjaCkgPT0gJ18nKQorCisvKiBGb3J3YXJkIHJlZmVyZW5jZXMgKi8KK2NoYXIgKnNraXBzcGFjZSgpOworaW50IHdyaXRlYmxhbmtzKCk7CitpbnQgdGVzdDEoKTsKK2ludCBjb252ZXJ0MSgpOworCisvKiBUaGUgbWFpbiBwcm9ncmFtICovCitpbnQKK21haW4oYXJnYywgYXJndikKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICphcmd2W107Cit7CUZJTEUgKmluLCAqb3V0OworI2RlZmluZSBidWZzaXplIDUwMDAJCQkvKiBhcmJpdHJhcnkgc2l6ZSAqLworCWNoYXIgKmJ1ZjsKKwljaGFyICpsaW5lOworCWNoYXIgKm1vcmU7CisJLyoKKwkgKiBJbiBwcmV2aW91cyB2ZXJzaW9ucywgYW5zaTJrbnIgcmVjb2duaXplZCBhIC0tdmFyYXJncyBzd2l0Y2guCisJICogSWYgdGhpcyBzd2l0Y2ggd2FzIHN1cHBsaWVkLCBhbnNpMmtuciB3b3VsZCBhdHRlbXB0IHRvIGNvbnZlcnQKKwkgKiBhIC4uLiBhcmd1bWVudCB0byB2YV9hbGlzdCBhbmQgdmFfZGNsOyBpZiB0aGlzIHN3aXRjaCB3YXMgbm90CisJICogc3VwcGxpZWQsIGFuc2kya25yIHdvdWxkIHNpbXBseSBkcm9wIGFueSBzdWNoIGFyZ3VtZW50cy4KKwkgKiBOb3csIGFuc2kya25yIGFsd2F5cyBkb2VzIHRoaXMgY29udmVyc2lvbiwgYW5kIHdlIG9ubHkKKwkgKiBjaGVjayBmb3IgdGhpcyBzd2l0Y2ggZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisJICovCisJaW50IGNvbnZlcnRfdmFyYXJncyA9IDE7CisKKwlpZiAoIGFyZ2MgPiAxICYmIGFyZ3ZbMV1bMF0gPT0gJy0nICkKKwkgIHsJaWYgKCAhc3RyY21wKGFyZ3ZbMV0sICItLXZhcmFyZ3MiKSApCisJCSAgewljb252ZXJ0X3ZhcmFyZ3MgPSAxOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkgIH0KKwkJZWxzZQorCQkgIHsJZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgc3dpdGNoOiAlc1xuIiwgYXJndlsxXSk7CisJCQlleGl0KDEpOworCQkgIH0KKwkgIH0KKwlzd2l0Y2ggKCBhcmdjICkKKwkgICB7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVc2FnZTogYW5zaTJrbnIgaW5wdXRfZmlsZSBbb3V0cHV0X2ZpbGVdXG4iKTsKKwkJZXhpdCgwKTsKKwljYXNlIDI6CisJCW91dCA9IHN0ZG91dDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlvdXQgPSBmb3Blbihhcmd2WzJdLCAidyIpOworCQlpZiAoIG91dCA9PSBOVUxMICkKKwkJICAgewlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBhcmd2WzJdKTsKKwkJCWV4aXQoMSk7CisJCSAgIH0KKwkgICB9CisJaW4gPSBmb3Blbihhcmd2WzFdLCAiciIpOworCWlmICggaW4gPT0gTlVMTCApCisJICAgewlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDEpOworCSAgIH0KKwlmcHJpbnRmKG91dCwgIiNsaW5lIDEgXCIlc1wiXG4iLCBhcmd2WzFdKTsKKwlidWYgPSBtYWxsb2MoYnVmc2l6ZSk7CisJbGluZSA9IGJ1ZjsKKwl3aGlsZSAoIGZnZXRzKGxpbmUsICh1bnNpZ25lZCkoYnVmICsgYnVmc2l6ZSAtIGxpbmUpLCBpbikgIT0gTlVMTCApCisJICAgewordGVzdDoJCWxpbmUgKz0gc3RybGVuKGxpbmUpOworCQlzd2l0Y2ggKCB0ZXN0MShidWYpICkKKwkJICAgeworCQljYXNlIDI6CQkJLyogYSBmdW5jdGlvbiBoZWFkZXIgKi8KKwkJCWNvbnZlcnQxKGJ1Ziwgb3V0LCAxLCBjb252ZXJ0X3ZhcmFyZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgMToJCQkvKiBhIGZ1bmN0aW9uICovCisJCQkvKiBDaGVjayBmb3IgYSB7IGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLiAqLworCQkJbW9yZSA9ICsrbGluZTsKK2Y6CQkJaWYgKCBsaW5lID49IGJ1ZiArIChidWZzaXplIC0gMSkgKSAvKiBvdmVyZmxvdyBjaGVjayAqLworCQkJICBnb3RvIHdsOworCQkJaWYgKCBmZ2V0cyhsaW5lLCAodW5zaWduZWQpKGJ1ZiArIGJ1ZnNpemUgLSBsaW5lKSwgaW4pID09IE5VTEwgKQorCQkJICBnb3RvIHdsOworCQkJc3dpdGNoICggKnNraXBzcGFjZShtb3JlLCAxKSApCisJCQkgIHsKKwkJCSAgY2FzZSAneyc6CisJCQkgICAgLyogRGVmaW5pdGVseSBhIGZ1bmN0aW9uIGhlYWRlci4gKi8KKwkJCSAgICBjb252ZXJ0MShidWYsIG91dCwgMCwgY29udmVydF92YXJhcmdzKTsKKwkJCSAgICBmcHV0cyhtb3JlLCBvdXQpOworCQkJICAgIGJyZWFrOworCQkJICBjYXNlIDA6CisJCQkgICAgLyogVGhlIG5leHQgbGluZSB3YXMgYmxhbmsgb3IgYSBjb21tZW50OiAqLworCQkJICAgIC8qIGtlZXAgc2Nhbm5pbmcgZm9yIGEgbm9uLWNvbW1lbnQuICovCisJCQkgICAgbGluZSArPSBzdHJsZW4obGluZSk7CisJCQkgICAgZ290byBmOworCQkJICBkZWZhdWx0OgorCQkJICAgIC8qIGJ1ZiBpc24ndCBhIGZ1bmN0aW9uIGhlYWRlciwgYnV0ICovCisJCQkgICAgLyogbW9yZSBtaWdodCBiZS4gKi8KKwkJCSAgICBmcHV0cyhidWYsIG91dCk7CisJCQkgICAgc3RyY3B5KGJ1ZiwgbW9yZSk7CisJCQkgICAgbGluZSA9IGJ1ZjsKKwkJCSAgICBnb3RvIHRlc3Q7CisJCQkgIH0KKwkJCWJyZWFrOworCQljYXNlIC0xOgkJLyogbWF5YmUgdGhlIHN0YXJ0IG9mIGEgZnVuY3Rpb24gKi8KKwkJCWlmICggbGluZSAhPSBidWYgKyAoYnVmc2l6ZSAtIDEpICkgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKwkJCSAgY29udGludWU7CisJCQkvKiBmYWxscyB0aHJvdWdoICovCisJCWRlZmF1bHQ6CQkvKiBub3QgYSBmdW5jdGlvbiAqLword2w6CQkJZnB1dHMoYnVmLCBvdXQpOworCQkJYnJlYWs7CisJCSAgIH0KKwkJbGluZSA9IGJ1ZjsKKwkgICB9CisJaWYgKCBsaW5lICE9IGJ1ZiApCisJICBmcHV0cyhidWYsIG91dCk7CisJZnJlZShidWYpOworCWZjbG9zZShvdXQpOworCWZjbG9zZShpbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNraXAgb3ZlciBzcGFjZSBhbmQgY29tbWVudHMsIGluIGVpdGhlciBkaXJlY3Rpb24uICovCitjaGFyICoKK3NraXBzcGFjZShwLCBkaXIpCisgICAgcmVnaXN0ZXIgY2hhciAqcDsKKyAgICByZWdpc3RlciBpbnQgZGlyOwkJCS8qIDEgZm9yIGZvcndhcmQsIC0xIGZvciBiYWNrd2FyZCAqLworewlmb3IgKCA7IDsgKQorCSAgIHsJd2hpbGUgKCBpc19zcGFjZSgqcCkgKQorCQkgIHAgKz0gZGlyOworCQlpZiAoICEoKnAgPT0gJy8nICYmIHBbZGlyXSA9PSAnKicpICkKKwkJICBicmVhazsKKwkJcCArPSBkaXI7ICBwICs9IGRpcjsKKwkJd2hpbGUgKCAhKCpwID09ICcqJyAmJiBwW2Rpcl0gPT0gJy8nKSApCisJCSAgIHsJaWYgKCAqcCA9PSAwICkKKwkJCSAgcmV0dXJuIHA7CS8qIG11bHRpLWxpbmUgY29tbWVudD8/ICovCisJCQlwICs9IGRpcjsKKwkJICAgfQorCQlwICs9IGRpcjsgIHAgKz0gZGlyOworCSAgIH0KKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIFdyaXRlIGJsYW5rcyBvdmVyIHBhcnQgb2YgYSBzdHJpbmcuCisgKiBEb24ndCBvdmVyd3JpdGUgZW5kLW9mLWxpbmUgY2hhcmFjdGVycy4KKyAqLworaW50Cit3cml0ZWJsYW5rcyhzdGFydCwgZW5kKQorICAgIGNoYXIgKnN0YXJ0OworICAgIGNoYXIgKmVuZDsKK3sJY2hhciAqcDsKKwlmb3IgKCBwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKyApCisJICBpZiAoICpwICE9ICdccicgJiYgKnAgIT0gJ1xuJyApCisJICAgICpwID0gJyAnOworCXJldHVybiAwOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSBzdHJpbmcgaW4gYnVmIGlzIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqIFRoZSBzdHJpbmcgbWF5IGNvbnRhaW4gYW5kL29yIGVuZCB3aXRoIGEgbmV3bGluZS4KKyAqIFJldHVybiBhcyBmb2xsb3dzOgorICoJMCAtIGRlZmluaXRlbHkgbm90IGEgZnVuY3Rpb24gZGVmaW5pdGlvbjsKKyAqCTEgLSBkZWZpbml0ZWx5IGEgZnVuY3Rpb24gZGVmaW5pdGlvbjsKKyAqCTIgLSBkZWZpbml0ZWx5IGEgZnVuY3Rpb24gcHJvdG90eXBlIChOT1QgVVNFRCk7CisgKgktMSAtIG1heSBiZSB0aGUgYmVnaW5uaW5nIG9mIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwKKyAqCQlhcHBlbmQgYW5vdGhlciBsaW5lIGFuZCBsb29rIGFnYWluLgorICogVGhlIHJlYXNvbiB3ZSBkb24ndCBhdHRlbXB0IHRvIGNvbnZlcnQgZnVuY3Rpb24gcHJvdG90eXBlcyBpcyB0aGF0CisgKiBHaG9zdHNjcmlwdCdzIGRlY2xhcmF0aW9uLWdlbmVyYXRpbmcgbWFjcm9zIGxvb2sgdG9vIG11Y2ggbGlrZQorICogcHJvdG90eXBlcywgYW5kIGNvbmZ1c2UgdGhlIGFsZ29yaXRobXMuCisgKi8KK2ludAordGVzdDEoYnVmKQorICAgIGNoYXIgKmJ1ZjsKK3sJcmVnaXN0ZXIgY2hhciAqcCA9IGJ1ZjsKKwljaGFyICpiZW5kOworCWNoYXIgKmVuZGZuOworCWludCBjb250aW47CisKKwlpZiAoICFpc2lkZmlyc3RjaGFyKCpwKSApCisJICByZXR1cm4gMDsJCS8qIG5vIG5hbWUgYXQgbGVmdCBtYXJnaW4gKi8KKwliZW5kID0gc2tpcHNwYWNlKGJ1ZiArIHN0cmxlbihidWYpIC0gMSwgLTEpOworCXN3aXRjaCAoICpiZW5kICkKKwkgICB7CisJICAgY2FzZSAnOyc6IGNvbnRpbiA9IDAgLyoyKi87IGJyZWFrOworCSAgIGNhc2UgJyknOiBjb250aW4gPSAxOyBicmVhazsKKwkgICBjYXNlICd7JzogcmV0dXJuIDA7CQkvKiBub3QgYSBmdW5jdGlvbiAqLworCSAgIGNhc2UgJ30nOiByZXR1cm4gMDsJCS8qIG5vdCBhIGZ1bmN0aW9uICovCisJICAgZGVmYXVsdDogY29udGluID0gLTE7CisJICAgfQorCXdoaWxlICggaXNpZGNoYXIoKnApICkKKwkgIHArKzsKKwllbmRmbiA9IHA7CisJcCA9IHNraXBzcGFjZShwLCAxKTsKKwlpZiAoICpwKysgIT0gJygnICkKKwkgIHJldHVybiAwOwkJLyogbm90IGEgZnVuY3Rpb24gKi8KKwlwID0gc2tpcHNwYWNlKHAsIDEpOworCWlmICggKnAgPT0gJyknICkKKwkgIHJldHVybiAwOwkJLyogbm8gcGFyYW1ldGVycyAqLworCS8qIENoZWNrIHRoYXQgdGhlIGFwcGFyZW50IGZ1bmN0aW9uIG5hbWUgaXNuJ3QgYSBrZXl3b3JkLiAqLworCS8qIFdlIG9ubHkgbmVlZCB0byBjaGVjayBmb3Iga2V5d29yZHMgdGhhdCBjb3VsZCBiZSBmb2xsb3dlZCAqLworCS8qIGJ5IGEgbGVmdCBwYXJlbnRoZXNpcyAod2hpY2gsIHVuZm9ydHVuYXRlbHksIGlzIG1vc3Qgb2YgdGhlbSkuICovCisJICAgewlzdGF0aWMgY2hhciAqd29yZHNbXSA9CisJCSAgIHsJImFzbSIsICJhdXRvIiwgImNhc2UiLCAiY2hhciIsICJjb25zdCIsICJkb3VibGUiLAorCQkJImV4dGVybiIsICJmbG9hdCIsICJmb3IiLCAiaWYiLCAiaW50IiwgImxvbmciLAorCQkJInJlZ2lzdGVyIiwgInJldHVybiIsICJzaG9ydCIsICJzaWduZWQiLCAic2l6ZW9mIiwKKwkJCSJzdGF0aWMiLCAic3dpdGNoIiwgInR5cGVkZWYiLCAidW5zaWduZWQiLAorCQkJInZvaWQiLCAidm9sYXRpbGUiLCAid2hpbGUiLCAwCisJCSAgIH07CisJCWNoYXIgKiprZXkgPSB3b3JkczsKKwkJY2hhciAqa3A7CisJCWludCBsZW4gPSBlbmRmbiAtIGJ1ZjsKKworCQl3aGlsZSAoIChrcCA9ICprZXkpICE9IDAgKQorCQkgICB7CWlmICggc3RybGVuKGtwKSA9PSBsZW4gJiYgIXN0cm5jbXAoa3AsIGJ1ZiwgbGVuKSApCisJCQkgIHJldHVybiAwOwkvKiBuYW1lIGlzIGEga2V5d29yZCAqLworCQkJa2V5Kys7CisJCSAgIH0KKwkgICB9CisJcmV0dXJuIGNvbnRpbjsKK30KKworLyogQ29udmVydCBhIHJlY29nbml6ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBoZWFkZXIgdG8gSyZSIHN5bnRheC4gKi8KK2ludAorY29udmVydDEoYnVmLCBvdXQsIGhlYWRlciwgY29udmVydF92YXJhcmdzKQorICAgIGNoYXIgKmJ1ZjsKKyAgICBGSUxFICpvdXQ7CisgICAgaW50IGhlYWRlcjsJCQkvKiBCb29sZWFuICovCisgICAgaW50IGNvbnZlcnRfdmFyYXJnczsJLyogQm9vbGVhbiAqLworewljaGFyICplbmRmbjsKKwlyZWdpc3RlciBjaGFyICpwOworCWNoYXIgKipicmVha3M7CisJdW5zaWduZWQgbnVtX2JyZWFrcyA9IDI7CS8qIGZvciB0ZXN0aW5nICovCisJY2hhciAqKmJ0b3A7CisJY2hhciAqKmJwOworCWNoYXIgKiphcDsKKwljaGFyICp2YXJhcmcgPSAwOworCisJLyogUHJlLUFOU0kgaW1wbGVtZW50YXRpb25zIGRvbid0IGFncmVlIG9uIHdoZXRoZXIgc3RyY2hyICovCisJLyogaXMgY2FsbGVkIHN0cmNociBvciBpbmRleCwgc28gd2Ugb3Blbi1jb2RlIGl0IGhlcmUuICovCisJZm9yICggZW5kZm4gPSBidWY7ICooZW5kZm4rKykgIT0gJygnOyApCisJICA7Cit0b3A6CXAgPSBlbmRmbjsKKwlicmVha3MgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBudW1fYnJlYWtzICogMik7CisJaWYgKCBicmVha3MgPT0gMCApCisJICAgewkvKiBDb3VsZG4ndCBhbGxvY2F0ZSBicmVhayB0YWJsZSwgZ2l2ZSB1cCAqLworCQlmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBicmVhayB0YWJsZSFcbiIpOworCQlmcHV0cyhidWYsIG91dCk7CisJCXJldHVybiAtMTsKKwkgICB9CisJYnRvcCA9IGJyZWFrcyArIG51bV9icmVha3MgKiAyIC0gMjsKKwlicCA9IGJyZWFrczsKKwkvKiBQYXJzZSB0aGUgYXJndW1lbnQgbGlzdCAqLworCWRvCisJICAgewlpbnQgbGV2ZWwgPSAwOworCQljaGFyICpscCA9IE5VTEw7CisJCWNoYXIgKnJwOworCQljaGFyICplbmQgPSBOVUxMOworCisJCWlmICggYnAgPj0gYnRvcCApCisJCSAgIHsJLyogRmlsbGVkIHVwIGJyZWFrIHRhYmxlLiAqLworCQkJLyogQWxsb2NhdGUgYSBiaWdnZXIgb25lIGFuZCBzdGFydCBvdmVyLiAqLworCQkJZnJlZSgoY2hhciAqKWJyZWFrcyk7CisJCQludW1fYnJlYWtzIDw8PSAxOworCQkJZ290byB0b3A7CisJCSAgIH0KKwkJKmJwKysgPSBwOworCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50ICovCisJCWZvciAoIDsgZW5kID09IE5VTEw7IHArKyApCisJCSAgIHsJc3dpdGNoKCpwKQorCQkJICAgeworCQkJICAgY2FzZSAnLCc6CisJCQkJaWYgKCAhbGV2ZWwgKSBlbmQgPSBwOworCQkJCWJyZWFrOworCQkJICAgY2FzZSAnKCc6CisJCQkJaWYgKCAhbGV2ZWwgKSBscCA9IHA7CisJCQkJbGV2ZWwrKzsKKwkJCQlicmVhazsKKwkJCSAgIGNhc2UgJyknOgorCQkJCWlmICggLS1sZXZlbCA8IDAgKSBlbmQgPSBwOworCQkJCWVsc2UgcnAgPSBwOworCQkJCWJyZWFrOworCQkJICAgY2FzZSAnLyc6CisJCQkJcCA9IHNraXBzcGFjZShwLCAxKSAtIDE7CisJCQkJYnJlYWs7CisJCQkgICBkZWZhdWx0OgorCQkJCTsKKwkJCSAgIH0KKwkJICAgfQorCQkvKiBFcmFzZSBhbnkgZW1iZWRkZWQgcHJvdG90eXBlIHBhcmFtZXRlcnMuICovCisJCWlmICggbHAgKQorCQkgIHdyaXRlYmxhbmtzKGxwICsgMSwgcnApOworCQlwLS07CQkJLyogYmFjayB1cCBvdmVyIHRlcm1pbmF0b3IgKi8KKwkJLyogRmluZCB0aGUgbmFtZSBiZWluZyBkZWNsYXJlZC4gKi8KKwkJLyogVGhpcyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIG9mIHByb2NlZHVyZSBhbmQgKi8KKwkJLyogYXJyYXkgbW9kaWZpZXJzLiAqLworCQlmb3IgKCA7IDsgKQorCQkgICB7CXAgPSBza2lwc3BhY2UocCAtIDEsIC0xKTsKKwkJCXN3aXRjaCAoICpwICkKKwkJCSAgIHsKKwkJCSAgIGNhc2UgJ10nOgkvKiBza2lwIGFycmF5IGRpbWVuc2lvbihzKSAqLworCQkJICAgY2FzZSAnKSc6CS8qIHNraXAgcHJvY2VkdXJlIGFyZ3MgT1IgbmFtZSAqLworCQkJICAgewlpbnQgbGV2ZWwgPSAxOworCQkJCXdoaWxlICggbGV2ZWwgKQorCQkJCSBzd2l0Y2ggKCAqLS1wICkKKwkJCQkgICB7CisJCQkJICAgY2FzZSAnXSc6IGNhc2UgJyknOiBsZXZlbCsrOyBicmVhazsKKwkJCQkgICBjYXNlICdbJzogY2FzZSAnKCc6IGxldmVsLS07IGJyZWFrOworCQkJCSAgIGNhc2UgJy8nOiBwID0gc2tpcHNwYWNlKHAsIC0xKSArIDE7IGJyZWFrOworCQkJCSAgIGRlZmF1bHQ6IDsKKwkJCQkgICB9CisJCQkgICB9CisJCQkJaWYgKCAqcCA9PSAnKCcgJiYgKnNraXBzcGFjZShwICsgMSwgMSkgPT0gJyonICkKKwkJCQkgICB7CS8qIFdlIGZvdW5kIHRoZSBuYW1lIGJlaW5nIGRlY2xhcmVkICovCisJCQkJCXdoaWxlICggIWlzaWRmaXJzdGNoYXIoKnApICkKKwkJCQkJICBwID0gc2tpcHNwYWNlKHAsIDEpICsgMTsKKwkJCQkJZ290byBmb3VuZDsKKwkJCQkgICB9CisJCQkJYnJlYWs7CisJCQkgICBkZWZhdWx0OgorCQkJCWdvdG8gZm91bmQ7CisJCQkgICB9CisJCSAgIH0KK2ZvdW5kOgkJaWYgKCAqcCA9PSAnLicgJiYgcFstMV0gPT0gJy4nICYmIHBbLTJdID09ICcuJyApCisJCSAgewlpZiAoIGNvbnZlcnRfdmFyYXJncyApCisJCQkgIHsJKmJwKysgPSAidmFfYWxpc3QiOworCQkJCXZhcmFyZyA9IHAtMjsKKwkJCSAgfQorCQkJZWxzZQorCQkJICB7CXArKzsKKwkJCQlpZiAoIGJwID09IGJyZWFrcyArIDEgKQkvKiBzb2xlIGFyZ3VtZW50ICovCisJCQkJICB3cml0ZWJsYW5rcyhicmVha3NbMF0sIHApOworCQkJCWVsc2UKKwkJCQkgIHdyaXRlYmxhbmtzKGJwWy0xXSAtIDEsIHApOworCQkJCWJwLS07CisJCQkgIH0KKwkJICAgfQorCQllbHNlCisJCSAgIHsJd2hpbGUgKCBpc2lkY2hhcigqcCkgKSBwLS07CisJCQkqYnArKyA9IHArMTsKKwkJICAgfQorCQlwID0gZW5kOworCSAgIH0KKwl3aGlsZSAoICpwKysgPT0gJywnICk7CisJKmJwID0gcDsKKwkvKiBNYWtlIGEgc3BlY2lhbCBjaGVjayBmb3IgJ3ZvaWQnIGFyZ2xpc3QgKi8KKwlpZiAoIGJwID09IGJyZWFrcysyICkKKwkgICB7CXAgPSBza2lwc3BhY2UoYnJlYWtzWzBdLCAxKTsKKwkJaWYgKCAhc3RybmNtcChwLCAidm9pZCIsIDQpICkKKwkJICAgewlwID0gc2tpcHNwYWNlKHArNCwgMSk7CisJCQlpZiAoIHAgPT0gYnJlYWtzWzJdIC0gMSApCisJCQkgICB7CWJwID0gYnJlYWtzOwkvKiB5dXAsIHByZXRlbmQgYXJnbGlzdCBpcyBlbXB0eSAqLworCQkJCXdyaXRlYmxhbmtzKGJyZWFrc1swXSwgcCArIDEpOworCQkJICAgfQorCQkgICB9CisJICAgfQorCS8qIFB1dCBvdXQgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIGxlZnQgcGFyZW50aGVzaXMuICovCisJcCA9IGJ1ZjsKKwl3aGlsZSAoIHAgIT0gZW5kZm4gKSBwdXRjKCpwLCBvdXQpLCBwKys7CisJLyogUHV0IG91dCB0aGUgZGVjbGFyYXRpb24uICovCisJaWYgKCBoZWFkZXIgKQorCSAgewlmcHV0cygiKTsiLCBvdXQpOworCQlmb3IgKCBwID0gYnJlYWtzWzBdOyAqcDsgcCsrICkKKwkJICBpZiAoICpwID09ICdccicgfHwgKnAgPT0gJ1xuJyApCisJCSAgICBwdXRjKCpwLCBvdXQpOworCSAgfQorCWVsc2UKKwkgIHsJZm9yICggYXAgPSBicmVha3MrMTsgYXAgPCBicDsgYXAgKz0gMiApCisJCSAgewlwID0gKmFwOworCQkJd2hpbGUgKCBpc2lkY2hhcigqcCkgKQorCQkJICBwdXRjKCpwLCBvdXQpLCBwKys7CisJCQlpZiAoIGFwIDwgYnAgLSAxICkKKwkJCSAgZnB1dHMoIiwgIiwgb3V0KTsKKwkJICB9CisJCWZwdXRzKCIpICAiLCBvdXQpOworCQkvKiBQdXQgb3V0IHRoZSBhcmd1bWVudCBkZWNsYXJhdGlvbnMgKi8KKwkJZm9yICggYXAgPSBicmVha3MrMjsgYXAgPD0gYnA7IGFwICs9IDIgKQorCQkgICgqYXApWy0xXSA9ICc7JzsKKwkJaWYgKCB2YXJhcmcgIT0gMCApCisJCSAgewkqdmFyYXJnID0gMDsKKwkJCWZwdXRzKGJyZWFrc1swXSwgb3V0KTsJCS8qIGFueSBwcmlvciBhcmdzICovCisJCQlmcHV0cygidmFfZGNsIiwgb3V0KTsJCS8qIHRoZSBmaW5hbCBhcmcgKi8KKwkJCWZwdXRzKGJwWzBdLCBvdXQpOworCQkgIH0KKwkJZWxzZQorCQkgIGZwdXRzKGJyZWFrc1swXSwgb3V0KTsKKwkgIH0KKwlmcmVlKChjaGFyICopYnJlYWtzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9hcm12Nl9pZGN0LlMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvYXJtdjZfaWRjdC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZTRlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvYXJtdjZfaWRjdC5TCkBAIC0wLDAgKzEsMzY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBmYXN0LWFuZC1hY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiBpbnZlcnNlIERpc2NyZXRlIENvc2luZQorICogVHJhbnNmb3JtIChJRENUKSBmb3IgQVJNdjYrLiBJdCBhbHNvIHBlcmZvcm1zIGRlcXVhbnRpemF0aW9uIG9mIHRoZSBpbnB1dAorICogY29lZmZpY2llbnRzIGp1c3QgbGlrZSBvdGhlciBtZXRob2RzLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIHNjYWxlZCAxLUQgRENUIGFsZ29yaXRobSBwcm9wb3NlZCBieQorICogQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYmFzZWQgb24gdGhlIGZpZ3VyZSA0LTgKKyAqIG9uIHBhZ2UgNTIgb2YgdGhlIEpQRUcgdGV4dGJvb2sgYnkgUGVubmViYWtlciBhbmQgTWl0Y2hlbGwuIENvZWZmaWNpZW50cworICogYXJlIChhbG1vc3QpIGRpcmVjdGx5IG1hcHBlZCBpbnRvIHJlZ2lzdGVycy4KKyAqCisgKiBUaGUgYWNjdXJhY3kgaXMgYWNoaWV2ZWQgYnkgdXNpbmcgU01VTFd5IGFuZCBTTUxBV3kgaW5zdHJ1Y3Rpb25zLiBCb3RoCisgKiBtdWx0aXBseSAzMiBiaXRzIGJ5IDE2IGJpdHMgYW5kIHN0b3JlIHRoZSB0b3AgMzIgYml0cyBvZiB0aGUgcmVzdWx0LiBJdAorICogbWFrZXMgMzItYml0IGZpeGVkLXBvaW50IGFyaXRobWV0aWMgcG9zc2libGUgd2l0aG91dCBvdmVyZmxvdy4gVGhhdCBpcworICogd2h5IGpwZWdfaWRjdF9pZmFzdCgpLCB3aGljaCBpcyB3cml0dGVuIGluIEMsIGNhbm5vdCBiZSBpbXByb3ZlZC4KKyAqCisgKiBNb3JlIHRyaWNrcyBhcmUgdXNlZCB0byBnYWluIG1vcmUgc3BlZWQuIEZpcnN0IG9mIGFsbCwgd2UgdXNlIGFzIG1hbnkKKyAqIHJlZ2lzdGVycyBhcyBwb3NzaWJsZS4gQVJNIHByb2Nlc3NvciBoYXMgMTYgcmVnaXN0ZXJzIGluY2x1ZGluZyBzcCAocjEzKQorICogYW5kIHBjIChyMTUpLCBzbyBvbmx5IDE0IHJlZ2lzdGVycyBjYW4gYmUgdXNlZCB3aXRob3V0IGxpbWl0YXRpb25zLiBJbgorICogZ2VuZXJhbCwgd2UgbGV0IHIwIHRvIHI3IGhvbGQgdGhlIGNvZWZmaWNpZW50czsgcjEwIGFuZCByMTEgaG9sZCBmb3VyCisgKiAxNi1iaXQgY29uc3RhbnRzOyByMTIgYW5kIHIxNCBob2xkIHR3byBvZiB0aGUgZm91ciBhcmd1bWVudHM7IGFuZCByOCBob2xkCisgKiBpbnRlcm1lZGlhdGUgdmFsdWUuIEluIHRoZSBzZWNvbmQgcGFzcywgcjkgaXMgdGhlIGxvb3AgY291bnRlci4gSW4gdGhlCisgKiBmaXJzdCBwYXNzLCByOCB0byByMTEgYXJlIHVzZWQgdG8gaG9sZCBxdWFudGl6YXRpb24gdmFsdWVzLCBzbyB0aGUgbG9vcAorICogY291bnRlciBpcyBoZWxkIGJ5IHNwLiBZZXMsIHRoZSBzdGFjayBwb2ludGVyLiBTaW5jZSBpdCBtdXN0IGJlIGFsaWduZWQKKyAqIHRvIDQtYnl0ZSBib3VuZGFyeSBhbGwgdGhlIHRpbWUsIHdlIGFsaWduIGl0IHRvIDMyLWJ5dGUgYm91bmRhcnkgYW5kIHVzZQorICogYml0IDMgdG8gYml0IDUuIEFzIHRoZSByZXN1bHQsIHdlIGFjdHVhbGx5IHVzZSAxNC4xIHJlZ2lzdGVycy4gOi0pCisgKgorICogU2Vjb25kLCB3ZSByZWFycmFuZ2UgcXVhbnRpemF0aW9uIHZhbHVlcyB0byBhY2Nlc3MgdGhlbSBzZXF1ZW50aWFsbHkuIFRoZQorICogdGFibGUgaXMgZmlyc3QgdHJhbnNwb3NlZCwgYW5kIHRoZSBuZXcgY29sdW1ucyBhcmUgcGxhY2VkIGluIHRoZSBvcmRlciBvZgorICogNywgNSwgMSwgMywgMCwgMiwgNCwgNi4gVGh1cyB3ZSBjYW4gdXNlIExETURCIHRvIGxvYWQgZm91ciB2YWx1ZXMgYXQgYQorICogdGltZS4gUmVhcnJhbmdpbmcgY29lZmZpY2llbnRzIGFsc28gaGVscHMsIGJ1dCB0aGF0IHJlcXVpcmVzIHRvIGNoYW5nZSBhCisgKiBkb3plbiBvZiBmaWxlcywgd2hpY2ggc2VlbXMgbm90IHdvcnRoIGl0LiBJbiBhZGRpdGlvbiwgd2UgY2hvb3NlIHRvIHNjYWxlCisgKiB1cCBxdWFudGl6YXRpb24gdmFsdWVzIGJ5IDEzIGJpdHMsIHNvIHRoZSBjb2VmZmljaWVudHMgYXJlIHNjYWxlZCB1cCBieQorICogMTYgYml0cyBhZnRlciBib3RoIHBhc3Nlcy4gVGhlbiB3ZSBjYW4gcGFjayBhbmQgc2F0dXJhdGUgdGhlbSB0d28gYXQgYQorICogdGltZSB1c2luZyBQS0hUQiBhbmQgVVNBVDE2IGluc3RydWN0aW9ucy4KKyAqCisgKiBUaGlyZCwgd2UgcmVvcmRlciB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGF2b2lkIGJ1YmJsZXMgaW4gdGhlIHBpcGVsaW5lLiBUaGlzCisgKiBpcyBkb25lIGJ5IGhhbmQgYWNjcm9kaW5nIHRvIHRoZSBjeWNsZSB0aW1pbmdzIGFuZCB0aGUgaW50ZXJsb2NrIGJlaGF2aW9yCisgKiBkZXNjcmliZWQgaW4gdGhlIHRlY2huaWNhbCByZWZlcmVuY2UgbWFudWFsIG9mIEFSTTExMzZKRi1TLiBXZSBhbHNvIHRha2UKKyAqIGFkdmFudGFnZSBvZiBkdWFsIGlzc3VlIHByb2Nlc3NvcnMgYnkgaW50ZXJsZWF2aW5nIGluc3RydWN0aW9ucyB3aXRoCisgKiBkZXBlbmRlbmNpZXMuIEl0IGhhcyBiZWVuIGJlbmNobWFya2VkIG9uIGZvdXIgZGV2aWNlcyBhbmQgYWxsIHRoZSByZXN1bHRzCisgKiBzaG93ZWQgZGlzdGluZ3Vpc2hhYmxlIGltcHJvdmVtZW50cy4gTm90ZSB0aGF0IFBMRCBpbnN0cnVjdGlvbnMgYWN0dWFsbHkKKyAqIHNsb3cgdGhpbmdzIGRvd24sIHNvIHRoZXkgYXJlIHJlbW92ZWQgYXQgdGhlIGxhc3QgbWludXRlLiBJbiB0aGUgZnV0dXJlLAorICogdGhpcyBtaWdodCBiZSBmdXRoZXIgaW1wcm92ZWQgdXNpbmcgYSBzeXN0ZW0gcHJvZmlsZXIuCisgKi8KKworI2lmZGVmIF9fYXJtX18KKyNpbmNsdWRlIDxtYWNoaW5lL2NwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKKyNpZiBfX0FSTV9BUkNIX18gPj0gNgorCisvLyB2b2lkIGFybXY2X2lkY3Qoc2hvcnQgKmNvZWZzLCBpbnQgKnF1YW5zLCB1bnNpZ25lZCBjaGFyICpyb3dzLCBpbnQgY29sKQorICAgIC5hcm0KKyAgICAudGV4dAorICAgIC5hbGlnbgorICAgIC5nbG9iYWwgYXJtdjZfaWRjdAorICAgIC5mdW5jICAgYXJtdjZfaWRjdAorCithcm12Nl9pZGN0OgorICAgIC8vIFB1c2ggZXZlcnl0aGluZyBleGNlcHQgc3AgKHIxMykgYW5kIHBjIChyMTUpLgorICAgIHN0bWRiICAgc3AhLCB7cjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjE0fQorCisgICAgLy8gcjEyID0gcXVhbnMsIHIxNCA9IGNvZWZzLgorICAgIHN1YiAgICAgcjQsIHNwLCAjMjM2CisgICAgYmljICAgICBzcCwgcjQsICMzMQorICAgIGFkZCAgICAgcjUsIHNwLCAjMjI0CisgICAgYWRkICAgICByMTIsIHIxLCAjMjU2CisgICAgc3RtICAgICByNSwge3IyLCByMywgcjR9CisgICAgYWRkICAgICByMTQsIHIwLCAjMTYKKworcGFzczFfaGVhZDoKKyAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzAsIDIsIDQsIDZdKQorICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9CisKKyAgICAvLyBMb2FkIGNvZWZmaWNpZW50cy4gKGNbNCwgMSwgMiwgMywgMCwgNSwgNiwgN10pCisgICAgbGRyc2ggICByNCwgW3IxNCwgIy0yXSAhCisgICAgbGRyc2ggICByMSwgW3IxNCwgIzE2XQorICAgIGxkcnNoICAgcjIsIFtyMTQsICMzMl0KKyAgICBsZHJzaCAgIHIzLCBbcjE0LCAjNDhdCisgICAgbGRyc2ggICByMCwgW3IxNCwgIzY0XQorICAgIGxkcnNoICAgcjUsIFtyMTQsICM4MF0KKyAgICBsZHJzaCAgIHI2LCBbcjE0LCAjOTZdCisgICAgbGRyc2ggICByNywgW3IxNCwgIzExMl0KKworICAgIC8vIHI0ID0gcVswXSAqIGNbMF07CisgICAgbXVsICAgICByNCwgcjgsIHI0CisKKyAgICAvLyBDaGVjayBpZiBBQ3MgYXJlIGFsbCB6ZXJvLgorICAgIGNtcCAgICAgcjAsICMwCisgICAgb3JyZXFzICByOCwgcjEsIHIyCisgICAgb3JyZXFzICByOCwgcjMsIHI1CisgICAgb3JyZXFzICByOCwgcjYsIHI3CisgICAgYmVxICAgICBwYXNzMV96ZXJvCisKKyAgICAvLyBTdGVwIDE6IERlcXVhbnRpemF0aW9ucy4KKworICAgIC8vIHIyID0gcVsyXSAqIGNbMl07CisgICAgLy8gcjAgPSBxWzRdICogY1s0XSArIHI0OworICAgIC8vIHI2ID0gcVs2XSAqIGNbNl0gKyByMjsKKyAgICBtdWwgICAgIHIyLCByOSwgcjIKKyAgICBtbGEgICAgIHIwLCByMTAsIHIwLCByNAorICAgIG1sYSAgICAgcjYsIHIxMSwgcjYsIHIyCisKKyAgICAvLyBMb2FkIHF1YW50aXphdGlvbiB2YWx1ZXMuIChxWzcsIDUsIDEsIDNdKQorICAgIGxkbWRiICAgcjEyISwge3I4LCByOSwgcjEwLCByMTF9CisKKyAgICAvLyByNCA9IHI0ICogMiAtIHIwID0gLShyMCAtIHI0ICogMik7CisgICAgLy8gcjIgPSByMiAqIDIgLSByNiA9IC0ocjYgLSByMiAqIDIpOworICAgIHJzYiAgICAgcjQsIHIwLCByNCwgbHNsICMxCisgICAgcnNiICAgICByMiwgcjYsIHIyLCBsc2wgIzEKKworICAgIC8vIHI3ID0gcVs3XSAqIGNbN107CisgICAgLy8gcjUgPSBxWzVdICogY1s1XTsKKyAgICAvLyByMSA9IHFbMV0gKiBjWzFdICsgcjc7CisgICAgLy8gcjMgPSBxWzNdICogY1szXSArIHI1OworICAgIG11bCAgICAgcjcsIHI4LCByNworICAgIG11bCAgICAgcjUsIHI5LCByNQorICAgIG1sYSAgICAgcjEsIHIxMCwgcjEsIHI3CisgICAgbWxhICAgICByMywgcjExLCByMywgcjUKKworICAgIC8vIExvYWQgY29uc3RhbnRzLgorICAgIGxkcmQgICAgcjEwLCBjb25zdGFudHMKKworICAgIC8vIFN0ZXAgMjogUm90YXRpb25zIGFuZCBCdXR0ZXJmbGllcy4KKworICAgIC8vIHI3ID0gcjEgLSByNyAqIDI7CisgICAgLy8gcjEgPSByMSAtIHIzOworICAgIC8vIHI1ID0gcjUgKiAyIC0gcjMgPSAtKHIzIC0gcjUgKiAyKTsKKyAgICAvLyByMyA9IHIxICsgcjMgKiAyOworICAgIC8vIHI4ID0gcjUgKyByNzsKKyAgICBzdWIgICAgIHI3LCByMSwgcjcsIGxzbCAjMQorICAgIHN1YiAgICAgcjEsIHIxLCByMworICAgIHJzYiAgICAgcjUsIHIzLCByNSwgbHNsICMxCisgICAgYWRkICAgICByMywgcjEsIHIzLCBsc2wgIzEKKyAgICBhZGQgICAgIHI4LCByNSwgcjcKKworICAgIC8vIHIyID0gcjIgKiAxLjQxNDIxID0gcjIgKiAyNzE0NiAvIDY1NTM2ICsgcjI7CisgICAgLy8gcjggPSByOCAqIDEuODQ3NzYgLyA4ID0gcjggKiAxNTEzNyAvIDY1NTM2OworICAgIC8vIHIxID0gcjEgKiAxLjQxNDIxID0gcjEgKiAyNzE0NiAvIDY1NTM2ICsgcjE7CisgICAgc21sYXd0ICByMiwgcjIsIHIxMCwgcjIKKyAgICBzbXVsd2IgIHI4LCByOCwgcjEwCisgICAgc21sYXd0ICByMSwgcjEsIHIxMCwgcjEKKworICAgIC8vIHIwID0gcjAgKyByNjsKKyAgICAvLyByMiA9IHIyIC0gcjY7CisgICAgLy8gcjYgPSByMCAtIHI2ICogMjsKKyAgICBhZGQgICAgIHIwLCByMCwgcjYKKyAgICBzdWIgICAgIHIyLCByMiwgcjYKKyAgICBzdWIgICAgIHI2LCByMCwgcjYsIGxzbCAjMQorCisgICAgLy8gcjUgPSByNSAqIC0yLjYxMzEzIC8gOCArIHI4ID0gcjUgKiAtMjE0MDcgLyA2NTUzNiArIHI4OworICAgIC8vIHI4ID0gcjcgKiAtMS4wODIzOSAvIDggKyByOCA9IHI3ICogLTg4NjcgLyA2NTUzNiArIHI4OworICAgIHNtbGF3dCAgcjUsIHI1LCByMTEsIHI4CisgICAgc21sYXdiICByOCwgcjcsIHIxMSwgcjgKKworICAgIC8vIHI0ID0gcjQgKyByMjsKKyAgICAvLyByMCA9IHIwICsgcjM7CisgICAgLy8gcjIgPSByNCAtIHIyICogMjsKKyAgICBhZGQgICAgIHI0LCByNCwgcjIKKyAgICBhZGQgICAgIHIwLCByMCwgcjMKKyAgICBzdWIgICAgIHIyLCByNCwgcjIsIGxzbCAjMQorCisgICAgLy8gcjcgPSByNSAqIDggLSByMyA9IC0ocjMgLSByNSAqIDgpOworICAgIC8vIHIzID0gcjAgLSByMyAqIDI7CisgICAgLy8gcjEgPSByMSAtIHI3OworICAgIC8vIHI0ID0gcjQgKyByNzsKKyAgICAvLyByNSA9IHI4ICogOCAtIHIxID0gLShyMSAtIHI4ICogOCk7CisgICAgLy8gcjcgPSByNCAtIHI3ICogMjsKKyAgICByc2IgICAgIHI3LCByMywgcjUsIGxzbCAjMworICAgIHN1YiAgICAgcjMsIHIwLCByMywgbHNsICMxCisgICAgc3ViICAgICByMSwgcjEsIHI3CisgICAgYWRkICAgICByNCwgcjQsIHI3CisgICAgcnNiICAgICByNSwgcjEsIHI4LCBsc2wgIzMKKyAgICBzdWIgICAgIHI3LCByNCwgcjcsIGxzbCAjMQorCisgICAgLy8gcjIgPSByMiArIHIxOworICAgIC8vIHI2ID0gcjYgKyByNTsKKyAgICAvLyByMSA9IHIyIC0gcjEgKiAyOworICAgIC8vIHI1ID0gcjYgLSByNSAqIDI7CisgICAgYWRkICAgICByMiwgcjIsIHIxCisgICAgYWRkICAgICByNiwgcjYsIHI1CisgICAgc3ViICAgICByMSwgcjIsIHIxLCBsc2wgIzEKKyAgICBzdWIgICAgIHI1LCByNiwgcjUsIGxzbCAjMQorCisgICAgLy8gU3RlcCAzOiBSZW9yZGVyIGFuZCBTYXZlLgorCisgICAgc3RyICAgICByMCwgW3NwLCAjLTRdICEKKyAgICBzdHIgICAgIHI0LCBbc3AsICMzMl0KKyAgICBzdHIgICAgIHIyLCBbc3AsICM2NF0KKyAgICBzdHIgICAgIHI2LCBbc3AsICM5Nl0KKyAgICBzdHIgICAgIHI1LCBbc3AsICMxMjhdCisgICAgc3RyICAgICByMSwgW3NwLCAjMTYwXQorICAgIHN0ciAgICAgcjcsIFtzcCwgIzE5Ml0KKyAgICBzdHIgICAgIHIzLCBbc3AsICMyMjRdCisgICAgYiAgICAgICBwYXNzMV90YWlsCisKKyAgICAvLyBQcmVjb21wdXRlZCAxNi1iaXQgY29uc3RhbnRzOiAyNzE0NiwgMTUxMzcsIC0yMTQwNywgLTg4NjcuCisgICAgLy8gUHV0IHRoZW0gaW4gdGhlIG1pZGRsZSBzaW5jZSBMRFJEIG9ubHkgYWNjZXB0cyBvZmZzZXRzIGZyb20gLTI1NSB0byAyNTUuCisgICAgLmFsaWduICAzCitjb25zdGFudHM6CisgICAgLndvcmQgICAweDZhMGEzYjIxCisgICAgLndvcmQgICAweGFjNjFkZDVkCisKK3Bhc3MxX3plcm86CisgICAgc3RyICAgICByNCwgW3NwLCAjLTRdICEKKyAgICBzdHIgICAgIHI0LCBbc3AsICMzMl0KKyAgICBzdHIgICAgIHI0LCBbc3AsICM2NF0KKyAgICBzdHIgICAgIHI0LCBbc3AsICM5Nl0KKyAgICBzdHIgICAgIHI0LCBbc3AsICMxMjhdCisgICAgc3RyICAgICByNCwgW3NwLCAjMTYwXQorICAgIHN0ciAgICAgcjQsIFtzcCwgIzE5Ml0KKyAgICBzdHIgICAgIHI0LCBbc3AsICMyMjRdCisgICAgc3ViICAgICByMTIsIHIxMiwgIzE2CisKK3Bhc3MxX3RhaWw6CisgICAgYW5kcyAgICByOSwgc3AsICMzMQorICAgIGJuZSAgICAgcGFzczFfaGVhZAorCisgICAgLy8gcjEyID0gcm93cywgcjE0ID0gY29sLgorICAgIGxkciAgICAgcjEyLCBbc3AsICMyNTZdCisgICAgbGRyICAgICByMTQsIFtzcCwgIzI2MF0KKworICAgIC8vIExvYWQgY29uc3RhbnRzLgorICAgIGxkcmQgICAgcjEwLCBjb25zdGFudHMKKworcGFzczJfaGVhZDoKKyAgICAvLyBMb2FkIGNvZWZmaWNpZW50cy4gKGNbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pCisgICAgbGRtaWEgICBzcCEsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjd9CisKKyAgICAvLyByMCA9IHIwICsgMHgwMDgwODAwMDsKKyAgICBhZGQgICAgIHIwLCByMCwgIzB4MDA4MDAwMDAKKyAgICBhZGQgICAgIHIwLCByMCwgIzB4MDAwMDgwMDAKKworICAgIC8vIFN0ZXAgMTogQW5hbG9nIHRvIHRoZSBmaXJzdCBwYXNzLgorCisgICAgLy8gcjAgPSByMCArIHI0OworICAgIC8vIHI2ID0gcjYgKyByMjsKKyAgICBhZGQgICAgIHIwLCByMCwgcjQKKyAgICBhZGQgICAgIHI2LCByNiwgcjIKKworICAgIC8vIHI0ID0gcjAgLSByNCAqIDI7CisgICAgLy8gcjIgPSByMiAqIDIgLSByNiA9IC0ocjYgLSByMiAqIDIpOworICAgIHN1YiAgICAgcjQsIHIwLCByNCwgbHNsICMxCisgICAgcnNiICAgICByMiwgcjYsIHIyLCBsc2wgIzEKKworICAgIC8vIHIxID0gcjEgKyByNzsKKyAgICAvLyByMyA9IHIzICsgcjU7CisgICAgYWRkICAgICByMSwgcjEsIHI3CisgICAgYWRkICAgICByMywgcjMsIHI1CisKKyAgICAvLyBTdGVwIDI6IFJvdGF0aW9ucyBhbmQgQnV0dGVyZmxpZXMuCisKKyAgICAvLyByNyA9IHIxIC0gcjcgKiAyOworICAgIC8vIHIxID0gcjEgLSByMzsKKyAgICAvLyByNSA9IHI1ICogMiAtIHIzID0gLShyMyAtIHI1ICogMik7CisgICAgLy8gcjMgPSByMSArIHIzICogMjsKKyAgICAvLyByOCA9IHI1ICsgcjc7CisgICAgc3ViICAgICByNywgcjEsIHI3LCBsc2wgIzEKKyAgICBzdWIgICAgIHIxLCByMSwgcjMKKyAgICByc2IgICAgIHI1LCByMywgcjUsIGxzbCAjMQorICAgIGFkZCAgICAgcjMsIHIxLCByMywgbHNsICMxCisgICAgYWRkICAgICByOCwgcjUsIHI3CisKKyAgICAvLyByMiA9IHIyICogMS40MTQyMSA9IHIyICogMjcxNDYgLyA2NTUzNiArIHIyOworICAgIC8vIHI4ID0gcjggKiAxLjg0Nzc2IC8gOCA9IHI4ICogMTUxMzcgLyA2NTUzNjsKKyAgICAvLyByMSA9IHIxICogMS40MTQyMSA9IHIxICogMjcxNDYgLyA2NTUzNiArIHIxOworICAgIHNtbGF3dCAgcjIsIHIyLCByMTAsIHIyCisgICAgc211bHdiICByOCwgcjgsIHIxMAorICAgIHNtbGF3dCAgcjEsIHIxLCByMTAsIHIxCisKKyAgICAvLyByMCA9IHIwICsgcjY7CisgICAgLy8gcjIgPSByMiAtIHI2OworICAgIC8vIHI2ID0gcjAgLSByNiAqIDI7CisgICAgYWRkICAgICByMCwgcjAsIHI2CisgICAgc3ViICAgICByMiwgcjIsIHI2CisgICAgc3ViICAgICByNiwgcjAsIHI2LCBsc2wgIzEKKworICAgIC8vIHI1ID0gcjUgKiAtMi42MTMxMyAvIDggKyByOCA9IHI1ICogLTIxNDA3IC8gNjU1MzYgKyByODsKKyAgICAvLyByOCA9IHI3ICogLTEuMDgyMzkgLyA4ICsgcjggPSByNyAqIC04ODY3IC8gNjU1MzYgKyByODsKKyAgICBzbWxhd3QgIHI1LCByNSwgcjExLCByOAorICAgIHNtbGF3YiAgcjgsIHI3LCByMTEsIHI4CisKKyAgICAvLyByNCA9IHI0ICsgcjI7CisgICAgLy8gcjAgPSByMCArIHIzOworICAgIC8vIHIyID0gcjQgLSByMiAqIDI7CisgICAgYWRkICAgICByNCwgcjQsIHIyCisgICAgYWRkICAgICByMCwgcjAsIHIzCisgICAgc3ViICAgICByMiwgcjQsIHIyLCBsc2wgIzEKKworICAgIC8vIHI3ID0gcjUgKiA4IC0gcjMgPSAtKHIzIC0gcjUgKiA4KTsKKyAgICAvLyByMyA9IHIwIC0gcjMgKiAyOworICAgIC8vIHIxID0gcjEgLSByNzsKKyAgICAvLyByNCA9IHI0ICsgcjc7CisgICAgLy8gcjUgPSByOCAqIDggLSByMSA9IC0ocjEgLSByOCAqIDgpOworICAgIC8vIHI3ID0gcjQgLSByNyAqIDI7CisgICAgcnNiICAgICByNywgcjMsIHI1LCBsc2wgIzMKKyAgICBzdWIgICAgIHIzLCByMCwgcjMsIGxzbCAjMQorICAgIHN1YiAgICAgcjEsIHIxLCByNworICAgIGFkZCAgICAgcjQsIHI0LCByNworICAgIHJzYiAgICAgcjUsIHIxLCByOCwgbHNsICMzCisgICAgc3ViICAgICByNywgcjQsIHI3LCBsc2wgIzEKKworICAgIC8vIHIyID0gcjIgKyByMTsKKyAgICAvLyByNiA9IHI2ICsgcjU7CisgICAgLy8gcjEgPSByMiAtIHIxICogMjsKKyAgICAvLyByNSA9IHI2IC0gcjUgKiAyOworICAgIGFkZCAgICAgcjIsIHIyLCByMQorICAgIGFkZCAgICAgcjYsIHI2LCByNQorICAgIHN1YiAgICAgcjEsIHIyLCByMSwgbHNsICMxCisgICAgc3ViICAgICByNSwgcjYsIHI1LCBsc2wgIzEKKworICAgIC8vIFN0ZXAgMzogUmVvcmRlciBhbmQgU2F2ZS4KKworICAgIC8vIExvYWQgb3V0cHV0IHBvaW50ZXIuCisgICAgbGRyICAgICByOCwgW3IxMl0sICM0CisKKyAgICAvLyBGb3IgbGl0dGxlIGVuZGlhbjogcjYsIHIyLCByNCwgcjAsIHIzLCByNywgcjEsIHI1LgorICAgIHBraHRiICAgcjYsIHI2LCByNCwgYXNyICMxNgorICAgIHBraHRiICAgcjIsIHIyLCByMCwgYXNyICMxNgorICAgIHBraHRiICAgcjMsIHIzLCByMSwgYXNyICMxNgorICAgIHBraHRiICAgcjcsIHI3LCByNSwgYXNyICMxNgorICAgIHVzYXQxNiAgcjYsICM4LCByNgorICAgIHVzYXQxNiAgcjIsICM4LCByMgorICAgIHVzYXQxNiAgcjMsICM4LCByMworICAgIHVzYXQxNiAgcjcsICM4LCByNworICAgIG9yciAgICAgcjAsIHIyLCByNiwgbHNsICM4CisgICAgb3JyICAgICByMSwgcjcsIHIzLCBsc2wgIzgKKworI2lmZGVmIF9fQVJNRUJfXworICAgIC8vIFJldmVyc2UgYnl0ZXMgZm9yIGJpZyBlbmRpYW4uCisgICAgcmV2ICAgICByMCwgcjAKKyAgICByZXYgICAgIHIxLCByMQorI2VuZGlmCisKKyAgICAvLyBVc2UgU1RSIGluc3RlYWQgb2YgU1RSRCB0byBzdXBwb3J0IHVuYWxpZ25lZCBhY2Nlc3MuCisgICAgc3RyICAgICByMCwgW3I4LCByMTRdICEKKyAgICBzdHIgICAgIHIxLCBbcjgsICM0XQorCitwYXNzMl90YWlsOgorICAgIGFkZHMgICAgcjksIHI5LCAjMHgxMDAwMDAwMAorICAgIGJwbCAgICAgcGFzczJfaGVhZAorCisgICAgbGRyICAgICBzcCwgW3NwLCAjOF0KKyAgICBhZGQgICAgIHNwLCBzcCwgIzIzNgorCisgICAgbGRtaWEgICBzcCEsIHtyNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCByMTR9CisgICAgYnggICAgICBscgorICAgIC5lbmRmdW5jCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NkZXJyb3IuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jZGVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0MzVlMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jZGVycm9yLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBjZGVycm9yLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIGNqcGVnL2RqcGVnCisgKiBhcHBsaWNhdGlvbnMuICBUaGVzZSBzdHJpbmdzIGFyZSBub3QgbmVlZGVkIGFzIHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQorICogcHJvcGVyLgorICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KKyAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCisgKi8KKworLyoKKyAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKKyAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKKyAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgorICovCisjaWZuZGVmIEpNRVNTQUdFCisjaWZuZGVmIENERVJST1JfSAorI2RlZmluZSBDREVSUk9SX0gKKy8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KKyNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCisjZWxzZQorLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKKyNlbmRpZiAvKiBDREVSUk9SX0ggKi8KKyNlbmRpZiAvKiBKTUVTU0FHRSAqLworCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKK3R5cGVkZWYgZW51bSB7CisKKyNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAorCisjZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCisKK0pNRVNTQUdFKEpNU0dfRklSU1RBRERPTkNPREU9MTAwMCwgTlVMTCkgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KKworI2lmZGVmIEJNUF9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRENNQVAsICJVbnN1cHBvcnRlZCBCTVAgY29sb3JtYXAgZm9ybWF0IikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRERFUFRILCAiT25seSA4LSBhbmQgMjQtYml0IEJNUCBmaWxlcyBhcmUgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBREhFQURFUiwgIkludmFsaWQgQk1QIGZpbGU6IGJhZCBoZWFkZXIgbGVuZ3RoIikKK0pNRVNTQUdFKEpFUlJfQk1QX0JBRFBMQU5FUywgIkludmFsaWQgQk1QIGZpbGU6IGJpUGxhbmVzIG5vdCBlcXVhbCB0byAxIikKK0pNRVNTQUdFKEpFUlJfQk1QX0NPTE9SU1BBQ0UsICJCTVAgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCitKTUVTU0FHRShKRVJSX0JNUF9DT01QUkVTU0VELCAiU29ycnksIGNvbXByZXNzZWQgQk1QcyBub3QgeWV0IHN1cHBvcnRlZCIpCitKTUVTU0FHRShKRVJSX0JNUF9OT1QsICJOb3QgYSBCTVAgZmlsZSAtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk0iKQorSk1FU1NBR0UoSlRSQ19CTVAsICIldXgldSAyNC1iaXQgQk1QIGltYWdlIikKK0pNRVNTQUdFKEpUUkNfQk1QX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIEJNUCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0JNUF9PUzIsICIldXgldSAyNC1iaXQgT1MyIEJNUCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0JNUF9PUzJfTUFQUEVELCAiJXV4JXUgOC1iaXQgY29sb3JtYXBwZWQgT1MyIEJNUCBpbWFnZSIpCisjZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLworCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorSk1FU1NBR0UoSkVSUl9HSUZfQlVHLCAiR0lGIG91dHB1dCBnb3QgY29uZnVzZWQiKQorSk1FU1NBR0UoSkVSUl9HSUZfQ09ERVNJWkUsICJCb2d1cyBHSUYgY29kZXNpemUgJWQiKQorSk1FU1NBR0UoSkVSUl9HSUZfQ09MT1JTUEFDRSwgIkdJRiBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKK0pNRVNTQUdFKEpFUlJfR0lGX0lNQUdFTk9URk9VTkQsICJUb28gZmV3IGltYWdlcyBpbiBHSUYgZmlsZSIpCitKTUVTU0FHRShKRVJSX0dJRl9OT1QsICJOb3QgYSBHSUYgZmlsZSIpCitKTUVTU0FHRShKVFJDX0dJRiwgIiV1eCV1eCVkIEdJRiBpbWFnZSIpCitKTUVTU0FHRShKVFJDX0dJRl9CQURWRVJTSU9OLAorCSAiV2FybmluZzogdW5leHBlY3RlZCBHSUYgdmVyc2lvbiBudW1iZXIgJyVjJWMlYyciKQorSk1FU1NBR0UoSlRSQ19HSUZfRVhURU5TSU9OLCAiSWdub3JpbmcgR0lGIGV4dGVuc2lvbiBibG9jayBvZiB0eXBlIDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX0dJRl9OT05TUVVBUkUsICJDYXV0aW9uOiBub25zcXVhcmUgcGl4ZWxzIGluIGlucHV0IikKK0pNRVNTQUdFKEpXUk5fR0lGX0JBRERBVEEsICJDb3JydXB0IGRhdGEgaW4gR0lGIGZpbGUiKQorSk1FU1NBR0UoSldSTl9HSUZfQ0hBUiwgIkJvZ3VzIGNoYXIgMHglMDJ4IGluIEdJRiBmaWxlLCBpZ25vcmluZyIpCitKTUVTU0FHRShKV1JOX0dJRl9FTkRDT0RFLCAiUHJlbWF0dXJlIGVuZCBvZiBHSUYgaW1hZ2UiKQorSk1FU1NBR0UoSldSTl9HSUZfTk9NT1JFREFUQSwgIlJhbiBvdXQgb2YgR0lGIGJpdHMiKQorI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KKworI2lmZGVmIFBQTV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfUFBNX0NPTE9SU1BBQ0UsICJQUE0gb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCitKTUVTU0FHRShKRVJSX1BQTV9OT05OVU1FUklDLCAiTm9ubnVtZXJpYyBkYXRhIGluIFBQTSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfUFBNX05PVCwgIk5vdCBhIFBQTS9QR00gZmlsZSIpCitKTUVTU0FHRShKVFJDX1BHTSwgIiV1eCV1IFBHTSBpbWFnZSIpCitKTUVTU0FHRShKVFJDX1BHTV9URVhULCAiJXV4JXUgdGV4dCBQR00gaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19QUE0sICIldXgldSBQUE0gaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19QUE1fVEVYVCwgIiV1eCV1IHRleHQgUFBNIGltYWdlIikKKyNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCisKKyNpZmRlZiBSTEVfU1VQUE9SVEVECitKTUVTU0FHRShKRVJSX1JMRV9CQURFUlJPUiwgIkJvZ3VzIGVycm9yIGNvZGUgZnJvbSBSTEUgbGlicmFyeSIpCitKTUVTU0FHRShKRVJSX1JMRV9DT0xPUlNQQUNFLCAiUkxFIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSkVSUl9STEVfRElNRU5TSU9OUywgIkltYWdlIGRpbWVuc2lvbnMgKCV1eCV1KSB0b28gbGFyZ2UgZm9yIFJMRSIpCitKTUVTU0FHRShKRVJSX1JMRV9FTVBUWSwgIkVtcHR5IFJMRSBmaWxlIikKK0pNRVNTQUdFKEpFUlJfUkxFX0VPRiwgIlByZW1hdHVyZSBFT0YgaW4gUkxFIGhlYWRlciIpCitKTUVTU0FHRShKRVJSX1JMRV9NRU0sICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBSTEUgaGVhZGVyIikKK0pNRVNTQUdFKEpFUlJfUkxFX05PVCwgIk5vdCBhbiBSTEUgZmlsZSIpCitKTUVTU0FHRShKRVJSX1JMRV9UT09NQU5ZQ0hBTk5FTFMsICJDYW5ub3QgaGFuZGxlICVkIG91dHB1dCBjaGFubmVscyBmb3IgUkxFIikKK0pNRVNTQUdFKEpFUlJfUkxFX1VOU1VQUE9SVEVELCAiQ2Fubm90IGhhbmRsZSB0aGlzIFJMRSBzZXR1cCIpCitKTUVTU0FHRShKVFJDX1JMRSwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19STEVfRlVMTE1BUCwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKK0pNRVNTQUdFKEpUUkNfUkxFX0dSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUiKQorSk1FU1NBR0UoSlRSQ19STEVfTUFQR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBSTEUgZmlsZSB3aXRoIG1hcCBvZiBsZW5ndGggJWQiKQorSk1FU1NBR0UoSlRSQ19STEVfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKKyNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCisKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfVEdBX0JBRENNQVAsICJVbnN1cHBvcnRlZCBUYXJnYSBjb2xvcm1hcCBmb3JtYXQiKQorSk1FU1NBR0UoSkVSUl9UR0FfQkFEUEFSTVMsICJJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFRhcmdhIGZpbGUiKQorSk1FU1NBR0UoSkVSUl9UR0FfQ09MT1JTUEFDRSwgIlRhcmdhIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQorSk1FU1NBR0UoSlRSQ19UR0EsICIldXgldSBSR0IgVGFyZ2EgaW1hZ2UiKQorSk1FU1NBR0UoSlRSQ19UR0FfR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBUYXJnYSBpbWFnZSIpCitKTUVTU0FHRShKVFJDX1RHQV9NQVBQRUQsICIldXgldSBjb2xvcm1hcHBlZCBUYXJnYSBpbWFnZSIpCisjZWxzZQorSk1FU1NBR0UoSkVSUl9UR0FfTk9UQ09NUCwgIlRhcmdhIHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCIpCisjZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCisKK0pNRVNTQUdFKEpFUlJfQkFEX0NNQVBfRklMRSwKKwkgIkNvbG9yIG1hcCBmaWxlIGlzIGludmFsaWQgb3Igb2YgdW5zdXBwb3J0ZWQgZm9ybWF0IikKK0pNRVNTQUdFKEpFUlJfVE9PX01BTllfQ09MT1JTLAorCSAiT3V0cHV0IGZpbGUgZm9ybWF0IGNhbm5vdCBoYW5kbGUgJWQgY29sb3JtYXAgZW50cmllcyIpCitKTUVTU0FHRShKRVJSX1VOR0VUQ19GQUlMRUQsICJ1bmdldGMgZmFpbGVkIikKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKK0pNRVNTQUdFKEpFUlJfVU5LTk9XTl9GT1JNQVQsCisJICJVbnJlY29nbml6ZWQgaW5wdXQgZmlsZSBmb3JtYXQgLS0tIHBlcmhhcHMgeW91IG5lZWQgLXRhcmdhIikKKyNlbHNlCitKTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IikKKyNlbmRpZgorSk1FU1NBR0UoSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQsICJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQiKQorCisjaWZkZWYgSk1BS0VfRU5VTV9MSVNUCisKKyAgSk1TR19MQVNUQURET05DT0RFCit9IEFERE9OX01FU1NBR0VfQ09ERTsKKworI3VuZGVmIEpNQUtFX0VOVU1fTElTVAorI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLworCisvKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KKyN1bmRlZiBKTUVTU0FHRQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NkanBlZy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NkanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjUwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY2RqcGVnLmMKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBjZGpwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBzdXBwb3J0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIElKRyBhcHBsaWNhdGlvbgorICogcHJvZ3JhbXMgKGNqcGVnLCBkanBlZywganBlZ3RyYW4pLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXN1cHBlcigpLCB0b2xvd2VyKCkgKi8KKyNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjaW5jbHVkZSA8c2lnbmFsLmg+CQkvKiB0byBkZWNsYXJlIHNpZ25hbCgpICovCisjZW5kaWYKKyNpZmRlZiBVU0VfU0VUTU9ERQorI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSdzIHBhcmFtZXRlciBtYWNyb3MgKi8KKy8qIElmIHlvdSBoYXZlIHNldG1vZGUoKSBidXQgbm90IDxpby5oPiwganVzdCBkZWxldGUgdGhpcyBsaW5lOiAqLworI2luY2x1ZGUgPGlvLmg+CQkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkgKi8KKyNlbmRpZgorCisKKy8qCisgKiBTaWduYWwgY2F0Y2hlciB0byBlbnN1cmUgdGhhdCB0ZW1wb3JhcnkgZmlsZXMgYXJlIHJlbW92ZWQgYmVmb3JlIGFib3J0aW5nLgorICogTkI6IGZvciBBbWlnYSBNYW54IEMgdGhpcyBpcyBhY3R1YWxseSBhIGdsb2JhbCByb3V0aW5lIG5hbWVkIF9hYm9ydCgpOworICogd2UgcHV0ICIjZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydCIgaW4gamNvbmZpZy5oLiAgVGFsayBhYm91dCBib2d1cy4uLgorICovCisKKyNpZmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisKK3N0YXRpYyBqX2NvbW1vbl9wdHIgc2lnX2NpbmZvOworCit2b2lkCQkJCS8qIG11c3QgYmUgZ2xvYmFsIGZvciBNYW54IEMgKi8KK3NpZ25hbF9jYXRjaGVyIChpbnQgc2lnbnVtKQoreworICBpZiAoc2lnX2NpbmZvICE9IE5VTEwpIHsKKyAgICBpZiAoc2lnX2NpbmZvLT5lcnIgIT0gTlVMTCkgLyogdHVybiBvZmYgdHJhY2Ugb3V0cHV0ICovCisgICAgICBzaWdfY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOworICAgIGpwZWdfZGVzdHJveShzaWdfY2luZm8pOwkvKiBjbGVhbiB1cCBtZW1vcnkgYWxsb2NhdGlvbiAmIHRlbXAgZmlsZXMgKi8KKyAgfQorICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKKworR0xPQkFMKHZvaWQpCitlbmFibGVfc2lnbmFsX2NhdGNoZXIgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgc2lnX2NpbmZvID0gY2luZm87CisjaWZkZWYgU0lHSU5UCQkJLyogbm90IGFsbCBzeXN0ZW1zIGhhdmUgU0lHSU5UICovCisgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9jYXRjaGVyKTsKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0JCQkvKiBub3QgYWxsIHN5c3RlbXMgaGF2ZSBTSUdURVJNICovCisgIHNpZ25hbChTSUdURVJNLCBzaWduYWxfY2F0Y2hlcik7CisjZW5kaWYKK30KKworI2VuZGlmCisKKworLyoKKyAqIE9wdGlvbmFsIHByb2dyZXNzIG1vbml0b3I6IGRpc3BsYXkgYSBwZXJjZW50LWRvbmUgZmlndXJlIG9uIHN0ZGVyci4KKyAqLworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisKK01FVEhPRERFRih2b2lkKQorcHJvZ3Jlc3NfbW9uaXRvciAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjZF9wcm9ncmVzc19wdHIgcHJvZyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyAgaW50IHRvdGFsX3Bhc3NlcyA9IHByb2ctPnB1Yi50b3RhbF9wYXNzZXMgKyBwcm9nLT50b3RhbF9leHRyYV9wYXNzZXM7CisgIGludCBwZXJjZW50X2RvbmUgPSAoaW50KSAocHJvZy0+cHViLnBhc3NfY291bnRlcioxMDBML3Byb2ctPnB1Yi5wYXNzX2xpbWl0KTsKKworICBpZiAocGVyY2VudF9kb25lICE9IHByb2ctPnBlcmNlbnRfZG9uZSkgeworICAgIHByb2ctPnBlcmNlbnRfZG9uZSA9IHBlcmNlbnRfZG9uZTsKKyAgICBpZiAodG90YWxfcGFzc2VzID4gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJcclBhc3MgJWQvJWQ6ICUzZCUlICIsCisJICAgICAgcHJvZy0+cHViLmNvbXBsZXRlZF9wYXNzZXMgKyBwcm9nLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzICsgMSwKKwkgICAgICB0b3RhbF9wYXNzZXMsIHBlcmNlbnRfZG9uZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXHIgJTNkJSUgIiwgcGVyY2VudF9kb25lKTsKKyAgICB9CisgICAgZmZsdXNoKHN0ZGVycik7CisgIH0KK30KKworCitHTE9CQUwodm9pZCkKK3N0YXJ0X3Byb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbywgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKQoreworICAvKiBFbmFibGUgcHJvZ3Jlc3MgZGlzcGxheSwgdW5sZXNzIHRyYWNlIG91dHB1dCBpcyBvbiAqLworICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPT0gMCkgeworICAgIHByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvciA9IHByb2dyZXNzX21vbml0b3I7CisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMgPSAwOworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMgPSAwOworICAgIHByb2dyZXNzLT5wZXJjZW50X2RvbmUgPSAtMTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MgPSAmcHJvZ3Jlc3MtPnB1YjsKKyAgfQorfQorCisKK0dMT0JBTCh2b2lkKQorZW5kX3Byb2dyZXNzX21vbml0b3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogQ2xlYXIgYXdheSBwcm9ncmVzcyBkaXNwbGF5ICovCisgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJcciAgICAgICAgICAgICAgICBcciIpOworICAgIGZmbHVzaChzdGRlcnIpOworICB9Cit9CisKKyNlbmRpZgorCisKKy8qCisgKiBDYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nIG9mIHBvc3NpYmx5LWFiYnJldmlhdGVkIGtleXdvcmQgc3dpdGNoZXMuCisgKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksCisgKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitrZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKK3sKKyAgcmVnaXN0ZXIgaW50IGNhLCBjazsKKyAgcmVnaXN0ZXIgaW50IG5tYXRjaGVkID0gMDsKKworICB3aGlsZSAoKGNhID0gKmFyZysrKSAhPSAnXDAnKSB7CisgICAgaWYgKChjayA9ICprZXl3b3JkKyspID09ICdcMCcpCisgICAgICByZXR1cm4gRkFMU0U7CQkvKiBhcmcgbG9uZ2VyIHRoYW4ga2V5d29yZCwgbm8gZ29vZCAqLworICAgIGlmIChpc3VwcGVyKGNhKSkJCS8qIGZvcmNlIGFyZyB0byBsY2FzZSAoYXNzdW1lIGNrIGlzIGFscmVhZHkpICovCisgICAgICBjYSA9IHRvbG93ZXIoY2EpOworICAgIGlmIChjYSAhPSBjaykKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIG5vIGdvb2QgKi8KKyAgICBubWF0Y2hlZCsrOwkJCS8qIGNvdW50IG1hdGNoZWQgY2hhcmFjdGVycyAqLworICB9CisgIC8qIHJlYWNoZWQgZW5kIG9mIGFyZ3VtZW50OyBmYWlsIGlmIGl0J3MgdG9vIHNob3J0IGZvciB1bmlxdWUgYWJicmV2ICovCisgIGlmIChubWF0Y2hlZCA8IG1pbmNoYXJzKQorICAgIHJldHVybiBGQUxTRTsKKyAgcmV0dXJuIFRSVUU7CQkJLyogQS1PSyAqLworfQorCisKKy8qCisgKiBSb3V0aW5lcyB0byBlc3RhYmxpc2ggYmluYXJ5IEkvTyBtb2RlIGZvciBzdGRpbiBhbmQgc3Rkb3V0LgorICogTm9uLVVuaXggc3lzdGVtcyBvZnRlbiByZXF1aXJlIHNvbWUgaGFja2luZyB0byBnZXQgb3V0IG9mIHRleHQgbW9kZS4KKyAqLworCitHTE9CQUwoRklMRSAqKQorcmVhZF9zdGRpbiAodm9pZCkKK3sKKyAgRklMRSAqIGlucHV0X2ZpbGUgPSBzdGRpbjsKKworI2lmZGVmIFVTRV9TRVRNT0RFCQkvKiBuZWVkIHRvIGhhY2sgZmlsZSBtb2RlPyAqLworICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgaWYgKChpbnB1dF9maWxlID0gZmRvcGVuKGZpbGVubyhzdGRpbiksIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlb3BlbiBzdGRpblxuIik7CisgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIGlucHV0X2ZpbGU7Cit9CisKKworR0xPQkFMKEZJTEUgKikKK3dyaXRlX3N0ZG91dCAodm9pZCkKK3sKKyAgRklMRSAqIG91dHB1dF9maWxlID0gc3Rkb3V0OworCisjaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCisgIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgaWYgKChvdXRwdXRfZmlsZSA9IGZkb3BlbihmaWxlbm8oc3Rkb3V0KSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlb3BlbiBzdGRvdXRcbiIpOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiBvdXRwdXRfZmlsZTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jZGpwZWcuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jZGpwZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM4N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NkanBlZy5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogY2RqcGVnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucworICogY2pwZWcgYW5kIGRqcGVnLiAgSXQgaXMgTk9UIHVzZWQgYnkgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LgorICovCisKKyNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiBkZWZpbmUgcHJvcGVyIG9wdGlvbnMgaW4gamNvbmZpZy5oICovCisjZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwkvKiBjanBlZy5jLGRqcGVnLmMgbmVlZCB0byBzZWUgeHh4X1NVUFBPUlRFRCAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImplcnJvci5oIgkJLyogZ2V0IGxpYnJhcnkgZXJyb3IgY29kZXMgdG9vICovCisjaW5jbHVkZSAiY2RlcnJvci5oIgkJLyogZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIGNvZGVzICovCisKKworLyoKKyAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGNqcGVnJ3Mgc291cmNlIGZpbGUgZGVjb2RpbmcgbW9kdWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgKiBjanBlZ19zb3VyY2VfcHRyOworCitzdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKKyAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOworCisgIEZJTEUgKmlucHV0X2ZpbGU7CisKKyAgSlNBTVBBUlJBWSBidWZmZXI7CisgIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKK307CisKKworLyoKKyAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGRqcGVnJ3Mgb3V0cHV0IGZpbGUgZW5jb2RpbmcgbW9kdWxlcworICovCisKK3R5cGVkZWYgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0ICogZGpwZWdfZGVzdF9wdHI7CisKK3N0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCB7CisgIC8qIHN0YXJ0X291dHB1dCBpcyBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzIGZpbmlzaGVzLgorICAgKiBUaGUgY29sb3IgbWFwIHdpbGwgYmUgcmVhZHkgYXQgdGhpcyB0aW1lLCBpZiBvbmUgaXMgbmVlZGVkLgorICAgKi8KKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7CisgIC8qIEVtaXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGl4ZWwgcm93cyBmcm9tIHRoZSBidWZmZXIuICovCisgIEpNRVRIT0Qodm9pZCwgcHV0X3BpeGVsX3Jvd3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7CisgIC8qIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlkanBlZ19kZXN0X3B0ciBkaW5mbykpOworCisgIC8qIFRhcmdldCBmaWxlIHNwZWM7IGZpbGxlZCBpbiBieSBkanBlZy5jIGFmdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAqLworICBGSUxFICogb3V0cHV0X2ZpbGU7CisKKyAgLyogT3V0cHV0IHBpeGVsLXJvdyBidWZmZXIuICBDcmVhdGVkIGJ5IG1vZHVsZSBpbml0IG9yIHN0YXJ0X291dHB1dC4KKyAgICogV2lkdGggaXMgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKKyAgICogaGVpZ2h0IGlzIGJ1ZmZlcl9oZWlnaHQuCisgICAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcjsKKyAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OworfTsKKworCisvKgorICogY2pwZWcvZGpwZWcgbWF5IG5lZWQgdG8gcGVyZm9ybSBleHRyYSBwYXNzZXMgdG8gY29udmVydCB0byBvciBmcm9tCisgKiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGZpbGUgZm9ybWF0LiAgVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBrbm93CisgKiBhYm91dCB0aGVzZSBwYXNzZXMsIGJ1dCB3ZSdkIGxpa2UgdGhlbSB0byBiZSBjb3VudGVkIGJ5IHRoZSBwcm9ncmVzcworICogbW9uaXRvci4gIFdlIHVzZSBhbiBleHBhbmRlZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdCB0byBob2xkIHRoZQorICogYWRkaXRpb25hbCBwYXNzIGNvdW50LgorICovCisKK3N0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHsKKyAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHB1YjsJLyogZmllbGRzIGtub3duIHRvIEpQRUcgbGlicmFyeSAqLworICBpbnQgY29tcGxldGVkX2V4dHJhX3Bhc3NlczsJLyogZXh0cmEgcGFzc2VzIGNvbXBsZXRlZCAqLworICBpbnQgdG90YWxfZXh0cmFfcGFzc2VzOwkvKiB0b3RhbCBleHRyYSAqLworICAvKiBsYXN0IHByaW50ZWQgcGVyY2VudGFnZSBzdG9yZWQgaGVyZSB0byBhdm9pZCBtdWx0aXBsZSBwcmludG91dHMgKi8KKyAgaW50IHBlcmNlbnRfZG9uZTsKK307CisKK3R5cGVkZWYgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgKiBjZF9wcm9ncmVzc19wdHI7CisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGppbml0X3JlYWRfYm1wCQlqSVJkQk1QCisjZGVmaW5lIGppbml0X3dyaXRlX2JtcAkJaklXckJNUAorI2RlZmluZSBqaW5pdF9yZWFkX2dpZgkJaklSZEdJRgorI2RlZmluZSBqaW5pdF93cml0ZV9naWYJCWpJV3JHSUYKKyNkZWZpbmUgamluaXRfcmVhZF9wcG0JCWpJUmRQUE0KKyNkZWZpbmUgamluaXRfd3JpdGVfcHBtCQlqSVdyUFBNCisjZGVmaW5lIGppbml0X3JlYWRfcmxlCQlqSVJkUkxFCisjZGVmaW5lIGppbml0X3dyaXRlX3JsZQkJaklXclJMRQorI2RlZmluZSBqaW5pdF9yZWFkX3RhcmdhCWpJUmRUYXJnYQorI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKKyNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCisjZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKKyNkZWZpbmUgc2V0X3F1YW50X3Nsb3RzCQlTZXRRU2xvdHMKKyNkZWZpbmUgc2V0X3NhbXBsZV9mYWN0b3JzCVNldFNGYWN0cworI2RlZmluZSByZWFkX2NvbG9yX21hcAkJUmRDTWFwCisjZGVmaW5lIGVuYWJsZV9zaWduYWxfY2F0Y2hlcglFblNpZ0NhdGNoZXIKKyNkZWZpbmUgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcglTdFByb2dNb24KKyNkZWZpbmUgZW5kX3Byb2dyZXNzX21vbml0b3IJRW5Qcm9nTW9uCisjZGVmaW5lIHJlYWRfc3RkaW4JCVJkU3RkaW4KKyNkZWZpbmUgd3JpdGVfc3Rkb3V0CQlXclN0ZG91dAorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworLyogTW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lcyBmb3IgSS9PIG1vZHVsZXMuICovCisKK0VYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2JtcCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2JtcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBib29sZWFuIGlzX29zMikpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfZ2lmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfZ2lmIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcHBtIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcHBtIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcmxlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfdGFyZ2EgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV90YXJnYSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KKworRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKKwkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKGJvb2xlYW4pIHJlYWRfc2Nhbl9zY3JpcHQgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKSk7CitFWFRFUk4oYm9vbGVhbikgc2V0X3F1YW50X3Nsb3RzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOworRVhURVJOKGJvb2xlYW4pIHNldF9zYW1wbGVfZmFjdG9ycyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKKworLyogZGpwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRjb2xtYXAuYykgKi8KKworRVhURVJOKHZvaWQpIHJlYWRfY29sb3JfbWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkpOworCisvKiBjb21tb24gc3VwcG9ydCByb3V0aW5lcyAoaW4gY2RqcGVnLmMpICovCisKK0VYVEVSTih2b2lkKSBlbmFibGVfc2lnbmFsX2NhdGNoZXIgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBzdGFydF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKSk7CitFWFRFUk4odm9pZCkgZW5kX3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBrZXltYXRjaCBKUFAoKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpKTsKK0VYVEVSTihGSUxFICopIHJlYWRfc3RkaW4gSlBQKCh2b2lkKSk7CitFWFRFUk4oRklMRSAqKSB3cml0ZV9zdGRvdXQgSlBQKCh2b2lkKSk7CisKKy8qIG1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLworCisjaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyIgorI2RlZmluZSBXUklURV9CSU5BUlkJInciCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCisjZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKKyNlbmRpZgorI2lmbmRlZiBFWElUX1NVQ0NFU1MKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBFWElUX1dBUk5JTkcKKyNpZmRlZiBWTVMKKyNkZWZpbmUgRVhJVF9XQVJOSU5HICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2Vsc2UKKyNkZWZpbmUgRVhJVF9XQVJOSU5HICAyCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NoYW5nZS5sb2cgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY2hhbmdlLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDEwMmMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NoYW5nZS5sb2cKQEAgLTAsMCArMSwyMTcgQEAKK0NIQU5HRSBMT0cgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCisKKworVmVyc2lvbiA2YiAgMjctTWFyLTE5OTgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2pwZWd0cmFuIGhhcyBuZXcgZmVhdHVyZXMgZm9yIGxvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9ucyAocm90YXRpb24KK2FuZCBmbGlwcGluZykgYXMgd2VsbCBhcyAibG9zc2xlc3MiIHJlZHVjdGlvbiB0byBncmF5c2NhbGUuCisKK2pwZWd0cmFuIG5vdyBjb3BpZXMgY29tbWVudHMgYnkgZGVmYXVsdDsgaXQgaGFzIGEgLWNvcHkgc3dpdGNoIHRvIGVuYWJsZQorY29weWluZyBhbGwgQVBQbiBibG9ja3MgYXMgd2VsbCwgb3IgdG8gc3VwcHJlc3MgY29tbWVudHMuICAoRm9ybWVybHkgaXQKK2Fsd2F5cyBzdXBwcmVzc2VkIGNvbW1lbnRzIGFuZCBBUFBuIGJsb2Nrcy4pICBqcGVndHJhbiBub3cgYWxzbyBwcmVzZXJ2ZXMKK0pGSUYgdmVyc2lvbiBhbmQgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbi4KKworTmV3IGRlY29tcHJlc3NvciBsaWJyYXJ5IGZlYXR1cmU6IENPTSBhbmQgQVBQbiBtYXJrZXJzIGZvdW5kIGluIHRoZSBpbnB1dAorZmlsZSBjYW4gYmUgc2F2ZWQgaW4gbWVtb3J5IGZvciBsYXRlciB1c2UgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKEJlZm9yZSwKK3lvdSBoYWQgdG8gY29kZSB0aGlzIHVwIHlvdXJzZWxmIHdpdGggYSBjdXN0b20gbWFya2VyIHByb2Nlc3Nvci4pCisKK1RoZXJlIGlzIGFuIHVudXNlZCBmaWVsZCAidm9pZCAqIGNsaWVudF9kYXRhIiBub3cgaW4gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKK3BhcmFtZXRlciBzdHJ1Y3RzOyB0aGlzIG1heSBiZSB1c2VmdWwgaW4gc29tZSBhcHBsaWNhdGlvbnMuCisKK0pGSUYgdmVyc2lvbiBudW1iZXIgaW5mb3JtYXRpb24gaXMgbm93IHNhdmVkIGJ5IHRoZSBkZWNvZGVyIGFuZCBhY2NlcHRlZCBieQordGhlIGVuY29kZXIuICBqcGVndHJhbiB1c2VzIHRoaXMgdG8gY29weSB0aGUgc291cmNlIGZpbGUncyB2ZXJzaW9uIG51bWJlciwKK3RvIGVuc3VyZSAianBlZ3RyYW4gLWNvcHkgYWxsIiB3b24ndCBjcmVhdGUgYm9ndXMgZmlsZXMgdGhhdCBjb250YWluIEpGWFgKK2V4dGVuc2lvbnMgYnV0IGNsYWltIHRvIGJlIHZlcnNpb24gMS4wMS4gIEFwcGxpY2F0aW9ucyB0aGF0IGdlbmVyYXRlIHRoZWlyCitvd24gSkZYWCBleHRlbnNpb24gbWFya2VycyBhbHNvIChmaW5hbGx5KSBoYXZlIGEgc3VwcG9ydGVkIHdheSB0byBjYXVzZSB0aGUKK2VuY29kZXIgdG8gZW1pdCBKRklGIHZlcnNpb24gbnVtYmVyIDEuMDIuCisKK2RqcGVnJ3MgdHJhY2UgbW9kZSByZXBvcnRzIEpGSUYgMS4wMiB0aHVtYm5haWwgaW1hZ2VzIGFzIHN1Y2gsIHJhdGhlcgordGhhbiBhcyB1bmtub3duIEFQUDAgbWFya2Vycy4KKworSW4gLXZlcmJvc2UgbW9kZSwgZGpwZWcgYW5kIHJkanBnY29tIHdpbGwgdHJ5IHRvIHByaW50IHRoZSBjb250ZW50cyBvZgorQVBQMTIgbWFya2VycyBhcyB0ZXh0LiAgU29tZSBkaWdpdGFsIGNhbWVyYXMgc3RvcmUgdXNlZnVsIHRleHQgaW5mb3JtYXRpb24KK2luIEFQUDEyIG1hcmtlcnMuCisKK0hhbmRsaW5nIG9mIHRydW5jYXRlZCBkYXRhIHN0cmVhbXMgaXMgbW9yZSByb2J1c3Q6IGJsb2NrcyBiZXlvbmQgdGhlIG9uZSBpbgord2hpY2ggdGhlIGVycm9yIG9jY3VycyB3aWxsIGJlIG91dHB1dCBhcyB1bmlmb3JtIGdyYXksIG9yIGxlZnQgdW5jaGFuZ2VkCitpZiBkZWNvZGluZyBhIHByb2dyZXNzaXZlIEpQRUcuICBUaGUgYXBwZWFyYW5jZSBubyBsb25nZXIgZGVwZW5kcyBvbiB0aGUKK0h1ZmZtYW4gdGFibGVzIGJlaW5nIHVzZWQuCisKK0h1ZmZtYW4gdGFibGVzIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eSBtdWNoIG1vcmUgY2FyZWZ1bGx5IHRoYW4gYmVmb3JlLgorCitUbyBhdm9pZCB0aGUgVW5pc3lzIExaVyBwYXRlbnQsIGRqcGVnJ3MgR0lGIG91dHB1dCBjYXBhYmlsaXR5IGhhcyBiZWVuCitjaGFuZ2VkIHRvIHByb2R1Y2UgInVuY29tcHJlc3NlZCBHSUZzIiwgYW5kIGNqcGVnJ3MgR0lGIGlucHV0IGNhcGFiaWxpdHkKK2hhcyBiZWVuIHJlbW92ZWQgYWx0b2dldGhlci4gIFdlJ3JlIG5vdCBoYXBweSBhYm91dCBpdCBlaXRoZXIsIGJ1dCB0aGVyZQorc2VlbXMgdG8gYmUgbm8gZ29vZCBhbHRlcm5hdGl2ZS4KKworVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IHN1cHBvcnRzIGJ1aWxkaW5nIGxpYmpwZWcgYXMgYSBzaGFyZWQgbGlicmFyeQorb24gbWFueSBmbGF2b3JzIG9mIFVuaXggKGFsbCB0aGUgb25lcyB0aGF0IEdOVSBsaWJ0b29sIGtub3dzIGhvdyB0bworYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBmb3IpLiAgVXNlICIuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zaGFyZWQiIHRvCit0cnkgdGhpcyBvdXQuCisKK05ldyBqY29uZmlnIGZpbGUgYW5kIG1ha2VmaWxlcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBDKysgYW5kIERldmVsb3BlciBTdHVkaW8uCitBbHNvLCBhIGpjb25maWcgZmlsZSBhbmQgYSBidWlsZCBzY3JpcHQgZm9yIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IKK29uIEFwcGxlIE1hY2ludG9zaC4gIG1ha2VmaWxlLmRqIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIERKR1BQIHYyLCBhbmQgdGhlcmUKK2FyZSBtaXNjZWxsYW5lb3VzIG90aGVyIG1pbm9yIGltcHJvdmVtZW50cyBpbiB0aGUgbWFrZWZpbGVzLgorCitqbWVtbWFjLmMgbm93IGtub3dzIGhvdyB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGZvbGxvd2luZyBNYWMgU3lzdGVtIDcKK2NvbnZlbnRpb25zLgorCitkanBlZydzIC1tYXAgc3dpdGNoIGlzIG5vdyBhYmxlIHRvIHJlYWQgcmF3LWZvcm1hdCBQUE0gZmlsZXMgcmVsaWFibHkuCisKK2NqcGVnIC1wcm9ncmVzc2l2ZSAtcmVzdGFydCBubyBsb25nZXIgZ2VuZXJhdGVzIGFueSB1bm5lY2Vzc2FyeSBEUkkgbWFya2Vycy4KKworTXVsdGlwbGUgY2FsbHMgdG8ganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gZm9yIGEgc2luZ2xlIEpQRUcgb2JqZWN0CitubyBsb25nZXIgbGVhayBtZW1vcnkuCisKKworVmVyc2lvbiA2YSAgNy1GZWItOTYKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpYnJhcnkgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgbW9kaWZpZWQgdG8gZGV0ZWN0IHZlcnNpb24gbWlzbWF0Y2hlcworYW5kIHN0cnVjdCBmaWVsZCBwYWNraW5nIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsaW5nIGFwcGxpY2F0aW9uLgorVGhpcyBjaGFuZ2UgcmVxdWlyZXMgYXBwbGljYXRpb25zIHRvIGJlIHJlY29tcGlsZWQsIGJ1dCBkb2VzIG5vdCByZXF1aXJlCithbnkgYXBwbGljYXRpb24gc291cmNlIGNvZGUgY2hhbmdlLgorCitBbGwgcm91dGluZSBkZWNsYXJhdGlvbnMgY2hhbmdlZCB0byB0aGUgc3R5bGUgIkdMT0JBTCh0eXBlKSBuYW1lIC4uLiIsCit0aGF0IGlzLCBHTE9CQUwsIExPQ0FMLCBNRVRIT0RERUYsIEVYVEVSTiBhcmUgbm93IG1hY3JvcyB0YWtpbmcgdGhlCityb3V0aW5lJ3MgcmV0dXJuIHR5cGUgYXMgYW4gYXJndW1lbnQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFkZAorTWljcm9zb2Z0LXN0eWxlIGxpbmthZ2Uga2V5d29yZHMgdG8gYWxsIHRoZSByb3V0aW5lcyBieSBjaGFuZ2luZyBqdXN0Cit0aGVzZSBtYWNyb3MuICBOb3RlIHRoYXQgYW55IGFwcGxpY2F0aW9uIGNvZGUgdGhhdCB3YXMgdXNpbmcgdGhlc2UgbWFjcm9zCit3aWxsIGhhdmUgdG8gYmUgY2hhbmdlZC4KKworRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIG5vdyBzdG9yZWQgaW4gbm9ybWFsIGFycmF5IG9yZGVyCityYXRoZXIgdGhhbiB6aWd6YWcgb3JkZXIuICBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgY2FsbHMganBlZ19hZGRfcXVhbnRfdGFibGUsCitvciBvdGhlcndpc2UgbWFuaXB1bGF0ZXMgcXVhbnRpemF0aW9uIHRhYmxlcyBkaXJlY3RseSwgd2lsbCBuZWVkIHRvIGJlCitjaGFuZ2VkLiAgSWYgeW91IG5lZWQgdG8gbWFrZSBzdWNoIGNvZGUgd29yayB3aXRoIGVpdGhlciBvbGRlciBvciBuZXdlcgordmVyc2lvbnMgb2YgdGhlIGxpYnJhcnksIGEgdGVzdCBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MSIgaXMKK3JlY29tbWVuZGVkLgorCitkanBlZydzIHRyYWNlIGNhcGFiaWxpdHkgbm93IGR1bXBzIERRVCB0YWJsZXMgaW4gbmF0dXJhbCBvcmRlciwgbm90IHppZ3phZworb3JkZXIuICBUaGlzIGFsbG93cyB0aGUgdHJhY2Ugb3V0cHV0IHRvIGJlIG1hZGUgaW50byBhICItcXRhYmxlcyIgZmlsZQorbW9yZSBlYXNpbHkuCisKK05ldyBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyIG1vZHVsZSBmb3IgdXNlIG9uIEFwcGxlIE1hY2ludG9zaC4KKworRml4IGJ1ZyBpbiBjanBlZydzIC1zbW9vdGggb3B0aW9uOiBsYXN0IG9uZSBvciB0d28gc2NhbmxpbmVzIHdvdWxkIGJlCitkdXBsaWNhdGVzIG9mIHRoZSBwcmlvciBsaW5lIHVubGVzcyB0aGUgaW1hZ2UgaGVpZ2h0IG1vZCAxNiB3YXMgMSBvciAyLgorCitSZXBhaXIgbWlub3IgcHJvYmxlbXMgaW4gVk1TLCBCQ0MsIE1DNiBtYWtlZmlsZXMuCisKK05ldyBjb25maWd1cmUgc2NyaXB0IGJhc2VkIG9uIGxhdGVzdCBHTlUgQXV0b2NvbmYuCisKK0NvcnJlY3QgdGhlIGxpc3Qgb2YgaW5jbHVkZSBmaWxlcyBuZWVkZWQgYnkgTWV0cm9XZXJrcyBDIGZvciBjY29tbWFuZCgpLgorCitOdW1lcm91cyBzbWFsbCBkb2N1bWVudGF0aW9uIHVwZGF0ZXMuCisKKworVmVyc2lvbiA2ICAyLUF1Zy05NQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQ6IGxpYnJhcnkgY2FuIHJlYWQgYW5kIHdyaXRlIGZ1bGwgcHJvZ3Jlc3NpdmUgSlBFRworZmlsZXMuICBBICJidWZmZXJlZCBpbWFnZSIgbW9kZSBzdXBwb3J0cyBpbmNyZW1lbnRhbCBkZWNvZGluZyBmb3Igb24tdGhlLWZseQorZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBpbWFnZXMuICBTaW1wbHkgcmVjb21waWxpbmcgYW4gZXhpc3RpbmcgSUpHLXY1LWJhc2VkCitkZWNvZGVyIHdpdGggdjYgc2hvdWxkIGFsbG93IGl0IHRvIHJlYWQgcHJvZ3Jlc3NpdmUgZmlsZXMsIHRob3VnaCBvZiBjb3Vyc2UKK3dpdGhvdXQgYW55IHNwZWNpYWwgcHJvZ3Jlc3NpdmUgZGlzcGxheS4KKworTmV3ICJqcGVndHJhbiIgYXBwbGljYXRpb24gcGVyZm9ybXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbiBkaWZmZXJlbnQKK0pQRUcgZm9ybWF0czsgcHJpbWFyaWx5LCBpdCBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGJhc2VsaW5lIHRvIHByb2dyZXNzaXZlCitKUEVHIGFuZCB2aWNlIHZlcnNhLiAgSW4gc3VwcG9ydCBvZiBqcGVndHJhbiwgdGhlIGxpYnJhcnkgbm93IGFsbG93cyBsb3NzbGVzcworcmVhZGluZyBhbmQgd3JpdGluZyBvZiBKUEVHIGZpbGVzIGFzIERDVCBjb2VmZmljaWVudCBhcnJheXMuICBUaGlzIGFiaWxpdHkKK21heSBiZSBvZiB1c2UgaW4gb3RoZXIgYXBwbGljYXRpb25zLgorCitOb3RlcyBmb3IgcHJvZ3JhbW1lcnM6CisqIFdlIGNoYW5nZWQganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdG8gYmUgYWJsZSB0byBzdXNwZW5kOyB0aGlzIG1ha2VzIGFsbAorZGVjb2RpbmcgbW9kZXMgYXZhaWxhYmxlIHRvIHN1c3BlbmRpbmctaW5wdXQgYXBwbGljYXRpb25zLiAgSG93ZXZlciwKK2V4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBzdXNwZW5kaW5nIGlucHV0IHdpbGwgbmVlZCB0byBiZSBjaGFuZ2VkCit0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20ganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBZb3UgZG9uJ3QgbmVlZCB0bworZG8gYW55dGhpbmcgaWYgeW91IGRvbid0IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCisqIFdlIGNoYW5nZWQgdGhlIGludGVyZmFjZSB0byB0aGUgdmlydHVhbCBhcnJheSByb3V0aW5lczogYWNjZXNzX3ZpcnRfYXJyYXkKK3JvdXRpbmVzIG5vdyB0YWtlIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiByb3dzIHRvIGFjY2VzcyB0aGlzIHRpbWUuICBUaGUKK2xhc3QgcGFyYW1ldGVyIHRvIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBpcyBub3cgaW50ZXJwcmV0ZWQgYXMgdGhlCittYXhpbXVtIG51bWJlciBvZiByb3dzIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIGF0IG9uY2UsIGJ1dCBub3QgbmVjZXNzYXJpbHkKK3RoZSBoZWlnaHQgb2YgZXZlcnkgYWNjZXNzLgorCisKK1ZlcnNpb24gNWIgIDE1LU1hci05NQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcnJlY3QgYnVncyB3aXRoIGdyYXlzY2FsZSBpbWFnZXMgaGF2aW5nIHZfc2FtcF9mYWN0b3IgPiAxLgorCitqcGVnX3dyaXRlX3Jhd19kYXRhKCkgbm93IHN1cHBvcnRzIG91dHB1dCBzdXNwZW5zaW9uLgorCitDb3JyZWN0IGJ1Z3MgaW4gImNvbmZpZ3VyZSIgc2NyaXB0IGZvciBjYXNlIG9mIGNvbXBpbGluZyBpbgorYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcy4KKworUmVwYWlyIGJ1ZyBpbiBqcXVhbnQxLmM6IHNvbWV0aW1lcyBkaWRuJ3QgdXNlIGFzIG1hbnkgY29sb3JzIGFzIGl0IGNvdWxkLgorCitCb3JsYW5kIEMgbWFrZWZpbGUgYW5kIGpjb25maWcgZmlsZSB3b3JrIHVuZGVyIGVpdGhlciBNUy1ET1Mgb3IgT1MvMi4KKworTWlzY2VsbGFuZW91cyBpbXByb3ZlbWVudHMgdG8gZG9jdW1lbnRhdGlvbi4KKworCitWZXJzaW9uIDVhICA3LURlYy05NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2hhbmdlZCBjb2xvciBjb252ZXJzaW9uIHJvdW5kb2ZmIGJlaGF2aW9yIHNvIHRoYXQgZ3JheXNjYWxlIHZhbHVlcyBhcmUKK3JlcHJlc2VudGVkIGV4YWN0bHkuICAoVGhpcyBjYXVzZXMgdGVzdCBpbWFnZSBmaWxlcyB0byBjaGFuZ2UuKQorCitNYWtlIG9yZGVyZWQgZGl0aGVyIHVzZSAxNngxNiBpbnN0ZWFkIG9mIDR4NCBwYXR0ZXJuIGZvciBhIHNtYWxsIHF1YWxpdHkKK2ltcHJvdmVtZW50LgorCitOZXcgY29uZmlndXJlIHNjcmlwdCBiYXNlZCBvbiBsYXRlc3QgR05VIEF1dG9jb25mLgorRml4IGNvbmZpZ3VyZSBzY3JpcHQgdG8gaGFuZGxlIENGTEFHUyBjb3JyZWN0bHkuCitSZW5hbWUgKi5hdXRvIGZpbGVzIHRvICouY2ZnLCBzbyB0aGF0IGNvbmZpZ3VyZSBzY3JpcHQgc3RpbGwgd29ya3MgaWYKK2ZpbGUgbmFtZXMgaGF2ZSBiZWVuIHRydW5jYXRlZCBmb3IgRE9TLgorCitGaXggYnVnIGluIHJkYm1wLmM6IGRpZG4ndCBhbGxvdyBmb3IgZXh0cmEgZGF0YSBiZXR3ZWVuIGhlYWRlciBhbmQgaW1hZ2UuCisKK01vZGlmeSByZHBwbS5jL3dycHBtLmMgdG8gaGFuZGxlIDItYnl0ZSByYXcgUFBNL1BHTSBmb3JtYXRzIGZvciAxMi1iaXQgZGF0YS4KKworRml4IHNldmVyYWwgYnVncyBpbiByZHJsZS5jLgorCitORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTIG9wdGlvbiB3YXMgYnJva2VuLgorCitSZXZpc2UgamVycm9yLmgvamVycm9yLmMgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gbWVzc2FnZSB0YWJsZS4KKworUmVwYWlyIG92ZXJzaWdodCBpbiBqbWVtbmFtZS5jIE5PX01LVEVNUCBjYXNlOiBmaWxlIGNvdWxkIGJlIHRoZXJlCitidXQgdW5yZWFkYWJsZS4KKworCitWZXJzaW9uIDUgIDI0LVNlcC05NAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVmVyc2lvbiA1IHJlcHJlc2VudHMgYSBuZWFybHkgY29tcGxldGUgcmVkZXNpZ24gYW5kIHJld3JpdGUgb2YgdGhlIElKRworc29mdHdhcmUuICBNYWpvciB1c2VyLXZpc2libGUgY2hhbmdlcyBpbmNsdWRlOgorICAqIEF1dG9tYXRpYyBjb25maWd1cmF0aW9uIHNpbXBsaWZpZXMgaW5zdGFsbGF0aW9uIGZvciBtb3N0IFVuaXggc3lzdGVtcy4KKyAgKiBBIHJhbmdlIG9mIHNwZWVkIHZzLiBpbWFnZSBxdWFsaXR5IHRyYWRlb2ZmcyBhcmUgc3VwcG9ydGVkLgorICAgIFRoaXMgaW5jbHVkZXMgcmVzaXppbmcgb2YgYW4gaW1hZ2UgZHVyaW5nIGRlY29tcHJlc3Npb246IHNjYWxpbmcgZG93bgorICAgIGJ5IGEgZmFjdG9yIG9mIDEvMiwgMS80LCBvciAxLzggaXMgaGFuZGxlZCB2ZXJ5IGVmZmljaWVudGx5LgorICAqIE5ldyBwcm9ncmFtcyByZGpwZ2NvbSBhbmQgd3JqcGdjb20gYWxsb3cgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uCisgICAgb2YgdGV4dCBjb21tZW50cyBpbiBhIEpQRUcgZmlsZS4KKworVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIncyBpbnRlcmZhY2UgdG8gdGhlIGxpYnJhcnkgaGFzIGNoYW5nZWQgY29tcGxldGVseS4KK05vdGFibGUgaW1wcm92ZW1lbnRzIGluY2x1ZGU6CisgICogV2UgaGF2ZSBlbGltaW5hdGVkIHRoZSB1c2Ugb2YgY2FsbGJhY2sgcm91dGluZXMgZm9yIGhhbmRsaW5nIHRoZQorICAgIHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhLiAgVGhlIGFwcGxpY2F0aW9uIG5vdyBzZWVzIHRoZSBsaWJyYXJ5IGFzIGEKKyAgICBzZXQgb2Ygcm91dGluZXMgdGhhdCBpdCBjYWxscyB0byByZWFkIG9yIHdyaXRlIGltYWdlIGRhdGEgb24gYQorICAgIHNjYW5saW5lLWJ5LXNjYW5saW5lIGJhc2lzLgorICAqIFRoZSBhcHBsaWNhdGlvbiBpbWFnZSBkYXRhIGlzIHJlcHJlc2VudGVkIGluIGEgY29udmVudGlvbmFsIGludGVybGVhdmVkLQorICAgIHBpeGVsIGZvcm1hdCwgcmF0aGVyIHRoYW4gYXMgYSBzZXBhcmF0ZSBhcnJheSBmb3IgZWFjaCBjb2xvciBjaGFubmVsLgorICAgIFRoaXMgY2FuIHNhdmUgYSBjb3B5aW5nIHN0ZXAgaW4gbWFueSBwcm9ncmFtcy4KKyAgKiBUaGUgaGFuZGxpbmcgb2YgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIGNsZWFuZWQgdXA6IHRoZSBhcHBsaWNhdGlvbiBjYW4KKyAgICBzdXBwbHkgcm91dGluZXMgdG8gc291cmNlIG9yIHNpbmsgdGhlIGNvbXByZXNzZWQgZGF0YS4gIEl0IGlzIHBvc3NpYmxlIHRvCisgICAgc3VzcGVuZCBwcm9jZXNzaW5nIG9uIHNvdXJjZS9zaW5rIGJ1ZmZlciBvdmVycnVuLCBhbHRob3VnaCB0aGlzIGlzIG5vdAorICAgIHN1cHBvcnRlZCBpbiBhbGwgb3BlcmF0aW5nIG1vZGVzLgorICAqIEFsbCBzdGF0aWMgc3RhdGUgaGFzIGJlZW4gZWxpbWluYXRlZCBmcm9tIHRoZSBsaWJyYXJ5LCBzbyB0aGF0IG11bHRpcGxlCisgICAgaW5zdGFuY2VzIG9mIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY2FuIGJlIGFjdGl2ZSBjb25jdXJyZW50bHkuCisgICogSlBFRyBhYmJyZXZpYXRlZCBkYXRhc3RyZWFtIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCwgaWUsIHF1YW50aXphdGlvbiBhbmQKKyAgICBIdWZmbWFuIHRhYmxlcyBjYW4gYmUgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgaW1hZ2UgZGF0YS4KKyAgKiBBbmQgbm90IG9ubHkgdGhhdCwgYnV0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5IGhhcyBpbXByb3ZlZAorICAgIGNvbnNpZGVyYWJseSEKKworCitUaGUgbGFzdCB3aWRlbHkgdXNlZCByZWxlYXNlIGJlZm9yZSB0aGUgdmVyc2lvbiA1IHJld3JpdGUgd2FzIHZlcnNpb24gNEEgb2YKKzE4LUZlYi05My4gIENoYW5nZSBsb2dzIGJlZm9yZSB0aGF0IHBvaW50IGhhdmUgYmVlbiBkaXNjYXJkZWQsIHNpbmNlIHRoZXkKK2FyZSBub3Qgb2YgbXVjaCBpbnRlcmVzdCBhZnRlciB0aGUgcmV3cml0ZS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9janBlZy4xIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NqcGVnLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NWE5NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9janBlZy4xCkBAIC0wLDAgKzEsMjkyIEBACisuVEggQ0pQRUcgMSAiMjAgTWFyY2ggMTk5OCIKKy5TSCBOQU1FCitjanBlZyBcLSBjb21wcmVzcyBhbiBpbWFnZSBmaWxlIHRvIGEgSlBFRyBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGNqcGVnCitbCisuSSBvcHRpb25zCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgY2pwZWcKK2NvbXByZXNzZXMgdGhlIG5hbWVkIGltYWdlIGZpbGUsIG9yIHRoZSBzdGFuZGFyZCBpbnB1dCBpZiBubyBmaWxlIGlzCituYW1lZCwgYW5kIHByb2R1Y2VzIGEgSlBFRy9KRklGIGZpbGUgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4KK1RoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGlucHV0IGZpbGUgZm9ybWF0cyBhcmU6IFBQTSAoUEJNUExVUyBjb2xvcgorZm9ybWF0KSwgUEdNIChQQk1QTFVTIGdyYXktc2NhbGUgZm9ybWF0KSwgQk1QLCBUYXJnYSwgYW5kIFJMRSAoVXRhaCBSYXN0ZXIKK1Rvb2xraXQgZm9ybWF0KS4gIChSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1ncmF5c2NhbGUKK21heSBiZSB3cml0dGVuCisuQiBcLWdyYXkKK29yCisuQlIgXC1nciAuCitNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KK1VwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCisuQiBcLUJNUAoraXMgdGhlIHNhbWUgYXMKKy5CUiBcLWJtcCApLgorQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCisuQlIgXC1ncmV5c2NhbGUgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKKy5UUAorLkJJIFwtcXVhbGl0eSAiIE4iCitTY2FsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGFkanVzdCBpbWFnZSBxdWFsaXR5LiAgUXVhbGl0eSBpcyAwICh3b3JzdCkgdG8KKzEwMCAoYmVzdCk7IGRlZmF1bHQgaXMgNzUuICAoU2VlIGJlbG93IGZvciBtb3JlIGluZm8uKQorLlRQCisuQiBcLWdyYXlzY2FsZQorQ3JlYXRlIG1vbm9jaHJvbWUgSlBFRyBmaWxlIGZyb20gY29sb3IgaW5wdXQuICBCZSBzdXJlIHRvIHVzZSB0aGlzIHN3aXRjaCB3aGVuCitjb21wcmVzc2luZyBhIGdyYXlzY2FsZSBCTVAgZmlsZSwgYmVjYXVzZQorLkIgY2pwZWcKK2lzbid0IGJyaWdodCBlbm91Z2ggdG8gbm90aWNlIHdoZXRoZXIgYSBCTVAgZmlsZSB1c2VzIG9ubHkgc2hhZGVzIG9mIGdyYXkuCitCeSBzYXlpbmcKKy5CUiBcLWdyYXlzY2FsZSAsCit5b3UnbGwgZ2V0IGEgc21hbGxlciBKUEVHIGZpbGUgdGhhdCB0YWtlcyBsZXNzIHRpbWUgdG8gcHJvY2Vzcy4KKy5UUAorLkIgXC1vcHRpbWl6ZQorUGVyZm9ybSBvcHRpbWl6YXRpb24gb2YgZW50cm9weSBlbmNvZGluZyBwYXJhbWV0ZXJzLiAgV2l0aG91dCB0aGlzLCBkZWZhdWx0CitlbmNvZGluZyBwYXJhbWV0ZXJzIGFyZSB1c2VkLgorLkIgXC1vcHRpbWl6ZQordXN1YWxseSBtYWtlcyB0aGUgSlBFRyBmaWxlIGEgbGl0dGxlIHNtYWxsZXIsIGJ1dAorLkIgY2pwZWcKK3J1bnMgc29tZXdoYXQgc2xvd2VyIGFuZCBuZWVkcyBtdWNoIG1vcmUgbWVtb3J5LiAgSW1hZ2UgcXVhbGl0eSBhbmQgc3BlZWQgb2YKK2RlY29tcHJlc3Npb24gYXJlIHVuYWZmZWN0ZWQgYnkKKy5CUiBcLW9wdGltaXplIC4KKy5UUAorLkIgXC1wcm9ncmVzc2l2ZQorQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAoc2VlIGJlbG93KS4KKy5UUAorLkIgXC10YXJnYQorSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICBUYXJnYSBmaWxlcyB0aGF0IGNvbnRhaW4gYW4gImlkZW50aWZpY2F0aW9uIgorZmllbGQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseSByZWNvZ25pemVkIGJ5CisuQlIgY2pwZWcgOworZm9yIHN1Y2ggZmlsZXMgeW91IG11c3Qgc3BlY2lmeQorLkIgXC10YXJnYQordG8gbWFrZQorLkIgY2pwZWcKK3RyZWF0IHRoZSBpbnB1dCBhcyBUYXJnYSBmb3JtYXQuCitGb3IgbW9zdCBUYXJnYSBmaWxlcywgeW91IHdvbid0IG5lZWQgdGhpcyBzd2l0Y2guCisuUFAKK1RoZQorLkIgXC1xdWFsaXR5Citzd2l0Y2ggbGV0cyB5b3UgdHJhZGUgb2ZmIGNvbXByZXNzZWQgZmlsZSBzaXplIGFnYWluc3QgcXVhbGl0eSBvZiB0aGUKK3JlY29uc3RydWN0ZWQgaW1hZ2U6IHRoZSBoaWdoZXIgdGhlIHF1YWxpdHkgc2V0dGluZywgdGhlIGxhcmdlciB0aGUgSlBFRyBmaWxlLAorYW5kIHRoZSBjbG9zZXIgdGhlIG91dHB1dCBpbWFnZSB3aWxsIGJlIHRvIHRoZSBvcmlnaW5hbCBpbnB1dC4gIE5vcm1hbGx5IHlvdQord2FudCB0byB1c2UgdGhlIGxvd2VzdCBxdWFsaXR5IHNldHRpbmcgKHNtYWxsZXN0IGZpbGUpIHRoYXQgZGVjb21wcmVzc2VzIGludG8KK3NvbWV0aGluZyB2aXN1YWxseSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBvcmlnaW5hbCBpbWFnZS4gIEZvciB0aGlzCitwdXJwb3NlIHRoZSBxdWFsaXR5IHNldHRpbmcgc2hvdWxkIGJlIGJldHdlZW4gNTAgYW5kIDk1OyB0aGUgZGVmYXVsdCBvZiA3NSBpcworb2Z0ZW4gYWJvdXQgcmlnaHQuICBJZiB5b3Ugc2VlIGRlZmVjdHMgYXQKKy5CIFwtcXVhbGl0eQorNzUsIHRoZW4gZ28gdXAgNSBvciAxMCBjb3VudHMgYXQgYSB0aW1lIHVudGlsIHlvdSBhcmUgaGFwcHkgd2l0aCB0aGUgb3V0cHV0CitpbWFnZS4gIChUaGUgb3B0aW1hbCBzZXR0aW5nIHdpbGwgdmFyeSBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLikKKy5QUAorLkIgXC1xdWFsaXR5CisxMDAgd2lsbCBnZW5lcmF0ZSBhIHF1YW50aXphdGlvbiB0YWJsZSBvZiBhbGwgMSdzLCBtaW5pbWl6aW5nIGxvc3MgaW4gdGhlCitxdWFudGl6YXRpb24gc3RlcCAoYnV0IHRoZXJlIGlzIHN0aWxsIGluZm9ybWF0aW9uIGxvc3MgaW4gc3Vic2FtcGxpbmcsIGFzIHdlbGwKK2FzIHJvdW5kb2ZmIGVycm9yKS4gIFRoaXMgc2V0dGluZyBpcyBtYWlubHkgb2YgaW50ZXJlc3QgZm9yIGV4cGVyaW1lbnRhbAorcHVycG9zZXMuICBRdWFsaXR5IHZhbHVlcyBhYm92ZSBhYm91dCA5NSBhcmUKKy5CIG5vdAorcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2U7IHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBnb2VzIHVwIGRyYW1hdGljYWxseSBmb3IKK2hhcmRseSBhbnkgZ2FpbiBpbiBvdXRwdXQgaW1hZ2UgcXVhbGl0eS4KKy5QUAorSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgcXVhbGl0eSB2YWx1ZXMgYmVsb3cgNTAgd2lsbCBwcm9kdWNlIHZlcnkgc21hbGwgZmlsZXMKK29mIGxvdyBpbWFnZSBxdWFsaXR5LiAgU2V0dGluZ3MgYXJvdW5kIDUgdG8gMTAgbWlnaHQgYmUgdXNlZnVsIGluIHByZXBhcmluZyBhbgoraW5kZXggb2YgYSBsYXJnZSBpbWFnZSBsaWJyYXJ5LCBmb3IgZXhhbXBsZS4gIFRyeQorLkIgXC1xdWFsaXR5CisyIChvciBzbykgZm9yIHNvbWUgYW11c2luZyBDdWJpc3QgZWZmZWN0cy4gIChOb3RlOiBxdWFsaXR5Cit2YWx1ZXMgYmVsb3cgYWJvdXQgMjUgZ2VuZXJhdGUgMi1ieXRlIHF1YW50aXphdGlvbiB0YWJsZXMsIHdoaWNoIGFyZQorY29uc2lkZXJlZCBvcHRpb25hbCBpbiB0aGUgSlBFRyBzdGFuZGFyZC4KKy5CIGNqcGVnCitlbWl0cyBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHlvdSBnaXZlIHN1Y2ggYSBxdWFsaXR5IHZhbHVlLCBiZWNhdXNlIHNvbWUKK290aGVyIEpQRUcgcHJvZ3JhbXMgbWF5IGJlIHVuYWJsZSB0byBkZWNvZGUgdGhlIHJlc3VsdGluZyBmaWxlLiAgVXNlCisuQiBcLWJhc2VsaW5lCitpZiB5b3UgbmVlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhdCBsb3cgcXVhbGl0eSB2YWx1ZXMuKQorLlBQCitUaGUKKy5CIFwtcHJvZ3Jlc3NpdmUKK3N3aXRjaCBjcmVhdGVzIGEgInByb2dyZXNzaXZlIEpQRUciIGZpbGUuICBJbiB0aGlzIHR5cGUgb2YgSlBFRyBmaWxlLCB0aGUgZGF0YQoraXMgc3RvcmVkIGluIG11bHRpcGxlIHNjYW5zIG9mIGluY3JlYXNpbmcgcXVhbGl0eS4gIElmIHRoZSBmaWxlIGlzIGJlaW5nCit0cmFuc21pdHRlZCBvdmVyIGEgc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCB0aGUgZGVjb2RlciBjYW4gdXNlIHRoZSBmaXJzdAorc2NhbiB0byBkaXNwbGF5IGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeSBxdWlja2x5LCBhbmQgY2FuIHRoZW4gaW1wcm92ZSB0aGUKK2Rpc3BsYXkgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2Nhbi4gIFRoZSBmaW5hbCBpbWFnZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gYQorc3RhbmRhcmQgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkgc2V0dGluZywgYW5kIHRoZSB0b3RhbCBmaWxlIHNpemUgaXMKK2Fib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLgorLkIgQ2F1dGlvbjoKK3Byb2dyZXNzaXZlIEpQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZQordW5hYmxlIHRvIHZpZXcgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgYXQgYWxsLgorLlBQCitTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CisuVFAKKy5CIFwtZGN0IGludAorVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCisuVFAKKy5CIFwtZGN0IGZhc3QKK1VzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KKy5UUAorLkIgXC1kY3QgZmxvYXQKK1VzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgorVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbiB0aGUgaW50IG1ldGhvZCwgYnV0IGlzCittdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lIGhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvCitub3RlIHRoYXQgcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5IGFjcm9zcworbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBldmVyeXdoZXJlLgorVGhlIGZhc3QgaW50ZWdlciBtZXRob2QgaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KKy5UUAorLkJJIFwtcmVzdGFydCAiIE4iCitFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeSBOIE1DVSBibG9ja3MgaWYgIkIiIGlzCithdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorLkIgXC1yZXN0YXJ0IDAKKyh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gcmVzdGFydCBtYXJrZXJzLgorLlRQCisuQkkgXC1zbW9vdGggIiBOIgorU21vb3RoIHRoZSBpbnB1dCBpbWFnZSB0byBlbGltaW5hdGUgZGl0aGVyaW5nIG5vaXNlLiAgTiwgcmFuZ2luZyBmcm9tIDEgdG8KKzEwMCwgaW5kaWNhdGVzIHRoZSBzdHJlbmd0aCBvZiBzbW9vdGhpbmcuICAwICh0aGUgZGVmYXVsdCkgbWVhbnMgbm8gc21vb3RoaW5nLgorLlRQCisuQkkgXC1tYXhtZW1vcnkgIiBOIgorU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nIGxhcmdlIGltYWdlcy4gIFZhbHVlIGlzCitpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yIG1pbGxpb25zIG9mIGJ5dGVzIGlmICJNIiBpcyBhdHRhY2hlZCB0byB0aGUKK251bWJlci4gIEZvciBleGFtcGxlLAorLkIgXC1tYXggNG0KK3NlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUgc3BhY2UgaXMgbmVlZGVkLCB0ZW1wb3JhcnkgZmlsZXMgd2lsbCBiZSB1c2VkLgorLlRQCisuQkkgXC1vdXRmaWxlICIgbmFtZSIKK1NlbmQgb3V0cHV0IGltYWdlIHRvIHRoZSBuYW1lZCBmaWxlLCBub3QgdG8gc3RhbmRhcmQgb3V0cHV0LgorLlRQCisuQiBcLXZlcmJvc2UKK0VuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUKKy5CUiBcLXYgJ3MKK2dpdmUgbW9yZSBvdXRwdXQuICBBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KKy5UUAorLkIgXC1kZWJ1ZworU2FtZSBhcworLkJSIFwtdmVyYm9zZSAuCisuUFAKK1RoZQorLkIgXC1yZXN0YXJ0CitvcHRpb24gaW5zZXJ0cyBleHRyYSBtYXJrZXJzIHRoYXQgYWxsb3cgYSBKUEVHIGRlY29kZXIgdG8gcmVzeW5jaHJvbml6ZSBhZnRlcgorYSB0cmFuc21pc3Npb24gZXJyb3IuICBXaXRob3V0IHJlc3RhcnQgbWFya2VycywgYW55IGRhbWFnZSB0byBhIGNvbXByZXNzZWQKK2ZpbGUgd2lsbCB1c3VhbGx5IHJ1aW4gdGhlIGltYWdlIGZyb20gdGhlIHBvaW50IG9mIHRoZSBlcnJvciB0byB0aGUgZW5kIG9mIHRoZQoraW1hZ2U7IHdpdGggcmVzdGFydCBtYXJrZXJzLCB0aGUgZGFtYWdlIGlzIHVzdWFsbHkgY29uZmluZWQgdG8gdGhlIHBvcnRpb24gb2YKK3RoZSBpbWFnZSB1cCB0byB0aGUgbmV4dCByZXN0YXJ0IG1hcmtlci4gIE9mIGNvdXJzZSwgdGhlIHJlc3RhcnQgbWFya2Vycworb2NjdXB5IGV4dHJhIHNwYWNlLiAgV2UgcmVjb21tZW5kCisuQiBcLXJlc3RhcnQgMQorZm9yIGltYWdlcyB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgYWNyb3NzIHVucmVsaWFibGUgbmV0d29ya3Mgc3VjaCBhcyBVc2VuZXQuCisuUFAKK1RoZQorLkIgXC1zbW9vdGgKK29wdGlvbiBmaWx0ZXJzIHRoZSBpbnB1dCB0byBlbGltaW5hdGUgZmluZS1zY2FsZSBub2lzZS4gIFRoaXMgaXMgb2Z0ZW4gdXNlZnVsCit3aGVuIGNvbnZlcnRpbmcgZGl0aGVyZWQgaW1hZ2VzIHRvIEpQRUc6IGEgbW9kZXJhdGUgc21vb3RoaW5nIGZhY3RvciBvZiAxMCB0bworNTAgZ2V0cyByaWQgb2YgZGl0aGVyaW5nIHBhdHRlcm5zIGluIHRoZSBpbnB1dCBmaWxlLCByZXN1bHRpbmcgaW4gYSBzbWFsbGVyCitKUEVHIGZpbGUgYW5kIGEgYmV0dGVyLWxvb2tpbmcgaW1hZ2UuICBUb28gbGFyZ2UgYSBzbW9vdGhpbmcgZmFjdG9yIHdpbGwKK3Zpc2libHkgYmx1ciB0aGUgaW1hZ2UsIGhvd2V2ZXIuCisuUFAKK1N3aXRjaGVzIGZvciB3aXphcmRzOgorLlRQCisuQiBcLWJhc2VsaW5lCitGb3JjZSBiYXNlbGluZS1jb21wYXRpYmxlIHF1YW50aXphdGlvbiB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgVGhpcyBjbGFtcHMKK3F1YW50aXphdGlvbiB2YWx1ZXMgdG8gOCBiaXRzIGV2ZW4gYXQgbG93IHF1YWxpdHkgc2V0dGluZ3MuICAoVGhpcyBzd2l0Y2ggaXMKK3Bvb3JseSBuYW1lZCwgc2luY2UgaXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBhY3R1YWxseSBiYXNlbGluZQorSlBFRy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZQorLkIgXC1iYXNlbGluZQorYW5kCisuQiBcLXByb2dyZXNzaXZlCit0b2dldGhlci4pCisuVFAKKy5CSSBcLXF0YWJsZXMgIiBmaWxlIgorVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgorLlRQCisuQkkgXC1xc2xvdHMgIiBOWywuLi5dIgorU2VsZWN0IHdoaWNoIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UgZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LgorLlRQCisuQkkgXC1zYW1wbGUgIiBIeFZbLC4uLl0iCitTZXQgSlBFRyBzYW1wbGluZyBmYWN0b3JzIGZvciBlYWNoIGNvbG9yIGNvbXBvbmVudC4KKy5UUAorLkJJIFwtc2NhbnMgIiBmaWxlIgorVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKy5QUAorVGhlICJ3aXphcmQiIHN3aXRjaGVzIGFyZSBpbnRlbmRlZCBmb3IgZXhwZXJpbWVudGF0aW9uIHdpdGggSlBFRy4gIElmIHlvdQorZG9uJ3Qga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcsIFxmQmRvbid0IHVzZSB0aGVtXGZSLiAgVGhlc2Ugc3dpdGNoZXMgYXJlCitkb2N1bWVudGVkIGZ1cnRoZXIgaW4gdGhlIGZpbGUgd2l6YXJkLmRvYy4KKy5TSCBFWEFNUExFUworLkxQCitUaGlzIGV4YW1wbGUgY29tcHJlc3NlcyB0aGUgUFBNIGZpbGUgZm9vLnBwbSB3aXRoIGEgcXVhbGl0eSBmYWN0b3Igb2YKKzYwIGFuZCBzYXZlcyB0aGUgb3V0cHV0IGFzIGZvby5qcGc6CisuSVAKKy5CIGNqcGVnIFwtcXVhbGl0eQorLkkgNjAgZm9vLnBwbQorLkIgPgorLkkgZm9vLmpwZworLlNIIEhJTlRTCitDb2xvciBHSUYgZmlsZXMgYXJlIG5vdCB0aGUgaWRlYWwgaW5wdXQgZm9yIEpQRUc7IEpQRUcgaXMgcmVhbGx5IGludGVuZGVkIGZvcgorY29tcHJlc3NpbmcgZnVsbC1jb2xvciAoMjQtYml0KSBpbWFnZXMuICBJbiBwYXJ0aWN1bGFyLCBkb24ndCB0cnkgdG8gY29udmVydAorY2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlciBpbWFnZXMgdGhhdCBoYXZlIG9ubHkgYSBmZXcgZGlzdGluY3QKK2NvbG9ycy4gIEdJRiB3b3JrcyBncmVhdCBvbiB0aGVzZSwgSlBFRyBkb2VzIG5vdC4gIElmIHlvdSB3YW50IHRvIGNvbnZlcnQgYQorR0lGIHRvIEpQRUcsIHlvdSBzaG91bGQgZXhwZXJpbWVudCB3aXRoCisuQlIgY2pwZWcgJ3MKKy5CIFwtcXVhbGl0eQorYW5kCisuQiBcLXNtb290aAorb3B0aW9ucyB0byBnZXQgYSBzYXRpc2ZhY3RvcnkgY29udmVyc2lvbi4KKy5CIFwtc21vb3RoIDEwCitvciBzbyBpcyBvZnRlbiBoZWxwZnVsLgorLlBQCitBdm9pZCBydW5uaW5nIGFuIGltYWdlIHRocm91Z2ggYSBzZXJpZXMgb2YgSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCitjeWNsZXMuICBJbWFnZSBxdWFsaXR5IGxvc3Mgd2lsbCBhY2N1bXVsYXRlOyBhZnRlciB0ZW4gb3Igc28gY3ljbGVzIHRoZSBpbWFnZQorbWF5IGJlIG5vdGljZWFibHkgd29yc2UgdGhhbiBpdCB3YXMgYWZ0ZXIgb25lIGN5Y2xlLiAgSXQncyBiZXN0IHRvIHVzZSBhCitsb3NzbGVzcyBmb3JtYXQgd2hpbGUgbWFuaXB1bGF0aW5nIGFuIGltYWdlLCB0aGVuIGNvbnZlcnQgdG8gSlBFRyBmb3JtYXQgd2hlbgoreW91IGFyZSByZWFkeSB0byBmaWxlIHRoZSBpbWFnZSBhd2F5LgorLlBQCitUaGUKKy5CIFwtb3B0aW1pemUKK29wdGlvbiB0bworLkIgY2pwZWcKK2lzIHdvcnRoIHVzaW5nIHdoZW4geW91IGFyZSBtYWtpbmcgYSAiZmluYWwiIHZlcnNpb24gZm9yIHBvc3Rpbmcgb3IgYXJjaGl2aW5nLgorSXQncyBhbHNvIGEgd2luIHdoZW4geW91IGFyZSB1c2luZyBsb3cgcXVhbGl0eSBzZXR0aW5ncyB0byBtYWtlIHZlcnkgc21hbGwKK0pQRUcgZmlsZXM7IHRoZSBwZXJjZW50YWdlIGltcHJvdmVtZW50IGlzIG9mdGVuIGEgbG90IG1vcmUgdGhhbiBpdCBpcyBvbgorbGFyZ2VyIGZpbGVzLiAgKEF0IHByZXNlbnQsCisuQiBcLW9wdGltaXplCittb2RlIGlzIGFsd2F5cyBzZWxlY3RlZCB3aGVuIGdlbmVyYXRpbmcgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcy4pCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSlBFR01FTQorSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCitUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCisuQiBcLW1heG1lbW9yeQorc3dpdGNoLgorLkIgSlBFR01FTQorb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCitpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAorLkJSIFwtbWF4bWVtb3J5IC4KKy5TSCBTRUUgQUxTTworLkJSIGRqcGVnICgxKSwKKy5CUiBqcGVndHJhbiAoMSksCisuQlIgcmRqcGdjb20gKDEpLAorLkJSIHdyanBnY29tICgxKQorLmJyCisuQlIgcHBtICg1KSwKKy5CUiBwZ20gKDUpCisuYnIKK1dhbGxhY2UsIEdyZWdvcnkgSy4gICJUaGUgSlBFRyBTdGlsbCBQaWN0dXJlIENvbXByZXNzaW9uIFN0YW5kYXJkIiwKK0NvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sIEFwcmlsIDE5OTEgKHZvbC4gMzQsIG5vLiA0KSwgcHAuIDMwLTQ0LgorLlNIIEFVVEhPUgorSW5kZXBlbmRlbnQgSlBFRyBHcm91cAorLlNIIEJVR1MKK0FyaXRobWV0aWMgY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGxlZ2FsIHJlYXNvbnMuCisuUFAKK0dJRiBpbnB1dCBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LgorVXNlIGEgVW5pc3lzLWxpY2Vuc2VkIHByb2dyYW0gaWYgeW91IG5lZWQgdG8gcmVhZCBhIEdJRiBmaWxlLiAgKENvbnZlcnNpb24KK29mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQorLlBQCitOb3QgYWxsIHZhcmlhbnRzIG9mIEJNUCBhbmQgVGFyZ2EgZmlsZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisuUFAKK1RoZQorLkIgXC10YXJnYQorc3dpdGNoIGlzIG5vdCBhIGJ1ZywgaXQncyBhIGZlYXR1cmUuICAoSXQgd291bGQgYmUgYSBidWcgaWYgdGhlIFRhcmdhIGZvcm1hdAorZGVzaWduZXJzIGhhZCBub3QgYmVlbiBjbHVlbGVzcy4pCisuUFAKK1N0aWxsIG5vdCBhcyBmYXN0IGFzIHdlJ2QgbGlrZS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9janBlZy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NqcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhOTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9janBlZy5jCkBAIC0wLDAgKzEsNjA2IEBACisvKgorICogY2pwZWcuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgY29tbWFuZC1saW5lIHVzZXIgaW50ZXJmYWNlIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgorICogSXQgc2hvdWxkIHdvcmsgb24gYW55IHN5c3RlbSB3aXRoIFVuaXgtIG9yIE1TLURPUy1zdHlsZSBjb21tYW5kIGxpbmVzLgorICoKKyAqIFR3byBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIHN0eWxlcyBhcmUgcGVybWl0dGVkLCBkZXBlbmRpbmcgb24gdGhlCisgKiBjb21waWxlLXRpbWUgc3dpdGNoIFRXT19GSUxFX0NPTU1BTkRMSU5FOgorICoJY2pwZWcgW29wdGlvbnNdICBpbnB1dGZpbGUgb3V0cHV0ZmlsZQorICoJY2pwZWcgW29wdGlvbnNdICBbaW5wdXRmaWxlXQorICogSW4gdGhlIHNlY29uZCBzdHlsZSwgb3V0cHV0IGlzIGFsd2F5cyB0byBzdGFuZGFyZCBvdXRwdXQsIHdoaWNoIHlvdSdkCisgKiBub3JtYWxseSByZWRpcmVjdCB0byBhIGZpbGUgb3IgcGlwZSB0byBzb21lIG90aGVyIHByb2dyYW0uICBJbnB1dCBpcworICogZWl0aGVyIGZyb20gYSBuYW1lZCBmaWxlIG9yIGZyb20gc3RhbmRhcmQgaW5wdXQgKHR5cGljYWxseSByZWRpcmVjdGVkKS4KKyAqIFRoZSBzZWNvbmQgc3R5bGUgaXMgY29udmVuaWVudCBvbiBVbml4IGJ1dCBpcyB1bmhlbHBmdWwgb24gc3lzdGVtcyB0aGF0CisgKiBkb24ndCBzdXBwb3J0IHBpcGVzLiAgQWxzbywgeW91IE1VU1QgdXNlIHRoZSBmaXJzdCBzdHlsZSBpZiB5b3VyIHN5c3RlbQorICogZG9lc24ndCBkbyBiaW5hcnkgSS9PIHRvIHN0ZGluL3N0ZG91dC4KKyAqIFRvIHNpbXBsaWZ5IHNjcmlwdCB3cml0aW5nLCB0aGUgIi1vdXRmaWxlIiBzd2l0Y2ggaXMgcHJvdmlkZWQuICBUaGUgc3ludGF4CisgKgljanBlZyBbb3B0aW9uc10gIC1vdXRmaWxlIG91dHB1dGZpbGUgIGlucHV0ZmlsZQorICogd29ya3MgcmVnYXJkbGVzcyBvZiB3aGljaCBjb21tYW5kIGxpbmUgc3R5bGUgaXMgdXNlZC4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImNkZXJyb3IuaCIKKyAgTlVMTAorfTsKKworCisvKgorICogVGhpcyByb3V0aW5lIGRldGVybWluZXMgd2hhdCBmb3JtYXQgdGhlIGlucHV0IGZpbGUgaXMsCisgKiBhbmQgc2VsZWN0cyB0aGUgYXBwcm9wcmlhdGUgaW5wdXQtcmVhZGluZyBtb2R1bGUuCisgKgorICogVG8gZGV0ZXJtaW5lIHdoaWNoIGZhbWlseSBvZiBpbnB1dCBmb3JtYXRzIHRoZSBmaWxlIGJlbG9uZ3MgdG8sCisgKiB3ZSBtYXkgbG9vayBvbmx5IGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlLCBzaW5jZSBDIGRvZXMgbm90CisgKiBndWFyYW50ZWUgdGhhdCBtb3JlIHRoYW4gb25lIGNoYXJhY3RlciBjYW4gYmUgcHVzaGVkIGJhY2sgd2l0aCB1bmdldGMuCisgKiBMb29raW5nIGF0IGFkZGl0aW9uYWwgYnl0ZXMgd291bGQgcmVxdWlyZSBvbmUgb2YgdGhlc2UgYXBwcm9hY2hlczoKKyAqICAgICAxKSBhc3N1bWUgd2UgY2FuIGZzZWVrKCkgdGhlIGlucHV0IGZpbGUgKGZhaWxzIGZvciBwaXBlZCBpbnB1dCk7CisgKiAgICAgMikgYXNzdW1lIHdlIGNhbiBwdXNoIGJhY2sgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgKHdvcmtzIGluCisgKiAgICAgICAgc29tZSBDIGltcGxlbWVudGF0aW9ucywgYnV0IHVucG9ydGFibGUpOworICogICAgIDMpIHByb3ZpZGUgb3VyIG93biBidWZmZXJpbmcgKGJyZWFrcyBpbnB1dCByZWFkZXJzIHRoYXQgd2FudCB0byB1c2UKKyAqICAgICAgICBzdGRpbyBkaXJlY3RseSwgc3VjaCBhcyB0aGUgUkxFIGxpYnJhcnkpOworICogb3IgIDQpIGRvbid0IHB1dCBiYWNrIHRoZSBkYXRhLCBhbmQgbW9kaWZ5IHRoZSBpbnB1dF9pbml0IG1ldGhvZHMgdG8gYXNzdW1lCisgKiAgICAgICAgdGhleSBzdGFydCByZWFkaW5nIGFmdGVyIHRoZSBzdGFydCBvZiBmaWxlIChhbHNvIGJyZWFrcyBSTEUgbGlicmFyeSkuCisgKiAjMSBpcyBhdHRyYWN0aXZlIGZvciBNUy1ET1MgYnV0IGlzIHVudGVuYWJsZSBvbiBVbml4LgorICoKKyAqIFRoZSBtb3N0IHBvcnRhYmxlIHNvbHV0aW9uIGZvciBmaWxlIHR5cGVzIHRoYXQgY2FuJ3QgYmUgaWRlbnRpZmllZCBieSB0aGVpcgorICogZmlyc3QgYnl0ZSBpcyB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgd2hhdCB0aGV5IGFyZS4gIFRoaXMgaXMgYWxzbyB0aGUKKyAqIG9ubHkgYXBwcm9hY2ggZm9yICJyYXciIGZpbGUgdHlwZXMgdGhhdCBjb250YWluIG9ubHkgYXJiaXRyYXJ5IHZhbHVlcy4KKyAqIFdlIHByZXNlbnRseSBhcHBseSB0aGlzIG1ldGhvZCBmb3IgVGFyZ2EgZmlsZXMuICBNb3N0IG9mIHRoZSB0aW1lIFRhcmdhCisgKiBmaWxlcyBzdGFydCB3aXRoIDB4MDAsIHNvIHdlIHJlY29nbml6ZSB0aGF0IGNhc2UuICBQb3RlbnRpYWxseSwgaG93ZXZlciwKKyAqIGEgVGFyZ2EgZmlsZSBjb3VsZCBzdGFydCB3aXRoIGFueSBieXRlIHZhbHVlIChieXRlIDAgaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIHNlbGRvbS11c2VkIElEIGZpZWxkKSwgc28gd2UgcHJvdmlkZSBhIHN3aXRjaCB0byBmb3JjZSBUYXJnYSBpbnB1dCBtb2RlLgorICovCisKK3N0YXRpYyBib29sZWFuIGlzX3RhcmdhOwkvKiByZWNvcmRzIHVzZXIgLXRhcmdhIHN3aXRjaCAqLworCisKK0xPQ0FMKGNqcGVnX3NvdXJjZV9wdHIpCitzZWxlY3RfZmlsZV90eXBlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgaW50IGM7CisKKyAgaWYgKGlzX3RhcmdhKSB7CisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgICAgcmV0dXJuIGppbml0X3JlYWRfdGFyZ2EoY2luZm8pOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9OT1RDT01QKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKChjID0gZ2V0YyhpbmZpbGUpKSA9PSBFT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FTVBUWSk7CisgIGlmICh1bmdldGMoYywgaW5maWxlKSA9PSBFT0YpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9VTkdFVENfRkFJTEVEKTsKKworICBzd2l0Y2ggKGMpIHsKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisgIGNhc2UgJ0InOgorICAgIHJldHVybiBqaW5pdF9yZWFkX2JtcChjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisgIGNhc2UgJ0cnOgorICAgIHJldHVybiBqaW5pdF9yZWFkX2dpZihjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisgIGNhc2UgJ1AnOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3BwbShjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGNhc2UgJ1InOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3JsZShjaW5mbyk7CisjZW5kaWYKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKyAgY2FzZSAweDAwOgorICAgIHJldHVybiBqaW5pdF9yZWFkX3RhcmdhKGNpbmZvKTsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVU5LTk9XTl9GT1JNQVQpOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIE5VTEw7CQkJLyogc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZ3MgKi8KK30KKworCisvKgorICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgorICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQorICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKKyAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KKyAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLworCisKK0xPQ0FMKHZvaWQpCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7CisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7CisjZWxzZQorICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1xdWFsaXR5IE4gICAgIENvbXByZXNzaW9uIHF1YWxpdHkgKDAuLjEwMDsgNS05NSBpcyB1c2VmdWwgcmFuZ2UpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ncmF5c2NhbGUgICAgIENyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZVxuIik7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtb3B0aW1pemUgICAgICBPcHRpbWl6ZSBIdWZmbWFuIHRhYmxlIChzbWFsbGVyIGZpbGUsIGJ1dCBzbG93IGNvbXByZXNzaW9uKVxuIik7CisjZW5kaWYKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXByb2dyZXNzaXZlICAgQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZVxuIik7CisjZW5kaWYKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC10YXJnYSAgICAgICAgIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0ICh1c3VhbGx5IG5vdCBuZWVkZWQpXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kY3QgaW50ICAgICAgIFVzZSBpbnRlZ2VyIERDVCBtZXRob2Qlc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JU0xPVyA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZhc3QgICAgICBVc2UgZmFzdCBpbnRlZ2VyIERDVCAobGVzcyBhY2N1cmF0ZSklc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9JRkFTVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGZsb2F0ICAgICBVc2UgZmxvYXRpbmctcG9pbnQgRENUIG1ldGhvZCVzXG4iLAorCSAgKEpEQ1RfREVGQVVMVCA9PSBKRENUX0ZMT0FUID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNtb290aCBOICAgICAgU21vb3RoIGRpdGhlcmVkIGlucHV0IChOPTEuLjEwMCBpcyBzdHJlbmd0aClcbiIpOworI2VuZGlmCisgIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWJhc2VsaW5lICAgICAgRm9yY2UgYmFzZWxpbmUgcXVhbnRpemF0aW9uIHRhYmxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcXRhYmxlcyBmaWxlICBVc2UgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1xc2xvdHMgTlssLi4uXSAgICBTZXQgY29tcG9uZW50IHF1YW50aXphdGlvbiB0YWJsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNhbXBsZSBIeFZbLC4uLl0gIFNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9yc1xuIik7CisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtc2NhbnMgZmlsZSAgICBDcmVhdGUgbXVsdGktc2NhbiBKUEVHIHBlciBzY3JpcHQgZmlsZVxuIik7CisjZW5kaWYKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKK0xPQ0FMKGludCkKK3BhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGludCBxdWFsaXR5OwkJCS8qIC1xdWFsaXR5IHBhcmFtZXRlciAqLworICBpbnQgcV9zY2FsZV9mYWN0b3I7CQkvKiBzY2FsaW5nIHBlcmNlbnRhZ2UgZm9yIC1xdGFibGVzICovCisgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmU7CisgIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOworICBjaGFyICogcXRhYmxlZmlsZSA9IE5VTEw7CS8qIHNhdmVzIC1xdGFibGVzIGZpbGVuYW1lIGlmIGFueSAqLworICBjaGFyICogcXNsb3RzYXJnID0gTlVMTDsJLyogc2F2ZXMgLXFzbG90cyBwYXJtIGlmIGFueSAqLworICBjaGFyICogc2FtcGxlYXJnID0gTlVMTDsJLyogc2F2ZXMgLXNhbXBsZSBwYXJtIGlmIGFueSAqLworICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KKworICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCisgIC8qIE5vdGUgdGhhdCBkZWZhdWx0IC1xdWFsaXR5IGxldmVsIG5lZWQgbm90LCBhbmQgZG9lcyBub3QsCisgICAqIG1hdGNoIHRoZSBkZWZhdWx0IHNjYWxpbmcgZm9yIGFuIGV4cGxpY2l0IC1xdGFibGVzIGFyZ3VtZW50LgorICAgKi8KKyAgcXVhbGl0eSA9IDc1OwkJCS8qIGRlZmF1bHQgLXF1YWxpdHkgdmFsdWUgKi8KKyAgcV9zY2FsZV9mYWN0b3IgPSAxMDA7CQkvKiBkZWZhdWx0IHRvIG5vIHNjYWxpbmcgZm9yIC1xdGFibGVzICovCisgIGZvcmNlX2Jhc2VsaW5lID0gRkFMU0U7CS8qIGJ5IGRlZmF1bHQsIGFsbG93IDE2LWJpdCBxdWFudGl6ZXJzICovCisgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOworICBpc190YXJnYSA9IEZBTFNFOworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLworCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmICgqYXJnICE9ICctJykgeworICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCisgICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKKwlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLworCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KKyAgICB9CisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCisKKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYXJpdGhtZXRpYyIsIDEpKSB7CisgICAgICAvKiBVc2UgYXJpdGhtZXRpYyBjb2RpbmcuICovCisjaWZkZWYgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVECisgICAgICBjaW5mby0+YXJpdGhfY29kZSA9IFRSVUU7CisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGFyaXRobWV0aWMgY29kaW5nIG5vdCBzdXBwb3J0ZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImJhc2VsaW5lIiwgMSkpIHsKKyAgICAgIC8qIEZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgb3V0cHV0ICg4LWJpdCBxdWFudGl6ZXIgdmFsdWVzKS4gKi8KKyAgICAgIGZvcmNlX2Jhc2VsaW5lID0gVFJVRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGN0IiwgMikpIHsKKyAgICAgIC8qIFNlbGVjdCBEQ1QgYWxnb3JpdGhtLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgeworICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KKyAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCisgICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKKworICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7CisJZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgQ0pQRUcsIHZlcnNpb24gJXNcbiVzXG4iLAorCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7CisJcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDIpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMikpIHsKKyAgICAgIC8qIEZvcmNlIGEgbW9ub2Nocm9tZSBKUEVHIGZpbGUgdG8gYmUgZ2VuZXJhdGVkLiAqLworICAgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0dSQVlTQ0FMRSk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7CisgICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLworICAgICAgbG9uZyBsdmFsOworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCWx2YWwgKj0gMTAwMEw7CisgICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3B0aW1pemUiLCAxKSB8fCBrZXltYXRjaChhcmcsICJvcHRpbWlzZSIsIDEpKSB7CisgICAgICAvKiBFbmFibGUgZW50cm9weSBwYXJtIG9wdGltaXphdGlvbi4gKi8KKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBlbnRyb3B5IG9wdGltaXphdGlvbiB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvdXRmaWxlIiwgNCkpIHsKKyAgICAgIC8qIFNldCBvdXRwdXQgZmlsZSBuYW1lLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgb3V0ZmlsZW5hbWUgPSBhcmd2W2FyZ25dOwkvKiBzYXZlIGl0IGF3YXkgZm9yIGxhdGVyIHVzZSAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJwcm9ncmVzc2l2ZSIsIDEpKSB7CisgICAgICAvKiBTZWxlY3Qgc2ltcGxlIHByb2dyZXNzaXZlIG1vZGUuICovCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IFRSVUU7CisgICAgICAvKiBXZSBtdXN0IHBvc3Rwb25lIGV4ZWN1dGlvbiB1bnRpbCBudW1fY29tcG9uZW50cyBpcyBrbm93bi4gKi8KKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgcHJvZ3Jlc3NpdmUgb3V0cHV0IHdhcyBub3QgY29tcGlsZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInF1YWxpdHkiLCAxKSkgeworICAgICAgLyogUXVhbGl0eSBmYWN0b3IgKHF1YW50aXphdGlvbiB0YWJsZSBzY2FsaW5nIGZhY3RvcikuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZxdWFsaXR5KSAhPSAxKQorCXVzYWdlKCk7CisgICAgICAvKiBDaGFuZ2Ugc2NhbGUgZmFjdG9yIGluIGNhc2UgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KKyAgICAgIHFfc2NhbGVfZmFjdG9yID0ganBlZ19xdWFsaXR5X3NjYWxpbmcocXVhbGl0eSk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInFzbG90cyIsIDIpKSB7CisgICAgICAvKiBRdWFudGl6YXRpb24gdGFibGUgc2xvdCBudW1iZXJzLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgcXNsb3RzYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBxc2xvdHMgdW50aWwgYWZ0ZXIgd2UgaGF2ZSBwcm9jZXNzZWQgYW55CisgICAgICAgKiBjb2xvcnNwYWNlLWRldGVybWluaW5nIHN3aXRjaGVzLCBzaW5jZSBqcGVnX3NldF9jb2xvcnNwYWNlIHNldHMKKyAgICAgICAqIGRlZmF1bHQgcXVhbnQgdGFibGUgbnVtYmVycy4KKyAgICAgICAqLworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJxdGFibGVzIiwgMikpIHsKKyAgICAgIC8qIFF1YW50aXphdGlvbiB0YWJsZXMgZmV0Y2hlZCBmcm9tIGZpbGUuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBxdGFibGVmaWxlID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIHBvc3Rwb25lIGFjdHVhbGx5IHJlYWRpbmcgdGhlIGZpbGUgaW4gY2FzZSAtcXVhbGl0eSBjb21lcyBsYXRlci4gKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7CisgICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKwljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLworICAgICAgfSBlbHNlIHsKKwljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKKwkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2FtcGxlIiwgMikpIHsKKyAgICAgIC8qIFNldCBzYW1wbGluZyBmYWN0b3JzLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgc2FtcGxlYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIE11c3QgZGVsYXkgc2V0dGluZyBzYW1wbGUgZmFjdG9ycyB1bnRpbCBhZnRlciB3ZSBoYXZlIHByb2Nlc3NlZCBhbnkKKyAgICAgICAqIGNvbG9yc3BhY2UtZGV0ZXJtaW5pbmcgc3dpdGNoZXMsIHNpbmNlIGpwZWdfc2V0X2NvbG9yc3BhY2Ugc2V0cworICAgICAgICogZGVmYXVsdCBzYW1wbGluZyBmYWN0b3JzLgorICAgICAgICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMikpIHsKKyAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJzbW9vdGgiLCAyKSkgeworICAgICAgLyogU2V0IGlucHV0IHNtb290aGluZyBmYWN0b3IuICovCisgICAgICBpbnQgdmFsOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlZCIsICZ2YWwpICE9IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDEwMCkKKwl1c2FnZSgpOworICAgICAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSB2YWw7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKKyAgICAgIC8qIElucHV0IGZpbGUgaXMgVGFyZ2EgZm9ybWF0LiAqLworICAgICAgaXNfdGFyZ2EgPSBUUlVFOworCisgICAgfSBlbHNlIHsKKyAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCisgICAgfQorICB9CisKKyAgLyogUG9zdC1zd2l0Y2gtc2Nhbm5pbmcgY2xlYW51cCAqLworCisgIGlmIChmb3JfcmVhbCkgeworCisgICAgLyogU2V0IHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHNlbGVjdGVkIHF1YWxpdHkuICovCisgICAgLyogU29tZSBvciBhbGwgbWF5IGJlIG92ZXJyaWRkZW4gaWYgLXF0YWJsZXMgaXMgcHJlc2VudC4gKi8KKyAgICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCBxdWFsaXR5LCBmb3JjZV9iYXNlbGluZSk7CisKKyAgICBpZiAocXRhYmxlZmlsZSAhPSBOVUxMKQkvKiBwcm9jZXNzIC1xdGFibGVzIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3F1YW50X3RhYmxlcyhjaW5mbywgcXRhYmxlZmlsZSwKKwkJCSAgICAgIHFfc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSkpCisJdXNhZ2UoKTsKKworICAgIGlmIChxc2xvdHNhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtcXNsb3RzIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISBzZXRfcXVhbnRfc2xvdHMoY2luZm8sIHFzbG90c2FyZykpCisJdXNhZ2UoKTsKKworICAgIGlmIChzYW1wbGVhcmcgIT0gTlVMTCkJLyogcHJvY2VzcyAtc2FtcGxlIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISBzZXRfc2FtcGxlX2ZhY3RvcnMoY2luZm8sIHNhbXBsZWFyZykpCisJdXNhZ2UoKTsKKworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KKyAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKKyNlbmRpZgorCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCisJdXNhZ2UoKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIHN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHByb2dyZXNzOworI2VuZGlmCisgIGludCBmaWxlX2luZGV4OworICBjanBlZ19zb3VyY2VfcHRyIHNyY19tZ3I7CisgIEZJTEUgKiBpbnB1dF9maWxlOworICBGSUxFICogb3V0cHV0X2ZpbGU7CisgIEpESU1FTlNJT04gbnVtX3NjYW5saW5lczsKKworICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLworI2lmZGVmIFVTRV9DQ09NTUFORAorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworI2VuZGlmCisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQorICAgIHByb2duYW1lID0gImNqcGVnIjsJCS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KKyAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmY2luZm8pOworICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCisgIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOworICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOworICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIEluaXRpYWxpemUgSlBFRyBwYXJhbWV0ZXJzLgorICAgKiBNdWNoIG9mIHRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIuCisgICAqIEluIHBhcnRpY3VsYXIsIHdlIGRvbid0IHlldCBrbm93IHRoZSBpbnB1dCBmaWxlJ3MgY29sb3Igc3BhY2UsCisgICAqIGJ1dCB3ZSBuZWVkIHRvIHByb3ZpZGUgc29tZSB2YWx1ZSBmb3IganBlZ19zZXRfZGVmYXVsdHMoKSB0byB3b3JrLgorICAgKi8KKworICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IC8qIGFyYml0cmFyeSBndWVzcyAqLworICBqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KKyAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKKyAgICogdGhlIGlucHV0IGZpbGUuCisgICAqLworCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmY2luZm8sIGFyZ2MsIGFyZ3YsIDAsIEZBTFNFKTsKKworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIC8qIE11c3QgaGF2ZSBlaXRoZXIgLW91dGZpbGUgc3dpdGNoIG9yIGV4cGxpY2l0IG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgaWYgKG91dGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTIpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbZmlsZV9pbmRleCsxXTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoZmlsZV9pbmRleCAhPSBhcmdjLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG11c3QgbmFtZSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgZmlsZVxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgfQorI2Vsc2UKKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisjZW5kaWYgLyogVFdPX0ZJTEVfQ09NTUFORExJTkUgKi8KKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICBpZiAoZmlsZV9pbmRleCA8IGFyZ2MpIHsKKyAgICBpZiAoKGlucHV0X2ZpbGUgPSBmb3Blbihhcmd2W2ZpbGVfaW5kZXhdLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2ZpbGVfaW5kZXhdKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisgICAgaW5wdXRfZmlsZSA9IHJlYWRfc3RkaW4oKTsKKyAgfQorCisgIC8qIE9wZW4gdGhlIG91dHB1dCBmaWxlLiAqLworICBpZiAob3V0ZmlsZW5hbWUgIT0gTlVMTCkgeworICAgIGlmICgob3V0cHV0X2ZpbGUgPSBmb3BlbihvdXRmaWxlbmFtZSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIG91dGZpbGVuYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBvdXRwdXQgZmlsZSBpcyBzdGRvdXQgKi8KKyAgICBvdXRwdXRfZmlsZSA9IHdyaXRlX3N0ZG91dCgpOworICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcigoal9jb21tb25fcHRyKSAmY2luZm8sICZwcm9ncmVzcyk7CisjZW5kaWYKKworICAvKiBGaWd1cmUgb3V0IHRoZSBpbnB1dCBmaWxlIGZvcm1hdCwgYW5kIHNldCB1cCB0byByZWFkIGl0LiAqLworICBzcmNfbWdyID0gc2VsZWN0X2ZpbGVfdHlwZSgmY2luZm8sIGlucHV0X2ZpbGUpOworICBzcmNfbWdyLT5pbnB1dF9maWxlID0gaW5wdXRfZmlsZTsKKworICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlIGhlYWRlciB0byBvYnRhaW4gZmlsZSBzaXplICYgY29sb3JzcGFjZS4gKi8KKyAgKCpzcmNfbWdyLT5zdGFydF9pbnB1dCkgKCZjaW5mbywgc3JjX21ncik7CisKKyAgLyogTm93IHRoYXQgd2Uga25vdyBpbnB1dCBjb2xvcnNwYWNlLCBmaXggY29sb3JzcGFjZS1kZXBlbmRlbnQgZGVmYXVsdHMgKi8KKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoJmNpbmZvKTsKKworICAvKiBBZGp1c3QgZGVmYXVsdCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJ5IHJlLXBhcnNpbmcgdGhlIG9wdGlvbnMgKi8KKyAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7CisKKyAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRwdXRfZmlsZSk7CisKKyAgLyogU3RhcnQgY29tcHJlc3NvciAqLworICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKKyAgLyogUHJvY2VzcyBkYXRhICovCisgIHdoaWxlIChjaW5mby5uZXh0X3NjYW5saW5lIDwgY2luZm8uaW1hZ2VfaGVpZ2h0KSB7CisgICAgbnVtX3NjYW5saW5lcyA9ICgqc3JjX21nci0+Z2V0X3BpeGVsX3Jvd3MpICgmY2luZm8sIHNyY19tZ3IpOworICAgICh2b2lkKSBqcGVnX3dyaXRlX3NjYW5saW5lcygmY2luZm8sIHNyY19tZ3ItPmJ1ZmZlciwgbnVtX3NjYW5saW5lcyk7CisgIH0KKworICAvKiBGaW5pc2ggY29tcHJlc3Npb24gYW5kIHJlbGVhc2UgbWVtb3J5ICovCisgICgqc3JjX21nci0+ZmluaXNoX2lucHV0KSAoJmNpbmZvLCBzcmNfbWdyKTsKKyAganBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCisgIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKKyAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NrY29uZmlnLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY2tjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGJhZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NrY29uZmlnLmMKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBja2NvbmZpZy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGludGVuZGVkIHRvIGhlbHAgeW91IGRldGVybWluZSBob3cgdG8gY29uZmlndXJlIHRoZSBKUEVHCisgKiBzb2Z0d2FyZSBmb3IgaW5zdGFsbGF0aW9uIG9uIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGUgaWRlYSBpcyB0byB0cnkgdG8KKyAqIGNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhpcyBwcm9ncmFtLiAgSWYgeW91ciBjb21waWxlciBmYWlscyB0byBjb21waWxlIHRoZQorICogcHJvZ3JhbSwgbWFrZSBjaGFuZ2VzIGFzIGluZGljYXRlZCBpbiB0aGUgY29tbWVudHMgYmVsb3cuICBPbmNlIHlvdSBjYW4KKyAqIGNvbXBpbGUgdGhlIHByb2dyYW0sIHJ1biBpdCwgYW5kIGl0IHdpbGwgcHJvZHVjZSBhICJqY29uZmlnLmgiIGZpbGUgZm9yCisgKiB5b3VyIHN5c3RlbS4KKyAqCisgKiBBcyBhIGdlbmVyYWwgcnVsZSwgZWFjaCB0aW1lIHlvdSB0cnkgdG8gY29tcGlsZSB0aGlzIHByb2dyYW0sCisgKiBwYXkgYXR0ZW50aW9uIG9ubHkgdG8gdGhlICpmaXJzdCogZXJyb3IgbWVzc2FnZSB5b3UgZ2V0IGZyb20gdGhlIGNvbXBpbGVyLgorICogTWFueSBDIGNvbXBpbGVycyB3aWxsIGlzc3VlIGxvdHMgb2Ygc3B1cmlvdXMgZXJyb3IgbWVzc2FnZXMgb25jZSB0aGV5CisgKiBoYXZlIGdvdHRlbiBjb25mdXNlZC4gIEdvIHRvIHRoZSBsaW5lIGluZGljYXRlZCBpbiB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSwKKyAqIGFuZCByZWFkIHRoZSBjb21tZW50cyBwcmVjZWRpbmcgdGhhdCBsaW5lIHRvIHNlZSB3aGF0IHRvIGNoYW5nZS4KKyAqCisgKiBBbG1vc3QgYWxsIG9mIHRoZSBlZGl0cyB5b3UgbWF5IG5lZWQgdG8gbWFrZSB0byB0aGlzIHByb2dyYW0gY29uc2lzdCBvZgorICogY2hhbmdpbmcgYSBsaW5lIHRoYXQgcmVhZHMgIiNkZWZpbmUgU09NRV9TWU1CT0wiIHRvICIjdW5kZWYgU09NRV9TWU1CT0wiLAorICogb3IgdmljZSB2ZXJzYS4gIFRoaXMgaXMgY2FsbGVkIGRlZmluaW5nIG9yIHVuZGVmaW5pbmcgdGhhdCBzeW1ib2wuCisgKi8KKworCisvKiBGaXJzdCB3ZSBtdXN0IHNlZSBpZiB5b3VyIHN5c3RlbSBoYXMgdGhlIGluY2x1ZGUgZmlsZXMgd2UgbmVlZC4KKyAqIFdlIHN0YXJ0IG91dCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91ciBzeXN0ZW0gaGFzIGFsbCB0aGUgQU5TSS1zdGFuZGFyZAorICogaW5jbHVkZSBmaWxlcy4gIElmIHlvdSBnZXQgYW55IGVycm9yIHRyeWluZyB0byBpbmNsdWRlIG9uZSBvZiB0aGVzZSBmaWxlcywKKyAqIHVuZGVmaW5lIHRoZSBjb3JyZXNwb25kaW5nIEhBVkVfeHh4IHN5bWJvbC4KKyAqLworCisjZGVmaW5lIEhBVkVfU1REREVGX0gJCS8qIHJlcGxhY2UgJ2RlZmluZScgYnkgJ3VuZGVmJyBpZiBlcnJvciBoZXJlICovCisjaWZkZWYgSEFWRV9TVERERUZfSAkJLyogbmV4dCBsaW5lIHdpbGwgYmUgc2tpcHBlZCBpZiB5b3UgdW5kZWYuLi4gKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNlbmRpZgorCisjZGVmaW5lIEhBVkVfU1RETElCX0gJCS8qIHNhbWUgdGhpbmcgZm9yIHN0ZGxpYi5oICovCisjaWZkZWYgSEFWRV9TVERMSUJfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgkJLyogSWYgeW91IGFpbid0IGdvdCB0aGlzLCB5b3UgYWluJ3QgZ290IEMuICovCisKKy8qIFdlIGhhdmUgdG8gc2VlIGlmIHlvdXIgc3RyaW5nIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBieQorICogc3RyaW5ncy5oIChvbGQgQlNEIGNvbnZlbnRpb24pIG9yIHN0cmluZy5oIChldmVyeWJvZHkgZWxzZSkuCisgKiBXZSB0cnkgdGhlIG5vbi1CU0QgY29udmVudGlvbiBmaXJzdDsgZGVmaW5lIE5FRURfQlNEX1NUUklOR1MKKyAqIGlmIHRoZSBjb21waWxlciBzYXlzIGl0IGNhbid0IGZpbmQgc3RyaW5nLmguCisgKi8KKworI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKworI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKy8qIE9uIHNvbWUgc3lzdGVtcyAoZXNwZWNpYWxseSBvbGRlciBVbml4IG1hY2hpbmVzKSwgdHlwZSBzaXplX3QgaXMKKyAqIGRlZmluZWQgb25seSBpbiB0aGUgaW5jbHVkZSBmaWxlIDxzeXMvdHlwZXMuaD4uICBJZiB5b3UgZ2V0IGEgZmFpbHVyZQorICogb24gdGhlIHNpemVfdCB0ZXN0IGJlbG93LCB0cnkgZGVmaW5pbmcgTkVFRF9TWVNfVFlQRVNfSC4KKyAqLworCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAkJLyogc3RhcnQgYnkgYXNzdW1pbmcgd2UgZG9uJ3QgbmVlZCBpdCAqLworI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisKKy8qIFVzdWFsbHkgdHlwZSBzaXplX3QgaXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlIGluY2x1ZGUgZmlsZXMgd2UndmUgaW5jbHVkZWQKKyAqIGFib3ZlLiAgSWYgbm90LCB5b3UnbGwgZ2V0IGFuIGVycm9yIG9uIHRoZSAidHlwZWRlZiBzaXplX3QgbXlfc2l6ZV90OyIgbGluZS4KKyAqIEluIHRoYXQgY2FzZSwgZmlyc3QgdHJ5IGRlZmluaW5nIE5FRURfU1lTX1RZUEVTX0gganVzdCBhYm92ZS4KKyAqIElmIHRoYXQgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBzZWFyY2ggdGhyb3VnaCB5b3VyIHN5c3RlbSBsaWJyYXJ5CisgKiB0byBmaWd1cmUgb3V0IHdoaWNoIGluY2x1ZGUgZmlsZSBkZWZpbmVzICJzaXplX3QiLiAgTG9vayBmb3IgYSBsaW5lIHRoYXQKKyAqIHNheXMgInR5cGVkZWYgc29tZXRoaW5nLW9yLW90aGVyIHNpemVfdDsiLiAgVGhlbiwgY2hhbmdlIHRoZSBsaW5lIGJlbG93CisgKiB0aGF0IHNheXMgIiNpbmNsdWRlIDxzb21laW5jbHVkZWZpbGUuaD4iIHRvIGluc3RlYWQgaW5jbHVkZSB0aGUgZmlsZQorICogeW91IGZvdW5kIHNpemVfdCBpbiwgYW5kIGRlZmluZSBORUVEX1NQRUNJQUxfSU5DTFVERS4gIElmIHlvdSBjYW4ndCBmaW5kCisgKiB0eXBlIHNpemVfdCBhbnl3aGVyZSwgdHJ5IHJlcGxhY2luZyAiI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPiIgd2l0aAorICogInR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsiLgorICovCisKKyN1bmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQkvKiBhc3N1bWUgd2UgRE9OJ1QgbmVlZCBpdCwgZm9yIHN0YXJ0ZXJzICovCisKKyNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQorI2luY2x1ZGUgPHNvbWVpbmNsdWRlZmlsZS5oPgorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90IG15X3NpemVfdDsJLyogVGhlIHBheW9mZjogZG8gd2UgaGF2ZSBzaXplX3Qgbm93PyAqLworCisKKy8qIFRoZSBuZXh0IHF1ZXN0aW9uIGlzIHdoZXRoZXIgeW91ciBjb21waWxlciBzdXBwb3J0cyBBTlNJLXN0eWxlIGZ1bmN0aW9uCisgKiBwcm90b3R5cGVzLiAgWW91IG5lZWQgdG8ga25vdyB0aGlzIGluIG9yZGVyIHRvIGNob29zZSBiZXR3ZWVuIHVzaW5nCisgKiBtYWtlZmlsZS5hbnNpIGFuZCB1c2luZyBtYWtlZmlsZS51bml4LgorICogVGhlICNkZWZpbmUgbGluZSBiZWxvdyBpcyBzZXQgdG8gYXNzdW1lIHlvdSBoYXZlIEFOU0kgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3IgaW4gdGhpcyBncm91cCBvZiBsaW5lcywgdW5kZWZpbmUgSEFWRV9QUk9UT1RZUEVTLgorICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCB0ZXN0ZnVuY3Rpb24gKGludCBhcmcxLCBpbnQgKiBhcmcyKTsgLyogY2hlY2sgcHJvdG90eXBlcyAqLworCitzdHJ1Y3QgbWV0aG9kc19zdHJ1Y3QgewkJLyogY2hlY2sgbWV0aG9kLXBvaW50ZXIgZGVjbGFyYXRpb25zICovCisgIGludCAoKmVycm9yX2V4aXQpIChjaGFyICptc2d0ZXh0KTsKKyAgaW50ICgqdHJhY2VfbWVzc2FnZSkgKGNoYXIgKm1zZ3RleHQpOworICBpbnQgKCphbm90aGVyX21ldGhvZCkgKHZvaWQpOworfTsKKworaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpIC8qIGNoZWNrIGRlZmluaXRpb25zICovCit7CisgIHJldHVybiBhcmcyW2FyZzFdOworfQorCitpbnQgdGVzdDJmdW5jdGlvbiAodm9pZCkJLyogY2hlY2sgdm9pZCBhcmcgbGlzdCAqLworeworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgY2hhciIgbWVhbnMuCisgKiBJZiB5b3UgZ2V0IGFuIGVycm9yIG9uIHRoZSAidW5zaWduZWQgY2hhciB1bl9jaGFyOyIgbGluZSwKKyAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSLgorICovCisKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3Vuc2lnbmVkIGNoYXIgdW5fY2hhcjsKKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAidW5zaWduZWQgc2hvcnQiIG1lYW5zLgorICogSWYgeW91IGdldCBhbiBlcnJvciBvbiB0aGUgInVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyIgbGluZSwKKyAqIHRoZW4gdW5kZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVC4KKyAqLworCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKworI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKK3Vuc2lnbmVkIHNob3J0IHVuX3Nob3J0OworI2VuZGlmCisKKworLyogTm93IHdlIHdhbnQgdG8gZmluZCBvdXQgaWYgeW91ciBjb21waWxlciB1bmRlcnN0YW5kcyB0eXBlICJ2b2lkIi4KKyAqIElmIHlvdSBnZXQgYW4gZXJyb3IgYW55d2hlcmUgaW4gaGVyZSwgdW5kZWZpbmUgSEFWRV9WT0lELgorICovCisKKyNkZWZpbmUgSEFWRV9WT0lECisKKyNpZmRlZiBIQVZFX1ZPSUQKKy8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIGNvbXBsZXRlIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKKyNlbHNlCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCit2b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQorI2Vsc2UKK3ZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKKyAgICAgdm9pZF9wdHIgYXJnMTsKKyAgICAgdm9pZF9mdW5jIGFyZzI7CisjZW5kaWYKK3sKKyAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCisgIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7CisgICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KK30KKyNlbmRpZgorCisKKy8qIE5vdyB3ZSB3YW50IHRvIGZpbmQgb3V0IGlmIHlvdXIgY29tcGlsZXIga25vd3Mgd2hhdCAiY29uc3QiIG1lYW5zLgorICogSWYgeW91IGdldCBhbiBlcnJvciBoZXJlLCB1bmRlZmluZSBIQVZFX0NPTlNULgorICovCisKKyNkZWZpbmUgSEFWRV9DT05TVAorCisjaWZkZWYgSEFWRV9DT05TVAorc3RhdGljIGNvbnN0IGludCBjYXJyYXlbM10gPSB7MSwgMiwgM307CisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCB0ZXN0NGZ1bmN0aW9uIChjb25zdCBpbnQgYXJnMSkKKyNlbHNlCitpbnQgdGVzdDRmdW5jdGlvbiAoYXJnMSkKKyAgICAgY29uc3QgaW50IGFyZzE7CisjZW5kaWYKK3sKKyAgcmV0dXJuIGNhcnJheVthcmcxXTsKK30KKyNlbmRpZgorCisKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3Igb3Igd2FybmluZyBhYm91dCB0aGlzIHN0cnVjdHVyZSBkZWZpbml0aW9uLAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLgorICovCisKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCit0eXBlZGVmIHN0cnVjdCB1bmRlZmluZWRfc3RydWN0dXJlICogdW5kZWZfc3RydWN0X3B0cjsKKyNlbmRpZgorCisKKy8qIElmIHlvdSBnZXQgYW4gZXJyb3IgYWJvdXQgZHVwbGljYXRlIG5hbWVzLAorICogZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMuCisgKi8KKworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKworI2lmbmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKK2ludCBwb3NzaWJseV9kdXBsaWNhdGVfZnVuY3Rpb24gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBwb3NzaWJseV9kdXBsaV9mdW5jdGlvbiAoKQoreworICByZXR1cm4gMTsKK30KKworI2VuZGlmCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgT0ssIHRoYXQncyBpdC4gIFlvdSBzaG91bGQgbm90IGhhdmUgdG8gY2hhbmdlIGFueXRoaW5nIGJleW9uZCB0aGlzCisgKiAgcG9pbnQgaW4gb3JkZXIgdG8gY29tcGlsZSBhbmQgZXhlY3V0ZSB0aGlzIHByb2dyYW0uICAoWW91IG1pZ2h0IGdldAorICogIHNvbWUgd2FybmluZ3MsIGJ1dCB5b3UgY2FuIGlnbm9yZSB0aGVtLikKKyAqICBXaGVuIHlvdSBydW4gdGhlIHByb2dyYW0sIGl0IHdpbGwgbWFrZSBhIGNvdXBsZSBtb3JlIHRlc3RzIHRoYXQgaXQKKyAqICBjYW4gZG8gYXV0b21hdGljYWxseSwgYW5kIHRoZW4gaXQgd2lsbCBjcmVhdGUgamNvbmZpZy5oIGFuZCBwcmludCBvdXQKKyAqICBhbnkgYWRkaXRpb25hbCBzdWdnZXN0aW9ucyBpdCBoYXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCisjZWxzZQoraW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCisgICAgIGludCBhcmc7CisjZW5kaWYKK3sKKyAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLworICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLworICB9CisgIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLworICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKKyAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIH0KKyAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLworfQorCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGxvbmcgYXJnKQorI2Vsc2UKK2ludCBpc19zaGlmdGluZ19zaWduZWQgKGFyZykKKyAgICAgbG9uZyBhcmc7CisjZW5kaWYKKy8qIFNlZSB3aGV0aGVyIHJpZ2h0LXNoaWZ0IG9uIGEgbG9uZyBpcyBzaWduZWQgb3Igbm90LiAqLworeworICBsb25nIHJlcyA9IGFyZyA+PiA0OworCisgIGlmIChyZXMgPT0gLTB4N0Y3RTgwQ0wpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgc2hpZnQgKi8KKyAgICByZXR1cm4gMTsJCQkvKiByaWdodCBzaGlmdCBpcyBzaWduZWQgKi8KKyAgfQorICAvKiBzZWUgaWYgdW5zaWduZWQtc2hpZnQgaGFjayB3aWxsIGZpeCBpdC4gKi8KKyAgLyogd2UgY2FuJ3QganVzdCB0ZXN0IGV4YWN0IHZhbHVlIHNpbmNlIGl0IGRlcGVuZHMgb24gd2lkdGggb2YgbG9uZy4uLiAqLworICByZXMgfD0gKH4wTCkgPDwgKDMyLTQpOworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBub3c/ICovCisgICAgcmV0dXJuIDA7CQkJLyogcmlnaHQgc2hpZnQgaXMgdW5zaWduZWQgKi8KKyAgfQorICBwcmludGYoIlJpZ2h0IHNoaWZ0IGlzbid0IGFjdGluZyBhcyBJIGV4cGVjdCBpdCB0by5cbiIpOworICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIHJldHVybiAwOwkJCS8qIHRyeSBpdCB3aXRoIHVuc2lnbmVkIGFueXdheSAqLworfQorCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKiBhcmd2KQorI2Vsc2UKK2ludCBtYWluIChhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqKiBhcmd2OworI2VuZGlmCit7CisgIGNoYXIgc2lnbmVkX2NoYXJfY2hlY2sgPSAoY2hhcikgKC02Nyk7CisgIEZJTEUgKm91dGZpbGU7CisKKyAgLyogQXR0ZW1wdCB0byB3cml0ZSBqY29uZmlnLmggKi8KKyAgaWYgKChvdXRmaWxlID0gZm9wZW4oImpjb25maWcuaCIsICJ3IikpID09IE5VTEwpIHsKKyAgICBwcmludGYoIkZhaWxlZCB0byB3cml0ZSBqY29uZmlnLmhcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLyogV3JpdGUgb3V0IGFsbCB0aGUgaW5mbyAqLworICBmcHJpbnRmKG91dGZpbGUsICIvKiBqY29uZmlnLmggLS0tIGdlbmVyYXRlZCBieSBja2NvbmZpZy5jICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi9cblxuIik7CisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1BST1RPVFlQRVNcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBIQVZFX1VOU0lHTkVEX0NIQVJcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9VTlNJR05FRF9TSE9SVAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfVU5TSUdORURfU0hPUlRcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9WT0lECisgIGZwcmludGYob3V0ZmlsZSwgIi8qICNkZWZpbmUgdm9pZCBjaGFyICovXG4iKTsKKyNlbHNlCisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgdm9pZCBjaGFyXG4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQ09OU1QKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBjb25zdCAqL1xuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIGNvbnN0XG4iKTsKKyNlbmRpZgorICBpZiAoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKQorICAgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBDSEFSX0lTX1VOU0lHTkVEXG4iKTsKKyAgZWxzZQorICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQ0hBUl9JU19VTlNJR05FRFxuIik7CisjaWZkZWYgSEFWRV9TVERERUZfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1REREVGX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1REREVGX0hcbiIpOworI2VuZGlmCisjaWZkZWYgSEFWRV9TVERMSUJfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIEhBVkVfU1RETElCX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIEhBVkVfU1RETElCX0hcbiIpOworI2VuZGlmCisjaWZkZWYgTkVFRF9CU0RfU1RSSU5HUworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfQlNEX1NUUklOR1NcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfQlNEX1NUUklOR1NcbiIpOworI2VuZGlmCisjaWZkZWYgTkVFRF9TWVNfVFlQRVNfSAorICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU1lTX1RZUEVTX0hcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU1lTX1RZUEVTX0hcbiIpOworI2VuZGlmCisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSU1xuIik7CisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOworI2Vsc2UKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVNcbiIpOworI2VuZGlmCisjaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTlxuIik7CisjZWxzZQorICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU5cbiIpOworI2VuZGlmCisgIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfSU5URVJOQUxTXG5cbiIpOworICBpZiAoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpCisgICAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVEXG4iKTsKKyAgZWxzZQorICAgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORURcbiIpOworICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIlxuI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUdcblxuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuIik7CisgIGZwcmludGYob3V0ZmlsZSwgIiNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqL1xuXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIFlvdSBtYXkgbmVlZCB0aGlzIG9uIG5vbi1Vbml4IHN5c3RlbXMgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1uYW1lLmMgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICIjdW5kZWYgRE9OVF9VU0VfQl9NT0RFXG4iKTsKKyAgZnByaW50ZihvdXRmaWxlLCAiLyogI2RlZmluZSBQUk9HUkVTU19SRVBPUlQgKi8JLyogb3B0aW9uYWwgKi9cbiIpOworICBmcHJpbnRmKG91dGZpbGUsICJcbiNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovXG4iKTsKKworICAvKiBDbG9zZSB0aGUgamNvbmZpZy5oIGZpbGUgKi8KKyAgZmNsb3NlKG91dGZpbGUpOworCisgIC8qIFVzZXIgcmVwb3J0ICovCisgIHByaW50ZigiQ29uZmlndXJhdGlvbiBjaGVjayBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlIGRvbmUuXG4iKTsKKyAgcHJpbnRmKCJcbkkgaGF2ZSB3cml0dGVuIHRoZSBqY29uZmlnLmggZmlsZSBmb3IgeW91LlxuXG4iKTsKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKKyAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS5hbnNpIGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOworI2Vsc2UKKyAgcHJpbnRmKCJZb3Ugc2hvdWxkIHVzZSBtYWtlZmlsZS51bml4IGFzIHRoZSBzdGFydGluZyBwb2ludCBmb3IgeW91ciBNYWtlZmlsZS5cbiIpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX1NQRUNJQUxfSU5DTFVERQorICBwcmludGYoIlxuWW91J2xsIG5lZWQgdG8gY2hhbmdlIGpjb25maWcuaCB0byBpbmNsdWRlIHRoZSBzeXN0ZW0gaW5jbHVkZSBmaWxlXG4iKTsKKyAgcHJpbnRmKCJ0aGF0IHlvdSBmb3VuZCB0eXBlIHNpemVfdCBpbiwgb3IgYWRkIGEgZGlyZWN0IGRlZmluaXRpb24gb2YgdHlwZVxuIik7CisgIHByaW50Zigic2l6ZV90IGlmIHRoYXQncyB3aGF0IHlvdSB1c2VkLiAgSnVzdCBhZGQgaXQgdG8gdGhlIGVuZC5cbiIpOworI2VuZGlmCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29kZXJ1bGVzLmRvYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jb2RlcnVsZXMuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjVkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29kZXJ1bGVzLmRvYwpAQCAtMCwwICsxLDExOCBAQAorSUpHIEpQRUcgTElCUkFSWTogIENPRElORyBSVUxFUworCitDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK1NpbmNlIG51bWVyb3VzIHBlb3BsZSB3aWxsIGJlIGNvbnRyaWJ1dGluZyBjb2RlIGFuZCBidWcgZml4ZXMsIGl0J3MgaW1wb3J0YW50Cit0byBlc3RhYmxpc2ggYSBjb21tb24gY29kaW5nIHN0eWxlLiAgVGhlIGdvYWwgb2YgdXNpbmcgc2ltaWxhciBjb2Rpbmcgc3R5bGVzCitpcyBtdWNoIG1vcmUgaW1wb3J0YW50IHRoYW4gdGhlIGRldGFpbHMgb2YganVzdCB3aGF0IHRoYXQgc3R5bGUgaXMuCisKK0luIGdlbmVyYWwgd2UgZm9sbG93IHRoZSByZWNvbW1lbmRhdGlvbnMgb2YgIlJlY29tbWVuZGVkIEMgU3R5bGUgYW5kIENvZGluZworU3RhbmRhcmRzIiByZXZpc2lvbiA2LjEgKENhbm5vbiBldCBhbC4gYXMgbW9kaWZpZWQgYnkgU3BlbmNlciwgS2VwcGVsIGFuZAorQnJhZGVyKS4gIFRoaXMgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGluIHRoZSBJSkcgRlRQIGFyY2hpdmUgKHNlZQoranBlZy9kb2MvY3N0eWxlLm1zLnRibC5aLCBvciBjc3R5bGUudHh0LlogZm9yIHRob3NlIHdpdGhvdXQgbnJvZmYvdGJsKS4KKworQmxvY2sgY29tbWVudHMgc2hvdWxkIGJlIGxhaWQgb3V0IHRodXNseToKKworLyoKKyAqICBCbG9jayBjb21tZW50cyBpbiB0aGlzIHN0eWxlLgorICovCisKK1dlIGluZGVudCBzdGF0ZW1lbnRzIGluIEsmUiBzdHlsZSwgZS5nLiwKKwlpZiAodGVzdCkgeworCSAgdGhlbi1wYXJ0OworCX0gZWxzZSB7CisJICBlbHNlLXBhcnQ7CisJfQord2l0aCB0d28gc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbC4gIChUaGlzIGluZGVudGF0aW9uIGNvbnZlbnRpb24gaXMKK2hhbmRsZWQgYXV0b21hdGljYWxseSBieSBHTlUgRW1hY3MgYW5kIG1hbnkgb3RoZXIgdGV4dCBlZGl0b3JzLikKKworTXVsdGktd29yZCBuYW1lcyBzaG91bGQgYmUgd3JpdHRlbiBpbiBsb3dlciBjYXNlIHdpdGggdW5kZXJzY29yZXMsIGUuZy4sCittdWx0aV93b3JkX25hbWUgKG5vdCBtdWx0aVdvcmROYW1lKS4gIFByZXByb2Nlc3NvciBzeW1ib2xzIGFuZCBlbnVtIGNvbnN0YW50cworYXJlIHNpbWlsYXIgYnV0IHVwcGVyIGNhc2UgKE1VTFRJX1dPUkRfTkFNRSkuICBOYW1lcyBzaG91bGQgYmUgdW5pcXVlIHdpdGhpbgordGhlIGZpcnN0IGZpZnRlZW4gY2hhcmFjdGVycy4gIChPbiBzb21lIG9sZGVyIHN5c3RlbXMsIGdsb2JhbCBuYW1lcyBtdXN0IGJlCit1bmlxdWUgd2l0aGluIHNpeCBjaGFyYWN0ZXJzLiAgV2UgYWNjb21tb2RhdGUgdGhpcyB3aXRob3V0IGNsdXR0ZXJpbmcgdGhlCitzb3VyY2UgY29kZSBieSB1c2luZyBtYWNyb3MgdG8gc3Vic3RpdHV0ZSBzaG9ydGVyIG5hbWVzLikKKworV2UgdXNlIGZ1bmN0aW9uIHByb3RvdHlwZXMgZXZlcnl3aGVyZTsgd2UgcmVseSBvbiBhdXRvbWF0aWMgc291cmNlIGNvZGUKK3RyYW5zZm9ybWF0aW9uIHRvIGZlZWQgcHJvdG90eXBlLWxlc3MgQyBjb21waWxlcnMuICBUcmFuc2Zvcm1hdGlvbiBpcyBkb25lCitieSB0aGUgc2ltcGxlIGFuZCBwb3J0YWJsZSB0b29sICdhbnNpMmtuci5jJyAoY291cnRlc3kgb2YgR2hvc3RzY3JpcHQpLgorYW5zaTJrbnIgaXMgbm90IHZlcnkgYnJpZ2h0LCBzbyBpdCBpbXBvc2VzIGEgZm9ybWF0IHJlcXVpcmVtZW50IG9uIGZ1bmN0aW9uCitkZWNsYXJhdGlvbnM6IHRoZSBmdW5jdGlvbiBuYW1lIE1VU1QgQkVHSU4gSU4gQ09MVU1OIDEuICBUaHVzIGFsbCBmdW5jdGlvbnMKK3Nob3VsZCBiZSB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgc3R5bGU6CisKK0xPQ0FMKGludCAqKQorZnVuY3Rpb25fbmFtZSAoaW50IGEsIGNoYXIgKmIpCit7CisgICAgY29kZS4uLgorfQorCitOb3RlIHRoYXQgZWFjaCBmdW5jdGlvbiBkZWZpbml0aW9uIG11c3QgYmVnaW4gd2l0aCBHTE9CQUwodHlwZSksIExPQ0FMKHR5cGUpLAorb3IgTUVUSE9EREVGKHR5cGUpLiAgVGhlc2UgbWFjcm9zIGV4cGFuZCB0byAic3RhdGljIHR5cGUiIG9yIGp1c3QgInR5cGUiIGFzCithcHByb3ByaWF0ZS4gIFRoZXkgcHJvdmlkZSBhIHJlYWRhYmxlIGluZGljYXRpb24gb2YgdGhlIHJvdXRpbmUncyB1c2FnZSBhbmQKK2NhbiByZWFkaWx5IGJlIGNoYW5nZWQgZm9yIHNwZWNpYWwgbmVlZHMuICAoRm9yIGluc3RhbmNlLCBzcGVjaWFsIGxpbmthZ2UKK2tleXdvcmRzIGNhbiBiZSBpbnNlcnRlZCBmb3IgdXNlIGluIFdpbmRvd3MgRExMcy4pCisKK2Fuc2kya25yIGRvZXMgbm90IHRyYW5zZm9ybSBtZXRob2QgZGVjbGFyYXRpb25zIChmdW5jdGlvbiBwb2ludGVycyBpbgorc3RydWN0cykuICBXZSBoYW5kbGUgdGhlc2Ugd2l0aCBhIG1hY3JvIEpNRVRIT0QsIGRlZmluZWQgYXMKKwkjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisJI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpIGFyZ2xpc3QKKwkjZWxzZQorCSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQorCSNlbmRpZgord2hpY2ggaXMgdXNlZCBsaWtlIHRoaXM6CisJc3RydWN0IGZ1bmN0aW9uX3BvaW50ZXJzIHsKKwkgIEpNRVRIT0Qodm9pZCwgaW5pdF9lbnRyb3B5X2VuY29kZXIsIChpbnQgc29tZWFyZywganBhcm1zICpqcCkpOworCSAgSk1FVEhPRCh2b2lkLCB0ZXJtX2VudHJvcHlfZW5jb2RlciwgKHZvaWQpKTsKKwl9OworTm90ZSB0aGUgc2V0IG9mIHBhcmVudGhlc2VzIHN1cnJvdW5kaW5nIHRoZSBwYXJhbWV0ZXIgbGlzdC4KKworQSBzaW1pbGFyIHNvbHV0aW9uIGlzIHVzZWQgZm9yIGZvcndhcmQgYW5kIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworKHNlZSB0aGUgRVhURVJOIGFuZCBKUFAgbWFjcm9zKS4KKworSWYgdGhlIGNvZGUgaXMgdG8gd29yayBvbiBub24tQU5TSSBjb21waWxlcnMsIHdlIGNhbm5vdCByZWx5IG9uIGEgcHJvdG90eXBlCitkZWNsYXJhdGlvbiB0byBjb2VyY2UgYWN0dWFsIHBhcmFtZXRlcnMgaW50byB0aGUgcmlnaHQgdHlwZXMuICBUaGVyZWZvcmUsIHVzZQorZXhwbGljaXQgY2FzdHMgb24gYWN0dWFsIHBhcmFtZXRlcnMgd2hlbmV2ZXIgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZSBpcyBub3QKK2lkZW50aWNhbCB0byB0aGUgZm9ybWFsIHBhcmFtZXRlci4gIEJld2FyZSBvZiBpbXBsaWNpdCBjb252ZXJzaW9ucyB0byAiaW50Ii4KKworSXQgc2VlbXMgdGhlcmUgYXJlIHNvbWUgbm9uLUFOU0kgY29tcGlsZXJzIGluIHdoaWNoIHRoZSBzaXplb2YoKSBvcGVyYXRvcgoraXMgZGVmaW5lZCB0byByZXR1cm4gaW50LCB5ZXQgc2l6ZV90IGlzIGRlZmluZWQgYXMgbG9uZy4gIE5lZWRsZXNzIHRvIHNheSwKK3RoaXMgaXMgYnJhaW4tZGFtYWdlZC4gIEFsd2F5cyB1c2UgdGhlIFNJWkVPRigpIG1hY3JvIGluIHBsYWNlIG9mIHNpemVvZigpLAorc28gdGhhdCB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZSBzaXplX3QuCisKKworVGhlIEpQRUcgbGlicmFyeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGhpbiBsYXJnZXIgcHJvZ3JhbXMuICBGdXJ0aGVybW9yZSwKK3dlIHdhbnQgaXQgdG8gYmUgcmVlbnRyYW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIHRoYXQgcHJvY2VzcworbXVsdGlwbGUgaW1hZ2VzIGNvbmN1cnJlbnRseS4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgc3VwcG9ydCB0aGVzZSByZXF1aXJlbWVudHM6CisKKzEuIEF2b2lkIGRpcmVjdCB1c2Ugb2YgZmlsZSBJL08sICJtYWxsb2MiLCBlcnJvciByZXBvcnQgcHJpbnRvdXRzLCBldGM7CitwYXNzIHRoZXNlIHRocm91Z2ggdGhlIGNvbW1vbiByb3V0aW5lcyBwcm92aWRlZC4KKworMi4gTWluaW1pemUgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24uICBGdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIHN0YXRpYword2hlcmV2ZXIgcG9zc2libGUuICAoTm90ZSB0aGF0IG91ciBtZXRob2QtYmFzZWQgY2FsbGluZyBjb252ZW50aW9ucyBoZWxwIHRoaXMKK2EgbG90OiBpbiBtYW55IG1vZHVsZXMgb25seSB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gd2lsbCBldmVyIG5lZWQgdG8gYmUKK2NhbGxlZCBkaXJlY3RseSwgc28gb25seSB0aGF0IGZ1bmN0aW9uIG5lZWQgYmUgZXh0ZXJuYWxseSB2aXNpYmxlLikgIEFsbAorZ2xvYmFsIGZ1bmN0aW9uIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqcGVnXyIsIGFuZCBzaG91bGQgaGF2ZSBhbgorYWJicmV2aWF0ZWQgbmFtZSAodW5pcXVlIGluIHRoZSBmaXJzdCBzaXggY2hhcmFjdGVycykgc3Vic3RpdHV0ZWQgYnkgbWFjcm8KK3doZW4gTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyBpcyBzZXQuCisKKzMuIERvbid0IHVzZSBnbG9iYWwgdmFyaWFibGVzOyBhbnl0aGluZyB0aGF0IG11c3QgYmUgdXNlZCBpbiBhbm90aGVyIG1vZHVsZQorc2hvdWxkIGJlIGluIHRoZSBjb21tb24gZGF0YSBzdHJ1Y3R1cmVzLgorCis0LiBEb24ndCB1c2Ugc3RhdGljIHZhcmlhYmxlcyBleGNlcHQgZm9yIHJlYWQtb25seSBjb25zdGFudCB0YWJsZXMuICBWYXJpYWJsZXMKK3RoYXQgc2hvdWxkIGJlIHByaXZhdGUgdG8gYSBtb2R1bGUgY2FuIGJlIHBsYWNlZCBpbnRvIHByaXZhdGUgc3RydWN0dXJlcyAoc2VlCit0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBkb2N1bWVudCwgc3RydWN0dXJlLmRvYykuCisKKzUuIFNvdXJjZSBmaWxlIG5hbWVzIHNob3VsZCBiZWdpbiB3aXRoICJqIiBmb3IgZmlsZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUKK2xpYnJhcnkgcHJvcGVyOyBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGxpYnJhcnksIHN1Y2ggYXMgY2pwZWcuYworYW5kIGRqcGVnLmMsIGRvIG5vdCBiZWdpbiB3aXRoICJqIi4gIEtlZXAgc291cmNlIGZpbGUgbmFtZXMgdG8gZWlnaHQKK2NoYXJhY3RlcnMgKHBsdXMgIi5jIiBvciAiLmgiLCBldGMpIHRvIG1ha2UgbGlmZSBlYXN5IGZvciBNUy1ET1NlcnMuICBLZWVwCitjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb2RlIGluIHNlcGFyYXRlIHNvdXJjZSBmaWxlcyAtLS0gc29tZQorYXBwbGljYXRpb25zIG1heSB3YW50IG9ubHkgb25lIGhhbGYgb2YgdGhlIGxpYnJhcnkuCisKK05vdGU6IHRoZXNlIHJ1bGVzIChwYXJ0aWN1bGFybHkgIzQpIGFyZSBub3QgZm9sbG93ZWQgcmVsaWdpb3VzbHkgaW4gdGhlCittb2R1bGVzIHRoYXQgYXJlIHVzZWQgaW4gY2pwZWcvZGpwZWcgYnV0IGFyZSBub3QgcGFydCBvZiB0aGUgSlBFRyBsaWJyYXJ5Citwcm9wZXIuICBUaG9zZSBtb2R1bGVzIGFyZSBub3QgcmVhbGx5IGludGVuZGVkIHRvIGJlIHVzZWQgaW4gb3RoZXIKK2FwcGxpY2F0aW9ucy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jb25maWcuZ3Vlc3MgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29uZmlnLmd1ZXNzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxM2VkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsODgzIEBACisjISAvYmluL3NoCisjIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCisjICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFdyaXR0ZW4gYnkgUGVyIEJvdGhuZXIgPGJvdGhuZXJAY3lnbnVzLmNvbT4uCisjIFRoZSBtYXN0ZXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgaXMgYXQgdGhlIEZTRiBpbiAvaG9tZS9nZC9nbnUvbGliLgorIworIyBUaGlzIHNjcmlwdCBhdHRlbXB0cyB0byBndWVzcyBhIGNhbm9uaWNhbCBzeXN0ZW0gbmFtZSBzaW1pbGFyIHRvCisjIGNvbmZpZy5zdWIuICBJZiBpdCBzdWNjZWVkcywgaXQgcHJpbnRzIHRoZSBzeXN0ZW0gbmFtZSBvbiBzdGRvdXQsIGFuZAorIyBleGl0cyB3aXRoIDAuICBPdGhlcndpc2UsIGl0IGV4aXRzIHdpdGggMS4KKyMKKyMgVGhlIHBsYW4gaXMgdGhhdCB0aGlzIGNhbiBiZSBjYWxsZWQgYnkgY29uZmlndXJlIHNjcmlwdHMgaWYgeW91CisjIGRvbid0IHNwZWNpZnkgYW4gZXhwbGljaXQgc3lzdGVtIHR5cGUgKGhvc3QvdGFyZ2V0IG5hbWUpLgorIworIyBPbmx5IGEgZmV3IHN5c3RlbXMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgbGlzdDsgcGxlYXNlIGFkZCBvdGhlcnMKKyMgKGJ1dCB0cnkgdG8ga2VlcCB0aGUgc3RydWN0dXJlIGNsZWFuKS4KKyMKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSA4LzI0Lzk0LikKK2lmICh0ZXN0IC1mIC8uYXR0YmluL3VuYW1lKSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCisJUEFUSD0kUEFUSDovLmF0dGJpbiA7IGV4cG9ydCBQQVRICitmaQorCitVTkFNRV9NQUNISU5FPWAodW5hbWUgLW0pIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9NQUNISU5FPXVua25vd24KK1VOQU1FX1JFTEVBU0U9YCh1bmFtZSAtcikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1JFTEVBU0U9dW5rbm93bgorVU5BTUVfU1lTVEVNPWAodW5hbWUgLXMpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKK3RyYXAgJ3JtIC1mIGR1bW15LmMgZHVtbXkubyBkdW1teTsgZXhpdCAxJyAxIDIgMTUKKworIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgorCitjYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCisgICAgYWxwaGE6T1NGMToqOiopCisJaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgorCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAorCWZpCisJIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCisJIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KKwkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KKwkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KKwljYXQgPDxFT0YgPmR1bW15LnMKKwkuZ2xvYmwgbWFpbgorCS5lbnQgbWFpbgorbWFpbjoKKwkuZnJhbWUgXCQzMCwwLFwkMjYsMAorCS5wcm9sb2d1ZSAwCisJLmxvbmcgMHg0N2UwM2Q4MCAjIGltcGx2ZXIgJDAKKwlsZGEgXCQyLDI1OQorCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQorCXNybCBcJDEsOCxcJDIKKwlzbGwgXCQyLDIsXCQyCisJc2xsIFwkMCwzLFwkMAorCWFkZGwgXCQxLFwkMCxcJDAKKwlhZGRsIFwkMixcJDAsXCQwCisJcmV0IFwkMzEsKFwkMjYpLDEKKwkuZW5kIG1haW4KK0VPRgorCSR7Q0MtY2N9IGR1bW15LnMgLW8gZHVtbXkgMj4vZGV2L251bGwKKwlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgorCQkuL2R1bW15CisJCWNhc2UgIiQ/IiBpbgorCQkJNykKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIKKwkJCQk7OworCQkJMTUpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjUiCisJCQkJOzsKKwkJCTE0KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1NiIKKwkJCQk7OworCQkJMTApCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIKKwkJCQk7OworCQkJMTYpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjYiCisJCQkJOzsKKwkJZXNhYworCWZpCisJcm0gLWYgZHVtbXkucyBkdW1teQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1ZUWF0vLycgfCB0ciBbW0EtWl1dIFtbYS16XV1gCisJZXhpdCAwIDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCAwIDs7CisgICAgQW1pZ2EqOlVOSVhfU3lzdGVtX1Y6NC4wOiopCisJZWNobyBtNjhrLWNibS1zeXN2NAorCWV4aXQgMDs7CisgICAgYW1pZ2E6TmV0QlNEOio6KikKKyAgICAgIGVjaG8gbTY4ay1jYm0tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorICAgICAgZXhpdCAwIDs7CisgICAgYW1pZ2E6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM2NDpPcGVuQlNEOio6KikKKwllY2hvIG1pcHM2NGVsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhcmM6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhrbWlwczpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBtYXg6T3BlbkJTRDoqOiopCisJZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHNnaTpPcGVuQlNEOio6KikKKwllY2hvIG1pcHMtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHdncmlzYzpPcGVuQlNEOio6KikKKwllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQorCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDA7OworICAgIGFybTMyOk5ldEJTRDoqOiopCisJZWNobyBhcm0tdW5rbm93bi1uZXRic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLV9dLiovXC4vJ2AKKwlleGl0IDAgOzsKKyAgICBTUjI/MDE6SEktVVgvTVBQOio6KikKKwllY2hvIGhwcGExLjEtaGl0YWNoaS1oaXV4bXBwCisJZXhpdCAwOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KnxNSVMqOk9TeCo6KjoqKQorCSMgYWtlZUB3cGRpczAzLndwYWZiLmFmLm1pbCAoRWFybGUgRi4gQWtlKSBjb250cmlidXRlZCBNSVMgYW5kIE5JTEUuCisJaWYgdGVzdCAiYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAiID0gYXR0IDsgdGhlbgorCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zeXN2MworCWVsc2UKKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtYnNkCisJZmkKKwlleGl0IDAgOzsKKyAgICBOSUxFOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCAwIDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqKQorCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDAgOzsKKyAgICBzdW40KjpTdW5PUzoqOiopCisJY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgorCSAgICBTZXJpZXMqfFM0KikKKwkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCisJCTs7CisJZXNhYworCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KKwllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAorCWV4aXQgMCA7OworICAgIHN1bjMqOlN1bk9TOio6KikKKwllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKKwl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCisJY2FzZSAiYC9iaW4vYXJjaGAiIGluCisJICAgIHN1bjMpCisJCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJICAgIHN1bjQpCisJCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQorCQk7OworCWVzYWMKKwlleGl0IDAgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgYXRhcmkqOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWF0YXJpLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBhdGFyaSo6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBzdW4zKjpOZXRCU0Q6KjoqKQorCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWFjNjhrOk5ldEJTRDoqOiopCisJZWNobyBtNjhrLWFwcGxlLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtYWM2OGs6T3BlbkJTRDoqOiopCisJZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbXZtZTg4azpPcGVuQlNEOio6KikKKwllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCisJZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgMCA7OworICAgIFJJU0MqOlVMVFJJWDoqOiopCisJZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgVkFYKjpVTFRSSVgqOio6KikKKwllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIDIwMjA6Q0xJWDoqOiopCisJZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCisJaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgeworCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQorCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjZW5kaWYKKwkgIGV4aXQgKC0xKTsKKwl9CitFT0YKKwkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IFwKKwkgICYmIC4vZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAorCSAgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwlybSAtZiBkdW1teS5jIGR1bW15CisJZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKKwlleGl0IDAgOzsKKyAgICBtODhrOkNYL1VYOjcqOiopCisJZWNobyBtODhrLWhhcnJpcy1jeHV4NworCWV4aXQgMCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCAwIDs7CisgICAgbTg4azoqOjMqOlIzKikKKwllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKKwlleGl0IDAgOzsKKyAgICBBVmlpT046ZGd1eDoqOiopCisgICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCisgICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCisgICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KKwlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCisJICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCisJCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZmkKKyAJZXhpdCAwIDs7CisgICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKKwllY2hvIG04OGstZG9scGhpbi1zeXN2MworCWV4aXQgMCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCAwIDs7CisgICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCisJZWNobyBtODhrLXRla3Ryb25peC1zeXN2MworCWV4aXQgMCA7OworICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCisJZWNobyBtNjhrLXRla3Ryb25peC1ic2QKKwlleGl0IDAgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCAwIDs7CisgICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgorCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCisgICAgaT84NjpBSVg6KjoqKQorCWVjaG8gaTM4Ni1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgKjpBSVg6MjozKQorCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYworCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgorCisJCW1haW4oKQorCQkJeworCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCisJCQkJZXhpdCgxKTsKKwkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7CisJCQlleGl0KDApOworCQkJfQorRU9GCisJCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCQlybSAtZiBkdW1teS5jIGR1bW15CisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQorCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAorCWVsc2UKKwkJZWNobyByczYwMDAtaWJtLWFpeDMuMgorCWZpCisJZXhpdCAwIDs7CisgICAgKjpBSVg6Kjo0KQorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCUlCTV9BUkNIPXJzNjAwMAorCWVsc2UKKwkJSUJNX0FSQ0g9cG93ZXJwYworCWZpCisJaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCisJCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCisJZWxzZQorCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQorCWZpCisJZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgMCA7OworICAgICo6QUlYOio6KikKKwllY2hvIHJzNjAwMC1pYm0tYWl4CisJZXhpdCAwIDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDAgOzsKKyAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAorCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KKwlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMworICAgICo6Qk9TWDoqOiopCisJZWNobyByczYwMDAtYnVsbC1ib3N4CisJZXhpdCAwIDs7CisgICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKKwllY2hvIG02OGstYnVsbC1zeXN2MworCWV4aXQgMCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKKwllY2hvIG02OGstaHAtYnNkNC40CisJZXhpdCAwIDs7CisgICAgOTAwMC9bMzQ3OF0/PzpIUC1VWDoqOiopCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC83Pz8gfCA5MDAwLzg/WzE2NzldICkgSFBfQVJDSD1ocHBhMS4xIDs7CisJICAgIDkwMDAvOD8/ICkgICAgICAgICAgICBIUF9BUkNIPWhwcGExLjAgOzsKKwllc2FjCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgMCA7OworICAgIDMwNTAqOkhJLVVYOio6KikKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15ICYmIC4vZHVtbXkgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwlybSAtZiBkdW1teS5jIGR1bW15CisJZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgorCWV4aXQgMCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgOTAwMC84Pz86NC4zYnNkOio6KikKKwllY2hvIGhwcGExLjAtaHAtYnNkCisJZXhpdCAwIDs7CisgICAgaHA3Pz86T1NGMToqOiogfCBocDg/Wzc5XTpPU0YxOio6KiApCisJZWNobyBocHBhMS4xLWhwLW9zZgorCWV4aXQgMCA7OworICAgIGhwOD8/Ok9TRjE6KjoqKQorCWVjaG8gaHBwYTEuMC1ocC1vc2YKKwlleGl0IDAgOzsKKyAgICBpPzg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDAgOzsKKyAgICBwYXJpc2MqOkxpdGVzKjoqOiopCisJZWNobyBocHBhMS4xLWhwLWxpdGVzCisJZXhpdCAwIDs7CisgICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKKwllY2hvIGMxLWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCAwIDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgMCA7OworICAgIENSQVkqWC1NUDoqOio6KikKKwllY2hvIHhtcC1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCisJZXhpdCAwIDs7CisgICAgQ1JBWSpUUzoqOio6KikKKwllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBDUkFZLTI6KjoqOiopCisJZWNobyBjcmF5Mi1jcmF5LXVuaWNvcworICAgICAgICBleGl0IDAgOzsKKyAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciBbQS1aXSBbYS16XSB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiZjMwMC1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisgICAgICAgIGV4aXQgMCA7OworICAgIEYzMDE6VU5JWF9TeXN0ZW1fVjoqOiopCisgICAgICAgZWNobyBmMzAxLWZ1aml0c3UtdXhwdmBlY2hvICRVTkFNRV9SRUxFQVNFIHwgc2VkICdzLyAuKi8vJ2AKKyAgICAgICBleGl0IDAgOzsKKyAgICBocDNbMC05XVswNV06TmV0QlNEOio6KikKKwllY2hvIG02OGstaHAtbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIGhwMzAwOk9wZW5CU0Q6KjoqKQorCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgaT84NjpCU0QvMzg2Oio6KiB8ICo6QlNEL09TOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICAqOkZyZWVCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgCisJZXhpdCAwIDs7CisgICAgKjpOZXRCU0Q6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW5ldGJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCWV4aXQgMCA7OworICAgICo6T3BlbkJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3BlbmJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCWV4aXQgMCA7OworICAgIGkqOkNZR1dJTio6KikKKwllY2hvIGkzODYtcGMtY3lnd2luMzIKKwlleGl0IDAgOzsKKyAgICBpKjpNSU5HVyo6KikKKwllY2hvIGkzODYtcGMtbWluZ3czMgorCWV4aXQgMCA7OworICAgIHAqOkNZR1dJTio6KikKKwllY2hvIHBvd2VycGNsZS11bmtub3duLWN5Z3dpbjMyCisJZXhpdCAwIDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgMCA7OworICAgICo6R05VOio6KikKKwllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKKwlleGl0IDAgOzsKKyAgICAqOkxpbnV4Oio6KikKKwkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbworCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4KKwlsZF9oZWxwX3N0cmluZz1gbGQgLS1oZWxwIDI+JjFgCisJbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnM9YGVjaG8gJGxkX2hlbHBfc3RyaW5nIFwKKwkJCSB8IHNlZCAtbmUgJy9zdXBwb3J0ZWQgZW11bGF0aW9uczovIWQKKwkJCQkgICAgcy9bIAldWyAJXSovIC9nCisJCQkJICAgIHMvLipzdXBwb3J0ZWQgZW11bGF0aW9uczogKi8vCisJCQkJICAgIHMvIC4qLy8KKwkJCQkgICAgcCdgCisgICAgICAgIGNhc2UgIiRsZF9zdXBwb3J0ZWRfZW11bGF0aW9ucyIgaW4KKwkgIGk/ODZsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIgICAgICA7IGV4aXQgMCA7OworCSAgaT84NmNvZmYpICAgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVjb2ZmIiAgICAgIDsgZXhpdCAwIDs7CisJICBzcGFyY2xpbnV4KSBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKKwkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OworCSAgZWxmMzJwcGMpICAgZWNobyAicG93ZXJwYy11bmtub3duLWxpbnV4LWdudSIgICAgICAgICAgICAgIDsgZXhpdCAwIDs7CisJZXNhYworCisJaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAiYWxwaGEiIDsgdGhlbgorCQlzZWQgJ3MvXgkvLycgIDw8RU9GID5kdW1teS5zCisJCS5nbG9ibCBtYWluCisJCS5lbnQgbWFpbgorCW1haW46CisJCS5mcmFtZSBcJDMwLDAsXCQyNiwwCisJCS5wcm9sb2d1ZSAwCisJCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCisJCWxkYSBcJDIsMjU5CisJCS5sb25nIDB4NDdlMjBjMjEgIyBhbWFzayAkMiwkMQorCQlzcmwgXCQxLDgsXCQyCisJCXNsbCBcJDIsMixcJDIKKwkJc2xsIFwkMCwzLFwkMAorCQlhZGRsIFwkMSxcJDAsXCQwCisJCWFkZGwgXCQyLFwkMCxcJDAKKwkJcmV0IFwkMzEsKFwkMjYpLDEKKwkJLmVuZCBtYWluCitFT0YKKwkJTElCQz0iIgorCQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCisJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkuL2R1bW15CisJCQljYXNlICIkPyIgaW4KKwkJCTcpCisJCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCisJCQkJOzsKKwkJCTE1KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgorCQkJCTs7CisJCQkxNCkKKwkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCisJCQkJOzsKKwkJCTEwKQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCisJCQkJOzsKKwkJCTE2KQorCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgorCQkJCTs7CisJCQllc2FjCQorCisJCQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIGR1bW15IHwgXAorCQkJICBncmVwIGxkLnNvLjEgPiAvZGV2L251bGwKKwkJCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuCisJCQkJTElCQz0ibGliYzEiCisJCQlmaQorCQlmaQkKKwkJcm0gLWYgZHVtbXkucyBkdW1teQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUke0xJQkN9IDsgZXhpdCAwCisJZWxpZiB0ZXN0ICIke1VOQU1FX01BQ0hJTkV9IiA9ICJtaXBzIiA7IHRoZW4KKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorbWFpbihhcmdjLCBhcmd2KQorICAgICBpbnQgYXJnYzsKKyAgICAgY2hhciAqYXJndltdOworeworI2lmZGVmIF9fTUlQU0VCX18KKyAgcHJpbnRmICgiJXMtdW5rbm93bi1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOworI2VuZGlmCisjaWZkZWYgX19NSVBTRUxfXworICBwcmludGYgKCIlc2VsLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK0VPRgorCSAgJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICIke1VOQU1FX01BQ0hJTkV9IiAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAorCSAgcm0gLWYgZHVtbXkuYyBkdW1teQorCWVsc2UKKwkgICMgRWl0aGVyIGEgcHJlLUJGRCBhLm91dCBsaW5rZXIgKGxpbnV4LWdudW9sZGxkKQorCSAgIyBvciBvbmUgdGhhdCBkb2VzIG5vdCBnaXZlIHVzIHVzZWZ1bCAtLWhlbHAuCisJICAjIEdDQyB3YW50cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGxpbnV4LWdudW9sZGxkIGFuZCBsaW51eC1nbnVhb3V0LgorCSAgIyBJZiBsZCBkb2VzIG5vdCBwcm92aWRlICphbnkqICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCisJICAjIHRoYXQgbWVhbnMgaXQgaXMgZ251b2xkbGQuCisJICBlY2hvICIkbGRfaGVscF9zdHJpbmciIHwgZ3JlcCA+L2Rldi9udWxsIDI+JjEgInN1cHBvcnRlZCBlbXVsYXRpb25zOiIKKwkgIHRlc3QgJD8gIT0gMCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIiAmJiBleGl0IDAKKworCSAgY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgIGk/ODYpCisJICAgIFZFTkRPUj1wYzsKKwkgICAgOzsKKwkgICopCisJICAgIFZFTkRPUj11bmtub3duOworCSAgICA7OworCSAgZXNhYworCSAgIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKKwkgIGNhdCA+ZHVtbXkuYyA8PEVPRgorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CittYWluKGFyZ2MsIGFyZ3YpCisgICAgIGludCBhcmdjOworICAgICBjaGFyICphcmd2W107Cit7CisjaWZkZWYgX19FTEZfXworIyBpZmRlZiBfX0dMSUJDX18KKyMgIGlmIF9fR0xJQkNfXyA+PSAyCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudVxuIiwgYXJndlsxXSk7CisjICBlbHNlCisgICAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWxpYmMxXG4iLCBhcmd2WzFdKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7CisjIGVuZGlmCisjZWxzZQorICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251YW91dFxuIiwgYXJndlsxXSk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CitFT0YKKwkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKKwkgIHJtIC1mIGR1bW15LmMgZHVtbXkKKwlmaSA7OworIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4gIGVhcmxpZXIgdmVyc2lvbnMKKyMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoIHN5c25hbWUgYW5kIG5vZGVuYW1lLgorICAgIGk/ODY6RFlOSVgvcHR4OjQqOiopCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBpPzg2OlVOSVhfU1Y6NC4yTVA6Mi4qKQorICAgICAgICAjIFVuaXh3YXJlIGlzIGFuIG9mZnNob290IG9mIFNWUjQsIGJ1dCBpdCBoYXMgaXRzIG93biB2ZXJzaW9uCisgICAgICAgICMgbnVtYmVyIHNlcmllcyBzdGFydGluZyB3aXRoIDIuLi4KKyAgICAgICAgIyBJIGFtIG5vdCBwb3NpdGl2ZSB0aGF0IG90aGVyIFNWUjQgc3lzdGVtcyB3b24ndCBtYXRjaCB0aGlzLAorCSMgSSBqdXN0IGhhdmUgdG8gaG9wZS4gIC0tIHJtcy4KKyAgICAgICAgIyBVc2Ugc3lzdjQuMnV3Li4uIHNvIHRoYXQgc3lzdjQqIG1hdGNoZXMgaXQuCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Y0LjJ1dyR7VU5BTUVfVkVSU0lPTn0KKwlleGl0IDAgOzsKKyAgICBpPzg2Oio6NC4qOiogfCBpPzg2OlNZU1RFTV9WOjQuKjoqKQorCWlmIGdyZXAgTm92ZWxsIC91c3IvaW5jbHVkZS9saW5rLmggPi9kZXYvbnVsbCAyPi9kZXYvbnVsbDsgdGhlbgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5pdmVsLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZWxzZQorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWV4aXQgMCA7OworICAgIGk/ODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxlZ3JlcCBSZWxlYXNlfHNlZCAtZSAncy8uKj0gLy8nKWAKKwkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgorCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCAwIDs7CisgICAgcGM6KjoqOiopCisgICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0CisgICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCisJZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKKyAgICAgICAgZXhpdCAwIDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgMCA7OworICAgIHBhcmFnb246KjoqOiopCisJZWNobyBpODYwLWludGVsLW9zZjEKKwlleGl0IDAgOzsKKyAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0CisJaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKKwllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCisJICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAorCWZpCisJZXhpdCAwIDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDAgOzsKKyAgICBNNjgqOio6UjNWWzU2N10qOiopCisJdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7CisgICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKKwkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKKyAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKKyAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCisgICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKKyAgICBtNjgqOkx5bnhPUzoyLio6KikKKwllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCAwIDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgMCA7OworICAgIGk/ODY6THlueE9TOjIuKjoqKQorCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKKwllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQorCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDAgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgMCA7OworICAgICo6U0lOSVgtKjoqOiopCisJaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAorCWVsc2UKKwkJZWNobyBuczMyay1zbmktc3lzdgorCWZpCisJZXhpdCAwIDs7CisgICAgUEVOVElVTTpDUHVuaXg6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgorICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0CisgICAgICAgIGV4aXQgMCA7OworICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQorCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KKwkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KKwllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAorCWV4aXQgMCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDAgOzsKKyAgICBtYzY4KjpBL1VYOio6KikKKwllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgMCA7OworICAgIG5ld3MqOk5FV1MtT1M6Kjo2KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCAwIDs7CisgICAgUjMwMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCAwIDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitjYXQgPmR1bW15LmMgPDxFT0YKKyNpZmRlZiBfU0VRVUVOVF8KKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjZW5kaWYKK21haW4gKCkKK3sKKyNpZiBkZWZpbmVkIChzb255KQorI2lmIGRlZmluZWQgKE1JUFNFQikKKyAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKKyAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KKyAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAorI2lmZGVmIE5FV1NPUzQKKyAgICAgICAgICAiNCIKKyNlbHNlCisJICAiIgorI2VuZGlmCisgICAgICAgICApOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQorICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKKyAgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCisjaWYgZGVmaW5lZCAoVU1BWFYpCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7CisjZWxzZQorI2lmIGRlZmluZWQgKENNVSkKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCisgIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKHNlcXVlbnQpCisjaWYgZGVmaW5lZCAoaTM4NikKKyAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIChuczMyMDAwKQorICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQorICAgIHN0cnVjdCB1dHNuYW1lIHVuOworCisgICAgdW5hbWUoJnVuKTsKKworICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKKwlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOworICAgIH0KKyAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkICh2YXgpCisjaWYgIWRlZmluZWQgKHVsdHJpeCkKKyAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisgIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKKyAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyAgZXhpdCAoMSk7Cit9CitFT0YKKworJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCitybSAtZiBkdW1teS5jIGR1bW15CisKKyMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KKwordGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KKworIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQorCitpZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQordGhlbgorICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCisgICAgYzEqKQorCWVjaG8gYzEtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCAwIDs7CisgICAgYzM0KikKKwllY2hvIGMzNC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzM4KikKKwllY2hvIGMzOC1jb252ZXgtYnNkCisJZXhpdCAwIDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgMCA7OworICAgIGVzYWMKK2ZpCisKKyNlY2hvICcoVW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlKScgMT4mMgorCitleGl0IDEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jb25maWcuc3ViIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjEzYTZkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jb25maWcuc3ViCkBAIC0wLDAgKzEsOTU0IEBACisjISAvYmluL3NoCisjIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCisjICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIFRoaXMgZmlsZSBpcyAoaW4gcHJpbmNpcGxlKSBjb21tb24gdG8gQUxMIEdOVSBzb2Z0d2FyZS4KKyMgVGhlIHByZXNlbmNlIG9mIGEgbWFjaGluZSBpbiB0aGlzIGZpbGUgc3VnZ2VzdHMgdGhhdCBTT01FIEdOVSBzb2Z0d2FyZQorIyBjYW4gaGFuZGxlIHRoYXQgbWFjaGluZS4gIEl0IGRvZXMgbm90IGltcGx5IEFMTCBHTlUgc29mdHdhcmUgY2FuLgorIworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisjIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBDb25maWd1cmF0aW9uIHN1YnJvdXRpbmUgdG8gdmFsaWRhdGUgYW5kIGNhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyMgU3VwcGx5IHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiB0eXBlIGFzIGFuIGFyZ3VtZW50LgorIyBJZiBpdCBpcyBpbnZhbGlkLCB3ZSBwcmludCBhbiBlcnJvciBtZXNzYWdlIG9uIHN0ZGVyciBhbmQgZXhpdCB3aXRoIGNvZGUgMS4KKyMgT3RoZXJ3aXNlLCB3ZSBwcmludCB0aGUgY2Fub25pY2FsIGNvbmZpZyB0eXBlIG9uIHN0ZG91dCBhbmQgc3VjY2VlZC4KKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworaWYgWyB4JDEgPSB4IF0KK3RoZW4KKwllY2hvIENvbmZpZ3VyYXRpb24gbmFtZSBtaXNzaW5nLiAxPiYyCisJZWNobyAiVXNhZ2U6ICQwIENQVS1NRlItT1BTWVMiIDE+JjIKKwllY2hvICJvciAgICAgJDAgQUxJQVMiIDE+JjIKKwllY2hvIHdoZXJlIEFMSUFTIGlzIGEgcmVjb2duaXplZCBjb25maWd1cmF0aW9uIHR5cGUuIDE+JjIKKwlleGl0IDEKK2ZpCisKKyMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgorY2FzZSAkMSBpbgorCSpsb2NhbCopCisJCWVjaG8gJDEKKwkJZXhpdCAwCisJCTs7CisJKikKKwk7OworZXNhYworCisjIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCisjIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgorbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCitjYXNlICRtYXliZV9vcyBpbgorICBsaW51eC1nbnUqKQorICAgIG9zPS0kbWF5YmVfb3MKKyAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMS8nYAorICAgIDs7CisgICopCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy8tW14tXSokLy8nYAorICAgIGlmIFsgJGJhc2ljX21hY2hpbmUgIT0gJDEgXQorICAgIHRoZW4gb3M9YGVjaG8gJDEgfCBzZWQgJ3MvLiotLy0vJ2AKKyAgICBlbHNlIG9zPTsgZmkKKyAgICA7OworZXNhYworCisjIyMgTGV0J3MgcmVjb2duaXplIGNvbW1vbiBtYWNoaW5lcyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMgc28KKyMjIyB0aGF0IHRoaW5ncyBsaWtlIGNvbmZpZy5zdWIgZGVjc3RhdGlvbi0zMTAwIHdvcmsuICBXZSBhbHNvCisjIyMgcmVjb2duaXplIHNvbWUgbWFudWZhY3R1cmVycyBhcyBub3QgYmVpbmcgb3BlcmF0aW5nIHN5c3RlbXMsIHNvIHdlCisjIyMgY2FuIHByb3ZpZGUgZGVmYXVsdCBvcGVyYXRpbmcgc3lzdGVtcyBiZWxvdy4KK2Nhc2UgJG9zIGluCisJLXN1bipvcyopCisJCSMgUHJldmVudCBmb2xsb3dpbmcgY2xhdXNlIGZyb20gaGFuZGxpbmcgdGhpcyBpbnZhbGlkIGlucHV0LgorCQk7OworCS1kZWMqIHwgLW1pcHMqIHwgLXNlcXVlbnQqIHwgLWVuY29yZSogfCAtcGM1MzIqIHwgLXNnaSogfCAtc29ueSogfCBcCisJLWF0dCogfCAtNzMwMCogfCAtMzMwMCogfCAtZGVsdGEqIHwgLW1vdG9yb2xhKiB8IC1zdW5bMjM0XSogfCBcCisJLXVuaWNvbSogfCAtaWJtKiB8IC1uZXh0IHwgLWhwIHwgLWlzaSogfCAtYXBvbGxvIHwgLWFsdG9zKiB8IFwKKwktY29udmVyZ2VudCogfCAtbmNyKiB8IC1uZXdzIHwgLTMyKiB8IC0zNjAwKiB8IC0zMTAwKiB8IC1oaXRhY2hpKiB8XAorCS1jWzEyM10qIHwgLWNvbnZleCogfCAtc3VuIHwgLWNyZHMgfCAtb21yb24qIHwgLWRnIHwgLXVsdHJhIHwgLXR0aSogfCBcCisJLWhhcnJpcyB8IC1kb2xwaGluIHwgLWhpZ2hsZXZlbCB8IC1nb3VsZCB8IC1jYm0gfCAtbnMgfCAtbWFzc2NvbXAgfCBcCisJLWFwcGxlKQorCQlvcz0KKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1oaXV4KikKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwktc2NvNSkKKwkJb3M9c2NvMy4ydjUKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY280KQorCQlvcz0tc2NvMy4ydjQKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28zLjIuWzQtOV0qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvc2NvMy4yLi9zY28zLjJ2LydgCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4ydls0LTldKikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1pc2MpCisJCW9zPS1pc2MyLjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1jbGl4KikKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKKwkJOzsKKwktaXNjKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1seW54KikKKwkJb3M9LWx5bnhvcworCQk7OworCS1wdHgqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKKwkJOzsKKwktd2luZG93c250KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAorCQk7OworCS1wc29zKikKKwkJb3M9LXBzb3MKKwkJOzsKK2VzYWMKKworIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KKwkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgorCXRhaG9lIHwgaTg2MCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKKwkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJCXwgdHJvbiB8IGEyOWsgfCA1ODAgfCBpOTYwIHwgaDgzMDAgfCBocHBhIHwgaHBwYTEuMCB8IGhwcGExLjEgXAorCQl8IGFscGhhIHwgYWxwaGFldjUgfCBhbHBoYWV2NTYgfCB3ZTMyayB8IG5zMTZrIHwgY2xpcHBlciBcCisJCXwgaTM3MCB8IHNoIHwgcG93ZXJwYyB8IHBvd2VycGNsZSB8IDE3NTBhIHwgZHNwMTZ4eCB8IHBkcDExIFwKKwkJfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCB8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJCXwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKKwkJfCBzcGFyYyB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmM2NCB8IHY4NTApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWlbMzQ1Nl04NikKKwkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKKwkgIDs7CisJIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KKwkqLSotKikKKwkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCisJCWV4aXQgMQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCisJdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2XTg2LSogfCBpODYwLSogfCBtMzJyLSogfCBtNjhrLSogfCBtNjgwMDAtKiBcCisJICAgICAgfCBtODhrLSogfCBzcGFyYy0qIHwgbnMzMmstKiB8IGZ4ODAtKiB8IGFyYy0qIHwgYXJtLSogfCBjWzEyM10qIFwKKwkgICAgICB8IG1pcHMtKiB8IHB5cmFtaWQtKiB8IHRyb24tKiB8IGEyOWstKiB8IHJvbXAtKiB8IHJzNjAwMC0qIFwKKwkgICAgICB8IHBvd2VyLSogfCBub25lLSogfCA1ODAtKiB8IGNyYXkyLSogfCBoODMwMC0qIHwgaTk2MC0qIFwKKwkgICAgICB8IHhtcC0qIHwgeW1wLSogfCBocHBhLSogfCBocHBhMS4wLSogfCBocHBhMS4xLSogXAorCSAgICAgIHwgYWxwaGEtKiB8IGFscGhhZXY1LSogfCBhbHBoYWV2NTYtKiB8IHdlMzJrLSogfCBjeWRyYS0qIFwKKwkgICAgICB8IG5zMTZrLSogfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiB8IGNsaXBwZXItKiB8IG9yaW9uLSogXAorCSAgICAgIHwgc3BhcmNsaXRlLSogfCBwZHAxMS0qIHwgc2gtKiB8IHBvd2VycGMtKiB8IHBvd2VycGNsZS0qIFwKKwkgICAgICB8IHNwYXJjNjQtKiB8IG1pcHM2NC0qIHwgbWlwc2VsLSogXAorCSAgICAgIHwgbWlwczY0ZWwtKiB8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogIFwKKwkgICAgICB8IG1pcHN0eDM5LSogfCBtaXBzdHgzOWVsLSogXAorCSAgICAgIHwgZjMwMS0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKKwkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgorCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKKwkJOzsKKwkzYiopCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kYWhsKQorCQliYXNpY19tYWNoaW5lPTU4MC1hbWRhaGwKKwkJb3M9LXN5c3YKKwkJOzsKKwlhbWlnYSB8IGFtaWdhLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1jYm0KKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwlhbWlnYXVuaXggfCBhbWl4KQorCQliYXNpY19tYWNoaW5lPW02OGstY2JtCisJCW9zPS1zeXN2NAorCQk7OworCWFwb2xsbzY4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCisJCW9zPS1zeXN2CisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwljb252ZXgtYzEpCisJCWJhc2ljX21hY2hpbmU9YzEtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzIpCisJCWJhc2ljX21hY2hpbmU9YzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzMyKQorCQliYXNpY19tYWNoaW5lPWMzMi1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzQpCisJCWJhc2ljX21hY2hpbmU9YzM0LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzOCkKKwkJYmFzaWNfbWFjaGluZT1jMzgtY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljcmF5IHwgeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwljcmF5MikKKwkJYmFzaWNfbWFjaGluZT1jcmF5Mi1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwlbY3RqXTkwLWNyYXkpCisJCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCWNyZHMgfCB1bm9zKQorCQliYXNpY19tYWNoaW5lPW02OGstY3JkcworCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWZ4MjgwMCkKKwkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKKwkJOzsKKwlnZW5peCkKKwkJYmFzaWNfbWFjaGluZT1uczMyay1ucworCQk7OworCWdtaWNybykKKwkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybworCQlvcz0tc3lzdgorCQk7OworCWgzMDUwciogfCBoaXV4KikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwloODMwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs3WzAtOV1bMC05XSB8IGhwN1swLTldWzAtOV0gfCBocDlrOFswLTldNyB8IGhwOFswLTldNykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCisJCTs7CisJaHBwYS1uZXh0KQorCQlvcz0tbmV4dHN0ZXAzCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisjIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KKwlpWzM0NTZdODZ2MzIpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdjMyCisJCTs7CisJaVszNDU2XTg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaVszNDU2XTg2dikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2CisJCTs7CisJaVszNDU2XTg2c29sMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zb2xhcmlzMgorCQk7OworCWlyaXMgfCBpcmlzNGQpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1pcml4KikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LWlyaXg0CisJCQk7OworCQllc2FjCisJCTs7CisJaXNpNjggfCBpc2kpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKKwkJb3M9LXN5c3YKKwkJOzsKKwltODhrLW9tcm9uKikKKwkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCisJCTs7CisJbWFnbnVtIHwgbTMyMzApCisJCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCisJCW9zPS1zeXN2CisJCTs7CisJbWVybGluKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKKwkJb3M9LXN5c3YKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwltaXBzZWwqLWxpbnV4KikKKwkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwcyotbGludXgqKQorCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQlvcz0tbGludXgtZ251CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXdzIHwgbmV3czcwMCB8IG5ld3M4MDAgfCBuZXdzOTAwKQorCQliYXNpY19tYWNoaW5lPW02OGstc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3czEwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDMwLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5ld3MtMzYwMCB8IHJpc2MtbmV3cykKKwkJYmFzaWNfbWFjaGluZT1taXBzLXNvbnkKKwkJb3M9LW5ld3NvcworCQk7OworCW5leHQgfCBtKi1uZXh0ICkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKKwkJY2FzZSAkb3MgaW4KKwkJICAgIC1uZXh0c3RlcCogKQorCQkJOzsKKwkJICAgIC1uczIqKQorCQkgICAgICBvcz0tbmV4dHN0ZXAyCisJCQk7OworCQkgICAgKikKKwkJICAgICAgb3M9LW5leHRzdGVwMworCQkJOzsKKwkJZXNhYworCQk7OworCW5oMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5oWzQ1XTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcworCQlvcz0tY3h1eAorCQk7OworCW5pbmR5OTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKKwkJb3M9LW5pbmR5CisJCTs7CisJbnAxKQorCQliYXNpY19tYWNoaW5lPW5wMS1nb3VsZAorCQk7OworCXBhLWhpdGFjaGkpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJcGFyYWdvbikKKwkJYmFzaWNfbWFjaGluZT1pODYwLWludGVsCisJCW9zPS1vc2YKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisgICAgICAgIHBjNTMyIHwgcGM1MzItKikKKwkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgorCQk7OworCXBlbnRpdW0gfCBwNSkKKwkJYmFzaWNfbWFjaGluZT1pNTg2LWludGVsCisJCTs7CisJcGVudGl1bXBybyB8IHA2KQorCQliYXNpY19tYWNoaW5lPWk2ODYtaW50ZWwKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qKQorCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtcHJvLSogfCBwNi0qKQorCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlrNSkKKwkJIyBXZSBkb24ndCBoYXZlIHNwZWNpZmljIHN1cHBvcnQgZm9yIEFNRCdzIEs1IHlldCwgc28ganVzdCBjYWxsIGl0IGEgUGVudGl1bQorCQliYXNpY19tYWNoaW5lPWk1ODYtYW1kCisJCTs7CisJbmV4ZW4pCisJCSMgV2UgZG9uJ3QgaGF2ZSBzcGVjaWZpYyBzdXBwb3J0IGZvciBOZXhnZW4geWV0LCBzbyBqdXN0IGNhbGwgaXQgYSBQZW50aXVtCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1uZXhnZW4KKwkJOzsKKwlwbikKKwkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAorCQk7OworCXBvd2VyKQliYXNpY19tYWNoaW5lPXJzNjAwMC1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJICAgICAgICA7OworCXBwYy0qKQliYXNpY19tYWNoaW5lPXBvd2VycGMtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGNsZSB8IHBvd2VycGNsaXR0bGUgfCBwcGMtbGUgfCBwb3dlcnBjLWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtdW5rbm93bgorCSAgICAgICAgOzsKKwlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBzMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzZXF1ZW50KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQk7OworCXNoKQorCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKKwkJb3M9LWhtcworCQk7OworCXNwczcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1idWxsCisJCW9zPS1zeXN2MgorCQk7OworCXNwdXIpCisJCWJhc2ljX21hY2hpbmU9c3B1ci11bmtub3duCisJCTs7CisJc3VuMikKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCTs7CisJc3VuMm9zMykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW4yb3M0KQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjNvczMpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjNvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJb3M9LXN1bm9zNAorCQk7OworCXN1bjRvczMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczMKKwkJOzsKKwlzdW40b3M0KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNHNvbDIpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zb2xhcmlzMgorCQk7OworCXN1bjMgfCBzdW4zLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zdW4KKwkJOzsKKwlzdW40KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCXN1bjM4NiB8IHN1bjM4NmkgfCByb2FkcnVubmVyKQorCQliYXNpY19tYWNoaW5lPWkzODYtc3VuCisJCTs7CisJc3ltbWV0cnkpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCW9zPS1keW5peAorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b3dlciB8IHRvd2VyLTMyKQorCQliYXNpY19tYWNoaW5lPW02OGstbmNyCisJCTs7CisJdWRpMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCisJCW9zPS11ZGkKKwkJOzsKKwl1bHRyYTMpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKKwkJb3M9LXN5bTEKKwkJOzsKKwl2YXh2KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwl2bXMpCisJCWJhc2ljX21hY2hpbmU9dmF4LWRlYworCQlvcz0tdm1zCisJCTs7CisJdnBwKnx2eHx2eC0qKQorICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKyAgICAgICAgICAgICAgIDs7CisJdnh3b3Jrczk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3M2OCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXZ4d29ya3MyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKKwkJb3M9LXZ4d29ya3MKKwkJOzsKKwl4bXApCisJCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworICAgICAgICB4cHMgfCB4cHMxMDApCisJCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAorCQk7OworCW5vbmUpCisJCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCisJCW9zPS1ub25lCisJCTs7CisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KKyMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KKwltaXBzKQorCQlpZiBbIHgkb3MgPSB4LWxpbnV4LWdudSBdOyB0aGVuCisJCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgorCQllbHNlCisJCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcworCQlmaQorCQk7OworCXJvbXApCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlyczYwMDApCisJCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQorCQk7OworCXZheCkKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCTs7CisJcGRwMTEpCisJCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCisJCTs7CisJd2UzMmspCisJCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0CisJCTs7CisJc3BhcmMpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisgICAgICAgIGN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKwktc29sYXJpczEgfCAtc29sYXJpczEuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAorCQk7OworCS1zb2xhcmlzKQorCQlvcz0tc29sYXJpczIKKwkJOzsKKwktc3ZyNCopCisJCW9zPS1zeXN2NAorCQk7OworCS11bml4d2FyZSopCisJCW9zPS1zeXN2NC4ydXcKKwkJOzsKKwktZ251L2xpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKKwkJOzsKKwkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgorCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCisJIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KKwkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCisJLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAorCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKKwkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKKwkgICAgICB8IC1hb3MqIFwKKwkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAorCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAorCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1mcmVlYnNkKiB8IC1yaXNjaXgqIFwKKwkgICAgICB8IC1seW54b3MqIHwgLWJvc3gqIHwgLW5leHRzdGVwKiB8IC1jeHV4KiB8IC1hb3V0KiB8IC1lbGYqIFwKKwkgICAgICB8IC1wdHgqIHwgLWNvZmYqIHwgLWVjb2ZmKiB8IC13aW5udCogfCAtZG9tYWluKiB8IC12c3RhKiBcCisJICAgICAgfCAtdWRpKiB8IC1lYWJpKiB8IC1saXRlcyogfCAtaWVlZSogfCAtZ28zMiogfCAtYXV4KiBcCisJICAgICAgfCAtY3lnd2luMzIqIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCisJICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC11eHB2KikKKwkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJCTs7CisJLWxpbnV4KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGxpbnV4fGxpbnV4LWdudXwnYAorCQk7OworCS1zdW5vczUqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M1fHNvbGFyaXMyfCdgCisJCTs7CisJLXN1bm9zNiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczZ8c29sYXJpczN8J2AKKwkJOzsKKwktb3Nmcm9zZSopCisJCW9zPS1vc2Zyb3NlCisJCTs7CisJLW9zZiopCisJCW9zPS1vc2YKKwkJOzsKKwktdXRlayopCisJCW9zPS1ic2QKKwkJOzsKKwktZHluaXgqKQorCQlvcz0tYnNkCisJCTs7CisJLWFjaXMqKQorCQlvcz0tYW9zCisJCTs7CisJLWN0aXgqIHwgLXV0cyopCisJCW9zPS1zeXN2CisJCTs7CisJLW5zMiApCisJICAgICAgICBvcz0tbmV4dHN0ZXAyCisJCTs7CisJIyBQcmVzZXJ2ZSB0aGUgdmVyc2lvbiBudW1iZXIgb2Ygc2luaXg1LgorCS1zaW5peDUuKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNpbml4fHN5c3Z8J2AKKwkJOzsKKwktc2luaXgqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdHJpdG9uKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLW9zcyopCisJCW9zPS1zeXN2MworCQk7OworCS1zdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwktc3ZyMykKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN5c3ZyNCkKKwkJb3M9LXN5c3Y0CisJCTs7CisJIyBUaGlzIG11c3QgY29tZSBhZnRlciAtc3lzdnI0LgorCS1zeXN2KikKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1hY29ybikKKwkJb3M9LXJpc2NpeDEuMgorCQk7OworCWFybSotc2VtaSkKKwkJb3M9LWFvdXQKKwkJOzsKKyAgICAgICAgcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWlibSkKKwkJb3M9LWFpeAorCQk7OworCSotaHApCisJCW9zPS1ocHV4CisJCTs7CisJKi1oaXRhY2hpKQorCQlvcz0taGl1eAorCQk7OworCWk4NjAtKiB8ICotYXR0IHwgKi1uY3IgfCAqLWFsdG9zIHwgKi1tb3Rvcm9sYSB8ICotY29udmVyZ2VudCkKKwkJb3M9LXN5c3YKKwkJOzsKKwkqLWNibSkKKwkJb3M9LWFtaWdhb3MKKwkJOzsKKwkqLWRnKQorCQlvcz0tZGd1eAorCQk7OworCSotZG9scGhpbikKKwkJb3M9LXN5c3YzCisJCTs7CisJbTY4ay1jY3VyKQorCQlvcz0tcnR1CisJCTs7CisJbTg4ay1vbXJvbiopCisJCW9zPS1sdW5hCisJCTs7CisJKi1uZXh0ICkKKwkJb3M9LW5leHRzdGVwCisJCTs7CisJKi1zZXF1ZW50KQorCQlvcz0tcHR4CisJCTs7CisJKi1jcmRzKQorCQlvcz0tdW5vcworCQk7OworCSotbnMpCisJCW9zPS1nZW5peAorCQk7OworCWkzNzAtKikKKwkJb3M9LW12cworCQk7OworCSotbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworICAgICAgICAqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworICAgICAgICAqLWhpZ2hsZXZlbCkKKwkJb3M9LWJzZAorCQk7OworCSotZW5jb3JlKQorCQlvcz0tYnNkCisJCTs7CisgICAgICAgICotc2dpKQorCQlvcz0taXJpeAorCQk7OworICAgICAgICAqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzAxLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKikKKwkJb3M9LW5vbmUKKwkJOzsKK2VzYWMKK2ZpCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCisjIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgordmVuZG9yPXVua25vd24KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkqLXVua25vd24pCisJCWNhc2UgJG9zIGluCisJCQktcmlzY2l4KikKKwkJCQl2ZW5kb3I9YWNvcm4KKwkJCQk7OworCQkJLXN1bm9zKikKKwkJCQl2ZW5kb3I9c3VuCisJCQkJOzsKKwkJCS1haXgqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS12eHNpbSogfCAtdnh3b3JrcyopCisJCQkJdmVuZG9yPXdycworCQkJCTs7CisJCQktYXV4KikKKwkJCQl2ZW5kb3I9YXBwbGUKKwkJCQk7OworCQllc2FjCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCisJCTs7Citlc2FjCisKK2VjaG8gJGJhc2ljX21hY2hpbmUkb3MKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9jb25maWd1cmUgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29uZmlndXJlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YzlkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvY29uZmlndXJlCkBAIC0wLDAgKzEsMjAxMSBAQAorIyEgL2Jpbi9zaAorCisjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMiAKKyMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorCisjIERlZmF1bHRzOgorYWNfaGVscD0KK2FjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKyMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKK2FjX2hlbHA9IiRhY19oZWxwCisgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIEdOVSBsaWJ0b29sIgorYWNfaGVscD0iJGFjX2hlbHAKKyAgLS1lbmFibGUtc3RhdGljICAgICAgICAgYnVpbGQgc3RhdGljIGxpYnJhcnkgdXNpbmcgR05VIGxpYnRvb2wiCithY19oZWxwPSIkYWNfaGVscAorICAtLWVuYWJsZS1tYXhtZW1bPU5dICAgICBlbmFibGUgdXNlIG9mIHRlbXAgZmlsZXMsIHNldCBtYXggbWVtIHVzYWdlIHRvIE4gTUIiCithY19oZWxwPSIkYWNfaGVscAorIgorCisjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorYnVpbGQ9Tk9ORQorY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQorZXhlY19wcmVmaXg9Tk9ORQoraG9zdD1OT05FCitub19jcmVhdGU9Citub25vcHQ9Tk9ORQorbm9fcmVjdXJzaW9uPQorcHJlZml4PU5PTkUKK3Byb2dyYW1fcHJlZml4PU5PTkUKK3Byb2dyYW1fc3VmZml4PU5PTkUKK3Byb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCitzaWxlbnQ9CitzaXRlPQorc3JjZGlyPQordGFyZ2V0PU5PTkUKK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKK2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJworc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKK2xpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCitkYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCitzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJworc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCitsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2luZm9kaXI9JyR7cHJlZml4fS9pbmZvJworbWFuZGlyPScke3ByZWZpeH0vbWFuJworCisjIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCitzdWJkaXJzPQorTUZMQUdTPSBNQUtFRkxBR1M9CisjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCithY19tYXhfaGVyZV9saW5lcz0xMgorCithY19wcmV2PQorZm9yIGFjX29wdGlvbgorZG8KKworICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KKyAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCisgICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworICAqKSBhY19vcHRhcmc9IDs7CisgIGVzYWMKKworICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorCisgIGNhc2UgIiRhY19vcHRpb24iIGluCisKKyAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICBhY19wcmV2PWJpbmRpciA7OworICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQorICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQorICAgIGFjX3ByZXY9YnVpbGQgOzsKKyAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCisgICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKKworICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKyAgICBhY19wcmV2PWRhdGFkaXIgOzsKKyAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCisgIHwgLS1kYT0qKQorICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCisgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAorICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworCisgIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKKyAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKKyAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7CisgIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAorICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKKyAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgorICAgIHdpdGhfZ2FzPXllcyA7OworCisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgorICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKyAgICBjYXQgPDwgRU9GCitVc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KK09wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCitDb25maWd1cmF0aW9uOgorICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQorICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKyAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCisgIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKK0RpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQorICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKyAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCisgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCisgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQorICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KKyAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKyAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQorICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKK0VPRgorICAgIGNhdCA8PCBFT0YKK0hvc3QgdHlwZToKKyAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKyAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQorICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCitGZWF0dXJlcyBhbmQgcGFja2FnZXM6CisgIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKyAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQorICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorRU9GCisgICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCisgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKyAgICBmaQorICAgIGV4aXQgMCA7OworCisgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorICAgIGFjX3ByZXY9aG9zdCA7OworICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7CisKKyAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQorICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OworICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCisgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKKyAgICBhY19wcmV2PWxpYmRpciA7OworICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCisgICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKKyAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCisgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCisgIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQorICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisKKyAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAorICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCisgIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OworICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCisgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKyAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCisgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQorICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtbmZwIHwgLS1uZnAgfCAtLW5mKQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCisgICAgd2l0aF9mcD1ubyA7OworCisgIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCisgIHwgLS1uby1jciB8IC0tbm8tYykKKyAgICBub19jcmVhdGU9eWVzIDs7CisKKyAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCisgIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQorICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKKworICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCisgIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAorICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCisgICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7CisgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCisgIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCisgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgIGFjX3ByZXY9cHJlZml4IDs7CisgIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKKyAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworCisgIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCisgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKKyAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCisgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKyAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKKworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKKyAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCisgIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKKyAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKKyAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAorICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCisgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKworICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICBzaWxlbnQ9eWVzIDs7CisKKyAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCisgICAgYWNfcHJldj1zYmluZGlyIDs7CisgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgIHwgLS1zYmk9KiB8IC0tc2I9KikKKyAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQorICAgIGFjX3ByZXY9c2l0ZSA7OworICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQorICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CisKKyAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKKyAgICBhY19wcmV2PXNyY2RpciA7OworICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQorICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKworICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorICAgIGFjX3ByZXY9dGFyZ2V0IDs7CisgIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKKyAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisKKyAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKKyAgICB2ZXJib3NlPXllcyA7OworCisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQorICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyIgorICAgIGV4aXQgMCA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKyAgICAgICo9KikgOzsKKyAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKyAgICBlc2FjCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKyAgICBmaQorICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCisgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OworCisgIC0teCkKKyAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCisgICAgd2l0aF94PXllcyA7OworCisgIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKKyAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKKyAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKKyAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQorICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OworCisgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorICAgIDs7CisKKyAgKj0qKQorICAgIHZhcm5hbWU9YGVjaG8gIiRhY19vcHRpb24ifHNlZCAtZSAncy89LiovLydgCisgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJHZhcm5hbWV8IHNlZCAncy9bYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKyAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJHZhcm5hbWU6IGludmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICB2YWw9ImBlY2hvICIkYWNfb3B0aW9uInxzZWQgJ3MvW149XSo9Ly8nYCIKKyAgICB0ZXN0IC1uICIkdmVyYm9zZSIgJiYgZWNobyAiCXNldHRpbmcgc2hlbGwgdmFyaWFibGUgJHZhcm5hbWUgdG8gJHZhbCIKKyAgICBldmFsICIkdmFybmFtZT0nJHZhbCciCisgICAgZXZhbCAiZXhwb3J0ICR2YXJuYW1lIiA7OworCisgICopCisgICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKKyAgICBmaQorICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgorICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9CisgICAgZmkKKyAgICBub25vcHQ9IiRhY19vcHRpb24iCisgICAgOzsKKworICBlc2FjCitkb25lCisKK2lmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgorICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KK2ZpCisKK3RyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1CisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4uL2NvbmZpZy5sb2cKKworZWNobyAiXAorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisiIDE+JjUKKworIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCisjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KK2FjX2NvbmZpZ3VyZV9hcmdzPQorZm9yIGFjX2FyZworZG8KKyAgY2FzZSAiJGFjX2FyZyIgaW4KKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKyAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7CisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7CisgIGVzYWMKK2RvbmUKKworIyBOTFMgbnVpc2FuY2VzLgorIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCisjIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKyMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KK2lmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKK2lmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KK2VjaG8gPiBjb25mZGVmcy5oCisKKyMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKyMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCithY191bmlxdWVfZmlsZT1qY21hc3Rlci5jCisKKyMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KK2lmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCisgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgorICBhY19wcm9nPSQwCisgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCisgIHNyY2Rpcj0kYWNfY29uZmRpcgorICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KKyAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKyAgZWxzZQorICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9CisgIGZpCitmaQorc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCisKKyMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCitpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCisgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBlbHNlCisgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorICBmaQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKKyAgICAuICIkYWNfc2l0ZV9maWxlIgorICBmaQorZG9uZQorCisKK2FjX2V4dD1jCisjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisKK2lmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCisgICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgorICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorICAgIGFjX249IGFjX2M9JworJyBhY190PScJJworICBlbHNlCisgICAgYWNfbj0tbiBhY19jPSBhY190PQorICBmaQorZWxzZQorICBhY19uPSBhY19jPSdcYycgYWNfdD0KK2ZpCisKKworCisjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjUzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCisgICAgICBicmVhaworICAgIGZpCisgIGRvbmUKKyAgSUZTPSIkYWNfc2F2ZV9pZnMiCitmaQorZmkKK0NDPSIkYWNfY3ZfcHJvZ19DQyIKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NTY3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCisgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KKyAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKyAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisJY29udGludWUKKyAgICAgIGZpCisgICAgICBhY19jdl9wcm9nX0NDPSJjYyIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX2lmcyIKK2lmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgorICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgc2hpZnQKKyAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorICAgIHNoaWZ0CisgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCisgIGZpCitmaQorZmkKK2ZpCitDQz0iJGFjX2N2X3Byb2dfQ0MiCitpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKK2Vsc2UKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorCisgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CitmaQorCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjYxNTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKworYWNfZXh0PWMKKyMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCitjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNjI1ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKK21haW4oKXtyZXR1cm4oMCk7fQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjYyOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCisgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKyAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubworICBlbHNlCisgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKyAgZmkKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KK2ZpCitybSAtZnIgY29uZnRlc3QqCisKK2VjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgoraWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY0OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Citjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjY1NDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fR05VQ19fCisgIHllczsKKyNlbmRpZgorRU9GCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NjYzOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYWNfY3ZfcHJvZ19nY2M9eWVzCitlbHNlCisgIGFjX2N2X3Byb2dfZ2NjPW5vCitmaQorZmkKKworZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgorCitpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorICBHQ0M9eWVzCisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLU8yIgorZWxzZQorICBHQ0M9CisgIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLU8iCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6NjgxOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0CisgICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCisgIENQUD0iJHtDQy1jY30gLUUiCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDY5NiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDcxMyAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CitTeW50YXggRXJyb3IKK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6NzE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICA6CitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBDUFA9L2xpYi9jcHAKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKK2Vsc2UKKyAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCitmaQorZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjc0MjogY2hlY2tpbmcgZm9yIGZ1bmN0aW9uIHByb3RvdHlwZXMiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2lqZ19jdl9oYXZlX3Byb3RvdHlwZXMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA3NDcgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgdGVzdGZ1bmN0aW9uIChpbnQgYXJnMSwgaW50ICogYXJnMik7IC8qIGNoZWNrIHByb3RvdHlwZXMgKi8KK3N0cnVjdCBtZXRob2RzX3N0cnVjdCB7CQkvKiBjaGVjayBtZXRob2QtcG9pbnRlciBkZWNsYXJhdGlvbnMgKi8KKyAgaW50ICgqZXJyb3JfZXhpdCkgKGNoYXIgKm1zZ3RleHQpOworICBpbnQgKCp0cmFjZV9tZXNzYWdlKSAoY2hhciAqbXNndGV4dCk7CisgIGludCAoKmFub3RoZXJfbWV0aG9kKSAodm9pZCk7Cit9OworaW50IHRlc3RmdW5jdGlvbiAoaW50IGFyZzEsIGludCAqIGFyZzIpIC8qIGNoZWNrIGRlZmluaXRpb25zICovCit7IHJldHVybiBhcmcyW2FyZzFdOyB9CitpbnQgdGVzdDJmdW5jdGlvbiAodm9pZCkJLyogY2hlY2sgdm9pZCBhcmcgbGlzdCAqLworeyByZXR1cm4gMDsgfQorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3NjU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaGF2ZV9wcm90b3R5cGVzPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMiIDE+JjYKK2lmIHRlc3QgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUyAKK0VPRgorCitlbHNlCisgIGVjaG8gWW91ciBjb21waWxlciBkb2VzIG5vdCBzZWVtIHRvIGtub3cgYWJvdXQgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAgZWNobyBQZXJoYXBzIGl0IG5lZWRzIGEgc3BlY2lhbCBzd2l0Y2ggdG8gZW5hYmxlIEFOU0kgQyBtb2RlLgorICBlY2hvIElmIHNvLCB3ZSByZWNvbW1lbmQgcnVubmluZyBjb25maWd1cmUgbGlrZSB0aGlzOgorICBlY2hvICIgICAuL2NvbmZpZ3VyZSAgQ0M9J2NjIC1zd2l0Y2gnIgorICBlY2hvIHdoZXJlIC1zd2l0Y2ggaXMgdGhlIHByb3BlciBzd2l0Y2guCitmaQorYWNfc2FmZT1gZWNobyAic3RkZGVmLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0ZGRlZi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo3OTI6IGNoZWNraW5nIGZvciBzdGRkZWYuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgNzk3ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVERERUZfSCAKK0VPRgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworYWNfc2FmZT1gZWNobyAic3RkbGliLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0ZGxpYi5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4Mjg6IGNoZWNraW5nIGZvciBzdGRsaWIuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODMzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODM4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAKK0VPRgorCitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworYWNfc2FmZT1gZWNobyAic3RyaW5nLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHN0cmluZy5oIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZTo4NjQ6IGNoZWNraW5nIGZvciBzdHJpbmcuaCIgPiY1CitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgODY5ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KK0VPRgorYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKK3sgKGV2YWwgZWNobyBjb25maWd1cmU6ODc0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCitpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCitlbHNlCisgIGVjaG8gIiRhY19lcnIiID4mNQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorICA6CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE5FRURfQlNEX1NUUklOR1MgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6OTAwOiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDkwMiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIE5FRURfQlNEX1NUUklOR1MKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCit0eXBlZGVmIHNpemVfdCBteV9zaXplX3Q7CisKK2ludCBtYWluKCkgeworIG15X3NpemVfdCBmb292YXI7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjkyMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9eWVzCitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9Im5vdCBBTlNJLCBwZXJoYXBzIGl0IGlzIGluIHN5cy90eXBlcy5oIgorZmkKK3JtIC1mIGNvbmZ0ZXN0KgorZWNobyAiJGFjX3QiIiRpamdfc2l6ZV90X29rIiAxPiY2CitpZiB0ZXN0ICIkaWpnX3NpemVfdF9vayIgIT0geWVzOyB0aGVuCithY19zYWZlPWBlY2hvICJzeXMvdHlwZXMuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc3lzL3R5cGVzLmgiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjkzNzogY2hlY2tpbmcgZm9yIHN5cy90eXBlcy5oIiA+JjUKK2lmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5NDIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorRU9GCithY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5NDc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CithY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKK2lmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKK2Vsc2UKKyAgZWNobyAiJGFjX2VyciIgPiY1CisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX1NZU19UWVBFU19IIAorRU9GCisKK2NhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDk2OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgZWdyZXAgInNpemVfdCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX3NpemVfdF9vaz0ic2l6ZV90IGlzIGluIHN5cy90eXBlcy5oIgorZWxzZQorICBybSAtcmYgY29uZnRlc3QqCisgIGlqZ19zaXplX3Rfb2s9bm8KK2ZpCitybSAtZiBjb25mdGVzdCoKKworZWxzZQorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2lqZ19zaXplX3Rfb2s9bm8KK2ZpCisKK2VjaG8gIiRhY190IiIkaWpnX3NpemVfdF9vayIgMT4mNgoraWYgdGVzdCAiJGlqZ19zaXplX3Rfb2siID0gbm87IHRoZW4KKyAgZWNobyBUeXBlIHNpemVfdCBpcyBub3QgZGVmaW5lZCBpbiBhbnkgb2YgdGhlIHVzdWFsIHBsYWNlcy4KKyAgZWNobyBUcnkgcHV0dGluZyAnInR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsiJyBpbiBqY29uZmlnLmguCitmaQorZmkKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHVuc2lnbmVkIGNoYXIiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjk5NDogY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgY2hhciIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSA5OTYgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCitpbnQgbWFpbigpIHsKKyB1bnNpZ25lZCBjaGFyIHVuX2NoYXI7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEwMDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSIAorRU9GCisKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHlwZSB1bnNpZ25lZCBzaG9ydCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTAxODogY2hlY2tpbmcgZm9yIHR5cGUgdW5zaWduZWQgc2hvcnQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTAyMCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworIHVuc2lnbmVkIHNob3J0IHVuX3Nob3J0OyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDI3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciB0eXBlIHZvaWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEwNDI6IGNoZWNraW5nIGZvciB0eXBlIHZvaWQiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTA0NCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKy8qIENhdXRpb246IGEgQysrIGNvbXBpbGVyIHdpbGwgaW5zaXN0IG9uIHZhbGlkIHByb3RvdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAqIHZvaWRfcHRyOwkvKiBjaGVjayB2b2lkICogKi8KKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHB0ciB0byBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCAqLwordHlwZWRlZiB2b2lkICgqdm9pZF9mdW5jKSAoaW50IGEsIGludCBiKTsKKyNlbHNlCit0eXBlZGVmIHZvaWQgKCp2b2lkX2Z1bmMpICgpOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMJCS8qIGNoZWNrIHZvaWQgZnVuY3Rpb24gcmVzdWx0ICovCit2b2lkIHRlc3QzZnVuY3Rpb24gKHZvaWRfcHRyIGFyZzEsIHZvaWRfZnVuYyBhcmcyKQorI2Vsc2UKK3ZvaWQgdGVzdDNmdW5jdGlvbiAoYXJnMSwgYXJnMikKKyAgICAgdm9pZF9wdHIgYXJnMTsKKyAgICAgdm9pZF9mdW5jIGFyZzI7CisjZW5kaWYKK3sKKyAgY2hhciAqIGxvY3B0ciA9IChjaGFyICopIGFyZzE7IC8qIGNoZWNrIGNhc3RpbmcgdG8gYW5kIGZyb20gdm9pZCAqICovCisgIGFyZzEgPSAodm9pZCAqKSBsb2NwdHI7CisgICgqYXJnMikgKDEsIDIpOwkJLyogY2hlY2sgY2FsbCBvZiBmY24gcmV0dXJuaW5nIHZvaWQgKi8KK30KKworaW50IG1haW4oKSB7CisgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA3MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgdm9pZCBjaGFyCitFT0YKKworZmkKK3JtIC1mIGNvbmZ0ZXN0KgorCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTA4ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorZWxzZQorICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMDkzICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisKKy8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCit0eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7CisvKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLworY2hhciBjb25zdCAqY29uc3QgKmNjcDsKK2NoYXIgKipwOworLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KK3N0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKK3N0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OworLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgorICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCisgICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLworY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOworY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOworLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KKysrY2NwOworcCA9IChjaGFyKiopIGNjcDsKK2NjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOworeyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KKyAgY2hhciAqdDsKKyAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKKworICAqdCsrID0gMDsKK30KK3sgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCisgIGludCB4W10gPSB7MjUsIDE3fTsKKyAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKKyAgKytmb287Cit9Cit7IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KKyAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7CisgIGlwdHIgcCA9IDA7CisgICsrcDsKK30KK3sgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZworICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCisgIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07CisgIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKK30KK3sgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCisgIGNvbnN0IGludCBmb28gPSAxMDsKK30KKworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNDI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PXllcworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBhY19jdl9jX2NvbnN0PW5vCitmaQorcm0gLWYgY29uZnRlc3QqCitmaQorCitlY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKK2lmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgY29uc3QgCitFT0YKKworZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTE2MzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CitpamdfY3ZfaW5saW5lPSIiCitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMTY2ICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7Cit9IF9faW5saW5lX18gaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTc0OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2lubGluZT0iX19pbmxpbmVfXyIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE4MiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSBfX2lubGluZSBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQoraW50IGJhcigpIHsgcmV0dXJuIGZvbygpOworOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExOTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBpamdfY3ZfaW5saW5lPSJfX2lubGluZSIKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTE5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKK2ludCBtYWluKCkgeworfSBpbmxpbmUgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KK2ludCBiYXIoKSB7IHJldHVybiBmb28oKTsKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgaWpnX2N2X2lubGluZT0iaW5saW5lIgorZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2VjaG8gIiRhY190IiIkaWpnX2N2X2lubGluZSIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyNkZWZpbmUgSU5MSU5FICRpamdfY3ZfaW5saW5lCitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJyb2tlbiBpbmNvbXBsZXRlIHR5cGVzIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMjI0OiBjaGVja2luZyBmb3IgYnJva2VuIGluY29tcGxldGUgdHlwZXMiID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTIyNiAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisgdHlwZWRlZiBzdHJ1Y3QgdW5kZWZpbmVkX3N0cnVjdHVyZSAqIHVuZGVmX3N0cnVjdF9wdHI7IAoraW50IG1haW4oKSB7CisKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjMzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm9rIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJicm9rZW4iIDE+JjYKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiAKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hvcnQgZXh0ZXJuYWwgbmFtZXMiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNDg6IGNoZWNraW5nIGZvciBzaG9ydCBleHRlcm5hbCBuYW1lcyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxMjUwICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IHBvc3NpYmx5X2R1cGxpY2F0ZV9mdW5jdGlvbiAoKSB7IHJldHVybiAwOyB9CitpbnQgcG9zc2libHlfZHVwbGlfZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfQorCitpbnQgbWFpbigpIHsKKyAKKzsgcmV0dXJuIDA7IH0KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjYwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIib2siIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInNob3J0IiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAKK0VPRgorCitmaQorcm0gLWYgY29uZnRlc3QqCitlY2hvICRhY19uICJjaGVja2luZyB0byBzZWUgaWYgY2hhciBpcyBzaWduZWQiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjEyNzU6IGNoZWNraW5nIHRvIHNlZSBpZiBjaGFyIGlzIHNpZ25lZCIgPiY1CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvIEFzc3VtaW5nIHRoYXQgY2hhciBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuCitlY2hvIElmIGl0IGlzIHVuc2lnbmVkLCB0aGlzIHdpbGwgYmUgYSBsaXR0bGUgYml0IGluZWZmaWNpZW50LgorCitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEyODIgImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfY2hhcl9zaWduZWQgKGludCBhcmcpCisjZWxzZQoraW50IGlzX2NoYXJfc2lnbmVkIChhcmcpCisgICAgIGludCBhcmc7CisjZW5kaWYKK3sKKyAgaWYgKGFyZyA9PSAxODkpIHsJCS8qIGV4cGVjdGVkIHJlc3VsdCBmb3IgdW5zaWduZWQgY2hhciAqLworICAgIHJldHVybiAwOwkJCS8qIHR5cGUgY2hhciBpcyB1bnNpZ25lZCAqLworICB9CisgIGVsc2UgaWYgKGFyZyAhPSAtNjcpIHsJLyogZXhwZWN0ZWQgcmVzdWx0IGZvciBzaWduZWQgY2hhciAqLworICAgIHByaW50ZigiSG1tLCBpdCBzZWVtcyAnY2hhcicgaXMgbm90IGVpZ2h0IGJpdHMgd2lkZSBvbiB5b3VyIG1hY2hpbmUuXG4iKTsKKyAgICBwcmludGYoIkkgZmVhciB0aGUgSlBFRyBzb2Z0d2FyZSB3aWxsIG5vdCB3b3JrIGF0IGFsbC5cblxuIik7CisgIH0KKyAgcmV0dXJuIDE7CQkJLyogYXNzdW1lIGNoYXIgaXMgc2lnbmVkIG90aGVyd2lzZSAqLworfQorY2hhciBzaWduZWRfY2hhcl9jaGVjayA9IChjaGFyKSAoLTY3KTsKK21haW4oKSB7CisgIGV4aXQoaXNfY2hhcl9zaWduZWQoKGludCkgc2lnbmVkX2NoYXJfY2hlY2spKTsKK30KK0VPRgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCit0aGVuCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIENIQVJfSVNfVU5TSUdORUQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIiLi4uICRhY19jIiAxPiY2CitlY2hvICJjb25maWd1cmU6MTMyMzogY2hlY2tpbmcgdG8gc2VlIGlmIHJpZ2h0IHNoaWZ0IGlzIHNpZ25lZCIgPiY1CitpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICBlY2hvICIkYWNfdCIiQXNzdW1pbmcgdGhhdCByaWdodCBzaGlmdCBpcyBzaWduZWQgb24gdGFyZ2V0IG1hY2hpbmUuIiAxPiY2CitlbHNlCisgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKyNsaW5lIDEzMjggImNvbmZpZ3VyZSIKKyNpbmNsdWRlICJjb25mZGVmcy5oIgorCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChsb25nIGFyZykKKyNlbHNlCitpbnQgaXNfc2hpZnRpbmdfc2lnbmVkIChhcmcpCisgICAgIGxvbmcgYXJnOworI2VuZGlmCisvKiBTZWUgd2hldGhlciByaWdodC1zaGlmdCBvbiBhIGxvbmcgaXMgc2lnbmVkIG9yIG5vdC4gKi8KK3sKKyAgbG9uZyByZXMgPSBhcmcgPj4gNDsKKworICBpZiAocmVzID09IC0weDdGN0U4MENMKSB7CS8qIGV4cGVjdGVkIHJlc3VsdCBmb3Igc2lnbmVkIHNoaWZ0ICovCisgICAgcmV0dXJuIDE7CQkJLyogcmlnaHQgc2hpZnQgaXMgc2lnbmVkICovCisgIH0KKyAgLyogc2VlIGlmIHVuc2lnbmVkLXNoaWZ0IGhhY2sgd2lsbCBmaXggaXQuICovCisgIC8qIHdlIGNhbid0IGp1c3QgdGVzdCBleGFjdCB2YWx1ZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHdpZHRoIG9mIGxvbmcuLi4gKi8KKyAgcmVzIHw9ICh+MEwpIDw8ICgzMi00KTsKKyAgaWYgKHJlcyA9PSAtMHg3RjdFODBDTCkgewkvKiBleHBlY3RlZCByZXN1bHQgbm93PyAqLworICAgIHJldHVybiAwOwkJCS8qIHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkICovCisgIH0KKyAgcHJpbnRmKCJSaWdodCBzaGlmdCBpc24ndCBhY3RpbmcgYXMgSSBleHBlY3QgaXQgdG8uXG4iKTsKKyAgcHJpbnRmKCJJIGZlYXIgdGhlIEpQRUcgc29mdHdhcmUgd2lsbCBub3Qgd29yayBhdCBhbGwuXG5cbiIpOworICByZXR1cm4gMDsJCQkvKiB0cnkgaXQgd2l0aCB1bnNpZ25lZCBhbnl3YXkgKi8KK30KK21haW4oKSB7CisgIGV4aXQoaXNfc2hpZnRpbmdfc2lnbmVkKC0weDdGN0U4MEIxTCkpOworfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNTg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK3RoZW4KKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQgCitFT0YKKworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLWZyIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgdG8gc2VlIGlmIGZvcGVuIGFjY2VwdHMgYiBzcGVjIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxMzc1OiBjaGVja2luZyB0byBzZWUgaWYgZm9wZW4gYWNjZXB0cyBiIHNwZWMiID4mNQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgZWNobyAiJGFjX3QiIkFzc3VtaW5nIHRoYXQgaXQgZG9lcy4iIDE+JjYKK2Vsc2UKKyAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTM4MCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorbWFpbigpIHsKKyAgaWYgKGZvcGVuKCJjb25mdGVzdGRhdGEiLCAid2IiKSAhPSBOVUxMKQorICAgIGV4aXQoMCk7CisgIGV4aXQoMSk7Cit9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTM5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAordGhlbgorICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CitlbHNlCisgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorICBybSAtZnIgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIERPTlRfVVNFX0JfTU9ERSAKK0VPRgorCitmaQorcm0gLWZyIGNvbmZ0ZXN0KgorZmkKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCisgIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKKyAgICBicmVhaworICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCisgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisgICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9CitmaQorYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCithY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKworIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisjIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKKyMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgorIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKKyMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorIyBJUklYIC9zYmluL2luc3RhbGwKKyMgQUlYIC9iaW4vaW5zdGFsbAorIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCisjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorZWNobyAiY29uZmlndXJlOjE0MzY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQoraWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorICAgIGNhc2UgIiRhY19kaXIvIiBpbgorICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworICAgICopCisgICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgaW5zdGFsbGJzZCBzY29pbnN0IGluc3RhbGw7IGRvCisgICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKKyAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KKwkgICAgIyBPU0YvMSBpbnN0YWxsYnNkIGFsc28gdXNlcyBkc3Btc2csIGJ1dCBpcyB1c2FibGUuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorCSAgICBicmVhayAyCisJICBmaQorCWZpCisgICAgICBkb25lCisgICAgICA7OworICAgIGVzYWMKKyAgZG9uZQorICBJRlM9IiRhY19zYXZlX0lGUyIKKworZmkKKyAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorICBlbHNlCisgICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQorICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KKyAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKyAgZmkKK2ZpCitlY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNDg4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQoraWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKyAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCisgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIElGUz0iJGFjX3NhdmVfaWZzIgorICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorZmkKK2ZpCitSQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190IiJubyIgMT4mNgorZmkKKworCisjIERlY2lkZSB3aGV0aGVyIHRvIHVzZSBsaWJ0b29sLAorIyBhbmQgaWYgc28gd2hldGhlciB0byBidWlsZCBzaGFyZWQsIHN0YXRpYywgb3IgYm90aCBmbGF2b3JzIG9mIGxpYnJhcnkuCitMVFNIQVJFRD0ibm8iCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIG9yIC0tZGlzYWJsZS1zaGFyZWQgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9zaGFyZWQiCisgIExUU0hBUkVEPSIkZW5hYmxldmFsIgorZmkKKworTFRTVEFUSUM9Im5vIgorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgorICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorICBMVFNUQVRJQz0iJGVuYWJsZXZhbCIKK2ZpCisKK2lmIHRlc3QgIngkTFRTSEFSRUQiICE9IHhubyAgLW8gICJ4JExUU1RBVElDIiAhPSB4bm87IHRoZW4KKyAgVVNFTElCVE9PTD0ieWVzIgorICBMSUJUT09MPSIuL2xpYnRvb2wiCisgIE89ImxvIgorICBBPSJsYSIKKyAgTE49JyQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQyknCisgIElOU1RBTExfTElCPSckKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICR7SU5TVEFMTH0nCisgIElOU1RBTExfUFJPR1JBTT0iXCQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJElOU1RBTExfUFJPR1JBTSIKK2Vsc2UKKyAgVVNFTElCVE9PTD0ibm8iCisgIExJQlRPT0w9IiIKKyAgTz0ibyIKKyAgQT0iYSIKKyAgTE49JyQoQ0MpJworICBJTlNUQUxMX0xJQj0iJElOU1RBTExfREFUQSIKK2ZpCisKKworCisKKworCisjIENvbmZpZ3VyZSBsaWJ0b29sIGlmIG5lZWRlZC4KK2lmIHRlc3QgJFVTRUxJQlRPT0wgPSB5ZXM7IHRoZW4KKyAgZGlzYWJsZV9zaGFyZWQ9CisgIGRpc2FibGVfc3RhdGljPQorICBpZiB0ZXN0ICJ4JExUU0hBUkVEIiA9IHhubzsgdGhlbgorICAgIGRpc2FibGVfc2hhcmVkPSItLWRpc2FibGUtc2hhcmVkIgorICBmaQorICBpZiB0ZXN0ICJ4JExUU1RBVElDIiA9IHhubzsgdGhlbgorICAgIGRpc2FibGVfc3RhdGljPSItLWRpc2FibGUtc3RhdGljIgorICBmaQorICAkc3JjZGlyL2x0Y29uZmlnICRkaXNhYmxlX3NoYXJlZCAkZGlzYWJsZV9zdGF0aWMgJHNyY2Rpci9sdG1haW4uc2gKK2ZpCisKKyMgU2VsZWN0IG1lbW9yeSBtYW5hZ2VyIGRlcGVuZGluZyBvbiB1c2VyIGlucHV0LgorIyBJZiBubyAiLWVuYWJsZS1tYXhtZW0iLCB1c2Ugam1lbW5vYnMKK01FTU9SWU1HUj0nam1lbW5vYnMuJChPKScKK01BWE1FTT0ibm8iCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWF4bWVtIG9yIC0tZGlzYWJsZS1tYXhtZW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfbWF4bWVtK3NldH0iID0gc2V0OyB0aGVuCisgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYXhtZW0iCisgIE1BWE1FTT0iJGVuYWJsZXZhbCIKK2ZpCisKKyMgc3VwcG9ydCAtLXdpdGgtbWF4bWVtIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIElKRyBWNS4KKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbWF4bWVtIG9yIC0td2l0aG91dC1tYXhtZW0gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX21heG1lbStzZXR9IiA9IHNldDsgdGhlbgorICB3aXRodmFsPSIkd2l0aF9tYXhtZW0iCisgIE1BWE1FTT0iJHdpdGh2YWwiCitmaQorCitpZiB0ZXN0ICJ4JE1BWE1FTSIgPSB4eWVzOyB0aGVuCisgIE1BWE1FTT0xCitmaQoraWYgdGVzdCAieCRNQVhNRU0iICE9IHhubzsgdGhlbgorICBpZiB0ZXN0IC1uICJgZWNobyAkTUFYTUVNIHwgc2VkICdzL1swLTldLy9nJ2AiOyB0aGVuCisgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBub24tbnVtZXJpYyBhcmd1bWVudCB0byAtLWVuYWJsZS1tYXhtZW0iIDE+JjI7IGV4aXQgMTsgfQorICBmaQorICBERUZBVUxUTUFYTUVNPWBleHByICRNQVhNRU0gXCogMTA0ODU3NmAKK2NhdCA+PiBjb25mZGVmcy5oIDw8RU9GCisjZGVmaW5lIERFRkFVTFRfTUFYX01FTSAke0RFRkFVTFRNQVhNRU19CitFT0YKKworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICd0bXBmaWxlKCknIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNTk2OiBjaGVja2luZyBmb3IgJ3RtcGZpbGUoKSciID4mNQorY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorI2xpbmUgMTU5OCAiY29uZmlndXJlIgorI2luY2x1ZGUgImNvbmZkZWZzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KK2ludCBtYWluKCkgeworIEZJTEUgKiB0ZmlsZSA9IHRtcGZpbGUoKTsgCis7IHJldHVybiAwOyB9CitFT0YKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorTUVNT1JZTUdSPSdqbWVtYW5zaS4kKE8pJworZWxzZQorICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAgcm0gLXJmIGNvbmZ0ZXN0KgorICBlY2hvICIkYWNfdCIibm8iIDE+JjYKK01FTU9SWU1HUj0nam1lbW5hbWUuJChPKScKK2NhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSIAorRU9GCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAnbWt0ZW1wKCknIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjIwOiBjaGVja2luZyBmb3IgJ21rdGVtcCgpJyIgPiY1CitjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCisjbGluZSAxNjIyICJjb25maWd1cmUiCisjaW5jbHVkZSAiY29uZmRlZnMuaCIKKworaW50IG1haW4oKSB7CisgY2hhciBmbmFtZVs4MF07IG1rdGVtcChmbmFtZSk7IAorOyByZXR1cm4gMDsgfQorRU9GCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2Mjk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBybSAtcmYgY29uZnRlc3QqCisgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKK2Vsc2UKKyAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKyAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgIHJtIC1yZiBjb25mdGVzdCoKKyAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CitjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgTk9fTUtURU1QIAorRU9GCisKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCitybSAtZiBjb25mdGVzdCoKK2ZpCisKKworIyBFeHRyYWN0IHRoZSBsaWJyYXJ5IHZlcnNpb24gSUQgZnJvbSBqcGVnbGliLmguCitlY2hvICRhY19uICJjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIiIuLi4gJGFjX2MiIDE+JjYKK2VjaG8gImNvbmZpZ3VyZToxNjUwOiBjaGVja2luZyBsaWJqcGVnIHZlcnNpb24gbnVtYmVyIiA+JjUKK0pQRUdfTElCX1ZFUlNJT049YHNlZCAtZSAnL14jZGVmaW5lIEpQRUdfTElCX1ZFUlNJT04vIWQnIC1lICdzL15bXjAtOV0qXChbMC05XVswLTldKlwpLiokL1wxLycgJHNyY2Rpci9qcGVnbGliLmhgCitlY2hvICIkYWNfdCIiJEpQRUdfTElCX1ZFUlNJT04iIDE+JjYKKworCisjIFByZXBhcmUgdG8gbWFzc2FnZSBtYWtlZmlsZS5jZmcgY29ycmVjdGx5LgoraWYgdGVzdCAkaWpnX2N2X2hhdmVfcHJvdG90eXBlcyA9IHllczsgdGhlbgorICBBMktfREVQUz0iIgorICBDT01fQTJLPSIjICIKK2Vsc2UKKyAgQTJLX0RFUFM9ImFuc2kya25yIgorICBDT01fQTJLPSIiCitmaQorCisKKyMgYW5zaTJrbnIgbmVlZHMgLURCU0QgaWYgc3RyaW5nLmggaXMgbWlzc2luZworaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0cmluZ19oID0gbm87IHRoZW4KKyAgQU5TSTJLTlJGTEFHUz0iLURCU0QiCitlbHNlCisgIEFOU0kyS05SRkxBR1M9IiIKK2ZpCisKKyMgU3Vic3RpdHV0aW9ucyB0byBlbmFibGUgb3IgZGlzYWJsZSBsaWJ0b29sLXJlbGF0ZWQgc3R1ZmYKK2lmIHRlc3QgJFVTRUxJQlRPT0wgPSB5ZXMgLWEgJGlqZ19jdl9oYXZlX3Byb3RvdHlwZXMgPSB5ZXM7IHRoZW4KKyAgQ09NX0xUPSIiCitlbHNlCisgIENPTV9MVD0iIyAiCitmaQorCitpZiB0ZXN0ICJ4JExUU0hBUkVEIiAhPSB4bm87IHRoZW4KKyAgRk9SQ0VfSU5TVEFMTF9MSUI9Imluc3RhbGwtbGliIgorZWxzZQorICBGT1JDRV9JTlNUQUxMX0xJQj0iIgorZmkKKworIyBTZXQgdXAgLUkgZGlyZWN0aXZlcworaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgSU5DTFVERUZMQUdTPSctSSQoc3JjZGlyKScKK2Vsc2UKKyAgSU5DTFVERUZMQUdTPSctSS4gLUkkKHNyY2RpciknCitmaQorCit0cmFwICcnIDEgMiAxNQorCit0cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCisjIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KKyMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgoraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKyAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJworZmkKKwordHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorCitERUZTPS1ESEFWRV9DT05GSUdfSAorCisjIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKworZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworcm0gLWYgJENPTkZJR19TVEFUVVMKK2NhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisjISAvYmluL3NoCisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCisjCisjIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisjIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKK2ZvciBhY19vcHRpb24KK2RvCisgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCisgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CisgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQorICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIiCisgICAgZXhpdCAwIDs7CisgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQorICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKKyAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworICBlc2FjCitkb25lCisKK2FjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCithY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKwordHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZTptYWtlZmlsZS5jZmcgamNvbmZpZy5oOmpjb25maWcuY2ZnIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCisjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKKyBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorJGFjX3Zwc3ViCiskZXh0cmFzdWIKK3MlQENGTEFHU0AlJENGTEFHUyVnCitzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKK3MlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZworcyVAREVGU0AlJERFRlMlZworcyVATERGTEFHU0AlJExERkxBR1MlZworcyVATElCU0AlJExJQlMlZworcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCitzJUBwcmVmaXhAJSRwcmVmaXglZworcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVAYmluZGlyQCUkYmluZGlyJWcKK3MlQHNiaW5kaXJAJSRzYmluZGlyJWcKK3MlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKK3MlQGRhdGFkaXJAJSRkYXRhZGlyJWcKK3MlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKK3MlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZworcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZworcyVAbGliZGlyQCUkbGliZGlyJWcKK3MlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKK3MlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKK3MlQGluZm9kaXJAJSRpbmZvZGlyJWcKK3MlQG1hbmRpckAlJG1hbmRpciVnCitzJUBDQ0AlJENDJWcKK3MlQENQUEAlJENQUCVnCitzJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZworcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKK3MlQFJBTkxJQkAlJFJBTkxJQiVnCitzJUBMSUJUT09MQCUkTElCVE9PTCVnCitzJUBPQCUkTyVnCitzJUBBQCUkQSVnCitzJUBMTkAlJExOJWcKK3MlQElOU1RBTExfTElCQCUkSU5TVEFMTF9MSUIlZworcyVATUVNT1JZTUdSQCUkTUVNT1JZTUdSJWcKK3MlQEpQRUdfTElCX1ZFUlNJT05AJSRKUEVHX0xJQl9WRVJTSU9OJWcKK3MlQEEyS19ERVBTQCUkQTJLX0RFUFMlZworcyVAQ09NX0EyS0AlJENPTV9BMkslZworcyVAQU5TSTJLTlJGTEFHU0AlJEFOU0kyS05SRkxBR1MlZworcyVAQ09NX0xUQCUkQ09NX0xUJWcKK3MlQEZPUkNFX0lOU1RBTExfTElCQCUkRk9SQ0VfSU5TVEFMTF9MSUIlZworcyVASU5DTFVERUZMQUdTQCUkSU5DTFVERUZMQUdTJWcKKworQ0VPRgorRU9GCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKyMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KK2FjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCithY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KK2FjX21vcmVfbGluZXM9OgorYWNfc2VkX2NtZHM9IiIKK3doaWxlICRhY19tb3JlX2xpbmVzOyBkbworICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKyAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorICBlbHNlCisgICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCisgIGZpCisgIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KKyAgICBhY19tb3JlX2xpbmVzPWZhbHNlCisgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCisgIGVsc2UKKyAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCisgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBlbHNlCisgICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKyAgICBmaQorICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAorICAgIGFjX2JlZz0kYWNfZW5kCisgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorICBhY19zZWRfY21kcz1jYXQKK2ZpCitFT0YKKworY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCisKK0NPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlOm1ha2VmaWxlLmNmZyJ9CitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKK2ZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCisgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKyAgY2FzZSAiJGFjX2ZpbGUiIGluCisgICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCisgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CisgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CisgIGVzYWMKKworICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgorCisgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAorICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgorICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCisgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKKyAgZWxzZQorICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9CisgIGZpCisKKyAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KKyAgLikgIHNyY2Rpcj0uCisgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCisgICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKKyAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKKyAgKikgIyBSZWxhdGl2ZSBwYXRoLgorICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCisgICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OworICBlc2FjCisKKyAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCisgIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKyAgZXNhYworCisgIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorICBybSAtZiAiJGFjX2ZpbGUiCisgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorICBjYXNlICIkYWNfZmlsZSIgaW4KKyAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCisjICRjb25maWd1cmVfaW5wdXQiIDs7CisgICopIGFjX2NvbXN1Yj0gOzsKKyAgZXNhYworCisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIHNlZCAtZSAiJGFjX2NvbXN1YgorcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKK3MlQHNyY2RpckAlJHNyY2RpciVnCitzJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCitzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCisiICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCitmaTsgZG9uZQorcm0gLWYgY29uZnRlc3QucyoKKworIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKKyMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKyMKKyMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KK2FjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCithY19kQz0nXDMnCithY19kRD0nJWcnCisjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKK2FjX3VDPScgJworYWNfdUQ9J1w0JWcnCisjIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCithY19lQj0nJCVcMSNcMmRlZmluZVwzJworYWNfZUM9JyAnCithY19lRD0nJWcnCisKK2lmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorICBDT05GSUdfSEVBREVSUz0iamNvbmZpZy5oOmpjb25maWcuY2ZnIgorRU9GCitjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCitmaQorZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCisgIGNhc2UgIiRhY19maWxlIiBpbgorICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICBlc2FjCisKKyAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQorCisgIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0CisgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCisgIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgorCitFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKKyMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKyMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KK3JtIC1mIGNvbmZ0ZXN0LnZhbHMKK2NhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKK3MvW1xcJiVdL1xcJi9nCitzJVtcXCRgXSVcXCYlZworcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKK3MlYWNfZCVhY191JWdwCitzJWFjX3UlYWNfZSVncAorRU9GCitzZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCitybSAtZiBjb25mdGVzdC5oZHIKKworIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgorIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCitjYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKK0VPRgorCisjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKyMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisKK3JtIC1mIGNvbmZ0ZXN0LnRhaWwKK3doaWxlIDoKK2RvCisgIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKyAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgorICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCisgICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUworICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKyAgZWNobyAnQ0VPRgorICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAorICBybSAtZiBjb25mdGVzdC5pbgorICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKycgPj4gJENPTkZJR19TVEFUVVMKKyAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCisgIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKyAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCitkb25lCitybSAtZiBjb25mdGVzdC52YWxzCisKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCisgIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAorICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorICBybSAtZiBjb25mdGVzdC5pbgorICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgorICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKyAgICBybSAtZiBjb25mdGVzdC5oCisgIGVsc2UKKyAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKyAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCisgICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKyAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorICAgIGZpCisgICAgcm0gLWYgJGFjX2ZpbGUKKyAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisgIGZpCitmaTsgZG9uZQorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorCitFT0YKK2NhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKworZXhpdCAwCitFT0YKK2NobW9kICt4ICRDT05GSUdfU1RBVFVTCitybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwordGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9kanBlZy4xIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2RqcGVnLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiZWI2YQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9kanBlZy4xCkBAIC0wLDAgKzEsMjUzIEBACisuVEggREpQRUcgMSAiMjIgQXVndXN0IDE5OTciCisuU0ggTkFNRQorZGpwZWcgXC0gZGVjb21wcmVzcyBhIEpQRUcgZmlsZSB0byBhbiBpbWFnZSBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGRqcGVnCitbCisuSSBvcHRpb25zCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgZGpwZWcKK2RlY29tcHJlc3NlcyB0aGUgbmFtZWQgSlBFRyBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKK2FuZCBwcm9kdWNlcyBhbiBpbWFnZSBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBQQk1QTFVTIChQUE0vUEdNKSwgQk1QLAorR0lGLCBUYXJnYSwgb3IgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0KSBvdXRwdXQgZm9ybWF0IGNhbiBiZSBzZWxlY3RlZC4KKyhSTEUgaXMgc3VwcG9ydGVkIG9ubHkgaWYgdGhlIFVSVCBsaWJyYXJ5IGlzIGF2YWlsYWJsZS4pCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1ncmF5c2NhbGUKK21heSBiZSB3cml0dGVuCisuQiBcLWdyYXkKK29yCisuQlIgXC1nciAuCitNb3N0IG9mIHRoZSAiYmFzaWMiIHN3aXRjaGVzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBhcyBsaXR0bGUgYXMgb25lIGxldHRlci4KK1VwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICh0aHVzCisuQiBcLUJNUAoraXMgdGhlIHNhbWUgYXMKKy5CUiBcLWJtcCApLgorQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sCisuQlIgXC1ncmV5c2NhbGUgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVGhlIGJhc2ljIHN3aXRjaGVzIGFyZToKKy5UUAorLkJJIFwtY29sb3JzICIgTiIKK1JlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29sb3JzIHVzZWQgaW4KK3RoZSBvdXRwdXQgaW1hZ2UsIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBvbiBhIGNvbG9ybWFwcGVkIGRpc3BsYXkgb3IKK3N0b3JlZCBpbiBhIGNvbG9ybWFwcGVkIGZpbGUgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGFuIDgtYml0CitkaXNwbGF5LCB5b3UnZCBuZWVkIHRvIHJlZHVjZSB0byAyNTYgb3IgZmV3ZXIgY29sb3JzLgorLlRQCisuQkkgXC1xdWFudGl6ZSAiIE4iCitTYW1lIGFzCisuQlIgXC1jb2xvcnMgLgorLkIgXC1jb2xvcnMKK2lzIHRoZSByZWNvbW1lbmRlZCBuYW1lLAorLkIgXC1xdWFudGl6ZQoraXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisuVFAKKy5CIFwtZmFzdAorU2VsZWN0IHJlY29tbWVuZGVkIHByb2Nlc3Npbmcgb3B0aW9ucyBmb3IgZmFzdCwgbG93IHF1YWxpdHkgb3V0cHV0LiAgKFRoZQorZGVmYXVsdCBvcHRpb25zIGFyZSBjaG9zZW4gZm9yIGhpZ2hlc3QgcXVhbGl0eSBvdXRwdXQuKSAgQ3VycmVudGx5LCB0aGlzIGlzCitlcXVpdmFsZW50IHRvIFxmQlwtZGN0IGZhc3QgXC1ub3Ntb290aCBcLW9uZXBhc3MgXC1kaXRoZXIgb3JkZXJlZFxmUi4KKy5UUAorLkIgXC1ncmF5c2NhbGUKK0ZvcmNlIGdyYXktc2NhbGUgb3V0cHV0IGV2ZW4gaWYgSlBFRyBmaWxlIGlzIGNvbG9yLiAgVXNlZnVsIGZvciB2aWV3aW5nIG9uCittb25vY2hyb21lIGRpc3BsYXlzOyBhbHNvLAorLkIgZGpwZWcKK3J1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgorLlRQCisuQkkgXC1zY2FsZSAiIE0vTiIKK1NjYWxlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgYSBmYWN0b3IgTS9OLiAgQ3VycmVudGx5IHRoZSBzY2FsZSBmYWN0b3IgbXVzdCBiZQorMS8xLCAxLzIsIDEvNCwgb3IgMS84LiAgU2NhbGluZyBpcyBoYW5keSBpZiB0aGUgaW1hZ2UgaXMgbGFyZ2VyIHRoYW4geW91cgorc2NyZWVuOyBhbHNvLAorLkIgZGpwZWcKK3J1bnMgbXVjaCBmYXN0ZXIgd2hlbiBzY2FsaW5nIGRvd24gdGhlIG91dHB1dC4KKy5UUAorLkIgXC1ibXAKK1NlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQgY29sb3JtYXBwZWQgZm9ybWF0IGlzCitlbWl0dGVkIGlmCisuQiBcLWNvbG9ycworb3IKKy5CIFwtZ3JheXNjYWxlCitpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsgb3RoZXJ3aXNlLCAyNC1iaXQgZnVsbC1jb2xvcgorZm9ybWF0IGlzIGVtaXR0ZWQuCisuVFAKKy5CIFwtZ2lmCitTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQuICBTaW5jZSBHSUYgZG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMjU2IGNvbG9ycywKKy5CIFwtY29sb3JzIDI1NgoraXMgYXNzdW1lZCAodW5sZXNzIHlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4KKy5UUAorLkIgXC1vczIKK1NlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiAxLnggZmxhdm9yKS4gIDgtYml0IGNvbG9ybWFwcGVkIGZvcm1hdCBpcworZW1pdHRlZCBpZgorLkIgXC1jb2xvcnMKK29yCisuQiBcLWdyYXlzY2FsZQoraXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IKK2Zvcm1hdCBpcyBlbWl0dGVkLgorLlRQCisuQiBcLXBubQorU2VsZWN0IFBCTVBMVVMgKFBQTS9QR00pIG91dHB1dCBmb3JtYXQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9ybWF0KS4KK1BHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgorLkIgXC1ncmF5c2NhbGUKK2lzIHNwZWNpZmllZDsgb3RoZXJ3aXNlIFBQTSBpcyBlbWl0dGVkLgorLlRQCisuQiBcLXJsZQorU2VsZWN0IFJMRSBvdXRwdXQgZm9ybWF0LiAgKFJlcXVpcmVzIFVSVCBsaWJyYXJ5LikKKy5UUAorLkIgXC10YXJnYQorU2VsZWN0IFRhcmdhIG91dHB1dCBmb3JtYXQuICBHcmF5LXNjYWxlIGZvcm1hdCBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKK2dyYXktc2NhbGUgb3IgaWYKKy5CIFwtZ3JheXNjYWxlCitpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYKKy5CIFwtY29sb3JzCitpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCisuUFAKK1N3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczoKKy5UUAorLkIgXC1kY3QgaW50CitVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KKy5UUAorLkIgXC1kY3QgZmFzdAorVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgorLlRQCisuQiBcLWRjdCBmbG9hdAorVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCitUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBpbnQgbWV0aG9kLCBidXQgaXMKK211Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUgaGFzIHZlcnkgZmFzdCBmbG9hdGluZy1wb2ludCBoYXJkd2FyZS4gIEFsc28KK25vdGUgdGhhdCByZXN1bHRzIG9mIHRoZSBmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IHZhcnkgc2xpZ2h0bHkgYWNyb3NzCittYWNoaW5lcywgd2hpbGUgdGhlIGludGVnZXIgbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuCitUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZCBpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgorLlRQCisuQiBcLWRpdGhlciBmcworVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorLlRQCisuQiBcLWRpdGhlciBvcmRlcmVkCitVc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorLlRQCisuQiBcLWRpdGhlciBub25lCitEbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCitCeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgdGhpcworaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcyB0aGUgYmVzdCByZXN1bHRzLiAgT3JkZXJlZCBkaXRoZXIgaXMgYSBjb21wcm9taXNlCitiZXR3ZWVuIHNwZWVkIGFuZCBxdWFsaXR5OyBubyBkaXRoZXJpbmcgaXMgZmFzdCBidXQgdXN1YWxseSBsb29rcyBhd2Z1bC4gIE5vdGUKK3RoYXQgdGhlc2Ugc3dpdGNoZXMgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIGNvbG9yIHF1YW50aXphdGlvbiBpcyBiZWluZyBkb25lLgorT3JkZXJlZCBkaXRoZXIgaXMgb25seSBhdmFpbGFibGUgaW4KKy5CIFwtb25lcGFzcworbW9kZS4KKy5UUAorLkJJIFwtbWFwICIgZmlsZSIKK1F1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IKK3Byb2R1Y2luZyBtdWx0aXBsZSBmaWxlcyB3aXRoIGlkZW50aWNhbCBjb2xvciBtYXBzLCBvciBmb3IgZm9yY2luZyBhCitwcmVkZWZpbmVkIHNldCBvZiBjb2xvcnMgdG8gYmUgdXNlZC4gIFRoZQorLkkgZmlsZQorbXVzdCBiZSBhIEdJRiBvciBQUE0gZmlsZS4gVGhpcyBvcHRpb24gb3ZlcnJpZGVzCisuQiBcLWNvbG9ycworYW5kCisuQlIgXC1vbmVwYXNzIC4KKy5UUAorLkIgXC1ub3Ntb290aAorVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KKy5UUAorLkIgXC1vbmVwYXNzCitVc2Ugb25lLXBhc3MgaW5zdGVhZCBvZiB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgb25lLXBhc3MgbWV0aG9kIGlzCitmYXN0ZXIgYW5kIG5lZWRzIGxlc3MgbWVtb3J5LCBidXQgaXQgcHJvZHVjZXMgYSBsb3dlci1xdWFsaXR5IGltYWdlLgorLkIgXC1vbmVwYXNzCitpcyBpZ25vcmVkIHVubGVzcyB5b3UgYWxzbyBzYXkKKy5CIFwtY29sb3JzCisuSVIgTiAuCitBbHNvLCB0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlIG91dHB1dCAodGhlIHR3by1wYXNzCittZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCisuVFAKKy5CSSBcLW1heG1lbW9yeSAiIE4iCitTZXQgbGltaXQgZm9yIGFtb3VudCBvZiBtZW1vcnkgdG8gdXNlIGluIHByb2Nlc3NpbmcgbGFyZ2UgaW1hZ2VzLiAgVmFsdWUgaXMKK2luIHRob3VzYW5kcyBvZiBieXRlcywgb3IgbWlsbGlvbnMgb2YgYnl0ZXMgaWYgIk0iIGlzIGF0dGFjaGVkIHRvIHRoZQorbnVtYmVyLiAgRm9yIGV4YW1wbGUsCisuQiBcLW1heCA0bQorc2VsZWN0cyA0MDAwMDAwIGJ5dGVzLiAgSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQsIHRlbXBvcmFyeSBmaWxlcyB3aWxsIGJlIHVzZWQuCisuVFAKKy5CSSBcLW91dGZpbGUgIiBuYW1lIgorU2VuZCBvdXRwdXQgaW1hZ2UgdG8gdGhlIG5hbWVkIGZpbGUsIG5vdCB0byBzdGFuZGFyZCBvdXRwdXQuCisuVFAKKy5CIFwtdmVyYm9zZQorRW5hYmxlIGRlYnVnIHByaW50b3V0LiAgTW9yZQorLkJSIFwtdiAncworZ2l2ZSBtb3JlIG91dHB1dC4gIEFsc28sIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBhdCBzdGFydHVwLgorLlRQCisuQiBcLWRlYnVnCitTYW1lIGFzCisuQlIgXC12ZXJib3NlIC4KKy5TSCBFWEFNUExFUworLkxQCitUaGlzIGV4YW1wbGUgZGVjb21wcmVzc2VzIHRoZSBKUEVHIGZpbGUgZm9vLmpwZywgcXVhbnRpemVzIGl0IHRvCisyNTYgY29sb3JzLCBhbmQgc2F2ZXMgdGhlIG91dHB1dCBpbiA4LWJpdCBCTVAgZm9ybWF0IGluIGZvby5ibXA6CisuSVAKKy5CIGRqcGVnIFwtY29sb3JzIDI1NiBcLWJtcAorLkkgZm9vLmpwZworLkIgPgorLkkgZm9vLmJtcAorLlNIIEhJTlRTCitUbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlCisuQiBcLWdyYXlzY2FsZQorYW5kL29yCisuQiBcLXNjYWxlCitzd2l0Y2hlcy4KKy5CIFwtZ3JheXNjYWxlIFwtc2NhbGUgMS84CitpcyB0aGUgZmFzdGVzdCBjYXNlLgorLlBQCitTZXZlcmFsIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB0aGF0IHRyYWRlIG9mZiBpbWFnZSBxdWFsaXR5IHRvIGdhaW4gc3BlZWQuCisuQiBcLWZhc3QKK3R1cm5zIG9uIHRoZSByZWNvbW1lbmRlZCBzZXR0aW5ncy4KKy5QUAorLkIgXC1kY3QgZmFzdAorYW5kL29yCisuQiBcLW5vc21vb3RoCitnYWluIHNwZWVkIGF0IGEgc21hbGwgc2FjcmlmaWNlIGluIHF1YWxpdHkuCitXaGVuIHByb2R1Y2luZyBhIGNvbG9yLXF1YW50aXplZCBpbWFnZSwKKy5CIFwtb25lcGFzcyBcLWRpdGhlciBvcmRlcmVkCitpcyBmYXN0IGJ1dCBtdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4KKy5CIFwtZGl0aGVyIG5vbmUKK21heSBnaXZlIGFjY2VwdGFibGUgcmVzdWx0cyBpbiB0d28tcGFzcyBtb2RlLCBidXQgaXMgc2VsZG9tIHRvbGVyYWJsZSBpbgorb25lLXBhc3MgbW9kZS4KKy5QUAorSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAorXGZCXC1kY3QgZmxvYXRcZlIgbWF5IGJlIGV2ZW4gZmFzdGVyIHRoYW4gXGZCXC1kY3QgZmFzdFxmUi4gIEJ1dCBvbiBtb3N0CittYWNoaW5lcyBcZkJcLWRjdCBmbG9hdFxmUiBpcyBzbG93ZXIgdGhhbiBcZkJcLWRjdCBpbnRcZlI7IGluIHRoaXMgY2FzZSBpdCBpcworbm90IHdvcnRoIHVzaW5nLCBiZWNhdXNlIGl0cyB0aGVvcmV0aWNhbCBhY2N1cmFjeSBhZHZhbnRhZ2UgaXMgdG9vIHNtYWxsIHRvIGJlCitzaWduaWZpY2FudCBpbiBwcmFjdGljZS4KKy5TSCBFTlZJUk9OTUVOVAorLlRQCisuQiBKUEVHTUVNCitJZiB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IG1lbW9yeSBsaW1pdC4KK1RoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmVkIGZvciB0aGUKKy5CIFwtbWF4bWVtb3J5Citzd2l0Y2guCisuQiBKUEVHTUVNCitvdmVycmlkZXMgdGhlIGRlZmF1bHQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQKK2l0c2VsZiBpcyBvdmVycmlkZGVuIGJ5IGFuIGV4cGxpY2l0CisuQlIgXC1tYXhtZW1vcnkgLgorLlNIIFNFRSBBTFNPCisuQlIgY2pwZWcgKDEpLAorLkJSIGpwZWd0cmFuICgxKSwKKy5CUiByZGpwZ2NvbSAoMSksCisuQlIgd3JqcGdjb20gKDEpCisuYnIKKy5CUiBwcG0gKDUpLAorLkJSIHBnbSAoNSkKKy5icgorV2FsbGFjZSwgR3JlZ29yeSBLLiAgIlRoZSBKUEVHIFN0aWxsIFBpY3R1cmUgQ29tcHJlc3Npb24gU3RhbmRhcmQiLAorQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSwgQXByaWwgMTk5MSAodm9sLiAzNCwgbm8uIDQpLCBwcC4gMzAtNDQuCisuU0ggQVVUSE9SCitJbmRlcGVuZGVudCBKUEVHIEdyb3VwCisuU0ggQlVHUworQXJpdGhtZXRpYyBjb2RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4KKy5QUAorVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LAorLkIgZGpwZWcKK3Byb2R1Y2VzIHVuY29tcHJlc3NlZCBHSUYgZmlsZXMuICBUaGVzZSBhcmUgbGFyZ2VyIHRoYW4gdGhleSBzaG91bGQgYmUsIGJ1dAorYXJlIHJlYWRhYmxlIGJ5IHN0YW5kYXJkIEdJRiBkZWNvZGVycy4KKy5QUAorU3RpbGwgbm90IGFzIGZhc3QgYXMgd2UnZCBsaWtlLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2RqcGVnLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvZGpwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDk5ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2RqcGVnLmMKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBkanBlZy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBjb21tYW5kLWxpbmUgdXNlciBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIEl0IHNob3VsZCB3b3JrIG9uIGFueSBzeXN0ZW0gd2l0aCBVbml4LSBvciBNUy1ET1Mtc3R5bGUgY29tbWFuZCBsaW5lcy4KKyAqCisgKiBUd28gZGlmZmVyZW50IGNvbW1hbmQgbGluZSBzdHlsZXMgYXJlIHBlcm1pdHRlZCwgZGVwZW5kaW5nIG9uIHRoZQorICogY29tcGlsZS10aW1lIHN3aXRjaCBUV09fRklMRV9DT01NQU5ETElORToKKyAqCWRqcGVnIFtvcHRpb25zXSAgaW5wdXRmaWxlIG91dHB1dGZpbGUKKyAqCWRqcGVnIFtvcHRpb25zXSAgW2lucHV0ZmlsZV0KKyAqIEluIHRoZSBzZWNvbmQgc3R5bGUsIG91dHB1dCBpcyBhbHdheXMgdG8gc3RhbmRhcmQgb3V0cHV0LCB3aGljaCB5b3UnZAorICogbm9ybWFsbHkgcmVkaXJlY3QgdG8gYSBmaWxlIG9yIHBpcGUgdG8gc29tZSBvdGhlciBwcm9ncmFtLiAgSW5wdXQgaXMKKyAqIGVpdGhlciBmcm9tIGEgbmFtZWQgZmlsZSBvciBmcm9tIHN0YW5kYXJkIGlucHV0ICh0eXBpY2FsbHkgcmVkaXJlY3RlZCkuCisgKiBUaGUgc2Vjb25kIHN0eWxlIGlzIGNvbnZlbmllbnQgb24gVW5peCBidXQgaXMgdW5oZWxwZnVsIG9uIHN5c3RlbXMgdGhhdAorICogZG9uJ3Qgc3VwcG9ydCBwaXBlcy4gIEFsc28sIHlvdSBNVVNUIHVzZSB0aGUgZmlyc3Qgc3R5bGUgaWYgeW91ciBzeXN0ZW0KKyAqIGRvZXNuJ3QgZG8gYmluYXJ5IEkvTyB0byBzdGRpbi9zdGRvdXQuCisgKiBUbyBzaW1wbGlmeSBzY3JpcHQgd3JpdGluZywgdGhlICItb3V0ZmlsZSIgc3dpdGNoIGlzIHByb3ZpZGVkLiAgVGhlIHN5bnRheAorICoJZGpwZWcgW29wdGlvbnNdICAtb3V0ZmlsZSBvdXRwdXRmaWxlICBpbnB1dGZpbGUKKyAqIHdvcmtzIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY29tbWFuZCBsaW5lIHN0eWxlIGlzIHVzZWQuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKyNpbmNsdWRlICJqdmVyc2lvbi5oIgkJLyogZm9yIHZlcnNpb24gbWVzc2FnZSAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNwcmludCgpICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBDcmVhdGUgdGhlIGFkZC1vbiBtZXNzYWdlIHN0cmluZyB0YWJsZS4gKi8KKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjZGpwZWdfbWVzc2FnZV90YWJsZVtdID0geworI2luY2x1ZGUgImNkZXJyb3IuaCIKKyAgTlVMTAorfTsKKworCisvKgorICogVGhpcyBsaXN0IGRlZmluZXMgdGhlIGtub3duIG91dHB1dCBpbWFnZSBmb3JtYXRzCisgKiAobm90IGFsbCBvZiB3aGljaCBuZWVkIGJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIHZlcnNpb24pLgorICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCBieSBkZWZpbmluZyBERUZBVUxUX0ZNVDsKKyAqIGluZGVlZCwgeW91IGhhZCBiZXR0ZXIgZG8gc28gaWYgeW91IHVuZGVmaW5lIFBQTV9TVVBQT1JURUQuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlGTVRfQk1QLAkJLyogQk1QIGZvcm1hdCAoV2luZG93cyBmbGF2b3IpICovCisJRk1UX0dJRiwJCS8qIEdJRiBmb3JtYXQgKi8KKwlGTVRfT1MyLAkJLyogQk1QIGZvcm1hdCAoT1MvMiBmbGF2b3IpICovCisJRk1UX1BQTSwJCS8qIFBQTS9QR00gKFBCTVBMVVMgZm9ybWF0cykgKi8KKwlGTVRfUkxFLAkJLyogUkxFIGZvcm1hdCAqLworCUZNVF9UQVJHQSwJCS8qIFRhcmdhIGZvcm1hdCAqLworCUZNVF9USUZGCQkvKiBUSUZGIGZvcm1hdCAqLworfSBJTUFHRV9GT1JNQVRTOworCisjaWZuZGVmIERFRkFVTFRfRk1UCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBDRkxBR1MgaW4gTWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9GTVQJRk1UX1BQTQorI2VuZGlmCisKK3N0YXRpYyBJTUFHRV9GT1JNQVRTIHJlcXVlc3RlZF9mbXQ7CisKKworLyoKKyAqIEFyZ3VtZW50LXBhcnNpbmcgY29kZS4KKyAqIFRoZSBzd2l0Y2ggcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWZ1bCB3aXRoIERPUy1zdHlsZSBjb21tYW5kIGxpbmUKKyAqIHN5bnRheCwgaWUsIGludGVybWl4ZWQgc3dpdGNoZXMgYW5kIGZpbGUgbmFtZXMsIHdoZXJlIG9ubHkgdGhlIHN3aXRjaGVzCisgKiB0byB0aGUgbGVmdCBvZiBhIGdpdmVuIGZpbGUgbmFtZSBhZmZlY3QgcHJvY2Vzc2luZyBvZiB0aGF0IGZpbGUuCisgKiBUaGUgbWFpbiBwcm9ncmFtIGluIHRoaXMgZmlsZSBkb2Vzbid0IGFjdHVhbGx5IHVzZSB0aGlzIGNhcGFiaWxpdHkuLi4KKyAqLworCisKK3N0YXRpYyBjb25zdCBjaGFyICogcHJvZ25hbWU7CS8qIHByb2dyYW0gbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KK3N0YXRpYyBjaGFyICogb3V0ZmlsZW5hbWU7CS8qIGZvciAtb3V0ZmlsZSBzd2l0Y2ggKi8KKworCitMT0NBTCh2b2lkKQordXNhZ2UgKHZvaWQpCisvKiBjb21wbGFpbiBhYm91dCBiYWQgY29tbWFuZCBsaW5lICovCit7CisgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOworI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7CisjZW5kaWYKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY29sb3JzIE4gICAgICBSZWR1Y2UgaW1hZ2UgdG8gbm8gbW9yZSB0aGFuIE4gY29sb3JzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1mYXN0ICAgICAgICAgIEZhc3QsIGxvdy1xdWFsaXR5IHByb2Nlc3NpbmdcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgRm9yY2UgZ3JheXNjYWxlIG91dHB1dFxuIik7CisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYWxlIE0vTiAgICAgU2NhbGUgb3V0cHV0IGltYWdlIGJ5IGZyYWN0aW9uIE0vTiwgZWcsIDEvOFxuIik7CisjZW5kaWYKKyNpZmRlZiBCTVBfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtYm1wICAgICAgICAgICBTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKFdpbmRvd3Mgc3R5bGUpJXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX0JNUCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZ2lmICAgICAgICAgICBTZWxlY3QgR0lGIG91dHB1dCBmb3JtYXQlc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfR0lGID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIEJNUF9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vczIgICAgICAgICAgIFNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoT1MvMiBzdHlsZSklc1xuIiwKKwkgIChERUZBVUxUX0ZNVCA9PSBGTVRfT1MyID8gIiAoZGVmYXVsdCkiIDogIiIpKTsKKyNlbmRpZgorI2lmZGVmIFBQTV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1wbm0gICAgICAgICAgIFNlbGVjdCBQQk1QTFVTIChQUE0vUEdNKSBvdXRwdXQgZm9ybWF0JXNcbiIsCisJICAoREVGQVVMVF9GTVQgPT0gRk1UX1BQTSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtcmxlICAgICAgICAgICBTZWxlY3QgVXRhaCBSTEUgb3V0cHV0IGZvcm1hdCVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9STEUgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtdGFyZ2EgICAgICAgICBTZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdCVzXG4iLAorCSAgKERFRkFVTFRfRk1UID09IEZNVF9UQVJHQSA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6XG4iKTsKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtZGN0IGludCAgICAgICBVc2UgaW50ZWdlciBEQ1QgbWV0aG9kJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSVNMT1cgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmYXN0ICAgICAgVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpJXNcbiIsCisJICAoSkRDVF9ERUZBVUxUID09IEpEQ1RfSUZBU1QgPyAiIChkZWZhdWx0KSIgOiAiIikpOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRjdCBmbG9hdCAgICAgVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2Qlc1xuIiwKKwkgIChKRENUX0RFRkFVTFQgPT0gSkRDVF9GTE9BVCA/ICIgKGRlZmF1bHQpIiA6ICIiKSk7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kaXRoZXIgZnMgICAgIFVzZSBGLVMgZGl0aGVyaW5nIChkZWZhdWx0KVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG5vbmUgICBEb24ndCB1c2UgZGl0aGVyaW5nIGluIHF1YW50aXphdGlvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZGl0aGVyIG9yZGVyZWQgIFVzZSBvcmRlcmVkIGRpdGhlciAobWVkaXVtIHNwZWVkLCBxdWFsaXR5KVxuIik7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtbWFwIEZJTEUgICAgICBNYXAgdG8gY29sb3JzIHVzZWQgaW4gbmFtZWQgaW1hZ2UgZmlsZVxuIik7CisjZW5kaWYKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ub3Ntb290aCAgICAgIERvbid0IHVzZSBoaWdoLXF1YWxpdHkgdXBzYW1wbGluZ1xuIik7CisjaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECisgIGZwcmludGYoc3RkZXJyLCAiICAtb25lcGFzcyAgICAgICBVc2UgMS1wYXNzIHF1YW50aXphdGlvbiAoZmFzdCwgbG93IHF1YWxpdHkpXG4iKTsKKyNlbmRpZgorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW1heG1lbW9yeSBOICAgTWF4aW11bSBtZW1vcnkgdG8gdXNlIChpbiBrYnl0ZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXRmaWxlIG5hbWUgIFNwZWNpZnkgbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZlcmJvc2UgIG9yICAtZGVidWcgICBFbWl0IGRlYnVnIG91dHB1dFxuIik7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitMT0NBTChpbnQpCitwYXJzZV9zd2l0Y2hlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisKKyAgLyogU2V0IHVwIGRlZmF1bHQgSlBFRyBwYXJhbWV0ZXJzLiAqLworICByZXF1ZXN0ZWRfZm10ID0gREVGQVVMVF9GTVQ7CS8qIHNldCBkZWZhdWx0IG91dHB1dCBmaWxlIGZvcm1hdCAqLworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID0gMDsKKworICAvKiBTY2FuIGNvbW1hbmQgbGluZSBvcHRpb25zLCBhZGp1c3QgcGFyYW1ldGVycyAqLworCisgIGZvciAoYXJnbiA9IDE7IGFyZ24gPCBhcmdjOyBhcmduKyspIHsKKyAgICBhcmcgPSBhcmd2W2FyZ25dOworICAgIGlmICgqYXJnICE9ICctJykgeworICAgICAgLyogTm90IGEgc3dpdGNoLCBtdXN0IGJlIGEgZmlsZSBuYW1lIGFyZ3VtZW50ICovCisgICAgICBpZiAoYXJnbiA8PSBsYXN0X2ZpbGVfYXJnX3NlZW4pIHsKKwlvdXRmaWxlbmFtZSA9IE5VTEw7CS8qIC1vdXRmaWxlIGFwcGxpZXMgdG8ganVzdCBvbmUgaW5wdXQgZmlsZSAqLworCWNvbnRpbnVlOwkJLyogaWdub3JlIHRoaXMgbmFtZSBpZiBwcmV2aW91c2x5IHByb2Nlc3NlZCAqLworICAgICAgfQorICAgICAgYnJlYWs7CQkJLyogZWxzZSBkb25lIHBhcnNpbmcgc3dpdGNoZXMgKi8KKyAgICB9CisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBwYXN0IHN3aXRjaCBtYXJrZXIgY2hhcmFjdGVyICovCisKKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAiYm1wIiwgMSkpIHsKKyAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0LiAqLworICAgICAgcmVxdWVzdGVkX2ZtdCA9IEZNVF9CTVA7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImNvbG9ycyIsIDEpIHx8IGtleW1hdGNoKGFyZywgImNvbG91cnMiLCAxKSB8fAorCSAgICAgICBrZXltYXRjaChhcmcsICJxdWFudGl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgInF1YW50aXNlIiwgMSkpIHsKKyAgICAgIC8qIERvIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KKyAgICAgIGludCB2YWw7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkIiwgJnZhbCkgIT0gMSkKKwl1c2FnZSgpOworICAgICAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IHZhbDsKKyAgICAgIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPSBUUlVFOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkY3QiLCAyKSkgeworICAgICAgLyogU2VsZWN0IElEQ1QgYWxnb3JpdGhtLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJpbnQiLCAxKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JU0xPVzsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZhc3QiLCAyKSkgeworCWNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZsb2F0IiwgMikpIHsKKwljaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkxPQVQ7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkaXRoZXIiLCAyKSkgeworICAgICAgLyogU2VsZWN0IGRpdGhlcmluZyBhbGdvcml0aG0uICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImZzIiwgMikpIHsKKwljaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAibm9uZSIsIDIpKSB7CisJY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9OT05FOworICAgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAib3JkZXJlZCIsIDIpKSB7CisJY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9PUkRFUkVEOworICAgICAgfSBlbHNlCisJdXNhZ2UoKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiZGVidWciLCAxKSB8fCBrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBkZWJ1ZyBwcmludG91dHMuICovCisgICAgICAvKiBPbiBmaXJzdCAtZCwgcHJpbnQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiAqLworICAgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRlZF92ZXJzaW9uID0gRkFMU0U7CisKKyAgICAgIGlmICghIHByaW50ZWRfdmVyc2lvbikgeworCWZwcmludGYoc3RkZXJyLCAiSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIERKUEVHLCB2ZXJzaW9uICVzXG4lc1xuIiwKKwkJSlZFUlNJT04sIEpDT1BZUklHSFQpOworCXByaW50ZWRfdmVyc2lvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCsrOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJmYXN0IiwgMSkpIHsKKyAgICAgIC8qIFNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIHF1aWNrLWFuZC1kaXJ0eSBvdXRwdXQuICovCisgICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKyAgICAgIGNpbmZvLT5kaXRoZXJfbW9kZSA9IEpESVRIRVJfT1JERVJFRDsKKyAgICAgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIC8qIGRvbid0IG92ZXJyaWRlIGFuIGVhcmxpZXIgLWNvbG9ycyAqLworCWNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPSAyMTY7CisgICAgICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfRkFTVEVTVDsKKyAgICAgIGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nID0gRkFMU0U7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdpZiIsIDEpKSB7CisgICAgICAvKiBHSUYgb3V0cHV0IGZvcm1hdC4gKi8KKyAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfR0lGOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJncmF5c2NhbGUiLCAyKSB8fCBrZXltYXRjaChhcmcsICJncmV5c2NhbGUiLDIpKSB7CisgICAgICAvKiBGb3JjZSBtb25vY2hyb21lIG91dHB1dC4gKi8KKyAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJtYXAiLCAzKSkgeworICAgICAgLyogUXVhbnRpemUgdG8gYSBjb2xvciBtYXAgdGFrZW4gZnJvbSBhbiBpbnB1dCBmaWxlLiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGZvcl9yZWFsKSB7CQkvKiB0b28gZXhwZW5zaXZlIHRvIGRvIHR3aWNlISAqLworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkvKiBvdGhlcndpc2UgY2FuJ3QgcXVhbnRpemUgdG8gc3VwcGxpZWQgbWFwICovCisJRklMRSAqIG1hcGZpbGU7CisKKwlpZiAoKG1hcGZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKKwkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisJcmVhZF9jb2xvcl9tYXAoY2luZm8sIG1hcGZpbGUpOworCWZjbG9zZShtYXBmaWxlKTsKKwljaW5mby0+cXVhbnRpemVfY29sb3JzID0gVFJVRTsKKyNlbHNlCisJRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm1heG1lbW9yeSIsIDMpKSB7CisgICAgICAvKiBNYXhpbXVtIG1lbW9yeSBpbiBLYiAob3IgTWIgd2l0aCAnbScpLiAqLworICAgICAgbG9uZyBsdmFsOworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKHNzY2FuZihhcmd2W2FyZ25dLCAiJWxkJWMiLCAmbHZhbCwgJmNoKSA8IDEpCisJdXNhZ2UoKTsKKyAgICAgIGlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCWx2YWwgKj0gMTAwMEw7CisgICAgICBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSA9IGx2YWwgKiAxMDAwTDsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibm9zbW9vdGgiLCAzKSkgeworICAgICAgLyogU3VwcHJlc3MgZmFuY3kgdXBzYW1wbGluZyAqLworICAgICAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBGQUxTRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib25lcGFzcyIsIDMpKSB7CisgICAgICAvKiBVc2UgZmFzdCBvbmUtcGFzcyBxdWFudGl6YXRpb24uICovCisgICAgICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3MyIiwgMykpIHsKKyAgICAgIC8qIEJNUCBvdXRwdXQgZm9ybWF0IChPUy8yIGZsYXZvcikuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX09TMjsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAib3V0ZmlsZSIsIDQpKSB7CisgICAgICAvKiBTZXQgb3V0cHV0IGZpbGUgbmFtZS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIG91dGZpbGVuYW1lID0gYXJndlthcmduXTsJLyogc2F2ZSBpdCBhd2F5IGZvciBsYXRlciB1c2UgKi8KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicG5tIiwgMSkgfHwga2V5bWF0Y2goYXJnLCAicHBtIiwgMSkpIHsKKyAgICAgIC8qIFBQTS9QR00gb3V0cHV0IGZvcm1hdC4gKi8KKyAgICAgIHJlcXVlc3RlZF9mbXQgPSBGTVRfUFBNOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJybGUiLCAxKSkgeworICAgICAgLyogUkxFIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1JMRTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAic2NhbGUiLCAxKSkgeworICAgICAgLyogU2NhbGUgdGhlIG91dHB1dCBpbWFnZSBieSBhIGZyYWN0aW9uIE0vTi4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVkLyVkIiwKKwkJICZjaW5mby0+c2NhbGVfbnVtLCAmY2luZm8tPnNjYWxlX2Rlbm9tKSAhPSAyKQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInRhcmdhIiwgMSkpIHsKKyAgICAgIC8qIFRhcmdhIG91dHB1dCBmb3JtYXQuICovCisgICAgICByZXF1ZXN0ZWRfZm10ID0gRk1UX1RBUkdBOworCisgICAgfSBlbHNlIHsKKyAgICAgIHVzYWdlKCk7CQkJLyogYm9ndXMgc3dpdGNoICovCisgICAgfQorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIE1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgaW50ZXJlc3RpbmcgQVBQbiBtYXJrZXJzLgorICogVGhpcyByZXBsYWNlcyB0aGUgbGlicmFyeSdzIGJ1aWx0LWluIHByb2Nlc3Nvciwgd2hpY2gganVzdCBza2lwcyB0aGUgbWFya2VyLgorICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBhcyB0ZXh0LCB0byB0aGUgZXh0ZW50IHBvc3NpYmxlLgorICogTm90ZSB0aGlzIGNvZGUgcmVsaWVzIG9uIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuCisgKi8KKworTE9DQUwodW5zaWduZWQgaW50KQoranBlZ19nZXRjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVhZCBuZXh0IGJ5dGUgKi8KK3sKKyAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSBjaW5mby0+c3JjOworCisgIGlmIChkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIgPT0gMCkgeworICAgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIH0KKyAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyLS07CisgIHJldHVybiBHRVRKT0NURVQoKmRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSsrKTsKK30KKworCitNRVRIT0RERUYoYm9vbGVhbikKK3ByaW50X3RleHRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBib29sZWFuIHRyYWNlaXQgPSAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMSk7CisgIElOVDMyIGxlbmd0aDsKKyAgdW5zaWduZWQgaW50IGNoOworICB1bnNpZ25lZCBpbnQgbGFzdGNoID0gMDsKKworICBsZW5ndGggPSBqcGVnX2dldGMoY2luZm8pIDw8IDg7CisgIGxlbmd0aCArPSBqcGVnX2dldGMoY2luZm8pOworICBsZW5ndGggLT0gMjsJCQkvKiBkaXNjb3VudCB0aGUgbGVuZ3RoIHdvcmQgaXRzZWxmICovCisKKyAgaWYgKHRyYWNlaXQpIHsKKyAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gSlBFR19DT00pCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbW1lbnQsIGxlbmd0aCAlbGQ6XG4iLCAobG9uZykgbGVuZ3RoKTsKKyAgICBlbHNlCQkJLyogYXNzdW1lIGl0IGlzIGFuIEFQUG4gb3RoZXJ3aXNlICovCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFQUCVkLCBsZW5ndGggJWxkOlxuIiwKKwkgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciAtIEpQRUdfQVBQMCwgKGxvbmcpIGxlbmd0aCk7CisgIH0KKworICB3aGlsZSAoLS1sZW5ndGggPj0gMCkgeworICAgIGNoID0ganBlZ19nZXRjKGNpbmZvKTsKKyAgICBpZiAodHJhY2VpdCkgeworICAgICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KKyAgICAgICAqIE5vbnByaW50YWJsZXMgYXJlIGNvbnZlcnRlZCB0byBcbm5uIGZvcm0sCisgICAgICAgKiB3aGlsZSBcIGlzIGNvbnZlcnRlZCB0byBcXC4KKyAgICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCisgICAgICAgKi8KKyAgICAgIGlmIChjaCA9PSAnXHInKSB7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisJaWYgKGxhc3RjaCAhPSAnXHInKQorCSAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CisJZnByaW50ZihzdGRlcnIsICJcXFxcIik7CisgICAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7CisJcHV0YyhjaCwgc3RkZXJyKTsKKyAgICAgIH0gZWxzZSB7CisJZnByaW50ZihzdGRlcnIsICJcXCUwM28iLCBjaCk7CisgICAgICB9CisgICAgICBsYXN0Y2ggPSBjaDsKKyAgICB9CisgIH0KKworICBpZiAodHJhY2VpdCkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7CisjZW5kaWYKKyAgaW50IGZpbGVfaW5kZXg7CisgIGRqcGVnX2Rlc3RfcHRyIGRlc3RfbWdyID0gTlVMTDsKKyAgRklMRSAqIGlucHV0X2ZpbGU7CisgIEZJTEUgKiBvdXRwdXRfZmlsZTsKKyAgSkRJTUVOU0lPTiBudW1fc2NhbmxpbmVzOworCisgIC8qIE9uIE1hYywgZmV0Y2ggYSBjb21tYW5kIGxpbmUuICovCisjaWZkZWYgVVNFX0NDT01NQU5ECisgIGFyZ2MgPSBjY29tbWFuZCgmYXJndik7CisjZW5kaWYKKworICBwcm9nbmFtZSA9IGFyZ3ZbMF07CisgIGlmIChwcm9nbmFtZSA9PSBOVUxMIHx8IHByb2duYW1lWzBdID09IDApCisgICAgcHJvZ25hbWUgPSAiZGpwZWciOwkJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCisKKyAgLyogSW5pdGlhbGl6ZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcuICovCisgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyKTsKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBBZGQgc29tZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBlcnJvciBtZXNzYWdlcyAoZnJvbSBjZGVycm9yLmgpICovCisgIGplcnIuYWRkb25fbWVzc2FnZV90YWJsZSA9IGNkanBlZ19tZXNzYWdlX3RhYmxlOworICBqZXJyLmZpcnN0X2FkZG9uX21lc3NhZ2UgPSBKTVNHX0ZJUlNUQURET05DT0RFOworICBqZXJyLmxhc3RfYWRkb25fbWVzc2FnZSA9IEpNU0dfTEFTVEFERE9OQ09ERTsKKworICAvKiBJbnNlcnQgY3VzdG9tIG1hcmtlciBwcm9jZXNzb3IgZm9yIENPTSBhbmQgQVBQMTIuCisgICAqIEFQUDEyIGlzIHVzZWQgYnkgc29tZSBkaWdpdGFsIGNhbWVyYSBtYWtlcnMgZm9yIHRleHR1YWwgaW5mbywKKyAgICogc28gd2UgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBkaXNwbGF5IGl0IGFzIHRleHQuCisgICAqIElmIHlvdSBsaWtlLCBhZGRpdGlvbmFsIEFQUG4gbWFya2VyIHR5cGVzIGNhbiBiZSBzZWxlY3RlZCBmb3IgZGlzcGxheSwKKyAgICogYnV0IGRvbid0IHRyeSB0byBvdmVycmlkZSBBUFAwIG9yIEFQUDE0IHRoaXMgd2F5IChzZWUgbGlianBlZy5kb2MpLgorICAgKi8KKyAganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigmY2luZm8sIEpQRUdfQ09NLCBwcmludF90ZXh0X21hcmtlcik7CisgIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoJmNpbmZvLCBKUEVHX0FQUDArMTIsIHByaW50X3RleHRfbWFya2VyKTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuICovCisjaWZkZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorICBlbmFibGVfc2lnbmFsX2NhdGNoZXIoKGpfY29tbW9uX3B0cikgJmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4gKi8KKyAgLyogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgaWdub3JlZDsgd2Ugd2lsbCByZXNjYW4gdGhlIHN3aXRjaGVzIGFmdGVyIG9wZW5pbmcKKyAgICogdGhlIGlucHV0IGZpbGUuCisgICAqIChFeGNlcHRpb246IHRyYWNpbmcgbGV2ZWwgc2V0IGhlcmUgY29udHJvbHMgdmVyYm9zaXR5IGZvciBDT00gbWFya2VycworICAgKiBmb3VuZCBkdXJpbmcganBlZ19yZWFkX2hlYWRlci4uLikKKyAgICovCisKKyAgZmlsZV9pbmRleCA9IHBhcnNlX3N3aXRjaGVzKCZjaW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOworCisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLworICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOworICB9IGVsc2UgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICB9CisjZWxzZQorICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLworCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYykgeworICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOworICB9CisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCisgIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLworICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbywgJnByb2dyZXNzKTsKKyNlbmRpZgorCisgIC8qIFNwZWNpZnkgZGF0YSBzb3VyY2UgZm9yIGRlY29tcHJlc3Npb24gKi8KKyAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbnB1dF9maWxlKTsKKworICAvKiBSZWFkIGZpbGUgaGVhZGVyLCBzZXQgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgKi8KKyAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKworICAvKiBBZGp1c3QgZGVmYXVsdCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYnkgcmUtcGFyc2luZyB0aGUgb3B0aW9ucyAqLworICBmaWxlX2luZGV4ID0gcGFyc2Vfc3dpdGNoZXMoJmNpbmZvLCBhcmdjLCBhcmd2LCAwLCBUUlVFKTsKKworICAvKiBJbml0aWFsaXplIHRoZSBvdXRwdXQgbW9kdWxlIG5vdyB0byBsZXQgaXQgb3ZlcnJpZGUgYW55IGNydWNpYWwKKyAgICogb3B0aW9uIHNldHRpbmdzIChmb3IgaW5zdGFuY2UsIEdJRiB3YW50cyB0byBmb3JjZSBjb2xvciBxdWFudGl6YXRpb24pLgorICAgKi8KKyAgc3dpdGNoIChyZXF1ZXN0ZWRfZm10KSB7CisjaWZkZWYgQk1QX1NVUFBPUlRFRAorICBjYXNlIEZNVF9CTVA6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9ibXAoJmNpbmZvLCBGQUxTRSk7CisgICAgYnJlYWs7CisgIGNhc2UgRk1UX09TMjoKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX2JtcCgmY2luZm8sIFRSVUUpOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorICBjYXNlIEZNVF9HSUY6CisgICAgZGVzdF9tZ3IgPSBqaW5pdF93cml0ZV9naWYoJmNpbmZvKTsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIFBQTV9TVVBQT1JURUQKKyAgY2FzZSBGTVRfUFBNOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfcHBtKCZjaW5mbyk7CisgICAgYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisgIGNhc2UgRk1UX1JMRToKKyAgICBkZXN0X21nciA9IGppbml0X3dyaXRlX3JsZSgmY2luZm8pOworICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgVEFSR0FfU1VQUE9SVEVECisgIGNhc2UgRk1UX1RBUkdBOgorICAgIGRlc3RfbWdyID0gamluaXRfd3JpdGVfdGFyZ2EoJmNpbmZvKTsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoJmNpbmZvLCBKRVJSX1VOU1VQUE9SVEVEX0ZPUk1BVCk7CisgICAgYnJlYWs7CisgIH0KKyAgZGVzdF9tZ3ItPm91dHB1dF9maWxlID0gb3V0cHV0X2ZpbGU7CisKKyAgLyogU3RhcnQgZGVjb21wcmVzc29yICovCisgICh2b2lkKSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoJmNpbmZvKTsKKworICAvKiBXcml0ZSBvdXRwdXQgZmlsZSBoZWFkZXIgKi8KKyAgKCpkZXN0X21nci0+c3RhcnRfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7CisKKyAgLyogUHJvY2VzcyBkYXRhICovCisgIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAgbnVtX3NjYW5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBkZXN0X21nci0+YnVmZmVyLAorCQkJCQlkZXN0X21nci0+YnVmZmVyX2hlaWdodCk7CisgICAgKCpkZXN0X21nci0+cHV0X3BpeGVsX3Jvd3MpICgmY2luZm8sIGRlc3RfbWdyLCBudW1fc2NhbmxpbmVzKTsKKyAgfQorCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIC8qIEhhY2s6IGNvdW50IGZpbmFsIHBhc3MgYXMgZG9uZSBpbiBjYXNlIGZpbmlzaF9vdXRwdXQgZG9lcyBhbiBleHRyYSBwYXNzLgorICAgKiBUaGUgbGlicmFyeSB3b24ndCBoYXZlIHVwZGF0ZWQgY29tcGxldGVkX3Bhc3Nlcy4KKyAgICovCisgIHByb2dyZXNzLnB1Yi5jb21wbGV0ZWRfcGFzc2VzID0gcHJvZ3Jlc3MucHViLnRvdGFsX3Bhc3NlczsKKyNlbmRpZgorCisgIC8qIEZpbmlzaCBkZWNvbXByZXNzaW9uIGFuZCByZWxlYXNlIG1lbW9yeS4KKyAgICogSSBtdXN0IGRvIGl0IGluIHRoaXMgb3JkZXIgYmVjYXVzZSBvdXRwdXQgbW9kdWxlIGhhcyBhbGxvY2F0ZWQgbWVtb3J5CisgICAqIG9mIGxpZmVzcGFuIEpQT09MX0lNQUdFOyBpdCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHJlbGVhc2luZyBtZW1vcnkuCisgICAqLworICAoKmRlc3RfbWdyLT5maW5pc2hfb3V0cHV0KSAoJmNpbmZvLCBkZXN0X21ncik7CisgICh2b2lkKSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQ2xvc2UgZmlsZXMsIGlmIHdlIG9wZW5lZCB0aGVtICovCisgIGlmIChpbnB1dF9maWxlICE9IHN0ZGluKQorICAgIGZjbG9zZShpbnB1dF9maWxlKTsKKyAgaWYgKG91dHB1dF9maWxlICE9IHN0ZG91dCkKKyAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGVuZF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZjaW5mbyk7CisjZW5kaWYKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChqZXJyLm51bV93YXJuaW5ncyA/IEVYSVRfV0FSTklORyA6IEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2V4YW1wbGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9leGFtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjMzU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9leGFtcGxlLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBleGFtcGxlLmMKKyAqCisgKiBUaGlzIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIHVzZSB0aGUgSUpHIGNvZGUgYXMgYSBzdWJyb3V0aW5lIGxpYnJhcnkKKyAqIHRvIHJlYWQgb3Igd3JpdGUgSlBFRyBpbWFnZSBmaWxlcy4gIFlvdSBzaG91bGQgbG9vayBhdCB0aGlzIGNvZGUgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRvY3VtZW50YXRpb24gZmlsZSBsaWJqcGVnLmRvYy4KKyAqCisgKiBUaGlzIGNvZGUgd2lsbCBub3QgZG8gYW55dGhpbmcgdXNlZnVsIGFzLWlzLCBidXQgaXQgbWF5IGJlIGhlbHBmdWwgYXMgYQorICogc2tlbGV0b24gZm9yIGNvbnN0cnVjdGluZyByb3V0aW5lcyB0aGF0IGNhbGwgdGhlIEpQRUcgbGlicmFyeS4gIAorICoKKyAqIFdlIHByZXNlbnQgdGhlc2Ugcm91dGluZXMgaW4gdGhlIHNhbWUgY29kaW5nIHN0eWxlIHVzZWQgaW4gdGhlIEpQRUcgY29kZQorICogKEFOU0kgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIGV0Yyk7IGJ1dCB5b3UgYXJlIG9mIGNvdXJzZSBmcmVlIHRvIGNvZGUgeW91cgorICogcm91dGluZXMgaW4gYSBkaWZmZXJlbnQgc3R5bGUgaWYgeW91IHByZWZlci4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIEluY2x1ZGUgZmlsZSBmb3IgdXNlcnMgb2YgSlBFRyBsaWJyYXJ5LgorICogWW91IHdpbGwgbmVlZCB0byBoYXZlIGluY2x1ZGVkIHN5c3RlbSBoZWFkZXJzIHRoYXQgZGVmaW5lIGF0IGxlYXN0CisgKiB0aGUgdHlwZWRlZnMgRklMRSBhbmQgc2l6ZV90IGJlZm9yZSB5b3UgY2FuIGluY2x1ZGUganBlZ2xpYi5oLgorICogKHN0ZGlvLmggaXMgc3VmZmljaWVudCBvbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtcy4pCisgKiBZb3UgbWF5IGFsc28gd2lzaCB0byBpbmNsdWRlICJqZXJyb3IuaCIuCisgKi8KKworI2luY2x1ZGUgImpwZWdsaWIuaCIKKworLyoKKyAqIDxzZXRqbXAuaD4gaXMgdXNlZCBmb3IgdGhlIG9wdGlvbmFsIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbSBzaG93biBpbgorICogdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBleGFtcGxlLgorICovCisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKiBKUEVHIENPTVBSRVNTSU9OIFNBTVBMRSBJTlRFUkZBQ0UgKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhpcyBoYWxmIG9mIHRoZSBleGFtcGxlIHNob3dzIGhvdyB0byBmZWVkIGRhdGEgaW50byB0aGUgSlBFRyBjb21wcmVzc29yLgorICogV2UgcHJlc2VudCBhIG1pbmltYWwgdmVyc2lvbiB0aGF0IGRvZXMgbm90IHdvcnJ5IGFib3V0IHJlZmluZW1lbnRzIHN1Y2gKKyAqIGFzIGVycm9yIHJlY292ZXJ5ICh0aGUgSlBFRyBjb2RlIHdpbGwganVzdCBleGl0KCkgaWYgaXQgZ2V0cyBhbiBlcnJvcikuCisgKi8KKworCisvKgorICogSU1BR0UgREFUQSBGT1JNQVRTOgorICoKKyAqIFRoZSBzdGFuZGFyZCBpbnB1dCBpbWFnZSBmb3JtYXQgaXMgYSByZWN0YW5ndWxhciBhcnJheSBvZiBwaXhlbHMsIHdpdGgKKyAqIGVhY2ggcGl4ZWwgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiAiY29tcG9uZW50IiB2YWx1ZXMgKGNvbG9yIGNoYW5uZWxzKS4KKyAqIEVhY2ggcGl4ZWwgcm93IGlzIGFuIGFycmF5IG9mIEpTQU1QTEVzICh3aGljaCB0eXBpY2FsbHkgYXJlIHVuc2lnbmVkIGNoYXJzKS4KKyAqIElmIHlvdSBhcmUgd29ya2luZyB3aXRoIGNvbG9yIGRhdGEsIHRoZW4gdGhlIGNvbG9yIHZhbHVlcyBmb3IgZWFjaCBwaXhlbAorICogbXVzdCBiZSBhZGphY2VudCBpbiB0aGUgcm93OyBmb3IgZXhhbXBsZSwgUixHLEIsUixHLEIsUixHLEIsLi4uIGZvciAyNC1iaXQKKyAqIFJHQiBjb2xvci4KKyAqCisgKiBGb3IgdGhpcyBleGFtcGxlLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGlzIGRhdGEgc3RydWN0dXJlIG1hdGNoZXMgdGhlIHdheQorICogb3VyIGFwcGxpY2F0aW9uIGhhcyBzdG9yZWQgdGhlIGltYWdlIGluIG1lbW9yeSwgc28gd2UgY2FuIGp1c3QgcGFzcyBhCisgKiBwb2ludGVyIHRvIG91ciBpbWFnZSBidWZmZXIuICBJbiBwYXJ0aWN1bGFyLCBsZXQncyBzYXkgdGhhdCB0aGUgaW1hZ2UgaXMKKyAqIFJHQiBjb2xvciBhbmQgaXMgZGVzY3JpYmVkIGJ5OgorICovCisKK2V4dGVybiBKU0FNUExFICogaW1hZ2VfYnVmZmVyOwkvKiBQb2ludHMgdG8gbGFyZ2UgYXJyYXkgb2YgUixHLEItb3JkZXIgZGF0YSAqLworZXh0ZXJuIGludCBpbWFnZV9oZWlnaHQ7CS8qIE51bWJlciBvZiByb3dzIGluIGltYWdlICovCitleHRlcm4gaW50IGltYWdlX3dpZHRoOwkJLyogTnVtYmVyIG9mIGNvbHVtbnMgaW4gaW1hZ2UgKi8KKworCisvKgorICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgY29tcHJlc3Npb24uICBXZSBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGZpbGUgbmFtZQorICogYW5kIGEgY29tcHJlc3Npb24gcXVhbGl0eSBmYWN0b3IgYXJlIHBhc3NlZCBpbi4KKyAqLworCitHTE9CQUwodm9pZCkKK3dyaXRlX0pQRUdfZmlsZSAoY2hhciAqIGZpbGVuYW1lLCBpbnQgcXVhbGl0eSkKK3sKKyAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgcG9pbnRlcnMgdG8KKyAgICogd29ya2luZyBzcGFjZSAod2hpY2ggaXMgYWxsb2NhdGVkIGFzIG5lZWRlZCBieSB0aGUgSlBFRyBsaWJyYXJ5KS4KKyAgICogSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBzZXZlcmFsIHN1Y2ggc3RydWN0dXJlcywgcmVwcmVzZW50aW5nIG11bHRpcGxlCisgICAqIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gcHJvY2Vzc2VzLCBpbiBleGlzdGVuY2UgYXQgb25jZS4gIFdlIHJlZmVyCisgICAqIHRvIGFueSBvbmUgc3RydWN0IChhbmQgaXRzIGFzc29jaWF0ZWQgd29ya2luZyBkYXRhKSBhcyBhICJKUEVHIG9iamVjdCIuCisgICAqLworICBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIC8qIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgYSBKUEVHIGVycm9yIGhhbmRsZXIuICBJdCBpcyBkZWNsYXJlZCBzZXBhcmF0ZWx5CisgICAqIGJlY2F1c2UgYXBwbGljYXRpb25zIG9mdGVuIHdhbnQgdG8gc3VwcGx5IGEgc3BlY2lhbGl6ZWQgZXJyb3IgaGFuZGxlcgorICAgKiAoc2VlIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGlzIGZpbGUgZm9yIGFuIGV4YW1wbGUpLiAgQnV0IGhlcmUgd2UganVzdAorICAgKiB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgZXJyb3IgaGFuZGxlciwgd2hpY2ggd2lsbAorICAgKiBwcmludCBhIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBjYWxsIGV4aXQoKSBpZiBjb21wcmVzc2lvbiBmYWlscy4KKyAgICogTm90ZSB0aGF0IHRoaXMgc3RydWN0IG11c3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBtYWluIEpQRUcgcGFyYW1ldGVyCisgICAqIHN0cnVjdCwgdG8gYXZvaWQgZGFuZ2xpbmctcG9pbnRlciBwcm9ibGVtcy4KKyAgICovCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciBqZXJyOworICAvKiBNb3JlIHN0dWZmICovCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IGZpbGUgKi8KKyAgSlNBTVBST1cgcm93X3BvaW50ZXJbMV07CS8qIHBvaW50ZXIgdG8gSlNBTVBMRSByb3dbc10gKi8KKyAgaW50IHJvd19zdHJpZGU7CQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gaW1hZ2UgYnVmZmVyICovCisKKyAgLyogU3RlcCAxOiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLworCisgIC8qIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBlcnJvciBoYW5kbGVyIGZpcnN0LCBpbiBjYXNlIHRoZSBpbml0aWFsaXphdGlvbgorICAgKiBzdGVwIGZhaWxzLiAgKFVubGlrZWx5LCBidXQgaXQgY291bGQgaGFwcGVuIGlmIHlvdSBhcmUgb3V0IG9mIG1lbW9yeS4pCisgICAqIFRoaXMgcm91dGluZSBmaWxscyBpbiB0aGUgY29udGVudHMgb2Ygc3RydWN0IGplcnIsIGFuZCByZXR1cm5zIGplcnIncworICAgKiBhZGRyZXNzIHdoaWNoIHdlIHBsYWNlIGludG8gdGhlIGxpbmsgZmllbGQgaW4gY2luZm8uCisgICAqLworICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisgIC8qIE5vdyB3ZSBjYW4gaW5pdGlhbGl6ZSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuICovCisgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogU3RlcCAyOiBzcGVjaWZ5IGRhdGEgZGVzdGluYXRpb24gKGVnLCBhIGZpbGUpICovCisgIC8qIE5vdGU6IHN0ZXBzIDIgYW5kIDMgY2FuIGJlIGRvbmUgaW4gZWl0aGVyIG9yZGVyLiAqLworCisgIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5LXN1cHBsaWVkIGNvZGUgdG8gc2VuZCBjb21wcmVzc2VkIGRhdGEgdG8gYQorICAgKiBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIGFsc28gd3JpdGUgeW91ciBvd24gY29kZSB0byBkbyBzb21ldGhpbmcgZWxzZS4KKyAgICogVkVSWSBJTVBPUlRBTlQ6IHVzZSAiYiIgb3B0aW9uIHRvIGZvcGVuKCkgaWYgeW91IGFyZSBvbiBhIG1hY2hpbmUgdGhhdAorICAgKiByZXF1aXJlcyBpdCBpbiBvcmRlciB0byB3cml0ZSBiaW5hcnkgZmlsZXMuCisgICAqLworICBpZiAoKG91dGZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIikpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNhbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBleGl0KDEpOworICB9CisgIGpwZWdfc3RkaW9fZGVzdCgmY2luZm8sIG91dGZpbGUpOworCisgIC8qIFN0ZXAgMzogc2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uICovCisKKyAgLyogRmlyc3Qgd2Ugc3VwcGx5IGEgZGVzY3JpcHRpb24gb2YgdGhlIGlucHV0IGltYWdlLgorICAgKiBGb3VyIGZpZWxkcyBvZiB0aGUgY2luZm8gc3RydWN0IG11c3QgYmUgZmlsbGVkIGluOgorICAgKi8KKyAgY2luZm8uaW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aDsgCS8qIGltYWdlIHdpZHRoIGFuZCBoZWlnaHQsIGluIHBpeGVscyAqLworICBjaW5mby5pbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQ7CisgIGNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbCAqLworICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7IAkvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCisgIC8qIE5vdyB1c2UgdGhlIGxpYnJhcnkncyByb3V0aW5lIHRvIHNldCBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuCisgICAqIChZb3UgbXVzdCBzZXQgYXQgbGVhc3QgY2luZm8uaW5fY29sb3Jfc3BhY2UgYmVmb3JlIGNhbGxpbmcgdGhpcywKKyAgICogc2luY2UgdGhlIGRlZmF1bHRzIGRlcGVuZCBvbiB0aGUgc291cmNlIGNvbG9yIHNwYWNlLikKKyAgICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisgIC8qIE5vdyB5b3UgY2FuIHNldCBhbnkgbm9uLWRlZmF1bHQgcGFyYW1ldGVycyB5b3Ugd2lzaCB0by4KKyAgICogSGVyZSB3ZSBqdXN0IGlsbHVzdHJhdGUgdGhlIHVzZSBvZiBxdWFsaXR5IChxdWFudGl6YXRpb24gdGFibGUpIHNjYWxpbmc6CisgICAqLworICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywgcXVhbGl0eSwgVFJVRSAvKiBsaW1pdCB0byBiYXNlbGluZS1KUEVHIHZhbHVlcyAqLyk7CisKKyAgLyogU3RlcCA0OiBTdGFydCBjb21wcmVzc29yICovCisKKyAgLyogVFJVRSBlbnN1cmVzIHRoYXQgd2Ugd2lsbCB3cml0ZSBhIGNvbXBsZXRlIGludGVyY2hhbmdlLUpQRUcgZmlsZS4KKyAgICogUGFzcyBUUlVFIHVubGVzcyB5b3UgYXJlIHZlcnkgc3VyZSBvZiB3aGF0IHlvdSdyZSBkb2luZy4KKyAgICovCisgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworICAvKiBTdGVwIDU6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSB3cml0dGVuKSAqLworICAvKiAgICAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsgKi8KKworICAvKiBIZXJlIHdlIHVzZSB0aGUgbGlicmFyeSdzIHN0YXRlIHZhcmlhYmxlIGNpbmZvLm5leHRfc2NhbmxpbmUgYXMgdGhlCisgICAqIGxvb3AgY291bnRlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgdHJhY2sgb3Vyc2VsdmVzLgorICAgKiBUbyBrZWVwIHRoaW5ncyBzaW1wbGUsIHdlIHBhc3Mgb25lIHNjYW5saW5lIHBlciBjYWxsOyB5b3UgY2FuIHBhc3MKKyAgICogbW9yZSBpZiB5b3Ugd2lzaCwgdGhvdWdoLgorICAgKi8KKyAgcm93X3N0cmlkZSA9IGltYWdlX3dpZHRoICogMzsJLyogSlNBTVBMRXMgcGVyIHJvdyBpbiBpbWFnZV9idWZmZXIgKi8KKworICB3aGlsZSAoY2luZm8ubmV4dF9zY2FubGluZSA8IGNpbmZvLmltYWdlX2hlaWdodCkgeworICAgIC8qIGpwZWdfd3JpdGVfc2NhbmxpbmVzIGV4cGVjdHMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2NhbmxpbmVzLgorICAgICAqIEhlcmUgdGhlIGFycmF5IGlzIG9ubHkgb25lIGVsZW1lbnQgbG9uZywgYnV0IHlvdSBjb3VsZCBwYXNzCisgICAgICogbW9yZSB0aGFuIG9uZSBzY2FubGluZSBhdCBhIHRpbWUgaWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4KKyAgICAgKi8KKyAgICByb3dfcG9pbnRlclswXSA9ICYgaW1hZ2VfYnVmZmVyW2NpbmZvLm5leHRfc2NhbmxpbmUgKiByb3dfc3RyaWRlXTsKKyAgICAodm9pZCkganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCByb3dfcG9pbnRlciwgMSk7CisgIH0KKworICAvKiBTdGVwIDY6IEZpbmlzaCBjb21wcmVzc2lvbiAqLworCisgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisgIC8qIEFmdGVyIGZpbmlzaF9jb21wcmVzcywgd2UgY2FuIGNsb3NlIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyAgZmNsb3NlKG91dGZpbGUpOworCisgIC8qIFN0ZXAgNzogcmVsZWFzZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdCAqLworCisgIC8qIFRoaXMgaXMgYW4gaW1wb3J0YW50IHN0ZXAgc2luY2UgaXQgd2lsbCByZWxlYXNlIGEgZ29vZCBkZWFsIG9mIG1lbW9yeS4gKi8KKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisKKyAgLyogQW5kIHdlJ3JlIGRvbmUhICovCit9CisKKworLyoKKyAqIFNPTUUgRklORSBQT0lOVFM6CisgKgorICogSW4gdGhlIGFib3ZlIGxvb3AsIHdlIGlnbm9yZWQgdGhlIHJldHVybiB2YWx1ZSBvZiBqcGVnX3dyaXRlX3NjYW5saW5lcywKKyAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uICBXZSBjb3VsZCBnZXQgYXdheQorICogd2l0aCB0aGlzIGJlY2F1c2Ugd2Ugd2VyZSBvbmx5IHJlbHlpbmcgb24gdGhlIHZhbHVlIG9mIGNpbmZvLm5leHRfc2NhbmxpbmUsCisgKiB3aGljaCB3aWxsIGJlIGluY3JlbWVudGVkIGNvcnJlY3RseS4gIElmIHlvdSBtYWludGFpbiBhZGRpdGlvbmFsIGxvb3AKKyAqIHZhcmlhYmxlcyB0aGVuIHlvdSBzaG91bGQgYmUgY2FyZWZ1bCB0byBpbmNyZW1lbnQgdGhlbSBwcm9wZXJseS4KKyAqIEFjdHVhbGx5LCBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtIHlvdSBuZWVkbid0IHdvcnJ5LCBiZWNhdXNlCisgKiB0aGVuIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdpbGwgd3JpdGUgYWxsIHRoZSBsaW5lcyBwYXNzZWQgKG9yIGVsc2UgZXhpdAorICogd2l0aCBhIGZhdGFsIGVycm9yKS4gIFBhcnRpYWwgd3JpdGVzIGNhbiBvbmx5IG9jY3VyIGlmIHlvdSB1c2UgYSBkYXRhCisgKiBkZXN0aW5hdGlvbiBtb2R1bGUgdGhhdCBjYW4gZGVtYW5kIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IuCisgKiAoSWYgeW91IGRvbid0IGtub3cgd2hhdCB0aGF0J3MgZm9yLCB5b3UgZG9uJ3QgbmVlZCBpdC4pCisgKgorICogSWYgdGhlIGNvbXByZXNzb3IgcmVxdWlyZXMgZnVsbC1pbWFnZSBidWZmZXJzIChmb3IgZW50cm9weS1jb2RpbmcKKyAqIG9wdGltaXphdGlvbiBvciBhIG11bHRpLXNjYW4gSlBFRyBmaWxlKSwgaXQgd2lsbCBjcmVhdGUgdGVtcG9yYXJ5CisgKiBmaWxlcyBmb3IgYW55dGhpbmcgdGhhdCBkb2Vzbid0IGZpdCB3aXRoaW4gdGhlIG1heGltdW0tbWVtb3J5IHNldHRpbmcuCisgKiAoTm90ZSB0aGF0IHRlbXAgZmlsZXMgYXJlIE5PVCBuZWVkZWQgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzLikKKyAqIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQKKyAqIHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFNlZSBsaWJqcGVnLmRvYy4KKyAqCisgKiBTY2FubGluZXMgTVVTVCBiZSBzdXBwbGllZCBpbiB0b3AtdG8tYm90dG9tIG9yZGVyIGlmIHlvdSB3YW50IHlvdXIgSlBFRworICogZmlsZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV2ZXJ5b25lIGVsc2Uncy4gIElmIHlvdSBjYW5ub3QgcmVhZGlseSByZWFkCisgKiB5b3VyIGRhdGEgaW4gdGhhdCBvcmRlciwgeW91J2xsIG5lZWQgYW4gaW50ZXJtZWRpYXRlIGFycmF5IHRvIGhvbGQgdGhlCisgKiBpbWFnZS4gIFNlZSByZHRhcmdhLmMgb3IgcmRibXAuYyBmb3IgZXhhbXBsZXMgb2YgaGFuZGxpbmcgYm90dG9tLXRvLXRvcAorICogc291cmNlIGRhdGEgdXNpbmcgdGhlIEpQRUcgY29kZSdzIGludGVybmFsIHZpcnR1YWwtYXJyYXkgbWVjaGFuaXNtcy4KKyAqLworCisKKworLyoqKioqKioqKioqKioqKioqKioqIEpQRUcgREVDT01QUkVTU0lPTiBTQU1QTEUgSU5URVJGQUNFICoqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaGFsZiBvZiB0aGUgZXhhbXBsZSBzaG93cyBob3cgdG8gcmVhZCBkYXRhIGZyb20gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICogSXQncyBhIGJpdCBtb3JlIHJlZmluZWQgdGhhbiB0aGUgYWJvdmUsIGluIHRoYXQgd2Ugc2hvdzoKKyAqICAgKGEpIGhvdyB0byBtb2RpZnkgdGhlIEpQRUcgbGlicmFyeSdzIHN0YW5kYXJkIGVycm9yLXJlcG9ydGluZyBiZWhhdmlvcjsKKyAqICAgKGIpIGhvdyB0byBhbGxvY2F0ZSB3b3Jrc3BhY2UgdXNpbmcgdGhlIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlci4KKyAqCisgKiBKdXN0IHRvIG1ha2UgdGhpcyBleGFtcGxlIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBvbmUsIHdlJ2xsCisgKiBhc3N1bWUgdGhhdCB3ZSBkbyBub3QgaW50ZW5kIHRvIHB1dCB0aGUgd2hvbGUgaW1hZ2UgaW50byBhbiBpbi1tZW1vcnkKKyAqIGJ1ZmZlciwgYnV0IHRvIHNlbmQgaXQgbGluZS1ieS1saW5lIHNvbWVwbGFjZSBlbHNlLiAgV2UgbmVlZCBhIG9uZS0KKyAqIHNjYW5saW5lLWhpZ2ggSlNBTVBMRSBhcnJheSBhcyBhIHdvcmsgYnVmZmVyLCBhbmQgd2Ugd2lsbCBsZXQgdGhlIEpQRUcKKyAqIG1lbW9yeSBtYW5hZ2VyIGFsbG9jYXRlIGl0IGZvciB1cy4gIFRoaXMgYXBwcm9hY2ggaXMgYWN0dWFsbHkgcXVpdGUgdXNlZnVsCisgKiBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gcmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSB0aGUgYnVmZmVyIHNlcGFyYXRlbHk6IGl0CisgKiB3aWxsIGdvIGF3YXkgYXV0b21hdGljYWxseSB3aGVuIHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwLgorICovCisKKworLyoKKyAqIEVSUk9SIEhBTkRMSU5HOgorICoKKyAqIFRoZSBKUEVHIGxpYnJhcnkncyBzdGFuZGFyZCBlcnJvciBoYW5kbGVyIChqZXJyb3IuYykgaXMgZGl2aWRlZCBpbnRvCisgKiBzZXZlcmFsICJtZXRob2RzIiB3aGljaCB5b3UgY2FuIG92ZXJyaWRlIGluZGl2aWR1YWxseS4gIFRoaXMgbGV0cyB5b3UKKyAqIGFkanVzdCB0aGUgYmVoYXZpb3Igd2l0aG91dCBkdXBsaWNhdGluZyBhIGxvdCBvZiBjb2RlLCB3aGljaCB5b3UgbWlnaHQKKyAqIGhhdmUgdG8gdXBkYXRlIHdpdGggZWFjaCBmdXR1cmUgcmVsZWFzZS4KKyAqCisgKiBPdXIgZXhhbXBsZSBoZXJlIHNob3dzIGhvdyB0byBvdmVycmlkZSB0aGUgImVycm9yX2V4aXQiIG1ldGhvZCBzbyB0aGF0CisgKiBjb250cm9sIGlzIHJldHVybmVkIHRvIHRoZSBsaWJyYXJ5J3MgY2FsbGVyIHdoZW4gYSBmYXRhbCBlcnJvciBvY2N1cnMsCisgKiByYXRoZXIgdGhhbiBjYWxsaW5nIGV4aXQoKSBhcyB0aGUgc3RhbmRhcmQgZXJyb3JfZXhpdCBtZXRob2QgZG9lcy4KKyAqCisgKiBXZSB1c2UgQydzIHNldGptcC9sb25nam1wIGZhY2lsaXR5IHRvIHJldHVybiBjb250cm9sLiAgVGhpcyBtZWFucyB0aGF0IHRoZQorICogcm91dGluZSB3aGljaCBjYWxscyB0aGUgSlBFRyBsaWJyYXJ5IG11c3QgZmlyc3QgZXhlY3V0ZSBhIHNldGptcCgpIGNhbGwgdG8KKyAqIGVzdGFibGlzaCB0aGUgcmV0dXJuIHBvaW50LiAgV2Ugd2FudCB0aGUgcmVwbGFjZW1lbnQgZXJyb3JfZXhpdCB0byBkbyBhCisgKiBsb25nam1wKCkuICBCdXQgd2UgbmVlZCB0byBtYWtlIHRoZSBzZXRqbXAgYnVmZmVyIGFjY2Vzc2libGUgdG8gdGhlCisgKiBlcnJvcl9leGl0IHJvdXRpbmUuICBUbyBkbyB0aGlzLCB3ZSBtYWtlIGEgcHJpdmF0ZSBleHRlbnNpb24gb2YgdGhlCisgKiBzdGFuZGFyZCBKUEVHIGVycm9yIGhhbmRsZXIgb2JqZWN0LiAgKElmIHdlIHdlcmUgdXNpbmcgQysrLCB3ZSdkIHNheSB3ZQorICogd2VyZSBtYWtpbmcgYSBzdWJjbGFzcyBvZiB0aGUgcmVndWxhciBlcnJvciBoYW5kbGVyLikKKyAqCisgKiBIZXJlJ3MgdGhlIGV4dGVuZGVkIGVycm9yIGhhbmRsZXIgc3RydWN0OgorICovCisKK3N0cnVjdCBteV9lcnJvcl9tZ3IgeworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgcHViOwkvKiAicHVibGljIiBmaWVsZHMgKi8KKworICBqbXBfYnVmIHNldGptcF9idWZmZXI7CS8qIGZvciByZXR1cm4gdG8gY2FsbGVyICovCit9OworCit0eXBlZGVmIHN0cnVjdCBteV9lcnJvcl9tZ3IgKiBteV9lcnJvcl9wdHI7CisKKy8qCisgKiBIZXJlJ3MgdGhlIHJvdXRpbmUgdGhhdCB3aWxsIHJlcGxhY2UgdGhlIHN0YW5kYXJkIGVycm9yX2V4aXQgbWV0aG9kOgorICovCisKK01FVEhPRERFRih2b2lkKQorbXlfZXJyb3JfZXhpdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBjaW5mby0+ZXJyIHJlYWxseSBwb2ludHMgdG8gYSBteV9lcnJvcl9tZ3Igc3RydWN0LCBzbyBjb2VyY2UgcG9pbnRlciAqLworICBteV9lcnJvcl9wdHIgbXllcnIgPSAobXlfZXJyb3JfcHRyKSBjaW5mby0+ZXJyOworCisgIC8qIEFsd2F5cyBkaXNwbGF5IHRoZSBtZXNzYWdlLiAqLworICAvKiBXZSBjb3VsZCBwb3N0cG9uZSB0aGlzIHVudGlsIGFmdGVyIHJldHVybmluZywgaWYgd2UgY2hvc2UuICovCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisKKyAgLyogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIHNldGptcCBwb2ludCAqLworICBsb25nam1wKG15ZXJyLT5zZXRqbXBfYnVmZmVyLCAxKTsKK30KKworCisvKgorICogU2FtcGxlIHJvdXRpbmUgZm9yIEpQRUcgZGVjb21wcmVzc2lvbi4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgZmlsZSBuYW1lCisgKiBpcyBwYXNzZWQgaW4uICBXZSB3YW50IHRvIHJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IuCisgKi8KKworCitHTE9CQUwoaW50KQorcmVhZF9KUEVHX2ZpbGUgKGNoYXIgKiBmaWxlbmFtZSkKK3sKKyAgLyogVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCBwb2ludGVycyB0bworICAgKiB3b3JraW5nIHNwYWNlICh3aGljaCBpcyBhbGxvY2F0ZWQgYXMgbmVlZGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkpLgorICAgKi8KKyAgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgY2luZm87CisgIC8qIFdlIHVzZSBvdXIgcHJpdmF0ZSBleHRlbnNpb24gSlBFRyBlcnJvciBoYW5kbGVyLgorICAgKiBOb3RlIHRoYXQgdGhpcyBzdHJ1Y3QgbXVzdCBsaXZlIGFzIGxvbmcgYXMgdGhlIG1haW4gSlBFRyBwYXJhbWV0ZXIKKyAgICogc3RydWN0LCB0byBhdm9pZCBkYW5nbGluZy1wb2ludGVyIHByb2JsZW1zLgorICAgKi8KKyAgc3RydWN0IG15X2Vycm9yX21nciBqZXJyOworICAvKiBNb3JlIHN0dWZmICovCisgIEZJTEUgKiBpbmZpbGU7CQkvKiBzb3VyY2UgZmlsZSAqLworICBKU0FNUEFSUkFZIGJ1ZmZlcjsJCS8qIE91dHB1dCByb3cgYnVmZmVyICovCisgIGludCByb3dfc3RyaWRlOwkJLyogcGh5c2ljYWwgcm93IHdpZHRoIGluIG91dHB1dCBidWZmZXIgKi8KKworICAvKiBJbiB0aGlzIGV4YW1wbGUgd2Ugd2FudCB0byBvcGVuIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLAorICAgKiBzbyB0aGF0IHRoZSBzZXRqbXAoKSBlcnJvciByZWNvdmVyeSBiZWxvdyBjYW4gYXNzdW1lIHRoZSBmaWxlIGlzIG9wZW4uCisgICAqIFZFUlkgSU1QT1JUQU5UOiB1c2UgImIiIG9wdGlvbiB0byBmb3BlbigpIGlmIHlvdSBhcmUgb24gYSBtYWNoaW5lIHRoYXQKKyAgICogcmVxdWlyZXMgaXQgaW4gb3JkZXIgdG8gcmVhZCBiaW5hcnkgZmlsZXMuCisgICAqLworCisgIGlmICgoaW5maWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBTdGVwIDE6IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgKi8KKworICAvKiBXZSBzZXQgdXAgdGhlIG5vcm1hbCBKUEVHIGVycm9yIHJvdXRpbmVzLCB0aGVuIG92ZXJyaWRlIGVycm9yX2V4aXQuICovCisgIGNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyLnB1Yik7CisgIGplcnIucHViLmVycm9yX2V4aXQgPSBteV9lcnJvcl9leGl0OworICAvKiBFc3RhYmxpc2ggdGhlIHNldGptcCByZXR1cm4gY29udGV4dCBmb3IgbXlfZXJyb3JfZXhpdCB0byB1c2UuICovCisgIGlmIChzZXRqbXAoamVyci5zZXRqbXBfYnVmZmVyKSkgeworICAgIC8qIElmIHdlIGdldCBoZXJlLCB0aGUgSlBFRyBjb2RlIGhhcyBzaWduYWxlZCBhbiBlcnJvci4KKyAgICAgKiBXZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBKUEVHIG9iamVjdCwgY2xvc2UgdGhlIGlucHV0IGZpbGUsIGFuZCByZXR1cm4uCisgICAgICovCisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoJmNpbmZvKTsKKyAgICBmY2xvc2UoaW5maWxlKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvKiBOb3cgd2UgY2FuIGluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuICovCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoJmNpbmZvKTsKKworICAvKiBTdGVwIDI6IHNwZWNpZnkgZGF0YSBzb3VyY2UgKGVnLCBhIGZpbGUpICovCisKKyAganBlZ19zdGRpb19zcmMoJmNpbmZvLCBpbmZpbGUpOworCisgIC8qIFN0ZXAgMzogcmVhZCBmaWxlIHBhcmFtZXRlcnMgd2l0aCBqcGVnX3JlYWRfaGVhZGVyKCkgKi8KKworICAodm9pZCkganBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBqcGVnX3JlYWRfaGVhZGVyIHNpbmNlCisgICAqICAgKGEpIHN1c3BlbnNpb24gaXMgbm90IHBvc3NpYmxlIHdpdGggdGhlIHN0ZGlvIGRhdGEgc291cmNlLCBhbmQKKyAgICogICAoYikgd2UgcGFzc2VkIFRSVUUgdG8gcmVqZWN0IGEgdGFibGVzLW9ubHkgSlBFRyBmaWxlIGFzIGFuIGVycm9yLgorICAgKiBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KKyAgICovCisKKyAgLyogU3RlcCA0OiBzZXQgcGFyYW1ldGVycyBmb3IgZGVjb21wcmVzc2lvbiAqLworCisgIC8qIEluIHRoaXMgZXhhbXBsZSwgd2UgZG9uJ3QgbmVlZCB0byBjaGFuZ2UgYW55IG9mIHRoZSBkZWZhdWx0cyBzZXQgYnkKKyAgICoganBlZ19yZWFkX2hlYWRlcigpLCBzbyB3ZSBkbyBub3RoaW5nIGhlcmUuCisgICAqLworCisgIC8qIFN0ZXAgNTogU3RhcnQgZGVjb21wcmVzc29yICovCisKKyAgKHZvaWQpIGpwZWdfc3RhcnRfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKKyAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCisgICAqLworCisgIC8qIFdlIG1heSBuZWVkIHRvIGRvIHNvbWUgc2V0dXAgb2Ygb3VyIG93biBhdCB0aGlzIHBvaW50IGJlZm9yZSByZWFkaW5nCisgICAqIHRoZSBkYXRhLiAgQWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCkgd2UgaGF2ZSB0aGUgY29ycmVjdCBzY2FsZWQKKyAgICogb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgY29sb3JtYXAKKyAgICogaWYgd2UgYXNrZWQgZm9yIGNvbG9yIHF1YW50aXphdGlvbi4KKyAgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBuZWVkIHRvIG1ha2UgYW4gb3V0cHV0IHdvcmsgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplLgorICAgKi8gCisgIC8qIEpTQU1QTEVzIHBlciByb3cgaW4gb3V0cHV0IGJ1ZmZlciAqLworICByb3dfc3RyaWRlID0gY2luZm8ub3V0cHV0X3dpZHRoICogY2luZm8ub3V0cHV0X2NvbXBvbmVudHM7CisgIC8qIE1ha2UgYSBvbmUtcm93LWhpZ2ggc2FtcGxlIGFycmF5IHRoYXQgd2lsbCBnbyBhd2F5IHdoZW4gZG9uZSB3aXRoIGltYWdlICovCisgIGJ1ZmZlciA9ICgqY2luZm8ubWVtLT5hbGxvY19zYXJyYXkpCisJCSgoal9jb21tb25fcHRyKSAmY2luZm8sIEpQT09MX0lNQUdFLCByb3dfc3RyaWRlLCAxKTsKKworICAvKiBTdGVwIDY6IHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKSAqLworICAvKiAgICAgICAgICAganBlZ19yZWFkX3NjYW5saW5lcyguLi4pOyAqLworCisgIC8qIEhlcmUgd2UgdXNlIHRoZSBsaWJyYXJ5J3Mgc3RhdGUgdmFyaWFibGUgY2luZm8ub3V0cHV0X3NjYW5saW5lIGFzIHRoZQorICAgKiBsb29wIGNvdW50ZXIsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIHRyYWNrIG91cnNlbHZlcy4KKyAgICovCisgIHdoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAgLyoganBlZ19yZWFkX3NjYW5saW5lcyBleHBlY3RzIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNjYW5saW5lcy4KKyAgICAgKiBIZXJlIHRoZSBhcnJheSBpcyBvbmx5IG9uZSBlbGVtZW50IGxvbmcsIGJ1dCB5b3UgY291bGQgYXNrIGZvcgorICAgICAqIG1vcmUgdGhhbiBvbmUgc2NhbmxpbmUgYXQgYSB0aW1lIGlmIHRoYXQncyBtb3JlIGNvbnZlbmllbnQuCisgICAgICovCisgICAgKHZvaWQpIGpwZWdfcmVhZF9zY2FubGluZXMoJmNpbmZvLCBidWZmZXIsIDEpOworICAgIC8qIEFzc3VtZSBwdXRfc2NhbmxpbmVfc29tZXBsYWNlIHdhbnRzIGEgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50LiAqLworICAgIHB1dF9zY2FubGluZV9zb21lcGxhY2UoYnVmZmVyWzBdLCByb3dfc3RyaWRlKTsKKyAgfQorCisgIC8qIFN0ZXAgNzogRmluaXNoIGRlY29tcHJlc3Npb24gKi8KKworICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworICAvKiBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgc2luY2Ugc3VzcGVuc2lvbiBpcyBub3QgcG9zc2libGUKKyAgICogd2l0aCB0aGUgc3RkaW8gZGF0YSBzb3VyY2UuCisgICAqLworCisgIC8qIFN0ZXAgODogUmVsZWFzZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0ICovCisKKyAgLyogVGhpcyBpcyBhbiBpbXBvcnRhbnQgc3RlcCBzaW5jZSBpdCB3aWxsIHJlbGVhc2UgYSBnb29kIGRlYWwgb2YgbWVtb3J5LiAqLworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCisgIC8qIEFmdGVyIGZpbmlzaF9kZWNvbXByZXNzLCB3ZSBjYW4gY2xvc2UgdGhlIGlucHV0IGZpbGUuCisgICAqIEhlcmUgd2UgcG9zdHBvbmUgaXQgdW50aWwgYWZ0ZXIgbm8gbW9yZSBKUEVHIGVycm9ycyBhcmUgcG9zc2libGUsCisgICAqIHNvIGFzIHRvIHNpbXBsaWZ5IHRoZSBzZXRqbXAgZXJyb3IgbG9naWMgYWJvdmUuICAoQWN0dWFsbHksIEkgZG9uJ3QKKyAgICogdGhpbmsgdGhhdCBqcGVnX2Rlc3Ryb3kgY2FuIGRvIGFuIGVycm9yIGV4aXQsIGJ1dCB3aHkgYXNzdW1lIGFueXRoaW5nLi4uKQorICAgKi8KKyAgZmNsb3NlKGluZmlsZSk7CisKKyAgLyogQXQgdGhpcyBwb2ludCB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgYW55IGNvcnJ1cHQtZGF0YQorICAgKiB3YXJuaW5ncyBvY2N1cnJlZCAodGVzdCB3aGV0aGVyIGplcnIucHViLm51bV93YXJuaW5ncyBpcyBub256ZXJvKS4KKyAgICovCisKKyAgLyogQW5kIHdlJ3JlIGRvbmUhICovCisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBTT01FIEZJTkUgUE9JTlRTOgorICoKKyAqIEluIHRoZSBhYm92ZSBjb2RlLCB3ZSBpZ25vcmVkIHRoZSByZXR1cm4gdmFsdWUgb2YganBlZ19yZWFkX3NjYW5saW5lcywKKyAqIHdoaWNoIGlzIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHJlYWQuICBXZSBjb3VsZCBnZXQgYXdheSB3aXRoCisgKiB0aGlzIGJlY2F1c2Ugd2UgYXNrZWQgZm9yIG9ubHkgb25lIGxpbmUgYXQgYSB0aW1lIGFuZCB3ZSB3ZXJlbid0IHVzaW5nCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgaW5mby4KKyAqCisgKiBXZSBjaGVhdGVkIGEgYml0IGJ5IGNhbGxpbmcgYWxsb2Nfc2FycmF5KCkgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCk7CisgKiB3ZSBzaG91bGQgaGF2ZSBkb25lIGl0IGJlZm9yZWhhbmQgdG8gZW5zdXJlIHRoYXQgdGhlIHNwYWNlIHdvdWxkIGJlCisgKiBjb3VudGVkIGFnYWluc3QgdGhlIEpQRUcgbWF4X21lbW9yeSBzZXR0aW5nLiAgSW4gc29tZSBzeXN0ZW1zIHRoZSBhYm92ZQorICogY29kZSB3b3VsZCByaXNrIGFuIG91dC1vZi1tZW1vcnkgZXJyb3IuICBIb3dldmVyLCBpbiBnZW5lcmFsIHdlIGRvbid0CisgKiBrbm93IHRoZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBiZWZvcmUganBlZ19zdGFydF9kZWNvbXByZXNzKCksIHVubGVzcyB3ZQorICogY2FsbCBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKS4gIFNlZSBsaWJqcGVnLmRvYyBmb3IgbW9yZSBhYm91dCB0aGlzLgorICoKKyAqIFNjYW5saW5lcyBhcmUgcmV0dXJuZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcHBlYXIgaW4gdGhlIEpQRUcgZmlsZSwKKyAqIHdoaWNoIGlzIHN0YW5kYXJkbHkgdG9wLXRvLWJvdHRvbS4gIElmIHlvdSBtdXN0IGVtaXQgZGF0YSBib3R0b20tdG8tdG9wLAorICogeW91IGNhbiB1c2Ugb25lIG9mIHRoZSB2aXJ0dWFsIGFycmF5cyBwcm92aWRlZCBieSB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlcgorICogdG8gaW52ZXJ0IHRoZSBkYXRhLiAgU2VlIHdyYm1wLmMgZm9yIGFuIGV4YW1wbGUuCisgKgorICogQXMgd2l0aCBjb21wcmVzc2lvbiwgc29tZSBvcGVyYXRpbmcgbW9kZXMgbWF5IHJlcXVpcmUgdGVtcG9yYXJ5IGZpbGVzLgorICogT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byBzZXQgdXAgYSBzaWduYWwgaGFuZGxlciB0byBlbnN1cmUgdGhhdAorICogdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkIGlmIHRoZSBwcm9ncmFtIGlzIGludGVycnVwdGVkLiAgU2VlIGxpYmpwZWcuZG9jLgorICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvZmlsZWxpc3QuZG9jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ZpbGVsaXN0LmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTQ5ODJjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ZpbGVsaXN0LmRvYwpAQCAtMCwwICsxLDIxMCBAQAorSUpHIEpQRUcgTElCUkFSWTogIEZJTEUgTElTVAorCitDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK0hlcmUgaXMgYSByb2FkIG1hcCB0byB0aGUgZmlsZXMgaW4gdGhlIElKRyBKUEVHIGRpc3RyaWJ1dGlvbi4gIFRoZQorZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBKUEVHIGxpYnJhcnkgcHJvcGVyLCBwbHVzIHR3byBhcHBsaWNhdGlvbgorcHJvZ3JhbXMgKCJjanBlZyIgYW5kICJkanBlZyIpIHdoaWNoIHVzZSB0aGUgbGlicmFyeSB0byBjb252ZXJ0IEpQRUcKK2ZpbGVzIHRvIGFuZCBmcm9tIHNvbWUgb3RoZXIgcG9wdWxhciBpbWFnZSBmb3JtYXRzLiAgQSB0aGlyZCBhcHBsaWNhdGlvbgorImpwZWd0cmFuIiB1c2VzIHRoZSBsaWJyYXJ5IHRvIGRvIGxvc3NsZXNzIGNvbnZlcnNpb24gYmV0d2VlbiBkaWZmZXJlbnQKK3ZhcmlhbnRzIG9mIEpQRUcuICBUaGVyZSBhcmUgYWxzbyB0d28gc3RhbmQtYWxvbmUgYXBwbGljYXRpb25zLAorInJkanBnY29tIiBhbmQgIndyanBnY29tIi4KKworCitUSEUgSlBFRyBMSUJSQVJZCis9PT09PT09PT09PT09PT09CisKK0luY2x1ZGUgZmlsZXM6CisKK2pwZWdsaWIuaAlKUEVHIGxpYnJhcnkncyBleHBvcnRlZCBkYXRhIGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCitqY29uZmlnLmgJQ29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnMuICBOb3RlOiB0aGlzIGZpbGUgaXMgbm90IHByZXNlbnQKKwkJaW4gdGhlIGRpc3RyaWJ1dGlvbjsgaXQgaXMgZ2VuZXJhdGVkIGR1cmluZyBpbnN0YWxsYXRpb24uCitqbW9yZWNmZy5oCUFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBkZWNsYXJhdGlvbnM7IG5lZWQgbm90IGJlIGNoYW5nZWQKKwkJZm9yIGEgc3RhbmRhcmQgaW5zdGFsbGF0aW9uLgoramVycm9yLmgJRGVjbGFyZXMgSlBFRyBsaWJyYXJ5J3MgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2UgY29kZXMuCitqaW5jbHVkZS5oCUNlbnRyYWwgaW5jbHVkZSBmaWxlIHVzZWQgYnkgYWxsIElKRyAuYyBmaWxlcyB0byByZWZlcmVuY2UKKwkJc3lzdGVtIGluY2x1ZGUgZmlsZXMuCitqcGVnaW50LmgJSlBFRyBsaWJyYXJ5J3MgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgoramNodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZW5jb2RlciBtb2R1bGVzLgoramRodWZmLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIEh1ZmZtYW4gZGVjb2RlciBtb2R1bGVzLgoramRjdC5oCQlQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgZm9yd2FyZCAmIHJldmVyc2UgRENUIHN1YnN5c3RlbXMuCitqbWVtc3lzLmgJUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4KK2p2ZXJzaW9uLmgJVmVyc2lvbiBpbmZvcm1hdGlvbi4KKworQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBpbmNsdWRlIGpwZWdsaWIuaCAod2hpY2ggaW4gdHVybgoraW5jbHVkZXMgamNvbmZpZy5oIGFuZCBqbW9yZWNmZy5oKS4gIE9wdGlvbmFsbHksIGplcnJvci5oIG1heSBiZSBpbmNsdWRlZAoraWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZmVyZW5jZSBpbmRpdmlkdWFsIEpQRUcgZXJyb3IgY29kZXMuICBUaGUKK290aGVyIGluY2x1ZGUgZmlsZXMgYXJlIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2UgYW5kIHdvdWxkIG5vdCBub3JtYWxseQorYmUgaW5jbHVkZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbS4gIChjanBlZy9kanBlZy9ldGMgZG8gdXNlIGppbmNsdWRlLmgsCitzaW5jZSBpdHMgZnVuY3Rpb24gaXMgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBvZiB0aGUgd2hvbGUgSUpHIGRpc3RyaWJ1dGlvbi4KK01vc3Qgb3RoZXIgYXBwbGljYXRpb25zIHdpbGwgZGlyZWN0bHkgaW5jbHVkZSB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhleQord2FudCwgYW5kIGhlbmNlIHdvbid0IG5lZWQgamluY2x1ZGUuaC4pCisKKworQyBzb3VyY2UgY29kZSBmaWxlczoKKworVGhlc2UgZmlsZXMgY29udGFpbiBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5CithbiBhcHBsaWNhdGlvbiBwcm9ncmFtOgorCitqY2FwaW1pbi5jCUFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlOiBjb3JlIHJvdXRpbmVzIGZvciBjb21wcmVzc2lvbi4KK2pjYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGNvbXByZXNzaW9uLgoramRhcGltaW4uYwlBcHBsaWNhdGlvbiBwcm9ncmFtIGludGVyZmFjZTogY29yZSByb3V0aW5lcyBmb3IgZGVjb21wcmVzc2lvbi4KK2pkYXBpc3RkLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2U6IHN0YW5kYXJkIGRlY29tcHJlc3Npb24uCitqY29tYXBpLmMJQXBwbGljYXRpb24gcHJvZ3JhbSBpbnRlcmZhY2Ugcm91dGluZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uCisJCWFuZCBkZWNvbXByZXNzaW9uLgoramNwYXJhbS5jCUNvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR0aW5nIGhlbHBlciByb3V0aW5lcy4KK2pjdHJhbnMuYwlBUEkgYW5kIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLgoramR0cmFucy5jCUFQSSBhbmQgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbi4KKworQ29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKKworamNpbml0LmMJSW5pdGlhbGl6YXRpb246IGRldGVybWluZXMgd2hpY2ggb3RoZXIgbW9kdWxlcyB0byB1c2UuCitqY21hc3Rlci5jCU1hc3RlciBjb250cm9sOiBzZXR1cCBhbmQgaW50ZXItcGFzcyBzZXF1ZW5jaW5nIGxvZ2ljLgoramNtYWluY3QuYwlNYWluIGJ1ZmZlciBjb250cm9sbGVyIChwcmVwcm9jZXNzb3IgPT4gSlBFRyBjb21wcmVzc29yKS4KK2pjcHJlcGN0LmMJUHJlcHJvY2Vzc29yIGJ1ZmZlciBjb250cm9sbGVyLgoramNjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KK2pjY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgoramNzYW1wbGUuYwlEb3duc2FtcGxpbmcuCitqY2RjdG1nci5jCURDVCBtYW5hZ2VyIChEQ1QgaW1wbGVtZW50YXRpb24gc2VsZWN0aW9uICYgY29udHJvbCkuCitqZmRjdGludC5jCUZvcndhcmQgRENUIHVzaW5nIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgoramZkY3Rmc3QuYwlGb3J3YXJkIERDVCB1c2luZyBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QuCitqZmRjdGZsdC5jCUZvcndhcmQgRENUIHVzaW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMuCitqY2h1ZmYuYwlIdWZmbWFuIGVudHJvcHkgY29kaW5nIGZvciBzZXF1ZW50aWFsIEpQRUcuCitqY3BodWZmLmMJSHVmZm1hbiBlbnRyb3B5IGNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KK2pjbWFya2VyLmMJSlBFRyBtYXJrZXIgd3JpdGluZy4KK2pkYXRhZHN0LmMJRGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGZvciBzdGRpbyBvdXRwdXQuCisKK0RlY29tcHJlc3Npb24gc2lkZSBvZiB0aGUgbGlicmFyeToKKworamRtYXN0ZXIuYwlNYXN0ZXIgY29udHJvbDogZGV0ZXJtaW5lcyB3aGljaCBvdGhlciBtb2R1bGVzIHRvIHVzZS4KK2pkaW5wdXQuYwlJbnB1dCBjb250cm9sbGVyOiBjb250cm9scyBpbnB1dCBwcm9jZXNzaW5nIG1vZHVsZXMuCitqZG1haW5jdC5jCU1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKEpQRUcgZGVjb21wcmVzc29yID0+IHBvc3Rwcm9jZXNzb3IpLgoramRjb2VmY3QuYwlCdWZmZXIgY29udHJvbGxlciBmb3IgRENUIGNvZWZmaWNpZW50IGJ1ZmZlci4KK2pkcG9zdGN0LmMJUG9zdHByb2Nlc3NvciBidWZmZXIgY29udHJvbGxlci4KK2pkbWFya2VyLmMJSlBFRyBtYXJrZXIgcmVhZGluZy4KK2pkaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3Igc2VxdWVudGlhbCBKUEVHLgoramRwaHVmZi5jCUh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KK2pkZGN0bWdyLmMJSURDVCBtYW5hZ2VyIChJRENUIGltcGxlbWVudGF0aW9uIHNlbGVjdGlvbiAmIGNvbnRyb2wpLgoramlkY3RpbnQuYwlJbnZlcnNlIERDVCB1c2luZyBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZC4KK2ppZGN0ZnN0LmMJSW52ZXJzZSBEQ1QgdXNpbmcgZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kLgoramlkY3RmbHQuYwlJbnZlcnNlIERDVCB1c2luZyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgoramlkY3RyZWQuYwlJbnZlcnNlIERDVHMgd2l0aCByZWR1Y2VkLXNpemUgb3V0cHV0cy4KK2pkc2FtcGxlLmMJVXBzYW1wbGluZy4KK2pkY29sb3IuYwlDb2xvciBzcGFjZSBjb252ZXJzaW9uLgoramRtZXJnZS5jCU1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24gKGZhc3RlciwgbG93ZXIgcXVhbGl0eSkuCitqcXVhbnQxLmMJT25lLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIHVzaW5nIGEgZml4ZWQtc3BhY2luZyBjb2xvcm1hcC4KK2pxdWFudDIuYwlUd28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gdXNpbmcgYSBjdXN0b20tZ2VuZXJhdGVkIGNvbG9ybWFwLgorCQlBbHNvIGhhbmRsZXMgb25lLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsbHkgZ2l2ZW4gbWFwLgoramRhdGFzcmMuYwlEYXRhIHNvdXJjZSBtYW5hZ2VyIGZvciBzdGRpbyBpbnB1dC4KKworU3VwcG9ydCBmaWxlcyBmb3IgYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbjoKKworamVycm9yLmMJU3RhbmRhcmQgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMgKGFwcGxpY2F0aW9uIHJlcGxhY2VhYmxlKS4KK2ptZW1tZ3IuYwlTeXN0ZW0taW5kZXBlbmRlbnQgKG1vcmUgb3IgbGVzcykgbWVtb3J5IG1hbmFnZW1lbnQgY29kZS4KK2p1dGlscy5jCU1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcy4KKworam1lbW1nci5jIHJlbGllcyBvbiBhIHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQgbW9kdWxlLiAgVGhlIElKRworZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzeXN0ZW0tZGVwZW5kZW50Cittb2R1bGU6CisKK2ptZW1ub2JzLmMJIk5vIGJhY2tpbmcgc3RvcmUiOiBhc3N1bWVzIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5IGV4aXN0cy4KK2ptZW1hbnNpLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggQU5TSS1zdGFuZGFyZCByb3V0aW5lIHRtcGZpbGUoKS4KK2ptZW1uYW1lLmMJTWFrZXMgdGVtcG9yYXJ5IGZpbGVzIHdpdGggcHJvZ3JhbS1nZW5lcmF0ZWQgZmlsZSBuYW1lcy4KK2ptZW1kb3MuYwlDdXN0b20gaW1wbGVtZW50YXRpb24gZm9yIE1TLURPUyAoMTYtYml0IGVudmlyb25tZW50IG9ubHkpOgorCQljYW4gdXNlIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnkgYXMgd2VsbCBhcyB0ZW1wIGZpbGVzLgoram1lbW1hYy5jCUN1c3RvbSBpbXBsZW1lbnRhdGlvbiBmb3IgQXBwbGUgTWFjaW50b3NoLgorCitFeGFjdGx5IG9uZSBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBtb2R1bGVzIHNob3VsZCBiZSBjb25maWd1cmVkIGludG8gYW4KK2luc3RhbGxlZCBKUEVHIGxpYnJhcnkgKHNlZSBpbnN0YWxsLmRvYyBmb3IgaGludHMgYWJvdXQgd2hpY2ggb25lIHRvIHVzZSkuCitPbiB1bnVzdWFsIHN5c3RlbXMgeW91IG1heSBmaW5kIGl0IHdvcnRod2hpbGUgdG8gbWFrZSBhIHNwZWNpYWwKK3N5c3RlbS1kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZXIuCisKKworTm9uLUMgc291cmNlIGNvZGUgZmlsZXM6CisKK2ptZW1kb3NhLmFzbQk4MHg4NiBhc3NlbWJseSBjb2RlIHN1cHBvcnQgZm9yIGptZW1kb3MuYzsgdXNlZCBvbmx5IGluCisJCU1TLURPUy1zcGVjaWZpYyBjb25maWd1cmF0aW9ucyBvZiB0aGUgSlBFRyBsaWJyYXJ5LgorCisKK0NKUEVHL0RKUEVHL0pQRUdUUkFOCis9PT09PT09PT09PT09PT09PT09PQorCitJbmNsdWRlIGZpbGVzOgorCitjZGpwZWcuaAlEZWNsYXJhdGlvbnMgc2hhcmVkIGJ5IGNqcGVnL2RqcGVnL2pwZWd0cmFuIG1vZHVsZXMuCitjZGVycm9yLmgJQWRkaXRpb25hbCBlcnJvciBhbmQgdHJhY2UgbWVzc2FnZSBjb2RlcyBmb3IgY2pwZWcgZXQgYWwuCit0cmFuc3VwcC5oCURlY2xhcmF0aW9ucyBmb3IganBlZ3RyYW4gc3VwcG9ydCByb3V0aW5lcyBpbiB0cmFuc3VwcC5jLgorCitDIHNvdXJjZSBjb2RlIGZpbGVzOgorCitjanBlZy5jCQlNYWluIHByb2dyYW0gZm9yIGNqcGVnLgorZGpwZWcuYwkJTWFpbiBwcm9ncmFtIGZvciBkanBlZy4KK2pwZWd0cmFuLmMJTWFpbiBwcm9ncmFtIGZvciBqcGVndHJhbi4KK2NkanBlZy5jCVV0aWxpdHkgcm91dGluZXMgdXNlZCBieSBhbGwgdGhyZWUgcHJvZ3JhbXMuCityZGNvbG1hcC5jCUNvZGUgdG8gcmVhZCBhIGNvbG9ybWFwIGZpbGUgZm9yIGRqcGVnJ3MgIi1tYXAiIHN3aXRjaC4KK3Jkc3dpdGNoLmMJQ29kZSB0byBwcm9jZXNzIHNvbWUgb2YgY2pwZWcncyBtb3JlIGNvbXBsZXggc3dpdGNoZXMuCisJCUFsc28gdXNlZCBieSBqcGVndHJhbi4KK3RyYW5zdXBwLmMJU3VwcG9ydCBjb2RlIGZvciBqcGVndHJhbjogbG9zc2xlc3MgaW1hZ2UgbWFuaXB1bGF0aW9ucy4KKworSW1hZ2UgZmlsZSByZWFkZXIgbW9kdWxlcyBmb3IgY2pwZWc6CisKK3JkYm1wLmMJCUJNUCBmaWxlIGlucHV0LgorcmRnaWYuYwkJR0lGIGZpbGUgaW5wdXQgKG5vdyBqdXN0IGEgc3R1YikuCityZHBwbS5jCQlQUE0vUEdNIGZpbGUgaW5wdXQuCityZHJsZS5jCQlVdGFoIFJMRSBmaWxlIGlucHV0LgorcmR0YXJnYS5jCVRhcmdhIGZpbGUgaW5wdXQuCisKK0ltYWdlIGZpbGUgd3JpdGVyIG1vZHVsZXMgZm9yIGRqcGVnOgorCit3cmJtcC5jCQlCTVAgZmlsZSBvdXRwdXQuCit3cmdpZi5jCQlHSUYgZmlsZSBvdXRwdXQgKGEgbWVyZSBzaGFkb3cgb2YgaXRzIGZvcm1lciBzZWxmKS4KK3dycHBtLmMJCVBQTS9QR00gZmlsZSBvdXRwdXQuCit3cnJsZS5jCQlVdGFoIFJMRSBmaWxlIG91dHB1dC4KK3dydGFyZ2EuYwlUYXJnYSBmaWxlIG91dHB1dC4KKworCitSREpQR0NPTS9XUkpQR0NPTQorPT09PT09PT09PT09PT09PT0KKworQyBzb3VyY2UgY29kZSBmaWxlczoKKworcmRqcGdjb20uYwlTdGFuZC1hbG9uZSByZGpwZ2NvbSBhcHBsaWNhdGlvbi4KK3dyanBnY29tLmMJU3RhbmQtYWxvbmUgd3JqcGdjb20gYXBwbGljYXRpb24uCisKK1RoZXNlIHByb2dyYW1zIGRvIG5vdCBkZXBlbmQgb24gdGhlIElKRyBsaWJyYXJ5LiAgVGhleSBkbyB1c2UKK2pjb25maWcuaCBhbmQgamluY2x1ZGUuaCwgb25seSB0byBpbXByb3ZlIHBvcnRhYmlsaXR5LgorCisKK0FERElUSU9OQUwgRklMRVMKKz09PT09PT09PT09PT09PT0KKworRG9jdW1lbnRhdGlvbiAoc2VlIFJFQURNRSBmb3IgYSBndWlkZSB0byB0aGUgZG9jdW1lbnRhdGlvbiBmaWxlcyk6CisKK1JFQURNRQkJTWFzdGVyIGRvY3VtZW50YXRpb24gZmlsZS4KKyouZG9jCQlPdGhlciBkb2N1bWVudGF0aW9uIGZpbGVzLgorKi4xCQlEb2N1bWVudGF0aW9uIGluIFVuaXggbWFuIHBhZ2UgZm9ybWF0LgorY2hhbmdlLmxvZwlWZXJzaW9uLXRvLXZlcnNpb24gY2hhbmdlIGhpZ2hsaWdodHMuCitleGFtcGxlLmMJU2FtcGxlIGNvZGUgZm9yIGNhbGxpbmcgSlBFRyBsaWJyYXJ5LgorCitDb25maWd1cmF0aW9uL2luc3RhbGxhdGlvbiBmaWxlcyBhbmQgcHJvZ3JhbXMgKHNlZSBpbnN0YWxsLmRvYyBmb3IgbW9yZSBpbmZvKToKKworY29uZmlndXJlCVVuaXggc2hlbGwgc2NyaXB0IHRvIHBlcmZvcm0gYXV0b21hdGljIGNvbmZpZ3VyYXRpb24uCitsdGNvbmZpZwlTdXBwb3J0IHNjcmlwdHMgZm9yIGNvbmZpZ3VyZSAoZnJvbSBHTlUgbGlidG9vbCkuCitsdG1haW4uc2gKK2NvbmZpZy5ndWVzcworY29uZmlnLnN1YgoraW5zdGFsbC1zaAlJbnN0YWxsIHNoZWxsIHNjcmlwdCBmb3IgdGhvc2UgVW5peCBzeXN0ZW1zIGxhY2tpbmcgb25lLgorY2tjb25maWcuYwlQcm9ncmFtIHRvIGdlbmVyYXRlIGpjb25maWcuaCBvbiBub24tVW5peCBzeXN0ZW1zLgoramNvbmZpZy5kb2MJVGVtcGxhdGUgZm9yIG1ha2luZyBqY29uZmlnLmggYnkgaGFuZC4KK21ha2VmaWxlLioJU2FtcGxlIG1ha2VmaWxlcyBmb3IgcGFydGljdWxhciBzeXN0ZW1zLgoramNvbmZpZy4qCVNhbXBsZSBqY29uZmlnLmggZm9yIHBhcnRpY3VsYXIgc3lzdGVtcy4KK2Fuc2kya25yLmMJRGUtQU5TSWZpZXIgZm9yIHByZS1BTlNJIEMgY29tcGlsZXJzIChjb3VydGVzeSBvZgorCQlMLiBQZXRlciBEZXV0c2NoIGFuZCBBbGFkZGluIEVudGVycHJpc2VzKS4KKworVGVzdCBmaWxlcyAoc2VlIGluc3RhbGwuZG9jIGZvciB0ZXN0IHByb2NlZHVyZSk6CisKK3Rlc3QqLioJCVNvdXJjZSBhbmQgY29tcGFyaXNvbiBmaWxlcyBmb3IgY29uZmlkZW5jZSB0ZXN0LgorCQlUaGVzZSBhcmUgYmluYXJ5IGltYWdlIGZpbGVzLCBOT1QgdGV4dCBmaWxlcy4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9pbnN0YWxsLXNoIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTg0MzY2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9pbnN0YWxsLXNoCkBAIC0wLDAgKzEsMjUwIEBACisjIS9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9pbnN0YWxsLmRvYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9pbnN0YWxsLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzAyYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2luc3RhbGwuZG9jCkBAIC0wLDAgKzEsMTA2MyBAQAorSU5TVEFMTEFUSU9OIElOU1RSVUNUSU9OUyBmb3IgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCisKK0NvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCitGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisKKworVGhpcyBmaWxlIGV4cGxhaW5zIGhvdyB0byBjb25maWd1cmUgYW5kIGluc3RhbGwgdGhlIElKRyBzb2Z0d2FyZS4gIFdlIGhhdmUKK3RyaWVkIHRvIG1ha2UgdGhpcyBzb2Z0d2FyZSBleHRyZW1lbHkgcG9ydGFibGUgYW5kIGZsZXhpYmxlLCBzbyB0aGF0IGl0IGNhbiBiZQorYWRhcHRlZCB0byBhbG1vc3QgYW55IGVudmlyb25tZW50LiAgVGhlIGRvd25zaWRlIG9mIHRoaXMgZGVjaXNpb24gaXMgdGhhdCB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzIGlzIGNvbXBsaWNhdGVkLiAgV2UgaGF2ZSBwcm92aWRlZCBzaG9ydGN1dHMgdG8gc2ltcGxpZnkKK3RoZSB0YXNrIG9uIGNvbW1vbiBzeXN0ZW1zLiAgQnV0IGluIGFueSBjYXNlLCB5b3Ugd2lsbCBuZWVkIGF0IGxlYXN0IGEgbGl0dGxlCitmYW1pbGlhcml0eSB3aXRoIEMgcHJvZ3JhbW1pbmcgYW5kIHByb2dyYW0gYnVpbGQgcHJvY2VkdXJlcyBmb3IgeW91ciBzeXN0ZW0uCisKK0lmIHlvdSBhcmUgb25seSB1c2luZyB0aGlzIHNvZnR3YXJlIGFzIHBhcnQgb2YgYSBsYXJnZXIgcHJvZ3JhbSwgdGhlIGxhcmdlcgorcHJvZ3JhbSdzIGluc3RhbGxhdGlvbiBwcm9jZWR1cmUgbWF5IHRha2UgY2FyZSBvZiBjb25maWd1cmluZyB0aGUgSUpHIGNvZGUuCitGb3IgZXhhbXBsZSwgR2hvc3RzY3JpcHQncyBpbnN0YWxsYXRpb24gc2NyaXB0IHdpbGwgY29uZmlndXJlIHRoZSBJSkcgY29kZS4KK1lvdSBkb24ndCBuZWVkIHRvIHJlYWQgdGhpcyBmaWxlIGlmIHlvdSBqdXN0IHdhbnQgdG8gY29tcGlsZSBHaG9zdHNjcmlwdC4KKworSWYgeW91IGFyZSBvbiBhIFVuaXggbWFjaGluZSwgeW91IG1heSBub3QgbmVlZCB0byByZWFkIHRoaXMgZmlsZSBhdCBhbGwuCitUcnkgZG9pbmcKKwkuL2NvbmZpZ3VyZQorCW1ha2UKKwltYWtlIHRlc3QKK0lmIHRoYXQgZG9lc24ndCBjb21wbGFpbiwgZG8KKwltYWtlIGluc3RhbGwKKyhiZXR0ZXIgZG8gIm1ha2UgLW4gaW5zdGFsbCIgZmlyc3QgdG8gc2VlIGlmIHRoZSBtYWtlZmlsZSB3aWxsIHB1dCB0aGUgZmlsZXMKK3doZXJlIHlvdSB3YW50IHRoZW0pLiAgUmVhZCBmdXJ0aGVyIGlmIHlvdSBydW4gaW50byBzbmFncyBvciB3YW50IHRvIGN1c3RvbWl6ZQordGhlIGNvZGUgZm9yIHlvdXIgc3lzdGVtLgorCisKK1RBQkxFIE9GIENPTlRFTlRTCistLS0tLS0tLS0tLS0tLS0tLQorCitCZWZvcmUgeW91IHN0YXJ0CitDb25maWd1cmluZyB0aGUgc29mdHdhcmU6CisJdXNpbmcgdGhlIGF1dG9tYXRpYyAiY29uZmlndXJlIiBzY3JpcHQKKwl1c2luZyBvbmUgb2YgdGhlIHN1cHBsaWVkIGpjb25maWcgYW5kIG1ha2VmaWxlIGZpbGVzCisJYnkgaGFuZAorQnVpbGRpbmcgdGhlIHNvZnR3YXJlCitUZXN0aW5nIHRoZSBzb2Z0d2FyZQorSW5zdGFsbGluZyB0aGUgc29mdHdhcmUKK09wdGlvbmFsIHN0dWZmCitPcHRpbWl6YXRpb24KK0hpbnRzIGZvciBzcGVjaWZpYyBzeXN0ZW1zCisKKworQkVGT1JFIFlPVSBTVEFSVAorPT09PT09PT09PT09PT09PQorCitCZWZvcmUgaW5zdGFsbGluZyB0aGUgc29mdHdhcmUgeW91IG11c3QgdW5wYWNrIHRoZSBkaXN0cmlidXRlZCBzb3VyY2UgY29kZS4KK1NpbmNlIHlvdSBhcmUgcmVhZGluZyB0aGlzIGZpbGUsIHlvdSBoYXZlIHByb2JhYmx5IGFscmVhZHkgc3VjY2VlZGVkIGluIHRoaXMKK3Rhc2suICBIb3dldmVyLCB0aGVyZSBpcyBhIHBvdGVudGlhbCBmb3IgZXJyb3IgaWYgeW91IG5lZWRlZCB0byBjb252ZXJ0IHRoZQorZmlsZXMgdG8gdGhlIGxvY2FsIHN0YW5kYXJkIHRleHQgZmlsZSBmb3JtYXQgKGZvciBleGFtcGxlLCBpZiB5b3UgYXJlIG9uCitNUy1ET1MgeW91IG1heSBoYXZlIGNvbnZlcnRlZCBMRiBlbmQtb2YtbGluZSB0byBDUi9MRikuICBZb3UgbXVzdCBhcHBseQorc3VjaCBjb252ZXJzaW9uIHRvIGFsbCB0aGUgZmlsZXMgRVhDRVBUIHRob3NlIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggInRlc3QiLgorVGhlIHRlc3QgZmlsZXMgY29udGFpbiBiaW5hcnkgZGF0YTsgaWYgeW91IGNoYW5nZSB0aGVtIGluIGFueSB3YXkgdGhlbiB0aGUKK3NlbGYtdGVzdCB3aWxsIGdpdmUgYmFkIHJlc3VsdHMuCisKK1BsZWFzZSBjaGVjayB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoaXMgZmlsZSB0byBzZWUgaWYgdGhlcmUgYXJlIGhpbnRzIGZvciB0aGUKK3NwZWNpZmljIG1hY2hpbmUgb3IgY29tcGlsZXIgeW91IGFyZSB1c2luZy4KKworCitDT05GSUdVUklORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitUbyBjb25maWd1cmUgdGhlIElKRyBjb2RlIGZvciB5b3VyIHN5c3RlbSwgeW91IG5lZWQgdG8gY3JlYXRlIHR3byBmaWxlczoKKyAgKiBqY29uZmlnLmg6IGNvbnRhaW5zIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCAjZGVmaW5lIHN5bWJvbHMuCisgICogTWFrZWZpbGU6IGNvbnRyb2xzIHRoZSBjb21waWxhdGlvbiBwcm9jZXNzLgorKE9uIGEgbm9uLVVuaXggbWFjaGluZSwgeW91IG1heSBjcmVhdGUgInByb2plY3QgZmlsZXMiIG9yIHNvbWUgb3RoZXIKK3N1YnN0aXR1dGUgZm9yIGEgTWFrZWZpbGUuICBqY29uZmlnLmggaXMgbmVlZGVkIGluIGFueSBlbnZpcm9ubWVudC4pCisKK1dlIHByb3ZpZGUgdGhyZWUgZGlmZmVyZW50IHdheXMgdG8gZ2VuZXJhdGUgdGhlc2UgZmlsZXM6CisgICogT24gYSBVbml4IHN5c3RlbSwgeW91IGNhbiBqdXN0IHJ1biB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LgorICAqIFdlIHByb3ZpZGUgc2FtcGxlIGpjb25maWcgZmlsZXMgYW5kIG1ha2VmaWxlcyBmb3IgcG9wdWxhciBtYWNoaW5lczsKKyAgICBpZiB5b3VyIG1hY2hpbmUgbWF0Y2hlcyBvbmUgb2YgdGhlIHNhbXBsZXMsIGp1c3QgY29weSB0aGUgcmlnaHQgc2FtcGxlCisgICAgZmlsZXMgdG8gamNvbmZpZy5oIGFuZCBNYWtlZmlsZS4KKyAgKiBJZiBhbGwgZWxzZSBmYWlscywgcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG93IGFuZCBtYWtlIHlvdXIgb3duIGZpbGVzLgorCisKK0NvbmZpZ3VyaW5nIHRoZSBzb2Z0d2FyZSB1c2luZyB0aGUgYXV0b21hdGljICJjb25maWd1cmUiIHNjcmlwdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUsIHlvdSBjYW4ganVzdCB0eXBlCisJLi9jb25maWd1cmUKK2FuZCBsZXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY29uc3RydWN0IGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCitJZiB5b3UncmUgdXNpbmcgImNzaCIgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKKwlzaCBjb25maWd1cmUKK2luc3RlYWQgdG8gcHJldmVudCBjc2ggZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZSBjb25maWd1cmUgaXRzZWxmLgorRXhwZWN0IGNvbmZpZ3VyZSB0byBydW4gZm9yIGEgZmV3IG1pbnV0ZXMsIHBhcnRpY3VsYXJseSBvbiBzbG93ZXIgbWFjaGluZXM7CitpdCB3b3JrcyBieSBjb21waWxpbmcgYSBzZXJpZXMgb2YgdGVzdCBwcm9ncmFtcy4KKworQ29uZmlndXJlIHdhcyBjcmVhdGVkIHdpdGggR05VIEF1dG9jb25mIGFuZCBpdCBmb2xsb3dzIHRoZSB1c3VhbCBjb252ZW50aW9ucworZm9yIEdOVSBjb25maWd1cmUgc2NyaXB0cy4gIEl0IG1ha2VzIGEgZmV3IGFzc3VtcHRpb25zIHRoYXQgeW91IG1heSB3YW50IHRvCitvdmVycmlkZS4gIFlvdSBjYW4gZG8gdGhpcyBieSBwcm92aWRpbmcgb3B0aW9uYWwgc3dpdGNoZXMgdG8gY29uZmlndXJlOgorCisqIElmIHlvdSB3YW50IHRvIGJ1aWxkIGxpYmpwZWcgYXMgYSBzaGFyZWQgbGlicmFyeSwgc2F5CisJLi9jb25maWd1cmUgLS1lbmFibGUtc2hhcmVkCitUbyBnZXQgYm90aCBzaGFyZWQgYW5kIHN0YXRpYyBsaWJyYXJpZXMsIHNheQorCS4vY29uZmlndXJlIC0tZW5hYmxlLXNoYXJlZCAtLWVuYWJsZS1zdGF0aWMKK05vdGUgdGhhdCB0aGVzZSBzd2l0Y2hlcyBpbnZva2UgR05VIGxpYnRvb2wgdG8gdGFrZSBjYXJlIG9mIHN5c3RlbS1kZXBlbmRlbnQKK3NoYXJlZCBsaWJyYXJ5IGJ1aWxkaW5nIG1ldGhvZHMuICBJZiB0aGluZ3MgZG9uJ3Qgd29yayB0aGlzIHdheSwgcGxlYXNlIHRyeQorcnVubmluZyBjb25maWd1cmUgd2l0aG91dCBlaXRoZXIgc3dpdGNoOyB0aGF0IHNob3VsZCBidWlsZCBhIHN0YXRpYyBsaWJyYXJ5Cit3aXRob3V0IHVzaW5nIGxpYnRvb2wuICBJZiB0aGF0IHdvcmtzLCB5b3VyIHByb2JsZW0gaXMgcHJvYmFibHkgd2l0aCBsaWJ0b29sCitub3Qgd2l0aCB0aGUgSUpHIGNvZGUuICBsaWJ0b29sIGlzIGZhaXJseSBuZXcgYW5kIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZmxhdm9ycworb2YgVW5peCB5ZXQuICAoWW91IG1pZ2h0IGJlIGFibGUgdG8gZmluZCBhIG5ld2VyIHZlcnNpb24gb2YgbGlidG9vbCB0aGFuIHRoZQorb25lIGluY2x1ZGVkIHdpdGggbGlianBlZzsgc2VlIGZ0cC5nbnUub3JnLiAgUmVwb3J0IGxpYnRvb2wgcHJvYmxlbXMgdG8KK2J1Zy1saWJ0b29sQGdudS5vcmcuKQorCisqIENvbmZpZ3VyZSB3aWxsIHVzZSBnY2MgKEdOVSBDIGNvbXBpbGVyKSBpZiBpdCdzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGNjLgorVG8gZm9yY2UgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIHRvIGJlIHNlbGVjdGVkLCB1c2UgdGhlIENDIG9wdGlvbiwgZm9yIGV4YW1wbGUKKwkuL2NvbmZpZ3VyZSBDQz0nY2MnCitUaGUgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaW5jbHVkZSBhbnkgdW51c3VhbCBjb21waWxlciBzd2l0Y2hlcy4KK0ZvciBleGFtcGxlLCBvbiBIUC1VWCB5b3UgcHJvYmFibHkgd2FudCB0byBzYXkKKwkuL2NvbmZpZ3VyZSBDQz0nY2MgLUFhJwordG8gZ2V0IEhQJ3MgY29tcGlsZXIgdG8gcnVuIGluIEFOU0kgbW9kZS4KKworKiBUaGUgZGVmYXVsdCBDRkxBR1Mgc2V0dGluZyBpcyAiLU8iIGZvciBub24tZ2NjIGNvbXBpbGVycywgIi1PMiIgZm9yIGdjYy4KK1lvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSBzYXlpbmcsIGZvciBleGFtcGxlLAorCS4vY29uZmlndXJlIENGTEFHUz0nLWcnCitpZiB5b3Ugd2FudCB0byBjb21waWxlIHdpdGggZGVidWdnaW5nIHN1cHBvcnQuCisKKyogQ29uZmlndXJlIHdpbGwgc2V0IHVwIHRoZSBtYWtlZmlsZSBzbyB0aGF0ICJtYWtlIGluc3RhbGwiIHdpbGwgaW5zdGFsbCBmaWxlcworaW50byAvdXNyL2xvY2FsL2JpbiwgL3Vzci9sb2NhbC9tYW4sIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24KK3ByZWZpeCBvdGhlciB0aGFuICIvdXNyL2xvY2FsIiBieSBnaXZpbmcgY29uZmlndXJlIHRoZSBvcHRpb24gIi0tcHJlZml4PVBBVEgiLgorCisqIElmIHlvdSBkb24ndCBoYXZlIGEgbG90IG9mIHN3YXAgc3BhY2UsIHlvdSBtYXkgbmVlZCB0byBlbmFibGUgdGhlIElKRworc29mdHdhcmUncyBpbnRlcm5hbCB2aXJ0dWFsIG1lbW9yeSBtZWNoYW5pc20uICBUbyBkbyB0aGlzLCBnaXZlIHRoZSBvcHRpb24KKyItLWVuYWJsZS1tYXhtZW09TiIgd2hlcmUgTiBpcyB0aGUgZGVmYXVsdCBtYXhtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzLgorVGhpcyBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwgdW5kZXIgIlNlbGVjdGluZyBhIG1lbW9yeSBtYW5hZ2VyIiwgYmVsb3cuCitZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIG9uIHJlYXNvbmFibHktc2l6ZWQgVW5peCBtYWNoaW5lcywKK3VubGVzcyB5b3UgcGxhbiB0byBwcm9jZXNzIHZlcnkgbGFyZ2UgaW1hZ2VzLgorCitDb25maWd1cmUgaGFzIHNvbWUgb3RoZXIgZmVhdHVyZXMgdGhhdCBhcmUgdXNlZnVsIGlmIHlvdSBhcmUgY3Jvc3MtY29tcGlsaW5nCitvciB3b3JraW5nIGluIGEgbmV0d29yayBvZiBtdWx0aXBsZSBtYWNoaW5lIHR5cGVzOyBidXQgaWYgeW91IG5lZWQgdGhvc2UKK2ZlYXR1cmVzLCB5b3UgcHJvYmFibHkgYWxyZWFkeSBrbm93IGhvdyB0byB1c2UgdGhlbS4KKworCitDb25maWd1cmluZyB0aGUgc29mdHdhcmUgdXNpbmcgb25lIG9mIHRoZSBzdXBwbGllZCBqY29uZmlnIGFuZCBtYWtlZmlsZSBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IGhhdmUgb25lIG9mIHRoZXNlIHN5c3RlbXMsIHlvdSBjYW4ganVzdCB1c2UgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24KK2ZpbGVzOgorCitNYWtlZmlsZQlqY29uZmlnIGZpbGUJU3lzdGVtIGFuZC9vciBjb21waWxlcgorCittYWtlZmlsZS5tYW54CWpjb25maWcubWFueAlBbWlnYSwgTWFueCBBenRlYyBDCittYWtlZmlsZS5zYXMJamNvbmZpZy5zYXMJQW1pZ2EsIFNBUyBDCittYWtlcHJvai5tYWMJamNvbmZpZy5tYWMJQXBwbGUgTWFjaW50b3NoLCBNZXRyb3dlcmtzIENvZGVXYXJyaW9yCittYWsqanBlZy5zdAlqY29uZmlnLnN0CUF0YXJpIFNUL1NURS9UVCwgUHVyZSBDIG9yIFR1cmJvIEMKK21ha2VmaWxlLmJjYwlqY29uZmlnLmJjYwlNUy1ET1Mgb3IgT1MvMiwgQm9ybGFuZCBDCittYWtlZmlsZS5kaglqY29uZmlnLmRqCU1TLURPUywgREpHUFAgKERlbG9yaWUncyBwb3J0IG9mIEdOVSBDKQorbWFrZWZpbGUubWM2CWpjb25maWcubWM2CU1TLURPUywgTWljcm9zb2Z0IEMgKDE2LWJpdCBvbmx5KQorbWFrZWZpbGUud2F0CWpjb25maWcud2F0CU1TLURPUywgT1MvMiwgb3IgV2luZG93cyBOVCwgV2F0Y29tIEMKK21ha2VmaWxlLnZjCWpjb25maWcudmMJV2luZG93cyBOVC85NSwgTVMgVmlzdWFsIEMrKworbWFrZSouZHMJamNvbmZpZy52YwlXaW5kb3dzIE5ULzk1LCBNUyBEZXZlbG9wZXIgU3R1ZGlvCittYWtlZmlsZS5tbXMJamNvbmZpZy52bXMJRGlnaXRhbCBWTVMsIHdpdGggTU1TIHNvZnR3YXJlCittYWtlZmlsZS52bXMJamNvbmZpZy52bXMJRGlnaXRhbCBWTVMsIHdpdGhvdXQgTU1TIHNvZnR3YXJlCisKK0NvcHkgdGhlIHByb3BlciBqY29uZmlnIGZpbGUgdG8gamNvbmZpZy5oIGFuZCB0aGUgbWFrZWZpbGUgdG8gTWFrZWZpbGUgKG9yCit3aGF0ZXZlciB5b3VyIHN5c3RlbSB1c2VzIGFzIHRoZSBzdGFuZGFyZCBtYWtlZmlsZSBuYW1lKS4gIEZvciBtb3JlIGluZm8gc2VlCit0aGUgYXBwcm9wcmlhdGUgc3lzdGVtLXNwZWNpZmljIGhpbnRzIHNlY3Rpb24gbmVhciB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKworCitDb25maWd1cmluZyB0aGUgc29mdHdhcmUgYnkgaGFuZAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRmlyc3QsIGdlbmVyYXRlIGEgamNvbmZpZy5oIGZpbGUuICBJZiB5b3UgYXJlIG1vZGVyYXRlbHkgZmFtaWxpYXIgd2l0aCBDLAordGhlIGNvbW1lbnRzIGluIGpjb25maWcuZG9jIHNob3VsZCBiZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZG8gdGhpczsganVzdAorY29weSBqY29uZmlnLmRvYyB0byBqY29uZmlnLmggYW5kIGVkaXQgaXQgYXBwcm9wcmlhdGVseS4gIE90aGVyd2lzZSwgeW91IG1heQorcHJlZmVyIHRvIHVzZSB0aGUgY2tjb25maWcuYyBwcm9ncmFtLiAgWW91IHdpbGwgbmVlZCB0byBjb21waWxlIGFuZCBleGVjdXRlCitja2NvbmZpZy5jIGJ5IGhhbmQgLS0tIHdlIGhvcGUgeW91IGtub3cgYXQgbGVhc3QgZW5vdWdoIHRvIGRvIHRoYXQuCitja2NvbmZpZy5jIG1heSBub3QgY29tcGlsZSB0aGUgZmlyc3QgdHJ5IChpbiBmYWN0LCB0aGUgd2hvbGUgaWRlYSBpcyBmb3IgaXQKK3RvIGZhaWwgaWYgYW55dGhpbmcgaXMgZ29pbmcgdG8pLiAgSWYgeW91IGdldCBjb21waWxlIGVycm9ycywgZml4IHRoZW0gYnkKK2VkaXRpbmcgY2tjb25maWcuYyBhY2NvcmRpbmcgdG8gdGhlIGRpcmVjdGlvbnMgZ2l2ZW4gaW4gY2tjb25maWcuYy4gIE9uY2UKK3lvdSBnZXQgaXQgdG8gcnVuLCBpdCB3aWxsIHdyaXRlIGEgc3VpdGFibGUgamNvbmZpZy5oIGZpbGUsIGFuZCB3aWxsIGFsc28KK3ByaW50IG91dCBzb21lIGFkdmljZSBhYm91dCB3aGljaCBtYWtlZmlsZSB0byB1c2UuCisKK1lvdSBtYXkgYWxzbyB3YW50IHRvIGxvb2sgYXQgdGhlIGNhbm5lZCBqY29uZmlnIGZpbGVzLCBpZiB0aGVyZSBpcyBvbmUgZm9yIGEKK3N5c3RlbSBzaW1pbGFyIHRvIHlvdXJzLgorCitTZWNvbmQsIHNlbGVjdCBhIG1ha2VmaWxlIGFuZCBjb3B5IGl0IHRvIE1ha2VmaWxlIChvciB3aGF0ZXZlciB5b3VyIHN5c3RlbQordXNlcyBhcyB0aGUgc3RhbmRhcmQgbWFrZWZpbGUgbmFtZSkuICBUaGUgbW9zdCBnZW5lcmljIG1ha2VmaWxlcyB3ZSBwcm92aWRlCithcmUKKwltYWtlZmlsZS5hbnNpOglpZiB5b3VyIEMgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlcworCW1ha2VmaWxlLnVuaXg6CWlmIG5vdC4KKyhZb3UgaGF2ZSBmdW5jdGlvbiBwcm90b3R5cGVzIGlmIGNrY29uZmlnLmMgcHV0ICIjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUyIKK2luIGpjb25maWcuaC4pICBZb3UgbWF5IHdhbnQgdG8gc3RhcnQgZnJvbSBvbmUgb2YgdGhlIG90aGVyIG1ha2VmaWxlcyBpZgordGhlcmUgaXMgb25lIGZvciBhIHN5c3RlbSBzaW1pbGFyIHRvIHlvdXJzLgorCitMb29rIG92ZXIgdGhlIHNlbGVjdGVkIE1ha2VmaWxlIGFuZCBhZGp1c3Qgb3B0aW9ucyBhcyBuZWVkZWQuICBJbiBwYXJ0aWN1bGFyCit5b3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBDQyBhbmQgQ0ZMQUdTIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UKK2FyZSB1c2luZyBHQ0MsIHNldCBDQz1nY2MuICBJZiB5b3UgaGFkIHRvIHVzZSBhbnkgY29tcGlsZXIgc3dpdGNoZXMgdG8gZ2V0Citja2NvbmZpZy5jIHRvIHdvcmssIG1ha2Ugc3VyZSB0aGUgc2FtZSBzd2l0Y2hlcyBhcmUgaW4gQ0ZMQUdTLgorCitJZiB5b3UgYXJlIG9uIGEgc3lzdGVtIHRoYXQgZG9lc24ndCB1c2UgbWFrZWZpbGVzLCB5b3UnbGwgbmVlZCB0byBzZXQgdXAKK3Byb2plY3QgZmlsZXMgKG9yIHdoYXRldmVyIHlvdSBkbyB1c2UpIHRvIGNvbXBpbGUgYWxsIHRoZSBzb3VyY2UgZmlsZXMgYW5kCitsaW5rIHRoZW0gaW50byBleGVjdXRhYmxlIGZpbGVzIGNqcGVnLCBkanBlZywganBlZ3RyYW4sIHJkanBnY29tLCBhbmQgd3JqcGdjb20uCitTZWUgdGhlIGZpbGUgbGlzdHMgaW4gYW55IG9mIHRoZSBtYWtlZmlsZXMgdG8gZmluZCBvdXQgd2hpY2ggZmlsZXMgZ28gaW50bworZWFjaCBwcm9ncmFtLiAgTm90ZSB0aGF0IHRoZSBwcm92aWRlZCBtYWtlZmlsZXMgYWxsIG1ha2UgYSAibGlicmFyeSIgZmlsZQorbGlianBlZyBmaXJzdCwgYnV0IHlvdSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgaWYgeW91IGRvbid0IHdhbnQgdG87IHRoZSBmaWxlCitsaXN0cyBpZGVudGlmeSB3aGljaCBzb3VyY2UgZmlsZXMgYXJlIGFjdHVhbGx5IG5lZWRlZCBmb3IgY29tcHJlc3Npb24sCitkZWNvbXByZXNzaW9uLCBvciBib3RoLiAgQXMgYSBsYXN0IHJlc29ydCwgeW91IGNhbiBtYWtlIGEgYmF0Y2ggc2NyaXB0IHRoYXQKK2p1c3QgY29tcGlsZXMgZXZlcnl0aGluZyBhbmQgbGlua3MgaXQgYWxsIHRvZ2V0aGVyOyBtYWtlZmlsZS52bXMgaXMgYW4gZXhhbXBsZQorb2YgdGhpcyAoaXQncyBmb3IgVk1TIHN5c3RlbXMgdGhhdCBoYXZlIG5vIG1ha2UtbGlrZSB1dGlsaXR5KS4KKworSGVyZSBhcmUgY29tbWVudHMgYWJvdXQgc29tZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRlY2lzaW9ucyB5b3UnbGwKK25lZWQgdG8gbWFrZToKKworQ29tbWFuZCBsaW5lIHN0eWxlCistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlc2UgcHJvZ3JhbXMgY2FuIHVzZSBhIFVuaXgtbGlrZSBjb21tYW5kIGxpbmUgc3R5bGUgd2hpY2ggc3VwcG9ydHMKK3JlZGlyZWN0aW9uIGFuZCBwaXBpbmcsIGxpa2UgdGhpczoKKwljanBlZyBpbnB1dGZpbGUgPm91dHB1dGZpbGUKKwljanBlZyA8aW5wdXRmaWxlID5vdXRwdXRmaWxlCisJc291cmNlIHByb2dyYW0gfCBjanBlZyA+b3V0cHV0ZmlsZQorVGhlIHNpbXBsZXIgInR3byBmaWxlIiBjb21tYW5kIGxpbmUgc3R5bGUgaXMganVzdAorCWNqcGVnIGlucHV0ZmlsZSBvdXRwdXRmaWxlCitZb3UgbWF5IHByZWZlciB0aGUgdHdvLWZpbGUgc3R5bGUsIHBhcnRpY3VsYXJseSBpZiB5b3UgZG9uJ3QgaGF2ZSBwaXBlcy4KKworWW91IE1VU1QgdXNlIHR3by1maWxlIHN0eWxlIG9uIGFueSBzeXN0ZW0gdGhhdCBkb2Vzbid0IGNvcGUgd2VsbCB3aXRoIGJpbmFyeQorZGF0YSBmZWQgdGhyb3VnaCBzdGRpbi9zdGRvdXQ7IHRoaXMgaXMgdHJ1ZSBmb3Igc29tZSBNUy1ET1MgY29tcGlsZXJzLCBmb3IKK2V4YW1wbGUuICBJZiB5b3UncmUgbm90IG9uIGEgVW5peCBzeXN0ZW0sIGl0J3Mgc2FmZXN0IHRvIGFzc3VtZSB5b3UgbmVlZAordHdvLWZpbGUgc3R5bGUuICAoQnV0IGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgZWl0aGVyIHRoZSBQb3NpeC1zdGFuZGFyZAorZmRvcGVuKCkgbGlicmFyeSByb3V0aW5lIG9yIGEgTWljcm9zb2Z0LWNvbXBhdGlibGUgc2V0bW9kZSgpIHJvdXRpbmUsIHlvdQorY2FuIHNhZmVseSB1c2UgdGhlIFVuaXggY29tbWFuZCBsaW5lIHN0eWxlLCBieSBkZWZpbmluZyBVU0VfRkRPUEVOIG9yCitVU0VfU0VUTU9ERSByZXNwZWN0aXZlbHkuKQorCitUbyB1c2UgdGhlIHR3by1maWxlIHN0eWxlLCBtYWtlIGpjb25maWcuaCBzYXkgIiNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUiLgorCitTZWxlY3RpbmcgYSBtZW1vcnkgbWFuYWdlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIElKRyBjb2RlIGlzIGNhcGFibGUgb2Ygd29ya2luZyBvbiBpbWFnZXMgdGhhdCBhcmUgdG9vIGJpZyB0byBmaXQgaW4gbWFpbgorbWVtb3J5OyBkYXRhIGlzIHN3YXBwZWQgb3V0IHRvIHRlbXBvcmFyeSBmaWxlcyBhcyBuZWNlc3NhcnkuICBIb3dldmVyLCB0aGUKK2NvZGUgdG8gZG8gdGhpcyBpcyByYXRoZXIgc3lzdGVtLWRlcGVuZGVudC4gIFdlIHByb3ZpZGUgZml2ZSBkaWZmZXJlbnQKK21lbW9yeSBtYW5hZ2VyczoKKworKiBqbWVtYW5zaS5jCVRoaXMgdmVyc2lvbiB1c2VzIHRoZSBBTlNJLXN0YW5kYXJkIGxpYnJhcnkgcm91dGluZSB0bXBmaWxlKCksCisJCXdoaWNoIG5vdCBhbGwgbm9uLUFOU0kgc3lzdGVtcyBoYXZlLiAgT24gc29tZSBzeXN0ZW1zCisJCXRtcGZpbGUoKSBtYXkgcHV0IHRoZSB0ZW1wb3JhcnkgZmlsZSBpbiBhIG5vbi1vcHRpbWFsCisJCWxvY2F0aW9uOyBpZiB5b3UgZG9uJ3QgbGlrZSB3aGF0IGl0IGRvZXMsIHVzZSBqbWVtbmFtZS5jLgorCisqIGptZW1uYW1lLmMJVGhpcyB2ZXJzaW9uIGNyZWF0ZXMgbmFtZWQgdGVtcG9yYXJ5IGZpbGVzLiAgRm9yIGFueXRoaW5nCisJCWV4Y2VwdCBhIFVuaXggbWFjaGluZSwgeW91J2xsIG5lZWQgdG8gY29uZmlndXJlIHRoZQorCQlzZWxlY3RfZmlsZV9uYW1lKCkgcm91dGluZSBhcHByb3ByaWF0ZWx5OyBzZWUgdGhlIGNvbW1lbnRzCisJCW5lYXIgdGhlIGhlYWQgb2Ygam1lbW5hbWUuYy4gIElmIHlvdSB1c2UgdGhpcyB2ZXJzaW9uLCBkZWZpbmUKKwkJTkVFRF9TSUdOQUxfQ0FUQ0hFUiBpbiBqY29uZmlnLmggdG8gbWFrZSBzdXJlIHRoZSB0ZW1wIGZpbGVzCisJCWFyZSByZW1vdmVkIGlmIHRoZSBwcm9ncmFtIGlzIGFib3J0ZWQuCisKKyogam1lbW5vYnMuYwkoVGhhdCBzdGFuZHMgZm9yIE5vIEJhY2tpbmcgU3RvcmUgOi0pLikgIFRoaXMgd2lsbCBjb21waWxlIG9uCisJCWFsbW9zdCBhbnkgc3lzdGVtLCBidXQgaXQgYXNzdW1lcyB5b3UgaGF2ZSBlbm91Z2ggbWFpbiBtZW1vcnkKKwkJb3IgdmlydHVhbCBtZW1vcnkgdG8gaG9sZCB0aGUgYmlnZ2VzdCBpbWFnZXMgeW91IHdvcmsgd2l0aC4KKworKiBqbWVtZG9zLmMJVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIG1vc3QgMTYtYml0IE1TLURPUyBjb21waWxlcnMuCisJCVNlZSB0aGUgc3lzdGVtLXNwZWNpZmljIG5vdGVzIGFib3V0IE1TLURPUyBmb3IgbW9yZSBpbmZvLgorCQlJTVBPUlRBTlQ6IGlmIHlvdSB1c2UgdGhpcywgZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4KKwkJamNvbmZpZy5oLCBhbmQgaW5jbHVkZSB0aGUgYXNzZW1ibHkgZmlsZSBqbWVtZG9zYS5hc20gaW4gdGhlCisJCXByb2dyYW1zLiAgVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhbmQgamNvbmZpZyBmaWxlcyBmb3IKKwkJMTYtYml0IE1TLURPUyBjb21waWxlcnMgYWxyZWFkeSBkbyBib3RoLgorCisqIGptZW1tYWMuYwlDdXN0b20gdmVyc2lvbiBmb3IgQXBwbGUgTWFjaW50b3NoOyBzZWUgdGhlIHN5c3RlbS1zcGVjaWZpYworCQlub3RlcyBmb3IgTWFjaW50b3NoIGZvciBtb3JlIGluZm8uCisKK1RvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IG1hbmFnZXIsIGNoYW5nZSB0aGUgU1lTREVQTUVNIHZhcmlhYmxlIGluIHlvdXIKK21ha2VmaWxlIHRvIGVxdWFsIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCBmaWxlIG5hbWUgKGZvciBleGFtcGxlLCBqbWVtYW5zaS5vCitvciBqbWVtYW5zaS5vYmogZm9yIGptZW1hbnNpLmMpLgorCitJZiB5b3UgaGF2ZSBwbGVudHkgb2YgKHJlYWwgb3IgdmlydHVhbCkgbWFpbiBtZW1vcnksIGp1c3QgdXNlIGptZW1ub2JzLmMuCisiUGxlbnR5IiBtZWFucyBhYm91dCB0ZW4gYnl0ZXMgZm9yIGV2ZXJ5IHBpeGVsIGluIHRoZSBsYXJnZXN0IGltYWdlcworeW91IHBsYW4gdG8gcHJvY2Vzcywgc28gYSBsb3Qgb2Ygc3lzdGVtcyBkb24ndCBtZWV0IHRoaXMgY3JpdGVyaW9uLgorSWYgeW91cnMgZG9lc24ndCwgdHJ5IGptZW1hbnNpLmMgZmlyc3QuICBJZiB0aGF0IGRvZXNuJ3QgY29tcGlsZSwgeW91J2xsIGhhdmUKK3RvIHVzZSBqbWVtbmFtZS5jOyBiZSBzdXJlIHRvIGFkanVzdCBzZWxlY3RfZmlsZV9uYW1lKCkgZm9yIGxvY2FsIGNvbmRpdGlvbnMuCitZb3UgbWF5IGFsc28gbmVlZCB0byBjaGFuZ2UgdW5saW5rKCkgdG8gcmVtb3ZlKCkgaW4gY2xvc2VfYmFja2luZ19zdG9yZSgpLgorCitFeGNlcHQgd2l0aCBqbWVtbm9icy5jIG9yIGptZW1tYWMuYywgeW91IG5lZWQgdG8gYWRqdXN0IHRoZSBERUZBVUxUX01BWF9NRU0KK3NldHRpbmcgdG8gYSByZWFzb25hYmxlIHZhbHVlIGZvciB5b3VyIHN5c3RlbSAoZWl0aGVyIGJ5IGFkZGluZyBhICNkZWZpbmUgZm9yCitERUZBVUxUX01BWF9NRU0gdG8gamNvbmZpZy5oLCBvciBieSBhZGRpbmcgYSAtRCBzd2l0Y2ggdG8gdGhlIE1ha2VmaWxlKS4KK1RoaXMgdmFsdWUgbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSBzcGFjZSB0aGUgcHJvZ3JhbSB3aWxsIGF0dGVtcHQgdG8KK2FsbG9jYXRlLiAgQ29kZSBhbmQgc3RhdGljIGRhdGEgc3BhY2UgaXNuJ3QgY291bnRlZCwgc28gdGhlIGFjdHVhbCBtZW1vcnkKK25lZWRzIGZvciBjanBlZyBvciBkanBlZyBhcmUgdHlwaWNhbGx5IDEwMCB0byAxNTBLYiBtb3JlIHRoYW4gdGhlIG1heC1tZW1vcnkKK3NldHRpbmcuICBMYXJnZXIgbWF4LW1lbW9yeSBzZXR0aW5ncyByZWR1Y2UgdGhlIGFtb3VudCBvZiBJL08gbmVlZGVkIHRvCitwcm9jZXNzIGEgbGFyZ2UgaW1hZ2UsIGJ1dCB0b28gbGFyZ2UgYSB2YWx1ZSBjYW4gcmVzdWx0IGluICJpbnN1ZmZpY2llbnQKK21lbW9yeSIgZmFpbHVyZXMuICBPbiBtb3N0IFVuaXggbWFjaGluZXMgKGFuZCBvdGhlciBzeXN0ZW1zIHdpdGggdmlydHVhbAorbWVtb3J5KSwganVzdCBzZXQgREVGQVVMVF9NQVhfTUVNIHRvIHNldmVyYWwgbWlsbGlvbiBhbmQgZm9yZ2V0IGl0LiAgQXQgdGhlCitvdGhlciBlbmQgb2YgdGhlIHNwZWN0cnVtLCBmb3IgTVMtRE9TIG1hY2hpbmVzIHlvdSBwcm9iYWJseSBjYW4ndCBnbyBtdWNoCithYm92ZSAzMDBLIHRvIDQwMEsuICAoT24gTVMtRE9TIHRoZSB2YWx1ZSByZWZlcnMgdG8gY29udmVudGlvbmFsIG1lbW9yeSBvbmx5LgorRXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGlzIGhhbmRsZWQgc2VwYXJhdGVseSBieSBqbWVtZG9zLmMuKQorCisKK0JVSUxESU5HIFRIRSBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PT09PT09CisKK05vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gY29tcGlsZSB0aGUgc29mdHdhcmUuICBKdXN0IHNheSAibWFrZSIgKG9yCit3aGF0ZXZlcidzIG5lY2Vzc2FyeSB0byBzdGFydCB0aGUgY29tcGlsYXRpb24pLiAgSGF2ZSBhIGN1cCBvZiBjb2ZmZWUuCisKK0hlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgY291bGQgZ28gd3Jvbmc6CisKK0lmIHlvdXIgY29tcGlsZXIgY29tcGxhaW5zIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8KK3NodXQgaXQgdXAgYnkgcHV0dGluZyAiI2RlZmluZSBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTiIgaW4gamNvbmZpZy5oLgorCitJZiB5b3UgaGF2ZSB0cm91YmxlIHdpdGggbWlzc2luZyBzeXN0ZW0gaW5jbHVkZSBmaWxlcyBvciBpbmNsdXNpb24gb2YgdGhlCit3cm9uZyBvbmVzLCByZWFkIGppbmNsdWRlLmguICBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgeW91IHVzZWQgY29uZmlndXJlCitvciBja2NvbmZpZy5jIHRvIHNldCB1cCBqY29uZmlnLmguCisKK1RoZXJlIGFyZSBhIGZhaXIgbnVtYmVyIG9mIHJvdXRpbmVzIHRoYXQgZG8gbm90IHVzZSBhbGwgb2YgdGhlaXIgcGFyYW1ldGVyczsKK3NvbWUgY29tcGlsZXJzIHdpbGwgaXNzdWUgd2FybmluZ3MgYWJvdXQgdGhpcywgd2hpY2ggeW91IGNhbiBpZ25vcmUuICBUaGVyZQorYXJlIGFsc28gYSBmZXcgY29uZmlndXJhdGlvbiBjaGVja3MgdGhhdCBtYXkgZ2l2ZSAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZ3MuCitBbnkgb3RoZXIgd2FybmluZyBkZXNlcnZlcyBpbnZlc3RpZ2F0aW9uLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBhIGdldGVudigpIGxpYnJhcnkgcm91dGluZSwgZGVmaW5lIE5PX0dFVEVOVi4KKworQWxzbyBzZWUgdGhlIHN5c3RlbS1zcGVjaWZpYyBoaW50cywgYmVsb3cuCisKKworVEVTVElORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09CisKK0FzIGEgcXVpY2sgdGVzdCBvZiBmdW5jdGlvbmFsaXR5IHdlJ3ZlIGluY2x1ZGVkIGEgc21hbGwgc2FtcGxlIGltYWdlIGluCitzZXZlcmFsIGZvcm1zOgorCXRlc3RvcmlnLmpwZwlTdGFydGluZyBwb2ludCBmb3IgdGhlIGRqcGVnIHRlc3RzLgorCXRlc3RpbWcucHBtCVRoZSBvdXRwdXQgb2YgZGpwZWcgdGVzdG9yaWcuanBnCisJdGVzdGltZy5ibXAJVGhlIG91dHB1dCBvZiBkanBlZyAtYm1wIC1jb2xvcnMgMjU2IHRlc3RvcmlnLmpwZworCXRlc3RpbWcuanBnCVRoZSBvdXRwdXQgb2YgY2pwZWcgdGVzdGltZy5wcG0KKwl0ZXN0cHJvZy5qcGcJUHJvZ3Jlc3NpdmUtbW9kZSBlcXVpdmFsZW50IG9mIHRlc3RvcmlnLmpwZy4KKwl0ZXN0aW1ncC5qcGcJVGhlIG91dHB1dCBvZiBjanBlZyAtcHJvZ3Jlc3NpdmUgLW9wdGltaXplIHRlc3RpbWcucHBtCisoVGhlIGZpcnN0LSBhbmQgc2Vjb25kLWdlbmVyYXRpb24gLmpwZyBmaWxlcyBhcmVuJ3QgaWRlbnRpY2FsIHNpbmNlIEpQRUcgaXMKK2xvc3N5LikgIElmIHlvdSBjYW4gZ2VuZXJhdGUgZHVwbGljYXRlcyBvZiB0aGUgdGVzdGltZyogZmlsZXMgdGhlbiB5b3UKK3Byb2JhYmx5IGhhdmUgd29ya2luZyBwcm9ncmFtcy4KKworV2l0aCBtb3N0IG9mIHRoZSBtYWtlZmlsZXMsICJtYWtlIHRlc3QiIHdpbGwgcGVyZm9ybSB0aGUgbmVjZXNzYXJ5Citjb21wYXJpc29ucy4KKworSWYgeW91J3JlIHVzaW5nIGEgbWFrZWZpbGUgdGhhdCBkb2Vzbid0IHByb3ZpZGUgdGhlIHRlc3Qgb3B0aW9uLCBydW4gZGpwZWcKK2FuZCBjanBlZyBieSBoYW5kIGFuZCBjb21wYXJlIHRoZSBvdXRwdXQgZmlsZXMgdG8gdGVzdGltZyogd2l0aCB3aGF0ZXZlcgorYmluYXJ5IGZpbGUgY29tcGFyaXNvbiB0b29sIHlvdSBoYXZlLiAgVGhlIGZpbGVzIHNob3VsZCBiZSBiaXQtZm9yLWJpdAoraWRlbnRpY2FsLgorCitJZiB0aGUgcHJvZ3JhbXMgY29tcGxhaW4gIk1BWF9BTExPQ19DSFVOSyBpcyB3cm9uZywgcGxlYXNlIGZpeCIsIHRoZW4geW91CituZWVkIHRvIHJlZHVjZSBNQVhfQUxMT0NfQ0hVTksgdG8gYSB2YWx1ZSB0aGF0IGZpdHMgaW4gdHlwZSBzaXplX3QuCitUcnkgYWRkaW5nICIjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwiIHRvIGpjb25maWcuaC4gIEEgbGVzcyBsaWtlbHkKK2NvbmZpZ3VyYXRpb24gZXJyb3IgaXMgIkFMSUdOX1RZUEUgaXMgd3JvbmcsIHBsZWFzZSBmaXgiOiBkZWZpbmluZyBBTElHTl9UWVBFCithcyBsb25nIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdCBvbmUuCisKK0lmIHRoZSBjanBlZyB0ZXN0IHJ1biBmYWlscyB3aXRoICJNaXNzaW5nIEh1ZmZtYW4gY29kZSB0YWJsZSBlbnRyeSIsIGl0J3MgYQorZ29vZCBiZXQgdGhhdCB5b3UgbmVlZGVkIHRvIGRlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRC4gIEdvIGJhY2sgdG8gdGhlCitjb25maWd1cmF0aW9uIHN0ZXAgYW5kIHJ1biBja2NvbmZpZy5jLiAgKFRoaXMgaXMgYSBnb29kIHBsYW4gZm9yIGFueSBvdGhlcgordGVzdCBmYWlsdXJlLCB0b28uKQorCitJZiB5b3UgYXJlIHVzaW5nIFVuaXggKG9uZS1maWxlKSBjb21tYW5kIGxpbmUgc3R5bGUgb24gYSBub24tVW5peCBzeXN0ZW0sCitpdCdzIGEgZ29vZCBpZGVhIHRvIGNoZWNrIHRoYXQgYmluYXJ5IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dCBhY3R1YWxseQord29ya3MuICBZb3Ugc2hvdWxkIGdldCB0aGUgc2FtZSByZXN1bHRzIGZyb20gImRqcGVnIDx0ZXN0b3JpZy5qcGcgPm91dC5wcG0iCithcyBmcm9tICJkanBlZyAtb3V0ZmlsZSBvdXQucHBtIHRlc3RvcmlnLmpwZyIuICBOb3RlIHRoYXQgdGhlIG1ha2VmaWxlcyBhbGwKK3VzZSB0aGUgbGF0dGVyIHN0eWxlIGFuZCB0aGVyZWZvcmUgZG8gbm90IGV4ZXJjaXNlIHN0ZGluL3N0ZG91dCEgIElmIHRoaXMKK2NoZWNrIGZhaWxzLCB0cnkgcmVjb21waWxpbmcgd2l0aCBVU0VfU0VUTU9ERSBvciBVU0VfRkRPUEVOIGRlZmluZWQuCitJZiBpdCBzdGlsbCBkb2Vzbid0IHdvcmssIGJldHRlciB1c2UgdHdvLWZpbGUgc3R5bGUuCisKK0lmIHlvdSBjaG9zZSBhIG1lbW9yeSBtYW5hZ2VyIG90aGVyIHRoYW4gam1lbW5vYnMuYywgeW91IHNob3VsZCB0ZXN0IHRoYXQKK3RlbXBvcmFyeS1maWxlIHVzYWdlIHdvcmtzLiAgVHJ5ICJkanBlZyAtYm1wIC1jb2xvcnMgMjU2IC1tYXggMCB0ZXN0b3JpZy5qcGciCithbmQgbWFrZSBzdXJlIGl0cyBvdXRwdXQgbWF0Y2hlcyB0ZXN0aW1nLmJtcC4gIElmIHlvdSBoYXZlIGFueSByZWFsbHkgbGFyZ2UKK2ltYWdlcyBoYW5keSwgdHJ5IGNvbXByZXNzaW5nIHRoZW0gd2l0aCAtb3B0aW1pemUgYW5kL29yIGRlY29tcHJlc3Npbmcgd2l0aAorLWNvbG9ycyAyNTYgdG8gbWFrZSBzdXJlIHlvdXIgREVGQVVMVF9NQVhfTUVNIHNldHRpbmcgaXMgbm90IHRvbyBsYXJnZS4KKworTk9URTogdGhpcyBpcyBmYXIgZnJvbSBhbiBleGhhdXN0aXZlIHRlc3Qgb2YgdGhlIEpQRUcgc29mdHdhcmU7IHNvbWUgbW9kdWxlcywKK3N1Y2ggYXMgMS1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiwgYXJlIG5vdCBleGVyY2lzZWQgYXQgYWxsLiAgSXQncyBqdXN0IGEKK3F1aWNrIHRlc3QgdG8gZ2l2ZSB5b3Ugc29tZSBjb25maWRlbmNlIHRoYXQgeW91IGhhdmVuJ3QgbWlzc2VkIHNvbWV0aGluZworbWFqb3IuCisKKworSU5TVEFMTElORyBUSEUgU09GVFdBUkUKKz09PT09PT09PT09PT09PT09PT09PT09CisKK09uY2UgeW91J3JlIGRvbmUgd2l0aCB0aGUgYWJvdmUgc3RlcHMsIHlvdSBjYW4gaW5zdGFsbCB0aGUgc29mdHdhcmUgYnkKK2NvcHlpbmcgdGhlIGV4ZWN1dGFibGUgZmlsZXMgKGNqcGVnLCBkanBlZywganBlZ3RyYW4sIHJkanBnY29tLCBhbmQgd3JqcGdjb20pCit0byB3aGVyZXZlciB5b3Ugbm9ybWFsbHkgaW5zdGFsbCBwcm9ncmFtcy4gIE9uIFVuaXggc3lzdGVtcywgeW91J2xsIGFsc28gd2FudAordG8gcHV0IHRoZSBtYW4gcGFnZXMgKGNqcGVnLjEsIGRqcGVnLjEsIGpwZWd0cmFuLjEsIHJkanBnY29tLjEsIHdyanBnY29tLjEpCitpbiB0aGUgbWFuLXBhZ2UgZGlyZWN0b3J5LiAgVGhlIHByZS1mYWIgbWFrZWZpbGVzIGRvbid0IHN1cHBvcnQgdGhpcyBzdGVwCitzaW5jZSB0aGVyZSdzIHN1Y2ggYSB3aWRlIHZhcmlldHkgb2YgaW5zdGFsbGF0aW9uIHByb2NlZHVyZXMgb24gZGlmZmVyZW50CitzeXN0ZW1zLgorCitJZiB5b3UgZ2VuZXJhdGVkIGEgTWFrZWZpbGUgd2l0aCB0aGUgImNvbmZpZ3VyZSIgc2NyaXB0LCB5b3UgY2FuIGp1c3Qgc2F5CisJbWFrZSBpbnN0YWxsCit0byBpbnN0YWxsIHRoZSBwcm9ncmFtcyBhbmQgdGhlaXIgbWFuIHBhZ2VzIGludG8gdGhlIHN0YW5kYXJkIHBsYWNlcy4KKyhZb3UnbGwgcHJvYmFibHkgbmVlZCB0byBiZSByb290IHRvIGRvIHRoaXMuKSAgV2UgcmVjb21tZW5kIGZpcnN0IHNheWluZworCW1ha2UgLW4gaW5zdGFsbAordG8gc2VlIHdoZXJlIGNvbmZpZ3VyZSB0aG91Z2h0IHRoZSBmaWxlcyBzaG91bGQgZ28uICBZb3UgbWF5IG5lZWQgdG8gZWRpdAordGhlIE1ha2VmaWxlLCBwYXJ0aWN1bGFybHkgaWYgeW91ciBzeXN0ZW0ncyBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2UKK2ZpbGVuYW1lcyBkb24ndCBtYXRjaCB3aGF0IGNvbmZpZ3VyZSBleHBlY3RzLgorCitJZiB5b3Ugd2FudCB0byBpbnN0YWxsIHRoZSBJSkcgbGlicmFyeSBpdHNlbGYsIGZvciB1c2UgaW4gY29tcGlsaW5nIG90aGVyCitwcm9ncmFtcyBiZXNpZGVzIG91cnMsIHRoZW4geW91IG5lZWQgdG8gcHV0IHRoZSBmb3VyIGluY2x1ZGUgZmlsZXMKKwlqcGVnbGliLmggamVycm9yLmggamNvbmZpZy5oIGptb3JlY2ZnLmgKK2ludG8geW91ciBpbmNsdWRlLWZpbGUgZGlyZWN0b3J5LCBhbmQgcHV0IHRoZSBsaWJyYXJ5IGZpbGUgbGlianBlZy5hCisoZXh0ZW5zaW9uIG1heSB2YXJ5IGRlcGVuZGluZyBvbiBzeXN0ZW0pIHdoZXJldmVyIGxpYnJhcnkgZmlsZXMgZ28uCitJZiB5b3UgZ2VuZXJhdGVkIGEgTWFrZWZpbGUgd2l0aCAiY29uZmlndXJlIiwgaXQgd2lsbCBkbyB3aGF0IGl0IHRoaW5rcworaXMgdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBzYXkKKwltYWtlIGluc3RhbGwtbGliCisKKworT1BUSU9OQUwgU1RVRkYKKz09PT09PT09PT09PT09CisKK1Byb2dyZXNzIG1vbml0b3I6CisKK0lmIHlvdSBsaWtlLCB5b3UgY2FuICNkZWZpbmUgUFJPR1JFU1NfUkVQT1JUIChpbiBqY29uZmlnLmgpIHRvIGVuYWJsZSBkaXNwbGF5CitvZiBwZXJjZW50LWRvbmUgcHJvZ3Jlc3MgcmVwb3J0cy4gIFRoZSByb3V0aW5lIHByb3ZpZGVkIGluIGNkanBlZy5jIG1lcmVseQorcHJpbnRzIHBlcmNlbnRhZ2VzIHRvIHN0ZGVyciwgYnV0IHlvdSBjYW4gY3VzdG9taXplIGl0IHRvIGRvIHNvbWV0aGluZworZmFuY2llci4KKworVXRhaCBSTEUgZmlsZSBmb3JtYXQgc3VwcG9ydDoKKworV2UgZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgd2l0aCBzdXBwb3J0IGZvciBSTEUgaW1hZ2UgZmlsZXMgKFV0YWggUmFzdGVyCitUb29sa2l0IGZvcm1hdCkgZGlzYWJsZWQsIGJlY2F1c2UgdGhlIFJMRSBzdXBwb3J0IHdvbid0IGNvbXBpbGUgd2l0aG91dCB0aGUKK1V0YWggbGlicmFyeS4gIElmIHlvdSBoYXZlIFVSVCB2ZXJzaW9uIDMuMSBvciBsYXRlciwgeW91IGNhbiBlbmFibGUgUkxFCitzdXBwb3J0IGFzIGZvbGxvd3M6CisJMS4gICNkZWZpbmUgUkxFX1NVUFBPUlRFRCBpbiBqY29uZmlnLmguCisJMi4gIEFkZCBhIC1JIG9wdGlvbiB0byBDRkxBR1MgaW4gdGhlIE1ha2VmaWxlIGZvciB0aGUgZGlyZWN0b3J5CisJICAgIGNvbnRhaW5pbmcgdGhlIFVSVCAuaCBmaWxlcyAodHlwaWNhbGx5IHRoZSAiaW5jbHVkZSIKKwkgICAgc3ViZGlyZWN0b3J5IG9mIHRoZSBVUlQgZGlzdHJpYnV0aW9uKS4KKwkzLiAgQWRkIC1MLi4uIC1scmxlIHRvIExETElCUyBpbiB0aGUgTWFrZWZpbGUsIHdoZXJlIC4uLiBzcGVjaWZpZXMKKwkgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBVUlQgImxpYnJsZS5hIiBmaWxlICh0eXBpY2FsbHkgdGhlCisJICAgICJsaWIiIHN1YmRpcmVjdG9yeSBvZiB0aGUgVVJUIGRpc3RyaWJ1dGlvbikuCisKK1N1cHBvcnQgZm9yIDEyLWJpdC1kZWVwIHBpeGVsIGRhdGE6CisKK1RoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyBlaXRoZXIgOC1iaXQgb3IgMTItYml0IGRhdGEgcHJlY2lzaW9uLiAgKEZvciBjb2xvciwKK3RoaXMgbWVhbnMgOCBvciAxMiBiaXRzIHBlciBjaGFubmVsLCBvZiBjb3Vyc2UuKSAgSWYgeW91IG5lZWQgdG8gd29yayB3aXRoCitkZWVwZXIgdGhhbiA4LWJpdCBkYXRhLCB5b3UgY2FuIGNvbXBpbGUgdGhlIElKRyBjb2RlIGZvciAxMi1iaXQgb3BlcmF0aW9uLgorVG8gZG8gc286CisgIDEuIEluIGptb3JlY2ZnLmgsIGRlZmluZSBCSVRTX0lOX0pTQU1QTEUgYXMgMTIgcmF0aGVyIHRoYW4gOC4KKyAgMi4gSW4gamNvbmZpZy5oLCB1bmRlZmluZSBCTVBfU1VQUE9SVEVELCBSTEVfU1VQUE9SVEVELCBhbmQgVEFSR0FfU1VQUE9SVEVELAorICAgICBiZWNhdXNlIHRoZSBjb2RlIGZvciB0aG9zZSBmb3JtYXRzIGRvZXNuJ3QgaGFuZGxlIDEyLWJpdCBkYXRhIGFuZCB3b24ndAorICAgICBldmVuIGNvbXBpbGUuICAoVGhlIFBQTSBjb2RlIGRvZXMgd29yaywgYXMgZXhwbGFpbmVkIGJlbG93LiAgVGhlIEdJRgorICAgICBjb2RlIHdvcmtzIHRvbzsgaXQgc2NhbGVzIDgtYml0IEdJRiBkYXRhIHRvIGFuZCBmcm9tIDEyLWJpdCBkZXB0aAorICAgICBhdXRvbWF0aWNhbGx5LikKKyAgMy4gQ29tcGlsZS4gIERvbid0IGV4cGVjdCAibWFrZSB0ZXN0IiB0byBwYXNzLCBzaW5jZSB0aGUgc3VwcGxpZWQgdGVzdAorICAgICBmaWxlcyBhcmUgZm9yIDgtYml0IGRhdGEuCisKK0N1cnJlbnRseSwgMTItYml0IHN1cHBvcnQgZG9lcyBub3Qgd29yayBvbiAxNi1iaXQtaW50IG1hY2hpbmVzLgorCitOb3RlIHRoYXQgYSAxMi1iaXQgdmVyc2lvbiB3aWxsIG5vdCByZWFkIDgtYml0IEpQRUcgZmlsZXMsIG5vciB2aWNlIHZlcnNhOworc28geW91J2xsIHdhbnQgdG8ga2VlcCBhcm91bmQgYSByZWd1bGFyIDgtYml0IGNvbXBpbGF0aW9uIGFzIHdlbGwuCisoUnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgZGVwdGgsIHRvIGFsbG93IGEgc2luZ2xlIGNvcHkgdGhhdCBkb2VzIGJvdGgsCitpcyBwb3NzaWJsZSBidXQgd291bGQgcHJvYmFibHkgc2xvdyB0aGluZ3MgZG93biBjb25zaWRlcmFibHk7IGl0J3MgdmVyeSBsb3cKK29uIG91ciB0by1kbyBsaXN0LikKKworVGhlIFBQTSByZWFkZXIgKHJkcHBtLmMpIGNhbiByZWFkIDEyLWJpdCBkYXRhIGZyb20gZWl0aGVyIHRleHQtZm9ybWF0IG9yCitiaW5hcnktZm9ybWF0IFBQTSBhbmQgUEdNIGZpbGVzLiAgQmluYXJ5LWZvcm1hdCBQUE0vUEdNIGZpbGVzIHdoaWNoIGhhdmUgYQorbWF4dmFsIGdyZWF0ZXIgdGhhbiAyNTUgYXJlIGFzc3VtZWQgdG8gdXNlIDIgYnl0ZXMgcGVyIHNhbXBsZSwgTFNCIGZpcnN0CisobGl0dGxlLWVuZGlhbiBvcmRlcikuICBBcyBvZiBlYXJseSAxOTk1LCAyLWJ5dGUgYmluYXJ5IGZvcm1hdCBpcyBub3QKK29mZmljaWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBQQk1QTFVTIGxpYnJhcnksIGJ1dCBpdCBpcyBleHBlY3RlZCB0aGF0IGEKK2Z1dHVyZSByZWxlYXNlIG9mIFBCTVBMVVMgd2lsbCBzdXBwb3J0IGl0LiAgTm90ZSB0aGF0IHRoZSBQUE0gcmVhZGVyIHdpbGwKK3JlYWQgZmlsZXMgb2YgYW55IG1heHZhbCByZWdhcmRsZXNzIG9mIHRoZSBCSVRTX0lOX0pTQU1QTEUgc2V0dGluZzsgaW5jb21pbmcKK2RhdGEgaXMgYXV0b21hdGljYWxseSByZXNjYWxlZCB0byBlaXRoZXIgbWF4dmFsPTI1NSBvciBtYXh2YWw9NDA5NSBhcworYXBwcm9wcmlhdGUgZm9yIHRoZSBjanBlZyBiaXQgZGVwdGguCisKK1RoZSBQUE0gd3JpdGVyICh3cnBwbS5jKSB3aWxsIG5vcm1hbGx5IHdyaXRlIDItYnl0ZSBiaW5hcnkgUFBNIG9yIFBHTQorZm9ybWF0LCBtYXh2YWwgNDA5NSwgd2hlbiBjb21waWxlZCB3aXRoIEJJVFNfSU5fSlNBTVBMRT0xMi4gIFNpbmNlIHRoaXMKK2Zvcm1hdCBpcyBub3QgeWV0IHdpZGVseSBzdXBwb3J0ZWQsIHlvdSBjYW4gZGlzYWJsZSBpdCBieSBjb21waWxpbmcgd3JwcG0uYword2l0aCBQUE1fTk9SQVdXT1JEIGRlZmluZWQ7IHRoZW4gdGhlIGRhdGEgaXMgc2NhbGVkIGRvd24gdG8gOCBiaXRzIHRvIG1ha2UgYQorc3RhbmRhcmQgMS1ieXRlL3NhbXBsZSBQUE0gb3IgUEdNIGZpbGUuICAoWWVzLCB0aGlzIG1lYW5zIHN0aWxsIGFub3RoZXIgY29weQorb2YgZGpwZWcgdG8ga2VlcCBhcm91bmQuICBCdXQgaG9wZWZ1bGx5IHlvdSB3b24ndCBuZWVkIGl0IGZvciB2ZXJ5IGxvbmcuCitQb3NrYW56ZXIncyBzdXBwb3NlZCB0byBnZXQgdGhhdCBuZXcgUEJNUExVUyByZWxlYXNlIG91dCBSZWFsIFNvb24gTm93LikKKworT2YgY291cnNlLCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCAxMi1iaXQgZGF0YSwgeW91IHByb2JhYmx5IGhhdmUgaXQgc3RvcmVkCitpbiBzb21lIG90aGVyLCBub25zdGFuZGFyZCBmb3JtYXQuICBJbiB0aGF0IGNhc2UgeW91J2xsIHByb2JhYmx5IHdhbnQgdG8KK3dyaXRlIHlvdXIgb3duIEkvTyBtb2R1bGVzIHRvIHJlYWQgYW5kIHdyaXRlIHlvdXIgZm9ybWF0LgorCitOb3RlIHRoYXQgYSAxMi1iaXQgdmVyc2lvbiBvZiBjanBlZyBhbHdheXMgcnVucyBpbiAiLW9wdGltaXplIiBtb2RlLCBpbgorb3JkZXIgdG8gZ2VuZXJhdGUgdmFsaWQgSHVmZm1hbiB0YWJsZXMuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG91cgorZGVmYXVsdCBIdWZmbWFuIHRhYmxlcyBvbmx5IGNvdmVyIDgtYml0IGRhdGEuCisKK1JlbW92aW5nIGNvZGU6CisKK0lmIHlvdSBuZWVkIHRvIG1ha2UgYSBzbWFsbGVyIHZlcnNpb24gb2YgdGhlIEpQRUcgc29mdHdhcmUsIHNvbWUgb3B0aW9uYWwKK2Z1bmN0aW9ucyBjYW4gYmUgcmVtb3ZlZCBhdCBjb21waWxlIHRpbWUuICBTZWUgdGhlIHh4eF9TVVBQT1JURUQgI2RlZmluZXMgaW4KK2pjb25maWcuaCBhbmQgam1vcmVjZmcuaC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgd2UgcmVjb21tZW5kIHRoYXQgeW91IGxlYXZlIGluCitkZWNvZGVyIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBKUEVHIGZpbGVzLCB0byBlbnN1cmUgdGhhdCB5b3UgY2FuIHJlYWQgYW55b25lJ3MKK291dHB1dC4gIFRha2luZyBvdXQgc3VwcG9ydCBmb3IgaW1hZ2UgZmlsZSBmb3JtYXRzIHRoYXQgeW91IGRvbid0IHVzZSBpcyB0aGUKK21vc3QgcGFpbmxlc3Mgd2F5IHRvIG1ha2UgdGhlIHByb2dyYW1zIHNtYWxsZXIuICBBbm90aGVyIHBvc3NpYmlsaXR5IGlzIHRvCityZW1vdmUgc29tZSBvZiB0aGUgRENUIG1ldGhvZHM6IGluIHBhcnRpY3VsYXIsIHRoZSAiSUZBU1QiIG1ldGhvZCBtYXkgbm90IGJlCitlbm91Z2ggZmFzdGVyIHRoYW4gdGhlIG90aGVycyB0byBiZSB3b3J0aCBrZWVwaW5nIG9uIHlvdXIgbWFjaGluZS4gIChJZiB5b3UKK2RvIHJlbW92ZSBJU0xPVyBvciBJRkFTVCwgYmUgc3VyZSB0byByZWRlZmluZSBKRENUX0RFRkFVTFQgb3IgSkRDVF9GQVNURVNUCit0byBhIHN1cHBvcnRlZCBtZXRob2QsIGJ5IGFkZGluZyBhICNkZWZpbmUgaW4gamNvbmZpZy5oLikKKworCitPUFRJTUlaQVRJT04KKz09PT09PT09PT09PQorCitVbmxlc3MgeW91IG93biBhIENyYXksIHlvdSdsbCBwcm9iYWJseSBiZSBpbnRlcmVzdGVkIGluIG1ha2luZyB0aGUgSlBFRworc29mdHdhcmUgZ28gYXMgZmFzdCBhcyBwb3NzaWJsZS4gIFRoaXMgc2VjdGlvbiBjb3ZlcnMgc29tZSBtYWNoaW5lLWRlcGVuZGVudAorb3B0aW1pemF0aW9ucyB5b3UgbWF5IHdhbnQgdG8gdHJ5LiAgV2Ugc3VnZ2VzdCB0aGF0IGJlZm9yZSB0cnlpbmcgYW55IG9mCit0aGlzLCB5b3UgZmlyc3QgZ2V0IHRoZSBiYXNpYyBpbnN0YWxsYXRpb24gdG8gcGFzcyB0aGUgc2VsZi10ZXN0IHN0ZXAuCitSZXBlYXQgdGhlIHNlbGYtdGVzdCBhZnRlciBhbnkgb3B0aW1pemF0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlbid0Citicm9rZW4gYW55dGhpbmcuCisKK1RoZSBpbnRlZ2VyIERDVCByb3V0aW5lcyBwZXJmb3JtIGEgbG90IG9mIG11bHRpcGxpY2F0aW9ucy4gIFRoZXNlCittdWx0aXBsaWNhdGlvbnMgbXVzdCB5aWVsZCAzMi1iaXQgcmVzdWx0cywgYnV0IG5vbmUgb2YgdGhlaXIgaW5wdXQgdmFsdWVzCithcmUgbW9yZSB0aGFuIDE2IGJpdHMgd2lkZS4gIE9uIG1hbnkgbWFjaGluZXMsIG5vdGFibHkgdGhlIDY4MHgwIGFuZCA4MHg4NgorQ1BVcywgYSAxNngxNj0+MzIgYml0IG11bHRpcGx5IGluc3RydWN0aW9uIGlzIGZhc3RlciB0aGFuIGEgZnVsbCAzMngzMj0+MzIKK2JpdCBtdWx0aXBseS4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gcG9ydGFibGUgd2F5IHRvIHNwZWNpZnkgc3VjaCBhCittdWx0aXBsaWNhdGlvbiBpbiBDLCBidXQgc29tZSBjb21waWxlcnMgY2FuIGdlbmVyYXRlIG9uZSB3aGVuIHlvdSB1c2UgdGhlCityaWdodCBjb21iaW5hdGlvbiBvZiBjYXN0cy4gIFNlZSB0aGUgTVVMVElQTFl4eHggbWFjcm8gZGVmaW5pdGlvbnMgaW4KK2pkY3QuaC4gIElmIHlvdXIgY29tcGlsZXIgbWFrZXMgImludCIgYmUgMzIgYml0cyBhbmQgInNob3J0IiBiZSAxNiBiaXRzLAorZGVmaW5pbmcgU0hPUlR4U0hPUlRfMzIgaXMgZmFpcmx5IGxpa2VseSB0byB3b3JrLiAgV2hlbiBleHBlcmltZW50aW5nIHdpdGgKK2FsdGVybmF0ZSBkZWZpbml0aW9ucywgYmUgc3VyZSB0byB0ZXN0IG5vdCBvbmx5IHdoZXRoZXIgdGhlIGNvZGUgc3RpbGwgd29ya3MKKyh1c2UgdGhlIHNlbGYtdGVzdCksIGJ1dCBhbHNvIHdoZXRoZXIgaXQgaXMgYWN0dWFsbHkgZmFzdGVyIC0tLSBvbiBzb21lCitjb21waWxlcnMsIGFsdGVybmF0ZSBkZWZpbml0aW9ucyBtYXkgY29tcHV0ZSB0aGUgcmlnaHQgYW5zd2VyLCB5ZXQgYmUgc2xvd2VyCit0aGFuIHRoZSBkZWZhdWx0LiAgVGltaW5nIGNqcGVnIG9uIGEgbGFyZ2UgUEdNIChncmF5c2NhbGUpIGlucHV0IGZpbGUgaXMgdGhlCitiZXN0IHdheSB0byBjaGVjayB0aGlzLCBhcyB0aGUgRENUIHdpbGwgYmUgdGhlIGxhcmdlc3QgZnJhY3Rpb24gb2YgdGhlIHJ1bnRpbWUKK2luIHRoYXQgbW9kZS4gIChOb3RlOiBzb21lIG9mIHRoZSBkaXN0cmlidXRlZCBjb21waWxlci1zcGVjaWZpYyBqY29uZmlnIGZpbGVzCithbHJlYWR5IGNvbnRhaW4gI2RlZmluZSBzd2l0Y2hlcyB0byBzZWxlY3QgYXBwcm9wcmlhdGUgTVVMVElQTFl4eHgKK2RlZmluaXRpb25zLikKKworSWYgeW91ciBtYWNoaW5lIGhhcyBzdWZmaWNpZW50bHkgZmFzdCBmbG9hdGluZyBwb2ludCBoYXJkd2FyZSwgeW91IG1heSBmaW5kCit0aGF0IHRoZSBmbG9hdCBEQ1QgbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZSBpbnRlZ2VyIERDVCBtZXRob2RzLCBldmVuCithZnRlciB0d2Vha2luZyB0aGUgaW50ZWdlciBtdWx0aXBseSBtYWNyb3MuICBJbiB0aGF0IGNhc2UgeW91IG1heSB3YW50IHRvCittYWtlIHRoZSBmbG9hdCBEQ1QgYmUgdGhlIGRlZmF1bHQgbWV0aG9kLiAgKFRoZSBvbmx5IG9iamVjdGlvbiB0byB0aGlzIGlzCit0aGF0IGZsb2F0IERDVCByZXN1bHRzIG1heSB2YXJ5IHNsaWdodGx5IGFjcm9zcyBtYWNoaW5lcy4pICBUbyBkbyB0aGF0LCBhZGQKKyIjZGVmaW5lIEpEQ1RfREVGQVVMVCBKRENUX0ZMT0FUIiB0byBqY29uZmlnLmguICBFdmVuIGlmIHlvdSBkb24ndCBjaGFuZ2UKK3RoZSBkZWZhdWx0LCB5b3Ugc2hvdWxkIHJlZGVmaW5lIEpEQ1RfRkFTVEVTVCwgd2hpY2ggaXMgdGhlIG1ldGhvZCBzZWxlY3RlZAorYnkgZGpwZWcncyAtZmFzdCBzd2l0Y2guICBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzCisodXNhZ2UuZG9jIGFuZC9vciBjanBlZy4xLCBkanBlZy4xKSB0byBhZ3JlZSB3aXRoIHdoYXQgeW91J3ZlIGRvbmUuCisKK0lmIGFjY2VzcyB0byAic2hvcnQiIGFycmF5cyBpcyBzbG93IG9uIHlvdXIgbWFjaGluZSwgaXQgbWF5IGJlIGEgd2luIHRvCitkZWZpbmUgdHlwZSBKQ09FRiBhcyBpbnQgcmF0aGVyIHRoYW4gc2hvcnQuICBUaGlzIHdpbGwgY29zdCBhIGdvb2QgZGVhbCBvZgorbWVtb3J5IHRob3VnaCwgcGFydGljdWxhcmx5IGluIHNvbWUgbXVsdGktcGFzcyBtb2Rlcywgc28gZG9uJ3QgZG8gaXQgdW5sZXNzCit5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgc2hvcnQgaXMgUkVBTExZIHNsb3cuCisKK0lmIHlvdXIgY29tcGlsZXIgY2FuIGNvbXBpbGUgZnVuY3Rpb24gY2FsbHMgaW4tbGluZSwgbWFrZSBzdXJlIHRoZSBJTkxJTkUKK21hY3JvIGluIGptb3JlY2ZnLmggaXMgZGVmaW5lZCBhcyB0aGUga2V5d29yZCB0aGF0IG1hcmtzIGEgZnVuY3Rpb24KK2lubGluZS1hYmxlLiAgU29tZSBjb21waWxlcnMgaGF2ZSBhIHN3aXRjaCB0aGF0IHRlbGxzIHRoZSBjb21waWxlciB0byBpbmxpbmUKK2FueSBmdW5jdGlvbiBpdCB0aGlua3MgaXMgcHJvZml0YWJsZSAoZS5nLiwgLWZpbmxpbmUtZnVuY3Rpb25zIGZvciBnY2MpLgorRW5hYmxpbmcgc3VjaCBhIHN3aXRjaCBpcyBsaWtlbHkgdG8gbWFrZSB0aGUgY29tcGlsZWQgY29kZSBiaWdnZXIgYnV0IGZhc3Rlci4KKworSW4gZ2VuZXJhbCwgaXQncyB3b3J0aCB0cnlpbmcgdGhlIG1heGltdW0gb3B0aW1pemF0aW9uIGxldmVsIG9mIHlvdXIgY29tcGlsZXIsCithbmQgZXhwZXJpbWVudGluZyB3aXRoIGFueSBvcHRpb25hbCBvcHRpbWl6YXRpb25zIHN1Y2ggYXMgbG9vcCB1bnJvbGxpbmcuCisoVW5mb3J0dW5hdGVseSwgZmFyIHRvbyBtYW55IGNvbXBpbGVycyBoYXZlIG9wdGltaXplciBidWdzIC4uLiBiZSBwcmVwYXJlZCB0bworYmFjayBvZmYgaWYgdGhlIGNvZGUgZmFpbHMgc2VsZi10ZXN0LikgIElmIHlvdSBkbyBhbnkgZXhwZXJpbWVudGF0aW9uIGFsb25nCit0aGVzZSBsaW5lcywgcGxlYXNlIHJlcG9ydCB0aGUgb3B0aW1hbCBzZXR0aW5ncyB0byBqcGVnLWluZm9AdXVuZXQudXUubmV0IHNvCit3ZSBjYW4gbWVudGlvbiB0aGVtIGluIGZ1dHVyZSByZWxlYXNlcy4gIEJlIHN1cmUgdG8gc3BlY2lmeSB5b3VyIG1hY2hpbmUgYW5kCitjb21waWxlciB2ZXJzaW9uLgorCisKK0hJTlRTIEZPUiBTUEVDSUZJQyBTWVNURU1TCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXZSB3ZWxjb21lIHJlcG9ydHMgb24gY2hhbmdlcyBuZWVkZWQgZm9yIHN5c3RlbXMgbm90IG1lbnRpb25lZCBoZXJlLiAgU3VibWl0CisnZW0gdG8ganBlZy1pbmZvQHV1bmV0LnV1Lm5ldC4gIEFsc28sIGlmIGNvbmZpZ3VyZSBvciBja2NvbmZpZy5jIGlzIHdyb25nCithYm91dCBob3cgdG8gY29uZmlndXJlIHRoZSBKUEVHIHNvZnR3YXJlIGZvciB5b3VyIHN5c3RlbSwgcGxlYXNlIGxldCB1cyBrbm93LgorCisKK0Fjb3JuIFJJU0MgT1M6CisKKyhUaGFua3MgdG8gU2ltb24gTWlkZGxldG9uIGZvciB0aGVzZSBoaW50cyBvbiBjb21waWxpbmcgd2l0aCBEZXNrdG9wIEMuKQorQWZ0ZXIgcmVuYW1pbmcgdGhlIGZpbGVzIGFjY29yZGluZyB0byBBY29ybiBjb252ZW50aW9ucywgdGFrZSBhIGNvcHkgb2YKK21ha2VmaWxlLmFuc2ksIGNoYW5nZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2xpYmpwZWcuYScgdG8gJ2xpYmpwZWcubycgYW5kCitjaGFuZ2UgdGhlc2UgZGVmaW5pdGlvbnMgYXMgaW5kaWNhdGVkOgorCitDRkxBR1M9IC10aHJvd2JhY2sgLUlDOiAtV24KK0xETElCUz1DOm8uU3R1YnMKK1NZU0RFUE1FTT1qbWVtYW5zaS5vCitMTj1MaW5rCitBUj1MaWJGaWxlIC1jIC1vCisKK0Fsc28gYWRkIGEgbmV3IGxpbmUgJy5jLm86OyAkKGNjKSAkPCAkKGNmbGFncykgLWMgLW8gJEAnLiAgUmVtb3ZlIHRoZQorbGluZXMgJyQoUk0pIGxpYmpwZWcubycgYW5kICckKEFSMikgbGlianBlZy5vJyBhbmQgdGhlICdqY29uZmlnLmgnCitkZXBlbmRlbmN5IHNlY3Rpb24uCisKK0NvcHkgamNvbmZpZy5kb2MgdG8gamNvbmZpZy5oLiAgRWRpdCBqY29uZmlnLmggdG8gZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCithbmQgQ0hBUl9JU19VTlNJR05FRC4KKworUnVuIHRoZSBtYWtlZmlsZSB1c2luZyAhQU1VIG5vdCAhTWFrZS4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgJ2NsZWFuJyBhbmQKKyd0ZXN0JyBtYWtlZmlsZSBlbnRyaWVzIHRoZW4geW91IHdpbGwgaGF2ZSB0byBmaWRkbGUgd2l0aCB0aGUgc3ludGF4IGEgYml0CithbmQgcmVuYW1lIHRoZSB0ZXN0IGZpbGVzLgorCisKK0FtaWdhOgorCitTQVMgQyA2LjUwIHJlcG9ydGVkbHkgaXMgdG9vIGJ1Z2d5IHRvIGNvbXBpbGUgdGhlIElKRyBjb2RlIHByb3Blcmx5LgorQSBwYXRjaCB0byB1cGRhdGUgdG8gNi41MSBpcyBhdmFpbGFibGUgZnJvbSBTQVMgb3IgQW1pTmV0IEZUUCBzaXRlcy4KKworVGhlIHN1cHBsaWVkIGNvbmZpZyBmaWxlcyBhcmUgc2V0IHVwIHRvIHVzZSBqbWVtbmFtZS5jIGFzIHRoZSBtZW1vcnkKK21hbmFnZXIsIHdpdGggdGVtcG9yYXJ5IGZpbGVzIGJlaW5nIGNyZWF0ZWQgb24gdGhlIGRldmljZSBuYW1lZCBieQorIkpQRUdUTVA6Ii4KKworCitBdGFyaSBTVC9TVEUvVFQ6CisgCitDb3B5IHRoZSBwcm9qZWN0IGZpbGVzIG1ha2NqcGVnLnN0LCBtYWtkanBlZy5zdCwgbWFrdGpwZWcuc3QsIGFuZCBtYWtsanBlZy5zdAordG8gY2pwZWcucHJqLCBkanBlZy5wcmosIGpwZWd0cmFuLnByaiwgYW5kIGxpYmpwZWcucHJqIHJlc3BlY3RpdmVseS4gIFRoZQorcHJvamVjdCBmaWxlcyBzaG91bGQgd29yayBhcy1pcyB3aXRoIFB1cmUgQy4gIEZvciBUdXJibyBDLCBjaGFuZ2UgbGlicmFyeQorZmlsZW5hbWVzICJwYy4uLiIgdG8gInRjLi4uIiBpbiBlYWNoIHByb2plY3QgZmlsZS4gIE5vdGUgdGhhdCBsaWJqcGVnLnByagorc2VsZWN0cyBqbWVtYW5zaS5jIGFzIHRoZSByZWNvbW1lbmRlZCBtZW1vcnkgbWFuYWdlci4gIFlvdSdsbCBwcm9iYWJseSB3YW50IHRvCithZGp1c3QgdGhlIERFRkFVTFRfTUFYX01FTSBzZXR0aW5nIC0tLSB5b3Ugd2FudCBpdCB0byBiZSBhIGNvdXBsZSBodW5kcmVkIEsKK2xlc3MgdGhhbiB5b3VyIG5vcm1hbCBmcmVlIG1lbW9yeS4gIFB1dCAiI2RlZmluZSBERUZBVUxUX01BWF9NRU0gbm5ubiIgaW50bworamNvbmZpZy5oIHRvIGRvIHRoaXMuCisKK1RvIHVzZSB0aGUgNjg4ODEvNjg4ODIgY29wcm9jZXNzb3IgZm9yIHRoZSBmbG9hdGluZyBwb2ludCBEQ1QsIGFkZCB0aGUKK2NvbXBpbGVyIG9wdGlvbiAiLTgiIHRvIHRoZSBwcm9qZWN0IGZpbGVzIGFuZCByZXBsYWNlIHBjZmx0bGliLmxpYiB3aXRoCitwYzg4MWxpYi5saWIgaW4gY2pwZWcucHJqIGFuZCBkanBlZy5wcmouICBPciBpZiB5b3UgZG9uJ3QgaGF2ZSBhCitjb3Byb2Nlc3NvciwgeW91IG1heSBwcmVmZXIgdG8gcmVtb3ZlIHRoZSBmbG9hdCBEQ1QgY29kZSBieSB1bmRlZmluaW5nCitEQ1RfRkxPQVRfU1VQUE9SVEVEIGluIGptb3JlY2ZnLmggKHNpbmNlIHdpdGhvdXQgYSBjb3Byb2Nlc3NvciwgdGhlIGZsb2F0Citjb2RlIHdpbGwgYmUgdG9vIHNsb3cgdG8gYmUgdXNlZnVsKS4gIEluIHRoYXQgY2FzZSwgeW91IGNhbiBkZWxldGUKK3BjZmx0bGliLmxpYiBmcm9tIHRoZSBwcm9qZWN0IGZpbGVzLgorCitOb3RlIHRoYXQgeW91IG11c3QgbWFrZSBsaWJqcGVnLmxpYiBiZWZvcmUgbWFraW5nIGNqcGVnLnR0cCwgZGpwZWcudHRwLAorb3IganBlZ3RyYW4udHRwLiAgWW91J2xsIGhhdmUgdG8gcGVyZm9ybSB0aGUgc2VsZi10ZXN0IGJ5IGhhbmQuCisKK1dlIGhhdmVuJ3QgYm90aGVyZWQgdG8gaW5jbHVkZSBwcm9qZWN0IGZpbGVzIGZvciByZGpwZ2NvbSBhbmQgd3JqcGdjb20uCitUaG9zZSBzb3VyY2UgZmlsZXMgc2hvdWxkIGp1c3QgYmUgY29tcGlsZWQgYnkgdGhlbXNlbHZlczsgdGhleSBkb24ndAorZGVwZW5kIG9uIHRoZSBKUEVHIGxpYnJhcnkuCisKK1RoZXJlIGlzIGEgYnVnIGluIHNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgdGhlIFR1cmJvIEMgbGlicmFyeSB3aGljaCBjYXVzZXMgdGhlCitzcGFjZSB1c2VkIGJ5IHRlbXBvcmFyeSBmaWxlcyBjcmVhdGVkIHdpdGggInRtcGZpbGUoKSIgbm90IHRvIGJlIGZyZWVkIGFmdGVyCithbiBhYm5vcm1hbCBwcm9ncmFtIGV4aXQuICBJZiB5b3UgY2hlY2sgeW91ciBkaXNrIGFmdGVyd2FyZHMsIHlvdSB3aWxsIGZpbmQKK2NsdXN0ZXIgY2hhaW5zIHRoYXQgYXJlIGFsbG9jYXRlZCBidXQgbm90IHVzZWQgYnkgYSBmaWxlLiAgVGhpcyBzaG91bGQgbm90CitoYXBwZW4gaW4gY2pwZWcvZGpwZWcvanBlZ3RyYW4sIHNpbmNlIHdlIGVuYWJsZSBhIHNpZ25hbCBjYXRjaGVyIHRvIGV4cGxpY2l0bHkKK2Nsb3NlIHRlbXAgZmlsZXMgYmVmb3JlIGV4aXRpbmcuICBCdXQgaWYgeW91IHVzZSB0aGUgSlBFRyBsaWJyYXJ5IHdpdGggeW91cgorb3duIGNvZGUsIGJlIHN1cmUgdG8gc3VwcGx5IGEgc2lnbmFsIGNhdGNoZXIsIG9yIGVsc2UgdXNlIGEgZGlmZmVyZW50CitzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VyLgorCisKK0NyYXk6CisKK1Nob3VsZCB5b3UgYmUgc28gZm9ydHVuYXRlIGFzIHRvIGJlIHJ1bm5pbmcgSlBFRyBvbiBhIENyYXkgWU1QLCB0aGVyZSBpcyBhCitjb21waWxlciBidWcgaW4gb2xkIHZlcnNpb25zIG9mIENyYXkncyBTdGFuZGFyZCBDIChwcmlvciB0byAzLjEpLiAgSWYgeW91CitzdGlsbCBoYXZlIGFuIG9sZCBjb21waWxlciwgeW91J2xsIG5lZWQgdG8gaW5zZXJ0IGEgbGluZSByZWFkaW5nCisiI3ByYWdtYSBub3ZlY3RvciIganVzdCBiZWZvcmUgdGhlIGxvb3AJCisgICAgZm9yIChpID0gMTsgaSA8PSAoaW50KSBodGJsLT5iaXRzW2xdOyBpKyspCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CitpbiBmaXhfaHVmZl90YmwgKGluIFY1YmV0YTEsIGxpbmUgMjA0IG9mIGpjaHVmZi5jIGFuZCBsaW5lIDE3NiBvZiBqZGh1ZmYuYykuCitbVGhpcyBidWcgbWF5IG9yIG1heSBub3Qgc3RpbGwgb2NjdXIgd2l0aCB0aGUgY3VycmVudCBJSkcgY29kZSwgYnV0IGl0J3MKK3Byb2JhYmx5IGEgZGVhZCBpc3N1ZSBhbnl3YXkuLi5dCisKKworSFAtVVg6CisKK0lmIHlvdSBoYXZlIEhQLVVYIDcuMDUgb3IgbGF0ZXIgd2l0aCB0aGUgInNvZnR3YXJlIGRldmVsb3BtZW50IiBDIGNvbXBpbGVyLAoreW91IHNob3VsZCBydW4gdGhlIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4gIElmIHVzaW5nIHRoZSBjb25maWd1cmUgc2NyaXB0LAorc2F5CisJLi9jb25maWd1cmUgQ0M9J2NjIC1BYScKKyhvciAtQWUgaWYgeW91IHByZWZlcikuICBJZiBjb25maWd1cmluZyBieSBoYW5kLCB1c2UgbWFrZWZpbGUuYW5zaSBhbmQgYWRkCisiLUFhIiB0byB0aGUgQ0ZMQUdTIGxpbmUgaW4gdGhlIG1ha2VmaWxlLgorCitJZiB5b3UgaGF2ZSBhIHByZS03LjA1IHN5c3RlbSwgb3IgaWYgeW91IGFyZSB1c2luZyB0aGUgbm9uLUFOU0kgQyBjb21waWxlcgorZGVsaXZlcmVkIHdpdGggYSBtaW5pbXVtIEhQLVVYIHN5c3RlbSwgdGhlbiB5b3UgbXVzdCB1c2UgbWFrZWZpbGUudW5peAorKGFuZCBkbyBOT1QgYWRkIC1BYSk7IG9yIGp1c3QgcnVuIGNvbmZpZ3VyZSB3aXRob3V0IHRoZSBDQyBvcHRpb24uCisKK09uIEhQIDkwMDAgc2VyaWVzIDgwMCBtYWNoaW5lcywgdGhlIEhQIEMgY29tcGlsZXIgaXMgYnVnZ3kgaW4gcmV2aXNpb25zIHByaW9yCit0byBBLjA4LjA3LiAgSWYgeW91IGdldCBjb21wbGFpbnRzIGFib3V0ICJub3QgYSB0eXBlZGVmIG5hbWUiLCB5b3UnbGwgaGF2ZSB0bwordXNlIG1ha2VmaWxlLnVuaXgsIG9yIHJ1biBjb25maWd1cmUgd2l0aG91dCB0aGUgQ0Mgb3B0aW9uLgorCisKK01hY2ludG9zaCwgZ2VuZXJpYyBjb21tZW50czoKKworVGhlIHN1cHBsaWVkIHVzZXItaW50ZXJmYWNlIGZpbGVzIChjanBlZy5jLCBkanBlZy5jLCBldGMpIGFyZSBzZXQgdXAgdG8KK3Byb3ZpZGUgYSBVbml4LXN0eWxlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UuICBZb3UgY2FuIHVzZSB0aGlzIGludGVyZmFjZSBvbgordGhlIE1hYyBieSBtZWFucyBvZiB0aGUgY2NvbW1hbmQoKSBsaWJyYXJ5IHJvdXRpbmUgcHJvdmlkZWQgYnkgTWV0cm93ZXJrcworQ29kZVdhcnJpb3Igb3IgVGhpbmsgQy4gIFRoaXMgaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgdGVzdGluZyB0aGUgbGlicmFyeSwKK2hvd2V2ZXI7IHRvIG1ha2UgYSB1c2VyLWZyaWVuZGx5IGVxdWl2YWxlbnQgb2YgY2pwZWcvZGpwZWcgeW91J2QgcmVhbGx5IHdhbnQKK3RvIGRldmVsb3AgYSBNYWMtc3R5bGUgdXNlciBpbnRlcmZhY2UuICBUaGVyZSBpc24ndCBhIGNvbXBsZXRlIGV4YW1wbGUKK2F2YWlsYWJsZSBhdCB0aGUgbW9tZW50LCBidXQgdGhlcmUgYXJlIHNvbWUgaGVscGZ1bCBzdGFydGluZyBwb2ludHM6CisxLiBTYW0gQnVzaGVsbCdzIGZyZWUgIlRvIEpQRUciIGFwcGxldCBwcm92aWRlcyBkcmFnLWFuZC1kcm9wIGNvbnZlcnNpb24gdG8KK0pQRUcgdW5kZXIgU3lzdGVtIDcgYW5kIGxhdGVyLiAgVGhpcyBvbmx5IGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgdGhlCitjb21wcmVzc2lvbiBoYWxmIG9mIHRoZSBsaWJyYXJ5LCBidXQgaXQgZG9lcyBhIHZlcnkgbmljZSBqb2Igb2YgdGhhdCBwYXJ0LgorVGhlIENvZGVXYXJyaW9yIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cucG9ib3guY29tL35qc2FtLgorMi4gSmltIEJydW5uZXIgcHJlcGFyZWQgYSBNYWMtc3R5bGUgdXNlciBpbnRlcmZhY2UgZm9yIGJvdGggY29tcHJlc3Npb24gYW5kCitkZWNvbXByZXNzaW9uLiAgVW5mb3J0dW5hdGVseSwgaXQgaGFzbid0IGJlZW4gdXBkYXRlZCBzaW5jZSBJSkcgdjQsIGFuZAordGhlIGxpYnJhcnkncyBBUEkgaGFzIGNoYW5nZWQgY29uc2lkZXJhYmx5IHNpbmNlIHRoZW4uICBTdGlsbCBpdCBtYXkgYmUgb2YKK3NvbWUgaGVscCwgcGFydGljdWxhcmx5IGFzIGEgZ3VpZGUgdG8gY29tcGlsaW5nIHRoZSBJSkcgY29kZSB1bmRlciBUaGluayBDLgorSmltJ3MgY29kZSBpcyBhdmFpbGFibGUgZnJvbSB0aGUgSW5mby1NYWMgYXJjaGl2ZXMsIGF0IHN1bWV4LWFpbS5zdGFuZm9yZC5lZHUKK29yIG1pcnJvcnMgdGhlcmVvZjsgc2VlIGZpbGUgL2luZm8tbWFjL2Rldi9zcmMvanBlZy1jb252ZXJ0LWMuaHF4LgorCitqbWVtbWFjLmMgaXMgdGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kIGZvciBNYWNpbnRvc2guICBJdCB1c2VzCitOZXdQdHIvRGlzcG9zZVB0ciBpbnN0ZWFkIG9mIG1hbGxvYy9mcmVlLCBhbmQgaGFzIGEgTWFjLXNwZWNpZmljCitpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4gIEl0IGFsc28gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdGhhdAorZm9sbG93IE1hYyBjb252ZW50aW9ucy4gIChUaGF0IHBhcnQgb2YgdGhlIGNvZGUgcmVsaWVzIG9uIFN5c3RlbS03LW9yLWxhdGVyIE9TCitmdW5jdGlvbnMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGptZW1tYWMuYyBpZiB5b3UgbmVlZCB0byBydW4gaXQgb24gU3lzdGVtIDYuKQorTk9URSB0aGF0IFVTRV9NQUNfTUVNTUdSIG11c3QgYmUgZGVmaW5lZCBpbiBqY29uZmlnLmggdG8gdXNlIGptZW1tYWMuYy4KKworWW91IGNhbiBhbHNvIHVzZSBqbWVtbm9icy5jLCBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBoYW5kbGluZyBpbWFnZXMgbGFyZ2VyCit0aGFuIGF2YWlsYWJsZSBtZW1vcnkuICBJZiB5b3UgdXNlIGFueSBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCBvdGhlciB0aGFuCitqbWVtbWFjLmMsIHdlIHJlY29tbWVuZCByZXBsYWNpbmcgIm1hbGxvYyIgYW5kICJmcmVlIiBieSAiTmV3UHRyIiBhbmQKKyJEaXNwb3NlUHRyIiwgYmVjYXVzZSBNYWMgQyBsaWJyYXJpZXMgb2Z0ZW4gaGF2ZSBwZWN1bGlhciBpbXBsZW1lbnRhdGlvbnMgb2YKK21hbGxvYy9mcmVlLiAgKEZvciBpbnN0YW5jZSwgZnJlZSgpIG1heSBub3QgcmV0dXJuIHRoZSBmcmVlZCBzcGFjZSB0byB0aGUKK01hYyBNZW1vcnkgTWFuYWdlci4gIFRoaXMgaXMgdW5kZXNpcmFibGUgZm9yIHRoZSBJSkcgY29kZSBiZWNhdXNlIGptZW1tZ3IuYworYWxyZWFkeSBjbHVtcHMgc3BhY2UgcmVxdWVzdHMuKQorCisKK01hY2ludG9zaCwgTWV0cm93ZXJrcyBDb2RlV2FycmlvcjoKKworVGhlIFVuaXgtY29tbWFuZC1saW5lLXN0eWxlIGludGVyZmFjZSBjYW4gYmUgdXNlZCBieSBkZWZpbmluZyBVU0VfQ0NPTU1BTkQuCitZb3UnbGwgYWxzbyBuZWVkIHRvIGRlZmluZSBUV09fRklMRV9DT01NQU5ETElORSB0byBhdm9pZCBzdGRpbi9zdGRvdXQuCitUaGlzIG1lYW5zIHRoYXQgd2hlbiB1c2luZyB0aGUgY2pwZWcvZGpwZWcgcHJvZ3JhbXMsIHlvdSdsbCBoYXZlIHRvIHR5cGUgdGhlCitpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbmFtZXMgaW4gdGhlICJBcmd1bWVudHMiIHRleHQtZWRpdCBib3gsIHJhdGhlciB0aGFuCit1c2luZyB0aGUgZmlsZSByYWRpbyBidXR0b25zLiAgKFBlcmhhcHMgVVNFX0ZET1BFTiBvciBVU0VfU0VUTU9ERSB3b3VsZAorZWxpbWluYXRlIHRoZSBwcm9ibGVtLCBidXQgSSBoYXZlbid0IGhlYXJkIGZyb20gYW55b25lIHdobydzIHRyaWVkIGl0LikKKworT24gNjgweDAgTWFjcywgTWV0cm93ZXJrcyBkZWZpbmVzIHR5cGUgImRvdWJsZSIgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQKK2Zsb2F0LiAgam1lbW1nci5jIHdvbid0IGxpa2UgdGhpczogaXQgd2FudHMgc2l6ZW9mKEFMSUdOX1RZUEUpIHRvIGJlIGEgcG93ZXIKK29mIDIuICBBZGQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiB0byBqY29uZmlnLmggdG8gZWxpbWluYXRlIHRoZSBjb21wbGFpbnQuCisKK1RoZSBzdXBwbGllZCBjb25maWd1cmF0aW9uIGZpbGUgamNvbmZpZy5tYWMgY2FuIGJlIHVzZWQgZm9yIHlvdXIgamNvbmZpZy5oOworaXQgaW5jbHVkZXMgYWxsIHRoZSByZWNvbW1lbmRlZCBzeW1ib2wgZGVmaW5pdGlvbnMuICBJZiB5b3UgaGF2ZSBBcHBsZVNjcmlwdAoraW5zdGFsbGVkLCB5b3UgY2FuIHJ1biB0aGUgc3VwcGxpZWQgc2NyaXB0IG1ha2Vwcm9qLm1hYyB0byBjcmVhdGUgQ29kZVdhcnJpb3IKK3Byb2plY3QgZmlsZXMgZm9yIHRoZSBsaWJyYXJ5IGFuZCB0aGUgdGVzdGJlZCBhcHBsaWNhdGlvbnMsIHRoZW4gYnVpbGQgdGhlCitsaWJyYXJ5IGFuZCBhcHBsaWNhdGlvbnMuICAoVGhhbmtzIHRvIERhbiBTZWFycyBhbmQgRG9uIEFncm8gZm9yIHRoaXMgbmlmdHkKK2hhY2ssIHdoaWNoIHNhdmVzIHVzIGZyb20gdHJ5aW5nIHRvIG1haW50YWluIENvZGVXYXJyaW9yIHByb2plY3QgZmlsZXMgYXMgcGFydAorb2YgdGhlIElKRyBkaXN0cmlidXRpb24uLi4pCisKKworTWFjaW50b3NoLCBUaGluayBDOgorCitUaGUgZG9jdW1lbnRhdGlvbiBpbiBKaW0gQnJ1bm5lcidzICJKUEVHIENvbnZlcnQiIHNvdXJjZSBjb2RlIChzZWUgYWJvdmUpCitpbmNsdWRlcyBkZXRhaWxlZCBidWlsZCBpbnN0cnVjdGlvbnMgZm9yIFRoaW5rIEM7IGl0J3MgcHJvYmFibHkgc29tZXdoYXQKK291dCBvZiBkYXRlIGZvciB0aGUgY3VycmVudCByZWxlYXNlLCBidXQgbWF5IGJlIGhlbHBmdWwuCisKK0lmIHlvdSB3YW50IHRvIGJ1aWxkIHRoZSBtaW5pbWFsIGNvbW1hbmQgbGluZSB2ZXJzaW9uLCBwcm9jZWVkIGFzIGZvbGxvd3MuCitZb3UnbGwgaGF2ZSB0byBwcmVwYXJlIHByb2plY3QgZmlsZXMgZm9yIHRoZSBwcm9ncmFtczsgd2UgZG9uJ3QgaW5jbHVkZSBhbnkKK2luIHRoZSBkaXN0cmlidXRpb24gc2luY2UgdGhleSBhcmUgbm90IHRleHQgZmlsZXMuICBVc2UgdGhlIGZpbGUgbGlzdHMgaW4KK2FueSBvZiB0aGUgc3VwcGxpZWQgbWFrZWZpbGVzIGFzIGEgZ3VpZGUuICBBbHNvIGFkZCB0aGUgQU5TSSBhbmQgVW5peCBDCitsaWJyYXJpZXMgaW4gYSBzZXBhcmF0ZSBzZWdtZW50LiAgWW91IG1heSBuZWVkIHRvIGRpdmlkZSB0aGUgSlBFRyBmaWxlcyBpbnRvCittb3JlIHRoYW4gb25lIHNlZ21lbnQ7IHdlIHJlY29tbWVuZCBkaXZpZGluZyBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorbW9kdWxlcy4gIERlZmluZSBVU0VfQ0NPTU1BTkQgaW4gamNvbmZpZy5oIHNvIHRoYXQgdGhlIGNjb21tYW5kKCkgcm91dGluZSBpcworY2FsbGVkLiAgWW91IG11c3QgYWxzbyBkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUgYmVjYXVzZSBzdGRpbi9zdGRvdXQKK2Rvbid0IGhhbmRsZSBiaW5hcnkgZGF0YSBjb3JyZWN0bHkuCisKK09uIDY4MHgwIE1hY3MsIFRoaW5rIEMgZGVmaW5lcyB0eXBlICJkb3VibGUiIGFzIGEgMTItYnl0ZSBJRUVFIGV4dGVuZGVkIGZsb2F0Lgoram1lbW1nci5jIHdvbid0IGxpa2UgdGhpczogaXQgd2FudHMgc2l6ZW9mKEFMSUdOX1RZUEUpIHRvIGJlIGEgcG93ZXIgb2YgMi4KK0FkZCAiI2RlZmluZSBBTElHTl9UWVBFIGxvbmciIHRvIGpjb25maWcuaCB0byBlbGltaW5hdGUgdGhlIGNvbXBsYWludC4KKworamNvbmZpZy5tYWMgc2hvdWxkIHdvcmsgYXMgYSBqY29uZmlnLmggY29uZmlndXJhdGlvbiBmaWxlIGZvciBUaGluayBDLAorYnV0IHRoZSBtYWtlcHJvai5tYWMgQXBwbGVTY3JpcHQgc2NyaXB0IGlzIHNwZWNpZmljIHRvIENvZGVXYXJyaW9yLiAgU29ycnkuCisKKworTUlQUyBSMzAwMDoKKworTUlQUydzIGNjIHZlcnNpb24gMS4zMSBoYXMgYSByYXRoZXIgbmFzdHkgb3B0aW1pemF0aW9uIGJ1Zy4gIERvbid0IHVzZSAtTworaWYgeW91IGhhdmUgdGhhdCBjb21waWxlciB2ZXJzaW9uLiAgKFVzZSAiY2MgLVYiIHRvIGNoZWNrIHRoZSB2ZXJzaW9uLikKK05vdGUgdGhhdCB0aGUgUjMwMDAgY2hpcCBpcyBmb3VuZCBpbiB3b3Jrc3RhdGlvbnMgZnJvbSBERUMgYW5kIG90aGVycy4KKworCitNUy1ET1MsIGdlbmVyaWMgY29tbWVudHMgZm9yIDE2LWJpdCBjb21waWxlcnM6CisKK1RoZSBJSkcgY29kZSBpcyBkZXNpZ25lZCB0byB3b3JrIHdlbGwgaW4gODB4ODYgInNtYWxsIiBvciAibWVkaXVtIiBtZW1vcnkKK21vZGVscyAoaS5lLiwgZGF0YSBwb2ludGVycyBhcmUgMTYgYml0cyB1bmxlc3MgZXhwbGljaXRseSBkZWNsYXJlZCAiZmFyIjsKK2NvZGUgcG9pbnRlcnMgY2FuIGJlIGVpdGhlciBzaXplKS4gIFlvdSBtYXkgYmUgYWJsZSB0byB1c2Ugc21hbGwgbW9kZWwgdG8KK2NvbXBpbGUgY2pwZWcgb3IgZGpwZWcgYnkgaXRzZWxmLCBidXQgeW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byB1c2UgbWVkaXVtCittb2RlbCBmb3IgYW55IGxhcmdlciBhcHBsaWNhdGlvbi4gIFRoaXMgd29uJ3QgbWFrZSBtdWNoIGRpZmZlcmVuY2UgaW4KK3BlcmZvcm1hbmNlLiAgWW91ICp3aWxsKiB0YWtlIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBoaXQgaWYgeW91IHVzZSBhCitsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCwgYW5kIHlvdSBzaG91bGQgYXZvaWQgImh1Z2UiIG1vZGVsIGlmIGF0IGFsbAorcG9zc2libGUuICBCZSBzdXJlIHRoYXQgTkVFRF9GQVJfUE9JTlRFUlMgaXMgZGVmaW5lZCBpbiBqY29uZmlnLmggaWYgeW91IHVzZQorYSBzbWFsbC1kYXRhIG1lbW9yeSBtb2RlbDsgYmUgc3VyZSBpdCBpcyBOT1QgZGVmaW5lZCBpZiB5b3UgdXNlIGEgbGFyZ2UtZGF0YQorbW9kZWwuICAoVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBhbmQgamNvbmZpZyBmaWxlcyBmb3IgQm9ybGFuZCBhbmQgTWljcm9zb2Z0IEMKK2NvbXBpbGUgaW4gbWVkaXVtIG1vZGVsIGFuZCBkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMuKQorCitUaGUgRE9TLXNwZWNpZmljIG1lbW9yeSBtYW5hZ2VyLCBqbWVtZG9zLmMsIHNob3VsZCBiZSB1c2VkIGlmIHBvc3NpYmxlLgorSXQgbmVlZHMgc29tZSBhc3NlbWJseS1jb2RlIHJvdXRpbmVzIHdoaWNoIGFyZSBpbiBqbWVtZG9zYS5hc207IG1ha2Ugc3VyZQoreW91ciBtYWtlZmlsZSBhc3NlbWJsZXMgdGhhdCBmaWxlIGFuZCBpbmNsdWRlcyBpdCBpbiB0aGUgbGlicmFyeS4gIElmIHlvdQorZG9uJ3QgaGF2ZSBhIHN1aXRhYmxlIGFzc2VtYmxlciwgeW91IGNhbiBnZXQgcHJlLWFzc2VtYmxlZCBvYmplY3QgZmlsZXMgZm9yCitqbWVtZG9zYSBieSBGVFAgZnJvbSBmdHAudXUubmV0Oi9ncmFwaGljcy9qcGVnL2pkb3Nhb2JqLnppcC4gIChET1Mtb3JpZW50ZWQKK2Rpc3RyaWJ1dGlvbnMgb2YgdGhlIElKRyBzb3VyY2UgY29kZSBvZnRlbiBpbmNsdWRlIHRoZXNlIG9iamVjdCBmaWxlcy4pCisKK1doZW4gdXNpbmcgam1lbWRvcy5jLCBqY29uZmlnLmggbXVzdCBkZWZpbmUgVVNFX01TRE9TX01FTU1HUiBhbmQgbXVzdCBzZXQKK01BWF9BTExPQ19DSFVOSyB0byBsZXNzIHRoYW4gNjRLICg2NTUyMEwgaXMgYSB0eXBpY2FsIHZhbHVlKS4gIElmIHlvdXIKK0MgbGlicmFyeSdzIGZhci1oZWFwIG1hbGxvYygpIGNhbid0IGFsbG9jYXRlIGJsb2NrcyB0aGF0IGxhcmdlLCByZWR1Y2UKK01BWF9BTExPQ19DSFVOSyB0byB3aGF0ZXZlciBpdCBjYW4gaGFuZGxlLgorCitJZiB5b3UgY2FuJ3QgdXNlIGptZW1kb3MuYyBmb3Igc29tZSByZWFzb24gLS0tIGZvciBleGFtcGxlLCBiZWNhdXNlIHlvdQorZG9uJ3QgaGF2ZSBhbiBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgam1lbWRvc2EuYXNtIC0tLSB5b3UnbGwgaGF2ZSB0byBmYWxsCitiYWNrIHRvIGptZW1hbnNpLmMgb3Igam1lbW5hbWUuYy4gIFlvdSdsbCBwcm9iYWJseSBzdGlsbCBuZWVkIHRvIHNldAorTUFYX0FMTE9DX0NIVU5LIGluIGpjb25maWcuaCwgYmVjYXVzZSBtb3N0IERPUyBDIGxpYnJhcmllcyB3b24ndCBtYWxsb2MoKQorbW9yZSB0aGFuIDY0SyBhdCBhIHRpbWUuICBJTVBPUlRBTlQ6IGlmIHlvdSB1c2Ugam1lbWFuc2kuYyBvciBqbWVtbmFtZS5jLAoreW91IHdpbGwgaGF2ZSB0byBjb21waWxlIGluIGEgbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwgaW4gb3JkZXIgdG8gZ2V0IHRoZQorcmlnaHQgc3RkaW8gbGlicmFyeS4gIFRvbyBiYWQuCisKK3dyanBnY29tIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluIGxhcmdlIG1vZGVsLCBiZWNhdXNlIGl0IG1hbGxvYygpcyBhIDY0S0IKK3dvcmsgYXJlYSB0byBob2xkIHRoZSBjb21tZW50IHRleHQuICBJZiB5b3VyIEMgbGlicmFyeSdzIG1hbGxvYyBjYW4ndAoraGFuZGxlIHRoYXQsIHJlZHVjZSBNQVhfQ09NX0xFTkdUSCBhcyBuZWNlc3NhcnkgaW4gd3JqcGdjb20uYy4KKworTW9zdCBNUy1ET1MgY29tcGlsZXJzIHRyZWF0IHN0ZGluL3N0ZG91dCBhcyB0ZXh0IGZpbGVzLCBzbyB5b3UgbXVzdCB1c2UKK3R3by1maWxlIGNvbW1hbmQgbGluZSBzdHlsZS4gIEJ1dCBpZiB5b3VyIGNvbXBpbGVyIGhhcyBlaXRoZXIgZmRvcGVuKCkgb3IKK3NldG1vZGUoKSwgeW91IGNhbiB1c2Ugb25lLWZpbGUgc3R5bGUgaWYgeW91IGxpa2UuICBUbyBkbyB0aGlzLCBkZWZpbmUKK1VTRV9TRVRNT0RFIG9yIFVTRV9GRE9QRU4gc28gdGhhdCBzdGRpbi9zdGRvdXQgd2lsbCBiZSBzZXQgdG8gYmluYXJ5IG1vZGUuCisoVVNFX1NFVE1PREUgc2VlbXMgdG8gd29yayB3aXRoIG1vcmUgRE9TIGNvbXBpbGVycyB0aGFuIFVTRV9GRE9QRU4uKSAgWW91CitzaG91bGQgdGVzdCB0aGF0IEkvTyB0aHJvdWdoIHN0ZGluL3N0ZG91dCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHRzIGFzIEkvTwordG8gZXhwbGljaXRseSBuYW1lZCBmaWxlcy4uLiB0aGUgIm1ha2UgdGVzdCIgcHJvY2VkdXJlcyBpbiB0aGUgc3VwcGxpZWQKK21ha2VmaWxlcyBkbyBOT1QgdXNlIHN0ZGluL3N0ZG91dC4KKworCitNUy1ET1MsIGdlbmVyaWMgY29tbWVudHMgZm9yIDMyLWJpdCBjb21waWxlcnM6CisKK05vbmUgb2YgdGhlIGFib3ZlIGNvbW1lbnRzIGFib3V0IG1lbW9yeSBtb2RlbHMgYXBwbHkgaWYgeW91IGFyZSB1c2luZyBhCiszMi1iaXQgZmxhdC1tZW1vcnktc3BhY2UgZW52aXJvbm1lbnQsIHN1Y2ggYXMgREpHUFAgb3IgV2F0Y29tIEMuICAoQW5kIHlvdQorc2hvdWxkIHVzZSBvbmUgaWYgeW91IGhhdmUgaXQsIGFzIHBlcmZvcm1hbmNlIHdpbGwgYmUgbXVjaCBiZXR0ZXIgdGhhbgorODA4Ni1jb21wYXRpYmxlIGNvZGUhKSAgRm9yIGZsYXQtbWVtb3J5LXNwYWNlIGNvbXBpbGVycywgZG8gTk9UIGRlZmluZQorTkVFRF9GQVJfUE9JTlRFUlMsIGFuZCBkbyBOT1QgdXNlIGptZW1kb3MuYy4gIFVzZSBqbWVtbm9icy5jIGlmIHRoZQorZW52aXJvbm1lbnQgc3VwcGxpZXMgYWRlcXVhdGUgdmlydHVhbCBtZW1vcnksIG90aGVyd2lzZSB1c2Ugam1lbWFuc2kuYyBvcgoram1lbW5hbWUuYy4KKworWW91J2xsIHN0aWxsIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCBiaW5hcnkgSS9PIHRocm91Z2ggc3RkaW4vc3Rkb3V0LgorU2VlIHRoZSBsYXN0IHBhcmFncmFwaCBvZiB0aGUgcHJldmlvdXMgc2VjdGlvbi4KKworCitNUy1ET1MsIEJvcmxhbmQgQzoKKworQmUgc3VyZSB0byBjb252ZXJ0IGFsbCB0aGUgc291cmNlIGZpbGVzIHRvIERPUyB0ZXh0IGZvcm1hdCAoQ1IvTEYgbmV3bGluZXMpLgorQWx0aG91Z2ggQm9ybGFuZCBDIHdpbGwgb2Z0ZW4gd29yayBPSyB3aXRoIHVubW9kaWZpZWQgVW5peCAoTEYgbmV3bGluZXMpCitzb3VyY2UgZmlsZXMsIHNvbWV0aW1lcyBpdCB3aWxsIGdpdmUgYm9ndXMgY29tcGlsZSBlcnJvcnMuCisiSWxsZWdhbCBjaGFyYWN0ZXIgJyMnIiBpcyB0aGUgbW9zdCBjb21tb24gc3VjaCBlcnJvci4gIChUaGlzIGlzIHRydWUgd2l0aAorQm9ybGFuZCBDIDMuMSwgYnV0IHBlcmhhcHMgaXMgZml4ZWQgaW4gbmV3ZXIgcmVsZWFzZXMuKQorCitJZiB5b3Ugd2FudCBvbmUtZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUsIGp1c3QgdW5kZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUuCitqY29uZmlnLmJjYyBhbHJlYWR5IGluY2x1ZGVzICNkZWZpbmUgVVNFX1NFVE1PREUgdG8gbWFrZSB0aGlzIHdvcmsuCisoZmRvcGVuIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LikKKworCitNUy1ET1MsIE1pY3Jvc29mdCBDOgorCittYWtlZmlsZS5tYzYgd29ya3Mgd2l0aCBNaWNyb3NvZnQgQywgRE9TIFZpc3VhbCBDKyssIGV0Yy4gIEl0IHNob3VsZCBvbmx5CitiZSB1c2VkIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgMTYtYml0IChzbWFsbCBvciBtZWRpdW0gbWVtb3J5IG1vZGVsKSBwcm9ncmFtLgorCitJZiB5b3Ugd2FudCBvbmUtZmlsZSBjb21tYW5kIGxpbmUgc3R5bGUsIGp1c3QgdW5kZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUuCitqY29uZmlnLm1jNiBhbHJlYWR5IGluY2x1ZGVzICNkZWZpbmUgVVNFX1NFVE1PREUgdG8gbWFrZSB0aGlzIHdvcmsuCisoZmRvcGVuIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5LikKKworTm90ZSB0aGF0IHRoaXMgbWFrZWZpbGUgYXNzdW1lcyB0aGF0IHRoZSB3b3JraW5nIGNvcHkgb2YgaXRzZWxmIGlzIGNhbGxlZAorIm1ha2VmaWxlIi4gIElmIHlvdSB3YW50IHRvIGNhbGwgaXQgc29tZXRoaW5nIGVsc2UsIHNheSAibWFrZWZpbGUubWFrIiwKK2JlIHN1cmUgdG8gYWRqdXN0IHRoZSBkZXBlbmRlbmN5IGxpbmUgdGhhdCByZWFkcyAiJChSRklMRSkgOiBtYWtlZmlsZSIuCitPdGhlcndpc2UgdGhlIG1ha2Ugd2lsbCBmYWlsIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBjcmVhdGUgIm1ha2VmaWxlIi4KK1dvcnNlLCBzb21lIHJlbGVhc2VzIG9mIE1pY3Jvc29mdCdzIG1ha2UgdXRpbGl0aWVzIGdpdmUgYW4gaW5jb3JyZWN0IGVycm9yCittZXNzYWdlIGluIHRoaXMgc2l0dWF0aW9uLgorCitPbGQgdmVyc2lvbnMgb2YgTVMgQyBmYWlsIHdpdGggYW4gIm91dCBvZiBtYWNybyBleHBhbnNpb24gc3BhY2UiIGVycm9yCitiZWNhdXNlIHRoZXkgY2FuJ3QgY29wZSB3aXRoIHRoZSBtYWNybyBUUkFDRU1TOCAoZGVmaW5lZCBpbiBqZXJyb3IuaCkuCitJZiB0aGlzIGhhcHBlbnMgdG8geW91LCB0aGUgZWFzaWVzdCBzb2x1dGlvbiBpcyB0byBjaGFuZ2UgVFJBQ0VNUzggdG8KK2V4cGFuZCB0byBub3RoaW5nLiAgWW91J2xsIGxvc2UgdGhlIGFiaWxpdHkgdG8gZHVtcCBvdXQgSlBFRyBjb2VmZmljaWVudAordGFibGVzIHdpdGggZGpwZWcgLWRlYnVnIC1kZWJ1ZywgYnV0IGF0IGxlYXN0IHlvdSBjYW4gY29tcGlsZS4KKworT3JpZ2luYWwgTVMgQyA2LjAgaXMgdmVyeSBidWdneTsgaXQgY29tcGlsZXMgaW5jb3JyZWN0IGNvZGUgdW5sZXNzIHlvdSB0dXJuCitvZmYgb3B0aW1pemF0aW9uIGVudGlyZWx5IChyZW1vdmUgLU8gZnJvbSBDRkxBR1MpLiAgNi4wMEEgaXMgYmV0dGVyLCBidXQgaXQKK3N0aWxsIGdlbmVyYXRlcyBiYWQgY29kZSBpZiB5b3UgZW5hYmxlIGxvb3Agb3B0aW1pemF0aW9ucyAoLU9sIG9yIC1PeCkuCisKK01TIEMgOC4wIGNyYXNoZXMgd2hlbiBjb21waWxpbmcganF1YW50MS5jIHdpdGggb3B0aW1pemF0aW9uIHN3aXRjaCAvT28gLi4uCit3aGljaCBpcyBvbiBieSBkZWZhdWx0LiAgVG8gd29yayBhcm91bmQgdGhpcyBidWcsIGNvbXBpbGUgdGhhdCBvbmUgZmlsZQord2l0aCAvT28tLgorCisKK01pY3Jvc29mdCBXaW5kb3dzIChhbGwgdmVyc2lvbnMpLCBnZW5lcmljIGNvbW1lbnRzOgorCitTb21lIFdpbmRvd3Mgc3lzdGVtIGluY2x1ZGUgZmlsZXMgZGVmaW5lIHR5cGVkZWYgYm9vbGVhbiBhcyAidW5zaWduZWQgY2hhciIuCitUaGUgSUpHIGNvZGUgYWxzbyBkZWZpbmVzIHR5cGVkZWYgYm9vbGVhbiwgYnV0IHdlIG1ha2UgaXQgImludCIgYnkgZGVmYXVsdC4KK1RoaXMgZG9lc24ndCBhZmZlY3QgdGhlIElKRyBwcm9ncmFtcyBiZWNhdXNlIHdlIGRvbid0IGltcG9ydCB0aG9zZSBXaW5kb3dzCitpbmNsdWRlIGZpbGVzLiAgQnV0IGlmIHlvdSB1c2UgdGhlIEpQRUcgbGlicmFyeSBpbiB5b3VyIG93biBwcm9ncmFtLCBhbmQgc29tZQorb2YgeW91ciBwcm9ncmFtJ3MgZmlsZXMgaW1wb3J0IG9uZSBkZWZpbml0aW9uIG9mIGJvb2xlYW4gd2hpbGUgc29tZSBpbXBvcnQgdGhlCitvdGhlciwgeW91IGNhbiBnZXQgYWxsIHNvcnRzIG9mIG15c3RlcmlvdXMgcHJvYmxlbXMuICBBIGdvb2QgcHJldmVudGl2ZSBzdGVwCitpcyB0byBtYWtlIHRoZSBJSkcgbGlicmFyeSB1c2UgInVuc2lnbmVkIGNoYXIiIGZvciBib29sZWFuLiAgVG8gZG8gdGhhdCwKK2FkZCBzb21ldGhpbmcgbGlrZSB0aGlzIHRvIHlvdXIgamNvbmZpZy5oIGZpbGU6CisJLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKwkjaWZuZGVmIF9fUlBDTkRSX0hfXwkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KKwl0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKKwkjZW5kaWYKKwkjZGVmaW5lIEhBVkVfQk9PTEVBTgkvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCisoVGhpcyBpcyBhbHJlYWR5IGluIGpjb25maWcudmMsIGJ5IHRoZSB3YXkuKQorCit3aW5kZWYuaCBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zCisJI2RlZmluZSBmYXIKKwkjZGVmaW5lIEZBUiBmYXIKK1NpbmNlIGptb3JlY2ZnLmggdHJpZXMgdG8gZGVmaW5lIEZBUiBhcyBlbXB0eSwgeW91IG1heSBnZXQgYSBjb21waWxlcgord2FybmluZyBpZiB5b3UgaW5jbHVkZSBib3RoIGpwZWdsaWIuaCBhbmQgd2luZGVmLmggKHdoaWNoIHdpbmRvd3MuaAoraW5jbHVkZXMpLiAgVG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcsIHlvdSBjYW4gcHV0ICIjaWZuZGVmIEZBUiIvIiNlbmRpZiIKK2Fyb3VuZCB0aGUgbGluZSAiI2RlZmluZSBGQVIiIGluIGptb3JlY2ZnLmguCisKK1doZW4gdXNpbmcgdGhlIGxpYnJhcnkgaW4gYSBXaW5kb3dzIGFwcGxpY2F0aW9uLCB5b3Ugd2lsbCBhbG1vc3QgY2VydGFpbmx5Cit3YW50IHRvIG1vZGlmeSBvciByZXBsYWNlIHRoZSBlcnJvciBoYW5kbGVyIG1vZHVsZSBqZXJyb3IuYywgc2luY2Ugb3VyCitkZWZhdWx0IGVycm9yIGhhbmRsZXIgZG9lcyBhIGNvdXBsZSBvZiBpbmFwcHJvcHJpYXRlIHRoaW5nczoKKyAgMS4gaXQgdHJpZXMgdG8gd3JpdGUgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgb24gc3RkZXJyOworICAyLiBpbiBldmVudCBvZiBhIGZhdGFsIGVycm9yLCBpdCBleGl0cyBieSBjYWxsaW5nIGV4aXQoKS4KKworQSBzaW1wbGUgc3RvcGdhcCBzb2x1dGlvbiBmb3IgcHJvYmxlbSAxIGlzIHRvIHJlcGxhY2UgdGhlIGxpbmUKKwlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBidWZmZXIpOworKGluIG91dHB1dF9tZXNzYWdlIGluIGplcnJvci5jKSB3aXRoCisJTWVzc2FnZUJveChHZXRBY3RpdmVXaW5kb3coKSxidWZmZXIsIkpQRUcgRXJyb3IiLE1CX09LfE1CX0lDT05FUlJPUik7CitJdCdzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBhdCBsZWFzdCBkbyB0aGF0IG11Y2gsIHNpbmNlIG90aGVyd2lzZQorZXJyb3IgbWVzc2FnZXMgd2lsbCBkaXNhcHBlYXIgaW50byBub3doZXJlLiAgKEJlZ2lubmluZyB3aXRoIElKRyB2NmIsIHRoaXMKK2NvZGUgaXMgYWxyZWFkeSBwcmVzZW50IGluIGplcnJvci5jOyBqdXN0IGRlZmluZSBVU0VfV0lORE9XU19NRVNTQUdFQk9YIGluCitqY29uZmlnLmggdG8gZW5hYmxlIGl0LikKKworVGhlIHByb3BlciBzb2x1dGlvbiBmb3IgcHJvYmxlbSAyIGlzIHRvIHJldHVybiBjb250cm9sIHRvIHlvdXIgY2FsbGluZworYXBwbGljYXRpb24gYWZ0ZXIgYSBsaWJyYXJ5IGVycm9yLiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzZXRqbXAvbG9uZ2ptcAordGVjaG5pcXVlIGRpc2N1c3NlZCBpbiBsaWJqcGVnLmRvYyBhbmQgaWxsdXN0cmF0ZWQgaW4gZXhhbXBsZS5jLiAgKE5PVEU6Citzb21lIG9sZGVyIFdpbmRvd3MgQyBjb21waWxlcnMgcHJvdmlkZSB2ZXJzaW9ucyBvZiBzZXRqbXAvbG9uZ2ptcCB0aGF0Citkb24ndCBhY3R1YWxseSB3b3JrIHVuZGVyIFdpbmRvd3MuICBZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBXaW5kb3dzIHN5c3RlbQorZnVuY3Rpb25zIENhdGNoIGFuZCBUaHJvdyBpbnN0ZWFkLikKKworVGhlIHJlY29tbWVuZGVkIG1lbW9yeSBtYW5hZ2VyIHVuZGVyIFdpbmRvd3MgaXMgam1lbW5vYnMuYzsgaW4gb3RoZXIgd29yZHMsCitsZXQgV2luZG93cyBkbyBhbnkgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCBuZWVkZWQuICBZb3Ugc2hvdWxkIE5PVCB1c2UKK2ptZW1kb3MuYyBub3Igam1lbWRvc2EuYXNtIHVuZGVyIFdpbmRvd3MuCisKK0ZvciBXaW5kb3dzIDMuMSwgd2UgcmVjb21tZW5kIGNvbXBpbGluZyBpbiBtZWRpdW0gb3IgbGFyZ2UgbWVtb3J5IG1vZGVsOworZm9yIG5ld2VyIFdpbmRvd3MgdmVyc2lvbnMsIHVzZSBhIDMyLWJpdCBmbGF0IG1lbW9yeSBtb2RlbC4gIChTZWUgdGhlIE1TLURPUworc2VjdGlvbnMgYWJvdmUgZm9yIG1vcmUgaW5mbyBhYm91dCBtZW1vcnkgbW9kZWxzLikgIEluIHRoZSAxNi1iaXQgbWVtb3J5Cittb2RlbHMgb25seSwgeW91J2xsIG5lZWQgdG8gcHV0CisJI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLworaW50byBqY29uZmlnLmggdG8gbGltaXQgYWxsb2NhdGlvbiBjaHVua3MgdG8gNjRLYi4gIChXaXRob3V0IHRoYXQsIHlvdSdkCitoYXZlIHRvIHVzZSBodWdlIG1lbW9yeSBtb2RlbCwgd2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gdW5uZWNlc3NhcmlseS4pCitqbWVtbm9icy5jIHdvcmtzIHdpdGhvdXQgbW9kaWZpY2F0aW9uIGluIGxhcmdlIG9yIGZsYXQgbWVtb3J5IG1vZGVscywgYnV0IHRvCit1c2UgbWVkaXVtIG1vZGVsLCB5b3UgbmVlZCB0byBtb2RpZnkgaXRzIGpwZWdfZ2V0X2xhcmdlIGFuZCBqcGVnX2ZyZWVfbGFyZ2UKK3JvdXRpbmVzIHRvIGFsbG9jYXRlIGZhciBtZW1vcnkuICBJbiBhbnkgY2FzZSwgeW91IG1pZ2h0IGxpa2UgdG8gcmVwbGFjZQoraXRzIGNhbGxzIHRvIG1hbGxvYyBhbmQgZnJlZSB3aXRoIGRpcmVjdCBjYWxscyBvbiBXaW5kb3dzIG1lbW9yeSBhbGxvY2F0aW9uCitmdW5jdGlvbnMuCisKK1lvdSBtYXkgYWxzbyB3YW50IHRvIG1vZGlmeSBqZGF0YXNyYy5jIGFuZCBqZGF0YWRzdC5jIHRvIHVzZSBXaW5kb3dzIGZpbGUKK29wZXJhdGlvbnMgcmF0aGVyIHRoYW4gZnJlYWQvZndyaXRlLiAgVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3VyIEMKK2NvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSBhIGNvbXBldGVudCBpbXBsZW1lbnRhdGlvbiBvZiBDIHN0ZGlvIGZ1bmN0aW9ucy4KKworWW91IG1pZ2h0IHdhbnQgdG8gdHdlYWsgdGhlIFJHQl94eHggbWFjcm9zIGluIGptb3JlY2ZnLmggc28gdGhhdCB0aGUgbGlicmFyeQord2lsbCBhY2NlcHQgb3IgZGVsaXZlciBjb2xvciBwaXhlbHMgaW4gQkdSIHNhbXBsZSBvcmRlciwgbm90IFJHQjsgQkdSIG9yZGVyCitpcyB1c3VhbGx5IG1vcmUgY29udmVuaWVudCB1bmRlciBXaW5kb3dzLiAgTm90ZSB0aGF0IHRoaXMgY2hhbmdlIHdpbGwgYnJlYWsKK3RoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnLCBidXQgdGhlIGxpYnJhcnkgaXRzZWxmIHdvcmtzIGZpbmUuCisKKworTWFueSBwZW9wbGUgd2FudCB0byBjb252ZXJ0IHRoZSBJSkcgbGlicmFyeSBpbnRvIGEgRExMLiAgVGhpcyBpcyByZWFzb25hYmx5CitzdHJhaWdodGZvcndhcmQsIGJ1dCB3YXRjaCBvdXQgZm9yIHRoZSBmb2xsb3dpbmc6CisKKyAgMS4gRG9uJ3QgdHJ5IHRvIGNvbXBpbGUgYXMgYSBETEwgaW4gc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbDsgdXNlCitsYXJnZSBtb2RlbCwgb3IgZXZlbiBiZXR0ZXIsIDMyLWJpdCBmbGF0IG1vZGVsLiAgTWFueSBwbGFjZXMgaW4gdGhlIElKRyBjb2RlCithc3N1bWUgdGhlIGFkZHJlc3Mgb2YgYSBsb2NhbCB2YXJpYWJsZSBpcyBhbiBvcmRpbmFyeSAobm90IEZBUikgcG9pbnRlcjsKK3RoYXQgaXNuJ3QgdHJ1ZSBpbiBhIG1lZGl1bS1tb2RlbCBETEwuCisKKyAgMi4gTWljcm9zb2Z0IEMgY2Fubm90IHBhc3MgZmlsZSBwb2ludGVycyBiZXR3ZWVuIGFwcGxpY2F0aW9ucyBhbmQgRExMcy4KKyhTZWUgTWljcm9zb2Z0IEtub3dsZWRnZSBCYXNlLCBQU1MgSUQgTnVtYmVyIFE1MDMzNi4pICBTbyBqZGF0YXNyYy5jIGFuZAoramRhdGFkc3QuYyBkb24ndCB3b3JrIGlmIHlvdSBvcGVuIGEgZmlsZSBpbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGVuIHBhc3MKK3RoZSBwb2ludGVyIHRvIHRoZSBETEwuICBPbmUgd29ya2Fyb3VuZCBpcyB0byBtYWtlIGpkYXRhc3JjLmMvamRhdGFkc3QuYworcGFydCBvZiB5b3VyIG1haW4gYXBwbGljYXRpb24gcmF0aGVyIHRoYW4gcGFydCBvZiB0aGUgRExMLgorCisgIDMuIFlvdSdsbCBwcm9iYWJseSBuZWVkIHRvIG1vZGlmeSB0aGUgbWFjcm9zIEdMT0JBTCgpIGFuZCBFWFRFUk4oKSB0bworYXR0YWNoIHN1aXRhYmxlIGxpbmthZ2Uga2V5d29yZHMgdG8gdGhlIGV4cG9ydGVkIHJvdXRpbmUgbmFtZXMuICBTaW1pbGFybHksCit5b3UnbGwgd2FudCB0byBtb2RpZnkgTUVUSE9EREVGKCkgYW5kIEpNRVRIT0QoKSB0byBlbnN1cmUgZnVuY3Rpb24gcG9pbnRlcnMKK2FyZSBkZWNsYXJlZCBpbiBhIHdheSB0aGF0IGxldHMgYXBwbGljYXRpb24gcm91dGluZXMgYmUgY2FsbGVkIGJhY2sgdGhyb3VnaAordGhlIGZ1bmN0aW9uIHBvaW50ZXJzLiAgVGhlc2UgbWFjcm9zIGFyZSBpbiBqbW9yZWNmZy5oLiAgVHlwaWNhbCBkZWZpbml0aW9ucworZm9yIGEgMTYtYml0IERMTCBhcmU6CisJI2RlZmluZSBHTE9CQUwodHlwZSkJCXR5cGUgX2ZhciBfcGFzY2FsIF9sb2FkZHMgX2V4cG9ydAorCSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZSBfZmFyIF9wYXNjYWwgX2xvYWRkcworCSNkZWZpbmUgTUVUSE9EREVGKHR5cGUpCQlzdGF0aWMgdHlwZSBfZmFyIF9wYXNjYWwKKwkjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICBcCisJCXR5cGUgKF9mYXIgX3Bhc2NhbCAqbWV0aG9kbmFtZSkgYXJnbGlzdAorRm9yIGEgMzItYml0IERMTCB5b3UgbWF5IHdhbnQgc29tZXRoaW5nIGxpa2UKKwkjZGVmaW5lIEdMT0JBTCh0eXBlKQkJX19kZWNsc3BlYyhkbGxleHBvcnQpIHR5cGUKKwkjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB0eXBlCitBbHRob3VnaCBub3QgYWxsIHRoZSBHTE9CQUwgcm91dGluZXMgYXJlIGFjdHVhbGx5IGludGVuZGVkIHRvIGJlIGNhbGxlZCBieQordGhlIGFwcGxpY2F0aW9uLCB0aGUgcGVyZm9ybWFuY2UgY29zdCBvZiBtYWtpbmcgdGhlbSBhbGwgRExMIGVudHJ5IHBvaW50cyBpcworbmVnbGlnaWJsZS4KKworVGhlIHVubW9kaWZpZWQgSUpHIGxpYnJhcnkgcHJlc2VudHMgYSB2ZXJ5IEMtc3BlY2lmaWMgYXBwbGljYXRpb24gaW50ZXJmYWNlLAorc28gdGhlIHJlc3VsdGluZyBETEwgaXMgb25seSB1c2FibGUgZnJvbSBDIG9yIEMrKyBhcHBsaWNhdGlvbnMuICBUaGVyZSBoYXMKK2JlZW4gc29tZSB0YWxrIG9mIHdyaXRpbmcgd3JhcHBlciBjb2RlIHRoYXQgd291bGQgcHJlc2VudCBhIHNpbXBsZXIgaW50ZXJmYWNlCit1c2FibGUgZnJvbSBvdGhlciBsYW5ndWFnZXMsIHN1Y2ggYXMgVmlzdWFsIEJhc2ljLiAgVGhpcyBpcyBvbiBvdXIgdG8tZG8gbGlzdAorYnV0IGhhc24ndCBiZWVuIHZlcnkgaGlnaCBwcmlvcml0eSAtLS0gYW55IHZvbHVudGVlcnMgb3V0IHRoZXJlPworCisKK01pY3Jvc29mdCBXaW5kb3dzLCBCb3JsYW5kIEM6CisKK1RoZSBwcm92aWRlZCBqY29uZmlnLmJjYyBzaG91bGQgd29yayBPSyBpbiBhIDMyLWJpdCBXaW5kb3dzIGVudmlyb25tZW50LAorYnV0IHlvdSdsbCBuZWVkIHRvIHR3ZWFrIGl0IGluIGEgMTYtYml0IGVudmlyb25tZW50ICh5b3UnZCBuZWVkIHRvIGRlZmluZQorTkVFRF9GQVJfUE9JTlRFUlMgYW5kIE1BWF9BTExPQ19DSFVOSykuICBCZXdhcmUgdGhhdCBtYWtlZmlsZS5iY2Mgd2lsbCBuZWVkCithbHRlcmF0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBmb3IgV2luZG93cyAtLS0gaW4gcGFydGljdWxhciwgeW91IHNob3VsZAordXNlIGptZW1ub2JzLmMgbm90IGptZW1kb3MuYyB1bmRlciBXaW5kb3dzLgorCitCb3JsYW5kIEMrKyA0LjUgZmFpbHMgd2l0aCBhbiBpbnRlcm5hbCBjb21waWxlciBlcnJvciB3aGVuIHRyeWluZyB0byBjb21waWxlCitqZG1lcmdlLmMgaW4gMzItYml0IG1vZGUuICBJZiBlbm91Z2ggcGVvcGxlIGNvbXBsYWluLCBwZXJoYXBzIEJvcmxhbmQgd2lsbCBmaXgKK2l0LiAgSW4gdGhlIG1lYW50aW1lLCB0aGUgc2ltcGxlc3Qga25vd24gd29ya2Fyb3VuZCBpcyB0byBhZGQgYSByZWR1bmRhbnQKK2RlZmluaXRpb24gb2YgdGhlIHZhcmlhYmxlIHJhbmdlX2xpbWl0IGluIGgydjFfbWVyZ2VkX3Vwc2FtcGxlKCksIGF0IHRoZSBoZWFkCitvZiB0aGUgYmxvY2sgdGhhdCBoYW5kbGVzIG9kZCBpbWFnZSB3aWR0aCAoYWJvdXQgbGluZSAyNjggaW4gdjYgamRtZXJnZS5jKToKKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsgLyogQUREIFRISVMgKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CitQcmV0dHkgYml6YXJyZSwgZXNwZWNpYWxseSBzaW5jZSB0aGUgdmVyeSBzaW1pbGFyIHJvdXRpbmUgaDJ2Ml9tZXJnZWRfdXBzYW1wbGUKK2RvZXNuJ3QgdHJpZ2dlciB0aGUgYnVnLgorUmVjZW50IHJlcG9ydHMgc3VnZ2VzdCB0aGF0IHRoaXMgYnVnIGRvZXMgbm90IG9jY3VyIHdpdGggImJjYzMyYSIgKHRoZQorUGVudGl1bS1vcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIpLgorCitBbm90aGVyIHJlcG9ydCBmcm9tIGEgdXNlciBvZiBCb3JsYW5kIEMgNC41IHdhcyB0aGF0IGluY29ycmVjdCBjb2RlIChsZWFkaW5nCit0byBhIGNvbG9yIHNoaWZ0IGluIHByb2Nlc3NlZCBpbWFnZXMpIHdhcyBwcm9kdWNlZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZworb3B0aW1pemF0aW9uIHN3aXRjaCBjb21iaW5hdGlvbnMgd2VyZSB1c2VkOiAKKwktT3QgLU9nCisJLU90IC1PcAorCS1PdCAtT20KK1NvIHRyeSBiYWNraW5nIG9mZiBvbiBvcHRpbWl6YXRpb24gaWYgeW91IHNlZSBzdWNoIGEgcHJvYmxlbS4gIChBcmUgdGhlcmUKK3NldmVyYWwgZGlmZmVyZW50IHJlbGVhc2VzIGFsbCBudW1iZXJlZCAiNC41Ij8/KQorCisKK01pY3Jvc29mdCBXaW5kb3dzLCBNaWNyb3NvZnQgVmlzdWFsIEMrKzoKKworamNvbmZpZy52YyBzaG91bGQgd29yayBPSyB3aXRoIGFueSBNaWNyb3NvZnQgY29tcGlsZXIgZm9yIGEgMzItYml0IG1lbW9yeQorbW9kZWwuICBtYWtlZmlsZS52YyBpcyBpbnRlbmRlZCBmb3IgY29tbWFuZC1saW5lIHVzZS4gIChJZiB5b3UgYXJlIHVzaW5nCit0aGUgRGV2ZWxvcGVyIFN0dWRpbyBlbnZpcm9ubWVudCwgeW91IG1heSBwcmVmZXIgdGhlIERldlN0dWRpbyBwcm9qZWN0CitmaWxlczsgc2VlIGJlbG93LikKKworU29tZSB1c2VycyBmZWVsIHRoYXQgaXQncyBlYXNpZXIgdG8gY2FsbCB0aGUgbGlicmFyeSBmcm9tIEMrKyBjb2RlIGlmIHlvdQorZm9yY2UgVkMrKyB0byB0cmVhdCB0aGUgbGlicmFyeSBhcyBDKysgY29kZSwgd2hpY2ggeW91IGNhbiBkbyBieSByZW5hbWluZworYWxsIHRoZSAqLmMgZmlsZXMgdG8gKi5jcHAgKGFuZCBhZGp1c3RpbmcgdGhlIG1ha2VmaWxlIHRvIG1hdGNoKS4gIFRoaXMKK2F2b2lkcyB0aGUgbmVlZCB0byBwdXQgZXh0ZXJuICJDIiB7IC4uLiB9IGFyb3VuZCAjaW5jbHVkZSAianBlZ2xpYi5oIiBpbgoreW91ciBDKysgYXBwbGljYXRpb24uCisKKworTWljcm9zb2Z0IFdpbmRvd3MsIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvOgorCitXZSBpbmNsdWRlIG1ha2VmaWxlcyB0aGF0IHNob3VsZCB3b3JrIGFzIHByb2plY3QgZmlsZXMgaW4gRGV2U3R1ZGlvIDQuMiBvcgorbGF0ZXIuICBUaGVyZSBpcyBhIGxpYnJhcnkgbWFrZWZpbGUgdGhhdCBidWlsZHMgdGhlIElKRyBsaWJyYXJ5IGFzIGEgc3RhdGljCitXaW4zMiBsaWJyYXJ5LCBhbmQgYW4gYXBwbGljYXRpb24gbWFrZWZpbGUgdGhhdCBidWlsZHMgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMKK2FzIFdpbjMyIGNvbnNvbGUgYXBwbGljYXRpb25zLiAgKEV2ZW4gaWYgeW91IG9ubHkgd2FudCB0aGUgbGlicmFyeSwgd2UKK3JlY29tbWVuZCBidWlsZGluZyB0aGUgYXBwbGljYXRpb25zIHNvIHRoYXQgeW91IGNhbiBydW4gdGhlIHNlbGYtdGVzdC4pCisKK1RvIHVzZToKKzEuIENvcHkgamNvbmZpZy52YyB0byBqY29uZmlnLmgsIG1ha2VsaWIuZHMgdG8ganBlZy5tYWssIGFuZAorICAgbWFrZWFwcHMuZHMgdG8gYXBwcy5tYWsuICAoTm90ZSB0aGF0IHRoZSByZW5hbWluZyBpcyBjcml0aWNhbCEpCisyLiBDbGljayBvbiB0aGUgLm1hayBmaWxlcyB0byBjb25zdHJ1Y3QgcHJvamVjdCB3b3Jrc3BhY2VzLgorICAgKElmIHlvdSBhcmUgdXNpbmcgRGV2U3R1ZGlvIG1vcmUgcmVjZW50IHRoYW4gNC4yLCB5b3UnbGwgcHJvYmFibHkKKyAgIGdldCBhIG1lc3NhZ2Ugc2F5aW5nIHRoYXQgdGhlIG1ha2VmaWxlcyBhcmUgYmVpbmcgdXBkYXRlZC4pCiszLiBCdWlsZCB0aGUgbGlicmFyeSBwcm9qZWN0LCB0aGVuIHRoZSBhcHBsaWNhdGlvbnMgcHJvamVjdC4KKzQuIE1vdmUgdGhlIGFwcGxpY2F0aW9uIC5leGUgZmlsZXMgZnJvbSBgYXBwYFxSZWxlYXNlIHRvIGFuCisgICBhcHByb3ByaWF0ZSBsb2NhdGlvbiBvbiB5b3VyIHBhdGguCis1LiBUbyBwZXJmb3JtIHRoZSBzZWxmLXRlc3QsIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZQorCU5NQUtFIC9mIG1ha2VmaWxlLnZjICB0ZXN0CisKKworT1MvMiwgQm9ybGFuZCBDKys6CisKK1dhdGNoIG91dCBmb3Igb3B0aW1pemF0aW9uIGJ1Z3MgaW4gb2xkZXIgQm9ybGFuZCBjb21waWxlcnM7IHlvdSBtYXkgbmVlZAordG8gYmFjayBvZmYgdGhlIG9wdGltaXphdGlvbiBzd2l0Y2ggc2V0dGluZ3MuICBTZWUgdGhlIGNvbW1lbnRzIGluCittYWtlZmlsZS5iY2MuCisKKworU0dJOgorCitPbiBzb21lIFNHSSBzeXN0ZW1zLCB5b3UgbWF5IG5lZWQgdG8gc2V0ICJBUjI9IGFyIC10cyIgaW4gdGhlIE1ha2VmaWxlLgorSWYgeW91IGFyZSB1c2luZyBjb25maWd1cmUsIHlvdSBjYW4gZG8gdGhpcyBieSBzYXlpbmcKKwkuL2NvbmZpZ3VyZSBSQU5MSUI9J2FyIC10cycKK1RoaXMgY2hhbmdlIGlzIG5vdCBuZWVkZWQgb24gYWxsIFNHSXMuICBVc2UgaXQgb25seSBpZiB0aGUgbWFrZSBmYWlscyBhdCB0aGUKK3N0YWdlIG9mIGxpbmtpbmcgdGhlIGNvbXBsZXRlZCBwcm9ncmFtcy4KKworT24gdGhlIE1JUFMgUjQwMDAgYXJjaGl0ZWN0dXJlIChJbmR5LCBldGMuKSwgdGhlIGNvbXBpbGVyIG9wdGlvbiAiLW1pcHMyIgorcmVwb3J0ZWRseSBzcGVlZHMgdXAgdGhlIGZsb2F0IERDVCBtZXRob2Qgc3Vic3RhbnRpYWxseSwgZW5vdWdoIHRvIG1ha2UgaXQKK2Zhc3RlciB0aGFuIHRoZSBkZWZhdWx0IGludCBtZXRob2QgKGJ1dCBzdGlsbCBzbG93ZXIgdGhhbiB0aGUgZmFzdCBpbnQKK21ldGhvZCkuICBJZiB5b3UgdXNlIC1taXBzMiwgeW91IG1heSB3YW50IHRvIGFsdGVyIHRoZSBkZWZhdWx0IERDVCBtZXRob2QgdG8KK2JlIGZsb2F0LiAgVG8gZG8gdGhpcywgcHV0ICIjZGVmaW5lIEpEQ1RfREVGQVVMVCBKRENUX0ZMT0FUIiBpbiBqY29uZmlnLmguCisKKworVk1TOgorCitPbiBhbiBBbHBoYS9WTVMgc3lzdGVtIHdpdGggTU1TLCBiZSBzdXJlIHRvIHVzZSB0aGUgIi9NYXJjbz1BbHBoYT0xIgorcXVhbGlmaWVyIHdpdGggTU1TIHdoZW4gYnVpbGRpbmcgdGhlIEpQRUcgcGFja2FnZS4KKworVkFYL1ZNUyB2NS41LTEgbWF5IGhhdmUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdCBzdGVwIG9mIHRoZSBidWlsZCBwcm9jZWR1cmUKK3JlcG9ydGluZyBkaWZmZXJlbmNlcyB3aGVuIGl0IGNvbXBhcmVzIHRoZSBvcmlnaW5hbCBhbmQgdGVzdCBpbWFnZXMuICBJZiB0aGUKK2Vycm9yIHBvaW50cyB0byB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZXMsIGl0IGlzIG1vc3QgbGlrZWx5IGJvZ3VzIGFuZCBtYXkKK2JlIHNhZmVseSBpZ25vcmVkLiAgSXQgc2VlbXMgdG8gYmUgYmVjYXVzZSB0aGUgZmlsZXMgYXJlIFN0cmVhbV9MRiBhbmQKK0JhY2t1cC9Db21wYXJlIGhhcyBkaWZmaWN1bHR5IHdpdGggdGhlIChwcmVzdW1hYmx5KSBudWxsIHBhZGRlZCBmaWxlcy4KK1RoaXMgcHJvYmxlbSB3YXMgbm90IG9ic2VydmVkIG9uIFZBWC9WTVMgdjYuMSBvciBBWFAvVk1TIHY2LjEuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNhcGltaW4uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY2FwaW1pbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZmI4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNhcGltaW4uYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIGpjYXBpbWluLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKKyAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJtaW5pbXVtIiBBUEkgcm91dGluZXMgdGhhdCBtYXkgYmUKKyAqIG5lZWRlZCBpbiBlaXRoZXIgdGhlIG5vcm1hbCBmdWxsLWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlIHRyYW5zY29kaW5nLW9ubHkKKyAqIGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpjYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNwYXJhbS5jIGZvcgorICogcGFyYW1ldGVyLXNldHVwIGhlbHBlciByb3V0aW5lcywgamNvbWFwaS5jIGZvciByb3V0aW5lcyBzaGFyZWQgYnkKKyAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamN0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcgY2FzZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlQ29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpCit7CisgIGludCBpOworCisgIC8qIEd1YXJkIGFnYWluc3QgdmVyc2lvbiBtaXNtYXRjaGVzIGJldHdlZW4gbGlicmFyeSBhbmQgY2FsbGVyLiAqLworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIHNvIGpwZWdfZGVzdHJveSBrbm93cyBtZW0gbWdyIG5vdCBjYWxsZWQgKi8KKyAgaWYgKHZlcnNpb24gIT0gSlBFR19MSUJfVkVSU0lPTikKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfTElCX1ZFUlNJT04sIEpQRUdfTElCX1ZFUlNJT04sIHZlcnNpb24pOworICBpZiAoc3RydWN0c2l6ZSAhPSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOworCisgIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCisgICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAorICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KKyAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5CisgICAqIGNvbXBsYWluIGhlcmUuCisgICAqLworICB7CisgICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKKyAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KKyAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSk7CisgICAgY2luZm8tPmVyciA9IGVycjsKKyAgICBjaW5mby0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKKyAgfQorICBjaW5mby0+aXNfZGVjb21wcmVzc29yID0gRkFMU0U7CisKKyAgLyogSW5pdGlhbGl6ZSBhIG1lbW9yeSBtYW5hZ2VyIGluc3RhbmNlIGZvciB0aGlzIG9iamVjdCAqLworICBqaW5pdF9tZW1vcnlfbWdyKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBaZXJvIG91dCBwb2ludGVycyB0byBwZXJtYW5lbnQgc3RydWN0dXJlcy4gKi8KKyAgY2luZm8tPnByb2dyZXNzID0gTlVMTDsKKyAgY2luZm8tPmRlc3QgPSBOVUxMOworCisgIGNpbmZvLT5jb21wX2luZm8gPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQorICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgIH0KKworICBjaW5mby0+c2NyaXB0X3NwYWNlID0gTlVMTDsKKworICBjaW5mby0+aW5wdXRfZ2FtbWEgPSAxLjA7CS8qIGluIGNhc2UgYXBwbGljYXRpb24gZm9yZ2V0cyAqLworCisgIC8qIE9LLCBJJ20gcmVhZHkgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9TVEFSVDsKK30KKworCisvKgorICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdAorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19kZXN0cm95X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAganBlZ19kZXN0cm95KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwKKyAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydF9jb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KK30KKworCisvKgorICogRm9yY2libHkgc3VwcHJlc3Mgb3IgdW4tc3VwcHJlc3MgYWxsIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCisgKiBNYXJrcyBhbGwgY3VycmVudGx5IGRlZmluZWQgdGFibGVzIGFzIGFscmVhZHkgd3JpdHRlbiAoaWYgc3VwcHJlc3MpCisgKiBvciBub3Qgd3JpdHRlbiAoaWYgIXN1cHByZXNzKS4gIFRoaXMgd2lsbCBjb250cm9sIHdoZXRoZXIgdGhleSBnZXQgZW1pdHRlZAorICogYnkgYSBzdWJzZXF1ZW50IGpwZWdfc3RhcnRfY29tcHJlc3MgY2FsbC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZXhwb3J0ZWQgZm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHByb2R1Y2UKKyAqIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuICBJdCBsb2dpY2FsbHkgYmVsb25ncyBpbiBqY3BhcmFtLmMsIGJ1dAorICogc2luY2UgaXQgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MsIHdlIHB1dCBpdCBoZXJlIC0tLSBvdGhlcndpc2UKKyAqIGpjcGFyYW0ubyB3b3VsZCBiZSBsaW5rZWQgd2hldGhlciB0aGUgYXBwbGljYXRpb24gdXNlZCBpdCBvciBub3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N1cHByZXNzX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gc3VwcHJlc3MpCit7CisgIGludCBpOworICBKUVVBTlRfVEJMICogcXRibDsKKyAgSkhVRkZfVEJMICogaHRibDsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX1FVQU5UX1RCTFM7IGkrKykgeworICAgIGlmICgocXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIHF0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBpZiAoKGh0YmwgPSBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgICBpZiAoKGh0YmwgPSBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSkgIT0gTlVMTCkKKyAgICAgIGh0YmwtPnNlbnRfdGFibGUgPSBzdXBwcmVzczsKKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggSlBFRyBjb21wcmVzc2lvbi4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgbWF5IGRvIGEgZ3JlYXQgZGVhbCBvZgorICogd29yayBpbmNsdWRpbmcgbW9zdCBvZiB0aGUgYWN0dWFsIG91dHB1dC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmluaXNoX2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgSkRJTUVOU0lPTiBpTUNVX3JvdzsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfU0NBTk5JTkcgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gQ1NUQVRFX1JBV19PSykgeworICAgIC8qIFRlcm1pbmF0ZSBmaXJzdCBwYXNzICovCisgICAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lIDwgY2luZm8tPmltYWdlX2hlaWdodCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVE9PX0xJVFRMRV9EQVRBKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9wYXNzKSAoY2luZm8pOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgLyogUGVyZm9ybSBhbnkgcmVtYWluaW5nIHBhc3NlcyAqLworICB3aGlsZSAoISBjaW5mby0+bWFzdGVyLT5pc19sYXN0X3Bhc3MpIHsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX3Bhc3MpIChjaW5mbyk7CisgICAgZm9yIChpTUNVX3JvdyA9IDA7IGlNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsgaU1DVV9yb3crKykgeworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgaU1DVV9yb3c7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisgICAgICAvKiBXZSBieXBhc3MgdGhlIG1haW4gY29udHJvbGxlciBhbmQgaW52b2tlIGNvZWYgY29udHJvbGxlciBkaXJlY3RseTsKKyAgICAgICAqIGFsbCB3b3JrIGlzIGJlaW5nIGRvbmUgZnJvbSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLgorICAgICAgICovCisgICAgICBpZiAoISAoKmNpbmZvLT5jb2VmLT5jb21wcmVzc19kYXRhKSAoY2luZm8sIChKU0FNUElNQUdFKSBOVUxMKSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgICAgfQorICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisgIH0KKyAgLyogV3JpdGUgRU9JLCBkbyBmaW5hbCBjbGVhbnVwICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV90cmFpbGVyKSAoY2luZm8pOworICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgYSBzcGVjaWFsIG1hcmtlci4KKyAqIFRoaXMgaXMgb25seSByZWNvbW1lbmRlZCBmb3Igd3JpdGluZyBDT00gb3IgQVBQbiBtYXJrZXJzLgorICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIGFuZCBiZWZvcmUKKyAqIGZpcnN0IGNhbGwgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBvciBqcGVnX3dyaXRlX3Jhd19kYXRhKCkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJCSAgIGNvbnN0IEpPQ1RFVCAqZGF0YXB0ciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfbWFya2VyX2J5dGUsIChqX2NvbXByZXNzX3B0ciBpbmZvLCBpbnQgdmFsKSk7CisKKyAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKKyAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7CisgIHdyaXRlX21hcmtlcl9ieXRlID0gY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2J5dGU7CS8qIGNvcHkgZm9yIHNwZWVkICovCisgIHdoaWxlIChkYXRhbGVuLS0pIHsKKyAgICAoKndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sICpkYXRhcHRyKTsKKyAgICBkYXRhcHRyKys7CisgIH0KK30KKworLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX21faGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCit7CisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSAhPSAwIHx8CisgICAgICAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU0NBTk5JTkcgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9SQVdfT0sgJiYKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9XUkNPRUZTKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfbWFya2VyX2hlYWRlcikgKGNpbmZvLCBtYXJrZXIsIGRhdGFsZW4pOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfd3JpdGVfbV9ieXRlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHZhbCkKK3sKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZSkgKGNpbmZvLCB2YWwpOworfQorCisKKy8qCisgKiBBbHRlcm5hdGUgY29tcHJlc3Npb24gZnVuY3Rpb246IGp1c3Qgd3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUgZmlsZS4KKyAqIEJlZm9yZSBjYWxsaW5nIHRoaXMsIGFsbCBwYXJhbWV0ZXJzIGFuZCBhIGRhdGEgZGVzdGluYXRpb24gbXVzdCBiZSBzZXQgdXAuCisgKgorICogVG8gcHJvZHVjZSBhIHBhaXIgb2YgZmlsZXMgY29udGFpbmluZyBhYmJyZXZpYXRlZCB0YWJsZXMgYW5kIGFiYnJldmlhdGVkCisgKiBpbWFnZSBkYXRhLCBvbmUgd291bGQgcHJvY2VlZCBhcyBmb2xsb3dzOgorICoKKyAqCQlpbml0aWFsaXplIEpQRUcgb2JqZWN0CisgKgkJc2V0IEpQRUcgcGFyYW1ldGVycworICoJCXNldCBkZXN0aW5hdGlvbiB0byB0YWJsZSBmaWxlCisgKgkJanBlZ193cml0ZV90YWJsZXMoY2luZm8pOworICoJCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCisgKgkJanBlZ19zdGFydF9jb21wcmVzcyhjaW5mbywgRkFMU0UpOworICoJCXdyaXRlIGRhdGEuLi4KKyAqCQlqcGVnX2ZpbmlzaF9jb21wcmVzcyhjaW5mbyk7CisgKgorICoganBlZ193cml0ZV90YWJsZXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGFsbCB0YWJsZXMgd3JpdHRlbgorICogKHNhbWUgYXMganBlZ19zdXBwcmVzc190YWJsZXMoLi4uLCBUUlVFKSkuICBUaHVzIGEgc3Vic2VxdWVudCBzdGFydF9jb21wcmVzcworICogd2lsbCBub3QgcmUtZW1pdCB0aGUgdGFibGVzIHVubGVzcyBpdCBpcyBwYXNzZWQgd3JpdGVfYWxsX3RhYmxlcz1UUlVFLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ193cml0ZV90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiAoUmUpaW5pdGlhbGl6ZSBlcnJvciBtZ3IgYW5kIGRlc3RpbmF0aW9uIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPmRlc3QtPmluaXRfZGVzdGluYXRpb24pIChjaW5mbyk7CisgIC8qIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgLi4uIGJpdCBvZiBhIGNyb2NrIHRvIGRvIGl0IGhlcmUuICovCisgIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOworICAvKiBXcml0ZSB0aGVtIHRhYmxlcyEgKi8KKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV90YWJsZXNfb25seSkgKGNpbmZvKTsKKyAgLyogQW5kIGNsZWFuIHVwLiAqLworICAoKmNpbmZvLT5kZXN0LT50ZXJtX2Rlc3RpbmF0aW9uKSAoY2luZm8pOworICAvKgorICAgKiBJbiBsaWJyYXJ5IHJlbGVhc2VzIHVwIHRocm91Z2ggdjZhLCB3ZSBjYWxsZWQganBlZ19hYm9ydCgpIGhlcmUgdG8gZnJlZQorICAgKiBhbnkgd29ya2luZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBkZXN0aW5hdGlvbiBtYW5hZ2VyIGFuZCBtYXJrZXIKKyAgICogd3JpdGVyLiAgU29tZSBhcHBsaWNhdGlvbnMgaGFkIGEgcHJvYmxlbSB3aXRoIHRoYXQ6IHRoZXkgYWxsb2NhdGVkIHNwYWNlCisgICAqIG9mIHRoZWlyIG93biBmcm9tIHRoZSBsaWJyYXJ5IG1lbW9yeSBtYW5hZ2VyLCBhbmQgZGlkbid0IHdhbnQgaXQgdG8gZ28KKyAgICogYXdheSBkdXJpbmcgd3JpdGVfdGFibGVzLiAgU28gbm93IHdlIGRvIG5vdGhpbmcuICBUaGlzIHdpbGwgY2F1c2UgYQorICAgKiBtZW1vcnkgbGVhayBpZiBhbiBhcHAgY2FsbHMgd3JpdGVfdGFibGVzIHJlcGVhdGVkbHkgd2l0aG91dCBkb2luZyBhIGZ1bGwKKyAgICogY29tcHJlc3Npb24gY3ljbGUgb3Igb3RoZXJ3aXNlIHJlc2V0dGluZyB0aGUgSlBFRyBvYmplY3QuICBIb3dldmVyLCB0aGF0CisgICAqIHNlZW1zIGxlc3MgYmFkIHRoYW4gdW5leHBlY3RlZGx5IGZyZWVpbmcgbWVtb3J5IGluIHRoZSBub3JtYWwgY2FzZS4KKyAgICogQW4gYXBwIHRoYXQgcHJlZmVycyB0aGUgb2xkIGJlaGF2aW9yIGNhbiBjYWxsIGpwZWdfYWJvcnQgZm9yIGl0c2VsZiBhZnRlcgorICAgKiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV90YWJsZXMoKS4KKyAgICovCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNhcGlzdGQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY2FwaXN0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzIwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNhcGlzdGQuYwpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIGpjYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKKyAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCisgKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQorICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgorICoganBlZ19zdGFydF9jb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGNvbXByZXNzb3IuCisgKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamNhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQorICogd2hvbGUgY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgorICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KKyAqCisgKiBXZSByZXF1aXJlIGEgd3JpdGVfYWxsX3RhYmxlcyBwYXJhbWV0ZXIgYXMgYSBmYWlsc2FmZSBjaGVjayB3aGVuIHdyaXRpbmcKKyAqIG11bHRpcGxlIGRhdGFzdHJlYW1zIGZyb20gdGhlIHNhbWUgY29tcHJlc3Npb24gb2JqZWN0LiAgU2luY2UgcHJpb3IgcnVucworICogd2lsbCBoYXZlIGxlZnQgYWxsIHRoZSB0YWJsZXMgbWFya2VkIHNlbnRfdGFibGU9VFJVRSwgYSBzdWJzZXF1ZW50IHJ1bgorICogd291bGQgZW1pdCBhbiBhYmJyZXZpYXRlZCBzdHJlYW0gKG5vIHRhYmxlcykgYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGJlIHdoYXQKKyAqIGlzIHdhbnRlZCwgYnV0IGZvciBzYWZldHkncyBzYWtlIGl0IHNob3VsZCBub3QgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3I6CisgKiBwcm9ncmFtbWVycyBzaG91bGQgaGF2ZSB0byBtYWtlIGEgZGVsaWJlcmF0ZSBjaG9pY2UgdG8gZW1pdCBhYmJyZXZpYXRlZAorICogaW1hZ2VzLiAgVGhlcmVmb3JlIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBzaG91bGQgZW5jb3VyYWdlIHBlb3BsZQorICogdG8gcGFzcyB3cml0ZV9hbGxfdGFibGVzPVRSVUU7IHRoZW4gaXQgd2lsbCB0YWtlIGFjdGl2ZSB0aG91Z2h0IHRvIGRvIHRoZQorICogd3JvbmcgdGhpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0YXJ0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQoreworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICBpZiAod3JpdGVfYWxsX3RhYmxlcykKKyAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwkvKiBtYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLworCisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIGppbml0X2NvbXByZXNzX21hc3RlcihjaW5mbyk7CisgIC8qIFNldCB1cCBmb3IgdGhlIGZpcnN0IHBhc3MgKi8KKyAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOworICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgZmlyc3QgcGFzcyB0aHJvdWdoIGpwZWdfd3JpdGVfc2NhbmxpbmVzCisgICAqIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEuCisgICAqLworICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAoY2luZm8tPnJhd19kYXRhX2luID8gQ1NUQVRFX1JBV19PSyA6IENTVEFURV9TQ0FOTklORyk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgdG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSB3cml0dGVuLgorICogVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzdXBwbGllZCBudW1fbGluZXMgb25seSBpbiBjYXNlIHRoYXQKKyAqIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBoYXMgcmVxdWVzdGVkIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IsCisgKiBvciBpZiBtb3JlIHRoYW4gaW1hZ2VfaGVpZ2h0IHNjYW5saW5lcyBhcmUgcGFzc2VkIGluLgorICoKKyAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgc2luY2UKKyAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCisgKiBleGNlc3Mgc2NhbmxpbmVzIHBhc3NlZCBpbiB0aGUgbGFzdCB2YWxpZCBjYWxsIGFyZSAqc2lsZW50bHkqIGlnbm9yZWQsCisgKiBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBuZWVkIG5vdCBhZGp1c3QgbnVtX2xpbmVzIGZvciBlbmQtb2YtaW1hZ2UKKyAqIHdoZW4gdXNpbmcgYSBtdWx0aXBsZS1zY2FubGluZSBidWZmZXIuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3dyaXRlX3NjYW5saW5lcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAorCQkgICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiByb3dfY3RyLCByb3dzX2xlZnQ7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KQorICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCisgICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCisgICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgorICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcy4KKyAgICovCisgIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKKworICAvKiBJZ25vcmUgYW55IGV4dHJhIHNjYW5saW5lcyBhdCBib3R0b20gb2YgaW1hZ2UuICovCisgIHJvd3NfbGVmdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBjaW5mby0+bmV4dF9zY2FubGluZTsKKyAgaWYgKG51bV9saW5lcyA+IHJvd3NfbGVmdCkKKyAgICBudW1fbGluZXMgPSByb3dzX2xlZnQ7CisKKyAgcm93X2N0ciA9IDA7CisgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBudW1fbGluZXMpOworICBjaW5mby0+bmV4dF9zY2FubGluZSArPSByb3dfY3RyOworICByZXR1cm4gcm93X2N0cjsKK30KKworCisvKgorICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHdyaXRlIHJhdyBkYXRhLgorICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgorICovCisKK0dMT0JBTChKRElNRU5TSU9OKQoranBlZ193cml0ZV9yYXdfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKKwkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7CisKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkgeworICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKworICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KKyAgICoganBlZ193cml0ZV9yYXdfZGF0YS4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQorICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KKyAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9yYXdfZGF0YS4KKyAgICovCisgIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKKworICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgaGFzIGJlZW4gcGFzc2VkLiAqLworICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpZiAobnVtX2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOworCisgIC8qIERpcmVjdGx5IGNvbXByZXNzIHRoZSByb3cuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpIHsKKyAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCBzdXNwZW5kIHByb2Nlc3NpbmcuICovCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KKyAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OworICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjY29lZmN0LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNjb2VmY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTYzZGRiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjY29lZmN0LmMKQEAgLTAsMCArMSw0NDkgQEAKKy8qCisgKiBqY2NvZWZjdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBjb21wcmVzc2lvbi4KKyAqIFRoaXMgY29udHJvbGxlciBpcyB0aGUgdG9wIGxldmVsIG9mIHRoZSBKUEVHIGNvbXByZXNzb3IgcHJvcGVyLgorICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZm9yd2FyZC1EQ1QgYW5kIGVudHJvcHkgZW5jb2Rpbmcgc3RlcHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFdlIHVzZSBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIHdoZW4gZG9pbmcgSHVmZm1hbiBvcHRpbWl6YXRpb24sCisgKiBhbmQgYWxzbyBmb3Igd3JpdGluZyBtdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXMuICBJbiBhbGwgY2FzZXMsIHRoZSBEQ1QKKyAqIHN0ZXAgaXMgcnVuIGR1cmluZyB0aGUgZmlyc3QgcGFzcywgYW5kIHN1YnNlcXVlbnQgcGFzc2VzIG5lZWQgb25seSByZWFkCisgKiB0aGUgYnVmZmVyZWQgY29lZmZpY2llbnRzLgorICovCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisjZGVmaW5lIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisjZWxzZQorI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorI2VuZGlmCisjZW5kaWYKKworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBGb3Igc2luZ2xlLXBhc3MgY29tcHJlc3Npb24sIGl0J3Mgc3VmZmljaWVudCB0byBidWZmZXIganVzdCBvbmUgTUNVCisgICAqIChhbHRob3VnaCB0aGlzIG1heSBwcm92ZSBhIGJpdCBzbG93IGluIHByYWN0aWNlKS4gIFdlIGFsbG9jYXRlIGEKKyAgICogd29ya3NwYWNlIG9mIENfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLCBhbmQgcmV1c2UgaXQgZm9yIGVhY2gKKyAgICogTUNVIGNvbnN0cnVjdGVkIGFuZCBzZW50LiAgKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaAorICAgKiBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7IHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkCisgICAqIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudCBidWZmZXIgaXMgbmVjZXNzYXJ5LikKKyAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCisgICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXMuCisgICAqLworICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltDX01BWF9CTE9DS1NfSU5fTUNVXTsKKworICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOworfSBteV9jb2VmX2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfY29lZl9jb250cm9sbGVyICogbXlfY29lZl9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19kYXRhCisgICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX2ZpcnN0X3Bhc3MKKyAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworTUVUSE9EREVGKGJvb2xlYW4pIGNvbXByZXNzX291dHB1dAorICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGNvZWYtPmlNQ1Vfcm93X251bSA9IDA7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3NfZGF0YTsKKyAgICBicmVhazsKKyNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKKyAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2ZpcnN0X3Bhc3M7CisgICAgYnJlYWs7CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIGlmIChjb2VmLT53aG9sZV9pbWFnZVswXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGNvZWYtPnB1Yi5jb21wcmVzc19kYXRhID0gY29tcHJlc3Nfb3V0cHV0OworICAgIGJyZWFrOworI2VuZGlmCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgaW1hZ2UuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCisgKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2NvbXByZXNzX2RhdGEgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X01DVV9jb2wgPSBjaW5mby0+TUNVc19wZXJfcm93IC0gMTsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIGludCBibGtuLCBiaSwgY2ksIHlpbmRleCwgeW9mZnNldCwgYmxvY2tjbnQ7CisgIEpESU1FTlNJT04geXBvcywgeHBvczsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBMb29wIHRvIHdyaXRlIGFzIG11Y2ggYXMgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPD0gbGFzdF9NQ1VfY29sOworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBjb21lcyBmcm9tIGluIGlucHV0X2J1ZiBhbmQgZG8gdGhlIERDVCB0aGluZy4KKyAgICAgICAqIEVhY2ggY2FsbCBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzCisgICAgICAgKiBhcyB3aWRlIGFzIGFuIE1DVTsgd2UgcmVseSBvbiBoYXZpbmcgYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzCisgICAgICAgKiBzZXF1ZW50aWFsbHkuICBEdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlIGFyZSBmaWxsZWQgaW4KKyAgICAgICAqIHNwZWNpYWxseS4gIFRoZSBkYXRhIGluIHRoZW0gZG9lcyBub3QgbWF0dGVyIGZvciBpbWFnZSByZWNvbnN0cnVjdGlvbiwKKyAgICAgICAqIHNvIHdlIGZpbGwgdGhlbSB3aXRoIHZhbHVlcyB0aGF0IHdpbGwgZW5jb2RlIHRvIHRoZSBzbWFsbGVzdCBhbW91bnQgb2YKKyAgICAgICAqIGRhdGEsIHZpejogYWxsIHplcm9lcyBpbiB0aGUgQUMgZW50cmllcywgREMgZW50cmllcyBlcXVhbCB0byBwcmV2aW91cworICAgICAgICogYmxvY2sncyBEQyB2YWx1ZS4gIChUaGFua3MgdG8gVGhvbWFzIEtpbnNtYW4gZm9yIHRoaXMgaWRlYS4pCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwl4cG9zID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCXlwb3MgPSB5b2Zmc2V0ICogRENUU0laRTsgLyogeXBvcyA9PSAoeW9mZnNldCt5aW5kZXgpICogRENUU0laRSAqLworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKKwkJCQkJIGlucHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAorCQkJCQkgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKKwkJCQkJIHlwb3MsIHhwb3MsIChKRElNRU5TSU9OKSBibG9ja2NudCk7CisJICAgIGlmIChibG9ja2NudCA8IGNvbXBwdHItPk1DVV93aWR0aCkgeworCSAgICAgIC8qIENyZWF0ZSBzb21lIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCisJICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24gKyBibG9ja2NudF0sCisJCQkoY29tcHB0ci0+TUNVX3dpZHRoIC0gYmxvY2tjbnQpICogU0laRU9GKEpCTE9DSykpOworCSAgICAgIGZvciAoYmkgPSBibG9ja2NudDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKKwkJY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbitiaS0xXVswXVswXTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIC8qIENyZWF0ZSBhIHJvdyBvZiBkdW1teSBibG9ja3MgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisJICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuXSwKKwkJICAgICAgY29tcHB0ci0+TUNVX3dpZHRoICogU0laRU9GKEpCTE9DSykpOworCSAgICBmb3IgKGJpID0gMDsgYmkgPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IGJpKyspIHsKKwkgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmldWzBdWzBdID0gY29lZi0+TUNVX2J1ZmZlcltibGtuLTFdWzBdWzBdOworCSAgICB9CisJICB9CisJICBibGtuICs9IGNvbXBwdHItPk1DVV93aWR0aDsKKwkgIHlwb3MgKz0gRENUU0laRTsKKwl9CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gIEluIGV2ZW50IG9mIGEgc3VzcGVuc2lvbiBmYWlsdXJlLCB3ZSB3aWxsCisgICAgICAgKiByZS1EQ1QgdGhlIE1DVSBvbiByZXN0YXJ0IChhIGJpdCBpbmVmZmljaWVudCwgY291bGQgYmUgZml4ZWQuLi4pCisgICAgICAgKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+bWN1X2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY29lZi0+aU1DVV9yb3dfbnVtKys7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgZmlyc3QgcGFzcyBvZiBhIG11bHRpLXBhc3MgY2FzZS4KKyAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCisgKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgorICogVGhpcyBhbW91bnQgb2YgZGF0YSBpcyByZWFkIGZyb20gdGhlIHNvdXJjZSBidWZmZXIsIERDVCdkIGFuZCBxdWFudGl6ZWQsCisgKiBhbmQgc2F2ZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMuICBXZSBhbHNvIGdlbmVyYXRlIHN1aXRhYmxlIGR1bW15IGJsb2NrcworICogYXMgbmVlZGVkIGF0IHRoZSByaWdodCBhbmQgbG93ZXIgZWRnZXMuICAoVGhlIGR1bW15IGJsb2NrcyBhcmUgY29uc3RydWN0ZWQKKyAqIGluIHRoZSB2aXJ0dWFsIGFycmF5cywgd2hpY2ggaGF2ZSBiZWVuIHBhZGRlZCBhcHByb3ByaWF0ZWx5LikgIFRoaXMgbWFrZXMKKyAqIGl0IHBvc3NpYmxlIGZvciBzdWJzZXF1ZW50IHBhc3NlcyBub3QgdG8gd29ycnkgYWJvdXQgcmVhbCB2cy4gZHVtbXkgYmxvY2tzLgorICoKKyAqIFdlIG11c3QgYWxzbyBlbWl0IHRoZSBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIuICBUaGlzIGlzIGNvbnZlbmllbnRseQorICogZG9uZSBieSBjYWxsaW5nIGNvbXByZXNzX291dHB1dCgpIGFmdGVyIHdlJ3ZlIGxvYWRlZCB0aGUgY3VycmVudCBzdHJpcAorICogb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgorICoKKyAqIE5COiBpbnB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UuICBBbGwKKyAqIGNvbXBvbmVudHMgYXJlIERDVCdkIGFuZCBsb2FkZWQgaW50byB0aGUgdmlydHVhbCBhcnJheXMgaW4gdGhpcyBwYXNzLgorICogSG93ZXZlciwgaXQgbWF5IGJlIHRoYXQgb25seSBhIHN1YnNldCBvZiB0aGUgY29tcG9uZW50cyBhcmUgZW1pdHRlZCB0bworICogdGhlIGVudHJvcHkgZW5jb2RlciBkdXJpbmcgdGhpcyBmaXJzdCBwYXNzOyBiZSBjYXJlZnVsIGFib3V0IGxvb2tpbmcKKyAqIGF0IHRoZSBzY2FuLWRlcGVuZGVudCB2YXJpYWJsZXMgKE1DVSBkaW1lbnNpb25zLCBldGMpLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3NfZmlyc3RfcGFzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIEpESU1FTlNJT04gYmxvY2tzX2Fjcm9zcywgTUNVc19hY3Jvc3MsIE1DVWluZGV4OworICBpbnQgYmksIGNpLCBoX3NhbXBfZmFjdG9yLCBibG9ja19yb3csIGJsb2NrX3Jvd3MsIG5kdW1teTsKKyAgSkNPRUYgbGFzdERDOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyB0aGlzYmxvY2tyb3csIGxhc3RibG9ja3JvdzsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlciBmb3IgdGhpcyBjb21wb25lbnQuICovCisgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdykKKyAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UgeworICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZSwgc2luY2UgbWF5IG5vdCBiZSBzZXQhICovCisgICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICBibG9ja3NfYWNyb3NzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworICAgIGhfc2FtcF9mYWN0b3IgPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOworICAgIC8qIENvdW50IG51bWJlciBvZiBkdW1teSBibG9ja3MgdG8gYmUgYWRkZWQgYXQgdGhlIHJpZ2h0IG1hcmdpbi4gKi8KKyAgICBuZHVtbXkgPSAoaW50KSAoYmxvY2tzX2Fjcm9zcyAlIGhfc2FtcF9mYWN0b3IpOworICAgIGlmIChuZHVtbXkgPiAwKQorICAgICAgbmR1bW15ID0gaF9zYW1wX2ZhY3RvciAtIG5kdW1teTsKKyAgICAvKiBQZXJmb3JtIERDVCBmb3IgYWxsIG5vbi1kdW1teSBibG9ja3MgaW4gdGhpcyBpTUNVIHJvdy4gIEVhY2ggY2FsbAorICAgICAqIG9uIGZvcndhcmRfRENUIHByb2Nlc3NlcyBhIGNvbXBsZXRlIGhvcml6b250YWwgcm93IG9mIERDVCBibG9ja3MuCisgICAgICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107CisgICAgICAoKmNpbmZvLT5mZGN0LT5mb3J3YXJkX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkJCSAgIGlucHV0X2J1ZltjaV0sIHRoaXNibG9ja3JvdywKKwkJCQkgICAoSkRJTUVOU0lPTikgKGJsb2NrX3JvdyAqIERDVFNJWkUpLAorCQkJCSAgIChKRElNRU5TSU9OKSAwLCBibG9ja3NfYWNyb3NzKTsKKyAgICAgIGlmIChuZHVtbXkgPiAwKSB7CisJLyogQ3JlYXRlIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW1hZ2UuICovCisJdGhpc2Jsb2Nrcm93ICs9IGJsb2Nrc19hY3Jvc3M7IC8qID0+IGZpcnN0IGR1bW15IGJsb2NrICovCisJanplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csIG5kdW1teSAqIFNJWkVPRihKQkxPQ0spKTsKKwlsYXN0REMgPSB0aGlzYmxvY2tyb3dbLTFdWzBdOworCWZvciAoYmkgPSAwOyBiaSA8IG5kdW1teTsgYmkrKykgeworCSAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKKwl9CisgICAgICB9CisgICAgfQorICAgIC8qIElmIGF0IGVuZCBvZiBpbWFnZSwgY3JlYXRlIGR1bW15IGJsb2NrIHJvd3MgYXMgbmVlZGVkLgorICAgICAqIFRoZSB0cmlja3kgcGFydCBoZXJlIGlzIHRoYXQgd2l0aGluIGVhY2ggTUNVLCB3ZSB3YW50IHRoZSBEQyB2YWx1ZXMKKyAgICAgKiBvZiB0aGUgZHVtbXkgYmxvY2tzIHRvIG1hdGNoIHRoZSBsYXN0IHJlYWwgYmxvY2sncyBEQyB2YWx1ZS4KKyAgICAgKiBUaGlzIHNxdWVlemVzIGEgZmV3IG1vcmUgYnl0ZXMgb3V0IG9mIHRoZSByZXN1bHRpbmcgZmlsZS4uLgorICAgICAqLworICAgIGlmIChjb2VmLT5pTUNVX3Jvd19udW0gPT0gbGFzdF9pTUNVX3JvdykgeworICAgICAgYmxvY2tzX2Fjcm9zcyArPSBuZHVtbXk7CS8qIGluY2x1ZGUgbG93ZXIgcmlnaHQgY29ybmVyICovCisgICAgICBNQ1VzX2Fjcm9zcyA9IGJsb2Nrc19hY3Jvc3MgLyBoX3NhbXBfZmFjdG9yOworICAgICAgZm9yIChibG9ja19yb3cgPSBibG9ja19yb3dzOyBibG9ja19yb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworCSAgIGJsb2NrX3JvdysrKSB7CisJdGhpc2Jsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvd107CisJbGFzdGJsb2Nrcm93ID0gYnVmZmVyW2Jsb2NrX3Jvdy0xXTsKKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHRoaXNibG9ja3JvdywKKwkJICAoc2l6ZV90KSAoYmxvY2tzX2Fjcm9zcyAqIFNJWkVPRihKQkxPQ0spKSk7CisJZm9yIChNQ1VpbmRleCA9IDA7IE1DVWluZGV4IDwgTUNVc19hY3Jvc3M7IE1DVWluZGV4KyspIHsKKwkgIGxhc3REQyA9IGxhc3RibG9ja3Jvd1toX3NhbXBfZmFjdG9yLTFdWzBdOworCSAgZm9yIChiaSA9IDA7IGJpIDwgaF9zYW1wX2ZhY3RvcjsgYmkrKykgeworCSAgICB0aGlzYmxvY2tyb3dbYmldWzBdID0gbGFzdERDOworCSAgfQorCSAgdGhpc2Jsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7IC8qIGFkdmFuY2UgdG8gbmV4dCBNQ1UgaW4gcm93ICovCisJICBsYXN0YmxvY2tyb3cgKz0gaF9zYW1wX2ZhY3RvcjsKKwl9CisgICAgICB9CisgICAgfQorICB9CisgIC8qIE5COiBjb21wcmVzc19vdXRwdXQgd2lsbCBpbmNyZW1lbnQgaU1DVV9yb3dfbnVtIGlmIHN1Y2Nlc3NmdWwuCisgICAqIEEgc3VzcGVuc2lvbiByZXR1cm4gd2lsbCByZXN1bHQgaW4gcmVkb2luZyBhbGwgdGhlIHdvcmsgYWJvdmUgbmV4dCB0aW1lLgorICAgKi8KKworICAvKiBFbWl0IGRhdGEgdG8gdGhlIGVudHJvcHkgZW5jb2Rlciwgc2hhcmluZyBjb2RlIHdpdGggc3Vic2VxdWVudCBwYXNzZXMgKi8KKyAgcmV0dXJuIGNvbXByZXNzX291dHB1dChjaW5mbywgaW5wdXRfYnVmKTsKK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gc3Vic2VxdWVudCBwYXNzZXMgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCisgKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQorICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgorICogVGhlIGRhdGEgaXMgb2J0YWluZWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMgYW5kIGZlZCB0byB0aGUgZW50cm9weSBjb2Rlci4KKyAqIFJldHVybnMgVFJVRSBpZiB0aGUgaU1DVSByb3cgaXMgY29tcGxldGVkLCBGQUxTRSBpZiBzdXNwZW5kZWQuCisgKgorICogTkI6IGlucHV0X2J1ZiBpcyBpZ25vcmVkOyBpdCBpcyBsaWtlbHkgdG8gYmUgYSBOVUxMIHBvaW50ZXIuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitjb21wcmVzc19vdXRwdXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLgorICAgKiBOQjogZHVyaW5nIGZpcnN0IHBhc3MsIHRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UgdGhlIGJ1ZmZlcnMgd2lsbAorICAgKiBhbHJlYWR5IGJlIGFsaWduZWQgcHJvcGVybHksIHNvIGptZW1tZ3IuYyB3b24ndCBuZWVkIHRvIGRvIGFueSBJL08uCisgICAqLworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAorICAgICAgIGNvZWYtPmlNQ1Vfcm93X251bSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgfQorCisgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5tY3VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCisgICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisJZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgeworCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gd3JpdGUgdGhlIE1DVS4gKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmVuY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5tY3VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+bWN1X2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY29lZi0+aU1DVV9yb3dfbnVtKys7CisgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisKKyAgY29lZiA9IChteV9jb2VmX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKKyAgY29lZi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2NvZWY7CisKKyAgLyogQ3JlYXRlIHRoZSBjb2VmZmljaWVudCBidWZmZXIuICovCisgIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7CisjaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKKyAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCisgICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KKyAgICBpbnQgY2k7CisgICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgIH0KKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCisgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICBpbnQgaTsKKworICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ19NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7CisgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2ldID0gYnVmZmVyICsgaTsKKyAgICB9CisgICAgY29lZi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNjb2xvci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWUyNjJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjY29sb3IuYwpAQCAtMCwwICsxLDY0MSBAQAorLyoKKyAqIGpjY29sb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbiByb3V0aW5lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKy8vIHRoaXMgZW5hYmxlcyB1bnJvbGxpbmcgbnVsbF9jb252ZXJ0J3MgbG9vcCwgYW5kIHJlYWRpbmcvd3JpdGUgaW50cyBmb3Igc3BlZWQKKyNkZWZpbmUgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFByaXZhdGUgc3RhdGUgZm9yIFJHQi0+WUNDIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsJCS8qID0+IHRhYmxlIGZvciBSR0IgdG8gWUNiQ3IgY29udmVyc2lvbiAqLworfSBteV9jb2xvcl9jb252ZXJ0ZXI7CisKK3R5cGVkZWYgbXlfY29sb3JfY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKy8qKioqKioqKioqKioqKioqIFJHQiAtPiBZQ2JDciBjb252ZXJzaW9uOiBtb3N0IGNvbW1vbiBjYXNlICoqKioqKioqKioqKioqLworCisvKgorICogWUNiQ3IgaXMgZGVmaW5lZCBwZXIgQ0NJUiA2MDEtMSwgZXhjZXB0IHRoYXQgQ2IgYW5kIENyIGFyZQorICogbm9ybWFsaXplZCB0byB0aGUgcmFuZ2UgMC4uTUFYSlNBTVBMRSByYXRoZXIgdGhhbiAtMC41IC4uIDAuNS4KKyAqIFRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucyB0byBiZSBpbXBsZW1lbnRlZCBhcmUgdGhlcmVmb3JlCisgKglZICA9ICAwLjI5OTAwICogUiArIDAuNTg3MDAgKiBHICsgMC4xMTQwMCAqIEIKKyAqCUNiID0gLTAuMTY4NzQgKiBSIC0gMC4zMzEyNiAqIEcgKyAwLjUwMDAwICogQiAgKyBDRU5URVJKU0FNUExFCisgKglDciA9ICAwLjUwMDAwICogUiAtIDAuNDE4NjkgKiBHIC0gMC4wODEzMSAqIEIgICsgQ0VOVEVSSlNBTVBMRQorICogKFRoZXNlIG51bWJlcnMgYXJlIGRlcml2ZWQgZnJvbSBUSUZGIDYuMCBzZWN0aW9uIDIxLCBkYXRlZCAzLUp1bmUtOTIuKQorICogTm90ZTogb2xkZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlIHVzZWQgYSB6ZXJvIG9mZnNldCBvZiBNQVhKU0FNUExFLzIsCisgKiByYXRoZXIgdGhhbiBDRU5URVJKU0FNUExFLCBmb3IgQ2IgYW5kIENyLiAgVGhpcyBnYXZlIGVxdWFsIHBvc2l0aXZlIGFuZAorICogbmVnYXRpdmUgc3dpbmdzIGZvciBDYi9DciwgYnV0IG1lYW50IHRoYXQgZ3JheXNjYWxlIHZhbHVlcyAoQ2I9Q3I9MCkKKyAqIHdlcmUgbm90IHJlcHJlc2VudGVkIGV4YWN0bHkuICBOb3cgd2Ugc2FjcmlmaWNlIGV4YWN0IHJlcHJlc2VudGF0aW9uIG9mCisgKiBtYXhpbXVtIHJlZCBhbmQgbWF4aW11bSBibHVlIGluIG9yZGVyIHRvIGdldCBleGFjdCBncmF5c2NhbGVzLgorICoKKyAqIFRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHdlIHJlcHJlc2VudCB0aGUgZnJhY3Rpb25hbCBjb25zdGFudHMKKyAqIGFzIGludGVnZXJzIHNjYWxlZCB1cCBieSAyXjE2IChhYm91dCA0IGRpZ2l0cyBwcmVjaXNpb24pOyB3ZSBoYXZlIHRvIGRpdmlkZQorICogdGhlIHByb2R1Y3RzIGJ5IDJeMTYsIHdpdGggYXBwcm9wcmlhdGUgcm91bmRpbmcsIHRvIGdldCB0aGUgY29ycmVjdCBhbnN3ZXIuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBSLEcsQiBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcyB0aGlzIGlzIHZlcnkgcmVhc29uYWJsZSAob25seSAyNTYgZW50cmllcyBwZXIgdGFibGUpOworICogZm9yIDEyLWJpdCBzYW1wbGVzIGl0IGlzIHN0aWxsIGFjY2VwdGFibGUuICBJdCdzIG5vdCB2ZXJ5IHJlYXNvbmFibGUgZm9yCisgKiAxNi1iaXQgc2FtcGxlcywgYnV0IGlmIHlvdSB3YW50IGxvc3NsZXNzIHN0b3JhZ2UgeW91IHNob3VsZG4ndCBiZSBjaGFuZ2luZworICogY29sb3JzcGFjZSBhbnl3YXkuCisgKiBUaGUgQ0VOVEVSSlNBTVBMRSBvZmZzZXRzIGFuZCB0aGUgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNSBhcmUgaW5jbHVkZWQKKyAqIGluIHRoZSB0YWJsZXMgdG8gc2F2ZSBhZGRpbmcgdGhlbSBzZXBhcmF0ZWx5IGluIHRoZSBpbm5lciBsb29wLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIENCQ1JfT0ZGU0VUCSgoSU5UMzIpIENFTlRFUkpTQU1QTEUgPDwgU0NBTEVCSVRTKQorI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKy8qIFdlIGFsbG9jYXRlIG9uZSBiaWcgdGFibGUgYW5kIGRpdmlkZSBpdCB1cCBpbnRvIGVpZ2h0IHBhcnRzLCBpbnN0ZWFkIG9mCisgKiBkb2luZyBlaWdodCBhbGxvY19zbWFsbCByZXF1ZXN0cy4gIFRoaXMgbGV0cyB1cyB1c2UgYSBzaW5nbGUgdGFibGUgYmFzZQorICogYWRkcmVzcywgd2hpY2ggY2FuIGJlIGhlbGQgaW4gYSByZWdpc3RlciBpbiB0aGUgaW5uZXIgbG9vcHMgb24gbWFueQorICogbWFjaGluZXMgKG1vcmUgdGhhbiBjYW4gaG9sZCBhbGwgZWlnaHQgYWRkcmVzc2VzLCBhbnl3YXkpLgorICovCisKKyNkZWZpbmUgUl9ZX09GRgkJMAkJCS8qIG9mZnNldCB0byBSID0+IFkgc2VjdGlvbiAqLworI2RlZmluZSBHX1lfT0ZGCQkoMSooTUFYSlNBTVBMRSsxKSkJLyogb2Zmc2V0IHRvIEcgPT4gWSBzZWN0aW9uICovCisjZGVmaW5lIEJfWV9PRkYJCSgyKihNQVhKU0FNUExFKzEpKQkvKiBldGMuICovCisjZGVmaW5lIFJfQ0JfT0ZGCSgzKihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBHX0NCX09GRgkoNCooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgQl9DQl9PRkYJKDUqKE1BWEpTQU1QTEUrMSkpCisjZGVmaW5lIFJfQ1JfT0ZGCUJfQ0JfT0ZGCQkvKiBCPT5DYiwgUj0+Q3IgYXJlIHRoZSBzYW1lICovCisjZGVmaW5lIEdfQ1JfT0ZGCSg2KihNQVhKU0FNUExFKzEpKQorI2RlZmluZSBCX0NSX09GRgkoNyooTUFYSlNBTVBMRSsxKSkKKyNkZWZpbmUgVEFCTEVfU0laRQkoOCooTUFYSlNBTVBMRSsxKSkKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgUkdCLT5ZQ0MgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19zdGFydCAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgSU5UMzIgKiByZ2JfeWNjX3RhYjsKKyAgSU5UMzIgaTsKKworICAvKiBBbGxvY2F0ZSBhbmQgZmlsbCBpbiB0aGUgY29udmVyc2lvbiB0YWJsZXMuICovCisgIGNjb252ZXJ0LT5yZ2JfeWNjX3RhYiA9IHJnYl95Y2NfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkoVEFCTEVfU0laRSAqIFNJWkVPRihJTlQzMikpKTsKKworICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykgeworICAgIHJnYl95Y2NfdGFiW2krUl9ZX09GRl0gPSBGSVgoMC4yOTkwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krR19ZX09GRl0gPSBGSVgoMC41ODcwMCkgKiBpOworICAgIHJnYl95Y2NfdGFiW2krQl9ZX09GRl0gPSBGSVgoMC4xMTQwMCkgKiBpICAgICArIE9ORV9IQUxGOworICAgIHJnYl95Y2NfdGFiW2krUl9DQl9PRkZdID0gKC1GSVgoMC4xNjg3NCkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0dfQ0JfT0ZGXSA9ICgtRklYKDAuMzMxMjYpKSAqIGk7CisgICAgLyogV2UgdXNlIGEgcm91bmRpbmcgZnVkZ2UtZmFjdG9yIG9mIDAuNS1lcHNpbG9uIGZvciBDYiBhbmQgQ3IuCisgICAgICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG1heGltdW0gb3V0cHV0IHdpbGwgcm91bmQgdG8gTUFYSlNBTVBMRQorICAgICAqIG5vdCBNQVhKU0FNUExFKzEsIGFuZCB0aHVzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByYW5nZS1saW1pdC4KKyAgICAgKi8KKyAgICByZ2JfeWNjX3RhYltpK0JfQ0JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisvKiAgQj0+Q2IgYW5kIFI9PkNyIHRhYmxlcyBhcmUgdGhlIHNhbWUKKyAgICByZ2JfeWNjX3RhYltpK1JfQ1JfT0ZGXSA9IEZJWCgwLjUwMDAwKSAqIGkgICAgKyBDQkNSX09GRlNFVCArIE9ORV9IQUxGLTE7CisqLworICAgIHJnYl95Y2NfdGFiW2krR19DUl9PRkZdID0gKC1GSVgoMC40MTg2OSkpICogaTsKKyAgICByZ2JfeWNjX3RhYltpK0JfQ1JfT0ZGXSA9ICgtRklYKDAuMDgxMzEpKSAqIGk7CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQKKyAqIHRvIG91ciBpbnRlcm5hbCBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0LgorICogVGhlIGlucHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMgYXMgd2lkZSBhcyB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBBIHN0YXJ0aW5nIHJvdyBvZmZzZXQgaXMgcHJvdmlkZWQgb25seSBmb3IgdGhlIG91dHB1dCBidWZmZXIuICBUaGUgY2FsbGVyCisgKiBjYW4gZWFzaWx5IGFkanVzdCB0aGUgcGFzc2VkIGlucHV0X2J1ZiB2YWx1ZSB0byBhY2NvbW1vZGF0ZSBhbnkgcm93CisgKiBvZmZzZXQgcmVxdWlyZWQgb24gdGhhdCBzaWRlLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmdiX3ljY19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgciwgZywgYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0cjAgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdW291dHB1dF9yb3ddOworICAgIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgciA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX1JFRF0pOworICAgICAgZyA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0dSRUVOXSk7CisgICAgICBiID0gR0VUSlNBTVBMRShpbnB0cltSR0JfQkxVRV0pOworICAgICAgaW5wdHIgKz0gUkdCX1BJWEVMU0laRTsKKyAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucworICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KKyAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKKyAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCisgICAgICAgKi8KKyAgICAgIC8qIFkgKi8KKyAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDYiAqLworICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICAgIC8qIENyICovCisgICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgQU5EUk9JRF9SR0IKKy8qIENvbnZlcnRzIFJHQjU2NSByb3cgaW50byBZQ2JDciAqLworTUVUSE9EREVGKHZvaWQpCityZ2I1NjVfeWNjX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCByLCBnLCBiOworICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIHNob3J0KiBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKHVuc2lnbmVkIHNob3J0KikoKmlucHV0X2J1ZisrKTsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIHNob3J0IGNvbG9yID0gaW5wdHJbY29sXTsKKyAgICAgIHIgPSAoKGNvbG9yICYgMHhmODAwKSA+PiA4KSB8ICgoY29sb3IgJiAweGY4MDApID4+IDE0KTsKKyAgICAgIGcgPSAoKGNvbG9yICYgMHg3ZTApID4+IDMpIHwgKChjb2xvciAmIDB4N2UwKSA+PiA5KTsKKyAgICAgIGIgPSAoKGNvbG9yICYgMHgxZikgPDwgMykgfCAoKGNvbG9yICYgMHgxZikgPj4gMik7CisgICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKKyAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCisgICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgorICAgICAgICovCisgICAgICAvKiBZICovCisgICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ2IgKi8KKyAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDciAqLworICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworLyogQ29udmVydHMgUkdCQTg4ODggcm93IGludG8gWUNiQ3IgKi8KK01FVEhPRERFRih2b2lkKQorcmdiYTg4ODhfeWNjX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkJIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCByLCBnLCBiOworICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7CisgIHJlZ2lzdGVyIElOVDMyKiBpbnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMSwgb3V0cHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKElOVDMyKikoKmlucHV0X2J1ZisrKTsKKyAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKKyAgICBvdXRwdXRfcm93Kys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGNvbG9yID0gKHVuc2lnbmVkIGNoYXIqKShpbnB0ciArIGNvbCk7CisgICAgICByID0gKCpjb2xvcikgJiAweGZmOyBjb2xvcisrOworICAgICAgZyA9ICgqY29sb3IpICYgMHhmZjsgY29sb3IrKzsKKyAgICAgIGIgPSAoKmNvbG9yKSAmIDB4ZmY7IGNvbG9yKys7CisgICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKKyAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCisgICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgorICAgICAgICovCisgICAgICAvKiBZICovCisgICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ2IgKi8KKyAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDciAqLworICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKyNlbmRpZiAgLyogQU5EUk9JRF9SR0IgKi8KKworLyoqKioqKioqKioqKioqKiogQ2FzZXMgb3RoZXIgdGhhbiBSR0IgLT4gWUNiQ3IgKioqKioqKioqKioqKiovCisKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIFJHQi0+Z3JheXNjYWxlIGNvbnZlcnNpb24sIHdoaWNoIGlzIHRoZSBzYW1lCisgKiBhcyB0aGUgUkdCLT5ZIHBvcnRpb24gb2YgUkdCLT5ZQ2JDci4KKyAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZCAod2Ugb25seSB1c2UgdGhlIFkgdGFibGVzKS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JnYl9ncmF5X2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7CisgIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyID0gKmlucHV0X2J1ZisrOworICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgb3V0cHV0X3JvdysrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICByID0gR0VUSlNBTVBMRShpbnB0cltSR0JfUkVEXSk7CisgICAgICBnID0gR0VUSlNBTVBMRShpbnB0cltSR0JfR1JFRU5dKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9CTFVFXSk7CisgICAgICBpbnB0ciArPSBSR0JfUElYRUxTSVpFOworICAgICAgLyogWSAqLworICAgICAgb3V0cHRyW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBBZG9iZS1zdHlsZSBDTVlLLT5ZQ0NLIGNvbnZlcnNpb24sCisgKiB3aGVyZSB3ZSBjb252ZXJ0IFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHRvIFlDYkNyIHVzaW5nIHRoZSBzYW1lCisgKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCisgKiBXZSBhc3N1bWUgcmdiX3ljY19zdGFydCBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitjbXlrX3ljY2tfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCisJCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCByLCBnLCBiOworICByZWdpc3RlciBJTlQzMiAqIGN0YWIgPSBjY29udmVydC0+cmdiX3ljY190YWI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxLCBvdXRwdHIyLCBvdXRwdHIzOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7CisgICAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107CisgICAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107CisgICAgb3V0cHRyMiA9IG91dHB1dF9idWZbMl1bb3V0cHV0X3Jvd107CisgICAgb3V0cHRyMyA9IG91dHB1dF9idWZbM11bb3V0cHV0X3Jvd107CisgICAgb3V0cHV0X3JvdysrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICByID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMF0pOworICAgICAgZyA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzFdKTsKKyAgICAgIGIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clsyXSk7CisgICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIGFzLWlzICovCisgICAgICBvdXRwdHIzW2NvbF0gPSBpbnB0clszXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFIGhlcmUgKi8KKyAgICAgIGlucHRyICs9IDQ7CisgICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKKyAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCisgICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0CisgICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgorICAgICAgICovCisgICAgICAvKiBZICovCisgICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKKwkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCisJCSA+PiBTQ0FMRUJJVFMpOworICAgICAgLyogQ2IgKi8KKyAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQorCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKKwkJID4+IFNDQUxFQklUUyk7CisgICAgICAvKiBDciAqLworICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCisJCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQorCQkgPj4gU0NBTEVCSVRTKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgZ3JheXNjYWxlIG91dHB1dCB3aXRoIG5vIGNvbnZlcnNpb24uCisgKiBUaGUgc291cmNlIGNhbiBiZSBlaXRoZXIgcGxhaW4gZ3JheXNjYWxlIG9yIFlDYkNyIChzaW5jZSBZID09IGdyYXkpLgorICovCisKK01FVEhPRERFRih2b2lkKQorZ3JheXNjYWxlX2NvbnZlcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7CisgIGludCBpbnN0cmlkZSA9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdW291dHB1dF9yb3ddOworICAgIG91dHB1dF9yb3crKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgb3V0cHRyW2NvbF0gPSBpbnB0clswXTsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgaW5wdHIgKz0gaW5zdHJpZGU7CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBFTkFCTEVfQU5EUk9JRF9OVUxMX0NPTlZFUlQKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVJTlQzMjsKKworI2RlZmluZSBCMChuKSAgICgobikgJiAweEZGKQorI2RlZmluZSBCMShuKSAgICgoKG4pID4+IDgpICYgMHhGRikKKyNkZWZpbmUgQjIobikgICAoKChuKSA+PiAxNikgJiAweEZGKQorI2RlZmluZSBCMyhuKSAgICgobikgPj4gMjQpCisKKyNkZWZpbmUgUEFDSyhhLCBiLCBjLCBkKSAgICAoKGEpIHwgKChiKSA8PCA4KSB8ICgoYykgPDwgMTYpIHwgKChkKSA8PCAyNCkpCisKK3N0YXRpYyBpbnQgcHRyX2lzX3F1YWQoY29uc3Qgdm9pZCogcCkKK3sKKyAgICByZXR1cm4gKCgoY29uc3QgY2hhciopcCAtIChjb25zdCBjaGFyKikwKSAmIDMpID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlxdWFkcyhjb25zdCBVSU5UMzIgaW5bXSwgVUlOVDMyIG91dDBbXSwgVUlOVDMyIG91dDFbXSwgVUlOVDMyIG91dDJbXSwgaW50IGNvbDQpCit7CisgICAgZG8geworICAgICAgICBVSU5UMzIgc3JjMCA9ICppbisrOworICAgICAgICBVSU5UMzIgc3JjMSA9ICppbisrOworICAgICAgICBVSU5UMzIgc3JjMiA9ICppbisrOworICAgICAgICAvLyBMRW5kaWFuCisgICAgICAgICpvdXQwKysgPSBQQUNLKEIwKHNyYzApLCBCMyhzcmMwKSwgQjIoc3JjMSksIEIxKHNyYzIpKTsKKyAgICAgICAgKm91dDErKyA9IFBBQ0soQjEoc3JjMCksIEIwKHNyYzEpLCBCMyhzcmMxKSwgQjIoc3JjMikpOworICAgICAgICAqb3V0MisrID0gUEFDSyhCMihzcmMwKSwgQjEoc3JjMSksIEIwKHNyYzIpLCBCMyhzcmMyKSk7CisgICAgfSB3aGlsZSAoLS1jb2w0ICE9IDApOworfQorCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIG11bHRpLWNvbXBvbmVudCBjb2xvcnNwYWNlcyB3aXRob3V0IGNvbnZlcnNpb24uCisgKiBXZSBhc3N1bWUgaW5wdXRfY29tcG9uZW50cyA9PSBudW1fY29tcG9uZW50cy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJICAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKKwkgICAgICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIHJlZ2lzdGVyIGludCBjaTsKKyAgaW50IG5jID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOworCisjaWZkZWYgRU5BQkxFX0FORFJPSURfTlVMTF9DT05WRVJUCisgICAgaWYgKDEgPT0gbnVtX3Jvd3MgJiYgMyA9PSBuYyAmJiBudW1fY29scyA+IDApIHsKKyAgICAgICAgSlNBTVBST1cgaW5wdHIgPSAqaW5wdXRfYnVmOworICAgICAgICBKU0FNUFJPVyBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKKyAgICAgICAgSlNBTVBST1cgb3V0cHRyMSA9IG91dHB1dF9idWZbMV1bb3V0cHV0X3Jvd107CisgICAgICAgIEpTQU1QUk9XIG91dHB0cjIgPSBvdXRwdXRfYnVmWzJdW291dHB1dF9yb3ddOworCisgICAgICAgIGludCBjb2wgPSBudW1fY29sczsKKyAgICAgICAgaW50IGNvbDQgPSBjb2wgPj4gMjsKKyAgICAgICAgaWYgKGNvbDQgPiAwICYmIHB0cl9pc19xdWFkKGlucHRyKSAmJiBwdHJfaXNfcXVhZChvdXRwdHIwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2lzX3F1YWQob3V0cHRyMSkgJiYgcHRyX2lzX3F1YWQob3V0cHRyMikpIHsKKworICAgICAgICAgICAgY29uc3QgVUlOVDMyKiBpbiA9IChjb25zdCBVSU5UMzIqKWlucHRyOworICAgICAgICAgICAgVUlOVDMyKiBvdXQwID0gKFVJTlQzMiopb3V0cHRyMDsKKyAgICAgICAgICAgIFVJTlQzMiogb3V0MSA9IChVSU5UMzIqKW91dHB0cjE7CisgICAgICAgICAgICBVSU5UMzIqIG91dDIgPSAoVUlOVDMyKilvdXRwdHIyOworICAgICAgICAgICAgY29weXF1YWRzKGluLCBvdXQwLCBvdXQxLCBvdXQyLCBjb2w0KTsKKyAgICAgICAgICAgIGNvbCAmPSAzOworICAgICAgICAgICAgaWYgKDAgPT0gY29sKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNvbDQgPDw9IDI7CisgICAgICAgICAgICBpbnB0ciArPSBjb2w0ICogMzsgIC8qIHdlIHJlYWQgdGhpcyAzIHRpbWVzIHBlciBpbiBjb3B5cXVhZHMgKi8KKyAgICAgICAgICAgIG91dHB0cjAgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjEgKz0gY29sNDsKKyAgICAgICAgICAgIG91dHB0cjIgKz0gY29sNDsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byB3aGlsZS1sb29wICovCisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgKm91dHB0cjArKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjErKyA9ICppbnB0cisrOworICAgICAgICAgICAgKm91dHB0cjIrKyA9ICppbnB0cisrOworICAgICAgICB9IHdoaWxlICgtLWNvbCAhPSAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK1NMT1c6CisjZW5kaWYKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB0ciA9ICppbnB1dF9idWY7CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisJb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKwlpbnB0ciArPSBuYzsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfYnVmKys7CisgICAgb3V0cHV0X3JvdysrOworICB9Cit9CisKKworLyoKKyAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK251bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBuZWVkZWQgKi8KK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKworICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7CisgIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOworCisgIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyNpZiBSR0JfUElYRUxTSVpFICE9IDMKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCisKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICBjYXNlIEpDU19ZQ0NLOgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyNpZmRlZiBBTkRST0lEX1JHQgorICBjYXNlIEpDU19SR0JfNTY1OgorICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSAyKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1JHQkFfODg4ODoKKyAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworI2VuZGlmICAvKiBBTkRST0lEX1JHQiAqLworCisgIGRlZmF1bHQ6CQkJLyogSkNTX1VOS05PV04gY2FuIGJlIGFueXRoaW5nICovCisgICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDwgMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworICB9CisKKyAgLyogQ2hlY2sgbnVtX2NvbXBvbmVudHMsIHNldCBjb252ZXJzaW9uIG1ldGhvZCBiYXNlZCBvbiByZXF1ZXN0ZWQgc3BhY2UgKi8KKyAgc3dpdGNoIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKKyAgICBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9ncmF5X2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQorICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7CisgICAgZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiAmJiBSR0JfUElYRUxTSVpFID09IDMpCisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX3ljY19jb252ZXJ0OworICAgIH0gZWxzZSBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OworICAgIH0KKyNpZmRlZiBBTkRST0lEX1JHQgorICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCXzU2NSkgeworICAgICAgY2NvbnZlcnQtPnB1Yi5zdGFydF9wYXNzID0gcmdiX3ljY19zdGFydDsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYjU2NV95Y2NfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCQV84ODg4KSB7CisgICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiYTg4ODhfeWNjX2NvbnZlcnQ7CisgICAgfQorI2VuZGlmICAvKiBBTkRST0lEX1JHQiAqLworICAgIGVsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICBicmVhazsKKworICBjYXNlIEpDU19DTVlLOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8CisJY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICBicmVhazsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjZGN0bWdyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNkY3RtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWZhNzliCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjZGN0bWdyLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBqY2RjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZvcndhcmQtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgRENUIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQsCisgKiBhbmQgaXQgcGVyZm9ybXMgcmVsYXRlZCBob3VzZWtlZXBpbmcgY2hvcmVzIGluY2x1ZGluZyBjb2VmZmljaWVudAorICogcXVhbnRpemF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gdGhlIERDVCByb3V0aW5lIGFjdHVhbGx5IGluIHVzZSAqLworICBmb3J3YXJkX0RDVF9tZXRob2RfcHRyIGRvX2RjdDsKKworICAvKiBUaGUgYWN0dWFsIHBvc3QtRENUIGRpdmlzb3JzIC0tLSBub3QgaWRlbnRpY2FsIHRvIHRoZSBxdWFudCB0YWJsZQorICAgKiBlbnRyaWVzLCBiZWNhdXNlIG9mIHNjYWxpbmcgKGVzcGVjaWFsbHkgZm9yIGFuIHVubm9ybWFsaXplZCBEQ1QpLgorICAgKiBFYWNoIHRhYmxlIGlzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4KKyAgICovCisgIERDVEVMRU0gKiBkaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgIC8qIFNhbWUgYXMgYWJvdmUgZm9yIHRoZSBmbG9hdGluZy1wb2ludCBjYXNlLiAqLworICBmbG9hdF9EQ1RfbWV0aG9kX3B0ciBkb19mbG9hdF9kY3Q7CisgIEZBU1RfRkxPQVQgKiBmbG9hdF9kaXZpc29yc1tOVU1fUVVBTlRfVEJMU107CisjZW5kaWYKK30gbXlfZmRjdF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2ZkY3RfY29udHJvbGxlciAqIG15X2ZkY3RfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KKyAqIFZlcmlmeSB0aGF0IGFsbCByZWZlcmVuY2VkIFEtdGFibGVzIGFyZSBwcmVzZW50LCBhbmQgc2V0IHVwCisgKiB0aGUgZGl2aXNvciB0YWJsZSBmb3IgZWFjaCBvbmUuCisgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgRENUIG9mIGFsbCBjb21wb25lbnRzIGlzIGRvbmUgZHVyaW5nCisgKiB0aGUgZmlyc3QgcGFzcywgZXZlbiBpZiBvbmx5IHNvbWUgY29tcG9uZW50cyB3aWxsIGJlIG91dHB1dCBpbiB0aGUKKyAqIGZpcnN0IHNjYW4uICBIZW5jZSBhbGwgY29tcG9uZW50cyBzaG91bGQgYmUgZXhhbWluZWQgaGVyZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3NfZmRjdG1nciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2ZkY3RfcHRyIGZkY3QgPSAobXlfZmRjdF9wdHIpIGNpbmZvLT5mZGN0OworICBpbnQgY2ksIHF0YmxubywgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisgIERDVEVMRU0gKiBkdGJsOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcXRibG5vID0gY29tcHB0ci0+cXVhbnRfdGJsX25vOworICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgcXRibCA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dOworICAgIC8qIENvbXB1dGUgZGl2aXNvcnMgZm9yIHRoaXMgcXVhbnQgdGFibGUgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3Igc2FtZSB0YWJsZSwgYnV0IGl0J3Mgbm90IGEgYmlnIGRlYWwgKi8KKyAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JU0xPVzoKKyAgICAgIC8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorICAgICAgICogY29lZmZpY2llbnRzIG11bHRpcGxpZWQgYnkgOCAodG8gY291bnRlcmFjdCBzY2FsaW5nKS4KKyAgICAgICAqLworICAgICAgaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCWZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7CisgICAgICB9CisgICAgICBkdGJsID0gZmRjdC0+ZGl2aXNvcnNbcXRibG5vXTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisJZHRibFtpXSA9ICgoRENURUxFTSkgcXRibC0+cXVhbnR2YWxbaV0pIDw8IDM7CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgICBjYXNlIEpEQ1RfSUZBU1Q6CisgICAgICB7CisJLyogRm9yIEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KKwkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKKwkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQorCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKKwkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCisJICovCisjZGVmaW5lIENPTlNUX0JJVFMgMTQKKwlzdGF0aWMgY29uc3QgSU5UMTYgYWFuc2NhbGVzW0RDVFNJWkUyXSA9IHsKKwkgIC8qIHByZWNvbXB1dGVkIHZhbHVlcyBzY2FsZWQgdXAgYnkgMTQgYml0cyAqLworCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorCSAgMjE0MDcsIDI5NjkyLCAyNzk2OSwgMjUxNzIsIDIxNDA3LCAxNjgxOSwgMTE1ODUsICA1OTA2LAorCSAgMTkyNjYsIDI2NzIyLCAyNTE3MiwgMjI2NTQsIDE5MjY2LCAxNTEzNywgMTA0MjYsICA1MzE1LAorCSAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorCSAgMTI4NzMsIDE3ODU1LCAxNjgxOSwgMTUxMzcsIDEyODczLCAxMDExNCwgIDY5NjcsICAzNTUyLAorCSAgIDg4NjcsIDEyMjk5LCAxMTU4NSwgMTA0MjYsICA4ODY3LCAgNjk2NywgIDQ3OTksICAyNDQ2LAorCSAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3CisJfTsKKwlTSElGVF9URU1QUworCisJaWYgKGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPT0gTlVMTCkgeworCSAgZmRjdC0+ZGl2aXNvcnNbcXRibG5vXSA9IChEQ1RFTEVNICopCisJICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJCURDVFNJWkUyICogU0laRU9GKERDVEVMRU0pKTsKKwl9CisJZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGR0YmxbaV0gPSAoRENURUxFTSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLTMpOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIFdlIGFwcGx5IGEgZnVydGhlciBzY2FsZSBmYWN0b3Igb2YgOC4KKwkgKiBXaGF0J3MgYWN0dWFsbHkgc3RvcmVkIGlzIDEvZGl2aXNvciBzbyB0aGF0IHRoZSBpbm5lciBsb29wIGNhbgorCSAqIHVzZSBhIG11bHRpcGxpY2F0aW9uIHJhdGhlciB0aGFuIGEgZGl2aXNpb24uCisJICovCisJRkFTVF9GTE9BVCAqIGZkdGJsOworCWludCByb3csIGNvbDsKKwlzdGF0aWMgY29uc3QgZG91YmxlIGFhbnNjYWxlZmFjdG9yW0RDVFNJWkVdID0geworCSAgMS4wLCAxLjM4NzAzOTg0NSwgMS4zMDY1NjI5NjUsIDEuMTc1ODc1NjAyLAorCSAgMS4wLCAwLjc4NTY5NDk1OCwgMC41NDExOTYxMDAsIDAuMjc1ODk5Mzc5CisJfTsKKworCWlmIChmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKKwkgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub10gPSAoRkFTVF9GTE9BVCAqKQorCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihGQVNUX0ZMT0FUKSk7CisJfQorCWZkdGJsID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXTsKKwlpID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IERDVFNJWkU7IHJvdysrKSB7CisJICBmb3IgKGNvbCA9IDA7IGNvbCA8IERDVFNJWkU7IGNvbCsrKSB7CisJICAgIGZkdGJsW2ldID0gKEZBU1RfRkxPQVQpCisJICAgICAgKDEuMCAvICgoKGRvdWJsZSkgcXRibC0+cXVhbnR2YWxbaV0gKgorCQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0gKiA4LjApKSk7CisJICAgIGkrKzsKKwkgIH0KKwl9CisgICAgICB9CisgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworCisvKgorICogUGVyZm9ybSBmb3J3YXJkIERDVCBvbiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgYSBjb21wb25lbnQuCisgKgorICogVGhlIGlucHV0IHNhbXBsZXMgYXJlIHRha2VuIGZyb20gdGhlIHNhbXBsZV9kYXRhW10gYXJyYXkgc3RhcnRpbmcgYXQKKyAqIHBvc2l0aW9uIHN0YXJ0X3Jvdy9zdGFydF9jb2wsIGFuZCBtb3ZpbmcgdG8gdGhlIHJpZ2h0IGZvciBhbnkgYWRkaXRpb25hbAorICogYmxvY2tzLiBUaGUgcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgcmV0dXJuZWQgaW4gY29lZl9ibG9ja3NbXS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZvcndhcmRfRENUIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCisvKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgaW50ZWdlciBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3QgPSBmZGN0LT5kb19kY3Q7CisgIERDVEVMRU0gKiBkaXZpc29ycyA9IGZkY3QtPmRpdmlzb3JzW2NvbXBwdHItPnF1YW50X3RibF9ub107CisgIERDVEVMRU0gd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogd29yayBhcmVhIGZvciBGRENUIHN1YnJvdXRpbmUgKi8KKyAgSkRJTUVOU0lPTiBiaTsKKworICBzYW1wbGVfZGF0YSArPSBzdGFydF9yb3c7CS8qIGZvbGQgaW4gdGhlIHZlcnRpY2FsIG9mZnNldCBvbmNlICovCisKKyAgZm9yIChiaSA9IDA7IGJpIDwgbnVtX2Jsb2NrczsgYmkrKywgc3RhcnRfY29sICs9IERDVFNJWkUpIHsKKyAgICAvKiBMb2FkIGRhdGEgaW50byB3b3Jrc3BhY2UsIGFwcGx5aW5nIHVuc2lnbmVkLT5zaWduZWQgY29udmVyc2lvbiAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSAqd29ya3NwYWNlcHRyOworICAgICAgcmVnaXN0ZXIgSlNBTVBST1cgZWxlbXB0cjsKKyAgICAgIHJlZ2lzdGVyIGludCBlbGVtcjsKKworICAgICAgd29ya3NwYWNlcHRyID0gd29ya3NwYWNlOworICAgICAgZm9yIChlbGVtciA9IDA7IGVsZW1yIDwgRENUU0laRTsgZWxlbXIrKykgeworCWVsZW1wdHIgPSBzYW1wbGVfZGF0YVtlbGVtcl0gKyBzdGFydF9jb2w7CisjaWYgRENUU0laRSA9PSA4CQkvKiB1bnJvbGwgdGhlIGlubmVyIGxvb3AgKi8KKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKwkqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKKyNlbHNlCisJeyByZWdpc3RlciBpbnQgZWxlbWM7CisJICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7CisJICAgICp3b3Jrc3BhY2VwdHIrKyA9IEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFOworCSAgfQorCX0KKyNlbmRpZgorICAgICAgfQorICAgIH0KKworICAgIC8qIFBlcmZvcm0gdGhlIERDVCAqLworICAgICgqZG9fZGN0KSAod29ya3NwYWNlKTsKKworICAgIC8qIFF1YW50aXplL2Rlc2NhbGUgdGhlIGNvZWZmaWNpZW50cywgYW5kIHN0b3JlIGludG8gY29lZl9ibG9ja3NbXSAqLworICAgIHsgcmVnaXN0ZXIgRENURUxFTSB0ZW1wLCBxdmFsOworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICByZWdpc3RlciBKQ09FRlBUUiBvdXRwdXRfcHRyID0gY29lZl9ibG9ja3NbYmldOworCisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCXF2YWwgPSBkaXZpc29yc1tpXTsKKwl0ZW1wID0gd29ya3NwYWNlW2ldOworCS8qIERpdmlkZSB0aGUgY29lZmZpY2llbnQgdmFsdWUgYnkgcXZhbCwgZW5zdXJpbmcgcHJvcGVyIHJvdW5kaW5nLgorCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQorCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgorCSAqCisJICogSW4gbW9zdCBmaWxlcywgYXQgbGVhc3QgaGFsZiBvZiB0aGUgb3V0cHV0IHZhbHVlcyB3aWxsIGJlIHplcm8KKwkgKiAoYXQgZGVmYXVsdCBxdWFudGl6YXRpb24gc2V0dGluZ3MsIG1vcmUgbGlrZSB0aHJlZS1xdWFydGVycy4uLikKKwkgKiBzbyB3ZSBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBjYXNlIGlzIGZhc3QuICBPbiBtYW55IG1hY2hpbmVzLAorCSAqIGEgY29tcGFyaXNvbiBpcyBlbm91Z2ggY2hlYXBlciB0aGFuIGEgZGl2aWRlIHRvIG1ha2UgYSBzcGVjaWFsIHRlc3QKKwkgKiBhIHdpbi4gIFNpbmNlIGJvdGggaW5wdXRzIHdpbGwgYmUgbm9ubmVnYXRpdmUsIHdlIG5lZWQgb25seSB0ZXN0CisJICogZm9yIGEgPCBiIHRvIGRpc2NvdmVyIHdoZXRoZXIgYS9iIGlzIDAuCisJICogSWYgeW91ciBtYWNoaW5lJ3MgZGl2aXNpb24gaXMgZmFzdCBlbm91Z2gsIGRlZmluZSBGQVNUX0RJVklERS4KKwkgKi8KKyNpZmRlZiBGQVNUX0RJVklERQorI2RlZmluZSBESVZJREVfQlkoYSxiKQlhIC89IGIKKyNlbHNlCisjZGVmaW5lIERJVklERV9CWShhLGIpCWlmIChhID49IGIpIGEgLz0gYjsgZWxzZSBhID0gMAorI2VuZGlmCisJaWYgKHRlbXAgPCAwKSB7CisJICB0ZW1wID0gLXRlbXA7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCSAgdGVtcCA9IC10ZW1wOworCX0gZWxzZSB7CisJICB0ZW1wICs9IHF2YWw+PjE7CS8qIGZvciByb3VuZGluZyAqLworCSAgRElWSURFX0JZKHRlbXAsIHF2YWwpOworCX0KKwlvdXRwdXRfcHRyW2ldID0gKEpDT0VGKSB0ZW1wOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorZm9yd2FyZF9EQ1RfZmxvYXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAorCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCSAgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIFRoaXMgdmVyc2lvbiBpcyB1c2VkIGZvciBmbG9hdGluZy1wb2ludCBEQ1QgaW1wbGVtZW50YXRpb25zLiAqLworeworICAvKiBUaGlzIHJvdXRpbmUgaXMgaGVhdmlseSB1c2VkLCBzbyBpdCdzIHdvcnRoIGNvZGluZyBpdCB0aWdodGx5LiAqLworICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKKyAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZmxvYXRfZGN0OworICBGQVNUX0ZMT0FUICogZGl2aXNvcnMgPSBmZGN0LT5mbG9hdF9kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOworICBGQVNUX0ZMT0FUIHdvcmtzcGFjZVtEQ1RTSVpFMl07IC8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCisgIEpESU1FTlNJT04gYmk7CisKKyAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLworCisgIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7CisgICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgKndvcmtzcGFjZXB0cjsKKyAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7CisgICAgICByZWdpc3RlciBpbnQgZWxlbXI7CisKKyAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKKyAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKKwllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOworI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7CisJKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOworI2Vsc2UKKwl7IHJlZ2lzdGVyIGludCBlbGVtYzsKKwkgIGZvciAoZWxlbWMgPSBEQ1RTSVpFOyBlbGVtYyA+IDA7IGVsZW1jLS0pIHsKKwkgICAgKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpCisJICAgICAgKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKKwkgIH0KKwl9CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KKyAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7CisKKyAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KKyAgICB7IHJlZ2lzdGVyIEZBU1RfRkxPQVQgdGVtcDsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKKworICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkvKiBBcHBseSB0aGUgcXVhbnRpemF0aW9uIGFuZCBzY2FsaW5nIGZhY3RvciAqLworCXRlbXAgPSB3b3Jrc3BhY2VbaV0gKiBkaXZpc29yc1tpXTsKKwkvKiBSb3VuZCB0byBuZWFyZXN0IGludGVnZXIuCisJICogU2luY2UgQyBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2Ygcm91bmRpbmcgZm9yIG5lZ2F0aXZlCisJICogcXVvdGllbnRzLCB3ZSBoYXZlIHRvIGZvcmNlIHRoZSBkaXZpZGVuZCBwb3NpdGl2ZSBmb3IgcG9ydGFiaWxpdHkuCisJICogVGhlIG1heGltdW0gY29lZmZpY2llbnQgc2l6ZSBpcyArLTE2SyAoZm9yIDEyLWJpdCBkYXRhKSwgc28gdGhpcworCSAqIGNvZGUgc2hvdWxkIHdvcmsgZm9yIGVpdGhlciAxNi1iaXQgb3IgMzItYml0IGludHMuCisJICovCisJb3V0cHV0X3B0cltpXSA9IChKQ09FRikgKChpbnQpICh0ZW1wICsgKEZBU1RfRkxPQVQpIDE2Mzg0LjUpIC0gMTYzODQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIEZEQ1QgbWFuYWdlci4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X2ZvcndhcmRfZGN0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZmRjdF9wdHIgZmRjdDsKKyAgaW50IGk7CisKKyAgZmRjdCA9IChteV9mZGN0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9mZGN0X2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPmZkY3QgPSAoc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKikgZmRjdDsKKyAgZmRjdC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2ZkY3RtZ3I7CisKKyAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgeworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lTTE9XOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pc2xvdzsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0lGQVNUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUOworICAgIGZkY3QtPmRvX2RjdCA9IGpwZWdfZmRjdF9pZmFzdDsKKyAgICBicmVhazsKKyNlbmRpZgorI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKKyAgY2FzZSBKRENUX0ZMT0FUOgorICAgIGZkY3QtPnB1Yi5mb3J3YXJkX0RDVCA9IGZvcndhcmRfRENUX2Zsb2F0OworICAgIGZkY3QtPmRvX2Zsb2F0X2RjdCA9IGpwZWdfZmRjdF9mbG9hdDsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIE1hcmsgZGl2aXNvciB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBmZGN0LT5kaXZpc29yc1tpXSA9IE5VTEw7CisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGZkY3QtPmZsb2F0X2Rpdmlzb3JzW2ldID0gTlVMTDsKKyNlbmRpZgorICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNodWZmLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIzNTI1MAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY2h1ZmYuYwpAQCAtMCwwICsxLDkwOSBAQAorLyoKKyAqIGpjaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIG91dHB1dCBzdXNwZW5zaW9uLgorICogSWYgdGhlIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCisgKiBiYWNrIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlCisgKiB2YXJpYWJsZXMgaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZQorICogcGVybWFuZW50IEpQRUcgb2JqZWN0cyBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamNodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamNwaHVmZi5jICovCisKKworLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBlbmNvZGluZy4KKyAqCisgKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCisgKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KKyAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KKyAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLworfSBzYXZhYmxlX3N0YXRlOworCisvKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCisgKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKKyAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KKyAqLworCisjaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQorI2Vsc2UKKyNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0CisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKKwkoKGRlc3QpLnB1dF9idWZmZXIgPSAoc3JjKS5wdXRfYnVmZmVyLCBcCisJIChkZXN0KS5wdXRfYml0cyA9IChzcmMpLnB1dF9iaXRzLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCisJIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQorI2VuZGlmCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogQml0IGJ1ZmZlciAmIERDIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBjX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworICBjX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECS8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb24gKi8KKyAgbG9uZyAqIGRjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107CisgIGxvbmcgKiBhY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworI2VuZGlmCit9IGh1ZmZfZW50cm9weV9lbmNvZGVyOworCit0eXBlZGVmIGh1ZmZfZW50cm9weV9lbmNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKKworLyogV29ya2luZyBzdGF0ZSB3aGlsZSB3cml0aW5nIGFuIE1DVS4KKyAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzIHRoYXQgYXJlIG5lZWRlZCBieSBzdWJyb3V0aW5lcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKyAgc2F2YWJsZV9zdGF0ZSBjdXI7CQkvKiBDdXJyZW50IGJpdCBidWZmZXIgJiBEQyBzdGF0ZSAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGR1bXBfYnVmZmVyIG5lZWRzIGFjY2VzcyB0byB0aGlzICovCit9IHdvcmtpbmdfc3RhdGU7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqIElmIGdhdGhlcl9zdGF0aXN0aWNzIGlzIFRSVUUsIHdlIGRvIG5vdCBvdXRwdXQgYW55dGhpbmcgZHVyaW5nIHRoZSBzY2FuLAorICoganVzdCBjb3VudCB0aGUgSHVmZm1hbiBzeW1ib2xzIHVzZWQgYW5kIGdlbmVyYXRlIEh1ZmZtYW4gY29kZSB0YWJsZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaSwgZGN0YmwsIGFjdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKworICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfZ2F0aGVyOworICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7CisgICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfaHVmZjsKKyAgfQorCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ZXMgKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGRjdGJsKTsKKyAgICAgIGlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKKwlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBhY3RibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9PSBOVUxMKQorCWVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID0gKGxvbmcgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKKyAgICAgIE1FTVpFUk8oZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9IChsb25nICopCisJICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgICBNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCisgICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLworICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKKyAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCisJCQkgICAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5zYXZlZC5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qCisgKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgorICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCisgKgorICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX21ha2VfY19kZXJpdmVkX3RibCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAorCQkJIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpCit7CisgIEpIVUZGX1RCTCAqaHRibDsKKyAgY19kZXJpdmVkX3RibCAqZHRibDsKKyAgaW50IHAsIGksIGwsIGxhc3RwLCBzaSwgbWF4c3ltYm9sOworICBjaGFyIGh1ZmZzaXplWzI1N107CisgIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOworICB1bnNpZ25lZCBpbnQgY29kZTsKKworICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAorICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCisgICAqLworCisgIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KKyAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKyAgaHRibCA9CisgICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKKyAgaWYgKGh0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisKKyAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCisgIGlmICgqcGR0YmwgPT0gTlVMTCkKKyAgICAqcGR0YmwgPSAoY19kZXJpdmVkX3RibCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihjX2Rlcml2ZWRfdGJsKSk7CisgIGR0YmwgPSAqcGR0Ymw7CisgIAorICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOworICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIHdoaWxlIChpLS0pCisgICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7CisgIH0KKyAgaHVmZnNpemVbcF0gPSAwOworICBsYXN0cCA9IHA7CisgIAorICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLworICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KKworICBjb2RlID0gMDsKKyAgc2kgPSBodWZmc2l6ZVswXTsKKyAgcCA9IDA7CisgIHdoaWxlIChodWZmc2l6ZVtwXSkgeworICAgIHdoaWxlICgoKGludCkgaHVmZnNpemVbcF0pID09IHNpKSB7CisgICAgICBodWZmY29kZVtwKytdID0gY29kZTsKKyAgICAgIGNvZGUrKzsKKyAgICB9CisgICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKKyAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBzaSkpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBjb2RlIDw8PSAxOworICAgIHNpKys7CisgIH0KKyAgCisgIC8qIEZpZ3VyZSBDLjM6IGdlbmVyYXRlIGVuY29kaW5nIHRhYmxlcyAqLworICAvKiBUaGVzZSBhcmUgY29kZSBhbmQgc2l6ZSBpbmRleGVkIGJ5IHN5bWJvbCB2YWx1ZSAqLworCisgIC8qIFNldCBhbGwgY29kZWxlc3Mgc3ltYm9scyB0byBoYXZlIGNvZGUgbGVuZ3RoIDA7CisgICAqIHRoaXMgbGV0cyB1cyBkZXRlY3QgZHVwbGljYXRlIFZBTCBlbnRyaWVzIGhlcmUsIGFuZCBsYXRlcgorICAgKiBhbGxvd3MgZW1pdF9iaXRzIHRvIGRldGVjdCBhbnkgYXR0ZW1wdCB0byBlbWl0IHN1Y2ggc3ltYm9scy4KKyAgICovCisgIE1FTVpFUk8oZHRibC0+ZWh1ZnNpLCBTSVpFT0YoZHRibC0+ZWh1ZnNpKSk7CisKKyAgLyogVGhpcyBpcyBhbHNvIGEgY29udmVuaWVudCBwbGFjZSB0byBjaGVjayBmb3Igb3V0LW9mLXJhbmdlCisgICAqIGFuZCBkdXBsaWNhdGVkIFZBTCBlbnRyaWVzLiAgV2UgYWxsb3cgMC4uMjU1IGZvciBBQyBzeW1ib2xzCisgICAqIGJ1dCBvbmx5IDAuLjE1IGZvciBEQy4gIChXZSBjb3VsZCBjb25zdHJhaW4gdGhlbSBmdXJ0aGVyCisgICAqIGJhc2VkIG9uIGRhdGEgZGVwdGggYW5kIG1vZGUsIGJ1dCB0aGlzIHNlZW1zIGVub3VnaC4pCisgICAqLworICBtYXhzeW1ib2wgPSBpc0RDID8gMTUgOiAyNTU7CisKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RwOyBwKyspIHsKKyAgICBpID0gaHRibC0+aHVmZnZhbFtwXTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+IG1heHN5bWJvbCB8fCBkdGJsLT5laHVmc2lbaV0pCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICBkdGJsLT5laHVmY29baV0gPSBodWZmY29kZVtwXTsKKyAgICBkdGJsLT5laHVmc2lbaV0gPSBodWZmc2l6ZVtwXTsKKyAgfQorfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUgKi8KKworLyogRW1pdCBhIGJ5dGUsIHRha2luZyAnYWN0aW9uJyBpZiBtdXN0IHN1c3BlbmQuICovCisjZGVmaW5lIGVtaXRfYnl0ZShzdGF0ZSx2YWwsYWN0aW9uKSAgXAorCXsgKihzdGF0ZSktPm5leHRfb3V0cHV0X2J5dGUrKyA9IChKT0NURVQpICh2YWwpOyAgXAorCSAgaWYgKC0tKHN0YXRlKS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgaWYgKCEgZHVtcF9idWZmZXIoc3RhdGUpKSAgXAorCSAgICAgIHsgYWN0aW9uOyB9IH0KKworCitMT0NBTChib29sZWFuKQorZHVtcF9idWZmZXIgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKKy8qIEVtcHR5IHRoZSBvdXRwdXQgYnVmZmVyOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IHN0YXRlLT5jaW5mby0+ZGVzdDsKKworICBpZiAoISAoKmRlc3QtPmVtcHR5X291dHB1dF9idWZmZXIpIChzdGF0ZS0+Y2luZm8pKQorICAgIHJldHVybiBGQUxTRTsKKyAgLyogQWZ0ZXIgYSBzdWNjZXNzZnVsIGJ1ZmZlciBkdW1wLCBtdXN0IHJlc2V0IGJ1ZmZlciBwb2ludGVycyAqLworICBzdGF0ZS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIHN0YXRlLT5mcmVlX2luX2J1ZmZlciA9IGRlc3QtPmZyZWVfaW5fYnVmZmVyOworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBPdXRwdXR0aW5nIGJpdHMgdG8gdGhlIGZpbGUgKi8KKworLyogT25seSB0aGUgcmlnaHQgMjQgYml0cyBvZiBwdXRfYnVmZmVyIGFyZSB1c2VkOyB0aGUgdmFsaWQgYml0cyBhcmUKKyAqIGxlZnQtanVzdGlmaWVkIGluIHRoaXMgcGFydC4gIEF0IG1vc3QgMTYgYml0cyBjYW4gYmUgcGFzc2VkIHRvIGVtaXRfYml0cworICogaW4gb25lIGNhbGwsIGFuZCB3ZSBuZXZlciByZXRhaW4gbW9yZSB0aGFuIDcgYml0cyBpbiBwdXRfYnVmZmVyCisgKiBiZXR3ZWVuIGNhbGxzLCBzbyAyNCBiaXRzIGFyZSBzdWZmaWNpZW50LgorICovCisKK0lOTElORQorTE9DQUwoYm9vbGVhbikKK2VtaXRfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHNpemUpCisvKiBFbWl0IHNvbWUgYml0czsgcmV0dXJuIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgRkFMU0UgaWYgbXVzdCBzdXNwZW5kICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IHN0YXRlLT5jdXIucHV0X2JpdHM7CisKKyAgLyogaWYgc2l6ZSBpcyAwLCBjYWxsZXIgdXNlZCBhbiBpbnZhbGlkIEh1ZmZtYW4gdGFibGUgZW50cnkgKi8KKyAgaWYgKHNpemUgPT0gMCkKKyAgICBFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgcHV0X2J1ZmZlciAmPSAoKChJTlQzMikgMSk8PHNpemUpIC0gMTsgLyogbWFzayBvZmYgYW55IGV4dHJhIGJpdHMgaW4gY29kZSAqLworICAKKyAgcHV0X2JpdHMgKz0gc2l6ZTsJCS8qIG5ldyBudW1iZXIgb2YgYml0cyBpbiBidWZmZXIgKi8KKyAgCisgIHB1dF9idWZmZXIgPDw9IDI0IC0gcHV0X2JpdHM7IC8qIGFsaWduIGluY29taW5nIGJpdHMgKi8KKworICBwdXRfYnVmZmVyIHw9IHN0YXRlLT5jdXIucHV0X2J1ZmZlcjsgLyogYW5kIG1lcmdlIHdpdGggb2xkIGJ1ZmZlciBjb250ZW50cyAqLworICAKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoc3RhdGUsIGMsIHJldHVybiBGQUxTRSk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShzdGF0ZSwgMCwgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gcHV0X2J1ZmZlcjsgLyogdXBkYXRlIHN0YXRlIHZhcmlhYmxlcyAqLworICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gcHV0X2JpdHM7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2ZsdXNoX2JpdHMgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSkKK3sKKyAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCAweDdGLCA3KSkgLyogZmlsbCBhbnkgcGFydGlhbCBieXRlIHdpdGggb25lcyAqLworICAgIHJldHVybiBGQUxTRTsKKyAgc3RhdGUtPmN1ci5wdXRfYnVmZmVyID0gMDsJLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgc3RhdGUtPmN1ci5wdXRfYml0cyA9IDA7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qIEVuY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCitMT0NBTChib29sZWFuKQorZW5jb2RlX29uZV9ibG9jayAod29ya2luZ19zdGF0ZSAqIHN0YXRlLCBKQ09FRlBUUiBibG9jaywgaW50IGxhc3RfZGNfdmFsLAorCQkgIGNfZGVyaXZlZF90YmwgKmRjdGJsLCBjX2Rlcml2ZWRfdGJsICphY3RibCkKK3sKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCBrLCByLCBpOworICAKKyAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KKyAgCisgIHRlbXAgPSB0ZW1wMiA9IGJsb2NrWzBdIC0gbGFzdF9kY192YWw7CisKKyAgaWYgKHRlbXAgPCAwKSB7CisgICAgdGVtcCA9IC10ZW1wOwkJLyogdGVtcCBpcyBhYnMgdmFsdWUgb2YgaW5wdXQgKi8KKyAgICAvKiBGb3IgYSBuZWdhdGl2ZSBpbnB1dCwgd2FudCB0ZW1wMiA9IGJpdHdpc2UgY29tcGxlbWVudCBvZiBhYnMoaW5wdXQpICovCisgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgdGVtcDItLTsKKyAgfQorICAKKyAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICBuYml0cyA9IDA7CisgIHdoaWxlICh0ZW1wKSB7CisgICAgbmJpdHMrKzsKKyAgICB0ZW1wID4+PSAxOworICB9CisgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgorICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgorICAgKi8KKyAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQorICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgIAorICAvKiBFbWl0IHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmb3IgdGhlIG51bWJlciBvZiBiaXRzICovCisgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgZGN0YmwtPmVodWZjb1tuYml0c10sIGRjdGJsLT5laHVmc2lbbmJpdHNdKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCisgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICBpZiAobmJpdHMpCQkJLyogZW1pdF9iaXRzIHJlamVjdHMgY2FsbHMgd2l0aCBzaXplIDAgKi8KKyAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzB4RjBdLCBhY3RibC0+ZWh1ZnNpWzB4RjBdKSkKKwkgIHJldHVybiBGQUxTRTsKKwlyIC09IDE2OworICAgICAgfQorCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgICBpZiAodGVtcCA8IDApIHsKKwl0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworCS8qIFRoaXMgY29kZSBhc3N1bWVzIHdlIGFyZSBvbiBhIHR3bydzIGNvbXBsZW1lbnQgbWFjaGluZSAqLworCXRlbXAyLS07CisgICAgICB9CisgICAgICAKKyAgICAgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgICAgIG5iaXRzID0gMTsJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIDEgYml0ICovCisgICAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorCW5iaXRzKys7CisgICAgICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcyAqLworICAgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKwlFUlJFWElUKHN0YXRlLT5jaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOworICAgICAgCisgICAgICAvKiBFbWl0IEh1ZmZtYW4gc3ltYm9sIGZvciBydW4gbGVuZ3RoIC8gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICAgIGkgPSAociA8PCA0KSArIG5iaXRzOworICAgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvW2ldLCBhY3RibC0+ZWh1ZnNpW2ldKSkKKwlyZXR1cm4gRkFMU0U7CisKKyAgICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgICAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCisgICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cykpCisJcmV0dXJuIEZBTFNFOworICAgICAgCisgICAgICByID0gMDsKKyAgICB9CisgIH0KKworICAvKiBJZiB0aGUgbGFzdCBjb2VmKHMpIHdlcmUgemVybywgZW1pdCBhbiBlbmQtb2YtYmxvY2sgY29kZSAqLworICBpZiAociA+IDApCisgICAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBhY3RibC0+ZWh1ZmNvWzBdLCBhY3RibC0+ZWh1ZnNpWzBdKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTChib29sZWFuKQorZW1pdF9yZXN0YXJ0ICh3b3JraW5nX3N0YXRlICogc3RhdGUsIGludCByZXN0YXJ0X251bSkKK3sKKyAgaW50IGNpOworCisgIGlmICghIGZsdXNoX2JpdHMoc3RhdGUpKQorICAgIHJldHVybiBGQUxTRTsKKworICBlbWl0X2J5dGUoc3RhdGUsIDB4RkYsIHJldHVybiBGQUxTRSk7CisgIGVtaXRfYnl0ZShzdGF0ZSwgSlBFR19SU1QwICsgcmVzdGFydF9udW0sIHJldHVybiBGQUxTRSk7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IHN0YXRlLT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICBzdGF0ZS0+Y3VyLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogVGhlIHJlc3RhcnQgY291bnRlciBpcyBub3QgdXBkYXRlZCB1bnRpbCB3ZSBzdWNjZXNzZnVsbHkgd3JpdGUgdGhlIE1DVS4gKi8KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRW5jb2RlIGFuZCBvdXRwdXQgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitlbmNvZGVfbWN1X2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIGVtaXRfcmVzdGFydCgmc3RhdGUsIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoISBlbmNvZGVfb25lX2Jsb2NrKCZzdGF0ZSwKKwkJCSAgIE1DVV9kYXRhW2Jsa25dWzBdLCBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldLAorCQkJICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub10sCisJCQkgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXSkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVXBkYXRlIGxhc3RfZGNfdmFsICovCisgICAgc3RhdGUuY3VyLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOworICB9CisKKyAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKKyAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHdvcmtpbmdfc3RhdGUgc3RhdGU7CisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlIC4uLiBmbHVzaF9iaXRzIG5lZWRzIGl0ICovCisgIHN0YXRlLm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgc3RhdGUuZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisgIEFTU0lHTl9TVEFURShzdGF0ZS5jdXIsIGVudHJvcHktPnNhdmVkKTsKKyAgc3RhdGUuY2luZm8gPSBjaW5mbzsKKworICAvKiBGbHVzaCBvdXQgdGhlIGxhc3QgZGF0YSAqLworICBpZiAoISBmbHVzaF9iaXRzKCZzdGF0ZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQU5UX1NVU1BFTkQpOworCisgIC8qIFVwZGF0ZSBzdGF0ZSAqLworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IHN0YXRlLm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IHN0YXRlLmZyZWVfaW5fYnVmZmVyOworICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlLmN1cik7Cit9CisKKworLyoKKyAqIEh1ZmZtYW4gY29kaW5nIG9wdGltaXphdGlvbi4KKyAqCisgKiBXZSBmaXJzdCBzY2FuIHRoZSBzdXBwbGllZCBkYXRhIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgZWFjaCBzeW1ib2wKKyAqIHRoYXQgaXMgdG8gYmUgSHVmZm1hbi1jb2RlZC4gKFRoaXMgcHJvY2VzcyBNVVNUIGFncmVlIHdpdGggdGhlIGNvZGUgYWJvdmUuKQorICogVGhlbiB3ZSBidWlsZCBhIEh1ZmZtYW4gY29kaW5nIHRyZWUgZm9yIHRoZSBvYnNlcnZlZCBjb3VudHMuCisgKiBTeW1ib2xzIHdoaWNoIGFyZSBub3QgbmVlZGVkIGF0IGFsbCBmb3IgdGhlIHBhcnRpY3VsYXIgaW1hZ2UgYXJlIG5vdAorICogYXNzaWduZWQgYW55IGNvZGUsIHdoaWNoIHNhdmVzIHNwYWNlIGluIHRoZSBESFQgbWFya2VyIGFzIHdlbGwgYXMgaW4KKyAqIHRoZSBjb21wcmVzc2VkIGRhdGEuCisgKi8KKworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorCisKKy8qIFByb2Nlc3MgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworTE9DQUwodm9pZCkKK2h0ZXN0X29uZV9ibG9jayAoal9jb21wcmVzc19wdHIgY2luZm8sIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCisJCSBsb25nIGRjX2NvdW50c1tdLCBsb25nIGFjX2NvdW50c1tdKQoreworICByZWdpc3RlciBpbnQgdGVtcDsKKyAgcmVnaXN0ZXIgaW50IG5iaXRzOworICByZWdpc3RlciBpbnQgaywgcjsKKyAgCisgIC8qIEVuY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSBwZXIgc2VjdGlvbiBGLjEuMi4xICovCisgIAorICB0ZW1wID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKKyAgaWYgKHRlbXAgPCAwKQorICAgIHRlbXAgPSAtdGVtcDsKKyAgCisgIC8qIEZpbmQgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCBmb3IgdGhlIG1hZ25pdHVkZSBvZiB0aGUgY29lZmZpY2llbnQgKi8KKyAgbmJpdHMgPSAwOworICB3aGlsZSAodGVtcCkgeworICAgIG5iaXRzKys7CisgICAgdGVtcCA+Pj0gMTsKKyAgfQorICAvKiBDaGVjayBmb3Igb3V0LW9mLXJhbmdlIGNvZWZmaWNpZW50IHZhbHVlcy4KKyAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICovCisgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMrMSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisKKyAgLyogQ291bnQgdGhlIEh1ZmZtYW4gc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KKyAgZGNfY291bnRzW25iaXRzXSsrOworICAKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRi4xLjIuMiAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgCisgIGZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisgICAgaWYgKCh0ZW1wID0gYmxvY2tbanBlZ19uYXR1cmFsX29yZGVyW2tdXSkgPT0gMCkgeworICAgICAgcisrOworICAgIH0gZWxzZSB7CisgICAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgICB3aGlsZSAociA+IDE1KSB7CisJYWNfY291bnRzWzB4RjBdKys7CisJciAtPSAxNjsKKyAgICAgIH0KKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgaWYgKHRlbXAgPCAwKQorCXRlbXAgPSAtdGVtcDsKKyAgICAgIAorICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KKyAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisJbmJpdHMrKzsKKyAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKyAgICAgIAorICAgICAgLyogQ291bnQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgICAgYWNfY291bnRzWyhyIDw8IDQpICsgbmJpdHNdKys7CisgICAgICAKKyAgICAgIHIgPSAwOworICAgIH0KKyAgfQorCisgIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChyID4gMCkKKyAgICBhY19jb3VudHNbMF0rKzsKK30KKworCisvKgorICogVHJpYWwtZW5jb2RlIG9uZSBNQ1UncyB3b3J0aCBvZiBIdWZmbWFuLWNvbXByZXNzZWQgY29lZmZpY2llbnRzLgorICogTm8gZGF0YSBpcyBhY3R1YWxseSBvdXRwdXQsIHNvIG5vIHN1c3BlbnNpb24gcmV0dXJuIGlzIHBvc3NpYmxlLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgLyogVGFrZSBjYXJlIG9mIHJlc3RhcnQgaW50ZXJ2YWxzIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKwllbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICAgICAgLyogVXBkYXRlIHJlc3RhcnQgc3RhdGUgKi8KKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgaHRlc3Rfb25lX2Jsb2NrKGNpbmZvLCBNQ1VfZGF0YVtibGtuXVswXSwgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldLAorCQkgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tjb21wcHRyLT5kY190Ymxfbm9dLAorCQkgICAgZW50cm9weS0+YWNfY291bnRfcHRyc1tjb21wcHRyLT5hY190Ymxfbm9dKTsKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSBNQ1VfZGF0YVtibGtuXVswXVswXTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgYmVzdCBIdWZmbWFuIGNvZGUgdGFibGUgZm9yIHRoZSBnaXZlbiBjb3VudHMsIGZpbGwgaHRibC4KKyAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamNwaHVmZi5jLgorICoKKyAqIFRoZSBKUEVHIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbm8gc3ltYm9sIGJlIGFzc2lnbmVkIGEgY29kZXdvcmQgb2YgYWxsCisgKiBvbmUgYml0cyAoc28gdGhhdCBwYWRkaW5nIGJpdHMgYWRkZWQgYXQgdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgc2VnbWVudAorICogY2FuJ3QgbG9vayBsaWtlIGEgdmFsaWQgY29kZSkuICBCZWNhdXNlIG9mIHRoZSBjYW5vbmljYWwgb3JkZXJpbmcgb2YKKyAqIGNvZGV3b3JkcywgdGhpcyBqdXN0IG1lYW5zIHRoYXQgdGhlcmUgbXVzdCBiZSBhbiB1bnVzZWQgc2xvdCBpbiB0aGUKKyAqIGxvbmdlc3QgY29kZXdvcmQgbGVuZ3RoIGNhdGVnb3J5LiAgU2VjdGlvbiBLLjIgb2YgdGhlIEpQRUcgc3BlYyBzdWdnZXN0cworICogcmVzZXJ2aW5nIHN1Y2ggYSBzbG90IGJ5IHByZXRlbmRpbmcgdGhhdCBzeW1ib2wgMjU2IGlzIGEgdmFsaWQgc3ltYm9sCisgKiB3aXRoIGNvdW50IDEuICBJbiB0aGVvcnkgdGhhdCdzIG5vdCBvcHRpbWFsOyBnaXZpbmcgaXQgY291bnQgemVybyBidXQKKyAqIGluY2x1ZGluZyBpdCBpbiB0aGUgc3ltYm9sIHNldCBhbnl3YXkgc2hvdWxkIGdpdmUgYSBiZXR0ZXIgSHVmZm1hbiBjb2RlLgorICogQnV0IHRoZSB0aGVvcmV0aWNhbGx5IGJldHRlciBjb2RlIGFjdHVhbGx5IHNlZW1zIHRvIGNvbWUgb3V0IHdvcnNlIGluCisgKiBwcmFjdGljZSwgYmVjYXVzZSBpdCBwcm9kdWNlcyBtb3JlIGFsbC1vbmVzIGJ5dGVzICh3aGljaCBpbmN1ciBzdHVmZmVkCisgKiB6ZXJvIGJ5dGVzIGluIHRoZSBmaW5hbCBmaWxlKS4gIEluIGFueSBjYXNlIHRoZSBkaWZmZXJlbmNlIGlzIHRpbnkuCisgKgorICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgSHVmZm1hbiBjb2RlcyB0byBiZSBubyBtb3JlIHRoYW4gMTYgYml0cyBsb25nLgorICogSWYgc29tZSBzeW1ib2xzIGhhdmUgYSB2ZXJ5IHNtYWxsIGJ1dCBub256ZXJvIHByb2JhYmlsaXR5LCB0aGUgSHVmZm1hbiB0cmVlCisgKiBtdXN0IGJlIGFkanVzdGVkIHRvIG1lZXQgdGhlIGNvZGUgbGVuZ3RoIHJlc3RyaWN0aW9uLiAgV2UgY3VycmVudGx5IHVzZQorICogdGhlIGFkanVzdG1lbnQgbWV0aG9kIHN1Z2dlc3RlZCBpbiBKUEVHIHNlY3Rpb24gSy4yLiAgVGhpcyBtZXRob2QgaXMgKm5vdCoKKyAqIG9wdGltYWw7IGl0IG1heSBub3QgY2hvb3NlIHRoZSBiZXN0IHBvc3NpYmxlIGxpbWl0ZWQtbGVuZ3RoIGNvZGUuICBCdXQKKyAqIHR5cGljYWxseSBvbmx5IHZlcnktbG93LWZyZXF1ZW5jeSBzeW1ib2xzIHdpbGwgYmUgZ2l2ZW4gbGVzcy10aGFuLW9wdGltYWwKKyAqIGxlbmd0aHMsIHNvIHRoZSBjb2RlIGlzIGFsbW9zdCBvcHRpbWFsLiAgRXhwZXJpbWVudGFsIGNvbXBhcmlzb25zIGFnYWluc3QKKyAqIGFuIG9wdGltYWwgbGltaXRlZC1sZW5ndGgtY29kZSBhbGdvcml0aG0gaW5kaWNhdGUgdGhhdCB0aGUgZGlmZmVyZW5jZSBpcworICogbWljcm9zY29waWMgLS0tIHVzdWFsbHkgbGVzcyB0aGFuIGEgaHVuZHJlZHRoIG9mIGEgcGVyY2VudCBvZiB0b3RhbCBzaXplLgorICogU28gdGhlIGV4dHJhIGNvbXBsZXhpdHkgb2YgYW4gb3B0aW1hbCBhbGdvcml0aG0gZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkhVRkZfVEJMICogaHRibCwgbG9uZyBmcmVxW10pCit7CisjZGVmaW5lIE1BWF9DTEVOIDMyCQkvKiBhc3N1bWVkIG1heGltdW0gaW5pdGlhbCBjb2RlIGxlbmd0aCAqLworICBVSU5UOCBiaXRzW01BWF9DTEVOKzFdOwkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZSBsZW5ndGggayAqLworICBpbnQgY29kZXNpemVbMjU3XTsJCS8qIGNvZGVzaXplW2tdID0gY29kZSBsZW5ndGggb2Ygc3ltYm9sIGsgKi8KKyAgaW50IG90aGVyc1syNTddOwkJLyogbmV4dCBzeW1ib2wgaW4gY3VycmVudCBicmFuY2ggb2YgdHJlZSAqLworICBpbnQgYzEsIGMyOworICBpbnQgcCwgaSwgajsKKyAgbG9uZyB2OworCisgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGV4cGxhaW5lZCBpbiBzZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzdGFuZGFyZCAqLworCisgIE1FTVpFUk8oYml0cywgU0laRU9GKGJpdHMpKTsKKyAgTUVNWkVSTyhjb2Rlc2l6ZSwgU0laRU9GKGNvZGVzaXplKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykKKyAgICBvdGhlcnNbaV0gPSAtMTsJCS8qIGluaXQgbGlua3MgdG8gZW1wdHkgKi8KKyAgCisgIGZyZXFbMjU2XSA9IDE7CQkvKiBtYWtlIHN1cmUgMjU2IGhhcyBhIG5vbnplcm8gY291bnQgKi8KKyAgLyogSW5jbHVkaW5nIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBpbiB0aGUgSHVmZm1hbiBwcm9jZWR1cmUgZ3VhcmFudGVlcworICAgKiB0aGF0IG5vIHJlYWwgc3ltYm9sIGlzIGdpdmVuIGNvZGUtdmFsdWUgb2YgYWxsIG9uZXMsIGJlY2F1c2UgMjU2CisgICAqIHdpbGwgYmUgcGxhY2VkIGxhc3QgaW4gdGhlIGxhcmdlc3QgY29kZXdvcmQgY2F0ZWdvcnkuCisgICAqLworCisgIC8qIEh1ZmZtYW4ncyBiYXNpYyBhbGdvcml0aG0gdG8gYXNzaWduIG9wdGltYWwgY29kZSBsZW5ndGhzIHRvIHN5bWJvbHMgKi8KKworICBmb3IgKDs7KSB7CisgICAgLyogRmluZCB0aGUgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMSA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzEgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2KSB7CisJdiA9IGZyZXFbaV07CisJYzEgPSBpOworICAgICAgfQorICAgIH0KKworICAgIC8qIEZpbmQgdGhlIG5leHQgc21hbGxlc3Qgbm9uemVybyBmcmVxdWVuY3ksIHNldCBjMiA9IGl0cyBzeW1ib2wgKi8KKyAgICAvKiBJbiBjYXNlIG9mIHRpZXMsIHRha2UgdGhlIGxhcmdlciBzeW1ib2wgbnVtYmVyICovCisgICAgYzIgPSAtMTsKKyAgICB2ID0gMTAwMDAwMDAwMEw7CisgICAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgeworICAgICAgaWYgKGZyZXFbaV0gJiYgZnJlcVtpXSA8PSB2ICYmIGkgIT0gYzEpIHsKKwl2ID0gZnJlcVtpXTsKKwljMiA9IGk7CisgICAgICB9CisgICAgfQorCisgICAgLyogRG9uZSBpZiB3ZSd2ZSBtZXJnZWQgZXZlcnl0aGluZyBpbnRvIG9uZSBmcmVxdWVuY3kgKi8KKyAgICBpZiAoYzIgPCAwKQorICAgICAgYnJlYWs7CisgICAgCisgICAgLyogRWxzZSBtZXJnZSB0aGUgdHdvIGNvdW50cy90cmVlcyAqLworICAgIGZyZXFbYzFdICs9IGZyZXFbYzJdOworICAgIGZyZXFbYzJdID0gMDsKKworICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMSdzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzFdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMV0gPj0gMCkgeworICAgICAgYzEgPSBvdGhlcnNbYzFdOworICAgICAgY29kZXNpemVbYzFdKys7CisgICAgfQorICAgIAorICAgIG90aGVyc1tjMV0gPSBjMjsJCS8qIGNoYWluIGMyIG9udG8gYzEncyB0cmVlIGJyYW5jaCAqLworICAgIAorICAgIC8qIEluY3JlbWVudCB0aGUgY29kZXNpemUgb2YgZXZlcnl0aGluZyBpbiBjMidzIHRyZWUgYnJhbmNoICovCisgICAgY29kZXNpemVbYzJdKys7CisgICAgd2hpbGUgKG90aGVyc1tjMl0gPj0gMCkgeworICAgICAgYzIgPSBvdGhlcnNbYzJdOworICAgICAgY29kZXNpemVbYzJdKys7CisgICAgfQorICB9CisKKyAgLyogTm93IGNvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBvZiBlYWNoIGNvZGUgbGVuZ3RoICovCisgIGZvciAoaSA9IDA7IGkgPD0gMjU2OyBpKyspIHsKKyAgICBpZiAoY29kZXNpemVbaV0pIHsKKyAgICAgIC8qIFRoZSBKUEVHIHN0YW5kYXJkIHNlZW1zIHRvIHRoaW5rIHRoYXQgdGhpcyBjYW4ndCBoYXBwZW4sICovCisgICAgICAvKiBidXQgSSdtIHBhcmFub2lkLi4uICovCisgICAgICBpZiAoY29kZXNpemVbaV0gPiBNQVhfQ0xFTikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0hVRkZfQ0xFTl9PVkVSRkxPVyk7CisKKyAgICAgIGJpdHNbY29kZXNpemVbaV1dKys7CisgICAgfQorICB9CisKKyAgLyogSlBFRyBkb2Vzbid0IGFsbG93IHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aHMgb3ZlciAxNiBiaXRzLCBzbyBpZiB0aGUgcHVyZQorICAgKiBIdWZmbWFuIHByb2NlZHVyZSBhc3NpZ25lZCBhbnkgc3VjaCBsZW5ndGhzLCB3ZSBtdXN0IGFkanVzdCB0aGUgY29kaW5nLgorICAgKiBIZXJlIGlzIHdoYXQgdGhlIEpQRUcgc3BlYyBzYXlzIGFib3V0IGhvdyB0aGlzIG5leHQgYml0IHdvcmtzOgorICAgKiBTaW5jZSBzeW1ib2xzIGFyZSBwYWlyZWQgZm9yIHRoZSBsb25nZXN0IEh1ZmZtYW4gY29kZSwgdGhlIHN5bWJvbHMgYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGlzIGxlbmd0aCBjYXRlZ29yeSB0d28gYXQgYSB0aW1lLiAgVGhlIHByZWZpeCBmb3IgdGhlIHBhaXIKKyAgICogKHdoaWNoIGlzIG9uZSBiaXQgc2hvcnRlcikgaXMgYWxsb2NhdGVkIHRvIG9uZSBvZiB0aGUgcGFpcjsgdGhlbiwKKyAgICogc2tpcHBpbmcgdGhlIEJJVFMgZW50cnkgZm9yIHRoYXQgcHJlZml4IGxlbmd0aCwgYSBjb2RlIHdvcmQgZnJvbSB0aGUgbmV4dAorICAgKiBzaG9ydGVzdCBub256ZXJvIEJJVFMgZW50cnkgaXMgY29udmVydGVkIGludG8gYSBwcmVmaXggZm9yIHR3byBjb2RlIHdvcmRzCisgICAqIG9uZSBiaXQgbG9uZ2VyLgorICAgKi8KKyAgCisgIGZvciAoaSA9IE1BWF9DTEVOOyBpID4gMTY7IGktLSkgeworICAgIHdoaWxlIChiaXRzW2ldID4gMCkgeworICAgICAgaiA9IGkgLSAyOwkJLyogZmluZCBsZW5ndGggb2YgbmV3IHByZWZpeCB0byBiZSB1c2VkICovCisgICAgICB3aGlsZSAoYml0c1tqXSA9PSAwKQorCWotLTsKKyAgICAgIAorICAgICAgYml0c1tpXSAtPSAyOwkJLyogcmVtb3ZlIHR3byBzeW1ib2xzICovCisgICAgICBiaXRzW2ktMV0rKzsJCS8qIG9uZSBnb2VzIGluIHRoaXMgbGVuZ3RoICovCisgICAgICBiaXRzW2orMV0gKz0gMjsJCS8qIHR3byBuZXcgc3ltYm9scyBpbiB0aGlzIGxlbmd0aCAqLworICAgICAgYml0c1tqXS0tOwkJLyogc3ltYm9sIG9mIHRoaXMgbGVuZ3RoIGlzIG5vdyBhIHByZWZpeCAqLworICAgIH0KKyAgfQorCisgIC8qIFJlbW92ZSB0aGUgY291bnQgZm9yIHRoZSBwc2V1ZG8tc3ltYm9sIDI1NiBmcm9tIHRoZSBsYXJnZXN0IGNvZGVsZW5ndGggKi8KKyAgd2hpbGUgKGJpdHNbaV0gPT0gMCkJCS8qIGZpbmQgbGFyZ2VzdCBjb2RlbGVuZ3RoIHN0aWxsIGluIHVzZSAqLworICAgIGktLTsKKyAgYml0c1tpXS0tOworICAKKyAgLyogUmV0dXJuIGZpbmFsIHN5bWJvbCBjb3VudHMgKG9ubHkgZm9yIGxlbmd0aHMgMC4uMTYpICovCisgIE1FTUNPUFkoaHRibC0+Yml0cywgYml0cywgU0laRU9GKGh0YmwtPmJpdHMpKTsKKyAgCisgIC8qIFJldHVybiBhIGxpc3Qgb2YgdGhlIHN5bWJvbHMgc29ydGVkIGJ5IGNvZGUgbGVuZ3RoICovCisgIC8qIEl0J3Mgbm90IHJlYWwgY2xlYXIgdG8gbWUgd2h5IHdlIGRvbid0IG5lZWQgdG8gY29uc2lkZXIgdGhlIGNvZGVsZW5ndGgKKyAgICogY2hhbmdlcyBtYWRlIGFib3ZlLCBidXQgdGhlIEpQRUcgc3BlYyBzZWVtcyB0byB0aGluayB0aGlzIHdvcmtzLgorICAgKi8KKyAgcCA9IDA7CisgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0NMRU47IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPD0gMjU1OyBqKyspIHsKKyAgICAgIGlmIChjb2Rlc2l6ZVtqXSA9PSBpKSB7CisJaHRibC0+aHVmZnZhbFtwXSA9IChVSU5UOCkgajsKKwlwKys7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHNlbnRfdGFibGUgRkFMU0Ugc28gdXBkYXRlZCB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLworICBodGJsLT5zZW50X3RhYmxlID0gRkFMU0U7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHBhc3MgYW5kIGNyZWF0ZSB0aGUgbmV3IEh1ZmZtYW4gdGFibGVzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfZ2F0aGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgY2ksIGRjdGJsLCBhY3RibDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIGJvb2xlYW4gZGlkX2RjW05VTV9IVUZGX1RCTFNdOworICBib29sZWFuIGRpZF9hY1tOVU1fSFVGRl9UQkxTXTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZF9kYywgU0laRU9GKGRpZF9kYykpOworICBNRU1aRVJPKGRpZF9hYywgU0laRU9GKGRpZF9hYykpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoISBkaWRfZGNbZGN0YmxdKSB7CisgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1tkY3RibF07CisgICAgICBpZiAoKmh0YmxwdHIgPT0gTlVMTCkKKwkqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlKGNpbmZvLCAqaHRibHB0ciwgZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0pOworICAgICAgZGlkX2RjW2RjdGJsXSA9IFRSVUU7CisgICAgfQorICAgIGlmICghIGRpZF9hY1thY3RibF0pIHsKKyAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2FjdGJsXTsKKyAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSk7CisgICAgICBkaWRfYWNbYWN0YmxdID0gVFJVRTsKKyAgICB9CisgIH0KK30KKworCisjZW5kaWYgLyogRU5UUk9QWV9PUFRfU1VQUE9SVEVEICovCisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2RpbmcuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9odWZmX2VuY29kZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZW5jb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tpXSA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisjaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECisgICAgZW50cm9weS0+ZGNfY291bnRfcHRyc1tpXSA9IGVudHJvcHktPmFjX2NvdW50X3B0cnNbaV0gPSBOVUxMOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY2h1ZmYuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY2h1ZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU5OWZjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjaHVmZi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBqY2h1ZmYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nIHJvdXRpbmVzCisgKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBlbmNvZGVyIChqY2h1ZmYuYykgYW5kIHRoZQorICogcHJvZ3Jlc3NpdmUgZW5jb2RlciAoamNwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCisgKi8KKworLyogVGhlIGxlZ2FsIHJhbmdlIG9mIGEgRENUIGNvZWZmaWNpZW50IGlzCisgKiAgLTEwMjQgLi4gKzEwMjMgIGZvciA4LWJpdCBkYXRhOworICogLTE2Mzg0IC4uICsxNjM4MyBmb3IgMTItYml0IGRhdGEuCisgKiBIZW5jZSB0aGUgbWFnbml0dWRlIHNob3VsZCBhbHdheXMgZml0IGluIDEwIG9yIDE0IGJpdHMgcmVzcGVjdGl2ZWx5LgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQ09FRl9CSVRTIDE0CisjZW5kaWYKKworLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBpbnQgZWh1ZmNvWzI1Nl07CS8qIGNvZGUgZm9yIGVhY2ggc3ltYm9sICovCisgIGNoYXIgZWh1ZnNpWzI1Nl07CQkvKiBsZW5ndGggb2YgY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KKyAgLyogSWYgbm8gY29kZSBoYXMgYmVlbiBhbGxvY2F0ZWQgZm9yIGEgc3ltYm9sIFMsIGVodWZzaVtTXSBjb250YWlucyAwICovCit9IGNfZGVyaXZlZF90Ymw7CisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX21ha2VfY19kZXJpdmVkX3RibAlqTWtDRGVyaXZlZAorI2RlZmluZSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlCWpHZW5PcHRUYmwKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLworRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJICAgICBjX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7CisKKy8qIEdlbmVyYXRlIGFuIG9wdGltYWwgdGFibGUgZGVmaW5pdGlvbiBnaXZlbiB0aGUgc3BlY2lmaWVkIGNvdW50cyAqLworRVhURVJOKHZvaWQpIGpwZWdfZ2VuX29wdGltYWxfdGFibGUKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjaW5pdC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmZmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNpbml0LmMKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIGpjaW5pdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGlzIHJvdXRpbmUgaXMgaW4gY2hhcmdlIG9mIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZCBhbmQKKyAqIG1ha2luZyBhbiBpbml0aWFsaXphdGlvbiBjYWxsIHRvIGVhY2ggb25lLgorICoKKyAqIExvZ2ljYWxseSwgdGhpcyBjb2RlIGJlbG9uZ3MgaW4gamNtYXN0ZXIuYy4gIEl0J3Mgc3BsaXQgb3V0IGJlY2F1c2UKKyAqIGxpbmtpbmcgdGhpcyByb3V0aW5lIGltcGxpZXMgbGlua2luZyB0aGUgZW50aXJlIGNvbXByZXNzaW9uIGxpYnJhcnkuCisgKiBGb3IgYSB0cmFuc2NvZGluZy1vbmx5IGFwcGxpY2F0aW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIGpjbWFzdGVyLmMKKyAqIHdpdGhvdXQgbGlua2luZyBpbiB0aGUgd2hvbGUgbGlicmFyeS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcy4KKyAqIFRoaXMgaXMgZG9uZSBvbmNlIGF0IHRoZSBzdGFydCBvZiBwcm9jZXNzaW5nIGFuIGltYWdlLiAgV2UgZGV0ZXJtaW5lCisgKiB3aGljaCBtb2R1bGVzIHdpbGwgYmUgdXNlZCBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uIGNhbGxzLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29tcHJlc3NfbWFzdGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogSW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCAoaW5jbHVkZXMgcGFyYW1ldGVyIGNoZWNraW5nL3Byb2Nlc3NpbmcpICovCisgIGppbml0X2NfbWFzdGVyX2NvbnRyb2woY2luZm8sIEZBTFNFIC8qIGZ1bGwgY29tcHJlc3Npb24gKi8pOworCisgIC8qIFByZXByb2Nlc3NpbmcgKi8KKyAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgamluaXRfY29sb3JfY29udmVydGVyKGNpbmZvKTsKKyAgICBqaW5pdF9kb3duc2FtcGxlcihjaW5mbyk7CisgICAgamluaXRfY19wcmVwX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisgIH0KKyAgLyogRm9yd2FyZCBEQ1QgKi8KKyAgamluaXRfZm9yd2FyZF9kY3QoY2luZm8pOworICAvKiBFbnRyb3B5IGVuY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZW5jb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlCisgICAgICBqaW5pdF9odWZmX2VuY29kZXIoY2luZm8pOworICB9CisKKyAgLyogTmVlZCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyIGluIGFueSBtdWx0aS1wYXNzIG1vZGUuICovCisgIGppbml0X2NfY29lZl9jb250cm9sbGVyKGNpbmZvLAorCQkoYm9vbGVhbikgKGNpbmZvLT5udW1fc2NhbnMgPiAxIHx8IGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpKTsKKyAgamluaXRfY19tYWluX2NvbnRyb2xsZXIoY2luZm8sIEZBTFNFIC8qIG5ldmVyIG5lZWQgZnVsbCBidWZmZXIgaGVyZSAqLyk7CisKKyAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIFdyaXRlIHRoZSBkYXRhc3RyZWFtIGhlYWRlciAoU09JKSBpbW1lZGlhdGVseS4KKyAgICogRnJhbWUgYW5kIHNjYW4gaGVhZGVycyBhcmUgcG9zdHBvbmVkIHRpbGwgbGF0ZXIuCisgICAqIFRoaXMgbGV0cyBhcHBsaWNhdGlvbiBpbnNlcnQgc3BlY2lhbCBtYXJrZXJzIGFmdGVyIHRoZSBTT0kuCisgICAqLworICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZpbGVfaGVhZGVyKSAoY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFpbmN0LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNtYWluY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDI3OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFpbmN0LmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBqY21haW5jdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGNvbXByZXNzaW9uLgorICogVGhlIG1haW4gYnVmZmVyIGxpZXMgYmV0d2VlbiB0aGUgcHJlLXByb2Nlc3NvciBhbmQgdGhlIEpQRUcKKyAqIGNvbXByZXNzb3IgcHJvcGVyOyBpdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhIGluIHRoZSBKUEVHIGNvbG9yc3BhY2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIE5vdGU6IGN1cnJlbnRseSwgdGhlcmUgaXMgbm8gb3BlcmF0aW5nIG1vZGUgaW4gd2hpY2ggYSBmdWxsLWltYWdlIGJ1ZmZlcgorICogaXMgbmVlZGVkIGF0IHRoaXMgc3RlcC4gIElmIHRoZXJlIHdlcmUsIHRoYXQgbW9kZSBjb3VsZCBub3QgYmUgdXNlZCB3aXRoCisgKiAicmF3IGRhdGEiIGlucHV0LCBzaW5jZSB0aGlzIG1vZHVsZSBpcyBieXBhc3NlZCBpbiB0aGF0IGNhc2UuICBIb3dldmVyLAorICogd2UndmUgbGVmdCB0aGUgY29kZSBoZXJlIGZvciBwb3NzaWJsZSB1c2UgaW4gc3BlY2lhbCBhcHBsaWNhdGlvbnMuCisgKi8KKyN1bmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgSkRJTUVOU0lPTiBjdXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBjdXJyZW50IGlNQ1Ugcm93ICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBfY3RyOwkvKiBjb3VudHMgcm93IGdyb3VwcyByZWNlaXZlZCBpbiBpTUNVIHJvdyAqLworICBib29sZWFuIHN1c3BlbmRlZDsJCS8qIHJlbWVtYmVyIGlmIHdlIHN1c3BlbmRlZCBvdXRwdXQgKi8KKyAgSl9CVUZfTU9ERSBwYXNzX21vZGU7CQkvKiBjdXJyZW50IG9wZXJhdGluZyBtb2RlICovCisKKyAgLyogSWYgdXNpbmcganVzdCBhIHN0cmlwIGJ1ZmZlciwgdGhpcyBwb2ludHMgdG8gdGhlIGVudGlyZSBzZXQgb2YgYnVmZmVycworICAgKiAod2UgYWxsb2NhdGUgb25lIGZvciBlYWNoIGNvbXBvbmVudCkuICBJbiB0aGUgZnVsbC1pbWFnZSBjYXNlLCB0aGlzCisgICAqIHBvaW50cyB0byB0aGUgY3VycmVudGx5IGFjY2Vzc2libGUgc3RyaXBzIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KKyAgICovCisgIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgIC8qIElmIHVzaW5nIGZ1bGwtaW1hZ2Ugc3RvcmFnZSwgdGhpcyBhcnJheSBob2xkcyBwb2ludGVycyB0byB2aXJ0dWFsLWFycmF5CisgICAqIGNvbnRyb2wgYmxvY2tzIGZvciBlYWNoIGNvbXBvbmVudC4gIFVudXNlZCBpZiBub3QgZnVsbC1pbWFnZSBzdG9yYWdlLgorICAgKi8KKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107CisjZW5kaWYKK30gbXlfbWFpbl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X21haW5fY29udHJvbGxlciAqIG15X21haW5fcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAorTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCSAgICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisKKyAgLyogRG8gbm90aGluZyBpbiByYXctZGF0YSBtb2RlLiAqLworICBpZiAoY2luZm8tPnJhd19kYXRhX2luKQorICAgIHJldHVybjsKKworICBtYWluLT5jdXJfaU1DVV9yb3cgPSAwOwkvKiBpbml0aWFsaXplIGNvdW50ZXJzICovCisgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgIG1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICBtYWluLT5wYXNzX21vZGUgPSBwYXNzX21vZGU7CS8qIHNhdmUgbW9kZSBmb3IgdXNlIGJ5IHByb2Nlc3NfZGF0YSAqLworCisgIHN3aXRjaCAocGFzc19tb2RlKSB7CisgIGNhc2UgSkJVRl9QQVNTX1RIUlU6CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICAgIG1haW4tPnB1Yi5wcm9jZXNzX2RhdGEgPSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW47CisgICAgYnJlYWs7CisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfU09VUkNFOgorICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgaWYgKG1haW4tPndob2xlX2ltYWdlWzBdID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbjsKKyAgICBicmVhazsKKyNlbmRpZgorICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YS4KKyAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHRoZSBzaW1wbGUgcGFzcy10aHJvdWdoIG1vZGUsCisgKiB3aGVyZSB3ZSBoYXZlIG9ubHkgYSBzdHJpcCBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIC8qIFJlYWQgaW5wdXQgZGF0YSBpZiB3ZSBoYXZlbid0IGZpbGxlZCB0aGUgbWFpbiBidWZmZXIgeWV0ICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisgICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCisJCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKKwkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAorCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7CisKKyAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgZnVsbCBpTUNVIHJvdyBidWZmZXJlZCwgcmV0dXJuIHRvIGFwcGxpY2F0aW9uIGZvcgorICAgICAqIG1vcmUgZGF0YS4gIE5vdGUgdGhhdCBwcmVwcm9jZXNzb3Igd2lsbCBhbHdheXMgcGFkIHRvIGZpbGwgdGhlIGlNQ1Ugcm93CisgICAgICogYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuCisgICAgICovCisgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciAhPSBEQ1RTSVpFKQorICAgICAgcmV0dXJuOworCisgICAgLyogU2VuZCB0aGUgY29tcGxldGVkIHJvdyB0byB0aGUgY29tcHJlc3NvciAqLworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworICAgICAgLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KKyAgICAgICAqIHN1c3BlbmQgcHJvY2Vzc2luZyBhbmQgcmV0dXJuIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEluIHRoaXMgc2l0dWF0aW9uCisgICAgICAgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKyAgICAgICAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorICAgICAgICogdGhpbmsgd2Ugd2VyZSBkb25lLgorICAgICAgICovCisgICAgICBpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKKwkoKmluX3Jvd19jdHIpLS07CisJbWFpbi0+c3VzcGVuZGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogV2UgZGlkIGZpbmlzaCB0aGUgcm93LiAgVW5kbyBvdXIgbGl0dGxlIHN1c3BlbnNpb24gaGFjayBpZiBhIHByZXZpb3VzCisgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCisgICAgICovCisgICAgaWYgKG1haW4tPnN1c3BlbmRlZCkgeworICAgICAgKCppbl9yb3dfY3RyKSsrOworICAgICAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7CisgICAgfQorICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7CisgICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7CisgIH0KK30KKworCisjaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgYWxsIG9mIHRoZSBtb2RlcyB0aGF0IHVzZSBhIGZ1bGwtc2l6ZSBidWZmZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfYnVmZmVyX21haW4gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBib29sZWFuIHdyaXRpbmcgPSAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfQ1JBTktfREVTVCk7CisKKyAgd2hpbGUgKG1haW4tPmN1cl9pTUNVX3JvdyA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICAvKiBSZWFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgaWYgYXQgdGhlIHN0YXJ0IG9mIGFuIGlNQ1Ugcm93LiAqLworICAgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPT0gMCkgeworICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgICBjaSsrLCBjb21wcHRyKyspIHsKKwltYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIG1haW4tPndob2xlX2ltYWdlW2NpXSwKKwkgICBtYWluLT5jdXJfaU1DVV9yb3cgKiAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLAorCSAgIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpLCB3cml0aW5nKTsKKyAgICAgIH0KKyAgICAgIC8qIEluIGEgcmVhZCBwYXNzLCBwcmV0ZW5kIHdlIGp1c3QgcmVhZCBzb21lIHNvdXJjZSBkYXRhLiAqLworICAgICAgaWYgKCEgd3JpdGluZykgeworCSppbl9yb3dfY3RyICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisJbWFpbi0+cm93Z3JvdXBfY3RyID0gRENUU0laRTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBhIHdyaXRlIHBhc3MsIHJlYWQgaW5wdXQgZGF0YSB1bnRpbCB0aGUgY3VycmVudCBpTUNVIHJvdyBpcyBmdWxsLiAqLworICAgIC8qIE5vdGU6IHByZXByb2Nlc3NvciB3aWxsIHBhZCBpZiBuZWNlc3NhcnkgdG8gZmlsbCB0aGUgbGFzdCBpTUNVIHJvdy4gKi8KKyAgICBpZiAod3JpdGluZykgeworICAgICAgKCpjaW5mby0+cHJlcC0+cHJlX3Byb2Nlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQlpbnB1dF9idWYsIGluX3Jvd19jdHIsIGluX3Jvd3NfYXZhaWwsCisJCQkJCW1haW4tPmJ1ZmZlciwgJm1haW4tPnJvd2dyb3VwX2N0ciwKKwkJCQkJKEpESU1FTlNJT04pIERDVFNJWkUpOworICAgICAgLyogUmV0dXJuIHRvIGFwcGxpY2F0aW9uIGlmIHdlIG5lZWQgbW9yZSBkYXRhIHRvIGZpbGwgdGhlIGlNQ1Ugcm93LiAqLworICAgICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA8IERDVFNJWkUpCisJcmV0dXJuOworICAgIH0KKworICAgIC8qIEVtaXQgZGF0YSwgdW5sZXNzIHRoaXMgaXMgYSBzaW5rLW9ubHkgcGFzcy4gKi8KKyAgICBpZiAobWFpbi0+cGFzc19tb2RlICE9IEpCVUZfU0FWRV9TT1VSQ0UpIHsKKyAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgbWFpbi0+YnVmZmVyKSkgeworCS8qIElmIGNvbXByZXNzb3IgZGlkIG5vdCBjb25zdW1lIHRoZSB3aG9sZSByb3csIHRoZW4gd2UgbXVzdCBuZWVkIHRvCisJICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KKwkgKiB3ZSBwcmV0ZW5kIHdlIGRpZG4ndCB5ZXQgY29uc3VtZSB0aGUgbGFzdCBpbnB1dCByb3c7IG90aGVyd2lzZSwgaWYKKwkgKiBpdCBoYXBwZW5lZCB0byBiZSB0aGUgbGFzdCByb3cgb2YgdGhlIGltYWdlLCB0aGUgYXBwbGljYXRpb24gd291bGQKKwkgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCisJICovCisJaWYgKCEgbWFpbi0+c3VzcGVuZGVkKSB7CisJICAoKmluX3Jvd19jdHIpLS07CisJICBtYWluLT5zdXNwZW5kZWQgPSBUUlVFOworCX0KKwlyZXR1cm47CisgICAgICB9CisgICAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKKyAgICAgICAqIGNhbGwgc3VzcGVuZGVkOyB0aGVuIG1hcmsgdGhlIG1haW4gYnVmZmVyIGVtcHR5LgorICAgICAgICovCisgICAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7CisJKCppbl9yb3dfY3RyKSsrOworCW1haW4tPnN1c3BlbmRlZCA9IEZBTFNFOworICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGdldCBoZXJlLCB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgaU1DVSByb3cuICBNYXJrIGJ1ZmZlciBlbXB0eS4gKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIG1haW4tPmN1cl9pTUNVX3JvdysrOworICB9Cit9CisKKyNlbmRpZiAvKiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9jX21haW5fY29udHJvbGxlciAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfbWFpbl9wdHIgbWFpbjsKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIG1haW4gPSAobXlfbWFpbl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfbWFpbl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5tYWluID0gKHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICopIG1haW47CisgIG1haW4tPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tYWluOworCisgIC8qIFdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIGEgYnVmZmVyIGluIHJhdy1kYXRhIG1vZGUuICovCisgIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCisgICAgcmV0dXJuOworCisgIC8qIENyZWF0ZSB0aGUgYnVmZmVyLiAgSXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSwgc28gZWFjaCBjb21wb25lbnQKKyAgICogbWF5IGJlIG9mIGEgZGlmZmVyZW50IHNpemUuCisgICAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgLyogTm90ZSB3ZSBwYWQgdGhlIGJvdHRvbSB0byBhIG11bHRpcGxlIG9mIHRoZSBpTUNVIGhlaWdodCAqLworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAorCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAorCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSAqIERDVFNJWkUsCisJIChKRElNRU5TSU9OKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgICB9CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyNlbmRpZgorICB9IGVsc2UgeworI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECisgICAgbWFpbi0+d2hvbGVfaW1hZ2VbMF0gPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworI2VuZGlmCisgICAgLyogQWxsb2NhdGUgYSBzdHJpcCBidWZmZXIgZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBtYWluLT5idWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSwKKwkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFya2VyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNtYXJrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDFlNmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFya2VyLmMKQEAgLTAsMCArMSw2NjQgQEAKKy8qCisgKiBqY21hcmtlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKK3R5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KKyAgTV9TT0YwICA9IDB4YzAsCisgIE1fU09GMSAgPSAweGMxLAorICBNX1NPRjIgID0gMHhjMiwKKyAgTV9TT0YzICA9IDB4YzMsCisgIAorICBNX1NPRjUgID0gMHhjNSwKKyAgTV9TT0Y2ICA9IDB4YzYsCisgIE1fU09GNyAgPSAweGM3LAorICAKKyAgTV9KUEcgICA9IDB4YzgsCisgIE1fU09GOSAgPSAweGM5LAorICBNX1NPRjEwID0gMHhjYSwKKyAgTV9TT0YxMSA9IDB4Y2IsCisgIAorICBNX1NPRjEzID0gMHhjZCwKKyAgTV9TT0YxNCA9IDB4Y2UsCisgIE1fU09GMTUgPSAweGNmLAorICAKKyAgTV9ESFQgICA9IDB4YzQsCisgIAorICBNX0RBQyAgID0gMHhjYywKKyAgCisgIE1fUlNUMCAgPSAweGQwLAorICBNX1JTVDEgID0gMHhkMSwKKyAgTV9SU1QyICA9IDB4ZDIsCisgIE1fUlNUMyAgPSAweGQzLAorICBNX1JTVDQgID0gMHhkNCwKKyAgTV9SU1Q1ICA9IDB4ZDUsCisgIE1fUlNUNiAgPSAweGQ2LAorICBNX1JTVDcgID0gMHhkNywKKyAgCisgIE1fU09JICAgPSAweGQ4LAorICBNX0VPSSAgID0gMHhkOSwKKyAgTV9TT1MgICA9IDB4ZGEsCisgIE1fRFFUICAgPSAweGRiLAorICBNX0ROTCAgID0gMHhkYywKKyAgTV9EUkkgICA9IDB4ZGQsCisgIE1fREhQICAgPSAweGRlLAorICBNX0VYUCAgID0gMHhkZiwKKyAgCisgIE1fQVBQMCAgPSAweGUwLAorICBNX0FQUDEgID0gMHhlMSwKKyAgTV9BUFAyICA9IDB4ZTIsCisgIE1fQVBQMyAgPSAweGUzLAorICBNX0FQUDQgID0gMHhlNCwKKyAgTV9BUFA1ICA9IDB4ZTUsCisgIE1fQVBQNiAgPSAweGU2LAorICBNX0FQUDcgID0gMHhlNywKKyAgTV9BUFA4ICA9IDB4ZTgsCisgIE1fQVBQOSAgPSAweGU5LAorICBNX0FQUDEwID0gMHhlYSwKKyAgTV9BUFAxMSA9IDB4ZWIsCisgIE1fQVBQMTIgPSAweGVjLAorICBNX0FQUDEzID0gMHhlZCwKKyAgTV9BUFAxNCA9IDB4ZWUsCisgIE1fQVBQMTUgPSAweGVmLAorICAKKyAgTV9KUEcwICA9IDB4ZjAsCisgIE1fSlBHMTMgPSAweGZkLAorICBNX0NPTSAgID0gMHhmZSwKKyAgCisgIE1fVEVNICAgPSAweDAxLAorICAKKyAgTV9FUlJPUiA9IDB4MTAwCit9IEpQRUdfTUFSS0VSOworCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIHVuc2lnbmVkIGludCBsYXN0X3Jlc3RhcnRfaW50ZXJ2YWw7IC8qIGxhc3QgRFJJIHZhbHVlIGVtaXR0ZWQ7IDAgYWZ0ZXIgU09JICovCit9IG15X21hcmtlcl93cml0ZXI7CisKK3R5cGVkZWYgbXlfbWFya2VyX3dyaXRlciAqIG15X21hcmtlcl9wdHI7CisKKworLyoKKyAqIEJhc2ljIG91dHB1dCByb3V0aW5lcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiB3aGlsZSB3cml0aW5nIGEgbWFya2VyLgorICogVGhlcmVmb3JlLCBhbiBhcHBsaWNhdGlvbiB1c2luZyBzdXNwZW5zaW9uIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHRoZSBpbml0aWFsIG1hcmtlcnMgKHR5cC4gNjAwLTcwMCBieXRlcykgYmVmb3JlCisgKiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MsIGFuZCBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHRyYWlsaW5nIEVPSQorICogKGEgZmV3IGJ5dGVzKSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcy4gIE11bHRpcGFzcyBjb21wcmVzc2lvbgorICogbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIHdpdGggc3VzcGVuc2lvbiwgc28gdGhvc2UgdHdvIGFyZSB0aGUgb25seQorICogcG9pbnRzIHdoZXJlIG1hcmtlcnMgd2lsbCBiZSB3cml0dGVuLgorICovCisKK0xPQ0FMKHZvaWQpCitlbWl0X2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQorLyogRW1pdCBhIGJ5dGUgKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGNpbmZvLT5kZXN0OworCisgICooZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkrKyA9IChKT0NURVQpIHZhbDsKKyAgaWYgKC0tZGVzdC0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgeworICAgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGNpbmZvKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIG1hcmspCisvKiBFbWl0IGEgbWFya2VyIGNvZGUgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSBtYXJrKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF8yYnl0ZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsdWUpCisvKiBFbWl0IGEgMi1ieXRlIGludGVnZXI7IHRoZXNlIGFyZSBhbHdheXMgTVNCIGZpcnN0IGluIEpQRUcgZmlsZXMgKi8KK3sKKyAgZW1pdF9ieXRlKGNpbmZvLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCB2YWx1ZSAmIDB4RkYpOworfQorCisKKy8qCisgKiBSb3V0aW5lcyB0byB3cml0ZSBzcGVjaWZpYyBtYXJrZXIgdHlwZXMuCisgKi8KKworTE9DQUwoaW50KQorZW1pdF9kcXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgpCisvKiBFbWl0IGEgRFFUIG1hcmtlciAqLworLyogUmV0dXJucyB0aGUgcHJlY2lzaW9uIHVzZWQgKDAgPSA4Yml0cywgMSA9IDE2Yml0cykgZm9yIGJhc2VsaW5lIGNoZWNraW5nICovCit7CisgIEpRVUFOVF9UQkwgKiBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2luZGV4XTsKKyAgaW50IHByZWM7CisgIGludCBpOworCisgIGlmIChxdGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIGluZGV4KTsKKworICBwcmVjID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICBpZiAocXRibC0+cXVhbnR2YWxbaV0gPiAyNTUpCisgICAgICBwcmVjID0gMTsKKyAgfQorCisgIGlmICghIHF0YmwtPnNlbnRfdGFibGUpIHsKKyAgICBlbWl0X21hcmtlcihjaW5mbywgTV9EUVQpOworCisgICAgZW1pdF8yYnl0ZXMoY2luZm8sIHByZWMgPyBEQ1RTSVpFMioyICsgMSArIDIgOiBEQ1RTSVpFMiArIDEgKyAyKTsKKworICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXggKyAocHJlYzw8NCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIC8qIFRoZSB0YWJsZSBlbnRyaWVzIG11c3QgYmUgZW1pdHRlZCBpbiB6aWd6YWcgb3JkZXIuICovCisgICAgICB1bnNpZ25lZCBpbnQgcXZhbCA9IHF0YmwtPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV07CisgICAgICBpZiAocHJlYykKKwllbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsID4+IDgpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgJiAweEZGKSk7CisgICAgfQorCisgICAgcXRibC0+c2VudF90YWJsZSA9IFRSVUU7CisgIH0KKworICByZXR1cm4gcHJlYzsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kaHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNfYWMpCisvKiBFbWl0IGEgREhUIG1hcmtlciAqLworeworICBKSFVGRl9UQkwgKiBodGJsOworICBpbnQgbGVuZ3RoLCBpOworICAKKyAgaWYgKGlzX2FjKSB7CisgICAgaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICBpbmRleCArPSAweDEwOwkJLyogb3V0cHV0IGluZGV4IGhhcyBBQyBiaXQgc2V0ICovCisgIH0gZWxzZSB7CisgICAgaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgfQorCisgIGlmIChodGJsID09IE5VTEwpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgaW5kZXgpOworICAKKyAgaWYgKCEgaHRibC0+c2VudF90YWJsZSkgeworICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RIVCk7CisgICAgCisgICAgbGVuZ3RoID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCisgICAgICBsZW5ndGggKz0gaHRibC0+Yml0c1tpXTsKKyAgICAKKyAgICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoICsgMiArIDEgKyAxNik7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCk7CisgICAgCisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQorICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5iaXRzW2ldKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmh1ZmZ2YWxbaV0pOworICAgIAorICAgIGh0YmwtPnNlbnRfdGFibGUgPSBUUlVFOworICB9Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfZGFjIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBEQUMgbWFya2VyICovCisvKiBTaW5jZSB0aGUgdXNlZnVsIGluZm8gaXMgc28gc21hbGwsIHdlIHdhbnQgdG8gZW1pdCBhbGwgdGhlIHRhYmxlcyBpbiAqLworLyogb25lIERBQyBtYXJrZXIuICBUaGVyZWZvcmUgdGhpcyByb3V0aW5lIGRvZXMgaXRzIG93biBzY2FuIG9mIHRoZSB0YWJsZS4gKi8KK3sKKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgY2hhciBkY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOworICBjaGFyIGFjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107CisgIGludCBsZW5ndGgsIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIAorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKKyAgICBkY19pbl91c2VbaV0gPSBhY19pbl91c2VbaV0gPSAwOworICAKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07CisgICAgZGNfaW5fdXNlW2NvbXBwdHItPmRjX3RibF9ub10gPSAxOworICAgIGFjX2luX3VzZVtjb21wcHRyLT5hY190Ymxfbm9dID0gMTsKKyAgfQorICAKKyAgbGVuZ3RoID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCisgICAgbGVuZ3RoICs9IGRjX2luX3VzZVtpXSArIGFjX2luX3VzZVtpXTsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RBQyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoKjIgKyAyKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgaWYgKGRjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpKTsKKyAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2RjX0xbaV0gKyAoY2luZm8tPmFyaXRoX2RjX1VbaV08PDQpKTsKKyAgICB9CisgICAgaWYgKGFjX2luX3VzZVtpXSkgeworICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpICsgMHgxMCk7CisgICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9hY19LW2ldKTsKKyAgICB9CisgIH0KKyNlbmRpZiAvKiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9kcmkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIERSSSBtYXJrZXIgKi8KK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFJJKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCA0KTsJLyogZml4ZWQgbGVuZ3RoICovCisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb2YgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBjb2RlKQorLyogRW1pdCBhIFNPRiBtYXJrZXIgKi8KK3sKKyAgaW50IGNpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgZW1pdF9tYXJrZXIoY2luZm8sIGNvZGUpOworICAKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KKyAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKKworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOworICAgIGVtaXRfYnl0ZShjaW5mbywgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPDwgNCkgKyBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9zb3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRW1pdCBhIFNPUyBtYXJrZXIgKi8KK3sKKyAgaW50IGksIHRkLCB0YTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPUyk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiAqIGNpbmZvLT5jb21wc19pbl9zY2FuICsgMiArIDEgKyAzKTsgLyogbGVuZ3RoICovCisgIAorICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5jb21wc19pbl9zY2FuKTsKKyAgCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOworICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKKyAgICB0ZCA9IGNvbXBwdHItPmRjX3RibF9ubzsKKyAgICB0YSA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyAgICAgIC8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW47CisgICAgICAgKiBmdXJ0aGVybW9yZSwgSHVmZm1hbiBjb2Rpbmcgb2YgREMgcmVmaW5lbWVudCB1c2VzIG5vIHRhYmxlIGF0IGFsbC4KKyAgICAgICAqIFdlIGVtaXQgMCBmb3IgdW51c2VkIGZpZWxkKHMpOyB0aGlzIGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBQJk0gdGV4dAorICAgICAgICogYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZC4KKyAgICAgICAqLworICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7CisJdGEgPSAwOwkJCS8qIERDIHNjYW4gKi8KKwlpZiAoY2luZm8tPkFoICE9IDAgJiYgIWNpbmZvLT5hcml0aF9jb2RlKQorCSAgdGQgPSAwOwkJLyogbm8gREMgdGFibGUgZWl0aGVyICovCisgICAgICB9IGVsc2UgeworCXRkID0gMDsJCQkvKiBBQyBzY2FuICovCisgICAgICB9CisgICAgfQorICAgIGVtaXRfYnl0ZShjaW5mbywgKHRkIDw8IDQpICsgdGEpOworICB9CisKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U3MpOworICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5TZSk7CisgIGVtaXRfYnl0ZShjaW5mbywgKGNpbmZvLT5BaCA8PCA0KSArIGNpbmZvLT5BbCk7Cit9CisKKworTE9DQUwodm9pZCkKK2VtaXRfamZpZl9hcHAwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYSBKRklGLWNvbXBsaWFudCBBUFAwIG1hcmtlciAqLworeworICAvKgorICAgKiBMZW5ndGggb2YgQVBQMCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNCBieXRlcyAtIEFTQ0lJICJKRklGIikKKyAgICogWmVybyBieXRlCQkJKDEgYnl0ZSB0byB0ZXJtaW5hdGUgdGhlIElEIHN0cmluZykKKyAgICogVmVyc2lvbiBNYWpvciwgTWlub3IJKDIgYnl0ZXMgLSBtYWpvciBmaXJzdCkKKyAgICogVW5pdHMJCQkoMSBieXRlIC0gMHgwMCA9IG5vbmUsIDB4MDEgPSBpbmNoLCAweDAyID0gY20pCisgICAqIFhkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgaG9yaXpvbnRhbCkKKyAgICogWWRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCB2ZXJ0aWNhbCkKKyAgICogVGh1bWJuYWlsIFggc2l6ZQkJKDEgYnl0ZSkKKyAgICogVGh1bWJuYWlsIFkgc2l6ZQkJKDEgYnl0ZSkKKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAwKTsKKyAgCisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNCArIDEgKyAyICsgMSArIDIgKyAyICsgMSArIDEpOyAvKiBsZW5ndGggKi8KKworICBlbWl0X2J5dGUoY2luZm8sIDB4NEEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiSkZJRiIgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uKTsgLyogVmVyc2lvbiBmaWVsZHMgKi8KKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKKyAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGVuc2l0eV91bml0KTsgLyogUGl4ZWwgc2l6ZSBpbmZvcm1hdGlvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPlhfZGVuc2l0eSk7CisgIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WV9kZW5zaXR5KTsKKyAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJCS8qIE5vIHRodW1ibmFpbCBpbWFnZSAqLworICBlbWl0X2J5dGUoY2luZm8sIDApOworfQorCisKK0xPQ0FMKHZvaWQpCitlbWl0X2Fkb2JlX2FwcDE0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKKy8qIEVtaXQgYW4gQWRvYmUgQVBQMTQgbWFya2VyICovCit7CisgIC8qCisgICAqIExlbmd0aCBvZiBBUFAxNCBibG9jawkoMiBieXRlcykKKyAgICogQmxvY2sgSUQJCQkoNSBieXRlcyAtIEFTQ0lJICJBZG9iZSIpCisgICAqIFZlcnNpb24gTnVtYmVyCQkoMiBieXRlcyAtIGN1cnJlbnRseSAxMDApCisgICAqIEZsYWdzMAkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIEZsYWdzMQkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCisgICAqIENvbG9yIHRyYW5zZm9ybQkJKDEgYnl0ZSkKKyAgICoKKyAgICogQWx0aG91Z2ggQWRvYmUgVE4gNTExNiBtZW50aW9ucyBWZXJzaW9uID0gMTAxLCBhbGwgdGhlIEFkb2JlIGZpbGVzCisgICAqIG5vdyBpbiBjaXJjdWxhdGlvbiBzZWVtIHRvIHVzZSBWZXJzaW9uID0gMTAwLCBzbyB0aGF0J3Mgd2hhdCB3ZSB3cml0ZS4KKyAgICoKKyAgICogV2Ugd3JpdGUgdGhlIGNvbG9yIHRyYW5zZm9ybSBieXRlIGFzIDEgaWYgdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMKKyAgICogWUNiQ3IsIDIgaWYgaXQncyBZQ0NLLCAwIG90aGVyd2lzZS4gIEFkb2JlJ3MgZGVmaW5pdGlvbiBoYXMgdG8gZG8gd2l0aAorICAgKiB3aGV0aGVyIHRoZSBlbmNvZGVyIHBlcmZvcm1lZCBhIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyBwcmV0dHkgdXNlbGVzcy4KKyAgICovCisgIAorICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAxNCk7CisgIAorICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDUgKyAyICsgMiArIDIgKyAxKTsgLyogbGVuZ3RoICovCisKKyAgZW1pdF9ieXRlKGNpbmZvLCAweDQxKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkFkb2JlIiAqLworICBlbWl0X2J5dGUoY2luZm8sIDB4NjQpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NkYpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjIpOworICBlbWl0X2J5dGUoY2luZm8sIDB4NjUpOworICBlbWl0XzJieXRlcyhjaW5mbywgMTAwKTsJLyogVmVyc2lvbiAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMCAqLworICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMSAqLworICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGVtaXRfYnl0ZShjaW5mbywgMSk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDEgKi8KKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNDSzoKKyAgICBlbWl0X2J5dGUoY2luZm8sIDIpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAyICovCisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMCAqLworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIGFsbG93IHdyaXRpbmcgYW4gYXJiaXRyYXJ5IG1hcmtlciB3aXRoIHBhcmFtZXRlcnMuCisgKiBUaGUgb25seSBpbnRlbmRlZCB1c2UgaXMgdG8gZW1pdCBDT00gb3IgQVBQbiBtYXJrZXJzIGFmdGVyIGNhbGxpbmcKKyAqIHdyaXRlX2ZpbGVfaGVhZGVyIGFuZCBiZWZvcmUgY2FsbGluZyB3cml0ZV9mcmFtZV9oZWFkZXIuCisgKiBPdGhlciB1c2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGRlc2lyYWJsZSByZXN1bHRzLgorICogQ291bnRpbmcgdGhlIHBhcmFtZXRlciBieXRlcyBwcm9wZXJseSBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCisvKiBFbWl0IGFuIGFyYml0cmFyeSBtYXJrZXIgaGVhZGVyICovCit7CisgIGlmIChkYXRhbGVuID4gKHVuc2lnbmVkIGludCkgNjU1MzMpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCAoSlBFR19NQVJLRVIpIG1hcmtlcik7CisKKyAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIChkYXRhbGVuICsgMikpOwkvKiB0b3RhbCBsZW5ndGggKi8KK30KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9tYXJrZXJfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCisvKiBFbWl0IG9uZSBieXRlIG9mIG1hcmtlciBwYXJhbWV0ZXJzIGZvbGxvd2luZyB3cml0ZV9tYXJrZXJfaGVhZGVyICovCit7CisgIGVtaXRfYnl0ZShjaW5mbywgdmFsKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIGFuIFNPSSBhbmQgb3B0aW9uYWwgQVBQbiBtYXJrZXJzLgorICogV2UgcmVjb21tZW5kIHVzZSBvZiB0aGUgSkZJRiBtYXJrZXIsIGJ1dCBub3QgdGhlIEFkb2JlIG1hcmtlciwKKyAqIHdoZW4gdXNpbmcgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEuICBUaGUgSkZJRiBtYXJrZXIgc2hvdWxkIE5PVAorICogYmUgdXNlZCBmb3IgYW55IG90aGVyIEpQRUcgY29sb3JzcGFjZS4gIFRoZSBBZG9iZSBtYXJrZXIgaXMgaGVscGZ1bAorICogdG8gZGlzdGluZ3Vpc2ggUkdCLCBDTVlLLCBhbmQgWUNDSyBjb2xvcnNwYWNlcy4KKyAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYWRkaXRpb25hbCBoZWFkZXIgbWFya2VycyBhZnRlcgorICoganBlZ19zdGFydF9jb21wcmVzcyByZXR1cm5zLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CS8qIGZpcnN0IHRoZSBTT0kgKi8KKworICAvKiBTT0kgaXMgZGVmaW5lZCB0byByZXNldCByZXN0YXJ0IGludGVydmFsIHRvIDAgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworCisgIGlmIChjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIpCS8qIG5leHQgYW4gb3B0aW9uYWwgSkZJRiBBUFAwICovCisgICAgZW1pdF9qZmlmX2FwcDAoY2luZm8pOworICBpZiAoY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlcikgLyogbmV4dCBhbiBvcHRpb25hbCBBZG9iZSBBUFAxNCAqLworICAgIGVtaXRfYWRvYmVfYXBwMTQoY2luZm8pOworfQorCisKKy8qCisgKiBXcml0ZSBmcmFtZSBoZWFkZXIuCisgKiBUaGlzIGNvbnNpc3RzIG9mIERRVCBhbmQgU09GbiBtYXJrZXJzLgorICogTm90ZSB0aGF0IHdlIGRvIG5vdCBlbWl0IHRoZSBTT0YgdW50aWwgd2UgaGF2ZSBlbWl0dGVkIHRoZSBEUVQocykuCisgKiBUaGlzIGF2b2lkcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0CisgKiB0cnkgdG8gZXJyb3ItY2hlY2sgdGhlIHF1YW50IHRhYmxlIG51bWJlcnMgYXMgc29vbiBhcyB0aGV5IHNlZSB0aGUgU09GLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZnJhbWVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGNpLCBwcmVjOworICBib29sZWFuIGlzX2Jhc2VsaW5lOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgLyogRW1pdCBEUVQgZm9yIGVhY2ggcXVhbnRpemF0aW9uIHRhYmxlLgorICAgKiBOb3RlIHRoYXQgZW1pdF9kcXQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgorICAgKi8KKyAgcHJlYyA9IDA7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcHJlYyArPSBlbWl0X2RxdChjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKKyAgfQorICAvKiBub3cgcHJlYyBpcyBub256ZXJvIGlmZiB0aGVyZSBhcmUgYW55IDE2LWJpdCBxdWFudCB0YWJsZXMuICovCisKKyAgLyogQ2hlY2sgZm9yIGEgbm9uLWJhc2VsaW5lIHNwZWNpZmljYXRpb24uCisgICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgSHVmZm1hbiB0YWJsZSBudW1iZXJzIHdvbid0IGJlIGNoYW5nZWQgbGF0ZXIuCisgICAqLworICBpZiAoY2luZm8tPmFyaXRoX2NvZGUgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwKKyAgICAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSA4KSB7CisgICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBpc19iYXNlbGluZSA9IFRSVUU7CisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBpZiAoY29tcHB0ci0+ZGNfdGJsX25vID4gMSB8fCBjb21wcHRyLT5hY190Ymxfbm8gPiAxKQorCWlzX2Jhc2VsaW5lID0gRkFMU0U7CisgICAgfQorICAgIGlmIChwcmVjICYmIGlzX2Jhc2VsaW5lKSB7CisgICAgICBpc19iYXNlbGluZSA9IEZBTFNFOworICAgICAgLyogSWYgaXQncyBiYXNlbGluZSBleGNlcHQgZm9yIHF1YW50aXplciBzaXplLCB3YXJuIHRoZSB1c2VyICovCisgICAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDXzE2QklUX1RBQkxFUyk7CisgICAgfQorICB9CisKKyAgLyogRW1pdCB0aGUgcHJvcGVyIFNPRiBtYXJrZXIgKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GOSk7CS8qIFNPRiBjb2RlIGZvciBhcml0aG1ldGljIGNvZGluZyAqLworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjIpOwkvKiBTT0YgY29kZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiAqLworICAgIGVsc2UgaWYgKGlzX2Jhc2VsaW5lKQorICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMCk7CS8qIFNPRiBjb2RlIGZvciBiYXNlbGluZSBpbXBsZW1lbnRhdGlvbiAqLworICAgIGVsc2UKKyAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjEpOwkvKiBTT0YgY29kZSBmb3Igbm9uLWJhc2VsaW5lIEh1ZmZtYW4gZmlsZSAqLworICB9Cit9CisKKworLyoKKyAqIFdyaXRlIHNjYW4gaGVhZGVyLgorICogVGhpcyBjb25zaXN0cyBvZiBESFQgb3IgREFDIG1hcmtlcnMsIG9wdGlvbmFsIERSSSwgYW5kIFNPUy4KKyAqIENvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZm9sbG93aW5nIHRoZSBTT1MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9zY2FuX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGludCBpOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIC8qIEVtaXQgYXJpdGggY29uZGl0aW9uaW5nIGluZm8uICBXZSBtYXkgaGF2ZSBzb21lIGR1cGxpY2F0aW9uCisgICAgICogaWYgdGhlIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBidXQgaXQncyBzbyBzbWFsbCBpdCdzIGhhcmRseQorICAgICAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgorICAgICAqLworICAgIGVtaXRfZGFjKGNpbmZvKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBFbWl0IEh1ZmZtYW4gdGFibGVzLgorICAgICAqIE5vdGUgdGhhdCBlbWl0X2RodCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworCS8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW4gKi8KKwlpZiAoY2luZm8tPlNzID09IDApIHsKKwkgIGlmIChjaW5mby0+QWggPT0gMCkJLyogREMgbmVlZHMgbm8gdGFibGUgZm9yIHJlZmluZW1lbnQgc2NhbiAqLworCSAgICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7CisJfSBlbHNlIHsKKwkgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOworCX0KKyAgICAgIH0gZWxzZSB7CisJLyogU2VxdWVudGlhbCBtb2RlOiBuZWVkIGJvdGggREMgYW5kIEFDIHRhYmxlcyAqLworCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKKwllbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBFbWl0IERSSSBpZiByZXF1aXJlZCAtLS0gbm90ZSB0aGF0IERSSSB2YWx1ZSBjb3VsZCBjaGFuZ2UgZm9yIGVhY2ggc2Nhbi4KKyAgICogV2UgYXZvaWQgd2FzdGluZyBzcGFjZSB3aXRoIHVubmVjZXNzYXJ5IERSSXMsIGhvd2V2ZXIuCisgICAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgIT0gbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBlbWl0X2RyaShjaW5mbyk7CisgICAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgfQorCisgIGVtaXRfc29zKGNpbmZvKTsKK30KKworCisvKgorICogV3JpdGUgZGF0YXN0cmVhbSB0cmFpbGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV90cmFpbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKK30KKworCisvKgorICogV3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUtc3BlY2lmaWNhdGlvbiBkYXRhc3RyZWFtLgorICogVGhpcyBjb25zaXN0cyBvZiBTT0ksIERRVCBhbmQgREhUIHRhYmxlcywgYW5kIEVPSS4KKyAqIEFueSB0YWJsZSB0aGF0IGlzIGRlZmluZWQgYW5kIG5vdCBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgd2lsbCBiZQorICogZW1pdHRlZC4gIE5vdGUgdGhhdCBhbGwgdGFibGVzIHdpbGwgYmUgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIGF0IGV4aXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV90YWJsZXNfb25seSAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKKyAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW2ldICE9IE5VTEwpCisgICAgICAodm9pZCkgZW1pdF9kcXQoY2luZm8sIGkpOworICB9CisKKyAgaWYgKCEgY2luZm8tPmFyaXRoX2NvZGUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7CisgICAgICBpZiAoY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKKwllbWl0X2RodChjaW5mbywgaSwgRkFMU0UpOworICAgICAgaWYgKGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCisJZW1pdF9kaHQoY2luZm8sIGksIFRSVUUpOworICAgIH0KKyAgfQorCisgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgbW9kdWxlLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWFya2VyX3dyaXRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyOworCisgIC8qIENyZWF0ZSB0aGUgc3Vib2JqZWN0ICovCisgIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21hcmtlcl93cml0ZXIpKTsKKyAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICopIG1hcmtlcjsKKyAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KKyAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV9oZWFkZXIgPSB3cml0ZV9maWxlX2hlYWRlcjsKKyAgbWFya2VyLT5wdWIud3JpdGVfZnJhbWVfaGVhZGVyID0gd3JpdGVfZnJhbWVfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9zY2FuX2hlYWRlciA9IHdyaXRlX3NjYW5faGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX3RyYWlsZXIgPSB3cml0ZV9maWxlX3RyYWlsZXI7CisgIG1hcmtlci0+cHViLndyaXRlX3RhYmxlc19vbmx5ID0gd3JpdGVfdGFibGVzX29ubHk7CisgIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9oZWFkZXIgPSB3cml0ZV9tYXJrZXJfaGVhZGVyOworICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfYnl0ZSA9IHdyaXRlX21hcmtlcl9ieXRlOworICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgKi8KKyAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFzdGVyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNtYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI0MDIwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjbWFzdGVyLmMKQEAgLTAsMCArMSw1OTAgQEAKKy8qCisgKiBqY21hc3Rlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggcGFyYW1ldGVyIHZhbGlkYXRpb24sIGluaXRpYWwgc2V0dXAsCisgKiBhbmQgaW50ZXItcGFzcyBjb250cm9sIChkZXRlcm1pbmluZyB0aGUgbnVtYmVyIG9mIHBhc3NlcyBhbmQgdGhlIHdvcmsgCisgKiB0byBiZSBkb25lIGluIGVhY2ggcGFzcykuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBlbnVtIHsKKwltYWluX3Bhc3MsCQkvKiBpbnB1dCBkYXRhLCBhbHNvIGRvIGZpcnN0IG91dHB1dCBzdGVwICovCisJaHVmZl9vcHRfcGFzcywJCS8qIEh1ZmZtYW4gY29kZSBvcHRpbWl6YXRpb24gcGFzcyAqLworCW91dHB1dF9wYXNzCQkvKiBkYXRhIG91dHB1dCBwYXNzICovCit9IGNfcGFzc190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGNfcGFzc190eXBlIHBhc3NfdHlwZTsJLyogdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgcGFzcyAqLworCisgIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgIyBvZiBwYXNzZXMgbmVlZGVkICovCisKKyAgaW50IHNjYW5fbnVtYmVyOwkJLyogY3VycmVudCBpbmRleCBpbiBzY2FuX2luZm9bXSAqLworfSBteV9jb21wX21hc3RlcjsKKwordHlwZWRlZiBteV9jb21wX21hc3RlciAqIG15X21hc3Rlcl9wdHI7CisKKworLyoKKyAqIFN1cHBvcnQgcm91dGluZXMgdGhhdCBkbyB2YXJpb3VzIGVzc2VudGlhbCBjYWxjdWxhdGlvbnMuCisgKi8KKworTE9DQUwodm9pZCkKK2luaXRpYWxfc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgbWFzdGVyIHNlbGVjdGlvbiBwaGFzZSAqLworeworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGxvbmcgc2FtcGxlc3BlcnJvdzsKKyAgSkRJTUVOU0lPTiBqZF9zYW1wbGVzcGVycm93OworCisgIC8qIFNhbml0eSBjaGVjayBvbiBpbWFnZSBkaW1lbnNpb25zICovCisgIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKKyAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwIHx8IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzIDw9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9FTVBUWV9JTUFHRSk7CisKKyAgLyogTWFrZSBzdXJlIGltYWdlIGlzbid0IGJpZ2dlciB0aGFuIEkgY2FuIGhhbmRsZSAqLworICBpZiAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OIHx8CisgICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9JTUFHRV9UT09fQklHLCAodW5zaWduZWQgaW50KSBKUEVHX01BWF9ESU1FTlNJT04pOworCisgIC8qIFdpZHRoIG9mIGFuIGlucHV0IHNjYW5saW5lIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyBKRElNRU5TSU9OLiAqLworICBzYW1wbGVzcGVycm93ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKKyAgamRfc2FtcGxlc3BlcnJvdyA9IChKRElNRU5TSU9OKSBzYW1wbGVzcGVycm93OworICBpZiAoKGxvbmcpIGpkX3NhbXBsZXNwZXJyb3cgIT0gc2FtcGxlc3BlcnJvdykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKworICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLworICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOworCisgIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCisgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgIE1BWF9DT01QT05FTlRTKTsKKworICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCisgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7CisgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKKwljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOworICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7CisgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKKwkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgfQorCisgIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogRmlsbCBpbiB0aGUgY29ycmVjdCBjb21wb25lbnRfaW5kZXggdmFsdWU7IGRvbid0IHJlbHkgb24gYXBwbGljYXRpb24gKi8KKyAgICBjb21wcHRyLT5jb21wb25lbnRfaW5kZXggPSBjaTsKKyAgICAvKiBGb3IgY29tcHJlc3Npb24sIHdlIG5ldmVyIGRvIERDVCBzY2FsaW5nLiAqLworICAgIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgICAgLyogU2l6ZSBpbiBEQ1QgYmxvY2tzICovCisgICAgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSkpOworICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOworICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkICh0aGlzIGZsYWcgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IgY29tcHJlc3Npb24pICovCisgICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7CisgIH0KKworICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cyAobnVtYmVyIG9mIHRpbWVzIHRoYXQKKyAgICogbWFpbiBjb250cm9sbGVyIHdpbGwgY2FsbCBjb2VmZmljaWVudCBjb250cm9sbGVyKS4KKyAgICovCisgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKKyAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKK30KKworCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKK0xPQ0FMKHZvaWQpCit2YWxpZGF0ZV9zY3JpcHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogVmVyaWZ5IHRoYXQgdGhlIHNjYW4gc2NyaXB0IGluIGNpbmZvLT5zY2FuX2luZm9bXSBpcyB2YWxpZDsgYWxzbworICogZGV0ZXJtaW5lIHdoZXRoZXIgaXQgdXNlcyBwcm9ncmVzc2l2ZSBKUEVHLCBhbmQgc2V0IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlLgorICovCit7CisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKyAgaW50IHNjYW5ubywgbmNvbXBzLCBjaSwgY29lZmksIHRoaXNpOworICBpbnQgU3MsIFNlLCBBaCwgQWw7CisgIGJvb2xlYW4gY29tcG9uZW50X3NlbnRbTUFYX0NPTVBPTkVOVFNdOworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgIGludCAqIGxhc3RfYml0cG9zX3B0cjsKKyAgaW50IGxhc3RfYml0cG9zW01BWF9DT01QT05FTlRTXVtEQ1RTSVpFMl07CisgIC8qIC0xIHVudGlsIHRoYXQgY29lZmZpY2llbnQgaGFzIGJlZW4gc2VlbjsgdGhlbiBsYXN0IEFsIGZvciBpdCAqLworI2VuZGlmCisKKyAgaWYgKGNpbmZvLT5udW1fc2NhbnMgPD0gMCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU0NBTl9TQ1JJUFQsIDApOworCisgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBzY2FucyBtdXN0IGhhdmUgU3M9MCwgU2U9RENUU0laRTItMTsKKyAgICogZm9yIHByb2dyZXNzaXZlIEpQRUcsIG5vIHNjYW4gY2FuIGhhdmUgdGhpcy4KKyAgICovCisgIHNjYW5wdHIgPSBjaW5mby0+c2Nhbl9pbmZvOworICBpZiAoc2NhbnB0ci0+U3MgIT0gMCB8fCBzY2FucHRyLT5TZSAhPSBEQ1RTSVpFMi0xKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IFRSVUU7CisgICAgbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1swXVswXTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIAorICAgICAgZm9yIChjb2VmaSA9IDA7IGNvZWZpIDwgRENUU0laRTI7IGNvZWZpKyspCisJKmxhc3RfYml0cG9zX3B0cisrID0gLTE7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKKyAgICAgIGNvbXBvbmVudF9zZW50W2NpXSA9IEZBTFNFOworICB9CisKKyAgZm9yIChzY2Fubm8gPSAxOyBzY2Fubm8gPD0gY2luZm8tPm51bV9zY2Fuczsgc2NhbnB0cisrLCBzY2Fubm8rKykgeworICAgIC8qIFZhbGlkYXRlIGNvbXBvbmVudCBpbmRleGVzICovCisgICAgbmNvbXBzID0gc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsKKyAgICBpZiAobmNvbXBzIDw9IDAgfHwgbmNvbXBzID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIG5jb21wcywgTUFYX0NPTVBTX0lOX1NDQU4pOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworICAgICAgdGhpc2kgPSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldOworICAgICAgaWYgKHRoaXNpIDwgMCB8fCB0aGlzaSA+PSBjaW5mby0+bnVtX2NvbXBvbmVudHMpCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgICAgLyogQ29tcG9uZW50cyBtdXN0IGFwcGVhciBpbiBTT0Ygb3JkZXIgd2l0aGluIGVhY2ggc2NhbiAqLworICAgICAgaWYgKGNpID4gMCAmJiB0aGlzaSA8PSBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ktMV0pCisJRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworICAgIH0KKyAgICAvKiBWYWxpZGF0ZSBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzICovCisgICAgU3MgPSBzY2FucHRyLT5TczsKKyAgICBTZSA9IHNjYW5wdHItPlNlOworICAgIEFoID0gc2NhbnB0ci0+QWg7CisgICAgQWwgPSBzY2FucHRyLT5BbDsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgLyogVGhlIEpQRUcgc3BlYyBzaW1wbHkgZ2l2ZXMgdGhlIHJhbmdlcyAwLi4xMyBmb3IgQWggYW5kIEFsLCBidXQgdGhhdAorICAgICAgICogc2VlbXMgd3Jvbmc6IHRoZSB1cHBlciBib3VuZCBvdWdodCB0byBkZXBlbmQgb24gZGF0YSBwcmVjaXNpb24uCisgICAgICAgKiBQZXJoYXBzIHRoZXkgcmVhbGx5IG1lYW50IDAuLk4rMSBmb3IgTi1iaXQgcHJlY2lzaW9uLgorICAgICAgICogSGVyZSB3ZSBhbGxvdyAwLi4xMCBmb3IgOC1iaXQgZGF0YTsgQWwgbGFyZ2VyIHRoYW4gMTAgcmVzdWx0cyBpbgorICAgICAgICogb3V0LW9mLXJhbmdlIHJlY29uc3RydWN0ZWQgREMgdmFsdWVzIGR1cmluZyB0aGUgZmlyc3QgREMgc2NhbiwKKyAgICAgICAqIHdoaWNoIG1pZ2h0IGNhdXNlIHByb2JsZW1zIGZvciBzb21lIGRlY29kZXJzLgorICAgICAgICovCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgTUFYX0FIX0FMIDEwCisjZWxzZQorI2RlZmluZSBNQVhfQUhfQUwgMTMKKyNlbmRpZgorICAgICAgaWYgKFNzIDwgMCB8fCBTcyA+PSBEQ1RTSVpFMiB8fCBTZSA8IFNzIHx8IFNlID49IERDVFNJWkUyIHx8CisJICBBaCA8IDAgfHwgQWggPiBNQVhfQUhfQUwgfHwgQWwgPCAwIHx8IEFsID4gTUFYX0FIX0FMKQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKKyAgICAgIGlmIChTcyA9PSAwKSB7CisJaWYgKFNlICE9IDApCQkvKiBEQyBhbmQgQUMgdG9nZXRoZXIgbm90IE9LICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9IGVsc2UgeworCWlmIChuY29tcHMgIT0gMSkJLyogQUMgc2NhbnMgbXVzdCBiZSBmb3Igb25seSBvbmUgY29tcG9uZW50ICovCisJICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICB9CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKKwlsYXN0X2JpdHBvc19wdHIgPSAmIGxhc3RfYml0cG9zW3NjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV1dWzBdOworCWlmIChTcyAhPSAwICYmIGxhc3RfYml0cG9zX3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCWZvciAoY29lZmkgPSBTczsgY29lZmkgPD0gU2U7IGNvZWZpKyspIHsKKwkgIGlmIChsYXN0X2JpdHBvc19wdHJbY29lZmldIDwgMCkgeworCSAgICAvKiBmaXJzdCBzY2FuIG9mIHRoaXMgY29lZmZpY2llbnQgKi8KKwkgICAgaWYgKEFoICE9IDApCisJICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOworCSAgfSBlbHNlIHsKKwkgICAgLyogbm90IGZpcnN0IHNjYW4gKi8KKwkgICAgaWYgKEFoICE9IGxhc3RfYml0cG9zX3B0cltjb2VmaV0gfHwgQWwgIT0gQWgtMSkKKwkgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisJICB9CisJICBsYXN0X2JpdHBvc19wdHJbY29lZmldID0gQWw7CisJfQorICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzZXF1ZW50aWFsIEpQRUcsIGFsbCBwcm9ncmVzc2lvbiBwYXJhbWV0ZXJzIG11c3QgYmUgdGhlc2U6ICovCisgICAgICBpZiAoU3MgIT0gMCB8fCBTZSAhPSBEQ1RTSVpFMi0xIHx8IEFoICE9IDAgfHwgQWwgIT0gMCkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7CisgICAgICAvKiBNYWtlIHN1cmUgY29tcG9uZW50cyBhcmUgbm90IHNlbnQgdHdpY2UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jb21wczsgY2krKykgeworCXRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKKwlpZiAoY29tcG9uZW50X3NlbnRbdGhpc2ldKQorCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCBzY2Fubm8pOworCWNvbXBvbmVudF9zZW50W3RoaXNpXSA9IFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogTm93IHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgZ290IHNlbnQuICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgLyogRm9yIHByb2dyZXNzaXZlIG1vZGUsIHdlIG9ubHkgY2hlY2sgdGhhdCBhdCBsZWFzdCBzb21lIERDIGRhdGEKKyAgICAgKiBnb3Qgc2VudCBmb3IgZWFjaCBjb21wb25lbnQ7IHRoZSBzcGVjIGRvZXMgbm90IHJlcXVpcmUgdGhhdCBhbGwgYml0cworICAgICAqIG9mIGFsbCBjb2VmZmljaWVudHMgYmUgdHJhbnNtaXR0ZWQuICBXb3VsZCBpdCBiZSB3aXNlciB0byBlbmZvcmNlCisgICAgICogdHJhbnNtaXNzaW9uIG9mIGFsbCBjb2VmZmljaWVudCBiaXRzPz8KKyAgICAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmIChsYXN0X2JpdHBvc1tjaV1bMF0gPCAwKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfTUlTU0lOR19EQVRBKTsKKyAgICB9CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGlmICghIGNvbXBvbmVudF9zZW50W2NpXSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7CisgICAgfQorICB9Cit9CisKKyNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X3NjYW5fcGFyYW1ldGVycyAoal9jb21wcmVzc19wdHIgY2luZm8pCisvKiBTZXQgdXAgdGhlIHNjYW4gcGFyYW1ldGVycyBmb3IgdGhlIGN1cnJlbnQgc2NhbiAqLworeworICBpbnQgY2k7CisKKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgeworICAgIC8qIFByZXBhcmUgZm9yIGN1cnJlbnQgc2NhbiAtLS0gdGhlIHNjcmlwdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCAqLworICAgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisgICAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbyArIG1hc3Rlci0+c2Nhbl9udW1iZXI7CisKKyAgICBjaW5mby0+Y29tcHNfaW5fc2NhbiA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47CisgICAgZm9yIChjaSA9IDA7IGNpIDwgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0KKwkmY2luZm8tPmNvbXBfaW5mb1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXTsKKyAgICB9CisgICAgY2luZm8tPlNzID0gc2NhbnB0ci0+U3M7CisgICAgY2luZm8tPlNlID0gc2NhbnB0ci0+U2U7CisgICAgY2luZm8tPkFoID0gc2NhbnB0ci0+QWg7CisgICAgY2luZm8tPkFsID0gc2NhbnB0ci0+QWw7CisgIH0KKyAgZWxzZQorI2VuZGlmCisgIHsKKyAgICAvKiBQcmVwYXJlIGZvciBzaW5nbGUgc2VxdWVudGlhbC1KUEVHIHNjYW4gY29udGFpbmluZyBhbGwgY29tcG9uZW50cyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUFNfSU5fU0NBTikKKyAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPSAmY2luZm8tPmNvbXBfaW5mb1tjaV07CisgICAgfQorICAgIGNpbmZvLT5TcyA9IDA7CisgICAgY2luZm8tPlNlID0gRENUU0laRTItMTsKKyAgICBjaW5mby0+QWggPSAwOworICAgIGNpbmZvLT5BbCA9IDA7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorcGVyX3NjYW5fc2V0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLworLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gYXJlIGFscmVhZHkgc2V0ICovCit7CisgIGludCBjaSwgbWN1YmxrcywgdG1wOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICAKKyAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKKyAgICAKKyAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKKyAgICAKKyAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLworICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworICAgIAorICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KKyAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOworICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOworICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOworICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBEQ1RTSVpFOworICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAorICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgorICAgICAqLworICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAKKyAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOworICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOworICAgIAorICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLworICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogRENUU0laRTsKKyAgICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygbm9uLWR1bW15IGJsb2NrcyBpbiBsYXN0IE1DVSBjb2x1bW4gJiByb3cgKi8KKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgJSBjb21wcHRyLT5NQ1Vfd2lkdGgpOworICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IHRtcDsKKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKyAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBDX01BWF9CTE9DS1NfSU5fTUNVKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKKyAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7CisJY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7CisgICAgICB9CisgICAgfQorICAgIAorICB9CisKKyAgLyogQ29udmVydCByZXN0YXJ0IHNwZWNpZmllZCBpbiByb3dzIHRvIGFjdHVhbCBNQ1UgY291bnQuICovCisgIC8qIE5vdGUgdGhhdCBjb3VudCBtdXN0IGZpdCBpbiAxNiBiaXRzLCBzbyB3ZSBwcm92aWRlIGxpbWl0aW5nLiAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW5fcm93cyA+IDApIHsKKyAgICBsb25nIG5vbWluYWwgPSAobG9uZykgY2luZm8tPnJlc3RhcnRfaW5fcm93cyAqIChsb25nKSBjaW5mby0+TUNVc19wZXJfcm93OworICAgIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsID0gKHVuc2lnbmVkIGludCkgTUlOKG5vbWluYWwsIDY1NTM1TCk7CisgIH0KK30KKworCisvKgorICogUGVyLXBhc3Mgc2V0dXAuCisgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGFzcy4gIFdlIGRldGVybWluZSB3aGljaCBtb2R1bGVzCisgKiB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgc3RhcnRfcGFzcyBjYWxscy4KKyAqIFdlIGFsc28gc2V0IGlzX2xhc3RfcGFzcyB0byBpbmRpY2F0ZSB3aGV0aGVyIGFueSBtb3JlIHBhc3NlcyB3aWxsIGJlCisgKiByZXF1aXJlZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3ByZXBhcmVfZm9yX3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIHN3aXRjaCAobWFzdGVyLT5wYXNzX3R5cGUpIHsKKyAgY2FzZSBtYWluX3Bhc3M6CisgICAgLyogSW5pdGlhbCBwYXNzOiB3aWxsIGNvbGxlY3QgaW5wdXQgZGF0YSwgYW5kIGRvIGVpdGhlciBIdWZmbWFuCisgICAgICogb3B0aW1pemF0aW9uIG9yIGRhdGEgb3V0cHV0IGZvciB0aGUgZmlyc3Qgc2Nhbi4KKyAgICAgKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKCEgY2luZm8tPnJhd19kYXRhX2luKSB7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICAoKmNpbmZvLT5wcmVwLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICB9CisgICAgKCpjaW5mby0+ZmRjdC0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywKKwkJCQkobWFzdGVyLT50b3RhbF9wYXNzZXMgPiAxID8KKwkJCQkgSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKKyAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfUEFTU19USFJVKTsKKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykgeworICAgICAgLyogTm8gaW1tZWRpYXRlIGRhdGEgb3V0cHV0OyBwb3N0cG9uZSB3cml0aW5nIGZyYW1lL3NjYW4gaGVhZGVycyAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgLyogV2lsbCB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgYXQgZmlyc3QganBlZ193cml0ZV9zY2FubGluZXMgY2FsbCAqLworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBUUlVFOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKKyAgY2FzZSBodWZmX29wdF9wYXNzOgorICAgIC8qIERvIEh1ZmZtYW4gb3B0aW1pemF0aW9uIGZvciBhIHNjYW4gYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gKi8KKyAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKKyAgICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisgICAgaWYgKGNpbmZvLT5TcyAhPSAwIHx8IGNpbmZvLT5BaCA9PSAwIHx8IGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIFRSVUUpOworICAgICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOworICAgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvKiBTcGVjaWFsIGNhc2U6IEh1ZmZtYW4gREMgcmVmaW5lbWVudCBzY2FucyBuZWVkIG5vIEh1ZmZtYW4gdGFibGUKKyAgICAgKiBhbmQgdGhlcmVmb3JlIHdlIGNhbiBza2lwIHRoZSBvcHRpbWl6YXRpb24gcGFzcyBmb3IgdGhlbS4KKyAgICAgKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyNlbmRpZgorICBjYXNlIG91dHB1dF9wYXNzOgorICAgIC8qIERvIGEgZGF0YS1vdXRwdXQgcGFzcy4gKi8KKyAgICAvKiBXZSBuZWVkIG5vdCByZXBlYXQgcGVyLXNjYW4gc2V0dXAgaWYgcHJpb3Igb3B0aW1pemF0aW9uIHBhc3MgZGlkIGl0LiAqLworICAgIGlmICghIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKKyAgICAgIHNlbGVjdF9zY2FuX3BhcmFtZXRlcnMoY2luZm8pOworICAgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworICAgIH0KKyAgICAoKmNpbmZvLT5lbnRyb3B5LT5zdGFydF9wYXNzKSAoY2luZm8sIEZBTFNFKTsKKyAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisgICAgLyogV2UgZW1pdCBmcmFtZS9zY2FuIGhlYWRlcnMgbm93ICovCisgICAgaWYgKG1hc3Rlci0+c2Nhbl9udW1iZXIgPT0gMCkKKyAgICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOworICAgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7CisgICAgbWFzdGVyLT5wdWIuY2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgIH0KKworICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSAobWFzdGVyLT5wYXNzX251bWJlciA9PSBtYXN0ZXItPnRvdGFsX3Bhc3Nlcy0xKTsKKworICAvKiBTZXQgdXAgcHJvZ3Jlc3MgbW9uaXRvcidzIHBhc3MgaW5mbyBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXI7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSBtYXN0ZXItPnRvdGFsX3Bhc3NlczsKKyAgfQorfQorCisKKy8qCisgKiBTcGVjaWFsIHN0YXJ0LW9mLXBhc3MgaG9vay4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGlmIGNhbGxfcGFzc19zdGFydHVwIGlzIFRSVUUuCisgKiBJbiBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nLCB3ZSBuZWVkIHRoaXMgaG9vayBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KKyAqIHdyaXRlIGZyYW1lL3NjYW4gaGVhZGVycyBkdXJpbmcganBlZ19zdGFydF9jb21wcmVzczsgd2Ugd2FudCB0byBsZXQgdGhlCisgKiBhcHBsaWNhdGlvbiB3cml0ZSBDT00gbWFya2VycyBldGMuIGJldHdlZW4ganBlZ19zdGFydF9jb21wcmVzcyBhbmQgdGhlCisgKiBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wLgorICogSW4gbXVsdGktcGFzcyBwcm9jZXNzaW5nLCB0aGlzIHJvdXRpbmUgaXMgbm90IHVzZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwYXNzX3N0YXJ0dXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCA9IEZBTFNFOyAvKiByZXNldCBmbGFnIHNvIGNhbGwgb25seSBvbmNlICovCisKKyAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9mcmFtZV9oZWFkZXIpIChjaW5mbyk7CisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfc2Nhbl9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCBlbmQgb2YgcGFzcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgLyogVGhlIGVudHJvcHkgY29kZXIgYWx3YXlzIG5lZWRzIGFuIGVuZC1vZi1wYXNzIGNhbGwsCisgICAqIGVpdGhlciB0byBhbmFseXplIHN0YXRpc3RpY3Mgb3IgdG8gZmx1c2ggaXRzIG91dHB1dCBidWZmZXIuCisgICAqLworICAoKmNpbmZvLT5lbnRyb3B5LT5maW5pc2hfcGFzcykgKGNpbmZvKTsKKworICAvKiBVcGRhdGUgc3RhdGUgZm9yIG5leHQgcGFzcyAqLworICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7CisgIGNhc2UgbWFpbl9wYXNzOgorICAgIC8qIG5leHQgcGFzcyBpcyBlaXRoZXIgb3V0cHV0IG9mIHNjYW4gMCAoYWZ0ZXIgb3B0aW1pemF0aW9uKQorICAgICAqIG9yIG91dHB1dCBvZiBzY2FuIDEgKGlmIG5vIG9wdGltaXphdGlvbikuCisgICAgICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICBjYXNlIGh1ZmZfb3B0X3Bhc3M6CisgICAgLyogbmV4dCBwYXNzIGlzIGFsd2F5cyBvdXRwdXQgb2YgY3VycmVudCBzY2FuICovCisgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKKyAgICBicmVhazsKKyAgY2FzZSBvdXRwdXRfcGFzczoKKyAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG9wdGltaXphdGlvbiBvciBvdXRwdXQgb2YgbmV4dCBzY2FuICovCisgICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7CisgICAgbWFzdGVyLT5zY2FuX251bWJlcisrOworICAgIGJyZWFrOworICB9CisKKyAgbWFzdGVyLT5wYXNzX251bWJlcisrOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIG1hc3RlciBjb21wcmVzc2lvbiBjb250cm9sLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19tYXN0ZXJfY29udHJvbCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyOworCisgIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihteV9jb21wX21hc3RlcikpOworICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2NvbXBfbWFzdGVyICopIG1hc3RlcjsKKyAgbWFzdGVyLT5wdWIucHJlcGFyZV9mb3JfcGFzcyA9IHByZXBhcmVfZm9yX3Bhc3M7CisgIG1hc3Rlci0+cHViLnBhc3Nfc3RhcnR1cCA9IHBhc3Nfc3RhcnR1cDsKKyAgbWFzdGVyLT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19tYXN0ZXI7CisgIG1hc3Rlci0+cHViLmlzX2xhc3RfcGFzcyA9IEZBTFNFOworCisgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMsIGRldGVybWluZSBkZXJpdmVkIHZhbHVlcyAqLworICBpbml0aWFsX3NldHVwKGNpbmZvKTsKKworICBpZiAoY2luZm8tPnNjYW5faW5mbyAhPSBOVUxMKSB7CisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgdmFsaWRhdGVfc2NyaXB0KGNpbmZvKTsKKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBGQUxTRTsKKyAgICBjaW5mby0+bnVtX3NjYW5zID0gMTsKKyAgfQorCisgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkJLyogIFRFTVBPUkFSWSBIQUNLID8/PyAqLworICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOyAvKiBhc3N1bWUgZGVmYXVsdCB0YWJsZXMgbm8gZ29vZCBmb3IgcHJvZ3Jlc3NpdmUgbW9kZSAqLworCisgIC8qIEluaXRpYWxpemUgbXkgcHJpdmF0ZSBzdGF0ZSAqLworICBpZiAodHJhbnNjb2RlX29ubHkpIHsKKyAgICAvKiBubyBtYWluIHBhc3MgaW4gdHJhbnNjb2RpbmcgKi8KKyAgICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKKyAgICAgIG1hc3Rlci0+cGFzc190eXBlID0gaHVmZl9vcHRfcGFzczsKKyAgICBlbHNlCisgICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG91dHB1dF9wYXNzOworICB9IGVsc2UgeworICAgIC8qIGZvciBub3JtYWwgY29tcHJlc3Npb24sIGZpcnN0IHBhc3MgaXMgYWx3YXlzIHRoaXMgdHlwZTogKi8KKyAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IG1haW5fcGFzczsKKyAgfQorICBtYXN0ZXItPnNjYW5fbnVtYmVyID0gMDsKKyAgbWFzdGVyLT5wYXNzX251bWJlciA9IDA7CisgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQorICAgIG1hc3Rlci0+dG90YWxfcGFzc2VzID0gY2luZm8tPm51bV9zY2FucyAqIDI7CisgIGVsc2UKKyAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbWFwaS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb21hcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjFmYTc1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb21hcGkuYwpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIGpjb21hcGkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSByb3V0aW5lcyB0aGF0IGFyZSB1c2VkIGZvciBib3RoCisgKiBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIEFib3J0IHByb2Nlc3Npbmcgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLAorICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCisgKgorICogRm9yIHRoaXMsIHdlIG1lcmVseSBjbGVhbiB1cCBhbGwgdGhlIG5vbnBlcm1hbmVudCBtZW1vcnkgcG9vbHMuCisgKiBOb3RlIHRoYXQgdGVtcCBmaWxlcyAodmlydHVhbCBhcnJheXMpIGFyZSBub3QgYWxsb3dlZCB0byBiZWxvbmcgdG8KKyAqIHRoZSBwZXJtYW5lbnQgcG9vbCwgc28gd2Ugd2lsbCBiZSBhYmxlIHRvIGNsb3NlIGFsbCB0ZW1wIGZpbGVzIGhlcmUuCisgKiBDbG9zaW5nIGEgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24sIGlmIG5lY2Vzc2FyeSwgaXMgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIHJlc3BvbnNpYmlsaXR5LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBpbnQgcG9vbDsKKworICAvKiBEbyBub3RoaW5nIGlmIGNhbGxlZCBvbiBhIG5vdC1pbml0aWFsaXplZCBvciBkZXN0cm95ZWQgSlBFRyBvYmplY3QuICovCisgIGlmIChjaW5mby0+bWVtID09IE5VTEwpCisgICAgcmV0dXJuOworCisgIC8qIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgorICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCisgICAqLworICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID4gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICAoKmNpbmZvLT5tZW0tPmZyZWVfcG9vbCkgKGNpbmZvLCBwb29sKTsKKyAgfQorCisgIC8qIFJlc2V0IG92ZXJhbGwgc3RhdGUgZm9yIHBvc3NpYmxlIHJldXNlIG9mIG9iamVjdCAqLworICBpZiAoY2luZm8tPmlzX2RlY29tcHJlc3NvcikgeworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7CisgICAgLyogVHJ5IHRvIGtlZXAgYXBwbGljYXRpb24gZnJvbSBhY2Nlc3Npbmcgbm93LWRlbGV0ZWQgbWFya2VyIGxpc3QuCisgICAgICogQSBiaXQga2x1ZGd5IHRvIGRvIGl0IGhlcmUsIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IGNlbnRyYWwgcGxhY2UuCisgICAgICovCisgICAgKChqX2RlY29tcHJlc3NfcHRyKSBjaW5mbyktPm1hcmtlcl9saXN0ID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOworICB9Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBvYmplY3QuCisgKgorICogRXZlcnl0aGluZyBnZXRzIGRlYWxsb2NhdGVkIGV4Y2VwdCB0aGUgbWFzdGVyIGpwZWdfY29tcHJlc3Nfc3RydWN0IGl0c2VsZgorICogYW5kIHRoZSBlcnJvciBtYW5hZ2VyIHN0cnVjdC4gIEJvdGggb2YgdGhlc2UgYXJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbgorICogYW5kIG11c3QgYmUgZnJlZWQsIGlmIG5lY2Vzc2FyeSwgYnkgdGhlIGFwcGxpY2F0aW9uLiAgKE9mdGVuIHRoZXkgYXJlIG9uCisgKiB0aGUgc3RhY2sgYW5kIHNvIGRvbid0IG5lZWQgdG8gYmUgZnJlZWQgYW55d2F5LikKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncworICogcmVzcG9uc2liaWxpdHkuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2Rlc3Ryb3kgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogV2UgbmVlZCBvbmx5IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIHJlbGVhc2UgZXZlcnl0aGluZy4gKi8KKyAgLyogTkI6IG1lbSBwb2ludGVyIGlzIE5VTEwgaWYgbWVtb3J5IG1nciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKi8KKyAgaWYgKGNpbmZvLT5tZW0gIT0gTlVMTCkKKyAgICAoKmNpbmZvLT5tZW0tPnNlbGZfZGVzdHJ1Y3QpIChjaW5mbyk7CisgIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogYmUgc2FmZSBpZiBqcGVnX2Rlc3Ryb3kgaXMgY2FsbGVkIHR3aWNlICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAwOwkvKiBtYXJrIGl0IGRlc3Ryb3llZCAqLworfQorCisKKy8qCisgKiBDb252ZW5pZW5jZSByb3V0aW5lcyBmb3IgYWxsb2NhdGluZyBxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzLgorICogKFdvdWxkIGp1dGlscy5jIGJlIGEgbW9yZSByZWFzb25hYmxlIHBsYWNlIHRvIHB1dCB0aGVzZT8pCisgKi8KKworR0xPQkFMKEpRVUFOVF9UQkwgKikKK2pwZWdfYWxsb2NfcXVhbnRfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqdGJsOworCisgIHRibCA9IChKUVVBTlRfVEJMICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsIFNJWkVPRihKUVVBTlRfVEJMKSk7CisgIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCisgIHJldHVybiB0Ymw7Cit9CisKKworR0xPQkFMKEpIVUZGX1RCTCAqKQoranBlZ19hbGxvY19odWZmX3RhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIEpIVUZGX1RCTCAqdGJsOworCisgIHRibCA9IChKSFVGRl9UQkwgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpIVUZGX1RCTCkpOworICB0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsJLyogbWFrZSBzdXJlIHRoaXMgaXMgZmFsc2UgaW4gYW55IG5ldyB0YWJsZSAqLworICByZXR1cm4gdGJsOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuYmNjIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuYmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzUzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5iY2MKQEAgLTAsMCArMSw0OCBAQAorLyogamNvbmZpZy5iY2MgLS0tIGpjb25maWcuaCBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSBvbiBNUy1ET1Mgb3IgT1MvMi4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9GQVJfUE9JTlRFUlMJLyogZm9yIHNtYWxsIG9yIG1lZGl1bSBtZW1vcnkgbW9kZWwgKi8KKyNlbmRpZgorI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgkvKiB0aGlzIGFzc3VtZXMgeW91IGhhdmUgLXctc3R1IGluIENGTEFHUyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2RlZmluZSBNQVhfQUxMT0NfQ0hVTksgNjU1MjBMCS8qIE1heGltdW0gcmVxdWVzdCB0byBtYWxsb2MoKSAqLworI2RlZmluZSBVU0VfRk1FTQkJLyogQm9ybGFuZCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworI2VuZGlmCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCisjZGVmaW5lIFVTRV9TRVRNT0RFCQkvKiBCb3JsYW5kIGhhcyBzZXRtb2RlKCkgKi8KKyNpZmRlZiBfX01TRE9TX18KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworI2VuZGlmCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuY2ZnIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTA0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5jZmcKQEAgLTAsMCArMSw0NCBAQAorLyogamNvbmZpZy5jZmcgLS0tIHNvdXJjZSBmaWxlIGVkaXRlZCBieSBjb25maWd1cmUgc2NyaXB0ICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjdW5kZWYgSEFWRV9QUk9UT1RZUEVTCisjdW5kZWYgSEFWRV9VTlNJR05FRF9DSEFSCisjdW5kZWYgSEFWRV9VTlNJR05FRF9TSE9SVAorI3VuZGVmIHZvaWQKKyN1bmRlZiBjb25zdAorI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyN1bmRlZiBIQVZFX1NURERFRl9ICisjdW5kZWYgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgZ2V0IHdhcm5pbmdzIGFib3V0IHVuZGVmaW5lZCBzdHJ1Y3R1cmVzLiAqLworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKyN1bmRlZiBJTkxJTkUKKy8qIFRoZXNlIGFyZSBmb3IgY29uZmlndXJpbmcgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICovCisjdW5kZWYgREVGQVVMVF9NQVhfTUVNCisjdW5kZWYgTk9fTUtURU1QCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuICovCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5kaiBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLmRqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTlhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5kagpAQCAtMCwwICsxLDM4IEBACisvKiBqY29uZmlnLmRqIC0tLSBqY29uZmlnLmggZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCkgb24gTVMtRE9TLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIERKR1BQIHVzZXMgZmxhdCAzMi1iaXQgYWRkcmVzc2luZyAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE5lZWRlZCB0byBtYWtlIG9uZS1maWxlIHN0eWxlIHdvcmsgaW4gREpHUFAgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLmRvYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThkMWMwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuZG9jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhOTgxNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qIGFuZHJvaWQgamNvbmZpZy5oICovCisvKgorICogamNvbmZpZy5kb2MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSByZXF1aXJlZCB0bworICogY3VzdG9taXplIHRoZSBKUEVHIHNvZnR3YXJlIGZvciBhIHBhcnRpY3VsYXIgc3lzdGVtLgorICoKKyAqIFRoZSBhY3R1YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHBhcnRpY3VsYXIgaW5zdGFsbGF0aW9uIGFyZSBzdG9yZWQKKyAqIGluIGpjb25maWcuaC4gIE9uIG1hbnkgbWFjaGluZXMsIGpjb25maWcuaCBjYW4gYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkKKyAqIG9yIGNvcGllZCBmcm9tIG9uZSBvZiB0aGUgImNhbm5lZCIgamNvbmZpZyBmaWxlcyB0aGF0IHdlIHN1cHBseS4gIEJ1dCBpZgorICogeW91IG5lZWQgdG8gZ2VuZXJhdGUgYSBqY29uZmlnLmggZmlsZSBieSBoYW5kLCB0aGlzIGZpbGUgdGVsbHMgeW91IGhvdy4KKyAqCisgKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLS0tIElUIFdPTidUIEFDQ09NUExJU0ggQU5ZVEhJTkcuCisgKiBFRElUIEEgQ09QWSBOQU1FRCBKQ09ORklHLkguCisgKi8KKworCisvKgorICogVGhlc2Ugc3ltYm9scyBpbmRpY2F0ZSB0aGUgcHJvcGVydGllcyBvZiB5b3VyIG1hY2hpbmUgb3IgY29tcGlsZXIuCisgKiAjZGVmaW5lIHRoZSBzeW1ib2wgaWYgeWVzLCAjdW5kZWYgaXQgaWYgbm8uCisgKi8KKworLyogRG9lcyB5b3VyIGNvbXBpbGVyIHN1cHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcz8KKyAqIChJZiBub3QsIHlvdSBhbHNvIG5lZWQgdG8gdXNlIGFuc2kya25yLCBzZWUgaW5zdGFsbC5kb2MpCisgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisKKy8qIERvZXMgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBkZWNsYXJhdGlvbiAidW5zaWduZWQgY2hhciIgPworICogSG93IGFib3V0ICJ1bnNpZ25lZCBzaG9ydCIgPworICovCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisKKy8qIERlZmluZSAidm9pZCIgYXMgImNoYXIiIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBrbm93IGFib3V0IHR5cGUgdm9pZC4KKyAqIE5PVEU6IGJlIHN1cmUgdG8gZGVmaW5lIHZvaWQgc3VjaCB0aGF0ICJ2b2lkICoiIHJlcHJlc2VudHMgdGhlIG1vc3QgZ2VuZXJhbAorICogcG9pbnRlciB0eXBlLCBlLmcuLCB0aGF0IHJldHVybmVkIGJ5IG1hbGxvYygpLgorICovCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworCisvKiBEZWZpbmUgImNvbnN0IiBhcyBlbXB0eSBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qga25vdyB0aGUgImNvbnN0IiBrZXl3b3JkLgorICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisKKy8qIERlZmluZSB0aGlzIGlmIGFuIG9yZGluYXJ5ICJjaGFyIiB0eXBlIGlzIHVuc2lnbmVkLgorICogSWYgeW91J3JlIG5vdCBzdXJlLCBsZWF2aW5nIGl0IHVuZGVmaW5lZCB3aWxsIHdvcmsgYXQgc29tZSBjb3N0IGluIHNwZWVkLgorICogSWYgeW91IGRlZmluZWQgSEFWRV9VTlNJR05FRF9DSEFSIHRoZW4gdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMgbWluaW1hbC4KKyAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBzeXN0ZW0gaGFzIGFuIEFOU0ktY29uZm9ybWluZyA8c3RkZGVmLmg+IGZpbGUuCisgKi8KKyNkZWZpbmUgSEFWRV9TVERERUZfSAorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgYW4gQU5TSS1jb25mb3JtaW5nIDxzdGRsaWIuaD4gZmlsZS4KKyAqLworI2RlZmluZSBIQVZFX1NURExJQl9ICisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgYW4gQU5TSS9TeXNWIDxzdHJpbmcuaD4sCisgKiBidXQgZG9lcyBoYXZlIGEgQlNELXN0eWxlIDxzdHJpbmdzLmg+LgorICovCisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHR5cGVkZWYgc2l6ZV90IGluIGFueSBvZiB0aGUKKyAqIEFOU0ktc3RhbmRhcmQgcGxhY2VzIChzdGRkZWYuaCwgc3RkbGliLmgsIG9yIHN0ZGlvLmgpLCBidXQgcGxhY2VzIGl0IGluCisgKiA8c3lzL3R5cGVzLmg+IGluc3RlYWQuCisgKi8KKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisKKy8qIEZvciA4MHg4NiBtYWNoaW5lcywgeW91IG5lZWQgdG8gZGVmaW5lIE5FRURfRkFSX1BPSU5URVJTLAorICogdW5sZXNzIHlvdSBhcmUgdXNpbmcgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbCBvciA4MDM4NiBmbGF0LW1lbW9yeSBtb2RlLgorICogT24gbGVzcyBicmFpbi1kYW1hZ2VkIENQVXMgdGhpcyBzeW1ib2wgbXVzdCBub3QgYmUgZGVmaW5lZC4KKyAqIChEZWZpbmluZyB0aGlzIHN5bWJvbCBjYXVzZXMgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzIHRvIGJlIHJlZmVyZW5jZWQgdGhyb3VnaAorICogImZhciIgcG9pbnRlcnMgYW5kIHRvIGJlIGFsbG9jYXRlZCB3aXRoIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIG1hbGxvYy4pCisgKi8KKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIGxpbmtlciBuZWVkcyBnbG9iYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIGxlc3MKKyAqIHRoYW4gdGhlIGZpcnN0IDE1IGNoYXJhY3RlcnMuCisgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisKKy8qIEFsdGhvdWdoIGEgcmVhbCBBTlNJIEMgY29tcGlsZXIgY2FuIGRlYWwgcGVyZmVjdGx5IHdlbGwgd2l0aCBwb2ludGVycyB0bworICogdW5zcGVjaWZpZWQgc3RydWN0dXJlcyAoc2VlICJpbmNvbXBsZXRlIHR5cGVzIiBpbiB0aGUgc3BlYyksIGEgZmV3IHByZS1BTlNJCisgKiBhbmQgcHNldWRvLUFOU0kgY29tcGlsZXJzIGdldCBjb25mdXNlZC4gIFRvIGtlZXAgb25lIG9mIHRoZXNlIGJvem9zIGhhcHB5LAorICogZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdQorICogYWN0dWFsbHkgZ2V0ICJtaXNzaW5nIHN0cnVjdHVyZSBkZWZpbml0aW9uIiB3YXJuaW5ncyBvciBlcnJvcnMgd2hpbGUKKyAqIGNvbXBpbGluZyB0aGUgSlBFRyBjb2RlLgorICovCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworCisvKgorICogVGhlIGZvbGxvd2luZyBvcHRpb25zIGFmZmVjdCBjb2RlIHNlbGVjdGlvbiB3aXRoaW4gdGhlIEpQRUcgbGlicmFyeSwKKyAqIGJ1dCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgdmlzaWJsZSB0byBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgaGFzIGJlZW4gZGVmaW5lZC4KKyAqLworCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciBjb21waWxlciBpbXBsZW1lbnRzICI+PiIgb24gc2lnbmVkIHZhbHVlcyBhcyBhIGxvZ2ljYWwKKyAqICh1bnNpZ25lZCkgc2hpZnQ7IGxlYXZlIGl0IHVuZGVmaW5lZCBpZiAiPj4iIGlzIGEgc2lnbmVkIChhcml0aG1ldGljKSBzaGlmdCwKKyAqIHdoaWNoIGlzIHRoZSBub3JtYWwgYW5kIHJhdGlvbmFsIGRlZmluaXRpb24uCisgKi8KKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisKKy8qCisgKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgZG8gbm90IGFmZmVjdCB0aGUgSlBFRyBsaWJyYXJ5IHByb3BlciwKKyAqIGJ1dCBvbmx5IHRoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnL2RqcGVnIChzZWUgY2pwZWcuYywgZGpwZWcuYykuCisgKiBPdGhlciBhcHBsaWNhdGlvbnMgY2FuIGlnbm9yZSB0aGVzZS4KKyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisvKiBUaGVzZSBkZWZpbmVzIGluZGljYXRlIHdoaWNoIGltYWdlIChub24tSlBFRykgZmlsZSBmb3JtYXRzIGFyZSBhbGxvd2VkLiAqLworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3Ugd2FudCB0byBuYW1lIGJvdGggaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbiB0aGUgY29tbWFuZAorICogbGluZSwgcmF0aGVyIHRoYW4gdXNpbmcgc3Rkb3V0IGFuZCBvcHRpb25hbGx5IHN0ZGluLiAgWW91IE1VU1QgZG8gdGhpcyBpZgorICogeW91ciBzeXN0ZW0gY2FuJ3QgY29wZSB3aXRoIGJpbmFyeSBJL08gdG8gc3RkaW4vc3Rkb3V0LiAgU2VlIGNvbW1lbnRzIGF0CisgKiBoZWFkIG9mIGNqcGVnLmMgb3IgZGpwZWcuYy4KKyAqLworI3VuZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdXIgc3lzdGVtIG5lZWRzIGV4cGxpY2l0IGNsZWFudXAgb2YgdGVtcG9yYXJ5IGZpbGVzLgorICogVGhpcyBpcyBjcnVjaWFsIHVuZGVyIE1TLURPUywgd2hlcmUgdGhlIHRlbXBvcmFyeSAiZmlsZXMiIG1heSBiZSBhcmVhcworICogb2YgZXh0ZW5kZWQgbWVtb3J5OyBvbiBtb3N0IG90aGVyIHN5c3RlbXMgaXQncyBub3QgYXMgaW1wb3J0YW50LgorICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorCisvKiBCeSBkZWZhdWx0LCB3ZSBvcGVuIGltYWdlIGZpbGVzIHdpdGggZm9wZW4oLi4uLCJyYiIpIG9yIGZvcGVuKC4uLiwid2IiKS4KKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IG9uIHN5c3RlbXMgdGhhdCBkaXN0aW5ndWlzaCB0ZXh0IGZpbGVzIGZyb20gYmluYXJ5IGZpbGVzLAorICogYW5kIGlzIGhhcm1sZXNzIG9uIG1vc3Qgc3lzdGVtcyB0aGF0IGRvbid0LiAgSWYgeW91IGhhdmUgb25lIG9mIHRoZSByYXJlCisgKiBzeXN0ZW1zIHRoYXQgY29tcGxhaW5zIGFib3V0IHRoZSAiYiIgc3BlYywgZGVmaW5lIHRoaXMgc3ltYm9sLgorICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSB3YW50IHBlcmNlbnQtZG9uZSBwcm9ncmVzcyByZXBvcnRzIGZyb20gY2pwZWcvZGpwZWcuCisgKi8KKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQKKworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcubWFjIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcubWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZTNlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5tYWMKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYWMgLS0tIGpjb25maWcuaCBmb3IgQ29kZVdhcnJpb3Igb24gQXBwbGUgTWFjaW50b3NoICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFVTRV9NQUNfTUVNTUdSCQkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1tYWMuYyAqLworCisjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZwkJLyogTmVlZGVkIGZvciA2ODB4MCBNYWNzICovCisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFVTRV9DQ09NTUFORAkJLyogQ29tbWFuZCBsaW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIEJpbmFyeSBJL08gdGhydSBzdGRpbi9zdGRvdXQgZG9lc24ndCB3b3JrICovCisKKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcubWFueCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLm1hbngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMGQwMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLm1hbngKQEAgLTAsMCArMSw0MyBAQAorLyogamNvbmZpZy5tYW54IC0tLSBqY29uZmlnLmggZm9yIEFtaWdhIHN5c3RlbXMgdXNpbmcgTWFueCBBenRlYyBDIHZlciA1LnguICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBTSE9SVHhTSE9SVF8zMgkJLyogcHJvZHVjZXMgYmV0dGVyIERDVCBjb2RlIHdpdGggQXp0ZWMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZGVmaW5lIHNpZ25hbF9jYXRjaGVyIF9hYm9ydAkvKiBoYWNrIGZvciBBenRlYyBDIG5hbWluZyByZXF1aXJlbWVudHMgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLm1jNiBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLm1jNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTUwODJkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcubWM2CkBAIC0wLDAgKzEsNTIgQEAKKy8qIGpjb25maWcubWM2IC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBDIG9uIE1TLURPUywgdmVyc2lvbiA2LjAwQSAmIHVwLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI2RlZmluZSBORUVEX0ZBUl9QT0lOVEVSUwkvKiBmb3Igc21hbGwgb3IgbWVkaXVtIG1lbW9yeSBtb2RlbCAqLworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNkZWZpbmUgVVNFX01TRE9TX01FTU1HUgkvKiBEZWZpbmUgdGhpcyBpZiB5b3UgdXNlIGptZW1kb3MuYyAqLworCisjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyA2NTUyMEwJLyogTWF4aW11bSByZXF1ZXN0IHRvIG1hbGxvYygpICovCisKKyNkZWZpbmUgVVNFX0ZNRU0JCS8qIE1pY3Jvc29mdCBoYXMgX2ZtZW1jcHkoKSBhbmQgX2ZtZW1zZXQoKSAqLworCisjZGVmaW5lIE5FRURfRkhFQVBNSU4JCS8qIGZhciBoZWFwIG1hbmFnZW1lbnQgcm91dGluZXMgYXJlIGJyb2tlbiAqLworCisjZGVmaW5lIFNIT1JUeExDT05TVF8zMgkJLyogZW5hYmxlIGNvbXBpbGVyLXNwZWNpZmljIERDVCBvcHRpbWl6YXRpb24gKi8KKy8qIE5vdGU6IHRoZSBhYm92ZSBkZWZpbmUgaXMga25vd24gdG8gaW1wcm92ZSB0aGUgY29kZSB3aXRoIE1pY3Jvc29mdCBDIDYuMDBBLgorICogSSBkbyBub3Qga25vdyB3aGV0aGVyIGl0IGlzIGdvb2QgZm9yIGxhdGVyIGNvbXBpbGVyIHZlcnNpb25zLgorICogUGxlYXNlIHJlcG9ydCBhbnkgaW5mbyBvbiB0aGlzIHBvaW50IHRvIGpwZWctaW5mb0B1dW5ldC51dS5uZXQuCisgKi8KKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjZGVmaW5lIE5FRURfU0lHTkFMX0NBVENIRVIJLyogRGVmaW5lIHRoaXMgaWYgeW91IHVzZSBqbWVtZG9zLmMgKi8KKyN1bmRlZiBET05UX1VTRV9CX01PREUKKyN1bmRlZiBQUk9HUkVTU19SRVBPUlQJCS8qIG9wdGlvbmFsICovCisKKyNlbmRpZiAvKiBKUEVHX0NKUEVHX0RKUEVHICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5zYXMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5zYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkYWMyMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLnNhcwpAQCAtMCwwICsxLDQzIEBACisvKiBqY29uZmlnLnNhcyAtLS0gamNvbmZpZy5oIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICJKUEVHVE1QOiIJLyogcmVjb21tZW5kZWQgc2V0dGluZyBmb3IgQW1pZ2EgKi8KKworI2RlZmluZSBOT19NS1RFTVAJCS8qIFNBUyBDIGRvZXNuJ3QgaGF2ZSBta3RlbXAoKSAqLworCisjZGVmaW5lIFNIT1JUeFNIT1JUXzMyCQkvKiBwcm9kdWNlcyBiZXR0ZXIgRENUIGNvZGUgd2l0aCBTQVMgQyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQorI2RlZmluZSBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuc3QgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy5zdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIxYjdhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcuc3QKQEAgLTAsMCArMSw0MiBAQAorLyogamNvbmZpZy5zdCAtLS0gamNvbmZpZy5oIGZvciBBdGFyaSBTVC9TVEUvVFQgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuICovCisvKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLworCisjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAorLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KKy8qICNkZWZpbmUgY29uc3QgKi8KKyN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEhBVkVfU1REREVGX0gKKyNkZWZpbmUgSEFWRV9TVERMSUJfSAorI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKKyN1bmRlZiBORUVEX1NZU19UWVBFU19ICisjdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCS8qIHN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgd2FybmluZ3MgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisKKyN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorCisjZGVmaW5lIEFMSUdOX1RZUEUgIGxvbmcJLyogYXBwYXJlbnRseSBkb3VibGUgaXMgYSB3ZWlyZCBzaXplPyAqLworCisjZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KKworI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKKworI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKworI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAtLSB1bmRlZiBpZiB5b3UgbGlrZSBVbml4IHN0eWxlICovCisvKiBOb3RlOiBpZiB5b3UgdW5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUsIHlvdSBtYXkgbmVlZCB0byBkZWZpbmUKKyAqIFVTRV9TRVRNT0RFLiAgU29tZSBBdGFyaSBjb21waWxlcnMgcmVxdWlyZSBpdCwgc29tZSBkbyBub3QuCisgKi8KKyNkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUgkvKiBuZWVkZWQgaWYgeW91IHVzZSBqbWVtbmFtZS5jICovCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcudmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy52YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI5MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcudmMKQEAgLTAsMCArMSw0NSBAQAorLyogamNvbmZpZy52YyAtLS0gamNvbmZpZy5oIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIDk1IG9yIE5ULiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjdW5kZWYgQ0hBUl9JU19VTlNJR05FRAorI2RlZmluZSBIQVZFX1NURERFRl9ICisjZGVmaW5lIEhBVkVfU1RETElCX0gKKyN1bmRlZiBORUVEX0JTRF9TVFJJTkdTCisjdW5kZWYgTkVFRF9TWVNfVFlQRVNfSAorI3VuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIHdlIHByZXN1bWUgYSAzMi1iaXQgZmxhdCBtZW1vcnkgbW9kZWwgKi8KKyN1bmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjdW5kZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KKworLyogRGVmaW5lICJib29sZWFuIiBhcyB1bnNpZ25lZCBjaGFyLCBub3QgaW50LCBwZXIgV2luZG93cyBjdXN0b20gKi8KKyNpZm5kZWYgX19SUENORFJfSF9fCQkvKiBkb24ndCBjb25mbGljdCBpZiBycGNuZHIuaCBhbHJlYWR5IHJlYWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBib29sZWFuOworI2VuZGlmCisjZGVmaW5lIEhBVkVfQk9PTEVBTgkJLyogcHJldmVudCBqbW9yZWNmZy5oIGZyb20gcmVkZWZpbmluZyBpdCAqLworCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyNkZWZpbmUgVFdPX0ZJTEVfQ09NTUFORExJTkUJLyogb3B0aW9uYWwgKi8KKyNkZWZpbmUgVVNFX1NFVE1PREUJCS8qIE1pY3Jvc29mdCBoYXMgc2V0bW9kZSgpICovCisjdW5kZWYgTkVFRF9TSUdOQUxfQ0FUQ0hFUgorI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLnZtcyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY29uZmlnLnZtcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWE2ZmZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcudm1zCkBAIC0wLDAgKzEsMzcgQEAKKy8qIGpjb25maWcudm1zIC0tLSBqY29uZmlnLmggZm9yIHVzZSBvbiBEaWdpdGFsIFZNUy4gKi8KKy8qIHNlZSBqY29uZmlnLmRvYyBmb3IgZXhwbGFuYXRpb25zICovCisKKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEhBVkVfVU5TSUdORURfQ0hBUgorI2RlZmluZSBIQVZFX1VOU0lHTkVEX1NIT1JUCisvKiAjZGVmaW5lIHZvaWQgY2hhciAqLworLyogI2RlZmluZSBjb25zdCAqLworI3VuZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUworI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorCisjaWZkZWYgSlBFR19JTlRFUk5BTFMKKworI3VuZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECisKKyNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLworCisjaWZkZWYgSlBFR19DSlBFR19ESlBFRworCisjZGVmaW5lIEJNUF9TVVBQT1JURUQJCS8qIEJNUCBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBHSUZfU1VQUE9SVEVECQkvKiBHSUYgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgUFBNX1NVUFBPUlRFRAkJLyogUEJNUExVUyBQUE0vUEdNIGltYWdlIGZpbGUgZm9ybWF0ICovCisjdW5kZWYgUkxFX1NVUFBPUlRFRAkJLyogVXRhaCBSTEUgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyNkZWZpbmUgVEFSR0FfU1VQUE9SVEVECQkvKiBUYXJnYSBpbWFnZSBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIFRXT19GSUxFX0NPTU1BTkRMSU5FCS8qIE5lZWRlZCBvbiBWTVMgKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCisjdW5kZWYgRE9OVF9VU0VfQl9NT0RFCisjdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLworCisjZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcud2F0IGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjb25maWcud2F0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzU0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNvbmZpZy53YXQKQEAgLTAsMCArMSwzOCBAQAorLyogamNvbmZpZy53YXQgLS0tIGpjb25maWcuaCBmb3IgV2F0Y29tIEMvQysrIG9uIE1TLURPUyBvciBPUy8yLiAqLworLyogc2VlIGpjb25maWcuZG9jIGZvciBleHBsYW5hdGlvbnMgKi8KKworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgSEFWRV9VTlNJR05FRF9DSEFSCisjZGVmaW5lIEhBVkVfVU5TSUdORURfU0hPUlQKKy8qICNkZWZpbmUgdm9pZCBjaGFyICovCisvKiAjZGVmaW5lIGNvbnN0ICovCisjZGVmaW5lIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgSEFWRV9TVERERUZfSAorI2RlZmluZSBIQVZFX1NURExJQl9ICisjdW5kZWYgTkVFRF9CU0RfU1RSSU5HUworI3VuZGVmIE5FRURfU1lTX1RZUEVTX0gKKyN1bmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBXYXRjb20gdXNlcyBmbGF0IDMyLWJpdCBhZGRyZXNzaW5nICovCisjdW5kZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI3VuZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworCisjdW5kZWYgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisKKyNpZmRlZiBKUEVHX0NKUEVHX0RKUEVHCisKKyNkZWZpbmUgQk1QX1NVUFBPUlRFRAkJLyogQk1QIGltYWdlIGZpbGUgZm9ybWF0ICovCisjZGVmaW5lIEdJRl9TVVBQT1JURUQJCS8qIEdJRiBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBQUE1fU1VQUE9SVEVECQkvKiBQQk1QTFVTIFBQTS9QR00gaW1hZ2UgZmlsZSBmb3JtYXQgKi8KKyN1bmRlZiBSTEVfU1VQUE9SVEVECQkvKiBVdGFoIFJMRSBpbWFnZSBmaWxlIGZvcm1hdCAqLworI2RlZmluZSBUQVJHQV9TVVBQT1JURUQJCS8qIFRhcmdhIGltYWdlIGZpbGUgZm9ybWF0ICovCisKKyN1bmRlZiBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLworI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTmVlZGVkIHRvIG1ha2Ugb25lLWZpbGUgc3R5bGUgd29yayBpbiBXYXRjb20gKi8KKyN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCS8qIERlZmluZSB0aGlzIGlmIHlvdSB1c2Ugam1lbW5hbWUuYyAqLworI3VuZGVmIERPTlRfVVNFX0JfTU9ERQorI3VuZGVmIFBST0dSRVNTX1JFUE9SVAkJLyogb3B0aW9uYWwgKi8KKworI2VuZGlmIC8qIEpQRUdfQ0pQRUdfREpQRUcgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY3BhcmFtLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDA0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNwYXJhbS5jCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogamNwYXJhbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgb3B0aW9uYWwgZGVmYXVsdC1zZXR0aW5nIGNvZGUgZm9yIHRoZSBKUEVHIGNvbXByZXNzb3IuCisgKiBBcHBsaWNhdGlvbnMgZG8gbm90IGhhdmUgdG8gdXNlIHRoaXMgZmlsZSwgYnV0IHRob3NlIHRoYXQgZG9uJ3QgdXNlIGl0CisgKiBtdXN0IGtub3cgYSBsb3QgbW9yZSBhYm91dCB0aGUgaW5uYXJkcyBvZiB0aGUgSlBFRyBjb2RlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisvKiBEZWZpbmUgYSBxdWFudGl6YXRpb24gdGFibGUgZXF1YWwgdG8gdGhlIGJhc2ljX3RhYmxlIHRpbWVzCisgKiBhIHNjYWxlIGZhY3RvciAoZ2l2ZW4gYXMgYSBwZXJjZW50YWdlKS4KKyAqIElmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUsIHRoZSBjb21wdXRlZCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworICogYXJlIGxpbWl0ZWQgdG8gMS4uMjU1IGZvciBKUEVHIGJhc2VsaW5lIGNvbXBhdGliaWxpdHkuCisgKi8KK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBpbnQgaTsKKyAgbG9uZyB0ZW1wOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIGlmICh3aGljaF90YmwgPCAwIHx8IHdoaWNoX3RibCA+PSBOVU1fUVVBTlRfVEJMUykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIHdoaWNoX3RibCk7CisKKyAgcXRibHB0ciA9ICYgY2luZm8tPnF1YW50X3RibF9wdHJzW3doaWNoX3RibF07CisKKyAgaWYgKCpxdGJscHRyID09IE5VTEwpCisgICAgKnF0YmxwdHIgPSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworICAgIHRlbXAgPSAoKGxvbmcpIGJhc2ljX3RhYmxlW2ldICogc2NhbGVfZmFjdG9yICsgNTBMKSAvIDEwMEw7CisgICAgLyogbGltaXQgdGhlIHZhbHVlcyB0byB0aGUgdmFsaWQgcmFuZ2UgKi8KKyAgICBpZiAodGVtcCA8PSAwTCkgdGVtcCA9IDFMOworICAgIGlmICh0ZW1wID4gMzI3NjdMKSB0ZW1wID0gMzI3NjdMOyAvKiBtYXggcXVhbnRpemVyIG5lZWRlZCBmb3IgMTIgYml0cyAqLworICAgIGlmIChmb3JjZV9iYXNlbGluZSAmJiB0ZW1wID4gMjU1TCkKKyAgICAgIHRlbXAgPSAyNTVMOwkJLyogbGltaXQgdG8gYmFzZWxpbmUgcmFuZ2UgaWYgcmVxdWVzdGVkICovCisgICAgKCpxdGJscHRyKS0+cXVhbnR2YWxbaV0gPSAoVUlOVDE2KSB0ZW1wOworICB9CisKKyAgLyogSW5pdGlhbGl6ZSBzZW50X3RhYmxlIEZBTFNFIHNvIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCisgICgqcXRibHB0ciktPnNlbnRfdGFibGUgPSBGQUxTRTsKK30KKworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2xpbmVhcl9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHNjYWxlX2ZhY3RvciwKKwkJCSBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzCisgKiBhbmQgYSBzdHJhaWdodCBwZXJjZW50YWdlLXNjYWxpbmcgcXVhbGl0eSBzY2FsZS4gIEluIG1vc3QgY2FzZXMgaXQncyBiZXR0ZXIKKyAqIHRvIHVzZSBqcGVnX3NldF9xdWFsaXR5IChiZWxvdyk7IHRoaXMgZW50cnkgcG9pbnQgaXMgcHJvdmlkZWQgZm9yCisgKiBhcHBsaWNhdGlvbnMgdGhhdCBpbnNpc3Qgb24gYSBsaW5lYXIgcGVyY2VudGFnZSBzY2FsaW5nLgorICovCit7CisgIC8qIFRoZXNlIGFyZSB0aGUgc2FtcGxlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gSlBFRyBzcGVjIHNlY3Rpb24gSy4xLgorICAgKiBUaGUgc3BlYyBzYXlzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBwcm9kdWNlICJnb29kIiBxdWFsaXR5LCBhbmQKKyAgICogd2hlbiBkaXZpZGVkIGJ5IDIsICJ2ZXJ5IGdvb2QiIHF1YWxpdHkuCisgICAqLworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNiwgIDExLCAgMTAsICAxNiwgIDI0LCAgNDAsICA1MSwgIDYxLAorICAgIDEyLCAgMTIsICAxNCwgIDE5LCAgMjYsICA1OCwgIDYwLCAgNTUsCisgICAgMTQsICAxMywgIDE2LCAgMjQsICA0MCwgIDU3LCAgNjksICA1NiwKKyAgICAxNCwgIDE3LCAgMjIsICAyOSwgIDUxLCAgODcsICA4MCwgIDYyLAorICAgIDE4LCAgMjIsICAzNywgIDU2LCAgNjgsIDEwOSwgMTAzLCAgNzcsCisgICAgMjQsICAzNSwgIDU1LCAgNjQsICA4MSwgMTA0LCAxMTMsICA5MiwKKyAgICA0OSwgIDY0LCAgNzgsICA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICAgIDcyLCAgOTIsICA5NSwgIDk4LCAxMTIsIDEwMCwgMTAzLCAgOTkKKyAgfTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsW0RDVFNJWkUyXSA9IHsKKyAgICAxNywgIDE4LCAgMjQsICA0NywgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDE4LCAgMjEsICAyNiwgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgMjQsICAyNiwgIDU2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA0NywgIDY2LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTkKKyAgfTsKKworICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBzY2FsaW5nICovCisgIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAwLCBzdGRfbHVtaW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgMSwgc3RkX2Nocm9taW5hbmNlX3F1YW50X3RibCwKKwkJICAgICAgIHNjYWxlX2ZhY3RvciwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKK0dMT0JBTChpbnQpCitqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisvKiBDb252ZXJ0IGEgdXNlci1zcGVjaWZpZWQgcXVhbGl0eSByYXRpbmcgdG8gYSBwZXJjZW50YWdlIHNjYWxpbmcgZmFjdG9yCisgKiBmb3IgYW4gdW5kZXJseWluZyBxdWFudGl6YXRpb24gdGFibGUsIHVzaW5nIG91ciByZWNvbW1lbmRlZCBzY2FsaW5nIGN1cnZlLgorICogVGhlIGlucHV0ICdxdWFsaXR5JyBmYWN0b3Igc2hvdWxkIGJlIDAgKHRlcnJpYmxlKSB0byAxMDAgKHZlcnkgZ29vZCkuCisgKi8KK3sKKyAgLyogU2FmZXR5IGxpbWl0IG9uIHF1YWxpdHkgZmFjdG9yLiAgQ29udmVydCAwIHRvIDEgdG8gYXZvaWQgemVybyBkaXZpZGUuICovCisgIGlmIChxdWFsaXR5IDw9IDApIHF1YWxpdHkgPSAxOworICBpZiAocXVhbGl0eSA+IDEwMCkgcXVhbGl0eSA9IDEwMDsKKworICAvKiBUaGUgYmFzaWMgdGFibGUgaXMgdXNlZCBhcy1pcyAoc2NhbGluZyAxMDApIGZvciBhIHF1YWxpdHkgb2YgNTAuCisgICAqIFF1YWxpdGllcyA1MC4uMTAwIGFyZSBjb252ZXJ0ZWQgdG8gc2NhbGluZyBwZXJjZW50YWdlIDIwMCAtIDIqUTsKKyAgICogbm90ZSB0aGF0IGF0IFE9MTAwIHRoZSBzY2FsaW5nIGlzIDAsIHdoaWNoIHdpbGwgY2F1c2UganBlZ19hZGRfcXVhbnRfdGFibGUKKyAgICogdG8gbWFrZSBhbGwgdGhlIHRhYmxlIGVudHJpZXMgMSAoaGVuY2UsIG1pbmltdW0gcXVhbnRpemF0aW9uIGxvc3MpLgorICAgKiBRdWFsaXRpZXMgMS4uNTAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgNTAwMC9RLgorICAgKi8KKyAgaWYgKHF1YWxpdHkgPCA1MCkKKyAgICBxdWFsaXR5ID0gNTAwMCAvIHF1YWxpdHk7CisgIGVsc2UKKyAgICBxdWFsaXR5ID0gMjAwIC0gcXVhbGl0eSoyOworCisgIHJldHVybiBxdWFsaXR5OworfQorCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfcXVhbGl0eSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LCBib29sZWFuIGZvcmNlX2Jhc2VsaW5lKQorLyogU2V0IG9yIGNoYW5nZSB0aGUgJ3F1YWxpdHknIChxdWFudGl6YXRpb24pIHNldHRpbmcsIHVzaW5nIGRlZmF1bHQgdGFibGVzLgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgcXVhbGl0eS1hZGp1c3RpbmcgZW50cnkgcG9pbnQgZm9yIHR5cGljYWwgdXNlcgorICogaW50ZXJmYWNlczsgb25seSB0aG9zZSB3aG8gd2FudCBkZXRhaWxlZCBjb250cm9sIG92ZXIgcXVhbnRpemF0aW9uIHRhYmxlcworICogd291bGQgdXNlIHRoZSBwcmVjZWRpbmcgdGhyZWUgcm91dGluZXMgZGlyZWN0bHkuCisgKi8KK3sKKyAgLyogQ29udmVydCB1c2VyIDAtMTAwIHJhdGluZyB0byBwZXJjZW50YWdlIHNjYWxpbmcgKi8KKyAgcXVhbGl0eSA9IGpwZWdfcXVhbGl0eV9zY2FsaW5nKHF1YWxpdHkpOworCisgIC8qIFNldCB1cCBzdGFuZGFyZCBxdWFsaXR5IHRhYmxlcyAqLworICBqcGVnX3NldF9saW5lYXJfcXVhbGl0eShjaW5mbywgcXVhbGl0eSwgZm9yY2VfYmFzZWxpbmUpOworfQorCisKKy8qCisgKiBIdWZmbWFuIHRhYmxlIHNldHVwIHJvdXRpbmVzCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9odWZmX3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJSkhVRkZfVEJMICoqaHRibHB0ciwgY29uc3QgVUlOVDggKmJpdHMsIGNvbnN0IFVJTlQ4ICp2YWwpCisvKiBEZWZpbmUgYSBIdWZmbWFuIHRhYmxlICovCit7CisgIGludCBuc3ltYm9scywgbGVuOworCisgIGlmICgqaHRibHB0ciA9PSBOVUxMKQorICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBDb3B5IHRoZSBudW1iZXItb2Ytc3ltYm9scy1vZi1lYWNoLWNvZGUtbGVuZ3RoIGNvdW50cyAqLworICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7CisKKyAgLyogVmFsaWRhdGUgdGhlIGNvdW50cy4gIFdlIGRvIHRoaXMgaGVyZSBtYWlubHkgc28gd2UgY2FuIGNvcHkgdGhlIHJpZ2h0CisgICAqIG51bWJlciBvZiBzeW1ib2xzIGZyb20gdGhlIHZhbFtdIGFycmF5LCB3aXRob3V0IHJpc2tpbmcgbWFyY2hpbmcgb2ZmCisgICAqIHRoZSBlbmQgb2YgbWVtb3J5LiAgamNodWZmLmMgd2lsbCBkbyBhIG1vcmUgdGhvcm91Z2ggdGVzdCBsYXRlci4KKyAgICovCisgIG5zeW1ib2xzID0gMDsKKyAgZm9yIChsZW4gPSAxOyBsZW4gPD0gMTY7IGxlbisrKQorICAgIG5zeW1ib2xzICs9IGJpdHNbbGVuXTsKKyAgaWYgKG5zeW1ib2xzIDwgMSB8fCBuc3ltYm9scyA+IDI1NikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIHZhbCwgbnN5bWJvbHMgKiBTSVpFT0YoVUlOVDgpKTsKKworICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KKyAgKCpodGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOworfQorCisKK0xPQ0FMKHZvaWQpCitzdGRfaHVmZl90YWJsZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogU2V0IHVwIHRoZSBzdGFuZGFyZCBIdWZmbWFuIHRhYmxlcyAoY2YuIEpQRUcgc3RhbmRhcmQgc2VjdGlvbiBLLjMpICovCisvKiBJTVBPUlRBTlQ6IHRoZXNlIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbiEgKi8KK3sKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfbHVtaW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMSwgNSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2RjX2x1bWluYW5jZVtdID0KKyAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OworICAKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddID0KKyAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIH07CisgIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfY2hyb21pbmFuY2VbXSA9CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2x1bWluYW5jZVsxN10gPQorICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDB4N2QgfTsKKyAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9hY19sdW1pbmFuY2VbXSA9CisgICAgeyAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgICAgMHgyMSwgMHgzMSwgMHg0MSwgMHgwNiwgMHgxMywgMHg1MSwgMHg2MSwgMHgwNywKKyAgICAgIDB4MjIsIDB4NzEsIDB4MTQsIDB4MzIsIDB4ODEsIDB4OTEsIDB4YTEsIDB4MDgsCisgICAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgICAgMHgyNCwgMHgzMywgMHg2MiwgMHg3MiwgMHg4MiwgMHgwOSwgMHgwYSwgMHgxNiwKKyAgICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjUsIDB4MjYsIDB4MjcsIDB4MjgsCisgICAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgICAgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwKKyAgICAgIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsIDB4NTksCisgICAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgICAgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwKKyAgICAgIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIDB4ODgsIDB4ODksCisgICAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgICAgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywKKyAgICAgIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsCisgICAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgICAgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgICAgIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZTEsIDB4ZTIsCisgICAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgICAgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgICAgIDB4ZjksIDB4ZmEgfTsKKyAgCisgIHN0YXRpYyBjb25zdCBVSU5UOCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XSA9CisgICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMiwgNCwgNCwgMywgNCwgNywgNSwgNCwgNCwgMCwgMSwgMiwgMHg3NyB9OworICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2Nocm9taW5hbmNlW10gPQorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAgIDB4MzEsIDB4MDYsIDB4MTIsIDB4NDEsIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgICAweDEzLCAweDIyLCAweDMyLCAweDgxLCAweDA4LCAweDE0LCAweDQyLCAweDkxLAorICAgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsCisgICAgICAweGUxLCAweDI1LCAweGYxLCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDI2LAorICAgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAgIDB4MzksIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgICAweDQ5LCAweDRhLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LAorICAgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsCisgICAgICAweDc5LCAweDdhLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgICAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGIyLCAweGIzLCAweGI0LAorICAgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsCisgICAgICAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLAorICAgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAgIDB4ZWEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgICAweGY5LCAweGZhIH07CisgIAorICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19kY19sdW1pbmFuY2UsIHZhbF9kY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzBdLAorCQkgYml0c19hY19sdW1pbmFuY2UsIHZhbF9hY19sdW1pbmFuY2UpOworICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5kY19odWZmX3RibF9wdHJzWzFdLAorCQkgYml0c19kY19jaHJvbWluYW5jZSwgdmFsX2RjX2Nocm9taW5hbmNlKTsKKyAgYWRkX2h1ZmZfdGFibGUoY2luZm8sICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1sxXSwKKwkJIGJpdHNfYWNfY2hyb21pbmFuY2UsIHZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKworLyoKKyAqIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbi4KKyAqCisgKiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCBjaG9vc2UgdG8gdXNlIHRoaXMgcm91dGluZSBtdXN0IGRvIHRoZWlyCisgKiBvd24gc2V0dXAgb2YgYWxsIHRoZXNlIHBhcmFtZXRlcnMuICBBbHRlcm5hdGVseSwgeW91IGNhbiBjYWxsIHRoaXMKKyAqIHRvIGVzdGFibGlzaCBkZWZhdWx0cyBhbmQgdGhlbiBhbHRlciBwYXJhbWV0ZXJzIHNlbGVjdGl2ZWx5LiAgVGhpcworICogaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIHNpbmNlLCBpZiB3ZSBhZGQgYW55IG5ldyBwYXJhbWV0ZXJzLAorICogeW91ciBjb2RlIHdpbGwgc3RpbGwgd29yayAodGhleSdsbCBiZSBzZXQgdG8gcmVhc29uYWJsZSBkZWZhdWx0cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NldF9kZWZhdWx0cyAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBpOworCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEFsbG9jYXRlIGNvbXBfaW5mbyBhcnJheSBsYXJnZSBlbm91Z2ggZm9yIG1heGltdW0gY29tcG9uZW50IGNvdW50LgorICAgKiBBcnJheSBpcyBtYWRlIHBlcm1hbmVudCBpbiBjYXNlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNvbXByZXNzCisgICAqIG11bHRpcGxlIGltYWdlcyBhdCBzYW1lIHBhcmFtIHNldHRpbmdzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkKKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCSAgTUFYX0NPTVBPTkVOVFMgKiBTSVpFT0YoanBlZ19jb21wb25lbnRfaW5mbykpOworCisgIC8qIEluaXRpYWxpemUgZXZlcnl0aGluZyBub3QgZGVwZW5kZW50IG9uIHRoZSBjb2xvciBzcGFjZSAqLworCisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IEJJVFNfSU5fSlNBTVBMRTsKKyAgLyogU2V0IHVwIHR3byBxdWFudGl6YXRpb24gdGFibGVzIHVzaW5nIGRlZmF1bHQgcXVhbGl0eSBvZiA3NSAqLworICBqcGVnX3NldF9xdWFsaXR5KGNpbmZvLCA3NSwgVFJVRSk7CisgIC8qIFNldCB1cCB0d28gSHVmZm1hbiB0YWJsZXMgKi8KKyAgc3RkX2h1ZmZfdGFibGVzKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlZmF1bHQgYXJpdGhtZXRpYyBjb2RpbmcgY29uZGl0aW9uaW5nICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7CisgICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOworICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKKyAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7CisgIH0KKworICAvKiBEZWZhdWx0IGlzIG5vIG11bHRpcGxlLXNjYW4gb3V0cHV0ICovCisgIGNpbmZvLT5zY2FuX2luZm8gPSBOVUxMOworICBjaW5mby0+bnVtX3NjYW5zID0gMDsKKworICAvKiBFeHBlY3Qgbm9ybWFsIHNvdXJjZSBpbWFnZSwgbm90IHJhdyBkb3duc2FtcGxlZCBkYXRhICovCisgIGNpbmZvLT5yYXdfZGF0YV9pbiA9IEZBTFNFOworCisgIC8qIFVzZSBIdWZmbWFuIGNvZGluZywgbm90IGFyaXRobWV0aWMgY29kaW5nLCBieSBkZWZhdWx0ICovCisgIGNpbmZvLT5hcml0aF9jb2RlID0gRkFMU0U7CisKKyAgLyogQnkgZGVmYXVsdCwgZG9uJ3QgZG8gZXh0cmEgcGFzc2VzIHRvIG9wdGltaXplIGVudHJvcHkgY29kaW5nICovCisgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBGQUxTRTsKKyAgLyogVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IHZhbGlkIGZvciA4LWJpdCBkYXRhIHByZWNpc2lvbi4KKyAgICogSWYgdGhlIHByZWNpc2lvbiBpcyBoaWdoZXIsIGZvcmNlIG9wdGltaXphdGlvbiBvbiBzbyB0aGF0IHVzYWJsZQorICAgKiB0YWJsZXMgd2lsbCBiZSBjb21wdXRlZC4gIFRoaXMgdGVzdCBjYW4gYmUgcmVtb3ZlZCBpZiBkZWZhdWx0IHRhYmxlcworICAgKiBhcmUgc3VwcGxpZWQgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBkZXNpcmVkIHByZWNpc2lvbi4KKyAgICovCisgIGlmIChjaW5mby0+ZGF0YV9wcmVjaXNpb24gPiA4KQorICAgIGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcgPSBUUlVFOworCisgIC8qIEJ5IGRlZmF1bHQsIHVzZSB0aGUgc2ltcGxlciBub24tY29zaXRlZCBzYW1wbGluZyBhbGlnbm1lbnQgKi8KKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsKKworICAvKiBObyBpbnB1dCBzbW9vdGhpbmcgKi8KKyAgY2luZm8tPnNtb290aGluZ19mYWN0b3IgPSAwOworCisgIC8qIERDVCBhbGdvcml0aG0gcHJlZmVyZW5jZSAqLworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKworICAvKiBObyByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOworICBjaW5mby0+cmVzdGFydF9pbl9yb3dzID0gMDsKKworICAvKiBGaWxsIGluIGRlZmF1bHQgSkZJRiBtYXJrZXIgcGFyYW1ldGVycy4gIE5vdGUgdGhhdCB3aGV0aGVyIHRoZSBtYXJrZXIKKyAgICogd2lsbCBhY3R1YWxseSBiZSB3cml0dGVuIGlzIGRldGVybWluZWQgYnkganBlZ19zZXRfY29sb3JzcGFjZS4KKyAgICoKKyAgICogQnkgZGVmYXVsdCwgdGhlIGxpYnJhcnkgZW1pdHMgSkZJRiB2ZXJzaW9uIGNvZGUgMS4wMS4KKyAgICogQW4gYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBlbWl0IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBzaG91bGQgc2V0CisgICAqIEpGSUZfbWlub3JfdmVyc2lvbiB0byAyLiAgV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcKKyAgICogdG8gMS4wMiwgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBzb21lIGRlY29kZXJzIGluIHVzZSB0aGF0IHdpbGwgY29tcGxhaW4KKyAgICogYWJvdXQgdGhhdDsgc2F5aW5nIDEuMDEgc2hvdWxkIG1pbmltaXplIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuCisgICAqLworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogRGVmYXVsdCBKRklGIHZlcnNpb24gPSAxLjAxICovCisgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSAxOworICBjaW5mby0+ZGVuc2l0eV91bml0ID0gMDsJLyogUGl4ZWwgc2l6ZSBpcyB1bmtub3duIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPlhfZGVuc2l0eSA9IDE7CQkvKiBQaXhlbCBhc3BlY3QgcmF0aW8gaXMgc3F1YXJlIGJ5IGRlZmF1bHQgKi8KKyAgY2luZm8tPllfZGVuc2l0eSA9IDE7CisKKyAgLyogQ2hvb3NlIEpQRUcgY29sb3JzcGFjZSBiYXNlZCBvbiBpbnB1dCBzcGFjZSwgc2V0IGRlZmF1bHRzIGFjY29yZGluZ2x5ICovCisKKyAganBlZ19kZWZhdWx0X2NvbG9yc3BhY2UoY2luZm8pOworfQorCisKKy8qCisgKiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGZvciBpbl9jb2xvcl9zcGFjZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgc3dpdGNoIChjaW5mby0+aW5fY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19HUkFZU0NBTEUpOworICAgIGJyZWFrOworICBjYXNlIEpDU19SR0I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfWUNiQ3I6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfQ01ZSyk7IC8qIEJ5IGRlZmF1bHQsIG5vIHRyYW5zbGF0aW9uICovCisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1lDQ0s6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDQ0spOworICAgIGJyZWFrOworICBjYXNlIEpDU19VTktOT1dOOgorICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19VTktOT1dOKTsKKyAgICBicmVhazsKKyNpZmRlZiBBTkRST0lEX1JHQgorICBjYXNlIEpDU19SR0JfNTY1OgorICBjYXNlIEpDU19SR0JBXzg4ODg6CisgICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1lDYkNyKTsKKyAgICBicmVhazsKKyNlbmRpZiAgLyogQU5EUk9JRF9SR0IgKi8KKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKKyAgfQorfQorCisKKy8qCisgKiBTZXQgdGhlIEpQRUcgY29sb3JzcGFjZSwgYW5kIGNob29zZSBjb2xvcnNwYWNlLWRlcGVuZGVudCBkZWZhdWx0IHZhbHVlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfc2V0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0NPTE9SX1NQQUNFIGNvbG9yc3BhY2UpCit7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBpbnQgY2k7CisKKyNkZWZpbmUgU0VUX0NPTVAoaW5kZXgsaWQsaHNhbXAsdnNhbXAscXVhbnQsZGN0YmwsYWN0YmwpICBcCisgIChjb21wcHRyID0gJmNpbmZvLT5jb21wX2luZm9baW5kZXhdLCBcCisgICBjb21wcHRyLT5jb21wb25lbnRfaWQgPSAoaWQpLCBcCisgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yID0gKGhzYW1wKSwgXAorICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9ICh2c2FtcCksIFwKKyAgIGNvbXBwdHItPnF1YW50X3RibF9ubyA9IChxdWFudCksIFwKKyAgIGNvbXBwdHItPmRjX3RibF9ubyA9IChkY3RibCksIFwKKyAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChhY3RibCkgKQorCisgIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworCisgIC8qIEZvciBhbGwgY29sb3JzcGFjZXMsIHdlIHVzZSBRIGFuZCBIdWZmIHRhYmxlcyAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cywKKyAgICogdGFibGVzIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgICAqLworCisgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gY29sb3JzcGFjZTsKKworICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBGQUxTRTsgLyogTm8gbWFya2VyIGZvciBub24tSkZJRiBjb2xvcnNwYWNlcyAqLworICBjaW5mby0+d3JpdGVfQWRvYmVfbWFya2VyID0gRkFMU0U7IC8qIHdyaXRlIG5vIEFkb2JlIG1hcmtlciBieSBkZWZhdWx0ICovCisKKyAgc3dpdGNoIChjb2xvcnNwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMTsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSUQgMSAqLworICAgIFNFVF9DT01QKDAsIDEsIDEsMSwgMCwgMCwwKTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBSR0IgKi8KKyAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOworICAgIFNFVF9DT01QKDAsIDB4NTIgLyogJ1InICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMHg0NyAvKiAnRycgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgyLCAweDQyIC8qICdCJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIgPSBUUlVFOyAvKiBXcml0ZSBhIEpGSUYgbWFya2VyICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gMzsKKyAgICAvKiBKRklGIHNwZWNpZmllcyBjb21wb25lbnQgSURzIDEsMiwzICovCisgICAgLyogV2UgZGVmYXVsdCB0byAyeDIgc3Vic2FtcGxlcyBvZiBjaHJvbWluYW5jZSAqLworICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7CisgICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOworICAgIGJyZWFrOworICBjYXNlIEpDU19DTVlLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBDTVlLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAweDQzIC8qICdDJyAqLywgMSwxLCAwLCAwLDApOworICAgIFNFVF9DT01QKDEsIDB4NEQgLyogJ00nICovLCAxLDEsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMiwgMHg1OSAvKiAnWScgKi8sIDEsMSwgMCwgMCwwKTsKKyAgICBTRVRfQ09NUCgzLCAweDRCIC8qICdLJyAqLywgMSwxLCAwLCAwLDApOworICAgIGJyZWFrOworICBjYXNlIEpDU19ZQ0NLOgorICAgIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBUUlVFOyAvKiB3cml0ZSBBZG9iZSBtYXJrZXIgdG8gZmxhZyBZQ0NLICovCisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gNDsKKyAgICBTRVRfQ09NUCgwLCAxLCAyLDIsIDAsIDAsMCk7CisgICAgU0VUX0NPTVAoMSwgMiwgMSwxLCAxLCAxLDEpOworICAgIFNFVF9DT01QKDIsIDMsIDEsMSwgMSwgMSwxKTsKKyAgICBTRVRfQ09NUCgzLCA0LCAyLDIsIDAsIDAsMCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1VOS05PV046CisgICAgY2luZm8tPm51bV9jb21wb25lbnRzID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyA8IDEgfHwgY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKKwkgICAgICAgTUFYX0NPTVBPTkVOVFMpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgU0VUX0NPTVAoY2ksIGNpLCAxLDEsIDAsIDAsMCk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworTE9DQUwoanBlZ19zY2FuX2luZm8gKikKK2ZpbGxfYV9zY2FuIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBjaSwKKwkgICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKKy8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIHNwZWNpZmllZCBjb21wb25lbnQgKi8KK3sKKyAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IGNpOworICBzY2FucHRyLT5TcyA9IFNzOworICBzY2FucHRyLT5TZSA9IFNlOworICBzY2FucHRyLT5BaCA9IEFoOworICBzY2FucHRyLT5BbCA9IEFsOworICBzY2FucHRyKys7CisgIHJldHVybiBzY2FucHRyOworfQorCitMT0NBTChqcGVnX3NjYW5faW5mbyAqKQorZmlsbF9zY2FucyAoanBlZ19zY2FuX2luZm8gKiBzY2FucHRyLCBpbnQgbmNvbXBzLAorCSAgICBpbnQgU3MsIGludCBTZSwgaW50IEFoLCBpbnQgQWwpCisvKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIG9uZSBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLworeworICBpbnQgY2k7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7CisgICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IDE7CisgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7CisgICAgc2NhbnB0ci0+U3MgPSBTczsKKyAgICBzY2FucHRyLT5TZSA9IFNlOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKK0xPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCitmaWxsX2RjX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsIGludCBBaCwgaW50IEFsKQorLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBpbnRlcmxlYXZlZCBEQyBzY2FuIGlmIHBvc3NpYmxlLCBlbHNlIE4gc2NhbnMgKi8KK3sKKyAgaW50IGNpOworCisgIGlmIChuY29tcHMgPD0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKyAgICAvKiBTaW5nbGUgaW50ZXJsZWF2ZWQgREMgc2NhbiAqLworICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKQorICAgICAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXSA9IGNpOworICAgIHNjYW5wdHItPlNzID0gc2NhbnB0ci0+U2UgPSAwOworICAgIHNjYW5wdHItPkFoID0gQWg7CisgICAgc2NhbnB0ci0+QWwgPSBBbDsKKyAgICBzY2FucHRyKys7CisgIH0gZWxzZSB7CisgICAgLyogTm9uaW50ZXJsZWF2ZWQgREMgc2NhbiBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDAsIEFoLCBBbCk7CisgIH0KKyAgcmV0dXJuIHNjYW5wdHI7Cit9CisKKworLyoKKyAqIENyZWF0ZSBhIHJlY29tbWVuZGVkIHByb2dyZXNzaXZlLUpQRUcgc2NyaXB0LgorICogY2luZm8tPm51bV9jb21wb25lbnRzIGFuZCBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSBtdXN0IGJlIGNvcnJlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIGludCBuY29tcHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgIGludCBuc2NhbnM7CisgIGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0cjsKKworICAvKiBTYWZldHkgY2hlY2sgdG8gZW5zdXJlIHN0YXJ0X2NvbXByZXNzIG5vdCBjYWxsZWQgeWV0LiAqLworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworICAvKiBGaWd1cmUgc3BhY2UgbmVlZGVkIGZvciBzY3JpcHQuICBDYWxjdWxhdGlvbiBtdXN0IG1hdGNoIGNvZGUgYmVsb3chICovCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgbnNjYW5zID0gMTA7CisgIH0gZWxzZSB7CisgICAgLyogQWxsLXB1cnBvc2Ugc2NyaXB0IGZvciBvdGhlciBjb2xvciBzcGFjZXMuICovCisgICAgaWYgKG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgICAgbnNjYW5zID0gNiAqIG5jb21wczsJLyogMiBEQyArIDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLworICAgIGVsc2UKKyAgICAgIG5zY2FucyA9IDIgKyA0ICogbmNvbXBzOwkvKiAyIERDIHNjYW5zOyA0IEFDIHNjYW5zIHBlciBjb21wb25lbnQgKi8KKyAgfQorCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBzY3JpcHQuCisgICAqIFdlIG5lZWQgdG8gcHV0IGl0IGluIHRoZSBwZXJtYW5lbnQgcG9vbCBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiBwZXJmb3JtcworICAgKiBtdWx0aXBsZSBjb21wcmVzc2lvbnMgd2l0aG91dCBjaGFuZ2luZyB0aGUgc2V0dGluZ3MuICBUbyBhdm9pZCBhIG1lbW9yeQorICAgKiBsZWFrIGlmIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIGlzIGNhbGxlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBKUEVHCisgICAqIG9iamVjdCwgd2UgdHJ5IHRvIHJlLXVzZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGFjZSwgYW5kIHdlIGFsbG9jYXRlCisgICAqIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgWUNiQ3IgZXZlbiBpZiBpbml0aWFsbHkgYXNrZWQgZm9yIGdyYXlzY2FsZS4KKyAgICovCisgIGlmIChjaW5mby0+c2NyaXB0X3NwYWNlID09IE5VTEwgfHwgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplIDwgbnNjYW5zKSB7CisgICAgY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplID0gTUFYKG5zY2FucywgMTApOworICAgIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJY2luZm8tPnNjcmlwdF9zcGFjZV9zaXplICogU0laRU9GKGpwZWdfc2Nhbl9pbmZvKSk7CisgIH0KKyAgc2NhbnB0ciA9IGNpbmZvLT5zY3JpcHRfc3BhY2U7CisgIGNpbmZvLT5zY2FuX2luZm8gPSBzY2FucHRyOworICBjaW5mby0+bnVtX3NjYW5zID0gbnNjYW5zOworCisgIGlmIChuY29tcHMgPT0gMyAmJiBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAvKiBDdXN0b20gc2NyaXB0IGZvciBZQ2JDciBjb2xvciBpbWFnZXMuICovCisgICAgLyogSW5pdGlhbCBEQyBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKKyAgICAvKiBJbml0aWFsIEFDIHNjYW46IGdldCBzb21lIGx1bWEgZGF0YSBvdXQgaW4gYSBodXJyeSAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA1LCAwLCAyKTsKKyAgICAvKiBDaHJvbWEgZGF0YSBpcyB0b28gc21hbGwgdG8gYmUgd29ydGggZXhwZW5kaW5nIG1hbnkgc2NhbnMgb24gKi8KKyAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMiwgMSwgNjMsIDAsIDEpOworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAxLCAxLCA2MywgMCwgMSk7CisgICAgLyogQ29tcGxldGUgc3BlY3RyYWwgc2VsZWN0aW9uIGZvciBsdW1hIEFDICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBSZWZpbmUgbmV4dCBiaXQgb2YgbHVtYSBBQyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAwLCAxLCA2MywgMiwgMSk7CisgICAgLyogRmluaXNoIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgLyogRmluaXNoIEFDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiAqLworICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAxLCAwKTsKKyAgICAvKiBMdW1hIGJvdHRvbSBiaXQgY29tZXMgbGFzdCBzaW5jZSBpdCdzIHVzdWFsbHkgbGFyZ2VzdCBzY2FuICovCisgICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAxLCAwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmlyc3QgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMSk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA1LCAwLCAyKTsKKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDYsIDYzLCAwLCAyKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gc2Vjb25kIHBhc3MgKi8KKyAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAyLCAxKTsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gZmluYWwgcGFzcyAqLworICAgIHNjYW5wdHIgPSBmaWxsX2RjX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgMCk7CisgICAgc2NhbnB0ciA9IGZpbGxfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCA2MywgMSwgMCk7CisgIH0KK30KKworI2VuZGlmIC8qIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNwaHVmZi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjcGh1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2Y5MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjcGh1ZmYuYwpAQCAtMCwwICsxLDgzMyBAQAorLyoKKyAqIGpjcGh1ZmYuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KKyAqCisgKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKKyAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKKyAqIHN1c3BlbnNpb24uCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCisKKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorCisvKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLworICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOworCisgIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgorICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgorICAgKi8KKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLworICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLworICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCisKKyAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLworICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLworICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCisgIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KKyAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KKyAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLworCisgIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLworICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KKyAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKKyAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KKyAgICovCisgIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107CisKKyAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCisgIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOworfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0CisgKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAorICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCisgKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KKyAqLworCisjZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLworCisvKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KKyAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKKyAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOworI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKwkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCisJIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCit7ICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGJvb2xlYW4gaXNfRENfYmFuZDsKKyAgaW50IGNpLCB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIGVudHJvcHktPmNpbmZvID0gY2luZm87CisgIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KKworICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCisgIGlmIChjaW5mby0+QWggPT0gMCkgeworICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7CisgICAgZWxzZSB7CisgICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOworICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLworICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKKwllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKKwkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7CisgICAgfQorICB9CisgIGlmIChnYXRoZXJfc3RhdGlzdGljcykKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7CisgIGVsc2UKKyAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKKworICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQorICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgICAgLyogR2V0IHRhYmxlIGluZGV4ICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLworCWNvbnRpbnVlOworICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgfQorICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgeworICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KKyAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLworICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCisgICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7CisgICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KKyAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KKyAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKKwllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQorCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOworICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KKyAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCisgICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgfQorICB9CisKKyAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLworICBlbnRyb3B5LT5FT0JSVU4gPSAwOworICBlbnRyb3B5LT5CRSA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOworICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOworfQorCisKKy8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCisgKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCisgKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KKyAqLworCisvKiBFbWl0IGEgYnl0ZSAqLworI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCisJeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKKwkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKKwkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KKworCitMT0NBTCh2b2lkKQorZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCisvKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KK3sKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OworCisgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKKyAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7CisgIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Cit9CisKKworLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCisKKy8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCisgKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKKyAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgorICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KKyAqLworCitJTkxJTkUKK0xPQ0FMKHZvaWQpCitlbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKKy8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCit7CisgIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCisgIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7CisgIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOworCisgIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCisgIGlmIChzaXplID09IDApCisgICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7CisKKyAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQorICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLworCisgIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KKyAgCisgIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCisgIAorICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCisKKyAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCisKKyAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKKyAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKKyAgICAKKyAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7CisgICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KKyAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKKyAgICB9CisgICAgcHV0X2J1ZmZlciA8PD0gODsKKyAgICBwdXRfYml0cyAtPSA4OworICB9CisKKyAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKK30KKworCitMT0NBTCh2b2lkKQorZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKK3sKKyAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCisgIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KKyAgZW50cm9weS0+cHV0X2JpdHMgPSAwOworfQorCisKKy8qCisgKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgorICovCisKK0lOTElORQorTE9DQUwodm9pZCkKK2VtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQoreworICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCisgICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKKyAgZWxzZSB7CisgICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKKyAgfQorfQorCisKKy8qCisgKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCisJCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisgIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKKyAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCisKKyAgd2hpbGUgKG5iaXRzID4gMCkgeworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7CisgICAgYnVmc3RhcnQrKzsKKyAgICBuYml0cy0tOworICB9Cit9CisKKworLyoKKyAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCit7CisgIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKKworICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KKyAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOworICAgIG5iaXRzID0gMDsKKyAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQorICAgICAgbmJpdHMrKzsKKyAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KKyAgICBpZiAobmJpdHMgPiAxNCkKKyAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOworCisgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKKyAgICBpZiAobmJpdHMpCisgICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7CisKKyAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOworCisgICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCisgICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKKyAgICBlbnRyb3B5LT5CRSA9IDA7CisgIH0KK30KKworCisvKgorICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KKyAqLworCitMT0NBTCh2b2lkKQorZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCit7CisgIGludCBjaTsKKworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgeworICAgIGZsdXNoX2JpdHMoZW50cm9weSk7CisgICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOworICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7CisgIH0KKworICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKKyAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKKyAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIH0gZWxzZSB7CisgICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLworICAgIGVudHJvcHktPkVPQlJVTiA9IDA7CisgICAgZW50cm9weS0+QkUgPSAwOworICB9Cit9CisKKworLyoKKyAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7CisgIHJlZ2lzdGVyIGludCBuYml0czsKKyAgaW50IGJsa24sIGNpOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElTSElGVF9URU1QUworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCisgICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KKyAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgICAqLworICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKKworICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCisgICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOworICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOworCisgICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KKyAgICB0ZW1wMiA9IHRlbXA7CisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLworICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCisgICAgICB0ZW1wMi0tOworICAgIH0KKyAgICAKKyAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCisgICAgbmJpdHMgPSAwOworICAgIHdoaWxlICh0ZW1wKSB7CisgICAgICBuYml0cysrOworICAgICAgdGVtcCA+Pj0gMTsKKyAgICB9CisgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCisgICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KKyAgICAgKi8KKyAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7CisgICAgCisgICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOworICAgIAorICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLworICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLworICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLworICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKKyAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOworICByZWdpc3RlciBpbnQgbmJpdHM7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgU2UgPSBjaW5mby0+U2U7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgSkJMT0NLUk9XIGJsb2NrOworCisgIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKKyAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7CisKKyAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQorICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOworCisgIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KKyAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKworICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLworICAKKyAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KKyAgIAorICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKKyAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQorICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCisgICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCisgICAgICovCisgICAgaWYgKHRlbXAgPCAwKSB7CisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLworICAgICAgdGVtcDIgPSB+dGVtcDsKKyAgICB9IGVsc2UgeworICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCisgICAgICB0ZW1wMiA9IHRlbXA7CisgICAgfQorICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGlmICh0ZW1wID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCisgICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCisgICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCisgICAgd2hpbGUgKHIgPiAxNSkgeworICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKKyAgICAgIHIgLT0gMTY7CisgICAgfQorCisgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLworICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLworICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCisgICAgICBuYml0cysrOworICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7CisKKyAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KKyAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKKworICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLworICB9CisKKyAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKKyAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2VuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIHJlZ2lzdGVyIGludCB0ZW1wOworICBpbnQgYmxrbjsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICBKQkxPQ0tST1cgYmxvY2s7CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KKyAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKKyAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworCisgICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCisgICAgdGVtcCA9ICgqYmxvY2spWzBdOworICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOworICB9CisKKyAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOworICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKKyAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7CisgICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7CisgICAgfQorICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgcmVnaXN0ZXIgaW50IHRlbXA7CisgIHJlZ2lzdGVyIGludCByLCBrOworICBpbnQgRU9COworICBjaGFyICpCUl9idWZmZXI7CisgIHVuc2lnbmVkIGludCBCUjsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgQWwgPSBjaW5mby0+QWw7CisgIEpCTE9DS1JPVyBibG9jazsKKyAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07CisKKyAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOworICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKKworICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7CisKKyAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLworICBibG9jayA9IE1DVV9kYXRhWzBdOworCisgIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKKyAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCisgICAqLworICBFT0IgPSAwOworICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgeworICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOworICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcworICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5CisgICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAodGVtcCA8IDApCisgICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLworICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLworICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KKyAgICBpZiAodGVtcCA9PSAxKQorICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLworICB9CisKKyAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KKyAgCisgIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCisgIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCisgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCisKKyAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKyAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKKyAgICAgIHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCisgICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgeworICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOworICAgICAgLyogRW1pdCBaUkwgKi8KKyAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7CisgICAgICByIC09IDE2OworICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KKyAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCisgICAgICBCUiA9IDA7CisgICAgfQorCisgICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgorICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKKyAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCisgICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCisgICAgICovCisgICAgaWYgKHRlbXAgPiAxKSB7CisgICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KKyAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KKyAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLworICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKKworICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCisgICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKKyAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7CisKKyAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLworICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKKyAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLworICAgIEJSID0gMDsKKyAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KKyAgfQorCisgIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KKyAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLworICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCisgICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6CisgICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOworICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KKyAgICAgKi8KKyAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQorICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CisgIH0KKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgeworICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKKyAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKKyAgICB9CisgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7CisgIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOworCisgIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKyAgZmx1c2hfYml0cyhlbnRyb3B5KTsKKworICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7CisgIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQ7CisgIGludCBjaSwgdGJsOworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKKyAgSkhVRkZfVEJMICoqaHRibHB0cjsKKyAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107CisKKyAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLworICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKKworICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKKworICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQorICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCisgICAqLworICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBpZiAoaXNfRENfYmFuZCkgeworICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJY29udGludWU7CisgICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICB9CisgICAgaWYgKCEgZGlkW3RibF0pIHsKKyAgICAgIGlmIChpc19EQ19iYW5kKQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgZWxzZQorICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOworICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOworICAgICAgZGlkW3RibF0gPSBUUlVFOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7CisKKyAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7CisgIH0KKyAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLworfQorCisjZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY3ByZXBjdC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjcHJlcGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MzMzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qY3ByZXBjdC5jCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogamNwcmVwY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb21wcmVzc2lvbiBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKiBUaGlzIGNvbnRyb2xsZXIgbWFuYWdlcyB0aGUgY29sb3IgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nLAorICogYW5kIGVkZ2UgZXhwYW5zaW9uIHN0ZXBzLgorICoKKyAqIE1vc3Qgb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyaW5nIGlucHV0IHJvd3MKKyAqIGFzIHJlcXVpcmVkIGJ5IHRoZSBkb3duc2FtcGxlci4gIFNlZSB0aGUgY29tbWVudHMgYXQgdGhlIGhlYWQgb2YKKyAqIGpjc2FtcGxlLmMgZm9yIHRoZSBkb3duc2FtcGxlcidzIG5lZWRzLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKiBBdCBwcmVzZW50LCBqY3NhbXBsZS5jIGNhbiByZXF1ZXN0IGNvbnRleHQgcm93cyBvbmx5IGZvciBzbW9vdGhpbmcuCisgKiBJbiB0aGUgZnV0dXJlLCB3ZSBtaWdodCBhbHNvIG5lZWQgY29udGV4dCByb3dzIGZvciBDQ0lSNjAxIHNhbXBsaW5nCisgKiBvciBvdGhlciBtb3JlLWNvbXBsZXggZG93bnNhbXBsaW5nIHByb2NlZHVyZXMuICBUaGUgY29kZSB0byBzdXBwb3J0CisgKiBjb250ZXh0IHJvd3Mgc2hvdWxkIGJlIGNvbXBpbGVkIG9ubHkgaWYgbmVlZGVkLgorICovCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorI2RlZmluZSBDT05URVhUX1JPV1NfU1VQUE9SVEVECisjZW5kaWYKKworCisvKgorICogRm9yIHRoZSBzaW1wbGUgKG5vLWNvbnRleHQtcm93KSBjYXNlLCB3ZSBqdXN0IG5lZWQgdG8gYnVmZmVyIG9uZQorICogcm93IGdyb3VwJ3Mgd29ydGggb2YgcGl4ZWxzIGZvciB0aGUgZG93bnNhbXBsaW5nIHN0ZXAuICBBdCB0aGUgYm90dG9tIG9mCisgKiB0aGUgaW1hZ2UsIHdlIHBhZCB0byBhIGZ1bGwgcm93IGdyb3VwIGJ5IHJlcGxpY2F0aW5nIHRoZSBsYXN0IHBpeGVsIHJvdy4KKyAqIFRoZSBkb3duc2FtcGxlcidzIGxhc3Qgb3V0cHV0IHJvdyBpcyB0aGVuIHJlcGxpY2F0ZWQgaWYgbmVlZGVkIHRvIHBhZAorICogb3V0IHRvIGEgZnVsbCBpTUNVIHJvdy4KKyAqCisgKiBXaGVuIHByb3ZpZGluZyBjb250ZXh0IHJvd3MsIHdlIG11c3QgYnVmZmVyIHRocmVlIHJvdyBncm91cHMnIHdvcnRoIG9mCisgKiBwaXhlbHMuICBUaHJlZSByb3cgZ3JvdXBzIGFyZSBwaHlzaWNhbGx5IGFsbG9jYXRlZCwgYnV0IHRoZSByb3cgcG9pbnRlcgorICogYXJyYXlzIGFyZSBtYWRlIGZpdmUgcm93IGdyb3VwcyBoaWdoLCB3aXRoIHRoZSBleHRyYSBwb2ludGVycyBhYm92ZSBhbmQKKyAqIGJlbG93ICJ3cmFwcGluZyBhcm91bmQiIHRvIHBvaW50IHRvIHRoZSBsYXN0IGFuZCBmaXJzdCByZWFsIHJvdyBncm91cHMuCisgKiBUaGlzIGFsbG93cyB0aGUgZG93bnNhbXBsZXIgdG8gYWNjZXNzIHRoZSBwcm9wZXIgY29udGV4dCByb3dzLgorICogQXQgdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgY3JlYXRlIGR1bW15IGNvbnRleHQgcm93cyBieQorICogY29weWluZyB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4gIFRoaXMgY29weWluZyBjb3VsZCBiZSBhdm9pZGVkCisgKiBieSBwb2ludGVyIGhhY2tpbmcgYXMgaXMgZG9uZSBpbiBqZG1haW5jdC5jLCBidXQgaXQgZG9lc24ndCBzZWVtIHdvcnRoIHRoZQorICogdHJvdWJsZSBvbiB0aGUgY29tcHJlc3Npb24gc2lkZS4KKyAqLworCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlci4gIFRoaXMgYnVmZmVyIGhvbGRzIGNvbG9yLWNvbnZlcnRlZCBkYXRhCisgICAqIHVudGlsIHdlIGhhdmUgZW5vdWdoIHRvIGRvIGEgZG93bnNhbXBsZSBzdGVwLgorICAgKi8KKyAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOworCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIHNvdXJjZSBpbWFnZSAqLworICBpbnQgbmV4dF9idWZfcm93OwkJLyogaW5kZXggb2YgbmV4dCByb3cgdG8gc3RvcmUgaW4gY29sb3JfYnVmICovCisKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECS8qIG9ubHkgbmVlZGVkIGZvciBjb250ZXh0IGNhc2UgKi8KKyAgaW50IHRoaXNfcm93X2dyb3VwOwkJLyogc3RhcnRpbmcgcm93IGluZGV4IG9mIGdyb3VwIHRvIHByb2Nlc3MgKi8KKyAgaW50IG5leHRfYnVmX3N0b3A7CQkvKiBkb3duc2FtcGxlIHdoZW4gd2UgcmVhY2ggdGhpcyBpbmRleCAqLworI2VuZGlmCit9IG15X3ByZXBfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wcmVwX2NvbnRyb2xsZXIgKiBteV9wcmVwX3B0cjsKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3ByZXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7CisKKyAgaWYgKHBhc3NfbW9kZSAhPSBKQlVGX1BBU1NfVEhSVSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICBwcmVwLT5yb3dzX3RvX2dvID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgIC8qIFByZXNldCBhZGRpdGlvbmFsIHN0YXRlIHZhcmlhYmxlcyBmb3IgY29udGV4dCBtb2RlLgorICAgKiBUaGVzZSBhcmVuJ3QgdXNlZCBpbiBub24tY29udGV4dCBtb2RlLCBzbyB3ZSBuZWVkbid0IHRlc3Qgd2hpY2ggbW9kZS4KKyAgICovCisgIHByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgLyogU2V0IG5leHRfYnVmX3N0b3AgdG8gc3RvcCBhZnRlciB0d28gcm93IGdyb3VwcyBoYXZlIGJlZW4gcmVhZCBpbi4gKi8KKyAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IDIgKiBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisjZW5kaWYKK30KKworCisvKgorICogRXhwYW5kIGFuIGltYWdlIHZlcnRpY2FsbHkgZnJvbSBoZWlnaHQgaW5wdXRfcm93cyB0byBoZWlnaHQgb3V0cHV0X3Jvd3MsCisgKiBieSBkdXBsaWNhdGluZyB0aGUgYm90dG9tIHJvdy4KKyAqLworCitMT0NBTCh2b2lkKQorZXhwYW5kX2JvdHRvbV9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIEpESU1FTlNJT04gbnVtX2NvbHMsCisJCSAgICBpbnQgaW5wdXRfcm93cywgaW50IG91dHB1dF9yb3dzKQoreworICByZWdpc3RlciBpbnQgcm93OworCisgIGZvciAocm93ID0gaW5wdXRfcm93czsgcm93IDwgb3V0cHV0X3Jvd3M7IHJvdysrKSB7CisgICAgamNvcHlfc2FtcGxlX3Jvd3MoaW1hZ2VfZGF0YSwgaW5wdXRfcm93cy0xLCBpbWFnZV9kYXRhLCByb3csCisJCSAgICAgIDEsIG51bV9jb2xzKTsKKyAgfQorfQorCisKKy8qCisgKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2ltcGxlIG5vLWNvbnRleHQgY2FzZS4KKyAqCisgKiBQcmVwcm9jZXNzb3Igb3V0cHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSB2X3NhbXBfZmFjdG9yIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LgorICogRG93bnNhbXBsaW5nIHdpbGwgcHJvZHVjZSB0aGlzIG11Y2ggZGF0YSBmcm9tIGVhY2ggbWF4X3Zfc2FtcF9mYWN0b3IKKyAqIGlucHV0IHJvd3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBKRElNRU5TSU9OIGlucm93czsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgd2hpbGUgKCppbl9yb3dfY3RyIDwgaW5fcm93c19hdmFpbCAmJgorCSAqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOworICAgIG51bXJvd3MgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7CisgICAgbnVtcm93cyA9IChpbnQpIE1JTigoSkRJTUVOU0lPTikgbnVtcm93cywgaW5yb3dzKTsKKyAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkgICAgICAgcHJlcC0+Y29sb3JfYnVmLAorCQkJCSAgICAgICAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAorCQkJCSAgICAgICBudW1yb3dzKTsKKyAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOworICAgIHByZXAtPm5leHRfYnVmX3JvdyArPSBudW1yb3dzOworICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICBpZiAocHJlcC0+cm93c190b19nbyA9PSAwICYmCisJcHJlcC0+bmV4dF9idWZfcm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKwlleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgcHJlcC0+bmV4dF9idWZfcm93LCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgICAgfQorICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBmaWxsZWQgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBlbXB0eSBpdC4gKi8KKyAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAorCQkJCQlwcmVwLT5jb2xvcl9idWYsIChKRElNRU5TSU9OKSAwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKKyAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7CisgICAgfQorICAgIC8qIElmIGF0IGJvdHRvbSBvZiBpbWFnZSwgcGFkIHRoZSBvdXRwdXQgdG8gYSBmdWxsIGlNQ1UgaGVpZ2h0LgorICAgICAqIE5vdGUgd2UgYXNzdW1lIHRoZSBjYWxsZXIgaXMgcHJvdmlkaW5nIGEgb25lLWlNQ1UtaGVpZ2h0IG91dHB1dCBidWZmZXIhCisgICAgICovCisgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgorCSpvdXRfcm93X2dyb3VwX2N0ciA8IG91dF9yb3dfZ3JvdXBzX2F2YWlsKSB7CisgICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSAgIGNpKyssIGNvbXBwdHIrKykgeworCWV4cGFuZF9ib3R0b21fZWRnZShvdXRwdXRfYnVmW2NpXSwKKwkJCSAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCisJCQkgICAoaW50KSAoKm91dF9yb3dfZ3JvdXBfY3RyICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJCQkgICAoaW50KSAob3V0X3Jvd19ncm91cHNfYXZhaWwgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSk7CisgICAgICB9CisgICAgICAqb3V0X3Jvd19ncm91cF9jdHIgPSBvdXRfcm93X2dyb3Vwc19hdmFpbDsKKyAgICAgIGJyZWFrOwkJCS8qIGNhbiBleGl0IG91dGVyIGxvb3Agd2l0aG91dCB0ZXN0ICovCisgICAgfQorICB9Cit9CisKKworI2lmZGVmIENPTlRFWFRfUk9XU19TVVBQT1JURUQKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHRoZSBjb250ZXh0IGNhc2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVfcHJvY2Vzc19jb250ZXh0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJICAgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2dyb3VwX2N0ciwKKwkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBzX2F2YWlsKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IG51bXJvd3MsIGNpOworICBpbnQgYnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIDM7CisgIEpESU1FTlNJT04gaW5yb3dzOworCisgIHdoaWxlICgqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgeworICAgIGlmICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwpIHsKKyAgICAgIC8qIERvIGNvbG9yIGNvbnZlcnNpb24gdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCisgICAgICBpbnJvd3MgPSBpbl9yb3dzX2F2YWlsIC0gKmluX3Jvd19jdHI7CisgICAgICBudW1yb3dzID0gcHJlcC0+bmV4dF9idWZfc3RvcCAtIHByZXAtPm5leHRfYnVmX3JvdzsKKyAgICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7CisgICAgICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCBpbnB1dF9idWYgKyAqaW5fcm93X2N0ciwKKwkJCQkJIHByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJIChKRElNRU5TSU9OKSBwcmVwLT5uZXh0X2J1Zl9yb3csCisJCQkJCSBudW1yb3dzKTsKKyAgICAgIC8qIFBhZCBhdCB0b3Agb2YgaW1hZ2UsIGlmIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gY2luZm8tPmltYWdlX2hlaWdodCkgeworCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworCSAgaW50IHJvdzsKKwkgIGZvciAocm93ID0gMTsgcm93IDw9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcjsgcm93KyspIHsKKwkgICAgamNvcHlfc2FtcGxlX3Jvd3MocHJlcC0+Y29sb3JfYnVmW2NpXSwgMCwKKwkJCSAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0sIC1yb3csCisJCQkgICAgICAxLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgICppbl9yb3dfY3RyICs9IG51bXJvd3M7CisgICAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKKyAgICAgIHByZXAtPnJvd3NfdG9fZ28gLT0gbnVtcm93czsKKyAgICB9IGVsc2UgeworICAgICAgLyogUmV0dXJuIGZvciBtb3JlIGRhdGEsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuICovCisgICAgICBpZiAocHJlcC0+cm93c190b19nbyAhPSAwKQorCWJyZWFrOworICAgICAgLyogV2hlbiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0byBmaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlci4gKi8KKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPCBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisJZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisJICBleHBhbmRfYm90dG9tX2VkZ2UocHJlcC0+Y29sb3JfYnVmW2NpXSwgY2luZm8tPmltYWdlX3dpZHRoLAorCQkJICAgICBwcmVwLT5uZXh0X2J1Zl9yb3csIHByZXAtPm5leHRfYnVmX3N0b3ApOworCX0KKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSBwcmVwLT5uZXh0X2J1Zl9zdG9wOworICAgICAgfQorICAgIH0KKyAgICAvKiBJZiB3ZSd2ZSBnb3R0ZW4gZW5vdWdoIGRhdGEsIGRvd25zYW1wbGUgYSByb3cgZ3JvdXAuICovCisgICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBwcmVwLT5uZXh0X2J1Zl9zdG9wKSB7CisgICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5kb3duc2FtcGxlKSAoY2luZm8sCisJCQkJCXByZXAtPmNvbG9yX2J1ZiwKKwkJCQkJKEpESU1FTlNJT04pIHByZXAtPnRoaXNfcm93X2dyb3VwLAorCQkJCQlvdXRwdXRfYnVmLCAqb3V0X3Jvd19ncm91cF9jdHIpOworICAgICAgKCpvdXRfcm93X2dyb3VwX2N0cikrKzsKKyAgICAgIC8qIEFkdmFuY2UgcG9pbnRlcnMgd2l0aCB3cmFwYXJvdW5kIGFzIG5lY2Vzc2FyeS4gKi8KKyAgICAgIHByZXAtPnRoaXNfcm93X2dyb3VwICs9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICAgIGlmIChwcmVwLT50aGlzX3Jvd19ncm91cCA+PSBidWZfaGVpZ2h0KQorCXByZXAtPnRoaXNfcm93X2dyb3VwID0gMDsKKyAgICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPj0gYnVmX2hlaWdodCkKKwlwcmVwLT5uZXh0X2J1Zl9yb3cgPSAwOworICAgICAgcHJlcC0+bmV4dF9idWZfc3RvcCA9IHByZXAtPm5leHRfYnVmX3JvdyArIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB9CisgIH0KK30KKworCisvKgorICogQ3JlYXRlIHRoZSB3cmFwcGVkLWFyb3VuZCBkb3duc2FtcGxpbmcgaW5wdXQgYnVmZmVyIG5lZWRlZCBmb3IgY29udGV4dCBtb2RlLgorICovCisKK0xPQ0FMKHZvaWQpCitjcmVhdGVfY29udGV4dF9idWZmZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9wcmVwX3B0ciBwcmVwID0gKG15X3ByZXBfcHRyKSBjaW5mby0+cHJlcDsKKyAgaW50IHJncm91cF9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7CisgIGludCBjaSwgaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIEpTQU1QQVJSQVkgdHJ1ZV9idWZmZXIsIGZha2VfYnVmZmVyOworCisgIC8qIEdyYWIgZW5vdWdoIHNwYWNlIGZvciBmYWtlIHJvdyBwb2ludGVycyBmb3IgYWxsIHRoZSBjb21wb25lbnRzOworICAgKiB3ZSBuZWVkIGZpdmUgcm93IGdyb3Vwcycgd29ydGggb2YgcG9pbnRlcnMgZm9yIGVhY2ggY29tcG9uZW50LgorICAgKi8KKyAgZmFrZV9idWZmZXIgPSAoSlNBTVBBUlJBWSkKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShjaW5mby0+bnVtX2NvbXBvbmVudHMgKiA1ICogcmdyb3VwX2hlaWdodCkgKgorCQkJCVNJWkVPRihKU0FNUFJPVykpOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQWxsb2NhdGUgdGhlIGFjdHVhbCBidWZmZXIgc3BhY2UgKDMgcm93IGdyb3VwcykgZm9yIHRoaXMgY29tcG9uZW50LgorICAgICAqIFdlIG1ha2UgdGhlIGJ1ZmZlciB3aWRlIGVub3VnaCB0byBhbGxvdyB0aGUgZG93bnNhbXBsZXIgdG8gZWRnZS1leHBhbmQKKyAgICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCisgICAgICovCisgICAgdHJ1ZV9idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgorCQkgICAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisgICAgICAgKEpESU1FTlNJT04pICgzICogcmdyb3VwX2hlaWdodCkpOworICAgIC8qIENvcHkgdHJ1ZSBidWZmZXIgcm93IHBvaW50ZXJzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgZmFrZSByb3cgYXJyYXkgKi8KKyAgICBNRU1DT1BZKGZha2VfYnVmZmVyICsgcmdyb3VwX2hlaWdodCwgdHJ1ZV9idWZmZXIsCisJICAgIDMgKiByZ3JvdXBfaGVpZ2h0ICogU0laRU9GKEpTQU1QUk9XKSk7CisgICAgLyogRmlsbCBpbiB0aGUgYWJvdmUgYW5kIGJlbG93IHdyYXBhcm91bmQgcG9pbnRlcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwX2hlaWdodDsgaSsrKSB7CisgICAgICBmYWtlX2J1ZmZlcltpXSA9IHRydWVfYnVmZmVyWzIgKiByZ3JvdXBfaGVpZ2h0ICsgaV07CisgICAgICBmYWtlX2J1ZmZlcls0ICogcmdyb3VwX2hlaWdodCArIGldID0gdHJ1ZV9idWZmZXJbaV07CisgICAgfQorICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSBmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQ7CisgICAgZmFrZV9idWZmZXIgKz0gNSAqIHJncm91cF9oZWlnaHQ7IC8qIHBvaW50IHRvIHNwYWNlIGZvciBuZXh0IGNvbXBvbmVudCAqLworICB9Cit9CisKKyNlbmRpZiAvKiBDT05URVhUX1JPV1NfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY19wcmVwX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCit7CisgIG15X3ByZXBfcHRyIHByZXA7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaWYgKG5lZWRfZnVsbF9idWZmZXIpCQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgcHJlcCA9IChteV9wcmVwX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9wcmVwX2NvbnRyb2xsZXIpKTsKKyAgY2luZm8tPnByZXAgPSAoc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKikgcHJlcDsKKyAgcHJlcC0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3ByZXA7CisKKyAgLyogQWxsb2NhdGUgdGhlIGNvbG9yIGNvbnZlcnNpb24gYnVmZmVyLgorICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCisgICAqIGhvcml6b250YWxseSB3aXRoaW4gdGhlIGJ1ZmZlciwgaWYgaXQgc28gY2hvb3Nlcy4KKyAgICovCisgIGlmIChjaW5mby0+ZG93bnNhbXBsZS0+bmVlZF9jb250ZXh0X3Jvd3MpIHsKKyAgICAvKiBTZXQgdXAgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgKi8KKyNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECisgICAgcHJlcC0+cHViLnByZV9wcm9jZXNzX2RhdGEgPSBwcmVfcHJvY2Vzc19jb250ZXh0OworICAgIGNyZWF0ZV9jb250ZXh0X2J1ZmZlcihjaW5mbyk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8qIE5vIGNvbnRleHQsIGp1c3QgbWFrZSBpdCB0YWxsIGVub3VnaCBmb3Igb25lIHJvdyBncm91cCAqLworICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfZGF0YTsKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIHByZXAtPmNvbG9yX2J1ZltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCSAoSkRJTUVOU0lPTikgKCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRSAqCisJCQljaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjc2FtcGxlLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamNzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJlYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjc2FtcGxlLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8qCisgKiBqY3NhbXBsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZG93bnNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIERvd25zYW1wbGluZyBpbnB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKKyAqIGlzIGRlZmluZWQgdG8gYmUgbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWwgcm93cyBvZiBlYWNoIGNvbXBvbmVudCwKKyAqIGZyb20gd2hpY2ggdGhlIGRvd25zYW1wbGVyIHByb2R1Y2VzIHZfc2FtcF9mYWN0b3Igc2FtcGxlIHJvd3MuCisgKiBBIHNpbmdsZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIGluIGVhY2ggY2FsbCB0byB0aGUgZG93bnNhbXBsZXIgbW9kdWxlLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBpcyByZXNwb25zaWJsZSBmb3IgZWRnZS1leHBhbnNpb24gb2YgaXRzIG91dHB1dCBkYXRhCisgKiB0byBmaWxsIGFuIGludGVncmFsIG51bWJlciBvZiBEQ1QgYmxvY2tzIGhvcml6b250YWxseS4gIFRoZSBzb3VyY2UgYnVmZmVyCisgKiBtYXkgYmUgbW9kaWZpZWQgaWYgaXQgaXMgaGVscGZ1bCBmb3IgdGhpcyBwdXJwb3NlICh0aGUgc291cmNlIGJ1ZmZlciBpcworICogYWxsb2NhdGVkIHdpZGUgZW5vdWdoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGRlc2lyZWQgb3V0cHV0IHdpZHRoKS4KKyAqIFRoZSBjYWxsZXIgKHRoZSBwcmVwIGNvbnRyb2xsZXIpIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBwYWRkaW5nLgorICoKKyAqIFRoZSBkb3duc2FtcGxlciBtYXkgcmVxdWVzdCAiY29udGV4dCByb3dzIiBieSBzZXR0aW5nIG5lZWRfY29udGV4dF9yb3dzCisgKiBkdXJpbmcgc3RhcnR1cC4gIEluIHRoaXMgY2FzZSwgdGhlIGlucHV0IGFycmF5cyB3aWxsIGNvbnRhaW4gYXQgbGVhc3QKKyAqIG9uZSByb3cgZ3JvdXAncyB3b3J0aCBvZiBwaXhlbHMgYWJvdmUgYW5kIGJlbG93IHRoZSBwYXNzZWQtaW4gZGF0YTsKKyAqIHRoZSBjYWxsZXIgd2lsbCBjcmVhdGUgZHVtbXkgcm93cyBhdCBpbWFnZSB0b3AgYW5kIGJvdHRvbSBieSByZXBsaWNhdGluZworICogdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuCisgKgorICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcworICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgorICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgorICoKKyAqIFRoZSBkb3duc2FtcGxpbmcgYWxnb3JpdGhtIHVzZWQgaGVyZSBpcyBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBzb3VyY2UKKyAqIHBpeGVscyBjb3ZlcmVkIGJ5IHRoZSBvdXRwdXQgcGl4ZWwuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlCisgKiByZWZlcnMgdG8gdGhpcyBhcyBhICJib3ggZmlsdGVyIi4gIEluIGdlbmVyYWwgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBhIGJveAorICogZmlsdGVyIGFyZSBub3QgdmVyeSBnb29kLCBidXQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlcyB3ZSBub3JtYWxseSB1c2UgKDE6MQorICogYW5kIDI6MSByYXRpb3MpIHRoZSBib3ggaXMgZXF1aXZhbGVudCB0byBhICJ0cmlhbmdsZSBmaWx0ZXIiIHdoaWNoIGlzIG5vdAorICogbmVhcmx5IHNvIGJhZC4gIElmIHlvdSBpbnRlbmQgdG8gdXNlIG90aGVyIHNhbXBsaW5nIHJhdGlvcywgeW91J2QgYmUgd2VsbAorICogYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqCisgKiBBIHNpbXBsZSBpbnB1dC1zbW9vdGhpbmcgY2FwYWJpbGl0eSBpcyBwcm92aWRlZC4gIFRoaXMgaXMgbWFpbmx5IGludGVuZGVkCisgKiBmb3IgY2xlYW5pbmcgdXAgY29sb3ItZGl0aGVyZWQgR0lGIGlucHV0IGZpbGVzIChpZiB5b3UgZmluZCBpdCBpbmFkZXF1YXRlLAorICogd2Ugc3VnZ2VzdCB1c2luZyBhbiBleHRlcm5hbCBmaWx0ZXJpbmcgcHJvZ3JhbSBzdWNoIGFzIHBubWNvbnZvbCkuICBXaGVuCisgKiBlbmFibGVkLCBlYWNoIGlucHV0IHBpeGVsIFAgaXMgcmVwbGFjZWQgYnkgYSB3ZWlnaHRlZCBzdW0gb2YgaXRzZWxmIGFuZCBpdHMKKyAqIGVpZ2h0IG5laWdoYm9ycy4gIFAncyB3ZWlnaHQgaXMgMS04KlNGIGFuZCBlYWNoIG5laWdoYm9yJ3Mgd2VpZ2h0IGlzIFNGLAorICogd2hlcmUgU0YgPSAoc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQpLgorICogQ3VycmVudGx5LCBzbW9vdGhpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIDJoMnYgc2FtcGxpbmcgZmFjdG9ycy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvd25zYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZG93bnNhbXBsZTFfcHRyLAorCQkoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKSk7CisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogRG93bnNhbXBsaW5nIG1ldGhvZCBwb2ludGVycywgb25lIHBlciBjb21wb25lbnQgKi8KKyAgZG93bnNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworfSBteV9kb3duc2FtcGxlcjsKKwordHlwZWRlZiBteV9kb3duc2FtcGxlciAqIG15X2Rvd25zYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIGRvd25zYW1wbGluZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayBmb3Igbm93ICovCit9CisKKworLyoKKyAqIEV4cGFuZCBhIGNvbXBvbmVudCBob3Jpem9udGFsbHkgZnJvbSB3aWR0aCBpbnB1dF9jb2xzIHRvIHdpZHRoIG91dHB1dF9jb2xzLAorICogYnkgZHVwbGljYXRpbmcgdGhlIHJpZ2h0bW9zdCBzYW1wbGVzLgorICovCisKK0xPQ0FMKHZvaWQpCitleHBhbmRfcmlnaHRfZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBpbnQgbnVtX3Jvd3MsCisJCSAgIEpESU1FTlNJT04gaW5wdXRfY29scywgSkRJTUVOU0lPTiBvdXRwdXRfY29scykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFIHBpeHZhbDsKKyAgcmVnaXN0ZXIgaW50IGNvdW50OworICBpbnQgcm93OworICBpbnQgbnVtY29scyA9IChpbnQpIChvdXRwdXRfY29scyAtIGlucHV0X2NvbHMpOworCisgIGlmIChudW1jb2xzID4gMCkgeworICAgIGZvciAocm93ID0gMDsgcm93IDwgbnVtX3Jvd3M7IHJvdysrKSB7CisgICAgICBwdHIgPSBpbWFnZV9kYXRhW3Jvd10gKyBpbnB1dF9jb2xzOworICAgICAgcGl4dmFsID0gcHRyWy0xXTsJCS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoY291bnQgPSBudW1jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCisJKnB0cisrID0gcGl4dmFsOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEbyBkb3duc2FtcGxpbmcgZm9yIGEgd2hvbGUgcm93IGdyb3VwIChhbGwgY29tcG9uZW50cykuCisgKgorICogSW4gdGhpcyB2ZXJzaW9uIHdlIHNpbXBseSBkb3duc2FtcGxlIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHkuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJSlNBTVBJTUFHRSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpCit7CisgIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpIGNpbmZvLT5kb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKU0FNUEFSUkFZIGluX3B0ciwgb3V0X3B0cjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGluX3B0ciA9IGlucHV0X2J1ZltjaV0gKyBpbl9yb3dfaW5kZXg7CisgICAgb3V0X3B0ciA9IG91dHB1dF9idWZbY2ldICsgKG91dF9yb3dfZ3JvdXBfaW5kZXggKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAoKmRvd25zYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsIGluX3B0ciwgb3V0X3B0cik7CisgIH0KK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhcmJpdHJhcnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLCB3aXRob3V0IHNtb290aGluZy4KKyAqIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGN1c3RvbWFyeSBzYW1wbGluZyByYXRpb3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbnRfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93LCBoX2V4cGFuZCwgdl9leHBhbmQsIG51bXBpeCwgbnVtcGl4MiwgaCwgdjsKKyAgSkRJTUVOU0lPTiBvdXRjb2wsIG91dGNvbF9oOwkvKiBvdXRjb2xfaCA9PSBvdXRjb2wqaF9leHBhbmQgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIElOVDMyIG91dHZhbHVlOworCisgIGhfZXhwYW5kID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yIC8gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgdl9leHBhbmQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICBudW1waXggPSBoX2V4cGFuZCAqIHZfZXhwYW5kOworICBudW1waXgyID0gbnVtcGl4LzI7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogaF9leHBhbmQpOworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgZm9yIChvdXRjb2wgPSAwLCBvdXRjb2xfaCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOworCSBvdXRjb2wrKywgb3V0Y29sX2ggKz0gaF9leHBhbmQpIHsKKyAgICAgIG91dHZhbHVlID0gMDsKKyAgICAgIGZvciAodiA9IDA7IHYgPCB2X2V4cGFuZDsgdisrKSB7CisJaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93K3ZdICsgb3V0Y29sX2g7CisJZm9yIChoID0gMDsgaCA8IGhfZXhwYW5kOyBoKyspIHsKKwkgIG91dHZhbHVlICs9IChJTlQzMikgR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisJfQorICAgICAgfQorICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgob3V0dmFsdWUgKyBudW1waXgyKSAvIG51bXBpeCk7CisgICAgfQorICAgIGlucm93ICs9IHZfZXhwYW5kOworICB9Cit9CisKKworLyoKKyAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQoreworICAvKiBDb3B5IHRoZSBkYXRhICovCisgIGpjb3B5X3NhbXBsZV9yb3dzKGlucHV0X2RhdGEsIDAsIG91dHB1dF9kYXRhLCAwLAorCQkgICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLCBjaW5mby0+aW1hZ2Vfd2lkdGgpOworICAvKiBFZGdlLWV4cGFuZCAqLworICBleHBhbmRfcmlnaHRfZWRnZShvdXRwdXRfZGF0YSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFKTsKK30KKworCisvKgorICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgorICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwsCisgKiB3aXRob3V0IHNtb290aGluZy4KKyAqCisgKiBBIG5vdGUgYWJvdXQgdGhlICJiaWFzIiBjYWxjdWxhdGlvbnM6IHdoZW4gcm91bmRpbmcgZnJhY3Rpb25hbCB2YWx1ZXMgdG8KKyAqIGludGVnZXIsIHdlIGRvIG5vdCB3YW50IHRvIGFsd2F5cyByb3VuZCAwLjUgdXAgdG8gdGhlIG5leHQgaW50ZWdlci4KKyAqIElmIHdlIGRpZCB0aGF0LCB3ZSdkIGludHJvZHVjZSBhIG5vdGljZWFibGUgYmlhcyB0b3dhcmRzIGxhcmdlciB2YWx1ZXMuCisgKiBJbnN0ZWFkLCB0aGlzIGNvZGUgaXMgYXJyYW5nZWQgc28gdGhhdCAwLjUgd2lsbCBiZSByb3VuZGVkIHVwIG9yIGRvd24gYXQKKyAqIGFsdGVybmF0ZSBwaXhlbCBsb2NhdGlvbnMgKGEgc2ltcGxlIG9yZGVyZWQgZGl0aGVyIHBhdHRlcm4pLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2MV9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYmlhcyA9IDA7CQkJLyogYmlhcyA9IDAsMSwwLDEsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KKyAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgeworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIpICsgR0VUSlNBTVBMRShpbnB0clsxXSkKKwkJCSAgICAgICsgYmlhcykgPj4gMSk7CisgICAgICBiaWFzIF49IDE7CQkvKiAwPT4xLCAxPT4wICovCisgICAgICBpbnB0ciArPSAyOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aG91dCBzbW9vdGhpbmcuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IGlucm93LCBvdXRyb3c7CisgIEpESU1FTlNJT04gb3V0Y29sOworICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyAgcmVnaXN0ZXIgaW50IGJpYXM7CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7CisKKyAgaW5yb3cgPSAwOworICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKKyAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOworICAgIGJpYXMgPSAxOwkJCS8qIGJpYXMgPSAxLDIsMSwyLC4uLiBmb3Igc3VjY2Vzc2l2ZSBzYW1wbGVzICovCisgICAgZm9yIChvdXRjb2wgPSAwOyBvdXRjb2wgPCBvdXRwdXRfY29sczsgb3V0Y29sKyspIHsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQkJICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKQorCQkJICAgICAgKyBiaWFzKSA+PiAyKTsKKyAgICAgIGJpYXMgXj0gMzsJCS8qIDE9PjIsIDI9PjEgKi8KKyAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsKKyAgICB9CisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3RhbmRhcmQgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLAorICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX3Ntb290aF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQlKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCit7CisgIGludCBpbnJvdywgb3V0cm93OworICBKRElNRU5TSU9OIGNvbGN0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOworICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKKworICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCisgICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCisgICAqIGVmZmljaWVudC4KKyAgICovCisgIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAorCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyAqIDIpOworCisgIC8qIFdlIGRvbid0IGJvdGhlciB0byBmb3JtIHRoZSBpbmRpdmlkdWFsICJzbW9vdGhlZCIgaW5wdXQgcGl4ZWwgdmFsdWVzOworICAgKiB3ZSBjYW4gZGlyZWN0bHkgY29tcHV0ZSB0aGUgb3V0cHV0IHdoaWNoIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBmb3VyCisgICAqIHNtb290aGVkIHZhbHVlcy4gIEVhY2ggb2YgdGhlIGZvdXIgbWVtYmVyIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uCisgICAqICgxLTgqU0YpIHRvIGl0cyBvd24gc21vb3RoZWQgaW1hZ2UgYW5kIGEgZnJhY3Rpb24gU0YgdG8gZWFjaCBvZiB0aGUgdGhyZWUKKyAgICogb3RoZXIgc21vb3RoZWQgcGl4ZWxzLCB0aGVyZWZvcmUgYSB0b3RhbCBmcmFjdGlvbiAoMS01KlNGKS80IHRvIHRoZSBmaW5hbAorICAgKiBvdXRwdXQuICBUaGUgZm91ciBjb3JuZXItYWRqYWNlbnQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGUgYSBmcmFjdGlvbgorICAgKiBTRiB0byBqdXN0IG9uZSBzbW9vdGhlZCBwaXhlbCwgb3IgU0YvNCB0byB0aGUgZmluYWwgb3V0cHV0OyB3aGlsZSB0aGUKKyAgICogZWlnaHQgZWRnZS1hZGphY2VudCBuZWlnaGJvcnMgY29udHJpYnV0ZSBTRiB0byBlYWNoIG9mIHR3byBzbW9vdGhlZAorICAgKiBwaXhlbHMsIG9yIFNGLzIgb3ZlcmFsbC4gIEluIG9yZGVyIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlCisgICAqIGZhY3RvcnMgYXJlIHNjYWxlZCBieSAyXjE2ID0gNjU1MzYuCisgICAqIEFsc28gcmVjYWxsIHRoYXQgU0YgPSBzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNC4KKyAgICovCisKKyAgbWVtYmVyc2NhbGUgPSAxNjM4NCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogODA7IC8qIHNjYWxlZCAoMS01KlNGKS80ICovCisgIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDE2OyAvKiBzY2FsZWQgU0YvNCAqLworCisgIGlucm93ID0gMDsKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW2lucm93LTFdOworICAgIGJlbG93X3B0ciA9IGlucHV0X2RhdGFbaW5yb3crMl07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbjogcHJldGVuZCBjb2x1bW4gLTEgaXMgc2FtZSBhcyBjb2x1bW4gMCAqLworICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCQlHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKKyAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKKwkJR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOworCisgICAgZm9yIChjb2xjdHIgPSBvdXRwdXRfY29scyAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7CisgICAgICAvKiBzdW0gb2YgcGl4ZWxzIGRpcmVjdGx5IG1hcHBlZCB0byB0aGlzIG91dHB1dCBlbGVtZW50ICovCisgICAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKKwkJICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgICAgLyogc3VtIG9mIGVkZ2UtbmVpZ2hib3IgcGl4ZWxzICovCisgICAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQkgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJCSBHRVRKU0FNUExFKGlucHRyMFstMV0pICsgR0VUSlNBTVBMRShpbnB0cjBbMl0pICsKKwkJIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsyXSk7CisgICAgICAvKiBUaGUgZWRnZS1uZWlnaGJvcnMgY291bnQgdHdpY2UgYXMgbXVjaCBhcyBjb3JuZXItbmVpZ2hib3JzICovCisgICAgICBuZWlnaHN1bSArPSBuZWlnaHN1bTsKKyAgICAgIC8qIEFkZCBpbiB0aGUgY29ybmVyLW5laWdoYm9ycyAqLworICAgICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzJdKSArCisJCSAgR0VUSlNBTVBMRShiZWxvd19wdHJbLTFdKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzJdKTsKKyAgICAgIC8qIGZvcm0gZmluYWwgb3V0cHV0IHNjYWxlZCB1cCBieSAyXjE2ICovCisgICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAgIC8qIHJvdW5kLCBkZXNjYWxlIGFuZCBvdXRwdXQgaXQgKi8KKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7CisgICAgICBpbnB0cjAgKz0gMjsgaW5wdHIxICs9IDI7IGFib3ZlX3B0ciArPSAyOyBiZWxvd19wdHIgKz0gMjsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCisJCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7CisgICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKKwkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCisJICAgICAgIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKworCSAgICAgICBHRVRKU0FNUExFKGlucHRyMVstMV0pICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pOworICAgIG5laWdoc3VtICs9IG5laWdoc3VtOworICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoYWJvdmVfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKworCQlHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgICAgaW5yb3cgKz0gMjsKKyAgfQorfQorCisKKy8qCisgKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCisgKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgZnVsbC1zaXplIGNvbXBvbmVudCwKKyAqIHdpdGggc21vb3RoaW5nLiAgT25lIHJvdyBvZiBjb250ZXh0IGlzIHJlcXVpcmVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorZnVsbHNpemVfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyLAorCQkJICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKK3sKKyAgaW50IG91dHJvdzsKKyAgSkRJTUVOU0lPTiBjb2xjdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgYWJvdmVfcHRyLCBiZWxvd19wdHIsIG91dHB0cjsKKyAgSU5UMzIgbWVtYmVyc3VtLCBuZWlnaHN1bSwgbWVtYmVyc2NhbGUsIG5laWdoc2NhbGU7CisgIGludCBjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisKKyAgLyogRXhwYW5kIGlucHV0IGRhdGEgZW5vdWdoIHRvIGxldCBhbGwgdGhlIG91dHB1dCBzYW1wbGVzIGJlIGdlbmVyYXRlZAorICAgKiBieSB0aGUgc3RhbmRhcmQgbG9vcC4gIFNwZWNpYWwtY2FzaW5nIHBhZGRlZCBvdXRwdXQgd291bGQgYmUgbW9yZQorICAgKiBlZmZpY2llbnQuCisgICAqLworICBleHBhbmRfcmlnaHRfZWRnZShpbnB1dF9kYXRhIC0gMSwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICsgMiwKKwkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMpOworCisgIC8qIEVhY2ggb2YgdGhlIGVpZ2h0IG5laWdoYm9yIHBpeGVscyBjb250cmlidXRlcyBhIGZyYWN0aW9uIFNGIHRvIHRoZQorICAgKiBzbW9vdGhlZCBwaXhlbCwgd2hpbGUgdGhlIG1haW4gcGl4ZWwgY29udHJpYnV0ZXMgKDEtOCpTRikuICBJbiBvcmRlcgorICAgKiB0byB1c2UgaW50ZWdlciBhcml0aG1ldGljLCB0aGVzZSBmYWN0b3JzIGFyZSBtdWx0aXBsaWVkIGJ5IDJeMTYgPSA2NTUzNi4KKyAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgorICAgKi8KKworICBtZW1iZXJzY2FsZSA9IDY1NTM2TCAtIGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogNTEyTDsgLyogc2NhbGVkIDEtOCpTRiAqLworICBuZWlnaHNjYWxlID0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA2NDsgLyogc2NhbGVkIFNGICovCisKKyAgZm9yIChvdXRyb3cgPSAwOyBvdXRyb3cgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvdXRyb3crKykgeworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW291dHJvd107CisgICAgYWJvdmVfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3ctMV07CisgICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtvdXRyb3crMV07CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLworICAgIGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cisrKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cisrKSArCisJICAgICBHRVRKU0FNUExFKCppbnB0cik7CisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7CisgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJIEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICBuZWlnaHN1bSA9IGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgbmV4dGNvbHN1bTsKKyAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgIGxhc3Rjb2xzdW0gPSBjb2xzdW07IGNvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICAgYWJvdmVfcHRyKys7IGJlbG93X3B0cisrOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsKKwkJICAgR0VUSlNBTVBMRSgqaW5wdHIpOworICAgICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOworICAgICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworICAgICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIpOworICAgIG5laWdoc3VtID0gbGFzdGNvbHN1bSArIChjb2xzdW0gLSBtZW1iZXJzdW0pICsgY29sc3VtOworICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOworICAgICpvdXRwdHIgPSAoSlNBTVBMRSkgKChtZW1iZXJzdW0gKyAzMjc2OCkgPj4gMTYpOworCisgIH0KK30KKworI2VuZGlmIC8qIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgKi8KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGRvd25zYW1wbGluZy4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHNlbGVjdCBhIHJvdXRpbmUgZm9yIGVhY2ggY29tcG9uZW50LgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZG93bnNhbXBsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9kb3duc2FtcGxlX3B0ciBkb3duc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBib29sZWFuIHNtb290aG9rID0gVFJVRTsKKworICBkb3duc2FtcGxlID0gKG15X2Rvd25zYW1wbGVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2Rvd25zYW1wbGVyKSk7CisgIGNpbmZvLT5kb3duc2FtcGxlID0gKHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICopIGRvd25zYW1wbGU7CisgIGRvd25zYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIuZG93bnNhbXBsZSA9IHNlcF9kb3duc2FtcGxlOworICBkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOworCisgIC8qIFZlcmlmeSB3ZSBjYW4gaGFuZGxlIHRoZSBzYW1wbGluZyBmYWN0b3JzLCBhbmQgc2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCWNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgaWYgKGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yKSB7CisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZTsKKwlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOworICAgICAgfSBlbHNlCisjZW5kaWYKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJiYKKwkgICAgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyAgICAgIHNtb290aG9rID0gRkFMU0U7CisgICAgICBkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZG93bnNhbXBsZTsKKyAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgorCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogMiA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKKyNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECisgICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKKwlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfc21vb3RoX2Rvd25zYW1wbGU7CisJZG93bnNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gVFJVRTsKKyAgICAgIH0gZWxzZQorI2VuZGlmCisJZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2Rvd25zYW1wbGU7CisgICAgfSBlbHNlIGlmICgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICUgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgPT0gMCAmJgorCSAgICAgICAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICUgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgPT0gMCkgeworICAgICAgc21vb3Rob2sgPSBGQUxTRTsKKyAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaW50X2Rvd25zYW1wbGU7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgfQorCisjaWZkZWYgSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRAorICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IgJiYgIXNtb290aG9rKQorICAgIFRSQUNFTVMoY2luZm8sIDAsIEpUUkNfU01PT1RIX05PVElNUEwpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamN0cmFucy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pjdHJhbnMuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGpjdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAorICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7CitMT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKKwlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKKworCisvKgorICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgorICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgorICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAorICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKKyAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQorICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCisgIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7CisgIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLworICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKKyAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCisgIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKKyAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCisgIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KKyAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCisgKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCisgKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcworICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOworICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKKyAgaW50IHRibG5vLCBjaSwgY29lZmk7CisKKyAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KKyAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCisgICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLworICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOworICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCisgIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOworICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KKyAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgorICAgKi8KKyAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKKyAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKKyAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCisgIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7CisgICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7CisgICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107CisgICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKKwkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7CisgICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAorCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCisJICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7CisgICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7CisgICAgfQorICB9CisgIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KKyAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCisgICAqLworICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOworICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAorCSAgICAgTUFYX0NPTVBPTkVOVFMpOworICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOworICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKKyAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKKyAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOworICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7CisgICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87CisgICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQorICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KKyAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgorICAgICAqLworICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOworICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOworICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKKyAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7CisJaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCisJICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7CisgICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgorICAgICAqLworICB9CisgIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KKyAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQorICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAorICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCisgICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAorICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCisgICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCisgICAqLworICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7CisgICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247CisgICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247CisgICAgfQorICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKKyAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7CisgICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OworICB9Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCisgKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCisgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQoreworICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCisgICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgorICAgKi8KKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KKyAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7CisKKyAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLworICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKKworICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKKworICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLworICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgorICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KKyAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KKyAgICovCisgICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Cit9CisKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50CisgKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5CisgKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKKyAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAorICogaW4gdGhlIGFycmF5cy4KKyAqLworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLworICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOworCisgIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCisgIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Cit9IG15X2NvZWZfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKKworCitMT0NBTCh2b2lkKQorc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisKKyAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KKyAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KKyAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCisgICAqLworICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7CisgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKKyAgICBlbHNlCisgICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OworICB9CisKKyAgY29lZi0+bWN1X2N0ciA9IDA7CisgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworCisgIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKworICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOworICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKKyAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KKyAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCisgKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgorICoKKyAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07CisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOworICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgIH0KKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OworCSBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKwljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAorCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7CisJICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAorCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7CisJICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KKwkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOworCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKKwkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisJICB9IGVsc2UgeworCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCisJICAgIHhpbmRleCA9IDA7CisJICB9CisJICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgorCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6CisJICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCisJICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCisJICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KKwkgICAqLworCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKKwkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKKwkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKKwkgICAgYmxrbisrOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgeworCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KKwljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgfQorICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KKyAgICBjb2VmLT5tY3VfY3RyID0gMDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLworICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KKyAqCisgKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0CisgKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKKyAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgorICovCisKK0xPQ0FMKHZvaWQpCit0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCit7CisgIG15X2NvZWZfcHRyIGNvZWY7CisgIEpCTE9DS1JPVyBidWZmZXI7CisgIGludCBpOworCisgIGNvZWYgPSAobXlfY29lZl9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7CisgIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOworICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKKworICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKKworICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCisgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOworICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKKyAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGFwaW1pbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkYXBpbWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5NjA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGFwaW1pbi5jCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogamRhcGltaW4uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCisgKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAibWluaW11bSIgQVBJIHJvdXRpbmVzIHRoYXQgbWF5IGJlCisgKiBuZWVkZWQgaW4gZWl0aGVyIHRoZSBub3JtYWwgZnVsbC1kZWNvbXByZXNzaW9uIGNhc2Ugb3IgdGhlCisgKiB0cmFuc2NvZGluZy1vbmx5IGNhc2UuCisgKgorICogTW9zdCBvZiB0aGUgcm91dGluZXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uCisgKiBhcmUgaW4gdGhpcyBmaWxlIG9yIGluIGpkYXBpc3RkLmMuICBCdXQgYWxzbyBzZWUgamNvbWFwaS5jIGZvciByb3V0aW5lcworICogc2hhcmVkIGJ5IGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLCBhbmQgamR0cmFucy5jIGZvciB0aGUgdHJhbnNjb2RpbmcKKyAqIGNhc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisgKiBUaGUgZXJyb3IgbWFuYWdlciBtdXN0IGFscmVhZHkgYmUgc2V0IHVwIChpbiBjYXNlIG1lbW9yeSBtYW5hZ2VyIGZhaWxzKS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfQ3JlYXRlRGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IHZlcnNpb24sIHNpemVfdCBzdHJ1Y3RzaXplKQoreworICBpbnQgaTsKKworICAvKiBHdWFyZCBhZ2FpbnN0IHZlcnNpb24gbWlzbWF0Y2hlcyBiZXR3ZWVuIGxpYnJhcnkgYW5kIGNhbGxlci4gKi8KKyAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBzbyBqcGVnX2Rlc3Ryb3kga25vd3MgbWVtIG1nciBub3QgY2FsbGVkICovCisgIGlmICh2ZXJzaW9uICE9IEpQRUdfTElCX1ZFUlNJT04pCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX0xJQl9WRVJTSU9OLCBKUEVHX0xJQl9WRVJTSU9OLCB2ZXJzaW9uKTsKKyAgaWYgKHN0cnVjdHNpemUgIT0gU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSkKKyAgICBFUlJFWElUMihjaW5mbywgSkVSUl9CQURfU1RSVUNUX1NJWkUsIAorCSAgICAgKGludCkgU0laRU9GKHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7CisKKyAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KKyAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0CisgICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgorICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKKyAgICogY29tcGxhaW4gaGVyZS4KKyAgICovCisgIHsKKyAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLworICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpOworICAgIGNpbmZvLT5lcnIgPSBlcnI7CisgICAgY2luZm8tPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisgIH0KKyAgY2luZm8tPmlzX2RlY29tcHJlc3NvciA9IFRSVUU7CisgIGNpbmZvLT50aWxlX2RlY29kZSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KKyAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7CisKKyAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCisgIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7CisgIGNpbmZvLT5zcmMgPSBOVUxMOworCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQorICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7CisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKKyAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7CisgIH0KKworICAvKiBJbml0aWFsaXplIG1hcmtlciBwcm9jZXNzb3Igc28gYXBwbGljYXRpb24gY2FuIG92ZXJyaWRlIG1ldGhvZHMKKyAgICogZm9yIENPTSwgQVBQbiBtYXJrZXJzIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIuCisgICAqLworICBjaW5mby0+bWFya2VyX2xpc3QgPSBOVUxMOworICBqaW5pdF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKKworICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBpbnB1dCBjb250cm9sbGVyLiAqLworICBqaW5pdF9pbnB1dF9jb250cm9sbGVyKGNpbmZvKTsKKworICAvKiBPSywgSSdtIHJlYWR5ICovCisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7Cit9CisKKworLyoKKyAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19kZXN0cm95X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLworfQorCisKKy8qCisgKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKKyAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19hYm9ydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCit9CisKKworLyoKKyAqIFNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KKyAqLworCitMT0NBTCh2b2lkKQorZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBHdWVzcyB0aGUgaW5wdXQgY29sb3JzcGFjZSwgYW5kIHNldCBvdXRwdXQgY29sb3JzcGFjZSBhY2NvcmRpbmdseS4gKi8KKyAgLyogKFdpc2ggSlBFRyBjb21taXR0ZWUgaGFkIHByb3ZpZGVkIGEgcmVhbCB3YXkgdG8gc3BlY2lmeSB0aGlzLi4uKSAqLworICAvKiBOb3RlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBvdXIgZ3Vlc3Nlcy4gKi8KKyAgc3dpdGNoIChjaW5mby0+bnVtX2NvbXBvbmVudHMpIHsKKyAgY2FzZSAxOgorICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSAzOgorICAgIGlmIChjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7CisgICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogSkZJRiBpbXBsaWVzIFlDYkNyICovCisgICAgfSBlbHNlIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgeworICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7CisgICAgICBjYXNlIDA6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCWJyZWFrOworICAgICAgY2FzZSAxOgorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogYXNzdW1lIGl0J3MgWUNiQ3IgKi8KKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogU2F3IG5vIHNwZWNpYWwgbWFya2VycywgdHJ5IHRvIGd1ZXNzIGZyb20gdGhlIGNvbXBvbmVudCBJRHMgKi8KKyAgICAgIGludCBjaWQwID0gY2luZm8tPmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQ7CisgICAgICBpbnQgY2lkMSA9IGNpbmZvLT5jb21wX2luZm9bMV0uY29tcG9uZW50X2lkOworICAgICAgaW50IGNpZDIgPSBjaW5mby0+Y29tcF9pbmZvWzJdLmNvbXBvbmVudF9pZDsKKworICAgICAgaWYgKGNpZDAgPT0gMSAmJiBjaWQxID09IDIgJiYgY2lkMiA9PSAzKQorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgSkZJRiB3L291dCBtYXJrZXIgKi8KKyAgICAgIGVsc2UgaWYgKGNpZDAgPT0gODIgJiYgY2lkMSA9PSA3MSAmJiBjaWQyID09IDY2KQorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogQVNDSUkgJ1InLCAnRycsICdCJyAqLworICAgICAgZWxzZSB7CisJVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfVU5LTk9XTl9JRFMsIGNpZDAsIGNpZDEsIGNpZDIpOworCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLworICAgICAgfQorICAgIH0KKyAgICAvKiBBbHdheXMgZ3Vlc3MgUkdCIGlzIHByb3BlciBvdXRwdXQgY29sb3JzcGFjZS4gKi8KKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgICBicmVhazsKKyAgICAKKyAgY2FzZSA0OgorICAgIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgeworICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7CisgICAgICBjYXNlIDA6CisJY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKwlicmVhazsKKyAgICAgIGNhc2UgMjoKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKKwljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOyAvKiBhc3N1bWUgaXQncyBZQ0NLICovCisJYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIE5vIHNwZWNpYWwgbWFya2VycywgYXNzdW1lIHN0cmFpZ2h0IENNWUsuICovCisgICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworICAgIH0KKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7CisgICAgYnJlYWs7CisgICAgCisgIGRlZmF1bHQ6CisgICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047CisgICAgYnJlYWs7CisgIH0KKworICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KKyAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLworICBjaW5mby0+c2NhbGVfZGVub20gPSAxOworICBjaW5mby0+b3V0cHV0X2dhbW1hID0gMS4wOworICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBGQUxTRTsKKyAgY2luZm8tPnJhd19kYXRhX291dCA9IEZBTFNFOworICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKKyAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOworICBjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nID0gVFJVRTsKKyAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IEZBTFNFOworICAvKiBXZSBzZXQgdGhlc2UgaW4gY2FzZSBhcHBsaWNhdGlvbiBvbmx5IHNldHMgcXVhbnRpemVfY29sb3JzLiAqLworICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFOworI2Vsc2UKKyAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7CisjZW5kaWYKKyAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKKyAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKKyAgLyogSW5pdGlhbGl6ZSBmb3Igbm8gbW9kZSBjaGFuZ2UgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKyAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOworICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKK30KKworCisvKgorICogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlLgorICogTmVlZCBvbmx5IGluaXRpYWxpemUgSlBFRyBvYmplY3QgYW5kIHN1cHBseSBhIGRhdGEgc291cmNlIGJlZm9yZSBjYWxsaW5nLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIHJlYWQgYXMgZmFyIGFzIHRoZSBmaXJzdCBTT1MgbWFya2VyIChpZSwgYWN0dWFsIHN0YXJ0IG9mCisgKiBjb21wcmVzc2VkIGRhdGEpLCBhbmQgd2lsbCBzYXZlIGFsbCB0YWJsZXMgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIEpQRUcKKyAqIG9iamVjdC4gIEl0IHdpbGwgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdAorICogdmFsdWVzLCBhbmQgZmluYWxseSByZXR1cm4gSlBFR19IRUFERVJfT0suICBPbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtYXkKKyAqIGFkanVzdCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzLgorICogKE9yLCBpZiB0aGUgYXBwbGljYXRpb24gb25seSB3YW50ZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSBwYXJhbWV0ZXJzLAorICogdGhlIGRhdGEgbmVlZCBub3QgYmUgZGVjb21wcmVzc2VkLiAgSW4gdGhhdCBjYXNlLCBjYWxsIGpwZWdfYWJvcnQgb3IKKyAqIGpwZWdfZGVzdHJveSB0byByZWxlYXNlIGFueSB0ZW1wb3Jhcnkgc3BhY2UuKQorICogSWYgYW4gYWJicmV2aWF0ZWQgKHRhYmxlcyBvbmx5KSBkYXRhc3RyZWFtIGlzIHByZXNlbnRlZCwgdGhlIHJvdXRpbmUgd2lsbAorICogcmV0dXJuIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZIHVwb24gcmVhY2hpbmcgRU9JLiAgVGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgKiByZS11c2UgdGhlIEpQRUcgb2JqZWN0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW0ocykuCisgKiBJdCBpcyB1bm5lY2Vzc2FyeSAoYnV0IE9LKSB0byBjYWxsIGpwZWdfYWJvcnQgaW4gdGhpcyBjYXNlLgorICogVGhlIEpQRUdfU1VTUEVOREVEIHJldHVybiBjb2RlIG9ubHkgb2NjdXJzIGlmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUKKyAqIHJlcXVlc3RzIHN1c3BlbnNpb24gb2YgdGhlIGRlY29tcHJlc3Nvci4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24KKyAqIHNob3VsZCBsb2FkIG1vcmUgc291cmNlIGRhdGEgYW5kIHRoZW4gcmUtY2FsbCBqcGVnX3JlYWRfaGVhZGVyIHRvIHJlc3VtZQorICogcHJvY2Vzc2luZy4KKyAqIElmIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCBhbmQgcmVxdWlyZV9pbWFnZSBpcyBUUlVFLCB0aGVuIHRoZQorICogcmV0dXJuIGNvZGUgbmVlZCBub3QgYmUgaW5zcGVjdGVkIHNpbmNlIG9ubHkgSlBFR19IRUFERVJfT0sgaXMgcG9zc2libGUuCisgKgorICogVGhpcyByb3V0aW5lIGlzIG5vdyBqdXN0IGEgZnJvbnQgZW5kIHRvIGpwZWdfY29uc3VtZV9pbnB1dCwgd2l0aCBzb21lCisgKiBleHRyYSBlcnJvciBjaGVja2luZy4KKyAqLworCitHTE9CQUwoaW50KQoranBlZ19yZWFkX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiByZXF1aXJlX2ltYWdlKQoreworICBpbnQgcmV0Y29kZTsKKworICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RBUlQgJiYKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0lOSEVBREVSKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgcmV0Y29kZSA9IGpwZWdfY29uc3VtZV9pbnB1dChjaW5mbyk7CisKKyAgc3dpdGNoIChyZXRjb2RlKSB7CisgIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoKKyAgICByZXRjb2RlID0gSlBFR19IRUFERVJfT0s7CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19SRUFDSEVEX0VPSToKKyAgICBpZiAocmVxdWlyZV9pbWFnZSkJCS8qIENvbXBsYWluIGlmIGFwcGxpY2F0aW9uIHdhbnRlZCBhbiBpbWFnZSAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19JTUFHRSk7CisgICAgLyogUmVzZXQgdG8gc3RhcnQgc3RhdGU7IGl0IHdvdWxkIGJlIHNhZmVyIHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCisgICAgICogY2FsbCBqcGVnX2Fib3J0LCBidXQgd2UgY2FuJ3QgY2hhbmdlIGl0IG5vdyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgorICAgICAqIEEgc2lkZSBlZmZlY3QgaXMgdG8gZnJlZSBhbnkgdGVtcG9yYXJ5IG1lbW9yeSAodGhlcmUgc2hvdWxkbid0IGJlIGFueSkuCisgICAgICovCisgICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHNldHMgc3RhdGUgPSBEU1RBVEVfU1RBUlQgKi8KKyAgICByZXRjb2RlID0gSlBFR19IRUFERVJfVEFCTEVTX09OTFk7CisgICAgYnJlYWs7CisgIGNhc2UgSlBFR19TVVNQRU5ERUQ6CisgICAgLyogbm8gd29yayAqLworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJldGNvZGU7Cit9CisKKworLyoKKyAqIENvbnN1bWUgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlcy4KKyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBvbmNlIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGhhcworICogYmVlbiBjcmVhdGVkIGFuZCBhIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB1cC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgaGFuZGxlcyBhIGNvdXBsZQorICogb2YgY3JpdGljYWwgc3RhdGUtdHJhbnNpdGlvbiBhY3Rpb25zLCBuYW1lbHkgaW5pdGlhbCBzZXR1cCBhbmQKKyAqIHRyYW5zaXRpb24gZnJvbSBoZWFkZXIgc2Nhbm5pbmcgdG8gcmVhZHktZm9yLXN0YXJ0X2RlY29tcHJlc3MuCisgKiBBbGwgdGhlIGFjdHVhbCBpbnB1dCBpcyBkb25lIHZpYSB0aGUgaW5wdXQgY29udHJvbGxlcidzIGNvbnN1bWVfaW5wdXQKKyAqIG1ldGhvZC4KKyAqLworCitHTE9CQUwoaW50KQoranBlZ19jb25zdW1lX2lucHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgcmV0Y29kZSA9IEpQRUdfU1VTUEVOREVEOworCisgIC8qIE5COiBldmVyeSBwb3NzaWJsZSBEU1RBVEUgdmFsdWUgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGlzIHN3aXRjaCAqLworICBzd2l0Y2ggKGNpbmZvLT5nbG9iYWxfc3RhdGUpIHsKKyAgY2FzZSBEU1RBVEVfU1RBUlQ6CisgICAgLyogU3RhcnQtb2YtZGF0YXN0cmVhbSBhY3Rpb25zOiByZXNldCBhcHByb3ByaWF0ZSBtb2R1bGVzICovCisgICAgKCpjaW5mby0+aW5wdXRjdGwtPnJlc2V0X2lucHV0X2NvbnRyb2xsZXIpIChjaW5mbyk7CisgICAgLyogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbidzIGRhdGEgc291cmNlIG1vZHVsZSAqLworICAgICgqY2luZm8tPnNyYy0+aW5pdF9zb3VyY2UpIChjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9JTkhFQURFUjsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBEU1RBVEVfSU5IRUFERVI6CisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsgLyogRm91bmQgU09TLCBwcmVwYXJlIHRvIGRlY29tcHJlc3MgKi8KKyAgICAgIC8qIFNldCB1cCBkZWZhdWx0IHBhcmFtZXRlcnMgYmFzZWQgb24gaGVhZGVyIGRhdGEgKi8KKyAgICAgIGRlZmF1bHRfZGVjb21wcmVzc19wYXJtcyhjaW5mbyk7CisgICAgICAvKiBTZXQgZ2xvYmFsIHN0YXRlOiByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLworICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRUFEWTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgRFNUQVRFX1JFQURZOgorICAgIC8qIENhbid0IGFkdmFuY2UgcGFzdCBmaXJzdCBTT1MgdW50aWwgc3RhcnRfZGVjb21wcmVzcyBpcyBjYWxsZWQgKi8KKyAgICByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKKyAgICBicmVhazsKKyAgY2FzZSBEU1RBVEVfUFJFTE9BRDoKKyAgY2FzZSBEU1RBVEVfUFJFU0NBTjoKKyAgY2FzZSBEU1RBVEVfU0NBTk5JTkc6CisgIGNhc2UgRFNUQVRFX1JBV19PSzoKKyAgY2FzZSBEU1RBVEVfQlVGSU1BR0U6CisgIGNhc2UgRFNUQVRFX0JVRlBPU1Q6CisgIGNhc2UgRFNUQVRFX1NUT1BQSU5HOgorICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICB9CisgIHJldHVybiByZXRjb2RlOworfQorCisKKy8qCisgKiBIYXZlIHdlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGlucHV0IGZpbGU/CisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2lucHV0X2NvbXBsZXRlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBDaGVjayBmb3IgdmFsaWQganBlZyBvYmplY3QgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfU1RBUlQgfHwKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQ7Cit9CisKKworLyoKKyAqIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgc2Nhbj8KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfaGFzX211bHRpcGxlX3NjYW5zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPbmx5IHZhbGlkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgY29tcGxldGVzICovCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlIDwgRFNUQVRFX1JFQURZIHx8CisgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID4gRFNUQVRFX1NUT1BQSU5HKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIHJldHVybiBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FuczsKK30KKworCisvKgorICogRmluaXNoIEpQRUcgZGVjb21wcmVzc2lvbi4KKyAqCisgKiBUaGlzIHdpbGwgbm9ybWFsbHkganVzdCB2ZXJpZnkgdGhlIGZpbGUgdHJhaWxlciBhbmQgcmVsZWFzZSB0ZW1wIHN0b3JhZ2UuCisgKgorICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKKyAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19maW5pc2hfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICAvKiBUZXJtaW5hdGUgZmluYWwgcGFzcyBvZiBub24tYnVmZmVyZWQgbW9kZSAqLworI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7CisjZW5kaWYKKyAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfQlVGSU1BR0UpIHsKKyAgICAvKiBGaW5pc2hpbmcgYWZ0ZXIgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24gKi8KKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9IGVsc2UgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1NUT1BQSU5HKSB7CisgICAgLyogU1RPUFBJTkcgPSByZXBlYXQgY2FsbCBhZnRlciBhIHN1c3BlbnNpb24sIGFueXRoaW5nIGVsc2UgaXMgZXJyb3IgKi8KKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICB9CisgIC8qIFJlYWQgdW50aWwgRU9JICovCisjaWZuZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgd2hpbGUgKCEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisjZW5kaWYKKyAgLyogRG8gZmluYWwgY2xlYW51cCAqLworICAoKmNpbmZvLT5zcmMtPnRlcm1fc291cmNlKSAoY2luZm8pOworICAvKiBXZSBjYW4gdXNlIGpwZWdfYWJvcnQgdG8gcmVsZWFzZSBtZW1vcnkgYW5kIHJlc2V0IGdsb2JhbF9zdGF0ZSAqLworICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhcGlzdGQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGFwaXN0ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjMzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhcGlzdGQuYwpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIGpkYXBpc3RkLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgorICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgInN0YW5kYXJkIiBBUEkgcm91dGluZXMgdGhhdCBhcmUKKyAqIHVzZWQgaW4gdGhlIG5vcm1hbCBmdWxsLWRlY29tcHJlc3Npb24gY2FzZS4gIFRoZXkgYXJlIG5vdCB1c2VkIGJ5IGEKKyAqIHRyYW5zY29kaW5nLW9ubHkgYXBwbGljYXRpb24uICBOb3RlIHRoYXQgaWYgYW4gYXBwbGljYXRpb24gbGlua3MgaW4KKyAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGRlY29tcHJlc3Nvci4KKyAqIFdlIHRodXMgbXVzdCBzZXBhcmF0ZSB0aGlzIGZpbGUgZnJvbSBqZGFwaW1pbi5jIHRvIGF2b2lkIGxpbmtpbmcgdGhlCisgKiB3aG9sZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW50byBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTChib29sZWFuKSBvdXRwdXRfcGFzc19zZXR1cCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworCisvKgorICogRGVjb21wcmVzc2lvbiBpbml0aWFsaXphdGlvbi4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBJZiBhIG11bHRpcGFzcyBvcGVyYXRpbmcgbW9kZSB3YXMgc2VsZWN0ZWQsIHRoaXMgd2lsbCBkbyBhbGwgYnV0IHRoZQorICogbGFzdCBwYXNzLCBhbmQgdGh1cyBtYXkgdGFrZSBhIGdyZWF0IGRlYWwgb2YgdGltZS4KKyAqCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbmRlZC4gIFRoZSByZXR1cm4gdmFsdWUgbmVlZCBiZSBpbnNwZWN0ZWQgb25seSBpZgorICogYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGppbml0X21hc3Rlcl9kZWNvbXByZXNzKGNpbmZvKTsKKyAgICBpZiAoY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgICAvKiBObyBtb3JlIHdvcmsgaGVyZTsgZXhwZWN0aW5nIGpwZWdfc3RhcnRfb3V0cHV0IG5leHQgKi8KKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgLyogSWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMsIGFic29yYiB0aGVtIGFsbCBpbnRvIHRoZSBjb2VmIGJ1ZmZlciAqLworICAgIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgICAgZm9yICg7OykgeworCWludCByZXRjb2RlOworCS8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisJICAoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKwkvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisJcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworCWlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQorCSAgcmV0dXJuIEZBTFNFOworCWlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisJICBicmVhazsKKwkvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgICAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKwkgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgICAvKiBqZG1hc3RlciB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKwkgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworCSAgfQorCX0KKyAgICAgIH0KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisgICAgfQorICAgIGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgZmluYWwgcGFzcyAqLworICByZXR1cm4gb3V0cHV0X3Bhc3Nfc2V0dXAoY2luZm8pOworfQorCisvKgorICogVGlsZSBkZWNvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgorICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgorICovCisKK0dMT0JBTChib29sZWFuKQoranBlZ19zdGFydF90aWxlX2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRUFEWSkgeworICAgIC8qIEZpcnN0IGNhbGw6IGluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wsIHNlbGVjdCBhY3RpdmUgbW9kdWxlcyAqLworICAgIGNpbmZvLT50aWxlX2RlY29kZSA9IFRSVUU7CisgICAgamluaXRfbWFzdGVyX2RlY29tcHJlc3MoY2luZm8pOworICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVMT0FEOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9QUkVMT0FEKSB7CisgICAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIC8qIFBlcmZvcm0gYW55IGR1bW15IG91dHB1dCBwYXNzZXMsIGFuZCBzZXQgdXAgZm9yIHRoZSBmaW5hbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIFNldCB1cCBmb3IgYW4gb3V0cHV0IHBhc3MsIGFuZCBwZXJmb3JtIGFueSBkdW1teSBwYXNzKGVzKSBuZWVkZWQuCisgKiBDb21tb24gc3Vicm91dGluZSBmb3IganBlZ19zdGFydF9kZWNvbXByZXNzIGFuZCBqcGVnX3N0YXJ0X291dHB1dC4KKyAqIEVudHJ5OiBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTiBvbmx5IGlmIHByZXZpb3VzbHkgc3VzcGVuZGVkLgorICogRXhpdDogSWYgZG9uZSwgcmV0dXJucyBUUlVFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSBmb3IgcHJvcGVyIG91dHB1dCBtb2RlLgorICogICAgICAgSWYgc3VzcGVuZGVkLCByZXR1cm5zIEZBTFNFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCitvdXRwdXRfcGFzc19zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pIHsKKyAgICAvKiBGaXJzdCBjYWxsOiBkbyBwYXNzIHNldHVwICovCisgICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU47CisgIH0KKyAgLyogTG9vcCBvdmVyIGFueSByZXF1aXJlZCBkdW1teSBwYXNzZXMgKi8KKyAgd2hpbGUgKGNpbmZvLT5tYXN0ZXItPmlzX2R1bW15X3Bhc3MpIHsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgICAvKiBDcmFuayB0aHJvdWdoIHRoZSBkdW1teSBwYXNzICovCisgICAgd2hpbGUgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkgeworICAgICAgSkRJTUVOU0lPTiBsYXN0X3NjYW5saW5lOworICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLworICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisJY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKKwljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisJKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisgICAgICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLworICAgICAgbGFzdF9zY2FubGluZSA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QQVJSQVkpIE5VTEwsCisJCQkJICAgICZjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMCk7CisgICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA9PSBsYXN0X3NjYW5saW5lKQorCXJldHVybiBGQUxTRTsJCS8qIE5vIHByb2dyZXNzIG1hZGUsIG11c3Qgc3VzcGVuZCAqLworICAgIH0KKyAgICAvKiBGaW5pc2ggdXAgZHVtbXkgcGFzcywgYW5kIHNldCB1cCBmb3IgYW5vdGhlciBvbmUgKi8KKyAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKKyAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSAwOworI2Vsc2UKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIH0KKyAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIG91dHB1dCBwYXNzIHRocm91Z2gKKyAgICoganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3JlYWRfcmF3X2RhdGEuCisgICAqLworICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gY2luZm8tPnJhd19kYXRhX291dCA/IERTVEFURV9SQVdfT0sgOiBEU1RBVEVfU0NBTk5JTkc7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSZWFkIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgZnJvbSB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KKyAqIFRoaXMgbWF5IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZCBpbiBzZXZlcmFsIGNhc2VzLAorICogaW5jbHVkaW5nIGJvdHRvbSBvZiBpbWFnZSwgZGF0YSBzb3VyY2Ugc3VzcGVuc2lvbiwgYW5kIG9wZXJhdGluZworICogbW9kZXMgdGhhdCBlbWl0IG11bHRpcGxlIHNjYW5saW5lcyBhdCBhIHRpbWUuCisgKgorICogTm90ZTogd2Ugd2FybiBhYm91dCBleGNlc3MgY2FsbHMgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIHNpbmNlCisgKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAorICogYW4gb3ZlcnNpemUgYnVmZmVyIChtYXhfbGluZXMgPiBzY2FubGluZXMgcmVtYWluaW5nKSBpcyBub3QgYW4gZXJyb3IuCisgKi8KKworR0xPQkFMKEpESU1FTlNJT04pCitqcGVnX3JlYWRfc2NhbmxpbmVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJICAgICBKRElNRU5TSU9OIG1heF9saW5lcykKK3sKKyAgSkRJTUVOU0lPTiByb3dfY3RyOworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TQ0FOTklORykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA+PSBjaW5mby0+b3V0cHV0X2hlaWdodCkgeworICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKworICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLworICByb3dfY3RyID0gMDsKKyAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIG1heF9saW5lcyk7CisgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisvKgorICogSW5pdGlhbGl6ZSB0aGUganBlZyBkZWNvZGVyIHRvIGRlY29tcHJlc3NpbmcgYSByZWN0YW5nbGUgd2l0aCBzaXplIG9mICh3aWR0aCwgaGVpZ2h0KQorICogYW5kIGl0cyB1cHBlci1sZWZ0IGNvcm5lciBsb2NhdGVkIGF0IChzdGFydF94LCBzdGFydF95KS4KKyAqIEFsaWduIHN0YXJ0X3ggYW5kIHN0YXJ0X3kgdG8gbXVsdGlwbGllcyBvZiBpTUNVIHdpZHRoIGFuZCBoZWlnaHQsIHJlc3BlY3RpdmVseS4KKyAqIEFsc28sIHRoZSBuZXcgcmVhZGVyIHBvc2l0aW9uIGFuZCBzYW1wbGVkIGltYWdlIHNpemUgd2lsbCBiZSByZXR1cm5lZCBpbgorICogKHN0YXJ0X3gsIHN0YXJ0X3kpIGFuZCAod2lkdGgsIGhlaWdodCksIHJlc3BlY3RpdmVseS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaW5pdF9yZWFkX3RpbGVfc2NhbmxpbmUoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgsCisJCSAgICAgaW50ICpzdGFydF94LCBpbnQgKnN0YXJ0X3ksIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KQoreworICAvLyBDYWxjdWxhdGVzIHRoZSBib3VuZGFyeSBvZiBpTUNVCisgIGludCBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpbnQgbGluZXNfcGVyX2lNQ1VfY29sID0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRTsKKyAgaW50IHJvd19vZmZzZXQgPSAqc3RhcnRfeSAvIGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgaW50IGNvbF9sZWZ0X2JvdW5kYXJ5ID0gKCgqc3RhcnRfeCAvIGxpbmVzX3Blcl9pTUNVX2NvbCkKKyAgICAgICAgICAgIC8gaW5kZXgtPk1DVV9zYW1wbGVfc2l6ZSkgKiBpbmRleC0+TUNVX3NhbXBsZV9zaXplOworICBpbnQgY29sX3JpZ2h0X2JvdW5kYXJ5ID0KKyAgICAgICAgICAgICAgICAgIGpkaXZfcm91bmRfdXAoKnN0YXJ0X3ggKyAqd2lkdGgsIGxpbmVzX3Blcl9pTUNVX2NvbCk7CisKKyAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5zX3RvX3NraXAgPQorICAgICAgKnN0YXJ0X3ggLyBsaW5lc19wZXJfaU1DVV9jb2wgLSBjb2xfbGVmdF9ib3VuZGFyeTsKKworICAqaGVpZ2h0ID0gKCpzdGFydF95IC0gcm93X29mZnNldCAqIGxpbmVzX3Blcl9pTUNVX3JvdykgKyAqaGVpZ2h0OworICAqc3RhcnRfeCA9IGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOworICAqc3RhcnRfeSA9IHJvd19vZmZzZXQgKiBsaW5lc19wZXJfaU1DVV9yb3c7CisgIGNpbmZvLT5pbWFnZV93aWR0aCA9IGptaW4oY2luZm8tPm9yaWdpbmFsX2ltYWdlX3dpZHRoLAorICAgICAgICAgIGNvbF9yaWdodF9ib3VuZGFyeSAqIGxpbmVzX3Blcl9pTUNVX2NvbCkgLQorICAgICAgICAgIGNvbF9sZWZ0X2JvdW5kYXJ5ICogbGluZXNfcGVyX2lNQ1VfY29sOworICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSByb3dfb2Zmc2V0OworICBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKKworICAvLyBVcGRhdGVzIEpQRUcgZGVjb2RlciBwYXJhbWV0ZXIKKyAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworICBqaW5pdF91cHNhbXBsZXIoY2luZm8pOworICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOworICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgZWxzZQorICAgIGpwZWdfZGVjb21wcmVzc19wZXJfc2Nhbl9zZXR1cChjaW5mbyk7CisKKyAgaW50IHNhbXBsZV9zaXplID0gRENUU0laRSAvIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworCisgICpoZWlnaHQgPSBqZGl2X3JvdW5kX3VwKCpoZWlnaHQsIHNhbXBsZV9zaXplKTsKKyAgKndpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgY2luZm8tPm91dHB1dF9zY2FubGluZSA9IGxpbmVzX3Blcl9pTUNVX3JvdyAqIHJvd19vZmZzZXQgLyBzYW1wbGVfc2l6ZTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQorICAgICAgY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4OworICBjaW5mby0+ZW50cm9weS0+aW5kZXggPSBpbmRleDsKKyAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gcm93X29mZnNldDsKKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IHJvd19vZmZzZXQ7CisgIGNpbmZvLT5jb2VmLT5NQ1VfY29sdW1uX2xlZnRfYm91bmRhcnkgPSBjb2xfbGVmdF9ib3VuZGFyeTsKKyAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgPSBjb2xfcmlnaHRfYm91bmRhcnk7CisgIGNpbmZvLT5jb2VmLT5jb2x1bW5fbGVmdF9ib3VuZGFyeSA9CisgICAgICBjb2xfbGVmdF9ib3VuZGFyeSAvIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7CisgIGNpbmZvLT5jb2VmLT5jb2x1bW5fcmlnaHRfYm91bmRhcnkgPQorICAgICAgamRpdl9yb3VuZF91cChjb2xfcmlnaHRfYm91bmRhcnksIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUpOworfQorCisvKgorICogUmVhZCBhIHNjYW5saW5lIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF90aWxlX3NjYW5saW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCwKKyAgICAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMpCit7CisgIC8vIENhbGN1bGF0ZXMgdGhlIGJvdW5kYXJ5IG9mIGlNQ1UKKyAgaW50IGxpbmVzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkU7CisgIGludCBsaW5lc19wZXJfaU1DVV9jb2wgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOworICBpbnQgc2FtcGxlX3NpemUgPSBEQ1RTSVpFIC8gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIEpESU1FTlNJT04gcm93X2N0ciA9IDA7CisKKyAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgKCpjaW5mby0+bWFpbi0+cHJvY2Vzc19kYXRhKSAoY2luZm8sIHNjYW5saW5lcywgJnJvd19jdHIsIDEpOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lICUgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKSA9PSAwKSB7CisgICAgICAvLyBTZXQgdGhlIHJlYWQgaGVhZCB0byB0aGUgbmV4dCBpTUNVIHJvdworICAgICAgaW50IGlNQ1Vfcm93X29mZnNldCA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgLworICAgICAgICAgICAgKGxpbmVzX3Blcl9pTUNVX3JvdyAvIHNhbXBsZV9zaXplKTsKKyAgICAgIGludCBvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb24gPSBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5IC8KKyAgICAgICAgICAgIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemU7CisgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldF9kYXRhID0KKyAgICAgICAgICBpbmRleC0+c2NhblswXS5vZmZzZXRbaU1DVV9yb3dfb2Zmc2V0XVtvZmZzZXRfZGF0YV9jb2xfcG9zaXRpb25dOworICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgfQorICAgICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCAxKTsKKyAgfQorCisgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgKz0gcm93X2N0cjsKKyAgcmV0dXJuIHJvd19jdHI7Cit9CisKKy8qCisgKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KKyAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KKyAqLworCitHTE9CQUwoSkRJTUVOU0lPTikKK2pwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAorCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCit7CisgIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OworCisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKKyAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICB9CisKKyAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KKyAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7CisKKyAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCisgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKKyAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLworCisgIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLworICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKKyAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKK30KKworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCit7CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgorICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOworICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLworICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKKyAgICBzY2FuX251bWJlciA9IDE7CisgIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCisgICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKKyAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKKyAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOworICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCisgIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoYm9vbGVhbikKK2pwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KKyAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLworICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKKyAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7CisgICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIH0KKyAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLworICB9CisgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7CisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhdGFkc3QuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGF0YWRzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjZmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhdGFkc3QuYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIGpkYXRhZHN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21wcmVzc2lvbiBkYXRhIGRlc3RpbmF0aW9uIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogZW1pdHRpbmcgSlBFRyBkYXRhIHRvIGEgZmlsZSAob3IgYW55IHN0ZGlvIHN0cmVhbSkuICBXaGlsZSB0aGVzZSByb3V0aW5lcworICogYXJlIHN1ZmZpY2llbnQgZm9yIG1vc3QgYXBwbGljYXRpb25zLCBzb21lIHdpbGwgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKKyAqIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisgKiBJTVBPUlRBTlQ6IHdlIGFzc3VtZSB0aGF0IGZ3cml0ZSgpIHdpbGwgY29ycmVjdGx5IHRyYW5zY3JpYmUgYW4gYXJyYXkgb2YKKyAqIEpPQ1RFVHMgaW50byA4LWJpdC13aWRlIGVsZW1lbnRzIG9uIGV4dGVybmFsIHN0b3JhZ2UuICBJZiBjaGFyIGlzIHdpZGVyCisgKiB0aGFuIDggYml0cyBvbiB5b3VyIG1hY2hpbmUsIHlvdSBtYXkgbmVlZCB0byBkbyBzb21lIHR3ZWFraW5nLgorICovCisKKy8qIHRoaXMgaXMgbm90IGEgY29yZSBsaWJyYXJ5IG1vZHVsZSwgc28gaXQgZG9lc24ndCBkZWZpbmUgSlBFR19JTlRFUk5BTFMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZXJyb3IuaCIKKworCisvKiBFeHBhbmRlZCBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3Igc3RkaW8gb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIEZJTEUgKiBvdXRmaWxlOwkJLyogdGFyZ2V0IHN0cmVhbSAqLworICBKT0NURVQgKiBidWZmZXI7CQkvKiBzdGFydCBvZiBidWZmZXIgKi8KK30gbXlfZGVzdGluYXRpb25fbWdyOworCit0eXBlZGVmIG15X2Rlc3RpbmF0aW9uX21nciAqIG15X2Rlc3RfcHRyOworCisjZGVmaW5lIE9VVFBVVF9CVUZfU0laRSAgNDA5NgkvKiBjaG9vc2UgYW4gZWZmaWNpZW50bHkgZndyaXRlJ2FibGUgc2l6ZSAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcworICogYmVmb3JlIGFueSBkYXRhIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitpbml0X2Rlc3RpbmF0aW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdCA9IChteV9kZXN0X3B0cikgY2luZm8tPmRlc3Q7CisKKyAgLyogQWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIgLS0tIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hlbiBkb25lIHdpdGggaW1hZ2UgKi8KKyAgZGVzdC0+YnVmZmVyID0gKEpPQ1RFVCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIE9VVFBVVF9CVUZfU0laRSAqIFNJWkVPRihKT0NURVQpKTsKKworICBkZXN0LT5wdWIubmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPmJ1ZmZlcjsKKyAgZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyID0gT1VUUFVUX0JVRl9TSVpFOworfQorCisKKy8qCisgKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBmaWxscyB1cC4KKyAqCisgKiBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgdGhpcyBzaG91bGQgd3JpdGUgdGhlIGVudGlyZSBvdXRwdXQgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSAmIGZyZWVfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgorICoKKyAqIEluIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYWJsZSB0byBzdXNwZW5kIGNvbXByZXNzaW9uIGR1ZSB0byBvdXRwdXQKKyAqIG92ZXJydW4sIGEgRkFMU0UgcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY2Fubm90IGJlIGVtcHRpZWQgbm93LgorICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjb21wcmVzc29yIHdpbGwgcmV0dXJuIHRvIGl0cyBjYWxsZXIgKHBvc3NpYmx5IHdpdGgKKyAqIGFuIGluZGljYXRpb24gdGhhdCBpdCBoYXMgbm90IGFjY2VwdGVkIGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzKS4gIFRoZQorICogYXBwbGljYXRpb24gc2hvdWxkIHJlc3VtZSBjb21wcmVzc2lvbiBhZnRlciBpdCBoYXMgbWFkZSBtb3JlIHJvb20gaW4gdGhlCisgKiBvdXRwdXQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdWJzdGFudGlhbCByZXN0cmljdGlvbnMgb24gdGhlIHVzZSBvZgorICogc3VzcGVuc2lvbiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorICoKKyAqIFdoZW4gc3VzcGVuZGluZywgdGhlIGNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X291dHB1dF9ieXRlICYgZnJlZV9pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGFmdGVyIHJlc3VtcHRpb24sIHNvIGRvIG5vdAorICogd3JpdGUgaXQgb3V0IHdoZW4gZW1wdHlpbmcgdGhlIGJ1ZmZlciBleHRlcm5hbGx5LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworCisgIGlmIChKRldSSVRFKGRlc3QtPm91dGZpbGUsIGRlc3QtPmJ1ZmZlciwgT1VUUFVUX0JVRl9TSVpFKSAhPQorICAgICAgKHNpemVfdCkgT1VUUFVUX0JVRl9TSVpFKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgZGVzdC0+cHViLm5leHRfb3V0cHV0X2J5dGUgPSBkZXN0LT5idWZmZXI7CisgIGRlc3QtPnB1Yi5mcmVlX2luX2J1ZmZlciA9IE9VVFBVVF9CVUZfU0laRTsKKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MKKyAqIGFmdGVyIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBVc3VhbGx5IG5lZWRzIHRvIGZsdXNoIGJ1ZmZlci4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Rlc3RfcHRyIGRlc3QgPSAobXlfZGVzdF9wdHIpIGNpbmZvLT5kZXN0OworICBzaXplX3QgZGF0YWNvdW50ID0gT1VUUFVUX0JVRl9TSVpFIC0gZGVzdC0+cHViLmZyZWVfaW5fYnVmZmVyOworCisgIC8qIFdyaXRlIGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyICovCisgIGlmIChkYXRhY291bnQgPiAwKSB7CisgICAgaWYgKEpGV1JJVEUoZGVzdC0+b3V0ZmlsZSwgZGVzdC0+YnVmZmVyLCBkYXRhY291bnQpICE9IGRhdGFjb3VudCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIH0KKyAgZmZsdXNoKGRlc3QtPm91dGZpbGUpOworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGlmIChmZXJyb3IoZGVzdC0+b3V0ZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0IHRvIGEgc3RkaW8gc3RyZWFtLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBvcGVuZWQgdGhlIHN0cmVhbSwgYW5kIGlzIHJlc3BvbnNpYmxlCisgKiBmb3IgY2xvc2luZyBpdCBhZnRlciBmaW5pc2hpbmcgY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX2Rlc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogb3V0ZmlsZSkKK3sKKyAgbXlfZGVzdF9wdHIgZGVzdDsKKworICAvKiBUaGUgZGVzdGluYXRpb24gb2JqZWN0IGlzIG1hZGUgcGVybWFuZW50IHNvIHRoYXQgbXVsdGlwbGUgSlBFRyBpbWFnZXMKKyAgICogY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIHNhbWUgZmlsZSB3aXRob3V0IHJlLWV4ZWN1dGluZyBqcGVnX3N0ZGlvX2Rlc3QuCisgICAqIFRoaXMgbWFrZXMgaXQgZGFuZ2Vyb3VzIHRvIHVzZSB0aGlzIG1hbmFnZXIgYW5kIGEgZGlmZmVyZW50IGRlc3RpbmF0aW9uCisgICAqIG1hbmFnZXIgc2VyaWFsbHkgd2l0aCB0aGUgc2FtZSBKUEVHIG9iamVjdCwgYmVjYXVzZSB0aGVpciBwcml2YXRlIG9iamVjdAorICAgKiBzaXplcyBtYXkgYmUgZGlmZmVyZW50LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPmRlc3QgPT0gTlVMTCkgewkvKiBmaXJzdCB0aW1lIGZvciB0aGlzIEpQRUcgb2JqZWN0PyAqLworICAgIGNpbmZvLT5kZXN0ID0gKHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCisJCQkJICBTSVpFT0YobXlfZGVzdGluYXRpb25fbWdyKSk7CisgIH0KKworICBkZXN0ID0gKG15X2Rlc3RfcHRyKSBjaW5mby0+ZGVzdDsKKyAgZGVzdC0+cHViLmluaXRfZGVzdGluYXRpb24gPSBpbml0X2Rlc3RpbmF0aW9uOworICBkZXN0LT5wdWIuZW1wdHlfb3V0cHV0X2J1ZmZlciA9IGVtcHR5X291dHB1dF9idWZmZXI7CisgIGRlc3QtPnB1Yi50ZXJtX2Rlc3RpbmF0aW9uID0gdGVybV9kZXN0aW5hdGlvbjsKKyAgZGVzdC0+b3V0ZmlsZSA9IG91dGZpbGU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhdGFzcmMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGF0YXNyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYzc1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRhdGFzcmMuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGpkYXRhc3JjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNvbXByZXNzaW9uIGRhdGEgc291cmNlIHJvdXRpbmVzIGZvciB0aGUgY2FzZSBvZgorICogcmVhZGluZyBKUEVHIGRhdGEgZnJvbSBhIGZpbGUgKG9yIGFueSBzdGRpbyBzdHJlYW0pLiAgV2hpbGUgdGhlc2Ugcm91dGluZXMKKyAqIGFyZSBzdWZmaWNpZW50IGZvciBtb3N0IGFwcGxpY2F0aW9ucywgc29tZSB3aWxsIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50CisgKiBzb3VyY2UgbWFuYWdlci4KKyAqIElNUE9SVEFOVDogd2UgYXNzdW1lIHRoYXQgZnJlYWQoKSB3aWxsIGNvcnJlY3RseSB0cmFuc2NyaWJlIGFuIGFycmF5IG9mCisgKiBKT0NURVRzIGZyb20gOC1iaXQtd2lkZSBlbGVtZW50cyBvbiBleHRlcm5hbCBzdG9yYWdlLiAgSWYgY2hhciBpcyB3aWRlcgorICogdGhhbiA4IGJpdHMgb24geW91ciBtYWNoaW5lLCB5b3UgbWF5IG5lZWQgdG8gZG8gc29tZSB0d2Vha2luZy4KKyAqLworCisvKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamVycm9yLmgiCisKKworLyogRXhwYW5kZWQgZGF0YSBzb3VyY2Ugb2JqZWN0IGZvciBzdGRpbyBpbnB1dCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgRklMRSAqIGluZmlsZTsJCS8qIHNvdXJjZSBzdHJlYW0gKi8KKyAgSk9DVEVUICogYnVmZmVyOwkJLyogc3RhcnQgb2YgYnVmZmVyICovCisgIGJvb2xlYW4gc3RhcnRfb2ZfZmlsZTsJLyogaGF2ZSB3ZSBnb3R0ZW4gYW55IGRhdGEgeWV0PyAqLworfSBteV9zb3VyY2VfbWdyOworCit0eXBlZGVmIG15X3NvdXJjZV9tZ3IgKiBteV9zcmNfcHRyOworCisjZGVmaW5lIElOUFVUX0JVRl9TSVpFICA0MDk2CS8qIGNob29zZSBhbiBlZmZpY2llbnRseSBmcmVhZCdhYmxlIHNpemUgKi8KKworCisvKgorICogSW5pdGlhbGl6ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX3JlYWRfaGVhZGVyCisgKiBiZWZvcmUgYW55IGRhdGEgaXMgYWN0dWFsbHkgcmVhZC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2luaXRfc291cmNlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9zcmNfcHRyIHNyYyA9IChteV9zcmNfcHRyKSBjaW5mby0+c3JjOworCisgIC8qIFdlIHJlc2V0IHRoZSBlbXB0eS1pbnB1dC1maWxlIGZsYWcgZm9yIGVhY2ggaW1hZ2UsCisgICAqIGJ1dCB3ZSBkb24ndCBjbGVhciB0aGUgaW5wdXQgYnVmZmVyLgorICAgKiBUaGlzIGlzIGNvcnJlY3QgYmVoYXZpb3IgZm9yIHJlYWRpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gb25lIHNvdXJjZS4KKyAgICovCisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IFRSVUU7Cit9CisKKworLyoKKyAqIEZpbGwgdGhlIGlucHV0IGJ1ZmZlciAtLS0gY2FsbGVkIHdoZW5ldmVyIGJ1ZmZlciBpcyBlbXB0aWVkLgorICoKKyAqIEluIHR5cGljYWwgYXBwbGljYXRpb25zLCB0aGlzIHNob3VsZCByZWFkIGZyZXNoIGRhdGEgaW50byB0aGUgYnVmZmVyCisgKiAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlICYgYnl0ZXNfaW5fYnVmZmVyKSwKKyAqIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIsIGFuZCByZXR1cm4gVFJVRQorICogaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcmVsb2FkZWQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisgKiBmaWxsIHRoZSBidWZmZXIgZW50aXJlbHksIG9ubHkgdG8gb2J0YWluIGF0IGxlYXN0IG9uZSBtb3JlIGJ5dGUuCisgKgorICogVGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBFT0YgcmV0dXJuLiAgSWYgdGhlIGVuZCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICogcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzIGEgY2hvaWNlIG9mIEVSUkVYSVQoKSBvciBpbnNlcnRpbmcgZmFrZSBkYXRhIGludG8KKyAqIHRoZSBidWZmZXIuICBJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYQorICogZmFrZSBFT0kgbWFya2VyIGlzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUKKyAqIGRlY29tcHJlc3NvciB0byBvdXRwdXQgaG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEhvd2V2ZXIsCisgKiB0aGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMgbWlzbGVhZGluZyBpZiB0aGUgcmVhbCBwcm9ibGVtIGlzIGFuIGVtcHR5CisgKiBpbnB1dCBmaWxlLCBzbyB3ZSBoYW5kbGUgdGhhdCBjYXNlIHNwZWNpYWxseS4KKyAqCisgKiBJbiBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGFibGUgdG8gc3VzcGVuZCBjb21wcmVzc2lvbiBkdWUgdG8gaW5wdXQKKyAqIG5vdCBiZWluZyBhdmFpbGFibGUgeWV0LCBhIEZBTFNFIHJldHVybiBpbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGRhdGEgY2FuIGJlCisgKiBvYnRhaW5lZCByaWdodCBub3csIGJ1dCBtb3JlIG1heSBiZSBmb3J0aGNvbWluZyBsYXRlci4gIEluIHRoaXMgc2l0dWF0aW9uLAorICogdGhlIGRlY29tcHJlc3NvciB3aWxsIHJldHVybiB0byBpdHMgY2FsbGVyICh3aXRoIGFuIGluZGljYXRpb24gb2YgdGhlCisgKiBudW1iZXIgb2Ygc2NhbmxpbmVzIGl0IGhhcyByZWFkLCBpZiBhbnkpLiAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXN1bWUKKyAqIGRlY29tcHJlc3Npb24gYWZ0ZXIgaXQgaGFzIGxvYWRlZCBtb3JlIGRhdGEgaW50byB0aGUgaW5wdXQgYnVmZmVyLiAgTm90ZQorICogdGhhdCB0aGVyZSBhcmUgc3Vic3RhbnRpYWwgcmVzdHJpY3Rpb25zIG9uIHRoZSB1c2Ugb2Ygc3VzcGVuc2lvbiAtLS0gc2VlCisgKiB0aGUgZG9jdW1lbnRhdGlvbi4KKyAqCisgKiBXaGVuIHN1c3BlbmRpbmcsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBiYWNrIHVwIHRvIGEgY29udmVuaWVudCByZXN0YXJ0IHBvaW50CisgKiAodHlwaWNhbGx5IHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UpLiBuZXh0X2lucHV0X2J5dGUgJiBieXRlc19pbl9idWZmZXIKKyAqIGluZGljYXRlIHdoZXJlIHRoZSByZXN0YXJ0IHBvaW50IHdpbGwgYmUgaWYgdGhlIGN1cnJlbnQgY2FsbCByZXR1cm5zIEZBTFNFLgorICogRGF0YSBiZXlvbmQgdGhpcyBwb2ludCBtdXN0IGJlIHJlc2Nhbm5lZCBhZnRlciByZXN1bXB0aW9uLCBzbyBtb3ZlIGl0IHRvCisgKiB0aGUgZnJvbnQgb2YgdGhlIGJ1ZmZlciByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGl0LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZmlsbF9pbnB1dF9idWZmZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNpemVfdCBuYnl0ZXM7CisKKyAgbmJ5dGVzID0gSkZSRUFEKHNyYy0+aW5maWxlLCBzcmMtPmJ1ZmZlciwgSU5QVVRfQlVGX1NJWkUpOworCisgIGlmIChuYnl0ZXMgPD0gMCkgeworICAgIGlmIChzcmMtPnN0YXJ0X29mX2ZpbGUpCS8qIFRyZWF0IGVtcHR5IGlucHV0IGZpbGUgYXMgZmF0YWwgZXJyb3IgKi8KKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU1QVFkpOworICAgIFdBUk5NUyhjaW5mbywgSldSTl9KUEVHX0VPRik7CisgICAgLyogSW5zZXJ0IGEgZmFrZSBFT0kgbWFya2VyICovCisgICAgc3JjLT5idWZmZXJbMF0gPSAoSk9DVEVUKSAweEZGOworICAgIHNyYy0+YnVmZmVyWzFdID0gKEpPQ1RFVCkgSlBFR19FT0k7CisgICAgbmJ5dGVzID0gMjsKKyAgfQorCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IHNyYy0+YnVmZmVyOworICBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBuYnl0ZXM7CisgIHNyYy0+c3RhcnRfb2ZfZmlsZSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBTa2lwIGRhdGEgLS0tIHVzZWQgdG8gc2tpcCBvdmVyIGEgcG90ZW50aWFsbHkgbGFyZ2UgYW1vdW50IG9mCisgKiB1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLgorICoKKyAqIFdyaXRlcnMgb2Ygc3VzcGVuZGFibGUtaW5wdXQgYXBwbGljYXRpb25zIG11c3Qgbm90ZSB0aGF0IHNraXBfaW5wdXRfZGF0YQorICogaXMgbm90IGdyYW50ZWQgdGhlIHJpZ2h0IHRvIGdpdmUgYSBzdXNwZW5zaW9uIHJldHVybi4gIElmIHRoZSBza2lwIGV4dGVuZHMKKyAqIGJleW9uZCB0aGUgZGF0YSBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciwgdGhlIGJ1ZmZlciBjYW4gYmUgbWFya2VkIGVtcHR5IHNvCisgKiB0aGF0IHRoZSBuZXh0IHJlYWQgd2lsbCBjYXVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyIGNhbGwgdGhhdCBjYW4gc3VzcGVuZC4KKyAqIEFycmFuZ2luZyBmb3IgYWRkaXRpb25hbCBieXRlcyB0byBiZSBkaXNjYXJkZWQgYmVmb3JlIHJlbG9hZGluZyB0aGUgaW5wdXQKKyAqIGJ1ZmZlciBpcyB0aGUgYXBwbGljYXRpb24gd3JpdGVyJ3MgcHJvYmxlbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3NraXBfaW5wdXRfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgbG9uZyBudW1fYnl0ZXMpCit7CisgIG15X3NyY19wdHIgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisKKyAgLyogSnVzdCBhIGR1bWIgaW1wbGVtZW50YXRpb24gZm9yIG5vdy4gIENvdWxkIHVzZSBmc2VlaygpIGV4Y2VwdAorICAgKiBpdCBkb2Vzbid0IHdvcmsgb24gcGlwZXMuICBOb3QgY2xlYXIgdGhhdCBiZWluZyBzbWFydCBpcyB3b3J0aAorICAgKiBhbnkgdHJvdWJsZSBhbnl3YXkgLS0tIGxhcmdlIHNraXBzIGFyZSBpbmZyZXF1ZW50LgorICAgKi8KKyAgaWYgKG51bV9ieXRlcyA+IDApIHsKKyAgICB3aGlsZSAobnVtX2J5dGVzID4gKGxvbmcpIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlcikgeworICAgICAgbnVtX2J5dGVzIC09IChsb25nKSBzcmMtPnB1Yi5ieXRlc19pbl9idWZmZXI7CisgICAgICAodm9pZCkgZmlsbF9pbnB1dF9idWZmZXIoY2luZm8pOworICAgICAgLyogbm90ZSB3ZSBhc3N1bWUgdGhhdCBmaWxsX2lucHV0X2J1ZmZlciB3aWxsIG5ldmVyIHJldHVybiBGQUxTRSwKKyAgICAgICAqIHNvIHN1c3BlbnNpb24gbmVlZCBub3QgYmUgaGFuZGxlZC4KKyAgICAgICAqLworICAgIH0KKyAgICBzcmMtPnB1Yi5uZXh0X2lucHV0X2J5dGUgKz0gKHNpemVfdCkgbnVtX2J5dGVzOworICAgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciAtPSAoc2l6ZV90KSBudW1fYnl0ZXM7CisgIH0KK30KKworCisvKgorICogQW4gYWRkaXRpb25hbCBtZXRob2QgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgZGF0YSBzb3VyY2UgbW9kdWxlcyBpcyB0aGUKKyAqIHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZXJyb3IgcmVjb3ZlcnkgaW4gdGhlIHByZXNlbmNlIG9mIFJTVCBtYXJrZXJzLgorICogRm9yIHRoZSBtb21lbnQsIHRoaXMgc291cmNlIG1vZHVsZSBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgcmVzeW5jIG1ldGhvZAorICogcHJvdmlkZWQgYnkgdGhlIEpQRUcgbGlicmFyeS4gIFRoYXQgbWV0aG9kIGFzc3VtZXMgdGhhdCBubyBiYWNrdHJhY2tpbmcKKyAqIGlzIHBvc3NpYmxlLgorICovCisKKworLyoKKyAqIFRlcm1pbmF0ZSBzb3VyY2UgLS0tIGNhbGxlZCBieSBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzCisgKiBhZnRlciBhbGwgZGF0YSBoYXMgYmVlbiByZWFkLiAgT2Z0ZW4gYSBuby1vcC4KKyAqCisgKiBOQjogKm5vdCogY2FsbGVkIGJ5IGpwZWdfYWJvcnQgb3IganBlZ19kZXN0cm95OyBzdXJyb3VuZGluZworICogYXBwbGljYXRpb24gbXVzdCBkZWFsIHdpdGggYW55IGNsZWFudXAgdGhhdCBzaG91bGQgaGFwcGVuIGV2ZW4KKyAqIGZvciBlcnJvciBleGl0LgorICovCisKK01FVEhPRERFRih2b2lkKQordGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVjZXNzYXJ5IGhlcmUgKi8KK30KKworCisvKgorICogUHJlcGFyZSBmb3IgaW5wdXQgZnJvbSBhIHN0ZGlvIHN0cmVhbS4KKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGFscmVhZHkgb3BlbmVkIHRoZSBzdHJlYW0sIGFuZCBpcyByZXNwb25zaWJsZQorICogZm9yIGNsb3NpbmcgaXQgYWZ0ZXIgZmluaXNoaW5nIGRlY29tcHJlc3Npb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX3N0ZGlvX3NyYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgbXlfc3JjX3B0ciBzcmM7CisKKyAgLyogVGhlIHNvdXJjZSBvYmplY3QgYW5kIGlucHV0IGJ1ZmZlciBhcmUgbWFkZSBwZXJtYW5lbnQgc28gdGhhdCBhIHNlcmllcworICAgKiBvZiBKUEVHIGltYWdlcyBjYW4gYmUgcmVhZCBmcm9tIHRoZSBzYW1lIGZpbGUgYnkgY2FsbGluZyBqcGVnX3N0ZGlvX3NyYworICAgKiBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgb25lLiAgKElmIHdlIGRpc2NhcmRlZCB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YKKyAgICogb25lIGltYWdlLCB3ZSdkIGxpa2VseSBsb3NlIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBvbmUuKQorICAgKiBUaGlzIG1ha2VzIGl0IHVuc2FmZSB0byB1c2UgdGhpcyBtYW5hZ2VyIGFuZCBhIGRpZmZlcmVudCBzb3VyY2UKKyAgICogbWFuYWdlciBzZXJpYWxseSB3aXRoIHRoZSBzYW1lIEpQRUcgb2JqZWN0LiAgQ2F2ZWF0IHByb2dyYW1tZXIuCisgICAqLworICBpZiAoY2luZm8tPnNyYyA9PSBOVUxMKSB7CS8qIGZpcnN0IHRpbWUgZm9yIHRoaXMgSlBFRyBvYmplY3Q/ICovCisgICAgY2luZm8tPnNyYyA9IChzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIFNJWkVPRihteV9zb3VyY2VfbWdyKSk7CisgICAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgICAgc3JjLT5idWZmZXIgPSAoSk9DVEVUICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX1BFUk1BTkVOVCwKKwkJCQkgIElOUFVUX0JVRl9TSVpFICogU0laRU9GKEpPQ1RFVCkpOworICB9CisKKyAgc3JjID0gKG15X3NyY19wdHIpIGNpbmZvLT5zcmM7CisgIHNyYy0+cHViLmluaXRfc291cmNlID0gaW5pdF9zb3VyY2U7CisgIHNyYy0+cHViLmZpbGxfaW5wdXRfYnVmZmVyID0gZmlsbF9pbnB1dF9idWZmZXI7CisgIHNyYy0+cHViLnNraXBfaW5wdXRfZGF0YSA9IHNraXBfaW5wdXRfZGF0YTsKKyAgc3JjLT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OyAvKiB1c2UgZGVmYXVsdCBtZXRob2QgKi8KKyAgc3JjLT5wdWIudGVybV9zb3VyY2UgPSB0ZXJtX3NvdXJjZTsKKyAgc3JjLT5pbmZpbGUgPSBpbmZpbGU7CisgIHNyYy0+cHViLmJ5dGVzX2luX2J1ZmZlciA9IDA7IC8qIGZvcmNlcyBmaWxsX2lucHV0X2J1ZmZlciBvbiBmaXJzdCByZWFkICovCisgIHNyYy0+cHViLm5leHRfaW5wdXRfYnl0ZSA9IE5VTEw7IC8qIHVudGlsIGJ1ZmZlciBsb2FkZWQgKi8KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGNvZWZjdC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkY29lZmN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZlOTUwNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGNvZWZjdC5jCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKyAqIGpkY29lZmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGNvbnRyb2xsZXIgZm9yIGRlY29tcHJlc3Npb24uCisgKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBkZWNvbXByZXNzb3IgcHJvcGVyLgorICogVGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBsaWVzIGJldHdlZW4gZW50cm9weSBkZWNvZGluZyBhbmQgaW52ZXJzZS1EQ1Qgc3RlcHMuCisgKgorICogSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhpcyBjb250cm9sbGVyIGlzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbgorICogaW5wdXQtb3JpZW50ZWQgcHJvY2Vzc2luZyBhbmQgb3V0cHV0LW9yaWVudGVkIHByb2Nlc3NpbmcuCisgKiBBbHNvLCB0aGUgaW5wdXQgc2lkZSAob25seSkgaXMgdXNlZCB3aGVuIHJlYWRpbmcgYSBmaWxlIGZvciB0cmFuc2NvZGluZy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKy8qIEJsb2NrIHNtb290aGluZyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHByb2dyZXNzaXZlIEpQRUcsIHNvOiAqLworI2lmbmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorI3VuZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyNlbmRpZgorCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoZXNlIHZhcmlhYmxlcyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBpbnB1dCBzaWRlLiAqLworICAvKiBjaW5mby0+aW5wdXRfaU1DVV9yb3cgaXMgYWxzbyB1c2VkIGZvciB0aGlzLiAqLworICBKRElNRU5TSU9OIE1DVV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KKyAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KKyAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KKworICAvKiBUaGUgb3V0cHV0IHNpZGUncyBsb2NhdGlvbiBpcyByZXByZXNlbnRlZCBieSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93LiAqLworCisgIC8qIEluIHNpbmdsZS1wYXNzIG1vZGVzLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVS4KKyAgICogV2UgYWxsb2NhdGUgYSB3b3Jrc3BhY2Ugb2YgRF9NQVhfQkxPQ0tTX0lOX01DVSBjb2VmZmljaWVudCBibG9ja3MsCisgICAqIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciB3cml0ZSBpbnRvIHRoYXQgd29ya3NwYWNlIGVhY2ggdGltZS4KKyAgICogKE9uIDgweDg2LCB0aGUgd29ya3NwYWNlIGlzIEZBUiBldmVuIHRob3VnaCBpdCdzIG5vdCByZWFsbHkgdmVyeSBiaWc7CisgICAqIHRoaXMgaXMgdG8ga2VlcCB0aGUgbW9kdWxlIGludGVyZmFjZXMgdW5jaGFuZ2VkIHdoZW4gYSBsYXJnZSBjb2VmZmljaWVudAorICAgKiBidWZmZXIgaXMgbmVjZXNzYXJ5LikKKyAgICogSW4gbXVsdGktcGFzcyBtb2RlcywgdGhpcyBhcnJheSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgTUNVJ3MgYmxvY2tzCisgICAqIHdpdGhpbiB0aGUgdmlydHVhbCBhcnJheXM7IGl0IGlzIHVzZWQgb25seSBieSB0aGUgaW5wdXQgc2lkZS4KKyAgICovCisgIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgIC8qIEluIG11bHRpLXBhc3MgbW9kZXMsIHdlIG5lZWQgYSB2aXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KKyAganZpcnRfYmFycmF5X3B0ciB3aG9sZV9pbWFnZVtNQVhfQ09NUE9ORU5UU107CisjZW5kaWYKKworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgLyogV2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcsIHdlIGxhdGNoIGNvZWZmaWNpZW50IEFsIHZhbHVlcyBoZXJlICovCisgIGludCAqIGNvZWZfYml0c19sYXRjaDsKKyNkZWZpbmUgU0FWRURfQ09FRlMgIDYJCS8qIHdlIHNhdmUgY29lZl9iaXRzWzAuLjVdICovCisjZW5kaWYKK30gbXlfY29lZl9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19vbmVwYXNzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKK01FVEhPRERFRihpbnQpIGRlY29tcHJlc3NfZGF0YQorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7CisjZW5kaWYKKyNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECitMT0NBTChib29sZWFuKSBzbW9vdGhpbmdfb2sgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitNRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX3Ntb290aF9kYXRhCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpKTsKKyNlbmRpZgorCisKK0xPQ0FMKHZvaWQpCitzdGFydF9pTUNVX3JvdyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93IChpbnB1dCBzaWRlKSAqLworeworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICAvKiBJbiBhbiBpbnRlcmxlYXZlZCBzY2FuLCBhbiBNQ1Ugcm93IGlzIHRoZSBzYW1lIGFzIGFuIGlNQ1Ugcm93LgorICAgKiBJbiBhIG5vbmludGVybGVhdmVkIHNjYW4sIGFuIGlNQ1Ugcm93IGhhcyB2X3NhbXBfZmFjdG9yIE1DVSByb3dzLgorICAgKiBCdXQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHByb2Nlc3Mgb25seSB3aGF0J3MgbGVmdC4KKyAgICovCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA+IDEpIHsKKyAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSAxOworICB9IGVsc2UgeworICAgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCAoY2luZm8tPnRvdGFsX2lNQ1Vfcm93cy0xKSkKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UKKyAgICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IGNpbmZvLT5jdXJfY29tcF9pbmZvWzBdLT5sYXN0X3Jvd19oZWlnaHQ7CisgIH0KKworICBjb2VmLT5NQ1VfY3RyID0gMDsKKyAgY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0gMDsKK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYW4gaW5wdXQgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfaW5wdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgY2luZm8tPmlucHV0X2lNQ1Vfcm93ID0gMDsKKyAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiBvdXRwdXQgcHJvY2Vzc2luZyBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKworICAvKiBJZiBtdWx0aXBhc3MsIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRvIHVzZSBibG9jayBzbW9vdGhpbmcgb24gdGhpcyBwYXNzICovCisgIGlmIChjb2VmLT5wdWIuY29lZl9hcnJheXMgIT0gTlVMTCkgeworICAgIGlmIChjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nICYmIHNtb290aGluZ19vayhjaW5mbykpCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19zbW9vdGhfZGF0YTsKKyAgICBlbHNlCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOworICB9CisjZW5kaWYKKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IDA7Cit9CisKKworLyoKKyAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIHNpbmdsZS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBJbnB1dCBhbmQgb3V0cHV0IG11c3QgcnVuIGluIGxvY2tzdGVwIHNpbmNlIHdlIGhhdmUgb25seSBhIG9uZS1NQ1UgYnVmZmVyLgorICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfUk9XX0NPTVBMRVRFRCwgSlBFR19TQ0FOX0NPTVBMRVRFRCwgb3IgSlBFR19TVVNQRU5ERUQuCisgKgorICogTkI6IG91dHB1dF9idWYgY29udGFpbnMgYSBwbGFuZSBmb3IgZWFjaCBjb21wb25lbnQgaW4gaW1hZ2UsCisgKiB3aGljaCB3ZSBpbmRleCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvbmVudCdzIFNPRiBwb3NpdGlvbi4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19vbmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCisgIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7CisgIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCB1c2VmdWxfd2lkdGg7CisgIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2wsIG91dHB1dF9jb2w7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1Q7CisKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKKyAgICBsYXN0X01DVV9jb2wgPQorICAgICAgICAoY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fcmlnaHRfYm91bmRhcnkgLQorICAgICAgICAgY2luZm8tPmNvZWYtPk1DVV9jb2x1bW5fbGVmdF9ib3VuZGFyeSkgLSAxOworICB9CisjZW5kaWYKKworICAvKiBMb29wIHRvIHByb2Nlc3MgYXMgbXVjaCBhcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8PSBsYXN0X01DVV9jb2w7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8qIFRyeSB0byBmZXRjaCBhbiBNQ1UuICBFbnRyb3B5IGRlY29kZXIgZXhwZWN0cyBidWZmZXIgdG8gYmUgemVyb2VkLiAqLworICAgICAgaWYgKE1DVV9jb2xfbnVtIDwgY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXApIHsKKyAgICAgICAgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbyk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyWzBdLAorCQkoc2l6ZV90KSAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSkpOworICAgICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7CisJICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworCSAgY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOworCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBEZXRlcm1pbmUgd2hlcmUgZGF0YSBzaG91bGQgZ28gaW4gb3V0cHV0X2J1ZiBhbmQgZG8gdGhlIElEQ1QgdGhpbmcuCisgICAgICAgKiBXZSBza2lwIGR1bW15IGJsb2NrcyBhdCB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlcyAoYnV0IGJsa24gZ2V0cworICAgICAgICogaW5jcmVtZW50ZWQgcGFzdCB0aGVtISkuICBOb3RlIHRoZSBpbm5lciBsb29wIHJlbGllcyBvbiBoYXZpbmcKKyAgICAgICAqIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcyBzZXF1ZW50aWFsbHkuCisgICAgICAgKi8KKyAgICAgIGJsa24gPSAwOwkJCS8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisJY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKwkvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKwlpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisJICBibGtuICs9IGNvbXBwdHItPk1DVV9ibG9ja3M7CisJICBjb250aW51ZTsKKwl9CisJaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XTsKKwl1c2VmdWxfd2lkdGggPSAoTUNVX2NvbF9udW0gPCBsYXN0X01DVV9jb2wpID8gY29tcHB0ci0+TUNVX3dpZHRoCisJCQkJCQkgICAgOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKKwlvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdICsKKwkgIHlvZmZzZXQgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoOworCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKwkgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPCBsYXN0X2lNQ1Vfcm93IHx8CisJICAgICAgeW9mZnNldCt5aW5kZXggPCBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQpIHsKKwkgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2NvbDsKKwkgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCB1c2VmdWxfd2lkdGg7IHhpbmRleCsrKSB7CisJICAgICAgKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLAorCQkgICAgICAgIChKQ09FRlBUUikgY29lZi0+TUNVX2J1ZmZlcltibGtuK3hpbmRleF0sCisJCSAgICAgICAgb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJICAgICAgb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJICAgIH0KKwkgIH0KKwkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOworCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisJfQorICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgY2luZm8tPm91dHB1dF9pTUNVX3JvdysrOworICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKKyAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7CisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgfQorICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOworICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKK30KKworCisvKgorICogRHVtbXkgY29uc3VtZS1pbnB1dCByb3V0aW5lIGZvciBzaW5nbGUtcGFzcyBvcGVyYXRpb24uCisgKi8KKworTUVUSE9EREVGKGludCkKK2R1bW15X2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwkvKiBBbHdheXMgaW5kaWNhdGUgbm90aGluZyB3YXMgZG9uZSAqLworfQorCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisvKgorICogQ29uc3VtZSBpbnB1dCBkYXRhIGFuZCBzdG9yZSBpdCBpbiB0aGUgZnVsbC1pbWFnZSBjb2VmZmljaWVudCBidWZmZXIuCisgKiBXZSByZWFkIGFzIG11Y2ggYXMgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpIHBlciBjYWxsLAorICogaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIHNjYW4uCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OworICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBmb3IgdGhlIGNvbXBvbmVudHMgdXNlZCBpbiB0aGlzIHNjYW4uICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICBidWZmZXJbY2ldID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0sCisgICAgICAgY2luZm8tPnRpbGVfZGVjb2RlID8gMCA6IGNpbmZvLT5pbnB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisgICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgIC8qIE5vdGU6IGVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQsCisgICAgICogYnV0IHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtZW1vcnkgbWFuYWdlcgorICAgICAqIGJlY2F1c2Ugd2UgcmVxdWVzdGVkIGEgcHJlLXplcm9lZCBhcnJheS4KKyAgICAgKi8KKyAgfQorICB1bnNpZ25lZCBpbnQgTUNVc19wZXJfcm93ID0gY2luZm8tPk1DVXNfcGVyX3JvdzsKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKKyAgICBpbnQgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGg7CisgICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgeworICAgICAgLy8gSW50ZXJsZWF2ZWQKKyAgICAgIGlNQ1Vfd2lkdGhfVG9fTUNVX3dpZHRoID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTm9uLWludGVydmxlYXZlZAorICAgICAgaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+aF9zYW1wX2ZhY3RvcjsKKyAgICB9CisgICAgTUNVc19wZXJfcm93ID0gam1pbihNQ1VzX3Blcl9yb3csCisgICAgICAgIChjaW5mby0+Y29lZi0+Y29sdW1uX3JpZ2h0X2JvdW5kYXJ5IC0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5KQorICAgICAgICAqIGNpbmZvLT5lbnRyb3B5LT5pbmRleC0+TUNVX3NhbXBsZV9zaXplICogaU1DVV93aWR0aF9Ub19NQ1Vfd2lkdGgpOworICB9CisjZW5kaWYKKworICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCisgIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKKyAgICAgICB5b2Zmc2V0KyspIHsKKyAgIC8vIGNvbmZpZ3VyZSBodWZmbWFuIGRlY29kZXIKKyNpZmRlZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgeworICAgICAgaHVmZm1hbl9zY2FuX2hlYWRlciBzY2FuX2hlYWRlciA9CisgICAgICAgICAgICBjaW5mby0+ZW50cm9weS0+aW5kZXgtPnNjYW5bY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyXTsKKyAgICAgIGludCBjb2xfb2Zmc2V0ID0gY2luZm8tPmNvZWYtPmNvbHVtbl9sZWZ0X2JvdW5kYXJ5OworICAgICAgKCpjaW5mby0+ZW50cm9weS0+Y29uZmlndXJlX2h1ZmZtYW5fZGVjb2RlcikgKGNpbmZvLAorICAgICAgICAgICAgICBzY2FuX2hlYWRlci5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XQorICAgICAgICAgICAgICBbY29sX29mZnNldCArIHlvZmZzZXQgKiBzY2FuX2hlYWRlci5NQ1VzX3Blcl9yb3ddKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIHplcm8gYWxsIGJsb2NrcworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IE1DVXNfcGVyX3JvdzsKKyAgICAgICAgICBNQ1VfY29sX251bSsrKSB7CisgICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLworICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLworICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKKyAgICAgICAgc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKyAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7CisgICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisgICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisjaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorICAgICAgICAgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSAmJiBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gMCkgeworICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHByZS16ZXJvIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24tMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoU0laRU9GKEpCTE9DSykpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisKKyAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdSkgKGNpbmZvLCBjb2VmLT5NQ1VfYnVmZmVyKSkgeworICAgICAgICAvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisgICAgICAgIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7CisgICAgICAgIGNvZWYtPk1DVV9jdHIgPSBNQ1VfY29sX251bTsKKyAgICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKy8qCisgKiBDb25zdW1lIGlucHV0IGRhdGEgYW5kIHN0b3JlIGl0IGluIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCisgKiBSZWFkIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KSBwZXIgY2FsbC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhX211bHRpX3NjYW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZtYW5faW5kZXggKmluZGV4ID0gY2luZm8tPmVudHJvcHktPmluZGV4OworICBpbnQgaSwgcmV0Y29kZSwgY2k7CisgIGludCBtY3UgPSBjaW5mby0+aW5wdXRfaU1DVV9yb3c7CisgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOworICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgeworICAgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgaW5kZXgtPnNjYW5baV0uYml0c3RyZWFtX29mZnNldCk7CisgICAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyA9IG1jdTsKKyAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgICAgLy8gQ29uc3VtZSBTT1MgYW5kIERIVCBoZWFkZXJzCisgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX21hcmtlcnMpIChjaW5mbywgaW5kZXgsIGkpOworICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdTsKKyAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSBpOworICAgIGNpbmZvLT5lbnRyb3B5LT5pbmRleCA9IGluZGV4OworICAgIC8vIENvbnN1bWUgc2NhbiBibG9jayBkYXRhCisgICAgY29uc3VtZV9kYXRhKGNpbmZvKTsKKyAgfQorICBjaW5mby0+aW5wdXRfaU1DVV9yb3cgPSBtY3UgKyAxOworICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOworICBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gMDsKKyAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKK30KKworLyoKKyAqIFNhbWUgYXMgY29uc3VtZV9kYXRhLCBleHBlY3QgZm9yIHNhdmluZyB0aGUgSHVmZm1hbiBkZWNvZGUgaW5mb3JtYXRpb24KKyAqIC0gYml0c3RyZWFtIG9mZnNldCBhbmQgREMgY29lZmZpY2llbnQgdG8gaW5kZXguCisgKi8KKworTUVUSE9EREVGKGludCkKK2NvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikKK3sKKyAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7CisgIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KKyAgaW50IGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKKyAgSkRJTUVOU0lPTiBzdGFydF9jb2w7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworCisgIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47CisgIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisKKyAgc2l6ZV90IGFsbG9jYXRlX3NpemUgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cKKyAgICAgICogamRpdl9yb3VuZF91cChjaW5mby0+TUNVc19wZXJfcm93LCBpbmRleC0+TUNVX3NhbXBsZV9zaXplKQorICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSk7CisgIHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XSA9CisgICAgICAgIChodWZmbWFuX29mZnNldF9kYXRhKiltYWxsb2MoYWxsb2NhdGVfc2l6ZSk7CisgIGluZGV4LT5tZW1fdXNlZCArPSBhbGxvY2F0ZV9zaXplOworCisgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldF9kYXRhID0gc2Nhbl9oZWFkZXItPm9mZnNldFtjaW5mby0+aW5wdXRfaU1DVV9yb3ddOworCisgIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KKyAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OworICAgICAgIHlvZmZzZXQrKykgeworICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7CisJIE1DVV9jb2xfbnVtKyspIHsKKyAgICAgIC8vIFJlY29yZCBodWZmbWFuIGJpdCBvZmZzZXQKKyAgICAgIGlmIChNQ1VfY29sX251bSAlIGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgPT0gMCkgeworICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgICAgICsrb2Zmc2V0X2RhdGE7CisgICAgICB9CisKKyAgICAgIC8qIFRyeSB0byBmZXRjaCB0aGUgTUNVLiAqLworICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYpIChjaW5mbykpIHsKKyAgICAgICAgLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLworICAgICAgICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OworICAgICAgICBjb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07CisgICAgICAgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLworICAgIGNvZWYtPk1DVV9jdHIgPSAwOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCisgIGlmICgrKyhjaW5mby0+aW5wdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgeworICAgIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKKyAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOworICB9CisgIC8qIENvbXBsZXRlZCB0aGUgc2NhbiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisvKgorICogU2FtZSBhcyBjb25zdW1lX2RhdGEsIGV4cGVjdCBmb3Igc2F2aW5nIHRoZSBIdWZmbWFuIGRlY29kZSBpbmZvcm1hdGlvbgorICogLSBiaXRzdHJlYW0gb2Zmc2V0IGFuZCBEQyBjb2VmZmljaWVudCB0byBpbmRleC4KKyAqLworCitNRVRIT0RERUYoaW50KQorY29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXhfcHJvZ3Jlc3NpdmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgY3VycmVudF9zY2FuKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLworICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0OworICBKRElNRU5TSU9OIHN0YXJ0X2NvbDsKKyAgSkJMT0NLQVJSQVkgYnVmZmVyW01BWF9DT01QU19JTl9TQ0FOXTsKKyAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgaW50IGZhY3RvciA9IDQ7IC8vIG1heGltdW0gZmFjdG9yIGlzIDQuCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGZhY3RvciA9IGptaW4oZmFjdG9yLCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmhfc2FtcF9mYWN0b3IpOworCisgIGludCBzYW1wbGVfc2l6ZSA9IGluZGV4LT5NQ1Vfc2FtcGxlX3NpemUgKiBmYWN0b3I7CisgIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW5faGVhZGVyID0gaW5kZXgtPnNjYW4gKyBjdXJyZW50X3NjYW47CisgIHNjYW5faGVhZGVyLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgIHNjYW5faGVhZGVyLT5NQ1VzX3Blcl9yb3cgPSBqZGl2X3JvdW5kX3VwKGNpbmZvLT5NQ1VzX3Blcl9yb3csIHNhbXBsZV9zaXplKTsKKyAgc2Nhbl9oZWFkZXItPmNvbXBzX2luX3NjYW4gPSBjaW5mby0+Y29tcHNfaW5fc2NhbjsKKworICBzaXplX3QgYWxsb2NhdGVfc2l6ZSA9IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdworICAgICAgKiBzY2FuX2hlYWRlci0+TUNVc19wZXJfcm93ICogc2l6ZW9mKGh1ZmZtYW5fb2Zmc2V0X2RhdGEpOworICBzY2FuX2hlYWRlci0+b2Zmc2V0W2NpbmZvLT5pbnB1dF9pTUNVX3Jvd10gPQorICAgICAgICAoaHVmZm1hbl9vZmZzZXRfZGF0YSopbWFsbG9jKGFsbG9jYXRlX3NpemUpOworICBpbmRleC0+bWVtX3VzZWQgKz0gYWxsb2NhdGVfc2l6ZTsKKworICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXRfZGF0YSA9IHNjYW5faGVhZGVyLT5vZmZzZXRbY2luZm8tPmlucHV0X2lNQ1Vfcm93XTsKKworICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKKyAgICAgICAwLCAvLyBPbmx5IG5lZWQgb25lIHJvdyBidWZmZXIKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgIH0KKyAgLyogTG9vcCB0byBwcm9jZXNzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLworICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisgICAgICAgeW9mZnNldCsrKSB7CisgICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDwgY2luZm8tPk1DVXNfcGVyX3JvdzsKKwkgTUNVX2NvbF9udW0rKykgeworICAgICAgLyogRm9yIGVhY2ggTUNVLCB3ZSBsb29wIHRocm91Z2ggZGlmZmVyZW50IGNvbG9yIGNvbXBvbmVudHMuCisgICAgICAgKiBUaGVuLCBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQgd2Ugd2lsbCBnZXQgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVAorICAgICAgICogYmxvY2tzIGluIHRoZSB2aXJ0dWFsIGJ1ZmZlci4KKyAgICAgICAqLworICAgICAgYmxrbiA9IDA7IC8qIGluZGV4IG9mIGN1cnJlbnQgRENUIGJsb2NrIHdpdGhpbiBNQ1UgKi8KKyAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgICAgIHN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOworICAgICAgICAvKiBHZXQgdGhlIGxpc3Qgb2YgcG9pbnRlcnMgdG8gRENUIGJsb2NrcyBpbgorICAgICAgICAgKiB0aGUgdmlydHVhbCBidWZmZXIgaW4gYSBjb2xvciBjb21wb25lbnQgb2YgdGhlIE1DVS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKKyAgICAgICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2NpXVt5aW5kZXgreW9mZnNldF0gKyBzdGFydF9jb2w7CisgICAgICAgICAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7CisgICAgICAgICAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7CisgICAgICAgICAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IDApIHsKKyAgICAgICAgICAgICAgLy8gbmVlZCB0byBkbyBwcmUtemVybyBieSBvdXJzZWxmLgorICAgICAgICAgICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpIChTSVpFT0YoSkJMT0NLKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUmVjb3JkIGh1ZmZtYW4gYml0IG9mZnNldAorICAgICAgaWYgKE1DVV9jb2xfbnVtICUgc2FtcGxlX3NpemUgPT0gMCkgeworICAgICAgICAoKmNpbmZvLT5lbnRyb3B5LT5nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICAgICAgKGNpbmZvLCBvZmZzZXRfZGF0YSk7CisgICAgICAgICsrb2Zmc2V0X2RhdGE7CisgICAgICB9CisgICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KKyAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKKwkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCisJY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKKwljb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07CisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgfQorICAgIH0KKyAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCisgICAgY29lZi0+TUNVX2N0ciA9IDA7CisgIH0KKyAgKCpjaW5mby0+ZW50cm9weS0+Z2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKQorICAgICAgICAoY2luZm8sICZzY2FuX2hlYWRlci0+cHJldl9NQ1Vfb2Zmc2V0KTsKKyAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KKyAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7CisgICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOworICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIH0KKyAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCisgICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKy8qCisgKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBtdWx0aS1wYXNzIGNhc2UuCisgKiBBbHdheXMgYXR0ZW1wdHMgdG8gZW1pdCBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19ST1dfQ09NUExFVEVELCBKUEVHX1NDQU5fQ09NUExFVEVELCBvciBKUEVHX1NVU1BFTkRFRC4KKyAqCisgKiBOQjogb3V0cHV0X2J1ZiBjb250YWlucyBhIHBsYW5lIGZvciBlYWNoIGNvbXBvbmVudCBpbiBpbWFnZS4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19kYXRhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIG91dHB1dF9idWYpCit7CisgIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOworICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKKyAgSkRJTUVOU0lPTiBibG9ja19udW07CisgIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyOworICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7CisgIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKKworICAvKiBGb3JjZSBzb21lIGlucHV0IHRvIGJlIGRvbmUgaWYgd2UgYXJlIGdldHRpbmcgYWhlYWQgb2YgdGhlIGlucHV0LiAqLworICB3aGlsZSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyIDwgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciB8fAorCSAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgJiYKKwkgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8PSBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSkgeworICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkoY2luZm8pID09IEpQRUdfU1VTUEVOREVEKQorICAgICAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICB9CisKKyAgLyogT0ssIG91dHB1dCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gSURDVCBhbiB1bmludGVyZXN0aW5nIGNvbXBvbmVudC4gKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKQorICAgICAgY29udGludWU7CisgICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KKyAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgIGNpbmZvLT50aWxlX2RlY29kZSA/IDAgOiBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKyAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdykKKyAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGVsc2UgeworICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCisgICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKKyAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIH0KKyAgICBpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjaV07CisgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbY2ldOworICAgIGludCB3aWR0aF9pbl9ibG9ja3MgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisgICAgaW50IHN0YXJ0X2Jsb2NrID0gMDsKKyNpZiBBTkRST0lEX1RJTEVfQkFTRURfREVDT0RFCisgICAgaWYgKGNpbmZvLT50aWxlX2RlY29kZSkgeworICAgICAgLy8gd2lkdGhfaW5fYmxvY2tzIGZvciBhIGNvbXBvbmVudCBkZXBlbmRzIG9uIGl0cyBoX3NhbXBfZmFjdG9yLgorICAgICAgd2lkdGhfaW5fYmxvY2tzID0gam1pbih3aWR0aF9pbl9ibG9ja3MsCisgICAgICAgIChjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9yaWdodF9ib3VuZGFyeSAtCisgICAgICAgICBjaW5mby0+Y29lZi0+TUNVX2NvbHVtbl9sZWZ0X2JvdW5kYXJ5KSAqCisgICAgICAgICBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICAgIHN0YXJ0X2Jsb2NrID0gY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXAgKgorICAgICAgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgIH0KKyNlbmRpZgorICAgIC8qIExvb3Agb3ZlciBhbGwgRENUIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQuICovCisgICAgZm9yIChibG9ja19yb3cgPSAwOyBibG9ja19yb3cgPCBibG9ja19yb3dzOyBibG9ja19yb3crKykgeworICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltibG9ja19yb3ddOworICAgICAgb3V0cHV0X2NvbCA9IHN0YXJ0X2Jsb2NrICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgYnVmZmVyX3B0ciArPSBzdGFydF9ibG9jazsKKyAgICAgIGZvciAoYmxvY2tfbnVtID0gc3RhcnRfYmxvY2s7IGJsb2NrX251bSA8IHdpZHRoX2luX2Jsb2NrczsgYmxvY2tfbnVtKyspIHsKKwkoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsIChKQ09FRlBUUikgYnVmZmVyX3B0ciwKKwkJCW91dHB1dF9wdHIsIG91dHB1dF9jb2wpOworCWJ1ZmZlcl9wdHIrKzsKKwlvdXRwdXRfY29sICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICAgIH0KKyAgICAgIG91dHB1dF9wdHIgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIH0KKyAgfQorCisgIGlmICgrKyhjaW5mby0+b3V0cHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKKyAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Cit9CisKKyNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorCisvKgorICogVGhpcyBjb2RlIGFwcGxpZXMgaW50ZXJibG9jayBzbW9vdGhpbmcgYXMgZGVzY3JpYmVkIGJ5IHNlY3Rpb24gSy44CisgKiBvZiB0aGUgSlBFRyBzdGFuZGFyZDogdGhlIGZpcnN0IDUgQUMgY29lZmZpY2llbnRzIGFyZSBlc3RpbWF0ZWQgZnJvbQorICogdGhlIERDIHZhbHVlcyBvZiBhIERDVCBibG9jayBhbmQgaXRzIDggbmVpZ2hib3JpbmcgYmxvY2tzLgorICogV2UgYXBwbHkgc21vb3RoaW5nIG9ubHkgZm9yIHByb2dyZXNzaXZlIEpQRUcgZGVjb2RpbmcsIGFuZCBvbmx5IGlmCisgKiB0aGUgY29lZmZpY2llbnRzIGl0IGNhbiBlc3RpbWF0ZSBhcmUgbm90IHlldCBrbm93biB0byBmdWxsIHByZWNpc2lvbi4KKyAqLworCisvKiBOYXR1cmFsLW9yZGVyIGFycmF5IHBvc2l0aW9ucyBvZiB0aGUgZmlyc3QgNSB6aWd6YWctb3JkZXIgY29lZmZpY2llbnRzICovCisjZGVmaW5lIFEwMV9QT1MgIDEKKyNkZWZpbmUgUTEwX1BPUyAgOAorI2RlZmluZSBRMjBfUE9TICAxNgorI2RlZmluZSBRMTFfUE9TICA5CisjZGVmaW5lIFEwMl9QT1MgIDIKKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGJsb2NrIHNtb290aGluZyBpcyBhcHBsaWNhYmxlIGFuZCBzYWZlLgorICogV2UgYWxzbyBsYXRjaCB0aGUgY3VycmVudCBzdGF0ZXMgb2YgdGhlIGNvZWZfYml0c1tdIGVudHJpZXMgZm9yIHRoZQorICogQUMgY29lZmZpY2llbnRzOyBvdGhlcndpc2UsIGlmIHRoZSBpbnB1dCBzaWRlIG9mIHRoZSBkZWNvbXByZXNzb3IKKyAqIGFkdmFuY2VzIGludG8gYSBuZXcgc2Nhbiwgd2UgbWlnaHQgdGhpbmsgdGhlIGNvZWZmaWNpZW50cyBhcmUga25vd24KKyAqIG1vcmUgYWNjdXJhdGVseSB0aGFuIHRoZXkgcmVhbGx5IGFyZS4KKyAqLworCitMT0NBTChib29sZWFuKQorc21vb3RoaW5nX29rIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgYm9vbGVhbiBzbW9vdGhpbmdfdXNlZnVsID0gRkFMU0U7CisgIGludCBjaSwgY29lZmk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpRVUFOVF9UQkwgKiBxdGFibGU7CisgIGludCAqIGNvZWZfYml0czsKKyAgaW50ICogY29lZl9iaXRzX2xhdGNoOworCisgIGlmICghIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlIHx8IGNpbmZvLT5jb2VmX2JpdHMgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogQWxsb2NhdGUgbGF0Y2ggYXJlYSBpZiBub3QgYWxyZWFkeSBkb25lICovCisgIGlmIChjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPT0gTlVMTCkKKyAgICBjb2VmLT5jb2VmX2JpdHNfbGF0Y2ggPSAoaW50ICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgY2luZm8tPm51bV9jb21wb25lbnRzICoKKwkJCQkgIChTQVZFRF9DT0VGUyAqIFNJWkVPRihpbnQpKSk7CisgIGNvZWZfYml0c19sYXRjaCA9IGNvZWYtPmNvZWZfYml0c19sYXRjaDsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIEFsbCBjb21wb25lbnRzJyBxdWFudGl6YXRpb24gdmFsdWVzIG11c3QgYWxyZWFkeSBiZSBsYXRjaGVkLiAqLworICAgIGlmICgocXRhYmxlID0gY29tcHB0ci0+cXVhbnRfdGFibGUpID09IE5VTEwpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogVmVyaWZ5IERDICYgZmlyc3QgNSBBQyBxdWFudGl6ZXJzIGFyZSBub256ZXJvIHRvIGF2b2lkIHplcm8tZGl2aWRlLiAqLworICAgIGlmIChxdGFibGUtPnF1YW50dmFsWzBdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EwMV9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1ExMF9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EyMF9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1ExMV9QT1NdID09IDAgfHwKKwlxdGFibGUtPnF1YW50dmFsW1EwMl9QT1NdID09IDApCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgLyogREMgdmFsdWVzIG11c3QgYmUgYXQgbGVhc3QgcGFydGx5IGtub3duIGZvciBhbGwgY29tcG9uZW50cy4gKi8KKyAgICBjb2VmX2JpdHMgPSBjaW5mby0+Y29lZl9iaXRzW2NpXTsKKyAgICBpZiAoY29lZl9iaXRzWzBdIDwgMCkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAvKiBCbG9jayBzbW9vdGhpbmcgaXMgaGVscGZ1bCBpZiBzb21lIEFDIGNvZWZmaWNpZW50cyByZW1haW4gaW5hY2N1cmF0ZS4gKi8KKyAgICBmb3IgKGNvZWZpID0gMTsgY29lZmkgPD0gNTsgY29lZmkrKykgeworICAgICAgY29lZl9iaXRzX2xhdGNoW2NvZWZpXSA9IGNvZWZfYml0c1tjb2VmaV07CisgICAgICBpZiAoY29lZl9iaXRzW2NvZWZpXSAhPSAwKQorCXNtb290aGluZ191c2VmdWwgPSBUUlVFOworICAgIH0KKyAgICBjb2VmX2JpdHNfbGF0Y2ggKz0gU0FWRURfQ09FRlM7CisgIH0KKworICByZXR1cm4gc21vb3RoaW5nX3VzZWZ1bDsKK30KKworCisvKgorICogVmFyaWFudCBvZiBkZWNvbXByZXNzX2RhdGEgZm9yIHVzZSB3aGVuIGRvaW5nIGJsb2NrIHNtb290aGluZy4KKyAqLworCitNRVRIT0RERUYoaW50KQorZGVjb21wcmVzc19zbW9vdGhfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKQoreworICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKKyAgSkRJTUVOU0lPTiBsYXN0X2lNQ1Vfcm93ID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAtIDE7CisgIEpESU1FTlNJT04gYmxvY2tfbnVtLCBsYXN0X2Jsb2NrX2NvbHVtbjsKKyAgaW50IGNpLCBibG9ja19yb3csIGJsb2NrX3Jvd3MsIGFjY2Vzc19yb3dzOworICBKQkxPQ0tBUlJBWSBidWZmZXI7CisgIEpCTE9DS1JPVyBidWZmZXJfcHRyLCBwcmV2X2Jsb2NrX3JvdywgbmV4dF9ibG9ja19yb3c7CisgIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKKyAgSkRJTUVOU0lPTiBvdXRwdXRfY29sOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOworICBib29sZWFuIGZpcnN0X3JvdywgbGFzdF9yb3c7CisgIEpCTE9DSyB3b3Jrc3BhY2U7CisgIGludCAqY29lZl9iaXRzOworICBKUVVBTlRfVEJMICpxdWFudHRibDsKKyAgSU5UMzIgUTAwLFEwMSxRMDIsUTEwLFExMSxRMjAsIG51bTsKKyAgaW50IERDMSxEQzIsREMzLERDNCxEQzUsREM2LERDNyxEQzgsREM5OworICBpbnQgQWwsIHByZWQ7CisKKyAgLyogRm9yY2Ugc29tZSBpbnB1dCB0byBiZSBkb25lIGlmIHdlIGFyZSBnZXR0aW5nIGFoZWFkIG9mIHRoZSBpbnB1dC4gKi8KKyAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCisJICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgeworICAgIGlmIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlcikgeworICAgICAgLyogSWYgaW5wdXQgaXMgd29ya2luZyBvbiBjdXJyZW50IHNjYW4sIHdlIG9yZGluYXJpbHkgd2FudCBpdCB0bworICAgICAgICogaGF2ZSBjb21wbGV0ZWQgdGhlIGN1cnJlbnQgcm93LiAgQnV0IGlmIGlucHV0IHNjYW4gaXMgREMsCisgICAgICAgKiB3ZSB3YW50IGl0IHRvIGtlZXAgb25lIHJvdyBhaGVhZCBzbyB0aGF0IG5leHQgYmxvY2sgcm93J3MgREMKKyAgICAgICAqIHZhbHVlcyBhcmUgdXAgdG8gZGF0ZS4KKyAgICAgICAqLworICAgICAgSkRJTUVOU0lPTiBkZWx0YSA9IChjaW5mby0+U3MgPT0gMCkgPyAxIDogMDsKKyAgICAgIGlmIChjaW5mby0+aW5wdXRfaU1DVV9yb3cgPiBjaW5mby0+b3V0cHV0X2lNQ1Vfcm93K2RlbHRhKQorCWJyZWFrOworICAgIH0KKyAgICBpZiAoKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgfQorCisgIC8qIE9LLCBvdXRwdXQgZnJvbSB0aGUgdmlydHVhbCBhcnJheXMuICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogRG9uJ3QgYm90aGVyIHRvIElEQ1QgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCisgICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkKKyAgICAgIGNvbnRpbnVlOworICAgIC8qIENvdW50IG5vbi1kdW1teSBEQ1QgYmxvY2sgcm93cyBpbiB0aGlzIGlNQ1Ugcm93LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IDwgbGFzdF9pTUNVX3JvdykgeworICAgICAgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBhY2Nlc3Nfcm93cyA9IGJsb2NrX3Jvd3MgKiAyOyAvKiB0aGlzIGFuZCBuZXh0IGlNQ1Ugcm93ICovCisgICAgICBsYXN0X3JvdyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAvKiBOQjogY2FuJ3QgdXNlIGxhc3Rfcm93X2hlaWdodCBoZXJlOyBpdCBpcyBpbnB1dC1zaWRlLWRlcGVuZGVudCEgKi8KKyAgICAgIGJsb2NrX3Jvd3MgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOworICAgICAgaWYgKGJsb2NrX3Jvd3MgPT0gMCkgYmxvY2tfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgICBhY2Nlc3Nfcm93cyA9IGJsb2NrX3Jvd3M7IC8qIHRoaXMgaU1DVSByb3cgb25seSAqLworICAgICAgbGFzdF9yb3cgPSBUUlVFOworICAgIH0KKyAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLworICAgIGlmIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93ID4gMCkgeworICAgICAgYWNjZXNzX3Jvd3MgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsgLyogcHJpb3IgaU1DVSByb3cgdG9vICovCisgICAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKwkgKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgLSAxKSAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cywgRkFMU0UpOworICAgICAgYnVmZmVyICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CS8qIHBvaW50IHRvIGN1cnJlbnQgaU1DVSByb3cgKi8KKyAgICAgIGZpcnN0X3JvdyA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIGNvZWYtPndob2xlX2ltYWdlW2NpXSwKKwkgKEpESU1FTlNJT04pIDAsIChKRElNRU5TSU9OKSBhY2Nlc3Nfcm93cywgRkFMU0UpOworICAgICAgZmlyc3Rfcm93ID0gVFJVRTsKKyAgICB9CisgICAgLyogRmV0Y2ggY29tcG9uZW50LWRlcGVuZGVudCBpbmZvICovCisgICAgY29lZl9iaXRzID0gY29lZi0+Y29lZl9iaXRzX2xhdGNoICsgKGNpICogU0FWRURfQ09FRlMpOworICAgIHF1YW50dGJsID0gY29tcHB0ci0+cXVhbnRfdGFibGU7CisgICAgUTAwID0gcXVhbnR0YmwtPnF1YW50dmFsWzBdOworICAgIFEwMSA9IHF1YW50dGJsLT5xdWFudHZhbFtRMDFfUE9TXTsKKyAgICBRMTAgPSBxdWFudHRibC0+cXVhbnR2YWxbUTEwX1BPU107CisgICAgUTIwID0gcXVhbnR0YmwtPnF1YW50dmFsW1EyMF9QT1NdOworICAgIFExMSA9IHF1YW50dGJsLT5xdWFudHZhbFtRMTFfUE9TXTsKKyAgICBRMDIgPSBxdWFudHRibC0+cXVhbnR2YWxbUTAyX1BPU107CisgICAgaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY2ldOworICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NpXTsKKyAgICAvKiBMb29wIG92ZXIgYWxsIERDVCBibG9ja3MgdG8gYmUgcHJvY2Vzc2VkLiAqLworICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKKyAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbYmxvY2tfcm93XTsKKyAgICAgIGlmIChmaXJzdF9yb3cgJiYgYmxvY2tfcm93ID09IDApCisJcHJldl9ibG9ja19yb3cgPSBidWZmZXJfcHRyOworICAgICAgZWxzZQorCXByZXZfYmxvY2tfcm93ID0gYnVmZmVyW2Jsb2NrX3Jvdy0xXTsKKyAgICAgIGlmIChsYXN0X3JvdyAmJiBibG9ja19yb3cgPT0gYmxvY2tfcm93cy0xKQorCW5leHRfYmxvY2tfcm93ID0gYnVmZmVyX3B0cjsKKyAgICAgIGVsc2UKKwluZXh0X2Jsb2NrX3JvdyA9IGJ1ZmZlcltibG9ja19yb3crMV07CisgICAgICAvKiBXZSBmZXRjaCB0aGUgc3Vycm91bmRpbmcgREMgdmFsdWVzIHVzaW5nIGEgc2xpZGluZy1yZWdpc3RlciBhcHByb2FjaC4KKyAgICAgICAqIEluaXRpYWxpemUgYWxsIG5pbmUgaGVyZSBzbyBhcyB0byBkbyB0aGUgcmlnaHQgdGhpbmcgb24gbmFycm93IHBpY3MuCisgICAgICAgKi8KKyAgICAgIERDMSA9IERDMiA9IERDMyA9IChpbnQpIHByZXZfYmxvY2tfcm93WzBdWzBdOworICAgICAgREM0ID0gREM1ID0gREM2ID0gKGludCkgYnVmZmVyX3B0clswXVswXTsKKyAgICAgIERDNyA9IERDOCA9IERDOSA9IChpbnQpIG5leHRfYmxvY2tfcm93WzBdWzBdOworICAgICAgb3V0cHV0X2NvbCA9IDA7CisgICAgICBsYXN0X2Jsb2NrX2NvbHVtbiA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAtIDE7CisgICAgICBmb3IgKGJsb2NrX251bSA9IDA7IGJsb2NrX251bSA8PSBsYXN0X2Jsb2NrX2NvbHVtbjsgYmxvY2tfbnVtKyspIHsKKwkvKiBGZXRjaCBjdXJyZW50IERDVCBibG9jayBpbnRvIHdvcmtzcGFjZSBzbyB3ZSBjYW4gbW9kaWZ5IGl0LiAqLworCWpjb3B5X2Jsb2NrX3JvdyhidWZmZXJfcHRyLCAoSkJMT0NLUk9XKSB3b3Jrc3BhY2UsIChKRElNRU5TSU9OKSAxKTsKKwkvKiBVcGRhdGUgREMgdmFsdWVzICovCisJaWYgKGJsb2NrX251bSA8IGxhc3RfYmxvY2tfY29sdW1uKSB7CisJICBEQzMgPSAoaW50KSBwcmV2X2Jsb2NrX3Jvd1sxXVswXTsKKwkgIERDNiA9IChpbnQpIGJ1ZmZlcl9wdHJbMV1bMF07CisJICBEQzkgPSAoaW50KSBuZXh0X2Jsb2NrX3Jvd1sxXVswXTsKKwl9CisJLyogQ29tcHV0ZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgcGVyIEsuOC4KKwkgKiBBbiBlc3RpbWF0ZSBpcyBhcHBsaWVkIG9ubHkgaWYgY29lZmZpY2llbnQgaXMgc3RpbGwgemVybywKKwkgKiBhbmQgaXMgbm90IGtub3duIHRvIGJlIGZ1bGx5IGFjY3VyYXRlLgorCSAqLworCS8qIEFDMDEgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1sxXSkgIT0gMCAmJiB3b3Jrc3BhY2VbMV0gPT0gMCkgeworCSAgbnVtID0gMzYgKiBRMDAgKiAoREM0IC0gREM2KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAxPDw3KSArIG51bSkgLyAoUTAxPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTAxPDw3KSAtIG51bSkgLyAoUTAxPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVsxXSA9IChKQ09FRikgcHJlZDsKKwl9CisJLyogQUMxMCAqLworCWlmICgoQWw9Y29lZl9iaXRzWzJdKSAhPSAwICYmIHdvcmtzcGFjZVs4XSA9PSAwKSB7CisJICBudW0gPSAzNiAqIFEwMCAqIChEQzIgLSBEQzgpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTA8PDcpICsgbnVtKSAvIChRMTA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTA8PDcpIC0gbnVtKSAvIChRMTA8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzhdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzIwICovCisJaWYgKChBbD1jb2VmX2JpdHNbM10pICE9IDAgJiYgd29ya3NwYWNlWzE2XSA9PSAwKSB7CisJICBudW0gPSA5ICogUTAwICogKERDMiArIERDOCAtIDIqREM1KTsKKwkgIGlmIChudW0gPj0gMCkgeworCSAgICBwcmVkID0gKGludCkgKCgoUTIwPDw3KSArIG51bSkgLyAoUTIwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICB9IGVsc2UgeworCSAgICBwcmVkID0gKGludCkgKCgoUTIwPDw3KSAtIG51bSkgLyAoUTIwPDw4KSk7CisJICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQorCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7CisJICAgIHByZWQgPSAtcHJlZDsKKwkgIH0KKwkgIHdvcmtzcGFjZVsxNl0gPSAoSkNPRUYpIHByZWQ7CisJfQorCS8qIEFDMTEgKi8KKwlpZiAoKEFsPWNvZWZfYml0c1s0XSkgIT0gMCAmJiB3b3Jrc3BhY2VbOV0gPT0gMCkgeworCSAgbnVtID0gNSAqIFEwMCAqIChEQzEgLSBEQzMgLSBEQzcgKyBEQzkpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTE8PDcpICsgbnVtKSAvIChRMTE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMTE8PDcpIC0gbnVtKSAvIChRMTE8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzldID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBBQzAyICovCisJaWYgKChBbD1jb2VmX2JpdHNbNV0pICE9IDAgJiYgd29ya3NwYWNlWzJdID09IDApIHsKKwkgIG51bSA9IDkgKiBRMDAgKiAoREM0ICsgREM2IC0gMipEQzUpOworCSAgaWYgKG51bSA+PSAwKSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDI8PDcpICsgbnVtKSAvIChRMDI8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgIH0gZWxzZSB7CisJICAgIHByZWQgPSAoaW50KSAoKChRMDI8PDcpIC0gbnVtKSAvIChRMDI8PDgpKTsKKwkgICAgaWYgKEFsID4gMCAmJiBwcmVkID49ICgxPDxBbCkpCisJICAgICAgcHJlZCA9ICgxPDxBbCktMTsKKwkgICAgcHJlZCA9IC1wcmVkOworCSAgfQorCSAgd29ya3NwYWNlWzJdID0gKEpDT0VGKSBwcmVkOworCX0KKwkvKiBPSywgZG8gdGhlIElEQ1QgKi8KKwkoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsIChKQ09FRlBUUikgd29ya3NwYWNlLAorCQkJb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7CisJLyogQWR2YW5jZSBmb3IgbmV4dCBjb2x1bW4gKi8KKwlEQzEgPSBEQzI7IERDMiA9IERDMzsKKwlEQzQgPSBEQzU7IERDNSA9IERDNjsKKwlEQzcgPSBEQzg7IERDOCA9IERDOTsKKwlidWZmZXJfcHRyKyssIHByZXZfYmxvY2tfcm93KyssIG5leHRfYmxvY2tfcm93Kys7CisJb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7CisgICAgICB9CisgICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKKyAgICB9CisgIH0KKworICBpZiAoKysoY2luZm8tPm91dHB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQorICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7CisgIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOworfQorCisjZW5kaWYgLyogQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfZF9jb2VmX2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikKK3sKKyAgbXlfY29lZl9wdHIgY29lZjsKKworICBjb2VmID0gKG15X2NvZWZfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NvZWZfY29udHJvbGxlcikpOworICBjaW5mby0+Y29lZiA9IChzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqKSBjb2VmOworICBjb2VmLT5wdWIuc3RhcnRfaW5wdXRfcGFzcyA9IHN0YXJ0X2lucHV0X3Bhc3M7CisgIGNvZWYtPnB1Yi5zdGFydF9vdXRwdXRfcGFzcyA9IHN0YXJ0X291dHB1dF9wYXNzOworICBjb2VmLT5wdWIuY29sdW1uX2xlZnRfYm91bmRhcnkgPSAwOworICBjb2VmLT5wdWIuY29sdW1uX3JpZ2h0X2JvdW5kYXJ5ID0gMDsKKyAgY29lZi0+cHViLk1DVV9jb2x1bW5zX3RvX3NraXAgPSAwOworI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKKyAgY29lZi0+Y29lZl9iaXRzX2xhdGNoID0gTlVMTDsKKyNlbmRpZgorCisjaWZkZWYgQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERQorICBpZiAoY2luZm8tPnRpbGVfZGVjb2RlKSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisgICAgICAvKiBBbGxvY2F0ZSBvbmUgaU1DVSByb3cgdmlydHVhbCBhcnJheSwgY29lZi0+d2hvbGVfaW1hZ2VbY2ldLAorICAgICAgICogZm9yIGVhY2ggY29sb3IgY29tcG9uZW50LCBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBoX3NhbXBfZmFjdG9yCisgICAgICAgKiBEQ1QgYmxvY2tzIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbi4KKyAgICAgICAqLworICAgICAgaW50IGNpLCBhY2Nlc3Nfcm93czsKKyAgICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJICAgY2krKywgY29tcHB0cisrKSB7CisgICAgICAgIGFjY2Vzc19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgVFJVRSwKKwkgICAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCAvLyBvbmUgaU1DVSByb3cKKwkgICAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MpOworICAgICAgfQorICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgICAgIGNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X3Byb2dyZXNzaXZlOworICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGNvbnN1bWVfZGF0YV9tdWx0aV9zY2FuOworICAgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gY29lZi0+d2hvbGVfaW1hZ2U7IC8qIGxpbmsgdG8gdmlydHVhbCBhcnJheXMgKi8KKyAgICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX29uZXBhc3M7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLworICAgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICAgIGludCBpOworCisgICAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRF9NQVhfQkxPQ0tTX0lOX01DVTsgaSsrKSB7CisgICAgICAgIGNvZWYtPk1DVV9idWZmZXJbaV0gPSBidWZmZXIgKyBpOworICAgICAgfQorICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgICAgIGNvbnN1bWVfZGF0YV9idWlsZF9odWZmbWFuX2luZGV4X2Jhc2VsaW5lOworICAgICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGR1bW15X2NvbnN1bWVfZGF0YTsKKyAgICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCisgICAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19vbmVwYXNzOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICAgIC8qIEFsbG9jYXRlIGEgZnVsbC1pbWFnZSB2aXJ0dWFsIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudCwgKi8KKyAgICAvKiBwYWRkZWQgdG8gYSBtdWx0aXBsZSBvZiBzYW1wX2ZhY3RvciBEQ1QgYmxvY2tzIGluIGVhY2ggZGlyZWN0aW9uLiAqLworICAgIC8qIE5vdGUgd2UgYXNrIGZvciBhIHByZS16ZXJvZWQgYXJyYXkuICovCisgICAgaW50IGNpLCBhY2Nlc3Nfcm93czsKKyAgICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKwkgY2krKywgY29tcHB0cisrKSB7CisgICAgICBhY2Nlc3Nfcm93cyA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisjaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAorICAgICAgLyogSWYgYmxvY2sgc21vb3RoaW5nIGNvdWxkIGJlIHVzZWQsIG5lZWQgYSBiaWdnZXIgd2luZG93ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisJYWNjZXNzX3Jvd3MgKj0gMzsKKyNlbmRpZgorICAgICAgY29lZi0+d2hvbGVfaW1hZ2VbY2ldID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIFRSVUUsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MpOworICAgIH0KKyAgICBjb2VmLT5wdWIuY29uc3VtZV9kYXRhID0gY29uc3VtZV9kYXRhOworICAgIGNvZWYtPnB1Yi5kZWNvbXByZXNzX2RhdGEgPSBkZWNvbXByZXNzX2RhdGE7CisgICAgY29lZi0+cHViLmNvZWZfYXJyYXlzID0gY29lZi0+d2hvbGVfaW1hZ2U7IC8qIGxpbmsgdG8gdmlydHVhbCBhcnJheXMgKi8KKyNlbHNlCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgLyogV2Ugb25seSBuZWVkIGEgc2luZ2xlLU1DVSBidWZmZXIuICovCisgICAgSkJMT0NLUk9XIGJ1ZmZlcjsKKyAgICBpbnQgaTsKKworICAgIGJ1ZmZlciA9IChKQkxPQ0tST1cpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7CisgICAgZm9yIChpID0gMDsgaSA8IERfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgeworICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7CisgICAgfQorICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBkdW1teV9jb25zdW1lX2RhdGE7CisgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKKyAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRjb2xvci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkY29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDIzNjBjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkY29sb3IuYwpAQCAtMCwwICsxLDg4MSBAQAorLyoKKyAqIGpkY29sb3IuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIG91dHB1dCBjb2xvcnNwYWNlIGNvbnZlcnNpb24gcm91dGluZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUHJpdmF0ZSBzdGF0ZSBmb3IgWUNDLT5SR0IgY29udmVyc2lvbiAqLworICBpbnQgKiBDcl9yX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBSIGNvbnZlcnNpb24gKi8KKyAgaW50ICogQ2JfYl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gQiBjb252ZXJzaW9uICovCisgIElOVDMyICogQ3JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gRyBjb252ZXJzaW9uICovCisgIElOVDMyICogQ2JfZ190YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ2IgdG8gRyBjb252ZXJzaW9uICovCit9IG15X2NvbG9yX2RlY29udmVydGVyOworCit0eXBlZGVmIG15X2NvbG9yX2RlY29udmVydGVyICogbXlfY2NvbnZlcnRfcHRyOworCisKKyNpZmRlZiBBTkRST0lEX1JHQgorCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICogCisgKiBXZSB1c2UgNHg0IG9yZGVyZWQgZGl0aGVyIGFycmF5IHBhY2tlZCBpbnRvIDMyIGJpdHMuIFRoaXMgYXJyYXkgaXMKKyAqIHN1ZmZpY2VudCBmb3IgZGl0aGVyaW5nIFJHQl84ODggdG8gUkdCXzU2NS4KKyAqLworCisjZGVmaW5lIERJVEhFUl9NQVNLICAgICAgICAgMHgzCisjZGVmaW5lIERJVEhFUl9ST1RBVEUoeCkgICAgKCgoeCk8PDI0KSB8ICgoKHgpPj44KSYweDAwRkZGRkZGKSkKK3N0YXRpYyBjb25zdCBJTlQzMiBkaXRoZXJfbWF0cml4WzRdID0geworICAweDAwMDgwMjBBLAorICAweDBDMDQwRTA2LAorICAweDAzMEIwMTA5LAorICAweDBGMDcwRDA1Cit9OworCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKiBZQ2JDciAtPiBSR0IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KKworLyoKKyAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKKyAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCisgKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQorICoJUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKKyAqCUcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCisgKglCID0gWSArIDEuNzcyMDAgKiBDYgorICogd2hlcmUgQ2IgYW5kIENyIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgdmFsdWVzIGxlc3MgQ0VOVEVSSlNBTVBMRS4KKyAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKKyAqCisgKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCisgKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKKyAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgorICogTm90aWNlIHRoYXQgWSwgYmVpbmcgYW4gaW50ZWdyYWwgaW5wdXQsIGRvZXMgbm90IGNvbnRyaWJ1dGUgYW55IGZyYWN0aW9uCisgKiBzbyBpdCBuZWVkIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgcm91bmRpbmcuCisgKgorICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAorICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBDYiBhbmQgQ3IgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCisgKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKKyAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgorICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKKyAqIGNvbG9yc3BhY2UgYW55d2F5LgorICogVGhlIENyPT5SIGFuZCBDYj0+QiB2YWx1ZXMgY2FuIGJlIHJvdW5kZWQgdG8gaW50ZWdlcnMgaW4gYWR2YW5jZTsgdGhlCisgKiB2YWx1ZXMgZm9yIHRoZSBHIGNhbGN1bGF0aW9uIGFyZSBsZWZ0IHNjYWxlZCB1cCwgc2luY2Ugd2UgbXVzdCBhZGQgdGhlbQorICogdG9nZXRoZXIgYmVmb3JlIHJvdW5kaW5nLgorICovCisKKyNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCisjZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKKyNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKKworCisvKgorICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKyAqLworCitMT0NBTCh2b2lkKQorYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICBpbnQgaTsKKyAgSU5UMzIgeDsKKyAgU0hJRlRfVEVNUFMKKworICBjY29udmVydC0+Q3Jfcl90YWIgPSAoaW50ICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIGNjb252ZXJ0LT5DYl9iX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKKyAgY2NvbnZlcnQtPkNyX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKyAgY2NvbnZlcnQtPkNiX2dfdGFiID0gKElOVDMyICopCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKworICBmb3IgKGkgPSAwLCB4ID0gLUNFTlRFUkpTQU1QTEU7IGkgPD0gTUFYSlNBTVBMRTsgaSsrLCB4KyspIHsKKyAgICAvKiBpIGlzIHRoZSBhY3R1YWwgaW5wdXQgcGl4ZWwgdmFsdWUsIGluIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFICovCisgICAgLyogVGhlIENiIG9yIENyIHZhbHVlIHdlIGFyZSB0aGlua2luZyBvZiBpcyB4ID0gaSAtIENFTlRFUkpTQU1QTEUgKi8KKyAgICAvKiBDcj0+UiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjQwMjAwICogeCAqLworICAgIGNjb252ZXJ0LT5Dcl9yX3RhYltpXSA9IChpbnQpCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLworICAgIGNjb252ZXJ0LT5DYl9iX3RhYltpXSA9IChpbnQpCisgICAgICAgICAgICAgICAgICAgIFJJR0hUX1NISUZUKEZJWCgxLjc3MjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKKyAgICAvKiBDcj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuNzE0MTQgKiB4ICovCisgICAgY2NvbnZlcnQtPkNyX2dfdGFiW2ldID0gKC0gRklYKDAuNzE0MTQpKSAqIHg7CisgICAgLyogQ2I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjM0NDE0ICogeCAqLworICAgIC8qIFdlIGFsc28gYWRkIGluIE9ORV9IQUxGIHNvIHRoYXQgbmVlZCBub3QgZG8gaXQgaW4gaW5uZXIgbG9vcCAqLworICAgIGNjb252ZXJ0LT5DYl9nX3RhYltpXSA9ICgtIEZJWCgwLjM0NDE0KSkgKiB4ICsgT05FX0hBTEY7CisgIH0KK30KKworLyoKKyAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0CisgKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKKyAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KKyAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgorICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKKyAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOworICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7CisgICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KKyAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0FMRUJJVFMpKV07CisgICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOworICAgIH0KKyAgfQorfQorCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKKyAgcmVnaXN0ZXIgaW50IHksIGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgcmVnaXN0ZXIgaW50ICogQ3JydGFiID0gY2NvbnZlcnQtPkNyX3JfdGFiOworICByZWdpc3RlciBpbnQgKiBDYmJ0YWIgPSBjY29udmVydC0+Q2JfYl90YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ3JndGFiID0gY2NvbnZlcnQtPkNyX2dfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENiZ3RhYiA9IGNjb252ZXJ0LT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgeSAgPSBHRVRKU0FNUExFKGlucHRyMFtjb2xdKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRShpbnB0cjFbY29sXSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoaW5wdHIyW2NvbF0pOworICAgICAgLyogUmFuZ2UtbGltaXRpbmcgaXMgZXNzZW50aWFsIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IERDVCBsb3NzZXMuICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSldOworICAgICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICBvdXRwdHJbUkdCX0FMUEhBXSA9ICAweEZGOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7CisgIHJlZ2lzdGVyIGludCB5LCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIAorICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBDcnJ0YWJbY3JdXTsKKyAgICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFt5ICsgQ3JydGFiW2NyXV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbeSArICgoaW50KVJJR0hUX1NISUZUKENiZ3RhYltjYl0rQ3JndGFiW2NyXSwgU0NBTEVCSVRTKSldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKKyAgICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICAgIGlmIChudW1fY29scyYxKSB7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgICByID0gcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOworICAgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFt5ICsgQ2JidGFiW2NiXV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQoreWNjX3JnYl81NjVEX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7CisgIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7CisgIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKyAgU0hJRlRfVEVNUFMKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCByLCBnLCBiOworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgaWYgKFBBQ0tfTkVFRF9BTElHTk1FTlQob3V0cHRyKSkgeworICAgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBDYmJ0YWJbY2JdLCBkMCldOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICAgICAgb3V0cHRyICs9IDI7CisgICAgICAgIG51bV9jb2xzLS07CisgICAgfQorICAgIGZvciAoY29sID0gMDsgY29sIDwgKG51bV9jb2xzPj4xKTsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBDcnJ0YWJbY3JdLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgKChpbnQpUklHSFRfU0hJRlQoQ2JndGFiW2NiXStDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIENiYnRhYltjYl0sIGQwKV07CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICAgIFdSSVRFX1RXT19BTElHTkVEX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgICAgaWYgKG51bV9jb2xzJjEpIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKTsKKyAgICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIENycnRhYltjcl0sIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyAoKGludClSSUdIVF9TSElGVChDYmd0YWJbY2JdK0NyZ3RhYltjcl0sIFNDQUxFQklUUykpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgQ2JidGFiW2NiXSwgZDApXTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgICB9CisgIH0KK30KKworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gWUNiQ3IgLT4gUkdCKEEpICoqKioqKioqKioqKioqLworCisjaWZkZWYgQU5EUk9JRF9SR0IKK01FVEhPRERFRih2b2lkKQorcmdiX3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGlucHRyMjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIwKys7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIxKys7CisgICAgICAqb3V0cHRyKysgPSAqaW5wdHIyKys7CisgICAgICAqb3V0cHRyKysgPSAweEZGOworICAgIH0KKyAgfQorfQorCitNRVRIT0RERUYodm9pZCkKK3JnYl9yZ2JfNTY1X2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIElOVDMyIHJnYjsKKyAgICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKKyAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKKyAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKKyAgICBpbnB1dF9yb3crKzsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKTsKKyAgICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgICAgYiA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShyLGcsYik7CisgICAgICByID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgICAgZyA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgciA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgICBnID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICAgIGIgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQorcmdiX3JnYl81NjVEX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOworICBTSElGVF9URU1QUworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBJTlQzMiByZ2I7CisgICAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgICAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2lucHV0X3Jvd107CisgICAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2lucHV0X3Jvd107CisgICAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2lucHV0X3Jvd107CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBpZiAoUEFDS19ORUVEX0FMSUdOTUVOVChvdXRwdHIpKSB7CisgICAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSsrKSwgZDApXTsKKyAgICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIrKyksIGQwKV07CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjArKyksIGQwKV07CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKEdFVEpTQU1QTEUoKmlucHRyMSsrKSwgZDApXTsKKyAgICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoR0VUSlNBTVBMRSgqaW5wdHIyKyspLCBkMCldOworICAgICAgZDAgPSBESVRIRVJfUk9UQVRFKGQwKTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoR0VUSlNBTVBMRSgqaW5wdHIwKyspLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjErKyksIGQwKV07CisgICAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKEdFVEpTQU1QTEUoKmlucHRyMisrKSwgZDApXTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUihHRVRKU0FNUExFKCppbnB0cjApLCBkMCldOworICAgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyhHRVRKU0FNUExFKCppbnB0cjEpLCBkMCldOworICAgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQihHRVRKU0FNUExFKCppbnB0cjIpLCBkMCldOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorCisjZW5kaWYKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIG5vIGNvbG9yc3BhY2UgY2hhbmdlOiBqdXN0IGNvcHkgdGhlIGRhdGEsCisgKiBjb252ZXJ0aW5nIGZyb20gc2VwYXJhdGUtcGxhbmVzIHRvIGludGVybGVhdmVkIHJlcHJlc2VudGF0aW9uLgorICovCisKK01FVEhPRERFRih2b2lkKQorbnVsbF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKwkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb3VudDsKKyAgcmVnaXN0ZXIgaW50IG51bV9jb21wb25lbnRzID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKyAgaW50IGNpOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBudW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgaW5wdHIgPSBpbnB1dF9idWZbY2ldW2lucHV0X3Jvd107CisgICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmWzBdICsgY2k7CisgICAgICBmb3IgKGNvdW50ID0gbnVtX2NvbHM7IGNvdW50ID4gMDsgY291bnQtLSkgeworCSpvdXRwdHIgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLworCW91dHB0ciArPSBudW1fY29tcG9uZW50czsKKyAgICAgIH0KKyAgICB9CisgICAgaW5wdXRfcm93Kys7CisgICAgb3V0cHV0X2J1ZisrOworICB9Cit9CisKKworLyoKKyAqIENvbG9yIGNvbnZlcnNpb24gZm9yIGdyYXlzY2FsZToganVzdCBjb3B5IHRoZSBkYXRhLgorICogVGhpcyBhbHNvIHdvcmtzIGZvciBZQ2JDciAtPiBncmF5c2NhbGUgY29udmVyc2lvbiwgaW4gd2hpY2gKKyAqIHdlIGp1c3QgY29weSB0aGUgWSAobHVtaW5hbmNlKSBjb21wb25lbnQgYW5kIGlnbm9yZSBjaHJvbWluYW5jZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2dyYXlzY2FsZV9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQoreworICBqY29weV9zYW1wbGVfcm93cyhpbnB1dF9idWZbMF0sIChpbnQpIGlucHV0X3Jvdywgb3V0cHV0X2J1ZiwgMCwKKwkJICAgIG51bV9yb3dzLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKK30KKworCisvKgorICogQ29udmVydCBncmF5c2NhbGUgdG8gUkdCOiBqdXN0IGR1cGxpY2F0ZSB0aGUgZ3JheWxldmVsIHRocmVlIHRpbWVzLgorICogVGhpcyBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgdG8gY29wZQorICogd2l0aCBncmF5c2NhbGUgYXMgYSBzZXBhcmF0ZSBjYXNlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgaW5wdHIgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93KytdOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIC8qIFdlIGNhbiBkaXNwZW5zZSB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICBvdXRwdHJbUkdCX1JFRF0gPSBvdXRwdHJbUkdCX0dSRUVOXSA9IG91dHB0cltSR0JfQkxVRV0gPSBpbnB0cltjb2xdOworICAgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgfQorICB9Cit9CisKKyNpZmRlZiBBTkRST0lEX1JHQgorTUVUSE9EREVGKHZvaWQpCitncmF5X3JnYmFfODg4OF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworCisgIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKKyAgICBpbnB0ciA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3crK107CisgICAgb3V0cHRyID0gKm91dHB1dF9idWYrKzsKKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG51bV9jb2xzOyBjb2wrKykgeworICAgICAgLyogV2UgY2FuIGRpc3BlbnNlIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIG91dHB0cltSR0JfUkVEXSA9IG91dHB0cltSR0JfR1JFRU5dID0gb3V0cHRyW1JHQl9CTFVFXSA9IGlucHRyW2NvbF07CisgICAgICBvdXRwdHJbUkdCX0FMUEhBXSA9IDB4ZmY7CisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgIH0KK30KKworTUVUSE9EREVGKHZvaWQpCitncmF5X3JnYl81NjVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCBnOworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgZyA9ICppbnB0cisrOworICAgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgICAgICBvdXRwdHIgKz0gMjsKKyAgICAgICAgbnVtX2NvbHMtLTsKKyAgICB9CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCAobnVtX2NvbHM+PjEpOyBjb2wrKykgeworICAgICAgZyA9ICppbnB0cisrOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKSk7CisgICAgICBXUklURV9UV09fQUxJR05FRF9QSVhFTFMob3V0cHRyLCByZ2IpOworICAgICAgb3V0cHRyICs9IDQ7CisgICAgfQorICAgIGlmIChudW1fY29scyYxKSB7CisgICAgICBnID0gKmlucHRyOworICAgICAgcmdiID0gUEFDS19TSE9SVF81NjUoZywgZywgZyk7CisgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgfQorICB9Cit9CisKK01FVEhPRERFRih2b2lkKQorZ3JheV9yZ2JfNTY1RF9jb252ZXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKKyAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICBJTlQzMiBkMCA9IGRpdGhlcl9tYXRyaXhbY2luZm8tPm91dHB1dF9zY2FubGluZSAmIERJVEhFUl9NQVNLXTsKKworICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7CisgICAgSU5UMzIgcmdiOworICAgIHVuc2lnbmVkIGludCBnOworICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKKyAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOworICAgIGlmIChQQUNLX05FRURfQUxJR05NRU5UKG91dHB0cikpIHsKKyAgICAgICAgZyA9ICppbnB0cisrOworICAgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgICAgICAgIG91dHB0ciArPSAyOworICAgICAgICBudW1fY29scy0tOworICAgIH0KKyAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IChudW1fY29scz4+MSk7IGNvbCsrKSB7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKTsKKyAgICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgICBnID0gKmlucHRyKys7CisgICAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKGcsIGQwKV07CisgICAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShnLCBnLCBnKSk7CisgICAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgICAgV1JJVEVfVFdPX0FMSUdORURfUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICAgIG91dHB0ciArPSA0OworICAgIH0KKyAgICBpZiAobnVtX2NvbHMmMSkgeworICAgICAgZyA9ICppbnB0cjsKKyAgICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoZywgZDApXTsKKyAgICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KGcsIGcsIGcpOworICAgICAgKihJTlQxNiopb3V0cHRyID0gcmdiOworICAgIH0KKyAgfQorfQorI2VuZGlmCisKKy8qCisgKiBBZG9iZS1zdHlsZSBZQ0NLLT5DTVlLIGNvbnZlcnNpb24uCisgKiBXZSBjb252ZXJ0IFlDYkNyIHRvIFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHVzaW5nIHRoZSBzYW1lCisgKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCisgKiBXZSBhc3N1bWUgYnVpbGRfeWNjX3JnYl90YWJsZSBoYXMgYmVlbiBjYWxsZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCit5Y2NrX2NteWtfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKK3sKKyAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OworICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjIsIGlucHRyMzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKKyAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOworICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKKyAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgeworICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOworICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOworICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOworICAgIGlucHRyMyA9IGlucHV0X2J1ZlszXVtpbnB1dF9yb3ddOworICAgIGlucHV0X3JvdysrOworICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7CisgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKKyAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7CisgICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOworICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKKyAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLworICAgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ3JydGFiW2NyXSldOyAgIC8qIHJlZCAqLworICAgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgICAgICAgICAgICAgICAgIC8qIGdyZWVuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBTEVCSVRTKSkpXTsKKyAgICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArIENiYnRhYltjYl0pXTsgICAvKiBibHVlICovCisgICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCAqLworICAgICAgb3V0cHRyWzNdID0gaW5wdHIzW2NvbF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCisgICAgICBvdXRwdHIgKz0gNDsKKyAgICB9CisgIH0KK30KKworCisvKgorICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19kY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgbmVlZGVkICovCit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfY29sb3JfZGVjb252ZXJ0ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKKyAgaW50IGNpOworCisgIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jb2xvcl9kZWNvbnZlcnRlcikpOworICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKikgY2NvbnZlcnQ7CisgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZGNvbG9yOworCisgIC8qIE1ha2Ugc3VyZSBudW1fY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBqcGVnX2NvbG9yX3NwYWNlICovCisgIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgY2FzZSBKQ1NfR1JBWVNDQUxFOgorICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCOgorICBjYXNlIEpDU19ZQ2JDcjoKKyAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX0NNWUs6CisgIGNhc2UgSkNTX1lDQ0s6CisgICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLworICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIFNldCBvdXRfY29sb3JfY29tcG9uZW50cyBhbmQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlLgorICAgKiBBbHNvIGNsZWFyIHRoZSBjb21wb25lbnRfbmVlZGVkIGZsYWdzIGZvciBhbnkgdW51c2VkIGNvbXBvbmVudHMsCisgICAqIHNvIHRoYXQgZWFybGllciBwaXBlbGluZSBzdGFnZXMgY2FuIGF2b2lkIHVzZWxlc3MgY29tcHV0YXRpb24uCisgICAqLworCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSB8fAorCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7CisgICAgICAvKiBGb3IgY29sb3ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCBvbmx5IHRoZSBZICgwKSBjb21wb25lbnQgaXMgbmVlZGVkICovCisgICAgICBmb3IgKGNpID0gMTsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspCisJY2luZm8tPmNvbXBfaW5mb1tjaV0uY29tcG9uZW50X25lZWRlZCA9IEZBTFNFOworICAgIH0gZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIGJyZWFrOworCisgIGNhc2UgSkNTX1JHQjoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfY29udmVydDsKKyAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfY29udmVydDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyNpZmRlZiBBTkRST0lEX1JHQgorICBjYXNlIEpDU19SR0JBXzg4ODg6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiYV84ODg4X2NvbnZlcnQ7CisgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiYV84ODg4X2NvbnZlcnQ7CisgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfcmdiYV84ODg4X2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgY2FzZSBKQ1NfUkdCXzU2NToKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOworICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9OT05FKSB7CisgICAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfNTY1X2NvbnZlcnQ7CisgICAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOworICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlfcmdiXzU2NV9jb252ZXJ0OworICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9yZ2JfNTY1X2NvbnZlcnQ7CisgICAgICB9IGVsc2UKKyAgICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBvbmx5IG9yZGVyZWQgZGl0aGVyIGlzIHN1cHBvcnRlZCAqLworICAgICAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgeworICAgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSB5Y2NfcmdiXzU2NURfY29udmVydDsKKyAgICAgICAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7CisgICAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfNTY1RF9jb252ZXJ0OworICAgICAgfSBlbHNlIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7CisgICAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHJnYl9yZ2JfNTY1RF9jb252ZXJ0OworICAgICAgfSBlbHNlCisgICAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICB9CisgICAgYnJlYWs7CisjZW5kaWYKKyAgICAKKyAgY2FzZSBKQ1NfQ01ZSzoKKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykgeworICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNja19jbXlrX2NvbnZlcnQ7CisgICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSB7CisgICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBQZXJtaXQgbnVsbCBjb252ZXJzaW9uIHRvIHNhbWUgb3V0cHV0IHNwYWNlICovCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKKyAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKKyAgICB9IGVsc2UJCQkvKiB1bnN1cHBvcnRlZCBub24tbnVsbCBjb252ZXJzaW9uICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKyAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAxOyAvKiBzaW5nbGUgY29sb3JtYXBwZWQgb3V0cHV0IGNvbXBvbmVudCAqLworICBlbHNlCisgICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkY3QuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGN0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBqZGN0LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZAorICogaW52ZXJzZSBEQ1QgbW9kdWxlcy4gIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgcHJpdmF0ZSB0byB0aGUgRENUIG1hbmFnZXJzCisgKiAoamNkY3RtZ3IuYywgamRkY3RtZ3IuYykgYW5kIHRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zLgorICogVGhlIGluZGl2aWR1YWwgRENUIGFsZ29yaXRobXMgYXJlIGtlcHQgaW4gc2VwYXJhdGUgZmlsZXMgdG8gZWFzZSAKKyAqIG1hY2hpbmUtZGVwZW5kZW50IHR1bmluZyAoZS5nLiwgYXNzZW1ibHkgY29kaW5nKS4KKyAqLworCisKKy8qCisgKiBBIGZvcndhcmQgRENUIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIGEgd29yayBhcmVhIG9mIHR5cGUgRENURUxFTVtdOworICogdGhlIERDVCBpcyB0byBiZSBwZXJmb3JtZWQgaW4tcGxhY2UgaW4gdGhhdCBidWZmZXIuICBUeXBlIERDVEVMRU0gaXMgaW50CisgKiBmb3IgOC1iaXQgc2FtcGxlcywgSU5UMzIgZm9yIDEyLWJpdCBzYW1wbGVzLiAgKE5PVEU6IEZsb2F0aW5nLXBvaW50IERDVAorICogaW1wbGVtZW50YXRpb25zIHVzZSBhbiBhcnJheSBvZiB0eXBlIEZBU1RfRkxPQVQsIGluc3RlYWQuKQorICogVGhlIERDVCBpbnB1dHMgYXJlIGV4cGVjdGVkIHRvIGJlIHNpZ25lZCAocmFuZ2UgKy1DRU5URVJKU0FNUExFKS4KKyAqIFRoZSBEQ1Qgb3V0cHV0cyBhcmUgcmV0dXJuZWQgc2NhbGVkIHVwIGJ5IGEgZmFjdG9yIG9mIDg7IHRoZXkgdGhlcmVmb3JlCisgKiBoYXZlIGEgcmFuZ2Ugb2YgKy04SyBmb3IgOC1iaXQgZGF0YSwgKy0xMjhLIGZvciAxMi1iaXQgZGF0YS4gIFRoaXMKKyAqIGNvbnZlbnRpb24gaW1wcm92ZXMgYWNjdXJhY3kgaW4gaW50ZWdlciBpbXBsZW1lbnRhdGlvbnMgYW5kIHNhdmVzIHNvbWUKKyAqIHdvcmsgaW4gZmxvYXRpbmctcG9pbnQgb25lcy4KKyAqIFF1YW50aXphdGlvbiBvZiB0aGUgb3V0cHV0IGNvZWZmaWNpZW50cyBpcyBkb25lIGJ5IGpjZGN0bWdyLmMuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIGludCBEQ1RFTEVNOwkJLyogMTYgb3IgMzIgYml0cyBpcyBmaW5lICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBEQ1RFTEVNOwkJLyogbXVzdCBoYXZlIDMyIGJpdHMgKi8KKyNlbmRpZgorCit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciwgKERDVEVMRU0gKiBkYXRhKSk7Cit0eXBlZGVmIEpNRVRIT0Qodm9pZCwgZmxvYXRfRENUX21ldGhvZF9wdHIsIChGQVNUX0ZMT0FUICogZGF0YSkpOworCisKKy8qCisgKiBBbiBpbnZlcnNlIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byB0aGUgaW5wdXQgSkJMT0NLIGFuZCBhIHBvaW50ZXIKKyAqIHRvIGFuIG91dHB1dCBzYW1wbGUgYXJyYXkuICBUaGUgcm91dGluZSBtdXN0IGRlcXVhbnRpemUgdGhlIGlucHV0IGRhdGEgYXMKKyAqIHdlbGwgYXMgcGVyZm9ybSB0aGUgSURDVDsgZm9yIGRlcXVhbnRpemF0aW9uLCBpdCB1c2VzIHRoZSBtdWx0aXBsaWVyIHRhYmxlCisgKiBwb2ludGVkIHRvIGJ5IGNvbXBwdHItPmRjdF90YWJsZS4gIFRoZSBvdXRwdXQgZGF0YSBpcyB0byBiZSBwbGFjZWQgaW50byB0aGUKKyAqIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBhIHNwZWNpZmllZCBjb2x1bW4uICAoQW55IHJvdyBvZmZzZXQgbmVlZGVkIHdpbGwKKyAqIGJlIGFwcGxpZWQgdG8gdGhlIGFycmF5IHBvaW50ZXIgYmVmb3JlIGl0IGlzIHBhc3NlZCB0byB0aGUgSURDVCBjb2RlLikKKyAqIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZW1pdHRlZCBieSB0aGUgSURDVCByb3V0aW5lIGlzCisgKiBEQ1Rfc2NhbGVkX3NpemUgKiBEQ1Rfc2NhbGVkX3NpemUuCisgKi8KKworLyogdHlwZWRlZiBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGlzIGRlY2xhcmVkIGluIGpwZWdpbnQuaCAqLworCisvKgorICogRWFjaCBJRENUIHJvdXRpbmUgaGFzIGl0cyBvd24gaWRlYXMgYWJvdXQgdGhlIGJlc3QgZGN0X3RhYmxlIGVsZW1lbnQgdHlwZS4KKyAqLworCit0eXBlZGVmIE1VTFRJUExJRVIgSVNMT1dfTVVMVF9UWVBFOyAvKiBzaG9ydCBvciBpbnQsIHdoaWNoZXZlciBpcyBmYXN0ZXIgKi8KKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAordHlwZWRlZiBNVUxUSVBMSUVSIElGQVNUX01VTFRfVFlQRTsgLyogMTYgYml0cyBpcyBPSywgdXNlIHNob3J0IGlmIGZhc3RlciAqLworI2RlZmluZSBJRkFTVF9TQ0FMRV9CSVRTICAyCS8qIGZyYWN0aW9uYWwgYml0cyBpbiBzY2FsZSBmYWN0b3JzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBJRkFTVF9NVUxUX1RZUEU7CS8qIG5lZWQgMzIgYml0cyBmb3Igc2NhbGVkIHF1YW50aXplcnMgKi8KKyNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMTMJLyogZnJhY3Rpb25hbCBiaXRzIGluIHNjYWxlIGZhY3RvcnMgKi8KKyNlbmRpZgordHlwZWRlZiBGQVNUX0ZMT0FUIEZMT0FUX01VTFRfVFlQRTsgLyogcHJlZmVycmVkIGZsb2F0aW5nIHR5cGUgKi8KKworCisvKgorICogRWFjaCBJRENUIHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJhbmdlLWxpbWl0aW5nIGl0cyByZXN1bHRzIGFuZAorICogY29udmVydGluZyB0aGVtIHRvIHVuc2lnbmVkIGZvcm0gKDAuLk1BWEpTQU1QTEUpLiAgVGhlIHJhdyBvdXRwdXRzIGNvdWxkCisgKiBiZSBxdWl0ZSBmYXIgb3V0IG9mIHJhbmdlIGlmIHRoZSBpbnB1dCBkYXRhIGlzIGNvcnJ1cHQsIHNvIGEgYnVsbGV0cHJvb2YKKyAqIHJhbmdlLWxpbWl0aW5nIHN0ZXAgaXMgcmVxdWlyZWQuICBXZSB1c2UgYSBtYXNrLWFuZC10YWJsZS1sb29rdXAgbWV0aG9kCisgKiB0byBkbyB0aGUgY29tYmluZWQgb3BlcmF0aW9ucyBxdWlja2x5LiAgU2VlIHRoZSBjb21tZW50cyB3aXRoCisgKiBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChpbiBqZG1hc3Rlci5jKSBmb3IgbW9yZSBpbmZvLgorICovCisKKyNkZWZpbmUgSURDVF9yYW5nZV9saW1pdChjaW5mbykgICgoY2luZm8pLT5zYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFKQorCisjZGVmaW5lIFJBTkdFX01BU0sgIChNQVhKU0FNUExFICogNCArIDMpIC8qIDIgYml0cyB3aWRlciB0aGFuIGxlZ2FsIHNhbXBsZXMgKi8KKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KKworI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKKyNkZWZpbmUganBlZ19mZGN0X2lzbG93CQlqRkRpc2xvdworI2RlZmluZSBqcGVnX2ZkY3RfaWZhc3QJCWpGRGlmYXN0CisjZGVmaW5lIGpwZWdfZmRjdF9mbG9hdAkJakZEZmxvYXQKKyNkZWZpbmUganBlZ19pZGN0X2lzbG93CQlqUkRpc2xvdworI2RlZmluZSBqcGVnX2lkY3RfaWZhc3QJCWpSRGlmYXN0CisjZGVmaW5lIGpwZWdfaWRjdF9mbG9hdAkJalJEZmxvYXQKKyNkZWZpbmUganBlZ19pZGN0XzR4NAkJalJENHg0CisjZGVmaW5lIGpwZWdfaWRjdF8yeDIJCWpSRDJ4MgorI2RlZmluZSBqcGVnX2lkY3RfMXgxCQlqUkQxeDEKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKy8qIEV4dGVybiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBmb3J3YXJkIGFuZCBpbnZlcnNlIERDVCByb3V0aW5lcy4gKi8KKworRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pc2xvdyBKUFAoKERDVEVMRU0gKiBkYXRhKSk7CitFWFRFUk4odm9pZCkganBlZ19mZGN0X2lmYXN0IEpQUCgoRENURUxFTSAqIGRhdGEpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZkY3RfZmxvYXQgSlBQKChGQVNUX0ZMT0FUICogZGF0YSkpOworCitFWFRFUk4odm9pZCkganBlZ19pZGN0X2lzbG93CisgICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2lkY3RfaWZhc3QKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOworRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9mbG9hdAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzR4NAorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzJ4MgorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CitFWFRFUk4odm9pZCkganBlZ19pZGN0XzF4MQorICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7CisKKworLyoKKyAqIE1hY3JvcyBmb3IgaGFuZGxpbmcgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYzsgdGhlc2UgYXJlIHVzZWQgYnkgbWFueQorICogYnV0IG5vdCBhbGwgb2YgdGhlIERDVC9JRENUIG1vZHVsZXMuCisgKgorICogQWxsIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgb2YgdHlwZSBJTlQzMi4KKyAqIEZyYWN0aW9uYWwgY29uc3RhbnRzIGFyZSBzY2FsZWQgbGVmdCBieSBDT05TVF9CSVRTIGJpdHMuCisgKiBDT05TVF9CSVRTIGlzIGRlZmluZWQgd2l0aGluIGVhY2ggbW9kdWxlIHVzaW5nIHRoZXNlIG1hY3JvcywKKyAqIGFuZCBtYXkgZGlmZmVyIGZyb20gb25lIG1vZHVsZSB0byB0aGUgbmV4dC4KKyAqLworCisjZGVmaW5lIE9ORQkoKElOVDMyKSAxKQorI2RlZmluZSBDT05TVF9TQ0FMRSAoT05FIDw8IENPTlNUX0JJVFMpCisKKy8qIENvbnZlcnQgYSBwb3NpdGl2ZSByZWFsIGNvbnN0YW50IHRvIGFuIGludGVnZXIgc2NhbGVkIGJ5IENPTlNUX1NDQUxFLgorICogQ2F1dGlvbjogc29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLAorICogdGh1cyBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqLworCisjZGVmaW5lIEZJWCh4KQkoKElOVDMyKSAoKHgpICogQ09OU1RfU0NBTEUgKyAwLjUpKQorCisvKiBEZXNjYWxlIGFuZCBjb3JyZWN0bHkgcm91bmQgYW4gSU5UMzIgdmFsdWUgdGhhdCdzIHNjYWxlZCBieSBOIGJpdHMuCisgKiBXZSBhc3N1bWUgUklHSFRfU0hJRlQgcm91bmRzIHRvd2FyZHMgbWludXMgaW5maW5pdHksIHNvIGFkZGluZworICogdGhlIGZ1ZGdlIGZhY3RvciBpcyBjb3JyZWN0IGZvciBlaXRoZXIgc2lnbiBvZiBYLgorICovCisKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCgoeCkgKyAoT05FIDw8ICgobiktMSkpLCBuKQorCisvKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgb25seSB3aGVuIHRoZSB0d28gaW5wdXRzIHdpbGwgYWN0dWFsbHkgYmUgbm8gbW9yZSB0aGFuCisgKiAxNiBiaXRzIHdpZGUsIHNvIHRoYXQgYSAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYQorICogZnVsbCAzMngzMiBtdWx0aXBseS4gIFRoaXMgcHJvdmlkZXMgYSB1c2VmdWwgc3BlZWR1cCBvbiBtYW55IG1hY2hpbmVzLgorICogVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSBhIDE2eDE2LT4zMiBtdWx0aXBseSBwb3J0YWJseQorICogaW4gQywgYnV0IHNvbWUgQyBjb21waWxlcnMgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgeW91IHByb3ZpZGUgdGhlCisgKiBjb3JyZWN0IGNvbWJpbmF0aW9uIG9mIGNhc3RzLgorICovCisKKyNpZmRlZiBTSE9SVHhTSE9SVF8zMgkJLyogbWF5IHdvcmsgaWYgJ2ludCcgaXMgMzIgYml0cyAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDE2KSAoY29uc3QpKSkKKyNlbmRpZgorI2lmZGVmIFNIT1JUeExDT05TVF8zMgkJLyoga25vd24gdG8gd29yayB3aXRoIE1pY3Jvc29mdCBDIDYuMCAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgoKElOVDE2KSAodmFyKSkgKiAoKElOVDMyKSAoY29uc3QpKSkKKyNlbmRpZgorCisjaWZuZGVmIE1VTFRJUExZMTZDMTYJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCisjZW5kaWYKKworLyogU2FtZSBleGNlcHQgYm90aCBpbnB1dHMgYXJlIHZhcmlhYmxlcy4gKi8KKworI2lmZGVmIFNIT1JUeFNIT1JUXzMyCQkvKiBtYXkgd29yayBpZiAnaW50JyBpcyAzMiBiaXRzICovCisjZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCgoSU5UMTYpICh2YXIxKSkgKiAoKElOVDE2KSAodmFyMikpKQorI2VuZGlmCisKKyNpZm5kZWYgTVVMVElQTFkxNlYxNgkJLyogZGVmYXVsdCBkZWZpbml0aW9uICovCisjZGVmaW5lIE1VTFRJUExZMTZWMTYodmFyMSx2YXIyKSAgKCh2YXIxKSAqICh2YXIyKSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkZGN0bWdyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRkY3RtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU1ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkZGN0bWdyLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBqZGRjdG1nci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludmVyc2UtRENUIG1hbmFnZW1lbnQgbG9naWMuCisgKiBUaGlzIGNvZGUgc2VsZWN0cyBhIHBhcnRpY3VsYXIgSURDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAorICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3Jlcy4gIE5vIGNvZGUgaW4gdGhpcyBmaWxlCisgKiBpcyBleGVjdXRlZCBwZXIgSURDVCBzdGVwLCBvbmx5IGR1cmluZyBvdXRwdXQgcGFzcyBzZXR1cC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIElEQ1Qgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNvZWZmaWNpZW50CisgKiBkZXF1YW50aXphdGlvbiBhcyB3ZWxsIGFzIHRoZSBJRENUIHByb3Blci4gIFRoaXMgbW9kdWxlIHNldHMgdXAgdGhlCisgKiBkZXF1YW50aXphdGlvbiBtdWx0aXBsaWVyIHRhYmxlIG5lZWRlZCBieSB0aGUgSURDVCByb3V0aW5lLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCisgICN1bmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKKyAgI2lmZGVmIF9fYXJtX18KKyAgICAjaW5jbHVkZSA8bWFjaGluZS9jcHUtZmVhdHVyZXMuaD4KKyAgICAjaWYgX19BUk1fQVJDSF9fID49IDYKKyAgICAgICNkZWZpbmUgQU5EUk9JRF9BUk1WNl9JRENUCisgICAgI2Vsc2UKKyAgICAgICN3YXJuaW5nICJBTkRST0lEX0FSTVY2X0lEQ1QgaXMgZGlzYWJsZWQiCisgICAgI2VuZGlmCisgICNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKKworLyogSW50ZW50aW9uYWxseSBkZWNsYXJlIHRoZSBwcm90b3R5cGUgd2l0aCBhcmd1bWVudHMgb2YgcHJpbWl0aXZlIHR5cGVzIGluc3RlYWQKKyAqIG9mIHR5cGUtZGVmaW5lZCBvbmVzLiBUaGlzIHdpbGwgYXQgbGVhc3QgZ2VuZXJhdGUgc29tZSB3YXJuaW5ncyBpZiBqbW9yZWNmZy5oCisgKiBpcyBjaGFuZ2VkIGFuZCBiZWNvbWVzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBhc3NlbWJseSBjb2RlLgorICovCitleHRlcm4gdm9pZCBhcm12Nl9pZGN0KHNob3J0ICpjb2VmcywgaW50ICpxdWFucywgdW5zaWduZWQgY2hhciAqKnJvd3MsIGludCBjb2wpOworCit2b2lkIGpwZWdfaWRjdF9hcm12NiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIElGQVNUX01VTFRfVFlQRSAqZGN0X3RhYmxlID0gKElGQVNUX01VTFRfVFlQRSAqKWNvbXBwdHItPmRjdF90YWJsZTsKKyAgYXJtdjZfaWRjdChjb2VmX2Jsb2NrLCBkY3RfdGFibGUsIG91dHB1dF9idWYsIG91dHB1dF9jb2wpOworfQorCisjZW5kaWYKKworI2lmZGVmIEFORFJPSURfSU5URUxTU0UyX0lEQ1QKK2V4dGVybiBzaG9ydCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpIHF1YW50cHRyU1NFW0RDVFNJWkUyXTsKK2V4dGVybiB2b2lkIGpwZWdfaWRjdF9pbnRlbHNzZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCUpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCUpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKTsKKyNlbmRpZgorCisvKgorICogVGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIChqZGlucHV0LmMpIHNhdmVzIGF3YXkgdGhlIGFwcHJvcHJpYXRlCisgKiBxdWFudGl6YXRpb24gdGFibGUgZm9yIGVhY2ggY29tcG9uZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbgorICogaW52b2x2aW5nIHRoYXQgY29tcG9uZW50LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvcnJlY3RseQorICogZGVjb2RlIGZpbGVzIHRoYXQgcmV1c2UgUS10YWJsZSBzbG90cy4pCisgKiBXaGVuIHdlIGFyZSByZWFkeSB0byBtYWtlIGFuIG91dHB1dCBwYXNzLCB0aGUgc2F2ZWQgUS10YWJsZSBpcyBjb252ZXJ0ZWQKKyAqIHRvIGEgbXVsdGlwbGllciB0YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBieSB0aGUgSURDVCByb3V0aW5lLgorICogVGhlIG11bHRpcGxpZXIgdGFibGUgY29udGVudHMgYXJlIElEQ1QtbWV0aG9kLWRlcGVuZGVudC4gIFRvIHN1cHBvcnQKKyAqIGFwcGxpY2F0aW9uIGNoYW5nZXMgaW4gSURDVCBtZXRob2QgYmV0d2VlbiBzY2Fucywgd2UgY2FuIHJlbWFrZSB0aGUKKyAqIG11bHRpcGxpZXIgdGFibGVzIGlmIG5lY2Vzc2FyeS4KKyAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBmaXJzdCBvdXRwdXQgcGFzcyBtYXkgb2NjdXIgYmVmb3JlIGFueSBkYXRhCisgKiBoYXMgYmVlbiBzZWVuIGZvciBzb21lIGNvbXBvbmVudHMsIGFuZCB0aHVzIGJlZm9yZSB0aGVpciBRLXRhYmxlcyBoYXZlCisgKiBiZWVuIHNhdmVkIGF3YXkuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcHJlc2V0CisgKiB0byB6ZXJvZXM7IHRoZSByZXN1bHQgb2YgdGhlIElEQ1Qgd2lsbCBiZSBhIG5ldXRyYWwgZ3JheSBsZXZlbC4KKyAqLworCisKKy8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIElEQ1QgbWV0aG9kIGNvZGUgdGhhdCBlYWNoIG11bHRpcGxpZXIgdGFibGUKKyAgICogaXMgY3VycmVudGx5IHNldCB1cCBmb3IsIG9yIC0xIGlmIGl0J3Mgbm90IHlldCBzZXQgdXAuCisgICAqIFRoZSBhY3R1YWwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHBvaW50ZWQgdG8gYnkgZGN0X3RhYmxlIGluIHRoZQorICAgKiBwZXItY29tcG9uZW50IGNvbXBfaW5mbyBzdHJ1Y3R1cmVzLgorICAgKi8KKyAgaW50IGN1cl9tZXRob2RbTUFYX0NPTVBPTkVOVFNdOworfSBteV9pZGN0X2NvbnRyb2xsZXI7CisKK3R5cGVkZWYgbXlfaWRjdF9jb250cm9sbGVyICogbXlfaWRjdF9wdHI7CisKKworLyogQWxsb2NhdGVkIG11bHRpcGxpZXIgdGFibGVzOiBiaWcgZW5vdWdoIGZvciBhbnkgc3VwcG9ydGVkIHZhcmlhbnQgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgIElTTE9XX01VTFRfVFlQRSBpc2xvd19hcnJheVtEQ1RTSVpFMl07CisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICBJRkFTVF9NVUxUX1RZUEUgaWZhc3RfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICBGTE9BVF9NVUxUX1RZUEUgZmxvYXRfYXJyYXlbRENUU0laRTJdOworI2VuZGlmCit9IG11bHRpcGxpZXJfdGFibGU7CisKKworLyogVGhlIGN1cnJlbnQgc2NhbGVkLUlEQ1Qgcm91dGluZXMgcmVxdWlyZSBJU0xPVy1zdHlsZSBtdWx0aXBsaWVyIHRhYmxlcywKKyAqIHNvIGJlIHN1cmUgdG8gY29tcGlsZSB0aGF0IGNvZGUgaWYgZWl0aGVyIElTTE9XIG9yIFNDQUxJTkcgaXMgcmVxdWVzdGVkLgorICovCisjaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAorI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUworI2Vsc2UKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisjZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCisjZW5kaWYKKyNlbmRpZgorCisKKy8qCisgKiBQcmVwYXJlIGZvciBhbiBvdXRwdXQgcGFzcy4KKyAqIEhlcmUgd2Ugc2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudCBhbmQgYnVpbGQKKyAqIGEgbWF0Y2hpbmcgbXVsdGlwbGllciB0YWJsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lkY3RfcHRyIGlkY3QgPSAobXlfaWRjdF9wdHIpIGNpbmZvLT5pZGN0OworICBpbnQgY2ksIGk7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludCBtZXRob2QgPSAwOworICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOworICBKUVVBTlRfVEJMICogcXRibDsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCisgICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKKyNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECisgICAgY2FzZSAxOgorICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7CisgICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4MjsKKyAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OworICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIERDVFNJWkU6CisgICAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7CisjaWZkZWYgQU5EUk9JRF9BUk1WNl9JRENUCisgICAgICBjYXNlIEpEQ1RfSVNMT1c6CisgICAgICBjYXNlIEpEQ1RfSUZBU1Q6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9hcm12NjsKKwltZXRob2QgPSBKRENUX0lGQVNUOworCWJyZWFrOworI2Vsc2UgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCisjaWZkZWYgQU5EUk9JRF9JTlRFTFNTRTJfSURDVAorICAgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgY2FzZSBKRENUX0lGQVNUOgorCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaW50ZWxzc2U7CisJbWV0aG9kID0gSkRDVF9JU0xPVzsgLyogVXNlIHF1YW50IHRhYmxlIG9mIElTTE9XLiovCisJYnJlYWs7CisjZWxzZQorI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKyAgICAgIGNhc2UgSkRDVF9JU0xPVzoKKwltZXRob2RfcHRyID0ganBlZ19pZGN0X2lzbG93OworCW1ldGhvZCA9IEpEQ1RfSVNMT1c7CisJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfSUZBU1Q6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9pZmFzdDsKKwltZXRob2QgPSBKRENUX0lGQVNUOworCWJyZWFrOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisgICAgICBjYXNlIEpEQ1RfRkxPQVQ6CisJbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9mbG9hdDsKKwltZXRob2QgPSBKRENUX0ZMT0FUOworCWJyZWFrOworI2VuZGlmCisgICAgICBkZWZhdWx0OgorCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfRENUU0laRSwgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZGN0LT5wdWIuaW52ZXJzZV9EQ1RbY2ldID0gbWV0aG9kX3B0cjsKKyAgICAvKiBDcmVhdGUgbXVsdGlwbGllciB0YWJsZSBmcm9tIHF1YW50IHRhYmxlLgorICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBza2lwIHRoaXMgaWYgdGhlIGNvbXBvbmVudCBpcyB1bmludGVyZXN0aW5nCisgICAgICogb3IgaWYgd2UgYWxyZWFkeSBidWlsdCB0aGUgdGFibGUuICBBbHNvLCBpZiBubyBxdWFudCB0YWJsZQorICAgICAqIGhhcyB5ZXQgYmVlbiBzYXZlZCBmb3IgdGhlIGNvbXBvbmVudCwgd2UgbGVhdmUgdGhlCisgICAgICogbXVsdGlwbGllciB0YWJsZSBhbGwtemVybzsgd2UnbGwgYmUgcmVhZGluZyB6ZXJvZXMgZnJvbSB0aGUKKyAgICAgKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgYnVmZmVyIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkIHx8IGlkY3QtPmN1cl9tZXRob2RbY2ldID09IG1ldGhvZCkKKyAgICAgIGNvbnRpbnVlOworICAgIHF0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKKyAgICBpZiAocXRibCA9PSBOVUxMKQkJLyogaGFwcGVucyBpZiBubyBkYXRhIHlldCBmb3IgY29tcG9uZW50ICovCisgICAgICBjb250aW51ZTsKKyAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IG1ldGhvZDsKKyAgICBzd2l0Y2ggKG1ldGhvZCkgeworI2lmZGVmIFBST1ZJREVfSVNMT1dfVEFCTEVTCisgICAgY2FzZSBKRENUX0lTTE9XOgorICAgICAgeworCS8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cywgYnV0IGFyZSBzdG9yZWQgYXMgaW50cyB0byBlbnN1cmUgYWNjZXNzIGVmZmljaWVuY3kuCisJICovCisJSVNMT1dfTVVMVF9UWVBFICogaXNtdGJsID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKwkgIGlzbXRibFtpXSA9IChJU0xPV19NVUxUX1RZUEUpIHF0YmwtPnF1YW50dmFsW2ldOworCX0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9JRkFTVDoKKyAgICAgIHsKKwkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqIEZvciBpbnRlZ2VyIG9wZXJhdGlvbiwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMgdG8gYmUgc2NhbGVkIGJ5CisJICogSUZBU1RfU0NBTEVfQklUUy4KKwkgKi8KKwlJRkFTVF9NVUxUX1RZUEUgKiBpZm10YmwgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyNpZmRlZiBBTkRST0lEX0FSTVY2X0lEQ1QKKwkvKiBQcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE1IGJpdHMuICovCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNjYWxlc1tEQ1RTSVpFMl0gPSB7CisJICAzMjc2OCwgNDU0NTEsIDQyODEzLCAzODUzMSwgMzI3NjgsIDI1NzQ2LCAxNzczNCwgIDkwNDEsCisJICA0NTQ1MSwgNjMwNDIsIDU5Mzg0LCA1MzQ0NCwgNDU0NTEsIDM1NzEwLCAyNDU5OCwgMTI1NDAsCisJICA0MjgxMywgNTkzODQsIDU1OTM4LCA1MDM0MywgNDI4MTMsIDMzNjM4LCAyMzE3MCwgMTE4MTIsCisJICAzODUzMSwgNTM0NDQsIDUwMzQzLCA0NTMwOCwgMzg1MzEsIDMwMjc0LCAyMDg1MywgMTA2MzEsCisJICAzMjc2OCwgNDU0NTEsIDQyODEzLCAzODUzMSwgMzI3NjgsIDI1NzQ2LCAxNzczNCwgIDkwNDEsCisJICAyNTc0NiwgMzU3MTAsIDMzNjM4LCAzMDI3NCwgMjU3NDYsIDIwMjI4LCAxMzkzMywgIDcxMDMsCisJICAxNzczNCwgMjQ1OTgsIDIzMTcwLCAyMDg1MywgMTc3MzQsIDEzOTMzLCAgOTU5OCwgIDQ4OTMsCisJICAgOTA0MSwgMTI1NDAsIDExODEyLCAxMDYzMSwgIDkwNDEsICA3MTAzLCAgNDg5MywgIDI0OTQsCisJfTsKKwkvKiBJbnZlcnNlIG1hcCBvZiBbNywgNSwgMSwgMywgMCwgMiwgNCwgNl0uICovCisJc3RhdGljIGNvbnN0IGNoYXIgb3JkZXJzW0RDVFNJWkVdID0gezQsIDIsIDUsIDMsIDYsIDEsIDcsIDB9OworCS8qIFJlb3JkZXIgdGhlIGNvbHVtbnMgYWZ0ZXIgdHJhbnNwb3NpbmcuICovCisJZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyArK2kpIHsKKwkgIGludCBqID0gKChpICYgNykgPDwgMykgKyBvcmRlcnNbaSA+PiAzXTsKKwkgIGlmbXRibFtqXSA9IChxdGJsLT5xdWFudHZhbFtpXSAqIHNjYWxlc1tpXSArIDIpID4+IDI7CisJfQorI2Vsc2UgLyogQU5EUk9JRF9BUk1WNl9JRENUICovCisKKyNkZWZpbmUgQ09OU1RfQklUUyAxNAorCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0geworCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCisJICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCisJICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCisJICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisJICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCisJICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCisJICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKKwl9OworCVNISUZUX1RFTVBTCisKKwlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgeworCSAgaWZtdGJsW2ldID0gKElGQVNUX01VTFRfVFlQRSkKKwkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCisJCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCisJCSAgICBDT05TVF9CSVRTLUlGQVNUX1NDQUxFX0JJVFMpOworCX0KKyNlbmRpZiAvKiBBTkRST0lEX0FSTVY2X0lEQ1QgKi8KKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorICAgIGNhc2UgSkRDVF9GTE9BVDoKKyAgICAgIHsKKwkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgorCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQorCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCisJICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNworCSAqLworCUZMT0FUX01VTFRfVFlQRSAqIGZtdGJsID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisJaW50IHJvdywgY29sOworCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7CisJICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCisJICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKKwl9OworCisJaSA9IDA7CisJZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgeworCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgeworCSAgICBmbXRibFtpXSA9IChGTE9BVF9NVUxUX1RZUEUpCisJICAgICAgKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKKwkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0pOworCSAgICBpKys7CisJICB9CisJfQorICAgICAgfQorICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgSURDVCBtYW5hZ2VyLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaW52ZXJzZV9kY3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2lkY3RfcHRyIGlkY3Q7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBpZGN0ID0gKG15X2lkY3RfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2lkY3RfY29udHJvbGxlcikpOworICBjaW5mby0+aWRjdCA9IChzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqKSBpZGN0OworICBpZGN0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3M7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gYSBtdWx0aXBsaWVyIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudCAqLworICAgIGNvbXBwdHItPmRjdF90YWJsZSA9CisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKKyAgICBNRU1aRVJPKGNvbXBwdHItPmRjdF90YWJsZSwgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKKyAgICAvKiBNYXJrIG11bHRpcGxpZXIgdGFibGUgbm90IHlldCBzZXQgdXAgZm9yIGFueSBtZXRob2QgKi8KKyAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IC0xOworICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRodWZmLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1ZDRmZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZGh1ZmYuYwpAQCAtMCwwICsxLDg5NCBAQAorLyoKKyAqIGpkaHVmZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCisgKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKKyAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcworICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKKyAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkcGh1ZmYuYyAqLworCitMT0NBTChib29sZWFuKSBwcm9jZXNzX3Jlc3RhcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pOworCisKKy8qCisgKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBIdWZmbWFuIGRlY29kaW5nLgorICoKKyAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKKyAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCit9IHNhdmFibGVfc3RhdGU7CisKKy8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KKyAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQorICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgorICovCisKKyNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCisjZWxzZQorI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKKyNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAorCSgoZGVzdCkubGFzdF9kY192YWxbMF0gPSAoc3JjKS5sYXN0X2RjX3ZhbFswXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMV0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsxXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbMl0gPSAoc3JjKS5sYXN0X2RjX3ZhbFsyXSwgXAorCSAoZGVzdCkubGFzdF9kY192YWxbM10gPSAoc3JjKS5sYXN0X2RjX3ZhbFszXSkKKyNlbmRpZgorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBsb2FkZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgZWFjaCBNQ1UuCisgICAqIEluIGNhc2Ugb2Ygc3VzcGVuc2lvbiwgd2UgZXhpdCBXSVRIT1VUIHVwZGF0aW5nIHRoZW0uCisgICAqLworICBiaXRyZWFkX3Blcm1fc3RhdGUgYml0c3RhdGU7CS8qIEJpdCBidWZmZXIgYXQgc3RhcnQgb2YgTUNVICovCisgIHNhdmFibGVfc3RhdGUgc2F2ZWQ7CQkvKiBPdGhlciBzdGF0ZSBhdCBzdGFydCBvZiBNQ1UgKi8KKworICAvKiBUaGVzZSBmaWVsZHMgYXJlIE5PVCBsb2FkZWQgaW50byBsb2NhbCB3b3JraW5nIHN0YXRlLiAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydHNfdG9fZ287CS8qIE1DVXMgbGVmdCBpbiB0aGlzIHJlc3RhcnQgaW50ZXJ2YWwgKi8KKworICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLworICBkX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOworCisgIC8qIFByZWNhbGN1bGF0ZWQgaW5mbyBzZXQgdXAgYnkgc3RhcnRfcGFzcyBmb3IgdXNlIGluIGRlY29kZV9tY3U6ICovCisKKyAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgdG8gYmUgdXNlZCBmb3IgZWFjaCBibG9jayB3aXRoaW4gYW4gTUNVICovCisgIGRfZGVyaXZlZF90YmwgKiBkY19jdXJfdGJsc1tEX01BWF9CTE9DS1NfSU5fTUNVXTsKKyAgZF9kZXJpdmVkX3RibCAqIGFjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworICAvKiBXaGV0aGVyIHdlIGNhcmUgYWJvdXQgdGhlIERDIGFuZCBBQyBjb2VmZmljaWVudCB2YWx1ZXMgZm9yIGVhY2ggYmxvY2sgKi8KKyAgYm9vbGVhbiBkY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIGJvb2xlYW4gYWNfbmVlZGVkW0RfTUFYX0JMT0NLU19JTl9NQ1VdOworfSBodWZmX2VudHJvcHlfZGVjb2RlcjsKKwordHlwZWRlZiBodWZmX2VudHJvcHlfZGVjb2RlciAqIGh1ZmZfZW50cm9weV9wdHI7CisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfcGFzc19odWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IGNpLCBibGtuLCBkY3RibCwgYWN0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIENoZWNrIHRoYXQgdGhlIHNjYW4gcGFyYW1ldGVycyBTcywgU2UsIEFoL0FsIGFyZSBPSyBmb3Igc2VxdWVudGlhbCBKUEVHLgorICAgKiBUaGlzIG91Z2h0IHRvIGJlIGFuIGVycm9yIGNvbmRpdGlvbiwgYnV0IHdlIG1ha2UgaXQgYSB3YXJuaW5nIGJlY2F1c2UKKyAgICogdGhlcmUgYXJlIHNvbWUgYmFzZWxpbmUgZmlsZXMgb3V0IHRoZXJlIHdpdGggYWxsIHplcm9lcyBpbiB0aGVzZSBieXRlcy4KKyAgICovCisgIGlmIChjaW5mby0+U3MgIT0gMCB8fCBjaW5mby0+U2UgIT0gRENUU0laRTItMSB8fAorICAgICAgY2luZm8tPkFoICE9IDAgfHwgY2luZm8tPkFsICE9IDApCisgICAgV0FSTk1TKGNpbmZvLCBKV1JOX05PVF9TRVFVRU5USUFMKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgZGN0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87CisgICAgYWN0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87CisgICAgLyogQ29tcHV0ZSBkZXJpdmVkIHZhbHVlcyBmb3IgSHVmZm1hbiB0YWJsZXMgKi8KKyAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLworICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCBkY3RibCwKKwkJCSAgICAmIGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tkY3RibF0pOworICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCisJCQkgICAgJiBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbYWN0YmxdKTsKKyAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOworICB9CisKKyAgLyogUHJlY2FsY3VsYXRlIGRlY29kaW5nIGluZm8gZm9yIGVhY2ggYmxvY2sgaW4gYW4gTUNVIG9mIHRoaXMgc2NhbiAqLworICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgIGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogUHJlY2FsY3VsYXRlIHdoaWNoIHRhYmxlIHRvIHVzZSBmb3IgZWFjaCBibG9jayAqLworICAgIGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisgICAgZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbY29tcHB0ci0+YWNfdGJsX25vXTsKKyAgICAvKiBEZWNpZGUgd2hldGhlciB3ZSByZWFsbHkgY2FyZSBhYm91dCB0aGUgY29lZmZpY2llbnQgdmFsdWVzICovCisgICAgaWYgKGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKKyAgICAgIGVudHJvcHktPmRjX25lZWRlZFtibGtuXSA9IFRSVUU7CisgICAgICAvKiB3ZSBkb24ndCBuZWVkIHRoZSBBQ3MgaWYgcHJvZHVjaW5nIGEgMS84dGgtc2l6ZSBpbWFnZSAqLworICAgICAgZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gKGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSA+IDEpOworICAgIH0gZWxzZSB7CisgICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBlbnRyb3B5LT5hY19uZWVkZWRbYmxrbl0gPSBGQUxTRTsKKyAgICB9CisgIH0KKworICAvKiBJbml0aWFsaXplIGJpdHJlYWQgc3RhdGUgdmFyaWFibGVzICovCisgIGVudHJvcHktPmJpdHN0YXRlLmJpdHNfbGVmdCA9IDA7CisgIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIgPSAwOyAvKiB1bm5lY2Vzc2FyeSwgYnV0IGtlZXBzIFB1cmlmeSBxdWlldCAqLworICBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEgPSBGQUxTRTsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworfQorCisKKy8qCisgKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgorICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCisgKgorICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqZHBodWZmLmMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX21ha2VfZF9kZXJpdmVkX3RibCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJCQkgZF9kZXJpdmVkX3RibCAqKiBwZHRibCkKK3sKKyAgSkhVRkZfVEJMICpodGJsOworICBkX2Rlcml2ZWRfdGJsICpkdGJsOworICBpbnQgcCwgaSwgbCwgc2ksIG51bXN5bWJvbHM7CisgIGludCBsb29rYml0cywgY3RyOworICBjaGFyIGh1ZmZzaXplWzI1N107CisgIHVuc2lnbmVkIGludCBodWZmY29kZVsyNTddOworICB1bnNpZ25lZCBpbnQgY29kZTsKKworICAvKiBOb3RlIHRoYXQgaHVmZnNpemVbXSBhbmQgaHVmZmNvZGVbXSBhcmUgZmlsbGVkIGluIGNvZGUtbGVuZ3RoIG9yZGVyLAorICAgKiBwYXJhbGxlbGluZyB0aGUgb3JkZXIgb2YgdGhlIHN5bWJvbHMgdGhlbXNlbHZlcyBpbiBodGJsLT5odWZmdmFsW10uCisgICAqLworCisgIC8qIEZpbmQgdGhlIGlucHV0IEh1ZmZtYW4gdGFibGUgKi8KKyAgaWYgKHRibG5vIDwgMCB8fCB0YmxubyA+PSBOVU1fSFVGRl9UQkxTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKKyAgaHRibCA9CisgICAgaXNEQyA/IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW3RibG5vXSA6IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW3RibG5vXTsKKyAgaWYgKGh0YmwgPT0gTlVMTCkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7CisKKyAgLyogQWxsb2NhdGUgYSB3b3Jrc3BhY2UgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28uICovCisgIGlmICgqcGR0YmwgPT0gTlVMTCkKKyAgICAqcGR0YmwgPSAoZF9kZXJpdmVkX3RibCAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihkX2Rlcml2ZWRfdGJsKSk7CisgIGR0YmwgPSAqcGR0Ymw7CisgIGR0YmwtPnB1YiA9IGh0Ymw7CQkvKiBmaWxsIGluIGJhY2sgbGluayAqLworICAKKyAgLyogRmlndXJlIEMuMTogbWFrZSB0YWJsZSBvZiBIdWZmbWFuIGNvZGUgbGVuZ3RoIGZvciBlYWNoIHN5bWJvbCAqLworCisgIHAgPSAwOworICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKKyAgICBpID0gKGludCkgaHRibC0+Yml0c1tsXTsKKyAgICBpZiAoaSA8IDAgfHwgcCArIGkgPiAyNTYpCS8qIHByb3RlY3QgYWdhaW5zdCB0YWJsZSBvdmVycnVuICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOworICB9CisgIGh1ZmZzaXplW3BdID0gMDsKKyAgbnVtc3ltYm9scyA9IHA7CisgIAorICAvKiBGaWd1cmUgQy4yOiBnZW5lcmF0ZSB0aGUgY29kZXMgdGhlbXNlbHZlcyAqLworICAvKiBXZSBhbHNvIHZhbGlkYXRlIHRoYXQgdGhlIGNvdW50cyByZXByZXNlbnQgYSBsZWdhbCBIdWZmbWFuIGNvZGUgdHJlZS4gKi8KKyAgCisgIGNvZGUgPSAwOworICBzaSA9IGh1ZmZzaXplWzBdOworICBwID0gMDsKKyAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7CisgICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gc2kpIHsKKyAgICAgIGh1ZmZjb2RlW3ArK10gPSBjb2RlOworICAgICAgY29kZSsrOworICAgIH0KKyAgICAvKiBjb2RlIGlzIG5vdyAxIG1vcmUgdGhhbiB0aGUgbGFzdCBjb2RlIHVzZWQgZm9yIGNvZGVsZW5ndGggc2k7IGJ1dAorICAgICAqIGl0IG11c3Qgc3RpbGwgZml0IGluIHNpIGJpdHMsIHNpbmNlIG5vIGNvZGUgaXMgYWxsb3dlZCB0byBiZSBhbGwgb25lcy4KKyAgICAgKi8KKyAgICBpZiAoKChJTlQzMikgY29kZSkgPj0gKCgoSU5UMzIpIDEpIDw8IHNpKSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOworICAgIGNvZGUgPDw9IDE7CisgICAgc2krKzsKKyAgfQorCisgIC8qIEZpZ3VyZSBGLjE1OiBnZW5lcmF0ZSBkZWNvZGluZyB0YWJsZXMgZm9yIGJpdC1zZXF1ZW50aWFsIGRlY29kaW5nICovCisKKyAgcCA9IDA7CisgIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgeworICAgIGlmIChodGJsLT5iaXRzW2xdKSB7CisgICAgICAvKiB2YWxvZmZzZXRbbF0gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBsLAorICAgICAgICogbWludXMgdGhlIG1pbmltdW0gY29kZSBvZiBsZW5ndGggbAorICAgICAgICovCisgICAgICBkdGJsLT52YWxvZmZzZXRbbF0gPSAoSU5UMzIpIHAgLSAoSU5UMzIpIGh1ZmZjb2RlW3BdOworICAgICAgcCArPSBodGJsLT5iaXRzW2xdOworICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IGh1ZmZjb2RlW3AtMV07IC8qIG1heGltdW0gY29kZSBvZiBsZW5ndGggbCAqLworICAgIH0gZWxzZSB7CisgICAgICBkdGJsLT5tYXhjb2RlW2xdID0gLTE7CS8qIC0xIGlmIG5vIGNvZGVzIG9mIHRoaXMgbGVuZ3RoICovCisgICAgfQorICB9CisgIGR0YmwtPm1heGNvZGVbMTddID0gMHhGRkZGRkw7IC8qIGVuc3VyZXMganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzICovCisKKyAgLyogQ29tcHV0ZSBsb29rYWhlYWQgdGFibGVzIHRvIHNwZWVkIHVwIGRlY29kaW5nLgorICAgKiBGaXJzdCB3ZSBzZXQgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIHRvIDAsIGluZGljYXRpbmcgInRvbyBsb25nIjsKKyAgICogdGhlbiB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFuZAorICAgKiBmaWxsIGluIGFsbCB0aGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQgdG8gYml0IHNlcXVlbmNlcyBzdGFydGluZworICAgKiB3aXRoIHRoYXQgY29kZS4KKyAgICovCisKKyAgTUVNWkVSTyhkdGJsLT5sb29rX25iaXRzLCBTSVpFT0YoZHRibC0+bG9va19uYml0cykpOworCisgIHAgPSAwOworICBmb3IgKGwgPSAxOyBsIDw9IEhVRkZfTE9PS0FIRUFEOyBsKyspIHsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKywgcCsrKSB7CisgICAgICAvKiBsID0gY3VycmVudCBjb2RlJ3MgbGVuZ3RoLCBwID0gaXRzIGluZGV4IGluIGh1ZmZjb2RlW10gJiBodWZmdmFsW10uICovCisgICAgICAvKiBHZW5lcmF0ZSBsZWZ0LWp1c3RpZmllZCBjb2RlIGZvbGxvd2VkIGJ5IGFsbCBwb3NzaWJsZSBiaXQgc2VxdWVuY2VzICovCisgICAgICBsb29rYml0cyA9IGh1ZmZjb2RlW3BdIDw8IChIVUZGX0xPT0tBSEVBRC1sKTsKKyAgICAgIGZvciAoY3RyID0gMSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7IGN0ciA+IDA7IGN0ci0tKSB7CisJZHRibC0+bG9va19uYml0c1tsb29rYml0c10gPSBsOworCWR0YmwtPmxvb2tfc3ltW2xvb2tiaXRzXSA9IGh0YmwtPmh1ZmZ2YWxbcF07CisJbG9va2JpdHMrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBWYWxpZGF0ZSBzeW1ib2xzIGFzIGJlaW5nIHJlYXNvbmFibGUuCisgICAqIEZvciBBQyB0YWJsZXMsIHdlIG1ha2Ugbm8gY2hlY2ssIGJ1dCBhY2NlcHQgYWxsIGJ5dGUgdmFsdWVzIDAuLjI1NS4KKyAgICogRm9yIERDIHRhYmxlcywgd2UgcmVxdWlyZSB0aGUgc3ltYm9scyB0byBiZSBpbiByYW5nZSAwLi4xNS4KKyAgICogKFRpZ2h0ZXIgYm91bmRzIGNvdWxkIGJlIGFwcGxpZWQgZGVwZW5kaW5nIG9uIHRoZSBkYXRhIGRlcHRoIGFuZCBtb2RlLAorICAgKiBidXQgdGhpcyBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSBzYWZlIGRlY29kaW5nLikKKyAgICovCisgIGlmIChpc0RDKSB7CisgICAgZm9yIChpID0gMDsgaSA8IG51bXN5bWJvbHM7IGkrKykgeworICAgICAgaW50IHN5bSA9IGh0YmwtPmh1ZmZ2YWxbaV07CisgICAgICBpZiAoc3ltIDwgMCB8fCBzeW0gPiAxNSkKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogT3V0LW9mLWxpbmUgY29kZSBmb3IgYml0IGZldGNoaW5nIChzaGFyZWQgd2l0aCBqZHBodWZmLmMpLgorICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgorICogTm90ZTogY3VycmVudCB2YWx1ZXMgb2YgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycywKKyAqIGJ1dCBhcmUgcmV0dXJuZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHRoZSBzdGF0ZSBzdHJ1Y3QuCisgKgorICogT24gbW9zdCBtYWNoaW5lcyBNSU5fR0VUX0JJVFMgc2hvdWxkIGJlIDI1IHRvIGFsbG93IHRoZSBmdWxsIDMyLWJpdCB3aWR0aAorICogb2YgZ2V0X2J1ZmZlciB0byBiZSB1c2VkLiAgKE9uIG1hY2hpbmVzIHdpdGggd2lkZXIgd29yZHMsIGFuIGV2ZW4gbGFyZ2VyCisgKiBidWZmZXIgY291bGQgYmUgdXNlZC4pICBIb3dldmVyLCBvbiBzb21lIG1hY2hpbmVzIDMyLWJpdCBzaGlmdHMgYXJlCisgKiBxdWl0ZSBzbG93IGFuZCB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgcGxhY2VzIHNoaWZ0ZWQuCisgKiAoVGhpcyBpcyB0cnVlIHdpdGggbW9zdCBQQyBjb21waWxlcnMsIGZvciBpbnN0YW5jZS4pICBJbiB0aGlzIGNhc2UgaXQgbWF5CisgKiBiZSBhIHdpbiB0byBzZXQgTUlOX0dFVF9CSVRTIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIDE1LiAgVGhpcyByZWR1Y2VzIHRoZQorICogYXZlcmFnZSBzaGlmdCBkaXN0YW5jZSBhdCB0aGUgY29zdCBvZiBtb3JlIGNhbGxzIHRvIGpwZWdfZmlsbF9iaXRfYnVmZmVyLgorICovCisKKyNpZmRlZiBTTE9XX1NISUZUXzMyCisjZGVmaW5lIE1JTl9HRVRfQklUUyAgMTUJLyogbWluaW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKyNlbHNlCisjZGVmaW5lIE1JTl9HRVRfQklUUyAgKEJJVF9CVUZfU0laRS03KQorI2VuZGlmCisKKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2ZpbGxfYml0X2J1ZmZlciAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCisJCSAgICAgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAorCQkgICAgICBpbnQgbmJpdHMpCisvKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KK3sKKyAgLyogQ29weSBoZWF2aWx5IHVzZWQgc3RhdGUgZmllbGRzIGludG8gbG9jYWxzIChob3BlZnVsbHkgcmVnaXN0ZXJzKSAqLworICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBzdGF0ZS0+bmV4dF9pbnB1dF9ieXRlOworICByZWdpc3RlciBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gc3RhdGUtPmJ5dGVzX2luX2J1ZmZlcjsKKyAgal9kZWNvbXByZXNzX3B0ciBjaW5mbyA9IHN0YXRlLT5jaW5mbzsKKworICAvKiBBdHRlbXB0IHRvIGxvYWQgYXQgbGVhc3QgTUlOX0dFVF9CSVRTIGJpdHMgaW50byBnZXRfYnVmZmVyLiAqLworICAvKiAoSXQgaXMgYXNzdW1lZCB0aGF0IG5vIHJlcXVlc3Qgd2lsbCBiZSBmb3IgbW9yZSB0aGFuIHRoYXQgbWFueSBiaXRzLikgKi8KKyAgLyogV2UgZmFpbCB0byBkbyBzbyBvbmx5IGlmIHdlIGhpdCBhIG1hcmtlciBvciBhcmUgZm9yY2VkIHRvIHN1c3BlbmQuICovCisKKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsJLyogY2Fubm90IGFkdmFuY2UgcGFzdCBhIG1hcmtlciAqLworICAgIHdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKKyAgICAgIHJlZ2lzdGVyIGludCBjOworCisgICAgICAvKiBBdHRlbXB0IHRvIHJlYWQgYSBieXRlICovCisgICAgICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsKKwlpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQorCSAgcmV0dXJuIEZBTFNFOworCW5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKKwlieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7CisgICAgICB9CisgICAgICBieXRlc19pbl9idWZmZXItLTsKKyAgICAgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKKworICAgICAgLyogSWYgaXQncyAweEZGLCBjaGVjayBhbmQgZGlzY2FyZCBzdHVmZmVkIHplcm8gYnl0ZSAqLworICAgICAgaWYgKGMgPT0gMHhGRikgeworCS8qIExvb3AgaGVyZSB0byBkaXNjYXJkIGFueSBwYWRkaW5nIEZGJ3Mgb24gdGVybWluYXRpbmcgbWFya2VyLAorCSAqIHNvIHRoYXQgd2UgY2FuIHNhdmUgYSB2YWxpZCB1bnJlYWRfbWFya2VyIHZhbHVlLiAgTk9URTogd2Ugd2lsbAorCSAqIGFjY2VwdCBtdWx0aXBsZSBGRidzIGZvbGxvd2VkIGJ5IGEgMCBhcyBtZWFuaW5nIGEgc2luZ2xlIEZGIGRhdGEKKwkgKiBieXRlLiAgVGhpcyBkYXRhIHBhdHRlcm4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCisJICovCisJZG8geworCSAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7CisJICAgIGlmICghICgqY2luZm8tPnNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgICBuZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7CisJICAgIGJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKKwkgIH0KKwkgIGJ5dGVzX2luX2J1ZmZlci0tOworCSAgYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOworCX0gd2hpbGUgKGMgPT0gMHhGRik7CisKKwlpZiAoYyA9PSAwKSB7CisJICAvKiBGb3VuZCBGRi8wMCwgd2hpY2ggcmVwcmVzZW50cyBhbiBGRiBkYXRhIGJ5dGUgKi8KKwkgIGMgPSAweEZGOworCX0gZWxzZSB7CisJICAvKiBPb3BzLCBpdCdzIGFjdHVhbGx5IGEgbWFya2VyIGluZGljYXRpbmcgZW5kIG9mIGNvbXByZXNzZWQgZGF0YS4KKwkgICAqIFNhdmUgdGhlIG1hcmtlciBjb2RlIGZvciBsYXRlciB1c2UuCisJICAgKiBGaW5lIHBvaW50OiBpdCBtaWdodCBhcHBlYXIgdGhhdCB3ZSBzaG91bGQgc2F2ZSB0aGUgbWFya2VyIGludG8KKwkgICAqIGJpdHJlYWQgd29ya2luZyBzdGF0ZSwgbm90IHN0cmFpZ2h0IGludG8gcGVybWFuZW50IHN0YXRlLiAgQnV0CisJICAgKiBvbmNlIHdlIGhhdmUgaGl0IGEgbWFya2VyLCB3ZSBjYW5ub3QgbmVlZCB0byBzdXNwZW5kIHdpdGhpbiB0aGUKKwkgICAqIGN1cnJlbnQgTUNVLCBiZWNhdXNlIHdlIHdpbGwgcmVhZCBubyBtb3JlIGJ5dGVzIGZyb20gdGhlIGRhdGEKKwkgICAqIHNvdXJjZS4gIFNvIGl0IGlzIE9LIHRvIHVwZGF0ZSBwZXJtYW5lbnQgc3RhdGUgcmlnaHQgYXdheS4KKwkgICAqLworCSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOworCSAgLyogU2VlIGlmIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbWUgZmFrZSB6ZXJvIGJpdHMuICovCisJICBnb3RvIG5vX21vcmVfYnl0ZXM7CisJfQorICAgICAgfQorCisgICAgICAvKiBPSywgbG9hZCBjIGludG8gZ2V0X2J1ZmZlciAqLworICAgICAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKKyAgICAgIGJpdHNfbGVmdCArPSA4OworICAgIH0gLyogZW5kIHdoaWxlICovCisgIH0gZWxzZSB7CisgIG5vX21vcmVfYnl0ZXM6CisgICAgLyogV2UgZ2V0IGhlcmUgaWYgd2UndmUgcmVhZCB0aGUgbWFya2VyIHRoYXQgdGVybWluYXRlcyB0aGUgY29tcHJlc3NlZAorICAgICAqIGRhdGEgc2VnbWVudC4gIFRoZXJlIHNob3VsZCBiZSBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIHJlZ2lzdGVyCisgICAgICogdG8gc2F0aXNmeSB0aGUgcmVxdWVzdDsgaWYgc28sIG5vIHByb2JsZW0uCisgICAgICovCisgICAgaWYgKG5iaXRzID4gYml0c19sZWZ0KSB7CisgICAgICAvKiBVaC1vaC4gIFJlcG9ydCBjb3JydXB0ZWQgZGF0YSB0byB1c2VyIGFuZCBzdHVmZiB6ZXJvZXMgaW50bworICAgICAgICogdGhlIGRhdGEgc3RyZWFtLCBzbyB0aGF0IHdlIGNhbiBwcm9kdWNlIHNvbWUga2luZCBvZiBpbWFnZS4KKyAgICAgICAqIFdlIHVzZSBhIG5vbnZvbGF0aWxlIGZsYWcgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgd2FybmluZyBtZXNzYWdlCisgICAgICAgKiBhcHBlYXJzIHBlciBkYXRhIHNlZ21lbnQuCisgICAgICAgKi8KKyAgICAgIGlmICghIGNpbmZvLT5lbnRyb3B5LT5pbnN1ZmZpY2llbnRfZGF0YSkgeworCVdBUk5NUyhjaW5mbywgSldSTl9ISVRfTUFSS0VSKTsKKwljaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEgPSBUUlVFOworICAgICAgfQorICAgICAgLyogRmlsbCB0aGUgYnVmZmVyIHdpdGggemVybyBiaXRzICovCisgICAgICBnZXRfYnVmZmVyIDw8PSBNSU5fR0VUX0JJVFMgLSBiaXRzX2xlZnQ7CisgICAgICBiaXRzX2xlZnQgPSBNSU5fR0VUX0JJVFM7CisgICAgfQorICB9CisKKyAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KKyAgc3RhdGUtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKKyAgc3RhdGUtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKKyAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOworICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBPdXQtb2YtbGluZSBjb2RlIGZvciBIdWZmbWFuIGNvZGUgZGVjb2RpbmcuCisgKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCisgKi8KKworR0xPQkFMKGludCkKK2pwZWdfaHVmZl9kZWNvZGUgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAorCQkgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAorCQkgIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpCit7CisgIHJlZ2lzdGVyIGludCBsID0gbWluX2JpdHM7CisgIHJlZ2lzdGVyIElOVDMyIGNvZGU7CisKKyAgLyogSFVGRl9ERUNPREUgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgY29kZSBpcyBhdCBsZWFzdCBtaW5fYml0cyAqLworICAvKiBiaXRzIGxvbmcsIHNvIGZldGNoIHRoYXQgbWFueSBiaXRzIGluIG9uZSBzd29vcC4gKi8KKworICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgbCwgcmV0dXJuIC0xKTsKKyAgY29kZSA9IEdFVF9CSVRTKGwpOworCisgIC8qIENvbGxlY3QgdGhlIHJlc3Qgb2YgdGhlIEh1ZmZtYW4gY29kZSBvbmUgYml0IGF0IGEgdGltZS4gKi8KKyAgLyogVGhpcyBpcyBwZXIgRmlndXJlIEYuMTYgaW4gdGhlIEpQRUcgc3BlYy4gKi8KKworICB3aGlsZSAoY29kZSA+IGh0YmwtPm1heGNvZGVbbF0pIHsKKyAgICBjb2RlIDw8PSAxOworICAgIENIRUNLX0JJVF9CVUZGRVIoKnN0YXRlLCAxLCByZXR1cm4gLTEpOworICAgIGNvZGUgfD0gR0VUX0JJVFMoMSk7CisgICAgbCsrOworICB9CisKKyAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KKyAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOworICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OworCisgIC8qIFdpdGggZ2FyYmFnZSBpbnB1dCB3ZSBtYXkgcmVhY2ggdGhlIHNlbnRpbmVsIHZhbHVlIGwgPSAxNy4gKi8KKworICBpZiAobCA+IDE2KSB7CisgICAgV0FSTk1TKHN0YXRlLT5jaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKKyAgICByZXR1cm4gMDsJCQkvKiBmYWtlIGEgemVybyBhcyB0aGUgc2FmZXN0IHJlc3VsdCAqLworICB9CisKKyAgcmV0dXJuIGh0YmwtPnB1Yi0+aHVmZnZhbFsgKGludCkgKGNvZGUgKyBodGJsLT52YWxvZmZzZXRbbF0pIF07Cit9CisKKworLyoKKyAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCisgKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KKyAqLworCisjaWZkZWYgQVZPSURfVEFCTEVTCisKKyNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQorCisjZWxzZQorCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCisgIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCisgICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07CisKK3N0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KKyAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAorICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCisgICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKKyAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07CisKKyNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KKworCisvKgorICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCisgKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KKyAqLworCitMT0NBTChib29sZWFuKQorcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisvKgorICogU2F2ZSB0aGUgY3VycmVudCBIdWZmbWFuIGRlb2NkZSBwb3NpdGlvbiBhbmQgdGhlIERDIGNvZWZmaWNpZW50cworICogZm9yIGVhY2ggY29tcG9uZW50IGludG8gYml0c3RyZWFtX29mZnNldCBhbmQgZGNfaW5mb1tdLCByZXNwZWN0aXZlbHkuCisgKi8KK01FVEhPRERFRih2b2lkKQorZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCkKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBzaG9ydCBpbnQgKmRjX2luZm8gPSBvZmZzZXQtPnByZXZfZGM7CisgIGludCBpOworICBqcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihjaW5mbywgb2Zmc2V0KTsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKKyAgICBkY19pbmZvW2ldID0gZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV07CisgIH0KK30KKworLyoKKyAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZWNvZGVyIHBvc2l0aW9uIGFuZCB0aGUgYml0IGJ1ZmZlcgorICogaW50byBiaXRzdHJlYW1fb2Zmc2V0IGFuZCBnZXRfYnVmZmVyLCByZXNwZWN0aXZlbHkuCisgKi8KK0dMT0JBTCh2b2lkKQoranBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisKKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBkYXRhIHNlZ21lbnQKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuOworICB9CisKKyAgLy8gU2F2ZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bQorICBvZmZzZXQtPnJlc3RhcnRzX3RvX2dvID0gKHVuc2lnbmVkIHNob3J0KSBlbnRyb3B5LT5yZXN0YXJ0c190b19nbzsKKyAgb2Zmc2V0LT5uZXh0X3Jlc3RhcnRfbnVtID0gY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bTsKKworICBvZmZzZXQtPmJpdHN0cmVhbV9vZmZzZXQgPQorICAgICAgKGpnZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvKSA8PCBMT0dfVFdPX0JJVF9CVUZfU0laRSkKKyAgICAgICsgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0OworCisgIG9mZnNldC0+Z2V0X2J1ZmZlciA9IGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXI7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciB0byBkZWNvZGUgdGhlIGltYWdlCisgKiBzdGFydGluZyBmcm9tIHRoZSBiaXRzdHJlYW0gcG9zaXRpb24gcmVjb3JkZWQgaW4gb2Zmc2V0LgorICovCitNRVRIT0RERUYodm9pZCkKK2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgc2hvcnQgaW50ICpkY19pbmZvID0gb2Zmc2V0LnByZXZfZGM7CisgIGludCBpOworICBqcGVnX2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoY2luZm8sIG9mZnNldCk7CisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7CisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbaV0gPSBkY19pbmZvW2ldOworICB9Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIEh1ZmZtYW4gZGVjb2RlciByZWFkZXIgcG9zaXRpb24gYW5kIGJpdCBidWZmZXIuCisgKi8KK0dMT0JBTCh2b2lkKQoranBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgb2Zmc2V0KQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisKKyAgLy8gUmVzdG9yZSByZXN0YXJ0c190b19nbyBhbmQgbmV4dF9yZXN0YXJ0X251bQorICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gb2Zmc2V0LnJlc3RhcnRzX3RvX2dvOworICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtID0gb2Zmc2V0Lm5leHRfcmVzdGFydF9udW07CisKKyAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQgPSBvZmZzZXQuYml0c3RyZWFtX29mZnNldDsKKyAgaW50IGJsa24sIGk7CisKKyAgdW5zaWduZWQgaW50IGJ5dGVfb2Zmc2V0ID0gYml0c3RyZWFtX29mZnNldCA+PiBMT0dfVFdPX0JJVF9CVUZfU0laRTsKKyAgdW5zaWduZWQgaW50IGJpdF9pbl9iaXRfYnVmZmVyID0KKyAgICAgIGJpdHN0cmVhbV9vZmZzZXQgJiAoKDEgPDwgTE9HX1RXT19CSVRfQlVGX1NJWkUpIC0gMSk7CisKKyAganNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0KGNpbmZvLCBieXRlX29mZnNldCwKKyAgICAgICAgICBiaXRfaW5fYml0X2J1ZmZlciwgb2Zmc2V0LmdldF9idWZmZXIpOworfQorCisvKgorICogRGVjb2RlIGFuZCByZXR1cm4gb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAorICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCisgKgorICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQorICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIEhBUyBCRUVOIFpFUk9FRCBCWSBUSEUgQ0FMTEVSLgorICogKFdob2xlc2FsZSB6ZXJvaW5nIGlzIHVzdWFsbHkgYSBsaXR0bGUgZmFzdGVyIHRoYW4gcmV0YWlsLi4uKQorICoKKyAqIFJldHVybnMgRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KKyAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKKyAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgorICogdGhpcyBtb2R1bGUsIHNpbmNlIHdlJ2xsIGp1c3QgcmUtYXNzaWduIHRoZW0gb24gdGhlIG5leHQgY2FsbC4pCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBibGtuOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBKQkxPQ0tST1cgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKyAgICAgIGRfZGVyaXZlZF90YmwgKiBkY3RibCA9IGVudHJvcHktPmRjX2N1cl90YmxzW2Jsa25dOworICAgICAgZF9kZXJpdmVkX3RibCAqIGFjdGJsID0gZW50cm9weS0+YWNfY3VyX3RibHNbYmxrbl07CisgICAgICByZWdpc3RlciBpbnQgcywgaywgcjsKKworICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCisKKyAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCisgICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgZGN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwxKTsKKyAgICAgIGlmIChzKSB7CisJQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwlyID0gR0VUX0JJVFMocyk7CisJcyA9IEhVRkZfRVhURU5EKHIsIHMpOworICAgICAgfQorCisgICAgICBpZiAoZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dKSB7CisJLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCisJaW50IGNpID0gY2luZm8tPk1DVV9tZW1iZXJzaGlwW2Jsa25dOworCXMgKz0gc3RhdGUubGFzdF9kY192YWxbY2ldOworCXN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7CisJLyogT3V0cHV0IHRoZSBEQyBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF0gPSAwKSAqLworCSgqYmxvY2spWzBdID0gKEpDT0VGKSBzOworICAgICAgfQorCisgICAgICBpZiAoZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dKSB7CisKKwkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCisJLyogU2luY2UgemVyb2VzIGFyZSBza2lwcGVkLCBvdXRwdXQgYXJlYSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlaGFuZCAqLworCWZvciAoayA9IDE7IGsgPCBEQ1RTSVpFMjsgaysrKSB7CisJICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgYWN0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKKyAgICAgIAorCSAgciA9IHMgPj4gNDsKKwkgIHMgJj0gMTU7CisgICAgICAKKwkgIGlmIChzKSB7CisJICAgIGsgKz0gcjsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgcywgcmV0dXJuIEZBTFNFKTsKKwkgICAgciA9IEdFVF9CSVRTKHMpOworCSAgICBzID0gSFVGRl9FWFRFTkQociwgcyk7CisJICAgIC8qIE91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIuCisJICAgICAqIE5vdGU6IHRoZSBleHRyYSBlbnRyaWVzIGluIGpwZWdfbmF0dXJhbF9vcmRlcltdIHdpbGwgc2F2ZSB1cworCSAgICAgKiBpZiBrID49IERDVFNJWkUyLCB3aGljaCBjb3VsZCBoYXBwZW4gaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkLgorCSAgICAgKi8KKwkgICAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgczsKKwkgIH0gZWxzZSB7CisJICAgIGlmIChyICE9IDE1KQorCSAgICAgIGJyZWFrOworCSAgICBrICs9IDE1OworCSAgfQorCX0KKworICAgICAgfSBlbHNlIHsKKworCS8qIFNlY3Rpb24gRi4yLjIuMjogZGVjb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgKi8KKwkvKiBJbiB0aGlzIHBhdGggd2UganVzdCBkaXNjYXJkIHRoZSB2YWx1ZXMgKi8KKwlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgeworCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7CisgICAgICAKKwkgIHIgPSBzID4+IDQ7CisJICBzICY9IDE1OworICAgICAgCisJICBpZiAocykgeworCSAgICBrICs9IHI7CisJICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7CisJICAgIERST1BfQklUUyhzKTsKKwkgIH0gZWxzZSB7CisJICAgIGlmIChyICE9IDE1KQorCSAgICAgIGJyZWFrOworCSAgICBrICs9IDE1OworCSAgfQorCX0KKworICAgICAgfQorICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBEZWNvZGUgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCisgKiBUaGUgcHJvcG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBjYWxjdWxhdGUgdGhlCisgKiBkYXRhIGxlbmd0aCBvZiBvbmUgTUNVIGluIEh1ZmZtYW4tY29kZWQgZm9ybWF0LgorICogVGhlcmVmb3JlLCBhbGwgY29lZmZpY2llbnRzIGFyZSBkaXNjYXJkZWQuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCitkZWNvZGVfbWN1X2Rpc2NhcmRfY29lZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgYmxrbjsKKyAgQklUUkVBRF9TVEFURV9WQVJTOworICBzYXZhYmxlX3N0YXRlIHN0YXRlOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKKworICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLworICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7CisKKyAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCisKKyAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgeworICAgICAgZF9kZXJpdmVkX3RibCAqIGRjdGJsID0gZW50cm9weS0+ZGNfY3VyX3RibHNbYmxrbl07CisgICAgICBkX2Rlcml2ZWRfdGJsICogYWN0YmwgPSBlbnRyb3B5LT5hY19jdXJfdGJsc1tibGtuXTsKKyAgICAgIHJlZ2lzdGVyIGludCBzLCBrLCByOworCisgICAgICAvKiBEZWNvZGUgYSBzaW5nbGUgYmxvY2sncyB3b3J0aCBvZiBjb2VmZmljaWVudHMgKi8KKworICAgICAgLyogU2VjdGlvbiBGLjIuMi4xOiBkZWNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgKi8KKyAgICAgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBkY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIGRpc2NhcmQgYWxsIGNvZWZmaWNpZW50cyAqLworICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgeworCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKKwlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKKwlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgfQorICAgICAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKKyAgICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMyk7CisKKyAgICAgICAgciA9IHMgPj4gNDsKKyAgICAgICAgcyAmPSAxNTsKKworICAgICAgICBpZiAocykgeworICAgICAgICAgIGsgKz0gcjsKKyAgICAgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworICAgICAgICAgIERST1BfQklUUyhzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAociAhPSAxNSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGsgKz0gMTU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7CisgIGludCBpOworCisgIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZGVjb2RlcikpOworICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKKyAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmZfZGVjb2RlcjsKKyAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1OworICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdV9kaXNjYXJkX2NvZWYgPSBkZWNvZGVfbWN1X2Rpc2NhcmRfY29lZjsKKyAgZW50cm9weS0+cHViLmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIgPSBjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyOworICBlbnRyb3B5LT5wdWIuZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uID0KKyAgICAgICAgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uOworICBlbnRyb3B5LT5wdWIuaW5kZXggPSBOVUxMOworCisgIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKKyAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOworICB9Cit9CisKKy8qCisgKiBDYWxsIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIKKyAqLworR0xPQkFMKHZvaWQpCitqcGVnX2NyZWF0ZV9odWZmbWFuX2luZGV4KGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KQoreworICBpbnQgaSwgczsKKyAgaW5kZXgtPnNjYW5fY291bnQgPSAxOworICBpbmRleC0+dG90YWxfaU1DVV9yb3dzID0gY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKKyAgaW5kZXgtPnNjYW4gPSAoaHVmZm1hbl9zY2FuX2hlYWRlciopbWFsbG9jKGluZGV4LT5zY2FuX2NvdW50CisgICAgICAgICAgKiBzaXplb2YoaHVmZm1hbl9zY2FuX2hlYWRlcikpOworICBpbmRleC0+c2NhblswXS5vZmZzZXQgPSAoaHVmZm1hbl9vZmZzZXRfZGF0YSoqKW1hbGxvYyhjaW5mby0+dG90YWxfaU1DVV9yb3dzCisgICAgICAgICAgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopKTsKKyAgaW5kZXgtPnNjYW5bMF0ucHJldl9NQ1Vfb2Zmc2V0LmJpdHN0cmVhbV9vZmZzZXQgPSAwOworICBpbmRleC0+TUNVX3NhbXBsZV9zaXplID0gREVGQVVMVF9NQ1VfU0FNUExFX1NJWkU7CisKKyAgaW5kZXgtPm1lbV91c2VkID0gc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpCisgICAgICArIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgKiBzaXplb2YoaHVmZm1hbl9vZmZzZXRfZGF0YSopOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZGVzdHJveV9odWZmbWFuX2luZGV4KGh1ZmZtYW5faW5kZXggKmluZGV4KQoreworICAgIGludCBpLCBqOworICAgIGZvciAoaSA9IDA7IGkgPCBpbmRleC0+c2Nhbl9jb3VudDsgaSsrKSB7CisgICAgICAgIGZvcihqID0gMDsgaiA8IGluZGV4LT50b3RhbF9pTUNVX3Jvd3M7IGorKykgeworICAgICAgICAgICAgZnJlZShpbmRleC0+c2NhbltpXS5vZmZzZXRbal0pOworICAgICAgICB9CisgICAgICAgIGZyZWUoaW5kZXgtPnNjYW5baV0ub2Zmc2V0KTsKKyAgICB9CisgICAgZnJlZShpbmRleC0+c2Nhbik7Cit9CisKKy8qCisgKiBTZXQgdGhlIHJlYWRlciBieXRlIHBvc2l0aW9uIHRvIG9mZnNldAorICovCitHTE9CQUwodm9pZCkKK2pzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBvZmZzZXQpCit7CisgIGlmIChjaW5mby0+c3JjLT5zZWVrX2lucHV0X2RhdGEpIHsKKyAgICBjaW5mby0+c3JjLT5zZWVrX2lucHV0X2RhdGEoY2luZm8sIG9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gY2luZm8tPnNyYy0+Y3VycmVudF9vZmZzZXQgLSBvZmZzZXQ7CisgICAgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlID0gY2luZm8tPnNyYy0+c3RhcnRfaW5wdXRfYnl0ZSArIG9mZnNldDsKKyAgfQorfQorCisvKgorICogU2V0IHRoZSByZWFkZXIgYnl0ZSBwb3NpdGlvbiB0byBvZmZzZXQgYW5kIGJpdCBwb3NpdGlvbiB0byBiaXRfbGVmdAorICogd2l0aCBiaXQgYnVmZmVyIHNldCB0byBidWYuCisgKi8KK0dMT0JBTCh2b2lkKQoranNldF9pbnB1dF9zdHJlYW1fcG9zaXRpb25fYml0KGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGludCBieXRlX29mZnNldCwgaW50IGJpdF9sZWZ0LCBJTlQzMiBidWYpCit7CisgIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSBiaXRfbGVmdDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IGJ1ZjsKKworICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbihjaW5mbywgYnl0ZV9vZmZzZXQpOworfQorCisvKgorICogR2V0IHRoZSBjdXJyZW50IHJlYWRlciBieXRlIHBvc2l0aW9uLgorICovCitHTE9CQUwoaW50KQoramdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIGNpbmZvLT5zcmMtPmN1cnJlbnRfb2Zmc2V0IC0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkaHVmZi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkaHVmZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NjBhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRodWZmLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBqZGh1ZmYuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlY2xhcmF0aW9ucyBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzCisgKiB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgc2VxdWVudGlhbCBkZWNvZGVyIChqZGh1ZmYuYykgYW5kIHRoZQorICogcHJvZ3Jlc3NpdmUgZGVjb2RlciAoamRwaHVmZi5jKS4gIE5vIG90aGVyIG1vZHVsZXMgbmVlZCB0byBzZWUgdGhlc2UuCisgKi8KKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsCWpNa0REZXJpdmVkCisjZGVmaW5lIGpwZWdfZmlsbF9iaXRfYnVmZmVyCWpGaWxCaXRCdWYKKyNkZWZpbmUganBlZ19odWZmX2RlY29kZQlqSHVmRGVjb2RlCisjZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLworCisKKy8qIERlcml2ZWQgZGF0YSBjb25zdHJ1Y3RlZCBmb3IgZWFjaCBIdWZmbWFuIHRhYmxlICovCisKKyNkZWZpbmUgSFVGRl9MT09LQUhFQUQJOAkvKiAjIG9mIGJpdHMgb2YgbG9va2FoZWFkICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogQmFzaWMgdGFibGVzOiAoZWxlbWVudCBbMF0gb2YgZWFjaCBhcnJheSBpcyB1bnVzZWQpICovCisgIElOVDMyIG1heGNvZGVbMThdOwkJLyogbGFyZ2VzdCBjb2RlIG9mIGxlbmd0aCBrICgtMSBpZiBub25lKSAqLworICAvKiAobWF4Y29kZVsxN10gaXMgYSBzZW50aW5lbCB0byBlbnN1cmUganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzKSAqLworICBJTlQzMiB2YWxvZmZzZXRbMTddOwkJLyogaHVmZnZhbFtdIG9mZnNldCBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KKyAgLyogdmFsb2Zmc2V0W2tdID0gaHVmZnZhbFtdIGluZGV4IG9mIDFzdCBzeW1ib2wgb2YgY29kZSBsZW5ndGggaywgbGVzcworICAgKiB0aGUgc21hbGxlc3QgY29kZSBvZiBsZW5ndGggazsgc28gZ2l2ZW4gYSBjb2RlIG9mIGxlbmd0aCBrLCB0aGUKKyAgICogY29ycmVzcG9uZGluZyBzeW1ib2wgaXMgaHVmZnZhbFtjb2RlICsgdmFsb2Zmc2V0W2tdXQorICAgKi8KKworICAvKiBMaW5rIHRvIHB1YmxpYyBIdWZmbWFuIHRhYmxlIChuZWVkZWQgb25seSBpbiBqcGVnX2h1ZmZfZGVjb2RlKSAqLworICBKSFVGRl9UQkwgKnB1YjsKKworICAvKiBMb29rYWhlYWQgdGFibGVzOiBpbmRleGVkIGJ5IHRoZSBuZXh0IEhVRkZfTE9PS0FIRUFEIGJpdHMgb2YKKyAgICogdGhlIGlucHV0IGRhdGEgc3RyZWFtLiAgSWYgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGlzIG5vIG1vcmUKKyAgICogdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcsIHdlIGNhbiBvYnRhaW4gaXRzIGxlbmd0aCBhbmQKKyAgICogdGhlIGNvcnJlc3BvbmRpbmcgc3ltYm9sIGRpcmVjdGx5IGZyb20gdGhlc2UgdGFibGVzLgorICAgKi8KKyAgaW50IGxvb2tfbmJpdHNbMTw8SFVGRl9MT09LQUhFQURdOyAvKiAjIGJpdHMsIG9yIDAgaWYgdG9vIGxvbmcgKi8KKyAgVUlOVDggbG9va19zeW1bMTw8SFVGRl9MT09LQUhFQURdOyAvKiBzeW1ib2wsIG9yIHVudXNlZCAqLworfSBkX2Rlcml2ZWRfdGJsOworCisvKiBFeHBhbmQgYSBIdWZmbWFuIHRhYmxlIGRlZmluaXRpb24gaW50byB0aGUgZGVyaXZlZCBmb3JtYXQgKi8KK0VYVEVSTih2b2lkKSBqcGVnX21ha2VfZF9kZXJpdmVkX3RibAorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBpc0RDLCBpbnQgdGJsbm8sCisJICAgICBkX2Rlcml2ZWRfdGJsICoqIHBkdGJsKSk7CisKKworLyoKKyAqIEZldGNoaW5nIHRoZSBuZXh0IE4gYml0cyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaXMgYSB0aW1lLWNyaXRpY2FsIG9wZXJhdGlvbgorICogZm9yIHRoZSBIdWZmbWFuIGRlY29kZXJzLiAgV2UgaW1wbGVtZW50IGl0IHdpdGggYSBjb21iaW5hdGlvbiBvZiBpbmxpbmUKKyAqIG1hY3JvcyBhbmQgb3V0LW9mLWxpbmUgc3Vicm91dGluZXMuICBOb3RlIHRoYXQgTiAodGhlIG51bWJlciBvZiBiaXRzCisgKiBkZW1hbmRlZCBhdCBvbmUgdGltZSkgbmV2ZXIgZXhjZWVkcyAxNSBmb3IgSlBFRyB1c2UuCisgKgorICogV2UgcmVhZCBzb3VyY2UgYnl0ZXMgaW50byBnZXRfYnVmZmVyIGFuZCBkb2xlIG91dCBiaXRzIGFzIG5lZWRlZC4KKyAqIElmIGdldF9idWZmZXIgYWxyZWFkeSBjb250YWlucyBlbm91Z2ggYml0cywgdGhleSBhcmUgZmV0Y2hlZCBpbi1saW5lCisgKiBieSB0aGUgbWFjcm9zIENIRUNLX0JJVF9CVUZGRVIgYW5kIEdFVF9CSVRTLiAgV2hlbiB0aGVyZSBhcmVuJ3QgZW5vdWdoCisgKiBiaXRzLCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBpcyBjYWxsZWQ7IGl0IHdpbGwgYXR0ZW1wdCB0byBmaWxsIGdldF9idWZmZXIKKyAqIGFzIGZ1bGwgYXMgcG9zc2libGUgKG5vdCBqdXN0IHRvIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQ7IHRoaXMKKyAqIHByZWZldGNoaW5nIHJlZHVjZXMgdGhlIG92ZXJoZWFkIGNvc3Qgb2YgY2FsbGluZyBqcGVnX2ZpbGxfYml0X2J1ZmZlcikuCisgKiBOb3RlIHRoYXQganBlZ19maWxsX2JpdF9idWZmZXIgbWF5IHJldHVybiBGQUxTRSB0byBpbmRpY2F0ZSBzdXNwZW5zaW9uLgorICogT24gVFJVRSByZXR1cm4sIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGd1YXJhbnRlZXMgdGhhdCBnZXRfYnVmZmVyIGNvbnRhaW5zCisgKiBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIC0tLSBkdW1teSB6ZXJvZXMgYXJlIGluc2VydGVkIGlmCisgKiBuZWNlc3NhcnkuCisgKi8KKwordHlwZWRlZiBJTlQzMiBiaXRfYnVmX3R5cGU7CS8qIHR5cGUgb2YgYml0LWV4dHJhY3Rpb24gYnVmZmVyICovCisjZGVmaW5lIEJJVF9CVUZfU0laRSAgMzIJLyogc2l6ZSBvZiBidWZmZXIgaW4gYml0cyAqLworI2RlZmluZSBMT0dfVFdPX0JJVF9CVUZfU0laRSAgNQkvKiBsb2dfMihCSVRfQlVGX1NJWkUpICovCisKKy8qIElmIGxvbmcgaXMgPiAzMiBiaXRzIG9uIHlvdXIgbWFjaGluZSwgYW5kIHNoaWZ0aW5nL21hc2tpbmcgbG9uZ3MgaXMKKyAqIHJlYXNvbmFibHkgZmFzdCwgbWFraW5nIGJpdF9idWZfdHlwZSBiZSBsb25nIGFuZCBzZXR0aW5nIEJJVF9CVUZfU0laRQorICogYXBwcm9wcmlhdGVseSBzaG91bGQgYmUgYSB3aW4uICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGRlZmluZSB0aGUgc2l6ZQorICogd2l0aCBzb21ldGhpbmcgbGlrZSAgI2RlZmluZSBCSVRfQlVGX1NJWkUgKHNpemVvZihiaXRfYnVmX3R5cGUpKjgpCisgKiBiZWNhdXNlIG5vdCBhbGwgbWFjaGluZXMgbWVhc3VyZSBzaXplb2YgaW4gOC1iaXQgYnl0ZXMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyBzdGF0ZSBzYXZlZCBhY3Jvc3MgTUNVcyAqLworICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KKyAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KK30gYml0cmVhZF9wZXJtX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBCaXRyZWFkaW5nIHdvcmtpbmcgc3RhdGUgd2l0aGluIGFuIE1DVSAqLworICAvKiBDdXJyZW50IGRhdGEgc291cmNlIGxvY2F0aW9uICovCisgIC8qIFdlIG5lZWQgYSBjb3B5LCByYXRoZXIgdGhhbiBtdW5naW5nIHRoZSBvcmlnaW5hbCwgaW4gY2FzZSBvZiBzdXNwZW5zaW9uICovCisgIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBzb3VyY2UgKi8KKyAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gc291cmNlIGJ1ZmZlciAqLworICAvKiBCaXQgaW5wdXQgYnVmZmVyIC0tLSBub3RlIHRoZXNlIHZhbHVlcyBhcmUga2VwdCBpbiByZWdpc3RlciB2YXJpYWJsZXMsCisgICAqIG5vdCBpbiB0aGlzIHN0cnVjdCwgaW5zaWRlIHRoZSBpbm5lciBsb29wcy4KKyAgICovCisgIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOwkvKiBjdXJyZW50IGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLworICBpbnQgYml0c19sZWZ0OwkJLyogIyBvZiB1bnVzZWQgYml0cyBpbiBpdCAqLworICAvKiBQb2ludGVyIG5lZWRlZCBieSBqcGVnX2ZpbGxfYml0X2J1ZmZlci4gKi8KKyAgal9kZWNvbXByZXNzX3B0ciBjaW5mbzsJLyogYmFjayBsaW5rIHRvIGRlY29tcHJlc3MgbWFzdGVyIHJlY29yZCAqLworfSBiaXRyZWFkX3dvcmtpbmdfc3RhdGU7CisKKy8qIE1hY3JvcyB0byBkZWNsYXJlIGFuZCBsb2FkL3NhdmUgYml0cmVhZCBsb2NhbCB2YXJpYWJsZXMuICovCisjZGVmaW5lIEJJVFJFQURfU1RBVEVfVkFSUyAgXAorCXJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOyAgXAorCXJlZ2lzdGVyIGludCBiaXRzX2xlZnQ7ICBcCisJYml0cmVhZF93b3JraW5nX3N0YXRlIGJyX3N0YXRlCisKKyNkZWZpbmUgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCisJYnJfc3RhdGUuY2luZm8gPSBjaW5mb3A7IFwKKwlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBjaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlOyBcCisJYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsgXAorCWdldF9idWZmZXIgPSBwZXJtc3RhdGUuZ2V0X2J1ZmZlcjsgXAorCWJpdHNfbGVmdCA9IHBlcm1zdGF0ZS5iaXRzX2xlZnQ7CisKKyNkZWZpbmUgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCisJY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSA9IGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZTsgXAorCWNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXI7IFwKKwlwZXJtc3RhdGUuZ2V0X2J1ZmZlciA9IGdldF9idWZmZXI7IFwKKwlwZXJtc3RhdGUuYml0c19sZWZ0ID0gYml0c19sZWZ0CisKKy8qCisgKiBUaGVzZSBtYWNyb3MgcHJvdmlkZSB0aGUgaW4tbGluZSBwb3J0aW9uIG9mIGJpdCBmZXRjaGluZy4KKyAqIFVzZSBDSEVDS19CSVRfQlVGRkVSIHRvIGVuc3VyZSB0aGVyZSBhcmUgTiBiaXRzIGluIGdldF9idWZmZXIKKyAqIGJlZm9yZSB1c2luZyBHRVRfQklUUywgUEVFS19CSVRTLCBvciBEUk9QX0JJVFMuCisgKiBUaGUgdmFyaWFibGVzIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbHMsCisgKiBidXQgdGhlIHN0YXRlIHN0cnVjdCBtaWdodCBub3QgYmUgKGpwZWdfaHVmZl9kZWNvZGUgbmVlZHMgdGhpcykuCisgKglDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG4sYWN0aW9uKTsKKyAqCQlFbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyOyBpZiBzdXNwZW5kLCB0YWtlIGFjdGlvbi4KKyAqICAgICAgdmFsID0gR0VUX0JJVFMobik7CisgKgkJRmV0Y2ggbmV4dCBOIGJpdHMuCisgKiAgICAgIHZhbCA9IFBFRUtfQklUUyhuKTsKKyAqCQlGZXRjaCBuZXh0IE4gYml0cyB3aXRob3V0IHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgYnVmZmVyLgorICoJRFJPUF9CSVRTKG4pOworICoJCURpc2NhcmQgbmV4dCBOIGJpdHMuCisgKiBUaGUgdmFsdWUgTiBzaG91bGQgYmUgYSBzaW1wbGUgdmFyaWFibGUsIG5vdCBhbiBleHByZXNzaW9uLCBiZWNhdXNlIGl0CisgKiBpcyBldmFsdWF0ZWQgbXVsdGlwbGUgdGltZXMuCisgKi8KKworI2RlZmluZSBDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG5iaXRzLGFjdGlvbikgXAorCXsgaWYgKGJpdHNfbGVmdCA8IChuYml0cykpIHsgIFwKKwkgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJihzdGF0ZSksZ2V0X2J1ZmZlcixiaXRzX2xlZnQsbmJpdHMpKSAgXAorCSAgICAgIHsgYWN0aW9uOyB9ICBcCisJICAgIGdldF9idWZmZXIgPSAoc3RhdGUpLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IChzdGF0ZSkuYml0c19sZWZ0OyB9IH0KKworI2RlZmluZSBHRVRfQklUUyhuYml0cykgXAorCSgoKGludCkgKGdldF9idWZmZXIgPj4gKGJpdHNfbGVmdCAtPSAobmJpdHMpKSkpICYgKCgxPDwobmJpdHMpKS0xKSkKKworI2RlZmluZSBQRUVLX0JJVFMobmJpdHMpIFwKKwkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLSAgKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCisKKyNkZWZpbmUgRFJPUF9CSVRTKG5iaXRzKSBcCisJKGJpdHNfbGVmdCAtPSAobmJpdHMpKQorCisvKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KK0VYVEVSTihib29sZWFuKSBqcGVnX2ZpbGxfYml0X2J1ZmZlcgorCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAorCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgaW50IG5iaXRzKSk7CisKKworLyoKKyAqIENvZGUgZm9yIGV4dHJhY3RpbmcgbmV4dCBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmcm9tIGlucHV0IGJpdCBzdHJlYW0uCisgKiBBZ2FpbiwgdGhpcyBpcyB0aW1lLWNyaXRpY2FsIGFuZCB3ZSBtYWtlIHRoZSBtYWluIHBhdGhzIGJlIG1hY3Jvcy4KKyAqCisgKiBXZSB1c2UgYSBsb29rYWhlYWQgdGFibGUgdG8gcHJvY2VzcyBjb2RlcyBvZiB1cCB0byBIVUZGX0xPT0tBSEVBRCBiaXRzCisgKiB3aXRob3V0IGxvb3BpbmcuICBVc3VhbGx5LCBtb3JlIHRoYW4gOTUlIG9mIHRoZSBIdWZmbWFuIGNvZGVzIHdpbGwgYmUgOAorICogb3IgZmV3ZXIgYml0cyBsb25nLiAgVGhlIGZldyBvdmVybGVuZ3RoIGNvZGVzIGFyZSBoYW5kbGVkIHdpdGggYSBsb29wLAorICogd2hpY2ggbmVlZCBub3QgYmUgaW5saW5lIGNvZGUuCisgKgorICogTm90ZXMgYWJvdXQgdGhlIEhVRkZfREVDT0RFIG1hY3JvOgorICogMS4gTmVhciB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlZ21lbnQsIHdlIG1heSBmYWlsIHRvIGdldCBlbm91Z2ggYml0cworICogICAgZm9yIGEgbG9va2FoZWFkLiAgSW4gdGhhdCBjYXNlLCB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkuCisgKiAyLiBJZiB0aGUgbG9va2FoZWFkIHRhYmxlIGNvbnRhaW5zIG5vIGVudHJ5LCB0aGUgbmV4dCBjb2RlIG11c3QgYmUKKyAqICAgIG1vcmUgdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcuCisgKiAzLiBqcGVnX2h1ZmZfZGVjb2RlIHJldHVybnMgLTEgaWYgZm9yY2VkIHRvIHN1c3BlbmQuCisgKi8KKworI2RlZmluZSBIVUZGX0RFQ09ERShyZXN1bHQsc3RhdGUsaHRibCxmYWlsYWN0aW9uLHNsb3dsYWJlbCkgXAoreyByZWdpc3RlciBpbnQgbmIsIGxvb2s7IFwKKyAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKKyAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsIDApKSB7ZmFpbGFjdGlvbjt9IFwKKyAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCisgICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKKyAgICAgIG5iID0gMTsgZ290byBzbG93bGFiZWw7IFwKKyAgICB9IFwKKyAgfSBcCisgIGxvb2sgPSBQRUVLX0JJVFMoSFVGRl9MT09LQUhFQUQpOyBcCisgIGlmICgobmIgPSBodGJsLT5sb29rX25iaXRzW2xvb2tdKSAhPSAwKSB7IFwKKyAgICBEUk9QX0JJVFMobmIpOyBcCisgICAgcmVzdWx0ID0gaHRibC0+bG9va19zeW1bbG9va107IFwKKyAgfSBlbHNlIHsgXAorICAgIG5iID0gSFVGRl9MT09LQUhFQUQrMTsgXAorc2xvd2xhYmVsOiBcCisgICAgaWYgKChyZXN1bHQ9anBlZ19odWZmX2RlY29kZSgmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsaHRibCxuYikpIDwgMCkgXAorCXsgZmFpbGFjdGlvbjsgfSBcCisgICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAorICB9IFwKK30KKworLyogT3V0LW9mLWxpbmUgY2FzZSBmb3IgSHVmZm1hbiBjb2RlIGZldGNoaW5nICovCitFWFRFUk4oaW50KSBqcGVnX2h1ZmZfZGVjb2RlCisJSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCisJICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRpbnB1dC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjYxYzFhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkaW5wdXQuYwpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIGpkaW5wdXQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGlucHV0IGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBjb250cm9sbGluZyB0aGUgZGVjb21wcmVzc29yJ3MgaW5wdXQKKyAqIHByb2Nlc3NpbmcgKG1hcmtlciByZWFkaW5nIGFuZCBjb2VmZmljaWVudCBkZWNvZGluZykuICBUaGUgYWN0dWFsIGlucHV0CisgKiByZWFkaW5nIGlzIGRvbmUgaW4gamRtYXJrZXIuYywgamRodWZmLmMsIGFuZCBqZHBodWZmLmMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgc3RhdGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIGJvb2xlYW4gaW5oZWFkZXJzOwkJLyogVFJVRSB1bnRpbCBmaXJzdCBTT1MgaXMgcmVhY2hlZCAqLworfSBteV9pbnB1dF9jb250cm9sbGVyOworCit0eXBlZGVmIG15X2lucHV0X2NvbnRyb2xsZXIgKiBteV9pbnB1dGN0bF9wdHI7CisKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRihpbnQpIGNvbnN1bWVfbWFya2VycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK01FVEhPRERFRihpbnQpIGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXggSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikpOworCisKKy8qCisgKiBSb3V0aW5lcyB0byBjYWxjdWxhdGUgdmFyaW91cyBxdWFudGl0aWVzIHJlbGF0ZWQgdG8gdGhlIHNpemUgb2YgdGhlIGltYWdlLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0aWFsX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ2FsbGVkIG9uY2UsIHdoZW4gZmlyc3QgU09TIG1hcmtlciBpcyByZWFjaGVkICovCit7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gSSBjYW4gaGFuZGxlICovCisgIGlmICgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04gfHwKKyAgICAgIChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggPiAobG9uZykgSlBFR19NQVhfRElNRU5TSU9OKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIEpQRUdfTUFYX0RJTUVOU0lPTik7CisKKyAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KKyAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKKworICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLworICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCisJICAgICBNQVhfQ09NUE9ORU5UUyk7CisKKyAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLworICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOworICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8CisJY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKKyAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAorCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOworICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCisJCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgIH0KKworICAvKiBXZSBpbml0aWFsaXplIERDVF9zY2FsZWRfc2l6ZSBhbmQgbWluX0RDVF9zY2FsZWRfc2l6ZSB0byBEQ1RTSVpFLgorICAgKiBJbiB0aGUgZnVsbCBkZWNvbXByZXNzb3IsIHRoaXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGpkbWFzdGVyLmM7CisgICAqIGJ1dCBpbiB0aGUgdHJhbnNjb2RlciwgamRtYXN0ZXIuYyBpcyBub3QgdXNlZCwgc28gd2UgbXVzdCBkbyBpdCBoZXJlLgorICAgKi8KKyAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOworCisgIC8qIENvbXB1dGUgZGltZW5zaW9ucyBvZiBjb21wb25lbnRzICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplID0gRENUU0laRTsKKyAgICAvKiBTaXplIGluIERDVCBibG9ja3MgKi8KKyAgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqIChsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgLyogZG93bnNhbXBsZWRfd2lkdGggYW5kIGRvd25zYW1wbGVkX2hlaWdodCB3aWxsIGFsc28gYmUgb3ZlcnJpZGRlbiBieQorICAgICAqIGpkbWFzdGVyLmMgaWYgd2UgYXJlIGRvaW5nIGZ1bGwgZGVjb21wcmVzc2lvbi4gIFRoZSB0cmFuc2NvZGVyIGxpYnJhcnkKKyAgICAgKiBkb2Vzbid0IHVzZSB0aGVzZSB2YWx1ZXMsIGJ1dCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtaWdodC4KKyAgICAgKi8KKyAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCisJCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKKyAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKKwkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOworICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCwgdW50aWwgY29sb3IgY29udmVyc2lvbiBzYXlzIG90aGVyd2lzZSAqLworICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOworICAgIC8qIE1hcmsgbm8gcXVhbnRpemF0aW9uIHRhYmxlIHlldCBzYXZlZCBmb3IgY29tcG9uZW50ICovCisgICAgY29tcHB0ci0+cXVhbnRfdGFibGUgPSBOVUxMOworICB9CisKKyAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MuICovCisgIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgPSAoSkRJTUVOU0lPTikKKyAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAorCQkgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKKworICAvKiBEZWNpZGUgd2hldGhlciBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIHNjYW5zICovCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8IGNpbmZvLT5udW1fY29tcG9uZW50cyB8fCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKKyAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IFRSVUU7CisgIGVsc2UKKyAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOworICBjaW5mby0+b3JpZ2luYWxfaW1hZ2Vfd2lkdGggPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Cit9CisKK0xPQ0FMKHZvaWQpCitwZXJfc2Nhbl9zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KKy8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIHdlcmUgc2V0IGZyb20gU09TIG1hcmtlciAqLworeworICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgCisgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7CisgICAgCisgICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKyAgICAKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCisgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKKyAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKKyAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gMTsKKyAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbnMsIGl0IGlzIGNvbnZlbmllbnQgdG8gZGVmaW5lIGxhc3Rfcm93X2hlaWdodAorICAgICAqIGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgcm93cyBwcmVzZW50IGluIHRoZSBsYXN0IGlNQ1Ugcm93LgorICAgICAqLworICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCA9IHRtcDsKKyAgICAKKyAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAxOworICAgIGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFswXSA9IDA7CisgICAgCisgIH0gZWxzZSB7CisgICAgCisgICAgLyogSW50ZXJsZWF2ZWQgKG11bHRpLWNvbXBvbmVudCkgc2NhbiAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA8PSAwIHx8IGNpbmZvLT5jb21wc19pbl9zY2FuID4gTUFYX0NPTVBTX0lOX1NDQU4pCisgICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5jb21wc19pbl9zY2FuLAorCSAgICAgICBNQVhfQ09NUFNfSU5fU0NBTik7CisgICAgCisgICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KKyAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7CisgICAgCisgICAgY2luZm8tPmJsb2Nrc19pbl9NQ1UgPSAwOworICAgIAorICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgLyogU2FtcGxpbmcgZmFjdG9ycyBnaXZlICMgb2YgYmxvY2tzIG9mIGNvbXBvbmVudCBpbiBlYWNoIE1DVSAqLworICAgICAgY29tcHB0ci0+TUNVX3dpZHRoID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgICAgY29tcHB0ci0+TUNVX2Jsb2NrcyA9IGNvbXBwdHItPk1DVV93aWR0aCAqIGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgICAgLyogRmlndXJlIG51bWJlciBvZiBub24tZHVtbXkgYmxvY2tzIGluIGxhc3QgTUNVIGNvbHVtbiAmIHJvdyAqLworICAgICAgdG1wID0gKGludCkgKGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV93aWR0aCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV93aWR0aDsKKyAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOworI2lmZGVmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgICAgIGlmIChjaW5mby0+dGlsZV9kZWNvZGUpIHsKKyAgICAgICAgdG1wID0gKGludCkgKGpkaXZfcm91bmRfdXAoY2luZm8tPmltYWdlX3dpZHRoLCA4KQorICAgICAgICAgICAgICAgICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKKyAgICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1Vfd2lkdGg7CisgICAgICAgIGNvbXBwdHItPmxhc3RfY29sX3dpZHRoID0gdG1wOworICAgICAgfQorI2VuZGlmCisKKyAgICAgIHRtcCA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX2hlaWdodCk7CisgICAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPk1DVV9oZWlnaHQ7CisgICAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7CisgICAgICAvKiBQcmVwYXJlIGFycmF5IGRlc2NyaWJpbmcgTUNVIGNvbXBvc2l0aW9uICovCisgICAgICBtY3VibGtzID0gY29tcHB0ci0+TUNVX2Jsb2NrczsKKyAgICAgIGlmIChjaW5mby0+YmxvY2tzX2luX01DVSArIG1jdWJsa3MgPiBEX01BWF9CTE9DS1NfSU5fTUNVKQorCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX01DVV9TSVpFKTsKKyAgICAgIHdoaWxlIChtY3VibGtzLS0gPiAwKSB7CisJY2luZm8tPk1DVV9tZW1iZXJzaGlwW2NpbmZvLT5ibG9ja3NfaW5fTUNVKytdID0gY2k7CisgICAgICB9CisgICAgfQorICAgIAorICB9Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19kZWNvbXByZXNzX3Blcl9zY2FuX3NldHVwKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOworfQorCisKKworLyoKKyAqIFNhdmUgYXdheSBhIGNvcHkgb2YgdGhlIFEtdGFibGUgcmVmZXJlbmNlZCBieSBlYWNoIGNvbXBvbmVudCBwcmVzZW50CisgKiBpbiB0aGUgY3VycmVudCBzY2FuLCB1bmxlc3MgYWxyZWFkeSBzYXZlZCBkdXJpbmcgYSBwcmlvciBzY2FuLgorICoKKyAqIEluIGEgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGUsIHRoZSBlbmNvZGVyIGNvdWxkIGFzc2lnbiBkaWZmZXJlbnQgY29tcG9uZW50cworICogdGhlIHNhbWUgUS10YWJsZSBzbG90IG51bWJlciwgYnV0IGNoYW5nZSB0YWJsZSBkZWZpbml0aW9ucyBiZXR3ZWVuIHNjYW5zCisgKiBzbyB0aGF0IGVhY2ggY29tcG9uZW50IHVzZXMgYSBkaWZmZXJlbnQgUS10YWJsZS4gIChUaGUgSUpHIGVuY29kZXIgaXMgbm90CisgKiBjdXJyZW50bHkgY2FwYWJsZSBvZiBkb2luZyB0aGlzLCBidXQgb3RoZXIgZW5jb2RlcnMgbWlnaHQuKSAgU2luY2Ugd2Ugd2FudAorICogdG8gYmUgYWJsZSB0byBkZXF1YW50aXplIGFsbCB0aGUgY29tcG9uZW50cyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCB0aGlzCisgKiBtZWFucyB0aGF0IHdlIGhhdmUgdG8gc2F2ZSBhd2F5IHRoZSB0YWJsZSBhY3R1YWxseSB1c2VkIGZvciBlYWNoIGNvbXBvbmVudC4KKyAqIFdlIGRvIHRoaXMgYnkgY29weWluZyB0aGUgdGFibGUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGNvbnRhaW5pbmcKKyAqIHRoZSBjb21wb25lbnQuCisgKiBUaGUgSlBFRyBzcGVjIHByb2hpYml0cyB0aGUgZW5jb2RlciBmcm9tIGNoYW5naW5nIHRoZSBjb250ZW50cyBvZiBhIFEtdGFibGUKKyAqIHNsb3QgYmV0d2VlbiBzY2FucyBvZiBhIGNvbXBvbmVudCB1c2luZyB0aGF0IHNsb3QuICBJZiB0aGUgZW5jb2RlciBkb2VzIHNvCisgKiBhbnl3YXksIHRoaXMgZGVjb2RlciB3aWxsIHNpbXBseSB1c2UgdGhlIFEtdGFibGUgdmFsdWVzIHRoYXQgd2VyZSBjdXJyZW50CisgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IHNjYW4gZm9yIHRoZSBjb21wb25lbnQuCisgKgorICogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBsb29rcyBvbmx5IGF0IHRoZSBzYXZlZCBxdWFudCB0YWJsZXMsCisgKiBub3QgYXQgdGhlIGN1cnJlbnQgUS10YWJsZSBzbG90cy4KKyAqLworCitMT0NBTCh2b2lkKQorbGF0Y2hfcXVhbnRfdGFibGVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBpbnQgY2ksIHF0YmxubzsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqIHF0Ymw7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgIC8qIE5vIHdvcmsgaWYgd2UgYWxyZWFkeSBzYXZlZCBRLXRhYmxlIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIGlmIChjb21wcHRyLT5xdWFudF90YWJsZSAhPSBOVUxMKQorICAgICAgY29udGludWU7CisgICAgLyogTWFrZSBzdXJlIHNwZWNpZmllZCBxdWFudGl6YXRpb24gdGFibGUgaXMgcHJlc2VudCAqLworICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKKyAgICBpZiAocXRibG5vIDwgMCB8fCBxdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKKwljaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSA9PSBOVUxMKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHF0Ymxubyk7CisgICAgLyogT0ssIHNhdmUgYXdheSB0aGUgcXVhbnRpemF0aW9uIHRhYmxlICovCisgICAgcXRibCA9IChKUVVBTlRfVEJMICopCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKEpRVUFOVF9UQkwpKTsKKyAgICBNRU1DT1BZKHF0YmwsIGNpbmZvLT5xdWFudF90YmxfcHRyc1txdGJsbm9dLCBTSVpFT0YoSlFVQU5UX1RCTCkpOworICAgIGNvbXBwdHItPnF1YW50X3RhYmxlID0gcXRibDsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbnB1dCBtb2R1bGVzIHRvIHJlYWQgYSBzY2FuIG9mIGNvbXByZXNzZWQgZGF0YS4KKyAqIFRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgaXMgZG9uZSBieSBqZG1hc3Rlci5jIGFmdGVyIGluaXRpYWxpemluZworICogdGhlIGVudGlyZSBkZWNvbXByZXNzb3IgKGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MpLgorICogU3Vic2VxdWVudCBjYWxscyBjb21lIGZyb20gY29uc3VtZV9tYXJrZXJzLCBiZWxvdy4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKKyAgbGF0Y2hfcXVhbnRfdGFibGVzKGNpbmZvKTsKKyAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvKTsKKyAgKCpjaW5mby0+Y29lZi0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0ID0gY2luZm8tPmNvZWYtPmNvbnN1bWVfZGF0YTsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQorICAgICAgICBjaW5mby0+Y29lZi0+Y29uc3VtZV9kYXRhX2J1aWxkX2h1ZmZtYW5faW5kZXg7Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhZnRlciBpbnB1dHRpbmcgYSBjb21wcmVzc2VkLWRhdGEgc2Nhbi4KKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFmdGVyIGl0J3MgcmVhZCBhbGwKKyAqIHRoZSBleHBlY3RlZCBkYXRhIG9mIHRoZSBzY2FuLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKKyAgY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQorICAgICAgICBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OworfQorCisKK01FVEhPRERFRihpbnQpCitjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IGN1cnJlbnRfc2NhbikKK3sKKyAgICByZXR1cm4gY29uc3VtZV9tYXJrZXJzKGNpbmZvKTsKK30KKy8qCisgKiBSZWFkIEpQRUcgbWFya2VycyBiZWZvcmUsIGJldHdlZW4sIG9yIGFmdGVyIGNvbXByZXNzZWQtZGF0YSBzY2Fucy4KKyAqIENoYW5nZSBzdGF0ZSBhcyBuZWNlc3Nhcnkgd2hlbiBhIG5ldyBzY2FuIGlzIHJlYWNoZWQuCisgKiBSZXR1cm4gdmFsdWUgaXMgSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCisgKgorICogVGhlIGNvbnN1bWVfaW5wdXQgbWV0aG9kIHBvaW50ZXIgcG9pbnRzIGVpdGhlciBoZXJlIG9yIHRvIHRoZQorICogY29lZmZpY2llbnQgY29udHJvbGxlcidzIGNvbnN1bWVfZGF0YSByb3V0aW5lLCBkZXBlbmRpbmcgb24gd2hldGhlcgorICogd2UgYXJlIHJlYWRpbmcgYSBjb21wcmVzc2VkIGRhdGEgc2VnbWVudCBvciBpbnRlci1zZWdtZW50IG1hcmtlcnMuCisgKi8KKworTUVUSE9EREVGKGludCkKK2NvbnN1bWVfbWFya2VycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOworICBpbnQgdmFsOworCisgIGlmIChpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkKSAvKiBBZnRlciBoaXR0aW5nIEVPSSwgcmVhZCBubyBmdXJ0aGVyICovCisgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7CisKKyAgdmFsID0gKCpjaW5mby0+bWFya2VyLT5yZWFkX21hcmtlcnMpIChjaW5mbyk7CisKKyAgc3dpdGNoICh2YWwpIHsKKyAgY2FzZSBKUEVHX1JFQUNIRURfU09TOgkvKiBGb3VuZCBTT1MgKi8KKyAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiAxc3QgU09TICovCisgICAgICBpbml0aWFsX3NldHVwKGNpbmZvKTsKKyAgICAgIGlucHV0Y3RsLT5pbmhlYWRlcnMgPSBGQUxTRTsKKyAgICAgIC8qIE5vdGU6IHN0YXJ0X2lucHV0X3Bhc3MgbXVzdCBiZSBjYWxsZWQgYnkgamRtYXN0ZXIuYworICAgICAgICogYmVmb3JlIGFueSBtb3JlIGlucHV0IGNhbiBiZSBjb25zdW1lZC4gIGpkYXBpbWluLmMgaXMKKyAgICAgICAqIHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgdGhpcyBzZXF1ZW5jaW5nLgorICAgICAgICovCisgICAgfSBlbHNlIHsJCQkvKiAybmQgb3IgbGF0ZXIgU09TIG1hcmtlciAqLworICAgICAgaWYgKCEgaW5wdXRjdGwtPnB1Yi5oYXNfbXVsdGlwbGVfc2NhbnMpCisJRVJSRVhJVChjaW5mbywgSkVSUl9FT0lfRVhQRUNURUQpOyAvKiBPb3BzLCBJIHdhc24ndCBleHBlY3RpbmcgdGhpcyEgKi8KKyAgICAgIHN0YXJ0X2lucHV0X3Bhc3MoY2luZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKUEVHX1JFQUNIRURfRU9JOgkvKiBGb3VuZCBFT0kgKi8KKyAgICBpbnB1dGN0bC0+cHViLmVvaV9yZWFjaGVkID0gVFJVRTsKKyAgICBpZiAoaW5wdXRjdGwtPmluaGVhZGVycykgewkvKiBUYWJsZXMtb25seSBkYXRhc3RyZWFtLCBhcHBhcmVudGx5ICovCisgICAgICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9OT19TT1MpOworICAgIH0gZWxzZSB7CisgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY29lZiBjdGxyJ3MgZGVjb21wcmVzc19kYXRhIHJvdXRpbmUKKyAgICAgICAqIGlmIHVzZXIgc2V0IG91dHB1dF9zY2FuX251bWJlciBsYXJnZXIgdGhhbiBudW1iZXIgb2Ygc2NhbnMuCisgICAgICAgKi8KKyAgICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID4gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyKQorCWNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIgPSBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXI7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpQRUdfU1VTUEVOREVEOgorICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHZhbDsKK30KKworCisvKgorICogUmVzZXQgc3RhdGUgdG8gYmVnaW4gYSBmcmVzaCBkYXRhc3RyZWFtLgorICovCisKK01FVEhPRERFRih2b2lkKQorcmVzZXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsID0gKG15X2lucHV0Y3RsX3B0cikgY2luZm8tPmlucHV0Y3RsOworCisgIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKKyAgaW5wdXRjdGwtPnB1Yi5jb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXggPQorICAgICAgICBjb25zdW1lX21hcmtlcnNfd2l0aF9odWZmbWFuX2luZGV4OworICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCisgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKKyAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7CisgIC8qIFJlc2V0IG90aGVyIG1vZHVsZXMgKi8KKyAgKCpjaW5mby0+ZXJyLT5yZXNldF9lcnJvcl9tZ3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICgqY2luZm8tPm1hcmtlci0+cmVzZXRfbWFya2VyX3JlYWRlcikgKGNpbmZvKTsKKyAgLyogUmVzZXQgcHJvZ3Jlc3Npb24gc3RhdGUgLS0gd291bGQgYmUgY2xlYW5lciBpZiBlbnRyb3B5IGRlY29kZXIgZGlkIHRoaXMgKi8KKyAgY2luZm8tPmNvZWZfYml0cyA9IE5VTEw7Cit9CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGlucHV0IGNvbnRyb2xsZXIgbW9kdWxlLgorICogVGhpcyBpcyBjYWxsZWQgb25seSBvbmNlLCB3aGVuIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBpcyBjcmVhdGVkLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfaW5wdXRfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfaW5wdXRjdGxfcHRyIGlucHV0Y3RsOworCisgIC8qIENyZWF0ZSBzdWJvYmplY3QgaW4gcGVybWFuZW50IHBvb2wgKi8KKyAgaW5wdXRjdGwgPSAobXlfaW5wdXRjdGxfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCVNJWkVPRihteV9pbnB1dF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5pbnB1dGN0bCA9IChzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyICopIGlucHV0Y3RsOworICAvKiBJbml0aWFsaXplIG1ldGhvZCBwb2ludGVycyAqLworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7CisgIGlucHV0Y3RsLT5wdWIucmVzZXRfaW5wdXRfY29udHJvbGxlciA9IHJlc2V0X2lucHV0X2NvbnRyb2xsZXI7CisgIGlucHV0Y3RsLT5wdWIuc3RhcnRfaW5wdXRfcGFzcyA9IHN0YXJ0X2lucHV0X3Bhc3M7CisgIGlucHV0Y3RsLT5wdWIuZmluaXNoX2lucHV0X3Bhc3MgPSBmaW5pc2hfaW5wdXRfcGFzczsKKworICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfbWFya2VycyA9IGNvbnN1bWVfbWFya2Vyc193aXRoX2h1ZmZtYW5faW5kZXg7CisgIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dF9idWlsZF9odWZmbWFuX2luZGV4ID0KKyAgICAgICAgY29uc3VtZV9tYXJrZXJzX3dpdGhfaHVmZm1hbl9pbmRleDsKKyAgLyogSW5pdGlhbGl6ZSBzdGF0ZTogY2FuJ3QgdXNlIHJlc2V0X2lucHV0X2NvbnRyb2xsZXIgc2luY2Ugd2UgZG9uJ3QKKyAgICogd2FudCB0byB0cnkgdG8gcmVzZXQgb3RoZXIgbW9kdWxlcyB5ZXQuCisgICAqLworICBpbnB1dGN0bC0+cHViLmhhc19tdWx0aXBsZV9zY2FucyA9IEZBTFNFOyAvKiAidW5rbm93biIgd291bGQgYmUgYmV0dGVyICovCisgIGlucHV0Y3RsLT5wdWIuZW9pX3JlYWNoZWQgPSBGQUxTRTsKKyAgaW5wdXRjdGwtPmluaGVhZGVycyA9IFRSVUU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRtYWluY3QuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1haW5jdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzk1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRtYWluY3QuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqIGpkbWFpbmN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KKyAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3BlciBhbmQgdGhlCisgKiBwb3N0LXByb2Nlc3NvcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgYnlwYXNzZWQgaW4gcmF3LWRhdGEgbW9kZSwgc2luY2UgdGhlIGFwcGxpY2F0aW9uCisgKiBzdXBwbGllcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgbWFpbiBidWZmZXIgaW4gdGhhdCBjYXNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCisvKgorICogSW4gdGhlIGN1cnJlbnQgc3lzdGVtIGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIG5lZWQgbmV2ZXIgYmUgYSBmdWxsLWltYWdlCisgKiBidWZmZXI7IGFueSBmdWxsLWhlaWdodCBidWZmZXJzIHdpbGwgYmUgZm91bmQgaW5zaWRlIHRoZSBjb2VmZmljaWVudCBvcgorICogcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlcnMuICBOb25ldGhlbGVzcywgdGhlIG1haW4gY29udHJvbGxlciBpcyBub3QKKyAqIHRyaXZpYWwuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgZm9yIHVwc2FtcGxpbmcvCisgKiByZXNjYWxpbmcsIGFuZCBkb2luZyB0aGlzIGluIGFuIGVmZmljaWVudCBmYXNoaW9uIGlzIGEgYml0IHRyaWNreS4KKyAqCisgKiBQb3N0cHJvY2Vzc29yIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAorICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCisgKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIChXZSByZXF1aXJlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMgdG8gYmUKKyAqIGNob3NlbiBzdWNoIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgaW50ZWdlcnMuICBJbiBwcmFjdGljZSBEQ1Rfc2NhbGVkX3NpemUKKyAqIHZhbHVlcyB3aWxsIGxpa2VseSBiZSBwb3dlcnMgb2YgdHdvLCBzbyB3ZSBhY3R1YWxseSBoYXZlIHRoZSBzdHJvbmdlcgorICogY29uZGl0aW9uIHRoYXQgRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyBhbiBpbnRlZ2VyLikKKyAqIFVwc2FtcGxpbmcgd2lsbCB0eXBpY2FsbHkgcHJvZHVjZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaAorICogcm93IGdyb3VwICh0aW1lcyBhbnkgYWRkaXRpb25hbCBzY2FsZSBmYWN0b3IgdGhhdCB0aGUgdXBzYW1wbGVyIGlzCisgKiBhcHBseWluZykuCisgKgorICogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgd2lsbCBkZWxpdmVyIGRhdGEgdG8gdXMgb25lIGlNQ1Ugcm93IGF0IGEgdGltZTsKKyAqIGVhY2ggaU1DVSByb3cgY29udGFpbnMgdl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cywgb3IKKyAqIGV4YWN0bHkgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzLiAgKFRoaXMgYW1vdW50IG9mIGRhdGEgY29ycmVzcG9uZHMKKyAqIHRvIG9uZSByb3cgb2YgTUNVcyB3aGVuIHRoZSBpbWFnZSBpcyBmdWxseSBpbnRlcmxlYXZlZC4pICBOb3RlIHRoYXQgdGhlCisgKiBudW1iZXIgb2Ygc2FtcGxlIHJvd3MgdmFyaWVzIGFjcm9zcyBjb21wb25lbnRzLCBidXQgdGhlIG51bWJlciBvZiByb3cKKyAqIGdyb3VwcyBkb2VzIG5vdC4gIFNvbWUgZ2FyYmFnZSBzYW1wbGUgcm93cyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3QgaU1DVQorICogcm93IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgorICoKKyAqIERlcGVuZGluZyBvbiB0aGUgdmVydGljYWwgc2NhbGluZyBhbGdvcml0aG0gdXNlZCwgdGhlIHVwc2FtcGxlciBtYXkgbmVlZAorICogYWNjZXNzIHRvIHRoZSBzYW1wbGUgcm93KHMpIGFib3ZlIGFuZCBiZWxvdyBpdHMgY3VycmVudCBpbnB1dCByb3cgZ3JvdXAuCisgKiBUaGUgdXBzYW1wbGVyIGlzIHJlcXVpcmVkIHRvIHNldCBuZWVkX2NvbnRleHRfcm93cyBUUlVFIGF0IGdsb2JhbCBzZWxlY3Rpb24KKyAqIHRpbWUgaWYgc28uICBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIEZBTFNFLCB0aGlzIGNvbnRyb2xsZXIgY2FuIHNpbXBseQorICogb2J0YWluIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWUgZnJvbSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhbmQgZG9sZSBpdAorICogb3V0IGFzIHJvdyBncm91cHMgdG8gdGhlIHBvc3Rwcm9jZXNzb3IuCisgKgorICogV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBUUlVFLCB0aGlzIGNvbnRyb2xsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBidWZmZXIKKyAqIHBhc3NlZCB0byBwb3N0cHJvY2Vzc2luZyBjb250YWlucyBhdCBsZWFzdCBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2Ygc2FtcGxlcworICogYWJvdmUgYW5kIGJlbG93IHRoZSByb3cgZ3JvdXAocykgYmVpbmcgcHJvY2Vzc2VkLiAgTm90ZSB0aGF0IHRoZSBjb250ZXh0CisgKiByb3dzICJhYm92ZSIgdGhlIGZpcnN0IHBhc3NlZCByb3cgZ3JvdXAgYXBwZWFyIGF0IG5lZ2F0aXZlIHJvdyBvZmZzZXRzIGluCisgKiB0aGUgcGFzc2VkIGJ1ZmZlci4gIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHRoZSByZXF1aXJlZAorICogY29udGV4dCByb3dzIGFyZSBtYW51ZmFjdHVyZWQgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBzYW1wbGUKKyAqIHJvdzsgdGhpcyBhdm9pZHMgaGF2aW5nIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHVwc2FtcGxpbmcgaW5uZXIgbG9vcHMuCisgKgorICogVGhlIGFtb3VudCBvZiBjb250ZXh0IGlzIGZpeGVkIGF0IG9uZSByb3cgZ3JvdXAganVzdCBiZWNhdXNlIHRoYXQncyBhCisgKiBjb252ZW5pZW50IG51bWJlciBmb3IgdGhpcyBjb250cm9sbGVyIHRvIHdvcmsgd2l0aC4gIFRoZSBleGlzdGluZworICogdXBzYW1wbGVycyByZWFsbHkgb25seSBuZWVkIG9uZSBzYW1wbGUgcm93IG9mIGNvbnRleHQuICBBbiB1cHNhbXBsZXIKKyAqIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IG91dHB1dCByZXNjYWxpbmcgbWlnaHQgd2lzaCBmb3IgbW9yZSB0aGFuIG9uZSByb3cKKyAqIGdyb3VwIG9mIGNvbnRleHQgd2hlbiBzaHJpbmtpbmcgdGhlIGltYWdlOyB0b3VnaCwgd2UgZG9uJ3QgaGFuZGxlIHRoYXQuCisgKiAoVGhpcyBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBkb3duc2l6aW5nIHdpbGwgYmUgaGFuZGxlZCBtb3N0bHkKKyAqIGJ5IGFkanVzdGluZyB0aGUgRENUX3NjYWxlZF9zaXplIHZhbHVlcywgc28gdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhY3RvciBhdAorICogdGhlIHVwc2FtcGxlIHN0ZXAgbmVlZG4ndCBiZSBtdWNoIGxlc3MgdGhhbiBvbmUuKQorICoKKyAqIFRvIHByb3ZpZGUgdGhlIGRlc2lyZWQgY29udGV4dCwgd2UgaGF2ZSB0byByZXRhaW4gdGhlIGxhc3QgdHdvIHJvdyBncm91cHMKKyAqIG9mIG9uZSBpTUNVIHJvdyB3aGlsZSByZWFkaW5nIGluIHRoZSBuZXh0IGlNQ1Ugcm93LiAgKFRoZSBsYXN0IHJvdyBncm91cAorICogY2FuJ3QgYmUgcHJvY2Vzc2VkIHVudGlsIHdlIGhhdmUgYW5vdGhlciByb3cgZ3JvdXAgZm9yIGl0cyBiZWxvdy1jb250ZXh0LAorICogYW5kIHNvIHdlIGhhdmUgdG8gc2F2ZSB0aGUgbmV4dC10by1sYXN0IGdyb3VwIHRvbyBmb3IgaXRzIGFib3ZlLWNvbnRleHQuKQorICogV2UgY291bGQgZG8gdGhpcyBtb3N0IHNpbXBseSBieSBjb3B5aW5nIGRhdGEgYXJvdW5kIGluIG91ciBidWZmZXIsIGJ1dAorICogdGhhdCdkIGJlIHZlcnkgc2xvdy4gIFdlIGNhbiBhdm9pZCBjb3B5aW5nIGFueSBkYXRhIGJ5IGNyZWF0aW5nIGEgcmF0aGVyCisgKiBzdHJhbmdlIHBvaW50ZXIgc3RydWN0dXJlLiAgSGVyZSdzIGhvdyBpdCB3b3Jrcy4gIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlCisgKiBjb25zaXN0aW5nIG9mIE0rMiByb3cgZ3JvdXBzICh3aGVyZSBNID0gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyB0aGUgbnVtYmVyCisgKiBvZiByb3cgZ3JvdXBzIHBlciBpTUNVIHJvdykuICBXZSBjcmVhdGUgdHdvIHNldHMgb2YgcmVkdW5kYW50IHBvaW50ZXJzIHRvCisgKiB0aGUgd29ya3NwYWNlLiAgTGFiZWxpbmcgdGhlIHBoeXNpY2FsIHJvdyBncm91cHMgMCB0byBNKzEsIHRoZSBzeW50aGVzaXplZAorICogcG9pbnRlciBsaXN0cyBsb29rIGxpa2UgdGhpczoKKyAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCisgKiBtYXN0ZXIgcG9pbnRlciAtLT4gMCAgICAgICAgIG1hc3RlciBwb2ludGVyIC0tPiAwCisgKiAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgKiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICogICAgICAgICAgICAgICAgICAgTS0zICAgICAgICAgICAgICAgICAgICAgICAgICBNLTMKKyAqICAgICAgICAgICAgICAgICAgIE0tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0KKyAqICAgICAgICAgICAgICAgICAgIE0tMSAgICAgICAgICAgICAgICAgICAgICAgICAgTSsxCisgKiAgICAgICAgICAgICAgICAgICAgTSAgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMgorICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKKyAqICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAqIFdlIHJlYWQgYWx0ZXJuYXRlIGlNQ1Ugcm93cyB1c2luZyBlYWNoIG1hc3RlciBwb2ludGVyOyB0aHVzIHRoZSBsYXN0IHR3bworICogcm93IGdyb3VwcyBvZiB0aGUgcHJldmlvdXMgaU1DVSByb3cgcmVtYWluIHVuLW92ZXJ3cml0dGVuIGluIHRoZSB3b3Jrc3BhY2UuCisgKiBUaGUgcG9pbnRlciBsaXN0cyBhcmUgc2V0IHVwIHNvIHRoYXQgdGhlIHJlcXVpcmVkIGNvbnRleHQgcm93cyBhcHBlYXIgdG8KKyAqIGJlIGFkamFjZW50IHRvIHRoZSBwcm9wZXIgcGxhY2VzIHdoZW4gd2UgcGFzcyB0aGUgcG9pbnRlciBsaXN0cyB0byB0aGUKKyAqIHVwc2FtcGxlci4KKyAqCisgKiBUaGUgYWJvdmUgcGljdHVyZXMgZGVzY3JpYmUgdGhlIG5vcm1hbCBzdGF0ZSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KKyAqIEF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgZGlkZGxlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZQorICogdGhlIGZpcnN0IG9yIGxhc3Qgc2FtcGxlIHJvdyBhcyBuZWNlc3NhcnkgKHRoaXMgaXMgY2hlYXBlciB0aGFuIGNvcHlpbmcKKyAqIHNhbXBsZSByb3dzIGFyb3VuZCkuCisgKgorICogVGhpcyBzY2hlbWUgYnJlYWtzIGRvd24gaWYgTSA8IDIsIGllLCBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBJbiB0aGF0CisgKiBzaXR1YXRpb24gZWFjaCBpTUNVIHJvdyBwcm92aWRlcyBvbmx5IG9uZSByb3cgZ3JvdXAgc28gdGhlIGJ1ZmZlcmluZyBsb2dpYworICogbXVzdCBiZSBkaWZmZXJlbnQgKGVnLCB3ZSBtdXN0IHJlYWQgdHdvIGlNQ1Ugcm93cyBiZWZvcmUgd2UgY2FuIGVtaXQgdGhlCisgKiBmaXJzdCByb3cgZ3JvdXApLiAgRm9yIG5vdywgd2Ugc2ltcGx5IGRvIG5vdCBzdXBwb3J0IHByb3ZpZGluZyBjb250ZXh0CisgKiByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgVGhhdCBjb21iaW5hdGlvbiBzZWVtcyB1bmxpa2VseSB0bworICogYmUgd29ydGggcHJvdmlkaW5nIC0tLSBpZiBzb21lb25lIHdhbnRzIGEgMS84dGgtc2l6ZSBwcmV2aWV3LCB0aGV5IHByb2JhYmx5CisgKiB3YW50IGl0IHF1aWNrIGFuZCBkaXJ0eSwgc28gYSBjb250ZXh0LWZyZWUgdXBzYW1wbGVyIGlzIHN1ZmZpY2llbnQuCisgKi8KKworCisvKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHdvcmtzcGFjZSAoTSBvciBNKzIgcm93IGdyb3VwcykuICovCisgIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKKworICBib29sZWFuIGJ1ZmZlcl9mdWxsOwkJLyogSGF2ZSB3ZSBnb3R0ZW4gYW4gaU1DVSByb3cgZnJvbSBkZWNvZGVyPyAqLworICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgb3V0cHV0IHRvIHBvc3Rwcm9jZXNzb3IgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgY2FzZS4gKi8KKworICAvKiBUaGVzZSBhcmUgdGhlIG1hc3RlciBwb2ludGVycyB0byB0aGUgZnVubnktb3JkZXIgcG9pbnRlciBsaXN0cy4gKi8KKyAgSlNBTVBJTUFHRSB4YnVmZmVyWzJdOwkvKiBwb2ludGVycyB0byB3ZWlyZCBwb2ludGVyIGxpc3RzICovCisKKyAgaW50IHdoaWNocHRyOwkJCS8qIGluZGljYXRlcyB3aGljaCBwb2ludGVyIHNldCBpcyBub3cgaW4gdXNlICovCisgIGludCBjb250ZXh0X3N0YXRlOwkJLyogcHJvY2Vzc19kYXRhIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCisgIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOwkvKiByb3cgZ3JvdXBzIGF2YWlsYWJsZSB0byBwb3N0cHJvY2Vzc29yICovCisgIEpESU1FTlNJT04gaU1DVV9yb3dfY3RyOwkvKiBjb3VudHMgaU1DVSByb3dzIHRvIGRldGVjdCBpbWFnZSB0b3AvYm90ICovCit9IG15X21haW5fY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKKworLyogY29udGV4dF9zdGF0ZSB2YWx1ZXM6ICovCisjZGVmaW5lIENUWF9QUkVQQVJFX0ZPUl9JTUNVCTAJLyogbmVlZCB0byBwcmVwYXJlIGZvciBNQ1Ugcm93ICovCisjZGVmaW5lIENUWF9QUk9DRVNTX0lNQ1UJMQkvKiBmZWVkaW5nIGlNQ1UgdG8gcG9zdHByb2Nlc3NvciAqLworI2RlZmluZSBDVFhfUE9TVFBPTkVEX1JPVwkyCS8qIGZlZWRpbmcgcG9zdHBvbmVkIHJvdyBncm91cCAqLworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOworTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW4KKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECitNRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKKwkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorYWxsb2NfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMuCisgKiBUaGlzIGlzIGRvbmUgb25seSBvbmNlLCBub3Qgb25jZSBwZXIgcGFzcy4KKyAqLworeworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKyAgaW50IGNpLCByZ3JvdXA7CisgIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgeGJ1ZjsKKworICAvKiBHZXQgdG9wLWxldmVsIHNwYWNlIGZvciBjb21wb25lbnQgYXJyYXkgcG9pbnRlcnMuCisgICAqIFdlIGFsbG9jIGJvdGggYXJyYXlzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCisgICAqLworICBtYWluLT54YnVmZmVyWzBdID0gKEpTQU1QSU1BR0UpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMgKiAyICogU0laRU9GKEpTQU1QQVJSQVkpKTsKKyAgbWFpbi0+eGJ1ZmZlclsxXSA9IG1haW4tPnhidWZmZXJbMF0gKyBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisKKyAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKKyAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KKyAgICAvKiBHZXQgc3BhY2UgZm9yIHBvaW50ZXIgbGlzdHMgLS0tIE0rNCByb3cgZ3JvdXBzIGluIGVhY2ggbGlzdC4KKyAgICAgKiBXZSBhbGxvYyBib3RoIHBvaW50ZXIgbGlzdHMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KKyAgICAgKi8KKyAgICB4YnVmID0gKEpTQU1QQVJSQVkpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgMiAqIChyZ3JvdXAgKiAoTSArIDQpKSAqIFNJWkVPRihKU0FNUFJPVykpOworICAgIHhidWYgKz0gcmdyb3VwOwkJLyogd2FudCBvbmUgcm93IGdyb3VwIGF0IG5lZ2F0aXZlIG9mZnNldHMgKi8KKyAgICBtYWluLT54YnVmZmVyWzBdW2NpXSA9IHhidWY7CisgICAgeGJ1ZiArPSByZ3JvdXAgKiAoTSArIDQpOworICAgIG1haW4tPnhidWZmZXJbMV1bY2ldID0geGJ1ZjsKKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCittYWtlX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQ3JlYXRlIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzIGRpc2N1c3NlZCBpbiB0aGUgY29tbWVudHMgYWJvdmUuCisgKiBUaGUgYWN0dWFsIHdvcmtzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCAoaW4gbWFpbi0+YnVmZmVyKSwKKyAqIGFuZCB0aGUgc3BhY2UgZm9yIHRoZSBwb2ludGVyIGxpc3RzIGlzIGFsbG9jYXRlZCB0b28uCisgKiBUaGlzIHJvdXRpbmUganVzdCBmaWxscyBpbiB0aGUgY3VyaW91c2x5IG9yZGVyZWQgbGlzdHMuCisgKiBUaGlzIHdpbGwgYmUgcmVwZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIGJ1ZiwgeGJ1ZjAsIHhidWYxOworCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgeGJ1ZjAgPSBtYWluLT54YnVmZmVyWzBdW2NpXTsKKyAgICB4YnVmMSA9IG1haW4tPnhidWZmZXJbMV1bY2ldOworICAgIC8qIEZpcnN0IGNvcHkgdGhlIHdvcmtzcGFjZSBwb2ludGVycyBhcy1pcyAqLworICAgIGJ1ZiA9IG1haW4tPmJ1ZmZlcltjaV07CisgICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIChNICsgMik7IGkrKykgeworICAgICAgeGJ1ZjBbaV0gPSB4YnVmMVtpXSA9IGJ1ZltpXTsKKyAgICB9CisgICAgLyogSW4gdGhlIHNlY29uZCBsaXN0LCBwdXQgdGhlIGxhc3QgZm91ciByb3cgZ3JvdXBzIGluIHN3YXBwZWQgb3JkZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogMjsgaSsrKSB7CisgICAgICB4YnVmMVtyZ3JvdXAqKE0tMikgKyBpXSA9IGJ1ZltyZ3JvdXAqTSArIGldOworICAgICAgeGJ1ZjFbcmdyb3VwKk0gKyBpXSA9IGJ1ZltyZ3JvdXAqKE0tMikgKyBpXTsKKyAgICB9CisgICAgLyogVGhlIHdyYXBhcm91bmQgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKKyAgICAgKiAoc2VlIHNldF93cmFwYXJvdW5kX3BvaW50ZXJzLCBiZWxvdykuICBJbml0aWFsbHkgd2Ugd2FudCB0aGUgImFib3ZlIgorICAgICAqIHBvaW50ZXJzIHRvIGR1cGxpY2F0ZSB0aGUgZmlyc3QgYWN0dWFsIGRhdGEgbGluZS4gIFRoaXMgb25seSBuZWVkcworICAgICAqIHRvIGhhcHBlbiBpbiB4YnVmZmVyWzBdLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgeworICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFswXTsKKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTZXQgdXAgdGhlICJ3cmFwYXJvdW5kIiBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KKyAqIFRoaXMgY2hhbmdlcyB0aGUgcG9pbnRlciBsaXN0IHN0YXRlIGZyb20gdG9wLW9mLWltYWdlIHRvIHRoZSBub3JtYWwgc3RhdGUuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwOworICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworICBKU0FNUEFSUkFZIHhidWYwLCB4YnVmMTsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisgICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLworICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07CisgICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKKyAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbcmdyb3VwKihNKzEpICsgaV07CisgICAgICB4YnVmMVtpIC0gcmdyb3VwXSA9IHhidWYxW3Jncm91cCooTSsxKSArIGldOworICAgICAgeGJ1ZjBbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMFtpXTsKKyAgICAgIHhidWYxW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjFbaV07CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK3NldF9ib3R0b21fcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBDaGFuZ2UgdGhlIHBvaW50ZXIgbGlzdHMgdG8gZHVwbGljYXRlIHRoZSBsYXN0IHNhbXBsZSByb3cgYXQgdGhlIGJvdHRvbQorICogb2YgdGhlIGltYWdlLiAgd2hpY2hwdHIgaW5kaWNhdGVzIHdoaWNoIHhidWZmZXIgaG9sZHMgdGhlIGZpbmFsIGlNQ1Ugcm93LgorICogQWxzbyBzZXRzIHJvd2dyb3Vwc19hdmFpbCB0byBpbmRpY2F0ZSBudW1iZXIgb2Ygbm9uZHVtbXkgcm93IGdyb3VwcyBpbiByb3cuCisgKi8KK3sKKyAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47CisgIGludCBjaSwgaSwgcmdyb3VwLCBpTUNVaGVpZ2h0LCByb3dzX2xlZnQ7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIEpTQU1QQVJSQVkgeGJ1ZjsKKworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIENvdW50IHNhbXBsZSByb3dzIGluIG9uZSBpTUNVIHJvdyBhbmQgaW4gb25lIHJvdyBncm91cCAqLworICAgIGlNQ1VoZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOworICAgIHJncm91cCA9IGlNQ1VoZWlnaHQgLyBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICAvKiBDb3VudCBub25kdW1teSBzYW1wbGUgcm93cyByZW1haW5pbmcgZm9yIHRoaXMgY29tcG9uZW50ICovCisgICAgcm93c19sZWZ0ID0gKGludCkgKGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCAlIChKRElNRU5TSU9OKSBpTUNVaGVpZ2h0KTsKKyAgICBpZiAocm93c19sZWZ0ID09IDApIHJvd3NfbGVmdCA9IGlNQ1VoZWlnaHQ7CisgICAgLyogQ291bnQgbm9uZHVtbXkgcm93IGdyb3Vwcy4gIFNob3VsZCBnZXQgc2FtZSBhbnN3ZXIgZm9yIGVhY2ggY29tcG9uZW50LAorICAgICAqIHNvIHdlIG5lZWQgb25seSBkbyBpdCBvbmNlLgorICAgICAqLworICAgIGlmIChjaSA9PSAwKSB7CisgICAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKChyb3dzX2xlZnQtMSkgLyByZ3JvdXAgKyAxKTsKKyAgICB9CisgICAgLyogRHVwbGljYXRlIHRoZSBsYXN0IHJlYWwgc2FtcGxlIHJvdyByZ3JvdXAqMiB0aW1lczsgdGhpcyBwYWRzIG91dCB0aGUKKyAgICAgKiBsYXN0IHBhcnRpYWwgcm93Z3JvdXAgYW5kIGVuc3VyZXMgYXQgbGVhc3Qgb25lIGZ1bGwgcm93Z3JvdXAgb2YgY29udGV4dC4KKyAgICAgKi8KKyAgICB4YnVmID0gbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl1bY2ldOworICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKKyAgICAgIHhidWZbcm93c19sZWZ0ICsgaV0gPSB4YnVmW3Jvd3NfbGVmdC0xXTsKKyAgICB9CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICBzd2l0Y2ggKHBhc3NfbW9kZSkgeworICBjYXNlIEpCVUZfUEFTU19USFJVOgorICAgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7CisgICAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbjsKKyAgICAgIG1ha2VfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBDcmVhdGUgdGhlIHhidWZmZXJbXSBsaXN0cyAqLworICAgICAgbWFpbi0+d2hpY2hwdHIgPSAwOwkvKiBSZWFkIGZpcnN0IGlNQ1Ugcm93IGludG8geGJ1ZmZlclswXSAqLworICAgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOworICAgICAgbWFpbi0+aU1DVV9yb3dfY3RyID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLyogU2ltcGxlIGNhc2Ugd2l0aCBubyBjb250ZXh0IG5lZWRlZCAqLworICAgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKKyAgICB9CisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsJLyogTWFyayBidWZmZXIgZW1wdHkgKi8KKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICAgIGJyZWFrOworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKKyAgICAvKiBGb3IgbGFzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24sIGp1c3QgY3JhbmsgdGhlIHBvc3Rwcm9jZXNzb3IgKi8KKyAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3Q7CisgICAgYnJlYWs7CisjZW5kaWYKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEuCisgKiBUaGlzIGhhbmRsZXMgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIG5vIGNvbnRleHQgaXMgcmVxdWlyZWQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCit7CisgIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOworICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsKKworICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLworICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgeworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKQorICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KKyAgfQorCisgIC8qIFRoZXJlIGFyZSBhbHdheXMgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzIGluIGFuIGlNQ1Ugcm93LiAqLworICByb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgIC8qIE5vdGU6IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBtYXkgcGFzcyBleHRyYSBnYXJiYWdlIHJvdyBncm91cHMKKyAgICogdG8gdGhlIHBvc3Rwcm9jZXNzb3IuICBUaGUgcG9zdHByb2Nlc3NvciBoYXMgdG8gY2hlY2sgZm9yIGJvdHRvbQorICAgKiBvZiBpbWFnZSBhbnl3YXkgKGF0IHJvdyByZXNvbHV0aW9uKSwgc28gbm8gcG9pbnQgaW4gdXMgZG9pbmcgaXQgdG9vLgorICAgKi8KKworICAvKiBGZWVkIHRoZSBwb3N0cHJvY2Vzc29yICovCisgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlciwKKwkJCQkgICAgICZtYWluLT5yb3dncm91cF9jdHIsIHJvd2dyb3Vwc19hdmFpbCwKKwkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7CisKKyAgLyogSGFzIHBvc3Rwcm9jZXNzb3IgY29uc3VtZWQgYWxsIHRoZSBkYXRhIHlldD8gSWYgc28sIG1hcmsgYnVmZmVyIGVtcHR5ICovCisgIGlmIChtYWluLT5yb3dncm91cF9jdHIgPj0gcm93Z3JvdXBzX2F2YWlsKSB7CisgICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsKKyAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvbnRleHQgcm93cyBtdXN0IGJlIHByb3ZpZGVkLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKKworICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLworICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgeworICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLAorCQkJCQkgICBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSkpCisgICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IFRSVUU7CS8qIE9LLCB3ZSBoYXZlIGFuIGlNQ1Ugcm93IHRvIHdvcmsgd2l0aCAqLworICAgIG1haW4tPmlNQ1Vfcm93X2N0cisrOwkvKiBjb3VudCByb3dzIHJlY2VpdmVkICovCisgIH0KKworICAvKiBQb3N0cHJvY2Vzc29yIHR5cGljYWxseSB3aWxsIG5vdCBzd2FsbG93IGFsbCB0aGUgaW5wdXQgZGF0YSBpdCBpcyBoYW5kZWQKKyAgICogaW4gb25lIGNhbGwgKGR1ZSB0byBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0KS4gIE11c3QgYmUgcHJlcGFyZWQKKyAgICogdG8gZXhpdCBhbmQgcmVzdGFydC4gIFRoaXMgc3dpdGNoIGxldHMgdXMga2VlcCB0cmFjayBvZiBob3cgZmFyIHdlIGdvdC4KKyAgICogTm90ZSB0aGF0IGVhY2ggY2FzZSBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0IG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKyAgICovCisgIHN3aXRjaCAobWFpbi0+Y29udGV4dF9zdGF0ZSkgeworICBjYXNlIENUWF9QT1NUUE9ORURfUk9XOgorICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyBmb3IgcG9zdHBvbmVkIHJvdyAqLworICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAorCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAorCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLworICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKKyAgICBpZiAoKm91dF9yb3dfY3RyID49IG91dF9yb3dzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIFBvc3Rwcm9jZXNzb3IgZXhhY3RseSBmaWxsZWQgb3V0cHV0IGJ1ZiAqLworICAgIC8qRkFMTFRIUk9VR0gqLworICBjYXNlIENUWF9QUkVQQVJFX0ZPUl9JTUNVOgorICAgIC8qIFByZXBhcmUgdG8gcHJvY2VzcyBmaXJzdCBNLTEgcm93IGdyb3VwcyBvZiB0aGlzIGlNQ1Ugcm93ICovCisgICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKKyAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIC0gMSk7CisgICAgLyogQ2hlY2sgZm9yIGJvdHRvbSBvZiBpbWFnZTogaWYgc28sIHR3ZWFrIHBvaW50ZXJzIHRvICJkdXBsaWNhdGUiCisgICAgICogdGhlIGxhc3Qgc2FtcGxlIHJvdywgYW5kIGFkanVzdCByb3dncm91cHNfYXZhaWwgdG8gaWdub3JlIHBhZGRpbmcgcm93cy4KKyAgICAgKi8KKyAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCisgICAgICBzZXRfYm90dG9tX3BvaW50ZXJzKGNpbmZvKTsKKyAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BST0NFU1NfSU1DVTsKKyAgICAvKkZBTExUSFJPVUdIKi8KKyAgY2FzZSBDVFhfUFJPQ0VTU19JTUNVOgorICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyAqLworICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAorCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAorCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKKyAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQorICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLworICAgIC8qIEFmdGVyIHRoZSBmaXJzdCBpTUNVLCBjaGFuZ2Ugd3JhcGFyb3VuZCBwb2ludGVycyB0byBub3JtYWwgc3RhdGUgKi8KKyAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IDEpCisgICAgICBzZXRfd3JhcGFyb3VuZF9wb2ludGVycyhjaW5mbyk7CisgICAgLyogUHJlcGFyZSB0byBsb2FkIG5ldyBpTUNVIHJvdyB1c2luZyBvdGhlciB4YnVmZmVyIGxpc3QgKi8KKyAgICBtYWluLT53aGljaHB0ciBePSAxOwkvKiAwPT4xIG9yIDE9PjAgKi8KKyAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOworICAgIC8qIFN0aWxsIG5lZWQgdG8gcHJvY2VzcyBsYXN0IHJvdyBncm91cCBvZiB0aGlzIGlNQ1Ugcm93LCAqLworICAgIC8qIHdoaWNoIGlzIHNhdmVkIGF0IGluZGV4IE0rMSBvZiB0aGUgb3RoZXIgeGJ1ZmZlciAqLworICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAxKTsKKyAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMik7CisgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QT1NUUE9ORURfUk9XOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3Mgc29tZSBkYXRhLgorICogRmluYWwgcGFzcyBvZiB0d28tcGFzcyBxdWFudGl6YXRpb246IGp1c3QgY2FsbCB0aGUgcG9zdHByb2Nlc3Nvci4KKyAqIFNvdXJjZSBkYXRhIHdpbGwgYmUgdGhlIHBvc3Rwcm9jZXNzb3IgY29udHJvbGxlcidzIGludGVybmFsIGJ1ZmZlci4KKyAqLworCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKK01FVEhPRERFRih2b2lkKQorcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCwKKwkJCQkgICAgIChKRElNRU5TSU9OICopIE5VTEwsIChKRElNRU5TSU9OKSAwLAorCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX21haW5fY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9tYWluX3B0ciBtYWluOworICBpbnQgY2ksIHJncm91cCwgbmdyb3VwczsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBtYWluID0gKG15X21haW5fcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X21haW5fY29udHJvbGxlcikpOworICBjaW5mby0+bWFpbiA9IChzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqKSBtYWluOworICBtYWluLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKKworICBpZiAobmVlZF9mdWxsX2J1ZmZlcikJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisKKyAgLyogQWxsb2NhdGUgdGhlIHdvcmtzcGFjZS4KKyAgICogbmdyb3VwcyBpcyB0aGUgbnVtYmVyIG9mIHJvdyBncm91cHMgd2UgbmVlZC4KKyAgICovCisgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7CisgICAgaWYgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIDwgMikgLyogdW5zdXBwb3J0ZWQsIHNlZSBjb21tZW50cyBhYm92ZSAqLworICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKKyAgICBhbGxvY19mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIEFsbG9jIHNwYWNlIGZvciB4YnVmZmVyW10gbGlzdHMgKi8KKyAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyOworICB9IGVsc2UgeworICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgfQorCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KKyAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCisgICAgbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUsCisJCQkgKEpESU1FTlNJT04pIChyZ3JvdXAgKiBuZ3JvdXBzKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1hcmtlci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkbWFya2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzN2VkYgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1hcmtlci5jCkBAIC0wLDAgKzEsMTQwMiBAQAorLyoKKyAqIGpkbWFya2VyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byBkZWNvZGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCisgKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGFyaXNlcyBmcm9tIG91ciBkZXNpcmUgdG8gc3VwcG9ydCBpbnB1dAorICogc3VzcGVuc2lvbjogaWYgbm90IGFsbCBvZiB0aGUgZGF0YSBmb3IgYSBtYXJrZXIgaXMgYXZhaWxhYmxlLAorICogd2UgbXVzdCBleGl0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLiAgT24gcmVzdW1wdGlvbiwgd2UgcmVwcm9jZXNzCisgKiB0aGUgbWFya2VyLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworCit0eXBlZGVmIGVudW0gewkJCS8qIEpQRUcgbWFya2VyIGNvZGVzICovCisgIE1fU09GMCAgPSAweGMwLAorICBNX1NPRjEgID0gMHhjMSwKKyAgTV9TT0YyICA9IDB4YzIsCisgIE1fU09GMyAgPSAweGMzLAorICAKKyAgTV9TT0Y1ICA9IDB4YzUsCisgIE1fU09GNiAgPSAweGM2LAorICBNX1NPRjcgID0gMHhjNywKKyAgCisgIE1fSlBHICAgPSAweGM4LAorICBNX1NPRjkgID0gMHhjOSwKKyAgTV9TT0YxMCA9IDB4Y2EsCisgIE1fU09GMTEgPSAweGNiLAorICAKKyAgTV9TT0YxMyA9IDB4Y2QsCisgIE1fU09GMTQgPSAweGNlLAorICBNX1NPRjE1ID0gMHhjZiwKKyAgCisgIE1fREhUICAgPSAweGM0LAorICAKKyAgTV9EQUMgICA9IDB4Y2MsCisgIAorICBNX1JTVDAgID0gMHhkMCwKKyAgTV9SU1QxICA9IDB4ZDEsCisgIE1fUlNUMiAgPSAweGQyLAorICBNX1JTVDMgID0gMHhkMywKKyAgTV9SU1Q0ICA9IDB4ZDQsCisgIE1fUlNUNSAgPSAweGQ1LAorICBNX1JTVDYgID0gMHhkNiwKKyAgTV9SU1Q3ICA9IDB4ZDcsCisgIAorICBNX1NPSSAgID0gMHhkOCwKKyAgTV9FT0kgICA9IDB4ZDksCisgIE1fU09TICAgPSAweGRhLAorICBNX0RRVCAgID0gMHhkYiwKKyAgTV9ETkwgICA9IDB4ZGMsCisgIE1fRFJJICAgPSAweGRkLAorICBNX0RIUCAgID0gMHhkZSwKKyAgTV9FWFAgICA9IDB4ZGYsCisgIAorICBNX0FQUDAgID0gMHhlMCwKKyAgTV9BUFAxICA9IDB4ZTEsCisgIE1fQVBQMiAgPSAweGUyLAorICBNX0FQUDMgID0gMHhlMywKKyAgTV9BUFA0ICA9IDB4ZTQsCisgIE1fQVBQNSAgPSAweGU1LAorICBNX0FQUDYgID0gMHhlNiwKKyAgTV9BUFA3ICA9IDB4ZTcsCisgIE1fQVBQOCAgPSAweGU4LAorICBNX0FQUDkgID0gMHhlOSwKKyAgTV9BUFAxMCA9IDB4ZWEsCisgIE1fQVBQMTEgPSAweGViLAorICBNX0FQUDEyID0gMHhlYywKKyAgTV9BUFAxMyA9IDB4ZWQsCisgIE1fQVBQMTQgPSAweGVlLAorICBNX0FQUDE1ID0gMHhlZiwKKyAgCisgIE1fSlBHMCAgPSAweGYwLAorICBNX0pQRzEzID0gMHhmZCwKKyAgTV9DT00gICA9IDB4ZmUsCisgIAorICBNX1RFTSAgID0gMHgwMSwKKyAgCisgIE1fRVJST1IgPSAweDEwMAorfSBKUEVHX01BUktFUjsKKworCisvKiBQcml2YXRlIHN0YXRlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBBcHBsaWNhdGlvbi1vdmVycmlkYWJsZSBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzICovCisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19DT007CisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcHJvY2Vzc19BUFBuWzE2XTsKKworICAvKiBMaW1pdCBvbiBtYXJrZXIgZGF0YSBsZW5ndGggdG8gc2F2ZSBmb3IgZWFjaCBtYXJrZXIgdHlwZSAqLworICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0X0NPTTsKKyAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9BUFBuWzE2XTsKKworICAvKiBTdGF0dXMgb2YgQ09NL0FQUG4gbWFya2VyIHNhdmluZyAqLworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlcjsJLyogTlVMTCBpZiBub3QgcHJvY2Vzc2luZyBhIG1hcmtlciAqLworICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZDsJCS8qIGRhdGEgYnl0ZXMgcmVhZCBzbyBmYXIgaW4gbWFya2VyICovCisgIC8qIE5vdGU6IGN1cl9tYXJrZXIgaXMgbm90IGxpbmtlZCBpbnRvIG1hcmtlcl9saXN0IHVudGlsIGl0J3MgYWxsIHJlYWQuICovCit9IG15X21hcmtlcl9yZWFkZXI7CisKK3R5cGVkZWYgbXlfbWFya2VyX3JlYWRlciAqIG15X21hcmtlcl9wdHI7CisKKworLyoKKyAqIE1hY3JvcyBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUuCisgKgorICogQXQgYWxsIHRpbWVzLCBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGUgYW5kIC0+Ynl0ZXNfaW5fYnVmZmVyIHJlZmxlY3QKKyAqIHRoZSBjdXJyZW50IHJlc3RhcnQgcG9pbnQ7IHdlIHVwZGF0ZSB0aGVtIG9ubHkgd2hlbiB3ZSBoYXZlIHJlYWNoZWQgYQorICogc3VpdGFibGUgcGxhY2UgdG8gcmVzdGFydCBpZiBhIHN1c3BlbnNpb24gb2NjdXJzLgorICovCisKKy8qIERlY2xhcmUgYW5kIGluaXRpYWxpemUgbG9jYWwgY29waWVzIG9mIGlucHV0IHBvaW50ZXIvY291bnQgKi8KKyNkZWZpbmUgSU5QVVRfVkFSUyhjaW5mbykgIFwKKwlzdHJ1Y3QganBlZ19zb3VyY2VfbWdyICogZGF0YXNyYyA9IChjaW5mbyktPnNyYzsgIFwKKwljb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBkYXRhc3JjLT5uZXh0X2lucHV0X2J5dGU7ICBcCisJc2l6ZV90IGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlcgorCisvKiBVbmxvYWQgdGhlIGxvY2FsIGNvcGllcyAtLS0gZG8gdGhpcyBvbmx5IGF0IGEgcmVzdGFydCBib3VuZGFyeSAqLworI2RlZmluZSBJTlBVVF9TWU5DKGNpbmZvKSAgXAorCSggZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlID0gbmV4dF9pbnB1dF9ieXRlLCAgXAorCSAgZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyID0gYnl0ZXNfaW5fYnVmZmVyICkKKworLyogUmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIHVzZWQgb25seSBpbiBNQUtFX0JZVEVfQVZBSUwgKi8KKyNkZWZpbmUgSU5QVVRfUkVMT0FEKGNpbmZvKSAgXAorCSggbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlLCAgXAorCSAgYnl0ZXNfaW5fYnVmZmVyID0gZGF0YXNyYy0+Ynl0ZXNfaW5fYnVmZmVyICkKKworLyogSW50ZXJuYWwgbWFjcm8gZm9yIElOUFVUX0JZVEUgYW5kIElOUFVUXzJCWVRFUzogbWFrZSBhIGJ5dGUgYXZhaWxhYmxlLgorICogTm90ZSB3ZSBkbyAqbm90KiBkbyBJTlBVVF9TWU5DIGJlZm9yZSBjYWxsaW5nIGZpbGxfaW5wdXRfYnVmZmVyLAorICogYnV0IHdlIG11c3QgcmVsb2FkIHRoZSBsb2NhbCBjb3BpZXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGwuCisgKi8KKyNkZWZpbmUgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbikgIFwKKwlpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsgIFwKKwkgIGlmICghICgqZGF0YXNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpICBcCisJICAgIHsgYWN0aW9uOyB9ICBcCisJICBJTlBVVF9SRUxPQUQoY2luZm8pOyAgXAorCX0KKworLyogUmVhZCBhIGJ5dGUgaW50byB2YXJpYWJsZSBWLgorICogSWYgbXVzdCBzdXNwZW5kLCB0YWtlIHRoZSBzcGVjaWZpZWQgYWN0aW9uICh0eXBpY2FsbHkgInJldHVybiBGQUxTRSIpLgorICovCisjZGVmaW5lIElOUFVUX0JZVEUoY2luZm8sVixhY3Rpb24pICBcCisJTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCisJCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKKwkJICBWID0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKKworLyogQXMgYWJvdmUsIGJ1dCByZWFkIHR3byBieXRlcyBpbnRlcnByZXRlZCBhcyBhbiB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlci4KKyAqIFYgc2hvdWxkIGJlIGRlY2xhcmVkIHVuc2lnbmVkIGludCBvciBwZXJoYXBzIElOVDMyLgorICovCisjZGVmaW5lIElOUFVUXzJCWVRFUyhjaW5mbyxWLGFjdGlvbikgIFwKKwlNQUtFU1RNVCggTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKKwkJICBieXRlc19pbl9idWZmZXItLTsgXAorCQkgIFYgPSAoKHVuc2lnbmVkIGludCkgR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKykpIDw8IDg7IFwKKwkJICBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAorCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCisJCSAgViArPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsgKQorCisKKy8qCisgKiBSb3V0aW5lcyB0byBwcm9jZXNzIEpQRUcgbWFya2Vycy4KKyAqCisgKiBFbnRyeSBjb25kaXRpb246IEpQRUcgbWFya2VyIGl0c2VsZiBoYXMgYmVlbiByZWFkIGFuZCBpdHMgY29kZSBzYXZlZAorICogICBpbiBjaW5mby0+dW5yZWFkX21hcmtlcjsgaW5wdXQgcmVzdGFydCBwb2ludCBpcyBqdXN0IGFmdGVyIHRoZSBtYXJrZXIuCisgKgorICogRXhpdDogaWYgcmV0dXJuIFRSVUUsIGhhdmUgcmVhZCBhbmQgcHJvY2Vzc2VkIGFueSBwYXJhbWV0ZXJzLCBhbmQgaGF2ZQorICogICB1cGRhdGVkIHRoZSByZXN0YXJ0IHBvaW50IHRvIHBvaW50IGFmdGVyIHRoZSBwYXJhbWV0ZXJzLgorICogICBJZiByZXR1cm4gRkFMU0UsIHdhcyBmb3JjZWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgZW5kIG9mCisgKiAgIG1hcmtlciBwYXJhbWV0ZXJzOyByZXN0YXJ0IHBvaW50IGhhcyBub3QgYmVlbiBtb3ZlZC4gIFNhbWUgcm91dGluZQorICogICB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBhcHBsaWNhdGlvbiBzdXBwbGllcyBtb3JlIGlucHV0IGRhdGEuCisgKgorICogVGhpcyBhcHByb2FjaCB0byBzdXNwZW5zaW9uIGFzc3VtZXMgdGhhdCBhbGwgb2YgYSBtYXJrZXIncyBwYXJhbWV0ZXJzCisgKiBjYW4gZml0IGludG8gYSBzaW5nbGUgaW5wdXQgYnVmZmVybG9hZC4gIFRoaXMgc2hvdWxkIGhvbGQgZm9yICJub3JtYWwiCisgKiBtYXJrZXJzLiAgU29tZSBDT00vQVBQbiBtYXJrZXJzIG1pZ2h0IGhhdmUgbGFyZ2UgcGFyYW1ldGVyIHNlZ21lbnRzCisgKiB0aGF0IG1pZ2h0IG5vdCBmaXQuICBJZiB3ZSBhcmUgc2ltcGx5IGRyb3BwaW5nIHN1Y2ggYSBtYXJrZXIsIHdlIHVzZQorICogc2tpcF9pbnB1dF9kYXRhIHRvIGdldCBwYXN0IGl0LCBhbmQgdGhlcmVieSBwdXQgdGhlIHByb2JsZW0gb24gdGhlCisgKiBzb3VyY2UgbWFuYWdlcidzIHNob3VsZGVycy4gIElmIHdlIGFyZSBzYXZpbmcgdGhlIG1hcmtlcidzIGNvbnRlbnRzCisgKiBpbnRvIG1lbW9yeSwgd2UgdXNlIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGNvbnZlbnRpb246IHdoZW4gZm9yY2VkIHRvCisgKiBzdXNwZW5kLCB0aGUgbWFya2VyIHByb2Nlc3NvciB1cGRhdGVzIHRoZSByZXN0YXJ0IHBvaW50IHRvIHRoZSBlbmQgb2YKKyAqIHdoYXQgaXQncyBjb25zdW1lZCAoaWUsIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcikgYmVmb3JlIHJldHVybmluZyBGQUxTRS4KKyAqIE9uIHJlc3VtcHRpb24sIGNpbmZvLT51bnJlYWRfbWFya2VyIHN0aWxsIGNvbnRhaW5zIHRoZSBtYXJrZXIgY29kZSwKKyAqIGJ1dCB0aGUgZGF0YSBzb3VyY2Ugd2lsbCBwb2ludCB0byB0aGUgbmV4dCBjaHVuayBvZiBtYXJrZXIgZGF0YS4KKyAqIFRoZSBtYXJrZXIgcHJvY2Vzc29yIG11c3QgcmV0YWluIGludGVybmFsIHN0YXRlIHRvIGRlYWwgd2l0aCB0aGlzLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gYXZvaWQgZHVwbGljYXRlIHRyYWNlIG1lc3NhZ2VzIGlmIGEKKyAqIHN1c3BlbnNpb24gb2NjdXJzIHdpdGhpbiBtYXJrZXIgcGFyYW1ldGVycy4gIE90aGVyIHNpZGUgZWZmZWN0cworICogcmVxdWlyZSBtb3JlIGNhcmUuCisgKi8KKworCitMT0NBTChib29sZWFuKQorZ2V0X3NvaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFByb2Nlc3MgYW4gU09JIG1hcmtlciAqLworeworICBpbnQgaTsKKyAgCisgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfU09JKTsKKworICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPSSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPSV9EVVBMSUNBVEUpOworCisgIC8qIFJlc2V0IGFsbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlZmluZWQgdG8gYmUgcmVzZXQgYnkgU09JICovCisKKyAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKKyAgICBjaW5mby0+YXJpdGhfZGNfTFtpXSA9IDA7CisgICAgY2luZm8tPmFyaXRoX2RjX1VbaV0gPSAxOworICAgIGNpbmZvLT5hcml0aF9hY19LW2ldID0gNTsKKyAgfQorICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IDA7CisKKyAgLyogU2V0IGluaXRpYWwgYXNzdW1wdGlvbnMgZm9yIGNvbG9yc3BhY2UgZXRjICovCisKKyAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKKyAgY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcgPSBGQUxTRTsgLyogQXNzdW1lIG5vbi1DQ0lSIHNhbXBsaW5nPz8/ICovCisKKyAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IEZBTFNFOworICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gMTsgLyogc2V0IGRlZmF1bHQgSkZJRiBBUFAwIHZhbHVlcyAqLworICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gMTsKKyAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDA7CisgIGNpbmZvLT5YX2RlbnNpdHkgPSAxOworICBjaW5mby0+WV9kZW5zaXR5ID0gMTsKKyAgY2luZm8tPnNhd19BZG9iZV9tYXJrZXIgPSBGQUxTRTsKKyAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IDA7CisKKyAgY2luZm8tPm1hcmtlci0+c2F3X1NPSSA9IFRSVUU7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb2YgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJvZywgYm9vbGVhbiBpc19hcml0aCkKKy8qIFByb2Nlc3MgYSBTT0ZuIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBjLCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gaXNfcHJvZzsKKyAgY2luZm8tPmFyaXRoX2NvZGUgPSBpc19hcml0aDsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKworICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24sIHJldHVybiBGQUxTRSk7CisgIElOUFVUXzJCWVRFUyhjaW5mbywgY2luZm8tPmltYWdlX2hlaWdodCwgcmV0dXJuIEZBTFNFKTsKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBjaW5mby0+aW1hZ2Vfd2lkdGgsIHJldHVybiBGQUxTRSk7CisgIElOUFVUX0JZVEUoY2luZm8sIGNpbmZvLT5udW1fY29tcG9uZW50cywgcmV0dXJuIEZBTFNFKTsKKworICBsZW5ndGggLT0gODsKKworICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT0YsIGNpbmZvLT51bnJlYWRfbWFya2VyLAorCSAgIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCwgKGludCkgY2luZm8tPmltYWdlX2hlaWdodCwKKwkgICBjaW5mby0+bnVtX2NvbXBvbmVudHMpOworCisgIGlmIChjaW5mby0+bWFya2VyLT5zYXdfU09GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09GX0RVUExJQ0FURSk7CisKKyAgLyogV2UgZG9uJ3Qgc3VwcG9ydCBmaWxlcyBpbiB3aGljaCB0aGUgaW1hZ2UgaGVpZ2h0IGlzIGluaXRpYWxseSBzcGVjaWZpZWQgKi8KKyAgLyogYXMgMCBhbmQgaXMgbGF0ZXIgcmVkZWZpbmVkIGJ5IEROTC4gIEFzIGxvbmcgYXMgd2UgaGF2ZSB0byBjaGVjayB0aGF0LCAgKi8KKyAgLyogbWlnaHQgYXMgd2VsbCBoYXZlIGEgZ2VuZXJhbCBzYW5pdHkgY2hlY2suICovCisgIGlmIChjaW5mby0+aW1hZ2VfaGVpZ2h0IDw9IDAgfHwgY2luZm8tPmltYWdlX3dpZHRoIDw9IDAKKyAgICAgIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOworCisgIGlmIChsZW5ndGggIT0gKGNpbmZvLT5udW1fY29tcG9uZW50cyAqIDMpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgaWYgKGNpbmZvLT5jb21wX2luZm8gPT0gTlVMTCkJLyogZG8gb25seSBvbmNlLCBldmVuIGlmIHN1c3BlbmQgKi8KKyAgICBjaW5mby0+Y29tcF9pbmZvID0gKGpwZWdfY29tcG9uZW50X2luZm8gKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKwkJCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkgY2luZm8tPm51bV9jb21wb25lbnRzICogU0laRU9GKGpwZWdfY29tcG9uZW50X2luZm8pKTsKKyAgCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7CisgICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkLCByZXR1cm4gRkFMU0UpOworICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IChjID4+IDQpICYgMTU7CisgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IChjICAgICApICYgMTU7CisgICAgSU5QVVRfQllURShjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vLCByZXR1cm4gRkFMU0UpOworCisgICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GX0NPTVBPTkVOVCwKKwkgICAgIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKKwkgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIGNvbXBwdHItPnF1YW50X3RibF9ubyk7CisgIH0KKworICBjaW5mby0+bWFya2VyLT5zYXdfU09GID0gVFJVRTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9zb3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgU09TIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBpLCBjaSwgbiwgYywgY2M7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBpZiAoISBjaW5mby0+bWFya2VyLT5zYXdfU09GKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfU09TX05PX1NPRik7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisKKyAgSU5QVVRfQllURShjaW5mbywgbiwgcmV0dXJuIEZBTFNFKTsgLyogTnVtYmVyIG9mIGNvbXBvbmVudHMgKi8KKworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19TT1MsIG4pOworCisgIGlmIChsZW5ndGggIT0gKG4gKiAyICsgNikgfHwgbiA8IDEgfHwgbiA+IE1BWF9DT01QU19JTl9TQ0FOKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBuOworCisgIC8qIENvbGxlY3QgdGhlIGNvbXBvbmVudC1zcGVjIHBhcmFtZXRlcnMgKi8KKworICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgSU5QVVRfQllURShjaW5mbywgY2MsIHJldHVybiBGQUxTRSk7CisgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICAKKyAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworCSBjaSsrLCBjb21wcHRyKyspIHsKKyAgICAgIGlmIChjYyA9PSBjb21wcHRyLT5jb21wb25lbnRfaWQpCisJZ290byBpZF9mb3VuZDsKKyAgICB9CisKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfQ09NUE9ORU5UX0lELCBjYyk7CisKKyAgaWRfZm91bmQ6CisKKyAgICBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXSA9IGNvbXBwdHI7CisgICAgY29tcHB0ci0+ZGNfdGJsX25vID0gKGMgPj4gNCkgJiAxNTsKKyAgICBjb21wcHRyLT5hY190Ymxfbm8gPSAoYyAgICAgKSAmIDE1OworICAgIAorICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1NPU19DT01QT05FTlQsIGNjLAorCSAgICAgY29tcHB0ci0+ZGNfdGJsX25vLCBjb21wcHRyLT5hY190Ymxfbm8pOworICB9CisKKyAgLyogQ29sbGVjdCB0aGUgYWRkaXRpb25hbCBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbC4gKi8KKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNzID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPlNlID0gYzsKKyAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgY2luZm8tPkFoID0gKGMgPj4gNCkgJiAxNTsKKyAgY2luZm8tPkFsID0gKGMgICAgICkgJiAxNTsKKworICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19TT1NfUEFSQU1TLCBjaW5mby0+U3MsIGNpbmZvLT5TZSwKKwkgICBjaW5mby0+QWgsIGNpbmZvLT5BbCk7CisKKyAgLyogUHJlcGFyZSB0byBzY2FuIGRhdGEgJiByZXN0YXJ0IG1hcmtlcnMgKi8KKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IDA7CisKKyAgLyogQ291bnQgYW5vdGhlciBTT1MgbWFya2VyICovCisgIGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcisrOworCisgIElOUFVUX1NZTkMoY2luZm8pOworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVECisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZGFjIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERBQyBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICBpbnQgaW5kZXgsIHZhbDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7CisgIGxlbmd0aCAtPSAyOworICAKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCB2YWwsIHJldHVybiBGQUxTRSk7CisKKyAgICBsZW5ndGggLT0gMjsKKworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0RBQywgaW5kZXgsIHZhbCk7CisKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49ICgyKk5VTV9BUklUSF9UQkxTKSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RBQ19JTkRFWCwgaW5kZXgpOworCisgICAgaWYgKGluZGV4ID49IE5VTV9BUklUSF9UQkxTKSB7IC8qIGRlZmluZSBBQyB0YWJsZSAqLworICAgICAgY2luZm8tPmFyaXRoX2FjX0tbaW5kZXgtTlVNX0FSSVRIX1RCTFNdID0gKFVJTlQ4KSB2YWw7CisgICAgfSBlbHNlIHsJCQkvKiBkZWZpbmUgREMgdGFibGUgKi8KKyAgICAgIGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA9IChVSU5UOCkgKHZhbCAmIDB4MEYpOworICAgICAgY2luZm8tPmFyaXRoX2RjX1VbaW5kZXhdID0gKFVJTlQ4KSAodmFsID4+IDQpOworICAgICAgaWYgKGNpbmZvLT5hcml0aF9kY19MW2luZGV4XSA+IGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSkKKwlFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfVkFMVUUsIHZhbCk7CisgICAgfQorICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisjZWxzZSAvKiAhIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLworCisjZGVmaW5lIGdldF9kYWMoY2luZm8pICBza2lwX3ZhcmlhYmxlKGNpbmZvKQorCisjZW5kaWYgLyogRF9BUklUSF9DT0RJTkdfU1VQUE9SVEVEICovCisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kaHQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgREhUIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIFVJTlQ4IGJpdHNbMTddOworICBVSU5UOCBodWZmdmFsWzI1Nl07CisgIGludCBpLCBpbmRleCwgY291bnQ7CisgIEpIVUZGX1RCTCAqKmh0YmxwdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIHdoaWxlIChsZW5ndGggPiAxNikgeworICAgIElOUFVUX0JZVEUoY2luZm8sIGluZGV4LCByZXR1cm4gRkFMU0UpOworCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfREhULCBpbmRleCk7CisgICAgICAKKyAgICBiaXRzWzBdID0gMDsKKyAgICBjb3VudCA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKSB7CisgICAgICBJTlBVVF9CWVRFKGNpbmZvLCBiaXRzW2ldLCByZXR1cm4gRkFMU0UpOworICAgICAgY291bnQgKz0gYml0c1tpXTsKKyAgICB9CisKKyAgICBsZW5ndGggLT0gMSArIDE2OworCisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzFdLCBiaXRzWzJdLCBiaXRzWzNdLCBiaXRzWzRdLAorCSAgICAgYml0c1s1XSwgYml0c1s2XSwgYml0c1s3XSwgYml0c1s4XSk7CisgICAgVFJBQ0VNUzgoY2luZm8sIDIsIEpUUkNfSFVGRkJJVFMsCisJICAgICBiaXRzWzldLCBiaXRzWzEwXSwgYml0c1sxMV0sIGJpdHNbMTJdLAorCSAgICAgYml0c1sxM10sIGJpdHNbMTRdLCBiaXRzWzE1XSwgYml0c1sxNl0pOworCisgICAgLyogSGVyZSB3ZSBqdXN0IGRvIG1pbmltYWwgdmFsaWRhdGlvbiBvZiB0aGUgY291bnRzIHRvIGF2b2lkIHdhbGtpbmcKKyAgICAgKiBvZmYgdGhlIGVuZCBvZiBvdXIgdGFibGUgc3BhY2UuICBqZGh1ZmYuYyB3aWxsIGNoZWNrIG1vcmUgY2FyZWZ1bGx5LgorICAgICAqLworICAgIGlmIChjb3VudCA+IDI1NiB8fCAoKElOVDMyKSBjb3VudCkgPiBsZW5ndGgpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgSU5QVVRfQllURShjaW5mbywgaHVmZnZhbFtpXSwgcmV0dXJuIEZBTFNFKTsKKworICAgIGxlbmd0aCAtPSBjb3VudDsKKworICAgIGlmIChpbmRleCAmIDB4MTApIHsJCS8qIEFDIHRhYmxlIGRlZmluaXRpb24gKi8KKyAgICAgIGluZGV4IC09IDB4MTA7CisgICAgICBodGJscHRyID0gJmNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKKyAgICB9IGVsc2UgewkJCS8qIERDIHRhYmxlIGRlZmluaXRpb24gKi8KKyAgICAgIGh0YmxwdHIgPSAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaW5kZXhdOworICAgIH0KKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gTlVNX0hVRkZfVEJMUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RIVF9JTkRFWCwgaW5kZXgpOworCisgICAgaWYgKCpodGJscHRyID09IE5VTEwpCisgICAgICAqaHRibHB0ciA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIAorICAgIE1FTUNPUFkoKCpodGJscHRyKS0+Yml0cywgYml0cywgU0laRU9GKCgqaHRibHB0ciktPmJpdHMpKTsKKyAgICBNRU1DT1BZKCgqaHRibHB0ciktPmh1ZmZ2YWwsIGh1ZmZ2YWwsIFNJWkVPRigoKmh0YmxwdHIpLT5odWZmdmFsKSk7CisgIH0KKworICBpZiAobGVuZ3RoICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworTE9DQUwoYm9vbGVhbikKK2dldF9kcXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBQcm9jZXNzIGEgRFFUIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIGludCBuLCBpLCBwcmVjOworICB1bnNpZ25lZCBpbnQgdG1wOworICBKUVVBTlRfVEJMICpxdWFudF9wdHI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIElOUFVUX0JZVEUoY2luZm8sIG4sIHJldHVybiBGQUxTRSk7CisgICAgcHJlYyA9IG4gPj4gNDsKKyAgICBuICY9IDB4MEY7CisKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19EUVQsIG4sIHByZWMpOworCisgICAgaWYgKG4gPj0gTlVNX1FVQU5UX1RCTFMpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EUVRfSU5ERVgsIG4pOworICAgICAgCisgICAgaWYgKGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9PSBOVUxMKQorICAgICAgY2luZm8tPnF1YW50X3RibF9wdHJzW25dID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgcXVhbnRfcHRyID0gY2luZm8tPnF1YW50X3RibF9wdHJzW25dOworCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKKyAgICAgIGlmIChwcmVjKQorCUlOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOworICAgICAgZWxzZQorCUlOUFVUX0JZVEUoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKKyAgICAgIC8qIFdlIGNvbnZlcnQgdGhlIHppZ3phZy1vcmRlciB0YWJsZSB0byBuYXR1cmFsIGFycmF5IG9yZGVyLiAqLworICAgICAgcXVhbnRfcHRyLT5xdWFudHZhbFtqcGVnX25hdHVyYWxfb3JkZXJbaV1dID0gKFVJTlQxNikgdG1wOworICAgIH0KKworICAgIGlmIChjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA+PSAyKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkgKz0gOCkgeworCVRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX1FVQU5UVkFMUywKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaV0sICAgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzFdLAorCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzJdLCBxdWFudF9wdHItPnF1YW50dmFsW2krM10sCisJCSBxdWFudF9wdHItPnF1YW50dmFsW2krNF0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs1XSwKKwkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs2XSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzddKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBsZW5ndGggLT0gRENUU0laRTIrMTsKKyAgICBpZiAocHJlYykgbGVuZ3RoIC09IERDVFNJWkUyOworICB9CisKKyAgaWYgKGxlbmd0aCAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitnZXRfZHJpIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhIERSSSBtYXJrZXIgKi8KK3sKKyAgSU5UMzIgbGVuZ3RoOworICB1bnNpZ25lZCBpbnQgdG1wOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgCisgIGlmIChsZW5ndGggIT0gNCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgdG1wLCByZXR1cm4gRkFMU0UpOworCisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0RSSSwgdG1wKTsKKworICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IHRtcDsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFJvdXRpbmVzIGZvciBwcm9jZXNzaW5nIEFQUG4gYW5kIENPTSBtYXJrZXJzLgorICogVGhlc2UgYXJlIGVpdGhlciBzYXZlZCBpbiBtZW1vcnkgb3IgZGlzY2FyZGVkLCBwZXIgYXBwbGljYXRpb24gcmVxdWVzdC4KKyAqIEFQUDAgYW5kIEFQUDE0IGFyZSBzcGVjaWFsbHkgY2hlY2tlZCB0byBzZWUgaWYgdGhleSBhcmUKKyAqIEpGSUYgYW5kIEFkb2JlIG1hcmtlcnMsIHJlc3BlY3RpdmVseS4KKyAqLworCisjZGVmaW5lIEFQUDBfREFUQV9MRU4JMTQJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMCAqLworI2RlZmluZSBBUFAxNF9EQVRBX0xFTgkxMgkvKiBMZW5ndGggb2YgaW50ZXJlc3RpbmcgZGF0YSBpbiBBUFAxNCAqLworI2RlZmluZSBBUFBOX0RBVEFfTEVOCTE0CS8qIE11c3QgYmUgdGhlIGxhcmdlc3Qgb2YgdGhlIGFib3ZlISEgKi8KKworCitMT0NBTCh2b2lkKQorZXhhbWluZV9hcHAwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKT0NURVQgRkFSICogZGF0YSwKKwkgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQorLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAwLgorICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYSBKRklGIG1hcmtlci4KKyAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KKyAqLworeworICBJTlQzMiB0b3RhbGxlbiA9IChJTlQzMikgZGF0YWxlbiArIHJlbWFpbmluZzsKKworICBpZiAoZGF0YWxlbiA+PSBBUFAwX0RBVEFfTEVOICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDQ5ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg0NiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKKyAgICAvKiBGb3VuZCBKRklGIEFQUDAgbWFya2VyOiBzYXZlIGluZm8gKi8KKyAgICBjaW5mby0+c2F3X0pGSUZfbWFya2VyID0gVFJVRTsKKyAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNV0pOworICAgIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBHRVRKT0NURVQoZGF0YVs2XSk7CisgICAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IEdFVEpPQ1RFVChkYXRhWzddKTsKKyAgICBjaW5mby0+WF9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzhdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzldKTsKKyAgICBjaW5mby0+WV9kZW5zaXR5ID0gKEdFVEpPQ1RFVChkYXRhWzEwXSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMV0pOworICAgIC8qIENoZWNrIHZlcnNpb24uCisgICAgICogTWFqb3IgdmVyc2lvbiBtdXN0IGJlIDEsIGFueXRoaW5nIGVsc2Ugc2lnbmFscyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLgorICAgICAqIChXZSB1c2VkIHRvIHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IsIGJ1dCBub3cgaXQncyBhIG5vbmZhdGFsIHdhcm5pbmcsCisgICAgICogYmVjYXVzZSBzb21lIGJvem8gYXQgSGlqYWFrIGNvdWxkbid0IHJlYWQgdGhlIHNwZWMuKQorICAgICAqIE1pbm9yIHZlcnNpb24gc2hvdWxkIGJlIDAuLjIsIGJ1dCBwcm9jZXNzIGFueXdheSBpZiBuZXdlci4KKyAgICAgKi8KKyAgICBpZiAoY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiAhPSAxKQorICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9KRklGX01BSk9SLAorCSAgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24pOworICAgIC8qIEdlbmVyYXRlIHRyYWNlIG1lc3NhZ2VzICovCisgICAgVFJBQ0VNUzUoY2luZm8sIDEsIEpUUkNfSkZJRiwKKwkgICAgIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24sIGNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24sCisJICAgICBjaW5mby0+WF9kZW5zaXR5LCBjaW5mby0+WV9kZW5zaXR5LCBjaW5mby0+ZGVuc2l0eV91bml0KTsKKyAgICAvKiBWYWxpZGF0ZSB0aHVtYm5haWwgZGltZW5zaW9ucyBhbmQgaXNzdWUgYXBwcm9wcmlhdGUgbWVzc2FnZXMgKi8KKyAgICBpZiAoR0VUSk9DVEVUKGRhdGFbMTJdKSB8IEdFVEpPQ1RFVChkYXRhWzEzXSkpCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX1RIVU1CTkFJTCwKKwkgICAgICAgR0VUSk9DVEVUKGRhdGFbMTJdKSwgR0VUSk9DVEVUKGRhdGFbMTNdKSk7CisgICAgdG90YWxsZW4gLT0gQVBQMF9EQVRBX0xFTjsKKyAgICBpZiAodG90YWxsZW4gIT0KKwkoKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEyXSkgKiAoSU5UMzIpR0VUSk9DVEVUKGRhdGFbMTNdKSAqIChJTlQzMikgMykpCisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19KRklGX0JBRFRIVU1CTkFJTFNJWkUsIChpbnQpIHRvdGFsbGVuKTsKKyAgfSBlbHNlIGlmIChkYXRhbGVuID49IDYgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzBdKSA9PSAweDRBICYmCisgICAgICBHRVRKT0NURVQoZGF0YVsxXSkgPT0gMHg0NiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMl0pID09IDB4NTggJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzNdKSA9PSAweDU4ICYmCisgICAgICBHRVRKT0NURVQoZGF0YVs0XSkgPT0gMCkgeworICAgIC8qIEZvdW5kIEpGSUYgIkpGWFgiIGV4dGVuc2lvbiBBUFAwIG1hcmtlciAqLworICAgIC8qIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGVzZSwKKyAgICAgKiBidXQgd2UgdHJ5IHRvIHByb2R1Y2UgYSBoZWxwZnVsIHRyYWNlIG1lc3NhZ2UuCisgICAgICovCisgICAgc3dpdGNoIChHRVRKT0NURVQoZGF0YVs1XSkpIHsKKyAgICBjYXNlIDB4MTA6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9KUEVHLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTE6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9QQUxFVFRFLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTM6CisgICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19USFVNQl9SR0IsIChpbnQpIHRvdGFsbGVuKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19KRklGX0VYVEVOU0lPTiwKKwkgICAgICAgR0VUSk9DVEVUKGRhdGFbNV0pLCAoaW50KSB0b3RhbGxlbik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogU3RhcnQgb2YgQVBQMCBkb2VzIG5vdCBtYXRjaCAiSkZJRiIgb3IgIkpGWFgiLCBvciB0b28gc2hvcnQgKi8KKyAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19BUFAwLCAoaW50KSB0b3RhbGxlbik7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZXhhbWluZV9hcHAxNCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCisJICAgICAgIHVuc2lnbmVkIGludCBkYXRhbGVuLCBJTlQzMiByZW1haW5pbmcpCisvKiBFeGFtaW5lIGZpcnN0IGZldyBieXRlcyBmcm9tIGFuIEFQUDE0LgorICogVGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gaWYgaXQgaXMgYW4gQWRvYmUgbWFya2VyLgorICogZGF0YWxlbiBpcyAjIG9mIGJ5dGVzIGF0IGRhdGFbXSwgcmVtYWluaW5nIGlzIGxlbmd0aCBvZiByZXN0IG9mIG1hcmtlciBkYXRhLgorICovCit7CisgIHVuc2lnbmVkIGludCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtOworCisgIGlmIChkYXRhbGVuID49IEFQUDE0X0RBVEFfTEVOICYmCisgICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0MSAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NjQgJiYKKyAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDZGICYmCisgICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg2MiAmJgorICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDB4NjUpIHsKKyAgICAvKiBGb3VuZCBBZG9iZSBBUFAxNCBtYXJrZXIgKi8KKyAgICB2ZXJzaW9uID0gKEdFVEpPQ1RFVChkYXRhWzVdKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzZdKTsKKyAgICBmbGFnczAgPSAoR0VUSk9DVEVUKGRhdGFbN10pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbOF0pOworICAgIGZsYWdzMSA9IChHRVRKT0NURVQoZGF0YVs5XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVsxMF0pOworICAgIHRyYW5zZm9ybSA9IEdFVEpPQ1RFVChkYXRhWzExXSk7CisgICAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfQURPQkUsIHZlcnNpb24sIGZsYWdzMCwgZmxhZ3MxLCB0cmFuc2Zvcm0pOworICAgIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gVFJVRTsKKyAgICBjaW5mby0+QWRvYmVfdHJhbnNmb3JtID0gKFVJTlQ4KSB0cmFuc2Zvcm07CisgIH0gZWxzZSB7CisgICAgLyogU3RhcnQgb2YgQVBQMTQgZG9lcyBub3QgbWF0Y2ggIkFkb2JlIiwgb3IgdG9vIHNob3J0ICovCisgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMTQsIChpbnQpIChkYXRhbGVuICsgcmVtYWluaW5nKSk7CisgIH0KK30KKworCitNRVRIT0RERUYoYm9vbGVhbikKK2dldF9pbnRlcmVzdGluZ19hcHBuIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogUHJvY2VzcyBhbiBBUFAwIG9yIEFQUDE0IG1hcmtlciB3aXRob3V0IHNhdmluZyBpdCAqLworeworICBJTlQzMiBsZW5ndGg7CisgIEpPQ1RFVCBiW0FQUE5fREFUQV9MRU5dOworICB1bnNpZ25lZCBpbnQgaSwgbnVtdG9yZWFkOworICBJTlBVVF9WQVJTKGNpbmZvKTsKKworICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IDI7CisKKyAgLyogZ2V0IHRoZSBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoZSBtYXJrZXIgZGF0YSAqLworICBpZiAobGVuZ3RoID49IEFQUE5fREFUQV9MRU4pCisgICAgbnVtdG9yZWFkID0gQVBQTl9EQVRBX0xFTjsKKyAgZWxzZSBpZiAobGVuZ3RoID4gMCkKKyAgICBudW10b3JlYWQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7CisgIGVsc2UKKyAgICBudW10b3JlYWQgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbnVtdG9yZWFkOyBpKyspCisgICAgSU5QVVRfQllURShjaW5mbywgYltpXSwgcmV0dXJuIEZBTFNFKTsKKyAgbGVuZ3RoIC09IG51bXRvcmVhZDsKKworICAvKiBwcm9jZXNzIGl0ICovCisgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKKyAgY2FzZSBNX0FQUDA6CisgICAgZXhhbWluZV9hcHAwKGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgTV9BUFAxNDoKKyAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCAoSk9DVEVUIEZBUiAqKSBiLCBudW10b3JlYWQsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgLyogY2FuJ3QgZ2V0IGhlcmUgdW5sZXNzIGpwZWdfc2F2ZV9tYXJrZXJzIGNob29zZXMgd3JvbmcgcHJvY2Vzc29yICovCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfVU5LTk9XTl9NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisKKyNpZmRlZiBTQVZFX01BUktFUlNfU1VQUE9SVEVECisKK01FVEhPRERFRihib29sZWFuKQorc2F2ZV9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBTYXZlIGFuIEFQUG4gb3IgQ09NIG1hcmtlciBpbnRvIHRoZSBtYXJrZXIgbGlzdCAqLworeworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgY3VyX21hcmtlciA9IG1hcmtlci0+Y3VyX21hcmtlcjsKKyAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQsIGRhdGFfbGVuZ3RoOworICBKT0NURVQgRkFSICogZGF0YTsKKyAgSU5UMzIgbGVuZ3RoID0gMDsKKyAgSU5QVVRfVkFSUyhjaW5mbyk7CisKKyAgaWYgKGN1cl9tYXJrZXIgPT0gTlVMTCkgeworICAgIC8qIGJlZ2luIHJlYWRpbmcgYSBtYXJrZXIgKi8KKyAgICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKKyAgICBsZW5ndGggLT0gMjsKKyAgICBpZiAobGVuZ3RoID49IDApIHsJCS8qIHdhdGNoIG91dCBmb3IgYm9ndXMgbGVuZ3RoIHdvcmQgKi8KKyAgICAgIC8qIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2Ugd2FudCB0byBzYXZlICovCisgICAgICB1bnNpZ25lZCBpbnQgbGltaXQ7CisgICAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gKGludCkgTV9DT00pCisJbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9DT007CisgICAgICBlbHNlCisJbGltaXQgPSBtYXJrZXItPmxlbmd0aF9saW1pdF9BUFBuW2NpbmZvLT51bnJlYWRfbWFya2VyIC0gKGludCkgTV9BUFAwXTsKKyAgICAgIGlmICgodW5zaWduZWQgaW50KSBsZW5ndGggPCBsaW1pdCkKKwlsaW1pdCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKyAgICAgIC8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBtYXJrZXIgaXRlbSAqLworICAgICAgY3VyX21hcmtlciA9IChqcGVnX3NhdmVkX21hcmtlcl9wdHIpCisJKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgU0laRU9GKHN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QpICsgbGltaXQpOworICAgICAgY3VyX21hcmtlci0+bmV4dCA9IE5VTEw7CisgICAgICBjdXJfbWFya2VyLT5tYXJrZXIgPSAoVUlOVDgpIGNpbmZvLT51bnJlYWRfbWFya2VyOworICAgICAgY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOworICAgICAgY3VyX21hcmtlci0+ZGF0YV9sZW5ndGggPSBsaW1pdDsKKyAgICAgIC8qIGRhdGEgYXJlYSBpcyBqdXN0IGJleW9uZCB0aGUganBlZ19tYXJrZXJfc3RydWN0ICovCisgICAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSA9IChKT0NURVQgRkFSICopIChjdXJfbWFya2VyICsgMSk7CisgICAgICBtYXJrZXItPmN1cl9tYXJrZXIgPSBjdXJfbWFya2VyOworICAgICAgbWFya2VyLT5ieXRlc19yZWFkID0gMDsKKyAgICAgIGJ5dGVzX3JlYWQgPSAwOworICAgICAgZGF0YV9sZW5ndGggPSBsaW1pdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogZGVhbCB3aXRoIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgICBieXRlc19yZWFkID0gZGF0YV9sZW5ndGggPSAwOworICAgICAgZGF0YSA9IE5VTEw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIHJlc3VtZSByZWFkaW5nIGEgbWFya2VyICovCisgICAgYnl0ZXNfcmVhZCA9IG1hcmtlci0+Ynl0ZXNfcmVhZDsKKyAgICBkYXRhX2xlbmd0aCA9IGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoOworICAgIGRhdGEgPSBjdXJfbWFya2VyLT5kYXRhICsgYnl0ZXNfcmVhZDsKKyAgfQorCisgIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGgpIHsKKyAgICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIG1vdmUgdGhlIHJlc3RhcnQgcG9pbnQgdG8gaGVyZSAqLworICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IGJ5dGVzX3JlYWQ7CisgICAgLyogSWYgdGhlcmUncyBub3QgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gYnVmZmVyLCBzdXNwZW5kICovCisgICAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLCByZXR1cm4gRkFMU0UpOworICAgIC8qIENvcHkgYnl0ZXMgd2l0aCByZWFzb25hYmxlIHJhcGlkaXR5ICovCisgICAgd2hpbGUgKGJ5dGVzX3JlYWQgPCBkYXRhX2xlbmd0aCAmJiBieXRlc19pbl9idWZmZXIgPiAwKSB7CisgICAgICAqZGF0YSsrID0gKm5leHRfaW5wdXRfYnl0ZSsrOworICAgICAgYnl0ZXNfaW5fYnVmZmVyLS07CisgICAgICBieXRlc19yZWFkKys7CisgICAgfQorICB9CisKKyAgLyogRG9uZSByZWFkaW5nIHdoYXQgd2Ugd2FudCB0byByZWFkICovCisgIGlmIChjdXJfbWFya2VyICE9IE5VTEwpIHsJLyogd2lsbCBiZSBOVUxMIGlmIGJvZ3VzIGxlbmd0aCB3b3JkICovCisgICAgLyogQWRkIG5ldyBtYXJrZXIgdG8gZW5kIG9mIGxpc3QgKi8KKyAgICBpZiAoY2luZm8tPm1hcmtlcl9saXN0ID09IE5VTEwpIHsKKyAgICAgIGNpbmZvLT5tYXJrZXJfbGlzdCA9IGN1cl9tYXJrZXI7CisgICAgfSBlbHNlIHsKKyAgICAgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBwcmV2ID0gY2luZm8tPm1hcmtlcl9saXN0OworICAgICAgd2hpbGUgKHByZXYtPm5leHQgIT0gTlVMTCkKKwlwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgIHByZXYtPm5leHQgPSBjdXJfbWFya2VyOworICAgIH0KKyAgICAvKiBSZXNldCBwb2ludGVyICYgY2FsYyByZW1haW5pbmcgZGF0YSBsZW5ndGggKi8KKyAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YTsKKyAgICBsZW5ndGggPSBjdXJfbWFya2VyLT5vcmlnaW5hbF9sZW5ndGggLSBkYXRhX2xlbmd0aDsKKyAgfQorICAvKiBSZXNldCB0byBpbml0aWFsIHN0YXRlIGZvciBuZXh0IG1hcmtlciAqLworICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOworCisgIC8qIFByb2Nlc3MgdGhlIG1hcmtlciBpZiBpbnRlcmVzdGluZzsgZWxzZSBqdXN0IG1ha2UgYSBnZW5lcmljIHRyYWNlIG1zZyAqLworICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7CisgIGNhc2UgTV9BUFAwOgorICAgIGV4YW1pbmVfYXBwMChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7CisgICAgYnJlYWs7CisgIGNhc2UgTV9BUFAxNDoKKyAgICBleGFtaW5lX2FwcDE0KGNpbmZvLCBkYXRhLCBkYXRhX2xlbmd0aCwgbGVuZ3RoKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsCisJICAgICAoaW50KSAoZGF0YV9sZW5ndGggKyBsZW5ndGgpKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIHNraXAgYW55IHJlbWFpbmluZyBkYXRhIC0tIGNvdWxkIGJlIGxvdHMgKi8KKyAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCisgIGlmIChsZW5ndGggPiAwKQorICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOworCisgIHJldHVybiBUUlVFOworfQorCisjZW5kaWYgLyogU0FWRV9NQVJLRVJTX1NVUFBPUlRFRCAqLworCisKK01FVEhPRERFRihib29sZWFuKQorc2tpcF92YXJpYWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKy8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLworeworICBJTlQzMiBsZW5ndGg7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOworICBsZW5ndGggLT0gMjsKKyAgCisgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX01JU0NfTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlciwgKGludCkgbGVuZ3RoKTsKKworICBJTlBVVF9TWU5DKGNpbmZvKTsJCS8qIGRvIGJlZm9yZSBza2lwX2lucHV0X2RhdGEgKi8KKyAgaWYgKGxlbmd0aCA+IDApCisgICAgKCpjaW5mby0+c3JjLT5za2lwX2lucHV0X2RhdGEpIChjaW5mbywgKGxvbmcpIGxlbmd0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIEZpbmQgdGhlIG5leHQgSlBFRyBtYXJrZXIsIHNhdmUgaXQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCisgKiBSZXR1cm5zIEZBTFNFIGlmIGhhZCB0byBzdXNwZW5kIGJlZm9yZSByZWFjaGluZyBhIG1hcmtlcjsKKyAqIGluIHRoYXQgY2FzZSBjaW5mby0+dW5yZWFkX21hcmtlciBpcyB1bmNoYW5nZWQuCisgKgorICogTm90ZSB0aGF0IHRoZSByZXN1bHQgbWlnaHQgbm90IGJlIGEgdmFsaWQgbWFya2VyIGNvZGUsCisgKiBidXQgaXQgd2lsbCBuZXZlciBiZSAwIG9yIEZGLgorICovCisKK0xPQ0FMKGJvb2xlYW4pCituZXh0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaW50IGM7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIGZvciAoOzspIHsKKyAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOworICAgIC8qIFNraXAgYW55IG5vbi1GRiBieXRlcy4KKyAgICAgKiBUaGlzIG1heSBsb29rIGEgYml0IGluZWZmaWNpZW50LCBidXQgaXQgd2lsbCBub3Qgb2NjdXIgaW4gYSB2YWxpZCBmaWxlLgorICAgICAqIFdlIHN5bmMgYWZ0ZXIgZWFjaCBkaXNjYXJkZWQgYnl0ZSBzbyB0aGF0IGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZQorICAgICAqIGNhbiBkaXNjYXJkIHRoZSBieXRlIGZyb20gaXRzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB3aGlsZSAoYyAhPSAweEZGKSB7CisgICAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMrKzsKKyAgICAgIElOUFVUX1NZTkMoY2luZm8pOworICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICB9CisgICAgLyogVGhpcyBsb29wIHN3YWxsb3dzIGFueSBkdXBsaWNhdGUgRkYgYnl0ZXMuICBFeHRyYSBGRnMgYXJlIGxlZ2FsIGFzCisgICAgICogcGFkIGJ5dGVzLCBzbyBkb24ndCBjb3VudCB0aGVtIGluIGRpc2NhcmRlZF9ieXRlcy4gIFdlIGFzc3VtZSB0aGVyZQorICAgICAqIHdpbGwgbm90IGJlIHNvIG1hbnkgY29uc2VjdXRpdmUgRkYgYnl0ZXMgYXMgdG8gb3ZlcmZsb3cgYSBzdXNwZW5kaW5nCisgICAgICogZGF0YSBzb3VyY2UncyBpbnB1dCBidWZmZXIuCisgICAgICovCisgICAgZG8geworICAgICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKKyAgICB9IHdoaWxlIChjID09IDB4RkYpOworICAgIGlmIChjICE9IDApCisgICAgICBicmVhazsJCQkvKiBmb3VuZCBhIHZhbGlkIG1hcmtlciwgZXhpdCBsb29wICovCisgICAgLyogUmVhY2ggaGVyZSBpZiB3ZSBmb3VuZCBhIHN0dWZmZWQtemVybyBkYXRhIHNlcXVlbmNlIChGRi8wMCkuCisgICAgICogRGlzY2FyZCBpdCBhbmQgbG9vcCBiYWNrIHRvIHRyeSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gMjsKKyAgICBJTlBVVF9TWU5DKGNpbmZvKTsKKyAgfQorCisgIGlmIChjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgIT0gMCkgeworICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fRVhUUkFORU9VU19EQVRBLCBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMsIGMpOworICAgIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyA9IDA7CisgIH0KKworICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGM7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCitmaXJzdF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBMaWtlIG5leHRfbWFya2VyLCBidXQgdXNlZCB0byBvYnRhaW4gdGhlIGluaXRpYWwgU09JIG1hcmtlci4gKi8KKy8qIEZvciB0aGlzIG1hcmtlciwgd2UgZG8gbm90IGFsbG93IHByZWNlZGluZyBnYXJiYWdlIG9yIGZpbGw7IG90aGVyd2lzZSwKKyAqIHdlIG1pZ2h0IHdlbGwgc2NhbiBhbiBlbnRpcmUgaW5wdXQgZmlsZSBiZWZvcmUgcmVhbGl6aW5nIGl0IGFpbid0IEpQRUcuCisgKiBJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBwcm9jZXNzIG5vbi1KRklGIGZpbGVzLCBpdCBtdXN0IHNlZWsgdG8gdGhlCisgKiBTT0kgYmVmb3JlIGNhbGxpbmcgdGhlIEpQRUcgbGlicmFyeS4KKyAqLworeworICBpbnQgYywgYzI7CisgIElOUFVUX1ZBUlMoY2luZm8pOworCisgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7CisgIElOUFVUX0JZVEUoY2luZm8sIGMyLCByZXR1cm4gRkFMU0UpOworICBpZiAoYyAhPSAweEZGIHx8IGMyICE9IChpbnQpIE1fU09JKQorICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX05PX1NPSSwgYywgYzIpOworCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gYzI7CisKKyAgSU5QVVRfU1lOQyhjaW5mbyk7CisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBSZWFkIG1hcmtlcnMgdW50aWwgU09TIG9yIEVPSS4KKyAqCisgKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKKyAqIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgorICovCisKK01FVEhPRERFRihpbnQpCityZWFkX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIE91dGVyIGxvb3AgcmVwZWF0cyBvbmNlIGZvciBlYWNoIG1hcmtlci4gKi8KKyAgZm9yICg7OykgeworICAgIC8qIENvbGxlY3QgdGhlIG1hcmtlciBwcm9wZXIsIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KKyAgICAvKiBOQjogZmlyc3RfbWFya2VyKCkgZW5mb3JjZXMgdGhlIHJlcXVpcmVtZW50IHRoYXQgU09JIGFwcGVhciBmaXJzdC4gKi8KKyAgICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0gMCkgeworICAgICAgaWYgKCEgY2luZm8tPm1hcmtlci0+c2F3X1NPSSkgeworCWlmICghIGZpcnN0X21hcmtlcihjaW5mbykpCisJICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICB9IGVsc2UgeworCWlmICghIG5leHRfbWFya2VyKGNpbmZvKSkKKwkgIHJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXN0IG1hcmtlciBhZnRlciBTT0YuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9PSAtMSkKKyAgICAgIGNpbmZvLT5tYXJrZXItPmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9CisgICAgICAgICAgamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIC0gMjsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgY2luZm8tPnVucmVhZF9tYXJrZXIgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlIGFuZCB0aGUKKyAgICAgKiBpbnB1dCBwb2ludCBpcyBqdXN0IHBhc3QgdGhlIG1hcmtlciBwcm9wZXIsIGJ1dCBiZWZvcmUgYW55IHBhcmFtZXRlcnMuCisgICAgICogQSBzdXNwZW5zaW9uIHdpbGwgY2F1c2UgdXMgdG8gcmV0dXJuIHdpdGggdGhpcyBzdGF0ZSBzdGlsbCB0cnVlLgorICAgICAqLworICAgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKKyAgICBjYXNlIE1fU09JOgorICAgICAgaWYgKCEgZ2V0X3NvaShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCisgICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgRkFMU0UpKQorCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID0gLTE7CisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBGQUxTRSkpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09GOToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KKyAgICAgIGlmICghIGdldF9zb2YoY2luZm8sIEZBTFNFLCBUUlVFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBUUlVFLCBUUlVFKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIC8qIEN1cnJlbnRseSB1bnN1cHBvcnRlZCBTT0ZuIHR5cGVzICovCisgICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX0pQRzoJCQkvKiBSZXNlcnZlZCBmb3IgSlBFRyBleHRlbnNpb25zICovCisgICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfU09GX1VOU1VQUE9SVEVELCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9TT1M6CisgICAgICBpZiAoISBnZXRfc29zKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7CS8qIHByb2Nlc3NlZCB0aGUgbWFya2VyICovCisgICAgICByZXR1cm4gSlBFR19SRUFDSEVEX1NPUzsKKyAgICAKKyAgICBjYXNlIE1fRU9JOgorICAgICAgVFJBQ0VNUyhjaW5mbywgMSwgSlRSQ19FT0kpOworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLworICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9FT0k7CisgICAgICAKKyAgICBjYXNlIE1fREFDOgorICAgICAgaWYgKCEgZ2V0X2RhYyhjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fREhUOgorICAgICAgaWYgKCEgZ2V0X2RodChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fRFFUOgorICAgICAgaWYgKCEgZ2V0X2RxdChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fRFJJOgorICAgICAgaWYgKCEgZ2V0X2RyaShjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fQVBQMDoKKyAgICBjYXNlIE1fQVBQMToKKyAgICBjYXNlIE1fQVBQMjoKKyAgICBjYXNlIE1fQVBQMzoKKyAgICBjYXNlIE1fQVBQNDoKKyAgICBjYXNlIE1fQVBQNToKKyAgICBjYXNlIE1fQVBQNjoKKyAgICBjYXNlIE1fQVBQNzoKKyAgICBjYXNlIE1fQVBQODoKKyAgICBjYXNlIE1fQVBQOToKKyAgICBjYXNlIE1fQVBQMTA6CisgICAgY2FzZSBNX0FQUDExOgorICAgIGNhc2UgTV9BUFAxMjoKKyAgICBjYXNlIE1fQVBQMTM6CisgICAgY2FzZSBNX0FQUDE0OgorICAgIGNhc2UgTV9BUFAxNToKKyAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19BUFBuWworCQljaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF0pIChjaW5mbykpCisJcmV0dXJuIEpQRUdfU1VTUEVOREVEOworICAgICAgYnJlYWs7CisgICAgICAKKyAgICBjYXNlIE1fQ09NOgorICAgICAgaWYgKCEgKCooKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXIpLT5wcm9jZXNzX0NPTSkgKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGNhc2UgTV9SU1QwOgkJLyogdGhlc2UgYXJlIGFsbCBwYXJhbWV0ZXJsZXNzICovCisgICAgY2FzZSBNX1JTVDE6CisgICAgY2FzZSBNX1JTVDI6CisgICAgY2FzZSBNX1JTVDM6CisgICAgY2FzZSBNX1JTVDQ6CisgICAgY2FzZSBNX1JTVDU6CisgICAgY2FzZSBNX1JTVDY6CisgICAgY2FzZSBNX1JTVDc6CisgICAgY2FzZSBNX1RFTToKKyAgICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1BBUk1MRVNTX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRE5MOgkJCS8qIElnbm9yZSBETkwgLi4uIHBlcmhhcHMgdGhlIHdyb25nIHRoaW5nICovCisgICAgICBpZiAoISBza2lwX3ZhcmlhYmxlKGNpbmZvKSkKKwlyZXR1cm4gSlBFR19TVVNQRU5ERUQ7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CQkJLyogbXVzdCBiZSBESFAsIEVYUCwgSlBHbiwgb3IgUkVTbiAqLworICAgICAgLyogRm9yIG5vdywgd2UgdHJlYXQgdGhlIHJlc2VydmVkIG1hcmtlcnMgYXMgZmF0YWwgZXJyb3JzIHNpbmNlIHRoZXkgYXJlCisgICAgICAgKiBsaWtlbHkgdG8gYmUgdXNlZCB0byBzaWduYWwgaW5jb21wYXRpYmxlIEpQRUcgUGFydCAzIGV4dGVuc2lvbnMuCisgICAgICAgKiBPbmNlIHRoZSBKUEVHIDMgdmVyc2lvbi1udW1iZXIgbWFya2VyIGlzIHdlbGwgZGVmaW5lZCwgdGhpcyBjb2RlCisgICAgICAgKiBvdWdodCB0byBjaGFuZ2UhCisgICAgICAgKi8KKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogU3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBtYXJrZXIsIHNvIHJlc2V0IHN0YXRlIHZhcmlhYmxlICovCisgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICB9IC8qIGVuZCBsb29wICovCit9CisKKworLyoKKyAqIFJlYWQgYSByZXN0YXJ0IG1hcmtlciwgd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYXBwZWFyIG5leHQgaW4gdGhlIGRhdGFzdHJlYW07CisgKiBpZiB0aGUgbWFya2VyIGlzIG5vdCB0aGVyZSwgdGFrZSBhcHByb3ByaWF0ZSByZWNvdmVyeSBhY3Rpb24uCisgKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGVudHJvcHkgZGVjb2RlciBhZnRlciBpdCBoYXMgcmVhZCBhbiBhcHByb3ByaWF0ZQorICogbnVtYmVyIG9mIE1DVXMuICBjaW5mby0+dW5yZWFkX21hcmtlciBtYXkgYmUgbm9uemVybyBpZiB0aGUgZW50cm9weSBkZWNvZGVyCisgKiBoYXMgYWxyZWFkeSByZWFkIGEgbWFya2VyIGZyb20gdGhlIGRhdGEgc291cmNlLiAgVW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyAqIGNpbmZvLT51bnJlYWRfbWFya2VyIHdpbGwgYmUgcmVzZXQgdG8gMCBiZWZvcmUgcmV0dXJuaW5nOyBpZiBub3QgcmVzZXQsCisgKiBpdCBob2xkcyBhIG1hcmtlciB3aGljaCB0aGUgZGVjb2RlciB3aWxsIGJlIHVuYWJsZSB0byByZWFkIHBhc3QuCisgKi8KKworTUVUSE9EREVGKGJvb2xlYW4pCityZWFkX3Jlc3RhcnRfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBPYnRhaW4gYSBtYXJrZXIgdW5sZXNzIHdlIGFscmVhZHkgZGlkLiAqLworICAvKiBOb3RlIHRoYXQgbmV4dF9tYXJrZXIgd2lsbCBjb21wbGFpbiBpZiBpdCBza2lwcyBhbnkgZGF0YS4gKi8KKyAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKKyAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAoY2luZm8tPnVucmVhZF9tYXJrZXIgPT0KKyAgICAgICgoaW50KSBNX1JTVDAgKyBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkgeworICAgIC8qIE5vcm1hbCBjYXNlIC0tLSBzd2FsbG93IHRoZSBtYXJrZXIgYW5kIGxldCBlbnRyb3B5IGRlY29kZXIgY29udGludWUgKi8KKyAgICBUUkFDRU1TMShjaW5mbywgMywgSlRSQ19SU1QsIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0pOworICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgfSBlbHNlIHsKKyAgICAvKiBVaC1vaCwgdGhlIHJlc3RhcnQgbWFya2VycyBoYXZlIGJlZW4gbWVzc2VkIHVwLiAqLworICAgIC8qIExldCB0aGUgZGF0YSBzb3VyY2UgbWFuYWdlciBkZXRlcm1pbmUgaG93IHRvIHJlc3luYy4gKi8KKyAgICBpZiAoISAoKmNpbmZvLT5zcmMtPnJlc3luY190b19yZXN0YXJ0KSAoY2luZm8sCisJCQkJCSAgICBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIFVwZGF0ZSBuZXh0LXJlc3RhcnQgc3RhdGUgKi8KKyAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSA9IChjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtICsgMSkgJiA3OworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IHJlc3luY190b19yZXN0YXJ0IG1ldGhvZCBmb3IgZGF0YSBzb3VyY2UgbWFuYWdlcnMKKyAqIHRvIHVzZSBpZiB0aGV5IGRvbid0IGhhdmUgYW55IGJldHRlciBhcHByb2FjaC4gIFNvbWUgZGF0YSBzb3VyY2UgbWFuYWdlcnMKKyAqIG1heSBiZSBhYmxlIHRvIGJhY2sgdXAsIG9yIG1heSBoYXZlIGFkZGl0aW9uYWwga25vd2xlZGdlIGFib3V0IHRoZSBkYXRhCisgKiB3aGljaCBwZXJtaXRzIGEgbW9yZSBpbnRlbGxpZ2VudCByZWNvdmVyeSBzdHJhdGVneTsgc3VjaCBtYW5hZ2VycyB3b3VsZAorICogcHJlc3VtYWJseSBzdXBwbHkgdGhlaXIgb3duIHJlc3luYyBtZXRob2QuCisgKgorICogcmVhZF9yZXN0YXJ0X21hcmtlciBjYWxscyByZXN5bmNfdG9fcmVzdGFydCBpZiBpdCBmaW5kcyBhIG1hcmtlciBvdGhlciB0aGFuCisgKiB0aGUgcmVzdGFydCBtYXJrZXIgaXQgd2FzIGV4cGVjdGluZy4gIChUaGlzIGNvZGUgaXMgKm5vdCogdXNlZCB1bmxlc3MKKyAqIGEgbm9uemVybyByZXN0YXJ0IGludGVydmFsIGhhcyBiZWVuIGRlY2xhcmVkLikgIGNpbmZvLT51bnJlYWRfbWFya2VyIGlzCisgKiB0aGUgbWFya2VyIGNvZGUgYWN0dWFsbHkgZm91bmQgKG1pZ2h0IGJlIGFueXRoaW5nLCBleGNlcHQgMCBvciBGRikuCisgKiBUaGUgZGVzaXJlZCByZXN0YXJ0IG1hcmtlciBudW1iZXIgKDAuLjcpIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlci4KKyAqIFRoaXMgcm91dGluZSBpcyBzdXBwb3NlZCB0byBhcHBseSB3aGF0ZXZlciBlcnJvciByZWNvdmVyeSBzdHJhdGVneSBzZWVtcworICogYXBwcm9wcmlhdGUgaW4gb3JkZXIgdG8gcG9zaXRpb24gdGhlIGlucHV0IHN0cmVhbSB0byB0aGUgbmV4dCBkYXRhIHNlZ21lbnQuCisgKiBOb3RlIHRoYXQgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdHJlYXRlZCBhcyBhIG1hcmtlciBhcHBlYXJpbmcgYmVmb3JlCisgKiB0aGUgY3VycmVudCBkYXRhLXNvdXJjZSBpbnB1dCBwb2ludDsgdXN1YWxseSBpdCBzaG91bGQgYmUgcmVzZXQgdG8gemVybworICogYmVmb3JlIHJldHVybmluZy4KKyAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuc2lvbiBpcyByZXF1aXJlZC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHN1YnN0YW50aWFsbHkgY29uc3RyYWluZWQgYnkgd2FudGluZyB0byB0cmVhdCB0aGUKKyAqIGlucHV0IGFzIGEgZGF0YSBzdHJlYW07IHRoaXMgbWVhbnMgd2UgY2FuJ3QgYmFjayB1cC4gIFRoZXJlZm9yZSwgd2UgaGF2ZQorICogb25seSB0aGUgZm9sbG93aW5nIGFjdGlvbnMgdG8gd29yayB3aXRoOgorICogICAxLiBTaW1wbHkgZGlzY2FyZCB0aGUgbWFya2VyIGFuZCBsZXQgdGhlIGVudHJvcHkgZGVjb2RlciByZXN1bWUgYXQgbmV4dAorICogICAgICBieXRlIG9mIGZpbGUuCisgKiAgIDIuIFJlYWQgZm9yd2FyZCB1bnRpbCB3ZSBmaW5kIGFub3RoZXIgbWFya2VyLCBkaXNjYXJkaW5nIGludGVydmVuaW5nCisgKiAgICAgIGRhdGEuICAoSW4gdGhlb3J5IHdlIGNvdWxkIGxvb2sgYWhlYWQgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlcmxvYWQsCisgKiAgICAgIHdpdGhvdXQgaGF2aW5nIHRvIGRpc2NhcmQgZGF0YSBpZiB3ZSBkb24ndCBmaW5kIHRoZSBkZXNpcmVkIG1hcmtlci4KKyAqICAgICAgVGhpcyBpZGVhIGlzIG5vdCBpbXBsZW1lbnRlZCBoZXJlLCBpbiBwYXJ0IGJlY2F1c2UgaXQgbWFrZXMgYmVoYXZpb3IKKyAqICAgICAgZGVwZW5kZW50IG9uIGJ1ZmZlciBzaXplIGFuZCBjaGFuY2UgYnVmZmVyLWJvdW5kYXJ5IHBvc2l0aW9ucy4pCisgKiAgIDMuIExlYXZlIHRoZSBtYXJrZXIgdW5yZWFkIChieSBmYWlsaW5nIHRvIHplcm8gY2luZm8tPnVucmVhZF9tYXJrZXIpLgorICogICAgICBUaGlzIHdpbGwgY2F1c2UgdGhlIGVudHJvcHkgZGVjb2RlciB0byBwcm9jZXNzIGFuIGVtcHR5IGRhdGEgc2VnbWVudCwKKyAqICAgICAgaW5zZXJ0aW5nIGR1bW15IHplcm9lcywgYW5kIHRoZW4gd2Ugd2lsbCByZXByb2Nlc3MgdGhlIG1hcmtlci4KKyAqCisgKiAjMiBpcyBhcHByb3ByaWF0ZSBpZiB3ZSB0aGluayB0aGUgZGVzaXJlZCBtYXJrZXIgbGllcyBhaGVhZCwgd2hpbGUgIzMgaXMKKyAqIGFwcHJvcHJpYXRlIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSBmdXR1cmUgcmVzdGFydCBtYXJrZXIgKGluZGljYXRpbmcKKyAqIHRoYXQgd2UgaGF2ZSBtaXNzZWQgdGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIsIHByb2JhYmx5IGJlY2F1c2UgaXQgZ290CisgKiBjb3JydXB0ZWQpLgorICogV2UgYXBwbHkgIzIgb3IgIzMgaWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG5vIG1vcmUgdGhhbgorICogdHdvIGNvdW50cyBiZWhpbmQgb3IgYWhlYWQgb2YgdGhlIGV4cGVjdGVkIG9uZS4gIFdlIGFsc28gYXBwbHkgIzIgaWYgdGhlCisgKiBmb3VuZCBtYXJrZXIgaXMgbm90IGEgbGVnYWwgSlBFRyBtYXJrZXIgY29kZSAoaXQncyBjZXJ0YWlubHkgYm9ndXMgZGF0YSkuCisgKiBJZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgcmVzdGFydCBtYXJrZXIgbW9yZSB0aGFuIDIgY291bnRzIGF3YXksIHdlIGRvICMxCisgKiAodG9vIG11Y2ggcmlzayB0aGF0IHRoZSBtYXJrZXIgaXMgZXJyb25lb3VzOyB3aXRoIGx1Y2sgd2Ugd2lsbCBiZSBhYmxlIHRvCisgKiByZXN5bmMgYXQgc29tZSBmdXR1cmUgcG9pbnQpLgorICogRm9yIGFueSB2YWxpZCBub24tcmVzdGFydCBKUEVHIG1hcmtlciwgd2UgYXBwbHkgIzMuICBUaGlzIGtlZXBzIHVzIGZyb20KKyAqIG92ZXJydW5uaW5nIHRoZSBlbmQgb2YgYSBzY2FuLiAgQW4gaW1wbGVtZW50YXRpb24gbGltaXRlZCB0byBzaW5nbGUtc2NhbgorICogZmlsZXMgbWlnaHQgZmluZCBpdCBiZXR0ZXIgdG8gYXBwbHkgIzIgZm9yIG1hcmtlcnMgb3RoZXIgdGhhbiBFT0ksIHNpbmNlCisgKiBhbnkgb3RoZXIgbWFya2VyIHdvdWxkIGhhdmUgdG8gYmUgYm9ndXMgZGF0YSBpbiB0aGF0IGNhc2UuCisgKi8KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKK3sKKyAgaW50IG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOworICBpbnQgYWN0aW9uID0gMTsKKyAgCisgIC8qIEFsd2F5cyBwdXQgdXAgYSB3YXJuaW5nLiAqLworICBXQVJOTVMyKGNpbmZvLCBKV1JOX01VU1RfUkVTWU5DLCBtYXJrZXIsIGRlc2lyZWQpOworICAKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIHJlcGVhdGVkIGRlY2lzaW9uIGFmdGVyIHNjYW5uaW5nIGZvcndhcmQuICovCisgIGZvciAoOzspIHsKKyAgICBpZiAobWFya2VyIDwgKGludCkgTV9TT0YwKQorICAgICAgYWN0aW9uID0gMjsJCS8qIGludmFsaWQgbWFya2VyICovCisgICAgZWxzZSBpZiAobWFya2VyIDwgKGludCkgTV9SU1QwIHx8IG1hcmtlciA+IChpbnQpIE1fUlNUNykKKyAgICAgIGFjdGlvbiA9IDM7CQkvKiB2YWxpZCBub24tcmVzdGFydCBtYXJrZXIgKi8KKyAgICBlbHNlIHsKKyAgICAgIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZCsxKSAmIDcpKSB8fAorCSAgbWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMikgJiA3KSkpCisJYWN0aW9uID0gMzsJCS8qIG9uZSBvZiB0aGUgbmV4dCB0d28gZXhwZWN0ZWQgcmVzdGFydHMgKi8KKyAgICAgIGVsc2UgaWYgKG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTEpICYgNykpIHx8CisJICAgICAgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkLTIpICYgNykpKQorCWFjdGlvbiA9IDI7CQkvKiBhIHByaW9yIHJlc3RhcnQsIHNvIGFkdmFuY2UgKi8KKyAgICAgIGVsc2UKKwlhY3Rpb24gPSAxOwkJLyogZGVzaXJlZCByZXN0YXJ0IG9yIHRvbyBmYXIgYXdheSAqLworICAgIH0KKyAgICBUUkFDRU1TMihjaW5mbywgNCwgSlRSQ19SRUNPVkVSWV9BQ1RJT04sIG1hcmtlciwgYWN0aW9uKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgMToKKyAgICAgIC8qIERpc2NhcmQgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIHJlc3VtZSBwcm9jZXNzaW5nLiAqLworICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSAyOgorICAgICAgLyogU2NhbiB0byB0aGUgbmV4dCBtYXJrZXIsIGFuZCByZXBlYXQgdGhlIGRlY2lzaW9uIGxvb3AuICovCisgICAgICBpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICAgICAgbWFya2VyID0gY2luZm8tPnVucmVhZF9tYXJrZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAvKiBSZXR1cm4gd2l0aG91dCBhZHZhbmNpbmcgcGFzdCB0aGlzIG1hcmtlci4gKi8KKyAgICAgIC8qIEVudHJvcHkgZGVjb2RlciB3aWxsIGJlIGZvcmNlZCB0byBwcm9jZXNzIGFuIGVtcHR5IHNlZ21lbnQuICovCisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0gLyogZW5kIGxvb3AgKi8KK30KKworLyoKKyAqIEdldCB0aGUgcG9zaXRpb24gZm9yIGFsbCBTT1MgbWFya2VycyBpbiB0aGUgaW1hZ2UuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitnZXRfc29zX21hcmtlcl9wb3NpdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgdW5zaWduZWQgY2hhciAqaGVhZDsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHJldGNvZGUgPSBKUEVHX1JFQUNIRURfU09TOworCisgIHdoaWxlIChjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPiAwKSB7CisgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykgeworICAgICAganBlZ19jb25maWd1cmVfaHVmZm1hbl9pbmRleF9zY2FuKGNpbmZvLCBpbmRleCwgY291bnQrKywKKyAgICAgICAgICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uKTsKKyAgICAgIC8vIFNraXBzIHNjYW4gY29udGVudCB0byB0aGUgbmV4dCBub24tUlNUIEpQRUcgbWFya2VyLgorICAgICAgd2hpbGUobmV4dF9tYXJrZXIoY2luZm8pICYmCisgICAgICAgICAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID49IE1fUlNUMCAmJiBjaW5mby0+dW5yZWFkX21hcmtlciA8PSBNX1JTVDcpCisgICAgICAgICAgOworICAgICAgY2luZm8tPm1hcmtlci0+Y3VycmVudF9zb3NfbWFya2VyX3Bvc2l0aW9uID0KKyAgICAgICAgamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIC0gMjsKKyAgICAgIHJldGNvZGUgPSByZWFkX21hcmtlcnMoY2luZm8pOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworLyoKKyAqIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Jlc2V0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisKKyAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CQkvKiB1bnRpbCBhbGxvY2F0ZWQgYnkgZ2V0X3NvZiAqLworICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOwkJLyogbm8gU09TIHNlZW4geWV0ICovCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJCS8qIG5vIHBlbmRpbmcgbWFya2VyICovCisgIG1hcmtlci0+cHViLnNhd19TT0kgPSBGQUxTRTsJCS8qIHNldCBpbnRlcm5hbCBzdGF0ZSB0b28gKi8KKyAgbWFya2VyLT5wdWIuc2F3X1NPRiA9IEZBTFNFOworICBtYXJrZXItPnB1Yi5kaXNjYXJkZWRfYnl0ZXMgPSAwOworICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOworfQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgcmVhZGVyIG1vZHVsZS4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyOworICBpbnQgaTsKKworICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCisgIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAorCQkJCVNJWkVPRihteV9tYXJrZXJfcmVhZGVyKSk7CisgIGNpbmZvLT5tYXJrZXIgPSAoc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqKSBtYXJrZXI7CisgIC8qIEluaXRpYWxpemUgcHVibGljIG1ldGhvZCBwb2ludGVycyAqLworICBtYXJrZXItPnB1Yi5yZXNldF9tYXJrZXJfcmVhZGVyID0gcmVzZXRfbWFya2VyX3JlYWRlcjsKKyAgbWFya2VyLT5wdWIucmVhZF9tYXJrZXJzID0gcmVhZF9tYXJrZXJzOworICBtYXJrZXItPnB1Yi5yZWFkX3Jlc3RhcnRfbWFya2VyID0gcmVhZF9yZXN0YXJ0X21hcmtlcjsKKyAgbWFya2VyLT5wdWIuZ2V0X3Nvc19tYXJrZXJfcG9zaXRpb24gPSBnZXRfc29zX21hcmtlcl9wb3NpdGlvbjsKKworICAvLyBJbml0aWFsaXplIHRoZSBTT1MgbWFya2VyIHBvc2l0aW9uIHRvIGF2b2lkIHVuZGVyZGVmaW5lZCBiZWhhdmlvciBkdWUgdG8KKyAgLy8gdXNpbmcgYSB1bmRlZmluZWQgZmllbGQuCisgIG1hcmtlci0+cHViLmN1cnJlbnRfc29zX21hcmtlcl9wb3NpdGlvbiA9IDA7CisKKyAgLyogSW5pdGlhbGl6ZSBDT00vQVBQbiBwcm9jZXNzaW5nLgorICAgKiBCeSBkZWZhdWx0LCB3ZSBleGFtaW5lIGFuZCB0aGVuIGRpc2NhcmQgQVBQMCBhbmQgQVBQMTQsCisgICAqIGJ1dCBzaW1wbHkgZGlzY2FyZCBDT00gYW5kIGFsbCBvdGhlciBBUFBuLgorICAgKi8KKyAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHNraXBfdmFyaWFibGU7CisgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5baV0gPSBza2lwX3ZhcmlhYmxlOworICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5baV0gPSAwOworICB9CisgIG1hcmtlci0+cHJvY2Vzc19BUFBuWzBdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47CisgIG1hcmtlci0+cHJvY2Vzc19BUFBuWzE0XSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICAvKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSAqLworICByZXNldF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKK30KKworCisvKgorICogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4KKyAqLworCisjaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAorCitHTE9CQUwodm9pZCkKK2pwZWdfc2F2ZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJCSAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpCit7CisgIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7CisgIGxvbmcgbWF4bGVuZ3RoOworICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NvcjsKKworICAvKiBMZW5ndGggbGltaXQgbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiB3aGF0IHdlIGNhbiBhbGxvY2F0ZQorICAgKiAoc2hvdWxkIG9ubHkgYmUgYSBjb25jZXJuIGluIGEgMTYtYml0IGVudmlyb25tZW50KS4KKyAgICovCisgIG1heGxlbmd0aCA9IGNpbmZvLT5tZW0tPm1heF9hbGxvY19jaHVuayAtIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KTsKKyAgaWYgKCgobG9uZykgbGVuZ3RoX2xpbWl0KSA+IG1heGxlbmd0aCkKKyAgICBsZW5ndGhfbGltaXQgPSAodW5zaWduZWQgaW50KSBtYXhsZW5ndGg7CisKKyAgLyogQ2hvb3NlIHByb2Nlc3NvciByb3V0aW5lIHRvIHVzZS4KKyAgICogQVBQMC9BUFAxNCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgorICAgKi8KKyAgaWYgKGxlbmd0aF9saW1pdCkgeworICAgIHByb2Nlc3NvciA9IHNhdmVfbWFya2VyOworICAgIC8qIElmIHNhdmluZyBBUFAwL0FQUDE0LCBzYXZlIGF0IGxlYXN0IGVub3VnaCBmb3Igb3VyIGludGVybmFsIHVzZS4gKi8KKyAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwICYmIGxlbmd0aF9saW1pdCA8IEFQUDBfREFUQV9MRU4pCisgICAgICBsZW5ndGhfbGltaXQgPSBBUFAwX0RBVEFfTEVOOworICAgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMTRfREFUQV9MRU4pCisgICAgICBsZW5ndGhfbGltaXQgPSBBUFAxNF9EQVRBX0xFTjsKKyAgfSBlbHNlIHsKKyAgICBwcm9jZXNzb3IgPSBza2lwX3ZhcmlhYmxlOworICAgIC8qIElmIGRpc2NhcmRpbmcgQVBQMC9BUFAxNCwgdXNlIG91ciByZWd1bGFyIG9uLXRoZS1mbHkgcHJvY2Vzc29yLiAqLworICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgfHwgbWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCkKKyAgICAgIHByb2Nlc3NvciA9IGdldF9pbnRlcmVzdGluZ19hcHBuOworICB9CisKKyAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKSB7CisgICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHByb2Nlc3NvcjsKKyAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSBsZW5ndGhfbGltaXQ7CisgIH0gZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpIHsKKyAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBwcm9jZXNzb3I7CisgICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBsZW5ndGhfbGltaXQ7CisgIH0gZWxzZQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Cit9CisKKyNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAorCQkJICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKQoreworICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOworCisgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkKKyAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcm91dGluZTsKKyAgZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpCisgICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcm91dGluZTsKKyAgZWxzZQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRtYXN0ZXIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZGE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRtYXN0ZXIuYwpAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqIGpkbWFzdGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtYXN0ZXIgY29udHJvbCBsb2dpYyBmb3IgdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHNlbGVjdGluZyB0aGUgbW9kdWxlcyB0byBiZSBleGVjdXRlZAorICogYW5kIHdpdGggZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIHRvIGJlIGRvbmUgaW4gZWFjaAorICogcGFzcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyogUHJpdmF0ZSBzdGF0ZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgaW50IHBhc3NfbnVtYmVyOwkJLyogIyBvZiBwYXNzZXMgY29tcGxldGVkICovCisKKyAgYm9vbGVhbiB1c2luZ19tZXJnZWRfdXBzYW1wbGU7IC8qIFRSVUUgaWYgdXNpbmcgbWVyZ2VkIHVwc2FtcGxlL2Njb252ZXJ0ICovCisKKyAgLyogU2F2ZWQgcmVmZXJlbmNlcyB0byBpbml0aWFsaXplZCBxdWFudGl6ZXIgbW9kdWxlcywKKyAgICogaW4gY2FzZSB3ZSBuZWVkIHRvIHN3aXRjaCBtb2Rlcy4KKyAgICovCisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8xcGFzczsKKyAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogcXVhbnRpemVyXzJwYXNzOworfSBteV9kZWNvbXBfbWFzdGVyOworCit0eXBlZGVmIG15X2RlY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOworCisKKy8qCisgKiBEZXRlcm1pbmUgd2hldGhlciBtZXJnZWQgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzaG91bGQgYmUgdXNlZC4KKyAqIENSVUNJQUw6IHRoaXMgbXVzdCBtYXRjaCB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcyBvZiBqZG1lcmdlLmMhCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3VzZV9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisjaWZkZWYgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQKKyAgLyogTWVyZ2luZyBpcyB0aGUgZXF1aXZhbGVudCBvZiBwbGFpbiBib3gtZmlsdGVyIHVwc2FtcGxpbmcgKi8KKyAgaWYgKGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nIHx8IGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nKQorICAgIHJldHVybiBGQUxTRTsKKworI2lmZGVmIEFORFJPSURfUkdCCisgIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCNTY1IGFuZCBZQ0M9PlJHQiBjb2xvciBjb252ZXJzaW9uICovCisgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSAhPSBKQ1NfWUNiQ3IgfHwgCisgICAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAorICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMgfHwKKyAgICAgIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0JfNTY1ICYmIAorICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKSkgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2Vsc2UKKyAgLyogamRtZXJnZS5jIG9ubHkgc3VwcG9ydHMgWUNDPT5SR0IgY29sb3IgY29udmVyc2lvbiAqLworICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gSkNTX1lDYkNyIHx8IGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzIHx8CisgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19SR0IgfHwKKyAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAhPSBSR0JfUElYRUxTSVpFKQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorCisgIC8qIGFuZCBpdCBvbmx5IGhhbmRsZXMgMmgxdiBvciAyaDJ2IHNhbXBsaW5nIHJhdGlvcyAqLworICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDIgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAorICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID4gIDIgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciAhPSAxIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgIT0gMSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qIGZ1cnRoZXJtb3JlLCBpdCBkb2Vzbid0IHdvcmsgaWYgd2UndmUgc2NhbGVkIHRoZSBJRENUcyBkaWZmZXJlbnRseSAqLworICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8CisgICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAgICByZXR1cm4gRkFMU0U7CisgIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KKyAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KKyNlbHNlCisgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisKKy8qCisgKiBDb21wdXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCByZWxhdGVkIHZhbHVlcy4KKyAqIE5PVEU6IHRoaXMgaXMgZXhwb3J0ZWQgZm9yIHBvc3NpYmxlIHVzZSBieSBhcHBsaWNhdGlvbi4KKyAqIEhlbmNlIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcgdGhhdCBjYW4ndCBiZSBkb25lIHR3aWNlLgorICogQWxzbyBub3RlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG1hc3RlciBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQhCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisvKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCit7CisjaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAorICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisjZW5kaWYKKworICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLworI2lmIEFORFJPSURfVElMRV9CQVNFRF9ERUNPREUKKyAgLy8gVGlsZSBiYXNlZCBkZWNvZGluZyBtYXkgY2FsbCB0aGlzIGZ1bmN0aW9uIHNldmVyYWwgdGltZXMuCisgIGlmICghY2luZm8tPnRpbGVfZGVjb2RlKQorI2VuZGlmCisgICAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1JFQURZKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKworICAvKiBDb21wdXRlIGFjdHVhbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KKyAgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgeworICAgIC8qIFByb3ZpZGUgMS84IHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDhMKTsKKyAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOworICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMTsKKyAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKKyAgICAvKiBQcm92aWRlIDEvNCBzY2FsaW5nICovCisgICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQorICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7CisgICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDRMKTsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDI7CisgIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7CisgICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLworICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7CisgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OworICB9IGVsc2UgeworICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KKyAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7CisgIH0KKyAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KKyAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KKyAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCisgICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCisgICAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIGludCBzc2l6ZSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOworICAgIHdoaWxlIChzc2l6ZSA8IERDVFNJWkUgJiYKKwkgICAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQorCSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkgJiYKKwkgICAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQorCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkpIHsKKyAgICAgIHNzaXplID0gc3NpemUgKiAyOworICAgIH0KKyAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKKyAgfQorCisgIC8qIFJlY29tcHV0ZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHM7CisgICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlc2UgaWYgdXNpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuCisgICAqLworICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOworICAgICAgIGNpKyssIGNvbXBwdHIrKykgeworICAgIC8qIFNpemUgaW4gc2FtcGxlcywgYWZ0ZXIgSURDVCBzY2FsaW5nICovCisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKKyAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqCisJCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAorCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7CisgICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCisgICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICoKKwkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCisJCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKKyAgfQorCisjZWxzZSAvKiAhSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLworCisgIC8qIEhhcmR3aXJlIGl0IHRvICJubyBzY2FsaW5nIiAqLworICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOworICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgIC8qIGpkaW5wdXQuYyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBEQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRSwKKyAgICogYW5kIGhhcyBjb21wdXRlZCB1bnNjYWxlZCBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0LgorICAgKi8KKworI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KKworICAvKiBSZXBvcnQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gc2VsZWN0ZWQgY29sb3JzcGFjZS4gKi8KKyAgLyogUHJvYmFibHkgdGhpcyBzaG91bGQgYmUgaW4gdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLi4uICovCisgIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgeworICBjYXNlIEpDU19HUkFZU0NBTEU6CisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICBicmVhazsKKyAgY2FzZSBKQ1NfUkdCOgorI2lmIFJHQl9QSVhFTFNJWkUgIT0gMworICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7CisgICAgYnJlYWs7CisjZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KKyNpZmRlZiBBTkRST0lEX1JHQgorICBjYXNlIEpDU19SR0JfNTY1OgorI2VuZGlmCisgIGNhc2UgSkNTX1lDYkNyOgorICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDM7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX0NNWUs6CisgIGNhc2UgSkNTX1lDQ0s6CisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgY2FzZSBKQ1NfUkdCQV84ODg4OgorI2VuZGlmCisgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoJCQkvKiBlbHNlIG11c3QgYmUgc2FtZSBjb2xvcnNwYWNlIGFzIGluIGZpbGUgKi8KKyAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgYnJlYWs7CisgIH0KKyAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgPyAxIDoKKwkJCSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7CisKKyAgLyogU2VlIGlmIHVwc2FtcGxlciB3aWxsIHdhbnQgdG8gZW1pdCBtb3JlIHRoYW4gb25lIHJvdyBhdCBhIHRpbWUgKi8KKyAgaWYgKHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pKQorICAgIGNpbmZvLT5yZWNfb3V0YnVmX2hlaWdodCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgZWxzZQorICAgIGNpbmZvLT5yZWNfb3V0YnVmX2hlaWdodCA9IDE7Cit9CisKKworLyoKKyAqIFNldmVyYWwgZGVjb21wcmVzc2lvbiBwcm9jZXNzZXMgbmVlZCB0byByYW5nZS1saW1pdCB2YWx1ZXMgdG8gdGhlIHJhbmdlCisgKiAwLi5NQVhKU0FNUExFOyB0aGUgaW5wdXQgdmFsdWUgbWF5IGZhbGwgc29tZXdoYXQgb3V0c2lkZSB0aGlzIHJhbmdlCisgKiBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBxdWFudGl6YXRpb24sIHJvdW5kb2ZmIGVycm9yLCBldGMuICBUaGVzZQorICogcHJvY2Vzc2VzIGFyZSBpbm5lciBsb29wcyBhbmQgbmVlZCB0byBiZSBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgT24gbW9zdAorICogbWFjaGluZXMsIHBhcnRpY3VsYXJseSBDUFVzIHdpdGggcGlwZWxpbmVzIG9yIGluc3RydWN0aW9uIHByZWZldGNoLAorICogYSAoc3Vic2NyaXB0LWNoZWNrLWxlc3MpIEMgdGFibGUgbG9va3VwCisgKgkJeCA9IHNhbXBsZV9yYW5nZV9saW1pdFt4XTsKKyAqIGlzIGZhc3RlciB0aGFuIGV4cGxpY2l0IHRlc3RzCisgKgkJaWYgKHggPCAwKSAgeCA9IDA7CisgKgkJZWxzZSBpZiAoeCA+IE1BWEpTQU1QTEUpICB4ID0gTUFYSlNBTVBMRTsKKyAqIFRoZXNlIHByb2Nlc3NlcyBhbGwgdXNlIGEgY29tbW9uIHRhYmxlIHByZXBhcmVkIGJ5IHRoZSByb3V0aW5lIGJlbG93LgorICoKKyAqIEZvciBtb3N0IHN0ZXBzIHdlIGNhbiBtYXRoZW1hdGljYWxseSBndWFyYW50ZWUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZQorICogb2YgeCBpcyB3aXRoaW4gTUFYSlNBTVBMRSsxIG9mIHRoZSBsZWdhbCByYW5nZSwgc28gYSB0YWJsZSBydW5uaW5nIGZyb20KKyAqIC0oTUFYSlNBTVBMRSsxKSB0byAyKk1BWEpTQU1QTEUrMSBpcyBzdWZmaWNpZW50LiAgQnV0IGZvciB0aGUgaW5pdGlhbAorICogbGltaXRpbmcgc3RlcCAoanVzdCBhZnRlciB0aGUgSURDVCksIGEgd2lsZGx5IG91dC1vZi1yYW5nZSB2YWx1ZSBpcworICogcG9zc2libGUgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdC4gIFRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgaW5kZXhpbmcKKyAqIG9mZiB0aGUgZW5kIG9mIG1lbW9yeSBhbmQgZ2V0dGluZyBhIGJhZC1wb2ludGVyIHRyYXAsIHdlIHBlcmZvcm0gdGhlCisgKiBwb3N0LUlEQ1QgbGltaXRpbmcgdGh1czoKKyAqCQl4ID0gcmFuZ2VfbGltaXRbeCAmIE1BU0tdOworICogd2hlcmUgTUFTSyBpcyAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGUgZGF0YSwgaWUgMTAgYml0cyBmb3IgOC1iaXQKKyAqIHNhbXBsZXMuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIG1vcmUgdGhhbiBlbm91Z2ggcmFuZ2UgYW5kCisgKiBhIGNvcnJlY3Qgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkOyB3aXRoIGJvZ3VzIGlucHV0IGRhdGEgdGhlIG1hc2sgd2lsbAorICogY2F1c2Ugd3JhcGFyb3VuZCwgYW5kIHdlIHdpbGwgc2FmZWx5IGdlbmVyYXRlIGEgYm9ndXMtYnV0LWluLXJhbmdlIG91dHB1dC4KKyAqIEZvciB0aGUgcG9zdC1JRENUIHN0ZXAsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZGF0YSBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZAorICogcmVwcmVzZW50YXRpb24gYnkgYWRkaW5nIENFTlRFUkpTQU1QTEUgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHdlIGxpbWl0IGl0LgorICogU28gdGhlIHBvc3QtSURDVCBsaW1pdGluZyB0YWJsZSBlbmRzIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgorICogICBDRU5URVJKU0FNUExFLENFTlRFUkpTQU1QTEUrMSwuLi4sTUFYSlNBTVBMRSwKKyAqICAgTUFYSlNBTVBMRSAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCisgKiAgIDAgICAgICAgICAgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAorICogICAwLDEsLi4uLENFTlRFUkpTQU1QTEUtMQorICogTmVnYXRpdmUgaW5wdXRzIHNlbGVjdCB2YWx1ZXMgZnJvbSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdGFibGUgYWZ0ZXIKKyAqIG1hc2tpbmcuCisgKgorICogV2UgY2FuIHNhdmUgc29tZSBzcGFjZSBieSBvdmVybGFwcGluZyB0aGUgc3RhcnQgb2YgdGhlIHBvc3QtSURDVCB0YWJsZQorICogd2l0aCB0aGUgc2ltcGxlciByYW5nZSBsaW1pdGluZyB0YWJsZS4gIFRoZSBwb3N0LUlEQ1QgdGFibGUgYmVnaW5zIGF0CisgKiBzYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSBvbiBQQ3M7IGl0J3Mgc21hbGwKKyAqIGVub3VnaCBhbmQgdXNlZCBvZnRlbiBlbm91Z2ggdG8ganVzdGlmeSB0aGlzLgorICovCisKK0xPQ0FMKHZvaWQpCitwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIHNhbXBsZV9yYW5nZV9saW1pdCB0YWJsZSAqLworeworICBKU0FNUExFICogdGFibGU7CisgIGludCBpOworCisgIHRhYmxlID0gKEpTQU1QTEUgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkoNSAqIChNQVhKU0FNUExFKzEpICsgQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICB0YWJsZSArPSAoTUFYSlNBTVBMRSsxKTsJLyogYWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cyBvZiBzaW1wbGUgdGFibGUgKi8KKyAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCA9IHRhYmxlOworICAvKiBGaXJzdCBzZWdtZW50IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IDAgZm9yIHggPCAwICovCisgIE1FTVpFUk8odGFibGUgLSAoTUFYSlNBTVBMRSsxKSwgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICAvKiBNYWluIHBhcnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0geCAqLworICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykKKyAgICB0YWJsZVtpXSA9IChKU0FNUExFKSBpOworICB0YWJsZSArPSBDRU5URVJKU0FNUExFOwkvKiBQb2ludCB0byB3aGVyZSBwb3N0LUlEQ1QgdGFibGUgc3RhcnRzICovCisgIC8qIEVuZCBvZiBzaW1wbGUgdGFibGUsIHJlc3Qgb2YgZmlyc3QgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KKyAgZm9yIChpID0gQ0VOVEVSSlNBTVBMRTsgaSA8IDIqKE1BWEpTQU1QTEUrMSk7IGkrKykKKyAgICB0YWJsZVtpXSA9IE1BWEpTQU1QTEU7CisgIC8qIFNlY29uZCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLworICBNRU1aRVJPKHRhYmxlICsgKDIgKiAoTUFYSlNBTVBMRSsxKSksCisJICAoMiAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOworICBNRU1DT1BZKHRhYmxlICsgKDQgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpLAorCSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCwgQ0VOVEVSSlNBTVBMRSAqIFNJWkVPRihKU0FNUExFKSk7Cit9CisKKworLyoKKyAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzLgorICogVGhpcyBpcyBkb25lIG9uY2UgYXQganBlZ19zdGFydF9kZWNvbXByZXNzIHRpbWUuICBXZSBkZXRlcm1pbmUKKyAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCisgKiBXZSBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIHRvIGJlZ2luIGNvbnN1bWluZyBkYXRhLgorICoKKyAqIFNpbmNlIGpwZWdfcmVhZF9oZWFkZXIgaGFzIGZpbmlzaGVkLCB3ZSBrbm93IHdoYXQgaXMgaW4gdGhlIFNPRgorICogYW5kIChmaXJzdCkgU09TIG1hcmtlcnMuICBXZSBhbHNvIGhhdmUgYWxsIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKKyAqIHNldHRpbmdzLgorICovCisKK0xPQ0FMKHZvaWQpCittYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworICBib29sZWFuIHVzZV9jX2J1ZmZlcjsKKyAgbG9uZyBzYW1wbGVzcGVycm93OworICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7CisKKyAgLyogSW5pdGlhbGl6ZSBkaW1lbnNpb25zIGFuZCBvdGhlciBzdHVmZiAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworICBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlKGNpbmZvKTsKKworICAvKiBXaWR0aCBvZiBhbiBvdXRwdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCisgIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCAqIChsb25nKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKKyAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7CisKKyAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCisgIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOworICBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSA9IHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pOworCisgIC8qIENvbG9yIHF1YW50aXplciBzZWxlY3Rpb24gKi8KKyAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBOVUxMOworICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IE5VTEw7CisgIC8qIE5vIG1vZGUgY2hhbmdlcyBpZiBub3QgdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KKyAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgeworICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBGQUxTRTsKKyAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7CisgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworICB9CisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgaWYgKGNpbmZvLT5yYXdfZGF0YV9vdXQpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworICAgIC8qIDItcGFzcyBxdWFudGl6ZXIgb25seSB3b3JrcyBpbiAzLWNvbXBvbmVudCBjb2xvciBzcGFjZS4gKi8KKyAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOworICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOworICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOworICAgICAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7CisgICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSkgeworICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOworICAgIH0KKworICAgIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7CisjaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECisgICAgICBqaW5pdF8xcGFzc19xdWFudGl6ZXIoY2luZm8pOworICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBjaW5mby0+Y3F1YW50aXplOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8qIFdlIHVzZSB0aGUgMi1wYXNzIGNvZGUgdG8gbWFwIHRvIGV4dGVybmFsIGNvbG9ybWFwcy4gKi8KKyAgICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCB8fCBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50KSB7CisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgICBqaW5pdF8ycGFzc19xdWFudGl6ZXIoY2luZm8pOworICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBjaW5mby0+Y3F1YW50aXplOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0KKyAgICAvKiBJZiBib3RoIHF1YW50aXplcnMgYXJlIGluaXRpYWxpemVkLCB0aGUgMi1wYXNzIG9uZSBpcyBsZWZ0IGFjdGl2ZTsKKyAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3Igc3RhcnRpbmcgd2l0aCBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWwgbWFwLgorICAgICAqLworICB9CisKKyAgLyogUG9zdC1wcm9jZXNzaW5nOiBpbiBwYXJ0aWN1bGFyLCBjb2xvciBjb252ZXJzaW9uIGZpcnN0ICovCisgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKKyAgICBpZiAobWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpIHsKKyNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAorICAgICAgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcihjaW5mbyk7IC8qIGRvZXMgY29sb3IgY29udmVyc2lvbiB0b28gKi8KKyNlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOworICAgICAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKKyAgICB9CisgICAgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIoY2luZm8sIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpOworICB9CisgIC8qIEludmVyc2UgRENUICovCisgIGppbml0X2ludmVyc2VfZGN0KGNpbmZvKTsKKyAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCisgIGlmIChjaW5mby0+YXJpdGhfY29kZSkgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7CisjaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOworI2Vsc2UKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZgorICAgIH0gZWxzZQorICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgcHJpbmNpcGFsIGJ1ZmZlciBjb250cm9sbGVycy4gKi8KKyAgdXNlX2NfYnVmZmVyID0gY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgfHwgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlOworICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgdXNlX2NfYnVmZmVyKTsKKworICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KQorICAgIGppbml0X2RfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOworCisgIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCisgICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KKyAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7CisKKyNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgLyogSWYganBlZ19zdGFydF9kZWNvbXByZXNzIHdpbGwgcmVhZCB0aGUgd2hvbGUgZmlsZSwgaW5pdGlhbGl6ZQorICAgKiBwcm9ncmVzcyBtb25pdG9yaW5nIGFwcHJvcHJpYXRlbHkuICBUaGUgaW5wdXQgc3RlcCBpcyBjb3VudGVkCisgICAqIGFzIG9uZSBwYXNzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmCisgICAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworICAgIGludCBuc2NhbnM7CisgICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KKyAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgICB9CisgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOworICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAzIDogMik7CisgICAgLyogQ291bnQgdGhlIGlucHV0IHBhc3MgYXMgZG9uZSAqLworICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKKyAgfQorI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLworfQorCisKKy8qCisgKiBQZXItcGFzcyBzZXR1cC4KKyAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBvdXRwdXQgcGFzcy4gIFdlIGRldGVybWluZSB3aGljaAorICogbW9kdWxlcyB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUKKyAqIHN0YXJ0X3Bhc3MgY2FsbHMuICBXZSBhbHNvIHNldCBpc19kdW1teV9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcworICogaXMgYSAicmVhbCIgb3V0cHV0IHBhc3Mgb3IgYSBkdW1teSBwYXNzIGZvciBjb2xvciBxdWFudGl6YXRpb24uCisgKiAoSW4gdGhlIGxhdHRlciBjYXNlLCBqZGFwaXN0ZC5jIHdpbGwgY3JhbmsgdGhlIHBhc3MgdG8gY29tcGxldGlvbi4pCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKKworICBpZiAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcykgeworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorICAgIC8qIEZpbmFsIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLworICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOworICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKKyAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7CisjZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+Y29sb3JtYXAgPT0gTlVMTCkgeworICAgICAgLyogU2VsZWN0IG5ldyBxdWFudGl6YXRpb24gbWV0aG9kICovCisgICAgICBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplICYmIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKKwljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7CisJbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IFRSVUU7CisgICAgICB9IGVsc2UgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKKwljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3M7CisgICAgICB9IGVsc2UgeworCUVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOworICAgICAgfQorICAgIH0KKyAgICAoKmNpbmZvLT5pZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X291dHB1dF9wYXNzKSAoY2luZm8pOworICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKKyAgICAgIGlmICghIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKQorCSgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOworICAgICAgKCpjaW5mby0+dXBzYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7CisgICAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKKwkoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyk7CisgICAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sCisJICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKKyAgICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOworICAgIH0KKyAgfQorCisgIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXIgKworCQkJCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IDIgOiAxKTsKKyAgICAvKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3ZSBhc3N1bWUgb25lIG1vcmUgb3V0cHV0IHBhc3MgaWYgRU9JIG5vdAorICAgICAqIHlldCByZWFjaGVkLCBidXQgbm8gbW9yZSBwYXNzZXMgaWYgRU9JIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJiAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKKyAgICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzICs9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMiA6IDEpOworICAgIH0KKyAgfQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgZW5kIG9mIGFuIG91dHB1dCBwYXNzLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgICgqY2luZm8tPmNxdWFudGl6ZS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7CisgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKK30KKworCisjaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKKy8qCisgKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19uZXdfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7CisKKyAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCAmJgorICAgICAgY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKKyAgICAvKiBTZWxlY3QgMi1wYXNzIHF1YW50aXplciBmb3IgZXh0ZXJuYWwgY29sb3JtYXAgdXNlICovCisgICAgY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOworICAgIC8qIE5vdGlmeSBxdWFudGl6ZXIgb2YgY29sb3JtYXAgY2hhbmdlICovCisgICAgKCpjaW5mby0+Y3F1YW50aXplLT5uZXdfY29sb3JfbWFwKSAoY2luZm8pOworICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsgLyoganVzdCBpbiBjYXNlICovCisgIH0gZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOworfQorCisjZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCisKKworLyoKKyAqIEluaXRpYWxpemUgbWFzdGVyIGRlY29tcHJlc3Npb24gY29udHJvbCBhbmQgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzLgorICogVGhpcyBpcyBwZXJmb3JtZWQgYXQgdGhlIHN0YXJ0IG9mIGpwZWdfc3RhcnRfZGVjb21wcmVzcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21hc3Rlcl9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKKworICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YobXlfZGVjb21wX21hc3RlcikpOworICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKikgbWFzdGVyOworICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyA9IHByZXBhcmVfZm9yX291dHB1dF9wYXNzOworICBtYXN0ZXItPnB1Yi5maW5pc2hfb3V0cHV0X3Bhc3MgPSBmaW5pc2hfb3V0cHV0X3Bhc3M7CisKKyAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOworCisgIG1hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkbWVyZ2UuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMzMwOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZG1lcmdlLmMKQEAgLTAsMCArMSw3NTcgQEAKKy8qCisgKiBqZG1lcmdlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZvciBtZXJnZWQgdXBzYW1wbGluZy9jb2xvciBjb252ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb21iaW5lcyBmdW5jdGlvbnMgZnJvbSBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmM7CisgKiByZWFkIHRob3NlIGZpbGVzIGZpcnN0IHRvIHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uLgorICoKKyAqIFdoZW4gdGhlIGNocm9tYSBjb21wb25lbnRzIGFyZSB0byBiZSB1cHNhbXBsZWQgYnkgc2ltcGxlIHJlcGxpY2F0aW9uCisgKiAoaWUsIGJveCBmaWx0ZXJpbmcpLCB3ZSBjYW4gc2F2ZSBzb21lIHdvcmsgaW4gY29sb3IgY29udmVyc2lvbiBieQorICogY2FsY3VsYXRpbmcgYWxsIHRoZSBvdXRwdXQgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyIG9mIGNocm9tYQorICogc2FtcGxlcyBhdCBvbmUgdGltZS4gIEluIHRoZSBjb252ZXJzaW9uIGVxdWF0aW9ucworICoJUiA9IFkgICAgICAgICAgICsgSzEgKiBDcgorICoJRyA9IFkgKyBLMiAqIENiICsgSzMgKiBDcgorICoJQiA9IFkgKyBLNCAqIENiCisgKiBvbmx5IHRoZSBZIHRlcm0gdmFyaWVzIGFtb25nIHRoZSBncm91cCBvZiBwaXhlbHMgY29ycmVzcG9uZGluZyB0byBhIHBhaXIKKyAqIG9mIGNocm9tYSBzYW1wbGVzLCBzbyB0aGUgcmVzdCBvZiB0aGUgdGVybXMgY2FuIGJlIGNhbGN1bGF0ZWQganVzdCBvbmNlLgorICogQXQgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MsIHRoaXMgZWxpbWluYXRlcyBoYWxmIG9yIHRocmVlLXF1YXJ0ZXJzIG9mIHRoZQorICogbXVsdGlwbGljYXRpb25zIG5lZWRlZCBmb3IgY29sb3IgY29udmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgY3VycmVudGx5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKKyAqCVlDYkNyID0+IFJHQiBjb2xvciBjb252ZXJzaW9uIG9ubHkuCisgKglTYW1wbGluZyByYXRpb3Mgb2YgMmgxdiBvciAyaDJ2LgorICoJTm8gc2NhbGluZyBuZWVkZWQgYXQgdXBzYW1wbGUgdGltZS4KKyAqCUNvcm5lci1hbGlnbmVkIChub24tQ0NJUjYwMSkgc2FtcGxpbmcgYWxpZ25tZW50LgorICogT3RoZXIgc3BlY2lhbCBjYXNlcyBjb3VsZCBiZSBhZGRlZCwgYnV0IGluIG1vc3QgYXBwbGljYXRpb25zIHRoZXNlIGFyZQorICogdGhlIG9ubHkgY29tbW9uIGNhc2VzLiAgKEZvciB1bmNvbW1vbiBjYXNlcyB3ZSBmYWxsIGJhY2sgb24gdGhlIG1vcmUKKyAqIGdlbmVyYWwgY29kZSBpbiBqZHNhbXBsZS5jIGFuZCBqZGNvbG9yLmMuKQorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKworI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECisKKyNpZmRlZiBBTkRST0lEX1JHQgorCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICogCisgKiBXZSB1c2UgNHg0IG9yZGVyZWQgZGl0aGVyIGFycmF5IHBhY2tlZCBpbnRvIDMyIGJpdHMuIFRoaXMgYXJyYXkgaXMKKyAqIHN1ZmZpY2VudCBmb3IgZGl0aGVyaW5nIFJHQl84ODggdG8gUkdCXzU2NS4KKyAqLworCisjZGVmaW5lIERJVEhFUl9NQVNLICAgICAgICAgMHgzCisjZGVmaW5lIERJVEhFUl9ST1RBVEUoeCkgICAgKCgoeCk8PDI0KSB8ICgoKHgpPj44KSYweDAwRkZGRkZGKSkKK3N0YXRpYyBjb25zdCBJTlQzMiBkaXRoZXJfbWF0cml4WzRdID0geworICAweDAwMDgwMjBBLAorICAweDBDMDQwRTA2LAorICAweDAzMEIwMTA5LAorICAweDBGMDcwRDA1Cit9OworCisjZW5kaWYKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogUG9pbnRlciB0byByb3V0aW5lIHRvIGRvIGFjdHVhbCB1cHNhbXBsaW5nL2NvbnZlcnNpb24gb2Ygb25lIHJvdyBncm91cCAqLworICBKTUVUSE9EKHZvaWQsIHVwbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCSAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisJCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpKTsKKworICAvKiBQcml2YXRlIHN0YXRlIGZvciBZQ0MtPlJHQiBjb252ZXJzaW9uICovCisgIGludCAqIENyX3JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIFIgY29udmVyc2lvbiAqLworICBpbnQgKiBDYl9iX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBCIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiBDcl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDciB0byBHIGNvbnZlcnNpb24gKi8KKyAgSU5UMzIgKiBDYl9nX3RhYjsJCS8qID0+IHRhYmxlIGZvciBDYiB0byBHIGNvbnZlcnNpb24gKi8KKworICAvKiBGb3IgMjoxIHZlcnRpY2FsIHNhbXBsaW5nLCB3ZSBwcm9kdWNlIHR3byBvdXRwdXQgcm93cyBhdCBhIHRpbWUuCisgICAqIFdlIG5lZWQgYSAic3BhcmUiIHJvdyBidWZmZXIgdG8gaG9sZCB0aGUgc2Vjb25kIG91dHB1dCByb3cgaWYgdGhlCisgICAqIGFwcGxpY2F0aW9uIHByb3ZpZGVzIGp1c3QgYSBvbmUtcm93IGJ1ZmZlcjsgd2UgYWxzbyB1c2UgdGhlIHNwYXJlCisgICAqIHRvIGRpc2NhcmQgdGhlIGR1bW15IGxhc3Qgcm93IGlmIHRoZSBpbWFnZSBoZWlnaHQgaXMgb2RkLgorICAgKi8KKyAgSlNBTVBST1cgc3BhcmVfcm93OworICBib29sZWFuIHNwYXJlX2Z1bGw7CQkvKiBUIGlmIHNwYXJlIGJ1ZmZlciBpcyBvY2N1cGllZCAqLworCisgIEpESU1FTlNJT04gb3V0X3Jvd193aWR0aDsJLyogc2FtcGxlcyBwZXIgb3V0cHV0IHJvdyAqLworICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBpbWFnZSAqLworfSBteV91cHNhbXBsZXI7CisKK3R5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOworCisjZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLworI2RlZmluZSBPTkVfSEFMRgkoKElOVDMyKSAxIDw8IChTQ0FMRUJJVFMtMSkpCisjZGVmaW5lIEZJWCh4KQkJKChJTlQzMikgKCh4KSAqICgxTDw8U0NBTEVCSVRTKSArIDAuNSkpCisKKworLyoKKyAqIEluaXRpYWxpemUgdGFibGVzIGZvciBZQ0MtPlJHQiBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisgKiBUaGlzIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gamRjb2xvci5jOyBzZWUgdGhhdCBmaWxlIGZvciBtb3JlIGluZm8uCisgKi8KKworTE9DQUwodm9pZCkKK2J1aWxkX3ljY19yZ2JfdGFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgaW50IGk7CisgIElOVDMyIHg7CisgIFNISUZUX1RFTVBTCisKKyAgdXBzYW1wbGUtPkNyX3JfdGFiID0gKGludCAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7CisgIHVwc2FtcGxlLT5DYl9iX3RhYiA9IChpbnQgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKGludCkpOworICB1cHNhbXBsZS0+Q3JfZ190YWIgPSAoSU5UMzIgKikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCShNQVhKU0FNUExFKzEpICogU0laRU9GKElOVDMyKSk7CisgIHVwc2FtcGxlLT5DYl9nX3RhYiA9IChJTlQzMiAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKKworICBmb3IgKGkgPSAwLCB4ID0gLUNFTlRFUkpTQU1QTEU7IGkgPD0gTUFYSlNBTVBMRTsgaSsrLCB4KyspIHsKKyAgICAvKiBpIGlzIHRoZSBhY3R1YWwgaW5wdXQgcGl4ZWwgdmFsdWUsIGluIHRoZSByYW5nZSAwLi5NQVhKU0FNUExFICovCisgICAgLyogVGhlIENiIG9yIENyIHZhbHVlIHdlIGFyZSB0aGlua2luZyBvZiBpcyB4ID0gaSAtIENFTlRFUkpTQU1QTEUgKi8KKyAgICAvKiBDcj0+UiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjQwMjAwICogeCAqLworICAgIHVwc2FtcGxlLT5Dcl9yX3RhYltpXSA9IChpbnQpCisJCSAgICBSSUdIVF9TSElGVChGSVgoMS40MDIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7CisgICAgLyogQ2I9PkIgdmFsdWUgaXMgbmVhcmVzdCBpbnQgdG8gMS43NzIwMCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q2JfYl90YWJbaV0gPSAoaW50KQorCQkgICAgUklHSFRfU0hJRlQoRklYKDEuNzcyMDApICogeCArIE9ORV9IQUxGLCBTQ0FMRUJJVFMpOworICAgIC8qIENyPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC43MTQxNCAqIHggKi8KKyAgICB1cHNhbXBsZS0+Q3JfZ190YWJbaV0gPSAoLSBGSVgoMC43MTQxNCkpICogeDsKKyAgICAvKiBDYj0+RyB2YWx1ZSBpcyBzY2FsZWQtdXAgLTAuMzQ0MTQgKiB4ICovCisgICAgLyogV2UgYWxzbyBhZGQgaW4gT05FX0hBTEYgc28gdGhhdCBuZWVkIG5vdCBkbyBpdCBpbiBpbm5lciBsb29wICovCisgICAgdXBzYW1wbGUtPkNiX2dfdGFiW2ldID0gKC0gRklYKDAuMzQ0MTQpKSAqIHggKyBPTkVfSEFMRjsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworCisgIC8qIE1hcmsgdGhlIHNwYXJlIGJ1ZmZlciBlbXB0eSAqLworICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOworICAvKiBJbml0aWFsaXplIHRvdGFsLWhlaWdodCBjb3VudGVyIGZvciBkZXRlY3RpbmcgYm90dG9tIG9mIGltYWdlICovCisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7Cit9CisKKworLyoKKyAqIENvbnRyb2wgcm91dGluZSB0byBkbyB1cHNhbXBsaW5nIChhbmQgY29sb3IgY29udmVyc2lvbikuCisgKgorICogVGhlIGNvbnRyb2wgcm91dGluZSBqdXN0IGhhbmRsZXMgdGhlIHJvdyBidWZmZXJpbmcgY29uc2lkZXJhdGlvbnMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCittZXJnZWRfMnZfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQorLyogMjoxIHZlcnRpY2FsIHNhbXBsaW5nIGNhc2U6IG1heSBuZWVkIGEgc3BhcmUgcm93LiAqLworeworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIEpTQU1QUk9XIHdvcmtfcHRyc1syXTsKKyAgSkRJTUVOU0lPTiBudW1fcm93czsJCS8qIG51bWJlciBvZiByb3dzIHJldHVybmVkIHRvIGNhbGxlciAqLworCisgIGlmICh1cHNhbXBsZS0+c3BhcmVfZnVsbCkgeworICAgIC8qIElmIHdlIGhhdmUgYSBzcGFyZSByb3cgc2F2ZWQgZnJvbSBhIHByZXZpb3VzIGN5Y2xlLCBqdXN0IHJldHVybiBpdC4gKi8KKyAgICAgIEpESU1FTlNJT04gc2l6ZSA9IHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoOworI2lmZGVmIEFORFJPSURfUkdCCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpCisgICAgICBzaXplID0gY2luZm8tPm91dHB1dF93aWR0aCoyOworI2VuZGlmCisgICAgamNvcHlfc2FtcGxlX3Jvd3MoJiB1cHNhbXBsZS0+c3BhcmVfcm93LCAwLCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLCAwLAorCQkgICAgICAxLCBzaXplKTsKKworICAgIG51bV9yb3dzID0gMTsKKyAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOworICB9IGVsc2UgeworICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4gdG8gY2FsbGVyLiAqLworICAgIG51bV9yb3dzID0gMjsKKyAgICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KKyAgICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykKKyAgICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287CisgICAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCisgICAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOworICAgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQorICAgICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKKyAgICAvKiBDcmVhdGUgb3V0cHV0IHBvaW50ZXIgYXJyYXkgZm9yIHVwc2FtcGxlci4gKi8KKyAgICB3b3JrX3B0cnNbMF0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0cl07CisgICAgaWYgKG51bV9yb3dzID4gMSkgeworICAgICAgd29ya19wdHJzWzFdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHIgKyAxXTsKKyAgICB9IGVsc2UgeworICAgICAgd29ya19wdHJzWzFdID0gdXBzYW1wbGUtPnNwYXJlX3JvdzsKKyAgICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gVFJVRTsKKyAgICB9CisgICAgLyogTm93IGRvIHRoZSB1cHNhbXBsaW5nLiAqLworICAgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsIHdvcmtfcHRycyk7CisgIH0KKworICAvKiBBZGp1c3QgY291bnRzICovCisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKyAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7CisgIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCisgIGlmICghIHVwc2FtcGxlLT5zcGFyZV9mdWxsKQorICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKK30KKworCitNRVRIT0RERUYodm9pZCkKK21lcmdlZF8xdl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCisvKiAxOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbXVjaCBlYXNpZXIsIG5ldmVyIG5lZWQgYSBzcGFyZSByb3cuICovCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKworICAvKiBKdXN0IGRvIHRoZSB1cHNhbXBsaW5nLiAqLworICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLAorCQkJIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIpOworICAvKiBBZGp1c3QgY291bnRzICovCisgICgqb3V0X3Jvd19jdHIpKys7CisgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKK30KKworCisvKgorICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHJvdXRpbmVzIHRvIGRvCisgKiB0aGUgYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbi4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgorICoKKyAqIE5vdGU6IHNpbmNlIHdlIG1heSBiZSB3cml0aW5nIGRpcmVjdGx5IGludG8gYXBwbGljYXRpb24tc3VwcGxpZWQgYnVmZmVycywKKyAqIHdlIGhhdmUgdG8gYmUgaG9uZXN0IGFib3V0IHRoZSBvdXRwdXQgd2lkdGg7IHdlIGNhbid0IGFzc3VtZSB0aGUgYnVmZmVyCisgKiBoYXMgYmVlbiByb3VuZGVkIHVwIHRvIGFuIGV2ZW4gd2lkdGguCisgKi8KKworCisvKgorICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYxX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgb3V0cHRyW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOworICAgIG91dHB0cltSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHJbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cltSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICB9Cit9CisKKworI2lmZGVmIEFORFJPSURfUkdCCitNRVRIT0RERUYodm9pZCkKK2gydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKyAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7CisgIEpESU1FTlNJT04gY29sOworICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCisgIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7CisgIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKKyAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOworICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKKyAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7CisgIHVuc2lnbmVkIGludCByLCBnLCBiOworICBJTlQzMiByZ2I7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKKyAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIsIHJnYik7CisgICAgb3V0cHRyICs9IDQ7CisgIH0KKyAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KKyAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7CisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAqKElOVDE2KilvdXRwdHIgPSByZ2I7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK2gydjFfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCisgICAgICAgICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKKyAgaW50IGNiLCBjcjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBKRElNRU5TSU9OIGNvbF9pbmRleCA9IDA7CisgIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOworICB1bnNpZ25lZCBpbnQgciwgZywgYjsKKyAgSU5UMzIgcmdiOworICBTSElGVF9URU1QUworCisgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIxID0gaW5wdXRfYnVmWzFdW2luX3Jvd19ncm91cF9jdHJdOworICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5fcm93X2dyb3VwX2N0cl07CisgIG91dHB0ciA9IG91dHB1dF9idWZbMF07CisgIC8qIExvb3AgZm9yIGVhY2ggcGFpciBvZiBvdXRwdXQgcGl4ZWxzICovCisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aCA+PiAxOyBjb2wgPiAwOyBjb2wtLSkgeworICAgIC8qIERvIHRoZSBjaHJvbWEgcGFydCBvZiB0aGUgY2FsY3VsYXRpb24gKi8KKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMisrKTsKKyAgICBjcmVkID0gQ3JydGFiW2NyXTsKKyAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKKyAgICBjYmx1ZSA9IENiYnRhYltjYl07CisgICAgLyogRmV0Y2ggMiBZIHZhbHVlcyBhbmQgZW1pdCAyIHBpeGVscyAqLworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0ciwgcmdiKTsKKyAgICBvdXRwdHIgKz0gNDsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMCk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDApXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQwKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQwKV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICooSU5UMTYqKW91dHB0ciA9IHJnYjsKKyAgfQorfQorCisKKyNlbmRpZgorCisvKgorICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYyX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOworICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07CisgIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKKyAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07CisgIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgb3V0cHRyMFtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIwW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICBvdXRwdHIwW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjBbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICBvdXRwdHIwICs9IFJHQl9QSVhFTFNJWkU7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIG91dHB0cjFbUkdCX1JFRF0gPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgb3V0cHRyMVtSR0JfQkxVRV0gPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIG91dHB0cjEgKz0gUkdCX1BJWEVMU0laRTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgb3V0cHRyMVtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIxW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgb3V0cHRyMSArPSBSR0JfUElYRUxTSVpFOworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7CisgICAgb3V0cHRyMFtSR0JfUkVEXSA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBvdXRwdHIwW1JHQl9CTFVFXSA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKKyAgICBvdXRwdHIxW1JHQl9SRURdID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIG91dHB0cjFbUkdCX0JMVUVdID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgfQorfQorCisKKyNpZmRlZiBBTkRST0lEX1JHQgorCitNRVRIT0RERUYodm9pZCkKK2gydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKKyAgICAgICAgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOworICBpbnQgY2IsIGNyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHIwLCBvdXRwdHIxOworICBKU0FNUFJPVyBpbnB0cjAwLCBpbnB0cjAxLCBpbnB0cjEsIGlucHRyMjsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIC8qIGNvcHkgdGhlc2UgcG9pbnRlcnMgaW50byByZWdpc3RlcnMgaWYgcG9zc2libGUgKi8KKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIHJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICogQ3JydGFiID0gdXBzYW1wbGUtPkNyX3JfdGFiOworICBpbnQgKiBDYmJ0YWIgPSB1cHNhbXBsZS0+Q2JfYl90YWI7CisgIElOVDMyICogQ3JndGFiID0gdXBzYW1wbGUtPkNyX2dfdGFiOworICBJTlQzMiAqIENiZ3RhYiA9IHVwc2FtcGxlLT5DYl9nX3RhYjsKKyAgdW5zaWduZWQgaW50IHIsIGcsIGI7CisgIElOVDMyIHJnYjsKKyAgU0hJRlRfVEVNUFMKKworICBpbnB0cjAwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMl07CisgIGlucHRyMDEgPSBpbnB1dF9idWZbMF1baW5fcm93X2dyb3VwX2N0cioyICsgMV07CisgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgaW5wdHIyID0gaW5wdXRfYnVmWzJdW2luX3Jvd19ncm91cF9jdHJdOworICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXTsKKyAgb3V0cHRyMSA9IG91dHB1dF9idWZbMV07CisgIC8qIExvb3AgZm9yIGVhY2ggZ3JvdXAgb2Ygb3V0cHV0IHBpeGVscyAqLworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggPj4gMTsgY29sID4gMDsgY29sLS0pIHsKKyAgICAvKiBEbyB0aGUgY2hyb21hIHBhcnQgb2YgdGhlIGNhbGN1bGF0aW9uICovCisgICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIrKyk7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIC8qIEZldGNoIDQgWSB2YWx1ZXMgYW5kIGVtaXQgNCBwaXhlbHMgKi8KKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbeSArIGNyZWRdOworICAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMCwgcmdiKTsKKyAgICBvdXRwdHIwICs9IDQ7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIHIgPSByYW5nZV9saW1pdFt5ICsgY3JlZF07CisgICAgZyA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOworICAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDErKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19UV09fUElYRUxTKHJnYiwgUEFDS19TSE9SVF81NjUocixnLGIpKTsKKyAgICBXUklURV9UV09fUElYRUxTKG91dHB0cjEsIHJnYik7CisgICAgb3V0cHRyMSArPSA0OworICB9CisgIC8qIElmIGltYWdlIHdpZHRoIGlzIG9kZCwgZG8gdGhlIGxhc3Qgb3V0cHV0IGNvbHVtbiBzZXBhcmF0ZWx5ICovCisgIGlmIChjaW5mby0+b3V0cHV0X3dpZHRoICYgMSkgeworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKTsKKyAgICBjciA9IEdFVEpTQU1QTEUoKmlucHRyMik7CisgICAgY3JlZCA9IENycnRhYltjcl07CisgICAgY2dyZWVuID0gKGludCkgUklHSFRfU0hJRlQoQ2JndGFiW2NiXSArIENyZ3RhYltjcl0sIFNDQUxFQklUUyk7CisgICAgY2JsdWUgPSBDYmJ0YWJbY2JdOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCk7CisgICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07CisgICAgYiA9IHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgICooSU5UMTYqKW91dHB0cjAgPSByZ2I7CisgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDEpOworICAgciA9IHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKKyAgIGcgPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKKyAgIGIgPSByYW5nZV9saW1pdFt5ICsgY2JsdWVdOworICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgKihJTlQxNiopb3V0cHRyMSA9IHJnYjsKKyAgfQorfQorCisKKworTUVUSE9EREVGKHZvaWQpCitoMnYyX21lcmdlZF91cHNhbXBsZV81NjVEIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBfY3RyLAorICAgICAgICAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYpCit7CisgIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKKyAgcmVnaXN0ZXIgaW50IHksIGNyZWQsIGNncmVlbiwgY2JsdWU7CisgIGludCBjYiwgY3I7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjE7CisgIEpTQU1QUk9XIGlucHRyMDAsIGlucHRyMDEsIGlucHRyMSwgaW5wdHIyOworICBKRElNRU5TSU9OIGNvbDsKKyAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLworICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OworICBpbnQgKiBDcnJ0YWIgPSB1cHNhbXBsZS0+Q3Jfcl90YWI7CisgIGludCAqIENiYnRhYiA9IHVwc2FtcGxlLT5DYl9iX3RhYjsKKyAgSU5UMzIgKiBDcmd0YWIgPSB1cHNhbXBsZS0+Q3JfZ190YWI7CisgIElOVDMyICogQ2JndGFiID0gdXBzYW1wbGUtPkNiX2dfdGFiOworICBKRElNRU5TSU9OIGNvbF9pbmRleCA9IDA7CisgIElOVDMyIGQwID0gZGl0aGVyX21hdHJpeFtjaW5mby0+b3V0cHV0X3NjYW5saW5lICYgRElUSEVSX01BU0tdOworICBJTlQzMiBkMSA9IGRpdGhlcl9tYXRyaXhbKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUrMSkgJiBESVRIRVJfTUFTS107CisgIHVuc2lnbmVkIGludCByLCBnLCBiOworICBJTlQzMiByZ2I7CisgIFNISUZUX1RFTVBTCisKKyAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOworICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOworICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07CisgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKKyAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07CisgIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOworICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgCisgICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLworICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovICAgIAorICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMCsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMCldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDApXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDApXTsKKyAgICBkMCA9IERJVEhFUl9ST1RBVEUoZDApOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7CisgICAgciA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfUih5ICsgY3JlZCwgZDEpXTsKKyAgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQxKV07CisgICAgYiA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfQih5ICsgY2JsdWUsIGQxKV07CisgICAgZDEgPSBESVRIRVJfUk9UQVRFKGQxKTsKKyAgICByZ2IgPSBQQUNLX1RXT19QSVhFTFMocmdiLCBQQUNLX1NIT1JUXzU2NShyLGcsYikpOworICAgIFdSSVRFX1RXT19QSVhFTFMob3V0cHRyMCwgcmdiKTsKKyAgICBvdXRwdHIwICs9IDQ7CisgICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIGQwID0gRElUSEVSX1JPVEFURShkMCk7CisgICAgcmdiID0gUEFDS19TSE9SVF81NjUocixnLGIpOworICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKKyAgICByID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9SKHkgKyBjcmVkLCBkMSldOworICAgIGcgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0coeSArIGNncmVlbiwgZDEpXTsKKyAgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKKyAgICBkMSA9IERJVEhFUl9ST1RBVEUoZDEpOworICAgIHJnYiA9IFBBQ0tfVFdPX1BJWEVMUyhyZ2IsIFBBQ0tfU0hPUlRfNTY1KHIsZyxiKSk7CisgICAgV1JJVEVfVFdPX1BJWEVMUyhvdXRwdHIxLCByZ2IpOworICAgIG91dHB0cjEgKz0gNDsKKyAgfQorICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKKyAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7CisgICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOworICAgIGNyZWQgPSBDcnJ0YWJbY3JdOworICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOworICAgIGNibHVlID0gQ2JidGFiW2NiXTsKKyAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOworICAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQwKV07CisgICAgZyA9IHJhbmdlX2xpbWl0W0RJVEhFUl81NjVfRyh5ICsgY2dyZWVuLCBkMCldOworICAgIGIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X0IoeSArIGNibHVlLCBkMCldOworICAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICAqKElOVDE2KilvdXRwdHIwID0gcmdiOworICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKTsKKyAgIHIgPSByYW5nZV9saW1pdFtESVRIRVJfNTY1X1IoeSArIGNyZWQsIGQxKV07CisgICBnID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9HKHkgKyBjZ3JlZW4sIGQxKV07CisgICBiID0gcmFuZ2VfbGltaXRbRElUSEVSXzU2NV9CKHkgKyBjYmx1ZSwgZDEpXTsKKyAgIHJnYiA9IFBBQ0tfU0hPUlRfNTY1KHIsZyxiKTsKKyAgICooSU5UMTYqKW91dHB0cjEgPSByZ2I7CisgIH0KK30KKworI2VuZGlmCisKKy8qCisgKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbi4KKyAqCisgKiBOQjogdGhpcyBpcyBjYWxsZWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGV0ZXJtaW5lZCBieSB1c2VfbWVyZ2VkX3Vwc2FtcGxlKCkKKyAqIGluIGpkbWFzdGVyLmMuICBUaGF0IHJvdXRpbmUgTVVTVCBjb3JyZXNwb25kIHRvIHRoZSBhY3R1YWwgY2FwYWJpbGl0aWVzCisgKiBvZiB0aGlzIG1vZHVsZTsgbm8gc2FmZXR5IGNoZWNrcyBhcmUgbWFkZSBoZXJlLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfbWVyZ2VkX3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOworCisgIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKKyAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19tZXJnZWRfdXBzYW1wbGU7CisgIHVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsKKworICB1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIAorICBpZiAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID09IDIpIHsKKyAgICB1cHNhbXBsZS0+cHViLnVwc2FtcGxlID0gbWVyZ2VkXzJ2X3Vwc2FtcGxlOworICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlOworI2lmZGVmIEFORFJPSURfUkdCCisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQl81NjUpIHsKKyAgICAgICAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX05PTkUpIHsKKyAgICAgICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwc2FtcGxlLT51cG1ldGhvZCA9IGgydjJfbWVyZ2VkX3Vwc2FtcGxlXzU2NUQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBBbGxvY2F0ZSBhIHNwYXJlIHJvdyBidWZmZXIgKi8KKyAgICB1cHNhbXBsZS0+c3BhcmVfcm93ID0gKEpTQU1QUk9XKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJKHNpemVfdCkgKHVwc2FtcGxlLT5vdXRfcm93X3dpZHRoICogU0laRU9GKEpTQU1QTEUpKSk7CisgIH0gZWxzZSB7CisgICAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IG1lcmdlZF8xdl91cHNhbXBsZTsKKyAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZTsKKyNpZmRlZiBBTkRST0lEX1JHQgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0JfNTY1KSB7CisgICAgICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9OT05FKSB7CisgICAgICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZV81NjU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cHNhbXBsZS0+dXBtZXRob2QgPSBoMnYxX21lcmdlZF91cHNhbXBsZV81NjVEOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLyogTm8gc3BhcmUgcm93IG5lZWRlZCAqLworICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSBOVUxMOworICB9CisKKyAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Cit9CisKKyNlbmRpZiAvKiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkcGh1ZmYuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZHBodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NjZmRkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZHBodWZmLmMKQEAgLTAsMCArMSw3NzYgQEAKKy8qCisgKiBqZHBodWZmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMgZm9yIHByb2dyZXNzaXZlIEpQRUcuCisgKgorICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgaW5wdXQgc3VzcGVuc2lvbi4KKyAqIElmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gYmFjaworICogdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUgdmFyaWFibGVzCisgKiBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlIHBlcm1hbmVudAorICogc3RvcmFnZSBvbmx5IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGFuIE1DVS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRodWZmLmgiCQkvKiBEZWNsYXJhdGlvbnMgc2hhcmVkIHdpdGggamRodWZmLmMgKi8KKworCisjaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKKworLyoKKyAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZGVjb2RpbmcuCisgKgorICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAorICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVuc2lnbmVkIGludCBFT0JSVU47CQkJLyogcmVtYWluaW5nIEVPQnMgaW4gRU9CUlVOICovCisgIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07CS8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KK30gc2F2YWJsZV9zdGF0ZTsKKworLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgorICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCisgKi8KKworI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCisjZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKKyNlbHNlCisjaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAorI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCisJKChkZXN0KS5FT0JSVU4gPSAoc3JjKS5FT0JSVU4sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzBdID0gKHNyYykubGFzdF9kY192YWxbMF0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzFdID0gKHNyYykubGFzdF9kY192YWxbMV0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzJdID0gKHNyYykubGFzdF9kY192YWxbMl0sIFwKKwkgKGRlc3QpLmxhc3RfZGNfdmFsWzNdID0gKHNyYykubGFzdF9kY192YWxbM10pCisjZW5kaWYKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBhcmUgbG9hZGVkIGludG8gbG9jYWwgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGVhY2ggTUNVLgorICAgKiBJbiBjYXNlIG9mIHN1c3BlbnNpb24sIHdlIGV4aXQgV0lUSE9VVCB1cGRhdGluZyB0aGVtLgorICAgKi8KKyAgYml0cmVhZF9wZXJtX3N0YXRlIGJpdHN0YXRlOwkvKiBCaXQgYnVmZmVyIGF0IHN0YXJ0IG9mIE1DVSAqLworICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogT3RoZXIgc3RhdGUgYXQgc3RhcnQgb2YgTUNVICovCisKKyAgLyogVGhlc2UgZmllbGRzIGFyZSBOT1QgbG9hZGVkIGludG8gbG9jYWwgd29ya2luZyBzdGF0ZS4gKi8KKyAgdW5zaWduZWQgaW50IHJlc3RhcnRzX3RvX2dvOwkvKiBNQ1VzIGxlZnQgaW4gdGhpcyByZXN0YXJ0IGludGVydmFsICovCisKKyAgLyogUG9pbnRlcnMgdG8gZGVyaXZlZCB0YWJsZXMgKHRoZXNlIHdvcmtzcGFjZXMgaGF2ZSBpbWFnZSBsaWZlc3BhbikgKi8KKyAgZF9kZXJpdmVkX3RibCAqIGRlcml2ZWRfdGJsc1tOVU1fSFVGRl9UQkxTXTsKKworICBkX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90Ymw7IC8qIGFjdGl2ZSB0YWJsZSBkdXJpbmcgYW4gQUMgc2NhbiAqLworfSBwaHVmZl9lbnRyb3B5X2RlY29kZXI7CisKK3R5cGVkZWYgcGh1ZmZfZW50cm9weV9kZWNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitNRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19maXJzdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CitNRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9EQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKK01FVEhPRERFRihib29sZWFuKSBkZWNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOworR0xPQkFMKHZvaWQpIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2Rlcl9wcm9ncmVzc2l2ZSgKKwkJal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpOworR0xPQkFMKHZvaWQpIGpwZWdfZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uX3Byb2dyZXNzaXZlKAorCSAgICAgICAgal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSAqb2Zmc2V0KTsKKworLyoKKyAqIEluaXRpYWxpemUgZm9yIGEgSHVmZm1hbi1jb21wcmVzc2VkIHNjYW4uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3BodWZmX2RlY29kZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBib29sZWFuIGlzX0RDX2JhbmQsIGJhZDsKKyAgaW50IGNpLCBjb2VmaSwgdGJsOworICBpbnQgKmNvZWZfYml0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisKKyAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7CisKKyAgLyogVmFsaWRhdGUgc2NhbiBwYXJhbWV0ZXJzICovCisgIGJhZCA9IEZBTFNFOworICBpZiAoaXNfRENfYmFuZCkgeworICAgIGlmIChjaW5mby0+U2UgIT0gMCkKKyAgICAgIGJhZCA9IFRSVUU7CisgIH0gZWxzZSB7CisgICAgLyogbmVlZCBub3QgY2hlY2sgU3MvU2UgPCAwIHNpbmNlIHRoZXkgY2FtZSBmcm9tIHVuc2lnbmVkIGJ5dGVzICovCisgICAgaWYgKGNpbmZvLT5TcyA+IGNpbmZvLT5TZSB8fCBjaW5mby0+U2UgPj0gRENUU0laRTIpCisgICAgICBiYWQgPSBUUlVFOworICAgIC8qIEFDIHNjYW5zIG1heSBoYXZlIG9ubHkgb25lIGNvbXBvbmVudCAqLworICAgIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiAhPSAxKQorICAgICAgYmFkID0gVFJVRTsKKyAgfQorICBpZiAoY2luZm8tPkFoICE9IDApIHsKKyAgICAvKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuOiBtdXN0IGhhdmUgQWwgPSBBaC0xLiAqLworICAgIGlmIChjaW5mby0+QWwgIT0gY2luZm8tPkFoLTEpCisgICAgICBiYWQgPSBUUlVFOworICB9CisgIGlmIChjaW5mby0+QWwgPiAxMykJCS8qIG5lZWQgbm90IGNoZWNrIGZvciA8IDAgKi8KKyAgICBiYWQgPSBUUlVFOworICAvKiBBcmd1YWJseSB0aGUgbWF4aW11bSBBbCB2YWx1ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEzIGZvciA4LWJpdCBwcmVjaXNpb24sCisgICAqIGJ1dCB0aGUgc3BlYyBkb2Vzbid0IHNheSBzbywgYW5kIHdlIHRyeSB0byBiZSBsaWJlcmFsIGFib3V0IHdoYXQgd2UKKyAgICogYWNjZXB0LiAgTm90ZTogbGFyZ2UgQWwgdmFsdWVzIGNvdWxkIHJlc3VsdCBpbiBvdXQtb2YtcmFuZ2UgREMKKyAgICogY29lZmZpY2llbnRzIGR1cmluZyBlYXJseSBzY2FucywgbGVhZGluZyB0byBiaXphcnJlIGRpc3BsYXlzIGR1ZSB0bworICAgKiBvdmVyZmxvd3MgaW4gdGhlIElEQ1QgbWF0aC4gIEJ1dCB3ZSB3b24ndCBjcmFzaC4KKyAgICovCisgIGlmIChiYWQpCisgICAgRVJSRVhJVDQoY2luZm8sIEpFUlJfQkFEX1BST0dSRVNTSU9OLAorCSAgICAgY2luZm8tPlNzLCBjaW5mby0+U2UsIGNpbmZvLT5BaCwgY2luZm8tPkFsKTsKKyAgLyogVXBkYXRlIHByb2dyZXNzaW9uIHN0YXR1cywgYW5kIHZlcmlmeSB0aGF0IHNjYW4gb3JkZXIgaXMgbGVnYWwuCisgICAqIE5vdGUgdGhhdCBpbnRlci1zY2FuIGluY29uc2lzdGVuY2llcyBhcmUgdHJlYXRlZCBhcyB3YXJuaW5ncworICAgKiBub3QgZmF0YWwgZXJyb3JzIC4uLiBub3QgY2xlYXIgaWYgdGhpcyBpcyByaWdodCB3YXkgdG8gYmVoYXZlLgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKKyAgICBpbnQgY2luZGV4ID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldLT5jb21wb25lbnRfaW5kZXg7CisgICAgY29lZl9iaXRfcHRyID0gJiBjaW5mby0+Y29lZl9iaXRzW2NpbmRleF1bMF07CisgICAgaWYgKCFpc19EQ19iYW5kICYmIGNvZWZfYml0X3B0clswXSA8IDApIC8qIEFDIHdpdGhvdXQgcHJpb3IgREMgc2NhbiAqLworICAgICAgV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCAwKTsKKyAgICBmb3IgKGNvZWZpID0gY2luZm8tPlNzOyBjb2VmaSA8PSBjaW5mby0+U2U7IGNvZWZpKyspIHsKKyAgICAgIGludCBleHBlY3RlZCA9IChjb2VmX2JpdF9wdHJbY29lZmldIDwgMCkgPyAwIDogY29lZl9iaXRfcHRyW2NvZWZpXTsKKyAgICAgIGlmIChjaW5mby0+QWggIT0gZXhwZWN0ZWQpCisJV0FSTk1TMihjaW5mbywgSldSTl9CT0dVU19QUk9HUkVTU0lPTiwgY2luZGV4LCBjb2VmaSk7CisgICAgICBjb2VmX2JpdF9wdHJbY29lZmldID0gY2luZm8tPkFsOworICAgIH0KKyAgfQorCisgIC8qIFNlbGVjdCBNQ1UgZGVjb2Rpbmcgcm91dGluZSAqLworICBpZiAoY2luZm8tPkFoID09IDApIHsKKyAgICBpZiAoaXNfRENfYmFuZCkKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19maXJzdDsKKyAgICBlbHNlCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfQUNfZmlyc3Q7CisgIH0gZWxzZSB7CisgICAgaWYgKGlzX0RDX2JhbmQpCisgICAgICBlbnRyb3B5LT5wdWIuZGVjb2RlX21jdSA9IGRlY29kZV9tY3VfRENfcmVmaW5lOworICAgIGVsc2UKKyAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19yZWZpbmU7CisgIH0KKworICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgeworICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07CisgICAgLyogTWFrZSBzdXJlIHJlcXVlc3RlZCB0YWJsZXMgYXJlIHByZXNlbnQsIGFuZCBjb21wdXRlIGRlcml2ZWQgdGFibGVzLgorICAgICAqIFdlIG1heSBidWlsZCBzYW1lIGRlcml2ZWQgdGFibGUgbW9yZSB0aGFuIG9uY2UsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUuCisgICAgICovCisgICAgaWYgKGlzX0RDX2JhbmQpIHsKKyAgICAgIGlmIChjaW5mby0+QWggPT0gMCkgewkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCisJdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOworCWpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBUUlVFLCB0YmwsCisJCQkJJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKKyAgICAgIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgdGJsLAorCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7CisgICAgICAvKiByZW1lbWJlciB0aGUgc2luZ2xlIGFjdGl2ZSB0YWJsZSAqLworICAgICAgZW50cm9weS0+YWNfZGVyaXZlZF90YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXTsKKyAgICB9CisgICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKKyAgfQorCisgIC8qIEluaXRpYWxpemUgYml0cmVhZCBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKyAgZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlciA9IDA7IC8qIHVubmVjZXNzYXJ5LCBidXQga2VlcHMgUHVyaWZ5IHF1aWV0ICovCisgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIC8qIEluaXRpYWxpemUgcHJpdmF0ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKKworICAvKiBJbml0aWFsaXplIHJlc3RhcnQgY291bnRlciAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9IGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsOworfQorCisKKy8qCisgKiBGaWd1cmUgRi4xMjogZXh0ZW5kIHNpZ24gYml0LgorICogT24gc29tZSBtYWNoaW5lcywgYSBzaGlmdCBhbmQgYWRkIHdpbGwgYmUgZmFzdGVyIHRoYW4gYSB0YWJsZSBsb29rdXAuCisgKi8KKworI2lmZGVmIEFWT0lEX1RBQkxFUworCisjZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCAoMTw8KChzKS0xKSkgPyAoeCkgKyAoKCgtMSk8PChzKSkgKyAxKSA6ICh4KSkKKworI2Vsc2UKKworI2RlZmluZSBIVUZGX0VYVEVORCh4LHMpICAoKHgpIDwgZXh0ZW5kX3Rlc3Rbc10gPyAoeCkgKyBleHRlbmRfb2Zmc2V0W3NdIDogKHgpKQorCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF90ZXN0WzE2XSA9ICAgLyogZW50cnkgbiBpcyAyKioobi0xKSAqLworICB7IDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAorICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dGVuZF9vZmZzZXRbMTZdID0gLyogZW50cnkgbiBpcyAoLTEgPDwgbikgKyAxICovCisgIHsgMCwgKCgtMSk8PDEpICsgMSwgKCgtMSk8PDIpICsgMSwgKCgtMSk8PDMpICsgMSwgKCgtMSk8PDQpICsgMSwKKyAgICAoKC0xKTw8NSkgKyAxLCAoKC0xKTw8NikgKyAxLCAoKC0xKTw8NykgKyAxLCAoKC0xKTw8OCkgKyAxLAorICAgICgoLTEpPDw5KSArIDEsICgoLTEpPDwxMCkgKyAxLCAoKC0xKTw8MTEpICsgMSwgKCgtMSk8PDEyKSArIDEsCisgICAgKCgtMSk8PDEzKSArIDEsICgoLTEpPDwxNCkgKyAxLCAoKC0xKTw8MTUpICsgMSB9OworCisjZW5kaWYgLyogQVZPSURfVEFCTEVTICovCisKKworLyoKKyAqIENoZWNrIGZvciBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBkZWNvZGVyLgorICogUmV0dXJucyBGQUxTRSBpZiBtdXN0IHN1c3BlbmQuCisgKi8KKworTE9DQUwoYm9vbGVhbikKK3Byb2Nlc3NfcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBjaTsKKworICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KKyAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLworICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKKyAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKKworICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCisgIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQorICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7CisgIC8qIFJlLWluaXQgRU9CIHJ1biBjb3VudCwgdG9vICovCisgIGVudHJvcHktPnNhdmVkLkVPQlJVTiA9IDA7CisKKyAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7CisKKyAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAorICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKKyAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQorICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KKyAgICovCisgIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQorICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBIdWZmbWFuIE1DVSBkZWNvZGluZy4KKyAqIEVhY2ggb2YgdGhlc2Ugcm91dGluZXMgZGVjb2RlcyBhbmQgcmV0dXJucyBvbmUgTUNVJ3Mgd29ydGggb2YKKyAqIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuIAorICogVGhlIGNvZWZmaWNpZW50cyBhcmUgcmVvcmRlcmVkIGZyb20gemlnemFnIG9yZGVyIGludG8gbmF0dXJhbCBhcnJheSBvcmRlciwKKyAqIGJ1dCBhcmUgbm90IGRlcXVhbnRpemVkLgorICoKKyAqIFRoZSBpJ3RoIGJsb2NrIG9mIHRoZSBNQ1UgaXMgc3RvcmVkIGludG8gdGhlIGJsb2NrIHBvaW50ZWQgdG8gYnkKKyAqIE1DVV9kYXRhW2ldLiAgV0UgQVNTVU1FIFRISVMgQVJFQSBJUyBJTklUSUFMTFkgWkVST0VEIEJZIFRIRSBDQUxMRVIuCisgKgorICogV2UgcmV0dXJuIEZBTFNFIGlmIGRhdGEgc291cmNlIHJlcXVlc3RlZCBzdXNwZW5zaW9uLiAgSW4gdGhhdCBjYXNlIG5vCisgKiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHBlcm1hbmVudCBzdGF0ZS4gIChFeGNlcHRpb246IHNvbWUgb3V0cHV0CisgKiBjb2VmZmljaWVudHMgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGFzc2lnbmVkLiAgVGhpcyBpcyBoYXJtbGVzcyBmb3IKKyAqIHNwZWN0cmFsIHNlbGVjdGlvbiwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLgorICogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIEFDIHJlZmluZW1lbnQgaGFzIHRvIGJlIG1vcmUgY2FyZWZ1bCwgaG93ZXZlci4pCisgKi8KKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBBbCA9IGNpbmZvLT5BbDsKKyAgcmVnaXN0ZXIgaW50IHMsIHI7CisgIGludCBibGtuLCBjaTsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIHNhdmFibGVfc3RhdGUgc3RhdGU7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGp1c3QgbGVhdmUgdGhlIE1DVSBzZXQgdG8gemVyb2VzLgorICAgKiBUaGlzIHdheSwgd2UgcmV0dXJuIHVuaWZvcm0gZ3JheSBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgc2VnbWVudC4KKyAgICovCisgIGlmICghIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSkgeworCisgICAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICBBU1NJR05fU1RBVEUoc3RhdGUsIGVudHJvcHktPnNhdmVkKTsKKworICAgIC8qIE91dGVyIGxvb3AgaGFuZGxlcyBlYWNoIGJsb2NrIGluIHRoZSBNQ1UgKi8KKworICAgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOworICAgICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07CisgICAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOworICAgICAgdGJsID0gZW50cm9weS0+ZGVyaXZlZF90YmxzW2NvbXBwdHItPmRjX3RibF9ub107CisKKyAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLworCisgICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLworICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIHRibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDEpOworICAgICAgaWYgKHMpIHsKKwlDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCXIgPSBHRVRfQklUUyhzKTsKKwlzID0gSFVGRl9FWFRFTkQociwgcyk7CisgICAgICB9CisKKyAgICAgIC8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLworICAgICAgcyArPSBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV07CisgICAgICBzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOworICAgICAgLyogU2NhbGUgYW5kIG91dHB1dCB0aGUgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdPTApICovCisgICAgICAoKmJsb2NrKVswXSA9IChKQ09FRikgKHMgPDwgQWwpOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZSk7CisgIH0KKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAorICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9BQ19maXJzdCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKK3sgICAKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGludCBTZSA9IGNpbmZvLT5TZTsKKyAgaW50IEFsID0gY2luZm8tPkFsOworICByZWdpc3RlciBpbnQgcywgaywgcjsKKyAgdW5zaWduZWQgaW50IEVPQlJVTjsKKyAgSkJMT0NLUk9XIGJsb2NrOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisKKyAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KKyAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCisgICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUuCisgICAgICogV2UgY2FuIGF2b2lkIGxvYWRpbmcvc2F2aW5nIGJpdHJlYWQgc3RhdGUgaWYgaW4gYW4gRU9CIHJ1bi4KKyAgICAgKi8KKyAgICBFT0JSVU4gPSBlbnRyb3B5LT5zYXZlZC5FT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCisKKyAgICAvKiBUaGVyZSBpcyBhbHdheXMgb25seSBvbmUgYmxvY2sgcGVyIE1DVSAqLworCisgICAgaWYgKEVPQlJVTiA+IDApCQkvKiBpZiBpdCdzIGEgYmFuZCBvZiB6ZXJvZXMuLi4gKi8KKyAgICAgIEVPQlJVTi0tOwkJCS8qIC4uLnByb2Nlc3MgaXQgbm93ICh3ZSBkbyBub3RoaW5nKSAqLworICAgIGVsc2UgeworICAgICAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKyAgICAgIGJsb2NrID0gTUNVX2RhdGFbMF07CisgICAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgICAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7CisJciA9IHMgPj4gNDsKKwlzICY9IDE1OworCWlmIChzKSB7CisJICBrICs9IHI7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOworCSAgciA9IEdFVF9CSVRTKHMpOworCSAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOworCSAgLyogU2NhbGUgYW5kIG91dHB1dCBjb2VmZmljaWVudCBpbiBuYXR1cmFsIChkZXppZ3phZ2dlZCkgb3JkZXIgKi8KKwkgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIChzIDw8IEFsKTsKKwl9IGVsc2UgeworCSAgaWYgKHIgPT0gMTUpIHsJLyogWlJMICovCisJICAgIGsgKz0gMTU7CQkvKiBza2lwIDE1IHplcm9lcyBpbiBiYW5kICovCisJICB9IGVsc2UgewkJLyogRU9CciwgcnVuIGxlbmd0aCBpcyAyXnIgKyBhcHBlbmRlZCBiaXRzICovCisJICAgIEVPQlJVTiA9IDEgPDwgcjsKKwkgICAgaWYgKHIpIHsJCS8qIEVPQnIsIHIgPiAwICovCisJICAgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgciwgcmV0dXJuIEZBTFNFKTsKKwkgICAgICByID0gR0VUX0JJVFMocik7CisJICAgICAgRU9CUlVOICs9IHI7CisJICAgIH0KKwkgICAgRU9CUlVOLS07CQkvKiB0aGlzIGJhbmQgaXMgcHJvY2Vzc2VkIGF0IHRoaXMgbW9tZW50ICovCisJICAgIGJyZWFrOwkJLyogZm9yY2UgZW5kLW9mLWJhbmQgKi8KKwkgIH0KKwl9CisgICAgICB9CisKKyAgICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgfQorCisgICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOwkvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworfQorCisKKy8qCisgKiBNQ1UgZGVjb2RpbmcgZm9yIERDIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW4uCisgKiBOb3RlOiB3ZSBhc3N1bWUgc3VjaCBzY2FucyBjYW4gYmUgbXVsdGktY29tcG9uZW50LCBhbHRob3VnaCB0aGUgc3BlYworICogaXMgbm90IHZlcnkgY2xlYXIgb24gdGhlIHBvaW50LgorICovCisKK01FVEhPRERFRihib29sZWFuKQorZGVjb2RlX21jdV9EQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCit7ICAgCisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBibGtuOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEJJVFJFQURfU1RBVEVfVkFSUzsKKworICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLworICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKKyAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKKyAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCisJcmV0dXJuIEZBTFNFOworICB9CisKKyAgLyogTm90IHdvcnRoIHRoZSBjeWNsZXMgdG8gY2hlY2sgaW5zdWZmaWNpZW50X2RhdGEgaGVyZSwKKyAgICogc2luY2Ugd2Ugd2lsbCBub3QgY2hhbmdlIHRoZSBkYXRhIGFueXdheSBpZiB3ZSByZWFkIHplcm9lcy4KKyAgICovCisKKyAgLyogTG9hZCB1cCB3b3JraW5nIHN0YXRlICovCisgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisKKyAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLworCisgIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7CisgICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKKworICAgIC8qIEVuY29kZWQgZGF0YSBpcyBzaW1wbHkgdGhlIG5leHQgYml0IG9mIHRoZSB0d28ncy1jb21wbGVtZW50IERDIHZhbHVlICovCisgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgcmV0dXJuIEZBTFNFKTsKKyAgICBpZiAoR0VUX0JJVFMoMSkpCisgICAgICAoKmJsb2NrKVswXSB8PSBwMTsKKyAgICAvKiBOb3RlOiBzaW5jZSB3ZSB1c2UgfD0sIHJlcGVhdGluZyB0aGUgYXNzaWdubWVudCBsYXRlciBpcyBzYWZlICovCisgIH0KKworICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KKyAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKKworICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCisgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIE1DVSBkZWNvZGluZyBmb3IgQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KKyAqLworCitNRVRIT0RERUYoYm9vbGVhbikKK2RlY29kZV9tY3VfQUNfcmVmaW5lIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoreyAgIAorICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAgaW50IFNlID0gY2luZm8tPlNlOworICBpbnQgcDEgPSAxIDw8IGNpbmZvLT5BbDsJLyogMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIGludCBtMSA9ICgtMSkgPDwgY2luZm8tPkFsOwkvKiAtMSBpbiB0aGUgYml0IHBvc2l0aW9uIGJlaW5nIGNvZGVkICovCisgIHJlZ2lzdGVyIGludCBzLCBrLCByOworICB1bnNpZ25lZCBpbnQgRU9CUlVOOworICBKQkxPQ0tST1cgYmxvY2s7CisgIEpDT0VGUFRSIHRoaXNjb2VmOworICBCSVRSRUFEX1NUQVRFX1ZBUlM7CisgIGRfZGVyaXZlZF90YmwgKiB0Ymw7CisgIGludCBudW1fbmV3bno7CisgIGludCBuZXduel9wb3NbRENUU0laRTJdOworCisgIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQorICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKKwlyZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBJZiB3ZSd2ZSBydW4gb3V0IG9mIGRhdGEsIGRvbid0IG1vZGlmeSB0aGUgTUNVLgorICAgKi8KKyAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7CisKKyAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KKyAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOworICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsgLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KKworICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCisgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKKyAgICB0YmwgPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibDsKKworICAgIC8qIElmIHdlIGFyZSBmb3JjZWQgdG8gc3VzcGVuZCwgd2UgbXVzdCB1bmRvIHRoZSBhc3NpZ25tZW50cyB0byBhbnkgbmV3bHkKKyAgICAgKiBub256ZXJvIGNvZWZmaWNpZW50cyBpbiB0aGUgYmxvY2ssIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgZ2V0IGNvbmZ1c2VkCisgICAgICogbmV4dCB0aW1lIGFib3V0IHdoaWNoIGNvZWZmaWNpZW50cyB3ZXJlIGFscmVhZHkgbm9uemVyby4KKyAgICAgKiBCdXQgd2UgbmVlZCBub3QgdW5kbyBhZGRpdGlvbiBvZiBiaXRzIHRvIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudHM7CisgICAgICogaW5zdGVhZCwgd2UgY2FuIHRlc3QgdGhlIGN1cnJlbnQgYml0IHRvIHNlZSBpZiB3ZSBhbHJlYWR5IGRpZCBpdC4KKyAgICAgKi8KKyAgICBudW1fbmV3bnogPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBjb2VmZmljaWVudCBsb29wIGNvdW50ZXIgdG8gc3RhcnQgb2YgYmFuZCAqLworICAgIGsgPSBjaW5mby0+U3M7CisKKyAgICBpZiAoRU9CUlVOID09IDApIHsKKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwlIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCBnb3RvIHVuZG9pdCwgbGFiZWwzKTsKKwlyID0gcyA+PiA0OworCXMgJj0gMTU7CisJaWYgKHMpIHsKKwkgIGlmIChzICE9IDEpCQkvKiBzaXplIG9mIG5ldyBjb2VmIHNob3VsZCBhbHdheXMgYmUgMSAqLworCSAgICBXQVJOTVMoY2luZm8sIEpXUk5fSFVGRl9CQURfQ09ERSk7CisJICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7CisJICBpZiAoR0VUX0JJVFMoMSkpCisJICAgIHMgPSBwMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBwb3NpdGl2ZSAqLworCSAgZWxzZQorCSAgICBzID0gbTE7CQkvKiBuZXdseSBub256ZXJvIGNvZWYgaXMgbmVnYXRpdmUgKi8KKwl9IGVsc2UgeworCSAgaWYgKHIgIT0gMTUpIHsKKwkgICAgRU9CUlVOID0gMSA8PCByOwkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KKwkgICAgaWYgKHIpIHsKKwkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCBnb3RvIHVuZG9pdCk7CisJICAgICAgciA9IEdFVF9CSVRTKHIpOworCSAgICAgIEVPQlJVTiArPSByOworCSAgICB9CisJICAgIGJyZWFrOwkJLyogcmVzdCBvZiBibG9jayBpcyBoYW5kbGVkIGJ5IEVPQiBsb2dpYyAqLworCSAgfQorCSAgLyogbm90ZSBzID0gMCBmb3IgcHJvY2Vzc2luZyBaUkwgKi8KKwl9CisJLyogQWR2YW5jZSBvdmVyIGFscmVhZHktbm9uemVybyBjb2VmcyBhbmQgciBzdGlsbC16ZXJvIGNvZWZzLAorCSAqIGFwcGVuZGluZyBjb3JyZWN0aW9uIGJpdHMgdG8gdGhlIG5vbnplcm9lcy4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQorCSAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisJICovCisJZG8geworCSAgdGhpc2NvZWYgPSAqYmxvY2sgKyBqcGVnX25hdHVyYWxfb3JkZXJba107CisJICBpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgICAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOworCSAgICBpZiAoR0VUX0JJVFMoMSkpIHsKKwkgICAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBzZXQgaXQgKi8KKwkJaWYgKCp0aGlzY29lZiA+PSAwKQorCQkgICp0aGlzY29lZiArPSBwMTsKKwkJZWxzZQorCQkgICp0aGlzY29lZiArPSBtMTsKKwkgICAgICB9CisJICAgIH0KKwkgIH0gZWxzZSB7CisJICAgIGlmICgtLXIgPCAwKQorCSAgICAgIGJyZWFrOwkJLyogcmVhY2hlZCB0YXJnZXQgemVybyBjb2VmZmljaWVudCAqLworCSAgfQorCSAgaysrOworCX0gd2hpbGUgKGsgPD0gU2UpOworCWlmIChzKSB7CisJICBpbnQgcG9zID0ganBlZ19uYXR1cmFsX29yZGVyW2tdOworCSAgLyogT3V0cHV0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQgKi8KKwkgICgqYmxvY2spW3Bvc10gPSAoSkNPRUYpIHM7CisJICAvKiBSZW1lbWJlciBpdHMgcG9zaXRpb24gaW4gY2FzZSB3ZSBoYXZlIHRvIHN1c3BlbmQgKi8KKwkgIG5ld256X3Bvc1tudW1fbmV3bnorK10gPSBwb3M7CisJfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChFT0JSVU4gPiAwKSB7CisgICAgICAvKiBTY2FuIGFueSByZW1haW5pbmcgY29lZmZpY2llbnQgcG9zaXRpb25zIGFmdGVyIHRoZSBlbmQtb2YtYmFuZAorICAgICAgICogKHRoZSBsYXN0IG5ld2x5IG5vbnplcm8gY29lZmZpY2llbnQsIGlmIGFueSkuICBBcHBlbmQgYSBjb3JyZWN0aW9uCisgICAgICAgKiBiaXQgdG8gZWFjaCBhbHJlYWR5LW5vbnplcm8gY29lZmZpY2llbnQuICBBIGNvcnJlY3Rpb24gYml0IGlzIDEKKyAgICAgICAqIGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQgbXVzdCBiZSBpbmNyZWFzZWQuCisgICAgICAgKi8KKyAgICAgIGZvciAoOyBrIDw9IFNlOyBrKyspIHsKKwl0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKKwlpZiAoKnRoaXNjb2VmICE9IDApIHsKKwkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKKwkgIGlmIChHRVRfQklUUygxKSkgeworCSAgICBpZiAoKCp0aGlzY29lZiAmIHAxKSA9PSAwKSB7IC8qIGRvIG5vdGhpbmcgaWYgYWxyZWFkeSBjaGFuZ2VkIGl0ICovCisJICAgICAgaWYgKCp0aGlzY29lZiA+PSAwKQorCQkqdGhpc2NvZWYgKz0gcDE7CisJICAgICAgZWxzZQorCQkqdGhpc2NvZWYgKz0gbTE7CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgICAvKiBDb3VudCBvbmUgYmxvY2sgY29tcGxldGVkIGluIEVPQiBydW4gKi8KKyAgICAgIEVPQlJVTi0tOworICAgIH0KKworICAgIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLworICAgIEJJVFJFQURfU0FWRV9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7CisgICAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLworICB9CisKKyAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLworICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOworCisgIHJldHVybiBUUlVFOworCit1bmRvaXQ6CisgIC8qIFJlLXplcm8gYW55IG91dHB1dCBjb2VmZmljaWVudHMgdGhhdCB3ZSBtYWRlIG5ld2x5IG5vbnplcm8gKi8KKyAgd2hpbGUgKG51bV9uZXdueiA+IDApCisgICAgKCpibG9jaylbbmV3bnpfcG9zWy0tbnVtX25ld256XV0gPSAwOworCisgIHJldHVybiBGQUxTRTsKK30KKworLyoKKyAqIFNhdmUgdGhlIGN1cnJlbnQgSHVmZm1hbiBkZW9jZGUgcG9zaXRpb24gYW5kIHRoZSBEQyBjb2VmZmljaWVudHMKKyAqIGZvciBlYWNoIGNvbXBvbmVudCBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGRjX2luZm9bXSwgcmVzcGVjdGl2ZWx5LgorICovCitNRVRIT0RERUYodm9pZCkKK2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCit7CisgIGludCBpOworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb25fcHJvZ3Jlc3NpdmUoY2luZm8sIG9mZnNldCk7CisgIG9mZnNldC0+RU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOworICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykKKyAgICBvZmZzZXQtPnByZXZfZGNbaV0gPSBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtpXTsKK30KKworCisvKgorICogU2F2ZSB0aGUgY3VycmVudCBIdWZmbWFuIGRlY29kZXIgcG9zaXRpb24gYW5kIHRoZSBiaXQgYnVmZmVyCisgKiBpbnRvIGJpdHN0cmVhbV9vZmZzZXQgYW5kIGdldF9idWZmZXIsIHJlc3BlY3RpdmVseS4KKyAqLworR0xPQkFMKHZvaWQpCitqcGVnX2dldF9odWZmbWFuX2RlY29kZXJfY29uZmlndXJhdGlvbl9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpCit7CisgIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OworCisgIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgeworICAgIC8vIFdlIGFyZSBhdCB0aGUgZW5kIG9mIGEgZGF0YSBzZWdtZW50CisgICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCisgICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQorCXJldHVybjsKKyAgfQorCisgIC8vIFNhdmUgcmVzdGFydHNfdG9fZ28gYW5kIG5leHRfcmVzdGFydF9udW0uCisgIG9mZnNldC0+cmVzdGFydHNfdG9fZ28gPSAodW5zaWduZWQgc2hvcnQpIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvOworICBvZmZzZXQtPm5leHRfcmVzdGFydF9udW0gPSBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtOworCisgIG9mZnNldC0+Yml0c3RyZWFtX29mZnNldCA9CisgICAgICAoamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24oY2luZm8pIDw8IExPR19UV09fQklUX0JVRl9TSVpFKQorICAgICAgKyBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQ7CisKKyAgb2Zmc2V0LT5nZXRfYnVmZmVyID0gZW50cm9weS0+Yml0c3RhdGUuZ2V0X2J1ZmZlcjsKK30KKworCisvKgorICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgdG8gZGVjb2RlIHRoZSBpbWFnZQorICogc3RhcnRpbmcgZnJvbSAoaU1DVV9yb3dfb2Zmc2V0LCBpTUNVX2NvbF9vZmZzZXQpLgorICovCitNRVRIT0RERUYodm9pZCkKK2NvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpCit7CisgIGludCBpOworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKyAganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyX3Byb2dyZXNzaXZlKGNpbmZvLCBvZmZzZXQpOworICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBvZmZzZXQuRU9CUlVOOworICBmb3IgKGkgPSAwOyBpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGkrKykKKyAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtpXSA9IG9mZnNldC5wcmV2X2RjW2ldOworfQorCisvKgorICogQ29uZmlndXJlIHRoZSBIdWZmbWFuIGRlY29kZXIgcmVhZGVyIHBvc2l0aW9uIGFuZCBiaXQgYnVmZmVyLgorICovCitHTE9CQUwodm9pZCkKK2pwZWdfY29uZmlndXJlX2h1ZmZtYW5fZGVjb2Rlcl9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCkKK3sKKwlwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKKworICAvLyBSZXN0b3JlIHJlc3RhcnRzX3RvX2dvIGFuZCBuZXh0X3Jlc3RhcnRfbnVtCisgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKKyAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBvZmZzZXQucmVzdGFydHNfdG9fZ287CisgIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSBvZmZzZXQubmV4dF9yZXN0YXJ0X251bTsKKworICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX29mZnNldCA9IG9mZnNldC5iaXRzdHJlYW1fb2Zmc2V0OworICBpbnQgYmxrbiwgaTsKKworICB1bnNpZ25lZCBpbnQgYnl0ZV9vZmZzZXQgPSBiaXRzdHJlYW1fb2Zmc2V0ID4+IExPR19UV09fQklUX0JVRl9TSVpFOworICB1bnNpZ25lZCBpbnQgYml0X2luX2JpdF9idWZmZXIgPQorICAgICAgYml0c3RyZWFtX29mZnNldCAmICgoMSA8PCBMT0dfVFdPX0JJVF9CVUZfU0laRSkgLSAxKTsKKworICBqc2V0X2lucHV0X3N0cmVhbV9wb3NpdGlvbl9iaXQoY2luZm8sIGJ5dGVfb2Zmc2V0LAorICAgICAgICAgIGJpdF9pbl9iaXRfYnVmZmVyLCBvZmZzZXQuZ2V0X2J1ZmZlcik7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19jb25maWd1cmVfaHVmZm1hbl9pbmRleF9zY2FuKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgc2Nhbl9ubywgaW50IG9mZnNldCkKK3sKKyAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7CisgIGlmIChzY2FuX25vID49IGluZGV4LT5zY2FuX2NvdW50KSB7CisgICAgaW5kZXgtPnNjYW4gPSByZWFsbG9jKGluZGV4LT5zY2FuLAorICAgICAgICAgICAgICAgICAgICAoc2Nhbl9ubyArIDEpICogc2l6ZW9mKGh1ZmZtYW5fc2Nhbl9oZWFkZXIpKTsKKyAgICBpbmRleC0+bWVtX3VzZWQgKz0gKHNjYW5fbm8gLSBpbmRleC0+c2Nhbl9jb3VudCArIDEpCisgICAgICAqIChzaXplb2YoaHVmZm1hbl9zY2FuX2hlYWRlcikgKyBjaW5mby0+dG90YWxfaU1DVV9yb3dzCisgICAgICAqIHNpemVvZihodWZmbWFuX29mZnNldF9kYXRhKikpOworICAgIGluZGV4LT5zY2FuX2NvdW50ID0gc2Nhbl9ubyArIDE7CisgIH0KKyAgaW5kZXgtPnNjYW5bc2Nhbl9ub10ub2Zmc2V0ID0gKGh1ZmZtYW5fb2Zmc2V0X2RhdGEqKiltYWxsb2MoCisgICAgICAgICAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIHNpemVvZihodWZmbWFuX29mZnNldF9kYXRhKikpOworICBpbmRleC0+c2NhbltzY2FuX25vXS5iaXRzdHJlYW1fb2Zmc2V0ID0gb2Zmc2V0OworfQorCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIHByb2dyZXNzaXZlIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZy4KKyAqLworR0xPQkFMKHZvaWQpCitqaW5pdF9waHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5OworICBpbnQgKmNvZWZfYml0X3B0cjsKKyAgaW50IGNpLCBpOworCisgIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9kZWNvZGVyKSk7CisgIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciAqKSBlbnRyb3B5OworICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlcjsKKyAgZW50cm9weS0+cHViLmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIgPSBjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyOworICBlbnRyb3B5LT5wdWIuZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uID0KKyAgICAgICAgZ2V0X2h1ZmZtYW5fZGVjb2Rlcl9jb25maWd1cmF0aW9uOworCisgIC8qIE1hcmsgZGVyaXZlZCB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgeworICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7CisgIH0KKworICAvKiBDcmVhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzIHRhYmxlICovCisgIGNpbmZvLT5jb2VmX2JpdHMgPSAoaW50ICgqKVtEQ1RTSVpFMl0pCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMqRENUU0laRTIqU0laRU9GKGludCkpOworICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbMF1bMF07CisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCisgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCisgICAgICAqY29lZl9iaXRfcHRyKysgPSAtMTsKK30KKworI2VuZGlmIC8qIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRwb3N0Y3QuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZHBvc3RjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTU2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRwb3N0Y3QuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIGpkcG9zdGN0LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgorICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIHVwc2FtcGxpbmcsIGNvbG9yIGNvbnZlcnNpb24sIGFuZCBjb2xvcgorICogcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBzdGVwczsgc3BlY2lmaWNhbGx5LCBpdCBjb250cm9scyB0aGUgYnVmZmVyaW5nCisgKiBiZXR3ZWVuIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gYW5kIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24uCisgKgorICogSWYgbm8gY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBpcyByZXF1aXJlZCwgdGhlbiB0aGlzIG1vZHVsZSBoYXMgbm8KKyAqIHdvcmsgdG8gZG8sIGFuZCBpdCBqdXN0IGhhbmRzIG9mZiB0byB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBjb2RlLgorICogQW4gaW50ZWdyYXRlZCB1cHNhbXBsZS9jb252ZXJ0L3F1YW50aXplIHByb2Nlc3Mgd291bGQgcmVwbGFjZSB0aGlzIG1vZHVsZQorICogZW50aXJlbHkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgcXVhbnRpemF0aW9uIHNvdXJjZSBidWZmZXI6IHRoaXMgaG9sZHMgb3V0cHV0IGRhdGEgZnJvbQorICAgKiB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzdGVwIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVhbnRpemVyLgorICAgKiBGb3IgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB3ZSBuZWVkIGEgZnVsbC1pbWFnZSBidWZmZXI7CisgICAqIGZvciBvbmUtcGFzcyBvcGVyYXRpb24sIGEgc3RyaXAgYnVmZmVyIGlzIHN1ZmZpY2llbnQuCisgICAqLworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiB2aXJ0dWFsIGFycmF5LCBvciBOVUxMIGlmIG9uZS1wYXNzICovCisgIEpTQU1QQVJSQVkgYnVmZmVyOwkJLyogc3RyaXAgYnVmZmVyLCBvciBjdXJyZW50IHN0cmlwIG9mIHZpcnR1YWwgKi8KKyAgSkRJTUVOU0lPTiBzdHJpcF9oZWlnaHQ7CS8qIGJ1ZmZlciBzaXplIGluIHJvd3MgKi8KKyAgLyogZm9yIHR3by1wYXNzIG1vZGUgb25seTogKi8KKyAgSkRJTUVOU0lPTiBzdGFydGluZ19yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHJvdyBpbiBjdXJyZW50IHN0cmlwICovCisgIEpESU1FTlNJT04gbmV4dF9yb3c7CQkvKiBpbmRleCBvZiBuZXh0IHJvdyB0byBmaWxsL2VtcHR5IGluIHN0cmlwICovCit9IG15X3Bvc3RfY29udHJvbGxlcjsKKwordHlwZWRlZiBteV9wb3N0X2NvbnRyb2xsZXIgKiBteV9wb3N0X3B0cjsKKworCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18xcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfcHJlcGFzcworCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKK01FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMnBhc3MKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisjZW5kaWYKKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX2Rwb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKK3sKKyAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7CisKKyAgc3dpdGNoIChwYXNzX21vZGUpIHsKKyAgY2FzZSBKQlVGX1BBU1NfVEhSVToKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogU2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRoIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KKyAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18xcGFzczsKKyAgICAgIC8qIFdlIGNvdWxkIGJlIGRvaW5nIGJ1ZmZlcmVkLWltYWdlIG91dHB1dCBiZWZvcmUgc3RhcnRpbmcgYSAyLXBhc3MKKyAgICAgICAqIGNvbG9yIHF1YW50aXphdGlvbjsgaW4gdGhhdCBjYXNlLCBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBkaWQgbm90CisgICAgICAgKiBhbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlci4gIFVzZSB0aGUgdmlydHVhbC1hcnJheSBidWZmZXIgYXMgd29ya3NwYWNlLgorICAgICAgICovCisgICAgICBpZiAocG9zdC0+YnVmZmVyID09IE5VTEwpIHsKKwlwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCisJICAgKEpESU1FTlNJT04pIDAsIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEZvciBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGhvdXQgY29sb3IgcXVhbnRpemF0aW9uLAorICAgICAgICogSSBoYXZlIG5vIHdvcmsgdG8gZG87IGp1c3QgY2FsbCB0aGUgdXBzYW1wbGVyIGRpcmVjdGx5LgorICAgICAgICovCisgICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlOworICAgIH0KKyAgICBicmVhazsKKyNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKKyAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6CisgICAgLyogRmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCisgICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7CisgICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzX3ByZXBhc3M7CisgICAgYnJlYWs7CisgIGNhc2UgSkJVRl9DUkFOS19ERVNUOgorICAgIC8qIFNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KKyAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKKyAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMnBhc3M7CisgICAgYnJlYWs7CisjZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworICAgIGJyZWFrOworICB9CisgIHBvc3QtPnN0YXJ0aW5nX3JvdyA9IHBvc3QtPm5leHRfcm93ID0gMDsKK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIG9uZS1wYXNzIChzdHJpcCBidWZmZXIpIGNhc2UuCisgKiBUaGlzIGlzIHVzZWQgZm9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gYXMgd2VsbCBhcyBvbmUtcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogRmlsbCB0aGUgYnVmZmVyLCBidXQgbm90IG1vcmUgdGhhbiB3aGF0IHdlIGNhbiBkdW1wIG91dCBpbiBvbmUgZ28uICovCisgIC8qIE5vdGUgd2UgcmVseSBvbiB0aGUgdXBzYW1wbGVyIHRvIGRldGVjdCBib3R0b20gb2YgaW1hZ2UuICovCisgIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7CisgIGlmIChtYXhfcm93cyA+IHBvc3QtPnN0cmlwX2hlaWdodCkKKyAgICBtYXhfcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgbnVtX3Jvd3MgPSAwOworICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKKwkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQlwb3N0LT5idWZmZXIsICZudW1fcm93cywgbWF4X3Jvd3MpOworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgKGludCkgbnVtX3Jvd3MpOworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Cit9CisKKworI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAorCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bvc3RfcHJvY2Vzc19wcmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBvbGRfbmV4dF9yb3csIG51bV9yb3dzOworCisgIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCisgIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7CisgICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKKwkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOworICB9CisKKyAgLyogVXBzYW1wbGUgc29tZSBkYXRhICh1cCB0byBhIHN0cmlwIGhlaWdodCdzIHdvcnRoKS4gKi8KKyAgb2xkX25leHRfcm93ID0gcG9zdC0+bmV4dF9yb3c7CisgICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAorCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCisJCXBvc3QtPmJ1ZmZlciwgJnBvc3QtPm5leHRfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQpOworCisgIC8qIEFsbG93IHF1YW50aXplciB0byBzY2FuIG5ldyBkYXRhLiAgTm8gZGF0YSBpcyBlbWl0dGVkLCAqLworICAvKiBidXQgd2UgYWR2YW5jZSBvdXRfcm93X2N0ciBzbyBvdXRlciBsb29wIGNhbiB0ZWxsIHdoZW4gd2UncmUgZG9uZS4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID4gb2xkX25leHRfcm93KSB7CisgICAgbnVtX3Jvd3MgPSBwb3N0LT5uZXh0X3JvdyAtIG9sZF9uZXh0X3JvdzsKKyAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sIHBvc3QtPmJ1ZmZlciArIG9sZF9uZXh0X3JvdywKKwkJCQkJIChKU0FNUEFSUkFZKSBOVUxMLCAoaW50KSBudW1fcm93cyk7CisgICAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOworICB9CisKKyAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworCisvKgorICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwb3N0X3Byb2Nlc3NfMnBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKKwkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQoreworICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKKyAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7CisKKyAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KKyAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKKyAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAorCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgRkFMU0UpOworICB9CisKKyAgLyogRGV0ZXJtaW5lIG51bWJlciBvZiByb3dzIHRvIGVtaXQuICovCisgIG51bV9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0IC0gcG9zdC0+bmV4dF9yb3c7IC8qIGF2YWlsYWJsZSBpbiBzdHJpcCAqLworICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOyAvKiBhdmFpbGFibGUgaW4gb3V0cHV0IGFyZWEgKi8KKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKyAgLyogV2UgaGF2ZSB0byBjaGVjayBib3R0b20gb2YgaW1hZ2UgaGVyZSwgY2FuJ3QgZGVwZW5kIG9uIHVwc2FtcGxlci4gKi8KKyAgbWF4X3Jvd3MgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIHBvc3QtPnN0YXJ0aW5nX3JvdzsKKyAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCisgICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKKworICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLworICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCisJCXBvc3QtPmJ1ZmZlciArIHBvc3QtPm5leHRfcm93LCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAorCQkoaW50KSBudW1fcm93cyk7CisgICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKKworICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCisgIHBvc3QtPm5leHRfcm93ICs9IG51bV9yb3dzOworICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7CisgICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKKyAgICBwb3N0LT5uZXh0X3JvdyA9IDA7CisgIH0KK30KKworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsaXplIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF9kX3Bvc3RfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQoreworICBteV9wb3N0X3B0ciBwb3N0OworCisgIHBvc3QgPSAobXlfcG9zdF9wdHIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YobXlfcG9zdF9jb250cm9sbGVyKSk7CisgIGNpbmZvLT5wb3N0ID0gKHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICopIHBvc3Q7CisgIHBvc3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kcG9zdDsKKyAgcG9zdC0+d2hvbGVfaW1hZ2UgPSBOVUxMOwkvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLworICBwb3N0LT5idWZmZXIgPSBOVUxMOwkJLyogZmxhZyBmb3Igbm8gc3RyaXAgYnVmZmVyICovCisKKyAgLyogQ3JlYXRlIHRoZSBxdWFudGl6YXRpb24gYnVmZmVyLCBpZiBuZWVkZWQgKi8KKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKKyAgICAvKiBUaGUgYnVmZmVyIHN0cmlwIGhlaWdodCBpcyBtYXhfdl9zYW1wX2ZhY3Rvciwgd2hpY2ggaXMgdHlwaWNhbGx5CisgICAgICogYW4gZWZmaWNpZW50IG51bWJlciBvZiByb3dzIGZvciB1cHNhbXBsaW5nIHRvIHJldHVybi4KKyAgICAgKiAoSW4gdGhlIHByZXNlbmNlIG9mIG91dHB1dCByZXNjYWxpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gYmUgc21hcnRlcj8pCisgICAgICovCisgICAgcG9zdC0+c3RyaXBfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgeworICAgICAgLyogVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBuZWVkIGZ1bGwtaW1hZ2Ugc3RvcmFnZS4gKi8KKyAgICAgIC8qIFdlIHJvdW5kIHVwIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcCBoZWlnaHQuICovCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisgICAgICBwb3N0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCisJCQkJKGxvbmcpIHBvc3QtPnN0cmlwX2hlaWdodCksCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOworI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLworICAgIH0gZWxzZSB7CisgICAgICAvKiBPbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb246IGp1c3QgbWFrZSBhIHN0cmlwIGJ1ZmZlci4gKi8KKyAgICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCisJIHBvc3QtPnN0cmlwX2hlaWdodCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRzYW1wbGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZHNhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZmZlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamRzYW1wbGUuYwpAQCAtMCwwICsxLDQ3OCBAQAorLyoKKyAqIGpkc2FtcGxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB1cHNhbXBsaW5nIHJvdXRpbmVzLgorICoKKyAqIFVwc2FtcGxpbmcgaW5wdXQgZGF0YSBpcyBjb3VudGVkIGluICJyb3cgZ3JvdXBzIi4gIEEgcm93IGdyb3VwCisgKiBpcyBkZWZpbmVkIHRvIGJlICh2X3NhbXBfZmFjdG9yICogRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSkKKyAqIHNhbXBsZSByb3dzIG9mIGVhY2ggY29tcG9uZW50LiAgVXBzYW1wbGluZyB3aWxsIG5vcm1hbGx5IHByb2R1Y2UKKyAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVsIHJvd3MgZnJvbSBlYWNoIHJvdyBncm91cCAoYnV0IHRoaXMgY291bGQgdmFyeQorICogaWYgdGhlIHVwc2FtcGxlciBpcyBhcHBseWluZyBhIHNjYWxlIGZhY3RvciBvZiBpdHMgb3duKS4KKyAqCisgKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCisgKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCisgKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIFBvaW50ZXIgdG8gcm91dGluZSB0byB1cHNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZTFfcHRyLAorCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpKTsKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogQ29sb3IgY29udmVyc2lvbiBidWZmZXIuICBXaGVuIHVzaW5nIHNlcGFyYXRlIHVwc2FtcGxpbmcgYW5kIGNvbG9yCisgICAqIGNvbnZlcnNpb24gc3RlcHMsIHRoaXMgYnVmZmVyIGhvbGRzIG9uZSB1cHNhbXBsZWQgcm93IGdyb3VwIHVudGlsIGl0CisgICAqIGhhcyBiZWVuIGNvbG9yIGNvbnZlcnRlZCBhbmQgb3V0cHV0LgorICAgKiBOb3RlOiB3ZSBkbyBub3QgYWxsb2NhdGUgYW55IHN0b3JhZ2UgZm9yIGNvbXBvbmVudChzKSB3aGljaCBhcmUgZnVsbC1zaXplLAorICAgKiBpZSBkbyBub3QgbmVlZCByZXNjYWxpbmcuICBUaGUgY29ycmVzcG9uZGluZyBlbnRyeSBvZiBjb2xvcl9idWZbXSBpcworICAgKiBzaW1wbHkgc2V0IHRvIHBvaW50IHRvIHRoZSBpbnB1dCBkYXRhIGFycmF5LCB0aGVyZWJ5IGF2b2lkaW5nIGNvcHlpbmcuCisgICAqLworICBKU0FNUEFSUkFZIGNvbG9yX2J1ZltNQVhfQ09NUE9ORU5UU107CisKKyAgLyogUGVyLWNvbXBvbmVudCB1cHNhbXBsaW5nIG1ldGhvZCBwb2ludGVycyAqLworICB1cHNhbXBsZTFfcHRyIG1ldGhvZHNbTUFYX0NPTVBPTkVOVFNdOworCisgIGludCBuZXh0X3Jvd19vdXQ7CQkvKiBjb3VudHMgcm93cyBlbWl0dGVkIGZyb20gY29sb3JfYnVmICovCisgIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCisKKyAgLyogSGVpZ2h0IG9mIGFuIGlucHV0IHJvdyBncm91cCBmb3IgZWFjaCBjb21wb25lbnQuICovCisgIGludCByb3dncm91cF9oZWlnaHRbTUFYX0NPTVBPTkVOVFNdOworCisgIC8qIFRoZXNlIGFycmF5cyBzYXZlIHBpeGVsIGV4cGFuc2lvbiBmYWN0b3JzIHNvIHRoYXQgaW50X2V4cGFuZCBuZWVkIG5vdAorICAgKiByZWNvbXB1dGUgdGhlbSBlYWNoIHRpbWUuICBUaGV5IGFyZSB1bnVzZWQgZm9yIG90aGVyIHVwc2FtcGxpbmcgbWV0aG9kcy4KKyAgICovCisgIFVJTlQ4IGhfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKKyAgVUlOVDggdl9leHBhbmRbTUFYX0NPTVBPTkVOVFNdOworfSBteV91cHNhbXBsZXI7CisKK3R5cGVkZWYgbXlfdXBzYW1wbGVyICogbXlfdXBzYW1wbGVfcHRyOworCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBhbiB1cHNhbXBsaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisKKyAgLyogTWFyayB0aGUgY29udmVyc2lvbiBidWZmZXIgZW1wdHkgKi8KKyAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgLyogSW5pdGlhbGl6ZSB0b3RhbC1oZWlnaHQgY291bnRlciBmb3IgZGV0ZWN0aW5nIGJvdHRvbSBvZiBpbWFnZSAqLworICB1cHNhbXBsZS0+cm93c190b19nbyA9IGNpbmZvLT5vdXRwdXRfaGVpZ2h0OworfQorCisKKy8qCisgKiBDb250cm9sIHJvdXRpbmUgdG8gZG8gdXBzYW1wbGluZyAoYW5kIGNvbG9yIGNvbnZlcnNpb24pLgorICoKKyAqIEluIHRoaXMgdmVyc2lvbiB3ZSB1cHNhbXBsZSBlYWNoIGNvbXBvbmVudCBpbmRlcGVuZGVudGx5LgorICogV2UgdXBzYW1wbGUgb25lIHJvdyBncm91cCBpbnRvIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgdGhlbiBhcHBseQorICogY29sb3IgY29udmVyc2lvbiBhIHJvdyBhdCBhIHRpbWUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzZXBfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCisJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJICAgICAgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkKK3sKKyAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOworICBpbnQgY2k7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOworICBKRElNRU5TSU9OIG51bV9yb3dzOworCisgIC8qIEZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLCBpZiBpdCdzIGVtcHR5ICovCisgIGlmICh1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID49IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisJIGNpKyssIGNvbXBwdHIrKykgeworICAgICAgLyogSW52b2tlIHBlci1jb21wb25lbnQgdXBzYW1wbGUgbWV0aG9kLiAgTm90aWNlIHdlIHBhc3MgYSBQT0lOVEVSCisgICAgICAgKiB0byBjb2xvcl9idWZbY2ldLCBzbyB0aGF0IGZ1bGxzaXplX3Vwc2FtcGxlIGNhbiBjaGFuZ2UgaXQuCisgICAgICAgKi8KKyAgICAgICgqdXBzYW1wbGUtPm1ldGhvZHNbY2ldKSAoY2luZm8sIGNvbXBwdHIsCisJaW5wdXRfYnVmW2NpXSArICgqaW5fcm93X2dyb3VwX2N0ciAqIHVwc2FtcGxlLT5yb3dncm91cF9oZWlnaHRbY2ldKSwKKwl1cHNhbXBsZS0+Y29sb3JfYnVmICsgY2kpOworICAgIH0KKyAgICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ID0gMDsKKyAgfQorCisgIC8qIENvbG9yLWNvbnZlcnQgYW5kIGVtaXQgcm93cyAqLworCisgIC8qIEhvdyBtYW55IHdlIGhhdmUgaW4gdGhlIGJ1ZmZlcjogKi8KKyAgbnVtX3Jvd3MgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAtIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQpOworICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gIE5lZWQgdGhpcyB0ZXN0CisgICAqIGluIGNhc2UgdGhlIGltYWdlIGhlaWdodCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtYXhfdl9zYW1wX2ZhY3RvcjoKKyAgICovCisgIGlmIChudW1fcm93cyA+IHVwc2FtcGxlLT5yb3dzX3RvX2dvKSAKKyAgICBudW1fcm93cyA9IHVwc2FtcGxlLT5yb3dzX3RvX2dvOworICAvKiBBbmQgbm90IG1vcmUgdGhhbiB3aGF0IHRoZSBjbGllbnQgY2FuIGFjY2VwdDogKi8KKyAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOworICBpZiAobnVtX3Jvd3MgPiBvdXRfcm93c19hdmFpbCkKKyAgICBudW1fcm93cyA9IG91dF9yb3dzX2F2YWlsOworCisgICgqY2luZm8tPmNjb252ZXJ0LT5jb2xvcl9jb252ZXJ0KSAoY2luZm8sIHVwc2FtcGxlLT5jb2xvcl9idWYsCisJCQkJICAgICAoSkRJTUVOU0lPTikgdXBzYW1wbGUtPm5leHRfcm93X291dCwKKwkJCQkgICAgIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIsCisJCQkJICAgICAoaW50KSBudW1fcm93cyk7CisKKyAgLyogQWRqdXN0IGNvdW50cyAqLworICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7CisgIHVwc2FtcGxlLT5yb3dzX3RvX2dvIC09IG51bV9yb3dzOworICB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0ICs9IG51bV9yb3dzOworICAvKiBXaGVuIHRoZSBidWZmZXIgaXMgZW1wdGllZCwgZGVjbGFyZSB0aGlzIGlucHV0IHJvdyBncm91cCBjb25zdW1lZCAqLworICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpCisgICAgKCppbl9yb3dfZ3JvdXBfY3RyKSsrOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHJvdXRpbmVzIGludm9rZWQgYnkgc2VwX3Vwc2FtcGxlIHRvIHVwc2FtcGxlIHBpeGVsIHZhbHVlcworICogb2YgYSBzaW5nbGUgY29tcG9uZW50LiAgT25lIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgcGVyIGNhbGwuCisgKi8KKworCisvKgorICogRm9yIGZ1bGwtc2l6ZSBjb21wb25lbnRzLCB3ZSBqdXN0IG1ha2UgY29sb3JfYnVmW2NpXSBwb2ludCBhdCB0aGUKKyAqIGlucHV0IGJ1ZmZlciwgYW5kIHRodXMgYXZvaWQgY29weWluZyBhbnkgZGF0YS4gIE5vdGUgdGhhdCB0aGlzIGlzCisgKiBzYWZlIG9ubHkgYmVjYXVzZSBzZXBfdXBzYW1wbGUgZG9lc24ndCBkZWNsYXJlIHRoZSBpbnB1dCByb3cgZ3JvdXAKKyAqICJjb25zdW1lZCIgdW50aWwgd2UgYXJlIGRvbmUgY29sb3IgY29udmVydGluZyBhbmQgZW1pdHRpbmcgaXQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmdWxsc2l6ZV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgKm91dHB1dF9kYXRhX3B0ciA9IGlucHV0X2RhdGE7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgYSBuby1vcCB2ZXJzaW9uIHVzZWQgZm9yICJ1bmludGVyZXN0aW5nIiBjb21wb25lbnRzLgorICogVGhlc2UgY29tcG9uZW50cyB3aWxsIG5vdCBiZSByZWZlcmVuY2VkIGJ5IGNvbG9yIGNvbnZlcnNpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitub29wX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICAqb3V0cHV0X2RhdGFfcHRyID0gTlVMTDsJLyogc2FmZXR5IGNoZWNrICovCit9CisKKworLyoKKyAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFueSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MuCisgKiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0eXBpY2FsIEpQRUcgZmlsZXMsIHNvIGl0IG5lZWQgbm90IGJlIGZhc3QuCisgKiBOb3IsIGZvciB0aGF0IG1hdHRlciwgaXMgaXQgcGFydGljdWxhcmx5IGFjY3VyYXRlOiB0aGUgYWxnb3JpdGhtIGlzCisgKiBzaW1wbGUgcmVwbGljYXRpb24gb2YgdGhlIGlucHV0IHBpeGVsIG9udG8gdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CisgKiBwaXhlbHMuICBUaGUgaGktZmFsdXRpbiBzYW1wbGluZyBsaXRlcmF0dXJlIHJlZmVycyB0byB0aGlzIGFzIGEKKyAqICJib3ggZmlsdGVyIi4gIEEgYm94IGZpbHRlciB0ZW5kcyB0byBpbnRyb2R1Y2UgdmlzaWJsZSBhcnRpZmFjdHMsCisgKiBzbyBpZiB5b3UgYXJlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSAzOjEgb3IgNDoxIHNhbXBsaW5nIHJhdGlvcworICogeW91IHdvdWxkIGJlIHdlbGwgYWR2aXNlZCB0byBpbXByb3ZlIHRoaXMgY29kZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ludF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIHJlZ2lzdGVyIGludCBoOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBoX2V4cGFuZCwgdl9leHBhbmQ7CisgIGludCBpbnJvdywgb3V0cm93OworCisgIGhfZXhwYW5kID0gdXBzYW1wbGUtPmhfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisgIHZfZXhwYW5kID0gdXBzYW1wbGUtPnZfZXhwYW5kW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF07CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgLyogR2VuZXJhdGUgb25lIG91dHB1dCByb3cgd2l0aCBwcm9wZXIgaG9yaXpvbnRhbCBleHBhbnNpb24gKi8KKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvd107CisgICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKKyAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7CisgICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KKyAgICAgIGZvciAoaCA9IGhfZXhwYW5kOyBoID4gMDsgaC0tKSB7CisJKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogR2VuZXJhdGUgYW55IGFkZGl0aW9uYWwgb3V0cHV0IHJvd3MgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9uZSAqLworICAgIGlmICh2X2V4cGFuZCA+IDEpIHsKKyAgICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKKwkJCXZfZXhwYW5kLTEsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOworICAgIH0KKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSB2X2V4cGFuZDsKKyAgfQorfQorCisKKy8qCisgKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitoMnYxX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOworICBKU0FNUFJPVyBvdXRlbmQ7CisgIGludCBpbnJvdzsKKworICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKKyAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOworICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOworICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKKyAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZhc3QgcHJvY2Vzc2luZyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwuCisgKiBJdCdzIHN0aWxsIGEgYm94IGZpbHRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjJfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCit7CisgIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKU0FNUExFIGludmFsdWU7CisgIEpTQU1QUk9XIG91dGVuZDsKKyAgaW50IGlucm93LCBvdXRyb3c7CisKKyAgaW5yb3cgPSBvdXRyb3cgPSAwOworICB3aGlsZSAob3V0cm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKSB7CisgICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOworICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgeworICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCisgICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOworICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKKyAgICB9CisgICAgamNvcHlfc2FtcGxlX3Jvd3Mob3V0cHV0X2RhdGEsIG91dHJvdywgb3V0cHV0X2RhdGEsIG91dHJvdysxLAorCQkgICAgICAxLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKKyAgICBpbnJvdysrOworICAgIG91dHJvdyArPSAyOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMToxIHZlcnRpY2FsLgorICoKKyAqIFRoZSB1cHNhbXBsaW5nIGFsZ29yaXRobSBpcyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHBpeGVsIGNlbnRlcnMsCisgKiBhbHNvIGtub3duIGFzIGEgInRyaWFuZ2xlIGZpbHRlciIuICBUaGlzIGlzIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4KKyAqIHNwZWVkIGFuZCB2aXN1YWwgcXVhbGl0eS4gIFRoZSBjZW50ZXJzIG9mIHRoZSBvdXRwdXQgcGl4ZWxzIGFyZSAxLzQgYW5kIDMvNAorICogb2YgdGhlIHdheSBiZXR3ZWVuIGlucHV0IHBpeGVsIGNlbnRlcnMuCisgKgorICogQSBub3RlIGFib3V0IHRoZSAiYmlhcyIgY2FsY3VsYXRpb25zOiB3aGVuIHJvdW5kaW5nIGZyYWN0aW9uYWwgdmFsdWVzIHRvCisgKiBpbnRlZ2VyLCB3ZSBkbyBub3Qgd2FudCB0byBhbHdheXMgcm91bmQgMC41IHVwIHRvIHRoZSBuZXh0IGludGVnZXIuCisgKiBJZiB3ZSBkaWQgdGhhdCwgd2UnZCBpbnRyb2R1Y2UgYSBub3RpY2VhYmxlIGJpYXMgdG93YXJkcyBsYXJnZXIgdmFsdWVzLgorICogSW5zdGVhZCwgdGhpcyBjb2RlIGlzIGFycmFuZ2VkIHNvIHRoYXQgMC41IHdpbGwgYmUgcm91bmRlZCB1cCBvciBkb3duIGF0CisgKiBhbHRlcm5hdGUgcGl4ZWwgbG9jYXRpb25zIChhIHNpbXBsZSBvcmRlcmVkIGRpdGhlciBwYXR0ZXJuKS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2gydjFfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKK3sKKyAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIGludCBpbnZhbHVlOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbGN0cjsKKyAgaW50IGlucm93OworCisgIGZvciAoaW5yb3cgPSAwOyBpbnJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsgaW5yb3crKykgeworICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbaW5yb3ddOworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7CisKKyAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKKyAgICAgIC8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCAqLworICAgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKyspICogMzsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKGlucHRyWy0yXSkgKyAxKSA+PiAyKTsKKyAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKGludmFsdWUgKyBHRVRKU0FNUExFKCppbnB0cikgKyAyKSA+PiAyKTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGxhc3QgY29sdW1uICovCisgICAgaW52YWx1ZSA9IEdFVEpTQU1QTEUoKmlucHRyKTsKKyAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoaW5wdHJbLTFdKSArIDEpID4+IDIpOworICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSBpbnZhbHVlOworICB9Cit9CisKKworLyoKKyAqIEZhbmN5IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgorICogQWdhaW4gYSB0cmlhbmdsZSBmaWx0ZXI7IHNlZSBjb21tZW50cyBmb3IgaDJ2MSBjYXNlLCBhYm92ZS4KKyAqCisgKiBJdCBpcyBPSyBmb3IgdXMgdG8gcmVmZXJlbmNlIHRoZSBhZGphY2VudCBpbnB1dCByb3dzIGJlY2F1c2Ugd2UgZGVtYW5kZWQKKyAqIGNvbnRleHQgZnJvbSB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciAoc2VlIGluaXRpYWxpemF0aW9uIGNvZGUpLgorICovCisKK01FVEhPRERFRih2b2lkKQoraDJ2Ml9mYW5jeV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQoreworICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIG91dHB0cjsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorICByZWdpc3RlciBpbnQgdGhpc2NvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKKyNlbHNlCisgIHJlZ2lzdGVyIElOVDMyIHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07CisjZW5kaWYKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7CisgIGludCBpbnJvdywgb3V0cm93LCB2OworCisgIGlucm93ID0gb3V0cm93ID0gMDsKKyAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgeworICAgIGZvciAodiA9IDA7IHYgPCAyOyB2KyspIHsKKyAgICAgIC8qIGlucHRyMCBwb2ludHMgdG8gbmVhcmVzdCBpbnB1dCByb3csIGlucHRyMSBwb2ludHMgdG8gbmV4dCBuZWFyZXN0ICovCisgICAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKKyAgICAgIGlmICh2ID09IDApCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGFib3ZlICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdy0xXTsKKyAgICAgIGVsc2UJCQkvKiBuZXh0IG5lYXJlc3QgaXMgcm93IGJlbG93ICovCisJaW5wdHIxID0gaW5wdXRfZGF0YVtpbnJvdysxXTsKKyAgICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW291dHJvdysrXTsKKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBmaXJzdCBjb2x1bW4gKi8KKyAgICAgIHRoaXNjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworICAgICAgbmV4dGNvbHN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCsrKSAqIDMgKyBHRVRKU0FNUExFKCppbnB0cjErKyk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDgpID4+IDQpOworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBuZXh0Y29sc3VtICsgNykgPj4gNCk7CisgICAgICBsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07CisKKyAgICAgIGZvciAoY29sY3RyID0gY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgeworCS8qIEdlbmVyYWwgY2FzZTogMy80ICogbmVhcmVyIHBpeGVsICsgMS80ICogZnVydGhlciBwaXhlbCBpbiBlYWNoICovCisJLyogZGltZW5zaW9uLCB0aHVzIDkvMTYsIDMvMTYsIDMvMTYsIDEvMTYgb3ZlcmFsbCAqLworCW5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOworCSpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOworCWxhc3Rjb2xzdW0gPSB0aGlzY29sc3VtOyB0aGlzY29sc3VtID0gbmV4dGNvbHN1bTsKKyAgICAgIH0KKworICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLworICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDMgKyBsYXN0Y29sc3VtICsgOCkgPj4gNCk7CisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogNCArIDcpID4+IDQpOworICAgIH0KKyAgICBpbnJvdysrOworICB9Cit9CisKKworLyoKKyAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciB1cHNhbXBsaW5nLgorICovCisKK0dMT0JBTCh2b2lkKQoramluaXRfdXBzYW1wbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGU7CisgIGludCBjaTsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7CisgIGJvb2xlYW4gbmVlZF9idWZmZXIsIGRvX2ZhbmN5OworICBpbnQgaF9pbl9ncm91cCwgdl9pbl9ncm91cCwgaF9vdXRfZ3JvdXAsIHZfb3V0X2dyb3VwOworCisgIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV91cHNhbXBsZXIpKTsKKyAgY2luZm8tPnVwc2FtcGxlID0gKHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqKSB1cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc191cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi51cHNhbXBsZSA9IHNlcF91cHNhbXBsZTsKKyAgdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOyAvKiB1bnRpbCB3ZSBmaW5kIG91dCBkaWZmZXJlbnRseSAqLworCisgIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykJLyogdGhpcyBpc24ndCBzdXBwb3J0ZWQgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7CisKKyAgLyogamRtYWluY3QuYyBkb2Vzbid0IHN1cHBvcnQgY29udGV4dCByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSA9IDEsCisgICAqIHNvIGRvbid0IGFzayBmb3IgaXQuCisgICAqLworICBkb19mYW5jeSA9IGNpbmZvLT5kb19mYW5jeV91cHNhbXBsaW5nICYmIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID4gMTsKKworICAvKiBWZXJpZnkgd2UgY2FuIGhhbmRsZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgc2VsZWN0IHBlci1jb21wb25lbnQgbWV0aG9kcywKKyAgICogYW5kIGNyZWF0ZSBzdG9yYWdlIGFzIG5lZWRlZC4KKyAgICovCisgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgY2krKywgY29tcHB0cisrKSB7CisgICAgLyogQ29tcHV0ZSBzaXplIG9mIGFuICJpbnB1dCBncm91cCIgYWZ0ZXIgSURDVCBzY2FsaW5nLiAgVGhpcyBtYW55IHNhbXBsZXMKKyAgICAgKiBhcmUgdG8gYmUgY29udmVydGVkIHRvIG1heF9oX3NhbXBfZmFjdG9yICogbWF4X3Zfc2FtcF9mYWN0b3IgcGl4ZWxzLgorICAgICAqLworICAgIGhfaW5fZ3JvdXAgPSAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLworCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7CisgICAgdl9pbl9ncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCisJCSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKKyAgICBoX291dF9ncm91cCA9IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvcjsKKyAgICB2X291dF9ncm91cCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKKyAgICB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSA9IHZfaW5fZ3JvdXA7IC8qIHNhdmUgZm9yIHVzZSBsYXRlciAqLworICAgIG5lZWRfYnVmZmVyID0gVFJVRTsKKyAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7CisgICAgICAvKiBEb24ndCBib3RoZXIgdG8gdXBzYW1wbGUgYW4gdW5pbnRlcmVzdGluZyBjb21wb25lbnQuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBub29wX3Vwc2FtcGxlOworICAgICAgbmVlZF9idWZmZXIgPSBGQUxTRTsKKyAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgPT0gaF9vdXRfZ3JvdXAgJiYgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgeworICAgICAgLyogRnVsbHNpemUgY29tcG9uZW50cyBjYW4gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgYW55IHdvcmsuICovCisgICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBmdWxsc2l6ZV91cHNhbXBsZTsKKyAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7CisgICAgfSBlbHNlIGlmIChoX2luX2dyb3VwICogMiA9PSBoX291dF9ncm91cCAmJgorCSAgICAgICB2X2luX2dyb3VwID09IHZfb3V0X2dyb3VwKSB7CisgICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDF2IHVwc2FtcGxpbmcgKi8KKyAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpCisJdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9mYW5jeV91cHNhbXBsZTsKKyAgICAgIGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYxX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKKwkgICAgICAgdl9pbl9ncm91cCAqIDIgPT0gdl9vdXRfZ3JvdXApIHsKKyAgICAgIC8qIFNwZWNpYWwgY2FzZXMgZm9yIDJoMnYgdXBzYW1wbGluZyAqLworICAgICAgaWYgKGRvX2ZhbmN5ICYmIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID4gMikgeworCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZmFuY3lfdXBzYW1wbGU7CisJdXBzYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7CisgICAgICB9IGVsc2UKKwl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX3Vwc2FtcGxlOworICAgIH0gZWxzZSBpZiAoKGhfb3V0X2dyb3VwICUgaF9pbl9ncm91cCkgPT0gMCAmJgorCSAgICAgICAodl9vdXRfZ3JvdXAgJSB2X2luX2dyb3VwKSA9PSAwKSB7CisgICAgICAvKiBHZW5lcmljIGludGVncmFsLWZhY3RvcnMgdXBzYW1wbGluZyBtZXRob2QgKi8KKyAgICAgIHVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGludF91cHNhbXBsZTsKKyAgICAgIHVwc2FtcGxlLT5oX2V4cGFuZFtjaV0gPSAoVUlOVDgpIChoX291dF9ncm91cCAvIGhfaW5fZ3JvdXApOworICAgICAgdXBzYW1wbGUtPnZfZXhwYW5kW2NpXSA9IChVSU5UOCkgKHZfb3V0X2dyb3VwIC8gdl9pbl9ncm91cCk7CisgICAgfSBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMKTsKKyAgICBpZiAobmVlZF9idWZmZXIpIHsKKyAgICAgIHVwc2FtcGxlLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCwKKwkJCQkobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSwKKwkgKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamR0cmFucy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkdHJhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY5MDljCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pkdHJhbnMuYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIGpkdHJhbnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGRlY29tcHJlc3Npb24sCisgKiB0aGF0IGlzLCByZWFkaW5nIHJhdyBEQ1QgY29lZmZpY2llbnQgYXJyYXlzIGZyb20gYW4gaW5wdXQgSlBFRyBmaWxlLgorICogVGhlIHJvdXRpbmVzIGluIGpkYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB0cmFuc2RlY29kZV9tYXN0ZXJfc2VsZWN0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qCisgKiBSZWFkIHRoZSBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhIEpQRUcgZmlsZS4KKyAqIGpwZWdfcmVhZF9oZWFkZXIgbXVzdCBiZSBjb21wbGV0ZWQgYmVmb3JlIGNhbGxpbmcgdGhpcy4KKyAqCisgKiBUaGUgZW50aXJlIGltYWdlIGlzIHJlYWQgaW50byBhIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cywKKyAqIG9uZSBwZXIgY29tcG9uZW50LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mCisgKiB2aXJ0dWFsLWFycmF5IGRlc2NyaXB0b3JzLiAgVGhlc2UgY2FuIGJlIG1hbmlwdWxhdGVkIGRpcmVjdGx5IHZpYSB0aGUKKyAqIEpQRUcgbWVtb3J5IG1hbmFnZXIsIG9yIGhhbmRlZCBvZmYgdG8ganBlZ193cml0ZV9jb2VmZmljaWVudHMoKS4KKyAqIFRvIHJlbGVhc2UgdGhlIG1lbW9yeSBvY2N1cGllZCBieSB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwKKyAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB3aGVuIGRvbmUgd2l0aCB0aGUgZGF0YS4KKyAqCisgKiBBbiBhbHRlcm5hdGl2ZSB1c2FnZSBpcyB0byBzaW1wbHkgb2J0YWluIGFjY2VzcyB0byB0aGUgY29lZmZpY2llbnQgYXJyYXlzCisgKiBkdXJpbmcgYSBidWZmZXJlZC1pbWFnZS1tb2RlIGRlY29tcHJlc3Npb24gb3BlcmF0aW9uLiAgVGhpcyBpcyBhbGxvd2VkCisgKiBhZnRlciBhbnkganBlZ19maW5pc2hfb3V0cHV0KCkgY2FsbC4gIFRoZSBhcnJheXMgY2FuIGJlIGFjY2Vzc2VkIHVudGlsCisgKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkLiAgKE5vdGUgdGhhdCBhbnkgY2FsbCB0byB0aGUgbGlicmFyeQorICogbWF5IHJlcG9zaXRpb24gdGhlIGFycmF5cywgc28gZG9uJ3QgcmVseSBvbiBhY2Nlc3NfdmlydF9iYXJyYXkoKSByZXN1bHRzCisgKiB0byBzdGF5IHZhbGlkIGFjcm9zcyBsaWJyYXJ5IGNhbGxzLikKKyAqCisgKiBSZXR1cm5zIE5VTEwgaWYgc3VzcGVuZGVkLiAgVGhpcyBjYXNlIG5lZWQgYmUgY2hlY2tlZCBvbmx5IGlmCisgKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KKyAqLworCitHTE9CQUwoanZpcnRfYmFycmF5X3B0ciAqKQoranBlZ19yZWFkX2NvZWZmaWNpZW50cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7CisgICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBhY3RpdmUgbW9kdWxlcyAqLworICAgIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfUkRDT0VGUzsKKyAgfQorICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkRDT0VGUykgeworICAgIC8qIEFic29yYiB3aG9sZSBmaWxlIGludG8gdGhlIGNvZWYgYnVmZmVyICovCisgICAgZm9yICg7OykgeworICAgICAgaW50IHJldGNvZGU7CisgICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisgICAgICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLworICAgICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOworICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgorCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKyAgICAgICAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7CisJICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLworICAgICAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLyogU2V0IHN0YXRlIHNvIHRoYXQganBlZ19maW5pc2hfZGVjb21wcmVzcyBkb2VzIHRoZSByaWdodCB0aGluZyAqLworICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7CisgIH0KKyAgLyogQXQgdGhpcyBwb2ludCB3ZSBzaG91bGQgYmUgaW4gc3RhdGUgRFNUQVRFX1NUT1BQSU5HIGlmIGJlaW5nIHVzZWQKKyAgICogc3RhbmRhbG9uZSwgb3IgaW4gc3RhdGUgRFNUQVRFX0JVRklNQUdFIGlmIGJlaW5nIGludm9rZWQgdG8gZ2V0IGFjY2VzcworICAgKiB0byB0aGUgY29lZmZpY2llbnRzIGR1cmluZyBhIGZ1bGwgYnVmZmVyZWQtaW1hZ2UtbW9kZSBkZWNvbXByZXNzaW9uLgorICAgKi8KKyAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TVE9QUElORyB8fAorICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX0JVRklNQUdFKSAmJiBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKKyAgICByZXR1cm4gY2luZm8tPmNvZWYtPmNvZWZfYXJyYXlzOworICB9CisgIC8qIE9vcHMsIGltcHJvcGVyIHVzYWdlICovCisgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7CisgIHJldHVybiBOVUxMOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KK30KKworTE9DQUwoYm9vbGVhbikKK2pwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9wcm9ncmVzc2l2ZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7CisgICAgcHJpbnRmKCJQcm9ncmVzc2l2ZSBNb2RlXG4iKTsKKyAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCisgICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7CisgICAgaW50IG1jdSwgaTsKKyAgICBjaW5mby0+bWFya2VyLT5nZXRfc29zX21hcmtlcl9wb3NpdGlvbihjaW5mbywgaW5kZXgpOworCisgICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KKyAgICBmb3IgKG1jdSA9IDA7IG1jdSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7IG1jdSsrKSB7CisgICAgICBpbnQgcmV0Y29kZSA9IDA7CisgICAgICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpCisgICAgICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgLyogQWJzb3JiIHNvbWUgbW9yZSBpbnB1dCAqLworICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPnNjYW5fY291bnQ7IGkrKykgeworICAgICAgICAoKmNpbmZvLT5pbnB1dGN0bC0+ZmluaXNoX2lucHV0X3Bhc3MpIChjaW5mbyk7CisgICAgICAgIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uKGNpbmZvLCBpbmRleC0+c2NhbltpXS5iaXRzdHJlYW1fb2Zmc2V0KTsKKyAgICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOworICAgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgaSk7CisgICAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9FT0kpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IG1jdTsKKyAgICAgICAgaWYgKG1jdSAhPSAwKQorICAgICAgICAgICgqY2luZm8tPmVudHJvcHktPmNvbmZpZ3VyZV9odWZmbWFuX2RlY29kZXIpCisgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleC0+c2NhbltpXS5wcmV2X01DVV9vZmZzZXQpOworICAgICAgICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSBpOworICAgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgaSk7CisgICAgICB9CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKKyAgICAgICAgYnJlYWs7CisgICAgICAvKiBBZHZhbmNlIHByb2dyZXNzIGNvdW50ZXIgaWYgYXBwcm9wcmlhdGUgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgorCSAgKHJldGNvZGUgPT0gSlBFR19ST1dfQ09NUExFVEVEIHx8IHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX1NPUykpIHsKKyAgICAgICAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7CisJICAvKiBzdGFydHVwIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLworICAgICAgICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9CisgIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCisgICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKKyAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIEZBTFNFOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KK30KKworTE9DQUwoYm9vbGVhbikKK2pwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9iYXNlbGluZShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBodWZmbWFuX2luZGV4ICppbmRleCkKK3sKKyAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7CisgICAgcHJpbnRmKCJCYXNlbGluZSBNb2RlXG4iKTsKKyAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCisgICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7CisgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOworICB9CisgIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7CisgICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICBpbnQgcmV0Y29kZTsKKyAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KKyAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICAgICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICAvKiBBYnNvcmIgc29tZSBtb3JlIGlucHV0ICovCisgICAgICByZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXRfYnVpbGRfaHVmZm1hbl9pbmRleCkKKyAgICAgICAgICAgICAgICAgICAgKGNpbmZvLCBpbmRleCwgMCk7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NVU1BFTkRFRCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKKyAgICAgICAgYnJlYWs7CisgICAgICBpZiAocmV0Y29kZSA9PSBKUEVHX1NDQU5fQ09NUExFVEVEKQorICAgICAgICBicmVhazsKKworICAgICAgLyogQWR2YW5jZSBwcm9ncmVzcyBjb3VudGVyIGlmIGFwcHJvcHJpYXRlICovCisgICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwgJiYKKwkgIChyZXRjb2RlID09IEpQRUdfUk9XX0NPTVBMRVRFRCB8fCByZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpKSB7CisgICAgICAgIGlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgeworCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KKyAgICAgICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ICs9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8qIFNldCBzdGF0ZSBzbyB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcgKi8KKyAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOworICB9CisgIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCisgICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKKyAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKKyAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgLyogT29wcywgaW1wcm9wZXIgdXNhZ2UgKi8KKyAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKKyAgcmV0dXJuIEZBTFNFOwkJCS8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KK30KKworR0xPQkFMKGJvb2xlYW4pCitqcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaHVmZm1hbl9pbmRleCAqaW5kZXgpCit7CisgICAgY2luZm8tPnRpbGVfZGVjb2RlID0gVFJVRTsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCisgICAgICByZXR1cm4ganBlZ19idWlsZF9odWZmbWFuX2luZGV4X3Byb2dyZXNzaXZlKGNpbmZvLCBpbmRleCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGpwZWdfYnVpbGRfaHVmZm1hbl9pbmRleF9iYXNlbGluZShjaW5mbywgaW5kZXgpOworfQorCisvKgorICogTWFzdGVyIHNlbGVjdGlvbiBvZiBkZWNvbXByZXNzaW9uIG1vZHVsZXMgZm9yIHRyYW5zY29kaW5nLgorICogVGhpcyBzdWJzdGl0dXRlcyBmb3IgamRtYXN0ZXIuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGRlY29tcHJlc3Nvci4KKyAqLworCitMT0NBTCh2b2lkKQordHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgLyogVGhpcyBpcyBlZmZlY3RpdmVseSBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbi4gKi8KKyAgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlID0gVFJVRTsKKworICAvKiBFbnRyb3B5IGRlY29kaW5nOiBlaXRoZXIgSHVmZm1hbiBvciBhcml0aG1ldGljIGNvZGluZy4gKi8KKyAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9BUklUSF9OT1RJTVBMKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKKyNpZmRlZiBEX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgamluaXRfcGh1ZmZfZGVjb2RlcihjaW5mbyk7CisjZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIGppbml0X2h1ZmZfZGVjb2RlcihjaW5mbyk7CisgICAgfQorICB9CisKKyAgLyogQWx3YXlzIGdldCBhIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyLiAqLworICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgVFJVRSk7CisKKyAgLyogV2UgY2FuIG5vdyB0ZWxsIHRoZSBtZW1vcnkgbWFuYWdlciB0byBhbGxvY2F0ZSB2aXJ0dWFsIGFycmF5cy4gKi8KKyAgKCpjaW5mby0+bWVtLT5yZWFsaXplX3ZpcnRfYXJyYXlzKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworCisgIC8qIEluaXRpYWxpemUgaW5wdXQgc2lkZSBvZiBkZWNvbXByZXNzb3IgdG8gY29uc3VtZSBmaXJzdCBzY2FuLiAqLworICAoKmNpbmZvLT5pbnB1dGN0bC0+c3RhcnRfaW5wdXRfcGFzcykgKGNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIHByb2dyZXNzIG1vbml0b3JpbmcuICovCisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGludCBuc2NhbnM7CisgICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLworICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgeworICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7CisgICAgfSBlbHNlIGlmIChjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgeworICAgICAgLyogRm9yIGEgbm9ucHJvZ3Jlc3NpdmUgbXVsdGlzY2FuIGZpbGUsIGVzdGltYXRlIDEgc2NhbiBwZXIgY29tcG9uZW50LiAqLworICAgICAgbnNjYW5zID0gY2luZm8tPm51bV9jb21wb25lbnRzOworICAgIH0gZWxzZSB7CisgICAgICBuc2NhbnMgPSAxOworICAgIH0KKyAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IDBMOworICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+dG90YWxfaU1DVV9yb3dzICogbnNjYW5zOworICAgIGNpbmZvLT5wcm9ncmVzcy0+Y29tcGxldGVkX3Bhc3NlcyA9IDA7CisgICAgY2luZm8tPnByb2dyZXNzLT50b3RhbF9wYXNzZXMgPSAxOworICB9Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamVycm9yLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhN2JlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZXJyb3IuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIGplcnJvci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc2ltcGxlIGVycm9yLXJlcG9ydGluZyBhbmQgdHJhY2UtbWVzc2FnZSByb3V0aW5lcy4KKyAqIFRoZXNlIGFyZSBzdWl0YWJsZSBmb3IgVW5peC1saWtlIHN5c3RlbXMgYW5kIG90aGVycyB3aGVyZSB3cml0aW5nIHRvCisgKiBzdGRlcnIgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvLiAgTWFueSBhcHBsaWNhdGlvbnMgd2lsbCB3YW50IHRvIHJlcGxhY2UKKyAqIHNvbWUgb3IgYWxsIG9mIHRoZXNlIHJvdXRpbmVzLgorICoKKyAqIElmIHlvdSBkZWZpbmUgVVNFX1dJTkRPV1NfTUVTU0FHRUJPWCBpbiBqY29uZmlnLmggb3IgaW4gdGhlIG1ha2VmaWxlLAorICogeW91IGdldCBhIFdpbmRvd3Mtc3BlY2lmaWMgaGFjayB0byBkaXNwbGF5IGVycm9yIG1lc3NhZ2VzIGluIGEgZGlhbG9nIGJveC4KKyAqIEl0IGFpbid0IG11Y2gsIGJ1dCBpdCBiZWF0cyBkcm9wcGluZyBlcnJvciBtZXNzYWdlcyBpbnRvIHRoZSBiaXQgYnVja2V0LAorICogd2hpY2ggaXMgd2hhdCBoYXBwZW5zIHRvIG91dHB1dCB0byBzdGRlcnIgdW5kZXIgbW9zdCBXaW5kb3dzIEMgY29tcGlsZXJzLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIGJ5IGJvdGggdGhlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNvZGUuCisgKi8KKworLyogdGhpcyBpcyBub3QgYSBjb3JlIGxpYnJhcnkgbW9kdWxlLCBzbyBpdCBkb2Vzbid0IGRlZmluZSBKUEVHX0lOVEVSTkFMUyAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImp2ZXJzaW9uLmgiCisjaW5jbHVkZSAiamVycm9yLmgiCisKKyNpZmRlZiBVU0VfV0lORE9XU19NRVNTQUdFQk9YCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLworI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKKyNlbmRpZgorCisKKy8qCisgKiBDcmVhdGUgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLgorICogV2UgZG8gdGhpcyBmcm9tIHRoZSBtYXN0ZXIgbWVzc2FnZSBsaXN0IGluIGplcnJvci5oIGJ5IHJlLXJlYWRpbmcKKyAqIGplcnJvci5oIHdpdGggYSBzdWl0YWJsZSBkZWZpbml0aW9uIGZvciBtYWNybyBKTUVTU0FHRS4KKyAqIFRoZSBtZXNzYWdlIHRhYmxlIGlzIG1hZGUgYW4gZXh0ZXJuYWwgc3ltYm9sIGp1c3QgaW4gY2FzZSBhbnkgYXBwbGljYXRpb25zCisgKiB3YW50IHRvIHJlZmVyIHRvIGl0IGRpcmVjdGx5LgorICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfc3RkX21lc3NhZ2VfdGFibGUJak1zZ1RhYmxlCisjZW5kaWYKKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJc3RyaW5nICwKKworY29uc3QgY2hhciAqIGNvbnN0IGpwZWdfc3RkX21lc3NhZ2VfdGFibGVbXSA9IHsKKyNpbmNsdWRlICJqZXJyb3IuaCIKKyAgTlVMTAorfTsKKworCisvKgorICogRXJyb3IgZXhpdCBoYW5kbGVyOiBtdXN0IG5vdCByZXR1cm4gdG8gY2FsbGVyLgorICoKKyAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBpZiB0aGV5IHdhbnQgdG8gZ2V0IGNvbnRyb2wgYmFjayBhZnRlcgorICogYW4gZXJyb3IuICBUeXBpY2FsbHkgb25lIHdvdWxkIGxvbmdqbXAgc29tZXdoZXJlIGluc3RlYWQgb2YgZXhpdGluZy4KKyAqIFRoZSBzZXRqbXAgYnVmZmVyIGNhbiBiZSBtYWRlIGEgcHJpdmF0ZSBmaWVsZCB3aXRoaW4gYW4gZXhwYW5kZWQgZXJyb3IKKyAqIGhhbmRsZXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoZSBpbmZvIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlCisgKiBpcyBzdG9yZWQgaW4gdGhlIGVycm9yIG9iamVjdCwgc28geW91IGNhbiBnZW5lcmF0ZSB0aGUgbWVzc2FnZSBub3cgb3IKKyAqIGxhdGVyLCBhdCB5b3VyIGNvbnZlbmllbmNlLgorICogWW91IHNob3VsZCBtYWtlIHN1cmUgdGhhdCB0aGUgSlBFRyBvYmplY3QgaXMgY2xlYW5lZCB1cCAod2l0aCBqcGVnX2Fib3J0CisgKiBvciBqcGVnX2Rlc3Ryb3kpIGF0IHNvbWUgcG9pbnQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitlcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIEFsd2F5cyBkaXNwbGF5IHRoZSBtZXNzYWdlICovCisgICgqY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisKKyAgLyogTGV0IHRoZSBtZW1vcnkgbWFuYWdlciBkZWxldGUgYW55IHRlbXAgZmlsZXMgYmVmb3JlIHdlIGRpZSAqLworICBqcGVnX2Rlc3Ryb3koY2luZm8pOworCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCisvKgorICogQWN0dWFsIG91dHB1dCBvZiBhbiBlcnJvciBvciB0cmFjZSBtZXNzYWdlLgorICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzZW5kIEpQRUcgbWVzc2FnZXMgc29tZXdoZXJlCisgKiBvdGhlciB0aGFuIHN0ZGVyci4KKyAqCisgKiBPbiBXaW5kb3dzLCBwcmludGluZyB0byBzdGRlcnIgaXMgZ2VuZXJhbGx5IGNvbXBsZXRlbHkgdXNlbGVzcywKKyAqIHNvIHdlIHByb3ZpZGUgb3B0aW9uYWwgY29kZSB0byBwcm9kdWNlIGFuIGVycm9yLWRpYWxvZyBwb3B1cC4KKyAqIE1vc3QgV2luZG93cyBhcHBsaWNhdGlvbnMgd2lsbCBzdGlsbCBwcmVmZXIgdG8gb3ZlcnJpZGUgdGhpcyByb3V0aW5lLAorICogYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIGRvIHNvbWV0aGluZyBhdCBsZWFzdCBtYXJnaW5hbGx5IHVzZWZ1bC4KKyAqCisgKiBOT1RFOiB0byB1c2UgdGhlIGxpYnJhcnkgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhlCisgKiBDIHN0ZGlvIGxpYnJhcnksIHlvdSBtYXkgaGF2ZSB0byBkZWxldGUgdGhlIGNhbGwgdG8gZnByaW50ZigpIGVudGlyZWx5LAorICogbm90IGp1c3Qgbm90IHVzZSB0aGlzIHJvdXRpbmUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitvdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBjaGFyIGJ1ZmZlcltKTVNHX0xFTkdUSF9NQVhdOworCisgIC8qIENyZWF0ZSB0aGUgbWVzc2FnZSAqLworICAoKmNpbmZvLT5lcnItPmZvcm1hdF9tZXNzYWdlKSAoY2luZm8sIGJ1ZmZlcik7CisKKyNpZmRlZiBVU0VfV0lORE9XU19NRVNTQUdFQk9YCisgIC8qIERpc3BsYXkgaXQgaW4gYSBtZXNzYWdlIGRpYWxvZyBib3ggKi8KKyAgTWVzc2FnZUJveChHZXRBY3RpdmVXaW5kb3coKSwgYnVmZmVyLCAiSlBFRyBMaWJyYXJ5IEVycm9yIiwKKwkgICAgIE1CX09LIHwgTUJfSUNPTkVSUk9SKTsKKyNlbHNlCisgIC8qIFNlbmQgaXQgdG8gc3RkZXJyLCBhZGRpbmcgYSBuZXdsaW5lICovCisgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7CisjZW5kaWYKK30KKworCisvKgorICogRGVjaWRlIHdoZXRoZXIgdG8gZW1pdCBhIHRyYWNlIG9yIHdhcm5pbmcgbWVzc2FnZS4KKyAqIG1zZ19sZXZlbCBpcyBvbmUgb2Y6CisgKiAgIC0xOiByZWNvdmVyYWJsZSBjb3JydXB0LWRhdGEgd2FybmluZywgbWF5IHdhbnQgdG8gYWJvcnQuCisgKiAgICAwOiBpbXBvcnRhbnQgYWR2aXNvcnkgbWVzc2FnZXMgKGFsd2F5cyBkaXNwbGF5IHRvIHVzZXIpLgorICogICAgMTogZmlyc3QgbGV2ZWwgb2YgdHJhY2luZyBkZXRhaWwuCisgKiAgICAyLDMsLi4uOiBzdWNjZXNzaXZlbHkgbW9yZSBkZXRhaWxlZCB0cmFjaW5nIG1lc3NhZ2VzLgorICogQW4gYXBwbGljYXRpb24gbWlnaHQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgaXQgd2FudGVkIHRvIGFib3J0IG9uIHdhcm5pbmdzCisgKiBvciBjaGFuZ2UgdGhlIHBvbGljeSBhYm91dCB3aGljaCBtZXNzYWdlcyB0byBkaXNwbGF5LgorICovCisKK01FVEhPRERFRih2b2lkKQorZW1pdF9tZXNzYWdlIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpCit7CisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVyciA9IGNpbmZvLT5lcnI7CisKKyAgaWYgKG1zZ19sZXZlbCA8IDApIHsKKyAgICAvKiBJdCdzIGEgd2FybmluZyBtZXNzYWdlLiAgU2luY2UgY29ycnVwdCBmaWxlcyBtYXkgZ2VuZXJhdGUgbWFueSB3YXJuaW5ncywKKyAgICAgKiB0aGUgcG9saWN5IGltcGxlbWVudGVkIGhlcmUgaXMgdG8gc2hvdyBvbmx5IHRoZSBmaXJzdCB3YXJuaW5nLAorICAgICAqIHVubGVzcyB0cmFjZV9sZXZlbCA+PSAzLgorICAgICAqLworICAgIGlmIChlcnItPm51bV93YXJuaW5ncyA9PSAwIHx8IGVyci0+dHJhY2VfbGV2ZWwgPj0gMykKKyAgICAgICgqZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKKyAgICAvKiBBbHdheXMgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAqLworICAgIGVyci0+bnVtX3dhcm5pbmdzKys7CisgIH0gZWxzZSB7CisgICAgLyogSXQncyBhIHRyYWNlIG1lc3NhZ2UuICBTaG93IGl0IGlmIHRyYWNlX2xldmVsID49IG1zZ19sZXZlbC4gKi8KKyAgICBpZiAoZXJyLT50cmFjZV9sZXZlbCA+PSBtc2dfbGV2ZWwpCisgICAgICAoKmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7CisgIH0KK30KKworCisvKgorICogRm9ybWF0IGEgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBtb3N0IHJlY2VudCBKUEVHIGVycm9yIG9yIG1lc3NhZ2UuCisgKiBUaGUgbWVzc2FnZSBpcyBzdG9yZWQgaW50byBidWZmZXIsIHdoaWNoIHNob3VsZCBiZSBhdCBsZWFzdCBKTVNHX0xFTkdUSF9NQVgKKyAqIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgbm8gJ1xuJyBjaGFyYWN0ZXIgaXMgYWRkZWQgdG8gdGhlIHN0cmluZy4KKyAqIEZldyBhcHBsaWNhdGlvbnMgc2hvdWxkIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmb3JtYXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKQoreworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOworICBpbnQgbXNnX2NvZGUgPSBlcnItPm1zZ19jb2RlOworICBjb25zdCBjaGFyICogbXNndGV4dCA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKiBtc2dwdHI7CisgIGNoYXIgY2g7CisgIGJvb2xlYW4gaXNzdHJpbmc7CisKKyAgLyogTG9vayB1cCBtZXNzYWdlIHN0cmluZyBpbiBwcm9wZXIgdGFibGUgKi8KKyAgaWYgKG1zZ19jb2RlID4gMCAmJiBtc2dfY29kZSA8PSBlcnItPmxhc3RfanBlZ19tZXNzYWdlKSB7CisgICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlW21zZ19jb2RlXTsKKyAgfSBlbHNlIGlmIChlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgIT0gTlVMTCAmJgorCSAgICAgbXNnX2NvZGUgPj0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlICYmCisJICAgICBtc2dfY29kZSA8PSBlcnItPmxhc3RfYWRkb25fbWVzc2FnZSkgeworICAgIG1zZ3RleHQgPSBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGVbbXNnX2NvZGUgLSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2VdOworICB9CisKKyAgLyogRGVmZW5kIGFnYWluc3QgYm9ndXMgbWVzc2FnZSBudW1iZXIgKi8KKyAgaWYgKG1zZ3RleHQgPT0gTlVMTCkgeworICAgIGVyci0+bXNnX3Bhcm0uaVswXSA9IG1zZ19jb2RlOworICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVswXTsKKyAgfQorCisgIC8qIENoZWNrIGZvciBzdHJpbmcgcGFyYW1ldGVyLCBhcyBpbmRpY2F0ZWQgYnkgJXMgaW4gdGhlIG1lc3NhZ2UgdGV4dCAqLworICBpc3N0cmluZyA9IEZBTFNFOworICBtc2dwdHIgPSBtc2d0ZXh0OworICB3aGlsZSAoKGNoID0gKm1zZ3B0cisrKSAhPSAnXDAnKSB7CisgICAgaWYgKGNoID09ICclJykgeworICAgICAgaWYgKCptc2dwdHIgPT0gJ3MnKSBpc3N0cmluZyA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBGb3JtYXQgdGhlIG1lc3NhZ2UgaW50byB0aGUgcGFzc2VkIGJ1ZmZlciAqLworICBpZiAoaXNzdHJpbmcpCisgICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsIGVyci0+bXNnX3Bhcm0ucyk7CisgIGVsc2UKKyAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzBdLCBlcnItPm1zZ19wYXJtLmlbMV0sCisJICAgIGVyci0+bXNnX3Bhcm0uaVsyXSwgZXJyLT5tc2dfcGFybS5pWzNdLAorCSAgICBlcnItPm1zZ19wYXJtLmlbNF0sIGVyci0+bXNnX3Bhcm0uaVs1XSwKKwkgICAgZXJyLT5tc2dfcGFybS5pWzZdLCBlcnItPm1zZ19wYXJtLmlbN10pOworfQorCisKKy8qCisgKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UuCisgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cCB0byByZXNldCB0cmFjZS9lcnJvcgorICogcHJvY2Vzc2luZyB0byBkZWZhdWx0IHN0YXRlLCB3aXRob3V0IGxvc2luZyBhbnkgYXBwbGljYXRpb24tc3BlY2lmaWMKKyAqIG1ldGhvZCBwb2ludGVycy4gIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IHBvc3NpYmx5IHdhbnQgdG8gb3ZlcnJpZGUKKyAqIHRoaXMgbWV0aG9kIGlmIGl0IGhhcyBhZGRpdGlvbmFsIGVycm9yIHByb2Nlc3Npbmcgc3RhdGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZXNldF9lcnJvcl9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgY2luZm8tPmVyci0+bnVtX3dhcm5pbmdzID0gMDsKKyAgLyogdHJhY2VfbGV2ZWwgaXMgbm90IHJlc2V0IHNpbmNlIGl0IGlzIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIHBhcmFtZXRlciAqLworICBjaW5mby0+ZXJyLT5tc2dfY29kZSA9IDA7CS8qIG1heSBiZSB1c2VmdWwgYXMgYSBmbGFnIGZvciAibm8gZXJyb3IiICovCit9CisKKworLyoKKyAqIEZpbGwgaW4gdGhlIHN0YW5kYXJkIGVycm9yLWhhbmRsaW5nIG1ldGhvZHMgaW4gYSBqcGVnX2Vycm9yX21nciBvYmplY3QuCisgKiBUeXBpY2FsIGNhbGwgaXM6CisgKglzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgY2luZm87CisgKglzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgZXJyOworICoKKyAqCWNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZlcnIpOworICogYWZ0ZXIgd2hpY2ggdGhlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBzb21lIG9mIHRoZSBtZXRob2RzLgorICovCisKK0dMT0JBTChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKikKK2pwZWdfc3RkX2Vycm9yIChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpCit7CisgIGVyci0+ZXJyb3JfZXhpdCA9IGVycm9yX2V4aXQ7CisgIGVyci0+ZW1pdF9tZXNzYWdlID0gZW1pdF9tZXNzYWdlOworICBlcnItPm91dHB1dF9tZXNzYWdlID0gb3V0cHV0X21lc3NhZ2U7CisgIGVyci0+Zm9ybWF0X21lc3NhZ2UgPSBmb3JtYXRfbWVzc2FnZTsKKyAgZXJyLT5yZXNldF9lcnJvcl9tZ3IgPSByZXNldF9lcnJvcl9tZ3I7CisKKyAgZXJyLT50cmFjZV9sZXZlbCA9IDA7CQkvKiBkZWZhdWx0ID0gbm8gdHJhY2luZyAqLworICBlcnItPm51bV93YXJuaW5ncyA9IDA7CS8qIG5vIHdhcm5pbmdzIGVtaXR0ZWQgeWV0ICovCisgIGVyci0+bXNnX2NvZGUgPSAwOwkJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KKworICAvKiBJbml0aWFsaXplIG1lc3NhZ2UgdGFibGUgcG9pbnRlcnMgKi8KKyAgZXJyLT5qcGVnX21lc3NhZ2VfdGFibGUgPSBqcGVnX3N0ZF9tZXNzYWdlX3RhYmxlOworICBlcnItPmxhc3RfanBlZ19tZXNzYWdlID0gKGludCkgSk1TR19MQVNUTVNHQ09ERSAtIDE7CisKKyAgZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlID0gTlVMTDsKKyAgZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlID0gMDsJLyogZm9yIHNhZmV0eSAqLworICBlcnItPmxhc3RfYWRkb25fbWVzc2FnZSA9IDA7CisKKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZXJyb3IuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qZXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzJmZmZlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2plcnJvci5oCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogamVycm9yLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKyAqIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBuZXcgY29kZXMsIG9yIHRvIHRyYW5zbGF0ZSB0aGUgbWVzc2FnZSBzdHJpbmdzIHRvCisgKiBzb21lIG90aGVyIGxhbmd1YWdlLgorICogQSBzZXQgb2YgZXJyb3ItcmVwb3J0aW5nIG1hY3JvcyBhcmUgZGVmaW5lZCB0b28uICBTb21lIGFwcGxpY2F0aW9ucyB1c2luZworICogdGhlIEpQRUcgbGlicmFyeSBtYXkgd2lzaCB0byBpbmNsdWRlIHRoaXMgZmlsZSB0byBnZXQgdGhlIGVycm9yIGNvZGVzCisgKiBhbmQvb3IgdGhlIG1hY3Jvcy4KKyAqLworCisvKgorICogVG8gZGVmaW5lIHRoZSBlbnVtIGxpc3Qgb2YgbWVzc2FnZSBjb2RlcywgaW5jbHVkZSB0aGlzIGZpbGUgd2l0aG91dAorICogZGVmaW5pbmcgbWFjcm8gSk1FU1NBR0UuICBUbyBjcmVhdGUgYSBtZXNzYWdlIHN0cmluZyB0YWJsZSwgaW5jbHVkZSBpdAorICogYWdhaW4gd2l0aCBhIHN1aXRhYmxlIEpNRVNTQUdFIGRlZmluaXRpb24gKHNlZSBqZXJyb3IuYyBmb3IgYW4gZXhhbXBsZSkuCisgKi8KKyNpZm5kZWYgSk1FU1NBR0UKKyNpZm5kZWYgSkVSUk9SX0gKKy8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KKyNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCisjZWxzZQorLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKKyNlbmRpZiAvKiBKRVJST1JfSCAqLworI2VuZGlmIC8qIEpNRVNTQUdFICovCisKKyNpZmRlZiBKTUFLRV9FTlVNX0xJU1QKKwordHlwZWRlZiBlbnVtIHsKKworI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykJY29kZSAsCisKKyNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KKworSk1FU1NBR0UoSk1TR19OT01FU1NBR0UsICJCb2d1cyBtZXNzYWdlIGNvZGUgJWQiKSAvKiBNdXN0IGJlIGZpcnN0IGVudHJ5ISAqLworCisvKiBGb3IgbWFpbnRlbmFuY2UgY29udmVuaWVuY2UsIGxpc3QgaXMgYWxwaGFiZXRpY2FsIGJ5IG1lc3NhZ2UgY29kZSBuYW1lICovCitKTUVTU0FHRShKRVJSX0FSSVRIX05PVElNUEwsCisJICJTb3JyeSwgdGhlcmUgYXJlIGxlZ2FsIHJlc3RyaWN0aW9ucyBvbiBhcml0aG1ldGljIGNvZGluZyIpCitKTUVTU0FHRShKRVJSX0JBRF9BTElHTl9UWVBFLCAiQUxJR05fVFlQRSBpcyB3cm9uZywgcGxlYXNlIGZpeCIpCitKTUVTU0FHRShKRVJSX0JBRF9BTExPQ19DSFVOSywgIk1BWF9BTExPQ19DSFVOSyBpcyB3cm9uZywgcGxlYXNlIGZpeCIpCitKTUVTU0FHRShKRVJSX0JBRF9CVUZGRVJfTU9ERSwgIkJvZ3VzIGJ1ZmZlciBjb250cm9sIG1vZGUiKQorSk1FU1NBR0UoSkVSUl9CQURfQ09NUE9ORU5UX0lELCAiSW52YWxpZCBjb21wb25lbnQgSUQgJWQgaW4gU09TIikKK0pNRVNTQUdFKEpFUlJfQkFEX0RDVF9DT0VGLCAiRENUIGNvZWZmaWNpZW50IG91dCBvZiByYW5nZSIpCitKTUVTU0FHRShKRVJSX0JBRF9EQ1RTSVpFLCAiSURDVCBvdXRwdXQgYmxvY2sgc2l6ZSAlZCBub3Qgc3VwcG9ydGVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX0hVRkZfVEFCTEUsICJCb2d1cyBIdWZmbWFuIHRhYmxlIGRlZmluaXRpb24iKQorSk1FU1NBR0UoSkVSUl9CQURfSU5fQ09MT1JTUEFDRSwgIkJvZ3VzIGlucHV0IGNvbG9yc3BhY2UiKQorSk1FU1NBR0UoSkVSUl9CQURfSl9DT0xPUlNQQUNFLCAiQm9ndXMgSlBFRyBjb2xvcnNwYWNlIikKK0pNRVNTQUdFKEpFUlJfQkFEX0xFTkdUSCwgIkJvZ3VzIG1hcmtlciBsZW5ndGgiKQorSk1FU1NBR0UoSkVSUl9CQURfTElCX1ZFUlNJT04sCisJICJXcm9uZyBKUEVHIGxpYnJhcnkgdmVyc2lvbjogbGlicmFyeSBpcyAlZCwgY2FsbGVyIGV4cGVjdHMgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfTUNVX1NJWkUsICJTYW1wbGluZyBmYWN0b3JzIHRvbyBsYXJnZSBmb3IgaW50ZXJsZWF2ZWQgc2NhbiIpCitKTUVTU0FHRShKRVJSX0JBRF9QT09MX0lELCAiSW52YWxpZCBtZW1vcnkgcG9vbCBjb2RlICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1BSRUNJU0lPTiwgIlVuc3VwcG9ydGVkIEpQRUcgZGF0YSBwcmVjaXNpb24gJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfUFJPR1JFU1NJT04sCisJICJJbnZhbGlkIHByb2dyZXNzaXZlIHBhcmFtZXRlcnMgU3M9JWQgU2U9JWQgQWg9JWQgQWw9JWQiKQorSk1FU1NBR0UoSkVSUl9CQURfUFJPR19TQ1JJUFQsCisJICJJbnZhbGlkIHByb2dyZXNzaXZlIHBhcmFtZXRlcnMgYXQgc2NhbiBzY3JpcHQgZW50cnkgJWQiKQorSk1FU1NBR0UoSkVSUl9CQURfU0FNUExJTkcsICJCb2d1cyBzYW1wbGluZyBmYWN0b3JzIikKK0pNRVNTQUdFKEpFUlJfQkFEX1NDQU5fU0NSSVBULCAiSW52YWxpZCBzY2FuIHNjcmlwdCBhdCBlbnRyeSAlZCIpCitKTUVTU0FHRShKRVJSX0JBRF9TVEFURSwgIkltcHJvcGVyIGNhbGwgdG8gSlBFRyBsaWJyYXJ5IGluIHN0YXRlICVkIikKK0pNRVNTQUdFKEpFUlJfQkFEX1NUUlVDVF9TSVpFLAorCSAiSlBFRyBwYXJhbWV0ZXIgc3RydWN0IG1pc21hdGNoOiBsaWJyYXJ5IHRoaW5rcyBzaXplIGlzICV1LCBjYWxsZXIgZXhwZWN0cyAldSIpCitKTUVTU0FHRShKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUywgIkJvZ3VzIHZpcnR1YWwgYXJyYXkgYWNjZXNzIikKK0pNRVNTQUdFKEpFUlJfQlVGRkVSX1NJWkUsICJCdWZmZXIgcGFzc2VkIHRvIEpQRUcgbGlicmFyeSBpcyB0b28gc21hbGwiKQorSk1FU1NBR0UoSkVSUl9DQU5UX1NVU1BFTkQsICJTdXNwZW5zaW9uIG5vdCBhbGxvd2VkIGhlcmUiKQorSk1FU1NBR0UoSkVSUl9DQ0lSNjAxX05PVElNUEwsICJDQ0lSNjAxIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQorSk1FU1NBR0UoSkVSUl9DT01QT05FTlRfQ09VTlQsICJUb28gbWFueSBjb2xvciBjb21wb25lbnRzOiAlZCwgbWF4ICVkIikKK0pNRVNTQUdFKEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMLCAiVW5zdXBwb3J0ZWQgY29sb3IgY29udmVyc2lvbiByZXF1ZXN0IikKK0pNRVNTQUdFKEpFUlJfREFDX0lOREVYLCAiQm9ndXMgREFDIGluZGV4ICVkIikKK0pNRVNTQUdFKEpFUlJfREFDX1ZBTFVFLCAiQm9ndXMgREFDIHZhbHVlIDB4JXgiKQorSk1FU1NBR0UoSkVSUl9ESFRfSU5ERVgsICJCb2d1cyBESFQgaW5kZXggJWQiKQorSk1FU1NBR0UoSkVSUl9EUVRfSU5ERVgsICJCb2d1cyBEUVQgaW5kZXggJWQiKQorSk1FU1NBR0UoSkVSUl9FTVBUWV9JTUFHRSwgIkVtcHR5IEpQRUcgaW1hZ2UgKEROTCBub3Qgc3VwcG9ydGVkKSIpCitKTUVTU0FHRShKRVJSX0VNU19SRUFELCAiUmVhZCBmcm9tIEVNUyBmYWlsZWQiKQorSk1FU1NBR0UoSkVSUl9FTVNfV1JJVEUsICJXcml0ZSB0byBFTVMgZmFpbGVkIikKK0pNRVNTQUdFKEpFUlJfRU9JX0VYUEVDVEVELCAiRGlkbid0IGV4cGVjdCBtb3JlIHRoYW4gb25lIHNjYW4iKQorSk1FU1NBR0UoSkVSUl9GSUxFX1JFQUQsICJJbnB1dCBmaWxlIHJlYWQgZXJyb3IiKQorSk1FU1NBR0UoSkVSUl9GSUxFX1dSSVRFLCAiT3V0cHV0IGZpbGUgd3JpdGUgZXJyb3IgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCitKTUVTU0FHRShKRVJSX0ZSQUNUX1NBTVBMRV9OT1RJTVBMLCAiRnJhY3Rpb25hbCBzYW1wbGluZyBub3QgaW1wbGVtZW50ZWQgeWV0IikKK0pNRVNTQUdFKEpFUlJfSFVGRl9DTEVOX09WRVJGTE9XLCAiSHVmZm1hbiBjb2RlIHNpemUgdGFibGUgb3ZlcmZsb3ciKQorSk1FU1NBR0UoSkVSUl9IVUZGX01JU1NJTkdfQ09ERSwgIk1pc3NpbmcgSHVmZm1hbiBjb2RlIHRhYmxlIGVudHJ5IikKK0pNRVNTQUdFKEpFUlJfSU1BR0VfVE9PX0JJRywgIk1heGltdW0gc3VwcG9ydGVkIGltYWdlIGRpbWVuc2lvbiBpcyAldSBwaXhlbHMiKQorSk1FU1NBR0UoSkVSUl9JTlBVVF9FTVBUWSwgIkVtcHR5IGlucHV0IGZpbGUiKQorSk1FU1NBR0UoSkVSUl9JTlBVVF9FT0YsICJQcmVtYXR1cmUgZW5kIG9mIGlucHV0IGZpbGUiKQorSk1FU1NBR0UoSkVSUl9NSVNNQVRDSEVEX1FVQU5UX1RBQkxFLAorCSAiQ2Fubm90IHRyYW5zY29kZSBkdWUgdG8gbXVsdGlwbGUgdXNlIG9mIHF1YW50aXphdGlvbiB0YWJsZSAlZCIpCitKTUVTU0FHRShKRVJSX01JU1NJTkdfREFUQSwgIlNjYW4gc2NyaXB0IGRvZXMgbm90IHRyYW5zbWl0IGFsbCBkYXRhIikKK0pNRVNTQUdFKEpFUlJfTU9ERV9DSEFOR0UsICJJbnZhbGlkIGNvbG9yIHF1YW50aXphdGlvbiBtb2RlIGNoYW5nZSIpCitKTUVTU0FHRShKRVJSX05PVElNUEwsICJOb3QgaW1wbGVtZW50ZWQgeWV0IikKK0pNRVNTQUdFKEpFUlJfTk9UX0NPTVBJTEVELCAiUmVxdWVzdGVkIGZlYXR1cmUgd2FzIG9taXR0ZWQgYXQgY29tcGlsZSB0aW1lIikKK0pNRVNTQUdFKEpFUlJfTk9fQkFDS0lOR19TVE9SRSwgIkJhY2tpbmcgc3RvcmUgbm90IHN1cHBvcnRlZCIpCitKTUVTU0FHRShKRVJSX05PX0hVRkZfVEFCTEUsICJIdWZmbWFuIHRhYmxlIDB4JTAyeCB3YXMgbm90IGRlZmluZWQiKQorSk1FU1NBR0UoSkVSUl9OT19JTUFHRSwgIkpQRUcgZGF0YXN0cmVhbSBjb250YWlucyBubyBpbWFnZSIpCitKTUVTU0FHRShKRVJSX05PX1FVQU5UX1RBQkxFLCAiUXVhbnRpemF0aW9uIHRhYmxlIDB4JTAyeCB3YXMgbm90IGRlZmluZWQiKQorSk1FU1NBR0UoSkVSUl9OT19TT0ksICJOb3QgYSBKUEVHIGZpbGU6IHN0YXJ0cyB3aXRoIDB4JTAyeCAweCUwMngiKQorSk1FU1NBR0UoSkVSUl9PVVRfT0ZfTUVNT1JZLCAiSW5zdWZmaWNpZW50IG1lbW9yeSAoY2FzZSAlZCkiKQorSk1FU1NBR0UoSkVSUl9RVUFOVF9DT01QT05FTlRTLAorCSAiQ2Fubm90IHF1YW50aXplIG1vcmUgdGhhbiAlZCBjb2xvciBjb21wb25lbnRzIikKK0pNRVNTQUdFKEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgIkNhbm5vdCBxdWFudGl6ZSB0byBmZXdlciB0aGFuICVkIGNvbG9ycyIpCitKTUVTU0FHRShKRVJSX1FVQU5UX01BTllfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIG1vcmUgdGhhbiAlZCBjb2xvcnMiKQorSk1FU1NBR0UoSkVSUl9TT0ZfRFVQTElDQVRFLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiB0d28gU09GIG1hcmtlcnMiKQorSk1FU1NBR0UoSkVSUl9TT0ZfTk9fU09TLCAiSW52YWxpZCBKUEVHIGZpbGUgc3RydWN0dXJlOiBtaXNzaW5nIFNPUyBtYXJrZXIiKQorSk1FU1NBR0UoSkVSUl9TT0ZfVU5TVVBQT1JURUQsICJVbnN1cHBvcnRlZCBKUEVHIHByb2Nlc3M6IFNPRiB0eXBlIDB4JTAyeCIpCitKTUVTU0FHRShKRVJSX1NPSV9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0kgbWFya2VycyIpCitKTUVTU0FHRShKRVJSX1NPU19OT19TT0YsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IFNPUyBiZWZvcmUgU09GIikKK0pNRVNTQUdFKEpFUlJfVEZJTEVfQ1JFQVRFLCAiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSAlcyIpCitKTUVTU0FHRShKRVJSX1RGSUxFX1JFQUQsICJSZWFkIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSIpCitKTUVTU0FHRShKRVJSX1RGSUxFX1NFRUssICJTZWVrIGZhaWxlZCBvbiB0ZW1wb3JhcnkgZmlsZSIpCitKTUVTU0FHRShKRVJSX1RGSUxFX1dSSVRFLAorCSAiV3JpdGUgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIC0tLSBvdXQgb2YgZGlzayBzcGFjZT8iKQorSk1FU1NBR0UoSkVSUl9UT09fTElUVExFX0RBVEEsICJBcHBsaWNhdGlvbiB0cmFuc2ZlcnJlZCB0b28gZmV3IHNjYW5saW5lcyIpCitKTUVTU0FHRShKRVJSX1VOS05PV05fTUFSS0VSLCAiVW5zdXBwb3J0ZWQgbWFya2VyIHR5cGUgMHglMDJ4IikKK0pNRVNTQUdFKEpFUlJfVklSVFVBTF9CVUcsICJWaXJ0dWFsIGFycmF5IGNvbnRyb2xsZXIgbWVzc2VkIHVwIikKK0pNRVNTQUdFKEpFUlJfV0lEVEhfT1ZFUkZMT1csICJJbWFnZSB0b28gd2lkZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiIpCitKTUVTU0FHRShKRVJSX1hNU19SRUFELCAiUmVhZCBmcm9tIFhNUyBmYWlsZWQiKQorSk1FU1NBR0UoSkVSUl9YTVNfV1JJVEUsICJXcml0ZSB0byBYTVMgZmFpbGVkIikKK0pNRVNTQUdFKEpNU0dfQ09QWVJJR0hULCBKQ09QWVJJR0hUKQorSk1FU1NBR0UoSk1TR19WRVJTSU9OLCBKVkVSU0lPTikKK0pNRVNTQUdFKEpUUkNfMTZCSVRfVEFCTEVTLAorCSAiQ2F1dGlvbjogcXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgdG9vIGNvYXJzZSBmb3IgYmFzZWxpbmUgSlBFRyIpCitKTUVTU0FHRShKVFJDX0FET0JFLAorCSAiQWRvYmUgQVBQMTQgbWFya2VyOiB2ZXJzaW9uICVkLCBmbGFncyAweCUwNHggMHglMDR4LCB0cmFuc2Zvcm0gJWQiKQorSk1FU1NBR0UoSlRSQ19BUFAwLCAiVW5rbm93biBBUFAwIG1hcmtlciAobm90IEpGSUYpLCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19BUFAxNCwgIlVua25vd24gQVBQMTQgbWFya2VyIChub3QgQWRvYmUpLCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19EQUMsICJEZWZpbmUgQXJpdGhtZXRpYyBUYWJsZSAweCUwMng6IDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX0RIVCwgIkRlZmluZSBIdWZmbWFuIFRhYmxlIDB4JTAyeCIpCitKTUVTU0FHRShKVFJDX0RRVCwgIkRlZmluZSBRdWFudGl6YXRpb24gVGFibGUgJWQgIHByZWNpc2lvbiAlZCIpCitKTUVTU0FHRShKVFJDX0RSSSwgIkRlZmluZSBSZXN0YXJ0IEludGVydmFsICV1IikKK0pNRVNTQUdFKEpUUkNfRU1TX0NMT1NFLCAiRnJlZWQgRU1TIGhhbmRsZSAldSIpCitKTUVTU0FHRShKVFJDX0VNU19PUEVOLCAiT2J0YWluZWQgRU1TIGhhbmRsZSAldSIpCitKTUVTU0FHRShKVFJDX0VPSSwgIkVuZCBPZiBJbWFnZSIpCitKTUVTU0FHRShKVFJDX0hVRkZCSVRTLCAiICAgICAgICAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkIikKK0pNRVNTQUdFKEpUUkNfSkZJRiwgIkpGSUYgQVBQMCBtYXJrZXI6IHZlcnNpb24gJWQuJTAyZCwgZGVuc2l0eSAlZHglZCAgJWQiKQorSk1FU1NBR0UoSlRSQ19KRklGX0JBRFRIVU1CTkFJTFNJWkUsCisJICJXYXJuaW5nOiB0aHVtYm5haWwgaW1hZ2Ugc2l6ZSBkb2VzIG5vdCBtYXRjaCBkYXRhIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX0pGSUZfRVhURU5TSU9OLAorCSAiSkZJRiBleHRlbnNpb24gbWFya2VyOiB0eXBlIDB4JTAyeCwgbGVuZ3RoICV1IikKK0pNRVNTQUdFKEpUUkNfSkZJRl9USFVNQk5BSUwsICIgICAgd2l0aCAlZCB4ICVkIHRodW1ibmFpbCBpbWFnZSIpCitKTUVTU0FHRShKVFJDX01JU0NfTUFSS0VSLCAiTWlzY2VsbGFuZW91cyBtYXJrZXIgMHglMDJ4LCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19QQVJNTEVTU19NQVJLRVIsICJVbmV4cGVjdGVkIG1hcmtlciAweCUwMngiKQorSk1FU1NBR0UoSlRSQ19RVUFOVFZBTFMsICIgICAgICAgICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUiKQorSk1FU1NBR0UoSlRSQ19RVUFOVF8zX05DT0xPUlMsICJRdWFudGl6aW5nIHRvICVkID0gJWQqJWQqJWQgY29sb3JzIikKK0pNRVNTQUdFKEpUUkNfUVVBTlRfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgY29sb3JzIikKK0pNRVNTQUdFKEpUUkNfUVVBTlRfU0VMRUNURUQsICJTZWxlY3RlZCAlZCBjb2xvcnMgZm9yIHF1YW50aXphdGlvbiIpCitKTUVTU0FHRShKVFJDX1JFQ09WRVJZX0FDVElPTiwgIkF0IG1hcmtlciAweCUwMngsIHJlY292ZXJ5IGFjdGlvbiAlZCIpCitKTUVTU0FHRShKVFJDX1JTVCwgIlJTVCVkIikKK0pNRVNTQUdFKEpUUkNfU01PT1RIX05PVElNUEwsCisJICJTbW9vdGhpbmcgbm90IHN1cHBvcnRlZCB3aXRoIG5vbnN0YW5kYXJkIHNhbXBsaW5nIHJhdGlvcyIpCitKTUVTU0FHRShKVFJDX1NPRiwgIlN0YXJ0IE9mIEZyYW1lIDB4JTAyeDogd2lkdGg9JXUsIGhlaWdodD0ldSwgY29tcG9uZW50cz0lZCIpCitKTUVTU0FHRShKVFJDX1NPRl9DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiAlZGh4JWR2IHE9JWQiKQorSk1FU1NBR0UoSlRSQ19TT0ksICJTdGFydCBvZiBJbWFnZSIpCitKTUVTU0FHRShKVFJDX1NPUywgIlN0YXJ0IE9mIFNjYW46ICVkIGNvbXBvbmVudHMiKQorSk1FU1NBR0UoSlRSQ19TT1NfQ09NUE9ORU5ULCAiICAgIENvbXBvbmVudCAlZDogZGM9JWQgYWM9JWQiKQorSk1FU1NBR0UoSlRSQ19TT1NfUEFSQU1TLCAiICBTcz0lZCwgU2U9JWQsIEFoPSVkLCBBbD0lZCIpCitKTUVTU0FHRShKVFJDX1RGSUxFX0NMT1NFLCAiQ2xvc2VkIHRlbXBvcmFyeSBmaWxlICVzIikKK0pNRVNTQUdFKEpUUkNfVEZJTEVfT1BFTiwgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZSAlcyIpCitKTUVTU0FHRShKVFJDX1RIVU1CX0pQRUcsCisJICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IEpQRUctY29tcHJlc3NlZCB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1RIVU1CX1BBTEVUVEUsCisJICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHBhbGV0dGUgdGh1bWJuYWlsIGltYWdlLCBsZW5ndGggJXUiKQorSk1FU1NBR0UoSlRSQ19USFVNQl9SR0IsCisJICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IFJHQiB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCitKTUVTU0FHRShKVFJDX1VOS05PV05fSURTLAorCSAiVW5yZWNvZ25pemVkIGNvbXBvbmVudCBJRHMgJWQgJWQgJWQsIGFzc3VtaW5nIFlDYkNyIikKK0pNRVNTQUdFKEpUUkNfWE1TX0NMT1NFLCAiRnJlZWQgWE1TIGhhbmRsZSAldSIpCitKTUVTU0FHRShKVFJDX1hNU19PUEVOLCAiT2J0YWluZWQgWE1TIGhhbmRsZSAldSIpCitKTUVTU0FHRShKV1JOX0FET0JFX1hGT1JNLCAiVW5rbm93biBBZG9iZSBjb2xvciB0cmFuc2Zvcm0gY29kZSAlZCIpCitKTUVTU0FHRShKV1JOX0JPR1VTX1BST0dSRVNTSU9OLAorCSAiSW5jb25zaXN0ZW50IHByb2dyZXNzaW9uIHNlcXVlbmNlIGZvciBjb21wb25lbnQgJWQgY29lZmZpY2llbnQgJWQiKQorSk1FU1NBR0UoSldSTl9FWFRSQU5FT1VTX0RBVEEsCisJICJDb3JydXB0IEpQRUcgZGF0YTogJXUgZXh0cmFuZW91cyBieXRlcyBiZWZvcmUgbWFya2VyIDB4JTAyeCIpCitKTUVTU0FHRShKV1JOX0hJVF9NQVJLRVIsICJDb3JydXB0IEpQRUcgZGF0YTogcHJlbWF0dXJlIGVuZCBvZiBkYXRhIHNlZ21lbnQiKQorSk1FU1NBR0UoSldSTl9IVUZGX0JBRF9DT0RFLCAiQ29ycnVwdCBKUEVHIGRhdGE6IGJhZCBIdWZmbWFuIGNvZGUiKQorSk1FU1NBR0UoSldSTl9KRklGX01BSk9SLCAiV2FybmluZzogdW5rbm93biBKRklGIHJldmlzaW9uIG51bWJlciAlZC4lMDJkIikKK0pNRVNTQUdFKEpXUk5fSlBFR19FT0YsICJQcmVtYXR1cmUgZW5kIG9mIEpQRUcgZmlsZSIpCitKTUVTU0FHRShKV1JOX01VU1RfUkVTWU5DLAorCSAiQ29ycnVwdCBKUEVHIGRhdGE6IGZvdW5kIG1hcmtlciAweCUwMnggaW5zdGVhZCBvZiBSU1QlZCIpCitKTUVTU0FHRShKV1JOX05PVF9TRVFVRU5USUFMLCAiSW52YWxpZCBTT1MgcGFyYW1ldGVycyBmb3Igc2VxdWVudGlhbCBKUEVHIikKK0pNRVNTQUdFKEpXUk5fVE9PX01VQ0hfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBtYW55IHNjYW5saW5lcyIpCisKKyNpZmRlZiBKTUFLRV9FTlVNX0xJU1QKKworICBKTVNHX0xBU1RNU0dDT0RFCit9IEpfTUVTU0FHRV9DT0RFOworCisjdW5kZWYgSk1BS0VfRU5VTV9MSVNUCisjZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCisKKy8qIFphcCBKTUVTU0FHRSBtYWNybyBzbyB0aGF0IGZ1dHVyZSByZS1pbmNsdXNpb25zIGRvIG5vdGhpbmcgYnkgZGVmYXVsdCAqLworI3VuZGVmIEpNRVNTQUdFCisKKworI2lmbmRlZiBKRVJST1JfSAorI2RlZmluZSBKRVJST1JfSAorCisvKiBNYWNyb3MgdG8gc2ltcGxpZnkgdXNpbmcgdGhlIGVycm9yIGFuZCB0cmFjZSBtZXNzYWdlIHN0dWZmICovCisvKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGVpdGhlciB0eXBlIG9mIGNpbmZvIHBvaW50ZXIgKi8KKworLyogRmF0YWwgZXJyb3JzIChwcmludCBtZXNzYWdlIGFuZCBleGl0KSAqLworI2RlZmluZSBFUlJFWElUKGNpbmZvLGNvZGUpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUMShjaW5mbyxjb2RlLHAxKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVDIoY2luZm8sY29kZSxwMSxwMikgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKKyAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCisjZGVmaW5lIEVSUkVYSVQzKGNpbmZvLGNvZGUscDEscDIscDMpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQorI2RlZmluZSBFUlJFWElUNChjaW5mbyxjb2RlLHAxLHAyLHAzLHA0KSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzJdID0gKHAzKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzNdID0gKHA0KSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKyNkZWZpbmUgRVJSRVhJVFMoY2luZm8sY29kZSxzdHIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICBzdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKKworI2RlZmluZSBNQUtFU1RNVChzdHVmZikJCWRvIHsgc3R1ZmYgfSB3aGlsZSAoMCkKKworLyogTm9uZmF0YWwgZXJyb3JzICh3ZSBjYW4ga2VlcCBnb2luZywgYnV0IHRoZSBkYXRhIGlzIHByb2JhYmx5IGNvcnJ1cHQpICovCisjZGVmaW5lIFdBUk5NUyhjaW5mbyxjb2RlKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKKyNkZWZpbmUgV0FSTk1TMShjaW5mbyxjb2RlLHAxKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKKyNkZWZpbmUgV0FSTk1TMihjaW5mbyxjb2RlLHAxLHAyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIC0xKSkKKworLyogSW5mb3JtYXRpb25hbC9kZWJ1Z2dpbmcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgVFJBQ0VNUyhjaW5mbyxsdmwsY29kZSkgIFwKKyAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCisjZGVmaW5lIFRSQUNFTVMxKGNpbmZvLGx2bCxjb2RlLHAxKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAorICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKKyNkZWZpbmUgVFJBQ0VNUzIoY2luZm8sbHZsLGNvZGUscDEscDIpICBcCisgICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCisgICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCisgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQorI2RlZmluZSBUUkFDRU1TMyhjaW5mbyxsdmwsY29kZSxwMSxwMixwMykgIFwKKyAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCisJICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgXAorCSAgIChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSk7IFwKKwkgICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpOyApCisjZGVmaW5lIFRSQUNFTVM0KGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzLHA0KSAgXAorICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKKwkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBfbXBbM10gPSAocDQpOyBcCisJICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAorCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKKyNkZWZpbmUgVFJBQ0VNUzUoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQscDUpICBcCisgIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAorCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKKwkgICBfbXBbNF0gPSAocDUpOyBcCisJICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAorCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKKyNkZWZpbmUgVFJBQ0VNUzgoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQscDUscDYscDcscDgpICBcCisgIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAorCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKKwkgICBfbXBbNF0gPSAocDUpOyBfbXBbNV0gPSAocDYpOyBfbXBbNl0gPSAocDcpOyBfbXBbN10gPSAocDgpOyBcCisJICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAorCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKKyNkZWZpbmUgVFJBQ0VNU1MoY2luZm8sbHZsLGNvZGUsc3RyKSAgXAorICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAorICAgc3RybmNweSgoY2luZm8pLT5lcnItPm1zZ19wYXJtLnMsIChzdHIpLCBKTVNHX1NUUl9QQVJNX01BWCksIFwKKyAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCisKKyNlbmRpZiAvKiBKRVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0Zmx0LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamZkY3RmbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ3YTAwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0Zmx0LmMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBqZmRjdGZsdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmbG9hdGluZy1wb2ludCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRoYW4gZWl0aGVyIG9mIHRoZSBpbnRlZ2VyCisgKiBEQ1QgaW1wbGVtZW50YXRpb25zLiAgSG93ZXZlciwgaXQgbWF5IG5vdCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMgb24gYWxsCisgKiBtYWNoaW5lcyBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGluIHJvdW5kb2ZmIGJlaGF2aW9yLiAgU3BlZWQgd2lsbCBkZXBlbmQKKyAqIG9uIHRoZSBoYXJkd2FyZSdzIGZsb2F0aW5nIHBvaW50IGNhcGFjaXR5LgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gQXJhaSwgQWd1aSwgYW5kIE5ha2FqaW1hJ3MgYWxnb3JpdGhtIGZvcgorICogc2NhbGVkIERDVC4gIFRoZWlyIG9yaWdpbmFsIHBhcGVyIChUcmFucy4gSUVJQ0UgRS03MSgxMSk6MTA5NSkgaXMgaW4KKyAqIEphcGFuZXNlLCBidXQgdGhlIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gdGhlIFBlbm5lYmFrZXIgJiBNaXRjaGVsbAorICogSlBFRyB0ZXh0Ym9vayAoc2VlIFJFRkVSRU5DRVMgc2VjdGlvbiBpbiBmaWxlIFJFQURNRSkuICBUaGUgZm9sbG93aW5nIGNvZGUKKyAqIGlzIGJhc2VkIGRpcmVjdGx5IG9uIGZpZ3VyZSA0LTggaW4gUCZNLgorICogV2hpbGUgYW4gOC1wb2ludCBEQ1QgY2Fubm90IGJlIGRvbmUgaW4gbGVzcyB0aGFuIDExIG11bHRpcGxpZXMsIGl0IGlzCisgKiBwb3NzaWJsZSB0byBhcnJhbmdlIHRoZSBjb21wdXRhdGlvbiBzbyB0aGF0IG1hbnkgb2YgdGhlIG11bHRpcGxpZXMgYXJlCisgKiBzaW1wbGUgc2NhbGluZ3Mgb2YgdGhlIGZpbmFsIG91dHB1dHMuICBUaGVzZSBtdWx0aXBsaWVzIGNhbiB0aGVuIGJlCisgKiBmb2xkZWQgaW50byB0aGUgbXVsdGlwbGljYXRpb25zIG9yIGRpdmlzaW9ucyBieSB0aGUgSlBFRyBxdWFudGl6YXRpb24KKyAqIHRhYmxlIGVudHJpZXMuICBUaGUgQUEmTiBtZXRob2QgbGVhdmVzIG9ubHkgNSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzCisgKiB0byBiZSBkb25lIGluIHRoZSBEQ1QgaXRzZWxmLgorICogVGhlIHByaW1hcnkgZGlzYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgd2l0aCBhIGZpeGVkLXBvaW50CisgKiBpbXBsZW1lbnRhdGlvbiwgYWNjdXJhY3kgaXMgbG9zdCBkdWUgdG8gaW1wcmVjaXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICogc2NhbGVkIHF1YW50aXphdGlvbiB2YWx1ZXMuICBIb3dldmVyLCB0aGF0IHByb2JsZW0gZG9lcyBub3QgYXJpc2UgaWYKKyAqIHdlIHVzZSBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAorCisKKy8qCisgKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KKyAqLworCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfZmRjdF9mbG9hdCAoRkFTVF9GTE9BVCAqIGRhdGEpCit7CisgIEZBU1RfRkxPQVQgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgRkFTVF9GTE9BVCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgRkFTVF9GTE9BVCB6MSwgejIsIHozLCB6NCwgejUsIHoxMSwgejEzOworICBGQVNUX0ZMT0FUICpkYXRhcHRyOworICBpbnQgY3RyOworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0clswXSA9IHRtcDEwICsgdG1wMTE7IC8qIHBoYXNlIDMgKi8KKyAgICBkYXRhcHRyWzRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9ICh0bXAxMiArIHRtcDEzKSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOwkvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gKHRtcDEwIC0gdG1wMTIpICogKChGQVNUX0ZMT0FUKSAwLjM4MjY4MzQzMyk7IC8qIGM2ICovCisgICAgejIgPSAoKEZBU1RfRkxPQVQpIDAuNTQxMTk2MTAwKSAqIHRtcDEwICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSAoKEZBU1RfRkxPQVQpIDEuMzA2NTYyOTY1KSAqIHRtcDEyICsgejU7IC8qIGMyK2M2ICovCisgICAgejMgPSB0bXAxMSAqICgoRkFTVF9GTE9BVCkgMC43MDcxMDY3ODEpOyAvKiBjNCAqLworCisgICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLworICAgIHoxMyA9IHRtcDcgLSB6MzsKKworICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLworICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyWzFdID0gejExICsgejQ7CisgICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OworCisgICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLworICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7CisgICAgCisgICAgejEgPSAodG1wMTIgKyB0bXAxMykgKiAoKEZBU1RfRkxPQVQpIDAuNzA3MTA2NzgxKTsgLyogYzQgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqMl0gPSB0bXAxMyArIHoxOyAvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gdG1wMTMgLSB6MTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMTAgPSB0bXA0ICsgdG1wNTsJLyogcGhhc2UgMiAqLworICAgIHRtcDExID0gdG1wNSArIHRtcDY7CisgICAgdG1wMTIgPSB0bXA2ICsgdG1wNzsKKworICAgIC8qIFRoZSByb3RhdG9yIGlzIG1vZGlmaWVkIGZyb20gZmlnIDQtOCB0byBhdm9pZCBleHRyYSBuZWdhdGlvbnMuICovCisgICAgejUgPSAodG1wMTAgLSB0bXAxMikgKiAoKEZBU1RfRkxPQVQpIDAuMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9ICgoRkFTVF9GTE9BVCkgMC41NDExOTYxMDApICogdG1wMTAgKyB6NTsgLyogYzItYzYgKi8KKyAgICB6NCA9ICgoRkFTVF9GTE9BVCkgMS4zMDY1NjI5NjUpICogdG1wMTIgKyB6NTsgLyogYzIrYzYgKi8KKyAgICB6MyA9IHRtcDExICogKChGQVNUX0ZMT0FUKSAwLjcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gejEzICsgejI7IC8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0ZMT0FUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0ZnN0LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamZkY3Rmc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IzNzhhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0ZnN0LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBqZmRjdGZzdC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBmYXN0LCBub3Qgc28gYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGZvcndhcmQgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4KKyAqCisgKiBBIDItRCBEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIERDVCBvbiBlYWNoIHJvdyBmb2xsb3dlZCBieSAxLUQgRENUCisgKiBvbiBlYWNoIGNvbHVtbi4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlCisgKiBtdWNoIG1vcmUgY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEFyYWksIEFndWksIGFuZCBOYWthamltYSdzIGFsZ29yaXRobSBmb3IKKyAqIHNjYWxlZCBEQ1QuICBUaGVpciBvcmlnaW5hbCBwYXBlciAoVHJhbnMuIElFSUNFIEUtNzEoMTEpOjEwOTUpIGlzIGluCisgKiBKYXBhbmVzZSwgYnV0IHRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHRoZSBQZW5uZWJha2VyICYgTWl0Y2hlbGwKKyAqIEpQRUcgdGV4dGJvb2sgKHNlZSBSRUZFUkVOQ0VTIHNlY3Rpb24gaW4gZmlsZSBSRUFETUUpLiAgVGhlIGZvbGxvd2luZyBjb2RlCisgKiBpcyBiYXNlZCBkaXJlY3RseSBvbiBmaWd1cmUgNC04IGluIFAmTS4KKyAqIFdoaWxlIGFuIDgtcG9pbnQgRENUIGNhbm5vdCBiZSBkb25lIGluIGxlc3MgdGhhbiAxMSBtdWx0aXBsaWVzLCBpdCBpcworICogcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgY29tcHV0YXRpb24gc28gdGhhdCBtYW55IG9mIHRoZSBtdWx0aXBsaWVzIGFyZQorICogc2ltcGxlIHNjYWxpbmdzIG9mIHRoZSBmaW5hbCBvdXRwdXRzLiAgVGhlc2UgbXVsdGlwbGllcyBjYW4gdGhlbiBiZQorICogZm9sZGVkIGludG8gdGhlIG11bHRpcGxpY2F0aW9ucyBvciBkaXZpc2lvbnMgYnkgdGhlIEpQRUcgcXVhbnRpemF0aW9uCisgKiB0YWJsZSBlbnRyaWVzLiAgVGhlIEFBJk4gbWV0aG9kIGxlYXZlcyBvbmx5IDUgbXVsdGlwbGllcyBhbmQgMjkgYWRkcworICogdG8gYmUgZG9uZSBpbiB0aGUgRENUIGl0c2VsZi4KKyAqIFRoZSBwcmltYXJ5IGRpc2FkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IHdpdGggZml4ZWQtcG9pbnQgbWF0aCwKKyAqIGFjY3VyYWN5IGlzIGxvc3QgZHVlIHRvIGltcHJlY2lzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2NhbGVkCisgKiBxdWFudGl6YXRpb24gdmFsdWVzLiAgVGhlIHNtYWxsZXIgdGhlIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyeSwgdGhlIGxlc3MKKyAqIHByZWNpc2UgdGhlIHNjYWxlZCB2YWx1ZSwgc28gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIHdvcnNlIHdpdGggaGlnaC0KKyAqIHF1YWxpdHktc2V0dGluZyBmaWxlcyB0aGFuIHdpdGggbG93LXF1YWxpdHkgb25lcy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBTY2FsaW5nIGRlY2lzaW9ucyBhcmUgZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIGluIHRoZSBMTCZNIGFsZ29yaXRobTsKKyAqIHNlZSBqZmRjdGludC5jIGZvciBtb3JlIGRldGFpbHMuICBIb3dldmVyLCB3ZSBjaG9vc2UgdG8gZGVzY2FsZQorICogKHJpZ2h0IHNoaWZ0KSBtdWx0aXBsaWNhdGlvbiBwcm9kdWN0cyBhcyBzb29uIGFzIHRoZXkgYXJlIGZvcm1lZCwKKyAqIHJhdGhlciB0aGFuIGNhcnJ5aW5nIGFkZGl0aW9uYWwgZnJhY3Rpb25hbCBiaXRzIGludG8gc3Vic2VxdWVudCBhZGRpdGlvbnMuCisgKiBUaGlzIGNvbXByb21pc2VzIGFjY3VyYWN5IHNsaWdodGx5LCBidXQgaXQgbGV0cyB1cyBzYXZlIGEgZmV3IHNoaWZ0cy4KKyAqIE1vcmUgaW1wb3J0YW50bHksIDE2LWJpdCBhcml0aG1ldGljIGlzIHRoZW4gYWRlcXVhdGUgKGZvciA4LWJpdCBzYW1wbGVzKQorICogZXZlcnl3aGVyZSBleGNlcHQgaW4gdGhlIG11bHRpcGxpY2F0aW9ucyBwcm9wZXI7IHRoaXMgc2F2ZXMgYSBnb29kIGRlYWwKKyAqIG9mIHdvcmsgb24gMTYtYml0LWludCBtYWNoaW5lcy4KKyAqCisgKiBBZ2FpbiB0byBzYXZlIGEgZmV3IHNoaWZ0cywgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIGJldHdlZW4gcGFzcyAxIGFuZAorICogcGFzcyAyIGFyZSBub3QgdXBzY2FsZWQsIGJ1dCBhcmUgcmVwcmVzZW50ZWQgb25seSB0byBpbnRlZ3JhbCBwcmVjaXNpb24uCisgKgorICogQSBmaW5hbCBjb21wcm9taXNlIGlzIHRvIHJlcHJlc2VudCB0aGUgbXVsdGlwbGljYXRpdmUgY29uc3RhbnRzIHRvIG9ubHkKKyAqIDggZnJhY3Rpb25hbCBiaXRzLCByYXRoZXIgdGhhbiAxMy4gIFRoaXMgc2F2ZXMgc29tZSBzaGlmdGluZyB3b3JrIG9uIHNvbWUKKyAqIG1hY2hpbmVzLCBhbmQgbWF5IGFsc28gcmVkdWNlIHRoZSBjb3N0IG9mIG11bHRpcGxpY2F0aW9uIChzaW5jZSB0aGVyZQorICogYXJlIGZld2VyIG9uZS1iaXRzIGluIHRoZSBjb25zdGFudHMpLgorICovCisKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSA4CisjZGVmaW5lIEZJWF8wXzM4MjY4MzQzMyAgKChJTlQzMikgICA5OCkJCS8qIEZJWCgwLjM4MjY4MzQzMykgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgMTM5KQkJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83MDcxMDY3ODEgICgoSU5UMzIpICAxODEpCQkvKiBGSVgoMC43MDcxMDY3ODEpICovCisjZGVmaW5lIEZJWF8xXzMwNjU2Mjk2NSAgKChJTlQzMikgIDMzNCkJCS8qIEZJWCgxLjMwNjU2Mjk2NSkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzM4MjY4MzQzMyAgRklYKDAuMzgyNjgzNDMzKQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICBGSVgoMC43MDcxMDY3ODEpCisjZGVmaW5lIEZJWF8xXzMwNjU2Mjk2NSAgRklYKDEuMzA2NTYyOTY1KQorI2VuZGlmCisKKworLyogV2UgY2FuIGdhaW4gYSBsaXR0bGUgbW9yZSBzcGVlZCwgd2l0aCBhIGZ1cnRoZXIgY29tcHJvbWlzZSBpbiBhY2N1cmFjeSwKKyAqIGJ5IG9taXR0aW5nIHRoZSBhZGRpdGlvbiBpbiBhIGRlc2NhbGluZyBzaGlmdC4gIFRoaXMgeWllbGRzIGFuIGluY29ycmVjdGx5CisgKiByb3VuZGVkIHJlc3VsdCBoYWxmIHRoZSB0aW1lLi4uCisgKi8KKworI2lmbmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyN1bmRlZiBERVNDQUxFCisjZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoeCwgbikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGEgRENURUxFTSB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCwgYW5kIGltbWVkaWF0ZWx5CisgKiBkZXNjYWxlIHRvIHlpZWxkIGEgRENURUxFTSByZXN1bHQuCisgKi8KKworI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICAoKERDVEVMRU0pIERFU0NBTEUoKHZhcikgKiAoY29uc3QpLCBDT05TVF9CSVRTKSkKKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfaWZhc3QgKERDVEVMRU0gKiBkYXRhKQoreworICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIERDVEVMRU0gejEsIHoyLCB6MywgejQsIHo1LCB6MTEsIHoxMzsKKyAgRENURUxFTSAqZGF0YXB0cjsKKyAgaW50IGN0cjsKKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cy4gKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyWzBdICsgZGF0YXB0cls3XTsKKyAgICB0bXA3ID0gZGF0YXB0clswXSAtIGRhdGFwdHJbN107CisgICAgdG1wMSA9IGRhdGFwdHJbMV0gKyBkYXRhcHRyWzZdOworICAgIHRtcDYgPSBkYXRhcHRyWzFdIC0gZGF0YXB0cls2XTsKKyAgICB0bXAyID0gZGF0YXB0clsyXSArIGRhdGFwdHJbNV07CisgICAgdG1wNSA9IGRhdGFwdHJbMl0gLSBkYXRhcHRyWzVdOworICAgIHRtcDMgPSBkYXRhcHRyWzNdICsgZGF0YXB0cls0XTsKKyAgICB0bXA0ID0gZGF0YXB0clszXSAtIGRhdGFwdHJbNF07CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7CisgICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOworICAgIAorICAgIGRhdGFwdHJbMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cls0XSA9IHRtcDEwIC0gdG1wMTE7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLworICAgIGRhdGFwdHJbMl0gPSB0bXAxMyArIHoxOwkvKiBwaGFzZSA1ICovCisgICAgZGF0YXB0cls2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEwLCBGSVhfMF81NDExOTYxMDApICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSBNVUxUSVBMWSh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cls1XSA9IHoxMyArIHoyOwkvKiBwaGFzZSA2ICovCisgICAgZGF0YXB0clszXSA9IHoxMyAtIHoyOworICAgIGRhdGFwdHJbMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyWzddID0gejExIC0gejQ7CisKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOworICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKKyAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07CisgICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOworICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSB0bXAxMCArIHRtcDExOyAvKiBwaGFzZSAzICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gdG1wMTAgLSB0bXAxMTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisgICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gdG1wMTMgKyB6MTsgLyogcGhhc2UgNSAqLworICAgIGRhdGFwdHJbRENUU0laRSo2XSA9IHRtcDEzIC0gejE7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDEwID0gdG1wNCArIHRtcDU7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXAxMSA9IHRtcDUgKyB0bXA2OworICAgIHRtcDEyID0gdG1wNiArIHRtcDc7CisKKyAgICAvKiBUaGUgcm90YXRvciBpcyBtb2RpZmllZCBmcm9tIGZpZyA0LTggdG8gYXZvaWQgZXh0cmEgbmVnYXRpb25zLiAqLworICAgIHo1ID0gTVVMVElQTFkodG1wMTAgLSB0bXAxMiwgRklYXzBfMzgyNjgzNDMzKTsgLyogYzYgKi8KKyAgICB6MiA9IE1VTFRJUExZKHRtcDEwLCBGSVhfMF81NDExOTYxMDApICsgejU7IC8qIGMyLWM2ICovCisgICAgejQgPSBNVUxUSVBMWSh0bXAxMiwgRklYXzFfMzA2NTYyOTY1KSArIHo1OyAvKiBjMitjNiAqLworICAgIHozID0gTVVMVElQTFkodG1wMTEsIEZJWF8wXzcwNzEwNjc4MSk7IC8qIGM0ICovCisKKyAgICB6MTEgPSB0bXA3ICsgejM7CQkvKiBwaGFzZSA1ICovCisgICAgejEzID0gdG1wNyAtIHozOworCisgICAgZGF0YXB0cltEQ1RTSVpFKjVdID0gejEzICsgejI7IC8qIHBoYXNlIDYgKi8KKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSB6MTMgLSB6MjsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSB6MTEgKyB6NDsKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSB6MTEgLSB6NDsKKworICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KKyAgfQorfQorCisjZW5kaWYgLyogRENUX0lGQVNUX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0aW50LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamZkY3RpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTc4YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pmZGN0aW50LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBqZmRjdGludC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgYSBzbG93LWJ1dC1hY2N1cmF0ZSBpbnRlZ2VyIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICogZm9yd2FyZCBEQ1QgKERpc2NyZXRlIENvc2luZSBUcmFuc2Zvcm0pLgorICoKKyAqIEEgMi1EIERDVCBjYW4gYmUgZG9uZSBieSAxLUQgRENUIG9uIGVhY2ggcm93IGZvbGxvd2VkIGJ5IDEtRCBEQ1QKKyAqIG9uIGVhY2ggY29sdW1uLiAgRGlyZWN0IGFsZ29yaXRobXMgYXJlIGFsc28gYXZhaWxhYmxlLCBidXQgdGhleSBhcmUKKyAqIG11Y2ggbW9yZSBjb21wbGV4IGFuZCBzZWVtIG5vdCB0byBiZSBhbnkgZmFzdGVyIHdoZW4gcmVkdWNlZCB0byBjb2RlLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbgorICogICBDLiBMb2VmZmxlciwgQS4gTGlndGVuYmVyZyBhbmQgRy4gTW9zY2h5dHosICJQcmFjdGljYWwgRmFzdCAxLUQgRENUCisgKiAgIEFsZ29yaXRobXMgd2l0aCAxMSBNdWx0aXBsaWNhdGlvbnMiLCBQcm9jLiBJbnQnbC4gQ29uZi4gb24gQWNvdXN0aWNzLAorICogICBTcGVlY2gsIGFuZCBTaWduYWwgUHJvY2Vzc2luZyAxOTg5IChJQ0FTU1AgJzg5KSwgcHAuIDk4OC05OTEuCisgKiBUaGUgcHJpbWFyeSBhbGdvcml0aG0gZGVzY3JpYmVkIHRoZXJlIHVzZXMgMTEgbXVsdGlwbGllcyBhbmQgMjkgYWRkcy4KKyAqIFdlIHVzZSB0aGVpciBhbHRlcm5hdGUgbWV0aG9kIHdpdGggMTIgbXVsdGlwbGllcyBhbmQgMzIgYWRkcy4KKyAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCBubyBkYXRhIHBhdGggY29udGFpbnMgbW9yZSB0aGFuIG9uZQorICogbXVsdGlwbGljYXRpb247IHRoaXMgYWxsb3dzIGEgdmVyeSBzaW1wbGUgYW5kIGFjY3VyYXRlIGltcGxlbWVudGF0aW9uIGluCisgKiBzY2FsZWQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywgd2l0aCBhIG1pbmltYWwgbnVtYmVyIG9mIHNoaWZ0cy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKgorICogVGhlIHBvb3Agb24gdGhpcyBzY2FsaW5nIHN0dWZmIGlzIGFzIGZvbGxvd3M6CisgKgorICogRWFjaCAxLUQgRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQorICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCisgKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQorICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIERDVCwKKyAqIGJlY2F1c2UgdGhlIHkwIGFuZCB5NCBvdXRwdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KKyAqIEluIHRoZSBJSkcgY29kZSwgdGhpcyBmYWN0b3Igb2YgOCBpcyByZW1vdmVkIGJ5IHRoZSBxdWFudGl6YXRpb24gc3RlcAorICogKGluIGpjZGN0bWdyLmMpLCBOT1QgaW4gdGhpcyBtb2R1bGUuCisgKgorICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAorICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcworICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCisgKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZworICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKKyAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgorICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQorICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCisgKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCisgKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgorICoKKyAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKKyAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKKyAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKKyAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoRm9yIDEyLWJpdCBzYW1wbGUgZGF0YSwgdGhlIGludGVybWVkaWF0ZQorICogYXJyYXkgaXMgSU5UMzIgYW55d2F5LikKKyAqCisgKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAorICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCisgKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMgorI2Vsc2UKKyNkZWZpbmUgQ09OU1RfQklUUyAgMTMKKyNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KKyNlbmRpZgorCisvKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKKyAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgorICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KKyAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KKyAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCisgKi8KKworI2lmIENPTlNUX0JJVFMgPT0gMTMKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLworI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCisjZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCisjZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQorI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQorI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCisjZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCisjZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQorI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKKyNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCisjZW5kaWYKKworCisvKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCisgKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCisgKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCisgKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgorICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKKyNlbHNlCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCisjZW5kaWYKKworCisvKgorICogUGVyZm9ybSB0aGUgZm9yd2FyZCBEQ1Qgb24gb25lIGJsb2NrIG9mIHNhbXBsZXMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZkY3RfaXNsb3cgKERDVEVMRU0gKiBkYXRhKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBEQ1RFTEVNICpkYXRhcHRyOworICBpbnQgY3RyOworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyByb3dzLiAqLworICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGRhdGFwdHIgPSBkYXRhOworICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7CisgICAgdG1wMCA9IGRhdGFwdHJbMF0gKyBkYXRhcHRyWzddOworICAgIHRtcDcgPSBkYXRhcHRyWzBdIC0gZGF0YXB0cls3XTsKKyAgICB0bXAxID0gZGF0YXB0clsxXSArIGRhdGFwdHJbNl07CisgICAgdG1wNiA9IGRhdGFwdHJbMV0gLSBkYXRhcHRyWzZdOworICAgIHRtcDIgPSBkYXRhcHRyWzJdICsgZGF0YXB0cls1XTsKKyAgICB0bXA1ID0gZGF0YXB0clsyXSAtIGRhdGFwdHJbNV07CisgICAgdG1wMyA9IGRhdGFwdHJbM10gKyBkYXRhcHRyWzRdOworICAgIHRtcDQgPSBkYXRhcHRyWzNdIC0gZGF0YXB0cls0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0clswXSA9IChEQ1RFTEVNKSAoKHRtcDEwICsgdG1wMTEpIDw8IFBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbNF0gPSAoRENURUxFTSkgKCh0bXAxMCAtIHRtcDExKSA8PCBQQVNTMV9CSVRTKTsKKyAgICAKKyAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7CisgICAgZGF0YXB0clsyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisJCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAorCQkJCSAgIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgorICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgorICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KKyAgICAgKi8KKyAgICAKKyAgICB6MSA9IHRtcDQgKyB0bXA3OworICAgIHoyID0gdG1wNSArIHRtcDY7CisgICAgejMgPSB0bXA0ICsgdG1wNjsKKyAgICB6NCA9IHRtcDUgKyB0bXA3OworICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCisgICAgCisgICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLworICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KKyAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCisgICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLworICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KKyAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLworICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCisgICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLworICAgIAorICAgIHozICs9IHo1OworICAgIHo0ICs9IHo1OworICAgIAorICAgIGRhdGFwdHJbN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyWzVdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNSArIHoyICsgejQsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgZGF0YXB0clszXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIGRhdGFwdHJbMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICAKKyAgICBkYXRhcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorCisgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zLgorICAgKiBXZSByZW1vdmUgdGhlIFBBU1MxX0JJVFMgc2NhbGluZywgYnV0IGxlYXZlIHRoZSByZXN1bHRzIHNjYWxlZCB1cAorICAgKiBieSBhbiBvdmVyYWxsIGZhY3RvciBvZiA4LgorICAgKi8KKworICBkYXRhcHRyID0gZGF0YTsKKyAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgeworICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107CisgICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKKyAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOworICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07CisgICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKKyAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOworICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07CisgICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgcGVyIExMJk0gZmlndXJlIDEgLS0tIG5vdGUgdGhhdCBwdWJsaXNoZWQgZmlndXJlIGlzIGZhdWx0eTsKKyAgICAgKiByb3RhdG9yICJzcXJ0KDIpKmMxIiBzaG91bGQgYmUgInNxcnQoMikqYzYiLgorICAgICAqLworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgKyB0bXAxMSwgUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjRdID0gKERDVEVMRU0pIERFU0NBTEUodG1wMTAgLSB0bXAxMSwgUEFTUzFfQklUUyk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF81NDExOTYxMDApOworICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IChEQ1RFTEVNKSBERVNDQUxFKHoxICsgTVVMVElQTFkodG1wMTMsIEZJWF8wXzc2NTM2Njg2NSksCisJCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7CisgICAgZGF0YXB0cltEQ1RTSVpFKjZdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMiwgLSBGSVhfMV84NDc3NTkwNjUpLAorCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOworICAgIAorICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgOCAtLS0gbm90ZSBwYXBlciBvbWl0cyBmYWN0b3Igb2Ygc3FydCgyKS4KKyAgICAgKiBjSyByZXByZXNlbnRzIGNvcyhLKnBpLzE2KS4KKyAgICAgKiBpMC4uaTMgaW4gdGhlIHBhcGVyIGFyZSB0bXA0Li50bXA3IGhlcmUuCisgICAgICovCisgICAgCisgICAgejEgPSB0bXA0ICsgdG1wNzsKKyAgICB6MiA9IHRtcDUgKyB0bXA2OworICAgIHozID0gdG1wNCArIHRtcDY7CisgICAgejQgPSB0bXA1ICsgdG1wNzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDQgPSBNVUxUSVBMWSh0bXA0LCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXA1ID0gTVVMVElQTFkodG1wNSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wNiA9IE1VTFRJUExZKHRtcDYsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDcgPSBNVUxUSVBMWSh0bXA3LCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICBkYXRhcHRyW0RDVFNJWkUqN10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA0ICsgejEgKyB6MywKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqM10gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA2ICsgejIgKyB6MywKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICBkYXRhcHRyW0RDVFNJWkUqMV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA3ICsgejEgKyB6NCwKKwkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKKyAgICAKKyAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JU0xPV19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGZsdC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0Zmx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4OGNlMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGZsdC5jCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogamlkY3RmbHQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmxvYXRpbmctcG9pbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQorICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBtb3JlIGFjY3VyYXRlIHRoYW4gZWl0aGVyIG9mIHRoZSBpbnRlZ2VyCisgKiBJRENUIGltcGxlbWVudGF0aW9ucy4gIEhvd2V2ZXIsIGl0IG1heSBub3QgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIG9uIGFsbAorICogbWFjaGluZXMgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiByb3VuZG9mZiBiZWhhdmlvci4gIFNwZWVkIHdpbGwgZGVwZW5kCisgKiBvbiB0aGUgaGFyZHdhcmUncyBmbG9hdGluZyBwb2ludCBjYXBhY2l0eS4KKyAqCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKKyAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKKyAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGEgZml4ZWQtcG9pbnQKKyAqIGltcGxlbWVudGF0aW9uLCBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiBzY2FsZWQgcXVhbnRpemF0aW9uIHZhbHVlcy4gIEhvd2V2ZXIsIHRoYXQgcHJvYmxlbSBkb2VzIG5vdCBhcmlzZSBpZgorICogd2UgdXNlIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogRGVxdWFudGl6ZSBhIGNvZWZmaWNpZW50IGJ5IG11bHRpcGx5aW5nIGl0IGJ5IHRoZSBtdWx0aXBsaWVyLXRhYmxlCisgKiBlbnRyeTsgcHJvZHVjZSBhIGZsb2F0IHJlc3VsdC4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKEZBU1RfRkxPQVQpIChjb2VmKSkgKiAocXVhbnR2YWwpKQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0X2Zsb2F0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgRkFTVF9GTE9BVCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBGQVNUX0ZMT0FUIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOworICBGQVNUX0ZMT0FUIHo1LCB6MTAsIHoxMSwgejEyLCB6MTM7CisgIEpDT0VGUFRSIGlucHRyOworICBGTE9BVF9NVUxUX1RZUEUgKiBxdWFudHB0cjsKKyAgRkFTVF9GTE9BVCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIEZBU1RfRkxPQVQgd29ya3NwYWNlW0RDVFNJWkUyXTsgLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoRkxPQVRfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEZBU1RfRkxPQVQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjJdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjNdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjRdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjVdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjZdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjddID0gZGN2YWw7CisgICAgICAKKyAgICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgICAgcXVhbnRwdHIrKzsKKyAgICAgIHdzcHRyKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAwID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKKyAgICB0bXAxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB0bXAyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKyAgICB0bXAzID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKworICAgIHRtcDEwID0gdG1wMCArIHRtcDI7CS8qIHBoYXNlIDMgKi8KKyAgICB0bXAxMSA9IHRtcDAgLSB0bXAyOworCisgICAgdG1wMTMgPSB0bXAxICsgdG1wMzsJLyogcGhhc2VzIDUtMyAqLworICAgIHRtcDEyID0gKHRtcDEgLSB0bXAzKSAqICgoRkFTVF9GTE9BVCkgMS40MTQyMTM1NjIpIC0gdG1wMTM7IC8qIDIqYzQgKi8KKworICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOwkvKiBwaGFzZSAyICovCisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisgICAgCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHRtcDQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIHRtcDUgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOworICAgIHRtcDYgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOworICAgIHRtcDcgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworCisgICAgejEzID0gdG1wNiArIHRtcDU7CQkvKiBwaGFzZSA2ICovCisgICAgejEwID0gdG1wNiAtIHRtcDU7CisgICAgejExID0gdG1wNCArIHRtcDc7CisgICAgejEyID0gdG1wNCAtIHRtcDc7CisKKyAgICB0bXA3ID0gejExICsgejEzOwkJLyogcGhhc2UgNSAqLworICAgIHRtcDExID0gKHoxMSAtIHoxMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSAoejEwICsgejEyKSAqICgoRkFTVF9GTE9BVCkgMS44NDc3NTkwNjUpOyAvKiAyKmMyICovCisgICAgdG1wMTAgPSAoKEZBU1RfRkxPQVQpIDEuMDgyMzkyMjAwKSAqIHoxMiAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9ICgoRkFTVF9GTE9BVCkgLTIuNjEzMTI1OTMwKSAqIHoxMCArIHo1OyAvKiAtMiooYzIrYzYpICovCisKKyAgICB0bXA2ID0gdG1wMTIgLSB0bXA3OwkvKiBwaGFzZSAyICovCisgICAgdG1wNSA9IHRtcDExIC0gdG1wNjsKKyAgICB0bXA0ID0gdG1wMTAgKyB0bXA1OworCisgICAgd3NwdHJbRENUU0laRSowXSA9IHRtcDAgKyB0bXA3OworICAgIHdzcHRyW0RDVFNJWkUqN10gPSB0bXAwIC0gdG1wNzsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gdG1wMSArIHRtcDY7CisgICAgd3NwdHJbRENUU0laRSo2XSA9IHRtcDEgLSB0bXA2OworICAgIHdzcHRyW0RDVFNJWkUqMl0gPSB0bXAyICsgdG1wNTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gdG1wMiAtIHRtcDU7CisgICAgd3NwdHJbRENUU0laRSo0XSA9IHRtcDMgKyB0bXA0OworICAgIHdzcHRyW0RDVFNJWkUqM10gPSB0bXAzIC0gdG1wNDsKKworICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgRENUU0laRTsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIFJvd3Mgb2YgemVyb2VzIGNhbiBiZSBleHBsb2l0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHdlIGRpZCB3aXRoIGNvbHVtbnMuCisgICAgICogSG93ZXZlciwgdGhlIGNvbHVtbiBjYWxjdWxhdGlvbiBoYXMgY3JlYXRlZCBtYW55IG5vbnplcm8gQUMgdGVybXMsIHNvCisgICAgICogdGhlIHNpbXBsaWZpY2F0aW9uIGFwcGxpZXMgbGVzcyBvZnRlbiAodHlwaWNhbGx5IDUlIHRvIDEwJSBvZiB0aGUgdGltZSkuCisgICAgICogQW5kIHRlc3RpbmcgZmxvYXRzIGZvciB6ZXJvIGlzIHJlbGF0aXZlbHkgZXhwZW5zaXZlLCBzbyB3ZSBkb24ndCBib3RoZXIuCisgICAgICovCisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisKKyAgICB0bXAxMCA9IHdzcHRyWzBdICsgd3NwdHJbNF07CisgICAgdG1wMTEgPSB3c3B0clswXSAtIHdzcHRyWzRdOworCisgICAgdG1wMTMgPSB3c3B0clsyXSArIHdzcHRyWzZdOworICAgIHRtcDEyID0gKHdzcHRyWzJdIC0gd3NwdHJbNl0pICogKChGQVNUX0ZMT0FUKSAxLjQxNDIxMzU2MikgLSB0bXAxMzsKKworICAgIHRtcDAgPSB0bXAxMCArIHRtcDEzOworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworCisgICAgLyogT2RkIHBhcnQgKi8KKworICAgIHoxMyA9IHdzcHRyWzVdICsgd3NwdHJbM107CisgICAgejEwID0gd3NwdHJbNV0gLSB3c3B0clszXTsKKyAgICB6MTEgPSB3c3B0clsxXSArIHdzcHRyWzddOworICAgIHoxMiA9IHdzcHRyWzFdIC0gd3NwdHJbN107CisKKyAgICB0bXA3ID0gejExICsgejEzOworICAgIHRtcDExID0gKHoxMSAtIHoxMykgKiAoKEZBU1RfRkxPQVQpIDEuNDE0MjEzNTYyKTsKKworICAgIHo1ID0gKHoxMCArIHoxMikgKiAoKEZBU1RfRkxPQVQpIDEuODQ3NzU5MDY1KTsgLyogMipjMiAqLworICAgIHRtcDEwID0gKChGQVNUX0ZMT0FUKSAxLjA4MjM5MjIwMCkgKiB6MTIgLSB6NTsgLyogMiooYzItYzYpICovCisgICAgdG1wMTIgPSAoKEZBU1RfRkxPQVQpIC0yLjYxMzEyNTkzMCkgKiB6MTAgKyB6NTsgLyogLTIqKGMyK2M2KSAqLworCisgICAgdG1wNiA9IHRtcDEyIC0gdG1wNzsKKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMCArIHRtcDcpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzddID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAwIC0gdG1wNyksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDEgKyB0bXA2KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMSAtIHRtcDYpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAyICsgdG1wNSksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgKHRtcDIgLSB0bXA1KSwgMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSAodG1wMyArIHRtcDQpLCAzKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpICh0bXAzIC0gdG1wNCksIDMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICAKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGZzdC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0ZnN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhNDIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGZzdC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogamlkY3Rmc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQorICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KKyAqCisgKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCisgKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKKyAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKKyAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCisgKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgorICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCisgKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQorICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCisgKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKKyAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKKyAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKKyAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgorICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKKyAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCisgKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCisgKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAorICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCisgKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCisgKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07CisgKiBzZWUgamlkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKKyAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCisgKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgorICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCisgKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKKyAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCisgKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCisgKgorICogVGhlIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgbm90IGludGVnZXJzIGJlY2F1c2UgdGhlIEFBJk4gc2NhbGluZworICogZmFjdG9ycyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkLiAgV2UgcmVwcmVzZW50IHRoZW0gc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMsCisgKiBzbyB0aGF0IHRoZSBmaXJzdCBhbmQgc2Vjb25kIElEQ1Qgcm91bmRzIGhhdmUgdGhlIHNhbWUgaW5wdXQgc2NhbGluZy4KKyAqIEZvciA4LWJpdCBKU0FNUExFcywgd2UgY2hvb3NlIElGQVNUX1NDQUxFX0JJVFMgPSBQQVNTMV9CSVRTIHNvIGFzIHRvCisgKiBhdm9pZCBhIGRlc2NhbGluZyBzaGlmdDsgdGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSByYXRoZXIgZHJhc3RpY2FsbHkKKyAqIGZvciBzbWFsbCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIHNoaWZ0cy4KKyAqIEZvciAxMi1iaXQgSlNBTVBMRXMsIHRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyAxNngxNiBtdWx0aXBsaWVzIGFueXdheSwKKyAqIHNvIHdlIHVzZSBhIG11Y2ggbGFyZ2VyIHNjYWxpbmcgZmFjdG9yIHRvIHByZXNlcnZlIGFjY3VyYWN5LgorICoKKyAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5CisgKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCisgKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKKyAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgQ09OU1RfQklUUyAgOAorI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICA4CisjZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCisjZW5kaWYKKworLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCisgKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KKyAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCisgKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCisgKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQorICovCisKKyNpZiBDT05TVF9CSVRTID09IDgKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICAoKElOVDMyKSAgMjc3KQkJLyogRklYKDEuMDgyMzkyMjAwKSAqLworI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgICgoSU5UMzIpICAzNjIpCQkvKiBGSVgoMS40MTQyMTM1NjIpICovCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDQ3MykJCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICAoKElOVDMyKSAgNjY5KQkJLyogRklYKDIuNjEzMTI1OTMwKSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICBGSVgoMS4wODIzOTIyMDApCisjZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgRklYKDEuNDE0MjEzNTYyKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICBGSVgoMi42MTMxMjU5MzApCisjZW5kaWYKKworCisvKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAorICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKKyAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KKyAqLworCisjaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORworI3VuZGVmIERFU0NBTEUKKyNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQorI2VuZGlmCisKKworLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKKyAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KKyAqLworCisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYSBEQ1RFTEVNIHJlc3VsdC4gIEZvciA4LWJpdCBkYXRhIGEgMTZ4MTYtPjE2CisgKiBtdWx0aXBsaWNhdGlvbiB3aWxsIGRvLiAgRm9yIDEyLWJpdCBkYXRhLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcworICogZGVjbGFyZWQgSU5UMzIsIHNvIGEgMzItYml0IG11bHRpcGx5IHdpbGwgYmUgdXNlZC4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKKyNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSUZBU1RfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKKyNlbHNlCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgIFwKKwlERVNDQUxFKChjb2VmKSoocXVhbnR2YWwpLCBJRkFTVF9TQ0FMRV9CSVRTLVBBU1MxX0JJVFMpCisjZW5kaWYKKworCisvKiBMaWtlIERFU0NBTEUsIGJ1dCBhcHBsaWVzIHRvIGEgRENURUxFTSBhbmQgcHJvZHVjZXMgYW4gaW50LgorICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBJU0hJRlRfVEVNUFMJRENURUxFTSBpc2hpZnRfdGVtcDsKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBEQ1RFTEVNQklUUyAgMTYJCS8qIERDVEVMRU0gbWF5IGJlIDE2IG9yIDMyIGJpdHMgKi8KKyNlbHNlCisjZGVmaW5lIERDVEVMRU1CSVRTICAzMgkJLyogRENURUxFTSBtdXN0IGJlIDMyIGJpdHMgKi8KKyNlbmRpZgorI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAorICAgICgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKKyAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKERDVEVMRU0pIDApKSA8PCAoRENURUxFTUJJVFMtKHNoZnQpKSkgOiBcCisgICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgSVNISUZUX1RFTVBTCisjZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQorI2VuZGlmCisKKyNpZmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKKyNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCgoeCkgKyAoMSA8PCAoKG4pLTEpKSwgbikpCisjZWxzZQorI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKHgsIG4pKQorI2VuZGlmCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaWZhc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7CisgIERDVEVMRU0gejUsIHoxMCwgejExLCB6MTIsIHoxMzsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCQkJLyogZm9yIERFU0NBTEUgKi8KKyAgSVNISUZUX1RFTVBTCQkJLyogZm9yIElERVNDQUxFICovCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IChpbnQpIERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisKKyAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKKyAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKKyAgICAgIAorICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBxdWFudHB0cisrOworICAgICAgd3NwdHIrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKworICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOworICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOworCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLworICAgIHRtcDExID0gdG1wMCAtIHRtcDI7CisKKyAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCisgICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCisKKyAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLworICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOworICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOworICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisKKyAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKKyAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKKyAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKKworICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLworICAgIHoxMCA9IHRtcDYgLSB0bXA1OworICAgIHoxMSA9IHRtcDQgKyB0bXA3OworICAgIHoxMiA9IHRtcDQgLSB0bXA3OworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgKHRtcDMgKyB0bXA0KTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgKHRtcDMgLSB0bXA0KTsKKworICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLworICAgIHF1YW50cHRyKys7CisgICAgd3NwdHIrKzsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KKyAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCisgIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KKworICB3c3B0ciA9IHdvcmtzcGFjZTsKKyAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgeworICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KKyAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KKyAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KKyAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQorICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KKyAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KKyAgICAgKi8KKyAgICAKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCisJd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbSURFU0NBTEUod3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworCisgICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsKKyAgICB0bXAxMSA9ICgoRENURUxFTSkgd3NwdHJbMF0gLSAoRENURUxFTSkgd3NwdHJbNF0pOworCisgICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsKKyAgICB0bXAxMiA9IE1VTFRJUExZKChEQ1RFTEVNKSB3c3B0clsyXSAtIChEQ1RFTEVNKSB3c3B0cls2XSwgRklYXzFfNDE0MjEzNTYyKQorCSAgICAtIHRtcDEzOworCisgICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7CisgICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7CisgICAgdG1wMSA9IHRtcDExICsgdG1wMTI7CisgICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7CisKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEzID0gKERDVEVMRU0pIHdzcHRyWzVdICsgKERDVEVMRU0pIHdzcHRyWzNdOworICAgIHoxMCA9IChEQ1RFTEVNKSB3c3B0cls1XSAtIChEQ1RFTEVNKSB3c3B0clszXTsKKyAgICB6MTEgPSAoRENURUxFTSkgd3NwdHJbMV0gKyAoRENURUxFTSkgd3NwdHJbN107CisgICAgejEyID0gKERDVEVMRU0pIHdzcHRyWzFdIC0gKERDVEVMRU0pIHdzcHRyWzddOworCisgICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KKyAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLworCisgICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KKyAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KKyAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KKworICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KKyAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OworICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7CisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KKworICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgKyB0bXA3LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSArIHRtcDYsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgLSB0bXA2LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyICsgdG1wNSwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgKyB0bXA0LCBQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisKKyAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KK30KKworI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGludC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0aW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyYjMyMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaWRjdGludC5jCkBAIC0wLDAgKzEsMzg5IEBACisvKgorICogamlkY3RpbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgc2xvdy1idXQtYWNjdXJhdGUgaW50ZWdlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAqIGludmVyc2UgRENUIChEaXNjcmV0ZSBDb3NpbmUgVHJhbnNmb3JtKS4gIEluIHRoZSBJSkcgY29kZSwgdGhpcyByb3V0aW5lCisgKiBtdXN0IGFsc28gcGVyZm9ybSBkZXF1YW50aXphdGlvbiBvZiB0aGUgaW5wdXQgY29lZmZpY2llbnRzLgorICoKKyAqIEEgMi1EIElEQ1QgY2FuIGJlIGRvbmUgYnkgMS1EIElEQ1Qgb24gZWFjaCBjb2x1bW4gZm9sbG93ZWQgYnkgMS1EIElEQ1QKKyAqIG9uIGVhY2ggcm93IChvciB2aWNlIHZlcnNhLCBidXQgaXQncyBtb3JlIGNvbnZlbmllbnQgdG8gZW1pdCBhIHJvdyBhdAorICogYSB0aW1lKS4gIERpcmVjdCBhbGdvcml0aG1zIGFyZSBhbHNvIGF2YWlsYWJsZSwgYnV0IHRoZXkgYXJlIG11Y2ggbW9yZQorICogY29tcGxleCBhbmQgc2VlbSBub3QgdG8gYmUgYW55IGZhc3RlciB3aGVuIHJlZHVjZWQgdG8gY29kZS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGFuIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKyAqICAgQy4gTG9lZmZsZXIsIEEuIExpZ3RlbmJlcmcgYW5kIEcuIE1vc2NoeXR6LCAiUHJhY3RpY2FsIEZhc3QgMS1EIERDVAorICogICBBbGdvcml0aG1zIHdpdGggMTEgTXVsdGlwbGljYXRpb25zIiwgUHJvYy4gSW50J2wuIENvbmYuIG9uIEFjb3VzdGljcywKKyAqICAgU3BlZWNoLCBhbmQgU2lnbmFsIFByb2Nlc3NpbmcgMTk4OSAoSUNBU1NQICc4OSksIHBwLiA5ODgtOTkxLgorICogVGhlIHByaW1hcnkgYWxnb3JpdGhtIGRlc2NyaWJlZCB0aGVyZSB1c2VzIDExIG11bHRpcGxpZXMgYW5kIDI5IGFkZHMuCisgKiBXZSB1c2UgdGhlaXIgYWx0ZXJuYXRlIG1ldGhvZCB3aXRoIDEyIG11bHRpcGxpZXMgYW5kIDMyIGFkZHMuCisgKiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgbWV0aG9kIGlzIHRoYXQgbm8gZGF0YSBwYXRoIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUKKyAqIG11bHRpcGxpY2F0aW9uOyB0aGlzIGFsbG93cyBhIHZlcnkgc2ltcGxlIGFuZCBhY2N1cmF0ZSBpbXBsZW1lbnRhdGlvbiBpbgorICogc2NhbGVkIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsIHdpdGggYSBtaW5pbWFsIG51bWJlciBvZiBzaGlmdHMuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCisKKyNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgorICovCisKKyNpZiBEQ1RTSVpFICE9IDgKKyAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLworI2VuZGlmCisKKworLyoKKyAqIFRoZSBwb29wIG9uIHRoaXMgc2NhbGluZyBzdHVmZiBpcyBhcyBmb2xsb3dzOgorICoKKyAqIEVhY2ggMS1EIElEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCisgKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBJRENUIG91dHB1dHMuICBUaGUgZmluYWwgb3V0cHV0cyBhcmUgdGhlcmVmb3JlCisgKiBhIGZhY3RvciBvZiBOIGxhcmdlciB0aGFuIGRlc2lyZWQ7IHNpbmNlIE49OCB0aGlzIGNhbiBiZSBjdXJlZCBieQorICogYSBzaW1wbGUgcmlnaHQgc2hpZnQgYXQgdGhlIGVuZCBvZiB0aGUgYWxnb3JpdGhtLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IHdlIHNhdmUgdHdvIG11bHRpcGxpY2F0aW9ucyBwZXIgMS1EIElEQ1QsCisgKiBiZWNhdXNlIHRoZSB5MCBhbmQgeTQgaW5wdXRzIG5lZWQgbm90IGJlIGRpdmlkZWQgYnkgc3FydChOKS4KKyAqCisgKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCisgKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCisgKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKKyAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCisgKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQorICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCisgKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCisgKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKKyAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKKyAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCisgKgorICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAorICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cworICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAorICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChUbyBzY2FsZSB1cCAxMi1iaXQgc2FtcGxlIGRhdGEgZnVydGhlciwgYW4KKyAqIGludGVybWVkaWF0ZSBJTlQzMiBhcnJheSB3b3VsZCBiZSBuZWVkZWQuKQorICoKKyAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0CisgKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKKyAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KKyNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLworI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KKyNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLworI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLworI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLworI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLworI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLworI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLworI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLworI2Vsc2UKKyNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCisjZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQorI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKKyNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKKyNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCisjZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQorI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKKyNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0CisgKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfaXNsb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQoreworICBJTlQzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICBJTlQzMiB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMzsKKyAgSU5UMzIgejEsIHoyLCB6MywgejQsIHo1OworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRTJdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KKyAgU0hJRlRfVEVNUFMKKworICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCisgIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIElEQ1Q7ICovCisgIC8qIGZ1cnRoZXJtb3JlLCB3ZSBzY2FsZSB0aGUgcmVzdWx0cyBieSAyKipQQVNTMV9CSVRTLiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKKyAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0CisgICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKKyAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAorICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKKyAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KKyAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCisgICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCisgICAgICovCisgICAgCisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCisJaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo0XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo1XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo2XSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSo3XSA9IGRjdmFsOworICAgICAgCisgICAgICBpbnB0cisrOwkJCS8qIGFkdmFuY2UgcG9pbnRlcnMgdG8gbmV4dCBjb2x1bW4gKi8KKyAgICAgIHF1YW50cHRyKys7CisgICAgICB3c3B0cisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjRdLCBxdWFudHB0cltEQ1RTSVpFKjRdKTsKKworICAgIHRtcDAgPSAoejIgKyB6MykgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKHoyIC0gejMpIDw8IENPTlNUX0JJVFM7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKKyAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOworICAgIHRtcDExID0gdG1wMSArIHRtcDI7CisgICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKKyAgICAKKyAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDg7IHRoZSBtYXRyaXggaXMgdW5pdGFyeSBhbmQgaGVuY2UgaXRzCisgICAgICogdHJhbnNwb3NlIGlzIGl0cyBpbnZlcnNlLiAgaTAuLmkzIGFyZSB5Nyx5NSx5Myx5MSByZXNwZWN0aXZlbHkuCisgICAgICovCisgICAgCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo3XSwgcXVhbnRwdHJbRENUU0laRSo3XSk7CisgICAgdG1wMSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7CisgICAgdG1wMiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgCisgICAgejEgPSB0bXAwICsgdG1wMzsKKyAgICB6MiA9IHRtcDEgKyB0bXAyOworICAgIHozID0gdG1wMCArIHRtcDI7CisgICAgejQgPSB0bXAxICsgdG1wMzsKKyAgICB6NSA9IE1VTFRJUExZKHozICsgejQsIEZJWF8xXzE3NTg3NTYwMik7IC8qIHNxcnQoMikgKiBjMyAqLworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh0bXAwLCBGSVhfMF8yOTg2MzEzMzYpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNS1jNykgKi8KKyAgICB0bXAxID0gTVVMVElQTFkodG1wMSwgRklYXzJfMDUzMTE5ODY5KTsgLyogc3FydCgyKSAqICggYzErYzMtYzUrYzcpICovCisgICAgdG1wMiA9IE1VTFRJUExZKHRtcDIsIEZJWF8zXzA3MjcxMTAyNik7IC8qIHNxcnQoMikgKiAoIGMxK2MzK2M1LWM3KSAqLworICAgIHRtcDMgPSBNVUxUSVBMWSh0bXAzLCBGSVhfMV81MDEzMjExMTApOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IE1VTFRJUExZKHoxLCAtIEZJWF8wXzg5OTk3NjIyMyk7IC8qIHNxcnQoMikgKiAoYzctYzMpICovCisgICAgejIgPSBNVUxUSVBMWSh6MiwgLSBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKC1jMS1jMykgKi8KKyAgICB6MyA9IE1VTFRJUExZKHozLCAtIEZJWF8xXzk2MTU3MDU2MCk7IC8qIHNxcnQoMikgKiAoLWMzLWM1KSAqLworICAgIHo0ID0gTVVMVElQTFkoejQsIC0gRklYXzBfMzkwMTgwNjQ0KTsgLyogc3FydCgyKSAqIChjNS1jMykgKi8KKyAgICAKKyAgICB6MyArPSB6NTsKKyAgICB6NCArPSB6NTsKKyAgICAKKyAgICB0bXAwICs9IHoxICsgejM7CisgICAgdG1wMSArPSB6MiArIHo0OworICAgIHRtcDIgKz0gejIgKyB6MzsKKyAgICB0bXAzICs9IHoxICsgejQ7CisgICAgCisgICAgLyogRmluYWwgb3V0cHV0IHN0YWdlOiBpbnB1dHMgYXJlIHRtcDEwLi50bXAxMywgdG1wMC4udG1wMyAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqNl0gPSAoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDEsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgd3NwdHJbRENUU0laRSo1XSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOworICAgIHdzcHRyW0RDVFNJWkUqM10gPSAoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKKyAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgREVTQ0FMRSh0bXAxMyAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7CisgICAgCisgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgcXVhbnRwdHIrKzsKKyAgICB3c3B0cisrOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3Mgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworICAvKiBOb3RlIHRoYXQgd2UgbXVzdCBkZXNjYWxlIHRoZSByZXN1bHRzIGJ5IGEgZmFjdG9yIG9mIDggPT0gMioqMywgKi8KKyAgLyogYW5kIGFsc28gdW5kbyB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBSb3dzIG9mIHplcm9lcyBjYW4gYmUgZXhwbG9pdGVkIGluIHRoZSBzYW1lIHdheSBhcyB3ZSBkaWQgd2l0aCBjb2x1bW5zLgorICAgICAqIEhvd2V2ZXIsIHRoZSBjb2x1bW4gY2FsY3VsYXRpb24gaGFzIGNyZWF0ZWQgbWFueSBub256ZXJvIEFDIHRlcm1zLCBzbworICAgICAqIHRoZSBzaW1wbGlmaWNhdGlvbiBhcHBsaWVzIGxlc3Mgb2Z0ZW4gKHR5cGljYWxseSA1JSB0byAxMCUgb2YgdGhlIHRpbWUpLgorICAgICAqIE9uIG1hY2hpbmVzIHdpdGggdmVyeSBmYXN0IG11bHRpcGxpY2F0aW9uLCBpdCdzIHBvc3NpYmxlIHRoYXQgdGhlCisgICAgICogdGVzdCB0YWtlcyBtb3JlIHRpbWUgdGhhbiBpdCdzIHdvcnRoLiAgSW4gdGhhdCBjYXNlIHRoaXMgc2VjdGlvbgorICAgICAqIG1heSBiZSBjb21tZW50ZWQgb3V0LgorICAgICAqLworICAgIAorI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbMl0gPT0gMCAmJiB3c3B0clszXSA9PSAwICYmIHdzcHRyWzRdID09IDAgJiYKKwl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgeworICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KKyAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKKwkJCQkgICYgUkFOR0VfTUFTS107CisgICAgICAKKyAgICAgIG91dHB0clswXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzFdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clszXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzRdID0gZGN2YWw7CisgICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0cls2XSA9IGRjdmFsOworICAgICAgb3V0cHRyWzddID0gZGN2YWw7CisKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydDogcmV2ZXJzZSB0aGUgZXZlbiBwYXJ0IG9mIHRoZSBmb3J3YXJkIERDVC4gKi8KKyAgICAvKiBUaGUgcm90YXRvciBpcyBzcXJ0KDIpKmMoLTYpLiAqLworICAgIAorICAgIHoyID0gKElOVDMyKSB3c3B0clsyXTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbNl07CisgICAgCisgICAgejEgPSBNVUxUSVBMWSh6MiArIHozLCBGSVhfMF81NDExOTYxMDApOworICAgIHRtcDIgPSB6MSArIE1VTFRJUExZKHozLCAtIEZJWF8xXzg0Nzc1OTA2NSk7CisgICAgdG1wMyA9IHoxICsgTVVMVElQTFkoejIsIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMCA9ICgoSU5UMzIpIHdzcHRyWzBdICsgKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKKyAgICB0bXAxID0gKChJTlQzMikgd3NwdHJbMF0gLSAoSU5UMzIpIHdzcHRyWzRdKSA8PCBDT05TVF9CSVRTOworICAgIAorICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CisgICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKKyAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOworICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7CisgICAgCisgICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cworICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgorICAgICAqLworICAgIAorICAgIHRtcDAgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHRtcDEgPSAoSU5UMzIpIHdzcHRyWzVdOworICAgIHRtcDIgPSAoSU5UMzIpIHdzcHRyWzNdOworICAgIHRtcDMgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIAorICAgIHoxID0gdG1wMCArIHRtcDM7CisgICAgejIgPSB0bXAxICsgdG1wMjsKKyAgICB6MyA9IHRtcDAgKyB0bXAyOworICAgIHo0ID0gdG1wMSArIHRtcDM7CisgICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KKyAgICAKKyAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCisgICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLworICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KKyAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCisgICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLworICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCisgICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KKyAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCisgICAgCisgICAgejMgKz0gejU7CisgICAgejQgKz0gejU7CisgICAgCisgICAgdG1wMCArPSB6MSArIHozOworICAgIHRtcDEgKz0gejIgKyB6NDsKKyAgICB0bXAyICs9IHoyICsgejM7CisgICAgdG1wMyArPSB6MSArIHo0OworICAgIAorICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMywKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls3XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSArIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbNl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDExIC0gdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsyXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDEsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzICsgdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKyNlbmRpZiAvKiBEQ1RfSVNMT1dfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamlkY3RpbnRlbHNzZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0aW50ZWxzc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjVjOTNiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0aW50ZWxzc2UuYwpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLworCisjaWZkZWYgQU5EUk9JRF9JTlRFTFNTRTJfSURDVAorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjaWYgRENUU0laRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisjZGVmaW5lIEJJVFNfSU5WX0FDQyA0CisjZGVmaW5lIFNISUZUX0lOVl9ST1cgMTIKKyNkZWZpbmUgU0hJRlRfSU5WX0NPTCA1Citjb25zdCBzaG9ydCBSTkRfSU5WX1JPVyA9IDIwNDg7Citjb25zdCBzaG9ydCBSTkRfSU5WX0NPTCA9IDE2OworY29uc3Qgc2hvcnQgUk5EX0lOVl9DT1JSID0gMTU7CisKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X29uZV9jb3JyWzhdID0gezEsMSwxLDEsMSwxLDEsMX07CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF9yb3VuZF9pbnZfcm93WzhdID0gezIwNDgsMCwyMDQ4LDAsMjA0OCwwLDIwNDgsMH07CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF9yb3VuZF9pbnZfY29sWzhdID0gezE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2fTsKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X3JvdW5kX2ludl9jb3JyWzhdID0gezE1LDE1LDE1LDE1LDE1LDE1LDE1LDE1fTsKKworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGdfMV8xNls4XSA9IHsxMzAzNiwgMTMwMzYsIDEzMDM2LCAxMzAzNiwgMTMwMzYsIDEzMDM2LCAxMzAzNiwgMTMwMzZ9Oworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGdfMl8xNls4XSA9IHsyNzE0NiwgMjcxNDYsIDI3MTQ2LCAyNzE0NiwgMjcxNDYsIDI3MTQ2LCAyNzE0NiwgMjcxNDZ9Oworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGdfM18xNls4XSA9IHstMjE3NDYsIC0yMTc0NiwgLTIxNzQ2LCAtMjE3NDYsIC0yMTc0NiwgLTIxNzQ2LCAtMjE3NDYsIC0yMTc0Nn07CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF9jb3NfNF8xNls4XSA9IHstMTkxOTUsIC0xOTE5NSwgLTE5MTk1LCAtMTkxOTUsIC0xOTE5NSwgLTE5MTk1LCAtMTkxOTUsIC0xOTE5NX07CisKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBqcGVnX2FkanVzdFs4XSA9IHsxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH07CisKKy8vIFRhYmxlIGZvciByb3dzIDAsNAorc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGFiX2lfMDRbMzJdID0geworMTYzODQsIDIxNDA3LCAxNjM4NCwgODg2NywKKzE2Mzg0LCAtODg2NywgMTYzODQsIC0yMTQwNywKKzE2Mzg0LCA4ODY3LCAtMTYzODQsIC0yMTQwNywKKy0xNjM4NCwgMjE0MDcsIDE2Mzg0LCAtODg2NywKKzIyNzI1LCAxOTI2NiwgMTkyNjYsIC00NTIwLAorMTI4NzMsIC0yMjcyNSwgNDUyMCwgLTEyODczLAorMTI4NzMsIDQ1MjAsIC0yMjcyNSwgLTEyODczLAorNDUyMCwgMTkyNjYsIDE5MjY2LCAtMjI3MjUKK307CisKKy8vIFRhYmxlIGZvciByb3dzIDEsNworc3RhdGljIGNvbnN0IHNob3J0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIE0xMjhfdGFiX2lfMTdbMzJdID0geworMjI3MjUsIDI5NjkyLCAyMjcyNSwgMTIyOTksCisyMjcyNSwgLTEyMjk5LCAyMjcyNSwgLTI5NjkyLAorMjI3MjUsIDEyMjk5LCAtMjI3MjUsIC0yOTY5MiwKKy0yMjcyNSwgMjk2OTIsIDIyNzI1LCAtMTIyOTksCiszMTUyMSwgMjY3MjIsIDI2NzIyLCAtNjI3MCwKKzE3ODU1LCAtMzE1MjEsIDYyNzAsIC0xNzg1NSwKKzE3ODU1LCA2MjcwLCAtMzE1MjEsIC0xNzg1NSwKKzYyNzAsIDI2NzIyLCAyNjcyMiwgLTMxNTIxCit9OworCisvLyBUYWJsZSBmb3Igcm93cyAyLDYKK3N0YXRpYyBjb25zdCBzaG9ydCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKSBNMTI4X3RhYl9pXzI2WzMyXSA9IHsKKzIxNDA3LCAyNzk2OSwgMjE0MDcsIDExNTg1LAorMjE0MDcsIC0xMTU4NSwgMjE0MDcsIC0yNzk2OSwKKzIxNDA3LCAxMTU4NSwgLTIxNDA3LCAtMjc5NjksCistMjE0MDcsIDI3OTY5LCAyMTQwNywgLTExNTg1LAorMjk2OTIsIDI1MTcyLCAyNTE3MiwgLTU5MDYsCisxNjgxOSwgLTI5NjkyLCA1OTA2LCAtMTY4MTksCisxNjgxOSwgNTkwNiwgLTI5NjkyLCAtMTY4MTksCis1OTA2LCAyNTE3MiwgMjUxNzIsIC0yOTY5MgorfTsKKworLy8gVGFibGUgZm9yIHJvd3MgMyw1CitzdGF0aWMgY29uc3Qgc2hvcnQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSkgTTEyOF90YWJfaV8zNVszMl0gPSB7CisxOTI2NiwgMjUxNzIsIDE5MjY2LCAxMDQyNiwKKzE5MjY2LCAtMTA0MjYsIDE5MjY2LCAtMjUxNzIsCisxOTI2NiwgMTA0MjYsIC0xOTI2NiwgLTI1MTcyLAorLTE5MjY2LCAyNTE3MiwgMTkyNjYsIC0xMDQyNiwKKzI2NzIyLCAyMjY1NCwgMjI2NTQsIC01MzE1LAorMTUxMzcsIC0yNjcyMiwgNTMxNSwgLTE1MTM3LAorMTUxMzcsIDUzMTUsIC0yNjcyMiwgLTE1MTM3LAorNTMxNSwgMjI2NTQsIDIyNjU0LCAtMjY3MjIKK307CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMgYnkgU1NFLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19pZGN0X2ludGVsc3NlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCisJCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgX19tMTI4aSByb3cwLCB0bXAxLCB0bXAyLCB0bXAzLCByb3cyLCB0bXA1LCB0bXA2LCB0bXA3OworICBpbnQgY3RyOworICBKU0FNUFJPVyAgb3V0cHRyVGVtcDsKKyAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKKyAgc2hvcnQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSBxdWFudHB0clNTRVtEQ1RTSVpFMl07CisgIHNob3J0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgd29ya3NwYWNlU1NFW0RDVFNJWkUyXTsKKyAgc2hvcnQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKSBjb2VmX2Jsb2NrU1NFW0RDVFNJWkUyXTsKKyAgX19tMTI4aSB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDc7CisgIF9fbTEyOGkqIHRnMywgKnRnMSwgKnRnMiwgKmNvczQ7CisgIF9fbTEyOGkgdG03NjUsIHRwNzY1LCB0bTQ2NSwgdHA0NjUsIHRwMDMsIHRtMDMsIHRwMTIsIHRtMTIsIHRwNjUsIHRtNjU7CisgIF9fbTEyOGkgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3OworICBfX20xMjhpIHRlbXAsIHRlbXAyOworICBzaG9ydCAqIHdzcHRyOworICB1bnNpZ25lZCBjaGFyICogb3V0cHRyOworCisjZGVmaW5lIGlEQ1RfOF8yUk9Xcyh0YWJsZTEsIHRhYmxlMikgICBcCisgICAgcm93MCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYocm93MCwgMHhEOCk7IC8qeDcsIHg2LCB4NSwgeDQsIHgzLCB4MSwgeDIsIHgwKi8gICAgXAorICAgIHJvdzIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KHJvdzIsIDB4RDgpOyAgIFwKKyAgICB0bXAxID0gX21tX3NodWZmbGVfZXBpMzIocm93MCwgMCk7ICAgICAgLyp4MiwgeDAsIHgyLCB4MCwgeDIsIHgwLCB4MiwgeDAqLyAgICBcCisgICAgdG1wNSA9IF9tbV9zaHVmZmxlX2VwaTMyKHJvdzIsIDApOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAzID0gX21tX3NodWZmbGVfZXBpMzIocm93MCwgMHg1NSk7ICAgLyp4MywgeDEsIHgzLCB4MSwgeDMsIHgxLCB4MywgeDEqLyAgICBcCisgICAgdG1wNyA9IF9tbV9zaHVmZmxlX2VwaTMyKHJvdzIsIDB4NTUpOyAgICAgXAorICAgIHJvdzAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KHJvdzAsIDB4RDgpOyAvKng3LCB4NSwgeDYsIHg0LCB4MywgeDEsIHgyLCB4MCovICAgIFwKKyAgICByb3cyID0gX21tX3NodWZmbGVoaV9lcGkxNihyb3cyLCAweEQ4KTsgICBcCisJCQkJCQlcCisgICAgdG1wMSA9IF9tbV9tYWRkX2VwaTE2KHRtcDEsICogKCBfX20xMjhpKil0YWJsZTEpOyAgICAgIC8qeDIqdzEzK3gwKncxMiwgeDIqdzkreDAqdzgsIHgyKnc1K3gwKnc0LCB4Mip3MSt4MCp3MCovICAgXAorICAgIHRtcDUgPSBfbW1fbWFkZF9lcGkxNih0bXA1LCAqICggX19tMTI4aSopdGFibGUyKTsgICAgICAgXAorCQkJCQkJXAorICAgIHRtcDIgPSAgX21tX3NodWZmbGVfZXBpMzIocm93MCwgMHhBQSk7ICAvKng2LCB4NCwgeDYsIHg0LCB4NiwgeDQsIHg2LCB4NCovICAgIFwKKyAgICB0bXA2ID0gX21tX3NodWZmbGVfZXBpMzIocm93MiwgMHhBQSk7ICAgICBcCisgICAgcm93MCA9IF9tbV9zaHVmZmxlX2VwaTMyKHJvdzAsIDB4RkYpOyAgIC8qeDcsIHg1LCB4NywgeDUsIHg3LCB4NSwgeDcsIHg1Ki8gICAgXAorICAgIHJvdzIgPSBfbW1fc2h1ZmZsZV9lcGkzMihyb3cyLCAweEZGKTsgICAgIFwKK1wKKyAgICB0bXAzID0gX21tX21hZGRfZXBpMTYodG1wMywgKiAoIF9fbTEyOGkqKSh0YWJsZTErMTYpKTsgLyp4Myp3MjkreDEqdzI4LCB4Myp3MjUreDEqdzI0LCB4Myp3MjEreDEqdzIwLCB4Myp3MTcreDEqdzE2Ki8gIFwKKyAgICB0bXA3ID0gX21tX21hZGRfZXBpMTYodG1wNywgKiAoIF9fbTEyOGkqKSh0YWJsZTIrMTYpICk7IFwKKyAgICByb3cwID0gX21tX21hZGRfZXBpMTYocm93MCwgKiAoIF9fbTEyOGkqKSh0YWJsZTErMjQpKTsgLyp4Nyp3MzEreDUqdzMwLCB4Nyp3MjcreDUqdzI2LCB4Nyp3MjMreDUqdzIyLCB4Nyp3MTkreDUqdzE4Ki8gIFwKKyAgICByb3cyID0gX21tX21hZGRfZXBpMTYocm93MiwgKiAoIF9fbTEyOGkqKSh0YWJsZTIrMjQpICk7IFwKKyAgICB0bXAyID0gX21tX21hZGRfZXBpMTYodG1wMiwgKiAoIF9fbTEyOGkqKSh0YWJsZTErOCkgKTsgLyp4Nip3MTUreDQqdzE0LCB4Nip3MTEreDQqdzEwLCB4Nip3Nyt4NCp3NiwgeDYqdzMreDQqdzIqLyAgXAorICAgIHRtcDYgPSBfbW1fbWFkZF9lcGkxNih0bXA2LCAqICggX19tMTI4aSopKHRhYmxlMis4KSApOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAxID0gX21tX2FkZF9lcGkzMih0bXAxLCAqICggX19tMTI4aSopTTEyOF9yb3VuZF9pbnZfcm93KTsgICAgICAgXAorICAgIHRtcDUgPSBfbW1fYWRkX2VwaTMyKHRtcDUsICogKCBfX20xMjhpKilNMTI4X3JvdW5kX2ludl9yb3cpOyAgICAgIFwKKyAgICByb3cwID0gX21tX2FkZF9lcGkzMihyb3cwLCB0bXAzKTsgICAgLypiMywgYjIsIGIxLCBiMCovICBcCisgICAgcm93MiA9IF9tbV9hZGRfZXBpMzIocm93MiwgdG1wNyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMSA9IF9tbV9hZGRfZXBpMzIodG1wMSwgdG1wMik7ICAgIC8qYTMsIGEyLCBhMSwgYTAqLyAgXAorICAgIHRtcDUgPSBfbW1fYWRkX2VwaTMyKHRtcDUsIHRtcDYpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAyID0gdG1wMTsgIFwKKyAgICB0bXA2ID0gdG1wNTsgIFwKKyAgICB0bXAyID0gX21tX3N1Yl9lcGkzMih0bXAyLCByb3cwKTsgLypmb3Igcm93MC4geTQ9IGEzLWIzLCB5NT1hMi1iMiwgeTY9YTEtYjEsIHk3PWEwLWIwICovICAgXAorICAgIHRtcDYgPSBfbW1fc3ViX2VwaTMyKHRtcDYsIHJvdzIpOyAgXAorICAgIHJvdzAgPSBfbW1fYWRkX2VwaTMyKHJvdzAsIHRtcDEpOyAvKnkzPWEzK2IzLHkyPWEyK2IyLHkxPWExK2IxLHkwPWEwK2IwKi8gICBcCisgICAgcm93MiA9IF9tbV9hZGRfZXBpMzIocm93MiwgdG1wNSk7ICBcCisgICAgdG1wMiA9IF9tbV9zcmFpX2VwaTMyKHRtcDIsIFNISUZUX0lOVl9ST1cpOyAgICAgICAgICAgICBcCisgICAgdG1wNiA9IF9tbV9zcmFpX2VwaTMyKHRtcDYsIFNISUZUX0lOVl9ST1cpOyAgXAorICAgIHJvdzAgPSBfbW1fc3JhaV9lcGkzMihyb3cwLCBTSElGVF9JTlZfUk9XKTsgICAgICAgICAgICAgXAorICAgIHJvdzIgPSBfbW1fc3JhaV9lcGkzMihyb3cyLCBTSElGVF9JTlZfUk9XKTsgIFwKKyAgICB0bXAyID0gX21tX3NodWZmbGVfZXBpMzIodG1wMiwgMHgxQik7IC8qeTcsIHk2LCB5NSwgeTQqLyAgIFwKKyAgICB0bXA2ID0gX21tX3NodWZmbGVfZXBpMzIodG1wNiwgMHgxQik7ICBcCisgICAgcm93MCA9IF9tbV9wYWNrc19lcGkzMihyb3cwLCB0bXAyKTsgLypyb3cwID0geTcseTYseTUseTQseTMseTIseTEseTAqLyAgXAorICAgIHJvdzIgPSBfbW1fcGFja3NfZXBpMzIocm93MiwgdG1wNik7ICAvKnJvdzIgPSB5NywuLi55MCovCisKKworI2RlZmluZSBpRENUXzhfQ09MKCkgIFwKKyAgICB4MyA9IF9tbV9sb2FkX3NpMTI4KCggX19tMTI4aSopKHdzcHRyKzI0KSk7XAorICAgIHgxID0gX21tX2xvYWRfc2kxMjgoKCBfX20xMjhpKikod3NwdHIrOCkpO1wKKyAgICB4NSA9IHJvdzA7XAorICAgIHg3ID0gcm93MjtcCitcCisgICAgdGczID0gKCBfX20xMjhpKikoTTEyOF90Z18zXzE2KTtcCisgICAgdGcxID0gKCBfX20xMjhpKikoTTEyOF90Z18xXzE2KTtcCisgICAgdGcyID0gKCBfX20xMjhpKikoTTEyOF90Z18yXzE2KTtcCisgICAgY29zNCA9KF9fbTEyOGkqKShNMTI4X2Nvc180XzE2KTtcCitcCisgICAgdGVtcCA9IF9tbV9tdWxoaV9lcGkxNih4NSwgKnRnMyk7ICAvKnJvdzUqdGczKi8gXAorICAgIHRlbXAyID0gX21tX211bGhpX2VwaTE2KHgzLCAqdGczKTtcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsIHg1KTsgLypjb2VmIGFkanVzdG1lbnQqLyBcCisgICAgdGVtcDIgPSBfbW1fYWRkc19lcGkxNih0ZW1wMiwgeDMpO1wKKyAgICB0bTc2NSA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsIHgzKTtcCisgICAgdG00NjUgPSBfbW1fc3Vic19lcGkxNih4NSwgdGVtcDIpO1wKK1wKKyAgICB0ZW1wID0gX21tX211bGhpX2VwaTE2KHg3LCAqdGcxKTsgIC8qcm93Nyp0ZzEqLyBcCisgICAgdGVtcDIgPSBfbW1fbXVsaGlfZXBpMTYoeDEsICp0ZzEpO1wKKyAgICB0cDc2NSA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsIHgxKTtcCisgICAgdHA0NjUgPSBfbW1fc3Vic19lcGkxNih0ZW1wMiwgeDcpOyAgLypyb3cxKnRnMSAtIHJvdzcqLyBcCitcCisgICAgdDcgPSBfbW1fYWRkc19lcGkxNih0cDc2NSwgdG03NjUpO1wKKyAgICB0NyA9IF9tbV9hZGRzX2VwaTE2KHQ3LCAqKCBfX20xMjhpKilNMTI4X29uZV9jb3JyKTtcCisgICAgdHA2NSA9IF9tbV9zdWJzX2VwaTE2KHRwNzY1LCB0bTc2NSk7XAorICAgIHQ0ID0gIF9tbV9hZGRzX2VwaTE2KHRwNDY1LCB0bTQ2NSk7XAorICAgIHRtNjUgPSBfbW1fc3Vic19lcGkxNih0cDQ2NSwgdG00NjUpO1wKKyAgICB0bTY1ID0gX21tX2FkZHNfZXBpMTYodG02NSwgKiggX19tMTI4aSopTTEyOF9vbmVfY29ycik7XAorXAorICAgIHgwID0gX21tX2xvYWRfc2kxMjgoKCBfX20xMjhpKikod3NwdHIpKTtcCisgICAgeDQgPSBfbW1fbG9hZF9zaTEyOCgoIF9fbTEyOGkqKSh3c3B0ciszMikpO1wKKyAgICB4MiA9IF9tbV9sb2FkX3NpMTI4KCggX19tMTI4aSopKHdzcHRyKzE2KSk7XAorICAgIHg2ID0gX21tX2xvYWRfc2kxMjgoKCBfX20xMjhpKikod3NwdHIrNDgpKTtcCitcCisgICAgLyp0NiA9ICggdHA2NSArIHRtNjUgKSAqIGNvc180XzE2OyovIFwKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodHA2NSwgdG02NSk7XAorICAgIHRlbXAyID0gX21tX3N1YnNfZXBpMTYodHA2NSwgdG02NSk7XAorICAgIHQ2ID0gX21tX211bGhpX2VwaTE2KHRlbXAsICpjb3M0KTtcCisgICAgdDUgPSBfbW1fbXVsaGlfZXBpMTYodGVtcDIsICpjb3M0KTtcCisgICAgdDYgPSBfbW1fYWRkc19lcGkxNih0NiwgdGVtcCk7XAorICAgIHQ2ID0gX21tX29yX3NpMTI4KHQ2LCAqKCBfX20xMjhpKilNMTI4X29uZV9jb3JyKTtcCisgICAgdDUgPSBfbW1fYWRkc19lcGkxNih0NSwgdGVtcDIpO1wKKyAgICB0NSA9IF9tbV9vcl9zaTEyOCh0NSwgKiggX19tMTI4aSopTTEyOF9vbmVfY29ycik7XAorXAorICAgIHRwMDMgPSBfbW1fYWRkc19lcGkxNih4MCwgeDQpO1wKKyAgICB0cDEyID0gX21tX3N1YnNfZXBpMTYoeDAsIHg0KTtcCitcCisgICAgdGVtcCA9IF9tbV9tdWxoaV9lcGkxNih4NiwgKnRnMik7XAorICAgIHRlbXAyID0gX21tX211bGhpX2VwaTE2KHgyLCAqdGcyKTtcCisgICAgdG0wMyA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsIHgyKTtcCisgICAgdG0xMiA9IF9tbV9zdWJzX2VwaTE2KHRlbXAyLCB4Nik7XAorXAorICAgIHQwID0gX21tX2FkZHNfZXBpMTYodHAwMywgdG0wMyk7XAorICAgIHQwID0gX21tX2FkZHNfZXBpMTYodDAsICooIF9fbTEyOGkqKU0xMjhfcm91bmRfaW52X2NvbCk7XAorICAgIHQzID0gX21tX3N1YnNfZXBpMTYodHAwMywgdG0wMyk7XAorICAgIHQzID0gX21tX2FkZHNfZXBpMTYodDMsICooIF9fbTEyOGkqKU0xMjhfcm91bmRfaW52X2NvcnIpO1wKKyAgICB0MSA9IF9tbV9hZGRzX2VwaTE2KHRwMTIsIHRtMTIpO1wKKyAgICB0MSA9IF9tbV9hZGRzX2VwaTE2KHQxLCAqKCBfX20xMjhpKilNMTI4X3JvdW5kX2ludl9jb2wpO1wKKyAgICB0MiA9IF9tbV9zdWJzX2VwaTE2KHRwMTIsIHRtMTIpO1wKKyAgICB0MiA9IF9tbV9hZGRzX2VwaTE2KHQyLCAqKCBfX20xMjhpKilNMTI4X3JvdW5kX2ludl9jb3JyKTtcCitcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHQwLCB0Nyk7ICAgLyp5MCovIFwKKyAgICB0ZW1wMiA9IF9tbV9hZGRzX2VwaTE2KHQxLCB0Nik7ICAvKnkxKi8gXAorICAgIHRlbXAgPSBfbW1fc3JhaV9lcGkxNih0ZW1wLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcDIgPSBfbW1fc3JhaV9lcGkxNih0ZW1wMiwgU0hJRlRfSU5WX0NPTCk7XAorICAgIHRlbXAgPSBfbW1fYWRkc19lcGkxNih0ZW1wLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7IC8qQWRkIDEyOCBmb3IganBlZyBkZWNvZGluZyovIFwKKyAgICB0ZW1wMiA9IF9tbV9hZGRzX2VwaTE2KHRlbXAyLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7XAorXAorICAgIHRlbXAgPSBfbW1fcGFja3VzX2VwaTE2KHRlbXAsIHRlbXAyKTtcCisgICAgX21tX3N0b3JlX3NpMTI4KCggX19tMTI4aSopKG91dHB0ciksIHRlbXApOyAgLypzdG9yZSB5MCwgeTEqLyBcCitcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHQyLCB0NSk7XAorICAgIHRlbXAyID0gX21tX2FkZHNfZXBpMTYodDMsIHQ0KTtcCisgICAgdGVtcCA9IF9tbV9zcmFpX2VwaTE2KHRlbXAsIFNISUZUX0lOVl9DT0wpO1wKKyAgICB0ZW1wMiA9IF9tbV9zcmFpX2VwaTE2KHRlbXAyLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcCA9IF9tbV9hZGRzX2VwaTE2KHRlbXAsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTtcCisgICAgdGVtcDIgPSBfbW1fYWRkc19lcGkxNih0ZW1wMiwgKiggX19tMTI4aSopanBlZ19hZGp1c3QpO1wKK1wKKyAgICB0ZW1wID0gX21tX3BhY2t1c19lcGkxNih0ZW1wLCB0ZW1wMik7XAorICAgIF9tbV9zdG9yZV9zaTEyOCgoIF9fbTEyOGkqKShvdXRwdHIrMTYpLCB0ZW1wKTsgIC8qc3RvcmUgeTIsIHkzKi8gXAorXAorICAgIHRlbXAgPSBfbW1fc3Vic19lcGkxNih0MywgdDQpO1wKKyAgICB0ZW1wMiA9IF9tbV9zdWJzX2VwaTE2KHQyLCB0NSk7XAorICAgIHRlbXAgPSBfbW1fc3JhaV9lcGkxNih0ZW1wLCBTSElGVF9JTlZfQ09MKTtcCisgICAgdGVtcDIgPSBfbW1fc3JhaV9lcGkxNih0ZW1wMiwgU0hJRlRfSU5WX0NPTCk7XAorICAgIHRlbXAgPSBfbW1fYWRkc19lcGkxNih0ZW1wLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7XAorICAgIHRlbXAyID0gX21tX2FkZHNfZXBpMTYodGVtcDIsICooIF9fbTEyOGkqKWpwZWdfYWRqdXN0KTtcCitcCisgICAgdGVtcCA9IF9tbV9wYWNrdXNfZXBpMTYodGVtcCwgdGVtcDIpO1wKKyAgICBfbW1fc3RvcmVfc2kxMjgoKCBfX20xMjhpKikob3V0cHRyKzMyKSwgdGVtcCk7ICAvKnN0b3JlIHk0LCB5NSovIFwKK1wKKyAgICB0ZW1wID0gX21tX3N1YnNfZXBpMTYodDEsIHQ2KTtcCisgICAgdGVtcDIgPSBfbW1fc3Vic19lcGkxNih0MCwgdDcpO1wKKyAgICB0ZW1wID0gX21tX3NyYWlfZXBpMTYodGVtcCwgU0hJRlRfSU5WX0NPTCk7XAorICAgIHRlbXAyID0gX21tX3NyYWlfZXBpMTYodGVtcDIsIFNISUZUX0lOVl9DT0wpO1wKKyAgICB0ZW1wID0gX21tX2FkZHNfZXBpMTYodGVtcCwgKiggX19tMTI4aSopanBlZ19hZGp1c3QpO1wKKyAgICB0ZW1wMiA9IF9tbV9hZGRzX2VwaTE2KHRlbXAyLCAqKCBfX20xMjhpKilqcGVnX2FkanVzdCk7XAorXAorICAgIHRlbXAgPSBfbW1fcGFja3VzX2VwaTE2KHRlbXAsIHRlbXAyKTtcCisgICAgX21tX3N0b3JlX3NpMTI4KCggX19tMTI4aSopKG91dHB0cis0OCksIHRlbXApOyAgLypzdG9yZSB5NiwgeTcqLworCisKKyAgLypNZW1jcHkgdG8gZG8gMTZieXRlIGFsaWdubWVudC4gKi8KKyAgbWVtY3B5KChjaGFyKilxdWFudHB0clNTRSwgKGNoYXIqKWNvbXBwdHItPmRjdF90YWJsZSwgc2l6ZW9mKHF1YW50cHRyU1NFKSk7CisgIG1lbWNweSgoY2hhciopY29lZl9ibG9ja1NTRSwgKGNoYXIqKWNvZWZfYmxvY2ssIHNpemVvZihjb2VmX2Jsb2NrU1NFKSk7CisKKyAgd3NwdHIgPSAoc2hvcnQgKil3b3Jrc3BhY2VTU0U7CisgIG91dHB0ciA9ICh1bnNpZ25lZCBjaGFyKil3b3Jrc3BhY2VTU0U7CisKKyAgLy8gcm93IDAgYW5kIHJvdyAyCisgIHJvdzAgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UpKTsKKyAgcm93MiA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpIGNvbnN0KikoY29lZl9ibG9ja1NTRSs4KjIpKTsKKyAgcm93MCA9IF9tbV9tdWxsb19lcGkxNiggcm93MCwgKihfX20xMjhpIGNvbnN0KilxdWFudHB0clNTRSApOworICByb3cyID0gX21tX211bGxvX2VwaTE2KCByb3cyLCAqKF9fbTEyOGkgY29uc3QqKShxdWFudHB0clNTRSs4KjIpICk7CisKKyAgaURDVF84XzJST1dzKE0xMjhfdGFiX2lfMDQsIE0xMjhfdGFiX2lfMjYpOworCisgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHdzcHRyKSwgcm93MCk7CisgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHdzcHRyKzgqMiksIHJvdzIpOworCisgIC8vIHJvdyA0IGFuZCByb3cgNgorICByb3cwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgY29uc3QqKShjb2VmX2Jsb2NrU1NFKzgqNCkpOworICByb3cyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgY29uc3QqKShjb2VmX2Jsb2NrU1NFKzgqNikpOworICByb3cwID0gX21tX211bGxvX2VwaTE2KHJvdzAsICooX19tMTI4aSBjb25zdCopKHF1YW50cHRyU1NFKzgqNCkgKTsKKyAgcm93MiA9IF9tbV9tdWxsb19lcGkxNihyb3cyLCAqKF9fbTEyOGkgY29uc3QqKShxdWFudHB0clNTRSs4KjYpICk7CisKKyAgaURDVF84XzJST1dzKE0xMjhfdGFiX2lfMDQsIE0xMjhfdGFiX2lfMjYpOworCisgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHdzcHRyKzMyKSwgcm93MCk7CisgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHdzcHRyKzQ4KSwgcm93Mik7CisKKyAgLy8gcm93IDMgYW5kIHJvdyAxCisgIHJvdzAgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCozKSk7CisgIHJvdzIgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSBjb25zdCopKGNvZWZfYmxvY2tTU0UrOCoxKSk7CisgIHJvdzAgPSBfbW1fbXVsbG9fZXBpMTYocm93MCwgKihfX20xMjhpIGNvbnN0KikocXVhbnRwdHJTU0UrMjQpICk7CisgIHJvdzIgPSBfbW1fbXVsbG9fZXBpMTYocm93MiwgKihfX20xMjhpIGNvbnN0KikocXVhbnRwdHJTU0UrOCkgKTsKKworICBpRENUXzhfMlJPV3MoTTEyOF90YWJfaV8zNSwgTTEyOF90YWJfaV8xNyk7CisKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIrMjQpLCByb3cwKTsKKyAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikod3NwdHIrOCksIHJvdzIpOworCisgIC8vIHJvdyA1IGFuZCByb3cgNworICByb3cwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgY29uc3QqKShjb2VmX2Jsb2NrU1NFKzgqNSkpOworICByb3cyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgY29uc3QqKShjb2VmX2Jsb2NrU1NFKzgqNykpOworICByb3cwID0gX21tX211bGxvX2VwaTE2KHJvdzAsICooX19tMTI4aSBjb25zdCopKHF1YW50cHRyU1NFKzQwKSApOworICByb3cyID0gX21tX211bGxvX2VwaTE2KHJvdzIsICooX19tMTI4aSBjb25zdCopKHF1YW50cHRyU1NFKzU2KSk7CisKKyAgaURDVF84XzJST1dzKCBNMTI4X3RhYl9pXzM1LCBNMTI4X3RhYl9pXzE3KTsKKworICBpRENUXzhfQ09MKCk7CisKKyAgZm9yKGN0ciA9IDA7IGN0ciA8IERDVFNJWkU7IGN0cisrKQorICB7CisgICAgb3V0cHRyVGVtcCA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7CisgICAgbWVtY3B5KG91dHB0clRlbXAsIG91dHB0ciwgRENUU0laRSk7CisgICAgb3V0cHRyICs9IERDVFNJWkU7ICAgLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgIH0KKworICByZXR1cm47Cit9CisjZW5kaWYgLyogQU5EUk9JRF9JTlRFTFNTRTJfSURDVCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0cmVkLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvamlkY3RyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjFmM2M3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppZGN0cmVkLmMKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBqaWRjdHJlZC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW52ZXJzZS1EQ1Qgcm91dGluZXMgdGhhdCBwcm9kdWNlIHJlZHVjZWQtc2l6ZSBvdXRwdXQ6CisgKiBlaXRoZXIgNHg0LCAyeDIsIG9yIDF4MSBwaXhlbHMgZnJvbSBhbiA4eDggRENUIGJsb2NrLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgTG9lZmZsZXIsIExpZ3RlbmJlcmcgYW5kIE1vc2NoeXR6IChMTCZNKQorICogYWxnb3JpdGhtIHVzZWQgaW4gamlkY3RpbnQuYy4gIFdlIHNpbXBseSByZXBsYWNlIGVhY2ggOC10by04IDEtRCBJRENUIHN0ZXAKKyAqIHdpdGggYW4gOC10by00IHN0ZXAgdGhhdCBwcm9kdWNlcyB0aGUgZm91ciBhdmVyYWdlcyBvZiB0d28gYWRqYWNlbnQgb3V0cHV0cworICogKG9yIGFuIDgtdG8tMiBzdGVwIHByb2R1Y2luZyB0d28gYXZlcmFnZXMgb2YgZm91ciBvdXRwdXRzLCBmb3IgMngyIG91dHB1dCkuCisgKiBUaGVzZSBzdGVwcyB3ZXJlIGRlcml2ZWQgYnkgY29tcHV0aW5nIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgbm9ybWFsIExMJk0gY29kZSwgdGhlbiBzaW1wbGlmeWluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICoKKyAqIDF4MSBpcyB0cml2aWFsOiBqdXN0IHRha2UgdGhlIERDIGNvZWZmaWNpZW50IGRpdmlkZWQgYnkgOC4KKyAqCisgKiBTZWUgamlkY3RpbnQuYyBmb3IgYWRkaXRpb25hbCBjb21tZW50cy4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KKworI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKKworCisvKgorICogVGhpcyBtb2R1bGUgaXMgc3BlY2lhbGl6ZWQgdG8gdGhlIGNhc2UgRENUU0laRSA9IDguCisgKi8KKworI2lmIERDVFNJWkUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4eDggRENUcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworCisvKiBTY2FsaW5nIGlzIHRoZSBzYW1lIGFzIGluIGppZGN0aW50LmMuICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAyCisjZWxzZQorI2RlZmluZSBDT05TVF9CSVRTICAxMworI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLworI2VuZGlmCisKKy8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cworICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCisgKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgorICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgorICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKKyAqLworCisjaWYgQ09OU1RfQklUUyA9PSAxMworI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgICgoSU5UMzIpICAxNzMwKQkvKiBGSVgoMC4yMTExNjQyNDMpICovCisjZGVmaW5lIEZJWF8wXzUwOTc5NTU3OSAgKChJTlQzMikgIDQxNzYpCS8qIEZJWCgwLjUwOTc5NTU3OSkgKi8KKyNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICAoKElOVDMyKSAgNDkyNikJLyogRklYKDAuNjAxMzQ0ODg3KSAqLworI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgICgoSU5UMzIpICA1OTA2KQkvKiBGSVgoMC43MjA5NTk4MjIpICovCisjZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgKChJTlQzMikgIDYyNzApCS8qIEZJWCgwLjc2NTM2Njg2NSkgKi8KKyNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICAoKElOVDMyKSAgNjk2NykJLyogRklYKDAuODUwNDMwMDk1KSAqLworI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCisjZGVmaW5lIEZJWF8xXzA2MTU5NDMzNyAgKChJTlQzMikgIDg2OTcpCS8qIEZJWCgxLjA2MTU5NDMzNykgKi8KKyNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICAoKElOVDMyKSAgMTA0MjYpCS8qIEZJWCgxLjI3Mjc1ODU4MCkgKi8KKyNkZWZpbmUgRklYXzFfNDUxNzc0OTgxICAoKElOVDMyKSAgMTE4OTMpCS8qIEZJWCgxLjQ1MTc3NDk4MSkgKi8KKyNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KKyNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICAoKElOVDMyKSAgMTc3OTkpCS8qIEZJWCgyLjE3MjczNDgwMykgKi8KKyNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KKyNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICAoKElOVDMyKSAgMjk2OTIpCS8qIEZJWCgzLjYyNDUwOTc4NSkgKi8KKyNlbHNlCisjZGVmaW5lIEZJWF8wXzIxMTE2NDI0MyAgRklYKDAuMjExMTY0MjQzKQorI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgIEZJWCgwLjUwOTc5NTU3OSkKKyNkZWZpbmUgRklYXzBfNjAxMzQ0ODg3ICBGSVgoMC42MDEzNDQ4ODcpCisjZGVmaW5lIEZJWF8wXzcyMDk1OTgyMiAgRklYKDAuNzIwOTU5ODIyKQorI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgIEZJWCgwLjc2NTM2Njg2NSkKKyNkZWZpbmUgRklYXzBfODUwNDMwMDk1ICBGSVgoMC44NTA0MzAwOTUpCisjZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQorI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgIEZJWCgxLjA2MTU5NDMzNykKKyNkZWZpbmUgRklYXzFfMjcyNzU4NTgwICBGSVgoMS4yNzI3NTg1ODApCisjZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgRklYKDEuNDUxNzc0OTgxKQorI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKKyNkZWZpbmUgRklYXzJfMTcyNzM0ODAzICBGSVgoMi4xNzI3MzQ4MDMpCisjZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQorI2RlZmluZSBGSVhfM182MjQ1MDk3ODUgIEZJWCgzLjYyNDUwOTc4NSkKKyNlbmRpZgorCisKKy8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KKyAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKKyAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKKyAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCisgKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQorI2Vsc2UKKyNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKKyNlbmRpZgorCisKKy8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQorICogZW50cnk7IHByb2R1Y2UgYW4gaW50IHJlc3VsdC4gIEluIHRoaXMgbW9kdWxlLCBib3RoIGlucHV0cyBhbmQgcmVzdWx0CisgKiBhcmUgMTYgYml0cyBvciBsZXNzLCBzbyBlaXRoZXIgaW50IG9yIHNob3J0IG11bHRpcGx5IHdpbGwgd29yay4KKyAqLworCisjZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgICgoKElTTE9XX01VTFRfVFlQRSkgKGNvZWYpKSAqIChxdWFudHZhbCkpCisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgNHg0IG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF80eDQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMiwgdG1wMTAsIHRtcDEyOworICBJTlQzMiB6MSwgejIsIHozLCB6NDsKKyAgSkNPRUZQVFIgaW5wdHI7CisgIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOworICBpbnQgKiB3c3B0cjsKKyAgSlNBTVBST1cgb3V0cHRyOworICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOworICBpbnQgY3RyOworICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqNF07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLworICBTSElGVF9URU1QUworCisgIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KKworICBpbnB0ciA9IGNvZWZfYmxvY2s7CisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7CisgICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1uIDQsIGJlY2F1c2Ugc2Vjb25kIHBhc3Mgd29uJ3QgdXNlIGl0ICovCisgICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoaW5wdHJbRENUU0laRSoxXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqMl0gPT0gMCAmJgorCWlucHRyW0RDVFNJWkUqM10gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtIDQgZm9yIDR4NCBvdXRwdXQgKi8KKyAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKKyAgICAgIAorICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSoyXSA9IGRjdmFsOworICAgICAgd3NwdHJbRENUU0laRSozXSA9IGRjdmFsOworICAgICAgCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgCisgICAgLyogRXZlbiBwYXJ0ICovCisgICAgCisgICAgdG1wMCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMCA8PD0gKENPTlNUX0JJVFMrMSk7CisgICAgCisgICAgejIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOworICAgIHozID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjZdLCBxdWFudHB0cltEQ1RTSVpFKjZdKTsKKworICAgIHRtcDIgPSBNVUxUSVBMWSh6MiwgRklYXzFfODQ3NzU5MDY1KSArIE1VTFRJUExZKHozLCAtIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisgICAgCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgejQgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCisJICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KKwkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLworCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLworICAgIAorICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCisJICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLworCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMiArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysxKTsKKyAgfQorICAKKyAgLyogUGFzcyAyOiBwcm9jZXNzIDQgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLworCisgIHdzcHRyID0gd29ya3NwYWNlOworICBmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7CisgICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKKyAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCisKKyNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAorICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJgorCXdzcHRyWzVdID09IDAgJiYgd3NwdHJbNl0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLworICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQorCQkJCSAgJiBSQU5HRV9NQVNLXTsKKyAgICAgIAorICAgICAgb3V0cHRyWzBdID0gZGN2YWw7CisgICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsyXSA9IGRjdmFsOworICAgICAgb3V0cHRyWzNdID0gZGN2YWw7CisgICAgICAKKyAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZgorICAgIAorICAgIC8qIEV2ZW4gcGFydCAqLworICAgIAorICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMSk7CisgICAgCisgICAgdG1wMiA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbMl0sIEZJWF8xXzg0Nzc1OTA2NSkKKwkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzZdLCAtIEZJWF8wXzc2NTM2Njg2NSk7CisgICAgCisgICAgdG1wMTAgPSB0bXAwICsgdG1wMjsKKyAgICB0bXAxMiA9IHRtcDAgLSB0bXAyOworICAgIAorICAgIC8qIE9kZCBwYXJ0ICovCisgICAgCisgICAgejEgPSAoSU5UMzIpIHdzcHRyWzddOworICAgIHoyID0gKElOVDMyKSB3c3B0cls1XTsKKyAgICB6MyA9IChJTlQzMikgd3NwdHJbM107CisgICAgejQgPSAoSU5UMzIpIHdzcHRyWzFdOworICAgIAorICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF8yMTExNjQyNDMpIC8qIHNxcnQoMikgKiAoYzMtYzEpICovCisJICsgTVVMVElQTFkoejIsIEZJWF8xXzQ1MTc3NDk4MSkgLyogc3FydCgyKSAqIChjMytjNykgKi8KKwkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMl8xNzI3MzQ4MDMpIC8qIHNxcnQoMikgKiAoLWMxLWM1KSAqLworCSArIE1VTFRJUExZKHo0LCBGSVhfMV8wNjE1OTQzMzcpOyAvKiBzcXJ0KDIpICogKGM1K2M3KSAqLworICAgIAorICAgIHRtcDIgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF81MDk3OTU1NzkpIC8qIHNxcnQoMikgKiAoYzctYzUpICovCisJICsgTVVMVElQTFkoejIsIC0gRklYXzBfNjAxMzQ0ODg3KSAvKiBzcXJ0KDIpICogKGM1LWMxKSAqLworCSArIE1VTFRJUExZKHozLCBGSVhfMF84OTk5NzYyMjMpIC8qIHNxcnQoMikgKiAoYzMtYzcpICovCisJICsgTVVMVElQTFkoejQsIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoYzErYzMpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMiwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDIsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLAorCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCisJCQkgICAgJiBSQU5HRV9NQVNLXTsKKyAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgCisgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLworICB9Cit9CisKKworLyoKKyAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMsCisgKiBwcm9kdWNpbmcgYSByZWR1Y2VkLXNpemUgMngyIG91dHB1dCBibG9jay4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfaWRjdF8yeDIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAorCSAgICAgICBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKK3sKKyAgSU5UMzIgdG1wMCwgdG1wMTAsIHoxOworICBKQ09FRlBUUiBpbnB0cjsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIGludCAqIHdzcHRyOworICBKU0FNUFJPVyBvdXRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIGludCBjdHI7CisgIGludCB3b3Jrc3BhY2VbRENUU0laRSoyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCisgIFNISUZUX1RFTVBTCisKKyAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLworCisgIGlucHRyID0gY29lZl9ibG9jazsKKyAgcXVhbnRwdHIgPSAoSVNMT1dfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgaW5wdHIrKywgcXVhbnRwdHIrKywgd3NwdHIrKywgY3RyLS0pIHsKKyAgICAvKiBEb24ndCBib3RoZXIgdG8gcHJvY2VzcyBjb2x1bW5zIDIsNCw2ICovCisgICAgaWYgKGN0ciA9PSBEQ1RTSVpFLTIgfHwgY3RyID09IERDVFNJWkUtNCB8fCBjdHIgPT0gRENUU0laRS02KQorICAgICAgY29udGludWU7CisgICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYKKwlpbnB0cltEQ1RTSVpFKjVdID09IDAgJiYgaW5wdHJbRENUU0laRSo3XSA9PSAwKSB7CisgICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybzsgd2UgbmVlZCBub3QgZXhhbWluZSB0ZXJtcyAyLDQsNiBmb3IgMngyIG91dHB1dCAqLworICAgICAgaW50IGRjdmFsID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKSA8PCBQQVNTMV9CSVRTOworICAgICAgCisgICAgICB3c3B0cltEQ1RTSVpFKjBdID0gZGN2YWw7CisgICAgICB3c3B0cltEQ1RTSVpFKjFdID0gZGN2YWw7CisgICAgICAKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7CisgICAgdG1wMTAgPSB6MSA8PCAoQ09OU1RfQklUUysyKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOworICAgIHRtcDAgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF83MjA5NTk4MjIpOyAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLworICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKKyAgICB0bXAwICs9IE1VTFRJUExZKHoxLCBGSVhfMF84NTA0MzAwOTUpOyAvKiBzcXJ0KDIpICogKC1jMStjMytjNStjNykgKi8KKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSozXSwgcXVhbnRwdHJbRENUU0laRSozXSk7CisgICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgLSBGSVhfMV8yNzI3NTg1ODApOyAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KKyAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoxXSwgcXVhbnRwdHJbRENUU0laRSoxXSk7CisgICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzNfNjI0NTA5Nzg1KTsgLyogc3FydCgyKSAqIChjMStjMytjNStjNykgKi8KKworICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZSAqLworICAgIAorICAgIHdzcHRyW0RDVFNJWkUqMF0gPSAoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOworICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKzIpOworICB9CisgIAorICAvKiBQYXNzIDI6IHByb2Nlc3MgMiByb3dzIGZyb20gd29yayBhcnJheSwgc3RvcmUgaW50byBvdXRwdXQgYXJyYXkuICovCisKKyAgd3NwdHIgPSB3b3Jrc3BhY2U7CisgIGZvciAoY3RyID0gMDsgY3RyIDwgMjsgY3RyKyspIHsKKyAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2N0cl0gKyBvdXRwdXRfY29sOworICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgYSB6ZXJvIHJvdyB0ZXN0IGlzIHdvcnRod2hpbGUgaGVyZSAuLi4gKi8KKworI2lmbmRlZiBOT19aRVJPX1JPV19URVNUCisgICAgaWYgKHdzcHRyWzFdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls1XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKKyAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCisgICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCisJCQkJICAmIFJBTkdFX01BU0tdOworICAgICAgCisgICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKKyAgICAgIG91dHB0clsxXSA9IGRjdmFsOworICAgICAgCisgICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCisgICAgICBjb250aW51ZTsKKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICAvKiBFdmVuIHBhcnQgKi8KKyAgICAKKyAgICB0bXAxMCA9ICgoSU5UMzIpIHdzcHRyWzBdKSA8PCAoQ09OU1RfQklUUysyKTsKKyAgICAKKyAgICAvKiBPZGQgcGFydCAqLworCisgICAgdG1wMCA9IE1VTFRJUExZKChJTlQzMikgd3NwdHJbN10sIC0gRklYXzBfNzIwOTU5ODIyKSAvKiBzcXJ0KDIpICogKGM3LWM1K2MzLWMxKSAqLworCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbNV0sIEZJWF8wXzg1MDQzMDA5NSkgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCisJICsgTVVMVElQTFkoKElOVDMyKSB3c3B0clszXSwgLSBGSVhfMV8yNzI3NTg1ODApIC8qIHNxcnQoMikgKiAoLWMxK2MzLWM1LWM3KSAqLworCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbMV0sIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCisKKyAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KKyAgICAKKyAgICBvdXRwdHJbMF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwICsgdG1wMCwKKwkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysyKQorCQkJICAgICYgUkFOR0VfTUFTS107CisgICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsCisJCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKKwkJCSAgICAmIFJBTkdFX01BU0tdOworICAgIAorICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KKyAgfQorfQorCisKKy8qCisgKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAorICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDF4MSBvdXRwdXQgYmxvY2suCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX2lkY3RfMXgxIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKKwkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKKwkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCit7CisgIGludCBkY3ZhbDsKKyAgSVNMT1dfTVVMVF9UWVBFICogcXVhbnRwdHI7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gSURDVF9yYW5nZV9saW1pdChjaW5mbyk7CisgIFNISUZUX1RFTVBTCisKKyAgLyogV2UgaGFyZGx5IG5lZWQgYW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBmb3IgdGhpczoganVzdCB0YWtlIHRoZQorICAgKiBhdmVyYWdlIHBpeGVsIHZhbHVlLCB3aGljaCBpcyBvbmUtZWlnaHRoIG9mIHRoZSBEQyBjb2VmZmljaWVudC4KKyAgICovCisgIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7CisgIGRjdmFsID0gREVRVUFOVElaRShjb2VmX2Jsb2NrWzBdLCBxdWFudHB0clswXSk7CisgIGRjdmFsID0gKGludCkgREVTQ0FMRSgoSU5UMzIpIGRjdmFsLCAzKTsKKworICBvdXRwdXRfYnVmWzBdW291dHB1dF9jb2xdID0gcmFuZ2VfbGltaXRbZGN2YWwgJiBSQU5HRV9NQVNLXTsKK30KKworI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaW5jbHVkZS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ppbmNsdWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qaW5jbHVkZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBqaW5jbHVkZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgZXhpc3RzIHRvIHByb3ZpZGUgYSBzaW5nbGUgcGxhY2UgdG8gZml4IGFueSBwcm9ibGVtcyB3aXRoCisgKiBpbmNsdWRpbmcgdGhlIHdyb25nIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKENvbW1vbiBwcm9ibGVtcyBhcmUgdGFrZW4KKyAqIGNhcmUgb2YgYnkgdGhlIHN0YW5kYXJkIGpjb25maWcgc3ltYm9scywgYnV0IG9uIHJlYWxseSB3ZWlyZCBzeXN0ZW1zCisgKiB5b3UgbWF5IGhhdmUgdG8gZWRpdCB0aGlzIGZpbGUuKQorICoKKyAqIE5PVEU6IHRoaXMgZmlsZSBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZQorICogSlBFRyBsaWJyYXJ5LiAgTW9zdCBhcHBsaWNhdGlvbnMgbmVlZCBvbmx5IGluY2x1ZGUganBlZ2xpYi5oLgorICovCisKKworLyogSW5jbHVkZSBhdXRvLWNvbmZpZyBmaWxlIHRvIGZpbmQgb3V0IHdoaWNoIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuICovCisKKyNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiBhdXRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworI2RlZmluZSBKQ09ORklHX0lOQ0xVREVECS8qIHNvIHRoYXQganBlZ2xpYi5oIGRvZXNuJ3QgZG8gaXQgYWdhaW4gKi8KKworLyoKKyAqIFdlIG5lZWQgdGhlIE5VTEwgbWFjcm8gYW5kIHNpemVfdCB0eXBlZGVmLgorICogT24gYW4gQU5TSS1jb25mb3JtaW5nIHN5c3RlbSBpdCBpcyBzdWZmaWNpZW50IHRvIGluY2x1ZGUgPHN0ZGRlZi5oPi4KKyAqIE90aGVyd2lzZSwgd2UgZ2V0IHRoZW0gZnJvbSA8c3RkbGliLmg+IG9yIDxzdGRpby5oPjsgd2UgbWF5IGhhdmUgdG8KKyAqIHB1bGwgaW4gPHN5cy90eXBlcy5oPiBhcyB3ZWxsLgorICogTm90ZSB0aGF0IHRoZSBjb3JlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCByZXF1aXJlIDxzdGRpby5oPjsKKyAqIG9ubHkgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciBhbmQgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbW9kdWxlcyBkby4KKyAqIEJ1dCB3ZSBtdXN0IHB1bGwgaXQgaW4gYmVjYXVzZSBvZiB0aGUgcmVmZXJlbmNlcyB0byBGSUxFIGluIGpwZWdsaWIuaC4KKyAqIFlvdSBjYW4gcmVtb3ZlIHRob3NlIHJlZmVyZW5jZXMgaWYgeW91IHdhbnQgdG8gY29tcGlsZSB3aXRob3V0IDxzdGRpby5oPi4KKyAqLworCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURExJQl9ICisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2lmZGVmIE5FRURfU1lTX1RZUEVTX0gKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyoKKyAqIFdlIG5lZWQgbWVtb3J5IGNvcHlpbmcgYW5kIHplcm9pbmcgZnVuY3Rpb25zLCBwbHVzIHN0cm5jcHkoKS4KKyAqIEFOU0kgYW5kIFN5c3RlbSBWIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlIHRoZXNlIGluIDxzdHJpbmcuaD4uCisgKiBCU0QgZG9lc24ndCBoYXZlIHRoZSBtZW0oKSBmdW5jdGlvbnMsIGJ1dCBpdCBkb2VzIGhhdmUgYmNvcHkoKS9iemVybygpLgorICogU29tZSBzeXN0ZW1zIG1heSBkZWNsYXJlIG1lbXNldCBhbmQgbWVtY3B5IGluIDxtZW1vcnkuaD4uCisgKgorICogTk9URTogd2UgYXNzdW1lIHRoZSBzaXplIHBhcmFtZXRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBvZiB0eXBlIHNpemVfdC4KKyAqIENoYW5nZSB0aGUgY2FzdHMgaW4gdGhlc2UgbWFjcm9zIGlmIG5vdCEKKyAqLworCisjaWZkZWYgTkVFRF9CU0RfU1RSSU5HUworCisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQliemVybygodm9pZCAqKSh0YXJnZXQpLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQliY29weSgoY29uc3Qgdm9pZCAqKShzcmMpLCAodm9pZCAqKShkZXN0KSwgKHNpemVfdCkoc2l6ZSkpCisKKyNlbHNlIC8qIG5vdCBCU0QsIGFzc3VtZSBBTlNJL1N5c1Ygc3RyaW5nIGxpYiAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCW1lbXNldCgodm9pZCAqKSh0YXJnZXQpLCAwLCAoc2l6ZV90KShzaXplKSkKKyNkZWZpbmUgTUVNQ09QWShkZXN0LHNyYyxzaXplKQltZW1jcHkoKHZvaWQgKikoZGVzdCksIChjb25zdCB2b2lkICopKHNyYyksIChzaXplX3QpKHNpemUpKQorCisjZW5kaWYKKworLyoKKyAqIEluIEFOU0kgQywgYW5kIGluZGVlZCBhbnkgcmF0aW9uYWwgaW1wbGVtZW50YXRpb24sIHNpemVfdCBpcyBhbHNvIHRoZQorICogdHlwZSByZXR1cm5lZCBieSBzaXplb2YoKS4gIEhvd2V2ZXIsIGl0IHNlZW1zIHRoZXJlIGFyZSBzb21lIGlycmF0aW9uYWwKKyAqIGltcGxlbWVudGF0aW9ucyBvdXQgdGhlcmUsIGluIHdoaWNoIHNpemVvZigpIHJldHVybnMgYW4gaW50IGV2ZW4gdGhvdWdoCisgKiBzaXplX3QgaXMgZGVmaW5lZCBhcyBsb25nIG9yIHVuc2lnbmVkIGxvbmcuICBUbyBlbnN1cmUgY29uc2lzdGVudCByZXN1bHRzCisgKiB3ZSBhbHdheXMgdXNlIHRoaXMgU0laRU9GKCkgbWFjcm8gaW4gcGxhY2Ugb2YgdXNpbmcgc2l6ZW9mKCkgZGlyZWN0bHkuCisgKi8KKworI2RlZmluZSBTSVpFT0Yob2JqZWN0KQkoKHNpemVfdCkgc2l6ZW9mKG9iamVjdCkpCisKKy8qCisgKiBUaGUgbW9kdWxlcyB0aGF0IHVzZSBmcmVhZCgpIGFuZCBmd3JpdGUoKSBhbHdheXMgaW52b2tlIHRoZW0gdGhyb3VnaAorICogdGhlc2UgbWFjcm9zLiAgT24gc29tZSBzeXN0ZW1zIHlvdSBtYXkgbmVlZCB0byB0d2lkZGxlIHRoZSBhcmd1bWVudCBjYXN0cy4KKyAqIENBVVRJT046IGFyZ3VtZW50IG9yZGVyIGlzIGRpZmZlcmVudCBmcm9tIHVuZGVybHlpbmcgZnVuY3Rpb25zIQorICovCisKKyNkZWZpbmUgSkZSRUFEKGZpbGUsYnVmLHNpemVvZmJ1ZikgIFwKKyAgKChzaXplX3QpIGZyZWFkKCh2b2lkICopIChidWYpLCAoc2l6ZV90KSAxLCAoc2l6ZV90KSAoc2l6ZW9mYnVmKSwgKGZpbGUpKSkKKyNkZWZpbmUgSkZXUklURShmaWxlLGJ1ZixzaXplb2ZidWYpICBcCisgICgoc2l6ZV90KSBmd3JpdGUoKGNvbnN0IHZvaWQgKikgKGJ1ZiksIChzaXplX3QpIDEsIChzaXplX3QpIChzaXplb2ZidWYpLCAoZmlsZSkpKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW0tYW5kcm9pZC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW0tYW5kcm9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTRkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbS1hbmRyb2lkLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisjaWZuZGVmIFNFRUtfU0VUCQkvKiBwcmUtQU5TSSBzeXN0ZW1zIG1heSBub3QgZGVmaW5lIHRoaXM7ICovCisjZGVmaW5lIFNFRUtfU0VUICAwCQkvKiBpZiBub3QsIGFzc3VtZSAwIGlzIGNvcnJlY3QgKi8KKyNlbmRpZgorCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwMEwgLyogZGVmYXVsdDogdGVuIG1lZ2FieXRlICovCisjZW5kaWYKKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQorICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgorICovCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGUkVBRChpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQorICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIGlmIChKRldSSVRFKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOworfQorCisKK01FVEhPRERFRih2b2lkKQorY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBmY2xvc2UoaW5mby0+dGVtcF9maWxlKTsKKyAgLyogU2luY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRtcGZpbGUoKSB0byBjcmVhdGUgdGhlIGZpbGUsCisgICAqIG5vIGV4cGxpY2l0IGZpbGUgZGVsZXRpb24gaXMgbmVlZGVkLgorICAgKi8KK30KKworc3RhdGljIEZJTEUqIGdldFRlbXBGaWxlRnJvbVBhdGgoY29uc3QgY2hhciAqIHBhdGgpIHsKKyAgICBGSUxFICogZmQgPSBmb3BlbihwYXRoLCAidysiKTsKKyAgICB1bmxpbmsocGF0aCk7CisgICAgcmV0dXJuIGZkOworfQorCitzdGF0aWMgRklMRSogZ2V0VGVtcEZpbGUoKSB7CisgICAgY2hhciBwYXRoWzEwMjRdOworICAgIHNucHJpbnRmKHBhdGgsIDEwMjMsICIvc2RjYXJkLy4lZC50bXAiLCBnZXRwaWQoKSk7CisgICAgRklMRSAqIGZkID0gZ2V0VGVtcEZpbGVGcm9tUGF0aChwYXRoKTsKKyAgICBpZiAoZmQgPT0gTlVMTCkgeworICAgICAgICAvLyBhbnl3aGVyZSBlbHNlIHdlIGNhbiBjcmVhdGUgYSB0ZW1wIGZpbGU/CisJCS8vCSAgICBzbnByaW50ZihwYXRoLCAxMDIzLCAiL2RhdGEvZGF0YS8uJWQudG1wIiwgZ2V0cGlkKCkpOworCQkvLyAgICAgIGZkID0gZ2V0VGVtcEZpbGVGcm9tUGF0aChwYXRoKTsKKyAgICB9CisgICAgcmV0dXJuIGZkOworfQorCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgdG1wZmlsZSgpLCB3aGljaCBjb25zdHJ1Y3RzIGEgc3VpdGFibGUgZmlsZSBuYW1lCisgKiBiZWhpbmQgdGhlIHNjZW5lcy4gIFdlIGRvbid0IGhhdmUgdG8gdXNlIGluZm8tPnRlbXBfbmFtZVtdIGF0IGFsbDsKKyAqIGluZGVlZCwgd2UgY2FuJ3QgZXZlbiBmaW5kIG91dCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHRlbXAgZmlsZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIGlmICgoaW5mby0+dGVtcF9maWxlID0gZ2V0VGVtcEZpbGUoKSkgPT0gTlVMTCkKKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsICIiKTsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbS1hc2htZW0uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtLWFzaG1lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOGI2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbS1hc2htZW0uYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQorICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKworLyoKKyAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCisgKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAorICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKKyAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKiBJdCdzIGltcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIHBvcnRhYmxlIHdheTsgb3VyIGN1cnJlbnQgc29sdXRpb24gaXMKKyAqIHRvIG1ha2UgdGhlIHVzZXIgdGVsbCB1cyAod2l0aCBhIGRlZmF1bHQgdmFsdWUgc2V0IGF0IGNvbXBpbGUgdGltZSkuCisgKiBJZiB5b3UgY2FuIGFjdHVhbGx5IGdldCB0aGUgYXZhaWxhYmxlIHNwYWNlLCBpdCdzIGEgZ29vZCBpZGVhIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIG9mIDUlIG9yIHNvLgorICovCisKKyNpZm5kZWYgREVGQVVMVF9NQVhfTUVNCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBtYWtlZmlsZSAqLworI2RlZmluZSBERUZBVUxUX01BWF9NRU0JCTEwMDAwMDAwTCAvKiBkZWZhdWx0OiB0ZW4gbWVnYWJ5dGUgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCityZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIG1lbW1vdmUoYnVmZmVyX2FkZHJlc3MsIGluZm8tPmFkZHIgKyBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIG1lbW1vdmUoaW5mby0+YWRkciArIGZpbGVfb2Zmc2V0LCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIG11bm1hcChpbmZvLT5hZGRyLCBpbmZvLT5zaXplKTsKKyAgY2xvc2UoaW5mby0+dGVtcF9maWxlKTsKK30KKworTE9DQUwoaW50KQorZ2V0X2FzaG1lbShiYWNraW5nX3N0b3JlX3B0ciBpbmZvLCBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgY2hhciBwYXRoWzEwMjRdOworICBzbnByaW50ZihwYXRoLCAxMDIzLCAiJWQudG1wLmFzaG1lbSIsIGdldHBpZCgpKTsKKyAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24ocGF0aCwgdG90YWxfYnl0ZXNfbmVlZGVkKTsKKyAgaWYgKGZkID09IC0xKSB7CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IGVyciA9IGFzaG1lbV9zZXRfcHJvdF9yZWdpb24oZmQsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUpOworICBpZiAoZXJyKSB7CisgICAgICByZXR1cm4gLTE7CisgIH0KKyAgaW5mby0+YWRkciA9IG1tYXAoTlVMTCwgdG90YWxfYnl0ZXNfbmVlZGVkLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfUFJJVkFURSwgZmQsIDApOworICBpbmZvLT5zaXplID0gdG90YWxfYnl0ZXNfbmVlZGVkOworICBpbmZvLT50ZW1wX2ZpbGUgPSBmZDsKKyAgcmV0dXJuIGZkOworfQorCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKiBUaGlzIHZlcnNpb24gdXNlcyBhc2htZW0gdG8gZ2V0IGEgc2hhcmVkIG1lbW9yeSBvZiB0b3RhbC1ieXRlc19uZWVkZWQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBpZiAoZ2V0X2FzaG1lbShpbmZvLCB0b3RhbF9ieXRlc19uZWVkZWQpID09IC0xKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKK30KKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbWFuc2kuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtYW5zaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTNlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbWFuc2kuYwpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIGptZW1hbnNpLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHNpbXBsZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeXN0ZW0tCisgKiBkZXBlbmRlbnQgcG9ydGlvbiBvZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlci4gIFRoaXMgaW1wbGVtZW50YXRpb24KKyAqIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSB0aGUgQU5TSS1zdGFuZGFyZCBsaWJyYXJ5IHJvdXRpbmUgdG1wZmlsZSgpLgorICogQWxzbywgdGhlIHByb2JsZW0gb2YgZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlCisgKiBpcyBzaG92ZWQgb250byB0aGUgdXNlci4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCitleHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7CitleHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7CisjZW5kaWYKKworI2lmbmRlZiBTRUVLX1NFVAkJLyogcHJlLUFOU0kgc3lzdGVtcyBtYXkgbm90IGRlZmluZSB0aGlzOyAqLworI2RlZmluZSBTRUVLX1NFVCAgMAkJLyogaWYgbm90LCBhc3N1bWUgMCBpcyBjb3JyZWN0ICovCisjZW5kaWYKKworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIHJlZ3VsYXIgbGlicmFyeQorICogcm91dGluZXMgbWFsbG9jKCkgYW5kIGZyZWUoKS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkICopIG1hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKworLyoKKyAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCisgKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAorICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKKyAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBmcmVlKG9iamVjdCk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBjb21wdXRlcyB0aGUgdG90YWwgbWVtb3J5IHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqIEl0J3MgaW1wb3NzaWJsZSB0byBkbyB0aGlzIGluIGEgcG9ydGFibGUgd2F5OyBvdXIgY3VycmVudCBzb2x1dGlvbiBpcworICogdG8gbWFrZSB0aGUgdXNlciB0ZWxsIHVzICh3aXRoIGEgZGVmYXVsdCB2YWx1ZSBzZXQgYXQgY29tcGlsZSB0aW1lKS4KKyAqIElmIHlvdSBjYW4gYWN0dWFsbHkgZ2V0IHRoZSBhdmFpbGFibGUgc3BhY2UsIGl0J3MgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QKKyAqIGEgc2xvcCBmYWN0b3Igb2YgNSUgb3Igc28uCisgKi8KKworI2lmbmRlZiBERUZBVUxUX01BWF9NRU0JCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIG1ha2VmaWxlICovCisjZGVmaW5lIERFRkFVTFRfTUFYX01FTQkJMTAwMDAwMEwgLyogZGVmYXVsdDogb25lIG1lZ2FieXRlICovCisjZW5kaWYKKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQorICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgorICovCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGUkVBRChpbmZvLT50ZW1wX2ZpbGUsIGJ1ZmZlcl9hZGRyZXNzLCBieXRlX2NvdW50KQorICAgICAgIT0gKHNpemVfdCkgYnl0ZV9jb3VudCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoZnNlZWsoaW5mby0+dGVtcF9maWxlLCBmaWxlX29mZnNldCwgU0VFS19TRVQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIGlmIChKRldSSVRFKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfV1JJVEUpOworfQorCisKK01FVEhPRERFRih2b2lkKQorY2xvc2VfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKQoreworICBmY2xvc2UoaW5mby0+dGVtcF9maWxlKTsKKyAgLyogU2luY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRtcGZpbGUoKSB0byBjcmVhdGUgdGhlIGZpbGUsCisgICAqIG5vIGV4cGxpY2l0IGZpbGUgZGVsZXRpb24gaXMgbmVlZGVkLgorICAgKi8KK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgdG1wZmlsZSgpLCB3aGljaCBjb25zdHJ1Y3RzIGEgc3VpdGFibGUgZmlsZSBuYW1lCisgKiBiZWhpbmQgdGhlIHNjZW5lcy4gIFdlIGRvbid0IGhhdmUgdG8gdXNlIGluZm8tPnRlbXBfbmFtZVtdIGF0IGFsbDsKKyAqIGluZGVlZCwgd2UgY2FuJ3QgZXZlbiBmaW5kIG91dCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlIHRlbXAgZmlsZS4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIGlmICgoaW5mby0+dGVtcF9maWxlID0gdG1wZmlsZSgpKSA9PSBOVUxMKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV9iYWNraW5nX3N0b3JlOworICBpbmZvLT5jbG9zZV9iYWNraW5nX3N0b3JlID0gY2xvc2VfYmFja2luZ19zdG9yZTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtZG9zLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbWRvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbWRvcy5jCkBAIC0wLDAgKzEsNjM4IEBACisvKgorICogam1lbWRvcy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgYW4gTVMtRE9TLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KKyAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGVtcG9yYXJ5IGRhdGEgY2FuIGJlCisgKiBzdG9yZWQgaW4gZXh0ZW5kZWQgb3IgZXhwYW5kZWQgbWVtb3J5IGFzIHdlbGwgYXMgaW4gcmVndWxhciBET1MgZmlsZXMuCisgKgorICogSWYgeW91IHVzZSB0aGlzIGZpbGUsIHlvdSBtdXN0IGJlIHN1cmUgdGhhdCBORUVEX0ZBUl9QT0lOVEVSUyBpcyBkZWZpbmVkCisgKiBpZiB5b3UgY29tcGlsZSBpbiBhIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsOyBpdCBzaG91bGQgTk9UIGJlIGRlZmluZWQgaWYKKyAqIHlvdSB1c2UgYSBsYXJnZS1kYXRhIG1lbW9yeSBtb2RlbC4gIFRoaXMgZmlsZSBpcyBub3QgcmVjb21tZW5kZWQgaWYgeW91CisgKiBhcmUgdXNpbmcgYSBmbGF0LW1lbW9yeS1zcGFjZSAzODYgZW52aXJvbm1lbnQgc3VjaCBhcyBESkdDQyBvciBXYXRjb20gQy4KKyAqIEFsc28sIHRoaXMgY29kZSB3aWxsIE5PVCB3b3JrIGlmIHN0cnVjdCBmaWVsZHMgYXJlIGFsaWduZWQgb24gZ3JlYXRlciB0aGFuCisgKiAyLWJ5dGUgYm91bmRhcmllcy4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEdlJyBXZWlqZXJzLgorICovCisKKy8qCisgKiBJZiB5b3UgaGF2ZSBib3RoIGV4dGVuZGVkIGFuZCBleHBhbmRlZCBtZW1vcnksIHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlCisgKiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSB0cmllZCBpbiBqb3Blbl9iYWNraW5nX3N0b3JlLiAgT24gYSAyODYgbWFjaGluZQorICogZXhwYW5kZWQgbWVtb3J5IGlzIHVzdWFsbHkgZmFzdGVyLCBzaW5jZSBleHRlbmRlZCBtZW1vcnkgYWNjZXNzIGludm9sdmVzCisgKiBhbiBleHBlbnNpdmUgcHJvdGVjdGVkLW1vZGUtYW5kLWJhY2sgc3dpdGNoLiAgT24gMzg2IGFuZCBiZXR0ZXIsIGV4dGVuZGVkCisgKiBtZW1vcnkgaXMgdXN1YWxseSBmYXN0ZXIuICBBcyBkaXN0cmlidXRlZCwgdGhlIGNvZGUgdHJpZXMgZXh0ZW5kZWQgbWVtb3J5CisgKiBmaXJzdCAod2hhdD8gbm90IGV2ZXJ5b25lIGhhcyBhIDM4Nj8gOi0pLgorICoKKyAqIFlvdSBjYW4gZGlzYWJsZSB1c2Ugb2YgZXh0ZW5kZWQvZXhwYW5kZWQgbWVtb3J5IGVudGlyZWx5IGJ5IGFsdGVyaW5nIHRoZXNlCisgKiBkZWZpbml0aW9ucyBvciBvdmVycmlkaW5nIHRoZW0gZnJvbSB0aGUgTWFrZWZpbGUgKGVnLCAtREVNU19TVVBQT1JURUQ9MCkuCisgKi8KKworI2lmbmRlZiBYTVNfU1VQUE9SVEVECisjZGVmaW5lIFhNU19TVVBQT1JURUQgIDEKKyNlbmRpZgorI2lmbmRlZiBFTVNfU1VQUE9SVEVECisjZGVmaW5lIEVNU19TVVBQT1JURUQgIDEKKyNlbmRpZgorCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSB0aGVzZSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOworI2VuZGlmCisKKyNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUworCisjaWZkZWYgX19UVVJCT0NfXworLyogVGhlc2UgZGVmaW5pdGlvbnMgd29yayBmb3IgQm9ybGFuZCBDIChUdXJibyBDKSAqLworI2luY2x1ZGUgPGFsbG9jLmg+CQkvKiBuZWVkIGZhcm1hbGxvYygpLCBmYXJmcmVlKCkgKi8KKyNkZWZpbmUgZmFyX21hbGxvYyh4KQlmYXJtYWxsb2MoeCkKKyNkZWZpbmUgZmFyX2ZyZWUoeCkJZmFyZnJlZSh4KQorI2Vsc2UKKy8qIFRoZXNlIGRlZmluaXRpb25zIHdvcmsgZm9yIE1pY3Jvc29mdCBDIGFuZCBjb21wYXRpYmxlIGNvbXBpbGVycyAqLworI2luY2x1ZGUgPG1hbGxvYy5oPgkJLyogbmVlZCBfZm1hbGxvYygpLCBfZmZyZWUoKSAqLworI2RlZmluZSBmYXJfbWFsbG9jKHgpCV9mbWFsbG9jKHgpCisjZGVmaW5lIGZhcl9mcmVlKHgpCV9mZnJlZSh4KQorI2VuZGlmCisKKyNlbHNlIC8qIG5vdCBORUVEX0ZBUl9QT0lOVEVSUyAqLworCisjZGVmaW5lIGZhcl9tYWxsb2MoeCkJbWFsbG9jKHgpCisjZGVmaW5lIGZhcl9mcmVlKHgpCWZyZWUoeCkKKworI2VuZGlmIC8qIE5FRURfRkFSX1BPSU5URVJTICovCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZWxzZQorI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZW5kaWYKKworI2lmbmRlZiBVU0VfTVNET1NfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCisgIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NU0RPU19NRU1NR1IgaW4gamNvbmZpZy5oLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLworI2VuZGlmCisKKyNpZiBNQVhfQUxMT0NfQ0hVTksgPj0gNjU1MzVMCS8qIG1ha2Ugc3VyZSBqY29uZmlnLmggZ290IHRoaXMgcmlnaHQgKi8KKyAgTUFYX0FMTE9DX0NIVU5LIHNob3VsZCBiZSBsZXNzIHRoYW4gNjRLLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnJvciAqLworI2VuZGlmCisKKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgYXNzZW1ibHktbGFuZ3VhZ2Ugc3VwcG9ydCByb3V0aW5lcyAoc2VlIGptZW1kb3NhLmFzbSkuCisgKgorICogVGhlIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgImZhciIgYXMgYXJlIGFsbCB0aGVpciBwb2ludGVyIGFyZ3VtZW50czsKKyAqIHRoaXMgZW5zdXJlcyB0aGUgYXNzZW1ibHkgc291cmNlIGNvZGUgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiBjb21waWxlciBtZW1vcnkgbW9kZWwuICBXZSBhc3N1bWUgInNob3J0IiBpcyAxNiBiaXRzLCAibG9uZyIgaXMgMzIuCisgKi8KKwordHlwZWRlZiB2b2lkIGZhciAqIFhNU0RSSVZFUjsJLyogYWN0dWFsbHkgYSBwb2ludGVyIHRvIGNvZGUgKi8KK3R5cGVkZWYgc3RydWN0IHsJCS8qIHJlZ2lzdGVycyBmb3IgY2FsbGluZyBYTVMgZHJpdmVyICovCisJdW5zaWduZWQgc2hvcnQgYXgsIGR4LCBieDsKKwl2b2lkIGZhciAqIGRzX3NpOworICAgICAgfSBYTVNjb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgewkJLyogcmVnaXN0ZXJzIGZvciBjYWxsaW5nIEVNUyBkcml2ZXIgKi8KKwl1bnNpZ25lZCBzaG9ydCBheCwgZHgsIGJ4OworCXZvaWQgZmFyICogZHNfc2k7CisgICAgICB9IEVNU2NvbnRleHQ7CisKK2V4dGVybiBzaG9ydCBmYXIgamRvc19vcGVuIEpQUCgoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKSk7CitleHRlcm4gc2hvcnQgZmFyIGpkb3NfY2xvc2UgSlBQKChzaG9ydCBoYW5kbGUpKTsKK2V4dGVybiBzaG9ydCBmYXIgamRvc19zZWVrIEpQUCgoc2hvcnQgaGFuZGxlLCBsb25nIG9mZnNldCkpOworZXh0ZXJuIHNob3J0IGZhciBqZG9zX3JlYWQgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAorCQkJCXVuc2lnbmVkIHNob3J0IGNvdW50KSk7CitleHRlcm4gc2hvcnQgZmFyIGpkb3Nfd3JpdGUgSlBQKChzaG9ydCBoYW5kbGUsIHZvaWQgZmFyICogYnVmZmVyLAorCQkJCSB1bnNpZ25lZCBzaG9ydCBjb3VudCkpOworZXh0ZXJuIHZvaWQgZmFyIGp4bXNfZ2V0ZHJpdmVyIEpQUCgoWE1TRFJJVkVSIGZhciAqKSk7CitleHRlcm4gdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIEpQUCgoWE1TRFJJVkVSLCBYTVNjb250ZXh0IGZhciAqKSk7CitleHRlcm4gc2hvcnQgZmFyIGplbXNfYXZhaWxhYmxlIEpQUCgodm9pZCkpOworZXh0ZXJuIHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciBKUFAoKEVNU2NvbnRleHQgZmFyICopKTsKKworCisvKgorICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgorICogVGhpcyBpcyBoaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYW5kIHlvdSBtYXkgd2FudCB0byBjdXN0b21pemUgaXQuCisgKi8KKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworTE9DQUwodm9pZCkKK3NlbGVjdF9maWxlX25hbWUgKGNoYXIgKiBmbmFtZSkKK3sKKyAgY29uc3QgY2hhciAqIGVudjsKKyAgY2hhciAqIHB0cjsKKyAgRklMRSAqIHRmaWxlOworCisgIC8qIEtlZXAgZ2VuZXJhdGluZyBmaWxlIG5hbWVzIHRpbGwgd2UgZmluZCBvbmUgdGhhdCdzIG5vdCBpbiB1c2UgKi8KKyAgZm9yICg7OykgeworICAgIC8qIEdldCB0ZW1wIGRpcmVjdG9yeSBuYW1lIGZyb20gZW52aXJvbm1lbnQgVE1QIG9yIFRFTVAgdmFyaWFibGU7CisgICAgICogaWYgbm9uZSwgdXNlICIuIgorICAgICAqLworICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJUTVAiKSkgPT0gTlVMTCkKKyAgICAgIGlmICgoZW52ID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52KCJURU1QIikpID09IE5VTEwpCisJZW52ID0gIi4iOworICAgIGlmICgqZW52ID09ICdcMCcpCQkvKiBudWxsIHN0cmluZyBtZWFucyAiLiIgKi8KKyAgICAgIGVudiA9ICIuIjsKKyAgICBwdHIgPSBmbmFtZTsJCS8qIGNvcHkgbmFtZSB0byBmbmFtZSAqLworICAgIHdoaWxlICgqZW52ICE9ICdcMCcpCisgICAgICAqcHRyKysgPSAqZW52Kys7CisgICAgaWYgKHB0clstMV0gIT0gJ1xcJyAmJiBwdHJbLTFdICE9ICcvJykKKyAgICAgICpwdHIrKyA9ICdcXCc7CQkvKiBhcHBlbmQgYmFja3NsYXNoIGlmIG5vdCBpbiBlbnYgdmFyaWFibGUgKi8KKyAgICAvKiBBcHBlbmQgYSBzdWl0YWJsZSBmaWxlIG5hbWUgKi8KKyAgICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKyAgICBzcHJpbnRmKHB0ciwgIkpQRyUwM2QuVE1QIiwgbmV4dF9maWxlX251bSk7CisgICAgLyogUHJvYmUgdG8gc2VlIGlmIGZpbGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSAqLworICAgIGlmICgodGZpbGUgPSBmb3BlbihmbmFtZSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKQorICAgICAgYnJlYWs7CisgICAgZmNsb3NlKHRmaWxlKTsJCS8qIG9vcHMsIGl0J3MgdGhlcmU7IGNsb3NlIHRmaWxlICYgdHJ5IGFnYWluICovCisgIH0KK30KKworCisvKgorICogTmVhci1tZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgaW4gZmFyIG1lbW9yeSwgaWYgcG9zc2libGUKKyAqLworCitHTE9CQUwodm9pZCBGQVIgKikKK2pwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIHJldHVybiAodm9pZCBGQVIgKikgZmFyX21hbGxvYyhzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgZmFyX2ZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkzMDAwMDBMIC8qIGZvciB0b3RhbCB1c2FnZSBhYm91dCA0NTBLICovCisjZW5kaWYKKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICByZXR1cm4gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKK30KKworCisvKgorICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCisgKiBCYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICoganBlZ19tZW1fYXZhaWxhYmxlIGlzIGxlc3MgdGhhbiB0aGUgdG90YWwgc3BhY2UgbmVlZGVkLiAgWW91IGNhbiBkaXNwZW5zZQorICogd2l0aCB0aGVzZSByb3V0aW5lcyBpZiB5b3UgaGF2ZSBwbGVudHkgb2YgdmlydHVhbCBtZW1vcnk7IHNlZSBqbWVtbm9icy5jLgorICovCisKKy8qCisgKiBGb3IgTVMtRE9TIHdlIHN1cHBvcnQgdGhyZWUgdHlwZXMgb2YgYmFja2luZyBzdG9yYWdlOgorICogICAxLiBDb252ZW50aW9uYWwgRE9TIGZpbGVzLiAgV2UgYWNjZXNzIHRoZXNlIGJ5IGRpcmVjdCBET1MgY2FsbHMgcmF0aGVyCisgKiAgICAgIHRoYW4gdmlhIHRoZSBzdGRpbyBwYWNrYWdlLiAgVGhpcyBwcm92aWRlcyBhIGJpdCBiZXR0ZXIgcGVyZm9ybWFuY2UsCisgKiAgICAgIGJ1dCB0aGUgcmVhbCByZWFzb24gaXMgdGhhdCB0aGUgYnVmZmVycyB0byBiZSByZWFkIG9yIHdyaXR0ZW4gYXJlIEZBUi4KKyAqICAgICAgVGhlIHN0ZGlvIGxpYnJhcnkgZm9yIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVscyBjYW4ndCBjb3BlIHdpdGggdGhhdC4KKyAqICAgMi4gRXh0ZW5kZWQgbWVtb3J5LCBhY2Nlc3NlZCBwZXIgdGhlIFhNUyBWMi4wIHNwZWNpZmljYXRpb24uCisgKiAgIDMuIEV4cGFuZGVkIG1lbW9yeSwgYWNjZXNzZWQgcGVyIHRoZSBMSU0vRU1TIDQuMCBzcGVjaWZpY2F0aW9uLgorICogWW91J2xsIG5lZWQgY29waWVzIG9mIHRob3NlIHNwZWNzIHRvIG1ha2Ugc2Vuc2Ugb2YgdGhlIHJlbGF0ZWQgY29kZS4KKyAqIFRoZSBzcGVjcyBhcmUgYXZhaWxhYmxlIGJ5IEludGVybmV0IEZUUCBmcm9tIHRoZSBTSU1URUwgYXJjaGl2ZXMgCisgKiAob2FrLm9ha2xhbmQuZWR1IGFuZCBpdHMgdmFyaW91cyBtaXJyb3Igc2l0ZXMpLiAgU2VlIGZpbGVzCisgKiBwdWIvbXNkb3MvbWljcm9zb2Z0L3htczIwLmFyYyBhbmQgcHViL21zZG9zL2luZm8vbGltZW1zNDEuemlwLgorICovCisKKworLyoKKyAqIEFjY2VzcyBtZXRob2RzIGZvciBhIERPUyBmaWxlLgorICovCisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChqZG9zX3NlZWsoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBmaWxlX29mZnNldCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgLyogU2luY2UgTUFYX0FMTE9DX0NIVU5LIGlzIGxlc3MgdGhhbiA2NEssIGJ5dGVfY291bnQgd2lsbCBiZSB0b28uICovCisgIGlmIChieXRlX2NvdW50ID4gNjU1MzVMKQkvKiBzYWZldHkgY2hlY2sgKi8KKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTExPQ19DSFVOSyk7CisgIGlmIChqZG9zX3JlYWQoaW5mby0+aGFuZGxlLmZpbGVfaGFuZGxlLCBidWZmZXJfYWRkcmVzcywKKwkJKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfZmlsZV9zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBpZiAoamRvc19zZWVrKGluZm8tPmhhbmRsZS5maWxlX2hhbmRsZSwgZmlsZV9vZmZzZXQpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisgIC8qIFNpbmNlIE1BWF9BTExPQ19DSFVOSyBpcyBsZXNzIHRoYW4gNjRLLCBieXRlX2NvdW50IHdpbGwgYmUgdG9vLiAqLworICBpZiAoYnl0ZV9jb3VudCA+IDY1NTM1TCkJLyogc2FmZXR5IGNoZWNrICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOworICBpZiAoamRvc193cml0ZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUsIGJ1ZmZlcl9hZGRyZXNzLAorCQkgKHVuc2lnbmVkIHNob3J0KSBieXRlX2NvdW50KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1dSSVRFKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK2Nsb3NlX2ZpbGVfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgamRvc19jbG9zZShpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLworICByZW1vdmUoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCisvKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgcmVtb3ZlKCksIHRyeSB1bmxpbmsoKSBpbnN0ZWFkLgorICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0CisgKiB1bmxpbmsoKSB3YXMgbW9yZSBjb21tb24gaW4gcHJlLUFOU0kgc3lzdGVtcy4KKyAqLworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl9maWxlX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgc2hvcnQgaGFuZGxlOworCisgIHNlbGVjdF9maWxlX25hbWUoaW5mby0+dGVtcF9uYW1lKTsKKyAgaWYgKGpkb3Nfb3Blbigoc2hvcnQgZmFyICopICYgaGFuZGxlLCAoY2hhciBmYXIgKikgaW5mby0+dGVtcF9uYW1lKSkgeworICAgIC8qIG1pZ2h0IGFzIHdlbGwgZXhpdCBzaW5jZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZSB3aWxsIGZhaWwgYW55d2F5ICovCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbmZvLT5oYW5kbGUuZmlsZV9oYW5kbGUgPSBoYW5kbGU7CisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfZmlsZV9zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2ZpbGVfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9maWxlX3N0b3JlOworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOworICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KK30KKworCisvKgorICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4dGVuZGVkIG1lbW9yeS4KKyAqLworCisjaWYgWE1TX1NVUFBPUlRFRAorCitzdGF0aWMgWE1TRFJJVkVSIHhtc19kcml2ZXI7CS8qIHNhdmVkIGFkZHJlc3Mgb2YgWE1TIGRyaXZlciAqLworCit0eXBlZGVmIHVuaW9uIHsJCQkvKiBlaXRoZXIgbG9uZyBvZmZzZXQgb3IgcmVhbC1tb2RlIHBvaW50ZXIgKi8KKwlsb25nIG9mZnNldDsKKwl2b2lkIGZhciAqIHB0cjsKKyAgICAgIH0gWE1TUFRSOworCit0eXBlZGVmIHN0cnVjdCB7CQkvKiBYTVMgbW92ZSBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSAqLworCWxvbmcgbGVuZ3RoOworCVhNU0ggc3JjX2hhbmRsZTsKKwlYTVNQVFIgc3JjOworCVhNU0ggZHN0X2hhbmRsZTsKKwlYTVNQVFIgZHN0OworICAgICAgfSBYTVNzcGVjOworCisjZGVmaW5lIE9ERChYKQkoKChYKSAmIDFMKSAhPSAwKQorCisKK01FVEhPRERFRih2b2lkKQorcmVhZF94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBYTVNjb250ZXh0IGN0eDsKKyAgWE1Tc3BlYyBzcGVjOworICBjaGFyIGVuZGJ1ZmZlclsyXTsKKworICAvKiBUaGUgWE1TIGRyaXZlciBjYW4ndCBjb3BlIHdpdGggYW4gb2RkIGxlbmd0aCwgc28gaGFuZGxlIHRoZSBsYXN0IGJ5dGUKKyAgICogc3BlY2lhbGx5IGlmIGJ5dGVfY291bnQgaXMgb2RkLiAgV2UgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gYmUgY29tbW9uLgorICAgKi8KKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQgJiAofiAxTCk7CisgIHNwZWMuc3JjX2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOworICBzcGVjLnNyYy5vZmZzZXQgPSBmaWxlX29mZnNldDsKKyAgc3BlYy5kc3RfaGFuZGxlID0gMDsKKyAgc3BlYy5kc3QucHRyID0gYnVmZmVyX2FkZHJlc3M7CisgIAorICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1JFQUQpOworCisgIGlmIChPREQoYnl0ZV9jb3VudCkpIHsKKyAgICByZWFkX3htc19zdG9yZShjaW5mbywgaW5mbywgKHZvaWQgRkFSICopIGVuZGJ1ZmZlciwKKwkJICAgZmlsZV9vZmZzZXQgKyBieXRlX2NvdW50IC0gMUwsIDJMKTsKKyAgICAoKGNoYXIgRkFSICopIGJ1ZmZlcl9hZGRyZXNzKVtieXRlX2NvdW50IC0gMUxdID0gZW5kYnVmZmVyWzBdOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIFhNU2NvbnRleHQgY3R4OworICBYTVNzcGVjIHNwZWM7CisgIGNoYXIgZW5kYnVmZmVyWzJdOworCisgIC8qIFRoZSBYTVMgZHJpdmVyIGNhbid0IGNvcGUgd2l0aCBhbiBvZGQgbGVuZ3RoLCBzbyBoYW5kbGUgdGhlIGxhc3QgYnl0ZQorICAgKiBzcGVjaWFsbHkgaWYgYnl0ZV9jb3VudCBpcyBvZGQuICBXZSBkb24ndCBleHBlY3QgdGhpcyB0byBiZSBjb21tb24uCisgICAqLworCisgIHNwZWMubGVuZ3RoID0gYnl0ZV9jb3VudCAmICh+IDFMKTsKKyAgc3BlYy5zcmNfaGFuZGxlID0gMDsKKyAgc3BlYy5zcmMucHRyID0gYnVmZmVyX2FkZHJlc3M7CisgIHNwZWMuZHN0X2hhbmRsZSA9IGluZm8tPmhhbmRsZS54bXNfaGFuZGxlOworICBzcGVjLmRzdC5vZmZzZXQgPSBmaWxlX29mZnNldDsKKworICBjdHguZHNfc2kgPSAodm9pZCBmYXIgKikgJiBzcGVjOworICBjdHguYXggPSAweDBiMDA7CQkvKiBFTUIgbW92ZSAqLworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfWE1TX1dSSVRFKTsKKworICBpZiAoT0REKGJ5dGVfY291bnQpKSB7CisgICAgcmVhZF94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCisJCSAgIGZpbGVfb2Zmc2V0ICsgYnl0ZV9jb3VudCAtIDFMLCAyTCk7CisgICAgZW5kYnVmZmVyWzBdID0gKChjaGFyIEZBUiAqKSBidWZmZXJfYWRkcmVzcylbYnl0ZV9jb3VudCAtIDFMXTsKKyAgICB3cml0ZV94bXNfc3RvcmUoY2luZm8sIGluZm8sICh2b2lkIEZBUiAqKSBlbmRidWZmZXIsCisJCSAgICBmaWxlX29mZnNldCArIGJ5dGVfY291bnQgLSAxTCwgMkwpOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgWE1TY29udGV4dCBjdHg7CisKKyAgY3R4LmR4ID0gaW5mby0+aGFuZGxlLnhtc19oYW5kbGU7CisgIGN0eC5heCA9IDB4MGEwMDsKKyAganhtc19jYWxsZHJpdmVyKHhtc19kcml2ZXIsIChYTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19DTE9TRSwgaW5mby0+aGFuZGxlLnhtc19oYW5kbGUpOworICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl94bXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIFhNU2NvbnRleHQgY3R4OworCisgIC8qIEdldCBhZGRyZXNzIG9mIFhNUyBkcml2ZXIgKi8KKyAganhtc19nZXRkcml2ZXIoKFhNU0RSSVZFUiBmYXIgKikgJiB4bXNfZHJpdmVyKTsKKyAgaWYgKHhtc19kcml2ZXIgPT0gTlVMTCkKKyAgICByZXR1cm4gRkFMU0U7CQkvKiBubyBkcml2ZXIgdG8gYmUgaGFkICovCisKKyAgLyogR2V0IHZlcnNpb24gbnVtYmVyLCBtdXN0IGJlID49IDIuMDAgKi8KKyAgY3R4LmF4ID0gMHgwMDAwOworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCA8ICh1bnNpZ25lZCBzaG9ydCkgMHgwMjAwKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBUcnkgdG8gZ2V0IHNwYWNlIChleHByZXNzZWQgaW4ga2lsb2J5dGVzKSAqLworICBjdHguZHggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgMTAyM0wpID4+IDEwKTsKKyAgY3R4LmF4ID0gMHgwOTAwOworICBqeG1zX2NhbGxkcml2ZXIoeG1zX2RyaXZlciwgKFhNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKGN0eC5heCAhPSAxKQorICAgIHJldHVybiBGQUxTRTsKKworICAvKiBTdWNjZWVkZWQsIHNhdmUgdGhlIGhhbmRsZSBhbmQgYXdheSB3ZSBnbyAqLworICBpbmZvLT5oYW5kbGUueG1zX2hhbmRsZSA9IGN0eC5keDsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF94bXNfc3RvcmU7CisgIGluZm8tPndyaXRlX2JhY2tpbmdfc3RvcmUgPSB3cml0ZV94bXNfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV94bXNfc3RvcmU7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1hNU19PUEVOLCBjdHguZHgpOworICByZXR1cm4gVFJVRTsJCQkvKiBzdWNjZWVkZWQgKi8KK30KKworI2VuZGlmIC8qIFhNU19TVVBQT1JURUQgKi8KKworCisvKgorICogQWNjZXNzIG1ldGhvZHMgZm9yIGV4cGFuZGVkIG1lbW9yeS4KKyAqLworCisjaWYgRU1TX1NVUFBPUlRFRAorCisvKiBUaGUgRU1TIG1vdmUgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgcmVxdWlyZXMgd29yZCBhbmQgbG9uZyBmaWVsZHMgYWxpZ25lZAorICogYXQgb2RkIGJ5dGUgYm91bmRhcmllcy4gIFNvbWUgY29tcGlsZXJzIHdpbGwgYWxpZ24gc3RydWN0IGZpZWxkcyBhdCBldmVuCisgKiBieXRlIGJvdW5kYXJpZXMuICBXaGlsZSBpdCdzIHVzdWFsbHkgcG9zc2libGUgdG8gZm9yY2UgYnl0ZSBhbGlnbm1lbnQsCisgKiB0aGF0IGNhdXNlcyBhbiBvdmVyYWxsIHBlcmZvcm1hbmNlIHBlbmFsdHkgYW5kIG1heSBwb3NlIHByb2JsZW1zIGluIG1lcmdpbmcKKyAqIEpQRUcgaW50byBhIGxhcmdlciBhcHBsaWNhdGlvbi4gIEluc3RlYWQgd2UgYWNjZXB0IHNvbWUgcmF0aGVyIGRpcnR5IGNvZGUKKyAqIGhlcmUuICBOb3RlIHRoaXMgY29kZSB3b3VsZCBmYWlsIGlmIHRoZSBoYXJkd2FyZSBkaWQgbm90IGFsbG93IG9kZC1ieXRlCisgKiB3b3JkICYgbG9uZyBhY2Nlc3NlcywgYnV0IGFsbCA4MHg4NiBDUFVzIGRvLgorICovCisKK3R5cGVkZWYgdm9pZCBmYXIgKiBFTVNQVFI7CisKK3R5cGVkZWYgdW5pb24gewkJCS8qIEVNUyBtb3ZlIHNwZWNpZmljYXRpb24gc3RydWN0dXJlICovCisJbG9uZyBsZW5ndGg7CQkvKiBJdCdzIGVhc3kgdG8gYWNjZXNzIGZpcnN0IDQgYnl0ZXMgKi8KKwljaGFyIGJ5dGVzWzE4XTsJCS8qIE1pc2FsaWduZWQgZmllbGRzIGluIGhlcmUhICovCisgICAgICB9IEVNU3NwZWM7CisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIG1pc2FsaWduZWQgZmllbGRzICovCisjZGVmaW5lIEZJRUxEX0FUKHNwZWMsb2Zmc2V0LHR5cGUpICAoKigodHlwZSAqKSAmKHNwZWMuYnl0ZXNbb2Zmc2V0XSkpKQorI2RlZmluZSBTUkNfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYyw0LGNoYXIpCisjZGVmaW5lIFNSQ19IQU5ETEUoc3BlYykJRklFTERfQVQoc3BlYyw1LEVNU0gpCisjZGVmaW5lIFNSQ19PRkZTRVQoc3BlYykJRklFTERfQVQoc3BlYyw3LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBTUkNfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYyw5LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBTUkNfUFRSKHNwZWMpCQlGSUVMRF9BVChzcGVjLDcsRU1TUFRSKQorI2RlZmluZSBEU1RfVFlQRShzcGVjKQkJRklFTERfQVQoc3BlYywxMSxjaGFyKQorI2RlZmluZSBEU1RfSEFORExFKHNwZWMpCUZJRUxEX0FUKHNwZWMsMTIsRU1TSCkKKyNkZWZpbmUgRFNUX09GRlNFVChzcGVjKQlGSUVMRF9BVChzcGVjLDE0LHVuc2lnbmVkIHNob3J0KQorI2RlZmluZSBEU1RfUEFHRShzcGVjKQkJRklFTERfQVQoc3BlYywxNix1bnNpZ25lZCBzaG9ydCkKKyNkZWZpbmUgRFNUX1BUUihzcGVjKQkJRklFTERfQVQoc3BlYywxNCxFTVNQVFIpCisKKyNkZWZpbmUgRU1TUEFHRVNJWkUJMTYzODRMCS8qIGdvc3BlbCwgc2VlIHRoZSBFTVMgc3BlY3MgKi8KKworI2RlZmluZSBISUJZVEUoVykgICgoKFcpID4+IDgpICYgMHhGRikKKyNkZWZpbmUgTE9CWVRFKFcpICAoKFcpICYgMHhGRikKKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfZW1zX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCXZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCWxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgRU1TY29udGV4dCBjdHg7CisgIEVNU3NwZWMgc3BlYzsKKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7CisgIFNSQ19UWVBFKHNwZWMpID0gMTsKKyAgU1JDX0hBTkRMRShzcGVjKSA9IGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlOworICBTUkNfUEFHRShzcGVjKSAgID0gKHVuc2lnbmVkIHNob3J0KSAoZmlsZV9vZmZzZXQgLyBFTVNQQUdFU0laRSk7CisgIFNSQ19PRkZTRVQoc3BlYykgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAlIEVNU1BBR0VTSVpFKTsKKyAgRFNUX1RZUEUoc3BlYykgPSAwOworICBEU1RfSEFORExFKHNwZWMpID0gMDsKKyAgRFNUX1BUUihzcGVjKSAgICA9IGJ1ZmZlcl9hZGRyZXNzOworICAKKyAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKKyAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19SRUFEKTsKK30KKworCitNRVRIT0RERUYodm9pZCkKK3dyaXRlX2Vtc19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgRU1TY29udGV4dCBjdHg7CisgIEVNU3NwZWMgc3BlYzsKKworICBzcGVjLmxlbmd0aCA9IGJ5dGVfY291bnQ7CisgIFNSQ19UWVBFKHNwZWMpID0gMDsKKyAgU1JDX0hBTkRMRShzcGVjKSA9IDA7CisgIFNSQ19QVFIoc3BlYykgICAgPSBidWZmZXJfYWRkcmVzczsKKyAgRFNUX1RZUEUoc3BlYykgPSAxOworICBEU1RfSEFORExFKHNwZWMpID0gaW5mby0+aGFuZGxlLmVtc19oYW5kbGU7CisgIERTVF9QQUdFKHNwZWMpICAgPSAodW5zaWduZWQgc2hvcnQpIChmaWxlX29mZnNldCAvIEVNU1BBR0VTSVpFKTsKKyAgRFNUX09GRlNFVChzcGVjKSA9ICh1bnNpZ25lZCBzaG9ydCkgKGZpbGVfb2Zmc2V0ICUgRU1TUEFHRVNJWkUpOworICAKKyAgY3R4LmRzX3NpID0gKHZvaWQgZmFyICopICYgc3BlYzsKKyAgY3R4LmF4ID0gMHg1NzAwOwkJLyogbW92ZSBtZW1vcnkgcmVnaW9uICovCisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNU19XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbykKK3sKKyAgRU1TY29udGV4dCBjdHg7CisKKyAgY3R4LmF4ID0gMHg0NTAwOworICBjdHguZHggPSBpbmZvLT5oYW5kbGUuZW1zX2hhbmRsZTsKKyAgamVtc19jYWxsZHJpdmVyKChFTVNjb250ZXh0IGZhciAqKSAmIGN0eCk7CisgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0VNU19DTE9TRSwgaW5mby0+aGFuZGxlLmVtc19oYW5kbGUpOworICAvKiB3ZSBpZ25vcmUgYW55IGVycm9yIHJldHVybiBmcm9tIHRoZSBkcml2ZXIgKi8KK30KKworCitMT0NBTChib29sZWFuKQorb3Blbl9lbXNfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIEVNU2NvbnRleHQgY3R4OworCisgIC8qIElzIEVNUyBkcml2ZXIgdGhlcmU/ICovCisgIGlmICghIGplbXNfYXZhaWxhYmxlKCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEdldCBzdGF0dXMsIG1ha2Ugc3VyZSBFTVMgaXMgT0sgKi8KKyAgY3R4LmF4ID0gMHg0MDAwOworICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKEhJQllURShjdHguYXgpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIEdldCB2ZXJzaW9uLCBtdXN0IGJlID49IDQuMCAqLworICBjdHguYXggPSAweDQ2MDA7CisgIGplbXNfY2FsbGRyaXZlcigoRU1TY29udGV4dCBmYXIgKikgJiBjdHgpOworICBpZiAoSElCWVRFKGN0eC5heCkgIT0gMCB8fCBMT0JZVEUoY3R4LmF4KSA8IDB4NDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFRyeSB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgc3BhY2UgKi8KKyAgY3R4LmF4ID0gMHg0MzAwOworICBjdHguYnggPSAodW5zaWduZWQgc2hvcnQpICgodG90YWxfYnl0ZXNfbmVlZGVkICsgRU1TUEFHRVNJWkUtMUwpIC8gRU1TUEFHRVNJWkUpOworICBqZW1zX2NhbGxkcml2ZXIoKEVNU2NvbnRleHQgZmFyICopICYgY3R4KTsKKyAgaWYgKEhJQllURShjdHguYXgpICE9IDApCisgICAgcmV0dXJuIEZBTFNFOworCisgIC8qIFN1Y2NlZWRlZCwgc2F2ZSB0aGUgaGFuZGxlIGFuZCBhd2F5IHdlIGdvICovCisgIGluZm8tPmhhbmRsZS5lbXNfaGFuZGxlID0gY3R4LmR4OworICBpbmZvLT5yZWFkX2JhY2tpbmdfc3RvcmUgPSByZWFkX2Vtc19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2Vtc19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2Vtc19zdG9yZTsKKyAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfRU1TX09QRU4sIGN0eC5keCk7CisgIHJldHVybiBUUlVFOwkJCS8qIHN1Y2NlZWRlZCAqLworfQorCisjZW5kaWYgLyogRU1TX1NVUFBPUlRFRCAqLworCisKKy8qCisgKiBJbml0aWFsIG9wZW5pbmcgb2YgYSBiYWNraW5nLXN0b3JlIG9iamVjdC4KKyAqLworCitHTE9CQUwodm9pZCkKK2pwZWdfb3Blbl9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpCit7CisgIC8qIFRyeSBleHRlbmRlZCBtZW1vcnksIHRoZW4gZXhwYW5kZWQgbWVtb3J5LCB0aGVuIHJlZ3VsYXIgZmlsZS4gKi8KKyNpZiBYTVNfU1VQUE9SVEVECisgIGlmIChvcGVuX3htc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisjZW5kaWYKKyNpZiBFTVNfU1VQUE9SVEVECisgIGlmIChvcGVuX2Vtc19zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisjZW5kaWYKKyAgaWYgKG9wZW5fZmlsZV9zdG9yZShjaW5mbywgaW5mbywgdG90YWxfYnl0ZXNfbmVlZGVkKSkKKyAgICByZXR1cm47CisgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIiIpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBuZXh0X2ZpbGVfbnVtID0gMDsJCS8qIGluaXRpYWxpemUgdGVtcCBmaWxlIG5hbWUgZ2VuZXJhdG9yICovCisgIHJldHVybiBERUZBVUxUX01BWF9NRU07CS8qIGRlZmF1bHQgZm9yIG1heF9tZW1vcnlfdG9fdXNlICovCit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBNaWNyb3NvZnQgQywgYXQgbGVhc3QgaW4gdjYuMDBBLCB3aWxsIG5vdCBzdWNjZXNzZnVsbHkgcmVjbGFpbSBmcmVlZAorICAgKiBibG9ja3Mgb2Ygc2l6ZSA+IDMyS2J5dGVzIHVubGVzcyB3ZSBnaXZlIGl0IGEga2ljayBpbiB0aGUgcmVhciwgbGlrZSBzbzoKKyAgICovCisjaWZkZWYgTkVFRF9GSEVBUE1JTgorICBfZmhlYXBtaW4oKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1kb3NhLmFzbSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtZG9zYS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkNDM3MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtZG9zYS5hc20KQEAgLTAsMCArMSwzNzkgQEAKKzsKKzsgam1lbWRvc2EuYXNtCis7Cis7IENvcHlyaWdodCAoQykgMTk5MiwgVGhvbWFzIEcuIExhbmUuCis7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCis7IEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKzsKKzsgVGhpcyBmaWxlIGNvbnRhaW5zIGxvdy1sZXZlbCBpbnRlcmZhY2Ugcm91dGluZXMgdG8gc3VwcG9ydCB0aGUgTVMtRE9TCis7IGJhY2tpbmcgc3RvcmUgbWFuYWdlciAoam1lbWRvcy5jKS4gIFJvdXRpbmVzIGFyZSBwcm92aWRlZCB0byBhY2Nlc3MgZGlzaworOyBmaWxlcyB0aHJvdWdoIGRpcmVjdCBET1MgY2FsbHMsIGFuZCB0byBhY2Nlc3MgWE1TIGFuZCBFTVMgZHJpdmVycy4KKzsKKzsgVGhpcyBmaWxlIHNob3VsZCBhc3NlbWJsZSB3aXRoIE1pY3Jvc29mdCdzIE1BU00gb3IgYW55IGNvbXBhdGlibGUKKzsgYXNzZW1ibGVyIChpbmNsdWRpbmcgQm9ybGFuZCdzIFR1cmJvIEFzc2VtYmxlcikuICBJZiB5b3UgaGF2ZW4ndCBnb3QKKzsgYSBjb21wYXRpYmxlIGFzc2VtYmxlciwgYmV0dGVyIGZhbGwgYmFjayB0byBqbWVtYW5zaS5jIG9yIGptZW1uYW1lLmMuCis7Cis7IFRvIG1pbmltaXplIGRlcGVuZGVuY2Ugb24gdGhlIEMgY29tcGlsZXIncyByZWdpc3RlciB1c2FnZSBjb252ZW50aW9ucywKKzsgd2Ugc2F2ZSBhbmQgcmVzdG9yZSBhbGwgODA4NiByZWdpc3RlcnMsIGV2ZW4gdGhvdWdoIG1vc3QgY29tcGlsZXJzIG9ubHkKKzsgcmVxdWlyZSBTSSxESSxEUyB0byBiZSBwcmVzZXJ2ZWQuICBBbHNvLCB3ZSB1c2Ugb25seSAxNi1iaXQtd2lkZSByZXR1cm4KKzsgdmFsdWVzLCB3aGljaCBldmVyeWJvZHkgcmV0dXJucyBpbiBBWC4KKzsKKzsgQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBHZScgV2VpamVycy4KKzsKKworSk1FTURPU0FfVFhUCXNlZ21lbnQgYnl0ZSBwdWJsaWMgJ0NPREUnCisKKwkJYXNzdW1lCWNzOkpNRU1ET1NBX1RYVAorCisJCXB1YmxpYwlfamRvc19vcGVuCisJCXB1YmxpYwlfamRvc19jbG9zZQorCQlwdWJsaWMJX2pkb3Nfc2VlaworCQlwdWJsaWMJX2pkb3NfcmVhZAorCQlwdWJsaWMJX2pkb3Nfd3JpdGUKKwkJcHVibGljCV9qeG1zX2dldGRyaXZlcgorCQlwdWJsaWMJX2p4bXNfY2FsbGRyaXZlcgorCQlwdWJsaWMJX2plbXNfYXZhaWxhYmxlCisJCXB1YmxpYwlfamVtc19jYWxsZHJpdmVyCisKKzsKKzsgc2hvcnQgZmFyIGpkb3Nfb3BlbiAoc2hvcnQgZmFyICogaGFuZGxlLCBjaGFyIGZhciAqIGZpbGVuYW1lKQorOworOyBDcmVhdGUgYW5kIG9wZW4gYSB0ZW1wb3JhcnkgZmlsZQorOworX2pkb3Nfb3Blbglwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92CWN4LDAJCQk7IG5vcm1hbCBmaWxlIGF0dHJpYnV0ZXMKKwkJbGRzCWR4LGR3b3JkIHB0ciBbYnArMTBdCTsgZ2V0IGZpbGVuYW1lIHBvaW50ZXIKKwkJbW92CWFoLDNjaAkJCTsgY3JlYXRlIGZpbGUKKwkJaW50CTIxaAorCQlqYwlvcGVuX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCisJCWxkcwlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IGhhbmRsZSBwb2ludGVyCisJCW1vdgl3b3JkIHB0ciBbYnhdLGF4CTsgc2F2ZSB0aGUgaGFuZGxlCisJCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCitvcGVuX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3Nfb3BlbgllbmRwCisKKworOworOyBzaG9ydCBmYXIgamRvc19jbG9zZSAoc2hvcnQgaGFuZGxlKQorOworOyBDbG9zZSB0aGUgZmlsZSBoYW5kbGUKKzsKK19qZG9zX2Nsb3NlCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbW92CWFoLDNlaAkJCTsgY2xvc2UgZmlsZQorCQlpbnQJMjFoCisJCWpjCWNsb3NlX2VycgkJOyBpZiBmYWlsZWQsIHJldHVybiBlcnJvciBjb2RlCisJCXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCitjbG9zZV9lcnI6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qZG9zX2Nsb3NlCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX3NlZWsgKHNob3J0IGhhbmRsZSwgbG9uZyBvZmZzZXQpCis7Cis7IFNldCBmaWxlIHBvc2l0aW9uCis7CitfamRvc19zZWVrCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbW92CWR4LHdvcmQgcHRyIFticCs4XQk7IExTIG9mZnNldAorCQltb3YJY3gsd29yZCBwdHIgW2JwKzEwXQk7IE1TIG9mZnNldAorCQltb3YJYXgsNDIwMGgJCTsgYWJzb2x1dGUgc2VlaworCQlpbnQJMjFoCisJCWpjCXNlZWtfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK3NlZWtfZXJyOglwb3AJZHMJCQk7IHJlc3RvcmUgcmVnaXN0ZXJzIGFuZCBleGl0CisJCXBvcAllcworCQlwb3AJZHgKKwkJcG9wCWN4CisJCXBvcAlieAorCQlwb3AJZGkKKwkJcG9wCXNpCisJCXBvcCAJYnAKKwkJcmV0CitfamRvc19zZWVrCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZG9zX3JlYWQgKHNob3J0IGhhbmRsZSwgdm9pZCBmYXIgKiBidWZmZXIsIHVuc2lnbmVkIHNob3J0IGNvdW50KQorOworOyBSZWFkIGZyb20gZmlsZQorOworX2pkb3NfcmVhZAlwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92CWJ4LHdvcmQgcHRyIFticCs2XQk7IGZpbGUgaGFuZGxlCisJCWxkcwlkeCxkd29yZCBwdHIgW2JwKzhdCTsgYnVmZmVyIGFkZHJlc3MKKwkJbW92CWN4LHdvcmQgcHRyIFticCsxMl0JOyBudW1iZXIgb2YgYnl0ZXMKKwkJbW92CWFoLDNmaAkJCTsgcmVhZCBmaWxlCisJCWludAkyMWgKKwkJamMJcmVhZF9lcnIJCTsgaWYgZmFpbGVkLCByZXR1cm4gZXJyb3IgY29kZQorCQljbXAJYXgsd29yZCBwdHIgW2JwKzEyXQk7IG1ha2Ugc3VyZSBhbGwgYnl0ZXMgd2VyZSByZWFkCisJCWplCXJlYWRfb2sKKwkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSworCQlqbXAJc2hvcnQgcmVhZF9lcnIKK3JlYWRfb2s6CXhvcglheCxheAkJCTsgcmV0dXJuIHplcm8gZm9yIE9LCityZWFkX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3NfcmVhZAllbmRwCisKKworOworOyBzaG9ydCBmYXIgamRvc193cml0ZSAoc2hvcnQgaGFuZGxlLCB2b2lkIGZhciAqIGJ1ZmZlciwgdW5zaWduZWQgc2hvcnQgY291bnQpCis7Cis7IFdyaXRlIHRvIGZpbGUKKzsKK19qZG9zX3dyaXRlCXByb2MJZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYngsd29yZCBwdHIgW2JwKzZdCTsgZmlsZSBoYW5kbGUKKwkJbGRzCWR4LGR3b3JkIHB0ciBbYnArOF0JOyBidWZmZXIgYWRkcmVzcworCQltb3YJY3gsd29yZCBwdHIgW2JwKzEyXQk7IG51bWJlciBvZiBieXRlcworCQltb3YJYWgsNDBoCQkJOyB3cml0ZSBmaWxlCisJCWludAkyMWgKKwkJamMJd3JpdGVfZXJyCQk7IGlmIGZhaWxlZCwgcmV0dXJuIGVycm9yIGNvZGUKKwkJY21wCWF4LHdvcmQgcHRyIFticCsxMl0JOyBtYWtlIHN1cmUgYWxsIGJ5dGVzIHdyaXR0ZW4KKwkJamUJd3JpdGVfb2sKKwkJbW92CWF4LDEJCQk7IGVsc2UgcmV0dXJuIDEgZm9yIG5vdCBPSworCQlqbXAJc2hvcnQgd3JpdGVfZXJyCit3cml0ZV9vazoJeG9yCWF4LGF4CQkJOyByZXR1cm4gemVybyBmb3IgT0sKK3dyaXRlX2VycjoJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AgCWJwCisJCXJldAorX2pkb3Nfd3JpdGUJZW5kcAorCisKKzsKKzsgdm9pZCBmYXIganhtc19nZXRkcml2ZXIgKFhNU0RSSVZFUiBmYXIgKikKKzsKKzsgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBYTVMgZHJpdmVyLCBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUKKzsKK19qeG1zX2dldGRyaXZlcglwcm9jCWZhcgorCQlwdXNoCWJwCQkJOyBsaW5rYWdlCisJCW1vdiAJYnAsc3AKKwkJcHVzaAlzaQkJCTsgc2F2ZSBhbGwgcmVnaXN0ZXJzIGZvciBzYWZldHkKKwkJcHVzaAlkaQorCQlwdXNoCWJ4CisJCXB1c2gJY3gKKwkJcHVzaAlkeAorCQlwdXNoCWVzCisJCXB1c2gJZHMKKwkJbW92IAlheCw0MzAwaAkJOyBjYWxsIG11bHRpcGxleCBpbnRlcnJ1cHQgd2l0aAorCQlpbnQJMmZoCQkJOyBhIG1hZ2ljIGNvb2tpZSwgaGV4IDQzMDAKKwkJY21wIAlhbCw4MGgJCQk7IEFMIHNob3VsZCBjb250YWluIGhleCA4MAorCQlqZQl4bXNhdmFpbAorCQl4b3IgCWR4LGR4CQkJOyBubyBYTVMgZHJpdmVyIGF2YWlsYWJsZQorCQl4b3IgCWF4LGF4CQkJOyByZXR1cm4gYSBuaWwgcG9pbnRlcgorCQlqbXAJc2hvcnQgeG1zYXZhaWxfZG9uZQoreG1zYXZhaWw6CW1vdiAJYXgsNDMxMGgJCTsgZmV0Y2ggZHJpdmVyIGFkZHJlc3Mgd2l0aAorCQlpbnQJMmZoCQkJOyBhbm90aGVyIG1hZ2ljIGNvb2tpZQorCQltb3YgCWR4LGVzCQkJOyBjb3B5IGFkZHJlc3MgdG8gZHg6YXgKKwkJbW92IAlheCxieAoreG1zYXZhaWxfZG9uZToJbGVzIAlieCxkd29yZCBwdHIgW2JwKzZdCTsgZ2V0IHBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlCisJCW1vdgl3b3JkIHB0ciBlczpbYnhdLGF4CisJCW1vdgl3b3JkIHB0ciBlczpbYngrMl0sZHgKKwkJcG9wCWRzCQkJOyByZXN0b3JlIHJlZ2lzdGVycyBhbmQgZXhpdAorCQlwb3AJZXMKKwkJcG9wCWR4CisJCXBvcAljeAorCQlwb3AJYngKKwkJcG9wCWRpCisJCXBvcAlzaQorCQlwb3AJYnAKKwkJcmV0Citfanhtc19nZXRkcml2ZXIJZW5kcAorCisKKzsKKzsgdm9pZCBmYXIganhtc19jYWxsZHJpdmVyIChYTVNEUklWRVIsIFhNU2NvbnRleHQgZmFyICopCis7Cis7IFRoZSBYTVNjb250ZXh0IHN0cnVjdHVyZSBjb250YWlucyB2YWx1ZXMgZm9yIHRoZSBBWCxEWCxCWCxTSSxEUyByZWdpc3RlcnMuCis7IFRoZXNlIGFyZSBsb2FkZWQsIHRoZSBYTVMgY2FsbCBpcyBwZXJmb3JtZWQsIGFuZCB0aGUgbmV3IHZhbHVlcyBvZiB0aGUKKzsgQVgsRFgsQlggcmVnaXN0ZXJzIGFyZSB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbnRleHQgc3RydWN0dXJlLgorOworX2p4bXNfY2FsbGRyaXZlciAJcHJvYwlmYXIKKwkJcHVzaAlicAkJCTsgbGlua2FnZQorCQltb3YgCWJwLHNwCisJCXB1c2gJc2kJCQk7IHNhdmUgYWxsIHJlZ2lzdGVycyBmb3Igc2FmZXR5CisJCXB1c2gJZGkKKwkJcHVzaAlieAorCQlwdXNoCWN4CisJCXB1c2gJZHgKKwkJcHVzaAllcworCQlwdXNoCWRzCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCisJCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCisJCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCisJCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCisJCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCisJCWNhbGwJZHdvcmQgcHRyIFticCs2XQk7IGNhbGwgdGhlIGRyaXZlcgorCQltb3YJY3gsYngJCQk7IHNhdmUgcmV0dXJuZWQgQlggZm9yIGEgc2VjCisJCWxlcyAJYngsZHdvcmQgcHRyIFticCsxMF0JOyBnZXQgWE1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4CisJCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qeG1zX2NhbGxkcml2ZXIgCWVuZHAKKworCis7Cis7IHNob3J0IGZhciBqZW1zX2F2YWlsYWJsZSAodm9pZCkKKzsKKzsgSGF2ZSB3ZSBnb3QgYW4gRU1TIGRyaXZlcj8gKHRoaXMgY29tZXMgc3RyYWlnaHQgZnJvbSB0aGUgRU1TIDQuMCBzcGVjcykKKzsKK19qZW1zX2F2YWlsYWJsZQlwcm9jCWZhcgorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQltb3YJYXgsMzU2N2gJCTsgZ2V0IGludGVycnVwdCB2ZWN0b3IgNjdoCisJCWludAkyMWgKKwkJcHVzaAljcworCQlwb3AJZHMKKwkJbW92CWRpLDAwMGFoCQk7IGNoZWNrIG9mZnMgMTAgaW4gcmV0dXJuZWQgc2VnCisJCWxlYQlzaSxBU0NJSV9kZXZpY2VfbmFtZQk7IGFnYWluc3QgbGl0ZXJhbCBzdHJpbmcKKwkJbW92CWN4LDgKKwkJY2xkCisJCXJlcGUgY21wc2IKKwkJam5lCW5vX2VtcworCQltb3YJYXgsMQkJCTsgbWF0Y2gsIGl0J3MgdGhlcmUKKwkJam1wCXNob3J0IGF2YWlsX2RvbmUKK25vX2VtczoJCXhvcglheCxheAkJCTsgaXQncyBub3QgdGhlcmUKK2F2YWlsX2RvbmU6CXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcmV0CisKK0FTQ0lJX2RldmljZV9uYW1lCWRiCSJFTU1YWFhYMCIKKworX2plbXNfYXZhaWxhYmxlCWVuZHAKKworCis7Cis7IHZvaWQgZmFyIGplbXNfY2FsbGRyaXZlciAoRU1TY29udGV4dCBmYXIgKikKKzsKKzsgVGhlIEVNU2NvbnRleHQgc3RydWN0dXJlIGNvbnRhaW5zIHZhbHVlcyBmb3IgdGhlIEFYLERYLEJYLFNJLERTIHJlZ2lzdGVycy4KKzsgVGhlc2UgYXJlIGxvYWRlZCwgdGhlIEVNUyB0cmFwIGlzIHBlcmZvcm1lZCwgYW5kIHRoZSBuZXcgdmFsdWVzIG9mIHRoZQorOyBBWCxEWCxCWCByZWdpc3RlcnMgYXJlIHdyaXR0ZW4gYmFjayB0byB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCis7CitfamVtc19jYWxsZHJpdmVyCXByb2MgZmFyCisJCXB1c2gJYnAJCQk7IGxpbmthZ2UKKwkJbW92IAlicCxzcAorCQlwdXNoCXNpCQkJOyBzYXZlIGFsbCByZWdpc3RlcnMgZm9yIHNhZmV0eQorCQlwdXNoCWRpCisJCXB1c2gJYngKKwkJcHVzaAljeAorCQlwdXNoCWR4CisJCXB1c2gJZXMKKwkJcHVzaAlkcworCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJYXgsd29yZCBwdHIgZXM6W2J4XQk7IGxvYWQgcmVnaXN0ZXJzCisJCW1vdiAJZHgsd29yZCBwdHIgZXM6W2J4KzJdCisJCW1vdiAJc2ksd29yZCBwdHIgZXM6W2J4KzZdCisJCW1vdiAJZHMsd29yZCBwdHIgZXM6W2J4KzhdCisJCW1vdiAJYngsd29yZCBwdHIgZXM6W2J4KzRdCisJCWludAk2N2gJCQk7IGNhbGwgdGhlIEVNUyBkcml2ZXIKKwkJbW92CWN4LGJ4CQkJOyBzYXZlIHJldHVybmVkIEJYIGZvciBhIHNlYworCQlsZXMgCWJ4LGR3b3JkIHB0ciBbYnArNl0JOyBnZXQgRU1TY29udGV4dCBwb2ludGVyCisJCW1vdiAJd29yZCBwdHIgZXM6W2J4XSxheAk7IHB1dCBiYWNrIGF4LGR4LGJ4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzJdLGR4CisJCW1vdiAJd29yZCBwdHIgZXM6W2J4KzRdLGN4CisJCXBvcAlkcwkJCTsgcmVzdG9yZSByZWdpc3RlcnMgYW5kIGV4aXQKKwkJcG9wCWVzCisJCXBvcAlkeAorCQlwb3AJY3gKKwkJcG9wCWJ4CisJCXBvcAlkaQorCQlwb3AJc2kKKwkJcG9wIAlicAorCQlyZXQKK19qZW1zX2NhbGxkcml2ZXIJZW5kcAorCitKTUVNRE9TQV9UWFQJZW5kcworCisJCWVuZApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1tYWMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ZjliZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtbWFjLmMKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBqbWVtbWFjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIGptZW1tYWMuYyBwcm92aWRlcyBhbiBBcHBsZSBNYWNpbnRvc2ggaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KKyAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLgorICoKKyAqIElmIHlvdSB1c2Ugam1lbW1hYy5jLCB0aGVuIHlvdSBtdXN0IGRlZmluZSBVU0VfTUFDX01FTU1HUiBpbiB0aGUKKyAqIEpQRUdfSU5URVJOQUxTIHBhcnQgb2YgamNvbmZpZy5oLgorICoKKyAqIGptZW1tYWMuYyB1c2VzIHRoZSBNYWNpbnRvc2ggdG9vbGJveCByb3V0aW5lcyBOZXdQdHIgYW5kIERpc3Bvc2VQdHIKKyAqIGluc3RlYWQgb2YgbWFsbG9jIGFuZCBmcmVlLiAgSXQgYWNjdXJhdGVseSBkZXRlcm1pbmVzIHRoZSBhbW91bnQgb2YKKyAqIG1lbW9yeSBhdmFpbGFibGUgYnkgdXNpbmcgQ29tcGFjdE1lbS4gIE5vdGljZSB0aGF0IGlmIGxlZnQgdG8gaXRzCisgKiBvd24gZGV2aWNlcywgdGhpcyBjb2RlIGNhbiBjaGV3IHVwIGFsbCBhdmFpbGFibGUgc3BhY2UgaW4gdGhlCisgKiBhcHBsaWNhdGlvbidzIHpvbmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcmF0aGVyIHNtYWxsICJzbG9wIgorICogZmFjdG9yIGNvbXB1dGVkIGluIGpwZWdfbWVtX2F2YWlsYWJsZSgpLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBlbnN1cmUKKyAqIHRoYXQgbW9yZSBzcGFjZSBpcyBsZWZ0IG92ZXIgYnkgcmVkdWNpbmcgbWF4X21lbW9yeV90b191c2UuCisgKgorICogTGFyZ2UgaW1hZ2VzIGFyZSBzd2FwcGVkIHRvIGRpc2sgdXNpbmcgdGVtcG9yYXJ5IGZpbGVzIGFuZCBTeXN0ZW0gNy4wKydzCisgKiB0ZW1wb3JhcnkgZm9sZGVyIGZ1bmN0aW9uYWxpdHkuCisgKgorICogTm90ZSB0aGF0IGptZW1tYWMuYyBkZXBlbmRzIG9uIHR3byBmZWF0dXJlcyBvZiBNYWNPUyB0aGF0IHdlcmUgZmlyc3QKKyAqIGludHJvZHVjZWQgaW4gU3lzdGVtIDc6IEZpbmRGb2xkZXIgYW5kIHRoZSBGU1NwZWMtYmFzZWQgY2FsbHMuCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgam1lbW1hYy5jIGFuZCBpcyBydW4gdW5kZXIgU3lzdGVtIDYgb3IgZWFybGllciwKKyAqIGFuZCB0aGUganBlZyBsaWJyYXJ5IGRlY2lkZXMgaXQgbmVlZHMgYSB0ZW1wb3JhcnkgZmlsZSwgaXQgd2lsbCBhYm9ydCwKKyAqIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzIGFib3V0IHJlcXVpcmluZyBTeXN0ZW0gNy4gIChJZiBubyB0ZW1wb3JhcnkgZmlsZXMKKyAqIGFyZSBjcmVhdGVkLCBpdCB3aWxsIHJ1biBmaW5lLikKKyAqCisgKiBJZiB5b3Ugd2FudCB0byB1c2Ugam1lbW1hYy5jIGluIGFuIGFwcGxpY2F0aW9uIHRoYXQgbWlnaHQgYmUgdXNlZCB3aXRoCisgKiBTeXN0ZW0gNiBvciBlYXJsaWVyLCB0aGVuIHlvdSBzaG91bGQgcmVtb3ZlIGRlcGVuZGVuY2llcyBvbiBGaW5kRm9sZGVyCisgKiBhbmQgdGhlIEZTU3BlYyBjYWxscy4gIFlvdSB3aWxsIG5lZWQgdG8gcmVwbGFjZSBGaW5kRm9sZGVyIHdpdGggc29tZQorICogb3RoZXIgbWVjaGFuaXNtIGZvciBmaW5kaW5nIGEgcGxhY2UgdG8gcHV0IHRlbXBvcmFyeSBmaWxlcywgYW5kIHlvdQorICogc2hvdWxkIHJlcGxhY2UgdGhlIEZTU3BlYyBjYWxscyB3aXRoIHRoZWlyIEhGUyBlcXVpdmFsZW50czoKKyAqCisgKiAgICAgRlNwRGVsZXRlICAgICAtPiAgSERlbGV0ZQorICogICAgIEZTcEdldEZJbmZvICAgLT4gIEhHZXRGSW5mbworICogICAgIEZTcENyZWF0ZSAgICAgLT4gIEhDcmVhdGUKKyAqICAgICBGU3BPcGVuREYgICAgIC0+ICBIT3BlbiAgICAgICoqKiBOb3RlOiBub3QgSE9wZW5ERiAqKioKKyAqICAgICBGU01ha2VGU1NwZWMgIC0+ICAoZmlsbCBpbiBzcGVjIGJ5IGhhbmQuKQorICoKKyAqIChVc2UgSE9wZW4gaW5zdGVhZCBvZiBIT3BlbkRGLiAgSE9wZW4gaXMganVzdCBhIGdsdWUtaW50ZXJmYWNlIHRvIFBCSE9wZW4sCisgKiB3aGljaCBpcyBvbiBhbGwgSEZTIG1hY3MuICBIT3BlbkRGIGlzIGEgU3lzdGVtIDcgYWRkaXRpb24gd2hpY2ggYXZvaWRzIHRoZQorICogYWdlcy1vbGQgcHJvYmxlbSBvZiBuYW1lcyBzdGFydGluZyB3aXRoIGEgcGVyaW9kLikKKyAqCisgKiBDb250cmlidXRlZCBieSBTYW0gQnVzaGVsbCAoanNhbUBpYWd1Lm9uLm5ldCkgYW5kCisgKiBEYW4gR2lsZG9yIChneWxkQGluLXRvdWNoLmNvbSkuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIgICAgLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLworCisjaWZuZGVmIFVTRV9NQUNfTUVNTUdSCS8qIG1ha2Ugc3VyZSB1c2VyIGdvdCBjb25maWd1cmF0aW9uIHJpZ2h0ICovCisgIFlvdSBmb3Jnb3QgdG8gZGVmaW5lIFVTRV9NQUNfTUVNTUdSIGluIGpjb25maWcuaC4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyb3IgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8TWVtb3J5Lmg+ICAgICAvKiB3ZSB1c2UgdGhlIE1hY09TIG1lbW9yeSBtYW5hZ2VyICovCisjaW5jbHVkZSA8RmlsZXMuaD4gICAgICAvKiB3ZSB1c2UgdGhlIE1hY09TIEZpbGUgc3R1ZmYgKi8KKyNpbmNsdWRlIDxGb2xkZXJzLmg+ICAgIC8qIHdlIHVzZSB0aGUgTWFjT1MgSEZTIHN0dWZmICovCisjaW5jbHVkZSA8U2NyaXB0Lmg+ICAgICAvKiBmb3Igc21TeXN0ZW1TY3JpcHQgKi8KKyNpbmNsdWRlIDxHZXN0YWx0Lmg+ICAgIC8qIHdlIHVzZSBHZXN0YWx0IHRvIHRlc3QgZm9yIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgKi8KKworI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiSlBHJTAzZC5UTVAiCisjZW5kaWYKKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworCisvKgorICogTWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIE1hY09TIGxpYnJhcnkKKyAqIHJvdXRpbmVzIE5ld1B0cigpIGFuZCBEaXNwb3NlUHRyKCksIHdoaWNoIGFsbG9jYXRlIGZpeGVkLWFkZHJlc3MKKyAqIHN0b3JhZ2UuICBVbmZvcnR1bmF0ZWx5LCB0aGUgSUpHIGxpYnJhcnkgaXNuJ3Qgc21hcnQgZW5vdWdoIHRvIGNvcGUKKyAqIHdpdGggcmVsb2NhdGFibGUgc3RvcmFnZS4KKyAqLworCitHTE9CQUwodm9pZCAqKQoranBlZ19nZXRfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkICopIE5ld1B0cihzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICBEaXNwb3NlUHRyKChQdHIpIG9iamVjdCk7Cit9CisKKworLyoKKyAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCisgKiBOQjogd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zIHNpbXBseSBmb3IKKyAqIGNvbnNpc3RlbmN5IHdpdGggdGhlIHJlc3Qgb2YgdGhlIElKRyBjb2RlOyBGQVIgc2hvdWxkIGV4cGFuZCB0byBlbXB0eQorICogb24gcmF0aW9uYWwgYXJjaGl0ZWN0dXJlcyBsaWtlIHRoZSBNYWMuCisgKi8KKworR0xPQkFMKHZvaWQgRkFSICopCitqcGVnX2dldF9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgRkFSICopIE5ld1B0cihzaXplb2ZvYmplY3QpOworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfZnJlZV9sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgRGlzcG9zZVB0cigoUHRyKSBvYmplY3QpOworfQorCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAorCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQoreworICBsb25nIGxpbWl0ID0gY2luZm8tPm1lbS0+bWF4X21lbW9yeV90b191c2UgLSBhbHJlYWR5X2FsbG9jYXRlZDsKKyAgbG9uZyBzbG9wLCBtZW07CisKKyAgLyogRG9uJ3QgYXNrIGZvciBtb3JlIHRoYW4gd2hhdCBhcHBsaWNhdGlvbiBoYXMgdG9sZCB1cyB3ZSBtYXkgdXNlICovCisgIGlmIChtYXhfYnl0ZXNfbmVlZGVkID4gbGltaXQgJiYgbGltaXQgPiAwKQorICAgIG1heF9ieXRlc19uZWVkZWQgPSBsaW1pdDsKKyAgLyogRmluZCB3aGV0aGVyIHRoZXJlJ3MgYSBiaWcgZW5vdWdoIGZyZWUgYmxvY2sgaW4gdGhlIGhlYXAuCisgICAqIENvbXBhY3RNZW0gdHJpZXMgdG8gY3JlYXRlIGEgY29udGlndW91cyBibG9jayBvZiB0aGUgcmVxdWVzdGVkIHNpemUsCisgICAqIGFuZCB0aGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGxhcmdlc3QgZnJlZSBibG9jayAod2hpY2ggY291bGQgYmUKKyAgICogbXVjaCBtb3JlIG9yIG11Y2ggbGVzcyB0aGFuIHdlIGFza2VkIGZvcikuCisgICAqIFdlIGFkZCBzb21lIHNsb3AgdG8gZW5zdXJlIHdlIGRvbid0IHVzZSB1cCBhbGwgYXZhaWxhYmxlIG1lbW9yeS4KKyAgICovCisgIHNsb3AgPSBtYXhfYnl0ZXNfbmVlZGVkIC8gMTYgKyAzMjc2OEw7CisgIG1lbSA9IENvbXBhY3RNZW0obWF4X2J5dGVzX25lZWRlZCArIHNsb3ApIC0gc2xvcDsKKyAgaWYgKG1lbSA8IDApCisgICAgbWVtID0gMDsJCQkvKiBzaWdoLCBjb3VsZG4ndCBldmVuIGdldCB0aGUgc2xvcCAqLworICAvKiBEb24ndCB0YWtlIG1vcmUgdGhhbiB0aGUgYXBwbGljYXRpb24gc2F5cyB3ZSBjYW4gaGF2ZSAqLworICBpZiAobWVtID4gbGltaXQgJiYgbGltaXQgPiAwKQorICAgIG1lbSA9IGxpbWl0OworICByZXR1cm4gbWVtOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgbG9uZyBieXRlcyA9IGJ5dGVfY291bnQ7CisgIGxvbmcgcmV0VmFsOworCisgIGlmICggU2V0RlBvcyAoIGluZm8tPnRlbXBfZmlsZSwgZnNGcm9tU3RhcnQsIGZpbGVfb2Zmc2V0ICkgIT0gbm9FcnIgKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfU0VFSyk7CisKKyAgcmV0VmFsID0gRlNSZWFkICggaW5mby0+dGVtcF9maWxlLCAmYnl0ZXMsCisJCSAgICAodW5zaWduZWQgY2hhciAqKSBidWZmZXJfYWRkcmVzcyApOworICBpZiAoIHJldFZhbCAhPSBub0VyciB8fCBieXRlcyAhPSBieXRlX2NvdW50ICkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1JFQUQpOworfQorCisKK01FVEhPRERFRih2b2lkKQord3JpdGVfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KQoreworICBsb25nIGJ5dGVzID0gYnl0ZV9jb3VudDsKKyAgbG9uZyByZXRWYWw7CisKKyAgaWYgKCBTZXRGUG9zICggaW5mby0+dGVtcF9maWxlLCBmc0Zyb21TdGFydCwgZmlsZV9vZmZzZXQgKSAhPSBub0VyciApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKworICByZXRWYWwgPSBGU1dyaXRlICggaW5mby0+dGVtcF9maWxlLCAmYnl0ZXMsCisJCSAgICAgKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyX2FkZHJlc3MgKTsKKyAgaWYgKCByZXRWYWwgIT0gbm9FcnIgfHwgYnl0ZXMgIT0gYnl0ZV9jb3VudCApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIEZTQ2xvc2UgKCBpbmZvLT50ZW1wX2ZpbGUgKTsKKyAgRlNwRGVsZXRlICggJihpbmZvLT50ZW1wU3BlYykgKTsKK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKgorICogVGhpcyB2ZXJzaW9uIHVzZXMgRmluZEZvbGRlciB0byBmaW5kIHRoZSBUZW1wb3JhcnkgSXRlbXMgZm9sZGVyLAorICogYW5kIHB1dHMgdGhlIHRlbXBvcmFyeSBmaWxlIGluIHRoZXJlLgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgc2hvcnQgICAgICAgICB0bXBSZWYsIHZSZWZOdW07CisgIGxvbmcgICAgICAgICAgZGlySUQ7CisgIEZJbmZvICAgICAgICAgZmluZGVySW5mbzsKKyAgRlNTcGVjICAgICAgICB0aGVTcGVjOworICBTdHIyNTUgICAgICAgIGZOYW1lOworICBPU0VyciAgICAgICAgIG9zRXJyOworICBsb25nICAgICAgICAgIGdlc3RhbHRSZXNwb25zZSA9IDA7CisKKyAgLyogQ2hlY2sgdGhhdCBGU1NwZWMgY2FsbHMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgb3NFcnIgPSBHZXN0YWx0KCBnZXN0YWx0RlNBdHRyLCAmZ2VzdGFsdFJlc3BvbnNlICk7CisgIGlmICggKCBvc0VyciAhPSBub0VyciApCisgICAgICAgfHwgISggZ2VzdGFsdFJlc3BvbnNlICYgKDE8PGdlc3RhbHRIYXNGU1NwZWNDYWxscykgKSApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCAiLSBTeXN0ZW0gNy4wIG9yIGxhdGVyIHJlcXVpcmVkIik7CisgIC8qIFRPIERPOiBhZGQgYSBwcm9wZXIgZXJyb3IgbWVzc2FnZSB0byBqZXJyb3IuaC4gKi8KKworICAvKiBDaGVjayB0aGF0IEZpbmRGb2xkZXIgaXMgYXZhaWxhYmxlLiAqLworICBvc0VyciA9IEdlc3RhbHQoIGdlc3RhbHRGaW5kRm9sZGVyQXR0ciwgJmdlc3RhbHRSZXNwb25zZSApOworICBpZiAoICggb3NFcnIgIT0gbm9FcnIgKQorICAgICAgIHx8ICEoIGdlc3RhbHRSZXNwb25zZSAmICgxPDxnZXN0YWx0RmluZEZvbGRlclByZXNlbnQpICkgKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIi0gU3lzdGVtIDcuMCBvciBsYXRlciByZXF1aXJlZC4iKTsKKyAgLyogVE8gRE86IGFkZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIHRvIGplcnJvci5oLiAqLworCisgIG9zRXJyID0gRmluZEZvbGRlciAoIGtPblN5c3RlbURpc2ssIGtUZW1wb3JhcnlGb2xkZXJUeXBlLCBrQ3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwgJmRpcklEICk7CisgIGlmICggb3NFcnIgIT0gbm9FcnIgKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgIi0gdGVtcG9yYXJ5IGl0ZW1zIGZvbGRlciB1bmF2YWlsYWJsZSIpOworICAvKiBUTyBETzogVHJ5IHB1dHRpbmcgdGhlIHRlbXAgZmlsZXMgc29tZXdoZXJlIGVsc2UuICovCisKKyAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLworICBmb3IgKDs7KSB7CisgICAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCisKKyAgICBzcHJpbnRmKGluZm8tPnRlbXBfbmFtZSwgVEVNUF9GSUxFX05BTUUsIG5leHRfZmlsZV9udW0pOworICAgIHN0cmNweSAoIChQdHIpZk5hbWUrMSwgaW5mby0+dGVtcF9uYW1lICk7CisgICAgKmZOYW1lID0gc3RybGVuIChpbmZvLT50ZW1wX25hbWUpOworICAgIG9zRXJyID0gRlNNYWtlRlNTcGVjICggdlJlZk51bSwgZGlySUQsIGZOYW1lLCAmdGhlU3BlYyApOworCisgICAgaWYgKCAob3NFcnIgPSBGU3BHZXRGSW5mbyAoICZ0aGVTcGVjLCAmZmluZGVySW5mbyApICkgIT0gbm9FcnIgKQorICAgICAgYnJlYWs7CisgIH0KKworICBvc0VyciA9IEZTcENyZWF0ZSAoICZ0aGVTcGVjLCAnPz8/PycsICc/Pz8/Jywgc21TeXN0ZW1TY3JpcHQgKTsKKyAgaWYgKCBvc0VyciAhPSBub0VyciApCisgICAgRVJSRVhJVFMoY2luZm8sIEpFUlJfVEZJTEVfQ1JFQVRFLCBpbmZvLT50ZW1wX25hbWUpOworCisgIG9zRXJyID0gRlNwT3BlbkRGICggJnRoZVNwZWMsIGZzUmRXclBlcm0sICYoaW5mby0+dGVtcF9maWxlKSApOworICBpZiAoIG9zRXJyICE9IG5vRXJyICkKKyAgICBFUlJFWElUUyhjaW5mbywgSkVSUl9URklMRV9DUkVBVEUsIGluZm8tPnRlbXBfbmFtZSk7CisKKyAgaW5mby0+dGVtcFNwZWMgPSB0aGVTcGVjOworCisgIGluZm8tPnJlYWRfYmFja2luZ19zdG9yZSA9IHJlYWRfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+d3JpdGVfYmFja2luZ19zdG9yZSA9IHdyaXRlX2JhY2tpbmdfc3RvcmU7CisgIGluZm8tPmNsb3NlX2JhY2tpbmdfc3RvcmUgPSBjbG9zZV9iYWNraW5nX3N0b3JlOworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9PUEVOLCBpbmZvLT50ZW1wX25hbWUpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCisgKiBjbGVhbnVwIHJlcXVpcmVkLgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBuZXh0X2ZpbGVfbnVtID0gMDsKKworICAvKiBtYXhfbWVtb3J5X3RvX3VzZSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIEZyZWVNZW0oKSdzIHJlc3VsdDsKKyAgICogdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbWlnaHQgbGF0ZXIgcmVkdWNlIGl0LCBmb3IgZXhhbXBsZQorICAgKiB0byBsZWF2ZSByb29tIHRvIGludm9rZSBtdWx0aXBsZSBKUEVHIG9iamVjdHMuCisgICAqIE5vdGUgdGhhdCBGcmVlTWVtIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBmcmVlIGJ5dGVzOworICAgKiBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIGFsbG9jYXRlIGEgc2luZ2xlIGJsb2NrIG9mIHRoaXMgc2l6ZS4KKyAgICovCisgIHJldHVybiBGcmVlTWVtKCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbW1nci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1tZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODAxYjMyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1tZ3IuYwpAQCAtMCwwICsxLDExMTggQEAKKy8qCisgKiBqbWVtbWdyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSlBFRyBzeXN0ZW0taW5kZXBlbmRlbnQgbWVtb3J5IG1hbmFnZW1lbnQKKyAqIHJvdXRpbmVzLiAgVGhpcyBjb2RlIGlzIHVzYWJsZSBhY3Jvc3MgYSB3aWRlIHZhcmlldHkgb2YgbWFjaGluZXM7IG1vc3QKKyAqIG9mIHRoZSBzeXN0ZW0gZGVwZW5kZW5jaWVzIGhhdmUgYmVlbiBpc29sYXRlZCBpbiBhIHNlcGFyYXRlIGZpbGUuCisgKiBUaGUgbWFqb3IgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUgYXJlOgorICogICAqIHBvb2wtYmFzZWQgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBvZiBtZW1vcnk7CisgKiAgICogcG9saWN5IGRlY2lzaW9ucyBhYm91dCBob3cgdG8gZGl2aWRlIGF2YWlsYWJsZSBtZW1vcnkgYW1vbmcgdGhlCisgKiAgICAgdmlydHVhbCBhcnJheXM7CisgKiAgICogY29udHJvbCBsb2dpYyBmb3Igc3dhcHBpbmcgdmlydHVhbCBhcnJheXMgYmV0d2VlbiBtYWluIG1lbW9yeSBhbmQKKyAqICAgICBiYWNraW5nIHN0b3JhZ2UuCisgKiBUaGUgc2VwYXJhdGUgc3lzdGVtLWRlcGVuZGVudCBmaWxlIHByb3ZpZGVzIHRoZSBhY3R1YWwgYmFja2luZy1zdG9yYWdlCisgKiBhY2Nlc3MgY29kZSwgYW5kIGl0IGNvbnRhaW5zIHRoZSBwb2xpY3kgZGVjaXNpb24gYWJvdXQgaG93IG11Y2ggdG90YWwKKyAqIG1haW4gbWVtb3J5IHRvIHVzZS4KKyAqIFRoaXMgZmlsZSBpcyBzeXN0ZW0tZGVwZW5kZW50IGluIHRoZSBzZW5zZSB0aGF0IHNvbWUgb2YgaXRzIGZ1bmN0aW9ucworICogYXJlIHVubmVjZXNzYXJ5IGluIHNvbWUgc3lzdGVtcy4gIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBlbm91Z2ggdmlydHVhbAorICogbWVtb3J5IHNvIHRoYXQgYmFja2luZyBzdG9yYWdlIHdpbGwgbmV2ZXIgYmUgdXNlZCwgbXVjaCBvZiB0aGUgdmlydHVhbAorICogYXJyYXkgY29udHJvbCBsb2dpYyBjb3VsZCBiZSByZW1vdmVkLiAgKE9mIGNvdXJzZSwgaWYgeW91IGhhdmUgdGhhdCBtdWNoCisgKiBtZW1vcnkgdGhlbiB5b3Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgYSBsaXR0bGUgYml0IG9mIHVudXNlZCBjb2RlLi4uKQorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNkZWZpbmUgQU1fTUVNT1JZX01BTkFHRVIJLyogd2UgZGVmaW5lIGp2aXJ0X1hhcnJheV9jb250cm9sIHN0cnVjdHMgKi8KKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgTk9fR0VURU5WCisjaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgZ2V0ZW52KCkgKi8KK2V4dGVybiBjaGFyICogZ2V0ZW52IEpQUCgoY29uc3QgY2hhciAqIG5hbWUpKTsKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFNvbWUgaW1wb3J0YW50IG5vdGVzOgorICogICBUaGUgYWxsb2NhdGlvbiByb3V0aW5lcyBwcm92aWRlZCBoZXJlIG11c3QgbmV2ZXIgcmV0dXJuIE5VTEwuCisgKiAgIFRoZXkgc2hvdWxkIGV4aXQgdG8gZXJyb3JfZXhpdCBpZiB1bnN1Y2Nlc3NmdWwuCisgKgorICogICBJdCdzIG5vdCBhIGdvb2QgaWRlYSB0byB0cnkgdG8gbWVyZ2UgdGhlIHNhcnJheSBhbmQgYmFycmF5IHJvdXRpbmVzLAorICogICBldmVuIHRob3VnaCB0aGV5IGFyZSB0ZXh0dWFsbHkgYWxtb3N0IHRoZSBzYW1lLCBiZWNhdXNlIHNhbXBsZXMgYXJlCisgKiAgIHVzdWFsbHkgc3RvcmVkIGFzIGJ5dGVzIHdoaWxlIGNvZWZmaWNpZW50cyBhcmUgc2hvcnRzIG9yIGludHMuICBUaHVzLAorICogICBpbiBtYWNoaW5lcyB3aGVyZSBieXRlIHBvaW50ZXJzIGhhdmUgYSBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb24gZnJvbQorICogICB3b3JkIHBvaW50ZXJzLCB0aGUgcmVzdWx0aW5nIG1hY2hpbmUgY29kZSBjb3VsZCBub3QgYmUgdGhlIHNhbWUuCisgKi8KKworCisvKgorICogTWFueSBtYWNoaW5lcyByZXF1aXJlIHN0b3JhZ2UgYWxpZ25tZW50OiBsb25ncyBtdXN0IHN0YXJ0IG9uIDQtYnl0ZQorICogYm91bmRhcmllcywgZG91YmxlcyBvbiA4LWJ5dGUgYm91bmRhcmllcywgZXRjLiAgT24gc3VjaCBtYWNoaW5lcywgbWFsbG9jKCkKKyAqIGFsd2F5cyByZXR1cm5zIHBvaW50ZXJzIHRoYXQgYXJlIG11bHRpcGxlcyBvZiB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKKyAqIHJlcXVpcmVtZW50LCBhbmQgd2UgaGFkIGJldHRlciBkbyBzbyB0b28uCisgKiBUaGVyZSBpc24ndCBhbnkgcmVhbGx5IHBvcnRhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlIHdvcnN0LWNhc2UgYWxpZ25tZW50CisgKiByZXF1aXJlbWVudC4gIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhhdCB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IGlzCisgKiBtdWx0aXBsZXMgb2Ygc2l6ZW9mKEFMSUdOX1RZUEUpLgorICogQnkgZGVmYXVsdCwgd2UgZGVmaW5lIEFMSUdOX1RZUEUgYXMgZG91YmxlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc29tZQorICogd29ya3N0YXRpb25zICh3aGVyZSBkb3VibGVzIHJlYWxseSBkbyBuZWVkIDgtYnl0ZSBhbGlnbm1lbnQpIGFuZCB3aWxsIHdvcmsKKyAqIGZpbmUgb24gbmVhcmx5IGV2ZXJ5dGhpbmcuICBJZiB5b3VyIG1hY2hpbmUgaGFzIGxlc3NlciBhbGlnbm1lbnQgbmVlZHMsCisgKiB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgbWFraW5nIEFMSUdOX1RZUEUgc21hbGxlci4KKyAqIFRoZSBvbmx5IHBsYWNlIEkga25vdyBvZiB3aGVyZSB0aGlzIHdpbGwgTk9UIHdvcmsgaXMgY2VydGFpbiBNYWNpbnRvc2gKKyAqIDY4MHgwIGNvbXBpbGVycyB0aGF0IGRlZmluZSBkb3VibGUgYXMgYSAxMC1ieXRlIElFRUUgZXh0ZW5kZWQgZmxvYXQuCisgKiBEb2luZyAxMC1ieXRlIGFsaWdubWVudCBpcyBjb3VudGVycHJvZHVjdGl2ZSBiZWNhdXNlIGxvbmd3b3JkcyB3b24ndCBiZQorICogYWxpZ25lZCB3ZWxsLiAgUHV0ICIjZGVmaW5lIEFMSUdOX1RZUEUgbG9uZyIgaW4gamNvbmZpZy5oIGlmIHlvdSBoYXZlCisgKiBzdWNoIGEgY29tcGlsZXIuCisgKi8KKworI2lmbmRlZiBBTElHTl9UWVBFCQkvKiBzbyBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggKi8KKyNkZWZpbmUgQUxJR05fVFlQRSAgZG91YmxlCisjZW5kaWYKKworCisvKgorICogV2UgYWxsb2NhdGUgb2JqZWN0cyBmcm9tICJwb29scyIsIHdoZXJlIGVhY2ggcG9vbCBpcyBnb3R0ZW4gd2l0aCBhIHNpbmdsZQorICogcmVxdWVzdCB0byBqcGVnX2dldF9zbWFsbCgpIG9yIGpwZWdfZ2V0X2xhcmdlKCkuICBUaGVyZSBpcyBubyBwZXItb2JqZWN0CisgKiBvdmVyaGVhZCB3aXRoaW4gYSBwb29sLCBleGNlcHQgZm9yIGFsaWdubWVudCBwYWRkaW5nLiAgRWFjaCBwb29sIGhhcyBhCisgKiBoZWFkZXIgd2l0aCBhIGxpbmsgdG8gdGhlIG5leHQgcG9vbCBvZiB0aGUgc2FtZSBjbGFzcy4KKyAqIFNtYWxsIGFuZCBsYXJnZSBwb29sIGhlYWRlcnMgYXJlIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgbGF0dGVyJ3MKKyAqIGxpbmsgcG9pbnRlciBtdXN0IGJlIEZBUiBvbiA4MHg4NiBtYWNoaW5lcy4KKyAqIE5vdGljZSB0aGF0IHRoZSAicmVhbCIgaGVhZGVyIGZpZWxkcyBhcmUgdW5pb24nZWQgd2l0aCBhIGR1bW15IEFMSUdOX1RZUEUKKyAqIGZpZWxkLiAgVGhpcyBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIG1ha2UgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKSBhIG11bHRpcGxlCisgKiBvZiB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIEFMSUdOX1RZUEUuCisgKi8KKwordHlwZWRlZiB1bmlvbiBzbWFsbF9wb29sX3N0cnVjdCAqIHNtYWxsX3Bvb2xfcHRyOworCit0eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0IHsKKyAgc3RydWN0IHsKKyAgICBzbWFsbF9wb29sX3B0ciBuZXh0OwkvKiBuZXh0IGluIGxpc3Qgb2YgcG9vbHMgKi8KKyAgICBzaXplX3QgYnl0ZXNfdXNlZDsJCS8qIGhvdyBtYW55IGJ5dGVzIGFscmVhZHkgdXNlZCB3aXRoaW4gcG9vbCAqLworICAgIHNpemVfdCBieXRlc19sZWZ0OwkJLyogYnl0ZXMgc3RpbGwgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCAqLworICB9IGhkcjsKKyAgQUxJR05fVFlQRSBkdW1teTsJCS8qIGluY2x1ZGVkIGluIHVuaW9uIHRvIGVuc3VyZSBhbGlnbm1lbnQgKi8KK30gc21hbGxfcG9vbF9oZHI7CisKK3R5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgRkFSICogbGFyZ2VfcG9vbF9wdHI7CisKK3R5cGVkZWYgdW5pb24gbGFyZ2VfcG9vbF9zdHJ1Y3QgeworICBzdHJ1Y3QgeworICAgIGxhcmdlX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLworICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCisgIH0gaGRyOworICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLworfSBsYXJnZV9wb29sX2hkcjsKKworCisvKgorICogSGVyZSBpcyB0aGUgZnVsbCBkZWZpbml0aW9uIG9mIGEgbWVtb3J5IG1hbmFnZXIgb2JqZWN0LgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGpwZWdfbWVtb3J5X21nciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBFYWNoIHBvb2wgaWRlbnRpZmllciAobGlmZXRpbWUgY2xhc3MpIG5hbWVzIGEgbGlua2VkIGxpc3Qgb2YgcG9vbHMuICovCisgIHNtYWxsX3Bvb2xfcHRyIHNtYWxsX2xpc3RbSlBPT0xfTlVNUE9PTFNdOworICBsYXJnZV9wb29sX3B0ciBsYXJnZV9saXN0W0pQT09MX05VTVBPT0xTXTsKKworICAvKiBTaW5jZSB3ZSBvbmx5IGhhdmUgb25lIGxpZmV0aW1lIGNsYXNzIG9mIHZpcnR1YWwgYXJyYXlzLCBvbmx5IG9uZQorICAgKiBsaW5rZWQgbGlzdCBpcyBuZWNlc3NhcnkgKGZvciBlYWNoIGRhdGF0eXBlKS4gIE5vdGUgdGhhdCB0aGUgdmlydHVhbAorICAgKiBhcnJheSBjb250cm9sIGJsb2NrcyBiZWluZyBsaW5rZWQgdG9nZXRoZXIgYXJlIGFjdHVhbGx5IHN0b3JlZCBzb21ld2hlcmUKKyAgICogaW4gdGhlIHNtYWxsLXBvb2wgbGlzdC4KKyAgICovCisgIGp2aXJ0X3NhcnJheV9wdHIgdmlydF9zYXJyYXlfbGlzdDsKKyAganZpcnRfYmFycmF5X3B0ciB2aXJ0X2JhcnJheV9saXN0OworCisgIC8qIFRoaXMgY291bnRzIHRvdGFsIHNwYWNlIG9idGFpbmVkIGZyb20ganBlZ19nZXRfc21hbGwvbGFyZ2UgKi8KKyAgbG9uZyB0b3RhbF9zcGFjZV9hbGxvY2F0ZWQ7CisKKyAgLyogYWxsb2Nfc2FycmF5IGFuZCBhbGxvY19iYXJyYXkgc2V0IHRoaXMgdmFsdWUgZm9yIHVzZSBieSB2aXJ0dWFsCisgICAqIGFycmF5IHJvdXRpbmVzLgorICAgKi8KKyAgSkRJTUVOU0lPTiBsYXN0X3Jvd3NwZXJjaHVuazsJLyogZnJvbSBtb3N0IHJlY2VudCBhbGxvY19zYXJyYXkvYmFycmF5ICovCit9IG15X21lbW9yeV9tZ3I7CisKK3R5cGVkZWYgbXlfbWVtb3J5X21nciAqIG15X21lbV9wdHI7CisKKworLyoKKyAqIFRoZSBjb250cm9sIGJsb2NrcyBmb3IgdmlydHVhbCBhcnJheXMuCisgKiBOb3RlIHRoYXQgdGhlc2UgYmxvY2tzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlICJzbWFsbCIgcG9vbCBhcmVhLgorICogU3lzdGVtLWRlcGVuZGVudCBpbmZvIGZvciB0aGUgYXNzb2NpYXRlZCBiYWNraW5nIHN0b3JlIChpZiBhbnkpIGlzIGhpZGRlbgorICogaW5zaWRlIHRoZSBiYWNraW5nX3N0b3JlX2luZm8gc3RydWN0LgorICovCisKK3N0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7CisgIEpTQU1QQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLworICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3c7CS8qIHdpZHRoIG9mIGFycmF5IChhbmQgb2YgbWVtb3J5IGJ1ZmZlcikgKi8KKyAgSkRJTUVOU0lPTiBtYXhhY2Nlc3M7CQkvKiBtYXggcm93cyBhY2Nlc3NlZCBieSBhY2Nlc3NfdmlydF9zYXJyYXkgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX21lbTsJLyogaGVpZ2h0IG9mIG1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzcGVyY2h1bms7CS8qIGFsbG9jYXRpb24gY2h1bmsgc2l6ZSBpbiBtZW1fYnVmZmVyICovCisgIEpESU1FTlNJT04gY3VyX3N0YXJ0X3JvdzsJLyogZmlyc3QgbG9naWNhbCByb3cgIyBpbiB0aGUgYnVmZmVyICovCisgIEpESU1FTlNJT04gZmlyc3RfdW5kZWZfcm93OwkvKiByb3cgIyBvZiBmaXJzdCB1bmluaXRpYWxpemVkIHJvdyAqLworICBib29sZWFuIHByZV96ZXJvOwkJLyogcHJlLXplcm8gbW9kZSByZXF1ZXN0ZWQ/ICovCisgIGJvb2xlYW4gZGlydHk7CQkvKiBkbyBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBuZWVkIHdyaXR0ZW4/ICovCisgIGJvb2xlYW4gYl9zX29wZW47CQkvKiBpcyBiYWNraW5nLXN0b3JlIGRhdGEgdmFsaWQ/ICovCisgIGp2aXJ0X3NhcnJheV9wdHIgbmV4dDsJLyogbGluayB0byBuZXh0IHZpcnR1YWwgc2FycmF5IGNvbnRyb2wgYmxvY2sgKi8KKyAgYmFja2luZ19zdG9yZV9pbmZvIGJfc19pbmZvOwkvKiBTeXN0ZW0tZGVwZW5kZW50IGNvbnRyb2wgaW5mbyAqLworfTsKKworc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsKKyAgSkJMT0NLQVJSQVkgbWVtX2J1ZmZlcjsJLyogPT4gdGhlIGluLW1lbW9yeSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiByb3dzX2luX2FycmF5OwkvKiB0b3RhbCB2aXJ0dWFsIGFycmF5IGhlaWdodCAqLworICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLworICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X2JhcnJheSAqLworICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KKyAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCisgIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KKyAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KKyAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KKyAganZpcnRfYmFycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBiYXJyYXkgY29udHJvbCBibG9jayAqLworICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCit9OworCisKKyNpZmRlZiBNRU1fU1RBVFMJCS8qIG9wdGlvbmFsIGV4dHJhIHN0dWZmIGZvciBzdGF0aXN0aWNzICovCisKK0xPQ0FMKHZvaWQpCitwcmludF9tZW1fc3RhdHMgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOworICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKKworICAvKiBTaW5jZSB0aGlzIGlzIG9ubHkgYSBkZWJ1Z2dpbmcgc3R1Yiwgd2UgY2FuIGNoZWF0IGEgbGl0dGxlIGJ5IHVzaW5nCisgICAqIGZwcmludGYgZGlyZWN0bHkgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaCB0aGUgdHJhY2UgbWVzc2FnZSBjb2RlLgorICAgKiBUaGlzIGlzIGhlbHBmdWwgYmVjYXVzZSBtZXNzYWdlIHBhcm0gYXJyYXkgY2FuJ3QgaGFuZGxlIGxvbmdzLgorICAgKi8KKyAgZnByaW50ZihzdGRlcnIsICJGcmVlaW5nIHBvb2wgJWQsIHRvdGFsIHNwYWNlID0gJWxkXG4iLAorCSAgcG9vbF9pZCwgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOworCisgIGZvciAobGhkcl9wdHIgPSBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF07IGxoZHJfcHRyICE9IE5VTEw7CisgICAgICAgbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgTGFyZ2UgY2h1bmsgdXNlZCAlbGRcbiIsCisJICAgIChsb25nKSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQpOworICB9CisKKyAgZm9yIChzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsgc2hkcl9wdHIgIT0gTlVMTDsKKyAgICAgICBzaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiICBTbWFsbCBjaHVuayB1c2VkICVsZCBmcmVlICVsZFxuIiwKKwkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCwKKwkgICAgKGxvbmcpIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCk7CisgIH0KK30KKworI2VuZGlmIC8qIE1FTV9TVEFUUyAqLworCisKK0xPQ0FMKHZvaWQpCitvdXRfb2ZfbWVtb3J5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCB3aGljaCkKKy8qIFJlcG9ydCBhbiBvdXQtb2YtbWVtb3J5IGVycm9yIGFuZCBzdG9wIGV4ZWN1dGlvbiAqLworLyogSWYgd2UgY29tcGlsZWQgTUVNX1NUQVRTIHN1cHBvcnQsIHJlcG9ydCBhbGxvYyByZXF1ZXN0cyBiZWZvcmUgZHlpbmcgKi8KK3sKKyNpZmRlZiBNRU1fU1RBVFMKKyAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAyOwkvKiBmb3JjZSBzZWxmX2Rlc3RydWN0IHRvIHJlcG9ydCBzdGF0cyAqLworI2VuZGlmCisgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIHdoaWNoKTsKK30KKworCisvKgorICogQWxsb2NhdGlvbiBvZiAic21hbGwiIG9iamVjdHMuCisgKgorICogRm9yIHRoZXNlLCB3ZSB1c2UgcG9vbGVkIHN0b3JhZ2UuICBXaGVuIGEgbmV3IHBvb2wgbXVzdCBiZSBjcmVhdGVkLAorICogd2UgdHJ5IHRvIGdldCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgcGx1cyBhICJzbG9wIiBmYWN0b3IsCisgKiB3aGVyZSB0aGUgc2xvcCB3aWxsIGJlIHRoZSBhbW91bnQgb2YgbGVmdG92ZXIgc3BhY2UgaW4gdGhlIG5ldyBwb29sLgorICogVGhlIHNwZWVkIHZzLiBzcGFjZSB0cmFkZW9mZiBpcyBsYXJnZWx5IGRldGVybWluZWQgYnkgdGhlIHNsb3AgdmFsdWVzLgorICogQSBkaWZmZXJlbnQgc2xvcCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgZWFjaCBwb29sIGNsYXNzIChsaWZldGltZSksCisgKiBhbmQgd2UgYWxzbyBkaXN0aW5ndWlzaCB0aGUgZmlyc3QgcG9vbCBvZiBhIGNsYXNzIGZyb20gbGF0ZXIgb25lcy4KKyAqIE5PVEU6IHRoZSB2YWx1ZXMgZ2l2ZW4gd29yayBmYWlybHkgd2VsbCBvbiBib3RoIDE2LSBhbmQgMzItYml0LWludAorICogbWFjaGluZXMsIGJ1dCBtYXkgYmUgdG9vIHNtYWxsIGlmIGxvbmdzIGFyZSA2NCBiaXRzIG9yIG1vcmUuCisgKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBmaXJzdF9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCit7CisJMTYwMCwJCQkvKiBmaXJzdCBQRVJNQU5FTlQgcG9vbCAqLworCTE2MDAwCQkJLyogZmlyc3QgSU1BR0UgcG9vbCAqLworfTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBleHRyYV9wb29sX3Nsb3BbSlBPT0xfTlVNUE9PTFNdID0gCit7CisJMCwJCQkvKiBhZGRpdGlvbmFsIFBFUk1BTkVOVCBwb29scyAqLworCTUwMDAJCQkvKiBhZGRpdGlvbmFsIElNQUdFIHBvb2xzICovCit9OworCisjZGVmaW5lIE1JTl9TTE9QICA1MAkJLyogZ3JlYXRlciB0aGFuIDAgdG8gYXZvaWQgZnV0aWxlIGxvb3BpbmcgKi8KKworCitNRVRIT0RERUYodm9pZCAqKQorYWxsb2Nfc21hbGwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCisvKiBBbGxvY2F0ZSBhICJzbWFsbCIgb2JqZWN0ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIGhkcl9wdHIsIHByZXZfaGRyX3B0cjsKKyAgY2hhciAqIGRhdGFfcHRyOworICBzaXplX3Qgb2RkX2J5dGVzLCBtaW5fcmVxdWVzdCwgc2xvcDsKKworICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLworICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0Yoc21hbGxfcG9vbF9oZHIpKSkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAxKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KKworICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KKyAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOworICBpZiAob2RkX2J5dGVzID4gMCkKKyAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOworCisgIC8qIFNlZSBpZiBzcGFjZSBpcyBhdmFpbGFibGUgaW4gYW55IGV4aXN0aW5nIHBvb2wgKi8KKyAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKyAgcHJldl9oZHJfcHRyID0gTlVMTDsKKyAgaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKKyAgd2hpbGUgKGhkcl9wdHIgIT0gTlVMTCkgeworICAgIGlmIChoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA+PSBzaXplb2ZvYmplY3QpCisgICAgICBicmVhazsJCQkvKiBmb3VuZCBwb29sIHdpdGggZW5vdWdoIHNwYWNlICovCisgICAgcHJldl9oZHJfcHRyID0gaGRyX3B0cjsKKyAgICBoZHJfcHRyID0gaGRyX3B0ci0+aGRyLm5leHQ7CisgIH0KKworICAvKiBUaW1lIHRvIG1ha2UgYSBuZXcgcG9vbD8gKi8KKyAgaWYgKGhkcl9wdHIgPT0gTlVMTCkgeworICAgIC8qIG1pbl9yZXF1ZXN0IGlzIHdoYXQgd2UgbmVlZCBub3csIHNsb3AgaXMgd2hhdCB3aWxsIGJlIGxlZnRvdmVyICovCisgICAgbWluX3JlcXVlc3QgPSBzaXplb2ZvYmplY3QgKyBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOworICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KKyAgICAgIHNsb3AgPSBmaXJzdF9wb29sX3Nsb3BbcG9vbF9pZF07CisgICAgZWxzZQorICAgICAgc2xvcCA9IGV4dHJhX3Bvb2xfc2xvcFtwb29sX2lkXTsKKyAgICAvKiBEb24ndCBhc2sgZm9yIG1vcmUgdGhhbiBNQVhfQUxMT0NfQ0hVTksgKi8KKyAgICBpZiAoc2xvcCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpKQorICAgICAgc2xvcCA9IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstbWluX3JlcXVlc3QpOworICAgIC8qIFRyeSB0byBnZXQgc3BhY2UsIGlmIGZhaWwgcmVkdWNlIHNsb3AgYW5kIHRyeSBhZ2FpbiAqLworICAgIGZvciAoOzspIHsKKyAgICAgIGhkcl9wdHIgPSAoc21hbGxfcG9vbF9wdHIpIGpwZWdfZ2V0X3NtYWxsKGNpbmZvLCBtaW5fcmVxdWVzdCArIHNsb3ApOworICAgICAgaWYgKGhkcl9wdHIgIT0gTlVMTCkKKwlicmVhazsKKyAgICAgIHNsb3AgLz0gMjsKKyAgICAgIGlmIChzbG9wIDwgTUlOX1NMT1ApCS8qIGdpdmUgdXAgd2hlbiBpdCBnZXRzIHJlYWwgc21hbGwgKi8KKwlvdXRfb2ZfbWVtb3J5KGNpbmZvLCAyKTsgLyoganBlZ19nZXRfc21hbGwgZmFpbGVkICovCisgICAgfQorICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IG1pbl9yZXF1ZXN0ICsgc2xvcDsKKyAgICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBlbmQgb2YgbGlzdCAqLworICAgIGhkcl9wdHItPmhkci5uZXh0ID0gTlVMTDsKKyAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IDA7CisgICAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSBzaXplb2ZvYmplY3QgKyBzbG9wOworICAgIGlmIChwcmV2X2hkcl9wdHIgPT0gTlVMTCkJLyogZmlyc3QgcG9vbCBpbiBjbGFzcz8gKi8KKyAgICAgIG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXSA9IGhkcl9wdHI7CisgICAgZWxzZQorICAgICAgcHJldl9oZHJfcHRyLT5oZHIubmV4dCA9IGhkcl9wdHI7CisgIH0KKworICAvKiBPSywgYWxsb2NhdGUgdGhlIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHBvb2wgKi8KKyAgZGF0YV9wdHIgPSAoY2hhciAqKSAoaGRyX3B0ciArIDEpOyAvKiBwb2ludCB0byBmaXJzdCBkYXRhIGJ5dGUgaW4gcG9vbCAqLworICBkYXRhX3B0ciArPSBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZDsgLyogcG9pbnQgdG8gcGxhY2UgZm9yIG9iamVjdCAqLworICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArPSBzaXplb2ZvYmplY3Q7CisgIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0IC09IHNpemVvZm9iamVjdDsKKworICByZXR1cm4gKHZvaWQgKikgZGF0YV9wdHI7Cit9CisKKworLyoKKyAqIEFsbG9jYXRpb24gb2YgImxhcmdlIiBvYmplY3RzLgorICoKKyAqIFRoZSBleHRlcm5hbCBzZW1hbnRpY3Mgb2YgdGhlc2UgYXJlIHRoZSBzYW1lIGFzICJzbWFsbCIgb2JqZWN0cywKKyAqIGV4Y2VwdCB0aGF0IEZBUiBwb2ludGVycyBhcmUgdXNlZCBvbiA4MHg4Ni4gIEhvd2V2ZXIgdGhlIHBvb2wKKyAqIG1hbmFnZW1lbnQgaGV1cmlzdGljcyBhcmUgcXVpdGUgZGlmZmVyZW50LiAgV2UgYXNzdW1lIHRoYXQgZWFjaAorICogcmVxdWVzdCBpcyBsYXJnZSBlbm91Z2ggdGhhdCBpdCBtYXkgYXMgd2VsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KKyAqIGpwZWdfZ2V0X2xhcmdlOyB0aGUgcG9vbCBtYW5hZ2VtZW50IGp1c3QgbGlua3MgZXZlcnl0aGluZyB0b2dldGhlcgorICogc28gdGhhdCB3ZSBjYW4gZnJlZSBpdCBhbGwgb24gZGVtYW5kLgorICogTm90ZTogdGhlIG1ham9yIHVzZSBvZiAibGFyZ2UiIG9iamVjdHMgaXMgaW4gSlNBTVBBUlJBWSBhbmQgSkJMT0NLQVJSQVkKKyAqIHN0cnVjdHVyZXMuICBUaGUgcm91dGluZXMgdGhhdCBjcmVhdGUgdGhlc2Ugc3RydWN0dXJlcyAoc2VlIGJlbG93KQorICogZGVsaWJlcmF0ZWx5IGJ1bmNoIHJvd3MgdG9nZXRoZXIgdG8gZW5zdXJlIGEgbGFyZ2UgcmVxdWVzdCBzaXplLgorICovCisKK01FVEhPRERFRih2b2lkIEZBUiAqKQorYWxsb2NfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIHNpemVfdCBzaXplb2ZvYmplY3QpCisvKiBBbGxvY2F0ZSBhICJsYXJnZSIgb2JqZWN0ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGxhcmdlX3Bvb2xfcHRyIGhkcl9wdHI7CisgIHNpemVfdCBvZGRfYnl0ZXM7CisKKyAgLyogQ2hlY2sgZm9yIHVuc2F0aXNmaWFibGUgcmVxdWVzdCAoZG8gbm93IHRvIGVuc3VyZSBubyBvdmVyZmxvdyBiZWxvdykgKi8KKyAgaWYgKHNpemVvZm9iamVjdCA+IChzaXplX3QpIChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkpCisgICAgb3V0X29mX21lbW9yeShjaW5mbywgMyk7CS8qIHJlcXVlc3QgZXhjZWVkcyBtYWxsb2MncyBhYmlsaXR5ICovCisKKyAgLyogUm91bmQgdXAgdGhlIHJlcXVlc3RlZCBzaXplIHRvIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpICovCisgIG9kZF9ieXRlcyA9IHNpemVvZm9iamVjdCAlIFNJWkVPRihBTElHTl9UWVBFKTsKKyAgaWYgKG9kZF9ieXRlcyA+IDApCisgICAgc2l6ZW9mb2JqZWN0ICs9IFNJWkVPRihBTElHTl9UWVBFKSAtIG9kZF9ieXRlczsKKworICAvKiBBbHdheXMgbWFrZSBhIG5ldyBwb29sICovCisgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyAgaGRyX3B0ciA9IChsYXJnZV9wb29sX3B0cikganBlZ19nZXRfbGFyZ2UoY2luZm8sIHNpemVvZm9iamVjdCArCisJCQkJCSAgICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpKTsKKyAgaWYgKGhkcl9wdHIgPT0gTlVMTCkKKyAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCA0KTsJLyoganBlZ19nZXRfbGFyZ2UgZmFpbGVkICovCisgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkICs9IHNpemVvZm9iamVjdCArIFNJWkVPRihsYXJnZV9wb29sX2hkcik7CisKKyAgLyogU3VjY2VzcywgaW5pdGlhbGl6ZSB0aGUgbmV3IHBvb2wgaGVhZGVyIGFuZCBhZGQgdG8gbGlzdCAqLworICBoZHJfcHRyLT5oZHIubmV4dCA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKKyAgLyogV2UgbWFpbnRhaW4gc3BhY2UgY291bnRzIGluIGVhY2ggcG9vbCBoZWFkZXIgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzLAorICAgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBub3QgbmVlZGVkIGZvciBhbGxvY2F0aW9uLgorICAgKi8KKyAgaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgPSBzaXplb2ZvYmplY3Q7CisgIGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID0gMDsKKyAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKKworICByZXR1cm4gKHZvaWQgRkFSICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCit9CisKKworLyoKKyAqIENyZWF0aW9uIG9mIDItRCBzYW1wbGUgYXJyYXlzLgorICogVGhlIHBvaW50ZXJzIGFyZSBpbiBuZWFyIGhlYXAsIHRoZSBzYW1wbGVzIHRoZW1zZWx2ZXMgaW4gRkFSIGhlYXAuCisgKgorICogVG8gbWluaW1pemUgYWxsb2NhdGlvbiBvdmVyaGVhZCBhbmQgdG8gYWxsb3cgSS9PIG9mIGxhcmdlIGNvbnRpZ3VvdXMKKyAqIGJsb2Nrcywgd2UgYWxsb2NhdGUgdGhlIHNhbXBsZSByb3dzIGluIGdyb3VwcyBvZiBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUKKyAqIHdpdGhvdXQgZXhjZWVkaW5nIE1BWF9BTExPQ19DSFVOSyB0b3RhbCBieXRlcyBwZXIgYWxsb2NhdGlvbiByZXF1ZXN0LgorICogTkI6IHRoZSB2aXJ0dWFsIGFycmF5IGNvbnRyb2wgcm91dGluZXMsIGxhdGVyIGluIHRoaXMgZmlsZSwga25vdyBhYm91dAorICogdGhpcyBjaHVua2luZyBvZiByb3dzLiAgVGhlIHJvd3NwZXJjaHVuayB2YWx1ZSBpcyBsZWZ0IGluIHRoZSBtZW0gbWFuYWdlcgorICogb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIHNhdmVkIGF3YXkgaWYgdGhpcyBzYXJyYXkgaXMgdGhlIHdvcmtzcGFjZSBmb3IKKyAqIGEgdmlydHVhbCBhcnJheS4KKyAqLworCitNRVRIT0RERUYoSlNBTVBBUlJBWSkKK2FsbG9jX3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkgICAgICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csIEpESU1FTlNJT04gbnVtcm93cykKKy8qIEFsbG9jYXRlIGEgMi1EIHNhbXBsZSBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBKU0FNUEFSUkFZIHJlc3VsdDsKKyAgSlNBTVBST1cgd29ya3NwYWNlOworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOworICBsb25nIGx0ZW1wOworCisgIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KKyAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KKwkgICgobG9uZykgc2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKSk7CisgIGlmIChsdGVtcCA8PSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOworICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKKyAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgIGVsc2UKKyAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOworICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOworCisgIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCisgIHJlc3VsdCA9IChKU0FNUEFSUkFZKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKKwkJCQkgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSlNBTVBST1cpKSk7CisKKyAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCisgIGN1cnJvdyA9IDA7CisgIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7CisgICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7CisgICAgd29ya3NwYWNlID0gKEpTQU1QUk9XKSBhbGxvY19sYXJnZShjaW5mbywgcG9vbF9pZCwKKwkoc2l6ZV90KSAoKHNpemVfdCkgcm93c3BlcmNodW5rICogKHNpemVfdCkgc2FtcGxlc3BlcnJvdworCQkgICogU0laRU9GKEpTQU1QTEUpKSk7CisgICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7CisgICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOworICAgICAgd29ya3NwYWNlICs9IHNhbXBsZXNwZXJyb3c7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogQ3JlYXRpb24gb2YgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4KKyAqIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNvZGUgZm9yIHNhbXBsZSBhcnJheXMsIGFib3ZlLgorICovCisKK01FVEhPRERFRihKQkxPQ0tBUlJBWSkKK2FsbG9jX2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkgICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQorLyogQWxsb2NhdGUgYSAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KK3sKKyAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKKyAgSkJMT0NLQVJSQVkgcmVzdWx0OworICBKQkxPQ0tST1cgd29ya3NwYWNlOworICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuaywgY3Vycm93LCBpOworICBsb25nIGx0ZW1wOworCisgIC8qIENhbGN1bGF0ZSBtYXggIyBvZiByb3dzIGFsbG93ZWQgaW4gb25lIGFsbG9jYXRpb24gY2h1bmsgKi8KKyAgbHRlbXAgPSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihsYXJnZV9wb29sX2hkcikpIC8KKwkgICgobG9uZykgYmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSykpOworICBpZiAobHRlbXAgPD0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1dJRFRIX09WRVJGTE9XKTsKKyAgaWYgKGx0ZW1wIDwgKGxvbmcpIG51bXJvd3MpCisgICAgcm93c3BlcmNodW5rID0gKEpESU1FTlNJT04pIGx0ZW1wOworICBlbHNlCisgICAgcm93c3BlcmNodW5rID0gbnVtcm93czsKKyAgbWVtLT5sYXN0X3Jvd3NwZXJjaHVuayA9IHJvd3NwZXJjaHVuazsKKworICAvKiBHZXQgc3BhY2UgZm9yIHJvdyBwb2ludGVycyAoc21hbGwgb2JqZWN0KSAqLworICByZXN1bHQgPSAoSkJMT0NLQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCSAgICAgKHNpemVfdCkgKG51bXJvd3MgKiBTSVpFT0YoSkJMT0NLUk9XKSkpOworCisgIC8qIEdldCB0aGUgcm93cyB0aGVtc2VsdmVzIChsYXJnZSBvYmplY3RzKSAqLworICBjdXJyb3cgPSAwOworICB3aGlsZSAoY3Vycm93IDwgbnVtcm93cykgeworICAgIHJvd3NwZXJjaHVuayA9IE1JTihyb3dzcGVyY2h1bmssIG51bXJvd3MgLSBjdXJyb3cpOworICAgIHdvcmtzcGFjZSA9IChKQkxPQ0tST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAorCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBibG9ja3NwZXJyb3cKKwkJICAqIFNJWkVPRihKQkxPQ0spKSk7CisgICAgZm9yIChpID0gcm93c3BlcmNodW5rOyBpID4gMDsgaS0tKSB7CisgICAgICByZXN1bHRbY3Vycm93KytdID0gd29ya3NwYWNlOworICAgICAgd29ya3NwYWNlICs9IGJsb2Nrc3BlcnJvdzsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBBYm91dCB2aXJ0dWFsIGFycmF5IG1hbmFnZW1lbnQ6CisgKgorICogVGhlIGFib3ZlICJub3JtYWwiIGFycmF5IHJvdXRpbmVzIGFyZSBvbmx5IHVzZWQgdG8gYWxsb2NhdGUgc3RyaXAgYnVmZmVycworICogKGFzIHdpZGUgYXMgdGhlIGltYWdlLCBidXQganVzdCBhIGZldyByb3dzIGhpZ2gpLiAgRnVsbC1pbWFnZS1zaXplZCBidWZmZXJzCisgKiBhcmUgaGFuZGxlZCBhcyAidmlydHVhbCIgYXJyYXlzLiAgVGhlIGFycmF5IGlzIHN0aWxsIGFjY2Vzc2VkIGEgc3RyaXAgYXQgYQorICogdGltZSwgYnV0IHRoZSBtZW1vcnkgbWFuYWdlciBtdXN0IHNhdmUgdGhlIHdob2xlIGFycmF5IGZvciByZXBlYXRlZAorICogYWNjZXNzZXMuICBUaGUgaW50ZW5kZWQgaW1wbGVtZW50YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBhIHN0cmlwIGJ1ZmZlciBpbgorICogbWVtb3J5IChhcyBoaWdoIGFzIGlzIHBvc3NpYmxlIGdpdmVuIHRoZSBkZXNpcmVkIG1lbW9yeSBsaW1pdCksIHBsdXMgYQorICogYmFja2luZyBmaWxlIHRoYXQgaG9sZHMgdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgorICoKKyAqIFRoZSByZXF1ZXN0X3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHRvbGQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGltYWdlIGFuZAorICogdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdGhhdCB3aWxsIGJlIGFjY2Vzc2VkIGF0IG9uY2UuICBUaGUgaW4tbWVtb3J5CisgKiBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbWF4YWNjZXNzIHZhbHVlLgorICoKKyAqIFRoZSByZXF1ZXN0IHJvdXRpbmVzIGNyZWF0ZSBjb250cm9sIGJsb2NrcyBidXQgbm90IHRoZSBpbi1tZW1vcnkgYnVmZmVycy4KKyAqIFRoYXQgaXMgcG9zdHBvbmVkIHVudGlsIHJlYWxpemVfdmlydF9hcnJheXMgaXMgY2FsbGVkLiAgQXQgdGhhdCB0aW1lIHRoZQorICogdG90YWwgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCBpcyBrbm93biAoYXBwcm94aW1hdGVseSwgYW55d2F5KSwgc28gZnJlZQorICogbWVtb3J5IGNhbiBiZSBkaXZpZGVkIHVwIGZhaXJseS4KKyAqCisgKiBUaGUgYWNjZXNzX3ZpcnRfYXJyYXkgcm91dGluZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgYSBzcGVjaWZpYyBzdHJpcAorICogYXJlYSBhY2Nlc3NpYmxlIChhZnRlciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGJhY2tpbmcgZmlsZSwgaWYgbmVjZXNzYXJ5KS4KKyAqIE5vdGUgdGhhdCB0aGUgYWNjZXNzIHJvdXRpbmVzIGFyZSB0b2xkIHdoZXRoZXIgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeQorICogdGhlIGFjY2Vzc2VkIHN0cmlwOyBkdXJpbmcgYSByZWFkLW9ubHkgcGFzcyB0aGlzIHNhdmVzIGhhdmluZyB0byByZXdyaXRlCisgKiBkYXRhIHRvIGRpc2suICBUaGUgYWNjZXNzIHJvdXRpbmVzIGFyZSBhbHNvIHJlc3BvbnNpYmxlIGZvciBwcmUtemVyb2luZworICogYW55IG5ld2x5IGFjY2Vzc2VkIHJvd3MsIGlmIHByZS16ZXJvaW5nIHdhcyByZXF1ZXN0ZWQuCisgKgorICogSW4gY3VycmVudCB1c2FnZSwgdGhlIGFjY2VzcyByZXF1ZXN0cyBhcmUgdXN1YWxseSBmb3Igbm9ub3ZlcmxhcHBpbmcKKyAqIHN0cmlwczsgdGhhdCBpcywgc3VjY2Vzc2l2ZSBhY2Nlc3Mgc3RhcnRfcm93IG51bWJlcnMgZGlmZmVyIGJ5IGV4YWN0bHkKKyAqIG51bV9yb3dzID0gbWF4YWNjZXNzLiAgVGhpcyBtZWFucyB3ZSBjYW4gZ2V0IGdvb2QgcGVyZm9ybWFuY2Ugd2l0aCBzaW1wbGUKKyAqIGJ1ZmZlciBkdW1wL3JlbG9hZCBsb2dpYywgYnkgbWFraW5nIHRoZSBpbi1tZW1vcnkgYnVmZmVyIGJlIGEgbXVsdGlwbGUKKyAqIG9mIHRoZSBhY2Nlc3MgaGVpZ2h0OyB0aGVuIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYWNjZXNzZXMgYWNyb3NzIGJ1ZmZlcmxvYWQKKyAqIGJvdW5kYXJpZXMuICBUaGUgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2l0aCBvdmVybGFwcGluZyBhY2Nlc3MgcmVxdWVzdHMsCisgKiBidXQgaXQgZG9lc24ndCBoYW5kbGUgYnVmZmVybG9hZCBvdmVybGFwcyB2ZXJ5IGVmZmljaWVudGx5LgorICovCisKKworTUVUSE9EREVGKGp2aXJ0X3NhcnJheV9wdHIpCityZXF1ZXN0X3ZpcnRfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAorCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQorLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIHNhbXBsZSBhcnJheSAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBqdmlydF9zYXJyYXlfcHRyIHJlc3VsdDsKKworICAvKiBPbmx5IElNQUdFLWxpZmV0aW1lIHZpcnR1YWwgYXJyYXlzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkICovCisgIGlmIChwb29sX2lkICE9IEpQT09MX0lNQUdFKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyAgLyogZ2V0IGNvbnRyb2wgYmxvY2sgKi8KKyAgcmVzdWx0ID0gKGp2aXJ0X3NhcnJheV9wdHIpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAorCQkJCQkgIFNJWkVPRihzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wpKTsKKworICByZXN1bHQtPm1lbV9idWZmZXIgPSBOVUxMOwkvKiBtYXJrcyBhcnJheSBub3QgeWV0IHJlYWxpemVkICovCisgIHJlc3VsdC0+cm93c19pbl9hcnJheSA9IG51bXJvd3M7CisgIHJlc3VsdC0+c2FtcGxlc3BlcnJvdyA9IHNhbXBsZXNwZXJyb3c7CisgIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOworICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87CisgIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCisgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IHJlc3VsdDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK01FVEhPRERFRihqdmlydF9iYXJyYXlfcHRyKQorcmVxdWVzdF92aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgYm9vbGVhbiBwcmVfemVybywKKwkJICAgICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzLAorCQkgICAgIEpESU1FTlNJT04gbWF4YWNjZXNzKQorLyogUmVxdWVzdCBhIHZpcnR1YWwgMi1EIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIGp2aXJ0X2JhcnJheV9wdHIgcmVzdWx0OworCisgIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KKyAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KKworICAvKiBnZXQgY29udHJvbCBibG9jayAqLworICByZXN1bHQgPSAoanZpcnRfYmFycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCisJCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCkpOworCisgIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KKyAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKKyAgcmVzdWx0LT5ibG9ja3NwZXJyb3cgPSBibG9ja3NwZXJyb3c7CisgIHJlc3VsdC0+bWF4YWNjZXNzID0gbWF4YWNjZXNzOworICByZXN1bHQtPnByZV96ZXJvID0gcHJlX3plcm87CisgIHJlc3VsdC0+Yl9zX29wZW4gPSBGQUxTRTsJLyogbm8gYXNzb2NpYXRlZCBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICByZXN1bHQtPm5leHQgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IC8qIGFkZCB0byBsaXN0IG9mIHZpcnR1YWwgYXJyYXlzICovCisgIG1lbS0+dmlydF9iYXJyYXlfbGlzdCA9IHJlc3VsdDsKKworICByZXR1cm4gcmVzdWx0OworfQorCisKK01FVEhPRERFRih2b2lkKQorcmVhbGl6ZV92aXJ0X2FycmF5cyAoal9jb21tb25fcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgdGhlIGluLW1lbW9yeSBidWZmZXJzIGZvciBhbnkgdW5yZWFsaXplZCB2aXJ0dWFsIGFycmF5cyAqLworeworICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOworICBsb25nIHNwYWNlX3Blcl9taW5oZWlnaHQsIG1heGltdW1fc3BhY2UsIGF2YWlsX21lbTsKKyAgbG9uZyBtaW5oZWlnaHRzLCBtYXhfbWluaGVpZ2h0czsKKyAganZpcnRfc2FycmF5X3B0ciBzcHRyOworICBqdmlydF9iYXJyYXlfcHRyIGJwdHI7CisKKyAgLyogQ29tcHV0ZSB0aGUgbWluaW11bSBzcGFjZSBuZWVkZWQgKG1heGFjY2VzcyByb3dzIGluIGVhY2ggYnVmZmVyKQorICAgKiBhbmQgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIChmdWxsIGltYWdlIGhlaWdodCBpbiBlYWNoIGJ1ZmZlcikuCisgICAqIFRoZXNlIG1heSBiZSBvZiB1c2UgdG8gdGhlIHN5c3RlbS1kZXBlbmRlbnQganBlZ19tZW1fYXZhaWxhYmxlIHJvdXRpbmUuCisgICAqLworICBzcGFjZV9wZXJfbWluaGVpZ2h0ID0gMDsKKyAgbWF4aW11bV9zcGFjZSA9IDA7CisgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgeworICAgIGlmIChzcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLworICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgc3B0ci0+bWF4YWNjZXNzICoKKwkJCSAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7CisgICAgICBtYXhpbXVtX3NwYWNlICs9IChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5ICoKKwkJICAgICAgIChsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOworICAgIH0KKyAgfQorICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIHNwYWNlX3Blcl9taW5oZWlnaHQgKz0gKGxvbmcpIGJwdHItPm1heGFjY2VzcyAqCisJCQkgICAgIChsb25nKSBicHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKKyAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkgICAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgIH0KKyAgfQorCisgIGlmIChzcGFjZV9wZXJfbWluaGVpZ2h0IDw9IDApCisgICAgcmV0dXJuOwkJCS8qIG5vIHVucmVhbGl6ZWQgYXJyYXlzLCBubyB3b3JrICovCisKKyAgLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBtZW1vcnkgdG8gYWN0dWFsbHkgdXNlOyB0aGlzIGlzIHN5c3RlbS1kZXBlbmRlbnQuICovCisgIGF2YWlsX21lbSA9IGpwZWdfbWVtX2F2YWlsYWJsZShjaW5mbywgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwKKwkJCQkgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQpOworCisgIC8qIElmIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBpcyBhdmFpbGFibGUsIG1ha2UgYWxsIHRoZSBidWZmZXJzIGZ1bGwKKyAgICogaGVpZ2h0OyBvdGhlcndpc2UgcGFyY2VsIGl0IG91dCB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBtaW5oZWlnaHRzCisgICAqIGluIGVhY2ggYnVmZmVyLgorICAgKi8KKyAgaWYgKGF2YWlsX21lbSA+PSBtYXhpbXVtX3NwYWNlKQorICAgIG1heF9taW5oZWlnaHRzID0gMTAwMDAwMDAwMEw7CisgIGVsc2UgeworICAgIG1heF9taW5oZWlnaHRzID0gYXZhaWxfbWVtIC8gc3BhY2VfcGVyX21pbmhlaWdodDsKKyAgICAvKiBJZiB0aGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgZW5vdWdoIHNwYWNlLCB0cnkgdG8gZ2V0IHRoZSBtaW5pbXVtCisgICAgICogYW55d2F5LiAgVGhpcyBhbGxvd3MgYSAic3R1YiIgaW1wbGVtZW50YXRpb24gb2YganBlZ19tZW1fYXZhaWxhYmxlKCkuCisgICAgICovCisgICAgaWYgKG1heF9taW5oZWlnaHRzIDw9IDApCisgICAgICBtYXhfbWluaGVpZ2h0cyA9IDE7CisgIH0KKworICAvKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgYW5kIGluaXRpYWxpemUgYmFja2luZyBzdG9yZSBhcyBuZWVkZWQuICovCisKKyAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7CisgICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCisgICAgICBtaW5oZWlnaHRzID0gKChsb25nKSBzcHRyLT5yb3dzX2luX2FycmF5IC0gMUwpIC8gc3B0ci0+bWF4YWNjZXNzICsgMUw7CisgICAgICBpZiAobWluaGVpZ2h0cyA8PSBtYXhfbWluaGVpZ2h0cykgeworCS8qIFRoaXMgYnVmZmVyIGZpdHMgaW4gbWVtb3J5ICovCisJc3B0ci0+cm93c19pbl9tZW0gPSBzcHRyLT5yb3dzX2luX2FycmF5OworICAgICAgfSBlbHNlIHsKKwkvKiBJdCBkb2Vzbid0IGZpdCBpbiBtZW1vcnksIGNyZWF0ZSBiYWNraW5nIHN0b3JlLiAqLworCXNwdHItPnJvd3NfaW5fbWVtID0gKEpESU1FTlNJT04pIChtYXhfbWluaGVpZ2h0cyAqIHNwdHItPm1heGFjY2Vzcyk7CisJanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUoY2luZm8sICYgc3B0ci0+Yl9zX2luZm8sCisJCQkJKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgorCQkJCShsb25nKSBzcHRyLT5zYW1wbGVzcGVycm93ICoKKwkJCQkobG9uZykgU0laRU9GKEpTQU1QTEUpKTsKKwlzcHRyLT5iX3Nfb3BlbiA9IFRSVUU7CisgICAgICB9CisgICAgICBzcHRyLT5tZW1fYnVmZmVyID0gYWxsb2Nfc2FycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBzcHRyLT5zYW1wbGVzcGVycm93LCBzcHRyLT5yb3dzX2luX21lbSk7CisgICAgICBzcHRyLT5yb3dzcGVyY2h1bmsgPSBtZW0tPmxhc3Rfcm93c3BlcmNodW5rOworICAgICAgc3B0ci0+Y3VyX3N0YXJ0X3JvdyA9IDA7CisgICAgICBzcHRyLT5maXJzdF91bmRlZl9yb3cgPSAwOworICAgICAgc3B0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgIH0KKworICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKKyAgICBpZiAoYnB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KKyAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIGJwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBicHRyLT5tYXhhY2Nlc3MgKyAxTDsKKyAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7CisJLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KKwlicHRyLT5yb3dzX2luX21lbSA9IGJwdHItPnJvd3NfaW5fYXJyYXk7CisgICAgICB9IGVsc2UgeworCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCisJYnB0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogYnB0ci0+bWF4YWNjZXNzKTsKKwlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBicHRyLT5iX3NfaW5mbywKKwkJCQkobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCisJCQkJKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqCisJCQkJKGxvbmcpIFNJWkVPRihKQkxPQ0spKTsKKwlicHRyLT5iX3Nfb3BlbiA9IFRSVUU7CisgICAgICB9CisgICAgICBicHRyLT5tZW1fYnVmZmVyID0gYWxsb2NfYmFycmF5KGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgICAgICBicHRyLT5ibG9ja3NwZXJyb3csIGJwdHItPnJvd3NfaW5fbWVtKTsKKyAgICAgIGJwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7CisgICAgICBicHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKKyAgICAgIGJwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7CisgICAgICBicHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19zYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKKy8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5ICovCit7CisgIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOworCisgIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKKyAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCisgIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgeworICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCisgICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCisgICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7CisgICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLworICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOworICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCisgICAgICBicmVhazsKKyAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OworICAgIGlmICh3cml0aW5nKQorICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAorCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBlbHNlCisgICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKKwkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOworICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fYmFycmF5X2lvIChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLCBib29sZWFuIHdyaXRpbmcpCisvKiBEbyBiYWNraW5nIHN0b3JlIHJlYWQgb3Igd3JpdGUgb2YgYSB2aXJ0dWFsIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5ICovCit7CisgIGxvbmcgYnl0ZXNwZXJyb3csIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50LCByb3dzLCB0aGlzcm93LCBpOworCisgIGJ5dGVzcGVycm93ID0gKGxvbmcpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7CisgIGZpbGVfb2Zmc2V0ID0gcHRyLT5jdXJfc3RhcnRfcm93ICogYnl0ZXNwZXJyb3c7CisgIC8qIExvb3AgdG8gcmVhZCBvciB3cml0ZSBlYWNoIGFsbG9jYXRpb24gY2h1bmsgaW4gbWVtX2J1ZmZlciAqLworICBmb3IgKGkgPSAwOyBpIDwgKGxvbmcpIHB0ci0+cm93c19pbl9tZW07IGkgKz0gcHRyLT5yb3dzcGVyY2h1bmspIHsKKyAgICAvKiBPbmUgY2h1bmssIGJ1dCBjaGVjayBmb3Igc2hvcnQgY2h1bmsgYXQgZW5kIG9mIGJ1ZmZlciAqLworICAgIHJvd3MgPSBNSU4oKGxvbmcpIHB0ci0+cm93c3BlcmNodW5rLCAobG9uZykgcHRyLT5yb3dzX2luX21lbSAtIGkpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBpcyBjdXJyZW50bHkgZGVmaW5lZCAqLworICAgIHRoaXNyb3cgPSAobG9uZykgcHRyLT5jdXJfc3RhcnRfcm93ICsgaTsKKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPmZpcnN0X3VuZGVmX3JvdyAtIHRoaXNyb3cpOworICAgIC8qIFRyYW5zZmVyIG5vIG1vcmUgdGhhbiBmaXRzIGluIGZpbGUgKi8KKyAgICByb3dzID0gTUlOKHJvd3MsIChsb25nKSBwdHItPnJvd3NfaW5fYXJyYXkgLSB0aGlzcm93KTsKKyAgICBpZiAocm93cyA8PSAwKQkJLyogdGhpcyBjaHVuayBtaWdodCBiZSBwYXN0IGVuZCBvZiBmaWxlISAqLworICAgICAgYnJlYWs7CisgICAgYnl0ZV9jb3VudCA9IHJvd3MgKiBieXRlc3BlcnJvdzsKKyAgICBpZiAod3JpdGluZykKKyAgICAgICgqcHRyLT5iX3NfaW5mby53cml0ZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKKwkJCQkJICAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7CisgICAgZWxzZQorICAgICAgKCpwdHItPmJfc19pbmZvLnJlYWRfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCisJCQkJCSAgICh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbaV0sCisJCQkJCSAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKKyAgICBmaWxlX29mZnNldCArPSBieXRlX2NvdW50OworICB9Cit9CisKKworTUVUSE9EREVGKEpTQU1QQVJSQVkpCithY2Nlc3NfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfc2FycmF5X3B0ciBwdHIsCisJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBudW1fcm93cywKKwkJICAgIGJvb2xlYW4gd3JpdGFibGUpCisvKiBBY2Nlc3MgdGhlIHBhcnQgb2YgYSB2aXJ0dWFsIHNhbXBsZSBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KKy8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLworLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLworeworICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7CisKKyAgLyogZGVidWdnaW5nIGNoZWNrICovCisgIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKKyAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKworICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLworICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8CisgICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKKyAgICBpZiAoISBwdHItPmJfc19vcGVuKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7CisgICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KKyAgICBpZiAocHRyLT5kaXJ0eSkgeworICAgICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOworICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOworICAgIH0KKyAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgorICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKKyAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKKyAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCisgICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQorICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KKyAgICAgKi8KKyAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7CisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCisgICAgICBsb25nIGx0ZW1wOworCisgICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07CisgICAgICBpZiAobHRlbXAgPCAwKQorCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCisgICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7CisgICAgfQorICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgorICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCisgICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgorICAgICAqLworICAgIGRvX3NhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7CisgIH0KKyAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KKyAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKKyAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgorICAgKi8KKyAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgeworICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgeworICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCisgICAgfSBlbHNlIHsKKyAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OworICAgIH0KKyAgICBpZiAod3JpdGFibGUpCisgICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7CisgICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKKyAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKKyAgICAgIHVuZGVmX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7IC8qIG1ha2UgaW5kZXhlcyByZWxhdGl2ZSB0byBidWZmZXIgKi8KKyAgICAgIGVuZF9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OworICAgICAgd2hpbGUgKHVuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKwlqemVyb19mYXIoKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlclt1bmRlZl9yb3ddLCBieXRlc3BlcnJvdyk7CisJdW5kZWZfcm93Kys7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghIHdyaXRhYmxlKQkJLyogcmVhZGVyIGxvb2tpbmcgYXQgdW5kZWZpbmVkIGRhdGEgKi8KKwlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisgICAgfQorICB9CisgIC8qIEZsYWcgdGhlIGJ1ZmZlciBkaXJ0eSBpZiBjYWxsZXIgd2lsbCB3cml0ZSBpbiBpdCAqLworICBpZiAod3JpdGFibGUpCisgICAgcHRyLT5kaXJ0eSA9IFRSVUU7CisgIC8qIFJldHVybiBhZGRyZXNzIG9mIHByb3BlciBwYXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgcmV0dXJuIHB0ci0+bWVtX2J1ZmZlciArIChzdGFydF9yb3cgLSBwdHItPmN1cl9zdGFydF9yb3cpOworfQorCisKK01FVEhPRERFRihKQkxPQ0tBUlJBWSkKK2FjY2Vzc192aXJ0X2JhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyIHB0ciwKKwkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAorCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKKy8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgc3RhcnRpbmcgYXQgc3RhcnRfcm93ICovCisvKiBhbmQgZXh0ZW5kaW5nIGZvciBudW1fcm93cyByb3dzLiAgd3JpdGFibGUgaXMgdHJ1ZSBpZiAgKi8KKy8qIGNhbGxlciBpbnRlbmRzIHRvIG1vZGlmeSB0aGUgYWNjZXNzZWQgYXJlYS4gKi8KK3sKKyAgSkRJTUVOU0lPTiBlbmRfcm93ID0gc3RhcnRfcm93ICsgbnVtX3Jvd3M7CisgIEpESU1FTlNJT04gdW5kZWZfcm93OworCisgIC8qIGRlYnVnZ2luZyBjaGVjayAqLworICBpZiAoZW5kX3JvdyA+IHB0ci0+cm93c19pbl9hcnJheSB8fCBudW1fcm93cyA+IHB0ci0+bWF4YWNjZXNzIHx8CisgICAgICBwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7CisKKyAgLyogTWFrZSB0aGUgZGVzaXJlZCBwYXJ0IG9mIHRoZSB2aXJ0dWFsIGFycmF5IGFjY2Vzc2libGUgKi8KKyAgaWYgKHN0YXJ0X3JvdyA8IHB0ci0+Y3VyX3N0YXJ0X3JvdyB8fAorICAgICAgZW5kX3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdytwdHItPnJvd3NfaW5fbWVtKSB7CisgICAgaWYgKCEgcHRyLT5iX3Nfb3BlbikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVklSVFVBTF9CVUcpOworICAgIC8qIEZsdXNoIG9sZCBidWZmZXIgY29udGVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHB0ci0+ZGlydHkpIHsKKyAgICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBUUlVFKTsKKyAgICAgIHB0ci0+ZGlydHkgPSBGQUxTRTsKKyAgICB9CisgICAgLyogRGVjaWRlIHdoYXQgcGFydCBvZiB2aXJ0dWFsIGFycmF5IHRvIGFjY2Vzcy4KKyAgICAgKiBBbGdvcml0aG06IGlmIHRhcmdldCBhZGRyZXNzID4gY3VycmVudCB3aW5kb3csIGFzc3VtZSBmb3J3YXJkIHNjYW4sCisgICAgICogbG9hZCBzdGFydGluZyBhdCB0YXJnZXQgYWRkcmVzcy4gIElmIHRhcmdldCBhZGRyZXNzIDwgY3VycmVudCB3aW5kb3csCisgICAgICogYXNzdW1lIGJhY2t3YXJkIHNjYW4sIGxvYWQgc28gdGhhdCB0YXJnZXQgYXJlYSBpcyB0b3Agb2Ygd2luZG93LgorICAgICAqIE5vdGUgdGhhdCB3aGVuIHN3aXRjaGluZyBmcm9tIGZvcndhcmQgd3JpdGUgdG8gZm9yd2FyZCByZWFkLCB3aWxsIGhhdmUKKyAgICAgKiBzdGFydF9yb3cgPSAwLCBzbyB0aGUgbGltaXRpbmcgY2FzZSBhcHBsaWVzIGFuZCB3ZSBsb2FkIGZyb20gMCBhbnl3YXkuCisgICAgICovCisgICAgaWYgKHN0YXJ0X3JvdyA+IHB0ci0+Y3VyX3N0YXJ0X3JvdykgeworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gc3RhcnRfcm93OworICAgIH0gZWxzZSB7CisgICAgICAvKiB1c2UgbG9uZyBhcml0aG1ldGljIGhlcmUgdG8gYXZvaWQgb3ZlcmZsb3cgJiB1bnNpZ25lZCBwcm9ibGVtcyAqLworICAgICAgbG9uZyBsdGVtcDsKKworICAgICAgbHRlbXAgPSAobG9uZykgZW5kX3JvdyAtIChsb25nKSBwdHItPnJvd3NfaW5fbWVtOworICAgICAgaWYgKGx0ZW1wIDwgMCkKKwlsdGVtcCA9IDA7CQkvKiBkb24ndCBmYWxsIG9mZiBmcm9udCBlbmQgb2YgZmlsZSAqLworICAgICAgcHRyLT5jdXJfc3RhcnRfcm93ID0gKEpESU1FTlNJT04pIGx0ZW1wOworICAgIH0KKyAgICAvKiBSZWFkIGluIHRoZSBzZWxlY3RlZCBwYXJ0IG9mIHRoZSBhcnJheS4KKyAgICAgKiBEdXJpbmcgdGhlIGluaXRpYWwgd3JpdGUgcGFzcywgd2Ugd2lsbCBkbyBubyBhY3R1YWwgcmVhZAorICAgICAqIGJlY2F1c2UgdGhlIHNlbGVjdGVkIHBhcnQgaXMgYWxsIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBkb19iYXJyYXlfaW8oY2luZm8sIHB0ciwgRkFMU0UpOworICB9CisgIC8qIEVuc3VyZSB0aGUgYWNjZXNzZWQgcGFydCBvZiB0aGUgYXJyYXkgaXMgZGVmaW5lZDsgcHJlemVybyBpZiBuZWVkZWQuCisgICAqIFRvIGltcHJvdmUgbG9jYWxpdHkgb2YgYWNjZXNzLCB3ZSBvbmx5IHByZXplcm8gdGhlIHBhcnQgb2YgdGhlIGFycmF5CisgICAqIHRoYXQgdGhlIGNhbGxlciBpcyBhYm91dCB0byBhY2Nlc3MsIG5vdCB0aGUgZW50aXJlIGluLW1lbW9yeSBhcnJheS4KKyAgICovCisgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IGVuZF9yb3cpIHsKKyAgICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBzdGFydF9yb3cpIHsKKyAgICAgIGlmICh3cml0YWJsZSkJCS8qIHdyaXRlciBza2lwcGVkIG92ZXIgYSBzZWN0aW9uIG9mIGFycmF5ICovCisJRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOworICAgICAgdW5kZWZfcm93ID0gc3RhcnRfcm93OwkvKiBidXQgcmVhZGVyIGlzIGFsbG93ZWQgdG8gcmVhZCBhaGVhZCAqLworICAgIH0gZWxzZSB7CisgICAgICB1bmRlZl9yb3cgPSBwdHItPmZpcnN0X3VuZGVmX3JvdzsKKyAgICB9CisgICAgaWYgKHdyaXRhYmxlKQorICAgICAgcHRyLT5maXJzdF91bmRlZl9yb3cgPSBlbmRfcm93OworICAgIGlmIChwdHItPnByZV96ZXJvKSB7CisgICAgICBzaXplX3QgYnl0ZXNwZXJyb3cgPSAoc2l6ZV90KSBwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOworICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLworICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7CisgICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgeworCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKKwl1bmRlZl9yb3crKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLworCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKKyAgICB9CisgIH0KKyAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCisgIGlmICh3cml0YWJsZSkKKyAgICBwdHItPmRpcnR5ID0gVFJVRTsKKyAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLworICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgYWxsIG9iamVjdHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIHBvb2wuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmcmVlX3Bvb2wgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQpCit7CisgIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07CisgIHNtYWxsX3Bvb2xfcHRyIHNoZHJfcHRyOworICBsYXJnZV9wb29sX3B0ciBsaGRyX3B0cjsKKyAgc2l6ZV90IHNwYWNlX2ZyZWVkOworCisgIGlmIChwb29sX2lkIDwgMCB8fCBwb29sX2lkID49IEpQT09MX05VTVBPT0xTKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QT09MX0lELCBwb29sX2lkKTsJLyogc2FmZXR5IGNoZWNrICovCisKKyNpZmRlZiBNRU1fU1RBVFMKKyAgaWYgKGNpbmZvLT5lcnItPnRyYWNlX2xldmVsID4gMSkKKyAgICBwcmludF9tZW1fc3RhdHMoY2luZm8sIHBvb2xfaWQpOyAvKiBwcmludCBwb29sJ3MgbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MgKi8KKyNlbmRpZgorCisgIC8qIElmIGZyZWVpbmcgSU1BR0UgcG9vbCwgY2xvc2UgYW55IHZpcnR1YWwgYXJyYXlzIGZpcnN0ICovCisgIGlmIChwb29sX2lkID09IEpQT09MX0lNQUdFKSB7CisgICAganZpcnRfc2FycmF5X3B0ciBzcHRyOworICAgIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKKworICAgIGZvciAoc3B0ciA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgc3B0ciAhPSBOVUxMOyBzcHRyID0gc3B0ci0+bmV4dCkgeworICAgICAgaWYgKHNwdHItPmJfc19vcGVuKSB7CS8qIHRoZXJlIG1heSBiZSBubyBiYWNraW5nIHN0b3JlICovCisJc3B0ci0+Yl9zX29wZW4gPSBGQUxTRTsJLyogcHJldmVudCByZWN1cnNpdmUgY2xvc2UgaWYgZXJyb3IgKi8KKwkoKnNwdHItPmJfc19pbmZvLmNsb3NlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBzcHRyLT5iX3NfaW5mbyk7CisgICAgICB9CisgICAgfQorICAgIG1lbS0+dmlydF9zYXJyYXlfbGlzdCA9IE5VTEw7CisgICAgZm9yIChicHRyID0gbWVtLT52aXJ0X2JhcnJheV9saXN0OyBicHRyICE9IE5VTEw7IGJwdHIgPSBicHRyLT5uZXh0KSB7CisgICAgICBpZiAoYnB0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KKwlicHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLworCSgqYnB0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKKyAgfQorCisgIC8qIFJlbGVhc2UgbGFyZ2Ugb2JqZWN0cyAqLworICBsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsKKyAgbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdID0gTlVMTDsKKworICB3aGlsZSAobGhkcl9wdHIgIT0gTlVMTCkgeworICAgIGxhcmdlX3Bvb2xfcHRyIG5leHRfbGhkcl9wdHIgPSBsaGRyX3B0ci0+aGRyLm5leHQ7CisgICAgc3BhY2VfZnJlZWQgPSBsaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKworCQkgIGxoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCisJCSAgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKKyAgICBqcGVnX2ZyZWVfbGFyZ2UoY2luZm8sICh2b2lkIEZBUiAqKSBsaGRyX3B0ciwgc3BhY2VfZnJlZWQpOworICAgIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkIC09IHNwYWNlX2ZyZWVkOworICAgIGxoZHJfcHRyID0gbmV4dF9saGRyX3B0cjsKKyAgfQorCisgIC8qIFJlbGVhc2Ugc21hbGwgb2JqZWN0cyAqLworICBzaGRyX3B0ciA9IG1lbS0+c21hbGxfbGlzdFtwb29sX2lkXTsKKyAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gTlVMTDsKKworICB3aGlsZSAoc2hkcl9wdHIgIT0gTlVMTCkgeworICAgIHNtYWxsX3Bvb2xfcHRyIG5leHRfc2hkcl9wdHIgPSBzaGRyX3B0ci0+aGRyLm5leHQ7CisgICAgc3BhY2VfZnJlZWQgPSBzaGRyX3B0ci0+aGRyLmJ5dGVzX3VzZWQgKworCQkgIHNoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCArCisJCSAgU0laRU9GKHNtYWxsX3Bvb2xfaGRyKTsKKyAgICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIHNoZHJfcHRyLCBzcGFjZV9mcmVlZCk7CisgICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7CisgICAgc2hkcl9wdHIgPSBuZXh0X3NoZHJfcHRyOworICB9Cit9CisKKworLyoKKyAqIENsb3NlIHVwIHNob3AgZW50aXJlbHkuCisgKiBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgY2FsbGVkIHVubGVzcyBjaW5mby0+bWVtIGlzIG5vbi1OVUxMLgorICovCisKK01FVEhPRERFRih2b2lkKQorc2VsZl9kZXN0cnVjdCAoal9jb21tb25fcHRyIGNpbmZvKQoreworICBpbnQgcG9vbDsKKworICAvKiBDbG9zZSBhbGwgYmFja2luZyBzdG9yZSwgcmVsZWFzZSBhbGwgbWVtb3J5LgorICAgKiBSZWxlYXNpbmcgcG9vbHMgaW4gcmV2ZXJzZSBvcmRlciBtaWdodCBoZWxwIGF2b2lkIGZyYWdtZW50YXRpb24KKyAgICogd2l0aCBzb21lIChicmFpbi1kYW1hZ2VkKSBtYWxsb2MgbGlicmFyaWVzLgorICAgKi8KKyAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgeworICAgIGZyZWVfcG9vbChjaW5mbywgcG9vbCk7CisgIH0KKworICAvKiBSZWxlYXNlIHRoZSBtZW1vcnkgbWFuYWdlciBjb250cm9sIGJsb2NrIHRvby4gKi8KKyAganBlZ19mcmVlX3NtYWxsKGNpbmZvLCAodm9pZCAqKSBjaW5mby0+bWVtLCBTSVpFT0YobXlfbWVtb3J5X21ncikpOworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGVuc3VyZXMgSSB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UgKi8KKworICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJCS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLworfQorCisKKy8qCisgKiBNZW1vcnkgbWFuYWdlciBpbml0aWFsaXphdGlvbi4KKyAqIFdoZW4gdGhpcyBpcyBjYWxsZWQsIG9ubHkgdGhlIGVycm9yIG1hbmFnZXIgcG9pbnRlciBpcyB2YWxpZCBpbiBjaW5mbyEKKyAqLworCitHTE9CQUwodm9pZCkKK2ppbml0X21lbW9yeV9tZ3IgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgbXlfbWVtX3B0ciBtZW07CisgIGxvbmcgbWF4X3RvX3VzZTsKKyAgaW50IHBvb2w7CisgIHNpemVfdCB0ZXN0X21hYzsKKworICBjaW5mby0+bWVtID0gTlVMTDsJCS8qIGZvciBzYWZldHkgaWYgaW5pdCBmYWlscyAqLworCisgIC8qIENoZWNrIGZvciBjb25maWd1cmF0aW9uIGVycm9ycy4KKyAgICogU0laRU9GKEFMSUdOX1RZUEUpIHNob3VsZCBiZSBhIHBvd2VyIG9mIDI7IG90aGVyd2lzZSwgaXQgcHJvYmFibHkKKyAgICogZG9lc24ndCByZWZsZWN0IGFueSByZWFsIGhhcmR3YXJlIGFsaWdubWVudCByZXF1aXJlbWVudC4KKyAgICogVGhlIHRlc3QgaXMgYSBsaXR0bGUgdHJpY2t5OiBmb3IgWD4wLCBYIGFuZCBYLTEgaGF2ZSBubyBvbmUtYml0cworICAgKiBpbiBjb21tb24gaWYgYW5kIG9ubHkgaWYgWCBpcyBhIHBvd2VyIG9mIDIsIGllIGhhcyBvbmx5IG9uZSBvbmUtYml0LgorICAgKiBTb21lIGNvbXBpbGVycyBtYXkgZ2l2ZSBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBoZXJlOyBpZ25vcmUgaXQuCisgICAqLworICBpZiAoKFNJWkVPRihBTElHTl9UWVBFKSAmIChTSVpFT0YoQUxJR05fVFlQRSktMSkpICE9IDApCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxJR05fVFlQRSk7CisgIC8qIE1BWF9BTExPQ19DSFVOSyBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZSBzaXplX3QsIGFuZCBtdXN0IGJlCisgICAqIGEgbXVsdGlwbGUgb2YgU0laRU9GKEFMSUdOX1RZUEUpLgorICAgKiBBZ2FpbiwgYW4gInVucmVhY2hhYmxlIGNvZGUiIHdhcm5pbmcgbWF5IGJlIGlnbm9yZWQgaGVyZS4KKyAgICogQnV0IGEgImNvbnN0YW50IHRvbyBsYXJnZSIgd2FybmluZyBtZWFucyB5b3UgbmVlZCB0byBmaXggTUFYX0FMTE9DX0NIVU5LLgorICAgKi8KKyAgdGVzdF9tYWMgPSAoc2l6ZV90KSBNQVhfQUxMT0NfQ0hVTks7CisgIGlmICgobG9uZykgdGVzdF9tYWMgIT0gTUFYX0FMTE9DX0NIVU5LIHx8CisgICAgICAoTUFYX0FMTE9DX0NIVU5LICUgU0laRU9GKEFMSUdOX1RZUEUpKSAhPSAwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0FMTE9DX0NIVU5LKTsKKworICBtYXhfdG9fdXNlID0ganBlZ19tZW1faW5pdChjaW5mbyk7IC8qIHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gKi8KKworICAvKiBBdHRlbXB0IHRvIGFsbG9jYXRlIG1lbW9yeSBtYW5hZ2VyJ3MgY29udHJvbCBibG9jayAqLworICBtZW0gPSAobXlfbWVtX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7CisKKyAgaWYgKG1lbSA9PSBOVUxMKSB7CisgICAganBlZ19tZW1fdGVybShjaW5mbyk7CS8qIHN5c3RlbS1kZXBlbmRlbnQgY2xlYW51cCAqLworICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX09VVF9PRl9NRU1PUlksIDApOworICB9CisKKyAgLyogT0ssIGZpbGwgaW4gdGhlIG1ldGhvZCBwb2ludGVycyAqLworICBtZW0tPnB1Yi5hbGxvY19zbWFsbCA9IGFsbG9jX3NtYWxsOworICBtZW0tPnB1Yi5hbGxvY19sYXJnZSA9IGFsbG9jX2xhcmdlOworICBtZW0tPnB1Yi5hbGxvY19zYXJyYXkgPSBhbGxvY19zYXJyYXk7CisgIG1lbS0+cHViLmFsbG9jX2JhcnJheSA9IGFsbG9jX2JhcnJheTsKKyAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X3NhcnJheSA9IHJlcXVlc3RfdmlydF9zYXJyYXk7CisgIG1lbS0+cHViLnJlcXVlc3RfdmlydF9iYXJyYXkgPSByZXF1ZXN0X3ZpcnRfYmFycmF5OworICBtZW0tPnB1Yi5yZWFsaXplX3ZpcnRfYXJyYXlzID0gcmVhbGl6ZV92aXJ0X2FycmF5czsKKyAgbWVtLT5wdWIuYWNjZXNzX3ZpcnRfc2FycmF5ID0gYWNjZXNzX3ZpcnRfc2FycmF5OworICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9iYXJyYXkgPSBhY2Nlc3NfdmlydF9iYXJyYXk7CisgIG1lbS0+cHViLmZyZWVfcG9vbCA9IGZyZWVfcG9vbDsKKyAgbWVtLT5wdWIuc2VsZl9kZXN0cnVjdCA9IHNlbGZfZGVzdHJ1Y3Q7CisKKyAgLyogTWFrZSBNQVhfQUxMT0NfQ0hVTksgYWNjZXNzaWJsZSB0byBvdGhlciBtb2R1bGVzICovCisgIG1lbS0+cHViLm1heF9hbGxvY19jaHVuayA9IE1BWF9BTExPQ19DSFVOSzsKKworICAvKiBJbml0aWFsaXplIHdvcmtpbmcgc3RhdGUgKi8KKyAgbWVtLT5wdWIubWF4X21lbW9yeV90b191c2UgPSBtYXhfdG9fdXNlOworCisgIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPj0gSlBPT0xfUEVSTUFORU5UOyBwb29sLS0pIHsKKyAgICBtZW0tPnNtYWxsX2xpc3RbcG9vbF0gPSBOVUxMOworICAgIG1lbS0+bGFyZ2VfbGlzdFtwb29sXSA9IE5VTEw7CisgIH0KKyAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKKyAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gTlVMTDsKKworICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCA9IFNJWkVPRihteV9tZW1vcnlfbWdyKTsKKworICAvKiBEZWNsYXJlIG91cnNlbHZlcyBvcGVuIGZvciBidXNpbmVzcyAqLworICBjaW5mby0+bWVtID0gJiBtZW0tPnB1YjsKKworICAvKiBDaGVjayBmb3IgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgSlBFR01FTTsgaWYgZm91bmQsIG92ZXJyaWRlIHRoZQorICAgKiBkZWZhdWx0IG1heF9tZW1vcnkgc2V0dGluZyBmcm9tIGpwZWdfbWVtX2luaXQuICBOb3RlIHRoYXQgdGhlCisgICAqIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBhZ2FpbiBvdmVycmlkZSB0aGlzIHZhbHVlLgorICAgKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZ2V0ZW52KCksIGRlZmluZSBOT19HRVRFTlYgdG8gZGlzYWJsZQorICAgKiB0aGlzIGZlYXR1cmUuCisgICAqLworI2lmbmRlZiBOT19HRVRFTlYKKyAgeyBjaGFyICogbWVtZW52OworCisgICAgaWYgKChtZW1lbnYgPSBnZXRlbnYoIkpQRUdNRU0iKSkgIT0gTlVMTCkgeworICAgICAgY2hhciBjaCA9ICd4JzsKKworICAgICAgaWYgKHNzY2FuZihtZW1lbnYsICIlbGQlYyIsICZtYXhfdG9fdXNlLCAmY2gpID4gMCkgeworCWlmIChjaCA9PSAnbScgfHwgY2ggPT0gJ00nKQorCSAgbWF4X3RvX3VzZSAqPSAxMDAwTDsKKwltZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2UgKiAxMDAwTDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorCit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbW5hbWUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTZkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1lbW5hbWUuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIGptZW1uYW1lLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQKKyAqIHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdAorICogeW91IG11c3QgZXhwbGljaXRseSBjb25zdHJ1Y3QgYSBuYW1lIGZvciBlYWNoIHRlbXAgZmlsZS4KKyAqIEFsc28sIHRoZSBwcm9ibGVtIG9mIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgbWVtb3J5IGF2YWlsYWJsZQorICogaXMgc2hvdmVkIG9udG8gdGhlIHVzZXIuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorI2luY2x1ZGUgImptZW1zeXMuaCIJCS8qIGltcG9ydCB0aGUgc3lzdGVtLWRlcGVuZGVudCBkZWNsYXJhdGlvbnMgKi8KKworI2lmbmRlZiBIQVZFX1NURExJQl9ICQkvKiA8c3RkbGliLmg+IHNob3VsZCBkZWNsYXJlIG1hbGxvYygpLGZyZWUoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgSlBQKChzaXplX3Qgc2l6ZSkpOworZXh0ZXJuIHZvaWQgZnJlZSBKUFAoKHZvaWQgKnB0cikpOworI2VuZGlmCisKKyNpZm5kZWYgU0VFS19TRVQJCS8qIHByZS1BTlNJIHN5c3RlbXMgbWF5IG5vdCBkZWZpbmUgdGhpczsgKi8KKyNkZWZpbmUgU0VFS19TRVQgIDAJCS8qIGlmIG5vdCwgYXNzdW1lIDAgaXMgY29ycmVjdCAqLworI2VuZGlmCisKKyNpZmRlZiBET05UX1VTRV9CX01PREUJCS8qIGRlZmluZSBtb2RlIHBhcmFtZXRlcnMgZm9yIGZvcGVuKCkgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInIiCisjZGVmaW5lIFJXX0JJTkFSWQkidysiCisjZWxzZQorI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgorI2RlZmluZSBSV19CSU5BUlkJIncrYiIsICJjdHg9c3RtIgorI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZGVmaW5lIFJXX0JJTkFSWQkidytiIgorI2VuZGlmCisjZW5kaWYKKworCisvKgorICogU2VsZWN0aW9uIG9mIGEgZmlsZSBuYW1lIGZvciBhIHRlbXBvcmFyeSBmaWxlLgorICogVGhpcyBpcyBzeXN0ZW0tZGVwZW5kZW50IQorICoKKyAqIFRoZSBjb2RlIGFzIGdpdmVuIGlzIHN1aXRhYmxlIGZvciBtb3N0IFVuaXggc3lzdGVtcywgYW5kIGl0IGlzIGVhc2lseQorICogbW9kaWZpZWQgZm9yIG1vc3Qgbm9uLVVuaXggc3lzdGVtcy4gIFNvbWUgbm90ZXM6CisgKiAgMS4gIFRoZSB0ZW1wIGZpbGUgaXMgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5IG5hbWVkIGJ5IFRFTVBfRElSRUNUT1JZLgorICogICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAvdXNyL3RtcCwgd2hpY2ggaXMgdGhlIGNvbnZlbnRpb25hbCBwbGFjZSBmb3IKKyAqICAgICAgY3JlYXRpbmcgbGFyZ2UgdGVtcCBmaWxlcyBvbiBVbml4LiAgT24gb3RoZXIgc3lzdGVtcyB5b3UnbGwgcHJvYmFibHkKKyAqICAgICAgd2FudCB0byBjaGFuZ2UgdGhlIGZpbGUgbG9jYXRpb24uICBZb3UgY2FuIGRvIHRoaXMgYnkgZWRpdGluZyB0aGUKKyAqICAgICAgI2RlZmluZSwgb3IgKHByZWZlcnJlZCkgYnkgZGVmaW5pbmcgVEVNUF9ESVJFQ1RPUlkgaW4gamNvbmZpZy5oLgorICoKKyAqICAyLiAgSWYgeW91IG5lZWQgdG8gY2hhbmdlIHRoZSBmaWxlIG5hbWUgYXMgd2VsbCBhcyBpdHMgbG9jYXRpb24sCisgKiAgICAgIHlvdSBjYW4gb3ZlcnJpZGUgdGhlIFRFTVBfRklMRV9OQU1FIG1hY3JvLiAgKE5vdGUgdGhhdCB0aGlzIGlzCisgKiAgICAgIGFjdHVhbGx5IGEgcHJpbnRmIGZvcm1hdCBzdHJpbmc7IGl0IG11c3QgY29udGFpbiAlcyBhbmQgJWQuKQorICogICAgICBGZXcgcGVvcGxlIHNob3VsZCBuZWVkIHRvIGRvIHRoaXMuCisgKgorICogIDMuICBta3RlbXAoKSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IG11bHRpcGxlIHByb2Nlc3NlcyBydW5uaW5nCisgKiAgICAgIHNpbXVsdGFuZW91c2x5IHdvbid0IHNlbGVjdCB0aGUgc2FtZSBmaWxlIG5hbWVzLiAgSWYgeW91ciBzeXN0ZW0KKyAqICAgICAgZG9lc24ndCBoYXZlIG1rdGVtcCgpLCBkZWZpbmUgTk9fTUtURU1QIHRvIGRvIGl0IHRoZSBoYXJkIHdheS4KKyAqICAgICAgKElmIHlvdSBkb24ndCBoYXZlIDxlcnJuby5oPiwgYWxzbyBkZWZpbmUgTk9fRVJSTk9fSC4pCisgKgorICogIDQuICBZb3UgcHJvYmFibHkgd2FudCB0byBkZWZpbmUgTkVFRF9TSUdOQUxfQ0FUQ0hFUiBzbyB0aGF0IGNqcGVnLmMvZGpwZWcuYworICogICAgICB3aWxsIGNhdXNlIHRoZSB0ZW1wIGZpbGVzIHRvIGJlIHJlbW92ZWQgaWYgeW91IHN0b3AgdGhlIHByb2dyYW0gZWFybHkuCisgKi8KKworI2lmbmRlZiBURU1QX0RJUkVDVE9SWQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRElSRUNUT1JZICAiL3Vzci90bXAvIiAvKiByZWNvbW1lbmRlZCBzZXR0aW5nIGZvciBVbml4ICovCisjZW5kaWYKKworc3RhdGljIGludCBuZXh0X2ZpbGVfbnVtOwkvKiB0byBkaXN0aW5ndWlzaCBhbW9uZyBzZXZlcmFsIHRlbXAgZmlsZXMgKi8KKworI2lmZGVmIE5PX01LVEVNUAorCisjaWZuZGVmIFRFTVBfRklMRV9OQU1FCQkvKiBjYW4gb3ZlcnJpZGUgZnJvbSBqY29uZmlnLmggb3IgTWFrZWZpbGUgKi8KKyNkZWZpbmUgVEVNUF9GSUxFX05BTUUgICIlc0pQRyUwM2QuVE1QIgorI2VuZGlmCisKKyNpZm5kZWYgTk9fRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CQkvKiB0byBkZWZpbmUgRU5PRU5UICovCisjZW5kaWYKKworLyogQU5TSSBDIHNwZWNpZmllcyB0aGF0IGVycm5vIGlzIGEgbWFjcm8sIGJ1dCBvbiBvbGRlciBzeXN0ZW1zIGl0J3MgbW9yZQorICogbGlrZWx5IHRvIGJlIGEgcGxhaW4gaW50IHZhcmlhYmxlLiAgQW5kIG5vdCBhbGwgdmVyc2lvbnMgb2YgZXJybm8uaAorICogYm90aGVyIHRvIGRlY2xhcmUgaXQsIHNvIHdlIGhhdmUgdG8gaW4gb3JkZXIgdG8gYmUgbW9zdCBwb3J0YWJsZS4gIFRodXM6CisgKi8KKyNpZm5kZWYgZXJybm8KK2V4dGVybiBpbnQgZXJybm87CisjZW5kaWYKKworCitMT0NBTCh2b2lkKQorc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQoreworICBGSUxFICogdGZpbGU7CisKKyAgLyogS2VlcCBnZW5lcmF0aW5nIGZpbGUgbmFtZXMgdGlsbCB3ZSBmaW5kIG9uZSB0aGF0J3Mgbm90IGluIHVzZSAqLworICBmb3IgKDs7KSB7CisgICAgbmV4dF9maWxlX251bSsrOwkJLyogYWR2YW5jZSBjb3VudGVyICovCisgICAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKKyAgICBpZiAoKHRmaWxlID0gZm9wZW4oZm5hbWUsIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgLyogZm9wZW4gY291bGQgaGF2ZSBmYWlsZWQgZm9yIGEgcmVhc29uIG90aGVyIHRoYW4gdGhlIGZpbGUgbm90CisgICAgICAgKiBiZWluZyB0aGVyZTsgZm9yIGV4YW1wbGUsIGZpbGUgdGhlcmUgYnV0IHVucmVhZGFibGUuCisgICAgICAgKiBJZiA8ZXJybm8uaD4gaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIHdlIGNhbm5vdCB0ZXN0IHRoZSBjYXVzZS4KKyAgICAgICAqLworI2lmZGVmIEVOT0VOVAorICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKKwljb250aW51ZTsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGZjbG9zZSh0ZmlsZSk7CQkvKiBvb3BzLCBpdCdzIHRoZXJlOyBjbG9zZSB0ZmlsZSAmIHRyeSBhZ2FpbiAqLworICB9Cit9CisKKyNlbHNlIC8qICEgTk9fTUtURU1QICovCisKKy8qIE5vdGUgdGhhdCBta3RlbXAoKSByZXF1aXJlcyB0aGUgaW5pdGlhbCBmaWxlbmFtZSB0byBlbmQgaW4gc2l4IFgncyAqLworI2lmbmRlZiBURU1QX0ZJTEVfTkFNRQkJLyogY2FuIG92ZXJyaWRlIGZyb20gamNvbmZpZy5oIG9yIE1ha2VmaWxlICovCisjZGVmaW5lIFRFTVBfRklMRV9OQU1FICAiJXNKUEclZFhYWFhYWCIKKyNlbmRpZgorCitMT0NBTCh2b2lkKQorc2VsZWN0X2ZpbGVfbmFtZSAoY2hhciAqIGZuYW1lKQoreworICBuZXh0X2ZpbGVfbnVtKys7CQkvKiBhZHZhbmNlIGNvdW50ZXIgKi8KKyAgc3ByaW50ZihmbmFtZSwgVEVNUF9GSUxFX05BTUUsIFRFTVBfRElSRUNUT1JZLCBuZXh0X2ZpbGVfbnVtKTsKKyAgbWt0ZW1wKGZuYW1lKTsJCS8qIG1ha2Ugc3VyZSBmaWxlIG5hbWUgaXMgdW5pcXVlICovCisgIC8qIG1rdGVtcCByZXBsYWNlcyB0aGUgdHJhaWxpbmcgWFhYWFhYIHdpdGggYSB1bmlxdWUgc3RyaW5nIG9mIGNoYXJhY3RlcnMgKi8KK30KKworI2VuZGlmIC8qIE5PX01LVEVNUCAqLworCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSXQncyBpbXBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gYSBwb3J0YWJsZSB3YXk7IG91ciBjdXJyZW50IHNvbHV0aW9uIGlzCisgKiB0byBtYWtlIHRoZSB1c2VyIHRlbGwgdXMgKHdpdGggYSBkZWZhdWx0IHZhbHVlIHNldCBhdCBjb21waWxlIHRpbWUpLgorICogSWYgeW91IGNhbiBhY3R1YWxseSBnZXQgdGhlIGF2YWlsYWJsZSBzcGFjZSwgaXQncyBhIGdvb2QgaWRlYSB0byBzdWJ0cmFjdAorICogYSBzbG9wIGZhY3RvciBvZiA1JSBvciBzby4KKyAqLworCisjaWZuZGVmIERFRkFVTFRfTUFYX01FTQkJLyogc28gY2FuIG92ZXJyaWRlIGZyb20gbWFrZWZpbGUgKi8KKyNkZWZpbmUgREVGQVVMVF9NQVhfTUVNCQkxMDAwMDAwTCAvKiBkZWZhdWx0OiBvbmUgbWVnYWJ5dGUgKi8KKyNlbmRpZgorCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2F2YWlsYWJsZSAoal9jb21tb25fcHRyIGNpbmZvLCBsb25nIG1pbl9ieXRlc19uZWVkZWQsCisJCSAgICBsb25nIG1heF9ieXRlc19uZWVkZWQsIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpCit7CisgIHJldHVybiBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkOworfQorCisKKy8qCisgKiBCYWNraW5nIHN0b3JlICh0ZW1wb3JhcnkgZmlsZSkgbWFuYWdlbWVudC4KKyAqIEJhY2tpbmcgc3RvcmUgb2JqZWN0cyBhcmUgb25seSB1c2VkIHdoZW4gdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgKiBqcGVnX21lbV9hdmFpbGFibGUgaXMgbGVzcyB0aGFuIHRoZSB0b3RhbCBzcGFjZSBuZWVkZWQuICBZb3UgY2FuIGRpc3BlbnNlCisgKiB3aXRoIHRoZXNlIHJvdXRpbmVzIGlmIHlvdSBoYXZlIHBsZW50eSBvZiB2aXJ0dWFsIG1lbW9yeTsgc2VlIGptZW1ub2JzLmMuCisgKi8KKworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkKK3sKKyAgaWYgKGZzZWVrKGluZm8tPnRlbXBfZmlsZSwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RGSUxFX1NFRUspOworICBpZiAoSkZSRUFEKGluZm8tPnRlbXBfZmlsZSwgYnVmZmVyX2FkZHJlc3MsIGJ5dGVfY291bnQpCisgICAgICAhPSAoc2l6ZV90KSBieXRlX2NvdW50KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEZJTEVfUkVBRCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCit3cml0ZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKKwkJICAgICBsb25nIGZpbGVfb2Zmc2V0LCBsb25nIGJ5dGVfY291bnQpCit7CisgIGlmIChmc2VlayhpbmZvLT50ZW1wX2ZpbGUsIGZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9TRUVLKTsKKyAgaWYgKEpGV1JJVEUoaW5mby0+dGVtcF9maWxlLCBidWZmZXJfYWRkcmVzcywgYnl0ZV9jb3VudCkKKyAgICAgICE9IChzaXplX3QpIGJ5dGVfY291bnQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9URklMRV9XUklURSk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjbG9zZV9iYWNraW5nX3N0b3JlIChqX2NvbW1vbl9wdHIgY2luZm8sIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8pCit7CisgIGZjbG9zZShpbmZvLT50ZW1wX2ZpbGUpOwkvKiBjbG9zZSB0aGUgZmlsZSAqLworICB1bmxpbmsoaW5mby0+dGVtcF9uYW1lKTsJLyogZGVsZXRlIHRoZSBmaWxlICovCisvKiBJZiB5b3VyIHN5c3RlbSBkb2Vzbid0IGhhdmUgdW5saW5rKCksIHVzZSByZW1vdmUoKSBpbnN0ZWFkLgorICogcmVtb3ZlKCkgaXMgdGhlIEFOU0ktc3RhbmRhcmQgbmFtZSBmb3IgdGhpcyBmdW5jdGlvbiwgYnV0IGlmCisgKiB5b3VyIHN5c3RlbSB3YXMgQU5TSSB5b3UnZCBiZSB1c2luZyBqbWVtYW5zaS5jLCByaWdodD8KKyAqLworICBUUkFDRU1TUyhjaW5mbywgMSwgSlRSQ19URklMRV9DTE9TRSwgaW5mby0+dGVtcF9uYW1lKTsKK30KKworCisvKgorICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQoreworICBzZWxlY3RfZmlsZV9uYW1lKGluZm8tPnRlbXBfbmFtZSk7CisgIGlmICgoaW5mby0+dGVtcF9maWxlID0gZm9wZW4oaW5mby0+dGVtcF9uYW1lLCBSV19CSU5BUlkpKSA9PSBOVUxMKQorICAgIEVSUkVYSVRTKGNpbmZvLCBKRVJSX1RGSUxFX0NSRUFURSwgaW5mby0+dGVtcF9uYW1lKTsKKyAgaW5mby0+cmVhZF9iYWNraW5nX3N0b3JlID0gcmVhZF9iYWNraW5nX3N0b3JlOworICBpbmZvLT53cml0ZV9iYWNraW5nX3N0b3JlID0gd3JpdGVfYmFja2luZ19zdG9yZTsKKyAgaW5mby0+Y2xvc2VfYmFja2luZ19zdG9yZSA9IGNsb3NlX2JhY2tpbmdfc3RvcmU7CisgIFRSQUNFTVNTKGNpbmZvLCAxLCBKVFJDX1RGSUxFX09QRU4sIGluZm8tPnRlbXBfbmFtZSk7Cit9CisKKworLyoKKyAqIFRoZXNlIHJvdXRpbmVzIHRha2UgY2FyZSBvZiBhbnkgc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiBhbmQKKyAqIGNsZWFudXAgcmVxdWlyZWQuCisgKi8KKworR0xPQkFMKGxvbmcpCitqcGVnX21lbV9pbml0IChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIG5leHRfZmlsZV9udW0gPSAwOwkJLyogaW5pdGlhbGl6ZSB0ZW1wIGZpbGUgbmFtZSBnZW5lcmF0b3IgKi8KKyAgcmV0dXJuIERFRkFVTFRfTUFYX01FTTsJLyogZGVmYXVsdCBmb3IgbWF4X21lbW9yeV90b191c2UgKi8KK30KKworR0xPQkFMKHZvaWQpCitqcGVnX21lbV90ZXJtIChqX2NvbW1vbl9wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtbm9icy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1ub2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4YzMzNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtbm9icy5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogam1lbW5vYnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIHByb3ZpZGVzIGEgcmVhbGx5IHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3lzdGVtLQorICogZGVwZW5kZW50IHBvcnRpb24gb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBUaGlzIGltcGxlbWVudGF0aW9uCisgKiBhc3N1bWVzIHRoYXQgbm8gYmFja2luZy1zdG9yZSBmaWxlcyBhcmUgbmVlZGVkOiBhbGwgcmVxdWlyZWQgc3BhY2UKKyAqIGNhbiBiZSBvYnRhaW5lZCBmcm9tIG1hbGxvYygpLgorICogVGhpcyBpcyB2ZXJ5IHBvcnRhYmxlIGluIHRoZSBzZW5zZSB0aGF0IGl0J2xsIGNvbXBpbGUgb24gYWxtb3N0IGFueXRoaW5nLAorICogYnV0IHlvdSdkIGJldHRlciBoYXZlIGxvdHMgb2YgbWFpbiBtZW1vcnkgKG9yIHZpcnR1YWwgbWVtb3J5KSBpZiB5b3Ugd2FudAorICogdG8gcHJvY2VzcyBiaWcgaW1hZ2VzLgorICogTm90ZSB0aGF0IHRoZSBtYXhfbWVtb3J5X3RvX3VzZSBvcHRpb24gaXMgaWdub3JlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLgorICovCisKKyNkZWZpbmUgSlBFR19JTlRFUk5BTFMKKyNpbmNsdWRlICJqaW5jbHVkZS5oIgorI2luY2x1ZGUgImpwZWdsaWIuaCIKKyNpbmNsdWRlICJqbWVtc3lzLmgiCQkvKiBpbXBvcnQgdGhlIHN5c3RlbS1kZXBlbmRlbnQgZGVjbGFyYXRpb25zICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSxmcmVlKCkgKi8KK2V4dGVybiB2b2lkICogbWFsbG9jIEpQUCgoc2l6ZV90IHNpemUpKTsKK2V4dGVybiB2b2lkIGZyZWUgSlBQKCh2b2lkICpwdHIpKTsKKyNlbmRpZgorCisKKy8qCisgKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5CisgKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgorICovCisKK0dMT0JBTCh2b2lkICopCitqcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQoreworICByZXR1cm4gKHZvaWQgKikgbWFsbG9jKHNpemVvZm9iamVjdCk7Cit9CisKK0dMT0JBTCh2b2lkKQoranBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogIkxhcmdlIiBvYmplY3RzIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzICJzbWFsbCIgb25lcy4KKyAqIE5COiBhbHRob3VnaCB3ZSBpbmNsdWRlIEZBUiBrZXl3b3JkcyBpbiB0aGUgcm91dGluZSBkZWNsYXJhdGlvbnMsCisgKiB0aGlzIGZpbGUgd29uJ3QgYWN0dWFsbHkgd29yayBpbiA4MHg4NiBzbWFsbC9tZWRpdW0gbW9kZWw7IGF0IGxlYXN0LAorICogeW91IHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gcHJvY2VzcyB1c2VmdWwtc2l6ZSBpbWFnZXMgaW4gb25seSA2NEtCLgorICovCisKK0dMT0JBTCh2b2lkIEZBUiAqKQoranBlZ19nZXRfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgc2l6ZV90IHNpemVvZm9iamVjdCkKK3sKKyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKK30KKworR0xPQkFMKHZvaWQpCitqcGVnX2ZyZWVfbGFyZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCit7CisgIGZyZWUob2JqZWN0KTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBtZW1vcnkgc3BhY2UgYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uLgorICogSGVyZSB3ZSBhbHdheXMgc2F5LCAid2UgZ290IGFsbCB5b3Ugd2FudCBidWQhIgorICovCisKK0dMT0JBTChsb25nKQoranBlZ19tZW1fYXZhaWxhYmxlIChqX2NvbW1vbl9wdHIgY2luZm8sIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkKK3sKKyAgcmV0dXJuIG1heF9ieXRlc19uZWVkZWQ7Cit9CisKKworLyoKKyAqIEJhY2tpbmcgc3RvcmUgKHRlbXBvcmFyeSBmaWxlKSBtYW5hZ2VtZW50LgorICogU2luY2UganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyBwcm9taXNlZCB0aGUgbW9vbiwKKyAqIHRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBhbmQgd2UgY2FuIGp1c3QgZXJyb3Igb3V0LgorICovCisKK0dMT0JBTCh2b2lkKQoranBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgKGpfY29tbW9uX3B0ciBjaW5mbywgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKKwkJCSBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkKK3sKKyAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19CQUNLSU5HX1NUT1JFKTsKK30KKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4gIEhlcmUsIHRoZXJlIGlzbid0IGFueS4KKyAqLworCitHTE9CQUwobG9uZykKK2pwZWdfbWVtX2luaXQgKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgcmV0dXJuIDA7CQkJLyoganVzdCBzZXQgbWF4X21lbW9yeV90b191c2UgdG8gMCAqLworfQorCitHTE9CQUwodm9pZCkKK2pwZWdfbWVtX3Rlcm0gKGpfY29tbW9uX3B0ciBjaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2ptZW1zeXMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkMWM2MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbWVtc3lzLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBqbWVtc3lzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBzeXN0ZW0taW5kZXBlbmRlbnQKKyAqIGFuZCBzeXN0ZW0tZGVwZW5kZW50IHBvcnRpb25zIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgTm8gb3RoZXIKKyAqIG1vZHVsZXMgbmVlZCBpbmNsdWRlIGl0LiAgKFRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgcG9ydGlvbiBpcyBqbWVtbWdyLmM7CisgKiB0aGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbi4pCisgKgorICogVGhpcyBmaWxlIHdvcmtzIGFzLWlzIGZvciB0aGUgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkgbWFuYWdlcnMgc3VwcGxpZWQKKyAqIGluIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAgWW91IG1heSBuZWVkIHRvIG1vZGlmeSBpdCBpZiB5b3Ugd3JpdGUgYQorICogY3VzdG9tIG1lbW9yeSBtYW5hZ2VyLiAgSWYgc3lzdGVtLWRlcGVuZGVudCBjaGFuZ2VzIGFyZSBuZWVkZWQgaW4KKyAqIHRoaXMgZmlsZSwgdGhlIGJlc3QgbWV0aG9kIGlzIHRvICNpZmRlZiB0aGVtIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgorICogc3ltYm9sIHN1cHBsaWVkIGluIGpjb25maWcuaCwgYXMgd2UgaGF2ZSBkb25lIHdpdGggVVNFX01TRE9TX01FTU1HUgorICogYW5kIFVTRV9NQUNfTUVNTUdSLgorICovCisKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGpwZWdfZ2V0X3NtYWxsCQlqR2V0U21hbGwKKyNkZWZpbmUganBlZ19mcmVlX3NtYWxsCQlqRnJlZVNtYWxsCisjZGVmaW5lIGpwZWdfZ2V0X2xhcmdlCQlqR2V0TGFyZ2UKKyNkZWZpbmUganBlZ19mcmVlX2xhcmdlCQlqRnJlZUxhcmdlCisjZGVmaW5lIGpwZWdfbWVtX2F2YWlsYWJsZQlqTWVtQXZhaWwKKyNkZWZpbmUganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUJak9wZW5CYWNrU3RvcmUKKyNkZWZpbmUganBlZ19tZW1faW5pdAkJak1lbUluaXQKKyNkZWZpbmUganBlZ19tZW1fdGVybQkJak1lbVRlcm0KKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyoKKyAqIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWxsb2NhdGUgYW5kIHJlbGVhc2Ugc21hbGwgY2h1bmtzIG9mCisgKiBtZW1vcnkuICAoVHlwaWNhbGx5IHRoZSB0b3RhbCBhbW91bnQgcmVxdWVzdGVkIHRocm91Z2gganBlZ19nZXRfc21hbGwgaXMKKyAqIG5vIG1vcmUgdGhhbiAyMEsgb3Igc287IHRoaXMgd2lsbCBiZSByZXF1ZXN0ZWQgaW4gY2h1bmtzIG9mIGEgZmV3IEsgZWFjaC4pCisgKiBCZWhhdmlvciBzaG91bGQgYmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBtYWxsb2MKKyAqIGFuZCBmcmVlOyBpbiBwYXJ0aWN1bGFyLCBqcGVnX2dldF9zbWFsbCBtdXN0IHJldHVybiBOVUxMIG9uIGZhaWx1cmUuCisgKiBPbiBtb3N0IHN5c3RlbXMsIHRoZXNlIEFSRSBtYWxsb2MgYW5kIGZyZWUuICBqcGVnX2ZyZWVfc21hbGwgaXMgcGFzc2VkIHRoZQorICogc2l6ZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGZyZWVkLCBqdXN0IGluIGNhc2UgaXQncyBuZWVkZWQuCisgKiBPbiBhbiA4MHg4NiBtYWNoaW5lIHVzaW5nIHNtYWxsLWRhdGEgbWVtb3J5IG1vZGVsLCB0aGVzZSBtYW5hZ2UgbmVhciBoZWFwLgorICovCisKK0VYVEVSTih2b2lkICopIGpwZWdfZ2V0X3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CitFWFRFUk4odm9pZCkganBlZ19mcmVlX3NtYWxsIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkICogb2JqZWN0LAorCQkJCSAgc2l6ZV90IHNpemVvZm9iamVjdCkpOworCisvKgorICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBsYXJnZSBjaHVua3Mgb2YKKyAqIG1lbW9yeSAodXAgdG8gdGhlIHRvdGFsIGZyZWUgc3BhY2UgZGVzaWduYXRlZCBieSBqcGVnX21lbV9hdmFpbGFibGUpLgorICogVGhlIGludGVyZmFjZSBpcyB0aGUgc2FtZSBhcyBhYm92ZSwgZXhjZXB0IHRoYXQgb24gYW4gODB4ODYgbWFjaGluZSwKKyAqIGZhciBwb2ludGVycyBhcmUgdXNlZC4gIE9uIG1vc3Qgb3RoZXIgbWFjaGluZXMgdGhlc2UgYXJlIGlkZW50aWNhbCB0bworICogdGhlIGpwZWdfZ2V0L2ZyZWVfc21hbGwgcm91dGluZXM7IGJ1dCB3ZSBrZWVwIHRoZW0gc2VwYXJhdGUgYW55d2F5LAorICogaW4gY2FzZSBhIGRpZmZlcmVudCBhbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIGRlc2lyYWJsZSBmb3IgbGFyZ2UgY2h1bmtzLgorICovCisKK0VYVEVSTih2b2lkIEZBUiAqKSBqcGVnX2dldF9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICAgc2l6ZV90IHNpemVvZm9iamVjdCkpOworRVhURVJOKHZvaWQpIGpwZWdfZnJlZV9sYXJnZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywgdm9pZCBGQVIgKiBvYmplY3QsCisJCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisKKy8qCisgKiBUaGUgbWFjcm8gTUFYX0FMTE9DX0NIVU5LIGRlc2lnbmF0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF5CisgKiBiZSByZXF1ZXN0ZWQgaW4gYSBzaW5nbGUgY2FsbCB0byBqcGVnX2dldF9sYXJnZSAoYW5kIGpwZWdfZ2V0X3NtYWxsIGZvciB0aGF0CisgKiBtYXR0ZXIsIGJ1dCB0aGF0IGNhc2Ugc2hvdWxkIG5ldmVyIGNvbWUgaW50byBwbGF5KS4gIFRoaXMgbWFjcm8gaXMgbmVlZGVkCisgKiB0byBtb2RlbCB0aGUgNjRLYi1zZWdtZW50LXNpemUgbGltaXQgb2YgZmFyIGFkZHJlc3Npbmcgb24gODB4ODYgbWFjaGluZXMuCisgKiBPbiB0aG9zZSBtYWNoaW5lcywgd2UgZXhwZWN0IHRoYXQgamNvbmZpZy5oIHdpbGwgcHJvdmlkZSBhIHByb3BlciB2YWx1ZS4KKyAqIE9uIG1hY2hpbmVzIHdpdGggMzItYml0IGZsYXQgYWRkcmVzcyBzcGFjZXMsIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgdXNlZC4KKyAqCisgKiBOQjogam1lbW1nci5jIGV4cGVjdHMgdGhhdCBNQVhfQUxMT0NfQ0hVTksgd2lsbCBiZSByZXByZXNlbnRhYmxlIGFzIHR5cGUKKyAqIHNpemVfdCBhbmQgd2lsbCBiZSBhIG11bHRpcGxlIG9mIHNpemVvZihhbGlnbl90eXBlKS4KKyAqLworCisjaWZuZGVmIE1BWF9BTExPQ19DSFVOSwkJLyogbWF5IGJlIG92ZXJyaWRkZW4gaW4gamNvbmZpZy5oICovCisjZGVmaW5lIE1BWF9BTExPQ19DSFVOSyAgMTAwMDAwMDAwMEwKKyNlbmRpZgorCisvKgorICogVGhpcyByb3V0aW5lIGNvbXB1dGVzIHRoZSB0b3RhbCBzcGFjZSBzdGlsbCBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24gYnkKKyAqIGpwZWdfZ2V0X2xhcmdlLiAgSWYgbW9yZSBzcGFjZSB0aGFuIHRoaXMgaXMgbmVlZGVkLCBiYWNraW5nIHN0b3JlIHdpbGwgYmUKKyAqIHVzZWQuICBOT1RFOiBhbnkgbWVtb3J5IGFscmVhZHkgYWxsb2NhdGVkIG11c3Qgbm90IGJlIGNvdW50ZWQuCisgKgorICogVGhlcmUgaXMgYSBtaW5pbXVtIHNwYWNlIHJlcXVpcmVtZW50LCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaW5pbXVtCisgKiBmZWFzaWJsZSBidWZmZXIgc2l6ZXM7IGptZW1tZ3IuYyB3aWxsIHJlcXVlc3QgdGhhdCBtdWNoIHNwYWNlIGV2ZW4gaWYKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSByZXR1cm5zIHplcm8uICBUaGUgbWF4aW11bSBzcGFjZSBuZWVkZWQsIGVub3VnaCB0byBob2xkCisgKiBhbGwgd29ya2luZyBzdG9yYWdlIGluIG1lbW9yeSwgaXMgYWxzbyBwYXNzZWQgaW4gY2FzZSBpdCBpcyB1c2VmdWwuCisgKiBGaW5hbGx5LCB0aGUgdG90YWwgc3BhY2UgYWxyZWFkeSBhbGxvY2F0ZWQgaXMgcGFzc2VkLiAgSWYgbm8gYmV0dGVyCisgKiBtZXRob2QgaXMgYXZhaWxhYmxlLCBjaW5mby0+bWVtLT5tYXhfbWVtb3J5X3RvX3VzZSAtIGFscmVhZHlfYWxsb2NhdGVkCisgKiBpcyBvZnRlbiBhIHN1aXRhYmxlIGNhbGN1bGF0aW9uLgorICoKKyAqIEl0IGlzIE9LIGZvciBqcGVnX21lbV9hdmFpbGFibGUgdG8gdW5kZXJlc3RpbWF0ZSB0aGUgc3BhY2UgYXZhaWxhYmxlCisgKiAodGhhdCdsbCBqdXN0IGxlYWQgdG8gbW9yZSBiYWNraW5nLXN0b3JlIGFjY2VzcyB0aGFuIGlzIHJlYWxseSBuZWNlc3NhcnkpLgorICogSG93ZXZlciwgYW4gb3ZlcmVzdGltYXRlIHdpbGwgbGVhZCB0byBmYWlsdXJlLiAgSGVuY2UgaXQncyB3aXNlIHRvIHN1YnRyYWN0CisgKiBhIHNsb3AgZmFjdG9yIGZyb20gdGhlIHRydWUgYXZhaWxhYmxlIHNwYWNlLiAgNSUgc2hvdWxkIGJlIGVub3VnaC4KKyAqCisgKiBPbiBtYWNoaW5lcyB3aXRoIGxvdHMgb2YgdmlydHVhbCBtZW1vcnksIGFueSBsYXJnZSBjb25zdGFudCBtYXkgYmUgcmV0dXJuZWQuCisgKiBDb252ZXJzZWx5LCB6ZXJvIG1heSBiZSByZXR1cm5lZCB0byBhbHdheXMgdXNlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBtZW1vcnkuCisgKi8KKworRVhURVJOKGxvbmcpIGpwZWdfbWVtX2F2YWlsYWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgIGxvbmcgbWluX2J5dGVzX25lZWRlZCwKKwkJCQkgICAgIGxvbmcgbWF4X2J5dGVzX25lZWRlZCwKKwkJCQkgICAgIGxvbmcgYWxyZWFkeV9hbGxvY2F0ZWQpKTsKKworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgd2hhdGV2ZXIgc3RhdGUgaXMgbmVlZGVkIHRvIGFjY2VzcyBhIHNpbmdsZQorICogYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZS9jbG9zZSBtZXRob2QgcG9pbnRlcnMgYXJlIGNhbGxlZAorICogYnkgam1lbW1nci5jIHRvIG1hbmlwdWxhdGUgdGhlIGJhY2tpbmctc3RvcmUgb2JqZWN0OyBhbGwgb3RoZXIgZmllbGRzCisgKiBhcmUgcHJpdmF0ZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBiYWNraW5nIHN0b3JlIHJvdXRpbmVzLgorICovCisKKyNkZWZpbmUgVEVNUF9OQU1FX0xFTkdUSCAgIDY0CS8qIG1heCBsZW5ndGggb2YgYSB0ZW1wb3JhcnkgZmlsZSdzIG5hbWUgKi8KKworCisjaWZkZWYgVVNFX01TRE9TX01FTU1HUgkJLyogRE9TLXNwZWNpZmljIGp1bmsgKi8KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBYTVNIOwkvKiB0eXBlIG9mIGV4dGVuZGVkLW1lbW9yeSBoYW5kbGVzICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEVNU0g7CS8qIHR5cGUgb2YgZXhwYW5kZWQtbWVtb3J5IGhhbmRsZXMgKi8KKwordHlwZWRlZiB1bmlvbiB7CisgIHNob3J0IGZpbGVfaGFuZGxlOwkJLyogRE9TIGZpbGUgaGFuZGxlIGlmIGl0J3MgYSB0ZW1wIGZpbGUgKi8KKyAgWE1TSCB4bXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBYTVMgKi8KKyAgRU1TSCBlbXNfaGFuZGxlOwkJLyogaGFuZGxlIGlmIGl0J3MgYSBjaHVuayBvZiBFTVMgKi8KK30gaGFuZGxlX3VuaW9uOworCisjZW5kaWYgLyogVVNFX01TRE9TX01FTU1HUiAqLworCisjaWZkZWYgVVNFX01BQ19NRU1NR1IJCS8qIE1hYy1zcGVjaWZpYyBqdW5rICovCisjaW5jbHVkZSA8RmlsZXMuaD4KKyNlbmRpZiAvKiBVU0VfTUFDX01FTU1HUiAqLworCisKK3R5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0ICogYmFja2luZ19zdG9yZV9wdHI7CisKK3R5cGVkZWYgc3RydWN0IGJhY2tpbmdfc3RvcmVfc3RydWN0IHsKKyAgLyogTWV0aG9kcyBmb3IgcmVhZGluZy93cml0aW5nL2Nsb3NpbmcgdGhpcyBiYWNraW5nLXN0b3JlIG9iamVjdCAqLworICBKTUVUSE9EKHZvaWQsIHJlYWRfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAorCQkJCSAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7CisgIEpNRVRIT0Qodm9pZCwgd3JpdGVfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAorCQkJCSAgICAgIHZvaWQgRkFSICogYnVmZmVyX2FkZHJlc3MsCisJCQkJICAgICAgbG9uZyBmaWxlX29mZnNldCwgbG9uZyBieXRlX2NvdW50KSk7CisgIEpNRVRIT0Qodm9pZCwgY2xvc2VfYmFja2luZ19zdG9yZSwgKGpfY29tbW9uX3B0ciBjaW5mbywKKwkJCQkgICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvKSk7CisKKyAgLyogUHJpdmF0ZSBmaWVsZHMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgYmFja2luZy1zdG9yZSBtYW5hZ2VtZW50ICovCisjaWZkZWYgVVNFX01TRE9TX01FTU1HUgorICAvKiBGb3IgdGhlIE1TLURPUyBtYW5hZ2VyIChqbWVtZG9zLmMpLCB3ZSBuZWVkOiAqLworICBoYW5kbGVfdW5pb24gaGFuZGxlOwkJLyogcmVmZXJlbmNlIHRvIGJhY2tpbmctc3RvcmUgc3RvcmFnZSBvYmplY3QgKi8KKyAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgaWYgaXQncyBhIGZpbGUgKi8KKyNlbHNlCisjaWZkZWYgVVNFX01BQ19NRU1NR1IKKyAgLyogRm9yIHRoZSBNYWMgbWFuYWdlciAoam1lbW1hYy5jKSwgd2UgbmVlZDogKi8KKyAgc2hvcnQgdGVtcF9maWxlOwkJLyogZmlsZSByZWZlcmVuY2UgbnVtYmVyIHRvIHRlbXAgZmlsZSAqLworICBGU1NwZWMgdGVtcFNwZWM7CQkvKiB0aGUgRlNTcGVjIGZvciB0aGUgdGVtcCBmaWxlICovCisgIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIGlmIGl0J3MgYSBmaWxlICovCisjZWxzZQorI2lmZGVmIFVTRV9BTkRST0lEX0FTSE1FTQorICBzaG9ydCB0ZW1wX2ZpbGU7CQkvKiBmaWxlIHJlZmVyZW5jZSBudW1iZXIgdG8gdGVtcCBmaWxlICovCisgIHVuc2lnbmVkIGNoYXIqIGFkZHI7ICAvKiB0aGUgbWVtb3J5IGFkZHJlc3MgbWFwcGVkIHRvIGFzaG1lbSAqLworICBsb25nIHNpemU7ICAgICAgICAgICAgLyogdGhlIHJlcXVlc3RlZCBhc2htZW0gc2l6ZSAqLworI2Vsc2UKKyAgLyogRm9yIGEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiB3aXRoIHRlbXAgZmlsZXMsIHdlIG5lZWQ6ICovCisgIEZJTEUgKiB0ZW1wX2ZpbGU7CQkvKiBzdGRpbyByZWZlcmVuY2UgdG8gdGVtcCBmaWxlICovCisgIGNoYXIgdGVtcF9uYW1lW1RFTVBfTkFNRV9MRU5HVEhdOyAvKiBuYW1lIG9mIHRlbXAgZmlsZSAqLworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorfSBiYWNraW5nX3N0b3JlX2luZm87CisKKworLyoKKyAqIEluaXRpYWwgb3BlbmluZyBvZiBhIGJhY2tpbmctc3RvcmUgb2JqZWN0LiAgVGhpcyBtdXN0IGZpbGwgaW4gdGhlCisgKiByZWFkL3dyaXRlL2Nsb3NlIHBvaW50ZXJzIGluIHRoZSBvYmplY3QuICBUaGUgcmVhZC93cml0ZSByb3V0aW5lcworICogbWF5IHRha2UgYW4gZXJyb3IgZXhpdCBpZiB0aGUgc3BlY2lmaWVkIG1heGltdW0gZmlsZSBzaXplIGlzIGV4Y2VlZGVkLgorICogKElmIGpwZWdfbWVtX2F2YWlsYWJsZSBhbHdheXMgcmV0dXJucyBhIGxhcmdlIHZhbHVlLCB0aGlzIHJvdXRpbmUgY2FuCisgKiBqdXN0IHRha2UgYW4gZXJyb3IgZXhpdC4pCisgKi8KKworRVhURVJOKHZvaWQpIGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgIGJhY2tpbmdfc3RvcmVfcHRyIGluZm8sCisJCQkJCSAgbG9uZyB0b3RhbF9ieXRlc19uZWVkZWQpKTsKKworCisvKgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIGFueSBzeXN0ZW0tZGVwZW5kZW50IGluaXRpYWxpemF0aW9uIGFuZAorICogY2xlYW51cCByZXF1aXJlZC4gIGpwZWdfbWVtX2luaXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGlzCisgKiBhbGxvY2F0ZWQgKGFuZCwgdGhlcmVmb3JlLCBub3RoaW5nIGluIGNpbmZvIGlzIG9mIHVzZSBleGNlcHQgdGhlIGVycm9yCisgKiBtYW5hZ2VyIHBvaW50ZXIpLiAgSXQgc2hvdWxkIHJldHVybiBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgZm9yCisgKiBtYXhfbWVtb3J5X3RvX3VzZTsgdGhpcyBtYXkgc3Vic2VxdWVudGx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIHN1cnJvdW5kaW5nCisgKiBhcHBsaWNhdGlvbi4gIChOb3RlIHRoYXQgbWF4X21lbW9yeV90b191c2UgaXMgb25seSBpbXBvcnRhbnQgaWYKKyAqIGpwZWdfbWVtX2F2YWlsYWJsZSBjaG9vc2VzIHRvIGNvbnN1bHQgaXQgLi4uIG5vIG9uZSBlbHNlIHdpbGwuKQorICoganBlZ19tZW1fdGVybSBtYXkgYXNzdW1lIHRoYXQgYWxsIHJlcXVlc3RlZCBtZW1vcnkgaGFzIGJlZW4gZnJlZWQgYW5kIHRoYXQKKyAqIGFsbCBvcGVuZWQgYmFja2luZy1zdG9yZSBvYmplY3RzIGhhdmUgYmVlbiBjbG9zZWQuCisgKi8KKworRVhURVJOKGxvbmcpIGpwZWdfbWVtX2luaXQgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX21lbV90ZXJtIEpQUCgoal9jb21tb25fcHRyIGNpbmZvKSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1vcmVjZmcuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qbW9yZWNmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZGYyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvam1vcmVjZmcuaApAQCAtMCwwICsxLDM5MyBAQAorLyoKKyAqIGptb3JlY2ZnLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUKKyAqIEpQRUcgc29mdHdhcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIG9yIHN1cHBvcnQgbWFjaGluZS1kZXBlbmRlbnQKKyAqIG9wdGltaXphdGlvbnMuICBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gdG91Y2ggdGhpcyBmaWxlLgorICovCisKKy8qCisgKiBEZWZpbmUgQU5EUk9JRF9SR0IgdG8gZW5hYmxlIHNwZWNpZmljIG9wdGltaXphdGlvbnMgZm9yIEFuZHJvaWQKKyAqICAgSkNTX1JHQkFfODg4OCBzdXBwb3J0CisgKiAgIEpDU19SR0JfNTY1IHN1cHBvcnQKKyAqIAorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjZGVmaW5lIEFORFJPSURfUkdCCisKKyNpZmRlZiBBTkRST0lEX1JHQgorI2RlZmluZSBQQUNLX1NIT1JUXzU2NShyLGcsYikgICgoKChyKTw8OCkmMHhmODAwKXwoKChnKTw8MykmMHg3RTApfCgoYik+PjMpKQorI2RlZmluZSBQQUNLX1RXT19QSVhFTFMobCxyKSAgICgocjw8MTYpIHwgbCkKKyNkZWZpbmUgUEFDS19ORUVEX0FMSUdOTUVOVChwdHIpICgoKGludCkoaW50cHRyX3QpKHB0cikpJjMpCisjZGVmaW5lIFdSSVRFX1RXT19QSVhFTFMoYWRkciwgcGl4ZWxzKSBkbyB7ICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzBdID0gKHBpeGVscyk7ICAgICAgICBcCisgICAgICAgICAoKElOVDE2KikoYWRkcikpWzFdID0gKHBpeGVscyk+PjE2OyAgICBcCisgICAgfSB3aGlsZSgwKQorI2RlZmluZSBXUklURV9UV09fQUxJR05FRF9QSVhFTFMoYWRkciwgcGl4ZWxzKSAgKCgqKElOVDMyKikoYWRkcikpID0gcGl4ZWxzKQorI2RlZmluZSBESVRIRVJfNTY1X1IociwgZGl0aGVyKSAoKHIpICsgKChkaXRoZXIpJjB4RkYpKQorI2RlZmluZSBESVRIRVJfNTY1X0coZywgZGl0aGVyKSAoKGcpICsgKCgoZGl0aGVyKSYweEZGKT4+MSkpCisjZGVmaW5lIERJVEhFUl81NjVfQihiLCBkaXRoZXIpICgoYikgKyAoKGRpdGhlcikmMHhGRikpCisjZW5kaWYKKworLyoKKyAqIERlZmluZSBCSVRTX0lOX0pTQU1QTEUgYXMgZWl0aGVyCisgKiAgIDggICBmb3IgOC1iaXQgc2FtcGxlIHZhbHVlcyAodGhlIHVzdWFsIHNldHRpbmcpCisgKiAgIDEyICBmb3IgMTItYml0IHNhbXBsZSB2YWx1ZXMKKyAqIE9ubHkgOCBhbmQgMTIgYXJlIGxlZ2FsIGRhdGEgcHJlY2lzaW9ucyBmb3IgbG9zc3kgSlBFRyBhY2NvcmRpbmcgdG8gdGhlCisgKiBKUEVHIHN0YW5kYXJkLCBhbmQgdGhlIElKRyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgYW55dGhpbmcgZWxzZSEKKyAqIFdlIGRvIG5vdCBzdXBwb3J0IHJ1bi10aW1lIHNlbGVjdGlvbiBvZiBkYXRhIHByZWNpc2lvbiwgc29ycnkuCisgKi8KKworI2RlZmluZSBCSVRTX0lOX0pTQU1QTEUgIDgJLyogdXNlIDggb3IgMTIgKi8KKworCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgY29tcG9uZW50cyAoY29sb3IgY2hhbm5lbHMpIGFsbG93ZWQgaW4gSlBFRyBpbWFnZS4KKyAqIFRvIG1lZXQgdGhlIGxldHRlciBvZiB0aGUgSlBFRyBzcGVjLCBzZXQgdGhpcyB0byAyNTUuICBIb3dldmVyLCBkYXJuCisgKiBmZXcgYXBwbGljYXRpb25zIG5lZWQgbW9yZSB0aGFuIDQgY2hhbm5lbHMgKG1heWJlIDUgZm9yIENNWUsgKyBhbHBoYQorICogbWFzaykuICBXZSByZWNvbW1lbmQgMTAgYXMgYSByZWFzb25hYmxlIGNvbXByb21pc2U7IHVzZSA0IGlmIHlvdSBhcmUKKyAqIHJlYWxseSBzaG9ydCBvbiBtZW1vcnkuICAoRWFjaCBhbGxvd2VkIGNvbXBvbmVudCBjb3N0cyBhIGh1bmRyZWQgb3Igc28KKyAqIGJ5dGVzIG9mIHN0b3JhZ2UsIHdoZXRoZXIgYWN0dWFsbHkgdXNlZCBpbiBhbiBpbWFnZSBvciBub3QuKQorICovCisKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVFMgIDEwCS8qIG1heGltdW0gbnVtYmVyIG9mIGltYWdlIGNvbXBvbmVudHMgKi8KKworCisvKgorICogQmFzaWMgZGF0YSB0eXBlcy4KKyAqIFlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlc2UgaWYgeW91IGhhdmUgYSBtYWNoaW5lIHdpdGggdW51c3VhbCBkYXRhCisgKiB0eXBlIHNpemVzOyBmb3IgZXhhbXBsZSwgImNoYXIiIG5vdCA4IGJpdHMsICJzaG9ydCIgbm90IDE2IGJpdHMsCisgKiBvciAibG9uZyIgbm90IDMyIGJpdHMuICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgImludCIgaXMgMTYgb3IgMzIgYml0cywKKyAqIGJ1dCBpdCBoYWQgYmV0dGVyIGJlIGF0IGxlYXN0IDE2LgorICovCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHNhbXBsZSAocGl4ZWwgZWxlbWVudCB2YWx1ZSkuCisgKiBXZSBmcmVxdWVudGx5IGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgc28gaXQncyBpbXBvcnRhbnQgdG8ga2VlcAorICogdGhlbSBzbWFsbC4gIEJ1dCBpZiB5b3UgaGF2ZSBtZW1vcnkgdG8gYnVybiBhbmQgYWNjZXNzIHRvIGNoYXIgb3Igc2hvcnQKKyAqIGFycmF5cyBpcyB2ZXJ5IHNsb3cgb24geW91ciBoYXJkd2FyZSwgeW91IG1pZ2h0IHdhbnQgdG8gY2hhbmdlIHRoZXNlLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi4yNTUuCisgKiBZb3UgY2FuIHVzZSBhIHNpZ25lZCBjaGFyIGJ5IGhhdmluZyBHRVRKU0FNUExFIG1hc2sgaXQgd2l0aCAweEZGLgorICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpTQU1QTEU7CisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworCit0eXBlZGVmIGNoYXIgSlNBTVBMRTsKKyNpZmRlZiBDSEFSX0lTX1VOU0lHTkVECisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSkKKyNlbHNlCisjZGVmaW5lIEdFVEpTQU1QTEUodmFsdWUpICAoKGludCkgKHZhbHVlKSAmIDB4RkYpCisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKyNkZWZpbmUgTUFYSlNBTVBMRQkyNTUKKyNkZWZpbmUgQ0VOVEVSSlNBTVBMRQkxMjgKKworI2VuZGlmIC8qIEJJVFNfSU5fSlNBTVBMRSA9PSA4ICovCisKKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSAxMgorLyogSlNBTVBMRSBzaG91bGQgYmUgdGhlIHNtYWxsZXN0IHR5cGUgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbHVlcyAwLi40MDk1LgorICogT24gbmVhcmx5IGFsbCBtYWNoaW5lcyAic2hvcnQiIHdpbGwgZG8gbmljZWx5LgorICovCisKK3R5cGVkZWYgc2hvcnQgSlNBTVBMRTsKKyNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQorCisjZGVmaW5lIE1BWEpTQU1QTEUJNDA5NQorI2RlZmluZSBDRU5URVJKU0FNUExFCTIwNDgKKworI2VuZGlmIC8qIEJJVFNfSU5fSlNBTVBMRSA9PSAxMiAqLworCisKKy8qIFJlcHJlc2VudGF0aW9uIG9mIGEgRENUIGZyZXF1ZW5jeSBjb2VmZmljaWVudC4KKyAqIFRoaXMgc2hvdWxkIGJlIGEgc2lnbmVkIHZhbHVlIG9mIGF0IGxlYXN0IDE2IGJpdHM7ICJzaG9ydCIgaXMgdXN1YWxseSBPSy4KKyAqIEFnYWluLCB3ZSBhbGxvY2F0ZSBsYXJnZSBhcnJheXMgb2YgdGhlc2UsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0byBpbnQKKyAqIGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCAic2hvcnQiIGlzIHJlYWxseSBzbG93LgorICovCisKK3R5cGVkZWYgc2hvcnQgSkNPRUY7CisKKworLyogQ29tcHJlc3NlZCBkYXRhc3RyZWFtcyBhcmUgcmVwcmVzZW50ZWQgYXMgYXJyYXlzIG9mIEpPQ1RFVC4KKyAqIFRoZXNlIG11c3QgYmUgRVhBQ1RMWSA4IGJpdHMgd2lkZSwgYXQgbGVhc3Qgb25jZSB0aGV5IGFyZSB3cml0dGVuIHRvCisgKiBleHRlcm5hbCBzdG9yYWdlLiAgTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhlIHN0ZGlvIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uCisgKiBtYW5hZ2VycywgdGhpcyBpcyBhbHNvIHRoZSBkYXRhIHR5cGUgcGFzc2VkIHRvIGZyZWFkL2Z3cml0ZS4KKyAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBKT0NURVQ7CisjZGVmaW5lIEdFVEpPQ1RFVCh2YWx1ZSkgICh2YWx1ZSkKKworI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfQ0hBUiAqLworCit0eXBlZGVmIGNoYXIgSk9DVEVUOworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKKyNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQorI2Vsc2UKKyNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKCh2YWx1ZSkgJiAweEZGKQorI2VuZGlmIC8qIENIQVJfSVNfVU5TSUdORUQgKi8KKworI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisKKy8qIFRoZXNlIHR5cGVkZWZzIGFyZSB1c2VkIGZvciB2YXJpb3VzIHRhYmxlIGVudHJpZXMgYW5kIHNvIGZvcnRoLgorICogVGhleSBtdXN0IGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgc3BlY2lmaWVkOyBidXQgbWFraW5nIHRoZW0gdG9vIGJpZworICogd29uJ3QgY29zdCBhIGh1Z2UgYW1vdW50IG9mIG1lbW9yeSwgc28gd2UgZG9uJ3QgcHJvdmlkZSBzcGVjaWFsCisgKiBleHRyYWN0aW9uIGNvZGUgbGlrZSB3ZSBkaWQgZm9yIEpTQU1QTEUuICAoSW4gb3RoZXIgd29yZHMsIHRoZXNlCisgKiB0eXBlZGVmcyBsaXZlIGF0IGEgZGlmZmVyZW50IHBvaW50IG9uIHRoZSBzcGVlZC9zcGFjZSB0cmFkZW9mZiBjdXJ2ZS4pCisgKi8KKworLyogVUlOVDggbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uMjU1LiAqLworCisjaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7CisjZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAordHlwZWRlZiBjaGFyIFVJTlQ4OworI2Vsc2UgLyogbm90IENIQVJfSVNfVU5TSUdORUQgKi8KK3R5cGVkZWYgc2hvcnQgVUlOVDg7CisjZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLworI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisvKiBVSU5UMTYgbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uNjU1MzUuICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX1NIT1JUCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNjsKKyNlbHNlIC8qIG5vdCBIQVZFX1VOU0lHTkVEX1NIT1JUICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBVSU5UMTY7CisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9TSE9SVCAqLworCisvKiBJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAtMzI3NjguLjMyNzY3LiAqLworCisjaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDE2ICovCit0eXBlZGVmIHNob3J0IElOVDE2OworI2VuZGlmCisKKy8qIElOVDMyIG11c3QgaG9sZCBhdCBsZWFzdCBzaWduZWQgMzItYml0IHZhbHVlcy4gKi8KKworI2lmbmRlZiBYTURfSAkJCS8qIFgxMS94bWQuaCBjb3JyZWN0bHkgZGVmaW5lcyBJTlQzMiAqLwordHlwZWRlZiBsb25nIElOVDMyOworI2VuZGlmCisKKy8qIERhdGF0eXBlIHVzZWQgZm9yIGltYWdlIGRpbWVuc2lvbnMuICBUaGUgSlBFRyBzdGFuZGFyZCBvbmx5IHN1cHBvcnRzCisgKiBpbWFnZXMgdXAgdG8gNjRLKjY0SyBkdWUgdG8gMTYtYml0IGZpZWxkcyBpbiBTT0YgbWFya2Vycy4gIFRoZXJlZm9yZQorICogInVuc2lnbmVkIGludCIgaXMgc3VmZmljaWVudCBvbiBhbGwgbWFjaGluZXMuICBIb3dldmVyLCBpZiB5b3UgbmVlZCB0bworICogaGFuZGxlIGxhcmdlciBpbWFnZXMgYW5kIHlvdSBkb24ndCBtaW5kIGRldmlhdGluZyBmcm9tIHRoZSBzcGVjLCB5b3UKKyAqIGNhbiBjaGFuZ2UgdGhpcyBkYXRhdHlwZS4KKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGludCBKRElNRU5TSU9OOworCisjZGVmaW5lIEpQRUdfTUFYX0RJTUVOU0lPTiAgNjU1MDBMICAvKiBhIHRhZCB1bmRlciA2NEsgdG8gcHJldmVudCBvdmVyZmxvd3MgKi8KKworCisvKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zLgorICogWW91IGNvdWxkIG1vZGlmeSB0aGVtIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBmdW5jdGlvbiBsaW5rYWdlIGNvbnZlbnRpb25zOworICogaW4gcGFydGljdWxhciwgeW91J2xsIG5lZWQgdG8gZG8gdGhhdCB0byBtYWtlIHRoZSBsaWJyYXJ5IGEgV2luZG93cyBETEwuCisgKiBBbm90aGVyIGFwcGxpY2F0aW9uIGlzIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBnbG9iYWwgZm9yIHVzZSB3aXRoIGRlYnVnZ2VycworICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgorICovCisKKy8qIGEgZnVuY3Rpb24gY2FsbGVkIHRocm91Z2ggbWV0aG9kIHBvaW50ZXJzOiAqLworI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlCisvKiBhIGZ1bmN0aW9uIHVzZWQgb25seSBpbiBpdHMgbW9kdWxlOiAqLworI2RlZmluZSBMT0NBTCh0eXBlKQkJc3RhdGljIHR5cGUKKy8qIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCB0aHJ1IEVYVEVSTnM6ICovCisjZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQorLyogYSByZWZlcmVuY2UgdG8gYSBHTE9CQUwgZnVuY3Rpb246ICovCisjZGVmaW5lIEVYVEVSTih0eXBlKQkJZXh0ZXJuIHR5cGUKKworCisvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gZGVjbGFyZSBhICJtZXRob2QiLCB0aGF0IGlzLCBhIGZ1bmN0aW9uIHBvaW50ZXIuCisgKiBXZSB3YW50IHRvIHN1cHBseSBwcm90b3R5cGUgcGFyYW1ldGVycyBpZiB0aGUgY29tcGlsZXIgY2FuIGNvcGUuCisgKiBOb3RlIHRoYXQgdGhlIGFyZ2xpc3QgcGFyYW1ldGVyIG11c3QgYmUgcGFyZW50aGVzaXplZCEKKyAqIEFnYWluLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGlmIHlvdSBuZWVkIHNwZWNpYWwgbGlua2FnZSBrZXl3b3Jkcy4KKyAqLworCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIEpNRVRIT0QodHlwZSxtZXRob2RuYW1lLGFyZ2xpc3QpICB0eXBlICgqbWV0aG9kbmFtZSkgYXJnbGlzdAorI2Vsc2UKKyNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSAoKQorI2VuZGlmCisKKworLyogSGVyZSBpcyB0aGUgcHNldWRvLWtleXdvcmQgZm9yIGRlY2xhcmluZyBwb2ludGVycyB0aGF0IG11c3QgYmUgImZhciIKKyAqIG9uIDgweDg2IG1hY2hpbmVzLiAgTW9zdCBvZiB0aGUgc3BlY2lhbGl6ZWQgY29kaW5nIGZvciA4MHg4NiBpcyBoYW5kbGVkCisgKiBieSBqdXN0IHNheWluZyAiRkFSICoiIHdoZXJlIHN1Y2ggYSBwb2ludGVyIGlzIG5lZWRlZC4gIEluIGEgZmV3IHBsYWNlcworICogZXhwbGljaXQgY29kaW5nIGlzIG5lZWRlZDsgc2VlIHVzZXMgb2YgdGhlIE5FRURfRkFSX1BPSU5URVJTIHN5bWJvbC4KKyAqLworCisjaWZkZWYgTkVFRF9GQVJfUE9JTlRFUlMKKyNkZWZpbmUgRkFSICBmYXIKKyNlbHNlCisjZGVmaW5lIEZBUgorI2VuZGlmCisKKworLyoKKyAqIE9uIGEgZmV3IHN5c3RlbXMsIHR5cGUgYm9vbGVhbiBhbmQvb3IgaXRzIHZhbHVlcyBGQUxTRSwgVFJVRSBtYXkgYXBwZWFyCisgKiBpbiBzdGFuZGFyZCBoZWFkZXIgZmlsZXMuICBPciB5b3UgbWF5IGhhdmUgY29uZmxpY3RzIHdpdGggYXBwbGljYXRpb24tCisgKiBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBpbmNsdWRlIHRvZ2V0aGVyIHdpdGggdGhlc2UgZmlsZXMuCisgKiBEZWZpbmluZyBIQVZFX0JPT0xFQU4gYmVmb3JlIGluY2x1ZGluZyBqcGVnbGliLmggc2hvdWxkIG1ha2UgaXQgd29yay4KKyAqLworCisjaWZuZGVmIEhBVkVfQk9PTEVBTgordHlwZWRlZiBpbnQgYm9vbGVhbjsKKyNlbmRpZgorI2lmbmRlZiBGQUxTRQkJCS8qIGluIGNhc2UgdGhlc2UgbWFjcm9zIGFscmVhZHkgZXhpc3QgKi8KKyNkZWZpbmUgRkFMU0UJMAkJLyogdmFsdWVzIG9mIGJvb2xlYW4gKi8KKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUJMQorI2VuZGlmCisKKworLyoKKyAqIFRoZSByZW1haW5pbmcgb3B0aW9ucyBhZmZlY3QgY29kZSBzZWxlY3Rpb24gd2l0aGluIHRoZSBKUEVHIGxpYnJhcnksCisgKiBidXQgdGhleSBkb24ndCBuZWVkIHRvIGJlIHZpc2libGUgdG8gbW9zdCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkuCisgKiBUbyBtaW5pbWl6ZSBhcHBsaWNhdGlvbiBuYW1lc3BhY2UgcG9sbHV0aW9uLCB0aGUgc3ltYm9scyB3b24ndCBiZQorICogZGVmaW5lZCB1bmxlc3MgSlBFR19JTlRFUk5BTFMgb3IgSlBFR19JTlRFUk5BTF9PUFRJT05TIGhhcyBiZWVuIGRlZmluZWQuCisgKi8KKworI2lmZGVmIEpQRUdfSU5URVJOQUxTCisjZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUworI2VuZGlmCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMX09QVElPTlMKKworCisvKgorICogVGhlc2UgZGVmaW5lcyBpbmRpY2F0ZSB3aGV0aGVyIHRvIGluY2x1ZGUgdmFyaW91cyBvcHRpb25hbCBmdW5jdGlvbnMuCisgKiBVbmRlZmluaW5nIHNvbWUgb2YgdGhlc2Ugc3ltYm9scyB3aWxsIHByb2R1Y2UgYSBzbWFsbGVyIGJ1dCBsZXNzIGNhcGFibGUKKyAqIGxpYnJhcnkuICBOb3RlIHRoYXQgeW91IGNhbiBsZWF2ZSBjZXJ0YWluIHNvdXJjZSBmaWxlcyBvdXQgb2YgdGhlCisgKiBjb21waWxhdGlvbi9saW5raW5nIHByb2Nlc3MgaWYgeW91J3ZlICN1bmRlZidkIHRoZSBjb3JyZXNwb25kaW5nIHN5bWJvbHMuCisgKiAoWW91IG1heSBIQVZFIHRvIGRvIHRoYXQgaWYgeW91ciBjb21waWxlciBkb2Vzbid0IGxpa2UgbnVsbCBzb3VyY2UgZmlsZXMuKQorICovCisKKy8qIEFyaXRobWV0aWMgY29kaW5nIGlzIHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLiAgQ29tcGxhaW50cyB0byBJQk0uICovCisKKy8qIENhcGFiaWxpdHkgb3B0aW9ucyBjb21tb24gdG8gZW5jb2RlciBhbmQgZGVjb2RlcjogKi8KKworI2RlZmluZSBEQ1RfSVNMT1dfU1VQUE9SVEVECS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCisjZGVmaW5lIERDVF9JRkFTVF9TVVBQT1JURUQJLyogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kICovCisjZGVmaW5lIERDVF9GTE9BVF9TVVBQT1JURUQJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KKworLyogRW5jb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6ICovCisKKyN1bmRlZiAgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLworI2RlZmluZSBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLworI2RlZmluZSBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLworI2RlZmluZSBFTlRST1BZX09QVF9TVVBQT1JURUQJICAgIC8qIE9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGNvZGluZyBwYXJtcz8gKi8KKy8qIE5vdGU6IGlmIHlvdSBzZWxlY3RlZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGl0IGlzIGRhbmdlcm91cyB0byB0dXJuIG9mZgorICogRU5UUk9QWV9PUFRfU1VQUE9SVEVELiAgVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IGdvb2QgZm9yIDgtYml0CisgKiBwcmVjaXNpb24sIHNvIGpjaHVmZi5jIG5vcm1hbGx5IHVzZXMgZW50cm9weSBvcHRpbWl6YXRpb24gdG8gY29tcHV0ZQorICogdXNhYmxlIHRhYmxlcyBmb3IgaGlnaGVyIHByZWNpc2lvbi4gIElmIHlvdSBkb24ndCB3YW50IHRvIGRvIG9wdGltaXphdGlvbiwKKyAqIHlvdSdsbCBoYXZlIHRvIHN1cHBseSBkaWZmZXJlbnQgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KKyAqIFRoZSBleGFjdCBzYW1lIHN0YXRlbWVudHMgYXBwbHkgZm9yIHByb2dyZXNzaXZlIEpQRUc6IHRoZSBkZWZhdWx0IHRhYmxlcworICogZG9uJ3Qgd29yayBmb3IgcHJvZ3Jlc3NpdmUgbW9kZS4gIChUaGlzIG1heSBnZXQgZml4ZWQsIGhvd2V2ZXIuKQorICovCisjZGVmaW5lIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgICAvKiBJbnB1dCBpbWFnZSBzbW9vdGhpbmcgb3B0aW9uPyAqLworCisvKiBEZWNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KKworI3VuZGVmICBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCisjZGVmaW5lIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCisjZGVmaW5lIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCisjZGVmaW5lIFNBVkVfTUFSS0VSU19TVVBQT1JURUQJICAgIC8qIGpwZWdfc2F2ZV9tYXJrZXJzKCkgbmVlZGVkPyAqLworI2RlZmluZSBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogQmxvY2sgc21vb3RoaW5nPyAoUHJvZ3Jlc3NpdmUgb25seSkgKi8KKyNkZWZpbmUgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAkgICAgLyogT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD8gKi8KKyN1bmRlZiAgVVBTQU1QTEVfU0NBTElOR19TVVBQT1JURUQgIC8qIE91dHB1dCByZXNjYWxpbmcgYXQgdXBzYW1wbGUgc3RhZ2U/ICovCisjZGVmaW5lIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVEICAvKiBGYXN0IHBhdGggZm9yIHNsb3BweSB1cHNhbXBsaW5nPyAqLworI2RlZmluZSBRVUFOVF8xUEFTU19TVVBQT1JURUQJICAgIC8qIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24/ICovCisjZGVmaW5lIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkgICAgLyogMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KKworLyogbW9yZSBjYXBhYmlsaXR5IG9wdGlvbnMgbGF0ZXIsIG5vIGRvdWJ0ICovCisKKworLyoKKyAqIE9yZGVyaW5nIG9mIFJHQiBkYXRhIGluIHNjYW5saW5lcyBwYXNzZWQgdG8gb3IgZnJvbSB0aGUgYXBwbGljYXRpb24uCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlYWwgd2l0aCBkYXRhIGluIHRoZSBvcmRlciBCLEcsUiwganVzdAorICogY2hhbmdlIHRoZXNlIG1hY3Jvcy4gIFlvdSBjYW4gYWxzbyBkZWFsIHdpdGggZm9ybWF0cyBzdWNoIGFzIFIsRyxCLFgKKyAqIChvbmUgZXh0cmEgYnl0ZSBwZXIgcGl4ZWwpIGJ5IGNoYW5naW5nIFJHQl9QSVhFTFNJWkUuICBOb3RlIHRoYXQgY2hhbmdpbmcKKyAqIHRoZSBvZmZzZXRzIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGNvbG9ybWFwIGRhdGEgaXMgb3JnYW5pemVkLgorICogUkVTVFJJQ1RJT05TOgorICogMS4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcsZGpwZWcgZG8gTk9UIHN1cHBvcnQgbW9kaWZpZWQgUkdCIGZvcm1hdHMuCisgKiAyLiBUaGVzZSBtYWNyb3Mgb25seSBhZmZlY3QgUkdCPD0+WUNiQ3IgY29sb3IgY29udmVyc2lvbiwgc28gdGhleSBhcmUgbm90CisgKiAgICB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBKUEVHIGNvbG9yIHNwYWNlcyBvdGhlciB0aGFuIFlDYkNyIG9yIGdyYXlzY2FsZS4KKyAqIDMuIFRoZSBjb2xvciBxdWFudGl6ZXIgbW9kdWxlcyB3aWxsIG5vdCBiZWhhdmUgZGVzaXJhYmx5IGlmIFJHQl9QSVhFTFNJWkUKKyAqICAgIGlzIG5vdCAzICh0aGV5IGRvbid0IHVuZGVyc3RhbmQgYWJvdXQgZHVtbXkgY29sb3IgY29tcG9uZW50cyEpLiAgU28geW91CisgKiAgICBjYW4ndCB1c2UgY29sb3IgcXVhbnRpemF0aW9uIGlmIHlvdSBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAqLworCisjZGVmaW5lIFJHQl9SRUQJCTAJLyogT2Zmc2V0IG9mIFJlZCBpbiBhbiBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworI2RlZmluZSBSR0JfR1JFRU4JMQkvKiBPZmZzZXQgb2YgR3JlZW4gKi8KKyNkZWZpbmUgUkdCX0JMVUUJMgkvKiBPZmZzZXQgb2YgQmx1ZSAqLworI2lmZGVmIEFORFJPSURfUkdCCisjZGVmaW5lIFJHQl9BTFBIQSAgIDMgICAvKiBPZmZzZXQgb2YgQWxwaGEgKi8KKyNlbmRpZgorI2RlZmluZSBSR0JfUElYRUxTSVpFICAgMyAgIC8qIEpTQU1QTEVzIHBlciBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLworCisvKiBEZWZpbml0aW9ucyBmb3Igc3BlZWQtcmVsYXRlZCBvcHRpbWl6YXRpb25zLiAqLworCisKKy8qIElmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgaW5saW5lIGZ1bmN0aW9ucywgZGVmaW5lIElOTElORQorICogYXMgdGhlIGlubGluZSBrZXl3b3JkOyBvdGhlcndpc2UgZGVmaW5lIGl0IGFzIGVtcHR5LgorICovCisKKyNpZm5kZWYgSU5MSU5FCisjaWZkZWYgX19HTlVDX18JCQkvKiBmb3IgaW5zdGFuY2UsIEdOVSBDIGtub3dzIGFib3V0IGlubGluZSAqLworI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXworI2VuZGlmCisjaWZuZGVmIElOTElORQorI2RlZmluZSBJTkxJTkUJCQkvKiBkZWZhdWx0IGlzIHRvIGRlZmluZSBpdCBhcyBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKiBPbiBzb21lIG1hY2hpbmVzIChub3RhYmx5IDY4MDAwIHNlcmllcykgImludCIgaXMgMzIgYml0cywgYnV0IG11bHRpcGx5aW5nCisgKiB0d28gMTYtYml0IHNob3J0cyBpcyBmYXN0ZXIgdGhhbiBtdWx0aXBseWluZyB0d28gaW50cy4gIERlZmluZSBNVUxUSVBMSUVSCisgKiBhcyBzaG9ydCBvbiBzdWNoIGEgbWFjaGluZS4gIE1VTFRJUExJRVIgbXVzdCBiZSBhdCBsZWFzdCAxNiBiaXRzIHdpZGUuCisgKi8KKworI2lmbmRlZiBNVUxUSVBMSUVSCisjaWZkZWYgQU5EUk9JRF9JTlRFTFNTRTJfSURDVAorICAjZGVmaW5lIE1VTFRJUExJRVIgc2hvcnQKKyNlbHNlCisjZGVmaW5lIE1VTFRJUExJRVIgIGludAkJLyogdHlwZSBmb3IgZmFzdGVzdCBpbnRlZ2VyIG11bHRpcGx5ICovCisjZW5kaWYKKyNlbmRpZgorCisKKy8qIEZBU1RfRkxPQVQgc2hvdWxkIGJlIGVpdGhlciBmbG9hdCBvciBkb3VibGUsIHdoaWNoZXZlciBpcyBkb25lIGZhc3RlcgorICogYnkgeW91ciBjb21waWxlci4gIChOb3RlIHRoYXQgdGhpcyB0eXBlIGlzIG9ubHkgdXNlZCBpbiB0aGUgZmxvYXRpbmcgcG9pbnQKKyAqIERDVCByb3V0aW5lcywgc28gaXQgb25seSBtYXR0ZXJzIGlmIHlvdSd2ZSBkZWZpbmVkIERDVF9GTE9BVF9TVVBQT1JURUQuKQorICogVHlwaWNhbGx5LCBmbG9hdCBpcyBmYXN0ZXIgaW4gQU5TSSBDIGNvbXBpbGVycywgd2hpbGUgZG91YmxlIGlzIGZhc3RlciBpbgorICogcHJlLUFOU0kgY29tcGlsZXJzIChiZWNhdXNlIHRoZXkgaW5zaXN0IG9uIGNvbnZlcnRpbmcgdG8gZG91YmxlIGFueXdheSkuCisgKiBUaGUgY29kZSBiZWxvdyB0aGVyZWZvcmUgY2hvb3NlcyBmbG9hdCBpZiB3ZSBoYXZlIEFOU0ktc3R5bGUgcHJvdG90eXBlcy4KKyAqLworCisjaWZuZGVmIEZBU1RfRkxPQVQKKyNpZmRlZiBIQVZFX1BST1RPVFlQRVMKKyNkZWZpbmUgRkFTVF9GTE9BVCAgZmxvYXQKKyNlbHNlCisjZGVmaW5lIEZBU1RfRkxPQVQgIGRvdWJsZQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxfT1BUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pwZWdpbnQuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcGVnaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1NTExZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcGVnaW50LmgKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBqcGVnaW50LmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBwcm92aWRlcyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaW91cyBKUEVHIG1vZHVsZXMuCisgKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIGNvbnNpZGVyZWQgaW50ZXJuYWwgdG8gdGhlIEpQRUcgbGlicmFyeTsgbW9zdAorICogYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZG4ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLgorICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBib3RoIGNvbXByZXNzaW9uICYgZGVjb21wcmVzc2lvbiAqLworCit0eXBlZGVmIGVudW0gewkJCS8qIE9wZXJhdGluZyBtb2RlcyBmb3IgYnVmZmVyIGNvbnRyb2xsZXJzICovCisJSkJVRl9QQVNTX1RIUlUsCQkvKiBQbGFpbiBzdHJpcHdpc2Ugb3BlcmF0aW9uICovCisJLyogUmVtYWluaW5nIG1vZGVzIHJlcXVpcmUgYSBmdWxsLWltYWdlIGJ1ZmZlciB0byBoYXZlIGJlZW4gY3JlYXRlZCAqLworCUpCVUZfU0FWRV9TT1VSQ0UsCS8qIFJ1biBzb3VyY2Ugc3Vib2JqZWN0IG9ubHksIHNhdmUgb3V0cHV0ICovCisJSkJVRl9DUkFOS19ERVNULAkvKiBSdW4gZGVzdCBzdWJvYmplY3Qgb25seSwgdXNpbmcgc2F2ZWQgZGF0YSAqLworCUpCVUZfU0FWRV9BTkRfUEFTUwkvKiBSdW4gYm90aCBzdWJvYmplY3RzLCBzYXZlIG91dHB1dCAqLworfSBKX0JVRl9NT0RFOworCisvKiBWYWx1ZXMgb2YgZ2xvYmFsX3N0YXRlIGZpZWxkIChqZGFwaS5jIGhhcyBzb21lIGRlcGVuZGVuY2llcyBvbiBvcmRlcmluZyEpICovCisjZGVmaW5lIENTVEFURV9TVEFSVAkxMDAJLyogYWZ0ZXIgY3JlYXRlX2NvbXByZXNzICovCisjZGVmaW5lIENTVEFURV9TQ0FOTklORwkxMDEJLyogc3RhcnRfY29tcHJlc3MgZG9uZSwgd3JpdGVfc2NhbmxpbmVzIE9LICovCisjZGVmaW5lIENTVEFURV9SQVdfT0sJMTAyCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3Jhd19kYXRhIE9LICovCisjZGVmaW5lIENTVEFURV9XUkNPRUZTCTEwMwkvKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBkb25lICovCisjZGVmaW5lIERTVEFURV9TVEFSVAkyMDAJLyogYWZ0ZXIgY3JlYXRlX2RlY29tcHJlc3MgKi8KKyNkZWZpbmUgRFNUQVRFX0lOSEVBREVSCTIwMQkvKiByZWFkaW5nIGhlYWRlciBtYXJrZXJzLCBubyBTT1MgeWV0ICovCisjZGVmaW5lIERTVEFURV9SRUFEWQkyMDIJLyogZm91bmQgU09TLCByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLworI2RlZmluZSBEU1RBVEVfUFJFTE9BRAkyMDMJLyogcmVhZGluZyBtdWx0aXNjYW4gZmlsZSBpbiBzdGFydF9kZWNvbXByZXNzKi8KKyNkZWZpbmUgRFNUQVRFX1BSRVNDQU4JMjA0CS8qIHBlcmZvcm1pbmcgZHVtbXkgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCisjZGVmaW5lIERTVEFURV9TQ0FOTklORwkyMDUJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3NjYW5saW5lcyBPSyAqLworI2RlZmluZSBEU1RBVEVfUkFXX09LCTIwNgkvKiBzdGFydF9kZWNvbXByZXNzIGRvbmUsIHJlYWRfcmF3X2RhdGEgT0sgKi8KKyNkZWZpbmUgRFNUQVRFX0JVRklNQUdFCTIwNwkvKiBleHBlY3RpbmcganBlZ19zdGFydF9vdXRwdXQgKi8KKyNkZWZpbmUgRFNUQVRFX0JVRlBPU1QJMjA4CS8qIGxvb2tpbmcgZm9yIFNPUy9FT0kgaW4ganBlZ19maW5pc2hfb3V0cHV0ICovCisjZGVmaW5lIERTVEFURV9SRENPRUZTCTIwOQkvKiByZWFkaW5nIGZpbGUgaW4ganBlZ19yZWFkX2NvZWZmaWNpZW50cyAqLworI2RlZmluZSBEU1RBVEVfU1RPUFBJTkcJMjEwCS8qIGxvb2tpbmcgZm9yIEVPSSBpbiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBjb21wcmVzc2lvbiBtb2R1bGVzICovCisKKy8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgeworICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHBhc3Nfc3RhcnR1cCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworCisgIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBib29sZWFuIGNhbGxfcGFzc19zdGFydHVwOwkvKiBUcnVlIGlmIHBhc3Nfc3RhcnR1cCBtdXN0IGJlIGNhbGxlZCAqLworICBib29sZWFuIGlzX2xhc3RfcGFzczsJCS8qIFRydWUgZHVyaW5nIGxhc3QgcGFzcyAqLworfTsKKworLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCitzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHByb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAorCQkJICAgICAgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOworfTsKKworLyogQ29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyAoZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBjb250cm9sKSAqLworc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKKyAgSk1FVEhPRCh2b2lkLCBwcmVfcHJvY2Vzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKKwkJCQkgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCisJCQkJICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfZ3JvdXBfY3RyLAorCQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cHNfYXZhaWwpKTsKK307CisKKy8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCitzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKGJvb2xlYW4sIGNvbXByZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZikpOworfTsKKworLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJCUpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKSk7Cit9OworCisvKiBEb3duc2FtcGxpbmcgKi8KK3N0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBkb3duc2FtcGxlLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKKwkJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAorCQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpKTsKKworICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCit9OworCisvKiBGb3J3YXJkIERDVCAoYWxzbyBjb250cm9scyBjb2VmZmljaWVudCBxdWFudGl6YXRpb24pICovCitzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIHBlcmhhcHMgdGhpcyBzaG91bGQgYmUgYW4gYXJyYXk/Pz8gKi8KKyAgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCQkgICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCisJCQkgICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCisJCQkgICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKK307CisKKy8qIEVudHJvcHkgZW5jb2RpbmcgKi8KK3N0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZW5jb2RlX21jdSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworLyogTWFya2VyIHdyaXRpbmcgKi8KK3N0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgeworICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZpbGVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9mcmFtZV9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHdyaXRlX3NjYW5faGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX3RyYWlsZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHdyaXRlX3RhYmxlc19vbmx5LCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKyAgLyogVGhlc2Ugcm91dGluZXMgYXJlIGV4cG9ydGVkIHRvIGFsbG93IGluc2VydGlvbiBvZiBleHRyYSBtYXJrZXJzICovCisgIC8qIFByb2JhYmx5IG9ubHkgQ09NIGFuZCBBUFBuIG1hcmtlcnMgc2hvdWxkIGJlIHdyaXR0ZW4gdGhpcyB3YXkgKi8KKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKKyAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7Cit9OworCisKKy8qIERlY2xhcmF0aW9ucyBmb3IgZGVjb21wcmVzc2lvbiBtb2R1bGVzICovCisKKy8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLworc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7CisgIEpNRVRIT0Qodm9pZCwgcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgZmluaXNoX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisgIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLworICBib29sZWFuIGlzX2R1bW15X3Bhc3M7CS8qIFRydWUgZHVyaW5nIDFzdCBwYXNzIGZvciAyLXBhc3MgcXVhbnQgKi8KK307CisKKy8qIElucHV0IGNvbnRyb2wgbW9kdWxlICovCitzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsKKyAgSk1FVEhPRChpbnQsIGNvbnN1bWVfaW5wdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2lucHV0X2J1aWxkX2h1ZmZtYW5faW5kZXgsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2luZGV4ICppbmRleCwgaW50IHNjYW5fY291bnQpKTsKKyAgSk1FVEhPRChpbnQsIGNvbnN1bWVfbWFya2VycywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXggKmluZGV4LCBpbnQgc2Nhbl9jb3VudCkpOworICBKTUVUSE9EKHZvaWQsIHJlc2V0X2lucHV0X2NvbnRyb2xsZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworICAvKiBTdGF0ZSB2YXJpYWJsZXMgbWFkZSB2aXNpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KKyAgYm9vbGVhbiBoYXNfbXVsdGlwbGVfc2NhbnM7CS8qIFRydWUgaWYgZmlsZSBoYXMgbXVsdGlwbGUgc2NhbnMgKi8KKyAgYm9vbGVhbiBlb2lfcmVhY2hlZDsJCS8qIFRydWUgd2hlbiBFT0kgaGFzIGJlZW4gY29uc3VtZWQgKi8KK307CisKKy8qIE1haW4gYnVmZmVyIGNvbnRyb2wgKGRvd25zYW1wbGVkLWRhdGEgYnVmZmVyKSAqLworc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOworICBKTUVUSE9EKHZvaWQsIHByb2Nlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKKwkJCSAgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Cit9OworCisvKiBDb2VmZmljaWVudCBidWZmZXIgY29udHJvbCAqLworc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X2lucHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoaW50LCBjb25zdW1lX2RhdGFfYnVpbGRfaHVmZm1hbl9pbmRleCwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5faW5kZXgqIGluZGV4LCBpbnQgc2Nhbl9jb3VudCkpOworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGludCwgZGVjb21wcmVzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7CisgIC8qIFBvaW50ZXIgdG8gYXJyYXkgb2YgY29lZmZpY2llbnQgdmlydHVhbCBhcnJheXMsIG9yIE5VTEwgaWYgbm9uZSAqLworICBqdmlydF9iYXJyYXlfcHRyICpjb2VmX2FycmF5czsKKworICAvKiBjb2x1bW4gbnVtYmVyIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB0aWxlLCByZXNwZWN0aXZlbHkgKi8KKyAgaW50IGNvbHVtbl9sZWZ0X2JvdW5kYXJ5OworICBpbnQgY29sdW1uX3JpZ2h0X2JvdW5kYXJ5OworCisgIC8qIGNvbHVtbiBudW1iZXIgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IE1DVSwgcmVzcGVjdGl2ZWx5ICovCisgIGludCBNQ1VfY29sdW1uX2xlZnRfYm91bmRhcnk7CisgIGludCBNQ1VfY29sdW1uX3JpZ2h0X2JvdW5kYXJ5OworCisgIC8qIHRoZSBudW1iZXIgb2YgTUNVIGNvbHVtbnMgdG8gc2tpcCBmcm9tIHRoZSBpbmRleGVkIE1DVSwgaU0sCisgICAqIHRvIHRoZSByZXF1ZXN0ZWQgTUNVIGJvdW5kYXJ5LCByTSwgd2hlcmUgaU0gaXMgdGhlIE1DVSB0aGF0IHdlIHNhbXBsZQorICAgKiBpbnRvIG91ciBpbmRleCBhbmQgaXMgdGhlIG5lYXJlc3Qgb25lIHRvIHRoZSBsZWZ0IG9mIHJNLgorICAgKi8KKyAgaW50IE1DVV9jb2x1bW5zX3RvX3NraXA7Cit9OworCisvKiBEZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIChjb2xvciBxdWFudGl6YXRpb24gYnVmZmVyIGNvbnRyb2wpICovCitzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7CisgIEpNRVRIT0Qodm9pZCwgcG9zdF9wcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKKwkJCQkgICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKKwkJCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCisJCQkJICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAorCQkJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Cit9OworCisvKiBNYXJrZXIgcmVhZGluZyAmIHBhcnNpbmcgKi8KK3N0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeworICBKTUVUSE9EKHZvaWQsIHJlc2V0X21hcmtlcl9yZWFkZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgorICAgKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKKyAgICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCisgICAqLworICBKTUVUSE9EKGludCwgcmVhZF9tYXJrZXJzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIGdldF9zb3NfbWFya2VyX3Bvc2l0aW9uLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgpKTsKKyAgLyogUmVhZCBhIHJlc3RhcnQgbWFya2VyIC0tLSBleHBvcnRlZCBmb3IgdXNlIGJ5IGVudHJvcHkgZGVjb2RlciBvbmx5ICovCisgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QgcmVhZF9yZXN0YXJ0X21hcmtlcjsKKworICAvKiBTdGF0ZSBvZiBtYXJrZXIgcmVhZGVyIC0tLSBub21pbmFsbHkgaW50ZXJuYWwsIGJ1dCBhcHBsaWNhdGlvbnMKKyAgICogc3VwcGx5aW5nIENPTSBvciBBUFBuIGhhbmRsZXJzIG1pZ2h0IGxpa2UgdG8ga25vdyB0aGUgc3RhdGUuCisgICAqLworICBib29sZWFuIHNhd19TT0k7CQkvKiBmb3VuZCBTT0k/ICovCisgIGJvb2xlYW4gc2F3X1NPRjsJCS8qIGZvdW5kIFNPRj8gKi8KKyAgaW50IG5leHRfcmVzdGFydF9udW07CQkvKiBuZXh0IHJlc3RhcnQgbnVtYmVyIGV4cGVjdGVkICgwLTcpICovCisgIGludCBjdXJyZW50X3Nvc19tYXJrZXJfcG9zaXRpb247CisgIHVuc2lnbmVkIGludCBkaXNjYXJkZWRfYnl0ZXM7CS8qICMgb2YgYnl0ZXMgc2tpcHBlZCBsb29raW5nIGZvciBhIG1hcmtlciAqLworfTsKKworLyogRW50cm9weSBkZWNvZGluZyAqLworc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsKKyAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGRlY29kZV9tY3UsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCUpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKKyAgSk1FVEhPRChib29sZWFuLCBkZWNvZGVfbWN1X2Rpc2NhcmRfY29lZiwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9vZmZzZXRfZGF0YSBvZmZzZXQpKTsKKyAgSk1FVEhPRCh2b2lkLCBnZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24sIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhICpvZmZzZXQpKTsKKworICAvKiBUaGlzIGlzIGhlcmUgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIGJhc2VsaW5lIGFuZCBwcm9ncmVzc2l2ZSBkZWNvZGVyczsgKi8KKyAgLyogb3RoZXIgbW9kdWxlcyBwcm9iYWJseSBzaG91bGQgbm90IHVzZSBpdCAqLworICBib29sZWFuIGluc3VmZmljaWVudF9kYXRhOwkvKiBzZXQgVFJVRSBhZnRlciBlbWl0dGluZyB3YXJuaW5nICovCisKKyAgaHVmZm1hbl9pbmRleCAqaW5kZXg7Cit9OworCisvKiBJbnZlcnNlIERDVCAoYWxzbyBwZXJmb3JtcyBkZXF1YW50aXphdGlvbikgKi8KK3R5cGVkZWYgSk1FVEhPRCh2b2lkLCBpbnZlcnNlX0RDVF9tZXRob2RfcHRyLAorCQkoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCisJCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKKworc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIC8qIEl0IGlzIHVzZWZ1bCB0byBhbGxvdyBlYWNoIGNvbXBvbmVudCB0byBoYXZlIGEgc2VwYXJhdGUgSURDVCBtZXRob2QuICovCisgIGludmVyc2VfRENUX21ldGhvZF9wdHIgaW52ZXJzZV9EQ1RbTUFYX0NPTVBPTkVOVFNdOworfTsKKworLyogVXBzYW1wbGluZyAobm90ZSB0aGF0IHVwc2FtcGxlciBtdXN0IGFsc28gY2FsbCBjb2xvciBjb252ZXJ0ZXIpICovCitzdHJ1Y3QganBlZ191cHNhbXBsZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgdXBzYW1wbGUsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsCisJCQkgICBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAorCQkJICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAorCQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJICAgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCisJCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7CisKKyAgYm9vbGVhbiBuZWVkX2NvbnRleHRfcm93czsJLyogVFJVRSBpZiBuZWVkIHJvd3MgYWJvdmUgJiBiZWxvdyAqLworfTsKKworLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7CisgIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBjb2xvcl9jb252ZXJ0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQlKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCisJCQkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpKTsKK307CisKKy8qIENvbG9yIHF1YW50aXphdGlvbiBvciBjb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uICovCitzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeworICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3ByZV9zY2FuKSk7CisgIEpNRVRIT0Qodm9pZCwgY29sb3JfcXVhbnRpemUsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLAorCQkJCSBpbnQgbnVtX3Jvd3MpKTsKKyAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKyAgSk1FVEhPRCh2b2lkLCBuZXdfY29sb3JfbWFwLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworfTsKKworCisvKiBNaXNjZWxsYW5lb3VzIHVzZWZ1bCBtYWNyb3MgKi8KKworI3VuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI3VuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorCisKKy8qIFdlIGFzc3VtZSB0aGF0IHJpZ2h0IHNoaWZ0IGNvcnJlc3BvbmRzIHRvIHNpZ25lZCBkaXZpc2lvbiBieSAyIHdpdGgKKyAqIHJvdW5kaW5nIHRvd2FyZHMgbWludXMgaW5maW5pdHkuICBUaGlzIGlzIGNvcnJlY3QgZm9yIHR5cGljYWwgImFyaXRobWV0aWMKKyAqIHNoaWZ0IiBpbnN0cnVjdGlvbnMgdGhhdCBzaGlmdCBpbiBjb3BpZXMgb2YgdGhlIHNpZ24gYml0LiAgQnV0IHNvbWUKKyAqIEMgY29tcGlsZXJzIGltcGxlbWVudCA+PiB3aXRoIGFuIHVuc2lnbmVkIHNoaWZ0LiAgRm9yIHRoZXNlIG1hY2hpbmVzIHlvdQorICogbXVzdCBkZWZpbmUgUklHSFRfU0hJRlRfSVNfVU5TSUdORUQuCisgKiBSSUdIVF9TSElGVCBwcm92aWRlcyBhIHByb3BlciBzaWduZWQgcmlnaHQgc2hpZnQgb2YgYW4gSU5UMzIgcXVhbnRpdHkuCisgKiBJdCBpcyBvbmx5IGFwcGxpZWQgd2l0aCBjb25zdGFudCBzaGlmdCBjb3VudHMuICBTSElGVF9URU1QUyBtdXN0IGJlCisgKiBpbmNsdWRlZCBpbiB0aGUgdmFyaWFibGVzIG9mIGFueSByb3V0aW5lIHVzaW5nIFJJR0hUX1NISUZULgorICovCisKKyNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAorI2RlZmluZSBTSElGVF9URU1QUwlJTlQzMiBzaGlmdF90ZW1wOworI2RlZmluZSBSSUdIVF9TSElGVCh4LHNoZnQpICBcCisJKChzaGlmdF90ZW1wID0gKHgpKSA8IDAgPyBcCisJIChzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKElOVDMyKSAwKSkgPDwgKDMyLShzaGZ0KSkpIDogXAorCSAoc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQorI2Vsc2UKKyNkZWZpbmUgU0hJRlRfVEVNUFMKKyNkZWZpbmUgUklHSFRfU0hJRlQoeCxzaGZ0KQkoKHgpID4+IChzaGZ0KSkKKyNlbmRpZgorCisKKy8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLiAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqaW5pdF9jb21wcmVzc19tYXN0ZXIJaklDb21wcmVzcworI2RlZmluZSBqaW5pdF9jX21hc3Rlcl9jb250cm9sCWpJQ01hc3RlcgorI2RlZmluZSBqaW5pdF9jX21haW5fY29udHJvbGxlcglqSUNNYWluQworI2RlZmluZSBqaW5pdF9jX3ByZXBfY29udHJvbGxlcglqSUNQcmVwQworI2RlZmluZSBqaW5pdF9jX2NvZWZfY29udHJvbGxlcglqSUNDb2VmQworI2RlZmluZSBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIJaklDQ29sb3IKKyNkZWZpbmUgamluaXRfZG93bnNhbXBsZXIJaklEb3duc2FtcGxlcgorI2RlZmluZSBqaW5pdF9mb3J3YXJkX2RjdAlqSUZEQ1QKKyNkZWZpbmUgamluaXRfaHVmZl9lbmNvZGVyCWpJSEVuY29kZXIKKyNkZWZpbmUgamluaXRfcGh1ZmZfZW5jb2RlcglqSVBIRW5jb2RlcgorI2RlZmluZSBqaW5pdF9tYXJrZXJfd3JpdGVyCWpJTVdyaXRlcgorI2RlZmluZSBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcwlqSURNYXN0ZXIKKyNkZWZpbmUgamluaXRfZF9tYWluX2NvbnRyb2xsZXIJaklETWFpbkMKKyNkZWZpbmUgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIJaklEQ29lZkMKKyNkZWZpbmUgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIJaklEUG9zdEMKKyNkZWZpbmUgamluaXRfaW5wdXRfY29udHJvbGxlcglqSUluQ3RscgorI2RlZmluZSBqaW5pdF9tYXJrZXJfcmVhZGVyCWpJTVJlYWRlcgorI2RlZmluZSBqaW5pdF9odWZmX2RlY29kZXIJaklIRGVjb2RlcgorI2RlZmluZSBqaW5pdF9waHVmZl9kZWNvZGVyCWpJUEhEZWNvZGVyCisjZGVmaW5lIGppbml0X2ludmVyc2VfZGN0CWpJSURDVAorI2RlZmluZSBqaW5pdF91cHNhbXBsZXIJCWpJVXBzYW1wbGVyCisjZGVmaW5lIGppbml0X2NvbG9yX2RlY29udmVydGVyCWpJRENvbG9yCisjZGVmaW5lIGppbml0XzFwYXNzX3F1YW50aXplcglqSTFRdWFudAorI2RlZmluZSBqaW5pdF8ycGFzc19xdWFudGl6ZXIJakkyUXVhbnQKKyNkZWZpbmUgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcglqSU1VcHNhbXBsZXIKKyNkZWZpbmUgamluaXRfbWVtb3J5X21ncglqSU1lbU1ncgorI2RlZmluZSBqZGl2X3JvdW5kX3VwCQlqRGl2Um91bmQKKyNkZWZpbmUganJvdW5kX3VwCQlqUm91bmQKKyNkZWZpbmUgamNvcHlfc2FtcGxlX3Jvd3MJakNvcHlTYW1wbGVzCisjZGVmaW5lIGpjb3B5X2Jsb2NrX3JvdwkJakNvcHlCbG9ja3MKKyNkZWZpbmUganplcm9fZmFyCQlqWmVyb0ZhcgorI2RlZmluZSBqcGVnX3ppZ3phZ19vcmRlcglqWklHVGFibGUKKyNkZWZpbmUganBlZ19uYXR1cmFsX29yZGVyCWpaQUdUYWJsZQorI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKiBDb21wcmVzc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KK0VYVEVSTih2b2lkKSBqaW5pdF9jb21wcmVzc19tYXN0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2NfbWFzdGVyX2NvbnRyb2wgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJIGJvb2xlYW4gdHJhbnNjb2RlX29ubHkpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jX21haW5fY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2NfcHJlcF9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfY19jb2VmX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jb2xvcl9jb252ZXJ0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2Rvd25zYW1wbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9mb3J3YXJkX2RjdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfaHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9waHVmZl9lbmNvZGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9tYXJrZXJfd3JpdGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIERlY29tcHJlc3Npb24gbW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitFWFRFUk4odm9pZCkgamluaXRfbWFzdGVyX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfZF9tYWluX2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOworRVhURVJOKHZvaWQpIGppbml0X2RfY29lZl9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7CitFWFRFUk4odm9pZCkgamluaXRfaW5wdXRfY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9tYXJrZXJfcmVhZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2h1ZmZfZGVjb2RlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9odWZmX2RlY29kZXJfbm9fZGF0YSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9waHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X2ludmVyc2VfZGN0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF9jb2xvcl9kZWNvbnZlcnRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqaW5pdF8xcGFzc19xdWFudGl6ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkgamluaXRfMnBhc3NfcXVhbnRpemVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGppbml0X21lcmdlZF91cHNhbXBsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19kZWNvbXByZXNzX3Blcl9zY2FuX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKTsKKy8qIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uICovCitFWFRFUk4odm9pZCkgamluaXRfbWVtb3J5X21nciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisvKiBVdGlsaXR5IHJvdXRpbmVzIGluIGp1dGlscy5jICovCitFWFRFUk4obG9uZykgamRpdl9yb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7CitFWFRFUk4obG9uZykganJvdW5kX3VwIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKK0VYVEVSTihsb25nKSBqbWluIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKK0VYVEVSTih2b2lkKSBqY29weV9zYW1wbGVfcm93cyBKUFAoKEpTQU1QQVJSQVkgaW5wdXRfYXJyYXksIGludCBzb3VyY2Vfcm93LAorCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9hcnJheSwgaW50IGRlc3Rfcm93LAorCQkJCSAgICBpbnQgbnVtX3Jvd3MsIEpESU1FTlNJT04gbnVtX2NvbHMpKTsKK0VYVEVSTih2b2lkKSBqY29weV9ibG9ja19yb3cgSlBQKChKQkxPQ0tST1cgaW5wdXRfcm93LCBKQkxPQ0tST1cgb3V0cHV0X3JvdywKKwkJCQkgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOworRVhURVJOKHZvaWQpIGp6ZXJvX2ZhciBKUFAoKHZvaWQgRkFSICogdGFyZ2V0LCBzaXplX3QgYnl0ZXN0b3plcm8pKTsKKworRVhURVJOKHZvaWQpIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkpOworRVhURVJOKHZvaWQpIGpzZXRfaW5wdXRfc3RyZWFtX3Bvc2l0aW9uX2JpdCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgIGludCBieXRlX29mZnNldCwgaW50IGJpdF9sZWZ0LCBJTlQzMiBidWYpKTsKKworRVhURVJOKGludCkgamdldF9pbnB1dF9zdHJlYW1fcG9zaXRpb24gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisvKiBDb25zdGFudCB0YWJsZXMgaW4ganV0aWxzLmMgKi8KKyNpZiAwCQkJCS8qIFRoaXMgdGFibGUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBpbiB2NmEgKi8KK2V4dGVybiBjb25zdCBpbnQganBlZ196aWd6YWdfb3JkZXJbXTsgLyogbmF0dXJhbCBjb2VmIG9yZGVyIHRvIHppZ3phZyBvcmRlciAqLworI2VuZGlmCitleHRlcm4gY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltdOyAvKiB6aWd6YWcgY29lZiBvcmRlciB0byBuYXR1cmFsIG9yZGVyICovCisKKy8qIFN1cHByZXNzIHVuZGVmaW5lZC1zdHJ1Y3R1cmUgY29tcGxhaW50cyBpZiBuZWNlc3NhcnkuICovCisKKyNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorI2lmbmRlZiBBTV9NRU1PUllfTUFOQUdFUgkvKiBvbmx5IGptZW1tZ3IuYyBkZWZpbmVzIHRoZXNlICovCitzdHJ1Y3QganZpcnRfc2FycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKKyNlbmRpZgorI2VuZGlmIC8qIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvanBlZ2xpYi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pwZWdsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2U2ODcyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pwZWdsaWIuaApAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBqcGVnbGliLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCisgKiBNb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBuZWVkIG9ubHkgaW5jbHVkZSB0aGlzIGZpbGUsCisgKiBhbmQgcGVyaGFwcyBqZXJyb3IuaCBpZiB0aGV5IHdhbnQgdG8ga25vdyB0aGUgZXhhY3QgZXJyb3IgY29kZXMuCisgKi8KKworI2lmbmRlZiBKUEVHTElCX0gKKyNkZWZpbmUgSlBFR0xJQl9ICisKKy8qCisgKiBGaXJzdCB3ZSBpbmNsdWRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgcmVjb3JkIGhvdyB0aGlzCisgKiBpbnN0YWxsYXRpb24gb2YgdGhlIEpQRUcgbGlicmFyeSBpcyBzZXQgdXAuICBqY29uZmlnLmggY2FuIGJlCisgKiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmb3IgbWFueSBzeXN0ZW1zLiAgam1vcmVjZmcuaCBjb250YWlucworICogbWFudWFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IG1vc3QgcGVvcGxlIG5lZWQgbm90IHdvcnJ5IGFib3V0LgorICovCisKKyNpZm5kZWYgSkNPTkZJR19JTkNMVURFRAkvKiBpbiBjYXNlIGppbmNsdWRlLmggYWxyZWFkeSBkaWQgKi8KKyNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiB3aWRlbHkgdXNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgKi8KKyNlbmRpZgorI2luY2x1ZGUgImptb3JlY2ZnLmgiCQkvKiBzZWxkb20gY2hhbmdlZCBvcHRpb25zICovCisKKworLyogVmVyc2lvbiBJRCBmb3IgdGhlIEpQRUcgbGlicmFyeS4KKyAqIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgdGVzdHMgbGlrZSAiI2lmIEpQRUdfTElCX1ZFUlNJT04gPj0gNjAiLgorICovCisKKyNkZWZpbmUgSlBFR19MSUJfVkVSU0lPTiAgNjIJLyogVmVyc2lvbiA2YiAqLworCisKKy8qIFZhcmlvdXMgY29uc3RhbnRzIGRldGVybWluaW5nIHRoZSBzaXplcyBvZiB0aGluZ3MuCisgKiBBbGwgb2YgdGhlc2UgYXJlIHNwZWNpZmllZCBieSB0aGUgSlBFRyBzdGFuZGFyZCwgc28gZG9uJ3QgY2hhbmdlIHRoZW0KKyAqIGlmIHlvdSB3YW50IHRvIGJlIGNvbXBhdGlibGUuCisgKi8KKworI2RlZmluZSBEQ1RTSVpFCQkgICAgOAkvKiBUaGUgYmFzaWMgRENUIGJsb2NrIGlzIDh4OCBzYW1wbGVzICovCisjZGVmaW5lIERDVFNJWkUyCSAgICA2NAkvKiBEQ1RTSVpFIHNxdWFyZWQ7ICMgb2YgZWxlbWVudHMgaW4gYSBibG9jayAqLworI2RlZmluZSBOVU1fUVVBTlRfVEJMUyAgICAgIDQJLyogUXVhbnRpemF0aW9uIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLworI2RlZmluZSBOVU1fSFVGRl9UQkxTICAgICAgIDQJLyogSHVmZm1hbiB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjMgKi8KKyNkZWZpbmUgTlVNX0FSSVRIX1RCTFMgICAgICAxNgkvKiBBcml0aC1jb2RpbmcgdGFibGVzIGFyZSBudW1iZXJlZCAwLi4xNSAqLworI2RlZmluZSBNQVhfQ09NUFNfSU5fU0NBTiAgIDQJLyogSlBFRyBsaW1pdCBvbiAjIG9mIGNvbXBvbmVudHMgaW4gb25lIHNjYW4gKi8KKyNkZWZpbmUgTUFYX1NBTVBfRkFDVE9SICAgICA0CS8qIEpQRUcgbGltaXQgb24gc2FtcGxpbmcgZmFjdG9ycyAqLworLyogVW5mb3J0dW5hdGVseSwgc29tZSBib3pvIGF0IEFkb2JlIHNhdyBubyByZWFzb24gdG8gYmUgYm91bmQgYnkgdGhlIHN0YW5kYXJkOworICogdGhlIFBvc3RTY3JpcHQgRENUIGZpbHRlciBjYW4gZW1pdCBmaWxlcyB3aXRoIG1hbnkgbW9yZSB0aGFuIDEwIGJsb2Nrcy9NQ1UuCisgKiBJZiB5b3UgaGFwcGVuIHRvIHJ1biBhY3Jvc3Mgc3VjaCBhIGZpbGUsIHlvdSBjYW4gdXAgRF9NQVhfQkxPQ0tTX0lOX01DVQorICogdG8gaGFuZGxlIGl0LiAgV2UgZXZlbiBsZXQgeW91IGRvIHRoaXMgZnJvbSB0aGUgamNvbmZpZy5oIGZpbGUuICBIb3dldmVyLAorICogd2Ugc3Ryb25nbHkgZGlzY291cmFnZSBjaGFuZ2luZyBDX01BWF9CTE9DS1NfSU5fTUNVOyBqdXN0IGJlY2F1c2UgQWRvYmUKKyAqIHNvbWV0aW1lcyBlbWl0cyBub25jb21wbGlhbnQgZmlsZXMgZG9lc24ndCBtZWFuIHlvdSBzaG91bGQgdG9vLgorICovCisjZGVmaW5lIENfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNpZm5kZWYgRF9NQVhfQkxPQ0tTX0lOX01DVQorI2RlZmluZSBEX01BWF9CTE9DS1NfSU5fTUNVICAgMTAgLyogZGVjb21wcmVzc29yJ3MgbGltaXQgb24gYmxvY2tzIHBlciBNQ1UgKi8KKyNlbmRpZgorCisKKy8qIERhdGEgc3RydWN0dXJlcyBmb3IgaW1hZ2VzIChhcnJheXMgb2Ygc2FtcGxlcyBhbmQgb2YgRENUIGNvZWZmaWNpZW50cykuCisgKiBPbiA4MHg4NiBtYWNoaW5lcywgdGhlIGltYWdlIGFycmF5cyBhcmUgdG9vIGJpZyBmb3IgbmVhciBwb2ludGVycywKKyAqIGJ1dCB0aGUgcG9pbnRlciBhcnJheXMgY2FuIGZpdCBpbiBuZWFyIG1lbW9yeS4KKyAqLworCit0eXBlZGVmIEpTQU1QTEUgRkFSICpKU0FNUFJPVzsJLyogcHRyIHRvIG9uZSBpbWFnZSByb3cgb2YgcGl4ZWwgc2FtcGxlcy4gKi8KK3R5cGVkZWYgSlNBTVBST1cgKkpTQU1QQVJSQVk7CS8qIHB0ciB0byBzb21lIHJvd3MgKGEgMi1EIHNhbXBsZSBhcnJheSkgKi8KK3R5cGVkZWYgSlNBTVBBUlJBWSAqSlNBTVBJTUFHRTsJLyogYSAzLUQgc2FtcGxlIGFycmF5OiB0b3AgaW5kZXggaXMgY29sb3IgKi8KKwordHlwZWRlZiBKQ09FRiBKQkxPQ0tbRENUU0laRTJdOwkvKiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzICovCit0eXBlZGVmIEpCTE9DSyBGQVIgKkpCTE9DS1JPVzsJLyogcG9pbnRlciB0byBvbmUgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyAqLwordHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwkJLyogYSAyLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCit0eXBlZGVmIEpCTE9DS0FSUkFZICpKQkxPQ0tJTUFHRTsJLyogYSAzLUQgYXJyYXkgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCisKK3R5cGVkZWYgSkNPRUYgRkFSICpKQ09FRlBUUjsJLyogdXNlZnVsIGluIGEgY291cGxlIG9mIHBsYWNlcyAqLworCisKKy8qIFR5cGVzIGZvciBKUEVHIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgYW5kIHdvcmtpbmcgdGFibGVzLiAqLworCisKKy8qIERDVCBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoaXMgYXJyYXkgZ2l2ZXMgdGhlIGNvZWZmaWNpZW50IHF1YW50aXplcnMgaW4gbmF0dXJhbCBhcnJheSBvcmRlcgorICAgKiAobm90IHRoZSB6aWd6YWcgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc3RvcmVkIGluIGEgSlBFRyBEUVQgbWFya2VyKS4KKyAgICogQ0FVVElPTjogSUpHIHZlcnNpb25zIHByaW9yIHRvIHY2YSBrZXB0IHRoaXMgYXJyYXkgaW4gemlnemFnIG9yZGVyLgorICAgKi8KKyAgVUlOVDE2IHF1YW50dmFsW0RDVFNJWkUyXTsJLyogcXVhbnRpemF0aW9uIHN0ZXAgZm9yIGVhY2ggY29lZmZpY2llbnQgKi8KKyAgLyogVGhpcyBmaWVsZCBpcyB1c2VkIG9ubHkgZHVyaW5nIGNvbXByZXNzaW9uLiAgSXQncyBpbml0aWFsaXplZCBGQUxTRSB3aGVuCisgICAqIHRoZSB0YWJsZSBpcyBjcmVhdGVkLCBhbmQgc2V0IFRSVUUgd2hlbiBpdCdzIGJlZW4gb3V0cHV0IHRvIHRoZSBmaWxlLgorICAgKiBZb3UgY291bGQgc3VwcHJlc3Mgb3V0cHV0IG9mIGEgdGFibGUgYnkgc2V0dGluZyB0aGlzIHRvIFRSVUUuCisgICAqIChTZWUganBlZ19zdXBwcmVzc190YWJsZXMgZm9yIGFuIGV4YW1wbGUuKQorICAgKi8KKyAgYm9vbGVhbiBzZW50X3RhYmxlOwkJLyogVFJVRSB3aGVuIHRhYmxlIGhhcyBiZWVuIG91dHB1dCAqLworfSBKUVVBTlRfVEJMOworCisKKy8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGVzZSB0d28gZmllbGRzIGRpcmVjdGx5IHJlcHJlc2VudCB0aGUgY29udGVudHMgb2YgYSBKUEVHIERIVCBtYXJrZXIgKi8KKyAgVUlOVDggYml0c1sxN107CQkvKiBiaXRzW2tdID0gIyBvZiBzeW1ib2xzIHdpdGggY29kZXMgb2YgKi8KKwkJCQkvKiBsZW5ndGggayBiaXRzOyBiaXRzWzBdIGlzIHVudXNlZCAqLworICBVSU5UOCBodWZmdmFsWzI1Nl07CQkvKiBUaGUgc3ltYm9scywgaW4gb3JkZXIgb2YgaW5jciBjb2RlIGxlbmd0aCAqLworICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KKyAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCisgICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KKyAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCisgICAqLworICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCit9IEpIVUZGX1RCTDsKKworCisvKiBCYXNpYyBpbmZvIGFib3V0IG9uZSBjb21wb25lbnQgKGNvbG9yIGNoYW5uZWwpLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgZml4ZWQgb3ZlciB0aGUgd2hvbGUgaW1hZ2UuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09GIG1hcmtlci4gKi8KKyAgaW50IGNvbXBvbmVudF9pZDsJCS8qIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50ICgwLi4yNTUpICovCisgIGludCBjb21wb25lbnRfaW5kZXg7CQkvKiBpdHMgaW5kZXggaW4gU09GIG9yIGNpbmZvLT5jb21wX2luZm9bXSAqLworICBpbnQgaF9zYW1wX2ZhY3RvcjsJCS8qIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLworICBpbnQgdl9zYW1wX2ZhY3RvcjsJCS8qIHZlcnRpY2FsIHNhbXBsaW5nIGZhY3RvciAoMS4uNCkgKi8KKyAgaW50IHF1YW50X3RibF9ubzsJCS8qIHF1YW50aXphdGlvbiB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKyAgLyogVGhlc2UgdmFsdWVzIG1heSB2YXJ5IGJldHdlZW4gc2NhbnMuICovCisgIC8qIEZvciBjb21wcmVzc2lvbiwgdGhleSBtdXN0IGJlIHN1cHBsaWVkIGJ5IHBhcmFtZXRlciBzZXR1cDsgKi8KKyAgLyogZm9yIGRlY29tcHJlc3Npb24sIHRoZXkgYXJlIHJlYWQgZnJvbSB0aGUgU09TIG1hcmtlci4gKi8KKyAgLyogVGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtYXkgbm90IHVzZSB0aGVzZSB2YXJpYWJsZXMuICovCisgIGludCBkY190Ymxfbm87CQkvKiBEQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLworICBpbnQgYWNfdGJsX25vOwkJLyogQUMgZW50cm9weSB0YWJsZSBzZWxlY3RvciAoMC4uMykgKi8KKworICAvKiBSZW1haW5pbmcgZmllbGRzIHNob3VsZCBiZSB0cmVhdGVkIGFzIHByaXZhdGUgYnkgYXBwbGljYXRpb25zLiAqLworCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RhcnR1cDogKi8KKyAgLyogQ29tcG9uZW50J3Mgc2l6ZSBpbiBEQ1QgYmxvY2tzLgorICAgKiBBbnkgZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGNvbXBsZXRlIGFuIE1DVSBhcmUgbm90IGNvdW50ZWQ7IHRoZXJlZm9yZQorICAgKiB0aGVzZSB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB3aGV0aGVyIGEgc2NhbiBpcyBpbnRlcmxlYXZlZCBvciBub3QuCisgICAqLworICBKRElNRU5TSU9OIHdpZHRoX2luX2Jsb2NrczsKKyAgSkRJTUVOU0lPTiBoZWlnaHRfaW5fYmxvY2tzOworICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMuICBBbHdheXMgRENUU0laRSBmb3IgY29tcHJlc3Npb24uCisgICAqIEZvciBkZWNvbXByZXNzaW9uIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmcm9tIG9uZSBEQ1QgYmxvY2ssCisgICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgSURDVCBzdGVwLgorICAgKiBWYWx1ZXMgb2YgMSwyLDQsOCBhcmUgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZC4gIE5vdGUgdGhhdCBkaWZmZXJlbnQKKyAgICogY29tcG9uZW50cyBtYXkgcmVjZWl2ZSBkaWZmZXJlbnQgSURDVCBzY2FsaW5ncy4KKyAgICovCisgIGludCBEQ1Rfc2NhbGVkX3NpemU7CisgIC8qIFRoZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIGFyZSB0aGUgY29tcG9uZW50J3MgYWN0dWFsLCB1bnBhZGRlZCBudW1iZXIKKyAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKSwgdGh1cworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4KQorICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuICBGb3IgZGVjb21wcmVzc2lvbiwgSURDVCBzY2FsaW5nIGlzIGluY2x1ZGVkLCBzbworICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4ICogRENUX3NjYWxlZF9zaXplL0RDVFNJWkUpCisgICAqLworICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KKyAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLworICAvKiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLiAgSW4gY2FzZXMgd2hlcmUgc29tZSBvZiB0aGUKKyAgICogY29tcG9uZW50cyB3aWxsIGJlIGlnbm9yZWQgKGVnIGdyYXlzY2FsZSBvdXRwdXQgZnJvbSBZQ2JDciBpbWFnZSksCisgICAqIHdlIGNhbiBza2lwIG1vc3QgY29tcHV0YXRpb25zIGZvciB0aGUgdW51c2VkIGNvbXBvbmVudHMuCisgICAqLworICBib29sZWFuIGNvbXBvbmVudF9uZWVkZWQ7CS8qIGRvIHdlIG5lZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50PyAqLworCisgIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgc2NhbiBvZiB0aGUgY29tcG9uZW50LiAqLworICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KKyAgaW50IE1DVV93aWR0aDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgaG9yaXpvbnRhbGx5ICovCisgIGludCBNQ1VfaGVpZ2h0OwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCB2ZXJ0aWNhbGx5ICovCisgIGludCBNQ1VfYmxvY2tzOwkJLyogTUNVX3dpZHRoICogTUNVX2hlaWdodCAqLworICBpbnQgTUNVX3NhbXBsZV93aWR0aDsJCS8qIE1DVSB3aWR0aCBpbiBzYW1wbGVzLCBNQ1Vfd2lkdGgqRENUX3NjYWxlZF9zaXplICovCisgIGludCBsYXN0X2NvbF93aWR0aDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBhY3Jvc3MgaW4gbGFzdCBNQ1UgKi8KKyAgaW50IGxhc3Rfcm93X2hlaWdodDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBkb3duIGluIGxhc3QgTUNVICovCisKKyAgLyogU2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQ7IE5VTEwgaWYgbm9uZSB5ZXQgc2F2ZWQuCisgICAqIFNlZSBqZGlucHV0LmMgY29tbWVudHMgYWJvdXQgdGhlIG5lZWQgZm9yIHRoaXMgaW5mb3JtYXRpb24uCisgICAqIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4KKyAgICovCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YWJsZTsKKworICAvKiBQcml2YXRlIHBlci1jb21wb25lbnQgc3RvcmFnZSBmb3IgRENUIG9yIElEQ1Qgc3Vic3lzdGVtLiAqLworICB2b2lkICogZGN0X3RhYmxlOworfSBqcGVnX2NvbXBvbmVudF9pbmZvOworCisKKy8qIFRoZSBzY3JpcHQgZm9yIGVuY29kaW5nIGEgbXVsdGlwbGUtc2NhbiBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlOiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBjb21wc19pbl9zY2FuOwkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgZW5jb2RlZCBpbiB0aGlzIHNjYW4gKi8KKyAgaW50IGNvbXBvbmVudF9pbmRleFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIHRoZWlyIFNPRi9jb21wX2luZm9bXSBpbmRleGVzICovCisgIGludCBTcywgU2U7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzcGVjdHJhbCBzZWxlY3Rpb24gcGFybXMgKi8KKyAgaW50IEFoLCBBbDsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHN1Y2Nlc3NpdmUgYXBwcm94LiBwYXJtcyAqLworfSBqcGVnX3NjYW5faW5mbzsKKworLyogVGhlIGRlY29tcHJlc3NvciBjYW4gc2F2ZSBBUFBuIGFuZCBDT00gbWFya2VycyBpbiBhIGxpc3Qgb2YgdGhlc2U6ICovCisKK3R5cGVkZWYgc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCBGQVIgKiBqcGVnX3NhdmVkX21hcmtlcl9wdHI7CisKK3N0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgeworICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0LCBvciBOVUxMICovCisgIFVJTlQ4IG1hcmtlcjsJCQkvKiBtYXJrZXIgY29kZTogSlBFR19DT00sIG9yIEpQRUdfQVBQMCtuICovCisgIHVuc2lnbmVkIGludCBvcmlnaW5hbF9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZmlsZSAqLworICB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBzYXZlZCBhdCBkYXRhW10gKi8KKyAgSk9DVEVUIEZBUiAqIGRhdGE7CQkvKiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIG1hcmtlciAqLworICAvKiB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGlzIG5vdCBjb3VudGVkIGluIGRhdGFfbGVuZ3RoIG9yIG9yaWdpbmFsX2xlbmd0aCAqLworfTsKKworLyogS25vd24gY29sb3Igc3BhY2VzLiAqLworCit0eXBlZGVmIGVudW0geworCUpDU19VTktOT1dOLAkJLyogZXJyb3IvdW5zcGVjaWZpZWQgKi8KKwlKQ1NfR1JBWVNDQUxFLAkJLyogbW9ub2Nocm9tZSAqLworCUpDU19SR0IsCQkvKiByZWQvZ3JlZW4vYmx1ZSAqLworCUpDU19ZQ2JDciwJCS8qIFkvQ2IvQ3IgKGFsc28ga25vd24gYXMgWVVWKSAqLworCUpDU19DTVlLLAkJLyogQy9NL1kvSyAqLworCUpDU19ZQ0NLLAkJLyogWS9DYi9Dci9LICovCisjaWZkZWYgQU5EUk9JRF9SR0IKKyAgICBKQ1NfUkdCQV84ODg4LCAgLyogcmVkL2dyZWVuL2JsdWUvYWxwaGEgKi8KKyAgICBKQ1NfUkdCXzU2NSAgICAgLyogcmVkL2dyZWVuL2JsdWUgaW4gNTY1IGZvcm1hdCAqLworI2VuZGlmCit9IEpfQ09MT1JfU1BBQ0U7CisKKy8qIERDVC9JRENUIGFsZ29yaXRobSBvcHRpb25zLiAqLworCit0eXBlZGVmIGVudW0geworCUpEQ1RfSVNMT1csCQkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLworCUpEQ1RfSUZBU1QsCQkvKiBmYXN0ZXIsIGxlc3MgYWNjdXJhdGUgaW50ZWdlciBtZXRob2QgKi8KKwlKRENUX0ZMT0FUCQkvKiBmbG9hdGluZy1wb2ludDogYWNjdXJhdGUsIGZhc3Qgb24gZmFzdCBIVyAqLworfSBKX0RDVF9NRVRIT0Q7CisKKyNpZm5kZWYgSkRDVF9ERUZBVUxUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9ERUZBVUxUICBKRENUX0lTTE9XCisjZW5kaWYKKyNpZm5kZWYgSkRDVF9GQVNURVNUCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KKyNkZWZpbmUgSkRDVF9GQVNURVNUICBKRENUX0lGQVNUCisjZW5kaWYKKworLyogRGl0aGVyaW5nIG9wdGlvbnMgZm9yIGRlY29tcHJlc3Npb24uICovCisKK3R5cGVkZWYgZW51bSB7CisJSkRJVEhFUl9OT05FLAkJLyogbm8gZGl0aGVyaW5nICovCisJSkRJVEhFUl9PUkRFUkVELAkvKiBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgKi8KKwlKRElUSEVSX0ZTCQkvKiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uIGRpdGhlciAqLworfSBKX0RJVEhFUl9NT0RFOworCisKKy8qIENvbW1vbiBmaWVsZHMgYmV0d2VlbiBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG1hc3RlciBzdHJ1Y3RzLiAqLworCisjZGVmaW5lIGpwZWdfY29tbW9uX2ZpZWxkcyBcCisgIHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycjsJLyogRXJyb3IgaGFuZGxlciBtb2R1bGUgKi9cCisgIHN0cnVjdCBqcGVnX21lbW9yeV9tZ3IgKiBtZW07CS8qIE1lbW9yeSBtYW5hZ2VyIG1vZHVsZSAqL1wKKyAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyICogcHJvZ3Jlc3M7IC8qIFByb2dyZXNzIG1vbml0b3IsIG9yIE5VTEwgaWYgbm9uZSAqL1wKKyAgdm9pZCAqIGNsaWVudF9kYXRhOwkJLyogQXZhaWxhYmxlIGZvciB1c2UgYnkgYXBwbGljYXRpb24gKi9cCisgIGJvb2xlYW4gaXNfZGVjb21wcmVzc29yOwkvKiBTbyBjb21tb24gY29kZSBjYW4gdGVsbCB3aGljaCBpcyB3aGljaCAqL1wKKyAgaW50IGdsb2JhbF9zdGF0ZQkJLyogRm9yIGNoZWNraW5nIGNhbGwgc2VxdWVuY2UgdmFsaWRpdHkgKi8KKworLyogUm91dGluZXMgdGhhdCBhcmUgdG8gYmUgdXNlZCBieSBib3RoIGhhbHZlcyBvZiB0aGUgbGlicmFyeSBhcmUgZGVjbGFyZWQKKyAqIHRvIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLiAgVGhlcmUgYXJlIG5vIGFjdHVhbCBpbnN0YW5jZXMgb2YKKyAqIGpwZWdfY29tbW9uX3N0cnVjdCwgb25seSBvZiBqcGVnX2NvbXByZXNzX3N0cnVjdCBhbmQganBlZ19kZWNvbXByZXNzX3N0cnVjdC4KKyAqLworc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBjb21tb24gdG8gYm90aCBtYXN0ZXIgc3RydWN0IHR5cGVzICovCisgIC8qIEFkZGl0aW9uYWwgZmllbGRzIGZvbGxvdyBpbiBhbiBhY3R1YWwganBlZ19jb21wcmVzc19zdHJ1Y3Qgb3IKKyAgICoganBlZ19kZWNvbXByZXNzX3N0cnVjdC4gIEFsbCB0aHJlZSBzdHJ1Y3RzIG11c3QgYWdyZWUgb24gdGhlc2UKKyAgICogaW5pdGlhbCBmaWVsZHMhICAoVGhpcyB3b3VsZCBiZSBhIGxvdCBjbGVhbmVyIGluIEMrKy4pCisgICAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21tb25fc3RydWN0ICogal9jb21tb25fcHRyOwordHlwZWRlZiBzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgKiBqX2NvbXByZXNzX3B0cjsKK3R5cGVkZWYgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKiBqX2RlY29tcHJlc3NfcHRyOworCisKKy8qIE1hc3RlciByZWNvcmQgZm9yIGEgY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KKworc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IHsKKyAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIHNoYXJlZCB3aXRoIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgKi8KKworICAvKiBEZXN0aW5hdGlvbiBmb3IgY29tcHJlc3NlZCBkYXRhICovCisgIHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21nciAqIGRlc3Q7CisKKyAgLyogRGVzY3JpcHRpb24gb2Ygc291cmNlIGltYWdlIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBmaWxsZWQgaW4gYnkKKyAgICogb3V0ZXIgYXBwbGljYXRpb24gYmVmb3JlIHN0YXJ0aW5nIGNvbXByZXNzaW9uLiAgaW5fY29sb3Jfc3BhY2UgbXVzdAorICAgKiBiZSBjb3JyZWN0IGJlZm9yZSB5b3UgY2FuIGV2ZW4gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpLgorICAgKi8KKworICBKRElNRU5TSU9OIGltYWdlX3dpZHRoOwkvKiBpbnB1dCBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogaW5wdXQgaW1hZ2UgaGVpZ2h0ICovCisgIGludCBpbnB1dF9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIGlucHV0IGltYWdlICovCisgIEpfQ09MT1JfU1BBQ0UgaW5fY29sb3Jfc3BhY2U7CS8qIGNvbG9yc3BhY2Ugb2YgaW5wdXQgaW1hZ2UgKi8KKworICBkb3VibGUgaW5wdXRfZ2FtbWE7CQkvKiBpbWFnZSBnYW1tYSBvZiBpbnB1dCBpbWFnZSAqLworCisgIC8qIENvbXByZXNzaW9uIHBhcmFtZXRlcnMgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZworICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkuICBXZSByZWNvbW1lbmQgY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpIHRvCisgICAqIGluaXRpYWxpemUgZXZlcnl0aGluZyB0byByZWFzb25hYmxlIGRlZmF1bHRzLCB0aGVuIGNoYW5naW5nIGFueXRoaW5nCisgICAqIHRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpY2FsbHkgd2FudHMgdG8gY2hhbmdlLiAgVGhhdCB3YXkgeW91IHdvbid0IGdldAorICAgKiBidXJudCB3aGVuIG5ldyBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gIEFsc28gbm90ZSB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsCisgICAqIGhlbHBlciByb3V0aW5lcyB0byBzaW1wbGlmeSBjaGFuZ2luZyBwYXJhbWV0ZXJzLgorICAgKi8KKworICBpbnQgZGF0YV9wcmVjaXNpb247CQkvKiBiaXRzIG9mIHByZWNpc2lvbiBpbiBpbWFnZSBkYXRhICovCisKKyAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KKyAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KKworICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOworICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KKworICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOworICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KKworICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOworICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIFVJTlQ4IGFyaXRoX2RjX0xbTlVNX0FSSVRIX1RCTFNdOyAvKiBMIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworICBVSU5UOCBhcml0aF9kY19VW05VTV9BUklUSF9UQkxTXTsgLyogVSB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfYWNfS1tOVU1fQVJJVEhfVEJMU107IC8qIEt4IHZhbHVlcyBmb3IgQUMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLworCisgIGludCBudW1fc2NhbnM7CQkvKiAjIG9mIGVudHJpZXMgaW4gc2Nhbl9pbmZvIGFycmF5ICovCisgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2Nhbl9pbmZvOyAvKiBzY3JpcHQgZm9yIG11bHRpLXNjYW4gZmlsZSwgb3IgTlVMTCAqLworICAvKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzY2FuX2luZm8gaXMgTlVMTCwgd2hpY2ggY2F1c2VzIGEgc2luZ2xlLXNjYW4KKyAgICogc2VxdWVudGlhbCBKUEVHIGZpbGUgdG8gYmUgZW1pdHRlZC4gIFRvIGNyZWF0ZSBhIG11bHRpLXNjYW4gZmlsZSwKKyAgICogc2V0IG51bV9zY2FucyBhbmQgc2Nhbl9pbmZvIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVmaW5pdGlvbnMuCisgICAqLworCisgIGJvb2xlYW4gcmF3X2RhdGFfaW47CQkvKiBUUlVFPWNhbGxlciBzdXBwbGllcyBkb3duc2FtcGxlZCBkYXRhICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KKyAgYm9vbGVhbiBvcHRpbWl6ZV9jb2Rpbmc7CS8qIFRSVUU9b3B0aW1pemUgZW50cm9weSBlbmNvZGluZyBwYXJtcyAqLworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworICBpbnQgc21vb3RoaW5nX2ZhY3RvcjsJCS8qIDEuLjEwMCwgb3IgMCBmb3Igbm8gaW5wdXQgc21vb3RoaW5nICovCisgIEpfRENUX01FVEhPRCBkY3RfbWV0aG9kOwkvKiBEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCisKKyAgLyogVGhlIHJlc3RhcnQgaW50ZXJ2YWwgY2FuIGJlIHNwZWNpZmllZCBpbiBhYnNvbHV0ZSBNQ1VzIGJ5IHNldHRpbmcKKyAgICogcmVzdGFydF9pbnRlcnZhbCwgb3IgaW4gTUNVIHJvd3MgYnkgc2V0dGluZyByZXN0YXJ0X2luX3Jvd3MKKyAgICogKGluIHdoaWNoIGNhc2UgdGhlIGNvcnJlY3QgcmVzdGFydF9pbnRlcnZhbCB3aWxsIGJlIGZpZ3VyZWQKKyAgICogZm9yIGVhY2ggc2NhbikuCisgICAqLworICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLworICBpbnQgcmVzdGFydF9pbl9yb3dzOwkJLyogaWYgPiAwLCBNQ1Ugcm93cyBwZXIgcmVzdGFydCBpbnRlcnZhbCAqLworCisgIC8qIFBhcmFtZXRlcnMgY29udHJvbGxpbmcgZW1pc3Npb24gb2Ygc3BlY2lhbCBtYXJrZXJzLiAqLworCisgIGJvb2xlYW4gd3JpdGVfSkZJRl9oZWFkZXI7CS8qIHNob3VsZCBhIEpGSUYgbWFya2VyIGJlIHdyaXR0ZW4/ICovCisgIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogV2hhdCB0byB3cml0ZSBmb3IgdGhlIEpGSUYgdmVyc2lvbiBudW1iZXIgKi8KKyAgVUlOVDggSkZJRl9taW5vcl92ZXJzaW9uOworICAvKiBUaGVzZSB0aHJlZSB2YWx1ZXMgYXJlIG5vdCB1c2VkIGJ5IHRoZSBKUEVHIGNvZGUsIG1lcmVseSBjb3BpZWQgKi8KKyAgLyogaW50byB0aGUgSkZJRiBBUFAwIG1hcmtlci4gIGRlbnNpdHlfdW5pdCBjYW4gYmUgMCBmb3IgdW5rbm93biwgKi8KKyAgLyogMSBmb3IgZG90cy9pbmNoLCBvciAyIGZvciBkb3RzL2NtLiAgTm90ZSB0aGF0IHRoZSBwaXhlbCBhc3BlY3QgKi8KKyAgLyogcmF0aW8gaXMgZGVmaW5lZCBieSBYX2RlbnNpdHkvWV9kZW5zaXR5IGV2ZW4gd2hlbiBkZW5zaXR5X3VuaXQ9MC4gKi8KKyAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCisgIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXI7CS8qIHNob3VsZCBhbiBBZG9iZSBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KKworICAvKiBTdGF0ZSB2YXJpYWJsZTogaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSB3cml0dGVuIHRvCisgICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkuICBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMKKyAgICogcHJvY2Vzc2luZyBsb29wLCBlLmcuLCAid2hpbGUgKG5leHRfc2NhbmxpbmUgPCBpbWFnZV9oZWlnaHQpIi4KKyAgICovCisKKyAgSkRJTUVOU0lPTiBuZXh0X3NjYW5saW5lOwkvKiAwIC4uIGltYWdlX2hlaWdodC0xICAqLworCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQorICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAgICovCisKKyAgLyoKKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgY29tcHJlc3Npb24gc3RhcnR1cAorICAgKi8KKyAgYm9vbGVhbiBwcm9ncmVzc2l2ZV9tb2RlOwkvKiBUUlVFIGlmIHNjYW4gc2NyaXB0IHVzZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLworICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLworICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLworCisgIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyB0byBiZSBpbnB1dCB0byBjb2VmIGN0bHIgKi8KKyAgLyogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgcmVjZWl2ZXMgZGF0YSBpbiB1bml0cyBvZiBNQ1Ugcm93cyBhcyBkZWZpbmVkCisgICAqIGZvciBmdWxseSBpbnRlcmxlYXZlZCBzY2FucyAod2hldGhlciB0aGUgSlBFRyBmaWxlIGlzIGludGVybGVhdmVkIG9yIG5vdCkuCisgICAqIFRoZXJlIGFyZSB2X3NhbXBfZmFjdG9yICogRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudCBpbiBhbgorICAgKiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93LgorICAgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCisgICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgorICAgKi8KKyAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOworICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLworCisgIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCisKKyAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLworICBpbnQgTUNVX21lbWJlcnNoaXBbQ19NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLworICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLworCisgIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLworCisgIC8qCisgICAqIExpbmtzIHRvIGNvbXByZXNzaW9uIHN1Ym9iamVjdHMgKG1ldGhvZHMgYW5kIHByaXZhdGUgdmFyaWFibGVzIG9mIG1vZHVsZXMpCisgICAqLworICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqIG1hc3RlcjsKKyAgc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKiBtYWluOworICBzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciAqIHByZXA7CisgIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICogY29lZjsKKyAgc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciAqIG1hcmtlcjsKKyAgc3RydWN0IGpwZWdfY29sb3JfY29udmVydGVyICogY2NvbnZlcnQ7CisgIHN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyICogZG93bnNhbXBsZTsKKyAgc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgKiBmZGN0OworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgKiBlbnRyb3B5OworICBqcGVnX3NjYW5faW5mbyAqIHNjcmlwdF9zcGFjZTsgLyogd29ya3NwYWNlIGZvciBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiAqLworICBpbnQgc2NyaXB0X3NwYWNlX3NpemU7Cit9OworCisKKy8qIE1hc3RlciByZWNvcmQgZm9yIGEgZGVjb21wcmVzc2lvbiBpbnN0YW5jZSAqLworCitzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCB7CisgIGpwZWdfY29tbW9uX2ZpZWxkczsJCS8qIEZpZWxkcyBzaGFyZWQgd2l0aCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqLworCisgIC8qIFNvdXJjZSBvZiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgc3RydWN0IGpwZWdfc291cmNlX21nciAqIHNyYzsKKworICAvKiBCYXNpYyBkZXNjcmlwdGlvbiBvZiBpbWFnZSAtLS0gZmlsbGVkIGluIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKS4gKi8KKyAgLyogQXBwbGljYXRpb24gbWF5IGluc3BlY3QgdGhlc2UgdmFsdWVzIHRvIGRlY2lkZSBob3cgdG8gcHJvY2VzcyBpbWFnZS4gKi8KKworICBKRElNRU5TSU9OIG9yaWdpbmFsX2ltYWdlX3dpZHRoOwkvKiBub21pbmFsIGltYWdlIHdpZHRoIChmcm9tIFNPRiBtYXJrZXIpICovCisKKyAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogbm9taW5hbCBpbWFnZSB3aWR0aCAoZnJvbSBTT0YgbWFya2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjaGFuZ2VkIGJ5IHRpbGUgZGVjb2RlICovCisgIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBub21pbmFsIGltYWdlIGhlaWdodCAqLworICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLworICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLworCisgIC8qIERlY29tcHJlc3Npb24gcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIC0tLSB0aGVzZSBmaWVsZHMgbXVzdCBiZSBzZXQgYmVmb3JlCisgICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICBOb3RlIHRoYXQganBlZ19yZWFkX2hlYWRlcigpIGluaXRpYWxpemVzCisgICAqIHRoZW0gdG8gZGVmYXVsdCB2YWx1ZXMuCisgICAqLworCisgIEpfQ09MT1JfU1BBQ0Ugb3V0X2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIGZvciBvdXRwdXQgKi8KKworICB1bnNpZ25lZCBpbnQgc2NhbGVfbnVtLCBzY2FsZV9kZW5vbTsgLyogZnJhY3Rpb24gYnkgd2hpY2ggdG8gc2NhbGUgaW1hZ2UgKi8KKworICBkb3VibGUgb3V0cHV0X2dhbW1hOwkJLyogaW1hZ2UgZ2FtbWEgd2FudGVkIGluIG91dHB1dCAqLworCisgIGJvb2xlYW4gYnVmZmVyZWRfaW1hZ2U7CS8qIFRSVUU9bXVsdGlwbGUgb3V0cHV0IHBhc3NlcyAqLworICBib29sZWFuIHJhd19kYXRhX291dDsJCS8qIFRSVUU9ZG93bnNhbXBsZWQgZGF0YSB3YW50ZWQgKi8KKworICBKX0RDVF9NRVRIT0QgZGN0X21ldGhvZDsJLyogSURDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KKyAgYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nOwkvKiBUUlVFPWFwcGx5IGZhbmN5IHVwc2FtcGxpbmcgKi8KKyAgYm9vbGVhbiBkb19ibG9ja19zbW9vdGhpbmc7CS8qIFRSVUU9YXBwbHkgaW50ZXJibG9jayBzbW9vdGhpbmcgKi8KKworICBib29sZWFuIHF1YW50aXplX2NvbG9yczsJLyogVFJVRT1jb2xvcm1hcHBlZCBvdXRwdXQgd2FudGVkICovCisgIC8qIHRoZSBmb2xsb3dpbmcgYXJlIGlnbm9yZWQgaWYgbm90IHF1YW50aXplX2NvbG9yczogKi8KKyAgSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZTsJLyogdHlwZSBvZiBjb2xvciBkaXRoZXJpbmcgdG8gdXNlICovCisgIGJvb2xlYW4gdHdvX3Bhc3NfcXVhbnRpemU7CS8qIFRSVUU9dXNlIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAqLworICBpbnQgZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOwkvKiBtYXggIyBjb2xvcnMgdG8gdXNlIGluIGNyZWF0ZWQgY29sb3JtYXAgKi8KKyAgLyogdGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZTogKi8KKyAgYm9vbGVhbiBlbmFibGVfMXBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDEtcGFzcyBxdWFudGl6ZXIgKi8KKyAgYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQ7LyogZW5hYmxlIGZ1dHVyZSB1c2Ugb2YgZXh0ZXJuYWwgY29sb3JtYXAgKi8KKyAgYm9vbGVhbiBlbmFibGVfMnBhc3NfcXVhbnQ7CS8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIDItcGFzcyBxdWFudGl6ZXIgKi8KKworICAvKiBEZXNjcmlwdGlvbiBvZiBhY3R1YWwgb3V0cHV0IGltYWdlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byBhcHBsaWNhdGlvbi4KKyAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKyAgICogWW91IGNhbiBhbHNvIHVzZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSB0byBkZXRlcm1pbmUgdGhlc2UgdmFsdWVzCisgICAqIGluIGFkdmFuY2Ugb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4KKyAgICovCisKKyAgSkRJTUVOU0lPTiBvdXRwdXRfd2lkdGg7CS8qIHNjYWxlZCBpbWFnZSB3aWR0aCAqLworICBKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQ7CS8qIHNjYWxlZCBpbWFnZSBoZWlnaHQgKi8KKyAgaW50IG91dF9jb2xvcl9jb21wb25lbnRzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gb3V0X2NvbG9yX3NwYWNlICovCisgIGludCBvdXRwdXRfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkICovCisgIC8qIG91dHB1dF9jb21wb25lbnRzIGlzIDEgKGEgY29sb3JtYXAgaW5kZXgpIHdoZW4gcXVhbnRpemluZyBjb2xvcnM7CisgICAqIG90aGVyd2lzZSBpdCBlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuCisgICAqLworICBpbnQgcmVjX291dGJ1Zl9oZWlnaHQ7CS8qIG1pbiByZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyICovCisgIC8qIElmIHRoZSBidWZmZXIgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKSBpcyBsZXNzIHRoYW4gdGhpcyBtYW55IHJvd3MKKyAgICogaGlnaCwgc3BhY2UgYW5kIHRpbWUgd2lsbCBiZSB3YXN0ZWQgZHVlIHRvIHVubmVjZXNzYXJ5IGRhdGEgY29weWluZy4KKyAgICogVXN1YWxseSByZWNfb3V0YnVmX2hlaWdodCB3aWxsIGJlIDEgb3IgMiwgYXQgbW9zdCA0LgorICAgKi8KKworICAvKiBXaGVuIHF1YW50aXppbmcgY29sb3JzLCB0aGUgb3V0cHV0IGNvbG9ybWFwIGlzIGRlc2NyaWJlZCBieSB0aGVzZSBmaWVsZHMuCisgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gc3VwcGx5IGEgY29sb3JtYXAgYnkgc2V0dGluZyBjb2xvcm1hcCBub24tTlVMTCBiZWZvcmUKKyAgICogY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IG90aGVyd2lzZSBhIGNvbG9ybWFwIGlzIGNyZWF0ZWQgZHVyaW5nCisgICAqIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBvciBqcGVnX3N0YXJ0X291dHB1dC4KKyAgICogVGhlIG1hcCBoYXMgb3V0X2NvbG9yX2NvbXBvbmVudHMgcm93cyBhbmQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMgY29sdW1ucy4KKyAgICovCisgIGludCBhY3R1YWxfbnVtYmVyX29mX2NvbG9yczsJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gdXNlICovCisgIEpTQU1QQVJSQVkgY29sb3JtYXA7CQkvKiBUaGUgY29sb3IgbWFwIGFzIGEgMi1EIHBpeGVsIGFycmF5ICovCisKKyAgLyogU3RhdGUgdmFyaWFibGVzOiB0aGVzZSB2YXJpYWJsZXMgaW5kaWNhdGUgdGhlIHByb2dyZXNzIG9mIGRlY29tcHJlc3Npb24uCisgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgZXhhbWluZSB0aGVzZSBidXQgbXVzdCBub3QgbW9kaWZ5IHRoZW0uCisgICAqLworCisgIC8qIFJvdyBpbmRleCBvZiBuZXh0IHNjYW5saW5lIHRvIGJlIHJlYWQgZnJvbSBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuCisgICAqIEFwcGxpY2F0aW9uIG1heSB1c2UgdGhpcyB0byBjb250cm9sIGl0cyBwcm9jZXNzaW5nIGxvb3AsIGUuZy4sCisgICAqICJ3aGlsZSAob3V0cHV0X3NjYW5saW5lIDwgb3V0cHV0X2hlaWdodCkiLgorICAgKi8KKyAgSkRJTUVOU0lPTiBvdXRwdXRfc2NhbmxpbmU7CS8qIDAgLi4gb3V0cHV0X2hlaWdodC0xICAqLworCisgIC8qIEN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIG51bWJlciBvZiBpTUNVIHJvd3MgY29tcGxldGVkIGluIHNjYW4uCisgICAqIFRoZXNlIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiB0aGUgZGVjb21wcmVzc29yIGlucHV0IHNpZGUuCisgICAqLworICBpbnQgaW5wdXRfc2Nhbl9udW1iZXI7CS8qIE51bWJlciBvZiBTT1MgbWFya2VycyBzZWVuIHNvIGZhciAqLworICBKRElNRU5TSU9OIGlucHV0X2lNQ1Vfcm93OwkvKiBOdW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCAqLworCisgIC8qIFRoZSAib3V0cHV0IHNjYW4gbnVtYmVyIiBpcyB0aGUgbm90aW9uYWwgc2NhbiBiZWluZyBkaXNwbGF5ZWQgYnkgdGhlCisgICAqIG91dHB1dCBzaWRlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIG5vdCBhbGxvdyBvdXRwdXQgc2Nhbi9yb3cgbnVtYmVyCisgICAqIHRvIGdldCBhaGVhZCBvZiBpbnB1dCBzY2FuL3JvdywgYnV0IGl0IGNhbiBmYWxsIGFyYml0cmFyaWx5IGZhciBiZWhpbmQuCisgICAqLworICBpbnQgb3V0cHV0X3NjYW5fbnVtYmVyOwkvKiBOb21pbmFsIHNjYW4gbnVtYmVyIGJlaW5nIGRpc3BsYXllZCAqLworICBKRElNRU5TSU9OIG91dHB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyByZWFkICovCisKKyAgLyogQ3VycmVudCBwcm9ncmVzc2lvbiBzdGF0dXMuICBjb2VmX2JpdHNbY11baV0gaW5kaWNhdGVzIHRoZSBwcmVjaXNpb24KKyAgICogd2l0aCB3aGljaCBjb21wb25lbnQgYydzIERDVCBjb2VmZmljaWVudCBpIChpbiB6aWd6YWcgb3JkZXIpIGlzIGtub3duLgorICAgKiBJdCBpcyAtMSB3aGVuIG5vIGRhdGEgaGFzIHlldCBiZWVuIHJlY2VpdmVkLCBvdGhlcndpc2UgaXQgaXMgdGhlIHBvaW50CisgICAqIHRyYW5zZm9ybSAoc2hpZnQpIHZhbHVlIGZvciB0aGUgbW9zdCByZWNlbnQgc2NhbiBvZiB0aGUgY29lZmZpY2llbnQKKyAgICogKHRodXMsIDAgYXQgY29tcGxldGlvbiBvZiB0aGUgcHJvZ3Jlc3Npb24pLgorICAgKiBUaGlzIHBvaW50ZXIgaXMgTlVMTCB3aGVuIHJlYWRpbmcgYSBub24tcHJvZ3Jlc3NpdmUgZmlsZS4KKyAgICovCisgIGludCAoKmNvZWZfYml0cylbRENUU0laRTJdOwkvKiAtMSBvciBjdXJyZW50IEFsIHZhbHVlIGZvciBlYWNoIGNvZWYgKi8KKworICAvKiBJbnRlcm5hbCBKUEVHIHBhcmFtZXRlcnMgLS0tIHRoZSBhcHBsaWNhdGlvbiB1c3VhbGx5IG5lZWQgbm90IGxvb2sgYXQKKyAgICogdGhlc2UgZmllbGRzLiAgTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbWF5IG5vdCB1c2UKKyAgICogYW55IHBhcmFtZXRlcnMgdGhhdCBjYW4gY2hhbmdlIGJldHdlZW4gc2NhbnMuCisgICAqLworCisgIC8qIFF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMgYXJlIGNhcnJpZWQgZm9yd2FyZCBhY3Jvc3MgaW5wdXQKKyAgICogZGF0YXN0cmVhbXMgd2hlbiBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMuCisgICAqLworCisgIEpRVUFOVF9UQkwgKiBxdWFudF90YmxfcHRyc1tOVU1fUVVBTlRfVEJMU107CisgIC8qIHB0cnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLworCisgIEpIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CisgIEpIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU107CisgIC8qIHB0cnMgdG8gSHVmZm1hbiBjb2RpbmcgdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCisKKyAgLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgbmV2ZXIgY2FycmllZCBhY3Jvc3MgZGF0YXN0cmVhbXMsIHNpbmNlIHRoZXkKKyAgICogYXJlIGdpdmVuIGluIFNPRi9TT1MgbWFya2VycyBvciBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSS4KKyAgICovCisKKyAgaW50IGRhdGFfcHJlY2lzaW9uOwkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gaW1hZ2UgZGF0YSAqLworCisgIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87CisgIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLworCisgIGJvb2xlYW4gdGlsZV9kZWNvZGU7ICAgICAgICAgLyogVFJVRSBpZiB1c2luZyB0aWxlIGJhc2VkIGRlY29kaW5nICovCisgIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBTT0ZuIHNwZWNpZmllcyBwcm9ncmVzc2l2ZSBtb2RlICovCisgIGJvb2xlYW4gYXJpdGhfY29kZTsJCS8qIFRSVUU9YXJpdGhtZXRpYyBjb2RpbmcsIEZBTFNFPUh1ZmZtYW4gKi8KKworICBVSU5UOCBhcml0aF9kY19MW05VTV9BUklUSF9UQkxTXTsgLyogTCB2YWx1ZXMgZm9yIERDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKyAgVUlOVDggYXJpdGhfZGNfVVtOVU1fQVJJVEhfVEJMU107IC8qIFUgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCisgIFVJTlQ4IGFyaXRoX2FjX0tbTlVNX0FSSVRIX1RCTFNdOyAvKiBLeCB2YWx1ZXMgZm9yIEFDIGFyaXRoLWNvZGluZyB0YWJsZXMgKi8KKworICB1bnNpZ25lZCBpbnQgcmVzdGFydF9pbnRlcnZhbDsgLyogTUNVcyBwZXIgcmVzdGFydCBpbnRlcnZhbCwgb3IgMCBmb3Igbm8gcmVzdGFydCAqLworCisgIC8qIFRoZXNlIGZpZWxkcyByZWNvcmQgZGF0YSBvYnRhaW5lZCBmcm9tIG9wdGlvbmFsIG1hcmtlcnMgcmVjb2duaXplZCBieQorICAgKiB0aGUgSlBFRyBsaWJyYXJ5LgorICAgKi8KKyAgYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXI7CS8qIFRSVUUgaWZmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgZm91bmQgKi8KKyAgLyogRGF0YSBjb3BpZWQgZnJvbSBKRklGIG1hcmtlcjsgb25seSB2YWxpZCBpZiBzYXdfSkZJRl9tYXJrZXIgaXMgVFJVRTogKi8KKyAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBKRklGIHZlcnNpb24gbnVtYmVyICovCisgIFVJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbjsKKyAgVUlOVDggZGVuc2l0eV91bml0OwkJLyogSkZJRiBjb2RlIGZvciBwaXhlbCBzaXplIHVuaXRzICovCisgIFVJTlQxNiBYX2RlbnNpdHk7CQkvKiBIb3Jpem9udGFsIHBpeGVsIGRlbnNpdHkgKi8KKyAgVUlOVDE2IFlfZGVuc2l0eTsJCS8qIFZlcnRpY2FsIHBpeGVsIGRlbnNpdHkgKi8KKyAgYm9vbGVhbiBzYXdfQWRvYmVfbWFya2VyOwkvKiBUUlVFIGlmZiBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgd2FzIGZvdW5kICovCisgIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybTsJLyogQ29sb3IgdHJhbnNmb3JtIGNvZGUgZnJvbSBBZG9iZSBtYXJrZXIgKi8KKworICBib29sZWFuIENDSVI2MDFfc2FtcGxpbmc7CS8qIFRSVUU9Zmlyc3Qgc2FtcGxlcyBhcmUgY29zaXRlZCAqLworCisgIC8qIEFzaWRlIGZyb20gdGhlIHNwZWNpZmljIGRhdGEgcmV0YWluZWQgZnJvbSBBUFBuIG1hcmtlcnMga25vd24gdG8gdGhlCisgICAqIGxpYnJhcnksIHRoZSB1bmludGVycHJldGVkIGNvbnRlbnRzIG9mIGFueSBvciBhbGwgQVBQbiBhbmQgQ09NIG1hcmtlcnMKKyAgICogY2FuIGJlIHNhdmVkIGluIGEgbGlzdCBmb3IgZXhhbWluYXRpb24gYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgKi8KKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcl9saXN0OyAvKiBIZWFkIG9mIGxpc3Qgb2Ygc2F2ZWQgbWFya2VycyAqLworCisgIC8qIFJlbWFpbmluZyBmaWVsZHMgYXJlIGtub3duIHRocm91Z2hvdXQgZGVjb21wcmVzc29yLCBidXQgZ2VuZXJhbGx5CisgICAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICAgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIGNvbXB1dGVkIGR1cmluZyBkZWNvbXByZXNzaW9uIHN0YXJ0dXAKKyAgICovCisgIGludCBtYXhfaF9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCBoX3NhbXBfZmFjdG9yICovCisgIGludCBtYXhfdl9zYW1wX2ZhY3RvcjsJLyogbGFyZ2VzdCB2X3NhbXBfZmFjdG9yICovCisKKyAgaW50IG1pbl9EQ1Rfc2NhbGVkX3NpemU7CS8qIHNtYWxsZXN0IERDVF9zY2FsZWRfc2l6ZSBvZiBhbnkgY29tcG9uZW50ICovCisKKyAgSkRJTUVOU0lPTiB0b3RhbF9pTUNVX3Jvd3M7CS8qICMgb2YgaU1DVSByb3dzIGluIGltYWdlICovCisgIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgaW5wdXQgYW5kIG91dHB1dCBwcm9ncmVzcyBpcyBtZWFzdXJlZCBpbgorICAgKiB1bml0cyBvZiAiaU1DVSIgKGludGVybGVhdmVkIE1DVSkgcm93cy4gIFRoZXNlIGFyZSB0aGUgc2FtZSBhcyBNQ1Ugcm93cworICAgKiBpbiBmdWxseSBpbnRlcmxlYXZlZCBKUEVHIHNjYW5zLCBidXQgYXJlIHVzZWQgd2hldGhlciB0aGUgc2NhbiBpcworICAgKiBpbnRlcmxlYXZlZCBvciBub3QuICBXZSBkZWZpbmUgYW4gaU1DVSByb3cgYXMgdl9zYW1wX2ZhY3RvciBEQ1QgYmxvY2sKKyAgICogcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZXJlZm9yZSwgdGhlIElEQ1Qgb3V0cHV0IGNvbnRhaW5zCisgICAqIHZfc2FtcF9mYWN0b3IqRENUX3NjYWxlZF9zaXplIHNhbXBsZSByb3dzIG9mIGEgY29tcG9uZW50IHBlciBpTUNVIHJvdy4KKyAgICovCisKKyAgSlNBTVBMRSAqIHNhbXBsZV9yYW5nZV9saW1pdDsgLyogdGFibGUgZm9yIGZhc3QgcmFuZ2UtbGltaXRpbmcgKi8KKworICAvKgorICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCisgICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgorICAgKiBOb3RlIHRoYXQgdGhlIGRlY29tcHJlc3NvciBvdXRwdXQgc2lkZSBtdXN0IG5vdCB1c2UgdGhlc2UgZmllbGRzLgorICAgKi8KKyAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KKyAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOworICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLworCisgIEpESU1FTlNJT04gTUNVc19wZXJfcm93OwkvKiAjIG9mIE1DVXMgYWNyb3NzIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIE1DVV9yb3dzX2luX3NjYW47CS8qICMgb2YgTUNVIHJvd3MgaW4gdGhlIGltYWdlICovCisKKyAgaW50IGJsb2Nrc19pbl9NQ1U7CQkvKiAjIG9mIERDVCBibG9ja3MgcGVyIE1DVSAqLworICBpbnQgTUNVX21lbWJlcnNoaXBbRF9NQVhfQkxPQ0tTX0lOX01DVV07CisgIC8qIE1DVV9tZW1iZXJzaGlwW2ldIGlzIGluZGV4IGluIGN1cl9jb21wX2luZm8gb2YgY29tcG9uZW50IG93bmluZyAqLworICAvKiBpJ3RoIGJsb2NrIGluIGFuIE1DVSAqLworCisgIGludCBTcywgU2UsIEFoLCBBbDsJCS8qIHByb2dyZXNzaXZlIEpQRUcgcGFyYW1ldGVycyBmb3Igc2NhbiAqLworCisgIC8qIFRoaXMgZmllbGQgaXMgc2hhcmVkIGJldHdlZW4gZW50cm9weSBkZWNvZGVyIGFuZCBtYXJrZXIgcGFyc2VyLgorICAgKiBJdCBpcyBlaXRoZXIgemVybyBvciB0aGUgY29kZSBvZiBhIEpQRUcgbWFya2VyIHRoYXQgaGFzIGJlZW4KKyAgICogcmVhZCBmcm9tIHRoZSBkYXRhIHNvdXJjZSwgYnV0IGhhcyBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLgorICAgKi8KKyAgaW50IHVucmVhZF9tYXJrZXI7CisKKyAgLyoKKyAgICogTGlua3MgdG8gZGVjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzLCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQorICAgKi8KKyAgc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciAqIG1hc3RlcjsKKyAgc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgKiBtYWluOworICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciAqIGNvZWY7CisgIHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICogcG9zdDsKKyAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciAqIGlucHV0Y3RsOworICBzdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyICogbWFya2VyOworICBzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKiBlbnRyb3B5OworICBzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqIGlkY3Q7CisgIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciAqIHVwc2FtcGxlOworICBzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciAqIGNjb252ZXJ0OworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBjcXVhbnRpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLy8gfC0tLSBieXRlX29mZnNldCAtLS18LSBiaXRfbGVmdCAtfAorICAvLyAgXC0tLS0tLSAyNyAtLS0tLS0tLyBcLS0tLSA1IC0tLS0vCisgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fb2Zmc2V0OworICBzaG9ydCBwcmV2X2RjWzNdOworCisgIC8vIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTgorICB1bnNpZ25lZCBzaG9ydCBFT0JSVU47CisKKyAgLy8gc2F2ZSB0aGUgZGVjb2RlciBjdXJyZW50IGJpdCBidWZmZXIsIGVudHJvcHktPmJpdHN0YXRlLmdldF9idWZmZXIuCisgIElOVDMyIGdldF9idWZmZXI7CisKKyAgLy8gc2F2ZSB0aGUgcmVzdGFydCBpbmZvLgorICB1bnNpZ25lZCBzaG9ydCByZXN0YXJ0c190b19nbzsKKyAgdW5zaWduZWQgY2hhciBuZXh0X3Jlc3RhcnRfbnVtOworfSBodWZmbWFuX29mZnNldF9kYXRhOworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLy8gVGhlIGhlYWRlciBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGlzIHNjYW4KKyAgdW5zaWduZWQgaW50IGJpdHN0cmVhbV9vZmZzZXQ7CisKKyAgLy8gTnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuCisgIGludCBjb21wc19pbl9zY2FuOworCisgIC8vIE51bWJlciBvZiBNQ1VzIGluIGVhY2ggcm93CisgIGludCBNQ1VzX3Blcl9yb3c7CisgIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CisKKyAgLy8gVGhlIGxhc3QgTUNVIHBvc2l0aW9uIGFuZCBpdHMgZGMgdmFsdWUgaW4gdGhpcyBzY2FuCisgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgcHJldl9NQ1Vfb2Zmc2V0OworCisgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKipvZmZzZXQ7Cit9IGh1ZmZtYW5fc2Nhbl9oZWFkZXI7CisKKyNkZWZpbmUgREVGQVVMVF9NQ1VfU0FNUExFX1NJWkUgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgIC8vIFRoZSBudW1iZXIgb2YgTUNVcyB0aGF0IHdlIHNhbXBsZSBlYWNoIHRpbWUgYXMgYW4gaW5kZXggcG9pbnQKKyAgaW50IE1DVV9zYW1wbGVfc2l6ZTsKKworICAvLyBOdW1iZXIgb2Ygc2NhbiBpbiB0aGlzIGltYWdlCisgIGludCBzY2FuX2NvdW50OworCisgIC8vIE51bWJlciBvZiBpTUNVcyByb3dzIGluIHRoaXMgaW1hZ2UKKyAgaW50IHRvdGFsX2lNQ1Vfcm93czsKKworICAvLyBNZW1vcnkgdXNlZCBieSBzY2FuIHN0cnVjdAorICBzaXplX3QgbWVtX3VzZWQ7CisgIGh1ZmZtYW5fc2Nhbl9oZWFkZXIgKnNjYW47Cit9IGh1ZmZtYW5faW5kZXg7CisKKy8qICJPYmplY3QiIGRlY2xhcmF0aW9ucyBmb3IgSlBFRyBtb2R1bGVzIHRoYXQgbWF5IGJlIHN1cHBsaWVkIG9yIGNhbGxlZAorICogZGlyZWN0bHkgYnkgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorICogQXMgd2l0aCBhbGwgb2JqZWN0cyBpbiB0aGUgSlBFRyBsaWJyYXJ5LCB0aGVzZSBzdHJ1Y3RzIG9ubHkgZGVmaW5lIHRoZQorICogcHVibGljbHkgdmlzaWJsZSBtZXRob2RzIGFuZCBzdGF0ZSB2YXJpYWJsZXMgb2YgYSBtb2R1bGUuICBBZGRpdGlvbmFsCisgKiBwcml2YXRlIGZpZWxkcyBtYXkgZXhpc3QgYWZ0ZXIgdGhlIHB1YmxpYyBvbmVzLgorICovCisKKworLyogRXJyb3IgaGFuZGxlciBvYmplY3QgKi8KKworc3RydWN0IGpwZWdfZXJyb3JfbWdyIHsKKyAgLyogRXJyb3IgZXhpdCBoYW5kbGVyOiBkb2VzIG5vdCByZXR1cm4gdG8gY2FsbGVyICovCisgIEpNRVRIT0Qodm9pZCwgZXJyb3JfZXhpdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOworICAvKiBDb25kaXRpb25hbGx5IGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCBlbWl0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBtc2dfbGV2ZWwpKTsKKyAgLyogUm91dGluZSB0aGF0IGFjdHVhbGx5IG91dHB1dHMgYSB0cmFjZSBvciBlcnJvciBtZXNzYWdlICovCisgIEpNRVRIT0Qodm9pZCwgb3V0cHV0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKyAgLyogRm9ybWF0IGEgbWVzc2FnZSBzdHJpbmcgZm9yIHRoZSBtb3N0IHJlY2VudCBKUEVHIGVycm9yIG9yIG1lc3NhZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCBmb3JtYXRfbWVzc2FnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikpOworI2RlZmluZSBKTVNHX0xFTkdUSF9NQVggIDIwMAkvKiByZWNvbW1lbmRlZCBzaXplIG9mIGZvcm1hdF9tZXNzYWdlIGJ1ZmZlciAqLworICAvKiBSZXNldCBlcnJvciBzdGF0ZSB2YXJpYWJsZXMgYXQgc3RhcnQgb2YgYSBuZXcgaW1hZ2UgKi8KKyAgSk1FVEhPRCh2b2lkLCByZXNldF9lcnJvcl9tZ3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICAvKiBUaGUgbWVzc2FnZSBJRCBjb2RlIGFuZCBhbnkgcGFyYW1ldGVycyBhcmUgc2F2ZWQgaGVyZS4KKyAgICogQSBtZXNzYWdlIGNhbiBoYXZlIG9uZSBzdHJpbmcgcGFyYW1ldGVyIG9yIHVwIHRvIDggaW50IHBhcmFtZXRlcnMuCisgICAqLworICBpbnQgbXNnX2NvZGU7CisjZGVmaW5lIEpNU0dfU1RSX1BBUk1fTUFYICA4MAorICB1bmlvbiB7CisgICAgaW50IGlbOF07CisgICAgY2hhciBzW0pNU0dfU1RSX1BBUk1fTUFYXTsKKyAgfSBtc2dfcGFybTsKKworICAvKiBTdGFuZGFyZCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGVycm9yIGZhY2lsaXR5ICovCisKKyAgaW50IHRyYWNlX2xldmVsOwkJLyogbWF4IG1zZ19sZXZlbCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkICovCisKKyAgLyogRm9yIHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSBlcnJvcnMsIHdlIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UsCisgICAqIGJ1dCBrZWVwIGdvaW5nIHVubGVzcyBlbWl0X21lc3NhZ2UgY2hvb3NlcyB0byBhYm9ydC4gIGVtaXRfbWVzc2FnZQorICAgKiBzaG91bGQgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uCisgICAqIGNhbiBjaGVjayBmb3IgYmFkIGRhdGEgYnkgc2VlaW5nIGlmIG51bV93YXJuaW5ncyBpcyBub256ZXJvIGF0IHRoZQorICAgKiBlbmQgb2YgcHJvY2Vzc2luZy4KKyAgICovCisgIGxvbmcgbnVtX3dhcm5pbmdzOwkJLyogbnVtYmVyIG9mIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncyAqLworCisgIC8qIFRoZXNlIGZpZWxkcyBwb2ludCB0byB0aGUgdGFibGUocykgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLgorICAgKiBBbiBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoZSB0YWJsZSBwb2ludGVyIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudAorICAgKiBtZXNzYWdlIGxpc3QgKHR5cGljYWxseSwgdG8gY2hhbmdlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCBlcnJvcnMgYXJlCisgICAqIHJlcG9ydGVkKS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIGNvZGVzCisgICAqIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkgZXJyb3IgbWVjaGFuaXNtOyB0aGUgc2Vjb25kCisgICAqIHRhYmxlIHBvaW50ZXIgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgorICAgKgorICAgKiBGaXJzdCB0YWJsZSBpbmNsdWRlcyBhbGwgZXJyb3JzIGdlbmVyYXRlZCBieSBKUEVHIGxpYnJhcnkgaXRzZWxmLgorICAgKiBFcnJvciBjb2RlIDAgaXMgcmVzZXJ2ZWQgZm9yIGEgIm5vIHN1Y2ggZXJyb3Igc3RyaW5nIiBtZXNzYWdlLgorICAgKi8KKyAgY29uc3QgY2hhciAqIGNvbnN0ICoganBlZ19tZXNzYWdlX3RhYmxlOyAvKiBMaWJyYXJ5IGVycm9ycyAqLworICBpbnQgbGFzdF9qcGVnX21lc3NhZ2U7ICAgIC8qIFRhYmxlIGNvbnRhaW5zIHN0cmluZ3MgMC4ubGFzdF9qcGVnX21lc3NhZ2UgKi8KKyAgLyogU2Vjb25kIHRhYmxlIGNhbiBiZSBhZGRlZCBieSBhcHBsaWNhdGlvbiAoc2VlIGNqcGVnL2RqcGVnIGZvciBleGFtcGxlKS4KKyAgICogSXQgY29udGFpbnMgc3RyaW5ncyBudW1iZXJlZCBmaXJzdF9hZGRvbl9tZXNzYWdlLi5sYXN0X2FkZG9uX21lc3NhZ2UuCisgICAqLworICBjb25zdCBjaGFyICogY29uc3QgKiBhZGRvbl9tZXNzYWdlX3RhYmxlOyAvKiBOb24tbGlicmFyeSBlcnJvcnMgKi8KKyAgaW50IGZpcnN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGZpcnN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworICBpbnQgbGFzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBsYXN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLworfTsKKworCisvKiBQcm9ncmVzcyBtb25pdG9yIG9iamVjdCAqLworCitzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgeworICBKTUVUSE9EKHZvaWQsIHByb2dyZXNzX21vbml0b3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICBsb25nIHBhc3NfY291bnRlcjsJCS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLworICBsb25nIHBhc3NfbGltaXQ7CQkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KKyAgaW50IGNvbXBsZXRlZF9wYXNzZXM7CQkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLworICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLworfTsKKworCisvKiBEYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgY29tcHJlc3Npb24gKi8KKworc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLworICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCisgIEpNRVRIT0Qodm9pZCwgaW5pdF9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgZW1wdHlfb3V0cHV0X2J1ZmZlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisgIEpNRVRIT0Qodm9pZCwgdGVybV9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Cit9OworCisKKy8qIERhdGEgc291cmNlIG9iamVjdCBmb3IgZGVjb21wcmVzc2lvbiAqLworCitzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHsKKyAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLworICBjb25zdCBKT0NURVQgKiBzdGFydF9pbnB1dF9ieXRlOyAvKiA9PiBmaXJzdCBieXRlIHRvIHJlYWQgZnJvbSBpbnB1dCAqLworICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KKyAgc2l6ZV90IGN1cnJlbnRfb2Zmc2V0OyAvKiBjdXJyZW50IHJlYWRlZCBpbnB1dCBvZmZzZXQgKi8KKworICBKTUVUSE9EKHZvaWQsIGluaXRfc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIGZpbGxfaW5wdXRfYnVmZmVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKHZvaWQsIHNraXBfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKSk7CisgIEpNRVRIT0QoYm9vbGVhbiwgcmVzeW5jX3RvX3Jlc3RhcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkpOworICBKTUVUSE9EKHZvaWQsIHRlcm1fc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworICBKTUVUSE9EKGJvb2xlYW4sIHNlZWtfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgYnl0ZV9vZmZzZXQpKTsKK307CisKKworLyogTWVtb3J5IG1hbmFnZXIgb2JqZWN0LgorICogQWxsb2NhdGVzICJzbWFsbCIgb2JqZWN0cyAoYSBmZXcgSyB0b3RhbCksICJsYXJnZSIgb2JqZWN0cyAodGVucyBvZiBLKSwKKyAqIGFuZCAicmVhbGx5IGJpZyIgb2JqZWN0cyAodmlydHVhbCBhcnJheXMgd2l0aCBiYWNraW5nIHN0b3JlIGlmIG5lZWRlZCkuCisgKiBUaGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QgYWxsb3cgaW5kaXZpZHVhbCBvYmplY3RzIHRvIGJlIGZyZWVkOyByYXRoZXIsCisgKiBlYWNoIGNyZWF0ZWQgb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGEgcG9vbCwgYW5kIHdob2xlIHBvb2xzIGNhbiBiZSBmcmVlZAorICogYXQgb25jZS4gIFRoaXMgaXMgZmFzdGVyIGFuZCBtb3JlIGNvbnZlbmllbnQgdGhhbiByZW1lbWJlcmluZyBleGFjdGx5IHdoYXQKKyAqIHRvIGZyZWUsIGVzcGVjaWFsbHkgd2hlcmUgbWFsbG9jKCkvZnJlZSgpIGFyZSBub3QgdG9vIHNwZWVkeS4KKyAqIE5COiBhbGxvYyByb3V0aW5lcyBuZXZlciByZXR1cm4gTlVMTC4gIFRoZXkgZXhpdCB0byBlcnJvcl9leGl0IGlmIG5vdAorICogc3VjY2Vzc2Z1bC4KKyAqLworCisjZGVmaW5lIEpQT09MX1BFUk1BTkVOVAkwCS8qIGxhc3RzIHVudGlsIG1hc3RlciByZWNvcmQgaXMgZGVzdHJveWVkICovCisjZGVmaW5lIEpQT09MX0lNQUdFCTEJLyogbGFzdHMgdW50aWwgZG9uZSB3aXRoIGltYWdlL2RhdGFzdHJlYW0gKi8KKyNkZWZpbmUgSlBPT0xfTlVNUE9PTFMJMgorCit0eXBlZGVmIHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCAqIGp2aXJ0X3NhcnJheV9wdHI7Cit0eXBlZGVmIHN0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCAqIGp2aXJ0X2JhcnJheV9wdHI7CisKKworc3RydWN0IGpwZWdfbWVtb3J5X21nciB7CisgIC8qIE1ldGhvZCBwb2ludGVycyAqLworICBKTUVUSE9EKHZvaWQgKiwgYWxsb2Nfc21hbGwsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCXNpemVfdCBzaXplb2ZvYmplY3QpKTsKKyAgSk1FVEhPRCh2b2lkIEZBUiAqLCBhbGxvY19sYXJnZSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCisJCQkJICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7CisgIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWxsb2Nfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKKwkJCQkgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKKwkJCQkgICAgIEpESU1FTlNJT04gbnVtcm93cykpOworICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhbGxvY19iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAorCQkJCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LAorCQkJCSAgICAgIEpESU1FTlNJT04gbnVtcm93cykpOworICBKTUVUSE9EKGp2aXJ0X3NhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCisJCQkJCQkgIGludCBwb29sX2lkLAorCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAorCQkJCQkJICBKRElNRU5TSU9OIHNhbXBsZXNwZXJyb3csCisJCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKKwkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKKyAgSk1FVEhPRChqdmlydF9iYXJyYXlfcHRyLCByZXF1ZXN0X3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkJICBpbnQgcG9vbF9pZCwKKwkJCQkJCSAgYm9vbGVhbiBwcmVfemVybywKKwkJCQkJCSAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCisJCQkJCQkgIEpESU1FTlNJT04gbnVtcm93cywKKwkJCQkJCSAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpKTsKKyAgSk1FVEhPRCh2b2lkLCByZWFsaXplX3ZpcnRfYXJyYXlzLCAoal9jb21tb25fcHRyIGNpbmZvKSk7CisgIEpNRVRIT0QoSlNBTVBBUlJBWSwgYWNjZXNzX3ZpcnRfc2FycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgICBqdmlydF9zYXJyYXlfcHRyIHB0ciwKKwkJCQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csCisJCQkJCSAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCQkJCSAgIGJvb2xlYW4gd3JpdGFibGUpKTsKKyAgSk1FVEhPRChKQkxPQ0tBUlJBWSwgYWNjZXNzX3ZpcnRfYmFycmF5LCAoal9jb21tb25fcHRyIGNpbmZvLAorCQkJCQkgICAganZpcnRfYmFycmF5X3B0ciBwdHIsCisJCQkJCSAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKKwkJCQkJICAgIEpESU1FTlNJT04gbnVtX3Jvd3MsCisJCQkJCSAgICBib29sZWFuIHdyaXRhYmxlKSk7CisgIEpNRVRIT0Qodm9pZCwgZnJlZV9wb29sLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkpOworICBKTUVUSE9EKHZvaWQsIHNlbGZfZGVzdHJ1Y3QsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworICAvKiBMaW1pdCBvbiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhpcyBKUEVHIG9iamVjdC4gIChOb3RlIHRoYXQgdGhpcyBpcworICAgKiBtZXJlbHkgYWR2aXNvcnksIG5vdCBhIGd1YXJhbnRlZWQgbWF4aW11bTsgaXQgb25seSBhZmZlY3RzIHRoZSBzcGFjZQorICAgKiB1c2VkIGZvciB2aXJ0dWFsLWFycmF5IGJ1ZmZlcnMuKSAgTWF5IGJlIGNoYW5nZWQgYnkgb3V0ZXIgYXBwbGljYXRpb24KKyAgICogYWZ0ZXIgY3JlYXRpbmcgdGhlIEpQRUcgb2JqZWN0LgorICAgKi8KKyAgbG9uZyBtYXhfbWVtb3J5X3RvX3VzZTsKKworICAvKiBNYXhpbXVtIGFsbG9jYXRpb24gcmVxdWVzdCBhY2NlcHRlZCBieSBhbGxvY19sYXJnZS4gKi8KKyAgbG9uZyBtYXhfYWxsb2NfY2h1bms7Cit9OworCisKKy8qIFJvdXRpbmUgc2lnbmF0dXJlIGZvciBhcHBsaWNhdGlvbi1zdXBwbGllZCBtYXJrZXIgcHJvY2Vzc2luZyBtZXRob2RzLgorICogTmVlZCBub3QgcGFzcyBtYXJrZXIgY29kZSBzaW5jZSBpdCBpcyBzdG9yZWQgaW4gY2luZm8tPnVucmVhZF9tYXJrZXIuCisgKi8KK3R5cGVkZWYgSk1FVEhPRChib29sZWFuLCBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisKKy8qIERlY2xhcmF0aW9ucyBmb3Igcm91dGluZXMgY2FsbGVkIGJ5IGFwcGxpY2F0aW9uLgorICogVGhlIEpQUCBtYWNybyBoaWRlcyBwcm90b3R5cGUgcGFyYW1ldGVycyBmcm9tIGNvbXBpbGVycyB0aGF0IGNhbid0IGNvcGUuCisgKiBOb3RlIEpQUCByZXF1aXJlcyBkb3VibGUgcGFyZW50aGVzZXMuCisgKi8KKworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBKUFAoYXJnbGlzdCkJYXJnbGlzdAorI2Vsc2UKKyNkZWZpbmUgSlBQKGFyZ2xpc3QpCSgpCisjZW5kaWYKKworCisvKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4KKyAqIFdlIHNob3J0ZW4gZXh0ZXJuYWwgbmFtZXMgdG8gYmUgdW5pcXVlIGluIHRoZSBmaXJzdCBzaXggbGV0dGVycywgd2hpY2gKKyAqIGlzIGdvb2QgZW5vdWdoIGZvciBhbGwga25vd24gc3lzdGVtcy4KKyAqIChJZiB5b3VyIGNvbXBpbGVyIGl0c2VsZiBuZWVkcyBuYW1lcyB0byBiZSB1bmlxdWUgaW4gbGVzcyB0aGFuIDE1CisgKiBjaGFyYWN0ZXJzLCB5b3UgYXJlIG91dCBvZiBsdWNrLiAgR2V0IGEgYmV0dGVyIGNvbXBpbGVyLikKKyAqLworCisjaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUworI2RlZmluZSBqcGVnX3N0ZF9lcnJvcgkJalN0ZEVycm9yCisjZGVmaW5lIGpwZWdfQ3JlYXRlQ29tcHJlc3MJakNyZWFDb21wcmVzcworI2RlZmluZSBqcGVnX0NyZWF0ZURlY29tcHJlc3MJakNyZWFEZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfZGVzdHJveV9jb21wcmVzcwlqRGVzdENvbXByZXNzCisjZGVmaW5lIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzCWpEZXN0RGVjb21wcmVzcworI2RlZmluZSBqcGVnX3N0ZGlvX2Rlc3QJCWpTdGREZXN0CisjZGVmaW5lIGpwZWdfc3RkaW9fc3JjCQlqU3RkU3JjCisjZGVmaW5lIGpwZWdfc2V0X2RlZmF1bHRzCWpTZXREZWZhdWx0cworI2RlZmluZSBqcGVnX3NldF9jb2xvcnNwYWNlCWpTZXRDb2xvcnNwYWNlCisjZGVmaW5lIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlCWpEZWZDb2xvcnNwYWNlCisjZGVmaW5lIGpwZWdfc2V0X3F1YWxpdHkJalNldFF1YWxpdHkKKyNkZWZpbmUganBlZ19zZXRfbGluZWFyX3F1YWxpdHkJalNldExRdWFsaXR5CisjZGVmaW5lIGpwZWdfYWRkX3F1YW50X3RhYmxlCWpBZGRRdWFudFRhYmxlCisjZGVmaW5lIGpwZWdfcXVhbGl0eV9zY2FsaW5nCWpRdWFsaXR5U2NhbGluZworI2RlZmluZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbglqU2ltUHJvZ3Jlc3MKKyNkZWZpbmUganBlZ19zdXBwcmVzc190YWJsZXMJalN1cHByZXNzVGFibGVzCisjZGVmaW5lIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUJakFsY1FUYWJsZQorI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUJakFsY0hUYWJsZQorI2RlZmluZSBqcGVnX3N0YXJ0X2NvbXByZXNzCWpTdHJ0Q29tcHJlc3MKKyNkZWZpbmUganBlZ193cml0ZV9zY2FubGluZXMJaldydFNjYW5saW5lcworI2RlZmluZSBqcGVnX2ZpbmlzaF9jb21wcmVzcwlqRmluQ29tcHJlc3MKKyNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YQlqV3J0UmF3RGF0YQorI2RlZmluZSBqcGVnX3dyaXRlX21hcmtlcglqV3J0TWFya2VyCisjZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIJaldydE1IZWFkZXIKKyNkZWZpbmUganBlZ193cml0ZV9tX2J5dGUJaldydE1CeXRlCisjZGVmaW5lIGpwZWdfd3JpdGVfdGFibGVzCWpXcnRUYWJsZXMKKyNkZWZpbmUganBlZ19yZWFkX2hlYWRlcglqUmVhZEhlYWRlcgorI2RlZmluZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MJalN0cnREZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfcmVhZF9zY2FubGluZXMJalJlYWRTY2FubGluZXMKKyNkZWZpbmUganBlZ19maW5pc2hfZGVjb21wcmVzcwlqRmluRGVjb21wcmVzcworI2RlZmluZSBqcGVnX3JlYWRfcmF3X2RhdGEJalJlYWRSYXdEYXRhCisjZGVmaW5lIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zCWpIYXNNdWx0U2NuCisjZGVmaW5lIGpwZWdfc3RhcnRfb3V0cHV0CWpTdHJ0T3V0cHV0CisjZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dAlqRmluT3V0cHV0CisjZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUJakluQ29tcGxldGUKKyNkZWZpbmUganBlZ19uZXdfY29sb3JtYXAJak5ld0NNYXAKKyNkZWZpbmUganBlZ19jb25zdW1lX2lucHV0CWpDb25zdW1lSW5wdXQKKyNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zCWpDYWxjRGltZW5zaW9ucworI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycwlqU2F2ZU1hcmtlcnMKKyNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcglqU2V0TWFya2VyCisjZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMJalJlYWRDb2VmcworI2RlZmluZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cwlqV3J0Q29lZnMKKyNkZWZpbmUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMJakNvcHlDcml0CisjZGVmaW5lIGpwZWdfYWJvcnRfY29tcHJlc3MJakFicnRDb21wcmVzcworI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MJakFicnREZWNvbXByZXNzCisjZGVmaW5lIGpwZWdfYWJvcnQJCWpBYm9ydAorI2RlZmluZSBqcGVnX2Rlc3Ryb3kJCWpEZXN0cm95CisjZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQJalJlc3luY1Jlc3RhcnQKKyNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCisKKworLyogRGVmYXVsdCBlcnJvci1tYW5hZ2VtZW50IHNldHVwICovCitFWFRFUk4oc3RydWN0IGpwZWdfZXJyb3JfbWdyICopIGpwZWdfc3RkX2Vycm9yCisJSlBQKChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpKTsKKworLyogSW5pdGlhbGl6YXRpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzLgorICoganBlZ19jcmVhdGVfY29tcHJlc3MoKSBhbmQganBlZ19jcmVhdGVfZGVjb21wcmVzcygpIGFyZSB0aGUgZXhwb3J0ZWQKKyAqIG5hbWVzIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBjYWxsLiAgVGhlc2UgZXhwYW5kIHRvIGNhbGxzIG9uCisgKiBqcGVnX0NyZWF0ZUNvbXByZXNzIGFuZCBqcGVnX0NyZWF0ZURlY29tcHJlc3Mgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiBwYXNzZWQgZm9yIHZlcnNpb24gbWlzbWF0Y2ggY2hlY2tpbmcuCisgKiBOQjogeW91IG11c3Qgc2V0IHVwIHRoZSBlcnJvci1tYW5hZ2VyIEJFRk9SRSBjYWxsaW5nIGpwZWdfY3JlYXRlX3h4eC4KKyAqLworI2RlZmluZSBqcGVnX2NyZWF0ZV9jb21wcmVzcyhjaW5mbykgXAorICAgIGpwZWdfQ3JlYXRlQ29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAorCQkJKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCisjZGVmaW5lIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pIFwKKyAgICBqcGVnX0NyZWF0ZURlY29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAorCQkJICAoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKQorRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlQ29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZURlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQlpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKKy8qIERlc3RydWN0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cyAqLworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFN0YW5kYXJkIGRhdGEgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtYW5hZ2Vyczogc3RkaW8gc3RyZWFtcy4gKi8KKy8qIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igb3BlbmluZyB0aGUgZmlsZSBiZWZvcmUgYW5kIGNsb3NpbmcgYWZ0ZXIuICovCitFWFRFUk4odm9pZCkganBlZ19zdGRpb19kZXN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBvdXRmaWxlKSk7CitFWFRFUk4odm9pZCkganBlZ19zdGRpb19zcmMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKSk7CisKKy8qIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X2RlZmF1bHRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKKy8qIENvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR1cCBhaWRzICovCitFWFRFUk4odm9pZCkganBlZ19zZXRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkpOworRVhURVJOKHZvaWQpIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NldF9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LAorCQkJCSAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgIGludCBzY2FsZV9mYWN0b3IsCisJCQkJCSAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOworRVhURVJOKHZvaWQpIGpwZWdfYWRkX3F1YW50X3RhYmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCQkJICAgICAgIGludCBzY2FsZV9mYWN0b3IsCisJCQkJICAgICAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKK0VYVEVSTihpbnQpIGpwZWdfcXVhbGl0eV9zY2FsaW5nIEpQUCgoaW50IHF1YWxpdHkpKTsKK0VYVEVSTih2b2lkKSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19zdXBwcmVzc190YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkgICAgICAgYm9vbGVhbiBzdXBwcmVzcykpOworRVhURVJOKEpRVUFOVF9UQkwgKikganBlZ19hbGxvY19xdWFudF90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKEpIVUZGX1RCTCAqKSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKKworLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGNvbXByZXNzaW9uICovCitFWFRFUk4odm9pZCkganBlZ19zdGFydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCSAgICAgIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfc2NhbmxpbmVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCQkJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIFJlcGxhY2VzIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdoZW4gd3JpdGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KK0VYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3Jhd19kYXRhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKU0FNUElNQUdFIGRhdGEsCisJCQkJCSAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOworCisvKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLiAgU2VlIGxpYmpwZWcuZG9jIGNvbmNlcm5pbmcgc2FmZSB1c2FnZS4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21hcmtlcgorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCisJICAgICBjb25zdCBKT0NURVQgKiBkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOworLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21faGVhZGVyCisJSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21fYnl0ZQorCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKKworLyogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUgKi8KK0VYVEVSTih2b2lkKSBqcGVnX3dyaXRlX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CisKKy8qIERlY29tcHJlc3Npb24gc3RhcnR1cDogcmVhZCBzdGFydCBvZiBKUEVHIGRhdGFzdHJlYW0gdG8gc2VlIHdoYXQncyB0aGVyZSAqLworRVhURVJOKGludCkganBlZ19yZWFkX2hlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJICBib29sZWFuIHJlcXVpcmVfaW1hZ2UpKTsKKy8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCisjZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCisjZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KKyNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KKy8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKKyAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgorICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCisgKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgorICovCisKKy8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBkZWNvbXByZXNzaW9uICovCitFWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfc3RhcnRfdGlsZV9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorCQkJCQkgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCisJCQkJCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykpOworRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXNfZnJvbSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBKU0FNUEFSUkFZIHNjYW5saW5lcywKKwkJCQkJICAgIGludCBsaW5lX29mZnNldCwKKwkJCQkJICAgIEpESU1FTlNJT04gbWF4X2xpbmVzKSk7CitFWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3RpbGVfc2NhbmxpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUEFSUkFZIHNjYW5saW5lcykpOworRVhURVJOKHZvaWQpIGpwZWdfaW5pdF9yZWFkX3RpbGVfc2NhbmxpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsCisJCSAgICAgICAgICAgICAgICBpbnQgKnN0YXJ0X3gsIGludCAqc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqd2lkdGgsIGludCAqaGVpZ2h0KSk7CitFWFRFUk4oYm9vbGVhbikganBlZ19maW5pc2hfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKKworLyogUmVwbGFjZXMganBlZ19yZWFkX3NjYW5saW5lcyB3aGVuIHJlYWRpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuICovCitFWFRFUk4oSkRJTUVOU0lPTikganBlZ19yZWFkX3Jhd19kYXRhIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICAgSlNBTVBJTUFHRSBkYXRhLAorCQkJCQkgICBKRElNRU5TSU9OIG1heF9saW5lcykpOworCisvKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KK0VYVEVSTihib29sZWFuKSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX3N0YXJ0X291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgIGludCBzY2FuX251bWJlcikpOworRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX291dHB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2lucHV0X2NvbXBsZXRlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfbmV3X2NvbG9ybWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworRVhURVJOKGludCkganBlZ19jb25zdW1lX2lucHV0IEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworLyogUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogKi8KKy8qICNkZWZpbmUgSlBFR19TVVNQRU5ERUQJMCAgICBTdXNwZW5kZWQgZHVlIHRvIGxhY2sgb2YgaW5wdXQgZGF0YSAqLworI2RlZmluZSBKUEVHX1JFQUNIRURfU09TCTEgLyogUmVhY2hlZCBzdGFydCBvZiBuZXcgc2NhbiAqLworI2RlZmluZSBKUEVHX1JFQUNIRURfRU9JCTIgLyogUmVhY2hlZCBlbmQgb2YgaW1hZ2UgKi8KKyNkZWZpbmUgSlBFR19ST1dfQ09NUExFVEVECTMgLyogQ29tcGxldGVkIG9uZSBpTUNVIHJvdyAqLworI2RlZmluZSBKUEVHX1NDQU5fQ09NUExFVEVECTQgLyogQ29tcGxldGVkIGxhc3QgaU1DVSByb3cgb2YgYSBzY2FuICovCisKKy8qIFByZWNhbGN1bGF0ZSBvdXRwdXQgZGltZW5zaW9ucyBmb3IgY3VycmVudCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICovCitFWFRFUk4odm9pZCkganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBDb250cm9sIHNhdmluZyBvZiBDT00gYW5kIEFQUG4gbWFya2VycyBpbnRvIG1hcmtlcl9saXN0LiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2F2ZV9tYXJrZXJzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCisJICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoX2xpbWl0KSk7CisKKy8qIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLiAqLworRVhURVJOKHZvaWQpIGpwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXJfY29kZSwKKwkgICAgIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2Qgcm91dGluZSkpOworCisvKiBSZWFkIG9yIHdyaXRlIHJhdyBEQ1QgY29lZmZpY2llbnRzIC0tLSB1c2VmdWwgZm9yIGxvc3NsZXNzIHRyYW5zY29kaW5nLiAqLworRVhURVJOKGp2aXJ0X2JhcnJheV9wdHIgKikganBlZ19yZWFkX2NvZWZmaWNpZW50cyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKK0VYVEVSTihib29sZWFuKSBqcGVnX2J1aWxkX2h1ZmZtYW5faW5kZXgKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGh1ZmZtYW5faW5kZXggKmluZGV4KSk7CitFWFRFUk4odm9pZCkganBlZ193cml0ZV9jb2VmZmljaWVudHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKKwkJCQkJICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKK0VYVEVSTih2b2lkKSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCQkJCWpfY29tcHJlc3NfcHRyIGRzdGluZm8pKTsKKworLyogSWYgeW91IGNob29zZSB0byBhYm9ydCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGJlZm9yZSBjb21wbGV0aW5nCisgKiBqcGVnX2ZpbmlzaF8oZGUpY29tcHJlc3MsIHRoZW4geW91IG5lZWQgdG8gY2xlYW4gdXAgdG8gcmVsZWFzZSBtZW1vcnksCisgKiB0ZW1wb3JhcnkgZmlsZXMsIGV0Yy4gIFlvdSBjYW4ganVzdCBjYWxsIGpwZWdfZGVzdHJveV8oZGUpY29tcHJlc3MKKyAqIGlmIHlvdSdyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBidXQgaWYgeW91IHdhbnQgdG8gY2xlYW4gaXQgdXAgYW5kCisgKiByZXVzZSBpdCwgY2FsbCB0aGlzOgorICovCitFWFRFUk4odm9pZCkganBlZ19hYm9ydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7CitFWFRFUk4odm9pZCkganBlZ19hYm9ydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOworCisvKiBHZW5lcmljIHZlcnNpb25zIG9mIGpwZWdfYWJvcnQgYW5kIGpwZWdfZGVzdHJveSB0aGF0IHdvcmsgb24gZWl0aGVyCisgKiBmbGF2b3Igb2YgSlBFRyBvYmplY3QuICBUaGVzZSBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGluIHNvbWUgcGxhY2VzLgorICovCitFWFRFUk4odm9pZCkganBlZ19hYm9ydCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOworCisvKiBEZWZhdWx0IHJlc3RhcnQtbWFya2VyLXJlc3luYyBwcm9jZWR1cmUgZm9yIHVzZSBieSBkYXRhIHNvdXJjZSBtb2R1bGVzICovCitFWFRFUk4oYm9vbGVhbikganBlZ19yZXN5bmNfdG9fcmVzdGFydCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisJCQkJCSAgICBpbnQgZGVzaXJlZCkpOworCitFWFRFUk4odm9pZCkganBlZ19jb25maWd1cmVfaHVmZm1hbl9kZWNvZGVyKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX29mZnNldF9kYXRhIG9mZnNldCk7CitFWFRFUk4odm9pZCkganBlZ19nZXRfaHVmZm1hbl9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fb2Zmc2V0X2RhdGEgKm9mZnNldCk7CitFWFRFUk4odm9pZCkganBlZ19jcmVhdGVfaHVmZm1hbl9pbmRleChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgpOworRVhURVJOKHZvaWQpIGpwZWdfY29uZmlndXJlX2h1ZmZtYW5faW5kZXhfc2NhbihqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbl9pbmRleCAqaW5kZXgsIGludCBzY2FuX25vLCBpbnQgb2Zmc2V0KTsKK0VYVEVSTih2b2lkKSBqcGVnX2Rlc3Ryb3lfaHVmZm1hbl9pbmRleChodWZmbWFuX2luZGV4ICppbmRleCk7CisKKworLyogVGhlc2UgbWFya2VyIGNvZGVzIGFyZSBleHBvcnRlZCBzaW5jZSBhcHBsaWNhdGlvbnMgYW5kIGRhdGEgc291cmNlIG1vZHVsZXMKKyAqIGFyZSBsaWtlbHkgdG8gd2FudCB0byB1c2UgdGhlbS4KKyAqLworCisjZGVmaW5lIEpQRUdfUlNUMAkweEQwCS8qIFJTVDAgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19FT0kJMHhEOQkvKiBFT0kgbWFya2VyIGNvZGUgKi8KKyNkZWZpbmUgSlBFR19BUFAwCTB4RTAJLyogQVBQMCBtYXJrZXIgY29kZSAqLworI2RlZmluZSBKUEVHX0NPTQkweEZFCS8qIENPTSBtYXJrZXIgY29kZSAqLworCisKKy8qIElmIHdlIGhhdmUgYSBicmFpbi1kYW1hZ2VkIGNvbXBpbGVyIHRoYXQgZW1pdHMgd2FybmluZ3MgKG9yIHdvcnNlLCBlcnJvcnMpCisgKiBmb3Igc3RydWN0dXJlIGRlZmluaXRpb25zIHRoYXQgYXJlIG5ldmVyIGZpbGxlZCBpbiwga2VlcCBpdCBxdWlldCBieQorICogc3VwcGx5aW5nIGR1bW15IGRlZmluaXRpb25zIGZvciB0aGUgdmFyaW91cyBzdWJzdHJ1Y3R1cmVzLgorICovCisKKyNpZmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgorI2lmbmRlZiBKUEVHX0lOVEVSTkFMUwkJLyogd2lsbCBiZSBkZWZpbmVkIGluIGpwZWdpbnQuaCAqLworc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqdmlydF9iYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX3ByZXBfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kb3duc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19lbnRyb3B5X2VuY29kZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgeyBsb25nIGR1bW15OyB9Oworc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyIHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHsgbG9uZyBkdW1teTsgfTsKK3N0cnVjdCBqcGVnX3Vwc2FtcGxlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9kZWNvbnZlcnRlciB7IGxvbmcgZHVtbXk7IH07CitzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgeyBsb25nIGR1bW15OyB9OworI2VuZGlmIC8qIEpQRUdfSU5URVJOQUxTICovCisjZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KKworCisvKgorICogVGhlIEpQRUcgbGlicmFyeSBtb2R1bGVzIGRlZmluZSBKUEVHX0lOVEVSTkFMUyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZS4KKyAqIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zIGFyZSByZWFkIG9ubHkgd2hlbiB0aGF0IGlzIHRydWUuCisgKiBBcHBsaWNhdGlvbnMgdXNpbmcgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBpbmNsdWRlIGpwZWdpbnQuaCwgYnV0IG1heSB3aXNoCisgKiB0byBpbmNsdWRlIGplcnJvci5oLgorICovCisKKyNpZmRlZiBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImpwZWdpbnQuaCIJCS8qIGZldGNoIHByaXZhdGUgZGVjbGFyYXRpb25zICovCisjaW5jbHVkZSAiamVycm9yLmgiCQkvKiBmZXRjaCBlcnJvciBjb2RlcyB0b28gKi8KKyNlbmRpZgorCisjZW5kaWYgLyogSlBFR0xJQl9IICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvanBlZ3RyYW4uMSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcGVndHJhbi4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTE4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvanBlZ3RyYW4uMQpAQCAtMCwwICsxLDIzOCBAQAorLlRIIEpQRUdUUkFOIDEgIjMgQXVndXN0IDE5OTciCisuU0ggTkFNRQoranBlZ3RyYW4gXC0gbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gb2YgSlBFRyBmaWxlcworLlNIIFNZTk9QU0lTCisuQiBqcGVndHJhbgorWworLkkgb3B0aW9ucworXQorWworLkkgZmlsZW5hbWUKK10KKy5MUAorLlNIIERFU0NSSVBUSU9OCisuTFAKKy5CIGpwZWd0cmFuCitwZXJmb3JtcyB2YXJpb3VzIHVzZWZ1bCB0cmFuc2Zvcm1hdGlvbnMgb2YgSlBFRyBmaWxlcy4KK0l0IGNhbiB0cmFuc2xhdGUgdGhlIGNvZGVkIHJlcHJlc2VudGF0aW9uIGZyb20gb25lIHZhcmlhbnQgb2YgSlBFRyB0byBhbm90aGVyLAorZm9yIGV4YW1wbGUgZnJvbSBiYXNlbGluZSBKUEVHIHRvIHByb2dyZXNzaXZlIEpQRUcgb3IgdmljZSB2ZXJzYS4gIEl0IGNhbiBhbHNvCitwZXJmb3JtIHNvbWUgcmVhcnJhbmdlbWVudHMgb2YgdGhlIGltYWdlIGRhdGEsIGZvciBleGFtcGxlIHR1cm5pbmcgYW4gaW1hZ2UKK2Zyb20gbGFuZHNjYXBlIHRvIHBvcnRyYWl0IGZvcm1hdCBieSByb3RhdGlvbi4KKy5QUAorLkIganBlZ3RyYW4KK3dvcmtzIGJ5IHJlYXJyYW5naW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKERDVCBjb2VmZmljaWVudHMpLCB3aXRob3V0CitldmVyIGZ1bGx5IGRlY29kaW5nIHRoZSBpbWFnZS4gIFRoZXJlZm9yZSwgaXRzIHRyYW5zZm9ybWF0aW9ucyBhcmUgbG9zc2xlc3M6Cit0aGVyZSBpcyBubyBpbWFnZSBkZWdyYWRhdGlvbiBhdCBhbGwsIHdoaWNoIHdvdWxkIG5vdCBiZSB0cnVlIGlmIHlvdSB1c2VkCisuQiBkanBlZworZm9sbG93ZWQgYnkKKy5CIGNqcGVnCit0byBhY2NvbXBsaXNoIHRoZSBzYW1lIGNvbnZlcnNpb24uICBCdXQgYnkgdGhlIHNhbWUgdG9rZW4sCisuQiBqcGVndHJhbgorY2Fubm90IHBlcmZvcm0gbG9zc3kgb3BlcmF0aW9ucyBzdWNoIGFzIGNoYW5naW5nIHRoZSBpbWFnZSBxdWFsaXR5LgorLlBQCisuQiBqcGVndHJhbgorcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcworbmFtZWQsIGFuZCBwcm9kdWNlcyBhIEpQRUcvSkZJRiBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisuU0ggT1BUSU9OUworQWxsIHN3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQ7IGZvciBleGFtcGxlLAorLkIgXC1vcHRpbWl6ZQorbWF5IGJlIHdyaXR0ZW4KKy5CIFwtb3B0CitvcgorLkJSIFwtbyAuCitVcHBlciBhbmQgbG93ZXIgY2FzZSBhcmUgZXF1aXZhbGVudC4KK0JyaXRpc2ggc3BlbGxpbmdzIGFyZSBhbHNvIGFjY2VwdGVkIChlLmcuLAorLkJSIFwtb3B0aW1pc2UgKSwKK3Rob3VnaCBmb3IgYnJldml0eSB0aGVzZSBhcmUgbm90IG1lbnRpb25lZCBiZWxvdy4KKy5QUAorVG8gc3BlY2lmeSB0aGUgY29kZWQgSlBFRyByZXByZXNlbnRhdGlvbiB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSwKKy5CIGpwZWd0cmFuCithY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5CisuQlIgY2pwZWcgOgorLlRQCisuQiBcLW9wdGltaXplCitQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCisuVFAKKy5CIFwtcHJvZ3Jlc3NpdmUKK0NyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCisuVFAKKy5CSSBcLXJlc3RhcnQgIiBOIgorRW1pdCBhIEpQRUcgcmVzdGFydCBtYXJrZXIgZXZlcnkgTiBNQ1Ugcm93cywgb3IgZXZlcnkgTiBNQ1UgYmxvY2tzIGlmICJCIiBpcworYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKy5UUAorLkJJIFwtc2NhbnMgIiBmaWxlIgorVXNlIHRoZSBzY2FuIHNjcmlwdCBnaXZlbiBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmlsZS4KKy5QUAorU2VlCisuQlIgY2pwZWcgKDEpCitmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZXNlIHN3aXRjaGVzLgorSWYgeW91IHNwZWNpZnkgbm9uZSBvZiB0aGVzZSBzd2l0Y2hlcywgeW91IGdldCBhIHBsYWluIGJhc2VsaW5lLUpQRUcgb3V0cHV0CitmaWxlLiAgVGhlIHF1YWxpdHkgc2V0dGluZyBhbmQgc28gZm9ydGggYXJlIGRldGVybWluZWQgYnkgdGhlIGlucHV0IGZpbGUuCisuUFAKK1RoZSBpbWFnZSBjYW4gYmUgbG9zc2xlc3NseSB0cmFuc2Zvcm1lZCBieSBnaXZpbmcgb25lIG9mIHRoZXNlIHN3aXRjaGVzOgorLlRQCisuQiBcLWZsaXAgaG9yaXpvbnRhbAorTWlycm9yIGltYWdlIGhvcml6b250YWxseSAobGVmdC1yaWdodCkuCisuVFAKKy5CIFwtZmxpcCB2ZXJ0aWNhbAorTWlycm9yIGltYWdlIHZlcnRpY2FsbHkgKHRvcC1ib3R0b20pLgorLlRQCisuQiBcLXJvdGF0ZSA5MAorUm90YXRlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgorLlRQCisuQiBcLXJvdGF0ZSAxODAKK1JvdGF0ZSBpbWFnZSAxODAgZGVncmVlcy4KKy5UUAorLkIgXC1yb3RhdGUgMjcwCitSb3RhdGUgaW1hZ2UgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlIChvciA5MCBjY3cpLgorLlRQCisuQiBcLXRyYW5zcG9zZQorVHJhbnNwb3NlIGltYWdlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuCisuVFAKKy5CIFwtdHJhbnN2ZXJzZQorVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgKGFjcm9zcyBVUi10by1MTCBheGlzKS4KKy5QUAorVGhlIHRyYW5zcG9zZSB0cmFuc2Zvcm1hdGlvbiBoYXMgbm8gcmVzdHJpY3Rpb25zIHJlZ2FyZGluZyBpbWFnZSBkaW1lbnNpb25zLgorVGhlIG90aGVyIHRyYW5zZm9ybWF0aW9ucyBvcGVyYXRlIHJhdGhlciBvZGRseSBpZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90CithIG11bHRpcGxlIG9mIHRoZSBpTUNVIHNpemUgKHVzdWFsbHkgOCBvciAxNiBwaXhlbHMpLCBiZWNhdXNlIHRoZXkgY2FuIG9ubHkKK3RyYW5zZm9ybSBjb21wbGV0ZSBibG9ja3Mgb2YgRENUIGNvZWZmaWNpZW50IGRhdGEgaW4gdGhlIGRlc2lyZWQgd2F5LgorLlBQCisuQlIganBlZ3RyYW4gJ3MKK2RlZmF1bHQgYmVoYXZpb3Igd2hlbiB0cmFuc2Zvcm1pbmcgYW4gb2RkLXNpemUgaW1hZ2UgaXMgZGVzaWduZWQKK3RvIHByZXNlcnZlIGV4YWN0IHJldmVyc2liaWxpdHkgYW5kIG1hdGhlbWF0aWNhbCBjb25zaXN0ZW5jeSBvZiB0aGUKK3RyYW5zZm9ybWF0aW9uIHNldC4gIEFzIHN0YXRlZCwgdHJhbnNwb3NlIGlzIGFibGUgdG8gZmxpcCB0aGUgZW50aXJlIGltYWdlCithcmVhLiAgSG9yaXpvbnRhbCBtaXJyb3JpbmcgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1UgY29sdW1uIGF0IHRoZSByaWdodCBlZGdlCit1bnRvdWNoZWQsIGJ1dCBpcyBhYmxlIHRvIGZsaXAgYWxsIHJvd3Mgb2YgdGhlIGltYWdlLiAgU2ltaWxhcmx5LCB2ZXJ0aWNhbAorbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIHJvdyBhdCB0aGUgYm90dG9tIGVkZ2UgdW50b3VjaGVkLCBidXQgaXMKK2FibGUgdG8gZmxpcCBhbGwgY29sdW1ucy4gIFRoZSBvdGhlciB0cmFuc2Zvcm1zIGNhbiBiZSBidWlsdCB1cCBhcyBzZXF1ZW5jZXMKK29mIHRyYW5zcG9zZSBhbmQgZmxpcCBvcGVyYXRpb25zOyBmb3IgY29uc2lzdGVuY3ksIHRoZWlyIGFjdGlvbnMgb24gZWRnZQorcGl4ZWxzIGFyZSBkZWZpbmVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3JyZXNwb25kaW5nCit0cmFuc3Bvc2UtYW5kLWZsaXAgc2VxdWVuY2UuCisuUFAKK0ZvciBwcmFjdGljYWwgdXNlLCB5b3UgbWF5IHByZWZlciB0byBkaXNjYXJkIGFueSB1bnRyYW5zZm9ybWFibGUgZWRnZSBwaXhlbHMKK3JhdGhlciB0aGFuIGhhdmluZyBhIHN0cmFuZ2UtbG9va2luZyBzdHJpcCBhbG9uZyB0aGUgcmlnaHQgYW5kL29yIGJvdHRvbSBlZGdlcworb2YgYSB0cmFuc2Zvcm1lZCBpbWFnZS4gIFRvIGRvIHRoaXMsIGFkZCB0aGUKKy5CIFwtdHJpbQorc3dpdGNoOgorLlRQCisuQiBcLXRyaW0KK0Ryb3Agbm9uLXRyYW5zZm9ybWFibGUgZWRnZSBibG9ja3MuCisuUFAKK09idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoCisuQiBcLXRyaW0KK2lzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZworLkIganBlZ3RyYW4KK3dpdGggdGhpcyBzd2l0Y2ggaXMgbm90IGxvc3NsZXNzLiAgQWxzbywgdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbAorZXF1aXZhbGVuY2VzIGJldHdlZW4gdGhlIHRyYW5zZm9ybWF0aW9ucyBubyBsb25nZXIgaG9sZC4gIEZvciBleGFtcGxlLAorLkIgXC1yb3QgMjcwIC10cmltCit0cmltcyBvbmx5IHRoZSBib3R0b20gZWRnZSwgYnV0CisuQiBcLXJvdCA5MCAtdHJpbQorZm9sbG93ZWQgYnkKKy5CIFwtcm90IDE4MCAtdHJpbQordHJpbXMgYm90aCBlZGdlcy4KKy5QUAorQW5vdGhlciBub3Qtc3RyaWN0bHktbG9zc2xlc3MgdHJhbnNmb3JtYXRpb24gc3dpdGNoIGlzOgorLlRQCisuQiBcLWdyYXlzY2FsZQorRm9yY2UgZ3JheXNjYWxlIG91dHB1dC4KKy5QUAorVGhpcyBvcHRpb24gZGlzY2FyZHMgdGhlIGNocm9taW5hbmNlIGNoYW5uZWxzIGlmIHRoZSBpbnB1dCBpbWFnZSBpcyBZQ2JDcgorKGllLCBhIHN0YW5kYXJkIGNvbG9yIEpQRUcpLCByZXN1bHRpbmcgaW4gYSBncmF5c2NhbGUgSlBFRyBmaWxlLiAgVGhlCitsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseSwgc28gdGhpcyBpcyBhIGJldHRlciBtZXRob2Qgb2YgcmVkdWNpbmcKK3RvIGdyYXlzY2FsZSB0aGFuIGRlY29tcHJlc3Npb24sIGNvbnZlcnNpb24sIGFuZCByZWNvbXByZXNzaW9uLiAgVGhpcyBzd2l0Y2gKK2lzIHBhcnRpY3VsYXJseSBoYW5keSBmb3IgZml4aW5nIGEgbW9ub2Nocm9tZSBwaWN0dXJlIHRoYXQgd2FzIG1pc3Rha2VubHkKK2VuY29kZWQgYXMgYSBjb2xvciBKUEVHLiAgKEluIHN1Y2ggYSBjYXNlLCB0aGUgc3BhY2Ugc2F2aW5ncyBmcm9tIGdldHRpbmcgcmlkCitvZiB0aGUgbmVhci1lbXB0eSBjaHJvbWEgY2hhbm5lbHMgd29uJ3QgYmUgbGFyZ2U7IGJ1dCB0aGUgZGVjb2RpbmcgdGltZSBmb3IKK2EgZ3JheXNjYWxlIEpQRUcgaXMgc3Vic3RhbnRpYWxseSBsZXNzIHRoYW4gdGhhdCBmb3IgYSBjb2xvciBKUEVHLikKKy5QUAorLkIganBlZ3RyYW4KK2Fsc28gcmVjb2duaXplcyB0aGVzZSBzd2l0Y2hlcyB0aGF0IGNvbnRyb2wgd2hhdCB0byBkbyB3aXRoICJleHRyYSIgbWFya2VycywKK3N1Y2ggYXMgY29tbWVudCBibG9ja3M6CisuVFAKKy5CIFwtY29weSBub25lCitDb3B5IG5vIGV4dHJhIG1hcmtlcnMgZnJvbSBzb3VyY2UgZmlsZS4gIFRoaXMgc2V0dGluZyBzdXBwcmVzc2VzIGFsbAorY29tbWVudHMgYW5kIG90aGVyIGV4Y2VzcyBiYWdnYWdlIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBmaWxlLgorLlRQCisuQiBcLWNvcHkgY29tbWVudHMKK0NvcHkgb25seSBjb21tZW50IG1hcmtlcnMuICBUaGlzIHNldHRpbmcgY29waWVzIGNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLAorYnV0IGRpc2NhcmRzIGFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLgorLlRQCisuQiBcLWNvcHkgYWxsCitDb3B5IGFsbCBleHRyYSBtYXJrZXJzLiAgVGhpcyBzZXR0aW5nIHByZXNlcnZlcyBtaXNjZWxsYW5lb3VzIG1hcmtlcnMKK2ZvdW5kIGluIHRoZSBzb3VyY2UgZmlsZSwgc3VjaCBhcyBKRklGIHRodW1ibmFpbHMgYW5kIFBob3Rvc2hvcCBzZXR0aW5ncy4KK0luIHNvbWUgZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KKy5QUAorVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKKy5CUiAiXC1jb3B5IGNvbW1lbnRzIiAuCisoTm90ZTogaW4gSUpHIHJlbGVhc2VzIHY2IGFuZCB2NmEsCisuQiBqcGVndHJhbgorYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZgorLkJSICJcLWNvcHkgbm9uZSIgLikKKy5QUAorQWRkaXRpb25hbCBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGpwZWd0cmFuIGFyZToKKy5UUAorLkJJIFwtbWF4bWVtb3J5ICIgTiIKK1NldCBsaW1pdCBmb3IgYW1vdW50IG9mIG1lbW9yeSB0byB1c2UgaW4gcHJvY2Vzc2luZyBsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcworaW4gdGhvdXNhbmRzIG9mIGJ5dGVzLCBvciBtaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlCitudW1iZXIuICBGb3IgZXhhbXBsZSwKKy5CIFwtbWF4IDRtCitzZWxlY3RzIDQwMDAwMDAgYnl0ZXMuICBJZiBtb3JlIHNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KKy5UUAorLkJJIFwtb3V0ZmlsZSAiIG5hbWUiCitTZW5kIG91dHB1dCBpbWFnZSB0byB0aGUgbmFtZWQgZmlsZSwgbm90IHRvIHN0YW5kYXJkIG91dHB1dC4KKy5UUAorLkIgXC12ZXJib3NlCitFbmFibGUgZGVidWcgcHJpbnRvdXQuICBNb3JlCisuQlIgXC12ICdzCitnaXZlIG1vcmUgb3V0cHV0LiAgQWxzbywgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCisuVFAKKy5CIFwtZGVidWcKK1NhbWUgYXMKKy5CUiBcLXZlcmJvc2UgLgorLlNIIEVYQU1QTEVTCisuTFAKK1RoaXMgZXhhbXBsZSBjb252ZXJ0cyBhIGJhc2VsaW5lIEpQRUcgZmlsZSB0byBwcm9ncmVzc2l2ZSBmb3JtOgorLklQCisuQiBqcGVndHJhbiBcLXByb2dyZXNzaXZlCisuSSBmb28uanBnCisuQiA+CisuSSBmb29wcm9nLmpwZworLlBQCitUaGlzIGV4YW1wbGUgcm90YXRlcyBhbiBpbWFnZSA5MCBkZWdyZWVzIGNsb2Nrd2lzZSwgZGlzY2FyZGluZyBhbnkKK3Vucm90YXRhYmxlIGVkZ2UgcGl4ZWxzOgorLklQCisuQiBqcGVndHJhbiBcLXJvdCA5MCAtdHJpbQorLkkgZm9vLmpwZworLkIgPgorLkkgZm9vOTAuanBnCisuU0ggRU5WSVJPTk1FTlQKKy5UUAorLkIgSlBFR01FTQorSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSBpcyB0aGUgZGVmYXVsdCBtZW1vcnkgbGltaXQuCitUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBmb3IgdGhlCisuQiBcLW1heG1lbW9yeQorc3dpdGNoLgorLkIgSlBFR01FTQorb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSBwcm9ncmFtIHdhcyBjb21waWxlZCwgYW5kCitpdHNlbGYgaXMgb3ZlcnJpZGRlbiBieSBhbiBleHBsaWNpdAorLkJSIFwtbWF4bWVtb3J5IC4KKy5TSCBTRUUgQUxTTworLkJSIGNqcGVnICgxKSwKKy5CUiBkanBlZyAoMSksCisuQlIgcmRqcGdjb20gKDEpLAorLkJSIHdyanBnY29tICgxKQorLmJyCitXYWxsYWNlLCBHcmVnb3J5IEsuICAiVGhlIEpQRUcgU3RpbGwgUGljdHVyZSBDb21wcmVzc2lvbiBTdGFuZGFyZCIsCitDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLCBBcHJpbCAxOTkxICh2b2wuIDM0LCBuby4gNCksIHBwLiAzMC00NC4KKy5TSCBBVVRIT1IKK0luZGVwZW5kZW50IEpQRUcgR3JvdXAKKy5TSCBCVUdTCitBcml0aG1ldGljIGNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zLgorLlBQCitUaGUgdHJhbnNmb3JtIG9wdGlvbnMgY2FuJ3QgdHJhbnNmb3JtIG9kZC1zaXplIGltYWdlcyBwZXJmZWN0bHkuICBVc2UKKy5CIFwtdHJpbQoraWYgeW91IGRvbid0IGxpa2UgdGhlIHJlc3VsdHMgd2l0aG91dCBpdC4KKy5QUAorVGhlIGVudGlyZSBpbWFnZSBpcyByZWFkIGludG8gbWVtb3J5IGFuZCB0aGVuIHdyaXR0ZW4gb3V0IGFnYWluLCBldmVuIGluCitjYXNlcyB3aGVyZSB0aGlzIGlzbid0IHJlYWxseSBuZWNlc3NhcnkuICBFeHBlY3Qgc3dhcHBpbmcgb24gbGFyZ2UgaW1hZ2VzLAorZXNwZWNpYWxseSB3aGVuIHVzaW5nIHRoZSBtb3JlIGNvbXBsZXggdHJhbnNmb3JtIG9wdGlvbnMuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvanBlZ3RyYW4uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcGVndHJhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWYxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvanBlZ3RyYW4uYwpAQCAtMCwwICsxLDUwNCBAQAorLyoKKyAqIGpwZWd0cmFuLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbW1hbmQtbGluZSB1c2VyIGludGVyZmFjZSBmb3IgSlBFRyB0cmFuc2NvZGluZy4KKyAqIEl0IGlzIHZlcnkgc2ltaWxhciB0byBjanBlZy5jLCBidXQgcHJvdmlkZXMgbG9zc2xlc3MgdHJhbnNjb2RpbmcgYmV0d2VlbgorICogZGlmZmVyZW50IEpQRUcgZmlsZSBmb3JtYXRzLiAgSXQgYWxzbyBwcm92aWRlcyBzb21lIGxvc3NsZXNzIGFuZCBzb3J0LW9mLQorICogbG9zc2xlc3MgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZGF0YS4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworI2luY2x1ZGUgInRyYW5zdXBwLmgiCQkvKiBTdXBwb3J0IHJvdXRpbmVzIGZvciBqcGVndHJhbiAqLworI2luY2x1ZGUgImp2ZXJzaW9uLmgiCQkvKiBmb3IgdmVyc2lvbiBtZXNzYWdlICovCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworCisvKgorICogQXJndW1lbnQtcGFyc2luZyBjb2RlLgorICogVGhlIHN3aXRjaCBwYXJzZXIgaXMgZGVzaWduZWQgdG8gYmUgdXNlZnVsIHdpdGggRE9TLXN0eWxlIGNvbW1hbmQgbGluZQorICogc3ludGF4LCBpZSwgaW50ZXJtaXhlZCBzd2l0Y2hlcyBhbmQgZmlsZSBuYW1lcywgd2hlcmUgb25seSB0aGUgc3dpdGNoZXMKKyAqIHRvIHRoZSBsZWZ0IG9mIGEgZ2l2ZW4gZmlsZSBuYW1lIGFmZmVjdCBwcm9jZXNzaW5nIG9mIHRoYXQgZmlsZS4KKyAqIFRoZSBtYWluIHByb2dyYW0gaW4gdGhpcyBmaWxlIGRvZXNuJ3QgYWN0dWFsbHkgdXNlIHRoaXMgY2FwYWJpbGl0eS4uLgorICovCisKKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIGNoYXIgKiBvdXRmaWxlbmFtZTsJLyogZm9yIC1vdXRmaWxlIHN3aXRjaCAqLworc3RhdGljIEpDT1BZX09QVElPTiBjb3B5b3B0aW9uOwkvKiAtY29weSBzd2l0Y2ggKi8KK3N0YXRpYyBqcGVnX3RyYW5zZm9ybV9pbmZvIHRyYW5zZm9ybW9wdGlvbjsgLyogaW1hZ2UgdHJhbnNmb3JtYXRpb24gb3B0aW9ucyAqLworCisKK0xPQ0FMKHZvaWQpCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW3N3aXRjaGVzXSAiLCBwcm9nbmFtZSk7CisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJpbnB1dGZpbGUgb3V0cHV0ZmlsZVxuIik7CisjZWxzZQorICBmcHJpbnRmKHN0ZGVyciwgIltpbnB1dGZpbGVdXG4iKTsKKyNlbmRpZgorCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IG5vbmUgICAgIENvcHkgbm8gZXh0cmEgbWFya2VycyBmcm9tIHNvdXJjZSBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGNvbW1lbnRzIENvcHkgb25seSBjb21tZW50IG1hcmtlcnMgKGRlZmF1bHQpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1jb3B5IGFsbCAgICAgIENvcHkgYWxsIGV4dHJhIG1hcmtlcnNcbiIpOworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLW9wdGltaXplICAgICAgT3B0aW1pemUgSHVmZm1hbiB0YWJsZSAoc21hbGxlciBmaWxlLCBidXQgc2xvdyBjb21wcmVzc2lvbilcbiIpOworI2VuZGlmCisjaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICIgIC1wcm9ncmVzc2l2ZSAgIENyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVcbiIpOworI2VuZGlmCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3IgbW9kaWZ5aW5nIHRoZSBpbWFnZTpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWdyYXlzY2FsZSAgICAgUmVkdWNlIHRvIGdyYXlzY2FsZSAob21pdCBjb2xvciBkYXRhKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtZmxpcCBbaG9yaXpvbnRhbHx2ZXJ0aWNhbF0gIE1pcnJvciBpbWFnZSAobGVmdC1yaWdodCBvciB0b3AtYm90dG9tKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcm90YXRlIFs5MHwxODB8MjcwXSAgICAgICAgIFJvdGF0ZSBpbWFnZSAoZGVncmVlcyBjbG9ja3dpc2UpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC10cmFuc3Bvc2UgICAgIFRyYW5zcG9zZSBpbWFnZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdHJhbnN2ZXJzZSAgICBUcmFuc3ZlcnNlIHRyYW5zcG9zZSBpbWFnZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdHJpbSAgICAgICAgICBEcm9wIG5vbi10cmFuc2Zvcm1hYmxlIGVkZ2UgYmxvY2tzXG4iKTsKKyNlbmRpZiAvKiBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAqLworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIGZvciBhZHZhbmNlZCB1c2VyczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJlc3RhcnQgTiAgICAgU2V0IHJlc3RhcnQgaW50ZXJ2YWwgaW4gcm93cywgb3IgaW4gYmxvY2tzIHdpdGggQlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbWF4bWVtb3J5IE4gICBNYXhpbXVtIG1lbW9yeSB0byB1c2UgKGluIGtieXRlcylcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dGZpbGUgbmFtZSAgU3BlY2lmeSBuYW1lIGZvciBvdXRwdXQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyYm9zZSAgb3IgIC1kZWJ1ZyAgIEVtaXQgZGVidWcgb3V0cHV0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJTd2l0Y2hlcyBmb3Igd2l6YXJkczpcbiIpOworI2lmZGVmIENfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLWFyaXRobWV0aWMgICAgVXNlIGFyaXRobWV0aWMgY29kaW5nXG4iKTsKKyNlbmRpZgorI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAorICBmcHJpbnRmKHN0ZGVyciwgIiAgLXNjYW5zIGZpbGUgICAgQ3JlYXRlIG11bHRpLXNjYW4gSlBFRyBwZXIgc2NyaXB0IGZpbGVcbiIpOworI2VuZGlmCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X3RyYW5zZm9ybSAoSlhGT1JNX0NPREUgdHJhbnNmb3JtKQorLyogU2lsbHkgbGl0dGxlIHJvdXRpbmUgdG8gZGV0ZWN0IG11bHRpcGxlIHRyYW5zZm9ybSBvcHRpb25zLAorICogd2hpY2ggd2UgY2FuJ3QgaGFuZGxlLgorICovCit7CisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgaWYgKHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gSlhGT1JNX05PTkUgfHwKKyAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmFuc2Zvcm0gPT0gdHJhbnNmb3JtKSB7CisgICAgdHJhbnNmb3Jtb3B0aW9uLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4gb25seSBkbyBvbmUgaW1hZ2UgdHJhbnNmb3JtYXRpb24gYXQgYSB0aW1lXG4iLAorCSAgICBwcm9nbmFtZSk7CisgICAgdXNhZ2UoKTsKKyAgfQorI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGltYWdlIHRyYW5zZm9ybWF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCisJICBwcm9nbmFtZSk7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorfQorCisKK0xPQ0FMKGludCkKK3BhcnNlX3N3aXRjaGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IGFyZ2MsIGNoYXIgKiphcmd2LAorCQlpbnQgbGFzdF9maWxlX2FyZ19zZWVuLCBib29sZWFuIGZvcl9yZWFsKQorLyogUGFyc2Ugb3B0aW9uYWwgc3dpdGNoZXMuCisgKiBSZXR1cm5zIGFyZ3ZbXSBpbmRleCBvZiBmaXJzdCBmaWxlLW5hbWUgYXJndW1lbnQgKD09IGFyZ2MgaWYgbm9uZSkuCisgKiBBbnkgZmlsZSBuYW1lcyB3aXRoIGluZGV4ZXMgPD0gbGFzdF9maWxlX2FyZ19zZWVuIGFyZSBpZ25vcmVkOworICogdGhleSBoYXZlIHByZXN1bWFibHkgYmVlbiBwcm9jZXNzZWQgaW4gYSBwcmV2aW91cyBpdGVyYXRpb24uCisgKiAoUGFzcyAwIGZvciBsYXN0X2ZpbGVfYXJnX3NlZW4gb24gdGhlIGZpcnN0IG9yIG9ubHkgaXRlcmF0aW9uLikKKyAqIGZvcl9yZWFsIGlzIEZBTFNFIG9uIHRoZSBmaXJzdCAoZHVtbXkpIHBhc3M7IHdlIG1heSBza2lwIGFueSBleHBlbnNpdmUKKyAqIHByb2Nlc3NpbmcuCisgKi8KK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGJvb2xlYW4gc2ltcGxlX3Byb2dyZXNzaXZlOworICBjaGFyICogc2NhbnNhcmcgPSBOVUxMOwkvKiBzYXZlcyAtc2NhbnMgcGFybSBpZiBhbnkgKi8KKworICAvKiBTZXQgdXAgZGVmYXVsdCBKUEVHIHBhcmFtZXRlcnMuICovCisgIHNpbXBsZV9wcm9ncmVzc2l2ZSA9IEZBTFNFOworICBvdXRmaWxlbmFtZSA9IE5VTEw7CisgIGNvcHlvcHRpb24gPSBKQ09QWU9QVF9ERUZBVUxUOworICB0cmFuc2Zvcm1vcHRpb24udHJhbnNmb3JtID0gSlhGT1JNX05PTkU7CisgIHRyYW5zZm9ybW9wdGlvbi50cmltID0gRkFMU0U7CisgIHRyYW5zZm9ybW9wdGlvbi5mb3JjZV9ncmF5c2NhbGUgPSBGQUxTRTsKKyAgY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPSAwOworCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFkanVzdCBwYXJhbWV0ZXJzICovCisKKyAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgeworICAgIGFyZyA9IGFyZ3ZbYXJnbl07CisgICAgaWYgKCphcmcgIT0gJy0nKSB7CisgICAgICAvKiBOb3QgYSBzd2l0Y2gsIG11c3QgYmUgYSBmaWxlIG5hbWUgYXJndW1lbnQgKi8KKyAgICAgIGlmIChhcmduIDw9IGxhc3RfZmlsZV9hcmdfc2VlbikgeworCW91dGZpbGVuYW1lID0gTlVMTDsJLyogLW91dGZpbGUgYXBwbGllcyB0byBqdXN0IG9uZSBpbnB1dCBmaWxlICovCisJY29udGludWU7CQkvKiBpZ25vcmUgdGhpcyBuYW1lIGlmIHByZXZpb3VzbHkgcHJvY2Vzc2VkICovCisgICAgICB9CisgICAgICBicmVhazsJCQkvKiBlbHNlIGRvbmUgcGFyc2luZyBzd2l0Y2hlcyAqLworICAgIH0KKyAgICBhcmcrKzsJCQkvKiBhZHZhbmNlIHBhc3Qgc3dpdGNoIG1hcmtlciBjaGFyYWN0ZXIgKi8KKworICAgIGlmIChrZXltYXRjaChhcmcsICJhcml0aG1ldGljIiwgMSkpIHsKKyAgICAgIC8qIFVzZSBhcml0aG1ldGljIGNvZGluZy4gKi8KKyNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKKyAgICAgIGNpbmZvLT5hcml0aF9jb2RlID0gVFJVRTsKKyNlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBzb3JyeSwgYXJpdGhtZXRpYyBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29weSIsIDEpKSB7CisgICAgICAvKiBTZWxlY3Qgd2hpY2ggZXh0cmEgbWFya2VycyB0byBjb3B5LiAqLworICAgICAgaWYgKCsrYXJnbiA+PSBhcmdjKQkvKiBhZHZhbmNlIHRvIG5leHQgYXJndW1lbnQgKi8KKwl1c2FnZSgpOworICAgICAgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJub25lIiwgMSkpIHsKKwljb3B5b3B0aW9uID0gSkNPUFlPUFRfTk9ORTsKKyAgICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgImNvbW1lbnRzIiwgMSkpIHsKKwljb3B5b3B0aW9uID0gSkNPUFlPUFRfQ09NTUVOVFM7CisgICAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZ3ZbYXJnbl0sICJhbGwiLCAxKSkgeworCWNvcHlvcHRpb24gPSBKQ09QWU9QVF9BTEw7CisgICAgICB9IGVsc2UKKwl1c2FnZSgpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJkZWJ1ZyIsIDEpIHx8IGtleW1hdGNoKGFyZywgInZlcmJvc2UiLCAxKSkgeworICAgICAgLyogRW5hYmxlIGRlYnVnIHByaW50b3V0cy4gKi8KKyAgICAgIC8qIE9uIGZpcnN0IC1kLCBwcmludCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uICovCisgICAgICBzdGF0aWMgYm9vbGVhbiBwcmludGVkX3ZlcnNpb24gPSBGQUxTRTsKKworICAgICAgaWYgKCEgcHJpbnRlZF92ZXJzaW9uKSB7CisJZnByaW50ZihzdGRlcnIsICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3MgSlBFR1RSQU4sIHZlcnNpb24gJXNcbiVzXG4iLAorCQlKVkVSU0lPTiwgSkNPUFlSSUdIVCk7CisJcHJpbnRlZF92ZXJzaW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGNpbmZvLT5lcnItPnRyYWNlX2xldmVsKys7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImZsaXAiLCAxKSkgeworICAgICAgLyogTWlycm9yIGxlZnQtcmlnaHQgb3IgdG9wLWJvdHRvbS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiaG9yaXpvbnRhbCIsIDEpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX0ZMSVBfSCk7CisgICAgICBlbHNlIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAidmVydGljYWwiLCAxKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9GTElQX1YpOworICAgICAgZWxzZQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgImdyYXlzY2FsZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgImdyZXlzY2FsZSIsMSkpIHsKKyAgICAgIC8qIEZvcmNlIHRvIGdyYXlzY2FsZS4gKi8KKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorICAgICAgdHJhbnNmb3Jtb3B0aW9uLmZvcmNlX2dyYXlzY2FsZSA9IFRSVUU7CisjZWxzZQorICAgICAgc2VsZWN0X3RyYW5zZm9ybShKWEZPUk1fTk9ORSk7CS8qIGZvcmNlIGFuIGVycm9yICovCisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAibWF4bWVtb3J5IiwgMykpIHsKKyAgICAgIC8qIE1heGltdW0gbWVtb3J5IGluIEtiIChvciBNYiB3aXRoICdtJykuICovCisgICAgICBsb25nIGx2YWw7CisgICAgICBjaGFyIGNoID0gJ3gnOworCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBpZiAoc3NjYW5mKGFyZ3ZbYXJnbl0sICIlbGQlYyIsICZsdmFsLCAmY2gpIDwgMSkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCisJbHZhbCAqPSAxMDAwTDsKKyAgICAgIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gbHZhbCAqIDEwMDBMOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJvcHRpbWl6ZSIsIDEpIHx8IGtleW1hdGNoKGFyZywgIm9wdGltaXNlIiwgMSkpIHsKKyAgICAgIC8qIEVuYWJsZSBlbnRyb3B5IHBhcm0gb3B0aW1pemF0aW9uLiAqLworI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAorICAgICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7CisjZWxzZQorICAgICAgZnByaW50ZihzdGRlcnIsICIlczogc29ycnksIGVudHJvcHkgb3B0aW1pemF0aW9uIHdhcyBub3QgY29tcGlsZWRcbiIsCisJICAgICAgcHJvZ25hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworI2VuZGlmCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgIm91dGZpbGUiLCA0KSkgeworICAgICAgLyogU2V0IG91dHB1dCBmaWxlIG5hbWUuICovCisgICAgICBpZiAoKythcmduID49IGFyZ2MpCS8qIGFkdmFuY2UgdG8gbmV4dCBhcmd1bWVudCAqLworCXVzYWdlKCk7CisgICAgICBvdXRmaWxlbmFtZSA9IGFyZ3ZbYXJnbl07CS8qIHNhdmUgaXQgYXdheSBmb3IgbGF0ZXIgdXNlICovCisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInByb2dyZXNzaXZlIiwgMSkpIHsKKyAgICAgIC8qIFNlbGVjdCBzaW1wbGUgcHJvZ3Jlc3NpdmUgbW9kZS4gKi8KKyNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAorICAgICAgc2ltcGxlX3Byb2dyZXNzaXZlID0gVFJVRTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgZXhlY3V0aW9uIHVudGlsIG51bV9jb21wb25lbnRzIGlzIGtub3duLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBwcm9ncmVzc2l2ZSBvdXRwdXQgd2FzIG5vdCBjb21waWxlZFxuIiwKKwkgICAgICBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisjZW5kaWYKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicmVzdGFydCIsIDEpKSB7CisgICAgICAvKiBSZXN0YXJ0IGludGVydmFsIGluIE1DVSByb3dzIChvciBpbiBNQ1VzIHdpdGggJ2InKS4gKi8KKyAgICAgIGxvbmcgbHZhbDsKKyAgICAgIGNoYXIgY2ggPSAneCc7CisKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChzc2NhbmYoYXJndlthcmduXSwgIiVsZCVjIiwgJmx2YWwsICZjaCkgPCAxKQorCXVzYWdlKCk7CisgICAgICBpZiAobHZhbCA8IDAgfHwgbHZhbCA+IDY1NTM1TCkKKwl1c2FnZSgpOworICAgICAgaWYgKGNoID09ICdiJyB8fCBjaCA9PSAnQicpIHsKKwljaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIGx2YWw7CisJY2luZm8tPnJlc3RhcnRfaW5fcm93cyA9IDA7IC8qIGVsc2UgcHJpb3IgJy1yZXN0YXJ0IG4nIG92ZXJyaWRlcyBtZSAqLworICAgICAgfSBlbHNlIHsKKwljaW5mby0+cmVzdGFydF9pbl9yb3dzID0gKGludCkgbHZhbDsKKwkvKiByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgY29tcHV0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAicm90YXRlIiwgMikpIHsKKyAgICAgIC8qIFJvdGF0ZSA5MCwgMTgwLCBvciAyNzAgZGVncmVlcyAobWVhc3VyZWQgY2xvY2t3aXNlKS4gKi8KKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIGlmIChrZXltYXRjaChhcmd2W2FyZ25dLCAiOTAiLCAyKSkKKwlzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9ST1RfOTApOworICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjE4MCIsIDMpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8xODApOworICAgICAgZWxzZSBpZiAoa2V5bWF0Y2goYXJndlthcmduXSwgIjI3MCIsIDMpKQorCXNlbGVjdF90cmFuc2Zvcm0oSlhGT1JNX1JPVF8yNzApOworICAgICAgZWxzZQorCXVzYWdlKCk7CisKKyAgICB9IGVsc2UgaWYgKGtleW1hdGNoKGFyZywgInNjYW5zIiwgMSkpIHsKKyAgICAgIC8qIFNldCBzY2FuIHNjcmlwdC4gKi8KKyNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKKyAgICAgIGlmICgrK2FyZ24gPj0gYXJnYykJLyogYWR2YW5jZSB0byBuZXh0IGFyZ3VtZW50ICovCisJdXNhZ2UoKTsKKyAgICAgIHNjYW5zYXJnID0gYXJndlthcmduXTsKKyAgICAgIC8qIFdlIG11c3QgcG9zdHBvbmUgcmVhZGluZyB0aGUgZmlsZSBpbiBjYXNlIC1wcm9ncmVzc2l2ZSBhcHBlYXJzLiAqLworI2Vsc2UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IHNvcnJ5LCBtdWx0aS1zY2FuIG91dHB1dCB3YXMgbm90IGNvbXBpbGVkXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyNlbmRpZgorCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3Bvc2UiLCAxKSkgeworICAgICAgLyogVHJhbnNwb3NlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuICovCisgICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1BPU0UpOworCisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJ0cmFuc3ZlcnNlIiwgNikpIHsKKyAgICAgIC8qIFRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuICovCisgICAgICBzZWxlY3RfdHJhbnNmb3JtKEpYRk9STV9UUkFOU1ZFUlNFKTsKKworICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAidHJpbSIsIDMpKSB7CisgICAgICAvKiBUcmltIG9mZiBhbnkgcGFydGlhbCBlZGdlIE1DVXMgdGhhdCB0aGUgdHJhbnNmb3JtIGNhbid0IGhhbmRsZS4gKi8KKyAgICAgIHRyYW5zZm9ybW9wdGlvbi50cmltID0gVFJVRTsKKworICAgIH0gZWxzZSB7CisgICAgICB1c2FnZSgpOwkJCS8qIGJvZ3VzIHN3aXRjaCAqLworICAgIH0KKyAgfQorCisgIC8qIFBvc3Qtc3dpdGNoLXNjYW5uaW5nIGNsZWFudXAgKi8KKworICBpZiAoZm9yX3JlYWwpIHsKKworI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECisgICAgaWYgKHNpbXBsZV9wcm9ncmVzc2l2ZSkJLyogcHJvY2VzcyAtcHJvZ3Jlc3NpdmU7IC1zY2FucyBjYW4gb3ZlcnJpZGUgKi8KKyAgICAgIGpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uKGNpbmZvKTsKKyNlbmRpZgorCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisgICAgaWYgKHNjYW5zYXJnICE9IE5VTEwpCS8qIHByb2Nlc3MgLXNjYW5zIGlmIGl0IHdhcyBwcmVzZW50ICovCisgICAgICBpZiAoISByZWFkX3NjYW5fc2NyaXB0KGNpbmZvLCBzY2Fuc2FyZykpCisJdXNhZ2UoKTsKKyNlbmRpZgorICB9CisKKyAgcmV0dXJuIGFyZ247CQkJLyogcmV0dXJuIGluZGV4IG9mIG5leHQgYXJnIChmaWxlIG5hbWUpICovCit9CisKKworLyoKKyAqIFRoZSBtYWluIHByb2dyYW0uCisgKi8KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIHN0cnVjdCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IHNyY2luZm87CisgIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBkc3RpbmZvOworICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IganNyY2VyciwgamRzdGVycjsKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgcHJvZ3Jlc3M7CisjZW5kaWYKKyAganZpcnRfYmFycmF5X3B0ciAqIHNyY19jb2VmX2FycmF5czsKKyAganZpcnRfYmFycmF5X3B0ciAqIGRzdF9jb2VmX2FycmF5czsKKyAgaW50IGZpbGVfaW5kZXg7CisgIEZJTEUgKiBpbnB1dF9maWxlOworICBGSUxFICogb3V0cHV0X2ZpbGU7CisKKyAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KKyNpZmRlZiBVU0VfQ0NPTU1BTkQKKyAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKKyNlbmRpZgorCisgIHByb2duYW1lID0gYXJndlswXTsKKyAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKKyAgICBwcm9nbmFtZSA9ICJqcGVndHJhbiI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGVycm9yIGhhbmRsaW5nLiAqLworICBzcmNpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqc3JjZXJyKTsKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmc3JjaW5mbyk7CisgIC8qIEluaXRpYWxpemUgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0IHdpdGggZGVmYXVsdCBlcnJvciBoYW5kbGluZy4gKi8KKyAgZHN0aW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamRzdGVycik7CisgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZkc3RpbmZvKTsKKworICAvKiBOb3cgc2FmZSB0byBlbmFibGUgc2lnbmFsIGNhdGNoZXIuCisgICAqIE5vdGU6IHdlIGFzc3VtZSBvbmx5IHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdCB3aWxsIGhhdmUgdmlydHVhbCBhcnJheXMuCisgICAqLworI2lmZGVmIE5FRURfU0lHTkFMX0NBVENIRVIKKyAgZW5hYmxlX3NpZ25hbF9jYXRjaGVyKChqX2NvbW1vbl9wdHIpICZzcmNpbmZvKTsKKyNlbmRpZgorCisgIC8qIFNjYW4gY29tbWFuZCBsaW5lIHRvIGZpbmQgZmlsZSBuYW1lcy4KKyAgICogSXQgaXMgY29udmVuaWVudCB0byB1c2UganVzdCBvbmUgc3dpdGNoLXBhcnNpbmcgcm91dGluZSwgYnV0IHRoZSBzd2l0Y2gKKyAgICogdmFsdWVzIHJlYWQgaGVyZSBhcmUgbW9zdGx5IGlnbm9yZWQ7IHdlIHdpbGwgcmVzY2FuIHRoZSBzd2l0Y2hlcyBhZnRlcgorICAgKiBvcGVuaW5nIHRoZSBpbnB1dCBmaWxlLiAgQWxzbyBub3RlIHRoYXQgbW9zdCBvZiB0aGUgc3dpdGNoZXMgYWZmZWN0IHRoZQorICAgKiBkZXN0aW5hdGlvbiBKUEVHIG9iamVjdCwgc28gd2UgcGFyc2UgaW50byB0aGF0IGFuZCB0aGVuIGNvcHkgb3ZlciB3aGF0CisgICAqIG5lZWRzIHRvIGFmZmVjdHMgdGhlIHNvdXJjZSB0b28uCisgICAqLworCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgRkFMU0UpOworICBqc3JjZXJyLnRyYWNlX2xldmVsID0gamRzdGVyci50cmFjZV9sZXZlbDsKKyAgc3JjaW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlID0gZHN0aW5mby5tZW0tPm1heF9tZW1vcnlfdG9fdXNlOworCisjaWZkZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgLyogTXVzdCBoYXZlIGVpdGhlciAtb3V0ZmlsZSBzd2l0Y2ggb3IgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLworICBpZiAob3V0ZmlsZW5hbWUgPT0gTlVMTCkgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMikgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIG91dGZpbGVuYW1lID0gYXJndltmaWxlX2luZGV4KzFdOworICB9IGVsc2UgeworICAgIGlmIChmaWxlX2luZGV4ICE9IGFyZ2MtMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogbXVzdCBuYW1lIG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCBmaWxlXG4iLAorCSAgICAgIHByb2duYW1lKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICB9CisjZWxzZQorICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLworCisgIC8qIE9wZW4gdGhlIGlucHV0IGZpbGUuICovCisgIGlmIChmaWxlX2luZGV4IDwgYXJnYykgeworICAgIGlmICgoaW5wdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbZmlsZV9pbmRleF0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbZmlsZV9pbmRleF0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyAgICBpbnB1dF9maWxlID0gcmVhZF9zdGRpbigpOworICB9CisKKyAgLyogT3BlbiB0aGUgb3V0cHV0IGZpbGUuICovCisgIGlmIChvdXRmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgaWYgKChvdXRwdXRfZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgb3V0ZmlsZW5hbWUpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IG91dHB1dCBmaWxlIGlzIHN0ZG91dCAqLworICAgIG91dHB1dF9maWxlID0gd3JpdGVfc3Rkb3V0KCk7CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBzdGFydF9wcm9ncmVzc19tb25pdG9yKChqX2NvbW1vbl9wdHIpICZkc3RpbmZvLCAmcHJvZ3Jlc3MpOworI2VuZGlmCisKKyAgLyogU3BlY2lmeSBkYXRhIHNvdXJjZSBmb3IgZGVjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX3NyYygmc3JjaW5mbywgaW5wdXRfZmlsZSk7CisKKyAgLyogRW5hYmxlIHNhdmluZyBvZiBleHRyYSBtYXJrZXJzIHRoYXQgd2Ugd2FudCB0byBjb3B5ICovCisgIGpjb3B5X21hcmtlcnNfc2V0dXAoJnNyY2luZm8sIGNvcHlvcHRpb24pOworCisgIC8qIFJlYWQgZmlsZSBoZWFkZXIgKi8KKyAgKHZvaWQpIGpwZWdfcmVhZF9oZWFkZXIoJnNyY2luZm8sIFRSVUUpOworCisgIC8qIEFueSBzcGFjZSBuZWVkZWQgYnkgYSB0cmFuc2Zvcm0gb3B0aW9uIG11c3QgYmUgcmVxdWVzdGVkIGJlZm9yZQorICAgKiBqcGVnX3JlYWRfY29lZmZpY2llbnRzIHNvIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gd2lsbCBiZSBkb25lIHJpZ2h0LgorICAgKi8KKyNpZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorICBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlKCZzcmNpbmZvLCAmdHJhbnNmb3Jtb3B0aW9uKTsKKyNlbmRpZgorCisgIC8qIFJlYWQgc291cmNlIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cyAqLworICBzcmNfY29lZl9hcnJheXMgPSBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCZzcmNpbmZvKTsKKworICAvKiBJbml0aWFsaXplIGRlc3RpbmF0aW9uIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgZnJvbSBzb3VyY2UgdmFsdWVzICovCisgIGpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzKCZzcmNpbmZvLCAmZHN0aW5mbyk7CisKKyAgLyogQWRqdXN0IGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgYnkgdHJhbnNmb3JtIG9wdGlvbnM7CisgICAqIGFsc28gZmluZCBvdXQgd2hpY2ggc2V0IG9mIGNvZWZmaWNpZW50IGFycmF5cyB3aWxsIGhvbGQgdGhlIG91dHB1dC4KKyAgICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAgZHN0X2NvZWZfYXJyYXlzID0ganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycygmc3JjaW5mbywgJmRzdGluZm8sCisJCQkJCQkgc3JjX2NvZWZfYXJyYXlzLAorCQkJCQkJICZ0cmFuc2Zvcm1vcHRpb24pOworI2Vsc2UKKyAgZHN0X2NvZWZfYXJyYXlzID0gc3JjX2NvZWZfYXJyYXlzOworI2VuZGlmCisKKyAgLyogQWRqdXN0IGRlZmF1bHQgY29tcHJlc3Npb24gcGFyYW1ldGVycyBieSByZS1wYXJzaW5nIHRoZSBvcHRpb25zICovCisgIGZpbGVfaW5kZXggPSBwYXJzZV9zd2l0Y2hlcygmZHN0aW5mbywgYXJnYywgYXJndiwgMCwgVFJVRSk7CisKKyAgLyogU3BlY2lmeSBkYXRhIGRlc3RpbmF0aW9uIGZvciBjb21wcmVzc2lvbiAqLworICBqcGVnX3N0ZGlvX2Rlc3QoJmRzdGluZm8sIG91dHB1dF9maWxlKTsKKworICAvKiBTdGFydCBjb21wcmVzc29yIChub3RlIG5vIGltYWdlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBoZXJlKSAqLworICBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygmZHN0aW5mbywgZHN0X2NvZWZfYXJyYXlzKTsKKworICAvKiBDb3B5IHRvIHRoZSBvdXRwdXQgZmlsZSBhbnkgZXh0cmEgbWFya2VycyB0aGF0IHdlIHdhbnQgdG8gcHJlc2VydmUgKi8KKyAgamNvcHlfbWFya2Vyc19leGVjdXRlKCZzcmNpbmZvLCAmZHN0aW5mbywgY29weW9wdGlvbik7CisKKyAgLyogRXhlY3V0ZSBpbWFnZSB0cmFuc2Zvcm1hdGlvbiwgaWYgYW55ICovCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKyAganRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uKCZzcmNpbmZvLCAmZHN0aW5mbywKKwkJCQkgICAgc3JjX2NvZWZfYXJyYXlzLAorCQkJCSAgICAmdHJhbnNmb3Jtb3B0aW9uKTsKKyNlbmRpZgorCisgIC8qIEZpbmlzaCBjb21wcmVzc2lvbiBhbmQgcmVsZWFzZSBtZW1vcnkgKi8KKyAganBlZ19maW5pc2hfY29tcHJlc3MoJmRzdGluZm8pOworICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmRzdGluZm8pOworICAodm9pZCkganBlZ19maW5pc2hfZGVjb21wcmVzcygmc3JjaW5mbyk7CisgIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZzcmNpbmZvKTsKKworICAvKiBDbG9zZSBmaWxlcywgaWYgd2Ugb3BlbmVkIHRoZW0gKi8KKyAgaWYgKGlucHV0X2ZpbGUgIT0gc3RkaW4pCisgICAgZmNsb3NlKGlucHV0X2ZpbGUpOworICBpZiAob3V0cHV0X2ZpbGUgIT0gc3Rkb3V0KQorICAgIGZjbG9zZShvdXRwdXRfZmlsZSk7CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgZW5kX3Byb2dyZXNzX21vbml0b3IoKGpfY29tbW9uX3B0cikgJmRzdGluZm8pOworI2VuZGlmCisKKyAgLyogQWxsIGRvbmUuICovCisgIGV4aXQoanNyY2Vyci5udW1fd2FybmluZ3MgKyBqZHN0ZXJyLm51bV93YXJuaW5ncyA/RVhJVF9XQVJOSU5HOkVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pxdWFudDEuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcXVhbnQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmOTZhYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcXVhbnQxLmMKQEAgLTAsMCArMSw4NTYgQEAKKy8qCisgKiBqcXVhbnQxLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uIChjb2xvciBtYXBwaW5nKSByb3V0aW5lcy4KKyAqIFRoZXNlIHJvdXRpbmVzIHByb3ZpZGUgbWFwcGluZyB0byBhIGZpeGVkIGNvbG9yIG1hcCB1c2luZyBlcXVhbGx5IHNwYWNlZAorICogY29sb3IgdmFsdWVzLiAgT3B0aW9uYWwgRmxveWQtU3RlaW5iZXJnIG9yIG9yZGVyZWQgZGl0aGVyaW5nIGlzIGF2YWlsYWJsZS4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKyNpZmRlZiBRVUFOVF8xUEFTU19TVVBQT1JURUQKKworCisvKgorICogVGhlIG1haW4gcHVycG9zZSBvZiAxLXBhc3MgcXVhbnRpemF0aW9uIGlzIHRvIHByb3ZpZGUgYSBmYXN0LCBpZiBub3QgdmVyeQorICogaGlnaCBxdWFsaXR5LCBjb2xvcm1hcHBlZCBvdXRwdXQgY2FwYWJpbGl0eS4gIEEgMi1wYXNzIHF1YW50aXplciB1c3VhbGx5CisgKiBnaXZlcyBiZXR0ZXIgdmlzdWFsIHF1YWxpdHk7IGhvd2V2ZXIsIGZvciBxdWFudGl6ZWQgZ3JheXNjYWxlIG91dHB1dCB0aGlzCisgKiBxdWFudGl6ZXIgaXMgcGVyZmVjdGx5IGFkZXF1YXRlLiAgRGl0aGVyaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMKKyAqIHF1YW50aXplciwgdGhvdWdoIHlvdSBjYW4gdHVybiBpdCBvZmYgaWYgeW91IHJlYWxseSB3YW50IHRvLgorICoKKyAqIEluIDEtcGFzcyBxdWFudGl6YXRpb24gdGhlIGNvbG9ybWFwIG11c3QgYmUgY2hvc2VuIGluIGFkdmFuY2Ugb2Ygc2VlaW5nIHRoZQorICogaW1hZ2UuICBXZSB1c2UgYSBtYXAgY29uc2lzdGluZyBvZiBhbGwgY29tYmluYXRpb25zIG9mIE5jb2xvcnNbaV0gY29sb3IKKyAqIHZhbHVlcyBmb3IgdGhlIGkndGggY29tcG9uZW50LiAgVGhlIE5jb2xvcnNbXSB2YWx1ZXMgYXJlIGNob3NlbiBzbyB0aGF0CisgKiB0aGVpciBwcm9kdWN0LCB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbG9ycywgaXMgbm8gbW9yZSB0aGFuIHRoYXQgcmVxdWVzdGVkLgorICogKEluIG1vc3QgY2FzZXMsIHRoZSBwcm9kdWN0IHdpbGwgYmUgc29tZXdoYXQgbGVzcy4pCisgKgorICogU2luY2UgdGhlIGNvbG9ybWFwIGlzIG9ydGhvZ29uYWwsIHRoZSByZXByZXNlbnRhdGl2ZSB2YWx1ZSBmb3IgZWFjaCBjb2xvcgorICogY29tcG9uZW50IGNhbiBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgY29uc2lkZXJpbmcgdGhlIG90aGVyIGNvbXBvbmVudHM7CisgKiB0aGVuIHRoZXNlIGluZGV4ZXMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBjb2xvcm1hcCBpbmRleCBieSBhIHN0YW5kYXJkCisgKiBOLWRpbWVuc2lvbmFsLWFycmF5LXN1YnNjcmlwdCBjYWxjdWxhdGlvbi4gIE1vc3Qgb2YgdGhlIGFyaXRobWV0aWMgaW52b2x2ZWQKKyAqIGNhbiBiZSBwcmVjYWxjdWxhdGVkIGFuZCBzdG9yZWQgaW4gdGhlIGxvb2t1cCB0YWJsZSBjb2xvcmluZGV4W10uCisgKiBjb2xvcmluZGV4W2ldW2pdIG1hcHMgcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSB0byB0aGUgbmVhcmVzdAorICogcmVwcmVzZW50YXRpdmUgdmFsdWUgKGdyaWQgcGxhbmUpIGZvciB0aGF0IGNvbXBvbmVudDsgdGhpcyBpbmRleCBpcworICogbXVsdGlwbGllZCBieSB0aGUgYXJyYXkgc3RyaWRlIGZvciBjb21wb25lbnQgaSwgc28gdGhhdCB0aGUKKyAqIGluZGV4IG9mIHRoZSBjb2xvcm1hcCBlbnRyeSBjbG9zZXN0IHRvIGEgZ2l2ZW4gcGl4ZWwgdmFsdWUgaXMganVzdAorICogICAgc3VtKCBjb2xvcmluZGV4W2NvbXBvbmVudC1udW1iZXJdW3BpeGVsLWNvbXBvbmVudC12YWx1ZV0gKQorICogQXNpZGUgZnJvbSBiZWluZyBmYXN0LCB0aGlzIHNjaGVtZSBhbGxvd3MgZm9yIHZhcmlhYmxlIHNwYWNpbmcgYmV0d2VlbgorICogcmVwcmVzZW50YXRpdmUgdmFsdWVzIHdpdGggbm8gYWRkaXRpb25hbCBsb29rdXAgY29zdC4KKyAqCisgKiBJZiBnYW1tYSBjb3JyZWN0aW9uIGhhcyBiZWVuIGFwcGxpZWQgaW4gY29sb3IgY29udmVyc2lvbiwgaXQgbWlnaHQgYmUgd2lzZQorICogdG8gYWRqdXN0IHRoZSBjb2xvciBncmlkIHNwYWNpbmcgc28gdGhhdCB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3JzIGFyZQorICogZXF1aWRpc3RhbnQgaW4gbGluZWFyIHNwYWNlLiAgQXQgdGhpcyB3cml0aW5nLCBnYW1tYSBjb3JyZWN0aW9uIGlzIG5vdAorICogaW1wbGVtZW50ZWQgYnkgamRjb2xvciwgc28gbm90aGluZyBpcyBkb25lIGhlcmUuCisgKi8KKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nLgorICoKKyAqIFdlIHVzZSBhIHN0YW5kYXJkIDE2eDE2IG9yZGVyZWQgZGl0aGVyIGFycmF5LiAgVGhlIGJhc2ljIGNvbmNlcHQgb2Ygb3JkZXJlZAorICogZGl0aGVyaW5nIGlzIGRlc2NyaWJlZCBpbiBtYW55IHJlZmVyZW5jZXMsIGZvciBpbnN0YW5jZSBEYWxlIFNjaHVtYWNoZXIncworICogY2hhcHRlciBJSS4yIG9mIEdyYXBoaWNzIEdlbXMgSUkgKEphbWVzIEFydm8sIGVkLiBBY2FkZW1pYyBQcmVzcywgMTk5MSkuCisgKiBJbiBwbGFjZSBvZiBTY2h1bWFjaGVyJ3MgY29tcGFyaXNvbnMgYWdhaW5zdCBhICJ0aHJlc2hvbGQiIHZhbHVlLCB3ZSBhZGQgYQorICogImRpdGhlciIgdmFsdWUgdG8gdGhlIGlucHV0IHBpeGVsIGFuZCB0aGVuIHJvdW5kIHRoZSByZXN1bHQgdG8gdGhlIG5lYXJlc3QKKyAqIG91dHB1dCB2YWx1ZS4gIFRoZSBkaXRoZXIgdmFsdWUgaXMgZXF1aXZhbGVudCB0byAoMC41IC0gdGhyZXNob2xkKSB0aW1lcworICogdGhlIGRpc3RhbmNlIGJldHdlZW4gb3V0cHV0IHZhbHVlcy4gIEZvciBvcmRlcmVkIGRpdGhlcmluZywgd2UgYXNzdW1lIHRoYXQKKyAqIHRoZSBvdXRwdXQgY29sb3JzIGFyZSBlcXVhbGx5IHNwYWNlZDsgaWYgbm90LCByZXN1bHRzIHdpbGwgcHJvYmFibHkgYmUKKyAqIHdvcnNlLCBzaW5jZSB0aGUgZGl0aGVyIG1heSBiZSB0b28gbXVjaCBvciB0b28gbGl0dGxlIGF0IGEgZ2l2ZW4gcG9pbnQuCisgKgorICogVGhlIG5vcm1hbCBjYWxjdWxhdGlvbiB3b3VsZCBiZSB0byBmb3JtIHBpeGVsIHZhbHVlICsgZGl0aGVyLCByYW5nZS1saW1pdAorICogdGhpcyB0byAwLi5NQVhKU0FNUExFLCBhbmQgdGhlbiBpbmRleCBpbnRvIHRoZSBjb2xvcmluZGV4IHRhYmxlIGFzIHVzdWFsLgorICogV2UgY2FuIHNraXAgdGhlIHNlcGFyYXRlIHJhbmdlLWxpbWl0aW5nIHN0ZXAgYnkgZXh0ZW5kaW5nIHRoZSBjb2xvcmluZGV4CisgKiB0YWJsZSBpbiBib3RoIGRpcmVjdGlvbnMuCisgKi8KKworI2RlZmluZSBPRElUSEVSX1NJWkUgIDE2CS8qIGRpbWVuc2lvbiBvZiBkaXRoZXIgbWF0cml4ICovCisvKiBOQjogaWYgT0RJVEhFUl9TSVpFIGlzIG5vdCBhIHBvd2VyIG9mIDIsIE9ESVRIRVJfTUFTSyB1c2VzIHdpbGwgYnJlYWsgKi8KKyNkZWZpbmUgT0RJVEhFUl9DRUxMUyAoT0RJVEhFUl9TSVpFKk9ESVRIRVJfU0laRSkJLyogIyBjZWxscyBpbiBtYXRyaXggKi8KKyNkZWZpbmUgT0RJVEhFUl9NQVNLICAoT0RJVEhFUl9TSVpFLTEpIC8qIG1hc2sgZm9yIHdyYXBwaW5nIGFyb3VuZCBjb3VudGVycyAqLworCit0eXBlZGVmIGludCBPRElUSEVSX01BVFJJWFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV07Cit0eXBlZGVmIGludCAoKk9ESVRIRVJfTUFUUklYX1BUUilbT0RJVEhFUl9TSVpFXTsKKworc3RhdGljIGNvbnN0IFVJTlQ4IGJhc2VfZGl0aGVyX21hdHJpeFtPRElUSEVSX1NJWkVdW09ESVRIRVJfU0laRV0gPSB7CisgIC8qIEJheWVyJ3Mgb3JkZXItNCBkaXRoZXIgYXJyYXkuICBHZW5lcmF0ZWQgYnkgdGhlIGNvZGUgZ2l2ZW4gaW4KKyAgICogU3RlcGhlbiBIYXdsZXkncyBhcnRpY2xlICJPcmRlcmVkIERpdGhlcmluZyIgaW4gR3JhcGhpY3MgR2VtcyBJLgorICAgKiBUaGUgdmFsdWVzIGluIHRoaXMgYXJyYXkgbXVzdCByYW5nZSBmcm9tIDAgdG8gT0RJVEhFUl9DRUxMUy0xLgorICAgKi8KKyAgeyAgIDAsMTkyLCA0OCwyNDAsIDEyLDIwNCwgNjAsMjUyLCAgMywxOTUsIDUxLDI0MywgMTUsMjA3LCA2MywyNTUgfSwKKyAgeyAxMjgsIDY0LDE3NiwxMTIsMTQwLCA3NiwxODgsMTI0LDEzMSwgNjcsMTc5LDExNSwxNDMsIDc5LDE5MSwxMjcgfSwKKyAgeyAgMzIsMjI0LCAxNiwyMDgsIDQ0LDIzNiwgMjgsMjIwLCAzNSwyMjcsIDE5LDIxMSwgNDcsMjM5LCAzMSwyMjMgfSwKKyAgeyAxNjAsIDk2LDE0NCwgODAsMTcyLDEwOCwxNTYsIDkyLDE2MywgOTksMTQ3LCA4MywxNzUsMTExLDE1OSwgOTUgfSwKKyAgeyAgIDgsMjAwLCA1NiwyNDgsICA0LDE5NiwgNTIsMjQ0LCAxMSwyMDMsIDU5LDI1MSwgIDcsMTk5LCA1NSwyNDcgfSwKKyAgeyAxMzYsIDcyLDE4NCwxMjAsMTMyLCA2OCwxODAsMTE2LDEzOSwgNzUsMTg3LDEyMywxMzUsIDcxLDE4MywxMTkgfSwKKyAgeyAgNDAsMjMyLCAyNCwyMTYsIDM2LDIyOCwgMjAsMjEyLCA0MywyMzUsIDI3LDIxOSwgMzksMjMxLCAyMywyMTUgfSwKKyAgeyAxNjgsMTA0LDE1MiwgODgsMTY0LDEwMCwxNDgsIDg0LDE3MSwxMDcsMTU1LCA5MSwxNjcsMTAzLDE1MSwgODcgfSwKKyAgeyAgIDIsMTk0LCA1MCwyNDIsIDE0LDIwNiwgNjIsMjU0LCAgMSwxOTMsIDQ5LDI0MSwgMTMsMjA1LCA2MSwyNTMgfSwKKyAgeyAxMzAsIDY2LDE3OCwxMTQsMTQyLCA3OCwxOTAsMTI2LDEyOSwgNjUsMTc3LDExMywxNDEsIDc3LDE4OSwxMjUgfSwKKyAgeyAgMzQsMjI2LCAxOCwyMTAsIDQ2LDIzOCwgMzAsMjIyLCAzMywyMjUsIDE3LDIwOSwgNDUsMjM3LCAyOSwyMjEgfSwKKyAgeyAxNjIsIDk4LDE0NiwgODIsMTc0LDExMCwxNTgsIDk0LDE2MSwgOTcsMTQ1LCA4MSwxNzMsMTA5LDE1NywgOTMgfSwKKyAgeyAgMTAsMjAyLCA1OCwyNTAsICA2LDE5OCwgNTQsMjQ2LCAgOSwyMDEsIDU3LDI0OSwgIDUsMTk3LCA1MywyNDUgfSwKKyAgeyAxMzgsIDc0LDE4NiwxMjIsMTM0LCA3MCwxODIsMTE4LDEzNywgNzMsMTg1LDEyMSwxMzMsIDY5LDE4MSwxMTcgfSwKKyAgeyAgNDIsMjM0LCAyNiwyMTgsIDM4LDIzMCwgMjIsMjE0LCA0MSwyMzMsIDI1LDIxNywgMzcsMjI5LCAyMSwyMTMgfSwKKyAgeyAxNzAsMTA2LDE1NCwgOTAsMTY2LDEwMiwxNTAsIDg2LDE2OSwxMDUsMTUzLCA4OSwxNjUsMTAxLDE0OSwgODUgfQorfTsKKworCisvKiBEZWNsYXJhdGlvbnMgZm9yIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKgorICogRXJyb3JzIGFyZSBhY2N1bXVsYXRlZCBpbnRvIHRoZSBhcnJheSBmc2Vycm9yc1tdLCBhdCBhIHJlc29sdXRpb24gb2YKKyAqIDEvMTZ0aCBvZiBhIHBpeGVsIGNvdW50LiAgVGhlIGVycm9yIGF0IGEgZ2l2ZW4gcGl4ZWwgaXMgcHJvcGFnYXRlZAorICogdG8gaXRzIG5vdC15ZXQtcHJvY2Vzc2VkIG5laWdoYm9ycyB1c2luZyB0aGUgc3RhbmRhcmQgRi1TIGZyYWN0aW9ucywKKyAqCQkuLi4JKGhlcmUpCTcvMTYKKyAqCQkzLzE2CTUvMTYJMS8xNgorICogV2Ugd29yayBsZWZ0LXRvLXJpZ2h0IG9uIGV2ZW4gcm93cywgcmlnaHQtdG8tbGVmdCBvbiBvZGQgcm93cy4KKyAqCisgKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBhIHNpbmdsZSBhcnJheSAoaG9sZGluZyBvbmUgcm93J3Mgd29ydGggb2YgZXJyb3JzKQorICogYnkgdXNpbmcgaXQgdG8gc3RvcmUgdGhlIGN1cnJlbnQgcm93J3MgZXJyb3JzIGF0IHBpeGVsIGNvbHVtbnMgbm90IHlldAorICogcHJvY2Vzc2VkLCBidXQgdGhlIG5leHQgcm93J3MgZXJyb3JzIGF0IGNvbHVtbnMgYWxyZWFkeSBwcm9jZXNzZWQuICBXZQorICogbmVlZCBvbmx5IGEgZmV3IGV4dHJhIHZhcmlhYmxlcyB0byBob2xkIHRoZSBlcnJvcnMgaW1tZWRpYXRlbHkgYXJvdW5kIHRoZQorICogY3VycmVudCBjb2x1bW4uICAoSWYgd2UgYXJlIGx1Y2t5LCB0aG9zZSB2YXJpYWJsZXMgYXJlIGluIHJlZ2lzdGVycywgYnV0CisgKiBldmVuIGlmIG5vdCwgdGhleSdyZSBwcm9iYWJseSBjaGVhcGVyIHRvIGFjY2VzcyB0aGFuIGFycmF5IGVsZW1lbnRzIGFyZS4pCisgKgorICogVGhlIGZzZXJyb3JzW10gYXJyYXkgaXMgaW5kZXhlZCBbY29tcG9uZW50I11bcG9zaXRpb25dLgorICogV2UgcHJvdmlkZSAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzIHBlciBjb21wb25lbnQ7IHRoZSBleHRyYSBlbnRyeSBhdCBlYWNoCisgKiBlbmQgc2F2ZXMgdXMgZnJvbSBzcGVjaWFsLWNhc2luZyB0aGUgZmlyc3QgYW5kIGxhc3QgcGl4ZWxzLgorICoKKyAqIE5vdGU6IG9uIGEgd2lkZSBpbWFnZSwgd2UgbWlnaHQgbm90IGhhdmUgZW5vdWdoIHJvb20gaW4gYSBQQydzIG5lYXIgZGF0YQorICogc2VnbWVudCB0byBob2xkIHRoZSBlcnJvciBhcnJheTsgc28gaXQgaXMgYWxsb2NhdGVkIHdpdGggYWxsb2NfbGFyZ2UuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Cit0eXBlZGVmIElOVDE2IEZTRVJST1I7CQkvKiAxNiBiaXRzIHNob3VsZCBiZSBlbm91Z2ggKi8KK3R5cGVkZWYgaW50IExPQ0ZTRVJST1I7CQkvKiB1c2UgJ2ludCcgZm9yIGNhbGN1bGF0aW9uIHRlbXBzICovCisjZWxzZQordHlwZWRlZiBJTlQzMiBGU0VSUk9SOwkJLyogbWF5IG5lZWQgbW9yZSB0aGFuIDE2IGJpdHMgKi8KK3R5cGVkZWYgSU5UMzIgTE9DRlNFUlJPUjsJLyogYmUgc3VyZSBjYWxjdWxhdGlvbiB0ZW1wcyBhcmUgYmlnIGVub3VnaCAqLworI2VuZGlmCisKK3R5cGVkZWYgRlNFUlJPUiBGQVIgKkZTRVJSUFRSOwkvKiBwb2ludGVyIHRvIGVycm9yIGFycmF5IChpbiBGQVIgc3RvcmFnZSEpICovCisKKworLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KKworI2RlZmluZSBNQVhfUV9DT01QUyA0CQkvKiBtYXggY29tcG9uZW50cyBJIGNhbiBoYW5kbGUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogSW5pdGlhbGx5IGFsbG9jYXRlZCBjb2xvcm1hcCBpcyBzYXZlZCBoZXJlICovCisgIEpTQU1QQVJSQVkgc3ZfY29sb3JtYXA7CS8qIFRoZSBjb2xvciBtYXAgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgKi8KKyAgaW50IHN2X2FjdHVhbDsJCS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLworCisgIEpTQU1QQVJSQVkgY29sb3JpbmRleDsJLyogUHJlY29tcHV0ZWQgbWFwcGluZyBmb3Igc3BlZWQgKi8KKyAgLyogY29sb3JpbmRleFtpXVtqXSA9IGluZGV4IG9mIGNvbG9yIGNsb3Nlc3QgdG8gcGl4ZWwgdmFsdWUgaiBpbiBjb21wb25lbnQgaSwKKyAgICogcHJlbXVsdGlwbGllZCBhcyBkZXNjcmliZWQgYWJvdmUuICBTaW5jZSBjb2xvcm1hcCBpbmRleGVzIG11c3QgZml0IGludG8KKyAgICogSlNBTVBMRXMsIHRoZSBlbnRyaWVzIG9mIHRoaXMgYXJyYXkgd2lsbCB0b28uCisgICAqLworICBib29sZWFuIGlzX3BhZGRlZDsJCS8qIGlzIHRoZSBjb2xvcmluZGV4IHBhZGRlZCBmb3Igb2RpdGhlcj8gKi8KKworICBpbnQgTmNvbG9yc1tNQVhfUV9DT01QU107CS8qICMgb2YgdmFsdWVzIGFsbG9jZWQgdG8gZWFjaCBjb21wb25lbnQgKi8KKworICAvKiBWYXJpYWJsZXMgZm9yIG9yZGVyZWQgZGl0aGVyaW5nICovCisgIGludCByb3dfaW5kZXg7CQkvKiBjdXIgcm93J3MgdmVydGljYWwgaW5kZXggaW4gZGl0aGVyIG1hdHJpeCAqLworICBPRElUSEVSX01BVFJJWF9QVFIgb2RpdGhlcltNQVhfUV9DT01QU107IC8qIG9uZSBkaXRoZXIgYXJyYXkgcGVyIGNvbXBvbmVudCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yc1tNQVhfUV9DT01QU107IC8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KK30gbXlfY3F1YW50aXplcjsKKwordHlwZWRlZiBteV9jcXVhbnRpemVyICogbXlfY3F1YW50aXplX3B0cjsKKworCisvKgorICogUG9saWN5LW1ha2luZyBzdWJyb3V0aW5lcyBmb3IgY3JlYXRlX2NvbG9ybWFwIGFuZCBjcmVhdGVfY29sb3JpbmRleC4KKyAqIFRoZXNlIHJvdXRpbmVzIGRldGVybWluZSB0aGUgY29sb3JtYXAgdG8gYmUgdXNlZC4gIFRoZSByZXN0IG9mIHRoZSBtb2R1bGUKKyAqIG9ubHkgYXNzdW1lcyB0aGF0IHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLgorICoKKyAqICAqIHNlbGVjdF9uY29sb3JzIGRlY2lkZXMgaG93IHRvIGRpdnZ5IHVwIHRoZSBhdmFpbGFibGUgY29sb3JzCisgKiAgICBhbW9uZyB0aGUgY29tcG9uZW50cy4KKyAqICAqIG91dHB1dF92YWx1ZSBkZWZpbmVzIHRoZSBzZXQgb2YgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqICAqIGxhcmdlc3RfaW5wdXRfdmFsdWUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGlucHV0IHZhbHVlcyB0bworICogICAgcmVwcmVzZW50YXRpdmUgdmFsdWVzIGZvciBhIGNvbXBvbmVudC4KKyAqIE5vdGUgdGhhdCB0aGUgbGF0dGVyIHR3byByb3V0aW5lcyBtYXkgaW1wb3NlIGRpZmZlcmVudCBwb2xpY2llcyBmb3IKKyAqIGRpZmZlcmVudCBjb21wb25lbnRzLCB0aG91Z2ggdGhpcyBpcyBub3QgY3VycmVudGx5IGRvbmUuCisgKi8KKworCitMT0NBTChpbnQpCitzZWxlY3RfbmNvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IE5jb2xvcnNbXSkKKy8qIERldGVybWluZSBhbGxvY2F0aW9uIG9mIGRlc2lyZWQgY29sb3JzIHRvIGNvbXBvbmVudHMsICovCisvKiBhbmQgZmlsbCBpbiBOY29sb3JzW10gYXJyYXkgdG8gaW5kaWNhdGUgY2hvaWNlLiAqLworLyogUmV0dXJuIHZhbHVlIGlzIHRvdGFsIG51bWJlciBvZiBjb2xvcnMgKHByb2R1Y3Qgb2YgTmNvbG9yc1tdIHZhbHVlcykuICovCit7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgLyogbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMgKi8KKyAgaW50IG1heF9jb2xvcnMgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgdG90YWxfY29sb3JzLCBpcm9vdCwgaSwgajsKKyAgYm9vbGVhbiBjaGFuZ2VkOworICBsb25nIHRlbXA7CisgIHN0YXRpYyBjb25zdCBpbnQgUkdCX29yZGVyWzNdID0geyBSR0JfR1JFRU4sIFJHQl9SRUQsIFJHQl9CTFVFIH07CisKKyAgLyogV2UgY2FuIGFsbG9jYXRlIGF0IGxlYXN0IHRoZSBuYyd0aCByb290IG9mIG1heF9jb2xvcnMgcGVyIGNvbXBvbmVudC4gKi8KKyAgLyogQ29tcHV0ZSBmbG9vcihuYyd0aCByb290IG9mIG1heF9jb2xvcnMpLiAqLworICBpcm9vdCA9IDE7CisgIGRvIHsKKyAgICBpcm9vdCsrOworICAgIHRlbXAgPSBpcm9vdDsJCS8qIHNldCB0ZW1wID0gaXJvb3QgKiogbmMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbmM7IGkrKykKKyAgICAgIHRlbXAgKj0gaXJvb3Q7CisgIH0gd2hpbGUgKHRlbXAgPD0gKGxvbmcpIG1heF9jb2xvcnMpOyAvKiByZXBlYXQgdGlsbCBpcm9vdCBleGNlZWRzIHJvb3QgKi8KKyAgaXJvb3QtLTsJCQkvKiBub3cgaXJvb3QgPSBmbG9vcihyb290KSAqLworCisgIC8qIE11c3QgaGF2ZSBhdCBsZWFzdCAyIGNvbG9yIHZhbHVlcyBwZXIgY29tcG9uZW50ICovCisgIGlmIChpcm9vdCA8IDIpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfRkVXX0NPTE9SUywgKGludCkgdGVtcCk7CisKKyAgLyogSW5pdGlhbGl6ZSB0byBpcm9vdCBjb2xvciB2YWx1ZXMgZm9yIGVhY2ggY29tcG9uZW50ICovCisgIHRvdGFsX2NvbG9ycyA9IDE7CisgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgTmNvbG9yc1tpXSA9IGlyb290OworICAgIHRvdGFsX2NvbG9ycyAqPSBpcm9vdDsKKyAgfQorICAvKiBXZSBtYXkgYmUgYWJsZSB0byBpbmNyZW1lbnQgdGhlIGNvdW50IGZvciBvbmUgb3IgbW9yZSBjb21wb25lbnRzIHdpdGhvdXQKKyAgICogZXhjZWVkaW5nIG1heF9jb2xvcnMsIHRob3VnaCB3ZSBrbm93IG5vdCBhbGwgY2FuIGJlIGluY3JlbWVudGVkLgorICAgKiBTb21ldGltZXMsIHRoZSBmaXJzdCBjb21wb25lbnQgY2FuIGJlIGluY3JlbWVudGVkIG1vcmUgdGhhbiBvbmNlIQorICAgKiAoRXhhbXBsZTogZm9yIDE2IGNvbG9ycywgd2Ugc3RhcnQgYXQgMioyKjIsIGdvIHRvIDMqMioyLCB0aGVuIDQqMioyLikKKyAgICogSW4gUkdCIGNvbG9yc3BhY2UsIHRyeSB0byBpbmNyZW1lbnQgRyBmaXJzdCwgdGhlbiBSLCB0aGVuIEIuCisgICAqLworICBkbyB7CisgICAgY2hhbmdlZCA9IEZBTFNFOworICAgIGZvciAoaSA9IDA7IGkgPCBuYzsgaSsrKSB7CisgICAgICBqID0gKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQiA/IFJHQl9vcmRlcltpXSA6IGkpOworICAgICAgLyogY2FsY3VsYXRlIG5ldyB0b3RhbF9jb2xvcnMgaWYgTmNvbG9yc1tqXSBpcyBpbmNyZW1lbnRlZCAqLworICAgICAgdGVtcCA9IHRvdGFsX2NvbG9ycyAvIE5jb2xvcnNbal07CisgICAgICB0ZW1wICo9IE5jb2xvcnNbal0rMTsJLyogZG9uZSBpbiBsb25nIGFyaXRoIHRvIGF2b2lkIG9mbG8gKi8KKyAgICAgIGlmICh0ZW1wID4gKGxvbmcpIG1heF9jb2xvcnMpCisJYnJlYWs7CQkJLyogd29uJ3QgZml0LCBkb25lIHdpdGggdGhpcyBwYXNzICovCisgICAgICBOY29sb3JzW2pdKys7CQkvKiBPSywgYXBwbHkgdGhlIGluY3JlbWVudCAqLworICAgICAgdG90YWxfY29sb3JzID0gKGludCkgdGVtcDsKKyAgICAgIGNoYW5nZWQgPSBUUlVFOworICAgIH0KKyAgfSB3aGlsZSAoY2hhbmdlZCk7CisKKyAgcmV0dXJuIHRvdGFsX2NvbG9yczsKK30KKworCitMT0NBTChpbnQpCitvdXRwdXRfdmFsdWUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBjaSwgaW50IGosIGludCBtYXhqKQorLyogUmV0dXJuIGondGggb3V0cHV0IHZhbHVlLCB3aGVyZSBqIHdpbGwgcmFuZ2UgZnJvbSAwIHRvIG1heGogKi8KKy8qIFRoZSBvdXRwdXQgdmFsdWVzIG11c3QgZmFsbCBpbiAwLi5NQVhKU0FNUExFIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KK3sKKyAgLyogV2UgYWx3YXlzIHByb3ZpZGUgdmFsdWVzIDAgYW5kIE1BWEpTQU1QTEUgZm9yIGVhY2ggY29tcG9uZW50OworICAgKiBhbnkgYWRkaXRpb25hbCB2YWx1ZXMgYXJlIGVxdWFsbHkgc3BhY2VkIGJldHdlZW4gdGhlc2UgbGltaXRzLgorICAgKiAoRm9yY2luZyB0aGUgdXBwZXIgYW5kIGxvd2VyIHZhbHVlcyB0byB0aGUgbGltaXRzIGVuc3VyZXMgdGhhdAorICAgKiBkaXRoZXJpbmcgY2FuJ3QgcHJvZHVjZSBhIGNvbG9yIG91dHNpZGUgdGhlIHNlbGVjdGVkIGdhbXV0LikKKyAgICovCisgIHJldHVybiAoaW50KSAoKChJTlQzMikgaiAqIE1BWEpTQU1QTEUgKyBtYXhqLzIpIC8gbWF4aik7Cit9CisKKworTE9DQUwoaW50KQorbGFyZ2VzdF9pbnB1dF92YWx1ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGNpLCBpbnQgaiwgaW50IG1heGopCisvKiBSZXR1cm4gbGFyZ2VzdCBpbnB1dCB2YWx1ZSB0aGF0IHNob3VsZCBtYXAgdG8gaid0aCBvdXRwdXQgdmFsdWUgKi8KKy8qIE11c3QgaGF2ZSBsYXJnZXN0KGo9MCkgPj0gMCwgYW5kIGxhcmdlc3Qoaj1tYXhqKSA+PSBNQVhKU0FNUExFICovCit7CisgIC8qIEJyZWFrcG9pbnRzIGFyZSBoYWxmd2F5IGJldHdlZW4gdmFsdWVzIHJldHVybmVkIGJ5IG91dHB1dF92YWx1ZSAqLworICByZXR1cm4gKGludCkgKCgoSU5UMzIpICgyKmogKyAxKSAqIE1BWEpTQU1QTEUgKyBtYXhqKSAvICgyKm1heGopKTsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvcm1hcC4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9ybWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogQ3JlYXRlZCBjb2xvcm1hcCAqLworICBpbnQgdG90YWxfY29sb3JzOwkJLyogTnVtYmVyIG9mIGRpc3RpbmN0IG91dHB1dCBjb2xvcnMgKi8KKyAgaW50IGksaixrLCBuY2ksIGJsa3NpemUsIGJsa2Rpc3QsIHB0ciwgdmFsOworCisgIC8qIFNlbGVjdCBudW1iZXIgb2YgY29sb3JzIGZvciBlYWNoIGNvbXBvbmVudCAqLworICB0b3RhbF9jb2xvcnMgPSBzZWxlY3RfbmNvbG9ycyhjaW5mbywgY3F1YW50aXplLT5OY29sb3JzKTsKKworICAvKiBSZXBvcnQgc2VsZWN0ZWQgY29sb3IgY291bnRzICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICBUUkFDRU1TNChjaW5mbywgMSwgSlRSQ19RVUFOVF8zX05DT0xPUlMsCisJICAgICB0b3RhbF9jb2xvcnMsIGNxdWFudGl6ZS0+TmNvbG9yc1swXSwKKwkgICAgIGNxdWFudGl6ZS0+TmNvbG9yc1sxXSwgY3F1YW50aXplLT5OY29sb3JzWzJdKTsKKyAgZWxzZQorICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX1FVQU5UX05DT0xPUlMsIHRvdGFsX2NvbG9ycyk7CisKKyAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbG9ybWFwLiAqLworICAvKiBUaGUgY29sb3JzIGFyZSBvcmRlcmVkIGluIHRoZSBtYXAgaW4gc3RhbmRhcmQgcm93LW1ham9yIG9yZGVyLCAqLworICAvKiBpLmUuIHJpZ2h0bW9zdCAoaGlnaGVzdC1pbmRleGVkKSBjb2xvciBjaGFuZ2VzIG1vc3QgcmFwaWRseS4gKi8KKworICBjb2xvcm1hcCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSB0b3RhbF9jb2xvcnMsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMpOworCisgIC8qIGJsa3NpemUgaXMgbnVtYmVyIG9mIGFkamFjZW50IHJlcGVhdGVkIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIC8qIGJsa2Rpc3QgaXMgZGlzdGFuY2UgYmV0d2VlbiBncm91cHMgb2YgaWRlbnRpY2FsIGVudHJpZXMgZm9yIGEgY29tcG9uZW50ICovCisgIGJsa2Rpc3QgPSB0b3RhbF9jb2xvcnM7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgLyogZmlsbCBpbiBjb2xvcm1hcCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrZGlzdCAvIG5jaTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbmNpOyBqKyspIHsKKyAgICAgIC8qIENvbXB1dGUgaid0aCBvdXRwdXQgdmFsdWUgKG91dCBvZiBuY2kpIGZvciBjb21wb25lbnQgKi8KKyAgICAgIHZhbCA9IG91dHB1dF92YWx1ZShjaW5mbywgaSwgaiwgbmNpLTEpOworICAgICAgLyogRmlsbCBpbiBhbGwgY29sb3JtYXAgZW50cmllcyB0aGF0IGhhdmUgdGhpcyB2YWx1ZSBvZiB0aGlzIGNvbXBvbmVudCAqLworICAgICAgZm9yIChwdHIgPSBqICogYmxrc2l6ZTsgcHRyIDwgdG90YWxfY29sb3JzOyBwdHIgKz0gYmxrZGlzdCkgeworCS8qIGZpbGwgaW4gYmxrc2l6ZSBlbnRyaWVzIGJlZ2lubmluZyBhdCBwdHIgKi8KKwlmb3IgKGsgPSAwOyBrIDwgYmxrc2l6ZTsgaysrKQorCSAgY29sb3JtYXBbaV1bcHRyK2tdID0gKEpTQU1QTEUpIHZhbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxrZGlzdCA9IGJsa3NpemU7CQkvKiBibGtzaXplIG9mIHRoaXMgY29sb3IgaXMgYmxrZGlzdCBvZiBuZXh0ICovCisgIH0KKworICAvKiBTYXZlIHRoZSBjb2xvcm1hcCBpbiBwcml2YXRlIHN0b3JhZ2UsCisgICAqIHdoZXJlIGl0IHdpbGwgc3Vydml2ZSBjb2xvciBxdWFudGl6YXRpb24gbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgY3F1YW50aXplLT5zdl9jb2xvcm1hcCA9IGNvbG9ybWFwOworICBjcXVhbnRpemUtPnN2X2FjdHVhbCA9IHRvdGFsX2NvbG9yczsKK30KKworCisvKgorICogQ3JlYXRlIHRoZSBjb2xvciBpbmRleCB0YWJsZS4KKyAqLworCitMT0NBTCh2b2lkKQorY3JlYXRlX2NvbG9yaW5kZXggKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIEpTQU1QUk9XIGluZGV4cHRyOworICBpbnQgaSxqLGssIG5jaSwgYmxrc2l6ZSwgdmFsLCBwYWQ7CisKKyAgLyogRm9yIG9yZGVyZWQgZGl0aGVyLCB3ZSBwYWQgdGhlIGNvbG9yIGluZGV4IHRhYmxlcyBieSBNQVhKU0FNUExFIGluCisgICAqIGVhY2ggZGlyZWN0aW9uIChpbnB1dCBpbmRleCB2YWx1ZXMgY2FuIGJlIC1NQVhKU0FNUExFIC4uIDIqTUFYSlNBTVBMRSkuCisgICAqIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpbiB0aGUgb3RoZXIgZGl0aGVyaW5nIG1vZGVzLiAgSG93ZXZlciwgd2UKKyAgICogZmxhZyB3aGV0aGVyIGl0IHdhcyBkb25lIGluIGNhc2UgdXNlciBjaGFuZ2VzIGRpdGhlcmluZyBtb2RlLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX09SREVSRUQpIHsKKyAgICBwYWQgPSBNQVhKU0FNUExFKjI7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBUUlVFOworICB9IGVsc2UgeworICAgIHBhZCA9IDA7CisgICAgY3F1YW50aXplLT5pc19wYWRkZWQgPSBGQUxTRTsKKyAgfQorCisgIGNxdWFudGl6ZS0+Y29sb3JpbmRleCA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIChKRElNRU5TSU9OKSAoTUFYSlNBTVBMRSsxICsgcGFkKSwKKyAgICAgKEpESU1FTlNJT04pIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyk7CisKKyAgLyogYmxrc2l6ZSBpcyBudW1iZXIgb2YgYWRqYWNlbnQgcmVwZWF0ZWQgZW50cmllcyBmb3IgYSBjb21wb25lbnQgKi8KKyAgYmxrc2l6ZSA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykgeworICAgIC8qIGZpbGwgaW4gY29sb3JpbmRleCBlbnRyaWVzIGZvciBpJ3RoIGNvbG9yIGNvbXBvbmVudCAqLworICAgIG5jaSA9IGNxdWFudGl6ZS0+TmNvbG9yc1tpXTsgLyogIyBvZiBkaXN0aW5jdCB2YWx1ZXMgZm9yIHRoaXMgY29sb3IgKi8KKyAgICBibGtzaXplID0gYmxrc2l6ZSAvIG5jaTsKKworICAgIC8qIGFkanVzdCBjb2xvcmluZGV4IHBvaW50ZXJzIHRvIHByb3ZpZGUgcGFkZGluZyBhdCBuZWdhdGl2ZSBpbmRleGVzLiAqLworICAgIGlmIChwYWQpCisgICAgICBjcXVhbnRpemUtPmNvbG9yaW5kZXhbaV0gKz0gTUFYSlNBTVBMRTsKKworICAgIC8qIGluIGxvb3AsIHZhbCA9IGluZGV4IG9mIGN1cnJlbnQgb3V0cHV0IHZhbHVlLCAqLworICAgIC8qIGFuZCBrID0gbGFyZ2VzdCBqIHRoYXQgbWFwcyB0byBjdXJyZW50IHZhbCAqLworICAgIGluZGV4cHRyID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2ldOworICAgIHZhbCA9IDA7CisgICAgayA9IGxhcmdlc3RfaW5wdXRfdmFsdWUoY2luZm8sIGksIDAsIG5jaS0xKTsKKyAgICBmb3IgKGogPSAwOyBqIDw9IE1BWEpTQU1QTEU7IGorKykgeworICAgICAgd2hpbGUgKGogPiBrKQkJLyogYWR2YW5jZSB2YWwgaWYgcGFzdCBib3VuZGFyeSAqLworCWsgPSBsYXJnZXN0X2lucHV0X3ZhbHVlKGNpbmZvLCBpLCArK3ZhbCwgbmNpLTEpOworICAgICAgLyogcHJlbXVsdGlwbHkgc28gdGhhdCBubyBtdWx0aXBsaWNhdGlvbiBuZWVkZWQgaW4gbWFpbiBwcm9jZXNzaW5nICovCisgICAgICBpbmRleHB0cltqXSA9IChKU0FNUExFKSAodmFsICogYmxrc2l6ZSk7CisgICAgfQorICAgIC8qIFBhZCBhdCBib3RoIGVuZHMgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKHBhZCkKKyAgICAgIGZvciAoaiA9IDE7IGogPD0gTUFYSlNBTVBMRTsgaisrKSB7CisJaW5kZXhwdHJbLWpdID0gaW5kZXhwdHJbMF07CisJaW5kZXhwdHJbTUFYSlNBTVBMRStqXSA9IGluZGV4cHRyW01BWEpTQU1QTEVdOworICAgICAgfQorICB9Cit9CisKKworLyoKKyAqIENyZWF0ZSBhbiBvcmRlcmVkLWRpdGhlciBhcnJheSBmb3IgYSBjb21wb25lbnQgaGF2aW5nIG5jb2xvcnMKKyAqIGRpc3RpbmN0IG91dHB1dCB2YWx1ZXMuCisgKi8KKworTE9DQUwoT0RJVEhFUl9NQVRSSVhfUFRSKQorbWFrZV9vZGl0aGVyX2FycmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbmNvbG9ycykKK3sKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBqLGs7CisgIElOVDMyIG51bSxkZW47CisKKyAgb2RpdGhlciA9IChPRElUSEVSX01BVFJJWF9QVFIpCisgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQlTSVpFT0YoT0RJVEhFUl9NQVRSSVgpKTsKKyAgLyogVGhlIGludGVyLXZhbHVlIGRpc3RhbmNlIGZvciB0aGlzIGNvbG9yIGlzIE1BWEpTQU1QTEUvKG5jb2xvcnMtMSkuCisgICAqIEhlbmNlIHRoZSBkaXRoZXIgdmFsdWUgZm9yIHRoZSBtYXRyaXggY2VsbCB3aXRoIGZpbGwgb3JkZXIgZgorICAgKiAoZj0wLi5OLTEpIHNob3VsZCBiZSAoTi0xLTIqZikvKDIqTikgKiBNQVhKU0FNUExFLyhuY29sb3JzLTEpLgorICAgKiBPbiAxNi1iaXQtaW50IG1hY2hpbmUsIGJlIGNhcmVmdWwgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAqLworICBkZW4gPSAyICogT0RJVEhFUl9DRUxMUyAqICgoSU5UMzIpIChuY29sb3JzIC0gMSkpOworICBmb3IgKGogPSAwOyBqIDwgT0RJVEhFUl9TSVpFOyBqKyspIHsKKyAgICBmb3IgKGsgPSAwOyBrIDwgT0RJVEhFUl9TSVpFOyBrKyspIHsKKyAgICAgIG51bSA9ICgoSU5UMzIpIChPRElUSEVSX0NFTExTLTEgLSAyKigoaW50KWJhc2VfZGl0aGVyX21hdHJpeFtqXVtrXSkpKQorCSAgICAqIE1BWEpTQU1QTEU7CisgICAgICAvKiBFbnN1cmUgcm91bmQgdG93YXJkcyB6ZXJvIGRlc3BpdGUgQydzIGxhY2sgb2YgY29uc2lzdGVuY3kKKyAgICAgICAqIGFib3V0IHJvdW5kaW5nIG5lZ2F0aXZlIHZhbHVlcyBpbiBpbnRlZ2VyIGRpdmlzaW9uLi4uCisgICAgICAgKi8KKyAgICAgIG9kaXRoZXJbal1ba10gPSAoaW50KSAobnVtPDAgPyAtKCgtbnVtKS9kZW4pIDogbnVtL2Rlbik7CisgICAgfQorICB9CisgIHJldHVybiBvZGl0aGVyOworfQorCisKKy8qCisgKiBDcmVhdGUgdGhlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcy4KKyAqIENvbXBvbmVudHMgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSBjb2xvcnMgbWF5IAorICogc2hhcmUgYSBkaXRoZXIgdGFibGUuCisgKi8KKworTE9DQUwodm9pZCkKK2NyZWF0ZV9vZGl0aGVyX3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgT0RJVEhFUl9NQVRSSVhfUFRSIG9kaXRoZXI7CisgIGludCBpLCBqLCBuY2k7CisKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgbmNpID0gY3F1YW50aXplLT5OY29sb3JzW2ldOyAvKiAjIG9mIGRpc3RpbmN0IHZhbHVlcyBmb3IgdGhpcyBjb2xvciAqLworICAgIG9kaXRoZXIgPSBOVUxMOwkJLyogc2VhcmNoIGZvciBtYXRjaGluZyBwcmlvciBjb21wb25lbnQgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICBpZiAobmNpID09IGNxdWFudGl6ZS0+TmNvbG9yc1tqXSkgeworCW9kaXRoZXIgPSBjcXVhbnRpemUtPm9kaXRoZXJbal07CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChvZGl0aGVyID09IE5VTEwpCS8qIG5lZWQgYSBuZXcgdGFibGU/ICovCisgICAgICBvZGl0aGVyID0gbWFrZV9vZGl0aGVyX2FycmF5KGNpbmZvLCBuY2kpOworICAgIGNxdWFudGl6ZS0+b2RpdGhlcltpXSA9IG9kaXRoZXI7CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NvbG9yX3F1YW50aXplIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBHZW5lcmFsIGNhc2UsIG5vIGRpdGhlcmluZyAqLworeworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBKU0FNUEFSUkFZIGNvbG9yaW5kZXggPSBjcXVhbnRpemUtPmNvbG9yaW5kZXg7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlLCBjaTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyaW4sIHB0cm91dDsKKyAgaW50IHJvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIEpESU1FTlNJT04gd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoOworICByZWdpc3RlciBpbnQgbmMgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHJpbiA9IGlucHV0X2J1Zltyb3ddOworICAgIHB0cm91dCA9IG91dHB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSA9IDA7CisgICAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworCXBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4W2NpXVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgfQorICAgICAgKnB0cm91dCsrID0gKEpTQU1QTEUpIHBpeGNvZGU7CisgICAgfQorICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitjb2xvcl9xdWFudGl6ZTMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgcmVnaXN0ZXIgaW50IHBpeGNvZGU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cmluLCBwdHJvdXQ7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIHB0cmluID0gaW5wdXRfYnVmW3Jvd107CisgICAgcHRyb3V0ID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICBwaXhjb2RlICA9IEdFVEpTQU1QTEUoY29sb3JpbmRleDBbR0VUSlNBTVBMRSgqcHRyaW4rKyldKTsKKyAgICAgIHBpeGNvZGUgKz0gR0VUSlNBTVBMRShjb2xvcmluZGV4MVtHRVRKU0FNUExFKCpwdHJpbisrKV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKnB0cmluKyspXSk7CisgICAgICAqcHRyb3V0KysgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX29yZF9kaXRoZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgaW5wdXRfYnVmLAorCQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQorLyogR2VuZXJhbCBjYXNlLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHV0X3B0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHV0X3B0cjsKKyAgSlNBTVBST1cgY29sb3JpbmRleF9jaTsKKyAgaW50ICogZGl0aGVyOwkJCS8qIHBvaW50cyB0byBhY3RpdmUgcm93IG9mIGRpdGhlciBtYXRyaXggKi8KKyAgaW50IHJvd19pbmRleCwgY29sX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ZXMgaW50byBkaXRoZXIgbWF0cml4ICovCisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICAvKiBJbml0aWFsaXplIG91dHB1dCB2YWx1ZXMgdG8gMCBzbyBjYW4gcHJvY2VzcyBjb21wb25lbnRzIHNlcGFyYXRlbHkgKi8KKyAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIG91dHB1dF9idWZbcm93XSwKKwkgICAgICAoc2l6ZV90KSAod2lkdGggKiBTSVpFT0YoSlNBTVBMRSkpKTsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBuYzsgY2krKykgeworICAgICAgaW5wdXRfcHRyID0gaW5wdXRfYnVmW3Jvd10gKyBjaTsKKyAgICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW3Jvd107CisgICAgICBjb2xvcmluZGV4X2NpID0gY3F1YW50aXplLT5jb2xvcmluZGV4W2NpXTsKKyAgICAgIGRpdGhlciA9IGNxdWFudGl6ZS0+b2RpdGhlcltjaV1bcm93X2luZGV4XTsKKyAgICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisJLyogRm9ybSBwaXhlbCB2YWx1ZSArIGRpdGhlciwgcmFuZ2UtbGltaXQgdG8gMC4uTUFYSlNBTVBMRSwKKwkgKiBzZWxlY3Qgb3V0cHV0IHZhbHVlLCBhY2N1bXVsYXRlIGludG8gb3V0cHV0IGNvZGUgZm9yIHRoaXMgcGl4ZWwuCisJICogUmFuZ2UtbGltaXRpbmcgbmVlZCBub3QgYmUgZG9uZSBleHBsaWNpdGx5LCBhcyB3ZSBoYXZlIGV4dGVuZGVkCisJICogdGhlIGNvbG9yaW5kZXggdGFibGUgdG8gcHJvZHVjZSB0aGUgcmlnaHQgYW5zd2VycyBmb3Igb3V0LW9mLXJhbmdlCisJICogaW5wdXRzLiAgVGhlIG1heGltdW0gZGl0aGVyIGlzICstIE1BWEpTQU1QTEU7IHRoaXMgc2V0cyB0aGUKKwkgKiByZXF1aXJlZCBhbW91bnQgb2YgcGFkZGluZy4KKwkgKi8KKwkqb3V0cHV0X3B0ciArPSBjb2xvcmluZGV4X2NpW0dFVEpTQU1QTEUoKmlucHV0X3B0cikrZGl0aGVyW2NvbF9pbmRleF1dOworCWlucHV0X3B0ciArPSBuYzsKKwlvdXRwdXRfcHRyKys7CisJY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgICAgfQorICAgIH0KKyAgICAvKiBBZHZhbmNlIHJvdyBpbmRleCBmb3IgbmV4dCByb3cgKi8KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplM19vcmRfZGl0aGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKKwkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCisvKiBGYXN0IHBhdGggZm9yIG91dF9jb2xvcl9jb21wb25lbnRzPT0zLCB3aXRoIG9yZGVyZWQgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIGludCBwaXhjb2RlOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB1dF9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB1dF9wdHI7CisgIEpTQU1QUk9XIGNvbG9yaW5kZXgwID0gY3F1YW50aXplLT5jb2xvcmluZGV4WzBdOworICBKU0FNUFJPVyBjb2xvcmluZGV4MSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFsxXTsKKyAgSlNBTVBST1cgY29sb3JpbmRleDIgPSBjcXVhbnRpemUtPmNvbG9yaW5kZXhbMl07CisgIGludCAqIGRpdGhlcjA7CQkvKiBwb2ludHMgdG8gYWN0aXZlIHJvdyBvZiBkaXRoZXIgbWF0cml4ICovCisgIGludCAqIGRpdGhlcjE7CisgIGludCAqIGRpdGhlcjI7CisgIGludCByb3dfaW5kZXgsIGNvbF9pbmRleDsJLyogY3VycmVudCBpbmRleGVzIGludG8gZGl0aGVyIG1hdHJpeCAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICByb3dfaW5kZXggPSBjcXVhbnRpemUtPnJvd19pbmRleDsKKyAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGRpdGhlcjAgPSBjcXVhbnRpemUtPm9kaXRoZXJbMF1bcm93X2luZGV4XTsKKyAgICBkaXRoZXIxID0gY3F1YW50aXplLT5vZGl0aGVyWzFdW3Jvd19pbmRleF07CisgICAgZGl0aGVyMiA9IGNxdWFudGl6ZS0+b2RpdGhlclsyXVtyb3dfaW5kZXhdOworICAgIGNvbF9pbmRleCA9IDA7CisKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgcGl4Y29kZSAgPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgwW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjBbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgxW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjFbY29sX2luZGV4XV0pOworICAgICAgcGl4Y29kZSArPSBHRVRKU0FNUExFKGNvbG9yaW5kZXgyW0dFVEpTQU1QTEUoKmlucHV0X3B0cisrKSArCisJCQkJCWRpdGhlcjJbY29sX2luZGV4XV0pOworICAgICAgKm91dHB1dF9wdHIrKyA9IChKU0FNUExFKSBwaXhjb2RlOworICAgICAgY29sX2luZGV4ID0gKGNvbF9pbmRleCArIDEpICYgT0RJVEhFUl9NQVNLOworICAgIH0KKyAgICByb3dfaW5kZXggPSAocm93X2luZGV4ICsgMSkgJiBPRElUSEVSX01BU0s7CisgICAgY3F1YW50aXplLT5yb3dfaW5kZXggPSByb3dfaW5kZXg7CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3F1YW50aXplX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIEdlbmVyYWwgY2FzZSwgd2l0aCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIExPQ0ZTRVJST1IgY3VyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnI7CQkvKiBlcnJvciBmb3IgcGl4ZWwgYmVsb3cgY3VyICovCisgIExPQ0ZTRVJST1IgYnByZXZlcnI7CQkvKiBlcnJvciBmb3IgYmVsb3cvcHJldiBjb2wgKi8KKyAgTE9DRlNFUlJPUiBibmV4dGVycjsJCS8qIGVycm9yIGZvciBiZWxvdy9uZXh0IGNvbCAqLworICBMT0NGU0VSUk9SIGRlbHRhOworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdXRfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdXRfcHRyOworICBKU0FNUFJPVyBjb2xvcmluZGV4X2NpOworICBKU0FNUFJPVyBjb2xvcm1hcF9jaTsKKyAgaW50IHBpeGNvZGU7CisgIGludCBuYyA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IGRpcjsJCQkvKiAxIGZvciBsZWZ0LXRvLXJpZ2h0LCAtMSBmb3IgcmlnaHQtdG8tbGVmdCAqLworICBpbnQgZGlybmM7CQkJLyogZGlyICogbmMgKi8KKyAgaW50IGNpOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIC8qIEluaXRpYWxpemUgb3V0cHV0IHZhbHVlcyB0byAwIHNvIGNhbiBwcm9jZXNzIGNvbXBvbmVudHMgc2VwYXJhdGVseSAqLworICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgb3V0cHV0X2J1Zltyb3ddLAorCSAgICAgIChzaXplX3QpICh3aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOworICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7CisgICAgICBpbnB1dF9wdHIgPSBpbnB1dF9idWZbcm93XSArIGNpOworICAgICAgb3V0cHV0X3B0ciA9IG91dHB1dF9idWZbcm93XTsKKyAgICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKwkvKiB3b3JrIHJpZ2h0IHRvIGxlZnQgaW4gdGhpcyByb3cgKi8KKwlpbnB1dF9wdHIgKz0gKHdpZHRoLTEpICogbmM7IC8qIHNvIHBvaW50IHRvIHJpZ2h0bW9zdCBwaXhlbCAqLworCW91dHB1dF9wdHIgKz0gd2lkdGgtMTsKKwlkaXIgPSAtMTsKKwlkaXJuYyA9IC1uYzsKKwllcnJvcnB0ciA9IGNxdWFudGl6ZS0+ZnNlcnJvcnNbY2ldICsgKHdpZHRoKzEpOyAvKiA9PiBlbnRyeSBhZnRlciBsYXN0IGNvbHVtbiAqLworICAgICAgfSBlbHNlIHsKKwkvKiB3b3JrIGxlZnQgdG8gcmlnaHQgaW4gdGhpcyByb3cgKi8KKwlkaXIgPSAxOworCWRpcm5jID0gbmM7CisJZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzW2NpXTsgLyogPT4gZW50cnkgYmVmb3JlIGZpcnN0IGNvbHVtbiAqLworICAgICAgfQorICAgICAgY29sb3JpbmRleF9jaSA9IGNxdWFudGl6ZS0+Y29sb3JpbmRleFtjaV07CisgICAgICBjb2xvcm1hcF9jaSA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXBbY2ldOworICAgICAgLyogUHJlc2V0IGVycm9yIHZhbHVlczogbm8gZXJyb3IgcHJvcGFnYXRlZCB0byBmaXJzdCBwaXhlbCBmcm9tIGxlZnQgKi8KKyAgICAgIGN1ciA9IDA7CisgICAgICAvKiBhbmQgbm8gZXJyb3IgcHJvcGFnYXRlZCB0byByb3cgYmVsb3cgeWV0ICovCisgICAgICBiZWxvd2VyciA9IGJwcmV2ZXJyID0gMDsKKworICAgICAgZm9yIChjb2wgPSB3aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKwkvKiBjdXIgaG9sZHMgdGhlIGVycm9yIHByb3BhZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgcGl4ZWwgb24gdGhlCisJICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKwkgKiB0byBmb3JtIHRoZSBjb21wbGV0ZSBlcnJvciBjb3JyZWN0aW9uIHRlcm0gZm9yIHRoaXMgcGl4ZWwsIGFuZAorCSAqIHJvdW5kIHRoZSBlcnJvciB0ZXJtICh3aGljaCBpcyBleHByZXNzZWQgKiAxNikgdG8gYW4gaW50ZWdlci4KKwkgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorCSAqIGZvciBlaXRoZXIgc2lnbiBvZiB0aGUgZXJyb3IgdmFsdWUuCisJICogTm90ZTogZXJyb3JwdHIgcG9pbnRzIHRvICpwcmV2aW91cyogY29sdW1uJ3MgYXJyYXkgZW50cnkuCisJICovCisJY3VyID0gUklHSFRfU0hJRlQoY3VyICsgZXJyb3JwdHJbZGlyXSArIDgsIDQpOworCS8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisJICogVGhlIG1heGltdW0gZXJyb3IgaXMgKy0gTUFYSlNBTVBMRTsgdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplCisJICogb2YgdGhlIHJhbmdlX2xpbWl0IGFycmF5LgorCSAqLworCWN1ciArPSBHRVRKU0FNUExFKCppbnB1dF9wdHIpOworCWN1ciA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyXSk7CisJLyogU2VsZWN0IG91dHB1dCB2YWx1ZSwgYWNjdW11bGF0ZSBpbnRvIG91dHB1dCBjb2RlIGZvciB0aGlzIHBpeGVsICovCisJcGl4Y29kZSA9IEdFVEpTQU1QTEUoY29sb3JpbmRleF9jaVtjdXJdKTsKKwkqb3V0cHV0X3B0ciArPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIGFjdHVhbCByZXByZXNlbnRhdGlvbiBlcnJvciBhdCB0aGlzIHBpeGVsICovCisJLyogTm90ZTogd2UgY2FuIGRvIHRoaXMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0aGUgZmluYWwgKi8KKwkvKiBwaXhlbCBjb2RlLCBiZWNhdXNlIHRoZSBjb2xvcm1hcCBpcyBvcnRob2dvbmFsLiAqLworCWN1ciAtPSBHRVRKU0FNUExFKGNvbG9ybWFwX2NpW3BpeGNvZGVdKTsKKwkvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKwkgKiBBZGQgdGhlc2UgaW50byB0aGUgcnVubmluZyBzdW1zLCBhbmQgc2ltdWx0YW5lb3VzbHkgc2hpZnQgdGhlCisJICogbmV4dC1saW5lIGVycm9yIHN1bXMgbGVmdCBieSAxIGNvbHVtbi4KKwkgKi8KKwlibmV4dGVyciA9IGN1cjsKKwlkZWx0YSA9IGN1ciAqIDI7CisJY3VyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clswXSA9IChGU0VSUk9SKSAoYnByZXZlcnIgKyBjdXIpOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIgPSBiZWxvd2VyciArIGN1cjsKKwliZWxvd2VyciA9IGJuZXh0ZXJyOworCWN1ciArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJLyogQXQgdGhpcyBwb2ludCBjdXIgY29udGFpbnMgdGhlIDcvMTYgZXJyb3IgdmFsdWUgdG8gYmUgcHJvcGFnYXRlZAorCSAqIHRvIHRoZSBuZXh0IHBpeGVsIG9uIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBhbGwgdGhlIGVycm9ycyBmb3IgdGhlCisJICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuIFdlIGFyZSB0aGVyZWZvcmUgcmVhZHkgdG8gbW92ZSBvbi4KKwkgKi8KKwlpbnB1dF9wdHIgKz0gZGlybmM7CS8qIGFkdmFuY2UgaW5wdXQgcHRyIHRvIG5leHQgY29sdW1uICovCisJb3V0cHV0X3B0ciArPSBkaXI7CS8qIGFkdmFuY2Ugb3V0cHV0IHB0ciB0byBuZXh0IGNvbHVtbiAqLworCWVycm9ycHRyICs9IGRpcjsJLyogYWR2YW5jZSBlcnJvcnB0ciB0byBjdXJyZW50IGNvbHVtbiAqLworICAgICAgfQorICAgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZSBpbnRvIHRoZQorICAgICAgICogZmluYWwgZnNlcnJvcnNbXSBlbnRyeS4gIE5vdGUgd2UgbmVlZCBub3QgdW5sb2FkIGJlbG93ZXJyIGJlY2F1c2UKKyAgICAgICAqIGl0IGlzIGZvciB0aGUgZHVtbXkgY29sdW1uIGJlZm9yZSBvciBhZnRlciB0aGUgYWN0dWFsIGFycmF5LgorICAgICAgICovCisgICAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjsgLyogdW5sb2FkIHByZXYgZXJyIGludG8gYXJyYXkgKi8KKyAgICB9CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gKGNxdWFudGl6ZS0+b25fb2RkX3JvdyA/IEZBTFNFIDogVFJVRSk7CisgIH0KK30KKworCisvKgorICogQWxsb2NhdGUgd29ya3NwYWNlIGZvciBGbG95ZC1TdGVpbmJlcmcgZXJyb3JzLgorICovCisKK0xPQ0FMKHZvaWQpCithbGxvY19mc193b3Jrc3BhY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIGFycmF5c2l6ZSA9IChzaXplX3QpICgoY2luZm8tPm91dHB1dF93aWR0aCArIDIpICogU0laRU9GKEZTRVJST1IpKTsKKyAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgaSsrKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9yc1tpXSA9IChGU0VSUlBUUikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgYXJyYXlzaXplKTsKKyAgfQorfQorCisKKy8qCisgKiBJbml0aWFsaXplIGZvciBvbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzFfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHNpemVfdCBhcnJheXNpemU7CisgIGludCBpOworCisgIC8qIEluc3RhbGwgbXkgY29sb3JtYXAuICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IGNxdWFudGl6ZS0+c3ZfYWN0dWFsOworCisgIC8qIEluaXRpYWxpemUgZm9yIGRlc2lyZWQgZGl0aGVyaW5nIG1vZGUuICovCisgIHN3aXRjaCAoY2luZm8tPmRpdGhlcl9tb2RlKSB7CisgIGNhc2UgSkRJVEhFUl9OT05FOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemUzOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gY29sb3JfcXVhbnRpemU7CisgICAgYnJlYWs7CisgIGNhc2UgSkRJVEhFUl9PUkRFUkVEOgorICAgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPT0gMykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcXVhbnRpemUzX29yZF9kaXRoZXI7CisgICAgZWxzZQorICAgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9vcmRfZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cm93X2luZGV4ID0gMDsJLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3Igb3JkZXJlZCBkaXRoZXIgKi8KKyAgICAvKiBJZiB1c2VyIGNoYW5nZWQgdG8gb3JkZXJlZCBkaXRoZXIgZnJvbSBhbm90aGVyIG1vZGUsCisgICAgICogd2UgbXVzdCByZWNyZWF0ZSB0aGUgY29sb3IgaW5kZXggdGFibGUgd2l0aCBwYWRkaW5nLgorICAgICAqIFRoaXMgd2lsbCBjb3N0IGV4dHJhIHNwYWNlLCBidXQgcHJvYmFibHkgaXNuJ3QgdmVyeSBsaWtlbHkuCisgICAgICovCisgICAgaWYgKCEgY3F1YW50aXplLT5pc19wYWRkZWQpCisgICAgICBjcmVhdGVfY29sb3JpbmRleChjaW5mbyk7CisgICAgLyogQ3JlYXRlIG9yZGVyZWQtZGl0aGVyIHRhYmxlcyBpZiB3ZSBkaWRuJ3QgYWxyZWFkeS4gKi8KKyAgICBpZiAoY3F1YW50aXplLT5vZGl0aGVyWzBdID09IE5VTEwpCisgICAgICBjcmVhdGVfb2RpdGhlcl90YWJsZXMoY2luZm8pOworICAgIGJyZWFrOworICBjYXNlIEpESVRIRVJfRlM6CisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBxdWFudGl6ZV9mc19kaXRoZXI7CisgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7IC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIEYtUyBkaXRoZXIgKi8KKyAgICAvKiBBbGxvY2F0ZSBGbG95ZC1TdGVpbmJlcmcgd29ya3NwYWNlIGlmIGRpZG4ndCBhbHJlYWR5LiAqLworICAgIGlmIChjcXVhbnRpemUtPmZzZXJyb3JzWzBdID09IE5VTEwpCisgICAgICBhbGxvY19mc193b3Jrc3BhY2UoY2luZm8pOworICAgIC8qIEluaXRpYWxpemUgdGhlIHByb3BhZ2F0ZWQgZXJyb3JzIHRvIHplcm8uICovCisgICAgYXJyYXlzaXplID0gKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiBTSVpFT0YoRlNFUlJPUikpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7IGkrKykKKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9yc1tpXSwgYXJyYXlzaXplKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7CisgICAgYnJlYWs7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzc18xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICAvKiBubyB3b3JrIGluIDEtcGFzcyBjYXNlICovCit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKiBTaG91bGRuJ3QgZ2V0IHRvIHRoaXMgbW9kdWxlIQorICovCisKK01FVEhPRERFRih2b2lkKQorbmV3X2NvbG9yX21hcF8xX3F1YW50IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBFUlJFWElUKGNpbmZvLCBKRVJSX01PREVfQ0hBTkdFKTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDEtcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8xcGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworCisgIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJU0laRU9GKG15X2NxdWFudGl6ZXIpKTsKKyAgY2luZm8tPmNxdWFudGl6ZSA9IChzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKikgY3F1YW50aXplOworICBjcXVhbnRpemUtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc18xX3F1YW50OworICBjcXVhbnRpemUtPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+cHViLm5ld19jb2xvcl9tYXAgPSBuZXdfY29sb3JfbWFwXzFfcXVhbnQ7CisgIGNxdWFudGl6ZS0+ZnNlcnJvcnNbMF0gPSBOVUxMOyAvKiBGbGFnIEZTIHdvcmtzcGFjZSBub3QgYWxsb2NhdGVkICovCisgIGNxdWFudGl6ZS0+b2RpdGhlclswXSA9IE5VTEw7CS8qIEFsc28gZmxhZyBvZGl0aGVyIGFycmF5cyBub3QgYWxsb2NhdGVkICovCisKKyAgLyogTWFrZSBzdXJlIG15IGludGVybmFsIGFycmF5cyB3b24ndCBvdmVyZmxvdyAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID4gTUFYX1FfQ09NUFMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfQ09NUE9ORU5UUywgTUFYX1FfQ09NUFMpOworICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgaWYgKGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPiAoTUFYSlNBTVBMRSsxKSkKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9NQU5ZX0NPTE9SUywgTUFYSlNBTVBMRSsxKTsKKworICAvKiBDcmVhdGUgdGhlIGNvbG9ybWFwIGFuZCBjb2xvciBpbmRleCB0YWJsZS4gKi8KKyAgY3JlYXRlX2NvbG9ybWFwKGNpbmZvKTsKKyAgY3JlYXRlX2NvbG9yaW5kZXgoY2luZm8pOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2Ugbm93IGlmIHJlcXVlc3RlZC4KKyAgICogV2UgZG8gdGhpcyBub3cgc2luY2UgaXQgaXMgRkFSIHN0b3JhZ2UgYW5kIG1heSBhZmZlY3QgdGhlIG1lbW9yeQorICAgKiBtYW5hZ2VyJ3Mgc3BhY2UgY2FsY3VsYXRpb25zLiAgSWYgdGhlIHVzZXIgY2hhbmdlcyB0byBGUyBkaXRoZXIKKyAgICogbW9kZSBpbiBhIGxhdGVyIHBhc3MsIHdlIHdpbGwgYWxsb2NhdGUgdGhlIHNwYWNlIHRoZW4sIGFuZCB3aWxsCisgICAqIHBvc3NpYmx5IG92ZXJydW4gdGhlIG1heF9tZW1vcnlfdG9fdXNlIHNldHRpbmcuCisgICAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpCisgICAgYWxsb2NfZnNfd29ya3NwYWNlKGNpbmZvKTsKK30KKworI2VuZGlmIC8qIFFVQU5UXzFQQVNTX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2pxdWFudDIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcXVhbnQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MDFlMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qcXVhbnQyLmMKQEAgLTAsMCArMSwxMzEwIEBACisvKgorICoganF1YW50Mi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiAoY29sb3IgbWFwcGluZykgcm91dGluZXMuCisgKiBUaGVzZSByb3V0aW5lcyBwcm92aWRlIHNlbGVjdGlvbiBvZiBhIGN1c3RvbSBjb2xvciBtYXAgZm9yIGFuIGltYWdlLAorICogZm9sbG93ZWQgYnkgbWFwcGluZyBvZiB0aGUgaW1hZ2UgdG8gdGhhdCBjb2xvciBtYXAsIHdpdGggb3B0aW9uYWwKKyAqIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcuCisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBqdXN0IHRoZSBzZWNvbmQgcGFzcyB0byBtYXAgdG8gYW4gYXJiaXRyYXJ5CisgKiBleHRlcm5hbGx5LWdpdmVuIGNvbG9yIG1hcC4KKyAqCisgKiBOb3RlOiBvcmRlcmVkIGRpdGhlcmluZyBpcyBub3Qgc3VwcG9ydGVkLCBzaW5jZSB0aGVyZSBpc24ndCBhbnkgZmFzdAorICogd2F5IHRvIGNvbXB1dGUgaW50ZXJjb2xvciBkaXN0YW5jZXM7IGl0J3MgdW5jbGVhciB0aGF0IG9yZGVyZWQgZGl0aGVyJ3MKKyAqIGZ1bmRhbWVudGFsIGFzc3VtcHRpb25zIGV2ZW4gaG9sZCB3aXRoIGFuIGlycmVndWxhcmx5IHNwYWNlZCBjb2xvciBtYXAuCisgKi8KKworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworI2luY2x1ZGUgImppbmNsdWRlLmgiCisjaW5jbHVkZSAianBlZ2xpYi5oIgorCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECisKKworLyoKKyAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIHdlbGwta25vd24gSGVja2JlcnQgcGFyYWRpZ20gZm9yIGNvbG9yCisgKiBxdWFudGl6YXRpb24uICBNb3N0IG9mIHRoZSBpZGVhcyB1c2VkIGhlcmUgY2FuIGJlIHRyYWNlZCBiYWNrIHRvCisgKiBIZWNrYmVydCdzIHNlbWluYWwgcGFwZXIKKyAqICAgSGVja2JlcnQsIFBhdWwuICAiQ29sb3IgSW1hZ2UgUXVhbnRpemF0aW9uIGZvciBGcmFtZSBCdWZmZXIgRGlzcGxheSIsCisgKiAgIFByb2MuIFNJR0dSQVBIICc4MiwgQ29tcHV0ZXIgR3JhcGhpY3Mgdi4xNiAjMyAoSnVseSAxOTgyKSwgcHAgMjk3LTMwNC4KKyAqCisgKiBJbiB0aGUgZmlyc3QgcGFzcyBvdmVyIHRoZSBpbWFnZSwgd2UgYWNjdW11bGF0ZSBhIGhpc3RvZ3JhbSBzaG93aW5nIHRoZQorICogdXNhZ2UgY291bnQgb2YgZWFjaCBwb3NzaWJsZSBjb2xvci4gIFRvIGtlZXAgdGhlIGhpc3RvZ3JhbSB0byBhIHJlYXNvbmFibGUKKyAqIHNpemUsIHdlIHJlZHVjZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSBpbnB1dDsgdHlwaWNhbCBwcmFjdGljZSBpcyB0byByZXRhaW4KKyAqIDUgb3IgNiBiaXRzIHBlciBjb2xvciwgc28gdGhhdCA4IG9yIDQgZGlmZmVyZW50IGlucHV0IHZhbHVlcyBhcmUgY291bnRlZAorICogaW4gdGhlIHNhbWUgaGlzdG9ncmFtIGNlbGwuCisgKgorICogTmV4dCwgdGhlIGNvbG9yLXNlbGVjdGlvbiBzdGVwIGJlZ2lucyB3aXRoIGEgYm94IHJlcHJlc2VudGluZyB0aGUgd2hvbGUKKyAqIGNvbG9yIHNwYWNlLCBhbmQgcmVwZWF0ZWRseSBzcGxpdHMgdGhlICJsYXJnZXN0IiByZW1haW5pbmcgYm94IHVudGlsIHdlCisgKiBoYXZlIGFzIG1hbnkgYm94ZXMgYXMgZGVzaXJlZCBjb2xvcnMuICBUaGVuIHRoZSBtZWFuIGNvbG9yIGluIGVhY2gKKyAqIHJlbWFpbmluZyBib3ggYmVjb21lcyBvbmUgb2YgdGhlIHBvc3NpYmxlIG91dHB1dCBjb2xvcnMuCisgKiAKKyAqIFRoZSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBpbWFnZSBtYXBzIGVhY2ggaW5wdXQgcGl4ZWwgdG8gdGhlIGNsb3Nlc3Qgb3V0cHV0CisgKiBjb2xvciAob3B0aW9uYWxseSBhZnRlciBhcHBseWluZyBhIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgY29ycmVjdGlvbikuCisgKiBUaGlzIG1hcHBpbmcgaXMgbG9naWNhbGx5IHRyaXZpYWwsIGJ1dCBtYWtpbmcgaXQgZ28gZmFzdCBlbm91Z2ggcmVxdWlyZXMKKyAqIGNvbnNpZGVyYWJsZSBjYXJlLgorICoKKyAqIEhlY2tiZXJ0LXN0eWxlIHF1YW50aXplcnMgdmFyeSBhIGdvb2QgZGVhbCBpbiB0aGVpciBwb2xpY2llcyBmb3IgY2hvb3NpbmcKKyAqIHRoZSAibGFyZ2VzdCIgYm94IGFuZCBkZWNpZGluZyB3aGVyZSB0byBjdXQgaXQuICBUaGUgcGFydGljdWxhciBwb2xpY2llcworICogdXNlZCBoZXJlIGhhdmUgcHJvdmVkIG91dCB3ZWxsIGluIGV4cGVyaW1lbnRhbCBjb21wYXJpc29ucywgYnV0IGJldHRlciBvbmVzCisgKiBtYXkgeWV0IGJlIGZvdW5kLgorICoKKyAqIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIElKRyBjb2RlLCB0aGlzIG1vZHVsZSBxdWFudGl6ZWQgaW4gWUNiQ3IgY29sb3IKKyAqIHNwYWNlLCBwcm9jZXNzaW5nIHRoZSByYXcgdXBzYW1wbGVkIGRhdGEgd2l0aG91dCBhIGNvbG9yIGNvbnZlcnNpb24gc3RlcC4KKyAqIFRoaXMgYWxsb3dlZCB0aGUgY29sb3IgY29udmVyc2lvbiBtYXRoIHRvIGJlIGRvbmUgb25seSBvbmNlIHBlciBjb2xvcm1hcAorICogZW50cnksIG5vdCBvbmNlIHBlciBwaXhlbC4gIEhvd2V2ZXIsIHRoYXQgb3B0aW1pemF0aW9uIHByZWNsdWRlZCBvdGhlcgorICogdXNlZnVsIG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgbWVyZ2luZyBjb2xvciBjb252ZXJzaW9uIHdpdGggdXBzYW1wbGluZykKKyAqIGFuZCBpdCBhbHNvIGludGVyZmVyZWQgd2l0aCBkZXNpcmVkIGNhcGFiaWxpdGllcyBzdWNoIGFzIHF1YW50aXppbmcgdG8gYW4KKyAqIGV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAuICBXZSBoYXZlIHRoZXJlZm9yZSBhYmFuZG9uZWQgdGhhdCBhcHByb2FjaC4KKyAqIFRoZSBwcmVzZW50IGNvZGUgd29ya3MgaW4gdGhlIHBvc3QtY29udmVyc2lvbiBjb2xvciBzcGFjZSwgdHlwaWNhbGx5IFJHQi4KKyAqCisgKiBUbyBpbXByb3ZlIHRoZSB2aXN1YWwgcXVhbGl0eSBvZiB0aGUgcmVzdWx0cywgd2UgYWN0dWFsbHkgd29yayBpbiBzY2FsZWQKKyAqIFJHQiBzcGFjZSwgZ2l2aW5nIEcgZGlzdGFuY2VzIG1vcmUgd2VpZ2h0IHRoYW4gUiwgYW5kIFIgaW4gdHVybiBtb3JlIHRoYW4KKyAqIEIuICBUbyBkbyBldmVyeXRoaW5nIGluIGludGVnZXIgbWF0aCwgd2UgbXVzdCB1c2UgaW50ZWdlciBzY2FsZSBmYWN0b3JzLgorICogVGhlIDIvMy8xIHNjYWxlIGZhY3RvcnMgdXNlZCBoZXJlIGNvcnJlc3BvbmQgbG9vc2VseSB0byB0aGUgcmVsYXRpdmUKKyAqIHdlaWdodHMgb2YgdGhlIGNvbG9ycyBpbiB0aGUgTlRTQyBncmF5c2NhbGUgZXF1YXRpb24uCisgKiBJZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBjb2RlIHRvIHF1YW50aXplIGEgbm9uLVJHQiBjb2xvciBzcGFjZSwgeW91J2xsCisgKiBwcm9iYWJseSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBzY2FsZSBmYWN0b3JzLgorICovCisKKyNkZWZpbmUgUl9TQ0FMRSAyCQkvKiBzY2FsZSBSIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgR19TQ0FMRSAzCQkvKiBzY2FsZSBHIGRpc3RhbmNlcyBieSB0aGlzIG11Y2ggKi8KKyNkZWZpbmUgQl9TQ0FMRSAxCQkvKiBhbmQgQiBieSB0aGlzIG11Y2ggKi8KKworLyogUmVsYWJlbCBSL0cvQiBhcyBjb21wb25lbnRzIDAvMS8yLCByZXNwZWN0aW5nIHRoZSBSR0Igb3JkZXJpbmcgZGVmaW5lZAorICogaW4gam1vcmVjZmcuaC4gIEFzIHRoZSBjb2RlIHN0YW5kcywgaXQgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIFIsRyxCCisgKiBhbmQgQixHLFIgb3JkZXJzLiAgSWYgeW91IGRlZmluZSBzb21lIG90aGVyIHdlaXJkIG9yZGVyIGluIGptb3JlY2ZnLmgsCisgKiB5b3UnbGwgZ2V0IGNvbXBpbGUgZXJyb3JzIHVudGlsIHlvdSBleHRlbmQgdGhpcyBsb2dpYy4gIEluIHRoYXQgY2FzZQorICogeW91J2xsIHByb2JhYmx5IHdhbnQgdG8gdHdlYWsgdGhlIGhpc3RvZ3JhbSBzaXplcyB0b28uCisgKi8KKworI2lmIFJHQl9SRUQgPT0gMAorI2RlZmluZSBDMF9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAwCisjZGVmaW5lIEMwX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9HUkVFTiA9PSAxCisjZGVmaW5lIEMxX1NDQUxFIEdfU0NBTEUKKyNlbmRpZgorI2lmIFJHQl9SRUQgPT0gMgorI2RlZmluZSBDMl9TQ0FMRSBSX1NDQUxFCisjZW5kaWYKKyNpZiBSR0JfQkxVRSA9PSAyCisjZGVmaW5lIEMyX1NDQUxFIEJfU0NBTEUKKyNlbmRpZgorCisKKy8qCisgKiBGaXJzdCB3ZSBoYXZlIHRoZSBoaXN0b2dyYW0gZGF0YSBzdHJ1Y3R1cmUgYW5kIHJvdXRpbmVzIGZvciBjcmVhdGluZyBpdC4KKyAqCisgKiBUaGUgbnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIGNhbiBiZSBhZGp1c3RlZCBieSBjaGFuZ2luZyB0aGVzZSBzeW1ib2xzLgorICogV2UgcmVjb21tZW5kIGtlZXBpbmcgNiBiaXRzIGZvciBHIGFuZCA1IGVhY2ggZm9yIFIgYW5kIEIuCisgKiBJZiB5b3UgaGF2ZSBwbGVudHkgb2YgbWVtb3J5IGFuZCBjeWNsZXMsIDYgYml0cyBhbGwgYXJvdW5kIGdpdmVzIG1hcmdpbmFsbHkKKyAqIGJldHRlciByZXN1bHRzOyBpZiB5b3UgYXJlIHNob3J0IG9mIG1lbW9yeSwgNSBiaXRzIGFsbCBhcm91bmQgd2lsbCBzYXZlCisgKiBzb21lIHNwYWNlIGJ1dCBkZWdyYWRlIHRoZSByZXN1bHRzLgorICogVG8gbWFpbnRhaW4gYSBmdWxseSBhY2N1cmF0ZSBoaXN0b2dyYW0sIHdlJ2QgbmVlZCB0byBhbGxvY2F0ZSBhICJsb25nIgorICogKHByZWZlcmFibHkgdW5zaWduZWQgbG9uZykgZm9yIGVhY2ggY2VsbC4gIEluIHByYWN0aWNlIHRoaXMgaXMgb3ZlcmtpbGw7CisgKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggMTYgYml0cyBwZXIgY2VsbC4gIEZldyBvZiB0aGUgY2VsbCBjb3VudHMgd2lsbCBvdmVyZmxvdywKKyAqIGFuZCBjbGFtcGluZyB0aG9zZSB0aGF0IGRvIG92ZXJmbG93IHRvIHRoZSBtYXhpbXVtIHZhbHVlIHdpbGwgZ2l2ZSBjbG9zZS0KKyAqIGVub3VnaCByZXN1bHRzLiAgVGhpcyByZWR1Y2VzIHRoZSByZWNvbW1lbmRlZCBoaXN0b2dyYW0gc2l6ZSBmcm9tIDI1NktiCisgKiB0byAxMjhLYiwgd2hpY2ggaXMgYSB1c2VmdWwgc2F2aW5ncyBvbiBQQy1jbGFzcyBtYWNoaW5lcy4KKyAqIChJbiB0aGUgc2Vjb25kIHBhc3MgdGhlIGhpc3RvZ3JhbSBzcGFjZSBpcyByZS11c2VkIGZvciBwaXhlbCBtYXBwaW5nIGRhdGE7CisgKiBpbiB0aGF0IGNhcGFjaXR5LCBlYWNoIGNlbGwgbXVzdCBiZSBhYmxlIHRvIHN0b3JlIHplcm8gdG8gdGhlIG51bWJlciBvZgorICogZGVzaXJlZCBjb2xvcnMuICAxNiBiaXRzL2NlbGwgaXMgcGxlbnR5IGZvciB0aGF0IHRvby4pCisgKiBTaW5jZSB0aGUgSlBFRyBjb2RlIGlzIGludGVuZGVkIHRvIHJ1biBpbiBzbWFsbCBtZW1vcnkgbW9kZWwgb24gODB4ODYKKyAqIG1hY2hpbmVzLCB3ZSBjYW4ndCBqdXN0IGFsbG9jYXRlIHRoZSBoaXN0b2dyYW0gaW4gb25lIGNodW5rLiAgSW5zdGVhZAorICogb2YgYSB0cnVlIDMtRCBhcnJheSwgd2UgdXNlIGEgcm93IG9mIHBvaW50ZXJzIHRvIDItRCBhcnJheXMuICBFYWNoCisgKiBwb2ludGVyIGNvcnJlc3BvbmRzIHRvIGEgQzAgdmFsdWUgKHR5cGljYWxseSAyXjUgPSAzMiBwb2ludGVycykgYW5kCisgKiBlYWNoIDItRCBhcnJheSBoYXMgMl42KjJeNSA9IDIwNDggb3IgMl42KjJeNiA9IDQwOTYgZW50cmllcy4gIE5vdGUgdGhhdAorICogb24gODB4ODYgbWFjaGluZXMsIHRoZSBwb2ludGVyIHJvdyBpcyBpbiBuZWFyIG1lbW9yeSBidXQgdGhlIGFjdHVhbAorICogYXJyYXlzIGFyZSBpbiBmYXIgbWVtb3J5IChzYW1lIGFycmFuZ2VtZW50IGFzIHdlIHVzZSBmb3IgaW1hZ2UgYXJyYXlzKS4KKyAqLworCisjZGVmaW5lIE1BWE5VTUNPTE9SUyAgKE1BWEpTQU1QTEUrMSkgLyogbWF4aW11bSBzaXplIG9mIGNvbG9ybWFwICovCisKKy8qIFRoZXNlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBlaXRoZXIgUixHLEIgb3IgQixHLFIgY29sb3Igb3JkZXIsCisgKiBidXQgeW91IG1heSBub3QgbGlrZSB0aGUgcmVzdWx0cyBmb3Igb3RoZXIgY29sb3Igb3JkZXJzLgorICovCisjZGVmaW5lIEhJU1RfQzBfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gUi9CIGhpc3RvZ3JhbSAqLworI2RlZmluZSBISVNUX0MxX0JJVFMgIDYJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIEcgaGlzdG9ncmFtICovCisjZGVmaW5lIEhJU1RfQzJfQklUUyAgNQkJLyogYml0cyBvZiBwcmVjaXNpb24gaW4gQi9SIGhpc3RvZ3JhbSAqLworCisvKiBOdW1iZXIgb2YgZWxlbWVudHMgYWxvbmcgaGlzdG9ncmFtIGF4ZXMuICovCisjZGVmaW5lIEhJU1RfQzBfRUxFTVMgICgxPDxISVNUX0MwX0JJVFMpCisjZGVmaW5lIEhJU1RfQzFfRUxFTVMgICgxPDxISVNUX0MxX0JJVFMpCisjZGVmaW5lIEhJU1RfQzJfRUxFTVMgICgxPDxISVNUX0MyX0JJVFMpCisKKy8qIFRoZXNlIGFyZSB0aGUgYW1vdW50cyB0byBzaGlmdCBhbiBpbnB1dCB2YWx1ZSB0byBnZXQgYSBoaXN0b2dyYW0gaW5kZXguICovCisjZGVmaW5lIEMwX1NISUZUICAoQklUU19JTl9KU0FNUExFLUhJU1RfQzBfQklUUykKKyNkZWZpbmUgQzFfU0hJRlQgIChCSVRTX0lOX0pTQU1QTEUtSElTVF9DMV9CSVRTKQorI2RlZmluZSBDMl9TSElGVCAgKEJJVFNfSU5fSlNBTVBMRS1ISVNUX0MyX0JJVFMpCisKKwordHlwZWRlZiBVSU5UMTYgaGlzdGNlbGw7CS8qIGhpc3RvZ3JhbSBjZWxsOyBwcmVmZXIgYW4gdW5zaWduZWQgdHlwZSAqLworCit0eXBlZGVmIGhpc3RjZWxsIEZBUiAqIGhpc3RwdHI7CS8qIGZvciBwb2ludGVycyB0byBoaXN0b2dyYW0gY2VsbHMgKi8KKwordHlwZWRlZiBoaXN0Y2VsbCBoaXN0MWRbSElTVF9DMl9FTEVNU107IC8qIHR5cGVkZWZzIGZvciB0aGUgYXJyYXkgKi8KK3R5cGVkZWYgaGlzdDFkIEZBUiAqIGhpc3QyZDsJLyogdHlwZSBmb3IgdGhlIDJuZC1sZXZlbCBwb2ludGVycyAqLwordHlwZWRlZiBoaXN0MmQgKiBoaXN0M2Q7CS8qIHR5cGUgZm9yIHRvcC1sZXZlbCBwb2ludGVyICovCisKKworLyogRGVjbGFyYXRpb25zIGZvciBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nLgorICoKKyAqIEVycm9ycyBhcmUgYWNjdW11bGF0ZWQgaW50byB0aGUgYXJyYXkgZnNlcnJvcnNbXSwgYXQgYSByZXNvbHV0aW9uIG9mCisgKiAxLzE2dGggb2YgYSBwaXhlbCBjb3VudC4gIFRoZSBlcnJvciBhdCBhIGdpdmVuIHBpeGVsIGlzIHByb3BhZ2F0ZWQKKyAqIHRvIGl0cyBub3QteWV0LXByb2Nlc3NlZCBuZWlnaGJvcnMgdXNpbmcgdGhlIHN0YW5kYXJkIEYtUyBmcmFjdGlvbnMsCisgKgkJLi4uCShoZXJlKQk3LzE2CisgKgkJMy8xNgk1LzE2CTEvMTYKKyAqIFdlIHdvcmsgbGVmdC10by1yaWdodCBvbiBldmVuIHJvd3MsIHJpZ2h0LXRvLWxlZnQgb24gb2RkIHJvd3MuCisgKgorICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzaW5nbGUgYXJyYXkgKGhvbGRpbmcgb25lIHJvdydzIHdvcnRoIG9mIGVycm9ycykKKyAqIGJ5IHVzaW5nIGl0IHRvIHN0b3JlIHRoZSBjdXJyZW50IHJvdydzIGVycm9ycyBhdCBwaXhlbCBjb2x1bW5zIG5vdCB5ZXQKKyAqIHByb2Nlc3NlZCwgYnV0IHRoZSBuZXh0IHJvdydzIGVycm9ycyBhdCBjb2x1bW5zIGFscmVhZHkgcHJvY2Vzc2VkLiAgV2UKKyAqIG5lZWQgb25seSBhIGZldyBleHRyYSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUgZXJyb3JzIGltbWVkaWF0ZWx5IGFyb3VuZCB0aGUKKyAqIGN1cnJlbnQgY29sdW1uLiAgKElmIHdlIGFyZSBsdWNreSwgdGhvc2UgdmFyaWFibGVzIGFyZSBpbiByZWdpc3RlcnMsIGJ1dAorICogZXZlbiBpZiBub3QsIHRoZXkncmUgcHJvYmFibHkgY2hlYXBlciB0byBhY2Nlc3MgdGhhbiBhcnJheSBlbGVtZW50cyBhcmUuKQorICoKKyAqIFRoZSBmc2Vycm9yc1tdIGFycmF5IGhhcyAoI2NvbHVtbnMgKyAyKSBlbnRyaWVzOyB0aGUgZXh0cmEgZW50cnkgYXQKKyAqIGVhY2ggZW5kIHNhdmVzIHVzIGZyb20gc3BlY2lhbC1jYXNpbmcgdGhlIGZpcnN0IGFuZCBsYXN0IHBpeGVscy4KKyAqIEVhY2ggZW50cnkgaXMgdGhyZWUgdmFsdWVzIGxvbmcsIG9uZSB2YWx1ZSBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCisgKgorICogTm90ZTogb24gYSB3aWRlIGltYWdlLCB3ZSBtaWdodCBub3QgaGF2ZSBlbm91Z2ggcm9vbSBpbiBhIFBDJ3MgbmVhciBkYXRhCisgKiBzZWdtZW50IHRvIGhvbGQgdGhlIGVycm9yIGFycmF5OyBzbyBpdCBpcyBhbGxvY2F0ZWQgd2l0aCBhbGxvY19sYXJnZS4KKyAqLworCisjaWYgQklUU19JTl9KU0FNUExFID09IDgKK3R5cGVkZWYgSU5UMTYgRlNFUlJPUjsJCS8qIDE2IGJpdHMgc2hvdWxkIGJlIGVub3VnaCAqLwordHlwZWRlZiBpbnQgTE9DRlNFUlJPUjsJCS8qIHVzZSAnaW50JyBmb3IgY2FsY3VsYXRpb24gdGVtcHMgKi8KKyNlbHNlCit0eXBlZGVmIElOVDMyIEZTRVJST1I7CQkvKiBtYXkgbmVlZCBtb3JlIHRoYW4gMTYgYml0cyAqLwordHlwZWRlZiBJTlQzMiBMT0NGU0VSUk9SOwkvKiBiZSBzdXJlIGNhbGN1bGF0aW9uIHRlbXBzIGFyZSBiaWcgZW5vdWdoICovCisjZW5kaWYKKwordHlwZWRlZiBGU0VSUk9SIEZBUiAqRlNFUlJQVFI7CS8qIHBvaW50ZXIgdG8gZXJyb3IgYXJyYXkgKGluIEZBUiBzdG9yYWdlISkgKi8KKworCisvKiBQcml2YXRlIHN1Ym9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICAvKiBTcGFjZSBmb3IgdGhlIGV2ZW50dWFsbHkgY3JlYXRlZCBjb2xvcm1hcCBpcyBzdGFzaGVkIGhlcmUgKi8KKyAgSlNBTVBBUlJBWSBzdl9jb2xvcm1hcDsJLyogY29sb3JtYXAgYWxsb2NhdGVkIGF0IGluaXQgdGltZSAqLworICBpbnQgZGVzaXJlZDsJCQkvKiBkZXNpcmVkICMgb2YgY29sb3JzID0gc2l6ZSBvZiBjb2xvcm1hcCAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgYWNjdW11bGF0aW5nIGltYWdlIHN0YXRpc3RpY3MgKi8KKyAgaGlzdDNkIGhpc3RvZ3JhbTsJCS8qIHBvaW50ZXIgdG8gdGhlIGhpc3RvZ3JhbSAqLworCisgIGJvb2xlYW4gbmVlZHNfemVyb2VkOwkJLyogVFJVRSBpZiBuZXh0IHBhc3MgbXVzdCB6ZXJvIGhpc3RvZ3JhbSAqLworCisgIC8qIFZhcmlhYmxlcyBmb3IgRmxveWQtU3RlaW5iZXJnIGRpdGhlcmluZyAqLworICBGU0VSUlBUUiBmc2Vycm9yczsJCS8qIGFjY3VtdWxhdGVkIGVycm9ycyAqLworICBib29sZWFuIG9uX29kZF9yb3c7CQkvKiBmbGFnIHRvIHJlbWVtYmVyIHdoaWNoIHJvdyB3ZSBhcmUgb24gKi8KKyAgaW50ICogZXJyb3JfbGltaXRlcjsJCS8qIHRhYmxlIGZvciBjbGFtcGluZyB0aGUgYXBwbGllZCBlcnJvciAqLworfSBteV9jcXVhbnRpemVyOworCit0eXBlZGVmIG15X2NxdWFudGl6ZXIgKiBteV9jcXVhbnRpemVfcHRyOworCisKKy8qCisgKiBQcmVzY2FuIHNvbWUgcm93cyBvZiBwaXhlbHMuCisgKiBJbiB0aGlzIG1vZHVsZSB0aGUgcHJlc2NhbiBzaW1wbHkgdXBkYXRlcyB0aGUgaGlzdG9ncmFtLCB3aGljaCBoYXMgYmVlbgorICogaW5pdGlhbGl6ZWQgdG8gemVyb2VzIGJ5IHN0YXJ0X3Bhc3MuCisgKiBBbiBvdXRwdXRfYnVmIHBhcmFtZXRlciBpcyByZXF1aXJlZCBieSB0aGUgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IG5vIGRhdGEKKyAqIGlzIGFjdHVhbGx5IG91dHB1dCAoaW4gZmFjdCB0aGUgYnVmZmVyIGNvbnRyb2xsZXIgaXMgcHJvYmFibHkgcGFzc2luZyBhCisgKiBOVUxMIHBvaW50ZXIpLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHJlc2Nhbl9xdWFudGl6ZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCisJCSAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgaGlzdHB0ciBoaXN0cDsKKyAgcmVnaXN0ZXIgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisKKyAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKKyAgICBwdHIgPSBpbnB1dF9idWZbcm93XTsKKyAgICBmb3IgKGNvbCA9IHdpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogZ2V0IHBpeGVsIHZhbHVlIGFuZCBpbmRleCBpbnRvIHRoZSBoaXN0b2dyYW0gKi8KKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bR0VUSlNBTVBMRShwdHJbMF0pID4+IEMwX1NISUZUXQorCQkJIFtHRVRKU0FNUExFKHB0clsxXSkgPj4gQzFfU0hJRlRdCisJCQkgW0dFVEpTQU1QTEUocHRyWzJdKSA+PiBDMl9TSElGVF07CisgICAgICAvKiBpbmNyZW1lbnQsIGNoZWNrIGZvciBvdmVyZmxvdyBhbmQgdW5kbyBpbmNyZW1lbnQgaWYgc28uICovCisgICAgICBpZiAoKysoKmhpc3RwKSA8PSAwKQorCSgqaGlzdHApLS07CisgICAgICBwdHIgKz0gMzsKKyAgICB9CisgIH0KK30KKworCisvKgorICogTmV4dCB3ZSBoYXZlIHRoZSByZWFsbHkgaW50ZXJlc3Rpbmcgcm91dGluZXM6IHNlbGVjdGlvbiBvZiBhIGNvbG9ybWFwCisgKiBnaXZlbiB0aGUgY29tcGxldGVkIGhpc3RvZ3JhbS4KKyAqIFRoZXNlIHJvdXRpbmVzIHdvcmsgd2l0aCBhIGxpc3Qgb2YgImJveGVzIiwgZWFjaCByZXByZXNlbnRpbmcgYSByZWN0YW5ndWxhcgorICogc3Vic2V0IG9mIHRoZSBpbnB1dCBjb2xvciBzcGFjZSAodG8gaGlzdG9ncmFtIHByZWNpc2lvbikuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBUaGUgYm91bmRzIG9mIHRoZSBib3ggKGluY2x1c2l2ZSk7IGV4cHJlc3NlZCBhcyBoaXN0b2dyYW0gaW5kZXhlcyAqLworICBpbnQgYzBtaW4sIGMwbWF4OworICBpbnQgYzFtaW4sIGMxbWF4OworICBpbnQgYzJtaW4sIGMybWF4OworICAvKiBUaGUgdm9sdW1lIChhY3R1YWxseSAyLW5vcm0pIG9mIHRoZSBib3ggKi8KKyAgSU5UMzIgdm9sdW1lOworICAvKiBUaGUgbnVtYmVyIG9mIG5vbnplcm8gaGlzdG9ncmFtIGNlbGxzIHdpdGhpbiB0aGlzIGJveCAqLworICBsb25nIGNvbG9yY291bnQ7Cit9IGJveDsKKwordHlwZWRlZiBib3ggKiBib3hwdHI7CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X2NvbG9yX3BvcCAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgY29sb3IgcG9wdWxhdGlvbiAqLworLyogUmV0dXJucyBOVUxMIGlmIG5vIHNwbGl0dGFibGUgYm94ZXMgcmVtYWluICovCit7CisgIHJlZ2lzdGVyIGJveHB0ciBib3hwOworICByZWdpc3RlciBpbnQgaTsKKyAgcmVnaXN0ZXIgbG9uZyBtYXhjID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPmNvbG9yY291bnQgPiBtYXhjICYmIGJveHAtPnZvbHVtZSA+IDApIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heGMgPSBib3hwLT5jb2xvcmNvdW50OworICAgIH0KKyAgfQorICByZXR1cm4gd2hpY2g7Cit9CisKKworTE9DQUwoYm94cHRyKQorZmluZF9iaWdnZXN0X3ZvbHVtZSAoYm94cHRyIGJveGxpc3QsIGludCBudW1ib3hlcykKKy8qIEZpbmQgdGhlIHNwbGl0dGFibGUgYm94IHdpdGggdGhlIGxhcmdlc3QgKHNjYWxlZCkgdm9sdW1lICovCisvKiBSZXR1cm5zIE5VTEwgaWYgbm8gc3BsaXR0YWJsZSBib3hlcyByZW1haW4gKi8KK3sKKyAgcmVnaXN0ZXIgYm94cHRyIGJveHA7CisgIHJlZ2lzdGVyIGludCBpOworICByZWdpc3RlciBJTlQzMiBtYXh2ID0gMDsKKyAgYm94cHRyIHdoaWNoID0gTlVMTDsKKyAgCisgIGZvciAoaSA9IDAsIGJveHAgPSBib3hsaXN0OyBpIDwgbnVtYm94ZXM7IGkrKywgYm94cCsrKSB7CisgICAgaWYgKGJveHAtPnZvbHVtZSA+IG1heHYpIHsKKyAgICAgIHdoaWNoID0gYm94cDsKKyAgICAgIG1heHYgPSBib3hwLT52b2x1bWU7CisgICAgfQorICB9CisgIHJldHVybiB3aGljaDsKK30KKworCitMT0NBTCh2b2lkKQordXBkYXRlX2JveCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm94cHRyIGJveHApCisvKiBTaHJpbmsgdGhlIG1pbi9tYXggYm91bmRzIG9mIGEgYm94IHRvIGVuY2xvc2Ugb25seSBub256ZXJvIGVsZW1lbnRzLCAqLworLyogYW5kIHJlY29tcHV0ZSBpdHMgdm9sdW1lIGFuZCBwb3B1bGF0aW9uICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaGlzdHB0ciBoaXN0cDsKKyAgaW50IGMwLGMxLGMyOworICBpbnQgYzBtaW4sYzBtYXgsYzFtaW4sYzFtYXgsYzJtaW4sYzJtYXg7CisgIElOVDMyIGRpc3QwLGRpc3QxLGRpc3QyOworICBsb25nIGNjb3VudDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBpZiAoYzBtYXggPiBjMG1pbikKKyAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMwbWluID0gYzBtaW4gPSBjMDsKKwkgICAgZ290byBoYXZlX2MwbWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzBtaW46CisgIGlmIChjMG1heCA+IGMwbWluKQorICAgIGZvciAoYzAgPSBjMG1heDsgYzAgPj0gYzBtaW47IGMwLS0pCisgICAgICBmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKwlmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKQorCSAgaWYgKCpoaXN0cCsrICE9IDApIHsKKwkgICAgYm94cC0+YzBtYXggPSBjMG1heCA9IGMwOworCSAgICBnb3RvIGhhdmVfYzBtYXg7CisJICB9CisgICAgICB9CisgaGF2ZV9jMG1heDoKKyAgaWYgKGMxbWF4ID4gYzFtaW4pCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykKKyAgICAgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspIHsKKwloaXN0cCA9ICYgaGlzdG9ncmFtW2MwXVtjMV1bYzJtaW5dOworCWZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisJICBpZiAoKmhpc3RwKysgIT0gMCkgeworCSAgICBib3hwLT5jMW1pbiA9IGMxbWluID0gYzE7CisJICAgIGdvdG8gaGF2ZV9jMW1pbjsKKwkgIH0KKyAgICAgIH0KKyBoYXZlX2MxbWluOgorICBpZiAoYzFtYXggPiBjMW1pbikKKyAgICBmb3IgKGMxID0gYzFtYXg7IGMxID49IGMxbWluOyBjMS0tKQorICAgICAgZm9yIChjMCA9IGMwbWluOyBjMCA8PSBjMG1heDsgYzArKykgeworCWhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisJZm9yIChjMiA9IGMybWluOyBjMiA8PSBjMm1heDsgYzIrKykKKwkgIGlmICgqaGlzdHArKyAhPSAwKSB7CisJICAgIGJveHAtPmMxbWF4ID0gYzFtYXggPSBjMTsKKwkgICAgZ290byBoYXZlX2MxbWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzFtYXg6CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyspCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWluID0gYzJtaW4gPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWluOworCSAgfQorICAgICAgfQorIGhhdmVfYzJtaW46CisgIGlmIChjMm1heCA+IGMybWluKQorICAgIGZvciAoYzIgPSBjMm1heDsgYzIgPj0gYzJtaW47IGMyLS0pCisgICAgICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKSB7CisJaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFtaW5dW2MyXTsKKwlmb3IgKGMxID0gYzFtaW47IGMxIDw9IGMxbWF4OyBjMSsrLCBoaXN0cCArPSBISVNUX0MyX0VMRU1TKQorCSAgaWYgKCpoaXN0cCAhPSAwKSB7CisJICAgIGJveHAtPmMybWF4ID0gYzJtYXggPSBjMjsKKwkgICAgZ290byBoYXZlX2MybWF4OworCSAgfQorICAgICAgfQorIGhhdmVfYzJtYXg6CisKKyAgLyogVXBkYXRlIGJveCB2b2x1bWUuCisgICAqIFdlIHVzZSAyLW5vcm0gcmF0aGVyIHRoYW4gcmVhbCB2b2x1bWUgaGVyZTsgdGhpcyBiaWFzZXMgdGhlIG1ldGhvZAorICAgKiBhZ2FpbnN0IG1ha2luZyBsb25nIG5hcnJvdyBib3hlcywgYW5kIGl0IGhhcyB0aGUgc2lkZSBiZW5lZml0IHRoYXQKKyAgICogYSBib3ggaXMgc3BsaXR0YWJsZSBpZmYgbm9ybSA+IDAuCisgICAqIFNpbmNlIHRoZSBkaWZmZXJlbmNlcyBhcmUgZXhwcmVzc2VkIGluIGhpc3RvZ3JhbS1jZWxsIHVuaXRzLAorICAgKiB3ZSBoYXZlIHRvIHNoaWZ0IGJhY2sgdG8gSlNBTVBMRSB1bml0cyB0byBnZXQgY29uc2lzdGVudCBkaXN0YW5jZXM7CisgICAqIGFmdGVyIHdoaWNoLCB3ZSBzY2FsZSBhY2NvcmRpbmcgdG8gdGhlIHNlbGVjdGVkIGRpc3RhbmNlIHNjYWxlIGZhY3RvcnMuCisgICAqLworICBkaXN0MCA9ICgoYzBtYXggLSBjMG1pbikgPDwgQzBfU0hJRlQpICogQzBfU0NBTEU7CisgIGRpc3QxID0gKChjMW1heCAtIGMxbWluKSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRTsKKyAgZGlzdDIgPSAoKGMybWF4IC0gYzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICBib3hwLT52b2x1bWUgPSBkaXN0MCpkaXN0MCArIGRpc3QxKmRpc3QxICsgZGlzdDIqZGlzdDI7CisgIAorICAvKiBOb3cgc2NhbiByZW1haW5pbmcgdm9sdW1lIG9mIGJveCBhbmQgY29tcHV0ZSBwb3B1bGF0aW9uICovCisgIGNjb3VudCA9IDA7CisgIGZvciAoYzAgPSBjMG1pbjsgYzAgPD0gYzBtYXg7IGMwKyspCisgICAgZm9yIChjMSA9IGMxbWluOyBjMSA8PSBjMW1heDsgYzErKykgeworICAgICAgaGlzdHAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MybWluXTsKKyAgICAgIGZvciAoYzIgPSBjMm1pbjsgYzIgPD0gYzJtYXg7IGMyKyssIGhpc3RwKyspCisJaWYgKCpoaXN0cCAhPSAwKSB7CisJICBjY291bnQrKzsKKwl9CisgICAgfQorICBib3hwLT5jb2xvcmNvdW50ID0gY2NvdW50OworfQorCisKK0xPQ0FMKGludCkKK21lZGlhbl9jdXQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hsaXN0LCBpbnQgbnVtYm94ZXMsCisJICAgIGludCBkZXNpcmVkX2NvbG9ycykKKy8qIFJlcGVhdGVkbHkgc2VsZWN0IGFuZCBzcGxpdCB0aGUgbGFyZ2VzdCBib3ggdW50aWwgd2UgaGF2ZSBlbm91Z2ggYm94ZXMgKi8KK3sKKyAgaW50IG4sbGI7CisgIGludCBjMCxjMSxjMixjbWF4OworICByZWdpc3RlciBib3hwdHIgYjEsYjI7CisKKyAgd2hpbGUgKG51bWJveGVzIDwgZGVzaXJlZF9jb2xvcnMpIHsKKyAgICAvKiBTZWxlY3QgYm94IHRvIHNwbGl0LgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBieSBwb3B1bGF0aW9uIGZvciBmaXJzdCBoYWxmLCB0aGVuIGJ5IHZvbHVtZS4KKyAgICAgKi8KKyAgICBpZiAobnVtYm94ZXMqMiA8PSBkZXNpcmVkX2NvbG9ycykgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3RfY29sb3JfcG9wKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9IGVsc2UgeworICAgICAgYjEgPSBmaW5kX2JpZ2dlc3Rfdm9sdW1lKGJveGxpc3QsIG51bWJveGVzKTsKKyAgICB9CisgICAgaWYgKGIxID09IE5VTEwpCQkvKiBubyBzcGxpdHRhYmxlIGJveGVzIGxlZnQhICovCisgICAgICBicmVhazsKKyAgICBiMiA9ICZib3hsaXN0W251bWJveGVzXTsJLyogd2hlcmUgbmV3IGJveCB3aWxsIGdvICovCisgICAgLyogQ29weSB0aGUgY29sb3IgYm91bmRzIHRvIHRoZSBuZXcgYm94LiAqLworICAgIGIyLT5jMG1heCA9IGIxLT5jMG1heDsgYjItPmMxbWF4ID0gYjEtPmMxbWF4OyBiMi0+YzJtYXggPSBiMS0+YzJtYXg7CisgICAgYjItPmMwbWluID0gYjEtPmMwbWluOyBiMi0+YzFtaW4gPSBiMS0+YzFtaW47IGIyLT5jMm1pbiA9IGIxLT5jMm1pbjsKKyAgICAvKiBDaG9vc2Ugd2hpY2ggYXhpcyB0byBzcGxpdCB0aGUgYm94IG9uLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBsb25nZXN0IHNjYWxlZCBheGlzLgorICAgICAqIFNlZSBub3RlcyBpbiB1cGRhdGVfYm94IGFib3V0IHNjYWxpbmcgZGlzdGFuY2VzLgorICAgICAqLworICAgIGMwID0gKChiMS0+YzBtYXggLSBiMS0+YzBtaW4pIDw8IEMwX1NISUZUKSAqIEMwX1NDQUxFOworICAgIGMxID0gKChiMS0+YzFtYXggLSBiMS0+YzFtaW4pIDw8IEMxX1NISUZUKSAqIEMxX1NDQUxFOworICAgIGMyID0gKChiMS0+YzJtYXggLSBiMS0+YzJtaW4pIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFOworICAgIC8qIFdlIHdhbnQgdG8gYnJlYWsgYW55IHRpZXMgaW4gZmF2b3Igb2YgZ3JlZW4sIHRoZW4gcmVkLCBibHVlIGxhc3QuCisgICAgICogVGhpcyBjb2RlIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBSLEcsQiBvciBCLEcsUiBjb2xvciBvcmRlcnMgb25seS4KKyAgICAgKi8KKyNpZiBSR0JfUkVEID09IDAKKyAgICBjbWF4ID0gYzE7IG4gPSAxOworICAgIGlmIChjMCA+IGNtYXgpIHsgY21heCA9IGMwOyBuID0gMDsgfQorICAgIGlmIChjMiA+IGNtYXgpIHsgbiA9IDI7IH0KKyNlbHNlCisgICAgY21heCA9IGMxOyBuID0gMTsKKyAgICBpZiAoYzIgPiBjbWF4KSB7IGNtYXggPSBjMjsgbiA9IDI7IH0KKyAgICBpZiAoYzAgPiBjbWF4KSB7IG4gPSAwOyB9CisjZW5kaWYKKyAgICAvKiBDaG9vc2Ugc3BsaXQgcG9pbnQgYWxvbmcgc2VsZWN0ZWQgYXhpcywgYW5kIHVwZGF0ZSBib3ggYm91bmRzLgorICAgICAqIEN1cnJlbnQgYWxnb3JpdGhtOiBzcGxpdCBhdCBoYWxmd2F5IHBvaW50LgorICAgICAqIChTaW5jZSB0aGUgYm94IGhhcyBiZWVuIHNocnVuayB0byBtaW5pbXVtIHZvbHVtZSwKKyAgICAgKiBhbnkgc3BsaXQgd2lsbCBwcm9kdWNlIHR3byBub25lbXB0eSBzdWJib3hlcy4pCisgICAgICogTm90ZSB0aGF0IGxiIHZhbHVlIGlzIG1heCBmb3IgbG93ZXIgYm94LCBzbyBtdXN0IGJlIDwgb2xkIG1heC4KKyAgICAgKi8KKyAgICBzd2l0Y2ggKG4pIHsKKyAgICBjYXNlIDA6CisgICAgICBsYiA9IChiMS0+YzBtYXggKyBiMS0+YzBtaW4pIC8gMjsKKyAgICAgIGIxLT5jMG1heCA9IGxiOworICAgICAgYjItPmMwbWluID0gbGIrMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGxiID0gKGIxLT5jMW1heCArIGIxLT5jMW1pbikgLyAyOworICAgICAgYjEtPmMxbWF4ID0gbGI7CisgICAgICBiMi0+YzFtaW4gPSBsYisxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbGIgPSAoYjEtPmMybWF4ICsgYjEtPmMybWluKSAvIDI7CisgICAgICBiMS0+YzJtYXggPSBsYjsKKyAgICAgIGIyLT5jMm1pbiA9IGxiKzE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogVXBkYXRlIHN0YXRzIGZvciBib3hlcyAqLworICAgIHVwZGF0ZV9ib3goY2luZm8sIGIxKTsKKyAgICB1cGRhdGVfYm94KGNpbmZvLCBiMik7CisgICAgbnVtYm94ZXMrKzsKKyAgfQorICByZXR1cm4gbnVtYm94ZXM7Cit9CisKKworTE9DQUwodm9pZCkKK2NvbXB1dGVfY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJveHB0ciBib3hwLCBpbnQgaWNvbG9yKQorLyogQ29tcHV0ZSByZXByZXNlbnRhdGl2ZSBjb2xvciBmb3IgYSBib3gsIHB1dCBpdCBpbiBjb2xvcm1hcFtpY29sb3JdICovCit7CisgIC8qIEN1cnJlbnQgYWxnb3JpdGhtOiBtZWFuIHdlaWdodGVkIGJ5IHBpeGVscyAobm90IGNvbG9ycykgKi8KKyAgLyogTm90ZSBpdCBpcyBpbXBvcnRhbnQgdG8gZ2V0IHRoZSByb3VuZGluZyBjb3JyZWN0ISAqLworICBteV9jcXVhbnRpemVfcHRyIGNxdWFudGl6ZSA9IChteV9jcXVhbnRpemVfcHRyKSBjaW5mby0+Y3F1YW50aXplOworICBoaXN0M2QgaGlzdG9ncmFtID0gY3F1YW50aXplLT5oaXN0b2dyYW07CisgIGhpc3RwdHIgaGlzdHA7CisgIGludCBjMCxjMSxjMjsKKyAgaW50IGMwbWluLGMwbWF4LGMxbWluLGMxbWF4LGMybWluLGMybWF4OworICBsb25nIGNvdW50OworICBsb25nIHRvdGFsID0gMDsKKyAgbG9uZyBjMHRvdGFsID0gMDsKKyAgbG9uZyBjMXRvdGFsID0gMDsKKyAgbG9uZyBjMnRvdGFsID0gMDsKKyAgCisgIGMwbWluID0gYm94cC0+YzBtaW47ICBjMG1heCA9IGJveHAtPmMwbWF4OworICBjMW1pbiA9IGJveHAtPmMxbWluOyAgYzFtYXggPSBib3hwLT5jMW1heDsKKyAgYzJtaW4gPSBib3hwLT5jMm1pbjsgIGMybWF4ID0gYm94cC0+YzJtYXg7CisgIAorICBmb3IgKGMwID0gYzBtaW47IGMwIDw9IGMwbWF4OyBjMCsrKQorICAgIGZvciAoYzEgPSBjMW1pbjsgYzEgPD0gYzFtYXg7IGMxKyspIHsKKyAgICAgIGhpc3RwID0gJiBoaXN0b2dyYW1bYzBdW2MxXVtjMm1pbl07CisgICAgICBmb3IgKGMyID0gYzJtaW47IGMyIDw9IGMybWF4OyBjMisrKSB7CisJaWYgKChjb3VudCA9ICpoaXN0cCsrKSAhPSAwKSB7CisJICB0b3RhbCArPSBjb3VudDsKKwkgIGMwdG90YWwgKz0gKChjMCA8PCBDMF9TSElGVCkgKyAoKDE8PEMwX1NISUZUKT4+MSkpICogY291bnQ7CisJICBjMXRvdGFsICs9ICgoYzEgPDwgQzFfU0hJRlQpICsgKCgxPDxDMV9TSElGVCk+PjEpKSAqIGNvdW50OworCSAgYzJ0b3RhbCArPSAoKGMyIDw8IEMyX1NISUZUKSArICgoMTw8QzJfU0hJRlQpPj4xKSkgKiBjb3VudDsKKwl9CisgICAgICB9CisgICAgfQorICAKKyAgY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0gPSAoSlNBTVBMRSkgKChjMHRvdGFsICsgKHRvdGFsPj4xKSkgLyB0b3RhbCk7CisgIGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdID0gKEpTQU1QTEUpICgoYzF0b3RhbCArICh0b3RhbD4+MSkpIC8gdG90YWwpOworICBjaW5mby0+Y29sb3JtYXBbMl1baWNvbG9yXSA9IChKU0FNUExFKSAoKGMydG90YWwgKyAodG90YWw+PjEpKSAvIHRvdGFsKTsKK30KKworCitMT0NBTCh2b2lkKQorc2VsZWN0X2NvbG9ycyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWRfY29sb3JzKQorLyogTWFzdGVyIHJvdXRpbmUgZm9yIGNvbG9yIHNlbGVjdGlvbiAqLworeworICBib3hwdHIgYm94bGlzdDsKKyAgaW50IG51bWJveGVzOworICBpbnQgaTsKKworICAvKiBBbGxvY2F0ZSB3b3Jrc3BhY2UgZm9yIGJveCBsaXN0ICovCisgIGJveGxpc3QgPSAoYm94cHRyKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc2lyZWRfY29sb3JzICogU0laRU9GKGJveCkpOworICAvKiBJbml0aWFsaXplIG9uZSBib3ggY29udGFpbmluZyB3aG9sZSBzcGFjZSAqLworICBudW1ib3hlcyA9IDE7CisgIGJveGxpc3RbMF0uYzBtaW4gPSAwOworICBib3hsaXN0WzBdLmMwbWF4ID0gTUFYSlNBTVBMRSA+PiBDMF9TSElGVDsKKyAgYm94bGlzdFswXS5jMW1pbiA9IDA7CisgIGJveGxpc3RbMF0uYzFtYXggPSBNQVhKU0FNUExFID4+IEMxX1NISUZUOworICBib3hsaXN0WzBdLmMybWluID0gMDsKKyAgYm94bGlzdFswXS5jMm1heCA9IE1BWEpTQU1QTEUgPj4gQzJfU0hJRlQ7CisgIC8qIFNocmluayBpdCB0byBhY3R1YWxseS11c2VkIHZvbHVtZSBhbmQgc2V0IGl0cyBzdGF0aXN0aWNzICovCisgIHVwZGF0ZV9ib3goY2luZm8sICYgYm94bGlzdFswXSk7CisgIC8qIFBlcmZvcm0gbWVkaWFuLWN1dCB0byBwcm9kdWNlIGZpbmFsIGJveCBsaXN0ICovCisgIG51bWJveGVzID0gbWVkaWFuX2N1dChjaW5mbywgYm94bGlzdCwgbnVtYm94ZXMsIGRlc2lyZWRfY29sb3JzKTsKKyAgLyogQ29tcHV0ZSB0aGUgcmVwcmVzZW50YXRpdmUgY29sb3IgZm9yIGVhY2ggYm94LCBmaWxsIGNvbG9ybWFwICovCisgIGZvciAoaSA9IDA7IGkgPCBudW1ib3hlczsgaSsrKQorICAgIGNvbXB1dGVfY29sb3IoY2luZm8sICYgYm94bGlzdFtpXSwgaSk7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IG51bWJveGVzOworICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19RVUFOVF9TRUxFQ1RFRCwgbnVtYm94ZXMpOworfQorCisKKy8qCisgKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggdGhlIHRpbWUtY3JpdGljYWwgdGFzayBvZiBtYXBwaW5nIGlucHV0CisgKiBjb2xvcnMgdG8gdGhlIG5lYXJlc3QgY29sb3IgaW4gdGhlIHNlbGVjdGVkIGNvbG9ybWFwLgorICoKKyAqIFdlIHJlLXVzZSB0aGUgaGlzdG9ncmFtIHNwYWNlIGFzIGFuICJpbnZlcnNlIGNvbG9yIG1hcCIsIGVzc2VudGlhbGx5IGEKKyAqIGNhY2hlIGZvciB0aGUgcmVzdWx0cyBvZiBuZWFyZXN0LWNvbG9yIHNlYXJjaGVzLiAgQWxsIGNvbG9ycyB3aXRoaW4gYQorICogaGlzdG9ncmFtIGNlbGwgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIHNhbWUgY29sb3JtYXAgZW50cnksIG5hbWVseSB0aGUgb25lCisgKiBjbG9zZXN0IHRvIHRoZSBjZWxsJ3MgY2VudGVyLiAgVGhpcyBtYXkgbm90IGJlIHF1aXRlIHRoZSBjbG9zZXN0IGVudHJ5IHRvCisgKiB0aGUgYWN0dWFsIGlucHV0IGNvbG9yLCBidXQgaXQncyBhbG1vc3QgYXMgZ29vZC4gIEEgemVybyBpbiB0aGUgY2FjaGUKKyAqIGluZGljYXRlcyB3ZSBoYXZlbid0IGZvdW5kIHRoZSBuZWFyZXN0IGNvbG9yIGZvciB0aGF0IGNlbGwgeWV0OyB0aGUgYXJyYXkKKyAqIGlzIGNsZWFyZWQgdG8gemVyb2VzIGJlZm9yZSBzdGFydGluZyB0aGUgbWFwcGluZyBwYXNzLiAgV2hlbiB3ZSBmaW5kIHRoZQorICogbmVhcmVzdCBjb2xvciBmb3IgYSBjZWxsLCBpdHMgY29sb3JtYXAgaW5kZXggcGx1cyBvbmUgaXMgcmVjb3JkZWQgaW4gdGhlCisgKiBjYWNoZSBmb3IgZnV0dXJlIHVzZS4gIFRoZSBwYXNzMiBzY2FubmluZyByb3V0aW5lcyBjYWxsIGZpbGxfaW52ZXJzZV9jbWFwCisgKiB3aGVuIHRoZXkgbmVlZCB0byB1c2UgYW4gdW5maWxsZWQgZW50cnkgaW4gdGhlIGNhY2hlLgorICoKKyAqIE91ciBtZXRob2Qgb2YgZWZmaWNpZW50bHkgZmluZGluZyBuZWFyZXN0IGNvbG9ycyBpcyBiYXNlZCBvbiB0aGUgImxvY2FsbHkKKyAqIHNvcnRlZCBzZWFyY2giIGlkZWEgZGVzY3JpYmVkIGJ5IEhlY2tiZXJ0IGFuZCBvbiB0aGUgaW5jcmVtZW50YWwgZGlzdGFuY2UKKyAqIGNhbGN1bGF0aW9uIGRlc2NyaWJlZCBieSBTcGVuY2VyIFcuIFRob21hcyBpbiBjaGFwdGVyIElJSS4xIG9mIEdyYXBoaWNzCisgKiBHZW1zIElJIChKYW1lcyBBcnZvLCBlZC4gIEFjYWRlbWljIFByZXNzLCAxOTkxKS4gIFRob21hcyBwb2ludHMgb3V0IHRoYXQKKyAqIHRoZSBkaXN0YW5jZXMgZnJvbSBhIGdpdmVuIGNvbG9ybWFwIGVudHJ5IHRvIGVhY2ggY2VsbCBvZiB0aGUgaGlzdG9ncmFtIGNhbgorICogYmUgY29tcHV0ZWQgcXVpY2tseSB1c2luZyBhbiBpbmNyZW1lbnRhbCBtZXRob2Q6IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCisgKiBkaXN0YW5jZXMgdG8gYWRqYWNlbnQgY2VsbHMgdGhlbXNlbHZlcyBkaWZmZXIgYnkgYSBjb25zdGFudC4gIFRoaXMgYWxsb3dzIGEKKyAqIGZhaXJseSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSAiYnJ1dGUgZm9yY2UiIGFwcHJvYWNoIG9mIGNvbXB1dGluZyB0aGUKKyAqIGRpc3RhbmNlIGZyb20gZXZlcnkgY29sb3JtYXAgZW50cnkgdG8gZXZlcnkgaGlzdG9ncmFtIGNlbGwuICBVbmZvcnR1bmF0ZWx5LAorICogaXQgbmVlZHMgYSB3b3JrIGFycmF5IHRvIGhvbGQgdGhlIGJlc3QtZGlzdGFuY2Utc28tZmFyIGZvciBlYWNoIGhpc3RvZ3JhbQorICogY2VsbCAoYmVjYXVzZSB0aGUgaW5uZXIgbG9vcCBoYXMgdG8gYmUgb3ZlciBjZWxscywgbm90IGNvbG9ybWFwIGVudHJpZXMpLgorICogVGhlIHdvcmsgYXJyYXkgZWxlbWVudHMgaGF2ZSB0byBiZSBJTlQzMnMsIHNvIHRoZSB3b3JrIGFycmF5IHdvdWxkIG5lZWQKKyAqIDI1NktiIGF0IG91ciByZWNvbW1lbmRlZCBwcmVjaXNpb24uICBUaGlzIGlzIG5vdCBmZWFzaWJsZSBpbiBET1MgbWFjaGluZXMuCisgKgorICogVG8gZ2V0IGFyb3VuZCB0aGVzZSBwcm9ibGVtcywgd2UgYXBwbHkgVGhvbWFzJyBtZXRob2QgdG8gY29tcHV0ZSB0aGUKKyAqIG5lYXJlc3QgY29sb3JzIGZvciBvbmx5IHRoZSBjZWxscyB3aXRoaW4gYSBzbWFsbCBzdWJib3ggb2YgdGhlIGhpc3RvZ3JhbS4KKyAqIFRoZSB3b3JrIGFycmF5IG5lZWQgYmUgb25seSBhcyBiaWcgYXMgdGhlIHN1YmJveCwgc28gdGhlIG1lbW9yeSB1c2FnZQorICogcHJvYmxlbSBpcyBzb2x2ZWQuICBGdXJ0aGVybW9yZSwgd2UgbmVlZCBub3QgZmlsbCBzdWJib3hlcyB0aGF0IGFyZSBuZXZlcgorICogcmVmZXJlbmNlZCBpbiBwYXNzMjsgbWFueSBpbWFnZXMgdXNlIG9ubHkgcGFydCBvZiB0aGUgY29sb3IgZ2FtdXQsIHNvIGEKKyAqIGZhaXIgYW1vdW50IG9mIHdvcmsgaXMgc2F2ZWQuICBBbiBhZGRpdGlvbmFsIGFkdmFudGFnZSBvZiB0aGlzCisgKiBhcHByb2FjaCBpcyB0aGF0IHdlIGNhbiBhcHBseSBIZWNrYmVydCdzIGxvY2FsaXR5IGNyaXRlcmlvbiB0byBxdWlja2x5CisgKiBlbGltaW5hdGUgY29sb3JtYXAgZW50cmllcyB0aGF0IGFyZSBmYXIgYXdheSBmcm9tIHRoZSBzdWJib3g7IHR5cGljYWxseQorICogdGhyZWUtZm91cnRocyBvZiB0aGUgY29sb3JtYXAgZW50cmllcyBhcmUgcmVqZWN0ZWQgYnkgSGVja2JlcnQncyBjcml0ZXJpb24sCisgKiBhbmQgd2UgbmVlZCBub3QgY29tcHV0ZSB0aGVpciBkaXN0YW5jZXMgdG8gaW5kaXZpZHVhbCBjZWxscyBpbiB0aGUgc3ViYm94LgorICogVGhlIHNwZWVkIG9mIHRoaXMgYXBwcm9hY2ggaXMgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IHRoZSBzdWJib3ggc2l6ZTogdG9vCisgKiBzbWFsbCBtZWFucyB0b28gbXVjaCBvdmVyaGVhZCwgdG9vIGJpZyBsb3NlcyBiZWNhdXNlIEhlY2tiZXJ0J3MgY3JpdGVyaW9uCisgKiBjYW4ndCBlbGltaW5hdGUgYXMgbWFueSBjb2xvcm1hcCBlbnRyaWVzLiAgRW1waXJpY2FsbHkgdGhlIGJlc3Qgc3ViYm94CisgKiBzaXplIHNlZW1zIHRvIGJlIGFib3V0IDEvNTEydGggb2YgdGhlIGhpc3RvZ3JhbSAoMS84dGggaW4gZWFjaCBkaXJlY3Rpb24pLgorICoKKyAqIFRob21hcycgYXJ0aWNsZSBhbHNvIGRlc2NyaWJlcyBhIHJlZmluZWQgbWV0aG9kIHdoaWNoIGlzIGFzeW1wdG90aWNhbGx5CisgKiBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUtZm9yY2UgbWV0aG9kLCBidXQgaXQgaXMgYWxzbyBmYXIgbW9yZSBjb21wbGV4IGFuZAorICogY2Fubm90IGVmZmljaWVudGx5IGJlIGFwcGxpZWQgdG8gc21hbGwgc3ViYm94ZXMuICBJdCBpcyB0aGVyZWZvcmUgbm90CisgKiB1c2VmdWwgZm9yIHByb2dyYW1zIGludGVuZGVkIHRvIGJlIHBvcnRhYmxlIHRvIERPUyBtYWNoaW5lcy4gIE9uIG1hY2hpbmVzCisgKiB3aXRoIHBsZW50eSBvZiBtZW1vcnksIGZpbGxpbmcgdGhlIHdob2xlIGhpc3RvZ3JhbSBpbiBvbmUgc2hvdCB3aXRoIFRob21hcycKKyAqIHJlZmluZWQgbWV0aG9kIG1pZ2h0IGJlIGZhc3RlciB0aGFuIHRoZSBwcmVzZW50IGNvZGUgLS0tIGJ1dCB0aGVuIGFnYWluLAorICogaXQgbWlnaHQgbm90IGJlIGFueSBmYXN0ZXIsIGFuZCBpdCdzIGNlcnRhaW5seSBtb3JlIGNvbXBsaWNhdGVkLgorICovCisKKworLyogbG9nMihoaXN0b2dyYW0gY2VsbHMgaW4gdXBkYXRlIGJveCkgZm9yIGVhY2ggYXhpczsgdGhpcyBjYW4gYmUgYWRqdXN0ZWQgKi8KKyNkZWZpbmUgQk9YX0MwX0xPRyAgKEhJU1RfQzBfQklUUy0zKQorI2RlZmluZSBCT1hfQzFfTE9HICAoSElTVF9DMV9CSVRTLTMpCisjZGVmaW5lIEJPWF9DMl9MT0cgIChISVNUX0MyX0JJVFMtMykKKworI2RlZmluZSBCT1hfQzBfRUxFTVMgICgxPDxCT1hfQzBfTE9HKSAvKiAjIG9mIGhpc3QgY2VsbHMgaW4gdXBkYXRlIGJveCAqLworI2RlZmluZSBCT1hfQzFfRUxFTVMgICgxPDxCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfRUxFTVMgICgxPDxCT1hfQzJfTE9HKQorCisjZGVmaW5lIEJPWF9DMF9TSElGVCAgKEMwX1NISUZUICsgQk9YX0MwX0xPRykKKyNkZWZpbmUgQk9YX0MxX1NISUZUICAoQzFfU0hJRlQgKyBCT1hfQzFfTE9HKQorI2RlZmluZSBCT1hfQzJfU0hJRlQgIChDMl9TSElGVCArIEJPWF9DMl9MT0cpCisKKworLyoKKyAqIFRoZSBuZXh0IHRocmVlIHJvdXRpbmVzIGltcGxlbWVudCBpbnZlcnNlIGNvbG9ybWFwIGZpbGxpbmcuICBUaGV5IGNvdWxkCisgKiBhbGwgYmUgZm9sZGVkIGludG8gb25lIGJpZyByb3V0aW5lLCBidXQgc3BsaXR0aW5nIHRoZW0gdXAgdGhpcyB3YXkgc2F2ZXMKKyAqIHNvbWUgc3RhY2sgc3BhY2UgKHRoZSBtaW5kaXN0W10gYW5kIGJlc3RkaXN0W10gYXJyYXlzIG5lZWQgbm90IGNvZXhpc3QpCisgKiBhbmQgbWF5IGFsbG93IHNvbWUgY29tcGlsZXJzIHRvIHByb2R1Y2UgYmV0dGVyIGNvZGUgYnkgcmVnaXN0ZXJpemluZyBtb3JlCisgKiBpbm5lci1sb29wIHZhcmlhYmxlcy4KKyAqLworCitMT0NBTChpbnQpCitmaW5kX25lYXJieV9jb2xvcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBtaW5jMCwgaW50IG1pbmMxLCBpbnQgbWluYzIsCisJCSAgICBKU0FNUExFIGNvbG9ybGlzdFtdKQorLyogTG9jYXRlIHRoZSBjb2xvcm1hcCBlbnRyaWVzIGNsb3NlIGVub3VnaCB0byBhbiB1cGRhdGUgYm94IHRvIGJlIGNhbmRpZGF0ZXMKKyAqIGZvciB0aGUgbmVhcmVzdCBlbnRyeSB0byBzb21lIGNlbGwocykgaW4gdGhlIHVwZGF0ZSBib3guICBUaGUgdXBkYXRlIGJveAorICogaXMgc3BlY2lmaWVkIGJ5IHRoZSBjZW50ZXIgY29vcmRpbmF0ZXMgb2YgaXRzIGZpcnN0IGNlbGwuICBUaGUgbnVtYmVyIG9mCisgKiBjYW5kaWRhdGUgY29sb3JtYXAgZW50cmllcyBpcyByZXR1cm5lZCwgYW5kIHRoZWlyIGNvbG9ybWFwIGluZGV4ZXMgYXJlCisgKiBwbGFjZWQgaW4gY29sb3JsaXN0W10uCisgKiBUaGlzIHJvdXRpbmUgdXNlcyBIZWNrYmVydCdzICJsb2NhbGx5IHNvcnRlZCBzZWFyY2giIGNyaXRlcmlvbiB0byBzZWxlY3QKKyAqIHRoZSBjb2xvcnMgdGhhdCBuZWVkIGZ1cnRoZXIgY29uc2lkZXJhdGlvbi4KKyAqLworeworICBpbnQgbnVtY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgbWF4YzAsIG1heGMxLCBtYXhjMjsKKyAgaW50IGNlbnRlcmMwLCBjZW50ZXJjMSwgY2VudGVyYzI7CisgIGludCBpLCB4LCBuY29sb3JzOworICBJTlQzMiBtaW5tYXhkaXN0LCBtaW5fZGlzdCwgbWF4X2Rpc3QsIHRkaXN0OworICBJTlQzMiBtaW5kaXN0W01BWE5VTUNPTE9SU107CS8qIG1pbiBkaXN0YW5jZSB0byBjb2xvcm1hcCBlbnRyeSBpICovCisKKyAgLyogQ29tcHV0ZSB0cnVlIGNvb3JkaW5hdGVzIG9mIHVwZGF0ZSBib3gncyB1cHBlciBjb3JuZXIgYW5kIGNlbnRlci4KKyAgICogQWN0dWFsbHkgd2UgY29tcHV0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNlbnRlciBvZiB0aGUgdXBwZXItY29ybmVyCisgICAqIGhpc3RvZ3JhbSBjZWxsLCB3aGljaCBhcmUgdGhlIHVwcGVyIGJvdW5kcyBvZiB0aGUgdm9sdW1lIHdlIGNhcmUgYWJvdXQuCisgICAqIE5vdGUgdGhhdCBzaW5jZSAiPj4iIHJvdW5kcyBkb3duLCB0aGUgImNlbnRlciIgdmFsdWVzIG1heSBiZSBjbG9zZXIgdG8KKyAgICogbWluIHRoYW4gdG8gbWF4OyBoZW5jZSBjb21wYXJpc29ucyB0byB0aGVtIG11c3QgYmUgIjw9Iiwgbm90ICI8Ii4KKyAgICovCisgIG1heGMwID0gbWluYzAgKyAoKDEgPDwgQk9YX0MwX1NISUZUKSAtICgxIDw8IEMwX1NISUZUKSk7CisgIGNlbnRlcmMwID0gKG1pbmMwICsgbWF4YzApID4+IDE7CisgIG1heGMxID0gbWluYzEgKyAoKDEgPDwgQk9YX0MxX1NISUZUKSAtICgxIDw8IEMxX1NISUZUKSk7CisgIGNlbnRlcmMxID0gKG1pbmMxICsgbWF4YzEpID4+IDE7CisgIG1heGMyID0gbWluYzIgKyAoKDEgPDwgQk9YX0MyX1NISUZUKSAtICgxIDw8IEMyX1NISUZUKSk7CisgIGNlbnRlcmMyID0gKG1pbmMyICsgbWF4YzIpID4+IDE7CisKKyAgLyogRm9yIGVhY2ggY29sb3IgaW4gY29sb3JtYXAsIGZpbmQ6CisgICAqICAxLiBpdHMgbWluaW11bSBzcXVhcmVkLWRpc3RhbmNlIHRvIGFueSBwb2ludCBpbiB0aGUgdXBkYXRlIGJveAorICAgKiAgICAgKHplcm8gaWYgY29sb3IgaXMgd2l0aGluIHVwZGF0ZSBib3gpOworICAgKiAgMi4gaXRzIG1heGltdW0gc3F1YXJlZC1kaXN0YW5jZSB0byBhbnkgcG9pbnQgaW4gdGhlIHVwZGF0ZSBib3guCisgICAqIEJvdGggb2YgdGhlc2UgY2FuIGJlIGZvdW5kIGJ5IGNvbnNpZGVyaW5nIG9ubHkgdGhlIGNvcm5lcnMgb2YgdGhlIGJveC4KKyAgICogV2Ugc2F2ZSB0aGUgbWluaW11bSBkaXN0YW5jZSBmb3IgZWFjaCBjb2xvciBpbiBtaW5kaXN0W107CisgICAqIG9ubHkgdGhlIHNtYWxsZXN0IG1heGltdW0gZGlzdGFuY2UgaXMgb2YgaW50ZXJlc3QuCisgICAqLworICBtaW5tYXhkaXN0ID0gMHg3RkZGRkZGRkw7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgLyogV2UgY29tcHV0ZSB0aGUgc3F1YXJlZC1jMC1kaXN0YW5jZSB0ZXJtLCB0aGVuIGFkZCBpbiB0aGUgb3RoZXIgdHdvLiAqLworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFswXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMCkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMwKSAqIEMwX1NDQUxFOworICAgICAgbWluX2Rpc3QgPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgfSBlbHNlIGlmICh4ID4gbWF4YzApIHsKKyAgICAgIHRkaXN0ID0gKHggLSBtYXhjMCkgKiBDMF9TQ0FMRTsKKyAgICAgIG1pbl9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzApICogQzBfU0NBTEU7CisgICAgICBtYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgIH0gZWxzZSB7CisgICAgICAvKiB3aXRoaW4gY2VsbCByYW5nZSBzbyBubyBjb250cmlidXRpb24gdG8gbWluX2Rpc3QgKi8KKyAgICAgIG1pbl9kaXN0ID0gMDsKKyAgICAgIGlmICh4IDw9IGNlbnRlcmMwKSB7CisJdGRpc3QgPSAoeCAtIG1heGMwKSAqIEMwX1NDQUxFOworCW1heF9kaXN0ID0gdGRpc3QqdGRpc3Q7CisgICAgICB9IGVsc2UgeworCXRkaXN0ID0gKHggLSBtaW5jMCkgKiBDMF9TQ0FMRTsKKwltYXhfZGlzdCA9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMSkgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMxKSAqIEMxX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzEpICogQzFfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMSkgeworCXRkaXN0ID0gKHggLSBtYXhjMSkgKiBDMV9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMxKSAqIEMxX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIHggPSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsyXVtpXSk7CisgICAgaWYgKHggPCBtaW5jMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWF4YzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgaWYgKHggPiBtYXhjMikgeworICAgICAgdGRpc3QgPSAoeCAtIG1heGMyKSAqIEMyX1NDQUxFOworICAgICAgbWluX2Rpc3QgKz0gdGRpc3QqdGRpc3Q7CisgICAgICB0ZGlzdCA9ICh4IC0gbWluYzIpICogQzJfU0NBTEU7CisgICAgICBtYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICB9IGVsc2UgeworICAgICAgLyogd2l0aGluIGNlbGwgcmFuZ2Ugc28gbm8gY29udHJpYnV0aW9uIHRvIG1pbl9kaXN0ICovCisgICAgICBpZiAoeCA8PSBjZW50ZXJjMikgeworCXRkaXN0ID0gKHggLSBtYXhjMikgKiBDMl9TQ0FMRTsKKwltYXhfZGlzdCArPSB0ZGlzdCp0ZGlzdDsKKyAgICAgIH0gZWxzZSB7CisJdGRpc3QgPSAoeCAtIG1pbmMyKSAqIEMyX1NDQUxFOworCW1heF9kaXN0ICs9IHRkaXN0KnRkaXN0OworICAgICAgfQorICAgIH0KKworICAgIG1pbmRpc3RbaV0gPSBtaW5fZGlzdDsJLyogc2F2ZSBhd2F5IHRoZSByZXN1bHRzICovCisgICAgaWYgKG1heF9kaXN0IDwgbWlubWF4ZGlzdCkKKyAgICAgIG1pbm1heGRpc3QgPSBtYXhfZGlzdDsKKyAgfQorCisgIC8qIE5vdyB3ZSBrbm93IHRoYXQgbm8gY2VsbCBpbiB0aGUgdXBkYXRlIGJveCBpcyBtb3JlIHRoYW4gbWlubWF4ZGlzdAorICAgKiBhd2F5IGZyb20gc29tZSBjb2xvcm1hcCBlbnRyeS4gIFRoZXJlZm9yZSwgb25seSBjb2xvcnMgdGhhdCBhcmUKKyAgICogd2l0aGluIG1pbm1heGRpc3Qgb2Ygc29tZSBwYXJ0IG9mIHRoZSBib3ggbmVlZCBiZSBjb25zaWRlcmVkLgorICAgKi8KKyAgbmNvbG9ycyA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBudW1jb2xvcnM7IGkrKykgeworICAgIGlmIChtaW5kaXN0W2ldIDw9IG1pbm1heGRpc3QpCisgICAgICBjb2xvcmxpc3RbbmNvbG9ycysrXSA9IChKU0FNUExFKSBpOworICB9CisgIHJldHVybiBuY29sb3JzOworfQorCisKK0xPQ0FMKHZvaWQpCitmaW5kX2Jlc3RfY29sb3JzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWluYzAsIGludCBtaW5jMSwgaW50IG1pbmMyLAorCQkgIGludCBudW1jb2xvcnMsIEpTQU1QTEUgY29sb3JsaXN0W10sIEpTQU1QTEUgYmVzdGNvbG9yW10pCisvKiBGaW5kIHRoZSBjbG9zZXN0IGNvbG9ybWFwIGVudHJ5IGZvciBlYWNoIGNlbGwgaW4gdGhlIHVwZGF0ZSBib3gsCisgKiBnaXZlbiB0aGUgbGlzdCBvZiBjYW5kaWRhdGUgY29sb3JzIHByZXBhcmVkIGJ5IGZpbmRfbmVhcmJ5X2NvbG9ycy4KKyAqIFJldHVybiB0aGUgaW5kZXhlcyBvZiB0aGUgY2xvc2VzdCBlbnRyaWVzIGluIHRoZSBiZXN0Y29sb3JbXSBhcnJheS4KKyAqIFRoaXMgcm91dGluZSB1c2VzIFRob21hcycgaW5jcmVtZW50YWwgZGlzdGFuY2UgY2FsY3VsYXRpb24gbWV0aG9kIHRvCisgKiBmaW5kIHRoZSBkaXN0YW5jZSBmcm9tIGEgY29sb3JtYXAgZW50cnkgdG8gc3VjY2Vzc2l2ZSBjZWxscyBpbiB0aGUgYm94LgorICovCit7CisgIGludCBpYzAsIGljMSwgaWMyOworICBpbnQgaSwgaWNvbG9yOworICByZWdpc3RlciBJTlQzMiAqIGJwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0ZGlzdFtdIGFycmF5ICovCisgIEpTQU1QTEUgKiBjcHRyOwkJLyogcG9pbnRlciBpbnRvIGJlc3Rjb2xvcltdIGFycmF5ICovCisgIElOVDMyIGRpc3QwLCBkaXN0MTsJCS8qIGluaXRpYWwgZGlzdGFuY2UgdmFsdWVzICovCisgIHJlZ2lzdGVyIElOVDMyIGRpc3QyOwkJLyogY3VycmVudCBkaXN0YW5jZSBpbiBpbm5lciBsb29wICovCisgIElOVDMyIHh4MCwgeHgxOwkJLyogZGlzdGFuY2UgaW5jcmVtZW50cyAqLworICByZWdpc3RlciBJTlQzMiB4eDI7CisgIElOVDMyIGluYzAsIGluYzEsIGluYzI7CS8qIGluaXRpYWwgdmFsdWVzIGZvciBpbmNyZW1lbnRzICovCisgIC8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0LXNvLWZhciBjb2xvciBmb3IgZWFjaCBjZWxsICovCisgIElOVDMyIGJlc3RkaXN0W0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogSW5pdGlhbGl6ZSBiZXN0LWRpc3RhbmNlIGZvciBlYWNoIGNlbGwgb2YgdGhlIHVwZGF0ZSBib3ggKi8KKyAgYnB0ciA9IGJlc3RkaXN0OworICBmb3IgKGkgPSBCT1hfQzBfRUxFTVMqQk9YX0MxX0VMRU1TKkJPWF9DMl9FTEVNUy0xOyBpID49IDA7IGktLSkKKyAgICAqYnB0cisrID0gMHg3RkZGRkZGRkw7CisgIAorICAvKiBGb3IgZWFjaCBjb2xvciBzZWxlY3RlZCBieSBmaW5kX25lYXJieV9jb2xvcnMsCisgICAqIGNvbXB1dGUgaXRzIGRpc3RhbmNlIHRvIHRoZSBjZW50ZXIgb2YgZWFjaCBjZWxsIGluIHRoZSBib3guCisgICAqIElmIHRoYXQncyBsZXNzIHRoYW4gYmVzdC1zby1mYXIsIHVwZGF0ZSBiZXN0IGRpc3RhbmNlIGFuZCBjb2xvciBudW1iZXIuCisgICAqLworICAKKyAgLyogTm9taW5hbCBzdGVwcyBiZXR3ZWVuIGNlbGwgY2VudGVycyAoIngiIGluIFRob21hcyBhcnRpY2xlKSAqLworI2RlZmluZSBTVEVQX0MwICAoKDEgPDwgQzBfU0hJRlQpICogQzBfU0NBTEUpCisjZGVmaW5lIFNURVBfQzEgICgoMSA8PCBDMV9TSElGVCkgKiBDMV9TQ0FMRSkKKyNkZWZpbmUgU1RFUF9DMiAgKCgxIDw8IEMyX1NISUZUKSAqIEMyX1NDQUxFKQorICAKKyAgZm9yIChpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CisgICAgaWNvbG9yID0gR0VUSlNBTVBMRShjb2xvcmxpc3RbaV0pOworICAgIC8qIENvbXB1dGUgKHNxdWFyZSBvZikgZGlzdGFuY2UgZnJvbSBtaW5jMC9jMS9jMiB0byB0aGlzIGNvbG9yICovCisgICAgaW5jMCA9IChtaW5jMCAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzBdW2ljb2xvcl0pKSAqIEMwX1NDQUxFOworICAgIGRpc3QwID0gaW5jMCppbmMwOworICAgIGluYzEgPSAobWluYzEgLSBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpY29sb3JdKSkgKiBDMV9TQ0FMRTsKKyAgICBkaXN0MCArPSBpbmMxKmluYzE7CisgICAgaW5jMiA9IChtaW5jMiAtIEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ljb2xvcl0pKSAqIEMyX1NDQUxFOworICAgIGRpc3QwICs9IGluYzIqaW5jMjsKKyAgICAvKiBGb3JtIHRoZSBpbml0aWFsIGRpZmZlcmVuY2UgaW5jcmVtZW50cyAqLworICAgIGluYzAgPSBpbmMwICogKDIgKiBTVEVQX0MwKSArIFNURVBfQzAgKiBTVEVQX0MwOworICAgIGluYzEgPSBpbmMxICogKDIgKiBTVEVQX0MxKSArIFNURVBfQzEgKiBTVEVQX0MxOworICAgIGluYzIgPSBpbmMyICogKDIgKiBTVEVQX0MyKSArIFNURVBfQzIgKiBTVEVQX0MyOworICAgIC8qIE5vdyBsb29wIG92ZXIgYWxsIGNlbGxzIGluIGJveCwgdXBkYXRpbmcgZGlzdGFuY2UgcGVyIFRob21hcyBtZXRob2QgKi8KKyAgICBicHRyID0gYmVzdGRpc3Q7CisgICAgY3B0ciA9IGJlc3Rjb2xvcjsKKyAgICB4eDAgPSBpbmMwOworICAgIGZvciAoaWMwID0gQk9YX0MwX0VMRU1TLTE7IGljMCA+PSAwOyBpYzAtLSkgeworICAgICAgZGlzdDEgPSBkaXN0MDsKKyAgICAgIHh4MSA9IGluYzE7CisgICAgICBmb3IgKGljMSA9IEJPWF9DMV9FTEVNUy0xOyBpYzEgPj0gMDsgaWMxLS0pIHsKKwlkaXN0MiA9IGRpc3QxOworCXh4MiA9IGluYzI7CisJZm9yIChpYzIgPSBCT1hfQzJfRUxFTVMtMTsgaWMyID49IDA7IGljMi0tKSB7CisJICBpZiAoZGlzdDIgPCAqYnB0cikgeworCSAgICAqYnB0ciA9IGRpc3QyOworCSAgICAqY3B0ciA9IChKU0FNUExFKSBpY29sb3I7CisJICB9CisJICBkaXN0MiArPSB4eDI7CisJICB4eDIgKz0gMiAqIFNURVBfQzIgKiBTVEVQX0MyOworCSAgYnB0cisrOworCSAgY3B0cisrOworCX0KKwlkaXN0MSArPSB4eDE7CisJeHgxICs9IDIgKiBTVEVQX0MxICogU1RFUF9DMTsKKyAgICAgIH0KKyAgICAgIGRpc3QwICs9IHh4MDsKKyAgICAgIHh4MCArPSAyICogU1RFUF9DMCAqIFNURVBfQzA7CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2ZpbGxfaW52ZXJzZV9jbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgYzAsIGludCBjMSwgaW50IGMyKQorLyogRmlsbCB0aGUgaW52ZXJzZS1jb2xvcm1hcCBlbnRyaWVzIGluIHRoZSB1cGRhdGUgYm94IHRoYXQgY29udGFpbnMgKi8KKy8qIGhpc3RvZ3JhbSBjZWxsIGMwL2MxL2MyLiAgKE9ubHkgdGhhdCBvbmUgY2VsbCBNVVNUIGJlIGZpbGxlZCwgYnV0ICovCisvKiB3ZSBjYW4gZmlsbCBhcyBtYW55IG90aGVycyBhcyB3ZSB3aXNoLikgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICBpbnQgbWluYzAsIG1pbmMxLCBtaW5jMjsJLyogbG93ZXIgbGVmdCBjb3JuZXIgb2YgdXBkYXRlIGJveCAqLworICBpbnQgaWMwLCBpYzEsIGljMjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqIGNwdHI7CS8qIHBvaW50ZXIgaW50byBiZXN0Y29sb3JbXSBhcnJheSAqLworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsJLyogcG9pbnRlciBpbnRvIG1haW4gY2FjaGUgYXJyYXkgKi8KKyAgLyogVGhpcyBhcnJheSBsaXN0cyB0aGUgY2FuZGlkYXRlIGNvbG9ybWFwIGluZGV4ZXMuICovCisgIEpTQU1QTEUgY29sb3JsaXN0W01BWE5VTUNPTE9SU107CisgIGludCBudW1jb2xvcnM7CQkvKiBudW1iZXIgb2YgY2FuZGlkYXRlIGNvbG9ycyAqLworICAvKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBhY3R1YWxseSBjbG9zZXN0IGNvbG9ybWFwIGluZGV4IGZvciBlYWNoIGNlbGwuICovCisgIEpTQU1QTEUgYmVzdGNvbG9yW0JPWF9DMF9FTEVNUyAqIEJPWF9DMV9FTEVNUyAqIEJPWF9DMl9FTEVNU107CisKKyAgLyogQ29udmVydCBjZWxsIGNvb3JkaW5hdGVzIHRvIHVwZGF0ZSBib3ggSUQgKi8KKyAgYzAgPj49IEJPWF9DMF9MT0c7CisgIGMxID4+PSBCT1hfQzFfTE9HOworICBjMiA+Pj0gQk9YX0MyX0xPRzsKKworICAvKiBDb21wdXRlIHRydWUgY29vcmRpbmF0ZXMgb2YgdXBkYXRlIGJveCdzIG9yaWdpbiBjb3JuZXIuCisgICAqIEFjdHVhbGx5IHdlIGNvbXB1dGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjZW50ZXIgb2YgdGhlIGNvcm5lcgorICAgKiBoaXN0b2dyYW0gY2VsbCwgd2hpY2ggYXJlIHRoZSBsb3dlciBib3VuZHMgb2YgdGhlIHZvbHVtZSB3ZSBjYXJlIGFib3V0LgorICAgKi8KKyAgbWluYzAgPSAoYzAgPDwgQk9YX0MwX1NISUZUKSArICgoMSA8PCBDMF9TSElGVCkgPj4gMSk7CisgIG1pbmMxID0gKGMxIDw8IEJPWF9DMV9TSElGVCkgKyAoKDEgPDwgQzFfU0hJRlQpID4+IDEpOworICBtaW5jMiA9IChjMiA8PCBCT1hfQzJfU0hJRlQpICsgKCgxIDw8IEMyX1NISUZUKSA+PiAxKTsKKyAgCisgIC8qIERldGVybWluZSB3aGljaCBjb2xvcm1hcCBlbnRyaWVzIGFyZSBjbG9zZSBlbm91Z2ggdG8gYmUgY2FuZGlkYXRlcworICAgKiBmb3IgdGhlIG5lYXJlc3QgZW50cnkgdG8gc29tZSBjZWxsIGluIHRoZSB1cGRhdGUgYm94LgorICAgKi8KKyAgbnVtY29sb3JzID0gZmluZF9uZWFyYnlfY29sb3JzKGNpbmZvLCBtaW5jMCwgbWluYzEsIG1pbmMyLCBjb2xvcmxpc3QpOworCisgIC8qIERldGVybWluZSB0aGUgYWN0dWFsbHkgbmVhcmVzdCBjb2xvcnMuICovCisgIGZpbmRfYmVzdF9jb2xvcnMoY2luZm8sIG1pbmMwLCBtaW5jMSwgbWluYzIsIG51bWNvbG9ycywgY29sb3JsaXN0LAorCQkgICBiZXN0Y29sb3IpOworCisgIC8qIFNhdmUgdGhlIGJlc3QgY29sb3IgbnVtYmVycyAocGx1cyAxKSBpbiB0aGUgbWFpbiBjYWNoZSBhcnJheSAqLworICBjMCA8PD0gQk9YX0MwX0xPRzsJCS8qIGNvbnZlcnQgSUQgYmFjayB0byBiYXNlIGNlbGwgaW5kZXhlcyAqLworICBjMSA8PD0gQk9YX0MxX0xPRzsKKyAgYzIgPDw9IEJPWF9DMl9MT0c7CisgIGNwdHIgPSBiZXN0Y29sb3I7CisgIGZvciAoaWMwID0gMDsgaWMwIDwgQk9YX0MwX0VMRU1TOyBpYzArKykgeworICAgIGZvciAoaWMxID0gMDsgaWMxIDwgQk9YX0MxX0VMRU1TOyBpYzErKykgeworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bYzAraWMwXVtjMStpYzFdW2MyXTsKKyAgICAgIGZvciAoaWMyID0gMDsgaWMyIDwgQk9YX0MyX0VMRU1TOyBpYzIrKykgeworCSpjYWNoZXArKyA9IChoaXN0Y2VsbCkgKEdFVEpTQU1QTEUoKmNwdHIrKykgKyAxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKgorICogTWFwIHNvbWUgcm93cyBvZiBwaXhlbHMgdG8gdGhlIG91dHB1dCBjb2xvcm1hcHBlZCByZXByZXNlbnRhdGlvbi4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX25vX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBubyBkaXRoZXJpbmcgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaGlzdDNkIGhpc3RvZ3JhbSA9IGNxdWFudGl6ZS0+aGlzdG9ncmFtOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBoaXN0cHRyIGNhY2hlcDsKKyAgcmVnaXN0ZXIgaW50IGMwLCBjMSwgYzI7CisgIGludCByb3c7CisgIEpESU1FTlNJT04gY29sOworICBKRElNRU5TSU9OIHdpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aDsKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBnZXQgcGl4ZWwgdmFsdWUgYW5kIGluZGV4IGludG8gdGhlIGNhY2hlICovCisgICAgICBjMCA9IEdFVEpTQU1QTEUoKmlucHRyKyspID4+IEMwX1NISUZUOworICAgICAgYzEgPSBHRVRKU0FNUExFKCppbnB0cisrKSA+PiBDMV9TSElGVDsKKyAgICAgIGMyID0gR0VUSlNBTVBMRSgqaW5wdHIrKykgPj4gQzJfU0hJRlQ7CisgICAgICBjYWNoZXAgPSAmIGhpc3RvZ3JhbVtjMF1bYzFdW2MyXTsKKyAgICAgIC8qIElmIHdlIGhhdmUgbm90IHNlZW4gdGhpcyBjb2xvciBiZWZvcmUsIGZpbmQgbmVhcmVzdCBjb2xvcm1hcCBlbnRyeSAqLworICAgICAgLyogYW5kIHVwZGF0ZSB0aGUgY2FjaGUgKi8KKyAgICAgIGlmICgqY2FjaGVwID09IDApCisJZmlsbF9pbnZlcnNlX2NtYXAoY2luZm8sIGMwLGMxLGMyKTsKKyAgICAgIC8qIE5vdyBlbWl0IHRoZSBjb2xvcm1hcCBpbmRleCBmb3IgdGhpcyBjZWxsICovCisgICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCpjYWNoZXAgLSAxKTsKKyAgICB9CisgIH0KK30KKworCitNRVRIT0RERUYodm9pZCkKK3Bhc3MyX2ZzX2RpdGhlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKKwkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKKy8qIFRoaXMgdmVyc2lvbiBwZXJmb3JtcyBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nICovCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgcmVnaXN0ZXIgTE9DRlNFUlJPUiBjdXIwLCBjdXIxLCBjdXIyOwkvKiBjdXJyZW50IGVycm9yIG9yIHBpeGVsIHZhbHVlICovCisgIExPQ0ZTRVJST1IgYmVsb3dlcnIwLCBiZWxvd2VycjEsIGJlbG93ZXJyMjsgLyogZXJyb3IgZm9yIHBpeGVsIGJlbG93IGN1ciAqLworICBMT0NGU0VSUk9SIGJwcmV2ZXJyMCwgYnByZXZlcnIxLCBicHJldmVycjI7IC8qIGVycm9yIGZvciBiZWxvdy9wcmV2IGNvbCAqLworICByZWdpc3RlciBGU0VSUlBUUiBlcnJvcnB0cjsJLyogPT4gZnNlcnJvcnNbXSBhdCBjb2x1bW4gYmVmb3JlIGN1cnJlbnQgKi8KKyAgSlNBTVBST1cgaW5wdHI7CQkvKiA9PiBjdXJyZW50IGlucHV0IHBpeGVsICovCisgIEpTQU1QUk9XIG91dHB0cjsJCS8qID0+IGN1cnJlbnQgb3V0cHV0IHBpeGVsICovCisgIGhpc3RwdHIgY2FjaGVwOworICBpbnQgZGlyOwkJCS8qICsxIG9yIC0xIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24gKi8KKyAgaW50IGRpcjM7CQkJLyogMypkaXIsIGZvciBhZHZhbmNpbmcgaW5wdHIgJiBlcnJvcnB0ciAqLworICBpbnQgcm93OworICBKRElNRU5TSU9OIGNvbDsKKyAgSkRJTUVOU0lPTiB3aWR0aCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7CisgIEpTQU1QTEUgKnJhbmdlX2xpbWl0ID0gY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdDsKKyAgaW50ICplcnJvcl9saW1pdCA9IGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlcjsKKyAgSlNBTVBST1cgY29sb3JtYXAwID0gY2luZm8tPmNvbG9ybWFwWzBdOworICBKU0FNUFJPVyBjb2xvcm1hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07CisgIEpTQU1QUk9XIGNvbG9ybWFwMiA9IGNpbmZvLT5jb2xvcm1hcFsyXTsKKyAgU0hJRlRfVEVNUFMKKworICBmb3IgKHJvdyA9IDA7IHJvdyA8IG51bV9yb3dzOyByb3crKykgeworICAgIGlucHRyID0gaW5wdXRfYnVmW3Jvd107CisgICAgb3V0cHRyID0gb3V0cHV0X2J1Zltyb3ddOworICAgIGlmIChjcXVhbnRpemUtPm9uX29kZF9yb3cpIHsKKyAgICAgIC8qIHdvcmsgcmlnaHQgdG8gbGVmdCBpbiB0aGlzIHJvdyAqLworICAgICAgaW5wdHIgKz0gKHdpZHRoLTEpICogMzsJLyogc28gcG9pbnQgdG8gcmlnaHRtb3N0IHBpeGVsICovCisgICAgICBvdXRwdHIgKz0gd2lkdGgtMTsKKyAgICAgIGRpciA9IC0xOworICAgICAgZGlyMyA9IC0zOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzICsgKHdpZHRoKzEpKjM7IC8qID0+IGVudHJ5IGFmdGVyIGxhc3QgY29sdW1uICovCisgICAgICBjcXVhbnRpemUtPm9uX29kZF9yb3cgPSBGQUxTRTsgLyogZmxpcCBmb3IgbmV4dCB0aW1lICovCisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHdvcmsgbGVmdCB0byByaWdodCBpbiB0aGlzIHJvdyAqLworICAgICAgZGlyID0gMTsKKyAgICAgIGRpcjMgPSAzOworICAgICAgZXJyb3JwdHIgPSBjcXVhbnRpemUtPmZzZXJyb3JzOyAvKiA9PiBlbnRyeSBiZWZvcmUgZmlyc3QgcmVhbCBjb2x1bW4gKi8KKyAgICAgIGNxdWFudGl6ZS0+b25fb2RkX3JvdyA9IFRSVUU7IC8qIGZsaXAgZm9yIG5leHQgdGltZSAqLworICAgIH0KKyAgICAvKiBQcmVzZXQgZXJyb3IgdmFsdWVzOiBubyBlcnJvciBwcm9wYWdhdGVkIHRvIGZpcnN0IHBpeGVsIGZyb20gbGVmdCAqLworICAgIGN1cjAgPSBjdXIxID0gY3VyMiA9IDA7CisgICAgLyogYW5kIG5vIGVycm9yIHByb3BhZ2F0ZWQgdG8gcm93IGJlbG93IHlldCAqLworICAgIGJlbG93ZXJyMCA9IGJlbG93ZXJyMSA9IGJlbG93ZXJyMiA9IDA7CisgICAgYnByZXZlcnIwID0gYnByZXZlcnIxID0gYnByZXZlcnIyID0gMDsKKworICAgIGZvciAoY29sID0gd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAvKiBjdXJOIGhvbGRzIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsIG9uIHRoZQorICAgICAgICogY3VycmVudCBsaW5lLiAgQWRkIHRoZSBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIHByZXZpb3VzIGxpbmUKKyAgICAgICAqIHRvIGZvcm0gdGhlIGNvbXBsZXRlIGVycm9yIGNvcnJlY3Rpb24gdGVybSBmb3IgdGhpcyBwaXhlbCwgYW5kCisgICAgICAgKiByb3VuZCB0aGUgZXJyb3IgdGVybSAod2hpY2ggaXMgZXhwcmVzc2VkICogMTYpIHRvIGFuIGludGVnZXIuCisgICAgICAgKiBSSUdIVF9TSElGVCByb3VuZHMgdG93YXJkcyBtaW51cyBpbmZpbml0eSwgc28gYWRkaW5nIDggaXMgY29ycmVjdAorICAgICAgICogZm9yIGVpdGhlciBzaWduIG9mIHRoZSBlcnJvciB2YWx1ZS4KKyAgICAgICAqIE5vdGU6IGVycm9ycHRyIHBvaW50cyB0byAqcHJldmlvdXMqIGNvbHVtbidzIGFycmF5IGVudHJ5LgorICAgICAgICovCisgICAgICBjdXIwID0gUklHSFRfU0hJRlQoY3VyMCArIGVycm9ycHRyW2RpcjMrMF0gKyA4LCA0KTsKKyAgICAgIGN1cjEgPSBSSUdIVF9TSElGVChjdXIxICsgZXJyb3JwdHJbZGlyMysxXSArIDgsIDQpOworICAgICAgY3VyMiA9IFJJR0hUX1NISUZUKGN1cjIgKyBlcnJvcnB0cltkaXIzKzJdICsgOCwgNCk7CisgICAgICAvKiBMaW1pdCB0aGUgZXJyb3IgdXNpbmcgdHJhbnNmZXIgZnVuY3Rpb24gc2V0IGJ5IGluaXRfZXJyb3JfbGltaXQuCisgICAgICAgKiBTZWUgY29tbWVudHMgd2l0aCBpbml0X2Vycm9yX2xpbWl0IGZvciByYXRpb25hbGUuCisgICAgICAgKi8KKyAgICAgIGN1cjAgPSBlcnJvcl9saW1pdFtjdXIwXTsKKyAgICAgIGN1cjEgPSBlcnJvcl9saW1pdFtjdXIxXTsKKyAgICAgIGN1cjIgPSBlcnJvcl9saW1pdFtjdXIyXTsKKyAgICAgIC8qIEZvcm0gcGl4ZWwgdmFsdWUgKyBlcnJvciwgYW5kIHJhbmdlLWxpbWl0IHRvIDAuLk1BWEpTQU1QTEUuCisgICAgICAgKiBUaGUgbWF4aW11bSBlcnJvciBpcyArLSBNQVhKU0FNUExFIChvciBsZXNzIHdpdGggZXJyb3IgbGltaXRpbmcpOworICAgICAgICogdGhpcyBzZXRzIHRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSByYW5nZV9saW1pdCBhcnJheS4KKyAgICAgICAqLworICAgICAgY3VyMCArPSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICAgIGN1cjEgKz0gR0VUSlNBTVBMRShpbnB0clsxXSk7CisgICAgICBjdXIyICs9IEdFVEpTQU1QTEUoaW5wdHJbMl0pOworICAgICAgY3VyMCA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMF0pOworICAgICAgY3VyMSA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMV0pOworICAgICAgY3VyMiA9IEdFVEpTQU1QTEUocmFuZ2VfbGltaXRbY3VyMl0pOworICAgICAgLyogSW5kZXggaW50byB0aGUgY2FjaGUgd2l0aCBhZGp1c3RlZCBwaXhlbCB2YWx1ZSAqLworICAgICAgY2FjaGVwID0gJiBoaXN0b2dyYW1bY3VyMD4+QzBfU0hJRlRdW2N1cjE+PkMxX1NISUZUXVtjdXIyPj5DMl9TSElGVF07CisgICAgICAvKiBJZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgY29sb3IgYmVmb3JlLCBmaW5kIG5lYXJlc3QgY29sb3JtYXAgKi8KKyAgICAgIC8qIGVudHJ5IGFuZCB1cGRhdGUgdGhlIGNhY2hlICovCisgICAgICBpZiAoKmNhY2hlcCA9PSAwKQorCWZpbGxfaW52ZXJzZV9jbWFwKGNpbmZvLCBjdXIwPj5DMF9TSElGVCxjdXIxPj5DMV9TSElGVCxjdXIyPj5DMl9TSElGVCk7CisgICAgICAvKiBOb3cgZW1pdCB0aGUgY29sb3JtYXAgaW5kZXggZm9yIHRoaXMgY2VsbCAqLworICAgICAgeyByZWdpc3RlciBpbnQgcGl4Y29kZSA9ICpjYWNoZXAgLSAxOworCSpvdXRwdHIgPSAoSlNBTVBMRSkgcGl4Y29kZTsKKwkvKiBDb21wdXRlIHJlcHJlc2VudGF0aW9uIGVycm9yIGZvciB0aGlzIHBpeGVsICovCisJY3VyMCAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMFtwaXhjb2RlXSk7CisJY3VyMSAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMVtwaXhjb2RlXSk7CisJY3VyMiAtPSBHRVRKU0FNUExFKGNvbG9ybWFwMltwaXhjb2RlXSk7CisgICAgICB9CisgICAgICAvKiBDb21wdXRlIGVycm9yIGZyYWN0aW9ucyB0byBiZSBwcm9wYWdhdGVkIHRvIGFkamFjZW50IHBpeGVscy4KKyAgICAgICAqIEFkZCB0aGVzZSBpbnRvIHRoZSBydW5uaW5nIHN1bXMsIGFuZCBzaW11bHRhbmVvdXNseSBzaGlmdCB0aGUKKyAgICAgICAqIG5leHQtbGluZSBlcnJvciBzdW1zIGxlZnQgYnkgMSBjb2x1bW4uCisgICAgICAgKi8KKyAgICAgIHsgcmVnaXN0ZXIgTE9DRlNFUlJPUiBibmV4dGVyciwgZGVsdGE7CisKKwlibmV4dGVyciA9IGN1cjA7CS8qIFByb2Nlc3MgY29tcG9uZW50IDAgKi8KKwlkZWx0YSA9IGN1cjAgKiAyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogMyAqLworCWVycm9ycHRyWzBdID0gKEZTRVJST1IpIChicHJldmVycjAgKyBjdXIwKTsKKwljdXIwICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDUgKi8KKwlicHJldmVycjAgPSBiZWxvd2VycjAgKyBjdXIwOworCWJlbG93ZXJyMCA9IGJuZXh0ZXJyOworCWN1cjAgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNyAqLworCWJuZXh0ZXJyID0gY3VyMTsJLyogUHJvY2VzcyBjb21wb25lbnQgMSAqLworCWRlbHRhID0gY3VyMSAqIDI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiAzICovCisJZXJyb3JwdHJbMV0gPSAoRlNFUlJPUikgKGJwcmV2ZXJyMSArIGN1cjEpOworCWN1cjEgKz0gZGVsdGE7CQkvKiBmb3JtIGVycm9yICogNSAqLworCWJwcmV2ZXJyMSA9IGJlbG93ZXJyMSArIGN1cjE7CisJYmVsb3dlcnIxID0gYm5leHRlcnI7CisJY3VyMSArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA3ICovCisJYm5leHRlcnIgPSBjdXIyOwkvKiBQcm9jZXNzIGNvbXBvbmVudCAyICovCisJZGVsdGEgPSBjdXIyICogMjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDMgKi8KKwllcnJvcnB0clsyXSA9IChGU0VSUk9SKSAoYnByZXZlcnIyICsgY3VyMik7CisJY3VyMiArPSBkZWx0YTsJCS8qIGZvcm0gZXJyb3IgKiA1ICovCisJYnByZXZlcnIyID0gYmVsb3dlcnIyICsgY3VyMjsKKwliZWxvd2VycjIgPSBibmV4dGVycjsKKwljdXIyICs9IGRlbHRhOwkJLyogZm9ybSBlcnJvciAqIDcgKi8KKyAgICAgIH0KKyAgICAgIC8qIEF0IHRoaXMgcG9pbnQgY3VyTiBjb250YWlucyB0aGUgNy8xNiBlcnJvciB2YWx1ZSB0byBiZSBwcm9wYWdhdGVkCisgICAgICAgKiB0byB0aGUgbmV4dCBwaXhlbCBvbiB0aGUgY3VycmVudCBsaW5lLCBhbmQgYWxsIHRoZSBlcnJvcnMgZm9yIHRoZQorICAgICAgICogbmV4dCBsaW5lIGhhdmUgYmVlbiBzaGlmdGVkIG92ZXIuICBXZSBhcmUgdGhlcmVmb3JlIHJlYWR5IHRvIG1vdmUgb24uCisgICAgICAgKi8KKyAgICAgIGlucHRyICs9IGRpcjM7CQkvKiBBZHZhbmNlIHBpeGVsIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCisgICAgICBvdXRwdHIgKz0gZGlyOworICAgICAgZXJyb3JwdHIgKz0gZGlyMzsJCS8qIGFkdmFuY2UgZXJyb3JwdHIgdG8gY3VycmVudCBjb2x1bW4gKi8KKyAgICB9CisgICAgLyogUG9zdC1sb29wIGNsZWFudXA6IHdlIG11c3QgdW5sb2FkIHRoZSBmaW5hbCBlcnJvciB2YWx1ZXMgaW50byB0aGUKKyAgICAgKiBmaW5hbCBmc2Vycm9yc1tdIGVudHJ5LiAgTm90ZSB3ZSBuZWVkIG5vdCB1bmxvYWQgYmVsb3dlcnJOIGJlY2F1c2UKKyAgICAgKiBpdCBpcyBmb3IgdGhlIGR1bW15IGNvbHVtbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGFjdHVhbCBhcnJheS4KKyAgICAgKi8KKyAgICBlcnJvcnB0clswXSA9IChGU0VSUk9SKSBicHJldmVycjA7IC8qIHVubG9hZCBwcmV2IGVycnMgaW50byBhcnJheSAqLworICAgIGVycm9ycHRyWzFdID0gKEZTRVJST1IpIGJwcmV2ZXJyMTsKKyAgICBlcnJvcnB0clsyXSA9IChGU0VSUk9SKSBicHJldmVycjI7CisgIH0KK30KKworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZXJyb3ItbGltaXRpbmcgdHJhbnNmZXIgZnVuY3Rpb24gKGxvb2t1cCB0YWJsZSkuCisgKiBUaGUgcmF3IEYtUyBlcnJvciBjb21wdXRhdGlvbiBjYW4gcG90ZW50aWFsbHkgY29tcHV0ZSBlcnJvciB2YWx1ZXMgb2YgdXAgdG8KKyAqICstIE1BWEpTQU1QTEUuICBCdXQgd2Ugd2FudCB0aGUgbWF4aW11bSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gYSBwaXhlbCB0byBiZQorICogbXVjaCBsZXNzLCBvdGhlcndpc2Ugb2J2aW91c2x5IHdyb25nIHBpeGVscyB3aWxsIGJlIGNyZWF0ZWQuICAoVHlwaWNhbAorICogZWZmZWN0cyBpbmNsdWRlIHdlaXJkIGZyaW5nZXMgYXQgY29sb3ItYXJlYSBib3VuZGFyaWVzLCBpc29sYXRlZCBicmlnaHQKKyAqIHBpeGVscyBpbiBhIGRhcmsgYXJlYSwgZXRjLikgIFRoZSBzdGFuZGFyZCBhZHZpY2UgZm9yIGF2b2lkaW5nIHRoaXMgcHJvYmxlbQorICogaXMgdG8gZW5zdXJlIHRoYXQgdGhlICJjb3JuZXJzIiBvZiB0aGUgY29sb3IgY3ViZSBhcmUgYWxsb2NhdGVkIGFzIG91dHB1dAorICogY29sb3JzOyB0aGVuIHJlcGVhdGVkIGVycm9ycyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gY2Fubm90IGNhdXNlIGNhc2NhZGluZworICogZXJyb3IgYnVpbGR1cC4gIEhvd2V2ZXIsIHRoYXQgb25seSBwcmV2ZW50cyB0aGUgZXJyb3IgZnJvbSBnZXR0aW5nCisgKiBjb21wbGV0ZWx5IG91dCBvZiBoYW5kOyBBYXJvbiBHaWxlcyByZXBvcnRzIHRoYXQgZXJyb3IgbGltaXRpbmcgaW1wcm92ZXMKKyAqIHRoZSByZXN1bHRzIGV2ZW4gd2l0aCBjb3JuZXIgY29sb3JzIGFsbG9jYXRlZC4KKyAqIEEgc2ltcGxlIGNsYW1waW5nIG9mIHRoZSBlcnJvciB2YWx1ZXMgdG8gYWJvdXQgKy0gTUFYSlNBTVBMRS84IHdvcmtzIHByZXR0eQorICogd2VsbCwgYnV0IHRoZSBzbW9vdGhlciB0cmFuc2ZlciBmdW5jdGlvbiB1c2VkIGJlbG93IGlzIGV2ZW4gYmV0dGVyLiAgVGhhbmtzCisgKiB0byBBYXJvbiBHaWxlcyBmb3IgdGhpcyBpZGVhLgorICovCisKK0xPQ0FMKHZvaWQpCitpbml0X2Vycm9yX2xpbWl0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGVycm9yX2xpbWl0ZXIgdGFibGUgKi8KK3sKKyAgbXlfY3F1YW50aXplX3B0ciBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikgY2luZm8tPmNxdWFudGl6ZTsKKyAgaW50ICogdGFibGU7CisgIGludCBpbiwgb3V0OworCisgIHRhYmxlID0gKGludCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChNQVhKU0FNUExFKjIrMSkgKiBTSVpFT0YoaW50KSk7CisgIHRhYmxlICs9IE1BWEpTQU1QTEU7CQkvKiBzbyBjYW4gaW5kZXggLU1BWEpTQU1QTEUgLi4gK01BWEpTQU1QTEUgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gdGFibGU7CisKKyNkZWZpbmUgU1RFUFNJWkUgKChNQVhKU0FNUExFKzEpLzE2KQorICAvKiBNYXAgZXJyb3JzIDE6MSB1cCB0byArLSBNQVhKU0FNUExFLzE2ICovCisgIG91dCA9IDA7CisgIGZvciAoaW4gPSAwOyBpbiA8IFNURVBTSVpFOyBpbisrLCBvdXQrKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogTWFwIGVycm9ycyAxOjIgdXAgdG8gKy0gMypNQVhKU0FNUExFLzE2ICovCisgIGZvciAoOyBpbiA8IFNURVBTSVpFKjM7IGluKyssIG91dCArPSAoaW4mMSkgPyAwIDogMSkgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyAgLyogQ2xhbXAgdGhlIHJlc3QgdG8gZmluYWwgb3V0IHZhbHVlICh3aGljaCBpcyAoTUFYSlNBTVBMRSsxKS84KSAqLworICBmb3IgKDsgaW4gPD0gTUFYSlNBTVBMRTsgaW4rKykgeworICAgIHRhYmxlW2luXSA9IG91dDsgdGFibGVbLWluXSA9IC1vdXQ7CisgIH0KKyN1bmRlZiBTVEVQU0laRQorfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBlYWNoIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogU2VsZWN0IHRoZSByZXByZXNlbnRhdGl2ZSBjb2xvcnMgYW5kIGZpbGwgaW4gY2luZm8tPmNvbG9ybWFwICovCisgIGNpbmZvLT5jb2xvcm1hcCA9IGNxdWFudGl6ZS0+c3ZfY29sb3JtYXA7CisgIHNlbGVjdF9jb2xvcnMoY2luZm8sIGNxdWFudGl6ZS0+ZGVzaXJlZCk7CisgIC8qIEZvcmNlIG5leHQgcGFzcyB0byB6ZXJvIHRoZSBjb2xvciBpbmRleCB0YWJsZSAqLworICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfcGFzczIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogSW5pdGlhbGl6ZSBmb3IgZWFjaCBwcm9jZXNzaW5nIHBhc3MuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9wYXNzXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisgIGhpc3QzZCBoaXN0b2dyYW0gPSBjcXVhbnRpemUtPmhpc3RvZ3JhbTsKKyAgaW50IGk7CisKKyAgLyogT25seSBGLVMgZGl0aGVyaW5nIG9yIG5vIGRpdGhlcmluZyBpcyBzdXBwb3J0ZWQuICovCisgIC8qIElmIHVzZXIgYXNrcyBmb3Igb3JkZXJlZCBkaXRoZXIsIGdpdmUgaGltIEYtUy4gKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSAhPSBKRElUSEVSX05PTkUpCisgICAgY2luZm8tPmRpdGhlcl9tb2RlID0gSkRJVEhFUl9GUzsKKworICBpZiAoaXNfcHJlX3NjYW4pIHsKKyAgICAvKiBTZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCisgICAgY3F1YW50aXplLT5wdWIuY29sb3JfcXVhbnRpemUgPSBwcmVzY2FuX3F1YW50aXplOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MxOworICAgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsgLyogQWx3YXlzIHplcm8gaGlzdG9ncmFtICovCisgIH0gZWxzZSB7CisgICAgLyogU2V0IHVwIG1ldGhvZCBwb2ludGVycyAqLworICAgIGlmIChjaW5mby0+ZGl0aGVyX21vZGUgPT0gSkRJVEhFUl9GUykKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfZnNfZGl0aGVyOworICAgIGVsc2UKKyAgICAgIGNxdWFudGl6ZS0+cHViLmNvbG9yX3F1YW50aXplID0gcGFzczJfbm9fZGl0aGVyOworICAgIGNxdWFudGl6ZS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3MyOworCisgICAgLyogTWFrZSBzdXJlIGNvbG9yIGNvdW50IGlzIGFjY2VwdGFibGUgKi8KKyAgICBpID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICAgIGlmIChpIDwgMSkKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX0ZFV19DT0xPUlMsIDEpOworICAgIGlmIChpID4gTUFYTlVNQ09MT1JTKQorICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsIE1BWE5VTUNPTE9SUyk7CisKKyAgICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlID09IEpESVRIRVJfRlMpIHsKKyAgICAgIHNpemVfdCBhcnJheXNpemUgPSAoc2l6ZV90KSAoKGNpbmZvLT5vdXRwdXRfd2lkdGggKyAyKSAqCisJCQkJICAgKDMgKiBTSVpFT0YoRlNFUlJPUikpKTsKKyAgICAgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgd2UgZGlkbid0IGFscmVhZHkuICovCisgICAgICBpZiAoY3F1YW50aXplLT5mc2Vycm9ycyA9PSBOVUxMKQorCWNxdWFudGl6ZS0+ZnNlcnJvcnMgPSAoRlNFUlJQVFIpICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpCisJICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBhcnJheXNpemUpOworICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgcHJvcGFnYXRlZCBlcnJvcnMgdG8gemVyby4gKi8KKyAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY3F1YW50aXplLT5mc2Vycm9ycywgYXJyYXlzaXplKTsKKyAgICAgIC8qIE1ha2UgdGhlIGVycm9yLWxpbWl0IHRhYmxlIGlmIHdlIGRpZG4ndCBhbHJlYWR5LiAqLworICAgICAgaWYgKGNxdWFudGl6ZS0+ZXJyb3JfbGltaXRlciA9PSBOVUxMKQorCWluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICAgICAgY3F1YW50aXplLT5vbl9vZGRfcm93ID0gRkFMU0U7CisgICAgfQorCisgIH0KKyAgLyogWmVybyB0aGUgaGlzdG9ncmFtIG9yIGludmVyc2UgY29sb3IgbWFwLCBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEhJU1RfQzBfRUxFTVM7IGkrKykgeworICAgICAganplcm9fZmFyKCh2b2lkIEZBUiAqKSBoaXN0b2dyYW1baV0sCisJCUhJU1RfQzFfRUxFTVMqSElTVF9DMl9FTEVNUyAqIFNJWkVPRihoaXN0Y2VsbCkpOworICAgIH0KKyAgICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IEZBTFNFOworICB9Cit9CisKKworLyoKKyAqIFN3aXRjaCB0byBhIG5ldyBleHRlcm5hbCBjb2xvcm1hcCBiZXR3ZWVuIG91dHB1dCBwYXNzZXMuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCituZXdfY29sb3JfbWFwXzJfcXVhbnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplID0gKG15X2NxdWFudGl6ZV9wdHIpIGNpbmZvLT5jcXVhbnRpemU7CisKKyAgLyogUmVzZXQgdGhlIGludmVyc2UgY29sb3IgbWFwICovCisgIGNxdWFudGl6ZS0+bmVlZHNfemVyb2VkID0gVFJVRTsKK30KKworCisvKgorICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIDItcGFzcyBjb2xvciBxdWFudGl6YXRpb24uCisgKi8KKworR0xPQkFMKHZvaWQpCitqaW5pdF8ycGFzc19xdWFudGl6ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIG15X2NxdWFudGl6ZV9wdHIgY3F1YW50aXplOworICBpbnQgaTsKKworICBjcXVhbnRpemUgPSAobXlfY3F1YW50aXplX3B0cikKKyAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCVNJWkVPRihteV9jcXVhbnRpemVyKSk7CisgIGNpbmZvLT5jcXVhbnRpemUgPSAoc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICopIGNxdWFudGl6ZTsKKyAgY3F1YW50aXplLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfMl9xdWFudDsKKyAgY3F1YW50aXplLT5wdWIubmV3X2NvbG9yX21hcCA9IG5ld19jb2xvcl9tYXBfMl9xdWFudDsKKyAgY3F1YW50aXplLT5mc2Vycm9ycyA9IE5VTEw7CS8qIGZsYWcgb3B0aW9uYWwgYXJyYXlzIG5vdCBhbGxvY2F0ZWQgKi8KKyAgY3F1YW50aXplLT5lcnJvcl9saW1pdGVyID0gTlVMTDsKKworICAvKiBNYWtlIHN1cmUgamRtYXN0ZXIgZGlkbid0IGdpdmUgbWUgYSBjYXNlIEkgY2FuJ3QgaGFuZGxlICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gMykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOworCisgIC8qIEFsbG9jYXRlIHRoZSBoaXN0b2dyYW0vaW52ZXJzZSBjb2xvcm1hcCBzdG9yYWdlICovCisgIGNxdWFudGl6ZS0+aGlzdG9ncmFtID0gKGhpc3QzZCkgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBISVNUX0MwX0VMRU1TICogU0laRU9GKGhpc3QyZCkpOworICBmb3IgKGkgPSAwOyBpIDwgSElTVF9DMF9FTEVNUzsgaSsrKSB7CisgICAgY3F1YW50aXplLT5oaXN0b2dyYW1baV0gPSAoaGlzdDJkKSAoKmNpbmZvLT5tZW0tPmFsbG9jX2xhcmdlKQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICBISVNUX0MxX0VMRU1TKkhJU1RfQzJfRUxFTVMgKiBTSVpFT0YoaGlzdGNlbGwpKTsKKyAgfQorICBjcXVhbnRpemUtPm5lZWRzX3plcm9lZCA9IFRSVUU7IC8qIGhpc3RvZ3JhbSBpcyBnYXJiYWdlIG5vdyAqLworCisgIC8qIEFsbG9jYXRlIHN0b3JhZ2UgZm9yIHRoZSBjb21wbGV0ZWQgY29sb3JtYXAsIGlmIHJlcXVpcmVkLgorICAgKiBXZSBkbyB0aGlzIG5vdyBzaW5jZSBpdCBpcyBGQVIgc3RvcmFnZSBhbmQgbWF5IGFmZmVjdAorICAgKiB0aGUgbWVtb3J5IG1hbmFnZXIncyBzcGFjZSBjYWxjdWxhdGlvbnMuCisgICAqLworICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCkgeworICAgIC8qIE1ha2Ugc3VyZSBjb2xvciBjb3VudCBpcyBhY2NlcHRhYmxlICovCisgICAgaW50IGRlc2lyZWQgPSBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzOworICAgIC8qIExvd2VyIGJvdW5kIG9uICMgb2YgY29sb3JzIC4uLiBzb21ld2hhdCBhcmJpdHJhcnkgYXMgbG9uZyBhcyA+IDAgKi8KKyAgICBpZiAoZGVzaXJlZCA8IDgpCisgICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCA4KTsKKyAgICAvKiBNYWtlIHN1cmUgY29sb3JtYXAgaW5kZXhlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgSlNBTVBMRXMgKi8KKyAgICBpZiAoZGVzaXJlZCA+IE1BWE5VTUNPTE9SUykKKyAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCBNQVhOVU1DT0xPUlMpOworICAgIGNxdWFudGl6ZS0+c3ZfY29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbyxKUE9PTF9JTUFHRSwgKEpESU1FTlNJT04pIGRlc2lyZWQsIChKRElNRU5TSU9OKSAzKTsKKyAgICBjcXVhbnRpemUtPmRlc2lyZWQgPSBkZXNpcmVkOworICB9IGVsc2UKKyAgICBjcXVhbnRpemUtPnN2X2NvbG9ybWFwID0gTlVMTDsKKworICAvKiBPbmx5IEYtUyBkaXRoZXJpbmcgb3Igbm8gZGl0aGVyaW5nIGlzIHN1cHBvcnRlZC4gKi8KKyAgLyogSWYgdXNlciBhc2tzIGZvciBvcmRlcmVkIGRpdGhlciwgZ2l2ZSBoaW0gRi1TLiAqLworICBpZiAoY2luZm8tPmRpdGhlcl9tb2RlICE9IEpESVRIRVJfTk9ORSkKKyAgICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOworCisgIC8qIEFsbG9jYXRlIEZsb3lkLVN0ZWluYmVyZyB3b3Jrc3BhY2UgaWYgbmVjZXNzYXJ5LgorICAgKiBUaGlzIGlzbid0IHJlYWxseSBuZWVkZWQgdW50aWwgcGFzcyAyLCBidXQgYWdhaW4gaXQgaXMgRkFSIHN0b3JhZ2UuCisgICAqIEFsdGhvdWdoIHdlIHdpbGwgY29wZSB3aXRoIGEgbGF0ZXIgY2hhbmdlIGluIGRpdGhlcl9tb2RlLAorICAgKiB3ZSBkbyBub3QgcHJvbWlzZSB0byBob25vciBtYXhfbWVtb3J5X3RvX3VzZSBpZiBkaXRoZXJfbW9kZSBjaGFuZ2VzLgorICAgKi8KKyAgaWYgKGNpbmZvLT5kaXRoZXJfbW9kZSA9PSBKRElUSEVSX0ZTKSB7CisgICAgY3F1YW50aXplLT5mc2Vycm9ycyA9IChGU0VSUlBUUikgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKHNpemVfdCkgKChjaW5mby0+b3V0cHV0X3dpZHRoICsgMikgKiAoMyAqIFNJWkVPRihGU0VSUk9SKSkpKTsKKyAgICAvKiBNaWdodCBhcyB3ZWxsIGNyZWF0ZSB0aGUgZXJyb3ItbGltaXRpbmcgdGFibGUgdG9vLiAqLworICAgIGluaXRfZXJyb3JfbGltaXQoY2luZm8pOworICB9Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qdXRpbHMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZhZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2p1dGlscy5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICoganV0aWxzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0YWJsZXMgYW5kIG1pc2NlbGxhbmVvdXMgdXRpbGl0eSByb3V0aW5lcyBuZWVkZWQKKyAqIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorICogTm90ZSB3ZSBwcmVmaXggYWxsIGdsb2JhbCBuYW1lcyB3aXRoICJqIiB0byBtaW5pbWl6ZSBjb25mbGljdHMgd2l0aAorICogYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KKyAqLworCisjZGVmaW5lIEpQRUdfSU5URVJOQUxTCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisKKworLyoKKyAqIGpwZWdfemlnemFnX29yZGVyW2ldIGlzIHRoZSB6aWd6YWctb3JkZXIgcG9zaXRpb24gb2YgdGhlIGkndGggZWxlbWVudAorICogb2YgYSBEQ1QgYmxvY2sgcmVhZCBpbiBuYXR1cmFsIG9yZGVyIChsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tKS4KKyAqLworCisjaWYgMAkJCQkvKiBUaGlzIHRhYmxlIGlzIG5vdCBhY3R1YWxseSBuZWVkZWQgaW4gdjZhICovCisKK2NvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltEQ1RTSVpFMl0gPSB7CisgICAwLCAgMSwgIDUsICA2LCAxNCwgMTUsIDI3LCAyOCwKKyAgIDIsICA0LCAgNywgMTMsIDE2LCAyNiwgMjksIDQyLAorICAgMywgIDgsIDEyLCAxNywgMjUsIDMwLCA0MSwgNDMsCisgICA5LCAxMSwgMTgsIDI0LCAzMSwgNDAsIDQ0LCA1MywKKyAgMTAsIDE5LCAyMywgMzIsIDM5LCA0NSwgNTIsIDU0LAorICAyMCwgMjIsIDMzLCAzOCwgNDYsIDUxLCA1NSwgNjAsCisgIDIxLCAzNCwgMzcsIDQ3LCA1MCwgNTYsIDU5LCA2MSwKKyAgMzUsIDM2LCA0OCwgNDksIDU3LCA1OCwgNjIsIDYzCit9OworCisjZW5kaWYKKworLyoKKyAqIGpwZWdfbmF0dXJhbF9vcmRlcltpXSBpcyB0aGUgbmF0dXJhbC1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50CisgKiBvZiB6aWd6YWcgb3JkZXIuCisgKgorICogV2hlbiByZWFkaW5nIGNvcnJ1cHRlZCBkYXRhLCB0aGUgSHVmZm1hbiBkZWNvZGVycyBjb3VsZCBhdHRlbXB0CisgKiB0byByZWZlcmVuY2UgYW4gZW50cnkgYmV5b25kIHRoZSBlbmQgb2YgdGhpcyBhcnJheSAoaWYgdGhlIGRlY29kZWQKKyAqIHplcm8gcnVuIGxlbmd0aCByZWFjaGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYmxvY2spLiAgVG8gcHJldmVudAorICogd2lsZCBzdG9yZXMgd2l0aG91dCBhZGRpbmcgYW4gaW5uZXItbG9vcCB0ZXN0LCB3ZSBwdXQgc29tZSBleHRyYQorICogIjYzInMgYWZ0ZXIgdGhlIHJlYWwgZW50cmllcy4gIFRoaXMgd2lsbCBjYXVzZSB0aGUgZXh0cmEgY29lZmZpY2llbnQKKyAqIHRvIGJlIHN0b3JlZCBpbiBsb2NhdGlvbiA2MyBvZiB0aGUgYmxvY2ssIG5vdCBzb21ld2hlcmUgcmFuZG9tLgorICogVGhlIHdvcnN0IGNhc2Ugd291bGQgYmUgYSBydW4tbGVuZ3RoIG9mIDE1LCB3aGljaCBtZWFucyB3ZSBuZWVkIDE2CisgKiBmYWtlIGVudHJpZXMuCisgKi8KKworY29uc3QgaW50IGpwZWdfbmF0dXJhbF9vcmRlcltEQ1RTSVpFMisxNl0gPSB7CisgIDAsICAxLCAgOCwgMTYsICA5LCAgMiwgIDMsIDEwLAorIDE3LCAyNCwgMzIsIDI1LCAxOCwgMTEsICA0LCAgNSwKKyAxMiwgMTksIDI2LCAzMywgNDAsIDQ4LCA0MSwgMzQsCisgMjcsIDIwLCAxMywgIDYsICA3LCAxNCwgMjEsIDI4LAorIDM1LCA0MiwgNDksIDU2LCA1NywgNTAsIDQzLCAzNiwKKyAyOSwgMjIsIDE1LCAyMywgMzAsIDM3LCA0NCwgNTEsCisgNTgsIDU5LCA1MiwgNDUsIDM4LCAzMSwgMzksIDQ2LAorIDUzLCA2MCwgNjEsIDU0LCA0NywgNTUsIDYyLCA2MywKKyA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIC8qIGV4dHJhIGVudHJpZXMgZm9yIHNhZmV0eSBpbiBkZWNvZGVyICovCisgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCit9OworCisKKy8qCisgKiBBcml0aG1ldGljIHV0aWxpdGllcworICovCisKK0dMT0JBTChsb25nKQoramRpdl9yb3VuZF91cCAobG9uZyBhLCBsb25nIGIpCisvKiBDb21wdXRlIGEvYiByb3VuZGVkIHVwIHRvIG5leHQgaW50ZWdlciwgaWUsIGNlaWwoYS9iKSAqLworLyogQXNzdW1lcyBhID49IDAsIGIgPiAwICovCit7CisgIHJldHVybiAoYSArIGIgLSAxTCkgLyBiOworfQorCisKK0dMT0JBTChsb25nKQoranJvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKKy8qIENvbXB1dGUgYSByb3VuZGVkIHVwIHRvIG5leHQgbXVsdGlwbGUgb2YgYiwgaWUsIGNlaWwoYS9iKSpiICovCisvKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KK3sKKyAgYSArPSBiIC0gMUw7CisgIHJldHVybiBhIC0gKGEgJSBiKTsKK30KKworR0xPQkFMKGxvbmcpCitqbWluIChsb25nIGEsIGxvbmcgYikKK3sKKyAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKKworLyogT24gbm9ybWFsIG1hY2hpbmVzIHdlIGNhbiBhcHBseSBNRU1DT1BZKCkgYW5kIE1FTVpFUk8oKSB0byBzYW1wbGUgYXJyYXlzCisgKiBhbmQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLiAgVGhpcyB3b24ndCB3b3JrIG9uIDgweDg2IGJlY2F1c2UgdGhlIGFycmF5cworICogYXJlIEZBUiBhbmQgd2UncmUgYXNzdW1pbmcgYSBzbWFsbC1wb2ludGVyIG1lbW9yeSBtb2RlbC4gIEhvd2V2ZXIsIHNvbWUKKyAqIERPUyBjb21waWxlcnMgcHJvdmlkZSBmYXItcG9pbnRlciB2ZXJzaW9ucyBvZiBtZW1jcHkoKSBhbmQgbWVtc2V0KCkgZXZlbgorICogaW4gdGhlIHNtYWxsLW1vZGVsIGxpYnJhcmllcy4gIFRoZXNlIHdpbGwgYmUgdXNlZCBpZiBVU0VfRk1FTSBpcyBkZWZpbmVkLgorICogT3RoZXJ3aXNlLCB0aGUgcm91dGluZXMgYmVsb3cgZG8gaXQgdGhlIGhhcmQgd2F5LiAgKFRoZSBwZXJmb3JtYW5jZSBjb3N0CisgKiBpcyBub3QgYWxsIHRoYXQgZ3JlYXQsIGJlY2F1c2UgdGhlc2Ugcm91dGluZXMgYXJlbid0IHZlcnkgaGVhdmlseSB1c2VkLikKKyAqLworCisjaWZuZGVmIE5FRURfRkFSX1BPSU5URVJTCS8qIG5vcm1hbCBjYXNlLCBzYW1lIGFzIHJlZ3VsYXIgbWFjcm9zICovCisjZGVmaW5lIEZNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCU1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkKKyNkZWZpbmUgRk1FTVpFUk8odGFyZ2V0LHNpemUpCU1FTVpFUk8odGFyZ2V0LHNpemUpCisjZWxzZQkJCQkvKiA4MHg4NiBjYXNlLCBkZWZpbmUgaWYgd2UgY2FuICovCisjaWZkZWYgVVNFX0ZNRU0KKyNkZWZpbmUgRk1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJX2ZtZW1jcHkoKHZvaWQgRkFSICopKGRlc3QpLCAoY29uc3Qgdm9pZCBGQVIgKikoc3JjKSwgKHNpemVfdCkoc2l6ZSkpCisjZGVmaW5lIEZNRU1aRVJPKHRhcmdldCxzaXplKQlfZm1lbXNldCgodm9pZCBGQVIgKikodGFyZ2V0KSwgMCwgKHNpemVfdCkoc2l6ZSkpCisjZW5kaWYKKyNlbmRpZgorCisKK0dMT0JBTCh2b2lkKQoramNvcHlfc2FtcGxlX3Jvd3MgKEpTQU1QQVJSQVkgaW5wdXRfYXJyYXksIGludCBzb3VyY2Vfcm93LAorCQkgICBKU0FNUEFSUkFZIG91dHB1dF9hcnJheSwgaW50IGRlc3Rfcm93LAorCQkgICBpbnQgbnVtX3Jvd3MsIEpESU1FTlNJT04gbnVtX2NvbHMpCisvKiBDb3B5IHNvbWUgcm93cyBvZiBzYW1wbGVzIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIuCisgKiBudW1fcm93cyByb3dzIGFyZSBjb3BpZWQgZnJvbSBpbnB1dF9hcnJheVtzb3VyY2Vfcm93KytdCisgKiB0byBvdXRwdXRfYXJyYXlbZGVzdF9yb3crK107IHRoZXNlIGFyZWFzIG1heSBvdmVybGFwIGZvciBkdXBsaWNhdGlvbi4KKyAqIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFycmF5cyBtdXN0IGJlIGF0IGxlYXN0IGFzIHdpZGUgYXMgbnVtX2NvbHMuCisgKi8KK3sKKyAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKKyNpZmRlZiBGTUVNQ09QWQorICByZWdpc3RlciBzaXplX3QgY291bnQgPSAoc2l6ZV90KSAobnVtX2NvbHMgKiBTSVpFT0YoSlNBTVBMRSkpOworI2Vsc2UKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb3VudDsKKyNlbmRpZgorICByZWdpc3RlciBpbnQgcm93OworCisgIGlucHV0X2FycmF5ICs9IHNvdXJjZV9yb3c7CisgIG91dHB1dF9hcnJheSArPSBkZXN0X3JvdzsKKworICBmb3IgKHJvdyA9IG51bV9yb3dzOyByb3cgPiAwOyByb3ctLSkgeworICAgIGlucHRyID0gKmlucHV0X2FycmF5Kys7CisgICAgb3V0cHRyID0gKm91dHB1dF9hcnJheSsrOworI2lmZGVmIEZNRU1DT1BZCisgICAgRk1FTUNPUFkob3V0cHRyLCBpbnB0ciwgY291bnQpOworI2Vsc2UKKyAgICBmb3IgKGNvdW50ID0gbnVtX2NvbHM7IGNvdW50ID4gMDsgY291bnQtLSkKKyAgICAgICpvdXRwdHIrKyA9ICppbnB0cisrOwkvKiBuZWVkbid0IGJvdGhlciB3aXRoIEdFVEpTQU1QTEUoKSBoZXJlICovCisjZW5kaWYKKyAgfQorfQorCisKK0dMT0JBTCh2b2lkKQoramNvcHlfYmxvY2tfcm93IChKQkxPQ0tST1cgaW5wdXRfcm93LCBKQkxPQ0tST1cgb3V0cHV0X3JvdywKKwkJIEpESU1FTlNJT04gbnVtX2Jsb2NrcykKKy8qIENvcHkgYSByb3cgb2YgY29lZmZpY2llbnQgYmxvY2tzIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIuICovCit7CisjaWZkZWYgRk1FTUNPUFkKKyAgRk1FTUNPUFkob3V0cHV0X3JvdywgaW5wdXRfcm93LCBudW1fYmxvY2tzICogKERDVFNJWkUyICogU0laRU9GKEpDT0VGKSkpOworI2Vsc2UKKyAgcmVnaXN0ZXIgSkNPRUZQVFIgaW5wdHIsIG91dHB0cjsKKyAgcmVnaXN0ZXIgbG9uZyBjb3VudDsKKworICBpbnB0ciA9IChKQ09FRlBUUikgaW5wdXRfcm93OworICBvdXRwdHIgPSAoSkNPRUZQVFIpIG91dHB1dF9yb3c7CisgIGZvciAoY291bnQgPSAobG9uZykgbnVtX2Jsb2NrcyAqIERDVFNJWkUyOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsKKyAgfQorI2VuZGlmCit9CisKKworR0xPQkFMKHZvaWQpCitqemVyb19mYXIgKHZvaWQgRkFSICogdGFyZ2V0LCBzaXplX3QgYnl0ZXN0b3plcm8pCisvKiBaZXJvIG91dCBhIGNodW5rIG9mIEZBUiBtZW1vcnkuICovCisvKiBUaGlzIG1pZ2h0IGJlIHNhbXBsZS1hcnJheSBkYXRhLCBibG9jay1hcnJheSBkYXRhLCBvciBhbGxvY19sYXJnZSBkYXRhLiAqLworeworI2lmZGVmIEZNRU1aRVJPCisgIEZNRU1aRVJPKHRhcmdldCwgYnl0ZXN0b3plcm8pOworI2Vsc2UKKyAgcmVnaXN0ZXIgY2hhciBGQVIgKiBwdHIgPSAoY2hhciBGQVIgKikgdGFyZ2V0OworICByZWdpc3RlciBzaXplX3QgY291bnQ7CisKKyAgZm9yIChjb3VudCA9IGJ5dGVzdG96ZXJvOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKyAgICAqcHRyKysgPSAwOworICB9CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qdmVyc2lvbi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2p2ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3MmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9qdmVyc2lvbi5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBqdmVyc2lvbi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgc29mdHdhcmUgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4KKyAqLworCisKKyNkZWZpbmUgSlZFUlNJT04JIjZiICAyNy1NYXItMTk5OCIKKworI2RlZmluZSBKQ09QWVJJR0hUCSJDb3B5cmlnaHQgKEMpIDE5OTgsIFRob21hcyBHLiBMYW5lIgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2xpYmpwZWcuZG9jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2xpYmpwZWcuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbGlianBlZy5kb2MKQEAgLTAsMCArMSwzMDA2IEBACitVU0lORyBUSEUgSUpHIEpQRUcgTElCUkFSWQorCitDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK1RoaXMgZmlsZSBkZXNjcmliZXMgaG93IHRvIHVzZSB0aGUgSUpHIEpQRUcgbGlicmFyeSB3aXRoaW4gYW4gYXBwbGljYXRpb24KK3Byb2dyYW0uICBSZWFkIGl0IGlmIHlvdSB3YW50IHRvIHdyaXRlIGEgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIGxpYnJhcnkuCisKK1RoZSBmaWxlIGV4YW1wbGUuYyBwcm92aWRlcyBoZWF2aWx5IGNvbW1lbnRlZCBza2VsZXRvbiBjb2RlIGZvciBjYWxsaW5nIHRoZQorSlBFRyBsaWJyYXJ5LiAgQWxzbyBzZWUganBlZ2xpYi5oICh0aGUgaW5jbHVkZSBmaWxlIHRvIGJlIHVzZWQgYnkgYXBwbGljYXRpb24KK3Byb2dyYW1zKSBmb3IgZnVsbCBkZXRhaWxzIGFib3V0IGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzLgorVGhlIGxpYnJhcnkgc291cmNlIGNvZGUsIG9mIGNvdXJzZSwgaXMgdGhlIHVsdGltYXRlIHJlZmVyZW5jZS4KKworTm90ZSB0aGF0IHRoZXJlIGhhdmUgYmVlbiAqbWFqb3IqIGNoYW5nZXMgZnJvbSB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlCitwcmVzZW50ZWQgYnkgSUpHIHZlcnNpb24gNCBhbmQgZWFybGllciB2ZXJzaW9ucy4gIFRoZSBvbGQgZGVzaWduIGhhZCBzZXZlcmFsCitpbmhlcmVudCBsaW1pdGF0aW9ucywgYW5kIGl0IGhhZCBhY2N1bXVsYXRlZCBhIGxvdCBvZiBjcnVmdCBhcyB3ZSBhZGRlZAorZmVhdHVyZXMgd2hpbGUgdHJ5aW5nIHRvIG1pbmltaXplIGFwcGxpY2F0aW9uLWludGVyZmFjZSBjaGFuZ2VzLiAgV2UgaGF2ZQorc2FjcmlmaWNlZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIHRoZSB2ZXJzaW9uIDUgcmV3cml0ZSwgYnV0IHdlIHRoaW5rIHRoZQoraW1wcm92ZW1lbnRzIGp1c3RpZnkgdGhpcy4KKworCitUQUJMRSBPRiBDT05URU5UUworLS0tLS0tLS0tLS0tLS0tLS0KKworT3ZlcnZpZXc6CisJRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5CisJT3V0bGluZSBvZiB0eXBpY2FsIHVzYWdlCitCYXNpYyBsaWJyYXJ5IHVzYWdlOgorCURhdGEgZm9ybWF0cworCUNvbXByZXNzaW9uIGRldGFpbHMKKwlEZWNvbXByZXNzaW9uIGRldGFpbHMKKwlNZWNoYW5pY3Mgb2YgdXNhZ2U6IGluY2x1ZGUgZmlsZXMsIGxpbmtpbmcsIGV0YworQWR2YW5jZWQgZmVhdHVyZXM6CisJQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgorCURlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgorCVNwZWNpYWwgY29sb3Igc3BhY2VzCisJRXJyb3IgaGFuZGxpbmcKKwlDb21wcmVzc2VkIGRhdGEgaGFuZGxpbmcgKHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnMpCisJSS9PIHN1c3BlbnNpb24KKwlQcm9ncmVzc2l2ZSBKUEVHIHN1cHBvcnQKKwlCdWZmZXJlZC1pbWFnZSBtb2RlCisJQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMgYW5kIG11bHRpcGxlIGltYWdlcworCVNwZWNpYWwgbWFya2VycworCVJhdyAoZG93bnNhbXBsZWQpIGltYWdlIGRhdGEKKwlSZWFsbHkgcmF3IGRhdGE6IERDVCBjb2VmZmljaWVudHMKKwlQcm9ncmVzcyBtb25pdG9yaW5nCisJTWVtb3J5IG1hbmFnZW1lbnQKKwlNZW1vcnkgdXNhZ2UKKwlMaWJyYXJ5IGNvbXBpbGUtdGltZSBvcHRpb25zCisJUG9ydGFiaWxpdHkgY29uc2lkZXJhdGlvbnMKKwlOb3RlcyBmb3IgTVMtRE9TIGltcGxlbWVudG9ycworCitZb3Ugc2hvdWxkIHJlYWQgYXQgbGVhc3QgdGhlIG92ZXJ2aWV3IGFuZCBiYXNpYyB1c2FnZSBzZWN0aW9ucyBiZWZvcmUgdHJ5aW5nCit0byBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnkuICBUaGUgc2VjdGlvbnMgb24gYWR2YW5jZWQgZmVhdHVyZXMgY2FuIGJlIHJlYWQKK2lmIGFuZCB3aGVuIHlvdSBuZWVkIHRoZW0uCisKKworT1ZFUlZJRVcKKz09PT09PT09CisKK0Z1bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgbGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBJSkcgSlBFRyBsaWJyYXJ5IHByb3ZpZGVzIEMgY29kZSB0byByZWFkIGFuZCB3cml0ZSBKUEVHLWNvbXByZXNzZWQgaW1hZ2UKK2ZpbGVzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIHByb2dyYW0gcmVjZWl2ZXMgb3Igc3VwcGxpZXMgaW1hZ2UgZGF0YSBhCitzY2FubGluZSBhdCBhIHRpbWUsIHVzaW5nIGEgc3RyYWlnaHRmb3J3YXJkIHVuY29tcHJlc3NlZCBpbWFnZSBmb3JtYXQuICBBbGwKK2RldGFpbHMgb2YgY29sb3IgY29udmVyc2lvbiBhbmQgb3RoZXIgcHJlcHJvY2Vzc2luZy9wb3N0cHJvY2Vzc2luZyBjYW4gYmUKK2hhbmRsZWQgYnkgdGhlIGxpYnJhcnkuCisKK1RoZSBsaWJyYXJ5IGluY2x1ZGVzIGEgc3Vic3RhbnRpYWwgYW1vdW50IG9mIGNvZGUgdGhhdCBpcyBub3QgY292ZXJlZCBieSB0aGUKK0pQRUcgc3RhbmRhcmQgYnV0IGlzIG5lY2Vzc2FyeSBmb3IgdHlwaWNhbCBhcHBsaWNhdGlvbnMgb2YgSlBFRy4gIFRoZXNlCitmdW5jdGlvbnMgcHJlcHJvY2VzcyB0aGUgaW1hZ2UgYmVmb3JlIEpQRUcgY29tcHJlc3Npb24gb3IgcG9zdHByb2Nlc3MgaXQgYWZ0ZXIKK2RlY29tcHJlc3Npb24uICBUaGV5IGluY2x1ZGUgY29sb3JzcGFjZSBjb252ZXJzaW9uLCBkb3duc2FtcGxpbmcvdXBzYW1wbGluZywKK2FuZCBjb2xvciBxdWFudGl6YXRpb24uICBUaGUgYXBwbGljYXRpb24gaW5kaXJlY3RseSBzZWxlY3RzIHVzZSBvZiB0aGlzIGNvZGUKK2J5IHNwZWNpZnlpbmcgdGhlIGZvcm1hdCBpbiB3aGljaCBpdCB3aXNoZXMgdG8gc3VwcGx5IG9yIHJlY2VpdmUgaW1hZ2UgZGF0YS4KK0ZvciBleGFtcGxlLCBpZiBjb2xvcm1hcHBlZCBvdXRwdXQgaXMgcmVxdWVzdGVkLCB0aGVuIHRoZSBkZWNvbXByZXNzaW9uCitsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgaW52b2tlcyBjb2xvciBxdWFudGl6YXRpb24uCisKK0Egd2lkZSByYW5nZSBvZiBxdWFsaXR5IHZzLiBzcGVlZCB0cmFkZW9mZnMgYXJlIHBvc3NpYmxlIGluIEpQRUcgcHJvY2Vzc2luZywKK2FuZCBldmVuIG1vcmUgc28gaW4gZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZy4gIFRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkKK3Byb3ZpZGVzIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyB0aGF0IGNvdmVyIG1vc3Qgb2YgdGhlIHVzZWZ1bCB0cmFkZW9mZnMsCityYW5naW5nIGZyb20gdmVyeS1oaWdoLXF1YWxpdHkgZG93biB0byBmYXN0LXByZXZpZXcgb3BlcmF0aW9uLiAgT24gdGhlCitjb21wcmVzc2lvbiBzaWRlIHdlIGhhdmUgZ2VuZXJhbGx5IG5vdCBwcm92aWRlZCBsb3ctcXVhbGl0eSBjaG9pY2VzLCBzaW5jZQorY29tcHJlc3Npb24gaXMgbm9ybWFsbHkgbGVzcyB0aW1lLWNyaXRpY2FsLiAgSXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGUKK2xvdy1xdWFsaXR5IG1vZGVzIG1heSBub3QgbWVldCB0aGUgSlBFRyBzdGFuZGFyZCdzIGFjY3VyYWN5IHJlcXVpcmVtZW50czsKK25vbmV0aGVsZXNzLCB0aGV5IGFyZSB1c2VmdWwgZm9yIHZpZXdlcnMuCisKK0Egd29yZCBhYm91dCBmdW5jdGlvbnMgKm5vdCogcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkuICBXZSBoYW5kbGUgYSBzdWJzZXQgb2YKK3RoZSBJU08gSlBFRyBzdGFuZGFyZDsgbW9zdCBiYXNlbGluZSwgZXh0ZW5kZWQtc2VxdWVudGlhbCwgYW5kIHByb2dyZXNzaXZlCitKUEVHIHByb2Nlc3NlcyBhcmUgc3VwcG9ydGVkLiAgKE91ciBzdWJzZXQgaW5jbHVkZXMgYWxsIGZlYXR1cmVzIG5vdyBpbiBjb21tb24KK3VzZS4pICBVbnN1cHBvcnRlZCBJU08gb3B0aW9ucyBpbmNsdWRlOgorCSogSGllcmFyY2hpY2FsIHN0b3JhZ2UKKwkqIExvc3NsZXNzIEpQRUcKKwkqIEFyaXRobWV0aWMgZW50cm9weSBjb2RpbmcgKHVuc3VwcG9ydGVkIGZvciBsZWdhbCByZWFzb25zKQorCSogRE5MIG1hcmtlcgorCSogTm9uaW50ZWdyYWwgc3Vic2FtcGxpbmcgcmF0aW9zCitXZSBzdXBwb3J0IGJvdGggOC0gYW5kIDEyLWJpdCBkYXRhIHByZWNpc2lvbiwgYnV0IHRoaXMgaXMgYSBjb21waWxlLXRpbWUKK2Nob2ljZSByYXRoZXIgdGhhbiBhIHJ1bi10aW1lIGNob2ljZTsgaGVuY2UgaXQgaXMgZGlmZmljdWx0IHRvIHVzZSBib3RoCitwcmVjaXNpb25zIGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uLgorCitCeSBpdHNlbGYsIHRoZSBsaWJyYXJ5IGhhbmRsZXMgb25seSBpbnRlcmNoYW5nZSBKUEVHIGRhdGFzdHJlYW1zIC0tLSBpbgorcGFydGljdWxhciB0aGUgd2lkZWx5IHVzZWQgSkZJRiBmaWxlIGZvcm1hdC4gIFRoZSBsaWJyYXJ5IGNhbiBiZSB1c2VkIGJ5CitzdXJyb3VuZGluZyBjb2RlIHRvIHByb2Nlc3MgaW50ZXJjaGFuZ2Ugb3IgYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcyB0aGF0CithcmUgZW1iZWRkZWQgaW4gbW9yZSBjb21wbGV4IGZpbGUgZm9ybWF0cy4gIChGb3IgZXhhbXBsZSwgdGhpcyBsaWJyYXJ5IGlzCit1c2VkIGJ5IHRoZSBmcmVlIExJQlRJRkYgbGlicmFyeSB0byBzdXBwb3J0IEpQRUcgY29tcHJlc3Npb24gaW4gVElGRi4pCisKKworT3V0bGluZSBvZiB0eXBpY2FsIHVzYWdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJvdWdoIG91dGxpbmUgb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9wZXJhdGlvbiBpczoKKworCUFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKKwlTcGVjaWZ5IHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkKKwlTZXQgcGFyYW1ldGVycyBmb3IgY29tcHJlc3Npb24sIGluY2x1ZGluZyBpbWFnZSBzaXplICYgY29sb3JzcGFjZQorCWpwZWdfc3RhcnRfY29tcHJlc3MoLi4uKTsKKwl3aGlsZSAoc2NhbiBsaW5lcyByZW1haW4gdG8gYmUgd3JpdHRlbikKKwkJanBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsKKwlqcGVnX2ZpbmlzaF9jb21wcmVzcyguLi4pOworCVJlbGVhc2UgdGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0CisKK0EgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgaG9sZHMgcGFyYW1ldGVycyBhbmQgd29ya2luZyBzdGF0ZSBmb3IgdGhlIEpQRUcKK2xpYnJhcnkuICBXZSBtYWtlIGNyZWF0aW9uL2Rlc3RydWN0aW9uIG9mIHRoZSBvYmplY3Qgc2VwYXJhdGUgZnJvbSBzdGFydGluZworb3IgZmluaXNoaW5nIGNvbXByZXNzaW9uIG9mIGFuIGltYWdlOyB0aGUgc2FtZSBvYmplY3QgY2FuIGJlIHJlLXVzZWQgZm9yIGEKK3NlcmllcyBvZiBpbWFnZSBjb21wcmVzc2lvbiBvcGVyYXRpb25zLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHJlLXVzZSB0aGUKK3NhbWUgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBhIHNlcXVlbmNlIG9mIGltYWdlcy4gIFJlLXVzZSBvZiBhIEpQRUcgb2JqZWN0CithbHNvIGhhcyBpbXBvcnRhbnQgaW1wbGljYXRpb25zIGZvciBwcm9jZXNzaW5nIGFiYnJldmlhdGVkIEpQRUcgZGF0YXN0cmVhbXMsCithcyBkaXNjdXNzZWQgbGF0ZXIuCisKK1RoZSBpbWFnZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc3VwcGxpZWQgdG8ganBlZ193cml0ZV9zY2FubGluZXMoKSBmcm9tCitpbi1tZW1vcnkgYnVmZmVycy4gIElmIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2luZyBmaWxlLXRvLWZpbGUgY29tcHJlc3Npb24sCityZWFkaW5nIGltYWdlIGRhdGEgZnJvbSB0aGUgc291cmNlIGZpbGUgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgcmVzcG9uc2liaWxpdHkuCitUaGUgbGlicmFyeSBlbWl0cyBjb21wcmVzc2VkIGRhdGEgYnkgY2FsbGluZyBhICJkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIiLAord2hpY2ggdHlwaWNhbGx5IHdpbGwgd3JpdGUgdGhlIGRhdGEgaW50byBhIGZpbGU7IGJ1dCB0aGUgYXBwbGljYXRpb24gY2FuCitwcm92aWRlIGl0cyBvd24gZGVzdGluYXRpb24gbWFuYWdlciB0byBkbyBzb21ldGhpbmcgZWxzZS4KKworU2ltaWxhcmx5LCB0aGUgcm91Z2ggb3V0bGluZSBvZiBhIEpQRUcgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24gaXM6CisKKwlBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKKwlTcGVjaWZ5IHRoZSBzb3VyY2Ugb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAoZWcsIGEgZmlsZSkKKwlDYWxsIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBvYnRhaW4gaW1hZ2UgaW5mbworCVNldCBwYXJhbWV0ZXJzIGZvciBkZWNvbXByZXNzaW9uCisJanBlZ19zdGFydF9kZWNvbXByZXNzKC4uLik7CisJd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHJlYWQpCisJCWpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsKKwlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKC4uLik7CisJUmVsZWFzZSB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAorCitUaGlzIGlzIGNvbXBhcmFibGUgdG8gdGhlIGNvbXByZXNzaW9uIG91dGxpbmUgZXhjZXB0IHRoYXQgcmVhZGluZyB0aGUKK2RhdGFzdHJlYW0gaGVhZGVyIGlzIGEgc2VwYXJhdGUgc3RlcC4gIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIGluZm9ybWF0aW9uCithYm91dCB0aGUgaW1hZ2UncyBzaXplLCBjb2xvcnNwYWNlLCBldGMgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcGxpY2F0aW9uCitzZWxlY3RzIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gY2FuIGNob29zZSBhbgorb3V0cHV0IHNjYWxpbmcgcmF0aW8gdGhhdCB3aWxsIGZpdCB0aGUgaW1hZ2UgaW50byB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzaXplLgorCitUaGUgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9idGFpbnMgY29tcHJlc3NlZCBkYXRhIGJ5IGNhbGxpbmcgYSBkYXRhIHNvdXJjZQorbWFuYWdlciwgd2hpY2ggdHlwaWNhbGx5IHdpbGwgcmVhZCB0aGUgZGF0YSBmcm9tIGEgZmlsZTsgYnV0IG90aGVyIGJlaGF2aW9ycworY2FuIGJlIG9idGFpbmVkIHdpdGggYSBjdXN0b20gc291cmNlIG1hbmFnZXIuICBEZWNvbXByZXNzZWQgZGF0YSBpcyBkZWxpdmVyZWQKK2ludG8gaW4tbWVtb3J5IGJ1ZmZlcnMgcGFzc2VkIHRvIGpwZWdfcmVhZF9zY2FubGluZXMoKS4KKworSXQgaXMgcG9zc2libGUgdG8gYWJvcnQgYW4gaW5jb21wbGV0ZSBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbgorYnkgY2FsbGluZyBqcGVnX2Fib3J0KCk7IG9yLCBpZiB5b3UgZG8gbm90IG5lZWQgdG8gcmV0YWluIHRoZSBKUEVHIG9iamVjdCwKK3NpbXBseSByZWxlYXNlIGl0IGJ5IGNhbGxpbmcganBlZ19kZXN0cm95KCkuCisKK0pQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cyBhcmUgdHdvIHNlcGFyYXRlIHN0cnVjdCB0eXBlcy4KK0hvd2V2ZXIsIHRoZXkgc2hhcmUgc29tZSBjb21tb24gZmllbGRzLCBhbmQgY2VydGFpbiByb3V0aW5lcyBzdWNoIGFzCitqcGVnX2Rlc3Ryb3koKSBjYW4gd29yayBvbiBlaXRoZXIgdHlwZSBvZiBvYmplY3QuCisKK1RoZSBKUEVHIGxpYnJhcnkgaGFzIG5vIHN0YXRpYyB2YXJpYWJsZXM6IGFsbCBzdGF0ZSBpcyBpbiB0aGUgY29tcHJlc3Npb24KK29yIGRlY29tcHJlc3Npb24gb2JqZWN0LiAgVGhlcmVmb3JlIGl0IGlzIHBvc3NpYmxlIHRvIHByb2Nlc3MgbXVsdGlwbGUKK2NvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbnMgY29uY3VycmVudGx5LCB1c2luZyBtdWx0aXBsZSBKUEVHCitvYmplY3RzLgorCitCb3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGFuIGluY3JlbWVudGFsIG1lbW9yeS10by0KK21lbW9yeSBmYXNoaW9uLCBpZiBzdWl0YWJsZSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgYXJlIHVzZWQuICBTZWUgdGhlCitzZWN0aW9uIG9uICJJL08gc3VzcGVuc2lvbiIgZm9yIG1vcmUgZGV0YWlscy4KKworCitCQVNJQyBMSUJSQVJZIFVTQUdFCis9PT09PT09PT09PT09PT09PT09CisKK0RhdGEgZm9ybWF0cworLS0tLS0tLS0tLS0tCisKK0JlZm9yZSBkaXZpbmcgaW50byBwcm9jZWR1cmFsIGRldGFpbHMsIGl0IGlzIGhlbHBmdWwgdG8gdW5kZXJzdGFuZCB0aGUKK2ltYWdlIGRhdGEgZm9ybWF0IHRoYXQgdGhlIEpQRUcgbGlicmFyeSBleHBlY3RzIG9yIHJldHVybnMuCisKK1RoZSBzdGFuZGFyZCBpbnB1dCBpbWFnZSBmb3JtYXQgaXMgYSByZWN0YW5ndWxhciBhcnJheSBvZiBwaXhlbHMsIHdpdGggZWFjaAorcGl4ZWwgaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiAiY29tcG9uZW50IiBvciAic2FtcGxlIiB2YWx1ZXMgKGNvbG9yCitjaGFubmVscykuICBZb3UgbXVzdCBzcGVjaWZ5IGhvdyBtYW55IGNvbXBvbmVudHMgdGhlcmUgYXJlIGFuZCB0aGUgY29sb3JzcGFjZQoraW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvbXBvbmVudHMuICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIHVzZSBSR0IgZGF0YQorKHRocmVlIGNvbXBvbmVudHMgcGVyIHBpeGVsKSBvciBncmF5c2NhbGUgZGF0YSAob25lIGNvbXBvbmVudCBwZXIgcGl4ZWwpLgorUExFQVNFIE5PVEUgVEhBVCBSR0IgREFUQSBJUyBUSFJFRSBTQU1QTEVTIFBFUiBQSVhFTCwgR1JBWVNDQUxFIE9OTFkgT05FLgorQSByZW1hcmthYmxlIG51bWJlciBvZiBwZW9wbGUgbWFuYWdlIHRvIG1pc3MgdGhpcywgb25seSB0byBmaW5kIHRoYXQgdGhlaXIKK3Byb2dyYW1zIGRvbid0IHdvcmsgd2l0aCBncmF5c2NhbGUgSlBFRyBmaWxlcy4KKworVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBjb2xvcm1hcHBlZCBpbnB1dC4gIEpQRUcgZmlsZXMgYXJlIGFsd2F5cyBmdWxsLWNvbG9yCitvciBmdWxsIGdyYXlzY2FsZSAob3Igc29tZXRpbWVzIGFub3RoZXIgY29sb3JzcGFjZSBzdWNoIGFzIENNWUspLiAgWW91IGNhbgorZmVlZCBpbiBhIGNvbG9ybWFwcGVkIGltYWdlIGJ5IGV4cGFuZGluZyBpdCB0byBmdWxsLWNvbG9yIGZvcm1hdC4gIEhvd2V2ZXIKK0pQRUcgb2Z0ZW4gZG9lc24ndCB3b3JrIHZlcnkgd2VsbCB3aXRoIHNvdXJjZSBkYXRhIHRoYXQgaGFzIGJlZW4gY29sb3JtYXBwZWQsCitiZWNhdXNlIG9mIGRpdGhlcmluZyBub2lzZS4gIFRoaXMgaXMgZGlzY3Vzc2VkIGluIG1vcmUgZGV0YWlsIGluIHRoZSBKUEVHIEZBUQorYW5kIHRoZSBvdGhlciByZWZlcmVuY2VzIG1lbnRpb25lZCBpbiB0aGUgUkVBRE1FIGZpbGUuCisKK1BpeGVscyBhcmUgc3RvcmVkIGJ5IHNjYW5saW5lcywgd2l0aCBlYWNoIHNjYW5saW5lIHJ1bm5pbmcgZnJvbSBsZWZ0IHRvCityaWdodC4gIFRoZSBjb21wb25lbnQgdmFsdWVzIGZvciBlYWNoIHBpeGVsIGFyZSBhZGphY2VudCBpbiB0aGUgcm93OyBmb3IKK2V4YW1wbGUsIFIsRyxCLFIsRyxCLFIsRyxCLC4uLiBmb3IgMjQtYml0IFJHQiBjb2xvci4gIEVhY2ggc2NhbmxpbmUgaXMgYW4KK2FycmF5IG9mIGRhdGEgdHlwZSBKU0FNUExFIC0tLSB3aGljaCBpcyB0eXBpY2FsbHkgInVuc2lnbmVkIGNoYXIiLCB1bmxlc3MKK3lvdSd2ZSBjaGFuZ2VkIGptb3JlY2ZnLmguICAoWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgUkdCIHBpeGVsIGxheW91dCwgc2F5Cit0byBCLEcsUiBvcmRlciwgYnkgbW9kaWZ5aW5nIGptb3JlY2ZnLmguICBCdXQgc2VlIHRoZSByZXN0cmljdGlvbnMgbGlzdGVkIGluCit0aGF0IGZpbGUgYmVmb3JlIGRvaW5nIHNvLikKKworQSAyLUQgYXJyYXkgb2YgcGl4ZWxzIGlzIGZvcm1lZCBieSBtYWtpbmcgYSBsaXN0IG9mIHBvaW50ZXJzIHRvIHRoZSBzdGFydHMgb2YKK3NjYW5saW5lczsgc28gdGhlIHNjYW5saW5lcyBuZWVkIG5vdCBiZSBwaHlzaWNhbGx5IGFkamFjZW50IGluIG1lbW9yeS4gIEV2ZW4KK2lmIHlvdSBwcm9jZXNzIGp1c3Qgb25lIHNjYW5saW5lIGF0IGEgdGltZSwgeW91IG11c3QgbWFrZSBhIG9uZS1lbGVtZW50Citwb2ludGVyIGFycmF5IHRvIGNvbmZvcm0gdG8gdGhpcyBzdHJ1Y3R1cmUuICBQb2ludGVycyB0byBKU0FNUExFIHJvd3MgYXJlIG9mCit0eXBlIEpTQU1QUk9XLCBhbmQgdGhlIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgYXJyYXkgaXMgb2YgdHlwZSBKU0FNUEFSUkFZLgorCitUaGUgbGlicmFyeSBhY2NlcHRzIG9yIHN1cHBsaWVzIG9uZSBvciBtb3JlIGNvbXBsZXRlIHNjYW5saW5lcyBwZXIgY2FsbC4KK0l0IGlzIG5vdCBwb3NzaWJsZSB0byBwcm9jZXNzIHBhcnQgb2YgYSByb3cgYXQgYSB0aW1lLiAgU2NhbmxpbmVzIGFyZSBhbHdheXMKK3Byb2Nlc3NlZCB0b3AtdG8tYm90dG9tLiAgWW91IGNhbiBwcm9jZXNzIGFuIGVudGlyZSBpbWFnZSBpbiBvbmUgY2FsbCBpZiB5b3UKK2hhdmUgaXQgYWxsIGluIG1lbW9yeSwgYnV0IHVzdWFsbHkgaXQncyBzaW1wbGVzdCB0byBwcm9jZXNzIG9uZSBzY2FubGluZSBhdAorYSB0aW1lLgorCitGb3IgYmVzdCByZXN1bHRzLCBzb3VyY2UgZGF0YSB2YWx1ZXMgc2hvdWxkIGhhdmUgdGhlIHByZWNpc2lvbiBzcGVjaWZpZWQgYnkKK0JJVFNfSU5fSlNBTVBMRSAobm9ybWFsbHkgOCBiaXRzKS4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGNob29zZSB0byBjb21wcmVzcworZGF0YSB0aGF0J3Mgb25seSA2IGJpdHMvY2hhbm5lbCwgeW91IHNob3VsZCBsZWZ0LWp1c3RpZnkgZWFjaCB2YWx1ZSBpbiBhCitieXRlIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBjb21wcmVzc29yLiAgSWYgeW91IG5lZWQgdG8gY29tcHJlc3MgZGF0YQordGhhdCBoYXMgbW9yZSB0aGFuIDggYml0cy9jaGFubmVsLCBjb21waWxlIHdpdGggQklUU19JTl9KU0FNUExFID0gMTIuCisoU2VlICJMaWJyYXJ5IGNvbXBpbGUtdGltZSBvcHRpb25zIiwgbGF0ZXIuKQorCisKK1RoZSBkYXRhIGZvcm1hdCByZXR1cm5lZCBieSB0aGUgZGVjb21wcmVzc29yIGlzIHRoZSBzYW1lIGluIGFsbCBkZXRhaWxzLAorZXhjZXB0IHRoYXQgY29sb3JtYXBwZWQgb3V0cHV0IGlzIHN1cHBvcnRlZC4gIChBZ2FpbiwgYSBKUEVHIGZpbGUgaXMgbmV2ZXIKK2NvbG9ybWFwcGVkLiAgQnV0IHlvdSBjYW4gYXNrIHRoZSBkZWNvbXByZXNzb3IgdG8gcGVyZm9ybSBvbi10aGUtZmx5IGNvbG9yCitxdWFudGl6YXRpb24gdG8gZGVsaXZlciBjb2xvcm1hcHBlZCBvdXRwdXQuKSAgSWYgeW91IHJlcXVlc3QgY29sb3JtYXBwZWQKK291dHB1dCB0aGVuIHRoZSByZXR1cm5lZCBkYXRhIGFycmF5IGNvbnRhaW5zIGEgc2luZ2xlIEpTQU1QTEUgcGVyIHBpeGVsOworaXRzIHZhbHVlIGlzIGFuIGluZGV4IGludG8gYSBjb2xvciBtYXAuICBUaGUgY29sb3IgbWFwIGlzIHJlcHJlc2VudGVkIGFzCithIDItRCBKU0FNUEFSUkFZIGluIHdoaWNoIGVhY2ggcm93IGhvbGRzIHRoZSB2YWx1ZXMgb2Ygb25lIGNvbG9yIGNvbXBvbmVudCwKK3RoYXQgaXMsIGNvbG9ybWFwW2ldW2pdIGlzIHRoZSB2YWx1ZSBvZiB0aGUgaSd0aCBjb2xvciBjb21wb25lbnQgZm9yIHBpeGVsCit2YWx1ZSAobWFwIGluZGV4KSBqLiAgTm90ZSB0aGF0IHNpbmNlIHRoZSBjb2xvcm1hcCBpbmRleGVzIGFyZSBzdG9yZWQgaW4KK0pTQU1QTEVzLCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29sb3JzIGlzIGxpbWl0ZWQgYnkgdGhlIHNpemUgb2YgSlNBTVBMRQorKGllLCBhdCBtb3N0IDI1NiBjb2xvcnMgZm9yIGFuIDgtYml0IEpQRUcgbGlicmFyeSkuCisKKworQ29tcHJlc3Npb24gZGV0YWlscworLS0tLS0tLS0tLS0tLS0tLS0tLQorCitIZXJlIHdlIHJldmlzaXQgdGhlIEpQRUcgY29tcHJlc3Npb24gb3V0bGluZSBnaXZlbiBpbiB0aGUgb3ZlcnZpZXcuCisKKzEuIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QuCisKK0EgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgaXMgYSAic3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0Ii4gIChJdCBhbHNvIGhhcworYSBidW5jaCBvZiBzdWJzaWRpYXJ5IHN0cnVjdHVyZXMgd2hpY2ggYXJlIGFsbG9jYXRlZCB2aWEgbWFsbG9jKCksIGJ1dCB0aGUKK2FwcGxpY2F0aW9uIGRvZXNuJ3QgY29udHJvbCB0aG9zZSBkaXJlY3RseS4pICBUaGlzIHN0cnVjdCBjYW4gYmUganVzdCBhIGxvY2FsCit2YXJpYWJsZSBpbiB0aGUgY2FsbGluZyByb3V0aW5lLCBpZiBhIHNpbmdsZSByb3V0aW5lIGlzIGdvaW5nIHRvIGV4ZWN1dGUgdGhlCit3aG9sZSBKUEVHIGNvbXByZXNzaW9uIHNlcXVlbmNlLiAgT3RoZXJ3aXNlIGl0IGNhbiBiZSBzdGF0aWMgb3IgYWxsb2NhdGVkCitmcm9tIG1hbGxvYygpLgorCitZb3Ugd2lsbCBhbHNvIG5lZWQgYSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgSlBFRyBlcnJvciBoYW5kbGVyLiAgVGhlIHBhcnQKK29mIHRoaXMgdGhhdCB0aGUgbGlicmFyeSBjYXJlcyBhYm91dCBpcyBhICJzdHJ1Y3QganBlZ19lcnJvcl9tZ3IiLiAgSWYgeW91CithcmUgcHJvdmlkaW5nIHlvdXIgb3duIGVycm9yIGhhbmRsZXIsIHlvdSdsbCB0eXBpY2FsbHkgd2FudCB0byBlbWJlZCB0aGUKK2pwZWdfZXJyb3JfbWdyIHN0cnVjdCBpbiBhIGxhcmdlciBzdHJ1Y3R1cmU7IHRoaXMgaXMgZGlzY3Vzc2VkIGxhdGVyIHVuZGVyCisiRXJyb3IgaGFuZGxpbmciLiAgRm9yIG5vdyB3ZSdsbCBhc3N1bWUgeW91IGFyZSBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0IGVycm9yCitoYW5kbGVyLiAgVGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciB3aWxsIHByaW50IEpQRUcgZXJyb3Ivd2FybmluZyBtZXNzYWdlcworb24gc3RkZXJyLCBhbmQgaXQgd2lsbCBjYWxsIGV4aXQoKSBpZiBhIGZhdGFsIGVycm9yIG9jY3Vycy4KKworWW91IG11c3QgaW5pdGlhbGl6ZSB0aGUgZXJyb3IgaGFuZGxlciBzdHJ1Y3R1cmUsIHN0b3JlIGEgcG9pbnRlciB0byBpdCBpbnRvCit0aGUgSlBFRyBvYmplY3QncyAiZXJyIiBmaWVsZCwgYW5kIHRoZW4gY2FsbCBqcGVnX2NyZWF0ZV9jb21wcmVzcygpIHRvCitpbml0aWFsaXplIHRoZSByZXN0IG9mIHRoZSBKUEVHIG9iamVjdC4KKworVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAsIGlmIHlvdSBhcmUgdXNpbmcgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciwgaXMKKworCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKKwlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKwkuLi4KKwljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisJanBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKworanBlZ19jcmVhdGVfY29tcHJlc3MgYWxsb2NhdGVzIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSwgc28gaXQgY291bGQgZmFpbAoraWYgeW91IGFyZSBvdXQgb2YgbWVtb3J5LiAgSW4gdGhhdCBjYXNlIGl0IHdpbGwgZXhpdCB2aWEgdGhlIGVycm9yIGhhbmRsZXI7Cit0aGF0J3Mgd2h5IHRoZSBlcnJvciBoYW5kbGVyIG11c3QgYmUgaW5pdGlhbGl6ZWQgZmlyc3QuCisKKworMi4gU3BlY2lmeSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpLgorCitBcyBwcmV2aW91c2x5IG1lbnRpb25lZCwgdGhlIEpQRUcgbGlicmFyeSBkZWxpdmVycyBjb21wcmVzc2VkIGRhdGEgdG8gYQorImRhdGEgZGVzdGluYXRpb24iIG1vZHVsZS4gIFRoZSBsaWJyYXJ5IGluY2x1ZGVzIG9uZSBkYXRhIGRlc3RpbmF0aW9uCittb2R1bGUgd2hpY2gga25vd3MgaG93IHRvIHdyaXRlIHRvIGEgc3RkaW8gc3RyZWFtLiAgWW91IGNhbiB1c2UgeW91ciBvd24KK2Rlc3RpbmF0aW9uIG1vZHVsZSBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgZWxzZSwgYXMgZGlzY3Vzc2VkIGxhdGVyLgorCitJZiB5b3UgdXNlIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBtb2R1bGUsIHlvdSBtdXN0IG9wZW4gdGhlIHRhcmdldCBzdGRpbworc3RyZWFtIGJlZm9yZWhhbmQuICBUeXBpY2FsIGNvZGUgZm9yIHRoaXMgc3RlcCBsb29rcyBsaWtlOgorCisJRklMRSAqIG91dGZpbGU7CisJLi4uCisJaWYgKChvdXRmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSA9PSBOVUxMKSB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiY2FuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCSAgICBleGl0KDEpOworCX0KKwlqcGVnX3N0ZGlvX2Rlc3QoJmNpbmZvLCBvdXRmaWxlKTsKKword2hlcmUgdGhlIGxhc3QgbGluZSBpbnZva2VzIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBtb2R1bGUuCisKK1dBUk5JTkc6IGl0IGlzIGNyaXRpY2FsIHRoYXQgdGhlIGJpbmFyeSBjb21wcmVzc2VkIGRhdGEgYmUgZGVsaXZlcmVkIHRvIHRoZQorb3V0cHV0IGZpbGUgdW5jaGFuZ2VkLiAgT24gbm9uLVVuaXggc3lzdGVtcyB0aGUgc3RkaW8gbGlicmFyeSBtYXkgcGVyZm9ybQorbmV3bGluZSB0cmFuc2xhdGlvbiBvciBvdGhlcndpc2UgY29ycnVwdCBiaW5hcnkgZGF0YS4gIFRvIHN1cHByZXNzIHRoaXMKK2JlaGF2aW9yLCB5b3UgbWF5IG5lZWQgdG8gdXNlIGEgImIiIG9wdGlvbiB0byBmb3BlbiAoYXMgc2hvd24gYWJvdmUpLCBvciB1c2UKK3NldG1vZGUoKSBvciBhbm90aGVyIHJvdXRpbmUgdG8gcHV0IHRoZSBzdGRpbyBzdHJlYW0gaW4gYmluYXJ5IG1vZGUuICBTZWUKK2NqcGVnLmMgYW5kIGRqcGVnLmMgZm9yIGNvZGUgdGhhdCBoYXMgYmVlbiBmb3VuZCB0byB3b3JrIG9uIG1hbnkgc3lzdGVtcy4KKworWW91IGNhbiBzZWxlY3QgdGhlIGRhdGEgZGVzdGluYXRpb24gYWZ0ZXIgc2V0dGluZyBvdGhlciBwYXJhbWV0ZXJzIChzdGVwIDMpLAoraWYgdGhhdCdzIG1vcmUgY29udmVuaWVudC4gIFlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZGVzdGluYXRpb24gYmV0d2VlbgorY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGpwZWdfZmluaXNoX2NvbXByZXNzKCkuCisKKworMy4gU2V0IHBhcmFtZXRlcnMgZm9yIGNvbXByZXNzaW9uLCBpbmNsdWRpbmcgaW1hZ2Ugc2l6ZSAmIGNvbG9yc3BhY2UuCisKK1lvdSBtdXN0IHN1cHBseSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIGltYWdlIGJ5IHNldHRpbmcgdGhlIGZvbGxvd2luZworZmllbGRzIGluIHRoZSBKUEVHIG9iamVjdCAoY2luZm8gc3RydWN0dXJlKToKKworCWltYWdlX3dpZHRoCQlXaWR0aCBvZiBpbWFnZSwgaW4gcGl4ZWxzCisJaW1hZ2VfaGVpZ2h0CQlIZWlnaHQgb2YgaW1hZ2UsIGluIHBpeGVscworCWlucHV0X2NvbXBvbmVudHMJTnVtYmVyIG9mIGNvbG9yIGNoYW5uZWxzIChzYW1wbGVzIHBlciBwaXhlbCkKKwlpbl9jb2xvcl9zcGFjZQkJQ29sb3Igc3BhY2Ugb2Ygc291cmNlIGltYWdlCisKK1RoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSwgaG9wZWZ1bGx5LCBvYnZpb3VzLiAgSlBFRyBzdXBwb3J0cyBpbWFnZSBkaW1lbnNpb25zCitvZiAxIHRvIDY0SyBwaXhlbHMgaW4gZWl0aGVyIGRpcmVjdGlvbi4gIFRoZSBpbnB1dCBjb2xvciBzcGFjZSBpcyB0eXBpY2FsbHkKK1JHQiBvciBncmF5c2NhbGUsIGFuZCBpbnB1dF9jb21wb25lbnRzIGlzIDMgb3IgMSBhY2NvcmRpbmdseS4gIChTZWUgIlNwZWNpYWwKK2NvbG9yIHNwYWNlcyIsIGxhdGVyLCBmb3IgbW9yZSBpbmZvLikgIFRoZSBpbl9jb2xvcl9zcGFjZSBmaWVsZCBtdXN0IGJlCithc3NpZ25lZCBvbmUgb2YgdGhlIEpfQ09MT1JfU1BBQ0UgZW51bSBjb25zdGFudHMsIHR5cGljYWxseSBKQ1NfUkdCIG9yCitKQ1NfR1JBWVNDQUxFLgorCitKUEVHIGhhcyBhIGxhcmdlIG51bWJlciBvZiBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUKK2ltYWdlIGlzIGVuY29kZWQuICBNb3N0IGFwcGxpY2F0aW9ucyBkb24ndCBuZWVkIG9yIHdhbnQgdG8ga25vdyBhYm91dCBhbGwKK3RoZXNlIHBhcmFtZXRlcnMuICBZb3UgY2FuIHNldCBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cyBieQorY2FsbGluZyBqcGVnX3NldF9kZWZhdWx0cygpOyB0aGVuLCBpZiB0aGVyZSBhcmUgcGFydGljdWxhciB2YWx1ZXMgeW91IHdhbnQKK3RvIGNoYW5nZSwgeW91IGNhbiBkbyBzbyBhZnRlciB0aGF0LiAgVGhlICJDb21wcmVzc2lvbiBwYXJhbWV0ZXIgc2VsZWN0aW9uIgorc2VjdGlvbiB0ZWxscyBhYm91dCBhbGwgdGhlIHBhcmFtZXRlcnMuCisKK1lvdSBtdXN0IHNldCBpbl9jb2xvcl9zcGFjZSBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcganBlZ19zZXRfZGVmYXVsdHMoKSwKK2JlY2F1c2UgdGhlIGRlZmF1bHRzIGRlcGVuZCBvbiB0aGUgc291cmNlIGltYWdlIGNvbG9yc3BhY2UuICBIb3dldmVyIHRoZQorb3RoZXIgdGhyZWUgc291cmNlIGltYWdlIHBhcmFtZXRlcnMgbmVlZCBub3QgYmUgdmFsaWQgdW50aWwgeW91IGNhbGwKK2pwZWdfc3RhcnRfY29tcHJlc3MoKS4gIFRoZXJlJ3Mgbm8gaGFybSBpbiBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCkgbW9yZQordGhhbiBvbmNlLCBpZiB0aGF0IGhhcHBlbnMgdG8gYmUgY29udmVuaWVudC4KKworVHlwaWNhbCBjb2RlIGZvciBhIDI0LWJpdCBSR0Igc291cmNlIGltYWdlIGlzCisKKwljaW5mby5pbWFnZV93aWR0aCA9IFdpZHRoOyAJLyogaW1hZ2Ugd2lkdGggYW5kIGhlaWdodCwgaW4gcGl4ZWxzICovCisJY2luZm8uaW1hZ2VfaGVpZ2h0ID0gSGVpZ2h0OworCWNpbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOwkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgcGVyIHBpeGVsICovCisJY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOyAvKiBjb2xvcnNwYWNlIG9mIGlucHV0IGltYWdlICovCisKKwlqcGVnX3NldF9kZWZhdWx0cygmY2luZm8pOworCS8qIE1ha2Ugb3B0aW9uYWwgcGFyYW1ldGVyIHNldHRpbmdzIGhlcmUgKi8KKworCis0LiBqcGVnX3N0YXJ0X2NvbXByZXNzKC4uLik7CisKK0FmdGVyIHlvdSBoYXZlIGVzdGFibGlzaGVkIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGFuZCBzZXQgYWxsIHRoZSBuZWNlc3NhcnkKK3NvdXJjZSBpbWFnZSBpbmZvIGFuZCBvdGhlciBwYXJhbWV0ZXJzLCBjYWxsIGpwZWdfc3RhcnRfY29tcHJlc3MoKSB0byBiZWdpbgorYSBjb21wcmVzc2lvbiBjeWNsZS4gIFRoaXMgd2lsbCBpbml0aWFsaXplIGludGVybmFsIHN0YXRlLCBhbGxvY2F0ZSB3b3JraW5nCitzdG9yYWdlLCBhbmQgZW1pdCB0aGUgZmlyc3QgZmV3IGJ5dGVzIG9mIHRoZSBKUEVHIGRhdGFzdHJlYW0gaGVhZGVyLgorCitUeXBpY2FsIGNvZGU6CisKKwlqcGVnX3N0YXJ0X2NvbXByZXNzKCZjaW5mbywgVFJVRSk7CisKK1RoZSAiVFJVRSIgcGFyYW1ldGVyIGVuc3VyZXMgdGhhdCBhIGNvbXBsZXRlIEpQRUcgaW50ZXJjaGFuZ2UgZGF0YXN0cmVhbQord2lsbCBiZSB3cml0dGVuLiAgVGhpcyBpcyBhcHByb3ByaWF0ZSBpbiBtb3N0IGNhc2VzLiAgSWYgeW91IHRoaW5rIHlvdSBtaWdodAord2FudCB0byB1c2UgYW4gYWJicmV2aWF0ZWQgZGF0YXN0cmVhbSwgcmVhZCB0aGUgc2VjdGlvbiBvbiBhYmJyZXZpYXRlZAorZGF0YXN0cmVhbXMsIGJlbG93LgorCitPbmNlIHlvdSBoYXZlIGNhbGxlZCBqcGVnX3N0YXJ0X2NvbXByZXNzKCksIHlvdSBtYXkgbm90IGFsdGVyIGFueSBKUEVHCitwYXJhbWV0ZXJzIG9yIG90aGVyIGZpZWxkcyBvZiB0aGUgSlBFRyBvYmplY3QgdW50aWwgeW91IGhhdmUgY29tcGxldGVkCit0aGUgY29tcHJlc3Npb24gY3ljbGUuCisKKworNS4gd2hpbGUgKHNjYW4gbGluZXMgcmVtYWluIHRvIGJlIHdyaXR0ZW4pCisJanBlZ193cml0ZV9zY2FubGluZXMoLi4uKTsKKworTm93IHdyaXRlIGFsbCB0aGUgcmVxdWlyZWQgaW1hZ2UgZGF0YSBieSBjYWxsaW5nIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkKK29uZSBvciBtb3JlIHRpbWVzLiAgWW91IGNhbiBwYXNzIG9uZSBvciBtb3JlIHNjYW5saW5lcyBpbiBlYWNoIGNhbGwsIHVwCit0byB0aGUgdG90YWwgaW1hZ2UgaGVpZ2h0LiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMgaXQgaXMgY29udmVuaWVudCB0byBwYXNzCitqdXN0IG9uZSBvciBhIGZldyBzY2FubGluZXMgYXQgYSB0aW1lLiAgVGhlIGV4cGVjdGVkIGZvcm1hdCBmb3IgdGhlIHBhc3NlZAorZGF0YSBpcyBkaXNjdXNzZWQgdW5kZXIgIkRhdGEgZm9ybWF0cyIsIGFib3ZlLgorCitJbWFnZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuIGluIHRvcC10by1ib3R0b20gc2NhbmxpbmUgb3JkZXIuICBUaGUgSlBFRyBzcGVjCitjb250YWlucyBzb21lIHdlYXNlbCB3b3JkaW5nIGFib3V0IGhvdyB0b3AgYW5kIGJvdHRvbSBhcmUgYXBwbGljYXRpb24tZGVmaW5lZAordGVybXMgKGEgY3VyaW91cyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgRW5nbGlzaCBsYW5ndWFnZS4uLikgYnV0IGlmIHlvdSB3YW50Cit5b3VyIGZpbGVzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBldmVyeW9uZSBlbHNlJ3MsIHlvdSBXSUxMIHVzZSB0b3AtdG8tYm90dG9tCitvcmRlci4gIElmIHRoZSBzb3VyY2UgZGF0YSBtdXN0IGJlIHJlYWQgaW4gYm90dG9tLXRvLXRvcCBvcmRlciwgeW91IGNhbiB1c2UKK3RoZSBKUEVHIGxpYnJhcnkncyB2aXJ0dWFsIGFycmF5IG1lY2hhbmlzbSB0byBpbnZlcnQgdGhlIGRhdGEgZWZmaWNpZW50bHkuCitFeGFtcGxlcyBvZiB0aGlzIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGNqcGVnLgorCitUaGUgbGlicmFyeSBtYWludGFpbnMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHNjYW5saW5lcyB3cml0dGVuIHNvIGZhcgoraW4gdGhlIG5leHRfc2NhbmxpbmUgZmllbGQgb2YgdGhlIEpQRUcgb2JqZWN0LiAgVXN1YWxseSB5b3UgY2FuIGp1c3QgdXNlCit0aGlzIHZhcmlhYmxlIGFzIHRoZSBsb29wIGNvdW50ZXIsIHNvIHRoYXQgdGhlIGxvb3AgdGVzdCBsb29rcyBsaWtlCisid2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIi4KKworQ29kZSBmb3IgdGhpcyBzdGVwIGRlcGVuZHMgaGVhdmlseSBvbiB0aGUgd2F5IHRoYXQgeW91IHN0b3JlIHRoZSBzb3VyY2UgZGF0YS4KK2V4YW1wbGUuYyBzaG93cyB0aGUgZm9sbG93aW5nIGNvZGUgZm9yIHRoZSBjYXNlIG9mIGEgZnVsbC1zaXplIDItRCBzb3VyY2UKK2FycmF5IGNvbnRhaW5pbmcgMy1ieXRlIFJHQiBwaXhlbHM6CisKKwlKU0FNUFJPVyByb3dfcG9pbnRlclsxXTsJLyogcG9pbnRlciB0byBhIHNpbmdsZSByb3cgKi8KKwlpbnQgcm93X3N0cmlkZTsJCQkvKiBwaHlzaWNhbCByb3cgd2lkdGggaW4gYnVmZmVyICovCisKKwlyb3dfc3RyaWRlID0gaW1hZ2Vfd2lkdGggKiAzOwkvKiBKU0FNUExFcyBwZXIgcm93IGluIGltYWdlX2J1ZmZlciAqLworCisJd2hpbGUgKGNpbmZvLm5leHRfc2NhbmxpbmUgPCBjaW5mby5pbWFnZV9oZWlnaHQpIHsKKwkgICAgcm93X3BvaW50ZXJbMF0gPSAmIGltYWdlX2J1ZmZlcltjaW5mby5uZXh0X3NjYW5saW5lICogcm93X3N0cmlkZV07CisJICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCZjaW5mbywgcm93X3BvaW50ZXIsIDEpOworCX0KKworanBlZ193cml0ZV9zY2FubGluZXMoKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFjdHVhbGx5IHdyaXR0ZW4uCitUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXF1YWwgdG8gdGhlIG51bWJlciBwYXNzZWQgaW4sIHNvIHlvdSBjYW4gdXN1YWxseQoraWdub3JlIHRoZSByZXR1cm4gdmFsdWUuICBJdCBpcyBkaWZmZXJlbnQgaW4ganVzdCB0d28gY2FzZXM6CisgICogSWYgeW91IHRyeSB0byB3cml0ZSBtb3JlIHNjYW5saW5lcyB0aGFuIHRoZSBkZWNsYXJlZCBpbWFnZSBoZWlnaHQsCisgICAgdGhlIGFkZGl0aW9uYWwgc2NhbmxpbmVzIGFyZSBpZ25vcmVkLgorICAqIElmIHlvdSB1c2UgYSBzdXNwZW5kaW5nIGRhdGEgZGVzdGluYXRpb24gbWFuYWdlciwgb3V0cHV0IGJ1ZmZlciBvdmVycnVuCisgICAgd2lsbCBjYXVzZSB0aGUgY29tcHJlc3NvciB0byByZXR1cm4gYmVmb3JlIGFjY2VwdGluZyBhbGwgdGhlIHBhc3NlZCBsaW5lcy4KKyAgICBUaGlzIGZlYXR1cmUgaXMgZGlzY3Vzc2VkIHVuZGVyICJJL08gc3VzcGVuc2lvbiIsIGJlbG93LiAgVGhlIG5vcm1hbAorICAgIHN0ZGlvIGRlc3RpbmF0aW9uIG1hbmFnZXIgd2lsbCBOT1QgY2F1c2UgdGhpcyB0byBoYXBwZW4uCitJbiBhbnkgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZgorbmV4dF9zY2FubGluZS4KKworCis2LiBqcGVnX2ZpbmlzaF9jb21wcmVzcyguLi4pOworCitBZnRlciBhbGwgdGhlIGltYWdlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiwgY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvCitjb21wbGV0ZSB0aGUgY29tcHJlc3Npb24gY3ljbGUuICBUaGlzIHN0ZXAgaXMgRVNTRU5USUFMIHRvIGVuc3VyZSB0aGF0IHRoZQorbGFzdCBidWZmZXJsb2FkIG9mIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgZGF0YSBkZXN0aW5hdGlvbi4KK2pwZWdfZmluaXNoX2NvbXByZXNzKCkgYWxzbyByZWxlYXNlcyB3b3JraW5nIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEpQRUcKK29iamVjdC4KKworVHlwaWNhbCBjb2RlOgorCisJanBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKworSWYgdXNpbmcgdGhlIHN0ZGlvIGRlc3RpbmF0aW9uIG1hbmFnZXIsIGRvbid0IGZvcmdldCB0byBjbG9zZSB0aGUgb3V0cHV0CitzdGRpbyBzdHJlYW0gKGlmIG5lY2Vzc2FyeSkgYWZ0ZXJ3YXJkcy4KKworSWYgeW91IGhhdmUgcmVxdWVzdGVkIGEgbXVsdGktcGFzcyBvcGVyYXRpbmcgbW9kZSwgc3VjaCBhcyBIdWZmbWFuIGNvZGUKK29wdGltaXphdGlvbiwganBlZ19maW5pc2hfY29tcHJlc3MoKSB3aWxsIHBlcmZvcm0gdGhlIGFkZGl0aW9uYWwgcGFzc2VzIHVzaW5nCitkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBmaXJzdCBwYXNzLiAgSW4gdGhpcyBjYXNlIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgbWF5IHRha2UKK3F1aXRlIGEgd2hpbGUgdG8gY29tcGxldGUuICBXaXRoIHRoZSBkZWZhdWx0IGNvbXByZXNzaW9uIHBhcmFtZXRlcnMsIHRoaXMgd2lsbAorbm90IGhhcHBlbi4KKworSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIGJlZm9yZSB3cml0aW5nIHRoZSBuZWNlc3NhcnkKK3RvdGFsIG51bWJlciBvZiBzY2FubGluZXMuICBJZiB5b3Ugd2lzaCB0byBhYm9ydCBjb21wcmVzc2lvbiwgY2FsbAoranBlZ19hYm9ydCgpIGFzIGRpc2N1c3NlZCBiZWxvdy4KKworQWZ0ZXIgY29tcGxldGluZyBhIGNvbXByZXNzaW9uIGN5Y2xlLCB5b3UgbWF5IGRpc3Bvc2Ugb2YgdGhlIEpQRUcgb2JqZWN0CithcyBkaXNjdXNzZWQgbmV4dCwgb3IgeW91IG1heSB1c2UgaXQgdG8gY29tcHJlc3MgYW5vdGhlciBpbWFnZS4gIEluIHRoYXQgY2FzZQorcmV0dXJuIHRvIHN0ZXAgMiwgMywgb3IgNCBhcyBhcHByb3ByaWF0ZS4gIElmIHlvdSBkbyBub3QgY2hhbmdlIHRoZQorZGVzdGluYXRpb24gbWFuYWdlciwgdGhlIG5ldyBkYXRhc3RyZWFtIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc2FtZSB0YXJnZXQuCitJZiB5b3UgZG8gbm90IGNoYW5nZSBhbnkgSlBFRyBwYXJhbWV0ZXJzLCB0aGUgbmV3IGRhdGFzdHJlYW0gd2lsbCBiZSB3cml0dGVuCit3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgYmVmb3JlLiAgTm90ZSB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBpbnB1dCBpbWFnZQorZGltZW5zaW9ucyBmcmVlbHkgYmV0d2VlbiBjeWNsZXMsIGJ1dCBpZiB5b3UgY2hhbmdlIHRoZSBpbnB1dCBjb2xvcnNwYWNlLCB5b3UKK3Nob3VsZCBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8gYWRqdXN0IGZvciB0aGUgbmV3IGNvbG9yc3BhY2U7IGFuZCB0aGVuCit5b3UnbGwgbmVlZCB0byByZXBlYXQgYWxsIG9mIHN0ZXAgMy4KKworCis3LiBSZWxlYXNlIHRoZSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KKworV2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LCBkZXN0cm95IGl0IGJ5IGNhbGxpbmcKK2pwZWdfZGVzdHJveV9jb21wcmVzcygpLiAgVGhpcyB3aWxsIGZyZWUgYWxsIHN1YnNpZGlhcnkgbWVtb3J5IChyZWdhcmRsZXNzIG9mCit0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIG9iamVjdCkuICBPciB5b3UgY2FuIGNhbGwganBlZ19kZXN0cm95KCksIHdoaWNoCit3b3JrcyBmb3IgZWl0aGVyIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gb2JqZWN0cyAtLS0gdGhpcyBtYXkgYmUgbW9yZQorY29udmVuaWVudCBpZiB5b3UgYXJlIHNoYXJpbmcgY29kZSBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitjYXNlcy4gIChBY3R1YWxseSwgdGhlc2Ugcm91dGluZXMgYXJlIGVxdWl2YWxlbnQgZXhjZXB0IGZvciB0aGUgZGVjbGFyZWQgdHlwZQorb2YgdGhlIHBhc3NlZCBwb2ludGVyLiAgVG8gYXZvaWQgZ3JpcGVzIGZyb20gQU5TSSBDIGNvbXBpbGVycywganBlZ19kZXN0cm95KCkKK3Nob3VsZCBiZSBwYXNzZWQgYSBqX2NvbW1vbl9wdHIuKQorCitJZiB5b3UgYWxsb2NhdGVkIHRoZSBqcGVnX2NvbXByZXNzX3N0cnVjdCBzdHJ1Y3R1cmUgZnJvbSBtYWxsb2MoKSwgZnJlZWluZworaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSAtLS0ganBlZ19kZXN0cm95KCkgd29uJ3QuICBEaXR0byBmb3IgdGhlIGVycm9yCitoYW5kbGVyIHN0cnVjdHVyZS4KKworVHlwaWNhbCBjb2RlOgorCisJanBlZ19kZXN0cm95X2NvbXByZXNzKCZjaW5mbyk7CisKKworOC4gQWJvcnRpbmcuCisKK0lmIHlvdSBkZWNpZGUgdG8gYWJvcnQgYSBjb21wcmVzc2lvbiBjeWNsZSBiZWZvcmUgZmluaXNoaW5nLCB5b3UgY2FuIGNsZWFuIHVwCitpbiBlaXRoZXIgb2YgdHdvIHdheXM6CisKKyogSWYgeW91IGRvbid0IG5lZWQgdGhlIEpQRUcgb2JqZWN0IGFueSBtb3JlLCBqdXN0IGNhbGwKKyAganBlZ19kZXN0cm95X2NvbXByZXNzKCkgb3IganBlZ19kZXN0cm95KCkgdG8gcmVsZWFzZSBtZW1vcnkuICBUaGlzIGlzCisgIGxlZ2l0aW1hdGUgYXQgYW55IHBvaW50IGFmdGVyIGNhbGxpbmcganBlZ19jcmVhdGVfY29tcHJlc3MoKSAtLS0gaW4gZmFjdCwKKyAgaXQncyBzYWZlIGV2ZW4gaWYganBlZ19jcmVhdGVfY29tcHJlc3MoKSBmYWlscy4KKworKiBJZiB5b3Ugd2FudCB0byByZS11c2UgdGhlIEpQRUcgb2JqZWN0LCBjYWxsIGpwZWdfYWJvcnRfY29tcHJlc3MoKSwgb3IgY2FsbAorICBqcGVnX2Fib3J0KCkgd2hpY2ggd29ya3Mgb24gYm90aCBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBvYmplY3RzLgorICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBvYmplY3QgdG8gYW4gaWRsZSBzdGF0ZSwgcmVsZWFzaW5nIGFueSB3b3JraW5nIG1lbW9yeS4KKyAganBlZ19hYm9ydCgpIGlzIGFsbG93ZWQgYXQgYW55IHRpbWUgYWZ0ZXIgc3VjY2Vzc2Z1bCBvYmplY3QgY3JlYXRpb24uCisKK05vdGUgdGhhdCBjbGVhbmluZyB1cCB0aGUgZGF0YSBkZXN0aW5hdGlvbiwgaWYgcmVxdWlyZWQsIGlzIHlvdXIKK3Jlc3BvbnNpYmlsaXR5OyBuZWl0aGVyIG9mIHRoZXNlIHJvdXRpbmVzIHdpbGwgY2FsbCB0ZXJtX2Rlc3RpbmF0aW9uKCkuCisoU2VlICJDb21wcmVzc2VkIGRhdGEgaGFuZGxpbmciLCBiZWxvdywgZm9yIG1vcmUgYWJvdXQgdGhhdC4pCisKK2pwZWdfZGVzdHJveSgpIGFuZCBqcGVnX2Fib3J0KCkgYXJlIHRoZSBvbmx5IHNhZmUgY2FsbHMgdG8gbWFrZSBvbiBhIEpQRUcKK29iamVjdCB0aGF0IGhhcyByZXBvcnRlZCBhbiBlcnJvciBieSBjYWxsaW5nIGVycm9yX2V4aXQgKHNlZSAiRXJyb3IgaGFuZGxpbmciCitmb3IgbW9yZSBpbmZvKS4gIFRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBzdWNoIGFuIG9iamVjdCBpcyBsaWtlbHkgdG8gYmUgb3V0IG9mCit3aGFjay4gIEVpdGhlciBvZiB0aGVzZSB0d28gcm91dGluZXMgd2lsbCByZXR1cm4gdGhlIG9iamVjdCB0byBhIGtub3duIHN0YXRlLgorCisKK0RlY29tcHJlc3Npb24gZGV0YWlscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0hlcmUgd2UgcmV2aXNpdCB0aGUgSlBFRyBkZWNvbXByZXNzaW9uIG91dGxpbmUgZ2l2ZW4gaW4gdGhlIG92ZXJ2aWV3LgorCisxLiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QuCisKK1RoaXMgaXMganVzdCBsaWtlIGluaXRpYWxpemF0aW9uIGZvciBjb21wcmVzc2lvbiwgYXMgZGlzY3Vzc2VkIGFib3ZlLAorZXhjZXB0IHRoYXQgdGhlIG9iamVjdCBpcyBhICJzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCIgYW5kIHlvdQorY2FsbCBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCkuICBFcnJvciBoYW5kbGluZyBpcyBleGFjdGx5IHRoZSBzYW1lLgorCitUeXBpY2FsIGNvZGU6CisKKwlzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBjaW5mbzsKKwlzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgamVycjsKKwkuLi4KKwljaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisJanBlZ19jcmVhdGVfZGVjb21wcmVzcygmY2luZm8pOworCisoQm90aCBoZXJlIGFuZCBpbiB0aGUgSUpHIGNvZGUsIHdlIHVzdWFsbHkgdXNlIHZhcmlhYmxlIG5hbWUgImNpbmZvIiBmb3IKK2JvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb2JqZWN0cy4pCisKKworMi4gU3BlY2lmeSB0aGUgc291cmNlIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKGVnLCBhIGZpbGUpLgorCitBcyBwcmV2aW91c2x5IG1lbnRpb25lZCwgdGhlIEpQRUcgbGlicmFyeSByZWFkcyBjb21wcmVzc2VkIGRhdGEgZnJvbSBhICJkYXRhCitzb3VyY2UiIG1vZHVsZS4gIFRoZSBsaWJyYXJ5IGluY2x1ZGVzIG9uZSBkYXRhIHNvdXJjZSBtb2R1bGUgd2hpY2gga25vd3MgaG93Cit0byByZWFkIGZyb20gYSBzdGRpbyBzdHJlYW0uICBZb3UgY2FuIHVzZSB5b3VyIG93biBzb3VyY2UgbW9kdWxlIGlmIHlvdSB3YW50Cit0byBkbyBzb21ldGhpbmcgZWxzZSwgYXMgZGlzY3Vzc2VkIGxhdGVyLgorCitJZiB5b3UgdXNlIHRoZSBzdGFuZGFyZCBzb3VyY2UgbW9kdWxlLCB5b3UgbXVzdCBvcGVuIHRoZSBzb3VyY2Ugc3RkaW8gc3RyZWFtCitiZWZvcmVoYW5kLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgbG9va3MgbGlrZToKKworCUZJTEUgKiBpbmZpbGU7CisJLi4uCisJaWYgKChpbmZpbGUgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJjYW4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisJICAgIGV4aXQoMSk7CisJfQorCWpwZWdfc3RkaW9fc3JjKCZjaW5mbywgaW5maWxlKTsKKword2hlcmUgdGhlIGxhc3QgbGluZSBpbnZva2VzIHRoZSBzdGFuZGFyZCBzb3VyY2UgbW9kdWxlLgorCitXQVJOSU5HOiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBiaW5hcnkgY29tcHJlc3NlZCBkYXRhIGJlIHJlYWQgdW5jaGFuZ2VkLgorT24gbm9uLVVuaXggc3lzdGVtcyB0aGUgc3RkaW8gbGlicmFyeSBtYXkgcGVyZm9ybSBuZXdsaW5lIHRyYW5zbGF0aW9uIG9yCitvdGhlcndpc2UgY29ycnVwdCBiaW5hcnkgZGF0YS4gIFRvIHN1cHByZXNzIHRoaXMgYmVoYXZpb3IsIHlvdSBtYXkgbmVlZCB0byB1c2UKK2EgImIiIG9wdGlvbiB0byBmb3BlbiAoYXMgc2hvd24gYWJvdmUpLCBvciB1c2Ugc2V0bW9kZSgpIG9yIGFub3RoZXIgcm91dGluZSB0bworcHV0IHRoZSBzdGRpbyBzdHJlYW0gaW4gYmluYXJ5IG1vZGUuICBTZWUgY2pwZWcuYyBhbmQgZGpwZWcuYyBmb3IgY29kZSB0aGF0CitoYXMgYmVlbiBmb3VuZCB0byB3b3JrIG9uIG1hbnkgc3lzdGVtcy4KKworWW91IG1heSBub3QgY2hhbmdlIHRoZSBkYXRhIHNvdXJjZSBiZXR3ZWVuIGNhbGxpbmcganBlZ19yZWFkX2hlYWRlcigpIGFuZAoranBlZ19maW5pc2hfZGVjb21wcmVzcygpLiAgSWYgeW91IHdpc2ggdG8gcmVhZCBhIHNlcmllcyBvZiBKUEVHIGltYWdlcyBmcm9tCithIHNpbmdsZSBzb3VyY2UgZmlsZSwgeW91IHNob3VsZCByZXBlYXQgdGhlIGpwZWdfcmVhZF9oZWFkZXIoKSB0bworanBlZ19maW5pc2hfZGVjb21wcmVzcygpIHNlcXVlbmNlIHdpdGhvdXQgcmVpbml0aWFsaXppbmcgZWl0aGVyIHRoZSBKUEVHCitvYmplY3Qgb3IgdGhlIGRhdGEgc291cmNlIG1vZHVsZTsgdGhpcyBwcmV2ZW50cyBidWZmZXJlZCBpbnB1dCBkYXRhIGZyb20KK2JlaW5nIGRpc2NhcmRlZC4KKworCiszLiBDYWxsIGpwZWdfcmVhZF9oZWFkZXIoKSB0byBvYnRhaW4gaW1hZ2UgaW5mby4KKworVHlwaWNhbCBjb2RlIGZvciB0aGlzIHN0ZXAgaXMganVzdAorCisJanBlZ19yZWFkX2hlYWRlcigmY2luZm8sIFRSVUUpOworCitUaGlzIHdpbGwgcmVhZCB0aGUgc291cmNlIGRhdGFzdHJlYW0gaGVhZGVyIG1hcmtlcnMsIHVwIHRvIHRoZSBiZWdpbm5pbmcKK29mIHRoZSBjb21wcmVzc2VkIGRhdGEgcHJvcGVyLiAgT24gcmV0dXJuLCB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhbmQgb3RoZXIKK2luZm8gaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgSlBFRyBvYmplY3QuICBUaGUgYXBwbGljYXRpb24gbWF5IHdpc2ggdG8KK2NvbnN1bHQgdGhpcyBpbmZvcm1hdGlvbiBiZWZvcmUgc2VsZWN0aW5nIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KKworTW9yZSBjb21wbGV4IGNvZGUgaXMgbmVjZXNzYXJ5IGlmCisgICogQSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIGlzIHVzZWQgLS0tIGluIHRoYXQgY2FzZSBqcGVnX3JlYWRfaGVhZGVyKCkKKyAgICBtYXkgcmV0dXJuIGJlZm9yZSBpdCBoYXMgcmVhZCBhbGwgdGhlIGhlYWRlciBkYXRhLiAgU2VlICJJL08gc3VzcGVuc2lvbiIsCisgICAgYmVsb3cuICBUaGUgbm9ybWFsIHN0ZGlvIHNvdXJjZSBtYW5hZ2VyIHdpbGwgTk9UIGNhdXNlIHRoaXMgdG8gaGFwcGVuLgorICAqIEFiYnJldmlhdGVkIEpQRUcgZmlsZXMgYXJlIHRvIGJlIHByb2Nlc3NlZCAtLS0gc2VlIHRoZSBzZWN0aW9uIG9uCisgICAgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMuICBTdGFuZGFyZCBhcHBsaWNhdGlvbnMgdGhhdCBkZWFsIG9ubHkgaW4KKyAgICBpbnRlcmNoYW5nZSBKUEVHIGZpbGVzIG5lZWQgbm90IGJlIGNvbmNlcm5lZCB3aXRoIHRoaXMgY2FzZSBlaXRoZXIuCisKK0l0IGlzIHBlcm1pc3NpYmxlIHRvIHN0b3AgYXQgdGhpcyBwb2ludCBpZiB5b3UganVzdCB3YW50ZWQgdG8gZmluZCBvdXQgdGhlCitpbWFnZSBkaW1lbnNpb25zIGFuZCBvdGhlciBoZWFkZXIgaW5mbyBmb3IgYSBKUEVHIGZpbGUuICBJbiB0aGF0IGNhc2UsCitjYWxsIGpwZWdfZGVzdHJveSgpIHdoZW4geW91IGFyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBvciBjYWxsCitqcGVnX2Fib3J0KCkgdG8gcmV0dXJuIGl0IHRvIGFuIGlkbGUgc3RhdGUgYmVmb3JlIHNlbGVjdGluZyBhIG5ldyBkYXRhCitzb3VyY2UgYW5kIHJlYWRpbmcgYW5vdGhlciBoZWFkZXIuCisKKworNC4gU2V0IHBhcmFtZXRlcnMgZm9yIGRlY29tcHJlc3Npb24uCisKK2pwZWdfcmVhZF9oZWFkZXIoKSBzZXRzIGFwcHJvcHJpYXRlIGRlZmF1bHQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGJhc2VkIG9uCit0aGUgcHJvcGVydGllcyBvZiB0aGUgaW1hZ2UgKGluIHBhcnRpY3VsYXIsIGl0cyBjb2xvcnNwYWNlKS4gIEhvd2V2ZXIsIHlvdQorbWF5IHdlbGwgd2FudCB0byBhbHRlciB0aGVzZSBkZWZhdWx0cyBiZWZvcmUgYmVnaW5uaW5nIHRoZSBkZWNvbXByZXNzaW9uLgorRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGlzIHRvIHByb2R1Y2UgZnVsbCBjb2xvciBvdXRwdXQgZnJvbSBhIGNvbG9yIGZpbGUuCitJZiB5b3Ugd2FudCBjb2xvcm1hcHBlZCBvdXRwdXQgeW91IG11c3QgYXNrIGZvciBpdC4gIE90aGVyIG9wdGlvbnMgYWxsb3cgdGhlCityZXR1cm5lZCBpbWFnZSB0byBiZSBzY2FsZWQgYW5kIGFsbG93IHZhcmlvdXMgc3BlZWQvcXVhbGl0eSB0cmFkZW9mZnMgdG8gYmUKK3NlbGVjdGVkLiAgIkRlY29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbiIsIGJlbG93LCBnaXZlcyBkZXRhaWxzLgorCitJZiB0aGUgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlLCBub3RoaW5nIG5lZWQgYmUgZG9uZSBhdCB0aGlzIHN0ZXAuCisKK05vdGUgdGhhdCBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBieSBlYWNoIGNhbGwgdG8ganBlZ19yZWFkX2hlYWRlcigpLgorSWYgeW91IHJldXNlIGEgZGVjb21wcmVzc2lvbiBvYmplY3QsIHlvdSBjYW5ub3QgZXhwZWN0IHlvdXIgcGFyYW1ldGVyCitzZXR0aW5ncyB0byBiZSBwcmVzZXJ2ZWQgYWNyb3NzIGN5Y2xlcywgYXMgeW91IGNhbiBmb3IgY29tcHJlc3Npb24uCitZb3UgbXVzdCBzZXQgZGVzaXJlZCBwYXJhbWV0ZXIgdmFsdWVzIGVhY2ggdGltZS4KKworCis1LiBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoLi4uKTsKKworT25jZSB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgc2F0aXNmYWN0b3J5LCBjYWxsIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHRvCitiZWdpbiBkZWNvbXByZXNzaW9uLiAgVGhpcyB3aWxsIGluaXRpYWxpemUgaW50ZXJuYWwgc3RhdGUsIGFsbG9jYXRlIHdvcmtpbmcKK21lbW9yeSwgYW5kIHByZXBhcmUgZm9yIHJldHVybmluZyBkYXRhLgorCitUeXBpY2FsIGNvZGUgaXMganVzdAorCisJanBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7CisKK0lmIHlvdSBoYXZlIHJlcXVlc3RlZCBhIG11bHRpLXBhc3Mgb3BlcmF0aW5nIG1vZGUsIHN1Y2ggYXMgMi1wYXNzIGNvbG9yCitxdWFudGl6YXRpb24sIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIHdpbGwgZG8gZXZlcnl0aGluZyBuZWVkZWQgYmVmb3JlIGRhdGEKK291dHB1dCBjYW4gYmVnaW4uICBJbiB0aGlzIGNhc2UganBlZ19zdGFydF9kZWNvbXByZXNzKCkgbWF5IHRha2UgcXVpdGUgYSB3aGlsZQordG8gY29tcGxldGUuICBXaXRoIGEgc2luZ2xlLXNjYW4gKG5vbiBwcm9ncmVzc2l2ZSkgSlBFRyBmaWxlIGFuZCBkZWZhdWx0CitkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMsIHRoaXMgd2lsbCBub3QgaGFwcGVuOyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSB3aWxsCityZXR1cm4gcXVpY2tseS4KKworQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgZmluYWwgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMsIGluY2x1ZGluZyBhbnkgcmVxdWVzdGVkCitzY2FsaW5nLCBhcmUgYXZhaWxhYmxlIGluIHRoZSBKUEVHIG9iamVjdDsgc28gaXMgdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCBpZgorY29sb3JtYXBwZWQgb3V0cHV0IGhhcyBiZWVuIHJlcXVlc3RlZC4gIFVzZWZ1bCBmaWVsZHMgaW5jbHVkZQorCisJb3V0cHV0X3dpZHRoCQlpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LCBhcyBzY2FsZWQKKwlvdXRwdXRfaGVpZ2h0CisJb3V0X2NvbG9yX2NvbXBvbmVudHMJIyBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZQorCW91dHB1dF9jb21wb25lbnRzCSMgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZCBwZXIgcGl4ZWwKKwljb2xvcm1hcAkJdGhlIHNlbGVjdGVkIGNvbG9ybWFwLCBpZiBhbnkKKwlhY3R1YWxfbnVtYmVyX29mX2NvbG9ycwkJbnVtYmVyIG9mIGVudHJpZXMgaW4gY29sb3JtYXAKKworb3V0cHV0X2NvbXBvbmVudHMgaXMgMSAoYSBjb2xvcm1hcCBpbmRleCkgd2hlbiBxdWFudGl6aW5nIGNvbG9yczsgb3RoZXJ3aXNlIGl0CitlcXVhbHMgb3V0X2NvbG9yX2NvbXBvbmVudHMuICBJdCBpcyB0aGUgbnVtYmVyIG9mIEpTQU1QTEUgdmFsdWVzIHRoYXQgd2lsbCBiZQorZW1pdHRlZCBwZXIgcGl4ZWwgaW4gdGhlIG91dHB1dCBhcnJheXMuCisKK1R5cGljYWxseSB5b3Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGRhdGEgYnVmZmVycyB0byBob2xkIHRoZSBpbmNvbWluZyBpbWFnZS4KK1lvdSB3aWxsIG5lZWQgb3V0cHV0X3dpZHRoICogb3V0cHV0X2NvbXBvbmVudHMgSlNBTVBMRXMgcGVyIHNjYW5saW5lIGluIHlvdXIKK291dHB1dCBidWZmZXIsIGFuZCBhIHRvdGFsIG9mIG91dHB1dF9oZWlnaHQgc2NhbmxpbmVzIHdpbGwgYmUgcmV0dXJuZWQuCisKK05vdGU6IGlmIHlvdSBhcmUgdXNpbmcgdGhlIEpQRUcgbGlicmFyeSdzIGludGVybmFsIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlCitkYXRhIGJ1ZmZlcnMgKGFzIGRqcGVnIGRvZXMpLCB0aGVuIHRoZSBtYW5hZ2VyJ3MgcHJvdG9jb2wgcmVxdWlyZXMgdGhhdCB5b3UKK3JlcXVlc3QgbGFyZ2UgYnVmZmVycyAqYmVmb3JlKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgVGhpcyBpcyBhCitsaXR0bGUgdHJpY2t5IHNpbmNlIHRoZSBvdXRwdXRfWFhYIGZpZWxkcyBhcmUgbm90IG5vcm1hbGx5IHZhbGlkIHRoZW4uICBZb3UKK2NhbiBtYWtlIHRoZW0gdmFsaWQgYnkgY2FsbGluZyBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoKSBhZnRlciBzZXR0aW5nIHRoZQorcmVsZXZhbnQgcGFyYW1ldGVycyAoc2NhbGluZywgb3V0cHV0IGNvbG9yIHNwYWNlLCBhbmQgcXVhbnRpemF0aW9uIGZsYWcpLgorCisKKzYuIHdoaWxlIChzY2FuIGxpbmVzIHJlbWFpbiB0byBiZSByZWFkKQorCWpwZWdfcmVhZF9zY2FubGluZXMoLi4uKTsKKworTm93IHlvdSBjYW4gcmVhZCB0aGUgZGVjb21wcmVzc2VkIGltYWdlIGRhdGEgYnkgY2FsbGluZyBqcGVnX3JlYWRfc2NhbmxpbmVzKCkKK29uZSBvciBtb3JlIHRpbWVzLiAgQXQgZWFjaCBjYWxsLCB5b3UgcGFzcyBpbiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc2NhbmxpbmVzCit0byBiZSByZWFkIChpZSwgdGhlIGhlaWdodCBvZiB5b3VyIHdvcmtpbmcgYnVmZmVyKTsganBlZ19yZWFkX3NjYW5saW5lcygpCit3aWxsIHJldHVybiB1cCB0byB0aGF0IG1hbnkgbGluZXMuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgbGluZXMKK2FjdHVhbGx5IHJlYWQuICBUaGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBkYXRhIGlzIGRpc2N1c3NlZCB1bmRlciAiRGF0YQorZm9ybWF0cyIsIGFib3ZlLiAgRG9uJ3QgZm9yZ2V0IHRoYXQgZ3JheXNjYWxlIGFuZCBjb2xvciBKUEVHcyB3aWxsIHJldHVybgorZGlmZmVyZW50IGRhdGEgZm9ybWF0cyEKKworSW1hZ2UgZGF0YSBpcyByZXR1cm5lZCBpbiB0b3AtdG8tYm90dG9tIHNjYW5saW5lIG9yZGVyLiAgSWYgeW91IG11c3Qgd3JpdGUKK291dCB0aGUgaW1hZ2UgaW4gYm90dG9tLXRvLXRvcCBvcmRlciwgeW91IGNhbiB1c2UgdGhlIEpQRUcgbGlicmFyeSdzIHZpcnR1YWwKK2FycmF5IG1lY2hhbmlzbSB0byBpbnZlcnQgdGhlIGRhdGEgZWZmaWNpZW50bHkuICBFeGFtcGxlcyBvZiB0aGlzIGNhbiBiZQorZm91bmQgaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBkanBlZy4KKworVGhlIGxpYnJhcnkgbWFpbnRhaW5zIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBzY2FubGluZXMgcmV0dXJuZWQgc28gZmFyCitpbiB0aGUgb3V0cHV0X3NjYW5saW5lIGZpZWxkIG9mIHRoZSBKUEVHIG9iamVjdC4gIFVzdWFsbHkgeW91IGNhbiBqdXN0IHVzZQordGhpcyB2YXJpYWJsZSBhcyB0aGUgbG9vcCBjb3VudGVyLCBzbyB0aGF0IHRoZSBsb29wIHRlc3QgbG9va3MgbGlrZQorIndoaWxlIChjaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby5vdXRwdXRfaGVpZ2h0KSIuICAoTm90ZSB0aGF0IHRoZSB0ZXN0CitzaG91bGQgTk9UIGJlIGFnYWluc3QgaW1hZ2VfaGVpZ2h0LCB1bmxlc3MgeW91IG5ldmVyIHVzZSBzY2FsaW5nLiAgVGhlCitpbWFnZV9oZWlnaHQgZmllbGQgaXMgdGhlIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgdW5zY2FsZWQgaW1hZ2UuKQorVGhlIHJldHVybiB2YWx1ZSBhbHdheXMgZXF1YWxzIHRoZSBjaGFuZ2UgaW4gdGhlIHZhbHVlIG9mIG91dHB1dF9zY2FubGluZS4KKworSWYgeW91IGRvbid0IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQKK2pwZWdfcmVhZF9zY2FubGluZXMoKSByZWFkcyBhdCBsZWFzdCBvbmUgc2NhbmxpbmUgcGVyIGNhbGwsIHVudGlsIHRoZQorYm90dG9tIG9mIHRoZSBpbWFnZSBoYXMgYmVlbiByZWFjaGVkLgorCitJZiB5b3UgdXNlIGEgYnVmZmVyIGxhcmdlciB0aGFuIG9uZSBzY2FubGluZSwgaXQgaXMgTk9UIHNhZmUgdG8gYXNzdW1lIHRoYXQKK2pwZWdfcmVhZF9zY2FubGluZXMoKSBmaWxscyBpdC4gIChUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG9ubHkgYQorZmV3IHNjYW5saW5lcyBwZXIgY2FsbCwgbm8gbWF0dGVyIGhvdyBsYXJnZSBhIGJ1ZmZlciB5b3UgcGFzcy4pICBTbyB5b3UgbXVzdAorYWx3YXlzIHByb3ZpZGUgYSBsb29wIHRoYXQgY2FsbHMganBlZ19yZWFkX3NjYW5saW5lcygpIHJlcGVhdGVkbHkgdW50aWwgdGhlCit3aG9sZSBpbWFnZSBoYXMgYmVlbiByZWFkLgorCisKKzcuIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoLi4uKTsKKworQWZ0ZXIgYWxsIHRoZSBpbWFnZSBkYXRhIGhhcyBiZWVuIHJlYWQsIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHRvCitjb21wbGV0ZSB0aGUgZGVjb21wcmVzc2lvbiBjeWNsZS4gIFRoaXMgY2F1c2VzIHdvcmtpbmcgbWVtb3J5IGFzc29jaWF0ZWQKK3dpdGggdGhlIEpQRUcgb2JqZWN0IHRvIGJlIHJlbGVhc2VkLgorCitUeXBpY2FsIGNvZGU6CisKKwlqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCZjaW5mbyk7CisKK0lmIHVzaW5nIHRoZSBzdGRpbyBzb3VyY2UgbWFuYWdlciwgZG9uJ3QgZm9yZ2V0IHRvIGNsb3NlIHRoZSBzb3VyY2Ugc3RkaW8KK3N0cmVhbSBpZiBuZWNlc3NhcnkuCisKK0l0IGlzIGFuIGVycm9yIHRvIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpIGJlZm9yZSByZWFkaW5nIHRoZSBjb3JyZWN0Cit0b3RhbCBudW1iZXIgb2Ygc2NhbmxpbmVzLiAgSWYgeW91IHdpc2ggdG8gYWJvcnQgZGVjb21wcmVzc2lvbiwgY2FsbAoranBlZ19hYm9ydCgpIGFzIGRpc2N1c3NlZCBiZWxvdy4KKworQWZ0ZXIgY29tcGxldGluZyBhIGRlY29tcHJlc3Npb24gY3ljbGUsIHlvdSBtYXkgZGlzcG9zZSBvZiB0aGUgSlBFRyBvYmplY3QgYXMKK2Rpc2N1c3NlZCBuZXh0LCBvciB5b3UgbWF5IHVzZSBpdCB0byBkZWNvbXByZXNzIGFub3RoZXIgaW1hZ2UuICBJbiB0aGF0IGNhc2UKK3JldHVybiB0byBzdGVwIDIgb3IgMyBhcyBhcHByb3ByaWF0ZS4gIElmIHlvdSBkbyBub3QgY2hhbmdlIHRoZSBzb3VyY2UKK21hbmFnZXIsIHRoZSBuZXh0IGltYWdlIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBzYW1lIHNvdXJjZS4KKworCis4LiBSZWxlYXNlIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgorCitXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdCwgZGVzdHJveSBpdCBieSBjYWxsaW5nCitqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygpIG9yIGpwZWdfZGVzdHJveSgpLiAgVGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YKK2Rlc3Ryb3lpbmcgY29tcHJlc3Npb24gb2JqZWN0cyBhcHBsaWVzIGhlcmUgdG9vLgorCitUeXBpY2FsIGNvZGU6CisKKwlqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmY2luZm8pOworCisKKzkuIEFib3J0aW5nLgorCitZb3UgY2FuIGFib3J0IGEgZGVjb21wcmVzc2lvbiBjeWNsZSBieSBjYWxsaW5nIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkgb3IKK2pwZWdfZGVzdHJveSgpIGlmIHlvdSBkb24ndCBuZWVkIHRoZSBKUEVHIG9iamVjdCBhbnkgbW9yZSwgb3IKK2pwZWdfYWJvcnRfZGVjb21wcmVzcygpIG9yIGpwZWdfYWJvcnQoKSBpZiB5b3Ugd2FudCB0byByZXVzZSB0aGUgb2JqZWN0LgorVGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YgYWJvcnRpbmcgY29tcHJlc3Npb24gY3ljbGVzIGFwcGxpZXMgaGVyZSB0b28uCisKKworTWVjaGFuaWNzIG9mIHVzYWdlOiBpbmNsdWRlIGZpbGVzLCBsaW5raW5nLCBldGMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FwcGxpY2F0aW9ucyB1c2luZyB0aGUgSlBFRyBsaWJyYXJ5IHNob3VsZCBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZSBqcGVnbGliLmgKK3RvIG9idGFpbiBkZWNsYXJhdGlvbnMgb2YgZGF0YSB0eXBlcyBhbmQgcm91dGluZXMuICBCZWZvcmUgaW5jbHVkaW5nCitqcGVnbGliLmgsIGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgdGhhdCBkZWZpbmUgYXQgbGVhc3QgdGhlIHR5cGVkZWZzIEZJTEUgYW5kCitzaXplX3QuICBPbiBBTlNJLWNvbmZvcm1pbmcgc3lzdGVtcywgaW5jbHVkaW5nIDxzdGRpby5oPiBpcyBzdWZmaWNpZW50OyBvbgorb2xkZXIgVW5peCBzeXN0ZW1zLCB5b3UgbWF5IG5lZWQgPHN5cy90eXBlcy5oPiB0byBkZWZpbmUgc2l6ZV90LgorCitJZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVmZXIgdG8gaW5kaXZpZHVhbCBKUEVHIGxpYnJhcnkgZXJyb3IgY29kZXMsIGFsc28KK2luY2x1ZGUgamVycm9yLmggdG8gZGVmaW5lIHRob3NlIHN5bWJvbHMuCisKK2pwZWdsaWIuaCBpbmRpcmVjdGx5IGluY2x1ZGVzIHRoZSBmaWxlcyBqY29uZmlnLmggYW5kIGptb3JlY2ZnLmguICBJZiB5b3UgYXJlCitpbnN0YWxsaW5nIHRoZSBKUEVHIGhlYWRlciBmaWxlcyBpbiBhIHN5c3RlbSBkaXJlY3RvcnksIHlvdSB3aWxsIHdhbnQgdG8KK2luc3RhbGwgYWxsIGZvdXIgZmlsZXM6IGpwZWdsaWIuaCwgamVycm9yLmgsIGpjb25maWcuaCwgam1vcmVjZmcuaC4KKworVGhlIG1vc3QgY29udmVuaWVudCB3YXkgdG8gaW5jbHVkZSB0aGUgSlBFRyBjb2RlIGludG8geW91ciBleGVjdXRhYmxlIHByb2dyYW0KK2lzIHRvIHByZXBhcmUgYSBsaWJyYXJ5IGZpbGUgKCJsaWJqcGVnLmEiLCBvciBhIGNvcnJlc3BvbmRpbmcgbmFtZSBvbiBub24tVW5peAorbWFjaGluZXMpIGFuZCByZWZlcmVuY2UgaXQgYXQgeW91ciBsaW5rIHN0ZXAuICBJZiB5b3UgdXNlIG9ubHkgaGFsZiBvZiB0aGUKK2xpYnJhcnkgKG9ubHkgY29tcHJlc3Npb24gb3Igb25seSBkZWNvbXByZXNzaW9uKSwgb25seSB0aGF0IG11Y2ggY29kZSB3aWxsIGJlCitpbmNsdWRlZCBmcm9tIHRoZSBsaWJyYXJ5LCB1bmxlc3MgeW91ciBsaW5rZXIgaXMgaG9wZWxlc3NseSBicmFpbi1kYW1hZ2VkLgorVGhlIHN1cHBsaWVkIG1ha2VmaWxlcyBidWlsZCBsaWJqcGVnLmEgYXV0b21hdGljYWxseSAoc2VlIGluc3RhbGwuZG9jKS4KKworV2hpbGUgeW91IGNhbiBidWlsZCB0aGUgSlBFRyBsaWJyYXJ5IGFzIGEgc2hhcmVkIGxpYnJhcnkgaWYgdGhlIHdoaW0gc3RyaWtlcworeW91LCB3ZSBkb24ndCByZWFsbHkgcmVjb21tZW5kIGl0LiAgVGhlIHRyb3VibGUgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGlzIHRoYXQKK2F0IHNvbWUgcG9pbnQgeW91J2xsIHByb2JhYmx5IHRyeSB0byBzdWJzdGl0dXRlIGEgbmV3IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkKK3dpdGhvdXQgcmVjb21waWxpbmcgdGhlIGNhbGxpbmcgYXBwbGljYXRpb25zLiAgVGhhdCBnZW5lcmFsbHkgZG9lc24ndCB3b3JrCitiZWNhdXNlIHRoZSBwYXJhbWV0ZXIgc3RydWN0IGRlY2xhcmF0aW9ucyB1c3VhbGx5IGNoYW5nZSB3aXRoIGVhY2ggbmV3Cit2ZXJzaW9uLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBsaWJyYXJ5J3MgQVBJIGlzICpub3QqIGd1YXJhbnRlZWQgYmluYXJ5Citjb21wYXRpYmxlIGFjcm9zcyB2ZXJzaW9uczsgd2Ugb25seSB0cnkgdG8gZW5zdXJlIHNvdXJjZS1jb2RlIGNvbXBhdGliaWxpdHkuCisoSW4gaGluZHNpZ2h0LCBpdCBtaWdodCBoYXZlIGJlZW4gc21hcnRlciB0byBoaWRlIHRoZSBwYXJhbWV0ZXIgc3RydWN0cyBmcm9tCithcHBsaWNhdGlvbnMgYW5kIGludHJvZHVjZSBhIHRvbiBvZiBhY2Nlc3MgZnVuY3Rpb25zIGluc3RlYWQuICBUb28gbGF0ZSBub3csCitob3dldmVyLikKKworT24gc29tZSBzeXN0ZW1zIHlvdXIgYXBwbGljYXRpb24gbWF5IG5lZWQgdG8gc2V0IHVwIGEgc2lnbmFsIGhhbmRsZXIgdG8gZW5zdXJlCit0aGF0IHRlbXBvcmFyeSBmaWxlcyBhcmUgZGVsZXRlZCBpZiB0aGUgcHJvZ3JhbSBpcyBpbnRlcnJ1cHRlZC4gIFRoaXMgaXMgbW9zdAorY3JpdGljYWwgaWYgeW91IGFyZSBvbiBNUy1ET1MgYW5kIHVzZSB0aGUgam1lbWRvcy5jIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kOworaXQgd2lsbCB0cnkgdG8gZ3JhYiBleHRlbmRlZCBtZW1vcnkgZm9yIHRlbXAgZmlsZXMsIGFuZCB0aGF0IHNwYWNlIHdpbGwgTk9UIGJlCitmcmVlZCBhdXRvbWF0aWNhbGx5LiAgU2VlIGNqcGVnLmMgb3IgZGpwZWcuYyBmb3IgYW4gZXhhbXBsZSBzaWduYWwgaGFuZGxlci4KKworSXQgbWF5IGJlIHdvcnRoIHBvaW50aW5nIG91dCB0aGF0IHRoZSBjb3JlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBhY3R1YWxseQorcmVxdWlyZSB0aGUgc3RkaW8gbGlicmFyeTogb25seSB0aGUgZGVmYXVsdCBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgYW5kCitlcnJvciBoYW5kbGVyIG5lZWQgaXQuICBZb3UgY2FuIHVzZSB0aGUgbGlicmFyeSBpbiBhIHN0ZGlvLWxlc3MgZW52aXJvbm1lbnQKK2lmIHlvdSByZXBsYWNlIHRob3NlIG1vZHVsZXMgYW5kIHVzZSBqbWVtbm9icy5jIChvciBhbm90aGVyIG1lbW9yeSBtYW5hZ2VyIG9mCit5b3VyIG93biBkZXZpc2luZykuICBNb3JlIGluZm8gYWJvdXQgdGhlIG1pbmltdW0gc3lzdGVtIGxpYnJhcnkgcmVxdWlyZW1lbnRzCittYXkgYmUgZm91bmQgaW4gamluY2x1ZGUuaC4KKworCitBRFZBTkNFRCBGRUFUVVJFUworPT09PT09PT09PT09PT09PT0KKworQ29tcHJlc3Npb24gcGFyYW1ldGVyIHNlbGVjdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGFsbCB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycyB5b3UgY2FuIHNldCBmb3IgSlBFRworY29tcHJlc3Npb24sIGFzIHdlbGwgYXMgdGhlICJoZWxwZXIiIHJvdXRpbmVzIHByb3ZpZGVkIHRvIGFzc2lzdCBpbiB0aGlzCit0YXNrLiAgUHJvcGVyIHNldHRpbmcgb2Ygc29tZSBwYXJhbWV0ZXJzIHJlcXVpcmVzIGRldGFpbGVkIHVuZGVyc3RhbmRpbmcKK29mIHRoZSBKUEVHIHN0YW5kYXJkOyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGEgcGFyYW1ldGVyIGlzIGZvciwgaXQncyBiZXN0Citub3QgdG8gbWVzcyB3aXRoIGl0ISAgU2VlIFJFRkVSRU5DRVMgaW4gdGhlIFJFQURNRSBmaWxlIGZvciBwb2ludGVycyB0bworbW9yZSBpbmZvIGFib3V0IEpQRUcuCisKK0l0J3MgYSBnb29kIGlkZWEgdG8gY2FsbCBqcGVnX3NldF9kZWZhdWx0cygpIGZpcnN0LCBldmVuIGlmIHlvdSBwbGFuIHRvIHNldAorYWxsIHRoZSBwYXJhbWV0ZXJzOyB0aGF0IHdheSB5b3VyIGNvZGUgaXMgbW9yZSBsaWtlbHkgdG8gd29yayB3aXRoIGZ1dHVyZSBKUEVHCitsaWJyYXJpZXMgdGhhdCBoYXZlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHJlY29tbWVuZAoreW91IHVzZSBhIGhlbHBlciByb3V0aW5lIHdoZXJlIG9uZSBpcyBwcm92aWRlZCwgaW4gcHJlZmVyZW5jZSB0byB0d2lkZGxpbmcKK2NpbmZvIGZpZWxkcyBkaXJlY3RseS4KKworVGhlIGhlbHBlciByb3V0aW5lcyBhcmU6CisKK2pwZWdfc2V0X2RlZmF1bHRzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlUaGlzIHJvdXRpbmUgc2V0cyBhbGwgSlBFRyBwYXJhbWV0ZXJzIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMsIHVzaW5nCisJb25seSB0aGUgaW5wdXQgaW1hZ2UncyBjb2xvciBzcGFjZSAoZmllbGQgaW5fY29sb3Jfc3BhY2UsIHdoaWNoIG11c3QKKwlhbHJlYWR5IGJlIHNldCBpbiBjaW5mbykuICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIG9ubHkgbmVlZCB0byB1c2UKKwl0aGlzIHJvdXRpbmUgYW5kIHBlcmhhcHMganBlZ19zZXRfcXVhbGl0eSgpLgorCitqcGVnX3NldF9jb2xvcnNwYWNlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9DT0xPUl9TUEFDRSBjb2xvcnNwYWNlKQorCVNldHMgdGhlIEpQRUcgZmlsZSdzIGNvbG9yc3BhY2UgKGZpZWxkIGpwZWdfY29sb3Jfc3BhY2UpIGFzIHNwZWNpZmllZCwKKwlhbmQgc2V0cyBvdGhlciBjb2xvci1zcGFjZS1kZXBlbmRlbnQgcGFyYW1ldGVycyBhcHByb3ByaWF0ZWx5LiAgU2VlCisJIlNwZWNpYWwgY29sb3Igc3BhY2VzIiwgYmVsb3csIGJlZm9yZSB1c2luZyB0aGlzLiAgQSBsYXJnZSBudW1iZXIgb2YKKwlwYXJhbWV0ZXJzLCBpbmNsdWRpbmcgYWxsIHBlci1jb21wb25lbnQgcGFyYW1ldGVycywgYXJlIHNldCBieSB0aGlzCisJcm91dGluZTsgaWYgeW91IHdhbnQgdG8gdHdpZGRsZSBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgeW91IHNob3VsZCBjYWxsCisJanBlZ19zZXRfY29sb3JzcGFjZSgpIGJlZm9yZSByYXRoZXIgdGhhbiBhZnRlci4KKworanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQorCVNlbGVjdHMgYW4gYXBwcm9wcmlhdGUgSlBFRyBjb2xvcnNwYWNlIGJhc2VkIG9uIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSwKKwlhbmQgY2FsbHMganBlZ19zZXRfY29sb3JzcGFjZSgpLiAgVGhpcyBpcyBhY3R1YWxseSBhIHN1YnJvdXRpbmUgb2YKKwlqcGVnX3NldF9kZWZhdWx0cygpLiAgSXQncyBicm9rZW4gb3V0IGluIGNhc2UgeW91IHdhbnQgdG8gY2hhbmdlCisJanVzdCB0aGUgY29sb3JzcGFjZS1kZXBlbmRlbnQgSlBFRyBwYXJhbWV0ZXJzLgorCitqcGVnX3NldF9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisJQ29uc3RydWN0cyBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbmRpY2F0ZWQKKwlxdWFsaXR5IHNldHRpbmcuICBUaGUgcXVhbGl0eSB2YWx1ZSBpcyBleHByZXNzZWQgb24gdGhlIDAuLjEwMCBzY2FsZQorCXJlY29tbWVuZGVkIGJ5IElKRyAoY2pwZWcncyAiLXF1YWxpdHkiIHN3aXRjaCB1c2VzIHRoaXMgcm91dGluZSkuCisJTm90ZSB0aGF0IHRoZSBleGFjdCBtYXBwaW5nIGZyb20gcXVhbGl0eSB2YWx1ZXMgdG8gdGFibGVzIG1heSBjaGFuZ2UKKwlpbiBmdXR1cmUgSUpHIHJlbGVhc2VzIGFzIG1vcmUgaXMgbGVhcm5lZCBhYm91dCBEQ1QgcXVhbnRpemF0aW9uLgorCUlmIHRoZSBmb3JjZV9iYXNlbGluZSBwYXJhbWV0ZXIgaXMgVFJVRSwgdGhlbiB0aGUgcXVhbnRpemF0aW9uIHRhYmxlCisJZW50cmllcyBhcmUgY29uc3RyYWluZWQgdG8gdGhlIHJhbmdlIDEuLjI1NSBmb3IgZnVsbCBKUEVHIGJhc2VsaW5lCisJY29tcGF0aWJpbGl0eS4gIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGlzIG9ubHkgbWFrZXMgYQorCWRpZmZlcmVuY2UgZm9yIHF1YWxpdHkgc2V0dGluZ3MgYmVsb3cgMjUsIGFuZCBpdCBlZmZlY3RpdmVseSBwcmV2ZW50cworCXZlcnkgc21hbGwvbG93IHF1YWxpdHkgZmlsZXMgZnJvbSBiZWluZyBnZW5lcmF0ZWQuICBUaGUgSUpHIGRlY29kZXIKKwlpcyBjYXBhYmxlIG9mIHJlYWRpbmcgdGhlIG5vbi1iYXNlbGluZSBmaWxlcyBnZW5lcmF0ZWQgYXQgbG93IHF1YWxpdHkKKwlzZXR0aW5ncyB3aGVuIGZvcmNlX2Jhc2VsaW5lIGlzIEZBTFNFLCBidXQgb3RoZXIgZGVjb2RlcnMgbWF5IG5vdCBiZS4KKworanBlZ19zZXRfbGluZWFyX3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2NhbGVfZmFjdG9yLAorCQkJIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisJU2FtZSBhcyBqcGVnX3NldF9xdWFsaXR5KCkgZXhjZXB0IHRoYXQgdGhlIGdlbmVyYXRlZCB0YWJsZXMgYXJlIHRoZQorCXNhbXBsZSB0YWJsZXMgZ2l2ZW4gaW4gdGhlIEpQRUMgc3BlYyBzZWN0aW9uIEsuMSwgbXVsdGlwbGllZCBieSB0aGUKKwlzcGVjaWZpZWQgc2NhbGUgZmFjdG9yICh3aGljaCBpcyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlOyB0aHVzCisJc2NhbGVfZmFjdG9yID0gMTAwIHJlcHJvZHVjZXMgdGhlIHNwZWMncyB0YWJsZXMpLiAgTm90ZSB0aGF0IGxhcmdlcgorCXNjYWxlIGZhY3RvcnMgZ2l2ZSBsb3dlciBxdWFsaXR5LiAgVGhpcyBlbnRyeSBwb2ludCBpcyB1c2VmdWwgZm9yCisJY29uZm9ybWluZyB0byB0aGUgQWRvYmUgUG9zdFNjcmlwdCBEQ1QgY29udmVudGlvbnMsIGJ1dCB3ZSBkbyBub3QKKwlyZWNvbW1lbmQgbGluZWFyIHNjYWxpbmcgYXMgYSB1c2VyLXZpc2libGUgcXVhbGl0eSBzY2FsZSBvdGhlcndpc2UuCisJZm9yY2VfYmFzZWxpbmUgYWdhaW4gY29uc3RyYWlucyB0aGUgY29tcHV0ZWQgdGFibGUgZW50cmllcyB0byAxLi4yNTUuCisKK2ludCBqcGVnX3F1YWxpdHlfc2NhbGluZyAoaW50IHF1YWxpdHkpCisJQ29udmVydHMgYSB2YWx1ZSBvbiB0aGUgSUpHLXJlY29tbWVuZGVkIHF1YWxpdHkgc2NhbGUgdG8gYSBsaW5lYXIKKwlzY2FsaW5nIHBlcmNlbnRhZ2UuICBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIG1heSBjaGFuZ2Ugb3IgZ28gYXdheQorCWluIGZ1dHVyZSByZWxlYXNlcyAtLS0gSUpHIG1heSBjaG9vc2UgdG8gYWRvcHQgYSBzY2FsaW5nIG1ldGhvZCB0aGF0CisJY2FuJ3QgYmUgZXhwcmVzc2VkIGFzIGEgc2ltcGxlIHNjYWxhciBtdWx0aXBsaWVyLCBpbiB3aGljaCBjYXNlIHRoZQorCXByZW1pc2Ugb2YgdGhpcyByb3V0aW5lIGNvbGxhcHNlcy4gIENhdmVhdCB1c2VyLgorCitqcGVnX2FkZF9xdWFudF90YWJsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCisJCSAgICAgIGludCBzY2FsZV9mYWN0b3IsIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCisJQWxsb3dzIGFuIGFyYml0cmFyeSBxdWFudGl6YXRpb24gdGFibGUgdG8gYmUgY3JlYXRlZC4gIHdoaWNoX3RibAorCWluZGljYXRlcyB3aGljaCB0YWJsZSBzbG90IHRvIGZpbGwuICBiYXNpY190YWJsZSBwb2ludHMgdG8gYW4gYXJyYXkKKwlvZiA2NCB1bnNpZ25lZCBpbnRzIGdpdmVuIGluIG5vcm1hbCBhcnJheSBvcmRlci4gIFRoZXNlIHZhbHVlcyBhcmUKKwltdWx0aXBsaWVkIGJ5IHNjYWxlX2ZhY3Rvci8xMDAgYW5kIHRoZW4gY2xhbXBlZCB0byB0aGUgcmFuZ2UgMS4uNjU1MzUKKwkob3IgdG8gMS4uMjU1IGlmIGZvcmNlX2Jhc2VsaW5lIGlzIFRSVUUpLgorCUNBVVRJT046IHByaW9yIHRvIGxpYnJhcnkgdmVyc2lvbiA2YSwganBlZ19hZGRfcXVhbnRfdGFibGUgZXhwZWN0ZWQKKwl0aGUgYmFzaWMgdGFibGUgdG8gYmUgZ2l2ZW4gaW4gSlBFRyB6aWd6YWcgb3JkZXIuICBJZiB5b3UgbmVlZCB0bworCXdyaXRlIGNvZGUgdGhhdCB3b3JrcyB3aXRoIGVpdGhlciBvbGRlciBvciBuZXdlciB2ZXJzaW9ucyBvZiB0aGlzCisJcm91dGluZSwgeW91IG11c3QgY2hlY2sgdGhlIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIuICBTb21ldGhpbmcgbGlrZQorCSIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MSIgaXMgdGhlIHJpZ2h0IHRlc3QuCisKK2pwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKKwlHZW5lcmF0ZXMgYSBkZWZhdWx0IHNjYW4gc2NyaXB0IGZvciB3cml0aW5nIGEgcHJvZ3Jlc3NpdmUtSlBFRyBmaWxlLgorCVRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBvZiBjcmVhdGluZyBhIHByb2dyZXNzaXZlIGZpbGUsCisJdW5sZXNzIHlvdSB3YW50IHRvIG1ha2UgYSBjdXN0b20gc2NhbiBzZXF1ZW5jZS4gIFlvdSBtdXN0IGVuc3VyZSB0aGF0CisJdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMgc2V0IGNvcnJlY3RseSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisKKworQ29tcHJlc3Npb24gcGFyYW1ldGVycyAoY2luZm8gZmllbGRzKSBpbmNsdWRlOgorCitKX0RDVF9NRVRIT0QgZGN0X21ldGhvZAorCVNlbGVjdHMgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgRENUIHN0ZXAuICBDaG9pY2VzIGFyZToKKwkJSkRDVF9JU0xPVzogc2xvdyBidXQgYWNjdXJhdGUgaW50ZWdlciBhbGdvcml0aG0KKwkJSkRDVF9JRkFTVDogZmFzdGVyLCBsZXNzIGFjY3VyYXRlIGludGVnZXIgbWV0aG9kCisJCUpEQ1RfRkxPQVQ6IGZsb2F0aW5nLXBvaW50IG1ldGhvZAorCQlKRENUX0RFRkFVTFQ6IGRlZmF1bHQgbWV0aG9kIChub3JtYWxseSBKRENUX0lTTE9XKQorCQlKRENUX0ZBU1RFU1Q6IGZhc3Rlc3QgbWV0aG9kIChub3JtYWxseSBKRENUX0lGQVNUKQorCVRoZSBGTE9BVCBtZXRob2QgaXMgdmVyeSBzbGlnaHRseSBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIElTTE9XIG1ldGhvZCwKKwlidXQgbWF5IGdpdmUgZGlmZmVyZW50IHJlc3VsdHMgb24gZGlmZmVyZW50IG1hY2hpbmVzIGR1ZSB0byB2YXJ5aW5nCisJcm91bmRvZmYgYmVoYXZpb3IuICBUaGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlIHRoZSBzYW1lIHJlc3VsdHMKKwlvbiBhbGwgbWFjaGluZXMuICBPbiBtYWNoaW5lcyB3aXRoIHN1ZmZpY2llbnRseSBmYXN0IEZQIGhhcmR3YXJlLCB0aGUKKwlmbG9hdGluZy1wb2ludCBtZXRob2QgbWF5IGFsc28gYmUgdGhlIGZhc3Rlc3QuICBUaGUgSUZBU1QgbWV0aG9kIGlzCisJY29uc2lkZXJhYmx5IGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvOyBpdHMgdXNlIGlzIG5vdAorCXJlY29tbWVuZGVkIGlmIGhpZ2ggcXVhbGl0eSBpcyBhIGNvbmNlcm4uICBKRENUX0RFRkFVTFQgYW5kCisJSkRDVF9GQVNURVNUIGFyZSBtYWNyb3MgY29uZmlndXJhYmxlIGJ5IGVhY2ggaW5zdGFsbGF0aW9uLgorCitKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2UKK2ludCBudW1fY29tcG9uZW50cworCVRoZSBKUEVHIGNvbG9yIHNwYWNlIGFuZCBjb3JyZXNwb25kaW5nIG51bWJlciBvZiBjb21wb25lbnRzOyBzZWUKKwkiU3BlY2lhbCBjb2xvciBzcGFjZXMiLCBiZWxvdywgZm9yIG1vcmUgaW5mby4gIFdlIHJlY29tbWVuZCB1c2luZworCWpwZWdfc2V0X2NvbG9yX3NwYWNlKCkgaWYgeW91IHdhbnQgdG8gY2hhbmdlIHRoZXNlLgorCitib29sZWFuIG9wdGltaXplX2NvZGluZworCVRSVUUgY2F1c2VzIHRoZSBjb21wcmVzc29yIHRvIGNvbXB1dGUgb3B0aW1hbCBIdWZmbWFuIGNvZGluZyB0YWJsZXMKKwlmb3IgdGhlIGltYWdlLiAgVGhpcyByZXF1aXJlcyBhbiBleHRyYSBwYXNzIG92ZXIgdGhlIGRhdGEgYW5kCisJdGhlcmVmb3JlIGNvc3RzIGEgZ29vZCBkZWFsIG9mIHNwYWNlIGFuZCB0aW1lLiAgVGhlIGRlZmF1bHQgaXMKKwlGQUxTRSwgd2hpY2ggdGVsbHMgdGhlIGNvbXByZXNzb3IgdG8gdXNlIHRoZSBzdXBwbGllZCBvciBkZWZhdWx0CisJSHVmZm1hbiB0YWJsZXMuICBJbiBtb3N0IGNhc2VzIG9wdGltYWwgdGFibGVzIHNhdmUgb25seSBhIGZldyBwZXJjZW50CisJb2YgZmlsZSBzaXplIGNvbXBhcmVkIHRvIHRoZSBkZWZhdWx0IHRhYmxlcy4gIE5vdGUgdGhhdCB3aGVuIHRoaXMgaXMKKwlUUlVFLCB5b3UgbmVlZCBub3Qgc3VwcGx5IEh1ZmZtYW4gdGFibGVzIGF0IGFsbCwgYW5kIGFueSB5b3UgZG8KKwlzdXBwbHkgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKwordW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWwKK2ludCByZXN0YXJ0X2luX3Jvd3MKKwlUbyBlbWl0IHJlc3RhcnQgbWFya2VycyBpbiB0aGUgSlBFRyBmaWxlLCBzZXQgb25lIG9mIHRoZXNlIG5vbnplcm8uCisJU2V0IHJlc3RhcnRfaW50ZXJ2YWwgdG8gc3BlY2lmeSB0aGUgZXhhY3QgaW50ZXJ2YWwgaW4gTUNVIGJsb2Nrcy4KKwlTZXQgcmVzdGFydF9pbl9yb3dzIHRvIHNwZWNpZnkgdGhlIGludGVydmFsIGluIE1DVSByb3dzLiAgKElmCisJcmVzdGFydF9pbl9yb3dzIGlzIG5vdCAwLCB0aGVuIHJlc3RhcnRfaW50ZXJ2YWwgaXMgc2V0IGFmdGVyIHRoZQorCWltYWdlIHdpZHRoIGluIE1DVXMgaXMgY29tcHV0ZWQuKSAgRGVmYXVsdHMgYXJlIHplcm8gKG5vIHJlc3RhcnRzKS4KKwlPbmUgcmVzdGFydCBtYXJrZXIgcGVyIE1DVSByb3cgaXMgb2Z0ZW4gYSBnb29kIGNob2ljZS4KKwlOT1RFOiB0aGUgb3ZlcmhlYWQgb2YgcmVzdGFydCBtYXJrZXJzIGlzIGhpZ2hlciBpbiBncmF5c2NhbGUgSlBFRworCWZpbGVzIHRoYW4gaW4gY29sb3IgZmlsZXMsIGFuZCBNVUNIIGhpZ2hlciBpbiBwcm9ncmVzc2l2ZSBKUEVHcy4KKwlJZiB5b3UgdXNlIHJlc3RhcnRzLCB5b3UgbWF5IHdhbnQgdG8gdXNlIGxhcmdlciBpbnRlcnZhbHMgaW4gdGhvc2UKKwljYXNlcy4KKworY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FuX2luZm8KK2ludCBudW1fc2NhbnMKKwlCeSBkZWZhdWx0LCBzY2FuX2luZm8gaXMgTlVMTDsgdGhpcyBjYXVzZXMgdGhlIGNvbXByZXNzb3IgdG8gd3JpdGUgYQorCXNpbmdsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlLiAgSWYgbm90IE5VTEwsIHNjYW5faW5mbyBwb2ludHMgdG8KKwlhbiBhcnJheSBvZiBzY2FuIGRlZmluaXRpb24gcmVjb3JkcyBvZiBsZW5ndGggbnVtX3NjYW5zLiAgVGhlCisJY29tcHJlc3NvciB3aWxsIHRoZW4gd3JpdGUgYSBKUEVHIGZpbGUgaGF2aW5nIG9uZSBzY2FuIGZvciBlYWNoIHNjYW4KKwlkZWZpbml0aW9uIHJlY29yZC4gIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBub25pbnRlcmxlYXZlZCBvcgorCXByb2dyZXNzaXZlIEpQRUcgZmlsZXMuICBUaGUgbGlicmFyeSBjaGVja3MgdGhhdCB0aGUgc2NhbiBhcnJheQorCWRlZmluZXMgYSB2YWxpZCBKUEVHIHNjYW4gc2VxdWVuY2UuICAoanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gY3JlYXRlcworCWEgc3VpdGFibGUgc2NhbiBkZWZpbml0aW9uIGFycmF5IGZvciBwcm9ncmVzc2l2ZSBKUEVHLikgIFRoaXMgaXMKKwlkaXNjdXNzZWQgZnVydGhlciB1bmRlciAiUHJvZ3Jlc3NpdmUgSlBFRyBzdXBwb3J0Ii4KKworaW50IHNtb290aGluZ19mYWN0b3IKKwlJZiBub24temVybywgdGhlIGlucHV0IGltYWdlIGlzIHNtb290aGVkOyB0aGUgdmFsdWUgc2hvdWxkIGJlIDEgZm9yCisJbWluaW1hbCBzbW9vdGhpbmcgdG8gMTAwIGZvciBtYXhpbXVtIHNtb290aGluZy4gIENvbnN1bHQgamNzYW1wbGUuYworCWZvciBkZXRhaWxzIG9mIHRoZSBzbW9vdGhpbmcgYWxnb3JpdGhtLiAgVGhlIGRlZmF1bHQgaXMgemVyby4KKworYm9vbGVhbiB3cml0ZV9KRklGX2hlYWRlcgorCUlmIFRSVUUsIGEgSkZJRiBBUFAwIG1hcmtlciBpcyBlbWl0dGVkLiAganBlZ19zZXRfZGVmYXVsdHMoKSBhbmQKKwlqcGVnX3NldF9jb2xvcnNwYWNlKCkgc2V0IHRoaXMgVFJVRSBpZiBhIEpGSUYtbGVnYWwgSlBFRyBjb2xvciBzcGFjZQorCShpZSwgWUNiQ3Igb3IgZ3JheXNjYWxlKSBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIEZBTFNFLgorCitVSU5UOCBKRklGX21ham9yX3ZlcnNpb24KK1VJTlQ4IEpGSUZfbWlub3JfdmVyc2lvbgorCVRoZSB2ZXJzaW9uIG51bWJlciB0byBiZSB3cml0dGVuIGludG8gdGhlIEpGSUYgbWFya2VyLgorCWpwZWdfc2V0X2RlZmF1bHRzKCkgaW5pdGlhbGl6ZXMgdGhlIHZlcnNpb24gdG8gMS4wMSAobWFqb3I9bWlub3I9MSkuCisJWW91IHNob3VsZCBzZXQgaXQgdG8gMS4wMiAobWFqb3I9MSwgbWlub3I9MikgaWYgeW91IHBsYW4gdG8gd3JpdGUKKwlhbnkgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzLgorCitVSU5UOCBkZW5zaXR5X3VuaXQKK1VJTlQxNiBYX2RlbnNpdHkKK1VJTlQxNiBZX2RlbnNpdHkKKwlUaGUgcmVzb2x1dGlvbiBpbmZvcm1hdGlvbiB0byBiZSB3cml0dGVuIGludG8gdGhlIEpGSUYgbWFya2VyOworCW5vdCB1c2VkIG90aGVyd2lzZS4gIGRlbnNpdHlfdW5pdCBtYXkgYmUgMCBmb3IgdW5rbm93biwKKwkxIGZvciBkb3RzL2luY2gsIG9yIDIgZm9yIGRvdHMvY20uICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDAsMSwxCisJaW5kaWNhdGluZyBzcXVhcmUgcGl4ZWxzIG9mIHVua25vd24gc2l6ZS4KKworYm9vbGVhbiB3cml0ZV9BZG9iZV9tYXJrZXIKKwlJZiBUUlVFLCBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgaXMgZW1pdHRlZC4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgYW5kCisJanBlZ19zZXRfY29sb3JzcGFjZSgpIHNldCB0aGlzIFRSVUUgaWYgSlBFRyBjb2xvciBzcGFjZSBSR0IsIENNWUssCisJb3IgWUNDSyBpcyBzZWxlY3RlZCwgb3RoZXJ3aXNlIEZBTFNFLiAgSXQgaXMgZ2VuZXJhbGx5IGEgYmFkIGlkZWEKKwl0byBzZXQgYm90aCB3cml0ZV9KRklGX2hlYWRlciBhbmQgd3JpdGVfQWRvYmVfbWFya2VyLiAgSW4gZmFjdCwKKwl5b3UgcHJvYmFibHkgc2hvdWxkbid0IGNoYW5nZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBhdCBhbGwgLS0tIHRoZQorCWRlZmF1bHQgYmVoYXZpb3IgZW5zdXJlcyB0aGF0IHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBjYW4gYmUKKwlyZWNvZ25pemVkIGJ5IHRoZSBkZWNvZGVyLgorCitKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdCisJUG9pbnRlcnMgdG8gY29lZmZpY2llbnQgcXVhbnRpemF0aW9uIHRhYmxlcywgb25lIHBlciB0YWJsZSBzbG90LAorCW9yIE5VTEwgaWYgbm8gdGFibGUgaXMgZGVmaW5lZCBmb3IgYSBzbG90LiAgVXN1YWxseSB0aGVzZSBzaG91bGQKKwliZSBzZXQgdmlhIG9uZSBvZiB0aGUgYWJvdmUgaGVscGVyIHJvdXRpbmVzOyBqcGVnX2FkZF9xdWFudF90YWJsZSgpCisJaXMgZ2VuZXJhbCBlbm91Z2ggdG8gZGVmaW5lIGFueSBxdWFudGl6YXRpb24gdGFibGUuICBUaGUgb3RoZXIKKwlyb3V0aW5lcyB3aWxsIHNldCB1cCB0YWJsZSBzbG90IDAgZm9yIGx1bWluYW5jZSBxdWFsaXR5IGFuZCB0YWJsZQorCXNsb3QgMSBmb3IgY2hyb21pbmFuY2UuCisKK0pIVUZGX1RCTCAqIGRjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU10KK0pIVUZGX1RCTCAqIGFjX2h1ZmZfdGJsX3B0cnNbTlVNX0hVRkZfVEJMU10KKwlQb2ludGVycyB0byBIdWZmbWFuIGNvZGluZyB0YWJsZXMsIG9uZSBwZXIgdGFibGUgc2xvdCwgb3IgTlVMTCBpZgorCW5vIHRhYmxlIGlzIGRlZmluZWQgZm9yIGEgc2xvdC4gIFNsb3RzIDAgYW5kIDEgYXJlIGZpbGxlZCB3aXRoIHRoZQorCUpQRUcgc2FtcGxlIHRhYmxlcyBieSBqcGVnX3NldF9kZWZhdWx0cygpLiAgSWYgeW91IG5lZWQgdG8gYWxsb2NhdGUKKwltb3JlIHRhYmxlIHN0cnVjdHVyZXMsIGpwZWdfYWxsb2NfaHVmZl90YWJsZSgpIG1heSBiZSB1c2VkLgorCU5vdGUgdGhhdCBvcHRpbWFsIEh1ZmZtYW4gdGFibGVzIGNhbiBiZSBjb21wdXRlZCBmb3IgYW4gaW1hZ2UKKwlieSBzZXR0aW5nIG9wdGltaXplX2NvZGluZywgYXMgZGlzY3Vzc2VkIGFib3ZlOyB0aGVyZSdzIHNlbGRvbQorCWFueSBuZWVkIHRvIG1lc3Mgd2l0aCBwcm92aWRpbmcgeW91ciBvd24gSHVmZm1hbiB0YWJsZXMuCisKK1RoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgY2luZm8gZmllbGRzIHdoaWNoIGFyZSBub3QgZG9jdW1lbnRlZCBoZXJlCitiZWNhdXNlIHlvdSBjdXJyZW50bHkgY2FuJ3QgY2hhbmdlIHRoZW07IGZvciBleGFtcGxlLCB5b3UgY2FuJ3Qgc2V0Cithcml0aF9jb2RlIFRSVUUgYmVjYXVzZSBhcml0aG1ldGljIGNvZGluZyBpcyB1bnN1cHBvcnRlZC4KKworCitQZXItY29tcG9uZW50IHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiB0aGUgc3RydWN0IGNpbmZvLmNvbXBfaW5mb1tpXSBmb3IKK2NvbXBvbmVudCBudW1iZXIgaS4gIE5vdGUgdGhhdCBjb21wb25lbnRzIGhlcmUgcmVmZXIgdG8gY29tcG9uZW50cyBvZiB0aGUKK0pQRUcgY29sb3Igc3BhY2UsICpub3QqIHRoZSBzb3VyY2UgaW1hZ2UgY29sb3Igc3BhY2UuICBBIHN1aXRhYmx5IGxhcmdlCitjb21wX2luZm9bXSBhcnJheSBpcyBhbGxvY2F0ZWQgYnkganBlZ19zZXRfZGVmYXVsdHMoKTsgaWYgeW91IGNob29zZSBub3QKK3RvIHVzZSB0aGF0IHJvdXRpbmUsIGl0J3MgdXAgdG8geW91IHRvIGFsbG9jYXRlIHRoZSBhcnJheS4KKworaW50IGNvbXBvbmVudF9pZAorCVRoZSBvbmUtYnl0ZSBpZGVudGlmaWVyIGNvZGUgdG8gYmUgcmVjb3JkZWQgaW4gdGhlIEpQRUcgZmlsZSBmb3IKKwl0aGlzIGNvbXBvbmVudC4gIEZvciB0aGUgc3RhbmRhcmQgY29sb3Igc3BhY2VzLCB3ZSByZWNvbW1lbmQgeW91CisJbGVhdmUgdGhlIGRlZmF1bHQgdmFsdWVzIGFsb25lLgorCitpbnQgaF9zYW1wX2ZhY3RvcgoraW50IHZfc2FtcF9mYWN0b3IKKwlIb3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzYW1wbGluZyBmYWN0b3JzIGZvciB0aGUgY29tcG9uZW50OyBtdXN0CisJYmUgMS4uNCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcgc3RhbmRhcmQuICBOb3RlIHRoYXQgbGFyZ2VyIHNhbXBsaW5nCisJZmFjdG9ycyBpbmRpY2F0ZSBhIGhpZ2hlci1yZXNvbHV0aW9uIGNvbXBvbmVudDsgbWFueSBwZW9wbGUgZmluZAorCXRoaXMgYmVoYXZpb3IgcXVpdGUgdW5pbnR1aXRpdmUuICBUaGUgZGVmYXVsdCB2YWx1ZXMgYXJlIDIsMiBmb3IKKwlsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSwxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLCBleGNlcHQKKwlmb3IgZ3JheXNjYWxlIHdoZXJlIDEsMSBpcyB1c2VkLgorCitpbnQgcXVhbnRfdGJsX25vCisJUXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciBmb3IgY29tcG9uZW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKKwkwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KKworaW50IGRjX3RibF9ubworaW50IGFjX3RibF9ubworCURDIGFuZCBBQyBlbnRyb3B5IGNvZGluZyB0YWJsZSBudW1iZXJzLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZQorCTAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzIGFuZCAxIGZvciBjaHJvbWluYW5jZSBjb21wb25lbnRzLgorCitpbnQgY29tcG9uZW50X2luZGV4CisJTXVzdCBlcXVhbCB0aGUgY29tcG9uZW50J3MgaW5kZXggaW4gY29tcF9pbmZvW10uICAoQmVnaW5uaW5nIGluCisJcmVsZWFzZSB2NiwgdGhlIGNvbXByZXNzb3IgbGlicmFyeSB3aWxsIGZpbGwgdGhpcyBpbiBhdXRvbWF0aWNhbGx5OworCXlvdSBkb24ndCBoYXZlIHRvLikKKworCitEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEZWNvbXByZXNzaW9uIHBhcmFtZXRlciBzZWxlY3Rpb24gaXMgc29tZXdoYXQgc2ltcGxlciB0aGFuIGNvbXByZXNzaW9uCitwYXJhbWV0ZXIgc2VsZWN0aW9uLCBzaW5jZSBhbGwgb2YgdGhlIEpQRUcgaW50ZXJuYWwgcGFyYW1ldGVycyBhcmUKK3JlY29yZGVkIGluIHRoZSBzb3VyY2UgZmlsZSBhbmQgbmVlZCBub3QgYmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorKFVubGVzcyB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhYmJyZXZpYXRlZCBmaWxlcywgaW4gd2hpY2ggY2FzZSBzZWUKKyJBYmJyZXZpYXRlZCBkYXRhc3RyZWFtcyIsIGJlbG93LikgIERlY29tcHJlc3Npb24gcGFyYW1ldGVycyBjb250cm9sCit0aGUgcG9zdHByb2Nlc3NpbmcgZG9uZSBvbiB0aGUgaW1hZ2UgdG8gZGVsaXZlciBpdCBpbiBhIGZvcm1hdCBzdWl0YWJsZQorZm9yIHRoZSBhcHBsaWNhdGlvbidzIHVzZS4gIE1hbnkgb2YgdGhlIHBhcmFtZXRlcnMgY29udHJvbCBzcGVlZC9xdWFsaXR5Cit0cmFkZW9mZnMsIGluIHdoaWNoIGZhc3RlciBkZWNvbXByZXNzaW9uIG1heSBiZSBvYnRhaW5lZCBhdCB0aGUgcHJpY2Ugb2YKK2EgcG9vcmVyLXF1YWxpdHkgaW1hZ2UuICBUaGUgZGVmYXVsdHMgc2VsZWN0IHRoZSBoaWdoZXN0IHF1YWxpdHkgKHNsb3dlc3QpCitwcm9jZXNzaW5nLgorCitUaGUgZm9sbG93aW5nIGZpZWxkcyBpbiB0aGUgSlBFRyBvYmplY3QgYXJlIHNldCBieSBqcGVnX3JlYWRfaGVhZGVyKCkgYW5kCittYXkgYmUgdXNlZnVsIHRvIHRoZSBhcHBsaWNhdGlvbiBpbiBjaG9vc2luZyBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnM6CisKK0pESU1FTlNJT04gaW1hZ2Vfd2lkdGgJCQlXaWR0aCBhbmQgaGVpZ2h0IG9mIGltYWdlCitKRElNRU5TSU9OIGltYWdlX2hlaWdodAoraW50IG51bV9jb21wb25lbnRzCQkJTnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMKK0pfQ09MT1JfU1BBQ0UganBlZ19jb2xvcl9zcGFjZQkJQ29sb3JzcGFjZSBvZiBpbWFnZQorYm9vbGVhbiBzYXdfSkZJRl9tYXJrZXIJCQlUUlVFIGlmIGEgSkZJRiBBUFAwIG1hcmtlciB3YXMgc2VlbgorICBVSU5UOCBKRklGX21ham9yX3ZlcnNpb24JCVZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBKRklGIG1hcmtlcgorICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb24KKyAgVUlOVDggZGVuc2l0eV91bml0CQkJUmVzb2x1dGlvbiBkYXRhIGZyb20gSkZJRiBtYXJrZXIKKyAgVUlOVDE2IFhfZGVuc2l0eQorICBVSU5UMTYgWV9kZW5zaXR5Citib29sZWFuIHNhd19BZG9iZV9tYXJrZXIJCVRSVUUgaWYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBzZWVuCisgIFVJTlQ4IEFkb2JlX3RyYW5zZm9ybQkJCUNvbG9yIHRyYW5zZm9ybSBjb2RlIGZyb20gQWRvYmUgbWFya2VyCisKK1RoZSBKUEVHIGNvbG9yIHNwYWNlLCB1bmZvcnR1bmF0ZWx5LCBpcyBzb21ldGhpbmcgb2YgYSBndWVzcyBzaW5jZSB0aGUgSlBFRworc3RhbmRhcmQgcHJvcGVyIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcmVjb3JkIGl0LiAgSW4gcHJhY3RpY2UgbW9zdCBmaWxlcworYWRoZXJlIHRvIHRoZSBKRklGIG9yIEFkb2JlIGNvbnZlbnRpb25zLCBhbmQgdGhlIGRlY29kZXIgd2lsbCByZWNvZ25pemUgdGhlc2UKK2NvcnJlY3RseS4gIFNlZSAiU3BlY2lhbCBjb2xvciBzcGFjZXMiLCBiZWxvdywgZm9yIG1vcmUgaW5mby4KKworCitUaGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHRoYXQgZGV0ZXJtaW5lIHRoZSBiYXNpYyBwcm9wZXJ0aWVzIG9mIHRoZQorcmV0dXJuZWQgaW1hZ2UgYXJlOgorCitKX0NPTE9SX1NQQUNFIG91dF9jb2xvcl9zcGFjZQorCU91dHB1dCBjb2xvciBzcGFjZS4gIGpwZWdfcmVhZF9oZWFkZXIoKSBzZXRzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQKKwliYXNlZCBvbiBqcGVnX2NvbG9yX3NwYWNlOyB0eXBpY2FsbHkgaXQgd2lsbCBiZSBSR0Igb3IgZ3JheXNjYWxlLgorCVRoZSBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoaXMgZmllbGQgdG8gcmVxdWVzdCBvdXRwdXQgaW4gYSBkaWZmZXJlbnQKKwljb2xvcnNwYWNlLiAgRm9yIGV4YW1wbGUsIHNldCBpdCB0byBKQ1NfR1JBWVNDQUxFIHRvIGdldCBncmF5c2NhbGUKKwlvdXRwdXQgZnJvbSBhIGNvbG9yIGZpbGUuICAoVGhpcyBpcyB1c2VmdWwgZm9yIHByZXZpZXdpbmc6IGdyYXlzY2FsZQorCW91dHB1dCBpcyBmYXN0ZXIgdGhhbiBmdWxsIGNvbG9yIHNpbmNlIHRoZSBjb2xvciBjb21wb25lbnRzIG5lZWQgbm90CisJYmUgcHJvY2Vzc2VkLikgIE5vdGUgdGhhdCBub3QgYWxsIHBvc3NpYmxlIGNvbG9yIHNwYWNlIHRyYW5zZm9ybXMgYXJlCisJY3VycmVudGx5IGltcGxlbWVudGVkOyB5b3UgbWF5IG5lZWQgdG8gZXh0ZW5kIGpkY29sb3IuYyBpZiB5b3Ugd2FudCBhbgorCXVudXN1YWwgY29udmVyc2lvbi4KKwordW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub20KKwlTY2FsZSB0aGUgaW1hZ2UgYnkgdGhlIGZyYWN0aW9uIHNjYWxlX251bS9zY2FsZV9kZW5vbS4gIERlZmF1bHQgaXMKKwkxLzEsIG9yIG5vIHNjYWxpbmcuICBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCBzY2FsaW5nIHJhdGlvcworCWFyZSAxLzEsIDEvMiwgMS80LCBhbmQgMS84LiAgKFRoZSBsaWJyYXJ5IGRlc2lnbiBhbGxvd3MgZm9yIGFyYml0cmFyeQorCXNjYWxpbmcgcmF0aW9zIGJ1dCB0aGlzIGlzIG5vdCBsaWtlbHkgdG8gYmUgaW1wbGVtZW50ZWQgYW55IHRpbWUgc29vbi4pCisJU21hbGxlciBzY2FsaW5nIHJhdGlvcyBwZXJtaXQgc2lnbmlmaWNhbnRseSBmYXN0ZXIgZGVjb2Rpbmcgc2luY2UKKwlmZXdlciBwaXhlbHMgbmVlZCBiZSBwcm9jZXNzZWQgYW5kIGEgc2ltcGxlciBJRENUIG1ldGhvZCBjYW4gYmUgdXNlZC4KKworYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnMKKwlJZiBzZXQgVFJVRSwgY29sb3JtYXBwZWQgb3V0cHV0IHdpbGwgYmUgZGVsaXZlcmVkLiAgRGVmYXVsdCBpcyBGQUxTRSwKKwltZWFuaW5nIHRoYXQgZnVsbC1jb2xvciBvdXRwdXQgd2lsbCBiZSBkZWxpdmVyZWQuCisKK1RoZSBuZXh0IHRocmVlIHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IG9ubHkgaWYgcXVhbnRpemVfY29sb3JzIGlzIFRSVUUuCisKK2ludCBkZXNpcmVkX251bWJlcl9vZl9jb2xvcnMKKwlNYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgdG8gdXNlIGluIGdlbmVyYXRpbmcgYSBsaWJyYXJ5LXN1cHBsaWVkIGNvbG9yCisJbWFwICh0aGUgYWN0dWFsIG51bWJlciBvZiBjb2xvcnMgaXMgcmV0dXJuZWQgaW4gYSBkaWZmZXJlbnQgZmllbGQpLgorCURlZmF1bHQgMjU2LiAgSWdub3JlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllcyBpdHMgb3duIGNvbG9yIG1hcC4KKworYm9vbGVhbiB0d29fcGFzc19xdWFudGl6ZQorCUlmIFRSVUUsIGFuIGV4dHJhIHBhc3Mgb3ZlciB0aGUgaW1hZ2UgaXMgbWFkZSB0byBzZWxlY3QgYSBjdXN0b20gY29sb3IKKwltYXAgZm9yIHRoZSBpbWFnZS4gIFRoaXMgdXN1YWxseSBsb29rcyBhIGxvdCBiZXR0ZXIgdGhhbiB0aGUgb25lLXNpemUtCisJZml0cy1hbGwgY29sb3JtYXAgdGhhdCBpcyB1c2VkIG90aGVyd2lzZS4gIERlZmF1bHQgaXMgVFJVRS4gIElnbm9yZWQKKwl3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdXBwbGllcyBpdHMgb3duIGNvbG9yIG1hcC4KKworSl9ESVRIRVJfTU9ERSBkaXRoZXJfbW9kZQorCVNlbGVjdHMgY29sb3IgZGl0aGVyaW5nIG1ldGhvZC4gIFN1cHBvcnRlZCB2YWx1ZXMgYXJlOgorCQlKRElUSEVSX05PTkUJbm8gZGl0aGVyaW5nOiBmYXN0LCB2ZXJ5IGxvdyBxdWFsaXR5CisJCUpESVRIRVJfT1JERVJFRAlvcmRlcmVkIGRpdGhlcjogbW9kZXJhdGUgc3BlZWQgYW5kIHF1YWxpdHkKKwkJSkRJVEhFUl9GUwlGbG95ZC1TdGVpbmJlcmcgZGl0aGVyOiBzbG93LCBoaWdoIHF1YWxpdHkKKwlEZWZhdWx0IGlzIEpESVRIRVJfRlMuICAoQXQgcHJlc2VudCwgb3JkZXJlZCBkaXRoZXIgaXMgaW1wbGVtZW50ZWQKKwlvbmx5IGluIHRoZSBzaW5nbGUtcGFzcywgc3RhbmRhcmQtY29sb3JtYXAgY2FzZS4gIElmIHlvdSBhc2sgZm9yCisJb3JkZXJlZCBkaXRoZXIgd2hlbiB0d29fcGFzc19xdWFudGl6ZSBpcyBUUlVFIG9yIHdoZW4geW91IHN1cHBseQorCWFuIGV4dGVybmFsIGNvbG9yIG1hcCwgeW91J2xsIGdldCBGLVMgZGl0aGVyaW5nLikKKworV2hlbiBxdWFudGl6ZV9jb2xvcnMgaXMgVFJVRSwgdGhlIHRhcmdldCBjb2xvciBtYXAgaXMgZGVzY3JpYmVkIGJ5IHRoZSBuZXh0Cit0d28gZmllbGRzLiAgY29sb3JtYXAgaXMgc2V0IHRvIE5VTEwgYnkganBlZ19yZWFkX2hlYWRlcigpLiAgVGhlIGFwcGxpY2F0aW9uCitjYW4gc3VwcGx5IGEgY29sb3IgbWFwIGJ5IHNldHRpbmcgY29sb3JtYXAgbm9uLU5VTEwgYW5kIHNldHRpbmcKK2FjdHVhbF9udW1iZXJfb2ZfY29sb3JzIHRvIHRoZSBtYXAgc2l6ZS4gIE90aGVyd2lzZSwganBlZ19zdGFydF9kZWNvbXByZXNzKCkKK3NlbGVjdHMgYSBzdWl0YWJsZSBjb2xvciBtYXAgYW5kIHNldHMgdGhlc2UgdHdvIGZpZWxkcyBpdHNlbGYuCitbSW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb246IGF0IHByZXNlbnQsIGFuIGV4dGVybmFsbHkgc3VwcGxpZWQgY29sb3JtYXAgaXMKK29ubHkgYWNjZXB0ZWQgZm9yIDMtY29tcG9uZW50IG91dHB1dCBjb2xvciBzcGFjZXMuXQorCitKU0FNUEFSUkFZIGNvbG9ybWFwCisJVGhlIGNvbG9yIG1hcCwgcmVwcmVzZW50ZWQgYXMgYSAyLUQgcGl4ZWwgYXJyYXkgb2Ygb3V0X2NvbG9yX2NvbXBvbmVudHMKKwlyb3dzIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBjb2x1bW5zLiAgSWdub3JlZCBpZiBub3QgcXVhbnRpemluZy4KKwlDQVVUSU9OOiBpZiB0aGUgSlBFRyBsaWJyYXJ5IGNyZWF0ZXMgaXRzIG93biBjb2xvcm1hcCwgdGhlIHN0b3JhZ2UKKwlwb2ludGVkIHRvIGJ5IHRoaXMgZmllbGQgaXMgcmVsZWFzZWQgYnkganBlZ19maW5pc2hfZGVjb21wcmVzcygpLgorCUNvcHkgdGhlIGNvbG9ybWFwIHNvbWV3aGVyZSBlbHNlIGZpcnN0LCBpZiB5b3Ugd2FudCB0byBzYXZlIGl0LgorCitpbnQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnMKKwlUaGUgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgY29sb3IgbWFwLgorCitBZGRpdGlvbmFsIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBtYXkgc2V0IGluY2x1ZGU6CisKK0pfRENUX01FVEhPRCBkY3RfbWV0aG9kCisJU2VsZWN0cyB0aGUgYWxnb3JpdGhtIHVzZWQgZm9yIHRoZSBEQ1Qgc3RlcC4gIENob2ljZXMgYXJlIHRoZSBzYW1lCisJYXMgZGVzY3JpYmVkIGFib3ZlIGZvciBjb21wcmVzc2lvbi4KKworYm9vbGVhbiBkb19mYW5jeV91cHNhbXBsaW5nCisJSWYgVFJVRSwgZG8gY2FyZWZ1bCB1cHNhbXBsaW5nIG9mIGNocm9tYSBjb21wb25lbnRzLiAgSWYgRkFMU0UsCisJYSBmYXN0ZXIgYnV0IHNsb3BwaWVyIG1ldGhvZCBpcyB1c2VkLiAgRGVmYXVsdCBpcyBUUlVFLiAgVGhlIHZpc3VhbAorCWltcGFjdCBvZiB0aGUgc2xvcHBpZXIgbWV0aG9kIGlzIG9mdGVuIHZlcnkgc21hbGwuCisKK2Jvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nCisJSWYgVFJVRSwgaW50ZXJibG9jayBzbW9vdGhpbmcgaXMgYXBwbGllZCBpbiBlYXJseSBzdGFnZXMgb2YgZGVjb2RpbmcKKwlwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzOyBpZiBGQUxTRSwgbm90LiAgRGVmYXVsdCBpcyBUUlVFLiAgRWFybHkKKwlwcm9ncmVzc2lvbiBzdGFnZXMgbG9vayAiZnV6enkiIHdpdGggc21vb3RoaW5nLCAiYmxvY2t5IiB3aXRob3V0LgorCUluIGFueSBjYXNlLCBibG9jayBzbW9vdGhpbmcgY2Vhc2VzIHRvIGJlIGFwcGxpZWQgYWZ0ZXIgdGhlIGZpcnN0IGZldworCUFDIGNvZWZmaWNpZW50cyBhcmUga25vd24gdG8gZnVsbCBhY2N1cmFjeSwgc28gaXQgaXMgcmVsZXZhbnQgb25seQorCXdoZW4gdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZSBmb3IgcHJvZ3Jlc3NpdmUgaW1hZ2VzLgorCitib29sZWFuIGVuYWJsZV8xcGFzc19xdWFudAorYm9vbGVhbiBlbmFibGVfZXh0ZXJuYWxfcXVhbnQKK2Jvb2xlYW4gZW5hYmxlXzJwYXNzX3F1YW50CisJVGhlc2UgYXJlIHNpZ25pZmljYW50IG9ubHkgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgd2hpY2ggaXMKKwlkZXNjcmliZWQgaW4gaXRzIG93biBzZWN0aW9uIGJlbG93LgorCisKK1RoZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhcmUgZ2l2ZW4gYnkgdGhlIGZvbGxvd2luZyBmaWVsZHMuICBUaGVzZSBhcmUKK2NvbXB1dGVkIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBkaW1lbnNpb25zIGFuZCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCitieSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKS4gIFlvdSBjYW4gYWxzbyBjYWxsIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucygpCit0byBvYnRhaW4gdGhlIHZhbHVlcyB0aGF0IHdpbGwgcmVzdWx0IGZyb20gdGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldHRpbmdzLgorVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHBpY2sgYSBzY2FsaW5nIHJhdGlvIHRoYXQgd2lsbCBnZXQKK2Nsb3NlIHRvIGEgZGVzaXJlZCB0YXJnZXQgc2l6ZS4gIEl0J3MgYWxzbyBpbXBvcnRhbnQgaWYgeW91IGFyZSB1c2luZyB0aGUKK0pQRUcgbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIG91dHB1dCBidWZmZXIgc3BhY2UsIGJlY2F1c2UgeW91CithcmUgc3VwcG9zZWQgdG8gcmVxdWVzdCBzdWNoIGJ1ZmZlcnMgKmJlZm9yZSoganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCisKK0pESU1FTlNJT04gb3V0cHV0X3dpZHRoCQlBY3R1YWwgZGltZW5zaW9ucyBvZiBvdXRwdXQgaW1hZ2UuCitKRElNRU5TSU9OIG91dHB1dF9oZWlnaHQKK2ludCBvdXRfY29sb3JfY29tcG9uZW50cwlOdW1iZXIgb2YgY29sb3IgY29tcG9uZW50cyBpbiBvdXRfY29sb3Jfc3BhY2UuCitpbnQgb3V0cHV0X2NvbXBvbmVudHMJCU51bWJlciBvZiBjb2xvciBjb21wb25lbnRzIHJldHVybmVkLgoraW50IHJlY19vdXRidWZfaGVpZ2h0CQlSZWNvbW1lbmRlZCBoZWlnaHQgb2Ygc2NhbmxpbmUgYnVmZmVyLgorCitXaGVuIHF1YW50aXppbmcgY29sb3JzLCBvdXRwdXRfY29tcG9uZW50cyBpcyAxLCBpbmRpY2F0aW5nIGEgc2luZ2xlIGNvbG9yIG1hcAoraW5kZXggcGVyIHBpeGVsLiAgT3RoZXJ3aXNlIGl0IGVxdWFscyBvdXRfY29sb3JfY29tcG9uZW50cy4gIFRoZSBvdXRwdXQgYXJyYXlzCithcmUgcmVxdWlyZWQgdG8gYmUgb3V0cHV0X3dpZHRoICogb3V0cHV0X2NvbXBvbmVudHMgSlNBTVBMRXMgd2lkZS4KKworcmVjX291dGJ1Zl9oZWlnaHQgaXMgdGhlIHJlY29tbWVuZGVkIG1pbmltdW0gaGVpZ2h0IChpbiBzY2FubGluZXMpIG9mIHRoZQorYnVmZmVyIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkuICBJZiB0aGUgYnVmZmVyIGlzIHNtYWxsZXIsIHRoZQorbGlicmFyeSB3aWxsIHN0aWxsIHdvcmssIGJ1dCB0aW1lIHdpbGwgYmUgd2FzdGVkIGR1ZSB0byB1bm5lY2Vzc2FyeSBkYXRhCitjb3B5aW5nLiAgSW4gaGlnaC1xdWFsaXR5IG1vZGVzLCByZWNfb3V0YnVmX2hlaWdodCBpcyBhbHdheXMgMSwgYnV0IHNvbWUKK2Zhc3RlciwgbG93ZXItcXVhbGl0eSBtb2RlcyBzZXQgaXQgdG8gbGFyZ2VyIHZhbHVlcyAodHlwaWNhbGx5IDIgdG8gNCkuCitJZiB5b3UgYXJlIGdvaW5nIHRvIGFzayBmb3IgYSBoaWdoLXNwZWVkIHByb2Nlc3NpbmcgbW9kZSwgeW91IG1heSBhcyB3ZWxsCitnbyB0byB0aGUgdHJvdWJsZSBvZiBob25vcmluZyByZWNfb3V0YnVmX2hlaWdodCBzbyBhcyB0byBhdm9pZCBkYXRhIGNvcHlpbmcuCisoQW4gb3V0cHV0IGJ1ZmZlciBsYXJnZXIgdGhhbiByZWNfb3V0YnVmX2hlaWdodCBsaW5lcyBpcyBPSywgYnV0IHdvbid0Citwcm92aWRlIGFueSBtYXRlcmlhbCBzcGVlZCBpbXByb3ZlbWVudCBvdmVyIHRoYXQgaGVpZ2h0LikKKworCitTcGVjaWFsIGNvbG9yIHNwYWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEpQRUcgc3RhbmRhcmQgaXRzZWxmIGlzICJjb2xvciBibGluZCIgYW5kIGRvZXNuJ3Qgc3BlY2lmeSBhbnkgcGFydGljdWxhcgorY29sb3Igc3BhY2UuICBJdCBpcyBjdXN0b21hcnkgdG8gY29udmVydCBjb2xvciBkYXRhIHRvIGEgbHVtaW5hbmNlL2Nocm9taW5hbmNlCitjb2xvciBzcGFjZSBiZWZvcmUgY29tcHJlc3NpbmcsIHNpbmNlIHRoaXMgcGVybWl0cyBncmVhdGVyIGNvbXByZXNzaW9uLiAgVGhlCitleGlzdGluZyBkZS1mYWN0byBKUEVHIGZpbGUgZm9ybWF0IHN0YW5kYXJkcyBzcGVjaWZ5IFlDYkNyIG9yIGdyYXlzY2FsZSBkYXRhCisoSkZJRiksIG9yIGdyYXlzY2FsZSwgUkdCLCBZQ2JDciwgQ01ZSywgb3IgWUNDSyAoQWRvYmUpLiAgRm9yIHNwZWNpYWwKK2FwcGxpY2F0aW9ucyBzdWNoIGFzIG11bHRpc3BlY3RyYWwgaW1hZ2VzLCBvdGhlciBjb2xvciBzcGFjZXMgY2FuIGJlIHVzZWQsCitidXQgaXQgbXVzdCBiZSB1bmRlcnN0b29kIHRoYXQgc3VjaCBmaWxlcyB3aWxsIGJlIHVucG9ydGFibGUuCisKK1RoZSBKUEVHIGxpYnJhcnkgY2FuIGhhbmRsZSB0aGUgbW9zdCBjb21tb24gY29sb3JzcGFjZSBjb252ZXJzaW9ucyAobmFtZWx5CitSR0IgPD0+IFlDYkNyIGFuZCBDTVlLIDw9PiBZQ0NLKS4gIEl0IGNhbiBhbHNvIGRlYWwgd2l0aCBkYXRhIG9mIGFuIHVua25vd24KK2NvbG9yIHNwYWNlLCBwYXNzaW5nIGl0IHRocm91Z2ggd2l0aG91dCBjb252ZXJzaW9uLiAgSWYgeW91IGRlYWwgZXh0ZW5zaXZlbHkKK3dpdGggYW4gdW51c3VhbCBjb2xvciBzcGFjZSwgeW91IGNhbiBlYXNpbHkgZXh0ZW5kIHRoZSBsaWJyYXJ5IHRvIHVuZGVyc3RhbmQKK2FkZGl0aW9uYWwgY29sb3Igc3BhY2VzIGFuZCBwZXJmb3JtIGFwcHJvcHJpYXRlIGNvbnZlcnNpb25zLgorCitGb3IgY29tcHJlc3Npb24sIHRoZSBzb3VyY2UgZGF0YSdzIGNvbG9yIHNwYWNlIGlzIHNwZWNpZmllZCBieSBmaWVsZAoraW5fY29sb3Jfc3BhY2UuICBUaGlzIGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBKUEVHIGZpbGUncyBjb2xvciBzcGFjZSBnaXZlbgorYnkganBlZ19jb2xvcl9zcGFjZS4gIGpwZWdfc2V0X2RlZmF1bHRzKCkgY2hvb3NlcyBhIHJlYXNvbmFibGUgSlBFRyBjb2xvcgorc3BhY2UgZGVwZW5kaW5nIG9uIGluX2NvbG9yX3NwYWNlLCBidXQgeW91IGNhbiBvdmVycmlkZSB0aGlzIGJ5IGNhbGxpbmcKK2pwZWdfc2V0X2NvbG9yc3BhY2UoKS4gIE9mIGNvdXJzZSB5b3UgbXVzdCBzZWxlY3QgYSBzdXBwb3J0ZWQgdHJhbnNmb3JtYXRpb24uCitqY2NvbG9yLmMgY3VycmVudGx5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtYXRpb25zOgorCVJHQiA9PiBZQ2JDcgorCVJHQiA9PiBHUkFZU0NBTEUKKwlZQ2JDciA9PiBHUkFZU0NBTEUKKwlDTVlLID0+IFlDQ0sKK3BsdXMgdGhlIG51bGwgdHJhbnNmb3JtczogR1JBWVNDQUxFID0+IEdSQVlTQ0FMRSwgUkdCID0+IFJHQiwKK1lDYkNyID0+IFlDYkNyLCBDTVlLID0+IENNWUssIFlDQ0sgPT4gWUNDSywgYW5kIFVOS05PV04gPT4gVU5LTk9XTi4KKworVGhlIGRlLWZhY3RvIGZpbGUgZm9ybWF0IHN0YW5kYXJkcyAoSkZJRiBhbmQgQWRvYmUpIHNwZWNpZnkgQVBQbiBtYXJrZXJzIHRoYXQKK2luZGljYXRlIHRoZSBjb2xvciBzcGFjZSBvZiB0aGUgSlBFRyBmaWxlLiAgSXQgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0Cit0aGVzZSBhcmUgd3JpdHRlbiBjb3JyZWN0bHksIG9yIG9taXR0ZWQgaWYgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGlzIG5vdAorb25lIG9mIHRoZSBvbmVzIHN1cHBvcnRlZCBieSB0aGUgZGUtZmFjdG8gc3RhbmRhcmRzLiAganBlZ19zZXRfY29sb3JzcGFjZSgpCit3aWxsIHNldCB0aGUgY29tcHJlc3Npb24gcGFyYW1ldGVycyB0byBpbmNsdWRlIG9yIG9taXQgdGhlIEFQUG4gbWFya2VycworcHJvcGVybHksIHNvIGxvbmcgYXMgaXQgaXMgdG9sZCB0aGUgdHJ1dGggYWJvdXQgdGhlIEpQRUcgY29sb3Igc3BhY2UuCitGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSB3cml0aW5nIHNvbWUgcmFuZG9tIDMtY29tcG9uZW50IGNvbG9yIHNwYWNlIHdpdGhvdXQKK2NvbnZlcnNpb24sIGRvbid0IHRyeSB0byBmYWtlIG91dCB0aGUgbGlicmFyeSBieSBzZXR0aW5nIGluX2NvbG9yX3NwYWNlIGFuZAoranBlZ19jb2xvcl9zcGFjZSB0byBKQ1NfWUNiQ3I7IHVzZSBKQ1NfVU5LTk9XTi4gIFlvdSBtYXkgd2FudCB0byB3cml0ZSBhbgorQVBQbiBtYXJrZXIgb2YgeW91ciBvd24gZGV2aXNpbmcgdG8gaWRlbnRpZnkgdGhlIGNvbG9yc3BhY2UgLS0tIHNlZSAiU3BlY2lhbAorbWFya2VycyIsIGJlbG93LgorCitXaGVuIHRvbGQgdGhhdCB0aGUgY29sb3Igc3BhY2UgaXMgVU5LTk9XTiwgdGhlIGxpYnJhcnkgd2lsbCBkZWZhdWx0IHRvIHVzaW5nCitsdW1pbmFuY2UtcXVhbGl0eSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZvciBhbGwgY29sb3IgY29tcG9uZW50cy4gIFlvdSBtYXkKK3dlbGwgd2FudCB0byBjaGFuZ2UgdGhlc2UgcGFyYW1ldGVycy4gIFNlZSB0aGUgc291cmNlIGNvZGUgZm9yCitqcGVnX3NldF9jb2xvcnNwYWNlKCksIGluIGpjcGFyYW0uYywgZm9yIGRldGFpbHMuCisKK0ZvciBkZWNvbXByZXNzaW9uLCB0aGUgSlBFRyBmaWxlJ3MgY29sb3Igc3BhY2UgaXMgZ2l2ZW4gaW4ganBlZ19jb2xvcl9zcGFjZSwKK2FuZCB0aGlzIGlzIHRyYW5zZm9ybWVkIHRvIHRoZSBvdXRwdXQgY29sb3Igc3BhY2Ugb3V0X2NvbG9yX3NwYWNlLgoranBlZ19yZWFkX2hlYWRlcidzIHNldHRpbmcgb2YganBlZ19jb2xvcl9zcGFjZSBjYW4gYmUgcmVsaWVkIG9uIGlmIHRoZSBmaWxlCitjb25mb3JtcyB0byBKRklGIG9yIEFkb2JlIGNvbnZlbnRpb25zLCBidXQgb3RoZXJ3aXNlIGl0IGlzIG5vIGJldHRlciB0aGFuIGEKK2d1ZXNzLiAgSWYgeW91IGtub3cgdGhlIEpQRUcgZmlsZSdzIGNvbG9yIHNwYWNlIGZvciBjZXJ0YWluLCB5b3UgY2FuIG92ZXJyaWRlCitqcGVnX3JlYWRfaGVhZGVyJ3MgZ3Vlc3MgYnkgc2V0dGluZyBqcGVnX2NvbG9yX3NwYWNlLiAganBlZ19yZWFkX2hlYWRlciBhbHNvCitzZWxlY3RzIGEgZGVmYXVsdCBvdXRwdXQgY29sb3Igc3BhY2UgYmFzZWQgb24gKGl0cyBndWVzcyBvZikganBlZ19jb2xvcl9zcGFjZTsKK3NldCBvdXRfY29sb3Jfc3BhY2UgdG8gb3ZlcnJpZGUgdGhpcy4gIEFnYWluLCB5b3UgbXVzdCBzZWxlY3QgYSBzdXBwb3J0ZWQKK3RyYW5zZm9ybWF0aW9uLiAgamRjb2xvci5jIGN1cnJlbnRseSBzdXBwb3J0cworCVlDYkNyID0+IEdSQVlTQ0FMRQorCVlDYkNyID0+IFJHQgorCUdSQVlTQ0FMRSA9PiBSR0IKKwlZQ0NLID0+IENNWUsKK2FzIHdlbGwgYXMgdGhlIG51bGwgdHJhbnNmb3Jtcy4gIChTaW5jZSBHUkFZU0NBTEU9PlJHQiBpcyBwcm92aWRlZCwgYW4KK2FwcGxpY2F0aW9uIGNhbiBmb3JjZSBncmF5c2NhbGUgSlBFR3MgdG8gbG9vayBsaWtlIGNvbG9yIEpQRUdzIGlmIGl0IG9ubHkKK3dhbnRzIHRvIGhhbmRsZSBvbmUgY2FzZS4pCisKK1RoZSB0d28tcGFzcyBjb2xvciBxdWFudGl6ZXIsIGpxdWFudDIuYywgaXMgc3BlY2lhbGl6ZWQgdG8gaGFuZGxlIFJHQiBkYXRhCisoaXQgd2VpZ2h0cyBkaXN0YW5jZXMgYXBwcm9wcmlhdGVseSBmb3IgUkdCIGNvbG9ycykuICBZb3UnbGwgbmVlZCB0byBtb2RpZnkKK3RoZSBjb2RlIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBmb3Igbm9uLVJHQiBvdXRwdXQgY29sb3Igc3BhY2VzLiAgTm90ZSB0aGF0CitqcXVhbnQyLmMgaXMgdXNlZCB0byBtYXAgdG8gYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgY29sb3JtYXAgYXMgd2VsbCBhcyBmb3IKK3RoZSBub3JtYWwgdHdvLXBhc3MgY29sb3JtYXAgc2VsZWN0aW9uIHByb2Nlc3MuCisKK0NBVVRJT046IGl0IGFwcGVhcnMgdGhhdCBBZG9iZSBQaG90b3Nob3Agd3JpdGVzIGludmVydGVkIGRhdGEgaW4gQ01ZSyBKUEVHCitmaWxlczogMCByZXByZXNlbnRzIDEwMCUgaW5rIGNvdmVyYWdlLCByYXRoZXIgdGhhbiAwJSBpbmsgYXMgeW91J2QgZXhwZWN0LgorVGhpcyBpcyBhcmd1YWJseSBhIGJ1ZyBpbiBQaG90b3Nob3AsIGJ1dCBpZiB5b3UgbmVlZCB0byB3b3JrIHdpdGggUGhvdG9zaG9wCitDTVlLIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlYWwgd2l0aCBpdCBpbiB5b3VyIGFwcGxpY2F0aW9uLiAgV2UgY2Fubm90CisiZml4IiB0aGlzIGluIHRoZSBsaWJyYXJ5IGJ5IGludmVydGluZyB0aGUgZGF0YSBkdXJpbmcgdGhlIENNWUs8PT5ZQ0NLCit0cmFuc2Zvcm0sIGJlY2F1c2UgdGhhdCB3b3VsZCBicmVhayBvdGhlciBhcHBsaWNhdGlvbnMsIG5vdGFibHkgR2hvc3RzY3JpcHQuCitQaG90b3Nob3AgdmVyc2lvbnMgcHJpb3IgdG8gMy4wIHdyaXRlIEVQUyBmaWxlcyBjb250YWluaW5nIEpQRUctZW5jb2RlZCBDTVlLCitkYXRhIGluIHRoZSBzYW1lIGludmVydGVkLVlDQ0sgcmVwcmVzZW50YXRpb24gdXNlZCBpbiBiYXJlIEpQRUcgZmlsZXMsIGJ1dAordGhlIHN1cnJvdW5kaW5nIFBvc3RTY3JpcHQgY29kZSBwZXJmb3JtcyBhbiBpbnZlcnNpb24gdXNpbmcgdGhlIFBTIGltYWdlCitvcGVyYXRvci4gIEkgYW0gdG9sZCB0aGF0IFBob3Rvc2hvcCAzLjAgd2lsbCB3cml0ZSB1bmludmVydGVkIFlDQ0sgaW4KK0VQUy9KUEVHIGZpbGVzLCBhbmQgd2lsbCBvbWl0IHRoZSBQUy1sZXZlbCBpbnZlcnNpb24uICAoQnV0IHRoZSBkYXRhCitwb2xhcml0eSB1c2VkIGluIGJhcmUgSlBFRyBmaWxlcyB3aWxsIG5vdCBjaGFuZ2UgaW4gMy4wLikgIEluIGVpdGhlciBjYXNlLAordGhlIEpQRUcgbGlicmFyeSBtdXN0IG5vdCBpbnZlcnQgdGhlIGRhdGEgaXRzZWxmLCBvciBlbHNlIEdob3N0c2NyaXB0IHdvdWxkCityZWFkIHRoZXNlIEVQUyBmaWxlcyBpbmNvcnJlY3RseS4KKworCitFcnJvciBoYW5kbGluZworLS0tLS0tLS0tLS0tLS0KKworV2hlbiB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGlzIHVzZWQsIGFueSBlcnJvciBkZXRlY3RlZCBpbnNpZGUgdGhlIEpQRUcKK3JvdXRpbmVzIHdpbGwgY2F1c2UgYSBtZXNzYWdlIHRvIGJlIHByaW50ZWQgb24gc3RkZXJyLCBmb2xsb3dlZCBieSBleGl0KCkuCitZb3UgY2FuIHN1cHBseSB5b3VyIG93biBlcnJvciBoYW5kbGluZyByb3V0aW5lcyB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yCithbmQgdG8gY29udHJvbCB0aGUgdHJlYXRtZW50IG9mIG5vbmZhdGFsIHdhcm5pbmdzIGFuZCB0cmFjZS9kZWJ1ZyBtZXNzYWdlcy4KK1RoZSBmaWxlIGV4YW1wbGUuYyBpbGx1c3RyYXRlcyB0aGUgbW9zdCBjb21tb24gY2FzZSwgd2hpY2ggaXMgdG8gaGF2ZSB0aGUKK2FwcGxpY2F0aW9uIHJlZ2FpbiBjb250cm9sIGFmdGVyIGFuIGVycm9yIHJhdGhlciB0aGFuIGV4aXRpbmcuCisKK1RoZSBKUEVHIGxpYnJhcnkgbmV2ZXIgd3JpdGVzIGFueSBtZXNzYWdlIGRpcmVjdGx5OyBpdCBhbHdheXMgZ29lcyB0aHJvdWdoCit0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZXMuICBUaHJlZSBjbGFzc2VzIG9mIG1lc3NhZ2VzIGFyZSByZWNvZ25pemVkOgorICAqIEZhdGFsIGVycm9yczogdGhlIGxpYnJhcnkgY2Fubm90IGNvbnRpbnVlLgorICAqIFdhcm5pbmdzOiB0aGUgbGlicmFyeSBjYW4gY29udGludWUsIGJ1dCB0aGUgZGF0YSBpcyBjb3JydXB0LCBhbmQgYQorICAgIGRhbWFnZWQgb3V0cHV0IGltYWdlIGlzIGxpa2VseSB0byByZXN1bHQuCisgICogVHJhY2UvaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4gIFRoZXNlIGNvbWUgd2l0aCBhIHRyYWNlIGxldmVsIGluZGljYXRpbmcKKyAgICB0aGUgaW1wb3J0YW5jZSBvZiB0aGUgbWVzc2FnZTsgeW91IGNhbiBjb250cm9sIHRoZSB2ZXJib3NpdHkgb2YgdGhlCisgICAgcHJvZ3JhbSBieSBhZGp1c3RpbmcgdGhlIG1heGltdW0gdHJhY2UgbGV2ZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZC4KKworWW91IG1heSwgaWYgeW91IHdpc2gsIHNpbXBseSByZXBsYWNlIHRoZSBlbnRpcmUgSlBFRyBlcnJvciBoYW5kbGluZyBtb2R1bGUKKyhqZXJyb3IuYykgd2l0aCB5b3VyIG93biBjb2RlLiAgSG93ZXZlciwgeW91IGNhbiBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uIGJ5Citvbmx5IHJlcGxhY2luZyBzb21lIG9mIHRoZSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGJlaGF2aW9yIHlvdSBuZWVkLgorVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgY2FsbGluZyBqcGVnX3N0ZF9lcnJvcigpIGFzIHVzdWFsLCBidXQgdGhlbiBvdmVycmlkaW5nCitzb21lIG9mIHRoZSBtZXRob2QgcG9pbnRlcnMgaW4gdGhlIGpwZWdfZXJyb3JfbWdyIHN0cnVjdCwgYXMgaWxsdXN0cmF0ZWQgYnkKK2V4YW1wbGUuYy4KKworQWxsIG9mIHRoZSBlcnJvciBoYW5kbGluZyByb3V0aW5lcyB3aWxsIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoZSBKUEVHIG9iamVjdAorKGEgal9jb21tb25fcHRyIHdoaWNoIHBvaW50cyB0byBlaXRoZXIgYSBqcGVnX2NvbXByZXNzX3N0cnVjdCBvciBhCitqcGVnX2RlY29tcHJlc3Nfc3RydWN0OyBpZiB5b3UgbmVlZCB0byB0ZWxsIHdoaWNoLCB0ZXN0IHRoZSBpc19kZWNvbXByZXNzb3IKK2ZpZWxkKS4gIFRoaXMgc3RydWN0IGluY2x1ZGVzIGEgcG9pbnRlciB0byB0aGUgZXJyb3IgbWFuYWdlciBzdHJ1Y3QgaW4gaXRzCisiZXJyIiBmaWVsZC4gIEZyZXF1ZW50bHksIGN1c3RvbSBlcnJvciBoYW5kbGVyIHJvdXRpbmVzIHdpbGwgbmVlZCB0byBhY2Nlc3MKK2FkZGl0aW9uYWwgZGF0YSB3aGljaCBpcyBub3Qga25vd24gdG8gdGhlIEpQRUcgbGlicmFyeSBvciB0aGUgc3RhbmRhcmQgZXJyb3IKK2hhbmRsZXIuICBUaGUgbW9zdCBjb252ZW5pZW50IHdheSB0byBkbyB0aGlzIGlzIHRvIGVtYmVkIGVpdGhlciB0aGUgSlBFRworb2JqZWN0IG9yIHRoZSBqcGVnX2Vycm9yX21nciBzdHJ1Y3QgaW4gYSBsYXJnZXIgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKK2FkZGl0aW9uYWwgZmllbGRzOyB0aGVuIGNhc3RpbmcgdGhlIHBhc3NlZCBwb2ludGVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKK2FkZGl0aW9uYWwgZmllbGRzLiAgQWdhaW4sIHNlZSBleGFtcGxlLmMgZm9yIG9uZSB3YXkgdG8gZG8gaXQuICAoQmVnaW5uaW5nCit3aXRoIElKRyB2ZXJzaW9uIDZiLCB0aGVyZSBpcyBhbHNvIGEgdm9pZCBwb2ludGVyICJjbGllbnRfZGF0YSIgaW4gZWFjaAorSlBFRyBvYmplY3QsIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBjYW4gYWxzbyB1c2UgdG8gZmluZCByZWxhdGVkIGRhdGEuCitUaGUgbGlicmFyeSBkb2VzIG5vdCB0b3VjaCBjbGllbnRfZGF0YSBhdCBhbGwuKQorCitUaGUgaW5kaXZpZHVhbCBtZXRob2RzIHRoYXQgeW91IG1pZ2h0IHdpc2ggdG8gb3ZlcnJpZGUgYXJlOgorCitlcnJvcl9leGl0IChqX2NvbW1vbl9wdHIgY2luZm8pCisJUmVjZWl2ZXMgY29udHJvbCBmb3IgYSBmYXRhbCBlcnJvci4gIEluZm9ybWF0aW9uIHN1ZmZpY2llbnQgdG8KKwlnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBoYXMgYmVlbiBzdG9yZWQgaW4gY2luZm8tPmVycjsgY2FsbAorCW91dHB1dF9tZXNzYWdlIHRvIGRpc3BsYXkgaXQuICBDb250cm9sIG11c3QgTk9UIHJldHVybiB0byB0aGUgY2FsbGVyOworCWdlbmVyYWxseSB0aGlzIHJvdXRpbmUgd2lsbCBleGl0KCkgb3IgbG9uZ2ptcCgpIHNvbWV3aGVyZS4KKwlUeXBpY2FsbHkgeW91IHdvdWxkIG92ZXJyaWRlIHRoaXMgcm91dGluZSB0byBnZXQgcmlkIG9mIHRoZSBleGl0KCkKKwlkZWZhdWx0IGJlaGF2aW9yLiAgTm90ZSB0aGF0IGlmIHlvdSBjb250aW51ZSBwcm9jZXNzaW5nLCB5b3Ugc2hvdWxkCisJY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0IHdpdGgganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLgorCitvdXRwdXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvKQorCUFjdHVhbCBvdXRwdXQgb2YgYW55IEpQRUcgbWVzc2FnZS4gIE92ZXJyaWRlIHRoaXMgdG8gc2VuZCBtZXNzYWdlcworCXNvbWV3aGVyZSBvdGhlciB0aGFuIHN0ZGVyci4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBrbm93CisJaG93IHRvIGdlbmVyYXRlIGEgbWVzc2FnZSwgb25seSB3aGVyZSB0byBzZW5kIGl0LgorCitmb3JtYXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBjaGFyICogYnVmZmVyKQorCUNvbnN0cnVjdHMgYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlIHN0cmluZyBiYXNlZCBvbiB0aGUgZXJyb3IgaW5mbworCXN0b3JlZCBpbiBjaW5mby0+ZXJyLiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IG91dHB1dF9tZXNzYWdlLiAgRmV3CisJYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiAgT25lIHBvc3NpYmxlCisJcmVhc29uIGZvciBkb2luZyBzbyBpcyB0byBpbXBsZW1lbnQgZHluYW1pYyBzd2l0Y2hpbmcgb2YgZXJyb3IgbWVzc2FnZQorCWxhbmd1YWdlLgorCitlbWl0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IG1zZ19sZXZlbCkKKwlEZWNpZGUgd2hldGhlciBvciBub3QgdG8gZW1pdCBhIHdhcm5pbmcgb3IgdHJhY2UgbWVzc2FnZTsgaWYgc28sCisJY2FsbHMgb3V0cHV0X21lc3NhZ2UuICBUaGUgbWFpbiByZWFzb24gZm9yIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QKKwl3b3VsZCBiZSB0byBhYm9ydCBvbiB3YXJuaW5ncy4gIG1zZ19sZXZlbCBpcyAtMSBmb3Igd2FybmluZ3MsCisJMCBhbmQgdXAgZm9yIHRyYWNlIG1lc3NhZ2VzLgorCitPbmx5IGVycm9yX2V4aXQoKSBhbmQgZW1pdF9tZXNzYWdlKCkgYXJlIGNhbGxlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBKUEVHCitsaWJyYXJ5OyB0aGUgb3RoZXIgdHdvIGFyZSBpbnRlcm5hbCB0byB0aGUgZXJyb3IgaGFuZGxlci4KKworVGhlIGFjdHVhbCBtZXNzYWdlIHRleHRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBpcyBwb2ludGVkIHRvCitieSB0aGUgZmllbGQgZXJyLT5qcGVnX21lc3NhZ2VfdGFibGUuICBUaGUgbWVzc2FnZXMgYXJlIG51bWJlcmVkIGZyb20gMCB0bworZXJyLT5sYXN0X2pwZWdfbWVzc2FnZSwgYW5kIGl0IGlzIHRoZXNlIGNvZGUgbnVtYmVycyB0aGF0IGFyZSB1c2VkIGluIHRoZQorSlBFRyBsaWJyYXJ5IGNvZGUuICBZb3UgY291bGQgcmVwbGFjZSB0aGUgbWVzc2FnZSB0ZXh0cyAoZm9yIGluc3RhbmNlLCB3aXRoCittZXNzYWdlcyBpbiBGcmVuY2ggb3IgR2VybWFuKSBieSBjaGFuZ2luZyB0aGUgbWVzc2FnZSB0YWJsZSBwb2ludGVyLiAgU2VlCitqZXJyb3IuaCBmb3IgdGhlIGRlZmF1bHQgdGV4dHMuICBDQVVUSU9OOiB0aGlzIHRhYmxlIHdpbGwgYWxtb3N0IGNlcnRhaW5seQorY2hhbmdlIG9yIGdyb3cgZnJvbSBvbmUgbGlicmFyeSB2ZXJzaW9uIHRvIHRoZSBuZXh0LgorCitJdCBtYXkgYmUgdXNlZnVsIGZvciBhbiBhcHBsaWNhdGlvbiB0byBhZGQgaXRzIG93biBtZXNzYWdlIHRleHRzIHRoYXQgYXJlCitoYW5kbGVkIGJ5IHRoZSBzYW1lIG1lY2hhbmlzbS4gIFRoZSBlcnJvciBoYW5kbGVyIHN1cHBvcnRzIGEgc2Vjb25kICJhZGQtb24iCittZXNzYWdlIHRhYmxlIGZvciB0aGlzIHB1cnBvc2UuICBUbyBkZWZpbmUgYW4gYWRkb24gdGFibGUsIHNldCB0aGUgcG9pbnRlcgorZXJyLT5hZGRvbl9tZXNzYWdlX3RhYmxlIGFuZCB0aGUgbWVzc2FnZSBudW1iZXJzIGVyci0+Zmlyc3RfYWRkb25fbWVzc2FnZSBhbmQKK2Vyci0+bGFzdF9hZGRvbl9tZXNzYWdlLiAgSWYgeW91IG51bWJlciB0aGUgYWRkb24gbWVzc2FnZXMgYmVnaW5uaW5nIGF0IDEwMDAKK29yIHNvLCB5b3Ugd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBjb25mbGljdHMgd2l0aCB0aGUgbGlicmFyeSdzIGJ1aWx0LWluCittZXNzYWdlcy4gIFNlZSB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucyBjanBlZy9kanBlZyBmb3IgYW4gZXhhbXBsZSBvZiB1c2luZworYWRkb24gbWVzc2FnZXMgKHRoZSBhZGRvbiBtZXNzYWdlcyBhcmUgZGVmaW5lZCBpbiBjZGVycm9yLmgpLgorCitBY3R1YWwgaW52b2NhdGlvbiBvZiB0aGUgZXJyb3IgaGFuZGxlciBpcyBkb25lIHZpYSBtYWNyb3MgZGVmaW5lZCBpbiBqZXJyb3IuaDoKKwlFUlJFWElUbiguLi4pCWZvciBmYXRhbCBlcnJvcnMKKwlXQVJOTVNuKC4uLikJZm9yIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncworCVRSQUNFTVNuKC4uLikJZm9yIHRyYWNlIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorVGhlc2UgbWFjcm9zIHN0b3JlIHRoZSBtZXNzYWdlIGNvZGUgYW5kIGFueSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgaW50byB0aGUKK2Vycm9yIGhhbmRsZXIgc3RydWN0LCB0aGVuIGludm9rZSB0aGUgZXJyb3JfZXhpdCgpIG9yIGVtaXRfbWVzc2FnZSgpIG1ldGhvZC4KK1RoZSB2YXJpYW50cyBvZiBlYWNoIG1hY3JvIGFyZSBmb3IgdmFyeWluZyBudW1iZXJzIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KK1RoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGluc2VydGVkIGludG8gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIHVzaW5nCitzdGFuZGFyZCBwcmludGYoKSBmb3JtYXQgY29kZXMuCisKK1NlZSBqZXJyb3IuaCBhbmQgamVycm9yLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworCitDb21wcmVzc2VkIGRhdGEgaGFuZGxpbmcgKHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBKUEVHIGNvbXByZXNzaW9uIGxpYnJhcnkgc2VuZHMgaXRzIGNvbXByZXNzZWQgZGF0YSB0byBhICJkZXN0aW5hdGlvbgorbWFuYWdlciIgbW9kdWxlLiAgVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gbWFuYWdlciBqdXN0IHdyaXRlcyB0aGUgZGF0YSB0byBhCitzdGRpbyBzdHJlYW0sIGJ1dCB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gbWFuYWdlciB0byBkbyBzb21ldGhpbmcgZWxzZS4KK1NpbWlsYXJseSwgdGhlIGRlY29tcHJlc3Npb24gbGlicmFyeSBjYWxscyBhICJzb3VyY2UgbWFuYWdlciIgdG8gb2J0YWluIHRoZQorY29tcHJlc3NlZCBkYXRhOyB5b3UgY2FuIHByb3ZpZGUgeW91ciBvd24gc291cmNlIG1hbmFnZXIgaWYgeW91IHdhbnQgdGhlIGRhdGEKK3RvIGNvbWUgZnJvbSBzb21ld2hlcmUgb3RoZXIgdGhhbiBhIHN0ZGlvIHN0cmVhbS4KKworSW4gYm90aCBjYXNlcywgY29tcHJlc3NlZCBkYXRhIGlzIHByb2Nlc3NlZCBhIGJ1ZmZlcmxvYWQgYXQgYSB0aW1lOiB0aGUKK2Rlc3RpbmF0aW9uIG9yIHNvdXJjZSBtYW5hZ2VyIHByb3ZpZGVzIGEgd29yayBidWZmZXIsIGFuZCB0aGUgbGlicmFyeSBpbnZva2VzCit0aGUgbWFuYWdlciBvbmx5IHdoZW4gdGhlIGJ1ZmZlciBpcyBmaWxsZWQgb3IgZW1wdGllZC4gIChZb3UgY291bGQgZGVmaW5lIGEKK29uZS1jaGFyYWN0ZXIgYnVmZmVyIHRvIGZvcmNlIHRoZSBtYW5hZ2VyIHRvIGJlIGludm9rZWQgZm9yIGVhY2ggYnl0ZSwgYnV0Cit0aGF0IHdvdWxkIGJlIHJhdGhlciBpbmVmZmljaWVudC4pICBUaGUgYnVmZmVyJ3Mgc2l6ZSBhbmQgbG9jYXRpb24gYXJlCitjb250cm9sbGVkIGJ5IHRoZSBtYW5hZ2VyLCBub3QgYnkgdGhlIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwgaWYgeW91IGRlc2lyZWQgdG8KK2RlY29tcHJlc3MgYSBKUEVHIGRhdGFzdHJlYW0gdGhhdCB3YXMgYWxsIGluIG1lbW9yeSwgeW91IGNvdWxkIGp1c3QgbWFrZSB0aGUKK2J1ZmZlciBwb2ludGVyIGFuZCBsZW5ndGggcG9pbnQgdG8gdGhlIG9yaWdpbmFsIGRhdGEgaW4gbWVtb3J5LiAgVGhlbiB0aGUKK2J1ZmZlci1yZWxvYWQgcHJvY2VkdXJlIHdvdWxkIGJlIGludm9rZWQgb25seSBpZiB0aGUgZGVjb21wcmVzc29yIHJhbiBvZmYgdGhlCitlbmQgb2YgdGhlIGRhdGFzdHJlYW0sIHdoaWNoIHdvdWxkIGluZGljYXRlIGFuIGVycm9uZW91cyBkYXRhc3RyZWFtLgorCitUaGUgd29yayBidWZmZXIgaXMgZGVmaW5lZCBhcyBhbiBhcnJheSBvZiBkYXRhdHlwZSBKT0NURVQsIHdoaWNoIGlzIGdlbmVyYWxseQorImNoYXIiIG9yICJ1bnNpZ25lZCBjaGFyIi4gIE9uIGEgbWFjaGluZSB3aGVyZSBjaGFyIGlzIG5vdCBleGFjdGx5IDggYml0cword2lkZSwgeW91IG11c3QgZGVmaW5lIEpPQ1RFVCBhcyBhIHdpZGVyIGRhdGEgdHlwZSBhbmQgdGhlbiBtb2RpZnkgdGhlIGRhdGEKK3NvdXJjZSBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyB0byB0cmFuc2NyaWJlIHRoZSB3b3JrIGFycmF5cyBpbnRvIDgtYml0IHVuaXRzCitvbiBleHRlcm5hbCBzdG9yYWdlLgorCitBIGRhdGEgZGVzdGluYXRpb24gbWFuYWdlciBzdHJ1Y3QgY29udGFpbnMgYSBwb2ludGVyIGFuZCBjb3VudCBkZWZpbmluZyB0aGUKK25leHQgYnl0ZSB0byB3cml0ZSBpbiB0aGUgd29yayBidWZmZXIgYW5kIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZToKKworCUpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7ICAvKiA9PiBuZXh0IGJ5dGUgdG8gd3JpdGUgaW4gYnVmZmVyICovCisJc2l6ZV90IGZyZWVfaW5fYnVmZmVyOyAgICAgIC8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCitUaGUgbGlicmFyeSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyIGFuZCBkZWNyZW1lbnRzIHRoZSBjb3VudCB1bnRpbCB0aGUgYnVmZmVyCitpcyBmaWxsZWQuICBUaGUgbWFuYWdlcidzIGVtcHR5X291dHB1dF9idWZmZXIgbWV0aG9kIG11c3QgcmVzZXQgdGhlIHBvaW50ZXIKK2FuZCBjb3VudC4gIFRoZSBtYW5hZ2VyIGlzIGV4cGVjdGVkIHRvIHJlbWVtYmVyIHRoZSBidWZmZXIncyBzdGFydGluZyBhZGRyZXNzCithbmQgdG90YWwgc2l6ZSBpbiBwcml2YXRlIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgbGlicmFyeS4KKworQSBkYXRhIGRlc3RpbmF0aW9uIG1hbmFnZXIgcHJvdmlkZXMgdGhyZWUgbWV0aG9kczoKKworaW5pdF9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCisJSW5pdGlhbGl6ZSBkZXN0aW5hdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfc3RhcnRfY29tcHJlc3MoKQorCWJlZm9yZSBhbnkgZGF0YSBpcyBhY3R1YWxseSB3cml0dGVuLiAgSXQgbXVzdCBpbml0aWFsaXplCisJbmV4dF9vdXRwdXRfYnl0ZSBhbmQgZnJlZV9pbl9idWZmZXIuICBmcmVlX2luX2J1ZmZlciBtdXN0IGJlCisJaW5pdGlhbGl6ZWQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KKworZW1wdHlfb3V0cHV0X2J1ZmZlciAoal9jb21wcmVzc19wdHIgY2luZm8pCisJVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGJ1ZmZlciBoYXMgZmlsbGVkIChmcmVlX2luX2J1ZmZlcgorCXJlYWNoZXMgemVybykuICBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgaXQgc2hvdWxkIHdyaXRlIG91dCB0aGUKKwkqZW50aXJlKiBidWZmZXIgKHVzZSB0aGUgc2F2ZWQgc3RhcnQgYWRkcmVzcyBhbmQgYnVmZmVyIGxlbmd0aDsKKwlpZ25vcmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9vdXRwdXRfYnl0ZSBhbmQgZnJlZV9pbl9idWZmZXIpLgorCVRoZW4gcmVzZXQgdGhlIHBvaW50ZXIgJiBjb3VudCB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciwgYW5kCisJcmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZHVtcGVkLgorCWZyZWVfaW5fYnVmZmVyIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUgd2hlbiBUUlVFIGlzCisJcmV0dXJuZWQuICBBIEZBTFNFIHJldHVybiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gSS9PIHN1c3BlbnNpb24gaXMKKwlkZXNpcmVkICh0aGlzIG9wZXJhdGluZyBtb2RlIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uKS4KKwordGVybV9kZXN0aW5hdGlvbiAoal9jb21wcmVzc19wdHIgY2luZm8pCisJVGVybWluYXRlIGRlc3RpbmF0aW9uIC0tLSBjYWxsZWQgYnkganBlZ19maW5pc2hfY29tcHJlc3MoKSBhZnRlciBhbGwKKwlkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uICBJbiBtb3N0IGFwcGxpY2F0aW9ucywgdGhpcyBtdXN0IGZsdXNoIGFueQorCWRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIuICBVc2UgZWl0aGVyIG5leHRfb3V0cHV0X2J5dGUgb3IKKwlmcmVlX2luX2J1ZmZlciB0byBkZXRlcm1pbmUgaG93IG11Y2ggZGF0YSBpcyBpbiB0aGUgYnVmZmVyLgorCit0ZXJtX2Rlc3RpbmF0aW9uKCkgaXMgTk9UIGNhbGxlZCBieSBqcGVnX2Fib3J0KCkgb3IganBlZ19kZXN0cm95KCkuICBJZiB5b3UKK3dhbnQgdGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgdG8gYmUgY2xlYW5lZCB1cCBkdXJpbmcgYW4gYWJvcnQsIHlvdSBtdXN0IGRvIGl0Cit5b3Vyc2VsZi4KKworWW91IHdpbGwgYWxzbyBuZWVkIGNvZGUgdG8gY3JlYXRlIGEganBlZ19kZXN0aW5hdGlvbl9tZ3Igc3RydWN0LCBmaWxsIGluIGl0cworbWV0aG9kIHBvaW50ZXJzLCBhbmQgaW5zZXJ0IGEgcG9pbnRlciB0byB0aGUgc3RydWN0IGludG8gdGhlICJkZXN0IiBmaWVsZCBvZgordGhlIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0LiAgVGhpcyBjYW4gYmUgZG9uZSBpbi1saW5lIGluIHlvdXIgc2V0dXAgY29kZSBpZgoreW91IGxpa2UsIGJ1dCBpdCdzIHByb2JhYmx5IGNsZWFuZXIgdG8gcHJvdmlkZSBhIHNlcGFyYXRlIHJvdXRpbmUgc2ltaWxhciB0bwordGhlIGpwZWdfc3RkaW9fZGVzdCgpIHJvdXRpbmUgb2YgdGhlIHN1cHBsaWVkIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisKK0RlY29tcHJlc3Npb24gc291cmNlIG1hbmFnZXJzIGZvbGxvdyBhIHBhcmFsbGVsIGRlc2lnbiwgYnV0IHdpdGggc29tZQorYWRkaXRpb25hbCBmcmFtbWlzaGVzLiAgVGhlIHNvdXJjZSBtYW5hZ2VyIHN0cnVjdCBjb250YWlucyBhIHBvaW50ZXIgYW5kIGNvdW50CitkZWZpbmluZyB0aGUgbmV4dCBieXRlIHRvIHJlYWQgZnJvbSB0aGUgd29yayBidWZmZXIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMKK3JlbWFpbmluZzoKKworCWNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBidWZmZXIgKi8KKwlzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOyAgICAgICAgIC8qICMgb2YgYnl0ZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLworCitUaGUgbGlicmFyeSBpbmNyZW1lbnRzIHRoZSBwb2ludGVyIGFuZCBkZWNyZW1lbnRzIHRoZSBjb3VudCB1bnRpbCB0aGUgYnVmZmVyCitpcyBlbXB0aWVkLiAgVGhlIG1hbmFnZXIncyBmaWxsX2lucHV0X2J1ZmZlciBtZXRob2QgbXVzdCByZXNldCB0aGUgcG9pbnRlciBhbmQKK2NvdW50LiAgSW4gbW9zdCBhcHBsaWNhdGlvbnMsIHRoZSBtYW5hZ2VyIG11c3QgcmVtZW1iZXIgdGhlIGJ1ZmZlcidzIHN0YXJ0aW5nCithZGRyZXNzIGFuZCB0b3RhbCBzaXplIGluIHByaXZhdGUgZmllbGRzIG5vdCB2aXNpYmxlIHRvIHRoZSBsaWJyYXJ5LgorCitBIGRhdGEgc291cmNlIG1hbmFnZXIgcHJvdmlkZXMgZml2ZSBtZXRob2RzOgorCitpbml0X3NvdXJjZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKKwlJbml0aWFsaXplIHNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIoKSBiZWZvcmUgYW55CisJZGF0YSBpcyBhY3R1YWxseSByZWFkLiAgVW5saWtlIGluaXRfZGVzdGluYXRpb24oKSwgaXQgbWF5IGxlYXZlCisJYnl0ZXNfaW5fYnVmZmVyIHNldCB0byAwIChpbiB3aGljaCBjYXNlIGEgZmlsbF9pbnB1dF9idWZmZXIoKSBjYWxsCisJd2lsbCBvY2N1ciBpbW1lZGlhdGVseSkuCisKK2ZpbGxfaW5wdXRfYnVmZmVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorCVRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGJ5dGVzX2luX2J1ZmZlciBoYXMgcmVhY2hlZCB6ZXJvIGFuZCBtb3JlCisJZGF0YSBpcyB3YW50ZWQuICBJbiB0eXBpY2FsIGFwcGxpY2F0aW9ucywgaXQgc2hvdWxkIHJlYWQgZnJlc2ggZGF0YQorCWludG8gdGhlIGJ1ZmZlciAoaWdub3JpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgbmV4dF9pbnB1dF9ieXRlIGFuZAorCWJ5dGVzX2luX2J1ZmZlciksIHJlc2V0IHRoZSBwb2ludGVyICYgY291bnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCWJ1ZmZlciwgYW5kIHJldHVybiBUUlVFIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIHJlbG9hZGVkLgorCUl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZmlsbCB0aGUgYnVmZmVyIGVudGlyZWx5LCBvbmx5IHRvIG9idGFpbiBhdAorCWxlYXN0IG9uZSBtb3JlIGJ5dGUuICBieXRlc19pbl9idWZmZXIgTVVTVCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZQorCWlmIFRSVUUgaXMgcmV0dXJuZWQuICBBIEZBTFNFIHJldHVybiBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gSS9PCisJc3VzcGVuc2lvbiBpcyBkZXNpcmVkICh0aGlzIG1vZGUgaXMgZGlzY3Vzc2VkIGluIHRoZSBuZXh0IHNlY3Rpb24pLgorCitza2lwX2lucHV0X2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKQorCVNraXAgbnVtX2J5dGVzIHdvcnRoIG9mIGRhdGEuICBUaGUgYnVmZmVyIHBvaW50ZXIgYW5kIGNvdW50IHNob3VsZAorCWJlIGFkdmFuY2VkIG92ZXIgbnVtX2J5dGVzIGlucHV0IGJ5dGVzLCByZWZpbGxpbmcgdGhlIGJ1ZmZlciBhcworCW5lZWRlZC4gIFRoaXMgaXMgdXNlZCB0byBza2lwIG92ZXIgYSBwb3RlbnRpYWxseSBsYXJnZSBhbW91bnQgb2YKKwl1bmludGVyZXN0aW5nIGRhdGEgKHN1Y2ggYXMgYW4gQVBQbiBtYXJrZXIpLiAgSW4gc29tZSBhcHBsaWNhdGlvbnMKKwlpdCBtYXkgYmUgcG9zc2libGUgdG8gb3B0aW1pemUgYXdheSB0aGUgcmVhZGluZyBvZiB0aGUgc2tpcHBlZCBkYXRhLAorCWJ1dCBpdCdzIG5vdCBjbGVhciB0aGF0IGJlaW5nIHNtYXJ0IGlzIHdvcnRoIG11Y2ggdHJvdWJsZTsgbGFyZ2UKKwlza2lwcyBhcmUgdW5jb21tb24uICBieXRlc19pbl9idWZmZXIgbWF5IGJlIHplcm8gb24gcmV0dXJuLgorCUEgemVybyBvciBuZWdhdGl2ZSBza2lwIGNvdW50IHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCisKK3Jlc3luY190b19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkKKwlUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgZGVjb21wcmVzc29yIGhhcyBmYWlsZWQgdG8gZmluZAorCWEgcmVzdGFydCAoUlNUbikgbWFya2VyIHdoZXJlIG9uZSBpcyBleHBlY3RlZC4gIEl0cyBtaXNzaW9uIGlzIHRvCisJZmluZCBhIHN1aXRhYmxlIHBvaW50IGZvciByZXN1bWluZyBkZWNvbXByZXNzaW9uLiAgRm9yIG1vc3QKKwlhcHBsaWNhdGlvbnMsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBqdXN0IHVzZSB0aGUgZGVmYXVsdCByZXN5bmMKKwlwcm9jZWR1cmUsIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQoKS4gIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYWJsZSB0byBiYWNrCisJdXAgaW4gdGhlIGlucHV0IGRhdGEgc3RyZWFtLCBvciBpZiB5b3UgaGF2ZSBhLXByaW9yaSBrbm93bGVkZ2UgYWJvdXQKKwl0aGUgbGlrZWx5IGxvY2F0aW9uIG9mIHJlc3RhcnQgbWFya2VycywgeW91IG1heSBiZSBhYmxlIHRvIGRvIGJldHRlci4KKwlSZWFkIHRoZSByZWFkX3Jlc3RhcnRfbWFya2VyKCkgYW5kIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQoKSByb3V0aW5lcworCWluIGpkbWFya2VyLmMgaWYgeW91IHRoaW5rIHlvdSdkIGxpa2UgdG8gaW1wbGVtZW50IHlvdXIgb3duIHJlc3luYworCXByb2NlZHVyZS4KKwordGVybV9zb3VyY2UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCisJVGVybWluYXRlIHNvdXJjZSAtLS0gY2FsbGVkIGJ5IGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBhZnRlciBhbGwKKwlkYXRhIGhhcyBiZWVuIHJlYWQuICBPZnRlbiBhIG5vLW9wLgorCitGb3IgYm90aCBmaWxsX2lucHV0X2J1ZmZlcigpIGFuZCBza2lwX2lucHV0X2RhdGEoKSwgdGhlcmUgaXMgbm8gc3VjaCB0aGluZworYXMgYW4gRU9GIHJldHVybi4gIElmIHRoZSBlbmQgb2YgdGhlIGZpbGUgaGFzIGJlZW4gcmVhY2hlZCwgdGhlIHJvdXRpbmUgaGFzCithIGNob2ljZSBvZiBleGl0aW5nIHZpYSBFUlJFWElUKCkgb3IgaW5zZXJ0aW5nIGZha2UgZGF0YSBpbnRvIHRoZSBidWZmZXIuCitJbiBtb3N0IGNhc2VzLCBnZW5lcmF0aW5nIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpbnNlcnRpbmcgYSBmYWtlIEVPSSBtYXJrZXIKK2lzIHRoZSBiZXN0IGNvdXJzZSBvZiBhY3Rpb24gLS0tIHRoaXMgd2lsbCBhbGxvdyB0aGUgZGVjb21wcmVzc29yIHRvIG91dHB1dAoraG93ZXZlciBtdWNoIG9mIHRoZSBpbWFnZSBpcyB0aGVyZS4gIEluIHBhdGhvbG9naWNhbCBjYXNlcywgdGhlIGRlY29tcHJlc3NvcgorbWF5IHN3YWxsb3cgdGhlIEVPSSBhbmQgYWdhaW4gZGVtYW5kIGRhdGEgLi4uIGp1c3Qga2VlcCBmZWVkaW5nIGl0IGZha2UgRU9Jcy4KK2pkYXRhc3JjLmMgaWxsdXN0cmF0ZXMgdGhlIHJlY29tbWVuZGVkIGVycm9yIHJlY292ZXJ5IGJlaGF2aW9yLgorCit0ZXJtX3NvdXJjZSgpIGlzIE5PVCBjYWxsZWQgYnkganBlZ19hYm9ydCgpIG9yIGpwZWdfZGVzdHJveSgpLiAgSWYgeW91IHdhbnQKK3RoZSBzb3VyY2UgbWFuYWdlciB0byBiZSBjbGVhbmVkIHVwIGR1cmluZyBhbiBhYm9ydCwgeW91IG11c3QgZG8gaXQgeW91cnNlbGYuCisKK1lvdSB3aWxsIGFsc28gbmVlZCBjb2RlIHRvIGNyZWF0ZSBhIGpwZWdfc291cmNlX21nciBzdHJ1Y3QsIGZpbGwgaW4gaXRzIG1ldGhvZAorcG9pbnRlcnMsIGFuZCBpbnNlcnQgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgaW50byB0aGUgInNyYyIgZmllbGQgb2YgdGhlIEpQRUcKK2RlY29tcHJlc3Npb24gb2JqZWN0LiAgVGhpcyBjYW4gYmUgZG9uZSBpbi1saW5lIGluIHlvdXIgc2V0dXAgY29kZSBpZiB5b3UKK2xpa2UsIGJ1dCBpdCdzIHByb2JhYmx5IGNsZWFuZXIgdG8gcHJvdmlkZSBhIHNlcGFyYXRlIHJvdXRpbmUgc2ltaWxhciB0byB0aGUKK2pwZWdfc3RkaW9fc3JjKCkgcm91dGluZSBvZiB0aGUgc3VwcGxpZWQgc291cmNlIG1hbmFnZXIuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBjb25zdWx0IHRoZSBzdGRpbyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG1hbmFnZXJzCitpbiBqZGF0YXNyYy5jIGFuZCBqZGF0YWRzdC5jLgorCisKK0kvTyBzdXNwZW5zaW9uCistLS0tLS0tLS0tLS0tLQorCitTb21lIGFwcGxpY2F0aW9ucyBuZWVkIHRvIHVzZSB0aGUgSlBFRyBsaWJyYXJ5IGFzIGFuIGluY3JlbWVudGFsIG1lbW9yeS10by0KK21lbW9yeSBmaWx0ZXI6IHdoZW4gdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIgaXMgZmlsbGVkIG9yIGVtcHRpZWQsIHRoZXkgd2FudAorY29udHJvbCB0byByZXR1cm4gdG8gdGhlIG91dGVyIGxvb3AsIHJhdGhlciB0aGFuIGV4cGVjdGluZyB0aGF0IHRoZSBidWZmZXIgY2FuCitiZSBlbXB0aWVkIG9yIHJlbG9hZGVkIHdpdGhpbiB0aGUgZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlciBzdWJyb3V0aW5lLgorVGhlIGxpYnJhcnkgc3VwcG9ydHMgdGhpcyBuZWVkIGJ5IHByb3ZpZGluZyBhbiAiSS9PIHN1c3BlbnNpb24iIG1vZGUsIHdoaWNoIHdlCitkZXNjcmliZSBpbiB0aGlzIHNlY3Rpb24uCisKK1RoZSBJL08gc3VzcGVuc2lvbiBtb2RlIGlzIG5vdCBhIHBhbmFjZWE6IG5vdGhpbmcgaXMgZ3VhcmFudGVlZCBhYm91dCB0aGUKK21heGltdW0gYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gYW55IG9uZSBjYWxsIHRvIHRoZSBsaWJyYXJ5LCBzbyBpdCB3aWxsIG5vdAorZWxpbWluYXRlIHJlc3BvbnNlLXRpbWUgcHJvYmxlbXMgaW4gc2luZ2xlLXRocmVhZGVkIGFwcGxpY2F0aW9ucy4gIElmIHlvdQorbmVlZCBndWFyYW50ZWVkIHJlc3BvbnNlIHRpbWUsIHdlIHN1Z2dlc3QgeW91ICJiaXRlIHRoZSBidWxsZXQiIGFuZCBpbXBsZW1lbnQKK2EgcmVhbCBtdWx0aS10YXNraW5nIGNhcGFiaWxpdHkuCisKK1RvIHVzZSBJL08gc3VzcGVuc2lvbiwgY29vcGVyYXRpb24gaXMgbmVlZGVkIGJldHdlZW4gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24KK2FuZCB0aGUgZGF0YSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gbWFuYWdlcjsgeW91IHdpbGwgYWx3YXlzIG5lZWQgYSBjdXN0b20KK3NvdXJjZS9kZXN0aW5hdGlvbiBtYW5hZ2VyLiAgKFBsZWFzZSByZWFkIHRoZSBwcmV2aW91cyBzZWN0aW9uIGlmIHlvdSBoYXZlbid0CithbHJlYWR5LikgIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgdGhlIGVtcHR5X291dHB1dF9idWZmZXIoKSBvcgorZmlsbF9pbnB1dF9idWZmZXIoKSByb3V0aW5lIGlzIGEgbm8tb3AsIG1lcmVseSByZXR1cm5pbmcgRkFMU0UgdG8gaW5kaWNhdGUKK3RoYXQgaXQgaGFzIGRvbmUgbm90aGluZy4gIFVwb24gc2VlaW5nIHRoaXMsIHRoZSBKUEVHIGxpYnJhcnkgc3VzcGVuZHMKK29wZXJhdGlvbiBhbmQgcmV0dXJucyB0byBpdHMgY2FsbGVyLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIGlzCityZXNwb25zaWJsZSBmb3IgZW1wdHlpbmcgb3IgcmVmaWxsaW5nIHRoZSB3b3JrIGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUKK0pQRUcgbGlicmFyeSBhZ2Fpbi4KKworQ29tcHJlc3Npb24gc3VzcGVuc2lvbjoKKworRm9yIGNvbXByZXNzaW9uIHN1c3BlbnNpb24sIHVzZSBhbiBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgcm91dGluZSB0aGF0IHJldHVybnMKK0ZBTFNFOyB0eXBpY2FsbHkgaXQgd2lsbCBub3QgZG8gYW55dGhpbmcgZWxzZS4gIFRoaXMgd2lsbCBjYXVzZSB0aGUKK2NvbXByZXNzb3IgdG8gcmV0dXJuIHRvIHRoZSBjYWxsZXIgb2YganBlZ193cml0ZV9zY2FubGluZXMoKSwgd2l0aCB0aGUgcmV0dXJuCit2YWx1ZSBpbmRpY2F0aW5nIHRoYXQgbm90IGFsbCB0aGUgc3VwcGxpZWQgc2NhbmxpbmVzIGhhdmUgYmVlbiBhY2NlcHRlZC4KK1RoZSBhcHBsaWNhdGlvbiBtdXN0IG1ha2UgbW9yZSByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBhZGp1c3QgdGhlIG91dHB1dAorYnVmZmVyIHBvaW50ZXIvY291bnQgYXBwcm9wcmlhdGVseSwgYW5kIHRoZW4gY2FsbCBqcGVnX3dyaXRlX3NjYW5saW5lcygpCithZ2FpbiwgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IHVuY29uc3VtZWQgc2NhbmxpbmUuCisKK1doZW4gZm9yY2VkIHRvIHN1c3BlbmQsIHRoZSBjb21wcmVzc29yIHdpbGwgYmFja3RyYWNrIHRvIGEgY29udmVuaWVudCBzdG9wcGluZworcG9pbnQgKHVzdWFsbHkgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVSk7IGl0IHdpbGwgcmVnZW5lcmF0ZSBzb21lIG91dHB1dAorZGF0YSB3aGVuIHJlc3RhcnRlZC4gIFRoZXJlZm9yZSwgYWx0aG91Z2ggZW1wdHlfb3V0cHV0X2J1ZmZlcigpIGlzIG9ubHkKK2NhbGxlZCB3aGVuIHRoZSBidWZmZXIgaXMgZmlsbGVkLCB5b3Ugc2hvdWxkIE5PVCB3cml0ZSBvdXQgdGhlIGVudGlyZSBidWZmZXIKK2FmdGVyIGEgc3VzcGVuc2lvbi4gIFdyaXRlIG9ubHkgdGhlIGRhdGEgdXAgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YKK25leHRfb3V0cHV0X2J5dGUvZnJlZV9pbl9idWZmZXIuICBUaGUgZGF0YSBiZXlvbmQgdGhhdCBwb2ludCB3aWxsIGJlCityZWdlbmVyYXRlZCBhZnRlciByZXN1bXB0aW9uLgorCitCZWNhdXNlIG9mIHRoZSBiYWNrdHJhY2tpbmcgYmVoYXZpb3IsIGEgZ29vZC1zaXplIG91dHB1dCBidWZmZXIgaXMgZXNzZW50aWFsCitmb3IgZWZmaWNpZW5jeTsgeW91IGRvbid0IHdhbnQgdGhlIGNvbXByZXNzb3IgdG8gc3VzcGVuZCBvZnRlbi4gIChJbiBmYWN0LCBhbgorb3Zlcmx5IHNtYWxsIGJ1ZmZlciBjb3VsZCBsZWFkIHRvIGluZmluaXRlIGxvb3BpbmcsIGlmIGEgc2luZ2xlIE1DVSByZXF1aXJlZAorbW9yZSBkYXRhIHRoYW4gd291bGQgZml0IGluIHRoZSBidWZmZXIuKSAgV2UgcmVjb21tZW5kIGEgYnVmZmVyIG9mIGF0IGxlYXN0CitzZXZlcmFsIEtieXRlcy4gIFlvdSBtYXkgd2FudCB0byBpbnNlcnQgZXhwbGljaXQgY29kZSB0byBlbnN1cmUgdGhhdCB5b3UgZG9uJ3QKK2NhbGwganBlZ193cml0ZV9zY2FubGluZXMoKSB1bmxlc3MgdGhlcmUgaXMgYSByZWFzb25hYmxlIGFtb3VudCBvZiBzcGFjZSBpbgordGhlIG91dHB1dCBidWZmZXI7IGluIG90aGVyIHdvcmRzLCBmbHVzaCB0aGUgYnVmZmVyIGJlZm9yZSB0cnlpbmcgdG8gY29tcHJlc3MKK21vcmUgZGF0YS4KKworVGhlIGNvbXByZXNzb3IgZG9lcyBub3QgYWxsb3cgc3VzcGVuc2lvbiB3aGlsZSBpdCBpcyB0cnlpbmcgdG8gd3JpdGUgSlBFRworbWFya2VycyBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGZpbGUuICBUaGlzIG1lYW5zIHRoYXQ6CisgICogQXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbXByZXNzaW9uIG9wZXJhdGlvbiwgdGhlcmUgbXVzdCBiZSBlbm91Z2ggZnJlZQorICAgIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGhvbGQgdGhlIGhlYWRlciBtYXJrZXJzICh0eXBpY2FsbHkgNjAwIG9yCisgICAgc28gYnl0ZXMpLiAgVGhlIHJlY29tbWVuZGVkIGJ1ZmZlciBzaXplIGlzIGJpZ2dlciB0aGFuIHRoaXMgYW55d2F5LCBzbworICAgIHRoaXMgaXMgbm90IGEgcHJvYmxlbSBhcyBsb25nIGFzIHlvdSBzdGFydCB3aXRoIGFuIGVtcHR5IGJ1ZmZlci4gIEhvd2V2ZXIsCisgICAgdGhpcyByZXN0cmljdGlvbiBtaWdodCBjYXRjaCB5b3UgaWYgeW91IGluc2VydCBsYXJnZSBzcGVjaWFsIG1hcmtlcnMsIHN1Y2gKKyAgICBhcyBhIEpGSUYgdGh1bWJuYWlsIGltYWdlLCB3aXRob3V0IGZsdXNoaW5nIHRoZSBidWZmZXIgYWZ0ZXJ3YXJkcy4KKyAgKiBXaGVuIHlvdSBjYWxsIGpwZWdfZmluaXNoX2NvbXByZXNzKCksIHRoZXJlIG11c3QgYmUgZW5vdWdoIHNwYWNlIGluIHRoZQorICAgIG91dHB1dCBidWZmZXIgdG8gZW1pdCBhbnkgYnVmZmVyZWQgZGF0YSBhbmQgdGhlIGZpbmFsIEVPSSBtYXJrZXIuICBJbiB0aGUKKyAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uLCBoYWxmIGEgZG96ZW4gYnl0ZXMgc2hvdWxkIHN1ZmZpY2UgZm9yIHRoaXMsIGJ1dAorICAgIGZvciBzYWZldHkncyBzYWtlIHdlIHJlY29tbWVuZCBlbnN1cmluZyB0aGF0IGF0IGxlYXN0IDEwMCBieXRlcyBhcmUgZnJlZQorICAgIGJlZm9yZSBjYWxsaW5nIGpwZWdfZmluaXNoX2NvbXByZXNzKCkuCisKK0EgbW9yZSBzaWduaWZpY2FudCByZXN0cmljdGlvbiBpcyB0aGF0IGpwZWdfZmluaXNoX2NvbXByZXNzKCkgY2Fubm90IHN1c3BlbmQuCitUaGlzIG1lYW5zIHlvdSBjYW5ub3QgdXNlIHN1c3BlbnNpb24gd2l0aCBtdWx0aS1wYXNzIG9wZXJhdGluZyBtb2RlcywgbmFtZWx5CitIdWZmbWFuIGNvZGUgb3B0aW1pemF0aW9uIGFuZCBtdWx0aXBsZS1zY2FuIG91dHB1dC4gIFRob3NlIG1vZGVzIHdyaXRlIHRoZQord2hvbGUgZmlsZSBkdXJpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKSwgd2hpY2ggd2lsbCBjZXJ0YWlubHkgcmVzdWx0IGluCitidWZmZXIgb3ZlcnJ1bi4gIChOb3RlIHRoYXQgdGhpcyByZXN0cmljdGlvbiBhcHBsaWVzIG9ubHkgdG8gY29tcHJlc3Npb24sCitub3QgZGVjb21wcmVzc2lvbi4gIFRoZSBkZWNvbXByZXNzb3Igc3VwcG9ydHMgaW5wdXQgc3VzcGVuc2lvbiBpbiBhbGwgb2YgaXRzCitvcGVyYXRpbmcgbW9kZXMuKQorCitEZWNvbXByZXNzaW9uIHN1c3BlbnNpb246CisKK0ZvciBkZWNvbXByZXNzaW9uIHN1c3BlbnNpb24sIHVzZSBhIGZpbGxfaW5wdXRfYnVmZmVyKCkgcm91dGluZSB0aGF0IHNpbXBseQorcmV0dXJucyBGQUxTRSAoZXhjZXB0IHBlcmhhcHMgZHVyaW5nIGVycm9yIHJlY292ZXJ5LCBhcyBkaXNjdXNzZWQgYmVsb3cpLgorVGhpcyB3aWxsIGNhdXNlIHRoZSBkZWNvbXByZXNzb3IgdG8gcmV0dXJuIHRvIGl0cyBjYWxsZXIgd2l0aCBhbiBpbmRpY2F0aW9uCit0aGF0IHN1c3BlbnNpb24gaGFzIG9jY3VycmVkLiAgVGhpcyBjYW4gaGFwcGVuIGF0IGZvdXIgcGxhY2VzOgorICAqIGpwZWdfcmVhZF9oZWFkZXIoKTogd2lsbCByZXR1cm4gSlBFR19TVVNQRU5ERUQuCisgICoganBlZ19zdGFydF9kZWNvbXByZXNzKCk6IHdpbGwgcmV0dXJuIEZBTFNFLCByYXRoZXIgdGhhbiBpdHMgdXN1YWwgVFJVRS4KKyAgKiBqcGVnX3JlYWRfc2NhbmxpbmVzKCk6IHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIGFscmVhZHkKKwljb21wbGV0ZWQgKHBvc3NpYmx5IDApLgorICAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKTogd2lsbCByZXR1cm4gRkFMU0UsIHJhdGhlciB0aGFuIGl0cyB1c3VhbCBUUlVFLgorVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG11c3QgcmVjb2duaXplIHRoZXNlIGNhc2VzLCBsb2FkIG1vcmUgZGF0YSBpbnRvCit0aGUgaW5wdXQgYnVmZmVyLCBhbmQgcmVwZWF0IHRoZSBjYWxsLiAgSW4gdGhlIGNhc2Ugb2YganBlZ19yZWFkX3NjYW5saW5lcygpLAoraW5jcmVtZW50IHRoZSBwYXNzZWQgcG9pbnRlcnMgcGFzdCBhbnkgc2NhbmxpbmVzIHN1Y2Nlc3NmdWxseSByZWFkLgorCitKdXN0IGFzIHdpdGggY29tcHJlc3Npb24sIHRoZSBkZWNvbXByZXNzb3Igd2lsbCB0eXBpY2FsbHkgYmFja3RyYWNrIHRvIGEKK2NvbnZlbmllbnQgcmVzdGFydCBwb2ludCBiZWZvcmUgc3VzcGVuZGluZy4gIFdoZW4gZmlsbF9pbnB1dF9idWZmZXIoKSBpcworY2FsbGVkLCBuZXh0X2lucHV0X2J5dGUvYnl0ZXNfaW5fYnVmZmVyIHBvaW50IHRvIHRoZSBjdXJyZW50IHJlc3RhcnQgcG9pbnQsCit3aGljaCBpcyB3aGVyZSB0aGUgZGVjb21wcmVzc29yIHdpbGwgYmFja3RyYWNrIHRvIGlmIEZBTFNFIGlzIHJldHVybmVkLgorVGhlIGRhdGEgYmV5b25kIHRoYXQgcG9zaXRpb24gbXVzdCBOT1QgYmUgZGlzY2FyZGVkIGlmIHlvdSBzdXNwZW5kOyBpdCBuZWVkcwordG8gYmUgcmUtcmVhZCB1cG9uIHJlc3VtcHRpb24uICBJbiBtb3N0IGltcGxlbWVudGF0aW9ucywgeW91J2xsIG5lZWQgdG8gc2hpZnQKK3RoaXMgZGF0YSBkb3duIHRvIHRoZSBzdGFydCBvZiB5b3VyIHdvcmsgYnVmZmVyIGFuZCB0aGVuIGxvYWQgbW9yZSBkYXRhIGFmdGVyCitpdC4gIEFnYWluLCB0aGlzIGJlaGF2aW9yIG1lYW5zIHRoYXQgYSBzZXZlcmFsLUtieXRlIHdvcmsgYnVmZmVyIGlzIGVzc2VudGlhbAorZm9yIGRlY2VudCBwZXJmb3JtYW5jZTsgZnVydGhlcm1vcmUsIHlvdSBzaG91bGQgbG9hZCBhIHJlYXNvbmFibGUgYW1vdW50IG9mCituZXcgZGF0YSBiZWZvcmUgcmVzdW1pbmcgZGVjb21wcmVzc2lvbi4gIChJZiB5b3UgbG9hZGVkLCBzYXksIG9ubHkgb25lIG5ldworYnl0ZSBlYWNoIHRpbWUgYXJvdW5kLCB5b3UgY291bGQgd2FzdGUgYSBMT1Qgb2YgY3ljbGVzLikKKworVGhlIHNraXBfaW5wdXRfZGF0YSgpIHNvdXJjZSBtYW5hZ2VyIHJvdXRpbmUgcmVxdWlyZXMgc3BlY2lhbCBjYXJlIGluIGEKK3N1c3BlbnNpb24gc2NlbmFyaW8uICBUaGlzIHJvdXRpbmUgaXMgTk9UIGdyYW50ZWQgdGhlIGFiaWxpdHkgdG8gc3VzcGVuZCB0aGUKK2RlY29tcHJlc3NvcjsgaXQgY2FuIGRlY3JlbWVudCBieXRlc19pbl9idWZmZXIgdG8gemVybywgYnV0IG5vIG1vcmUuICBJZiB0aGUKK3JlcXVlc3RlZCBza2lwIGRpc3RhbmNlIGV4Y2VlZHMgdGhlIGFtb3VudCBvZiBkYXRhIGN1cnJlbnRseSBpbiB0aGUgaW5wdXQKK2J1ZmZlciwgdGhlbiBza2lwX2lucHV0X2RhdGEoKSBtdXN0IHNldCBieXRlc19pbl9idWZmZXIgdG8gemVybyBhbmQgcmVjb3JkIHRoZQorYWRkaXRpb25hbCBza2lwIGRpc3RhbmNlIHNvbWV3aGVyZSBlbHNlLiAgVGhlIGRlY29tcHJlc3NvciB3aWxsIGltbWVkaWF0ZWx5CitjYWxsIGZpbGxfaW5wdXRfYnVmZmVyKCksIHdoaWNoIHNob3VsZCByZXR1cm4gRkFMU0UsIHdoaWNoIHdpbGwgY2F1c2UgYQorc3VzcGVuc2lvbiByZXR1cm4uICBUaGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbXVzdCB0aGVuIGFycmFuZ2UgdG8gZGlzY2FyZAordGhlIHJlY29yZGVkIG51bWJlciBvZiBieXRlcyBiZWZvcmUgaXQgcmVzdW1lcyBsb2FkaW5nIHRoZSBpbnB1dCBidWZmZXIuCisoWWVzLCB0aGlzIGRlc2lnbiBpcyByYXRoZXIgYmFyb3F1ZSwgYnV0IGl0IGF2b2lkcyBjb21wbGV4aXR5IGluIHRoZSBmYXIgbW9yZQorY29tbW9uIGNhc2Ugd2hlcmUgYSBub24tc3VzcGVuZGluZyBzb3VyY2UgbWFuYWdlciBpcyB1c2VkLikKKworSWYgdGhlIGlucHV0IGRhdGEgaGFzIGJlZW4gZXhoYXVzdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZW1pdCBhIHdhcm5pbmcKK2FuZCBpbnNlcnQgZHVtbXkgRU9JIG1hcmtlcnMganVzdCBhcyBhIG5vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlIG1hbmFnZXIKK3dvdWxkIGRvLiAgVGhpcyBjYW4gYmUgaGFuZGxlZCBlaXRoZXIgaW4gdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIGxvZ2ljIG9yCit3aXRoaW4gZmlsbF9pbnB1dF9idWZmZXIoKTsgdGhlIGxhdHRlciBpcyBwcm9iYWJseSBtb3JlIGVmZmljaWVudC4gIElmCitmaWxsX2lucHV0X2J1ZmZlcigpIGtub3dzIHRoYXQgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSwgaXQgY2FuIHNldCB0aGUKK3BvaW50ZXIvY291bnQgdG8gcG9pbnQgdG8gYSBkdW1teSBFT0kgbWFya2VyIGFuZCB0aGVuIHJldHVybiBUUlVFIGp1c3QgYXMKK3Rob3VnaCBpdCBoYWQgcmVhZCBtb3JlIGRhdGEgaW4gYSBub24tc3VzcGVuZGluZyBzaXR1YXRpb24uCisKK1RoZSBkZWNvbXByZXNzb3IgZG9lcyBub3QgYXR0ZW1wdCB0byBzdXNwZW5kIHdpdGhpbiBzdGFuZGFyZCBKUEVHIG1hcmtlcnM7CitpbnN0ZWFkIGl0IHdpbGwgYmFja3RyYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbWFya2VyIGFuZCByZXByb2Nlc3MgdGhlIHdob2xlCittYXJrZXIgbmV4dCB0aW1lLiAgSGVuY2UgdGhlIGlucHV0IGJ1ZmZlciBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQorbG9uZ2VzdCBzdGFuZGFyZCBtYXJrZXIgaW4gdGhlIGZpbGUuICBTdGFuZGFyZCBKUEVHIG1hcmtlcnMgc2hvdWxkIG5vcm1hbGx5Citub3QgZXhjZWVkIGEgZmV3IGh1bmRyZWQgYnl0ZXMgZWFjaCAoREhUIHRhYmxlcyBhcmUgdHlwaWNhbGx5IHRoZSBsb25nZXN0KS4KK1dlIHJlY29tbWVuZCBhdCBsZWFzdCBhIDJLIGJ1ZmZlciBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2hpY2ggaXMgbXVjaAorbGFyZ2VyIHRoYW4gYW55IGNvcnJlY3QgbWFya2VyIGlzIGxpa2VseSB0byBiZS4gIEZvciByb2J1c3RuZXNzIGFnYWluc3QKK2RhbWFnZWQgbWFya2VyIGxlbmd0aCBjb3VudHMsIHlvdSBtYXkgd2lzaCB0byBpbnNlcnQgYSB0ZXN0IGluIHlvdXIKK2FwcGxpY2F0aW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZSBpbnB1dCBidWZmZXIgaXMgY29tcGxldGVseSBmdWxsIGFuZCB5ZXQKK3RoZSBkZWNvZGVyIGhhcyBzdXNwZW5kZWQgd2l0aG91dCBjb25zdW1pbmcgYW55IGRhdGEgLS0tIG90aGVyd2lzZSwgaWYgdGhpcworc2l0dWF0aW9uIGRpZCBvY2N1ciwgaXQgd291bGQgbGVhZCB0byBhbiBlbmRsZXNzIGxvb3AuICAoVGhlIGxpYnJhcnkgY2FuJ3QKK3Byb3ZpZGUgdGhpcyB0ZXN0IHNpbmNlIGl0IGhhcyBubyBpZGVhIHdoZXRoZXIgInRoZSBidWZmZXIgaXMgZnVsbCIsIG9yCitldmVuIHdoZXRoZXIgdGhlcmUgaXMgYSBmaXhlZC1zaXplIGlucHV0IGJ1ZmZlci4pCisKK1RoZSBpbnB1dCBidWZmZXIgd291bGQgbmVlZCB0byBiZSA2NEsgdG8gYWxsb3cgZm9yIGFyYml0cmFyeSBDT00gb3IgQVBQbgorbWFya2VycywgYnV0IHRoZXNlIGFyZSBoYW5kbGVkIHNwZWNpYWxseTogdGhleSBhcmUgZWl0aGVyIHNhdmVkIGludG8gYWxsb2NhdGVkCittZW1vcnksIG9yIHNraXBwZWQgb3ZlciBieSBjYWxsaW5nIHNraXBfaW5wdXRfZGF0YSgpLiAgSW4gdGhlIGZvcm1lciBjYXNlLAorc3VzcGVuc2lvbiBpcyBoYW5kbGVkIGNvcnJlY3RseSwgYW5kIGluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHByb2JsZW0gb2YKK2J1ZmZlciBvdmVycnVuIGlzIHBsYWNlZCBvbiBza2lwX2lucHV0X2RhdGEncyBzaG91bGRlcnMsIGFzIGV4cGxhaW5lZCBhYm92ZS4KK05vdGUgdGhhdCBpZiB5b3UgcHJvdmlkZSB5b3VyIG93biBtYXJrZXIgaGFuZGxpbmcgcm91dGluZSBmb3IgbGFyZ2UgbWFya2VycywKK3lvdSBzaG91bGQgY29uc2lkZXIgaG93IHRvIGRlYWwgd2l0aCBidWZmZXIgb3ZlcmZsb3cuCisKK011bHRpcGxlLWJ1ZmZlciBtYW5hZ2VtZW50OgorCitJbiBzb21lIGFwcGxpY2F0aW9ucyBpdCBpcyBkZXNpcmFibGUgdG8gc3RvcmUgdGhlIGNvbXByZXNzZWQgZGF0YSBpbiBhIGxpbmtlZAorbGlzdCBvZiBidWZmZXIgYXJlYXMsIHNvIGFzIHRvIGF2b2lkIGRhdGEgY29weWluZy4gIFRoaXMgY2FuIGJlIGhhbmRsZWQgYnkKK2hhdmluZyBlbXB0eV9vdXRwdXRfYnVmZmVyKCkgb3IgZmlsbF9pbnB1dF9idWZmZXIoKSBzZXQgdGhlIHBvaW50ZXIgYW5kIGNvdW50Cit0byByZWZlcmVuY2UgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlcjsgRkFMU0UgaXMgcmV0dXJuZWQgb25seSBpZiBubyBtb3JlCitidWZmZXJzIGFyZSBhdmFpbGFibGUuICBBbHRob3VnaCBzZWVtaW5nbHkgc3RyYWlnaHRmb3J3YXJkLCB0aGVyZSBpcyBhCitwaXRmYWxsIGluIHRoaXMgYXBwcm9hY2g6IHRoZSBiYWNrdHJhY2sgdGhhdCBvY2N1cnMgd2hlbiBGQUxTRSBpcyByZXR1cm5lZAorY291bGQgYmFjayB1cCBpbnRvIGFuIGVhcmxpZXIgYnVmZmVyLiAgRm9yIGV4YW1wbGUsIHdoZW4gZmlsbF9pbnB1dF9idWZmZXIoKQoraXMgY2FsbGVkLCB0aGUgY3VycmVudCBwb2ludGVyICYgY291bnQgaW5kaWNhdGUgdGhlIGJhY2t0cmFjayByZXN0YXJ0IHBvaW50LgorU2luY2UgZmlsbF9pbnB1dF9idWZmZXIoKSB3aWxsIHNldCB0aGUgcG9pbnRlciBhbmQgY291bnQgdG8gcmVmZXIgdG8gYSBuZXcKK2J1ZmZlciwgdGhlIHJlc3RhcnQgcG9zaXRpb24gbXVzdCBiZSBzYXZlZCBzb21ld2hlcmUgZWxzZS4gIFN1cHBvc2UgYSBzZWNvbmQKK2NhbGwgdG8gZmlsbF9pbnB1dF9idWZmZXIoKSBvY2N1cnMgaW4gdGhlIHNhbWUgbGlicmFyeSBjYWxsLCBhbmQgbm8KK2FkZGl0aW9uYWwgaW5wdXQgZGF0YSBpcyBhdmFpbGFibGUsIHNvIGZpbGxfaW5wdXRfYnVmZmVyIG11c3QgcmV0dXJuIEZBTFNFLgorSWYgdGhlIEpQRUcgbGlicmFyeSBoYXMgbm90IG1vdmVkIHRoZSBwb2ludGVyL2NvdW50IGZvcndhcmQgaW4gdGhlIGN1cnJlbnQKK2J1ZmZlciwgdGhlbiAqdGhlIGNvcnJlY3QgcmVzdGFydCBwb2ludCBpcyB0aGUgc2F2ZWQgcG9zaXRpb24gaW4gdGhlIHByaW9yCitidWZmZXIqLiAgUHJpb3IgYnVmZmVycyBtYXkgYmUgZGlzY2FyZGVkIG9ubHkgYWZ0ZXIgdGhlIGxpYnJhcnkgZXN0YWJsaXNoZXMKK2EgcmVzdGFydCBwb2ludCB3aXRoaW4gYSBsYXRlciBidWZmZXIuICBTaW1pbGFyIHJlbWFya3MgYXBwbHkgZm9yIG91dHB1dCBpbnRvCithIGNoYWluIG9mIGJ1ZmZlcnMuCisKK1RoZSBsaWJyYXJ5IHdpbGwgbmV2ZXIgYXR0ZW1wdCB0byBiYWNrdHJhY2sgb3ZlciBhIHNraXBfaW5wdXRfZGF0YSgpIGNhbGwsCitzbyBhbnkgc2tpcHBlZCBkYXRhIGNhbiBiZSBwZXJtYW5lbnRseSBkaXNjYXJkZWQuICBZb3Ugc3RpbGwgaGF2ZSB0byBkZWFsCit3aXRoIHRoZSBjYXNlIG9mIHNraXBwaW5nIG5vdC15ZXQtcmVjZWl2ZWQgZGF0YSwgaG93ZXZlci4KKworSXQncyBtdWNoIHNpbXBsZXIgdG8gdXNlIG9ubHkgYSBzaW5nbGUgYnVmZmVyOyB3aGVuIGZpbGxfaW5wdXRfYnVmZmVyKCkgaXMKK2NhbGxlZCwgbW92ZSBhbnkgdW5jb25zdW1lZCBkYXRhIChiZXlvbmQgdGhlIGN1cnJlbnQgcG9pbnRlci9jb3VudCkgZG93biB0bwordGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlciBhbmQgdGhlbiBsb2FkIG5ldyBkYXRhIGludG8gdGhlIHJlbWFpbmluZyBidWZmZXIKK3NwYWNlLiAgVGhpcyBhcHByb2FjaCByZXF1aXJlcyBhIGxpdHRsZSBtb3JlIGRhdGEgY29weWluZyBidXQgaXMgZmFyIGVhc2llcgordG8gZ2V0IHJpZ2h0LgorCisKK1Byb2dyZXNzaXZlIEpQRUcgc3VwcG9ydAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1Byb2dyZXNzaXZlIEpQRUcgcmVhcnJhbmdlcyB0aGUgc3RvcmVkIGRhdGEgaW50byBhIHNlcmllcyBvZiBzY2FucyBvZgoraW5jcmVhc2luZyBxdWFsaXR5LiAgSW4gc2l0dWF0aW9ucyB3aGVyZSBhIEpQRUcgZmlsZSBpcyB0cmFuc21pdHRlZCBhY3Jvc3MgYQorc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCBhIGRlY29kZXIgY2FuIGdlbmVyYXRlIGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeQorcXVpY2tseSBmcm9tIHRoZSBmaXJzdCBzY2FuLCB0aGVuIGdyYWR1YWxseSBpbXByb3ZlIHRoZSBkaXNwbGF5ZWQgcXVhbGl0eSBhcworbW9yZSBzY2FucyBhcmUgcmVjZWl2ZWQuICBUaGUgZmluYWwgaW1hZ2UgYWZ0ZXIgYWxsIHNjYW5zIGFyZSBjb21wbGV0ZSBpcworaWRlbnRpY2FsIHRvIHRoYXQgb2YgYSByZWd1bGFyIChzZXF1ZW50aWFsKSBKUEVHIGZpbGUgb2YgdGhlIHNhbWUgcXVhbGl0eQorc2V0dGluZy4gIFByb2dyZXNzaXZlIEpQRUcgZmlsZXMgYXJlIG9mdGVuIHNsaWdodGx5IHNtYWxsZXIgdGhhbiBlcXVpdmFsZW50CitzZXF1ZW50aWFsIEpQRUcgZmlsZXMsIGJ1dCB0aGUgcG9zc2liaWxpdHkgb2YgaW5jcmVtZW50YWwgZGlzcGxheSBpcyB0aGUgbWFpbgorcmVhc29uIGZvciB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgorCitUaGUgSUpHIGVuY29kZXIgbGlicmFyeSBnZW5lcmF0ZXMgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyB3aGVuIGdpdmVuIGEKK3N1aXRhYmxlICJzY2FuIHNjcmlwdCIgZGVmaW5pbmcgaG93IHRvIGRpdmlkZSB0aGUgZGF0YSBpbnRvIHNjYW5zLgorQ3JlYXRpb24gb2YgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcyBpcyBvdGhlcndpc2UgdHJhbnNwYXJlbnQgdG8gdGhlIGVuY29kZXIuCitQcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIGNhbiBhbHNvIGJlIHJlYWQgdHJhbnNwYXJlbnRseSBieSB0aGUgZGVjb2RlciBsaWJyYXJ5LgorSWYgdGhlIGRlY29kaW5nIGFwcGxpY2F0aW9uIHNpbXBseSB1c2VzIHRoZSBsaWJyYXJ5IGFzIGRlZmluZWQgYWJvdmUsIGl0Cit3aWxsIHJlY2VpdmUgYSBmaW5hbCBkZWNvZGVkIGltYWdlIHdpdGhvdXQgYW55IGluZGljYXRpb24gdGhhdCB0aGUgZmlsZSB3YXMKK3Byb2dyZXNzaXZlLiAgT2YgY291cnNlLCB0aGlzIGFwcHJvYWNoIGRvZXMgbm90IGFsbG93IGluY3JlbWVudGFsIGRpc3BsYXkuCitUbyBwZXJmb3JtIGluY3JlbWVudGFsIGRpc3BsYXksIGFuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHVzZSB0aGUgZGVjb2RlcgorbGlicmFyeSdzICJidWZmZXJlZC1pbWFnZSIgbW9kZSwgaW4gd2hpY2ggaXQgcmVjZWl2ZXMgYSBkZWNvZGVkIGltYWdlCittdWx0aXBsZSB0aW1lcy4KKworRWFjaCBkaXNwbGF5ZWQgc2NhbiByZXF1aXJlcyBhYm91dCBhcyBtdWNoIHdvcmsgdG8gZGVjb2RlIGFzIGEgZnVsbCBKUEVHCitpbWFnZSBvZiB0aGUgc2FtZSBzaXplLCBzbyB0aGUgZGVjb2RlciBtdXN0IGJlIGZhaXJseSBmYXN0IGluIHJlbGF0aW9uIHRvIHRoZQorZGF0YSB0cmFuc21pc3Npb24gcmF0ZSBpbiBvcmRlciB0byBtYWtlIGluY3JlbWVudGFsIGRpc3BsYXkgdXNlZnVsLiAgSG93ZXZlciwKK2l0IGlzIHBvc3NpYmxlIHRvIHNraXAgZGlzcGxheWluZyB0aGUgaW1hZ2UgYW5kIHNpbXBseSBhZGQgdGhlIGluY29taW5nIGJpdHMKK3RvIHRoZSBkZWNvZGVyJ3MgY29lZmZpY2llbnQgYnVmZmVyLiAgVGhpcyBpcyBmYXN0IGJlY2F1c2Ugb25seSBIdWZmbWFuCitkZWNvZGluZyBuZWVkIGJlIGRvbmUsIG5vdCBJRENULCB1cHNhbXBsaW5nLCBjb2xvcnNwYWNlIGNvbnZlcnNpb24sIGV0Yy4KK1RoZSBJSkcgZGVjb2RlciBsaWJyYXJ5IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc3dpdGNoIGR5bmFtaWNhbGx5IGJldHdlZW4KK2Rpc3BsYXlpbmcgdGhlIGltYWdlIGFuZCBzaW1wbHkgYWJzb3JiaW5nIHRoZSBpbmNvbWluZyBiaXRzLiAgQSBwcm9wZXJseQorY29kZWQgYXBwbGljYXRpb24gY2FuIGF1dG9tYXRpY2FsbHkgYWRhcHQgdGhlIG51bWJlciBvZiBkaXNwbGF5IHBhc3NlcyB0bworc3VpdCB0aGUgdGltZSBhdmFpbGFibGUgYXMgdGhlIGltYWdlIGlzIHJlY2VpdmVkLiAgQWxzbywgYSBmaW5hbAoraGlnaGVyLXF1YWxpdHkgZGlzcGxheSBjeWNsZSBjYW4gYmUgcGVyZm9ybWVkIGZyb20gdGhlIGJ1ZmZlcmVkIGRhdGEgYWZ0ZXIKK3RoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZC4KKworUHJvZ3Jlc3NpdmUgY29tcHJlc3Npb246CisKK1RvIGNyZWF0ZSBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAob3IgYSBtdWx0aXBsZS1zY2FuIHNlcXVlbnRpYWwgSlBFRyBmaWxlKSwKK3NldCB0aGUgc2Nhbl9pbmZvIGNpbmZvIGZpZWxkIHRvIHBvaW50IHRvIGFuIGFycmF5IG9mIHNjYW4gZGVzY3JpcHRvcnMsIGFuZAorcGVyZm9ybSBjb21wcmVzc2lvbiBhcyB1c3VhbC4gIEluc3RlYWQgb2YgY29uc3RydWN0aW5nIHlvdXIgb3duIHNjYW4gbGlzdCwKK3lvdSBjYW4gY2FsbCB0aGUganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24oKSBoZWxwZXIgcm91dGluZSB0byBjcmVhdGUgYQorcmVjb21tZW5kZWQgcHJvZ3Jlc3Npb24gc2VxdWVuY2U7IHRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGJ5IGFsbAorYXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCB0byBnZXQgaW52b2x2ZWQgaW4gdGhlIG5pdHR5LWdyaXR0eSBvZgorcHJvZ3Jlc3NpdmUgc2NhbiBzZXF1ZW5jZSBkZXNpZ24uICAoSWYgeW91IHdhbnQgdG8gcHJvdmlkZSB1c2VyIGNvbnRyb2wgb2YKK3NjYW4gc2VxdWVuY2VzLCB5b3UgbWF5IHdpc2ggdG8gYm9ycm93IHRoZSBzY2FuIHNjcmlwdCByZWFkaW5nIGNvZGUgZm91bmQKK2luIHJkc3dpdGNoLmMsIHNvIHRoYXQgeW91IGNhbiByZWFkIHNjYW4gc2NyaXB0IGZpbGVzIGp1c3QgbGlrZSBjanBlZydzLikKK1doZW4gc2Nhbl9pbmZvIGlzIG5vdCBOVUxMLCB0aGUgY29tcHJlc3Npb24gbGlicmFyeSB3aWxsIHN0b3JlIERDVCdkIGRhdGEKK2ludG8gYSBidWZmZXIgYXJyYXkgYXMganBlZ193cml0ZV9zY2FubGluZXMoKSBpcyBjYWxsZWQsIGFuZCB3aWxsIGVtaXQgYWxsCit0aGUgcmVxdWVzdGVkIHNjYW5zIGR1cmluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcygpLiAgVGhpcyBpbXBsaWVzIHRoYXQKK211bHRpcGxlLXNjYW4gb3V0cHV0IGNhbm5vdCBiZSBjcmVhdGVkIHdpdGggYSBzdXNwZW5kaW5nIGRhdGEgZGVzdGluYXRpb24KK21hbmFnZXIsIHNpbmNlIGpwZWdfZmluaXNoX2NvbXByZXNzKCkgZG9lcyBub3Qgc3VwcG9ydCBzdXNwZW5zaW9uLiAgV2UKK3Nob3VsZCBhbHNvIG5vdGUgdGhhdCB0aGUgY29tcHJlc3NvciBjdXJyZW50bHkgZm9yY2VzIEh1ZmZtYW4gb3B0aW1pemF0aW9uCittb2RlIHdoZW4gY3JlYXRpbmcgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUsIGJlY2F1c2UgdGhlIGRlZmF1bHQgSHVmZm1hbgordGFibGVzIGFyZSB1bnN1aXRhYmxlIGZvciBwcm9ncmVzc2l2ZSBmaWxlcy4KKworUHJvZ3Jlc3NpdmUgZGVjb21wcmVzc2lvbjoKKworV2hlbiBidWZmZXJlZC1pbWFnZSBtb2RlIGlzIG5vdCB1c2VkLCB0aGUgZGVjb2RlciBsaWJyYXJ5IHdpbGwgcmVhZCBhbGwgb2YKK2EgbXVsdGktc2NhbiBmaWxlIGR1cmluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSwgc28gdGhhdCBpdCBjYW4gcHJvdmlkZSBhCitmaW5hbCBkZWNvZGVkIGltYWdlLiAgKEhlcmUgIm11bHRpLXNjYW4iIG1lYW5zIGVpdGhlciBwcm9ncmVzc2l2ZSBvcgorbXVsdGktc2NhbiBzZXF1ZW50aWFsLikgIFRoaXMgbWFrZXMgbXVsdGktc2NhbiBmaWxlcyB0cmFuc3BhcmVudCB0byB0aGUKK2RlY29kaW5nIGFwcGxpY2F0aW9uLiAgSG93ZXZlciwgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgdXNlZCBzdXNwZW5kaW5nCitpbnB1dCB3aXRoIHZlcnNpb24gNSBvZiB0aGUgSUpHIGxpYnJhcnkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkIHRvIGNoZWNrCitmb3IgYSBzdXNwZW5zaW9uIHJldHVybiBmcm9tIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorCitUbyBwZXJmb3JtIGluY3JlbWVudGFsIGRpc3BsYXksIGFuIGFwcGxpY2F0aW9uIG11c3QgdXNlIHRoZSBsaWJyYXJ5J3MKK2J1ZmZlcmVkLWltYWdlIG1vZGUuICBUaGlzIGlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCisKK0J1ZmZlcmVkLWltYWdlIG1vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGxpYnJhcnkgc3RvcmVzIHRoZSBwYXJ0aWFsbHkgZGVjb2RlZCBpbWFnZSBpbiBhCitjb2VmZmljaWVudCBidWZmZXIsIGZyb20gd2hpY2ggaXQgY2FuIGJlIHJlYWQgb3V0IGFzIG1hbnkgdGltZXMgYXMgZGVzaXJlZC4KK1RoaXMgbW9kZSBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgaW5jcmVtZW50YWwgZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLAorYnV0IGl0IGNhbiBiZSB1c2VkIHdpdGggYW55IEpQRUcgZmlsZS4gIEVhY2ggc2NhbiBvZiBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZQorYWRkcyBtb3JlIGRhdGEgKG1vcmUgZGV0YWlsKSB0byB0aGUgYnVmZmVyZWQgaW1hZ2UuICBUaGUgYXBwbGljYXRpb24gY2FuCitkaXNwbGF5IGluIGxvY2tzdGVwIHdpdGggdGhlIHNvdXJjZSBmaWxlIChvbmUgZGlzcGxheSBwYXNzIHBlciBpbnB1dCBzY2FuKSwKK29yIGl0IGNhbiBhbGxvdyBpbnB1dCBwcm9jZXNzaW5nIHRvIG91dHJ1biBkaXNwbGF5IHByb2Nlc3NpbmcuICBCeSBtYWtpbmcKK2lucHV0IGFuZCBkaXNwbGF5IHByb2Nlc3NpbmcgcnVuIGluZGVwZW5kZW50bHksIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUKK2FwcGxpY2F0aW9uIHRvIGFkYXB0IHByb2dyZXNzaXZlIGRpc3BsYXkgdG8gYSB3aWRlIHJhbmdlIG9mIGRhdGEgdHJhbnNtaXNzaW9uCityYXRlcy4KKworVGhlIGJhc2ljIGNvbnRyb2wgZmxvdyBmb3IgYnVmZmVyZWQtaW1hZ2UgZGVjb2RpbmcgaXMKKworCWpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKQorCXNldCBkYXRhIHNvdXJjZQorCWpwZWdfcmVhZF9oZWFkZXIoKQorCXNldCBvdmVyYWxsIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycworCWNpbmZvLmJ1ZmZlcmVkX2ltYWdlID0gVFJVRTsJLyogc2VsZWN0IGJ1ZmZlcmVkLWltYWdlIG1vZGUgKi8KKwlqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKQorCWZvciAoZWFjaCBvdXRwdXQgcGFzcykgeworCSAgICBhZGp1c3Qgb3V0cHV0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycyBpZiByZXF1aXJlZAorCSAgICBqcGVnX3N0YXJ0X291dHB1dCgpCQkvKiBzdGFydCBhIG5ldyBvdXRwdXQgcGFzcyAqLworCSAgICBmb3IgKGFsbCBzY2FubGluZXMgaW4gaW1hZ2UpIHsKKwkgICAgICAgIGpwZWdfcmVhZF9zY2FubGluZXMoKQorCSAgICAgICAgZGlzcGxheSBzY2FubGluZXMKKwkgICAgfQorCSAgICBqcGVnX2ZpbmlzaF9vdXRwdXQoKQkvKiB0ZXJtaW5hdGUgb3V0cHV0IHBhc3MgKi8KKwl9CisJanBlZ19maW5pc2hfZGVjb21wcmVzcygpCisJanBlZ19kZXN0cm95X2RlY29tcHJlc3MoKQorCitUaGlzIGRpZmZlcnMgZnJvbSBvcmRpbmFyeSB1bmJ1ZmZlcmVkIGRlY29kaW5nIGluIHRoYXQgdGhlcmUgaXMgYW4gYWRkaXRpb25hbAorbGV2ZWwgb2YgbG9vcGluZy4gIFRoZSBhcHBsaWNhdGlvbiBjYW4gY2hvb3NlIGhvdyBtYW55IG91dHB1dCBwYXNzZXMgdG8gbWFrZQorYW5kIGhvdyB0byBkaXNwbGF5IGVhY2ggcGFzcy4KKworVGhlIHNpbXBsZXN0IGFwcHJvYWNoIHRvIGRpc3BsYXlpbmcgcHJvZ3Jlc3NpdmUgaW1hZ2VzIGlzIHRvIGRvIG9uZSBkaXNwbGF5CitwYXNzIGZvciBlYWNoIHNjYW4gYXBwZWFyaW5nIGluIHRoZSBpbnB1dCBmaWxlLiAgSW4gdGhpcyBjYXNlIHRoZSBvdXRlciBsb29wCitjb25kaXRpb24gaXMgdHlwaWNhbGx5CisJd2hpbGUgKCEganBlZ19pbnB1dF9jb21wbGV0ZSgmY2luZm8pKQorYW5kIHRoZSBzdGFydC1vdXRwdXQgY2FsbCBzaG91bGQgcmVhZAorCWpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOworVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8ganBlZ19zdGFydF9vdXRwdXQoKSBpbmRpY2F0ZXMgd2hpY2ggc2NhbiBvZiB0aGUgaW5wdXQKK2ZpbGUgaXMgdG8gYmUgZGlzcGxheWVkOyB0aGUgc2NhbnMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGF0IDEgZm9yIHRoaXMKK3B1cnBvc2UuICAoWW91IGNhbiB1c2UgYSBsb29wIGNvdW50ZXIgc3RhcnRpbmcgYXQgMSBpZiB5b3UgbGlrZSwgYnV0IHVzaW5nCit0aGUgbGlicmFyeSdzIGlucHV0IHNjYW4gY291bnRlciBpcyBlYXNpZXIuKSAgVGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSByZWFkcworZGF0YSBhcyBuZWNlc3NhcnkgdG8gY29tcGxldGUgZWFjaCByZXF1ZXN0ZWQgc2NhbiwgYW5kIGpwZWdfZmluaXNoX291dHB1dCgpCithZHZhbmNlcyB0byB0aGUgbmV4dCBzY2FuIG9yIGVuZC1vZi1pbWFnZSBtYXJrZXIgKGhlbmNlIGlucHV0X3NjYW5fbnVtYmVyCit3aWxsIGJlIGluY3JlbWVudGVkIGJ5IHRoZSB0aW1lIGNvbnRyb2wgYXJyaXZlcyBiYWNrIGF0IGpwZWdfc3RhcnRfb3V0cHV0KCkpLgorV2l0aCB0aGlzIHRlY2huaXF1ZSwgZGF0YSBpcyByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUgb25seSBhcyBuZWVkZWQsIGFuZAoraW5wdXQgYW5kIG91dHB1dCBwcm9jZXNzaW5nIHJ1biBpbiBsb2Nrc3RlcC4KKworQWZ0ZXIgcmVhZGluZyB0aGUgZmluYWwgc2NhbiBhbmQgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgdGhlCitidWZmZXJlZCBpbWFnZSByZW1haW5zIGF2YWlsYWJsZTsgaXQgY2FuIGJlIHJlYWQgYWRkaXRpb25hbCB0aW1lcyBieQorcmVwZWF0aW5nIHRoZSBqcGVnX3N0YXJ0X291dHB1dCgpL2pwZWdfcmVhZF9zY2FubGluZXMoKS9qcGVnX2ZpbmlzaF9vdXRwdXQoKQorc2VxdWVuY2UuICBGb3IgZXhhbXBsZSwgYSB1c2VmdWwgdGVjaG5pcXVlIGlzIHRvIHVzZSBmYXN0IG9uZS1wYXNzIGNvbG9yCitxdWFudGl6YXRpb24gZm9yIGRpc3BsYXkgcGFzc2VzIG1hZGUgd2hpbGUgdGhlIGltYWdlIGlzIGFycml2aW5nLCBmb2xsb3dlZCBieQorYSBmaW5hbCBkaXNwbGF5IHBhc3MgdXNpbmcgdHdvLXBhc3MgcXVhbnRpemF0aW9uIGZvciBoaWdoZXN0IHF1YWxpdHkuICBUaGlzCitpcyBkb25lIGJ5IGNoYW5naW5nIHRoZSBsaWJyYXJ5IHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBmaW5hbCBvdXRwdXQgcGFzcy4KK0NoYW5naW5nIHBhcmFtZXRlcnMgYmV0d2VlbiBwYXNzZXMgaXMgZGlzY3Vzc2VkIGluIGRldGFpbCBiZWxvdy4KKworSW4gZ2VuZXJhbCB0aGUgbGFzdCBzY2FuIG9mIGEgcHJvZ3Jlc3NpdmUgZmlsZSBjYW5ub3QgYmUgcmVjb2duaXplZCBhcyBzdWNoCit1bnRpbCBhZnRlciBpdCBpcyByZWFkLCBzbyBhIHBvc3QtaW5wdXQgZGlzcGxheSBwYXNzIGlzIHRoZSBiZXN0IGFwcHJvYWNoIGlmCit5b3Ugd2FudCBzcGVjaWFsIHByb2Nlc3NpbmcgaW4gdGhlIGZpbmFsIHBhc3MuCisKK1doZW4gZG9uZSB3aXRoIHRoZSBpbWFnZSwgYmUgc3VyZSB0byBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSB0byByZWxlYXNlCit0aGUgYnVmZmVyZWQgaW1hZ2UgKG9yIGp1c3QgdXNlIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCkpLgorCitJZiBpbnB1dCBkYXRhIGFycml2ZXMgZmFzdGVyIHRoYW4gaXQgY2FuIGJlIGRpc3BsYXllZCwgdGhlIGFwcGxpY2F0aW9uIGNhbgorY2F1c2UgdGhlIGxpYnJhcnkgdG8gZGVjb2RlIGlucHV0IGRhdGEgaW4gYWR2YW5jZSBvZiB3aGF0J3MgbmVlZGVkIHRvIHByb2R1Y2UKK291dHB1dC4gIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIHRoZSByb3V0aW5lIGpwZWdfY29uc3VtZV9pbnB1dCgpLgorVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwlKUEVHX1JFQUNIRURfU09TOiAgICByZWFjaGVkIGFuIFNPUyBtYXJrZXIgKHRoZSBzdGFydCBvZiBhIG5ldyBzY2FuKQorCUpQRUdfUkVBQ0hFRF9FT0k6ICAgIHJlYWNoZWQgdGhlIEVPSSBtYXJrZXIgKGVuZCBvZiBpbWFnZSkKKwlKUEVHX1JPV19DT01QTEVURUQ6ICBjb21wbGV0ZWQgcmVhZGluZyBvbmUgTUNVIHJvdyBvZiBjb21wcmVzc2VkIGRhdGEKKwlKUEVHX1NDQU5fQ09NUExFVEVEOiBjb21wbGV0ZWQgcmVhZGluZyBsYXN0IE1DVSByb3cgb2YgY3VycmVudCBzY2FuCisJSlBFR19TVVNQRU5ERUQ6ICAgICAgc3VzcGVuZGVkIGJlZm9yZSBjb21wbGV0aW5nIGFueSBvZiB0aGUgYWJvdmUKKyhKUEVHX1NVU1BFTkRFRCBjYW4gb2NjdXIgb25seSBpZiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4pICBUaGlzCityb3V0aW5lIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBKUEVHIG9iamVjdC4gIEl0CityZWFkcyBzb21lIGFkZGl0aW9uYWwgZGF0YSBhbmQgcmV0dXJucyB3aGVuIG9uZSBvZiB0aGUgaW5kaWNhdGVkIHNpZ25pZmljYW50CitldmVudHMgb2NjdXJzLiAgKElmIGNhbGxlZCBhZnRlciB0aGUgRU9JIG1hcmtlciBpcyByZWFjaGVkLCBpdCB3aWxsCitpbW1lZGlhdGVseSByZXR1cm4gSlBFR19SRUFDSEVEX0VPSSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmVhZCBtb3JlIGRhdGEuKQorCitUaGUgbGlicmFyeSdzIG91dHB1dCBwcm9jZXNzaW5nIHdpbGwgYXV0b21hdGljYWxseSBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpCit3aGVuZXZlciB0aGUgb3V0cHV0IHByb2Nlc3Npbmcgb3ZlcnRha2VzIHRoZSBpbnB1dDsgdGh1cywgc2ltcGxlIGxvY2tzdGVwCitkaXNwbGF5IHJlcXVpcmVzIG5vIGRpcmVjdCBjYWxscyB0byBqcGVnX2NvbnN1bWVfaW5wdXQoKS4gIEJ1dCBieSBhZGRpbmcKK2NhbGxzIHRvIGpwZWdfY29uc3VtZV9pbnB1dCgpLCB5b3UgY2FuIGFic29yYiBkYXRhIGluIGFkdmFuY2Ugb2Ygd2hhdCBpcworYmVpbmcgZGlzcGxheWVkLiAgVGhpcyBoYXMgdHdvIGJlbmVmaXRzOgorICAqIFlvdSBjYW4gbGltaXQgYnVpbGR1cCBvZiB1bnByb2Nlc3NlZCBkYXRhIGluIHlvdXIgaW5wdXQgYnVmZmVyLgorICAqIFlvdSBjYW4gZWxpbWluYXRlIGV4dHJhIGRpc3BsYXkgcGFzc2VzIGJ5IHBheWluZyBhdHRlbnRpb24gdG8gdGhlCisgICAgc3RhdGUgb2YgdGhlIGxpYnJhcnkncyBpbnB1dCBwcm9jZXNzaW5nLgorCitUaGUgZmlyc3Qgb2YgdGhlc2UgYmVuZWZpdHMgb25seSByZXF1aXJlcyBpbnRlcnNwZXJzaW5nIGNhbGxzIHRvCitqcGVnX2NvbnN1bWVfaW5wdXQoKSB3aXRoIHlvdXIgZGlzcGxheSBvcGVyYXRpb25zIGFuZCBhbnkgb3RoZXIgcHJvY2Vzc2luZworeW91IG1heSBiZSBkb2luZy4gIFRvIGF2b2lkIHdhc3RpbmcgY3ljbGVzIGR1ZSB0byBiYWNrdHJhY2tpbmcsIGl0J3MgYmVzdCB0bworY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBvbmx5IGFmdGVyIGEgaHVuZHJlZCBvciBzbyBuZXcgYnl0ZXMgaGF2ZSBhcnJpdmVkLgorVGhpcyBpcyBkaXNjdXNzZWQgZnVydGhlciB1bmRlciAiSS9PIHN1c3BlbnNpb24iLCBhYm92ZS4gIChOb3RlOiB0aGUgSlBFRworbGlicmFyeSBjdXJyZW50bHkgaXMgbm90IHRocmVhZC1zYWZlLiAgWW91IG11c3Qgbm90IGNhbGwganBlZ19jb25zdW1lX2lucHV0KCkKK2Zyb20gb25lIHRocmVhZCBvZiBjb250cm9sIGlmIGEgZGlmZmVyZW50IGxpYnJhcnkgcm91dGluZSBpcyB3b3JraW5nIG9uIHRoZQorc2FtZSBKUEVHIG9iamVjdCBpbiBhbm90aGVyIHRocmVhZC4pCisKK1doZW4gaW5wdXQgYXJyaXZlcyBmYXN0IGVub3VnaCB0aGF0IG1vcmUgdGhhbiBvbmUgbmV3IHNjYW4gaXMgYXZhaWxhYmxlCitiZWZvcmUgeW91IHN0YXJ0IGEgbmV3IG91dHB1dCBwYXNzLCB5b3UgbWF5IGFzIHdlbGwgc2tpcCB0aGUgb3V0cHV0IHBhc3MKK2NvcnJlc3BvbmRpbmcgdG8gdGhlIGNvbXBsZXRlZCBzY2FuLiAgVGhpcyBvY2N1cnMgZm9yIGZyZWUgaWYgeW91IHBhc3MKK2NpbmZvLmlucHV0X3NjYW5fbnVtYmVyIGFzIHRoZSB0YXJnZXQgc2NhbiBudW1iZXIgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KK1RoZSBpbnB1dF9zY2FuX251bWJlciBmaWVsZCBpcyBzaW1wbHkgdGhlIGluZGV4IG9mIHRoZSBzY2FuIGN1cnJlbnRseSBiZWluZworY29uc3VtZWQgYnkgdGhlIGlucHV0IHByb2Nlc3Nvci4gIFlvdSBjYW4gZW5zdXJlIHRoYXQgdGhpcyBpcyB1cC10by1kYXRlIGJ5CitlbXB0eWluZyB0aGUgaW5wdXQgYnVmZmVyIGp1c3QgYmVmb3JlIGNhbGxpbmcganBlZ19zdGFydF9vdXRwdXQoKTogY2FsbAoranBlZ19jb25zdW1lX2lucHV0KCkgcmVwZWF0ZWRseSB1bnRpbCBpdCByZXR1cm5zIEpQRUdfU1VTUEVOREVEIG9yCitKUEVHX1JFQUNIRURfRU9JLgorCitUaGUgdGFyZ2V0IHNjYW4gbnVtYmVyIHBhc3NlZCB0byBqcGVnX3N0YXJ0X291dHB1dCgpIGlzIHNhdmVkIGluIHRoZQorY2luZm8ub3V0cHV0X3NjYW5fbnVtYmVyIGZpZWxkLiAgVGhlIGxpYnJhcnkncyBvdXRwdXQgcHJvY2Vzc2luZyBjYWxscworanBlZ19jb25zdW1lX2lucHV0KCkgd2hlbmV2ZXIgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIgYW5kIHJvdyB3aXRoaW4KK3RoYXQgc2NhbiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgb3V0cHV0IHNjYW4gbnVtYmVyIGFuZCByb3cuCitUaHVzLCBpbnB1dCBwcm9jZXNzaW5nIGNhbiAiZ2V0IGFoZWFkIiBvZiB0aGUgb3V0cHV0IHByb2Nlc3NpbmcgYnV0IGlzIG5vdAorYWxsb3dlZCB0byAiZmFsbCBiZWhpbmQiLiAgWW91IGNhbiBhY2hpZXZlIHNldmVyYWwgZGlmZmVyZW50IGVmZmVjdHMgYnkKK21hbmlwdWxhdGluZyB0aGlzIGludGVybG9jayBydWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBwYXNzIGEgdGFyZ2V0IHNjYW4KK251bWJlciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBudW1iZXIsIHRoZSBvdXRwdXQgcHJvY2Vzc29yIHdpbGwKK3dhaXQgdW50aWwgdGhhdCBzY2FuIHN0YXJ0cyB0byBhcnJpdmUgYmVmb3JlIHByb2R1Y2luZyBhbnkgb3V0cHV0LiAgKFRvIGF2b2lkCithbiBpbmZpbml0ZSBsb29wLCB0aGUgdGFyZ2V0IHNjYW4gbnVtYmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVzZXQgdG8gdGhlIGxhc3QKK3NjYW4gbnVtYmVyIHdoZW4gdGhlIGVuZCBvZiBpbWFnZSBpcyByZWFjaGVkLiAgVGh1cywgaWYgeW91IHNwZWNpZnkgYSBsYXJnZQordGFyZ2V0IHNjYW4gbnVtYmVyLCB0aGUgbGlicmFyeSB3aWxsIGp1c3QgYWJzb3JiIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBhbmQKK3RoZW4gcGVyZm9ybSBhbiBvdXRwdXQgcGFzcy4gIFRoaXMgaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgd2hhdAoranBlZ19zdGFydF9kZWNvbXByZXNzKCkgZG9lcyB3aGVuIHlvdSBkb24ndCBzZWxlY3QgYnVmZmVyZWQtaW1hZ2UgbW9kZS4pCitXaGVuIHlvdSBwYXNzIGEgdGFyZ2V0IHNjYW4gbnVtYmVyIGVxdWFsIHRvIHRoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyLAordGhlIGltYWdlIGlzIGRpc3BsYXllZCBubyBmYXN0ZXIgdGhhbiB0aGUgY3VycmVudCBpbnB1dCBzY2FuIGFycml2ZXMuICBUaGUKK2ZpbmFsIHBvc3NpYmlsaXR5IGlzIHRvIHBhc3MgYSB0YXJnZXQgc2NhbiBudW1iZXIgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGlucHV0CitzY2FuIG51bWJlcjsgdGhpcyBkaXNhYmxlcyB0aGUgaW5wdXQvb3V0cHV0IGludGVybG9jayBhbmQgY2F1c2VzIHRoZSBvdXRwdXQKK3Byb2Nlc3NvciB0byBzaW1wbHkgZGlzcGxheSB3aGF0ZXZlciBpdCBmaW5kcyBpbiB0aGUgaW1hZ2UgYnVmZmVyLCB3aXRob3V0Cit3YWl0aW5nIGZvciBpbnB1dC4gIChIb3dldmVyLCB0aGUgbGlicmFyeSB3aWxsIG5vdCBhY2NlcHQgYSB0YXJnZXQgc2NhbgorbnVtYmVyIGxlc3MgdGhhbiBvbmUsIHNvIHlvdSBjYW4ndCBhdm9pZCB3YWl0aW5nIGZvciB0aGUgZmlyc3Qgc2Nhbi4pCisKK1doZW4gZGF0YSBpcyBhcnJpdmluZyBmYXN0ZXIgdGhhbiB0aGUgb3V0cHV0IGRpc3BsYXkgcHJvY2Vzc2luZyBjYW4gYWR2YW5jZQordGhyb3VnaCB0aGUgaW1hZ2UsIGpwZWdfY29uc3VtZV9pbnB1dCgpIHdpbGwgc3RvcmUgZGF0YSBpbnRvIHRoZSBidWZmZXJlZAoraW1hZ2UgYmV5b25kIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgb3V0cHV0IHByb2Nlc3NpbmcgaXMgcmVhZGluZyBkYXRhIG91dAorYWdhaW4uICBJZiB0aGUgaW5wdXQgYXJyaXZlcyBmYXN0IGVub3VnaCwgaXQgbWF5ICJ3cmFwIGFyb3VuZCIgdGhlIGJ1ZmZlciB0bwordGhlIHBvaW50IHdoZXJlIHRoZSBpbnB1dCBpcyBtb3JlIHRoYW4gb25lIHdob2xlIHNjYW4gYWhlYWQgb2YgdGhlIG91dHB1dC4KK0lmIHRoZSBvdXRwdXQgcHJvY2Vzc2luZyBzaW1wbHkgcHJvY2VlZHMgdGhyb3VnaCBpdHMgZGlzcGxheSBwYXNzIHdpdGhvdXQKK3BheWluZyBhdHRlbnRpb24gdG8gdGhlIGlucHV0LCB0aGUgZWZmZWN0IHNlZW4gb24tc2NyZWVuIGlzIHRoYXQgdGhlIGxvd2VyCitwYXJ0IG9mIHRoZSBpbWFnZSBpcyBvbmUgb3IgbW9yZSBzY2FucyBiZXR0ZXIgaW4gcXVhbGl0eSB0aGFuIHRoZSB1cHBlciBwYXJ0LgorVGhlbiwgd2hlbiB0aGUgbmV4dCBvdXRwdXQgc2NhbiBpcyBzdGFydGVkLCB5b3UgaGF2ZSBhIGNob2ljZSBvZiB3aGF0IHRhcmdldAorc2NhbiBudW1iZXIgdG8gdXNlLiAgVGhlIHJlY29tbWVuZGVkIGNob2ljZSBpcyB0byB1c2UgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbgorbnVtYmVyIGF0IHRoYXQgdGltZSwgd2hpY2ggaW1wbGllcyB0aGF0IHlvdSd2ZSBza2lwcGVkIHRoZSBvdXRwdXQgc2NhbnMKK2NvcnJlc3BvbmRpbmcgdG8gdGhlIGlucHV0IHNjYW5zIHRoYXQgd2VyZSBjb21wbGV0ZWQgd2hpbGUgeW91IHByb2Nlc3NlZCB0aGUKK3ByZXZpb3VzIG91dHB1dCBzY2FuLiAgSW4gdGhpcyB3YXksIHRoZSBkZWNvZGVyIGF1dG9tYXRpY2FsbHkgYWRhcHRzIGl0cworc3BlZWQgdG8gdGhlIGFycml2aW5nIGRhdGEsIGJ5IHNraXBwaW5nIG91dHB1dCBzY2FucyBhcyBuZWNlc3NhcnkgdG8ga2VlcCB1cAord2l0aCB0aGUgYXJyaXZpbmcgZGF0YS4KKworV2hlbiB1c2luZyB0aGlzIHN0cmF0ZWd5LCB5b3UnbGwgd2FudCB0byBiZSBzdXJlIHRoYXQgeW91IHBlcmZvcm0gYSBmaW5hbAorb3V0cHV0IHBhc3MgYWZ0ZXIgcmVjZWl2aW5nIGFsbCB0aGUgZGF0YTsgb3RoZXJ3aXNlIHlvdXIgbGFzdCBkaXNwbGF5IG1heSBub3QKK2JlIGZ1bGwgcXVhbGl0eSBhY3Jvc3MgdGhlIHdob2xlIHNjcmVlbi4gIFNvIHRoZSByaWdodCBvdXRlciBsb29wIGxvZ2ljIGlzCitzb21ldGhpbmcgbGlrZSB0aGlzOgorCWRvIHsKKwkgICAgYWJzb3JiIGFueSB3YWl0aW5nIGlucHV0IGJ5IGNhbGxpbmcganBlZ19jb25zdW1lX2lucHV0KCkKKwkgICAgZmluYWxfcGFzcyA9IGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKTsKKwkgICAgYWRqdXN0IG91dHB1dCBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQKKwkgICAganBlZ19zdGFydF9vdXRwdXQoJmNpbmZvLCBjaW5mby5pbnB1dF9zY2FuX251bWJlcik7CisJICAgIC4uLgorCSAgICBqcGVnX2ZpbmlzaF9vdXRwdXQoKQorCX0gd2hpbGUgKCEgZmluYWxfcGFzcyk7CityYXRoZXIgdGhhbiBxdWl0dGluZyBhcyBzb29uIGFzIGpwZWdfaW5wdXRfY29tcGxldGUoKSByZXR1cm5zIFRSVUUuICBUaGlzCithcnJhbmdlbWVudCBtYWtlcyBpdCBzaW1wbGUgdG8gdXNlIGhpZ2hlci1xdWFsaXR5IGRlY29kaW5nIHBhcmFtZXRlcnMKK2ZvciB0aGUgZmluYWwgcGFzcy4gIEJ1dCBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2Ugc3BlY2lhbCBwYXJhbWV0ZXJzIGZvcgordGhlIGZpbmFsIHBhc3MsIHRoZSByaWdodCBsb29wIGxvZ2ljIGlzIGxpa2UgdGhpczoKKwlmb3IgKDs7KSB7CisJICAgIGFic29yYiBhbnkgd2FpdGluZyBpbnB1dCBieSBjYWxsaW5nIGpwZWdfY29uc3VtZV9pbnB1dCgpCisJICAgIGpwZWdfc3RhcnRfb3V0cHV0KCZjaW5mbywgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIpOworCSAgICAuLi4KKwkgICAganBlZ19maW5pc2hfb3V0cHV0KCkKKwkgICAgaWYgKGpwZWdfaW5wdXRfY29tcGxldGUoJmNpbmZvKSAmJgorCSAgICAgICAgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8ub3V0cHV0X3NjYW5fbnVtYmVyKQorCSAgICAgIGJyZWFrOworCX0KK0luIHRoaXMgY2FzZSB5b3UgZG9uJ3QgbmVlZCB0byBrbm93IGluIGFkdmFuY2Ugd2hldGhlciBhbiBvdXRwdXQgcGFzcyBpcyB0bworYmUgdGhlIGxhc3Qgb25lLCBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gaGF2ZSByZWFjaGVkIEVPRiBiZWZvcmUgc3RhcnRpbmcKK3RoZSBmaW5hbCBvdXRwdXQgcGFzczsgcmF0aGVyLCB3aGF0IHlvdSB3YW50IHRvIHRlc3QgaXMgd2hldGhlciB0aGUgb3V0cHV0CitwYXNzIHdhcyBwZXJmb3JtZWQgaW4gc3luYyB3aXRoIHRoZSBmaW5hbCBpbnB1dCBzY2FuLiAgVGhpcyBmb3JtIG9mIHRoZSBsb29wCit3aWxsIGF2b2lkIGFuIGV4dHJhIG91dHB1dCBwYXNzIHdoZW5ldmVyIHRoZSBkZWNvZGVyIGlzIGFibGUgKG9yIG5lYXJseSBhYmxlKQordG8ga2VlcCB1cCB3aXRoIHRoZSBpbmNvbWluZyBkYXRhLgorCitXaGVuIHRoZSBkYXRhIHRyYW5zbWlzc2lvbiBzcGVlZCBpcyBoaWdoLCB5b3UgbWlnaHQgYmVnaW4gYSBkaXNwbGF5IHBhc3MsCit0aGVuIGZpbmQgdGhhdCBtdWNoIG9yIGFsbCBvZiB0aGUgZmlsZSBoYXMgYXJyaXZlZCBiZWZvcmUgeW91IGNhbiBjb21wbGV0ZQordGhlIHBhc3MuICAoWW91IGNhbiBkZXRlY3QgdGhpcyBieSBub3RpbmcgdGhlIEpQRUdfUkVBQ0hFRF9FT0kgcmV0dXJuIGNvZGUKK2Zyb20ganBlZ19jb25zdW1lX2lucHV0KCksIG9yIGVxdWl2YWxlbnRseSBieSB0ZXN0aW5nIGpwZWdfaW5wdXRfY29tcGxldGUoKS4pCitJbiB0aGlzIHNpdHVhdGlvbiB5b3UgbWF5IHdpc2ggdG8gYWJvcnQgdGhlIGN1cnJlbnQgZGlzcGxheSBwYXNzIGFuZCBzdGFydCBhCituZXcgb25lIHVzaW5nIHRoZSBuZXdseSBhcnJpdmVkIGluZm9ybWF0aW9uLiAgVG8gZG8gc28sIGp1c3QgY2FsbAoranBlZ19maW5pc2hfb3V0cHV0KCkgYW5kIHRoZW4gc3RhcnQgYSBuZXcgcGFzcyB3aXRoIGpwZWdfc3RhcnRfb3V0cHV0KCkuCisKK0EgdmFyaWFudCBzdHJhdGVneSBpcyB0byBhYm9ydCBhbmQgcmVzdGFydCBkaXNwbGF5IGlmIG1vcmUgdGhhbiBvbmUgY29tcGxldGUKK3NjYW4gYXJyaXZlcyBkdXJpbmcgYW4gb3V0cHV0IHBhc3M7IHRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IG5vdGluZworSlBFR19SRUFDSEVEX1NPUyByZXR1cm5zIGFuZC9vciBleGFtaW5pbmcgY2luZm8uaW5wdXRfc2Nhbl9udW1iZXIuICBUaGlzCitpZGVhIHNob3VsZCBiZSBlbXBsb3llZCB3aXRoIGNhdXRpb24sIGhvd2V2ZXIsIHNpbmNlIHRoZSBkaXNwbGF5IHByb2Nlc3MKK21pZ2h0IG5ldmVyIGdldCB0byB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSBiZWZvcmUgYmVpbmcgYWJvcnRlZCwgcmVzdWx0aW5nCitpbiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgc2NyZWVuIGJlaW5nIHNldmVyYWwgcGFzc2VzIHdvcnNlIHRoYW4gdGhlIHVwcGVyLgorSW4gbW9zdCBjYXNlcyBpdCdzIHByb2JhYmx5IGJlc3QgdG8gYWJvcnQgYW4gb3V0cHV0IHBhc3Mgb25seSBpZiB0aGUgd2hvbGUKK2ZpbGUgaGFzIGFycml2ZWQgYW5kIHlvdSB3YW50IHRvIGJlZ2luIHRoZSBmaW5hbCBvdXRwdXQgcGFzcyBpbW1lZGlhdGVseS4KKworV2hlbiByZWNlaXZpbmcgZGF0YSBhY3Jvc3MgYSBjb21tdW5pY2F0aW9uIGxpbmssIHdlIHJlY29tbWVuZCBhbHdheXMgdXNpbmcKK3RoZSBjdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGZvciB0aGUgb3V0cHV0IHRhcmdldCBzY2FuIG51bWJlcjsgaWYgYQoraGlnaGVyLXF1YWxpdHkgZmluYWwgcGFzcyBpcyB0byBiZSBkb25lLCBpdCBzaG91bGQgYmUgc3RhcnRlZCAoYWJvcnRpbmcgYW55CitpbmNvbXBsZXRlIG91dHB1dCBwYXNzKSBhcyBzb29uIGFzIHRoZSBlbmQgb2YgZmlsZSBpcyByZWNlaXZlZC4gIEhvd2V2ZXIsCittYW55IG90aGVyIHN0cmF0ZWdpZXMgYXJlIHBvc3NpYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBhcHBsaWNhdGlvbiBjYW4gZXhhbWluZQordGhlIHBhcmFtZXRlcnMgb2YgdGhlIGN1cnJlbnQgaW5wdXQgc2NhbiBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSBpdCBvcgorbm90LiAgSWYgdGhlIHNjYW4gY29udGFpbnMgb25seSBjaHJvbWEgZGF0YSwgb25lIG1pZ2h0IGNob29zZSBub3QgdG8gdXNlIGl0CithcyB0aGUgdGFyZ2V0IHNjYW4sIGV4cGVjdGluZyB0aGF0IHRoZSBzY2FuIHdpbGwgYmUgc21hbGwgYW5kIHdpbGwgYXJyaXZlCitxdWlja2x5LiAgVG8gc2tpcCB0byB0aGUgbmV4dCBzY2FuLCBjYWxsIGpwZWdfY29uc3VtZV9pbnB1dCgpIHVudGlsIGl0CityZXR1cm5zIEpQRUdfUkVBQ0hFRF9TT1Mgb3IgSlBFR19SRUFDSEVEX0VPSS4gIE9yIGp1c3QgdXNlIHRoZSBuZXh0IGhpZ2hlcgorbnVtYmVyIGFzIHRoZSB0YXJnZXQgc2NhbiBmb3IganBlZ19zdGFydF9vdXRwdXQoKTsgYnV0IHRoYXQgbWV0aG9kIGRvZXNuJ3QKK2xldCB5b3UgaW5zcGVjdCB0aGUgbmV4dCBzY2FuJ3MgcGFyYW1ldGVycyBiZWZvcmUgZGVjaWRpbmcgdG8gZGlzcGxheSBpdC4KKworCitJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBuZXZlciBwZXJmb3JtcyBpbnB1dCBhbmQKK3RodXMgbmV2ZXIgc3VzcGVuZHMuICBBbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgaW5wdXQgc3VzcGVuc2lvbiB3aXRoCitidWZmZXJlZC1pbWFnZSBtb2RlIG11c3QgYmUgcHJlcGFyZWQgZm9yIHN1c3BlbnNpb24gcmV0dXJucyBmcm9tIHRoZXNlCityb3V0aW5lczoKKyoganBlZ19zdGFydF9vdXRwdXQoKSBwZXJmb3JtcyBpbnB1dCBvbmx5IGlmIHlvdSByZXF1ZXN0IDItcGFzcyBxdWFudGl6YXRpb24KKyAgYW5kIHRoZSB0YXJnZXQgc2NhbiBpc24ndCBmdWxseSByZWFkIHlldC4gIChUaGlzIGlzIGRpc2N1c3NlZCBiZWxvdy4pCisqIGpwZWdfcmVhZF9zY2FubGluZXMoKSwgYXMgYWx3YXlzLCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2NhbmxpbmVzIHRoYXQgaXQKKyAgd2FzIGFibGUgdG8gcHJvZHVjZSBiZWZvcmUgc3VzcGVuZGluZy4KKyoganBlZ19maW5pc2hfb3V0cHV0KCkgd2lsbCByZWFkIGFueSBtYXJrZXJzIGZvbGxvd2luZyB0aGUgdGFyZ2V0IHNjYW4sCisgIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgb3IgdGhlIFNPUyBtYXJrZXIgdGhhdCBiZWdpbnMgYW5vdGhlciBzY2FuLgorICAoQnV0IGl0IHJlYWRzIG5vIGlucHV0IGlmIGpwZWdfY29uc3VtZV9pbnB1dCgpIGhhcyBhbHJlYWR5IHJlYWNoZWQgdGhlCisgIGVuZCBvZiB0aGUgZmlsZSBvciBhIFNPUyBtYXJrZXIgYmV5b25kIHRoZSB0YXJnZXQgb3V0cHV0IHNjYW4uKQorKiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgd2lsbCByZWFkIHVudGlsIHRoZSBlbmQgb2YgZmlsZSwgYW5kIHRodXMgY2FuCisgIHN1c3BlbmQgaWYgdGhlIGVuZCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHJlYWNoZWQgKGFzIGNhbiBiZSB0ZXN0ZWQgYnkKKyAgY2FsbGluZyBqcGVnX2lucHV0X2NvbXBsZXRlKCkpLgoranBlZ19zdGFydF9vdXRwdXQoKSwganBlZ19maW5pc2hfb3V0cHV0KCksIGFuZCBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkKK2FsbCByZXR1cm4gVFJVRSBpZiB0aGV5IGNvbXBsZXRlZCB0aGVpciB0YXNrcywgRkFMU0UgaWYgdGhleSBoYWQgdG8gc3VzcGVuZC4KK0luIHRoZSBldmVudCBvZiBhIEZBTFNFIHJldHVybiwgdGhlIGFwcGxpY2F0aW9uIG11c3QgbG9hZCBtb3JlIGlucHV0IGRhdGEKK2FuZCByZXBlYXQgdGhlIGNhbGwuICBBcHBsaWNhdGlvbnMgdGhhdCB1c2Ugbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2VzIG5lZWQKK25vdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlcyBvZiB0aGVzZSB0aHJlZSByb3V0aW5lcy4KKworCitJdCBpcyBwb3NzaWJsZSB0byBjaGFuZ2UgZGVjb2RpbmcgcGFyYW1ldGVycyBiZXR3ZWVuIG91dHB1dCBwYXNzZXMgaW4gdGhlCitidWZmZXJlZC1pbWFnZSBtb2RlLiAgVGhlIGRlY29kZXIgbGlicmFyeSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSB2ZXJ5CitsaW1pdGVkIGNoYW5nZXMgb2YgcGFyYW1ldGVycy4gIE9OTFkgVEhFIEZPTExPV0lORyBwYXJhbWV0ZXIgY2hhbmdlcyBhcmUKK2FsbG93ZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzKCkgaXMgY2FsbGVkOgorKiBkY3RfbWV0aG9kIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KKyAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCB1c2UgYSBmYXN0IERDVCBtZXRob2QgZm9yIGVhcmx5IHNjYW5zLCBjaGFuZ2luZworICB0byBhIGhpZ2hlciBxdWFsaXR5IG1ldGhvZCBmb3IgdGhlIGZpbmFsIHNjYW4uCisqIGRpdGhlcl9tb2RlIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKTsKKyAgb2YgY291cnNlIHRoaXMgaGFzIG5vIGltcGFjdCBpZiBub3QgdXNpbmcgY29sb3IgcXVhbnRpemF0aW9uLiAgVHlwaWNhbGx5CisgIG9uZSB3b3VsZCB1c2Ugb3JkZXJlZCBkaXRoZXIgZm9yIGluaXRpYWwgcGFzc2VzLCB0aGVuIHN3aXRjaCB0bworICBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyIGZvciB0aGUgZmluYWwgcGFzcy4gIENhdXRpb246IGNoYW5naW5nIGRpdGhlciBtb2RlCisgIGNhbiBjYXVzZSBtb3JlIG1lbW9yeSB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkuICBBbHRob3VnaCB0aGUgYW1vdW50CisgIG9mIG1lbW9yeSBpbnZvbHZlZCBpcyBub3QgbGFyZ2UgKGEgc2NhbmxpbmUgb3Igc28pLCBpdCBtYXkgY2F1c2UgdGhlCisgIGluaXRpYWwgbWF4X21lbW9yeV90b191c2Ugc3BlY2lmaWNhdGlvbiB0byBiZSBleGNlZWRlZCwgd2hpY2ggaW4gdGhlIHdvcnN0CisgIGNhc2Ugd291bGQgcmVzdWx0IGluIGFuIG91dC1vZi1tZW1vcnkgZmFpbHVyZS4KKyogZG9fYmxvY2tfc21vb3RoaW5nIGNhbiBiZSBjaGFuZ2VkIGJlZm9yZSBlYWNoIGNhbGwgdG8ganBlZ19zdGFydF9vdXRwdXQoKS4KKyAgVGhpcyBzZXR0aW5nIGlzIHJlbGV2YW50IG9ubHkgd2hlbiBkZWNvZGluZyBhIHByb2dyZXNzaXZlIEpQRUcgaW1hZ2UuCisgIER1cmluZyB0aGUgZmlyc3QgREMtb25seSBzY2FuLCBibG9jayBzbW9vdGhpbmcgcHJvdmlkZXMgYSB2ZXJ5ICJmdXp6eSIgbG9vaworICBpbnN0ZWFkIG9mIHRoZSB2ZXJ5ICJibG9ja3kiIGxvb2sgc2VlbiB3aXRob3V0IGl0OyB3aGljaCBpcyBiZXR0ZXIgc2VlbXMgYQorICBtYXR0ZXIgb2YgcGVyc29uYWwgdGFzdGUuICBCdXQgYmxvY2sgc21vb3RoaW5nIGlzIG5lYXJseSBhbHdheXMgYSB3aW4KKyAgZHVyaW5nIGxhdGVyIHN0YWdlcywgZXNwZWNpYWxseSB3aGVuIGRlY29kaW5nIGEgc3VjY2Vzc2l2ZS1hcHByb3hpbWF0aW9uCisgIGltYWdlOiBzbW9vdGhpbmcgaGVscHMgdG8gaGlkZSB0aGUgc2xpZ2h0IGJsb2NraW5lc3MgdGhhdCBvdGhlcndpc2Ugc2hvd3MKKyAgdXAgb24gc21vb3RoIGdyYWRpZW50cyB1bnRpbCB0aGUgbG93ZXN0IGNvZWZmaWNpZW50IGJpdHMgYXJlIHNlbnQuCisqIENvbG9yIHF1YW50aXphdGlvbiBtb2RlIGNhbiBiZSBjaGFuZ2VkIHVuZGVyIHRoZSBydWxlcyBkZXNjcmliZWQgYmVsb3cuCisgIFlvdSAqY2Fubm90KiBjaGFuZ2UgYmV0d2VlbiBmdWxsLWNvbG9yIGFuZCBxdWFudGl6ZWQgb3V0cHV0IChiZWNhdXNlIHRoYXQKKyAgd291bGQgYWx0ZXIgdGhlIHJlcXVpcmVkIEkvTyBidWZmZXIgc2l6ZXMpLCBidXQgeW91IGNhbiBjaGFuZ2Ugd2hpY2gKKyAgcXVhbnRpemF0aW9uIG1ldGhvZCBpcyB1c2VkLgorCitXaGVuIGdlbmVyYXRpbmcgY29sb3ItcXVhbnRpemVkIG91dHB1dCwgY2hhbmdpbmcgcXVhbnRpemF0aW9uIG1ldGhvZCBpcyBhCit2ZXJ5IHVzZWZ1bCB3YXkgb2Ygc3dpdGNoaW5nIGJldHdlZW4gaGlnaC1zcGVlZCBhbmQgaGlnaC1xdWFsaXR5IGRpc3BsYXkuCitUaGUgbGlicmFyeSBhbGxvd3MgeW91IHRvIGNoYW5nZSBhbW9uZyBpdHMgdGhyZWUgcXVhbnRpemF0aW9uIG1ldGhvZHM6CisxLiBTaW5nbGUtcGFzcyBxdWFudGl6YXRpb24gdG8gYSBmaXhlZCBjb2xvciBjdWJlLgorICAgU2VsZWN0ZWQgYnkgY2luZm8udHdvX3Bhc3NfcXVhbnRpemUgPSBGQUxTRSBhbmQgY2luZm8uY29sb3JtYXAgPSBOVUxMLgorMi4gU2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGNvbG9ybWFwLgorICAgU2VsZWN0ZWQgYnkgc2V0dGluZyBjaW5mby5jb2xvcm1hcCB0byBwb2ludCB0byB0aGUgY29sb3JtYXAgKHRoZSB2YWx1ZSBvZgorICAgdHdvX3Bhc3NfcXVhbnRpemUgaXMgaWdub3JlZCk7IGFsc28gc2V0IGNpbmZvLmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzLgorMy4gVHdvLXBhc3MgcXVhbnRpemF0aW9uIHRvIGEgY29sb3JtYXAgY2hvc2VuIHNwZWNpZmljYWxseSBmb3IgdGhlIGltYWdlLgorICAgU2VsZWN0ZWQgYnkgY2luZm8udHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFIGFuZCBjaW5mby5jb2xvcm1hcCA9IE5VTEwuCisgICAoVGhpcyBpcyB0aGUgZGVmYXVsdCBzZXR0aW5nIHNlbGVjdGVkIGJ5IGpwZWdfcmVhZF9oZWFkZXIsIGJ1dCBpdCBpcworICAgcHJvYmFibHkgTk9UIHdoYXQgeW91IHdhbnQgZm9yIHRoZSBmaXJzdCBwYXNzIG9mIHByb2dyZXNzaXZlIGRpc3BsYXkhKQorVGhlc2UgbWV0aG9kcyBvZmZlciBzdWNjZXNzaXZlbHkgYmV0dGVyIHF1YWxpdHkgYW5kIGxlc3NlciBzcGVlZC4gIEhvd2V2ZXIsCitvbmx5IHRoZSBmaXJzdCBtZXRob2QgaXMgYXZhaWxhYmxlIGZvciBxdWFudGl6aW5nIGluIG5vbi1SR0IgY29sb3Igc3BhY2VzLgorCitJTVBPUlRBTlQ6IGJlY2F1c2UgdGhlIGRpZmZlcmVudCBxdWFudGl6ZXIgbWV0aG9kcyBoYXZlIHZlcnkgZGlmZmVyZW50Cit3b3JraW5nLXN0b3JhZ2UgcmVxdWlyZW1lbnRzLCB0aGUgbGlicmFyeSByZXF1aXJlcyB5b3UgdG8gaW5kaWNhdGUgd2hpY2gKK29uZShzKSB5b3UgaW50ZW5kIHRvIHVzZSBiZWZvcmUgeW91IGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzKCkuICAoSWYgd2UgZGlkCitub3QgcmVxdWlyZSB0aGlzLCB0aGUgbWF4X21lbW9yeV90b191c2Ugc2V0dGluZyB3b3VsZCBiZSBhIGNvbXBsZXRlIGZpY3Rpb24uKQorWW91IGRvIHRoaXMgYnkgc2V0dGluZyBvbmUgb3IgbW9yZSBvZiB0aGVzZSB0aHJlZSBjaW5mbyBmaWVsZHMgdG8gVFJVRToKKwllbmFibGVfMXBhc3NfcXVhbnQJCUZpeGVkIGNvbG9yIGN1YmUgY29sb3JtYXAKKwllbmFibGVfZXh0ZXJuYWxfcXVhbnQJCUV4dGVybmFsbHktc3VwcGxpZWQgY29sb3JtYXAKKwllbmFibGVfMnBhc3NfcXVhbnQJCVR3by1wYXNzIGN1c3RvbSBjb2xvcm1hcAorQWxsIHRocmVlIGFyZSBpbml0aWFsaXplZCBGQUxTRSBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICBCdXQKK2pwZWdfc3RhcnRfZGVjb21wcmVzcygpIGF1dG9tYXRpY2FsbHkgc2V0cyBUUlVFIHRoZSBvbmUgc2VsZWN0ZWQgYnkgdGhlCitjdXJyZW50IHR3b19wYXNzX3F1YW50aXplIGFuZCBjb2xvcm1hcCBzZXR0aW5ncywgc28geW91IG9ubHkgbmVlZCB0byBzZXQgdGhlCitlbmFibGUgZmxhZ3MgZm9yIGFueSBvdGhlciBxdWFudGl6YXRpb24gbWV0aG9kcyB5b3UgcGxhbiB0byBjaGFuZ2UgdG8gbGF0ZXIuCisKK0FmdGVyIHNldHRpbmcgdGhlIGVuYWJsZSBmbGFncyBjb3JyZWN0bHkgYXQganBlZ19zdGFydF9kZWNvbXByZXNzKCkgdGltZSwgeW91CitjYW4gY2hhbmdlIHRvIGFueSBlbmFibGVkIHF1YW50aXphdGlvbiBtZXRob2QgYnkgc2V0dGluZyB0d29fcGFzc19xdWFudGl6ZQorYW5kIGNvbG9ybWFwIHByb3Blcmx5IGp1c3QgYmVmb3JlIGNhbGxpbmcganBlZ19zdGFydF9vdXRwdXQoKS4gIFRoZSBmb2xsb3dpbmcKK3NwZWNpYWwgcnVsZXMgYXBwbHk6CisxLiBZb3UgbXVzdCBleHBsaWNpdGx5IHNldCBjaW5mby5jb2xvcm1hcCB0byBOVUxMIHdoZW4gc3dpdGNoaW5nIHRvIDEtcGFzcworICAgb3IgMi1wYXNzIG1vZGUgZnJvbSBhIGRpZmZlcmVudCBtb2RlLCBvciB3aGVuIHlvdSB3YW50IHRoZSAyLXBhc3MKKyAgIHF1YW50aXplciB0byBiZSByZS1ydW4gdG8gZ2VuZXJhdGUgYSBuZXcgY29sb3JtYXAuCisyLiBUbyBzd2l0Y2ggdG8gYW4gZXh0ZXJuYWwgY29sb3JtYXAsIG9yIHRvIGNoYW5nZSB0byBhIGRpZmZlcmVudCBleHRlcm5hbAorICAgY29sb3JtYXAgdGhhbiB3YXMgdXNlZCBvbiB0aGUgcHJpb3IgcGFzcywgeW91IG11c3QgY2FsbAorICAganBlZ19uZXdfY29sb3JtYXAoKSBhZnRlciBzZXR0aW5nIGNpbmZvLmNvbG9ybWFwLgorTk9URTogaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzYW1lIGNvbG9ybWFwIGFzIHdhcyB1c2VkIGluIHRoZSBwcmlvciBwYXNzLAoreW91IHNob3VsZCBub3QgZG8gZWl0aGVyIG9mIHRoZXNlIHRoaW5ncy4gIFRoaXMgd2lsbCBzYXZlIHNvbWUgbm9udHJpdmlhbAorc3dpdGNob3ZlciBjb3N0cy4KKyhUaGVzZSByZXF1aXJlbWVudHMgZXhpc3QgYmVjYXVzZSBjaW5mby5jb2xvcm1hcCB3aWxsIGFsd2F5cyBiZSBub24tTlVMTAorYWZ0ZXIgY29tcGxldGluZyBhIHByaW9yIG91dHB1dCBwYXNzLCBzaW5jZSBib3RoIHRoZSAxLXBhc3MgYW5kIDItcGFzcworcXVhbnRpemVycyBzZXQgaXQgdG8gcG9pbnQgdG8gdGhlaXIgb3V0cHV0IGNvbG9ybWFwcy4gIFRodXMgeW91IGhhdmUgdG8KK2RvIG9uZSBvZiB0aGVzZSB0d28gdGhpbmdzIHRvIG5vdGlmeSB0aGUgbGlicmFyeSB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZC4KK1l1cCwgaXQncyBhIGJpdCBrbHVneSwgYnV0IGl0J3MgbmVjZXNzYXJ5IHRvIGRvIGl0IHRoaXMgd2F5IGZvciBiYWNrd2FyZHMKK2NvbXBhdGliaWxpdHkuKQorCitOb3RlIHRoYXQgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSwgdGhlIGxpYnJhcnkgZ2VuZXJhdGVzIGFueSByZXF1ZXN0ZWQgY29sb3JtYXAKK2R1cmluZyBqcGVnX3N0YXJ0X291dHB1dCgpLCBub3QgZHVyaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorCitXaGVuIHVzaW5nIHR3by1wYXNzIHF1YW50aXphdGlvbiwganBlZ19zdGFydF9vdXRwdXQoKSBtYWtlcyBhIHBhc3Mgb3ZlciB0aGUKK2J1ZmZlcmVkIGltYWdlIHRvIGRldGVybWluZSB0aGUgb3B0aW11bSBjb2xvciBtYXA7IGl0IHRoZXJlZm9yZSBtYXkgdGFrZSBhCitzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZSwgd2hlcmVhcyBvcmRpbmFyaWx5IGl0IGRvZXMgbGl0dGxlIHdvcmsuICBUaGUKK3Byb2dyZXNzIG1vbml0b3IgaG9vayBpcyBjYWxsZWQgZHVyaW5nIHRoaXMgcGFzcywgaWYgZGVmaW5lZC4gIEl0IGlzIGFsc28KK2ltcG9ydGFudCB0byByZWFsaXplIHRoYXQgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgc2NhbiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuCitvciBlcXVhbCB0byB0aGUgY3VycmVudCBpbnB1dCBzY2FuIG51bWJlciwganBlZ19zdGFydF9vdXRwdXQoKSB3aWxsIGF0dGVtcHQKK3RvIGNvbnN1bWUgaW5wdXQgYXMgaXQgbWFrZXMgdGhpcyBwYXNzLiAgSWYgeW91IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsCit5b3UgbmVlZCB0byBjaGVjayBmb3IgYSBGQUxTRSByZXR1cm4gZnJvbSBqcGVnX3N0YXJ0X291dHB1dCgpIHVuZGVyIHRoZXNlCitjb25kaXRpb25zLiAgVGhlIGNvbWJpbmF0aW9uIG9mIDItcGFzcyBxdWFudGl6YXRpb24gYW5kIGEgbm90LXlldC1mdWxseS1yZWFkCit0YXJnZXQgc2NhbiBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoIGpwZWdfc3RhcnRfb3V0cHV0KCkgd2lsbCBjb25zdW1lIGlucHV0LgorCisKK0FwcGxpY2F0aW9uIGF1dGhvcnMgd2hvIHN1cHBvcnQgYnVmZmVyZWQtaW1hZ2UgbW9kZSBtYXkgYmUgdGVtcHRlZCB0byB1c2UgaXQKK2ZvciBhbGwgSlBFRyBpbWFnZXMsIGV2ZW4gc2luZ2xlLXNjYW4gb25lcy4gIFRoaXMgd2lsbCB3b3JrLCBidXQgaXQgaXMKK2luZWZmaWNpZW50OiB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBpbWFnZS1zaXplZCBjb2VmZmljaWVudCBidWZmZXIgZm9yCitzaW5nbGUtc2NhbiBpbWFnZXMuICBSZXF1ZXN0aW5nIGJ1ZmZlcmVkLWltYWdlIG1vZGUgZm9yIHN1Y2ggYW4gaW1hZ2Ugd2FzdGVzCittZW1vcnkuICBXb3JzZSwgaXQgY2FuIGNvc3QgdGltZSBvbiBsYXJnZSBpbWFnZXMsIHNpbmNlIHRoZSBidWZmZXJlZCBkYXRhIGhhcwordG8gYmUgc3dhcHBlZCBvdXQgb3Igd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBmaWxlLiAgSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQKK21heGltdW0gcGVyZm9ybWFuY2Ugb24gYmFzZWxpbmUgSlBFRyBmaWxlcywgeW91IHNob3VsZCB1c2UgYnVmZmVyZWQtaW1hZ2UKK21vZGUgb25seSB3aGVuIHRoZSBpbmNvbWluZyBmaWxlIGFjdHVhbGx5IGhhcyBtdWx0aXBsZSBzY2Fucy4gIFRoaXMgY2FuIGJlCit0ZXN0ZWQgYnkgY2FsbGluZyBqcGVnX2hhc19tdWx0aXBsZV9zY2FucygpLCB3aGljaCB3aWxsIHJldHVybiBhIGNvcnJlY3QKK3Jlc3VsdCBhdCBhbnkgdGltZSBhZnRlciBqcGVnX3JlYWRfaGVhZGVyKCkgY29tcGxldGVzLgorCitJdCBpcyBhbHNvIHdvcnRoIG5vdGluZyB0aGF0IHdoZW4geW91IHVzZSBqcGVnX2NvbnN1bWVfaW5wdXQoKSB0byBsZXQgaW5wdXQKK3Byb2Nlc3NpbmcgZ2V0IGFoZWFkIG9mIG91dHB1dCBwcm9jZXNzaW5nLCB0aGUgcmVzdWx0aW5nIHBhdHRlcm4gb2YgYWNjZXNzIHRvCit0aGUgY29lZmZpY2llbnQgYnVmZmVyIGlzIHF1aXRlIG5vbnNlcXVlbnRpYWwuICBJdCdzIGJlc3QgdG8gdXNlIHRoZSBtZW1vcnkKK21hbmFnZXIgam1lbW5vYnMuYyBpZiB5b3UgY2FuIChpZSwgaWYgeW91IGhhdmUgZW5vdWdoIHJlYWwgb3IgdmlydHVhbCBtYWluCittZW1vcnkpLiAgSWYgbm90LCBhdCBsZWFzdCBtYWtlIHN1cmUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBzZXQgYXMgaGlnaCBhcworcG9zc2libGUuICBJZiB0aGUgSlBFRyBtZW1vcnkgbWFuYWdlciBoYXMgdG8gdXNlIGEgdGVtcG9yYXJ5IGZpbGUsIHlvdSB3aWxsCitwcm9iYWJseSBzZWUgYSBsb3Qgb2YgZGlzayB0cmFmZmljIGFuZCBwb29yIHBlcmZvcm1hbmNlLiAgKFRoaXMgY291bGQgYmUKK2ltcHJvdmVkIHdpdGggYWRkaXRpb25hbCB3b3JrIG9uIHRoZSBtZW1vcnkgbWFuYWdlciwgYnV0IHdlIGhhdmVuJ3QgZ290dGVuCithcm91bmQgdG8gaXQgeWV0LikKKworSW4gc29tZSBhcHBsaWNhdGlvbnMgaXQgbWF5IGJlIGNvbnZlbmllbnQgdG8gdXNlIGpwZWdfY29uc3VtZV9pbnB1dCgpIGZvciBhbGwKK2lucHV0IHByb2Nlc3NpbmcsIGluY2x1ZGluZyByZWFkaW5nIHRoZSBpbml0aWFsIG1hcmtlcnM7IHRoYXQgaXMsIHlvdSBtYXkKK3dpc2ggdG8gY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBpbnN0ZWFkIG9mIGpwZWdfcmVhZF9oZWFkZXIoKSBkdXJpbmcKK3N0YXJ0dXAuICBUaGlzIHdvcmtzLCBidXQgbm90ZSB0aGF0IHlvdSBtdXN0IGNoZWNrIGZvciBKUEVHX1JFQUNIRURfU09TIGFuZAorSlBFR19SRUFDSEVEX0VPSSByZXR1cm4gY29kZXMgYXMgdGhlIGVxdWl2YWxlbnQgb2YganBlZ19yZWFkX2hlYWRlcidzIGNvZGVzLgorT25jZSB0aGUgZmlyc3QgU09TIG1hcmtlciBoYXMgYmVlbiByZWFjaGVkLCB5b3UgbXVzdCBjYWxsCitqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKSBiZWZvcmUganBlZ19jb25zdW1lX2lucHV0KCkgd2lsbCBjb25zdW1lIG1vcmUgaW5wdXQ7CitpdCdsbCBqdXN0IGtlZXAgcmV0dXJuaW5nIEpQRUdfUkVBQ0hFRF9TT1MgdW50aWwgeW91IGRvLiAgSWYgeW91IHJlYWQgYQordGFibGVzLW9ubHkgZmlsZSB0aGlzIHdheSwganBlZ19jb25zdW1lX2lucHV0KCkgd2lsbCByZXR1cm4gSlBFR19SRUFDSEVEX0VPSQord2l0aG91dCBldmVyIHJldHVybmluZyBKUEVHX1JFQUNIRURfU09TOyBiZSBzdXJlIHRvIGNoZWNrIGZvciB0aGlzIGNhc2UuCitJZiB0aGlzIGhhcHBlbnMsIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBub3QgcmVhZCBhbnkgbW9yZSBpbnB1dCB1bnRpbCB5b3UgY2FsbAoranBlZ19hYm9ydCgpIHRvIHJlc2V0IGl0LiAgSXQgaXMgT0sgdG8gY2FsbCBqcGVnX2NvbnN1bWVfaW5wdXQoKSBldmVuIHdoZW4gbm90Cit1c2luZyBidWZmZXJlZC1pbWFnZSBtb2RlLCBidXQgaW4gdGhhdCBjYXNlIGl0J3MgYmFzaWNhbGx5IGEgbm8tb3AgYWZ0ZXIgdGhlCitpbml0aWFsIG1hcmtlcnMgaGF2ZSBiZWVuIHJlYWQ6IGl0IHdpbGwganVzdCByZXR1cm4gSlBFR19TVVNQRU5ERUQuCisKKworQWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMgYW5kIG11bHRpcGxlIGltYWdlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvYmplY3QgY2FuIGJlIHJldXNlZCB0byBwcm9jZXNzIG11bHRpcGxlCitpbWFnZXMuICBUaGlzIHNhdmVzIGEgc21hbGwgYW1vdW50IG9mIHRpbWUgcGVyIGltYWdlIGJ5IGVsaW1pbmF0aW5nIHRoZQorImNyZWF0ZSIgYW5kICJkZXN0cm95IiBvcGVyYXRpb25zLCBidXQgdGhhdCBpc24ndCB0aGUgcmVhbCBwdXJwb3NlIG9mIHRoZQorZmVhdHVyZS4gIFJhdGhlciwgcmV1c2Ugb2YgYW4gb2JqZWN0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGFiYnJldmlhdGVkIEpQRUcKK2RhdGFzdHJlYW1zLiAgT2JqZWN0IHJldXNlIGNhbiBhbHNvIHNpbXBsaWZ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgaW1hZ2VzIGluCithIHNpbmdsZSBpbnB1dCBvciBvdXRwdXQgZmlsZS4gIFRoaXMgc2VjdGlvbiBleHBsYWlucyB0aGVzZSBmZWF0dXJlcy4KKworQSBKUEVHIGZpbGUgbm9ybWFsbHkgY29udGFpbnMgc2V2ZXJhbCBodW5kcmVkIGJ5dGVzIHdvcnRoIG9mIHF1YW50aXphdGlvbgorYW5kIEh1ZmZtYW4gdGFibGVzLiAgSW4gYSBzaXR1YXRpb24gd2hlcmUgbWFueSBpbWFnZXMgd2lsbCBiZSBzdG9yZWQgb3IKK3RyYW5zbWl0dGVkIHdpdGggaWRlbnRpY2FsIHRhYmxlcywgdGhpcyBtYXkgcmVwcmVzZW50IGFuIGFubm95aW5nIG92ZXJoZWFkLgorVGhlIEpQRUcgc3RhbmRhcmQgdGhlcmVmb3JlIHBlcm1pdHMgdGFibGVzIHRvIGJlIG9taXR0ZWQuICBUaGUgc3RhbmRhcmQKK2RlZmluZXMgdGhyZWUgY2xhc3NlcyBvZiBKUEVHIGRhdGFzdHJlYW1zOgorICAqICJJbnRlcmNoYW5nZSIgZGF0YXN0cmVhbXMgY29udGFpbiBhbiBpbWFnZSBhbmQgYWxsIHRhYmxlcyBuZWVkZWQgdG8gZGVjb2RlCisgICAgIHRoZSBpbWFnZS4gIFRoZXNlIGFyZSB0aGUgdXN1YWwga2luZCBvZiBKUEVHIGZpbGUuCisgICogIkFiYnJldmlhdGVkIGltYWdlIiBkYXRhc3RyZWFtcyBjb250YWluIGFuIGltYWdlLCBidXQgYXJlIG1pc3Npbmcgc29tZSBvcgorICAgIGFsbCBvZiB0aGUgdGFibGVzIG5lZWRlZCB0byBkZWNvZGUgdGhhdCBpbWFnZS4KKyAgKiAiQWJicmV2aWF0ZWQgdGFibGUgc3BlY2lmaWNhdGlvbiIgKGhlbmNlZm9ydGggInRhYmxlcy1vbmx5IikgZGF0YXN0cmVhbXMKKyAgICBjb250YWluIG9ubHkgdGFibGUgc3BlY2lmaWNhdGlvbnMuCitUbyBkZWNvZGUgYW4gYWJicmV2aWF0ZWQgaW1hZ2UsIGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtaXNzaW5nIHRhYmxlKHMpCitpbnRvIHRoZSBkZWNvZGVyIGJlZm9yZWhhbmQuICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgcmVhZGluZyBhIHNlcGFyYXRlCit0YWJsZXMtb25seSBmaWxlLiAgQSB2YXJpYW50IHNjaGVtZSB1c2VzIGEgc2VyaWVzIG9mIGltYWdlcyBpbiB3aGljaCB0aGUgZmlyc3QKK2ltYWdlIGlzIGFuIGludGVyY2hhbmdlIChjb21wbGV0ZSkgZGF0YXN0cmVhbSwgd2hpbGUgc3Vic2VxdWVudCBvbmVzIGFyZQorYWJicmV2aWF0ZWQgYW5kIHJlbHkgb24gdGhlIHRhYmxlcyBsb2FkZWQgYnkgdGhlIGZpcnN0IGltYWdlLiAgSXQgaXMgYXNzdW1lZAordGhhdCBvbmNlIHRoZSBkZWNvZGVyIGhhcyByZWFkIGEgdGFibGUsIGl0IHdpbGwgcmVtZW1iZXIgdGhhdCB0YWJsZSB1bnRpbCBhCituZXcgZGVmaW5pdGlvbiBmb3IgdGhlIHNhbWUgdGFibGUgbnVtYmVyIGlzIGVuY291bnRlcmVkLgorCitJdCBpcyB0aGUgYXBwbGljYXRpb24gZGVzaWduZXIncyByZXNwb25zaWJpbGl0eSB0byBmaWd1cmUgb3V0IGhvdyB0byBhc3NvY2lhdGUKK3RoZSBjb3JyZWN0IHRhYmxlcyB3aXRoIGFuIGFiYnJldmlhdGVkIGltYWdlLiAgV2hpbGUgYWJicmV2aWF0ZWQgZGF0YXN0cmVhbXMKK2NhbiBiZSB1c2VmdWwgaW4gYSBjbG9zZWQgZW52aXJvbm1lbnQsIHRoZWlyIHVzZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCBpbgorYW55IHNpdHVhdGlvbiB3aGVyZSBkYXRhIGV4Y2hhbmdlIHdpdGggb3RoZXIgYXBwbGljYXRpb25zIG1pZ2h0IGJlIG5lZWRlZC4KK0NhdmVhdCBkZXNpZ25lci4KKworVGhlIEpQRUcgbGlicmFyeSBwcm92aWRlcyBzdXBwb3J0IGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGFueSBjb21iaW5hdGlvbiBvZgordGFibGVzLW9ubHkgZGF0YXN0cmVhbXMgYW5kIGFiYnJldmlhdGVkIGltYWdlcy4gIEluIGJvdGggY29tcHJlc3Npb24gYW5kCitkZWNvbXByZXNzaW9uIG9iamVjdHMsIGEgcXVhbnRpemF0aW9uIG9yIEh1ZmZtYW4gdGFibGUgd2lsbCBiZSByZXRhaW5lZCBmb3IKK3RoZSBsaWZldGltZSBvZiB0aGUgb2JqZWN0LCB1bmxlc3MgaXQgaXMgb3ZlcndyaXR0ZW4gYnkgYSBuZXcgdGFibGUgZGVmaW5pdGlvbi4KKworCitUbyBjcmVhdGUgYWJicmV2aWF0ZWQgaW1hZ2UgZGF0YXN0cmVhbXMsIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIHRlbGwgdGhlCitjb21wcmVzc29yIG5vdCB0byBlbWl0IHNvbWUgb3IgYWxsIG9mIHRoZSB0YWJsZXMgaXQgaXMgdXNpbmcuICBFYWNoCitxdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGUgc3RydWN0IGNvbnRhaW5zIGEgYm9vbGVhbiBmaWVsZCAic2VudF90YWJsZSIsCit3aGljaCBub3JtYWxseSBpcyBpbml0aWFsaXplZCB0byBGQUxTRS4gIEZvciBlYWNoIHRhYmxlIHVzZWQgYnkgdGhlIGltYWdlLCB0aGUKK2hlYWRlci13cml0aW5nIHByb2Nlc3MgZW1pdHMgdGhlIHRhYmxlIGFuZCBzZXRzIHNlbnRfdGFibGUgPSBUUlVFIHVubGVzcyBpdCBpcworYWxyZWFkeSBUUlVFLiAgKEluIG5vcm1hbCB1c2FnZSwgdGhpcyBwcmV2ZW50cyBvdXRwdXR0aW5nIHRoZSBzYW1lIHRhYmxlCitkZWZpbml0aW9uIG11bHRpcGxlIHRpbWVzLCBhcyB3b3VsZCBvdGhlcndpc2Ugb2NjdXIgYmVjYXVzZSB0aGUgY2hyb21hCitjb21wb25lbnRzIHR5cGljYWxseSBzaGFyZSB0YWJsZXMuKSAgVGh1cywgc2V0dGluZyB0aGlzIGZpZWxkIHRvIFRSVUUgYmVmb3JlCitjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSB3aWxsIHByZXZlbnQgdGhlIHRhYmxlIGZyb20gYmVpbmcgd3JpdHRlbiBhdAorYWxsLgorCitJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSAicHVyZSIgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZSBjb250YWluaW5nIG5vIHRhYmxlcywKK2p1c3QgY2FsbCAianBlZ19zdXBwcmVzc190YWJsZXMoJmNpbmZvLCBUUlVFKSIgYWZ0ZXIgY29uc3RydWN0aW5nIGFsbCB0aGUKK3RhYmxlcy4gIElmIHlvdSB3YW50IHRvIGVtaXQgc29tZSBidXQgbm90IGFsbCB0YWJsZXMsIHlvdSdsbCBuZWVkIHRvIHNldCB0aGUKK2luZGl2aWR1YWwgc2VudF90YWJsZSBmaWVsZHMgZGlyZWN0bHkuCisKK1RvIGNyZWF0ZSBhbiBhYmJyZXZpYXRlZCBpbWFnZSwgeW91IG11c3QgYWxzbyBjYWxsIGpwZWdfc3RhcnRfY29tcHJlc3MoKQord2l0aCBhIHNlY29uZCBwYXJhbWV0ZXIgb2YgRkFMU0UsIG5vdCBUUlVFLiAgT3RoZXJ3aXNlIGpwZWdfc3RhcnRfY29tcHJlc3MoKQord2lsbCBmb3JjZSBhbGwgdGhlIHNlbnRfdGFibGUgZmllbGRzIHRvIEZBTFNFLiAgKFRoaXMgaXMgYSBzYWZldHkgZmVhdHVyZSB0bworcHJldmVudCBhYmJyZXZpYXRlZCBpbWFnZXMgZnJvbSBiZWluZyBjcmVhdGVkIGFjY2lkZW50YWxseS4pCisKK1RvIGNyZWF0ZSBhIHRhYmxlcy1vbmx5IGZpbGUsIHBlcmZvcm0gdGhlIHNhbWUgcGFyYW1ldGVyIHNldHVwIHRoYXQgeW91Citub3JtYWxseSB3b3VsZCwgYnV0IGluc3RlYWQgb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIHNvIG9uLCBjYWxsCitqcGVnX3dyaXRlX3RhYmxlcygmY2luZm8pLiAgVGhpcyB3aWxsIHdyaXRlIGFuIGFiYnJldmlhdGVkIGRhdGFzdHJlYW0KK2NvbnRhaW5pbmcgb25seSBTT0ksIERRVCBhbmQvb3IgREhUIG1hcmtlcnMsIGFuZCBFT0kuICBBbGwgdGhlIHF1YW50aXphdGlvbgorYW5kIEh1ZmZtYW4gdGFibGVzIHRoYXQgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2lsbAorYmUgZW1pdHRlZCB1bmxlc3MgdGhlaXIgc2VudF90YWJsZXMgZmxhZyBpcyBhbHJlYWR5IFRSVUUsIGFuZCB0aGVuIGFsbCB0aGUKK3NlbnRfdGFibGVzIGZsYWdzIHdpbGwgYmUgc2V0IFRSVUUuCisKK0Egc3VyZS1maXJlIHdheSB0byBjcmVhdGUgbWF0Y2hpbmcgdGFibGVzLW9ubHkgYW5kIGFiYnJldmlhdGVkIGltYWdlIGZpbGVzCitpcyB0byBwcm9jZWVkIGFzIGZvbGxvd3M6CisKKwljcmVhdGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QKKwlzZXQgSlBFRyBwYXJhbWV0ZXJzCisJc2V0IGRlc3RpbmF0aW9uIHRvIHRhYmxlcy1vbmx5IGZpbGUKKwlqcGVnX3dyaXRlX3RhYmxlcygmY2luZm8pOworCXNldCBkZXN0aW5hdGlvbiB0byBpbWFnZSBmaWxlCisJanBlZ19zdGFydF9jb21wcmVzcygmY2luZm8sIEZBTFNFKTsKKwl3cml0ZSBkYXRhLi4uCisJanBlZ19maW5pc2hfY29tcHJlc3MoJmNpbmZvKTsKKworU2luY2UgdGhlIEpQRUcgcGFyYW1ldGVycyBhcmUgbm90IGFsdGVyZWQgYmV0d2VlbiB3cml0aW5nIHRoZSB0YWJsZSBmaWxlIGFuZAordGhlIGFiYnJldmlhdGVkIGltYWdlIGZpbGUsIHRoZSBzYW1lIHRhYmxlcyBhcmUgc3VyZSB0byBiZSB1c2VkLiAgT2YgY291cnNlLAoreW91IGNhbiByZXBlYXQgdGhlIGpwZWdfc3RhcnRfY29tcHJlc3MoKSAuLi4ganBlZ19maW5pc2hfY29tcHJlc3MoKSBzZXF1ZW5jZQorbWFueSB0aW1lcyB0byBwcm9kdWNlIG1hbnkgYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZXMgbWF0Y2hpbmcgdGhlIHRhYmxlIGZpbGUuCisKK1lvdSBjYW5ub3Qgc3VwcHJlc3Mgb3V0cHV0IG9mIHRoZSBjb21wdXRlZCBIdWZmbWFuIHRhYmxlcyB3aGVuIEh1ZmZtYW4KK29wdGltaXphdGlvbiBpcyBzZWxlY3RlZC4gIChJZiB5b3UgY291bGQsIHRoZXJlJ2QgYmUgbm8gd2F5IHRvIGRlY29kZSB0aGUKK2ltYWdlLi4uKSAgR2VuZXJhbGx5LCB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgb3B0aW1pemVfY29kaW5nID0gVFJVRSB3aGVuCit5b3UgYXJlIHRyeWluZyB0byBwcm9kdWNlIGFiYnJldmlhdGVkIGZpbGVzLgorCitJbiBzb21lIGNhc2VzIHlvdSBtaWdodCB3YW50IHRvIGNvbXByZXNzIGFuIGltYWdlIHVzaW5nIHRhYmxlcyB3aGljaCBhcmUKK25vdCBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uLCBidXQgYXJlIGRlZmluZWQgaW4gYW4gaW50ZXJjaGFuZ2Ugb3IKK3RhYmxlcy1vbmx5IGZpbGUgcmVhZGFibGUgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBzZXR0aW5nIHVwCithIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gcmVhZCB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlLCB0aGVuIGNvcHlpbmcgdGhlCit0YWJsZXMgaW50byB5b3VyIGNvbXByZXNzaW9uIG9iamVjdC4gIFNlZSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpCitmb3IgYW4gZXhhbXBsZSBvZiBjb3B5aW5nIHF1YW50aXphdGlvbiB0YWJsZXMuCisKKworVG8gcmVhZCBhYmJyZXZpYXRlZCBpbWFnZSBmaWxlcywgeW91IHNpbXBseSBuZWVkIHRvIGxvYWQgdGhlIHByb3BlciB0YWJsZXMKK2ludG8gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGJlZm9yZSB0cnlpbmcgdG8gcmVhZCB0aGUgYWJicmV2aWF0ZWQgaW1hZ2UuCitJZiB0aGUgcHJvcGVyIHRhYmxlcyBhcmUgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtLCB5b3UgY2FuIGp1c3QKK2FsbG9jYXRlIHRoZSB0YWJsZSBzdHJ1Y3RzIGFuZCBmaWxsIGluIHRoZWlyIGNvbnRlbnRzIGRpcmVjdGx5LiAgRm9yIGV4YW1wbGUsCit0byBsb2FkIGEgZml4ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGludG8gdGFibGUgc2xvdCAibiI6CisKKyAgICBpZiAoY2luZm8ucXVhbnRfdGJsX3B0cnNbbl0gPT0gTlVMTCkKKyAgICAgIGNpbmZvLnF1YW50X3RibF9wdHJzW25dID0ganBlZ19hbGxvY19xdWFudF90YWJsZSgoal9jb21tb25fcHRyKSAmY2luZm8pOworICAgIHF1YW50X3B0ciA9IGNpbmZvLnF1YW50X3RibF9wdHJzW25dOwkvKiBxdWFudF9wdHIgaXMgSlFVQU5UX1RCTCogKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgLyogUXRhYmxlW10gaXMgZGVzaXJlZCBxdWFudGl6YXRpb24gdGFibGUsIGluIG5hdHVyYWwgYXJyYXkgb3JkZXIgKi8KKyAgICAgIHF1YW50X3B0ci0+cXVhbnR2YWxbaV0gPSBRdGFibGVbaV07CisgICAgfQorCitDb2RlIHRvIGxvYWQgYSBmaXhlZCBIdWZmbWFuIHRhYmxlIGlzIHR5cGljYWxseSAoZm9yIEFDIHRhYmxlICJuIik6CisKKyAgICBpZiAoY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXSA9PSBOVUxMKQorICAgICAgY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfaHVmZl90YWJsZSgoal9jb21tb25fcHRyKSAmY2luZm8pOworICAgIGh1ZmZfcHRyID0gY2luZm8uYWNfaHVmZl90YmxfcHRyc1tuXTsJLyogaHVmZl9wdHIgaXMgSkhVRkZfVEJMKiAqLworICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykgeworICAgICAgLyogY291bnRzW2ldIGlzIG51bWJlciBvZiBIdWZmbWFuIGNvZGVzIG9mIGxlbmd0aCBpIGJpdHMsIGk9MS4uMTYgKi8KKyAgICAgIGh1ZmZfcHRyLT5iaXRzW2ldID0gY291bnRzW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIC8qIHN5bWJvbHNbXSBpcyB0aGUgbGlzdCBvZiBIdWZmbWFuIHN5bWJvbHMsIGluIGNvZGUtbGVuZ3RoIG9yZGVyICovCisgICAgICBodWZmX3B0ci0+aHVmZnZhbFtpXSA9IHN5bWJvbHNbaV07CisgICAgfQorCisoTm90ZSB0aGF0IHRyeWluZyB0byBzZXQgY2luZm8ucXVhbnRfdGJsX3B0cnNbbl0gdG8gcG9pbnQgZGlyZWN0bHkgYXQgYQorY29uc3RhbnQgSlFVQU5UX1RCTCBvYmplY3QgaXMgbm90IHNhZmUuICBJZiB0aGUgaW5jb21pbmcgZmlsZSBoYXBwZW5lZCB0bworY29udGFpbiBhIHF1YW50aXphdGlvbiB0YWJsZSBkZWZpbml0aW9uLCB5b3VyIG1hc3RlciB0YWJsZSB3b3VsZCBnZXQKK292ZXJ3cml0dGVuISAgSW5zdGVhZCBhbGxvY2F0ZSBhIHdvcmtpbmcgdGFibGUgY29weSBhbmQgY29weSB0aGUgbWFzdGVyIHRhYmxlCitpbnRvIGl0LCBhcyBpbGx1c3RyYXRlZCBhYm92ZS4gIERpdHRvIGZvciBIdWZmbWFuIHRhYmxlcywgb2YgY291cnNlLikKKworWW91IG1pZ2h0IHdhbnQgdG8gcmVhZCB0aGUgdGFibGVzIGZyb20gYSB0YWJsZXMtb25seSBmaWxlLCByYXRoZXIgdGhhbgoraGFyZC13aXJpbmcgdGhlbSBpbnRvIHlvdXIgYXBwbGljYXRpb24uICBUaGUganBlZ19yZWFkX2hlYWRlcigpIGNhbGwgaXMKK3N1ZmZpY2llbnQgdG8gcmVhZCBhIHRhYmxlcy1vbmx5IGZpbGUuICBZb3UgbXVzdCBwYXNzIGEgc2Vjb25kIHBhcmFtZXRlciBvZgorRkFMU0UgdG8gaW5kaWNhdGUgdGhhdCB5b3UgZG8gbm90IHJlcXVpcmUgYW4gaW1hZ2UgdG8gYmUgcHJlc2VudC4gIFRodXMsIHRoZQordHlwaWNhbCBzY2VuYXJpbyBpcworCisJY3JlYXRlIEpQRUcgZGVjb21wcmVzc2lvbiBvYmplY3QKKwlzZXQgc291cmNlIHRvIHRhYmxlcy1vbmx5IGZpbGUKKwlqcGVnX3JlYWRfaGVhZGVyKCZjaW5mbywgRkFMU0UpOworCXNldCBzb3VyY2UgdG8gYWJicmV2aWF0ZWQgaW1hZ2UgZmlsZQorCWpwZWdfcmVhZF9oZWFkZXIoJmNpbmZvLCBUUlVFKTsKKwlzZXQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCisJanBlZ19zdGFydF9kZWNvbXByZXNzKCZjaW5mbyk7CisJcmVhZCBkYXRhLi4uCisJanBlZ19maW5pc2hfZGVjb21wcmVzcygmY2luZm8pOworCitJbiBzb21lIGNhc2VzLCB5b3UgbWF5IHdhbnQgdG8gcmVhZCBhIGZpbGUgd2l0aG91dCBrbm93aW5nIHdoZXRoZXIgaXQgY29udGFpbnMKK2FuIGltYWdlIG9yIGp1c3QgdGFibGVzLiAgSW4gdGhhdCBjYXNlLCBwYXNzIEZBTFNFIGFuZCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlCitmcm9tIGpwZWdfcmVhZF9oZWFkZXIoKTogaXQgd2lsbCBiZSBKUEVHX0hFQURFUl9PSyBpZiBhbiBpbWFnZSB3YXMgZm91bmQsCitKUEVHX0hFQURFUl9UQUJMRVNfT05MWSBpZiBvbmx5IHRhYmxlcyB3ZXJlIGZvdW5kLiAgKEEgdGhpcmQgcmV0dXJuIHZhbHVlLAorSlBFR19TVVNQRU5ERUQsIGlzIHBvc3NpYmxlIHdoZW4gdXNpbmcgYSBzdXNwZW5kaW5nIGRhdGEgc291cmNlIG1hbmFnZXIuKQorTm90ZSB0aGF0IGpwZWdfcmVhZF9oZWFkZXIoKSB3aWxsIG5vdCBjb21wbGFpbiBpZiB5b3UgcmVhZCBhbiBhYmJyZXZpYXRlZAoraW1hZ2UgZm9yIHdoaWNoIHlvdSBoYXZlbid0IGxvYWRlZCB0aGUgbWlzc2luZyB0YWJsZXM7IHRoZSBtaXNzaW5nLXRhYmxlIGNoZWNrCitvY2N1cnMgbGF0ZXIsIGluIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLgorCisKK0l0IGlzIHBvc3NpYmxlIHRvIHJlYWQgYSBzZXJpZXMgb2YgaW1hZ2VzIGZyb20gYSBzaW5nbGUgc291cmNlIGZpbGUgYnkKK3JlcGVhdGluZyB0aGUganBlZ19yZWFkX2hlYWRlcigpIC4uLiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzKCkgc2VxdWVuY2UsCit3aXRob3V0IHJlbGVhc2luZy9yZWNyZWF0aW5nIHRoZSBKUEVHIG9iamVjdCBvciB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLgorKElmIHlvdSBkaWQgcmVpbml0aWFsaXplLCBhbnkgcGFydGlhbCBidWZmZXJsb2FkIGxlZnQgaW4gdGhlIGRhdGEgc291cmNlCitidWZmZXIgYXQgdGhlIGVuZCBvZiBvbmUgaW1hZ2Ugd291bGQgYmUgZGlzY2FyZGVkLCBjYXVzaW5nIHlvdSB0byBsb3NlIHRoZQorc3RhcnQgb2YgdGhlIG5leHQgaW1hZ2UuKSAgV2hlbiB5b3UgdXNlIHRoaXMgbWV0aG9kLCBzdG9yZWQgdGFibGVzIGFyZQorYXV0b21hdGljYWxseSBjYXJyaWVkIGZvcndhcmQsIHNvIHNvbWUgb2YgdGhlIGltYWdlcyBjYW4gYmUgYWJicmV2aWF0ZWQgaW1hZ2VzCit0aGF0IGRlcGVuZCBvbiB0YWJsZXMgZnJvbSBlYXJsaWVyIGltYWdlcy4KKworSWYgeW91IGludGVuZCB0byB3cml0ZSBhIHNlcmllcyBvZiBpbWFnZXMgaW50byBhIHNpbmdsZSBkZXN0aW5hdGlvbiBmaWxlLAoreW91IG1pZ2h0IHdhbnQgdG8gbWFrZSBhIHNwZWNpYWxpemVkIGRhdGEgZGVzdGluYXRpb24gbW9kdWxlIHRoYXQgZG9lc24ndAorZmx1c2ggdGhlIG91dHB1dCBidWZmZXIgYXQgdGVybV9kZXN0aW5hdGlvbigpIHRpbWUuICBUaGlzIHdvdWxkIHNwZWVkIHRoaW5ncwordXAgYnkgc29tZSB0cmlmbGluZyBhbW91bnQuICBPZiBjb3Vyc2UsIHlvdSdkIG5lZWQgdG8gcmVtZW1iZXIgdG8gZmx1c2ggdGhlCitidWZmZXIgYWZ0ZXIgdGhlIGxhc3QgaW1hZ2UuICBZb3UgY2FuIG1ha2UgdGhlIGxhdGVyIGltYWdlcyBiZSBhYmJyZXZpYXRlZAorb25lcyBieSBwYXNzaW5nIEZBTFNFIHRvIGpwZWdfc3RhcnRfY29tcHJlc3MoKS4KKworCitTcGVjaWFsIG1hcmtlcnMKKy0tLS0tLS0tLS0tLS0tLQorCitTb21lIGFwcGxpY2F0aW9ucyBtYXkgbmVlZCB0byBpbnNlcnQgb3IgZXh0cmFjdCBzcGVjaWFsIGRhdGEgaW4gdGhlIEpQRUcKK2RhdGFzdHJlYW0uICBUaGUgSlBFRyBzdGFuZGFyZCBwcm92aWRlcyBtYXJrZXIgdHlwZXMgIkNPTSIgKGNvbW1lbnQpIGFuZAorIkFQUDAiIHRocm91Z2ggIkFQUDE1IiAoYXBwbGljYXRpb24pIHRvIGhvbGQgYXBwbGljYXRpb24tc3BlY2lmaWMgZGF0YS4KK1VuZm9ydHVuYXRlbHksIHRoZSB1c2Ugb2YgdGhlc2UgbWFya2VycyBpcyBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBzdGFuZGFyZC4KK0NPTSBtYXJrZXJzIGFyZSBmYWlybHkgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQuICBUaGUgSkZJRiBmaWxlCitmb3JtYXQgc3BlYyB1c2VzIEFQUDAgbWFya2VycyB3aXRoIHNwZWNpZmllZCBpbml0aWFsIHN0cmluZ3MgdG8gaG9sZCBjZXJ0YWluCitkYXRhLiAgQWRvYmUgYXBwbGljYXRpb25zIHVzZSBBUFAxNCBtYXJrZXJzIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcgIkFkb2JlIgorZm9yIG1pc2NlbGxhbmVvdXMgZGF0YS4gIE90aGVyIEFQUG4gbWFya2VycyBhcmUgcmFyZWx5IHNlZW4sIGJ1dCBtaWdodAorY29udGFpbiBhbG1vc3QgYW55dGhpbmcuCisKK0lmIHlvdSB3aXNoIHRvIHN0b3JlIHVzZXItc3VwcGxpZWQgdGV4dCwgd2UgcmVjb21tZW5kIHlvdSB1c2UgQ09NIG1hcmtlcnMKK2FuZCBwbGFjZSByZWFkYWJsZSA3LWJpdCBBU0NJSSB0ZXh0IGluIHRoZW0uICBOZXdsaW5lIGNvbnZlbnRpb25zIGFyZSBub3QKK3N0YW5kYXJkaXplZCAtLS0gZXhwZWN0IHRvIGZpbmQgTEYgKFVuaXggc3R5bGUpLCBDUi9MRiAoRE9TIHN0eWxlKSwgb3IgQ1IKKyhNYWMgc3R5bGUpLiAgQSByb2J1c3QgQ09NIHJlYWRlciBzaG91bGQgYmUgYWJsZSB0byBjb3BlIHdpdGggcmFuZG9tIGJpbmFyeQorZ2FyYmFnZSwgaW5jbHVkaW5nIG51bGxzLCBzaW5jZSBzb21lIGFwcGxpY2F0aW9ucyBnZW5lcmF0ZSBDT00gbWFya2VycworY29udGFpbmluZyBub24tQVNDSUkganVuay4gIChCdXQgeW91cnMgc2hvdWxkIG5vdCBiZSBvbmUgb2YgdGhlbS4pCisKK0ZvciBwcm9ncmFtLXN1cHBsaWVkIGRhdGEsIHVzZSBhbiBBUFBuIG1hcmtlciwgYW5kIGJlIHN1cmUgdG8gYmVnaW4gaXQgd2l0aCBhbgoraWRlbnRpZnlpbmcgc3RyaW5nIHNvIHRoYXQgeW91IGNhbiB0ZWxsIHdoZXRoZXIgdGhlIG1hcmtlciBpcyBhY3R1YWxseSB5b3Vycy4KK0l0J3MgcHJvYmFibHkgYmVzdCB0byBhdm9pZCB1c2luZyBBUFAwIG9yIEFQUDE0IGZvciBhbnkgcHJpdmF0ZSBtYXJrZXJzLgorKE5PVEU6IHRoZSB1cGNvbWluZyBTUElGRiBzdGFuZGFyZCB3aWxsIHVzZSBBUFA4IG1hcmtlcnM7IHdlIHJlY29tbWVuZCB5b3UKK25vdCB1c2UgQVBQOCBtYXJrZXJzIGZvciBhbnkgcHJpdmF0ZSBwdXJwb3NlcywgZWl0aGVyLikKKworS2VlcCBpbiBtaW5kIHRoYXQgYXQgbW9zdCA2NTUzMyBieXRlcyBjYW4gYmUgcHV0IGludG8gb25lIG1hcmtlciwgYnV0IHlvdQorY2FuIGhhdmUgYXMgbWFueSBtYXJrZXJzIGFzIHlvdSBsaWtlLgorCitCeSBkZWZhdWx0LCB0aGUgSUpHIGNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCB3cml0ZSBhIEpGSUYgQVBQMCBtYXJrZXIgaWYgdGhlCitzZWxlY3RlZCBKUEVHIGNvbG9yc3BhY2UgaXMgZ3JheXNjYWxlIG9yIFlDYkNyLCBvciBhbiBBZG9iZSBBUFAxNCBtYXJrZXIgaWYKK3RoZSBzZWxlY3RlZCBjb2xvcnNwYWNlIGlzIFJHQiwgQ01ZSywgb3IgWUNDSy4gIFlvdSBjYW4gZGlzYWJsZSB0aGlzLCBidXQKK3dlIGRvbid0IHJlY29tbWVuZCBpdC4gIFRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgd2lsbCByZWNvZ25pemUgSkZJRiBhbmQKK0Fkb2JlIG1hcmtlcnMgYW5kIHdpbGwgc2V0IHRoZSBKUEVHIGNvbG9yc3BhY2UgcHJvcGVybHkgd2hlbiBvbmUgaXMgZm91bmQuCisKKworWW91IGNhbiB3cml0ZSBzcGVjaWFsIG1hcmtlcnMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBkYXRhc3RyZWFtIGhlYWRlciBieQorY2FsbGluZyBqcGVnX3dyaXRlX21hcmtlcigpIGFmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQgYmVmb3JlIHRoZSBmaXJzdAorY2FsbCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgV2hlbiB5b3UgZG8gdGhpcywgdGhlIG1hcmtlcnMgYXBwZWFyIGFmdGVyCit0aGUgU09JIGFuZCB0aGUgSkZJRiBBUFAwIGFuZCBBZG9iZSBBUFAxNCBtYXJrZXJzIChpZiB3cml0dGVuKSwgYnV0IGJlZm9yZQorYWxsIGVsc2UuICBTcGVjaWZ5IHRoZSBtYXJrZXIgdHlwZSBwYXJhbWV0ZXIgYXMgIkpQRUdfQ09NIiBmb3IgQ09NIG9yCisiSlBFR19BUFAwICsgbiIgZm9yIEFQUG4uICAoQWN0dWFsbHksIGpwZWdfd3JpdGVfbWFya2VyIHdpbGwgbGV0IHlvdSB3cml0ZQorYW55IG1hcmtlciB0eXBlLCBidXQgd2UgZG9uJ3QgcmVjb21tZW5kIHdyaXRpbmcgYW55IG90aGVyIGtpbmRzIG9mIG1hcmtlci4pCitGb3IgZXhhbXBsZSwgdG8gd3JpdGUgYSB1c2VyIGNvbW1lbnQgc3RyaW5nIHBvaW50ZWQgdG8gYnkgY29tbWVudF90ZXh0OgorCWpwZWdfd3JpdGVfbWFya2VyKGNpbmZvLCBKUEVHX0NPTSwgY29tbWVudF90ZXh0LCBzdHJsZW4oY29tbWVudF90ZXh0KSk7CisKK0lmIGl0J3Mgbm90IGNvbnZlbmllbnQgdG8gc3RvcmUgYWxsIHRoZSBtYXJrZXIgZGF0YSBpbiBtZW1vcnkgYXQgb25jZSwKK3lvdSBjYW4gaW5zdGVhZCBjYWxsIGpwZWdfd3JpdGVfbV9oZWFkZXIoKSBmb2xsb3dlZCBieSBtdWx0aXBsZSBjYWxscyB0bworanBlZ193cml0ZV9tX2J5dGUoKS4gIElmIHlvdSBkbyBpdCB0aGlzIHdheSwgaXQncyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvCitjYWxsIGpwZWdfd3JpdGVfbV9ieXRlKCkgZXhhY3RseSB0aGUgbnVtYmVyIG9mIHRpbWVzIGdpdmVuIGluIHRoZSBsZW5ndGgKK3BhcmFtZXRlciB0byBqcGVnX3dyaXRlX21faGVhZGVyKCkuICAoVGhpcyBtZXRob2QgbGV0cyB5b3UgZW1wdHkgdGhlCitvdXRwdXQgYnVmZmVyIHBhcnR3YXkgdGhyb3VnaCBhIG1hcmtlciwgd2hpY2ggbWlnaHQgYmUgaW1wb3J0YW50IHdoZW4KK3VzaW5nIGEgc3VzcGVuZGluZyBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZS4gIEluIGFueSBjYXNlLCBpZiB5b3UgYXJlIHVzaW5nCithIHN1c3BlbmRpbmcgZGVzdGluYXRpb24sIHlvdSBzaG91bGQgZmx1c2ggaXRzIGJ1ZmZlciBhZnRlciBpbnNlcnRpbmcKK2FueSBzcGVjaWFsIG1hcmtlcnMuICBTZWUgIkkvTyBzdXNwZW5zaW9uIi4pCisKK09yLCBpZiB5b3UgcHJlZmVyIHRvIHN5bnRoZXNpemUgdGhlIG1hcmtlciBieXRlIHNlcXVlbmNlIHlvdXJzZWxmLAoreW91IGNhbiBqdXN0IGNyYW0gaXQgc3RyYWlnaHQgaW50byB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuCisKK0lmIHlvdSBhcmUgd3JpdGluZyBKRklGIDEuMDIgZXh0ZW5zaW9uIG1hcmtlcnMgKHRodW1ibmFpbCBpbWFnZXMpLCBkb24ndAorZm9yZ2V0IHRvIHNldCBjaW5mby5KRklGX21pbm9yX3ZlcnNpb24gPSAyIHNvIHRoYXQgdGhlIGVuY29kZXIgd2lsbCB3cml0ZSB0aGUKK2NvcnJlY3QgSkZJRiB2ZXJzaW9uIG51bWJlciBpbiB0aGUgSkZJRiBoZWFkZXIgbWFya2VyLiAgVGhlIGxpYnJhcnkncyBkZWZhdWx0CitpcyB0byB3cml0ZSB2ZXJzaW9uIDEuMDEsIGJ1dCB0aGF0J3Mgd3JvbmcgaWYgeW91IGluc2VydCBhbnkgMS4wMiBleHRlbnNpb24KK21hcmtlcnMuICAoV2UgY291bGQgcHJvYmFibHkgZ2V0IGF3YXkgd2l0aCBqdXN0IGRlZmF1bHRpbmcgdG8gMS4wMiwgYnV0IHRoZXJlCit1c2VkIHRvIGJlIGJyb2tlbiBkZWNvZGVycyB0aGF0IHdvdWxkIGNvbXBsYWluIGFib3V0IHVua25vd24gbWlub3IgdmVyc2lvbgorbnVtYmVycy4gIFRvIHJlZHVjZSBjb21wYXRpYmlsaXR5IHJpc2tzIGl0J3Mgc2FmZXN0IG5vdCB0byB3cml0ZSAxLjAyIHVubGVzcworeW91IGFyZSBhY3R1YWxseSB1c2luZyAxLjAyIGV4dGVuc2lvbnMuKQorCisKK1doZW4gcmVhZGluZywgdHdvIG1ldGhvZHMgb2YgaGFuZGxpbmcgc3BlY2lhbCBtYXJrZXJzIGFyZSBhdmFpbGFibGU6CisxLiBZb3UgY2FuIGFzayB0aGUgbGlicmFyeSB0byBzYXZlIHRoZSBjb250ZW50cyBvZiBDT00gYW5kL29yIEFQUG4gbWFya2VycworaW50byBtZW1vcnksIGFuZCB0aGVuIGV4YW1pbmUgdGhlbSBhdCB5b3VyIGxlaXN1cmUgYWZ0ZXJ3YXJkcy4KKzIuIFlvdSBjYW4gc3VwcGx5IHlvdXIgb3duIHJvdXRpbmUgdG8gcHJvY2VzcyBDT00gYW5kL29yIEFQUG4gbWFya2Vycworb24tdGhlLWZseSBhcyB0aGV5IGFyZSByZWFkLgorVGhlIGZpcnN0IG1ldGhvZCBpcyBzaW1wbGVyIHRvIHVzZSwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIGEgc3VzcGVuZGluZworZGF0YSBzb3VyY2U7IHdyaXRpbmcgYSBtYXJrZXIgcHJvY2Vzc29yIHRoYXQgY29wZXMgd2l0aCBpbnB1dCBzdXNwZW5zaW9uIGlzCitub3QgZWFzeSAoY29uc2lkZXIgd2hhdCBoYXBwZW5zIGlmIHRoZSBtYXJrZXIgaXMgbG9uZ2VyIHRoYW4geW91ciBhdmFpbGFibGUKK2lucHV0IGJ1ZmZlcikuICBIb3dldmVyLCB0aGUgc2Vjb25kIG1ldGhvZCBjb25zZXJ2ZXMgbWVtb3J5IHNpbmNlIHRoZSBtYXJrZXIKK2RhdGEgbmVlZCBub3QgYmUga2VwdCBhcm91bmQgYWZ0ZXIgaXQncyBiZWVuIHByb2Nlc3NlZC4KKworRm9yIGVpdGhlciBtZXRob2QsIHlvdSdkIG5vcm1hbGx5IHNldCB1cCBtYXJrZXIgaGFuZGxpbmcgYWZ0ZXIgY3JlYXRpbmcgYQorZGVjb21wcmVzc2lvbiBvYmplY3QgYW5kIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIoKSwgYmVjYXVzZSB0aGUKK21hcmtlcnMgb2YgaW50ZXJlc3Qgd2lsbCB0eXBpY2FsbHkgYmUgbmVhciB0aGUgaGVhZCBvZiB0aGUgZmlsZSBhbmQgc28gd2lsbAorYmUgc2Nhbm5lZCBieSBqcGVnX3JlYWRfaGVhZGVyLiAgT25jZSB5b3UndmUgZXN0YWJsaXNoZWQgYSBtYXJrZXIgaGFuZGxpbmcKK21ldGhvZCwgaXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbGlmZSBvZiB0aGF0IGRlY29tcHJlc3Npb24gb2JqZWN0CisocG90ZW50aWFsbHkgbWFueSBkYXRhc3RyZWFtcyksIHVubGVzcyB5b3UgY2hhbmdlIGl0LiAgTWFya2VyIGhhbmRsaW5nIGlzCitkZXRlcm1pbmVkIHNlcGFyYXRlbHkgZm9yIENPTSBtYXJrZXJzIGFuZCBmb3IgZWFjaCBBUFBuIG1hcmtlciBjb2RlLgorCisKK1RvIHNhdmUgdGhlIGNvbnRlbnRzIG9mIHNwZWNpYWwgbWFya2VycyBpbiBtZW1vcnksIGNhbGwKKwlqcGVnX3NhdmVfbWFya2VycyhjaW5mbywgbWFya2VyX2NvZGUsIGxlbmd0aF9saW1pdCkKK3doZXJlIG1hcmtlcl9jb2RlIGlzIHRoZSBtYXJrZXIgdHlwZSB0byBzYXZlLCBKUEVHX0NPTSBvciBKUEVHX0FQUDArbi4KKyhUbyBhcnJhbmdlIHRvIHNhdmUgYWxsIHRoZSBzcGVjaWFsIG1hcmtlciB0eXBlcywgeW91IG5lZWQgdG8gY2FsbCB0aGlzCityb3V0aW5lIDE3IHRpbWVzLCBmb3IgQ09NIGFuZCBBUFAwLUFQUDE1LikgIElmIHRoZSBpbmNvbWluZyBtYXJrZXIgaXMgbG9uZ2VyCit0aGFuIGxlbmd0aF9saW1pdCBkYXRhIGJ5dGVzLCBvbmx5IGxlbmd0aF9saW1pdCBieXRlcyB3aWxsIGJlIHNhdmVkOyB0aGlzCitwYXJhbWV0ZXIgYWxsb3dzIHlvdSB0byBhdm9pZCBjaGV3aW5nIHVwIG1lbW9yeSB3aGVuIHlvdSBvbmx5IG5lZWQgdG8gc2VlIHRoZQorZmlyc3QgZmV3IGJ5dGVzIG9mIGEgcG90ZW50aWFsbHkgbGFyZ2UgbWFya2VyLiAgSWYgeW91IHdhbnQgdG8gc2F2ZSBhbGwgdGhlCitkYXRhLCBzZXQgbGVuZ3RoX2xpbWl0IHRvIDB4RkZGRjsgdGhhdCBpcyBlbm91Z2ggc2luY2UgbWFya2VyIGxlbmd0aHMgYXJlIG9ubHkKKzE2IGJpdHMuICBBcyBhIHNwZWNpYWwgY2FzZSwgc2V0dGluZyBsZW5ndGhfbGltaXQgdG8gMCBwcmV2ZW50cyB0aGF0IG1hcmtlcgordHlwZSBmcm9tIGJlaW5nIHNhdmVkIGF0IGFsbC4gIChUaGF0IGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBpbiBmYWN0LikKKworQWZ0ZXIganBlZ19yZWFkX2hlYWRlcigpIGNvbXBsZXRlcywgeW91IGNhbiBleGFtaW5lIHRoZSBzcGVjaWFsIG1hcmtlcnMgYnkKK2ZvbGxvd2luZyB0aGUgY2luZm8tPm1hcmtlcl9saXN0IHBvaW50ZXIgY2hhaW4uICBBbGwgdGhlIHNwZWNpYWwgbWFya2VycyBpbgordGhlIGZpbGUgYXBwZWFyIGluIHRoaXMgbGlzdCwgaW4gb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgZmlsZSAoYnV0CitvbWl0dGluZyBhbnkgbWFya2VycyBvZiB0eXBlcyB5b3UgZGlkbid0IGFzayBmb3IpLiAgQm90aCB0aGUgb3JpZ2luYWwgZGF0YQorbGVuZ3RoIGFuZCB0aGUgc2F2ZWQgZGF0YSBsZW5ndGggYXJlIHJlY29yZGVkIGZvciBlYWNoIGxpc3QgZW50cnk7IHRoZSBsYXR0ZXIKK3dpbGwgbm90IGV4Y2VlZCBsZW5ndGhfbGltaXQgZm9yIHRoZSBwYXJ0aWN1bGFyIG1hcmtlciB0eXBlLiAgTm90ZSB0aGF0IHRoZXNlCitsZW5ndGhzIGV4Y2x1ZGUgdGhlIG1hcmtlciBsZW5ndGggd29yZCwgd2hlcmVhcyB0aGUgc3RvcmVkIHJlcHJlc2VudGF0aW9uCit3aXRoaW4gdGhlIEpQRUcgZmlsZSBpbmNsdWRlcyBpdC4gIChIZW5jZSB0aGUgbWF4aW11bSBkYXRhIGxlbmd0aCBpcyByZWFsbHkKK29ubHkgNjU1MzMuKQorCitJdCBpcyBwb3NzaWJsZSB0aGF0IGFkZGl0aW9uYWwgc3BlY2lhbCBtYXJrZXJzIGFwcGVhciBpbiB0aGUgZmlsZSBiZXlvbmQgdGhlCitTT1MgbWFya2VyIGF0IHdoaWNoIGpwZWdfcmVhZF9oZWFkZXIgc3RvcHM7IGlmIHNvLCB0aGUgbWFya2VyIGxpc3Qgd2lsbCBiZQorZXh0ZW5kZWQgZHVyaW5nIHJlYWRpbmcgb2YgdGhlIHJlc3Qgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG5vdCBleHBlY3RlZCB0byBiZQorY29tbW9uLCBob3dldmVyLiAgSWYgeW91IGFyZSBzaG9ydCBvbiBtZW1vcnkgeW91IG1heSB3YW50IHRvIHJlc2V0IHRoZSBsZW5ndGgKK2xpbWl0IHRvIHplcm8gZm9yIGFsbCBtYXJrZXIgdHlwZXMgYWZ0ZXIgZmluaXNoaW5nIGpwZWdfcmVhZF9oZWFkZXIsIHRvCitlbnN1cmUgdGhhdCB0aGUgbWF4X21lbW9yeV90b191c2Ugc2V0dGluZyBjYW5ub3QgYmUgZXhjZWVkZWQgZHVlIHRvIGFkZGl0aW9uCitvZiBsYXRlciBtYXJrZXJzLgorCitUaGUgbWFya2VyIGxpc3QgcmVtYWlucyBzdG9yZWQgdW50aWwgeW91IGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcyBvcgoranBlZ19hYm9ydCwgYXQgd2hpY2ggcG9pbnQgdGhlIG1lbW9yeSBpcyBmcmVlZCBhbmQgdGhlIGxpc3QgaXMgc2V0IHRvIGVtcHR5LgorKGpwZWdfZGVzdHJveSBhbHNvIHJlbGVhc2VzIHRoZSBzdG9yYWdlLCBvZiBjb3Vyc2UuKQorCitOb3RlIHRoYXQgdGhlIGxpYnJhcnkgaXMgaW50ZXJuYWxseSBpbnRlcmVzdGVkIGluIEFQUDAgYW5kIEFQUDE0IG1hcmtlcnM7CitpZiB5b3UgdHJ5IHRvIHNldCBhIHNtYWxsIG5vbnplcm8gbGVuZ3RoIGxpbWl0IG9uIHRoZXNlIHR5cGVzLCB0aGUgbGlicmFyeQord2lsbCBzaWxlbnRseSBmb3JjZSB0aGUgbGVuZ3RoIHVwIHRvIHRoZSBtaW5pbXVtIGl0IHdhbnRzLiAgKEJ1dCB5b3UgY2FuIHNldAorYSB6ZXJvIGxlbmd0aCBsaW1pdCB0byBwcmV2ZW50IHRoZW0gZnJvbSBiZWluZyBzYXZlZCBhdCBhbGwuKSAgQWxzbywgaW4gYQorMTYtYml0IGVudmlyb25tZW50LCB0aGUgbWF4aW11bSBsZW5ndGggbGltaXQgbWF5IGJlIGNvbnN0cmFpbmVkIHRvIGxlc3MgdGhhbgorNjU1MzMgYnkgbWFsbG9jKCkgbGltaXRhdGlvbnMuICBJdCBpcyB0aGVyZWZvcmUgYmVzdCBub3QgdG8gYXNzdW1lIHRoYXQgdGhlCitlZmZlY3RpdmUgbGVuZ3RoIGxpbWl0IGlzIGV4YWN0bHkgd2hhdCB5b3Ugc2V0IGl0IHRvIGJlLgorCisKK0lmIHlvdSB3YW50IHRvIHN1cHBseSB5b3VyIG93biBtYXJrZXItcmVhZGluZyByb3V0aW5lLCB5b3UgZG8gaXQgYnkgY2FsbGluZworanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcigpLiAgQSBtYXJrZXIgcHJvY2Vzc29yIHJvdXRpbmUgbXVzdCBoYXZlIHRoZQorc2lnbmF0dXJlCisJYm9vbGVhbiBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQorQWx0aG91Z2ggdGhlIG1hcmtlciBjb2RlIGlzIG5vdCBleHBsaWNpdGx5IHBhc3NlZCwgdGhlIHJvdXRpbmUgY2FuIGZpbmQgaXQKK2luIGNpbmZvLT51bnJlYWRfbWFya2VyLiAgQXQgdGhlIHRpbWUgb2YgY2FsbCwgdGhlIG1hcmtlciBwcm9wZXIgaGFzIGJlZW4KK3JlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLiAgVGhlIHByb2Nlc3NvciByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvcgorcmVhZGluZyB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGFuZCB0aGUgcmVtYWluaW5nIHBhcmFtZXRlciBieXRlcywgaWYgYW55LgorUmV0dXJuIFRSVUUgdG8gaW5kaWNhdGUgc3VjY2Vzcy4gIChGQUxTRSBzaG91bGQgYmUgcmV0dXJuZWQgb25seSBpZiB5b3UgYXJlCit1c2luZyBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgYW5kIGl0IHRlbGxzIHlvdSB0byBzdXNwZW5kLiAgU2VlIHRoZSBzdGFuZGFyZAorbWFya2VyIHByb2Nlc3NvcnMgaW4gamRtYXJrZXIuYyBmb3IgYXBwcm9wcmlhdGUgY29kaW5nIG1ldGhvZHMgaWYgeW91IG5lZWQgdG8KK3VzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UuKQorCitJZiB5b3Ugb3ZlcnJpZGUgdGhlIGRlZmF1bHQgQVBQMCBvciBBUFAxNCBwcm9jZXNzb3JzLCBpdCBpcyB1cCB0byB5b3UgdG8KK3JlY29nbml6ZSBKRklGIGFuZCBBZG9iZSBtYXJrZXJzIGlmIHlvdSB3YW50IGNvbG9yc3BhY2UgcmVjb2duaXRpb24gdG8gb2NjdXIKK3Byb3Blcmx5LiAgV2UgcmVjb21tZW5kIGNvcHlpbmcgYW5kIGV4dGVuZGluZyB0aGUgZGVmYXVsdCBwcm9jZXNzb3JzIGlmIHlvdQord2FudCB0byBkbyB0aGF0LiAgKEEgYmV0dGVyIGlkZWEgaXMgdG8gc2F2ZSB0aGVzZSBtYXJrZXIgdHlwZXMgZm9yIGxhdGVyCitleGFtaW5hdGlvbiBieSBjYWxsaW5nIGpwZWdfc2F2ZV9tYXJrZXJzKCk7IHRoYXQgbWV0aG9kIGRvZXNuJ3QgaW50ZXJmZXJlCit3aXRoIHRoZSBsaWJyYXJ5J3Mgb3duIHByb2Nlc3Npbmcgb2YgdGhlc2UgbWFya2Vycy4pCisKK2pwZWdfc2V0X21hcmtlcl9wcm9jZXNzb3IoKSBhbmQganBlZ19zYXZlX21hcmtlcnMoKSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCistLS0gaWYgeW91IGNhbGwgb25lIGl0IG92ZXJyaWRlcyBhbnkgcHJldmlvdXMgY2FsbCB0byB0aGUgb3RoZXIsIGZvciB0aGUKK3BhcnRpY3VsYXIgbWFya2VyIHR5cGUgc3BlY2lmaWVkLgorCitBIHNpbXBsZSBleGFtcGxlIG9mIGFuIGV4dGVybmFsIENPTSBwcm9jZXNzb3IgY2FuIGJlIGZvdW5kIGluIGRqcGVnLmMuCitBbHNvLCBzZWUganBlZ3RyYW4uYyBmb3IgYW4gZXhhbXBsZSBvZiB1c2luZyBqcGVnX3NhdmVfbWFya2Vycy4KKworCitSYXcgKGRvd25zYW1wbGVkKSBpbWFnZSBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgYXBwbGljYXRpb25zIG5lZWQgdG8gc3VwcGx5IGFscmVhZHktZG93bnNhbXBsZWQgaW1hZ2UgZGF0YSB0byB0aGUgSlBFRworY29tcHJlc3Nvciwgb3IgdG8gcmVjZWl2ZSByYXcgZG93bnNhbXBsZWQgZGF0YSBmcm9tIHRoZSBkZWNvbXByZXNzb3IuICBUaGUKK2xpYnJhcnkgc3VwcG9ydHMgdGhpcyByZXF1aXJlbWVudCBieSBhbGxvd2luZyB0aGUgYXBwbGljYXRpb24gdG8gd3JpdGUgb3IKK3JlYWQgcmF3IGRhdGEsIGJ5cGFzc2luZyB0aGUgbm9ybWFsIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgc3RlcHMuCitUaGUgaW50ZXJmYWNlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzdGFuZGFyZCBvbmUgYW5kIGlzIHNvbWV3aGF0IGhhcmRlciB0bwordXNlLiAgSWYgeW91ciBpbnRlcmVzdCBpcyBtZXJlbHkgaW4gYnlwYXNzaW5nIGNvbG9yIGNvbnZlcnNpb24sIHdlIHJlY29tbWVuZAordGhhdCB5b3UgdXNlIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UgYW5kIHNpbXBseSBzZXQganBlZ19jb2xvcl9zcGFjZSA9Citpbl9jb2xvcl9zcGFjZSAob3IganBlZ19jb2xvcl9zcGFjZSA9IG91dF9jb2xvcl9zcGFjZSBmb3IgZGVjb21wcmVzc2lvbikuCitUaGUgbWVjaGFuaXNtIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gaXMgbmVjZXNzYXJ5IG9ubHkgdG8gc3VwcGx5IG9yCityZWNlaXZlIGRvd25zYW1wbGVkIGltYWdlIGRhdGEsIGluIHdoaWNoIG5vdCBhbGwgY29tcG9uZW50cyBoYXZlIHRoZSBzYW1lCitkaW1lbnNpb25zLgorCisKK1RvIGNvbXByZXNzIHJhdyBkYXRhLCB5b3UgbXVzdCBzdXBwbHkgdGhlIGRhdGEgaW4gdGhlIGNvbG9yc3BhY2UgdG8gYmUgdXNlZAoraW4gdGhlIEpQRUcgZmlsZSAocGxlYXNlIHJlYWQgdGhlIGVhcmxpZXIgc2VjdGlvbiBvbiBTcGVjaWFsIGNvbG9yIHNwYWNlcykKK2FuZCBkb3duc2FtcGxlZCB0byB0aGUgc2FtcGxpbmcgZmFjdG9ycyBzcGVjaWZpZWQgaW4gdGhlIEpQRUcgcGFyYW1ldGVycy4KK1lvdSBtdXN0IHN1cHBseSB0aGUgZGF0YSBpbiB0aGUgZm9ybWF0IHVzZWQgaW50ZXJuYWxseSBieSB0aGUgSlBFRyBsaWJyYXJ5LAorbmFtZWx5IGEgSlNBTVBJTUFHRSBhcnJheS4gIFRoaXMgaXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdHdvLWRpbWVuc2lvbmFsCithcnJheXMsIGVhY2ggb2YgdHlwZSBKU0FNUEFSUkFZLiAgRWFjaCAyLUQgYXJyYXkgaG9sZHMgdGhlIHZhbHVlcyBmb3Igb25lCitjb2xvciBjb21wb25lbnQuICBUaGlzIHN0cnVjdHVyZSBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIGNvbXBvbmVudHMgYXJlIG9mCitkaWZmZXJlbnQgc2l6ZXMuICBJZiB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgbm90IGEgbXVsdGlwbGUgb2YgdGhlIE1DVSBzaXplLAoreW91IG11c3QgYWxzbyBwYWQgdGhlIGRhdGEgY29ycmVjdGx5ICh1c3VhbGx5LCB0aGlzIGlzIGRvbmUgYnkgcmVwbGljYXRpbmcKK3RoZSBsYXN0IGNvbHVtbiBhbmQvb3Igcm93KS4gIFRoZSBkYXRhIG11c3QgYmUgcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgYSBEQ1QKK2Jsb2NrIGluIGVhY2ggY29tcG9uZW50OiB0aGF0IGlzLCBlYWNoIGRvd25zYW1wbGVkIHJvdyBtdXN0IGNvbnRhaW4gYQorbXVsdGlwbGUgb2YgOCB2YWxpZCBzYW1wbGVzLCBhbmQgdGhlcmUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDggc2FtcGxlIHJvd3MKK2ZvciBlYWNoIGNvbXBvbmVudC4gIChGb3IgYXBwbGljYXRpb25zIHN1Y2ggYXMgY29udmVyc2lvbiBvZiBkaWdpdGFsIFRWCitpbWFnZXMsIHRoZSBzdGFuZGFyZCBpbWFnZSBzaXplIGlzIHVzdWFsbHkgYSBtdWx0aXBsZSBvZiB0aGUgRENUIGJsb2NrIHNpemUsCitzbyB0aGF0IG5vIHBhZGRpbmcgbmVlZCBhY3R1YWxseSBiZSBkb25lLikKKworVGhlIHByb2NlZHVyZSBmb3IgY29tcHJlc3Npb24gb2YgcmF3IGRhdGEgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIG5vcm1hbAorY29tcHJlc3Npb24sIGV4Y2VwdCB0aGF0IHlvdSBjYWxsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZgoranBlZ193cml0ZV9zY2FubGluZXMoKS4gIEJlZm9yZSBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MoKSwgeW91IG11c3QgZG8KK3RoZSBmb2xsb3dpbmc6CisgICogU2V0IGNpbmZvLT5yYXdfZGF0YV9pbiB0byBUUlVFLiAgKEl0IGlzIHNldCBGQUxTRSBieSBqcGVnX3NldF9kZWZhdWx0cygpLikKKyAgICBUaGlzIG5vdGlmaWVzIHRoZSBsaWJyYXJ5IHRoYXQgeW91IHdpbGwgYmUgc3VwcGx5aW5nIHJhdyBkYXRhLgorICAqIEVuc3VyZSBqcGVnX2NvbG9yX3NwYWNlIGlzIGNvcnJlY3QgLS0tIGFuIGV4cGxpY2l0IGpwZWdfc2V0X2NvbG9yc3BhY2UoKQorICAgIGNhbGwgaXMgYSBnb29kIGlkZWEuICBOb3RlIHRoYXQgc2luY2UgY29sb3IgY29udmVyc2lvbiBpcyBieXBhc3NlZCwKKyAgICBpbl9jb2xvcl9zcGFjZSBpcyBpZ25vcmVkLCBleGNlcHQgdGhhdCBqcGVnX3NldF9kZWZhdWx0cygpIHVzZXMgaXQgdG8KKyAgICBjaG9vc2UgdGhlIGRlZmF1bHQganBlZ19jb2xvcl9zcGFjZSBzZXR0aW5nLgorICAqIEVuc3VyZSB0aGUgc2FtcGxpbmcgZmFjdG9ycywgY2luZm8tPmNvbXBfaW5mb1tpXS5oX3NhbXBfZmFjdG9yIGFuZAorICAgIGNpbmZvLT5jb21wX2luZm9baV0udl9zYW1wX2ZhY3RvciwgYXJlIGNvcnJlY3QuICBTaW5jZSB0aGVzZSBpbmRpY2F0ZSB0aGUKKyAgICBkaW1lbnNpb25zIG9mIHRoZSBkYXRhIHlvdSBhcmUgc3VwcGx5aW5nLCBpdCdzIHdpc2UgdG8gc2V0IHRoZW0KKyAgICBleHBsaWNpdGx5LCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgbGlicmFyeSdzIGRlZmF1bHRzIGFyZSB3aGF0IHlvdSB3YW50LgorCitUbyBwYXNzIHJhdyBkYXRhIHRvIHRoZSBsaWJyYXJ5LCBjYWxsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSBpbiBwbGFjZSBvZgoranBlZ193cml0ZV9zY2FubGluZXMoKS4gIFRoZSB0d28gcm91dGluZXMgd29yayBzaW1pbGFybHkgZXhjZXB0IHRoYXQKK2pwZWdfd3JpdGVfcmF3X2RhdGEgdGFrZXMgYSBKU0FNUElNQUdFIGRhdGEgYXJyYXkgcmF0aGVyIHRoYW4gSlNBTVBBUlJBWS4KK1RoZSBzY2FubGluZXMgY291bnQgcGFzc2VkIHRvIGFuZCByZXR1cm5lZCBmcm9tIGpwZWdfd3JpdGVfcmF3X2RhdGEgaXMKK21lYXN1cmVkIGluIHRlcm1zIG9mIHRoZSBjb21wb25lbnQgd2l0aCB0aGUgbGFyZ2VzdCB2X3NhbXBfZmFjdG9yLgorCitqcGVnX3dyaXRlX3Jhd19kYXRhKCkgcHJvY2Vzc2VzIG9uZSBNQ1Ugcm93IHBlciBjYWxsLCB3aGljaCBpcyB0byBzYXkKK3Zfc2FtcF9mYWN0b3IqRENUU0laRSBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFRoZSBwYXNzZWQgbnVtX2xpbmVzCit2YWx1ZSBtdXN0IGJlIGF0IGxlYXN0IG1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwKK2JlIGV4YWN0bHkgdGhhdCBhbW91bnQgKG9yIHBvc3NpYmx5IHNvbWUgbXVsdGlwbGUgb2YgdGhhdCBhbW91bnQsIGluIGZ1dHVyZQorbGlicmFyeSB2ZXJzaW9ucykuICBUaGlzIGlzIHRydWUgZXZlbiBvbiB0aGUgbGFzdCBjYWxsIGF0IHRoZSBib3R0b20gb2YgdGhlCitpbWFnZTsgZG9uJ3QgZm9yZ2V0IHRvIHBhZCB5b3VyIGRhdGEgYXMgbmVjZXNzYXJ5LgorCitUaGUgcmVxdWlyZWQgZGltZW5zaW9ucyBvZiB0aGUgc3VwcGxpZWQgZGF0YSBjYW4gYmUgY29tcHV0ZWQgZm9yIGVhY2gKK2NvbXBvbmVudCBhcworCWNpbmZvLT5jb21wX2luZm9baV0ud2lkdGhfaW5fYmxvY2tzKkRDVFNJWkUgIHNhbXBsZXMgcGVyIHJvdworCWNpbmZvLT5jb21wX2luZm9baV0uaGVpZ2h0X2luX2Jsb2NrcypEQ1RTSVpFIHJvd3MgaW4gaW1hZ2UKK2FmdGVyIGpwZWdfc3RhcnRfY29tcHJlc3MoKSBoYXMgaW5pdGlhbGl6ZWQgdGhvc2UgZmllbGRzLiAgSWYgdGhlIHZhbGlkIGRhdGEKK2lzIHNtYWxsZXIgdGhhbiB0aGlzLCBpdCBtdXN0IGJlIHBhZGRlZCBhcHByb3ByaWF0ZWx5LiAgRm9yIHNvbWUgc2FtcGxpbmcKK2ZhY3RvcnMgYW5kIGltYWdlIHNpemVzLCBhZGRpdGlvbmFsIGR1bW15IERDVCBibG9ja3MgYXJlIGluc2VydGVkIHRvIG1ha2UKK3RoZSBpbWFnZSBhIG11bHRpcGxlIG9mIHRoZSBNQ1UgZGltZW5zaW9ucy4gIFRoZSBsaWJyYXJ5IGNyZWF0ZXMgc3VjaCBkdW1teQorYmxvY2tzIGl0c2VsZjsgaXQgZG9lcyBub3QgcmVhZCB0aGVtIGZyb20geW91ciBzdXBwbGllZCBkYXRhLiAgVGhlcmVmb3JlIHlvdQorbmVlZCBuZXZlciBwYWQgYnkgbW9yZSB0aGFuIERDVFNJWkUgc2FtcGxlcy4gIEFuIGV4YW1wbGUgbWF5IGhlbHAgaGVyZS4KK0Fzc3VtZSAyaDJ2IGRvd25zYW1wbGluZyBvZiBZQ2JDciBkYXRhLCB0aGF0IGlzCisJY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yID0gMgkJZm9yIFkKKwljaW5mby0+Y29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAyCisJY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMQkJZm9yIENiCisJY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMQorCWNpbmZvLT5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDEJCWZvciBDcgorCWNpbmZvLT5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDEKK2FuZCBzdXBwb3NlIHRoYXQgdGhlIG5vbWluYWwgaW1hZ2UgZGltZW5zaW9ucyAoY2luZm8tPmltYWdlX3dpZHRoIGFuZAorY2luZm8tPmltYWdlX2hlaWdodCkgYXJlIDEwMXgxMDEgcGl4ZWxzLiAgVGhlbiBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgd2lsbAorY29tcHV0ZSBkb3duc2FtcGxlZF93aWR0aCA9IDEwMSBhbmQgd2lkdGhfaW5fYmxvY2tzID0gMTMgZm9yIFksCitkb3duc2FtcGxlZF93aWR0aCA9IDUxIGFuZCB3aWR0aF9pbl9ibG9ja3MgPSA3IGZvciBDYiBhbmQgQ3IgKGFuZCB0aGUgc2FtZQorZm9yIHRoZSBoZWlnaHQgZmllbGRzKS4gIFlvdSBtdXN0IHBhZCB0aGUgWSBkYXRhIHRvIGF0IGxlYXN0IDEzKjggPSAxMDQKK2NvbHVtbnMgYW5kIHJvd3MsIHRoZSBDYi9DciBkYXRhIHRvIGF0IGxlYXN0IDcqOCA9IDU2IGNvbHVtbnMgYW5kIHJvd3MuICBUaGUKK01DVSBoZWlnaHQgaXMgbWF4X3Zfc2FtcF9mYWN0b3IgPSAyIERDVCByb3dzIHNvIHlvdSBtdXN0IHBhc3MgYXQgbGVhc3QgMTYKK3NjYW5saW5lcyBvbiBlYWNoIGNhbGwgdG8ganBlZ193cml0ZV9yYXdfZGF0YSgpLCB3aGljaCBpcyB0byBzYXkgMTYgYWN0dWFsCitzYW1wbGUgcm93cyBvZiBZIGFuZCA4IGVhY2ggb2YgQ2IgYW5kIENyLiAgQSB0b3RhbCBvZiA3IE1DVSByb3dzIGFyZSBuZWVkZWQsCitzbyB5b3UgbXVzdCBwYXNzIGEgdG90YWwgb2YgNyoxNiA9IDExMiAic2NhbmxpbmVzIi4gIFRoZSBsYXN0IERDVCBibG9jayByb3cKK29mIFkgZGF0YSBpcyBkdW1teSwgc28gaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB5b3UgcGFzcyBmb3IgaXQgaW4gdGhlIGRhdGEKK2FycmF5cywgYnV0IHRoZSBzY2FubGluZXMgY291bnQgbXVzdCB0b3RhbCB1cCB0byAxMTIgc28gdGhhdCBhbGwgb2YgdGhlIENiCithbmQgQ3IgZGF0YSBnZXRzIHBhc3NlZC4KKworT3V0cHV0IHN1c3BlbnNpb24gaXMgc3VwcG9ydGVkIHdpdGggcmF3LWRhdGEgY29tcHJlc3Npb246IGlmIHRoZSBkYXRhCitkZXN0aW5hdGlvbiBtb2R1bGUgc3VzcGVuZHMsIGpwZWdfd3JpdGVfcmF3X2RhdGEoKSB3aWxsIHJldHVybiAwLgorSW4gdGhpcyBjYXNlIHRoZSBzYW1lIGRhdGEgcm93cyBtdXN0IGJlIHBhc3NlZCBhZ2FpbiBvbiB0aGUgbmV4dCBjYWxsLgorCisKK0RlY29tcHJlc3Npb24gd2l0aCByYXcgZGF0YSBvdXRwdXQgaW1wbGllcyBieXBhc3NpbmcgYWxsIHBvc3Rwcm9jZXNzaW5nOgoreW91IGNhbm5vdCBhc2sgZm9yIHJlc2NhbGluZyBvciBjb2xvciBxdWFudGl6YXRpb24sIGZvciBpbnN0YW5jZS4gIE1vcmUKK3NlcmlvdXNseSwgeW91IG11c3QgZGVhbCB3aXRoIHRoZSBjb2xvciBzcGFjZSBhbmQgc2FtcGxpbmcgZmFjdG9ycyBwcmVzZW50IGluCit0aGUgaW5jb21pbmcgZmlsZS4gIElmIHlvdXIgYXBwbGljYXRpb24gb25seSBoYW5kbGVzLCBzYXksIDJoMXYgWUNiQ3IgZGF0YSwKK3lvdSBtdXN0IGNoZWNrIGZvciBhbmQgZmFpbCBvbiBvdGhlciBjb2xvciBzcGFjZXMgb3Igb3RoZXIgc2FtcGxpbmcgZmFjdG9ycy4KK1RoZSBsaWJyYXJ5IHdpbGwgbm90IGNvbnZlcnQgdG8gYSBkaWZmZXJlbnQgY29sb3Igc3BhY2UgZm9yIHlvdS4KKworVG8gb2J0YWluIHJhdyBkYXRhIG91dHB1dCwgc2V0IGNpbmZvLT5yYXdfZGF0YV9vdXQgPSBUUlVFIGJlZm9yZQoranBlZ19zdGFydF9kZWNvbXByZXNzKCkgKGl0IGlzIHNldCBGQUxTRSBieSBqcGVnX3JlYWRfaGVhZGVyKCkpLiAgQmUgc3VyZSB0bwordmVyaWZ5IHRoYXQgdGhlIGNvbG9yIHNwYWNlIGFuZCBzYW1wbGluZyBmYWN0b3JzIGFyZSBvbmVzIHlvdSBjYW4gaGFuZGxlLgorVGhlbiBjYWxsIGpwZWdfcmVhZF9yYXdfZGF0YSgpIGluIHBsYWNlIG9mIGpwZWdfcmVhZF9zY2FubGluZXMoKS4gIFRoZQorZGVjb21wcmVzc2lvbiBwcm9jZXNzIGlzIG90aGVyd2lzZSB0aGUgc2FtZSBhcyB1c3VhbC4KKworanBlZ19yZWFkX3Jhd19kYXRhKCkgcmV0dXJucyBvbmUgTUNVIHJvdyBwZXIgY2FsbCwgYW5kIHRodXMgeW91IG11c3QgcGFzcyBhCitidWZmZXIgb2YgYXQgbGVhc3QgbWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSBzY2FubGluZXMgKHNjYW5saW5lIGNvdW50aW5nIGlzCit0aGUgc2FtZSBhcyBmb3IgcmF3LWRhdGEgY29tcHJlc3Npb24pLiAgVGhlIGJ1ZmZlciB5b3UgcGFzcyBtdXN0IGJlIGxhcmdlCitlbm91Z2ggdG8gaG9sZCB0aGUgYWN0dWFsIGRhdGEgcGx1cyBwYWRkaW5nIHRvIERDVC1ibG9jayBib3VuZGFyaWVzLiAgQXMgd2l0aAorY29tcHJlc3Npb24sIGFueSBlbnRpcmVseSBkdW1teSBEQ1QgYmxvY2tzIGFyZSBub3QgcHJvY2Vzc2VkIHNvIHlvdSBuZWVkIG5vdAorYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0sIGJ1dCB0aGUgdG90YWwgc2NhbmxpbmUgY291bnQgaW5jbHVkZXMgdGhlbS4gIFRoZQorYWJvdmUgZXhhbXBsZSBvZiBjb21wdXRpbmcgYnVmZmVyIGRpbWVuc2lvbnMgZm9yIHJhdy1kYXRhIGNvbXByZXNzaW9uIGlzCitlcXVhbGx5IHZhbGlkIGZvciBkZWNvbXByZXNzaW9uLgorCitJbnB1dCBzdXNwZW5zaW9uIGlzIHN1cHBvcnRlZCB3aXRoIHJhdy1kYXRhIGRlY29tcHJlc3Npb246IGlmIHRoZSBkYXRhIHNvdXJjZQorbW9kdWxlIHN1c3BlbmRzLCBqcGVnX3JlYWRfcmF3X2RhdGEoKSB3aWxsIHJldHVybiAwLiAgWW91IGNhbiBhbHNvIHVzZQorYnVmZmVyZWQtaW1hZ2UgbW9kZSB0byByZWFkIHJhdyBkYXRhIGluIG11bHRpcGxlIHBhc3Nlcy4KKworCitSZWFsbHkgcmF3IGRhdGE6IERDVCBjb2VmZmljaWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJdCBpcyBwb3NzaWJsZSB0byByZWFkIG9yIHdyaXRlIHRoZSBjb250ZW50cyBvZiBhIEpQRUcgZmlsZSBhcyByYXcgRENUCitjb2VmZmljaWVudHMuICBUaGlzIGZhY2lsaXR5IGlzIG1haW5seSBpbnRlbmRlZCBmb3IgdXNlIGluIGxvc3NsZXNzCit0cmFuc2NvZGluZyBiZXR3ZWVuIGRpZmZlcmVudCBKUEVHIGZpbGUgZm9ybWF0cy4gIE90aGVyIHBvc3NpYmxlIGFwcGxpY2F0aW9ucworaW5jbHVkZSBsb3NzbGVzcyBjcm9wcGluZyBvZiBhIEpQRUcgaW1hZ2UsIGxvc3NsZXNzIHJlYXNzZW1ibHkgb2YgYQorbXVsdGktc3RyaXAgb3IgbXVsdGktdGlsZSBUSUZGL0pQRUcgZmlsZSBpbnRvIGEgc2luZ2xlIEpQRUcgZGF0YXN0cmVhbSwgZXRjLgorCitUbyByZWFkIHRoZSBjb250ZW50cyBvZiBhIEpQRUcgZmlsZSBhcyBEQ1QgY29lZmZpY2llbnRzLCBvcGVuIHRoZSBmaWxlIGFuZCBkbworanBlZ19yZWFkX2hlYWRlcigpIGFzIHVzdWFsLiAgQnV0IGluc3RlYWQgb2YgY2FsbGluZyBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKQorYW5kIGpwZWdfcmVhZF9zY2FubGluZXMoKSwgY2FsbCBqcGVnX3JlYWRfY29lZmZpY2llbnRzKCkuICBUaGlzIHdpbGwgcmVhZCB0aGUKK2VudGlyZSBpbWFnZSBpbnRvIGEgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLCBvbmUgYXJyYXkgcGVyCitjb21wb25lbnQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aXJ0dWFsLWFycmF5CitkZXNjcmlwdG9ycy4gIEVhY2ggdmlydHVhbCBhcnJheSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgdXNpbmcgdGhlIEpQRUcKK21lbW9yeSBtYW5hZ2VyJ3MgYWNjZXNzX3ZpcnRfYmFycmF5IG1ldGhvZCAoc2VlIE1lbW9yeSBtYW5hZ2VtZW50LCBiZWxvdywKK2FuZCBhbHNvIHJlYWQgc3RydWN0dXJlLmRvYydzIGRpc2N1c3Npb24gb2YgdmlydHVhbCBhcnJheSBoYW5kbGluZykuICBPciwKK2ZvciBzaW1wbGUgdHJhbnNjb2RpbmcgdG8gYSBkaWZmZXJlbnQgSlBFRyBmaWxlIGZvcm1hdCwgdGhlIGFycmF5IGxpc3QgY2FuCitqdXN0IGJlIGhhbmRlZCBkaXJlY3RseSB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorCitFYWNoIGJsb2NrIGluIHRoZSBibG9jayBhcnJheXMgY29udGFpbnMgcXVhbnRpemVkIGNvZWZmaWNpZW50IHZhbHVlcyBpbgorbm9ybWFsIGFycmF5IG9yZGVyIChub3QgSlBFRyB6aWd6YWcgb3JkZXIpLiAgVGhlIGJsb2NrIGFycmF5cyBjb250YWluIG9ubHkKK0RDVCBibG9ja3MgY29udGFpbmluZyByZWFsIGRhdGE7IGFueSBlbnRpcmVseS1kdW1teSBibG9ja3MgYWRkZWQgdG8gZmlsbCBvdXQKK2ludGVybGVhdmVkIE1DVXMgYXQgdGhlIHJpZ2h0IG9yIGJvdHRvbSBlZGdlcyBvZiB0aGUgaW1hZ2UgYXJlIGRpc2NhcmRlZAorZHVyaW5nIHJlYWRpbmcgYW5kIGFyZSBub3Qgc3RvcmVkIGluIHRoZSBibG9jayBhcnJheXMuICAoVGhlIHNpemUgb2YgZWFjaAorYmxvY2sgYXJyYXkgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgd2lkdGhfaW5fYmxvY2tzIGFuZCBoZWlnaHRfaW5fYmxvY2tzCitmaWVsZHMgb2YgdGhlIGNvbXBvbmVudCdzIGNvbXBfaW5mbyBlbnRyeS4pICBUaGlzIGlzIGFsc28gdGhlIGRhdGEgZm9ybWF0CitleHBlY3RlZCBieSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorCitXaGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgdmlydHVhbCBhcnJheXMsIGNhbGwganBlZ19maW5pc2hfZGVjb21wcmVzcygpCit0byByZWxlYXNlIHRoZSBhcnJheSBzdG9yYWdlIGFuZCByZXR1cm4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IHRvIGFuIGlkbGUKK3N0YXRlOyBvciBqdXN0IGNhbGwganBlZ19kZXN0cm95KCkgaWYgeW91IGRvbid0IG5lZWQgdG8gcmV1c2UgdGhlIG9iamVjdC4KKworSWYgeW91IHVzZSBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UsIGpwZWdfcmVhZF9jb2VmZmljaWVudHMoKSB3aWxsIHJldHVybgorTlVMTCBpZiBpdCBpcyBmb3JjZWQgdG8gc3VzcGVuZDsgYSBub24tTlVMTCByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwKK2NvbXBsZXRpb24uICBZb3UgbmVlZCBub3QgdGVzdCBmb3IgYSBOVUxMIHJldHVybiB2YWx1ZSB3aGVuIHVzaW5nIGEKK25vbi1zdXNwZW5kaW5nIGRhdGEgc291cmNlLgorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlCitkZWNvZGVyJ3MgY29lZmZpY2llbnQgYXJyYXlzIGR1cmluZyBhIG5vcm1hbCBkZWNvZGUgY3ljbGUgaW4gYnVmZmVyZWQtaW1hZ2UKK21vZGUuICBUaGlzIGZyYW1taXNoIG1pZ2h0IGJlIHVzZWZ1bCBmb3IgcHJvZ3Jlc3NpdmVseSBkaXNwbGF5aW5nIGFuIGluY29taW5nCitpbWFnZSBhbmQgdGhlbiByZS1lbmNvZGluZyBpdCB3aXRob3V0IGxvc3MuICBUbyBkbyB0aGlzLCBkZWNvZGUgaW4gYnVmZmVyZWQtCitpbWFnZSBtb2RlIGFzIGRpc2N1c3NlZCBwcmV2aW91c2x5LCB0aGVuIGNhbGwganBlZ19yZWFkX2NvZWZmaWNpZW50cygpIGFmdGVyCit0aGUgbGFzdCBqcGVnX2ZpbmlzaF9vdXRwdXQoKSBjYWxsLiAgVGhlIGFycmF5cyB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UKK3VudGlsIHlvdSBjYWxsIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KKworCitUbyB3cml0ZSB0aGUgY29udGVudHMgb2YgYSBKUEVHIGZpbGUgYXMgRENUIGNvZWZmaWNpZW50cywgeW91IG11c3QgcHJvdmlkZQordGhlIERDVCBjb2VmZmljaWVudHMgc3RvcmVkIGluIHZpcnR1YWwgYmxvY2sgYXJyYXlzLiAgWW91IGNhbiBlaXRoZXIgcGFzcworYmxvY2sgYXJyYXlzIHJlYWQgZnJvbSBhbiBpbnB1dCBKUEVHIGZpbGUgYnkganBlZ19yZWFkX2NvZWZmaWNpZW50cygpLCBvcgorYWxsb2NhdGUgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgSlBFRyBjb21wcmVzc2lvbiBvYmplY3QgYW5kIGZpbGwgdGhlbQoreW91cnNlbGYuICBJbiBlaXRoZXIgY2FzZSwganBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBpcyBzdWJzdGl0dXRlZCBmb3IKK2pwZWdfc3RhcnRfY29tcHJlc3MoKSBhbmQganBlZ193cml0ZV9zY2FubGluZXMoKS4gIFRodXMgdGhlIHNlcXVlbmNlIGlzCisgICogQ3JlYXRlIGNvbXByZXNzaW9uIG9iamVjdAorICAqIFNldCBhbGwgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhcyBuZWNlc3NhcnkKKyAgKiBSZXF1ZXN0IHZpcnR1YWwgYXJyYXlzIGlmIG5lZWRlZAorICAqIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkKKyAgKiBqcGVnX2ZpbmlzaF9jb21wcmVzcygpCisgICogRGVzdHJveSBvciByZS11c2UgY29tcHJlc3Npb24gb2JqZWN0CitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIHBhc3NlZCBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbCBibG9jaworYXJyYXkgZGVzY3JpcHRvcnM7IHRoZSBudW1iZXIgb2YgYXJyYXlzIGlzIGVxdWFsIHRvIGNpbmZvLm51bV9jb21wb25lbnRzLgorCitUaGUgdmlydHVhbCBhcnJheXMgbmVlZCBvbmx5IGhhdmUgYmVlbiByZXF1ZXN0ZWQsIG5vdCByZWFsaXplZCwgYmVmb3JlCitqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpIGlzIGNhbGxlZC4gIEEgc2lkZS1lZmZlY3Qgb2YKK2pwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgaXMgdG8gcmVhbGl6ZSBhbnkgdmlydHVhbCBhcnJheXMgdGhhdCBoYXZlIGJlZW4KK3JlcXVlc3RlZCBmcm9tIHRoZSBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlci4gIFRodXMsIHdoZW4gb2J0YWluaW5nCit0aGUgdmlydHVhbCBhcnJheXMgZnJvbSB0aGUgY29tcHJlc3Npb24gb2JqZWN0LCB5b3Ugc2hvdWxkIGZpbGwgdGhlIGFycmF5cworYWZ0ZXIgY2FsbGluZyBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLiAgVGhlIGRhdGEgaXMgYWN0dWFsbHkgd3JpdHRlbiBvdXQKK3doZW4geW91IGNhbGwganBlZ19maW5pc2hfY29tcHJlc3MoKTsganBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBvbmx5IHdyaXRlcwordGhlIGZpbGUgaGVhZGVyLgorCitXaGVuIHdyaXRpbmcgcmF3IERDVCBjb2VmZmljaWVudHMsIGl0IGlzIGNydWNpYWwgdGhhdCB0aGUgSlBFRyBxdWFudGl6YXRpb24KK3RhYmxlcyBhbmQgc2FtcGxpbmcgZmFjdG9ycyBtYXRjaCB0aGUgd2F5IHRoZSBkYXRhIHdhcyBlbmNvZGVkLCBvciB0aGUKK3Jlc3VsdGluZyBmaWxlIHdpbGwgYmUgaW52YWxpZC4gIEZvciB0cmFuc2NvZGluZyBmcm9tIGFuIGV4aXN0aW5nIEpQRUcgZmlsZSwKK3dlIHJlY29tbWVuZCB1c2luZyBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycygpLiAgVGhpcyByb3V0aW5lIGluaXRpYWxpemVzCithbGwgdGhlIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdCB2YWx1ZXMgKGxpa2UganBlZ19zZXRfZGVmYXVsdHMoKSksCit0aGVuIGNvcGllcyB0aGUgY3JpdGljYWwgaW5mb3JtYXRpb24gZnJvbSBhIHNvdXJjZSBkZWNvbXByZXNzaW9uIG9iamVjdC4KK1RoZSBkZWNvbXByZXNzaW9uIG9iamVjdCBzaG91bGQgaGF2ZSBqdXN0IGJlZW4gdXNlZCB0byByZWFkIHRoZSBlbnRpcmUKK0pQRUcgaW5wdXQgZmlsZSAtLS0gdGhhdCBpcywgaXQgc2hvdWxkIGJlIGF3YWl0aW5nIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKS4KKworanBlZ193cml0ZV9jb2VmZmljaWVudHMoKSBtYXJrcyBhbGwgdGFibGVzIHN0b3JlZCBpbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0CithcyBuZWVkaW5nIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlICh0aHVzLCBpdCBhY3RzIGxpa2UKK2pwZWdfc3RhcnRfY29tcHJlc3MoY2luZm8sIFRSVUUpKS4gIFRoaXMgaXMgZm9yIHNhZmV0eSdzIHNha2UsIHRvIGF2b2lkCitlbWl0dGluZyBhYmJyZXZpYXRlZCBKUEVHIGZpbGVzIGJ5IGFjY2lkZW50LiAgSWYgeW91IHJlYWxseSB3YW50IHRvIGVtaXQgYW4KK2FiYnJldmlhdGVkIEpQRUcgZmlsZSwgY2FsbCBqcGVnX3N1cHByZXNzX3RhYmxlcygpLCBvciBzZXQgdGhlIHRhYmxlcycKK2luZGl2aWR1YWwgc2VudF90YWJsZSBmbGFncywgYmV0d2VlbiBjYWxsaW5nIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkgYW5kCitqcGVnX2ZpbmlzaF9jb21wcmVzcygpLgorCisKK1Byb2dyZXNzIG1vbml0b3JpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworU29tZSBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gcmVnYWluIGNvbnRyb2wgZnJvbSB0aGUgSlBFRyBsaWJyYXJ5IGV2ZXJ5IHNvCitvZnRlbi4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gcHJvZHVjZSBhIHBlcmNlbnQtZG9uZSBiYXIgb3IKK290aGVyIHByb2dyZXNzIGRpc3BsYXkuICAoRm9yIGEgc2ltcGxlIGV4YW1wbGUsIHNlZSBjanBlZy5jIG9yIGRqcGVnLmMuKQorQWx0aG91Z2ggeW91IGRvIGdldCBjb250cm9sIGJhY2sgZnJlcXVlbnRseSBkdXJpbmcgdGhlIGRhdGEtdHJhbnNmZXJyaW5nIHBhc3MKKyh0aGUganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3dyaXRlX3NjYW5saW5lcyBsb29wKSwgYW55IGFkZGl0aW9uYWwgcGFzc2VzCit3aWxsIG9jY3VyIGluc2lkZSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBvciBqcGVnX3N0YXJ0X2RlY29tcHJlc3M7IHRob3NlCityb3V0aW5lcyBtYXkgdGFrZSBhIGxvbmcgdGltZSB0byBleGVjdXRlLCBhbmQgeW91IGRvbid0IGdldCBjb250cm9sIGJhY2sKK3VudGlsIHRoZXkgYXJlIGRvbmUuCisKK1lvdSBjYW4gZGVmaW5lIGEgcHJvZ3Jlc3MtbW9uaXRvciByb3V0aW5lIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHBlcmlvZGljYWxseQorYnkgdGhlIGxpYnJhcnkuICBObyBndWFyYW50ZWVzIGFyZSBtYWRlIGFib3V0IGhvdyBvZnRlbiB0aGlzIGNhbGwgd2lsbCBvY2N1ciwKK3NvIHdlIGRvbid0IHJlY29tbWVuZCB5b3UgdXNlIGl0IGZvciBtb3VzZSB0cmFja2luZyBvciBhbnl0aGluZyBsaWtlIHRoYXQuCitBdCBwcmVzZW50LCBhIGNhbGwgd2lsbCBvY2N1ciBvbmNlIHBlciBNQ1Ugcm93LCBzY2FubGluZSwgb3Igc2FtcGxlIHJvdworZ3JvdXAsIHdoaWNoZXZlciB1bml0IGlzIGNvbnZlbmllbnQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NpbmcgbW9kZTsgc28gdGhlCit3aWRlciB0aGUgaW1hZ2UsIHRoZSBsb25nZXIgdGhlIHRpbWUgYmV0d2VlbiBjYWxscy4gIER1cmluZyB0aGUgZGF0YQordHJhbnNmZXJyaW5nIHBhc3MsIG9ubHkgb25lIGNhbGwgb2NjdXJzIHBlciBjYWxsIG9mIGpwZWdfcmVhZF9zY2FubGluZXMgb3IKK2pwZWdfd3JpdGVfc2NhbmxpbmVzLCBzbyBkb24ndCBwYXNzIGEgbGFyZ2UgbnVtYmVyIG9mIHNjYW5saW5lcyBhdCBvbmNlIGlmCit5b3Ugd2FudCBmaW5lIHJlc29sdXRpb24gaW4gdGhlIHByb2dyZXNzIGNvdW50LiAgKElmIHlvdSByZWFsbHkgbmVlZCB0byB1c2UKK3RoZSBjYWxsYmFjayBtZWNoYW5pc20gZm9yIHRpbWUtY3JpdGljYWwgdGFza3MgbGlrZSBtb3VzZSB0cmFja2luZywgeW91IGNvdWxkCitpbnNlcnQgYWRkaXRpb25hbCBjYWxscyBpbnNpZGUgc29tZSBvZiB0aGUgbGlicmFyeSdzIGlubmVyIGxvb3BzLikKKworVG8gZXN0YWJsaXNoIGEgcHJvZ3Jlc3MtbW9uaXRvciBjYWxsYmFjaywgY3JlYXRlIGEgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyLAorZmlsbCBpbiBpdHMgcHJvZ3Jlc3NfbW9uaXRvciBmaWVsZCB3aXRoIGEgcG9pbnRlciB0byB5b3VyIGNhbGxiYWNrIHJvdXRpbmUsCithbmQgc2V0IGNpbmZvLT5wcm9ncmVzcyB0byBwb2ludCB0byB0aGUgc3RydWN0LiAgVGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCit3aGVuZXZlciBjaW5mby0+cHJvZ3Jlc3MgaXMgbm9uLU5VTEwuICAoVGhpcyBwb2ludGVyIGlzIHNldCB0byBOVUxMIGJ5CitqcGVnX2NyZWF0ZV9jb21wcmVzcyBvciBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzOyB0aGUgbGlicmFyeSB3aWxsIG5vdCBjaGFuZ2UKK2l0IHRoZXJlYWZ0ZXIuICBTbyBpZiB5b3UgYWxsb2NhdGUgZHluYW1pYyBzdG9yYWdlIGZvciB0aGUgcHJvZ3Jlc3Mgc3RydWN0LAorbWFrZSBzdXJlIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIHRoZSBKUEVHIG9iamVjdCBkb2VzLiAgQWxsb2NhdGluZyBmcm9tIHRoZQorSlBFRyBtZW1vcnkgbWFuYWdlciB3aXRoIGxpZmV0aW1lIEpQT09MX1BFUk1BTkVOVCB3aWxsIHdvcmsgbmljZWx5LikgIFlvdQorY2FuIHVzZSB0aGUgc2FtZSBjYWxsYmFjayByb3V0aW5lIGZvciBib3RoIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorCitUaGUganBlZ19wcm9ncmVzc19tZ3Igc3RydWN0IGNvbnRhaW5zIGZvdXIgZmllbGRzIHdoaWNoIGFyZSBzZXQgYnkgdGhlIGxpYnJhcnk6CisJbG9uZyBwYXNzX2NvdW50ZXI7CS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLworCWxvbmcgcGFzc19saW1pdDsJLyogdG90YWwgbnVtYmVyIG9mIHdvcmsgdW5pdHMgaW4gdGhpcyBwYXNzICovCisJaW50IGNvbXBsZXRlZF9wYXNzZXM7CS8qIHBhc3NlcyBjb21wbGV0ZWQgc28gZmFyICovCisJaW50IHRvdGFsX3Bhc3NlczsJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLworRHVyaW5nIGFueSBvbmUgcGFzcywgcGFzc19jb3VudGVyIGluY3JlYXNlcyBmcm9tIDAgdXAgdG8gKG5vdCBpbmNsdWRpbmcpCitwYXNzX2xpbWl0OyB0aGUgc3RlcCBzaXplIGlzIHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAxLiAgVGhlIHBhc3NfbGltaXQKK3ZhbHVlIG1heSBjaGFuZ2UgZnJvbSBvbmUgcGFzcyB0byBhbm90aGVyLiAgVGhlIGV4cGVjdGVkIHRvdGFsIG51bWJlciBvZgorcGFzc2VzIGlzIGluIHRvdGFsX3Bhc3NlcywgYW5kIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFscmVhZHkgY29tcGxldGVkIGlzIGluCitjb21wbGV0ZWRfcGFzc2VzLiAgVGh1cyB0aGUgZnJhY3Rpb24gb2Ygd29yayBjb21wbGV0ZWQgbWF5IGJlIGVzdGltYXRlZCBhcworCQljb21wbGV0ZWRfcGFzc2VzICsgKHBhc3NfY291bnRlci9wYXNzX2xpbWl0KQorCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJCXRvdGFsX3Bhc3NlcworaWdub3JpbmcgdGhlIGZhY3QgdGhhdCB0aGUgcGFzc2VzIG1heSBub3QgYmUgZXF1YWwgYW1vdW50cyBvZiB3b3JrLgorCitXaGVuIGRlY29tcHJlc3NpbmcsIHBhc3NfbGltaXQgY2FuIGV2ZW4gY2hhbmdlIHdpdGhpbiBhIHBhc3MsIGJlY2F1c2UgaXQKK2RlcGVuZHMgb24gdGhlIG51bWJlciBvZiBzY2FucyBpbiB0aGUgSlBFRyBmaWxlLCB3aGljaCBpc24ndCBhbHdheXMga25vd24gaW4KK2FkdmFuY2UuICBUaGUgY29tcHV0ZWQgZnJhY3Rpb24tb2Ytd29yay1kb25lIG1heSBqdW1wIHN1ZGRlbmx5IChpZiB0aGUgbGlicmFyeQorZGlzY292ZXJzIGl0IGhhcyBvdmVyZXN0aW1hdGVkIHRoZSBudW1iZXIgb2Ygc2NhbnMpIG9yIGV2ZW4gZGVjcmVhc2UgKGluIHRoZQorb3Bwb3NpdGUgY2FzZSkuICBJdCBpcyBub3Qgd2lzZSB0byBwdXQgZ3JlYXQgZmFpdGggaW4gdGhlIHdvcmsgZXN0aW1hdGUuCisKK1doZW4gdXNpbmcgdGhlIGRlY29tcHJlc3NvcidzIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBwcm9ncmVzcyBtb25pdG9yIHdvcmsKK2VzdGltYXRlIGlzIGxpa2VseSB0byBiZSBjb21wbGV0ZWx5IHVuaGVscGZ1bCwgYmVjYXVzZSB0aGUgbGlicmFyeSBoYXMgbm8gd2F5Cit0byBrbm93IGhvdyBtYW55IG91dHB1dCBwYXNzZXMgd2lsbCBiZSBkZW1hbmRlZCBvZiBpdC4gIEN1cnJlbnRseSwgdGhlIGxpYnJhcnkKK3NldHMgdG90YWxfcGFzc2VzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlcmUgd2lsbCBiZSBvbmUgbW9yZSBvdXRwdXQKK3Bhc3MgaWYgdGhlIGlucHV0IGZpbGUgZW5kIGhhc24ndCB5ZXQgYmVlbiByZWFkIChqcGVnX2lucHV0X2NvbXBsZXRlKCkgaXNuJ3QKK1RSVUUpLCBidXQgbm8gbW9yZSBvdXRwdXQgcGFzc2VzIGlmIHRoZSBmaWxlIGVuZCBoYXMgYmVlbiByZWFjaGVkIHdoZW4gdGhlCitvdXRwdXQgcGFzcyBpcyBzdGFydGVkLiAgVGhpcyBtZWFucyB0aGF0IHRvdGFsX3Bhc3NlcyB3aWxsIHJpc2UgYXMgYWRkaXRpb25hbAorb3V0cHV0IHBhc3NlcyBhcmUgcmVxdWVzdGVkLiAgSWYgeW91IGhhdmUgYSB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlIGlucHV0IGZpbGUKK3NpemUsIGVzdGltYXRpbmcgcHJvZ3Jlc3MgYmFzZWQgb24gdGhlIGZyYWN0aW9uIG9mIHRoZSBmaWxlIHRoYXQncyBiZWVuIHJlYWQKK3dpbGwgcHJvYmFibHkgYmUgbW9yZSB1c2VmdWwgdGhhbiB1c2luZyB0aGUgbGlicmFyeSdzIHZhbHVlLgorCisKK01lbW9yeSBtYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gY292ZXJzIHNvbWUga2V5IGZhY3RzIGFib3V0IHRoZSBKUEVHIGxpYnJhcnkncyBidWlsdC1pbiBtZW1vcnkKK21hbmFnZXIuICBGb3IgbW9yZSBpbmZvLCBwbGVhc2UgcmVhZCBzdHJ1Y3R1cmUuZG9jJ3Mgc2VjdGlvbiBhYm91dCB0aGUgbWVtb3J5CittYW5hZ2VyLCBhbmQgY29uc3VsdCB0aGUgc291cmNlIGNvZGUgaWYgbmVjZXNzYXJ5LgorCitBbGwgbWVtb3J5IGFuZCB0ZW1wb3JhcnkgZmlsZSBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgbGlicmFyeSBpcyBkb25lIHZpYSB0aGUKK21lbW9yeSBtYW5hZ2VyLiAgSWYgbmVjZXNzYXJ5LCB5b3UgY2FuIHJlcGxhY2UgdGhlICJiYWNrIGVuZCIgb2YgdGhlIG1lbW9yeQorbWFuYWdlciB0byBjb250cm9sIGFsbG9jYXRpb24geW91cnNlbGYgKGZvciBleGFtcGxlLCBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUKK2xpYnJhcnkgdG8gdXNlIG1hbGxvYygpIGFuZCBmcmVlKCkgZm9yIHNvbWUgcmVhc29uKS4KKworU29tZSBkYXRhIGlzIGFsbG9jYXRlZCAicGVybWFuZW50bHkiIGFuZCB3aWxsIG5vdCBiZSBmcmVlZCB1bnRpbCB0aGUgSlBFRworb2JqZWN0IGlzIGRlc3Ryb3llZC4gIE1vc3QgZGF0YSBpcyBhbGxvY2F0ZWQgInBlciBpbWFnZSIgYW5kIGlzIGZyZWVkIGJ5CitqcGVnX2ZpbmlzaF9jb21wcmVzcywganBlZ19maW5pc2hfZGVjb21wcmVzcywgb3IganBlZ19hYm9ydC4gIFlvdSBjYW4gY2FsbCB0aGUKK21lbW9yeSBtYW5hZ2VyIHlvdXJzZWxmIHRvIGFsbG9jYXRlIHN0cnVjdHVyZXMgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKK2ZyZWVkIGF0IHRoZXNlIHRpbWVzLiAgVHlwaWNhbCBjb2RlIGZvciB0aGlzIGlzCisgIHB0ciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIHNpemUpOworVXNlIEpQT09MX1BFUk1BTkVOVCB0byBnZXQgc3RvcmFnZSB0aGF0IGxhc3RzIGFzIGxvbmcgYXMgdGhlIEpQRUcgb2JqZWN0LgorVXNlIGFsbG9jX2xhcmdlIGluc3RlYWQgb2YgYWxsb2Nfc21hbGwgZm9yIGFueXRoaW5nIGJpZ2dlciB0aGFuIGEgZmV3IEtieXRlcy4KK1RoZXJlIGFyZSBhbHNvIGFsbG9jX3NhcnJheSBhbmQgYWxsb2NfYmFycmF5IHJvdXRpbmVzIHRoYXQgYXV0b21hdGljYWxseQorYnVpbGQgMi1EIHNhbXBsZSBvciBibG9jayBhcnJheXMuCisKK1RoZSBsaWJyYXJ5J3MgbWluaW11bSBzcGFjZSByZXF1aXJlbWVudHMgdG8gcHJvY2VzcyBhbiBpbWFnZSBkZXBlbmQgb24gdGhlCitpbWFnZSdzIHdpZHRoLCBidXQgbm90IG9uIGl0cyBoZWlnaHQsIGJlY2F1c2UgdGhlIGxpYnJhcnkgb3JkaW5hcmlseSB3b3Jrcword2l0aCAic3RyaXAiIGJ1ZmZlcnMgdGhhdCBhcmUgYXMgd2lkZSBhcyB0aGUgaW1hZ2UgYnV0IGp1c3QgYSBmZXcgcm93cyBoaWdoLgorU29tZSBvcGVyYXRpbmcgbW9kZXMgKGVnLCB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24pIHJlcXVpcmUgZnVsbC1pbWFnZQorYnVmZmVycy4gIFN1Y2ggYnVmZmVycyBhcmUgdHJlYXRlZCBhcyAidmlydHVhbCBhcnJheXMiOiBvbmx5IHRoZSBjdXJyZW50IHN0cmlwCituZWVkIGJlIGluIG1lbW9yeSwgYW5kIHRoZSByZXN0IGNhbiBiZSBzd2FwcGVkIG91dCB0byBhIHRlbXBvcmFyeSBmaWxlLgorCitJZiB5b3UgdXNlIHRoZSBzaW1wbGVzdCBtZW1vcnkgbWFuYWdlciBiYWNrIGVuZCAoam1lbW5vYnMuYyksIHRoZW4gbm8KK3RlbXBvcmFyeSBmaWxlcyBhcmUgdXNlZDsgdmlydHVhbCBhcnJheXMgYXJlIHNpbXBseSBtYWxsb2MoKSdkLiAgSW1hZ2VzIGJpZ2dlcgordGhhbiBtZW1vcnkgY2FuIGJlIHByb2Nlc3NlZCBvbmx5IGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIHZpcnR1YWwgbWVtb3J5LgorVGhlIG90aGVyIG1lbW9yeSBtYW5hZ2VyIGJhY2sgZW5kcyBzdXBwb3J0IHRlbXBvcmFyeSBmaWxlcyBvZiB2YXJpb3VzIGZsYXZvcnMKK2FuZCB0aHVzIHdvcmsgaW4gbWFjaGluZXMgd2l0aG91dCB2aXJ0dWFsIG1lbW9yeS4gIFRoZXkgbWF5IGFsc28gYmUgdXNlZnVsIG9uCitVbml4IG1hY2hpbmVzIGlmIHlvdSBuZWVkIHRvIHByb2Nlc3MgaW1hZ2VzIHRoYXQgZXhjZWVkIGF2YWlsYWJsZSBzd2FwIHNwYWNlLgorCitXaGVuIHVzaW5nIHRlbXBvcmFyeSBmaWxlcywgdGhlIGxpYnJhcnkgd2lsbCBtYWtlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBmb3IKK2l0cyB2aXJ0dWFsIGFycmF5cyBqdXN0IGJpZyBlbm91Z2ggdG8gc3RheSB3aXRoaW4gYSAibWF4aW11bSBtZW1vcnkiIHNldHRpbmcuCitZb3VyIGFwcGxpY2F0aW9uIGNhbiBzZXQgdGhpcyBsaW1pdCBieSBzZXR0aW5nIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlCithZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuICAoT2YgY291cnNlLCB0aGVyZSBpcyBzdGlsbCBhIG1pbmltdW0gc2l6ZSBmb3IKK3RoZSBidWZmZXJzLCBzbyB0aGUgbWF4LW1lbW9yeSBzZXR0aW5nIGlzIGVmZmVjdGl2ZSBvbmx5IGlmIGl0IGlzIGJpZ2dlciB0aGFuCit0aGUgbWluaW11bSBzcGFjZSBuZWVkZWQuKSAgSWYgeW91IGFsbG9jYXRlIGFueSBsYXJnZSBzdHJ1Y3R1cmVzIHlvdXJzZWxmLCB5b3UKK211c3QgYWxsb2NhdGUgdGhlbSBiZWZvcmUganBlZ19zdGFydF9jb21wcmVzcygpIG9yIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpIGluCitvcmRlciB0byBoYXZlIHRoZW0gY291bnRlZCBhZ2FpbnN0IHRoZSBtYXggbWVtb3J5IGxpbWl0LiAgQWxzbyBrZWVwIGluIG1pbmQKK3RoYXQgc3BhY2UgYWxsb2NhdGVkIHdpdGggYWxsb2Nfc21hbGwoKSBpcyBpZ25vcmVkLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CitpdCdzIHRvbyBzbWFsbCB0byBiZSB3b3J0aCB3b3JyeWluZyBhYm91dDsgc28gYSByZWFzb25hYmxlIHNhZmV0eSBtYXJnaW4KK3Nob3VsZCBiZSBsZWZ0IHdoZW4gc2V0dGluZyBtYXhfbWVtb3J5X3RvX3VzZS4KKworSWYgeW91IHVzZSB0aGUgam1lbW5hbWUuYyBvciBqbWVtZG9zLmMgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQsIGl0IGlzCitpbXBvcnRhbnQgdG8gY2xlYW4gdXAgdGhlIEpQRUcgb2JqZWN0IHByb3Blcmx5IHRvIGVuc3VyZSB0aGF0IHRoZSB0ZW1wb3JhcnkKK2ZpbGVzIGdldCBkZWxldGVkLiAgKFRoaXMgaXMgZXNwZWNpYWxseSBjcnVjaWFsIHdpdGggam1lbWRvcy5jLCB3aGVyZSB0aGUKKyJ0ZW1wb3JhcnkgZmlsZXMiIG1heSBiZSBleHRlbmRlZC1tZW1vcnkgc2VnbWVudHM7IGlmIHRoZXkgYXJlIG5vdCBmcmVlZCwKK0RPUyB3aWxsIHJlcXVpcmUgYSByZWJvb3QgdG8gcmVjb3ZlciB0aGUgbWVtb3J5LikgIFRodXMsIHdpdGggdGhlc2UgbWVtb3J5CittYW5hZ2VycywgaXQncyBhIGdvb2QgaWRlYSB0byBwcm92aWRlIGEgc2lnbmFsIGhhbmRsZXIgdGhhdCB3aWxsIHRyYXAgYW55CitlYXJseSBleGl0IGZyb20geW91ciBwcm9ncmFtLiAgVGhlIGhhbmRsZXIgc2hvdWxkIGNhbGwgZWl0aGVyIGpwZWdfYWJvcnQoKQorb3IganBlZ19kZXN0cm95KCkgZm9yIGFueSBhY3RpdmUgSlBFRyBvYmplY3RzLiAgQSBoYW5kbGVyIGlzIG5vdCBuZWVkZWQgd2l0aAoram1lbW5vYnMuYywgYW5kIHNob3VsZG4ndCBiZSBuZWNlc3Nhcnkgd2l0aCBqbWVtYW5zaS5jIG9yIGptZW1tYWMuYyBlaXRoZXIsCitzaW5jZSB0aGUgQyBsaWJyYXJ5IGlzIHN1cHBvc2VkIHRvIHRha2UgY2FyZSBvZiBkZWxldGluZyBmaWxlcyBtYWRlIHdpdGgKK3RtcGZpbGUoKS4KKworCitNZW1vcnkgdXNhZ2UKKy0tLS0tLS0tLS0tLQorCitXb3JraW5nIG1lbW9yeSByZXF1aXJlbWVudHMgd2hpbGUgcGVyZm9ybWluZyBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uCitkZXBlbmQgb24gaW1hZ2UgZGltZW5zaW9ucywgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIChzdWNoIGFzIGNvbG9yc3BhY2UgYW5kCitKUEVHIHByb2Nlc3MpLCBhbmQgb3BlcmF0aW5nIG1vZGUgKGFwcGxpY2F0aW9uLXNlbGVjdGVkIG9wdGlvbnMpLgorCitBcyBvZiB2NmIsIHRoZSBkZWNvbXByZXNzb3IgcmVxdWlyZXM6CisgMS4gQWJvdXQgMjRLIGluIG1vcmUtb3ItbGVzcy1maXhlZC1zaXplIGRhdGEuICBUaGlzIHZhcmllcyBhIGJpdCBkZXBlbmRpbmcKKyAgICBvbiBvcGVyYXRpbmcgbW9kZSBhbmQgaW1hZ2UgY2hhcmFjdGVyaXN0aWNzIChwYXJ0aWN1bGFybHkgY29sb3IgdnMuCisgICAgZ3JheXNjYWxlKSwgYnV0IGl0IGRvZXNuJ3QgZGVwZW5kIG9uIGltYWdlIGRpbWVuc2lvbnMuCisgMi4gU3RyaXAgYnVmZmVycyAob2Ygc2l6ZSBwcm9wb3J0aW9uYWwgdG8gdGhlIGltYWdlIHdpZHRoKSBmb3IgSURDVCBhbmQKKyAgICB1cHNhbXBsaW5nIHJlc3VsdHMuICBUaGUgd29yc3QgY2FzZSBmb3IgY29tbW9ubHkgdXNlZCBzYW1wbGluZyBmYWN0b3JzCisgICAgaXMgYWJvdXQgMzQgYnl0ZXMgKiB3aWR0aCBpbiBwaXhlbHMgZm9yIGEgY29sb3IgaW1hZ2UuICBBIGdyYXlzY2FsZSBpbWFnZQorICAgIG9ubHkgbmVlZHMgYWJvdXQgOCBieXRlcyBwZXIgcGl4ZWwgY29sdW1uLgorIDMuIEEgZnVsbC1pbWFnZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lZWRlZCB0byBkZWNvZGUgYSBtdWx0aS1zY2FuIEpQRUcKKyAgICBmaWxlIChpbmNsdWRpbmcgcHJvZ3Jlc3NpdmUgSlBFR3MpLCBvciB3aGVuZXZlciB5b3Ugc2VsZWN0IGJ1ZmZlcmVkLWltYWdlCisgICAgbW9kZS4gIFRoaXMgdGFrZXMgMiBieXRlcy9jb2VmZmljaWVudC4gIEF0IHR5cGljYWwgMngyIHNhbXBsaW5nLCB0aGF0J3MKKyAgICAzIGJ5dGVzIHBlciBwaXhlbCBmb3IgYSBjb2xvciBpbWFnZS4gIFdvcnN0IGNhc2UgKDF4MSBzYW1wbGluZykgcmVxdWlyZXMKKyAgICA2IGJ5dGVzL3BpeGVsLiAgRm9yIGdyYXlzY2FsZSwgZmlndXJlIDIgYnl0ZXMvcGl4ZWwuCisgNC4gVG8gcGVyZm9ybSAyLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB0aGUgZGVjb21wcmVzc29yIGFsc28gbmVlZHMgYQorICAgIDEyOEsgY29sb3IgbG9va3VwIHRhYmxlIGFuZCBhIGZ1bGwtaW1hZ2UgcGl4ZWwgYnVmZmVyICgzIGJ5dGVzL3BpeGVsKS4KK1RoaXMgZG9lcyBub3QgY291bnQgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBzdWNoIGFzIGEKK2J1ZmZlciB0byBob2xkIHRoZSBmaW5hbCBvdXRwdXQgaW1hZ2UuCisKK1RoZSBhYm92ZSBmaWd1cmVzIGFyZSB2YWxpZCBmb3IgOC1iaXQgSlBFRyBkYXRhIHByZWNpc2lvbiBhbmQgYSBtYWNoaW5lIHdpdGgKKzMyLWJpdCBpbnRzLiAgRm9yIDEyLWJpdCBKUEVHIGRhdGEsIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaXAgYnVmZmVycyBhbmQKK3F1YW50aXphdGlvbiBwaXhlbCBidWZmZXIuICBUaGUgImZpeGVkLXNpemUiIGRhdGEgd2lsbCBiZSBzb21ld2hhdCBzbWFsbGVyCit3aXRoIDE2LWJpdCBpbnRzLCBsYXJnZXIgd2l0aCA2NC1iaXQgaW50cy4gIEFsc28sIENNWUsgb3Igb3RoZXIgdW51c3VhbAorY29sb3Igc3BhY2VzIHdpbGwgcmVxdWlyZSBkaWZmZXJlbnQgYW1vdW50cyBvZiBzcGFjZS4KKworVGhlIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYW5kIHBpeGVsIGJ1ZmZlcnMsIGlmIG5lZWRlZCBhdCBhbGwsIGRvIG5vdAoraGF2ZSB0byBiZSBmdWxseSBSQU0gcmVzaWRlbnQ7IHlvdSBjYW4gaGF2ZSB0aGUgbGlicmFyeSB1c2UgdGVtcG9yYXJ5CitmaWxlcyBpbnN0ZWFkIHdoZW4gdGhlIHRvdGFsIG1lbW9yeSB1c2FnZSB3b3VsZCBleGNlZWQgYSBsaW1pdCB5b3Ugc2V0LgorKEJ1dCBpZiB5b3VyIE9TIHN1cHBvcnRzIHZpcnR1YWwgbWVtb3J5LCBpdCdzIHByb2JhYmx5IGJldHRlciB0byBqdXN0IHVzZQoram1lbW5vYnMgYW5kIGxldCB0aGUgT1MgZG8gdGhlIHN3YXBwaW5nLikKKworVGhlIGNvbXByZXNzb3IncyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFyZSBzaW1pbGFyLCBleGNlcHQgdGhhdCBpdCBoYXMgbm8gbmVlZAorZm9yIGNvbG9yIHF1YW50aXphdGlvbi4gIEFsc28sIGl0IG5lZWRzIGEgZnVsbC1pbWFnZSBEQ1QgY29lZmZpY2llbnQgYnVmZmVyCitpZiBIdWZmbWFuLXRhYmxlIG9wdGltaXphdGlvbiBpcyBhc2tlZCBmb3IsIGV2ZW4gaWYgcHJvZ3Jlc3NpdmUgbW9kZSBpcyBub3QKK3JlcXVlc3RlZC4KKworSWYgeW91IG5lZWQgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBtZW1vcnkgdXNhZ2UgaW4gYSBwYXJ0aWN1bGFyCitzaXR1YXRpb24sIHlvdSBjYW4gZW5hYmxlIHRoZSBNRU1fU1RBVFMgY29kZSBpbiBqbWVtbWdyLmMuCisKKworTGlicmFyeSBjb21waWxlLXRpbWUgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIG51bWJlciBvZiBjb21waWxlLXRpbWUgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGJ5IG1vZGlmeWluZyBqbW9yZWNmZy5oLgorCitUaGUgSlBFRyBzdGFuZGFyZCBwcm92aWRlcyBmb3IgYm90aCB0aGUgYmFzZWxpbmUgOC1iaXQgRENUIHByb2Nlc3MgYW5kCithIDEyLWJpdCBEQ1QgcHJvY2Vzcy4gIFRoZSBJSkcgY29kZSBzdXBwb3J0cyAxMi1iaXQgbG9zc3kgSlBFRyBpZiB5b3UgZGVmaW5lCitCSVRTX0lOX0pTQU1QTEUgYXMgMTIgcmF0aGVyIHRoYW4gOC4gIE5vdGUgdGhhdCB0aGlzIGNhdXNlcyBKU0FNUExFIHRvIGJlCitsYXJnZXIgdGhhbiBhIGNoYXIsIHNvIGl0IGFmZmVjdHMgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uJ3MgaW1hZ2UgZGF0YS4KK1RoZSBzYW1wbGUgYXBwbGljYXRpb25zIGNqcGVnIGFuZCBkanBlZyBjYW4gc3VwcG9ydCAxMi1iaXQgbW9kZSBvbmx5IGZvciBQUE0KK2FuZCBHSUYgZmlsZSBmb3JtYXRzOyB5b3UgbXVzdCBkaXNhYmxlIHRoZSBvdGhlciBmaWxlIGZvcm1hdHMgdG8gY29tcGlsZSBhCisxMi1iaXQgY2pwZWcgb3IgZGpwZWcuICAoaW5zdGFsbC5kb2MgaGFzIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdC4pCitBdCBwcmVzZW50LCBhIDEyLWJpdCBsaWJyYXJ5IGNhbiBoYW5kbGUgKm9ubHkqIDEyLWJpdCBpbWFnZXMsIG5vdCBib3RoCitwcmVjaXNpb25zLiAgKElmIHlvdSBuZWVkIHRvIGluY2x1ZGUgYm90aCA4LSBhbmQgMTItYml0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQorYXBwbGljYXRpb24sIHlvdSBjb3VsZCBwcm9iYWJseSBkbyBpdCBieSBkZWZpbmluZyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCitmb3IganVzdCBvbmUgb2YgdGhlIGNvcGllcy4gIFlvdSdkIGhhdmUgdG8gYWNjZXNzIHRoZSA4LWJpdCBhbmQgMTItYml0IGNvcGllcworZnJvbSBzZXBhcmF0ZSBhcHBsaWNhdGlvbiBzb3VyY2UgZmlsZXMuICBUaGlzIGlzIHVudGVzdGVkIC4uLiBpZiB5b3UgdHJ5IGl0LAord2UnZCBsaWtlIHRvIGhlYXIgd2hldGhlciBpdCB3b3JrcyEpCisKK05vdGUgdGhhdCBhIDEyLWJpdCBsaWJyYXJ5IGFsd2F5cyBjb21wcmVzc2VzIGluIEh1ZmZtYW4gb3B0aW1pemF0aW9uIG1vZGUsCitpbiBvcmRlciB0byBnZW5lcmF0ZSB2YWxpZCBIdWZmbWFuIHRhYmxlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyCitkZWZhdWx0IEh1ZmZtYW4gdGFibGVzIG9ubHkgY292ZXIgOC1iaXQgZGF0YS4gIElmIHlvdSBuZWVkIHRvIG91dHB1dCAxMi1iaXQKK2ZpbGVzIGluIG9uZSBwYXNzLCB5b3UnbGwgaGF2ZSB0byBzdXBwbHkgc3VpdGFibGUgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KK1lvdSBtYXkgYWxzbyB3YW50IHRvIHN1cHBseSB5b3VyIG93biBEQ1QgcXVhbnRpemF0aW9uIHRhYmxlczsgdGhlIGV4aXN0aW5nCitxdWFsaXR5LXNjYWxpbmcgY29kZSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIDgtYml0IHVzZSwgYW5kIHByb2JhYmx5IGRvZXNuJ3QKK2dlbmVyYXRlIGVzcGVjaWFsbHkgZ29vZCB0YWJsZXMgZm9yIDEyLWJpdC4KKworVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbXBvbmVudHMgKGNvbG9yIGNoYW5uZWxzKSBpbiB0aGUgaW1hZ2UgaXMgZGV0ZXJtaW5lZAorYnkgTUFYX0NPTVBPTkVOVFMuICBUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgdXAgdG8gMjU1IGNvbXBvbmVudHMsIGJ1dCB3ZQorZXhwZWN0IHRoYXQgZmV3IGFwcGxpY2F0aW9ucyB3aWxsIG5lZWQgbW9yZSB0aGFuIGZvdXIgb3Igc28uCisKK09uIG1hY2hpbmVzIHdpdGggdW51c3VhbCBkYXRhIHR5cGUgc2l6ZXMsIHlvdSBtYXkgYmUgYWJsZSB0byBpbXByb3ZlCitwZXJmb3JtYW5jZSBvciByZWR1Y2UgbWVtb3J5IHNwYWNlIGJ5IHR3ZWFraW5nIHRoZSB2YXJpb3VzIHR5cGVkZWZzIGluCitqbW9yZWNmZy5oLiAgSW4gcGFydGljdWxhciwgb24gc29tZSBSSVNDIENQVXMsIGFjY2VzcyB0byBhcnJheXMgb2YgInNob3J0InMKK2lzIHF1aXRlIHNsb3c7IGNvbnNpZGVyIHRyYWRpbmcgbWVtb3J5IGZvciBzcGVlZCBieSBtYWtpbmcgSkNPRUYsIElOVDE2LCBhbmQKK1VJTlQxNiBiZSAiaW50IiBvciAidW5zaWduZWQgaW50Ii4gIFVJTlQ4IGlzIGFsc28gYSBjYW5kaWRhdGUgdG8gYmVjb21lIGludC4KK1lvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIG1ha2UgSlNBTVBMRSBiZSBpbnQgdW5sZXNzIHlvdSBoYXZlIGxvdHMgb2YgbWVtb3J5Cit0byBidXJuLgorCitZb3UgY2FuIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbGlicmFyeSBieSBjb21waWxpbmcgb3V0IHZhcmlvdXMgb3B0aW9uYWwKK2Z1bmN0aW9ucy4gIFRvIGRvIHRoaXMsIHVuZGVmaW5lIHh4eF9TVVBQT1JURUQgc3ltYm9scyBhcyBuZWNlc3NhcnkuCisKK1lvdSBjYW4gYWxzbyBzYXZlIGEgZmV3IEsgYnkgbm90IGhhdmluZyB0ZXh0IGVycm9yIG1lc3NhZ2VzIGluIHRoZSBsaWJyYXJ5OwordGhlIHN0YW5kYXJkIGVycm9yIG1lc3NhZ2UgdGFibGUgb2NjdXBpZXMgYWJvdXQgNUtiLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKK3JlYXNvbmFibGUgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyB3aGVyZSB0aGVyZSdzIG5vIGdvb2Qgd2F5IHRvIGRpc3BsYXkgCithIG1lc3NhZ2UgYW55d2F5LiAgVG8gZG8gdGhpcywgcmVtb3ZlIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVzc2FnZSB0YWJsZQorKGpwZWdfc3RkX21lc3NhZ2VfdGFibGVbXSkgZnJvbSBqZXJyb3IuYywgYW5kIGFsdGVyIGZvcm1hdF9tZXNzYWdlIHRvIGRvCitzb21ldGhpbmcgcmVhc29uYWJsZSB3aXRob3V0IGl0LiAgWW91IGNvdWxkIG91dHB1dCB0aGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUKK21lc3NhZ2UgY29kZSBudW1iZXIsIGZvciBleGFtcGxlLiAgSWYgeW91IGRvIHRoaXMsIHlvdSBjYW4gYWxzbyBzYXZlIGEgY291cGxlCittb3JlIEsgYnkgbW9kaWZ5aW5nIHRoZSBUUkFDRU1TbigpIG1hY3JvcyBpbiBqZXJyb3IuaCB0byBleHBhbmQgdG8gbm90aGluZzsKK3lvdSBkb24ndCBuZWVkIHRyYWNlIGNhcGFiaWxpdHkgYW55d2F5LCByaWdodD8KKworCitQb3J0YWJpbGl0eSBjb25zaWRlcmF0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIEpQRUcgbGlicmFyeSBoYXMgYmVlbiB3cml0dGVuIHRvIGJlIGV4dHJlbWVseSBwb3J0YWJsZTsgdGhlIHNhbXBsZQorYXBwbGljYXRpb25zIGNqcGVnIGFuZCBkanBlZyBhcmUgc2xpZ2h0bHkgbGVzcyBzby4gIFRoaXMgc2VjdGlvbiBzdW1tYXJpemVzCit0aGUgZGVzaWduIGdvYWxzIGluIHRoaXMgYXJlYS4gIChJZiB5b3UgZW5jb3VudGVyIGFueSBidWdzIHRoYXQgY2F1c2UgdGhlCitsaWJyYXJ5IHRvIGJlIGxlc3MgcG9ydGFibGUgdGhhbiBpcyBjbGFpbWVkIGhlcmUsIHdlJ2QgYXBwcmVjaWF0ZSBoZWFyaW5nCithYm91dCB0aGVtLikKKworVGhlIGNvZGUgd29ya3MgZmluZSBvbiBBTlNJIEMsIEMrKywgYW5kIHByZS1BTlNJIEMgY29tcGlsZXJzLCB1c2luZyBhbnkgb2YKK3RoZSBwb3B1bGFyIHN5c3RlbSBpbmNsdWRlIGZpbGUgc2V0dXBzLCBhbmQgc29tZSBub3Qtc28tcG9wdWxhciBvbmVzIHRvby4KK1NlZSBpbnN0YWxsLmRvYyBmb3IgY29uZmlndXJhdGlvbiBwcm9jZWR1cmVzLgorCitUaGUgY29kZSBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBleGFjdCBzaXplcyBvZiB0aGUgQyBkYXRhIHR5cGVzLiAgQXMKK2Rpc3RyaWJ1dGVkLCB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9ucyB0aGF0CisJY2hhcglpcyBhdCBsZWFzdCA4IGJpdHMgd2lkZQorCXNob3J0CWlzIGF0IGxlYXN0IDE2IGJpdHMgd2lkZQorCWludAlpcyBhdCBsZWFzdCAxNiBiaXRzIHdpZGUKKwlsb25nCWlzIGF0IGxlYXN0IDMyIGJpdHMgd2lkZQorKFRoZXNlIGFyZSB0aGUgbWluaW11bSByZXF1aXJlbWVudHMgb2YgdGhlIEFOU0kgQyBzdGFuZGFyZC4pICBXaWRlciB0eXBlcyB3aWxsCit3b3JrIGZpbmUsIGFsdGhvdWdoIG1lbW9yeSBtYXkgYmUgdXNlZCBpbmVmZmljaWVudGx5IGlmIGNoYXIgaXMgbXVjaCBsYXJnZXIKK3RoYW4gOCBiaXRzIG9yIHNob3J0IGlzIG11Y2ggYmlnZ2VyIHRoYW4gMTYgYml0cy4gIFRoZSBjb2RlIHNob3VsZCB3b3JrCitlcXVhbGx5IHdlbGwgd2l0aCAxNi0gb3IgMzItYml0IGludHMuCisKK0luIGEgc3lzdGVtIHdoZXJlIHRoZXNlIGFzc3VtcHRpb25zIGFyZSBub3QgbWV0LCB5b3UgbWF5IGJlIGFibGUgdG8gbWFrZSB0aGUKK2NvZGUgd29yayBieSBtb2RpZnlpbmcgdGhlIHR5cGVkZWZzIGluIGptb3JlY2ZnLmguICBIb3dldmVyLCB5b3Ugd2lsbCBwcm9iYWJseQoraGF2ZSBkaWZmaWN1bHR5IGlmIGludCBpcyBsZXNzIHRoYW4gMTYgYml0cyB3aWRlLCBzaW5jZSByZWZlcmVuY2VzIHRvIHBsYWluCitpbnQgYWJvdW5kIGluIHRoZSBjb2RlLgorCitjaGFyIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLCBhbHRob3VnaCB0aGUgY29kZSBydW5zIGZhc3RlciBpZiBhbgordW5zaWduZWQgY2hhciB0eXBlIGlzIGF2YWlsYWJsZS4gIElmIGNoYXIgaXMgd2lkZXIgdGhhbiA4IGJpdHMsIHlvdSB3aWxsIG5lZWQKK3RvIHJlZGVmaW5lIEpPQ1RFVCBhbmQvb3IgcHJvdmlkZSBjdXN0b20gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24gbWFuYWdlcnMgc28KK3RoYXQgSk9DVEVUIHJlcHJlc2VudHMgZXhhY3RseSA4IGJpdHMgb2YgZGF0YSBvbiBleHRlcm5hbCBzdG9yYWdlLgorCitUaGUgSlBFRyBsaWJyYXJ5IHByb3BlciBkb2VzIG5vdCBhc3N1bWUgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgY2hhcmFjdGVycy4KK0J1dCBzb21lIG9mIHRoZSBpbWFnZSBmaWxlIEkvTyBtb2R1bGVzIGluIGNqcGVnL2RqcGVnIGRvIGhhdmUgQVNDSUkKK2RlcGVuZGVuY2llcyBpbiBmaWxlLWhlYWRlciBtYW5pcHVsYXRpb247IHNvIGRvZXMgY2pwZWcncyBzZWxlY3RfZmlsZV90eXBlKCkKK3JvdXRpbmUuCisKK1RoZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgcmVseSBoZWF2aWx5IG9uIHRoZSBDIGxpYnJhcnkuICBJbiBwYXJ0aWN1bGFyLCBDCitzdGRpbyBpcyB1c2VkIG9ubHkgYnkgdGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZXMgYW5kIHRoZSBlcnJvcgoraGFuZGxlciwgYWxsIG9mIHdoaWNoIGFyZSBhcHBsaWNhdGlvbi1yZXBsYWNlYWJsZS4gIChjanBlZy9kanBlZyBhcmUgbW9yZQoraGVhdmlseSBkZXBlbmRlbnQgb24gc3RkaW8uKSAgbWFsbG9jIGFuZCBmcmVlIGFyZSBjYWxsZWQgb25seSBmcm9tIHRoZSBtZW1vcnkKK21hbmFnZXIgImJhY2sgZW5kIiBtb2R1bGUsIHNvIHlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IG1lbW9yeSBhbGxvY2F0b3IgYnkKK3JlcGxhY2luZyB0aGF0IG9uZSBmaWxlLgorCitUaGUgY29kZSBnZW5lcmFsbHkgYXNzdW1lcyB0aGF0IEMgbmFtZXMgbXVzdCBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IDE1CitjaGFyYWN0ZXJzLiAgSG93ZXZlciwgZ2xvYmFsIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBtYWRlIHVuaXF1ZSBpbiB0aGUKK2ZpcnN0IDYgY2hhcmFjdGVycyBieSBkZWZpbmluZyBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTLgorCitNb3JlIGluZm8gYWJvdXQgcG9ydGluZyB0aGUgY29kZSBtYXkgYmUgZ2xlYW5lZCBieSByZWFkaW5nIGpjb25maWcuZG9jLAoram1vcmVjZmcuaCwgYW5kIGppbmNsdWRlLmguCisKKworTm90ZXMgZm9yIE1TLURPUyBpbXBsZW1lbnRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBJSkcgY29kZSBpcyBkZXNpZ25lZCB0byB3b3JrIGVmZmljaWVudGx5IGluIDgweDg2ICJzbWFsbCIgb3IgIm1lZGl1bSIKK21lbW9yeSBtb2RlbHMgKGkuZS4sIGRhdGEgcG9pbnRlcnMgYXJlIDE2IGJpdHMgdW5sZXNzIGV4cGxpY2l0bHkgZGVjbGFyZWQKKyJmYXIiOyBjb2RlIHBvaW50ZXJzIGNhbiBiZSBlaXRoZXIgc2l6ZSkuICBZb3UgbWF5IGJlIGFibGUgdG8gdXNlIHNtYWxsCittb2RlbCB0byBjb21waWxlIGNqcGVnIG9yIGRqcGVnIGJ5IGl0c2VsZiwgYnV0IHlvdSB3aWxsIHByb2JhYmx5IGhhdmUgdG8gdXNlCittZWRpdW0gbW9kZWwgZm9yIGFueSBsYXJnZXIgYXBwbGljYXRpb24uICBUaGlzIHdvbid0IG1ha2UgbXVjaCBkaWZmZXJlbmNlIGluCitwZXJmb3JtYW5jZS4gIFlvdSAqd2lsbCogdGFrZSBhIG5vdGljZWFibGUgcGVyZm9ybWFuY2UgaGl0IGlmIHlvdSB1c2UgYQorbGFyZ2UtZGF0YSBtZW1vcnkgbW9kZWwgKHBlcmhhcHMgMTAlLTI1JSksIGFuZCB5b3Ugc2hvdWxkIGF2b2lkICJodWdlIiBtb2RlbAoraWYgYXQgYWxsIHBvc3NpYmxlLgorCitUaGUgSlBFRyBsaWJyYXJ5IHR5cGljYWxseSBuZWVkcyAyS2ItM0tiIG9mIHN0YWNrIHNwYWNlLiAgSXQgd2lsbCBhbHNvCittYWxsb2MgYWJvdXQgMjBLLTMwSyBvZiBuZWFyIGhlYXAgc3BhY2Ugd2hpbGUgZXhlY3V0aW5nIChhbmQgbG90cyBvZiBmYXIKK2hlYXAsIGJ1dCB0aGF0IGRvZXNuJ3QgY291bnQgaW4gdGhpcyBjYWxjdWxhdGlvbikuICBUaGlzIGZpZ3VyZSB3aWxsIHZhcnkKK2RlcGVuZGluZyBvbiBzZWxlY3RlZCBvcGVyYXRpbmcgbW9kZSwgYW5kIHRvIGEgbGVzc2VyIGV4dGVudCBvbiBpbWFnZSBzaXplLgorVGhlcmUgaXMgYWxzbyBhYm91dCA1S2ItNktiIG9mIGNvbnN0YW50IGRhdGEgd2hpY2ggd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlCituZWFyIGRhdGEgc2VnbWVudCAoYWJvdXQgNEtiIG9mIHRoaXMgaXMgdGhlIGVycm9yIG1lc3NhZ2UgdGFibGUpLgorVGh1cyB5b3UgaGF2ZSBwZXJoYXBzIDIwSyBhdmFpbGFibGUgZm9yIG90aGVyIG1vZHVsZXMnIHN0YXRpYyBkYXRhIGFuZCBuZWFyCitoZWFwIHNwYWNlIGJlZm9yZSB5b3UgbmVlZCB0byBnbyB0byBhIGxhcmdlciBtZW1vcnkgbW9kZWwuICBUaGUgQyBsaWJyYXJ5J3MKK3N0YXRpYyBkYXRhIHdpbGwgYWNjb3VudCBmb3Igc2V2ZXJhbCBLIG9mIHRoaXMsIGJ1dCB0aGF0IHN0aWxsIGxlYXZlcyBhIGdvb2QKK2RlYWwgZm9yIHlvdXIgbmVlZHMuICAoSWYgeW91IGFyZSB0aWdodCBvbiBzcGFjZSwgeW91IGNvdWxkIHJlZHVjZSB0aGUgc2l6ZXMKK29mIHRoZSBJL08gYnVmZmVycyBhbGxvY2F0ZWQgYnkgamRhdGFzcmMuYyBhbmQgamRhdGFkc3QuYywgc2F5IGZyb20gNEsgdG8KKzFLLiAgQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byBtb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHRhYmxlIHRvIGZhciBtZW1vcnk7Cit0aGlzIHNob3VsZCBiZSBkb2FibGUgd2l0aCBvbmx5IGxvY2FsaXplZCBoYWNraW5nIG9uIGplcnJvci5jLikKKworQWJvdXQgMksgb2YgdGhlIG5lYXIgaGVhcCBzcGFjZSBpcyAicGVybWFuZW50IiBtZW1vcnkgdGhhdCB3aWxsIG5vdCBiZQorcmVsZWFzZWQgdW50aWwgeW91IGRlc3Ryb3kgdGhlIEpQRUcgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGFuIGlzc3VlIGlmIHlvdQorc2F2ZSBhIEpQRUcgb2JqZWN0IGJldHdlZW4gY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb25zLgorCitGYXIgZGF0YSBzcGFjZSBtYXkgYWxzbyBiZSBhIHRpZ2h0IHJlc291cmNlIHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggbGFyZ2UKK2ltYWdlcy4gIFRoZSBtb3N0IG1lbW9yeS1pbnRlbnNpdmUgY2FzZSBpcyBkZWNvbXByZXNzaW9uIHdpdGggdHdvLXBhc3MgY29sb3IKK3F1YW50aXphdGlvbiwgb3Igc2luZ2xlLXBhc3MgcXVhbnRpemF0aW9uIHRvIGFuIGV4dGVybmFsbHkgc3VwcGxpZWQgY29sb3IKK21hcC4gIFRoaXMgcmVxdWlyZXMgYSAxMjhLYiBjb2xvciBsb29rdXAgdGFibGUgcGx1cyBzdHJpcCBidWZmZXJzIGFtb3VudGluZwordG8gYWJvdXQgNDAgYnl0ZXMgcGVyIGNvbHVtbiBmb3IgdHlwaWNhbCBzYW1wbGluZyByYXRpb3MgKGVnLCBhYm91dCAyNTYwMAorYnl0ZXMgZm9yIGEgNjQwLXBpeGVsLXdpZGUgaW1hZ2UpLiAgWW91IG1heSBub3QgYmUgYWJsZSB0byBwcm9jZXNzIHdpZGUKK2ltYWdlcyBpZiB5b3UgaGF2ZSBsYXJnZSBkYXRhIHN0cnVjdHVyZXMgb2YgeW91ciBvd24uCisKK09mIGNvdXJzZSwgYWxsIG9mIHRoZXNlIGNvbmNlcm5zIHZhbmlzaCBpZiB5b3UgdXNlIGEgMzItYml0IGZsYXQtbWVtb3J5LW1vZGVsCitjb21waWxlciwgc3VjaCBhcyBESkdQUCBvciBXYXRjb20gQy4gIFdlIGhpZ2hseSByZWNvbW1lbmQgZmxhdCBtb2RlbCBpZiB5b3UKK2NhbiB1c2UgaXQ7IHRoZSBKUEVHIGxpYnJhcnkgaXMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgaW4gZmxhdCBtb2RlbC4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9saWJqcGVnLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2xpYmpwZWcubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjNjQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9saWJqcGVnLm1rCkBAIC0wLDAgKzEsNzAgQEAKKyMgdGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IHZhcmlvdXMgTWFrZWZpbGVzIGFuZCBkZWZpbmVzIHRoZSBzZXQgb2Ygc291cmNlcyB1c2VkIGJ5IG91ciB2ZXJzaW9uIG9mIExpYlBuZworIworT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1saWJqcGVnKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGpjYXBpbWluLmMgXAorICAgIGpjYXBpc3RkLmMgXAorICAgIGpjY29lZmN0LmMgXAorICAgIGpjY29sb3IuYyBcCisgICAgamNkY3RtZ3IuYyBcCisgICAgamNodWZmLmMgXAorICAgIGpjaW5pdC5jIFwKKyAgICBqY21haW5jdC5jIFwKKyAgICBqY21hcmtlci5jIFwKKyAgICBqY21hc3Rlci5jIFwKKyAgICBqY29tYXBpLmMgXAorICAgIGpjcGFyYW0uYyBcCisgICAgamNwaHVmZi5jIFwKKyAgICBqY3ByZXBjdC5jIFwKKyAgICBqY3NhbXBsZS5jIFwKKyAgICBqY3RyYW5zLmMgXAorICAgIGpkYXBpbWluLmMgXAorICAgIGpkYXBpc3RkLmMgXAorICAgIGpkYXRhZHN0LmMgXAorICAgIGpkYXRhc3JjLmMgXAorICAgIGpkY29lZmN0LmMgXAorICAgIGpkY29sb3IuYyBcCisgICAgamRkY3RtZ3IuYyBcCisgICAgamRodWZmLmMgXAorICAgIGpkaW5wdXQuYyBcCisgICAgamRtYWluY3QuYyBcCisgICAgamRtYXJrZXIuYyBcCisgICAgamRtYXN0ZXIuYyBcCisgICAgamRtZXJnZS5jIFwKKyAgICBqZHBodWZmLmMgXAorICAgIGpkcG9zdGN0LmMgXAorICAgIGpkc2FtcGxlLmMgXAorICAgIGpkdHJhbnMuYyBcCisgICAgamVycm9yLmMgXAorICAgIGpmZGN0Zmx0LmMgXAorICAgIGpmZGN0ZnN0LmMgXAorICAgIGpmZGN0aW50LmMgXAorICAgIGppZGN0Zmx0LmMgXAorICAgIGppZGN0ZnN0LmMgXAorICAgIGppZGN0aW50LmMgXAorICAgIGppZGN0aW50ZWxzc2UuYyBcCisgICAgamlkY3RyZWQuYyBcCisgICAgam1lbW1nci5jIFwKKyAgICBqbWVtLWFuZHJvaWQuYyBcCisgICAganF1YW50MS5jIFwKKyAgICBqcXVhbnQyLmMgXAorICAgIGp1dGlscy5jIFwKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtREFWT0lEX1RBQkxFUyBcCisgICAgLU8zIFwKKyAgICAtZnN0cmljdC1hbGlhc2luZyBcCisgICAgLURBTkRST0lEX0lOVEVMU1NFMl9JRENUIFwKKyAgICAtbXNzZTIgXAorICAgIC1EQU5EUk9JRF9USUxFX0JBU0VEX0RFQ09ERSBcCisgICAgLVduby1hbGwgXAorCiskKGNhbGwgZW5kLWVtdWxhdG9yLWxpYnJhcnkpCisKK0xJQkpQRUdfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKQorCitMT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbHRjb25maWcgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbHRjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjM0N2U2OQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9sdGNvbmZpZwpAQCAtMCwwICsxLDE1MTIgQEAKKyMhIC9iaW4vc2gKKworIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2CisjCisjIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworIyBBIGxvdCBvZiB0aGlzIHNjcmlwdCBpcyB0YWtlbiBmcm9tIGF1dG9jb25mLTIuMTAuCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICIke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQorCitlY2hvPWVjaG8KK2lmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6CitlbHNlCisgICMgVGhlIFNvbGFyaXMgYW5kIEFJWCBkZWZhdWx0IGVjaG8gcHJvZ3JhbSB1bnF1b3RlcyBiYWNrc2xhc2hlcy4KKyAgIyBUaGlzIG1ha2VzIGl0IGltcG9zc2libGUgdG8gcXVvdGUgYmFja3NsYXNoZXMgdXNpbmcKKyAgIyAgIGVjaG8gIiRzb21ldGhpbmciIHwgc2VkICdzL1xcL1xcXFwvZycKKyAgIyBTbywgd2UgZW11bGF0ZSBlY2hvIHdpdGggcHJpbnRmICclc1xuJworICBlY2hvPSJwcmludGYgJXNcXG4iCisgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JzsgdGhlbiA6CisgIGVsc2UKKyAgICAjIE9vcHMuICBXZSBoYXZlIG5vIHdvcmtpbmcgcHJpbnRmLiAgVHJ5IHRvIGZpbmQgYSBub3Qtc28tYnVnZ3kgZWNoby4KKyAgICBlY2hvPWVjaG8KKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEggL3Vzci91Y2I7IGRvCisgICAgICBpZiB0ZXN0IC1mICRkaXIvZWNobyAmJiB0ZXN0ICJYYCRkaXIvZWNobyAnXHQnYCIgPSAnWFx0JzsgdGhlbgorICAgICAgICBlY2hvPSIkZGlyL2VjaG8iCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRzYXZlX2lmcyIKKyAgZmkKK2ZpCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKKworIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCitkb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgorcHJvZ25hbWU9YCRlY2hvICJYJDAiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKworIyBDb25zdGFudHM6CitQUk9HUkFNPWx0Y29uZmlnCitQQUNLQUdFPWxpYnRvb2wKK1ZFUlNJT049MS4yCithY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC5jIDE+JjUnCithY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC5jICRMSUJTIDE+JjUnCitybT0icm0gLWYiCisKK2hlbHA9IlRyeSBcYCRwcm9nbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBHbG9iYWwgdmFyaWFibGVzOgorY2FuX2J1aWxkX3NoYXJlZD15ZXMKK2VuYWJsZV9zaGFyZWQ9eWVzCisjIEFsbCBrbm93biBsaW5rZXJzIHJlcXVpcmUgYSBgLmEnIGFyY2hpdmUgZm9yIHN0YXRpYyBsaW5raW5nLgorZW5hYmxlX3N0YXRpYz15ZXMKK2x0bWFpbj0KK3NpbGVudD0KK3NyY2Rpcj0KK2FjX2NvbmZpZ19ndWVzcz0KK2FjX2NvbmZpZ19zdWI9Citob3N0PQorbm9ub3B0PQordmVyaWZ5X2hvc3Q9eWVzCit3aXRoX2djYz1ubword2l0aF9nbnVfbGQ9bm8KKworb2xkX0FSPSIkQVIiCitvbGRfQ0M9IiRDQyIKK29sZF9DRkxBR1M9IiRDRkxBR1MiCitvbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKK29sZF9MRD0iJExEIgorb2xkX0xOX1M9IiRMTl9TIgorb2xkX05NPSIkTk0iCitvbGRfUkFOTElCPSIkUkFOTElCIgorCisjIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KK2FyZ3M9CitwcmV2PQorZm9yIG9wdGlvbgorZG8KKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLSo9Kikgb3B0YXJnPWBlY2hvICIkb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBldmFsICIkcHJldj1cJG9wdGlvbiIKKyAgICBwcmV2PQorICAgIGNvbnRpbnVlCisgIGZpCisKKyAgY2FzZSAiJG9wdGlvbiIgaW4KKyAgLS1oZWxwKSBjYXQgPDxFT00KK1VzYWdlOiAkcHJvZ25hbWUgW09QVElPTl0uLi4gTFRNQUlOIFtIT1NUXQorCitHZW5lcmF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sIHNjcmlwdC4KKworICAgIC0tZGlzYWJsZS1zaGFyZWQgICAgICAgZG8gbm90IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAtLWRpc2FibGUtc3RhdGljICAgICAgIGRvIG5vdCBidWlsZCBzdGF0aWMgbGlicmFyaWVzCisgICAgLS1oZWxwICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorICAgIC0tbm8tdmVyaWZ5ICAgICAgICAgICAgZG8gbm90IHZlcmlmeSB0aGF0IEhPU1QgaXMgYSB2YWxpZCBob3N0IHR5cGUKKyAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIHNhbWUgYXMgXGAtLXNpbGVudCcKKyAgICAtLXNpbGVudCAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzCisgICAgLS1zcmNkaXI9RElSICAgICAgICAgICBmaW5kIFxgY29uZmlnLmd1ZXNzJyBpbiBESVIKKyAgICAtLXZlcnNpb24gICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgICAgLS13aXRoLWdjYyAgICAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgR05VIEMgY29tcGlsZXIgd2lsbCBiZSB1c2VkCisgICAgLS13aXRoLWdudS1sZCAgICAgICAgICBhc3N1bWUgdGhhdCB0aGUgQyBjb21waWxlciB1c2VzIHRoZSBHTlUgbGlua2VyCisKK0xUTUFJTiBpcyB0aGUgXGBsdG1haW4uc2gnIHNoZWxsIHNjcmlwdCBmcmFnbWVudCB0aGF0IHByb3ZpZGVzIGJhc2ljIGxpYnRvb2wKK2Z1bmN0aW9uYWxpdHkuCisKK0hPU1QgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHN5c3RlbSBuYW1lIFtkZWZhdWx0PWd1ZXNzZWRdLgorRU9NCisgIGV4aXQgMAorICA7OworCisgIC0tZGlzYWJsZS1zaGFyZWQpIGVuYWJsZV9zaGFyZWQ9bm8gOzsKKworICAtLWRpc2FibGUtc3RhdGljKSBlbmFibGVfc3RhdGljPW5vIDs7CisKKyAgLS1xdWlldCB8IC0tc2lsZW50KSBzaWxlbnQ9eWVzIDs7CisKKyAgLS1zcmNkaXIpIHByZXY9c3JjZGlyIDs7CisgIC0tc3JjZGlyPSopIHNyY2Rpcj0iJG9wdGFyZyIgOzsKKworICAtLW5vLXZlcmlmeSkgdmVyaWZ5X2hvc3Q9bm8gOzsKKworICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OIjsgZXhpdCAwIDs7CisKKyAgLS13aXRoLWdjYykgd2l0aF9nY2M9eWVzIDs7CisgIC0td2l0aC1nbnUtbGQpIHdpdGhfZ251X2xkPXllcyA7OworCisgIC0qKQorICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCisgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KKyAgICAgIGx0bWFpbj0iJG9wdGlvbiIKKyAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgorIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCisjICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KKyMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgorIyAgICAgIGZpCisgICAgICBob3N0PSIkb3B0aW9uIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCisgICAgICBlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgorICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgorICBlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKK2lmIHRlc3QgLWYgIiRsdG1haW4iOyB0aGVuIDoKK2Vsc2UKKyAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCisgIGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorbHRjb25maWdfYXJncz0KK2ZvciBhcmcKK2RvCisgIGNhc2UgIiRhcmciIGluCisgICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCisgIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKKyAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKKyAgZXNhYworZG9uZQorCisjIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCisKKyMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorIyAwIHN0YW5kYXJkIGlucHV0CisjIDEgZmlsZSBjcmVhdGlvbgorIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKyMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKKyMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KKyMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCisjIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCitpZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgorICBleGVjIDY+L2Rldi9udWxsCitlbHNlCisgIGV4ZWMgNj4mMQorZmkKK2V4ZWMgNT4+Li9jb25maWcubG9nCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKKworaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KKyAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCisgIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCisgICAgYWNfbj0gYWNfYz0nCisnIGFjX3Q9JwknCisgIGVsc2UKKyAgICBhY19uPS1uIGFjX2M9IGFjX3Q9CisgIGZpCitlbHNlCisgIGFjX249IGFjX2M9J1xjJyBhY190PQorZmkKKworaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIGx0bWFpbi5zaC4KKyAgc3JjZGlyPWAkZWNobyAiJGx0bWFpbiIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICB0ZXN0ICIkc3JjZGlyIiA9ICIkbHRtYWluIiAmJiBzcmNkaXI9LgorZmkKKwordHJhcCAiJHJtIGNvbmZ0ZXN0KjsgZXhpdCAxIiAxIDIgMTUKK2lmIHRlc3QgIiR2ZXJpZnlfaG9zdCIgPSB5ZXM7IHRoZW4KKyAgIyBDaGVjayBmb3IgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViLgorICBhY19hdXhfZGlyPQorICBmb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbworICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9jb25maWcuZ3Vlc3M7IHRoZW4KKyAgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICAgYnJlYWsKKyAgICBmaQorICBkb25lCisgIGlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgorICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGZpbmQgY29uZmlnLmd1ZXNzIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyCisgICAgZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgZmkKKyAgYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcworICBhY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKKworICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCisgIGlmICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKyAgZWxzZQorICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMgorICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CisKKyAgaG9zdF9hbGlhcz0kaG9zdAorICBjYXNlICIkaG9zdF9hbGlhcyIgaW4KKyAgIiIpCisgICAgaWYgaG9zdF9hbGlhcz1gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKKyAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaSA7OworICBlc2FjCisgIGhvc3Q9YCRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAorICBlY2hvICIkYWNfdCRob3N0IiAxPiY2CisKKyAgIyBNYWtlIHN1cmUgdGhlIGhvc3QgdmVyaWZpZWQuCisgIHRlc3QgLXogIiRob3N0IiAmJiBleGl0IDEKKworZWxpZiB0ZXN0IC16ICIkaG9zdCI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgaG9zdCB0eXBlIGlmIHlvdSB1c2UgXGAtLW5vLXZlcmlmeSciIDE+JjIKKyAgZWNobyAiJGhlbHAiIDE+JjIKKyAgZXhpdCAxCitlbHNlCisgIGhvc3RfYWxpYXM9JGhvc3QKK2ZpCisKKyMgVHJhbnNmb3JtIGxpbnV4KiB0byAqLSotbGludXgtZ251KiwgdG8gc3VwcG9ydCBvbGQgY29uZmlndXJlIHNjcmlwdHMuCitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4LWdudSopIDs7CitsaW51eCopIGhvc3Q9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoLiotLiotbGludXhcKVwoLipcKSQvXDEtZ251XDIvJ2AKK2VzYWMKKworaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAoraG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAoraG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCisKK2Nhc2UgIiRob3N0X29zIiBpbgorYWl4MyopCisgICMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQorICAjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyAgIyB2YW5pc2ggaW4gYSBwdWZmIG9mIHNtb2tlLgorICBpZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCisgICAgQ09MTEVDVF9OQU1FUz0KKyAgICBleHBvcnQgQ09MTEVDVF9OQU1FUworICBmaQorICA7OworZXNhYworCisjIERldGVybWluZSBjb21tYW5kcyB0byBjcmVhdGUgb2xkLXN0eWxlIHN0YXRpYyBhcmNoaXZlcy4KK29sZF9hcmNoaXZlX2NtZHM9JyRBUiBjcnUgJG9sZGxpYiRvbGRvYmpzJworb2xkX3Bvc3RpbnN0YWxsX2NtZHM9J2NobW9kIDY0NCAkb2xkbGliJworb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0KKworIyBTZXQgYSBzYW5lIGRlZmF1bHQgZm9yIGBBUicuCit0ZXN0IC16ICIkQVIiICYmIEFSPWFyCisKKyMgSWYgUkFOTElCIGlzIG5vdCBzZXQsIHRoZW4gcnVuIHRoZSB0ZXN0LgoraWYgdGVzdCAiJHtSQU5MSUIrc2V0fSIgIT0gInNldCI7IHRoZW4KKyAgcmVzdWx0PW5vCisKKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiAkYWNfYyIgMT4mNgorICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICBmb3IgZGlyIGluICRQQVRIOyBkbworICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgaWYgdGVzdCAtZiAkZGlyL3JhbmxpYjsgdGhlbgorICAgICAgUkFOTElCPSJyYW5saWIiCisgICAgICByZXN1bHQ9InJhbmxpYiIKKyAgICAgIGJyZWFrCisgICAgZmkKKyAgZG9uZQorICBJRlM9IiRzYXZlX2lmcyIKKworICBlY2hvICIkYWNfdCRyZXN1bHQiIDE+JjYKK2ZpCisKK2lmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIG9sZF9hcmNoaXZlX2NtZHM9IiRvbGRfYXJjaGl2ZV9jbWRzO1wkUkFOTElCIFwkb2xkbGliIgorICBvbGRfcG9zdGluc3RhbGxfY21kcz0iXCRSQU5MSUIgXCRvbGRsaWI7JG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorZmkKKworIyBDaGVjayB0byBzZWUgaWYgd2UgYXJlIHVzaW5nIEdDQy4KK2lmIHRlc3QgIiR3aXRoX2djYyIgIT0geWVzIHx8IHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgIyBJZiBDQyBpcyBub3Qgc2V0LCB0aGVuIHRyeSB0byBmaW5kIEdDQyBvciBhIHVzYWJsZSBDQy4KKyAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnY2MuLi4gJGFjX2MiIDE+JjYKKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCisgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCisJQ0M9ImdjYyIKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICBmaQorICBmaQorCisgICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCisgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKKyAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGNjX3JlamVjdGVkPW5vCisgICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KKyAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCisgICAgICBpZiB0ZXN0IC1mICRkaXIvY2M7IHRoZW4KKwlpZiB0ZXN0ICIkZGlyL2NjIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KKwkgIGNjX3JlamVjdGVkPXllcworCSAgY29udGludWUKKwlmaQorCUNDPSJjYyIKKwlicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgaWYgdGVzdCAkY2NfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgICAgIHNldCBkdW1teSAkQ0MKKyAgICAgIHNoaWZ0CisgICAgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisJIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisJIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCisJIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKwlzaGlmdAorCXNldCBkdW1teSAiJGRpci9jYyIgIiRAIgorCXNoaWZ0CisJQ0M9IiRAIgorICAgICAgZmkKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICAgICAgZWNobyAiJGFjX3QkQ0MiIDE+JjYKKyAgICBlbHNlCisgICAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgICAgZmkKKworICAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorICBmaQorCisgICMgTm93IHNlZSBpZiB0aGUgY29tcGlsZXIgaXMgcmVhbGx5IEdDQy4KKyAgd2l0aF9nY2M9bm8KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gJGFjX2MiIDE+JjYKKyAgZWNobyAiJHByb2duYW1lOjQyNDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorCisgICRybSBjb25mdGVzdC5jCisgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0dOVUNfXworICB5ZXM7CisjZW5kaWYKK0VPRgorICBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6NDMyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICB3aXRoX2djYz15ZXMKKyAgZmkKKyAgJHJtIGNvbmZ0ZXN0LmMKKyAgZWNobyAiJGFjX3Qkd2l0aF9nY2MiIDE+JjYKK2ZpCisKKyMgQWxsb3cgQ0MgdG8gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmd1bWVudHMuCitzZXQgZHVtbXkgJENDCitjb21waWxlcj0iJDIiCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2CitwaWNfZmxhZz0KK3NwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KK3dsPQorbGlua19zdGF0aWNfZmxhZz0KK25vX2J1aWx0aW5fZmxhZz0KKworaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgorICB3bD0nLVdsLCcKKyAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKKyAgbm9fYnVpbHRpbl9mbGFnPScgLWZuby1idWlsdGluJworCisgIGNhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKiB8IGFpeDQqIHwgaXJpeDUqIHwgaXJpeDYqIHwgb3NmMyogfCBvc2Y0KikKKyAgICAjIFBJQyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlc2UgT1Nlcy4KKyAgICA7OworICBvczIqKQorICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgorICAgIDs7CisgIGFtaWdhb3MqKQorICAgICMgRklYTUU6IHdlIG5lZWQgYXQgbGVhc3QgNjgwMjAgY29kZSB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLCBidXQKKyAgICAjIGFkZGluZyB0aGUgYC1tNjgwMjAnIGZsYWcgdG8gR0NDIHByZXZlbnRzIGJ1aWxkaW5nIGFueXRoaW5nIGJldHRlciwKKyAgICAjIGxpa2UgYC1tNjgwNDAnLgorICAgIHBpY19mbGFnPSctbTY4MDIwIC1yZXNpZGVudDMyIC1tYWx3YXlzLXJlc3RvcmUtYTQnCisgICAgOzsKKyAgKikKKyAgICBwaWNfZmxhZz0nLWZQSUMnCisgICAgOzsKKyAgZXNhYworZWxzZQorICAjIFBPUlRNRSBDaGVjayBmb3IgUElDIGZsYWdzIGZvciB0aGUgc3lzdGVtIGNvbXBpbGVyLgorICBjYXNlICIkaG9zdF9vcyIgaW4KKyAgYWl4MyogfCBhaXg0KikKKyAgICAjIEFsbCBBSVggY29kZSBpcyBQSUMuCisgICAgbGlua19zdGF0aWNfZmxhZz0nLWJuc28gLWJJOi9saWIvc3lzY2FsbHMuZXhwJworICAgIDs7CisKKyAgaHB1eDkqIHwgaHB1eDEwKikKKyAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGxpbmtfc3RhdGljX2ZsYWcgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPworICAgIHdsPSctV2wsJworICAgIGxpbmtfc3RhdGljX2ZsYWc9IiR7d2x9LWEgJHt3bH1hcmNoaXZlIgorICAgIHBpY19mbGFnPScrWicKKyAgICA7OworCisgIGlyaXg1KiB8IGlyaXg2KikKKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKKyAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCisgICAgOzsKKworICBvczIqKQorICAgICMgV2UgY2FuIGJ1aWxkIERMTHMgZnJvbSBub24tUElDLgorICAgIDs7CisKKyAgb3NmMyogfCBvc2Y0KikKKyAgICAjIEFsbCBPU0YvMSBjb2RlIGlzIFBJQy4KKyAgICB3bD0nLVdsLCcKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKKyAgICA7OworCisgIHNjbzMuMnY1KikKKyAgICBwaWNfZmxhZz0nLUtwaWMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLWRuJworICAgIHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0nLWJlbGYnCisgICAgOzsKKworICBzb2xhcmlzMiopCisgICAgcGljX2ZsYWc9Jy1LUElDJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIHdsPSctV2wsJworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBwaWNfZmxhZz0nLVBJQycKKyAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKKyAgICB3bD0nLVFvcHRpb24gbGQgJworICAgIDs7CisKKyAgc3lzdjQuMnV3MiopCisgICAgcGljX2ZsYWc9Jy1LUElDJworICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJworICAgIHdsPSctV2wsJworICAgIDs7CisKKyAgdXRzNCopCisgICAgcGljX2ZsYWc9Jy1waWMnCisgICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCisgICAgOzsKKworICAqKQorICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorCitpZiB0ZXN0IC1uICIkcGljX2ZsYWciOyB0aGVuCisgIGVjaG8gIiRhY190JHBpY19mbGFnIiAxPiY2CisKKyAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhlIHBpY19mbGFnIGFjdHVhbGx5IHdvcmtzLgorICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgUElDIGZsYWcgJHBpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2CisgICRybSBjb25mdGVzdCoKKyAgZWNobyA+IGNvbmZ0ZXN0LmMKKyAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCisgIGVjaG8gIiRwcm9nbmFtZTo1NDc6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQorICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjU0ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgorICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQorCisgICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5CisgICAgIyBjcmVhdGUgbm9uLVBJQyBvYmplY3RzLiAgU28sIGlmIHRoZXJlIHdlcmUgYW55IHdhcm5pbmdzLCB3ZSBhc3N1bWUgdGhhdAorICAgICMgUElDIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KKyAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKKyAgICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICAgIHBpY19mbGFnPQorICAgIGVsc2UKKyAgICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgICAgICBwaWNfZmxhZz0iICRwaWNfZmxhZyIKKyAgICBmaQorICBlbHNlCisgICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KKyAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgICAgcGljX2ZsYWc9CisgICAgZWNobyAiJGFjX3Qibm8gMT4mNgorICBmaQorICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgJHJtIGNvbmZ0ZXN0KgorZWxzZQorICBlY2hvICIkYWNfdCJub25lIDE+JjYKK2ZpCisKKyMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIHNoYXJlZCBsaWJyYXJ5IGNvbXBpbGF0aW9uIGZsYWdzLgoraWYgdGVzdCAtbiAiJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncyI7IHRoZW4KKyAgZWNobyAiJHByb2duYW1lOiB3YXJuaW5nOiBcYCRDQycgcmVxdWlyZXMgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisgIGlmIGVjaG8gIiRvbGRfQ0MgJG9sZF9DRkxBR1MgIiB8IGVncmVwIC1lICJbIAldJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFnc1sgCV0iID4vZGV2L251bGw7IHRoZW4gOgorICBlbHNlCisgICAgZWNobyAiJHByb2duYW1lOiBhZGQgXGAkc3BlY2lhbF9zaGxpYl9jb21waWxlX2ZsYWdzJyB0byB0aGUgQ0Mgb3IgQ0ZMQUdTIGVudiB2YXJpYWJsZSBhbmQgcmVjb25maWd1cmUiIDE+JjIKKyAgICBjYW5fYnVpbGRfc2hhcmVkPW5vCisgIGZpCitmaQorCitlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKKyRybSBjb25mdGVzdCoKK2VjaG8gJ21haW4oKXtyZXR1cm4oMCk7fScgPiBjb25mdGVzdC5jCitzYXZlX0xERkxBR1M9IiRMREZMQUdTIgorTERGTEFHUz0iJExERkxBR1MgJGxpbmtfc3RhdGljX2ZsYWciCitlY2hvICIkcHJvZ25hbWU6NTkxOiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3RhdGljIGZsYWcgJGxpbmtfc3RhdGljX2ZsYWcgd29ya3MiID4mNQoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1OTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgorICBlY2hvICIkYWNfdCRsaW5rX3N0YXRpY19mbGFnIiAxPiY2CitlbHNlCisgIGVjaG8gIiRhY190Im5vbmUgMT4mNgorICBsaW5rX3N0YXRpY19mbGFnPQorZmkKK0xERkxBR1M9IiRzYXZlX0xERkxBR1MiCiskcm0gY29uZnRlc3QqCisKK2lmIHRlc3QgLXogIiRMTl9TIjsgdGhlbgorICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gdXNlIGxuIC1zLCBvciB3ZSBuZWVkIGhhcmQgbGlua3MuCisgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MuLi4gJGFjX2MiIDE+JjYKKyAgJHJtIGNvbmZ0ZXN0ZGF0YQorICBpZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbDsgdGhlbgorICAgICRybSBjb25mdGVzdGRhdGEKKyAgICBMTl9TPSJsbiAtcyIKKyAgZWxzZQorICAgIExOX1M9bG4KKyAgZmkKKyAgaWYgdGVzdCAiJExOX1MiID0gImxuIC1zIjsgdGhlbgorICAgIGVjaG8gIiRhY190InllcyAxPiY2CisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgIGZpCitmaQorCisjIE1ha2Ugc3VyZSBMRCBpcyBhbiBhYnNvbHV0ZSBwYXRoLgoraWYgdGVzdCAteiAiJExEIjsgdGhlbgorICBhY19wcm9nPWxkCisgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KKyAgICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MuLi4gJGFjX2MiIDE+JjYKKyAgICBlY2hvICIkcHJvZ25hbWU6NjI0OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQorICAgIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKKyAgICBjYXNlICIkYWNfcHJvZyIgaW4KKyAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KKyAgICAvKiB8IFtBLVphLXpdOlxcKikKKyAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgorICAgICAgOzsKKyAgICAiIikKKyAgICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmUgbm90IHVzaW5nIEdDQy4KKyAgICAgIGFjX3Byb2c9bGQKKyAgICAgIDs7CisgICAgKikKKyAgICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KKyAgICAgIHdpdGhfZ251X2xkPXVua25vd24KKyAgICAgIDs7CisgICAgZXNhYworICBlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRhY19jIiAxPiY2CisgICAgZWNobyAiJHByb2duYW1lOjY0MjogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1CisgIGVsc2UKKyAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2CisgICAgZWNobyAiJHByb2duYW1lOjY0NTogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQorICBmaQorCisgIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KKyAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgorICAgIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCisgICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorICAgICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KKwlMRD0iJGFjX2Rpci8kYWNfcHJvZyIKKwkjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCisJIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgorCSMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgorCWlmICIkTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCisJICB0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCisJZWxzZQorCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKKwlmaQorICAgICAgZmkKKyAgICBkb25lCisgICAgSUZTPSIkYWNfc2F2ZV9pZnMiCisgIGZpCisKKyAgaWYgdGVzdCAtbiAiJExEIjsgdGhlbgorICAgIGVjaG8gIiRhY190JExEIiAxPiY2CisgIGVsc2UKKyAgICBlY2hvICIkYWNfdCJubyAxPiY2CisgIGZpCisKKyAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgorICAgIGVjaG8gIiRwcm9nbmFtZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyCisgICAgZXhpdCAxCisgIGZpCitmaQorCisjIENoZWNrIHRvIHNlZSBpZiBpdCByZWFsbHkgaXMgb3IgaXMgbm90IEdOVSBsZC4KK2VjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkLi4uICRhY19jIiAxPiY2CisjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgoraWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgorICB3aXRoX2dudV9sZD15ZXMKK2Vsc2UKKyAgd2l0aF9nbnVfbGQ9bm8KK2ZpCitlY2hvICIkYWNfdCR3aXRoX2dudV9sZCIgMT4mNgorCisjIFNlZSBpZiB0aGUgbGlua2VyIHN1cHBvcnRzIGJ1aWxkaW5nIHNoYXJlZCBsaWJyYXJpZXMuCitlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBsaW5rZXIgKCRMRCkgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgorCithbGxvd191bmRlZmluZWRfZmxhZz0KK25vX3VuZGVmaW5lZF9mbGFnPQorYXJjaGl2ZV9jbWRzPQorb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0KK2V4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0KK2hhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9CitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPQoraGFyZGNvZGVfZGlyZWN0PW5vCitoYXJkY29kZV9taW51c19MPW5vCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCitydW5wYXRoX3Zhcj0KKworY2FzZSAiJGhvc3Rfb3MiIGluCithbWlnYW9zKiB8IHN1bm9zNCopCisgICMgT24gdGhlc2Ugb3BlcmF0aW5nIHN5c3RlbXMsIHdlIHNob3VsZCB0cmVhdCBHTlUgbGQgbGlrZSB0aGUgc3lzdGVtIGxkLgorICBnbnVfbGRfYWN0c19uYXRpdmU9eWVzCisgIDs7CisqKQorICBnbnVfbGRfYWN0c19uYXRpdmU9bm8KKyAgOzsKK2VzYWMKKworbGRfc2hsaWJzPXllcworaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllcyAmJiB0ZXN0ICIkZ251X2xkX2FjdHNfbmF0aXZlIiAhPSB5ZXM7IHRoZW4KKworICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KKyAgaWYgJExEIC0taGVscCAyPiYxIHwgZWdyZXAgJzogc3VwcG9ydGVkIHRhcmdldHM6LiogZWxmJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYiRsaWJvYmpzJworICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICisgICAgbGRfc2hsaWJzPXllcworICBlbHNlCisgICAgbGRfc2hsaWJzPW5vCisgIGZpCisKKyAgaWYgdGVzdCAiJGxkX3NobGlicyIgPSB5ZXM7IHRoZW4KKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS0tcnBhdGggJHt3bH0kbGliZGlyJworICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tLWV4cG9ydC1keW5hbWljJworICBmaQorZWxzZQorICAjIFBPUlRNRSBmaWxsIGluIGEgZGVzY3JpcHRpb24gb2YgeW91ciBzeXN0ZW0ncyBsaW5rZXIgKG5vdCBHTlUgbGQpCisgIGNhc2UgIiRob3N0X29zIiBpbgorICBhaXgzKikKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFyY2hpdmVfY21kcz0nJE5NJGxpYm9ianMgfCAkZ2xvYmFsX3N5bWJvbF9waXBlIHwgc2VkICdcJydzLy4qIC8vJ1wnJyA+ICRsaWIuZXhwOyRMRCAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqcyAtYkU6JGxpYi5leHAgLVQ1MTIgLUg1MTIgLWJNOlNSRTskQVIgY3J1ICRsaWIgJG9iamRpci8kc29uYW1lJworICAgICMgTm90ZTogdGhpcyBsaW5rZXIgaGFyZGNvZGVzIHRoZSBkaXJlY3RvcmllcyBpbiBMSUJQQVRIIGlmIHRoZXJlCisgICAgIyBhcmUgbm8gZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IC1MLgorICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICMgTmVpdGhlciBkaXJlY3QgaGFyZGNvZGluZyBub3Igc3RhdGljIGxpbmtpbmcgaXMgc3VwcG9ydGVkIHdpdGggYQorICAgICAgIyBicm9rZW4gY29sbGVjdDIuCisgICAgICBoYXJkY29kZV9kaXJlY3Q9dW5zdXBwb3J0ZWQKKyAgICBmaQorICAgIDs7CisKKyAgYWl4NCopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKKyAgICBhcmNoaXZlX2NtZHM9JyROTSRsaWJvYmpzIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSB8IHNlZCAnXCcncy8uKiAvLydcJycgPiAkbGliLmV4cDskQ0MgLW8gJG9iamRpci8kc29uYW1lJGxpYm9ianMgJHt3bH0tYkU6JGxpYi5leHAgJHt3bH0tYk06U1JFICR7d2x9LWJub2VudHJ5OyRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgOzsKKworICBhbWlnYW9zKikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGE7JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YTskQVIgY3J1ICRsaWIkbGlib2JqczskUkFOTElCICRsaWI7KGNkICRvYmpkaXIgJiYgYTJpeGxpYnJhcnkgLTMyKScKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICA7OworCisgICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgorICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KKyAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCisgICMgZXh0cmEgc3BhY2UpLgorICBmcmVlYnNkMi4yKikKKyAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliJGxpYm9ianMgL3Vzci9saWIvYysrcnQwLm8nCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KKyAgZnJlZWJzZDIqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAjIEZyZWVCU0QgMywgYXQgbGFzdCwgdXNlcyBnY2MgLXNoYXJlZCB0byBkbyBzaGFyZWQgbGlicmFyaWVzLgorICBmcmVlYnNkMyopCisgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLVIkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICBoYXJkY29kZV9taW51c19MPXllcworICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KKyAgICA7OworCisgIGhwdXg5KikKKyAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyLyRzb25hbWU7JExEIC1iICtzICtiICRpbnN0YWxsX2xpYmRpciAtbyAkb2JqZGlyLyRzb25hbWUkbGlib2JqczttdiAkb2JqZGlyLyRzb25hbWUgJGxpYicKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgOzsKKworICBocHV4MTAqKQorICAgIGFyY2hpdmVfY21kcz0nJExEIC1iICtoICRzb25hbWUgK3MgK2IgJGluc3RhbGxfbGliZGlyIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfStiICR7d2x9JGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LUUnCisgICAgOzsKKworICBpcml4NSogfCBpcml4NiopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliIC1zb25hbWUgJHNvbmFtZSAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZyRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKKyAgICA7OworCisgIG5ldGJzZCopCisgICAgIyBUZXN0ZWQgd2l0aCBOZXRCU0QgMS4yIGxkCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgb3BlbmJzZCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKKyAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgb3MyKikKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAorICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWY7JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZjskZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmO2VteGV4cCRsaWJvYmpzID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmOyRDQyAtWmRsbCAtWmNydGRsbCAtbyAkbGliJGxpYm9ianMgJG9iamRpci8kbGlibmFtZS5kZWYnCisgICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKKyAgICA7OworCisgIG9zZjMqIHwgb3NmNCopCisgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAtZXhwZWN0X3VucmVzb2x2ZWQgXConCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1vICRsaWIgLXNvbmFtZSAkc29uYW1lIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nJGxpYm9ianMkZGVwbGlicycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScke3dsfS1ycGF0aCAke3dsfSRsaWJkaXInCisgICAgaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj06CisgICAgOzsKKworICBzY28zLjJ2NSopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLW8gJGxpYiRsaWJvYmpzJworICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKKyAgICA7OworCisgIHNvbGFyaXMyKikKKyAgICBub191bmRlZmluZWRfZmxhZz0nIC16IHRleHQnCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIkbGlib2JqcycKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworCisgICAgIyBTb2xhcmlzIDIgYmVmb3JlIDIuNSBoYXJkY29kZXMgLUwgcGF0aHMuCisgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgc29sYXJpczIuWzAtNF0qKQorICAgICAgaGFyZGNvZGVfbWludXNfTD15ZXMKKyAgICAgIDs7CisgICAgZXNhYworICAgIDs7CisKKyAgc3Vub3M0KikKKyAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCisgICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkIC1vICRsaWIkbGlib2JqcycKKyAgICBlbHNlCisgICAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliJGxpYm9ianMnCisgICAgZmkKKworICAgIGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KKyAgICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nJHt3bH0tZXhwb3J0LWR5bmFtaWMnCisgICAgZmkKKyAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCisgICAgaGFyZGNvZGVfZGlyZWN0PXllcworICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCisgICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubworICAgIDs7CisKKyAgdXRzNCopCisgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliJGxpYm9ianMnCisgICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJworICAgIGhhcmRjb2RlX2RpcmVjdD1ubworICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KKyAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCisgICAgOzsKKworICAqKQorICAgIGxkX3NobGlicz1ubworICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KKyAgICA7OworICBlc2FjCitmaQorZWNobyAiJGFjX3QkbGRfc2hsaWJzIiAxPiY2CisKK2lmIHRlc3QgLXogIiROTSI7IHRoZW4KKyAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tLi4uICRhY19jIiAxPiY2CisgIGNhc2UgIiROTSIgaW4KKyAgLyogfCBbQS1aYS16XTpcXCopIDs7ICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgorICAqKQorICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCisgICAgZm9yIGFjX2RpciBpbiAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gJFBBVEggL2JpbjsgZG8KKyAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCisgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KKyAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCisgICAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6CisgICAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKKyAgICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgTk09IiRhY19kaXIvbm0gLUIiCisgICAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCisgICAgICAgICAgTk09IiRhY19kaXIvbm0gLXAiCisJZWxzZQorICAgICAgICAgIE5NPSIkYWNfZGlyL25tIgorCWZpCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgICBJRlM9IiRhY19zYXZlX2lmcyIKKyAgICB0ZXN0IC16ICIkTk0iICYmIE5NPW5tCisgICAgOzsKKyAgZXNhYworICBlY2hvICIkYWNfdCROTSIgMT4mNgorZmkKKworIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KK2VjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dC4uLiAkYWNfYyIgMT4mNgorCisjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KKyMgW1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyldCisKKyMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KK3N5bWNvZGU9J1tCQ0RFR1JTVFVdJworCisjIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KK3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCisKKyMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KK3N5bXhmcm09J1wxIFwxJworCisjIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICBzeW1jb2RlPSdbQkNEVFVdJworICA7OworaXJpeCopCisgICMgQ2Fubm90IHVzZSB1bmRlZmluZWQgc3ltYm9scyBvbiBJUklYIGJlY2F1c2UgaW5saW5lZCBmdW5jdGlvbnMgbWVzcyB1cyB1cC4KKyAgc3ltY29kZT0nW0JDREVHUlNUXScKKyAgOzsKK3NvbGFyaXMyKikKKyAgc3ltY29kZT0nW0JEVFVdJworICA7OworZXNhYworCisjIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KK2lmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgorICBzeW1jb2RlPSdbQUJDREdJU1RVV10nCitmaQorCisjIFdyaXRlIHRoZSByYXcgYW5kIEMgaWRlbnRpZmllcnMuCitnbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogJHN5bWNvZGUgJHN5bXBhdCQvJHN5bXhmcm0vcCciCisKKyMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgorcGlwZV93b3Jrcz1ubworJHJtIGNvbmZ0ZXN0KgorY2F0ID4gY29uZnRlc3QuYyA8PEVPRgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorY2hhciBubV90ZXN0X3ZhcjsKK3ZvaWQgbm1fdGVzdF9mdW5jKCl7fQorI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKK21haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KK0VPRgorCitlY2hvICIkcHJvZ25hbWU6OTcxOiBjaGVja2luZyBpZiBnbG9iYWxfc3ltYm9sX3BpcGUgd29ya3MiID4mNQoraWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo5NzI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5vOyB0aGVuCisgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgorICBubGlzdD1jb25mdGVzdC5ubQorICBpZiB7IGVjaG8gIiRwcm9nbmFtZTo5NzU6IGV2YWwgXCIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3RcIiIgPiY1OyBldmFsICIkTk0gY29uZnRlc3QubyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPiAkbmxpc3QgMj4mNSI7IH0gJiYgdGVzdCAtcyAiJG5saXN0IjsgdGhlbgorCisgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KKyAgICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorICAgICAgbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCisgICAgICB3Y291dD1gd2MgIiRubGlzdCIgMj4vZGV2L251bGxgCisgICAgICBjb3VudD1gJGVjaG8gIlgkd2NvdXQiIHwgJFhzZWQgLWUgJ3MvXlsgCV0qXChbMC05XVswLTldKlwpLiokL1wxLydgCisgICAgICAodGVzdCAiJGNvdW50IiAtZ2UgMCkgMj4vZGV2L251bGwgfHwgY291bnQ9LTEKKyAgICBlbHNlCisgICAgICBybSAtZiAiJG5saXN0IlQKKyAgICAgIGNvdW50PS0xCisgICAgZmkKKworICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KKyAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgorICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJG5saXN0IiA+L2Rldi9udWxsOyB0aGVuCisJY2F0IDw8RU9GID4gY29uZnRlc3QuYworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitFT0YKKyAgICAgICAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgICBzZWQgJ3MvXi4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7LycgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jCisKKwljYXQgPDxFT0YgPj4gY29uZnRlc3QuYworI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXworIyBkZWZpbmUgX19wdHJfdCB2b2lkICoKKyNlbHNlCisjIGRlZmluZSBfX3B0cl90IGNoYXIgKgorI2VuZGlmCisKKy8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBkbGRfcHJlbG9hZGVkX3N5bWJvbHMsIC0xIGlmIHVuc29ydGVkLiAqLworaW50IGRsZF9wcmVsb2FkZWRfc3ltYm9sX2NvdW50ID0gJGNvdW50OworCisvKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KK3N0cnVjdCB7CisgIGNoYXIgKm5hbWU7CisgIF9fcHRyX3QgYWRkcmVzczsKK30KK2RsZF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KK3sKK0VPRgorICAgICAgICBzZWQgJ3MvXlwoLipcKSBcKC4qXCkkLyAgeyJcMSIsIChfX3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKKyAgICAgICAgY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCisgIHswLCAoX19wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCitFT0YKKyAgICAgICAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KKyAgICAgICAgbXYgY29uZnRlc3QubyBjb25mdGVzdG0ubworCXNhdmVfTElCUz0iJExJQlMiCisJc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgICAgIExJQlM9J2NvbmZ0ZXN0bS5vJworCUNGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCisgICAgICAgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTAzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCisgICAgICAgICAgcGlwZV93b3Jrcz15ZXMKKyAgICAgICAgZWxzZQorICAgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CisgICAgICAgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1CisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICBlbHNlCisgICAgICAgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkbmxpc3QiID4mNQorICAgICAgZmkKKyAgICBlbHNlCisgICAgICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQorICAgIGZpCisgIGVsc2UKKyAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQorICBmaQorZWxzZQorICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorICBjYXQgY29uZnRlc3QuYyA+JjUKK2ZpCiskcm0gY29uZnRlc3QqCisKKyMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KK2VjaG8gIiRhY190JHBpcGVfd29ya3MiIDE+JjYKK3Rlc3QgIiRwaXBlX3dvcmtzIiA9IHllcyB8fCBnbG9iYWxfc3ltYm9sX3BpcGU9CisKKyMgQ2hlY2sgaGFyZGNvZGluZyBhdHRyaWJ1dGVzLgorZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIGhhcmRjb2RlIGxpYnJhcnkgcGF0aHMgaW50byBwcm9ncmFtcy4uLiAkYWNfYyIgMT4mNgoraGFyZGNvZGVfYWN0aW9uPQoraWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiIHx8IFwKKyAgIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KKworICAjIFdlIGNhbiBoYXJkY29kZSBub24tZXhpc3RhbnQgZGlyZWN0b3JpZXMuCisgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiICE9IG5vICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IG5vOyB0aGVuCisKKyAgICAjIExpbmtpbmcgYWx3YXlzIGhhcmRjb2RlcyB0aGUgdGVtcG9yYXJ5IGxpYnJhcnkgZGlyZWN0b3J5LgorICAgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKKyAgZWxzZQorICAgICMgV2UgY2FuIGxpbmsgd2l0aG91dCBoYXJkY29kaW5nLCBhbmQgd2UgY2FuIGhhcmRjb2RlIG5vbmV4aXN0aW5nIGRpcnMuCisgICAgaGFyZGNvZGVfYWN0aW9uPWltbWVkaWF0ZQorICBmaQorZWxpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB5ZXMgJiYgXAorICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0geWVzICYmIFwKKyAgICAgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiICE9IHllczsgdGhlbgorICAjIFdlIGNhbm5vdCBoYXJkY29kZSBhbnl0aGluZy4KKyAgaGFyZGNvZGVfYWN0aW9uPXVuc3VwcG9ydGVkCitlbHNlCisgICMgV2UgY2FuIG9ubHkgaGFyZGNvZGUgZXhpc3RpbmcgZGlyZWN0b3JpZXMuCisgIGhhcmRjb2RlX2FjdGlvbj1yZWxpbmsKK2ZpCitlY2hvICIkYWNfdCRoYXJkY29kZV9hY3Rpb24iIDE+JjYKK3Rlc3QgIiRoYXJkY29kZV9hY3Rpb24iID0gdW5zdXBwb3J0ZWQgJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisKK3JlbG9hZF9mbGFnPQorcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJworZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgorIyBQT1JUTUUgU29tZSBsaW5rZXIgbWF5IG5lZWQgYSBkaWZmZXJlbnQgcmVsb2FkIGZsYWcuCityZWxvYWRfZmxhZz0nLXInCitlY2hvICIkYWNfdCRyZWxvYWRfZmxhZyIKK3Rlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCisKKyMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKK2xpYnJhcnlfbmFtZXNfc3BlYz0KK2xpYm5hbWVfc3BlYz0nbGliJG5hbWUnCitzb25hbWVfc3BlYz0KK3Bvc3RpbnN0YWxsX2NtZHM9Citwb3N0dW5pbnN0YWxsX2NtZHM9CitmaW5pc2hfY21kcz0KK2ZpbmlzaF9ldmFsPQorc2hsaWJwYXRoX3Zhcj0KK3ZlcnNpb25fdHlwZT1ub25lCitkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCisKK2VjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgzKiB8IGFpeDQqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLmEnCisgIHNobGlicGF0aF92YXI9TElCUEFUSAorCisgICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kbWFqb3InCisgIDs7CisKK2FtaWdhb3MqKQorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyRsaWJuYW1lLml4bGlicmFyeSAkbGlibmFtZS5hJworICAjIENyZWF0ZSAke2xpYm5hbWV9X2l4bGlicmFyeS5hIGVudHJpZXMgaW4gL3N5cy9saWJzLgorICBmaW5pc2hfZXZhbD0nZm9yIGxpYiBpbiBgbHMgJGxpYmRpci8qLml4bGlicmFyeSAyPi9kZXYvbnVsbGA7IGRvIGxpYm5hbWU9YCRlY2hvICJYJGxpYiIgfCAkWHNlZCAtZSAnXCcncyVeLiovXChbXi9dKlwpXC5peGxpYnJhcnkkJVwxJSdcJydgOyB0ZXN0ICRybSAvc3lzL2xpYnMvJHtsaWJuYW1lfV9peGxpYnJhcnkuYTsgJHNob3cgIihjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSI7IChjZCAvc3lzL2xpYnMgJiYgJExOX1MgJGxpYiAke2xpYm5hbWV9X2l4bGlicmFyeS5hKSB8fCBleGl0IDE7IGRvbmUnCisgIDs7CisKK2ZyZWVic2QyKiB8IGZyZWVic2QzKikKKyAgdmVyc2lvbl90eXBlPXN1bm9zCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJHZlcnN1ZmZpeCAkbGlibmFtZS5zbycKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitnbnUqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitocHV4OSogfCBocHV4MTAqKQorICAjIEdpdmUgYSBzb25hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgbWFqb3IgdmVyc2lvbiBzbyB0aGF0IGRsZC5zbCByZWZ1c2VzIHRvCisgICMgbGluayBhZ2FpbnN0IG90aGVyIHZlcnNpb25zLgorICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgZGxkLnNsIgorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wuJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3IgJGxpYm5hbWUuc2wnCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbC4kbWFqb3InCisgICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgorICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKKyAgOzsKKworaXJpeDUqIHwgaXJpeDYqKQorICB2ZXJzaW9uX3R5cGU9b3NmCisgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisjIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCitsaW51eC1nbnVvbGRsZCogfCBsaW51eC1nbnVhb3V0KiB8IGxpbnV4LWdudWNvZmYqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworCisjIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCitsaW51eC1nbnUqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbiAkbGliZGlyJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorCisgIGlmIHRlc3QgLWYgL2xpYi9sZC5zby4xOyB0aGVuCisgICAgZHluYW1pY19saW5rZXI9J0dOVSBsZC5zbycKKyAgZWxzZQorICAgICMgT25seSB0aGUgR05VIGxkLnNvIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMgb24gTWtMaW51eC4KKyAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgcG93ZXJwYyopIGR5bmFtaWNfbGlua2VyPW5vIDs7CisgICAgKikgZHluYW1pY19saW5rZXI9J0xpbnV4IGxkLnNvJyA7OworICAgIGVzYWMKKyAgZmkKKyAgOzsKKworbmV0YnNkKiB8IG9wZW5ic2QqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1tICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK29zMiopCisgIGxpYm5hbWVfc3BlYz0nJG5hbWUnCisgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJGxpYm5hbWUuZGxsICRsaWJuYW1lLmEnCisgIGR5bmFtaWNfbGlua2VyPSdPUy8yIGxkLmV4ZScKKyAgc2hsaWJwYXRoX3Zhcj1MSUJQQVRICisgIDs7CisKK29zZjMqIHwgb3NmNCopCisgIHZlcnNpb25fdHlwZT1vc2YKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJGxpYm5hbWUuc28nCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3NjbzMuMnY1KikKKyAgdmVyc2lvbl90eXBlPW9zZgorICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzb2xhcmlzMiopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCitzdW5vczQqKQorICB2ZXJzaW9uX3R5cGU9c3Vub3MKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4JworICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCisgIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICisgIDs7CisKK3N5c3Y0LjJ1dzIqKQorICB2ZXJzaW9uX3R5cGU9bGludXgKKyAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zby4kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvciAkbGlibmFtZS5zbycKKyAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiRtYWpvcicKKyAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKKyAgOzsKKwordXRzNCopCisgIHZlcnNpb25fdHlwZT1saW51eAorICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvLiR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yICRsaWJuYW1lLnNvJworICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28uJG1ham9yJworICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAorICA7OworCisqKQorICBkeW5hbWljX2xpbmtlcj1ubworICA7OworZXNhYworZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiCit0ZXN0ICIkZHluYW1pY19saW5rZXIiID0gbm8gJiYgY2FuX2J1aWxkX3NoYXJlZD1ubworCisjIFJlcG9ydCB0aGUgZmluYWwgY29uc2VxdWVuY2VzLgorZWNobyAiY2hlY2tpbmcgaWYgbGlidG9vbCBzdXBwb3J0cyBzaGFyZWQgbGlicmFyaWVzLi4uICRjYW5fYnVpbGRfc2hhcmVkIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4uLiAkYWNfYyIgMT4mNgordGVzdCAiJGNhbl9idWlsZF9zaGFyZWQiID0gIm5vIiAmJiBlbmFibGVfc2hhcmVkPW5vCisKKyMgT24gQUlYLCBzaGFyZWQgbGlicmFyaWVzIGFuZCBzdGF0aWMgbGlicmFyaWVzIHVzZSB0aGUgc2FtZSBuYW1lc3BhY2UsIGFuZAorIyBhcmUgYWxsIGJ1aWx0IGZyb20gUElDLgorY2FzZSAiJGhvc3Rfb3MiIGluCithaXgqKQorICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubworICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcztcJFJBTkxJQiBcJGxpYiIKKyAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCisgIGZpCisgIDs7Citlc2FjCisKK2VjaG8gIiRhY190JGVuYWJsZV9zaGFyZWQiIDE+JjYKKworIyBNYWtlIHN1cmUgZWl0aGVyIGVuYWJsZV9zaGFyZWQgb3IgZW5hYmxlX3N0YXRpYyBpcyB5ZXMuCit0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgfHwgZW5hYmxlX3N0YXRpYz15ZXMKKworZWNobyAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICRlbmFibGVfc3RhdGljIiAxPiY2CisKK2VjaG8gJGFjX24gImNoZWNraW5nIGZvciBvYmpkaXIuLi4gJGFjX2MiIDE+JjYKK3JtIC1mIC5saWJzIDI+L2Rldi9udWxsCitta2RpciAubGlicyAyPi9kZXYvbnVsbAoraWYgdGVzdCAtZCAubGliczsgdGhlbgorICBvYmpkaXI9LmxpYnMKK2Vsc2UKKyAgIyBNUy1ET1MgZG9lcyBub3QgYWxsb3cgZmlsZW5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIGRvdC4KKyAgb2JqZGlyPV9saWJzCitmaQorcm1kaXIgLmxpYnMgMj4vZGV2L251bGwKK2VjaG8gIiRhY190JG9iamRpciIgMT4mNgorCisjIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCisjIHVzZWQgbGF0ZXIuCitsdGVjaG89IiRlY2hvIgorCisjIE5vdyBxdW90ZSBhbGwgdGhlIHRoaW5ncyB0aGF0IG1heSBjb250YWluIG1ldGFjaGFyYWN0ZXJzLgorZm9yIHZhciBpbiBsdGVjaG8gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCisgIG9sZF9MTl9TIEFSIENDIExEIExOX1MgTk0gcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgcGljX2ZsYWcgXAorICBsaW5rX3N0YXRpY19mbGFnIG5vX2J1aWx0aW5fZmxhZyBleHBvcnRfZHluYW1pY19mbGFnX3NwZWMgXAorICBsaWJuYW1lX3NwZWMgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFJBTkxJQiBcCisgIG9sZF9hcmNoaXZlX2NtZHMgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyBvbGRfcG9zdGluc3RhbGxfY21kcyBcCisgIG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMgYXJjaGl2ZV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKKyAgYWxsb3dfdW5kZWZpbmVkX2ZsYWcgbm9fdW5kZWZpbmVkX2ZsYWcgXAorICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgXAorICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I7IGRvCisKKyAgY2FzZSAiJHZhciIgaW4KKyAgcmVsb2FkX2NtZHMgfCBvbGRfYXJjaGl2ZV9jbWRzIHwgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyB8IFwKKyAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgYXJjaGl2ZV9jbWRzIHwgXAorICBwb3N0aW5zdGFsbF9jbWRzIHwgcG9zdHVuaW5zdGFsbF9jbWRzIHwgZmluaXNoX2NtZHMpCisgICAgIyBEb3VibGUtcXVvdGUgZG91YmxlLWV2YWxlZCBzdHJpbmdzLgorICAgIGV2YWwgIiR2YXI9XGBcJGVjaG8gXCJYXCQkdmFyXCIgfCBcJFhzZWQgLWUgXCJcJGRvdWJsZV9xdW90ZV9zdWJzdFwiIC1lIFwiXCRzZWRfcXVvdGVfc3Vic3RcIlxgIgorICAgIDs7CisgICopCisgICAgZXZhbCAiJHZhcj1cYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYCIKKyAgICA7OworICBlc2FjCitkb25lCisKK29maWxlPWxpYnRvb2wKK3RyYXAgIiRybSAkb2ZpbGU7IGV4aXQgMSIgMSAyIDE1CitlY2hvIGNyZWF0aW5nICRvZmlsZQorJHJtICRvZmlsZQorY2F0IDw8RU9GID4gJG9maWxlCisjISAvYmluL3NoCisKKyMgbGlidG9vbCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTgorIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCisjCisjIENvcHlyaWdodCAoQykgMTk5Ni0xOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQorIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKKyMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKKyMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgorCisjIFRoaXMgcHJvZ3JhbSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAorIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKyMKKyMgQ0M9IiRvbGRfQ0MiIENGTEFHUz0iJG9sZF9DRkxBR1MiIENQUEZMQUdTPSIkb2xkX0NQUEZMQUdTIiBcXAorIyBMRD0iJG9sZF9MRCIgTk09IiRvbGRfTk0iIFJBTkxJQj0iJG9sZF9SQU5MSUIiIExOX1M9IiRvbGRfTE5fUyIgXFwKKyMgICAkMCRsdGNvbmZpZ19hcmdzCisjCisjIENvbXBpbGVyIGFuZCBvdGhlciB0ZXN0IG91dHB1dCBwcm9kdWNlZCBieSAkcHJvZ25hbWUsIHVzZWZ1bCBmb3IKKyMgZGVidWdnaW5nICRwcm9nbmFtZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKworIyBTZWQgdGhhdCBoZWxwcyB1cyBhdm9pZCBhY2NpZGVudGFsbHkgdHJpZ2dlcmluZyBlY2hvKDEpIG9wdGlvbnMgbGlrZSAtbi4KK1hzZWQ9InNlZCAtZSBzL15YLy8iCisKKyMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0CisjIGlmIENEUEFUSCBpcyBzZXQuCitpZiB0ZXN0ICJcJHtDRFBBVEgrc2V0fSIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworIyBBbiBlY2hvIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCitlY2hvPSIkbHRlY2hvIgorCisjIFRoZSB2ZXJzaW9uIG9mICRwcm9nbmFtZSB0aGF0IGdlbmVyYXRlZCB0aGlzIHNjcmlwdC4KK0xUQ09ORklHX1ZFUlNJT049IiRWRVJTSU9OIgorCisjIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCitTSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQorCisjIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIGxpYnRvb2wgbGlicmFyaWVzLgorYnVpbGRfbGlidG9vbF9saWJzPSRlbmFibGVfc2hhcmVkCisKKyMgV2hldGhlciBvciBub3QgdG8gYnVpbGQgb2xkLXN0eWxlIGxpYnJhcmllcy4KK2J1aWxkX29sZF9saWJzPSRlbmFibGVfc3RhdGljCisKKyMgVGhlIGhvc3Qgc3lzdGVtLgoraG9zdF9hbGlhcz0iJGhvc3RfYWxpYXMiCitob3N0PSIkaG9zdCIKKworIyBUaGUgYXJjaGl2ZXIuCitBUj0iJEFSIgorCisjIFRoZSBkZWZhdWx0IEMgY29tcGlsZXIuCitDQz0iJENDIgorCisjIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCitMRD0iJExEIgorCisjIFdoZXRoZXIgd2UgbmVlZCBoYXJkIG9yIHNvZnQgbGlua3MuCitMTl9TPSIkTE5fUyIKKworIyBBIEJTRC1jb21wYXRpYmxlIG5tIHByb2dyYW0uCitOTT0iJE5NIgorCisjIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KK29iamRpcj0iJG9iamRpciIKKworIyBIb3cgdG8gY3JlYXRlIHJlbG9hZGFibGUgb2JqZWN0IGZpbGVzLgorcmVsb2FkX2ZsYWc9IiRyZWxvYWRfZmxhZyIKK3JlbG9hZF9jbWRzPSIkcmVsb2FkX2NtZHMiCisKKyMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KK3dsPSIkd2wiCisKKyMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgorcGljX2ZsYWc9IiRwaWNfZmxhZyIKKworIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgorbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWciCisKKyMgQ29tcGlsZXIgZmxhZyB0byB0dXJuIG9mZiBidWlsdGluIGZ1bmN0aW9ucy4KK25vX2J1aWx0aW5fZmxhZz0iJG5vX2J1aWx0aW5fZmxhZyIKKworIyBDb21waWxlciBmbGFnIHRvIGFsbG93IHJlZmxleGl2ZSBkbG9wZW5zLgorZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPSIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIgorCisjIExpYnJhcnkgdmVyc2lvbmluZyB0eXBlLgordmVyc2lvbl90eXBlPSR2ZXJzaW9uX3R5cGUKKworIyBGb3JtYXQgb2YgbGlicmFyeSBuYW1lIHByZWZpeC4KK2xpYm5hbWVfc3BlYz0iJGxpYm5hbWVfc3BlYyIKKworIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgorIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgorbGlicmFyeV9uYW1lc19zcGVjPSIkbGlicmFyeV9uYW1lc19zcGVjIgorCisjIFRoZSBjb2RlZCBuYW1lIG9mIHRoZSBsaWJyYXJ5LCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgcmVhbCBuYW1lLgorc29uYW1lX3NwZWM9IiRzb25hbWVfc3BlYyIKKworIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9sZC1zdHlsZSBhcmNoaXZlLgorUkFOTElCPSIkUkFOTElCIgorb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHMiCitvbGRfcG9zdGluc3RhbGxfY21kcz0iJG9sZF9wb3N0aW5zdGFsbF9jbWRzIgorb2xkX3Bvc3R1bmluc3RhbGxfY21kcz0iJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHMiCisKKyMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KK29sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9IiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIgorCisjIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYSBzaGFyZWQgYXJjaGl2ZS4KK2FyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kcyIKK3Bvc3RpbnN0YWxsX2NtZHM9IiRwb3N0aW5zdGFsbF9jbWRzIgorcG9zdHVuaW5zdGFsbF9jbWRzPSIkcG9zdHVuaW5zdGFsbF9jbWRzIgorCisjIEZsYWcgdGhhdCBhbGxvd3Mgc2hhcmVkIGxpYnJhcmllcyB3aXRoIHVuZGVmaW5lZCBzeW1ib2xzIHRvIGJlIGJ1aWx0LgorYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRhbGxvd191bmRlZmluZWRfZmxhZyIKKworIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgorbm9fdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKworIyBDb21tYW5kcyB1c2VkIHRvIGZpbmlzaCBhIGxpYnRvb2wgbGlicmFyeSBpbnN0YWxsYXRpb24gaW4gYSBkaXJlY3RvcnkuCitmaW5pc2hfY21kcz0iJGZpbmlzaF9jbWRzIgorCisjIFNhbWUgYXMgYWJvdmUsIGJ1dCBhIHNpbmdsZSBzY3JpcHQgZnJhZ21lbnQgdG8gYmUgZXZhbGVkIGJ1dCBub3Qgc2hvd24uCitmaW5pc2hfZXZhbD0iJGZpbmlzaF9ldmFsIgorCisjIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCitnbG9iYWxfc3ltYm9sX3BpcGU9IiRnbG9iYWxfc3ltYm9sX3BpcGUiCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcnVudGltZSBwYXRoIHZhcmlhYmxlLgorcnVucGF0aF92YXI9JHJ1bnBhdGhfdmFyCisKKyMgVGhpcyBpcyB0aGUgc2hhcmVkIGxpYnJhcnkgcGF0aCB2YXJpYWJsZS4KK3NobGlicGF0aF92YXI9JHNobGlicGF0aF92YXIKKworIyBIb3cgdG8gaGFyZGNvZGUgYSBzaGFyZWQgbGlicmFyeSBwYXRoIGludG8gYW4gZXhlY3V0YWJsZS4KK2hhcmRjb2RlX2FjdGlvbj0kaGFyZGNvZGVfYWN0aW9uCisKKyMgRmxhZyB0byBoYXJkY29kZSBcJGxpYmRpciBpbnRvIGEgYmluYXJ5IGR1cmluZyBsaW5raW5nLgorIyBUaGlzIG11c3Qgd29yayBldmVuIGlmIFwkbGliZGlyIGRvZXMgbm90IGV4aXN0LgoraGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0iJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiCisKKyMgV2hldGhlciB3ZSBuZWVkIGEgc2luZ2xlIC1ycGF0aCBmbGFnIHdpdGggYSBzZXBhcmF0ZWQgYXJndW1lbnQuCitoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPSIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIKKworIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKKyMgcmVzdWx0aW5nIGJpbmFyeS4KK2hhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0CisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCisjIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCisKKyMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KKyMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCitoYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCisKK0VPRgorCitjYXNlICIkaG9zdF9vcyIgaW4KK2FpeDMqKQorICBjYXQgPDxcRU9GID4+ICRvZmlsZQorIyBBSVggc29tZXRpbWVzIGhhcyBwcm9ibGVtcyB3aXRoIHRoZSBHQ0MgY29sbGVjdDIgcHJvZ3JhbS4gIEZvciBzb21lCisjIHJlYXNvbiwgaWYgd2Ugc2V0IHRoZSBDT0xMRUNUX05BTUVTIGVudmlyb25tZW50IHZhcmlhYmxlLCB0aGUgcHJvYmxlbXMKKyMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KK2lmIHRlc3QgIiR7Q09MTEVDVF9OQU1FUytzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgQ09MTEVDVF9OQU1FUz0KKyAgZXhwb3J0IENPTExFQ1RfTkFNRVMKK2ZpCisKK0VPRgorICA7OworZXNhYworCisjIEFwcGVuZCB0aGUgbHRtYWluLnNoIHNjcmlwdC4KK2NhdCAiJGx0bWFpbiIgPj4gJG9maWxlIHx8IChybSAtZiAkb2ZpbGU7IGV4aXQgMSkKKworY2htb2QgK3ggJG9maWxlCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL2x0bWFpbi5zaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9sdG1haW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzNTBiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9sdG1haW4uc2gKQEAgLTAsMCArMSwyNDUzIEBACisjIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisjIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKyMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgorcHJvZ25hbWU9YCRlY2hvICIkMCIgfCBzZWQgJ3MlXi4qLyUlJ2AKK21vZGVuYW1lPSIkcHJvZ25hbWUiCisKKyMgQ29uc3RhbnRzLgorUFJPR1JBTT1sdG1haW4uc2gKK1BBQ0tBR0U9bGlidG9vbAorVkVSU0lPTj0xLjIKKworZGVmYXVsdF9tb2RlPQoraGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgorbWtkaXI9Im1rZGlyIgorbXY9Im12IC1mIgorcm09InJtIC1mIgorCisjIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCisjIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgorWHNlZD0nc2VkIC1lIHMvXlgvLycKK3NlZF9xdW90ZV9zdWJzdD0ncy9cKFtcXGBcXCIkXFxcXF1cKS9cXFwxL2cnCisKKyMgTkxTIG51aXNhbmNlcy4KKyMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCisjIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAorIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgoraWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCitpZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKKworaWYgdGVzdCAiJExUQ09ORklHX1ZFUlNJT04iICE9ICIkVkVSU0lPTiI7IHRoZW4KKyAgZWNobyAiJG1vZGVuYW1lOiBsdGNvbmZpZyB2ZXJzaW9uIFxgJExUQ09ORklHX1ZFUlNJT04nIGRvZXMgbm90IG1hdGNoICRQUk9HUkFNIHZlcnNpb24gXGAkVkVSU0lPTiciIDE+JjIKKyAgZWNobyAiRmF0YWwgY29uZmlndXJhdGlvbiBlcnJvci4gIFNlZSB0aGUgJFBBQ0tBR0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIDE+JjIKKyAgZXhpdCAxCitmaQorCitpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXMgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiAhPSB5ZXM7IHRoZW4KKyAgZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBidWlsZCBhbnkga2luZCBvZiBsaWJyYXJ5IiAxPiYyCisgIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCisgIGV4aXQgMQorZmkKKworIyBHbG9iYWwgdmFyaWFibGVzLgorbW9kZT0kZGVmYXVsdF9tb2RlCitub25vcHQ9CitwcmV2PQorcHJldm9wdD0KK3J1bj0KK3Nob3c9IiRlY2hvIgorc2hvd19oZWxwPQorZXhlY3V0ZV9kbGZpbGVzPQorCisjIFBhcnNlIG91ciBjb21tYW5kIGxpbmUgb3B0aW9ucyBvbmNlLCB0aG9yb3VnaGx5Lgord2hpbGUgdGVzdCAkIyAtZ3QgMAorZG8KKyAgYXJnPSIkMSIKKyAgc2hpZnQKKworICBjYXNlICIkYXJnIiBpbgorICAtKj0qKSBvcHRhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7CisgICopIG9wdGFyZz0gOzsKKyAgZXNhYworCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICBjYXNlICIkcHJldiIgaW4KKyAgICBleGVjdXRlX2RsZmlsZXMpCisgICAgICBldmFsICIkcHJldj1cIlwkJHByZXYgXCRhcmdcIiIKKyAgICAgIDs7CisgICAgKikKKyAgICAgIGV2YWwgIiRwcmV2PVwkYXJnIgorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBwcmV2PQorICAgIHByZXZvcHQ9CisgICAgY29udGludWUKKyAgZmkKKworICAjIEhhdmUgd2Ugc2VlbiBhIG5vbi1vcHRpb25hbCBhcmd1bWVudCB5ZXQ/CisgIGNhc2UgIiRhcmciIGluCisgIC0taGVscCkKKyAgICBzaG93X2hlbHA9eWVzCisgICAgOzsKKworICAtLXZlcnNpb24pCisgICAgZWNobyAiJFBST0dSQU0gKEdOVSAkUEFDS0FHRSkgJFZFUlNJT04iCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLWRyeS1ydW4gfCAtbikKKyAgICBydW49OgorICAgIDs7CisKKyAgLS1mZWF0dXJlcykKKyAgICBlY2hvICJob3N0OiAkaG9zdCIKKyAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHNoYXJlZCBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzaGFyZWQgbGlicmFyaWVzIgorICAgIGZpCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgZWNobyAiZW5hYmxlIHN0YXRpYyBsaWJyYXJpZXMiCisgICAgZWxzZQorICAgICAgZWNobyAiZGlzYWJsZSBzdGF0aWMgbGlicmFyaWVzIgorICAgIGZpCisgICAgZXhpdCAwCisgICAgOzsKKworICAtLWZpbmlzaCkgbW9kZT0iZmluaXNoIiA7OworCisgIC0tbW9kZSkgcHJldm9wdD0iLS1tb2RlIiBwcmV2PW1vZGUgOzsKKyAgLS1tb2RlPSopIG1vZGU9IiRvcHRhcmciIDs7CisKKyAgLS1xdWlldCB8IC0tc2lsZW50KQorICAgIHNob3c9OgorICAgIDs7CisKKyAgLWRsb3BlbikKKyAgICBwcmV2b3B0PSItZGxvcGVuIgorICAgIHByZXY9ZXhlY3V0ZV9kbGZpbGVzCisgICAgOzsKKworICAtKikKKyAgICAkZWNobyAiJG1vZGVuYW1lOiB1bnJlY29nbml6ZWQgb3B0aW9uIFxgJGFyZyciIDE+JjIKKyAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworCisgICopCisgICAgbm9ub3B0PSIkYXJnIgorICAgIGJyZWFrCisgICAgOzsKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkcHJldm9wdCI7IHRoZW4KKyAgJGVjaG8gIiRtb2RlbmFtZTogb3B0aW9uIFxgJHByZXZvcHQnIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCisgICRlY2hvICIkaGVscCIgMT4mMgorICBleGl0IDEKK2ZpCisKK2lmIHRlc3QgLXogIiRzaG93X2hlbHAiOyB0aGVuCisKKyAgIyBJbmZlciB0aGUgb3BlcmF0aW9uIG1vZGUuCisgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgorICAgIGNhc2UgIiRub25vcHQiIGluCisgICAgKmNjIHwgKisrIHwgZ2NjKiB8ICotZ2NjKikKKyAgICAgIG1vZGU9bGluaworICAgICAgZm9yIGFyZworICAgICAgZG8KKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgLWMpCisgICAgICAgICAgIG1vZGU9Y29tcGlsZQorICAgICAgICAgICBicmVhaworICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBkb25lCisgICAgICA7OworICAgICpkYiB8ICpkYngpCisgICAgICBtb2RlPWV4ZWN1dGUKKyAgICAgIDs7CisgICAgKmluc3RhbGwqfGNwfG12KQorICAgICAgbW9kZT1pbnN0YWxsCisgICAgICA7OworICAgICpybSkKKyAgICAgIG1vZGU9dW5pbnN0YWxsCisgICAgICA7OworICAgICopCisgICAgICAjIElmIHdlIGhhdmUgbm8gbW9kZSwgYnV0IGRsZmlsZXMgd2VyZSBzcGVjaWZpZWQsIHRoZW4gZG8gZXhlY3V0ZSBtb2RlLgorICAgICAgdGVzdCAtbiAiJGV4ZWN1dGVfZGxmaWxlcyIgJiYgbW9kZT1leGVjdXRlCisKKyAgICAgICMgSnVzdCB1c2UgdGhlIGRlZmF1bHQgb3BlcmF0aW9uIG1vZGUuCisgICAgICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAtbiAiJG5vbm9wdCI7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgd2l0aG91dCBNT0RFLUFSR1MiIDE+JjIKKyAgICAgICAgZmkKKyAgICAgIGZpCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKworICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgorICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgorICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgorICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorCisgICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KKyAgZ2VuZXJpY19oZWxwPSIkaGVscCIKKyAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KKyAgY2FzZSAiJG1vZGUiIGluCisgICMgbGlidG9vbCBjb21waWxlIG1vZGUKKyAgY29tcGlsZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgorICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCisgICAgYmFzZV9jb21waWxlPQorICAgIGxhc3Rhcmc9CisgICAgc3JjZmlsZT0iJG5vbm9wdCIKKyAgICBzdXBwcmVzc19vdXRwdXQ9CisKKyAgICBmb3IgYXJnCisgICAgZG8KKyAgICAgICMgQWNjZXB0IGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtbykKKwkkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlbmFtZSB3aXRoIFxgLW8nIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisJOzsKKworICAgICAgLXN0YXRpYykKKwlidWlsZF9saWJ0b29sX2xpYnM9bm8KKwlidWlsZF9vbGRfbGlicz15ZXMKKwljb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWNjZXB0IHRoZSBjdXJyZW50IGFyZ3VtZW50IGFzIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgIGxhc3Rhcmc9IiRzcmNmaWxlIgorICAgICAgc3JjZmlsZT0iJGFyZyIKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBwcmV2aW91cyBhcmd1bWVudC4KKworICAgICAgIyBCYWNrc2xhc2hpZnkgYW55IGJhY2tzbGFzaGVzLCBkb3VibGUgcXVvdGVzLCBhbmQgZG9sbGFyIHNpZ25zLgorICAgICAgIyBUaGVzZSBhcmUgdGhlIG9ubHkgY2hhcmFjdGVycyB0aGF0IGFyZSBzdGlsbCBzcGVjaWFsbHkKKyAgICAgICMgaW50ZXJwcmV0ZWQgaW5zaWRlIG9mIGRvdWJsZS1xdW90ZWQgc2NyaW5ncy4KKyAgICAgIGxhc3Rhcmc9YCRlY2hvICJYJGxhc3RhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCisgICAgICAjIERvdWJsZS1xdW90ZSBhcmdzIGNvbnRhaW5pbmcgb3RoZXIgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCisgICAgICAjIE1hbnkgQm91cm5lIHNoZWxscyBjYW5ub3QgaGFuZGxlIGNsb3NlIGJyYWNrZXRzIGNvcnJlY3RseSBpbiBzY2FuCisgICAgICAjIHNldHMsIHNvIHdlIHNwZWNpZnkgaXQgc2VwYXJhdGVseS4KKyAgICAgIGNhc2UgIiRsYXN0YXJnIiBpbgorICAgICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJbGFzdGFyZz0iXCIkbGFzdGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgQWRkIHRoZSBwcmV2aW91cyBhcmd1bWVudCB0byBiYXNlX2NvbXBpbGUuCisgICAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorCWJhc2VfY29tcGlsZT0iJGxhc3RhcmciCisgICAgICBlbHNlCisJYmFzZV9jb21waWxlPSIkYmFzZV9jb21waWxlICRsYXN0YXJnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBvYmplY3QuCisgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgorICAgIHhmb3JtPSdbY0NGU2Ztc10nCisgICAgY2FzZSAiJGxpYm9iaiIgaW4KKyAgICAqLmFkYSkgeGZvcm09YWRhIDs7CisgICAgKi5hZGIpIHhmb3JtPWFkYiA7OworICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKKyAgICAqLmFzbSkgeGZvcm09YXNtIDs7CisgICAgKi5jKyspIHhmb3JtPWMrKyA7OworICAgICouY2MpIHhmb3JtPWNjIDs7CisgICAgKi5jcHApIHhmb3JtPWNwcCA7OworICAgICouY3h4KSB4Zm9ybT1jeHggOzsKKyAgICAqLmY5MCkgeGZvcm09ZjkwIDs7CisgICAgKi5mb3IpIHhmb3JtPWZvciA7OworICAgIGVzYWMKKworICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKKworICAgIGNhc2UgIiRsaWJvYmoiIGluCisgICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvLm8vJ2AgOzsKKyAgICAqKQorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkc3JjZmlsZSciIDE+JjIKKyAgICAgIGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisKKyAgICBpZiB0ZXN0IC16ICIkYmFzZV9jb21waWxlIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGNvbXBpbGF0aW9uIGNvbW1hbmQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgRGVsZXRlIGFueSBsZWZ0b3ZlciBsaWJyYXJ5IG9iamVjdHMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgJHJ1biAkcm0gJG9iaiAkbGlib2JqCisgICAgICB0cmFwICIkcnVuICRybSAkb2JqICRsaWJvYmo7IGV4aXQgMSIgMSAyIDE1CisgICAgZWxzZQorICAgICAgJHJ1biAkcm0gJGxpYm9iagorICAgICAgdHJhcCAiJHJ1biAkcm0gJGxpYm9iajsgZXhpdCAxIiAxIDIgMTUKKyAgICBmaQorCisgICAgIyBPbmx5IGJ1aWxkIGEgUElDIG9iamVjdCBpZiB3ZSBhcmUgYnVpbGRpbmcgbGlidG9vbCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KKyAgICAgICMgV2l0aG91dCB0aGlzIGFzc2lnbm1lbnQsIGJhc2VfY29tcGlsZSBnZXRzIGVtcHRpZWQuCisgICAgICBmYnNkX2hpZGVvdXNfc2hfYnVnPSRiYXNlX2NvbXBpbGUKKworICAgICAgIyBBbGwgcGxhdGZvcm1zIHVzZSAtRFBJQywgdG8gbm90aWZ5IHByZXByb2Nlc3NlZCBhc3NlbWJsZXIgY29kZS4KKyAgICAgICRzaG93ICIkYmFzZV9jb21waWxlJHBpY19mbGFnIC1EUElDICRzcmNmaWxlIgorICAgICAgaWYgJHJ1biBldmFsICIkYmFzZV9jb21waWxlXCRwaWNfZmxhZyAtRFBJQyBcJHNyY2ZpbGUiOyB0aGVuIDoKKyAgICAgIGVsc2UKKyAgICAgICAgdGVzdCAtbiAiJG9iaiIgJiYgJHJ1biAkcm0gJG9iagorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSWYgd2UgaGF2ZSBubyBwaWNfZmxhZywgdGhlbiBjb3B5IHRoZSBvYmplY3QgaW50byBwbGFjZSBhbmQgZmluaXNoLgorICAgICAgaWYgdGVzdCAteiAiJHBpY19mbGFnIjsgdGhlbgorICAgICAgICAkc2hvdyAiJExOX1MgJG9iaiAkbGlib2JqIgorICAgICAgICAkcnVuICRMTl9TICRvYmogJGxpYm9iagorICAgICAgICBleGl0ICQ/CisgICAgICBmaQorCisgICAgICAjIEp1c3QgbW92ZSB0aGUgb2JqZWN0LCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCisgICAgICAkc2hvdyAiJG12ICRvYmogJGxpYm9iaiIKKyAgICAgICRydW4gJG12ICRvYmogJGxpYm9iaiB8fCBleGl0IDEKKworICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgorICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJworICAgIGZpCisKKyAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCisgICAgICAkc2hvdyAiJGJhc2VfY29tcGlsZSAkc3JjZmlsZSRzdXBwcmVzc19vdXRwdXQiCisgICAgICBpZiAkcnVuIGV2YWwgIiRiYXNlX2NvbXBpbGUgXCRzcmNmaWxlJHN1cHByZXNzX291dHB1dCI7IHRoZW4gOgorICAgICAgZWxzZQorICAgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorICAgIGZpCisKKyAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKKyAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgJHNob3cgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIKKyAgICAgICRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPworICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBsaW5rIG1vZGUKKyAgbGluaykKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBsaW5rIgorICAgIENDPSIkbm9ub3B0IgorICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKKyAgICBjb21waWxlX2NvbW1hbmQ9IiRDQyIKKyAgICBmaW5hbGl6ZV9jb21tYW5kPSIkQ0MiCisKKyAgICBjb21waWxlX3NobGlicGF0aD0KKyAgICBmaW5hbGl6ZV9zaGxpYnBhdGg9CisgICAgZGVwbGlicz0KKyAgICBkbGZpbGVzPQorICAgIGRscHJlZmlsZXM9CisgICAgZXhwb3J0X2R5bmFtaWM9bm8KKyAgICBoYXJkY29kZV9saWJkaXJzPQorICAgIGxpYm9ianM9CisgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KKyAgICBsdGxpYnM9CisgICAgb2Jqcz0KKyAgICBwcmV2PQorICAgIHByZXZhcmc9CisgICAgcmVsZWFzZT0KKyAgICBycGF0aD0KKyAgICBwZXJtX3JwYXRoPQorICAgIHRlbXBfcnBhdGg9CisgICAgdmluZm89CisKKyAgICAjIFdlIG5lZWQgdG8ga25vdyAtc3RhdGljLCB0byBnZXQgdGhlIHJpZ2h0IG91dHB1dCBmaWxlbmFtZXMuCisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWFsbC1zdGF0aWMgfCAtc3RhdGljKQorICAgICAgICBpZiB0ZXN0ICJYJGFyZyIgPSAiWC1hbGwtc3RhdGljIiAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC16ICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKwkgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY29tcGxldGUgc3RhdGljIGxpbmtpbmcgaXMgaW1wb3NzaWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24iIDE+JjIKKyAgICAgICAgZmkKKyAgICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJYnVpbGRfb2xkX2xpYnM9eWVzCisgICAgICAgIGJyZWFrCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgorICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKKworICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgorICAgIGZvciBhcmcKKyAgICBkbworICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCisgICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICAgY2FzZSAiJHByZXYiIGluCisgICAgICAgIG91dHB1dCkKKyAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCisgICAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQE9VVFBVVEAiCisgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIGNhc2UgIiRwcmV2IiBpbgorICAgICAgICBkbGZpbGVzfGRscHJlZmlsZXMpCisgICAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgorICAgICAgICAgICopCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkYXJnIgorICAgICAgICAgICAgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorICAgICAgICAgICAgcHJldj0KKyAgICAgICAgICAgIDs7CisgICAgICAgICAgZXNhYworICAgICAgICAgIDs7CisJcmVsZWFzZSkKKwkgIHJlbGVhc2U9Ii0kYXJnIgorCSAgcHJldj0KKwkgIGNvbnRpbnVlCisJICA7OworICAgICAgICBycGF0aCkKKyAgICAgICAgICBycGF0aD0iJHJwYXRoICRhcmciCisJICBwcmV2PQorCSAgY29udGludWUKKwkgIDs7CisgICAgICAgICopCisgICAgICAgICAgZXZhbCAiJHByZXY9XCJcJGFyZ1wiIgorICAgICAgICAgIHByZXY9CisgICAgICAgICAgY29udGludWUKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgICBmaQorCisgICAgICBwcmV2YXJnPSIkYXJnIgorCisgICAgICBjYXNlICIkYXJnIiBpbgorICAgICAgLWFsbC1zdGF0aWMpCisJaWYgdGVzdCAtbiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCisgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisgICAgICAgIGZpCisgICAgICAgIGNvbnRpbnVlCisJOzsKKworICAgICAgLWFsbG93LXVuZGVmaW5lZCkKKwkjIEZJWE1FOiByZW1vdmUgdGhpcyBmbGFnIHNvbWV0aW1lIGluIHRoZSBmdXR1cmUuCisJJGVjaG8gIiRtb2RlbmFtZTogXGAtYWxsb3ctdW5kZWZpbmVkJyBpcyBkZXByZWNhdGVkIGJlY2F1c2UgaXQgaXMgdGhlIGRlZmF1bHQiIDE+JjIKKwljb250aW51ZQorCTs7CisKKyAgICAgIC1kbG9wZW4pCisgICAgICAgIHByZXY9ZGxmaWxlcworICAgICAgICBjb250aW51ZQorICAgICAgICA7OworCisgICAgICAtZGxwcmVvcGVuKQorICAgICAgICBwcmV2PWRscHJlZmlsZXMKKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgLWV4cG9ydC1keW5hbWljKQorICAgICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiICE9IHllczsgdGhlbgorICAgICAgICAgIGV4cG9ydF9keW5hbWljPXllcworCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KKwkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKKwkgIGVsc2UKKwkgICAgYXJnPQorCSAgZmkKKworICAgICAgICAgICMgQWRkIHRoZSBzeW1ib2wgb2JqZWN0IGludG8gdGhlIGxpbmtpbmcgY29tbWFuZHMuCisJICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQFNZTUZJTEVAIgorCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgorICAgICAgICBmaQorICAgICAgICA7OworCisgICAgICAtTCopCisgICAgICAgIGRpcj1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4tTFwoLipcKSQlXDElJ2AKKyAgICAgICAgY2FzZSAiJGRpciIgaW4KKyAgICAgICAgLyogfCBbQS1aYS16XTpcXCopCisJICAjIEFkZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkY29kZV9saWJkaXJfZmxhZywgaWYgaXQgaXMgbm90IGlkZW50aWNhbC4KKyAgICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgLUwkZGlyJyBjYW5ub3Qgc3BlY2lmeSBhIHJlbGF0aXZlIGRpcmVjdG9yeSIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyIKKyAgICAgICAgOzsKKworICAgICAgLWwqKSBkZXBsaWJzPSIkZGVwbGlicyAkYXJnIiA7OworCisgICAgICAtbm8tdW5kZWZpbmVkKQorCWFsbG93X3VuZGVmaW5lZD1ubworCWNvbnRpbnVlCisJOzsKKworICAgICAgLW8pIHByZXY9b3V0cHV0IDs7CisKKyAgICAgIC1yZWxlYXNlKQorCXByZXY9cmVsZWFzZQorCWNvbnRpbnVlCisJOzsKKworICAgICAgLXJwYXRoKQorICAgICAgICBwcmV2PXJwYXRoCisgICAgICAgIGNvbnRpbnVlCisgICAgICAgIDs7CisKKyAgICAgIC1zdGF0aWMpCisJIyBJZiB3ZSBoYXZlIG5vIHBpY19mbGFnLCB0aGVuIHRoaXMgaXMgdGhlIHNhbWUgYXMgLWFsbC1zdGF0aWMuCisJaWYgdGVzdCAteiAiJHBpY19mbGFnIiAmJiB0ZXN0IC1uICIkbGlua19zdGF0aWNfZmxhZyI7IHRoZW4KKyAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCisJICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGlua19zdGF0aWNfZmxhZyIKKyAgICAgICAgZmkKKwljb250aW51ZQorCTs7CisKKyAgICAgIC12ZXJzaW9uLWluZm8pCisgICAgICAgIHByZXY9dmluZm8KKyAgICAgICAgY29udGludWUKKyAgICAgICAgOzsKKworICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCisgICAgICAtKiB8ICsqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgIiRhcmciIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisgICAgICAgIDs7CisKKyAgICAgICoubyB8ICouYSkKKyAgICAgICAgIyBBIHN0YW5kYXJkIG9iamVjdC4KKyAgICAgICAgb2Jqcz0iJG9ianMgJGFyZyIKKyAgICAgICAgOzsKKworICAgICAgKi5sbykKKyAgICAgICAgIyBBIGxpYnJhcnkgb2JqZWN0LgorCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKwkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCisJICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgorCSAgICBwcmV2PQorCSAgICBjb250aW51ZQorCSAgZWxzZQorCSAgICAjIElmIGxpYnRvb2wgb2JqZWN0cyBhcmUgdW5zdXBwb3J0ZWQsIHRoZW4gd2UgbmVlZCB0byBwcmVsb2FkLgorCSAgICBwcmV2PWRscHJlZmlsZXMKKwkgIGZpCisJZmkKKworCWlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKwkgICMgUHJlbG9hZCB0aGUgb2xkLXN0eWxlIG9iamVjdC4KKwkgIGRscHJlZmlsZXM9IiRkbHByZWZpbGVzICJgJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzL1wubG8kL1wuby8nYAorCSAgcHJldj0KKwlmaQorCWxpYm9ianM9IiRsaWJvYmpzICRhcmciCisgICAgICAgIDs7CisKKyAgICAgICoubGEpCisgICAgICAgICMgQSBsaWJ0b29sLWNvbnRyb2xsZWQgbGlicmFyeS4KKworICAgICAgICBkbG5hbWU9CisgICAgICAgIGxpYmRpcj0KKyAgICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgICAgb2xkX2xpYnJhcnk9CisKKyAgICAgICAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRhcmcgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorICAgICAgICBlbHNlCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKyAgICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgICAgKi8qIHwgKlxcKikgLiAkYXJnIDs7CisgICAgICAgICopIC4gLi8kYXJnIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBpZiB0ZXN0IC16ICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGFyZycgY29udGFpbnMgbm8gLXJwYXRoIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisKKyAgICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgd2UgbGluayBhZ2FpbnN0LgorICAgICAgICBsaW5rbGliPQorICAgICAgICBmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCisgICAgICAgICAgbGlua2xpYj0iJGwiCisgICAgICAgIGRvbmUKKworICAgICAgICBpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBuYW1lIG9mIGxpbmsgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisgICAgICAgICMgRmluZCB0aGUgcmVsZXZhbnQgb2JqZWN0IGRpcmVjdG9yeSBhbmQgbGlicmFyeSBuYW1lLgorICAgICAgICBuYW1lPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJyAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAorICAgICAgICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAorICAgICAgICBpZiB0ZXN0ICJYJGRpciIgPSAiWCRhcmciOyB0aGVuCisgICAgICAgICAgZGlyPSIkb2JqZGlyIgorICAgICAgICBlbHNlCisgICAgICAgICAgZGlyPSIkZGlyLyRvYmpkaXIiCisgICAgICAgIGZpCisKKyAgICAgICAgIyBUaGlzIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbG9wZW4uCisgICAgICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KKyAgICAgICAgICBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgorICAgICAgICAgIGlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCisgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgd2UgbmVlZCB0byBwcmVsb2FkLgorICAgICAgICAgICAgcHJldj1kbHByZWZpbGVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgIyBXZSBzaG91bGQgbm90IGNyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhpcyBsaWJyYXJ5LCBidXQgd2UKKwkgICAgIyBtYXkgbmVlZCBhbnkgbGlicmFyaWVzIGl0IHJlcXVpcmVzLgorCSAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCRkZXBlbmRlbmN5X2xpYnMiCisgICAgICAgICAgICBwcmV2PQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgICMgVGhlIGxpYnJhcnkgd2FzIHNwZWNpZmllZCB3aXRoIC1kbHByZW9wZW4uCisgICAgICAgIGlmIHRlc3QgIiRwcmV2IiA9IGRscHJlZmlsZXM7IHRoZW4KKyAgICAgICAgICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKKyAgICAgICAgICAjIGFyZSByZXF1aXJlZCB0byBsaW5rKS4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRsaW5rbGliIgorICAgICAgICAgIGZpCisgICAgICAgICAgcHJldj0KKyAgICAgICAgZmkKKworICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKyAgICAgICAgICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyAkYXJnIgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgorICAgICAgICAgICAgY2FzZSAiJHRlbXBfcnBhdGggIiBpbgorICAgICAgICAgICAgKiIgJGRpciAiKikgOzsKKyAgICAgICAgICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKworCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgorICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorICAgICAgICAgICAgICAgICMgUHV0IHRoZSBtYWdpYyBsaWJkaXIgd2l0aCB0aGUgaGFyZGNvZGUgZmxhZy4KKyAgICAgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorICAgICAgICAgICAgICAgIGxpYmRpcj0iQEhBUkRDT0RFX0xJQkRJUlNAIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQljYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCisJCSoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICA7OworCQkqKQorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgIDs7CisJCWVzYWMKKyAgICAgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRmbGFnIgorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAgICAgICAjIERvIHRoZSBzYW1lIGZvciB0aGUgcGVybWFuZW50IHJ1biBwYXRoLgorICAgICAgICAgICAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgorICAgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKKyAgICAgICAgICAgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgZmkKKworCisgICAgICAgICAgY2FzZSAiJGhhcmRjb2RlX2FjdGlvbiIgaW4KKyAgICAgICAgICBpbW1lZGlhdGUpCisgICAgICAgICAgICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCisgICAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgOzsKKworICAgICAgICAgIHJlbGluaykKKyAgICAgICAgICAgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAgICAgICAgY2FzZSAiJGRpciIgaW4KKyAgICAgICAgICAgIC8qIHwgW0EtWmEtel06XFwqKSA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgYWJzZGlyPWBjZCAiJGRpciIgJiYgcHdkYAorICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkYWJzZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBkZXRlcm1pbmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgb2YgXGAkZGlyJyIgMT4mMgorICAgICAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkaXI9IiRhYnNkaXIiCisgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGRpciAtbCRuYW1lIgorICAgICAgICAgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgY29tcGlsZV9zaGxpYnBhdGg9IiRjb21waWxlX3NobGlicGF0aCRkaXI6IgorICAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICA7OworCisgICAgICAgICAgKikKKyAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGhhcmRjb2RlX2FjdGlvbicgaXMgYW4gdW5rbm93biBoYXJkY29kZSBhY3Rpb24iIDE+JjIKKyAgICAgICAgICAgIGV4aXQgMQorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisKKyAgICAgICAgICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgorICAgICAgICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkbGliZGlyLyRsaW5rbGliIgorICAgICAgICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIgLWwkbmFtZSIKKyAgICAgICAgICBlbGlmIHRlc3QgIiRoYXJkY29kZV9zaGxpYnBhdGhfdmFyIiA9IHllczsgdGhlbgorICAgICAgICAgICAgZmluYWxpemVfc2hsaWJwYXRoPSIkZmluYWxpemVfc2hsaWJwYXRoJGxpYmRpcjoiCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCisgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIgLWwkbmFtZSIKKyAgICAgICAgICBmaQorICAgICAgICBlbHNlCisgICAgICAgICAgIyBUcmFuc2Zvcm0gZGlyZWN0bHkgdG8gb2xkIGFyY2hpdmVzIGlmIHdlIGRvbid0IGJ1aWxkIG5ldyBsaWJyYXJpZXMuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJHBpY19mbGFnIiAmJiB0ZXN0IC16ICIkb2xkX2xpYnJhcnkiOyB0aGVuCisgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZmkKKworCSAgIyBIZXJlIHdlIGFzc3VtZSB0aGF0IG9uZSBvZiBoYXJkY29kZV9kaXJlY3Qgb3IgaGFyZGNvZGVfbWludXNfTAorCSAgIyBpcyBub3QgdW5zdXBwb3J0ZWQuICBUaGlzIGlzIHZhbGlkIG9uIGFsbCBrbm93biBzdGF0aWMgYW5kCisJICAjIHNoYXJlZCBwbGF0Zm9ybXMuCisJICBpZiB0ZXN0ICIkaGFyZGNvZGVfZGlyZWN0IiAhPSB1bnN1cHBvcnRlZDsgdGhlbgorCSAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIGxpbmtsaWI9IiRvbGRfbGlicmFyeSIKKwkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCisJICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJGxpbmtsaWIiCisJICBlbHNlCisJICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIgLWwkbmFtZSIKKwkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgLUwkZGlyIC1sJG5hbWUiCisJICBmaQorICAgICAgICBmaQorCisJIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgorCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKKwljb250aW51ZQorICAgICAgICA7OworCisgICAgICAjIFNvbWUgb3RoZXIgY29tcGlsZXIgYXJndW1lbnQuCisgICAgICAqKQorCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAorCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCisJYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAorCWNhc2UgIiRhcmciIGluCisJKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCisJICBhcmc9IlwiJGFyZ1wiIgorCSAgOzsKKwllc2FjCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICMgTm93IGFjdHVhbGx5IHN1YnN0aXR1dGUgdGhlIGFyZ3VtZW50IGludG8gdGhlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJGFyZyI7IHRoZW4KKwljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGFyZyIKKwlmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkYXJnIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHRoZSBcYCRwcmV2YXJnJyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiR2aW5mbyIgJiYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgY2Fubm90IHNwZWNpZnkgYm90aCBcYC12ZXJzaW9uLWluZm8nIGFuZCBcYC1yZWxlYXNlJyIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgb2xkbGliPQorICAgIG9sZG9ianM9CisgICAgY2FzZSAiJG91dHB1dCIgaW4KKyAgICAiIikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgICA7OworCisgICAgKi8qIHwgKlxcKikKKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IG91dHB1dCBmaWxlIFxgJG91dHB1dCcgbXVzdCBoYXZlIG5vIGRpcmVjdG9yeSBjb21wb25lbnRzIiAxPiYyCisgICAgICBleGl0IDEKKyAgICAgIDs7CisKKyAgICAqLmEpCisgICAgICAjIE5vdyBzZXQgdGhlIHZhcmlhYmxlcyBmb3IgYnVpbGRpbmcgb2xkIGxpYnJhcmllcy4KKyAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubworICAgICAgYnVpbGRfb2xkX2xpYnM9eWVzCisgICAgICBvbGRsaWI9IiRvdXRwdXQiCisgICAgICAkc2hvdyAiJHJtICRvbGRsaWIiCisgICAgICAkcnVuICRybSAkb2xkbGliCisgICAgICA7OworCisgICAgKi5sYSkKKyAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgZ2VuZXJhdGUgbGlicmFyaWVzIG9mIHRoZSBmb3JtIGBsaWJOQU1FLmxhJy4KKyAgICAgIGNhc2UgIiRvdXRwdXQiIGluCisgICAgICBsaWIqKSA7OworICAgICAgKikKKwkkZWNobyAiJG1vZGVuYW1lOiBsaWJ0b29sIGxpYnJhcnkgXGAkYXJnJyBtdXN0IGJlZ2luIHdpdGggXGBsaWInIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisJOzsKKyAgICAgIGVzYWMKKworICAgICAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzL1wubGEkLy8nIC1lICdzL15saWIvLydgCisgICAgICBldmFsIGxpYm5hbWU9XCIkbGlibmFtZV9zcGVjXCIKKworICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgorICAgICAgbGlicmFyeV9uYW1lcz0KKyAgICAgIG9sZF9saWJyYXJ5PQorICAgICAgZGxuYW1lPQorICAgICAgY3VycmVudD0wCisgICAgICByZXZpc2lvbj0wCisgICAgICBhZ2U9MAorCisgICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0czokb2JqcyIgMj4mMQorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgICMgSG93IHRoZSBoZWNrIGFyZSB3ZSBzdXBwb3NlZCB0byB3cml0ZSBhIHdyYXBwZXIgZm9yIGEgc2hhcmVkIGxpYnJhcnk/CisgICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgbWF5IG5vdCBkZXBlbmQgb24gdW5pbnN0YWxsZWQgbGlicmFyaWVzOiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIGxpYnRvb2wgbGlicmFyaWVzIiAxPiYyCisgICAgICAgICMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHdpdGggXGAtcnBhdGgnIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgc2V0IGR1bW15ICRycGF0aAorICAgICAgaWYgdGVzdCAkIyAtZ3QgMjsgdGhlbgorCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGlnbm9yaW5nIG11bHRpcGxlIFxgLXJwYXRoJ3MgZm9yIGEgbGlidG9vbCBsaWJyYXJ5IiAxPiYyCisgICAgICBmaQorICAgICAgaW5zdGFsbF9saWJkaXI9IiQyIgorCisgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFyZ3VtZW50LgorICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOicKKyAgICAgIHNldCBkdW1teSAkdmluZm8KKyAgICAgIElGUz0iJHNhdmVfaWZzIgorCisgICAgICBpZiB0ZXN0IC1uICIkNSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCisgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIHRlc3QgLW4gIiQyIiAmJiBjdXJyZW50PSIkMiIKKyAgICAgIHRlc3QgLW4gIiQzIiAmJiByZXZpc2lvbj0iJDMiCisgICAgICB0ZXN0IC1uICIkNCIgJiYgYWdlPSIkNCIKKworICAgICAgIyBDaGVjayB0aGF0IGVhY2ggb2YgdGhlIHRoaW5ncyBhcmUgdmFsaWQgbnVtYmVycy4KKyAgICAgIGNhc2UgIiRjdXJyZW50IiBpbgorICAgICAgMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7CisgICAgICAqKQorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBDVVJSRU5UIFxgJGN1cnJlbnQnIGlzIG5vdCBhIG5vbm5lZ2F0aXZlIGludGVnZXIiIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICBjYXNlICIkcmV2aXNpb24iIGluCisgICAgICAwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKKyAgICAgICopCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFJFVklTSU9OIFxgJHJldmlzaW9uJyBpcyBub3QgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIiAxPiYyCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgY2FzZSAiJGFnZSIgaW4KKyAgICAgIDAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OworICAgICAgKikKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCR2aW5mbycgaXMgbm90IHZhbGlkIHZlcnNpb24gaW5mb3JtYXRpb24iIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgIGlmIHRlc3QgJGFnZSAtZ3QgJGN1cnJlbnQ7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCisgICAgICAgIGV4aXQgMQorICAgICAgZmkKKworICAgICAgIyBDYWxjdWxhdGUgdGhlIHZlcnNpb24gdmFyaWFibGVzLgorICAgICAgdmVyc2lvbl92YXJzPSJ2ZXJzaW9uX3R5cGUgY3VycmVudCBhZ2UgcmV2aXNpb24iCisgICAgICBjYXNlICIkdmVyc2lvbl90eXBlIiBpbgorICAgICAgbm9uZSkgOzsKKworICAgICAgbGludXgpCisgICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyBtYWpvciB2ZXJzdWZmaXgiCisgICAgICAgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKyAgICAgICAgdmVyc3VmZml4PSIkbWFqb3IuJGFnZS4kcmV2aXNpb24iCisgICAgICAgIDs7CisKKyAgICAgIG9zZikKKyAgICAgICAgdmVyc2lvbl92YXJzPSIkdmVyc2lvbl92YXJzIHZlcnN1ZmZpeCB2ZXJzdHJpbmciCisgICAgICAgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKKyAgICAgICAgdmVyc3VmZml4PSIkY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKKyAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3VmZml4IgorCisgICAgICAgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCisgICAgICAgIGxvb3A9JGFnZQorICAgICAgICB3aGlsZSB0ZXN0ICRsb29wICE9IDA7IGRvCisgICAgICAgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKKyAgICAgICAgICBsb29wPWBleHByICRsb29wIC0gMWAKKyAgICAgICAgICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtpZmFjZX0uMCIKKyAgICAgICAgZG9uZQorCisgICAgICAgICMgTWFrZSBleGVjdXRhYmxlcyBkZXBlbmQgb24gb3VyIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgdmVyc3RyaW5nPSIkdmVyc3RyaW5nOiR7Y3VycmVudH0uMCIKKyAgICAgICAgOzsKKworICAgICAgc3Vub3MpCisgICAgICAgIHZlcnNpb25fdmFycz0iJHZlcnNpb25fdmFycyBtYWpvciB2ZXJzdWZmaXgiCisgICAgICAgIG1ham9yPSIkY3VycmVudCIKKyAgICAgICAgdmVyc3VmZml4PSIkY3VycmVudC4kcmV2aXNpb24iCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gbGlicmFyeSB2ZXJzaW9uIHR5cGUgXGAkdmVyc2lvbl90eXBlJyIgMT4mMgorICAgICAgICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBDcmVhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnksIG9yIHJlbW92ZSBvdXIgb3V0cHV0cyBpZiB3ZSBuZWVkIHRvLgorICAgICAgaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuCisgICAgICAgICRzaG93ICIkcm0gJG9iamRpci8kb3V0cHV0ICRvYmpkaXIvJGxpYm5hbWUuKiAkb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioiCisgICAgICAgICRydW4gJHJtICRvYmpkaXIvJG91dHB1dCAkb2JqZGlyLyRsaWJuYW1lLiogJG9iamRpci8ke2xpYm5hbWV9JHtyZWxlYXNlfS4qCisgICAgICBlbHNlCisgICAgICAgICRzaG93ICIkbWtkaXIgJG9iamRpciIKKyAgICAgICAgJHJ1biAkbWtkaXIgJG9iamRpcgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorCWVsc2UKKwkgIGV4aXQgJHN0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCisgICAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkIiA9IHllczsgdGhlbgorICAgICAgICBpZiB0ZXN0ICIkYWxsb3dfdW5kZWZpbmVkX2ZsYWciID0gdW5zdXBwb3J0ZWQ7IHRoZW4KKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCisgICAgICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCisJICBidWlsZF9vbGRfbGlicz15ZXMKKyAgICAgICAgZmkKKyAgICAgIGVsc2UKKyAgICAgICAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KKyAgICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9IiRub191bmRlZmluZWRfZmxhZyIKKyAgICAgIGZpCisKKyAgICAgICMgQWRkIGxpYmMgdG8gZGVwbGlicyBvbiBhbGwgc3lzdGVtcy4KKyAgICAgIGRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCisgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgICBldmFsIGxpYnJhcnlfbmFtZXM9XCIkbGlicmFyeV9uYW1lc19zcGVjXCIKKyAgICAgICAgc2V0IGR1bW15ICRsaWJyYXJ5X25hbWVzCisgICAgICAgIHJlYWxuYW1lPSIkMiIKKyAgICAgICAgc2hpZnQ7IHNoaWZ0CisKKyAgICAgICAgaWYgdGVzdCAtbiAiJHNvbmFtZV9zcGVjIjsgdGhlbgorICAgICAgICAgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKKyAgICAgICAgZWxzZQorICAgICAgICAgIHNvbmFtZT0iJHJlYWxuYW1lIgorICAgICAgICBmaQorCisgICAgICAgIGxpYj0iJG9iamRpci8kcmVhbG5hbWUiCisJZm9yIGxpbmsKKwlkbworCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgorCWRvbmUKKworICAgICAgICAjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIFBJQy4KKyAgICAgICAgdGVzdCAteiAiJHBpY19mbGFnIiAmJiBsaWJvYmpzPWAkZWNobyAiWCRsaWJvYmpzICIgfCAkWHNlZCAtZSAncy9cLmxvIC8ubyAvZycgLWUgJ3MvICQvL2cnYAorCisgICAgICAgICMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KKyAgICAgICAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfY21kc1wiCisgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICAgIGRvbmUKKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICAgIyBDcmVhdGUgbGlua3MgdG8gdGhlIHJlYWwgbGlicmFyeS4KKyAgICAgICAgZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCisgICAgICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorICAgICAgICAgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSknIHx8IGV4aXQgJD8KKyAgICAgICAgZG9uZQorCisgICAgICAgICMgSWYgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgorICAgICAgICBpZiB0ZXN0ICIkZXhwb3J0X2R5bmFtaWMiID0geWVzOyB0aGVuCisgICAgICAgICAgIyBPbiBhbGwga25vd24gb3BlcmF0aW5nIHN5c3RlbXMsIHRoZXNlIGFyZSBpZGVudGljYWwuCisgICAgICAgICAgZGxuYW1lPSIkc29uYW1lIgorICAgICAgICBmaQorICAgICAgZmkKKworICAgICAgIyBOb3cgc2V0IHRoZSB2YXJpYWJsZXMgZm9yIGJ1aWxkaW5nIG9sZCBsaWJyYXJpZXMuCisgICAgICBvbGRsaWI9IiRvYmpkaXIvJGxpYm5hbWUuYSIKKyAgICAgIDs7CisKKyAgICAqLmxvIHwgKi5vKQorICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIHJlbG9hZGFibGUgb2JqZWN0cyIgMT4mMgorICAgICAgICBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1sJyBhbmQgXGAtTCcgYXJlIGlnbm9yZWQgd2hpbGUgY3JlYXRpbmcgb2JqZWN0cyIgMT4mMgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtZGxvcGVuJyBpcyBpZ25vcmVkIHdoaWxlIGNyZWF0aW5nIG9iamVjdHMiIDE+JjIKKyAgICAgICAgIyBOdWxsaWZ5IHRoZSBzeW1ib2wgZmlsZS4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJwYXRoIjsgdGhlbgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICAgKi5sbykKKyAgICAgICAgaWYgdGVzdCAtbiAiJG9ianMiOyB0aGVuCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGJ1aWxkIGxpYnJhcnkgb2JqZWN0IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzIiAxPiYyCisgICAgICAgICAgZXhpdCAxCisgICAgICAgIGZpCisgICAgICAgIGxpYm9iaj0iJG91dHB1dCIKKyAgICAgICAgb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvLm8vJ2AKKyAgICAgICAgOzsKKyAgICAgICopCisgICAgICAgIGxpYm9iaj0KKyAgICAgICAgb2JqPSIkb3V0cHV0IgorICAgICAgICA7OworICAgICAgZXNhYworCisgICAgICAjIERlbGV0ZSB0aGUgb2xkIG9iamVjdHMuCisgICAgICAkcnVuICRybSAkb2JqICRsaWJvYmoKKworICAgICAgIyBDcmVhdGUgdGhlIG9sZC1zdHlsZSBvYmplY3QuCisgICAgICByZWxvYWRfb2Jqcz0iJG9ianMiYCRlY2hvICJYJGxpYm9ianMgIiB8ICRYc2VkIC1lICdzL1teICAgICAgIF0qXC5hIC8vZycgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy9nJ2AKKworICAgICAgb3V0cHV0PSIkb2JqIgorICAgICAgZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKKyAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgZG9uZQorICAgICAgSUZTPSIkc2F2ZV9pZnMiCisKKyAgICAgICMgRXhpdCBpZiB3ZSBhcmVuJ3QgZG9pbmcgYSBsaWJyYXJ5IG9iamVjdCBmaWxlLgorICAgICAgdGVzdCAteiAiJGxpYm9iaiIgJiYgZXhpdCAwCisKKyAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiICE9IHllczsgdGhlbgorICAgICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkb24ndAorICAgICAgICAjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgorICAgICAgICAkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgorICAgICAgICAkcnVuIGV2YWwgImVjaG8gdGltZXN0YW1wID4gJGxpYm9iaiIgfHwgZXhpdCAkPworICAgICAgICBleGl0IDAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KKyAgICAgICAgIyBPbmx5IGRvIGNvbW1hbmRzIGlmIHdlIHJlYWxseSBoYXZlIGRpZmZlcmVudCBQSUMgb2JqZWN0cy4KKyAgICAgICAgcmVsb2FkX29ianM9IiRsaWJvYmpzIgorICAgICAgICBvdXRwdXQ9IiRsaWJvYmoiCisgICAgICAgIGV2YWwgY21kcz1cIiRyZWxvYWRfY21kc1wiCisgICAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9JzsnCisgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgJHNob3cgIiRjbWQiCisgICAgICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/CisgICAgICAgIGRvbmUKKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICBlbHNlCisgICAgICAgICMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgorICAgICAgICAkc2hvdyAiJExOX1MgJG9iaiAkbGlib2JqIgorICAgICAgICAkcnVuICRMTl9TICRvYmogJGxpYm9iaiB8fCBleGl0IDEKKyAgICAgIGZpCisKKyAgICAgIGV4aXQgMAorICAgICAgOzsKKworICAgICopCisgICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLXZlcnNpb24taW5mbycgaXMgaWdub3JlZCB3aGlsZSBsaW5raW5nIHByb2dyYW1zIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KKyAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCB3aGlsZSBjcmVhdGluZyBvYmplY3RzIiAxPiYyCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCisJIyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYW55IHJwYXRoIGZsYWdzLCB0aGVuIGFkZCB0aGVtLgorCWZvciBsaWJkaXIgaW4gJHJwYXRoOyBkbworICAgICAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCisgICAgICAgICAgICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgorICAgICAgICAgICAgICAgICMgUHV0IHRoZSBtYWdpYyBsaWJkaXIgd2l0aCB0aGUgaGFyZGNvZGUgZmxhZy4KKyAgICAgICAgICAgICAgICBoYXJkY29kZV9saWJkaXJzPSIkbGliZGlyIgorICAgICAgICAgICAgICAgIGxpYmRpcj0iQEhBUkRDT0RFX0xJQkRJUlNAIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIyBKdXN0IGFjY3VtdWxhdGUgdGhlIHVuaXF1ZSBsaWJkaXJzLgorCQljYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCisJCSoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKKwkJICA7OworCQkqKQorCQkgIGhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgorCQkgIDs7CisJCWVzYWMKKyAgICAgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkbGliZGlyIjsgdGhlbgorICAgICAgICAgICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCisKKyAgICAgICAgICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRmbGFnIgorICAgICAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZmxhZyIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZWxpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICAgICAgICBjYXNlICIkcGVybV9ycGF0aCAiIGluCisgICAgICAgICAgICAqIiAkbGliZGlyICIqKSA7OworICAgICAgICAgICAgKikgcGVybV9ycGF0aD0iJHBlcm1fcnBhdGggJGxpYmRpciIgOzsKKyAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICBmaQorCWRvbmUKKyAgICAgIGZpCisKKyAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgY29tcGlsZSBjb21tYW5kcy4KKyAgICAgIGlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIjsgdGhlbgorCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBIQVJEQ09ERV9MSUJESVJTQCUkaGFyZGNvZGVfbGliZGlycyVnImAKKwlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJUBIQVJEQ09ERV9MSUJESVJTQCUkaGFyZGNvZGVfbGliZGlycyVnImAKKyAgICAgIGZpCisKKyAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICMgVHJhbnNmb3JtIGFsbCB0aGUgbGlicmFyeSBvYmplY3RzIGludG8gc3RhbmRhcmQgb2JqZWN0cy4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQgIiB8ICRYc2VkIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vJ2AKKyAgICAgICAgZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiA9IHllcyAmJiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCisgICAgICAgIGRsc3ltcz0iJHtvdXRwdXR9Uy5jIgorICAgICAgZWxzZQorICAgICAgICBkbHN5bXM9CisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkZGxzeW1zIjsgdGhlbgorICAgICAgICAjIEFkZCBvdXIgb3duIHByb2dyYW0gb2JqZWN0cyB0byB0aGUgcHJlbG9hZGVkIGxpc3QuCisgICAgICAgIGRscHJlZmlsZXM9YCRlY2hvICJYJG9ianMkZGxwcmVmaWxlcyAiIHwgJFhzZWQgLWUgJ3MvXC5sbyAvLm8gL2cnIC1lICdzLyAkLy8nYAorCisJIyBEaXNjb3ZlciB0aGUgbmxpc3Qgb2YgZWFjaCBvZiB0aGUgZGxmaWxlcy4KKyAgICAgICAgbmxpc3Q9IiRvYmpkaXIvJHtvdXRwdXR9Lm5tIgorCisJaWYgdGVzdCAtZCAkb2JqZGlyOyB0aGVuCisJICAkc2hvdyAiJHJtICRubGlzdCAke25saXN0fVQiCisJICAkcnVuICRybSAiJG5saXN0IiAiJHtubGlzdH1UIgorCWVsc2UKKwkgICRzaG93ICIkbWtkaXIgJG9iamRpciIKKwkgICRydW4gJG1rZGlyICRvYmpkaXIKKwkgIHN0YXR1cz0kPworCSAgaWYgdGVzdCAkc3RhdHVzIC1lcSAwIHx8IHRlc3QgLWQgJG9iamRpcjsgdGhlbiA6CisJICBlbHNlCisJICAgIGV4aXQgJHN0YXR1cworCSAgZmkKKwlmaQorCisgICAgICAgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCisJICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKKwkgICRydW4gZXZhbCAiJE5NICRhcmcgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4+ICckbmxpc3QnIgorICAgICAgICBkb25lCisKKyAgICAgICAgIyBQYXJzZSB0aGUgbmFtZSBsaXN0IGludG8gYSBzb3VyY2UgZmlsZS4KKyAgICAgICAgJHNob3cgImNyZWF0aW5nICRvYmpkaXIvJGRsc3ltcyIKKyAgICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKwkgICMgTWFrZSBzdXJlIHdlIGF0IGxlYXN0IGhhdmUgYW4gZW1wdHkgZmlsZS4KKwkgIHRlc3QgLWYgIiRubGlzdCIgfHwgOiA+ICIkbmxpc3QiCisKKwkgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCisJICBpZiBzb3J0ICIkbmxpc3QiIHwgdW5pcSA+ICIkbmxpc3QiVDsgdGhlbgorCSAgICBtdiAtZiAiJG5saXN0IlQgIiRubGlzdCIKKwkgICAgd2NvdXQ9YHdjICIkbmxpc3QiIDI+L2Rldi9udWxsYAorCSAgICBjb3VudD1gZWNobyAiWCR3Y291dCIgfCAkWHNlZCAtZSAncy9eWyAJXSpcKFswLTldWzAtOV0qXCkuKiQvXDEvJ2AKKwkgICAgKHRlc3QgIiRjb3VudCIgLWdlIDApIDI+L2Rldi9udWxsIHx8IGNvdW50PS0xCisJICBlbHNlCisJICAgICRybSAiJG5saXN0IlQKKwkgICAgY291bnQ9LTEKKwkgIGZpCisKKwkgIGNhc2UgIiRkbHN5bXMiIGluCisJICAiIikgOzsKKwkgICouYykKKwkgICAgJGVjaG8gPiAiJG9iamRpci8kZGxzeW1zIiAiXAorLyogJGRsc3ltcyAtIHN5bWJvbCByZXNvbHV0aW9uIHRhYmxlIGZvciBcYCRvdXRwdXQnIGRsc3ltIGVtdWxhdGlvbi4gKi8KKy8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiBcIkNcIiB7CisjZW5kaWYKKworLyogUHJldmVudCB0aGUgb25seSBraW5kIG9mIGRlY2xhcmF0aW9uIGNvbmZsaWN0cyB3ZSBjYW4gbWFrZS4gKi8KKyNkZWZpbmUgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQgc29tZV9vdGhlcl9zeW1ib2wKKyNkZWZpbmUgZGxkX3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCisKKy8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCisiCisKKwkgICAgaWYgdGVzdCAtZiAiJG5saXN0IjsgdGhlbgorCSAgICAgIHNlZCAtZSAncy9eLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvJyA8ICIkbmxpc3QiID4+ICIkb2JqZGlyLyRkbHN5bXMiCisJICAgIGVsc2UKKwkgICAgICBlY2hvICcvKiBOT05FICovJyA+PiAiJG9iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb2JqZGlyLyRkbHN5bXMiICJcCisKKyN1bmRlZiBkbGRfcHJlbG9hZGVkX3N5bWJvbF9jb3VudAorI3VuZGVmIGRsZF9wcmVsb2FkZWRfc3ltYm9scworCisjaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCisjIGRlZmluZSBfX3B0cl90IHZvaWQgKgorI2Vsc2UKKyMgZGVmaW5lIF9fcHRyX3QgY2hhciAqCisjZW5kaWYKKworLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGRsZF9wcmVsb2FkZWRfc3ltYm9scywgLTEgaWYgdW5zb3J0ZWQuICovCitpbnQgZGxkX3ByZWxvYWRlZF9zeW1ib2xfY291bnQgPSAkY291bnQ7CisKKy8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLworc3RydWN0IHsKKyAgY2hhciAqbmFtZTsKKyAgX19wdHJfdCBhZGRyZXNzOworfQorZGxkX3ByZWxvYWRlZF9zeW1ib2xzW10gPQore1wKKyIKKworCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiOyB0aGVuCisJICAgICAgc2VkICdzL15cKC4qXCkgXCguKlwpJC8gIHsiXDEiLCAoX19wdHJfdCkgXCZcMn0sLycgPCAiJG5saXN0IiA+PiAiJG9iamRpci8kZGxzeW1zIgorCSAgICBmaQorCisJICAgICRlY2hvID4+ICIkb2JqZGlyLyRkbHN5bXMiICJcCisgIHswLCAoX19wdHJfdCkgMH0KK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmXAorIgorCSAgICA7OworCisJICAqKQorCSAgICAkZWNobyAiJG1vZGVuYW1lOiB1bmtub3duIHN1ZmZpeCBmb3IgXGAkZGxzeW1zJyIgMT4mMgorCSAgICBleGl0IDEKKwkgICAgOzsKKwkgIGVzYWMKKyAgICAgICAgZmkKKworICAgICAgICAjIE5vdyBjb21waWxlIHRoZSBkeW5hbWljIHN5bWJvbCBmaWxlLgorICAgICAgICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyBcIiRkbHN5bXNcIikiCisgICAgICAgICRydW4gZXZhbCAnKGNkICRvYmpkaXIgJiYgJENDIC1jJG5vX2J1aWx0aW5fZmxhZyAiJGRsc3ltcyIpJyB8fCBleGl0ICQ/CisKKyAgICAgICAgIyBUcmFuc2Zvcm0gdGhlIHN5bWJvbCBmaWxlIGludG8gdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy5vJSJgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy5vJSJgCisgICAgICBlbGlmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgIT0geWVzOyB0aGVuCisgICAgICAgIHRlc3QgLW4gIiRkbGZpbGVzJGRscHJlZmlsZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgYW5kIFxgLWRscHJlb3BlbicgYXJlIGlnbm9yZWQgd2l0aG91dCBcYC1leHBvcnQtZHluYW1pYyciIDE+JjIKKyAgICAgIGVsc2UKKyAgICAgICAgIyBXZSBrZWVwIGdvaW5nIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgcmVmZXIgdG8KKyAgICAgICAgIyBkbGRfcHJlbG9hZGVkX3N5bWJvbHMuICBUaGUgbGlua2VyIHdpbGwgZmFpbCBpZiBnbG9iYWxfc3ltYm9sX3BpcGUKKyAgICAgICAgIyByZWFsbHkgd2FzIHJlcXVpcmVkLgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBub3QgY29uZmlndXJlZCB0byBleHRyYWN0IGdsb2JhbCBzeW1ib2xzIGZyb20gZGxwcmVvcGVuZWQgZmlsZXMiIDE+JjIKKworICAgICAgICAjIE51bGxpZnkgdGhlIHN5bWJvbCBmaWxlLgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9YCRlY2hvICJYJGNvbXBpbGVfY29tbWFuZCIgfCAkWHNlZCAtZSAicyUgQFNZTUZJTEVAJSUiYAorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCisgICAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisgICAgICAgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0IiclZydgCisKKyAgICAgICAgIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCisgICAgICAgICRzaG93ICIkY29tcGlsZV9jb21tYW5kIgorICAgICAgICAkcnVuIGV2YWwgIiRjb21waWxlX2NvbW1hbmQiCisgICAgICAgIGV4aXQgJD8KKyAgICAgIGZpCisKKyAgICAgICMgUmVwbGFjZSB0aGUgb3V0cHV0IGZpbGUgc3BlY2lmaWNhdGlvbi4KKyAgICAgIGNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG9iamRpci8kb3V0cHV0IiclZydgCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG9iamRpci8kb3V0cHV0IidUJWcnYAorCisgICAgICAjIENyZWF0ZSB0aGUgYmluYXJ5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCB0aGVuIHdyYXAgaXQuCisgICAgICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorICAgICAgZWxzZQorICAgICAgICAkc2hvdyAiJG1rZGlyICRvYmpkaXIiCisJJHJ1biAkbWtkaXIgJG9iamRpcgorCXN0YXR1cz0kPworCWlmIHRlc3QgJHN0YXR1cyAtZXEgMCB8fCB0ZXN0IC1kICRvYmpkaXI7IHRoZW4gOgorCWVsc2UKKwkgIGV4aXQgJHN0YXR1cworCWZpCisgICAgICBmaQorCisgICAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBzaGxpYnBhdGhfdmFyCisgICAgICAgIHJwYXRoPQorICAgICAgICBmb3IgZGlyIGluICR0ZW1wX3JwYXRoOyBkbworICAgICAgICAgIGNhc2UgIiRkaXIiIGluCisgICAgICAgICAgLyogfCBbQS1aYS16XTpcXCopCisgICAgICAgICAgICAjIEFic29sdXRlIHBhdGguCisgICAgICAgICAgICBycGF0aD0iJHJwYXRoJGRpcjoiCisgICAgICAgICAgICA7OworICAgICAgICAgICopCisgICAgICAgICAgICAjIFJlbGF0aXZlIHBhdGg6IGFkZCBhIHRoaXNkaXIgZW50cnkuCisgICAgICAgICAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgorICAgICAgICAgICAgOzsKKyAgICAgICAgICBlc2FjCisgICAgICAgIGRvbmUKKyAgICAgICAgdGVtcF9ycGF0aD0iJHJwYXRoIgorICAgICAgZmkKKworICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KKyAgICAgICRydW4gJHJtICRvdXRwdXQKKworICAgICAgaWYgdGVzdCAtbiAiJGNvbXBpbGVfc2hsaWJwYXRoIjsgdGhlbgorICAgICAgICBjb21waWxlX2NvbW1hbmQ9IiRzaGxpYnBhdGhfdmFyPVwiJGNvbXBpbGVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCisgICAgICBmaQorICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KKyAgICAgICAgZmluYWxpemVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KKyAgICAgICAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KKyAgICAgICAgcnBhdGg9CisgICAgICAgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCisgICAgICAgICAgcnBhdGg9IiRycGF0aCRkaXI6IgorICAgICAgICBkb25lCisgICAgICAgIGNvbXBpbGVfY29tbWFuZD0iJHJ1bnBhdGhfdmFyPVwiJHJwYXRoXCQkcnVucGF0aF92YXJcIiAkY29tcGlsZV9jb21tYW5kIgorICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgZmkKKworICAgICAgY2FzZSAiJGhhcmRjb2RlX2FjdGlvbiIgaW4KKyAgICAgIHJlbGluaykKKyAgICAgICAgIyBBR0ghIEZsYW1lIHRoZSBBSVggYW5kIEhQLVVYIHBlb3BsZSBmb3IgbWUsIHdpbGwgeWE/CisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHVzaW5nIGEgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgorICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiByZWxpbmtpbmcgd2lsbCBiZSByZXF1aXJlZCBiZWZvcmUgXGAkb3V0cHV0JyBjYW4gYmUgaW5zdGFsbGVkIiAxPiYyCisgICAgICAgIDs7CisgICAgICBlc2FjCisKKyAgICAgICRzaG93ICIkY29tcGlsZV9jb21tYW5kIgorICAgICAgJHJ1biBldmFsICIkY29tcGlsZV9jb21tYW5kIiB8fCBleGl0ICQ/CisKKyAgICAgICMgTm93IGNyZWF0ZSB0aGUgd3JhcHBlciBzY3JpcHQuCisgICAgICAkc2hvdyAiY3JlYXRpbmcgJG91dHB1dCIKKworICAgICAgIyBRdW90ZSB0aGUgZmluYWxpemUgY29tbWFuZCBmb3Igc2hpcHBpbmcuCisgICAgICBmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKworICAgICAgIyBRdW90ZSAkZWNobyBmb3Igc2hpcHBpbmcuCisgICAgICBxZWNobz1gJGVjaG8gIlgkZWNobyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisKKyAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgorICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKyAgICAgICAgJHJtICRvdXRwdXQKKyAgICAgICAgdHJhcCAiJHJtICRvdXRwdXQ7IGV4aXQgMSIgMSAyIDE1CisKKyAgICAgICAgJGVjaG8gPiAkb3V0cHV0ICJcCisjISAvYmluL3NoCisKKyMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0CisjIEdlbmVyYXRlZCBieSBsdG1haW4uc2ggLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04KKyMKKyMgVGhlICRvdXRwdXQgcHJvZ3JhbSBjYW5ub3QgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgdW50aWwgYWxsIHRoZSBsaWJ0b29sCisjIGxpYnJhcmllcyB0aGF0IGl0IGRlcGVuZHMgb24gYXJlIGluc3RhbGxlZC4KKyMKKyMgVGhpcyB3cmFwcGVyIHNjcmlwdCBzaG91bGQgbmV2ZXIgYmUgbW92ZWQgb3V0IG9mIFxgYHB3ZGAnLgorIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCisKKyMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKKyMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCitYc2VkPSdzZWQgLWUgcy9eWC8vJworc2VkX3F1b3RlX3N1YnN0PSckc2VkX3F1b3RlX3N1YnN0JworCisjIFRoZSBIUC1VWCBrc2ggYW5kIFBPU0lYIHNoZWxsIHByaW50IHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN0ZG91dAorIyBpZiBDRFBBVEggaXMgc2V0LgoraWYgdGVzdCBcIlwke0NEUEFUSCtzZXR9XCIgPSBzZXQ7IHRoZW4gQ0RQQVRIPTsgZXhwb3J0IENEUEFUSDsgZmkKKworIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgoraWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCisgICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzOgorICBsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzPSckbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicycKKyAgZmluYWxpemVfY29tbWFuZD1cIiRmaW5hbGl6ZV9jb21tYW5kXCIKK2Vsc2UKKyAgIyBXaGVuIHdlIGFyZSBzb3VyY2VkIGluIGV4ZWN1dGUgbW9kZSwgXCRmaWxlIGFuZCBcJGVjaG8gYXJlIGFscmVhZHkgc2V0LgorICBpZiB0ZXN0IFwiXCRsaWJ0b29sX2V4ZWN1dGVfbWFnaWNcIiA9IFwiJG1hZ2ljXCI7IHRoZW4gOgorICBlbHNlCisgICAgZWNobz1cIiRxZWNob1wiCisgICAgZmlsZT1cIlwkMFwiCisgIGZpXAorIgorICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisKKyAgIyBGaW5kIHRoZSBkaXJlY3RvcnkgdGhhdCB0aGlzIHNjcmlwdCBsaXZlcyBpbi4KKyAgdGhpc2Rpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSokJSUnXGAKKyAgdGVzdCBcInhcJHRoaXNkaXJcIiA9IFwieFwkZmlsZVwiICYmIHRoaXNkaXI9LgorCisgICMgRm9sbG93IHN5bWJvbGljIGxpbmtzIHVudGlsIHdlIGdldCB0byB0aGUgcmVhbCB0aGlzZGlyLgorICBmaWxlPVxgbHMgLWxkIFwiXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgd2hpbGUgdGVzdCAtbiBcIlwkZmlsZVwiOyBkbworICAgIGRlc3RkaXI9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlL1teL10qXCQlJSdcYAorCisgICAgIyBJZiB0aGVyZSB3YXMgYSBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGNoYW5nZSB0aGlzZGlyLgorICAgIGlmIHRlc3QgXCJ4XCRkZXN0ZGlyXCIgIT0gXCJ4XCRmaWxlXCI7IHRoZW4KKyAgICAgIGNhc2UgXCJcJGRlc3RkaXJcIiBpbgorICAgICAgLyogfCBbQS1aYS16XTpcXCopIHRoaXNkaXI9XCJcJGRlc3RkaXJcIiA7OworICAgICAgKikgdGhpc2Rpcj1cIlwkdGhpc2Rpci9cJGRlc3RkaXJcIiA7OworICAgICAgZXNhYworICAgIGZpCisKKyAgICBmaWxlPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJV4uKi8lJSdcYAorICAgIGZpbGU9XGBscyAtbGQgXCJcJHRoaXNkaXIvXCRmaWxlXCIgfCBzZWQgLW4gJ3MvLiotPiAvL3AnXGAKKyAgZG9uZQorCisgICMgVHJ5IHRvIGdldCB0aGUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUuCisgIGFic2Rpcj1cYGNkIFwiXCR0aGlzZGlyXCIgJiYgcHdkXGAKKyAgdGVzdCAtbiBcIlwkYWJzZGlyXCIgJiYgdGhpc2Rpcj1cIlwkYWJzZGlyXCIKKworICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgorICBwcm9ncmFtPSckb3V0cHV0JworCisgIGlmIHRlc3QgLWYgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IHRoZW4iCisKKyAgICAgICAgIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCisgICAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIiAmJiB0ZXN0IC1uICIkdGVtcF9ycGF0aCI7IHRoZW4KKyAgICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgIyBBZGQgb3VyIG93biBsaWJyYXJ5IHBhdGggdG8gJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cIiR0ZW1wX3JwYXRoXCQkc2hsaWJwYXRoX3ZhclwiCisKKyAgICAjIFNvbWUgc3lzdGVtcyBjYW5ub3QgY29wZSB3aXRoIGNvbG9uLXRlcm1pbmF0ZWQgJHNobGlicGF0aF92YXIKKyAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOipcJC8vJ1xgCisKKyAgICBleHBvcnQgJHNobGlicGF0aF92YXIKKyIKKyAgICAgICAgZmkKKworICAgICAgICAkZWNobyA+PiAkb3V0cHV0ICJcCisgICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgorICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KKworICAgICAgIyBFeHBvcnQgdGhlIHBhdGggdG8gdGhlIHByb2dyYW0uCisgICAgICBQQVRIPVwiXCRwcm9nZGlyOlwkUEFUSFwiCisgICAgICBleHBvcnQgUEFUSAorCisgICAgICBleGVjIFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9CisKKyAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgorICAgICAgZXhpdCAxCisgICAgZmkKKyAgZWxzZQorICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KKyAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgorICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgorICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgorICAgIGV4aXQgMQorICBmaQorZmlcCisiCisgICAgICAgIGNobW9kICt4ICRvdXRwdXQKKyAgICAgIGZpCisgICAgICBleGl0IDAKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBTZWUgaWYgd2UgbmVlZCB0byBidWlsZCBhbiBvbGQtZmFzaGlvbmVkIGFyY2hpdmUuCisgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9ICJ5ZXMiOyB0aGVuCisgICAgICAjIFRyYW5zZm9ybSAubG8gZmlsZXMgdG8gLm8gZmlsZXMuCisgICAgICBvbGRvYmpzPSIkb2JqcyJgJGVjaG8gIlgkbGlib2JqcyAiIHwgJFhzZWQgLWUgJ3MvW14gICBdKlwuYSAvL2cnIC1lICdzL1wubG8gLy5vIC9nJyAtZSAncy8gJC8vZydgCisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBhcmNoaXZlIGNvbW1hbmRzLgorICAgICAgaWYgdGVzdCAtbiAiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMiICYmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCisJZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHNcIgorICAgICAgZWxzZQorCWV2YWwgY21kcz1cIiRvbGRfYXJjaGl2ZV9jbWRzXCIKKyAgICAgIGZpCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGZpCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlIGxpYnRvb2wgYXJjaGl2ZS4KKyAgICBjYXNlICIkb3V0cHV0IiBpbgorICAgICoubGEpCisgICAgICBvbGRfbGlicmFyeT0KKyAgICAgIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXMgJiYgb2xkX2xpYnJhcnk9IiRsaWJuYW1lLmEiCisKKyAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgorCisgICAgICAjIE9ubHkgY3JlYXRlIHRoZSBvdXRwdXQgaWYgbm90IGEgZHJ5IHJ1bi4KKyAgICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCisgICAgICAgICRlY2hvID4gJG91dHB1dCAiXAorIyAkb3V0cHV0IC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQorIyBHZW5lcmF0ZWQgYnkgbHRtYWluLnNoIC0gR05VICRQQUNLQUdFICRWRVJTSU9OCisKKyMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgorZGxuYW1lPSckZGxuYW1lJworCisjIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KK2xpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJworCisjIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KK29sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCisKKyMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgorZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJworCisjIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgorY3VycmVudD0kY3VycmVudAorYWdlPSRhZ2UKK3JldmlzaW9uPSRyZXZpc2lvbgorCisjIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46CitsaWJkaXI9JyRpbnN0YWxsX2xpYmRpcidcCisiCisgICAgICBmaQorCisgICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCisgICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgorICAgICAgJHNob3cgIihjZCAkb2JqZGlyICYmICRMTl9TIC4uLyRvdXRwdXQgJG91dHB1dCkiCisgICAgICAkcnVuIGV2YWwgIihjZCAkb2JqZGlyICYmICRMTl9TIC4uLyRvdXRwdXQgJG91dHB1dCkiIHx8IGV4aXQgMQorICAgICAgOzsKKyAgICBlc2FjCisgICAgZXhpdCAwCisgICAgOzsKKworICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCisgIGluc3RhbGwpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKKworICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIC9iaW4vc2ggYXJndW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgorICAgICMgaW5zdGFsbF9wcm9nIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MgTlQpLgorICAgIGlmIHRlc3QgIiRub25vcHQiID0gIiRTSEVMTCI7IHRoZW4KKyAgICAgICMgQWVzdGhldGljYWxseSBxdW90ZSBpdC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkbm9ub3B0IiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRhcmcgIgorICAgICAgYXJnPSIkMSIKKyAgICAgIHNoaWZ0CisgICAgZWxzZQorICAgICAgaW5zdGFsbF9wcm9nPQorICAgICAgYXJnPSIkbm9ub3B0IgorICAgIGZpCisKKyAgICAjIFRoZSByZWFsIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFsbGF0aW9uIHByb2dyYW0uCisgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgorICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICBjYXNlICIkYXJnIiBpbgorICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQorICAgICAgYXJnPSJcIiRhcmdcIiIKKyAgICAgIDs7CisgICAgZXNhYworICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyRhcmciCisKKyAgICAjIFdlIG5lZWQgdG8gYWNjZXB0IGF0IGxlYXN0IGFsbCB0aGUgQlNEIGluc3RhbGwgZmxhZ3MuCisgICAgZGVzdD0KKyAgICBmaWxlcz0KKyAgICBvcHRzPQorICAgIHByZXY9CisgICAgaW5zdGFsbF90eXBlPQorICAgIGlzZGlyPQorICAgIHN0cmlwbWU9CisgICAgZm9yIGFyZworICAgIGRvCisgICAgICBpZiB0ZXN0IC1uICIkZGVzdCI7IHRoZW4KKyAgICAgICAgZmlsZXM9IiRmaWxlcyAkZGVzdCIKKyAgICAgICAgZGVzdD0iJGFyZyIKKyAgICAgICAgY29udGludWUKKyAgICAgIGZpCisKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAtZCkgaXNkaXI9eWVzIDs7CisgICAgICAtZikgcHJldj0iLWYiIDs7CisgICAgICAtZykgcHJldj0iLWciIDs7CisgICAgICAtbSkgcHJldj0iLW0iIDs7CisgICAgICAtbykgcHJldj0iLW8iIDs7CisgICAgICAtcykKKyAgICAgICAgc3RyaXBtZT0iIC1zIgorICAgICAgICBjb250aW51ZQorICAgICAgICA7OworICAgICAgLSopIDs7CisKKyAgICAgICopCisgICAgICAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KKyAgICAgICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCisgICAgICAgICAgcHJldj0KKyAgICAgICAgZWxzZQorICAgICAgICAgIGRlc3Q9IiRhcmciCisgICAgICAgICAgY29udGludWUKKyAgICAgICAgZmkKKyAgICAgICAgOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIHRoZSBhcmd1bWVudC4KKyAgICAgIGFyZz1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKKyAgICAgIGNhc2UgIiRhcmciIGluCisgICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKKwlhcmc9IlwiJGFyZ1wiIgorCTs7CisgICAgICBlc2FjCisgICAgICBpbnN0YWxsX3Byb2c9IiRpbnN0YWxsX3Byb2cgJGFyZyIKKyAgICBkb25lCisKKyAgICBpZiB0ZXN0IC16ICIkaW5zdGFsbF9wcm9nIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIHByb2dyYW0iIDE+JjIKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogdGhlIFxgJHByZXYnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgorICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgaWYgdGVzdCAteiAiJGZpbGVzIjsgdGhlbgorICAgICAgaWYgdGVzdCAteiAiJGRlc3QiOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IG5vIGZpbGUgb3IgZGVzdGluYXRpb24gc3BlY2lmaWVkIiAxPiYyCisgICAgICBlbHNlCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgorICAgICAgZmkKKyAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgorICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCisKKyAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KKyAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCisgICAgaWYgdGVzdCAtbiAiJGlzZGlyIjsgdGhlbgorICAgICAgZGVzdGRpcj0iJGRlc3QiCisgICAgICBkZXN0bmFtZT0KKyAgICBlbHNlCisgICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisgICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCisgICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorCisgICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCisgICAgICBzZXQgZHVtbXkgJGZpbGVzCisgICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCisgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IFxgJGRlc3QnIGlzIG5vdCBhIGRpcmVjdG9yeSIgMT4mMgorICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQorICAgIGZpCisgICAgY2FzZSAiJGRlc3RkaXIiIGluCisgICAgLyogfCBbQS1aYS16XTpcXCopIDs7CisgICAgKikKKyAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KKyAgICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAgICoubG8pIDs7CisgICAgICAgICopCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdGRpcicgbXVzdCBiZSBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSIgMT4mMgorICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgIGRvbmUKKyAgICAgIDs7CisgICAgZXNhYworCisgICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCB2YXJpYWJsZXMgcmF0aGVyCisgICAgIyB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9pbnN0YWxsX21hZ2ljPSIkbWFnaWMiCisKKyAgICBzdGF0aWNsaWJzPQorICAgIGZ1dHVyZV9saWJkaXJzPQorICAgIGN1cnJlbnRfbGliZGlycz0KKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisKKyAgICAgICMgRG8gZWFjaCBpbnN0YWxsYXRpb24uCisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgICouYSkKKyAgICAgICAgIyBEbyB0aGUgc3RhdGljIGxpYnJhcmllcyBsYXRlci4KKyAgICAgICAgc3RhdGljbGlicz0iJHN0YXRpY2xpYnMgJGZpbGUiCisgICAgICAgIDs7CisKKyAgICAgICoubGEpCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKKworICAgICAgICBsaWJyYXJ5X25hbWVzPQorICAgICAgICBvbGRfbGlicmFyeT0KKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgIGNhc2UgIiRmaWxlIiBpbgorICAgICAgICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisgICAgICAgICopIC4gLi8kZmlsZSA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgorICAgICAgICBpZiB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkbGliZGlyIjsgdGhlbgorICAgICAgICAgIGNhc2UgIiRjdXJyZW50X2xpYmRpcnMgIiBpbgorICAgICAgICAgICoiICRsaWJkaXIgIiopIDs7CisgICAgICAgICAgKikgY3VycmVudF9saWJkaXJzPSIkY3VycmVudF9saWJkaXJzICRsaWJkaXIiIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBlbHNlCisgICAgICAgICAgIyBOb3RlIHRoZSBsaWJkaXIgYXMgYSBmdXR1cmUgbGliZGlyLgorICAgICAgICAgIGNhc2UgIiRmdXR1cmVfbGliZGlycyAiIGluCisgICAgICAgICAgKiIgJGxpYmRpciAiKikgOzsKKyAgICAgICAgICAqKSBmdXR1cmVfbGliZGlycz0iJGZ1dHVyZV9saWJkaXJzICRsaWJkaXIiIDs7CisgICAgICAgICAgZXNhYworICAgICAgICBmaQorCisgICAgICAgIGRpcj0iYCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AvIgorICAgICAgICB0ZXN0ICJYJGRpciIgPSAiWCRmaWxlLyIgJiYgZGlyPQorICAgICAgICBkaXI9IiRkaXIkb2JqZGlyIgorCisgICAgICAgICMgU2VlIHRoZSBuYW1lcyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkuCisgICAgICAgIHNldCBkdW1teSAkbGlicmFyeV9uYW1lcworICAgICAgICBpZiB0ZXN0IC1uICIkMiI7IHRoZW4KKyAgICAgICAgICByZWFsbmFtZT0iJDIiCisgICAgICAgICAgc2hpZnQKKyAgICAgICAgICBzaGlmdAorCisgICAgICAgICAgIyBJbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgYnVpbGQgdGhlIHN5bWxpbmtzLgorICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJHJlYWxuYW1lICRkZXN0ZGlyLyRyZWFsbmFtZSIKKyAgICAgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/CisgICAgICAgICAgdGVzdCAiWCRkbG5hbWUiID0gIlgkcmVhbG5hbWUiICYmIGRsbmFtZT0KKworICAgICAgICAgIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KKyAgICAgICAgICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MuCisgICAgICAgICAgICBybWNtZD0iJHJtIgorICAgICAgICAgICAgZm9yIGxpbmtuYW1lCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICBybWNtZD0iJHJtY21kICRkZXN0ZGlyLyRsaW5rbmFtZSIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICRzaG93ICIkcm1jbWQiCisgICAgICAgICAgICAkcnVuICRybWNtZAorCisgICAgICAgICAgICAjIC4uLiBhbmQgY3JlYXRlIG5ldyBvbmVzLgorICAgICAgICAgICAgZm9yIGxpbmtuYW1lCisgICAgICAgICAgICBkbworICAgICAgICAgICAgICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRsaW5rbmFtZSIgJiYgZGxuYW1lPQorICAgICAgICAgICAgICAkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRMTl9TICRyZWFsbmFtZSAkbGlua25hbWUpIgorICAgICAgICAgICAgICAkcnVuIGV2YWwgIihjZCAkZGVzdGRpciAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICBmaQorCisgICAgICAgICAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KKyAgICAgICAgICAgICMgSW5zdGFsbCB0aGUgZHluYW1pY2FsbHktbG9hZGFibGUgbGlicmFyeS4KKyAgICAgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIgorICAgICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIiB8fCBleGl0ICQ/CisgICAgICAgICAgZmkKKworICAgICAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgICAgICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKKyAgICAgICAgICBldmFsIGNtZHM9XCIkcG9zdGluc3RhbGxfY21kc1wiCisgICAgICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nOycKKyAgICAgICAgICBmb3IgY21kIGluICRjbWRzOyBkbworICAgICAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICAgICAkc2hvdyAiJGNtZCIKKyAgICAgICAgICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPworICAgICAgICAgIGRvbmUKKyAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgZmkKKworICAgICAgICAjIEluc3RhbGwgdGhlIHBzZXVkby1saWJyYXJ5IGZvciBpbmZvcm1hdGlvbiBwdXJwb3Nlcy4KKyAgICAgICAgbmFtZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAorICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGRpci8kbmFtZSIKKyAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/CisKKyAgICAgICAgIyBNYXliZSBpbnN0YWxsIHRoZSBzdGF0aWMgbGlicmFyeSwgdG9vLgorICAgICAgICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRkaXIvJG9sZF9saWJyYXJ5IgorICAgICAgICA7OworCisgICAgICAqLmxvKQorICAgICAgICAjIEluc3RhbGwgKGkuZS4gY29weSkgYSBsaWJ0b29sIG9iamVjdC4KKworICAgICAgICAjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCisgICAgICAgIGlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KKyAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RuYW1lIgorICAgICAgICBlbHNlCisgICAgICAgICAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKKyAgICAgICAgICBkZXN0ZmlsZT0iJGRlc3RkaXIvJGRlc3RmaWxlIgorICAgICAgICBmaQorCisgICAgICAgICMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCisgICAgICAgIGNhc2UgIiRkZXN0ZmlsZSIgaW4KKyAgICAgICAgKi5sbykKKyAgICAgICAgICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKKyAgICAgICAgICA7OworICAgICAgICAqLm8pCisgICAgICAgICAgc3RhdGljZGVzdD0iJGRlc3RmaWxlIgorICAgICAgICAgIGRlc3RmaWxlPQorICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKKyAgICAgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgICAgICBleGl0IDEKKyAgICAgICAgICA7OworICAgICAgICBlc2FjCisKKyAgICAgICAgIyBJbnN0YWxsIHRoZSBsaWJ0b29sIG9iamVjdCBpZiByZXF1ZXN0ZWQuCisgICAgICAgIGlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KKyAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiCisgICAgICAgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIgfHwgZXhpdCAkPworICAgICAgICBmaQorCisgICAgICAgICMgSW5zdGFsbCB0aGUgb2xkIG9iamVjdCBpZiBlbmFibGVkLgorICAgICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCisgICAgICAgICAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KKyAgICAgICAgICBzdGF0aWNvYmo9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MvXC5sbyQvXC5vLydgCisKKyAgICAgICAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgorICAgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyBcJHN0YXRpY29iaiBcJHN0YXRpY2Rlc3QiIHx8IGV4aXQgJD8KKyAgICAgICAgZmkKKyAgICAgICAgZXhpdCAwCisgICAgICAgIDs7CisKKyAgICAgICopCisgICAgICAgICMgRG8gYSB0ZXN0IHRvIHNlZSBpZiB0aGlzIGlzIHJlYWxseSBhIGxpYnRvb2wgcHJvZ3JhbS4KKyAgICAgICAgaWYgKHNlZCAtZSAnNHEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KKyAgICAgICAgICBmaW5hbGl6ZV9jb21tYW5kPQorCisgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisgICAgICAgICAgY2FzZSAiJGZpbGUiIGluCisgICAgICAgICAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OworICAgICAgICAgICopIC4gLi8kZmlsZSA7OworICAgICAgICAgIGVzYWMKKworICAgICAgICAgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgorICAgICAgICAgIGlmIHRlc3QgLXogIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIiB8fCB0ZXN0IC16ICIkZmluYWxpemVfY29tbWFuZCI7IHRoZW4KKyAgICAgICAgICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgorICAgICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZmkKKworICAgICAgICAgIGZpbmFsaXplPXllcworICAgICAgICAgIGZvciBsaWIgaW4gJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM7IGRvCisgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSB0aGF0IGVhY2ggbGlicmFyeSBpcyBpbnN0YWxsZWQuCisgICAgICAgICAgICBsaWJkaXI9CisgICAgICAgICAgICBpZiB0ZXN0IC1mICIkbGliIjsgdGhlbgorICAgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KKyAgICAgICAgICAgICAgY2FzZSAiJGxpYiIgaW4KKyAgICAgICAgICAgICAgKi8qIHwgKlxcKikgLiAkbGliIDs7CisgICAgICAgICAgICAgICopIC4gLi8kbGliIDs7CisgICAgICAgICAgICAgIGVzYWMKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBsaWJmaWxlPSIkbGliZGlyL2AkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlZydgIgorICAgICAgICAgICAgaWYgdGVzdCAteiAiJGxpYmRpciI7IHRoZW4KKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBjb250YWlucyBubyAtcnBhdGggaW5mb3JtYXRpb24iIDE+JjIKKyAgICAgICAgICAgIGVsaWYgdGVzdCAtZiAiJGxpYmZpbGUiOyB0aGVuIDoKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkbGliJyBoYXMgbm90IGJlZW4gaW5zdGFsbGVkIGluIFxgJGxpYmRpciciIDE+JjIKKyAgICAgICAgICAgICAgZmluYWxpemU9bm8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorCisgICAgICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgIiRmaW5hbGl6ZSIgPSB5ZXM7IHRoZW4KKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogcmVsaW5raW5nIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKKyAgICAgICAgICAgICAgJHNob3cgIiRmaW5hbGl6ZV9jb21tYW5kIgorICAgICAgICAgICAgICBpZiAkcnVuIGV2YWwgIiRmaW5hbGl6ZV9jb21tYW5kIjsgdGhlbiA6CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogcmVsaW5rIFxgJGZpbGUnIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgYmVmb3JlIGluc3RhbGxpbmcgaXQiIDE+JjIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBmaWxlPSIkb2JqZGlyLyRmaWxlIlQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IHJlbGluayBcYCRmaWxlJyBvbiBiZWhhbGYgb2YgeW91ciBidWdneSBzeXN0ZW0gbGlua2VyIiAxPiYyCisgICAgICAgICAgICBmaQorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICMgSW5zdGFsbCB0aGUgYmluYXJ5IHRoYXQgd2UgY29tcGlsZWQgZWFybGllci4KKwkgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAicyVcKFteL10qXCkkJSRvYmpkaXIvXDElImAKKyAgICAgICAgICBmaQorICAgICAgICBmaQorCisgICAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nJHN0cmlwbWUgJGZpbGUgJGRlc3QiCisgICAgICAgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZ1wkc3RyaXBtZSBcJGZpbGUgXCRkZXN0IiB8fCBleGl0ICQ/CisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KKyAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCisKKyAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCisgICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/CisKKyAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KKyAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCisgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KKyAgICAgICAgSUZTPSIkc2F2ZV9pZnMiCisgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KKyAgICAgIGRvbmUKKyAgICAgIElGUz0iJHNhdmVfaWZzIgorICAgIGRvbmUKKworICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKKyAgICBmaQorCisgICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KKyAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCisgICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCisgICAgICBleGVjICRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBmaW5pc2ggbW9kZQorICBmaW5pc2gpCisgICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgorICAgIGxpYmRpcnM9IiRub25vcHQiCisKKyAgICBpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMkZmluaXNoX2V2YWwiICYmIHRlc3QgLW4gIiRsaWJkaXJzIjsgdGhlbgorICAgICAgZm9yIGRpcgorICAgICAgZG8KKyAgICAgICAgbGliZGlycz0iJGxpYmRpcnMgJGRpciIKKyAgICAgIGRvbmUKKworICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKwlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCisJICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgorCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKKyAgICAgICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworICAgICAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCisgICAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKyAgICAgICAgICAgICRzaG93ICIkY21kIgorICAgICAgICAgICAgJHJ1biBldmFsICIkY21kIgorICAgICAgICAgIGRvbmUKKyAgICAgICAgICBJRlM9IiRzYXZlX2lmcyIKKwlmaQorCWlmIHRlc3QgLW4gIiRmaW5pc2hfZXZhbCI7IHRoZW4KKwkgICMgRG8gdGhlIHNpbmdsZSBmaW5pc2hfZXZhbC4KKwkgIGV2YWwgY21kcz1cIiRmaW5pc2hfZXZhbFwiCisJICAkcnVuIGV2YWwgIiRjbWRzIgorCWZpCisgICAgICBkb25lCisgICAgZmkKKworICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBlY2hvICJMaWJyYXJpZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCBpbjoiCisgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KKyAgICAgIGVjaG8gIiAgICRsaWJkaXIiCisgICAgZG9uZQorICAgIGVjaG8KKyAgICBlY2hvICJUbyBsaW5rIGFnYWluc3QgaW5zdGFsbGVkIGxpYnJhcmllcyBpbiBhIGdpdmVuIGRpcmVjdG9yeSwgTElCRElSLCIKKyAgICBlY2hvICJ5b3UgbXVzdCB1c2UgdGhlIFxgLUxMSUJESVInIGZsYWcgZHVyaW5nIGxpbmtpbmcuIgorICAgIGVjaG8KKyAgICBlY2hvICIgWW91IHdpbGwgYWxzbyBuZWVkIHRvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOiIKKyAgICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gYWRkIExJQkRJUiB0byB0aGUgXGAkc2hsaWJwYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCisgICAgICBlY2hvICIgICAgIGR1cmluZyBleGVjdXRpb24iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkcnVucGF0aF92YXIiOyB0aGVuCisgICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHJ1bnBhdGhfdmFyJyBlbnZpcm9ubWVudCB2YXJpYWJsZSIKKyAgICAgIGVjaG8gIiAgICAgZHVyaW5nIGxpbmtpbmciCisgICAgZmkKKyAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyI7IHRoZW4KKyAgICAgIGxpYmRpcj1MSUJESVIKKyAgICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKKworICAgICAgZWNobyAiICAgLSB1c2UgdGhlIFxgJGZsYWcnIGxpbmtlciBmbGFnIgorICAgIGZpCisgICAgaWYgdGVzdCAtZiAvZXRjL2xkLnNvLmNvbmY7IHRoZW4KKyAgICAgIGVjaG8gIiAgIC0gaGF2ZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGFkZCBMSUJESVIgdG8gXGAvZXRjL2xkLnNvLmNvbmYnIgorICAgIGZpCisgICAgZWNobworICAgIGVjaG8gIlNlZSBhbnkgb3BlcmF0aW5nIHN5c3RlbSBkb2N1bWVudGF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMgZm9yIgorICAgIGVjaG8gIm1vcmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIGxkKDEpIGFuZCBsZC5zbyg4KSBtYW51YWwgcGFnZXMuIgorICAgIGVjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICBleGl0IDAKKyAgICA7OworCisgICMgbGlidG9vbCBleGVjdXRlIG1vZGUKKyAgZXhlY3V0ZSkKKyAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBleGVjdXRlIgorCisgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGNvbW1hbmQgbmFtZS4KKyAgICBjbWQ9IiRub25vcHQiCisgICAgaWYgdGVzdCAteiAiJGNtZCI7IHRoZW4KKyAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBDT01NQU5EIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiCisgICAgICBleGl0IDEKKyAgICBmaQorCisgICAgIyBIYW5kbGUgLWRsb3BlbiBmbGFncyBpbW1lZGlhdGVseS4KKyAgICBmb3IgZmlsZSBpbiAkZXhlY3V0ZV9kbGZpbGVzOyBkbworICAgICAgaWYgdGVzdCAtZiAiJGZpbGUiOyB0aGVuIDoKKyAgICAgIGVsc2UKKwkkZWNobyAiJG1vZGVuYW1lOiBcYCRmaWxlJyBpcyBub3QgYSBmaWxlIiAxPiYyCisJJGVjaG8gIiRoZWxwIiAxPiYyCisJZXhpdCAxCisgICAgICBmaQorCisgICAgICBkaXI9CisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgICoubGEpCisgICAgICAgICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhpcyByZWFsbHkgaXMgYSBsaWJ0b29sIGFyY2hpdmUuCisgICAgICAgIGlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICdeIyBHZW5lcmF0ZWQgYnkgbHRtYWluXC5zaCcpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgICAgICAgIGVsc2UKKyAgICAgICAgICAkZWNobyAiJG1vZGVuYW1lOiBcYCRsaWInIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgorICAgICAgICAgICRlY2hvICIkaGVscCIgMT4mMgorICAgICAgICAgIGV4aXQgMQorICAgICAgICBmaQorCisJIyBSZWFkIHRoZSBsaWJ0b29sIGxpYnJhcnkuCisJZGxuYW1lPQorCWxpYnJhcnlfbmFtZXM9CisKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCisJY2FzZSAiJGZpbGUiIGluCisJKi8qIHwgKlxcKikgLiAkZmlsZSA7OworICAgICAgICAqKSAuIC4vJGZpbGUgOzsKKwllc2FjCisKKwkjIFNraXAgdGhpcyBsaWJyYXJ5IGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZC4KKwlpZiB0ZXN0IC16ICIkZGxuYW1lIjsgdGhlbgorCSAgIyBXYXJuIGlmIGl0IHdhcyBhIHNoYXJlZCBsaWJyYXJ5LgorCSAgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiICYmICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgJGZpbGUnIHdhcyBub3QgbGlua2VkIHdpdGggXGAtZXhwb3J0LWR5bmFtaWMnIgorCSAgY29udGludWUKKwlmaQorCisJZGlyPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCisJdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KKworCWlmIHRlc3QgLWYgIiRkaXIvJG9iamRpci8kZGxuYW1lIjsgdGhlbgorCSAgZGlyPSIkZGlyLyRvYmpkaXIiCisJZWxzZQorCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGZpbmQgXGAkZGxuYW1lJyBpbiBcYCRkaXInIG9yIFxgJGRpci8kb2JqZGlyJyIgMT4mMgorCSAgZXhpdCAxCisJZmkKKwk7OworCisgICAgICAqLmxvKQorCSMgSnVzdCBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAubG8gZmlsZS4KKwlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKwl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgorCTs7CisKKyAgICAgICopCisJJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZyBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG5vbi1saWJ0b29sIGxpYnJhcmllcyBhbmQgb2JqZWN0cyIgMT4mMgorICAgICAgICBjb250aW51ZQorCTs7CisgICAgICBlc2FjCisKKyAgICAgICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRobmFtZS4KKyAgICAgIGFic2Rpcj1gY2QgIiRkaXIiICYmIHB3ZGAKKyAgICAgIHRlc3QgLW4gIiRhYnNkaXIiICYmIGRpcj0iJGFic2RpciIKKworICAgICAgIyBOb3cgYWRkIHRoZSBkaXJlY3RvcnkgdG8gc2hsaWJwYXRoX3Zhci4KKyAgICAgIGlmIGV2YWwgInRlc3QgLXogXCJcJCRzaGxpYnBhdGhfdmFyXCIiOyB0aGVuCisJZXZhbCAiJHNobGlicGF0aF92YXI9XCJcJGRpclwiIgorICAgICAgZWxzZQorCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXI6XCQkc2hsaWJwYXRoX3ZhclwiIgorICAgICAgZmkKKyAgICBkb25lCisKKyAgICAjIFRoaXMgdmFyaWFibGUgdGVsbHMgd3JhcHBlciBzY3JpcHRzIGp1c3QgdG8gc2V0IHNobGlicGF0aF92YXIKKyAgICAjIHJhdGhlciB0aGFuIHJ1bm5pbmcgdGhlaXIgcHJvZ3JhbXMuCisgICAgbGlidG9vbF9leGVjdXRlX21hZ2ljPSIkbWFnaWMiCisKKyAgICAjIENoZWNrIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGEgd3JhcHBlciBzY3JpcHQuCisgICAgYXJncz0KKyAgICBmb3IgZmlsZQorICAgIGRvCisgICAgICBjYXNlICIkZmlsZSIgaW4KKyAgICAgIC0qKSA7OworICAgICAgKikKKyAgICAgICAgIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgorICAgICAgICBpZiAoc2VkIC1lICc0cScgJGZpbGUgfCBlZ3JlcCAnXiMgR2VuZXJhdGVkIGJ5IGx0bWFpblwuc2gnKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgorCSAgY2FzZSAiJGZpbGUiIGluCisJICAqLyogfCAqXFwqKSAuICRmaWxlIDs7CisJICAqKSAuIC4vJGZpbGUgOzsKKwkgIGVzYWMKKworCSAgIyBUcmFuc2Zvcm0gYXJnIHRvIHdyYXBwZWQgbmFtZS4KKwkgIGZpbGU9IiRwcm9nZGlyLyRwcm9ncmFtIgorCWZpCisgICAgICAgIDs7CisgICAgICBlc2FjCisgICAgICAjIFF1b3RlIGFyZ3VtZW50cyAodG8gcHJlc2VydmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMpLgorICAgICAgZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCisgICAgICBhcmdzPSIkYXJncyBcIiRmaWxlXCIiCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KKyAgICAgICMgRXhwb3J0IHRoZSBzaGxpYnBhdGhfdmFyLgorICAgICAgZXZhbCAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorCisgICAgICAjIE5vdyBhY3R1YWxseSBleGVjIHRoZSBjb21tYW5kLgorICAgICAgZXZhbCAiZXhlYyBcJGNtZCRhcmdzIgorCisgICAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZXhlYyBcJGNtZCRhcmdzIgorICAgICAgZXhpdCAxCisgICAgZWxzZQorICAgICAgIyBEaXNwbGF5IHdoYXQgd291bGQgYmUgZG9uZS4KKyAgICAgIGV2YWwgIlwkZWNobyBcIlwkc2hsaWJwYXRoX3Zhcj1cJCRzaGxpYnBhdGhfdmFyXCIiCisgICAgICAkZWNobyAiZXhwb3J0ICRzaGxpYnBhdGhfdmFyIgorICAgICAgJGVjaG8gIiRjbWQkYXJncyIKKyAgICAgIGV4aXQgMAorICAgIGZpCisgICAgOzsKKworICAjIGxpYnRvb2wgdW5pbnN0YWxsIG1vZGUKKyAgdW5pbnN0YWxsKQorICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IHVuaW5zdGFsbCIKKyAgICBybT0iJG5vbm9wdCIKKyAgICBmaWxlcz0KKworICAgIGZvciBhcmcKKyAgICBkbworICAgICAgY2FzZSAiJGFyZyIgaW4KKyAgICAgIC0qKSBybT0iJHJtICRhcmciIDs7CisgICAgICAqKSBmaWxlcz0iJGZpbGVzICRhcmciIDs7CisgICAgICBlc2FjCisgICAgZG9uZQorCisgICAgaWYgdGVzdCAteiAiJHJtIjsgdGhlbgorICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhbiBSTSBwcm9ncmFtIiAxPiYyCisgICAgICAkZWNobyAiJGhlbHAiIDE+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBmb3IgZmlsZSBpbiAkZmlsZXM7IGRvCisgICAgICBkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKKyAgICAgIHRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCisgICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCisKKyAgICAgIHJtZmlsZXM9IiRmaWxlIgorCisgICAgICBjYXNlICIkbmFtZSIgaW4KKyAgICAgICoubGEpCisgICAgICAgICMgUG9zc2libHkgYSBsaWJ0b29sIGFyY2hpdmUsIHNvIHZlcmlmeSBpdC4KKyAgICAgICAgaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgJ14jIEdlbmVyYXRlZCBieSBsdG1haW5cLnNoJykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgICAgLiAkZGlyLyRuYW1lCisKKyAgICAgICAgICAjIERlbGV0ZSB0aGUgbGlidG9vbCBsaWJyYXJpZXMgYW5kIHN5bWxpbmtzLgorICAgICAgICAgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbworICAgICAgICAgICAgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kbiIKKyAgICAgICAgICAgIHRlc3QgIlgkbiIgPSAiWCRkbG5hbWUiICYmIGRsbmFtZT0KKyAgICAgICAgICBkb25lCisgICAgICAgICAgdGVzdCAtbiAiJGRsbmFtZSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kZGxuYW1lIgorICAgICAgICAgIHRlc3QgLW4gIiRvbGRfbGlicmFyeSIgJiYgcm1maWxlcz0iJHJtZmlsZXMgJGRpci8kb2xkX2xpYnJhcnkiCisKKwkgICRzaG93ICIkcm0gJHJtZmlsZXMiCisJICAkcnVuICRybSAkcm1maWxlcworCisJICBpZiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KKwkgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIHBvc3R1bmluc3RhbGwgY29tbWFuZHMuCisJICAgIGV2YWwgY21kcz1cIiRwb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRzaG93ICIkY21kIgorCSAgICAgICRydW4gZXZhbCAiJGNtZCIKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZpCisKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCisJICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KKwkgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgorCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc7JworCSAgICBmb3IgY21kIGluICRjbWRzOyBkbworCSAgICAgIElGUz0iJHNhdmVfaWZzIgorCSAgICAgICRzaG93ICIkY21kIgorCSAgICAgICRydW4gZXZhbCAiJGNtZCIKKwkgICAgZG9uZQorCSAgICBJRlM9IiRzYXZlX2lmcyIKKwkgIGZpCisKKyAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgcmVpbnN0YWxsIHRoZSBiZXN0IHJlbWFpbmluZyBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgZmkKKyAgICAgICAgOzsKKworICAgICAgKi5sbykKKyAgICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgorICAgICAgICAgIG9sZG9iaj1gJGVjaG8gIlgkbmFtZSIgfCAkWHNlZCAtZSAncy9cLmxvJC9cLm8vJ2AKKyAgICAgICAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRvbGRvYmoiCisgICAgICAgIGZpCisJJHNob3cgIiRybSAkcm1maWxlcyIKKwkkcnVuICRybSAkcm1maWxlcworICAgICAgICA7OworCisgICAgICAqKQorICAgICAgCSRzaG93ICIkcm0gJHJtZmlsZXMiCisJJHJ1biAkcm0gJHJtZmlsZXMKKwk7OworICAgICAgZXNhYworICAgIGRvbmUKKyAgICBleGl0IDAKKyAgICA7OworCisgICIiKQorICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCisgICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKKyAgICBleGl0IDEKKyAgICA7OworICBlc2FjCisKKyAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgorICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgorICBleGl0IDEKK2ZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKKworIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCitjYXNlICIkbW9kZSIgaW4KKyIiKSAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCisKK1Byb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgorCistbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKKyAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKyAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKKyAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCisgICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JworICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKKyAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCisKK01PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKKyAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQorICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcworICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQorICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5CisKK01PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgorYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgorICBleGl0IDAKKyAgOzsKKworY29tcGlsZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKKworQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgorCitDT01QSUxFLUNPTU1BTkQgaXMgYSBjb21tYW5kIHRvIGJlIHVzZWQgaW4gY3JlYXRpbmcgYSBcYHN0YW5kYXJkJyBvYmplY3QgZmlsZQorZnJvbSB0aGUgZ2l2ZW4gU09VUkNFRklMRS4KKworVGhlIG91dHB1dCBmaWxlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSByZW1vdmluZyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBmcm9tCitTT1VSQ0VGSUxFLCB0aGVuIHN1YnN0aXR1dGluZyB0aGUgQyBzb3VyY2UgY29kZSBzdWZmaXggXGAuYycgd2l0aCB0aGUKK2xpYnJhcnkgb2JqZWN0IHN1ZmZpeCwgXGAubG8nLiIKKyAgOzsKKworZXhlY3V0ZSkKKyAgJGVjaG8gXAorIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWV4ZWN1dGUgQ09NTUFORCBbQVJHU10uLi4KKworQXV0b21hdGljYWxseSBzZXQgbGlicmFyeSBwYXRoLCB0aGVuIHJ1biBhIHByb2dyYW0uCisKK1RoaXMgbW9kZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBvcHRpb25zOgorCisgIC1kbG9wZW4gRklMRSAgICAgIGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRklMRSB0byB0aGUgbGlicmFyeSBwYXRoCisKK1RoaXMgbW9kZSBzZXRzIHRoZSBsaWJyYXJ5IHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjb3JkaW5nIHRvIFxgLWRsb3BlbicKK2ZsYWdzLgorCitJZiBhbnkgb2YgdGhlIEFSR1MgYXJlIGxpYnRvb2wgZXhlY3V0YWJsZSB3cmFwcGVycywgdGhlbiB0aGV5IGFyZSB0cmFuc2xhdGVkCitpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdW5pbnN0YWxsZWQgYmluYXJ5LCBhbmQgYW55IG9mIHRoZWlyIHJlcXVpcmVkIGxpYnJhcnkKK2RpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byB0aGUgbGlicmFyeSBwYXRoLgorCitUaGVuLCBDT01NQU5EIGlzIGV4ZWN1dGVkLCB3aXRoIEFSR1MgYXMgYXJndW1lbnRzLiIKKyAgOzsKKworZmluaXNoKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9ZmluaXNoIFtMSUJESVJdLi4uCisKK0NvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMuCisKK0VhY2ggTElCRElSIGlzIGEgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgbGlidG9vbCBsaWJyYXJpZXMuCisKK1RoZSBjb21tYW5kcyB0aGF0IHRoaXMgbW9kZSBleGVjdXRlcyBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4gIFVzZQordGhlIFxgLS1kcnktcnVuJyBvcHRpb24gaWYgeW91IGp1c3Qgd2FudCB0byBzZWUgd2hhdCB3b3VsZCBiZSBleGVjdXRlZC4iCisgIDs7CisKK2luc3RhbGwpCisgICRlY2hvIFwKKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1pbnN0YWxsIElOU1RBTEwtQ09NTUFORC4uLgorCitJbnN0YWxsIGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcy4KKworSU5TVEFMTC1DT01NQU5EIGlzIHRoZSBpbnN0YWxsYXRpb24gY29tbWFuZC4gIFRoZSBmaXJzdCBjb21wb25lbnQgc2hvdWxkIGJlCitlaXRoZXIgdGhlIFxgaW5zdGFsbCcgb3IgXGBjcCcgcHJvZ3JhbS4KKworVGhlIHJlc3Qgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGludGVycHJldGVkIGFzIGFyZ3VtZW50cyB0byB0aGF0IGNvbW1hbmQgKG9ubHkKK0JTRC1jb21wYXRpYmxlIGluc3RhbGwgb3B0aW9ucyBhcmUgcmVjb2duaXplZCkuIgorICA7OworCitsaW5rKQorICAkZWNobyBcCisiVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9bGluayBMSU5LLUNPTU1BTkQuLi4KKworTGluayBvYmplY3QgZmlsZXMgb3IgbGlicmFyaWVzIHRvZ2V0aGVyIHRvIGZvcm0gYW5vdGhlciBsaWJyYXJ5LCBvciB0bworY3JlYXRlIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworTElOSy1DT01NQU5EIGlzIGEgY29tbWFuZCB1c2luZyB0aGUgQyBjb21waWxlciB0aGF0IHlvdSB3b3VsZCB1c2UgdG8gY3JlYXRlCithIHByb2dyYW0gZnJvbSBzZXZlcmFsIG9iamVjdCBmaWxlcy4KKworVGhlIGZvbGxvd2luZyBjb21wb25lbnRzIG9mIExJTkstQ09NTUFORCBhcmUgdHJlYXRlZCBzcGVjaWFsbHk6CisKKyAgLWFsbC1zdGF0aWMgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgYXQgYWxsCisgIC1kbG9wZW4gRklMRSAgICAgIFxgLWRscHJlb3BlbicgRklMRSBpZiBpdCBjYW5ub3QgYmUgZGxvcGVuZWQgYXQgcnVudGltZQorICAtZGxwcmVvcGVuIEZJTEUgICBsaW5rIGluIEZJTEUgYW5kIGFkZCBpdHMgc3ltYm9scyB0byBkbGRfcHJlbG9hZGVkX3N5bWJvbHMKKyAgLWV4cG9ydC1keW5hbWljICAgYWxsb3cgc3ltYm9scyBmcm9tIE9VVFBVVC1GSUxFIHRvIGJlIHJlc29sdmVkIHdpdGggZGxzeW0oMykKKyAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcworICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQorICAtbm8tdW5kZWZpbmVkICAgICBkZWNsYXJlIHRoYXQgYSBsaWJyYXJ5IGRvZXMgbm90IHJlZmVyIHRvIGV4dGVybmFsIHN5bWJvbHMKKyAgLW8gT1VUUFVULUZJTEUgICAgY3JlYXRlIE9VVFBVVC1GSUxFIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3RzCisgIC1yZWxlYXNlIFJFTEVBU0UgIHNwZWNpZnkgcGFja2FnZSByZWxlYXNlIGluZm9ybWF0aW9uCisgIC1ycGF0aCBMSUJESVIgICAgIHRoZSBjcmVhdGVkIGxpYnJhcnkgd2lsbCBldmVudHVhbGx5IGJlIGluc3RhbGxlZCBpbiBMSUJESVIKKyAgLXN0YXRpYyAgICAgICAgICAgZG8gbm90IGRvIGFueSBkeW5hbWljIGxpbmtpbmcgb2YgbGlidG9vbCBsaWJyYXJpZXMKKyAgLXZlcnNpb24taW5mbyBDVVJSRU5UWzpSRVZJU0lPTls6QUdFXV0KKyAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBsaWJyYXJ5IHZlcnNpb24gaW5mbyBbZWFjaCB2YXJpYWJsZSBkZWZhdWx0cyB0byAwXQorCitBbGwgb3RoZXIgb3B0aW9ucyAoYXJndW1lbnRzIGJlZ2lubmluZyB3aXRoIFxgLScpIGFyZSBpZ25vcmVkLgorCitFdmVyeSBvdGhlciBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWUuICBGaWxlcyBlbmRpbmcgaW4gXGAubGEnIGFyZQordHJlYXRlZCBhcyB1bmluc3RhbGxlZCBsaWJ0b29sIGxpYnJhcmllcywgb3RoZXIgZmlsZXMgYXJlIHN0YW5kYXJkIG9yIGxpYnJhcnkKK29iamVjdCBmaWxlcy4KKworSWYgdGhlIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubGEnLCB0aGVuIGEgbGlidG9vbCBsaWJyYXJ5IGlzIGNyZWF0ZWQsIG9ubHkKK2xpYnJhcnkgb2JqZWN0cyAoXGAubG8nIGZpbGVzKSBtYXkgYmUgc3BlY2lmaWVkLCBhbmQgXGAtcnBhdGgnIGlzIHJlcXVpcmVkLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmEnLCB0aGVuIGEgc3RhbmRhcmQgbGlicmFyeSBpcyBjcmVhdGVkIHVzaW5nIFxgYXInCithbmQgXGByYW5saWInLgorCitJZiBPVVRQVVQtRklMRSBlbmRzIGluIFxgLmxvJyBvciBcYC5vJywgdGhlbiBhIHJlbG9hZGFibGUgb2JqZWN0IGZpbGUgaXMKK2NyZWF0ZWQsIG90aGVyd2lzZSBhbiBleGVjdXRhYmxlIHByb2dyYW0gaXMgY3JlYXRlZC4iCisgIDs7CisKK3VuaW5zdGFsbCkKKyAgJGVjaG8KKyJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT11bmluc3RhbGwgUk0gW1JNLU9QVElPTl0uLi4gRklMRS4uLgorCitSZW1vdmUgbGlicmFyaWVzIGZyb20gYW4gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKworUk0gaXMgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gdG8gdXNlIHRvIGRlbGV0ZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBGSUxFCisodHlwaWNhbGx5IFxgL2Jpbi9ybScpLiAgUk0tT1BUSU9OUyBhcmUgb3B0aW9ucyAoc3VjaCBhcyBcYC1mJykgdG8gYmUgcGFzc2VkCit0byBSTS4KKworSWYgRklMRSBpcyBhIGxpYnRvb2wgbGlicmFyeSwgYWxsIHRoZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggaXQgYXJlIGRlbGV0ZWQuCitPdGhlcndpc2UsIG9ubHkgRklMRSBpdHNlbGYgaXMgZGVsZXRlZCB1c2luZyBSTS4iCisgIDs7CisKKyopCisgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgb3BlcmF0aW9uIG1vZGUgXGAkbW9kZSciIDE+JjIKKyAgJGVjaG8gIiRoZWxwIiAxPiYyCisgIGV4aXQgMQorICA7OworZXNhYworCitlY2hvCiskZWNobyAiVHJ5IFxgJG1vZGVuYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgbW9kZXMuIgorCitleGl0IDAKKworIyBMb2NhbCBWYXJpYWJsZXM6CisjIG1vZGU6c2hlbGwtc2NyaXB0CisjIHNoLWluZGVudGF0aW9uOjIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2NqcGVnLnN0IGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2NqcGVnLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzJjODkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrY2pwZWcuc3QKQEAgLTAsMCArMSwzOCBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBjanBlZy5wcmouCis7IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgorY2pwZWcudHRwCis7Cis7ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAorLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCisuQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcworLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncworLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCisuQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCisuQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK3Bjc3RhcnQubworY2pwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLGp2ZXJzaW9uLmgpCitjZGpwZWcuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRzd2l0Y2guYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRwcG0uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmRnaWYuYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oKQorcmR0YXJnYS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGJtcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZHJsZS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCitsaWJqcGVnLmxpYiAgICAgICAgOyBidWlsdCBieSBsaWJqcGVnLnByagorcGNmbHRsaWIubGliICAgICAgIDsgZmxvYXRpbmcgcG9pbnQgbGlicmFyeQorOyB0aGUgZmxvYXQgbGlicmFyeSBjYW4gYmUgb21pdHRlZCBpZiB5b3UndmUgdHVybmVkIG9mZiBEQ1RfRkxPQVRfU1VQUE9SVEVECitwY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5CitwY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZGpwZWcuc3QgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZGpwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyNjcyNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtkanBlZy5zdApAQCAtMCwwICsxLDM4IEBACis7IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCis7Cis7IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KKzsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKKzsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCis7IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KKzsKKzsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGRqcGVnLnByai4KKzsgSWYgeW91IGFyZSB1c2luZyBUdXJibyBDLCBjaGFuZ2UgZmlsZW5hbWVzIGJlZ2lubmluZyB3aXRoICJwYy4uLiIgdG8gInRjLi4uIgorOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQorOworOworOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCitkanBlZy50dHAKKzsKKzsgKiAqICogQ09NUElMRVIgT1BUSU9OUyAqICogKiAgCisuQ1stUF0gICAgICAgIDsgYWJzb2x1dGUgY2FsbHMKKy5DWy1NXSAgICAgICAgOyBhbmQgbm8gc3RyaW5nIG1lcmdpbmcsIGZvbGtzCisuQ1stdy1jbG5dICAgIDsgbm8gImNvbnN0YW50IGlzIGxvbmciIHdhcm5pbmdzCisuQ1stdy1wYXJdICAgIDsgbm8gInBhcmFtZXRlciB4eHh4IHVudXNlZCIKKy5DWy13LXJjaF0gICAgOyBubyAidW5yZWFjaGFibGUgY29kZSIKKy5DWy13c2lnXSAgICAgOyB3YXJuIGlmIHNpZ25pZmljYW50IGRpZ2l0cyBtYXkgYmUgbG9zdAorPQorOyAqICogKiAqIExpc3Qgb2YgbW9kdWxlcyAqICogKiAqIAorcGNzdGFydC5vCitkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgsanZlcnNpb24uaCkKK2NkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZGNvbG1hcC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnBwbS5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cmdpZi5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit3cnRhcmdhLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dyYm1wLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK3dycmxlLmMJKGNkanBlZy5oLGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oLGNkZXJyb3IuaCkKK2xpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCitwY2ZsdGxpYi5saWIgICAgICAgOyBmbG9hdGluZyBwb2ludCBsaWJyYXJ5Cis7IHRoZSBmbG9hdCBsaWJyYXJ5IGNhbiBiZSBvbWl0dGVkIGlmIHlvdSd2ZSB0dXJuZWQgb2ZmIERDVF9GTE9BVF9TVVBQT1JURUQKK3Bjc3RkbGliLmxpYiAgICAgICA7IHN0YW5kYXJkIGxpYnJhcnkKK3BjZXh0bGliLmxpYiAgICAgICA7IGV4dGVuZGVkIGxpYnJhcnkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlYXBwcy5kcyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlYXBwcy5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWRkMDM4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VhcHBzLmRzCkBAIC0wLDAgKzEsODI4IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iIDB4MDEwMworCishSUYgIiQoQ0ZHKSIgPT0gIiIKK0NGRz1janBlZyAtIFdpbjMyCishTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8gY2pwZWcgLSBXaW4zMi4KKyFFTkRJRiAKKworIUlGICIkKENGRykiICE9ICJjanBlZyAtIFdpbjMyIiAmJiAiJChDRkcpIiAhPSAiZGpwZWcgLSBXaW4zMiIgJiZcCisgIiQoQ0ZHKSIgIT0gImpwZWd0cmFuIC0gV2luMzIiICYmICIkKENGRykiICE9ICJyZGpwZ2NvbSAtIFdpbjMyIiAmJlwKKyAiJChDRkcpIiAhPSAid3JqcGdjb20gLSBXaW4zMiIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImFwcHMubWFrIiBDRkc9ImNqcGVnIC0gV2luMzIiCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiY2pwZWcgLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJkanBlZyAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImpwZWd0cmFuIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAicmRqcGdjb20gLSBXaW4zMiIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBDb25zb2xlIEFwcGxpY2F0aW9uIikKKyFNRVNTQUdFICJ3cmpwZ2NvbSAtIFdpbjMyIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImNqcGVnIC0gV2luMzIiCitDUFA9Y2wuZXhlCitSU0M9cmMuZXhlCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImNqcGVnIC0gV2luMzIiCisKKyMgUFJPUCBCQVNFIFVzZV9NRkMgMAorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgQkFTRSBPdXRwdXRfRGlyICJjanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgImNqcGVnIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgImNqcGVnXFJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiY2pwZWdcUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICJjanBlZyIKK09VVERJUj0uXGNqcGVnXFJlbGVhc2UKK0lOVERJUj0uXGNqcGVnXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVxjanBlZy5leGUiCisKK0NMRUFOIDogCisJLUBlcmFzZSAiJChJTlRESVIpXGNqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRwcG0ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZGdpZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkdGFyZ2Eub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZHJsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkYm1wLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilccmRzd2l0Y2gub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxjZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxjanBlZy5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL2NqcGVnLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5cY2pwZWdcUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvY2pwZWcuYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9janBlZy5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2NqcGVnLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcY2pwZWcub2JqIiBcCisJIiQoSU5URElSKVxyZHBwbS5vYmoiIFwKKwkiJChJTlRESVIpXHJkZ2lmLm9iaiIgXAorCSIkKElOVERJUilccmR0YXJnYS5vYmoiIFwKKwkiJChJTlRESVIpXHJkcmxlLm9iaiIgXAorCSIkKElOVERJUilccmRibXAub2JqIiBcCisJIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKworCisiJChPVVRESVIpXGNqcGVnLmV4ZSIgOiAiJChPVVRESVIpIiAkKERFRl9GSUxFKSAkKExJTkszMl9PQkpTKQorICAgICQoTElOSzMyKSBAPDwKKyAgJChMSU5LMzJfRkxBR1MpICQoTElOSzMyX09CSlMpCis8PAorCishRUxTRUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImRqcGVnXFJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiZGpwZWciCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiZGpwZWdcUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJkanBlZ1xSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgImRqcGVnIgorT1VURElSPS5cZGpwZWdcUmVsZWFzZQorSU5URElSPS5cZGpwZWdcUmVsZWFzZQorCitBTEwgOiAiJChPVVRESVIpXGRqcGVnLmV4ZSIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcZGpwZWcub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVx3cnBwbS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdyZ2lmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3J0YXJnYS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHdycmxlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcd3JibXAub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxyZGNvbG1hcC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGNkanBlZy5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXGRqcGVnLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvZGpwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxkanBlZ1xSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9kanBlZy5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL2RqcGVnLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvZGpwZWcuZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxkanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXHdycHBtLm9iaiIgXAorCSIkKElOVERJUilcd3JnaWYub2JqIiBcCisJIiQoSU5URElSKVx3cnRhcmdhLm9iaiIgXAorCSIkKElOVERJUilcd3JybGUub2JqIiBcCisJIiQoSU5URElSKVx3cmJtcC5vYmoiIFwKKwkiJChJTlRESVIpXHJkY29sbWFwLm9iaiIgXAorCSIkKElOVERJUilcY2RqcGVnLm9iaiIgXAorCisKKyIkKE9VVERJUilcZGpwZWcuZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJqcGVndHJhbiAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAianBlZ3RyYW5cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJqcGVndHJhbiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJqcGVndHJhblxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgImpwZWd0cmFuXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAianBlZ3RyYW4iCitPVVRESVI9LlxqcGVndHJhblxSZWxlYXNlCitJTlRESVI9LlxqcGVndHJhblxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcanBlZ3RyYW4uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxqcGVndHJhbi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXHJkc3dpdGNoLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcY2RqcGVnLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcdHJhbnN1cHAub2JqIgorCS1AZXJhc2UgIiQoT1VURElSKVxqcGVndHJhbi5leGUiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIlwKKyAvRnAiJChJTlRESVIpL2pwZWd0cmFuLnBjaCIgL1lYIC9GbyIkKElOVERJUikvIiAvYyAKK0NQUF9PQkpTPS5canBlZ3RyYW5cUmVsZWFzZS8KK0NQUF9TQlJTPS5cLgorIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorQlNDMzI9YnNjbWFrZS5leGUKKyMgQUREIEJBU0UgQlNDMzIgL25vbG9nbworIyBBREQgQlNDMzIgL25vbG9nbworQlNDMzJfRkxBR1M9L25vbG9nbyAvbyIkKE9VVERJUikvanBlZ3RyYW4uYnNjIiAKK0JTQzMyX1NCUlM9IFwKKwkKK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIFJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorTElOSzMyX0ZMQUdTPVJlbGVhc2VcanBlZy5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYlwKKyBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWJcCisgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL2luY3JlbWVudGFsOm5vXAorIC9wZGI6IiQoT1VURElSKS9qcGVndHJhbi5wZGIiIC9tYWNoaW5lOkkzODYgL291dDoiJChPVVRESVIpL2pwZWd0cmFuLmV4ZSIgCitMSU5LMzJfT0JKUz0gXAorCSIkKElOVERJUilcanBlZ3RyYW4ub2JqIiBcCisJIiQoSU5URElSKVxyZHN3aXRjaC5vYmoiIFwKKwkiJChJTlRESVIpXGNkanBlZy5vYmoiIFwKKwkiJChJTlRESVIpXHRyYW5zdXBwLm9iaiIgXAorCisKKyIkKE9VVERJUilcanBlZ3RyYW4uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJyZGpwZ2NvbSAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAicmRqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJyZGpwZ2NvbSIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJyZGpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgInJkanBnY29tXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAicmRqcGdjb20iCitPVVRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCitJTlRESVI9LlxyZGpwZ2NvbVxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilccmRqcGdjb20uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXHJkanBnY29tLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvcmRqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxyZGpwZ2NvbVxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9yZGpwZ2NvbS5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL3JkanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvcmRqcGdjb20uZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVxyZGpwZ2NvbS5vYmoiCisKKyIkKE9VVERJUilccmRqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTFNFSUYgICIkKENGRykiID09ICJ3cmpwZ2NvbSAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAid3JqcGdjb21cUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICJ3cmpwZ2NvbSIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBPdXRwdXRfRGlyICJ3cmpwZ2NvbVxSZWxlYXNlIgorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIndyanBnY29tXFJlbGVhc2UiCisjIFBST1AgVGFyZ2V0X0RpciAid3JqcGdjb20iCitPVVRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCitJTlRESVI9Llx3cmpwZ2NvbVxSZWxlYXNlCisKK0FMTCA6ICIkKE9VVERJUilcd3JqcGdjb20uZXhlIgorCitDTEVBTiA6IAorCS1AZXJhc2UgIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCisJLUBlcmFzZSAiJChPVVRESVIpXHdyanBnY29tLmV4ZSIKKworIiQoT1VURElSKSIgOgorICAgIGlmIG5vdCBleGlzdCAiJChPVVRESVIpLyQoTlVMTCkiIG1rZGlyICIkKE9VVERJUikiCisKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9ZWCAvYworQ1BQX1BST0o9L25vbG9nbyAvTUwgL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiXAorIC9GcCIkKElOVERJUikvd3JqcGdjb20ucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9Llx3cmpwZ2NvbVxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS93cmpwZ2NvbS5ic2MiIAorQlNDMzJfU0JSUz0gXAorCQorTElOSzMyPWxpbmsuZXhlCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CisjIEFERCBMSU5LMzIgUmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2CitMSU5LMzJfRkxBR1M9UmVsZWFzZVxqcGVnLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliXAorIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYlwKKyBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvaW5jcmVtZW50YWw6bm9cCisgL3BkYjoiJChPVVRESVIpL3dyanBnY29tLnBkYiIgL21hY2hpbmU6STM4NiAvb3V0OiIkKE9VVERJUikvd3JqcGdjb20uZXhlIiAKK0xJTkszMl9PQkpTPSBcCisJIiQoSU5URElSKVx3cmpwZ2NvbS5vYmoiCisKKyIkKE9VVERJUilcd3JqcGdjb20uZXhlIiA6ICIkKE9VVERJUikiICQoREVGX0ZJTEUpICQoTElOSzMyX09CSlMpCisgICAgJChMSU5LMzIpIEA8PAorICAkKExJTkszMl9GTEFHUykgJChMSU5LMzJfT0JKUykKKzw8CisKKyFFTkRJRiAKKworLmN7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfT0JKUyl9Lm9iajoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3BweyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisuY3h4eyQoQ1BQX1NCUlMpfS5zYnI6CisgICAkKENQUCkgJChDUFBfUFJPSikgJDwgIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBUYXJnZXQKKworIyBOYW1lICJjanBlZyAtIFdpbjMyIgorCishSUYgICIkKENGRykiID09ICJjanBlZyAtIFdpbjMyIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2pwZWcuYyIKK0RFUF9DUFBfQ0pQRUc9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkKKworIiQoSU5URElSKVxjanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DSlBFRykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJjZGpwZWcuYyIKK0RFUF9DUFBfQ0RKUEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHN3aXRjaC5jIgorREVQX0NQUF9SRFNXST1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRwcG0uYyIKK0RFUF9DUFBfUkRQUE09XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkcHBtLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEUFBNKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkZ2lmLmMiCitERVBfQ1BQX1JER0lGPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZGdpZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREdJRikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHRhcmdhLmMiCitERVBfQ1BQX1JEVEFSPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZHRhcmdhLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEVEFSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkYm1wLmMiCitERVBfQ1BQX1JEQk1QPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxyZGJtcC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9SREJNUCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHJsZS5jIgorREVQX0NQUF9SRFJMRT1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRybGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRSTEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAiZGpwZWcgLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAiZGpwZWcgLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImRqcGVnLmMiCitERVBfQ1BQX0RKUEVHPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkianZlcnNpb24uaCJcCisJCisKKyIkKElOVERJUilcZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfREpQRUcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iY2RqcGVnLmMiCitERVBfQ1BQX0NESlBFPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxjZGpwZWcub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfQ0RKUEUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0icmRjb2xtYXAuYyIKK0RFUF9DUFBfUkRDT0w9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHJkY29sbWFwLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1JEQ09MKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndycHBtLmMiCitERVBfQ1BQX1dSUFBNPVwKKwkiY2RqcGVnLmgiXAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImplcnJvci5oIlwKKwkiY2RlcnJvci5oIlwKKwkKKworIiQoSU5URElSKVx3cnBwbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlBQTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cmdpZi5jIgorREVQX0NQUF9XUkdJRj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3JnaWYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JHSUYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3J0YXJnYS5jIgorREVQX0NQUF9XUlRBUj1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3J0YXJnYS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9XUlRBUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJ3cmJtcC5jIgorREVQX0NQUF9XUkJNUD1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcd3JibXAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JCTVApICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0id3JybGUuYyIKK0RFUF9DUFBfV1JSTEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXHdycmxlLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX1dSUkxFKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImpwZWd0cmFuIC0gV2luMzIiCisKKyFJRiAgIiQoQ0ZHKSIgPT0gImpwZWd0cmFuIC0gV2luMzIiCisKKyFFTkRJRiAKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcGVndHJhbi5jIgorREVQX0NQUF9KUEVHVD1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJInRyYW5zdXBwLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkKKworIiQoSU5URElSKVxqcGVndHJhbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUEVHVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJjZGpwZWcuYyIKK0RFUF9DUFBfQ0RKUEU9XAorCSJjZGpwZWcuaCJcCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCSJjZGVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGNkanBlZy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9DREpQRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJyZHN3aXRjaC5jIgorREVQX0NQUF9SRFNXST1cCisJImNkanBlZy5oIlwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqZXJyb3IuaCJcCisJImNkZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilccmRzd2l0Y2gub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRTV0kpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0idHJhbnN1cHAuYyIKK0RFUF9DUFBfVFJBTlM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkidHJhbnN1cHAuaCJcCisJCisKKyIkKElOVERJUilcdHJhbnN1cHAub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfVFJBTlMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAicmRqcGdjb20gLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAicmRqcGdjb20gLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9InJkanBnY29tLmMiCitERVBfQ1BQX1JESlBHPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJCisKKyIkKElOVERJUilccmRqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfUkRKUEcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAid3JqcGdjb20gLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAid3JqcGdjb20gLSBXaW4zMiIKKworIUVORElGIAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9IndyanBnY29tLmMiCitERVBfQ1BQX1dSSlBHPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJCisKKyIkKElOVERJUilcd3JqcGdjb20ub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfV1JKUEcpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLmFuc2kgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuYW5zaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjkxOTEzCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLmFuc2kKQEAgLTAsMCArMSwyMTQgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggQU5TSS1jYXBhYmxlIGNvbXBpbGVycy4KKyMgSWYgeW91IGhhdmUgYSBub24tQU5TSSBjb21waWxlciwgbWFrZWZpbGUudW5peCBpcyBhIGJldHRlciBzdGFydGluZyBwb2ludC4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibWFrZSIgISEKKworIyBUaGUgbmFtZSBvZiB5b3VyIEMgY29tcGlsZXI6CitDQz0gY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC1PCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CitMREZMQUdTPSAKKworIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KK0xETElCUz0gCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50CisjIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gJChDQykKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gcm0gLWYKKyMgbGlicmFyeSAoLmEpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IGFyIHJjCisjIHNlY29uZCBzdGVwIGluIC5hIGNyZWF0aW9uICh1c2UgInRvdWNoIiBpZiBub3QgbmVlZGVkKQorQVIyPSByYW5saWIKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vIGp1dGlscy5vIGplcnJvci5vIGptZW1tZ3IubyAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vIGpjYXBpc3RkLm8gamN0cmFucy5vIGpjcGFyYW0ubyBqZGF0YWRzdC5vIGpjaW5pdC5vIFwKKyAgICAgICAgamNtYXN0ZXIubyBqY21hcmtlci5vIGpjbWFpbmN0Lm8gamNwcmVwY3QubyBqY2NvZWZjdC5vIGpjY29sb3IubyBcCisgICAgICAgIGpjc2FtcGxlLm8gamNodWZmLm8gamNwaHVmZi5vIGpjZGN0bWdyLm8gamZkY3Rmc3QubyBqZmRjdGZsdC5vIFwKKyAgICAgICAgamZkY3RpbnQubworIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ubyBqZGFwaXN0ZC5vIGpkdHJhbnMubyBqZGF0YXNyYy5vIGpkbWFzdGVyLm8gXAorICAgICAgICBqZGlucHV0Lm8gamRtYXJrZXIubyBqZGh1ZmYubyBqZHBodWZmLm8gamRtYWluY3QubyBqZGNvZWZjdC5vIFwKKyAgICAgICAgamRwb3N0Y3QubyBqZGRjdG1nci5vIGppZGN0ZnN0Lm8gamlkY3RmbHQubyBqaWRjdGludC5vIGppZGN0cmVkLm8gXAorICAgICAgICBqZHNhbXBsZS5vIGpkY29sb3IubyBqcXVhbnQxLm8ganF1YW50Mi5vIGpkbWVyZ2UubworIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5hCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcubyByZHBwbS5vIHJkZ2lmLm8gcmR0YXJnYS5vIHJkcmxlLm8gcmRibXAubyByZHN3aXRjaC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK0RPQkpFQ1RTPSBkanBlZy5vIHdycHBtLm8gd3JnaWYubyB3cnRhcmdhLm8gd3JybGUubyB3cmJtcC5vIHJkY29sbWFwLm8gXAorICAgICAgICBjZGpwZWcubworVFJPQkpFQ1RTPSBqcGVndHJhbi5vIHJkc3dpdGNoLm8gY2RqcGVnLm8gdHJhbnN1cHAubworCisKK2FsbDogbGlianBlZy5hIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKK2xpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gY2pwZWcgJChDT0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitkanBlZzogJChET0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK2pwZWd0cmFuOiAkKFRST0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBqcGVndHJhbiAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20ubworCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjoKKwkkKFJNKSAqLm8gY2pwZWcgZGpwZWcganBlZ3RyYW4gbGlianBlZy5hIHJkanBnY29tIHdyanBnY29tCisJJChSTSkgY29yZSB0ZXN0b3V0KgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCSQoUk0pIHRlc3RvdXQqCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwkuL2RqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJLi9kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLmJjYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5iY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjZmNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5iY2MKQEAgLTAsMCArMSwyODUgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIEJvcmxhbmQgQyBvbiBNUy1ET1Mgb3IgT1MvMi4KKyMgSXQgd29ya3Mgd2l0aCBCb3JsYW5kIEMrKyBmb3IgRE9TLCByZXZpc2lvbiAzLjAgb3IgbGF0ZXIsCisjIGFuZCBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBCb3JsYW5kIEMrKyBmb3IgT1MvMi4KKyMgV2F0Y2ggb3V0IGZvciBvcHRpbWl6YXRpb24gYnVncyBpbiB0aGUgT1MvMiBjb21waWxlcnMgLS0tIHNlZSBub3RlcyBiZWxvdyEKKyMgVGhhbmtzIHRvIFRvbSBXcmlnaHQgYW5kIEdlJyBXZWlqZXJzIChvcmlnaW5hbCBET1MpIGFuZAorIyBLZW4gUG9ydGVyIChPUy8yKSBmb3IgdGhpcyBmaWxlLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIEFyZSB3ZSB1bmRlciBET1Mgb3IgT1MvMj8KKyFpZiAhJGQoRE9TKSAmJiAhJGQoT1MyKQorIWlmICRkKF9fT1MyX18pCitPUzI9MQorIWVsc2UKK0RPUz0xCishZW5kaWYKKyFlbmRpZgorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBiY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CishaWYgJGQoRE9TKQorQ0ZMQUdTPSAtTzIgLW1tIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAorIWVsc2UKK0NGTEFHUz0gLU8xIC13LXBhciAtdy1zdHUgLXctY2NjIC13LXJjaAorIWVuZGlmCisjIC1PMiBlbmFibGVzIGZ1bGwgY29kZSBvcHRpbWl6YXRpb24gKGZvciBwcmUtMy4wIEJvcmxhbmQgQysrLCB1c2UgLU8gLUcgLVopLgorIyAtTzIgaXMgYnVnZ3kgaW4gQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAyLjAsIHNvIHVzZSAtTzEgdGhlcmUgZm9yIG5vdy4KKyMgSWYgeW91IGhhdmUgQm9ybGFuZCBPUy8yIEMrKyByZXZpc2lvbiAxLjAsIHVzZSAtTyBvciBubyBvcHRpbWl6YXRpb24gYXQgYWxsLgorIyAtbW0gc2VsZWN0cyBtZWRpdW0gbWVtb3J5IG1vZGVsIChuZWFyIGRhdGEsIGZhciBjb2RlIHBvaW50ZXJzOyBET1Mgb25seSEpCisjIC13LXBhciBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IHVudXNlZCBmdW5jdGlvbiBwYXJhbWV0ZXJzCisjIC13LXN0dSBzdXBwcmVzc2VzIHdhcm5pbmdzIGFib3V0IGluY29tcGxldGUgc3RydWN0dXJlcworIyAtdy1jY2Mgc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCBjb21waWxlLXRpbWUtY29uc3RhbnQgY29uZGl0aW9ucworIyAtdy1yY2ggc3VwcHJlc3NlcyB3YXJuaW5ncyBhYm91dCB1bnJlYWNoYWJsZSBjb2RlCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIGNjIG9wdGlvbnM6CishaWYgJGQoRE9TKQorTERGTEFHUz0gLW1tCisjIG1lbW9yeSBtb2RlbCBvcHRpb24gaGVyZSBtdXN0IG1hdGNoIENGTEFHUyEKKyFlbHNlCitMREZMQUdTPQorIyAtbGFpIGZ1bGwtc2NyZWVuIGFwcAorIyAtbGMgY2FzZS1zaWduaWZpY2FudCBsaW5rCishZW5kaWYKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLgorIyBGb3IgRE9TLCB3ZSByZWNvbW1lbmQgam1lbWRvcy5jIGFuZCBqbWVtZG9zYS5hc20uCisjIEZvciBPUy8yLCB3ZSByZWNvbW1lbmQgam1lbW5vYnMuYyAoZmxhdCBtZW1vcnkhKQorIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgorIWlmICRkKERPUykKK1NZU0RFUE1FTT0gam1lbWRvcy5vYmogam1lbWRvc2Eub2JqCitTWVNERVBNRU1MSUI9ICtqbWVtZG9zLm9iaiAram1lbWRvc2Eub2JqCishZWxzZQorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKK1NZU0RFUE1FTUxJQj0gK2ptZW1ub2JzLm9iagorIWVuZGlmCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkub2JqIGp1dGlscy5vYmogamVycm9yLm9iaiBqbWVtbWdyLm9iaiAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi5vYmogamNhcGlzdGQub2JqIGpjdHJhbnMub2JqIGpjcGFyYW0ub2JqIGpkYXRhZHN0Lm9iaiBcCisgICAgICAgIGpjaW5pdC5vYmogamNtYXN0ZXIub2JqIGpjbWFya2VyLm9iaiBqY21haW5jdC5vYmogamNwcmVwY3Qub2JqIFwKKyAgICAgICAgamNjb2VmY3Qub2JqIGpjY29sb3Iub2JqIGpjc2FtcGxlLm9iaiBqY2h1ZmYub2JqIGpjcGh1ZmYub2JqIFwKKyAgICAgICAgamNkY3RtZ3Iub2JqIGpmZGN0ZnN0Lm9iaiBqZmRjdGZsdC5vYmogamZkY3RpbnQub2JqCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vYmogamRhcGlzdGQub2JqIGpkdHJhbnMub2JqIGpkYXRhc3JjLm9iaiBcCisgICAgICAgIGpkbWFzdGVyLm9iaiBqZGlucHV0Lm9iaiBqZG1hcmtlci5vYmogamRodWZmLm9iaiBqZHBodWZmLm9iaiBcCisgICAgICAgIGpkbWFpbmN0Lm9iaiBqZGNvZWZjdC5vYmogamRwb3N0Y3Qub2JqIGpkZGN0bWdyLm9iaiBqaWRjdGZzdC5vYmogXAorICAgICAgICBqaWRjdGZsdC5vYmogamlkY3RpbnQub2JqIGppZGN0cmVkLm9iaiBqZHNhbXBsZS5vYmogamRjb2xvci5vYmogXAorICAgICAgICBqcXVhbnQxLm9iaiBqcXVhbnQyLm9iaiBqZG1lcmdlLm9iagorIyBUaGVzZSBvYmplY3RmaWxlcyBhcmUgaW5jbHVkZWQgaW4gbGlianBlZy5saWIKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vYmogcmRwcG0ub2JqIHJkZ2lmLm9iaiByZHRhcmdhLm9iaiByZHJsZS5vYmogcmRibXAub2JqIFwKKyAgICAgICAgcmRzd2l0Y2gub2JqIGNkanBlZy5vYmoKK0RPQkpFQ1RTPSBkanBlZy5vYmogd3JwcG0ub2JqIHdyZ2lmLm9iaiB3cnRhcmdhLm9iaiB3cnJsZS5vYmogd3JibXAub2JqIFwKKyAgICAgICAgcmRjb2xtYXAub2JqIGNkanBlZy5vYmoKK1RST0JKRUNUUz0ganBlZ3RyYW4ub2JqIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqIHRyYW5zdXBwLm9iagorCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCS0gZGVsIGxpYmpwZWcubGliCisJdGxpYiBsaWJqcGVnLmxpYiAvRSAvQyBAJiZ8CisramNhcGltaW4ub2JqICtqY2FwaXN0ZC5vYmogK2pjdHJhbnMub2JqICtqY3BhcmFtLm9iaiAramRhdGFkc3Qub2JqICYKKytqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAramNtYWluY3Qub2JqICtqY3ByZXBjdC5vYmogJgorK2pjY29lZmN0Lm9iaiAramNjb2xvci5vYmogK2pjc2FtcGxlLm9iaiAramNodWZmLm9iaiAramNwaHVmZi5vYmogJgorK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogK2pmZGN0aW50Lm9iaiAramRhcGltaW4ub2JqICYKKytqZGFwaXN0ZC5vYmogK2pkdHJhbnMub2JqICtqZGF0YXNyYy5vYmogK2pkbWFzdGVyLm9iaiAramRpbnB1dC5vYmogJgorK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAramRjb2VmY3Qub2JqICYKKytqZHBvc3RjdC5vYmogK2pkZGN0bWdyLm9iaiAramlkY3Rmc3Qub2JqICtqaWRjdGZsdC5vYmogK2ppZGN0aW50Lm9iaiAmCisramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAranF1YW50Mi5vYmogJgorK2pkbWVyZ2Uub2JqICtqY29tYXBpLm9iaiAranV0aWxzLm9iaiAramVycm9yLm9iaiAram1lbW1nci5vYmogJgorJChTWVNERVBNRU1MSUIpCit8CisKK2NqcGVnLmV4ZTogJChDT0JKRUNUUykgbGlianBlZy5saWIKKwkkKENDKSAkKExERkxBR1MpIC1lY2pwZWcuZXhlICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwkkKENDKSAkKExERkxBR1MpIC1lZGpwZWcuZXhlICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisKK2pwZWd0cmFuLmV4ZTogJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAtZWpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKworcmRqcGdjb20uZXhlOiByZGpwZ2NvbS5jCishaWYgJGQoRE9TKQorCSQoQ0MpIC1tcyAtTyByZGpwZ2NvbS5jCishZWxzZQorCSQoQ0MpICQoQ0ZMQUdTKSByZGpwZ2NvbS5jCishZW5kaWYKKworIyBPbiBET1MsIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKK3dyanBnY29tLmV4ZTogd3JqcGdjb20uYworIWlmICRkKERPUykKKwkkKENDKSAtbWwgLU8gd3JqcGdjb20uYworIWVsc2UKKwkkKENDKSAkKENGTEFHUykgd3JqcGdjb20uYworIWVuZGlmCisKKyMgVGhpcyAie30iIHN5bnRheCBhbGxvd3MgQm9ybGFuZCBNYWtlIHRvICJiYXRjaCIgc291cmNlIGZpbGVzLgorIyBJbiB0aGlzIHdheSwgZWFjaCBydW4gb2YgdGhlIGNvbXBpbGVyIGNhbiBidWlsZCBtYW55IG1vZHVsZXMuCisuYy5vYmo6CisJJChDQykgJChDRkxBR1MpIC1jeyAkPH0KKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKK2NsZWFuOgorCS0gZGVsICoub2JqCisJLSBkZWwgbGlianBlZy5saWIKKwktIGRlbCBjanBlZy5leGUKKwktIGRlbCBkanBlZy5leGUKKwktIGRlbCBqcGVndHJhbi5leGUKKwktIGRlbCByZGpwZ2NvbS5leGUKKwktIGRlbCB3cmpwZ2NvbS5leGUKKwktIGRlbCB0ZXN0b3V0Ki4qCisKK3Rlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCisJLSBkZWwgdGVzdG91dCouKgorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgIHRlc3RvcmlnLmpwZworCWNqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKyFpZiAkZChET1MpCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKyFlbHNlCisJZWNobyBuID4gbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtIDwgbi50bXAKKwljb21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wIDwgbi50bXAKKwljb21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnIDwgbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnIDwgbi50bXAKKwljb21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcgPCBuLnRtcAorCWRlbCBuLnRtcAorIWVuZGlmCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAoram1lbWRvc2Eub2JqOiBqbWVtZG9zYS5hc20KKwl0YXNtIC9teCBqbWVtZG9zYS5hc20KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5jZmcgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuY2ZnCkBAIC0wLDAgKzEsMzE5IEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBtYWtlZmlsZS5jZmcgaXMgZWRpdGVkIGJ5IGNvbmZpZ3VyZSB0byBwcm9kdWNlIGEgY3VzdG9tIE1ha2VmaWxlLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIEZvciBjb21waWxpbmcgd2l0aCBzb3VyY2UgYW5kIG9iamVjdCBmaWxlcyBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuCitzcmNkaXIgPSBAc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCisjIFdoZXJlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBtYW4gcGFnZXMuCitwcmVmaXggPSBAcHJlZml4QAorZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACitiaW5kaXIgPSAkKGV4ZWNfcHJlZml4KS9iaW4KK2xpYmRpciA9ICQoZXhlY19wcmVmaXgpL2xpYgoraW5jbHVkZWRpciA9ICQocHJlZml4KS9pbmNsdWRlCitiaW5wcmVmaXggPQorbWFucHJlZml4ID0KK21hbmV4dCA9IDEKK21hbmRpciA9ICQocHJlZml4KS9tYW4vbWFuJChtYW5leHQpCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IEBDQ0AKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IEBDRkxBR1NAIEBDUFBGTEFHU0AgQElOQ0xVREVGTEFHU0AKKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKyMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKK0FOU0kyS05SRkxBR1M9IEBBTlNJMktOUkZMQUdTQAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gQExERkxBR1NACisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IEBMSUJTQAorCisjIElmIHVzaW5nIEdOVSBsaWJ0b29sLCBMSUJUT09MIHJlZmVyZW5jZXMgaXQ7IGlmIG5vdCwgTElCVE9PTCBpcyBlbXB0eS4KK0xJQlRPT0wgPSBATElCVE9PTEAKKyMgJChPKSBleHBhbmRzIHRvICJsbyIgaWYgdXNpbmcgbGlidG9vbCwgcGxhaW4gIm8iIGlmIG5vdC4KKyMgU2ltaWxhcmx5LCAkKEEpIGV4cGFuZHMgdG8gImxhIiBvciAiYSIuCitPID0gQE9ACitBID0gQEFACisKKyMgTGlicmFyeSB2ZXJzaW9uIElEOyBsaWJ0b29sIHVzZXMgdGhpcyBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyLgorIyBOb3RlOiB3ZSBzdWdnZXN0IHRoaXMgbWF0Y2ggdGhlIG1hY3JvIG9mIHRoZSBzYW1lIG5hbWUgaW4ganBlZ2xpYi5oLgorSlBFR19MSUJfVkVSU0lPTiA9IEBKUEVHX0xJQl9WRVJTSU9OQAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gQE1FTU9SWU1HUkAKKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorU0hFTEw9IC9iaW4vc2gKKyMgbGlua2VyCitMTj0gQExOQAorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBybSAtZgorIyBkaXJlY3RvcnkgY3JlYXRpb24gY29tbWFuZAorTUtESVI9IG1rZGlyCisjIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBhciByYworIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKK0FSMj0gQFJBTkxJQkAKKyMgaW5zdGFsbGF0aW9uIHByb2dyYW0KK0lOU1RBTEw9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNPSBASU5TVEFMTF9QUk9HUkFNQAorSU5TVEFMTF9MSUI9IEBJTlNUQUxMX0xJQkAKK0lOU1RBTExfREFUQT0gQElOU1RBTExfREFUQUAKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS4kKE8pIGp1dGlscy4kKE8pIGplcnJvci4kKE8pIGptZW1tZ3IuJChPKSAkKFNZU0RFUE1FTSkKKyMgY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0NMSUJPQkpFQ1RTPSBqY2FwaW1pbi4kKE8pIGpjYXBpc3RkLiQoTykgamN0cmFucy4kKE8pIGpjcGFyYW0uJChPKSBcCisgICAgICAgIGpkYXRhZHN0LiQoTykgamNpbml0LiQoTykgamNtYXN0ZXIuJChPKSBqY21hcmtlci4kKE8pIGpjbWFpbmN0LiQoTykgXAorICAgICAgICBqY3ByZXBjdC4kKE8pIGpjY29lZmN0LiQoTykgamNjb2xvci4kKE8pIGpjc2FtcGxlLiQoTykgamNodWZmLiQoTykgXAorICAgICAgICBqY3BodWZmLiQoTykgamNkY3RtZ3IuJChPKSBqZmRjdGZzdC4kKE8pIGpmZGN0Zmx0LiQoTykgXAorICAgICAgICBqZmRjdGludC4kKE8pCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi4kKE8pIGpkYXBpc3RkLiQoTykgamR0cmFucy4kKE8pIGpkYXRhc3JjLiQoTykgXAorICAgICAgICBqZG1hc3Rlci4kKE8pIGpkaW5wdXQuJChPKSBqZG1hcmtlci4kKE8pIGpkaHVmZi4kKE8pIGpkcGh1ZmYuJChPKSBcCisgICAgICAgIGpkbWFpbmN0LiQoTykgamRjb2VmY3QuJChPKSBqZHBvc3RjdC4kKE8pIGpkZGN0bWdyLiQoTykgXAorICAgICAgICBqaWRjdGZzdC4kKE8pIGppZGN0Zmx0LiQoTykgamlkY3RpbnQuJChPKSBqaWRjdHJlZC4kKE8pIFwKKyAgICAgICAgamRzYW1wbGUuJChPKSBqZGNvbG9yLiQoTykganF1YW50MS4kKE8pIGpxdWFudDIuJChPKSBqZG1lcmdlLiQoTykKKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLiQoTykgcmRwcG0uJChPKSByZGdpZi4kKE8pIHJkdGFyZ2EuJChPKSByZHJsZS4kKE8pIFwKKyAgICAgICAgcmRibXAuJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pCitET0JKRUNUUz0gZGpwZWcuJChPKSB3cnBwbS4kKE8pIHdyZ2lmLiQoTykgd3J0YXJnYS4kKE8pIHdycmxlLiQoTykgXAorICAgICAgICB3cmJtcC4kKE8pIHJkY29sbWFwLiQoTykgY2RqcGVnLiQoTykKK1RST0JKRUNUUz0ganBlZ3RyYW4uJChPKSByZHN3aXRjaC4kKE8pIGNkanBlZy4kKE8pIHRyYW5zdXBwLiQoTykKKworCithbGw6IEBBMktfREVQU0AgbGlianBlZy4kKEEpIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKKyMgU3BlY2lhbCBjb21waWxhdGlvbiBydWxlcyB0byBzdXBwb3J0IGFuc2kya25yIGFuZCBsaWJ0b29sLgorLlNVRkZJWEVTOiAubG8gLmxhCisKKyMgSG93IHRvIGNvbXBpbGUgd2l0aCBsaWJ0b29sLgorQENPTV9MVEAuYy5sbzoKK0BDT01fTFRACSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChDRkxBR1MpIC1jICQoc3JjZGlyKS8kKi5jCisKKyMgSG93IHRvIHVzZSBhbnNpMmtuciwgd2hlbiBub3QgdXNpbmcgbGlidG9vbC4KK0BDT01fQTJLQC5jLm86CitAQ09NX0EyS0AJLi9hbnNpMmtuciAkKHNyY2RpcikvJCouYyBrbnIvJCouYworQENPTV9BMktACSQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYworQENPTV9BMktACSQoUk0pIGtuci8kKi5jCisKKyMgSG93IHRvIHVzZSBhbnNpMmtuciBBTkQgbGlidG9vbC4KK0BDT01fQTJLQC5jLmxvOgorQENPTV9BMktACS4vYW5zaTJrbnIgJChzcmNkaXIpLyQqLmMga25yLyQqLmMKK0BDT01fQTJLQAkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoQ0ZMQUdTKSAtYyBrbnIvJCouYworQENPTV9BMktACSQoUk0pIGtuci8kKi5jCisKK2Fuc2kya25yOiBhbnNpMmtuci5jCisJJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgJChzcmNkaXIpL2Fuc2kya25yLmMKKwkkKE1LRElSKSBrbnIKKworIyB0aGUgbGlicmFyeToKKworIyB3aXRob3V0IGxpYnRvb2w6CitsaWJqcGVnLmE6IEBBMktfREVQU0AgJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworIyB3aXRoIGxpYnRvb2w6CitsaWJqcGVnLmxhOiBAQTJLX0RFUFNAICQoTElCT0JKRUNUUykKKwkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpIC1vIGxpYmpwZWcubGEgJChMSUJPQkpFQ1RTKSBcCisJCS1ycGF0aCAkKGxpYmRpcikgLXZlcnNpb24taW5mbyAkKEpQRUdfTElCX1ZFUlNJT04pCisKKyMgc2FtcGxlIHByb2dyYW1zOgorCitjanBlZzogJChDT0JKRUNUUykgbGlianBlZy4kKEEpCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK2RqcGVnOiAkKERPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKKwkkKExOKSAkKExERkxBR1MpIC1vIGRqcGVnICQoRE9CSkVDVFMpIGxpYmpwZWcuJChBKSAkKExETElCUykKKworanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuICQoVFJPQkpFQ1RTKSBsaWJqcGVnLiQoQSkgJChMRExJQlMpCisKK3JkanBnY29tOiByZGpwZ2NvbS4kKE8pCisJJChMTikgJChMREZMQUdTKSAtbyByZGpwZ2NvbSByZGpwZ2NvbS4kKE8pICQoTERMSUJTKQorCit3cmpwZ2NvbTogd3JqcGdjb20uJChPKQorCSQoTE4pICQoTERGTEFHUykgLW8gd3JqcGdjb20gd3JqcGdjb20uJChPKSAkKExETElCUykKKworIyBJbnN0YWxsYXRpb24gcnVsZXM6CisKK2luc3RhbGw6IGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tIEBGT1JDRV9JTlNUQUxMX0xJQkAKKwkkKElOU1RBTExfUFJPR1JBTSkgY2pwZWcgJChiaW5kaXIpLyQoYmlucHJlZml4KWNqcGVnCisJJChJTlNUQUxMX1BST0dSQU0pIGRqcGVnICQoYmluZGlyKS8kKGJpbnByZWZpeClkanBlZworCSQoSU5TVEFMTF9QUk9HUkFNKSBqcGVndHJhbiAkKGJpbmRpcikvJChiaW5wcmVmaXgpanBlZ3RyYW4KKwkkKElOU1RBTExfUFJPR1JBTSkgcmRqcGdjb20gJChiaW5kaXIpLyQoYmlucHJlZml4KXJkanBnY29tCisJJChJTlNUQUxMX1BST0dSQU0pIHdyanBnY29tICQoYmluZGlyKS8kKGJpbnByZWZpeCl3cmpwZ2NvbQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvY2pwZWcuMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpY2pwZWcuJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9kanBlZy4xICQobWFuZGlyKS8kKG1hbnByZWZpeClkanBlZy4kKG1hbmV4dCkKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWd0cmFuLjEgJChtYW5kaXIpLyQobWFucHJlZml4KWpwZWd0cmFuLiQobWFuZXh0KQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvcmRqcGdjb20uMSAkKG1hbmRpcikvJChtYW5wcmVmaXgpcmRqcGdjb20uJChtYW5leHQpCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS93cmpwZ2NvbS4xICQobWFuZGlyKS8kKG1hbnByZWZpeCl3cmpwZ2NvbS4kKG1hbmV4dCkKKworaW5zdGFsbC1saWI6IGxpYmpwZWcuJChBKSBpbnN0YWxsLWhlYWRlcnMKKwkkKElOU1RBTExfTElCKSBsaWJqcGVnLiQoQSkgJChsaWJkaXIpLyQoYmlucHJlZml4KWxpYmpwZWcuJChBKQorCitpbnN0YWxsLWhlYWRlcnM6IGpjb25maWcuaAorCSQoSU5TVEFMTF9EQVRBKSBqY29uZmlnLmggJChpbmNsdWRlZGlyKS9qY29uZmlnLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2pwZWdsaWIuaCAkKGluY2x1ZGVkaXIpL2pwZWdsaWIuaAorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2Rpcikvam1vcmVjZmcuaCAkKGluY2x1ZGVkaXIpL2ptb3JlY2ZnLmgKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL2plcnJvci5oICQoaW5jbHVkZWRpcikvamVycm9yLmgKKworY2xlYW46CisJJChSTSkgKi5vICoubG8gbGlianBlZy5hIGxpYmpwZWcubGEKKwkkKFJNKSBjanBlZyBkanBlZyBqcGVndHJhbiByZGpwZ2NvbSB3cmpwZ2NvbQorCSQoUk0pIGFuc2kya25yIGNvcmUgdGVzdG91dCogY29uZmlnLmxvZyBjb25maWcuc3RhdHVzCisJJChSTSkgLXIga25yIC5saWJzIF9saWJzCisKK2Rpc3RjbGVhbjogY2xlYW4KKwkkKFJNKSBNYWtlZmlsZSBqY29uZmlnLmggbGlidG9vbCBjb25maWcuY2FjaGUKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgJChzcmNkaXIpL3Rlc3RvcmlnLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gJChzcmNkaXIpL3Rlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnICQoc3JjZGlyKS90ZXN0aW1nLnBwbQorCS4vanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnICQoc3JjZGlyKS90ZXN0cHJvZy5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJY21wICQoc3JjZGlyKS90ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCAkKHNyY2RpcikvdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgJChzcmNkaXIpL3Rlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWNtcCAkKHNyY2RpcikvdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCAkKHNyY2RpcikvdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCitjaGVjazogdGVzdAorCisjIE1pc3Rha2UgY2F0Y2hlcjoKKworamNvbmZpZy5oOiBqY29uZmlnLmRvYworCWVjaG8gWW91IG11c3QgcHJlcGFyZSBhIHN5c3RlbS1kZXBlbmRlbnQgamNvbmZpZy5oIGZpbGUuCisJZWNobyBQbGVhc2UgcmVhZCB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdGlvbnMgaW4gaW5zdGFsbC5kb2MuCisJZXhpdCAxCisKKyMgR05VIE1ha2UgbGlrZXMgdG8ga25vdyB3aGljaCB0YXJnZXQgbmFtZXMgYXJlIG5vdCByZWFsbHkgZmlsZXMgdG8gYmUgbWFkZToKKy5QSE9OWTogYWxsIGluc3RhbGwgaW5zdGFsbC1saWIgaW5zdGFsbC1oZWFkZXJzIGNsZWFuIGRpc3RjbGVhbiB0ZXN0IGNoZWNrCisKKworamNhcGltaW4uJChPKTogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLiQoTyk6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC4kKE8pOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci4kKE8pOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci4kKE8pOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi4kKE8pOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC4kKE8pOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0LiQoTyk6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci4kKE8pOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIuJChPKTogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkuJChPKTogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS4kKE8pOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLiQoTyk6IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0LiQoTyk6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS4kKE8pOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy4kKE8pOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi4kKE8pOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQuJChPKTogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0LiQoTyk6IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLiQoTyk6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0LiQoTyk6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLiQoTyk6IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLiQoTyk6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLiQoTyk6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC4kKE8pOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC4kKE8pOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIuJChPKTogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLiQoTyk6IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLiQoTyk6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYuJChPKTogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QuJChPKTogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLiQoTyk6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLiQoTyk6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci4kKE8pOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC4kKE8pOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0LiQoTyk6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQuJChPKTogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC4kKE8pOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0LiQoTyk6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQuJChPKTogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC4kKE8pOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEuJChPKToganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi4kKE8pOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMuJChPKToganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLiQoTyk6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS4kKE8pOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLiQoTyk6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMuJChPKTogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLiQoTyk6IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLiQoTyk6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy4kKE8pOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy4kKE8pOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi4kKE8pOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLiQoTyk6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLiQoTyk6IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy4kKE8pOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLiQoTyk6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC4kKE8pOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAuJChPKTogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0uJChPKTogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLiQoTyk6IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi4kKE8pOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYuJChPKTogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EuJChPKTogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS4kKE8pOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC4kKE8pOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAuJChPKTogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLiQoTyk6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS4kKE8pOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLmRqIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLmRqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjZkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuZGoKQEAgLTAsMCArMSwyMjAgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIERKR1BQIChEZWxvcmllJ3MgR05VIEMgcG9ydCBvbiBNUy1ET1MpLCB2Mi4wIG9yIGxhdGVyLgorIyBUaGFua3MgdG8gRnJhbmsgSi4gRG9uYWhvZSBmb3IgdGhpcyB2ZXJzaW9uLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBnY2MKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9IC1PMiAtV2FsbCAtSS4KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IC1zCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgREpHUFAgdGhpcyBpcyB1c3VhbGx5IGptZW1ub2JzLm8sIGJ1dCB5b3UgY291bGQKKyMgdXNlIGptZW1uYW1lLm8gaWYgeW91IHdhbnQgdG8gdXNlIG5hbWVkIHRlbXAgZmlsZXMgaW5zdGVhZCBvZiBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gJChDQykKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsCisjIGxpYnJhcnkgKC5hKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBhciByYworIyBzZWNvbmQgc3RlcCBpbiAuYSBjcmVhdGlvbiAodXNlICJ0b3VjaCIgaWYgbm90IG5lZWRlZCkKK0FSMj0gcmFubGliCisKKyMgRW5kIG9mIGNvbmZpZ3VyYWJsZSBvcHRpb25zLgorCisKKyMgc291cmNlIGZpbGVzOiBKUEVHIGxpYnJhcnkgcHJvcGVyCitMSUJTT1VSQ0VTPSBqY2FwaW1pbi5jIGpjYXBpc3RkLmMgamNjb2VmY3QuYyBqY2NvbG9yLmMgamNkY3RtZ3IuYyBqY2h1ZmYuYyBcCisgICAgICAgIGpjaW5pdC5jIGpjbWFpbmN0LmMgamNtYXJrZXIuYyBqY21hc3Rlci5jIGpjb21hcGkuYyBqY3BhcmFtLmMgXAorICAgICAgICBqY3BodWZmLmMgamNwcmVwY3QuYyBqY3NhbXBsZS5jIGpjdHJhbnMuYyBqZGFwaW1pbi5jIGpkYXBpc3RkLmMgXAorICAgICAgICBqZGF0YWRzdC5jIGpkYXRhc3JjLmMgamRjb2VmY3QuYyBqZGNvbG9yLmMgamRkY3RtZ3IuYyBqZGh1ZmYuYyBcCisgICAgICAgIGpkaW5wdXQuYyBqZG1haW5jdC5jIGpkbWFya2VyLmMgamRtYXN0ZXIuYyBqZG1lcmdlLmMgamRwaHVmZi5jIFwKKyAgICAgICAgamRwb3N0Y3QuYyBqZHNhbXBsZS5jIGpkdHJhbnMuYyBqZXJyb3IuYyBqZmRjdGZsdC5jIGpmZGN0ZnN0LmMgXAorICAgICAgICBqZmRjdGludC5jIGppZGN0Zmx0LmMgamlkY3Rmc3QuYyBqaWRjdGludC5jIGppZGN0cmVkLmMganF1YW50MS5jIFwKKyAgICAgICAganF1YW50Mi5jIGp1dGlscy5jIGptZW1tZ3IuYworIyBtZW1tZ3IgYmFjayBlbmRzOiBjb21waWxlIG9ubHkgb25lIG9mIHRoZXNlIGludG8gYSB3b3JraW5nIGxpYnJhcnkKK1NZU0RFUFNPVVJDRVM9IGptZW1hbnNpLmMgam1lbW5hbWUuYyBqbWVtbm9icy5jIGptZW1kb3MuYyBqbWVtbWFjLmMKKyMgc291cmNlIGZpbGVzOiBjanBlZy9kanBlZy9qcGVndHJhbiBhcHBsaWNhdGlvbnMsIGFsc28gcmRqcGdjb20vd3JqcGdjb20KK0FQUFNPVVJDRVM9IGNqcGVnLmMgZGpwZWcuYyBqcGVndHJhbi5jIHJkanBnY29tLmMgd3JqcGdjb20uYyBjZGpwZWcuYyBcCisgICAgICAgIHJkY29sbWFwLmMgcmRzd2l0Y2guYyB0cmFuc3VwcC5jIHJkcHBtLmMgd3JwcG0uYyByZGdpZi5jIHdyZ2lmLmMgXAorICAgICAgICByZHRhcmdhLmMgd3J0YXJnYS5jIHJkYm1wLmMgd3JibXAuYyByZHJsZS5jIHdycmxlLmMKK1NPVVJDRVM9ICQoTElCU09VUkNFUykgJChTWVNERVBTT1VSQ0VTKSAkKEFQUFNPVVJDRVMpCisjIGZpbGVzIGluY2x1ZGVkIGJ5IHNvdXJjZSBmaWxlcworSU5DTFVERVM9IGpjaHVmZi5oIGpkaHVmZi5oIGpkY3QuaCBqZXJyb3IuaCBqaW5jbHVkZS5oIGptZW1zeXMuaCBqbW9yZWNmZy5oIFwKKyAgICAgICAganBlZ2ludC5oIGpwZWdsaWIuaCBqdmVyc2lvbi5oIGNkanBlZy5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oCisjIGRvY3VtZW50YXRpb24sIHRlc3QsIGFuZCBzdXBwb3J0IGZpbGVzCitET0NTPSBSRUFETUUgaW5zdGFsbC5kb2MgdXNhZ2UuZG9jIGNqcGVnLjEgZGpwZWcuMSBqcGVndHJhbi4xIHJkanBnY29tLjEgXAorICAgICAgICB3cmpwZ2NvbS4xIHdpemFyZC5kb2MgZXhhbXBsZS5jIGxpYmpwZWcuZG9jIHN0cnVjdHVyZS5kb2MgXAorICAgICAgICBjb2RlcnVsZXMuZG9jIGZpbGVsaXN0LmRvYyBjaGFuZ2UubG9nCitNS0ZJTEVTPSBjb25maWd1cmUgbWFrZWZpbGUuY2ZnIG1ha2VmaWxlLmFuc2kgbWFrZWZpbGUudW5peCBtYWtlZmlsZS5iY2MgXAorICAgICAgICBtYWtlZmlsZS5tYzYgbWFrZWZpbGUuZGogbWFrZWZpbGUud2F0IG1ha2VmaWxlLnZjIG1ha2VsaWIuZHMgXAorICAgICAgICBtYWtlYXBwcy5kcyBtYWtlcHJvai5tYWMgbWFrY2pwZWcuc3QgbWFrZGpwZWcuc3QgbWFrbGpwZWcuc3QgXAorICAgICAgICBtYWt0anBlZy5zdCBtYWtlZmlsZS5tYW54IG1ha2VmaWxlLnNhcyBtYWtlZmlsZS5tbXMgbWFrZWZpbGUudm1zIFwKKyAgICAgICAgbWFrdm1zLm9wdAorQ09ORklHRklMRVM9IGpjb25maWcuY2ZnIGpjb25maWcuYmNjIGpjb25maWcubWM2IGpjb25maWcuZGogamNvbmZpZy53YXQgXAorICAgICAgICBqY29uZmlnLnZjIGpjb25maWcubWFjIGpjb25maWcuc3QgamNvbmZpZy5tYW54IGpjb25maWcuc2FzIFwKKyAgICAgICAgamNvbmZpZy52bXMKK0NPTkZJR1VSRUZJTEVTPSBjb25maWcuZ3Vlc3MgY29uZmlnLnN1YiBpbnN0YWxsLXNoIGx0Y29uZmlnIGx0bWFpbi5zaAorT1RIRVJGSUxFUz0gamNvbmZpZy5kb2MgY2tjb25maWcuYyBhbnNpMmtuci5jIGFuc2kya25yLjEgam1lbWRvc2EuYXNtCitURVNURklMRVM9IHRlc3RvcmlnLmpwZyB0ZXN0aW1nLnBwbSB0ZXN0aW1nLmJtcCB0ZXN0aW1nLmpwZyB0ZXN0cHJvZy5qcGcgXAorICAgICAgICB0ZXN0aW1ncC5qcGcKK0RJU1RGSUxFUz0gJChET0NTKSAkKE1LRklMRVMpICQoQ09ORklHRklMRVMpICQoU09VUkNFUykgJChJTkNMVURFUykgXAorICAgICAgICAkKENPTkZJR1VSRUZJTEVTKSAkKE9USEVSRklMRVMpICQoVEVTVEZJTEVTKQorIyBsaWJyYXJ5IG9iamVjdCBmaWxlcyBjb21tb24gdG8gY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24KK0NPTU9CSkVDVFM9IGpjb21hcGkubyBqdXRpbHMubyBqZXJyb3IubyBqbWVtbWdyLm8gJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ubyBqY2FwaXN0ZC5vIGpjdHJhbnMubyBqY3BhcmFtLm8gamRhdGFkc3QubyBqY2luaXQubyBcCisgICAgICAgIGpjbWFzdGVyLm8gamNtYXJrZXIubyBqY21haW5jdC5vIGpjcHJlcGN0Lm8gamNjb2VmY3QubyBqY2NvbG9yLm8gXAorICAgICAgICBqY3NhbXBsZS5vIGpjaHVmZi5vIGpjcGh1ZmYubyBqY2RjdG1nci5vIGpmZGN0ZnN0Lm8gamZkY3RmbHQubyBcCisgICAgICAgIGpmZGN0aW50Lm8KKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm8gamRhcGlzdGQubyBqZHRyYW5zLm8gamRhdGFzcmMubyBqZG1hc3Rlci5vIFwKKyAgICAgICAgamRpbnB1dC5vIGpkbWFya2VyLm8gamRodWZmLm8gamRwaHVmZi5vIGpkbWFpbmN0Lm8gamRjb2VmY3QubyBcCisgICAgICAgIGpkcG9zdGN0Lm8gamRkY3RtZ3IubyBqaWRjdGZzdC5vIGppZGN0Zmx0Lm8gamlkY3RpbnQubyBqaWRjdHJlZC5vIFwKKyAgICAgICAgamRzYW1wbGUubyBqZGNvbG9yLm8ganF1YW50MS5vIGpxdWFudDIubyBqZG1lcmdlLm8KKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcuYQorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcuYSBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcuYTogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcuYQorCSQoQVIpIGxpYmpwZWcuYSAgJChMSUJPQkpFQ1RTKQorCSQoQVIyKSBsaWJqcGVnLmEKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmEgJChMRExJQlMpCisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5hCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZy5leGUgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitqcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGpwZWd0cmFuLmV4ZSAkKFRST0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCityZGpwZ2NvbS5leGU6IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vICQoTERMSUJTKQorCit3cmpwZ2NvbS5leGU6IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tLmV4ZSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJJChSTSkgKi5vCisJJChSTSkgY2pwZWcuZXhlCisJJChSTSkgZGpwZWcuZXhlCisJJChSTSkganBlZ3RyYW4uZXhlCisJJChSTSkgcmRqcGdjb20uZXhlCisJJChSTSkgd3JqcGdjb20uZXhlCisJJChSTSkgbGlianBlZy5hCisJJChSTSkgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCSQoUk0pIHRlc3RvdXQqLioKKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCS4vZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJLi9janBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwkuL2RqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCS4vY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJLi9qcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQubzogamNhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29lZmN0Lm86IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm86IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm86IGpjZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramNodWZmLm86IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm86IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3QubzogamNtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFya2VyLm86IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vOiBqY29tYXBpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BhcmFtLm86IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYubzogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3QubzogamNwcmVwY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjc2FtcGxlLm86IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm86IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm86IGpkYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaXN0ZC5vOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3QubzogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMubzogamRhdGFzcmMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRjb2VmY3QubzogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3IubzogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3IubzogamRkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZGh1ZmYubzogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm86IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm86IGpkbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hcmtlci5vOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIubzogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2UubzogamRtZXJnZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRwaHVmZi5vOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUubzogamRzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkdHJhbnMubzogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm86IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm86IGpmZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3Rmc3QubzogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm86IGppZGN0Zmx0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3Rmc3QubzogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm86IGppZGN0cmVkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoranF1YW50MS5vOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm86IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vOiBqdXRpbHMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2ptZW1tZ3Iubzogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm86IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUubzogam1lbW5hbWUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbm9icy5vOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mubzogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMubzogam1lbW1hYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2NqcGVnLm86IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm86IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm86IGpwZWd0cmFuLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIHRyYW5zdXBwLmgganZlcnNpb24uaAorcmRqcGdjb20ubzogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ubzogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm86IGNkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRjb2xtYXAubzogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm86IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vOiB0cmFuc3VwcC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCB0cmFuc3VwcC5oCityZHBwbS5vOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ubzogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm86IHJkZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmdpZi5vOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm86IHdydGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkYm1wLm86IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUubzogcmRybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycmxlLm86IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUubWFueCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5tYW54Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjQyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUubWFueApAQCAtMCwwICsxLDIxNCBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgQW1pZ2Egc3lzdGVtcyB1c2luZyBNYW54IEF6dGVjIEMgdmVyIDUueC4KKyMgVGhhbmtzIHRvIEQuSi4gSmFtZXMgKGRqamFtZXNAY3VwLnBvcnRhbC5jb20pIGZvciB0aGlzIHZlcnNpb24uCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IGNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorIyBVbmNvbW1lbnQgZm9yIGdlbmVyaWMgNjgwMDAgY29kZSAod2lsbCB3b3JrIG9uIGFueSBBbWlnYSkKK0FSQ0hGTEFHUz0gLXNuCisKKyMgVW5jb21tZW50IGZvciA2ODAyMC82ODAzMCBjb2RlIChmYXN0ZXIsIGJ1dCB3b24ndCBydW4gb24gNjgwMDAgQ1BVKQorI0FSQ0hGTEFHUz0gLWMyCisKK0NGTEFHUz0gLU1DIC1NRCAkKEFSQ0hGTEFHUykgLXNwZmFtIC1yNAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gLWcKKworIyBUbyBsaW5rIGFueSBzcGVjaWFsIGxpYnJhcmllcywgYWRkIHRoZSBuZWNlc3NhcnkgLWwgY29tbWFuZHMgaGVyZS4KK0xETElCUz0gLWxtbCAtbGNsCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBBbWlnYSB3ZSByZWNvbW1lbmQgam1lbW5hbWUuby4KK1NZU0RFUE1FTT0gam1lbW5hbWUubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49IGxuCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IGRlbGV0ZSBxdWlldAorIyBsaWJyYXJ5ICgubGliKSBmaWxlIGNyZWF0aW9uIGNvbW1hbmQKK0FSPSBsYgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnIGRqcGVnIGpwZWd0cmFuIHJkanBnY29tIHdyanBnY29tCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSQoUk0pIGxpYmpwZWcubGliCisJJChBUikgbGlianBlZy5saWIgICQoTElCT0JKRUNUUykKKworY2pwZWc6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgJChMREZMQUdTKSAtbyBjanBlZyAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworZGpwZWc6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgJChMREZMQUdTKSAtbyBkanBlZyAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworanBlZ3RyYW46ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQorCityZGpwZ2NvbTogcmRqcGdjb20ubworCSQoTE4pICQoTERGTEFHUykgLW8gcmRqcGdjb20gcmRqcGdjb20ubyAkKExETElCUykKKword3JqcGdjb206IHdyanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHdyanBnY29tIHdyanBnY29tLm8gJChMRExJQlMpCisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjoKKwktJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcubGliIHJkanBnY29tIHdyanBnY29tCisJLSQoUk0pIGNvcmUgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCS0kKFJNKSB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLm1jNiBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5tYzYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZjA1NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5tYzYKQEAgLTAsMCArMSwyNDkgQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgZm9yIE1pY3Jvc29mdCBDIGZvciBNUy1ET1MsIHZlcnNpb24gNi4wMEEgYW5kIHVwLgorIyBVc2UgTk1BS0UsIG5vdCBNaWNyb3NvZnQncyBicmFpbi1kYW1hZ2VkIE1BS0UuCisjIFRoYW5rcyB0byBBbGFuIFdyaWdodCBhbmQgQ2hyaXMgVHVybmVyIG9mIE9saXZldHRpIFJlc2VhcmNoIEx0ZC4KKworIyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHNheWluZyAibm1ha2UiICEhCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjb21waWxlciBvcHRpb25zOgorQ0ZMQUdTID0gLUFNIC1PZWNpZ3QgLUdzIC1XMworIyAtQU0gbWVkaXVtIG1lbW9yeSBtb2RlbCAob3IgdXNlIC1BUyBmb3Igc21hbGwgbW9kZWwsIGlmIHlvdSByZW1vdmUgZmVhdHVyZXMpCisjIC1PZWNpZ3QgLUdzICBtYXhpbXVtIHNhZmUgb3B0aW1pc2F0aW9uICgtT2wgaGFzIGJ1Z3MgaW4gTVNDIDYuMDBBKQorIyAtVzMgd2FybmluZyBsZXZlbCAzCisjIFlvdSBtaWdodCBhbHNvIHdhbnQgdG8gYWRkIC1HMiBpZiB5b3UgaGF2ZSBhbiA4MDI4NiwgZXRjLgorIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSAtRCBzd2l0Y2hlcyBoZXJlLgorCisjIEphbi1IZXJtYW4gQnVpbmluZyBzdWdnZXN0cyB0aGUgZm9sbG93aW5nIHN3aXRjaGVzIGZvciBNUyBDIDguMCBhbmQgYSA0ODY6CisjIENGTEFHUyA9IC9BTSAvZi0gL0ZQaTg3IC9HMyAvR3MgL0d5IC9PYjEgL09jIC9PZSAvT2cgL09pIC9PbCAvT24gL09vIC9PdCBcCisjICAgICAgICAgIC9PVjQgL1czCisjIGV4Y2VwdCBmb3IganF1YW50MS5jLCB3aGljaCBtdXN0IGJlIGNvbXBpbGVkIHdpdGggL09vLSB0byBhdm9pZCBhIGNvbXBpbGVyCisjIGNyYXNoLgorCisjIEluZ2FyIFN0ZWluc2xhbmQgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyB3aGVuIGJ1aWxkaW5nCisjIGEgMTYtYml0IFdpbmRvd3MgRExMOgorIyBDRkxBR1MgPSAtQUx3IC1Hc3cgLVpwZSAtVzMgLU8yIC1aaSAtWmQKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIERPUywgd2UgcmVjb21tZW5kIGptZW1kb3MuYyBhbmQgam1lbWRvc2EuYXNtLgorIyAoQnV0IG5vdCBmb3IgV2luZG93czsgc2VlIGluc3RhbGwuZG9jIGlmIHlvdSB1c2UgdGhpcyBtYWtlZmlsZSBmb3IgV2luZG93cy4pCitTWVNERVBNRU09IGptZW1kb3Mub2JqIGptZW1kb3NhLm9iagorIyBTWVNERVBNRU1MSUIgbXVzdCBsaXN0IHRoZSBzYW1lIGZpbGVzIHdpdGggIisiIHNpZ25zIGZvciB0aGUgbGlicmFyaWFuLgorU1lTREVQTUVNTElCPSAram1lbWRvcy5vYmogK2ptZW1kb3NhLm9iagorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm9iaiBqdXRpbHMub2JqIGplcnJvci5vYmogam1lbW1nci5vYmogJChTWVNERVBNRU0pCisjIGNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitDTElCT0JKRUNUUz0gamNhcGltaW4ub2JqIGpjYXBpc3RkLm9iaiBqY3RyYW5zLm9iaiBqY3BhcmFtLm9iaiBqZGF0YWRzdC5vYmogXAorICAgICAgICBqY2luaXQub2JqIGpjbWFzdGVyLm9iaiBqY21hcmtlci5vYmogamNtYWluY3Qub2JqIGpjcHJlcGN0Lm9iaiBcCisgICAgICAgIGpjY29lZmN0Lm9iaiBqY2NvbG9yLm9iaiBqY3NhbXBsZS5vYmogamNodWZmLm9iaiBqY3BodWZmLm9iaiBcCisgICAgICAgIGpjZGN0bWdyLm9iaiBqZmRjdGZzdC5vYmogamZkY3RmbHQub2JqIGpmZGN0aW50Lm9iagorIyBkZWNvbXByZXNzaW9uIGxpYnJhcnkgb2JqZWN0IGZpbGVzCitETElCT0JKRUNUUz0gamRhcGltaW4ub2JqIGpkYXBpc3RkLm9iaiBqZHRyYW5zLm9iaiBqZGF0YXNyYy5vYmogXAorICAgICAgICBqZG1hc3Rlci5vYmogamRpbnB1dC5vYmogamRtYXJrZXIub2JqIGpkaHVmZi5vYmogamRwaHVmZi5vYmogXAorICAgICAgICBqZG1haW5jdC5vYmogamRjb2VmY3Qub2JqIGpkcG9zdGN0Lm9iaiBqZGRjdG1nci5vYmogamlkY3Rmc3Qub2JqIFwKKyAgICAgICAgamlkY3RmbHQub2JqIGppZGN0aW50Lm9iaiBqaWRjdHJlZC5vYmogamRzYW1wbGUub2JqIGpkY29sb3Iub2JqIFwKKyAgICAgICAganF1YW50MS5vYmoganF1YW50Mi5vYmogamRtZXJnZS5vYmoKKyMgVGhlc2Ugb2JqZWN0ZmlsZXMgYXJlIGluY2x1ZGVkIGluIGxpYmpwZWcubGliCitMSUJPQkpFQ1RTPSAkKENMSUJPQkpFQ1RTKSAkKERMSUJPQkpFQ1RTKSAkKENPTU9CSkVDVFMpCisjIG9iamVjdCBmaWxlcyBmb3Igc2FtcGxlIGFwcGxpY2F0aW9ucyAoZXhjbHVkaW5nIGxpYnJhcnkgZmlsZXMpCitDT0JKRUNUUz0gY2pwZWcub2JqIHJkcHBtLm9iaiByZGdpZi5vYmogcmR0YXJnYS5vYmogcmRybGUub2JqIHJkYm1wLm9iaiBcCisgICAgICAgIHJkc3dpdGNoLm9iaiBjZGpwZWcub2JqCitET0JKRUNUUz0gZGpwZWcub2JqIHdycHBtLm9iaiB3cmdpZi5vYmogd3J0YXJnYS5vYmogd3JybGUub2JqIHdyYm1wLm9iaiBcCisgICAgICAgIHJkY29sbWFwLm9iaiBjZGpwZWcub2JqCitUUk9CSkVDVFM9IGpwZWd0cmFuLm9iaiByZHN3aXRjaC5vYmogY2RqcGVnLm9iaiB0cmFuc3VwcC5vYmoKKworIyBuZWVkIGxpbmtlciByZXNwb25zZSBmaWxlIGJlY2F1c2UgZmlsZSBsaXN0ID4gMTI4IGNoYXJzCitSRklMRSA9IGxpYmpwZWcuYW5zCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpICQoUkZJTEUpCisJZGVsIGxpYmpwZWcubGliCisJbGliIEAkKFJGSUxFKQorCisjIGxpbmtlciByZXNwb25zZSBmaWxlIGZvciBidWlsZGluZyBsaWJqcGVnLmxpYgorJChSRklMRSkgOiBtYWtlZmlsZQorCWRlbCAkKFJGSUxFKQorCWVjaG8gbGlianBlZy5saWIgPiQoUkZJTEUpCisjIHNpbGx5IHdhbnQtdG8tY3JlYXRlLWl0IHByb21wdDoKKwllY2hvIHkgPj4kKFJGSUxFKQorCWVjaG8gK2pjYXBpbWluLm9iaiAramNhcGlzdGQub2JqICtqY3RyYW5zLm9iaiAramNwYXJhbS5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramRhdGFkc3Qub2JqICtqY2luaXQub2JqICtqY21hc3Rlci5vYmogK2pjbWFya2VyLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqY21haW5jdC5vYmogK2pjcHJlcGN0Lm9iaiAramNjb2VmY3Qub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjY29sb3Iub2JqICtqY3NhbXBsZS5vYmogK2pjaHVmZi5vYmogK2pjcGh1ZmYub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pjZGN0bWdyLm9iaiAramZkY3Rmc3Qub2JqICtqZmRjdGZsdC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramZkY3RpbnQub2JqICtqZGFwaW1pbi5vYmogK2pkYXBpc3RkLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZHRyYW5zLm9iaiAramRhdGFzcmMub2JqICtqZG1hc3Rlci5vYmogK2pkaW5wdXQub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2pkbWFya2VyLm9iaiAramRodWZmLm9iaiAramRwaHVmZi5vYmogK2pkbWFpbmN0Lm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqZGNvZWZjdC5vYmogK2pkcG9zdGN0Lm9iaiAramRkY3RtZ3Iub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2ppZGN0ZnN0Lm9iaiAramlkY3RmbHQub2JqICtqaWRjdGludC5vYmogJiA+PiQoUkZJTEUpCisJZWNobyAramlkY3RyZWQub2JqICtqZHNhbXBsZS5vYmogK2pkY29sb3Iub2JqICtqcXVhbnQxLm9iaiAmID4+JChSRklMRSkKKwllY2hvICtqcXVhbnQyLm9iaiAramRtZXJnZS5vYmogK2pjb21hcGkub2JqICtqdXRpbHMub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gK2plcnJvci5vYmogK2ptZW1tZ3Iub2JqICYgPj4kKFJGSUxFKQorCWVjaG8gJChTWVNERVBNRU1MSUIpIDsgPj4kKFJGSUxFKQorCitjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJZWNobyAkKENPQkpFQ1RTKSA+Y2pwZWcubHN0CisJbGluayAvU1RBQ0s6NDA5NiAvRVhFUEFDSyBAY2pwZWcubHN0LCBjanBlZy5leGUsICwgbGlianBlZy5saWIsIDsKKwlkZWwgY2pwZWcubHN0CisKK2RqcGVnLmV4ZTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwllY2hvICQoRE9CSkVDVFMpID5kanBlZy5sc3QKKwlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLIEBkanBlZy5sc3QsIGRqcGVnLmV4ZSwgLCBsaWJqcGVnLmxpYiwgOworCWRlbCBkanBlZy5sc3QKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwlsaW5rIC9TVEFDSzo0MDk2IC9FWEVQQUNLICQoVFJPQkpFQ1RTKSwganBlZ3RyYW4uZXhlLCAsIGxpYmpwZWcubGliLCA7CisKK3JkanBnY29tLmV4ZTogcmRqcGdjb20uYworCSQoQ0MpIC1BUyAtTyAtVzMgcmRqcGdjb20uYworCisjIHdyanBnY29tIG5lZWRzIGxhcmdlIG1vZGVsIHNvIGl0IGNhbiBtYWxsb2MgYSA2NEsgY2h1bmsKK3dyanBnY29tLmV4ZTogd3JqcGdjb20uYworCSQoQ0MpIC1BTCAtTyAtVzMgd3JqcGdjb20uYworCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJZGVsICoub2JqCisJZGVsIGxpYmpwZWcubGliCisJZGVsIGNqcGVnLmV4ZQorCWRlbCBkanBlZy5leGUKKwlkZWwganBlZ3RyYW4uZXhlCisJZGVsIHJkanBnY29tLmV4ZQorCWRlbCB3cmpwZ2NvbS5leGUKKwlkZWwgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZQorCWRlbCB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtCisJZmMgL2IgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwlmYyAvYiB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWZjIC9iIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbQorCWZjIC9iIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwlmYyAvYiB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAoram1lbWRvc2Eub2JqIDogam1lbWRvc2EuYXNtCisJbWFzbSAvbXggJCo7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUubW1zIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLm1tcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjEzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLm1tcwpAQCAtMCwwICsxLDIxOCBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBmb3IgdXNlIHdpdGggTU1TIG9uIERpZ2l0YWwgVk1TIHN5c3RlbXMuCisjIFRoYW5rcyB0byBSaWNrIER5c29uIChkeXNvbkBpb3dhc3AucGh5c2ljcy51aW93YS5lZHUpCisjIGFuZCBUaW0gQmVsbCAodGJlbGxAbmV0Y29tLmNvbSkgZm9yIHRoZWlyIGhlbHAuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIk1NUyIgISEKKworIyBZb3UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZXNlIGNjIG9wdGlvbnM6CitDRkxBR1M9ICQoQ0ZMQUdTKSAvTm9EZWJ1ZyAvT3B0aW1pemUKKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgL0RlZmluZSBzd2l0Y2hlcyBoZXJlLgorLmlmZGVmIEFMUEhBCitPUFQ9CisuZWxzZQorT1BUPSAsU3lzJERpc2s6W11NQUtWTVMuT1BUL09wdGlvbgorLmVuZGlmCisKKyMgUHV0IGhlcmUgdGhlIG9iamVjdCBmaWxlIG5hbWUgZm9yIHRoZSBjb3JyZWN0IHN5c3RlbS1kZXBlbmRlbnQgbWVtb3J5CisjIG1hbmFnZXIgZmlsZS4gIEZvciBVbml4IHRoaXMgaXMgdXN1YWxseSBqbWVtbm9icy5vLCBidXQgeW91IG1heSB3YW50CisjIHRvIHVzZSBqbWVtYW5zaS5vIG9yIGptZW1uYW1lLm8gaWYgeW91IGhhdmUgbGltaXRlZCBzd2FwIHNwYWNlLgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLm9sYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisjIG9iamVjdGZpbGUgbGlzdHMgd2l0aCBjb21tYXMgLS0tIHdoYXQgYSBjcm9jaworQ09CSkxJU1Q9IGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLHJkdGFyZ2Eub2JqLHJkcmxlLm9iaixyZGJtcC5vYmosXAorICAgICAgICAgIHJkc3dpdGNoLm9iaixjZGpwZWcub2JqCitET0JKTElTVD0gZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosd3J0YXJnYS5vYmosd3JybGUub2JqLHdyYm1wLm9iaixcCisgICAgICAgICAgcmRjb2xtYXAub2JqLGNkanBlZy5vYmoKK1RST0JKTElTVD0ganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaixjZGpwZWcub2JqLHRyYW5zdXBwLm9iagorTElCT0JKTElTVD0gamNhcGltaW4ub2JqLGpjYXBpc3RkLm9iaixqY3RyYW5zLm9iaixqY3BhcmFtLm9iaixqZGF0YWRzdC5vYmosXAorICAgICAgICAgIGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaixqY21haW5jdC5vYmosamNwcmVwY3Qub2JqLFwKKyAgICAgICAgICBqY2NvZWZjdC5vYmosamNjb2xvci5vYmosamNzYW1wbGUub2JqLGpjaHVmZi5vYmosamNwaHVmZi5vYmosXAorICAgICAgICAgIGpjZGN0bWdyLm9iaixqZmRjdGZzdC5vYmosamZkY3RmbHQub2JqLGpmZGN0aW50Lm9iaixqZGFwaW1pbi5vYmosXAorICAgICAgICAgIGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosamRtYXN0ZXIub2JqLGpkaW5wdXQub2JqLFwKKyAgICAgICAgICBqZG1hcmtlci5vYmosamRodWZmLm9iaixqZHBodWZmLm9iaixqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLFwKKyAgICAgICAgICBqZHBvc3RjdC5vYmosamRkY3RtZ3Iub2JqLGppZGN0ZnN0Lm9iaixqaWRjdGZsdC5vYmosamlkY3RpbnQub2JqLFwKKyAgICAgICAgICBqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLGpxdWFudDEub2JqLGpxdWFudDIub2JqLFwKKyAgICAgICAgICBqZG1lcmdlLm9iaixqY29tYXBpLm9iaixqdXRpbHMub2JqLGplcnJvci5vYmosam1lbW1nci5vYmosJChTWVNERVBNRU0pCisKKworLmZpcnN0CisJQC0gRGVmaW5lIC9Ob0xvZyBTeXMgU3lzJExpYnJhcnkKKworQUxMIDogbGlianBlZy5vbGIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCUAgQ29udGludWUKKworbGlianBlZy5vbGIgOiAkKExJQk9CSkVDVFMpCisJTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICQoTElCT0JKTElTVCkKKworY2pwZWcuZXhlIDogJChDT0JKRUNUUykgbGlianBlZy5vbGIKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGNqcGVnLmV4ZSAkKENPQkpMSVNUKSxsaWJqcGVnLm9sYi9MaWJyYXJ5JChPUFQpCisKK2RqcGVnLmV4ZSA6ICQoRE9CSkVDVFMpIGxpYmpwZWcub2xiCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSBkanBlZy5leGUgJChET0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQorCitqcGVndHJhbi5leGUgOiAkKFRST0JKRUNUUykgbGlianBlZy5vbGIKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAkKFRST0JKTElTVCksbGlianBlZy5vbGIvTGlicmFyeSQoT1BUKQorCityZGpwZ2NvbS5leGUgOiByZGpwZ2NvbS5vYmoKKwkkKExJTkspICQoTEZMQUdTKSAvRXhlY3V0YWJsZSA9IHJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmokKE9QVCkKKword3JqcGdjb20uZXhlIDogd3JqcGdjb20ub2JqCisJJChMSU5LKSAkKExGTEFHUykgL0V4ZWN1dGFibGUgPSB3cmpwZ2NvbS5leGUgd3JqcGdjb20ub2JqJChPUFQpCisKK2pjb25maWcuaCA6IGpjb25maWcudm1zCisJQC0gQ29weSBqY29uZmlnLnZtcyBqY29uZmlnLmgKKworY2xlYW4gOgorCUAtIFNldCBQcm90ZWN0aW9uID0gT3duZXI6UldFRCAqLio7LTEKKwlALSBTZXQgUHJvdGVjdGlvbiA9IE93bmVyOlJXRUQgKi5PQkoKKwktIFB1cmdlIC9Ob0xvZyAvTm9Db25maXJtICouKgorCS0gRGVsZXRlIC9Ob0xvZyAvTm9Db25maXJtICouT0JKOworCit0ZXN0IDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUKKwltY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtIHRlc3RvcmlnLmpwZworCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1ibXAgLWNvbG9ycyAyNTYgLW91dGZpbGUgdGVzdG91dC5ibXAgdGVzdG9yaWcuanBnCisJbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQorCW1jciBzeXMkZGlzazpbXWRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCW1jciBzeXMkZGlzazpbXWNqcGVnIC1kY3QgaW50IC1wcm9ncmVzc2l2ZSAtb3B0IC1vdXRmaWxlIHRlc3RvdXRwLmpwZyB0ZXN0aW1nLnBwbQorCW1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCS0gQmFja3VwIC9Db21wYXJlL0xvZwkgIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwktIEJhY2t1cCAvQ29tcGFyZS9Mb2cJICB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCisJLSBCYWNrdXAgL0NvbXBhcmUvTG9nCSAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm9iaiA6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vYmogOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqIDogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3Iub2JqIDogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3Iub2JqIDogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqIDogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQub2JqIDogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vYmogOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqIDogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm9iaiA6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm9iaiA6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqIDogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vYmogOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vYmogOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqIDogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMub2JqIDogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ub2JqIDogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iaiA6IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vYmogOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vYmogOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmogOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vYmogOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vYmogOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmogOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQub2JqIDogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3Qub2JqIDogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iaiA6IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vYmogOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vYmogOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iaiA6IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm9iaiA6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vYmogOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmogOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3Iub2JqIDogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQub2JqIDogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmogOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm9iaiA6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQub2JqIDogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmogOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm9iaiA6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQub2JqIDogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iaiA6IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIub2JqIDoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm9iaiA6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmogOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kub2JqIDogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vYmogOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iaiA6IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vYmogOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vYmogOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqIDogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcub2JqIDogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ub2JqIDoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmogOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vYmogOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcub2JqIDogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmogOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gub2JqIDogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm9iaiA6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iaiA6IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vYmogOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYub2JqIDogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iaiA6IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm9iaiA6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eub2JqIDogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqIDogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm9iaiA6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vYmogOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqIDogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS5zYXMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuc2FzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTZmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUuc2FzCkBAIC0wLDAgKzEsMjUyIEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBBbWlnYSBzeXN0ZW1zIHVzaW5nIFNBUyBDIDYuMCBhbmQgdXAuCisjIFRoYW5rcyB0byBFZCBIYW53YXksIE1hcmsgUmluZnJldCwgYW5kIEppbSBaZXBlZGEuCisKKyMgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSBzYXlpbmcgIm1ha2UiICEhCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IHNjCisKKyMgWW91IG1heSBuZWVkIHRvIGFkanVzdCB0aGVzZSBjYyBvcHRpb25zOgorIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgZ2VuZXJpYyA2ODB4MCB2ZXJzaW9uCitBUkNIRkxBR1M9IGNwdT1hbnkKK1NVRkZJWD0KKworIyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBmb3IgNjgwMzAtb25seSB2ZXJzaW9uCisjQVJDSEZMQUdTPSBjcHU9NjgwMzAKKyNTVUZGSVg9LjAzMAorCitDRkxBR1M9IG5vc3RhY2tjaGVjayBkYXRhPW5lYXIgcGFybXM9cmVnaXN0ZXIgb3B0aW1pemUgJChBUkNIRkxBR1MpIFwKKwlpZ25vcmU9MTA0IGlnbm9yZT0zMDQgaWdub3JlPTMwNgorIyBpZ25vcmU9MTA0IGRpc2FibGVzIHdhcm5pbmdzIGZvciBtaXNtYXRjaGVkIGNvbnN0IHF1YWxpZmllcnMKKyMgaWdub3JlPTMwNCBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdmFyaWFibGVzIGJlaW5nIG9wdGltaXplZCBvdXQKKyMgaWdub3JlPTMwNiBkaXNhYmxlcyB3YXJuaW5ncyBmb3IgdGhlIGlubGluaW5nIG9mIGZ1bmN0aW9ucworIyBHZW5lcmFsbHksIHdlIHJlY29tbWVuZCBkZWZpbmluZyBhbnkgY29uZmlndXJhdGlvbiBzeW1ib2xzIGluIGpjb25maWcuaCwKKyMgTk9UIHZpYSBkZWZpbmUgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKK0xERkxBR1M9IFNDIFNEIE5EIEJBVENICisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IExJQjpzY20ubGliIExJQjpzYy5saWIKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIEFtaWdhIHdlIHJlY29tbWVuZCBqbWVtbmFtZS5vLgorU1lTREVQTUVNPSBqbWVtbmFtZS5vCisKKyMgbWlzY2VsbGFuZW91cyBPUy1kZXBlbmRlbnQgc3R1ZmYKKyMgbGlua2VyCitMTj0gc2xpbmsKKyMgZmlsZSBkZWxldGlvbiBjb21tYW5kCitSTT0gZGVsZXRlIHF1aWV0CisjIGxpYnJhcnkgKC5saWIpIGZpbGUgY3JlYXRpb24gY29tbWFuZAorQVI9IG9tbAorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm8gcmRwcG0ubyByZGdpZi5vIHJkdGFyZ2EubyByZHJsZS5vIHJkYm1wLm8gcmRzd2l0Y2gubyBcCisgICAgICAgIGNkanBlZy5vCitET0JKRUNUUz0gZGpwZWcubyB3cnBwbS5vIHdyZ2lmLm8gd3J0YXJnYS5vIHdycmxlLm8gd3JibXAubyByZGNvbG1hcC5vIFwKKyAgICAgICAgY2RqcGVnLm8KK1RST0JKRUNUUz0ganBlZ3RyYW4ubyByZHN3aXRjaC5vIGNkanBlZy5vIHRyYW5zdXBwLm8KKworCithbGw6IGxpYmpwZWcubGliIGNqcGVnJChTVUZGSVgpIGRqcGVnJChTVUZGSVgpIGpwZWd0cmFuJChTVUZGSVgpIHJkanBnY29tJChTVUZGSVgpIHdyanBnY29tJChTVUZGSVgpCisKKyMgbm90ZTogZG8gc2V2ZXJhbCBBUiBzdGVwcyB0byBhdm9pZCBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0YXRpb25zCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSQoUk0pIGxpYmpwZWcubGliCisJJChBUikgbGlianBlZy5saWIgciAkKENMSUJPQkpFQ1RTKQorCSQoQVIpIGxpYmpwZWcubGliIHIgJChETElCT0JKRUNUUykKKwkkKEFSKSBsaWJqcGVnLmxpYiByICQoQ09NT0JKRUNUUykKKworY2pwZWckKFNVRkZJWCk6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChMTikgPFdJVEggPAorJChMREZMQUdTKQorVE8gY2pwZWckKFNVRkZJWCkKK0ZST00gTElCOmMubyAkKENPQkpFQ1RTKQorTElCIGxpYmpwZWcubGliICQoTERMSUJTKQorPAorCitkanBlZyQoU1VGRklYKTogJChET0JKRUNUUykgbGlianBlZy5saWIKKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyBkanBlZyQoU1VGRklYKQorRlJPTSBMSUI6Yy5vICQoRE9CSkVDVFMpCitMSUIgbGlianBlZy5saWIgJChMRExJQlMpCis8CisKK2pwZWd0cmFuJChTVUZGSVgpOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKExOKSA8V0lUSCA8CiskKExERkxBR1MpCitUTyBqcGVndHJhbiQoU1VGRklYKQorRlJPTSBMSUI6Yy5vICQoVFJPQkpFQ1RTKQorTElCIGxpYmpwZWcubGliICQoTERMSUJTKQorPAorCityZGpwZ2NvbSQoU1VGRklYKTogcmRqcGdjb20ubworCSQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIHJkanBnY29tJChTVUZGSVgpCitGUk9NIExJQjpjLm8gcmRqcGdjb20ubworTElCICQoTERMSUJTKQorPAorCit3cmpwZ2NvbSQoU1VGRklYKTogd3JqcGdjb20ubworCSQoTE4pIDxXSVRIIDwKKyQoTERGTEFHUykKK1RPIHdyanBnY29tJChTVUZGSVgpCitGUk9NIExJQjpjLm8gd3JqcGdjb20ubworTElCICQoTERMSUJTKQorPAorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJLSQoUk0pICoubyBjanBlZyBkanBlZyBqcGVndHJhbiBjanBlZy4wMzAgZGpwZWcuMDMwIGpwZWd0cmFuLjAzMAorCS0kKFJNKSByZGpwZ2NvbSB3cmpwZ2NvbSByZGpwZ2NvbS4wMzAgd3JqcGdjb20uMDMwCisJLSQoUk0pIGxpYmpwZWcubGliIGNvcmUgdGVzdG91dCouKgorCit0ZXN0OiBjanBlZyBkanBlZyBqcGVndHJhbgorCS0kKFJNKSB0ZXN0b3V0Ki4qCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJY2pwZWcgLWRjdCBpbnQgLW91dGZpbGUgdGVzdG91dC5qcGcgIHRlc3RpbWcucHBtCisJZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJanBlZ3RyYW4gLW91dGZpbGUgdGVzdG91dHQuanBnIHRlc3Rwcm9nLmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorCWNtcCB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWNtcCB0ZXN0aW1nLmpwZyB0ZXN0b3V0LmpwZworCWNtcCB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKwljbXAgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWNtcCB0ZXN0b3JpZy5qcGcgdGVzdG91dHQuanBnCisKKworamNhcGltaW4ubzogamNhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjYXBpc3RkLm86IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vOiBqY2NvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2RjdG1nci5vOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vOiBqY2luaXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFpbmN0Lm86IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIubzogamNtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjb21hcGkubzogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm86IGpjcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjcHJlcGN0Lm86IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vOiBqY3RyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGFwaW1pbi5vOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQubzogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm86IGpkYXRhZHN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkYXRhc3JjLm86IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm86IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm86IGpkY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkZGN0bWdyLm86IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm86IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vOiBqZGlucHV0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1haW5jdC5vOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIubzogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm86IGpkbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1lcmdlLm86IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYubzogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3QubzogamRwb3N0Y3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkc2FtcGxlLm86IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm86IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vOiBqZXJyb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqdmVyc2lvbi5oIGplcnJvci5oCitqZmRjdGZsdC5vOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm86IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQubzogamZkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZsdC5vOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm86IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQubzogamlkY3RpbnQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdHJlZC5vOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEubzoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vOiBqcXVhbnQyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqdXRpbHMubzoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm86IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vOiBqbWVtYW5zaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1uYW1lLm86IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMubzogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm86IGptZW1kb3MuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbWFjLm86IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vOiBkanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitqcGVndHJhbi5vOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm86IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm86IHdyanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK2NkanBlZy5vOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm86IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vOiByZHN3aXRjaC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAordHJhbnN1cHAubzogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ubzogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm86IHdycHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGdpZi5vOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYubzogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2EubzogcmR0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3J0YXJnYS5vOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAubzogd3JibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkcmxlLm86IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLnVuaXggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUudW5peApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQ1NWFiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLnVuaXgKQEAgLTAsMCArMSwyMjggQEAKKyMgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorCisjIFRoaXMgbWFrZWZpbGUgaXMgc3VpdGFibGUgZm9yIFVuaXgtbGlrZSBzeXN0ZW1zIHdpdGggbm9uLUFOU0kgY29tcGlsZXJzLgorIyBJZiB5b3UgaGF2ZSBhbiBBTlNJIGNvbXBpbGVyLCBtYWtlZmlsZS5hbnNpIGlzIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50LgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJtYWtlIiAhIQorCisjIFRoZSBuYW1lIG9mIHlvdXIgQyBjb21waWxlcjoKK0NDPSBjYworCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKK0NGTEFHUz0gLU8KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKyMgSG93ZXZlciwgYW55IHNwZWNpYWwgZGVmaW5lcyBmb3IgYW5zaTJrbnIuYyBtYXkgYmUgaW5jbHVkZWQgaGVyZToKK0FOU0kyS05SRkxBR1M9IAorCisjIExpbmstdGltZSBjYyBvcHRpb25zOgorTERGTEFHUz0gCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IC1sIGNvbW1hbmRzIGhlcmUuCitMRExJQlM9IAorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBGb3IgVW5peCB0aGlzIGlzIHVzdWFsbHkgam1lbW5vYnMubywgYnV0IHlvdSBtYXkgd2FudAorIyB0byB1c2Ugam1lbWFuc2kubyBvciBqbWVtbmFtZS5vIGlmIHlvdSBoYXZlIGxpbWl0ZWQgc3dhcCBzcGFjZS4KK1NZU0RFUE1FTT0gam1lbW5vYnMubworCisjIG1pc2NlbGxhbmVvdXMgT1MtZGVwZW5kZW50IHN0dWZmCisjIGxpbmtlcgorTE49ICQoQ0MpCisjIGZpbGUgZGVsZXRpb24gY29tbWFuZAorUk09IHJtIC1mCisjIGZpbGUgcmVuYW1lIGNvbW1hbmQKK01WPSBtdgorIyBsaWJyYXJ5ICguYSkgZmlsZSBjcmVhdGlvbiBjb21tYW5kCitBUj0gYXIgcmMKKyMgc2Vjb25kIHN0ZXAgaW4gLmEgY3JlYXRpb24gKHVzZSAidG91Y2giIGlmIG5vdCBuZWVkZWQpCitBUjI9IHJhbmxpYgorCisjIEVuZCBvZiBjb25maWd1cmFibGUgb3B0aW9ucy4KKworCisjIHNvdXJjZSBmaWxlczogSlBFRyBsaWJyYXJ5IHByb3BlcgorTElCU09VUkNFUz0gamNhcGltaW4uYyBqY2FwaXN0ZC5jIGpjY29lZmN0LmMgamNjb2xvci5jIGpjZGN0bWdyLmMgamNodWZmLmMgXAorICAgICAgICBqY2luaXQuYyBqY21haW5jdC5jIGpjbWFya2VyLmMgamNtYXN0ZXIuYyBqY29tYXBpLmMgamNwYXJhbS5jIFwKKyAgICAgICAgamNwaHVmZi5jIGpjcHJlcGN0LmMgamNzYW1wbGUuYyBqY3RyYW5zLmMgamRhcGltaW4uYyBqZGFwaXN0ZC5jIFwKKyAgICAgICAgamRhdGFkc3QuYyBqZGF0YXNyYy5jIGpkY29lZmN0LmMgamRjb2xvci5jIGpkZGN0bWdyLmMgamRodWZmLmMgXAorICAgICAgICBqZGlucHV0LmMgamRtYWluY3QuYyBqZG1hcmtlci5jIGpkbWFzdGVyLmMgamRtZXJnZS5jIGpkcGh1ZmYuYyBcCisgICAgICAgIGpkcG9zdGN0LmMgamRzYW1wbGUuYyBqZHRyYW5zLmMgamVycm9yLmMgamZkY3RmbHQuYyBqZmRjdGZzdC5jIFwKKyAgICAgICAgamZkY3RpbnQuYyBqaWRjdGZsdC5jIGppZGN0ZnN0LmMgamlkY3RpbnQuYyBqaWRjdHJlZC5jIGpxdWFudDEuYyBcCisgICAgICAgIGpxdWFudDIuYyBqdXRpbHMuYyBqbWVtbWdyLmMKKyMgbWVtbWdyIGJhY2sgZW5kczogY29tcGlsZSBvbmx5IG9uZSBvZiB0aGVzZSBpbnRvIGEgd29ya2luZyBsaWJyYXJ5CitTWVNERVBTT1VSQ0VTPSBqbWVtYW5zaS5jIGptZW1uYW1lLmMgam1lbW5vYnMuYyBqbWVtZG9zLmMgam1lbW1hYy5jCisjIHNvdXJjZSBmaWxlczogY2pwZWcvZGpwZWcvanBlZ3RyYW4gYXBwbGljYXRpb25zLCBhbHNvIHJkanBnY29tL3dyanBnY29tCitBUFBTT1VSQ0VTPSBjanBlZy5jIGRqcGVnLmMganBlZ3RyYW4uYyByZGpwZ2NvbS5jIHdyanBnY29tLmMgY2RqcGVnLmMgXAorICAgICAgICByZGNvbG1hcC5jIHJkc3dpdGNoLmMgdHJhbnN1cHAuYyByZHBwbS5jIHdycHBtLmMgcmRnaWYuYyB3cmdpZi5jIFwKKyAgICAgICAgcmR0YXJnYS5jIHdydGFyZ2EuYyByZGJtcC5jIHdyYm1wLmMgcmRybGUuYyB3cnJsZS5jCitTT1VSQ0VTPSAkKExJQlNPVVJDRVMpICQoU1lTREVQU09VUkNFUykgJChBUFBTT1VSQ0VTKQorIyBmaWxlcyBpbmNsdWRlZCBieSBzb3VyY2UgZmlsZXMKK0lOQ0xVREVTPSBqY2h1ZmYuaCBqZGh1ZmYuaCBqZGN0LmggamVycm9yLmggamluY2x1ZGUuaCBqbWVtc3lzLmggam1vcmVjZmcuaCBcCisgICAgICAgIGpwZWdpbnQuaCBqcGVnbGliLmgganZlcnNpb24uaCBjZGpwZWcuaCBjZGVycm9yLmggdHJhbnN1cHAuaAorIyBkb2N1bWVudGF0aW9uLCB0ZXN0LCBhbmQgc3VwcG9ydCBmaWxlcworRE9DUz0gUkVBRE1FIGluc3RhbGwuZG9jIHVzYWdlLmRvYyBjanBlZy4xIGRqcGVnLjEganBlZ3RyYW4uMSByZGpwZ2NvbS4xIFwKKyAgICAgICAgd3JqcGdjb20uMSB3aXphcmQuZG9jIGV4YW1wbGUuYyBsaWJqcGVnLmRvYyBzdHJ1Y3R1cmUuZG9jIFwKKyAgICAgICAgY29kZXJ1bGVzLmRvYyBmaWxlbGlzdC5kb2MgY2hhbmdlLmxvZworTUtGSUxFUz0gY29uZmlndXJlIG1ha2VmaWxlLmNmZyBtYWtlZmlsZS5hbnNpIG1ha2VmaWxlLnVuaXggbWFrZWZpbGUuYmNjIFwKKyAgICAgICAgbWFrZWZpbGUubWM2IG1ha2VmaWxlLmRqIG1ha2VmaWxlLndhdCBtYWtlZmlsZS52YyBtYWtlbGliLmRzIFwKKyAgICAgICAgbWFrZWFwcHMuZHMgbWFrZXByb2oubWFjIG1ha2NqcGVnLnN0IG1ha2RqcGVnLnN0IG1ha2xqcGVnLnN0IFwKKyAgICAgICAgbWFrdGpwZWcuc3QgbWFrZWZpbGUubWFueCBtYWtlZmlsZS5zYXMgbWFrZWZpbGUubW1zIG1ha2VmaWxlLnZtcyBcCisgICAgICAgIG1ha3Ztcy5vcHQKK0NPTkZJR0ZJTEVTPSBqY29uZmlnLmNmZyBqY29uZmlnLmJjYyBqY29uZmlnLm1jNiBqY29uZmlnLmRqIGpjb25maWcud2F0IFwKKyAgICAgICAgamNvbmZpZy52YyBqY29uZmlnLm1hYyBqY29uZmlnLnN0IGpjb25maWcubWFueCBqY29uZmlnLnNhcyBcCisgICAgICAgIGpjb25maWcudm1zCitDT05GSUdVUkVGSUxFUz0gY29uZmlnLmd1ZXNzIGNvbmZpZy5zdWIgaW5zdGFsbC1zaCBsdGNvbmZpZyBsdG1haW4uc2gKK09USEVSRklMRVM9IGpjb25maWcuZG9jIGNrY29uZmlnLmMgYW5zaTJrbnIuYyBhbnNpMmtuci4xIGptZW1kb3NhLmFzbQorVEVTVEZJTEVTPSB0ZXN0b3JpZy5qcGcgdGVzdGltZy5wcG0gdGVzdGltZy5ibXAgdGVzdGltZy5qcGcgdGVzdHByb2cuanBnIFwKKyAgICAgICAgdGVzdGltZ3AuanBnCitESVNURklMRVM9ICQoRE9DUykgJChNS0ZJTEVTKSAkKENPTkZJR0ZJTEVTKSAkKFNPVVJDRVMpICQoSU5DTFVERVMpIFwKKyAgICAgICAgJChDT05GSUdVUkVGSUxFUykgJChPVEhFUkZJTEVTKSAkKFRFU1RGSUxFUykKKyMgbGlicmFyeSBvYmplY3QgZmlsZXMgY29tbW9uIHRvIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uCitDT01PQkpFQ1RTPSBqY29tYXBpLm8ganV0aWxzLm8gamVycm9yLm8gam1lbW1nci5vICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm8gamNhcGlzdGQubyBqY3RyYW5zLm8gamNwYXJhbS5vIGpkYXRhZHN0Lm8gamNpbml0Lm8gXAorICAgICAgICBqY21hc3Rlci5vIGpjbWFya2VyLm8gamNtYWluY3QubyBqY3ByZXBjdC5vIGpjY29lZmN0Lm8gamNjb2xvci5vIFwKKyAgICAgICAgamNzYW1wbGUubyBqY2h1ZmYubyBqY3BodWZmLm8gamNkY3RtZ3IubyBqZmRjdGZzdC5vIGpmZGN0Zmx0Lm8gXAorICAgICAgICBqZmRjdGludC5vCisjIGRlY29tcHJlc3Npb24gbGlicmFyeSBvYmplY3QgZmlsZXMKK0RMSUJPQkpFQ1RTPSBqZGFwaW1pbi5vIGpkYXBpc3RkLm8gamR0cmFucy5vIGpkYXRhc3JjLm8gamRtYXN0ZXIubyBcCisgICAgICAgIGpkaW5wdXQubyBqZG1hcmtlci5vIGpkaHVmZi5vIGpkcGh1ZmYubyBqZG1haW5jdC5vIGpkY29lZmN0Lm8gXAorICAgICAgICBqZHBvc3RjdC5vIGpkZGN0bWdyLm8gamlkY3Rmc3QubyBqaWRjdGZsdC5vIGppZGN0aW50Lm8gamlkY3RyZWQubyBcCisgICAgICAgIGpkc2FtcGxlLm8gamRjb2xvci5vIGpxdWFudDEubyBqcXVhbnQyLm8gamRtZXJnZS5vCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmEKK0xJQk9CSkVDVFM9ICQoQ0xJQk9CSkVDVFMpICQoRExJQk9CSkVDVFMpICQoQ09NT0JKRUNUUykKKyMgb2JqZWN0IGZpbGVzIGZvciBzYW1wbGUgYXBwbGljYXRpb25zIChleGNsdWRpbmcgbGlicmFyeSBmaWxlcykKK0NPQkpFQ1RTPSBjanBlZy5vIHJkcHBtLm8gcmRnaWYubyByZHRhcmdhLm8gcmRybGUubyByZGJtcC5vIHJkc3dpdGNoLm8gXAorICAgICAgICBjZGpwZWcubworRE9CSkVDVFM9IGRqcGVnLm8gd3JwcG0ubyB3cmdpZi5vIHdydGFyZ2EubyB3cnJsZS5vIHdyYm1wLm8gcmRjb2xtYXAubyBcCisgICAgICAgIGNkanBlZy5vCitUUk9CSkVDVFM9IGpwZWd0cmFuLm8gcmRzd2l0Y2gubyBjZGpwZWcubyB0cmFuc3VwcC5vCisKKworYWxsOiBhbnNpMmtuciBsaWJqcGVnLmEgY2pwZWcgZGpwZWcganBlZ3RyYW4gcmRqcGdjb20gd3JqcGdjb20KKworIyBUaGlzIHJ1bGUgY2F1c2VzIGFuc2kya25yIHRvIGJlIGludm9rZWQuCisuYy5vOgorCS4vYW5zaTJrbnIgJCouYyBUJCouYworCSQoQ0MpICQoQ0ZMQUdTKSAtYyBUJCouYworCSQoUk0pIFQkKi5jICQqLm8KKwkkKE1WKSBUJCoubyAkKi5vCisKK2Fuc2kya25yOiBhbnNpMmtuci5jCisJJChDQykgJChDRkxBR1MpICQoQU5TSTJLTlJGTEFHUykgLW8gYW5zaTJrbnIgYW5zaTJrbnIuYworCitsaWJqcGVnLmE6IGFuc2kya25yICQoTElCT0JKRUNUUykKKwkkKFJNKSBsaWJqcGVnLmEKKwkkKEFSKSBsaWJqcGVnLmEgICQoTElCT0JKRUNUUykKKwkkKEFSMikgbGlianBlZy5hCisKK2NqcGVnOiBhbnNpMmtuciAkKENPQkpFQ1RTKSBsaWJqcGVnLmEKKwkkKExOKSAkKExERkxBR1MpIC1vIGNqcGVnICQoQ09CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworZGpwZWc6IGFuc2kya25yICQoRE9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8gZGpwZWcgJChET0JKRUNUUykgbGlianBlZy5hICQoTERMSUJTKQorCitqcGVndHJhbjogYW5zaTJrbnIgJChUUk9CSkVDVFMpIGxpYmpwZWcuYQorCSQoTE4pICQoTERGTEFHUykgLW8ganBlZ3RyYW4gJChUUk9CSkVDVFMpIGxpYmpwZWcuYSAkKExETElCUykKKworcmRqcGdjb206IHJkanBnY29tLm8KKwkkKExOKSAkKExERkxBR1MpIC1vIHJkanBnY29tIHJkanBnY29tLm8gJChMRExJQlMpCisKK3dyanBnY29tOiB3cmpwZ2NvbS5vCisJJChMTikgJChMREZMQUdTKSAtbyB3cmpwZ2NvbSB3cmpwZ2NvbS5vICQoTERMSUJTKQorCitqY29uZmlnLmg6IGpjb25maWcuZG9jCisJZWNobyBZb3UgbXVzdCBwcmVwYXJlIGEgc3lzdGVtLWRlcGVuZGVudCBqY29uZmlnLmggZmlsZS4KKwllY2hvIFBsZWFzZSByZWFkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0aW9ucyBpbiBpbnN0YWxsLmRvYy4KKwlleGl0IDEKKworY2xlYW46CisJJChSTSkgKi5vIGNqcGVnIGRqcGVnIGpwZWd0cmFuIGxpYmpwZWcuYSByZGpwZ2NvbSB3cmpwZ2NvbQorCSQoUk0pIGFuc2kya25yIGNvcmUgdGVzdG91dCoKKwordGVzdDogY2pwZWcgZGpwZWcganBlZ3RyYW4KKwkkKFJNKSB0ZXN0b3V0KgorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSAgdGVzdG9yaWcuanBnCisJLi9kanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwkuL2NqcGVnIC1kY3QgaW50IC1vdXRmaWxlIHRlc3RvdXQuanBnICB0ZXN0aW1nLnBwbQorCS4vZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0cC5wcG0gdGVzdHByb2cuanBnCisJLi9janBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwkuL2pwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwljbXAgdGVzdGltZy5ibXAgdGVzdG91dC5ibXAKKwljbXAgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKwljbXAgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJY21wIHRlc3RpbWdwLmpwZyB0ZXN0b3V0cC5qcGcKKwljbXAgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworCisKK2pjYXBpbWluLm86IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3QubzogamNjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjY29sb3IubzogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3IubzogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYubzogamNodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY2luaXQubzogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIubzogamNtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjbWFzdGVyLm86IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm86IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ubzogamNwYXJhbS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwaHVmZi5vOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUubzogamNzYW1wbGUuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjdHJhbnMubzogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ubzogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm86IGpkYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGF0YWRzdC5vOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vOiBqZGNvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRjb2xvci5vOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vOiBqZGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkaW5wdXQubzogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3QubzogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm86IGpkbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZG1hc3Rlci5vOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm86IGpkcGh1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRodWZmLmgKK2pkcG9zdGN0Lm86IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vOiBqZHRyYW5zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZXJyb3IubzogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQubzogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vOiBqZmRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0aW50Lm86IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQubzogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vOiBqaWRjdGZzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0aW50Lm86IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQubzogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm86IGpxdWFudDEuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pxdWFudDIubzoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm86IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vOiBqbWVtbWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWFuc2kubzogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm86IGptZW1ub2JzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbWRvcy5vOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcubzogY2pwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAorZGpwZWcubzogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ubzoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vOiByZGpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCit3cmpwZ2NvbS5vOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcubzogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vOiByZGNvbG1hcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRzd2l0Y2gubzogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm86IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm86IHJkcHBtLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnBwbS5vOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYubzogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm86IHdyZ2lmLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHRhcmdhLm86IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eubzogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAubzogcmRibXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyYm1wLm86IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUubzogd3JybGUuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS52YyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlZmlsZS52YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNmMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLnZjCkBAIC0wLDAgKzEsMjExIEBACisjIE1ha2VmaWxlIGZvciBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUKKworIyBUaGlzIG1ha2VmaWxlIGlzIGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBvbiBXaW5kb3dzIE5UIChhbmQgOTU/KS4KKyMgSXQgYnVpbGRzIHRoZSBJSkcgbGlicmFyeSBhcyBhIHN0YXRpY2FsbHkgbGlua2FibGUgbGlicmFyeSAoLkxJQiksCisjIGFuZCBidWlsZHMgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgYXMgY29uc29sZS1tb2RlIGFwcHMuCisjIFRoYW5rcyB0byBYaW5nb25nIENoYW5nLCBSYXltb25kIEV2ZXJseSBhbmQgb3RoZXJzLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJubWFrZSIgISEKKyMgVG8gYnVpbGQgYW4gb3B0aW1pemVkIGxpYnJhcnkgd2l0aG91dCBkZWJ1ZyBpbmZvLCBzYXkgIm5tYWtlIG5vZGVidWc9MSIuCisKKyMgUHVsbCBpbiBzdGFuZGFyZCB2YXJpYWJsZSBkZWZpbml0aW9ucworIWluY2x1ZGUgPHdpbjMyLm1haz4KKworIyBZb3UgbWF5IHdhbnQgdG8gYWRqdXN0IHRoZXNlIGNvbXBpbGVyIG9wdGlvbnM6CitDRkxBR1M9ICQoY2ZsYWdzKSAkKGNkZWJ1ZykgJChjdmFycykgLUkuCisjIEdlbmVyYWxseSwgd2UgcmVjb21tZW5kIGRlZmluaW5nIGFueSBjb25maWd1cmF0aW9uIHN5bWJvbHMgaW4gamNvbmZpZy5oLAorIyBOT1QgdmlhIC1EIHN3aXRjaGVzIGhlcmUuCisKKyMgTGluay10aW1lIG9wdGlvbnM6CitMREZMQUdTPSAkKGxkZWJ1ZykgJChjb25sZmxhZ3MpCisKKyMgVG8gbGluayBhbnkgc3BlY2lhbCBsaWJyYXJpZXMsIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbW1hbmRzIGhlcmUuCitMRExJQlM9ICQoY29ubGlicykKKworIyBQdXQgaGVyZSB0aGUgb2JqZWN0IGZpbGUgbmFtZSBmb3IgdGhlIGNvcnJlY3Qgc3lzdGVtLWRlcGVuZGVudCBtZW1vcnkKKyMgbWFuYWdlciBmaWxlLiAgRm9yIE5UIHdlIHN1Z2dlc3Qgam1lbW5vYnMub2JqLCB3aGljaCBleHBlY3RzIHRoZSBPUyB0bworIyBwcm92aWRlIGFkZXF1YXRlIHZpcnR1YWwgbWVtb3J5LgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBtaXNjZWxsYW5lb3VzIE9TLWRlcGVuZGVudCBzdHVmZgorIyBmaWxlIGRlbGV0aW9uIGNvbW1hbmQKK1JNPSBkZWwKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jIFwKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyBcCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyBcCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jIFwKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgXAorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyBcCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgXAorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jIFwKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyBcCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggXAorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSBcCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyBcCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyBcCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyBcCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCBcCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgXAorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCBcCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgXAorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyBcCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSBcCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqIFwKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogXAorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogXAorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqIFwKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqIFwKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiBcCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiBcCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogXAorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogXAorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisKKyMgVGVtcGxhdGUgY29tbWFuZCBmb3IgY29tcGlsaW5nIC5jIHRvIC5vYmoKKy5jLm9iajoKKwkkKGNjKSAkKENGTEFHUykgJCouYworCisKK2FsbDogbGlianBlZy5saWIgY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgcmRqcGdjb20uZXhlIHdyanBnY29tLmV4ZQorCitsaWJqcGVnLmxpYjogJChMSUJPQkpFQ1RTKQorCSQoUk0pIGxpYmpwZWcubGliCisJbGliIC1vdXQ6bGlianBlZy5saWIgICQoTElCT0JKRUNUUykKKworY2pwZWcuZXhlOiAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQobGluaykgJChMREZMQUdTKSAtb3V0OmNqcGVnLmV4ZSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworZGpwZWcuZXhlOiAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQobGluaykgJChMREZMQUdTKSAtb3V0OmRqcGVnLmV4ZSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYiAkKExETElCUykKKworanBlZ3RyYW4uZXhlOiAkKFRST0JKRUNUUykgbGlianBlZy5saWIKKwkkKGxpbmspICQoTERGTEFHUykgLW91dDpqcGVndHJhbi5leGUgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliICQoTERMSUJTKQorCityZGpwZ2NvbS5leGU6IHJkanBnY29tLm9iagorCSQobGluaykgJChMREZMQUdTKSAtb3V0OnJkanBnY29tLmV4ZSByZGpwZ2NvbS5vYmogJChMRExJQlMpCisKK3dyanBnY29tLmV4ZTogd3JqcGdjb20ub2JqCisJJChsaW5rKSAkKExERkxBR1MpIC1vdXQ6d3JqcGdjb20uZXhlIHdyanBnY29tLm9iaiAkKExETElCUykKKworCitjbGVhbjoKKwkkKFJNKSAqLm9iaiAqLmV4ZSBsaWJqcGVnLmxpYgorCSQoUk0pIHRlc3RvdXQqCisKK3Rlc3Q6IGNqcGVnLmV4ZSBkanBlZy5leGUganBlZ3RyYW4uZXhlCisJJChSTSkgdGVzdG91dCoKKwkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dC5wcG0gIHRlc3RvcmlnLmpwZworCS5cZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCAgdGVzdG9yaWcuanBnCisJLlxjanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwkuXGRqcGVnIC1kY3QgaW50IC1wcG0gLW91dGZpbGUgdGVzdG91dHAucHBtIHRlc3Rwcm9nLmpwZworCS5cY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCisJLlxqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKworCitqY2FwaW1pbi5vYmo6IGpjYXBpbWluLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2FwaXN0ZC5vYmo6IGpjYXBpc3RkLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvZWZjdC5vYmo6IGpjY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY2NvbG9yLm9iajogamNjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNkY3RtZ3Iub2JqOiBqY2RjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pjaHVmZi5vYmo6IGpjaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNpbml0Lm9iajogamNpbml0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21haW5jdC5vYmo6IGpjbWFpbmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hcmtlci5vYmo6IGpjbWFya2VyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY21hc3Rlci5vYmo6IGpjbWFzdGVyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY29tYXBpLm9iajogamNvbWFwaS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNwYXJhbS5vYmo6IGpjcGFyYW0uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGh1ZmYub2JqOiBqY3BodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpjaHVmZi5oCitqY3ByZXBjdC5vYmo6IGpjcHJlcGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3NhbXBsZS5vYmo6IGpjc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3RyYW5zLm9iajogamN0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGltaW4ub2JqOiBqZGFwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhcGlzdGQub2JqOiBqZGFwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRhdGFkc3Qub2JqOiBqZGF0YWRzdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGF0YXNyYy5vYmo6IGpkYXRhc3JjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmgKK2pkY29lZmN0Lm9iajogamRjb2VmY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkY29sb3Iub2JqOiBqZGNvbG9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGRjdG1nci5vYmo6IGpkZGN0bWdyLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramRodWZmLm9iajogamRodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZGlucHV0Lm9iajogamRpbnB1dC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYWluY3Qub2JqOiBqZG1haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXJrZXIub2JqOiBqZG1hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtYXN0ZXIub2JqOiBqZG1hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRtZXJnZS5vYmo6IGpkbWVyZ2UuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkcGh1ZmYub2JqOiBqZHBodWZmLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkaHVmZi5oCitqZHBvc3RjdC5vYmo6IGpkcG9zdGN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHNhbXBsZS5vYmo6IGpkc2FtcGxlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHRyYW5zLm9iajogamR0cmFucy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramVycm9yLm9iajogamVycm9yLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganZlcnNpb24uaCBqZXJyb3IuaAoramZkY3RmbHQub2JqOiBqZmRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pmZGN0ZnN0Lm9iajogamZkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGludC5vYmo6IGpmZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RmbHQub2JqOiBqaWRjdGZsdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0ZnN0Lm9iajogamlkY3Rmc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGludC5vYmo6IGppZGN0aW50LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RyZWQub2JqOiBqaWRjdHJlZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pxdWFudDEub2JqOiBqcXVhbnQxLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqcXVhbnQyLm9iajoganF1YW50Mi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranV0aWxzLm9iajoganV0aWxzLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqbWVtbWdyLm9iajogam1lbW1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1hbnNpLm9iajogam1lbWFuc2kuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtbmFtZS5vYmo6IGptZW1uYW1lLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5vYnMub2JqOiBqbWVtbm9icy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1kb3Mub2JqOiBqbWVtZG9zLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW1hYy5vYmo6IGptZW1tYWMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitjanBlZy5vYmo6IGNqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2RqcGVnLm9iajogZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgganZlcnNpb24uaAoranBlZ3RyYW4ub2JqOiBqcGVndHJhbi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCB0cmFuc3VwcC5oIGp2ZXJzaW9uLmgKK3JkanBnY29tLm9iajogcmRqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAord3JqcGdjb20ub2JqOiB3cmpwZ2NvbS5jIGppbmNsdWRlLmggamNvbmZpZy5oCitjZGpwZWcub2JqOiBjZGpwZWcuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkY29sbWFwLm9iajogcmRjb2xtYXAuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3Jkc3dpdGNoLm9iajogcmRzd2l0Y2guYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3RyYW5zdXBwLm9iajogdHJhbnN1cHAuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggdHJhbnN1cHAuaAorcmRwcG0ub2JqOiByZHBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JwcG0ub2JqOiB3cnBwbS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRnaWYub2JqOiByZGdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JnaWYub2JqOiB3cmdpZi5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmR0YXJnYS5vYmo6IHJkdGFyZ2EuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dydGFyZ2Eub2JqOiB3cnRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGJtcC5vYmo6IHJkYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cmJtcC5vYmo6IHdyYm1wLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHJsZS5vYmo6IHJkcmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnJsZS5vYmo6IHdycmxlLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUudm1zIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLnZtcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDIzNThkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLnZtcwpAQCAtMCwwICsxLDE0MiBAQAorJCEgTWFrZWZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorJCEKKyQhIFRoaXMgaXMgYSBjb21tYW5kIHByb2NlZHVyZSBmb3IgRGlnaXRhbCBWTVMgc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIE1NUy4KKyQhIEl0IGJ1aWxkcyB0aGUgSlBFRyBzb2Z0d2FyZSBieSBicnV0ZSBmb3JjZSwgcmVjb21waWxpbmcgZXZlcnl0aGluZyB3aGV0aGVyCiskISBvciBub3QgaXQgaXMgbmVjZXNzYXJ5LiAgSXQgdGhlbiBydW5zIHRoZSBiYXNpYyBzZWxmLXRlc3QuCiskISBUaGFua3MgdG8gUmljayBEeXNvbiAoZHlzb25AaW93YXNwLnBoeXNpY3MudWlvd2EuZWR1KQorJCEgYW5kIFRpbSBCZWxsICh0YmVsbEBuZXRjb20uY29tKSBmb3IgdGhlaXIgaGVscC4KKyQhCiskISBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHJ1bm5pbmcgdGhpcyEhCiskIQorJCBJZiBGJE1vZGUgKCkgLmVxcy4gIklOVEVSQUNUSVZFIgorJCAgIFRoZW4KKyQgICAgICAgVkVSSUZZID0gRiRWZXJpZnkgKDApCiskICAgRWxzZQorJCAgICAgICBWRVJJRlkgPSBGJFZlcmlmeSAoMSkKKyQgRW5kSWYKKyQgT24gQ29udHJvbF9ZIFRoZW4gR29UbyBFbmQKKyQgT24gRXJyb3IgICAgIFRoZW4gR29UbyBFbmQKKyQKKyQgSWYgRiRHZXRTeWkgKCJIV19NT0RFTCIpIC5ndC4gMTAyMyAKKyQgICBUaGVuCiskICAgICAgIE9QVCA9ICIiCiskICAgRWxzZQorJCAgICAgICBPUFQgPSAiLFN5cyREaXNrOltdbWFrdm1zLm9wdC9PcHRpb24iCiskIEVuZElmCiskIAorJCBEb0NvbXBpbGUgOj0gQ0MgL05vRGVidWcgL09wdGltaXplIC9Ob0xpc3QKKyQhCiskIERvQ29tcGlsZSBqY2FwaW1pbi5jCiskIERvQ29tcGlsZSBqY2FwaXN0ZC5jCiskIERvQ29tcGlsZSBqY3RyYW5zLmMKKyQgRG9Db21waWxlIGpjcGFyYW0uYworJCBEb0NvbXBpbGUgamRhdGFkc3QuYworJCBEb0NvbXBpbGUgamNpbml0LmMKKyQgRG9Db21waWxlIGpjbWFzdGVyLmMKKyQgRG9Db21waWxlIGpjbWFya2VyLmMKKyQgRG9Db21waWxlIGpjbWFpbmN0LmMKKyQgRG9Db21waWxlIGpjcHJlcGN0LmMKKyQgRG9Db21waWxlIGpjY29lZmN0LmMKKyQgRG9Db21waWxlIGpjY29sb3IuYworJCBEb0NvbXBpbGUgamNzYW1wbGUuYworJCBEb0NvbXBpbGUgamNodWZmLmMKKyQgRG9Db21waWxlIGpjcGh1ZmYuYworJCBEb0NvbXBpbGUgamNkY3RtZ3IuYworJCBEb0NvbXBpbGUgamZkY3Rmc3QuYworJCBEb0NvbXBpbGUgamZkY3RmbHQuYworJCBEb0NvbXBpbGUgamZkY3RpbnQuYworJCBEb0NvbXBpbGUgamRhcGltaW4uYworJCBEb0NvbXBpbGUgamRhcGlzdGQuYworJCBEb0NvbXBpbGUgamR0cmFucy5jCiskIERvQ29tcGlsZSBqZGF0YXNyYy5jCiskIERvQ29tcGlsZSBqZG1hc3Rlci5jCiskIERvQ29tcGlsZSBqZGlucHV0LmMKKyQgRG9Db21waWxlIGpkbWFya2VyLmMKKyQgRG9Db21waWxlIGpkaHVmZi5jCiskIERvQ29tcGlsZSBqZHBodWZmLmMKKyQgRG9Db21waWxlIGpkbWFpbmN0LmMKKyQgRG9Db21waWxlIGpkY29lZmN0LmMKKyQgRG9Db21waWxlIGpkcG9zdGN0LmMKKyQgRG9Db21waWxlIGpkZGN0bWdyLmMKKyQgRG9Db21waWxlIGppZGN0ZnN0LmMKKyQgRG9Db21waWxlIGppZGN0Zmx0LmMKKyQgRG9Db21waWxlIGppZGN0aW50LmMKKyQgRG9Db21waWxlIGppZGN0cmVkLmMKKyQgRG9Db21waWxlIGpkc2FtcGxlLmMKKyQgRG9Db21waWxlIGpkY29sb3IuYworJCBEb0NvbXBpbGUganF1YW50MS5jCiskIERvQ29tcGlsZSBqcXVhbnQyLmMKKyQgRG9Db21waWxlIGpkbWVyZ2UuYworJCBEb0NvbXBpbGUgamNvbWFwaS5jCiskIERvQ29tcGlsZSBqdXRpbHMuYworJCBEb0NvbXBpbGUgamVycm9yLmMKKyQgRG9Db21waWxlIGptZW1tZ3IuYworJCBEb0NvbXBpbGUgam1lbW5vYnMuYworJCEKKyQgTGlicmFyeSAvQ3JlYXRlIGxpYmpwZWcub2xiICBqY2FwaW1pbi5vYmosamNhcGlzdGQub2JqLGpjdHJhbnMub2JqLCAtCisgICAgICAgICAgamNwYXJhbS5vYmosamRhdGFkc3Qub2JqLGpjaW5pdC5vYmosamNtYXN0ZXIub2JqLGpjbWFya2VyLm9iaiwgLQorICAgICAgICAgIGpjbWFpbmN0Lm9iaixqY3ByZXBjdC5vYmosamNjb2VmY3Qub2JqLGpjY29sb3Iub2JqLGpjc2FtcGxlLm9iaiwgLQorICAgICAgICAgIGpjaHVmZi5vYmosamNwaHVmZi5vYmosamNkY3RtZ3Iub2JqLGpmZGN0ZnN0Lm9iaixqZmRjdGZsdC5vYmosIC0KKyAgICAgICAgICBqZmRjdGludC5vYmosamRhcGltaW4ub2JqLGpkYXBpc3RkLm9iaixqZHRyYW5zLm9iaixqZGF0YXNyYy5vYmosIC0KKyAgICAgICAgICBqZG1hc3Rlci5vYmosamRpbnB1dC5vYmosamRtYXJrZXIub2JqLGpkaHVmZi5vYmosamRwaHVmZi5vYmosIC0KKyAgICAgICAgICBqZG1haW5jdC5vYmosamRjb2VmY3Qub2JqLGpkcG9zdGN0Lm9iaixqZGRjdG1nci5vYmosamlkY3Rmc3Qub2JqLCAtCisgICAgICAgICAgamlkY3RmbHQub2JqLGppZGN0aW50Lm9iaixqaWRjdHJlZC5vYmosamRzYW1wbGUub2JqLGpkY29sb3Iub2JqLCAtCisgICAgICAgICAganF1YW50MS5vYmosanF1YW50Mi5vYmosamRtZXJnZS5vYmosamNvbWFwaS5vYmosanV0aWxzLm9iaiwgLQorICAgICAgICAgIGplcnJvci5vYmosam1lbW1nci5vYmosam1lbW5vYnMub2JqCiskIQorJCBEb0NvbXBpbGUgY2pwZWcuYworJCBEb0NvbXBpbGUgcmRwcG0uYworJCBEb0NvbXBpbGUgcmRnaWYuYworJCBEb0NvbXBpbGUgcmR0YXJnYS5jCiskIERvQ29tcGlsZSByZHJsZS5jCiskIERvQ29tcGlsZSByZGJtcC5jCiskIERvQ29tcGlsZSByZHN3aXRjaC5jCiskIERvQ29tcGlsZSBjZGpwZWcuYworJCEKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSBjanBlZy5leGUgIGNqcGVnLm9iaixyZHBwbS5vYmoscmRnaWYub2JqLCAtCisgICAgICAgICAgcmR0YXJnYS5vYmoscmRybGUub2JqLHJkYm1wLm9iaixyZHN3aXRjaC5vYmosY2RqcGVnLm9iaixsaWJqcGVnLm9sYi9MaWJyYXJ5J09QVCcKKyQhCiskIERvQ29tcGlsZSBkanBlZy5jCiskIERvQ29tcGlsZSB3cnBwbS5jCiskIERvQ29tcGlsZSB3cmdpZi5jCiskIERvQ29tcGlsZSB3cnRhcmdhLmMKKyQgRG9Db21waWxlIHdycmxlLmMKKyQgRG9Db21waWxlIHdyYm1wLmMKKyQgRG9Db21waWxlIHJkY29sbWFwLmMKKyQgRG9Db21waWxlIGNkanBlZy5jCiskIQorJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGRqcGVnLmV4ZSAgZGpwZWcub2JqLHdycHBtLm9iaix3cmdpZi5vYmosIC0KKyAgICAgICAgICB3cnRhcmdhLm9iaix3cnJsZS5vYmosd3JibXAub2JqLHJkY29sbWFwLm9iaixjZGpwZWcub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJworJCEKKyQgRG9Db21waWxlIGpwZWd0cmFuLmMKKyQgRG9Db21waWxlIHJkc3dpdGNoLmMKKyQgRG9Db21waWxlIGNkanBlZy5jCiskIERvQ29tcGlsZSB0cmFuc3VwcC5jCiskIQorJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IGpwZWd0cmFuLmV4ZSAganBlZ3RyYW4ub2JqLHJkc3dpdGNoLm9iaiwgLQorICAgICAgICAgIGNkanBlZy5vYmosdHJhbnN1cHAub2JqLGxpYmpwZWcub2xiL0xpYnJhcnknT1BUJworJCEKKyQgRG9Db21waWxlIHJkanBnY29tLmMKKyQgTGluayAvTm9NYXAgL0V4ZWN1dGFibGUgPSByZGpwZ2NvbS5leGUgIHJkanBnY29tLm9iaidPUFQnCiskIQorJCBEb0NvbXBpbGUgd3JqcGdjb20uYworJCBMaW5rIC9Ob01hcCAvRXhlY3V0YWJsZSA9IHdyanBnY29tLmV4ZSAgd3JqcGdjb20ub2JqJ09QVCcKKyQhCiskISBSdW4gdGhlIHNlbGYtdGVzdAorJCEKKyQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLXBwbSAtb3V0ZmlsZSB0ZXN0b3V0LnBwbSB0ZXN0b3JpZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdZGpwZWcgLWRjdCBpbnQgLWJtcCAtY29sb3JzIDI1NiAtb3V0ZmlsZSB0ZXN0b3V0LmJtcCB0ZXN0b3JpZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgICAgICAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyB0ZXN0aW1nLnBwbQorJCBtY3Igc3lzJGRpc2s6W11kanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKyQgbWNyIHN5cyRkaXNrOltdY2pwZWcgLWRjdCBpbnQgLXByb2dyZXNzaXZlIC1vcHQgLW91dGZpbGUgdGVzdG91dHAuanBnIHRlc3RpbWcucHBtCiskIG1jciBzeXMkZGlzazpbXWpwZWd0cmFuIC1vdXRmaWxlIHRlc3RvdXR0LmpwZyB0ZXN0cHJvZy5qcGcKKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0LnBwbQorJCBCYWNrdXAgL0NvbXBhcmUvTG9nIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdGltZy5qcGcgdGVzdG91dC5qcGcKKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1nLnBwbSB0ZXN0b3V0cC5wcG0KKyQgQmFja3VwIC9Db21wYXJlL0xvZyB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnCiskIEJhY2t1cCAvQ29tcGFyZS9Mb2cgdGVzdG9yaWcuanBnIHRlc3RvdXR0LmpwZworJCEKKyRFbmQ6CiskICAgSWYgVmVyaWZ5IFRoZW4gU2V0IFZlcmlmeQorJCBFeGl0CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWZpbGUud2F0IGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLndhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTUzZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VmaWxlLndhdApAQCAtMCwwICsxLDIzMyBAQAorIyBNYWtlZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCisKKyMgVGhpcyBtYWtlZmlsZSBpcyBzdWl0YWJsZSBmb3IgV2F0Y29tIEMvQysrIDEwLjAgb24gTVMtRE9TICh1c2luZworIyBkb3M0ZyBleHRlbmRlciksIE9TLzIsIGFuZCBXaW5kb3dzIE5UIGNvbnNvbGUgbW9kZS4KKyMgVGhhbmtzIHRvIEphbm9zIEhhaWRlLCBqaGFpZGVAYnRydnRlY2guY29tLgorCisjIFJlYWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBiZWZvcmUgc2F5aW5nICJ3bWFrZSIgISEKKworIyBVbmNvbW1lbnQgbGluZSBmb3IgZGVzaXJlZCBzeXN0ZW0KK1NZU1RFTT1ET1MKKyNTWVNURU09T1MyCisjU1lTVEVNPU5UCisKKyMgVGhlIG5hbWUgb2YgeW91ciBDIGNvbXBpbGVyOgorQ0M9IHdjbDM4NgorCisjIFlvdSBtYXkgbmVlZCB0byBhZGp1c3QgdGhlc2UgY2Mgb3B0aW9uczoKK0NGTEFHUz0gLTRyIC1vcnQgLXd4IC16cSAtYnQ9JChTWVNURU0pCisjIENhdXRpb246IGF2b2lkIC1vbCBvciAtb3g7IHRoZXNlIGdlbmVyYXRlIGJhZCBjb2RlIHdpdGggMTAuMCBvciAxMC4wYS4KKyMgR2VuZXJhbGx5LCB3ZSByZWNvbW1lbmQgZGVmaW5pbmcgYW55IGNvbmZpZ3VyYXRpb24gc3ltYm9scyBpbiBqY29uZmlnLmgsCisjIE5PVCB2aWEgLUQgc3dpdGNoZXMgaGVyZS4KKworIyBMaW5rLXRpbWUgY2Mgb3B0aW9uczoKKyFpZmVxIFNZU1RFTSBET1MKK0xERkxBR1M9IC16cSAtbD1kb3M0ZworIWVsc2UgaWZlcSBTWVNURU0gT1MyCitMREZMQUdTPSAtenEgLWw9b3MydjIKKyFlbHNlIGlmZXEgU1lTVEVNIE5UCitMREZMQUdTPSAtenEgLWw9bnQKKyFlbmRpZgorCisjIFB1dCBoZXJlIHRoZSBvYmplY3QgZmlsZSBuYW1lIGZvciB0aGUgY29ycmVjdCBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeQorIyBtYW5hZ2VyIGZpbGUuICBqbWVtbm9icyBzaG91bGQgd29yayBmaW5lIGZvciBkb3M0ZyBvciBPUy8yIGVudmlyb25tZW50LgorU1lTREVQTUVNPSBqbWVtbm9icy5vYmoKKworIyBFbmQgb2YgY29uZmlndXJhYmxlIG9wdGlvbnMuCisKKworIyBzb3VyY2UgZmlsZXM6IEpQRUcgbGlicmFyeSBwcm9wZXIKK0xJQlNPVVJDRVM9IGpjYXBpbWluLmMgamNhcGlzdGQuYyBqY2NvZWZjdC5jIGpjY29sb3IuYyBqY2RjdG1nci5jIGpjaHVmZi5jICYKKyAgICAgICAgamNpbml0LmMgamNtYWluY3QuYyBqY21hcmtlci5jIGpjbWFzdGVyLmMgamNvbWFwaS5jIGpjcGFyYW0uYyAmCisgICAgICAgIGpjcGh1ZmYuYyBqY3ByZXBjdC5jIGpjc2FtcGxlLmMgamN0cmFucy5jIGpkYXBpbWluLmMgamRhcGlzdGQuYyAmCisgICAgICAgIGpkYXRhZHN0LmMgamRhdGFzcmMuYyBqZGNvZWZjdC5jIGpkY29sb3IuYyBqZGRjdG1nci5jIGpkaHVmZi5jICYKKyAgICAgICAgamRpbnB1dC5jIGpkbWFpbmN0LmMgamRtYXJrZXIuYyBqZG1hc3Rlci5jIGpkbWVyZ2UuYyBqZHBodWZmLmMgJgorICAgICAgICBqZHBvc3RjdC5jIGpkc2FtcGxlLmMgamR0cmFucy5jIGplcnJvci5jIGpmZGN0Zmx0LmMgamZkY3Rmc3QuYyAmCisgICAgICAgIGpmZGN0aW50LmMgamlkY3RmbHQuYyBqaWRjdGZzdC5jIGppZGN0aW50LmMgamlkY3RyZWQuYyBqcXVhbnQxLmMgJgorICAgICAgICBqcXVhbnQyLmMganV0aWxzLmMgam1lbW1nci5jCisjIG1lbW1nciBiYWNrIGVuZHM6IGNvbXBpbGUgb25seSBvbmUgb2YgdGhlc2UgaW50byBhIHdvcmtpbmcgbGlicmFyeQorU1lTREVQU09VUkNFUz0gam1lbWFuc2kuYyBqbWVtbmFtZS5jIGptZW1ub2JzLmMgam1lbWRvcy5jIGptZW1tYWMuYworIyBzb3VyY2UgZmlsZXM6IGNqcGVnL2RqcGVnL2pwZWd0cmFuIGFwcGxpY2F0aW9ucywgYWxzbyByZGpwZ2NvbS93cmpwZ2NvbQorQVBQU09VUkNFUz0gY2pwZWcuYyBkanBlZy5jIGpwZWd0cmFuLmMgcmRqcGdjb20uYyB3cmpwZ2NvbS5jIGNkanBlZy5jICYKKyAgICAgICAgcmRjb2xtYXAuYyByZHN3aXRjaC5jIHRyYW5zdXBwLmMgcmRwcG0uYyB3cnBwbS5jIHJkZ2lmLmMgd3JnaWYuYyAmCisgICAgICAgIHJkdGFyZ2EuYyB3cnRhcmdhLmMgcmRibXAuYyB3cmJtcC5jIHJkcmxlLmMgd3JybGUuYworU09VUkNFUz0gJChMSUJTT1VSQ0VTKSAkKFNZU0RFUFNPVVJDRVMpICQoQVBQU09VUkNFUykKKyMgZmlsZXMgaW5jbHVkZWQgYnkgc291cmNlIGZpbGVzCitJTkNMVURFUz0gamNodWZmLmggamRodWZmLmggamRjdC5oIGplcnJvci5oIGppbmNsdWRlLmggam1lbXN5cy5oIGptb3JlY2ZnLmggJgorICAgICAgICBqcGVnaW50LmgganBlZ2xpYi5oIGp2ZXJzaW9uLmggY2RqcGVnLmggY2RlcnJvci5oIHRyYW5zdXBwLmgKKyMgZG9jdW1lbnRhdGlvbiwgdGVzdCwgYW5kIHN1cHBvcnQgZmlsZXMKK0RPQ1M9IFJFQURNRSBpbnN0YWxsLmRvYyB1c2FnZS5kb2MgY2pwZWcuMSBkanBlZy4xIGpwZWd0cmFuLjEgcmRqcGdjb20uMSAmCisgICAgICAgIHdyanBnY29tLjEgd2l6YXJkLmRvYyBleGFtcGxlLmMgbGlianBlZy5kb2Mgc3RydWN0dXJlLmRvYyAmCisgICAgICAgIGNvZGVydWxlcy5kb2MgZmlsZWxpc3QuZG9jIGNoYW5nZS5sb2cKK01LRklMRVM9IGNvbmZpZ3VyZSBtYWtlZmlsZS5jZmcgbWFrZWZpbGUuYW5zaSBtYWtlZmlsZS51bml4IG1ha2VmaWxlLmJjYyAmCisgICAgICAgIG1ha2VmaWxlLm1jNiBtYWtlZmlsZS5kaiBtYWtlZmlsZS53YXQgbWFrZWZpbGUudmMgbWFrZWxpYi5kcyAmCisgICAgICAgIG1ha2VhcHBzLmRzIG1ha2Vwcm9qLm1hYyBtYWtjanBlZy5zdCBtYWtkanBlZy5zdCBtYWtsanBlZy5zdCAmCisgICAgICAgIG1ha3RqcGVnLnN0IG1ha2VmaWxlLm1hbnggbWFrZWZpbGUuc2FzIG1ha2VmaWxlLm1tcyBtYWtlZmlsZS52bXMgJgorICAgICAgICBtYWt2bXMub3B0CitDT05GSUdGSUxFUz0gamNvbmZpZy5jZmcgamNvbmZpZy5iY2MgamNvbmZpZy5tYzYgamNvbmZpZy5kaiBqY29uZmlnLndhdCAmCisgICAgICAgIGpjb25maWcudmMgamNvbmZpZy5tYWMgamNvbmZpZy5zdCBqY29uZmlnLm1hbnggamNvbmZpZy5zYXMgJgorICAgICAgICBqY29uZmlnLnZtcworQ09ORklHVVJFRklMRVM9IGNvbmZpZy5ndWVzcyBjb25maWcuc3ViIGluc3RhbGwtc2ggbHRjb25maWcgbHRtYWluLnNoCitPVEhFUkZJTEVTPSBqY29uZmlnLmRvYyBja2NvbmZpZy5jIGFuc2kya25yLmMgYW5zaTJrbnIuMSBqbWVtZG9zYS5hc20KK1RFU1RGSUxFUz0gdGVzdG9yaWcuanBnIHRlc3RpbWcucHBtIHRlc3RpbWcuYm1wIHRlc3RpbWcuanBnIHRlc3Rwcm9nLmpwZyAmCisgICAgICAgIHRlc3RpbWdwLmpwZworRElTVEZJTEVTPSAkKERPQ1MpICQoTUtGSUxFUykgJChDT05GSUdGSUxFUykgJChTT1VSQ0VTKSAkKElOQ0xVREVTKSAmCisgICAgICAgICQoQ09ORklHVVJFRklMRVMpICQoT1RIRVJGSUxFUykgJChURVNURklMRVMpCisjIGxpYnJhcnkgb2JqZWN0IGZpbGVzIGNvbW1vbiB0byBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbgorQ09NT0JKRUNUUz0gamNvbWFwaS5vYmoganV0aWxzLm9iaiBqZXJyb3Iub2JqIGptZW1tZ3Iub2JqICQoU1lTREVQTUVNKQorIyBjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworQ0xJQk9CSkVDVFM9IGpjYXBpbWluLm9iaiBqY2FwaXN0ZC5vYmogamN0cmFucy5vYmogamNwYXJhbS5vYmogamRhdGFkc3Qub2JqICYKKyAgICAgICAgamNpbml0Lm9iaiBqY21hc3Rlci5vYmogamNtYXJrZXIub2JqIGpjbWFpbmN0Lm9iaiBqY3ByZXBjdC5vYmogJgorICAgICAgICBqY2NvZWZjdC5vYmogamNjb2xvci5vYmogamNzYW1wbGUub2JqIGpjaHVmZi5vYmogamNwaHVmZi5vYmogJgorICAgICAgICBqY2RjdG1nci5vYmogamZkY3Rmc3Qub2JqIGpmZGN0Zmx0Lm9iaiBqZmRjdGludC5vYmoKKyMgZGVjb21wcmVzc2lvbiBsaWJyYXJ5IG9iamVjdCBmaWxlcworRExJQk9CSkVDVFM9IGpkYXBpbWluLm9iaiBqZGFwaXN0ZC5vYmogamR0cmFucy5vYmogamRhdGFzcmMub2JqICYKKyAgICAgICAgamRtYXN0ZXIub2JqIGpkaW5wdXQub2JqIGpkbWFya2VyLm9iaiBqZGh1ZmYub2JqIGpkcGh1ZmYub2JqICYKKyAgICAgICAgamRtYWluY3Qub2JqIGpkY29lZmN0Lm9iaiBqZHBvc3RjdC5vYmogamRkY3RtZ3Iub2JqIGppZGN0ZnN0Lm9iaiAmCisgICAgICAgIGppZGN0Zmx0Lm9iaiBqaWRjdGludC5vYmogamlkY3RyZWQub2JqIGpkc2FtcGxlLm9iaiBqZGNvbG9yLm9iaiAmCisgICAgICAgIGpxdWFudDEub2JqIGpxdWFudDIub2JqIGpkbWVyZ2Uub2JqCisjIFRoZXNlIG9iamVjdGZpbGVzIGFyZSBpbmNsdWRlZCBpbiBsaWJqcGVnLmxpYgorTElCT0JKRUNUUz0gJChDTElCT0JKRUNUUykgJChETElCT0JKRUNUUykgJChDT01PQkpFQ1RTKQorIyBvYmplY3QgZmlsZXMgZm9yIHNhbXBsZSBhcHBsaWNhdGlvbnMgKGV4Y2x1ZGluZyBsaWJyYXJ5IGZpbGVzKQorQ09CSkVDVFM9IGNqcGVnLm9iaiByZHBwbS5vYmogcmRnaWYub2JqIHJkdGFyZ2Eub2JqIHJkcmxlLm9iaiByZGJtcC5vYmogJgorICAgICAgICByZHN3aXRjaC5vYmogY2RqcGVnLm9iagorRE9CSkVDVFM9IGRqcGVnLm9iaiB3cnBwbS5vYmogd3JnaWYub2JqIHdydGFyZ2Eub2JqIHdycmxlLm9iaiB3cmJtcC5vYmogJgorICAgICAgICByZGNvbG1hcC5vYmogY2RqcGVnLm9iagorVFJPQkpFQ1RTPSBqcGVndHJhbi5vYmogcmRzd2l0Y2gub2JqIGNkanBlZy5vYmogdHJhbnN1cHAub2JqCisKKworYWxsOiBsaWJqcGVnLmxpYiBjanBlZy5leGUgZGpwZWcuZXhlIGpwZWd0cmFuLmV4ZSByZGpwZ2NvbS5leGUgd3JqcGdjb20uZXhlCisKK2xpYmpwZWcubGliOiAkKExJQk9CSkVDVFMpCisJLSBkZWwgbGlianBlZy5saWIKKwkqIHdsaWIgLW4gbGlianBlZy5saWIgJChMSUJPQkpFQ1RTKQorCitjanBlZy5leGU6ICQoQ09CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAkKENPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitkanBlZy5leGU6ICQoRE9CSkVDVFMpIGxpYmpwZWcubGliCisJJChDQykgJChMREZMQUdTKSAkKERPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCitqcGVndHJhbi5leGU6ICQoVFJPQkpFQ1RTKSBsaWJqcGVnLmxpYgorCSQoQ0MpICQoTERGTEFHUykgJChUUk9CSkVDVFMpIGxpYmpwZWcubGliCisKK3JkanBnY29tLmV4ZTogcmRqcGdjb20uYworCSQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIHJkanBnY29tLmMKKword3JqcGdjb20uZXhlOiB3cmpwZ2NvbS5jCisJJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgd3JqcGdjb20uYworCisuYy5vYmo6CisJJChDQykgJChDRkxBR1MpIC1jICQ8CisKK2pjb25maWcuaDogamNvbmZpZy5kb2MKKwllY2hvIFlvdSBtdXN0IHByZXBhcmUgYSBzeXN0ZW0tZGVwZW5kZW50IGpjb25maWcuaCBmaWxlLgorCWVjaG8gUGxlYXNlIHJlYWQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rpb25zIGluIGluc3RhbGwuZG9jLgorCWV4aXQgMQorCitjbGVhbjogLlNZTUJPTElDCisJLSBkZWwgKi5vYmoKKwktIGRlbCBsaWJqcGVnLmxpYgorCS0gZGVsIGNqcGVnLmV4ZQorCS0gZGVsIGRqcGVnLmV4ZQorCS0gZGVsIGpwZWd0cmFuLmV4ZQorCS0gZGVsIHJkanBnY29tLmV4ZQorCS0gZGVsIHdyanBnY29tLmV4ZQorCS0gZGVsIHRlc3RvdXQqLioKKwordGVzdDogY2pwZWcuZXhlIGRqcGVnLmV4ZSBqcGVndHJhbi5leGUgIC5TWU1CT0xJQworCS0gZGVsIHRlc3RvdXQqLioKKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXQucHBtICB0ZXN0b3JpZy5qcGcKKwlkanBlZyAtZGN0IGludCAtYm1wIC1jb2xvcnMgMjU2IC1vdXRmaWxlIHRlc3RvdXQuYm1wICB0ZXN0b3JpZy5qcGcKKwljanBlZyAtZGN0IGludCAtb3V0ZmlsZSB0ZXN0b3V0LmpwZyAgdGVzdGltZy5wcG0KKwlkanBlZyAtZGN0IGludCAtcHBtIC1vdXRmaWxlIHRlc3RvdXRwLnBwbSB0ZXN0cHJvZy5qcGcKKwljanBlZyAtZGN0IGludCAtcHJvZ3Jlc3NpdmUgLW9wdCAtb3V0ZmlsZSB0ZXN0b3V0cC5qcGcgdGVzdGltZy5wcG0KKwlqcGVndHJhbiAtb3V0ZmlsZSB0ZXN0b3V0dC5qcGcgdGVzdHByb2cuanBnCishaWZlcSBTWVNURU0gRE9TCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dC5wcG0KKwlmYyAvYiB0ZXN0aW1nLmJtcCB0ZXN0b3V0LmJtcAorCWZjIC9iIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnCisJZmMgL2IgdGVzdGltZy5wcG0gdGVzdG91dHAucHBtCisJZmMgL2IgdGVzdGltZ3AuanBnIHRlc3RvdXRwLmpwZworCWZjIC9iIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcKKyFlbHNlCisJZWNobyBuID4gbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXQucHBtIDwgbi50bXAKKwljb21wIHRlc3RpbWcuYm1wIHRlc3RvdXQuYm1wIDwgbi50bXAKKwljb21wIHRlc3RpbWcuanBnIHRlc3RvdXQuanBnIDwgbi50bXAKKwljb21wIHRlc3RpbWcucHBtIHRlc3RvdXRwLnBwbSA8IG4udG1wCisJY29tcCB0ZXN0aW1ncC5qcGcgdGVzdG91dHAuanBnIDwgbi50bXAKKwljb21wIHRlc3RvcmlnLmpwZyB0ZXN0b3V0dC5qcGcgPCBuLnRtcAorCWRlbCBuLnRtcAorIWVuZGlmCisKKworamNhcGltaW4ub2JqOiBqY2FwaW1pbi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNhcGlzdGQub2JqOiBqY2FwaXN0ZC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2VmY3Qub2JqOiBqY2NvZWZjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNjb2xvci5vYmo6IGpjY29sb3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjZGN0bWdyLm9iajogamNkY3RtZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqY2h1ZmYub2JqOiBqY2h1ZmYuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamNodWZmLmgKK2pjaW5pdC5vYmo6IGpjaW5pdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYWluY3Qub2JqOiBqY21haW5jdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXJrZXIub2JqOiBqY21hcmtlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNtYXN0ZXIub2JqOiBqY21hc3Rlci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNvbWFwaS5vYmo6IGpjb21hcGkuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pjcGFyYW0ub2JqOiBqY3BhcmFtLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqY3BodWZmLm9iajogamNwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqY2h1ZmYuaAoramNwcmVwY3Qub2JqOiBqY3ByZXBjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramNzYW1wbGUub2JqOiBqY3NhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramN0cmFucy5vYmo6IGpjdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpbWluLm9iajogamRhcGltaW4uYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXBpc3RkLm9iajogamRhcGlzdGQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkYXRhZHN0Lm9iajogamRhdGFkc3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaAoramRhdGFzcmMub2JqOiBqZGF0YXNyYy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oCitqZGNvZWZjdC5vYmo6IGpkY29lZmN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZGNvbG9yLm9iajogamRjb2xvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRkY3RtZ3Iub2JqOiBqZGRjdG1nci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2pkaHVmZi5vYmo6IGpkaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRpbnB1dC5vYmo6IGpkaW5wdXQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFpbmN0Lm9iajogamRtYWluY3QuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFya2VyLm9iajogamRtYXJrZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWFzdGVyLm9iajogamRtYXN0ZXIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2pkbWVyZ2Uub2JqOiBqZG1lcmdlLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oCitqZHBodWZmLm9iajogamRwaHVmZi5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGh1ZmYuaAoramRwb3N0Y3Qub2JqOiBqZHBvc3RjdC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramRzYW1wbGUub2JqOiBqZHNhbXBsZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoramR0cmFucy5vYmo6IGpkdHJhbnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2plcnJvci5vYmo6IGplcnJvci5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGp2ZXJzaW9uLmggamVycm9yLmgKK2pmZGN0Zmx0Lm9iajogamZkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqZmRjdGZzdC5vYmo6IGpmZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramZkY3RpbnQub2JqOiBqZmRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0Zmx0Lm9iajogamlkY3RmbHQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqaWRjdGZzdC5vYmo6IGppZGN0ZnN0LmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGpkY3QuaAoramlkY3RpbnQub2JqOiBqaWRjdGludC5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqZGN0LmgKK2ppZGN0cmVkLm9iajogamlkY3RyZWQuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggamRjdC5oCitqcXVhbnQxLm9iajoganF1YW50MS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoranF1YW50Mi5vYmo6IGpxdWFudDIuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmgKK2p1dGlscy5vYmo6IGp1dGlscy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaAoram1lbW1nci5vYmo6IGptZW1tZ3IuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtYW5zaS5vYmo6IGptZW1hbnNpLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAoram1lbW5hbWUub2JqOiBqbWVtbmFtZS5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1ub2JzLm9iajogam1lbW5vYnMuYyBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqcGVnaW50LmggamVycm9yLmggam1lbXN5cy5oCitqbWVtZG9zLm9iajogam1lbWRvcy5jIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGpwZWdpbnQuaCBqZXJyb3IuaCBqbWVtc3lzLmgKK2ptZW1tYWMub2JqOiBqbWVtbWFjLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIGptZW1zeXMuaAorY2pwZWcub2JqOiBjanBlZy5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaCBqdmVyc2lvbi5oCitkanBlZy5vYmo6IGRqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oIGp2ZXJzaW9uLmgKK2pwZWd0cmFuLm9iajoganBlZ3RyYW4uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmggdHJhbnN1cHAuaCBqdmVyc2lvbi5oCityZGpwZ2NvbS5vYmo6IHJkanBnY29tLmMgamluY2x1ZGUuaCBqY29uZmlnLmgKK3dyanBnY29tLm9iajogd3JqcGdjb20uYyBqaW5jbHVkZS5oIGpjb25maWcuaAorY2RqcGVnLm9iajogY2RqcGVnLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZGNvbG1hcC5vYmo6IHJkY29sbWFwLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCityZHN3aXRjaC5vYmo6IHJkc3dpdGNoLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit0cmFuc3VwcC5vYmo6IHRyYW5zdXBwLmMgamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmgganBlZ2ludC5oIGplcnJvci5oIHRyYW5zdXBwLmgKK3JkcHBtLm9iajogcmRwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dycHBtLm9iajogd3JwcG0uYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkZ2lmLm9iajogcmRnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3dyZ2lmLm9iajogd3JnaWYuYyBjZGpwZWcuaCBqaW5jbHVkZS5oIGpjb25maWcuaCBqcGVnbGliLmggam1vcmVjZmcuaCBqZXJyb3IuaCBjZGVycm9yLmgKK3JkdGFyZ2Eub2JqOiByZHRhcmdhLmMgY2RqcGVnLmggamluY2x1ZGUuaCBqY29uZmlnLmgganBlZ2xpYi5oIGptb3JlY2ZnLmggamVycm9yLmggY2RlcnJvci5oCit3cnRhcmdhLm9iajogd3J0YXJnYS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRibXAub2JqOiByZGJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JibXAub2JqOiB3cmJtcC5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAorcmRybGUub2JqOiByZHJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaAord3JybGUub2JqOiB3cnJsZS5jIGNkanBlZy5oIGppbmNsdWRlLmggamNvbmZpZy5oIGpwZWdsaWIuaCBqbW9yZWNmZy5oIGplcnJvci5oIGNkZXJyb3IuaApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VsaWIuZHMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZWxpYi5kcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FkMzZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha2VsaWIuZHMKQEAgLTAsMCArMSwxMDQ2IEBACisjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBOTUFLRSBGaWxlLCBGb3JtYXQgVmVyc2lvbiA0LjIwCisjICoqIERPIE5PVCBFRElUICoqCisKKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IiAweDAxMDQKKworIUlGICIkKENGRykiID09ICIiCitDRkc9anBlZyAtIFdpbjMyCishTUVTU0FHRSBObyBjb25maWd1cmF0aW9uIHNwZWNpZmllZC4gIERlZmF1bHRpbmcgdG8ganBlZyAtIFdpbjMyLgorIUVORElGIAorCishSUYgIiQoQ0ZHKSIgIT0gImpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIEludmFsaWQgY29uZmlndXJhdGlvbiAiJChDRkcpIiBzcGVjaWZpZWQuCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRSBvbiB0aGlzIG1ha2VmaWxlCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImpwZWcubWFrIiBDRkc9ImpwZWcgLSBXaW4zMiIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJqcGVnIC0gV2luMzIiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQorIU1FU1NBR0UgCishRVJST1IgQW4gaW52YWxpZCBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZC4KKyFFTkRJRiAKKworIUlGICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCitOVUxMPQorIUVMU0UgCitOVUxMPW51bAorIUVORElGIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gUHJvamVjdAorIyBQUk9QIFRhcmdldF9MYXN0X1NjYW5uZWQgImpwZWcgLSBXaW4zMiIKK0NQUD1jbC5leGUKKworIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIFRhcmdldF9EaXIgIiIKK09VVERJUj0uXFJlbGVhc2UKK0lOVERJUj0uXFJlbGVhc2UKKworQUxMIDogIiQoT1VURElSKVxqcGVnLmxpYiIKKworQ0xFQU4gOiAKKwktQGVyYXNlICIkKElOVERJUilcamNhcGltaW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjdHJhbnMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3BhcmFtLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhdGFkc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY2luaXQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY21hc3Rlci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjbWFya2VyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNtYWluY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY3ByZXBjdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjY29lZmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNjb2xvci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjc2FtcGxlLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNodWZmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamNwaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamZkY3Rmc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZmRjdGZsdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpmZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRhcGltaW4ub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGFwaXN0ZC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkdHJhbnMub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZGF0YXNyYy5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFzdGVyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRpbnB1dC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFya2VyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRodWZmLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRwaHVmZi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWFpbmN0Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamRjb2VmY3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHBvc3RjdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkZGN0bWdyLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3Rmc3Qub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGppZGN0aW50Lm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamlkY3RyZWQub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqZHNhbXBsZS5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkY29sb3Iub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqcXVhbnQxLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanF1YW50Mi5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGpkbWVyZ2Uub2JqIgorCS1AZXJhc2UgIiQoSU5URElSKVxqY29tYXBpLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcanV0aWxzLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcamVycm9yLm9iaiIKKwktQGVyYXNlICIkKElOVERJUilcam1lbW1nci5vYmoiCisJLUBlcmFzZSAiJChJTlRESVIpXGptZW1ub2JzLm9iaiIKKwktQGVyYXNlICIkKE9VVERJUilcanBlZy5saWIiCisKKyIkKE9VVERJUikiIDoKKyAgICBpZiBub3QgZXhpc3QgIiQoT1VURElSKS8kKE5VTEwpIiBta2RpciAiJChPVVRESVIpIgorCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIiAvWVggL2MKK0NQUF9QUk9KPS9ub2xvZ28gL01MIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9XSU5ET1dTIlwKKyAvRnAiJChJTlRESVIpL2pwZWcucGNoIiAvWVggL0ZvIiQoSU5URElSKS8iIC9jIAorQ1BQX09CSlM9LlxSZWxlYXNlLworQ1BQX1NCUlM9LlwuCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitCU0MzMl9GTEFHUz0vbm9sb2dvIC9vIiQoT1VURElSKS9qcGVnLmJzYyIgCitCU0MzMl9TQlJTPSBcCisJCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KK0xJQjMyX0ZMQUdTPS9ub2xvZ28gL291dDoiJChPVVRESVIpL2pwZWcubGliIiAKK0xJQjMyX09CSlM9IFwKKwkiJChJTlRESVIpXGpjYXBpbWluLm9iaiIgXAorCSIkKElOVERJUilcamNhcGlzdGQub2JqIiBcCisJIiQoSU5URElSKVxqY3RyYW5zLm9iaiIgXAorCSIkKElOVERJUilcamNwYXJhbS5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgXAorCSIkKElOVERJUilcamNpbml0Lm9iaiIgXAorCSIkKElOVERJUilcamNtYXN0ZXIub2JqIiBcCisJIiQoSU5URElSKVxqY21hcmtlci5vYmoiIFwKKwkiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgXAorCSIkKElOVERJUilcamNwcmVwY3Qub2JqIiBcCisJIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIFwKKwkiJChJTlRESVIpXGpjY29sb3Iub2JqIiBcCisJIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIFwKKwkiJChJTlRESVIpXGpjaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpjcGh1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqY2RjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamZkY3RmbHQub2JqIiBcCisJIiQoSU5URElSKVxqZmRjdGludC5vYmoiIFwKKwkiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgXAorCSIkKElOVERJUilcamRhcGlzdGQub2JqIiBcCisJIiQoSU5URElSKVxqZHRyYW5zLm9iaiIgXAorCSIkKElOVERJUilcamRhdGFzcmMub2JqIiBcCisJIiQoSU5URElSKVxqZG1hc3Rlci5vYmoiIFwKKwkiJChJTlRESVIpXGpkaW5wdXQub2JqIiBcCisJIiQoSU5URElSKVxqZG1hcmtlci5vYmoiIFwKKwkiJChJTlRESVIpXGpkaHVmZi5vYmoiIFwKKwkiJChJTlRESVIpXGpkcGh1ZmYub2JqIiBcCisJIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIFwKKwkiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgXAorCSIkKElOVERJUilcamRwb3N0Y3Qub2JqIiBcCisJIiQoSU5URElSKVxqZGRjdG1nci5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0ZnN0Lm9iaiIgXAorCSIkKElOVERJUilcamlkY3RmbHQub2JqIiBcCisJIiQoSU5URElSKVxqaWRjdGludC5vYmoiIFwKKwkiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgXAorCSIkKElOVERJUilcamRzYW1wbGUub2JqIiBcCisJIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgXAorCSIkKElOVERJUilcanF1YW50MS5vYmoiIFwKKwkiJChJTlRESVIpXGpxdWFudDIub2JqIiBcCisJIiQoSU5URElSKVxqZG1lcmdlLm9iaiIgXAorCSIkKElOVERJUilcamNvbWFwaS5vYmoiIFwKKwkiJChJTlRESVIpXGp1dGlscy5vYmoiIFwKKwkiJChJTlRESVIpXGplcnJvci5vYmoiIFwKKwkiJChJTlRESVIpXGptZW1tZ3Iub2JqIiBcCisJIiQoSU5URElSKVxqbWVtbm9icy5vYmoiCisKKyIkKE9VVERJUilcanBlZy5saWIiIDogIiQoT1VURElSKSIgJChERUZfRklMRSkgJChMSUIzMl9PQkpTKQorICAgICQoTElCMzIpIEA8PAorICAkKExJQjMyX0ZMQUdTKSAkKERFRl9GTEFHUykgJChMSUIzMl9PQkpTKQorPDwKKworIUVORElGIAorCisuY3skKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmNwcHskKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmN4eHskKENQUF9PQkpTKX0ub2JqOgorICAgJChDUFApICQoQ1BQX1BST0opICQ8ICAKKworLmN7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jcHB7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKy5jeHh7JChDUFBfU0JSUyl9LnNicjoKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkPCAgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImpwZWcgLSBXaW4zMiIKKworIUlGICAiJChDRkcpIiA9PSAianBlZyAtIFdpbjMyIgorCishRU5ESUYgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNhcGltaW4uYyIKK0RFUF9DUFBfSkNBUEk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2FwaW1pbi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2FwaXN0ZC5jIgorREVQX0NQUF9KQ0FQSVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2FwaXN0ZC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0FQSVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNjb2VmY3QuYyIKK0RFUF9DUFBfSkNDT0U9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY2NvZWZjdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPRSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2NvbG9yLmMiCitERVBfQ1BQX0pDQ09MPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNjb2xvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0NPTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY2RjdG1nci5jIgorREVQX0NQUF9KQ0RDVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpjZGN0bWdyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDRENUKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjaHVmZi5jIgorREVQX0NQUF9KQ0hVRj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqY2h1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamNodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDSFVGKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjaW5pdC5jIgorREVQX0NQUF9KQ0lOST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjaW5pdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ0lOSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY21haW5jdC5jIgorREVQX0NQUF9KQ01BST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpjbWFpbmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDTUFJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjbWFya2VyLmMiCitERVBfQ1BQX0pDTUFSPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNtYXJrZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNNQVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNtYXN0ZXIuYyIKK0RFUF9DUFBfSkNNQVM9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY21hc3Rlci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ01BUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY29tYXBpLmMiCitERVBfQ1BQX0pDT01BPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNvbWFwaS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ09NQSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3BhcmFtLmMiCitERVBfQ1BQX0pDUEFSPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNwYXJhbS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1BBUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3BodWZmLmMiCitERVBfQ1BQX0pDUEhVPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpjaHVmZi5oIlwKKwkKKworIiQoSU5URElSKVxqY3BodWZmLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pDUEhVKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpjcHJlcGN0LmMiCitERVBfQ1BQX0pDUFJFPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamNwcmVwY3Qub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkNQUkUpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamNzYW1wbGUuYyIKK0RFUF9DUFBfSkNTQU09XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqY3NhbXBsZS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1NBTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqY3RyYW5zLmMiCitERVBfQ1BQX0pDVFJBPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamN0cmFucy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KQ1RSQSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGFwaW1pbi5jIgorREVQX0NQUF9KREFQST1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXBpbWluLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkYXBpc3RkLmMiCitERVBfQ1BQX0pEQVBJUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXBpc3RkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVBJUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGF0YWRzdC5jIgorREVQX0NQUF9KREFUQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXRhZHN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkYXRhc3JjLmMiCitERVBfQ1BQX0pEQVRBUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkYXRhc3JjLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQVRBUykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZGNvZWZjdC5jIgorREVQX0NQUF9KRENPRT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkY29lZmN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09FKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkY29sb3IuYyIKK0RFUF9DUFBfSkRDT0w9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZGNvbG9yLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEQ09MKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkZGN0bWdyLmMiCitERVBfQ1BQX0pERENUPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamRkY3RtZ3Iub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkREQ1QpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRodWZmLmMiCitERVBfQ1BQX0pESFVGPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkaHVmZi5oIlwKKwkKKworIiQoSU5URElSKVxqZGh1ZmYub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRIVUYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRpbnB1dC5jIgorREVQX0NQUF9KRElOUD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkaW5wdXQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRJTlApICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRtYWluY3QuYyIKK0RFUF9DUFBfSkRNQUk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkKKworIiQoSU5URElSKVxqZG1haW5jdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRE1BSSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZG1hcmtlci5jIgorREVQX0NQUF9KRE1BUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkbWFya2VyLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pETUFSKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpkbWFzdGVyLmMiCitERVBfQ1BQX0pETUFTPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRtYXN0ZXIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNQVMpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRtZXJnZS5jIgorREVQX0NQUF9KRE1FUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkbWVyZ2Uub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRNRVIpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamRwaHVmZi5jIgorREVQX0NQUF9KRFBIVT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGh1ZmYuaCJcCisJCisKKyIkKElOVERJUilcamRwaHVmZi5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRFBIVSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZHBvc3RjdC5jIgorREVQX0NQUF9KRFBPUz1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkcG9zdGN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pEUE9TKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Impkc2FtcGxlLmMiCitERVBfQ1BQX0pEU0FNPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcamRzYW1wbGUub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRTQU0pICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamR0cmFucy5jIgorREVQX0NQUF9KRFRSQT1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpkdHJhbnMub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSkRUUkEpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamVycm9yLmMiCitERVBfQ1BQX0pFUlJPPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqdmVyc2lvbi5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGplcnJvci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRVJSTykgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZmRjdGZsdC5jIgorREVQX0NQUF9KRkRDVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpmZGN0Zmx0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENUKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImpmZGN0ZnN0LmMiCitERVBfQ1BQX0pGRENURj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGpmZGN0ZnN0Lm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pGRENURikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqZmRjdGludC5jIgorREVQX0NQUF9KRkRDVEk9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqZmRjdGludC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KRkRDVEkpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamlkY3RmbHQuYyIKK0RFUF9DUFBfSklEQ1Q9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqaWRjdGZsdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqaWRjdGZzdC5jIgorREVQX0NQUF9KSURDVEY9XAorCSJqaW5jbHVkZS5oIlwKKwkiamNvbmZpZy5oIlwKKwkianBlZ2xpYi5oIlwKKwkiam1vcmVjZmcuaCJcCisJImpwZWdpbnQuaCJcCisJImplcnJvci5oIlwKKwkiamRjdC5oIlwKKwkKKworIiQoSU5URElSKVxqaWRjdGZzdC5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KSURDVEYpICIkKElOVERJUikiCisgICAkKENQUCkgJChDUFBfUFJPSikgJChTT1VSQ0UpCisKKworIyBFbmQgU291cmNlIEZpbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0iamlkY3RpbnQuYyIKK0RFUF9DUFBfSklEQ1RJPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImpkY3QuaCJcCisJCisKKyIkKElOVERJUilcamlkY3RpbnQub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSklEQ1RJKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9ImppZGN0cmVkLmMiCitERVBfQ1BQX0pJRENUUj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqZGN0LmgiXAorCQorCisiJChJTlRESVIpXGppZGN0cmVkLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pJRENUUikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcXVhbnQxLmMiCitERVBfQ1BQX0pRVUFOPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJCisKKyIkKElOVERJUilcanF1YW50MS5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KUVVBTikgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqcXVhbnQyLmMiCitERVBfQ1BQX0pRVUFOVD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGpxdWFudDIub2JqIiA6ICQoU09VUkNFKSAkKERFUF9DUFBfSlFVQU5UKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Imp1dGlscy5jIgorREVQX0NQUF9KVVRJTD1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCQorCisiJChJTlRESVIpXGp1dGlscy5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KVVRJTCkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqbWVtbWdyLmMiCitERVBfQ1BQX0pNRU1NPVwKKwkiamluY2x1ZGUuaCJcCisJImpjb25maWcuaCJcCisJImpwZWdsaWIuaCJcCisJImptb3JlY2ZnLmgiXAorCSJqcGVnaW50LmgiXAorCSJqZXJyb3IuaCJcCisJImptZW1zeXMuaCJcCisJCisKKyIkKElOVERJUilcam1lbW1nci5vYmoiIDogJChTT1VSQ0UpICQoREVQX0NQUF9KTUVNTSkgIiQoSU5URElSKSIKKyAgICQoQ1BQKSAkKENQUF9QUk9KKSAkKFNPVVJDRSkKKworCisjIEVuZCBTb3VyY2UgRmlsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSJqbWVtbm9icy5jIgorREVQX0NQUF9KTUVNTj1cCisJImppbmNsdWRlLmgiXAorCSJqY29uZmlnLmgiXAorCSJqcGVnbGliLmgiXAorCSJqbW9yZWNmZy5oIlwKKwkianBlZ2ludC5oIlwKKwkiamVycm9yLmgiXAorCSJqbWVtc3lzLmgiXAorCQorCisiJChJTlRESVIpXGptZW1ub2JzLm9iaiIgOiAkKFNPVVJDRSkgJChERVBfQ1BQX0pNRU1OKSAiJChJTlRESVIpIgorICAgJChDUFApICQoQ1BQX1BST0opICQoU09VUkNFKQorCisKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBUYXJnZXQKKyMgRW5kIFByb2plY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtlcHJvai5tYWMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZXByb2oubWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjc3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrZXByb2oubWFjCkBAIC0wLDAgKzEsMjEzIEBACistLQorLS0gbWFrZXByb2oubWFjCistLQorLS0gVGhpcyBBcHBsZVNjcmlwdCBidWlsZHMgQ29kZSBXYXJyaW9yIFBSTyBSZWxlYXNlIDIgcHJvamVjdCBmaWxlcyBmb3IgdGhlCistLSBsaWJqcGVnIGxpYnJhcnkgYXMgd2VsbCBhcyB0aGUgdGVzdCBwcm9ncmFtcyAnY2pwZWcnLCAnZGpwZWcnLCAnanBlZ3RyYW4nLgorLS0gKFdlJ2QgZGlzdHJpYnV0ZSByZWFsIHByb2plY3QgZmlsZXMsIGV4Y2VwdCB0aGV5J3JlIG5vdCB0ZXh0CistLSBhbmQgd291bGQgY3JlYXRlIG1haW50ZW5hbmNlIGhlYWRhY2hlcy4pCistLQorLS0gVGhlIHNjcmlwdCB0aGVuIGNvbXBpbGVzIGFuZCBsaW5rcyB0aGUgbGlicmFyeSBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMuCistLSBOT1RFOiBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5IGNyZWF0ZWQgYSAnamNvbmZpZy5oJyBmaWxlLCB0aGUgc2NyaXB0CistLSBhdXRvbWF0aWNhbGx5IGNvcGllcyAnamNvbmZpZy5tYWMnIHRvICdqY29uZmlnLmgnLgorLS0KKy0tIFRvIHVzZSB0aGlzIHNjcmlwdCwgeW91IG11c3QgaGF2ZSBBcHBsZVNjcmlwdCAxLjEgb3IgbGF0ZXIgaW5zdGFsbGVkCistLSBhbmQgYSBzdWl0YWJsZSBBcHBsZVNjcmlwdCBlZGl0b3IgbGlrZSBTY3JpcHQgRWRpdG9yIG9yIFNjcmlwdCBEZWJ1Z2dlcgorLS0gKGh0dHA6Ly93d3cubGF0ZW5pZ2h0c3cuY29tKS4gT3BlbiB0aGlzIGZpbGUgd2l0aCB5b3VyIEFwcGxlU2NyaXB0CistLSBlZGl0b3IgYW5kIGV4ZWN1dGUgdGhlICJydW4iIGNvbW1hbmQgdG8gYnVpbGQgdGhlIHByb2plY3RzLgorLS0KKy0tIFRoYW5rcyB0byBEYW4gU2VhcnMgYW5kIERvbiBBZ3JvIGZvciB0aGlzIHNjcmlwdC4KKy0tIFF1ZXN0aW9ucyBhYm91dCB0aGlzIHNjcmlwdCBjYW4gYmUgYWRkcmVzc2VkIHRvIGRvZ3BhcmtAaW50ZXJsb2cuY29tCistLQorCitvbiBydW4KKworCWNob29zZSBmb2xkZXIgd2l0aCBwcm9tcHQgIj4+PiBTZWxlY3QgSUpHIHNvdXJjZSBmb2xkZXIgPDw8IgorCXNldCBpamdfZm9sZGVyIHRvIHJlc3VsdAorCisJY2hvb3NlIGZvbGRlciB3aXRoIHByb21wdCAiPj4+IFNlbGVjdCBNZXRyb1dlcmtzIGZvbGRlciA8PDwiCisJc2V0IGN3X2ZvbGRlciB0byByZXN1bHQKKworCS0tIGlmIGpjb25maWcuaCBkb2Vzbid0IGFscmVhZHkgZXhpc3QsIGNvcHkgamNvbmZpZy5tYWMKKworCXRlbGwgYXBwbGljYXRpb24gIkZpbmRlciIKKwkJaWYgbm90IChleGlzdHMgZmlsZSAiamNvbmZpZy5oIiBvZiBpamdfZm9sZGVyKSB0aGVuCisJCQlkdXBsaWNhdGUge2ZpbGUgImpjb25maWcubWFjIiBvZiBmb2xkZXIgaWpnX2ZvbGRlcn0KKwkJCXNlbGVjdCBmaWxlICJqY29uZmlnLm1hYyBjb3B5IiBvZiBmb2xkZXIgaWpnX2ZvbGRlcgorCQkJc2V0IG5hbWUgb2Ygc2VsZWN0aW9uIHRvICJqY29uZmlnLmgiCisJCWVuZCBpZgorCWVuZCB0ZWxsCisKKwl0ZWxsIGFwcGxpY2F0aW9uICJDb2RlV2FycmlvciBJREUgMi4xIgorCSAgd2l0aCB0aW1lb3V0IG9mIDEwMDAwIHNlY29uZHMKKworCQktLSBjcmVhdGUgbGlianBlZyBwcm9qZWN0CisKKwkJYWN0aXZhdGUKKwkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnLnByb2oiCisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImxpYmpwZWcifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJsaWJqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7UHJvamVjdCBUeXBlOmxpYnJhcnl9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9CisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNhcGltaW4uYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjYXBpc3RkLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3RyYW5zLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3BhcmFtLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGF0YWRzdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNpbml0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY21hc3Rlci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNtYXJrZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjbWFpbmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY3ByZXBjdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNjb2VmY3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjY29sb3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjc2FtcGxlLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqY2h1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjcGh1ZmYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpjZGN0bWdyLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZmRjdGZzdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamZkY3RmbHQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpmZGN0aW50LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZGFwaW1pbi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRhcGlzdGQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkdHJhbnMuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkYXRhc3JjLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZG1hc3Rlci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRpbnB1dC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYXJrZXIuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkaHVmZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRwaHVmZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtYWluY3QuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImpkY29lZmN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHBvc3RjdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRkY3RtZ3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0ZnN0LmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqaWRjdGZsdC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamlkY3RpbnQuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImppZGN0cmVkLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZHNhbXBsZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRjb2xvci5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50MS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianF1YW50Mi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamRtZXJnZS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiamNvbWFwaS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianV0aWxzLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqZXJyb3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tZ3IuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImptZW1tYWMuYyIgVG8gU2VnbWVudCAxCisKKwkJLS0gY29tcGlsZSBhbmQgbGluayB0aGUgbGlicmFyeQorCisJCU1ha2UgUHJvamVjdAorCQlDbG9zZSBQcm9qZWN0CisKKwkJLS0gY3JlYXRlIGNqcGVnIHByb2plY3QKKworCQlhY3RpdmF0ZQorCQlDcmVhdGUgUHJvamVjdCAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNqcGVnLnByb2oiCisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7VGFyZ2V0IE5hbWU6ImNqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgUHJvamVjdCIgdG8ge0ZpbGUgTmFtZToiY2pwZWcifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge0xpbmtlcjoiTWFjT1MgUFBDIExpbmtlciJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtBTlNJIFN0cmljdDp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7RW51bXMgQWx3YXlzIEludHM6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgQ29kZWdlbiIgdG8ge1N0cnVjdCBBbGlnbm1lbnQ6UG93ZXJQQ30KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJQUEMgTGlua2VyIiB0byB7R2VuZXJhdGUgU1lNIEZpbGU6ZmFsc2V9CisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2pwZWcuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkcHBtLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZGdpZi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmR0YXJnYS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRybGUuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgInJkYm1wLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJyZHN3aXRjaC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAiY2RqcGVnLmMiIFRvIFNlZ21lbnQgMQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImxpYmpwZWciIFRvIFNlZ21lbnQgMgorCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBDLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgU0lPVVguUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpSdW50aW1lOlJ1bnRpbWUgUFBDOk1TTCBSdW50aW1lUFBDLkxpYiIgVG8gU2VnbWVudCAzCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpJbnRlcmZhY2VMaWIiIFRvIFNlZ21lbnQgNAorCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOk1hdGhMaWIiIFRvIFNlZ21lbnQgNAorCisJCS0tIGNvbXBpbGUgYW5kIGxpbmsgY2pwZWcKKworCQlNYWtlIFByb2plY3QKKwkJQ2xvc2UgUHJvamVjdAorCisJCS0tIGNyZWF0ZSBkanBlZyBwcm9qZWN0CisKKwkJYWN0aXZhdGUKKwkJQ3JlYXRlIFByb2plY3QgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJkanBlZy5wcm9qIgorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlRhcmdldCBTZXR0aW5ncyIgdG8ge1RhcmdldCBOYW1lOiJkanBlZyJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIFByb2plY3QiIHRvIHtGaWxlIE5hbWU6ImRqcGVnIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtMaW5rZXI6Ik1hY09TIFBQQyBMaW5rZXIifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIkMvQysrIENvbXBpbGVyIiB0byB7QU5TSSBTdHJpY3Q6dHJ1ZX0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0VudW1zIEFsd2F5cyBJbnRzOnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIENvZGVnZW4iIHRvIHtTdHJ1Y3QgQWxpZ25tZW50OlBvd2VyUEN9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiUFBDIExpbmtlciIgdG8ge0dlbmVyYXRlIFNZTSBGaWxlOmZhbHNlfQorCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImRqcGVnLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cnBwbS5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAid3JnaWYuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndydGFyZ2EuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgIndycmxlLmMiIFRvIFNlZ21lbnQgMQorCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJ3cmJtcC5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRjb2xtYXAuYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJsaWJqcGVnIiBUbyBTZWdtZW50IDIKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWV0cm93ZXJrcyBTdGFuZGFyZCBMaWJyYXJ5Ok1TTCBDOkJpbjpNU0wgQy5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIFNJT1VYLlBQQy5MaWIiIFRvIFNlZ21lbnQgMworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6UnVudGltZTpSdW50aW1lIFBQQzpNU0wgUnVudGltZVBQQy5MaWIiIFRvIFNlZ21lbnQgMworCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246SW50ZXJmYWNlTGliIiBUbyBTZWdtZW50IDQKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOk1hY09TIENvbW1vbjpNYXRoTGliIiBUbyBTZWdtZW50IDQKKworCQktLSBjb21waWxlIGFuZCBsaW5rIGRqcGVnCisKKwkJTWFrZSBQcm9qZWN0CisJCUNsb3NlIFByb2plY3QKKworCQktLSBjcmVhdGUganBlZ3RyYW4gcHJvamVjdAorCisJCWFjdGl2YXRlCisJCUNyZWF0ZSBQcm9qZWN0IChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAianBlZ3RyYW4ucHJvaiIKKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJUYXJnZXQgU2V0dGluZ3MiIHRvIHtUYXJnZXQgTmFtZToianBlZ3RyYW4ifQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBQcm9qZWN0IiB0byB7RmlsZSBOYW1lOiJqcGVndHJhbiJ9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiVGFyZ2V0IFNldHRpbmdzIiB0byB7TGlua2VyOiJNYWNPUyBQUEMgTGlua2VyIn0KKwkJU2V0IFByZWZlcmVuY2VzIG9mIHBhbmVsICJDL0MrKyBDb21waWxlciIgdG8ge0FOU0kgU3RyaWN0OnRydWV9CisJCVNldCBQcmVmZXJlbmNlcyBvZiBwYW5lbCAiQy9DKysgQ29tcGlsZXIiIHRvIHtFbnVtcyBBbHdheXMgSW50czp0cnVlfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBDb2RlZ2VuIiB0byB7U3RydWN0IEFsaWdubWVudDpQb3dlclBDfQorCQlTZXQgUHJlZmVyZW5jZXMgb2YgcGFuZWwgIlBQQyBMaW5rZXIiIHRvIHtHZW5lcmF0ZSBTWU0gRmlsZTpmYWxzZX0KKworCQlBZGQgRmlsZXMgKGlqZ19mb2xkZXIgYXMgc3RyaW5nKSAmICJqcGVndHJhbi5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAicmRzd2l0Y2guYyIgVG8gU2VnbWVudCAxCisJCUFkZCBGaWxlcyAoaWpnX2ZvbGRlciBhcyBzdHJpbmcpICYgImNkanBlZy5jIiBUbyBTZWdtZW50IDEKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAidHJhbnN1cHAuYyIgVG8gU2VnbWVudCAxCisKKwkJQWRkIEZpbGVzIChpamdfZm9sZGVyIGFzIHN0cmluZykgJiAibGlianBlZyIgVG8gU2VnbWVudCAyCisKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1ldHJvd2Vya3MgU3RhbmRhcmQgTGlicmFyeTpNU0wgQzpCaW46TVNMIEMuUFBDLkxpYiIgVG8gU2VnbWVudCAzCisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNZXRyb3dlcmtzIFN0YW5kYXJkIExpYnJhcnk6TVNMIEM6QmluOk1TTCBTSU9VWC5QUEMuTGliIiBUbyBTZWdtZW50IDMKKwkJQWRkIEZpbGVzIChjd19mb2xkZXIgYXMgc3RyaW5nKSAmICJNZXRyb3dlcmtzIENvZGVXYXJyaW9yOk1hY09TIFN1cHBvcnQ6TGlicmFyaWVzOlJ1bnRpbWU6UnVudGltZSBQUEM6TVNMIFJ1bnRpbWVQUEMuTGliIiBUbyBTZWdtZW50IDMKKworCQlBZGQgRmlsZXMgKGN3X2ZvbGRlciBhcyBzdHJpbmcpICYgIk1ldHJvd2Vya3MgQ29kZVdhcnJpb3I6TWFjT1MgU3VwcG9ydDpMaWJyYXJpZXM6TWFjT1MgQ29tbW9uOkludGVyZmFjZUxpYiIgVG8gU2VnbWVudCA0CisJCUFkZCBGaWxlcyAoY3dfZm9sZGVyIGFzIHN0cmluZykgJiAiTWV0cm93ZXJrcyBDb2RlV2FycmlvcjpNYWNPUyBTdXBwb3J0OkxpYnJhcmllczpNYWNPUyBDb21tb246TWF0aExpYiIgVG8gU2VnbWVudCA0CisKKwkJLS0gY29tcGlsZSBhbmQgbGluayBqcGVndHJhbgorCisJCU1ha2UgUHJvamVjdAorCQlDbG9zZSBQcm9qZWN0CisKKwkJcXVpdAorCisJICBlbmQgdGltZW91dAorCWVuZCB0ZWxsCitlbmQgcnVuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrbGpwZWcuc3QgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrbGpwZWcuc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNDkzZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWtsanBlZy5zdApAQCAtMCwwICsxLDcwIEBACis7IFByb2plY3QgZmlsZSBmb3IgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlCis7Cis7IFRoaXMgcHJvamVjdCBmaWxlIGlzIGZvciBBdGFyaSBTVC9TVEUvVFQgc3lzdGVtcyB1c2luZyBQdXJlIEMgb3IgVHVyYm8gQy4KKzsgVGhhbmtzIHRvIEZyYW5rIE1vZWhsZSAoRnJhbmsuTW9laGxlQGFyYmkuaW5mb3JtYXRpay51bmktb2xkZW5idXJnLmRlKSwKKzsgRHIuIEIuIFNldHplcGZhbmR0IChiZXJuZEBnaW5hLnVuaS1tdWVuc3Rlci5kZSksCis7IGFuZCBHdWlkbyBWb2xsYmVkaW5nIChndWl2b2xAZXNjLmRlKS4KKzsKKzsgVG8gdXNlIHRoaXMgZmlsZSwgcmVuYW1lIGl0IHRvIGxpYmpwZWcucHJqLgorOyBSZWFkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgYmVmb3JlIHRyeWluZyB0byBtYWtlIHRoZSBwcm9ncmFtIQorOworOworOyAgICAgICogKiAqIE91dHB1dCBmaWxlICogKiAqCitsaWJqcGVnLmxpYgorOworOyAqICogKiBDT01QSUxFUiBPUFRJT05TICogKiAqICAKKy5DWy1QXSAgICAgICAgOyBhYnNvbHV0ZSBjYWxscworLkNbLU1dICAgICAgICA7IGFuZCBubyBzdHJpbmcgbWVyZ2luZywgZm9sa3MKKy5DWy13LWNsbl0gICAgOyBubyAiY29uc3RhbnQgaXMgbG9uZyIgd2FybmluZ3MKKy5DWy13LXBhcl0gICAgOyBubyAicGFyYW1ldGVyIHh4eHggdW51c2VkIgorLkNbLXctcmNoXSAgICA7IG5vICJ1bnJlYWNoYWJsZSBjb2RlIgorLkNbLXdzaWddICAgICA7IHdhcm4gaWYgc2lnbmlmaWNhbnQgZGlnaXRzIG1heSBiZSBsb3N0CisuTFstSl0gICAgICAgIDsgbGluayBuZXcgT2JqLWZvcm1hdCAoc28gd2UgZ2V0IGEgbGlicmFyeSkKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK2pjYXBpbWluLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjYXBpc3RkLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjY29lZmN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjY29sb3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNkY3RtZ3IuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pjaHVmZi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamNodWZmLmgpCitqY2luaXQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYWluY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYXJrZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNtYXN0ZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNvbWFwaS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqY3BhcmFtLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pjcGh1ZmYuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpjaHVmZi5oKQoramNwcmVwY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramNzYW1wbGUuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramN0cmFucy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGFwaW1pbi5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGFwaXN0ZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGF0YWRzdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCkKK2pkYXRhc3JjLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGplcnJvci5oKQoramRjb2VmY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRjb2xvci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZGRjdG1nci5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramRodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGh1ZmYuaCkKK2pkaW5wdXQuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYWluY3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYXJrZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtYXN0ZXIuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramRtZXJnZS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqZHBodWZmLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGh1ZmYuaCkKK2pkcG9zdGN0LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkc2FtcGxlLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2pkdHJhbnMuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oKQoramVycm9yLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGp2ZXJzaW9uLmgsamVycm9yLmgpCitqZmRjdGZsdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramZkY3Rmc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2pmZGN0aW50LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqaWRjdGZsdC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoramlkY3Rmc3QuYwkoamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsanBlZ2ludC5oLGplcnJvci5oLGpkY3QuaCkKK2ppZGN0aW50LmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqZGN0LmgpCitqaWRjdHJlZC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsamRjdC5oKQoranF1YW50MS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqcXVhbnQyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCkKK2p1dGlscy5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgpCitqbWVtbWdyLmMJKGppbmNsdWRlLmgsamNvbmZpZy5oLGpwZWdsaWIuaCxqbW9yZWNmZy5oLGpwZWdpbnQuaCxqZXJyb3IuaCxqbWVtc3lzLmgpCitqbWVtYW5zaS5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsam1lbXN5cy5oKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha3RqcGVnLnN0IGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL21ha3RqcGVnLnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZjRkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrdGpwZWcuc3QKQEAgLTAsMCArMSwzMiBAQAorOyBQcm9qZWN0IGZpbGUgZm9yIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZQorOworOyBUaGlzIHByb2plY3QgZmlsZSBpcyBmb3IgQXRhcmkgU1QvU1RFL1RUIHN5c3RlbXMgdXNpbmcgUHVyZSBDIG9yIFR1cmJvIEMuCis7IFRoYW5rcyB0byBGcmFuayBNb2VobGUgKEZyYW5rLk1vZWhsZUBhcmJpLmluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZSksCis7IERyLiBCLiBTZXR6ZXBmYW5kdCAoYmVybmRAZ2luYS51bmktbXVlbnN0ZXIuZGUpLAorOyBhbmQgR3VpZG8gVm9sbGJlZGluZyAoZ3Vpdm9sQGVzYy5kZSkuCis7Cis7IFRvIHVzZSB0aGlzIGZpbGUsIHJlbmFtZSBpdCB0byBqcGVndHJhbi5wcmouCis7IElmIHlvdSBhcmUgdXNpbmcgVHVyYm8gQywgY2hhbmdlIGZpbGVuYW1lcyBiZWdpbm5pbmcgd2l0aCAicGMuLi4iIHRvICJ0Yy4uLiIKKzsgUmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGJlZm9yZSB0cnlpbmcgdG8gbWFrZSB0aGUgcHJvZ3JhbSEKKzsKKzsKKzsgICAgICAqICogKiBPdXRwdXQgZmlsZSAqICogKgoranBlZ3RyYW4udHRwCis7Cis7ICogKiAqIENPTVBJTEVSIE9QVElPTlMgKiAqICogIAorLkNbLVBdICAgICAgICA7IGFic29sdXRlIGNhbGxzCisuQ1stTV0gICAgICAgIDsgYW5kIG5vIHN0cmluZyBtZXJnaW5nLCBmb2xrcworLkNbLXctY2xuXSAgICA7IG5vICJjb25zdGFudCBpcyBsb25nIiB3YXJuaW5ncworLkNbLXctcGFyXSAgICA7IG5vICJwYXJhbWV0ZXIgeHh4eCB1bnVzZWQiCisuQ1stdy1yY2hdICAgIDsgbm8gInVucmVhY2hhYmxlIGNvZGUiCisuQ1std3NpZ10gICAgIDsgd2FybiBpZiBzaWduaWZpY2FudCBkaWdpdHMgbWF5IGJlIGxvc3QKKz0KKzsgKiAqICogKiBMaXN0IG9mIG1vZHVsZXMgKiAqICogKiAKK3Bjc3RhcnQubworanBlZ3RyYW4uYwkoY2RqcGVnLmgsamluY2x1ZGUuaCxqY29uZmlnLmgsanBlZ2xpYi5oLGptb3JlY2ZnLmgsamVycm9yLmgsY2RlcnJvci5oLHRyYW5zdXBwLmgsanZlcnNpb24uaCkKK2NkanBlZy5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCityZHN3aXRjaC5jCShjZGpwZWcuaCxqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqZXJyb3IuaCxjZGVycm9yLmgpCit0cmFuc3VwcC5jCShqaW5jbHVkZS5oLGpjb25maWcuaCxqcGVnbGliLmgsam1vcmVjZmcuaCxqcGVnaW50LmgsamVycm9yLmgsdHJhbnN1cHAuaCkKK2xpYmpwZWcubGliICAgICAgICA7IGJ1aWx0IGJ5IGxpYmpwZWcucHJqCitwY3N0ZGxpYi5saWIgICAgICAgOyBzdGFuZGFyZCBsaWJyYXJ5CitwY2V4dGxpYi5saWIgICAgICAgOyBleHRlbmRlZCBsaWJyYXJ5CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrdm1zLm9wdCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9tYWt2bXMub3B0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWU4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvbWFrdm1zLm9wdApAQCAtMCwwICsxLDQgQEAKKyEgQSBwb2ludGVyIHRvIHRoZSBWQVgvVk1TIEMgUnVuLVRpbWUgU2hhcmVhYmxlIExpYnJhcnkuCishIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgbWFrZWZpbGUubW1zIGFuZCBtYWtlZmlsZS52bXMsCishIGJ1dCBvbmx5IGZvciB0aGUgb2xkZXIgVkFYIEMgY29tcGlsZXIuICBERUMgQyBkb2VzIG5vdCBuZWVkIGl0LgorU3lzJExpYnJhcnk6VkFYQ1JUTC5FWEUgL1NoYXJlCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRibXAuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGJtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWZlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRibXAuYwpAQCAtMCwwICsxLDQzOSBAQAorLyoKKyAqIHJkYm1wLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byByZWFkIGlucHV0IGltYWdlcyBpbiBNaWNyb3NvZnQgIkJNUCIKKyAqIGZvcm1hdCAoTVMgV2luZG93cyAzLngsIE9TLzIgMS54LCBhbmQgT1MvMiAyLnggZmxhdm9ycykuCisgKiBDdXJyZW50bHksIG9ubHkgOC1iaXQgYW5kIDI0LWJpdCBpbWFnZXMgYXJlIHN1cHBvcnRlZCwgbm90IDEtYml0IG9yCisgKiA0LWJpdCAoZmVlZGluZyBzdWNoIGxvdy1kZXB0aCBpbWFnZXMgaW50byBKUEVHIHdvdWxkIGJlIHNpbGx5IGFueXdheSkuCisgKiBBbHNvLCB3ZSBkb24ndCBzdXBwb3J0IFJMRS1jb21wcmVzc2VkIGZpbGVzLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKKyAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKKyAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAorICogdGhlIGZpbGUgaXMgaW5kZWVkIEJNUCBmb3JtYXQpLgorICoKKyAqIFRoaXMgY29kZSBjb250cmlidXRlZCBieSBKYW1lcyBBcnRodXIgQm91Y2hlci4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgQk1QX1NVUFBPUlRFRAorCisKKy8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisKKyNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCBfYm1wX3NvdXJjZV9zdHJ1Y3QgKiBibXBfc291cmNlX3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX2JtcF9zb3VyY2Vfc3RydWN0IHsKKyAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCisKKyAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIEJNUCBjb2xvcm1hcCAoY29udmVydGVkIHRvIG15IGZvcm1hdCkgKi8KKworICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiBOZWVkZWQgdG8gcmV2ZXJzZSByb3cgb3JkZXIgKi8KKyAgSkRJTUVOU0lPTiBzb3VyY2Vfcm93OwkvKiBDdXJyZW50IHNvdXJjZSByb3cgbnVtYmVyICovCisgIEpESU1FTlNJT04gcm93X3dpZHRoOwkJLyogUGh5c2ljYWwgd2lkdGggb2Ygc2NhbmxpbmVzIGluIGZpbGUgKi8KKworICBpbnQgYml0c19wZXJfcGl4ZWw7CQkvKiByZW1lbWJlcnMgOC0gb3IgMjQtYml0IGZvcm1hdCAqLworfSBibXBfc291cmNlX3N0cnVjdDsKKworCitMT0NBTChpbnQpCityZWFkX2J5dGUgKGJtcF9zb3VyY2VfcHRyIHNpbmZvKQorLyogUmVhZCBuZXh0IGJ5dGUgZnJvbSBCTVAgZmlsZSAqLworeworICByZWdpc3RlciBGSUxFICppbmZpbGUgPSBzaW5mby0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIGludCBjOworCisgIGlmICgoYyA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQorICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHJldHVybiBjOworfQorCisKK0xPQ0FMKHZvaWQpCityZWFkX2NvbG9ybWFwIChibXBfc291cmNlX3B0ciBzaW5mbywgaW50IGNtYXBsZW4sIGludCBtYXBlbnRyeXNpemUpCisvKiBSZWFkIHRoZSBjb2xvcm1hcCBmcm9tIGEgQk1QIGZpbGUgKi8KK3sKKyAgaW50IGk7CisKKyAgc3dpdGNoIChtYXBlbnRyeXNpemUpIHsKKyAgY2FzZSAzOgorICAgIC8qIEJHUiBmb3JtYXQgKG9jY3VycyBpbiBPUy8yIGZpbGVzKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjbWFwbGVuOyBpKyspIHsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFsyXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMF1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgNDoKKyAgICAvKiBCR1IwIGZvcm1hdCAob2NjdXJzIGluIE1TIFdpbmRvd3MgZmlsZXMpICovCisgICAgZm9yIChpID0gMDsgaSA8IGNtYXBsZW47IGkrKykgeworICAgICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgICBzaW5mby0+Y29sb3JtYXBbMV1baV0gPSAoSlNBTVBMRSkgcmVhZF9ieXRlKHNpbmZvKTsKKyAgICAgIHNpbmZvLT5jb2xvcm1hcFswXVtpXSA9IChKU0FNUExFKSByZWFkX2J5dGUoc2luZm8pOworICAgICAgKHZvaWQpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX0JNUF9CQURDTUFQKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKKy8qCisgKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgorICogVGhlIGltYWdlIGhhcyBiZWVuIHJlYWQgaW50byB0aGUgd2hvbGVfaW1hZ2UgYXJyYXksIGJ1dCBpcyBvdGhlcndpc2UKKyAqIHVucHJvY2Vzc2VkLiAgV2UgbXVzdCByZWFkIGl0IG91dCBpbiB0b3AtdG8tYm90dG9tIHJvdyBvcmRlciwgYW5kIGlmCisgKiBpdCBpcyBhbiA4LWJpdCBpbWFnZSwgd2UgbXVzdCBleHBhbmQgY29sb3JtYXBwZWQgcGl4ZWxzIHRvIDI0Yml0IGZvcm1hdC4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF84Yml0X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgOC1iaXQgY29sb3JtYXAgaW5kZXhlcyAqLworeworICBibXBfc291cmNlX3B0ciBzb3VyY2UgPSAoYm1wX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUEFSUkFZIGNvbG9ybWFwID0gc291cmNlLT5jb2xvcm1hcDsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIHJlZ2lzdGVyIGludCB0OworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICAvKiBGZXRjaCBuZXh0IHJvdyBmcm9tIHZpcnR1YWwgYXJyYXkgKi8KKyAgc291cmNlLT5zb3VyY2Vfcm93LS07CisgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT53aG9sZV9pbWFnZSwKKyAgICAgc291cmNlLT5zb3VyY2Vfcm93LCAoSkRJTUVOU0lPTikgMSwgRkFMU0UpOworCisgIC8qIEV4cGFuZCB0aGUgY29sb3JtYXAgaW5kZXhlcyB0byByZWFsIGRhdGEgKi8KKyAgaW5wdHIgPSBpbWFnZV9wdHJbMF07CisgIG91dHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgdCA9IEdFVEpTQU1QTEUoKmlucHRyKyspOworICAgICpvdXRwdHIrKyA9IGNvbG9ybWFwWzBdW3RdOwkvKiBjYW4gb21pdCBHRVRKU0FNUExFKCkgc2FmZWx5ICovCisgICAgKm91dHB0cisrID0gY29sb3JtYXBbMV1bdF07CisgICAgKm91dHB0cisrID0gY29sb3JtYXBbMl1bdF07CisgIH0KKworICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF8yNGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDI0LWJpdCBwaXhlbHMgKi8KK3sKKyAgYm1wX3NvdXJjZV9wdHIgc291cmNlID0gKGJtcF9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIC8qIEZldGNoIG5leHQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLworICBzb3VyY2UtPnNvdXJjZV9yb3ctLTsKKyAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBzb3VyY2UtPndob2xlX2ltYWdlLAorICAgICBzb3VyY2UtPnNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisKKyAgLyogVHJhbnNmZXIgZGF0YS4gIE5vdGUgc291cmNlIHZhbHVlcyBhcmUgaW4gQkdSIG9yZGVyCisgICAqIChldmVuIHRob3VnaCBNaWNyb3NvZnQncyBvd24gZG9jdW1lbnRzIHNheSB0aGUgb3Bwb3NpdGUpLgorICAgKi8KKyAgaW5wdHIgPSBpbWFnZV9wdHJbMF07CisgIG91dHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgb3V0cHRyWzJdID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KKyAgICBvdXRwdHJbMV0gPSAqaW5wdHIrKzsKKyAgICBvdXRwdHJbMF0gPSAqaW5wdHIrKzsKKyAgICBvdXRwdHIgKz0gMzsKKyAgfQorCisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBUaGlzIG1ldGhvZCBsb2FkcyB0aGUgaW1hZ2UgaW50byB3aG9sZV9pbWFnZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgb24KKyAqIGdldF9waXhlbF9yb3dzLiAgVGhlIGdldF9waXhlbF9yb3dzIHBvaW50ZXIgaXMgdGhlbiBhZGp1c3RlZCB0byBjYWxsCisgKiBnZXRfOGJpdF9yb3cgb3IgZ2V0XzI0Yml0X3JvdyBvbiBzdWJzZXF1ZW50IGNhbGxzLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorcHJlbG9hZF9pbWFnZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIGludCBjOworICByZWdpc3RlciBKU0FNUFJPVyBvdXRfcHRyOworICBKU0FNUEFSUkFZIGltYWdlX3B0cjsKKyAgSkRJTUVOU0lPTiByb3csIGNvbDsKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworCisgIC8qIFJlYWQgdGhlIGRhdGEgaW50byBhIHZpcnR1YWwgYXJyYXkgaW4gaW5wdXQtZmlsZSByb3cgb3JkZXIuICovCisgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKKyAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgcm93OworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICB9CisgICAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCisgICAgICAgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgICAgb3V0X3B0ciA9IGltYWdlX3B0clswXTsKKyAgICBmb3IgKGNvbCA9IHNvdXJjZS0+cm93X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICAgLyogaW5saW5lIGNvcHkgb2YgcmVhZF9ieXRlKCkgZm9yIHNwZWVkICovCisgICAgICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKKwlFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgICAgICAqb3V0X3B0cisrID0gKEpTQU1QTEUpIGM7CisgICAgfQorICB9CisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQorICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7CisKKyAgLyogU2V0IHVwIHRvIHJlYWQgZnJvbSB0aGUgdmlydHVhbCBhcnJheSBpbiB0b3AtdG8tYm90dG9tIG9yZGVyICovCisgIHN3aXRjaCAoc291cmNlLT5iaXRzX3Blcl9waXhlbCkgeworICBjYXNlIDg6CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9yb3c7CisgICAgYnJlYWs7CisgIGNhc2UgMjQ6CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfMjRiaXRfcm93OworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRERFUFRIKTsKKyAgfQorICBzb3VyY2UtPnNvdXJjZV9yb3cgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworCisgIC8qIEFuZCByZWFkIHRoZSBmaXJzdCByb3cgKi8KKyAgcmV0dXJuICgqc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MpIChjaW5mbywgc2luZm8pOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X2JtcCAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIGJtcF9zb3VyY2VfcHRyIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikgc2luZm87CisgIFVfQ0hBUiBibXBmaWxlaGVhZGVyWzE0XTsKKyAgVV9DSEFSIGJtcGluZm9oZWFkZXJbNjRdOworI2RlZmluZSBHRVRfMkIoYXJyYXksb2Zmc2V0KSAgKCh1bnNpZ25lZCBpbnQpIFVDSChhcnJheVtvZmZzZXRdKSArIFwKKwkJCSAgICAgICAoKCh1bnNpZ25lZCBpbnQpIFVDSChhcnJheVtvZmZzZXQrMV0pKSA8PCA4KSkKKyNkZWZpbmUgR0VUXzRCKGFycmF5LG9mZnNldCkgICgoSU5UMzIpIFVDSChhcnJheVtvZmZzZXRdKSArIFwKKwkJCSAgICAgICAoKChJTlQzMikgVUNIKGFycmF5W29mZnNldCsxXSkpIDw8IDgpICsgXAorCQkJICAgICAgICgoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0KzJdKSkgPDwgMTYpICsgXAorCQkJICAgICAgICgoKElOVDMyKSBVQ0goYXJyYXlbb2Zmc2V0KzNdKSkgPDwgMjQpKQorICBJTlQzMiBiZk9mZkJpdHM7CisgIElOVDMyIGhlYWRlclNpemU7CisgIElOVDMyIGJpV2lkdGggPSAwOwkJLyogaW5pdGlhbGl6ZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nICovCisgIElOVDMyIGJpSGVpZ2h0ID0gMDsKKyAgdW5zaWduZWQgaW50IGJpUGxhbmVzOworICBJTlQzMiBiaUNvbXByZXNzaW9uOworICBJTlQzMiBiaVhQZWxzUGVyTWV0ZXIsYmlZUGVsc1Blck1ldGVyOworICBJTlQzMiBiaUNsclVzZWQgPSAwOworICBpbnQgbWFwZW50cnlzaXplID0gMDsJCS8qIDAgaW5kaWNhdGVzIG5vIGNvbG9ybWFwICovCisgIElOVDMyIGJQYWQ7CisgIEpESU1FTlNJT04gcm93X3dpZHRoOworCisgIC8qIFJlYWQgYW5kIHZlcmlmeSB0aGUgYml0bWFwIGZpbGUgaGVhZGVyICovCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBibXBmaWxlaGVhZGVyLCAxNCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBpZiAoR0VUXzJCKGJtcGZpbGVoZWFkZXIsMCkgIT0gMHg0RDQyKSAvKiAnQk0nICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfTk9UKTsKKyAgYmZPZmZCaXRzID0gKElOVDMyKSBHRVRfNEIoYm1wZmlsZWhlYWRlciwxMCk7CisgIC8qIFdlIGlnbm9yZSB0aGUgcmVtYWluaW5nIGZpbGVoZWFkZXIgZmllbGRzICovCisKKyAgLyogVGhlIGluZm9oZWFkZXIgbWlnaHQgYmUgMTIgYnl0ZXMgKE9TLzIgMS54KSwgNDAgYnl0ZXMgKFdpbmRvd3MpLAorICAgKiBvciA2NCBieXRlcyAoT1MvMiAyLngpLiAgQ2hlY2sgdGhlIGZpcnN0IDQgYnl0ZXMgdG8gZmluZCBvdXQgd2hpY2guCisgICAqLworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgYm1waW5mb2hlYWRlciwgNCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBoZWFkZXJTaXplID0gKElOVDMyKSBHRVRfNEIoYm1waW5mb2hlYWRlciwwKTsKKyAgaWYgKGhlYWRlclNpemUgPCAxMiB8fCBoZWFkZXJTaXplID4gNjQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFESEVBREVSKTsKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIGJtcGluZm9oZWFkZXIrNCwgaGVhZGVyU2l6ZS00KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisKKyAgc3dpdGNoICgoaW50KSBoZWFkZXJTaXplKSB7CisgIGNhc2UgMTI6CisgICAgLyogRGVjb2RlIE9TLzIgMS54IGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBDT1JFSEVBREVSKSAqLworICAgIGJpV2lkdGggPSAoSU5UMzIpIEdFVF8yQihibXBpbmZvaGVhZGVyLDQpOworICAgIGJpSGVpZ2h0ID0gKElOVDMyKSBHRVRfMkIoYm1waW5mb2hlYWRlciw2KTsKKyAgICBiaVBsYW5lcyA9IEdFVF8yQihibXBpbmZvaGVhZGVyLDgpOworICAgIHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwgPSAoaW50KSBHRVRfMkIoYm1waW5mb2hlYWRlciwxMCk7CisKKyAgICBzd2l0Y2ggKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwpIHsKKyAgICBjYXNlIDg6CQkJLyogY29sb3JtYXBwZWQgaW1hZ2UgKi8KKyAgICAgIG1hcGVudHJ5c2l6ZSA9IDM7CQkvKiBPUy8yIHVzZXMgUkdCVFJJUExFIGNvbG9ybWFwICovCisgICAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19CTVBfT1MyX01BUFBFRCwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoJCQkvKiBSR0IgaW1hZ2UgKi8KKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUF9PUzIsIChpbnQpIGJpV2lkdGgsIChpbnQpIGJpSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURERVBUSCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGJpUGxhbmVzICE9IDEpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9CQURQTEFORVMpOworICAgIGJyZWFrOworICBjYXNlIDQwOgorICBjYXNlIDY0OgorICAgIC8qIERlY29kZSBXaW5kb3dzIDMueCBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQSU5GT0hFQURFUikgKi8KKyAgICAvKiBvciBPUy8yIDIueCBoZWFkZXIsIHdoaWNoIGhhcyBhZGRpdGlvbmFsIGZpZWxkcyB0aGF0IHdlIGlnbm9yZSAqLworICAgIGJpV2lkdGggPSBHRVRfNEIoYm1waW5mb2hlYWRlciw0KTsKKyAgICBiaUhlaWdodCA9IEdFVF80QihibXBpbmZvaGVhZGVyLDgpOworICAgIGJpUGxhbmVzID0gR0VUXzJCKGJtcGluZm9oZWFkZXIsMTIpOworICAgIHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwgPSAoaW50KSBHRVRfMkIoYm1waW5mb2hlYWRlciwxNCk7CisgICAgYmlDb21wcmVzc2lvbiA9IEdFVF80QihibXBpbmZvaGVhZGVyLDE2KTsKKyAgICBiaVhQZWxzUGVyTWV0ZXIgPSBHRVRfNEIoYm1waW5mb2hlYWRlciwyNCk7CisgICAgYmlZUGVsc1Blck1ldGVyID0gR0VUXzRCKGJtcGluZm9oZWFkZXIsMjgpOworICAgIGJpQ2xyVXNlZCA9IEdFVF80QihibXBpbmZvaGVhZGVyLDMyKTsKKyAgICAvKiBiaVNpemVJbWFnZSwgYmlDbHJJbXBvcnRhbnQgZmllbGRzIGFyZSBpZ25vcmVkICovCisKKyAgICBzd2l0Y2ggKHNvdXJjZS0+Yml0c19wZXJfcGl4ZWwpIHsKKyAgICBjYXNlIDg6CQkJLyogY29sb3JtYXBwZWQgaW1hZ2UgKi8KKyAgICAgIG1hcGVudHJ5c2l6ZSA9IDQ7CQkvKiBXaW5kb3dzIHVzZXMgUkdCUVVBRCBjb2xvcm1hcCAqLworICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfQk1QX01BUFBFRCwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoJCQkvKiBSR0IgaW1hZ2UgKi8KKyAgICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX0JNUCwgKGludCkgYmlXaWR0aCwgKGludCkgYmlIZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRERFUFRIKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYmlQbGFuZXMgIT0gMSkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRFBMQU5FUyk7CisgICAgaWYgKGJpQ29tcHJlc3Npb24gIT0gMCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0NPTVBSRVNTRUQpOworCisgICAgaWYgKGJpWFBlbHNQZXJNZXRlciA+IDAgJiYgYmlZUGVsc1Blck1ldGVyID4gMCkgeworICAgICAgLyogU2V0IEpGSUYgZGVuc2l0eSBwYXJhbWV0ZXJzIGZyb20gdGhlIEJNUCBkYXRhICovCisgICAgICBjaW5mby0+WF9kZW5zaXR5ID0gKFVJTlQxNikgKGJpWFBlbHNQZXJNZXRlci8xMDApOyAvKiAxMDAgY20gcGVyIG1ldGVyICovCisgICAgICBjaW5mby0+WV9kZW5zaXR5ID0gKFVJTlQxNikgKGJpWVBlbHNQZXJNZXRlci8xMDApOworICAgICAgY2luZm8tPmRlbnNpdHlfdW5pdCA9IDI7CS8qIGRvdHMvY20gKi8KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFESEVBREVSKTsKKyAgICBicmVhazsKKyAgfQorCisgIC8qIENvbXB1dGUgZGlzdGFuY2UgdG8gYml0bWFwIGRhdGEgLS0tIHdpbGwgYWRqdXN0IGZvciBjb2xvcm1hcCBiZWxvdyAqLworICBiUGFkID0gYmZPZmZCaXRzIC0gKGhlYWRlclNpemUgKyAxNCk7CisKKyAgLyogUmVhZCB0aGUgY29sb3JtYXAsIGlmIGFueSAqLworICBpZiAobWFwZW50cnlzaXplID4gMCkgeworICAgIGlmIChiaUNsclVzZWQgPD0gMCkKKyAgICAgIGJpQ2xyVXNlZCA9IDI1NjsJCS8qIGFzc3VtZSBpdCdzIDI1NiAqLworICAgIGVsc2UgaWYgKGJpQ2xyVXNlZCA+IDI1NikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQk1QX0JBRENNQVApOworICAgIC8qIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHRoZSBjb2xvcm1hcCAqLworICAgIHNvdXJjZS0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pIGJpQ2xyVXNlZCwgKEpESU1FTlNJT04pIDMpOworICAgIC8qIGFuZCByZWFkIGl0IGZyb20gdGhlIGZpbGUgKi8KKyAgICByZWFkX2NvbG9ybWFwKHNvdXJjZSwgKGludCkgYmlDbHJVc2VkLCBtYXBlbnRyeXNpemUpOworICAgIC8qIGFjY291bnQgZm9yIHNpemUgb2YgY29sb3JtYXAgKi8KKyAgICBiUGFkIC09IGJpQ2xyVXNlZCAqIG1hcGVudHJ5c2l6ZTsKKyAgfQorCisgIC8qIFNraXAgYW55IHJlbWFpbmluZyBwYWQgYnl0ZXMgKi8KKyAgaWYgKGJQYWQgPCAwKQkJCS8qIGluY29ycmVjdCBiZk9mZkJpdHMgdmFsdWU/ICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CTVBfQkFESEVBREVSKTsKKyAgd2hpbGUgKC0tYlBhZCA+PSAwKSB7CisgICAgKHZvaWQpIHJlYWRfYnl0ZShzb3VyY2UpOworICB9CisKKyAgLyogQ29tcHV0ZSByb3cgd2lkdGggaW4gZmlsZSwgaW5jbHVkaW5nIHBhZGRpbmcgdG8gNC1ieXRlIGJvdW5kYXJ5ICovCisgIGlmIChzb3VyY2UtPmJpdHNfcGVyX3BpeGVsID09IDI0KQorICAgIHJvd193aWR0aCA9IChKRElNRU5TSU9OKSAoYmlXaWR0aCAqIDMpOworICBlbHNlCisgICAgcm93X3dpZHRoID0gKEpESU1FTlNJT04pIGJpV2lkdGg7CisgIHdoaWxlICgocm93X3dpZHRoICYgMykgIT0gMCkgcm93X3dpZHRoKys7CisgIHNvdXJjZS0+cm93X3dpZHRoID0gcm93X3dpZHRoOworCisgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBpbnZlcnNpb24gYXJyYXksIHByZXBhcmUgZm9yIHByZWxvYWQgcGFzcyAqLworICBzb3VyY2UtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorICAgICByb3dfd2lkdGgsIChKRElNRU5TSU9OKSBiaUhlaWdodCwgKEpESU1FTlNJT04pIDEpOworICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IHByZWxvYWRfaW1hZ2U7CisgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7IC8qIGNvdW50IGZpbGUgaW5wdXQgYXMgc2VwYXJhdGUgcGFzcyAqLworICB9CisKKyAgLyogQWxsb2NhdGUgb25lLXJvdyBidWZmZXIgZm9yIHJldHVybmVkIGRhdGEgKi8KKyAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgKEpESU1FTlNJT04pIChiaVdpZHRoICogMyksIChKRElNRU5TSU9OKSAxKTsKKyAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisKKyAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOworICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSA4OworICBjaW5mby0+aW1hZ2Vfd2lkdGggPSAoSkRJTUVOU0lPTikgYmlXaWR0aDsKKyAgY2luZm8tPmltYWdlX2hlaWdodCA9IChKRElNRU5TSU9OKSBiaUhlaWdodDsKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfaW5wdXRfYm1wIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBCTVAgZm9ybWF0IGlucHV0LgorICovCisKK0dMT0JBTChjanBlZ19zb3VyY2VfcHRyKQoramluaXRfcmVhZF9ibXAgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBibXBfc291cmNlX3B0ciBzb3VyY2U7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCisgIHNvdXJjZSA9IChibXBfc291cmNlX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YoYm1wX3NvdXJjZV9zdHJ1Y3QpKTsKKyAgc291cmNlLT5jaW5mbyA9IGNpbmZvOwkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KKyAgLyogRmlsbCBpbiBtZXRob2QgcHRycywgZXhjZXB0IGdldF9waXhlbF9yb3dzIHdoaWNoIHN0YXJ0X2lucHV0IHNldHMgKi8KKyAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF9ibXA7CisgIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF9ibXA7CisKKyAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Cit9CisKKyNlbmRpZiAvKiBCTVBfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRjb2xtYXAuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGNvbG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYjM0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRjb2xtYXAuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIHJkY29sbWFwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRqcGVnJ3MgIi1tYXAgZmlsZSIgc3dpdGNoLiAgSXQgcmVhZHMgYSBzb3VyY2UgaW1hZ2UKKyAqIGFuZCBjb25zdHJ1Y3RzIGEgY29sb3JtYXAgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIEpQRUcgZGVjb21wcmVzc29yLgorICoKKyAqIEN1cnJlbnRseSwgdGhlc2UgZmlsZSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoZSBtYXAgZmlsZToKKyAqICAgR0lGOiB0aGUgY29udGVudHMgb2YgdGhlIEdJRidzIGdsb2JhbCBjb2xvcm1hcCBhcmUgdXNlZC4KKyAqICAgUFBNIChlaXRoZXIgdGV4dCBvciByYXcgZmxhdm9yKTogdGhlIGVudGlyZSBmaWxlIGlzIHJlYWQgYW5kCisgKiAgICAgIGVhY2ggdW5pcXVlIHBpeGVsIHZhbHVlIGlzIGVudGVyZWQgaW4gdGhlIG1hcC4KKyAqIE5vdGUgdGhhdCByZWFkaW5nIGEgbGFyZ2UgUFBNIGZpbGUgd2lsbCBiZSBob3JyZW5kb3VzbHkgc2xvdy4KKyAqIFR5cGljYWxseSwgYSBQUE0tZm9ybWF0IG1hcCBmaWxlIHNob3VsZCBjb250YWluIGp1c3Qgb25lIHBpeGVsCisgKiBvZiBlYWNoIGRlc2lyZWQgY29sb3IuICBTdWNoIGEgZmlsZSBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYW4KKyAqIG9yZGluYXJ5IGltYWdlIFBQTSBmaWxlIHdpdGggcHBtdG9tYXAoMSkuCisgKgorICogUmVzY2FsaW5nIGEgUFBNIHRoYXQgaGFzIGEgbWF4dmFsIHVuZXF1YWwgdG8gTUFYSlNBTVBMRSBpcyBub3QKKyAqIGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECS8qIG90aGVyd2lzZSBjYW4ndCBxdWFudGl6ZSB0byBzdXBwbGllZCBtYXAgKi8KKworLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KKyoqCisqKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisqKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisqKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgorKiogaW1wbGllZCB3YXJyYW50eS4KKyovCisKKworLyoKKyAqIEFkZCBhIChwb3RlbnRpYWxseSkgbmV3IGNvbG9yIHRvIHRoZSBjb2xvciBtYXAuCisgKi8KKworTE9DQUwodm9pZCkKK2FkZF9tYXBfZW50cnkgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCBSLCBpbnQgRywgaW50IEIpCit7CisgIEpTQU1QUk9XIGNvbG9ybWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKKyAgSlNBTVBST1cgY29sb3JtYXAxID0gY2luZm8tPmNvbG9ybWFwWzFdOworICBKU0FNUFJPVyBjb2xvcm1hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07CisgIGludCBuY29sb3JzID0gY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzOworICBpbnQgaW5kZXg7CisKKyAgLyogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBjb2xvci4gKi8KKyAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmNvbG9yczsgaW5kZXgrKykgeworICAgIGlmIChHRVRKU0FNUExFKGNvbG9ybWFwMFtpbmRleF0pID09IFIgJiYKKwlHRVRKU0FNUExFKGNvbG9ybWFwMVtpbmRleF0pID09IEcgJiYKKwlHRVRKU0FNUExFKGNvbG9ybWFwMltpbmRleF0pID09IEIpCisgICAgICByZXR1cm47CQkJLyogY29sb3IgaXMgYWxyZWFkeSBpbiBtYXAgKi8KKyAgfQorCisgIC8qIENoZWNrIGZvciBtYXAgb3ZlcmZsb3cuICovCisgIGlmIChuY29sb3JzID49IChNQVhKU0FNUExFKzEpKQorICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1FVQU5UX01BTllfQ09MT1JTLCAoTUFYSlNBTVBMRSsxKSk7CisKKyAgLyogT0ssIGFkZCBjb2xvciB0byBtYXAuICovCisgIGNvbG9ybWFwMFtuY29sb3JzXSA9IChKU0FNUExFKSBSOworICBjb2xvcm1hcDFbbmNvbG9yc10gPSAoSlNBTVBMRSkgRzsKKyAgY29sb3JtYXAyW25jb2xvcnNdID0gKEpTQU1QTEUpIEI7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycysrOworfQorCisKKy8qCisgKiBFeHRyYWN0IGNvbG9yIG1hcCBmcm9tIGEgR0lGIGZpbGUuCisgKi8KKworTE9DQUwodm9pZCkKK3JlYWRfZ2lmX21hcCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRklMRSAqIGluZmlsZSkKK3sKKyAgaW50IGhlYWRlclsxM107CisgIGludCBpLCBjb2xvcm1hcGxlbjsKKyAgaW50IFIsIEcsIEI7CisKKyAgLyogSW5pdGlhbCAnRycgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCisgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIEdJRiBoZWFkZXIgYW5kIGxvZ2ljYWwgc2NyZWVuIGRlc2NyaXB0b3IgKi8KKyAgZm9yIChpID0gMTsgaSA8IDEzOyBpKyspIHsKKyAgICBpZiAoKGhlYWRlcltpXSA9IGdldGMoaW5maWxlKSkgPT0gRU9GKQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgfQorCisgIC8qIFZlcmlmeSBHSUYgSGVhZGVyICovCisgIGlmIChoZWFkZXJbMV0gIT0gJ0knIHx8IGhlYWRlclsyXSAhPSAnRicpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKworICAvKiBUaGVyZSBtdXN0IGJlIGEgZ2xvYmFsIGNvbG9yIG1hcC4gKi8KKyAgaWYgKChoZWFkZXJbMTBdICYgMHg4MCkgPT0gMCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworCisgIC8qIE9LLCBmZXRjaCBpdC4gKi8KKyAgY29sb3JtYXBsZW4gPSAyIDw8IChoZWFkZXJbMTBdICYgMHgwNyk7CisKKyAgZm9yIChpID0gMDsgaSA8IGNvbG9ybWFwbGVuOyBpKyspIHsKKyAgICBSID0gZ2V0YyhpbmZpbGUpOworICAgIEcgPSBnZXRjKGluZmlsZSk7CisgICAgQiA9IGdldGMoaW5maWxlKTsKKyAgICBpZiAoUiA9PSBFT0YgfHwgRyA9PSBFT0YgfHwgQiA9PSBFT0YpCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICAgIGFkZF9tYXBfZW50cnkoY2luZm8sCisJCSAgUiA8PCAoQklUU19JTl9KU0FNUExFLTgpLAorCQkgIEcgPDwgKEJJVFNfSU5fSlNBTVBMRS04KSwKKwkJICBCIDw8IChCSVRTX0lOX0pTQU1QTEUtOCkpOworICB9Cit9CisKKworLyogU3VwcG9ydCByb3V0aW5lcyBmb3IgcmVhZGluZyBQUE0gKi8KKworCitMT0NBTChpbnQpCitwYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKKy8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLworLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKyAgCisgIGNoID0gZ2V0YyhpbmZpbGUpOworICBpZiAoY2ggPT0gJyMnKSB7CisgICAgZG8geworICAgICAgY2ggPSBnZXRjKGluZmlsZSk7CisgICAgfSB3aGlsZSAoY2ggIT0gJ1xuJyAmJiBjaCAhPSBFT0YpOworICB9CisgIHJldHVybiBjaDsKK30KKworCitMT0NBTCh1bnNpZ25lZCBpbnQpCityZWFkX3BibV9pbnRlZ2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQorLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSB0aGUgUFBNIGZpbGUgKi8KKy8qIFN3YWxsb3dzIG9uZSB0cmFpbGluZyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGludGVnZXIgKi8KKy8qIE5vdGUgdGhhdCBvbiBhIDE2LWJpdC1pbnQgbWFjaGluZSwgb25seSB2YWx1ZXMgdXAgdG8gNjRrIGNhbiBiZSByZWFkLiAqLworLyogVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZS4gKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworICByZWdpc3RlciB1bnNpZ25lZCBpbnQgdmFsOworICAKKyAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIGRvIHsKKyAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7CisgICAgaWYgKGNoID09IEVPRikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisgIH0gd2hpbGUgKGNoID09ICcgJyB8fCBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyk7CisgIAorICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKyAgCisgIHZhbCA9IGNoIC0gJzAnOworICB3aGlsZSAoKGNoID0gcGJtX2dldGMoaW5maWxlKSkgPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgIHZhbCAqPSAxMDsKKyAgICB2YWwgKz0gY2ggLSAnMCc7CisgIH0KKyAgcmV0dXJuIHZhbDsKK30KKworCisvKgorICogRXh0cmFjdCBjb2xvciBtYXAgZnJvbSBhIFBQTSBmaWxlLgorICovCisKK0xPQ0FMKHZvaWQpCityZWFkX3BwbV9tYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCit7CisgIGludCBjOworICB1bnNpZ25lZCBpbnQgdywgaCwgbWF4dmFsLCByb3csIGNvbDsKKyAgaW50IFIsIEcsIEI7CisKKyAgLyogSW5pdGlhbCAnUCcgaGFzIGFscmVhZHkgYmVlbiByZWFkIGJ5IHJlYWRfY29sb3JfbWFwICovCisgIGMgPSBnZXRjKGluZmlsZSk7CQkvKiBzYXZlIGZvcm1hdCBkaXNjcmltaW5hdG9yIGZvciBhIHNlYyAqLworCisgIC8qIHdoaWxlIHdlIGZldGNoIHRoZSByZW1haW5pbmcgaGVhZGVyIGluZm8gKi8KKyAgdyA9IHJlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSk7CisgIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworICBtYXh2YWwgPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpOworCisgIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8IG1heHZhbCA8PSAwKSAvKiBlcnJvciBjaGVjayAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisKKyAgLyogRm9yIG5vdywgd2UgZG9uJ3Qgc3VwcG9ydCByZXNjYWxpbmcgZnJvbSBhbiB1bnVzdWFsIG1heHZhbC4gKi8KKyAgaWYgKG1heHZhbCAhPSAodW5zaWduZWQgaW50KSBNQVhKU0FNUExFKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0NNQVBfRklMRSk7CisKKyAgc3dpdGNoIChjKSB7CisgIGNhc2UgJzMnOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQUE0gZmlsZSAqLworICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93KyspIHsKKyAgICAgIGZvciAoY29sID0gMDsgY29sIDwgdzsgY29sKyspIHsKKwlSID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKwlHID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKwlCID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKTsKKwlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrKSB7CisgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IHc7IGNvbCsrKSB7CisJUiA9IGdldGMoaW5maWxlKTsKKwlHID0gZ2V0YyhpbmZpbGUpOworCUIgPSBnZXRjKGluZmlsZSk7CisJaWYgKFIgPT0gRU9GIHx8IEcgPT0gRU9GIHx8IEIgPT0gRU9GKQorCSAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQ01BUF9GSUxFKTsKKwlhZGRfbWFwX2VudHJ5KGNpbmZvLCBSLCBHLCBCKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICAgIGJyZWFrOworICB9Cit9CisKKworLyoKKyAqIE1haW4gZW50cnkgcG9pbnQgZnJvbSBkanBlZy5jLgorICogIElucHV0OiBvcGVuZWQgaW5wdXQgZmlsZSAoZnJvbSBmaWxlIG5hbWUgYXJndW1lbnQgb24gY29tbWFuZCBsaW5lKS4KKyAqICBPdXRwdXQ6IGNvbG9ybWFwIGFuZCBhY3R1YWxfbnVtYmVyX29mX2NvbG9ycyBmaWVsZHMgYXJlIHNldCBpbiBjaW5mby4KKyAqLworCitHTE9CQUwodm9pZCkKK3JlYWRfY29sb3JfbWFwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBGSUxFICogaW5maWxlKQoreworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBjb2xvciBtYXAgb2YgbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZS4gKi8KKyAgY2luZm8tPmNvbG9ybWFwID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgKEpESU1FTlNJT04pIChNQVhKU0FNUExFKzEpLCAoSkRJTUVOU0lPTikgMyk7CisgIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyA9IDA7IC8qIGluaXRpYWxpemUgbWFwIHRvIGVtcHR5ICovCisKKyAgLyogUmVhZCBmaXJzdCBieXRlIHRvIGRldGVybWluZSBmaWxlIGZvcm1hdCAqLworICBzd2l0Y2ggKGdldGMoaW5maWxlKSkgeworICBjYXNlICdHJzoKKyAgICByZWFkX2dpZl9tYXAoY2luZm8sIGluZmlsZSk7CisgICAgYnJlYWs7CisgIGNhc2UgJ1AnOgorICAgIHJlYWRfcHBtX21hcChjaW5mbywgaW5maWxlKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9DTUFQX0ZJTEUpOworICAgIGJyZWFrOworICB9Cit9CisKKyNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGdpZi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkZ2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3YzE2NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGdpZi5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiByZGdpZi5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gR0lGIGZvcm1hdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5PVEU6IHRvIGF2b2lkIGVudGFuZ2xlbWVudHMgd2l0aCBVbmlzeXMnIHBhdGVudCBvbiBMWlcgY29tcHJlc3Npb24sICAgICAgKgorICogdGhlIGFiaWxpdHkgdG8gcmVhZCBHSUYgZmlsZXMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJSkcgZGlzdHJpYnV0aW9uLiAqCisgKiBTb3JyeSBhYm91dCB0aGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFdlIGFyZSByZXF1aXJlZCB0byBzdGF0ZSB0aGF0CisgKiAgICAiVGhlIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdChjKSBpcyB0aGUgQ29weXJpZ2h0IHByb3BlcnR5IG9mCisgKiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4gR0lGKHNtKSBpcyBhIFNlcnZpY2UgTWFyayBwcm9wZXJ0eSBvZgorICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBHSUZfU1VQUE9SVEVECisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBHSUYgZm9ybWF0IGlucHV0LgorICovCisKK0dMT0JBTChjanBlZ19zb3VyY2VfcHRyKQoramluaXRfcmVhZF9naWYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBpbnB1dCBpcyB1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4gIFNvcnJ5LlxuIik7CisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgcmV0dXJuIE5VTEw7CQkJLyoga2VlcCBjb21waWxlciBoYXBweSAqLworfQorCisjZW5kaWYgLyogR0lGX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkanBnY29tLjEgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRqcGdjb20uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmJhMDRlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkanBnY29tLjEKQEAgLTAsMCArMSw1NCBAQAorLlRIIFJESlBHQ09NIDEgIjExIE9jdG9iZXIgMTk5NyIKKy5TSCBOQU1FCityZGpwZ2NvbSBcLSBkaXNwbGF5IHRleHQgY29tbWVudHMgZnJvbSBhIEpQRUcgZmlsZQorLlNIIFNZTk9QU0lTCisuQiByZGpwZ2NvbQorWworLkIgXC12ZXJib3NlCitdCitbCisuSSBmaWxlbmFtZQorXQorLkxQCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgcmRqcGdjb20KK3JlYWRzIHRoZSBuYW1lZCBKUEVHL0pGSUYgZmlsZSwgb3IgdGhlIHN0YW5kYXJkIGlucHV0IGlmIG5vIGZpbGUgaXMgbmFtZWQsCithbmQgcHJpbnRzIGFueSB0ZXh0IGNvbW1lbnRzIGZvdW5kIGluIHRoZSBmaWxlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisuUFAKK1RoZSBKUEVHIHN0YW5kYXJkIGFsbG93cyAiY29tbWVudCIgKENPTSkgYmxvY2tzIHRvIG9jY3VyIHdpdGhpbiBhIEpQRUcgZmlsZS4KK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBkb2Vzbid0IGFjdHVhbGx5IGRlZmluZSB3aGF0IENPTSBibG9ja3MgYXJlIGZvciwgdGhleQorYXJlIHdpZGVseSB1c2VkIHRvIGhvbGQgdXNlci1zdXBwbGllZCB0ZXh0IHN0cmluZ3MuICBUaGlzIGxldHMgeW91IGFkZAorYW5ub3RhdGlvbnMsIHRpdGxlcywgaW5kZXggdGVybXMsIGV0YyB0byB5b3VyIEpQRUcgZmlsZXMsIGFuZCBsYXRlciByZXRyaWV2ZQordGhlbSBhcyB0ZXh0LiAgQ09NIGJsb2NrcyBkbyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIGltYWdlIHN0b3JlZCBpbiB0aGUgSlBFRworZmlsZS4gIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBDT00gYmxvY2sgaXMgNjRLLCBidXQgeW91IGNhbiBoYXZlIGFzIG1hbnkgb2YKK3RoZW0gYXMgeW91IGxpa2UgaW4gb25lIEpQRUcgZmlsZS4KKy5TSCBPUFRJT05TCisuVFAKKy5CIFwtdmVyYm9zZQorQ2F1c2VzCisuQiByZGpwZ2NvbQordG8gYWxzbyBkaXNwbGF5IHRoZSBKUEVHIGltYWdlIGRpbWVuc2lvbnMuCisuUFAKK1N3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGFuZCBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLgorLlNIIEhJTlRTCisuQiByZGpwZ2NvbQorZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBJSkcgSlBFRyBsaWJyYXJ5LiAgSXRzIHNvdXJjZSBjb2RlIGlzIGludGVuZGVkIGFzIGFuCitpbGx1c3RyYXRpb24gb2YgdGhlIG1pbmltdW0gYW1vdW50IG9mIGNvZGUgcmVxdWlyZWQgdG8gcGFyc2UgYSBKUEVHIGZpbGUKK2hlYWRlciBjb3JyZWN0bHkuCisuUFAKK0luCisuQiBcLXZlcmJvc2UKK21vZGUsCisuQiByZGpwZ2NvbQord2lsbCBhbHNvIGF0dGVtcHQgdG8gcHJpbnQgdGhlIGNvbnRlbnRzIG9mIGFueSAiQVBQMTIiIG1hcmtlcnMgYXMgdGV4dC4KK1NvbWUgZGlnaXRhbCBjYW1lcmFzIHByb2R1Y2UgQVBQMTIgbWFya2VycyBjb250YWluaW5nIHVzZWZ1bCB0ZXh0dWFsCitpbmZvcm1hdGlvbi4gIElmIHlvdSBsaWtlLCB5b3UgY2FuIG1vZGlmeSB0aGUgc291cmNlIGNvZGUgdG8gcHJpbnQKK290aGVyIEFQUG4gbWFya2VyIHR5cGVzIGFzIHdlbGwuCisuU0ggU0VFIEFMU08KKy5CUiBjanBlZyAoMSksCisuQlIgZGpwZWcgKDEpLAorLkJSIGpwZWd0cmFuICgxKSwKKy5CUiB3cmpwZ2NvbSAoMSkKKy5TSCBBVVRIT1IKK0luZGVwZW5kZW50IEpQRUcgR3JvdXAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGpwZ2NvbS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkanBnY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlNmZjNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZGpwZ2NvbS5jCkBAIC0wLDAgKzEsNDk2IEBACisvKgorICogcmRqcGdjb20uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gdGhhdCBkaXNwbGF5cworICogdGhlIHRleHQgaW4gQ09NIChjb21tZW50KSBtYXJrZXJzIGluIGEgSkZJRiBmaWxlLgorICogVGhpcyBtYXkgYmUgdXNlZnVsIGFzIGFuIGV4YW1wbGUgb2YgdGhlIG1pbmltdW0gbG9naWMgbmVlZGVkIHRvIHBhcnNlCisgKiBKUEVHIG1hcmtlcnMuCisgKi8KKworI2RlZmluZSBKUEVHX0NKUEVHX0RKUEVHCS8qIHRvIGdldCB0aGUgY29tbWFuZC1saW5lIGNvbmZpZyBzeW1ib2xzICovCisjaW5jbHVkZSAiamluY2x1ZGUuaCIJCS8qIGdldCBhdXRvLWNvbmZpZyBzeW1ib2xzLCA8c3RkaW8uaD4gKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CQkvKiB0byBkZWNsYXJlIGlzdXBwZXIoKSwgdG9sb3dlcigpICovCisjaWZkZWYgVVNFX1NFVE1PREUKKyNpbmNsdWRlIDxmY250bC5oPgkJLyogdG8gZGVjbGFyZSBzZXRtb2RlKCkncyBwYXJhbWV0ZXIgbWFjcm9zICovCisvKiBJZiB5b3UgaGF2ZSBzZXRtb2RlKCkgYnV0IG5vdCA8aW8uaD4sIGp1c3QgZGVsZXRlIHRoaXMgbGluZTogKi8KKyNpbmNsdWRlIDxpby5oPgkJCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpICovCisjZW5kaWYKKworI2lmZGVmIFVTRV9DQ09NTUFORAkJLyogY29tbWFuZC1saW5lIHJlYWRlciBmb3IgTWFjaW50b3NoICovCisjaWZkZWYgX19NV0VSS1NfXworI2luY2x1ZGUgPFNJT1VYLmg+ICAgICAgICAgICAgICAvKiBNZXRyb3dlcmtzIG5lZWRzIHRoaXMgKi8KKyNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiAuLi4gYW5kIHRoaXMgKi8KKyNlbmRpZgorI2lmZGVmIFRISU5LX0MKKyNpbmNsdWRlIDxjb25zb2xlLmg+CQkvKiBUaGluayBkZWNsYXJlcyBpdCBoZXJlICovCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCisjZGVmaW5lIFJFQURfQklOQVJZCSJyIgorI2Vsc2UKKyNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKKyNlbHNlCQkJCS8qIHN0YW5kYXJkIEFOU0ktY29tcGxpYW50IGNhc2UgKi8KKyNkZWZpbmUgUkVBRF9CSU5BUlkJInJiIgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCisjZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQorI2VuZGlmCisjaWZuZGVmIEVYSVRfU1VDQ0VTUworI2lmZGVmIFZNUworI2RlZmluZSBFWElUX1NVQ0NFU1MgIDEJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCisjZWxzZQorI2RlZmluZSBFWElUX1NVQ0NFU1MgIDAKKyNlbmRpZgorI2VuZGlmCisKKworLyoKKyAqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byByZWFkIHRoZSBpbnB1dCBmaWxlLgorICogVG8gcmV1c2UgdGhpcyBjb2RlIGluIGFub3RoZXIgYXBwbGljYXRpb24sIHlvdSBtaWdodCBuZWVkIHRvIGNoYW5nZSB0aGVzZS4KKyAqLworCitzdGF0aWMgRklMRSAqIGluZmlsZTsJCS8qIGlucHV0IEpQRUcgZmlsZSAqLworCisvKiBSZXR1cm4gbmV4dCBpbnB1dCBieXRlLCBvciBFT0YgaWYgbm8gbW9yZSAqLworI2RlZmluZSBORVhUQllURSgpICBnZXRjKGluZmlsZSkKKworCisvKiBFcnJvciBleGl0IGhhbmRsZXIgKi8KKyNkZWZpbmUgRVJSRVhJVChtc2cpICAoZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKSwgZXhpdChFWElUX0ZBSUxVUkUpKQorCisKKy8qIFJlYWQgb25lIGJ5dGUsIHRlc3RpbmcgZm9yIEVPRiAqLworc3RhdGljIGludAorcmVhZF8xX2J5dGUgKHZvaWQpCit7CisgIGludCBjOworCisgIGMgPSBORVhUQllURSgpOworICBpZiAoYyA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIFJlYWQgMiBieXRlcywgY29udmVydCB0byB1bnNpZ25lZCBpbnQgKi8KKy8qIEFsbCAyLWJ5dGUgcXVhbnRpdGllcyBpbiBKUEVHIG1hcmtlcnMgYXJlIE1TQiBmaXJzdCAqLworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8yX2J5dGVzICh2b2lkKQoreworICBpbnQgYzEsIGMyOworCisgIGMxID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMxID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICBjMiA9IE5FWFRCWVRFKCk7CisgIGlmIChjMiA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkgYzEpIDw8IDgpICsgKCh1bnNpZ25lZCBpbnQpIGMyKTsKK30KKworCisvKgorICogSlBFRyBtYXJrZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgMHhGRiBieXRlcywgZm9sbG93ZWQgYnkgYSBtYXJrZXIKKyAqIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKKyAqIGluIHRoaXMgcHJvZ3JhbS4gIChTZWUgamRtYXJrZXIuYyBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3QuKQorICovCisKKyNkZWZpbmUgTV9TT0YwICAweEMwCQkvKiBTdGFydCBPZiBGcmFtZSBOICovCisjZGVmaW5lIE1fU09GMSAgMHhDMQkJLyogTiBpbmRpY2F0ZXMgd2hpY2ggY29tcHJlc3Npb24gcHJvY2VzcyAqLworI2RlZmluZSBNX1NPRjIgIDB4QzIJCS8qIE9ubHkgU09GMC1TT0YyIGFyZSBub3cgaW4gY29tbW9uIHVzZSAqLworI2RlZmluZSBNX1NPRjMgIDB4QzMKKyNkZWZpbmUgTV9TT0Y1ICAweEM1CQkvKiBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMgKi8KKyNkZWZpbmUgTV9TT0Y2ICAweEM2CisjZGVmaW5lIE1fU09GNyAgMHhDNworI2RlZmluZSBNX1NPRjkgIDB4QzkKKyNkZWZpbmUgTV9TT0YxMCAweENBCisjZGVmaW5lIE1fU09GMTEgMHhDQgorI2RlZmluZSBNX1NPRjEzIDB4Q0QKKyNkZWZpbmUgTV9TT0YxNCAweENFCisjZGVmaW5lIE1fU09GMTUgMHhDRgorI2RlZmluZSBNX1NPSSAgIDB4RDgJCS8qIFN0YXJ0IE9mIEltYWdlIChiZWdpbm5pbmcgb2YgZGF0YXN0cmVhbSkgKi8KKyNkZWZpbmUgTV9FT0kgICAweEQ5CQkvKiBFbmQgT2YgSW1hZ2UgKGVuZCBvZiBkYXRhc3RyZWFtKSAqLworI2RlZmluZSBNX1NPUyAgIDB4REEJCS8qIFN0YXJ0IE9mIFNjYW4gKGJlZ2lucyBjb21wcmVzc2VkIGRhdGEpICovCisjZGVmaW5lIE1fQVBQMAkweEUwCQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBtYXJrZXIsIHR5cGUgTiAqLworI2RlZmluZSBNX0FQUDEyCTB4RUMJCS8qICh3ZSBkb24ndCBib3RoZXIgdG8gbGlzdCBhbGwgMTYgQVBQbidzKSAqLworI2RlZmluZSBNX0NPTSAgIDB4RkUJCS8qIENPTW1lbnQgKi8KKworCisvKgorICogRmluZCB0aGUgbmV4dCBKUEVHIG1hcmtlciBhbmQgcmV0dXJuIGl0cyBtYXJrZXIgY29kZS4KKyAqIFdlIGV4cGVjdCBhdCBsZWFzdCBvbmUgRkYgYnl0ZSwgcG9zc2libHkgbW9yZSBpZiB0aGUgY29tcHJlc3NvciB1c2VkIEZGcworICogdG8gcGFkIHRoZSBmaWxlLgorICogVGhlcmUgY291bGQgYWxzbyBiZSBub24tRkYgZ2FyYmFnZSBiZXR3ZWVuIG1hcmtlcnMuICBUaGUgdHJlYXRtZW50IG9mIHN1Y2gKKyAqIGdhcmJhZ2UgaXMgdW5zcGVjaWZpZWQ7IHdlIGNob29zZSB0byBza2lwIG92ZXIgaXQgYnV0IGVtaXQgYSB3YXJuaW5nIG1zZy4KKyAqIE5COiB0aGlzIHJvdXRpbmUgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBzZWVpbmcgU09TIG1hcmtlciwgc2luY2UgaXQgd2lsbAorICogbm90IGRlYWwgY29ycmVjdGx5IHdpdGggRkYvMDAgc2VxdWVuY2VzIGluIHRoZSBjb21wcmVzc2VkIGltYWdlIGRhdGEuLi4KKyAqLworCitzdGF0aWMgaW50CituZXh0X21hcmtlciAodm9pZCkKK3sKKyAgaW50IGM7CisgIGludCBkaXNjYXJkZWRfYnl0ZXMgPSAwOworCisgIC8qIEZpbmQgMHhGRiBieXRlOyBjb3VudCBhbmQgc2tpcCBhbnkgbm9uLUZGcy4gKi8KKyAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIHdoaWxlIChjICE9IDB4RkYpIHsKKyAgICBkaXNjYXJkZWRfYnl0ZXMrKzsKKyAgICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgfQorICAvKiBHZXQgbWFya2VyIGNvZGUgYnl0ZSwgc3dhbGxvd2luZyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzCisgICAqIGFyZSBsZWdhbCBhcyBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLgorICAgKi8KKyAgZG8geworICAgIGMgPSByZWFkXzFfYnl0ZSgpOworICB9IHdoaWxlIChjID09IDB4RkYpOworCisgIGlmIChkaXNjYXJkZWRfYnl0ZXMgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZ2FyYmFnZSBkYXRhIGZvdW5kIGluIEpQRUcgZmlsZVxuIik7CisgIH0KKworICByZXR1cm4gYzsKK30KKworCisvKgorICogUmVhZCB0aGUgaW5pdGlhbCBtYXJrZXIsIHdoaWNoIHNob3VsZCBiZSBTT0kuCisgKiBGb3IgYSBKRklGIGZpbGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGxpdGVyYWxseQorICogMHhGRiBNX1NPSS4gIFRvIGJlIG1vcmUgZ2VuZXJhbCwgd2UgY291bGQgdXNlIG5leHRfbWFya2VyLCBidXQgaWYgdGhlCisgKiBpbnB1dCBmaWxlIHdlcmVuJ3QgYWN0dWFsbHkgSlBFRyBhdCBhbGwsIG5leHRfbWFya2VyIG1pZ2h0IHJlYWQgdGhlIHdob2xlCisgKiBmaWxlIGFuZCB0aGVuIHJldHVybiBhIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZS4uLgorICovCisKK3N0YXRpYyBpbnQKK2ZpcnN0X21hcmtlciAodm9pZCkKK3sKKyAgaW50IGMxLCBjMjsKKworICBjMSA9IE5FWFRCWVRFKCk7CisgIGMyID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMxICE9IDB4RkYgfHwgYzIgIT0gTV9TT0kpCisgICAgRVJSRVhJVCgiTm90IGEgSlBFRyBmaWxlIik7CisgIHJldHVybiBjMjsKK30KKworCisvKgorICogTW9zdCB0eXBlcyBvZiBtYXJrZXIgYXJlIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUtbGVuZ3RoIHBhcmFtZXRlciBzZWdtZW50LgorICogVGhpcyByb3V0aW5lIHNraXBzIG92ZXIgdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBtYXJrZXIgd2UgZG9uJ3Qgb3RoZXJ3aXNlCisgKiB3YW50IHRvIHByb2Nlc3MuCisgKiBOb3RlIHRoYXQgd2UgTVVTVCBza2lwIHRoZSBwYXJhbWV0ZXIgc2VnbWVudCBleHBsaWNpdGx5IGluIG9yZGVyIG5vdCB0bworICogYmUgZm9vbGVkIGJ5IDB4RkYgYnl0ZXMgdGhhdCBtaWdodCBhcHBlYXIgd2l0aGluIHRoZSBwYXJhbWV0ZXIgc2VnbWVudDsKKyAqIHN1Y2ggYnl0ZXMgZG8gTk9UIGludHJvZHVjZSBuZXcgbWFya2Vycy4KKyAqLworCitzdGF0aWMgdm9pZAorc2tpcF92YXJpYWJsZSAodm9pZCkKKy8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLworeworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KKyAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CisgIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLworICBpZiAobGVuZ3RoIDwgMikKKyAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7CisgIGxlbmd0aCAtPSAyOworICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOworICAgIGxlbmd0aC0tOworICB9Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYSBDT00gbWFya2VyLgorICogV2Ugd2FudCB0byBwcmludCBvdXQgdGhlIG1hcmtlciBjb250ZW50cyBhcyBsZWdpYmxlIHRleHQ7CisgKiB3ZSBtdXN0IGd1YXJkIGFnYWluc3Qgbm9uLXRleHQganVuayBhbmQgdmFyeWluZyBuZXdsaW5lIHJlcHJlc2VudGF0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZAorcHJvY2Vzc19DT00gKHZvaWQpCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgIGludCBjaDsKKyAgaW50IGxhc3RjaCA9IDA7CisKKyAgLyogR2V0IHRoZSBtYXJrZXIgcGFyYW1ldGVyIGxlbmd0aCBjb3VudCAqLworICBsZW5ndGggPSByZWFkXzJfYnl0ZXMoKTsKKyAgLyogTGVuZ3RoIGluY2x1ZGVzIGl0c2VsZiwgc28gbXVzdCBiZSBhdCBsZWFzdCAyICovCisgIGlmIChsZW5ndGggPCAyKQorICAgIEVSUkVYSVQoIkVycm9uZW91cyBKUEVHIG1hcmtlciBsZW5ndGgiKTsKKyAgbGVuZ3RoIC09IDI7CisKKyAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICBjaCA9IHJlYWRfMV9ieXRlKCk7CisgICAgLyogRW1pdCB0aGUgY2hhcmFjdGVyIGluIGEgcmVhZGFibGUgZm9ybS4KKyAgICAgKiBOb25wcmludGFibGVzIGFyZSBjb252ZXJ0ZWQgdG8gXG5ubiBmb3JtLAorICAgICAqIHdoaWxlIFwgaXMgY29udmVydGVkIHRvIFxcLgorICAgICAqIE5ld2xpbmVzIGluIENSLCBDUi9MRiwgb3IgTEYgZm9ybSB3aWxsIGJlIHByaW50ZWQgYXMgb25lIG5ld2xpbmUuCisgICAgICovCisgICAgaWYgKGNoID09ICdccicpIHsKKyAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgIGlmIChsYXN0Y2ggIT0gJ1xyJykKKwlwcmludGYoIlxuIik7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICBwcmludGYoIlxcXFwiKTsKKyAgICB9IGVsc2UgaWYgKGlzcHJpbnQoY2gpKSB7CisgICAgICBwdXRjKGNoLCBzdGRvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIlxcJTAzbyIsIGNoKTsKKyAgICB9CisgICAgbGFzdGNoID0gY2g7CisgICAgbGVuZ3RoLS07CisgIH0KKyAgcHJpbnRmKCJcbiIpOworfQorCisKKy8qCisgKiBQcm9jZXNzIGEgU09GbiBtYXJrZXIuCisgKiBUaGlzIGNvZGUgaXMgb25seSBuZWVkZWQgaWYgeW91IHdhbnQgdG8ga25vdyB0aGUgaW1hZ2UgZGltZW5zaW9ucy4uLgorICovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX1NPRm4gKGludCBtYXJrZXIpCit7CisgIHVuc2lnbmVkIGludCBsZW5ndGg7CisgIHVuc2lnbmVkIGludCBpbWFnZV9oZWlnaHQsIGltYWdlX3dpZHRoOworICBpbnQgZGF0YV9wcmVjaXNpb24sIG51bV9jb21wb25lbnRzOworICBjb25zdCBjaGFyICogcHJvY2VzczsKKyAgaW50IGNpOworCisgIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOwkvKiB1c3VhbCBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCisKKyAgZGF0YV9wcmVjaXNpb24gPSByZWFkXzFfYnl0ZSgpOworICBpbWFnZV9oZWlnaHQgPSByZWFkXzJfYnl0ZXMoKTsKKyAgaW1hZ2Vfd2lkdGggPSByZWFkXzJfYnl0ZXMoKTsKKyAgbnVtX2NvbXBvbmVudHMgPSByZWFkXzFfYnl0ZSgpOworCisgIHN3aXRjaCAobWFya2VyKSB7CisgIGNhc2UgTV9TT0YwOglwcm9jZXNzID0gIkJhc2VsaW5lIjsgIGJyZWFrOworICBjYXNlIE1fU09GMToJcHJvY2VzcyA9ICJFeHRlbmRlZCBzZXF1ZW50aWFsIjsgIGJyZWFrOworICBjYXNlIE1fU09GMjoJcHJvY2VzcyA9ICJQcm9ncmVzc2l2ZSI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjM6CXByb2Nlc3MgPSAiTG9zc2xlc3MiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0Y1Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBzZXF1ZW50aWFsIjsgIGJyZWFrOworICBjYXNlIE1fU09GNjoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUiOyAgYnJlYWs7CisgIGNhc2UgTV9TT0Y3Oglwcm9jZXNzID0gIkRpZmZlcmVudGlhbCBsb3NzbGVzcyI7ICBicmVhazsKKyAgY2FzZSBNX1NPRjk6CXByb2Nlc3MgPSAiRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YxMDoJcHJvY2VzcyA9ICJQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YxMToJcHJvY2VzcyA9ICJMb3NzbGVzcywgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YxMzoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyBjb2RpbmciOyAgYnJlYWs7CisgIGNhc2UgTV9TT0YxNDoJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgY29kaW5nIjsgYnJlYWs7CisgIGNhc2UgTV9TT0YxNToJcHJvY2VzcyA9ICJEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgY29kaW5nIjsgIGJyZWFrOworICBkZWZhdWx0Oglwcm9jZXNzID0gIlVua25vd24iOyAgYnJlYWs7CisgIH0KKworICBwcmludGYoIkpQRUcgaW1hZ2UgaXMgJXV3ICogJXVoLCAlZCBjb2xvciBjb21wb25lbnRzLCAlZCBiaXRzIHBlciBzYW1wbGVcbiIsCisJIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQsIG51bV9jb21wb25lbnRzLCBkYXRhX3ByZWNpc2lvbik7CisgIHByaW50ZigiSlBFRyBwcm9jZXNzOiAlc1xuIiwgcHJvY2Vzcyk7CisKKyAgaWYgKGxlbmd0aCAhPSAodW5zaWduZWQgaW50KSAoOCArIG51bV9jb21wb25lbnRzICogMykpCisgICAgRVJSRVhJVCgiQm9ndXMgU09GIG1hcmtlciBsZW5ndGgiKTsKKworICBmb3IgKGNpID0gMDsgY2kgPCBudW1fY29tcG9uZW50czsgY2krKykgeworICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBDb21wb25lbnQgSUQgY29kZSAqLworICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOwkvKiBILCBWIHNhbXBsaW5nIGZhY3RvcnMgKi8KKyAgICAodm9pZCkgcmVhZF8xX2J5dGUoKTsJLyogUXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciAqLworICB9Cit9CisKKworLyoKKyAqIFBhcnNlIHRoZSBtYXJrZXIgc3RyZWFtIHVudGlsIFNPUyBvciBFT0kgaXMgc2VlbjsKKyAqIGRpc3BsYXkgYW55IENPTSBtYXJrZXJzLgorICogV2hpbGUgdGhlIGNvbXBhbmlvbiBwcm9ncmFtIHdyanBnY29tIHdpbGwgYWx3YXlzIGluc2VydCBDT00gbWFya2VycyBiZWZvcmUKKyAqIFNPRm4sIG90aGVyIGltcGxlbWVudGF0aW9ucyBtaWdodCBub3QsIHNvIHdlIHNjYW4gdG8gU09TIGJlZm9yZSBzdG9wcGluZy4KKyAqIElmIHdlIHdlcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBpbWFnZSBkaW1lbnNpb25zLCB3ZSB3b3VsZCBzdG9wIGF0IFNPRm4uCisgKiAoQ29udmVyc2VseSwgaWYgd2Ugb25seSBjYXJlZCBhYm91dCBDT00gbWFya2VycywgdGhlcmUgd291bGQgYmUgbm8gbmVlZAorICogZm9yIHNwZWNpYWwgY29kZSB0byBoYW5kbGUgU09Gbjsgd2UgY291bGQgdHJlYXQgaXQgbGlrZSBvdGhlciBtYXJrZXJzLikKKyAqLworCitzdGF0aWMgaW50CitzY2FuX0pQRUdfaGVhZGVyIChpbnQgdmVyYm9zZSkKK3sKKyAgaW50IG1hcmtlcjsKKworICAvKiBFeHBlY3QgU09JIGF0IHN0YXJ0IG9mIGZpbGUgKi8KKyAgaWYgKGZpcnN0X21hcmtlcigpICE9IE1fU09JKQorICAgIEVSUkVYSVQoIkV4cGVjdGVkIFNPSSBtYXJrZXIgZmlyc3QiKTsKKworICAvKiBTY2FuIG1pc2NlbGxhbmVvdXMgbWFya2VycyB1bnRpbCB3ZSByZWFjaCBTT1MuICovCisgIGZvciAoOzspIHsKKyAgICBtYXJrZXIgPSBuZXh0X21hcmtlcigpOworICAgIHN3aXRjaCAobWFya2VyKSB7CisgICAgICAvKiBOb3RlIHRoYXQgbWFya2VyIGNvZGVzIDB4QzQsIDB4QzgsIDB4Q0MgYXJlIG5vdCwgYW5kIG11c3Qgbm90IGJlLAorICAgICAgICogdHJlYXRlZCBhcyBTT0ZuLiAgQzQgaW4gcGFydGljdWxhciBpcyBhY3R1YWxseSBESFQuCisgICAgICAgKi8KKyAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCisgICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y5OgkJLyogRXh0ZW5kZWQgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMDoJCS8qIFByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjExOgkJLyogTG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTM6CQkvKiBEaWZmZXJlbnRpYWwgc2VxdWVudGlhbCwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNDoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxNToJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgICAgaWYgKHZlcmJvc2UpCisJcHJvY2Vzc19TT0ZuKG1hcmtlcik7CisgICAgICBlbHNlCisJc2tpcF92YXJpYWJsZSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fU09TOgkJCS8qIHN0b3AgYmVmb3JlIGhpdHRpbmcgY29tcHJlc3NlZCBkYXRhICovCisgICAgICByZXR1cm4gbWFya2VyOworCisgICAgY2FzZSBNX0VPSToJCQkvKiBpbiBjYXNlIGl0J3MgYSB0YWJsZXMtb25seSBKUEVHIHN0cmVhbSAqLworICAgICAgcmV0dXJuIG1hcmtlcjsKKworICAgIGNhc2UgTV9DT006CisgICAgICBwcm9jZXNzX0NPTSgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fQVBQMTI6CisgICAgICAvKiBTb21lIGRpZ2l0YWwgY2FtZXJhIG1ha2VycyBwdXQgdXNlZnVsIHRleHR1YWwgaW5mb3JtYXRpb24gaW50bworICAgICAgICogQVBQMTIgbWFya2Vycywgc28gd2UgcHJpbnQgdGhvc2Ugb3V0IHRvbyB3aGVuIGluIC12ZXJib3NlIG1vZGUuCisgICAgICAgKi8KKyAgICAgIGlmICh2ZXJib3NlKSB7CisJcHJpbnRmKCJBUFAxMiBjb250YWluczpcbiIpOworCXByb2Nlc3NfQ09NKCk7CisgICAgICB9IGVsc2UKKwlza2lwX3ZhcmlhYmxlKCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CQkJLyogQW55dGhpbmcgZWxzZSBqdXN0IGdldHMgc2tpcHBlZCAqLworICAgICAgc2tpcF92YXJpYWJsZSgpOwkJLyogd2UgYXNzdW1lIGl0IGhhcyBhIHBhcmFtZXRlciBjb3VudC4uLiAqLworICAgICAgYnJlYWs7CisgICAgfQorICB9IC8qIGVuZCBsb29wICovCit9CisKKworLyogQ29tbWFuZCBsaW5lIHBhcnNpbmcgY29kZSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIHByb2duYW1lOwkvKiBwcm9ncmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCisKKworc3RhdGljIHZvaWQKK3VzYWdlICh2b2lkKQorLyogY29tcGxhaW4gYWJvdXQgYmFkIGNvbW1hbmQgbGluZSAqLworeworICBmcHJpbnRmKHN0ZGVyciwgInJkanBnY29tIGRpc3BsYXlzIGFueSB0ZXh0dWFsIGNvbW1lbnRzIGluIGEgSlBFRyBmaWxlLlxuIik7CisKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW3N3aXRjaGVzXSBbaW5wdXRmaWxlXVxuIiwgcHJvZ25hbWUpOworCisgIGZwcmludGYoc3RkZXJyLCAiU3dpdGNoZXMgKG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCk6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJib3NlICAgIEFsc28gZGlzcGxheSBkaW1lbnNpb25zIG9mIEpQRUcgaW1hZ2VcbiIpOworCisgIGV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworCitzdGF0aWMgaW50CitrZXltYXRjaCAoY2hhciAqIGFyZywgY29uc3QgY2hhciAqIGtleXdvcmQsIGludCBtaW5jaGFycykKKy8qIENhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcgb2YgKHBvc3NpYmx5IGFiYnJldmlhdGVkKSBrZXl3b3JkIHN3aXRjaGVzLiAqLworLyoga2V5d29yZCBpcyB0aGUgY29uc3RhbnQga2V5d29yZCAobXVzdCBiZSBsb3dlciBjYXNlIGFscmVhZHkpLCAqLworLyogbWluY2hhcnMgaXMgbGVuZ3RoIG9mIG1pbmltdW0gbGVnYWwgYWJicmV2aWF0aW9uLiAqLworeworICByZWdpc3RlciBpbnQgY2EsIGNrOworICByZWdpc3RlciBpbnQgbm1hdGNoZWQgPSAwOworCisgIHdoaWxlICgoY2EgPSAqYXJnKyspICE9ICdcMCcpIHsKKyAgICBpZiAoKGNrID0gKmtleXdvcmQrKykgPT0gJ1wwJykKKyAgICAgIHJldHVybiAwOwkJCS8qIGFyZyBsb25nZXIgdGhhbiBrZXl3b3JkLCBubyBnb29kICovCisgICAgaWYgKGlzdXBwZXIoY2EpKQkJLyogZm9yY2UgYXJnIHRvIGxjYXNlIChhc3N1bWUgY2sgaXMgYWxyZWFkeSkgKi8KKyAgICAgIGNhID0gdG9sb3dlcihjYSk7CisgICAgaWYgKGNhICE9IGNrKQorICAgICAgcmV0dXJuIDA7CQkJLyogbm8gZ29vZCAqLworICAgIG5tYXRjaGVkKys7CQkJLyogY291bnQgbWF0Y2hlZCBjaGFyYWN0ZXJzICovCisgIH0KKyAgLyogcmVhY2hlZCBlbmQgb2YgYXJndW1lbnQ7IGZhaWwgaWYgaXQncyB0b28gc2hvcnQgZm9yIHVuaXF1ZSBhYmJyZXYgKi8KKyAgaWYgKG5tYXRjaGVkIDwgbWluY2hhcnMpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOwkJCS8qIEEtT0sgKi8KK30KKworCisvKgorICogVGhlIG1haW4gcHJvZ3JhbS4KKyAqLworCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgaW50IGFyZ247CisgIGNoYXIgKiBhcmc7CisgIGludCB2ZXJib3NlID0gMDsKKworICAvKiBPbiBNYWMsIGZldGNoIGEgY29tbWFuZCBsaW5lLiAqLworI2lmZGVmIFVTRV9DQ09NTUFORAorICBhcmdjID0gY2NvbW1hbmQoJmFyZ3YpOworI2VuZGlmCisKKyAgcHJvZ25hbWUgPSBhcmd2WzBdOworICBpZiAocHJvZ25hbWUgPT0gTlVMTCB8fCBwcm9nbmFtZVswXSA9PSAwKQorICAgIHByb2duYW1lID0gInJkanBnY29tIjsJLyogaW4gY2FzZSBDIGxpYnJhcnkgZG9lc24ndCBwcm92aWRlIGl0ICovCisKKyAgLyogUGFyc2Ugc3dpdGNoZXMsIGlmIGFueSAqLworICBmb3IgKGFyZ24gPSAxOyBhcmduIDwgYXJnYzsgYXJnbisrKSB7CisgICAgYXJnID0gYXJndlthcmduXTsKKyAgICBpZiAoYXJnWzBdICE9ICctJykKKyAgICAgIGJyZWFrOwkJCS8qIG5vdCBzd2l0Y2gsIG11c3QgYmUgZmlsZSBuYW1lICovCisgICAgYXJnKys7CQkJLyogYWR2YW5jZSBvdmVyICctJyAqLworICAgIGlmIChrZXltYXRjaChhcmcsICJ2ZXJib3NlIiwgMSkpIHsKKyAgICAgIHZlcmJvc2UrKzsKKyAgICB9IGVsc2UKKyAgICAgIHVzYWdlKCk7CisgIH0KKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICAvKiBVbml4IHN0eWxlOiBleHBlY3QgemVybyBvciBvbmUgZmlsZSBuYW1lICovCisgIGlmIChhcmduIDwgYXJnYy0xKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogb25seSBvbmUgaW5wdXQgZmlsZVxuIiwgcHJvZ25hbWUpOworICAgIHVzYWdlKCk7CisgIH0KKyAgaWYgKGFyZ24gPCBhcmdjKSB7CisgICAgaWYgKChpbmZpbGUgPSBmb3Blbihhcmd2W2FyZ25dLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ25dKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZGVmYXVsdCBpbnB1dCBmaWxlIGlzIHN0ZGluICovCisjaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCisgICAgc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7CisjZW5kaWYKKyNpZmRlZiBVU0VfRkRPUEVOCQkvKiBuZWVkIHRvIHJlLW9wZW4gaW4gYmluYXJ5IG1vZGU/ICovCisgICAgaWYgKChpbmZpbGUgPSBmZG9wZW4oZmlsZW5vKHN0ZGluKSwgUkVBRF9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIHN0ZGluXG4iLCBwcm9nbmFtZSk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorI2Vsc2UKKyAgICBpbmZpbGUgPSBzdGRpbjsKKyNlbmRpZgorICB9CisKKyAgLyogU2NhbiB0aGUgSlBFRyBoZWFkZXJzLiAqLworICAodm9pZCkgc2Nhbl9KUEVHX2hlYWRlcih2ZXJib3NlKTsKKworICAvKiBBbGwgZG9uZS4gKi8KKyAgZXhpdChFWElUX1NVQ0NFU1MpOworICByZXR1cm4gMDsJCQkvKiBzdXBwcmVzcyBuby1yZXR1cm4tdmFsdWUgd2FybmluZ3MgKi8KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZHBwbS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkcHBtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmMzVjMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZHBwbS5jCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogcmRwcG0uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHJlYWQgaW5wdXQgaW1hZ2VzIGluIFBQTS9QR00gZm9ybWF0LgorICogVGhlIGV4dGVuZGVkIDItYnl0ZS1wZXItc2FtcGxlIHJhdyBQUE0vUEdNIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KKyAqIFRoZSBQQk1QTFVTIGxpYnJhcnkgaXMgTk9UIHJlcXVpcmVkIHRvIGNvbXBpbGUgdGhpcyBzb2Z0d2FyZQorICogKGJ1dCBpdCBpcyBoaWdobHkgdXNlZnVsIGFzIGEgc2V0IG9mIFBQTSBpbWFnZSBtYW5pcHVsYXRpb24gcHJvZ3JhbXMpLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKKyAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKKyAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAorICogdGhlIGZpbGUgaXMgaW5kZWVkIFBQTSBmb3JtYXQpLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBQUE1fU1VQUE9SVEVECisKKworLyogUG9ydGlvbnMgb2YgdGhpcyBjb2RlIGFyZSBiYXNlZCBvbiB0aGUgUEJNUExVUyBsaWJyYXJ5LCB3aGljaCBpczoKKyoqCisqKiBDb3B5cmlnaHQgKEMpIDE5ODggYnkgSmVmIFBvc2thbnplci4KKyoqCisqKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyoqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQKKyoqIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CisqKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisqKiBkb2N1bWVudGF0aW9uLiAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvcgorKiogaW1wbGllZCB3YXJyYW50eS4KKyovCisKKworLyogTWFjcm9zIHRvIGRlYWwgd2l0aCB1bnNpZ25lZCBjaGFycyBhcyBlZmZpY2llbnRseSBhcyBjb21waWxlciBhbGxvd3MgKi8KKworI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZSAvKiAhSEFWRV9VTlNJR05FRF9DSEFSICovCisjaWZkZWYgQ0hBUl9JU19VTlNJR05FRAordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkpCisjZWxzZQordHlwZWRlZiBjaGFyIFVfQ0hBUjsKKyNkZWZpbmUgVUNIKHgpCSgoaW50KSAoeCkgJiAweEZGKQorI2VuZGlmCisjZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCisKKworI2RlZmluZQlSZWFkT0soZmlsZSxidWZmZXIsbGVuKQkoSkZSRUFEKGZpbGUsYnVmZmVyLGxlbikgPT0gKChzaXplX3QpIChsZW4pKSkKKworCisvKgorICogT24gbW9zdCBzeXN0ZW1zLCByZWFkaW5nIGluZGl2aWR1YWwgYnl0ZXMgd2l0aCBnZXRjKCkgaXMgZHJhc3RpY2FsbHkgbGVzcworICogZWZmaWNpZW50IHRoYW4gYnVmZmVyaW5nIGEgcm93IGF0IGEgdGltZSB3aXRoIGZyZWFkKCkuICBPbiBQQ3MsIHdlIG11c3QKKyAqIGFsbG9jYXRlIHRoZSBidWZmZXIgaW4gbmVhciBkYXRhIHNwYWNlLCBiZWNhdXNlIHdlIGFyZSBhc3N1bWluZyBzbWFsbC1kYXRhCisgKiBtZW1vcnkgbW9kZWwsIHdoZXJlaW4gZnJlYWQoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LiAgSWYgeW91IG5lZWQgdG8KKyAqIHByb2Nlc3MgdmVyeSB3aWRlIGltYWdlcyBvbiBhIFBDLCB5b3UgbWlnaHQgaGF2ZSB0byBjb21waWxlIGluIGxhcmdlLW1lbW9yeQorICogbW9kZWwsIG9yIGVsc2UgcmVwbGFjZSBmcmVhZCgpIHdpdGggYSBnZXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCisgKiBzbG93ZXIuCisgKi8KKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBzb3VyY2Ugb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgVV9DSEFSICppb2J1ZmZlcjsJCS8qIG5vbi1GQVIgcG9pbnRlciB0byBJL08gYnVmZmVyICovCisgIEpTQU1QUk9XIHBpeHJvdzsJCS8qIEZBUiBwb2ludGVyIHRvIHNhbWUgKi8KKyAgc2l6ZV90IGJ1ZmZlcl93aWR0aDsJCS8qIHdpZHRoIG9mIEkvTyBidWZmZXIgKi8KKyAgSlNBTVBMRSAqcmVzY2FsZTsJCS8qID0+IG1heHZhbC1yZW1hcHBpbmcgYXJyYXksIG9yIE5VTEwgKi8KK30gcHBtX3NvdXJjZV9zdHJ1Y3Q7CisKK3R5cGVkZWYgcHBtX3NvdXJjZV9zdHJ1Y3QgKiBwcG1fc291cmNlX3B0cjsKKworCitMT0NBTChpbnQpCitwYm1fZ2V0YyAoRklMRSAqIGluZmlsZSkKKy8qIFJlYWQgbmV4dCBjaGFyLCBza2lwcGluZyBvdmVyIGFueSBjb21tZW50cyAqLworLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKworICBjaCA9IGdldGMoaW5maWxlKTsKKyAgaWYgKGNoID09ICcjJykgeworICAgIGRvIHsKKyAgICAgIGNoID0gZ2V0YyhpbmZpbGUpOworICAgIH0gd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKKyAgfQorICByZXR1cm4gY2g7Cit9CisKKworTE9DQUwodW5zaWduZWQgaW50KQorcmVhZF9wYm1faW50ZWdlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEZJTEUgKiBpbmZpbGUpCisvKiBSZWFkIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlciBmcm9tIHRoZSBQUE0gZmlsZSAqLworLyogU3dhbGxvd3Mgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlciAqLworLyogTm90ZSB0aGF0IG9uIGEgMTYtYml0LWludCBtYWNoaW5lLCBvbmx5IHZhbHVlcyB1cCB0byA2NGsgY2FuIGJlIHJlYWQuICovCisvKiBUaGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGluIHByYWN0aWNlLiAqLworeworICByZWdpc3RlciBpbnQgY2g7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCB2YWw7CisKKyAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgIGRvIHsKKyAgICBjaCA9IHBibV9nZXRjKGluZmlsZSk7CisgICAgaWYgKGNoID09IEVPRikKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgfSB3aGlsZSAoY2ggPT0gJyAnIHx8IGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInKTsKKworICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9OTlVNRVJJQyk7CisKKyAgdmFsID0gY2ggLSAnMCc7CisgIHdoaWxlICgoY2ggPSBwYm1fZ2V0YyhpbmZpbGUpKSA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgdmFsICo9IDEwOworICAgIHZhbCArPSBjaCAtICcwJzsKKyAgfQorICByZXR1cm4gdmFsOworfQorCisKKy8qCisgKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgorICoKKyAqIFdlIHByb3ZpZGUgc2V2ZXJhbCBkaWZmZXJlbnQgdmVyc2lvbnMgZGVwZW5kaW5nIG9uIGlucHV0IGZpbGUgZm9ybWF0LgorICogSW4gYWxsIGNhc2VzLCBpbnB1dCBpcyBzY2FsZWQgdG8gdGhlIHNpemUgb2YgSlNBTVBMRS4KKyAqCisgKiBBIHJlYWxseSBmYXN0IHBhdGggaXMgcHJvdmlkZWQgZm9yIHJlYWRpbmcgYnl0ZS9zYW1wbGUgcmF3IGZpbGVzIHdpdGgKKyAqIG1heHZhbCA9IE1BWEpTQU1QTEUsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBmb3IgOC1iaXQgZGF0YS4KKyAqLworCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3RleHRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHRleHQtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgRklMRSAqIGluZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOworICB9CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3RleHRfcmdiX3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgdGV4dC1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICBGSUxFICogaW5maWxlID0gc291cmNlLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpwdHIrKyA9IHJlc2NhbGVbcmVhZF9wYm1faW50ZWdlcihjaW5mbywgaW5maWxlKV07CisgICAgKnB0cisrID0gcmVzY2FsZVtyZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBpbmZpbGUpXTsKKyAgICAqcHRyKysgPSByZXNjYWxlW3JlYWRfcGJtX2ludGVnZXIoY2luZm8sIGluZmlsZSldOworICB9CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3NjYWxlZF9ncmF5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IFBHTSBmaWxlcyB3aXRoIGFueSBtYXh2YWwgKi8KK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlID0gKHBwbV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBVX0NIQVIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QTEUgKnJlc2NhbGUgPSBzb3VyY2UtPnJlc2NhbGU7CisgIEpESU1FTlNJT04gY29sOworCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICBwdHIgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IHNvdXJjZS0+aW9idWZmZXI7CisgIGZvciAoY29sID0gY2luZm8tPmltYWdlX3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpwdHIrKyA9IHJlc2NhbGVbVUNIKCpidWZmZXJwdHIrKyldOworICB9CisgIHJldHVybiAxOworfQorCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3NjYWxlZF9yZ2Jfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctYnl0ZS1mb3JtYXQgUFBNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07CisgICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07CisgICAgKnB0cisrID0gcmVzY2FsZVtVQ0goKmJ1ZmZlcnB0cisrKV07CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfcmF3X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIHJlYWRpbmcgcmF3LWJ5dGUtZm9ybWF0IGZpbGVzIHdpdGggbWF4dmFsID0gTUFYSlNBTVBMRS4KKyAqIEluIHRoaXMgY2FzZSB3ZSBqdXN0IHJlYWQgcmlnaHQgaW50byB0aGUgSlNBTVBMRSBidWZmZXIhCisgKiBOb3RlIHRoYXQgc2FtZSBjb2RlIHdvcmtzIGZvciBQUE0gYW5kIFBHTSBmaWxlcy4KKyAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworCisgIGlmICghIFJlYWRPSyhzb3VyY2UtPnB1Yi5pbnB1dF9maWxlLCBzb3VyY2UtPmlvYnVmZmVyLCBzb3VyY2UtPmJ1ZmZlcl93aWR0aCkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF93b3JkX2dyYXlfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyByYXctd29yZC1mb3JtYXQgUEdNIGZpbGVzIHdpdGggYW55IG1heHZhbCAqLworeworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIFVfQ0hBUiAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBMRSAqcmVzY2FsZSA9IHNvdXJjZS0+cmVzY2FsZTsKKyAgSkRJTUVOU0lPTiBjb2w7CisKKyAgaWYgKCEgUmVhZE9LKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUsIHNvdXJjZS0+aW9idWZmZXIsIHNvdXJjZS0+YnVmZmVyX3dpZHRoKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gc291cmNlLT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgcmVnaXN0ZXIgaW50IHRlbXA7CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKKyAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF93b3JkX3JnYl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIHJhdy13b3JkLWZvcm1hdCBQUE0gZmlsZXMgd2l0aCBhbnkgbWF4dmFsICovCit7CisgIHBwbV9zb3VyY2VfcHRyIHNvdXJjZSA9IChwcG1fc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgVV9DSEFSICogYnVmZmVycHRyOworICByZWdpc3RlciBKU0FNUExFICpyZXNjYWxlID0gc291cmNlLT5yZXNjYWxlOworICBKRElNRU5TSU9OIGNvbDsKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgc291cmNlLT5pb2J1ZmZlciwgc291cmNlLT5idWZmZXJfd2lkdGgpKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfSU5QVVRfRU9GKTsKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBidWZmZXJwdHIgPSBzb3VyY2UtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICByZWdpc3RlciBpbnQgdGVtcDsKKyAgICB0ZW1wICA9IFVDSCgqYnVmZmVycHRyKyspOworICAgIHRlbXAgfD0gVUNIKCpidWZmZXJwdHIrKykgPDwgODsKKyAgICAqcHRyKysgPSByZXNjYWxlW3RlbXBdOworICAgIHRlbXAgID0gVUNIKCpidWZmZXJwdHIrKyk7CisgICAgdGVtcCB8PSBVQ0goKmJ1ZmZlcnB0cisrKSA8PCA4OworICAgICpwdHIrKyA9IHJlc2NhbGVbdGVtcF07CisgICAgdGVtcCAgPSBVQ0goKmJ1ZmZlcnB0cisrKTsKKyAgICB0ZW1wIHw9IFVDSCgqYnVmZmVycHRyKyspIDw8IDg7CisgICAgKnB0cisrID0gcmVzY2FsZVt0ZW1wXTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCisvKgorICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9wcG0gKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBwcG1fc291cmNlX3B0ciBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpIHNpbmZvOworICBpbnQgYzsKKyAgdW5zaWduZWQgaW50IHcsIGgsIG1heHZhbDsKKyAgYm9vbGVhbiBuZWVkX2lvYnVmZmVyLCB1c2VfcmF3X2J1ZmZlciwgbmVlZF9yZXNjYWxlOworCisgIGlmIChnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpICE9ICdQJykKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOworCisgIGMgPSBnZXRjKHNvdXJjZS0+cHViLmlucHV0X2ZpbGUpOyAvKiBzdWJmb3JtYXQgZGlzY3JpbWluYXRvciBjaGFyYWN0ZXIgKi8KKworICAvKiBkZXRlY3QgdW5zdXBwb3J0ZWQgdmFyaWFudHMgKGllLCBQQk0pIGJlZm9yZSB0cnlpbmcgdG8gcmVhZCBoZWFkZXIgKi8KKyAgc3dpdGNoIChjKSB7CisgIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLworICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgY2FzZSAnNSc6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUEdNIGZpbGUgKi8KKyAgY2FzZSAnNic6CQkJLyogaXQncyBhIHJhdy1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1BQTV9OT1QpOworICAgIGJyZWFrOworICB9CisKKyAgLyogZmV0Y2ggdGhlIHJlbWFpbmluZyBoZWFkZXIgaW5mbyAqLworICB3ID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7CisgIGggPSByZWFkX3BibV9pbnRlZ2VyKGNpbmZvLCBzb3VyY2UtPnB1Yi5pbnB1dF9maWxlKTsKKyAgbWF4dmFsID0gcmVhZF9wYm1faW50ZWdlcihjaW5mbywgc291cmNlLT5wdWIuaW5wdXRfZmlsZSk7CisKKyAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgbWF4dmFsIDw9IDApIC8qIGVycm9yIGNoZWNrICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fTk9UKTsKKworICBjaW5mby0+ZGF0YV9wcmVjaXNpb24gPSBCSVRTX0lOX0pTQU1QTEU7IC8qIHdlIGFsd2F5cyByZXNjYWxlIGRhdGEgdG8gdGhpcyAqLworICBjaW5mby0+aW1hZ2Vfd2lkdGggPSAoSkRJTUVOU0lPTikgdzsKKyAgY2luZm8tPmltYWdlX2hlaWdodCA9IChKRElNRU5TSU9OKSBoOworCisgIC8qIGluaXRpYWxpemUgZmxhZ3MgdG8gbW9zdCBjb21tb24gc2V0dGluZ3MgKi8KKyAgbmVlZF9pb2J1ZmZlciA9IFRSVUU7CQkvKiBkbyB3ZSBuZWVkIGFuIEkvTyBidWZmZXI/ICovCisgIHVzZV9yYXdfYnVmZmVyID0gRkFMU0U7CS8qIGRvIHdlIG1hcCBpbnB1dCBidWZmZXIgb250byBJL08gYnVmZmVyPyAqLworICBuZWVkX3Jlc2NhbGUgPSBUUlVFOwkJLyogZG8gd2UgbmVlZCBhIHJlc2NhbGUgYXJyYXk/ICovCisKKyAgc3dpdGNoIChjKSB7CisgIGNhc2UgJzInOgkJCS8qIGl0J3MgYSB0ZXh0LWZvcm1hdCBQR00gZmlsZSAqLworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTV9URVhULCB3LCBoKTsKKyAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF90ZXh0X2dyYXlfcm93OworICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKKyAgICBicmVhazsKKworICBjYXNlICczJzoJCQkvKiBpdCdzIGEgdGV4dC1mb3JtYXQgUFBNIGZpbGUgKi8KKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDM7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKKyAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19QUE1fVEVYVCwgdywgaCk7CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfdGV4dF9yZ2Jfcm93OworICAgIG5lZWRfaW9idWZmZXIgPSBGQUxTRTsKKyAgICBicmVhazsKKworICBjYXNlICc1JzoJCQkvKiBpdCdzIGEgcmF3LWZvcm1hdCBQR00gZmlsZSAqLworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1BHTSwgdywgaCk7CisgICAgaWYgKG1heHZhbCA+IDI1NSkgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfd29yZF9ncmF5X3JvdzsKKyAgICB9IGVsc2UgaWYgKG1heHZhbCA9PSBNQVhKU0FNUExFICYmIFNJWkVPRihKU0FNUExFKSA9PSBTSVpFT0YoVV9DSEFSKSkgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcmF3X3JvdzsKKyAgICAgIHVzZV9yYXdfYnVmZmVyID0gVFJVRTsKKyAgICAgIG5lZWRfcmVzY2FsZSA9IEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF9zY2FsZWRfZ3JheV9yb3c7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgJzYnOgkJCS8qIGl0J3MgYSByYXctZm9ybWF0IFBQTSBmaWxlICovCisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAzOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfUFBNLCB3LCBoKTsKKyAgICBpZiAobWF4dmFsID4gMjU1KSB7CisgICAgICBzb3VyY2UtPnB1Yi5nZXRfcGl4ZWxfcm93cyA9IGdldF93b3JkX3JnYl9yb3c7CisgICAgfSBlbHNlIGlmIChtYXh2YWwgPT0gTUFYSlNBTVBMRSAmJiBTSVpFT0YoSlNBTVBMRSkgPT0gU0laRU9GKFVfQ0hBUikpIHsKKyAgICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3Jhd19yb3c7CisgICAgICB1c2VfcmF3X2J1ZmZlciA9IFRSVUU7CisgICAgICBuZWVkX3Jlc2NhbGUgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfc2NhbGVkX3JnYl9yb3c7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIEkvTyBidWZmZXI6IDEgb3IgMyBieXRlcyBvciB3b3Jkcy9waXhlbC4gKi8KKyAgaWYgKG5lZWRfaW9idWZmZXIpIHsKKyAgICBzb3VyY2UtPmJ1ZmZlcl93aWR0aCA9IChzaXplX3QpIHcgKiBjaW5mby0+aW5wdXRfY29tcG9uZW50cyAqCisgICAgICAoKG1heHZhbDw9MjU1KSA/IFNJWkVPRihVX0NIQVIpIDogKDIqU0laRU9GKFVfQ0hBUikpKTsKKyAgICBzb3VyY2UtPmlvYnVmZmVyID0gKFVfQ0hBUiAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIHNvdXJjZS0+YnVmZmVyX3dpZHRoKTsKKyAgfQorCisgIC8qIENyZWF0ZSBjb21wcmVzc29yIGlucHV0IGJ1ZmZlci4gKi8KKyAgaWYgKHVzZV9yYXdfYnVmZmVyKSB7CisgICAgLyogRm9yIHVuc2NhbGVkIHJhdy1pbnB1dCBjYXNlLCB3ZSBjYW4ganVzdCBtYXAgaXQgb250byB0aGUgSS9PIGJ1ZmZlci4gKi8KKyAgICAvKiBTeW50aGVzaXplIGEgSlNBTVBBUlJBWSBwb2ludGVyIHN0cnVjdHVyZSAqLworICAgIC8qIENhc3QgaGVyZSBpbXBsaWVzIG5lYXItPmZhciBwb2ludGVyIGNvbnZlcnNpb24gb24gUENzICovCisgICAgc291cmNlLT5waXhyb3cgPSAoSlNBTVBST1cpIHNvdXJjZS0+aW9idWZmZXI7CisgICAgc291cmNlLT5wdWIuYnVmZmVyID0gJiBzb3VyY2UtPnBpeHJvdzsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKyAgfSBlbHNlIHsKKyAgICAvKiBOZWVkIHRvIHRyYW5zbGF0ZSBhbnl3YXksIHNvIG1ha2UgYSBzZXBhcmF0ZSBzYW1wbGUgYnVmZmVyLiAqLworICAgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICAoSkRJTUVOU0lPTikgdyAqIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzLCAoSkRJTUVOU0lPTikgMSk7CisgICAgc291cmNlLT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisgIH0KKworICAvKiBDb21wdXRlIHRoZSByZXNjYWxpbmcgYXJyYXkgaWYgcmVxdWlyZWQuICovCisgIGlmIChuZWVkX3Jlc2NhbGUpIHsKKyAgICBJTlQzMiB2YWwsIGhhbGZfbWF4dmFsOworCisgICAgLyogT24gMTYtYml0LWludCBtYWNoaW5lcyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgb2YgbWF4dmFsID0gNjU1MzUgKi8KKyAgICBzb3VyY2UtPnJlc2NhbGUgPSAoSlNBTVBMRSAqKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIChzaXplX3QpICgoKGxvbmcpIG1heHZhbCArIDFMKSAqIFNJWkVPRihKU0FNUExFKSkpOworICAgIGhhbGZfbWF4dmFsID0gbWF4dmFsIC8gMjsKKyAgICBmb3IgKHZhbCA9IDA7IHZhbCA8PSAoSU5UMzIpIG1heHZhbDsgdmFsKyspIHsKKyAgICAgIC8qIFRoZSBtdWx0aXBsaWNhdGlvbiBoZXJlIG11c3QgYmUgZG9uZSBpbiAzMiBiaXRzIHRvIGF2b2lkIG92ZXJmbG93ICovCisgICAgICBzb3VyY2UtPnJlc2NhbGVbdmFsXSA9IChKU0FNUExFKSAoKHZhbCpNQVhKU0FNUExFICsgaGFsZl9tYXh2YWwpL21heHZhbCk7CisgICAgfQorICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX2lucHV0X3BwbSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIC8qIG5vIHdvcmsgKi8KK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgUFBNIGZvcm1hdCBpbnB1dC4KKyAqLworCitHTE9CQUwoY2pwZWdfc291cmNlX3B0cikKK2ppbml0X3JlYWRfcHBtIChqX2NvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgcHBtX3NvdXJjZV9wdHIgc291cmNlOworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCAqLworICBzb3VyY2UgPSAocHBtX3NvdXJjZV9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKHBwbV9zb3VyY2Vfc3RydWN0KSk7CisgIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMsIGV4Y2VwdCBnZXRfcGl4ZWxfcm93cyB3aGljaCBzdGFydF9pbnB1dCBzZXRzICovCisgIHNvdXJjZS0+cHViLnN0YXJ0X2lucHV0ID0gc3RhcnRfaW5wdXRfcHBtOworICBzb3VyY2UtPnB1Yi5maW5pc2hfaW5wdXQgPSBmaW5pc2hfaW5wdXRfcHBtOworCisgIHJldHVybiAoY2pwZWdfc291cmNlX3B0cikgc291cmNlOworfQorCisjZW5kaWYgLyogUFBNX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkcmxlLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmRybGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJiYzM3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3JkcmxlLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiByZHJsZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gVXRhaCBSTEUgZm9ybWF0LgorICogVGhlIFV0YWggUmFzdGVyIFRvb2xraXQgbGlicmFyeSBpcyByZXF1aXJlZCAodmVyc2lvbiAzLjEgb3IgbGF0ZXIpLgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKKyAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKKyAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAorICogdGhlIGZpbGUgaXMgaW5kZWVkIFJMRSBmb3JtYXQpLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTWlrZSBMaWpld3NraSwKKyAqIHdpdGggdXBkYXRlcyBmcm9tIFJvYmVydCBIdXRjaGluc29uLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisKKy8qIHJsZS5oIGlzIHByb3ZpZGVkIGJ5IHRoZSBVdGFoIFJhc3RlciBUb29sa2l0LiAqLworCisjaW5jbHVkZSA8cmxlLmg+CisKKy8qCisgKiBXZSBhc3N1bWUgdGhhdCBKU0FNUExFIGhhcyB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBhcyBybGVfcGl4ZWwsCisgKiB0byB3aXQsICJ1bnNpZ25lZCBjaGFyIi4gIEhlbmNlIHdlIGNhbid0IGNvcGUgd2l0aCAxMi0gb3IgMTYtYml0IHNhbXBsZXMuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisvKgorICogV2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIFJMRSBmaWxlczoKKyAqICAgCisgKiAgIEdSQVlTQ0FMRSAgIC0gOCBiaXRzLCBubyBjb2xvcm1hcAorICogICBNQVBQRURHUkFZICAtIDggYml0cywgMSBjaGFubmVsIGNvbG9tYXAKKyAqICAgUFNFVURPQ09MT1IgLSA4IGJpdHMsIDMgY2hhbm5lbCBjb2xvcm1hcAorICogICBUUlVFQ09MT1IgICAtIDI0IGJpdHMsIDMgY2hhbm5lbCBjb2xvcm1hcAorICogICBESVJFQ1RDT0xPUiAtIDI0IGJpdHMsIG5vIGNvbG9ybWFwCisgKgorICogRm9yIG5vdywgd2UgaWdub3JlIGFueSBhbHBoYSBjaGFubmVsIGluIHRoZSBpbWFnZS4KKyAqLworCit0eXBlZGVmIGVudW0KKyAgeyBHUkFZU0NBTEUsIE1BUFBFREdSQVksIFBTRVVET0NPTE9SLCBUUlVFQ09MT1IsIERJUkVDVENPTE9SIH0gcmxlX2tpbmQ7CisKKworLyoKKyAqIFNpbmNlIFJMRSBzdG9yZXMgc2NhbmxpbmVzIGJvdHRvbS10by10b3AsIHdlIGhhdmUgdG8gaW52ZXJ0IHRoZSBpbWFnZQorICogdG8gY29uZm9ybSB0byBKUEVHJ3MgdG9wLXRvLWJvdHRvbSBvcmRlci4gIFRvIGRvIHRoaXMsIHdlIHJlYWQgdGhlCisgKiBpbmNvbWluZyBpbWFnZSBpbnRvIGEgdmlydHVhbCBhcnJheSBvbiB0aGUgZmlyc3QgZ2V0X3BpeGVsX3Jvd3MgY2FsbCwKKyAqIHRoZW4gZmV0Y2ggdGhlIHJlcXVpcmVkIHJvdyBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IG9uIHN1YnNlcXVlbnQgY2FsbHMuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX3JsZV9zb3VyY2Vfc3RydWN0ICogcmxlX3NvdXJjZV9wdHI7CisKK3R5cGVkZWYgc3RydWN0IF9ybGVfc291cmNlX3N0cnVjdCB7CisgIHN0cnVjdCBjanBlZ19zb3VyY2Vfc3RydWN0IHB1YjsgLyogcHVibGljIGZpZWxkcyAqLworCisgIHJsZV9raW5kIHZpc3VhbDsgICAgICAgICAgICAgIC8qIGFjdHVhbCB0eXBlIG9mIGlucHV0IGZpbGUgKi8KKyAganZpcnRfc2FycmF5X3B0ciBpbWFnZTsgICAgICAgLyogdmlydHVhbCBhcnJheSB0byBob2xkIHRoZSBpbWFnZSAqLworICBKRElNRU5TSU9OIHJvdzsJCS8qIGN1cnJlbnQgcm93ICMgaW4gdGhlIHZpcnR1YWwgYXJyYXkgKi8KKyAgcmxlX2hkciBoZWFkZXI7ICAgICAgICAgICAgICAgLyogSW5wdXQgZmlsZSBpbmZvcm1hdGlvbiAqLworICBybGVfcGl4ZWwqKiBybGVfcm93OyAgICAgICAgICAvKiBob2xkcyBhIHJvdyByZXR1cm5lZCBieSBybGVfZ2V0cm93KCkgKi8KKworfSBybGVfc291cmNlX3N0cnVjdDsKKworCisvKgorICogUmVhZCB0aGUgZmlsZSBoZWFkZXI7IHJldHVybiBpbWFnZSBzaXplIGFuZCBjb21wb25lbnQgY291bnQuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9pbnB1dF9ybGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBybGVfc291cmNlX3B0ciBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpIHNpbmZvOworICBKRElNRU5TSU9OIHdpZHRoLCBoZWlnaHQ7CisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyNlbmRpZgorCisgIC8qIFVzZSBSTEUgbGlicmFyeSByb3V0aW5lIHRvIGdldCB0aGUgaGVhZGVyIGluZm8gKi8KKyAgc291cmNlLT5oZWFkZXIgPSAqcmxlX2hkcl9pbml0KE5VTEwpOworICBzb3VyY2UtPmhlYWRlci5ybGVfZmlsZSA9IHNvdXJjZS0+cHViLmlucHV0X2ZpbGU7CisgIHN3aXRjaCAocmxlX2dldF9zZXR1cCgmKHNvdXJjZS0+aGVhZGVyKSkpIHsKKyAgY2FzZSBSTEVfU1VDQ0VTUzoKKyAgICAvKiBBLU9LICovCisgICAgYnJlYWs7CisgIGNhc2UgUkxFX05PVF9STEU6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfTk9UKTsKKyAgICBicmVhazsKKyAgY2FzZSBSTEVfTk9fU1BBQ0U6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfTUVNKTsKKyAgICBicmVhazsKKyAgY2FzZSBSTEVfRU1QVFk6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfRU1QVFkpOworICAgIGJyZWFrOworICBjYXNlIFJMRV9FT0Y6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9STEVfRU9GKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9CQURFUlJPUik7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBGaWd1cmUgb3V0IHdoYXQgd2UgaGF2ZSwgc2V0IHByaXZhdGUgdmFycyBhbmQgcmV0dXJuIHZhbHVlcyBhY2NvcmRpbmdseSAqLworICAKKyAgd2lkdGggID0gc291cmNlLT5oZWFkZXIueG1heCAtIHNvdXJjZS0+aGVhZGVyLnhtaW4gKyAxOworICBoZWlnaHQgPSBzb3VyY2UtPmhlYWRlci55bWF4IC0gc291cmNlLT5oZWFkZXIueW1pbiArIDE7CisgIHNvdXJjZS0+aGVhZGVyLnhtaW4gPSAwOwkJLyogcmVhbGlnbiBob3Jpem9udGFsbHkgKi8KKyAgc291cmNlLT5oZWFkZXIueG1heCA9IHdpZHRoLTE7CisKKyAgY2luZm8tPmltYWdlX3dpZHRoICAgICAgPSB3aWR0aDsKKyAgY2luZm8tPmltYWdlX2hlaWdodCAgICAgPSBoZWlnaHQ7CisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAgID0gODsgIC8qIHdlIGNhbiBvbmx5IGhhbmRsZSA4IGJpdCBkYXRhICovCisKKyAgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMSAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAwKSB7CisgICAgc291cmNlLT52aXN1YWwgICAgID0gR1JBWVNDQUxFOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1JMRV9HUkFZLCB3aWR0aCwgaGVpZ2h0KTsKKyAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDEgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMSkgeworICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IE1BUFBFREdSQVk7CisgICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfUkxFX01BUEdSQVksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgMSA8PCBzb3VyY2UtPmhlYWRlci5jbWFwbGVuKTsKKyAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDEgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMykgeworICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IFBTRVVET0NPTE9SOworICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1JMRV9NQVBQRUQsIHdpZHRoLCBoZWlnaHQsCisJICAgICAxIDw8IHNvdXJjZS0+aGVhZGVyLmNtYXBsZW4pOworICB9IGVsc2UgaWYgKHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMgPT0gMyAmJiBzb3VyY2UtPmhlYWRlci5uY21hcCA9PSAzKSB7CisgICAgc291cmNlLT52aXN1YWwgICAgID0gVFJVRUNPTE9SOworICAgIFRSQUNFTVMzKGNpbmZvLCAxLCBKVFJDX1JMRV9GVUxMTUFQLCB3aWR0aCwgaGVpZ2h0LAorCSAgICAgMSA8PCBzb3VyY2UtPmhlYWRlci5jbWFwbGVuKTsKKyAgfSBlbHNlIGlmIChzb3VyY2UtPmhlYWRlci5uY29sb3JzID09IDMgJiYgc291cmNlLT5oZWFkZXIubmNtYXAgPT0gMCkgeworICAgIHNvdXJjZS0+dmlzdWFsICAgICA9IERJUkVDVENPTE9SOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1JMRSwgd2lkdGgsIGhlaWdodCk7CisgIH0gZWxzZQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfUkxFX1VOU1VQUE9SVEVEKTsKKyAgCisgIGlmIChzb3VyY2UtPnZpc3VhbCA9PSBHUkFZU0NBTEUgfHwgc291cmNlLT52aXN1YWwgPT0gTUFQUEVER1JBWSkgeworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSAgID0gSkNTX0dSQVlTQ0FMRTsKKyAgICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IDE7CisgIH0gZWxzZSB7CisgICAgY2luZm8tPmluX2NvbG9yX3NwYWNlICAgPSBKQ1NfUkdCOworICAgIGNpbmZvLT5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgfQorCisgIC8qCisgICAqIEEgcGxhY2UgdG8gaG9sZCBlYWNoIHNjYW5saW5lIHdoaWxlIGl0J3MgY29udmVydGVkLgorICAgKiAoR1JBWVNDQUxFIHNjYW5saW5lcyBkb24ndCBuZWVkIGNvbnZlcnRpbmcpCisgICAqLworICBpZiAoc291cmNlLT52aXN1YWwgIT0gR1JBWVNDQUxFKSB7CisgICAgc291cmNlLT5ybGVfcm93ID0gKHJsZV9waXhlbCoqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pIHdpZHRoLCAoSkRJTUVOU0lPTikgY2luZm8tPmlucHV0X2NvbXBvbmVudHMpOworICB9CisKKyAgLyogcmVxdWVzdCBhIHZpcnR1YWwgYXJyYXkgdG8gaG9sZCB0aGUgaW1hZ2UgKi8KKyAgc291cmNlLT5pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKyAgICAgKEpESU1FTlNJT04pICh3aWR0aCAqIHNvdXJjZS0+aGVhZGVyLm5jb2xvcnMpLAorICAgICAoSkRJTUVOU0lPTikgaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAvKiBjb3VudCBmaWxlIGlucHV0IGFzIHNlcGFyYXRlIHBhc3MgKi8KKyAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7CisgIH0KKyNlbmRpZgorCisgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworfQorCisKKy8qCisgKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgorICogQ2FsbGVkIG9ubHkgYWZ0ZXIgbG9hZF9pbWFnZSBoYXMgcmVhZCB0aGUgaW1hZ2UgaW50byB0aGUgdmlydHVhbCBhcnJheS4KKyAqIFVzZWQgZm9yIEdSQVlTQ0FMRSwgTUFQUEVER1JBWSwgVFJVRUNPTE9SLCBhbmQgRElSRUNUQ09MT1IgaW1hZ2VzLgorICovCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0X3JsZV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBybGVfc291cmNlX3B0ciBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpIHNpbmZvOworCisgIHNvdXJjZS0+cm93LS07CisgIHNvdXJjZS0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgc291cmNlLT5yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIG9uZSByb3cgb2YgcGl4ZWxzLgorICogQ2FsbGVkIG9ubHkgYWZ0ZXIgbG9hZF9pbWFnZSBoYXMgcmVhZCB0aGUgaW1hZ2UgaW50byB0aGUgdmlydHVhbCBhcnJheS4KKyAqIFVzZWQgZm9yIFBTRVVET0NPTE9SIGltYWdlcy4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF9wc2V1ZG9jb2xvcl9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICBybGVfc291cmNlX3B0ciBzb3VyY2UgPSAocmxlX3NvdXJjZV9wdHIpIHNpbmZvOworICBKU0FNUFJPVyBzcmNfcm93LCBkZXN0X3JvdzsKKyAgSkRJTUVOU0lPTiBjb2w7CisgIHJsZV9tYXAgKmNvbG9ybWFwOworICBpbnQgdmFsOworCisgIGNvbG9ybWFwID0gc291cmNlLT5oZWFkZXIuY21hcDsKKyAgZGVzdF9yb3cgPSBzb3VyY2UtPnB1Yi5idWZmZXJbMF07CisgIHNvdXJjZS0+cm93LS07CisgIHNyY19yb3cgPSAqICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgc291cmNlLT5yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgdmFsID0gR0VUSlNBTVBMRSgqc3JjX3JvdysrKTsKKyAgICAqZGVzdF9yb3crKyA9IChKU0FNUExFKSAoY29sb3JtYXBbdmFsICAgICAgXSA+PiA4KTsKKyAgICAqZGVzdF9yb3crKyA9IChKU0FNUExFKSAoY29sb3JtYXBbdmFsICsgMjU2XSA+PiA4KTsKKyAgICAqZGVzdF9yb3crKyA9IChKU0FNUExFKSAoY29sb3JtYXBbdmFsICsgNTEyXSA+PiA4KTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisKKy8qCisgKiBMb2FkIHRoZSBpbWFnZSBpbnRvIGEgdmlydHVhbCBhcnJheS4gIFdlIGhhdmUgdG8gZG8gdGhpcyBiZWNhdXNlIFJMRQorICogZmlsZXMgc3RhcnQgYXQgdGhlIGxvd2VyIGxlZnQgd2hpbGUgdGhlIEpQRUcgc3RhbmRhcmQgaGFzIHRoZW0gc3RhcnRpbmcKKyAqIGluIHRoZSB1cHBlciBsZWZ0LiAgVGhpcyBpcyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgd2Ugd2FudCB0byBnZXQgYSByb3cKKyAqIG9mIGlucHV0LiAgV2hhdCB3ZSBkbyBpcyBsb2FkIHRoZSBSTEUgZGF0YSBpbnRvIHRoZSBhcnJheSBhbmQgdGhlbiBjYWxsCisgKiB0aGUgYXBwcm9wcmlhdGUgcm91dGluZSB0byByZWFkIG9uZSByb3cgZnJvbSB0aGUgYXJyYXkuICBCZWZvcmUgcmV0dXJuaW5nLAorICogd2Ugc2V0IHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzIHNvIHRoYXQgc3Vic2VxdWVudCBjYWxscyBnbyBzdHJhaWdodCB0bworICogdGhlIGFwcHJvcHJpYXRlIHJvdy1yZWFkaW5nIHJvdXRpbmUuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitsb2FkX2ltYWdlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgcmxlX3NvdXJjZV9wdHIgc291cmNlID0gKHJsZV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgSkRJTUVOU0lPTiByb3csIGNvbDsKKyAgSlNBTVBST1cgIHNjYW5saW5lLCByZWRfcHRyLCBncmVlbl9wdHIsIGJsdWVfcHRyOworICBybGVfcGl4ZWwgKipybGVfcm93OworICBybGVfbWFwICpjb2xvcm1hcDsKKyAgY2hhciBjaGFubmVsOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisjZW5kaWYKKworICBjb2xvcm1hcCA9IHNvdXJjZS0+aGVhZGVyLmNtYXA7CisgIHJsZV9yb3cgPSBzb3VyY2UtPnJsZV9yb3c7CisKKyAgLyogUmVhZCB0aGUgUkxFIGRhdGEgaW50byBvdXIgdmlydHVhbCBhcnJheS4KKyAgICogV2UgYXNzdW1lIGhlcmUgdGhhdCAoYSkgcmxlX3BpeGVsIGlzIHJlcHJlc2VudGVkIHRoZSBzYW1lIGFzIEpTQU1QTEUsCisgICAqIGFuZCAoYikgd2UgYXJlIG5vdCBvbiBhIG1hY2hpbmUgd2hlcmUgRkFSIHBvaW50ZXJzIGRpZmZlciBmcm9tIHJlZ3VsYXIuCisgICAqLworICBSTEVfQ0xSX0JJVChzb3VyY2UtPmhlYWRlciwgUkxFX0FMUEhBKTsgLyogZG9uJ3QgcmVhZCB0aGUgYWxwaGEgY2hhbm5lbCAqLworCisjaWZkZWYgUFJPR1JFU1NfUkVQT1JUCisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IDA7CisgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKyNlbmRpZgorCisgIHN3aXRjaCAoc291cmNlLT52aXN1YWwpIHsKKworICBjYXNlIEdSQVlTQ0FMRToKKyAgY2FzZSBQU0VVRE9DT0xPUjoKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7CisgICAgICBybGVfcm93ID0gKHJsZV9waXhlbCAqKikgKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+aW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICAgICAgcmxlX2dldHJvdygmc291cmNlLT5oZWFkZXIsIHJsZV9yb3cpOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKKyAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBNQVBQRURHUkFZOgorICBjYXNlIFRSVUVDT0xPUjoKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7CisgICAgICBzY2FubGluZSA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgICAgICBybGVfcm93ID0gc291cmNlLT5ybGVfcm93OworICAgICAgcmxlX2dldHJvdygmc291cmNlLT5oZWFkZXIsIHJsZV9yb3cpOworCisgICAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sKyspIHsKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHNvdXJjZS0+aGVhZGVyLm5jb2xvcnM7IGNoYW5uZWwrKykgeworICAgICAgICAgICpzY2FubGluZSsrID0gKEpTQU1QTEUpCisgICAgICAgICAgICAoY29sb3JtYXBbR0VUSlNBTVBMRShybGVfcm93W2NoYW5uZWxdW2NvbF0pICsgMjU2ICogY2hhbm5lbF0gPj4gOCk7CisgICAgICAgIH0KKyAgICAgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKKyAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBESVJFQ1RDT0xPUjoKKyAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IHJvdysrKSB7CisgICAgICBzY2FubGluZSA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgc291cmNlLT5pbWFnZSwgcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgICAgICBybGVfZ2V0cm93KCZzb3VyY2UtPmhlYWRlciwgcmxlX3Jvdyk7CisKKyAgICAgIHJlZF9wdHIgICA9IHJsZV9yb3dbMF07CisgICAgICBncmVlbl9wdHIgPSBybGVfcm93WzFdOworICAgICAgYmx1ZV9wdHIgID0gcmxlX3Jvd1syXTsKKworICAgICAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAgICpzY2FubGluZSsrID0gKnJlZF9wdHIrKzsKKyAgICAgICAgKnNjYW5saW5lKysgPSAqZ3JlZW5fcHRyKys7CisgICAgICAgICpzY2FubGluZSsrID0gKmJsdWVfcHRyKys7CisgICAgICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgICAgIGlmIChwcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyKys7CisgICAgICAgICgqcHJvZ3Jlc3MtPnB1Yi5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOworICAgICAgfQorI2VuZGlmCisgICAgfQorICB9CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpCisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKKyNlbmRpZgorCisgIC8qIFNldCB1cCB0byBjYWxsIHByb3BlciByb3ctZXh0cmFjdGlvbiByb3V0aW5lIGluIGZ1dHVyZSAqLworICBpZiAoc291cmNlLT52aXN1YWwgPT0gUFNFVURPQ09MT1IpIHsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSBzb3VyY2UtPnJsZV9yb3c7CisgICAgc291cmNlLT5wdWIuZ2V0X3BpeGVsX3Jvd3MgPSBnZXRfcHNldWRvY29sb3Jfcm93OworICB9IGVsc2UgeworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X3JsZV9yb3c7CisgIH0KKyAgc291cmNlLT5yb3cgPSBjaW5mby0+aW1hZ2VfaGVpZ2h0OworCisgIC8qIEFuZCBmZXRjaCB0aGUgdG9wbW9zdCAoYm90dG9tbW9zdCkgcm93ICovCisgIHJldHVybiAoKnNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzKSAoY2luZm8sIHNpbmZvKTsgICAKK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfaW5wdXRfcmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKK3sKKyAgLyogbm8gd29yayAqLworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBSTEUgZm9ybWF0IGlucHV0LgorICovCisKK0dMT0JBTChjanBlZ19zb3VyY2VfcHRyKQoramluaXRfcmVhZF9ybGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBybGVfc291cmNlX3B0ciBzb3VyY2U7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCisgIHNvdXJjZSA9IChybGVfc291cmNlX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRU9GKHJsZV9zb3VyY2Vfc3RydWN0KSk7CisgIC8qIEZpbGwgaW4gbWV0aG9kIHB0cnMgKi8KKyAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF9ybGU7CisgIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF9ybGU7CisgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gbG9hZF9pbWFnZTsKKworICByZXR1cm4gKGNqcGVnX3NvdXJjZV9wdHIpIHNvdXJjZTsKK30KKworI2VuZGlmIC8qIFJMRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZHN3aXRjaC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Jkc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0YmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZHN3aXRjaC5jCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogcmRzd2l0Y2guYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHByb2Nlc3Mgc29tZSBvZiBjanBlZydzIG1vcmUgY29tcGxpY2F0ZWQKKyAqIGNvbW1hbmQtbGluZSBzd2l0Y2hlcy4gIFN3aXRjaGVzIHByb2Nlc3NlZCBoZXJlIGFyZToKKyAqCS1xdGFibGVzIGZpbGUJCVJlYWQgcXVhbnRpemF0aW9uIHRhYmxlcyBmcm9tIHRleHQgZmlsZQorICoJLXNjYW5zIGZpbGUJCVJlYWQgc2NhbiBzY3JpcHQgZnJvbSB0ZXh0IGZpbGUKKyAqCS1xc2xvdHMgTlssTiwuLi5dCVNldCBjb21wb25lbnQgcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9ycworICoJLXNhbXBsZSBIeFZbLEh4ViwuLi5dCVNldCBjb21wb25lbnQgc2FtcGxpbmcgZmFjdG9ycworICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisjaW5jbHVkZSA8Y3R5cGUuaD4JCS8qIHRvIGRlY2xhcmUgaXNkaWdpdCgpLCBpc3NwYWNlKCkgKi8KKworCitMT0NBTChpbnQpCit0ZXh0X2dldGMgKEZJTEUgKiBmaWxlKQorLyogUmVhZCBuZXh0IGNoYXIsIHNraXBwaW5nIG92ZXIgYW55IGNvbW1lbnRzICgjIHRvIGVuZCBvZiBsaW5lKSAqLworLyogQSBjb21tZW50L25ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgYXMgYSBuZXdsaW5lICovCit7CisgIHJlZ2lzdGVyIGludCBjaDsKKyAgCisgIGNoID0gZ2V0YyhmaWxlKTsKKyAgaWYgKGNoID09ICcjJykgeworICAgIGRvIHsKKyAgICAgIGNoID0gZ2V0YyhmaWxlKTsKKyAgICB9IHdoaWxlIChjaCAhPSAnXG4nICYmIGNoICE9IEVPRik7CisgIH0KKyAgcmV0dXJuIGNoOworfQorCisKK0xPQ0FMKGJvb2xlYW4pCityZWFkX3RleHRfaW50ZWdlciAoRklMRSAqIGZpbGUsIGxvbmcgKiByZXN1bHQsIGludCAqIHRlcm1jaGFyKQorLyogUmVhZCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgZnJvbSBhIGZpbGUsIHN0b3JlIGl0IGluIHJlc3VsdCAqLworLyogUmVhZHMgb25lIHRyYWlsaW5nIGNoYXJhY3RlciBhZnRlciB0aGUgaW50ZWdlcjsgcmV0dXJucyBpdCBpbiB0ZXJtY2hhciAqLworeworICByZWdpc3RlciBpbnQgY2g7CisgIHJlZ2lzdGVyIGxvbmcgdmFsOworICAKKyAgLyogU2tpcCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLCBkZXRlY3QgRU9GICovCisgIGRvIHsKKyAgICBjaCA9IHRleHRfZ2V0YyhmaWxlKTsKKyAgICBpZiAoY2ggPT0gRU9GKSB7CisgICAgICAqdGVybWNoYXIgPSBjaDsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIH0gd2hpbGUgKGlzc3BhY2UoY2gpKTsKKyAgCisgIGlmICghIGlzZGlnaXQoY2gpKSB7CisgICAgKnRlcm1jaGFyID0gY2g7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdmFsID0gY2ggLSAnMCc7CisgIHdoaWxlICgoY2ggPSB0ZXh0X2dldGMoZmlsZSkpICE9IEVPRikgeworICAgIGlmICghIGlzZGlnaXQoY2gpKQorICAgICAgYnJlYWs7CisgICAgdmFsICo9IDEwOworICAgIHZhbCArPSBjaCAtICcwJzsKKyAgfQorICAqcmVzdWx0ID0gdmFsOworICAqdGVybWNoYXIgPSBjaDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworR0xPQkFMKGJvb2xlYW4pCityZWFkX3F1YW50X3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKKwkJICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKKy8qIFJlYWQgYSBzZXQgb2YgcXVhbnRpemF0aW9uIHRhYmxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAqIFRoZSBmaWxlIGlzIHBsYWluIEFTQ0lJIHRleHQ6IGRlY2ltYWwgbnVtYmVycyB3aXRoIHdoaXRlc3BhY2UgYmV0d2Vlbi4KKyAqIENvbW1lbnRzIHByZWNlZGVkIGJ5ICcjJyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGUuCisgKiBUaGVyZSBtYXkgYmUgb25lIHRvIE5VTV9RVUFOVF9UQkxTIHRhYmxlcyBpbiB0aGUgZmlsZSwgZWFjaCBvZiA2NCB2YWx1ZXMuCisgKiBUaGUgdGFibGVzIGFyZSBpbXBsaWNpdGx5IG51bWJlcmVkIDAsMSxldGMuCisgKiBOT1RFOiBkb2VzIG5vdCBhZmZlY3QgdGhlIHFzbG90cyBtYXBwaW5nLCB3aGljaCB3aWxsIGRlZmF1bHQgdG8gc2VsZWN0aW5nCisgKiB0YWJsZSAwIGZvciBsdW1pbmFuY2UgKG9yIHByaW1hcnkpIGNvbXBvbmVudHMsIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuCisgKiBZb3UgbXVzdCB1c2UgLXFzbG90cyBpZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBjb21wb25lbnQtPnRhYmxlIG1hcHBpbmcuCisgKi8KK3sKKyAgRklMRSAqIGZwOworICBpbnQgdGJsbm8sIGksIHRlcm1jaGFyOworICBsb25nIHZhbDsKKyAgdW5zaWduZWQgaW50IHRhYmxlW0RDVFNJWkUyXTsKKworICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gdGFibGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB0YmxubyA9IDA7CisKKyAgd2hpbGUgKHJlYWRfdGV4dF9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpKSB7IC8qIHJlYWQgMXN0IGVsZW1lbnQgb2YgdGFibGUgKi8KKyAgICBpZiAodGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdGFibGVzIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHRhYmxlWzBdID0gKHVuc2lnbmVkIGludCkgdmFsOworICAgIGZvciAoaSA9IDE7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7CisgICAgICBpZiAoISByZWFkX3RleHRfaW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSkgeworCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCB0YWJsZSBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKwlmY2xvc2UoZnApOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHRhYmxlW2ldID0gKHVuc2lnbmVkIGludCkgdmFsOworICAgIH0KKyAgICBqcGVnX2FkZF9xdWFudF90YWJsZShjaW5mbywgdGJsbm8sIHRhYmxlLCBzY2FsZV9mYWN0b3IsIGZvcmNlX2Jhc2VsaW5lKTsKKyAgICB0YmxubysrOworICB9CisKKyAgaWYgKHRlcm1jaGFyICE9IEVPRikgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm9uLW51bWVyaWMgZGF0YSBpbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBmY2xvc2UoZnApOworICByZXR1cm4gVFJVRTsKK30KKworCisjaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECisKK0xPQ0FMKGJvb2xlYW4pCityZWFkX3NjYW5faW50ZWdlciAoRklMRSAqIGZpbGUsIGxvbmcgKiByZXN1bHQsIGludCAqIHRlcm1jaGFyKQorLyogVmFyaWFudCBvZiByZWFkX3RleHRfaW50ZWdlciB0aGF0IGFsd2F5cyBsb29rcyBmb3IgYSBub24tc3BhY2UgdGVybWNoYXI7CisgKiB0aGlzIHNpbXBsaWZpZXMgcGFyc2luZyBvZiBwdW5jdHVhdGlvbiBpbiBzY2FuIHNjcmlwdHMuCisgKi8KK3sKKyAgcmVnaXN0ZXIgaW50IGNoOworCisgIGlmICghIHJlYWRfdGV4dF9pbnRlZ2VyKGZpbGUsIHJlc3VsdCwgdGVybWNoYXIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgY2ggPSAqdGVybWNoYXI7CisgIHdoaWxlIChjaCAhPSBFT0YgJiYgaXNzcGFjZShjaCkpCisgICAgY2ggPSB0ZXh0X2dldGMoZmlsZSk7CisgIGlmIChpc2RpZ2l0KGNoKSkgewkJLyogb29wcywgcHV0IGl0IGJhY2sgKi8KKyAgICBpZiAodW5nZXRjKGNoLCBmaWxlKSA9PSBFT0YpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgY2ggPSAnICc7CisgIH0gZWxzZSB7CisgICAgLyogQW55IHNlcGFyYXRvcnMgb3RoZXIgdGhhbiAnOycgYW5kICc6JyBhcmUgaWdub3JlZDsKKyAgICAgKiB0aGlzIGFsbG93cyB1c2VyIHRvIGluc2VydCBjb21tYXMsIGV0YywgaWYgZGVzaXJlZC4KKyAgICAgKi8KKyAgICBpZiAoY2ggIT0gRU9GICYmIGNoICE9ICc7JyAmJiBjaCAhPSAnOicpCisgICAgICBjaCA9ICcgJzsKKyAgfQorICAqdGVybWNoYXIgPSBjaDsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKworR0xPQkFMKGJvb2xlYW4pCityZWFkX3NjYW5fc2NyaXB0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKQorLyogUmVhZCBhIHNjYW4gc2NyaXB0IGZyb20gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCisgKiBFYWNoIGVudHJ5IGluIHRoZSBmaWxlIGRlZmluZXMgb25lIHNjYW4gdG8gYmUgZW1pdHRlZC4KKyAqIEVudHJpZXMgYXJlIHNlcGFyYXRlZCBieSBzZW1pY29sb25zICc7Jy4KKyAqIEFuIGVudHJ5IGNvbnRhaW5zIG9uZSB0byBmb3VyIGNvbXBvbmVudCBpbmRleGVzLAorICogb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhIGNvbG9uICc6JyBhbmQgZm91ciBwcm9ncmVzc2l2ZS1KUEVHIHBhcmFtZXRlcnMuCisgKiBUaGUgY29tcG9uZW50IGluZGV4ZXMgZGVub3RlIHdoaWNoIGNvbXBvbmVudChzKSBhcmUgdG8gYmUgdHJhbnNtaXR0ZWQKKyAqIGluIHRoZSBjdXJyZW50IHNjYW4uICBUaGUgZmlyc3QgY29tcG9uZW50IGhhcyBpbmRleCAwLgorICogU2VxdWVudGlhbCBKUEVHIGlzIHVzZWQgaWYgdGhlIHByb2dyZXNzaXZlLUpQRUcgcGFyYW1ldGVycyBhcmUgb21pdHRlZC4KKyAqIFRoZSBmaWxlIGlzIGZyZWUgZm9ybWF0IHRleHQ6IGFueSB3aGl0ZXNwYWNlIG1heSBhcHBlYXIgYmV0d2VlbiBudW1iZXJzCisgKiBhbmQgdGhlICc6JyBhbmQgJzsnIHB1bmN0dWF0aW9uIG1hcmtzLiAgQWxzbywgb3RoZXIgcHVuY3R1YXRpb24gKHN1Y2gKKyAqIGFzIGNvbW1hcyBvciBkYXNoZXMpIGNhbiBiZSBwbGFjZWQgYmV0d2VlbiBudW1iZXJzIGlmIGRlc2lyZWQuCisgKiBDb21tZW50cyBwcmVjZWRlZCBieSAnIycgbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBmaWxlLgorICogTm90ZTogd2UgZG8gdmVyeSBsaXR0bGUgdmFsaWRpdHkgY2hlY2tpbmcgaGVyZTsKKyAqIGpjbWFzdGVyLmMgd2lsbCB2YWxpZGF0ZSB0aGUgc2NyaXB0IHBhcmFtZXRlcnMuCisgKi8KK3sKKyAgRklMRSAqIGZwOworICBpbnQgc2Nhbm5vLCBuY29tcHMsIHRlcm1jaGFyOworICBsb25nIHZhbDsKKyAganBlZ19zY2FuX2luZm8gKiBzY2FucHRyOworI2RlZmluZSBNQVhfU0NBTlMgIDEwMAkJLyogcXVpdGUgYXJiaXRyYXJ5IGxpbWl0ICovCisgIGpwZWdfc2Nhbl9pbmZvIHNjYW5zW01BWF9TQ0FOU107CisKKyAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIHNjYW4gZGVmaW5pdGlvbiBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHNjYW5wdHIgPSBzY2FuczsKKyAgc2Nhbm5vID0gMDsKKworICB3aGlsZSAocmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpIHsKKyAgICBpZiAoc2Nhbm5vID49IE1BWF9TQ0FOUykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBzY2FucyBkZWZpbmVkIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFswXSA9IChpbnQpIHZhbDsKKyAgICBuY29tcHMgPSAxOworICAgIHdoaWxlICh0ZXJtY2hhciA9PSAnICcpIHsKKyAgICAgIGlmIChuY29tcHMgPj0gTUFYX0NPTVBTX0lOX1NDQU4pIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlRvbyBtYW55IGNvbXBvbmVudHMgaW4gb25lIHNjYW4gaW4gZmlsZSAlc1xuIiwKKwkJZmlsZW5hbWUpOworCWZjbG9zZShmcCk7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpCisJZ290byBib2d1czsKKyAgICAgIHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtuY29tcHNdID0gKGludCkgdmFsOworICAgICAgbmNvbXBzKys7CisgICAgfQorICAgIHNjYW5wdHItPmNvbXBzX2luX3NjYW4gPSBuY29tcHM7CisgICAgaWYgKHRlcm1jaGFyID09ICc6JykgeworICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikgfHwgdGVybWNoYXIgIT0gJyAnKQorCWdvdG8gYm9ndXM7CisgICAgICBzY2FucHRyLT5TcyA9IChpbnQpIHZhbDsKKyAgICAgIGlmICghIHJlYWRfc2Nhbl9pbnRlZ2VyKGZwLCAmdmFsLCAmdGVybWNoYXIpIHx8IHRlcm1jaGFyICE9ICcgJykKKwlnb3RvIGJvZ3VzOworICAgICAgc2NhbnB0ci0+U2UgPSAoaW50KSB2YWw7CisgICAgICBpZiAoISByZWFkX3NjYW5faW50ZWdlcihmcCwgJnZhbCwgJnRlcm1jaGFyKSB8fCB0ZXJtY2hhciAhPSAnICcpCisJZ290byBib2d1czsKKyAgICAgIHNjYW5wdHItPkFoID0gKGludCkgdmFsOworICAgICAgaWYgKCEgcmVhZF9zY2FuX2ludGVnZXIoZnAsICZ2YWwsICZ0ZXJtY2hhcikpCisJZ290byBib2d1czsKKyAgICAgIHNjYW5wdHItPkFsID0gKGludCkgdmFsOworICAgIH0gZWxzZSB7CisgICAgICAvKiBzZXQgbm9uLXByb2dyZXNzaXZlIHBhcmFtZXRlcnMgKi8KKyAgICAgIHNjYW5wdHItPlNzID0gMDsKKyAgICAgIHNjYW5wdHItPlNlID0gRENUU0laRTItMTsKKyAgICAgIHNjYW5wdHItPkFoID0gMDsKKyAgICAgIHNjYW5wdHItPkFsID0gMDsKKyAgICB9CisgICAgaWYgKHRlcm1jaGFyICE9ICc7JyAmJiB0ZXJtY2hhciAhPSBFT0YpIHsKK2JvZ3VzOgorICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHNjYW4gZW50cnkgZm9ybWF0IGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGZjbG9zZShmcCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHNjYW5wdHIrKywgc2Nhbm5vKys7CisgIH0KKworICBpZiAodGVybWNoYXIgIT0gRU9GKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJOb24tbnVtZXJpYyBkYXRhIGluIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChzY2Fubm8gPiAwKSB7CisgICAgLyogU3Rhc2ggY29tcGxldGVkIHNjYW4gbGlzdCBpbiBjaW5mbyBzdHJ1Y3R1cmUuCisgICAgICogTk9URTogZm9yIGNqcGVnJ3MgdXNlLCBKUE9PTF9JTUFHRSBpcyB0aGUgcmlnaHQgbGlmZXRpbWUgZm9yIHRoaXMgZGF0YSwKKyAgICAgKiBidXQgaWYgeW91IHdhbnQgdG8gY29tcHJlc3MgbXVsdGlwbGUgaW1hZ2VzIHlvdSdkIHdhbnQgSlBPT0xfUEVSTUFORU5ULgorICAgICAqLworICAgIHNjYW5wdHIgPSAoanBlZ19zY2FuX2luZm8gKikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBzY2Fubm8gKiBTSVpFT0YoanBlZ19zY2FuX2luZm8pKTsKKyAgICBNRU1DT1BZKHNjYW5wdHIsIHNjYW5zLCBzY2Fubm8gKiBTSVpFT0YoanBlZ19zY2FuX2luZm8pKTsKKyAgICBjaW5mby0+c2Nhbl9pbmZvID0gc2NhbnB0cjsKKyAgICBjaW5mby0+bnVtX3NjYW5zID0gc2Nhbm5vOworICB9CisKKyAgZmNsb3NlKGZwKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KKworCitHTE9CQUwoYm9vbGVhbikKK3NldF9xdWFudF9zbG90cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykKKy8qIFByb2Nlc3MgYSBxdWFudGl6YXRpb24tdGFibGUtc2VsZWN0b3JzIHBhcmFtZXRlciBzdHJpbmcsIG9mIHRoZSBmb3JtCisgKiAgICAgTlssTiwuLi5dCisgKiBJZiB0aGVyZSBhcmUgbW9yZSBjb21wb25lbnRzIHRoYW4gcGFyYW1ldGVycywgdGhlIGxhc3QgdmFsdWUgaXMgcmVwbGljYXRlZC4KKyAqLworeworICBpbnQgdmFsID0gMDsJCQkvKiBkZWZhdWx0IHRhYmxlICMgKi8KKyAgaW50IGNpOworICBjaGFyIGNoOworCisgIGZvciAoY2kgPSAwOyBjaSA8IE1BWF9DT01QT05FTlRTOyBjaSsrKSB7CisgICAgaWYgKCphcmcpIHsKKyAgICAgIGNoID0gJywnOwkJCS8qIGlmIG5vdCBzZXQgYnkgc3NjYW5mLCB3aWxsIGJlICcsJyAqLworICAgICAgaWYgKHNzY2FuZihhcmcsICIlZCVjIiwgJnZhbCwgJmNoKSA8IDEpCisJcmV0dXJuIEZBTFNFOworICAgICAgaWYgKGNoICE9ICcsJykJCS8qIHN5bnRheCBjaGVjayAqLworCXJldHVybiBGQUxTRTsKKyAgICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+PSBOVU1fUVVBTlRfVEJMUykgeworCWZwcmludGYoc3RkZXJyLCAiSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4lZFxuIiwKKwkJTlVNX1FVQU5UX1RCTFMtMSk7CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0ucXVhbnRfdGJsX25vID0gdmFsOworICAgICAgd2hpbGUgKCphcmcgJiYgKmFyZysrICE9ICcsJykgLyogYWR2YW5jZSB0byBuZXh0IHNlZ21lbnQgb2YgYXJnIHN0cmluZyAqLworCTsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVhY2hlZCBlbmQgb2YgcGFyYW1ldGVyLCBzZXQgcmVtYWluaW5nIGNvbXBvbmVudHMgdG8gbGFzdCB0YWJsZSAqLworICAgICAgY2luZm8tPmNvbXBfaW5mb1tjaV0ucXVhbnRfdGJsX25vID0gdmFsOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitHTE9CQUwoYm9vbGVhbikKK3NldF9zYW1wbGVfZmFjdG9ycyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykKKy8qIFByb2Nlc3MgYSBzYW1wbGUtZmFjdG9ycyBwYXJhbWV0ZXIgc3RyaW5nLCBvZiB0aGUgZm9ybQorICogICAgIEh4VlssSHhWLC4uLl0KKyAqIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBvbmVudHMgdGhhbiBwYXJhbWV0ZXJzLCAiMXgxIiBpcyBhc3N1bWVkIGZvciB0aGUgcmVzdC4KKyAqLworeworICBpbnQgY2ksIHZhbDEsIHZhbDI7CisgIGNoYXIgY2gxLCBjaDI7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgTUFYX0NPTVBPTkVOVFM7IGNpKyspIHsKKyAgICBpZiAoKmFyZykgeworICAgICAgY2gyID0gJywnOwkJLyogaWYgbm90IHNldCBieSBzc2NhbmYsIHdpbGwgYmUgJywnICovCisgICAgICBpZiAoc3NjYW5mKGFyZywgIiVkJWMlZCVjIiwgJnZhbDEsICZjaDEsICZ2YWwyLCAmY2gyKSA8IDMpCisJcmV0dXJuIEZBTFNFOworICAgICAgaWYgKChjaDEgIT0gJ3gnICYmIGNoMSAhPSAnWCcpIHx8IGNoMiAhPSAnLCcpIC8qIHN5bnRheCBjaGVjayAqLworCXJldHVybiBGQUxTRTsKKyAgICAgIGlmICh2YWwxIDw9IDAgfHwgdmFsMSA+IDQgfHwgdmFsMiA8PSAwIHx8IHZhbDIgPiA0KSB7CisJZnByaW50ZihzdGRlcnIsICJKUEVHIHNhbXBsaW5nIGZhY3RvcnMgbXVzdCBiZSAxLi40XG4iKTsKKwlyZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yID0gdmFsMTsKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgPSB2YWwyOworICAgICAgd2hpbGUgKCphcmcgJiYgKmFyZysrICE9ICcsJykgLyogYWR2YW5jZSB0byBuZXh0IHNlZ21lbnQgb2YgYXJnIHN0cmluZyAqLworCTsKKyAgICB9IGVsc2UgeworICAgICAgLyogcmVhY2hlZCBlbmQgb2YgcGFyYW1ldGVyLCBzZXQgcmVtYWluaW5nIGNvbXBvbmVudHMgdG8gMXgxIHNhbXBsaW5nICovCisgICAgICBjaW5mby0+Y29tcF9pbmZvW2NpXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICAgIGNpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9yZHRhcmdhLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmR0YXJnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMmNkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvcmR0YXJnYS5jCkBAIC0wLDAgKzEsNTAwIEBACisvKgorICogcmR0YXJnYS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcmVhZCBpbnB1dCBpbWFnZXMgaW4gVGFyZ2EgZm9ybWF0LgorICoKKyAqIFRoZXNlIHJvdXRpbmVzIG1heSBuZWVkIG1vZGlmaWNhdGlvbiBmb3Igbm9uLVVuaXggZW52aXJvbm1lbnRzIG9yCisgKiBzcGVjaWFsaXplZCBhcHBsaWNhdGlvbnMuICBBcyB0aGV5IHN0YW5kLCB0aGV5IGFzc3VtZSBpbnB1dCBmcm9tCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uICBUaGV5IGZ1cnRoZXIgYXNzdW1lIHRoYXQgcmVhZGluZyBiZWdpbnMKKyAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZTsgc3RhcnRfaW5wdXQgbWF5IG5lZWQgd29yayBpZiB0aGUKKyAqIHVzZXIgaW50ZXJmYWNlIGhhcyBhbHJlYWR5IHJlYWQgc29tZSBkYXRhIChlLmcuLCB0byBkZXRlcm1pbmUgdGhhdAorICogdGhlIGZpbGUgaXMgaW5kZWVkIFRhcmdhIGZvcm1hdCkuCisgKgorICogQmFzZWQgb24gY29kZSBjb250cmlidXRlZCBieSBMZWUgRGFuaWVsIENyb2NrZXIuCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFRBUkdBX1NVUFBPUlRFRAorCisKKy8qIE1hY3JvcyB0byBkZWFsIHdpdGggdW5zaWduZWQgY2hhcnMgYXMgZWZmaWNpZW50bHkgYXMgY29tcGlsZXIgYWxsb3dzICovCisKKyNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UgLyogIUhBVkVfVU5TSUdORURfQ0hBUiAqLworI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpKQorI2Vsc2UKK3R5cGVkZWYgY2hhciBVX0NIQVI7CisjZGVmaW5lIFVDSCh4KQkoKGludCkgKHgpICYgMHhGRikKKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLworCisKKyNkZWZpbmUJUmVhZE9LKGZpbGUsYnVmZmVyLGxlbikJKEpGUkVBRChmaWxlLGJ1ZmZlcixsZW4pID09ICgoc2l6ZV90KSAobGVuKSkpCisKKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgc291cmNlIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCBfdGdhX3NvdXJjZV9zdHJ1Y3QgKiB0Z2Ffc291cmNlX3B0cjsKKwordHlwZWRlZiBzdHJ1Y3QgX3RnYV9zb3VyY2Vfc3RydWN0IHsKKyAgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCisKKyAgal9jb21wcmVzc19wdHIgY2luZm87CQkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCisKKyAgSlNBTVBBUlJBWSBjb2xvcm1hcDsJCS8qIFRhcmdhIGNvbG9ybWFwIChjb252ZXJ0ZWQgdG8gbXkgZm9ybWF0KSAqLworCisgIGp2aXJ0X3NhcnJheV9wdHIgd2hvbGVfaW1hZ2U7CS8qIE5lZWRlZCBpZiBmdW5ueSBpbnB1dCByb3cgb3JkZXIgKi8KKyAgSkRJTUVOU0lPTiBjdXJyZW50X3JvdzsJLyogQ3VycmVudCBsb2dpY2FsIHJvdyBudW1iZXIgdG8gcmVhZCAqLworCisgIC8qIFBvaW50ZXIgdG8gcm91dGluZSB0byBleHRyYWN0IG5leHQgVGFyZ2EgcGl4ZWwgZnJvbSBpbnB1dCBmaWxlICovCisgIEpNRVRIT0Qodm9pZCwgcmVhZF9waXhlbCwgKHRnYV9zb3VyY2VfcHRyIHNpbmZvKSk7CisKKyAgLyogUmVzdWx0IG9mIHJlYWRfcGl4ZWwgaXMgZGVsaXZlcmVkIGhlcmU6ICovCisgIFVfQ0hBUiB0Z2FfcGl4ZWxbNF07CisKKyAgaW50IHBpeGVsX3NpemU7CQkvKiBCeXRlcyBwZXIgVGFyZ2EgcGl4ZWwgKDEgdG8gNCkgKi8KKworICAvKiBTdGF0ZSBpbmZvIGZvciByZWFkaW5nIFJMRS1jb2RlZCBwaXhlbHM7IGJvdGggY291bnRzIG11c3QgYmUgaW5pdCB0byAwICovCisgIGludCBibG9ja19jb3VudDsJCS8qICMgb2YgcGl4ZWxzIHJlbWFpbmluZyBpbiBSTEUgYmxvY2sgKi8KKyAgaW50IGR1cF9waXhlbF9jb3VudDsJCS8qICMgb2YgdGltZXMgdG8gZHVwbGljYXRlIHByZXZpb3VzIHBpeGVsICovCisKKyAgLyogVGhpcyBzYXZlcyB0aGUgY29ycmVjdCBwaXhlbC1yb3ctZXhwYW5zaW9uIG1ldGhvZCBmb3IgcHJlbG9hZF9pbWFnZSAqLworICBKTUVUSE9EKEpESU1FTlNJT04sIGdldF9waXhlbF9yb3dzLCAoal9jb21wcmVzc19wdHIgY2luZm8sCisJCQkJICAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKK30gdGdhX3NvdXJjZV9zdHJ1Y3Q7CisKKworLyogRm9yIGV4cGFuZGluZyA1LWJpdCBwaXhlbCB2YWx1ZXMgdG8gOC1iaXQgd2l0aCBiZXN0IHJvdW5kaW5nICovCisKK3N0YXRpYyBjb25zdCBVSU5UOCBjNXRvOGJpdHNbMzJdID0geworICAgIDAsICAgOCwgIDE2LCAgMjUsICAzMywgIDQxLCAgNDksICA1OCwKKyAgIDY2LCAgNzQsICA4MiwgIDkwLCAgOTksIDEwNywgMTE1LCAxMjMsCisgIDEzMiwgMTQwLCAxNDgsIDE1NiwgMTY1LCAxNzMsIDE4MSwgMTg5LAorICAxOTcsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM5LCAyNDcsIDI1NQorfTsKKworCisKK0xPQ0FMKGludCkKK3JlYWRfYnl0ZSAodGdhX3NvdXJjZV9wdHIgc2luZm8pCisvKiBSZWFkIG5leHQgYnl0ZSBmcm9tIFRhcmdhIGZpbGUgKi8KK3sKKyAgcmVnaXN0ZXIgRklMRSAqaW5maWxlID0gc2luZm8tPnB1Yi5pbnB1dF9maWxlOworICByZWdpc3RlciBpbnQgYzsKKworICBpZiAoKGMgPSBnZXRjKGluZmlsZSkpID09IEVPRikKKyAgICBFUlJFWElUKHNpbmZvLT5jaW5mbywgSkVSUl9JTlBVVF9FT0YpOworICByZXR1cm4gYzsKK30KKworCitMT0NBTCh2b2lkKQorcmVhZF9jb2xvcm1hcCAodGdhX3NvdXJjZV9wdHIgc2luZm8sIGludCBjbWFwbGVuLCBpbnQgbWFwZW50cnlzaXplKQorLyogUmVhZCB0aGUgY29sb3JtYXAgZnJvbSBhIFRhcmdhIGZpbGUgKi8KK3sKKyAgaW50IGk7CisKKyAgLyogUHJlc2VudGx5IG9ubHkgaGFuZGxlcyAyNC1iaXQgQkdSIGZvcm1hdCAqLworICBpZiAobWFwZW50cnlzaXplICE9IDI0KQorICAgIEVSUkVYSVQoc2luZm8tPmNpbmZvLCBKRVJSX1RHQV9CQURDTUFQKTsKKworICBmb3IgKGkgPSAwOyBpIDwgY21hcGxlbjsgaSsrKSB7CisgICAgc2luZm8tPmNvbG9ybWFwWzJdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgc2luZm8tPmNvbG9ybWFwWzFdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgICAgc2luZm8tPmNvbG9ybWFwWzBdW2ldID0gKEpTQU1QTEUpIHJlYWRfYnl0ZShzaW5mbyk7CisgIH0KK30KKworCisvKgorICogcmVhZF9waXhlbCBtZXRob2RzOiBnZXQgYSBzaW5nbGUgcGl4ZWwgZnJvbSBUYXJnYSBmaWxlIGludG8gdGdhX3BpeGVsW10KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3JlYWRfbm9uX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCisvKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlOyBubyBSTEUgZXhwYW5zaW9uICovCit7CisgIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IHNpbmZvLT5waXhlbF9zaXplOyBpKyspIHsKKyAgICBzaW5mby0+dGdhX3BpeGVsW2ldID0gKFVfQ0hBUikgZ2V0YyhpbmZpbGUpOworICB9Cit9CisKKworTUVUSE9EREVGKHZvaWQpCityZWFkX3JsZV9waXhlbCAodGdhX3NvdXJjZV9wdHIgc2luZm8pCisvKiBSZWFkIG9uZSBUYXJnYSBwaXhlbCBmcm9tIHRoZSBpbnB1dCBmaWxlLCBleHBhbmRpbmcgUkxFIGRhdGEgYXMgbmVlZGVkICovCit7CisgIHJlZ2lzdGVyIEZJTEUgKmluZmlsZSA9IHNpbmZvLT5wdWIuaW5wdXRfZmlsZTsKKyAgcmVnaXN0ZXIgaW50IGk7CisKKyAgLyogRHVwbGljYXRlIHByZXZpb3VzbHkgcmVhZCBwaXhlbD8gKi8KKyAgaWYgKHNpbmZvLT5kdXBfcGl4ZWxfY291bnQgPiAwKSB7CisgICAgc2luZm8tPmR1cF9waXhlbF9jb3VudC0tOworICAgIHJldHVybjsKKyAgfQorCisgIC8qIFRpbWUgdG8gcmVhZCBSTEUgYmxvY2sgaGVhZGVyPyAqLworICBpZiAoLS1zaW5mby0+YmxvY2tfY291bnQgPCAwKSB7IC8qIGRlY3JlbWVudCBwaXhlbHMgcmVtYWluaW5nIGluIGJsb2NrICovCisgICAgaSA9IHJlYWRfYnl0ZShzaW5mbyk7CisgICAgaWYgKGkgJiAweDgwKSB7CQkvKiBTdGFydCBvZiBkdXBsaWNhdGUtcGl4ZWwgYmxvY2s/ICovCisgICAgICBzaW5mby0+ZHVwX3BpeGVsX2NvdW50ID0gaSAmIDB4N0Y7IC8qIG51bWJlciBvZiBkdXBzIGFmdGVyIHRoaXMgb25lICovCisgICAgICBzaW5mby0+YmxvY2tfY291bnQgPSAwOwkvKiB0aGVuIHJlYWQgbmV3IGJsb2NrIGhlYWRlciAqLworICAgIH0gZWxzZSB7CisgICAgICBzaW5mby0+YmxvY2tfY291bnQgPSBpICYgMHg3RjsgLyogbnVtYmVyIG9mIHBpeGVscyBhZnRlciB0aGlzIG9uZSAqLworICAgIH0KKyAgfQorCisgIC8qIFJlYWQgbmV4dCBwaXhlbCAqLworICBmb3IgKGkgPSAwOyBpIDwgc2luZm8tPnBpeGVsX3NpemU7IGkrKykgeworICAgIHNpbmZvLT50Z2FfcGl4ZWxbaV0gPSAoVV9DSEFSKSBnZXRjKGluZmlsZSk7CisgIH0KK30KKworCisvKgorICogUmVhZCBvbmUgcm93IG9mIHBpeGVscy4KKyAqCisgKiBXZSBwcm92aWRlIHNldmVyYWwgZGlmZmVyZW50IHZlcnNpb25zIGRlcGVuZGluZyBvbiBpbnB1dCBmaWxlIGZvcm1hdC4KKyAqLworCisKK01FVEhPRERFRihKRElNRU5TSU9OKQorZ2V0XzhiaXRfZ3JheV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGdyYXlzY2FsZSBwaXhlbHMgKi8KK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KKyAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfOGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDgtYml0IGNvbG9ybWFwIGluZGV4ZXMgKi8KK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgaW50IHQ7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIHJlZ2lzdGVyIEpTQU1QQVJSQVkgY29sb3JtYXAgPSBzb3VyY2UtPmNvbG9ybWFwOworCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KKyAgICB0ID0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKKyAgICAqcHRyKysgPSBjb2xvcm1hcFswXVt0XTsKKyAgICAqcHRyKysgPSBjb2xvcm1hcFsxXVt0XTsKKyAgICAqcHRyKysgPSBjb2xvcm1hcFsyXVt0XTsKKyAgfQorICByZXR1cm4gMTsKK30KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfMTZiaXRfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2pwZWdfc291cmNlX3B0ciBzaW5mbykKKy8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgcmVhZGluZyAxNi1iaXQgcGl4ZWxzICovCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIHJlZ2lzdGVyIGludCB0OworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICAKKyAgcHRyID0gc291cmNlLT5wdWIuYnVmZmVyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5pbWFnZV93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAoKnNvdXJjZS0+cmVhZF9waXhlbCkgKHNvdXJjZSk7IC8qIExvYWQgbmV4dCBwaXhlbCBpbnRvIHRnYV9waXhlbCAqLworICAgIHQgPSBVQ0goc291cmNlLT50Z2FfcGl4ZWxbMF0pOworICAgIHQgKz0gVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKSA8PCA4OworICAgIC8qIFdlIGV4cGFuZCA1IGJpdCBkYXRhIHRvIDggYml0IHNhbXBsZSB3aWR0aC4KKyAgICAgKiBUaGUgZm9ybWF0IG9mIHRoZSAxNi1iaXQgKExTQiBmaXJzdCkgaW5wdXQgd29yZCBpcworICAgICAqICAgICB4UlJSUlJHR0dHR0JCQkJCCisgICAgICovCisgICAgcHRyWzJdID0gKEpTQU1QTEUpIGM1dG84Yml0c1t0ICYgMHgxRl07CisgICAgdCA+Pj0gNTsKKyAgICBwdHJbMV0gPSAoSlNBTVBMRSkgYzV0bzhiaXRzW3QgJiAweDFGXTsKKyAgICB0ID4+PSA1OworICAgIHB0clswXSA9IChKU0FNUExFKSBjNXRvOGJpdHNbdCAmIDB4MUZdOworICAgIHB0ciArPSAzOworICB9CisgIHJldHVybiAxOworfQorCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK2dldF8yNGJpdF9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciByZWFkaW5nIDI0LWJpdCBwaXhlbHMgKi8KK3sKKyAgdGdhX3NvdXJjZV9wdHIgc291cmNlID0gKHRnYV9zb3VyY2VfcHRyKSBzaW5mbzsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgCisgIHB0ciA9IHNvdXJjZS0+cHViLmJ1ZmZlclswXTsKKyAgZm9yIChjb2wgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKCpzb3VyY2UtPnJlYWRfcGl4ZWwpIChzb3VyY2UpOyAvKiBMb2FkIG5leHQgcGl4ZWwgaW50byB0Z2FfcGl4ZWwgKi8KKyAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzJdKTsgLyogY2hhbmdlIEJHUiB0byBSR0Igb3JkZXIgKi8KKyAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzFdKTsKKyAgICAqcHRyKysgPSAoSlNBTVBMRSkgVUNIKHNvdXJjZS0+dGdhX3BpeGVsWzBdKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoKKyAqIFRhcmdhIGFsc28gZGVmaW5lcyBhIDMyLWJpdCBwaXhlbCBmb3JtYXQgd2l0aCBvcmRlciBCLEcsUixBLgorICogV2UgcHJlc2VudGx5IGlnbm9yZSB0aGUgYXR0cmlidXRlIGJ5dGUsIHNvIHRoZSBjb2RlIGZvciByZWFkaW5nCisgKiB0aGVzZSBwaXhlbHMgaXMgaWRlbnRpY2FsIHRvIHRoZSAyNC1iaXQgcm91dGluZSBhYm92ZS4KKyAqIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgYWN0dWFsIHBpeGVsIGxlbmd0aCBpcyBvbmx5IGtub3duIHRvIHJlYWRfcGl4ZWwuCisgKi8KKworI2RlZmluZSBnZXRfMzJiaXRfcm93ICBnZXRfMjRiaXRfcm93CisKKworLyoKKyAqIFRoaXMgbWV0aG9kIGlzIGZvciByZS1yZWFkaW5nIHRoZSBpbnB1dCBkYXRhIGluIHN0YW5kYXJkIHRvcC1kb3duCisgKiByb3cgb3JkZXIuICBUaGUgZW50aXJlIGltYWdlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCBpbnRvIHdob2xlX2ltYWdlCisgKiB3aXRoIHByb3BlciBjb252ZXJzaW9uIG9mIHBpeGVsIGZvcm1hdCwgYnV0IGl0J3MgaW4gYSBmdW5ueSByb3cgb3JkZXIuCisgKi8KKworTUVUSE9EREVGKEpESU1FTlNJT04pCitnZXRfbWVtb3J5X3JvdyAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIEpESU1FTlNJT04gc291cmNlX3JvdzsKKworICAvKiBDb21wdXRlIHJvdyBvZiBzb3VyY2UgdGhhdCBtYXBzIHRvIGN1cnJlbnRfcm93IG9mIG5vcm1hbCBvcmRlciAqLworICAvKiBGb3Igbm93LCBhc3N1bWUgaW1hZ2UgaXMgYm90dG9tLXVwIGFuZCBub3QgaW50ZXJsYWNlZC4gKi8KKyAgLyogTkVFRFMgV09SSyB0byBzdXBwb3J0IGludGVybGFjZWQgaW1hZ2VzISAqLworICBzb3VyY2Vfcm93ID0gY2luZm8tPmltYWdlX2hlaWdodCAtIHNvdXJjZS0+Y3VycmVudF9yb3cgLSAxOworCisgIC8qIEZldGNoIHRoYXQgcm93IGZyb20gdmlydHVhbCBhcnJheSAqLworICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsCisgICAgIHNvdXJjZV9yb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisKKyAgc291cmNlLT5jdXJyZW50X3JvdysrOworICByZXR1cm4gMTsKK30KKworCisvKgorICogVGhpcyBtZXRob2QgbG9hZHMgdGhlIGltYWdlIGludG8gd2hvbGVfaW1hZ2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIG9uCisgKiBnZXRfcGl4ZWxfcm93cy4gIFRoZSBnZXRfcGl4ZWxfcm93cyBwb2ludGVyIGlzIHRoZW4gYWRqdXN0ZWQgdG8gY2FsbAorICogZ2V0X21lbW9yeV9yb3cgb24gc3Vic2VxdWVudCBjYWxscy4KKyAqLworCitNRVRIT0RERUYoSkRJTUVOU0lPTikKK3ByZWxvYWRfaW1hZ2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2UgPSAodGdhX3NvdXJjZV9wdHIpIHNpbmZvOworICBKRElNRU5TSU9OIHJvdzsKKyAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworCisgIC8qIFJlYWQgdGhlIGRhdGEgaW50byBhIHZpcnR1YWwgYXJyYXkgaW4gaW5wdXQtZmlsZSByb3cgb3JkZXIuICovCisgIGZvciAocm93ID0gMDsgcm93IDwgY2luZm8tPmltYWdlX2hlaWdodDsgcm93KyspIHsKKyAgICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkgeworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIgPSAobG9uZykgcm93OworICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7CisgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICB9CisgICAgc291cmNlLT5wdWIuYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIHNvdXJjZS0+d2hvbGVfaW1hZ2UsIHJvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICAgICgqc291cmNlLT5nZXRfcGl4ZWxfcm93cykgKGNpbmZvLCBzaW5mbyk7CisgIH0KKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpCisgICAgcHJvZ3Jlc3MtPmNvbXBsZXRlZF9leHRyYV9wYXNzZXMrKzsKKworICAvKiBTZXQgdXAgdG8gcmVhZCBmcm9tIHRoZSB2aXJ0dWFsIGFycmF5IGluIHVuc2NyYW1ibGVkIG9yZGVyICovCisgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gZ2V0X21lbW9yeV9yb3c7CisgIHNvdXJjZS0+Y3VycmVudF9yb3cgPSAwOworICAvKiBBbmQgcmVhZCB0aGUgZmlyc3Qgcm93ICovCisgIHJldHVybiBnZXRfbWVtb3J5X3JvdyhjaW5mbywgc2luZm8pOworfQorCisKKy8qCisgKiBSZWFkIHRoZSBmaWxlIGhlYWRlcjsgcmV0dXJuIGltYWdlIHNpemUgYW5kIGNvbXBvbmVudCBjb3VudC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X2lucHV0X3RnYSAoal9jb21wcmVzc19wdHIgY2luZm8sIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pCit7CisgIHRnYV9zb3VyY2VfcHRyIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikgc2luZm87CisgIFVfQ0hBUiB0YXJnYWhlYWRlclsxOF07CisgIGludCBpZGxlbiwgY21hcHR5cGUsIHN1YnR5cGUsIGZsYWdzLCBpbnRlcmxhY2VfdHlwZSwgY29tcG9uZW50czsKKyAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIG1hcGxlbjsKKyAgYm9vbGVhbiBpc19ib3R0b21fdXA7CisKKyNkZWZpbmUgR0VUXzJCKG9mZnNldCkJKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXRdKSArIFwKKwkJCSAoKCh1bnNpZ25lZCBpbnQpIFVDSCh0YXJnYWhlYWRlcltvZmZzZXQrMV0pKSA8PCA4KSkKKworICBpZiAoISBSZWFkT0soc291cmNlLT5wdWIuaW5wdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0lOUFVUX0VPRik7CisKKyAgLyogUHJldGVuZCAiMTUtYml0IiBwaXhlbHMgYXJlIDE2LWJpdCAtLS0gd2UgaWdub3JlIGF0dHJpYnV0ZSBiaXQgYW55d2F5ICovCisgIGlmICh0YXJnYWhlYWRlclsxNl0gPT0gMTUpCisgICAgdGFyZ2FoZWFkZXJbMTZdID0gMTY7CisKKyAgaWRsZW4gPSBVQ0godGFyZ2FoZWFkZXJbMF0pOworICBjbWFwdHlwZSA9IFVDSCh0YXJnYWhlYWRlclsxXSk7CisgIHN1YnR5cGUgPSBVQ0godGFyZ2FoZWFkZXJbMl0pOworICBtYXBsZW4gPSBHRVRfMkIoNSk7CisgIHdpZHRoID0gR0VUXzJCKDEyKTsKKyAgaGVpZ2h0ID0gR0VUXzJCKDE0KTsKKyAgc291cmNlLT5waXhlbF9zaXplID0gVUNIKHRhcmdhaGVhZGVyWzE2XSkgPj4gMzsKKyAgZmxhZ3MgPSBVQ0godGFyZ2FoZWFkZXJbMTddKTsJLyogSW1hZ2UgRGVzY3JpcHRvciBieXRlICovCisKKyAgaXNfYm90dG9tX3VwID0gKChmbGFncyAmIDB4MjApID09IDApOwkvKiBiaXQgNSBzZXQgPT4gdG9wLWRvd24gKi8KKyAgaW50ZXJsYWNlX3R5cGUgPSBmbGFncyA+PiA2OwkvKiBiaXRzIDYvNyBhcmUgaW50ZXJsYWNlIGNvZGUgKi8KKworICBpZiAoY21hcHR5cGUgPiAxIHx8CQkvKiBjbWFwdHlwZSBtdXN0IGJlIDAgb3IgMSAqLworICAgICAgc291cmNlLT5waXhlbF9zaXplIDwgMSB8fCBzb3VyY2UtPnBpeGVsX3NpemUgPiA0IHx8CisgICAgICAoVUNIKHRhcmdhaGVhZGVyWzE2XSkgJiA3KSAhPSAwIHx8IC8qIGJpdHMvcGl4ZWwgbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICovCisgICAgICBpbnRlcmxhY2VfdHlwZSAhPSAwKQkvKiBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgaW50ZXJsYWNlZCBpbWFnZSAqLworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgCisgIGlmIChzdWJ0eXBlID4gOCkgeworICAgIC8qIEl0J3MgYW4gUkxFLWNvZGVkIGZpbGUgKi8KKyAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX3JsZV9waXhlbDsKKyAgICBzb3VyY2UtPmJsb2NrX2NvdW50ID0gc291cmNlLT5kdXBfcGl4ZWxfY291bnQgPSAwOworICAgIHN1YnR5cGUgLT0gODsKKyAgfSBlbHNlIHsKKyAgICAvKiBOb24tUkxFIGZpbGUgKi8KKyAgICBzb3VyY2UtPnJlYWRfcGl4ZWwgPSByZWFkX25vbl9ybGVfcGl4ZWw7CisgIH0KKworICAvKiBOb3cgc2hvdWxkIGhhdmUgc3VidHlwZSAxLCAyLCBvciAzICovCisgIGNvbXBvbmVudHMgPSAzOwkJLyogdW50aWwgcHJvdmVuIGRpZmZlcmVudCAqLworICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworCisgIHN3aXRjaCAoc3VidHlwZSkgeworICBjYXNlIDE6CQkJLyogQ29sb3JtYXBwZWQgaW1hZ2UgKi8KKyAgICBpZiAoc291cmNlLT5waXhlbF9zaXplID09IDEgJiYgY21hcHR5cGUgPT0gMSkKKyAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9yb3c7CisgICAgZWxzZQorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQV9NQVBQRUQsIHdpZHRoLCBoZWlnaHQpOworICAgIGJyZWFrOworICBjYXNlIDI6CQkJLyogUkdCIGltYWdlICovCisgICAgc3dpdGNoIChzb3VyY2UtPnBpeGVsX3NpemUpIHsKKyAgICBjYXNlIDI6CisgICAgICBzb3VyY2UtPmdldF9waXhlbF9yb3dzID0gZ2V0XzE2Yml0X3JvdzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfMjRiaXRfcm93OworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgc291cmNlLT5nZXRfcGl4ZWxfcm93cyA9IGdldF8zMmJpdF9yb3c7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UR0FfQkFEUEFSTVMpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIFRSQUNFTVMyKGNpbmZvLCAxLCBKVFJDX1RHQSwgd2lkdGgsIGhlaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgMzoJCQkvKiBHcmF5c2NhbGUgaW1hZ2UgKi8KKyAgICBjb21wb25lbnRzID0gMTsKKyAgICBjaW5mby0+aW5fY29sb3Jfc3BhY2UgPSBKQ1NfR1JBWVNDQUxFOworICAgIGlmIChzb3VyY2UtPnBpeGVsX3NpemUgPT0gMSkKKyAgICAgIHNvdXJjZS0+Z2V0X3BpeGVsX3Jvd3MgPSBnZXRfOGJpdF9ncmF5X3JvdzsKKyAgICBlbHNlCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfVEdBX0dSQVksIHdpZHRoLCBoZWlnaHQpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRFBBUk1TKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChpc19ib3R0b21fdXApIHsKKyAgICAvKiBDcmVhdGUgYSB2aXJ0dWFsIGFycmF5IHRvIGJ1ZmZlciB0aGUgdXBzaWRlLWRvd24gaW1hZ2UuICovCisgICAgc291cmNlLT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorICAgICAgIChKRElNRU5TSU9OKSB3aWR0aCAqIGNvbXBvbmVudHMsIChKRElNRU5TSU9OKSBoZWlnaHQsIChKRElNRU5TSU9OKSAxKTsKKyAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKyAgICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCisgICAgfQorICAgIC8qIHNvdXJjZS0+cHViLmJ1ZmZlciB3aWxsIHBvaW50IHRvIHRoZSB2aXJ0dWFsIGFycmF5LiAqLworICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOyAvKiBpbiBjYXNlIGFueW9uZSBsb29rcyBhdCBpdCAqLworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gcHJlbG9hZF9pbWFnZTsKKyAgfSBlbHNlIHsKKyAgICAvKiBEb24ndCBuZWVkIGEgdmlydHVhbCBhcnJheSwgYnV0IGRvIG5lZWQgYSBvbmUtcm93IGlucHV0IGJ1ZmZlci4gKi8KKyAgICBzb3VyY2UtPndob2xlX2ltYWdlID0gTlVMTDsKKyAgICBzb3VyY2UtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgICAgKEpESU1FTlNJT04pIHdpZHRoICogY29tcG9uZW50cywgKEpESU1FTlNJT04pIDEpOworICAgIHNvdXJjZS0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworICAgIHNvdXJjZS0+cHViLmdldF9waXhlbF9yb3dzID0gc291cmNlLT5nZXRfcGl4ZWxfcm93czsKKyAgfQorICAKKyAgd2hpbGUgKGlkbGVuLS0pCQkvKiBUaHJvdyBhd2F5IElEIGZpZWxkICovCisgICAgKHZvaWQpIHJlYWRfYnl0ZShzb3VyY2UpOworCisgIGlmIChtYXBsZW4gPiAwKSB7CisgICAgaWYgKG1hcGxlbiA+IDI1NiB8fCBHRVRfMkIoMykgIT0gMCkKKyAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0JBRENNQVApOworICAgIC8qIEFsbG9jYXRlIHNwYWNlIHRvIHN0b3JlIHRoZSBjb2xvcm1hcCAqLworICAgIHNvdXJjZS0+Y29sb3JtYXAgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIChKRElNRU5TSU9OKSBtYXBsZW4sIChKRElNRU5TSU9OKSAzKTsKKyAgICAvKiBhbmQgcmVhZCBpdCBmcm9tIHRoZSBmaWxlICovCisgICAgcmVhZF9jb2xvcm1hcChzb3VyY2UsIChpbnQpIG1hcGxlbiwgVUNIKHRhcmdhaGVhZGVyWzddKSk7CisgIH0gZWxzZSB7CisgICAgaWYgKGNtYXB0eXBlKQkJLyogYnV0IHlvdSBwcm9taXNlZCBhIGNtYXAhICovCisgICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RHQV9CQURQQVJNUyk7CisgICAgc291cmNlLT5jb2xvcm1hcCA9IE5VTEw7CisgIH0KKworICBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA9IGNvbXBvbmVudHM7CisgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA9IDg7CisgIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOworICBjaW5mby0+aW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworfQorCisKKy8qCisgKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2ZpbmlzaF9pbnB1dF90Z2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKQoreworICAvKiBubyB3b3JrICovCit9CisKKworLyoKKyAqIFRoZSBtb2R1bGUgc2VsZWN0aW9uIHJvdXRpbmUgZm9yIFRhcmdhIGZvcm1hdCBpbnB1dC4KKyAqLworCitHTE9CQUwoY2pwZWdfc291cmNlX3B0cikKK2ppbml0X3JlYWRfdGFyZ2EgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoreworICB0Z2Ffc291cmNlX3B0ciBzb3VyY2U7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0ICovCisgIHNvdXJjZSA9ICh0Z2Ffc291cmNlX3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YodGdhX3NvdXJjZV9zdHJ1Y3QpKTsKKyAgc291cmNlLT5jaW5mbyA9IGNpbmZvOwkvKiBtYWtlIGJhY2sgbGluayBmb3Igc3Vicm91dGluZXMgKi8KKyAgLyogRmlsbCBpbiBtZXRob2QgcHRycywgZXhjZXB0IGdldF9waXhlbF9yb3dzIHdoaWNoIHN0YXJ0X2lucHV0IHNldHMgKi8KKyAgc291cmNlLT5wdWIuc3RhcnRfaW5wdXQgPSBzdGFydF9pbnB1dF90Z2E7CisgIHNvdXJjZS0+cHViLmZpbmlzaF9pbnB1dCA9IGZpbmlzaF9pbnB1dF90Z2E7CisKKyAgcmV0dXJuIChjanBlZ19zb3VyY2VfcHRyKSBzb3VyY2U7Cit9CisKKyNlbmRpZiAvKiBUQVJHQV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9zdHJ1Y3R1cmUuZG9jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3N0cnVjdHVyZS5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjOWRlZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi9zdHJ1Y3R1cmUuZG9jCkBAIC0wLDAgKzEsOTQ4IEBACitJSkcgSlBFRyBMSUJSQVJZOiAgU1lTVEVNIEFSQ0hJVEVDVFVSRQorCitDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NSwgVGhvbWFzIEcuIExhbmUuCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorCisKK1RoaXMgZmlsZSBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBJSkcgSlBFRyBzb2Z0d2FyZTsKK3RoYXQgaXMsIHRoZSBmdW5jdGlvbnMgb2YgdGhlIHZhcmlvdXMgbW9kdWxlcyBpbiB0aGUgc3lzdGVtIGFuZCB0aGUgaW50ZXJmYWNlcworYmV0d2VlbiBtb2R1bGVzLiAgRm9yIG1vcmUgcHJlY2lzZSBkZXRhaWxzIGFib3V0IGFueSBkYXRhIHN0cnVjdHVyZSBvciBjYWxsaW5nCitjb252ZW50aW9uLCBzZWUgdGhlIGluY2x1ZGUgZmlsZXMgYW5kIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UgY29kZS4KKworV2UgYXNzdW1lIHRoYXQgdGhlIHJlYWRlciBpcyBhbHJlYWR5IHNvbWV3aGF0IGZhbWlsaWFyIHdpdGggdGhlIEpQRUcgc3RhbmRhcmQuCitUaGUgUkVBRE1FIGZpbGUgaW5jbHVkZXMgcmVmZXJlbmNlcyBmb3IgbGVhcm5pbmcgYWJvdXQgSlBFRy4gIFRoZSBmaWxlCitsaWJqcGVnLmRvYyBkZXNjcmliZXMgdGhlIGxpYnJhcnkgZnJvbSB0aGUgdmlld3BvaW50IG9mIGFuIGFwcGxpY2F0aW9uCitwcm9ncmFtbWVyIHVzaW5nIHRoZSBsaWJyYXJ5OyBpdCdzIGJlc3QgdG8gcmVhZCB0aGF0IGZpbGUgYmVmb3JlIHRoaXMgb25lLgorQWxzbywgdGhlIGZpbGUgY29kZXJ1bGVzLmRvYyBkZXNjcmliZXMgdGhlIGNvZGluZyBzdHlsZSBjb252ZW50aW9ucyB3ZSB1c2UuCisKK0luIHRoaXMgZG9jdW1lbnQsIEpQRUctc3BlY2lmaWMgdGVybWlub2xvZ3kgZm9sbG93cyB0aGUgSlBFRyBzdGFuZGFyZDoKKyAgQSAiY29tcG9uZW50IiBtZWFucyBhIGNvbG9yIGNoYW5uZWwsIGUuZy4sIFJlZCBvciBMdW1pbmFuY2UuCisgIEEgInNhbXBsZSIgaXMgYSBzaW5nbGUgY29tcG9uZW50IHZhbHVlIChpLmUuLCBvbmUgbnVtYmVyIGluIHRoZSBpbWFnZSBkYXRhKS4KKyAgQSAiY29lZmZpY2llbnQiIGlzIGEgZnJlcXVlbmN5IGNvZWZmaWNpZW50IChhIERDVCB0cmFuc2Zvcm0gb3V0cHV0IG51bWJlcikuCisgIEEgImJsb2NrIiBpcyBhbiA4eDggZ3JvdXAgb2Ygc2FtcGxlcyBvciBjb2VmZmljaWVudHMuCisgIEFuICJNQ1UiIChtaW5pbXVtIGNvZGVkIHVuaXQpIGlzIGFuIGludGVybGVhdmVkIHNldCBvZiBibG9ja3Mgb2Ygc2l6ZQorCWRldGVybWluZWQgYnkgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIG9yIGEgc2luZ2xlIGJsb2NrIGluIGEKKwlub25pbnRlcmxlYXZlZCBzY2FuLgorV2UgZG8gbm90IHVzZSB0aGUgdGVybXMgInBpeGVsIiBhbmQgInNhbXBsZSIgaW50ZXJjaGFuZ2VhYmx5LiAgV2hlbiB3ZSBzYXkKK3BpeGVsLCB3ZSBtZWFuIGFuIGVsZW1lbnQgb2YgdGhlIGZ1bGwtc2l6ZSBpbWFnZSwgd2hpbGUgYSBzYW1wbGUgaXMgYW4gZWxlbWVudAorb2YgdGhlIGRvd25zYW1wbGVkIGltYWdlLiAgVGh1cyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbWF5IHZhcnkgYWNyb3NzCitjb21wb25lbnRzIHdoaWxlIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGRvZXMgbm90LiAgKFRoaXMgdGVybWlub2xvZ3kgaXMgbm90IHVzZWQKK3JpZ29yb3VzbHkgdGhyb3VnaG91dCB0aGUgY29kZSwgYnV0IGl0IGlzIHVzZWQgaW4gcGxhY2VzIHdoZXJlIGNvbmZ1c2lvbiB3b3VsZAorb3RoZXJ3aXNlIHJlc3VsdC4pCisKKworKioqIFN5c3RlbSBmZWF0dXJlcyAqKioKKworVGhlIElKRyBkaXN0cmlidXRpb24gY29udGFpbnMgdHdvIHBhcnRzOgorICAqIEEgc3Vicm91dGluZSBsaWJyYXJ5IGZvciBKUEVHIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgorICAqIGNqcGVnL2RqcGVnLCB0d28gc2FtcGxlIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbGlicmFyeSB0byB0cmFuc2Zvcm0KKyAgICBKRklGIEpQRUcgZmlsZXMgdG8gYW5kIGZyb20gc2V2ZXJhbCBvdGhlciBpbWFnZSBmb3JtYXRzLgorY2pwZWcvZGpwZWcgYXJlIG9mIG5vIGdyZWF0IGludGVsbGVjdHVhbCBjb21wbGV4aXR5OiB0aGV5IG1lcmVseSBhZGQgYSBzaW1wbGUKK2NvbW1hbmQtbGluZSB1c2VyIGludGVyZmFjZSBhbmQgSS9PIHJvdXRpbmVzIGZvciBzZXZlcmFsIHVuY29tcHJlc3NlZCBpbWFnZQorZm9ybWF0cy4gIFRoaXMgZG9jdW1lbnQgY29uY2VudHJhdGVzIG9uIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKworV2UgZGVzaXJlIHRoZSBsaWJyYXJ5IHRvIGJlIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBhbGwgSlBFRyBiYXNlbGluZSwgZXh0ZW5kZWQKK3NlcXVlbnRpYWwsIGFuZCBwcm9ncmVzc2l2ZSBEQ1QgcHJvY2Vzc2VzLiAgSGllcmFyY2hpY2FsIHByb2Nlc3NlcyBhcmUgbm90CitzdXBwb3J0ZWQuCisKK1RoZSBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgdGhlIGxvc3NsZXNzIChzcGF0aWFsKSBKUEVHIHByb2Nlc3MuICBMb3NzbGVzcworSlBFRyBzaGFyZXMgbGl0dGxlIG9yIG5vIGNvZGUgd2l0aCBsb3NzeSBKUEVHLCBhbmQgd291bGQgbm9ybWFsbHkgYmUgdXNlZAord2l0aG91dCB0aGUgZXh0ZW5zaXZlIHByZS0gYW5kIHBvc3QtcHJvY2Vzc2luZyBwcm92aWRlZCBieSB0aGlzIGxpYnJhcnkuCitXZSBmZWVsIHRoYXQgbG9zc2xlc3MgSlBFRyBpcyBiZXR0ZXIgaGFuZGxlZCBieSBhIHNlcGFyYXRlIGxpYnJhcnkuCisKK1dpdGhpbiB0aGVzZSBsaW1pdHMsIGFueSBzZXQgb2YgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbGxvd2VkIGJ5IHRoZSBKUEVHCitzcGVjIHNob3VsZCBiZSByZWFkYWJsZSBmb3IgZGVjb21wcmVzc2lvbi4gIChXZSBjYW4gYmUgbW9yZSByZXN0cmljdGl2ZSBhYm91dAord2hhdCBmb3JtYXRzIHdlIGNhbiBnZW5lcmF0ZS4pICBBbHRob3VnaCB0aGUgc3lzdGVtIGRlc2lnbiBhbGxvd3MgZm9yIGFsbAorcGFyYW1ldGVyIHZhbHVlcywgc29tZSB1bmNvbW1vbiBzZXR0aW5ncyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBhbmQgbWF5CituZXZlciBiZTsgbm9uaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zIGFyZSB0aGUgcHJpbWUgZXhhbXBsZS4gIEZ1cnRoZXJtb3JlLAord2UgdHJlYXQgOC1iaXQgdnMuIDEyLWJpdCBkYXRhIHByZWNpc2lvbiBhcyBhIGNvbXBpbGUtdGltZSBzd2l0Y2gsIG5vdCBhCitydW4tdGltZSBvcHRpb24sIGJlY2F1c2UgbW9zdCBtYWNoaW5lcyBjYW4gc3RvcmUgOC1iaXQgcGl4ZWxzIG11Y2ggbW9yZQorY29tcGFjdGx5IHRoYW4gMTItYml0LgorCitGb3IgbGVnYWwgcmVhc29ucywgSlBFRyBhcml0aG1ldGljIGNvZGluZyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCwgYnV0CitleHRlbmRpbmcgdGhlIGxpYnJhcnkgdG8gaW5jbHVkZSBpdCB3b3VsZCBiZSBzdHJhaWdodGZvcndhcmQuCisKK0J5IGl0c2VsZiwgdGhlIGxpYnJhcnkgaGFuZGxlcyBvbmx5IGludGVyY2hhbmdlIEpQRUcgZGF0YXN0cmVhbXMgLS0tIGluCitwYXJ0aWN1bGFyIHRoZSB3aWRlbHkgdXNlZCBKRklGIGZpbGUgZm9ybWF0LiAgVGhlIGxpYnJhcnkgY2FuIGJlIHVzZWQgYnkKK3N1cnJvdW5kaW5nIGNvZGUgdG8gcHJvY2VzcyBpbnRlcmNoYW5nZSBvciBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zIHRoYXQKK2FyZSBlbWJlZGRlZCBpbiBtb3JlIGNvbXBsZXggZmlsZSBmb3JtYXRzLiAgKEZvciBleGFtcGxlLCBsaWJ0aWZmIHVzZXMgdGhpcworbGlicmFyeSB0byBpbXBsZW1lbnQgSlBFRyBjb21wcmVzc2lvbiB3aXRoaW4gdGhlIFRJRkYgZmlsZSBmb3JtYXQuKQorCitUaGUgbGlicmFyeSBpbmNsdWRlcyBhIHN1YnN0YW50aWFsIGFtb3VudCBvZiBjb2RlIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgdGhlCitKUEVHIHN0YW5kYXJkIGJ1dCBpcyBuZWNlc3NhcnkgZm9yIHR5cGljYWwgYXBwbGljYXRpb25zIG9mIEpQRUcuICBUaGVzZQorZnVuY3Rpb25zIHByZXByb2Nlc3MgdGhlIGltYWdlIGJlZm9yZSBKUEVHIGNvbXByZXNzaW9uIG9yIHBvc3Rwcm9jZXNzIGl0IGFmdGVyCitkZWNvbXByZXNzaW9uLiAgVGhleSBpbmNsdWRlIGNvbG9yc3BhY2UgY29udmVyc2lvbiwgZG93bnNhbXBsaW5nL3Vwc2FtcGxpbmcsCithbmQgY29sb3IgcXVhbnRpemF0aW9uLiAgVGhpcyBjb2RlIGNhbiBiZSBvbWl0dGVkIGlmIG5vdCBuZWVkZWQuCisKK0Egd2lkZSByYW5nZSBvZiBxdWFsaXR5IHZzLiBzcGVlZCB0cmFkZW9mZnMgYXJlIHBvc3NpYmxlIGluIEpQRUcgcHJvY2Vzc2luZywKK2FuZCBldmVuIG1vcmUgc28gaW4gZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZy4gIFRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkKK3Byb3ZpZGVzIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyB0aGF0IGNvdmVyIG1vc3Qgb2YgdGhlIHVzZWZ1bCB0cmFkZW9mZnMsCityYW5naW5nIGZyb20gdmVyeS1oaWdoLXF1YWxpdHkgZG93biB0byBmYXN0LXByZXZpZXcgb3BlcmF0aW9uLiAgT24gdGhlCitjb21wcmVzc2lvbiBzaWRlIHdlIGhhdmUgZ2VuZXJhbGx5IG5vdCBwcm92aWRlZCBsb3ctcXVhbGl0eSBjaG9pY2VzLCBzaW5jZQorY29tcHJlc3Npb24gaXMgbm9ybWFsbHkgbGVzcyB0aW1lLWNyaXRpY2FsLiAgSXQgc2hvdWxkIGJlIHVuZGVyc3Rvb2QgdGhhdCB0aGUKK2xvdy1xdWFsaXR5IG1vZGVzIG1heSBub3QgbWVldCB0aGUgSlBFRyBzdGFuZGFyZCdzIGFjY3VyYWN5IHJlcXVpcmVtZW50czsKK25vbmV0aGVsZXNzLCB0aGV5IGFyZSB1c2VmdWwgZm9yIHZpZXdlcnMuCisKKworKioqIFBvcnRhYmlsaXR5IGlzc3VlcyAqKioKKworUG9ydGFiaWxpdHkgaXMgYW4gZXNzZW50aWFsIHJlcXVpcmVtZW50IGZvciB0aGUgbGlicmFyeS4gIFRoZSBrZXkgcG9ydGFiaWxpdHkKK2lzc3VlcyB0aGF0IHNob3cgdXAgYXQgdGhlIGxldmVsIG9mIHN5c3RlbSBhcmNoaXRlY3R1cmUgYXJlOgorCisxLiAgTWVtb3J5IHVzYWdlLiAgV2Ugd2FudCB0aGUgY29kZSB0byBiZSBhYmxlIHRvIHJ1biBvbiBQQy1jbGFzcyBtYWNoaW5lcword2l0aCBsaW1pdGVkIG1lbW9yeS4gIEltYWdlcyBzaG91bGQgdGhlcmVmb3JlIGJlIHByb2Nlc3NlZCBzZXF1ZW50aWFsbHkgKGluCitzdHJpcHMpLCB0byBhdm9pZCBob2xkaW5nIHRoZSB3aG9sZSBpbWFnZSBpbiBtZW1vcnkgYXQgb25jZS4gIFdoZXJlIGEKK2Z1bGwtaW1hZ2UgYnVmZmVyIGlzIG5lY2Vzc2FyeSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIGVpdGhlciB2aXJ0dWFsIG1lbW9yeQorb3IgdGVtcG9yYXJ5IGZpbGVzLgorCisyLiAgTmVhci9mYXIgcG9pbnRlciBkaXN0aW5jdGlvbi4gIFRvIHJ1biBlZmZpY2llbnRseSBvbiA4MHg4NiBtYWNoaW5lcywgdGhlCitjb2RlIHNob3VsZCBkaXN0aW5ndWlzaCAic21hbGwiIG9iamVjdHMgKGtlcHQgaW4gbmVhciBkYXRhIHNwYWNlKSBmcm9tCisibGFyZ2UiIG9uZXMgKGtlcHQgaW4gZmFyIGRhdGEgc3BhY2UpLiAgVGhpcyBpcyBhbiBhbm5veWluZyByZXN0cmljdGlvbiwgYnV0Citmb3J0dW5hdGVseSBpdCBkb2VzIG5vdCBpbXBhY3QgY29kZSBxdWFsaXR5IGZvciBsZXNzIGJyYWluLWRhbWFnZWQgbWFjaGluZXMsCithbmQgdGhlIHNvdXJjZSBjb2RlIGNsdXR0ZXIgdHVybnMgb3V0IHRvIGJlIG1pbmltYWwgd2l0aCBzdWZmaWNpZW50IHVzZSBvZgorcG9pbnRlciB0eXBlZGVmcy4KKworMy4gRGF0YSBwcmVjaXNpb24uICBXZSBhc3N1bWUgdGhhdCAiY2hhciIgaXMgYXQgbGVhc3QgOCBiaXRzLCAic2hvcnQiIGFuZAorImludCIgYXQgbGVhc3QgMTYsICJsb25nIiBhdCBsZWFzdCAzMi4gIFRoZSBjb2RlIHdpbGwgd29yayBmaW5lIHdpdGggbGFyZ2VyCitkYXRhIHNpemVzLCBhbHRob3VnaCBtZW1vcnkgbWF5IGJlIHVzZWQgaW5lZmZpY2llbnRseSBpbiBzb21lIGNhc2VzLiAgSG93ZXZlciwKK3RoZSBKUEVHIGNvbXByZXNzZWQgZGF0YXN0cmVhbSBtdXN0IHVsdGltYXRlbHkgYXBwZWFyIG9uIGV4dGVybmFsIHN0b3JhZ2UgYXMgYQorc2VxdWVuY2Ugb2YgOC1iaXQgYnl0ZXMgaWYgaXQgaXMgdG8gY29uZm9ybSB0byB0aGUgc3RhbmRhcmQuICBUaGlzIG1heSBwb3NlIGEKK3Byb2JsZW0gb24gbWFjaGluZXMgd2hlcmUgY2hhciBpcyB3aWRlciB0aGFuIDggYml0cy4gIFRoZSBsaWJyYXJ5IHJlcHJlc2VudHMKK2NvbXByZXNzZWQgZGF0YSBhcyBhbiBhcnJheSBvZiB2YWx1ZXMgb2YgdHlwZWRlZiBKT0NURVQuICBJZiBubyBkYXRhIHR5cGUKK2V4YWN0bHkgOCBiaXRzIHdpZGUgaXMgYXZhaWxhYmxlLCBjdXN0b20gZGF0YSBzb3VyY2UgYW5kIGRhdGEgZGVzdGluYXRpb24KK21vZHVsZXMgbXVzdCBiZSB3cml0dGVuIHRvIHVucGFjayBhbmQgcGFjayB0aGUgY2hvc2VuIEpPQ1RFVCBkYXRhdHlwZSBpbnRvCis4LWJpdCBleHRlcm5hbCByZXByZXNlbnRhdGlvbi4KKworCisqKiogU3lzdGVtIG92ZXJ2aWV3ICoqKgorCitUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIGFyZSBlYWNoIGRpdmlkZWQgaW50byB0d28gbWFpbiBzZWN0aW9uczoKK3RoZSBKUEVHIGNvbXByZXNzb3Igb3IgZGVjb21wcmVzc29yIHByb3BlciwgYW5kIHRoZSBwcmVwcm9jZXNzaW5nIG9yCitwb3N0cHJvY2Vzc2luZyBmdW5jdGlvbnMuICBUaGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlc2UgdHdvIHNlY3Rpb25zIGlzIHRoZQoraW1hZ2UgZGF0YSB0aGF0IHRoZSBvZmZpY2lhbCBKUEVHIHNwZWMgcmVnYXJkcyBhcyBpdHMgaW5wdXQgb3Igb3V0cHV0OiB0aGlzCitkYXRhIGlzIGluIHRoZSBjb2xvcnNwYWNlIHRvIGJlIHVzZWQgZm9yIGNvbXByZXNzaW9uLCBhbmQgaXQgaXMgZG93bnNhbXBsZWQKK3RvIHRoZSBzYW1wbGluZyBmYWN0b3JzIHRvIGJlIHVzZWQuICBUaGUgcHJlcHJvY2Vzc2luZyBhbmQgcG9zdHByb2Nlc3NpbmcKK3N0ZXBzIGFyZSByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyBhIG5vcm1hbCBpbWFnZSByZXByZXNlbnRhdGlvbiB0byBvciBmcm9tCit0aGlzIGZvcm0uICAoVGhvc2UgZmV3IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gZGVhbCB3aXRoIFlDYkNyIGRvd25zYW1wbGVkCitkYXRhIGNhbiBza2lwIHRoZSBwcmVwcm9jZXNzaW5nIG9yIHBvc3Rwcm9jZXNzaW5nIHN0ZXAuKQorCitMb29raW5nIG1vcmUgY2xvc2VseSwgdGhlIGNvbXByZXNzb3IgbGlicmFyeSBjb250YWlucyB0aGUgZm9sbG93aW5nIG1haW4KK2VsZW1lbnRzOgorCisgIFByZXByb2Nlc3Npbmc6CisgICAgKiBDb2xvciBzcGFjZSBjb252ZXJzaW9uIChlLmcuLCBSR0IgdG8gWUNiQ3IpLgorICAgICogRWRnZSBleHBhbnNpb24gYW5kIGRvd25zYW1wbGluZy4gIE9wdGlvbmFsbHksIHRoaXMgc3RlcCBjYW4gZG8gc2ltcGxlCisgICAgICBzbW9vdGhpbmcgLS0tIHRoaXMgaXMgb2Z0ZW4gaGVscGZ1bCBmb3IgbG93LXF1YWxpdHkgc291cmNlIGRhdGEuCisgIEpQRUcgcHJvcGVyOgorICAgICogTUNVIGFzc2VtYmx5LCBEQ1QsIHF1YW50aXphdGlvbi4KKyAgICAqIEVudHJvcHkgY29kaW5nIChzZXF1ZW50aWFsIG9yIHByb2dyZXNzaXZlLCBIdWZmbWFuIG9yIGFyaXRobWV0aWMpLgorCitJbiBhZGRpdGlvbiB0byB0aGVzZSBtb2R1bGVzIHdlIG5lZWQgb3ZlcmFsbCBjb250cm9sLCBtYXJrZXIgZ2VuZXJhdGlvbiwKK2FuZCBzdXBwb3J0IGNvZGUgKG1lbW9yeSBtYW5hZ2VtZW50ICYgZXJyb3IgaGFuZGxpbmcpLiAgVGhlcmUgaXMgYWxzbyBhCittb2R1bGUgcmVzcG9uc2libGUgZm9yIHBoeXNpY2FsbHkgd3JpdGluZyB0aGUgb3V0cHV0IGRhdGEgLS0tIHR5cGljYWxseQordGhpcyBpcyBqdXN0IGFuIGludGVyZmFjZSB0byBmd3JpdGUoKSwgYnV0IHNvbWUgYXBwbGljYXRpb25zIG1heSBuZWVkIHRvCitkbyBzb21ldGhpbmcgZWxzZSB3aXRoIHRoZSBkYXRhLgorCitUaGUgZGVjb21wcmVzc29yIGxpYnJhcnkgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtYWluIGVsZW1lbnRzOgorCisgIEpQRUcgcHJvcGVyOgorICAgICogRW50cm9weSBkZWNvZGluZyAoc2VxdWVudGlhbCBvciBwcm9ncmVzc2l2ZSwgSHVmZm1hbiBvciBhcml0aG1ldGljKS4KKyAgICAqIERlcXVhbnRpemF0aW9uLCBpbnZlcnNlIERDVCwgTUNVIGRpc2Fzc2VtYmx5LgorICBQb3N0cHJvY2Vzc2luZzoKKyAgICAqIFVwc2FtcGxpbmcuICBPcHRpb25hbGx5LCB0aGlzIHN0ZXAgbWF5IGJlIGFibGUgdG8gZG8gbW9yZSBnZW5lcmFsCisgICAgICByZXNjYWxpbmcgb2YgdGhlIGltYWdlLgorICAgICogQ29sb3Igc3BhY2UgY29udmVyc2lvbiAoZS5nLiwgWUNiQ3IgdG8gUkdCKS4gIFRoaXMgc3RlcCBtYXkgYWxzbworICAgICAgcHJvdmlkZSBnYW1tYSBhZGp1c3RtZW50IFsgY3VycmVudGx5IGl0IGRvZXMgbm90IF0uCisgICAgKiBPcHRpb25hbCBjb2xvciBxdWFudGl6YXRpb24gKGUuZy4sIHJlZHVjdGlvbiB0byAyNTYgY29sb3JzKS4KKyAgICAqIE9wdGlvbmFsIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gKGUuZy4sIDI0LWJpdCB0byAxNS1iaXQgY29sb3IpLgorICAgICAgW1RoaXMgZmVhdHVyZSBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLl0KKworV2UgYWxzbyBuZWVkIG92ZXJhbGwgY29udHJvbCwgbWFya2VyIHBhcnNpbmcsIGFuZCBhIGRhdGEgc291cmNlIG1vZHVsZS4KK1RoZSBzdXBwb3J0IGNvZGUgKG1lbW9yeSBtYW5hZ2VtZW50ICYgZXJyb3IgaGFuZGxpbmcpIGNhbiBiZSBzaGFyZWQgd2l0aAordGhlIGNvbXByZXNzaW9uIGhhbGYgb2YgdGhlIGxpYnJhcnkuCisKK1RoZXJlIG1heSBiZSBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBvZiBlYWNoIG9mIHRoZXNlIGVsZW1lbnRzLCBwYXJ0aWN1bGFybHkKK2luIHRoZSBkZWNvbXByZXNzb3IsIHdoZXJlIGEgd2lkZSByYW5nZSBvZiBzcGVlZC9xdWFsaXR5IHRyYWRlb2ZmcyBpcyB2ZXJ5Cit1c2VmdWwuICBJdCBtdXN0IGJlIHVuZGVyc3Rvb2QgdGhhdCBzb21lIG9mIHRoZSBiZXN0IHNwZWVkdXBzIGludm9sdmUKK21lcmdpbmcgYWRqYWNlbnQgc3RlcHMgaW4gdGhlIHBpcGVsaW5lLiAgRm9yIGV4YW1wbGUsIHVwc2FtcGxpbmcsIGNvbG9yIHNwYWNlCitjb252ZXJzaW9uLCBhbmQgY29sb3IgcXVhbnRpemF0aW9uIG1pZ2h0IGFsbCBiZSBkb25lIGF0IG9uY2Ugd2hlbiB1c2luZyBhCitsb3ctcXVhbGl0eSBvcmRlcmVkLWRpdGhlciB0ZWNobmlxdWUuICBUaGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBpcyBkZXNpZ25lZCB0bworYWxsb3cgc3VjaCBtZXJnaW5nIHdoZXJlIGFwcHJvcHJpYXRlLgorCisKK05vdGU6IGl0IGlzIGNvbnZlbmllbnQgdG8gcmVnYXJkIGVkZ2UgZXhwYW5zaW9uIChwYWRkaW5nIHRvIGJsb2NrIGJvdW5kYXJpZXMpCithcyBhIHByZXByb2Nlc3NpbmcvcG9zdHByb2Nlc3NpbmcgZnVuY3Rpb24sIGV2ZW4gdGhvdWdoIHRoZSBKUEVHIHNwZWMgaW5jbHVkZXMKK2l0IGluIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uICBXZSBkbyB0aGlzIGJlY2F1c2UgZG93bnNhbXBsaW5nL3Vwc2FtcGxpbmcKK2NhbiBiZSBzaW1wbGlmaWVkIGEgbGl0dGxlIGlmIHRoZXkgd29yayBvbiBwYWRkZWQgZGF0YTogaXQncyBub3QgbmVjZXNzYXJ5IHRvCitoYXZlIHNwZWNpYWwgY2FzZXMgYXQgdGhlIHJpZ2h0IGFuZCBib3R0b20gZWRnZXMuICBUaGVyZWZvcmUgdGhlIGludGVyZmFjZQorYnVmZmVyIGlzIGFsd2F5cyBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgYmxvY2tzIHdpZGUgYW5kIGhpZ2gsIGFuZCB3ZSBleHBlY3QKK2NvbXByZXNzaW9uIHByZXByb2Nlc3NpbmcgdG8gcGFkIHRoZSBzb3VyY2UgZGF0YSBwcm9wZXJseS4gIFBhZGRpbmcgd2lsbCBvY2N1cgorb25seSB0byB0aGUgbmV4dCBibG9jayAoOC1zYW1wbGUpIGJvdW5kYXJ5LiAgSW4gYW4gaW50ZXJsZWF2ZWQtc2NhbiBzaXR1YXRpb24sCithZGRpdGlvbmFsIGR1bW15IGJsb2NrcyBtYXkgYmUgdXNlZCB0byBmaWxsIG91dCBNQ1VzLCBidXQgdGhlIE1DVSBhc3NlbWJseSBhbmQKK2Rpc2Fzc2VtYmx5IGxvZ2ljIHdpbGwgY3JlYXRlIG9yIGRpc2NhcmQgdGhlc2UgYmxvY2tzIGludGVybmFsbHkuICAoVGhpcyBpcworYWR2YW50YWdlb3VzIGZvciBzcGVlZCByZWFzb25zLCBzaW5jZSB3ZSBhdm9pZCBEQ1RpbmcgdGhlIGR1bW15IGJsb2Nrcy4KK0l0IGFsc28gcGVybWl0cyBhIHNtYWxsIHJlZHVjdGlvbiBpbiBmaWxlIHNpemUsIGJlY2F1c2UgdGhlIGNvbXByZXNzb3IgY2FuCitjaG9vc2UgZHVtbXkgYmxvY2sgY29udGVudHMgc28gYXMgdG8gbWluaW1pemUgdGhlaXIgc2l6ZSBpbiBjb21wcmVzc2VkIGZvcm0uCitGaW5hbGx5LCBpdCBtYWtlcyB0aGUgaW50ZXJmYWNlIGJ1ZmZlciBzcGVjaWZpY2F0aW9uIGluZGVwZW5kZW50IG9mIHdoZXRoZXIKK3RoZSBmaWxlIGlzIGFjdHVhbGx5IGludGVybGVhdmVkIG9yIG5vdC4pICBBcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIGRlYWwKK2RpcmVjdGx5IHdpdGggdGhlIGRvd25zYW1wbGVkIGRhdGEgbXVzdCBwcm92aWRlIHNpbWlsYXIgYnVmZmVyaW5nIGFuZCBwYWRkaW5nCitmb3Igb2RkLXNpemVkIGltYWdlcy4KKworCisqKiogUG9vciBtYW4ncyBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgKioqCisKK0l0IHNob3VsZCBiZSBjbGVhciBieSBub3cgdGhhdCB3ZSBoYXZlIGEgbG90IG9mIHF1YXNpLWluZGVwZW5kZW50IHByb2Nlc3NpbmcKK3N0ZXBzLCBtYW55IG9mIHdoaWNoIGhhdmUgc2V2ZXJhbCBwb3NzaWJsZSBiZWhhdmlvcnMuICBUbyBhdm9pZCBjbHV0dGVyaW5nIHRoZQorY29kZSB3aXRoIGxvdHMgb2Ygc3dpdGNoIHN0YXRlbWVudHMsIHdlIHVzZSBhIHNpbXBsZSBmb3JtIG9mIG9iamVjdC1zdHlsZQorcHJvZ3JhbW1pbmcgdG8gc2VwYXJhdGUgb3V0IHRoZSBkaWZmZXJlbnQgcG9zc2liaWxpdGllcy4KKworRm9yIGV4YW1wbGUsIHR3byBkaWZmZXJlbnQgY29sb3IgcXVhbnRpemF0aW9uIGFsZ29yaXRobXMgY291bGQgYmUgaW1wbGVtZW50ZWQKK2FzIHR3byBzZXBhcmF0ZSBtb2R1bGVzIHRoYXQgcHJlc2VudCB0aGUgc2FtZSBleHRlcm5hbCBpbnRlcmZhY2U7IGF0IHJ1bnRpbWUsCit0aGUgY2FsbGluZyBjb2RlIHdpbGwgYWNjZXNzIHRoZSBwcm9wZXIgbW9kdWxlIGluZGlyZWN0bHkgdGhyb3VnaCBhbiAib2JqZWN0Ii4KKworV2UgY2FuIGdldCB0aGUgbGltaXRlZCBmZWF0dXJlcyB3ZSBuZWVkIHdoaWxlIHN0YXlpbmcgd2l0aGluIHBvcnRhYmxlIEMuCitUaGUgYmFzaWMgdG9vbCBpcyBhIGZ1bmN0aW9uIHBvaW50ZXIuICBBbiAib2JqZWN0IiBpcyBqdXN0IGEgc3RydWN0Citjb250YWluaW5nIG9uZSBvciBtb3JlIGZ1bmN0aW9uIHBvaW50ZXIgZmllbGRzLCBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIHRvCithIG1ldGhvZCBuYW1lIGluIHJlYWwgb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcy4gIER1cmluZyBpbml0aWFsaXphdGlvbiB3ZQorZmlsbCBpbiB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCByZWZlcmVuY2VzIHRvIHdoaWNoZXZlciBtb2R1bGUgd2UgaGF2ZQorZGV0ZXJtaW5lZCB3ZSBuZWVkIHRvIHVzZSBpbiB0aGlzIHJ1bi4gIFRoZW4gaW52b2NhdGlvbiBvZiB0aGUgbW9kdWxlIGlzIGRvbmUKK2J5IGluZGlyZWN0aW5nIHRocm91Z2ggYSBmdW5jdGlvbiBwb2ludGVyOyBvbiBtb3N0IG1hY2hpbmVzIHRoaXMgaXMgbm8gbW9yZQorZXhwZW5zaXZlIHRoYW4gYSBzd2l0Y2ggc3RhdGVtZW50LCB3aGljaCB3b3VsZCBiZSB0aGUgb25seSBvdGhlciB3YXkgb2YKK21ha2luZyB0aGUgcmVxdWlyZWQgcnVuLXRpbWUgY2hvaWNlLiAgVGhlIHJlYWxseSBzaWduaWZpY2FudCBiZW5lZml0LCBvZgorY291cnNlLCBpcyBrZWVwaW5nIHRoZSBzb3VyY2UgY29kZSBjbGVhbiBhbmQgd2VsbCBzdHJ1Y3R1cmVkLgorCitXZSBjYW4gYWxzbyBhcnJhbmdlIHRvIGhhdmUgcHJpdmF0ZSBzdG9yYWdlIHRoYXQgdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50CitpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUga2luZCBvZiBvYmplY3QuICBXZSBkbyB0aGlzIGJ5IG1ha2luZyBhbGwgdGhlCittb2R1bGUtc3BlY2lmaWMgb2JqZWN0IHN0cnVjdHMgYmUgc2VwYXJhdGVseSBhbGxvY2F0ZWQgZW50aXRpZXMsIHdoaWNoIHdpbGwKK2JlIGFjY2Vzc2VkIHZpYSBwb2ludGVycyBpbiB0aGUgbWFzdGVyIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RydWN0LgorVGhlICJwdWJsaWMiIGZpZWxkcyBvciBtZXRob2RzIGZvciBhIGdpdmVuIGtpbmQgb2Ygb2JqZWN0IGFyZSBzcGVjaWZpZWQgYnkKK2EgY29tbW9ubHkga25vd24gc3RydWN0LiAgQnV0IGEgbW9kdWxlJ3MgaW5pdGlhbGl6YXRpb24gY29kZSBjYW4gYWxsb2NhdGUKK2EgbGFyZ2VyIHN0cnVjdCB0aGF0IGNvbnRhaW5zIHRoZSBjb21tb24gc3RydWN0IGFzIGl0cyBmaXJzdCBtZW1iZXIsIHBsdXMKK2FkZGl0aW9uYWwgcHJpdmF0ZSBmaWVsZHMuICBXaXRoIGFwcHJvcHJpYXRlIHBvaW50ZXIgY2FzdGluZywgdGhlIG1vZHVsZSdzCitpbnRlcm5hbCBmdW5jdGlvbnMgY2FuIGFjY2VzcyB0aGVzZSBwcml2YXRlIGZpZWxkcy4gIChGb3IgYSBzaW1wbGUgZXhhbXBsZSwKK3NlZSBqZGF0YWRzdC5jLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBleHRlcm5hbCBpbnRlcmZhY2Ugc3BlY2lmaWVkIGJ5IHN0cnVjdAoranBlZ19kZXN0aW5hdGlvbl9tZ3IsIGJ1dCBhZGRzIGV4dHJhIGZpZWxkcy4pCisKKyhPZiBjb3Vyc2UgdGhpcyB3b3VsZCBhbGwgYmUgYSBsb3QgZWFzaWVyIGlmIHdlIHdlcmUgdXNpbmcgQysrLCBidXQgd2UgYXJlCitub3QgeWV0IHByZXBhcmVkIHRvIGFzc3VtZSB0aGF0IGV2ZXJ5b25lIGhhcyBhIEMrKyBjb21waWxlci4pCisKK0FuIGltcG9ydGFudCBiZW5lZml0IG9mIHRoaXMgc2NoZW1lIGlzIHRoYXQgaXQgaXMgZWFzeSB0byBwcm92aWRlIG11bHRpcGxlCit2ZXJzaW9ucyBvZiBhbnkgbWV0aG9kLCBlYWNoIHR1bmVkIHRvIGEgcGFydGljdWxhciBjYXNlLiAgV2hpbGUgYSBsb3Qgb2YKK3ByZWNhbGN1bGF0aW9uIG1pZ2h0IGJlIGRvbmUgdG8gc2VsZWN0IGFuIG9wdGltYWwgaW1wbGVtZW50YXRpb24gb2YgYSBtZXRob2QsCit0aGUgY29zdCBwZXIgaW52b2NhdGlvbiBpcyBjb25zdGFudC4gIEZvciBleGFtcGxlLCB0aGUgdXBzYW1wbGluZyBzdGVwIG1pZ2h0CitoYXZlIGEgImdlbmVyaWMiIG1ldGhvZCwgcGx1cyBvbmUgb3IgbW9yZSAiaGFyZHdpcmVkIiBtZXRob2RzIGZvciB0aGUgbW9zdAorcG9wdWxhciBzYW1wbGluZyBmYWN0b3JzOyB0aGUgaGFyZHdpcmVkIG1ldGhvZHMgd291bGQgYmUgZmFzdGVyIGJlY2F1c2UgdGhleSdkCit1c2Ugc3RyYWlnaHQtbGluZSBjb2RlIGluc3RlYWQgb2YgZm9yLWxvb3BzLiAgVGhlIGNvc3QgdG8gZGV0ZXJtaW5lIHdoaWNoCittZXRob2QgdG8gdXNlIGlzIHBhaWQgb25seSBvbmNlLCBhdCBzdGFydHVwLCBhbmQgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBhcmUKK2hpZGRlbiBmcm9tIHRoZSBjYWxsZXJzIG9mIHRoZSBtZXRob2QuCisKK1RoaXMgcGxhbiBkaWZmZXJzIGEgbGl0dGxlIGJpdCBmcm9tIHVzdWFsIG9iamVjdC1vcmllbnRlZCBzdHJ1Y3R1cmVzLCBpbiB0aGF0Citvbmx5IG9uZSBpbnN0YW5jZSBvZiBlYWNoIG9iamVjdCBjbGFzcyB3aWxsIGV4aXN0IGR1cmluZyBleGVjdXRpb24uICBUaGUKK3JlYXNvbiBmb3IgaGF2aW5nIHRoZSBjbGFzcyBzdHJ1Y3R1cmUgaXMgdGhhdCBvbiBkaWZmZXJlbnQgcnVucyB3ZSBtYXkgY3JlYXRlCitkaWZmZXJlbnQgaW5zdGFuY2VzIChjaG9vc2UgdG8gZXhlY3V0ZSBkaWZmZXJlbnQgbW9kdWxlcykuICBZb3UgY2FuIHRoaW5rIG9mCit0aGUgdGVybSAibWV0aG9kIiBhcyBkZW5vdGluZyB0aGUgY29tbW9uIGludGVyZmFjZSBwcmVzZW50ZWQgYnkgYSBwYXJ0aWN1bGFyCitzZXQgb2YgaW50ZXJjaGFuZ2VhYmxlIGZ1bmN0aW9ucywgYW5kICJvYmplY3QiIGFzIGRlbm90aW5nIGEgZ3JvdXAgb2YgcmVsYXRlZAorbWV0aG9kcywgb3IgdGhlIHRvdGFsIHNoYXJlZCBpbnRlcmZhY2UgYmVoYXZpb3Igb2YgYSBncm91cCBvZiBtb2R1bGVzLgorCisKKyoqKiBPdmVyYWxsIGNvbnRyb2wgc3RydWN0dXJlICoqKgorCitXZSBwcmV2aW91c2x5IG1lbnRpb25lZCB0aGUgbmVlZCBmb3Igb3ZlcmFsbCBjb250cm9sIGxvZ2ljIGluIHRoZSBjb21wcmVzc2lvbgorYW5kIGRlY29tcHJlc3Npb24gbGlicmFyaWVzLiAgSW4gSUpHIGltcGxlbWVudGF0aW9ucyBwcmlvciB0byB2NSwgb3ZlcmFsbAorY29udHJvbCB3YXMgbW9zdGx5IHByb3ZpZGVkIGJ5ICJwaXBlbGluZSBjb250cm9sIiBtb2R1bGVzLCB3aGljaCBwcm92ZWQgdG8gYmUKK2xhcmdlLCB1bndpZWxkeSwgYW5kIGhhcmQgdG8gdW5kZXJzdGFuZC4gIFRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbiwgdGhlCitjb250cm9sIGxvZ2ljIGhhcyBiZWVuIHN1YmRpdmlkZWQgaW50byBtdWx0aXBsZSBtb2R1bGVzLiAgVGhlIGNvbnRyb2wgbW9kdWxlcworY29uc2lzdCBvZjoKKworMS4gTWFzdGVyIGNvbnRyb2wgZm9yIG1vZHVsZSBzZWxlY3Rpb24gYW5kIGluaXRpYWxpemF0aW9uLiAgVGhpcyBoYXMgdHdvCityZXNwb25zaWJpbGl0aWVzOgorCisgICAxQS4gIFN0YXJ0dXAgaW5pdGlhbGl6YXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiBpbWFnZSBwcm9jZXNzaW5nLgorICAgICAgICBUaGUgaW5kaXZpZHVhbCBwcm9jZXNzaW5nIG1vZHVsZXMgdG8gYmUgdXNlZCBpbiB0aGlzIHJ1biBhcmUgc2VsZWN0ZWQKKyAgICAgICAgYW5kIGdpdmVuIGluaXRpYWxpemF0aW9uIGNhbGxzLgorCisgICAxQi4gIFBlci1wYXNzIGNvbnRyb2wuICBUaGlzIGRldGVybWluZXMgaG93IG1hbnkgcGFzc2VzIHdpbGwgYmUgcGVyZm9ybWVkCisgICAgICAgIGFuZCBjYWxscyBlYWNoIGFjdGl2ZSBwcm9jZXNzaW5nIG1vZHVsZSB0byBjb25maWd1cmUgaXRzZWxmCisgICAgICAgIGFwcHJvcHJpYXRlbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuICBFbmQtb2YtcGFzcyBwcm9jZXNzaW5nLAorCXdoZXJlIG5lY2Vzc2FyeSwgaXMgYWxzbyBpbnZva2VkIGZyb20gdGhlIG1hc3RlciBjb250cm9sIG1vZHVsZS4KKworICAgTWV0aG9kIHNlbGVjdGlvbiBpcyBwYXJ0aWFsbHkgZGlzdHJpYnV0ZWQsIGluIHRoYXQgYSBwYXJ0aWN1bGFyIHByb2Nlc3NpbmcKKyAgIG1vZHVsZSBtYXkgY29udGFpbiBzZXZlcmFsIHBvc3NpYmxlIGltcGxlbWVudGF0aW9ucyBvZiBhIHBhcnRpY3VsYXIgbWV0aG9kLAorICAgd2hpY2ggaXQgd2lsbCBzZWxlY3QgYW1vbmcgd2hlbiBnaXZlbiBpdHMgaW5pdGlhbGl6YXRpb24gY2FsbC4gIFRoZSBtYXN0ZXIKKyAgIGNvbnRyb2wgY29kZSBuZWVkIG9ubHkgYmUgY29uY2VybmVkIHdpdGggZGVjaXNpb25zIHRoYXQgYWZmZWN0IG1vcmUgdGhhbgorICAgb25lIG1vZHVsZS4KKyAKKzIuIERhdGEgYnVmZmVyaW5nIGNvbnRyb2wuICBBIHNlcGFyYXRlIGNvbnRyb2wgbW9kdWxlIGV4aXN0cyBmb3IgZWFjaAorICAgaW50ZXItcHJvY2Vzc2luZy1zdGVwIGRhdGEgYnVmZmVyLiAgVGhpcyBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yCisgICBpbnZva2luZyB0aGUgcHJvY2Vzc2luZyBzdGVwcyB0aGF0IHdyaXRlIG9yIHJlYWQgdGhhdCBkYXRhIGJ1ZmZlci4KKworRWFjaCBidWZmZXIgY29udHJvbGxlciBzZWVzIHRoZSB3b3JsZCBhcyBmb2xsb3dzOgorCitpbnB1dCBkYXRhID0+IHByb2Nlc3Npbmcgc3RlcCBBID0+IGJ1ZmZlciA9PiBwcm9jZXNzaW5nIHN0ZXAgQiA9PiBvdXRwdXQgZGF0YQorICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSBjb250cm9sbGVyIC0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgY29udHJvbGxlciBrbm93cyB0aGUgZGF0YWZsb3cgcmVxdWlyZW1lbnRzIG9mIHN0ZXBzIEEgYW5kIEI6IGhvdyBtdWNoIGRhdGEKK3RoZXkgd2FudCB0byBhY2NlcHQgaW4gb25lIGNodW5rIGFuZCBob3cgbXVjaCB0aGV5IG91dHB1dCBpbiBvbmUgY2h1bmsuICBJdHMKK2Z1bmN0aW9uIGlzIHRvIG1hbmFnZSBpdHMgYnVmZmVyIGFuZCBjYWxsIEEgYW5kIEIgYXQgdGhlIHByb3BlciB0aW1lcy4KKworQSBkYXRhIGJ1ZmZlciBjb250cm9sIG1vZHVsZSBtYXkgaXRzZWxmIGJlIHZpZXdlZCBhcyBhIHByb2Nlc3Npbmcgc3RlcCBieSBhCitoaWdoZXItbGV2ZWwgY29udHJvbCBtb2R1bGU7IHRodXMgdGhlIGNvbnRyb2wgbW9kdWxlcyBmb3JtIGEgYmluYXJ5IHRyZWUgd2l0aAorZWxlbWVudGFyeSBwcm9jZXNzaW5nIHN0ZXBzIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUuCisKK1RoZSBjb250cm9sIG1vZHVsZXMgYXJlIG9iamVjdHMuICBBIGNvbnNpZGVyYWJsZSBhbW91bnQgb2YgZmxleGliaWxpdHkgY2FuCitiZSBoYWQgYnkgcmVwbGFjaW5nIGltcGxlbWVudGF0aW9ucyBvZiBhIGNvbnRyb2wgbW9kdWxlLiAgRm9yIGV4YW1wbGU6CisqIE1lcmdpbmcgb2YgYWRqYWNlbnQgc3RlcHMgaW4gdGhlIHBpcGVsaW5lIGlzIGRvbmUgYnkgcmVwbGFjaW5nIGEgY29udHJvbAorICBtb2R1bGUgYW5kIGl0cyBwYWlyIG9mIHByb2Nlc3Npbmctc3RlcCBtb2R1bGVzIHdpdGggYSBzaW5nbGUgcHJvY2Vzc2luZy0KKyAgc3RlcCBtb2R1bGUuICAoSGVuY2UgdGhlIHBvc3NpYmxlIG1lcmdlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdHJlZSBvZgorICBjb250cm9sIG1vZHVsZXMuKQorKiBJbiBzb21lIHByb2Nlc3NpbmcgbW9kZXMsIGEgZ2l2ZW4gaW50ZXJzdGVwIGJ1ZmZlciBuZWVkIG9ubHkgYmUgYSAic3RyaXAiCisgIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gYWNjb21tb2RhdGUgdGhlIGRlc2lyZWQgZGF0YSBjaHVuayBzaXplcy4gIEluIG90aGVyCisgIG1vZGVzLCBhIGZ1bGwtaW1hZ2UgYnVmZmVyIGlzIG5lZWRlZCBhbmQgc2V2ZXJhbCBwYXNzZXMgYXJlIHJlcXVpcmVkLgorICBUaGUgY29udHJvbCBtb2R1bGUgZGV0ZXJtaW5lcyB3aGljaCBraW5kIG9mIGJ1ZmZlciBpcyB1c2VkIGFuZCBtYW5pcHVsYXRlcworICB2aXJ0dWFsIGFycmF5IGJ1ZmZlcnMgYXMgbmVlZGVkLiAgT25lIG9yIGJvdGggcHJvY2Vzc2luZyBzdGVwcyBtYXkgYmUKKyAgdW5hd2FyZSBvZiB0aGUgbXVsdGktcGFzcyBiZWhhdmlvci4KKworSW4gdGhlb3J5LCB3ZSBtaWdodCBiZSBhYmxlIHRvIG1ha2UgYWxsIG9mIHRoZSBkYXRhIGJ1ZmZlciBjb250cm9sbGVycworaW50ZXJjaGFuZ2VhYmxlIGFuZCBwcm92aWRlIGp1c3Qgb25lIHNldCBvZiBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbC4gIEluCitwcmFjdGljZSwgZWFjaCBvbmUgY29udGFpbnMgY29uc2lkZXJhYmxlIHNwZWNpYWwtY2FzZSBwcm9jZXNzaW5nIGZvciBpdHMKK3BhcnRpY3VsYXIgam9iLiAgVGhlIGJ1ZmZlciBjb250cm9sbGVyIGNvbmNlcHQgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGFuCitvdmVyYWxsIHN5c3RlbSBzdHJ1Y3R1cmluZyBwcmluY2lwbGUsIG5vdCBhcyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZQordGFzayBwZXJmb3JtZWQgYnkgYW55IG9uZSBjb250cm9sbGVyLgorCisKKyoqKiBDb21wcmVzc2lvbiBvYmplY3Qgc3RydWN0dXJlICoqKgorCitIZXJlIGlzIGEgc2tldGNoIG9mIHRoZSBsb2dpY2FsIHN0cnVjdHVyZSBvZiB0aGUgSlBFRyBjb21wcmVzc2lvbiBsaWJyYXJ5OgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tIENvbG9yc3BhY2UgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgfC0tIFByZXByb2Nlc3NpbmcgY29udHJvbGxlciAtLXwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRG93bnNhbXBsaW5nCitNYWluIGNvbnRyb2xsZXIgLS18CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBGb3J3YXJkIERDVCwgcXVhbnRpemUKKyAgICAgICAgICAgICAgICAgIHwtLSBDb2VmZmljaWVudCBjb250cm9sbGVyIC0tfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRW50cm9weSBlbmNvZGluZworCitUaGlzIHNrZXRjaCBhbHNvIGRlc2NyaWJlcyB0aGUgZmxvdyBvZiBjb250cm9sIChzdWJyb3V0aW5lIGNhbGxzKSBkdXJpbmcKK3R5cGljYWwgaW1hZ2UgZGF0YSBwcm9jZXNzaW5nLiAgRWFjaCBvZiB0aGUgY29tcG9uZW50cyBzaG93biBpbiB0aGUgZGlhZ3JhbSBpcworYW4gIm9iamVjdCIgd2hpY2ggbWF5IGhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIGF2YWlsYWJsZS4gIE9uZQorb3IgbW9yZSBzb3VyY2UgY29kZSBmaWxlcyBjb250YWluIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24ocykgb2YgZWFjaCBvYmplY3QuCisKK1RoZSBvYmplY3RzIHNob3duIGFib3ZlIGFyZToKKworKiBNYWluIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgc3Vic2FtcGxlZC1kYXRhIGJ1ZmZlciwgd2hpY2gKKyAgaG9sZHMgdGhlIHByZXByb2Nlc3NlZCBpbnB1dCBkYXRhLiAgVGhpcyBjb250cm9sbGVyIGludm9rZXMgcHJlcHJvY2Vzc2luZyB0bworICBmaWxsIHRoZSBzdWJzYW1wbGVkLWRhdGEgYnVmZmVyLCBhbmQgSlBFRyBjb21wcmVzc2lvbiB0byBlbXB0eSBpdC4gIFRoZXJlIGlzCisgIHVzdWFsbHkgbm8gbmVlZCBmb3IgYSBmdWxsLWltYWdlIGJ1ZmZlciBoZXJlOyBhIHN0cmlwIGJ1ZmZlciBpcyBhZGVxdWF0ZS4KKworKiBQcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgZG93bnNhbXBsaW5nIGlucHV0IGRhdGEKKyAgYnVmZmVyLCB3aGljaCBsaWVzIGJldHdlZW4gY29sb3JzcGFjZSBjb252ZXJzaW9uIGFuZCBkb3duc2FtcGxpbmcuICBOb3RlCisgIHRoYXQgYSB1bmlmaWVkIGNvbnZlcnNpb24vZG93bnNhbXBsaW5nIG1vZHVsZSB3b3VsZCBwcm9iYWJseSByZXBsYWNlIHRoaXMKKyAgY29udHJvbGxlciBlbnRpcmVseS4KKworKiBDb2xvcnNwYWNlIGNvbnZlcnNpb246IGNvbnZlcnRzIGFwcGxpY2F0aW9uIGltYWdlIGRhdGEgaW50byB0aGUgZGVzaXJlZAorICBKUEVHIGNvbG9yIHNwYWNlOyBhbHNvIGNoYW5nZXMgdGhlIGRhdGEgZnJvbSBwaXhlbC1pbnRlcmxlYXZlZCBsYXlvdXQgdG8KKyAgc2VwYXJhdGUgY29tcG9uZW50IHBsYW5lcy4gIFByb2Nlc3NlcyBvbmUgcGl4ZWwgcm93IGF0IGEgdGltZS4KKworKiBEb3duc2FtcGxpbmc6IHBlcmZvcm1zIHJlZHVjdGlvbiBvZiBjaHJvbWEgY29tcG9uZW50cyBhcyByZXF1aXJlZC4KKyAgT3B0aW9uYWxseSBtYXkgcGVyZm9ybSBwaXhlbC1sZXZlbCBzbW9vdGhpbmcgYXMgd2VsbC4gIFByb2Nlc3NlcyBhICJyb3cKKyAgZ3JvdXAiIGF0IGEgdGltZSwgd2hlcmUgYSByb3cgZ3JvdXAgaXMgZGVmaW5lZCBhcyBWbWF4IHBpeGVsIHJvd3Mgb2YgZWFjaAorICBjb21wb25lbnQgYmVmb3JlIGRvd25zYW1wbGluZywgYW5kIFZrIHNhbXBsZSByb3dzIGFmdGVyd2FyZHMgKHJlbWVtYmVyIFZrCisgIGRpZmZlcnMgYWNyb3NzIGNvbXBvbmVudHMpLiAgU29tZSBkb3duc2FtcGxpbmcgb3Igc21vb3RoaW5nIGFsZ29yaXRobXMgbWF5CisgIHJlcXVpcmUgY29udGV4dCByb3dzIGFib3ZlIGFuZCBiZWxvdyB0aGUgY3VycmVudCByb3cgZ3JvdXA7IHRoZQorICBwcmVwcm9jZXNzaW5nIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyB0aGVzZSByb3dzIHZpYSBwcm9wZXIKKyAgYnVmZmVyaW5nLiAgVGhlIGRvd25zYW1wbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlZGdlIGV4cGFuc2lvbiBhdCB0aGUgcmlnaHQKKyAgZWRnZSAoaS5lLiwgZXh0ZW5kaW5nIGVhY2ggc2FtcGxlIHJvdyB0byBhIG11bHRpcGxlIG9mIDggc2FtcGxlcyk7IGJ1dCB0aGUKKyAgcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB2ZXJ0aWNhbCBlZGdlIGV4cGFuc2lvbiAoaS5lLiwKKyAgZHVwbGljYXRpbmcgdGhlIGJvdHRvbSBzYW1wbGUgcm93IGFzIG5lZWRlZCB0byBtYWtlIGEgbXVsdGlwbGUgb2YgOCByb3dzKS4KKworKiBDb2VmZmljaWVudCBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIERDVC1jb2VmZmljaWVudCBkYXRhLgorICBUaGlzIGNvbnRyb2xsZXIgaGFuZGxlcyBNQ1UgYXNzZW1ibHksIGluY2x1ZGluZyBpbnNlcnRpb24gb2YgZHVtbXkgRENUCisgIGJsb2NrcyB3aGVuIG5lZWRlZCBhdCB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2UuICBXaGVuIHBlcmZvcm1pbmcKKyAgSHVmZm1hbi1jb2RlIG9wdGltaXphdGlvbiBvciBlbWl0dGluZyBhIG11bHRpc2NhbiBKUEVHIGZpbGUsIHRoaXMKKyAgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYnVmZmVyaW5nIHRoZSBmdWxsIGltYWdlLiAgVGhlIGVxdWl2YWxlbnQgb2YKKyAgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgb2Ygc3Vic2FtcGxlZCBkYXRhIGlzIHByb2Nlc3NlZCBwZXIgY2FsbCwKKyAgZXZlbiB3aGVuIHRoZSBKUEVHIGZpbGUgaXMgbm9uaW50ZXJsZWF2ZWQuCisKKyogRm9yd2FyZCBEQ1QgYW5kIHF1YW50aXphdGlvbjogUGVyZm9ybSBEQ1QsIHF1YW50aXplLCBhbmQgZW1pdCBjb2VmZmljaWVudHMuCisgIFdvcmtzIG9uIG9uZSBvciBtb3JlIERDVCBibG9ja3MgYXQgYSB0aW1lLiAgKE5vdGU6IHRoZSBjb2VmZmljaWVudHMgYXJlIG5vdworICBlbWl0dGVkIGluIG5vcm1hbCBhcnJheSBvcmRlciwgd2hpY2ggdGhlIGVudHJvcHkgZW5jb2RlciBpcyBleHBlY3RlZCB0bworICBjb252ZXJ0IHRvIHppZ3phZyBvcmRlciBhcyBuZWNlc3NhcnkuICBQcmlvciB2ZXJzaW9ucyBvZiB0aGUgSUpHIGNvZGUgZGlkCisgIHRoZSBjb252ZXJzaW9uIHRvIHppZ3phZyBvcmRlciB3aXRoaW4gdGhlIHF1YW50aXphdGlvbiBzdGVwLikKKworKiBFbnRyb3B5IGVuY29kaW5nOiBQZXJmb3JtIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBlbnRyb3B5IGNvZGluZyBhbmQgZW1pdCB0aGUKKyAgY29kZWQgZGF0YSB0byB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUuICBXb3JrcyBvbiBvbmUgTUNVIHBlciBjYWxsLgorICBGb3IgcHJvZ3Jlc3NpdmUgSlBFRywgdGhlIHNhbWUgRENUIGJsb2NrcyBhcmUgZmVkIHRvIHRoZSBlbnRyb3B5IGNvZGVyCisgIGR1cmluZyBlYWNoIHBhc3MsIGFuZCB0aGUgY29kZXIgbXVzdCBlbWl0IHRoZSBhcHByb3ByaWF0ZSBzdWJzZXQgb2YKKyAgY29lZmZpY2llbnRzLgorCitJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgb2JqZWN0cywgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgaW5jbHVkZXMgdGhlc2UKK29iamVjdHM6CisKKyogTWFzdGVyIGNvbnRyb2w6IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwYXNzZXMgcmVxdWlyZWQsIGNvbnRyb2xzIG92ZXJhbGwKKyAgYW5kIHBlci1wYXNzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdGhlciBtb2R1bGVzLgorCisqIE1hcmtlciB3cml0aW5nOiBnZW5lcmF0ZXMgSlBFRyBtYXJrZXJzIChleGNlcHQgZm9yIFJTVG4sIHdoaWNoIGlzIGVtaXR0ZWQKKyAgYnkgdGhlIGVudHJvcHkgZW5jb2RlciB3aGVuIG5lZWRlZCkuCisKKyogRGF0YSBkZXN0aW5hdGlvbiBtYW5hZ2VyOiB3cml0ZXMgdGhlIG91dHB1dCBKUEVHIGRhdGFzdHJlYW0gdG8gaXRzIGZpbmFsCisgIGRlc3RpbmF0aW9uIChlLmcuLCBhIGZpbGUpLiAgVGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgc3VwcGxpZWQgd2l0aCB0aGUKKyAgbGlicmFyeSBrbm93cyBob3cgdG8gd3JpdGUgdG8gYSBzdGRpbyBzdHJlYW07IGZvciBvdGhlciBiZWhhdmlvcnMsIHRoZQorICBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkgcHJvdmlkZSBpdHMgb3duIGRlc3RpbmF0aW9uIG1hbmFnZXIuCisKKyogTWVtb3J5IG1hbmFnZXI6IGFsbG9jYXRlcyBhbmQgcmVsZWFzZXMgbWVtb3J5LCBjb250cm9scyB2aXJ0dWFsIGFycmF5cworICAod2l0aCBiYWNraW5nIHN0b3JlIG1hbmFnZW1lbnQsIHdoZXJlIHJlcXVpcmVkKS4KKworKiBFcnJvciBoYW5kbGVyOiBwZXJmb3JtcyBmb3JtYXR0aW5nIGFuZCBvdXRwdXQgb2YgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzOworICBkZXRlcm1pbmVzIGhhbmRsaW5nIG9mIG5vbmZhdGFsIGVycm9ycy4gIFRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiBtYXkKKyAgb3ZlcnJpZGUgc29tZSBvciBhbGwgb2YgdGhpcyBvYmplY3QncyBtZXRob2RzIHRvIGNoYW5nZSBlcnJvciBoYW5kbGluZy4KKworKiBQcm9ncmVzcyBtb25pdG9yOiBzdXBwb3J0cyBvdXRwdXQgb2YgInBlcmNlbnQtZG9uZSIgcHJvZ3Jlc3MgcmVwb3J0cy4KKyAgVGhpcyBvYmplY3QgcmVwcmVzZW50cyBhbiBvcHRpb25hbCBjYWxsYmFjayB0byB0aGUgc3Vycm91bmRpbmcgYXBwbGljYXRpb246CisgIGlmIHdhbnRlZCwgaXQgbXVzdCBiZSBzdXBwbGllZCBieSB0aGUgYXBwbGljYXRpb24uCisKK1RoZSBlcnJvciBoYW5kbGVyLCBkZXN0aW5hdGlvbiBtYW5hZ2VyLCBhbmQgcHJvZ3Jlc3MgbW9uaXRvciBvYmplY3RzIGFyZQorZGVmaW5lZCBhcyBzZXBhcmF0ZSBvYmplY3RzIGluIG9yZGVyIHRvIHNpbXBsaWZ5IGFwcGxpY2F0aW9uLXNwZWNpZmljCitjdXN0b21pemF0aW9uIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBBIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZQoraW5kaXZpZHVhbCBtZXRob2RzIG9yIHN1cHBseSBpdHMgb3duIGFsbC1uZXcgaW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIHRoZXNlCitvYmplY3RzLiAgVGhlIG9iamVjdCBpbnRlcmZhY2VzIGZvciB0aGVzZSBvYmplY3RzIGFyZSB0aGVyZWZvcmUgdHJlYXRlZCBhcworcGFydCBvZiB0aGUgYXBwbGljYXRpb24gaW50ZXJmYWNlIG9mIHRoZSBsaWJyYXJ5LCB3aGVyZWFzIHRoZSBvdGhlciBvYmplY3RzCithcmUgaW50ZXJuYWwgdG8gdGhlIGxpYnJhcnkuCisKK1RoZSBlcnJvciBoYW5kbGVyIGFuZCBtZW1vcnkgbWFuYWdlciBhcmUgc2hhcmVkIGJ5IEpQRUcgY29tcHJlc3Npb24gYW5kCitkZWNvbXByZXNzaW9uOyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciwgaWYgdXNlZCwgbWF5IGJlIHNoYXJlZCBhcyB3ZWxsLgorCisKKyoqKiBEZWNvbXByZXNzaW9uIG9iamVjdCBzdHJ1Y3R1cmUgKioqCisKK0hlcmUgaXMgYSBza2V0Y2ggb2YgdGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBKUEVHIGRlY29tcHJlc3Npb24gbGlicmFyeToKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gRW50cm9weSBkZWNvZGluZworICAgICAgICAgICAgICAgICAgfC0tIENvZWZmaWNpZW50IGNvbnRyb2xsZXIgLS18CisgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBEZXF1YW50aXplLCBJbnZlcnNlIERDVAorTWFpbiBjb250cm9sbGVyIC0tfAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gVXBzYW1wbGluZworICAgICAgICAgICAgICAgICAgfC0tIFBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIgLS18ICAgfC0tIENvbG9yc3BhY2UgY29udmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0gQ29sb3IgcXVhbnRpemF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLSBDb2xvciBwcmVjaXNpb24gcmVkdWN0aW9uCisKK0FzIGJlZm9yZSwgdGhpcyBkaWFncmFtIGFsc28gcmVwcmVzZW50cyB0eXBpY2FsIGNvbnRyb2wgZmxvdy4gIFRoZSBvYmplY3RzCitzaG93biBhcmU6CisKKyogTWFpbiBjb250cm9sbGVyOiBidWZmZXIgY29udHJvbGxlciBmb3IgdGhlIHN1YnNhbXBsZWQtZGF0YSBidWZmZXIsIHdoaWNoCisgIGhvbGRzIHRoZSBvdXRwdXQgb2YgSlBFRyBkZWNvbXByZXNzaW9uIHByb3Blci4gIFRoaXMgY29udHJvbGxlcidzIHByaW1hcnkKKyAgdGFzayBpcyB0byBmZWVkIHRoZSBwb3N0cHJvY2Vzc2luZyBwcm9jZWR1cmUuICBTb21lIHVwc2FtcGxpbmcgYWxnb3JpdGhtcworICBtYXkgcmVxdWlyZSBjb250ZXh0IHJvd3MgYWJvdmUgYW5kIGJlbG93IHRoZSBjdXJyZW50IHJvdyBncm91cDsgd2hlbiB0aGlzCisgIGlzIHRydWUsIHRoZSBtYWluIGNvbnRyb2xsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGl0cyBidWZmZXIgc28gYXMKKyAgdG8gbWFrZSBjb250ZXh0IHJvd3MgYXZhaWxhYmxlLiAgSW4gdGhlIGN1cnJlbnQgZGVzaWduLCB0aGUgbWFpbiBidWZmZXIgaXMKKyAgYWx3YXlzIGEgc3RyaXAgYnVmZmVyOyBhIGZ1bGwtaW1hZ2UgYnVmZmVyIGlzIG5ldmVyIHJlcXVpcmVkLgorCisqIENvZWZmaWNpZW50IGNvbnRyb2xsZXI6IGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgRENULWNvZWZmaWNpZW50IGRhdGEuCisgIFRoaXMgY29udHJvbGxlciBoYW5kbGVzIE1DVSBkaXNhc3NlbWJseSwgaW5jbHVkaW5nIGRlbGV0aW9uIG9mIGFueSBkdW1teQorICBEQ1QgYmxvY2tzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZS4gIFdoZW4gcmVhZGluZyBhIG11bHRpc2NhbiBKUEVHCisgIGZpbGUsIHRoaXMgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYnVmZmVyaW5nIHRoZSBmdWxsIGltYWdlLgorICAoQnVmZmVyaW5nIERDVCBjb2VmZmljaWVudHMsIHJhdGhlciB0aGFuIHNhbXBsZXMsIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0CisgIHByb2dyZXNzaXZlIEpQRUcuKSAgVGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgb2YKKyAgc3Vic2FtcGxlZCBkYXRhIGlzIHByb2Nlc3NlZCBwZXIgY2FsbCwgZXZlbiB3aGVuIHRoZSBzb3VyY2UgSlBFRyBmaWxlIGlzCisgIG5vbmludGVybGVhdmVkLgorCisqIEVudHJvcHkgZGVjb2Rpbmc6IFJlYWQgY29kZWQgZGF0YSBmcm9tIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUgYW5kIHBlcmZvcm0KKyAgSHVmZm1hbiBvciBhcml0aG1ldGljIGVudHJvcHkgZGVjb2RpbmcuICBXb3JrcyBvbiBvbmUgTUNVIHBlciBjYWxsLgorICBGb3IgcHJvZ3Jlc3NpdmUgSlBFRyBkZWNvZGluZywgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgc3VwcGxpZXMgdGhlIHByaW9yCisgIGNvZWZmaWNpZW50cyBvZiBlYWNoIE1DVSAoaW5pdGlhbGx5IGFsbCB6ZXJvZXMpLCB3aGljaCB0aGUgZW50cm9weSBkZWNvZGVyCisgIG1vZGlmaWVzIGluIGVhY2ggc2Nhbi4KKworKiBEZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Q6IGxpa2UgaXQgc2F5cy4gIE5vdGUgdGhhdCB0aGUgY29lZmZpY2llbnRzCisgIGJ1ZmZlcmVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGhhdmUgTk9UIGJlZW4gZGVxdWFudGl6ZWQ7IHdlCisgIG1lcmdlIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBpbnRvIGEgc2luZ2xlIHN0ZXAgZm9yIHNwZWVkIHJlYXNvbnMuCisgIFdoZW4gc2NhbGVkLWRvd24gb3V0cHV0IGlzIGFza2VkIGZvciwgc2ltcGxpZmllZCBEQ1QgYWxnb3JpdGhtcyBtYXkgYmUgdXNlZAorICB0aGF0IGVtaXQgb25seSAxeDEsIDJ4Miwgb3IgNHg0IHNhbXBsZXMgcGVyIERDVCBibG9jaywgbm90IHRoZSBmdWxsIDh4OC4KKyAgV29ya3Mgb24gb25lIERDVCBibG9jayBhdCBhIHRpbWUuCisKKyogUG9zdHByb2Nlc3NpbmcgY29udHJvbGxlcjogYnVmZmVyIGNvbnRyb2xsZXIgZm9yIHRoZSBjb2xvciBxdWFudGl6YXRpb24KKyAgaW5wdXQgYnVmZmVyLCB3aGVuIHF1YW50aXphdGlvbiBpcyBpbiB1c2UuICAoV2l0aG91dCBxdWFudGl6YXRpb24sIHRoaXMKKyAgY29udHJvbGxlciBqdXN0IGNhbGxzIHRoZSB1cHNhbXBsZXIuKSAgRm9yIHR3by1wYXNzIHF1YW50aXphdGlvbiwgdGhpcworICBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBidWZmZXJpbmcgdGhlIGZ1bGwtaW1hZ2UgZGF0YS4KKworKiBVcHNhbXBsaW5nOiByZXN0b3JlcyBjaHJvbWEgY29tcG9uZW50cyB0byBmdWxsIHNpemUuICAoTWF5IHN1cHBvcnQgbW9yZQorICBnZW5lcmFsIG91dHB1dCByZXNjYWxpbmcsIHRvby4gIE5vdGUgdGhhdCBpZiB1bmRlcnNpemVkIERDVCBvdXRwdXRzIGhhdmUKKyAgYmVlbiBlbWl0dGVkIGJ5IHRoZSBEQ1QgbW9kdWxlLCB0aGlzIG1vZHVsZSBtdXN0IGFkanVzdCBzbyB0aGF0IHByb3Blcmx5CisgIHNpemVkIG91dHB1dHMgYXJlIGNyZWF0ZWQuKSAgV29ya3Mgb24gb25lIHJvdyBncm91cCBhdCBhIHRpbWUuICBUaGlzIG1vZHVsZQorICBhbHNvIGNhbGxzIHRoZSBjb2xvciBjb252ZXJzaW9uIG1vZHVsZSwgc28gaXRzIHRvcCBsZXZlbCBpcyBlZmZlY3RpdmVseSBhCisgIGJ1ZmZlciBjb250cm9sbGVyIGZvciB0aGUgdXBzYW1wbGluZy0+Y29sb3IgY29udmVyc2lvbiBidWZmZXIuICBIb3dldmVyLCBpbgorICBhbGwgYnV0IHRoZSBoaWdoZXN0LXF1YWxpdHkgb3BlcmF0aW5nIG1vZGVzLCB1cHNhbXBsaW5nIGFuZCBjb2xvcgorICBjb252ZXJzaW9uIGFyZSBsaWtlbHkgdG8gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgc3RlcC4KKworKiBDb2xvcnNwYWNlIGNvbnZlcnNpb246IGNvbnZlcnQgZnJvbSBKUEVHIGNvbG9yIHNwYWNlIHRvIG91dHB1dCBjb2xvciBzcGFjZSwKKyAgYW5kIGNoYW5nZSBkYXRhIGxheW91dCBmcm9tIHNlcGFyYXRlIGNvbXBvbmVudCBwbGFuZXMgdG8gcGl4ZWwtaW50ZXJsZWF2ZWQuCisgIFdvcmtzIG9uIG9uZSBwaXhlbCByb3cgYXQgYSB0aW1lLgorCisqIENvbG9yIHF1YW50aXphdGlvbjogcmVkdWNlIHRoZSBkYXRhIHRvIGNvbG9ybWFwcGVkIGZvcm0sIHVzaW5nIGVpdGhlciBhbgorICBleHRlcm5hbGx5IHNwZWNpZmllZCBjb2xvcm1hcCBvciBhbiBpbnRlcm5hbGx5IGdlbmVyYXRlZCBvbmUuICBUaGlzIG1vZHVsZQorICBpcyBub3QgdXNlZCBmb3IgZnVsbC1jb2xvciBvdXRwdXQuICBXb3JrcyBvbiBvbmUgcGl4ZWwgcm93IGF0IGEgdGltZTsgbWF5CisgIHJlcXVpcmUgdHdvIHBhc3NlcyB0byBnZW5lcmF0ZSBhIGNvbG9yIG1hcC4gIE5vdGUgdGhhdCB0aGUgb3V0cHV0IHdpbGwKKyAgYWx3YXlzIGJlIGEgc2luZ2xlIGNvbXBvbmVudCByZXByZXNlbnRpbmcgY29sb3JtYXAgaW5kZXhlcy4gIEluIHRoZSBjdXJyZW50CisgIGRlc2lnbiwgdGhlIG91dHB1dCB2YWx1ZXMgYXJlIEpTQU1QTEVzLCBzbyBhbiA4LWJpdCBjb21waWxhdGlvbiBjYW5ub3QKKyAgcXVhbnRpemUgdG8gbW9yZSB0aGFuIDI1NiBjb2xvcnMuICBUaGlzIGlzIHVubGlrZWx5IHRvIGJlIGEgcHJvYmxlbSBpbgorICBwcmFjdGljZS4KKworKiBDb2xvciByZWR1Y3Rpb246IHRoaXMgbW9kdWxlIGhhbmRsZXMgY29sb3IgcHJlY2lzaW9uIHJlZHVjdGlvbiwgZS5nLiwKKyAgZ2VuZXJhdGluZyAxNS1iaXQgY29sb3IgKDUgYml0cy9wcmltYXJ5KSBmcm9tIEpQRUcncyAyNC1iaXQgb3V0cHV0LgorICBOb3QgcXVpdGUgY2xlYXIgeWV0IGhvdyB0aGlzIHNob3VsZCBiZSBoYW5kbGVkLi4uIHNob3VsZCB3ZSBtZXJnZSBpdCB3aXRoCisgIGNvbG9yc3BhY2UgY29udmVyc2lvbj8/PworCitOb3RlIHRoYXQgc29tZSBoaWdoLXNwZWVkIG9wZXJhdGluZyBtb2RlcyBtaWdodCBjb25kZW5zZSB0aGUgZW50aXJlCitwb3N0cHJvY2Vzc2luZyBzZXF1ZW5jZSB0byBhIHNpbmdsZSBtb2R1bGUgKHVwc2FtcGxlLCBjb2xvciBjb252ZXJ0LCBhbmQKK3F1YW50aXplIGluIG9uZSBzdGVwKS4KKworSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIG9iamVjdHMsIHRoZSBkZWNvbXByZXNzaW9uIGxpYnJhcnkgaW5jbHVkZXMgdGhlc2UKK29iamVjdHM6CisKKyogTWFzdGVyIGNvbnRyb2w6IGRldGVybWluZXMgdGhlIG51bWJlciBvZiBwYXNzZXMgcmVxdWlyZWQsIGNvbnRyb2xzIG92ZXJhbGwKKyAgYW5kIHBlci1wYXNzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgVGhpcyBpcyBzdWJkaXZpZGVkIGludG8KKyAgaW5wdXQgYW5kIG91dHB1dCBjb250cm9sOiBqZGlucHV0LmMgY29udHJvbHMgb25seSBpbnB1dC1zaWRlIHByb2Nlc3NpbmcsCisgIHdoaWxlIGpkbWFzdGVyLmMgaGFuZGxlcyBvdmVyYWxsIGluaXRpYWxpemF0aW9uIGFuZCBvdXRwdXQtc2lkZSBjb250cm9sLgorCisqIE1hcmtlciByZWFkaW5nOiBkZWNvZGVzIEpQRUcgbWFya2VycyAoZXhjZXB0IGZvciBSU1RuKS4KKworKiBEYXRhIHNvdXJjZSBtYW5hZ2VyOiBzdXBwbGllcyB0aGUgaW5wdXQgSlBFRyBkYXRhc3RyZWFtLiAgVGhlIHNvdXJjZQorICBtYW5hZ2VyIHN1cHBsaWVkIHdpdGggdGhlIGxpYnJhcnkga25vd3MgaG93IHRvIHJlYWQgZnJvbSBhIHN0ZGlvIHN0cmVhbTsKKyAgZm9yIG90aGVyIGJlaGF2aW9ycywgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uIG1heSBwcm92aWRlIGl0cyBvd24gc291cmNlCisgIG1hbmFnZXIuCisKKyogTWVtb3J5IG1hbmFnZXI6IHNhbWUgYXMgZm9yIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyogRXJyb3IgaGFuZGxlcjogc2FtZSBhcyBmb3IgY29tcHJlc3Npb24gbGlicmFyeS4KKworKiBQcm9ncmVzcyBtb25pdG9yOiBzYW1lIGFzIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCitBcyB3aXRoIGNvbXByZXNzaW9uLCB0aGUgZGF0YSBzb3VyY2UgbWFuYWdlciwgZXJyb3IgaGFuZGxlciwgYW5kIHByb2dyZXNzCittb25pdG9yIGFyZSBjYW5kaWRhdGVzIGZvciByZXBsYWNlbWVudCBieSBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgorCisKKyoqKiBEZWNvbXByZXNzaW9uIGlucHV0IGFuZCBvdXRwdXQgc2VwYXJhdGlvbiAqKioKKworVG8gc3VwcG9ydCBlZmZpY2llbnQgaW5jcmVtZW50YWwgZGlzcGxheSBvZiBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzLCB0aGUKK2RlY29tcHJlc3NvciBpcyBkaXZpZGVkIGludG8gdHdvIHNlY3Rpb25zIHRoYXQgY2FuIHJ1biBpbmRlcGVuZGVudGx5OgorCisxLiBEYXRhIGlucHV0IGluY2x1ZGVzIG1hcmtlciBwYXJzaW5nLCBlbnRyb3B5IGRlY29kaW5nLCBhbmQgaW5wdXQgaW50byB0aGUKKyAgIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBEQ1QgY29lZmZpY2llbnQgYnVmZmVyLiAgTm90ZSB0aGF0IHRoaXMKKyAgIHByb2Nlc3NpbmcgaXMgcmVsYXRpdmVseSBjaGVhcCBhbmQgZmFzdC4KKworMi4gRGF0YSBvdXRwdXQgcmVhZHMgZnJvbSB0aGUgRENUIGNvZWZmaWNpZW50IGJ1ZmZlciBhbmQgcGVyZm9ybXMgdGhlIElEQ1QKKyAgIGFuZCBhbGwgcG9zdHByb2Nlc3Npbmcgc3RlcHMuCisKK0ZvciBhIHByb2dyZXNzaXZlIEpQRUcgZmlsZSwgdGhlIGRhdGEgaW5wdXQgcHJvY2Vzc2luZyBpcyBhbGxvd2VkIHRvIGdldAorYXJiaXRyYXJpbHkgZmFyIGFoZWFkIG9mIHRoZSBkYXRhIG91dHB1dCBwcm9jZXNzaW5nLiAgKFRoaXMgb2NjdXJzIG9ubHkKK2lmIHRoZSBhcHBsaWNhdGlvbiBjYWxscyBqcGVnX2NvbnN1bWVfaW5wdXQoKTsgb3RoZXJ3aXNlIGlucHV0IGFuZCBvdXRwdXQKK3J1biBpbiBsb2Nrc3RlcCwgc2luY2UgdGhlIGlucHV0IHNlY3Rpb24gaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgb3V0cHV0CitzZWN0aW9uIG5lZWRzIG1vcmUgZGF0YS4pICBJbiB0aGlzIHdheSB0aGUgYXBwbGljYXRpb24gY2FuIGF2b2lkIG1ha2luZworZXh0cmEgZGlzcGxheSBwYXNzZXMgd2hlbiBkYXRhIGlzIGFycml2aW5nIGZhc3RlciB0aGFuIHRoZSBkaXNwbGF5IHBhc3MKK2NhbiBydW4uICBGdXJ0aGVybW9yZSwgaXQgaXMgcG9zc2libGUgdG8gYWJvcnQgYW4gb3V0cHV0IHBhc3Mgd2l0aG91dAorbG9zaW5nIGFueXRoaW5nLCBzaW5jZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyIGlzIHJlYWQtb25seSBhcyBmYXIgYXMgdGhlCitvdXRwdXQgc2VjdGlvbiBpcyBjb25jZXJuZWQuICBTZWUgbGlianBlZy5kb2MgZm9yIG1vcmUgZGV0YWlsLgorCitBIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYXJyYXkgaXMgb25seSBjcmVhdGVkIGlmIHRoZSBKUEVHIGZpbGUgaGFzIG11bHRpcGxlCitzY2FucyAob3IgaWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllcyBidWZmZXJlZC1pbWFnZSBtb2RlIGFueXdheSkuICBXaGVuCityZWFkaW5nIGEgc2luZ2xlLXNjYW4gZmlsZSwgdGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgbm9ybWFsbHkgY3JlYXRlcyBvbmx5CithIG9uZS1NQ1UgYnVmZmVyLCBzbyBpbnB1dCBhbmQgb3V0cHV0IHByb2Nlc3NpbmcgbXVzdCBydW4gaW4gbG9ja3N0ZXAgaW4gdGhpcworY2FzZS4gIGpwZWdfY29uc3VtZV9pbnB1dCgpIGlzIGVmZmVjdGl2ZWx5IGEgbm8tb3AgaW4gdGhpcyBzaXR1YXRpb24uCisKK1RoZSBtYWluIGltcGFjdCBvZiBkaXZpZGluZyB0aGUgZGVjb21wcmVzc29yIGluIHRoaXMgZmFzaGlvbiBpcyB0aGF0IHdlIG11c3QKK2JlIHZlcnkgY2FyZWZ1bCB3aXRoIHNoYXJlZCB2YXJpYWJsZXMgaW4gdGhlIGNpbmZvIGRhdGEgc3RydWN0dXJlLiAgRWFjaAordmFyaWFibGUgdGhhdCBjYW4gY2hhbmdlIGR1cmluZyB0aGUgY291cnNlIG9mIGRlY29tcHJlc3Npb24gbXVzdCBiZQorY2xhc3NpZmllZCBhcyBiZWxvbmdpbmcgdG8gZGF0YSBpbnB1dCBvciBkYXRhIG91dHB1dCwgYW5kIGVhY2ggc2VjdGlvbiBtdXN0Citsb29rIG9ubHkgYXQgaXRzIG93biB2YXJpYWJsZXMuICBGb3IgZXhhbXBsZSwgdGhlIGRhdGEgb3V0cHV0IHNlY3Rpb24gbWF5IG5vdAorZGVwZW5kIG9uIGFueSBvZiB0aGUgdmFyaWFibGVzIHRoYXQgZGVzY3JpYmUgdGhlIGN1cnJlbnQgc2NhbiBpbiB0aGUgSlBFRworZmlsZSwgYmVjYXVzZSB0aGVzZSBtYXkgY2hhbmdlIGFzIHRoZSBkYXRhIGlucHV0IHNlY3Rpb24gYWR2YW5jZXMgaW50byBhIG5ldworc2Nhbi4KKworVGhlIHByb2dyZXNzIG1vbml0b3IgaXMgKHNvbWV3aGF0IGFyYml0cmFyaWx5KSBkZWZpbmVkIHRvIHRyZWF0IGlucHV0IG9mIHRoZQorZmlsZSBhcyBvbmUgcGFzcyB3aGVuIGJ1ZmZlcmVkLWltYWdlIG1vZGUgaXMgbm90IHVzZWQsIGFuZCB0byBpZ25vcmUgZGF0YQoraW5wdXQgd29yayBjb21wbGV0ZWx5IHdoZW4gYnVmZmVyZWQtaW1hZ2UgbW9kZSBpcyB1c2VkLiAgTm90ZSB0aGF0IHRoZQorbGlicmFyeSBoYXMgbm8gcmVsaWFibGUgd2F5IHRvIHByZWRpY3QgdGhlIG51bWJlciBvZiBwYXNzZXMgd2hlbiBkZWFsaW5nCit3aXRoIGEgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlLCBub3IgY2FuIGl0IHByZWRpY3QgdGhlIG51bWJlciBvZiBvdXRwdXQgcGFzc2VzCitpbiBidWZmZXJlZC1pbWFnZSBtb2RlLiAgU28gdGhlIHdvcmsgZXN0aW1hdGUgaXMgaW5oZXJlbnRseSBib2d1cyBhbnl3YXkuCisKK05vIGNvbXBhcmFibGUgZGl2aXNpb24gaXMgY3VycmVudGx5IG1hZGUgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGJlY2F1c2UKK3RoZXJlIGlzbid0IGFueSByZWFsIG5lZWQgZm9yIGl0LgorCisKKyoqKiBEYXRhIGZvcm1hdHMgKioqCisKK0FycmF5cyBvZiBwaXhlbCBzYW1wbGUgdmFsdWVzIHVzZSB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlOgorCisgICAgdHlwZWRlZiBzb21ldGhpbmcgSlNBTVBMRTsJCWEgcGl4ZWwgY29tcG9uZW50IHZhbHVlLCAwLi5NQVhKU0FNUExFCisgICAgdHlwZWRlZiBKU0FNUExFICpKU0FNUFJPVzsJCXB0ciB0byBhIHJvdyBvZiBzYW1wbGVzCisgICAgdHlwZWRlZiBKU0FNUFJPVyAqSlNBTVBBUlJBWTsJcHRyIHRvIGEgbGlzdCBvZiByb3dzCisgICAgdHlwZWRlZiBKU0FNUEFSUkFZICpKU0FNUElNQUdFOwlwdHIgdG8gYSBsaXN0IG9mIGNvbG9yLWNvbXBvbmVudCBhcnJheXMKKworVGhlIGJhc2ljIGVsZW1lbnQgdHlwZSBKU0FNUExFIHdpbGwgdHlwaWNhbGx5IGJlIG9uZSBvZiB1bnNpZ25lZCBjaGFyLAorKHNpZ25lZCkgY2hhciwgb3Igc2hvcnQuICBTaG9ydCB3aWxsIGJlIHVzZWQgaWYgc2FtcGxlcyB3aWRlciB0aGFuIDggYml0cyBhcmUKK3RvIGJlIHN1cHBvcnRlZCAodGhpcyBpcyBhIGNvbXBpbGUtdGltZSBvcHRpb24pLiAgT3RoZXJ3aXNlLCB1bnNpZ25lZCBjaGFyIGlzCit1c2VkIGlmIHBvc3NpYmxlLiAgSWYgdGhlIGNvbXBpbGVyIG9ubHkgc3VwcG9ydHMgc2lnbmVkIGNoYXJzLCB0aGVuIGl0IGlzCituZWNlc3NhcnkgdG8gbWFzayBvZmYgdGhlIHZhbHVlIHdoZW4gcmVhZGluZy4gIFRodXMsIGFsbCByZWFkcyBvZiBKU0FNUExFCit2YWx1ZXMgbXVzdCBiZSBjb2RlZCBhcyAiR0VUSlNBTVBMRSh2YWx1ZSkiLCB3aGVyZSB0aGUgbWFjcm8gd2lsbCBiZSBkZWZpbmVkCithcyAiKCh2YWx1ZSkgJiAweEZGKSIgb24gc2lnbmVkLWNoYXIgbWFjaGluZXMgYW5kICIoKGludCkgKHZhbHVlKSkiIGVsc2V3aGVyZS4KKworV2l0aCB0aGVzZSBjb252ZW50aW9ucywgSlNBTVBMRSB2YWx1ZXMgY2FuIGJlIGFzc3VtZWQgdG8gYmUgPj0gMC4gIFRoaXMgaGVscHMKK3NpbXBsaWZ5IGNvcnJlY3Qgcm91bmRpbmcgZHVyaW5nIGRvd25zYW1wbGluZywgZXRjLiAgVGhlIEpQRUcgc3RhbmRhcmQncworc3BlY2lmaWNhdGlvbiB0aGF0IHNhbXBsZSB2YWx1ZXMgcnVuIGZyb20gLTEyOC4uMTI3IGlzIGFjY29tbW9kYXRlZCBieQorc3VidHJhY3RpbmcgMTI4IGp1c3QgYXMgdGhlIHNhbXBsZSB2YWx1ZSBpcyBjb3BpZWQgaW50byB0aGUgc291cmNlIGFycmF5IGZvcgordGhlIERDVCBzdGVwICh0aGlzIHdpbGwgYmUgYW4gYXJyYXkgb2Ygc2lnbmVkIGludHMpLiAgU2ltaWxhcmx5LCBkdXJpbmcKK2RlY29tcHJlc3Npb24gdGhlIG91dHB1dCBvZiB0aGUgSURDVCBzdGVwIHdpbGwgYmUgaW1tZWRpYXRlbHkgc2hpZnRlZCBiYWNrIHRvCiswLi4yNTUuICAoTkI6IGRpZmZlcmVudCB2YWx1ZXMgYXJlIHJlcXVpcmVkIHdoZW4gMTItYml0IHNhbXBsZXMgYXJlIGluIHVzZS4KK1RoZSBjb2RlIGlzIHdyaXR0ZW4gaW4gdGVybXMgb2YgTUFYSlNBTVBMRSBhbmQgQ0VOVEVSSlNBTVBMRSwgd2hpY2ggd2lsbCBiZQorZGVmaW5lZCBhcyAyNTUgYW5kIDEyOCByZXNwZWN0aXZlbHkgaW4gYW4gOC1iaXQgaW1wbGVtZW50YXRpb24sIGFuZCBhcyA0MDk1CithbmQgMjA0OCBpbiBhIDEyLWJpdCBpbXBsZW1lbnRhdGlvbi4pCisKK1dlIHVzZSBhIHBvaW50ZXIgcGVyIHJvdywgcmF0aGVyIHRoYW4gYSB0d28tZGltZW5zaW9uYWwgSlNBTVBMRSBhcnJheS4gIFRoaXMKK2Nob2ljZSBjb3N0cyBvbmx5IGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSBhbmQgaGFzIHNldmVyYWwgYmVuZWZpdHM6CisqIENvZGUgdXNpbmcgdGhlIGRhdGEgc3RydWN0dXJlIGRvZXNuJ3QgbmVlZCB0byBrbm93IHRoZSBhbGxvY2F0ZWQgd2lkdGggb2YKKyAgdGhlIHJvd3MuICBUaGlzIHNpbXBsaWZpZXMgZWRnZSBleHBhbnNpb24vY29tcHJlc3Npb24sIHNpbmNlIHdlIGNhbiB3b3JrCisgIGluIGFuIGFycmF5IHRoYXQncyB3aWRlciB0aGFuIHRoZSBsb2dpY2FsIHBpY3R1cmUgd2lkdGguCisqIEluZGV4aW5nIGRvZXNuJ3QgcmVxdWlyZSBtdWx0aXBsaWNhdGlvbjsgdGhpcyBpcyBhIHBlcmZvcm1hbmNlIHdpbiBvbiBtYW55CisgIG1hY2hpbmVzLgorKiBBcnJheXMgd2l0aCBtb3JlIHRoYW4gNjRLIHRvdGFsIGVsZW1lbnRzIGNhbiBiZSBzdXBwb3J0ZWQgZXZlbiBvbiBtYWNoaW5lcworICB3aGVyZSBtYWxsb2MoKSBjYW5ub3QgYWxsb2NhdGUgY2h1bmtzIGxhcmdlciB0aGFuIDY0Sy4KKyogVGhlIHJvd3MgZm9ybWluZyBhIGNvbXBvbmVudCBhcnJheSBtYXkgYmUgYWxsb2NhdGVkIGF0IGRpZmZlcmVudCB0aW1lcworICB3aXRob3V0IGV4dHJhIGNvcHlpbmcuICBUaGlzIHRyaWNrIGFsbG93cyBzb21lIHNwZWVkdXBzIGluIHNtb290aGluZyBzdGVwcworICB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSBwcmV2aW91cyBhbmQgbmV4dCByb3dzLgorCitOb3RlIHRoYXQgZWFjaCBjb2xvciBjb21wb25lbnQgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgYXJyYXk7IHdlIGRvbid0IHVzZSB0aGUKK3RyYWRpdGlvbmFsIGxheW91dCBpbiB3aGljaCB0aGUgY29tcG9uZW50cyBvZiBhIHBpeGVsIGFyZSBzdG9yZWQgdG9nZXRoZXIuCitUaGlzIHNpbXBsaWZpZXMgY29kaW5nIG9mIG1vZHVsZXMgdGhhdCB3b3JrIG9uIGVhY2ggY29tcG9uZW50IGluZGVwZW5kZW50bHksCitiZWNhdXNlIHRoZXkgZG9uJ3QgbmVlZCB0byBrbm93IGhvdyBtYW55IGNvbXBvbmVudHMgdGhlcmUgYXJlLiAgRnVydGhlcm1vcmUsCit3ZSBjYW4gcmVhZCBvciB3cml0ZSBlYWNoIGNvbXBvbmVudCB0byBhIHRlbXBvcmFyeSBmaWxlIGluZGVwZW5kZW50bHksIHdoaWNoCitpcyBoZWxwZnVsIHdoZW4gZGVhbGluZyB3aXRoIG5vbmludGVybGVhdmVkIEpQRUcgZmlsZXMuCisKK0luIGdlbmVyYWwsIGEgc3BlY2lmaWMgc2FtcGxlIHZhbHVlIGlzIGFjY2Vzc2VkIGJ5IGNvZGUgc3VjaCBhcworCUdFVEpTQU1QTEUoaW1hZ2VbY29sb3Jjb21wb25lbnRdW3Jvd11bY29sXSkKK3doZXJlIGNvbCBpcyBtZWFzdXJlZCBmcm9tIHRoZSBpbWFnZSBsZWZ0IGVkZ2UsIGJ1dCByb3cgaXMgbWVhc3VyZWQgZnJvbSB0aGUKK2ZpcnN0IHNhbXBsZSByb3cgY3VycmVudGx5IGluIG1lbW9yeS4gIEVpdGhlciBvZiB0aGUgZmlyc3QgdHdvIGluZGV4aW5ncyBjYW4KK2JlIHByZWNvbXB1dGVkIGJ5IGNvcHlpbmcgdGhlIHJlbGV2YW50IHBvaW50ZXIuCisKKworU2luY2UgbW9zdCBpbWFnZS1wcm9jZXNzaW5nIGFwcGxpY2F0aW9ucyBwcmVmZXIgdG8gd29yayBvbiBpbWFnZXMgaW4gd2hpY2gKK3RoZSBjb21wb25lbnRzIG9mIGEgcGl4ZWwgYXJlIHN0b3JlZCB0b2dldGhlciwgdGhlIGRhdGEgcGFzc2VkIHRvIG9yIGZyb20gdGhlCitzdXJyb3VuZGluZyBhcHBsaWNhdGlvbiB1c2VzIHRoZSB0cmFkaXRpb25hbCBjb252ZW50aW9uOiBhIHNpbmdsZSBwaXhlbCBpcworcmVwcmVzZW50ZWQgYnkgTiBjb25zZWN1dGl2ZSBKU0FNUExFIHZhbHVlcywgYW5kIGFuIGltYWdlIHJvdyBpcyBhbiBhcnJheSBvZgorKCMgb2YgY29sb3IgY29tcG9uZW50cykqKGltYWdlIHdpZHRoKSBKU0FNUExFcy4gIE9uZSBvciBtb3JlIHJvd3Mgb2YgZGF0YSBjYW4KK2JlIHJlcHJlc2VudGVkIGJ5IGEgcG9pbnRlciBvZiB0eXBlIEpTQU1QQVJSQVkgaW4gdGhpcyBzY2hlbWUuICBUaGlzIHNjaGVtZSBpcworY29udmVydGVkIHRvIGNvbXBvbmVudC13aXNlIHN0b3JhZ2UgaW5zaWRlIHRoZSBKUEVHIGxpYnJhcnkuICAoQXBwbGljYXRpb25zCit0aGF0IHdhbnQgdG8gc2tpcCBKUEVHIHByZXByb2Nlc3Npbmcgb3IgcG9zdHByb2Nlc3Npbmcgd2lsbCBoYXZlIHRvIGNvbnRlbmQKK3dpdGggY29tcG9uZW50LXdpc2Ugc3RvcmFnZS4pCisKKworQXJyYXlzIG9mIERDVC1jb2VmZmljaWVudCB2YWx1ZXMgdXNlIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmU6CisKKyAgICB0eXBlZGVmIHNob3J0IEpDT0VGOwkJYSAxNi1iaXQgc2lnbmVkIGludGVnZXIKKyAgICB0eXBlZGVmIEpDT0VGIEpCTE9DS1tEQ1RTSVpFMl07CWFuIDh4OCBibG9jayBvZiBjb2VmZmljaWVudHMKKyAgICB0eXBlZGVmIEpCTE9DSyAqSkJMT0NLUk9XOwkJcHRyIHRvIG9uZSBob3Jpem9udGFsIHJvdyBvZiA4eDggYmxvY2tzCisgICAgdHlwZWRlZiBKQkxPQ0tST1cgKkpCTE9DS0FSUkFZOwlwdHIgdG8gYSBsaXN0IG9mIHN1Y2ggcm93cworICAgIHR5cGVkZWYgSkJMT0NLQVJSQVkgKkpCTE9DS0lNQUdFOwlwdHIgdG8gYSBsaXN0IG9mIGNvbG9yIGNvbXBvbmVudCBhcnJheXMKKworVGhlIHVuZGVybHlpbmcgdHlwZSBpcyBhdCBsZWFzdCBhIDE2LWJpdCBzaWduZWQgaW50ZWdlcjsgd2hpbGUgInNob3J0IiBpcyBiaWcKK2Vub3VnaCBvbiBhbGwgbWFjaGluZXMgb2YgaW50ZXJlc3QsIG9uIHNvbWUgbWFjaGluZXMgaXQgaXMgcHJlZmVyYWJsZSB0byB1c2UKKyJpbnQiIGZvciBzcGVlZCByZWFzb25zLCBkZXNwaXRlIHRoZSBzdG9yYWdlIGNvc3QuICBDb2VmZmljaWVudHMgYXJlIGdyb3VwZWQKK2ludG8gOHg4IGJsb2NrcyAoYnV0IHdlIGFsd2F5cyB1c2UgI2RlZmluZXMgRENUU0laRSBhbmQgRENUU0laRTIgcmF0aGVyIHRoYW4KKyI4IiBhbmQgIjY0IikuCisKK1RoZSBjb250ZW50cyBvZiBhIGNvZWZmaWNpZW50IGJsb2NrIG1heSBiZSBpbiBlaXRoZXIgIm5hdHVyYWwiIG9yIHppZ3phZ2dlZAorb3JkZXIsIGFuZCBtYXkgYmUgdHJ1ZSB2YWx1ZXMgb3IgZGl2aWRlZCBieSB0aGUgcXVhbnRpemF0aW9uIGNvZWZmaWNpZW50cywKK2RlcGVuZGluZyBvbiB3aGVyZSB0aGUgYmxvY2sgaXMgaW4gdGhlIHByb2Nlc3NpbmcgcGlwZWxpbmUuICBJbiB0aGUgY3VycmVudAorbGlicmFyeSwgY29lZmZpY2llbnQgYmxvY2tzIGFyZSBrZXB0IGluIG5hdHVyYWwgb3JkZXIgZXZlcnl3aGVyZTsgdGhlIGVudHJvcHkKK2NvZGVjcyB6aWd6YWcgb3IgZGV6aWd6YWcgdGhlIGRhdGEgYXMgaXQgaXMgd3JpdHRlbiBvciByZWFkLiAgVGhlIGJsb2NrcworY29udGFpbiBxdWFudGl6ZWQgY29lZmZpY2llbnRzIGV2ZXJ5d2hlcmUgb3V0c2lkZSB0aGUgRENUL0lEQ1Qgc3Vic3lzdGVtcy4KKyhUaGlzIGxhdHRlciBkZWNpc2lvbiBtYXkgbmVlZCB0byBiZSByZXZpc2l0ZWQgdG8gc3VwcG9ydCB2YXJpYWJsZQorcXVhbnRpemF0aW9uIGEgbGEgSlBFRyBQYXJ0IDMuKQorCitOb3RpY2UgdGhhdCB0aGUgYWxsb2NhdGlvbiB1bml0IGlzIG5vdyBhIHJvdyBvZiA4eDggYmxvY2tzLCBjb3JyZXNwb25kaW5nIHRvCitlaWdodCByb3dzIG9mIHNhbXBsZXMuICBPdGhlcndpc2UgdGhlIHN0cnVjdHVyZSBpcyBtdWNoIHRoZSBzYW1lIGFzIGZvcgorc2FtcGxlcywgYW5kIGZvciB0aGUgc2FtZSByZWFzb25zLgorCitPbiBtYWNoaW5lcyB3aGVyZSBtYWxsb2MoKSBjYW4ndCBoYW5kbGUgYSByZXF1ZXN0IGJpZ2dlciB0aGFuIDY0S2IsIHRoaXMgZGF0YQorc3RydWN0dXJlIGxpbWl0cyB1cyB0byByb3dzIG9mIGxlc3MgdGhhbiA1MTIgSkJMT0NLcywgb3IgYSBwaWN0dXJlIHdpZHRoIG9mCis0MDAwKyBwaXhlbHMuICBUaGlzIHNlZW1zIGFuIGFjY2VwdGFibGUgcmVzdHJpY3Rpb24uCisKKworT24gODB4ODYgbWFjaGluZXMsIHRoZSBib3R0b20tbGV2ZWwgcG9pbnRlciB0eXBlcyAoSlNBTVBST1cgYW5kIEpCTE9DS1JPVykKK211c3QgYmUgZGVjbGFyZWQgYXMgImZhciIgcG9pbnRlcnMsIGJ1dCB0aGUgdXBwZXIgbGV2ZWxzIGNhbiBiZSAibmVhciIKKyhpbXBseWluZyB0aGF0IHRoZSBwb2ludGVyIGxpc3RzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIERTIHNlZ21lbnQpLgorV2UgdXNlIGEgI2RlZmluZSBzeW1ib2wgRkFSLCB3aGljaCBleHBhbmRzIHRvIHRoZSAiZmFyIiBrZXl3b3JkIHdoZW4KK2NvbXBpbGluZyBvbiA4MHg4NiBtYWNoaW5lcyBhbmQgdG8gbm90aGluZyBlbHNld2hlcmUuCisKKworKioqIFN1c3BlbmRhYmxlIHByb2Nlc3NpbmcgKioqCisKK0luIHNvbWUgYXBwbGljYXRpb25zIGl0IGlzIGRlc2lyYWJsZSB0byB1c2UgdGhlIEpQRUcgbGlicmFyeSBhcyBhbgoraW5jcmVtZW50YWwsIG1lbW9yeS10by1tZW1vcnkgZmlsdGVyLiAgSW4gdGhpcyBzaXR1YXRpb24gdGhlIGRhdGEgc291cmNlIG9yCitkZXN0aW5hdGlvbiBtYXkgYmUgYSBsaW1pdGVkLXNpemUgYnVmZmVyLCBhbmQgd2UgY2FuJ3QgcmVseSBvbiBiZWluZyBhYmxlIHRvCitlbXB0eSBvciByZWZpbGwgdGhlIGJ1ZmZlciBhdCBhcmJpdHJhcnkgdGltZXMuICBJbnN0ZWFkIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorbGlrZSB0byBoYXZlIGNvbnRyb2wgcmV0dXJuIGZyb20gdGhlIGxpYnJhcnkgYXQgYnVmZmVyIG92ZXJmbG93L3VuZGVycnVuLCBhbmQKK3RoZW4gcmVzdW1lIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gYXQgYSBsYXRlciB0aW1lLgorCitUaGlzIHNjZW5hcmlvIGlzIHN1cHBvcnRlZCBmb3Igc2ltcGxlIGNhc2VzLiAgKEZvciBhbnl0aGluZyBtb3JlIGNvbXBsZXgsIHdlCityZWNvbW1lbmQgdGhhdCB0aGUgYXBwbGljYXRpb24gImJpdGUgdGhlIGJ1bGxldCIgYW5kIGRldmVsb3AgcmVhbCBtdWx0aXRhc2tpbmcKK2NhcGFiaWxpdHkuKSAgVGhlIGxpYmpwZWcuZG9jIGZpbGUgZ29lcyBpbnRvIG1vcmUgZGV0YWlsIGFib3V0IHRoZSB1c2FnZSBhbmQKK2xpbWl0YXRpb25zIG9mIHRoaXMgY2FwYWJpbGl0eTsgaGVyZSB3ZSBhZGRyZXNzIHRoZSBpbXBsaWNhdGlvbnMgZm9yIGxpYnJhcnkKK3N0cnVjdHVyZS4KKworVGhlIGVzc2VuY2Ugb2YgdGhlIHByb2JsZW0gaXMgdGhhdCB0aGUgZW50cm9weSBjb2RlYyAoY29kZXIgb3IgZGVjb2RlcikgbXVzdAorYmUgcHJlcGFyZWQgdG8gc3RvcCBhdCBhcmJpdHJhcnkgdGltZXMuICBJbiB0dXJuLCB0aGUgY29udHJvbGxlcnMgdGhhdCBjYWxsCit0aGUgZW50cm9weSBjb2RlYyBtdXN0IGJlIGFibGUgdG8gc3RvcCBiZWZvcmUgaGF2aW5nIHByb2R1Y2VkIG9yIGNvbnN1bWVkIGFsbAordGhlIGRhdGEgdGhhdCB0aGV5IG5vcm1hbGx5IHdvdWxkIGhhbmRsZSBpbiBvbmUgY2FsbC4gIFRoYXQgcGFydCBpcyByZWFzb25hYmx5CitzdHJhaWdodGZvcndhcmQ6IHdlIG1ha2UgdGhlIGNvbnRyb2xsZXIgY2FsbCBpbnRlcmZhY2VzIGluY2x1ZGUgInByb2dyZXNzCitjb3VudGVycyIgd2hpY2ggaW5kaWNhdGUgdGhlIG51bWJlciBvZiBkYXRhIGNodW5rcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBhbmQKK3dlIHJlcXVpcmUgY2FsbGVycyB0byB0ZXN0IHRoZSBjb3VudGVyIHJhdGhlciB0aGFuIGp1c3QgYXNzdW1lIGFsbCBvZiB0aGUgZGF0YQord2FzIHByb2Nlc3NlZC4KKworUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHJlc3RhcnQgYXQgYW4gYXJiaXRyYXJ5IHBvaW50LCB0aGUgY3VycmVudCBIdWZmbWFuCitjb2RlY3MgYXJlIGRlc2lnbmVkIHRvIHJlc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBNQ1UgYWZ0ZXIgYQorc3VzcGVuc2lvbiBkdWUgdG8gYnVmZmVyIG92ZXJmbG93L3VuZGVycnVuLiAgQXQgdGhlIHN0YXJ0IG9mIGVhY2ggY2FsbCwgdGhlCitjb2RlYydzIGludGVybmFsIHN0YXRlIGlzIGxvYWRlZCBmcm9tIHBlcm1hbmVudCBzdG9yYWdlIChpbiB0aGUgSlBFRyBvYmplY3QKK3N0cnVjdHVyZXMpIGludG8gbG9jYWwgdmFyaWFibGVzLiAgT24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBNQ1UsIHRoZQorcGVybWFuZW50IHN0YXRlIGlzIHVwZGF0ZWQuICAoVGhpcyBjb3B5aW5nIGlzIG5vdCB2ZXJ5IGV4cGVuc2l2ZSwgYW5kIG1heSBldmVuCitsZWFkIHRvICppbXByb3ZlZCogcGVyZm9ybWFuY2UgaWYgdGhlIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgcmVnaXN0ZXJpemVkLikKK0lmIGEgc3VzcGVuc2lvbiBvY2N1cnMsIHRoZSBjb2RlYyBzaW1wbHkgcmV0dXJucyB3aXRob3V0IHVwZGF0aW5nIHRoZSBzdGF0ZSwKK3RodXMgZWZmZWN0aXZlbHkgcmV2ZXJ0aW5nIHRvIHRoZSBzdGFydCBvZiB0aGUgTUNVLiAgTm90ZSB0aGF0IHRoaXMgaW1wbGllcworbGVhdmluZyBzb21lIGRhdGEgdW5wcm9jZXNzZWQgaW4gdGhlIHNvdXJjZS9kZXN0aW5hdGlvbiBidWZmZXIgKGllLCB0aGUKK2NvbXByZXNzZWQgcGFydGlhbCBNQ1UpLiAgVGhlIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZSBpbnRlcmZhY2VzIGFyZQorc3BlY2lmaWVkIHNvIGFzIHRvIG1ha2UgdGhpcyBwb3NzaWJsZS4gIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQgdGhlIGRhdGEgYnVmZmVyCittdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGEgd29yc3QtY2FzZSBjb21wcmVzc2VkIE1DVTsgYSBjb3VwbGUgdGhvdXNhbmQKK2J5dGVzIHNob3VsZCBiZSBlbm91Z2guCisKK0luIGEgc3VjY2Vzc2l2ZS1hcHByb3hpbWF0aW9uIEFDIHJlZmluZW1lbnQgc2NhbiwgdGhlIHByb2dyZXNzaXZlIEh1ZmZtYW4KK2RlY29kZXIgaGFzIHRvIGJlIGFibGUgdG8gdW5kbyBhc3NpZ25tZW50cyBvZiBuZXdseSBub256ZXJvIGNvZWZmaWNpZW50cyBpZiBpdAorc3VzcGVuZHMgYmVmb3JlIHRoZSBNQ1UgaXMgY29tcGxldGUsIHNpbmNlIGRlY29kaW5nIHJlcXVpcmVzIGRpc3Rpbmd1aXNoaW5nCitwcmV2aW91c2x5LXplcm8gYW5kIHByZXZpb3VzbHktbm9uemVybyBjb2VmZmljaWVudHMuICBUaGlzIGlzIGEgYml0IHRlZGlvdXMKK2J1dCBwcm9iYWJseSB3b24ndCBoYXZlIG11Y2ggZWZmZWN0IG9uIHBlcmZvcm1hbmNlLiAgT3RoZXIgdmFyaWFudHMgb2YgSHVmZm1hbgorZGVjb2RpbmcgbmVlZCBub3Qgd29ycnkgYWJvdXQgdGhpcywgc2luY2UgdGhleSB3aWxsIGp1c3Qgc3RvcmUgdGhlIHNhbWUgdmFsdWVzCithZ2FpbiBpZiBmb3JjZWQgdG8gcmVwZWF0IHRoZSBNQ1UuCisKK1RoaXMgYXBwcm9hY2ggd291bGQgcHJvYmFibHkgbm90IHdvcmsgZm9yIGFuIGFyaXRobWV0aWMgY29kZWMsIHNpbmNlIGl0cworbW9kaWZpYWJsZSBzdGF0ZSBpcyBxdWl0ZSBsYXJnZSBhbmQgY291bGRuJ3QgYmUgY29waWVkIGNoZWFwbHkuICBJbnN0ZWFkIGl0Cit3b3VsZCBoYXZlIHRvIHN1c3BlbmQgYW5kIHJlc3VtZSBleGFjdGx5IGF0IHRoZSBwb2ludCBvZiB0aGUgYnVmZmVyIGVuZC4KKworVGhlIEpQRUcgbWFya2VyIHJlYWRlciBpcyBkZXNpZ25lZCB0byBjb3BlIHdpdGggc3VzcGVuc2lvbiBhdCBhbiBhcmJpdHJhcnkKK3BvaW50LiAgSXQgZG9lcyBzbyBieSBiYWNraW5nIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWFya2VyIHBhcmFtZXRlciBzZWdtZW50LAorc28gdGhlIGRhdGEgYnVmZmVyIG11c3QgYmUgYmlnIGVub3VnaCB0byBob2xkIHRoZSBsYXJnZXN0IG1hcmtlciBvZiBpbnRlcmVzdC4KK0FnYWluLCBhIGNvdXBsZSBLQiBzaG91bGQgYmUgYWRlcXVhdGUuICAoQSBzcGVjaWFsICJza2lwIiBjb252ZW50aW9uIGlzIHVzZWQKK3RvIGJ5cGFzcyBDT00gYW5kIEFQUG4gbWFya2Vycywgc28gdGhlc2UgY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBidWZmZXIgc2l6ZQord2l0aG91dCBjYXVzaW5nIHByb2JsZW1zOyBvdGhlcndpc2UgYSA2NEsgYnVmZmVyIHdvdWxkIGJlIG5lZWRlZCBpbiB0aGUgd29yc3QKK2Nhc2UuKQorCitUaGUgSlBFRyBtYXJrZXIgd3JpdGVyIGN1cnJlbnRseSBkb2VzICpub3QqIGNvcGUgd2l0aCBzdXNwZW5zaW9uLiAgSSBmZWVsIHRoYXQKK3RoaXMgaXMgbm90IG5lY2Vzc2FyeTsgaXQgaXMgbXVjaCBlYXNpZXIgc2ltcGx5IHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCitlbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGJ1ZmZlciBzcGFjZSBiZWZvcmUgc3RhcnRpbmcuICAoQW4gZW1wdHkgMksgYnVmZmVyIGlzCittb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgdGhlIGhlYWRlciBtYXJrZXJzOyBhbmQgZW5zdXJpbmcgdGhlcmUgYXJlIGEgZG96ZW4gb3IKK3R3byBieXRlcyBhdmFpbGFibGUgYmVmb3JlIGNhbGxpbmcganBlZ19maW5pc2hfY29tcHJlc3MoKSB3aWxsIHN1ZmZpY2UgZm9yIHRoZQordHJhaWxlci4pICBUaGlzIHdvdWxkIG5vdCB3b3JrIGZvciB3cml0aW5nIG11bHRpLXNjYW4gSlBFRyBmaWxlcywgYnV0Cit3ZSBzaW1wbHkgZG8gbm90IGludGVuZCB0byBzdXBwb3J0IHRoYXQgY2FwYWJpbGl0eSB3aXRoIHN1c3BlbnNpb24uCisKKworKioqIE1lbW9yeSBtYW5hZ2VyIHNlcnZpY2VzICoqKgorCitUaGUgSlBFRyBsaWJyYXJ5J3MgbWVtb3J5IG1hbmFnZXIgY29udHJvbHMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIG9mCittZW1vcnksIGFuZCBpdCBtYW5hZ2VzIGxhcmdlICJ2aXJ0dWFsIiBkYXRhIGFycmF5cyBvbiBtYWNoaW5lcyB3aGVyZSB0aGUKK29wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB2aXJ0dWFsIG1lbW9yeS4gIE5vdGUgdGhhdCB0aGUgc2FtZQorbWVtb3J5IG1hbmFnZXIgc2VydmVzIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gb3BlcmF0aW9ucy4KKworSW4gYWxsIGNhc2VzLCBhbGxvY2F0ZWQgb2JqZWN0cyBhcmUgdGllZCB0byBhIHBhcnRpY3VsYXIgY29tcHJlc3Npb24gb3IKK2RlY29tcHJlc3Npb24gbWFzdGVyIHJlY29yZCwgYW5kIHRoZXkgd2lsbCBiZSByZWxlYXNlZCB3aGVuIHRoYXQgbWFzdGVyCityZWNvcmQgaXMgZGVzdHJveWVkLgorCitUaGUgbWVtb3J5IG1hbmFnZXIgZG9lcyBub3QgcHJvdmlkZSBleHBsaWNpdCBkZWFsbG9jYXRpb24gb2Ygb2JqZWN0cy4KK0luc3RlYWQsIG9iamVjdHMgYXJlIGNyZWF0ZWQgaW4gInBvb2xzIiBvZiBmcmVlIHN0b3JhZ2UsIGFuZCBhIHdob2xlIHBvb2wKK2NhbiBiZSBmcmVlZCBhdCBvbmNlLiAgVGhpcyBhcHByb2FjaCBoZWxwcyBwcmV2ZW50IHN0b3JhZ2UtbGVhayBidWdzLCBhbmQKK2l0IHNwZWVkcyB1cCBvcGVyYXRpb25zIHdoZW5ldmVyIG1hbGxvYy9mcmVlIGFyZSBzbG93IChhcyB0aGV5IG9mdGVuIGFyZSkuCitUaGUgcG9vbHMgY2FuIGJlIHJlZ2FyZGVkIGFzIGxpZmV0aW1lIGlkZW50aWZpZXJzIGZvciBvYmplY3RzLiAgVHdvCitwb29scy9saWZldGltZXMgYXJlIGRlZmluZWQ6CisgICogSlBPT0xfUEVSTUFORU5UCWxhc3RzIHVudGlsIG1hc3RlciByZWNvcmQgaXMgZGVzdHJveWVkCisgICogSlBPT0xfSU1BR0UJCWxhc3RzIHVudGlsIGRvbmUgd2l0aCBpbWFnZSAoSlBFRyBkYXRhc3RyZWFtKQorUGVybWFuZW50IGxpZmV0aW1lIGlzIHVzZWQgZm9yIHBhcmFtZXRlcnMgYW5kIHRhYmxlcyB0aGF0IHNob3VsZCBiZSBjYXJyaWVkCithY3Jvc3MgZnJvbSBvbmUgZGF0YXN0cmVhbSB0byBhbm90aGVyOyB0aGlzIGluY2x1ZGVzIGFsbCBhcHBsaWNhdGlvbi12aXNpYmxlCitwYXJhbWV0ZXJzLiAgSW1hZ2UgbGlmZXRpbWUgaXMgdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgKEEgdGhpcmQgbGlmZXRpbWUsCitKUE9PTF9QQVNTID0gb25lIHByb2Nlc3NpbmcgcGFzcywgd2FzIG9yaWdpbmFsbHkgcGxhbm5lZC4gIEhvd2V2ZXIgaXQgd2FzCitkcm9wcGVkIGFzIG5vdCBiZWluZyB3b3J0aHdoaWxlLiAgVGhlIGFjdHVhbCB1c2FnZSBwYXR0ZXJucyBhcmUgc3VjaCB0aGF0IHRoZQorcGVhayBtZW1vcnkgdXNhZ2Ugd291bGQgYmUgYWJvdXQgdGhlIHNhbWUgYW55d2F5OyBhbmQgaGF2aW5nIHBlci1wYXNzIHN0b3JhZ2UKK3N1YnN0YW50aWFsbHkgY29tcGxpY2F0ZXMgdGhlIHZpcnR1YWwgbWVtb3J5IGFsbG9jYXRpb24gcnVsZXMgLS0tIHNlZSBiZWxvdy4pCisKK1RoZSBtZW1vcnkgbWFuYWdlciBkZWFscyB3aXRoIHRocmVlIGtpbmRzIG9mIG9iamVjdDoKKzEuICJTbWFsbCIgb2JqZWN0cy4gIFR5cGljYWxseSB0aGVzZSByZXF1aXJlIG5vIG1vcmUgdGhhbiAxMEstMjBLIHRvdGFsLgorMi4gIkxhcmdlIiBvYmplY3RzLiAgVGhlc2UgbWF5IHJlcXVpcmUgdGVucyB0byBodW5kcmVkcyBvZiBLIGRlcGVuZGluZyBvbgorICAgaW1hZ2Ugc2l6ZS4gIFNlbWFudGljYWxseSB0aGV5IGJlaGF2ZSB0aGUgc2FtZSBhcyBzbWFsbCBvYmplY3RzLCBidXQgd2UKKyAgIGRpc3Rpbmd1aXNoIHRoZW0gZm9yIHR3byByZWFzb25zOgorICAgICAqIE9uIE1TLURPUyBtYWNoaW5lcywgbGFyZ2Ugb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCBieSBGQVIgcG9pbnRlcnMsCisgICAgICAgc21hbGwgb2JqZWN0cyBieSBORUFSIHBvaW50ZXJzLgorICAgICAqIFBvb2wgYWxsb2NhdGlvbiBoZXVyaXN0aWNzIG1heSBkaWZmZXIgZm9yIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzLgorICAgTm90ZSB0aGF0IGluZGl2aWR1YWwgImxhcmdlIiBvYmplY3RzIGNhbm5vdCBleGNlZWQgdGhlIHNpemUgYWxsb3dlZCBieQorICAgdHlwZSBzaXplX3QsIHdoaWNoIG1heSBiZSA2NEsgb3IgbGVzcyBvbiBzb21lIG1hY2hpbmVzLgorMy4gIlZpcnR1YWwiIG9iamVjdHMuICBUaGVzZSBhcmUgbGFyZ2UgMi1EIGFycmF5cyBvZiBKU0FNUExFcyBvciBKQkxPQ0tzCisgICAodHlwaWNhbGx5IGxhcmdlIGVub3VnaCBmb3IgdGhlIGVudGlyZSBpbWFnZSBiZWluZyBwcm9jZXNzZWQpLiAgVGhlCisgICBtZW1vcnkgbWFuYWdlciBwcm92aWRlcyBzdHJpcHdpc2UgYWNjZXNzIHRvIHRoZXNlIGFycmF5cy4gIE9uIG1hY2hpbmVzCisgICB3aXRob3V0IHZpcnR1YWwgbWVtb3J5LCB0aGUgcmVzdCBvZiB0aGUgYXJyYXkgbWF5IGJlIHN3YXBwZWQgb3V0IHRvIGEKKyAgIHRlbXBvcmFyeSBmaWxlLgorCisoTm90ZTogSlNBTVBBUlJBWSBhbmQgSkJMT0NLQVJSQVkgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIGxhcmdlCitvYmplY3RzIGZvciB0aGUgZGF0YSBwcm9wZXIgYW5kIHNtYWxsIG9iamVjdHMgZm9yIHRoZSByb3cgcG9pbnRlcnMuICBGb3IKK2NvbnZlbmllbmNlIGFuZCBzcGVlZCwgdGhlIG1lbW9yeSBtYW5hZ2VyIHByb3ZpZGVzIHNpbmdsZSByb3V0aW5lcyB0byBjcmVhdGUKK3RoZXNlIHN0cnVjdHVyZXMuICBTaW1pbGFybHksIHZpcnR1YWwgYXJyYXlzIGluY2x1ZGUgYSBzbWFsbCBjb250cm9sIGJsb2NrCithbmQgYSBKU0FNUEFSUkFZIG9yIEpCTE9DS0FSUkFZIHdvcmtpbmcgYnVmZmVyLCBhbGwgY3JlYXRlZCB3aXRoIG9uZSBjYWxsLikKKworSW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24sIHZpcnR1YWwgYXJyYXlzIGFyZSBvbmx5IHBlcm1pdHRlZCB0byBoYXZlIGltYWdlCitsaWZlc3Bhbi4gIChQZXJtYW5lbnQgbGlmZXNwYW4gd291bGQgbm90IGJlIHJlYXNvbmFibGUsIGFuZCBwYXNzIGxpZmVzcGFuIGlzCitub3QgdmVyeSB1c2VmdWwgc2luY2UgYSB2aXJ0dWFsIGFycmF5J3MgcmFpc29uIGQnZXRyZSBpcyB0byBzdG9yZSBkYXRhIGZvcgorbXVsdGlwbGUgcGFzc2VzIHRocm91Z2ggdGhlIGltYWdlLikgIFdlIGFsc28gZXhwZWN0IHRoYXQgb25seSAic21hbGwiIG9iamVjdHMKK3dpbGwgYmUgZ2l2ZW4gcGVybWFuZW50IGxpZmVzcGFuLCB0aG91Z2ggdGhpcyByZXN0cmljdGlvbiBpcyBub3QgcmVxdWlyZWQgYnkKK3RoZSBtZW1vcnkgbWFuYWdlci4KKworSW4gYSBub24tdmlydHVhbC1tZW1vcnkgbWFjaGluZSwgc29tZSBwZXJmb3JtYW5jZSBiZW5lZml0IGNhbiBiZSBnYWluZWQgYnkKK21ha2luZyB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yIHZpcnR1YWwgYXJyYXlzIGJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlLgorKEZvciBzbWFsbCBpbWFnZXMsIHRoZSBidWZmZXJzIG1pZ2h0IGZpdCBlbnRpcmVseSBpbiBtZW1vcnksIHNvIGJsaW5kCitzd2FwcGluZyB3b3VsZCBiZSB2ZXJ5IHdhc3RlZnVsLikgIFRoZSBtZW1vcnkgbWFuYWdlciB3aWxsIGFkanVzdCB0aGUgaGVpZ2h0CitvZiB0aGUgYnVmZmVycyB0byBmaXQgd2l0aGluIGEgcHJlc3BlY2lmaWVkIG1heGltdW0gbWVtb3J5IHVzYWdlLiAgSW4gb3JkZXIKK3RvIGRvIHRoaXMgaW4gYSByZWFzb25hYmx5IG9wdGltYWwgZmFzaGlvbiwgdGhlIG1hbmFnZXIgbmVlZHMgdG8gYWxsb2NhdGUgYWxsCitvZiB0aGUgdmlydHVhbCBhcnJheXMgYXQgb25jZS4gIFRoZXJlZm9yZSwgdGhlcmUgaXNuJ3QgYSBvbmUtc3RlcCBhbGxvY2F0aW9uCityb3V0aW5lIGZvciB2aXJ0dWFsIGFycmF5czsgaW5zdGVhZCwgdGhlcmUgaXMgYSAicmVxdWVzdCIgcm91dGluZSB0aGF0IHNpbXBseQorYWxsb2NhdGVzIHRoZSBjb250cm9sIGJsb2NrLCBhbmQgYSAicmVhbGl6ZSIgcm91dGluZSAoY2FsbGVkIGp1c3Qgb25jZSkgdGhhdAorZGV0ZXJtaW5lcyBzcGFjZSBhbGxvY2F0aW9uIGFuZCBjcmVhdGVzIGFsbCBvZiB0aGUgYWN0dWFsIGJ1ZmZlcnMuICBUaGUKK3JlYWxpemUgcm91dGluZSBtdXN0IGFsbG93IGZvciBzcGFjZSBvY2N1cGllZCBieSBub24tdmlydHVhbCBsYXJnZSBvYmplY3RzLgorKFdlIGRvbid0IGJvdGhlciB0byBmYWN0b3IgaW4gdGhlIHNwYWNlIG5lZWRlZCBmb3Igc21hbGwgb2JqZWN0cywgb24gdGhlCitncm91bmRzIHRoYXQgaXQgaXNuJ3Qgd29ydGggdGhlIHRyb3VibGUuKQorCitUbyBzdXBwb3J0IGFsbCB0aGlzLCB3ZSBlc3RhYmxpc2ggdGhlIGZvbGxvd2luZyBwcm90b2NvbCBmb3IgZG9pbmcgYnVzaW5lc3MKK3dpdGggdGhlIG1lbW9yeSBtYW5hZ2VyOgorICAxLiBNb2R1bGVzIG11c3QgcmVxdWVzdCB2aXJ0dWFsIGFycmF5cyAod2hpY2ggbWF5IGhhdmUgb25seSBpbWFnZSBsaWZlc3BhbikKKyAgICAgZHVyaW5nIHRoZSBpbml0aWFsIHNldHVwIHBoYXNlLCBpLmUuLCBpbiB0aGVpciBqaW5pdF94eHggcm91dGluZXMuCisgIDIuIEFsbCAibGFyZ2UiIG9iamVjdHMgKGluY2x1ZGluZyBKU0FNUEFSUkFZcyBhbmQgSkJMT0NLQVJSQVlzKSBtdXN0IGFsc28gYmUKKyAgICAgYWxsb2NhdGVkIGR1cmluZyBpbml0aWFsIHNldHVwLgorICAzLiByZWFsaXplX3ZpcnRfYXJyYXlzIHdpbGwgYmUgY2FsbGVkIGF0IHRoZSBjb21wbGV0aW9uIG9mIGluaXRpYWwgc2V0dXAuCisgICAgIFRoZSBhYm92ZSBjb252ZW50aW9ucyBlbnN1cmUgdGhhdCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQorICAgICBmb3IgaXQgdG8gY2hvb3NlIGEgZ29vZCBzaXplIGZvciB2aXJ0dWFsIGFycmF5IGJ1ZmZlcnMuCitTbWFsbCBvYmplY3RzIG9mIGFueSBsaWZlc3BhbiBtYXkgYmUgYWxsb2NhdGVkIGF0IGFueSB0aW1lLiAgV2UgZXhwZWN0IHRoYXQKK3RoZSB0b3RhbCBzcGFjZSB1c2VkIGZvciBzbWFsbCBvYmplY3RzIHdpbGwgYmUgc21hbGwgZW5vdWdoIHRvIGJlIG5lZ2xpZ2libGUKK2luIHRoZSByZWFsaXplX3ZpcnRfYXJyYXlzIGNvbXB1dGF0aW9uLgorCitJbiBhIHZpcnR1YWwtbWVtb3J5IG1hY2hpbmUsIHdlIHNpbXBseSBwcmV0ZW5kIHRoYXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcworaW5maW5pdGUsIHRodXMgY2F1c2luZyByZWFsaXplX3ZpcnRfYXJyYXlzIHRvIGRlY2lkZSB0aGF0IGl0IGNhbiBhbGxvY2F0ZSBhbGwKK3RoZSB2aXJ0dWFsIGFycmF5cyBhcyBmdWxsLXNpemUgaW4tbWVtb3J5IGJ1ZmZlcnMuICBUaGUgb3ZlcmhlYWQgb2YgdGhlCit2aXJ0dWFsLWFycmF5IGFjY2VzcyBwcm90b2NvbCBpcyB2ZXJ5IHNtYWxsIHdoZW4gbm8gc3dhcHBpbmcgb2NjdXJzLgorCitBIHZpcnR1YWwgYXJyYXkgY2FuIGJlIHNwZWNpZmllZCB0byBiZSAicHJlLXplcm9lZCI7IHdoZW4gdGhpcyBmbGFnIGlzIHNldCwKK25ldmVyLXlldC13cml0dGVuIHNlY3Rpb25zIG9mIHRoZSBhcnJheSBhcmUgc2V0IHRvIHplcm8gYmVmb3JlIGJlaW5nIG1hZGUKK2F2YWlsYWJsZSB0byB0aGUgY2FsbGVyLiAgSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5ldmVyLXdyaXR0ZW4gc2VjdGlvbnMKK29mIHRoZSBhcnJheSBjb250YWluIGdhcmJhZ2UuICAoVGhpcyBmZWF0dXJlIGV4aXN0cyBwcmltYXJpbHkgYmVjYXVzZSB0aGUKK2VxdWl2YWxlbnQgbG9naWMgd291bGQgb3RoZXJ3aXNlIGJlIG5lZWRlZCBpbiBqZGNvZWZjdC5jIGZvciBwcm9ncmVzc2l2ZQorSlBFRyBtb2RlOyB3ZSBtYXkgYXMgd2VsbCBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgcG9zc2libGUgb3RoZXIgdXNlcy4pCisKK1RoZSBmaXJzdCB3cml0ZSBwYXNzIG9uIGEgdmlydHVhbCBhcnJheSBpcyByZXF1aXJlZCB0byBvY2N1ciBpbiB0b3AtdG8tYm90dG9tCitvcmRlcjsgcmVhZCBwYXNzZXMsIGFzIHdlbGwgYXMgYW55IHdyaXRlIHBhc3NlcyBhZnRlciB0aGUgZmlyc3Qgb25lLCBtYXkKK2FjY2VzcyB0aGUgYXJyYXkgaW4gYW55IG9yZGVyLiAgVGhpcyByZXN0cmljdGlvbiBleGlzdHMgcGFydGx5IHRvIHNpbXBsaWZ5Cit0aGUgdmlydHVhbCBhcnJheSBjb250cm9sIGxvZ2ljLCBhbmQgcGFydGx5IGJlY2F1c2Ugc29tZSBmaWxlIHN5c3RlbXMgbWF5IG5vdAorc3VwcG9ydCBzZWVraW5nIGJleW9uZCB0aGUgY3VycmVudCBlbmQtb2YtZmlsZSBpbiBhIHRlbXBvcmFyeSBmaWxlLiAgVGhlIG1haW4KK2ltcGxpY2F0aW9uIG9mIHRoaXMgcmVzdHJpY3Rpb24gaXMgdGhhdCByZWFycmFuZ2VtZW50IG9mIHJvd3MgKHN1Y2ggYXMKK2NvbnZlcnRpbmcgdG9wLXRvLWJvdHRvbSBkYXRhIG9yZGVyIHRvIGJvdHRvbS10by10b3ApIG11c3QgYmUgaGFuZGxlZCB3aGlsZQorcmVhZGluZyBkYXRhIG91dCBvZiB0aGUgdmlydHVhbCBhcnJheSwgbm90IHdoaWxlIHB1dHRpbmcgaXQgaW4uCisKKworKioqIE1lbW9yeSBtYW5hZ2VyIGludGVybmFsIHN0cnVjdHVyZSAqKioKKworVG8gaXNvbGF0ZSBzeXN0ZW0gZGVwZW5kZW5jaWVzIGFzIG11Y2ggYXMgcG9zc2libGUsIHdlIGhhdmUgYnJva2VuIHRoZQorbWVtb3J5IG1hbmFnZXIgaW50byB0d28gcGFydHMuICBUaGVyZSBpcyBhIHJlYXNvbmFibHkgc3lzdGVtLWluZGVwZW5kZW50CisiZnJvbnQgZW5kIiAoam1lbW1nci5jKSBhbmQgYSAiYmFjayBlbmQiIHRoYXQgY29udGFpbnMgb25seSB0aGUgY29kZQorbGlrZWx5IHRvIGNoYW5nZSBhY3Jvc3Mgc3lzdGVtcy4gIEFsbCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgbWV0aG9kcworb3V0bGluZWQgYWJvdmUgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBmcm9udCBlbmQuICBUaGUgYmFjayBlbmQgcHJvdmlkZXMKK3RoZSBmb2xsb3dpbmcgcm91dGluZXMgZm9yIHVzZSBieSB0aGUgZnJvbnQgZW5kIChub25lIG9mIHRoZXNlIHJvdXRpbmVzCithcmUga25vd24gdG8gdGhlIHJlc3Qgb2YgdGhlIEpQRUcgY29kZSk6CisKK2pwZWdfbWVtX2luaXQsIGpwZWdfbWVtX3Rlcm0Jc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbi9zaHV0ZG93bgorCitqcGVnX2dldF9zbWFsbCwganBlZ19mcmVlX3NtYWxsCWludGVyZmFjZSB0byBtYWxsb2MgYW5kIGZyZWUgbGlicmFyeSByb3V0aW5lcworCQkJCShvciB0aGVpciBlcXVpdmFsZW50cykKKworanBlZ19nZXRfbGFyZ2UsIGpwZWdfZnJlZV9sYXJnZQlpbnRlcmZhY2UgdG8gRkFSIG1hbGxvYy9mcmVlIGluIE1TRE9TIG1hY2hpbmVzOworCQkJCWVsc2UgdXN1YWxseSB0aGUgc2FtZSBhcworCQkJCWpwZWdfZ2V0X3NtYWxsL2pwZWdfZnJlZV9zbWFsbAorCitqcGVnX21lbV9hdmFpbGFibGUJCWVzdGltYXRlIGF2YWlsYWJsZSBtZW1vcnkKKworanBlZ19vcGVuX2JhY2tpbmdfc3RvcmUJCWNyZWF0ZSBhIGJhY2tpbmctc3RvcmUgb2JqZWN0CisKK3JlYWRfYmFja2luZ19zdG9yZSwJCW1hbmlwdWxhdGUgYSBiYWNraW5nLXN0b3JlIG9iamVjdAord3JpdGVfYmFja2luZ19zdG9yZSwKK2Nsb3NlX2JhY2tpbmdfc3RvcmUKKworT24gc29tZSBzeXN0ZW1zIHRoZXJlIHdpbGwgYmUgbW9yZSB0aGFuIG9uZSB0eXBlIG9mIGJhY2tpbmctc3RvcmUgb2JqZWN0Cisoc3BlY2lmaWNhbGx5LCBpbiBNUy1ET1MgYSBiYWNraW5nIHN0b3JlIGZpbGUgbWlnaHQgYmUgYW4gYXJlYSBvZiBleHRlbmRlZAorbWVtb3J5IGFzIHdlbGwgYXMgYSBkaXNrIGZpbGUpLiAganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgaXMgcmVzcG9uc2libGUgZm9yCitjaG9vc2luZyBob3cgdG8gaW1wbGVtZW50IGEgZ2l2ZW4gb2JqZWN0LiAgVGhlIHJlYWQvd3JpdGUvY2xvc2Ugcm91dGluZXMKK2FyZSBtZXRob2QgcG9pbnRlcnMgaW4gdGhlIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBhIGdpdmVuIG9iamVjdDsgdGhpcworbGV0cyB0aGVtIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IG9iamVjdCB0eXBlcy4KKworSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCBiYWNraW5nIHN0b3JlIG9iamVjdHMgYXJlIGV4cGxpY2l0bHkKK3JlbGVhc2VkIHVwb24gYWJub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4gIEZvciBleGFtcGxlLCBNUy1ET1Mgd29uJ3QgZnJlZQorZXh0ZW5kZWQgbWVtb3J5IGJ5IGl0c2VsZi4gIFRvIHN1cHBvcnQgdGhpcywgd2Ugd2lsbCBleHBlY3QgdGhlIG1haW4gcHJvZ3JhbQorb3Igc3Vycm91bmRpbmcgYXBwbGljYXRpb24gdG8gYXJyYW5nZSB0byBjYWxsIHNlbGZfZGVzdHJ1Y3QgKHR5cGljYWxseSB2aWEKK2pwZWdfZGVzdHJveSkgdXBvbiBhYm5vcm1hbCB0ZXJtaW5hdGlvbi4gIFRoaXMgbWF5IHJlcXVpcmUgYSBTSUdJTlQgc2lnbmFsCitoYW5kbGVyIG9yIGVxdWl2YWxlbnQuICBXZSBkb24ndCB3YW50IHRvIGhhdmUgdGhlIGJhY2sgZW5kIG1vZHVsZSBpbnN0YWxsIGl0cworb3duIHNpZ25hbCBoYW5kbGVyLCBiZWNhdXNlIHRoYXQgd291bGQgcHJlLWVtcHQgdGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uJ3MKK2FiaWxpdHkgdG8gY29udHJvbCBzaWduYWwgaGFuZGxpbmcuCisKK1RoZSBJSkcgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIHNldmVyYWwgbWVtb3J5IG1hbmFnZXIgYmFjayBlbmQgaW1wbGVtZW50YXRpb25zLgorVXN1YWxseSB0aGUgc2FtZSBiYWNrIGVuZCBzaG91bGQgYmUgc3VpdGFibGUgZm9yIGFsbCBhcHBsaWNhdGlvbnMgb24gYSBnaXZlbgorc3lzdGVtLCBidXQgaXQgaXMgcG9zc2libGUgZm9yIGFuIGFwcGxpY2F0aW9uIHRvIHN1cHBseSBpdHMgb3duIGJhY2sgZW5kIGF0CituZWVkLgorCisKKyoqKiBJbXBsaWNhdGlvbnMgb2YgRE5MIG1hcmtlciAqKioKKworU29tZSBKUEVHIGZpbGVzIG1heSB1c2UgYSBETkwgbWFya2VyIHRvIHBvc3Rwb25lIGRlZmluaXRpb24gb2YgdGhlIGltYWdlCitoZWlnaHQgKHRoaXMgd291bGQgYmUgdXNlZnVsIGZvciBhIGZheC1saWtlIHNjYW5uZXIncyBvdXRwdXQsIGZvciBpbnN0YW5jZSkuCitJbiB0aGVzZSBmaWxlcyB0aGUgU09GIG1hcmtlciBjbGFpbXMgdGhlIGltYWdlIGhlaWdodCBpcyAwLCBhbmQgeW91IG9ubHkKK2ZpbmQgb3V0IHRoZSB0cnVlIGltYWdlIGhlaWdodCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzY2FuLgorCitXZSBjb3VsZCByZWFkIHRoZXNlIGZpbGVzIGFzIGZvbGxvd3M6CisxLiBVcG9uIHNlZWluZyB6ZXJvIGltYWdlIGhlaWdodCwgcmVwbGFjZSBpdCBieSA2NTUzNSAodGhlIG1heGltdW0gYWxsb3dlZCkuCisyLiBXaGVuIHRoZSBETkwgaXMgZm91bmQsIHVwZGF0ZSB0aGUgaW1hZ2UgaGVpZ2h0IGluIHRoZSBnbG9iYWwgaW1hZ2UKKyAgIGRlc2NyaXB0b3IuCitUaGlzIGltcGxpZXMgdGhhdCBjb250cm9sIG1vZHVsZXMgbXVzdCBhdm9pZCBtYWtpbmcgY29waWVzIG9mIHRoZSBpbWFnZQoraGVpZ2h0LCBhbmQgbXVzdCByZS10ZXN0IGZvciB0ZXJtaW5hdGlvbiBhZnRlciBlYWNoIE1DVSByb3cuICBUaGlzIHdvdWxkCitiZSBlYXN5IGVub3VnaCB0byBkby4KKworSW4gY2FzZXMgd2hlcmUgaW1hZ2Utc2l6ZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCwgdGhpcyBhcHByb2FjaCB3aWxsCityZXN1bHQgaW4gdmVyeSBpbmVmZmljaWVudCB1c2Ugb2YgdmlydHVhbCBtZW1vcnkgb3IgbXVjaC1sYXJnZXItdGhhbi1uZWNlc3NhcnkKK3RlbXBvcmFyeSBmaWxlcy4gIFRoaXMgc2VlbXMgYWNjZXB0YWJsZSBmb3Igc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd29uJ3QgYmUgYQorbWFpbnN0cmVhbSB1c2FnZS4gIFBlb3BsZSBtaWdodCBoYXZlIHRvIGZvcmdvIHVzZSBvZiBtZW1vcnktaG9nZ2luZyBvcHRpb25zCisoc3VjaCBhcyB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gb3Igbm9uaW50ZXJsZWF2ZWQgSlBFRyBmaWxlcykgaWYgdGhleQord2FudCBlZmZpY2llbnQgY29udmVyc2lvbiBvZiBzdWNoIGZpbGVzLiAgKE9uZSBjb3VsZCBpbXByb3ZlIGVmZmljaWVuY3kgYnkKK2RlbWFuZGluZyBhIHVzZXItc3VwcGxpZWQgdXBwZXIgYm91bmQgZm9yIHRoZSBoZWlnaHQsIGxlc3MgdGhhbiA2NTUzNjsgaW4gbW9zdAorY2FzZXMgaXQgY291bGQgYmUgbXVjaCBsZXNzLikKKworVGhlIHN0YW5kYXJkIGFsc28gcGVybWl0cyB0aGUgU09GIG1hcmtlciB0byBvdmVyZXN0aW1hdGUgdGhlIGltYWdlIGhlaWdodCwKK3dpdGggYSBETkwgdG8gZ2l2ZSB0aGUgdHJ1ZSwgc21hbGxlciBoZWlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3Qgc2Nhbi4KK1RoaXMgd291bGQgc29sdmUgdGhlIHNwYWNlIHByb2JsZW1zIGlmIHRoZSBvdmVyZXN0aW1hdGUgd2Fzbid0IHRvbyBncmVhdC4KK0hvd2V2ZXIsIGl0IGltcGxpZXMgdGhhdCB5b3UgZG9uJ3QgZXZlbiBrbm93IHdoZXRoZXIgRE5MIHdpbGwgYmUgdXNlZC4KKworVGhpcyBsZWFkcyB0byBhIGNvdXBsZSBvZiB2ZXJ5IHNlcmlvdXMgb2JqZWN0aW9uczoKKzEuIFRlc3RpbmcgZm9yIGEgRE5MIG1hcmtlciBtdXN0IG9jY3VyIGluIHRoZSBpbm5lciBsb29wIG9mIHRoZSBkZWNvbXByZXNzb3IncworICAgSHVmZm1hbiBkZWNvZGVyOyB0aGlzIGltcGxpZXMgYSBzcGVlZCBwZW5hbHR5IHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgdXNlZAorICAgb3Igbm90LgorMi4gVGhlcmUgaXMgbm8gd2F5IHRvIGhpZGUgdGhlIGxhc3QtbWludXRlIGNoYW5nZSBpbiBpbWFnZSBoZWlnaHQgZnJvbSBhbgorICAgYXBwbGljYXRpb24gdXNpbmcgdGhlIGRlY29kZXIuICBUaHVzICpldmVyeSogYXBwbGljYXRpb24gdXNpbmcgdGhlIElKRworICAgbGlicmFyeSB3b3VsZCBzdWZmZXIgYSBjb21wbGV4aXR5IHBlbmFsdHkgd2hldGhlciBpdCBjYXJlZCBhYm91dCBETkwgb3IKKyAgIG5vdC4KK1dlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBETkwgYmVjYXVzZSBvZiB0aGVzZSBwcm9ibGVtcy4KKworQSBkaWZmZXJlbnQgYXBwcm9hY2ggaXMgdG8gaW5zaXN0IHRoYXQgRE5MLXVzaW5nIGZpbGVzIGJlIHByZXByb2Nlc3NlZCBieSBhCitzZXBhcmF0ZSBwcm9ncmFtIHRoYXQgcmVhZHMgYWhlYWQgdG8gdGhlIEROTCwgdGhlbiBnb2VzIGJhY2sgYW5kIGZpeGVzIHRoZSBTT0YKK21hcmtlci4gIFRoaXMgaXMgYSBtdWNoIHNpbXBsZXIgc29sdXRpb24gYW5kIGlzIHByb2JhYmx5IGZhciBtb3JlIGVmZmljaWVudC4KK0V2ZW4gaWYgb25lIHdhbnRzIHBpcGVkIGlucHV0LCBidWZmZXJpbmcgdGhlIGZpcnN0IHNjYW4gb2YgdGhlIEpQRUcgZmlsZSBuZWVkcworYSBsb3Qgc21hbGxlciB0ZW1wIGZpbGUgdGhhbiBpcyBpbXBsaWVkIGJ5IHRoZSBtYXhpbXVtLWhlaWdodCBtZXRob2QuICBGb3IKK3RoaXMgYXBwcm9hY2ggd2UnZCBzaW1wbHkgdHJlYXQgRE5MIGFzIGEgbm8tb3AgaW4gdGhlIGRlY29tcHJlc3NvciAoYXQgbW9zdCwKK2NoZWNrIHRoYXQgaXQgbWF0Y2hlcyB0aGUgU09GIGltYWdlIGhlaWdodCkuCisKK1dlIHdpbGwgbm90IHdvcnJ5IGFib3V0IG1ha2luZyB0aGUgY29tcHJlc3NvciBjYXBhYmxlIG9mIG91dHB1dHRpbmcgRE5MLgorU29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIGZpcnN0IHNjaGVtZSBhYm92ZSBjb3VsZCBiZSBhcHBsaWVkIGlmIGFueW9uZSBldmVyCit3YW50cyB0byBtYWtlIHRoYXQgd29yay4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLmJtcCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLmJtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAzZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3RpbWcuYm1wCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLmpwZyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLmpwZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzRjYTVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3RpbWcuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLnBwbSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1nLnBwbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDgxY2UyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3RpbWcucHBtCkBAIC0wLDAgKzEsNCBAQAorUDYKKzIyNyAxNDkKKzI1NQorMC8tMC8tMTAuMjEvNTEuNTEuNjIvNjIvODMvODMvOjMtOjMtOjMtOjMtOjMtOjMtOjIvOTEuOTEuODAtODAtOTEuOTEuOjIvODAtODAtODAtODAtODAtODAtODAtODAtNi4rNi4rNi4rNS0qNS0qNCwpNCwpNCwpNCwpNCwpNCwpNCwpNCwpNCwpNCwpMi0pLyokLywlLywlMC0mMS4nMi8oMzApMzApNjMsNjMsNzQtODUuODUuOTYvOjcwOjcuQTowQjwwRD4yRkA0SUE0SkI1S0M2S0M2TUQ1TUQ1T0MzTkIyT0MzT0MzUEQ0UkU1Uj8xWT8yYkA0bkI1fUU2i0g4mUc5o0Y3r0c6uEc5vkU6xUc7x0c+ykc/y0hA0EVA50ZM7UNM60RL60VJ7kNJ70JE8T5C9D1B+DtB9zpA9Do/8Dw/6T9A4kA+1z88y0E3uz0vtUAutUAutD8ttD8ts0Atsj8tr0AtrUAsqkEspkEtokIsn0Aqm0EpmEAqlkEslD4tkj8vkj8vkT4ukT4skD0rkjwrkjwrlD8rlD8rlD0qlD0qlD0qlT4rlj8slkAvlj82lT41lz0ynz8xqUIzs0QzvEQ0v0Q0uT8wtUEyrEY4nkg7h0g5b0EyVDgqQzMmPTUyOTU0OTU0NzMyNzExNjAwNTAtNTAtNzIvNzIvNzIvNjEuNjEtNTAsNTAsNDEsLy8tLjAtLy8tLy8tMC8tMC8tMi4tMi4tNSwtNCssNCorMykqNygrPS4xRTY5UDo8akJDfElIjU1NlU9Pn1dbqmRuqm+Dn3SQlHujh3+ugIa6foi9c3mtYGGRVEt2UERoU0pnT0deTUheVFFiZmRvfH2CjZGQmZ6Yo6mfoqianqCTj5KBe3xsZmdVWFdFUU5FVVJbVVFiVVFiMC8tMC8tMTAuMTAuNDAtNTEuNjIvNjIvODMvODMvOjMtOjMtOjMtOjMtOjMtOjMtOTEuOTEuODAtODAtODAtODAtOTEuOTEuODAtODAtODAtODAtODAtODAtODAtODAtNi4rNi4rNS0qNS0qNS0qNCwpNCwpNCwpNS0qNS0qNS0qNS0qNS0qNS0qNS0qMy4qMCslMC0mMC0mMS4nMi8oMzApNDEqNDEqNjMsNjMsNzQtNzQtODUuOTYvOjcwOjcuQDkvQTsvQz0xRT8zSEAzSUE0SkI1SkI1TEM0TEM0TUExTUExTUExTkIyT0MzUUQ0UD4wVT8xXkEzakM0eEQ2hEU0kkU1nEMzp0M0r0E0tUE0vEI3wEQ6xEU8xUY9zUNA4UVJ50JJ6ENJ6kRI7URH70JE80BD9j9D+DtB9zpA9Do/8Dw/6T9A4EE+1UA8ykA2uT4vtUAutD8ttD8ttD8tsj8ssD8tr0AtrUAsqUArpkEtoUErn0Aqm0EpmEAqlkEslD4tkj8vkT4ukT4ukT4skD0rkjwrkjwrlD8rkz4qlD0qlD0qlD0qlT4rlj8slkAvlEA1lT41mD4zoD4xq0EztUQ0vUM0v0Q1u0Eyt0M2rEY4nEk7hUc6bEAzUzkqQjQpPjYzOjY1OTU0ODQzODIyNzExNjEuNjEuNzIvNzIvNzIvNjEuNjEtNTAsNTAsNDEsLy8tLjAtLy8tLy8tMC8tMC8tMi4tMi4tMy0tNSwtNCorMykqNSkrPC0wQzQ3Tjg6ZD49dkVBhkpJj05MmlRWpGFqpWx9nXKOkXuihoCuf4W5e4S7b3WpW1uNUUh1T0NpT0ZlT0dfUEhfUk5fW1lmbm90g4eIlJmVmZ6XmqCUmZ2Pj5GDfn9vamtZXVtMVlNKWFNaVlJhWFFhLy4sLy4sMC8tMTAuNDAtNDAtNTEuNTEuNzIuNzIuNzIuNzIuOTIsOTIsOTIsOTIsOTEuODAuNy8tNy8tNy8tNy8tODAuOTEvODAuODAuODAuODAuODAuODAuODAuODAuNi4sNS0rNS0rNS0rNCwqNCwqNCwqNCwqNS0rNS0rNS0rNS0rNS0rNS0rNS0rMy4qMi0nMS4nMi8oMzApMzApNDEqNDEqNTIrNjMsNjMsNjMsNzQtODUuOTYvOTYvOjcuPzguQDouQjwwRD4yRz80SEA1SEAzSEAzSUAxSUAxSz8xSz8xSz8vTEAwTUExTkIyTUExUUExWUIyZEMycUMzfEMyh0IykkEwmDwtoDorpzsurz0ytUA2ukQ6v0Y9xUQ+2UNF4UBG40JH50JG6kRG8ENF9EFE+D9E+jtA+To/9TtA8D1A6EBA3EE90UA7xkA1tz0us0Ats0Atsj8ssj8tsD8trz4srUAsqj8tp0AtpUAsoUErnUEsmj8qmEAqlUArlD4tkT4ukT4ukT4ukD0rkD0rkD0rkD0rkT4skT4skjwrkjwrkz0skz0slD8rlT8ulUE2lj81mj4zoz4yr0E0uUM1v0Q1wUM1wEQ4uEY7rkk9mUo9gUc7aEA0UTosQjUsPzc0PTc3PDY2OjQ0OTQxODMwNzIvNzIvNjIvNjIvNjIvNTEuNTItNDEsNDEsMjEsLjAtLDEtLjAtLjAtLy8tLy8tMC8tMi4tNS8vNC4uNSwtNCorNCorOS0vPjI0STU2Wzk3bD85fEVAhklEkE9NmFtgm2Z2lG2IjHeeg32tfYK5dX63Zm2kVFaJTUV2TEFrTUFlT0ZjUUhjTUheTktcW1tlcXR5hYmIh4yGio+IjZCFhop8eHpsZmlYWltNVlNMWlVbWlRgW1NgLi0rLy4sLy4sMC8tMy8sNDAtNDAtNDAtNjEtNjEtNjEtNjEtODErODErODErODErNy8tNy8tNi4sNi4sNi4sNi4sNy8tNy8tODAuODAuODAuODAuODAuODAuODAuODAuNS0rNS0rNS0rNCwqNCwqNCwqMyspMyspNi4sNi4sNi4sNi4sNi4sNi4sNi4sNC8sMzArMzApMzApNDEqNDEqNTIrNTIrNTIrNTIrNTIrNjMsNzQtODUuODUuOTYvOTYtPjctPzktQDouQjwwRT0yRT0yRj4xRj4xRz0xRz4vSDwuST0vST0vSj4uTEAwSkEwS0QyTkU0VUQ0XkQzaUQyc0IxfkEvhj8tjDkplDknnTkqozwtrEAzs0U4uEg8wUY+0kRD2kFD3kJD4kRD50NE7EJD80BD9z9B+jtA+To/9TtA7j5A5UFA2kI9zUA5wkAztT0tsEAssEAssEAsrz4srj8srj8srD8rqUAtpj8so0AroEAqnEArmEAqlkAplD8qkT4skT4ukT4ukD0tkD0rkD0rjzwqjzwqkD0rkD0rjzwqjzwqkjwrkT4slD4tkj8tlUE2lj81nD4ypkA0skI2vEM4wUM3wkI3wkY8uko/rExAl0s+fEY6YkA0TDouQTctQDg1Pjk2PTc3PDc0OjUyOTQxODMwODMwNjIvNjIvNjIvMzIuNTItMjEsMjEsMTItLTIuLTIuLzEuLzEuMDAuMDAuMTAuMTAuNTEwNjAwNS8vNSwtNCssNiwtOjAxRDIyVDcxYzszcUE3e0U7gkhEiVJVjV9si2mCg3OYfXmreH21b3e1YGaiUVKLTEV5TEBwTEBoUEVnUUZmTENeR0JWTUxaXl5mam5xdXl4eH13eoB2d3pva29hYGJUV1lMVFRMXVdZXVZdXVZeLS0tLS0tLi0rLy4sMC8tMTAuMy8sNDAtMy8sMy8sNC8rNC8rNC8rNC8rNi8pNi8pNC8sNC8sMy4rMy4rMy4rMy4rNC8sNC8sNTAtNTAtNTAtNTAtNTAtNTAtNTAtNTAtMy4rMy4rMi0qMi0qMi0qMSwpMSwpMSwpNC8sNC8sNC8sNC8sNC8sNC8sNC8sNC8sNDEsNDEsNDEsNDEsNDEsNTItNTItNTItNTItNTItNjMuNjMuNzQvODUwOTYxOTYvPDUtPTYsPzguQDkvQjovQzswQzswQzsuRDouRDouRjouRzstSDwuST0vSj4wSUAxSkc2TUg1Ukc1WUY1YkUzakQxdUIvfT4sgjspizopkzoqmj0so0IyrEY4sko9u0k/zEdC1ERD2ERC3UVC4kJC6UFB8D1A9Dw++To/+Do89Dw+7T8+4UI+00M6xUE1uT8wsj8trj8srj8srj8srT4trD4trD4tqj8tqD4upD8toD8snj8rmj8slz8rlT4qkz4qkT4skD8ujz4tjz4tjz4tjj0sjj0sjj0sjj0sjj0sjj0sjj0sjzwsjz4tkT4ukD8ulEI0l0E0nUAxqEAztkE3v0M5xUI4xEE3vkM7t0g/pkxDkEpAdEU7Wj4yRTktPDUrQDkzQDg1Pzc1PjYzPTUyPDQxOTQwODMvNjIvNDMvNDMvMjMuMzIuMTItMTItMDItLTIuLDIuLTIuLTIuLzEuLzEuMDAuMTAuMzIwNTEwNTEwNC4uMiwsNCssNy4vPS8uTjUuWTkuZT0xbkAzc0I7eUtLgFplg2eAf3CXeniqdXu3a3O0X2SmVFSUT0eDTEJ3TkFtTkJoTUFlSkFgR0JZR0ZYS0tXTVBVXWNjYGZiYmlhYGZcWmBUV1tNVVhNWFhQXllWYFdYYFdaLCwsLCwsLi0rLi0rLy4sMC8tMy8sMy8sMi4rMi4rMy4qMy4qMy4qMy4qNS4oNS0qMy4rMy4rMi0qMSwpMSwpMi0qMy4rMy4rMy4rMy4rMy4rMy4rMy4rMy4rMy4rMy4rMi0qMi0qMi0qMi0qMSwpMSwpMSwpMCsoMy4rMy4rMy4rMy4rMy4rMy4rMy4rMy4rNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNDEsNTItNTItNjMuNzQvODUwODUwODUuOzQsPDUrPTYsPjctQDcuQTkuQTkuQTkuQzkvQzktRTktRjouRzsvSDwuSj4wSEExSkc2SUg2Tkc1VkY2XEUzZEMybkAwdj4tezwrgjspjDsqlD0snEAxo0Y1qko6tEo9xEhAzEVB0UZB1kVA3kNB5EA+7D4/8To89zs89Do78Dw96UA93EM9zUM4vkAysT4srj8sq0Asqj8rqj8rqj8tqT4sqT4sqD8spT4toj8soD8smz4slz8rlT4qkz4pkT8qjz4rjz4tjz4tjz4tjj0sjj0sjj0sjTwrjj0sizwrjTwrizwrizwtjD0sjT4vjj8ulEI0l0EyoEAyrEI1uUM5wkM6xUI6wkE7ukE5sUlAo05HjU5Fb0c9Uz80QTsvOTYtQDkzQTc1Pzc0PjYzPDQxOTQwODMvNzQvNDMvNDMvMzQvMjMuMjMuMDItMDItLjMtLTMvLTMvLjMvLjMvMDIvMDIvMTEvMTEvMjEvMzIwMzIwNDAvMi4tMS0sNC4uOC4sRzQtTzQpWDgrYDwwZT82bUdGeVlkgmuFgHWffHyyd3y8bnW7ZGivW1uhUk2PTEJ+T0FyTEBoST1jSD5gSEJeRUNYQEJPO0BGQkdKRE1KSlFKSlFJSVFGS1FFT1VJVldPXllTYFlTYFhVKysrKysrLCwsLS0tLy4sLy4sMC8tMC8tMS0qMS0qMS0qMS0qMi0pMi0pMi0pMi0pMi0qMiwsMSsrMSsrMSsrMSsrMiwsMiwsMSsrMSsrMSsrMSsrMSsrMSsrMSsrMSsrMiwsMiwsMiwsMSsrMSsrMSsrMCoqMCoqMy0tMy0tMy0tMy0tMy0tMy0tMy0tMy4rNDEsNDEsNDEsMzArMzArMzArMzArMzArNDEsNDEsNTItNjMuNzQvNzQvODUwODUuOjMrOzQsPDUtPTYuPzYvPzYtPzYtPzcsQjguQjguRTgvRTktRzsvSDwwSj4ySEAzSEU2R0Y0S0U1UUQ0WEMyX0IyZj8ubj0sdj0sfDoqhTkpjDsqkz0um0IyokY3rEY4u0Y8wkY+yUY+0EU+2URA4kM/6kBA8D4+8jo68Ts67Dw85EE81kM7xkQ2tUAvqj0pqj8tqUAtqUAtqD8sqD4uqD4upz0tpT4toz0uoD8unj8tmj8tlj8skz4qkT8qjz4pjz4rjT4tjT4tjD0sjD0ujD0uizwtizwtizwtij0tijssiTwsijwviz4uiz0wjD8vkkMymEIxoUExrkI2vEM6wkM8xEM9wEM9uUZBslFKpVhSj1hRc1JJV0k+Q0M3PD82PjkzQDcyPjcxPTYwOjUvOTQuODMvNjMuNDMuNDMuMzQvMTMuMTMuLjMtLjMtLjMtLTMvLTMvLTMvLTMvLjMvLjMvMDIvMDIvMDAuMTEvMjIwMjEvMC8tLy4sMi4tNC8sPzArRDApSzMpVDgtWjw0ZEZGdV1qg3ONiYCrhYS+foPHdHrGbXC9Y2WvVlOaTEOCSz9xSTxnRztjRT5fRkJdREJXP0FOOz9IOkJFPkhHRE1IR1FJR1FISlJHTlZLVVhNXlpPYVlOYVhPKysrKysrLCwsLCwsLiwtLy4sMC8tMC8tMS0qMS0qMS0qMS0qMi0pMi0pMi0pMi0qMiwsMSsrMSsrMCoqMCoqMSsrMSsrMiwsMCoqMCoqMCoqMCoqMCoqMCoqMCoqMCoqMiwsMiwsMiwsMSsrMSsrMCoqMCoqMCoqMiwsMiwsMiwsMiwsMiwsMiwsMiwsMiwsMy8sMzArMzArMzArMzArMzArMzArMzArNDEsNDEsNTItNjMuNjMuNzQvODUwODUwOTIsOjMrOzQsPDUtPjUuPjUuPjUuPjUsQjgvQjguRTgvRTgvRzoxST0xSj4yST8zRkM0RkM0SkI1T0E0VEEyXEAyYj4wajwtcTwudzkqfTgphTgojDoslT0vm0I0pEI1skY6ukU7wUY+ykc/1EdA3kZB50NB7kJA7Ts76zs75z4730I70UQ6v0Q0r0AtpD4opkEtpkEtpUAspUAupUAupD8tpD8tpD4voj4un0AunD8umD8tlT4rkT8qjz4pjz4rjT4tjT4tjT4tjD0sjD0uizwtizwtij0tij0tiDwuiDwuiDwuiDwvhz4viD4xiz8xkUQylkMxokI0rUM2ukM7wUQ+wUQ+u0VBuVBMsltUpWVckWZddV9UW1VJR01BQ0k/PDkyPzgyPjcxOzYwOTQuNzQtNjMuNDMuNDMuMzQuMjQvMTMuLzQuLjMtLjMtLjMtLTMvLTMvLTMvLTMvLjMvLjMvMDIvMDIvLy8tMDAuMjIwMjIwMTAuMC8tMC8tMy8sOCwsOywpQzAqSzcwUzw2XklIdGJuh3qUkIq2jI3GhIjPeoDMcnjGaWu2V1efSUSERT1uRzxkRDxhQz5eQ0FZQENWQERQPkVLR1FSS1dVUV5XVWBYU19VUl5UVF5TWV9TXltMYVpKYVpKLC0vLC0vLC0vLC4tLS0tLS0tLi0rLi0rLy4sLy4sMS0qMCwpMCwpMCwpLysoLysoLysqLysqLysqLysqLysqLysqLysqMCwrLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqMCwrMCwrMS0sMS0sMi4tMS0sMS0sMS0sMS0sMS0sMS0sMS0sMS0sMCwpMS0qMi4rMy8sMy8sMy8sMy8sMy8sMy8sMy8sMy8sMy8sNDAtNTEuNjIvNzQvODAtOTIsOjMtOzQuPTQvPjUuPjUuPjUuPzQuPzUsQjUtQzYuRDcvRjkwRzoxRjwyRz80SEA1SkA2UD81VD4zWDwxXjkwYjYrbTkudDgtfDgrgzksjTsvkz0wmD8xnj4wp0EzrUE0tUM4vkU6ykc91Ec+3kU/5UNA6EA/6kJB5kRB2kU+yEQ4t0IxqkEuokIsokEuoUAtoj8soj4uoT0toT0toj4uoD8vnDwsmj0smDwtlT4tkz0skD0rjj0qjD4qizwrizwrij0tiTwsiTwsiTwsiDothzstiT0vhjwvhjwvhz0wiD4ziEAyiUE1i0E0kUU1l0Q0o0U5sUk+ukdAu0Q+u0VBuE1HtFpSr2Zfo3FmkXNofnJkampeVl5TSVFGTExCSkY9Qj41PDgvOTUsNzQrNjMsMzMrNDMuMzQuMTQtMTQtMDItLzEsLDErLDErLTIuLTIuLTIuLTIuLzEuLzEuLzEuLzEuMDIvMDIvMTEvMTEvMTEvMTEvMTEvNDAvNCswOy8zQTMyQzQvSjs2XU9PeW15i4Wfk5C7lJbPkJXZg4nTdHrGam63X2KnWluUTEl0SEJkQT5dPj5YP0JVQUlWTFVcVWBiYnFubn14doZ8cn91bHlvZ3VoX2tfV19QXVxIYlxGY11HLC0vLC0vLC0vLC0vLS0tLS0tLiwtLi0rLy4sLi0rMCwpMCwpLysoLysoLysoLysoLiopLiopLiopLiopLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqLysqMCwrMCwrMCwrMS0sMS0sMS0sMS0sMS0sMS0sMS0sMS0sMS0sMS0sMCwrMCwpMS0qMi4rMy8sMy8sMi4rMi4rMi4rMi4rMi4rMi4rMy8sNDAtNTEuNjIvODAuOTEuOjIvOzQuPTQvPjUwPjUwPTQtPzQuPzQuQTQuQjUtQzYuRTgwRzoySDszSD41SD41TD02Tz42UT00VjsyWjkwXzcvaDcwcDcudzctgTktiTkukDwxljwxmz0xokAzp0EzrEI1tEQ4vkU6yUY81EU920Q930RA4EVA3kZB1Ec+xEY4skMypUItnkItn0MunkItn0Aunj8tnj8tnj8tnj4unj4umj0smT4slj0tlD0skD0rjz4rjD4qjD0sizwrij0riTwsiTwsiTwshzsrhzsthTwthjwvhT0vhT0xgz0xhD4yhkA2h0E3iEI2k0c5l0U3o0c8r0pAuElCuEdBt0xGs1ROsWRcqnFmn35vkH9vf3xtbXNlWmZaTlhNTE5BS0k9RUM3QD00PToxODguNDQsMTEpMjMtMjMtMDMsLzIrLzEsLjArLjArLjArLzEuLTIuLzEuLzEuLzEuLzEuLzEuLzEuMDIvMDIvMTEvMTEvMTEvMTEvMTEvMjAxNSs0OS03PDIzPzUzSD86XlZUeHJ8ioiek5O5lJfKkJbUhIvPeYHCcXm4a3StaG6eXF+AWFpxU1VqUldqVF5oWmdtZnZ2coJ/dIh/fpKHg5WJfo6BdoZ5coBxZnRlWmVUW1pFYFpAYlxELC0vLC0vLC0vLC0vLC0vLC4tLS0tLS0tLi0rLi0rLi0rLSwqLysoLionLionLionLCspLCorLCorLCorKykqKykqKykqKykqLSssLSssLSssLSssLSssLSssLSssLSssLCorLCorLSssLSssLSssLiwtLiwtLiwtLiwtLiwtLiwtLy0uLy0uLy0uLy0uLy4sMCwrMCwrMS0sMi4tMi4tMi4tMi4tMS0sMS0sMS0sMS0sMS0sMi4tMy8uNDAvNTEuODAuOTEuOjIvOzMwPTMxPTQvPTQvPTQvPzQwPzQuQTQuQTQuQzYwRDcxRjkzRzo0SDs1Sjs2Szw3Tj02UDs2Uzo1VjcyWzYuYzYwazYudDUsfTcvhzkvjTswlDwwljwxnT8zoEA0okAzqEAzsUM2ukQ4xUU6zUQ61UZA10hA1ElCzEk/vkU6rkMzoUIunEEunUIvnEEunD8umz4tmz4tmz4tmz4vmz8wmDwtlj0tlDwukz0ujz4tjD0sizwrij0riTwqiTwqiTwshzsrhzsthTwthDotgzsthDwwgjwwgjwygj4zgz80hUE4h0M6iEQ5lEo9l0g7oEg+rEtEsktGs0xHslNNrmBWrXNnpoFxnYx6kY57gol3c4BvY3FiWGNVTlJETU5ASEk7REQ4QEA0OTsuNDYrLzEmMDEpMDEpLzAqLzAqLi8qLi8qLy8tLy8tLy8tLjAtLy8tLy8tLy8tLy8tLy8tLy8tMDAuMDAuMDAuMDAuMDAuMDAuMDAuMS8yNis5Nys5OC80OzYzSEU+X15Zenp8i42akJSxkpe/j5XHhI7DfYm7e4m2fIuyfYyrfYiad4OPcX6Hbn2Cbn5+b4J+eY6Fg5mNi6GUkaiYkKWUiJ2Kg5aDfI17antpXGhUWFhAXVk8X1tALS4wLS4wLS4wLS4wLS4wLS4wLi4uLi4uLi0rLi0rLSwqLSwqLionLionLionLiopLCorKykqKykqKykqKykqKigpKigpKigpLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLSssLSssLSssLSssLiwtLiwtLiwtLiwtLy0uLy0uLy0uLysqMCwrMS0sMS0sMS0sMS0sMCwrMCwrMCwrMCwrMCwrMCwrMS0sMi4tMy8uNDAvOTEvOjIwOzMxPDQxPTMxPTMxPTMxPTQvPjMvPjMvQDIvQDMtQTQuQzYwRDcxRTgyRjkzSDk0STo1Sjs2TDo2Tjk0UTgzVDUwXjcyZTYwbzYveDgvgjkwijovkDwxlD4xmT80mz80mz8ynz8xpUEyrkI1uEQ3v0U6x0c+y0hAykpBw0k+tkY6qkI1nkEwmUAumUEtmUEtmD8tlz4slz4smT4smT0ulz4ulTwslD0skz0ukD0tjj0sij0rij0tiTwsiDspiDsphzsrhzsrhDsshDssgzstgDssgTsvgDwxgDwxgT41g0A3g0M6h0Q8iEU8lExAlkg8nkc+p0pDrkxJrlFMrV1Wqmpep4BvoY95mpqCj5uDhpWAeot4bXtqYm1dU1pKUVVGS09ARUk6QEQ2Oz0wNTcsMTMoMDEpLzAoLi8pLi0oLi0pLi0pLy4sMC8tLy4sLy4sLy4sLy4sLy4sLi4sLy4sLi4sMC8tLy8tMC8tLy8tLy8tLy8tLy8tMi0xNyw6Nio4My0xOTYxSEo/YmZYe4B6i5CTjZOjj5awjJW2g5CygZCvhZmyjaS2kqizk6irkKSjjKCeh56YgpmPfZiJgZyLiKOQlLCamLGblK2Xi6ONhZuEf5J8a3xpWGZPU1Y7WlY5Xlo9Ky8yKy8yKy8yKy8yLS4wLS4wLi4uLi4uLS0tLS0tLi0rLSwqLSwqLCspLCspLCspLCorLCorLCorKykqKykqKigpKigpKigpLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorLCorKykqKykqKykqLCorLSssLSssLiwtLiwtLy0uLy0uLy0uLysqMCwrMCwrMCwrMCwrMCwrLysqLiopLysqLysqLysqLysqMCwrMS0sMy8uNDAvOTAxOjIwOzMxPDQyPTMyPTMxPDIwPDIwPTIwPTIuPzEuPzEuQDIvQTMwQjUvQzYwRDYzQzg0RDk1RTo2Rzk2SDk0Szg0TjUwWDcyXzYwaTcwcjcvfToxhjwxjD4ykD4yl0A2lz81lz81lz8znEAzo0M1q0M2s0U4ukU7vUc9vkg+uUc9sEQ4pkE1mz8wl0Avl0Atl0Atlj8ulT4tlD0slTwslj0vlj0vlTwukzstkjwvjjwuizwtiTwsiTwsiDwshzsrhjoqhjoqhjoqgzorgzorgjosgDougDowgDwxgD00fz82gkI5g0Q9h0ZAiEg/kUtBkkg9mkc/o0xFqFBMqFhRqWZdpnZooox3m5mAlaSHjKOHhp2DfpF9dIJxanVlXGVSVl9MTlVDRUw6P0Y2PEAyNzovNjgtMDEpMDAoLi0oLywnLysoLysqMS0sMi4tMS0sMS0sMS0sMS0sMS0sLy4sMS0sLy4sMi4tMC8tMi4tMC8tMC8tMC8tMC8tMi0xOCw6NSk1MSsrNjYsR0w4YGhReoNwiJKHjZeWj5qgjZmlhpajh5uikKqpm7mxoMCzmLeomranm7eomLelkbGciauSiauQkLGUkrOWlbSVkK2PiKKFhJuBe5J4Z3pkVGJJUVQ5VlU5WFc7LDAzLDAzLDAzLDAzLi8xLi8xLy8vLy8vLi4uLi4uLy4sLi0rLi0rLi0rLSwqLSwqLSssLSssLSssLCorKykqKigpKigpKigpKykqKykqKykqKykqKykqKykqKykqKykqLCorLCorKykqKykqKykqKigpKigpKigpLCorLCorLCorLSssLiwtLiwtLy0uLy0uLysqLysqMCwrMCwrLysqLysqLiopLSkoMCwrMCwrLysqMCwrMS0sMi4tMy8uNDAvOjEyOjEyOzMxPDQyPTMyPDIxPDIwOzEvPTIwPDEvPjAtPjAtPzEuQDIvQTQuPzQuQDUxQDcyQDkzQTo0Qjk0Qzg0Rjc0SDUvUTUxWDUvYTYvbDgtdTkugDwvhj4wiz0xkz81lT41kz81kz80lUI0mkI0oEM0pUQ0rEI1sEQ4tEU6sUU7qkI3oT80mj4xlj4wlT8ulD8rkz0skz0skzwrkzwrlDwulDwukzstkjwtjzwujTstijssiTwshzsrhzsrhjoqhjoqhTkpgzopgzorgTkqfzktfzktgDwxfzwzfz82gEE4gkM8hUY/iElCiklDjkpBkEc+l0hDn05Kp1ZSp2BaqXBlpINynJR9lqGDj6iKiKeIg6CEfpZ+eYh1cHtqZHBcXWlTUl5KSlNAQks6PkU1OkAyOTwxMzQsMjIqMS4pLywnLykpMCoqMSsrMiwsMSsrMSsrMSsrMSsrMSsrMCwrMCwrMCwrMS0sMS0sMS0sMS0sLy4sLy4sLy4sMiwuOCo3NSgxMysoNTYmRUsxXGdHdYJkhpN5jpuKkZ6UkJ+ai56YjaWXl7SeosWlqc6tpcmtpsqwp8uxpMisl76fi7ORiLCNjbKQjrKOkLKPjayKhKGCgJl7d45yZHhdUV9FTlI3UVE1U1I2LDAzLDAzLDAzLDAzLi8xLi8xLi8xLi8xLy8vLy8vLy8vLy8vLy4sLy4sLi0rLi0rLy0uLiwtLiwtLSssLCorKykqKykqKigpKykqKykqKykqKykqKykqKykqKykqKykqKykqKykqKykqKigpKigpKigpKScoKScoKykqKykqLCorLSssLiwtLiwtLy0uLy0uLysqLysqLysqLysqLysqLiopLSkoLCgnMCwrMCwrMCwrMCwrMS0sMi4tNDAvNDAvOjEyOzIzOzIzPDM0PTMyPDIxPDIxOzEwPDEvPDEvPjAvPS8uPjAtPjAtPzEuPjMvPTYwOzYwOzgzPDk0PTo1PjkzQDcyQzYwRzQuTzQrWTQrZDUrbjgseDotfzsuhTsujzw0kTw1kD4zj0AzkEEyk0Ixl0EymUAwoD4xpkA0qkI3qkI5pUA2nz41lz0ylT8ykj8tkj8tkT4skD0rkTsqkTsqkjwtkjwtkTsukTsujjstjTstijsuiDothjoshDsshTkphTkpgzopgjkogjkqgTkqfjgsfjgsgDwxgD00gEA3gUI5hEU+hUlBiEtGjE1GjElBjkhAmEpGoVNPqF1YqWhiqXtupI55mZyBkqeGiayLgqqIgKGEf5mAfot3eIFuanhhZHJbWmhRUV1JSVRDQ0w7PkQ2PD80NjcvNDQsMzArMCsnMSgpMSgpMikqNCssMikqMikqMikqMikqMikqMCoqMCoqMCoqMSsrMSsrMCwrMCwrMCwrMCwrMCwrMSstNikyNSktNC0lNDYhQUgmV2M7cYBXgpJtjZx9kKCGkKKMi6GKjaiJlbiOoMiUpNCdqdOrqNKup9Gtoculk72Xha+HgqyEh7CGiK6FjLGIi6uGgZ97e5R0cYhrX3NXTV1CSU8zSk0wS0svLi8xLDAxLi8xLi8xLjAvLjAvLjAvLy8vMDAuMDAuMDAuMC8tMC8tMC8rLy4sMS0sMi4tMS0sMS0sMCwrLyssLCorKykqKykqKykqKykqKykqKykqKykqKykqKyksKykqKyksKykqLSgsKigpLCgpKScoKScoKCYnKigpKykqLCorLCspLSssLi0rLy4sLy4sLSwqLSwqLysqLysqLiopLSkoLCgnLCgnMS0sMi0qMi0qMi0qMy4rNC8sNTAtNjEuOzMxOzMxPDQyPDQyPTMxPDIwOzEvOzEvPDEvPDEvPS8uPS8uPS8sPjAtPzEuPTIuPTQtPTYuOzgxOTkxOToyOToyOzgxPzYvQzIrSjEsVDIpXjMqZzcrbzktdT0uejwvhz0yiz0ziz8yjEAyjkAzj0Axkj8xlT0vmDwvnD4yokI2oUM3nkI3mT80lj4ylD4xlD4vkz0ukD0tjzwsjj0sjD0sjD0ujT4vjjwujjwuizwvijsuiDotiDothjoshDssgjorgjorfzoqfjsqfjsrfDoqfTksfDougD4ygT41gEA2gkM6g0c9hUpCh05Fi09HjElDjklEk1BKmFxUnmdgnXVpnod1npiAlKGFj6qJiayLg6iHgKGEfpt/epB5dIhvaX1iYnldXHBVVWdPT1xIR1JBQUg4PUEzODguODUuNy8sMyspMigpMigpMykqNCorMCosLysqMCosMCoqMCosMCosMiksMiksMyotMSstMSstMSstMCwtMCwtMCwtMSsvNCkvNCorNC0lNDYhP0YlVGA4bXxRgZBniZl0jZ56jaF+iKF6iqd7kbaCm8SIn8uQn8mZnsedncaamMGVjLeKgq2Aha6CjLWJhKt/ia6FiamCfpx4do9vbINmWm5TSlo/R00zRkoxREYuLzArLjArLzArMDEsMDEsMDEsMTItMjEtMzIuNDMvNDMvNjIvNTEuNDEsMy8sNC8sNTAtNTAtNC8sMy4rMiwsMS0sMCwrMCwrLiwtLiwtLS0vLS0vLCwuKystKikuKSkrLikvLiktLygvLiktLyktLiktLiorLiorLysqLysqLSwqLi0pLS0rLS4pLi8qLi8qLS0tLS0tLiwtLy0uLy4sMC8tMi4rMi4rMi0qNCwpNS0qNi4rOC8qOjEsOjEqOzIrPTQtPTQtPjUwPjUwPjUwPTQvPDMuOzItPTIuPDEtPDEvOzAuPS8uPjAvPjAvQDEuQTApQDIpOzQqNzctMzktMjguNTYuOjMtPy0pRionTCknUyomWi8oYDUsZDwwa0AweUEwf0AvhkExi0Izj0Azkz0wkzsvkjgtkzsvkz0ulEExlUIylEMykkEwkT4ukTsslzswlzoykjsxjD0wiD8whD8vgj8ugz4uiEAxiD8wij4xijwwiTsviDouhjotgzstezkrfkAzdzwucTcpdz4tdz4tdjstfT8yezsvgkA0h0U5iUk/iExBhk1ChFBDh05FkUtJl1NQlGJZkXBhjH1qiYlxiZZ8ip6CjaSHjaaJjqeKjaeMh6SIfp+CdZp7b5d1aY1pYoRfW3pYWnNVWm5TV2VOUFdFSks9Qz82QDkzOzAuNioqMycpMycrMycrMSYqLCotKSsqKiosKigpLCcrLigsMSgtMictMyguMyguMygwMigwMCkxMCkxLyoxLyowLyktMSsrMC0oLy8jPD8qVlxAcHpYf4tnjZx1i51zjKF2jKZ3iqh2iap1jrR7mb+Gn8GPnb6PlrqKj7ODiK59hat8g6p7hap+g6h9g6Z+gJ58eZR1coltaHxjWWtVTVpGSVE8Q0g0P0IvLzAqMDErMDErMDErMTIsMTIsMjEsMzItNDMuNDMuNzQvNzQvNjMuNTItNTAsNTAsNy8sNy8sNi4sNi4sMy4rMi0qMCwrMCwrMCwtLy0uLy0wLS0vLSwxKyovKSouKSgtLikvLygvLygvLygvLyktLyktLiorLiorLysqLysqLi0pLi0pLi8qLi8qLi8pLi8qLi4uLi4wLi4uLi4uLy4sLy4sMS0qMy4rNS0qNS4oNy4pOC8oOi8pOzAqPDIpPTMqPjUsPjUsPjUuPjUuPjUuPTQtPDMuPDMuPTIuPDEtOzAuOzAuPS8uPS8uPjAvQDEuQzAqQzApQTIrPjQrOjYtOTUsOjMtPDEtPy0rRCopSSooTisnVC8pWjUtXzoxZT4vcEEveEEtgEEwiEAyjz80kT0zkzoykzsxjTkuizwviz4ujEAwjUExjUExjkEvkT8xlTsylTsykDwyiz0whj4wg0AvgT8vgj8uhUAxhj4viT0wiDwuhzsuhDssgjosgDsseDgseDwxczktbjkrcz4ucz4ucjgqdTosfT0xg0E1iUU6i0k9iUtAhk5BhFBDh05FkUpIl1NSkmZdjHdmhIZwgJN3gZ5/hKWGiKeIjaeKkKeNkKeNiqSJgZ+Dd5x9b5h2ZZJpYItgWYJaWXtYXHdYWm5TU2FKTlVDRkg7Q0A3PDczNy8tMyorMikqMSgrLigqLCorKiosKyksKyksLSgsLyktMigwMigwMigwMigwMigxMCkxLyoxLSozLSozLSoxMi0xMi4tMCwpLS0lODosU1hCb3hdgItph5Zvhplshp5uiKNwhqRwhKVwiq13k7aAmbmHlraEk7OBjK57hqt4gqh3gqh5g6h8g6Z8gqR/f517eJJ1cYhuaHtlWWpXTVpIRUw8QEQ1Oz0vMTIsMTIsMTIsMTIsMjMtMjMtNDMuNDMuNTQvNTQvODUwODUwODUwNzQvNzIuNjEtODAtODAtNy8sNi4rNC8sMy4rMiwsMS0sMS0uLy0uMC4xLy0wLS0vLCwuKyovKykuLygvMScvLyktLyktLyktLyktLiorLiorMCwrMCwrLy4qLy4qLy4pMC8qMC8qMC8rLy8tLy8vMC4vMC4vMC8tLy4sMS0qMi0qNi4rNzAqOTArOjEqPDErPTMqPjQrPzUsPzYtPzYtQDcuQDcuPzYvPjUuPTQtPTQtPTIuPDEtOzAuOzAuOzAuOzAuPDEvPzEuQzIrRTArSC8rSy0tTCwvSysuSSovRSsuQS0sQC4qQS4oRS4oTS4pWDEqYjMtZzUsajosbzstdzswgT00hzw2jDw1jTo0jTo0ijwyhz0yhj4yhT8zhkEyiUEzjEI1j0M1jj8yjz0vjD4xij4uhz4vhT4shj0uiDwsiTsuiTwsiDothjoqgzssfzwpfj0rezwrfT0xejwxdjovdTsveEAxeEAxdjwudjstfz81gkI4iUY9i0g/iUpBh0tBh05Dik5GkUpImFRRlmZckHZlh4VugpF0f517gaSDhaiHiKqJjaqMkKmMjqWJiJ+DgZp9eZh4aZZtYZJlXIthXIZgXYJgW3xdVXJWUGhQRllFQlA/OkQ5MzoyLjMsKi8pKiwpKiooMCcoMSYqMSYqMSYqMCcqMSgrMCouMCsvLyouLSsuLCswKywwKS0wKC0xKC0xKS0wMS8yMy8uLionKioiNTcqUFVBbXZbfIppgJBrfpNqf5lqg59ugKBufqBtgKVxh6x4ja98i616iKp4hKl2gad2f6d1f6Z3f6Z5f6R5gKJ9fZt5d5F0cIdtaHxjWWtVTVpIREg5PT8yOTktMjMtMjMtMzQuMzQuMzQuNDUvNTQvNTQvNjUwNzYxOTYxOjcyOjcyOTYxOTQwOTQwOjIvOTEuOTEuODAtNTAtNC8sNC4uNC4uMy8wMy8wMS8wMS8yMC4xLi4wLS0vLSsuMCkwMikuMCouMCouMCouMCosLyssLysqMS0sMS0sMC8rMC8rMTArMTArMTArMTAsMTEvMTExMS8wMTAuMTAuMi4rMy4rMy4qOTIsOTIsOzIrPDMsPjQrQDYtQDYtQTcuQjgvQTgvQjkwQTgvQTgxQDcwPjUuPjUuPTIuPTIuPDEvOzAuOzAuPDEvPTIwPTIuQjMuRTIuTC4uUiswVicvVSYuUCcvSSkuQy8uPDErOzIpPzIpRzAoUi8pXy4qZC8paTkvazsvdTwzfTw2hTs4iTs5ijs3iDo2iT44hkA4hkI5hUI5hUM3hkI3h0E3iUE1iEAxiEEvh0Auh0Auhz4tiDwsiDsriTorijgqiDkqhzoqgzopfzwpez0oeD4oeD4qgj4xezcuejcuejwxdjstdz0vfEEze0AygEI3g0U6hkg9iEo/hkpAh01CiE9EilFIjFNKjlxRjmhbi3RihX9ngIttfpZ2f558g6eDhKmHh6qJi6qKi6aHh6CCg5p+fZh5cZVvaZRpZo9nZoxlZ4tnZIZlX35fWndbUGhQS15KQlA/OEQ2MjovLjQqLC8oKyolMiYmNSUoNCUoMiYoMScoLykrLyssLiwtKysrKistKistKCwtKCwvJywvJywvKistLiorMSsrMCsnLisiODgsUFVBaXFZdoRje4xoeY9ofJZpf5xsfZ9teZ5reqBtf6Vygqd0gKVxfaNwfaNwfaVzfqV2fqV4faR4fKF4fZ96epl3dZBxbodqZXxiV2tSTltHREY5Pz0xOjgsNDUvNDUvNDUvNTYwNTYwNTYwNzYxNzYxODcyODcyOzgzPDk0PDk0PDk0PDczPDczPDQxPDQxOzMwOzMwODMwNzIvNjEuNjEuNTEwNjIxNjIxMzEyMjAxMS8wMC4vMS0uMiwwNCsuNCsuNCsuMiwuMiwsMiwsMiwsMy8uMy8sMy8sMy8sMjEsMjEsMzItMzIuMzIwMzIwMzIwMzIwNTEwNTEuNjEuNjEtOzQuPDUvPTQtPzYtQTcuQjgvRTgvQzkvRDoxRDoxRTsyRDoxQzkwQjgvQDUvQDUvPjMvPjMvPTIuPTIuPTIwPTIwPjMxPjMxQDUxRTMxTTAyVCw0WCkzVygyUikxSywxQjMwOjYtNzcrOjYqQjQpTTIpWC8pXi8pZjoxajszczw3ej06gjw6hjw7hzs7hjo6gjs3gT44gUE4gUI5g0M6g0M6hUA5hEA3gkMygkMxg0IwhD8vhj0uiDwuiTotizktiTcrhzgrhTkrgjorfj0reD4qdj8qeD4qgTktfC8ngjgvhD40dzQrczUqfUE2fUM3f0U6gEc8gkk+g0o/hEtChk1Eh1FHhVdKfGFOempRgHBZgXVdgnxig4ZphpN1iJ18g6N+gaeCgqqFgqyGgamEf6WAe559epl3epJwepBseI1sd4xrdY1tcolsbYRna39kYHJYW2lSUltISEw9QEA0OzcsNzAmNSokNignNScnMycnMScmLikmKyooKyspKy0qJywoJysqKSsqKSsqKiosKyksKyksLSkqLCMkMionNTAqODYqQkM1VVpGZnBXbn1edIhlcYpidZBleJhpd5trc5lodJppd59reqJueKBsd59teKBueaNze6V1e6V3fKN3eZ51epx3d5Z0c45vbYZoZHtfV2tQTltHQ0M3PjoxOTUsNTYwNTYwNjcxNjcxNzgyNzgyODcyODcyOTgzOjk0PTo1Pjs2Pjs2Pjs2Pjk1Pjk1Pzc0Pzc0PjYzPTUyOzYzOjUyOTQxOTQxODQxODQzOTU0ODQzNzMyNDMxNTEyNDAvNi0wNi0uNi0wNi0uNC4uNC4uNC4uNC8sNDAtNDAtNDAtNTEuMzItMzItNDMuNDMuNDMvNDMxNTQyNTQwODQxODUwOTQwOjUvPTYwPjcvQDcuQTgvQzkwRDowRzoxSDsyRjwzRjwzRjwzRjwzRTsyQzkwQjcxQTYwQDUxQDUxPzQwPjMvPjMxPzQyQDUzPzUzQDcyQzUySTM1UDE2VC82Uy41UDA1SjIyQzUyPTkwPDotPTorQzcpSTYoUTMpVzIpXTIrZDMsbDUwdjY0fTc3gjg3gzc3gjY2fjc1fTo0fTw2fT41gD85g0A4hj85hUE4gEIzgEMxgUIxg0AwhT0vhzsuiDouhzkthTksgzksgjosfzwsfD0seT4seD8sfD0shzUqizIsoUxFp1hRi0E4fDkwgkY7gEs9eUg6eko8e00+fE4/fU9CgVFFh1VKgl9McmtPb3NSfHVYh3ddj3limH9pn4tzoJR6lpZ6j518i6N/iKiBhaeCgKR+e595fpl2g5FwhY5vg45wgI9wf5Bwe45wd4xtc4dran5iZnZcX2hTVltHT00+R0EzQDYqPTAnOywnOSsoNisnMysoLywnLC0nKy4nKS4oKS4oKy0oLSwqLysqMykqNCgqNycqNycoMygkPDMsRT40SUc4UVJAXWJLZ3FWanlaboJda4RcbIldcJFicZVlb5Vkb5dlcppmdZ9tcpxqcZtpdJ5ueKJyeqR2eaJ2eZ92dpp0d5l2dZRyb41raoVmY3xeVWxPTlxFQ0M3QDkxOzQsNjcxNzgyNzgyNzgyODkzODkzOTgzOjk0Ojk0Ozo1Pjs2Pzw3Pzw3Pzw3QDs3QDs3Qjo3Qjo3QTk2QDg1PTg0PTg0PDczPDczPDczPDc0PDc0PDc0OzYzOTUyOTMzODMwOC8wOS8uOC8wODAuODAuODAuNjEuNjEtNjEtNjEtNTItNTItNjMuNjMuNzQvNzQvNTQwNTQwODQxOTUyOjYzPDk0PTg0QDkzQDcwQTgvQzkwRDowRzoxSDwwST0xST0xSj00Sj00Sj00STwzRjwzRDoxQjgvQTcuQTgxQDcwQDcyPzYxPzYxQDcyQDcyQTgzPzc0QDg1Qjg2RDk3Rzk2SDk2SDk2SDk0RTgwRTgvRTktRTkrRzksSTkqSzkrUTcqWi8mZC8nbjMtejYzgzk4iTs5izs6iz07i0E+h0A6gj02fzwzfzozgjw0iD03iUA3g0E1gUIzgkAygz8ygz0xhDwwgTsvgDwvfjwufD0uez0ufD4vfD4vfT4vfz0vhjkvkDErojw4zWxm2X55rVpUjEM8iExBf05AdEo8cU09cFE/cVJAdFNAeldEgltKfmVPbXNPb3tVhHlbmHVfqW9jtm1mvnFrvXdvu4J3sYx6p5d+np+AlqGBjaF+hZ15hZl2iJFyi5ByiJFyhJNygJZyfJZzeJNwdJJwbYtpaYRlZHhcXWtRVl5HTVA7RUQwQjsrQDMrPzIsOzAqNzAqMzApMDAoLi8nLi8pLzAqMi8qNiwrOiorPigrQyYrRSQrQyYoRjUtTEM0VlE+W1lEYGJKZ21RaXdWantXbIJbZ4JXZoZXbI5cb5RhbpRhbpZicppmc51rb5tqb5lpcpxud6B0eaJ4eJ53dZt2c5dzdZd2c5JybotsaYRjYntbVG1NTV1DR0g6RTw1QDcwNzgyNzgyODkzODkzODkzOTo0Ojk0Ojk0Ozo1PDs2Pzw3QD04QD04QD04QTw4QTw4Qzs4Qzs4Qzs4Qjo3Pzo2Pjk1Pjk1PTg0Pjk1Pjk1Pjk1Pjk1PTg1PDczOjUxOzMwOjAuOjAuOTEuOTEuOTEvOTEuOTEuNzIuNjEtNjEtNjMuNjMuNjMuNzQvNzQvNzQvNTQwNjUxOTUyOzgzPDk0Pzo0Qjs1QjszQTgvQjovQzkvRTsvSDwwST0xSj4ySj4ySz41Sz41Sj00Sj00RjwzRTsyQzkwQjgvQjkyQjkyQTgzQDcyQDcyQTgzQjk0QTo0PzgyQDkzQjs1RD03Rj02Rzw2Szw1Tjs0TTYuTjYsUTYrUTYrUTcqUDkrUDkpVjYnZjYqcjYsfjsziUA5lURAm0hEn0pHn0xGoFFKmUxEjkQ7hTswhDcthTctjDkxjT00iD41hz43hj02hTw1hTw1gT00fT0zej4zeEAzdkEzeEAzej4zfzwzgzoziDczkTMxmCgmsz077Hx6/ZWSxWhjlkdAiUtAeEg6bk08alE9ZlQ+aFY+bFhAdFtFf2BMgGhQeXNRhHdVnnRctGxeyV9f01Zc2VFb11Rc5G912Xp4zIZ8wI9+tZWAq5V9o5J4n492nIpynIp0mY11lY91kZF1i5JzhpFzgpFyfItueYZqdXthbW9XZ2JOX1RCVUU1UjwvTzQtTTEtSTAsRC8qPi8oOS8mNy4nNi8nODEpOi8pPS4rQSwrRikrSCgrSycrSCknVEI0WVE8ZF5GZ2VMaWxPbnVWbXtYbH5Ya4RaZ4RWZ4dWbY9dcJVicZZicplkdZ1pdJtsb5lrb5Zqcpltd512eZ94d5p5dJZ1c5R1dZR1c5Bxb4praYRlYXxbVG1NTV1CTU5AS0I5Rj02OTo0OTo0OTo0OTo0OTo0Ojs1PTw3PTw3PTw3PTw3QD04QD04QT45Qj86RD87RD87RUA8RUA8RUA6RD85RD85Qz44RT44RD03Qjs1Qjs1Qjs1Qjs1Qjo3Qjs1QTo0QTo0QTgzQTgzQTgzQDcyQDY0PjcxPjcxPjcxPDcxPDcxOzYwOjUvODUuODUuNzQvNzQvOTYxOTYxOTYxOjcwPDcxPTgyQToyQjsxQzoxRDwxRjwySj4ySz8zTEAyTkAzTkA1TkA3TkA3TD82Sz41STwzSDsyRTsyRTsyQjkwQTgvQDkxPzgwPzgwPzgwQDkzQDkzPDUvTUQ9TUA6SzozVEA5UjYyTzArYTw2XDMtYDUuYDQrXi8nXi8lZjYsbT0xcT0wiUk9j0c7l0k/n0tBn0Y+mz43mj02nkQ7pk5EpFBFqFZKq1lLpU9CmUE1lzswmz42kzk4kTk4jDY1hjUyhjg0hD84fEA2cj4xckI0b0EycT0wdjowgjcyjDQzki0xmicsyEhJ6GJhxUVEzVdV4Xl2q1ZPhkY8hFZGbVI9aVtBaWJGamVIamBFbl5EfGRMjWpUkmJMsm1d0W5o21hd4DtM5y1F8itI9TBM9kBZ7Elc5Ftl5W5y4nt824B924N/2ImCw392vYF3uoR4toZ4soh4rYp3qIt5pYx4moBvmX5tmHhpk29hjWJZhFVNe0lCeEE+dTo8aS4yZDAyYTExUCYnRyUjTDAtTTUxRzQuRTIsRDEtRjEuRi4sRysqSy0tUTYvWUg0YFc6Zl9CZ2RFa29OdXxadYRdb4FZbINXbIdacI1dcpJhc5VidZdkd5lmdptocpZqc5hvc5dxcZVvc5V0d5l4eph8eZZ6eJV5c41ybYdqa4RmaYJkYXpaVG1NT19ETk8/U0tAUEc+OTo0OTo0OTo0OTo0Ojs1Ozw2Pj04Pz45Pj04Pj04QT45QT45Qj86Q0A7RD87RD87RkE9RUA8RUA6RUA6RD85RD85RT44RT44RT44RT44RT44RD01Qzw2Qzw0RDs0QzoxQjkyQjkyQjkyQjkyQTgzQTgzQDkzQDkzPjcxPDcxOzYwOzYwOTYvODUuNzQvNzQvOTYxOTYvOTYvOjcwPDcxPjoxQTowQjwwQzswRTsvST0xSj4wTEAyTEAyTkAzTkAzTkA1TkA3TT82Sj00STwzSDsyRTsyRTsyQzoxQjkwQDkxQDkxQDkxQDkxQTo0QjkyRDkzSTgxTC8rVi4sajc2dTk5ezs7hUVDg0Q/hEhAhUlBhkc+jklCmU5IoVBMok9Hk0Q3lEI0mkI2n0M4oD4znDctnDctnz0wo0M1mz8wmUAwoEUzpEc2p0Y2rkg6tk5FtExNr0hMpUBEmTk7kTk4jT46g0A4eD4zbz4wekk7hUxBhD84hCwrkikuszlE0kxX3EtO301Nyj49wEA/0GBcs1lRhEA1glREeWFJZVtAXl0/aWhJc2xPdmdKfmRLlmNOvGRY1l9b5lVa60FO8ixF/iVE/yZI/ydJ/y5O+TNO8jxS8Ela61Be5VFd41Nd4Fhi22Jp1WZs1Gpu0m1xz3FyzXV0yXh3x3l3ynx8yXl6yHZ4x3F0xmtyxWZuxWFrw19rxWBus1NfpUtVmkdRjURLhkVJbTY5SBwbVDEtTTAqSDErSjYvSzgxSzoyTz42VUU4W081Y1o5Z2FBaWZFbnJPeoJdeolidIZecolfcIlfcItgcY5gdZJkd5Rkd5Rkd5Rmc5JpeJZyepd4eZZ4fph9g52EhZ2Hg5uFgZmDepJ6colvbYRoaIFkYHlbVG1NTmFFUlNBVlBCVU9DODkzODkzODkzOTo0Ozw2PD03Pz45QD86QD86QD86Q0A7Q0A7Q0A7Q0A7RD87RD87RkE7RkE7RkE7RUA6RUA6RUA6R0A4Rj83SkE6SUA5SD84Rz41Rj02RTwzRjwzRTsxRDoxRDoxRDoxRDoxRDs0RDs0RDs0Qzw0PzgwPzgwPDcxOzYwOjUvOjUvOTQuOTQuOTYvOTYvOjUvOzcuPjcvQDkvQjkwQzswRTsxRjwwST0xSz8xTT8yTUAwTkExTUAwUD81TT80TD4zSz0ySTwzSDsyRTsxRDowQzoxQzoxQTowQTowPzsyQDwzQDwzRDs0VUQ8UjMuajIzjkFHrUxXw1Vgy11mxl9im0I+l0k/lkxBnE5CrFJKvlVSzE9TxExLpUA0nUIwoEAwpT8xpTsuozcrpDgrpz0vq0U2oT4rmDcknTonpT4trEEvskMytkQ6pzAyrzpCuURMvUxSuk1SrUtMlkE+gjcxezgvdjYseDIqhDEtnDM3uT1H1UdX6E1b4kZJzzUz0Do5vTMxyE5LxmNdlEo/jFtKfWNMal9DZ2RFdG9Pf3BRgWhKjWhOsGhZ5GJi9VFa9ERR9jdJ/TFK/zJO/y9N/ypI/zJP/DBL9zFK9TVM8jRN8DJL8zNM8zdQ8kBY70Nb7kZd7Ulh605j6lFl6FVo6FZr5VNq5FJp409p5E5p505s61Bv8lNz81Z1/miF8WF85Vt01VVszVlsyWRyqFJdci0yXiYnWTAsVzo0UT81QjotOjgpPkIxTE45Vk8zYVY2ZV8/aGVEcXVUf4Zlfoxpd4hkeIxpdYtlcotkcotjdoxleY9oepBpepBqgJV2hJt+ip6FjaCKkqOQl6iWmKmZlqaZkaKSh5iGeo15cINtZ35iXndZVG1NUGNHU1hEWFVEWVZHNzgyNzgyODkzOTo0Ozw2PT44QD86QUA7QkE8QkE8REE8REE8REE8REE8RUA8RUA8R0I8R0I8R0I8RkE7RkE7RkI5SEE5SEE5TEM8S0I5SkE4SUA3SD41Rz0zRjwyRTsxRDowRDowRTsxRTsyRDsyRTwzRTw1RTw1QDkxPzgwPTgyPDcxOzYwOjUvOjUvOjUvOTYvOTYtOzcuOzcsPzguQDouQzswRDwvRjwwRj0uSj4wSz8vTUAwTUAwTUAvTUAwTz8yTz40TD4zSz0ySjwzRzoxRTsxRDowRDsyRDsyQjsxQDwxQDwzQT00Qj41RjwzUzgxWyomiTo/vlRg2VRl5lVm41Vjy0pPnzMwljovkT4wmUEzrkY9xUlH1UJIzT5AsUI3p0Y1qUIzrEAzrz8zsD4zs0I0tEQ2skc1qUIvozwppDsoqTwoqzoorjYmrTMotjk3ujk9vTc+vDc8vzxCxkpMxFRTvlhTmT83jDQqiSwlnTYxw0hL3E9X4kFR2zNA3jo5zS4q0zg0yDc0xkVAyF1VqVdLkFdGd1dAdmVJfnBTf3BRhGZKkGRLqW9b1XVp7lNX/ERQ9ztK+DlJ/j1O/0BR/zpM+TRI/z9T/jlN+jRL/TNL/TFK/y9J/zBO/zZT/zNU/TRW/TZX+jdX+Dla+D1c9z5e9UBh+ENm9kBm9T9l9T9n+D9o/ENt/0Vy/0lz/091/1F1/lV28lNx51Ru5WF41mZ2t1difTE1ajAvWDEqUDgsRz4vPkEuO0QvP0cvUEsuX1Q4Z2BDb2tOfHxgiI5yh5F2fYtxeo1xfI9zfI9zeo1veoptfYxvg5J1iJd6laOKnKmVo66dprGhrLSnsbmusLewq7WtoauilKCUg5GCc4RxaHxjXXRYU2xOUGRIUlpDV1lEWVpINjcxNjcxNzgyODkzOjs1PD03Pz45QD86QkE8QkE8REE8REE8REE8RUI9RkE9RkE9RkM8RkM8R0I8SEM9SEQ7SEQ7SkM7SkM5TEM6S0I5S0E4SkA2Sj00ST0xSDwwRzsvRTsvRTsvRTsvRTsxRTsxRTsxRDsyRDsyQDkvQDkvQDkxPzgwPDcxOzYwOzYwOjUvOzcuOzcuOzcuPDgtPzguQTsvQzswRDwvRz0xRz4vSz8xTUAwTUAwTkEwTz8vTz8wTz8yTj0zTj0zSjwxSTswRzsvRDowRDowRDwxRDwxQjsxQDwxQT0yQT8zQj82Sz00XDUudzMyrUxT211p5k1f5UBR1zZFtyYrqDEpnTcokjomlzwprEAzw0Q91D4/zTs7sT81qEI0qkAyrT8yskA1uEM5vEg7u0o8rD4vqj8vqD0rpjspqjkpsDostzsvvDwxykZBzkRB0D4/0Dc51jc83kJF4kxO3VJPxEM+xktDzVRM1FNN2UtK2z9C4DU+4TI32zQu2jcu0DErzzo0vzg0s0A5tVtQllVDe045gmJJhmtQhGBGkltGrWZUy3Jk521o6kVL8jpE6jlD5zxE50JI50ZL6EdM6kZN9EpT8kJN8jlJ9jVI+TJH/S9G/zJM/zhS/zlW/zlY/zpY/Tpa/jtd/z1f/0Bi/0Fl/0Np/kRr/kRt/UJt/ENv/ENv/EJx/UJv/0dw/0Bo/0dt/01w8klo6U9r5Vty2WNzvVljjj9EYCYkUSsiVkAzVk89SUw3QEQtUkozZVlDdWpWgHtnjo15mZyLlZyMiJODgo6AiZeIj5uNjJmIh5KCipOCl56OpKiZsranuLyuv8G2wMG5wsO9xcbBw8PDvr6+sLWxoqmijZeMeYd2aXtlXHNZVG1PUmZKUVtCVVpDV1xGNTYwNTYwNjcxNzgyODkzOjs1PTw3Pj04QD86QD86Q0A7REE8RUI9RUI9R0I+R0I+R0Q9R0Q9SEM9SUQ+SUU8SUU8S0Q6TEU7TEM6S0M4TEI4S0E1TEA0Sz8zSj4yST0xRz0xRz0xRjwwRjwwRTsxRTsxRDsyQzoxQTowQTowQDkxQDkxPTgyPDcxOzYwOzYwOzcuOzcuOzcsPDgtPzktQTsvRDwvRT0wSD8wSj4wTD8vTUAwTkEwTkEwTz8vTz8vTz8yTj0zTTwyTDsxSTswRzsvRjkwQzkvQzswQjwwQjsxQDwxQD4yQT8zQj82Tjs0bTg0l0ZFxFlf21di30NR3jhG1DM7vSsrrTEnoTglmDohlzkgpDsmtj4uwzoyvjcxpzcsojotpTktpzcsrzoxuEI4ukU7t0U6rj4yrT8wpzwspDYnqjYptj4ww0Q7ykc9vjgtzkA24UQ/7EJC9D1B8zk+6zI33i4w2zc14kdC6FNM5U5H3D052TEw4y8y6jY32TEo3jwvzSwi0DcxvjMssDcvyWdcuGxcjldDh1pDg1Y/iVI9qVxMzmxh4Wdi5FRU8EVL8T1G5DtA2T0+0kE+0kdC3U9N61dX7U5S70RN8DpH9jVG9zJG+C5E+zFH/jdO/jhT/ThU/ThW/jlX/ztc/z5h/0Fl/0Nr/jtl/Txo/T5q/T9t+j5u+D5v9D1t9jpq/0hy/zth/z9k/0tu/0tu905t71Vv41pu6HKCwmFqmElMdDo4XDYtUDkrUEMyVU06XlFBcmVViHxulY2Cn52RpqefoaaflpyYlZ6bnqekpq+spqyooqejpqijtbSwwsG8zMnA0c7F1dDM1dDN1M7O1c/R0cvPy8bKv73AsLKvmJ+YgIx+bX5rYHRbV25SVmpOU2BGVmBFWGBINTYwNTYwNTYwNTYwNjcxODkzOjk0Ozo1PTw3Pj04QT45Q0A7REE8RkM+SEM/SEM/R0Q9SEU+SUQ+SUQ+SkY9SkY9TUY8TUY8TUU6TEQ5TUM5TUM3TkI2TUEzTkAzTUEzSkEySkEySUAxSD8wRz0xRjwwRDwxRDwxQzoxQzoxQToyQDkxPzgyPzgyPDcxPDcxPDgvPDgtPDgtPDgtQDouQTsvRDwvRT0wSD8wSz8xTUAwTkEwUEAwUEAwT0AtTz8vTz0xTz0xTT0wTDwvSTswRjouRTgvQzkvQjovQTsvQTowPzswPz0xQD4yQEA0UDkxcjEvqEpLwVNWuz5EvTA2wjAzwS8vujEpqTEhozkjnD0hmTsfmzwgoT0jpTslpDYlnjYpoDgtojYspTQsrTgxt0A6uEM8skA2sUI3rUE0qDwvpjgrrzowvEM4w0Q9xUA3wz4tzz4t2TUr4Som7SIl+iUr/yox/y407Skq5y4r4TMs3zQs4DMs4zIs6TAt5zIr2jIl1jYm0DImzzcsxTYuvT43yGBV0n9xpmVTj1ZCik06o1dJyGZb32Rf51JU6ENJ9UZN7UBE3z8/1EA8yUA4xkA30UZB401M70pO9EBL+TlI/TdI/DVI+DNF9zZH+jtN+jhQ/DdS+zZS/TZV/zZY/zld/zth/zxn/z5r/z9t/0Bx/0J0/0J1/kJ1/EJ0+UJw/0Zt+kFh/kVl/0tq/ktr/1Z0/1969V108mp+5nB+0293rl5hg0NBZzYvaEI3c1VKeWVcjH12o5aQraOhsq6rtra2sra5qq+zsLe9tr3FvcHKwMPKw8LKycbN1c7W3dfb4trY593b6d3d5trc5djf5Nfg4NTe2c/YysXLurq6oqejiJKHdIJxZXhiXHNXW29TW2pNXGlLXWdMNTYxNTYxNTYxNTYwNTYxNjcxODcyOTgzPDs2PTw3QD04Qj86REE8RkM8R0Q9SEU+SEU+SEU+SEU8SkY9SkY7S0c7S0c7Tkg6TUc7TUc7TUU6TUQ7TUQ7TUQ9TkM/TkM9TUM3TUQ1S0IzSkEySD4yRz0xRT0yRDsyQzoxQzozQToyQTo0QDkzPzc0PDczPDcxPjcvPjcvPDgvPTkwPjoxQToyQzwyRD0zSEA1ST8zTEAyTUExTkEwUEAwT0AtT0AtTD8vTD4xTT0wTDsxSjkxSTgxRTgwQzkwQDkvPjovOzsvPDwwPT4wPj8xQT8wUzgthzw3xFxbylpZrjg2qy4qsjErri4lrTIjrDkmrEIqqkYspkQno0Emo0EmojwjnzkjoDkqozswpjowpjcurTw0tkM8t0U7sEA1qz0wqDwvqTsurDwwu0U5xkxBxUU8vDgsvzYkzToo3Tsu5jMs8Ssq+Sgr/SYr+yUn+Coq9S4r7zIs6zQs6DMq5TMp5DIo4DMl4Doq0TIf3D8wzjYpyDgtwj81s0E20Wxgv2dZpVJCqE9By2Na52hi5lJS6kFG80JK6z5E4Ts91jw8zUA5wT40tjgsuTYuxDk04khI6UBF8DtE9jpI+jpJ+DhH9ztJ+z9O/kFV/z9W/jxU/jlU/zhV/zla/zpe/ztj/z5p/z5s/z5v/z5w/T5x+kBy+EB090Fx90Nq/01t/1Nz90po60Bg/VRz/2eF/2WC9113719452h73HB9xnF4p2dnjV5Ye1pRl353qpmSvrCtxLy6xsLDyMfMx8fPw8PPy8rYzMrY0cra187f39Tk5tvp6uDr7ePr7+Xm8ujm9Ojo8OTm7uHo7eDp6t3n5Nji0crRwb/Cq6upkZaPeoZ4bHtoYnVfYHJYYnBWYm9TY21UMjEvMzIwNDMxNjUxODc1OTg0OTg0OTg0Ozo1PDs2PT01Pz83QUE5Q0M5RUU7RUU7SEhASEg+SEg8Skg7S0o4TEs3TUw4Tks4TUo5SkY6R0Q7SkZDTklNTklQR0RPRD9FTkU+TEM0SkA0S0E1TUM5TEI4Rj00QjkwRTw1Qzo1QDkzPzc0QDg1Pzc1PDc0PDQyQzo1Qjk0QTk2Pjk1Pzo3Pjo3Pzs4QDw5Qj86REA3R0A2SkA0TEAwT0AtT0ArTD8sR0AuRj8vSTswSzgxTTUzSzY1Sjg4Rjs5Qj86NjkwNDwvOUQ0OkEvNjkkPz0oYkMxvGpeuUpBpjcspTUppzcrpTUnpTcmqD0rozgkpTwmqkAqrUAprD0prDkmrjYlqzYlpDYnoTcpojgqpjwuqkAyrEI0rEIyrEExqT4sqz0srTwssz0vvUM0xEY4wD4xujImxzkrzDgq0Dgr1jgt2zct4jUu6TMv7jEt8S4s9C4t8zAs8TEs6jUq4zcp3Top2zoo3Dkm1DMf0DMgzzgnxjcnvjYowkI1z1NJyE5Dz1NL4VxX7l1a8FBS7T5D8jk/9z9H6kFG30NE1UFByD85uzwzsTsvsDwvsjwwykxA1EtD3EdD4T4/6zxB9z9H/T9J+TtH/kRR/ENR/kRS/0RV/UBW/DxV/zxa/0Jk/0Zr/0Fq+jtn9Tpn9jxt+UNz/Ul5/0t6/015/010+FBz8E9w501p6k1q/Fl4/2eI/1+D9Uds9ld36F95w15uvXt/h2Fej3hwp5GEu6ec0cS73dbQ3dza3Nvg3tzn4tvr5tfs69ju8dnx9t3z9+Lz9+f09ev09O7y+fTx+fTw+fHv9u3u8+js7uPp6d7k5t3i1tDUzcnKu7q4o6Wgi5CJeYN4cn1vcHtrfYZzeIFsdn1rMC4vMS8wMzIwNTQyNjUzNzYyODczODcyOjk0Ozo1PT01Pz83QUE3Q0M5REQ4RUU7SEg+SEg+SEg8Skg5S0o2TEs2TU01Tk04S0o4S0k9S0pFUFBSV1VgWVhqVlRqUk9gT0lLTUQ/SD86Rj04Rz45SD86Rj04Qjs1RDo4QTk2Pzc0Pzc0QDg1QDg1PTg1OzYyPTQvPTQvPTUyPDc0PTk2Pjo5PTw6Pj05Qj86RD85R0A2SkA0TUAwT0AtUD8rTEAqQj8sQj8uRjwwSDoxSjY1STU2RjM1QDY1QDw5Oj02Oz41QEA0RTwtSjkpXkI0gEw+rlFCqzstoDIjoTYmozonnjcknjkloz4qoTslpzworj8rs0Attj0stzkquDYotTcpqjkppToqpDkppTsrqD4uq0Exq0Ivq0Aurj8sqzoosTwrv0U2xkg5wT8xvDgrwDYpyzcrzzcs0Dku0Tst1Dwv2Dou4Dgv5zQt7jEt9C4r9C4r8TAr6jQp4Tco1zon1Tok3jwn2TYj1Tgl1D0qzDsqwTUmxDovz0Y80UY/2klE6U9N81BR9EdJ8DtA9TpB+ENI5UJF2kRD0kJBxT44tzsxrjotqjwtqz0utkU1xkw/1E5F3EdD4z8+7z9C+j9G/kBK+ENK90NM+kRQ/0ZU/UJT+T5T/D5Y/0Jh/0Zo/0Np/D9p+UBq+UJw/EZ2/kp6/0t7/0p6/0h09Utw8VFz9Vx6+V97+1h3/E5x/UVr+kRs70Vp2ktnyF9wsW51a0xJkH50sJaJzLKl5NPJ7OPc6+fm6unu6ufy7eLz9uP5++H6/+L9/+f//+z///L+//b+//n7/vr3/fr1/Pf0+vXy+O/w9Ovu8ejt7+br5t3g3NbYysbFs7KunqGajpOMiY+FiJCDj5WHiZCAhox+Ly4sMC8tMTAuMjEvNDMvNTQwNzYyNzYxOjk0OjoyPDw0Pj42QEA2QkI4Q0M5REQ6SUY9SUc7Skg7TEk4TUo3Tkw3Tkw3T0w5S0k6TktCVFJTX15maWh4bW2FbGuKa2iDYFlpWVFcT0dSSEBLSD5HRz1FRTxBQDo8Qzo7Pzo3PDc0PDczPTgyPjkzPjoxPTkwODMtOTQuOzYwPDkyPTozPjs0Pzw1QDwzRT40Rz80ST8zTEAwTz8wUD8vUD8tTD8sPDsmOj0oPzwrQTstQjcxQTYyPjQyOzMwPTg0Qjs1SDk0TjIuWSwpbC8uhzs9oEZFozswojIknzEgpDknpTwpnjcknjgiojwmpDsmqj0psUEttkEvuT4uuzwtvjotvjwvsjwurDwuqTkrqTkrqzwrrT4trT4trTwssj8tsDgouT4uy0w9y0c6vDYqujImyTku0DYs1DYr1Dgs1jou2Dov3Dgu4zYv6DMs8DAt9C4r9C4r8DEp5zIn3TYm1Dgi0jch3Tgk3DUj2jkn2j4v0z0uyDYpxTksy0E3yTw1zT442UVB5UtJ6kpK6UND7D9B60ND3kNB1UQ/zUI9wj00tjourjgqqzoqrDsrrDgpwEQ41E5F3UlF4EBA6D5B90JJ/0hQ9EFH9EBJ+UNP/UdU/kVV+kBV+z9Y/kFf/0Rm/0Np/0Nr/0Zw/0l3/0t7/0x8/0p6/0Z4/0h3/0t0+k50/1p8/2GA/VV28UNk+0lr/1R23D9czUlg2HuFuHx8YUM7j3xuro6B1bOn89vR++zl+vLw+ff69/T99Oz7+uv//+r//+z//+7///P///f///v///38//77//35//r4//j2//X2/fP0+/D0+fDz8Ofq5d/h08/Ovr25ra6ooqWenaOZnaOXo6uenqaXm6OWLy4sLy4sMC8tMTAsMjEtMzIuNTQvNjUwODgwOTkxOzszPT01Pz81QUE3QkI4Q0M5SEU8SkY7S0g5TUo5UEs4T004UUw4T0w7TEo+UVBMXl1ibWx6enqSgYKhgIKogICme3WXcmuKZV97WVNtVExkTUVaR0BQQjxIRD9GQDs/PDg3OzYzOzYwPDgvPTkuOzgvOjcwOTkxOzszPjsyPz0xQDwxPzsvQTstRj8vSD8uSz8vTUAvTz8wTz8vUD4wTD8vQD0qPz4sQD0uPzsvPzsyPjkzPTo1Ojk0PDk0RDk1TTUxVi0raikthDI4njhDqz5DpjcupTcopTooqj8tqD8soDkmoTgjpDsmpTomqzwpsz4suUAvvT4vwT0wxT0xxD4yvT8ztj0ysjkurjgqrzkrsDossjosszkqtjssuTstxEI0y0U5yD4zvjEnwDIozTkv1jUr2DQq2jYt2zct3jcu4TYs5jMs7DEq8zAs9C4r9C8p7zAo5DIm2zQk0jYg0DUf1zIe2jAf2jQk3Dwu1j0v0DkuzT0y0kQ6xDUtxTYwyjs12ERA4k1J5UtJ3kM/1j0400A5zkE4xz40vjwvtTorsDgqrzkrsTstrDQmvT8z0UhA2UhD3UJA5UBE80ZM/U5V8D9F8D9F9kJN/khV/khX/EJX+kBY/EFe/0Fj/0Nm/0Zt/0ly/015/098/0x7/0l5/0R2/05+/1J9/kty+E1v/1Z1/1V1901q8EZj70tm0j5W4WR0/p+n04+OZDkybEo+pXlu0KWc9dTL/+nj//Ty//3///z/+fP//O///+////D///L///T///f///v9//z7//36//z4//r4//n3//b3//X2//T4/vP39uvv7OPk2tXSycbBurm0s7SssbSpsLaqtr6zsLitrLSpMTAsMTAsMC8rMC8rMTAsMjEsNDMuNTQvNzcvODgwOTkxOzszPT0zPz81QUE3REE4SUU6TEY6Tkg6UEo6Uks5Uk06U0w6UUs9T0pEVlRVZmRxd3iNhoaojZC5j5PDj5DGjovAh4O2e3epcG2aaWSNX1t+VVBuTkphS0dYRUJNPz1COzc4OTUyOTYvODUsODUsNjcxNzgzODkxOzsxPjwvPzwrQj0qQzwpRz8sSj8rS0AsTEEvTUAwTT8yTEA0Sz41TD82Sz41RjwzQjkyPTgyOjk0Njs0Nzw1OTw1PjoxSDQtWTItdzc4lD9Epj5Fpzk8qjswqjwrq0AurEEvqUAtpTwppjsnqz4qpzgkrTontTwrvD0uwTwtxTsuyjwwyj0zxT82vj4zujovtzcstzcsuDgrujgrujgruzcrx0E1zUM4xTguwTEmxjMpyzctzzUr2zQr3zMp4TQt4jYs4zUs5zUr7DEq8C8q9S8s9i8q8i8p7DAn4jIj2TQh0DUfzzQe1jEe2S8e2DIi2DYp1zkt1Dow1j822EU91kY+zUA3yTw1y0A51ktE2U5H0kU+xTsxxT0xwjwwwDwvujsstzkqtDortjwtuT8wtTktvzwyyUA60kM/20NC40RI7UpP9k9W7D9F7T5D8kJM+0lV/0pZ/UZY+kNZ+0Nd+0Bf+0Jk/0Vs/0pz/056/098/0x5/kl2/0p3/1SB/1R9/Upx+Ult/1N0/1Z0+E5p60Re5EZd6lhr/5ai/7W8852ejkhGay4ppmtjzZaP88jB/+Pe//Hw//z9//3//Pf+/vb///b///f///j///r///z///39//36//z4//v4//n4//j3//b4//X3//T4//T4/fHz8+nq5Nza1tHNzcrDycm/ysrAys3CydDIvsi/t8G4NjUxNDMuMzIuMTArMTArMjEsMzItNDMuNjYuNzcvODgwOjoyPDwyPj40QEA2QkA0SkQ4TUU4T0g4Uks7VEs6VE07U0w8UktBUUxJWldebGl8f36djI+4lpnMmZ7Ymp7emZjalJHUjIrJhoW/gX61eHanbmuWZmWHXVp3VlRpTUtZREFKPjw/Ozo4Ozc0NzYyNTU1NDU3NjY0ODcyPDouPzwrQz4qRkAqRz8qSEArSUEsSUIwSUE0SEI2SEE5R0A6Sz08STs7Qzk6PTc3ODc1Mzg0LzgzLzkxNzw1NzQrQzEnXTgwfkM9lkdDnj4/njUxpzsvqjwrqj8tqj8tqT4sqT4qrD8rsD8tqzglsjkouTorvzktwzksyDouzTowzzw0yz41xjs0wjkxwTguwTguwjkvwjguwzYsxTct0UM50EA3wzAmwywj0Dcv1jw00zIq4DMs5DIo5zIr6DMq6jMr7TIr8C8q8y0q9i8q9S4p8TAp7DEo4TQk2jUi0TYg0DUf2Dcj2TMj1jMk1TMm1TUp1Dgs1Dwx1j827FlR4VJK00hBzEM7ykU8zEk/yEU7wD4xvDoqvDsovDoquToptzoouDorvD4wv0EzwUE2wTwzxTw2z0E910VF3UdI5ElN60xQ6EJG6kBD8ENJ+UtU/k5Z/Epa/EZc/EZf+EFf+UJh/UVp/0pw/053/096/054/0x2/1F7/1J5/k92/U90/1Z5/117/1Nv7kRe+lRs7lFk92R0/5Ke/4uV9IOJx2Bkp01NtWpnzo+K77y4/97Z/+/u//r5//z+/fv//fr//vv///v///v///z///v9//v7//v4//v4//z5//v6//v6//j6//b4//P3/fHz+e3v8ubm593b39jS29fO3dvP4N7S3+HW3OPbz9jTxc7JPDk0OzgxODUwNTIrNDEqNDEqNTIrNjMsNzQtODUuOTYvOzgxPToxPzwzQT41Qz80SkI3TUM3UEc4U0o7V0s7VUw9VUs/U0pDU0pLXVdjbmyCgoKmkZXFmqDan6bqoqnxoaXvnqDrmZvllZjdlJXWkJHKiYm9goOxenmhcnGRZmN+WFZrUE5cSUdSRkNMQ0JKPz9LPT1HOzpAOzk6PDk0PzsvQz0tRUAsRkAqRkErRUIvRUM0Q0M3QkM7QUM+QEFDQjxGRD5MQ0FORUVPQ0hOQUlMPkhJPkdEQ0hBQT0yTDouZ0Y3g09BjUk8jj8ylDgppT4vqT4sqz4qrD8rrUAsr0AtsD8tsTwqsTgntjgpvTkqwzksyDgtzDgu0jkx1Ds1zzo0zTozyzgxyzgxzDkyzToyzDcwyzYv0zw11T410jkxzDIozjQq2Dsy2jwz1zMq5DEq6TEn7DEq7jIp8DEp8i8p9C0o9iwo9y0p9C8p8DEp6TMo4jUn2TYl0jchzzcg1Dkl1Tgl0zYl0TQl0jQo0zcr0jgu0Dcv405H6FhQ51pT2lFJzEc+xEQ5v0A3uT4vuTwquTwmuTwouTonuDkoujsqwD4ww0E0yUQ7xkA3yUA60UZD1UlI1khH2EdK30lL5kZI6EJE7URJ9UxT/FFa+09d+0xd+0tg9kRe90Rh+UZm/Uls/051/094/094/1B391Z481V29FR2/Fl4/117/1p3+1Fr8klg/Vdr9lVn6k1e9l5t4kta5lRh5VRh11hhwWVmyIN+5aun/9TR/+vo//Py//j5//7/+/z/+/z/+/z//Pz+/Pr9/fn6/ff3/Pf0//r3//v4//z7//v6//j4//Pz/e7x+uvu8OHk6d3d5NnV4tnS5t/V6+fb8e3h8fHl7PPs2+biztnVQD02PTozOjcwNzQtNTIrNTIrNTIrNjMsNzQtNzQtOTYvOzgxPToxPzwzQD00Qj4zSkI3TUM3UkY4Vko6V0s7WEw8V0s/VElDU0pNXlhmcG2IgoSrkZfLnKTjo631p7D9qrH/pqz6oafzoKTun6PqnaHhmZvWlZbMkpLEiYi0eXmfammLYF18WFVwUlBoT01lTkpjS0deRkJTQD1IPzo+Pzo2QDwxQT4vQ0AvQ0IwQkMzQkQ3P0Q9PkRAPEVEO0JKPkNWQ0lhTFJoVVxvXGJyYGRvYmJqZGBhZlhXYUpEbEc+g1NFlVhGk0o3kUArmT4rqEEurkAvrkEtr0AtsEEutEEvsj0rsDcmtTcovDgrwjgryDgtzTYt0Tcv1Tgx2Ds00jcy0Dcy0Dcy0Tgy1Dk01Dk00zgz0zYv3kE61Tgv0TMq1jgv3j013j012jkx3DUs5zIp6zAn7zAo8TAp9C8p9y0p9ywo9ywo9y0p9C8p7jIp6TQp4TUn2jcm1DckzzgjzjcizzglzjckzzYm0Dcp0jkr0TcrzjQqyzQr405H82Rc62BZ1U9GxEE3ujsytTktuD4puD4nuTwmuTslujkmvTkqwDwvxD4yykQ5ykE5zkU/1UtI00xJzkdEzUVF1khH40lJ5kNE6EVI8k1T+FNa+VJc909e+k9h9Ehe9Udg+Edk+0lp/05y/1F4/1J5/1R68FV171p3+V59/V58+VVw9U1n+U9p/1lu/1tt/2N08E1e91Rl9E9g/FVn9Uxf5FJfwF5fu3Zx15yY+snF/+Xj/+3r//T0///9/P//+///+///+//+/f39/fz6/vn2/fj1//j1//n2//r5//r5//b2/PDw+Ons9Obm693d6NrZ5NnT6N7V8Ojd+fPl//rs/v7y9Pr24evq093cQj41QT00QDwzPjoxPDgvOjYtODQrNzMqNjIpNjIpNzMqODQrOzYwPjkzQTw2RT42SUA3TUM3UkY4VUk5V0o6WEs7WkxBW05IVElNWFJgZ2SBfH6njZLKl6Djnqr2pbD/qrP/q7L/rLT/rLL8qrH5qq/zqKzsqavon6HamZrSjY3BgX+xdHKhaGWSXVqHWFJ+WFF6WVF2Vk9uTUhfQz9NPzpAPzs6Qj84Pj40QEI1QkU6P0Q9PEI+OkNCPkZIP0xVRFZuUWaDYXKOaXOOdHaPgXiNhG+AgF5siltjkldZnldVplZNpk0/n0AunDkkoDokpzworD0qrj8ssUAus0AttD8ttj0suTssujYnvjYoxDYqyzct0Tct1jgv2jkx2jgz1zg02Dk12To22Dkz2DYx2DYx2jgz3Toz5kM84D022jcw40A3/ltS/2xj/11U5z825TMp7TIp8TIq9C8p9Com9Sgl+Cgm+Cso9y0r8zAs7TIr4zEn2jAj1DEi1DQk0zoozDsmyjwozTwpzzwq0jos0jkr0jgs0Tct2kA4zzgx3EdB9GNe5VhRy0I8xUA7tzQqtzomtjwkuTwmujwmvToovzorxDwwxj4yxz40zEM72VBK31hS1E9Kwz86wD86z0hE3khH4kdF5kpL71BU8VJX705W7UtY8Uxc+VJm+E9m90tl90pm/E1s/1Fz/1J2/VJ29Fd27lh19Vh1+1t3/1x4/1pz/1du/1Zr/2J1/VZn/1xt/1ts8UZY9ERY/1Fl7lZlxmZnqmllyo+L57ay+NLP/+vn/e/u/Pj3+f38+f//+f//+v/+/P79//78//v4/vb0/vn1//v3//n2//b0//b2//X19ujo5tjY49XU3tDN4dbQ8efe/PTn/vjo//zp///z+v/56PHw2OHgQz82Qj4zQT00PzsyPTkwOzcuOjYtOTUsNzMqNzMqNzMqODQrOjUvPTgyQDs1RD01SD82TEI2UUU3VEg4Vkk4V0o5WUs+Wk1FVUpOV1FfZWJ/eXukio/JlJ3im6b1o67+q7T/rLX/rrb/r7f/sLf/r7b8r7T4r7L1qarroqPjmJjYjIrJgH+7dXGuaWWgY16YYFeOYFaIXVR/VlB0TUliRkNUQkFJQUFDPDw6QUI9RkVBQ0Q/QT9AREJFT01SV1ZkY2iGcXWaf32ih32fkn2coHuapXCKpGB1rFlptlZhulFVuEhGsEA0rDsprDwmrT0nqDgkqDclqzgmrjkosDgnsjkotTcouDYouzMlwjQoyjct0zoy2Twz3j013zw13zw14T453zw33zw34T455UI96EM950I85kE75UA65kI55EA33Dgv1TEo2DYr60k+/1tP8UA27jYs6isj7ikj+C0p/y8t/iwr9igo+jAu9TQv7zYx5zYu3jMp1jIm1DIlzzYmyzonyDsnyjwozToozzkq0Dcp0TUp0DQo0zkvzzUt1D025VBK5VRR20xIzUI/tzEovDsouz0mvTwnvjsnvjkowDgowjosxDovyD40y0I41U9G3FdQ0lJJw0Q9v0M7zEhD20xI30pG5U1M61NS7VRX61BW6U5W7E9a91Zm+FVo+VNp+lJr/FJt/1Nx/1N0/1J18k1t+FV0/1x6/197/1x2/1Vv+1Jp+1Jl/FVm91Ji/1po/1po805e+FNj/llp31NetmBfl15XtoF92aml7sjF/eHe+enp/fj1+vz5+f//+P//9//9+v79///9//v7//f1/fj0/vn1/vn1/vbz//f2//X19urq6tzb5NbT3dDK39XM7+Xb/PXl//nn//3p///v+v/46PHu2+HfRUE2RUE1Qz80QT0yPzswPTkuPDgtOzcsODQrODQrNzMqODQrOjUvPTgyPzo0Qzw0Rz41SkI3TkQ4UkY2VEc2V0c3WUk8WUpDV0tLWFBdYl55c3WchYrCkJncmKTwoKv6qrP+rbX+r7f/sbn/s7r/tLv/tbn/tbn/r7L5rKz0o6PrmZfgjo3Tg4DHeHW8c22za2CiaV2bY1qRXVeFVlJ3TktoRURWQEBMODU8QTxAS0FCTEBCUT5CWkVKcFddgmNzmHKXpXqnrn+rsnujuHacwHCTwmODwFRuwkdc0Etc0UhQxDw8ujUuuDkqtTwnsDwlsDsnsDspsjoptDsqtzwsuzwtwDwtxDwuxDYqyzgu0zwx2T8130E44T434Dwz3zo03Dcx2TQu2DMt3jkz5kE77EU/6UI85D014zw02zQs2DQr2zct1DInzCwg1jYq6Uc69Us+8kA27zQt8C0p9iwq+iws/Cws+Cos8Cop7C8r6DIu4zUu3DQr2DEo1TEn0TMnzTcoyzopzToo0Dop0jsq0zoq1Dgr1Dgs0TQr1jw01To11Tw35U9O7VlX2UVFwjMvwDssvzwowDsqvzopwTkpwDgowDgqwDgsxj0zx0E2z0pB2FVL0lJHxkc+wEQ6x0c+1ktE2ElD3UxJ5FNQ5VNU4lBT4k1T5U5X8lhk9lpo/Vtw/lpy/FZu+lJs+1Fs/1Fw/Udt/1B2/1p9/1t7/1Zy/VRr/ldr/1xt+1lo+Fpo+2Ft9mBr7V1n72Zu7GZtyVxfoF1Xe09GmG1mwZiU3bq28NTR9ODf//X0+fn3+f/9+f//9//9+v79//////3///j5/Pn0/Pny/Pn0/fj0//n2//j2+e7s7+Ti5drW29DK3NLI7uTY/fbk//vo//3n///t+v306vDs3uPfSUU5SEQ4RkI2REA0Qj4zQDwxPzswPjovOjYtOTUsOTUsOTUsOjUvPDcxPjkzQDs1RT42SUA3TEQ3T0Y1UkU0VUU1V0c4V0k+WE1LWE5XXlpxcHCWgIa6jJbUlaHpnan1qLD5qbH5rbP9sLf/sbf/srn/tLj/tLj/r7H8q634pafyn57ql5bijIvXgoHNfXnFdW22cGeqZmCeX1qQWViEUVF1R0djQT5RPTVESDhCVD1DYEBFbkNKgE9Vll1kq2Z4v2uPyW6ay2+YyWmPyGCDyVd4xklnxDtVxjJI2UFQ4EVN0Ts8xjcxxD8wvUAssTokrTYirTUkrjUkszUmtjcovDgrwzstyDwv00A210A32kA23D823j013jkz3TYu2zQs0y4o0i0n0y4o2DMt4To04zw04Tgx3DUt3DUt0CwizSkf2Tcs4kI23D8w0DQlyy4f6UY380k8/Ug//Dw39C0q8SMl9Scp+y8y8S0u6y8u5DIu3jMs2jEq1zAq1i8p0zAn0zcq0jkr1jor2Dwt2j4v2z8w3EAz3EAz0jYq5kxC5UpFzjUw30dG81pc30lL1UE/yDwvxDsrwzoqwzoqwjoqwjoqwTkrvjkqwjwwwj4yyEY5z09CzlBExkg8v0M3wUM3zkg/0UY/1UpF21BL3VJP2U1M2ktN3EtQ61hg81tn/GFx/2F1+lht9U9n9U1n/05r/091/1J5/1V3/1Rx/FRt/Vtw/2N1/2p4/2d1+mJv9WFt7WRs42Zs2WhqzmdotWZhjV5UZUc8f15VqYiBzaup5cfF79rZ//Pz+fj2+f38+P//9///+/////7///z///n6/vv2+/vz+/r1/vv2//35//v4/vTy+O3p6t/Z3tTL3dPJ7ebW//jl//7o///m///r+Prv6u/o4+bfTkg6TUc5TEY4SkQ2SEI2RkA0RD0zQzwyPzgwPjcvPTYuPTYuPTYwPjcxQDkzPzo0Qz44RUE4S0M4TkU2UUQzUkUyVkY2Vkg7Wk1HVk1SW1dobGuLfoKxipPOkp/jmqbupq73qa/5rbD9r7P9sLP/sLT+sLP/r7P9q677qKv4pKf0oKLvmpzpk5XiiozZhoXRg3/Je3W7bWusZGWeX2GSWVuEUlFzTkhiV0ZZX0NRbUJMgUVNmE1UrFVdvFtiylpo2VJw4lJ131R12VBs0kpizUJXxzhKxS4/1DhF40NL5kdL2D4+zT42zEY6w0g2tj8rtz4tuD0tujwtvT4vwz8wykI00EQ31UU62UU52kI32z412Tsy2TYt2TUs2jMr1zMq1DEq1zQt2jcu3Tkw3zgw3jcv3TYu3DUs1i8m2TUr1zcrzzIjzTEi0jkp1T4t1Dsp2Dwt5kQ3+EpB/UQ/+TY09Sot9iot9y8y9zY37TU14jMw2jEs1zAq1y8s2TAt2TAr4zgx5Dkx4jox4jsy4Dww3z0w3D8w2j4x0Tcr71dM+GFa0zs20Ts65lBR3EZI5lBRzzw0yjovxjgsxTksxDotxDwuwzstwDssvjotvjwuw0Ezx0g5x0k7wkQ2vkAyvD4wyUY8ykU8zklC1VBJ11JN1U5L00tL10xP6Vpg8F5o/GZy/2h4/F1x8lBl801l/U5r/1Z6/1R4/1Jy+FRt9l1x+2h4+2p392Vy/GV0819t7GBr6mty33J1w2pmqmRcnmxhfWZWWEg5a1hKlHxyvaCc3sLB7tbW/u7v+/X1+/v7+///+f///f7///7///v///r9//75+/71+/z2//75///6//76//v1//fy8ejh5NzR4dnM8OnX//rk///m//7l///q9/nr7fDn6OnhUUs9UEo8T0k7TUc5S0U5SUM3R0A2R0A2QjszQToyQDkxPzgwPzgyPzgyQTo0QDs1Qj84RUI5S0U5TUY2UEUzUkUyVUYzVUg3WUxDVUtMWlNjaWmFfIGriZPIk57emqTrpqz4qaz7rK39rbD/rrH/rrH+rbD9rbD9qaz5p6r3pKjyoqbwn6Ptmp7olZnjkpTekpLaiYrNfIDAc3iyb3WpbXCdaWeOal99eV94gldqjlBfo09cu1NczVRd1lBX20hS5UBR6D9S5ENS3ERQ1kNLz0BEyjk8yTQ25EpM50lK4UFB1Tc0zjk1zkE4yEQ4vj4xw0U2w0U2xUY3yUU4zkY40Uc610c82kc91j4z1Tsx1jgv1TQs1jMq2DQr2zQs2jYt2zgx3Tw04D003zwz3Tkw3DUt3DUs2zct0i4k3Tsw2j0uzTEixi0dzjcm0j0pzTomzDkn1Dgp4jov8z05/0BA/zw+/jM38ywv6iwu4Ssq2Cop1Cso1y8s3jQ05Dg46Tk57zc18Dc07jcz6Dcx4zct3DYq1zUo0TUmzTUo51BF/21j20hByDQy10ND0z5C6lZW2UE80j40yzguxjYrxjotxjwvwz4vwT0uuzkruzwtvj8wwEEyv0EyvUAuvD0uuzwtw0M2xEQ5yEg/0FBH01JM0E9J0k5M1U9O6V5j7mFn+2l0/256/2R19VZq9VFp/1Vv/1d2/1Z0+lhw8V5w9G559neA7Wtz3lhh8WBt8WBt7GJv73N97IiKzIF8qnRomXlqc2tYT046X1ZHg3Fnr5aS3MC/79XY/Onr/vT1/fv8/f7/+v7//v3///3///v///n+///7+f/1+v32///6///6///4//33//72+fDn7eXa6eHU9O/c//vl//7l///j///o+frq8vTn7vDlU009Ukw8UUs9T0k7TUc5S0U3SkQ4SUM3RT40RD0zQjszQToyQDkzQTo0QTk2QDs3QUA7Q0M7SUU5TUc3T0cyUkYwVUYxVUg1V0s/UkhGWFJeameCfYGniZPEkp7amKLnpKf2pqf6q6n8q6z+rK3/ra7+rK77rK77qKz2pqr0pKjxo6fwoajuoKftnaTom6LmmZ7ikprbi5PSho/Kg43ChIi3g4GoiHmaj22ImmN6qVhpu1Ffz01Z4ElS6EFJ6j1B6T074z443UM51kg6zkk4xUYzwkMwxUAx5FRJ4Ec/2js32DY02Dg42Do70Tk4yDc0wDovvjwuvzsuwDouwjgrwzcqxjQnxjImzjQq0DMq0TMo1DMp1jMq2TUs3TYu3Dgv3j0z2z0y3Dsx2zgv2zct2jYs2DQq1zMp1TMm0zMl0DQlzzYm0j0p0T4qyjkkwDIcyDomyjQl1TEn5zUx+jw8/z1A/zc99zM36i0x4S0u2S0t1y8u3DQz4zk66Ts98Dk99jI2+DAz9DAx7TEv5DEq3jIo1TElzzMkyTEk0T0x+mpf5FRMyDk10EA/yzo95FJT5EpI3EM90TozyTYuxjguxTswwjwwvz0vujsqvD8tvUAuvD8tujsqujsovTsrvjwsvD4wvD4ywEQ4yExCzFBIyk5GzExJ0E5M6GFl7GFm+Ghy/297/2h491pr91Vq/lpy/1lz+1107mFy5mp0632A8YeJ6Hd52l9k8Wd0/m1882V162x39pGV7KKfxJSKoo18aGpVSFE8V1VGdGhcpIyI27++8tXZ+ePm//P2//r8/v7//P3//vv///z///r///j9///7+f/19/3z/f/3///4//32//33///2//nv9e/h8uzc+vXh//3n//3k//7i///n/f7s+frs9/frVk8/VE4+U0s+UEo8T0c6TEY4TEQ3SkQ4SEA1RkA0RTwzQjsxQjkyQToyQzozQTw2Q0A5REQ6SkY6TUc3T0cyUUYwVEgyVUg1VUk9UUdFV1FdamiAfoKojJTFk53YmaLnn6Dyo6D3pqP6p6f9qKr/qav+qaz9p637pav1o6ryo6fuoqfrpKntpqnupajto6fumKDolKHllJ/flJ/XlZvNmpW+oIyvqoOgpWV/tF1wwlFj0ElX3EJO5T5G6zxB7Dw86j8440E03EU01Ek0ykkzwkYuv0Iswj8t4lNF3kQ83Tk35j4+6kRG5UBE2Tg9zjY1zUI7yEQ4yUM4x0E1xj4ywzkswjYpwjInxjIoyzMozjQq0zUs2DUu2TQu2zQu2zQs5EI33T0x2Tcs2jYs3zkt3zkt2zUp1TEl2DgozTIgyjEhzzkozjgnxzQiyjcl1EMwyDcmzjgq1zYs3jUu5jMv7jUz9jo5+z8+/0xL+khG8kJC7D496jw95zc65TI25iwx9Csx+Ckv9Cwu7y8u6DEr4DQq2TUp0zcoxjAhwC4f9GRZ611Tz0A61ERDyzs7301N6lJR4EhF0zs2yTYvxjguxjkvwzstvjorvjwswUAtwEEuuzwptzgluDkmvTwpvj8utTcpszcruD4xwUc6xUtAxUlByElCy0pF5WFf5l5g8WRq/m53/mt1811p8Fhl+F1t+l5z9WJ06GRv42xy7H5/+Y2L9oaF6XFz+HJ5/3mG9WFx4Fhm9oiR/7S00K6ioJuHXWpQRFI5UVQ/amJVm4iB2sC/8tjZ9uDj//T3//r9//7//fz//vz///3///v//vn9+//69P/y8v7y+f/0/P/2+/3y//30///0///z+/Xn9/Hh/vnl//3n/vzj/v3h///q///x/f3z/PzyWE9AV1BAV04/VU4+VEs8Uks7Ukk6UEg7TUM3S0M2S0E1SEAzSD4yRz8ySD4yRkA0R0M6R0U5Skc4Tkk2Uko1VUo0VUo0Vks5WE5EVUxNWlRia2iDe36niY/DkZnXmJ/no6T2paL5oqL8oaL8oKT/oqj/o6v/pK38oar1oanxoajspajtqqnvranzsan2rKn4oKn4l6fykqHilp/WpqPOtp6+uYWcuGd6v0xd0UVS3z5N5ztH5zxE5j1C4EBA4EBA4j4/3zw93UVCyTo0ykQ5ykY6ujEp20pF6EpJ6UNF6z5C6Ds/5jw/4T0+2jw91Dw7z0I7yD83ykQ70U1BzUs+vz0wuDYpvTksvzcrwzYsyDUtyzIq0S8q1C8r2zIv3jUu50E13zkr2TEk3TMm5Tkr5zst3zgm1TIfzzIfzDQfyjUhxzQixzQiyjQlzTUnzzUpyjAmzzIp0TUp0jYq0jQo1TMm1zMn3DQp4DIp5jMu6zUy6zMz6S8y5y0y6C007S419i0z9isv7yss7C8t6jUu4zks2Tco0DQlwy0cxDMi51hI6VlOyzsz305JxTQx2khI4U9Q3EpK1ENAzDs2yDgwxjgsxzkryDwrxTwqwjsovjkmvDsouzwpuj0puj0rtzwstDgstTswuT0xuz8zuz8zvkA0wEA1xEE372ph9XBp6mNf9G1q+3Fx7GFk9Gdt/3B5/2x6+2h48GRv6WJp62Rq7mxu7nFv7nFv+3l7/32F+Vps/GN332Jw+6yvtqqafZF1XXJRSlk6TFI4c25apZWIy7ew7dXT/+7w//b3//f7/fj8/Pz+/v///v////7/+//+8P/05f7p5vvq7//u+P/2/P/0/v/z//7x//3x//vu//rq//nm//nj//nh//nh/Prl///1///7///7WVBBWE9AWE9AVk0+VUw9VEs8U0o7Ukk6TkU2TUQ1TEM0S0IzSkEySkEySkEySUE0R0M4SEQ5TEY4T0g2Uko1U0s0Vks3VEs6WE5FVUxNWVVja2iDe32mhozAjZXTlprhn57sn53xnp70np/5naL9n6b/oKr/oaz7oKz0oKvtn6fooqXopaTqqaPtq6DupJ/voKf3mqbwnKHho5zQsZjAv42qwnGExFRi0UNP4jxG7DhB7zc/6jo95Tw/3EBB20FD4DxD2jk/2kFEyzs7zEI/ykA9wTMx5U9Q5kNG6D9E6jtC5zg/4jg72zg51To4zzs31EU/xj01xTw0zEc+zExBwUM1uDostzkruTcqvzcrxjYtyzQt0TIu2DMv4TUz5Dg05D4y4Tst3jYp3zUm4TUn4TUn2jUi0zQf0TkkyzkixzklxzomyTwryzwszDgszjQq1TMu1jUt0zcrzzcpyTYmxzQiyzQhzzQi2DIk3jIm4zAr5i4s5iwt5iwv5i0y6C4z7Csu7Swt7DAu6DIu4DQq2zUn1Tgn0jkn1T8uuyoZ1kQ10D4x2UY+61ZQ2kI/2EJB51VW4lJS3EtI1EM+zT01yTkuyDkrxzgoyDsqxDsovzonvTwpvT4ruj8tuUAvtj4usjostDswtz0wuD4xuj8wvT8xwUIzxUM162lc8m1k52Jb8Gtm9W9s6GJh8Wts/HR4/3F+/2989mly7V1m6llg8WJm93Fw/np4+3Z3/3h++VJk/ltw5F1u9qapqaaTaoxrWnRPTl87U1o7dXNcqZ2N1sS49uHc//Xx//r6//r7//v8/Pz8+v79+//++v7/9f/67f/z4f/p4f3m6f/r8//x+P/y/f/y///x//3v//3t//rp//bl+/Pg+vLd/PTf/Pfk/frz/Pz6///9XFBCW09BW09BWU0/WEw+V0s9Vko8Vko8U0c5UkY4UUU3T0M1T0M1T0M1T0M1TUM3SkM5SkY7TUc5UEk3U0s2Vks1Vks3VEs6V01DVk1OWldia2mBeXuhhYm5i5HLkZbWmJjemZnjmJnpmp3um6D0naP3n6f4oKn0oKrvnajonKTjnKLgnp/gnp3hnZnjm5nilpvfmprapJXQsYzAv4Ksx3KTyVlxx0JT10FM3z5E4z0/5T095Tw/4z0/4T5B4T5D4DxD1zg91T9Bz0FAykM/wzw4xDk26VdX4EJD5D5C6Ds/4zk83DY41jY20Tk2zDs21UhBxDsxvjUrxUE1zUs+xkg6uz0vtzgpujYpvzcpxzcszzYu1zUw3jcx5jk16T051zMq1zUq2jYq3DYq3TUq3Tcp2joq1z4sxTQhvzQfuTQhuTYivDgpvTgpvTMowC0l40A75T443j0z1TwuzDkpyDckyDcizDcj0jcl1TMk1y8m2S4n2y4q3C4t2y8v3C4v2ywp3zAr4DUt3DUs1TMm0DQl0Dkm0T4q1EEvwjEg51NF0jsw2kE73kM/6EpJ8FRV7VVU51NR409N3UpD1kM7zzwyyjgrxTYmxDcmwDclvDcmuTonuTwqtz4ttT0ssj0ssDossTsvtDwutT0vtz0uuT8wvkM0w0U33FxR6mdd5GFZ8Gxn9nBt52Fg7GZn82px4FJe715r9Whx8mVt8WBn9GVp+XFx/nh3+nR1/25180pd+FJo5Ftt8Zyho5yKYYBgVW9IT2Q9V2BBd3ddraWS4dHC/+7m//jx//z4//76/v/6+//8+//9+//9+f/78//26P/u3P7j2vje4fnh6Pvl7/zo9v3r/f7s/frp//rq//fm+vHg9OjY8ufV9uvZ+PHh/vrx/fz4//77XFBCXFBCW09BWk5AWU0/WU0/WEw+WEw+VUk7VEg6U0c5UkY4UkY4UkY4UkY4UEY6TEU7S0c8T0k7Uks5VEw3V0w2V0w4V0s7VkxCVU1LXFZgamh+eXmbgoWyio3Cj5TOk5XSlZTWlZXblpjjmJvomJ7smqLtm6PrnKXomKLflp/alZvVlJjVk5fWkpPWkZDShYS9kYO2pX2xt3OiyGaP0lZ61Udh1DxL3kFK4EJD3kNB4EI/4UFB5D9D5z5F5z1G4z9G1jo+0T9A0UVExkE8ujYxxT466lpZ3UFC40BD5j1A4zo92zg50zk30Dw4zkE4z0U7wjouuzIowDwvx0U3xEU2vT4vuDkovTgpwjkpyzgu0jov2Tgw4Dkx6Ds36z442DEr2TIq3DMs3TUs4DUt3zcu2zku1j0vyTcoxjopwTwrvjwsvzsuwTswxTw2zjk160NA7UA85EA32T0xzzkqxzklyDomyTslzzwo0DcnzzEl0TEl1DEo1jMs1DEs0S8q0zIq0zUs0zcr0DcpzTUnyjclzDsozD4qzDsozzws9F5Q4EY80jMv0i4s5kBA+1dY/3Vz/3Jv/2pn9l5Z51BH1UE3xzUovS4gxDgnwDgouzgmuDsptzwstT0tsj0ssDwtrzsurTwusDwvsDwtsTsttj4uvEIzwEY3y01B32BX4mFb9HBs+HRy5mBh5F1h5l1k1khU51ll82dy9Gdv9mVs/Gtw/nN2/nZ2+3Bz+2Vu8URY9Eti5Vhr65KWoJWDX3pZUWxDU2g/XGdFeXxfsKqU59zK//Xo//nw//vx/v70/f/3+//6+f/69v/48vzz6vvr2vjezvPSyuvMz+zO1+7S4PDW6fPb8vfh9vXh+/bj/PXj9ezb7eHR6d3N7eHR8ejZ/PXt/Pfx/vnzXFBCXFBCW09BW09BWk5AWU0/WU0/WU0/V0s9Vko8VUk7VUk7VEg6VUk7VUk7U0k9T0c8T0k9UUk8U0w6VU04WE03WUw5WEw8VUtBVUtJXFVdaGV4dXSTfH6lhYe3jI/CjpDDj5DIkJLPkJTUkpXck5fglJjflZrelZ3ckpvWjpTOiZDHhYvFgYfDfYPBfn+4fXSfjnCUqGePwVyE1k524kFj6DpV6jlL5kFH4EVD3EdB20dD30VF5kFH7jxK7T1K5kJJ1z5A0EA/0ElFvz44szIsyEM84FVQ3ERD4UFD4z9A4T4/2j891EA80UQ7z0Y8xz0ywDgqvTUpvTkqvz0tvz0tvTsrvTwpwjoqxzsqzzsv1Tsv2zgv4Dgv5zgz6To15jk15DUy5DIw5jIx5zMy5jQw3TIr1DAnyzEnyzctyDowxDcuwTQtwzQwzDo73T9A6zg77Tc25Dcx2DUszDQmxjUixDcjxTolyz0pyzgmzDQmzjUn1Dgs1Dow0zkv0Dgt0D4xyjstxTgnxDclxjknxzwpxzwpxzoozT4tzToq2D4y4UM61C8t5Do64DI03zU21zUz1js23kM+5UtD6lFJ6lNI6FRI5FVHyz8wxD8uvjwsuD0ttz4ttD8usD8vrj4wrDwurDwurDwurD0srTwssT0ut0EzukQ2xkxB3mJY4mNd8G5s9HJy5WBj5WBl52Bn92t2+29692t27WBo8F9m/Wxx/3h7/3l8+m1z+F5q80FX9ENd6FVo5oeNo5ODZ39dWXRJXnVJaHdQgYhms7KW6OLM//rp//3t//7v/f/y+//0+P/09P/x7fvq5PLh2O7XxejHu+S8ut66v968x+DAzeLD2ObM4+vT7O7Y9PHe9/Lf8+rZ7ODS6NrN6tzP7+HW8ujf8ejh8uniW09BW09BW09BWk5AWk5AWU0/WU0/WU0/WEw+WEw+V0s9Vko8Vko8V0s9V0s9WEw+UUk+UUk+U0s+VUw7WE05WE03WUw5WE07V0s/VUxHWVNXZV5ubmqDdXSWfn2lhIWxhom0h4m5iovBi43IjY7Pjo7Uj4/Vj5DTkJTTi5DKg4jAfIG4dXyyb3ataW+rbGqcgGyIk2N5rll2y1Bv40Jk8DdW9jRM9zhI70BF5UZC3UpD20pF4UdH6ENK8j1O8D5M5ENJ10NDzEE+zklEujs0sDQsyUlA1UxG2EJB2j892zs72jw72EA91EU/zUc8y0c6wDgqwTgowDgqvjkovDknuzgmvToowDsoxDspyj0s0jwu1zsu3Dgu4TYu5DYv6DUw6TMy6C4v6Sww7jAy9TQ39Tc37jQ15jIx2i4q1zQv1TYy0TMyzy8x0i802zY96jpE7TA27jAy5jMv3DMs0TUpyjcnyDkoyTwoxjgkyTYkzjYo0zos2j4y3UE13UE12EE200c4yUExwjsowDkmwzwpxj0qxTwqxTgmzDorzTcpzTAn5kM82zIv7z9B4y8y2ios1TEv0jUu1Tgx1jkw0jguzDUqxjImwDEjzkU1xkEyvD0utToqsTkprzkrqzosqjosqzsvqz0wrD4vrDwuqzwrrTwssj4vtUEyyVNH4Gde4GNf6mpp7m5v5mNo8Gpx9W94+nF7/XR+9m117mJr9mRu/3J6/3h+/3F1+mlw+Fdm+UFZ9EBb6lFm4X6DrJeGeY9rbYhdb4laeYpgjZdytreY397C+fTe/Prl///v+//v9f/v7//r5/rk3O/Z0OPNxd7BsNatqNOmqtCnsNOrttSuvNaxx9q60t/B4ObM6OrU8u3a8unY7uLU7NvR6tnP7NvT6drT5tnR5djQW04+W04+W04+W04+Wk09Wk09Wk09Wk09WUw8WUw8WEs7WEs7WEs7WUw8WUw8WU0/U0k/VEo+VUw9WEw8WU46Wk06Wk06WU48WU0/VUxFWE9SX1diZF9zamaBc2+QeXmdfH6kfoCpgYKyg4S8hobGiIfLiYjMiYjKiIjIg4O/fH21dnetcHGna2ykZmegbGCOgmBxlVZes05e0kpe7EBY9zZL/jNG/jlD8z9C6URA4UhC3klD4kZJ6UJK8j1O7z5O3UFF1EZEyEE9yUhCtDovsTcszk9GyUI8zj040DY0zzEw0DUx0z44z0U7yEY5w0Q1vjkowzoowjoqvzonvTglvjkmvzonwTomxDkmyzop0zos2Tkr3Tcr4TUr5DMr6jMt6yor8Sot+C0z/C80/zE3/zM3/zM4/TU4+Tg79Tg88jk+8jlB9DlE9zdG+zZI/jVF9Cs19C0y7TEy4zQv2TYt0Dgqzjsrzj0syzUm0Tgq2Tsv3z0y4j405D005T4130E22Uo8z0c3yUExxDwswjkpwjknxjgqyDkpyTIn0zkv4UA460Q+3jAv4C4u6zQ26DY22DMt1Tcu1zkw1zox1Tsx0jswzTowyTsv1kw/zEY6v0AxtDkqsDYprDYoqzcqqTgqrDstrT0vrj4wrT0vqzwrqzwrrTwusT0wwEtB2mRa3mNe6Gtp8G9z6mlu9XJ6/HZ/7mZw9295+XJ59mpz/mx2/3d//3Z9+Whv+WNu91Ji/kJb9zxZ6kth3XR7tZqJjZ56fZhre5dmgpVokZ11rLKOy8yt4ODE6ezR7vbe5fPZ2e3Rz+bJxd7AvNW3tMuuqsikmsGUlsKPmcOTociZp8udrMuhtc6nwdKwztm72d3E5ePO7OXV7+HW69rS59LN49DK4M/I2szD1ce+W04+Wk09Wk09Wk09Wk09Wk09WUw8WUw8Wk09WUw8WUw8WEs7WEs7WUw8Wk09Wkw/Vko+Vko+WEw+WU48Wk08Wk06Wk06Wk08W09BV01EV01MXFJaXlhmYl1xamZ/c3CNd3aWeHicfHungX61hH+/hYLFiILIiYTHgn2/f3m3enWteHGndm+ldGuicGegemGLhFFamUhFs0VI00hP7kJO+DpG/jZB/jlA9T097kE95kQ/40VC5ENI6EFL7j1N6z9N2D9C0UdExUE8w0c/sjkuszov0VVLwz41yTgzxy8sxSomyC8qzTozzEM5w0M2vD4vwDsqxDspwzwpwTonwjsowzwpwjsnwzglxDUkyjcl1Dgp2Tcq3TUq4TMq5TMp6jIq9TMz/zU4/zg8/zQ6/y0y/ygt/ygt/isx/C0z9ikw8iYx9yk2/yw//ypB/CA58xov9iIw8ygu7Swx5jAv2jEs1DMr0TUp0DYq1DYr3Tkw5j026z436zo06Dcx6DUw4jky30g910s800U3yz0vxDYowjMlyDYpzzgtzjQq1DYt5kM83zgy4DIx0iAg7Dg55TYz1TEo0jQp0jQpzzUpzjYryjYqyDUrxTcr41lO2FJGykg7vkAytzsvtTsutTwxtTwxrzktsTsvsT0wsT0urzssrTkqrTksrjotsTwy0FlR3GJd7HBw9HZ57m1y9XF89nJ9/3qD/3+J/3mA9Ghx92Vw/3F8/3V//2t0+F5q9k9h/0Fe9zhX6Ude2250up2LmamEgp5ufppngZdojZxxoamCtLqWyM2t1dy9zNm7wdS0ssypp8KfnryYmraQlrKMkLGGibOBhrV+jbmElcCLnMKPn8SRqMWZssihvs6qydK12tnE5t/N6t7S6dbP4czJ28bD1MG7zr21yLewWk09Wk09Wk09Wk09Wk09Wk09Wk09Wk09WEs7WEs7WEs7WUw8WUw8Wk09Wk09Wk09Wkw/Wkw/Wk09W049XU09Xk88XE88XE8+WU09V01DV0xIWE5PWlBYXVViYFlpYVxyamaBb2uOc3CbdnGne3Wzg37BioPJioPHiH/Ain68iHmyg3KohnKnjXSrh2yjhlyEkEhMpEI5tkE6zUNA3kA/6Do79Dw+/0RF9z488z087D496kBB60JJ6kNN60FO40FM0D4+xUA5vj82tz4zsDwvsjwwwEQ40k1ExzYx1Ds2zTIuzDMu1kM7xz8ztTYnuz4sujclwTonwzwpwjsowDklwjkmxTonxzooyzon0Dko1jYo2DIk2i4i4C8l7Dcu9T019Tgy9zQw9zAt+Coq+yYo+yUn+yUn+yUn+yYq9yEp+CIu/yc3/yg+/yE7/xg2/Rcx/yc47yMs5iMr4yst3S0t1Cso0i0p3DQx4jYy6DY07jY28jY18jEy7y4v7iws5S8s3Dky0Tox0jkx7FNLuyIaxCsj30Y+yC4mzS4o3jw36EVA4jo32C8q2i4q4jUx5Tw33z401TwuzzUpyzMmzDUqzTsuyzswxTgu7GJY4FpPyEM6uTYsujovuDgtsTMntDYqsDAlsDImrjImrzQlsDYnsjoqtDwusz0xsDowukM71lxX7HBw8XN29nh8+3mD9XF8/3yE/XeA+nR9/HN7/3J+/3J9/214/2dz/GBu9Elc/z5c/z5b5EFW1GVrtJWAkqF6g51tfZlmfpRjh5dqlJ93nqaBoKiDnKiEkqN/iqN8gJ92eppxeZpvfJ1ygaB2g6R1gq13g7N5i7h/kbyEk76Gl76HnL6Mor2Qp7yTr72avsKnz8y539PH49LK3MfE1L+8zLq2wbKruaqlWk09Wk09Wk09Wk09Wk09Wk09Wk09Wk09WEs7WEs7WEs7WUw8WUw8Wk09Wk09Wk09Wkw/Wk09XEw9XU09XU47Xk88XE88XE8+XVBAW09DW05GWU5KWlBRXFNYX1VeX1dmZFx0aWKDbmeRcWqdeHCsgHm8h4DEioHEj4DBkH66jXSrjG6il3GkoXWommqemVd7nT1BqjUrsTUrwjwz00A43T446D8680E99T079Ts89DtA8T5C7kBJ6EFJ4kBL2kFGxzw5vT00tjwxsTsvqzosrjorvUE10EpB2kdA3EE91DYz0DUx1UA5zUM4uzkrsjUjvTgnwjsoxD0qxD0qxDsoxjsoxzooyjkozzkozzYm1DIl2jIl4zUq6jgu7zgw8Dkx5zEm5y8l6i4l7ywm9isn+ysp/iwr/y0u/Cot+iUr+iQu/yc3/yQ7/xw3/xQz/BMw9R4w9i459TM85Sox2ygs3C4w3jAy2ysu8To+9Dc99zQ69jI29i80+DAz+TI19Dg32zIt2js11zgy5EU/5EU/zi8r0TIuwSIe1DUx4T866EVA4D042DMt2TIs3TYw3Tox1DouzzkqyTUnxzUoyDkryjwwyjwyxjkv7WNZ4VhOyUA4ujQrwjkxwzowvzYswjkvvzUrvjQqvTQquzUpuDYptTUotDYosDYptDswu0I501lU6Gxq73F09nh8/nyE+HaA/nyE/HmB+XZ+/nV//3N//3B9/2t3/GRx/V9u9kld/z5c/z5c6UNZ02Voro53iZhvepVidZJceI5df5BjipVrjZhwi5VwhZRtcIddbIldaIlcZ41ea49fcZVleZtpep9rgax0hLF2ird8jbt9kLx/k7yClr2Gm7uJm7WGobOLrbaXvr2oz8a32Me/1sG8z7y4xre0uqypsqSjXEw8XEw8XEw8XEw8XEw8XEw8XEw8XEw8Wko6Wko6Wko6W0s7W0s7XEw8XEw8XEw8XEw9XEw9XUs9XU09XU47Xk88Xk88XE88X1JBXVFBXFBEW05GWk9LW1BOXVFTXVJaX1NnY1h2aF2Fa2KRc2ukf3a1hn2+iX29l4XBmYC3m3apnnCernWiunaltWmYsVJ0uDxEvjUtujQrwDwwy0M300U520M45D858T089zo++TpB9j1F70BH5kFI2UBFz0BCwDs2uDkwsTkrrTkqqTgorTkquz8zz0Y82UQ+1zk22Tc02js33EM93U9Fzkg8tTMjvjkowTonxDspxj0ryT0syDwryTopzDkpzzcpzzIj0y8j3zQq7j0z9D828Tkx6TQr4DQm3zUm4jIl5S8k6ywk7isl8Sso8iso8yst8Cgr8iYv+Cg2/iU6/R03/BYz+Bgz9CU38jA78zVB8jhD8DtE8DxF6TU+5Cw28DI88y879i459i039S4z9S4x8y8x7TQy3DAs4j052jY03zs5/21q5UNB0S8tzi8s2To330A84EE72zw21Tcu1jUt1jUr0jYqyDYnwzYlwjYnxDgpxTsuxjwxxjwxxTsx62BZ4VRNyTwzvzAoyzsz0T42zjsz0j022D041zw31D02zzwyyTsxwzkuvDYqtjYpuTsvvEA2z1RN42dl7W9y+Hp+/4GI+3yD+3yD+3mB+3iA/3eB/3OB/259/2d2+2Bw/Ftt9Ude/zxa/z5c7EZazmBhnn5ldoVaaYRRaIVPbYNSdIVYe4hdfYheeIRccYJYYHpNX39QYYVVZY1ZbpVgdZxnfaBqfqNtg6xyhLJ0iLZ4i7l5i7l5jbl6kbp+lLqBk7F/layAm6mGqa2SurWix7muy7iyyLa0uKysqqGioJeaW0s7W0s7W0s7W0s7W0s7W0s7W0s7W0s7Wko6Wko6Wko6W0s7W0s7XEw8XEw8XEw8XUs9XUs9XUw8Xk09Xk07Xk88Xk88Xk88XlFAXlFAXU9CW09DXE5FW05GXE9JXU9PXlBfYlRtZFl7aV6JcGecfHSthXu3iHuzmYW6pYW0r4CquHqhxnif0XWczGOMyE1s3EZS30FA1UE9z0U7zEg7zUc700U53kE67kBB9TxB+j1E+D9H8EFI4kFG0kBBxj88vz82tjwxrzkrqzoqqjkprjgqvD4wzkQ61Tw31TMx4Ds55UE/4UQ/6FNM31VKvzorwTkpvjckwDclxDspyT0syj0syzkqzjgpzTQm0jIm2TIp5Tkv8T439T428DUu5C8m4DYp3jYp4DQq4zEn5y4p6i0p7Coo7Coq6iks6Ccs6ycx8ik59iY89yE7+x49+yVB+zZI5Cg25y48/1Bc/2Bs/1Bc8jxJ8zlH6Ck47So48S059DA68TI36jAx4Ssq1ygl2DAt2jcy1DIv5UNA/3Nw9VZT3T475UdE2z062jw51To10jgw0Tct0DYqzTQmxjMjvjUjuTYkuzgmvzsswDwvvzktwDovxTwy5VhR3E1HyjcwxzAp1zw33kE62js13zw15z456T055j854UA42T810DwyyDouwTktuzksuz0xy05I4GNf7G5v+nx//4SI/X6F+HmA+HmA/HmB/3iC/3SC/259/WV0+V5u91Zo80Vc/ThW/zxa7khcx1laimxSY3JHXHRCXHlDZHpJbH1QdIFWdoNYcoFYb4FXbYdabI5cb5VidZ1oe6RsgahvhKpxhatwha1xhbF0iLR1ibd2ibd2ibd2i7h3j7l6kbR8j6t7kqR8m6SFrauWvrKkyLevx7i1tKuuoZ6ll5KZW0s7W0s7W0s7W0s7W0s7W0s7W0s7W0s7Wko6Wko6Wko6W0s7W0s7XEw8XEw8XEw8XUw8Xks8Xks8Xk09Xk07X048Xk88Xk88Xk88Xk4+Xk4+XE8/Xk5BXU9CXlBFXk9KYk5ZYlFkY1RxZFp9bGWReHKif3eog3aklH2nrIarwompzoKe2neU4WyJ21h32kRf80JU+kRQ70pQ4UlI0EU+y0U80EY82UQ+6EJC8EBD9UBH9UJI7URH30NEz0E9wj83v0A3tT0vrjorqzoqqjkprjgquzsuzD824UZB4j077kJC60FB3js240pC5lhM1Us+yEAywDgovDMjwTgoyDwtyToqyzcp0DgrzjAl1zMp4Dgv6Ts07To17TYw6zAr5Swn4zAs4zEt5zEw7DMx8zI19jM39zQ49zY77C016iw27S498TBD8y1G9ilH/StO/zNS9DlM5TM/8EBN/19s/2x6/1dm9UNT9T5Q7jNE7TNB7TM+6TY84zk52zgzzjQqxy8kyzIqxy4o0Dcy8llU9lxa8lhW20E/4khG3EJA1Dw3zjcwzTYtzzgtzzkryjcnwjUjuTgjszkktToouD0tuTsstjYpvDcuxj01205H2UVBzjUw0DEt4T4550A64zgx5zUx6zIw7jIx6zUy5zgz4Toy2Dov0DkuyDouvjYqujgryElC3F9Z625s+32A/4WJ/X+D9XZ99nd+/HmB/3iC/3OD/2t9/WR2+V5w9FNl9EZd/ThW/j1a70xdwFRSel9CV2g8WXE/W3ZDZnlLbn5RdIFWeIVaeYhfd4xheZVleJpoeqBtfKdxgapyhKtyhatwhqlvh61yiLB0ibN0iLV0h7V0hbdyibh0i7h3kLZ7jqx4jqN4maSCra2VwLmnzsC10sTBvLnAqKq2nJyoWko6Wko6Wko6Wko6Wko6Wko6Wko6Wko6Wko6Wko6Wko6W0s7W0s7XEw8XEw8XUw8Xks8Xks8Xks8X0w9Xk07X048Xk88Xk88XU47XU47Xk88X08/X08/YFBAYVFBYlBGYk5QY05dX1BlYFVzZ2GFdG+Xe3SdfXGXj3aWroOfzIuh24KW5nKF62R16VBk6TtS+TNM/zxR+0VS6URL1T9AzkA+0UM/1kVC40VG6EJE7kFF7UNG50RF2kVBy0I6vz80uz8zsTstqTgoqDkoqjkpsDgqvDotyjsz6ElF6T8/6z0+5Tc42jIv3kE67lpQ9Ghb2lBDyUEzvjUlwjYnxzkryDkryzcr0jgs0TAm2jYt5js06Ts06jQw6C8s6i0r6y0t8zQ59TM7+DM9/DM9/zE+/jA9/TE9+TE+9TBB8jFC9DRL9TVO9TBO9i1P/zFY/z5f5jNI+U9c/2Fu/19u/1dm+1Bg9ERY6ThK80FR6jpH3TI60i8yyjItwjgtvTsrvDoqxDovwDIo2UpC+mtj3UxH4VBLzzs5zzs54ExK1EA8yjcwyjctzjwvzTwryzopxDsotDsmrTolrzwpsz4tsTkprzMnujovykQ71kdB2EM91Dcy1zIu5zs37Do26DIu7TIt8iwt9Cws8i4v7zMx6Dcx4jox2jwx0j4ywjYpujQpxUI611hS52po+nx9/4aJ/oCE9XZ993h//XqC/3iC/3GB/2l7+2J0+F1v8lFj90lg/zpY/T9b8E9fulFOcVg6U2Y4XXVFYXxJboFTdoZZe4hdfotggZBngpdsgJxsfZ9tfKRvfahwgKlvgqpug6lshalsiKtxiK5xiLByhrNyhLNvg7Vwhbdyibh0i7V2iax0jqV3mqiEsLSZyMOv2My+2tHMwsLMq7HBm6GxWks4Wks4Wks4Wks4Wks4Wks4Wks4Wks4Wks4Wks4Wks4W0w5W0w5XE06XE06XUw6Xks8YEo8Xks8X0w9Xk07X048Xk88Xk88Xk86X1A7YE87YVA+YVA+YVA+YVA8Yk9BZU1NZE1XYE9fYVVtZ2KAdXGSfHaYgHORj3WOrYCUzYaU336H7nF5+WNs+lBb+jtN/ypG/zJR/zxT8TxN4DxF10BF1UNE1EJD3ENF4EJD5EFE4kJE3kRC1EM+yUA4vj4zuD4xrzkrqDcnqToprTwqtDwswT0xzz833z065Tk54zAz4i8y4DQy2zk05k1F/Gxh8mhb2VFDxjwvxjotyDouyTcqzTYr1Tgv1TQs3jcv5jkz6DYy6TEv6C8s7jEv9TE1/zJD/zBF/y1G/ypC/yVA/yM9/CA59iA49ydB9StF9S5N9S9Q8ytQ9ClU/zJg/0Fo80NY/2Bt/2h1+FZl7Uta8Uxc60JV2jJD60BS3TdDyS0xuigosS4kqzgmpT8mqEAnuD8uvDos3VlN4V1RzUc+zUQ+wTYzyTs35FVR1UZAyTkxyDgtyTosyDkoyDkoxD0psT8npjwmqDsmrD0qqzcorDMovD0000xG1kdB3UVA2zk23DMw6Tcz7DUx6zAr9DEt/Swv/yst+i4v9DEv7TQv5jgx3zsx2D4yyTkuvTMowDsyz05I4WFe93l6/4iK/4OH+XqB+3yD/3uG/3iE/25+/mV3915w9Vps60xg9Ulh/DlX+z1Z7k1dskpHaFExUWQ2XHREZn5OdYhbf45jhJBohpJqiJduiZ5ziKR0hKZ0f6dyfahwf6hugaltg6lshalshahuh6tuha1vha9vgbBsgLJrgrZuhbdyh7N0h610jad3nKyFsrmayMav18692dLMu7/KpKy/kpqtW0o4Wks4W0o4Wks4W0o4Wks4W0o4Wks4W0o4Wks4W0o4W0w5XEs5XE06XUw6XUw6Xks8Xks8Xks8Xk09Xk09Xk88Xk88XE88YFE+YVI9YVI/YlE/YlE/YVA+YU87Ykw+aE9LZ05SYlBcY1dramZ/dXaUfXycf3iXkXqWq4GVxoSS2n2F8HV6/mxt/1lb/URM/i9J/zVS/zxV8zxO6T9M40NL3UJI1j1A20FD3EBB3kBB20E/2EM/0EE5xz40vT0wtT8xrDsrqTgorTwstD8uu0AxykE32EM92Tc04Tg13i4u4jMw5jo20zAnzzUp61VH/3dq61tQ0UM3yjwwyzswyTcqzTYr1Dow2jcw3zgy5TYz5zMy6jAx7TEy9DM2/TQ8/iU2/yM5/yI5/yI5/yE4/x82/R01+B427xsy7h858CVC7yhH7iZK8SdN/zNc/0Vo/2J1/2Bs91dj8VFd8lBd701a4kBN1DI92j1GzDc7uy8uri8opjUnojsomz8mnD4lqjknsjgr0lZKuzsyxD84vjQxvTIvzkNA5VdT1UhByDkxxDYqxTYoxDUlxjUkwzoosTwopzomqDclrTkqrDQmrzElwj8121JK2UlB4UhC3js23jIu6jQx7TEv7y0r/DIy/iwv/Ssu+Sst8ysr7S0q5jEq3zQs1jgs0T0xvzIovDcuyElC2VxY83d3/4mL/4eK+4CF/n+G/32I/3aE/2p8/l9z91hs9lRp6kRc9URe9TZV8TpW4ExapUhDXkstTWM1VW8/Yn1KdIxcgJZnh5hsiJtuiqByi6V2jKx6hqt3gapyfqdtfKVpfaVngaVngqZpgqVrgqhtg6ttgqxsf65ofrBpgbNqhLZvibZzia9yjqx4mbCErbuYv8Wpy8q1y83Ctr3Fnqq6i5enXUs3XEs3XUs3XEs3XUs3XEs3XUs3XEs3Xkw4XUw4Xkw4XUw4Xkw4XUw4Xkw4XUw6XUo8XUs9Xkw+XEw8XEw8W049XVA/XlNBYFNCX1I/YFBAYlFBY1JCZFFCZE5BZExCak1JaEtNZFBZZltsbmuGd3uegIWtiYiyj4OppYepvoig0IKS4nl+8HNx+mpi/2Fe+UpX8T5R6zpM7j9O70NR6kBL5jxH5T5G4TxC3zw/2jw91jw6zz45yj00wTswuDospzYmr0EwrTwsrDYov0E1zEY9zD010Dcy2jg13Dcx3jUu3jYt3jgq3Twq1zon0zYl2Tsw8FNM8lpP2UU5xzgqzT4u1EIz0jot1DMr8EdC4S8v7jU68zY97iw3/0JN8Scz+iYy/yky/ygy+R0n/SIq/ycv/icv8B0m8B4p+Ss36iAu7CY38S1B5yM7/1hy5y1E/11s/19p/lpj+VVc9VBX60hN3T9AzTg0yz43xEE3tz8xpjcmmTIhmTYjmjsnnzwppzgtrjcvwkU/vzs3vTMxxDY0xTU01ERD20xI2ktF0UQ7yDowxDQpxzUoyzQpxTUqvDwvszksrS8jqygesy0kwzkv0kM72Eg/5FBG30U92jcw3TAq5zAs8jIx+TEz/TE09y8x9jAx9jAx8zAu8jAu7TIt5jUt3Tkv1T0wvjIlwD4xuT0z1l9Z6XNx/4+P+4SG+4eK/4SM/3iI/2h9/193/1t1/1Vv+Exm+EVj8TpZ9Dtb5j9Z211pi0A7VkYtTF42WXVCZ4ZNd5ZdfZxjf51ngKFqg6ZugqhvgKduf6ZtfqVsfaVpfKRofaNmf6Nlf6Nmf6Vsf6Ztgatsf6xrfq1nf65mgbFng7Nph7Vti7RyjbB2jq58mbSJp72ZscGkssGuprKwjZieeoWLXUs3XUs3XUs3XUs3XUs3XUs3XUs3XUs3Xkw4Xkw4Xkw4Xkw4Xkw4Xkw4Xkw4Xks6XEs7Xkw+X00/Xk4+W049W049XFE/XlJCX1NDXVFBXU9CX09CYE5EYlBGY09IZU5IaU1KZ05RZVNfZ190bm6QeX6ogIe7h4rBnpXKo4u7q3+juXiQ03mD6nx79HZq9mlg+F1h809a7EZS8khT+ElW9UVQ7z9K6ztF5Dk/4Do82jo61T04zj83xz40wDwvtzwsqzwrqj8tqTgosjoswUE2xTw0xzYx1Dw30jUw1jUt1zUq2DQo2Tgm2zom2zsl2jkn3TYu5kE7601E4Uk80D4vxzgoyjgp0zsu3js09kpG5DAx8DY79jZB8S48/0BO7yc08yQs9yUo+yks/Sss/Cor+Cgo9igo9yss7yQn7SUo6iUs/TtE2Rsn8DRD/EFS2CY2/2p1/2Jq/lph/Fdd9E9T5UJD1zw40T42vjgsv0Q1uUg2qT4smS8fkCkajygZkigbni0lsDo20VRQzkhHwzU0xjQ10T0961dV2EdC1kc/0EE5xzkvxjMpyjYs0Dcvzjcwxz0zwjkxwjUuwzItyTQu0Tgz2D853kU95EpA3kE42jYt3TAq5zAs8jIx+zAz+zAz9DAy8zEy9DAx8y8w8zAu7jEt5zQt3zkt1z0xvzMkvjwvtz0y015X6XZz/5CQ+YWI+IWK/4KK/3SF/2Z8/1x2/1h0/1Fv/klo/EBh8zpa8T9f4UlgwVNcez83UkYuTV85WnZDZYdLc5VZeJxfd51ie6FmfaVpfaZqfKVpfKVpfKRoe6Nle6Fke6FkfaFjfqJlfKNqfaZsfalsfappfKtlfa1jf69jgrFjhbBoh7JriK9wiKtzi6t8kKyEkKqHjKKLeIeAZHBwUl5eXUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4XUw4Xks6X04+YVBAYFBAXVA/XE8+W08/W1JDW1FFW1FHXE9HXE9JX1BNY1FPZlRUZ1VVZ1VVZ1ZcaF1ubGmGc3ajfIO6gorLio3UmJHXoIrKqoK0uX2fz4CT5ISG7n9283Nq+2Vn91Nc7UdR8EZP9khS90VR8kFL7j1F5Dc94Dc62Tk51Dw3zUA3xUE0vj8wtj4trT4tqjwrqzosuEI2x0g/wDsyuzApyjoyzTYv0DYu1Tcs2Dgs2Tco2Tgm3Dkm4Doq3TQt2zQu4kE56U9D3kg6yDUlyDIj2UAy4j419UhE6DEz8jU7+TdA+DRA/0VT+DI/8Ckw6yMm7CQn+TEz9S0v7ycn7CYl9TEy6ykq9jg66Csx4ikx6zM9/1Je7z1L/1tn/l5m8VZc7k9U8E1S6kVJ3To71Tc01D85wDYswT8yvEI1sz0xrDctpTMpoSwjnCcgmiUeqS8qx0VDwjo6vCwsyDM110FC9F5d0D860kM70EE5yz0zzDkv1D002kA420A720A82D073T4740E/5D4+4Do64z8960lE4EI53Tw02TUs3TIr5zEt8DMx9TEy+DAy9DAy9DAy9DAx8y8w8zAu7jEt5zQt3zkt2D4ywDQlujgrtTsw0FtU7Xp3/5OS+4eK+oOJ/X6J/3KC/2R5/1t0/1Rx/05t/0Zn+z1f9D1c7kVi31RnokFIcDszU0gyUWE8XXhFZodOcpNadZhedJpfeJ5je6Nne6NneaJmeaJmeaFjeKBieZ9ieaBhfKBieqBjeqJme6Roe6doe6hle6lhe6lgfatgf65gh7JqirVui7Jziax0hqZ3gp51eZNub4ZsU2VZQVBNMkE+Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xk05Xkw4YE46YVA8YFE+XVA/Wk4+WU9DWFBFWE9IW1FPX1VUYlhZZVhfaVljbFxma15nbGFpbGRxb2uCcnSaeX61f4bKhYzajI7hjofXn4vTrYrEs4CpvXmOzHuB3oF68oJ3/3Ny/2Nn+VVc9E1U9UdQ9ENN8j5H7zxC5TY74Dg42zk31Dw3zUA2xUE0vEExtz8uqzoqrT4tsT0wvEY6zFJHx0g/ujUuujEpyDkxzTgx0zsw2T0x2zst2TYn3DYm4Dgr4DUt2zIr4D007E5C40s90jos0Tgq4EI23zcu8D466S8w8DE29zQ8/DhC/05a/0xV/T5F8jM44iQm7S8x6iws8DIy6Coq6y8u8jo60Roc5jM33Swy6DlA8EVN/1hj801X2D1D2kFE4UJG4T5B3jk93Dg52Dg40zk3yTgzwjkxvToywEE6zU5I1lZT0E5Ow0NAsjcytjk1z0tJ2U1M41FS71la6lJR8VlWyTUxzj420kI50EA30z812UI54EM84kA76T9A5zg97Dk98j9D7zo/6DU47D499k1K3jkz2zYw2jMr3jMs5TQu7DMw8jIx9DAx9DAy9i8y9jAx9S8w9S8u8DAt6TQt4Dgt2T8zwjYntzUoszkuy1ZP73x5/5OS/IiL/YGJ/nqH/W9//GN3/1hx/09s/0Zo/0Bj+zlc9D9e6Utk2FpohTM1ZzswV084V2dDYXtLaolQc5JZdJVcdZhed51ieaFleqJmd6BkdqBhd59hdp5geJ9geJ9ge59heqBjeqJmeqNneqdmeqdieqhgeqhdfKtdfq1fhrJni7RujLN0iq1zhqZ1gJ1xdI5paYBkUWNVRFNMOEdAXk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk07Xk05XUs1X001YFA5X1A7XE8+Wk5AWE9GWFFLWVBRYFdcZ2BobmZzc2h5c2d7c2d9cWh9b2x9cHGGcneXdn2reoLBf4fShIrgiovlk43jnYzaoIS/nnWfoGyCrG5xvHZs0nZp8nNt/2xs/2dp/l5g+1JX9UZN7zxC6jc95jU74Tc43Tk41j03zkE3xkI1vUIwuEAvrTcptEAzrzowsDsxyFJI1VxRyU1DuzswvjkwwTctzDkv1j4z2z0x2jYq3DQn4jYq4DMs4jcw5D015UU54kY53kIz3kEy4j4y2zAm6jcy7DAv7y4x8S40+jc//1BY/11k/1pf/09T4S4x4zAz4Cwt90VF6DY23Cws2y0u6z5A3DI12TM3/2Jo4D1Cyyoyyi00wSYq1Ts94UBF2zY62TM33zk93Dc7zS8wzDQzzTs71UdG3lJT7GBj9Wls9GVr6l5hxEA+xkVA5V5b+Ghn/29w/2pq5UtL1z07yTQw0T4310Q81kM71T411Tw02Dox3DQx7jU78S038Cw28i447yw06ywz8zk8/kpL3zMv3DMu2jMr3DMs4zUu6jQw7zQv8jIx9DAy9i8y9y8x9i4w9S8u8DAt6jMt4jct2T8zxjgqtDIlsjgtw05H73x5/5KR/4iM/3+J/3eF+mx8+GF0+1Ru/Uhn/z5i/zpf+jZc80Fh4E5lwldhcC8rXz8wW1c+XmxJZX1Na4lTdJJcdZZfdplfeJ5jeaFjeKBidZ9gdZ9gdZ1fdp5fd55feJ9ge59heqFieqJke6VlfKZkfKdgeadeeahae6pcfaxegKxhha9nh65th6pwhaVzg6Bye5VucopqZXhlW2teUmJVX048X048X048X048X048X048X048X048X048X048X048X048X048X048X048X046Xkw0X040YE44Xk86W04+WU9FWlNNWlRUX1phaGJwcm2BenWMe3WRe3GTenCTdnCScXSTcniadH2od4G2eoPEfobPhInai4zelo/cmYrNm4W2ooOjqoSRq355n2xbmlE+vE1C1FFJ4ldS61dV8VNS8UtN7T5D5TQ66Tk85jk74Ds52D0400A4ykI2wEEwuj8vszksukE2qzUroy4kvkk/2Wdc2WRay1VJuDwyuDYpwDMpzjow2Tsw2jYs3jMp5DYt3zEq5Dcx4zsy3Tkv3j4w40Y15EIz3zkr3zEo6TQt8DMx7y0u7Sou9DE3/0VK/1Zb/11i/1xh4jk84zk81Sss9EpL4jg51y8v2zU3zCgpzCcr+Fha3T5C1Tk90TY6uh8jxCgr3Dw+5kFF3TQ52Swy3jE32TA1zSgu0jM35EtO9mFl+2hu+WNs92Bp+mBs+GJr1kxM1U5K6lxa6lZU501N40hGzzQyzjMv2UE84EtE5E9I30pD2UA41zoz1zYu3C4t9TI6+y06+Co39Sc09Sk0+DA6/z5D/0pK4DEu3jMs3DMs3TUs4TQt5zQv7TQv8DMv9DAy9y8y+S4x+C0w9i4u8S8t6zIt4jct2T0xyTstszEksTcsukM97Hl2/42N/4iN/3yI/3GB9mh49l9y+VJs+0Rj/zle/zZd+jZc8EZj0U5goklNZTUrVkQwW1lAXmxJZXxOa4hSdJFbd5VfeJlge55keqBjdp5gc5tdcpxcc5tcdJxddp1ed55fe59heqFieaFieqRifKdie6ZfeKZbeKdZeqlZe6pafqpfg61lhaxrh6ltiadziaV1hJ1zfJRydYlwbn9sZndlX1A9X1A9X1A9X1A9X1A9X1A9X1A9X1A9Xk88Xk88Xk88Xk88Xk88Xk88Xk88X046YVA2YVA2YU85Xk88W09BW1JLXFZWX1pha2d2c2+GfXqXgn6hgXylfXeje3WleHanc3mpc32weIG4e4S/fobEhInJjY7OlJPNmpPHoJW9q5u1vKayya2pxaaUqohtnGZKnEUyr0E0tkA0wkI51khE6E5O7kpL7D9D6z0/6Ts95Dw73z062UA40EA1yD4xwT0wvTowvj82rzQspzEnu0k/0WNW1mhb1WVXw09Cuj4yujQpxzcs1jkw2TUs3zIr5zYw4jAs4zQv4jcv3jcu4D4x5UM05D4w3jQl5jQq6TAr8DMv8C4u7y0u8jE08zc49kJF9k1S/Fle6UZL9lFX2DM360ZK3Tg85kFF2jc6zi4w0TA15EhL0jc70Dc6uSMl1Ts92zg75Ts+6zxB5zY84i023Sky4TE75zxE8ExT/V1l/2tz/2pz+mBq9lpn+Vho91tm9GRk6FpW6FdU2EA9zzEw1DQ00zMz4UNA40pF6VJL6lNM4UpB2T832Dkz2zgx4zMz8y43/zA+/zA9+io3/C46/ztF/0NI+0FC4zEv3zQt3TQt3TUs4jQt5jMs7TQv8TQw9DAy9y8y+S4x+C0w9i4u8S8t6zIt4zct2DovzT4wtTElsTcssjs16XNx/4qK/4eN/3aG/ml982F081tw91Bq+kNi/zdg/zdh+Ttf7Exmv09bfjg2XT0wTkYxVlhAWmVFY3hNaoVSco5bdpReeZphe55keJ5hc5tdcJhZcJlXcZpYcZpYdJtcdZxdeZ1feJ9geKFfeaJeeqVeeaRceKRZeKRXeaVWe6dYf6lfgqxkhKtohqhsh6VvhqJxgJpteJFqcYVpan5jYnZdX1A9X1A9X1A9X1A9X1A9X1A9X1A9X1A9Xk88Xk88Xk88Xk88Xk88Xk88Xk88X046Y1E5Y1E5YVA8XVBAWlBHXFRSX1phYV9tdHKKeXiYgYCog4Gwfn6weXmveXWwd3e1d3y+eIDBfYXEgojEhYrBjY+/l5a+oJ28rKe7tqy1vrOxyLir0L6m1sGi0buW0KyIr29UrlxHpEc1qD4wwkc/4FdR71dW8U5P6UBD6j0/5jw94j073z061z010ToxyTkwwTgwwTw1uTozuD01wU9Fx1hNx11P0WVY02NVwkw+vDotxTgu0jkx1zQt3zIs5zYw5jQw4TIt4DUu4zwz50M35kM04jot3zMl6jUs5i4m8DAt7y8s8DMx8TU05y0u4jI050JG91hd9ldc/2915URK60hN4DxD/ltg/2913j1C/32C/21x6lFU1D5AxjAy1jo98khL7jk+8Dc/+D1G8jdC6C049D5K/11n/213/2py/2Nu911n+l5r/2Fv/11u+Vll8lxd41BJ4kpH1Tc00i8w2TU00jAu2Dk130Q/40pE4klB2UA40zYv1jQv3Dcx6DY26icv/DA8/jI99ys2+TA6/z5F/T9B7DQ04jMu4DUu3jYt3zQs4TMq6DMs7zQv9DQx9jAx9y8y+S4x+C0w+C4u8i8t6zIt4zct1zku0T8ytjAlsjYssDYx6HBv/4eI/4aO/3CC/GN48Vxw9Fhu909p+0Ji/zlh/zxk9kFi5FJnsFFXZC8nV0QzR0cvUlQ8VV4/YnRMaYFRcYtbdpJfephifJ1keJxfcplabpdVbpdVbpdVb5hWcpladJtcd5tdd55dd55beKFbeaNbd6NYdqJXdqJVd6NUeaVYeqRafqZfgaZjf6Fkfpxme5dmcoxdaYJYYHZSWm9QUmdIXEw8Xk4+YFBAYFBAX08/X08/X08/YVFBYlJCX08/XU09XU09YVFBY1NDYlJCYFE+ZFM/YVA+XVBAXlFJW1FQWlNaZWFwc3GJeXiaenylfoCxgIG5fX+6eHq3cnO0bG+2dHfIdnvMgIPKi43GlpfDpKS+srC7vLm0y8az08yw2c+s28+n3M+j3dCj2cuc2cKY0aiIuIBnoF5Gy3pn1nVlvUg/11FO92Nj6UtM5T9B4jg55Do64jo53Dc12TYx1js2yzgxwDUux0I7uzwzv0k/xlhLuU9BzmRW0WNUzFhJxUc5xDovzTYt2Dcv4TYv4zQv3zAt3zIs4Dcw5D004Dww3Tcp3zUo5Tcs5C8k6i8m7C8p7jEt7jIw6zQw6DUx4jY01zc55kpO9Vld7U5T1zg91zY8+Vhg/36E/36G/291/2dv/2lw/2Zs9Vxh8Vhb+1pf/1Va/0RL/DhC+zdB9jI+7is57DA+8T1I/1Nf/2Bp/2dy/2Vw/mJt/2Nu/2Bv/V1n7VNT30ZA1jg11jQx1zEx1y8u2DMx2zk04UQ93EI62T831jw01zkw2zgx4Dkz5jY28Dc88zQ78zQ79jQ89TY78jU56zMz4zEv3jMs3jUu3zcu4DUr5DMr6TIs7zIs9TIw9zEy+DAz+i8y+S4x+S8v8zAu7DMu5Tcu4D81zDgsvzYsry8muDs30lhX/5ia/nuD/22A/2V8+Fxy8FBo9Edl/ENl/ztk+Tlg9U5s01JkiT0/UCwgQzsmQ0cuS001WV9DWmpFY3hNcYhaeJJieJZgdJVccpZZcZhZbJVTbZZSbpdTb5hUcplYdJtadZxddZxbdJtYdJ1XdqBYd6FXdqJXdqJVdaFUdKBTe6Vbe6Ndep5edZdbbYtVYn5NWHJDU2o+QVcwP1UvPFIsW0s7Xk4+YFBAYFBAYFBAX08/YFBAYVFBYlJCYFBAX08/YFBAYlJCY1NDYlJCYFBAZlZHX1FGXE9HXlRTYVphZGBvbWuDdneWd3mie32ufX+4eHy5cXW1a3C0bG+2bnG+dXbQfH7ViYnTmJjOqKfHuLbBycW6086x29eq4tul596l5t2i5Nuk4tij29Gg1Meb07yau5yAqX1kxYt3yn1ttFZK0mFb9nJw7Fpb50tM4z9A5z0+6z5A5zs74jY22zY01j04yTgzyj84uTYuuD4zvUtAtkg7yF1N3W9g1GBRxkg6vTUpxDAm1DYt3DUt2zAp4jUx5Tk15D034Dwz3Dgu2zUp3zQq4zUq7Dcu7TUr7TIr6zAr5zAs4zIs4TQu3TUy1jg32D5A5EpM81db+l5i/Fxk/l1l/2Fp9FNb705W8VFZ/19n/2px/2Zs9Vpg805U7TQ68Sw19Co29y058Sc15SEt5ic27TdD/lBa/1pk/2Js/2Rt/2Vu/2Nt/Vto9VFa5UVF3jw32zY03jYz3zU13DMw2jIv2zYy4D452z432Ds01zoz2zgx3zgy5Tk15zo26Tk76jc66zc67jc57jc57DY15TMx3zIs3DMs3TYt3zcs4jYs5TIr6jEs8jEs9TIw9zEy9zAz+i8y+S4x9y8v8zAu7DMu5Tcu3zwz1D0ywjgutjEqtzc02Fpb/5CT+3N9/2Z6/152+Vdv909p+UZm+z9i/Dxj9EBj5U9ouUtWeDs4TDIjPDojPEIoRUcvT1M4VmRBYHJKboNYdY9fdpNddJNYcZNWcJRUa5JPa5RQbJVRbZZScJdWcplYc5pbc5pZdJtYdZ1XdZ9XdZ9XdJ5Ucp5RcZ1ScJxRbphQbJROaIxMYoFGWHU/Tmk2Rl0vQFcrQFctQFctQVguWUw8W04+XlFBXlFBXlFBXlFBX1JCYFNDYVREYFNDX1JCYFNDYVREYVREYFNDXlBDYlVNXFFNW1FSY1lia2R0cW2EdnWVeXukeXuseX62eHy7bnO1ZWmwYGevam64cnXGfX3Xh4Tdl5TbqafYu7nPy8rI3Ni/5eG06eSq7eim8Oml7eWk5+Gn4tun18+hy8OcuK+QqZuBm4NrqINwp29gnFJHul1V3W1p93V1719f5EpM5UBE60FE7D5A6Dg64jY23z061Ds21EE6wjcwtzcstz4zrj0vtkY422pc32lb2VtNykI2xTIo0TQr2TYt2TIs3jUy6UE+7EdD4D021TIp1TEn2jIn3jAl5jQq6DEp5y4p5i8p4zIs4jcv4T004EI5xi0oyjQz3ERD8FZY+l5i91ph81Nb8VFb6EZR6khT709Z/Fxm/212/2509Flf4z5E6S419C00+zI8/DI+9Ss57Sc09jZF/0tX90lT9VBX+Fdf/l5m/2Nr/2Bp91JZ6UJJ3jk33jcx4zc16Tw46zs75jk14TUx3TYw3Toz2Tsy1zkw1zkw3Dcx4Tgz5zo26Tw44zk54zk55Tk35zk46Dg45jc04TQw2zIr2jYt2zct3jgs4jYs5zIp6zAp8zAs9zEw9TEy9TEz+DAy9y8x9y8v8jAu7jMu5zYu3Tkw3EQ5xzgwuzQutS8u5F9i/4OI+Gx3/mJ4/ldz+lBt/kxs/0Nm9jpd8ztf7Elm1FNnnURKbDs0Tz4sPTwnOj8oRUQvRkgwUVw8WWtFZ3xRcolbdI9acZBVbY9Sa49PaZBNaZFLaZJMa5RQbZZUbpdVcJdYcZhXdZxZdZ1XdJxVcpxUcJpSbZdNa5VNapRMZY1HYYhFW39BVXQ7TGkzRWAtQVgqPlUnQlwvRV8ySWM2V0o6Wk09XE8/XlFBXVBAXlFBX1JCYVREYFNDYFNDYFNDYVREYVREYFNDX1JCXFBEWk9NWlFWYlhjamNzcW2GdnWVeHqjenytd3y0c3m3bXK0YmmvXWSsYWexbHK+eHvKiYnflZHlpKHktrXhx8TZ1dHO4d3E5+S56+av7uqt7uis6eKr49uq2tOpy8Khu7aZpaWNm5mEk4h2mIFxmXJjm2JXs2lgz3Jt+4uJ9XV06ltd5kxO6ENH7UBE7Dw/6Ts83zo42zw43kU/00M7wzowujovsDYppzEjv0k722FS6mtc21NFyToszDQn1DYr1zQt2TQy8U1L/lpY7UtG2Tgw1jMq2zQr3jIo3y4m4Swl4Swl3i0l3DEp2jYs2Tsw1z80wi8nxDQszjo22UNC30ZI4EVJ5EdO6k1W8VFd9lZi+Fhi+Vxl/2dw/2119Flh3jtA6jE38S408i028Cs06yUy7Cg0+z1J/1Nf7T9J6EFJ6kdM9FFW/1lg/1hd9EdN5DY44TUz5Dcz6js48kA+9EA/7z075jk14Dcy3Tgy2jkx2Tgw2Tgw3Dcx4zcz6Dk26To34jo34Ds54zo35jo45zo25Tg04DUu2jMr2jYs2zct3jgs4jYs5zIp6zAp8i8r9jAv9DIy9DIz9zEy9jAx9jAv8jAu7jMu5zYu3Dgv4EY8yTkxvjMutiws7mZq/3mA+Gd0/2J5/VRx/ktr/0dq/z5j8jZZ6z1e41FoxFhliEJCZ0M3W047R0YxQUMtSkgzRUUtTFU2U2M+YnRMbINVcItYbo1Sa41QaY5LZ49JaJBKaJFLapNNa5RQbZZUb5ZXcJdWdJtYc5tVcZlTb5dQapNNZ5BKZY5IZI1HYIdEXYFBV3k9UnE4TWk2TGY2TmU3T2Y4TGY3T2k5U20+VUg4V0o6W04+XE8/XVBAXVBAX1JCYVREX1JCYFNDYVREYVREYFNDX1JCX1JCXlFJVk1SX1hobmZ7dHCJeHSXeHeheHqreXu0c3m3anKzYGetW2OrX2ewanK7dnzGgITOk5Xgnp7kra7nu73my8nf1NPY3dvO4d/G5eG+5uK85N+54Ne22tC1zsaxvrWmraebmJqMjI6AiYV5inxxkXZrm3NpqG1lum9p5omE7oF+83Ny8WVk8VdZ8E1O7kRF7EBA4zo34Ds35EI93kU/zDwzxj0zxEI1rzEjrjAix0k73FhL1k5AzD0vzjgq0DYq0TMq1jQy9VVV/2to+l1Y40Q+3Dsz3zsy4zgw4jQt4zIs4jEr3TAp1DAnzS8kxi8kwjAjxTkswDQnwTMpyzo110NB20VH20JH2kBI4ERP609a8lZh8lZh+l5p/2dv81lh4UJH6jo87TU37TM47zI48TM99zlD/0hT/1Zf5DY/3TQ73zY760FE+UpP/ElN9DtB6TEz6DUx6zk17zw48jw58zs58Do36Tcz4jcw3zsy3Dsx2zow3Dkw3zgy5Dcz6DY06Tc15jo45Ds45jo46Do56Ds35jk14TYv3DMs2zct3Dgu3zkt4Tcq5TMp6TEp8TAp9DEt8zMy8TMz9DIy9DAx9DEv8jAu7jMu5zYu3jcv4EM6yjcwwDEtwDEz92pw/3F6+mZ0+110+lBt/0Nm/z1k/zlj9The5kVk2Vptq1Zbd0U+ZEo9YVlGVE87S0k0UEk2R0UuR1AzTFw4WmxGZnxObYVTbYpSbIxNaI1KZo5IZ49IZ5FJaZJMapNPbJVTbpVWb5ZVdJlWc5hVbpVSapJMZo9LY4xIYYpGX4hGWoFCWHw/U3Q7UG44T2s6Umw9V25AWnFDVW8/VnE+V3FBUkU1VUg4WEs7Wk09W04+XE8/XlFBYFNDYFNDYVREYVREYVREYFNDYFNDYlVFYVZQXlZjamV8eXWQfXmaenmheHmpdnmwc3e0anKzY2qwW2OrXWWuaHC5dn7HgYfRiIzTmZ3do6Xgr7Pju7/lxsfjz87e1NPY19bR2dfL2dbH19HF0snAzMO+xbm5tKiso5qdiouGeHt0eXZxdWxlf2xljW9njmFbnWBbwHNt2Hl18H97/Hx5/3Jw/WNj9lNU8EhH70M/6j464Tw24EE70Tox00M63VRKwj4yuDYpvTkswj0uyD8vz0Ix10M11kAx0Tct0DIv6kxN+l9d8ldT30Q/2To02zgx4Dcw5jkz5zky5zky4jox2jkv0TksyjgrxDgpsCgYuDMiyEAy00k+0kRAyzs6zDc7zzpA0TdB4khS7VZf8Fli9V5n92Bp6lVb3EFF5UA+7D878UFD+kdK/0xU/1FZ/1Rd/1Ze4TQ62i813C8z5zc69D1B+Ds/9zQ48zEy7TQy7zk18Dg27TQy6zIw6jIw5zQw4TQu4zw04D003zwz3jsy4Tgz5Dcz6DQz6DQz6Dg45zk46Dg46zk56zk36Tc14jUv3jMs2zct3Dgs3Tor3zcq4zIo5zAo7zAo8jEs8TQy8DQz8zMy8zEx8zEv8TEu7DMu5zYu4Dkx2TwzzDcxwTAt0UBD/251/Wt1+WJx8FJp9Uhm/zth/zRe/zZi+z5k5E5pylxpi0dGakY6XUw8XVZDWFE+Uko3T0c0SUQuREouR1UyU2M+XnNIZ39NaodPaopLZ4xHZ4xGZo5HZpBIZ5BKaZJOa5RSbZRVbZRVcZVVb5RRapFOZ45LY4xIYIlFX4hGXoZHXIJFW35EV3hBVnI/VW9AWXBCXXJHXnVHW3NDWXRBWHNATkIyUUU1VUk5V0s7WEw8Wk4+XFBAXlJCYVVFYlZGYlZGYVVFX1NDYVVFZlpKaF1Zbmd3dXCOfHiZe3mgd3imdnetcHWvam+vYWisXmauX2ewZW22cHjAfYXNiZDYj5fYmaDWoajWqrHbtLnfur/fwMHdw8Pbx8bYxsPUxcHQwbvJvLPEu7DBtai8ppivlouciIWMcXFxdHBvcGZld2hlhm5qhF9ZlWRfm1pUuWZg2XNu8Hp2/3t3/3dz/2hm/FpX/lJO9UhC5j0250Q92Ds020c96lxSxTswxDwwvTcrvjYoxz4u0UQz1EIz1EEx10Ez0jg22D4+3UND3EJA1j031Tgx2Dcv3jcv5Toz5jkz5Toz4jsz2z411UE10UU4zEc2ri0YvDslzUo40Uw9xj01uzArwDAwyjk+10FK4UtU61Vg8Fpl8F1l7Flh30xS1D5AzzQv2Dcv4Ds56kBA8kNI9URK8UJJ7j9G4jU73zI24zM27zg89Tc5+DE0+y8y/DE07zIw8Dk18Dc07DAu6Cwq5zAs5jMu4DMs5D014D004D004Dwz4zo15jk16jY17DY17DU37DU37TU37jY47jY26zU05DIu3jEr3jcu3Tkt3Tor3zcq4TQm5jEm7TEo8TEs8DQy7jUz8TQy8jIx8zEv8TEu7DMu5zYu4jsz0jQr0jo1xjIw51VY/3B4+WNu8lpp50lg80Vm/zhi/y9d/zVi/0Jo3ExlsVBZajUvXkc3WEs6VU47W1A+Vkk4TUAwSkMwQEYsQU8uS1s2WGpAYnhHZoFKaIhJZotGZYpEY4tCY41FZY5IZ5BMaJFPaZFSa5JTbpJSbJBQaI9OZItKYYpIX4hGX4dIX4dIX4VIX4JIXX5HXXlGXXdIYHdLY3hPY3pOXXVDW3ZBWnVASkMzTUY2UUg5VEs8V0s9WU0/XE8/XlFBZFdGZVhHZFhIYlZGX1VJYVdNZ15VbGNmd3KJeXWaeHaedHOfcnKkdHWtbHCvYmepWmGpX2WvZmy4bXO/dnzIgYfTj5Pdl5zem6HVoKfTqa3arrPdsbTdsrTbtLTatrTbtbHWs63RrqfJq6HEqp7CpJi8mYuviH6ZfHiGZGJnaWVmY1laaltYe2NfeVZQkmNdik5GolVNvWBY1mtj8Xdy/396/3p3/25q/mFc91RP6UdC7k9J3UI93kdA6ldPuiwivjEnvjQnxz4u0UU2yz4twTIiyjcn20U33kU/0zk3zDMuzTUw1Ds11z013Tw04T005Ds05Dky3jUu1zQrzzUpyjgrxTwswj8t1FM+yEcyvTwpvjotwz0yxDs1wjc0wjQz3EtO3k1S4VBV5VRZ6Fld5VZY3E1P00RAyTUr0Tcr2Dcv3TUy4jI05TI25jE45i427DQ+7DM78zU/+zlC/TQ++is1/ygz/y85+C0z+TU3+TU58C4v6yor6TAu6DUx4jUv4zw04D004D004T005Ds25zo26zc27jY27DQ26zM17DI17TM07TU16jQx4zEt2zAo3jgs3Tor3Tor3jgo4DQm4zMk6TMm7DQq7jUw7jUy8DQy8DMv8jIv7zIs7DQs5zYu5D00zS8m1z45zDM1+WJn/29591tp8E5j6kNd+UVo/zpl/zBd/zZh9kdoyUpdk0NGUiwjVkk4U0w6T0g2W08/VUk5Rj8tSEYxPkInQEooSVUxU2Q6X3JFZX1JZ4RKZYhIY4hDYYlCYopDY41FZY5IZo9NaI9QaZBRbJBQa5BNZo1KY4pJYYhHYIdGYIdIYIZJXoFHXn9GX31HYHxJYXtLZHtNZnxOZn5OXXhDXXpAXntDREI2RkQ4SkY7UEc+Ukg+V0k+XU0+X08/YFE+YVI/YFNCX1ZHYllSZ2Jfb2puc29+d3GTenSgfHmoeXepcHCmZ2ejYGGiXF+kYGKtZmi1b3DAeXrMhILWjYvflpLnnJnmoJ7doaHXo6PZpKTapqPYpaLXpaHUpKDTpZ7Ro53NoprJopnIn5bDmY27joKwg3yecm59aWdsZF5gZlpaa1lVcldQfVdOjFdPlVJJqFpQtVhQwVpT2Gtk7Hly+YJ8/4uG+XVx/3Vz7V9d31BM2UVB71pUzDcxxTIqxDYqwzcowDcnwzcmxjkoyjsr0Dwu1T8x0jgu1jwy1z800zswzTUozTMn2Dov4kA14Dkw4Tkw3jcu1zcrzzcpyToqxj8sxEEvwj0uxkA0y0U6zUc8zEM7xTw0uzIstismxzw30EVC2U9M4FZT41lW4VhS2E9J0EM6zDsq0zoo3Dgs4jUu6C4v7Coy8Cgz9Cc2+i0++is/+yo//Sk//yg//yY//yQ8/yQ8/yQ4/yc5/ys8/iw58ys17S416DQ15zs53Tg03Toz3js04Ds14zo15jk16Tcz6zU06zM17DQ26zU06TU05zUz4jUv3TUs2zUp3Dgs2zkq3Dko3jkm3zgm4jcl4zYl5jQm7DUt7TQv8DUw8TQu8TUs7TUr6jUq5Tcs4Dkw2Dcv1To22z9C/213/2Jz+1Nq9Ulj/0tq9jZb/zZf/zxn+D5j505qr0lWXiQiRCwgPzonSEU0UE08UEk5RUIxPkMvP0cvQkgmRUslS1MuU104W2tEYXZLZH5OZINKYoZGYIhCYYlAY4tCZY1GaJBKbJBQbZFRbJFMaY5IZ4xHZotIZopKZYlJY4VIYYNHZINKZIFJYn9HY35HZH9KZH9IZX5HYX1DW3s8XH89X4JCPT80P0E2RkM8SkU/UEU/VEc+W0s+XU09YE87YFE8XlNBXlZJY1tYaGNpbmx5c2+GdHCVdnCedHCicG2iZ2afYWGfXV6hXFykZWSwa2q6dHLFfXvPhoLZjYnglI7mmJPlm5bZnJjVnZnWnprXnpjWnZfVnJbUm5XRnpbRnJTNnJPKm5LHmpDEk4m7iH+ugniddGt8bWRpZl1eZltZaVpTb1dNe1VKilZLmlZLsFxSullSwVhS02Zh4HFq43Zv7X53/YeF/4eF93Vz7mdk41VT61pVxzIswi8lxTcpwzcmwDclwTgmxDgnyDsqzzst0z0v1Tks1Tks0zos0jos0Tkr0Tkr1Dgr2Dgs3zsx4Dkw3Dgu1jgszzkqyDkowTomvjkmvjYqwTgwxj01yUA4ykE5yD83xTw0wjkxvzQtxz420UhA2E9H2lFJ105GzEM7wzcqyjcl0zgk3Tcp5TQs7S8v9Csz+Sk3/Sg6/ytA/ypB/ylB/yZB/yNA/yE8/x49/x06/x86/yA5/yU7/yk79y058DE56jc65Ts73Dk03Do13js04Ds14zo15jk16Tcz6zUy6zM17DQ26zU06DY05Dcx3zYv3DUs2TUp2zkq2zkq3Dko3Dkm3jkm3zgl4Tgl4zYl5zUr6jMr6zQs6zUq6zUq6jYo5Dcp4Tcq3zsx1TQs0zU081RZ/2Vz/1tw9Udi/0lo/0Fk/ztg/TNb+Tth8k1tzUxiiTg/UyokQTUnNjkoOzwsQkAxREEwQD8tPUIuPkcsPUMdS1AnXGI8ZW9KaHZSZXpRZH5PZIJMYYNGYYZBYYlAY4xAZ41EaY5Ia5BNbJFObJFLapBHaI1IZotGZ4pKZolJZoVKZINIZoNLZIFJZH9IZIBGZYFHZYFHZn9FYn5BXYA+X4Q/YodCNjkuOjwxPz83REE6S0I7T0U8Vkg9WUw8Xk88XE88XFNCXldNY11daGVsb217c3GJc2+UcWuZamaYY2CVXFuUWlqYXF2gXF+maGq1bm+/d3jKf4DShoTYiojcj4vgkY7dk5DTk5HQk5HQk5HSlI/Rk47Rk4zQkovOlYzNk4vHlIvElIvAk4u+jISzg3qlgHKVfGV3dV5maVtbZFtWZFtSZlhLclZIhFRIo1pRvWBZyVxZz1lX22Ni4Wtp329r43Zx+4qE/4qG/4WB/315925o7mFYxDQrwDImxDgpwTonwDkmwDklwjkmxjsozDor0Dos1jot0zUpzjUn0Dgq1D4v1D4vzjYoyy8i2jou2jgt2Tcs1jgs0DoryTopwjkmvjckvTUpwDYswjguxDowxz0zykA2y0E3zEI4xzoxykA2z0U70EY80kg+0Uc9ykA2xTcrzDYl1jYm3zcs5zQv8TAz9i01+ys5/yo8/Cc7/Cc9+yU9+SM7+yE6+h43/Bw3/hs2/x44/x82/yQ4/So79zI88TY96zg75Do63Dk03Do13js04Ds15Tk15zg16Tcz6zUy7TM27jQ37TU16jY15TYx4TYv3DUs2DQo2jgp2Tkp2jkn2zgl3Tgl3jck4Dck4TYl4TUn4jQp4zUq4zYo4zYo4Tco3jYp2zcr3Twy0DEr2Dg4/2ty/11u/lBp8Txb/0hs/zdd/z5l+TVb7j5i5lZxqj9RYSMoTC8pOzcrMDcnMzcmOTwpQD0qQTwoQD4pQkImP0YdWGE0c35UgIxkd4dgaH9TYX1MYYBHYINDYIU/YYlAY4xAaI5Fao9Ka5BNbJFObpNNa5FIaI1IZ4xHaItLaItLZohMZIZKZYRLZINKY4BGZIFHZoJIZoJHZYFGYoBCY4ZEZYpFaI1IMjUqNTgtOzw0QT43R0A6S0I7UkU8Vko8WEw8WU09WVFEXldPY15iaWdyb26Acm+Mcm2VameUYF6PV1eLVFWOV1iYXF+iYWOtbG67cnPDe3zOgoPViIbZiojbjIjcjYrXj47Sj43Oj4zPjovQj4nRjojQjobPjYXOj4XKjoXGj4XBkIe8j4e2iYKsgHidf2+MgF9wfFlgbFhZZFtUXl9RX1xJaldGfVNFnlVMvlxZ0Flb2Vhc5GNn52tr4XBs5Xhz7H127Xpz/oN+/4aB/4F79WthyTwyxDgpwjsovzonvzsmvjolwTomxTonyDkpzjgq2Dou1DYqzjUnzjgp0T4u0T4uyzgoxy8h0jYp0zUp0jQo0jYp0TkrzTwryD0qxDspxDotxDovxjkwxjkvxzoxyDsxyTwzyz0z00Q800U70EE5yz0zyzw0z0E3z0A4zjsxzjUn2TUp4jUu6zMx8i819ys2+Sk3/Ck6+SY59yY79yY7+Cc8+yY8/SU6/yQ6/yM6/yI3/iM3+iU3+Sw79zU+8jk/6Dg64Dg33Dk03Do13js04Ds15Tk15zg16Tcz6zU07jQ37jQ37jY26jY15jcy4TYv3DUs1zUq2Dgq2Dgo2Dgo2Tgm2jcm3Dck3TYk3TYk2zUl3DYo3Tcn3Dko3Dko2zoo2Tkp1zor1zox0DMu60hL/295/1Zq+ERf+Dxf/0Fn/zNc/zhi+D5j6E1sxU9lgDA9Sh0gQzEtMTEnLjYnND0sPUIuQkArQjwkRT4kSEUkVVwwcH5Nj59yl6h8g5htaoRXX3tKXX5FX4NDYYZAYopBZo9Da5BKbJFMbZJPbZJPb5RObJJJaY5JaI1IaYxMaYxMaIpOZ4lNZoVMZINKZIFHZYJIZ4NIaIRJZoJHZIJEZ4pIaY5JbJFMLTMnMzYrODkxPDs2Qj05R0A6TUQ9UUc9U0k9U0s+VU5EWlVRYV5laWd1bWuBbGuKamiQYmCPWFaIUFCGUVGNWFmaYGOqZmq0b3LBdXjJfH/QgoXWhofZh4jYionZi4rWi4zPi4rMionNiYfQiYXRiITRioPRiYLQjITPi4TIjYXBjYa6jYawh4GlfneWf22FhFlqgFNablZUY1xSWmFPWl9IZVpEeFVCkkxEuFRS0FNX21JZ5V5k6GVq42ts5nVx5HVu4m9o9352/4J7/4d+9GxgyT8ywTgowDsovz0nvz0nwDwnwjsnxTonxzgozTcp2Dov2Tgu0jgszzkrzDoryToqyDkpyTcozzkr0Tcr0jgs0TcrzzcqzDgqyzwsyz4tyjwwyT0wyjwyyTsvyDowxjgsxTctxTUq0EA30EA1zT00yTkuyzgwzjsxzToyzDUs0C8l2TAp5DIw7DI19C84+S05+ys7/Cw8/C0/+y4//C9A/C9A/i9B/y8//y0//y5A/yk5/Ck49ys39TA68TY97Tg94zc33DQz3Dk03Do13js24jo35Tk15zg16jY17DQ08TQ48TQ47zU27Tc25jcy4TYv2jYs1zUq2Dgq1jko1jko2Dkm2Dkm2Tgm2jcm2Tgm1Tgl1Tom1jsn1T0o1D0o1D0q1D0s1Dwu0Tcv2js4/15l/2Fx/1Bp9zxb/0Fp/zRf/zRg+zFZ9Ets21lxlT5OWiUtQyksOjIvLTApMDgrN0AvOkIrPDwiQTweVUgoYFs1e4VTkKNsqr6LqL6NjqV3b4tbYX9LXn9GYIREY4hCZY1EapNHb5ROcJVQb5NTb5NTb5RObJJJaY5JZ4xHaYxMaYxMaYtPaIpOZoVKZYRJZINIZYRJZ4VJaIZIZ4VHZYVEaY5JaZFLbJROKzElLjQqNDcwODkzPjo3Qj06SEE7S0Q8Tkg8Tkc9T0pEV1NSX15mZmV1Z2d/Z2aGYmGJW1mKUVGFTk+HUlOTW16jZWmzbG++dXfKenzRf4HWg4XYhofZhofXiIfViYnTh4jLhofIhoXLhYPOhYDQhYDSh3/Sh4DQjYXSjIXLjYXBjIW4i4WrhH+de3aNfGp6hFZjgVBWblVRZF5QW2VNWGJJYl5Fc1hDj09FtFdS0FVa2lNa51xj6GFn5Wdq6HBv7Hly5nFo93x083Nq/nht5lxRxDsrvjUjwjsnwT0owT0owzwoxDsoyDspyzkqzzcq1jUr2Dct1DouzjosxzopxDgnxjopyj0szz0u1kAy2UE01j4xzjgqyDQmyjgpyzwsyTosyDosyTsvyTstyjovyDkryDUrxzUoyjYszzsv0j400z8z1j821T4zzjcuySwj0isl3C0q5zAy8DM59jE7+jA8/TA//TA/+TBA9zFA9zFA9jA99y889y05+iw5+io3/S88+S879TA68DM67TY75jY53zU12TQy3Dk03To13zo24jo35Tk15zg16jY17DQ08jU58jU58DY37Tc25jc03zYv2jYt1jYq1Tcr1Dgp1Dgp1Dkn1Tgn1Tgl1zcn1Dkl0Dkkzjwlzz0mzz8nzkAozkAq0D8u0jsw0TYx60hJ/2Zy/09k/0hm+zdb/0Ft/S9d/zdh8jRY41BqvFVmbTE5RSgqRTY5NzMyNTQwNjkwNj0tMzsjMzgYQ0MdamE6hYFUn653qcGHtc6Xr8eTkq59dpRiZYZRYIJGYIVCY4hCZ49GbZZKcphPcpdScZVVcJRUb5RObJFLaI1IZotGaItLaYxMaYtOaYtPZ4ZLZoVKZYRJZoVJaIhJaYlIaYdHZoZDao9Ka5NNbpZQKDAjKzEnLzQtMzUwNzY0PDg1QD04Qz44SUU8SEU8S0hDUlBRW1tlYWJ0YmJ8YGCCX16IWliKVFSKVFSQXF2gZ2mzcHPEdnjNe3/YfoLbg4TehIbdhIXYg4TWhYTUhoXRg4bLgoXIg4PLgoHNg4DRhYDUiIDViIDTjYXSi4TIi4O+i4OyiYKkgXyTd3CAdmVvflVbfFBRblVOZl9PXWVNWmRJYWFHcV1FiVRGrV1UyFpb1FZa4lth5l1k6WFl7mxs9Xpz7XJq93hv3llQ5VtQ0kQ4wzUnxzopxTonxDwmxT0nyD0oyjsqzToq0Dgq1DYq0zAn1DMp0jgszTssxzsqwjsowDsowzwpyDsq1UM04Us93kg60z0vyjQmyTUnzTssyDkpyDkpyDkryDkpyjgryjgpyzcryzcpzTYr0jwu1z802EAz2kA220E11zox0jEp3DAu5TE07jQ59TY++TQ++TE++jBA+C8/8i487y887S857TA37y017ywy8isy8Sox9TI69TM78jU77DU55TU34TU13jY13Dc13Dg23Tk33zo24zo35jg36Tc36jY37DQ29DU69DU68Tc67jg35jc04Dcw2jYt1DYq0zcq0Tgq0Dgq0Dko0Dko0Dkm0Tgo0DkmyzkiyDoiyD4kxz8lyEAoyEAqzD0tzzsx1zk2/FVc/15x/0dj/z9h/zph/zdn/jNi+zhg7UZkxU5hiUBJUzEyQTY0QDo8OjQ2PzU2PDcxNzkrND0iOUMeU1ougoJQoqdxscWKr8uOsMySpsONkq59e5llZ4hRX4FFXoNAY4lAaY9Eb5VKc5lQc5hTcZVVb5NTbpNOa5BKZ4xHZYpFZ4pKaItLaYtOaYtOZohLZIZJZIZJZYhIZ4pKaItJaYlIZolFapJMbJZOb5lRJi4hKDAlLTIrMTMuMzMxNzY0Ojk1PDs2R0Q9REQ8R0ZCT09RWlpkX2FwXmB5XFx+YF+JXFqMWViRXFyaZ2etcXPAenzRf4DcgYThgoXkhYbjhIXhg4PbgYLVg4LSg4LOhIfMg4bJhITMg4LOhYLTh4LWioLXjIPUjYXQjIPEi4K3ioKrhX+bf3iIc251cWJldldVdFNMalZLZl9NYmZNX2VJY2JGcF5GelE/nVtNt1pTxVNS11Za4ldc6llg8mNl93Jt8W5m93Fo0UQ71EE3xTElyDQm1EMyxzklxzomyTsnzTwp0Dor0zos2Dgs2TcszywjzjAlzjYpyzwsx0AtwT4qvjsnvDckwDQj0UIy409B5E5A2EI0yzcpyzcp0D4vyjsryToqxzgoxjcnyDYnyjYozjgq0Dgr0zsu1Tsv1Tkt0jYq1Tcs2jwx3Twy3Dcx6Dg48Tg99zpB+zlC+jRB9S888iw77yw67S876jE56jM46zQ47TU38TU29DM28zU38DM37zY77Tk86TY54jQ13TMz3zc24Ds53Tg23jk34Tk24zo35jg36Tc36jY37DQ29DU69DU68Tc67Dg55jk13zgy2Dcv0zcr0DgrzToqzTkrzDsqzToqzToozToqzDsoxTkiwjoiwz0kwj4lwz8oxj8ryjwuzzgx3zw//1xm/1Fo/0lm/zld/z1o+S5d/Txo6Ttc5VxwpkxWXi4uRzgzQkM+PDg5PzQ4RTI2QzQxPTopPkUmRlUqYnM/kJthrb1/scuMq8mLpsOLnbqEjqx6e5llZodQWnxAXoE/YYc+aI5Db5VKcphPcpdScJRUbpJSbpNOao9JZotGZIlEZolJaItLaYtOaYtOZohLZYdKZIdHZYhGZ4pIaItHaItHZYpEa5NMbZdPcJpSKDAhJy8iKC0mKS4oLjAtMzMxNzgzOTo0PT01P0A4REVASkxLT1JZVlhlWlxzXV59WViCW1mLXl2WZWWjbm62d3jIf4HYhIXijIzujIzwiorshofkgoLcgIDWgoDTg4LOgIPIgYTHg4PLhITOhoPQiIPTi4TSjITPioDFioC8iYCvh32fgHiNd296a2VnZl1YbVtRbVtNaVxMZl5LZF9JZWFIaGFHb19Gb1A7hVVBpV1Pv2FZ0VlY3VFU7lNb+Fxg+Whl5llQ1EQ8zjcw0Tcv1zox1j0v1DsrzzkozTomzzko0Top1Dgp2Dgq3DUs3DUs0C8lzTMpzDgsyj4vxUAvwUAtvj0qvDknwjkpvjAi6VdK30s/wy8j0T0xzjwvxzgoyjsryTopyDkoxzgnyDcmyTYmyzUmzDQm0Dcp1zsu3D4y3Dww2Tcs2jgt4j407EM89UJF8jk/8DI89jQ/9jJA8S077S067TI97Dc+5jU75DY45Tc46zk58Do58Tc47zc38js97jw86jo65jg34Tg13zc03Dc13Dc13jk34Tk44zk55jo66Tk77Dk87Tk87zg89Dc78zY68Dg67Tk65zs54Ds11zkwzzcsyjgryDkpxzkrxjopxzopxzooyDsqxzwpwTkjxD0nvjojtjQevDklyUQzzz82yjEs/15l/1Zn/0li/zxc+DFY9zBZ+zZj9UJp51lvrEZRbzMzTjMsQj82PkM8QDc4QC0xTC8zSzIuQTkmREooWm49fppfnrh3qMWCrMqMn76CmLaAlLJ+gqBuZoRSWHZCWXs/XYA+Y4dBaY9EbpRJbZVMbJROa5JPbJFOaY5JZopEY4ZCY4ZCZolJaItLZopMZIhKZ4tNaIxOZ4tLZotIZYpFZotFao9Ja5NKcZtRcp5TdKBVKjAiKS8jKS4nKS4oLS8sMTMwNTYxNzgyOzw0Pj83QUQ9SEpHT1BUU1VhWFlrWlx1XFp/Xl2JZGKUa2qkdXS6f37Oh4ffi4zpjY3vjIzwiYnrhYTigIDYgH7SgH/PgoLMhYbJhofIh4jLiYjOi4jPjIbOjYbMjoXIioC8iX+xhnyhgniRe3OAdGtubGJgZV1SZWBNZV5LZl5LaF1LaVxJal5Ia19Hbl5Fd19Hf1tDkllGrVpMx1ZQ3lJT9VFY/1hf8FVT40xF2T451TYw2TYv3Dkw2zks1jko0zgm0Tgm0Tgo1Dgp1zcp3DYq3zQs3TUszjAnyTUpyDkrxj0txEEvwUAtvzwqvjkoxDgpyzwu5FJF3Eg8yDQozDotyDoswjQmyj0syzwryjsqyjsqyzopzDkpzjgpzzYo0zcq1jgs2Tcs1zMp1TEn2DEo3jcu5zw1+ERH8Tg+7S857y868DA97i476zE86zY/5DU63DM22DIy3zo47kVC+ElG+ERD8z8+6To35zk45Tk34jk24Tg14Dg14Tk44Tk44Dg34jg45Tk55zk66Tk77Dk87Tk87jc78zY68jU57jY46jg45Ds43Do10zkvyzcrxjgqwzoqwjoqwDsqwDsqwTwpwTwrwTwpvTkkwT8puzolszUfuTonwTsvyjoy2Dw9/15n/1Bk/0Fb+ThX9jZb9Ttg9D5k40llqz9Mgz8+XzoyRzsvOj4wOD4yRjw6Uj49TjAuUzgvVks1Y2lFeI9bjbBwncJ9ocaBmrl9mrmAmraDjal4co5eWXVFVHA9XHtCX39AYoZAaY1DbZNIbJRLa5NMaZBNaZBNZ4xHZYlDY4ZCY4ZEZ4pKaYxMaIxOZ4tNaY1PaY1NaY5LZ4xHZ4xGZo5FbJJJbZVMcJxRb51SdKBVLTEiLTEjLC8mLC4pLy8tMTEvMzQvNDUtOTswPD4xQEI3RUhBS01MUVJXVVVhVldpXFl0Xl1/ZmSMcG6geni3hYPOjYvfkJDqkI7vjoztionnh4TfgX/Tf3zLf33IgH/DhoXHiIjGiorKjIrJjIrJjIjFjIS/i4K3iYCthnyhgHaPe3CAdWpwbmRiaV9WY11NX2FMX2FLY15KZ1xKbFtJblxIb11HcV1Fd2FJeFg/h1M9o1ZEx1hP41VT+E9U/k1T4j483jw33Tg03jcx4TYv4TYu3Tcr2jco1Dcm0zgk0zgm1Tgn2DYp3TUq4DMs3TUsyzMoxDYowjkpwTwrwj8twj8twTwrwDgowzUn3Eo92kY61UE1zjwvxDYoxDsrvjYmxjopxzopxzopyToqyjgpyzcpzDYozTMn1Tkt1Tcs1jMq1zMq2jMr3zYv5Toz6Tw48Dw97TQ56zA37DE47jM87TQ86zdA6j1D3Tc74UFB7E5L+FlV/VpV+lFM70I+5Tg04jYy4Dcy4Dcy4Dcy4Tg14jk25Ds45Ds44Tc35Dg45jg66Dg76zg86zg86zg87Dg77zU47jQ37DU35zc34jo32To0zzgvxzcswjgrvzorvTsruzwruzwruzwpuzwruzwpuDkmvUAqszkksTYktjsrtTAnwzQw7FBU/1tp/0pg9TpV8DdW8UBd70hm50hkzU5hgjg5ZT82UkAyREEwOT0sNTcpPjYrSzkvRS0jUj0sZ11CgYhfkqt0l7t7lsF6lr97lLN4nLiFmrSFgJptXHVLSGI1Tmg4W3hCX30/Y4NAaIxEbJJHapJJaJJKZ5BMZo9LZIlEZIdDY4ZEZYhGaItLa45Oa49Pao5OaZBPaZBPaZBNaJBKZ49IaJJIbJRLb5lNc6FWc6NXdqRZMjQmMDQmMDEpMDErMTItMjMuMzQuNDYrOTstOz4tP0EzREY5SUpETU9OUlFXU1NdWFZkXFpvZGF+bmyUeneshILDjInWkY/jlJHqk5DrjoviiYXZgn/Mf3zDf3y/gH69hILBhoXBiYjCjYrDi4i/iYW4h3+uhX2khXudgHaOeW5+cmdtbWFha15WaVtQY1xKXWBLXWFKY15KaFtKbVpLcVpKdFpJdltGc1dBeFI7ilE9qllGzVtQ41RQ8EZJ8T5B2zIv3DUv4TUx4zYw4zUu4TUr4DYp2zgp1jck0zgk0Tgm1Dkn2DYp3DYq4DMs2jYtyDYpvTgnvDcmvToovz4rwj8twzsrxDgpxjQn6VVJ0zwxzDgs0UI0vjUlwD0rwD0rwDgoxDgnxTkoxzopyDkpyzcpzDYozTMn0jYq1DMp1TIp2zQs4zoz6T437D857D066DQ17DU57zY77jU76jI65jM55Dc94jxA81VW/GJi/21q/2lk81ZR5EE83zYz3TQv3zYx3jcx3jcx3zgy4Tg14jk25Tk35jo45Tc45jg56Dg76Tk86zg86zg86zg87Dc87jU67jY46jY35Tk33zw31jw0zDkvxTksvjkqujsqtjsptTwptTwrtD0pszsqszwoszont0AsrTgmrTgnszstqysiwzU0/WBn/1Rk+kdc8DxV6z1Y50df4U9k0k9ftFNadkdBWEg5S0QyRkUxQkUwPT8qOjgjOzMePzMdUEcqbmtIipNmlax0kbR0jrdzkbp4nruFobiKkKd9bIJbS186QVcwTGM3V3I/X3tAZINAaYpDa5FGaZFIZ5FHZI9IZY5KYodCY4ZCZIdFZ4pIao1NbI9PbZFRbpJSapFQapFOapJMaJJKZ5FHaZNHbZdLcJxPdqVXdqZaeKhcNzgoNjgqNjYsNTYuNTYwNTYwNjcvNjgrOz4tPUAtQEMuREc0SUs+TU5GUVBOUlJSVlVTWVhdYV9sa2mBdXObgH2yiIbHjIrTlZLhlJHikI3ci4fThIHEgX26f3y1f3yzgX63hIG6h4S5iYW3ioSyhn+ogXqbgHiQf3OHem56cmZqbV9ealtUaVtQalpLZlpKYl9MYl9MZV5MaVxLbltMcltLd1xLe1pHflVBhlI9m1JBtlZGzlJI2kdA4jg45TMz3TEt3zMv4jUv4zUu4TMs3zMp3TUo3Dko0zgk0Dkkzzom0Ton1Dgp2Tcq3TUs2DctxDsruToptTYltzgnvTsrwj0uxzsuxzcs0Dkw9VxU1j01yTUrz0E1uDMktzoovD8rvzopwzoqxjoryDosyjstzDotzzgt0Tct0DMq0jEp1jEr3jcx5Tw36j466Ds35jc06Tc17zs88Dw/6jY55DE15DU66EJG7U1P/3h3/3Fu8WBb3UpD0Tgz0TIu3Dcz50A64Dkz4Dkx4Dcy4Dcy4jYy4zcz5Tc25Tc25jY45zc56jc76zg86zg+6zg+6Dc96jc77jc77jc56jc65Do63z061j03yzsywzsvujgqtToqszsqrzwprzwqrDworDsprDspqjsorD0qpjgnpzkqqjgtrC8py0BD/2hy9E1e80hb7URZ5Uhb2U9eyVRdt1RXnFhVZE0/T0w5TEc0SkUxRkQtP0InPUQjPkgjS1YuXGc8eIFUi5lmkaRtjaluj7Jyl7l9n7aIkqeAdYZkUmNDP1AwQlMxT2E5Vmw9YntCZYJCaYpDapBFaZJGZZFGYpBIY45HYodCZoZDZ4pIaYxKa45ObZBQbpJSb5NTapFOa5JPapNNaZNLaZNJapZJbppLcp5PdqVXdqdYd6hZPz0uPT4uPT0xPT0zPT01Ozw0Oz0yOz0vP0IvQEQtQ0cuRkozS0w6Tk9BUVFJUlJIWVdKWlpOX15cZ2VycW6Je3mhg4C3h4XEj4zRj4zTjYrPioXHg3+6fnmvenemeXale3asfHmugHyug32pg32jf3iXfHSLenKBdmtzcmZmbV9calxTa1tObFpMbFtLa1tLaV1NZ15NaV1Nal1Nbl1Nc15Nel1NgVpJk2BPm1ZHp05AuEo9xUA3zzYu2DEr3jEr4TUx4TYv4jUu4jQt4DIp3jQn3DYm2jso0TkkzTskzDsmzjsn0Top1Tkq2Tcs0zktwT4stDsosDUjsjUjuzkpxDwuyTsvyzct2T83+FtU40lBzjowzEAzuDYmrDMgtTwpvDknvzcnwDcnwzcoxTcpyTcqzjcs0Tct2Twz2zoy3jkz5Tw36j466j055zg14zQx6Dk26zw57Do66Dg67D5A+FBQ/2Jj/3Bw+Whl4lRQyj02wDEryTQw1js33z064Ds34js14Toy4jk04Tgz4zcz5Dcz5TU15jY26TY56TY56jc76zg86zg+6jc96Dc96TY67zg87Dg56Dg64zs63T460z43yTwywDwvtjgpsjoprjspqjsoqTwoqDsnpTompToopTwpoDkooDspoDkqojYqtT4421RY+2Vw7ktc70ld6Upc201byVFatFZWoFpSimBSUEk3SE05Tkk1SEArOzUbNjcXPk8lTGY2bIpUd5RchJtliZpkjZtmkKNrlK10mLB8g5Vtbn1cUWBDPEowOUYsQVAxT187V2o9Y3pEZYJCaotEa5FGaZJGZZFGYY9GY45HY4hDaYlGao1LbI9NbI9PbI9PbZFRbpJSbZRRbZVPbZZQbJZMa5dKbZlKcp9Oc6JRe6xde6xdeqtcREEwREIzREI2Q0M5Q0M7Q0M7QkI2QkMzREYwRUgtR0otSk0yT045UlE/VFJFVVNEXFpDXFxEXF1PYWFhaWh4cnGQe3qmgX61hoK/iIPDiITBhIG6f3uueXOhdG+Xb22VcGyecm6hdnCed3Kad3KSdG+Fc2t6cmlubWJgbF9XalxRa1tMbVxMb1xNb1xLcVtNcVtOb1xObV1ObF9PbWBPc2BPel9OhlpNn19TpFBFrkI4ujsyxjYtzjEo1jIp3TUs4jcw4TYv4TQt4DMs4DQq3TUo2Dcl1Dklzzoiyj0iyT0kyj4nzTwp0jsq1Tkszzstv0AtsTworDUhrjMhujgoxDwuyjovzjUt2Dkz8E5J8VRN2UI5zEI1vj8upjEdszwovjwswTkrwTcqwjYpxTcryTkuzzsx1Dsz4UQ940E85D875z476T076Ts66Dg45zg15zg15jk15jc06Ts69EpK/1xb/2Rj+GNfzD05wTgyvTQuwzgx1UE93kVA3z072TQy4js14jsz4jk04jk05Dg05Tg05zc36Tc36jY56zc66zY76zg86zg+6Dc96Dc96TY66zc66TY55jg54Ds52z450T42xjwxvjwuszgprjspqjsopjsnpDsoozonozonoDkmoT4rljclnD0rmjkpmjInw1BL7Wtt7lxm7FBe6Upc30hXzUtTuVJTpFtSkmNRgGpVSk04REw3SkIvSDkkQjcbRkgjVXA9Z5NWfrNvgrNxg6VofZJZg41ZjpZjiZdkfIxfWGZDR1Q4OUUtNkIqOkQsPUowSlg3V2g+ZXxGaIJDbItFbJBGaZNHY5FGYZFHYY9HZotGbIxJbZBObpFPbI9Pa45Oa49PbZFRcJdUcZlTcJlTcJpQb5tOcZ1OdKNSd6ZVfK1eeq1eeaxdSUMzSkQ2SUU5SUU6SUc7SUc7SEY5SEc1SUgzSkoyTEwyTk40UlA7VFE+WFJEWVRBXVk+W1o+XFlIXltUZGFobmt+eHOTfXiggXung32rhX+tg3ymfXeddW6Pb2mFa2eCaWWIamaLbWiIbWmCbWh8bGZya2JnamBeZ11UaFxOaFtLa1xJbl1LcV9LcV9LcF1McF1OcF1PcF1Oc11Pd11Ofl1Oh1xMklhMoVVIpEY8qzkvujctyjcv0zYt2jYt3jYt3zYv3zQt3zQs3zQs3zcs3Tcp2DYn0TYkzzokzDwkyjwmyz0nzjsp0Tsq0zoszjwtvkEvrzwnqDMhrDMgtjknwT0uyTsvzDguzDIq4EE7+FtU4ElA0EQ3ykY3qzIfuT4sykY3zEI1ykAzyz8yzT8z1EE33EU840Y/4kA74j054zo34jY04zU05DY15Tk35Tw55D854D023Do130A66k1I6lFM00A5uCkjuC0mvjUtyT430UA71j452js44zs75z094jk24jk24jk25Dg25Tk15zo26Tk56jo66jg46jg46zg76zg76Tk86Dg75zc65zc66TY65jY44jg43jo41j04zD01wjwxuTstrjkoqjsqpjspojsooDsnnjsmnzoomzonmD8tjDUimT0umDgqly8mzVxY93l831hf5lhk2lFbyktSuUxPqVZQnmBVkGdVgG5WUFc4P0oqPDscQz0bVVErbHZEg6JmlMF+h7x2hrhzfJ5hboJNdX5RgodedX1WW2JAO0QpNDwlNT0oPUQyPEUyOUMrQ1AyVWU+Z3tIaYNGbItHbZFHapNHZpJHYpBHY45HaI1KbI9Nb5JQbpNQbI9NaY5Lao9KapJMc5tUc51Vc51Tcp5Rcp5Pc6JSd6ZVeqtadqZadaVbc6NZUks7Uks7Uko9Uko9Uko9Uko9Uko9Uks7VU48Vk89V1A+WFE/WVJAW1REXFVFXFVFYltIYVpIYVlMYllSZV1ba2FpcWZ0dWp7em6EfHCIf3OLf3OJfHCEdWp7bWJyZV1qY2BrYF9nX1xjX1peXlpZXllVYVpSYlpPZVtPZ1tLaVxLa1xJa1xHbV1GbV1Gal5IaWNNcWZUcVpKdU9Ci1dKnFxQo1lMrFpMpU49pkU0pzwssTcowjgt0Tgw3DQx3TEt3zYv3jcu3jcu3jcu3jcu2zcr2DYp1zcp1Tgp1Dgp0jkp0jkp0jkr0jkr1DgrzTssvTsrtj4trjkoqTEgqzIhtzkqwDwvwzkuyDUrzjUt1Dow20M43Us+1Eg5wj0stzIj3VBG2EpA1EY81EQ72kc/3kdA4EM+4Dw64Dc05jg37Do67Do65zc34jY04Dkz3D032UY+z0I5xDovvDQotzEmuTUpvzsvwz8zwzowyTwz0j832j864j075zs57Dg57Tk65zc65Tg65Tg65Tk55Tk35Tk35Tk15Tk14DQw4TUx5DY15Tc25jg55zk65zk65zk76zs+5jk73zk53D061kE9zUI7wUE2tz8xqTopozwroD0qmzwomTomljollzgmkTgmkEEwizwthy8jkS8mvExK5G1v52xvzVZavUxOtU5PqlFNolVPm1hPl11SlWFUimpTV1ovOk0WN0YPVGEpfo5Qm7Bvn7x5nL14krVzfp1haIBMXG1DWWRCVF1CSFA5P0QwOj0sQEMyPEAxOj4wPEMzOkMwQU4yUmQ+XXNCZ4NIcI9Lb5NLbJJHapJJaZNLZ5BKbJBQbZFTb5NTbJNQbZJNa5NKbZZKbZhJcZxMcZ5Ncp9OcqFQdKNSdqdVeapZeqpeeaZjbZlaYo5PV04/V04/V04/V04/V04/V04/V04/V04/WE9AWVBBWVBBW1JDXFNEXVRFXlVGX1ZHZFtKY1pJY1lNY1lPZltVal9dbmJkcGRocmVsdGdwdmlydmlyc2ZtbWBnZ1tfYlhZXltWWlpSWVZPV1RLWFRJWFRIXFZIXldHY1pLY1pJZltJZ1xIaV1Hal5Ga19HaGBJY2JNbmdUdlxNgVNGmlZNq1ZPsFJKt1FFr0g5rEMwrD0ssTkpvjgsyzgw1TYy2TQw3TYu3Dgu3Dgu3Dgu2zct2jgt2Tcs1zcr1zcr1Tcr1Tcr1Tcr1Dgr1Dgr1Dgrzjosvjwutj4urjkopjEgpzIgsjopuT4uvjwuxjotxzQqyzQp0jsw3EU64U9C31FD3U9D20Y/2EA70zw10js01j032j043Dg23TMz5zc36zc47jc56zc45zc35Tk34j0520I6ykE3vz80uDossTYnrzUmsjgpuD0tv0AxxUE0zUA210A33z044zo36Tc37zU28Tc66TY65zY85zc65jg55jg35Tk15Tk14zo14jky4zoz4zo15Ds25Ds45Ds45Tk55Tk55Do74zs73zw92T890EE7xD82tz0yrDstpTsroD0qnD0rlzwpljsokjomkzgljDolgDkngDgpiTUqnTw1v1FQ12Vl0V5ht01NrE5MpFRNnVlQmFxRl15Tl15TmF9WjGZRYF8vU2cqXnIzepBPma9upb58mbJwiKBiaoJIYXVCVGU7Slg3RlA3P0g1OT8xNTgtOjwvQUI0PT80Oj0yPUEzOkMwQE0zUmQ+XnRFZ4NIcZBNcJRMbpJIa5RIa5NMaJFLbZFRbpJUbZRTbZRRa5NMa5RIbJdIbZhIcJ1KcJ1KcKBMc6JRdaZUeKlYeKlYeKhebZdYYotRWYJIXVRFXVRFXVRFXVRFXVRFXVRFXVRFXVRFW1JDXFNEXVRFXlVGX1ZHYFdIYVhJYVhHZV1KZV1IZFtKZFtMZVtRZltVaF1ZaF1baV1dal5ea19fa19faV5cZltZYldTX1ZRWlZNV1RLVVFIUk5DUU1CU09DV1FDWFJCXldHXldFYVlGY1tGZ1xIaV5Ia2BKaGJMYmFNbmdVeV9QiFhOoltVsVZRsklFuEVAuUA3uD4xtzsvuDgrvDgrwzksyTsv0Tov2Tgu2zct2zct2zku2jgt2Tcs2Tcs1zcr1zcr1Tcr1Tcr1Dgr1Dgr1Dgr0jkrzTsswD4wtj4urTooozIgozMfqjomsz4suT4uxD8wxDgrxTIoyDQq0Dww2EY53E0/4k5E2To22DQz1DIw1jQy2zk34T085jw86Ts87Tk87jU66zI36TI26DU45Tk54Tw62UA6vjgttTorsTYnrjQlrTUlsDgotTwruz0uyEQ1z0M21kI43D034jk06DY07TU17zc56jY56TY56TY55zc35zc35jk15Tk15Toz4zoz5Ds05Ds24zw24zs44jo54Tk53jg43Tk63Dw82kA+00I9yD85uToxrTcrpTcooTssnTwrmTwrlDspkzookDkmkDclijkmejYjeTYliDksoEY9uVNPwFdUuFBPq0lGok1InFNMmVlQl15Tl2FXl2FXmF9Wi2VQc3JGeo1Wk6ZupLmAq8CHnrN7fJBbW288P1IkQVMrQVAvP0wyOkMwNjwuNjkwNTgvOTsuQEEzPT80OTwxPUEzOUIvQE0zUWM9YHZHaYVKc5JPcpZOcJRKbZZKbZVOa5ROcJRUcZVVb5ZTbpZQbJRLbJVJbJdIbplJcJ1McJ1McJ9OdaRTeKlYeapbdaZXcaBYX4lKVn9FT3g+YVhJYVhJYVhJYVhJYVhJYVhJYVhJYVhJX1ZHYFdIYFdIYVhJYllKY1pLZFtMZFtKZV1IZl5HZl5JZ19MZ15PZlxQZlxSZlxTaF1XaF1XaF1XaF5VZ11UZVtRZFpQY1tOXVlNWlZKVlJGUk5CUExAUE0+VE5AVU8/V1FBWVRBW1ZDXVhEYVpHZF1KZl9MZmFNZGNRbGVVdlxPiltRqWJcuFpYtkZEuTw6wzw4xjs2xDowwjgtvTgpvDoqvj8uxz8v0zkt2Tcs2jgt2Tkt2jgt2Dgs2Dgs1Tcr1Tcr1Dgr1Dgr1Dgr1Dgr1Dgr0jkrzTsswT8xtj4urDknojMgnTMdojgirD0ptUAuvD8tvzorwzcqxTUqyzcrzjouzjwv0zoy3jY14DI02zEy3TM04Dg45Ts86j0/7Dw+7jc87DM46TA25jI15TU44Tc32jY1zjYxtzUorzcnrjYmrDcmrDcmrjkosjoptToqw0ExykI01EE33D844js15jk16zc27jg37TY46zc46zc46jg26jg26Dk05zo05js04jky4Toy3zo04Ds33jo43Do42zk32Tk51jw61UA80kM9ykE7uzsyrzYrpDYnnjconDsqmDsplDspkjsojzomjTgkjDcjhzklgD0qdjUjgTUnmUU6qlBIrE1HqUxHplFMnVBKmFVMlFpPlF5SlWFWlWFWl2FXjWdUiYVfmal4rb2OpriIkKF0c4ZZTmA4L0EbLT4cM0IlOkYuPUYzO0EzOj0yOj00PD01OTktP0AyPD4zOTwxPEAyOUIvP0wyUGI8YXdIaoZLdJNQc5dPcpZMb5hMb5dQbZdPcJdUc5hVcJhSb5dQbZZKbZZIbplKcJtLcZ5Ncp9OdKNTeahYe6xdd6dbbZ1TZZJNW4VGU3xCTnc9Y1pLY1pLY1pLY1pLY1pLY1pLY1pLY1pLY1pLY1pLZFtMZFtMZVxNZl1OZl1OZl1MZl5HZ19IaGBJaWFMaWFOaWBPaF9QZ15PamBUaWBRaWBRaF9OaF9OaGBNaGBNaGFOZF5OYFpMW1VHVlBCUE0+Tks6Tks6Tks6UE08Uk8+VFFAVlNAWFdDW1pGXVxIXl1LYmBRZl5RbVdKhltSrGljvmNgwU1NyEJD0Ds91Dg50zg0zDcwwTkruj0ptUMrvEIrzjsr1zcp2Dgq1zor2Tkr1jkq1jkq1Dgp1Dgp1Dgp1Dgp0jkp0jkp0jkp0jkpzTsswT8xtj4wqzoooTYimjQemzcgoz0mr0Itszsqujsswjosxzktyzguzjow0Dww2To06Tk87DQ85jM54zI44jM44TQ44jM44jI16TY86TQ55zQ65zc64zk82zc20DIxwDAotDYorToorTooqzooqzooqzoorDkmrzcmuDorwTsvzj4z2D834D045Ds46Dk27Dg37jY27jY27jY27Tc06jg06Doz5zoz5Dwz4Toy3zsy3zw13D032z062T481z071D49z0A8y0I8xUI6uT01rTctozUonjcomjoqljspkzwpkTsqjTooijkmiTgliDckgzglg0AtdTQiezMlk0c6pFFJoU5Gnk5HoVdOmFVMklhMkFpOjVxOj11SlGBVl2FXj2hXjYlmmKV6namBgI5qXWtIRFM0MkAmJDIZLTomMDsqNT0uOT8zPD80PT80OjszOjowOTktPj8xOz0yODswOz8xOEEuPksxUGI8YnhJa4dMdZRRdJhQc5dNcZpOcZlSb5lRcppTcppTcppRcJlNbZdLbZhJcJtMc55PdKBRdqJTeKdZe6leeqhfcZ9WZJJKWYZDXYZKV35HUnlCZVxNZVxNZVxNZVxNZVxNZVxNZVxNZVxNZVxNZl1OZl1OZl1OZ15PZ15PaF9QaF9OZ19KaGBJaWFMamJNamJPamJPamFQamFQamFQaWFOaGBNaGBLaGBLaGBJaWFKamJLZl9NYl1KXlhIWFJCU009TUo5S0g3SUg2S0o4TEs5TE07Tk89UFE/UVRBU1ZFU1ZFW1lMXlZJY1FFelhOoWhhtmVhxFZV1lFS2UBD3zo+3Dg31DcwxzsuvD8rsUMqtUEoyjsq1Dco1Tgp1Tkq1jkq1Tkq1Tkq1Dgp1Dgp0jkp0jkp0jkp0jkp0jkp0jkpzTsswT8xtT0vqzwpojkkmTYflTUdmzsip0EqskIuuUAvvzsswzcqxTIoyzQr0jsw3z046jU67jM86zY96Tg+5zo+5Ds+4zo94jk83zU44Tc64jk+4T0+2z0+0Tk2wzIvtjAnrzkrqz4qqz4qqT4qqj0pqTwoqTonqzglrzYluTcpxTsw0D0z2Tw13zw35Ds46Ds37jg37zc17zc17jg16zo06Ts05zw05D004j414D833kE62kE72UE+1UE/0UA9zUI/wz86u0A4sz0zqjgtoTUomzUnmDgolTwqkTwojTwpijwoiDomhjknhDclgzYkfzYlfTopdDMhfjkql09Bo1lOnFJHlU9FmFZKlVlOkFtNjlpNjFtNjlxRk19UmWBXkWdXfnhYeYNecnxaVWBCO0UsLzslMDsqMDwuMz0yNDwxNjwyPD82QEE5P0E2PDwwNzcrODkrPj8xOjwxNzovOj4wN0AtPUowT2E7YnhJa4dMdZRRdZlRdJhOcZpOcppTcJpScppRc5xQcptPcJlLbplKcJtMc55PdqFSeaVYe6daeqhdeKZdcZ9XZ5RPXYpFWIJCYIdOWYBJU3pDZ15PZ15PZ15PZ15PZ15PZ15PZ15PZ15PZ15PZ15PZ15PaF9QaF9QaF9QaF9QaWBPamFQamJPamJPamJPaWBPaWBPaWFOaWFOaWFOaGBLaGBLaGBJaGBJaGFHaGFHaGFHZl9MZV5LYltJXFdEV1I/UE06TEk4SUg2SUg2R0g2R0o5R0s6SEw7SU08SE8/Sk4/UFFDWFJGW09DaVJEg1lNllZMsFNM1FpZ20lK4j9C4Tk52jcyzzsxwj8ttEIqszwkyTop0zco1Dgp0zoq1Tkq0zoq0zoq0zoq0jkp0Top0Top0Top0Top0Top0TopzTsswT0wtT0vrD0sozwpmDggkDQblTkgoUEprUMttkEvvz0vwDYrwi8lxzAn0DYu3jo46DU57jY+7DtB6kBD5kFF4EJD3EBB2T8/zTEy0DY20zo80T07yTs5vjcxtTQurTQpqjwtpT4rpT4rpUAspT4rpD4opjsnqTonqjclsjcnvDgrxTguzDcw1Dk03D055j476To37Dk17Dk16zo06Ts06Ds05T004j404EI33UM52kM81UI7z0E9yj88xz07vz45sTwzqTovojgrnDYomDcnlDgpkTopjTooiz0piTwqhzwpgzongjkogDcmfzYlfTYkeDMjeDUlhUIymFVFnVdLlFBDkFBElVpMk1lNkFpOkFxRkFxRkltUlVxVmFtWjmJVa2JFVmA9SlM0PUcsNj8qMj0sND4zNT82Nj02OD84PUI7Q0Y9RUc8Q0Q2QD4vOzkqNzgqPT4wOjwxNzovOj4wNj8sPUowTmA6YXdIa4dMdZRRdZlRdJhOcptPcppTcJpQcZtPcp1OcZxNcJtMb5pLcp1OdaFUeaVYf6tgfqlheqVdcZxVZpFMX4lHXYdFXohJYolQWYBJU3pDaF9QaF9QaF9QaF9QaF9QaF9QaF9QaF9QZ15PaF9QaF9QaF9QaF9QaF9QaWBRaWBRbWRVbGNUamFSaWBRaF9QZ15PZ15NaGBNaWFOaWFMaWFMaWFMaGBJaGBJaGFHaGBJZ2FLZl9MZV5LYltIXFdEVVI/UE08TUw6RUY0REc0REg3REg3Qkk5Qks6Qks6Q0o6SUs+U1FEU1BBWEw8ZUs6dEU1lUg+wllT2VJP4ERF4Do63Dc11Tszyj4vuj0ptTgiyTopzzgn0Dko0jsq0jsq0jsq0jsq0jsq0Top0Top0Top0Top0Top0Top0TopzTsswTswtjourTwspz4rmTkjjzMakzcenz8nozkjsDspwD4wxjwxzDgu0Dcv2Tw14z897D1C7j9E6UNF4kRD2EA/yjs3wDUwuzEuuS8svDUxvjo2uzw2szoyqjgupDgsoToroT0tnz4roD8soUAtoUAtoUEroz4qpj0qqTsqrToosjcouTUpvzUryTkw1D854EM+5D036Ds16Ds15zw05Tw15D004T413kA13EQ52EQ60kM7ykE5xD86vDs2uDg1sDkzojctmTgolTUnkzYnkTopjzwqizophTgmiD0qhTwrgzwqgDwpfjonfDglezYmezYmeTEjgDgqjEc4llNDklBCi0w9kFJFmV9TkVdMkllOlFtSll1Ull1Wl1xWlllUjF5RYVg7RU0oNkAeOEEmPkcyPEU0Mz0yLTcuMTgxNz42QkU8R0o/SEk7QkMxPz4qOzomNzgoPT4wOTswNjkuOj4wNj8sPEkvTmA6YXdIaoZLdZRRdJhQdJhOcptPcppTcJpQcZxNcZxMcZxMcJtLcJtMc55Pd6NWe6dcgq1lgKtkeKNcapVQXYdFWYNBXohIZY9QY4pRWoFKU3pDaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaV9TamBXamBXamBXamBXamBWamBWamBUamFSamFSamFQamFQamJPamJPamJPamJNamJNZ19KZ19KZl5JZV9JYl1JWlhDU1A9TUw6SEk3RUg3QUU2QEQ1P0U3P0c4P0c4PkY3R0s9SUs9QUU0S0o2XFE7YUUvg0o5wGpd3Gdg41VT5EZF5UFA4EE91T41yT0wxj0txjQlyzUmzDYnzTcozTcozjgp0Tss0z0u0jwt0jwt0jwt0jwt0Tss0Tss0TsszjwtuzIotjcusTsvqDopmjcilDUflTcenDkirkEtszsrujYpwTQqzTYv1zw34kM/6khF6ERF6EVI3UNDyTo2uzYxtDgwrjguqTQrqzkvqTkupDguoDgtmzksljorkzwrkjwrlj0rmD0qmT4rmj8sm0AtnUEsoEEto0AtojsqpTooqzcosDYptjYrvjgtxDszzDw02j024D024j844kE34kE53kI22kA210A12Eg90kU7x0E4uzsysjUvqjMtpjEqnzIrmTktkjsqkTkrjToqizopiDsphzsrhTwrgDknfTgofDkofDkofDkoezgneTYmeDMkdy0gi0E0l09Dk01BjkxAkVFFk1VKjlJHmFxSmFxSkVVNkFRMl1pVlVhTlFdUk2daXVQ1SVEqQUsoQkssPkgvN0ArMj0tND8xNDwxSFBDWl5QV1tKTU86REYuQUEnPT0lOjspPj8xOz0yOj0yOz8xND0qO0guUGI8Y3lKbIhNdZRRc5dPcpZMcJlNcppTcZtRcJ1McZ5Lcp9Ocp9Oc59QdqJVe6dcf6pigq1meKNeapNPYIlHXodFYYlKZo5QaJBUZIlTW4BMVHlFaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaV9Tal9Zal9bal9bal9Zal9ZamBXamBWamBUamBUamFSamFSamFSamFSamFSamFQamFQaGBNaGBLZ19KZ19KZF1KXllFVVI/T046SUo6RUg3QkQ2QEQ1P0U3PkY3PkY3PUU2QEY4PkU1PkYxSEw1TUkwVT8nf1E6vHNiy2NY4F9a61VU50dH4kA+4EE92D85zjowzTkrzj0szz0uzz4tzzstzjsrzTkrzToqzjos0Dor0Dos0Dor0Dos0Dor0DoszTsuyT81xUI6vEI3rj0vnzYjljEdljEdmzIdqDUjtDYowzsv0UE43kU/5klE6UpG6ktI3kNB20VE0EI+vDwzrzkvqT0wpT8xnz0wnz8xnD4ylz4wlD4vjz0vij4uh0AuiD8sjj0qkTsqkjwrkz0slD8rlT4rlz4smT4sn0AuoT0tpDosqDgsrDgrsTgttjowvDkvyjwy0Dwy0z811UE310M51kM51EQ50UU4ykI2w0E0uT0zsDowqTYvpDUunzQsmTcskjoujD0sijssiDsrhjoqhDsqgzwqgTwsfjsqfDspezkpeTopeDkodzgndTYndzQkgDQnkEQ3mE5DkUs/jEo+j1FEklRJkFJHk1NKmFhPmFVPl1ZQnF1YlFdSjlNPimNUXVc1WGM5X2pCWmZCSVQ2NkMpNEAqPEg0T1hHWWJRX2ZUV1xGSk43QkUqPz8jPDwiOTooPT4wOjwxOTwxPEAyNT4rO0guUGI8ZHpLbIhNdZRRdJhQcpZMcZpOcppTcZtRc6BPcp9McJ1McZ5NdKBReKRXfKdff6pje6Zhb5pVY4xKXYZEYYlKZY1OZY1OY4tPZIlTW4BMVHlFaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRaV9Val9bal5eal5eal9dal9ZamBXamBWamBUamBUamBUamBUamBUamBUamBUamBWamBUbGFPa2BMaWFOaWFOZl9MYVxIWVZDU1I+TUs8SEk5REY4QUU2QUU2P0Y2PkQ2PEQ1PUY1N0AtQEgxSUszRj8lVz8nh1pDt3NgtlZK2WJa8GVi7FRT5kZI60dI5kNE2Ds2yzcryToqyTosyToqyzksyjgpyDYpyDYnyjgryzcpyzcryzcpyzcrzDgqzDgsyzguwjMtvjUvtjYtrTMooTAini8eoDEgpzMkvEEyx0M31kc/4UxG50xH6UpG5UZC30RA10NBz0RBwUA6sTsxpDwvoUExnEU0mEUzk0QzkUQ0j0IyikEwhUAwgkEvfkEuf0AuhjoqizkrizopijsqizwrjTwrjj0qjzwqlj8ulj0tmzsrnTkqoDgrpTktqTsurjkvuDouvjkwwTswxD4zxT8zxUE0w0EzwUE0tjsssjosqjgtozcrnjYrmzYsmDculDovjTsviDwshzsthDssgjorgDsrgDsrfzwsfTsrejsqejssdzkqdjgpdTcodDYpdjQmiDsxlEY8lk5Cjko9iEg8jU9CkVNIklJJkk9JmVRPmVNRmlZTml1ak1lVjVtUjWxbgX1YfolegIthbHhSTFg0NkQjPUouTFpAZXFZZW9XXWVNUFU+RUkwP0MoPUAjOjwkODknOzwuODovOTwxPUEzNj8sPEkvUGI8ZHpLbYlOdpVSdJhQc5dNcZpOcppTcJpQdaJRcKBMbp1McJ9PdaRWeadcfahgfKdgcJlVZo9NXIRFXIRFZYxNaZBRZo1OX4VIY4hSWn9MU3hFaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRamFSamFSamFSamFSamFSamFSamFSamBWa2Bca19fa2Bea2Bca2Baa2FYa2FXa2FVa2FVa2FVa2FVa2FVa2FXa2FXa2FYa2FXbmJSbWJQamJPamJPaGFOZV5LX1pHWVZFUk8+TUs8R0g6REY4Q0U3QkQ2QEQ1PEMzPEg0OUItRkozTEYwTzolcUw5mmNPql5OoUE1xlNM52Nf8F5e7VNV60pP6URI4UFBzDkxxzktxTcrxTcryDgtyjovyzswzTow0T400T400j400j400z810z810z810z430z870UI+y0Q+xkY9wkY8w0k+x01AzlBE2VNI3VBH4k1H5ElF5EdC4kM/4EE920I91UZCyUQ/uj83qz0wnz4umkMwlUczlEk2jUY0jEUziEMzhUIxgEEwfUAuekEufD8tgjoshjgshTkrhjoshjoshzsthzsriDsriTorizopjjgpkDgqlTksmTsvnT0vojwwqjovrTgurzkvsDousDousDosrzkrrjgqqDcppTconjYpmzYqlTcrkjgtkTkvjjwwiDwuhTwtgzssgTkqfzoqfjkqfToqfTsrfDosejsseTssdzkqczgqcTYocjcpdTUpjEQ4kkg9kUs/ikg6h0k8i09Ek1RLl1RMllFMm1RQmFFPlFNPllxYkF9YkGhel35qlJRwhZJmdYJXWWg/Q1IrP08qUGA8Y3JRZXRVXGlLTlg9Q0wxP0UrPkIpPUEoOz0nNzgoOjstNzkuOTwxPUEzN0AtPEkvT2E7YnhJbIhNdpVSdZlRdJhOcptPcppTb5tQcaBPb55Nb55Nc6JSeqhdfKpheqVedaBbY4xKXodFW4NEX4dIZ45PapFQZo1MYIdIYodRWX5LUndEaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRamFSamFSamFSamFSamFSamFSamFSamBUa2Baa2Bca2Baa2FYa2FXa2FVa2JTa2JTa2JTa2JTa2JTa2FVa2FXa2FXa2FYa2FXb2NVbmJSa2JRa2JRa2JRaGFPZF1NYFpKWFJCUk8+Tks8SUc4R0U2REU1QkMzPkIxPUkxP0cvTEcxUz4rZz0tlVpMrV9TnD40njMrtj852FhV82ln9mRl61JV5kpO6E5Q2UlB00Y8zUA2yz40zkA20kQ61Uc910c+2kpB2kpB3UpC3UpC3ktD3ktD4EtE4EtF61NS6FRU41NS3FJP2FNM2FNM21VM4FVO4ExI4UlG40VC4kNA5EJA4kNA5EVC4EZE2UpGykVAuT43rD0yoT8ymEIxkkUzkEc0jEUziEMzh0Izg0AwgT8xfj8wej8vfD4vgDougzkugzkugzkugzstgzstgzstgzstgTkqgjkqhTkrhzoqiTorjTstjzwukzsvmzsvnjktnzktoDosoTksojgrojgqojgqnzgpnDgpmDgolDgpjzkqjDosiTothzsthDotgjosgTkrgDgqfTgpfTcrfDgrezkrejgseTkteDotdjgrcTUqbzUpcTcrdDkrjEg7jUk8iUk9hEk7hUs/jFJGk1dNmFhPmFFNnFVRmFJQk1ZRkmBZiGJXg2dbhnpkbnJRWmlASlkwQVIoSVowV2k/ZHZOanxWWGlFTFs6P0wuOkQpPEQsPkMtPEEtOj0sODkrOjstNjgtODswPkI0N0AtO0guTF44X3VGaYVKdJNQdJhQdJhOcptPc5tUcJxRbp1NbZ5McKFQd6hZfKpheqhgcp1YaZNRWoNBXIRFYYhJZYxNZ45NZ45LaI1KZopMY4ZQWXtJUnRCaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2FVbGJZbGJZbGJZbGJWbGJWbGNSbGNSbGRRbGRRbGRRbGNSbGNUbGJWbGJYbGJYbGJYb2NVbmJSa2JRbGNSbGNSa2JRZ2BQZF1NXldHWVNDU00/TUo7S0g5R0U2RUIzP0IvO0guP0gtT0MtYT0tg0U6q1hStE5Kniwrsjo5uT0701NS8nBu/nZ28WVo61he8F5f41VR2lBG1EdA0EM60UQ91Ec+1kdB1kc/2UhD2kpC3EhE3UpD3kpG3ktE4EtH4EtH4khI4UdJ3EhI2UdH1khE10hE2EdC20ZC4EJB5EFC5kJB6EJC50NC5EJA30E+20E/20pHykM/uTw2rj4zokAzmEEwkEEwj0MzikEyiEAxhz8xhT0xgjwwgDwxfz0xfz0xgTsxgTsxgzozgTsxgTsxgDwvgDwxfz0vgDwvgD0tgTwtgDssgjosgTkqgjgrgzcpjDoujzgukTktlDovlzsumj0unjwvnz4umTkpljkokzoqkDorijsshzsrhDssgjorgjosgTkrfzcpfjYoezUpezUpezUpejYpeDYqeDgsdzksczgqcDQpbzUpcjotdjwwi01AiUs8hEo8gk09hVFDi1ZIklhNl1dOk05JmVRPl1ZSlVxVkGVce15QZlZGYF5HRU8tPk4pP08oSlwyX3JFa35RZXhLWGpATV83QFEtNkUmN0QqPUYxPUQ0Oj4wNzstODosOjstNjgtODswPkI0N0AtOUYsSVs1W3FCZYFGcpFOc5dPc5dNcptPc5tUcJxRbZxMb6BPc6RVeKhceqhgc6BbaZNRYIpIWYFCXoZHZYxNZ45NZo1KZY1HZ4xHaIxMYYROWHpIUXNBaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGJYbGJWbGJWbGNSbGNSbGRPbGRPbGRNbGRNbGRNbGRPbGRRbGNSbGNUbGJWbGJWb2NVbWFTa2JTbGNUbWRVbGNUaWBRZl9PYltLXldHWFFBUkw8T0k5Skc2SUMzQUMuOkcrQEYqVUAreEc5o1BMtEhItjg8ujM5yEFFxD9AykpJ32Jg8XFw8G5w52Jl4lpc21FO1UxEz0Q/zUI7z0Q/0EU+0EI+zUA50kM/0kM91ENA1UQ/10NB2ERA2UVD2kRD3UFE3UFE3kRG3UdI30lI4EpJ40lJ5UdI50FD6kFE7EJF7EJF50FB4kA+2z061T062kZGyT08uTgzsDsypkA0mD8xkT4wj0AxijwvijwwiTsxiDowhzgxhjkzhTo0hDs0gTszgDwzgTo0gDwzfzwzfT0xfT0zfDwwfDwwfD0ufD0uezwtfDosezkpejgqezcqgjougzkuhzktiTkujTkukTsulTwulj0tkjkpkTopjToqijsqhzsrgzwqgDsrfjsqgDgqgDgsfjYqfTUpfDQoejQoejQqeTUqdTIpdjYsdjgtcjYrbzMpbzUqczoveEAzilBChk4/gU49glFAhVZGiVhJjlVKkVJJkk9Jl1ROk1RPkVxWimZabltKUEs3RUsxQU4wS1o5V2dDYHJKZ3lPZHpMVmw+R10vQVYtN0gkMUAhNkIqPUY1PEQ5OD02NzozOTsuOzwuNjgtOTwxP0M1N0AtN0QqRlgyVmw9YX1Cb45LcZVNc5dNcptPdJxVcZ1Sb55QcaJRdaZXdqZac6FZapdSYoxKW4VFXoZIYIhJY4pLZYxLZo1KZo5IZotGZYlJYINNV3lHUHJAaWBRaWBRaWBRaWBRaWBRaWBRaWBRaWBRa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGJWbGNUbGNUbGNSbGRRbGRPbGRPbGRNbGRNbGRPbGRPbGRRbGNSbGNUbGNUbGNUbmJUbWFTbWFTbWFTbWRVbGNUamFSZ2BQZF1NYFlJWlNDVU4+UEs4TUg1SUQxREMuQEYqREQoW0IsiFRHr1xYqz5BrC8zzklOxj9FwDs+uzs8xEZH2Fpb42Vm21lbzEdI0UpH0EVCzUI/0EI+1EZC1EZC0EI+yT43z0Q9z0Q90kRA1EVB1kVC2UVD2kRF3URG3j9D30BE3kJF30VF4UdH4EZG4EJD4T4/6EJE6UBD6D5B5z0+5D4+40E/4UNA30VD1kJCxTk4tjUwsDs0pj82mj4zkD0vjT8yiDwvhzowhzowhzgxhzgzhzgziDk0iDs1gjkygDoygDoyfzsyfjwwfjwwfDwwfDwweDgseTktejouejouezwtezwtejssejssfTsvfzkvgDcugTcshDYqhTUqhjcqhjcoijgqiDkqiDsrhTwthDwtgD0sfjwsfTsrfTksfTctfDYseTUqejQqeDQpeDQpeDUscjIodTUrdjgtcjYrbjQpbjUqdDsweEI2ilVHhFBCgE9AhFNEiFdJjFZKjFJHjU5HlVROlFVOi1JLhFhNf2RTZVpER0syPUosSVg5WmtJZ3hUY3hRWW5FU2g9TmM4Sl80OkwmMD8eLDkdNT4pPUM1PEI4Ojw3OTw1Oz0yOz0wNzkuOTwxP0M1OD8tOEIpRVUxVWg7YXpDbopNcpNOcpZOcppRc51TcZ1ScqBVdaNYdqRbdKJab5pVZpBOXohIW4NEZIxOYYlLYIdIY4pJZo1KZ45LZYpFYYVFYINNV3lHUHJAaWBRaWBRaWBRamFSamFSa2JTa2JTa2JTamFSamFSamFSamFSamFSamFSamFSamFSa2JTa2JTa2JTa2JTa2JRa2JRa2JRa2JRbGNSbGNSbGNSbGNSbGNUbGNUbGNUbmJUa11QcGBRdGRXcmRXbmJWamBUaGBTaGJUZ2FTZ2FRY11NW1ZDVlE9U044TkgyR0EpS0csST8kYkkzkWdXtnhtu2xluFlXuU9PtkJFvUJFwkRHyEZIzUhL0EpL0kxN00tNz0VF0ERF00VE1kZF1UZC0kM9zkM8z0Y8yEQ4yUU5ykU8zEU/0kRA10ND2kFE2z9D4UJG4kJE4UNE4ERF4ERF4UZE40VE5ERE40ND5EJA5EA/4z8+4z8+4kA94kA93kM/00I/xT46tjkzqjcwnzowlz0yjj4zhj4ygz8ygT8zgT0ygTszhDkzhjkziDgxiDkyhTswhDwuhDwugzstgTsvgDougDougDoufjotfjotfjotfjotfTsvfTsvfTsvfTsvfTkwfTkwfjgwfjgugDcugDcugDcufjgsgDgsfjgsfTksfDgtezktejgseDgseDgseDgueDgudzctdjgtdjYsdDYrczUqcTUrbTEncjYsbjQpbTMobzYrbTQpcTgtf0k9hVNIhVNKhlJHiFJIi1BIkFFKlFFLlVJMk1RNjVRLiVtOgmNRb19IWVU6TVY3T187an5ZYnhRWW9IVWpDUmdATWI7SVk1Q1IxN0QmND4jMjojNjsnPD4wQEI1QEA2PD4zNTgtMzktNDouNzovOT0vOz8uPUIsPEUoU187YXJGboZSc5FVcpVRcppTc51Tcp1VdZ5afqdlfqdlcJhZYopLXoZHXoZIXoRHYIZJYohLZIpNZo1OZYxNY4pLYIdIXoRHX4JMVHZES207aWBRaWBRaWBRamFSamFSa2JTa2JTa2JTamFSamFSamFSamFSamFSamFSamFSamFSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbmJUcmJTcWFScmJVcWNWcmZab2dabWVYamRWZ2NXa2hZb2lZbGdUaGNPY15IW1U9Ukw0UEowSD4lUT8pa1A9f1hHhE5CiEU9k0Q/sVdWuFRUu1FRwFBPwE5NwU1NwkxKw0tK0FRUyEhHwj0+xD060EJA00VBz0I7xz40ykQ5yUU5y0Y9zUc+1EZC2ERE3EFF3UFF4UJG4UNE4UNE4kRF4kRD4UZE4UZE4UZE4EVB30RA4EI/30E+4EE94EE94EE93kM/1EU/yEM8uj42rDowoDkwlDovijwwgjwwgEEyfkAzfj40fzwzgzozhjkxiDgxiTkwhzsuhTwthDsshDssgzstgjosgjosgjosfzktfzktfzktfzktfjovfjovfjovfjovfTkwfTkwfTkwfTkwfTkwfTkwfDkwfDkwfDkwejowejoweTkveTkveTkvdzkudzkudzgvdzgvdDguczctcjYscjYscDYrcDYrazEmcTcsbTQpbDMobzYrbDMocDcsfkg+hFJJhVNMiFFKi1BKkFFMlFBNlVFOlFNPik9HhVNIgFtLe2VQc2lQaGtMZnFRZ3hUXnRNWG5HUGY/TGE6S186S1w6R1Y3Q1A0PEYtOEApNjsnNzopPD0vP0AyPj4yOz0wNDowMzswNTsxNjwwOjwvPD8uPkEsPkQqUVs5Xm1Ea4FScIxScJNTcZlSc51Tc55WeJ9efKJleJ5ha5FUYIZJXYNGXYNGXIJFYIZJYYdKY4lMZYtOZIpNYohLYIZJXoRJXX9MUnRCSWs5aWBRaWBRaWBRamFSamFSa2JTa2JTa2JTamFSamFSamFSamFSamFSamFSamFSamFSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbmJUcWRUb19QbV1QbV9ScWVZb2dcbGRZaGJWZmJXcGxge3hpfntqf3lpenVicGlWZWBKVFQ8RkYuQz4oTUIuU0AvVTgoXTcqbD0zbjcwdTkxfjs1h0A6kklCm1BKpVhQrVpSu15ZulNOt0dFvEI/yERC0UZD00RAz0A60EE70EM80kU+1EdA1kdD2kZG20VG3kRG30NE30NE30NE30NE4ERF30VF30VD30VD3kRC3kRC3EQ/20M+3EM93EM93EM920M+1kVAzkU/w0I8sz41ojoxlDgtiDksgzstgkAyf0Axfj4yfz0xgzoxhjkxhzgxiDowhzsuhDsshDsshDssgjosgjosgDougDoufzktfzktfjovfjovfjovfjovfjovfjovfTkwfTkwfTkwfTkwfDkwezgvezgvezgvezsxezsxejoweTsweDoveDoveDoveDovdDgudDguczctczctcjYscTUrbzUqbzUqajEmbzYrbTQpazInbDYqaTMnbTcrfUc9h1BJh1BJi1BKjlFMkVJNklNOlFVQkVZQjFdPh1tQfl5PdGJOb2lRb3JVbHdZZndVUWVCS186RVk2RFUzRVY2R1Y5R1Q4RVI4P0kwPEQtOT4qNzsqOjwuPD4wOz0vOTsuNjwyNT0yNjwyNjwwOjwvPD4wPUAtPUMpTVc1WmlAZnxNbIhObpFRcZlSdZ9VdJ9XeqFgd51gbpRXY4lMXIJFXIJFXIJFWoBDX4VIYYdKYohLZIpNY4lMYYdKX4VIXYNIW31KUHJAR2k3aWBRaWBRaWBRamFSamFSa2JTa2JTa2JTamFSamFSamFSamFSamFSamFSamFSamFSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbmJUcmRXb2FUbV9Sa19Ta2FXbGNabGVbamZdamZdeHRpiIR4kY2BlY+Bkox+iYJyfXpnYGNOT1Q+REcyRkUxSEMwRj0sTDwsVkM0UDkrUjYqVjQqWTUpXDYrYTkvZT0xbT0xiktCnVNKrlVPtk5LvEZExkFC0kRD2EZG1EA+1UE/1kI+1kVA2UVD2kZE20VE3UVE3kRE30NE30NE3kRE3kRE3UVE3UVC3kZD20ZC2kVB2UQ+2EU+10Q810Q82UQ92EU+1EQ800Y/yUY+ukE4pzsxmDgsjDkrhTwtg0Awf0Axfj8wfz0vgzoxhDovhzkviDouhDothDsshDssgzorgjosgjosfzktfzktfzktfzktfjovfjovfjovfjovfjovfjovfTkwfDkwfTkwezgvezgvezgvezgveDguezsxeTsweTsweTsweDoveDoveDovdjovczctczctczctcjYscTUrbzUqbzUqbTQpajEmbzYrbDMoaDImazUpaDImbDYqfEY8ik9HjE9KjVBLj1JNkFNOkVZQkFdQjFpRiV1ShWFVeV9QaVpHZF9JZGhPXGZLTl1ARVU4QVE0PU0wPEsuP00zQ1E3RlI6R1M7Qkw0PkcyOkEvOT0sOT0uOT0uODwtNzstNz0zNj01Njs0NjwyOjwxOz0vPD8sPEEqSlM0VmU+YnhJaoZMbpFRc5tUd6FXeKJae6JhcphbZYtOXIJFWoBDXIJFXIJFWoBDX4VIYIZJYYdKYohLYYdKYIZJXoRHXYNIWXtITnA+RWc1aGFRaGFRaGFRaWJSaWJSamNTamNTamNTaWJSaWJSaWJSaWJSaWJSaWJSaWJSaWJSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbGNUcmZYdGhcc2dbbWNZamFYbGVdc25oendwgX53kI2GoJ2UqKWcq6ecqKSZo52RmZaHentrY2ZTT1I/R0o3RUg1QkUyQkUyRUg1S0w8Skg5R0Q1RD4wQTksQTcrQDYqRjQoUzUqcUI4jFBIn1BLr0lHv0dJzEVJ00JF1kBC2UBC2kJB20NC2kVB2kVB3ERB3ERB3kRE3kRG3kRG3kRG3kRE3UVE3UVE2kRD2kZC10ZB1kY+1EU91EU900Y91EU91UY+1EE600M7zkU9wUI5rj4znjktkTsuijwvhD8wgT8vgD4ugD0tgTsvhDothjothzsuhDotgzstgjosgjosgjosgTkrfzktfzktfjovfjovfjovfjovfToxfToxfToxfToxfDkxejoxfDkxeTkweTkweDgveDgvdjcueToxeToxeDkwdjowdjowdTkvdTkvdDovcjcvcTYucTYucDUtbzQsbjMrbjMrbTQrajEobTctajQqaDIoajQqZjInajYrfUQ7jU5Hj05IkFFKkFRMkFVPjldQillSg1tRe1lNdlxPa1pKXVVCWVhEWV5IT1lBP0szOkgvN0UuNEIrNUErOEQuPUkzQ0w3RU45Qks2P0g1PEUyOkEvOD8vNz4uNTwsNDosNTw0NTw1Njs1Njs0OTswOjwvOz4tO0ApR1AxUmE6YHZHaYVLb5JSdZ1WeaNZeaNbeJ9gbpFXYINJWn1DW35EXoFHXoFHXYBGYINJYYRKYoVLYoVLYYRKYINJX4JIXoFJV3xJTHBAQmY2aGFRaGFRaGFRaWJSaWJSamNTamNTamNTaWJSaWJSaWJSaWJSaWJSaWJSaWJSaWJSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbGNUa2FVbmRacGZcbGNaa2Rccm1nhIF8kZCMp6OgtbGuxMG8ycbBycS+xcC6wLmxubKopJyPiIJyZmNUUFE/Rkk4PkUzO0QxOkYyOEUzOEUzOEMyOkIzPEI0QEM4Q0U6R0U5PjQoUDovZT82gEVBoVBPv1hbylFWykNJ1UZK10VG2kZG20VE3UVC3kRC3UQ/3kNB3kRE3kRG3kRG3kRG3ERD3ERD3ERD2kRD2UVB10ZB1UZA00Y90kU80EY80Uc91EU91D841UA50EM6xkM5tkE3pT0wlj0vjD0uhj4vgj8vgT4ugD0tgTwtgzsthDothTsugjosgjosgjosgjosgTkrfzorfzktfjgsfjovfjovfjovfjovfToxfToxfToxfToxejoxejoxeTkweTkweDgvdjcudjcudDgudzgvdTkvdTkvczkudDguczkucjgtcjgtcTYucTYucDUtbzQsbjMrbTQrbDMqajQqaDIobDYsaTMpZjInaDQpZTEmaTUqe0I5jk1Hkk1IkVBKj1RMjVZPh1hOgVlPfFxRc1xOa1tMYFdGVlNCUFNCSlE/QEk2NEAsMzwrMjsqMDkoMDkoMjsqNT4tOUIxPEU0P0g3P0g1Pkc0OkYyOkMyNUAvMz4tMTwsMzozMzk1NDk1NDkyODkxOTsuOz4tO0AqQ0wvT143XXNEaYRNcJNTd59ZeaNZd6FZcZhZZolPWn1DWHtBXH9FXYBGXYBGXoFHYINJYINJYINJYINJYINJX4JIXoFHXYBKVntISm5AQWU3aGFRaGFRaGFRaWJSaWJSamNTamNTamNTaWJSaWJSaWJSaWJSaWJSaWJSaWJSaWJSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbGJWamBWamFYa2Raa2dedXBqiIWAn56asLCuw8LA09LQ4uHf5+bk5+Pg497a3tbT2c7IzryyuKWXl4d6eW1dX1lJS0w6QEUxO0QvPko2PUg3PUY1O0M0Oz41OjszOTgzODgwPT0zQzwyTjcxYTg0iEhIr11fxWBkyldazVFT005P101L20tK3khH4UZE40RB4kJC30NE3kRG3kRG3UNF3UNF3EJE3EJC20NC2kRD2ERA1UQ/00Y/0kU80EY80Ec91EU92UA62UA60UI6yEM6vEM6rEA0mTsvjDkriT0vgz4ugT4tgD0sgTwsgzssgzsshDwtgjosgjosgjosgTkrfzktfzktfjgufTkufjovfjovfToxfToxfToxfToxfToxfToxejoxeToxeDkweDkwdzgvdDguczctcjgtdDguczkucjgtcTgtcjgtcDcscDcscDcsbzYtbzYtbjUsbjUsbTQrbDMqazIpaTMpZzEnazcsaDQpZTEmaDQpYjAlZjQpekE4kE1Hkk1IkVBKjlVMiFhOgVlPeFpPclxOa15OXldHUlBBS049Q0o6OUIxMjorMDgpMTcrMTctMDYsLzUrLzUpMDgrMjorNDwtOUQ0O0Y1PUg3PEk3O0Y1NkMxM0AsMT4tLjgwMDYyMTYyMjcxNzgyOTswOjwuOj8pP0grS1k1W3FDaINMcZNWd55bd6FZc5xWZ41QXoFJVXhAV3pCW35GW35GW35GXYBIX4JKX4JKX4JKX4JKXoFJXoFJXYBIXYBKVXZJSmtAQGE2aGFRaGFRaGFRaWJSaWJSamNTamNTamNTaWJSaWJSaWJSaWJSaWJSaWJSaWJSaWJSa2JTa2JTa2JTa2JTa2JTa2JTa2JTa2JTbGNUbGNUbGNUbGNUbGNUbGNUbGNUbGJWcGdebmdfbGdhdHFqh4R/oaCcvLy6ztDPz8/P4ODg8vLy+vj5+/f29/Pw8ezp8OLf6NDG3cG1waudopGBfXViXlxHS003Q0gyQUkyQUk0QEc1QkQ3QUE3Qj05Qzk3Pzo2OTw1Pj83QjcxSi4rZDY2j1FSs2dpxm5twFxcx1pX0FZT11FO3ExL4khI5kNE5UJD30NG3URG3URG3UNF3UNF3EJE3EJC3EJC3ERD2UNC10M/00Q+0kU+0EY80EY81EU93EM920E50kI6ykQ7v0U6sEE2nDotizUmijwvhT0ugj0tgD0sgTwsgTwsgzwqhDwtgjosgjosgjosfzorfzktfjgsfTkufTkufjovfjovfToxfToxfToxfToxfToxezsxeToxdzsxeDkwdTkvdDguczkucjgtcTcscjgtcTgtcDcsbjgscDcsbTcrbzYrbzYrbzYtbzYtbjUsbTQrbDMqajQqaTMpaDQpZjInazcsaDQpYzEmZTMoYjAlZTMoeEI4jk1Hkk9JjlJKilVNg1hPelpPcVtNaFxMWlRESUo6P0M0PkQ2OUEyMDgrLzcqNjwyNDcwNTgxNTcyNDcwMjUuMDYsMDgtMTksNkEzOkU1PUo5Pks5PEk3N0YzMkEsMT4tLDYuLjQwMDUxMTYwNjcxODovOjwuOj8rPEUqSVc0WW9BZ4JNcJJWdp1cdZ5YcJlVYIZJWHtDU3Y+V3pCW35GWXxEWXxEXH9HX4JKX4JKXoFJXoFJXoFJXYBIXYBIXX9MU3RJSGhBP103aWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTamNTa2JTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbGRXaWJaZ2RddnNuk5KOr6+txMbF2tzb6u7v8/T29vf5/Pz+///////9//v6/Pf0/fLs9+HU8tjH4Mq1xrafqqCHiIRpYmJGRUgtREgvQ0cwRkUxR0Q1RjwzQzYwRjQySDo5Pj05Pj86Qjo3STc1Y0dGkmpqxZOS6K2p0ouHx3RuwF1YxlNQ1U9O30pM50ZL6UZL30VH30lL2kRG1Ds+2D5A4UdJ4ERH1jo92kBA2kBA2UFA1kI+1EM+0UI80EE70UE53kM+20E500A5ykE5vkI4sEA1nzoukDgqjD0whz4vgz4ugT4tgD0sfzwrgT0qgTwsfzorfzktfzktfjgsfjgufDgtfDgtfDgtfDkwfDkwfDkwfDkwejoxejoxejoxejoxeT01dzw0dzszdToydDkxcTgvcDcucDcubzYtbTctbTctbDgtbTctbDgtbTctbTctaTIrbTYvcDkybzgxazQtZzIqZzIqaDMrZTAoaTcuZDIpXS0jYDAmXy8lYjIocz42jE9Kj1BLiFFKgVJKfVlNdl9RZllJVE4+REU1PkU1OkMyNUAwNDwvMzswNDowNDowNjgzNzgzNjY0NDYxMzUwMTYvLzYuLjYrLjkrMj0tNkMyOkc2Okk2OEc0NEMuMT8uKjQrLDIuLTIuLjMtNDUvNzkuOjwvOj8rNj4mRFIxV2xDaIJSc5Rdd55fcptXa5RSW35EWHlEVHVAVHVAV3hDWntGW3xHWntGXn9KYoNOYoNOXn9KXH1IX4BLYIFMXn5NVHNKRmRAPFc0aWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTa2JTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbGRZZ2Rdb25qhoWDpKSiwcPC1trb6u7v9/v89/v++Pz//P3//v7+///9//76//z5//rz//Dg++vU7d/F182ywLudpKOEgoNjZ2pLTFEzR0ovRUMuR0IvSD4ySTozTDk1Szw5Pzo3QkE/TUhFXVJQeWpno46LzrKu6MW//9fR7LOqzYJ8wGNeylZW2FJT30hN2kFE1kRF1UVF2EhI3EpL20VG1Tw+1jw+20FD2T8/2T8/2UFA10FA1kI+00I90kE800A53EE820A700A5y0I6v0M7sUE2oDsxkjgtjD0whz4vgz4ugT4tgD0sfzwrgTwsgTwsfzorfzktfzktfjgsfTkufDgtfDgtfDgtfDkwfDkwfDkwfDkwejoxezsyezsyejsydzw0dTwzdToyczoxcjkwbjgubzYtbTctbTctbDgtbDgtbDgtbDgtajgtbDgtbDgtazYubjcwbzgxbjkxbDcvaTQsZzIqZTMqYzEoZDQqXy8lXi4kYjIoXi4kYDAmcD41gUpFh1JMh1hSflhPclZLZFJEUUo6Pj8vOkExNkEwNUAwMz4wNDwxNDwxNTsxNzozNzk0Nzc1Nzc1NTcyNDYxMTYvLzYuLzcsLjkrMTwuNEEwOEU0OUg1OEc0NEUyNEIxLjgvLjUuLjMtLTIrMjMrNDYrODotOT0sNz8oRFEzV2xFaIJVdJVgd51icJhZZ49QWXxEV3hDVHVAVHVAVndCWXpFWXpFWXpFW3xHX4BLX4BLXH1IW3xHXn9KXn9KXntNU25LRl9BOVI0aWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTa2JTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbWRVbWRVbWRVbmVWbmVWbGZaZWRfeXt4l5mYsra3zdHS5Ons9Pn8+v//+////P///f7//v7+//78///7///6///0/vzn+vnd7/DR4eXE0ti0vMSfoKiDh5FsYGdFUVg3REcsREMuSkQ0TEQ3S0E4ST46Qzs5U0pLaWFfgXd2nJKQvrOv2c7I6tzT/ujd//Pp/+Tb8Kmjw2VjtUJFx0RJ2lJW21VU0U1LykRBzUNB1EZF10VG2ERE2UNE1j0/1z5A2EA/1kA/1kJA00I/00I91EE62UA62UA60kI6y0U8wEQ8skI3oTwykzkujjwwiT0wgz4vgT4ufz0tfjwsgD0tgD0tfzktfzktfjovfTkufTkufDgtezgvezgvfToxfToxezsyezsyezsyezsyejs0eDw0dDsycTsxcjkwbzkvbjgubDgtbDYsazcsbDgtajgtajgtajgtajgtaTktajgtajgtbjkxbTgwbTgwbTgwbTgwaTcuZjQrYzEoZDIpYTEnXS0jXzAmYzQqXC0jXzAmc0Q8fVBKgVZQfllRcFRJXko/T0M3PzwtNDYoMjsqMDsrMTwuMj0vNDwxNDwxNTsxNzozNzk0Nzk2NjgzNTcyNTcyMjcwMDcvMDgtLjkrMDstMj8uNkMyN0U0OEc0OEc0OUY1ND4zMzoyLzQtLDIoLzAoMTMoNTcqNjopNj4nRFE1WW1Ka4Rad5dmd5xmbJNaX4dLV3hDV3VDVHJAVHJAVnRCWHZEWXdFWXdFWnhGXXtJX31LXXtJXXtJX31LXnxKWndLUGdKQVdAM0kyaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTaWNTamNTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbWRVbmVWbmVWbmVWbmVWbWdbamtmg4eIo6eoub7B0NXY5e3v8/v99f3/+///+////P///P77/f75/v34//73///z+P3m9P3e7vfY5vLO3enDztq0tsGZoauGgIdlZm1MTVE2RkgwSEo1S0k6SEQ5REA3T0dEamBfi4GApJqZt6+sy8bC3tvU6ubd+vHo//vx//ft/93V+7ax5Y+OymNksEA/w1BLyVRNyVBIw0ZAyEdC1E1K1ktI0EA/0j4+0z8/1T8+1UE/1UE/00I/00I900I91j451UA60kM9zEU/wEU+skE5oj01lTsyjjwxiT0wgz4vgT4ufz0vfjwsgD0tgD0tfzktfzktfjovfTkufTkufDgtezgvezgvfjsyfjsyfDwzezsyezsyezsyejs0eDw0cjkwbzkvbzkvbTkubDgtazcsajYraDYraTcsaTcsaTcsaDgsaDgsaDgsaDgsaDgsbTsybDcvajUtaTcuajgvajgvZjQrYTEnZTUrYTIoXS4kYTIoYjMpWSogYTIoeU5FgVxWdldSaU5HV0M6STwzQDouOjstODwuMDgpLzoqMzsuNDwvNT0yNTsxNjkwNjkwNzk0NjgzNjgzNDkyMzgxMzkvMTkuMTkuLjkrLzosMD0sMj8uNUIxN0U0O0g2PEk4OUM4Nz80MjguLTMnLjAlLzEkMjQmNDgnNDwnRVI4XXBQcotke5pud5xpZo1YVXxFU3NBVHJAU3E/U3E/VHJAVXNBVnRCVnRCV3VDW3lHXXtJXHpIXnxKX31LXHpIV3JJSl5FPE07Lj8tZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTaWNTamNTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbWRVbmVWbmVWb2ZXb2ZXbmddcXFvh4yPpKmst7/CzdXY4+3v8vz+9P7/+P//+v//+//8/f/6/P31+vzx+fnt9vjq9v/o8//k8P3h7vnZ6fTS3ujFytKttr6ZnaOBfYJiWV1CR0w1Rks3Rko5Q0c5QUM4Y15YhX16q6Gfwbe1zMLB18/N5uHd8e7p+vfw/PXr//Hm//Lp//Ts/+Xf6aikt2hjpkxBtVBEwVlOx1tRxlFIv0Q9wkE8y0RBy0A9zkA+0EA/0UFA0kM/0UM/0UM/0kM90z870kE80EVAyUVAvUM+r0A5oD41lT0zjjwxiTwygz0xgT0wfz0xfjwufz0vfz0vfjovfjovfjovfTkufDkwezgvezgvezgvfDwzfDwzfDwzezsyejs0eTozeTozdzszbjcwbTgwbDcvbDcvazYuaDYtaDYtaDYtaTcuaDguaDguZzguZzguZzguZzguaDguazkyaDYvZjQtZzUuaTcwaDcwZTQtYjEqYzIrYjMrXzAoXTEoXTEoViohYjYte1VMdFlSYU5ITj84QTcuPTYsOzktOTsuOTwxMzktMzsuNTsvNjwwNjwwNzovNTgtNDcuNjkwNDkyMzgxMzkvMzkvMjovMTkuMTksLjkrLjkrLzosMDstMz4uNkMyOkU1PEc3PUU4OkI1NTsvMDYoMDIlLzEkMTMlMTUkMjolR1M7YnVXd49rfJtycZVnXIJRSnA9T28+UW4+UW4+UW4+UW4+UW4+U3BAU3BAV3REW3hIXXpKXXpKX3xMX3xMWndHUmxFQ1U/NkQ3KDYpZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTaWNTamNTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbmVWbmVWb2ZXcGdYcGdYbmddbG5teoKFk5qgq7W3xM7Q3Obo7ff59P7/9f799v/8+v/6+//5+/7z+Prt9fbo8fTj9P3q9P3o9Pzl8/nf8vbb6ezN2Ne5xcSlsbCSj45yZWdPTVA7R0s6Rk09R09CS1FHe3tzn5qUxb642M7M39PT59vb8+vp/Pf08O/q/Pz0///2//3z//nv//Pq/+fe/9fL2JODuGVTo0o6tFRGvVdJtUY7t0A4yEtFx0M+ykM/zEI/zkNAzkM+zkM+zUQ+zUI90UI80kM/zkRBxUQ/uEE9qj04njs1lTw0jjsziTwygz0zgT0yfz0xfjwwfz0xfz0vfjovfjovfjovfTkufDkwezgvezgvezgvfDwzezsyezsyejoxeTozeDkydzgxdTkxbjcwbDcvbDcvajgvaTcuaTcuaDYtZzctZzctZzctZjctZjctZjctZjctZjctZjctaDcwaDYvZzUuZzUuZzYvaDcwZzYvZjUuYTIqZTYuXjIpXDAnYDQrYTUsaT00dVNKWEdART42PDUvOTUsOzgvODovNTcsMzYrNjkuNTsvNzovNjkuNjkuNTgtNTcsMzYrMjgsMTksMjguMTksMTkuMTksMTksMTksLjkrLjkrLjkrLzosMDsrMz4uNkExN0IyPEQ1OkMyOD8vNTstNDYpMjQnMTMlMDQlMDclSFQ+ZXhcdY1tdJJsZolfUndLQmg5S2s8Tms7UG09UG09Tms7Tms7T2w8UW4+VnNDWndHXXpKXntLX3xMX3xMVnNDTmdAPEo5LzoyJC4mZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTaWNTamNTa2JTa2JTbGNUbGNUbWRVbWRVbWRVbWRVbWRVbmVWbmVWb2ZXcGdYcWhZb2heaGlrbXR6hYyUo6yxv8jN097i5fDy8Pz88vz79f75+P/3+v/2/P/y+v3s+Pnn9vfn9vbq9/fr+vfo/Pbm/fXi9+zW59jD1cavwLGanpN9dW5bWldGUFFDU1ZLW2JaZWxklZiNsrKo1c7G6N3Z8+Pj+urr//H0//f5//77/v35+fr0+Prv/Pzw///z///x//vq/+bR8aqUvG9bqVZErlJDtVBEu0xBv0pBwkc/xkU/yUVAykVAykU+yUQ9yEM8yUI80UM/0EVAzEVBwkM9sz05pjs1nDs1lTw2jDwzhz00hTw1gT00fzwzfjwwfz0xfz0xfjovfjovfjovfTkufDkwezgvezgvezgvezsyezsyeTozeDkydzgxdjcwdjcwczcvbjcwajgvajgvajgvajgvaDguaDguaDguZzctZjctZjctZjctZDgtZDgtZDgtZjctZzYvaDcwaTgxaTgxaDcwaTgxajszbD01Zzgwazw0YjYtYTUsb0M6eExDdElAbk1EQzkwNTYuNDUvODkxODsyNDcuMTQrMjUsNTgtNTgtNTcsNDYrNDYrNDYrNDYpMzcpLzcoLjkpMDgrLjkpLjkrLjkpMDgpMDgpMTkqMDgpMDgrLzcqMDgrMTksMzsuNDwtOUIxOkMwO0IwOkExOjwuNjgqMjQmLzMkMjknSVU/Y3VbbYRnZoRiV3lUSW5FP2Q4SGc7TGk7Tms9Tms9TGk7TGk7TWo8T2w+VXJEWXZIW3hKXXpMXntNXHlLUW5AR187NkI0KzQvIyklZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTZ2RTaWNTamNTamNTamJVbGJWbGJWbWNXbWRVbWRVbWRVbGVVbWZWbmdXb2dabmhcb2hebWpla29ybXR6g4qQpa6zw8zR1d/h5u7x9Pz+9P369/35+f73+v/0/P/y/P/x/P/u/f7w+/jv/vrx//nv//rt//np//Lf7+DL3c63wbKbopeBfHViYl9OWFpMXWNXbXdufIZ9pqyivsC12tXP7uTi/O7u//T0//T3/vT1//n5+/r4+/34/P/6+P/19Pzx9/3x///x//no//Tj/8y7vX9wm1FEqVNGtVNIskM6wEpAxEhAx0c+yUY+yEU9x0Q8xkM7xkM7zUc+zEc+x0c+vEM7rT41nzoylzozkT42ij01hj00gz01gT00gDwzfzswgTsxgTsxfjovfjovfjoxfTkwfDkwezgvezgvezgvejoxejoxeDkydzgxdjcwdTYvdTYvcTYubTgwazkwajgvajgvaTkvaTkvaTkvaDguZzctZjctZzctZjctZjctZjctZjctZjctZjUuajgxbTs0azozajkyajowbT40b0M4bEA1b0Q7ZDwyYz0yelZKhmRaeVdNYkxBPjoxMzgxNDkyNzw1NDowLzUrMjUsOTwzMzYrMjUqMjQpMDMoMTMoMjUqNDYrNDcsLjYpLDcpLzcqLTgqLzcqLzcqLzcqLzcqMTksMDgrMDgtLzcsLzcsLzcsMDgtMDgrNz8wOUIxPEU0PUQ0O0EzODwuMjYnLTQkMjsqSlZCY3JbaHxhXXZYT21LRmZBQWE6SGQ7S2g8Tms/Tms/S2g8Smc5TGk9Tms9VHFFV3RIWndLW3hMXXpOWnZNTmpBQ1s7Mj40KjAwIScnaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamRWamRWamRYbGRZbGNabWVabWVYbWZWZ2BOamVSbmtYb2xdaGVcZmVhc3FygYKGio+Tlp6hq7O2w8jL2N3g6u7v9vf5+fv6/P79/v78///6/f72+v3y+fzx+v3y+/7z+fry+vry+fnt/Prr/vzn+ffe6eXK1dS2urmbmJh8cXRZX2RNYmtYcn1shJCCkZuQtLmyy8zH4+Le8u7r9/Py+/f2/fn4/Pj3//78/v78/v78/f/6/f/6/f/6/f/6/f/6+vz3///6//v2/+rl2Kego2BYm0Q9tU5Fv01DwkY8xEQ5ykU8zklAzktBy0hAx0c8xkc4w0g4vUo4s0g4pkU1mkI0kUI1i0M1hkI1hEI2gkA0gj4zgjwyhDoxhjkxhjkxfzkxfjoxfDkxezgwejcvejcvdzcudjYtdzcudzcudzgvdzgvdjcudTYtcTUrbjMrbDcvaTgxaTgxaDcwaDcwZzYvZzYvZzYvZjUuZzYvaTcwaTgxaDcwZzYvZTQtZTMsaDMtajUvbTgwazkwajowaTsuaT0wa0EzZ0Iyakk6ZEg6dl9PfmtcinhqjH9vUko9NzkuNDowNDowMzkvMzkvMzkvMjguMjguMTctMTctMzYtMDYsMjUsLzUrMTQrLzUrLzQtLjUtLzQtLjUtLzQtLzQtLzQtLzQtMDUuLzQtLzQtLjMsLjMsLzQtLzQtLzYuMTsyMz0yNkA1OEI3OUQ2N0I0NUAwMz4tND8uRFE9V2VOW2tRUGJIRVg8QFQ4Qlc2SWM+S2U+S2Y9S2Y9SmU8SmU6TGc+T2o/VXBHWXRLXHZPXXdQXXdSV3FOSGI/O082JjErJisuJCksaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamNZa2RabGNcbWRbbWVabWZWaWRRamhTbWpXamtbZ2dfbGxsfn+EkJOaqK+1uMLE0dbZ4ufq8vP1+/z+//7///7//v37//76///6/v/5+/z0+Pvy9vzy9/3z9/rx+Prv+Prt9/rp+fvl8vXa3+LDzNCvtLiXkZZ2a3FVWWFJX2tVdIFvjJiKnaecv8G809PR5+fl8/Px9/f1+/v5/Pz6+/v5/v78/v78/v78/v78/v78/v78/v78+//+9f//9f///v////v6/+3q8L+6wn51n0tBr01AuUs+wkxAxUs+w0U5vD00vj82w0U5xEY3w0o3vUw6s0o3pkY2mUMykUM2jUU3hUM3gkI4gUE3gT41gjw0gzozhjkxhDkzfjkyfToyejoxejoxeTkweDgvdjcudjcudTYtdjcudDgudDgudDgucjYsbzUqbTQrbDcvaTgxajgxaDcwaTcwaDcwZzYvZzYvZTMsZTMsZzUuaDYvajgxajgxajgxazkyazYwbDcxazkwazsxazsvaj4xakAwaUQyZ0g2a1A9Z1JBdWZTgXVljIVzhoNyS0w8NjkuMzkvMzkvMzkvMjguMjguMjguMTctMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLzQuLzQuLzQuLzQuLzQuLzQuLzQuLzQuMDUvLzQuLjMtLjMtLjMtLjMtLzQuLzYvLjgwLzoyMT0zNEA2NkI2NkI2NkI0NUIxNkMxQ1A+UF1JUmBJSVdAQU82QlA3RVU6SmJASmQ/S2VAS2U+SWM8SGM6SWQ7SmU8U25FWHJLXHZRXXdUW3RUVG1PQ1w+Nkk1JjEtJywwJCktaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamNZa2RabGNcbWRbbWVabWZWbWhVa2lUbWpXamtba2tjd3d3kZKXp6yyv8bM0tze7PH09/z//v///v////7///7//v37//76///6/f74+vvz9fjv8ffr8ffr9Pfs9fnr9vjq9fjl9ffh7u7U29u/ycqrsLGSk5Z5dXlga3BadHtpiJCBn6ecrrWtzc/K3t7c7+/t+Pj2+/v5/v78/v78/f37/v78/v78/v78/v78/v78/v78/v78/f/++///+/////////v5//r0//ft/dHG2J6QlEw9pVJCqUw7p0Axt0c7z1lNz1VKvEA0xEQ3xkg6w0s9uUk7qkI3nT8zl0A3k0U7iUA5hEE5gUE4fz82fj41fT00fzw0fT00ejs0eDw0dzszdzszdToydDkxdDkxdDkxcjkwcjkwcjkwcjkwbzkvbjgubDYsazUrbDcvajgxbDcxajgxazYwaTcwaTcwaDYvZzUuZzUuZjUuZzYvaDcwaTgxazozazozbDs0ajszaTowaDwxaz8yakM0aUQyZkUyZkk3bFZBallHdWpWhn9tkY57gH9tRUY2NTgtMjguMjguMjguMTctMTctMTctMDYsMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLzQuLzQuLzQuLzQuLzQuLzQuLzQuLzQuLzQuLzQuLjMtLTIsLTIsLjMtLzQuLjUuKzUtKzYuLTkvLzsxMj4yNEA0NkI0N0QzOEUzP0w6RVI+Q1E6O0kyOEYtPkwzRFQ5Sl9ASmJATGRCS2M/SWE9R2A5Rl84R2A5UmtEWHBMXXVTXnZWWnFUUGdLPVQ4LkEuJjEtJywwJSouaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamNZa2RabGNcbWRbbWVabWZWbmlWbGpVbGtXbG1dcHFpgIKBnqGmub7ExMvR2+Xn9fr9+////P3//P3//vz9/Pv5//78///7//75+/z09fbu7vHm6e/j5+3f7fHi8PTl8fTj8fTf8vHc6urQ2Ni8x8ersrGVoaGJkZN9kJOAnJ6Rqq2itru0wMW/3Nza6enn9vb0+/v5/f37///9///9/f37/v78/v78/v78/v78/v78/v78/v78/v7++/v9//7///7/9/Lv/PPs//zz//vt//Tk7MOxuYFwlVBAok8/uFhKt00/tUU5wEc8wUE2yEU7xUk/vUc9r0A5oTw0mj02lkE8jT87h0A8gUA6fUA7ej85eUA5eD84eD84dj00dj00dj00dTwzcz0zcjwycjwycTsxbzswbzswbzswbjovazkuajgtajgtaTcubTgybjcybTYxbDcxbDcxazYwaTcwaTcwbDozajkyaDcwZjcvZjcvZjcvaDkxZjoxaj82Zj40ZT0xZj4yaEMzaUU1ZkczY0cyY0o2aFZAaVxJc2tWhYJvj456cHFfOT0sNDcsMjguMTctMTctMTctMDYsMDYsMDYsMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLjMtLjMtLjMtLjMtLjMtLjMtLjMtLjMtLjMtLjMtLTIsLTIsLTIsLTIsLjMtLTQtKjQsKTQsKjYsKzctLjouMT0xNEAyNUEzNkMyOkc1PEk3OEUxMj8rMkApOEYvPk40RFg8RV09S2BBSmJAS2A/R187SF46Rl46U2lFWHBOYHVWXnVYWm5TTGNJOU00KTooJS4rJSouJCktaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamNZa2RabGNcbWRbbWVabWZWbGdUa2lUbm1Zb3BgdHVthYeGpKesv8TKztXb5vDy+///+///+/z+/f7///7//v37///9///7/v349/jw7/Do5+rf4Oba3uXV5+va6u/b7fDb7PDZ7u7W6OjQ2ti/zMqxwr2nt7Wgsa6dtrSnwb61ycjD0tPO2dnX6Ojm8vLw+vr4/Pz6/f37///9///9/Pz6/v78/v78/v78/v78/v78/v78/v78//78//z///z///v6/Pv3/f/5/v/4/v/0///t//7s+N/LxZyKnWJQlko6pUw8tFBAvEw+v0A3xkM7xUY/v0Q9sT47pjo3njo4mT47kT07ij88hEA9fUA9eEE8dEI7ckM7ckM7cT82cz42cz42cj01cj01cj01cD41bz00bj40bT0zbDwyazsxajsxaTowaTowajowbjcycDYycDYybTYxbTYxbDcxaTcwaTcwbDs0azozaDkxZTkwZTkwZTkwZToxZDwyZkI2Y0E1Y0M0ZEQ1ZEc1ZEk2YkkzX0kyXkw2ZVY/amJNcm1XhINvhIdyW2BMMzooMjgsMjguMTctMTctMTctMDYsMDYsMDYsMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLjMtLjMtLjMtLjMtLjMtLjMtLjMtLjMtLTIsLTIsLDErLDErLDErLDErLTIsLDMsLDYuKzUtKjQrKjQrKzUsLjgtMDstMj0vMj0tNUAvNkEwNUEtMT0pMT0pNUEtOEYvPU81QFQ4Rlk9SFxASl0/SV49S14+S2A/VGdHW3BRY3ZaYXVaWWtTSl1HNkc0JjQlJC0qJCksIicqaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamNZa2RabGNcbWRbbWVabGZWamdUa2pVbG5Zb3Jhc3ZtgYWEn6SouL/H1t/k7ff5+///+///+/z//v////7//v37///7///6/Pz08/Xq6+3i4+fZ3ePV3OPR5OnT5+zV6e3W6uzU6+vT6ObP39rE08640866zMa2y8O40MnB19LO4NvY6ubl8O/t8/Lw+fn3/f37/f37/f37///9/v78/Pz6/v78/v78/v78/v78/v78/v78/v78//38//v8//j5//79/v/9+f/99P/47//19//28Pfn///t/+7bzaeUpGtYoltHqldFrUw7uUQ6wEQ8wEU+vEU/tEE+qj06ojo5mjs5lT08jT89hT89fUA7d0I8ckM7b0Q7b0Q7cD84cT82cT82cT82cT82cD41bz81bz81b0A2bj81bT40azwyaDwxaDwxaDwxbDwybzgzcTYycDYycDYybTYxbDcxajgxaTgxaDcwZzgwZTkwZToxZDwyZT80ZkA1ZEI2XkI0YUc4Y0w6ZE07Y004YEs2XUszXU00XVE5Ylg/bWhSc3NbgINudntlRk86ND0qMzktMjguMjguMjguMTctMTctMTctMDYsMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLDErKzAqKzAqKzAqKzAqLDErLDMsLjUuLDYuKjQrKjQrKjQrKzUsLTcsLjkrLTgqMDsrND8vNUAvND8uMz8rMz4tM0AsN0YvOUszQE84QlQ6R1c8SFs/TV1CTWBEVWVKXG9TZHRaYHJaWGdSR1hFNEIxJDIlJC0qJCksIicqaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamRWamRWamNZa2RabGNcbWRbbGZabGZWbGlWbGtWa21Ya25dbHJoeX99lZ2grre+0tvg6vP4+///+f7/+fr+/v////7/+vn3///7/v34+fnx8fPo6eve4+fY3+bW4OjT5OnS5+3T6OzT5+nR6OjQ5+XO4NvH19C+2tPD2dHG3tTL5t3Y7uTj8+nq+vH0//n7+vn3/v78///9/f37/f37///9///9/Pz6/v78/v78/v78/v78/v78/v78/v78//38//n4//r5//79/P/99//+7v/58f//8v/99f/68/nr//3t//ro9M67q3dij1E6qlxIsk4+uEo9uUk+uElAtEdAr0Q+pT06nDo3lj05jz46iD85gEE6eEE6dEQ6cEY6cEU8cD84cT84cT84cT84cT84cT84cD84cD84cUI6cEE5bj83bD01aT00aj41aj41bj02bzgzcjczcDYycDYybjcybDcxajgxaTgxZDgvZDkwYzsxZD4zZEA0Y0E1Y0E1X0M1WkU0X048Z1ZCaFdDY1M8Xk84W081XFI3XVY8XVk+bmxVdHZefIFrY21VMj4oNkIuMzsuMzkvMzkvMzkvMjguMjguMjguMTctMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLDErLDErKzAqKi8pKi8pKzAqLDErKzIrLTQtKzUtKjQsKjQsKzUsKzUsLDYrLTcsLDYrLzosMj0vNkExN0IyN0IxNUAwND8uMj8tNEMuOkczPUw1QU84RFQ6Slg/TFxCVGJJXGtUY3FaXm1YVWJQRFJBMj4wIy8lJi8sJiwsJCoqaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWamRWamRWamNZa2RabGNcbWRbbGZabGZWb2xZbWxXamxXZ2taZmxicnt4jpiaqLG4ytPY4+zx+P3/9/z/+vv//v////7/+vn1///6/f31+Pju8PLl6evd5enY4+rY5e3W5uzS6e3S6u3S6OjO6ObP6OPP4drI2NDD2M7E3dLM6t/b+O3r//T2//X5//X7//n8/vz9///9///9/v78/v78///9///9/f37/v78/v78/v78/v78/v78/v78/v78//76//37//37/fz6+f38+P//9f//8///7f368//7+//6///0//bm//Pf/+PN162VqW9ZqFdErlFArE8+r09BsU9CrUtApEM8mTw1lT43jz82iD84gUE3e0I3dUQ2cUU4cUU4cD84cT84cz44cT84cT84cT84cT84cD84c0I7cUI6b0A4bT42bD01aj41bT42bz43bzgzcTczbzgzbTgybTgyaTgxaDkxZjoxZjsyZD4zZEA0YkI1YEM1XUEzXEAyV0IxVEc0W1M+Zl5HaV5IYlg/WlM5WlM3XFc6WlY7WFc7a21Vc3dedX1mVWFJJjIcOEQwMzsuNDowNDowMzkvMzkvMzkvMjguMjguMTctMTctMTctMDYsMDYsLzUrLzUrLzUrLTIsLTIsLTIsLTIsLTIsLTIsLTIsLTIsLDErKzAqKzAqKi8pKi8pKzAqKzAqLDErKzIrKTMrKjQsKzUtKzUsLDYtLTcuLTcsLDYrLjgtMjwxNkEzOUQ2OUQ0N0I0NkExMDsrMj8tNUIwOUYyPEk1QE43RlQ9Slg/UmBJW2hUYW5aXGlXUV5NQk5ALzsvIiwjKzEtKC4sJiwsaGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXa2VXa2RabGVbbWRdbmVcbWdbbWdXcW5ba21Xa25Za3JganJncHl2h5GTn6qwu8TJ0Nne6u/z9vv+/P3//v////7//v35///6/v72+vrw9vjr9Pbo8PTj6vHf5+/Y8Pba7fLU6+7R7OzS6ObR4dzJ3dXI3tTK4dTO6NrZ8uTk+uvu/vL0//f7//n///z///3+/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v/6//76//76/v78/f/++///+v//+v//+////v/////9//v1//vx//zs//vl//Pb/+rRuoJppmJLl085n1Q/qFpGo1JBnUo6oE0/jjwwiz0whj4yfz0veD0vdD8vc0IzdEQ2cj01cj03dD04cz44dUA6dUA6dD85cT84c0E6cUA5cUA5cUA5cD84bj83bz43bz43azkybTgybDozbDs0bDs0aDwzZzwzYz0yYz8zXj4xZEc5Y0c5VD0tTjkoTTgnQDEeV1E7UE43S0kwT0syXVk+aWVKZWFEVlU3WFg8XWBDb3NaeoBmZGxVPUkxLTkjMj4qNDwvNTsxNDowNDowNDowMzkvMzkvMzkvMzkvMzkvMzkvMjguMTctMTctMTctMDYsMTYwMTYwMDUvMDUvLzQuLzQuLzQuLzQuLDErLDErLDErLDErLDErLDErKzAqKzAqLjUuLTQtLTQtLDMsLTQtLTQsLjUtLjUtKzIqLTQsMDcvNT0yOUE2PUU4P0c8P0o8N0IyNUAvMz4tMT0pMj4qOUUvQk44SVU/T1tHVmJOXWhXWWRUTFdJPEY7LzkuKTMqKS8rKC4qJy0raGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXa2VXa2RabGVbbWRdbmVcbWdba2hXb25aamxWa25Za3JganRpcXx4iZSWo660vsfM0tvg6/D09/z//f7//v////78/v35///6/v70+/vv9/nr9Pfm8PXh6vLd6O3W6u/R5uvL5OfK5ubM4+HM39nJ3tTK39TO59nY7d/f9ufq++/z//T4//f7//r+//z///78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/f/8+//6+//6/f/8/f7//v3///z///z///v///z///z///v5//z1//7x///t//vl//LZ/+vR4LGXp3VckVtDllpCmllDmlZDmVJAjkc1i0Y2iEU0g0QzfEMyd0Iwc0Avbz4vdUA4cz44dT45dUA6dD85bz02cD43c0E6cT84cD84cD84bj83bz43bT42bj02bT42azw0bD01bT42az82aj82Z0E2ZUE1YkI1ZEc5W0EyXkc3Xkk4Tj0rRjckRzglPjYhTEw0R0syREcsREQqTU0xXFs/YmFDYGFCWVk9ZGdKc3dec3lfWGBJOkQsLzslN0MvNj4xNjwyNjwyNjwyNTsxNTsxNTsxNTsxNTsxNTsxNTsxNDowNDowMzkvMzkvMzkvMjcxMjcxMjcxMTYwMTYwMTYwMDUvMDUvLjMtLjMtLTIsLTIsLDErLDErKzAqKzAqKjEqKjEqKTApKTApKTApKjEqKzIqLDMrLjUtLTQsLjUtMDcvNDszOUE2P0Y+Qko/O0Y4OkU1N0IxND8uMz8rNkIuPEgyQEw2TFhEU19LWWRUV2JSTFZLPUc8MTsyKzUsKzIrKjAsKS8raGVWaGVWaGVWaGVWaGVWaGVWaGVWaGVWaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXa2VXbGNabWRbbWRdbmVcbWdba2hXbWxYaW1Wam9Za3RhaXVpcX15ipiZpbK4v8rQ1N3i7fL29/z//P3//f/+//78/v34///3/f3z+vvt9/rp9Pfk7/Te5+/Y5evR4ufJ3uHC3d3B3t7G3tvI3dfL4NXP5NnX7uLi8+fr+u7y//T4//f7//n8//r9//39//78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/f/8+P/8+P/8+//+/v7+//z///r///n///j///n///r///r6//34///2///z/f/v//rm//Tc//jg/+zT47+nrIJqh1lChVE7kltGl11JjVM/f0YydT4pcj4pc0ArdEQwdkU0cT80bjwzcTw0dEI5c0E4bz81cUE3eEg+bj40bT40bT40az80bD0zaj4zbD0zaj4zZz81Z0E2Z0E2Z0M3ZUM3Y0M2YEM1XkQ1Yks7VUIxWkk3YFNAUkczQzsmRT0oRkErQUUsQkguQUUqPEAlP0IlTk4yX2BBaWpLYWFFbnFUdnphZ21TSk85NDwlND0oPUYzOD4yOD40OD40OD40Nz0zNz0zNz0zNjwyOD40OD40Nz0zNz0zNz0zNjwyNjwyNjwyNTo0NDkzNDkzNDkzMzgyMzgyMzgyMjcxMDUvMDUvLzQuLjMtLTIsLDErKzAqKzAqKS4oKS4oKS4oKS4oKS4oKi8pKzAqLDErMTYwLzQuLDErLDErLzQuNjs0PUI8QUhAQEs9Pks6PEk3OEUzNEEtMj8rM0EqNUMsRFE9S1hEUV5NUV5NSFRIPEg8Mj40LjgvLTQtLTQtLDMsZ2RVZ2RVaGVWaGVWaGVWaGVWaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXa2VXbGNabWRbbWRdbWZcbWdbamlXa21YaW1Wam9ZanNgaHRobXx3iJiYprO5v8rQ09zj6/D29vv//P3//f/+///9//75/v72/f3x+vvt9/rn9Pfi7vPc5e3V4ujO2+DA19q71ta82dfC3dfH3tfN5dvZ7ODg+Ozw+/D2//X7//n+//r9//v7//v7//38//78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/f/8+P/++P/++//+/v7+//z+//r///n///j+//r9//n8//n5//36///4///4+//1/P7w///t//zp//Hf//Dd/+/a8dK9tJB6e1I+dEo0dUgzdkk0ek04fVA7eUw3bkEuZTcne01Ac0Q6cUI4c0Q6b0M4ZzswZDgtZz0xaT8zaT8zaT8zZz8zZj4yZj4yZj4yZT8yYkA0YkI1YEM1X0M1X0M1W0Q0WkU0V0QzWEk2T0IvXFQ/b2lTY15ITUs0SUcwSUszPkQqP0gtQEYqPEImPEEjRkksWFk6ZGVGbW1ReHhcdHZeW19GQEMuNjslOEArPEMxOT8zOT81OT81OD40OD40Nz0zNz0zNz0zOT81OD40OD40OD40OD40OD40OD40OD40Nzw2Nzw2Nzw2Njs1Njs1Njs1NTo0NTo0MzgyMzgyMTYwMDUvLzQuLTIsLDErLDErKzAqKzAqKi8pKi8pKzAqLDErLTIsLTIsMDUvLjMtKzAqKzAqLTIuMjcxOD05O0I6QEs9QE07QE07PUo2OEUxM0AsMT8oMD4nPEk1Qk87SFVDSVZFRFBCO0c7Mj40LjowLDYuLjUuLTQtZ2RVZ2RVZ2RVaGVWaGVWaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXbGRXbGNabWRbbWRdbWZcbWdbamlXa21YaW5XaXFaZ3NfZHJlanl0hZWVo7K3vcjO0tvi6u/19Pn9+/z//f/+///9///6///4///z/v/x+/7r9/rl8PXe5u7W4ujM2dy/1dW50tC51NG+2tTI4NnR6uDf9Ont/vP5//f8//v///3///7///78//76//76/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/f/++v//+v//+////v7+//3+//z8//v8//v6//r4//n3//r3//34///7///7/f/6/f75+fTu//72//30//zz//vu//fn++bV6dLAz7ShtpqFlHVhd1ZDakk2bEk2ck07dVA+bUY3aUIzZ0IyakU1bkk5bko6b0s7b0s7ZUExY0IxY0IxY0IxY0IxY0IxYkMxYEMzXUY2XEc2XEc2Wkc2Wkc2V0g1VEc0UkczUEgzTkgyZmRNfn5mcnJaVlhASkw0R00zPEUqPEYrP0grQUcrQUYoREcqTU4vVFU2eHdbe3pebm5WVVU9Q0IuP0EsPkEuOj4tOz4zOT81OT81OD40OD40Nz0zNz0zNz0zOD40OD40OD40OD40OD40OD40OD40OD40OT44OT44OT44OD03OD03OD03Nzw2Nzw2Njs1NTo0NDkzMzgyMjcxMDUvLzQuLzQuLTIuLTIuLDEtKzAsKzAsLDEtLTIuLTIuLDEtLDEtLDEtLDEtLjIxMDUxMzc2NDs0O0c5PUw5QE88QE86PEs2N0YvNEMsMkEqNkUuOkk0QE88QlA/P00+OEY3MT8yLTktLDYtLTQsLDMrZmNUZmNUZ2RVaGVWaGVWaWZXamdYamdYaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXbGRXbGRXbGNabWRbbWRdbWZcbWdbamlXa21YaW5XaXFaZ3NfYnBjZ3hygpSUo7K3wMvR1N3k6/D29fr++/z//f/+///9///6///4///0///z///v+v3o8vfg5/DV4ujM19q90dG1zcu0zsu61s/F3tfR7OLj9+7z//b+//r///3///7////9/v/6/v/5/v/6/v/6/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v7+/f7//f7//f7//f/+/f/8/v/6/v/5///3/f3z/f31/v34/v35//78/v7+//3///7//vn///z///v8+/bz//jy//30//7x//3t//rp//Lg9+TT59K/0rupuZ+On4Rzj3JifF1LfV5MdFVDYUQyVzooWTwqWz4sWD0qYEUyYEUyYEUyX0YyYEczYEczYEczXUgzXEs3XE06XE06WUw5WE05VU04Ukw2UUw2Tkw1UVE5aWtTfIBnbXFYU1k/RkwyPkcsPEYrPEYrP0grREouRUosREcqSEkqTE0ueXhcdHNXZmRNVFI7TEk2S0o2RkUzPD0tPD80OT81OT81OT81OD40OD40OD40OD40Nz0zNz0zOD40OD40OD40OD40OT81OT81Oj85Oj85Oj85Oj85OT44OT44OT44OD03OD03OD03Nzw2Njs1NTo0NDkzMzgyMzgyLzQwLjMvLTIuLDEtKzAsKzAsKzAsKzAsKzAsLDEtLTEwLjIxLzMyLzMyLzMyLTQtMz8xN0YzPUw3QE86P043PEs0OUgxOEcwNUQtOEcwPEs2Pk06PEo5N0U2MT8yLTktKzUsLTQsLDMrZmNUZmNUZ2RVaGVWaGVWaWZXamdYamdYaWZXaWZXaWZXaWZXaWZXaWZXaWZXaWZXbGRXbGRXbGNabWRbbWRdbWZcbWdbamlXamxXaG1WaHJaZnNfY3FkaHlzhZeXpbe7x9LY2uPq8PX7+P3//P3//f/+///9//75///1///y///w/P/s+Pvm7/Td4uvQ3ePH1dW5zsyzycSwysS00Mm/2tLP6eDj9u3y//f///r///3///7////9/f/6/P/4/P/4/f/6/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v7+//z///z//v3//f/++v/6+P/5+P/1+P/z+P/z+P/1/P/4/f/6//3+//z///z///v//ff///r///z///3///7//v37+/vz+vjs///x///v///t//7t//3t//bn/+7g/erb+uPR/+bQ48q0pY94dF5HZU84Ykw1XEgwXkoyXEoyXEoyXUszXUszXkw0Xkw0XE02WU44V086V086VlA6VU85U044UE43Tk42TU83UFQ7YGZMZm9UVV5DRU80QUswPEYrP0kuP0kuQ0wvSE4ySE0vRkksT1AxWVg6cW1SamZLYVxGW1ZAWVRBVFE+TUo5QkMzPUA1O0E3O0E3O0E3OkA2OkA2OkA2OT81OD40OD40OD40OT81OT81OkA2OkA2OkA2O0A6O0A6O0A6Oj85Oj85OT44OT44OT44Oj85Oj85OT44OT44OD03OD03Nzw2Nzw2NDk1MjczMTYyLzQwLTIuLDEtKy8uKy8uLDAvLDAvLTEwLjIxLjIzLjIzLTEyKzEtKzkqL0AtNkgyO003PU83PE40OkwyOkwyNUcvN0kxOkw2PE06Oks5Nkc3MEAzLTsuLDYtLTQsLDMrY2RSY2RSZGVTZWZUZ2VWaGZXaWdYaWdYaGZXaWZXaWZXaWZXaWZXaWZXaWZXa2VXa2VXa2VXbGRZbGVbbWRdbWZca2dbamlXaWtWaG1XaHJaZ3RgZHFnant1iZudqrzAzdje4Oft9Pn/+v//+////f/8/v/6/v72+vru+vvt+vvp+Prl8/bh6u7X3+PK2dzB09G4zMexxb6sxr6xzMO81s7L5t3g9Ory/vf///r///7//////v7+/f/6/P/6/P/6/f/8/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78/v78//78//78//78//3+//z///z///3//f/++//8+P/59//39//1+P/2+f/2/P/4///7//79//z///v///r///r///v///z///7//v3/+/38/P77/v/6+fry+vzx/fvv/vru//ns//vs//3v//3s//Db//vi7NzDno51YFA3UkIpWEgvWEguW00zW00zWk40Wk40W081W081XFA2W1E4VU83VE85VE85UU84UE43Tk42S001SU00Sk41TFI4U1xBUFk8QEksO0YoQUwuP0osRE0wRU4xSlEyTVI0Sk0wTEwwWVk9a2pOaGRJYl5FXlpBX1pEYFtHWlVBUU86S0o4QUI0QEI1QEI1PkE2PkE2PkE2PUA3PUA3OT81OT81OT81OkA2OkA2OkI3OkI3OkI3O0A5O0A5O0A6Oj84Oj85OT43OT44OT43O0A6O0A5O0A6O0A5Oj85Oj84Oj85Oj85OD84Nz05NDs0MzgyMTYwLzQuLjMvLjMvLjIxLjIxLDIuLDIuKzIrKzIqLDQpKTYlJDYeKT0hMkYrOEwxO082O001O001O001OEoyOUszO001PE42PE44N0g1MUIwLjwtLTcsLjUtLTQsXWVOXmZPX2dQYGhRZGlVZmlWZ2pXaWpYZmdVaGdVaGVWaGVWamRWa2VXa2VZbGZYbGZYa2hZbWdba2dcbWZeamZbaWVZZ2VWZ2hWZmtVZW5ZYm9dZHFoc4OAlqisucjP0tvi4unv8vf79/z/+f38/P75/P/2/P7x9/jq+frq+Pfl8vHd7u3Z6+rW4N/K19K+18+8y8CuvbSlvbOpwrexzMLB29LX6uDo+vP7/Pb//vv///7//v3//P3//P79/P79/v7+/v7+/v7+/v7+/v7+/v7+//78//78//78//78/v35/v35//z5//36//77//77//7///3+//z9//3+/////v/9/f/8+/34///7/P33//34//76//34//r2//f0//n5//r///z///3//////////f/8/f/+/P79/v////////78//75//7z//7u//3q//3m+vTc//rg5+DGj4hsVU4yV04xVEsuU0orV04xV04xVU4xVU4xVE8yVE8yVE40U080UU0yUk41UU82UFA2TU83S082SE02R0w1SlA2Rk80QUotPUYnPkgmREsqRk0rRUwqUFY0UFQzS04vSEssVFQ4YmJGY2NJWlpAW1lAXFpBXVtCXVtCW1lAWFY9VVM6U1E4SEYxR0QxREEwQT8wQD4xPj4yPz81PkA1Oz41OT81OT81OUE2OUE0OEM1OEM1OEM1OkI3OUE2OUA4OEA1OD83OUE2OUA4OkI3OkE5OkI3OUA4OkI3O0I6PEQ5PUQ8PkU9OEI6OEI6N0E4OEA1Nj4xNDwvMzkvMjcxLjQwLzUxLTcvLTktLjspMEAmNkcnN00nO1YrOlcrO1UwO1Q0O1I4PVA6Pk88PlA6Okw2QFI4RVc9Rlk9RFg9QFQ7NUgyKzwpLDYrLDMrKzIqWmdNW2hOXGhQXWlRYmpTY2tUZ2xYaGtYZ2hWZ2hWaWZXaWZXa2VXbGZYbWVabWdZbWdZa2hZa2dba2dcamZdamZbaGZaZWZWaGlXZ2xWZm9cZXJhandueoqJnKuyusjR0Nng4ens8vf7+P7++f76+v/4+/7z+f3v+Pnr9/jm9fTi7ezY6ebT5eLP3NfE0su5yr+twbSkua2hvK+mwbayy8HA29DW5t/m+/P+/ff//vv///7//v3//P3//P3//P3//v7+/v7+/v7+/v7+/v7+/v7+//78//78//78//78//36//z5//z5//36//35//76//79//38//z9//3+//7///7///3+/fv8//79//77//z6//jz+O3n8uXd9ujf+/Dq//r9//z///3+///9///7/f/8/f/+/P3//f7//f7///3///78//71///u//7o///k+vbd/fvi5ODHi4dsUk0wU04wUUsrUUsrVU8vVU8vVE8xVE8xU08yU08yUVA0UVA0UU0yUE8zUE41TlE2TU83SlA2SE02RU01SFE2RU4xQksuP0knQkkoRk0rSlAsS1EtTlIvUFQxVlo3XmJBX2JDWVw/VFc8VVU9VlY+V1U+WFY9WVc+WFY9WFc7V1Y6WFQ5UUszT0kzTEc0SUQxREEyQkAzQT8zPkA1PD01OT81OT81OUE2N0I0OEM1N0QzN0QzOkI3OUE2OUE2OEA1OEA1OUE2OUE2OkI3OkI3OkI3OkI3OkI3O0M4PEQ5PUU6PEY7PUc/PEg+PEY7O0Y2PEQ1OkIzOT8zOD02Nz43ND42Mz00MD4tM0MpOU0qQlkvR2ExT3A7TG47TGk9RmE+Qlk/PFI9O0w6Oks4PU85RFY8S15CTWBCTGBESFxAOlE3MUQuKzUqKzIqKTAoWmdNW2hOXGhQXmpSYmpTZGxVZ2xYaWxZaWpYaWpYa2hZa2hZbGZYbWdZbmZbbmhabWdZa2hZa2dbamZbamZdaWVaaGZaZmdXaGlXZWpUZG1aZ3Rjb3xzf4+OnayztsTNzdbd3ubp8fb6+P7++v79+f74+Pvy9Pjq8/Tm8PHf6unX4eDM3NnG19TB0Mu4x8Cuv7OjvbCgvLCkw7auy8C81cvK49je6+Tr/PT//ff//vv///7//v3//P3//P3//f/+/v7+/v7+/v7+/v7+/v7+/v7+//78//78//78//78//36//36//z5//z5//z4//z4//38//z7//v8//z9//7///7///3+/vz9//79//77//37/PPu6t/Z4tXN693U9+zm//r9//z///3+///9///7/f/8/f/+/P3//f7//f7///7////9//71//7t//3n//7j+/fe/vzj49/GiYVqUEsuUUwuUUsrUUsrVE4uVU8vVE8xVVAyVFAzU08yUVA0UE8zUU0yT04yUE41TVA1TU83SlA2SU43Rk42SFE2Rk8yQ0wvQ00rRk0sSlEvT1UxU1k1UVkyV184anBKeX9bcXZWWV5AS080TVA1UVE5UVE5UlA5U1E4VFI5VVQ4WVU6WlY7WFI6VlA6Uk06Tkk2SEU2REI1Q0E1P0E2PD01OT81OkA2OUE2N0I0N0I0N0QzN0QzOkI3OkI3OUE2OUE2OUE2OUE2OkI3OkI3OkI3OkI3OkI3OkI3O0M4PEQ5PkY7PEY7P0lBPkpAP0k+Pkk5P0c4PkY3PkQ4PUI7PkU+OUM7NkA3NEIxOUkvQlYzUGc9WHJCXn9KW31KWHVJTWhFQ1pAOU86Nkc1NEUyPE44RVc9TmFFU2ZIU2dLTmJGQFc9NkkzLzkuLzYuLTQsWmdNW2hOXGhQXmpSYmxUZW1WaG1ZaW5aa2xaa2xabGpbbGlabmhabmhab2dcb2lbbGlaa2hZamZaamZbaWVcaWVaaGZaZmdXZmdVYmdRYWpXZXJhb3xzfo6NlqWsq7nCx9DX2uHn7vP39vz8+Pz79fr08/bt7vLk6erc4+TS3NvJ09K+zsu4ycazw76rvbakw7enx7mszcG11snB39TQ6d/e8+ju+PH4/fX//vj///z//v3//fz//P3//P79/f/+/v7+/v7+/v7+/v7+/v7+/v7+//78//78/v37//78//36//36//36//z5//v3//v3//38//z7/vr7//v8//3+//7///3+/vz9//z7//77//37/fTv7eLc5tnR8OLZ/PHr//r9//z///3+///9///7/f/6/f/+/P3//f7//f7///7////9//71//7t//zm//zh/vnj//7n5N/JioZtUEowUk0wU0wvU00tVE4uVU8vVVAyVVAyVFAzU08yUE8zT04yUEwxTk0xT000TE80TE42SlA2Sk84SFA4SlM4R1AzR1AzSVMxTVQzT1Y0Vlw4XGQ9Z3JIdIFViJNpkJtzhY9sbnVUWmFCUlY7TE42Tk42TU01Tkw1T002UlA3V1M6WVU8WlQ+WFI8VE88UUw5S0g5R0U4RUM3QEI3PT42OkA2OkA2OUE2N0I0N0I0NkMyNkMyO0M4OkI3OUE2OUE2OUE2OUE2OkI3O0M4O0M4OkI3OkI3O0M4O0M4PUU6PkY7PUc8PUc/PEg+Pkg9Pkk5P0c4PkY3PkQ4PUI7PUQ9OUM7NkA3NEIxOUkvRFg1Umk/W3VFWntGV3lGVHFFSWRBPVQ6MkgzL0AuLT4rNkgyQFI4TF9DUmVHU2dLT2NHQFc9NkkzMDovMDcvLTQsWWdNWmhOXGhQXmpSYmxUZW1WaW5aam9bbW5cbG1bbWtcbWpbbmhabmhab2ldb2lbbGlaa2hZamZaaWVaaWVcaWVaaWdbZ2hYZ2hWY2hSYWpXZXJhb3xze4uKkJ+morC5wcvU1N3k6fH08vr89Pr48fbw7fDn6Oze4uPV2tvJ0tG/zMm2ycSxw76rv7imvLOiyr6u08W43NDE5tnR7eLg9uzt//T6//n///f///r///z//v3//fz/+/z+/P79/v///v7+/v7+/v7+/v7+/v7+/v7+//78//78/v37/v37//36//36//36//v4//r2/vn1//38//v6/fn6/vr7/vz9//3+//7///3+//z7//36//z6//jz9+zm8uXd+Orh//Tu//r9//z///3+///9///7/f/6/f/+/P3//P3//f7///7////9//71//3s//vj/vrf//zm///p5+LMjIhvUkwyVE8yVE0wVU4xVE4uVU8vVlEzVlEzVVE0U08yT04yTk0xUEwxTk0xTkwzS04zTE42S1E3S1A5SlI6TFU6SVI1SlM2T1k3U1o5VFs5XWM/Zm5HgpJjkqZzn7GBm6p/kqF6iJRwcntcXGJGTFA3S001TEs2S0k0TEo1UEs1VE44VlA6V1E7VlA6U047UUw5TEk6SUc6R0U5Q0U6PT42OkA2OkA2OUE2N0I0N0I0NkMyNkMyO0M4O0M4OkI3OUE2OUE2OkI3O0M4O0M4O0M4O0M4O0M4O0M4PEQ5PUU6PkY7PUc8PUc/PEg+PUc8PUg4PkY3PUU2PUM3PUI7OkE6N0E5NT82NEIxOUkvQlYzTmU7VW8/VHVAUnRBUG1BRWA9OVA2LUMuKzwqKzwpMUMtPE40SFs/UGNFUmZKTmJGQFc9NUgyLDYrKzIqJy4mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3RpbWdwLmpwZyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1ncC5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiYjY1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0aW1ncC5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3RvcmlnLmpwZyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0b3JpZy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxNmEwYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0b3JpZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3Rlc3Rwcm9nLmpwZyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0cHJvZy5qcGcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwZmVlMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90ZXN0cHJvZy5qcGcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3RyYW5zdXBwLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvdHJhbnN1cHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWVjNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3RyYW5zdXBwLmMKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiB0cmFuc3VwcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZCBvdGhlciB1dGlsaXR5IGNvZGUKKyAqIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgY29yZQorICogSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUgZnJvbSBqcGVndHJhbi5jIHRvCisgKiBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMgdGhhdCBoYXZlIG90aGVyIHVzZXIKKyAqIGludGVyZmFjZXMuCisgKi8KKworLyogQWx0aG91Z2ggdGhpcyBmaWxlIHJlYWxseSBzaG91bGRuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGxpYnJhcnkgaW50ZXJuYWxzLAorICogaXQncyBoZWxwZnVsIHRvIGxldCBpdCBjYWxsIGpyb3VuZF91cCgpIGFuZCBqY29weV9ibG9ja19yb3coKS4KKyAqLworI2RlZmluZSBKUEVHX0lOVEVSTkFMUworCisjaW5jbHVkZSAiamluY2x1ZGUuaCIKKyNpbmNsdWRlICJqcGVnbGliLmgiCisjaW5jbHVkZSAidHJhbnN1cHAuaCIJCS8qIE15IG93biBleHRlcm5hbCBpbnRlcmZhY2UgKi8KKworCisjaWYgVFJBTlNGT1JNU19TVVBQT1JURUQKKworLyoKKyAqIExvc3NsZXNzIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzLiAgVGhlc2Ugcm91dGluZXMgd29yayBvbiBEQ1QKKyAqIGNvZWZmaWNpZW50IGFycmF5cyBhbmQgdGh1cyBkbyBub3QgcmVxdWlyZSBhbnkgbG9zc3kgZGVjb21wcmVzc2lvbgorICogb3IgcmVjb21wcmVzc2lvbiBvZiB0aGUgaW1hZ2UuCisgKiBUaGFua3MgdG8gR3VpZG8gVm9sbGJlZGluZyBmb3IgdGhlIGluaXRpYWwgZGVzaWduIGFuZCBjb2RlIG9mIHRoaXMgZmVhdHVyZS4KKyAqCisgKiBIb3Jpem9udGFsIGZsaXBwaW5nIGlzIGRvbmUgaW4tcGxhY2UsIHVzaW5nIGEgc2luZ2xlIHRvcC10by1ib3R0b20KKyAqIHBhc3MgdGhyb3VnaCB0aGUgdmlydHVhbCBzb3VyY2UgYXJyYXkuICBJdCB3aWxsIHRodXMgYmUgbXVjaCB0aGUKKyAqIGZhc3Rlc3Qgb3B0aW9uIGZvciBpbWFnZXMgbGFyZ2VyIHRoYW4gbWFpbiBtZW1vcnkuCisgKgorICogVGhlIG90aGVyIHJvdXRpbmVzIHJlcXVpcmUgYSBzZXQgb2YgZGVzdGluYXRpb24gdmlydHVhbCBhcnJheXMsIHNvIHRoZXkKKyAqIG5lZWQgdHdpY2UgYXMgbXVjaCBtZW1vcnkgYXMganBlZ3RyYW4gbm9ybWFsbHkgZG9lcy4gIFRoZSBkZXN0aW5hdGlvbgorICogYXJyYXlzIGFyZSBhbHdheXMgd3JpdHRlbiBpbiBub3JtYWwgc2NhbiBvcmRlciAodG9wIHRvIGJvdHRvbSkgYmVjYXVzZQorICogdGhlIHZpcnR1YWwgYXJyYXkgbWFuYWdlciBleHBlY3RzIHRoaXMuICBUaGUgc291cmNlIGFycmF5cyB3aWxsIGJlIHNjYW5uZWQKKyAqIGluIHRoZSBjb3JyZXNwb25kaW5nIG9yZGVyLCB3aGljaCBtZWFucyBtdWx0aXBsZSBwYXNzZXMgdGhyb3VnaCB0aGUgc291cmNlCisgKiBhcnJheXMgZm9yIG1vc3Qgb2YgdGhlIHRyYW5zZm9ybXMuICBUaGF0IGNvdWxkIHJlc3VsdCBpbiBtdWNoIHRocmFzaGluZworICogaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIG1haW4gbWVtb3J5LgorICoKKyAqIFNvbWUgbm90ZXMgYWJvdXQgdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBvZiB0aGUgaW5kaXZpZHVhbCB0cmFuc2Zvcm0KKyAqIHJvdXRpbmVzOgorICogMS4gQm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2aXJ0dWFsIGFycmF5cyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlCisgKiAgICBzb3VyY2UgSlBFRyBvYmplY3QsIGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIG1hbmlwdWxhdGVkIGJ5IGNhbGxpbmcgdGhlCisgKiAgICBzb3VyY2UncyBtZW1vcnkgbWFuYWdlci4KKyAqIDIuIFRoZSBkZXN0aW5hdGlvbidzIGNvbXBvbmVudCBjb3VudCBzaG91bGQgYmUgdXNlZC4gIEl0IG1heSBiZSBzbWFsbGVyCisgKiAgICB0aGFuIHRoZSBzb3VyY2UncyB3aGVuIGZvcmNpbmcgdG8gZ3JheXNjYWxlLgorICogMy4gTGlrZXdpc2UgdGhlIGRlc3RpbmF0aW9uJ3Mgc2FtcGxpbmcgZmFjdG9ycyBzaG91bGQgYmUgdXNlZC4gIFdoZW4KKyAqICAgIGZvcmNpbmcgdG8gZ3JheXNjYWxlIHRoZSBkZXN0aW5hdGlvbidzIHNhbXBsaW5nIGZhY3RvcnMgd2lsbCBiZSBhbGwgMSwKKyAqICAgIGFuZCB3ZSBtYXkgYXMgd2VsbCB0YWtlIHRoYXQgYXMgdGhlIGVmZmVjdGl2ZSBpTUNVIHNpemUuCisgKiA0LiBXaGVuICJ0cmltIiBpcyBpbiBlZmZlY3QsIHRoZSBkZXN0aW5hdGlvbidzIGRpbWVuc2lvbnMgd2lsbCBiZSB0aGUKKyAqICAgIHRyaW1tZWQgdmFsdWVzIGJ1dCB0aGUgc291cmNlJ3Mgd2lsbCBiZSB1bnRyaW1tZWQuCisgKiA1LiBBbGwgdGhlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgYXJlCisgKiAgICBwYWRkZWQgb3V0IHRvIGEgZnVsbCBpTUNVIGJvdW5kYXJ5LiAgVGhpcyBpcyB0cnVlLCBhbHRob3VnaCBmb3IgdGhlCisgKiAgICBzb3VyY2UgYnVmZmVyIGl0IGlzIGFuIHVuZG9jdW1lbnRlZCBwcm9wZXJ0eSBvZiBqZGNvZWZjdC5jLgorICogTm90ZXMgMiwzLDQgYm9pbCBkb3duIHRvIHRoaXM6IGdlbmVyYWxseSB3ZSBzaG91bGQgdXNlIHRoZSBkZXN0aW5hdGlvbidzCisgKiBkaW1lbnNpb25zIGFuZCBpZ25vcmUgdGhlIHNvdXJjZSdzLgorICovCisKKworTE9DQUwodm9pZCkKK2RvX2ZsaXBfaCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cykKKy8qIEhvcml6b250YWwgZmxpcDsgZG9uZSBpbi1wbGFjZSwgc28gbm8gc2VwYXJhdGUgZGVzdCBhcnJheSBpcyByZXF1aXJlZCAqLworeworICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBibGtfeCwgYmxrX3k7CisgIGludCBjaSwgaywgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKKyAgSkNPRUZQVFIgcHRyMSwgcHRyMjsKKyAgSkNPRUYgdGVtcDEsIHRlbXAyOworICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOworCisgIC8qIEhvcml6b250YWwgbWlycm9yaW5nIG9mIERDVCBibG9ja3MgaXMgYWNjb21wbGlzaGVkIGJ5IHN3YXBwaW5nCisgICAqIHBhaXJzIG9mIGJsb2NrcyBpbi1wbGFjZS4gIFdpdGhpbiBhIERDVCBibG9jaywgd2UgcGVyZm9ybSBob3Jpem9udGFsCisgICAqIG1pcnJvcmluZyBieSBjaGFuZ2luZyB0aGUgc2lnbnMgb2Ygb2RkLW51bWJlcmVkIGNvbHVtbnMuCisgICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIHJpZ2h0IGVkZ2UgYXJlIGxlZnQgdW50b3VjaGVkLgorICAgKi8KKyAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgZm9yIChibGtfeSA9IDA7IGJsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlmb3IgKGJsa194ID0gMDsgYmxrX3ggKiAyIDwgY29tcF93aWR0aDsgYmxrX3grKykgeworCSAgcHRyMSA9IGJ1ZmZlcltvZmZzZXRfeV1bYmxrX3hdOworCSAgcHRyMiA9IGJ1ZmZlcltvZmZzZXRfeV1bY29tcF93aWR0aCAtIGJsa194IC0gMV07CisJICAvKiB0aGlzIHVucm9sbGVkIGxvb3AgZG9lc24ndCBuZWVkIHRvIGtub3cgd2hpY2ggcm93IGl0J3Mgb24uLi4gKi8KKwkgIGZvciAoayA9IDA7IGsgPCBEQ1RTSVpFMjsgayArPSAyKSB7CisJICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgZXZlbiBjb2x1bW4gKi8KKwkgICAgdGVtcDIgPSAqcHRyMjsKKwkgICAgKnB0cjErKyA9IHRlbXAyOworCSAgICAqcHRyMisrID0gdGVtcDE7CisJICAgIHRlbXAxID0gKnB0cjE7CS8qIHN3YXAgb2RkIGNvbHVtbiB3aXRoIHNpZ24gY2hhbmdlICovCisJICAgIHRlbXAyID0gKnB0cjI7CisJICAgICpwdHIxKysgPSAtdGVtcDI7CisJICAgICpwdHIyKysgPSAtdGVtcDE7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb19mbGlwX3YgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogVmVydGljYWwgZmxpcCAqLworeworICBKRElNRU5TSU9OIE1DVV9yb3dzLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogV2Ugb3V0cHV0IGludG8gYSBzZXBhcmF0ZSBhcnJheSBiZWNhdXNlIHdlIGNhbid0IHRvdWNoIGRpZmZlcmVudAorICAgKiByb3dzIG9mIHRoZSBzb3VyY2UgdmlydHVhbCBhcnJheSBzaW11bHRhbmVvdXNseS4gIE90aGVyd2lzZSwgdGhpcworICAgKiBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgYW5hbG9nIG9mIGhvcml6b250YWwgZmxpcC4KKyAgICogV2l0aGluIGEgRENUIGJsb2NrLCB2ZXJ0aWNhbCBtaXJyb3JpbmcgaXMgZG9uZSBieSBjaGFuZ2luZyB0aGUgc2lnbnMKKyAgICogb2Ygb2RkLW51bWJlcmVkIHJvd3MuCisgICAqIFBhcnRpYWwgaU1DVXMgYXQgdGhlIGJvdHRvbSBlZGdlIGFyZSBjb3BpZWQgdmVyYmF0aW0uCisgICAqLworICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCS8qIFJvdyBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwlzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLAorCSAgIGNvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCisJICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKyAgICAgIH0gZWxzZSB7CisJLyogQm90dG9tLWVkZ2UgYmxvY2tzIHdpbGwgYmUgY29waWVkIHZlcmJhdGltLiAqLworCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgICAgfQorICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKKwkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKKwkgIGZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworCSAgICAgICBkc3RfYmxrX3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKKwkgICAgICAvKiBjb3B5IGV2ZW4gcm93ICovCisJICAgICAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJICAgICAgLyogY29weSBvZGQgcm93IHdpdGggc2lnbiBjaGFuZ2UgKi8KKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgICB9CisJICB9CisJfSBlbHNlIHsKKwkgIC8qIEp1c3QgY29weSByb3cgdmVyYmF0aW0uICovCisJICBqY29weV9ibG9ja19yb3coc3JjX2J1ZmZlcltvZmZzZXRfeV0sIGRzdF9idWZmZXJbb2Zmc2V0X3ldLAorCQkJICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MpOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fdHJhbnNwb3NlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIFRyYW5zcG9zZSBzb3VyY2UgaW50byBkZXN0aW5hdGlvbiAqLworeworICBKRElNRU5TSU9OIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBUcmFuc3Bvc2luZyBwaXhlbHMgd2l0aGluIGEgYmxvY2sganVzdCByZXF1aXJlcyB0cmFuc3Bvc2luZyB0aGUKKyAgICogRENUIGNvZWZmaWNpZW50cy4KKyAgICogUGFydGlhbCBpTUNVcyBhdCB0aGUgZWRnZXMgcmVxdWlyZSBubyBzcGVjaWFsIHRyZWF0bWVudDsgd2Ugc2ltcGx5CisgICAqIHByb2Nlc3MgYWxsIHRoZSBhdmFpbGFibGUgRENUIGJsb2NrcyBmb3IgZXZlcnkgY29tcG9uZW50LgorICAgKi8KKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWZvciAoZHN0X2Jsa194ID0gMDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOworCSAgICAgZHN0X2Jsa194ICs9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpIHsKKwkgIHNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa194LAorCSAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsIEZBTFNFKTsKKwkgIGZvciAob2Zmc2V0X3ggPSAwOyBvZmZzZXRfeCA8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7IG9mZnNldF94KyspIHsKKwkgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKKwkgICAgZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQlkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fcm90XzkwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIDkwIGRlZ3JlZSByb3RhdGlvbiBpcyBlcXVpdmFsZW50IHRvCisgKiAgIDEuIFRyYW5zcG9zaW5nIHRoZSBpbWFnZTsKKyAqICAgMi4gSG9yaXpvbnRhbCBtaXJyb3JpbmcuCisgKiBUaGVzZSB0d28gc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KKyAqLworeworICBKRElNRU5TSU9OIE1DVV9jb2xzLCBjb21wX3dpZHRoLCBkc3RfYmxrX3gsIGRzdF9ibGtfeTsKKyAgaW50IGNpLCBpLCBqLCBvZmZzZXRfeCwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgLyogQmVjYXVzZSBvZiB0aGUgaG9yaXpvbnRhbCBtaXJyb3Igc3RlcCwgd2UgY2FuJ3QgcHJvY2VzcyBwYXJ0aWFsIGlNQ1VzCisgICAqIGF0IHRoZSAob3V0cHV0KSByaWdodCBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAorICAgKiBub3QgbWlycm9yZWQuCisgICAqLworICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisJICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgeworCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCisJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOworCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgeworCSAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF1bZHN0X2Jsa195ICsgb2Zmc2V0X3ldOworCSAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgeworCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCSAgICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XQorCQlbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07CisJICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCWkrKzsKKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgLyogRWRnZSBibG9ja3MgYXJlIHRyYW5zcG9zZWQgYnV0IG5vdCBtaXJyb3JlZC4gKi8KKwkgICAgICBkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV1bZHN0X2Jsa194ICsgb2Zmc2V0X3hdOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspCisJCSAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCitMT0NBTCh2b2lkKQorZG9fcm90XzI3MCAoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgIGp2aXJ0X2JhcnJheV9wdHIgKmRzdF9jb2VmX2FycmF5cykKKy8qIDI3MCBkZWdyZWUgcm90YXRpb24gaXMgZXF1aXZhbGVudCB0bworICogICAxLiBIb3Jpem9udGFsIG1pcnJvcmluZzsKKyAqICAgMi4gVHJhbnNwb3NpbmcgdGhlIGltYWdlLgorICogVGhlc2UgdHdvIHN0ZXBzIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBwcm9jZXNzaW5nIHJvdXRpbmUuCisgKi8KK3sKKyAgSkRJTUVOU0lPTiBNQ1Vfcm93cywgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICAvKiBCZWNhdXNlIG9mIHRoZSBob3Jpem9udGFsIG1pcnJvciBzdGVwLCB3ZSBjYW4ndCBwcm9jZXNzIHBhcnRpYWwgaU1DVXMKKyAgICogYXQgdGhlIChvdXRwdXQpIGJvdHRvbSBlZGdlIHByb3Blcmx5LiAgVGhleSBqdXN0IGdldCB0cmFuc3Bvc2VkIGFuZAorICAgKiBub3QgbWlycm9yZWQuCisgICAqLworICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfaGVpZ2h0ID0gTUNVX3Jvd3MgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yOworICAgIGZvciAoZHN0X2Jsa195ID0gMDsgZHN0X2Jsa195IDwgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKKwkgZHN0X2Jsa195ICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpIHsKKyAgICAgIGRzdF9idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBkc3RfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3ksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBUUlVFKTsKKyAgICAgIGZvciAob2Zmc2V0X3kgPSAwOyBvZmZzZXRfeSA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG9mZnNldF95KyspIHsKKwlmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKKwkgICAgIGRzdF9ibGtfeCArPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSB7CisJICBzcmNfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkgICAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeCwKKwkgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yLCBGQUxTRSk7CisJICBmb3IgKG9mZnNldF94ID0gMDsgb2Zmc2V0X3ggPCBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOyBvZmZzZXRfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJICAgIGlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCSAgICAgIC8qIEJsb2NrIGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCSAgICAgIHNyY19wdHIgPSBzcmNfYnVmZmVyW29mZnNldF94XQorCQlbY29tcF9oZWlnaHQgLSBkc3RfYmxrX3kgLSBvZmZzZXRfeSAtIDFdOworCSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgeworCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgaisrOworCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQl9CisJICAgICAgfQorCSAgICB9IGVsc2UgeworCSAgICAgIC8qIEVkZ2UgYmxvY2tzIGFyZSB0cmFuc3Bvc2VkIGJ1dCBub3QgbWlycm9yZWQuICovCisJICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKKwkgICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJICAgIH0KKwkgIH0KKwl9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworTE9DQUwodm9pZCkKK2RvX3JvdF8xODAgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICBqdmlydF9iYXJyYXlfcHRyICpkc3RfY29lZl9hcnJheXMpCisvKiAxODAgZGVncmVlIHJvdGF0aW9uIGlzIGVxdWl2YWxlbnQgdG8KKyAqICAgMS4gVmVydGljYWwgbWlycm9yaW5nOworICogICAyLiBIb3Jpem9udGFsIG1pcnJvcmluZy4KKyAqIFRoZXNlIHR3byBzdGVwcyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgcHJvY2Vzc2luZyByb3V0aW5lLgorICovCit7CisgIEpESU1FTlNJT04gTUNVX2NvbHMsIE1DVV9yb3dzLCBjb21wX3dpZHRoLCBjb21wX2hlaWdodCwgZHN0X2Jsa194LCBkc3RfYmxrX3k7CisgIGludCBjaSwgaSwgaiwgb2Zmc2V0X3k7CisgIEpCTE9DS0FSUkFZIHNyY19idWZmZXIsIGRzdF9idWZmZXI7CisgIEpCTE9DS1JPVyBzcmNfcm93X3B0ciwgZHN0X3Jvd19wdHI7CisgIEpDT0VGUFRSIHNyY19wdHIsIGRzdF9wdHI7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisKKyAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChkc3RpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBNQ1Vfcm93cyA9IGRzdGluZm8tPmltYWdlX2hlaWdodCAvIChkc3RpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworCisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgY29tcHB0ciA9IGRzdGluZm8tPmNvbXBfaW5mbyArIGNpOworICAgIGNvbXBfd2lkdGggPSBNQ1VfY29scyAqIGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgY29tcF9oZWlnaHQgPSBNQ1Vfcm93cyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgZm9yIChkc3RfYmxrX3kgPSAwOyBkc3RfYmxrX3kgPCBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOworCSBkc3RfYmxrX3kgKz0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikgeworICAgICAgZHN0X2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIGRzdF9jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOworICAgICAgaWYgKGRzdF9ibGtfeSA8IGNvbXBfaGVpZ2h0KSB7CisJLyogUm93IGlzIHdpdGhpbiB0aGUgdmVydGljYWxseSBtaXJyb3JhYmxlIGFyZWEuICovCisJc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgc3JjX2NvZWZfYXJyYXlzW2NpXSwKKwkgICBjb21wX2hlaWdodCAtIGRzdF9ibGtfeSAtIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAorCSAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7CisgICAgICB9IGVsc2UgeworCS8qIEJvdHRvbS1lZGdlIHJvd3MgYXJlIG9ubHkgbWlycm9yZWQgaG9yaXpvbnRhbGx5LiAqLworCXNyY19idWZmZXIgPSAoKnNyY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQorCSAgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIHNyY19jb2VmX2FycmF5c1tjaV0sIGRzdF9ibGtfeSwKKwkgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgRkFMU0UpOworICAgICAgfQorICAgICAgZm9yIChvZmZzZXRfeSA9IDA7IG9mZnNldF95IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3krKykgeworCWlmIChkc3RfYmxrX3kgPCBjb21wX2hlaWdodCkgeworCSAgLyogUm93IGlzIHdpdGhpbiB0aGUgbWlycm9yYWJsZSBhcmVhLiAqLworCSAgZHN0X3Jvd19wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XTsKKwkgIHNyY19yb3dfcHRyID0gc3JjX2J1ZmZlcltjb21wcHRyLT52X3NhbXBfZmFjdG9yIC0gb2Zmc2V0X3kgLSAxXTsKKwkgIC8qIFByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGNhbiBiZSBtaXJyb3JlZCBib3RoIHdheXMuICovCisJICBmb3IgKGRzdF9ibGtfeCA9IDA7IGRzdF9ibGtfeCA8IGNvbXBfd2lkdGg7IGRzdF9ibGtfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIDFdOworCSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSArPSAyKSB7CisJICAgICAgLyogRm9yIGV2ZW4gcm93LCBuZWdhdGUgZXZlcnkgb2RkIGNvbHVtbi4gKi8KKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaiArPSAyKSB7CisJCSpkc3RfcHRyKysgPSAqc3JjX3B0cisrOworCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgICAgIH0KKwkgICAgICAvKiBGb3Igb2RkIHJvdywgbmVnYXRlIGV2ZXJ5IGV2ZW4gY29sdW1uLiAqLworCSAgICAgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqICs9IDIpIHsKKwkJKmRzdF9wdHIrKyA9IC0gKnNyY19wdHIrKzsKKwkJKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJICAgICAgfQorCSAgICB9CisJICB9CisJICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IG1pcnJvcmVkIHZlcnRpY2FsbHkuICovCisJICBmb3IgKDsgZHN0X2Jsa194IDwgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOyBkc3RfYmxrX3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2RzdF9ibGtfeF07CisJICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpICs9IDIpIHsKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkgICAgICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgICB9CisJICB9CisJfSBlbHNlIHsKKwkgIC8qIFJlbWFpbmluZyByb3dzIGFyZSBqdXN0IG1pcnJvcmVkIGhvcml6b250YWxseS4gKi8KKwkgIGRzdF9yb3dfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV07CisJICBzcmNfcm93X3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3ldOworCSAgLyogUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgY2FuIGJlIG1pcnJvcmVkLiAqLworCSAgZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wX3dpZHRoOyBkc3RfYmxrX3grKykgeworCSAgICBkc3RfcHRyID0gZHN0X3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgc3JjX3B0ciA9IHNyY19yb3dfcHRyW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSAxXTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDIpIHsKKwkgICAgICAqZHN0X3B0cisrID0gKnNyY19wdHIrKzsKKwkgICAgICAqZHN0X3B0cisrID0gLSAqc3JjX3B0cisrOworCSAgICB9CisJICB9CisJICAvKiBBbnkgcmVtYWluaW5nIHJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBvbmx5IGNvcGllZC4gKi8KKwkgIGZvciAoOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGRzdF9ibGtfeCsrKSB7CisJICAgIGRzdF9wdHIgPSBkc3Rfcm93X3B0cltkc3RfYmxrX3hdOworCSAgICBzcmNfcHRyID0gc3JjX3Jvd19wdHJbZHN0X2Jsa194XTsKKwkgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspCisJICAgICAgKmRzdF9wdHIrKyA9ICpzcmNfcHRyKys7CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitkb190cmFuc3ZlcnNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgICAgIGp2aXJ0X2JhcnJheV9wdHIgKnNyY19jb2VmX2FycmF5cywKKwkgICAgICAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzKQorLyogVHJhbnN2ZXJzZSB0cmFuc3Bvc2UgaXMgZXF1aXZhbGVudCB0bworICogICAxLiAxODAgZGVncmVlIHJvdGF0aW9uOworICogICAyLiBUcmFuc3Bvc2l0aW9uOworICogb3IKKyAqICAgMS4gSG9yaXpvbnRhbCBtaXJyb3Jpbmc7CisgKiAgIDIuIFRyYW5zcG9zaXRpb247CisgKiAgIDMuIEhvcml6b250YWwgbWlycm9yaW5nLgorICogVGhlc2Ugc3RlcHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHByb2Nlc3Npbmcgcm91dGluZS4KKyAqLworeworICBKRElNRU5TSU9OIE1DVV9jb2xzLCBNQ1Vfcm93cywgY29tcF93aWR0aCwgY29tcF9oZWlnaHQsIGRzdF9ibGtfeCwgZHN0X2Jsa195OworICBpbnQgY2ksIGksIGosIG9mZnNldF94LCBvZmZzZXRfeTsKKyAgSkJMT0NLQVJSQVkgc3JjX2J1ZmZlciwgZHN0X2J1ZmZlcjsKKyAgSkNPRUZQVFIgc3JjX3B0ciwgZHN0X3B0cjsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKworICBNQ1VfY29scyA9IGRzdGluZm8tPmltYWdlX3dpZHRoIC8gKGRzdGluZm8tPm1heF9oX3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKGRzdGluZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBjb21wcHRyID0gZHN0aW5mby0+Y29tcF9pbmZvICsgY2k7CisgICAgY29tcF93aWR0aCA9IE1DVV9jb2xzICogY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKKyAgICBjb21wX2hlaWdodCA9IE1DVV9yb3dzICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKKyAgICBmb3IgKGRzdF9ibGtfeSA9IDA7IGRzdF9ibGtfeSA8IGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3M7CisJIGRzdF9ibGtfeSArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSB7CisgICAgICBkc3RfYnVmZmVyID0gKCpzcmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKKwkoKGpfY29tbW9uX3B0cikgc3JjaW5mbywgZHN0X2NvZWZfYXJyYXlzW2NpXSwgZHN0X2Jsa195LAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7CisgICAgICBmb3IgKG9mZnNldF95ID0gMDsgb2Zmc2V0X3kgPCBjb21wcHRyLT52X3NhbXBfZmFjdG9yOyBvZmZzZXRfeSsrKSB7CisJZm9yIChkc3RfYmxrX3ggPSAwOyBkc3RfYmxrX3ggPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7CisJICAgICBkc3RfYmxrX3ggKz0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcikgeworCSAgc3JjX2J1ZmZlciA9ICgqc3JjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCisJICAgICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBzcmNfY29lZl9hcnJheXNbY2ldLCBkc3RfYmxrX3gsCisJICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwgRkFMU0UpOworCSAgZm9yIChvZmZzZXRfeCA9IDA7IG9mZnNldF94IDwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcjsgb2Zmc2V0X3grKykgeworCSAgICBpZiAoZHN0X2Jsa195IDwgY29tcF9oZWlnaHQpIHsKKwkgICAgICBzcmNfcHRyID0gc3JjX2J1ZmZlcltvZmZzZXRfeF0KKwkJW2NvbXBfaGVpZ2h0IC0gZHN0X2Jsa195IC0gb2Zmc2V0X3kgLSAxXTsKKwkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgeworCQkvKiBCbG9jayBpcyB3aXRoaW4gdGhlIG1pcnJvcmFibGUgYXJlYS4gKi8KKwkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldCisJCSAgW2NvbXBfd2lkdGggLSBkc3RfYmxrX3ggLSBvZmZzZXRfeCAtIDFdOworCQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTsgaSsrKSB7CisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgeworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICAgIGorKzsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgIH0KKwkJICBpKys7CisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykgeworCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSAtc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgICBqKys7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IHNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQkgIH0KKwkJfQorCSAgICAgIH0gZWxzZSB7CisJCS8qIFJpZ2h0LWVkZ2UgYmxvY2tzIGFyZSBtaXJyb3JlZCBpbiB5IG9ubHkgKi8KKwkJZHN0X3B0ciA9IGRzdF9idWZmZXJbb2Zmc2V0X3ldW2RzdF9ibGtfeCArIG9mZnNldF94XTsKKwkJZm9yIChpID0gMDsgaSA8IERDVFNJWkU7IGkrKykgeworCQkgIGZvciAoaiA9IDA7IGogPCBEQ1RTSVpFOyBqKyspIHsKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJCSAgICBqKys7CisJCSAgICBkc3RfcHRyW2oqRENUU0laRStpXSA9IC1zcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICB9CisJCX0KKwkgICAgICB9CisJICAgIH0gZWxzZSB7CisJICAgICAgc3JjX3B0ciA9IHNyY19idWZmZXJbb2Zmc2V0X3hdW2RzdF9ibGtfeSArIG9mZnNldF95XTsKKwkgICAgICBpZiAoZHN0X2Jsa194IDwgY29tcF93aWR0aCkgeworCQkvKiBCb3R0b20tZWRnZSBibG9ja3MgYXJlIG1pcnJvcmVkIGluIHggb25seSAqLworCQlkc3RfcHRyID0gZHN0X2J1ZmZlcltvZmZzZXRfeV0KKwkJICBbY29tcF93aWR0aCAtIGRzdF9ibGtfeCAtIG9mZnNldF94IC0gMV07CisJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwkJICBmb3IgKGogPSAwOyBqIDwgRENUU0laRTsgaisrKQorCQkgICAgZHN0X3B0cltqKkRDVFNJWkUraV0gPSBzcmNfcHRyW2kqRENUU0laRStqXTsKKwkJICBpKys7CisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gLXNyY19wdHJbaSpEQ1RTSVpFK2pdOworCQl9CisJICAgICAgfSBlbHNlIHsKKwkJLyogQXQgbG93ZXIgcmlnaHQgY29ybmVyLCBqdXN0IHRyYW5zcG9zZSwgbm8gbWlycm9yaW5nICovCisJCWRzdF9wdHIgPSBkc3RfYnVmZmVyW29mZnNldF95XVtkc3RfYmxrX3ggKyBvZmZzZXRfeF07CisJCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspCisJCSAgZm9yIChqID0gMDsgaiA8IERDVFNJWkU7IGorKykKKwkJICAgIGRzdF9wdHJbaipEQ1RTSVpFK2ldID0gc3JjX3B0cltpKkRDVFNJWkUral07CisJICAgICAgfQorCSAgICB9CisJICB9CisJfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKy8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZS4KKyAqCisgKiBXZSBhbGxvY2F0ZSB0aGUgd29ya3NwYWNlIHZpcnR1YWwgYXJyYXlzIGZyb20gdGhlIHNvdXJjZSBkZWNvbXByZXNzaW9uCisgKiBvYmplY3QsIHNvIHRoYXQgYWxsIHRoZSBhcnJheXMgKGJvdGggdGhlIG9yaWdpbmFsIGRhdGEgYW5kIHRoZSB3b3Jrc3BhY2UpCisgKiB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudCB3aGlsZSBtYWtpbmcgbWVtb3J5IG1hbmFnZW1lbnQgZGVjaXNpb25zLgorICogSGVuY2UsIHRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3JlYWRfaGVhZGVyICh3aGljaCByZWFkcworICogdGhlIGltYWdlIGRpbWVuc2lvbnMpIGFuZCBiZWZvcmUganBlZ19yZWFkX2NvZWZmaWNpZW50cyAod2hpY2ggcmVhbGl6ZXMKKyAqIHRoZSBzb3VyY2UncyB2aXJ0dWFsIGFycmF5cykuCisgKi8KKworR0xPQkFMKHZvaWQpCitqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQoreworICBqdmlydF9iYXJyYXlfcHRyICpjb2VmX2FycmF5cyA9IE5VTEw7CisgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7CisgIGludCBjaTsKKworICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlICYmCisgICAgICBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDciAmJgorICAgICAgc3JjaW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgeworICAgIC8qIFdlJ2xsIG9ubHkgcHJvY2VzcyB0aGUgZmlyc3QgY29tcG9uZW50ICovCisgICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSAxOworICB9IGVsc2UgeworICAgIC8qIFByb2Nlc3MgYWxsIHRoZSBjb21wb25lbnRzICovCisgICAgaW5mby0+bnVtX2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKKyAgfQorCisgIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7CisgIGNhc2UgSlhGT1JNX05PTkU6CisgIGNhc2UgSlhGT1JNX0ZMSVBfSDoKKyAgICAvKiBEb24ndCBuZWVkIGEgd29ya3NwYWNlIGFycmF5ICovCisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfVjoKKyAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKKyAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHNhbWUgZGltZW5zaW9ucyBhcyBzb3VyY2UgaW1hZ2UuCisgICAgICogTm90ZSB0aGF0IHdlIGFsbG9jYXRlIGFycmF5cyBwYWRkZWQgb3V0IHRvIHRoZSBuZXh0IGlNQ1UgYm91bmRhcnksCisgICAgICogc28gdGhhdCB0cmFuc2Zvcm0gcm91dGluZXMgbmVlZCBub3Qgd29ycnkgYWJvdXQgbWlzc2luZyBlZGdlIGJsb2Nrcy4KKyAgICAgKi8KKyAgICBjb2VmX2FycmF5cyA9IChqdmlydF9iYXJyYXlfcHRyICopCisgICAgICAoKnNyY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwKKwlTSVpFT0YoanZpcnRfYmFycmF5X3B0cikgKiBpbmZvLT5udW1fY29tcG9uZW50cyk7CisgICAgZm9yIChjaSA9IDA7IGNpIDwgaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICAgIGNvbXBwdHIgPSBzcmNpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICAgIGNvZWZfYXJyYXlzW2NpXSA9ICgqc3JjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfYmFycmF5KQorCSgoal9jb21tb25fcHRyKSBzcmNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCisJCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAorCSAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6CisgIGNhc2UgSlhGT1JNX1RSQU5TVkVSU0U6CisgIGNhc2UgSlhGT1JNX1JPVF85MDoKKyAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKKyAgICAvKiBOZWVkIHdvcmtzcGFjZSBhcnJheXMgaGF2aW5nIHRyYW5zcG9zZWQgZGltZW5zaW9ucy4KKyAgICAgKiBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgYXJyYXlzIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSwKKyAgICAgKiBzbyB0aGF0IHRyYW5zZm9ybSByb3V0aW5lcyBuZWVkIG5vdCB3b3JyeSBhYm91dCBtaXNzaW5nIGVkZ2UgYmxvY2tzLgorICAgICAqLworICAgIGNvZWZfYXJyYXlzID0gKGp2aXJ0X2JhcnJheV9wdHIgKikKKyAgICAgICgqc3JjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLAorCVNJWkVPRihqdmlydF9iYXJyYXlfcHRyKSAqIGluZm8tPm51bV9jb21wb25lbnRzKTsKKyAgICBmb3IgKGNpID0gMDsgY2kgPCBpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgICAgY29tcHB0ciA9IHNyY2luZm8tPmNvbXBfaW5mbyArIGNpOworICAgICAgY29lZl9hcnJheXNbY2ldID0gKCpzcmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9iYXJyYXkpCisJKChqX2NvbW1vbl9wdHIpIHNyY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKKwkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcywKKwkJCQkobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciksCisJIChKRElNRU5TSU9OKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKTsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzID0gY29lZl9hcnJheXM7Cit9CisKKworLyogVHJhbnNwb3NlIGRlc3RpbmF0aW9uIGltYWdlIHBhcmFtZXRlcnMgKi8KKworTE9DQUwodm9pZCkKK3RyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2NvbXByZXNzX3B0ciBkc3RpbmZvKQoreworICBpbnQgdGJsbm8sIGksIGosIGNpLCBpdGVtcDsKKyAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKKyAgSlFVQU5UX1RCTCAqcXRibHB0cjsKKyAgSkRJTUVOU0lPTiBkdGVtcDsKKyAgVUlOVDE2IHF0ZW1wOworCisgIC8qIFRyYW5zcG9zZSBiYXNpYyBpbWFnZSBkaW1lbnNpb25zICovCisgIGR0ZW1wID0gZHN0aW5mby0+aW1hZ2Vfd2lkdGg7CisgIGRzdGluZm8tPmltYWdlX3dpZHRoID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0OworICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBkdGVtcDsKKworICAvKiBUcmFuc3Bvc2Ugc2FtcGxpbmcgZmFjdG9ycyAqLworICBmb3IgKGNpID0gMDsgY2kgPCBkc3RpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgeworICAgIGNvbXBwdHIgPSBkc3RpbmZvLT5jb21wX2luZm8gKyBjaTsKKyAgICBpdGVtcCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7CisgICAgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7CisgICAgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9IGl0ZW1wOworICB9CisKKyAgLyogVHJhbnNwb3NlIHF1YW50aXphdGlvbiB0YWJsZXMgKi8KKyAgZm9yICh0YmxubyA9IDA7IHRibG5vIDwgTlVNX1FVQU5UX1RCTFM7IHRibG5vKyspIHsKKyAgICBxdGJscHRyID0gZHN0aW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOworICAgIGlmIChxdGJscHRyICE9IE5VTEwpIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFOyBpKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJICBxdGVtcCA9IHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXTsKKwkgIHF0YmxwdHItPnF1YW50dmFsW2kqRENUU0laRStqXSA9IHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXTsKKwkgIHF0YmxwdHItPnF1YW50dmFsW2oqRENUU0laRStpXSA9IHF0ZW1wOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisvKiBUcmltIG9mZiBhbnkgcGFydGlhbCBpTUNVcyBvbiB0aGUgaW5kaWNhdGVkIGRlc3RpbmF0aW9uIGVkZ2UgKi8KKworTE9DQUwodm9pZCkKK3RyaW1fcmlnaHRfZWRnZSAoal9jb21wcmVzc19wdHIgZHN0aW5mbykKK3sKKyAgaW50IGNpLCBtYXhfaF9zYW1wX2ZhY3RvcjsKKyAgSkRJTUVOU0lPTiBNQ1VfY29sczsKKworICAvKiBXZSBoYXZlIHRvIGNvbXB1dGUgbWF4X2hfc2FtcF9mYWN0b3Igb3Vyc2VsdmVzLAorICAgKiBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIHNldCB5ZXQgaW4gdGhlIGRlc3RpbmF0aW9uCisgICAqIChhbmQgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIHNvdXJjZSdzIHZhbHVlKS4KKyAgICovCisgIG1heF9oX3NhbXBfZmFjdG9yID0gMTsKKyAgZm9yIChjaSA9IDA7IGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKKyAgICBpbnQgaF9zYW1wX2ZhY3RvciA9IGRzdGluZm8tPmNvbXBfaW5mb1tjaV0uaF9zYW1wX2ZhY3RvcjsKKyAgICBtYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChtYXhfaF9zYW1wX2ZhY3RvciwgaF9zYW1wX2ZhY3Rvcik7CisgIH0KKyAgTUNVX2NvbHMgPSBkc3RpbmZvLT5pbWFnZV93aWR0aCAvIChtYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpOworICBpZiAoTUNVX2NvbHMgPiAwKQkJLyogY2FuJ3QgdHJpbSB0byAwIHBpeGVscyAqLworICAgIGRzdGluZm8tPmltYWdlX3dpZHRoID0gTUNVX2NvbHMgKiAobWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKK30KKworTE9DQUwodm9pZCkKK3RyaW1fYm90dG9tX2VkZ2UgKGpfY29tcHJlc3NfcHRyIGRzdGluZm8pCit7CisgIGludCBjaSwgbWF4X3Zfc2FtcF9mYWN0b3I7CisgIEpESU1FTlNJT04gTUNVX3Jvd3M7CisKKyAgLyogV2UgaGF2ZSB0byBjb21wdXRlIG1heF92X3NhbXBfZmFjdG9yIG91cnNlbHZlcywKKyAgICogYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiBzZXQgeWV0IGluIHRoZSBkZXN0aW5hdGlvbgorICAgKiAoYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBzb3VyY2UncyB2YWx1ZSkuCisgICAqLworICBtYXhfdl9zYW1wX2ZhY3RvciA9IDE7CisgIGZvciAoY2kgPSAwOyBjaSA8IGRzdGluZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7CisgICAgaW50IHZfc2FtcF9mYWN0b3IgPSBkc3RpbmZvLT5jb21wX2luZm9bY2ldLnZfc2FtcF9mYWN0b3I7CisgICAgbWF4X3Zfc2FtcF9mYWN0b3IgPSBNQVgobWF4X3Zfc2FtcF9mYWN0b3IsIHZfc2FtcF9mYWN0b3IpOworICB9CisgIE1DVV9yb3dzID0gZHN0aW5mby0+aW1hZ2VfaGVpZ2h0IC8gKG1heF92X3NhbXBfZmFjdG9yICogRENUU0laRSk7CisgIGlmIChNQ1Vfcm93cyA+IDApCQkvKiBjYW4ndCB0cmltIHRvIDAgcGl4ZWxzICovCisgICAgZHN0aW5mby0+aW1hZ2VfaGVpZ2h0ID0gTUNVX3Jvd3MgKiAobWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKTsKK30KKworCisvKiBBZGp1c3Qgb3V0cHV0IGltYWdlIHBhcmFtZXRlcnMgYXMgbmVlZGVkLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMoKQorICogYW5kIGJlZm9yZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNldCBvZiB2aXJ0dWFsIGNvZWZmaWNpZW50IGFycmF5cyB0byBiZSB3cml0dGVuCisgKiAoZWl0aGVyIHRoZSBvbmVzIGFsbG9jYXRlZCBieSBqdHJhbnNmb3JtX3JlcXVlc3Rfd29ya3NwYWNlLCBvciB0aGUKKyAqIG9yaWdpbmFsIHNvdXJjZSBkYXRhIGFycmF5cykuICBUaGUgY2FsbGVyIHdpbGwgbmVlZCB0byBwYXNzIHRoaXMgdmFsdWUKKyAqIHRvIGpwZWdfd3JpdGVfY29lZmZpY2llbnRzKCkuCisgKi8KKworR0xPQkFMKGp2aXJ0X2JhcnJheV9wdHIgKikKK2p0cmFuc2Zvcm1fYWRqdXN0X3BhcmFtZXRlcnMgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKKwkJCSAgICAgIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJCQkgICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJCQkgICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKQoreworICAvKiBJZiBmb3JjZS10by1ncmF5c2NhbGUgaXMgcmVxdWVzdGVkLCBhZGp1c3QgZGVzdGluYXRpb24gcGFyYW1ldGVycyAqLworICBpZiAoaW5mby0+Zm9yY2VfZ3JheXNjYWxlKSB7CisgICAgLyogV2UgdXNlIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gbWFrZSBzdXJlIHN1YnNpZGlhcnkgc2V0dGluZ3MgZ2V0IGZpeGVkCisgICAgICogcHJvcGVybHkuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSB0YXJnZXQgaF9zYW1wX2ZhY3RvciAmIHZfc2FtcF9mYWN0b3IKKyAgICAgKiB3aWxsIGdldCBzZXQgdG8gMSwgd2hpY2ggdHlwaWNhbGx5IHdvbid0IG1hdGNoIHRoZSBzb3VyY2UuCisgICAgICogSW4gZmFjdCB3ZSBkbyB0aGlzIGV2ZW4gaWYgdGhlIHNvdXJjZSBpcyBhbHJlYWR5IGdyYXlzY2FsZTsgdGhhdAorICAgICAqIHByb3ZpZGVzIGFuIGVhc3kgd2F5IG9mIGNvZXJjaW5nIGEgZ3JheXNjYWxlIEpQRUcgd2l0aCBmdW5ueSBzYW1wbGluZworICAgICAqIGZhY3RvcnMgdG8gdGhlIGN1c3RvbWFyeSAxLDEuICAoU29tZSBkZWNvZGVycyBmYWlsIG9uIG90aGVyIGZhY3RvcnMuKQorICAgICAqLworICAgIGlmICgoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IgJiYKKwkgZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPT0gMykgfHwKKwkoZHN0aW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFICYmCisJIGRzdGluZm8tPm51bV9jb21wb25lbnRzID09IDEpKSB7CisgICAgICAvKiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBzb3VyY2UncyBxdWFudGl6YXRpb24gdGFibGUgbnVtYmVyLiAqLworICAgICAgaW50IHN2X3F1YW50X3RibF9ubyA9IGRzdGluZm8tPmNvbXBfaW5mb1swXS5xdWFudF90Ymxfbm87CisgICAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGRzdGluZm8sIEpDU19HUkFZU0NBTEUpOworICAgICAgZHN0aW5mby0+Y29tcF9pbmZvWzBdLnF1YW50X3RibF9ubyA9IHN2X3F1YW50X3RibF9ubzsKKyAgICB9IGVsc2UgeworICAgICAgLyogU29ycnksIGNhbid0IGRvIGl0ICovCisgICAgICBFUlJFWElUKGRzdGluZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKKyAgICB9CisgIH0KKworICAvKiBDb3JyZWN0IHRoZSBkZXN0aW5hdGlvbidzIGltYWdlIGRpbWVuc2lvbnMgZXRjIGlmIG5lY2Vzc2FyeSAqLworICBzd2l0Y2ggKGluZm8tPnRyYW5zZm9ybSkgeworICBjYXNlIEpYRk9STV9OT05FOgorICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fRkxJUF9IOgorICAgIGlmIChpbmZvLT50cmltKQorICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9GTElQX1Y6CisgICAgaWYgKGluZm8tPnRyaW0pCisgICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1BPU0U6CisgICAgdHJhbnNwb3NlX2NyaXRpY2FsX3BhcmFtZXRlcnMoZHN0aW5mbyk7CisgICAgLyogdHJhbnNwb3NlIGRvZXMgTk9UIGhhdmUgdG8gdHJpbSBhbnl0aGluZyAqLworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgorICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOworICAgIGlmIChpbmZvLT50cmltKSB7CisgICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7CisgICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzkwOgorICAgIHRyYW5zcG9zZV9jcml0aWNhbF9wYXJhbWV0ZXJzKGRzdGluZm8pOworICAgIGlmIChpbmZvLT50cmltKQorICAgICAgdHJpbV9yaWdodF9lZGdlKGRzdGluZm8pOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfMTgwOgorICAgIGlmIChpbmZvLT50cmltKSB7CisgICAgICB0cmltX3JpZ2h0X2VkZ2UoZHN0aW5mbyk7CisgICAgICB0cmltX2JvdHRvbV9lZGdlKGRzdGluZm8pOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKKyAgICB0cmFuc3Bvc2VfY3JpdGljYWxfcGFyYW1ldGVycyhkc3RpbmZvKTsKKyAgICBpZiAoaW5mby0+dHJpbSkKKyAgICAgIHRyaW1fYm90dG9tX2VkZ2UoZHN0aW5mbyk7CisgICAgYnJlYWs7CisgIH0KKworICAvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBkYXRhIHNldCAqLworICBpZiAoaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzICE9IE5VTEwpCisgICAgcmV0dXJuIGluZm8tPndvcmtzcGFjZV9jb2VmX2FycmF5czsKKyAgcmV0dXJuIHNyY19jb2VmX2FycmF5czsKK30KKworCisvKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueS4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkICphZnRlcioganBlZ193cml0ZV9jb2VmZmljaWVudHMsIGJlY2F1c2UgaXQgZGVwZW5kcworICogb24ganBlZ193cml0ZV9jb2VmZmljaWVudHMgdG8gaGF2ZSBjb21wdXRlZCBzdWJzaWRpYXJ5IHZhbHVlcyBzdWNoIGFzCisgKiB0aGUgcGVyLWNvbXBvbmVudCB3aWR0aCBhbmQgaGVpZ2h0IGZpZWxkcyBpbiB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgorICoKKyAqIE5vdGUgdGhhdCBzb21lIHRyYW5zZm9ybWF0aW9ucyB3aWxsIG1vZGlmeSB0aGUgc291cmNlIGRhdGEgYXJyYXlzIQorICovCisKK0dMT0JBTCh2b2lkKQoranRyYW5zZm9ybV9leGVjdXRlX3RyYW5zZm9ybWF0aW9uIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCisJCQkJICAgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkJCQkgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJCQkJICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykKK3sKKyAganZpcnRfYmFycmF5X3B0ciAqZHN0X2NvZWZfYXJyYXlzID0gaW5mby0+d29ya3NwYWNlX2NvZWZfYXJyYXlzOworCisgIHN3aXRjaCAoaW5mby0+dHJhbnNmb3JtKSB7CisgIGNhc2UgSlhGT1JNX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX0ZMSVBfSDoKKyAgICBkb19mbGlwX2goc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fRkxJUF9WOgorICAgIGRvX2ZsaXBfdihzcmNpbmZvLCBkc3RpbmZvLCBzcmNfY29lZl9hcnJheXMsIGRzdF9jb2VmX2FycmF5cyk7CisgICAgYnJlYWs7CisgIGNhc2UgSlhGT1JNX1RSQU5TUE9TRToKKyAgICBkb190cmFuc3Bvc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9UUkFOU1ZFUlNFOgorICAgIGRvX3RyYW5zdmVyc2Uoc3JjaW5mbywgZHN0aW5mbywgc3JjX2NvZWZfYXJyYXlzLCBkc3RfY29lZl9hcnJheXMpOworICAgIGJyZWFrOworICBjYXNlIEpYRk9STV9ST1RfOTA6CisgICAgZG9fcm90XzkwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzE4MDoKKyAgICBkb19yb3RfMTgwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgY2FzZSBKWEZPUk1fUk9UXzI3MDoKKyAgICBkb19yb3RfMjcwKHNyY2luZm8sIGRzdGluZm8sIHNyY19jb2VmX2FycmF5cywgZHN0X2NvZWZfYXJyYXlzKTsKKyAgICBicmVhazsKKyAgfQorfQorCisjZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KKworCisvKiBTZXR1cCBkZWNvbXByZXNzaW9uIG9iamVjdCB0byBzYXZlIGRlc2lyZWQgbWFya2VycyBpbiBtZW1vcnkuCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBqcGVnX3JlYWRfaGVhZGVyKCkgdG8gaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QuCisgKi8KKworR0xPQkFMKHZvaWQpCitqY29weV9tYXJrZXJzX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIEpDT1BZX09QVElPTiBvcHRpb24pCit7CisjaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAorICBpbnQgbTsKKworICAvKiBTYXZlIGNvbW1lbnRzIGV4Y2VwdCB1bmRlciBOT05FIG9wdGlvbiAqLworICBpZiAob3B0aW9uICE9IEpDT1BZT1BUX05PTkUpIHsKKyAgICBqcGVnX3NhdmVfbWFya2VycyhzcmNpbmZvLCBKUEVHX0NPTSwgMHhGRkZGKTsKKyAgfQorICAvKiBTYXZlIGFsbCB0eXBlcyBvZiBBUFBuIG1hcmtlcnMgaWZmIEFMTCBvcHRpb24gKi8KKyAgaWYgKG9wdGlvbiA9PSBKQ09QWU9QVF9BTEwpIHsKKyAgICBmb3IgKG0gPSAwOyBtIDwgMTY7IG0rKykKKyAgICAgIGpwZWdfc2F2ZV9tYXJrZXJzKHNyY2luZm8sIEpQRUdfQVBQMCArIG0sIDB4RkZGRik7CisgIH0KKyNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCit9CisKKy8qIENvcHkgbWFya2VycyBzYXZlZCBpbiB0aGUgZ2l2ZW4gc291cmNlIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGp1c3QgYWZ0ZXIganBlZ19zdGFydF9jb21wcmVzcygpIG9yCisgKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgorICogTm90ZSB0aGF0IHRob3NlIHJvdXRpbmVzIHdpbGwgaGF2ZSB3cml0dGVuIHRoZSBTT0ksIGFuZCBhbHNvIHRoZQorICogSkZJRiBBUFAwIG9yIEFkb2JlIEFQUDE0IG1hcmtlcnMgaWYgc2VsZWN0ZWQuCisgKi8KKworR0xPQkFMKHZvaWQpCitqY29weV9tYXJrZXJzX2V4ZWN1dGUgKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywgal9jb21wcmVzc19wdHIgZHN0aW5mbywKKwkJICAgICAgIEpDT1BZX09QVElPTiBvcHRpb24pCit7CisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXI7CisKKyAgLyogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gZXhhbWluZSB0aGUKKyAgICogb3B0aW9uIGZsYWcgaGVyZTsgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmcgdGhhdCBnb3Qgc2F2ZWQuCisgICAqIEJ1dCB0byBhdm9pZCBjb25mdXNpb24sIHdlIGRvIG5vdCBvdXRwdXQgSkZJRiBhbmQgQWRvYmUgQVBQMTQgbWFya2VycworICAgKiBpZiB0aGUgZW5jb2RlciBsaWJyYXJ5IGFscmVhZHkgd3JvdGUgb25lLgorICAgKi8KKyAgZm9yIChtYXJrZXIgPSBzcmNpbmZvLT5tYXJrZXJfbGlzdDsgbWFya2VyICE9IE5VTEw7IG1hcmtlciA9IG1hcmtlci0+bmV4dCkgeworICAgIGlmIChkc3RpbmZvLT53cml0ZV9KRklGX2hlYWRlciAmJgorCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCAmJgorCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NEEgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDQ2ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg0OSAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NDYgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAwKQorICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBKRklGICovCisgICAgaWYgKGRzdGluZm8tPndyaXRlX0Fkb2JlX21hcmtlciAmJgorCW1hcmtlci0+bWFya2VyID09IEpQRUdfQVBQMCsxNCAmJgorCW1hcmtlci0+ZGF0YV9sZW5ndGggPj0gNSAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbMF0pID09IDB4NDEgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzFdKSA9PSAweDY0ICYmCisJR0VUSk9DVEVUKG1hcmtlci0+ZGF0YVsyXSkgPT0gMHg2RiAmJgorCUdFVEpPQ1RFVChtYXJrZXItPmRhdGFbM10pID09IDB4NjIgJiYKKwlHRVRKT0NURVQobWFya2VyLT5kYXRhWzRdKSA9PSAweDY1KQorICAgICAgY29udGludWU7CQkJLyogcmVqZWN0IGR1cGxpY2F0ZSBBZG9iZSAqLworI2lmZGVmIE5FRURfRkFSX1BPSU5URVJTCisgICAgLyogV2UgY291bGQgdXNlIGpwZWdfd3JpdGVfbWFya2VyIGlmIHRoZSBkYXRhIHdlcmVuJ3QgRkFSLi4uICovCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICBqcGVnX3dyaXRlX21faGVhZGVyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLCBtYXJrZXItPmRhdGFfbGVuZ3RoKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXJrZXItPmRhdGFfbGVuZ3RoOyBpKyspCisJanBlZ193cml0ZV9tX2J5dGUoZHN0aW5mbywgbWFya2VyLT5kYXRhW2ldKTsKKyAgICB9CisjZWxzZQorICAgIGpwZWdfd3JpdGVfbWFya2VyKGRzdGluZm8sIG1hcmtlci0+bWFya2VyLAorCQkgICAgICBtYXJrZXItPmRhdGEsIG1hcmtlci0+ZGF0YV9sZW5ndGgpOworI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90cmFuc3VwcC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3RyYW5zdXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyZDMyYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi90cmFuc3VwcC5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogdHJhbnN1cHAuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZAorICogb3RoZXIgdXRpbGl0eSBjb2RlIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZQorICogTk9UIHBhcnQgb2YgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUKKyAqIGZyb20ganBlZ3RyYW4uYyB0byBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMKKyAqIHRoYXQgaGF2ZSBvdGhlciB1c2VyIGludGVyZmFjZXMuCisgKgorICogTk9URTogYWxsIHRoZSByb3V0aW5lcyBkZWNsYXJlZCBoZXJlIGhhdmUgdmVyeSBzcGVjaWZpYyByZXF1aXJlbWVudHMKKyAqIGFib3V0IHdoZW4gdGhleSBhcmUgdG8gYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIHRoZQorICogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmaWxlcy4gIFNlZSB0aGUgY29tbWVudHMgaW4gdHJhbnN1cHAuYywgb3Igc2VlCisgKiBqcGVndHJhbi5jIGZvciBhbiBleGFtcGxlIG9mIGNvcnJlY3QgdXNhZ2UuCisgKi8KKworLyogSWYgeW91IGhhcHBlbiBub3QgdG8gd2FudCB0aGUgaW1hZ2UgdHJhbnNmb3JtIHN1cHBvcnQsIGRpc2FibGUgaXQgaGVyZSAqLworI2lmbmRlZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAorI2RlZmluZSBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAxCQkvKiAwIGRpc2FibGVzIHRyYW5zZm9ybSBjb2RlICovCisjZW5kaWYKKworLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCisKKyNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCisjZGVmaW5lIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UJCWpUclJlcXVlc3QKKyNkZWZpbmUganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwkJalRyQWRqdXN0CisjZGVmaW5lIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbglqVHJFeGVjCisjZGVmaW5lIGpjb3B5X21hcmtlcnNfc2V0dXAJCQlqQ01ya1NldHVwCisjZGVmaW5lIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQkJCWpDTXJrRXhlYworI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KKworCisvKgorICogQ29kZXMgZm9yIHN1cHBvcnRlZCB0eXBlcyBvZiBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKWEZPUk1fTk9ORSwJCS8qIG5vIHRyYW5zZm9ybWF0aW9uICovCisJSlhGT1JNX0ZMSVBfSCwJCS8qIGhvcml6b250YWwgZmxpcCAqLworCUpYRk9STV9GTElQX1YsCQkvKiB2ZXJ0aWNhbCBmbGlwICovCisJSlhGT1JNX1RSQU5TUE9TRSwJLyogdHJhbnNwb3NlIGFjcm9zcyBVTC10by1MUiBheGlzICovCisJSlhGT1JNX1RSQU5TVkVSU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVVItdG8tTEwgYXhpcyAqLworCUpYRk9STV9ST1RfOTAsCQkvKiA5MC1kZWdyZWUgY2xvY2t3aXNlIHJvdGF0aW9uICovCisJSlhGT1JNX1JPVF8xODAsCQkvKiAxODAtZGVncmVlIHJvdGF0aW9uICovCisJSlhGT1JNX1JPVF8yNzAJCS8qIDI3MC1kZWdyZWUgY2xvY2t3aXNlIChvciA5MCBjY3cpICovCit9IEpYRk9STV9DT0RFOworCisvKgorICogQWx0aG91Z2ggcm90YXRpbmcgYW5kIGZsaXBwaW5nIGRhdGEgZXhwcmVzc2VkIGFzIERDVCBjb2VmZmljaWVudHMgaXMgbm90CisgKiBoYXJkLCB0aGVyZSBpcyBhbiBhc3ltbWV0cnkgaW4gdGhlIEpQRUcgZm9ybWF0IHNwZWNpZmljYXRpb24gZm9yIGltYWdlcworICogd2hvc2UgZGltZW5zaW9ucyBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRoZSBpTUNVIHNpemUuICBUaGUgcmlnaHQgYW5kIGJvdHRvbQorICogaW1hZ2UgZWRnZXMgYXJlIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSB3aXRoIGp1bmsgZGF0YTsgYnV0CisgKiBubyBwYWRkaW5nIGlzIHBvc3NpYmxlIGF0IHRoZSB0b3AgYW5kIGxlZnQgZWRnZXMuICBJZiB3ZSB3ZXJlIHRvIGZsaXAKKyAqIHRoZSB3aG9sZSBpbWFnZSBpbmNsdWRpbmcgdGhlIHBhZCBkYXRhLCB0aGVuIHBhZCBnYXJiYWdlIHdvdWxkIGJlY29tZQorICogdmlzaWJsZSBhdCB0aGUgdG9wIGFuZC9vciBsZWZ0LCBhbmQgcmVhbCBwaXhlbHMgd291bGQgZGlzYXBwZWFyIGludG8gdGhlCisgKiBwYWQgbWFyZ2lucyAtLS0gcGVyaGFwcyBwZXJtYW5lbnRseSwgc2luY2UgZW5jb2RlcnMgJiBkZWNvZGVycyBtYXkgbm90CisgKiBib3RoZXIgdG8gcHJlc2VydmUgRENUIGJsb2NrcyB0aGF0IGFwcGVhciB0byBiZSBjb21wbGV0ZWx5IG91dHNpZGUgdGhlCisgKiBub21pbmFsIGltYWdlIGFyZWEuICBTbywgd2UgaGF2ZSB0byBleGNsdWRlIGFueSBwYXJ0aWFsIGlNQ1VzIGZyb20gdGhlCisgKiBiYXNpYyB0cmFuc2Zvcm1hdGlvbi4KKyAqCisgKiBUcmFuc3Bvc2UgaXMgdGhlIG9ubHkgdHJhbnNmb3JtYXRpb24gdGhhdCBjYW4gaGFuZGxlIHBhcnRpYWwgaU1DVXMgYXQgdGhlCisgKiByaWdodCBhbmQgYm90dG9tIGVkZ2VzIGNvbXBsZXRlbHkgY2xlYW5seS4gIGZsaXBfaCBjYW4gZmxpcCBwYXJ0aWFsIGlNQ1VzCisgKiBhdCB0aGUgYm90dG9tLCBidXQgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSByaWdodCBlZGdlIHVudG91Y2hlZC4KKyAqIFNpbWlsYXJseSBmbGlwX3YgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQuCisgKiBUaGUgb3RoZXIgdHJhbnNmb3JtcyBhcmUgZGVmaW5lZCBhcyBjb21iaW5hdGlvbnMgb2YgdGhlc2UgYmFzaWMgdHJhbnNmb3JtcworICogYW5kIHByb2Nlc3MgZWRnZSBibG9ja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgdGhlIGVxdWl2YWxlbmNlLgorICoKKyAqIFRoZSAidHJpbSIgb3B0aW9uIGNhdXNlcyB1bnRyYW5zZm9ybWFibGUgcGFydGlhbCBpTUNVcyB0byBiZSBkcm9wcGVkOworICogdGhpcyBpcyBub3Qgc3RyaWN0bHkgbG9zc2xlc3MsIGJ1dCBpdCB1c3VhbGx5IGdpdmVzIHRoZSBiZXN0LWxvb2tpbmcKKyAqIHJlc3VsdCBmb3Igb2RkLXNpemUgaW1hZ2VzLiAgTm90ZSB0aGF0IHdoZW4gdGhpcyBvcHRpb24gaXMgYWN0aXZlLAorICogdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbCBlcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtcyBtYXkgbm90IGhvbGQuCisgKiAoRm9yIGV4YW1wbGUsIC1yb3QgMjcwIC10cmltIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgLXJvdCA5MCAtdHJpbQorICogZm9sbG93ZWQgYnkgLXJvdCAxODAgLXRyaW0gdHJpbXMgYm90aCBlZGdlcy4pCisgKgorICogV2UgYWxzbyBvZmZlciBhICJmb3JjZSB0byBncmF5c2NhbGUiIG9wdGlvbiwgd2hpY2ggc2ltcGx5IGRpc2NhcmRzIHRoZQorICogY2hyb21pbmFuY2UgY2hhbm5lbHMgb2YgYSBZQ2JDciBpbWFnZS4gIFRoaXMgaXMgbG9zc2xlc3MgaW4gdGhlIHNlbnNlIHRoYXQKKyAqIHRoZSBsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseS4gIEl0J3Mgbm90IHRoZSBzYW1lIGtpbmQgb2YKKyAqIHRoaW5nIGFzIHRoZSByb3RhdGUvZmxpcCB0cmFuc2Zvcm1hdGlvbnMsIGJ1dCBpdCdzIGNvbnZlbmllbnQgdG8gaGFuZGxlIGl0CisgKiBhcyBwYXJ0IG9mIHRoaXMgcGFja2FnZSwgbWFpbmx5IGJlY2F1c2UgdGhlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGhhdmUgdG8KKyAqIGJlIGF3YXJlIG9mIHRoZSBvcHRpb24gdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRvIHdvcmsgb24uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBPcHRpb25zOiBzZXQgYnkgY2FsbGVyICovCisgIEpYRk9STV9DT0RFIHRyYW5zZm9ybTsJLyogaW1hZ2UgdHJhbnNmb3JtIG9wZXJhdG9yICovCisgIGJvb2xlYW4gdHJpbTsJCQkvKiBpZiBUUlVFLCB0cmltIHBhcnRpYWwgTUNVcyBhcyBuZWVkZWQgKi8KKyAgYm9vbGVhbiBmb3JjZV9ncmF5c2NhbGU7CS8qIGlmIFRSVUUsIGNvbnZlcnQgY29sb3IgaW1hZ2UgdG8gZ3JheXNjYWxlICovCisKKyAgLyogSW50ZXJuYWwgd29ya3NwYWNlOiBjYWxsZXIgc2hvdWxkIG5vdCB0b3VjaCB0aGVzZSAqLworICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbXBvbmVudHMgaW4gd29ya3NwYWNlICovCisgIGp2aXJ0X2JhcnJheV9wdHIgKiB3b3Jrc3BhY2VfY29lZl9hcnJheXM7IC8qIHdvcmtzcGFjZSBmb3IgdHJhbnNmb3JtYXRpb25zICovCit9IGpwZWdfdHJhbnNmb3JtX2luZm87CisKKworI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECisKKy8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZSAqLworRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UKKwlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOworLyogQWRqdXN0IG91dHB1dCBpbWFnZSBwYXJhbWV0ZXJzICovCitFWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzCisJSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCisJICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCisJICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKSk7CisvKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueSAqLworRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbgorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAorCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOworCisjZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KKworCisvKgorICogU3VwcG9ydCBmb3IgY29weWluZyBvcHRpb25hbCBtYXJrZXJzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGUuCisgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlKQ09QWU9QVF9OT05FLAkJLyogY29weSBubyBvcHRpb25hbCBtYXJrZXJzICovCisJSkNPUFlPUFRfQ09NTUVOVFMsCS8qIGNvcHkgb25seSBjb21tZW50IChDT00pIG1hcmtlcnMgKi8KKwlKQ09QWU9QVF9BTEwJCS8qIGNvcHkgYWxsIG9wdGlvbmFsIG1hcmtlcnMgKi8KK30gSkNPUFlfT1BUSU9OOworCisjZGVmaW5lIEpDT1BZT1BUX0RFRkFVTFQgIEpDT1BZT1BUX0NPTU1FTlRTCS8qIHJlY29tbWVuZGVkIGRlZmF1bHQgKi8KKworLyogU2V0dXAgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gc2F2ZSBkZXNpcmVkIG1hcmtlcnMgaW4gbWVtb3J5ICovCitFWFRFUk4odm9pZCkgamNvcHlfbWFya2Vyc19zZXR1cAorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBKQ09QWV9PUFRJT04gb3B0aW9uKSk7CisvKiBDb3B5IG1hcmtlcnMgc2F2ZWQgaW4gdGhlIGdpdmVuIHNvdXJjZSBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLworRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAorCSAgICAgSkNPUFlfT1BUSU9OIG9wdGlvbikpOwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3VzYWdlLmRvYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi91c2FnZS5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0OTcwYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi91c2FnZS5kb2MKQEAgLTAsMCArMSw1NjIgQEAKK1VTQUdFIGluc3RydWN0aW9ucyBmb3IgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBKUEVHIHNvZnR3YXJlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgZGVzY3JpYmVzIHVzYWdlIG9mIHRoZSBKUEVHIGNvbnZlcnNpb24gcHJvZ3JhbXMgY2pwZWcgYW5kIGRqcGVnLAorYXMgd2VsbCBhcyB0aGUgdXRpbGl0eSBwcm9ncmFtcyBqcGVndHJhbiwgcmRqcGdjb20gYW5kIHdyanBnY29tLiAgKFNlZQordGhlIG90aGVyIGRvY3VtZW50YXRpb24gZmlsZXMgaWYgeW91IHdpc2ggdG8gdXNlIHRoZSBKUEVHIGxpYnJhcnkgd2l0aGluCit5b3VyIG93biBwcm9ncmFtcy4pCisKK0lmIHlvdSBhcmUgb24gYSBVbml4IG1hY2hpbmUgeW91IG1heSBwcmVmZXIgdG8gcmVhZCB0aGUgVW5peC1zdHlsZSBtYW51YWwKK3BhZ2VzIGluIGZpbGVzIGNqcGVnLjEsIGRqcGVnLjEsIGpwZWd0cmFuLjEsIHJkanBnY29tLjEsIHdyanBnY29tLjEuCisKKworSU5UUk9EVUNUSU9OCisKK1RoZXNlIHByb2dyYW1zIGltcGxlbWVudCBKUEVHIGltYWdlIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLiAgSlBFRworKHByb25vdW5jZWQgImpheS1wZWciKSBpcyBhIHN0YW5kYXJkaXplZCBjb21wcmVzc2lvbiBtZXRob2QgZm9yIGZ1bGwtY29sb3IKK2FuZCBncmF5LXNjYWxlIGltYWdlcy4gIEpQRUcgaXMgZGVzaWduZWQgdG8gaGFuZGxlICJyZWFsLXdvcmxkIiBzY2VuZXMsCitmb3IgZXhhbXBsZSBzY2FubmVkIHBob3RvZ3JhcGhzLiAgQ2FydG9vbnMsIGxpbmUgZHJhd2luZ3MsIGFuZCBvdGhlcgorbm9uLXJlYWxpc3RpYyBpbWFnZXMgYXJlIG5vdCBKUEVHJ3Mgc3Ryb25nIHN1aXQ7IG9uIHRoYXQgc29ydCBvZiBtYXRlcmlhbAoreW91IG1heSBnZXQgcG9vciBpbWFnZSBxdWFsaXR5IGFuZC9vciBsaXR0bGUgY29tcHJlc3Npb24uCisKK0pQRUcgaXMgbG9zc3ksIG1lYW5pbmcgdGhhdCB0aGUgb3V0cHV0IGltYWdlIGlzIG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwgdG8KK3RoZSBpbnB1dCBpbWFnZS4gIEhlbmNlIHlvdSBzaG91bGQgbm90IHVzZSBKUEVHIGlmIHlvdSBoYXZlIHRvIGhhdmUgaWRlbnRpY2FsCitvdXRwdXQgYml0cy4gIEhvd2V2ZXIsIG9uIHR5cGljYWwgcmVhbC13b3JsZCBpbWFnZXMsIHZlcnkgZ29vZCBjb21wcmVzc2lvbgorbGV2ZWxzIGNhbiBiZSBvYnRhaW5lZCB3aXRoIG5vIHZpc2libGUgY2hhbmdlLCBhbmQgYW1hemluZ2x5IGhpZ2ggY29tcHJlc3Npb24KK2lzIHBvc3NpYmxlIGlmIHlvdSBjYW4gdG9sZXJhdGUgYSBsb3ctcXVhbGl0eSBpbWFnZS4gIFlvdSBjYW4gdHJhZGUgb2ZmIGltYWdlCitxdWFsaXR5IGFnYWluc3QgZmlsZSBzaXplIGJ5IGFkanVzdGluZyB0aGUgY29tcHJlc3NvcidzICJxdWFsaXR5IiBzZXR0aW5nLgorCisKK0dFTkVSQUwgVVNBR0UKKworV2UgcHJvdmlkZSB0d28gcHJvZ3JhbXMsIGNqcGVnIHRvIGNvbXByZXNzIGFuIGltYWdlIGZpbGUgaW50byBKUEVHIGZvcm1hdCwKK2FuZCBkanBlZyB0byBkZWNvbXByZXNzIGEgSlBFRyBmaWxlIGJhY2sgaW50byBhIGNvbnZlbnRpb25hbCBpbWFnZSBmb3JtYXQuCisKK09uIFVuaXgtbGlrZSBzeXN0ZW1zLCB5b3Ugc2F5OgorCWNqcGVnIFtzd2l0Y2hlc10gW2ltYWdlZmlsZV0gPmpwZWdmaWxlCitvcgorCWRqcGVnIFtzd2l0Y2hlc10gW2pwZWdmaWxlXSAgPmltYWdlZmlsZQorVGhlIHByb2dyYW1zIHJlYWQgdGhlIHNwZWNpZmllZCBpbnB1dCBmaWxlLCBvciBzdGFuZGFyZCBpbnB1dCBpZiBub25lIGlzCituYW1lZC4gIFRoZXkgYWx3YXlzIHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dCAod2l0aCB0cmFjZS9lcnJvciBtZXNzYWdlcyB0bworc3RhbmRhcmQgZXJyb3IpLiAgVGhlc2UgY29udmVudGlvbnMgYXJlIGhhbmR5IGZvciBwaXBpbmcgaW1hZ2VzIGJldHdlZW4KK3Byb2dyYW1zLgorCitPbiBtb3N0IG5vbi1Vbml4IHN5c3RlbXMsIHlvdSBzYXk6CisJY2pwZWcgW3N3aXRjaGVzXSBpbWFnZWZpbGUganBlZ2ZpbGUKK29yCisJZGpwZWcgW3N3aXRjaGVzXSBqcGVnZmlsZSAgaW1hZ2VmaWxlCitpLmUuLCBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcworc3R5bGUgaXMgYSBsaXR0bGUgbW9yZSBmb29scHJvb2YsIGFuZCBpdCBsb3NlcyBubyBmdW5jdGlvbmFsaXR5IGlmIHlvdSBkb24ndAoraGF2ZSBwaXBlcy4gIChZb3UgY2FuIGdldCB0aGlzIHN0eWxlIG9uIFVuaXggdG9vLCBpZiB5b3UgcHJlZmVyLCBieSBkZWZpbmluZworVFdPX0ZJTEVfQ09NTUFORExJTkUgd2hlbiB5b3UgY29tcGlsZSB0aGUgcHJvZ3JhbXM7IHNlZSBpbnN0YWxsLmRvYy4pCisKK1lvdSBjYW4gYWxzbyBzYXk6CisJY2pwZWcgW3N3aXRjaGVzXSAtb3V0ZmlsZSBqcGVnZmlsZSAgaW1hZ2VmaWxlCitvcgorCWRqcGVnIFtzd2l0Y2hlc10gLW91dGZpbGUgaW1hZ2VmaWxlICBqcGVnZmlsZQorVGhpcyBzeW50YXggd29ya3Mgb24gYWxsIHN5c3RlbXMsIHNvIGl0IGlzIHVzZWZ1bCBmb3Igc2NyaXB0cy4KKworVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgaW1hZ2UgZmlsZSBmb3JtYXRzIGFyZTogUFBNIChQQk1QTFVTIGNvbG9yIGZvcm1hdCksCitQR00gKFBCTVBMVVMgZ3JheS1zY2FsZSBmb3JtYXQpLCBCTVAsIFRhcmdhLCBhbmQgUkxFIChVdGFoIFJhc3RlciBUb29sa2l0Citmb3JtYXQpLiAgKFJMRSBpcyBzdXBwb3J0ZWQgb25seSBpZiB0aGUgVVJUIGxpYnJhcnkgaXMgYXZhaWxhYmxlLikKK2NqcGVnIHJlY29nbml6ZXMgdGhlIGlucHV0IGltYWdlIGZvcm1hdCBhdXRvbWF0aWNhbGx5LCB3aXRoIHRoZSBleGNlcHRpb24KK29mIHNvbWUgVGFyZ2EtZm9ybWF0IGZpbGVzLiAgWW91IGhhdmUgdG8gdGVsbCBkanBlZyB3aGljaCBmb3JtYXQgdG8gZ2VuZXJhdGUuCisKK0pQRUcgZmlsZXMgYXJlIGluIHRoZSBkZWZhY3RvIHN0YW5kYXJkIEpGSUYgZmlsZSBmb3JtYXQuICBUaGVyZSBhcmUgb3RoZXIsCitsZXNzIHdpZGVseSB1c2VkIEpQRUctYmFzZWQgZmlsZSBmb3JtYXRzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLgorCitBbGwgc3dpdGNoIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZDsgZm9yIGV4YW1wbGUsIC1ncmF5c2NhbGUgbWF5IGJlIHdyaXR0ZW4KKy1ncmF5IG9yIC1nci4gIE1vc3Qgb2YgdGhlICJiYXNpYyIgc3dpdGNoZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFzIGxpdHRsZSBhcworb25lIGxldHRlci4gIFVwcGVyIGFuZCBsb3dlciBjYXNlIGFyZSBlcXVpdmFsZW50ICgtQk1QIGlzIHRoZSBzYW1lIGFzIC1ibXApLgorQnJpdGlzaCBzcGVsbGluZ3MgYXJlIGFsc28gYWNjZXB0ZWQgKGUuZy4sIC1ncmV5c2NhbGUpLCB0aG91Z2ggZm9yIGJyZXZpdHkKK3RoZXNlIGFyZSBub3QgbWVudGlvbmVkIGJlbG93LgorCisKK0NKUEVHIERFVEFJTFMKKworVGhlIGJhc2ljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBmb3IgY2pwZWcgYXJlOgorCisJLXF1YWxpdHkgTglTY2FsZSBxdWFudGl6YXRpb24gdGFibGVzIHRvIGFkanVzdCBpbWFnZSBxdWFsaXR5LgorCQkJUXVhbGl0eSBpcyAwICh3b3JzdCkgdG8gMTAwIChiZXN0KTsgZGVmYXVsdCBpcyA3NS4KKwkJCShTZWUgYmVsb3cgZm9yIG1vcmUgaW5mby4pCisKKwktZ3JheXNjYWxlCUNyZWF0ZSBtb25vY2hyb21lIEpQRUcgZmlsZSBmcm9tIGNvbG9yIGlucHV0LgorCQkJQmUgc3VyZSB0byB1c2UgdGhpcyBzd2l0Y2ggd2hlbiBjb21wcmVzc2luZyBhIGdyYXlzY2FsZQorCQkJQk1QIGZpbGUsIGJlY2F1c2UgY2pwZWcgaXNuJ3QgYnJpZ2h0IGVub3VnaCB0byBub3RpY2UKKwkJCXdoZXRoZXIgYSBCTVAgZmlsZSB1c2VzIG9ubHkgc2hhZGVzIG9mIGdyYXkuICBCeQorCQkJc2F5aW5nIC1ncmF5c2NhbGUsIHlvdSdsbCBnZXQgYSBzbWFsbGVyIEpQRUcgZmlsZSB0aGF0CisJCQl0YWtlcyBsZXNzIHRpbWUgdG8gcHJvY2Vzcy4KKworCS1vcHRpbWl6ZQlQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCisJCQlXaXRob3V0IHRoaXMsIGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgdXNlZC4KKwkJCS1vcHRpbWl6ZSB1c3VhbGx5IG1ha2VzIHRoZSBKUEVHIGZpbGUgYSBsaXR0bGUgc21hbGxlciwKKwkJCWJ1dCBjanBlZyBydW5zIHNvbWV3aGF0IHNsb3dlciBhbmQgbmVlZHMgbXVjaCBtb3JlCisJCQltZW1vcnkuICBJbWFnZSBxdWFsaXR5IGFuZCBzcGVlZCBvZiBkZWNvbXByZXNzaW9uIGFyZQorCQkJdW5hZmZlY3RlZCBieSAtb3B0aW1pemUuCisKKwktcHJvZ3Jlc3NpdmUJQ3JlYXRlIHByb2dyZXNzaXZlIEpQRUcgZmlsZSAoc2VlIGJlbG93KS4KKworCS10YXJnYQkJSW5wdXQgZmlsZSBpcyBUYXJnYSBmb3JtYXQuICBUYXJnYSBmaWxlcyB0aGF0IGNvbnRhaW4KKwkJCWFuICJpZGVudGlmaWNhdGlvbiIgZmllbGQgd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQorCQkJcmVjb2duaXplZCBieSBjanBlZzsgZm9yIHN1Y2ggZmlsZXMgeW91IG11c3Qgc3BlY2lmeQorCQkJLXRhcmdhIHRvIG1ha2UgY2pwZWcgdHJlYXQgdGhlIGlucHV0IGFzIFRhcmdhIGZvcm1hdC4KKwkJCUZvciBtb3N0IFRhcmdhIGZpbGVzLCB5b3Ugd29uJ3QgbmVlZCB0aGlzIHN3aXRjaC4KKworVGhlIC1xdWFsaXR5IHN3aXRjaCBsZXRzIHlvdSB0cmFkZSBvZmYgY29tcHJlc3NlZCBmaWxlIHNpemUgYWdhaW5zdCBxdWFsaXR5IG9mCit0aGUgcmVjb25zdHJ1Y3RlZCBpbWFnZTogdGhlIGhpZ2hlciB0aGUgcXVhbGl0eSBzZXR0aW5nLCB0aGUgbGFyZ2VyIHRoZSBKUEVHCitmaWxlLCBhbmQgdGhlIGNsb3NlciB0aGUgb3V0cHV0IGltYWdlIHdpbGwgYmUgdG8gdGhlIG9yaWdpbmFsIGlucHV0LiAgTm9ybWFsbHkKK3lvdSB3YW50IHRvIHVzZSB0aGUgbG93ZXN0IHF1YWxpdHkgc2V0dGluZyAoc21hbGxlc3QgZmlsZSkgdGhhdCBkZWNvbXByZXNzZXMKK2ludG8gc29tZXRoaW5nIHZpc3VhbGx5IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIG9yaWdpbmFsIGltYWdlLiAgRm9yIHRoaXMKK3B1cnBvc2UgdGhlIHF1YWxpdHkgc2V0dGluZyBzaG91bGQgYmUgYmV0d2VlbiA1MCBhbmQgOTU7IHRoZSBkZWZhdWx0IG9mIDc1IGlzCitvZnRlbiBhYm91dCByaWdodC4gIElmIHlvdSBzZWUgZGVmZWN0cyBhdCAtcXVhbGl0eSA3NSwgdGhlbiBnbyB1cCA1IG9yIDEwCitjb3VudHMgYXQgYSB0aW1lIHVudGlsIHlvdSBhcmUgaGFwcHkgd2l0aCB0aGUgb3V0cHV0IGltYWdlLiAgKFRoZSBvcHRpbWFsCitzZXR0aW5nIHdpbGwgdmFyeSBmcm9tIG9uZSBpbWFnZSB0byBhbm90aGVyLikKKworLXF1YWxpdHkgMTAwIHdpbGwgZ2VuZXJhdGUgYSBxdWFudGl6YXRpb24gdGFibGUgb2YgYWxsIDEncywgbWluaW1pemluZyBsb3NzCitpbiB0aGUgcXVhbnRpemF0aW9uIHN0ZXAgKGJ1dCB0aGVyZSBpcyBzdGlsbCBpbmZvcm1hdGlvbiBsb3NzIGluIHN1YnNhbXBsaW5nLAorYXMgd2VsbCBhcyByb3VuZG9mZiBlcnJvcikuICBUaGlzIHNldHRpbmcgaXMgbWFpbmx5IG9mIGludGVyZXN0IGZvcgorZXhwZXJpbWVudGFsIHB1cnBvc2VzLiAgUXVhbGl0eSB2YWx1ZXMgYWJvdmUgYWJvdXQgOTUgYXJlIE5PVCByZWNvbW1lbmRlZCBmb3IKK25vcm1hbCB1c2U7IHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBnb2VzIHVwIGRyYW1hdGljYWxseSBmb3IgaGFyZGx5IGFueSBnYWluCitpbiBvdXRwdXQgaW1hZ2UgcXVhbGl0eS4KKworSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgcXVhbGl0eSB2YWx1ZXMgYmVsb3cgNTAgd2lsbCBwcm9kdWNlIHZlcnkgc21hbGwgZmlsZXMKK29mIGxvdyBpbWFnZSBxdWFsaXR5LiAgU2V0dGluZ3MgYXJvdW5kIDUgdG8gMTAgbWlnaHQgYmUgdXNlZnVsIGluIHByZXBhcmluZyBhbgoraW5kZXggb2YgYSBsYXJnZSBpbWFnZSBsaWJyYXJ5LCBmb3IgZXhhbXBsZS4gIFRyeSAtcXVhbGl0eSAyIChvciBzbykgZm9yIHNvbWUKK2FtdXNpbmcgQ3ViaXN0IGVmZmVjdHMuICAoTm90ZTogcXVhbGl0eSB2YWx1ZXMgYmVsb3cgYWJvdXQgMjUgZ2VuZXJhdGUgMi1ieXRlCitxdWFudGl6YXRpb24gdGFibGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBvcHRpb25hbCBpbiB0aGUgSlBFRyBzdGFuZGFyZC4KK2NqcGVnIGVtaXRzIGEgd2FybmluZyBtZXNzYWdlIHdoZW4geW91IGdpdmUgc3VjaCBhIHF1YWxpdHkgdmFsdWUsIGJlY2F1c2Ugc29tZQorb3RoZXIgSlBFRyBwcm9ncmFtcyBtYXkgYmUgdW5hYmxlIHRvIGRlY29kZSB0aGUgcmVzdWx0aW5nIGZpbGUuICBVc2UgLWJhc2VsaW5lCitpZiB5b3UgbmVlZCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSBhdCBsb3cgcXVhbGl0eSB2YWx1ZXMuKQorCitUaGUgLXByb2dyZXNzaXZlIHN3aXRjaCBjcmVhdGVzIGEgInByb2dyZXNzaXZlIEpQRUciIGZpbGUuICBJbiB0aGlzIHR5cGUgb2YKK0pQRUcgZmlsZSwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIG11bHRpcGxlIHNjYW5zIG9mIGluY3JlYXNpbmcgcXVhbGl0eS4gIElmIHRoZQorZmlsZSBpcyBiZWluZyB0cmFuc21pdHRlZCBvdmVyIGEgc2xvdyBjb21tdW5pY2F0aW9ucyBsaW5rLCB0aGUgZGVjb2RlciBjYW4gdXNlCit0aGUgZmlyc3Qgc2NhbiB0byBkaXNwbGF5IGEgbG93LXF1YWxpdHkgaW1hZ2UgdmVyeSBxdWlja2x5LCBhbmQgY2FuIHRoZW4KK2ltcHJvdmUgdGhlIGRpc3BsYXkgd2l0aCBlYWNoIHN1YnNlcXVlbnQgc2Nhbi4gIFRoZSBmaW5hbCBpbWFnZSBpcyBleGFjdGx5CitlcXVpdmFsZW50IHRvIGEgc3RhbmRhcmQgSlBFRyBmaWxlIG9mIHRoZSBzYW1lIHF1YWxpdHkgc2V0dGluZywgYW5kIHRoZSB0b3RhbAorZmlsZSBzaXplIGlzIGFib3V0IHRoZSBzYW1lIC0tLSBvZnRlbiBhIGxpdHRsZSBzbWFsbGVyLiAgQ0FVVElPTjogcHJvZ3Jlc3NpdmUKK0pQRUcgaXMgbm90IHlldCB3aWRlbHkgaW1wbGVtZW50ZWQsIHNvIG1hbnkgZGVjb2RlcnMgd2lsbCBiZSB1bmFibGUgdG8gdmlldyBhCitwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgYXQgYWxsLgorCitTd2l0Y2hlcyBmb3IgYWR2YW5jZWQgdXNlcnM6CisKKwktZGN0IGludAlVc2UgaW50ZWdlciBEQ1QgbWV0aG9kIChkZWZhdWx0KS4KKwktZGN0IGZhc3QJVXNlIGZhc3QgaW50ZWdlciBEQ1QgKGxlc3MgYWNjdXJhdGUpLgorCS1kY3QgZmxvYXQJVXNlIGZsb2F0aW5nLXBvaW50IERDVCBtZXRob2QuCisJCQlUaGUgZmxvYXQgbWV0aG9kIGlzIHZlcnkgc2xpZ2h0bHkgbW9yZSBhY2N1cmF0ZSB0aGFuCisJCQl0aGUgaW50IG1ldGhvZCwgYnV0IGlzIG11Y2ggc2xvd2VyIHVubGVzcyB5b3VyIG1hY2hpbmUKKwkJCWhhcyB2ZXJ5IGZhc3QgZmxvYXRpbmctcG9pbnQgaGFyZHdhcmUuICBBbHNvIG5vdGUgdGhhdAorCQkJcmVzdWx0cyBvZiB0aGUgZmxvYXRpbmctcG9pbnQgbWV0aG9kIG1heSB2YXJ5IHNsaWdodGx5CisJCQlhY3Jvc3MgbWFjaGluZXMsIHdoaWxlIHRoZSBpbnRlZ2VyIG1ldGhvZHMgc2hvdWxkIGdpdmUKKwkJCXRoZSBzYW1lIHJlc3VsdHMgZXZlcnl3aGVyZS4gIFRoZSBmYXN0IGludGVnZXIgbWV0aG9kCisJCQlpcyBtdWNoIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgb3RoZXIgdHdvLgorCisJLXJlc3RhcnQgTglFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeQorCQkJTiBNQ1UgYmxvY2tzIGlmICJCIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorCQkJLXJlc3RhcnQgMCAodGhlIGRlZmF1bHQpIG1lYW5zIG5vIHJlc3RhcnQgbWFya2Vycy4KKworCS1zbW9vdGggTglTbW9vdGggdGhlIGlucHV0IGltYWdlIHRvIGVsaW1pbmF0ZSBkaXRoZXJpbmcgbm9pc2UuCisJCQlOLCByYW5naW5nIGZyb20gMSB0byAxMDAsIGluZGljYXRlcyB0aGUgc3RyZW5ndGggb2YKKwkJCXNtb290aGluZy4gIDAgKHRoZSBkZWZhdWx0KSBtZWFucyBubyBzbW9vdGhpbmcuCisKKwktbWF4bWVtb3J5IE4JU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nCisJCQlsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcyBpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yCisJCQltaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKwkJCUZvciBleGFtcGxlLCAtbWF4IDRtIHNlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUKKwkJCXNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KKworCS12ZXJib3NlCUVuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUgLXYncyBnaXZlIG1vcmUgcHJpbnRvdXQuCisJb3IgIC1kZWJ1ZwlBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KKworVGhlIC1yZXN0YXJ0IG9wdGlvbiBpbnNlcnRzIGV4dHJhIG1hcmtlcnMgdGhhdCBhbGxvdyBhIEpQRUcgZGVjb2RlciB0bworcmVzeW5jaHJvbml6ZSBhZnRlciBhIHRyYW5zbWlzc2lvbiBlcnJvci4gIFdpdGhvdXQgcmVzdGFydCBtYXJrZXJzLCBhbnkgZGFtYWdlCit0byBhIGNvbXByZXNzZWQgZmlsZSB3aWxsIHVzdWFsbHkgcnVpbiB0aGUgaW1hZ2UgZnJvbSB0aGUgcG9pbnQgb2YgdGhlIGVycm9yCit0byB0aGUgZW5kIG9mIHRoZSBpbWFnZTsgd2l0aCByZXN0YXJ0IG1hcmtlcnMsIHRoZSBkYW1hZ2UgaXMgdXN1YWxseSBjb25maW5lZAordG8gdGhlIHBvcnRpb24gb2YgdGhlIGltYWdlIHVwIHRvIHRoZSBuZXh0IHJlc3RhcnQgbWFya2VyLiAgT2YgY291cnNlLCB0aGUKK3Jlc3RhcnQgbWFya2VycyBvY2N1cHkgZXh0cmEgc3BhY2UuICBXZSByZWNvbW1lbmQgLXJlc3RhcnQgMSBmb3IgaW1hZ2VzIHRoYXQKK3dpbGwgYmUgdHJhbnNtaXR0ZWQgYWNyb3NzIHVucmVsaWFibGUgbmV0d29ya3Mgc3VjaCBhcyBVc2VuZXQuCisKK1RoZSAtc21vb3RoIG9wdGlvbiBmaWx0ZXJzIHRoZSBpbnB1dCB0byBlbGltaW5hdGUgZmluZS1zY2FsZSBub2lzZS4gIFRoaXMgaXMKK29mdGVuIHVzZWZ1bCB3aGVuIGNvbnZlcnRpbmcgZGl0aGVyZWQgaW1hZ2VzIHRvIEpQRUc6IGEgbW9kZXJhdGUgc21vb3RoaW5nCitmYWN0b3Igb2YgMTAgdG8gNTAgZ2V0cyByaWQgb2YgZGl0aGVyaW5nIHBhdHRlcm5zIGluIHRoZSBpbnB1dCBmaWxlLCByZXN1bHRpbmcKK2luIGEgc21hbGxlciBKUEVHIGZpbGUgYW5kIGEgYmV0dGVyLWxvb2tpbmcgaW1hZ2UuICBUb28gbGFyZ2UgYSBzbW9vdGhpbmcKK2ZhY3RvciB3aWxsIHZpc2libHkgYmx1ciB0aGUgaW1hZ2UsIGhvd2V2ZXIuCisKK1N3aXRjaGVzIGZvciB3aXphcmRzOgorCisJLWJhc2VsaW5lCUZvcmNlIGJhc2VsaW5lLWNvbXBhdGlibGUgcXVhbnRpemF0aW9uIHRhYmxlcyB0byBiZQorCQkJZ2VuZXJhdGVkLiAgVGhpcyBjbGFtcHMgcXVhbnRpemF0aW9uIHZhbHVlcyB0byA4IGJpdHMKKwkJCWV2ZW4gYXQgbG93IHF1YWxpdHkgc2V0dGluZ3MuICAoVGhpcyBzd2l0Y2ggaXMgcG9vcmx5CisJCQluYW1lZCwgc2luY2UgaXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcworCQkJYWN0dWFsbHkgYmFzZWxpbmUgSlBFRy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZQorCQkJLWJhc2VsaW5lIGFuZCAtcHJvZ3Jlc3NpdmUgdG9nZXRoZXIuKQorCisJLXF0YWJsZXMgZmlsZQlVc2UgdGhlIHF1YW50aXphdGlvbiB0YWJsZXMgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZAorCQkJdGV4dCBmaWxlLgorCisJLXFzbG90cyBOWywuLi5dIFNlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvciBlYWNoIGNvbG9yCisJCQljb21wb25lbnQuCisKKwktc2FtcGxlIEh4VlssLi4uXSAgU2V0IEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvciBjb21wb25lbnQuCisKKwktc2NhbnMgZmlsZQlVc2UgdGhlIHNjYW4gc2NyaXB0IGdpdmVuIGluIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWxlLgorCitUaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHLiAgSWYgeW91Citkb24ndCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgRE9OJ1QgVVNFIFRIRU0uICBUaGVzZSBzd2l0Y2hlcyBhcmUgZG9jdW1lbnRlZAorZnVydGhlciBpbiB0aGUgZmlsZSB3aXphcmQuZG9jLgorCisKK0RKUEVHIERFVEFJTFMKKworVGhlIGJhc2ljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyBmb3IgZGpwZWcgYXJlOgorCisJLWNvbG9ycyBOCVJlZHVjZSBpbWFnZSB0byBhdCBtb3N0IE4gY29sb3JzLiAgVGhpcyByZWR1Y2VzIHRoZQorCW9yIC1xdWFudGl6ZSBOCW51bWJlciBvZiBjb2xvcnMgdXNlZCBpbiB0aGUgb3V0cHV0IGltYWdlLCBzbyB0aGF0IGl0CisJCQljYW4gYmUgZGlzcGxheWVkIG9uIGEgY29sb3JtYXBwZWQgZGlzcGxheSBvciBzdG9yZWQgaW4KKwkJCWEgY29sb3JtYXBwZWQgZmlsZSBmb3JtYXQuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKKwkJCWFuIDgtYml0IGRpc3BsYXksIHlvdSdkIG5lZWQgdG8gcmVkdWNlIHRvIDI1NiBvciBmZXdlcgorCQkJY29sb3JzLiAgKC1jb2xvcnMgaXMgdGhlIHJlY29tbWVuZGVkIG5hbWUsIC1xdWFudGl6ZQorCQkJaXMgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuKQorCisJLWZhc3QJCVNlbGVjdCByZWNvbW1lbmRlZCBwcm9jZXNzaW5nIG9wdGlvbnMgZm9yIGZhc3QsIGxvdworCQkJcXVhbGl0eSBvdXRwdXQuICAoVGhlIGRlZmF1bHQgb3B0aW9ucyBhcmUgY2hvc2VuIGZvcgorCQkJaGlnaGVzdCBxdWFsaXR5IG91dHB1dC4pICBDdXJyZW50bHksIHRoaXMgaXMgZXF1aXZhbGVudAorCQkJdG8gIi1kY3QgZmFzdCAtbm9zbW9vdGggLW9uZXBhc3MgLWRpdGhlciBvcmRlcmVkIi4KKworCS1ncmF5c2NhbGUJRm9yY2UgZ3JheS1zY2FsZSBvdXRwdXQgZXZlbiBpZiBKUEVHIGZpbGUgaXMgY29sb3IuCisJCQlVc2VmdWwgZm9yIHZpZXdpbmcgb24gbW9ub2Nocm9tZSBkaXNwbGF5czsgYWxzbywKKwkJCWRqcGVnIHJ1bnMgbm90aWNlYWJseSBmYXN0ZXIgaW4gdGhpcyBtb2RlLgorCisJLXNjYWxlIE0vTglTY2FsZSB0aGUgb3V0cHV0IGltYWdlIGJ5IGEgZmFjdG9yIE0vTi4gIEN1cnJlbnRseQorCQkJdGhlIHNjYWxlIGZhY3RvciBtdXN0IGJlIDEvMSwgMS8yLCAxLzQsIG9yIDEvOC4KKwkJCVNjYWxpbmcgaXMgaGFuZHkgaWYgdGhlIGltYWdlIGlzIGxhcmdlciB0aGFuIHlvdXIKKwkJCXNjcmVlbjsgYWxzbywgZGpwZWcgcnVucyBtdWNoIGZhc3RlciB3aGVuIHNjYWxpbmcKKwkJCWRvd24gdGhlIG91dHB1dC4KKworCS1ibXAJCVNlbGVjdCBCTVAgb3V0cHV0IGZvcm1hdCAoV2luZG93cyBmbGF2b3IpLiAgOC1iaXQKKwkJCWNvbG9ybWFwcGVkIGZvcm1hdCBpcyBlbWl0dGVkIGlmIC1jb2xvcnMgb3IgLWdyYXlzY2FsZQorCQkJaXMgc3BlY2lmaWVkLCBvciBpZiB0aGUgSlBFRyBmaWxlIGlzIGdyYXktc2NhbGU7CisJCQlvdGhlcndpc2UsIDI0LWJpdCBmdWxsLWNvbG9yIGZvcm1hdCBpcyBlbWl0dGVkLgorCisJLWdpZgkJU2VsZWN0IEdJRiBvdXRwdXQgZm9ybWF0LiAgU2luY2UgR0lGIGRvZXMgbm90IHN1cHBvcnQKKwkJCW1vcmUgdGhhbiAyNTYgY29sb3JzLCAtY29sb3JzIDI1NiBpcyBhc3N1bWVkICh1bmxlc3MKKwkJCXlvdSBzcGVjaWZ5IGEgc21hbGxlciBudW1iZXIgb2YgY29sb3JzKS4gIElmIHlvdQorCQkJc3BlY2lmeSAtZmFzdCwgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGNvbG9ycyBpcyAyMTYuCisKKwktb3MyCQlTZWxlY3QgQk1QIG91dHB1dCBmb3JtYXQgKE9TLzIgMS54IGZsYXZvcikuICA4LWJpdAorCQkJY29sb3JtYXBwZWQgZm9ybWF0IGlzIGVtaXR0ZWQgaWYgLWNvbG9ycyBvciAtZ3JheXNjYWxlCisJCQlpcyBzcGVjaWZpZWQsIG9yIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZTsKKwkJCW90aGVyd2lzZSwgMjQtYml0IGZ1bGwtY29sb3IgZm9ybWF0IGlzIGVtaXR0ZWQuCisKKwktcG5tCQlTZWxlY3QgUEJNUExVUyAoUFBNL1BHTSkgb3V0cHV0IGZvcm1hdCAodGhpcyBpcyB0aGUKKwkJCWRlZmF1bHQgZm9ybWF0KS4gIFBHTSBpcyBlbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMKKwkJCWdyYXktc2NhbGUgb3IgaWYgLWdyYXlzY2FsZSBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZQorCQkJUFBNIGlzIGVtaXR0ZWQuCisKKwktcmxlCQlTZWxlY3QgUkxFIG91dHB1dCBmb3JtYXQuICAoUmVxdWlyZXMgVVJUIGxpYnJhcnkuKQorCisJLXRhcmdhCQlTZWxlY3QgVGFyZ2Egb3V0cHV0IGZvcm1hdC4gIEdyYXktc2NhbGUgZm9ybWF0IGlzCisJCQllbWl0dGVkIGlmIHRoZSBKUEVHIGZpbGUgaXMgZ3JheS1zY2FsZSBvciBpZgorCQkJLWdyYXlzY2FsZSBpcyBzcGVjaWZpZWQ7IG90aGVyd2lzZSwgY29sb3JtYXBwZWQgZm9ybWF0CisJCQlpcyBlbWl0dGVkIGlmIC1jb2xvcnMgaXMgc3BlY2lmaWVkOyBvdGhlcndpc2UsIDI0LWJpdAorCQkJZnVsbC1jb2xvciBmb3JtYXQgaXMgZW1pdHRlZC4KKworU3dpdGNoZXMgZm9yIGFkdmFuY2VkIHVzZXJzOgorCisJLWRjdCBpbnQJVXNlIGludGVnZXIgRENUIG1ldGhvZCAoZGVmYXVsdCkuCisJLWRjdCBmYXN0CVVzZSBmYXN0IGludGVnZXIgRENUIChsZXNzIGFjY3VyYXRlKS4KKwktZGN0IGZsb2F0CVVzZSBmbG9hdGluZy1wb2ludCBEQ1QgbWV0aG9kLgorCQkJVGhlIGZsb2F0IG1ldGhvZCBpcyB2ZXJ5IHNsaWdodGx5IG1vcmUgYWNjdXJhdGUgdGhhbgorCQkJdGhlIGludCBtZXRob2QsIGJ1dCBpcyBtdWNoIHNsb3dlciB1bmxlc3MgeW91ciBtYWNoaW5lCisJCQloYXMgdmVyeSBmYXN0IGZsb2F0aW5nLXBvaW50IGhhcmR3YXJlLiAgQWxzbyBub3RlIHRoYXQKKwkJCXJlc3VsdHMgb2YgdGhlIGZsb2F0aW5nLXBvaW50IG1ldGhvZCBtYXkgdmFyeSBzbGlnaHRseQorCQkJYWNyb3NzIG1hY2hpbmVzLCB3aGlsZSB0aGUgaW50ZWdlciBtZXRob2RzIHNob3VsZCBnaXZlCisJCQl0aGUgc2FtZSByZXN1bHRzIGV2ZXJ5d2hlcmUuICBUaGUgZmFzdCBpbnRlZ2VyIG1ldGhvZAorCQkJaXMgbXVjaCBsZXNzIGFjY3VyYXRlIHRoYW4gdGhlIG90aGVyIHR3by4KKworCS1kaXRoZXIgZnMJVXNlIEZsb3lkLVN0ZWluYmVyZyBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorCS1kaXRoZXIgb3JkZXJlZAlVc2Ugb3JkZXJlZCBkaXRoZXJpbmcgaW4gY29sb3IgcXVhbnRpemF0aW9uLgorCS1kaXRoZXIgbm9uZQlEbyBub3QgdXNlIGRpdGhlcmluZyBpbiBjb2xvciBxdWFudGl6YXRpb24uCisJCQlCeSBkZWZhdWx0LCBGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nIGlzIGFwcGxpZWQgd2hlbgorCQkJcXVhbnRpemluZyBjb2xvcnM7IHRoaXMgaXMgc2xvdyBidXQgdXN1YWxseSBwcm9kdWNlcworCQkJdGhlIGJlc3QgcmVzdWx0cy4gIE9yZGVyZWQgZGl0aGVyIGlzIGEgY29tcHJvbWlzZQorCQkJYmV0d2VlbiBzcGVlZCBhbmQgcXVhbGl0eTsgbm8gZGl0aGVyaW5nIGlzIGZhc3QgYnV0CisJCQl1c3VhbGx5IGxvb2tzIGF3ZnVsLiAgTm90ZSB0aGF0IHRoZXNlIHN3aXRjaGVzIGhhdmUKKwkJCW5vIGVmZmVjdCB1bmxlc3MgY29sb3IgcXVhbnRpemF0aW9uIGlzIGJlaW5nIGRvbmUuCisJCQlPcmRlcmVkIGRpdGhlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiAtb25lcGFzcyBtb2RlLgorCisJLW1hcCBGSUxFCVF1YW50aXplIHRvIHRoZSBjb2xvcnMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGltYWdlCisJCQlmaWxlLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHByb2R1Y2luZyBtdWx0aXBsZSBmaWxlcworCQkJd2l0aCBpZGVudGljYWwgY29sb3IgbWFwcywgb3IgZm9yIGZvcmNpbmcgYSBwcmVkZWZpbmVkCisJCQlzZXQgb2YgY29sb3JzIHRvIGJlIHVzZWQuICBUaGUgRklMRSBtdXN0IGJlIGEgR0lGCisJCQlvciBQUE0gZmlsZS4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyAtY29sb3JzIGFuZAorCQkJLW9uZXBhc3MuCisKKwktbm9zbW9vdGgJVXNlIGEgZmFzdGVyLCBsb3dlci1xdWFsaXR5IHVwc2FtcGxpbmcgcm91dGluZS4KKworCS1vbmVwYXNzCVVzZSBvbmUtcGFzcyBpbnN0ZWFkIG9mIHR3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbi4KKwkJCVRoZSBvbmUtcGFzcyBtZXRob2QgaXMgZmFzdGVyIGFuZCBuZWVkcyBsZXNzIG1lbW9yeSwKKwkJCWJ1dCBpdCBwcm9kdWNlcyBhIGxvd2VyLXF1YWxpdHkgaW1hZ2UuICAtb25lcGFzcyBpcworCQkJaWdub3JlZCB1bmxlc3MgeW91IGFsc28gc2F5IC1jb2xvcnMgTi4gIEFsc28sCisJCQl0aGUgb25lLXBhc3MgbWV0aG9kIGlzIGFsd2F5cyB1c2VkIGZvciBncmF5LXNjYWxlCisJCQlvdXRwdXQgKHRoZSB0d28tcGFzcyBtZXRob2QgaXMgbm8gaW1wcm92ZW1lbnQgdGhlbikuCisKKwktbWF4bWVtb3J5IE4JU2V0IGxpbWl0IGZvciBhbW91bnQgb2YgbWVtb3J5IHRvIHVzZSBpbiBwcm9jZXNzaW5nCisJCQlsYXJnZSBpbWFnZXMuICBWYWx1ZSBpcyBpbiB0aG91c2FuZHMgb2YgYnl0ZXMsIG9yCisJCQltaWxsaW9ucyBvZiBieXRlcyBpZiAiTSIgaXMgYXR0YWNoZWQgdG8gdGhlIG51bWJlci4KKwkJCUZvciBleGFtcGxlLCAtbWF4IDRtIHNlbGVjdHMgNDAwMDAwMCBieXRlcy4gIElmIG1vcmUKKwkJCXNwYWNlIGlzIG5lZWRlZCwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4KKworCS12ZXJib3NlCUVuYWJsZSBkZWJ1ZyBwcmludG91dC4gIE1vcmUgLXYncyBnaXZlIG1vcmUgcHJpbnRvdXQuCisJb3IgIC1kZWJ1ZwlBbHNvLCB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIHByaW50ZWQgYXQgc3RhcnR1cC4KKworCitISU5UUyBGT1IgQ0pQRUcKKworQ29sb3IgR0lGIGZpbGVzIGFyZSBub3QgdGhlIGlkZWFsIGlucHV0IGZvciBKUEVHOyBKUEVHIGlzIHJlYWxseSBpbnRlbmRlZCBmb3IKK2NvbXByZXNzaW5nIGZ1bGwtY29sb3IgKDI0LWJpdCkgaW1hZ2VzLiAgSW4gcGFydGljdWxhciwgZG9uJ3QgdHJ5IHRvIGNvbnZlcnQKK2NhcnRvb25zLCBsaW5lIGRyYXdpbmdzLCBhbmQgb3RoZXIgaW1hZ2VzIHRoYXQgaGF2ZSBvbmx5IGEgZmV3IGRpc3RpbmN0Citjb2xvcnMuICBHSUYgd29ya3MgZ3JlYXQgb24gdGhlc2UsIEpQRUcgZG9lcyBub3QuICBJZiB5b3Ugd2FudCB0byBjb252ZXJ0IGEKK0dJRiB0byBKUEVHLCB5b3Ugc2hvdWxkIGV4cGVyaW1lbnQgd2l0aCBjanBlZydzIC1xdWFsaXR5IGFuZCAtc21vb3RoIG9wdGlvbnMKK3RvIGdldCBhIHNhdGlzZmFjdG9yeSBjb252ZXJzaW9uLiAgLXNtb290aCAxMCBvciBzbyBpcyBvZnRlbiBoZWxwZnVsLgorCitBdm9pZCBydW5uaW5nIGFuIGltYWdlIHRocm91Z2ggYSBzZXJpZXMgb2YgSlBFRyBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uCitjeWNsZXMuICBJbWFnZSBxdWFsaXR5IGxvc3Mgd2lsbCBhY2N1bXVsYXRlOyBhZnRlciB0ZW4gb3Igc28gY3ljbGVzIHRoZSBpbWFnZQorbWF5IGJlIG5vdGljZWFibHkgd29yc2UgdGhhbiBpdCB3YXMgYWZ0ZXIgb25lIGN5Y2xlLiAgSXQncyBiZXN0IHRvIHVzZSBhCitsb3NzbGVzcyBmb3JtYXQgd2hpbGUgbWFuaXB1bGF0aW5nIGFuIGltYWdlLCB0aGVuIGNvbnZlcnQgdG8gSlBFRyBmb3JtYXQgd2hlbgoreW91IGFyZSByZWFkeSB0byBmaWxlIHRoZSBpbWFnZSBhd2F5LgorCitUaGUgLW9wdGltaXplIG9wdGlvbiB0byBjanBlZyBpcyB3b3J0aCB1c2luZyB3aGVuIHlvdSBhcmUgbWFraW5nIGEgImZpbmFsIgordmVyc2lvbiBmb3IgcG9zdGluZyBvciBhcmNoaXZpbmcuICBJdCdzIGFsc28gYSB3aW4gd2hlbiB5b3UgYXJlIHVzaW5nIGxvdworcXVhbGl0eSBzZXR0aW5ncyB0byBtYWtlIHZlcnkgc21hbGwgSlBFRyBmaWxlczsgdGhlIHBlcmNlbnRhZ2UgaW1wcm92ZW1lbnQKK2lzIG9mdGVuIGEgbG90IG1vcmUgdGhhbiBpdCBpcyBvbiBsYXJnZXIgZmlsZXMuICAoQXQgcHJlc2VudCwgLW9wdGltaXplCittb2RlIGlzIGFsd2F5cyBzZWxlY3RlZCB3aGVuIGdlbmVyYXRpbmcgcHJvZ3Jlc3NpdmUgSlBFRyBmaWxlcy4pCisKK0dJRiBpbnB1dCBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCwgdG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LgorVXNlIGEgVW5pc3lzLWxpY2Vuc2VkIHByb2dyYW0gaWYgeW91IG5lZWQgdG8gcmVhZCBhIEdJRiBmaWxlLiAgKENvbnZlcnNpb24KK29mIEdJRiBmaWxlcyB0byBKUEVHIGlzIHVzdWFsbHkgYSBiYWQgaWRlYSBhbnl3YXkuKQorCisKK0hJTlRTIEZPUiBESlBFRworCitUbyBnZXQgYSBxdWljayBwcmV2aWV3IG9mIGFuIGltYWdlLCB1c2UgdGhlIC1ncmF5c2NhbGUgYW5kL29yIC1zY2FsZSBzd2l0Y2hlcy4KKyItZ3JheXNjYWxlIC1zY2FsZSAxLzgiIGlzIHRoZSBmYXN0ZXN0IGNhc2UuCisKK1NldmVyYWwgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHRoYXQgdHJhZGUgb2ZmIGltYWdlIHF1YWxpdHkgdG8gZ2FpbiBzcGVlZC4KKyItZmFzdCIgdHVybnMgb24gdGhlIHJlY29tbWVuZGVkIHNldHRpbmdzLgorCisiLWRjdCBmYXN0IiBhbmQvb3IgIi1ub3Ntb290aCIgZ2FpbiBzcGVlZCBhdCBhIHNtYWxsIHNhY3JpZmljZSBpbiBxdWFsaXR5LgorV2hlbiBwcm9kdWNpbmcgYSBjb2xvci1xdWFudGl6ZWQgaW1hZ2UsICItb25lcGFzcyAtZGl0aGVyIG9yZGVyZWQiIGlzIGZhc3QgYnV0CittdWNoIGxvd2VyIHF1YWxpdHkgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvci4gICItZGl0aGVyIG5vbmUiIG1heSBnaXZlCithY2NlcHRhYmxlIHJlc3VsdHMgaW4gdHdvLXBhc3MgbW9kZSwgYnV0IGlzIHNlbGRvbSB0b2xlcmFibGUgaW4gb25lLXBhc3MgbW9kZS4KKworSWYgeW91IGFyZSBmb3J0dW5hdGUgZW5vdWdoIHRvIGhhdmUgdmVyeSBmYXN0IGZsb2F0aW5nIHBvaW50IGhhcmR3YXJlLAorIi1kY3QgZmxvYXQiIG1heSBiZSBldmVuIGZhc3RlciB0aGFuICItZGN0IGZhc3QiLiAgQnV0IG9uIG1vc3QgbWFjaGluZXMKKyItZGN0IGZsb2F0IiBpcyBzbG93ZXIgdGhhbiAiLWRjdCBpbnQiOyBpbiB0aGlzIGNhc2UgaXQgaXMgbm90IHdvcnRoIHVzaW5nLAorYmVjYXVzZSBpdHMgdGhlb3JldGljYWwgYWNjdXJhY3kgYWR2YW50YWdlIGlzIHRvbyBzbWFsbCB0byBiZSBzaWduaWZpY2FudAoraW4gcHJhY3RpY2UuCisKK1R3by1wYXNzIGNvbG9yIHF1YW50aXphdGlvbiByZXF1aXJlcyBhIGdvb2QgZGVhbCBvZiBtZW1vcnk7IG9uIE1TLURPUyBtYWNoaW5lcworaXQgbWF5IHJ1biBvdXQgb2YgbWVtb3J5IGV2ZW4gd2l0aCAtbWF4bWVtb3J5IDAuICBJbiB0aGF0IGNhc2UgeW91IGNhbiBzdGlsbAorZGVjb21wcmVzcywgd2l0aCBzb21lIGxvc3Mgb2YgaW1hZ2UgcXVhbGl0eSwgYnkgc3BlY2lmeWluZyAtb25lcGFzcyBmb3IKK29uZS1wYXNzIHF1YW50aXphdGlvbi4KKworVG8gYXZvaWQgdGhlIFVuaXN5cyBMWlcgcGF0ZW50LCBkanBlZyBwcm9kdWNlcyB1bmNvbXByZXNzZWQgR0lGIGZpbGVzLiAgVGhlc2UKK2FyZSBsYXJnZXIgdGhhbiB0aGV5IHNob3VsZCBiZSwgYnV0IGFyZSByZWFkYWJsZSBieSBzdGFuZGFyZCBHSUYgZGVjb2RlcnMuCisKKworSElOVFMgRk9SIEJPVEggUFJPR1JBTVMKKworSWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQgdGhhbiB3aWxsIGZpdCBpbiB0aGUgYXZhaWxhYmxlIG1haW4gbWVtb3J5IChhcworZGV0ZXJtaW5lZCBieSAtbWF4bWVtb3J5KSwgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgdXNlZC4gIChNUy1ET1MgdmVyc2lvbnMKK3dpbGwgdHJ5IHRvIGdldCBleHRlbmRlZCBvciBleHBhbmRlZCBtZW1vcnkgZmlyc3QuKSAgVGhlIHRlbXBvcmFyeSBmaWxlcyBhcmUKK29mdGVuIHJhdGhlciBsYXJnZTogaW4gdHlwaWNhbCBjYXNlcyB0aGV5IG9jY3VweSB0aHJlZSBieXRlcyBwZXIgcGl4ZWwsIGZvcgorZXhhbXBsZSAzKjgwMCo2MDAgPSAxLjQ0TWIgZm9yIGFuIDgwMHg2MDAgaW1hZ2UuICBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2gKK2ZyZWUgZGlzayBzcGFjZSwgbGVhdmUgb3V0IC1wcm9ncmVzc2l2ZSBhbmQgLW9wdGltaXplIChmb3IgY2pwZWcpIG9yIHNwZWNpZnkKKy1vbmVwYXNzIChmb3IgZGpwZWcpLgorCitPbiBNUy1ET1MsIHRoZSB0ZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgVE1QCitvciBURU1QIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbmVpdGhlciBvZiB0aG9zZQorZXhpc3QuICBBbWlnYSBpbXBsZW1lbnRhdGlvbnMgcHV0IHRoZSB0ZW1wIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgbmFtZWQgYnkKK0pQRUdUTVA6LCBzbyBiZSBzdXJlIHRvIGFzc2lnbiBKUEVHVE1QOiB0byBhIGRpc2sgcGFydGl0aW9uIHdpdGggYWRlcXVhdGUgZnJlZQorc3BhY2UuCisKK1RoZSBkZWZhdWx0IG1lbW9yeSB1c2FnZSBsaW1pdCAoLW1heG1lbW9yeSkgaXMgc2V0IHdoZW4gdGhlIHNvZnR3YXJlIGlzCitjb21waWxlZC4gIElmIHlvdSBnZXQgYW4gImluc3VmZmljaWVudCBtZW1vcnkiIGVycm9yLCB0cnkgc3BlY2lmeWluZyBhIHNtYWxsZXIKKy1tYXhtZW1vcnkgdmFsdWUsIGV2ZW4gLW1heG1lbW9yeSAwIHRvIHVzZSB0aGUgYWJzb2x1dGUgbWluaW11bSBzcGFjZS4gIFlvdQorbWF5IHdhbnQgdG8gcmVjb21waWxlIHdpdGggYSBzbWFsbGVyIGRlZmF1bHQgdmFsdWUgaWYgdGhpcyBoYXBwZW5zIG9mdGVuLgorCitPbiBtYWNoaW5lcyB0aGF0IGhhdmUgImVudmlyb25tZW50IiB2YXJpYWJsZXMsIHlvdSBjYW4gZGVmaW5lIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgSlBFR01FTSB0byBzZXQgdGhlIGRlZmF1bHQgbWVtb3J5IGxpbWl0LiAgVGhlIHZhbHVlIGlzIHNwZWNpZmllZCBhcworZGVzY3JpYmVkIGZvciB0aGUgLW1heG1lbW9yeSBzd2l0Y2guICBKUEVHTUVNIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCB2YWx1ZQorc3BlY2lmaWVkIHdoZW4gdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkLCBhbmQgaXRzZWxmIGlzIG92ZXJyaWRkZW4gYnkgYW4KK2V4cGxpY2l0IC1tYXhtZW1vcnkgc3dpdGNoLgorCitPbiBNUy1ET1MgbWFjaGluZXMsIC1tYXhtZW1vcnkgaXMgdGhlIGFtb3VudCBvZiBtYWluIChjb252ZW50aW9uYWwpIG1lbW9yeSB0bwordXNlLiAgKEV4dGVuZGVkIG9yIGV4cGFuZGVkIG1lbW9yeSBpcyBhbHNvIHVzZWQgaWYgYXZhaWxhYmxlLikgIE1vc3QKK0RPUy1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGlzIHNvZnR3YXJlIGRvIHRoZWlyIG93biBtZW1vcnkgc3BhY2UgZXN0aW1hdGlvbgorYW5kIGRvIG5vdCBuZWVkIHlvdSB0byBzcGVjaWZ5IC1tYXhtZW1vcnkuCisKKworSlBFR1RSQU4KKworanBlZ3RyYW4gcGVyZm9ybXMgdmFyaW91cyB1c2VmdWwgdHJhbnNmb3JtYXRpb25zIG9mIEpQRUcgZmlsZXMuCitJdCBjYW4gdHJhbnNsYXRlIHRoZSBjb2RlZCByZXByZXNlbnRhdGlvbiBmcm9tIG9uZSB2YXJpYW50IG9mIEpQRUcgdG8gYW5vdGhlciwKK2ZvciBleGFtcGxlIGZyb20gYmFzZWxpbmUgSlBFRyB0byBwcm9ncmVzc2l2ZSBKUEVHIG9yIHZpY2UgdmVyc2EuICBJdCBjYW4gYWxzbworcGVyZm9ybSBzb21lIHJlYXJyYW5nZW1lbnRzIG9mIHRoZSBpbWFnZSBkYXRhLCBmb3IgZXhhbXBsZSB0dXJuaW5nIGFuIGltYWdlCitmcm9tIGxhbmRzY2FwZSB0byBwb3J0cmFpdCBmb3JtYXQgYnkgcm90YXRpb24uCisKK2pwZWd0cmFuIHdvcmtzIGJ5IHJlYXJyYW5naW5nIHRoZSBjb21wcmVzc2VkIGRhdGEgKERDVCBjb2VmZmljaWVudHMpLCB3aXRob3V0CitldmVyIGZ1bGx5IGRlY29kaW5nIHRoZSBpbWFnZS4gIFRoZXJlZm9yZSwgaXRzIHRyYW5zZm9ybWF0aW9ucyBhcmUgbG9zc2xlc3M6Cit0aGVyZSBpcyBubyBpbWFnZSBkZWdyYWRhdGlvbiBhdCBhbGwsIHdoaWNoIHdvdWxkIG5vdCBiZSB0cnVlIGlmIHlvdSB1c2VkCitkanBlZyBmb2xsb3dlZCBieSBjanBlZyB0byBhY2NvbXBsaXNoIHRoZSBzYW1lIGNvbnZlcnNpb24uICBCdXQgYnkgdGhlIHNhbWUKK3Rva2VuLCBqcGVndHJhbiBjYW5ub3QgcGVyZm9ybSBsb3NzeSBvcGVyYXRpb25zIHN1Y2ggYXMgY2hhbmdpbmcgdGhlIGltYWdlCitxdWFsaXR5LgorCitqcGVndHJhbiB1c2VzIGEgY29tbWFuZCBsaW5lIHN5bnRheCBzaW1pbGFyIHRvIGNqcGVnIG9yIGRqcGVnLgorT24gVW5peC1saWtlIHN5c3RlbXMsIHlvdSBzYXk6CisJanBlZ3RyYW4gW3N3aXRjaGVzXSBbaW5wdXRmaWxlXSA+b3V0cHV0ZmlsZQorT24gbW9zdCBub24tVW5peCBzeXN0ZW1zLCB5b3Ugc2F5OgorCWpwZWd0cmFuIFtzd2l0Y2hlc10gaW5wdXRmaWxlIG91dHB1dGZpbGUKK3doZXJlIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgYXJlIEpQRUcgZmlsZXMuCisKK1RvIHNwZWNpZnkgdGhlIGNvZGVkIEpQRUcgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGUgb3V0cHV0IGZpbGUsCitqcGVndHJhbiBhY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGNqcGVnOgorCS1vcHRpbWl6ZQlQZXJmb3JtIG9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGVuY29kaW5nIHBhcmFtZXRlcnMuCisJLXByb2dyZXNzaXZlCUNyZWF0ZSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUuCisJLXJlc3RhcnQgTglFbWl0IGEgSlBFRyByZXN0YXJ0IG1hcmtlciBldmVyeSBOIE1DVSByb3dzLCBvciBldmVyeQorCQkJTiBNQ1UgYmxvY2tzIGlmICJCIiBpcyBhdHRhY2hlZCB0byB0aGUgbnVtYmVyLgorCS1zY2FucyBmaWxlCVVzZSB0aGUgc2NhbiBzY3JpcHQgZ2l2ZW4gaW4gdGhlIHNwZWNpZmllZCB0ZXh0IGZpbGUuCitTZWUgdGhlIHByZXZpb3VzIGRpc2N1c3Npb24gb2YgY2pwZWcgZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGVzZSBzd2l0Y2hlcy4KK0lmIHlvdSBzcGVjaWZ5IG5vbmUgb2YgdGhlc2Ugc3dpdGNoZXMsIHlvdSBnZXQgYSBwbGFpbiBiYXNlbGluZS1KUEVHIG91dHB1dAorZmlsZS4gIFRoZSBxdWFsaXR5IHNldHRpbmcgYW5kIHNvIGZvcnRoIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnB1dCBmaWxlLgorCitUaGUgaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgdHJhbnNmb3JtZWQgYnkgZ2l2aW5nIG9uZSBvZiB0aGVzZSBzd2l0Y2hlczoKKwktZmxpcCBob3Jpem9udGFsCU1pcnJvciBpbWFnZSBob3Jpem9udGFsbHkgKGxlZnQtcmlnaHQpLgorCS1mbGlwIHZlcnRpY2FsCQlNaXJyb3IgaW1hZ2UgdmVydGljYWxseSAodG9wLWJvdHRvbSkuCisJLXJvdGF0ZSA5MAkJUm90YXRlIGltYWdlIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgorCS1yb3RhdGUgMTgwCQlSb3RhdGUgaW1hZ2UgMTgwIGRlZ3JlZXMuCisJLXJvdGF0ZSAyNzAJCVJvdGF0ZSBpbWFnZSAyNzAgZGVncmVlcyBjbG9ja3dpc2UgKG9yIDkwIGNjdykuCisJLXRyYW5zcG9zZQkJVHJhbnNwb3NlIGltYWdlIChhY3Jvc3MgVUwtdG8tTFIgYXhpcykuCisJLXRyYW5zdmVyc2UJCVRyYW5zdmVyc2UgdHJhbnNwb3NlIChhY3Jvc3MgVVItdG8tTEwgYXhpcykuCisKK1RoZSB0cmFuc3Bvc2UgdHJhbnNmb3JtYXRpb24gaGFzIG5vIHJlc3RyaWN0aW9ucyByZWdhcmRpbmcgaW1hZ2UgZGltZW5zaW9ucy4KK1RoZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgb3BlcmF0ZSByYXRoZXIgb2RkbHkgaWYgdGhlIGltYWdlIGRpbWVuc2lvbnMgYXJlIG5vdAorYSBtdWx0aXBsZSBvZiB0aGUgaU1DVSBzaXplICh1c3VhbGx5IDggb3IgMTYgcGl4ZWxzKSwgYmVjYXVzZSB0aGV5IGNhbiBvbmx5Cit0cmFuc2Zvcm0gY29tcGxldGUgYmxvY2tzIG9mIERDVCBjb2VmZmljaWVudCBkYXRhIGluIHRoZSBkZXNpcmVkIHdheS4KKworanBlZ3RyYW4ncyBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gdHJhbnNmb3JtaW5nIGFuIG9kZC1zaXplIGltYWdlIGlzIGRlc2lnbmVkCit0byBwcmVzZXJ2ZSBleGFjdCByZXZlcnNpYmlsaXR5IGFuZCBtYXRoZW1hdGljYWwgY29uc2lzdGVuY3kgb2YgdGhlCit0cmFuc2Zvcm1hdGlvbiBzZXQuICBBcyBzdGF0ZWQsIHRyYW5zcG9zZSBpcyBhYmxlIHRvIGZsaXAgdGhlIGVudGlyZSBpbWFnZQorYXJlYS4gIEhvcml6b250YWwgbWlycm9yaW5nIGxlYXZlcyBhbnkgcGFydGlhbCBpTUNVIGNvbHVtbiBhdCB0aGUgcmlnaHQgZWRnZQordW50b3VjaGVkLCBidXQgaXMgYWJsZSB0byBmbGlwIGFsbCByb3dzIG9mIHRoZSBpbWFnZS4gIFNpbWlsYXJseSwgdmVydGljYWwKK21pcnJvcmluZyBsZWF2ZXMgYW55IHBhcnRpYWwgaU1DVSByb3cgYXQgdGhlIGJvdHRvbSBlZGdlIHVudG91Y2hlZCwgYnV0IGlzCithYmxlIHRvIGZsaXAgYWxsIGNvbHVtbnMuICBUaGUgb3RoZXIgdHJhbnNmb3JtcyBjYW4gYmUgYnVpbHQgdXAgYXMgc2VxdWVuY2VzCitvZiB0cmFuc3Bvc2UgYW5kIGZsaXAgb3BlcmF0aW9uczsgZm9yIGNvbnNpc3RlbmN5LCB0aGVpciBhY3Rpb25zIG9uIGVkZ2UKK3BpeGVscyBhcmUgZGVmaW5lZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgZW5kIHJlc3VsdCBvZiB0aGUgY29ycmVzcG9uZGluZwordHJhbnNwb3NlLWFuZC1mbGlwIHNlcXVlbmNlLgorCitGb3IgcHJhY3RpY2FsIHVzZSwgeW91IG1heSBwcmVmZXIgdG8gZGlzY2FyZCBhbnkgdW50cmFuc2Zvcm1hYmxlIGVkZ2UgcGl4ZWxzCityYXRoZXIgdGhhbiBoYXZpbmcgYSBzdHJhbmdlLWxvb2tpbmcgc3RyaXAgYWxvbmcgdGhlIHJpZ2h0IGFuZC9vciBib3R0b20gZWRnZXMKK29mIGEgdHJhbnNmb3JtZWQgaW1hZ2UuICBUbyBkbyB0aGlzLCBhZGQgdGhlIC10cmltIHN3aXRjaDoKKwktdHJpbQkJRHJvcCBub24tdHJhbnNmb3JtYWJsZSBlZGdlIGJsb2Nrcy4KK09idmlvdXNseSwgYSB0cmFuc2Zvcm1hdGlvbiB3aXRoIC10cmltIGlzIG5vdCByZXZlcnNpYmxlLCBzbyBzdHJpY3RseSBzcGVha2luZworanBlZ3RyYW4gd2l0aCB0aGlzIHN3aXRjaCBpcyBub3QgbG9zc2xlc3MuICBBbHNvLCB0aGUgZXhwZWN0ZWQgbWF0aGVtYXRpY2FsCitlcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtYXRpb25zIG5vIGxvbmdlciBob2xkLiAgRm9yIGV4YW1wbGUsCisiLXJvdCAyNzAgLXRyaW0iIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgIi1yb3QgOTAgLXRyaW0iIGZvbGxvd2VkIGJ5CisiLXJvdCAxODAgLXRyaW0iIHRyaW1zIGJvdGggZWRnZXMuCisKK0Fub3RoZXIgbm90LXN0cmljdGx5LWxvc3NsZXNzIHRyYW5zZm9ybWF0aW9uIHN3aXRjaCBpczoKKwktZ3JheXNjYWxlCUZvcmNlIGdyYXlzY2FsZSBvdXRwdXQuCitUaGlzIG9wdGlvbiBkaXNjYXJkcyB0aGUgY2hyb21pbmFuY2UgY2hhbm5lbHMgaWYgdGhlIGlucHV0IGltYWdlIGlzIFlDYkNyCisoaWUsIGEgc3RhbmRhcmQgY29sb3IgSlBFRyksIHJlc3VsdGluZyBpbiBhIGdyYXlzY2FsZSBKUEVHIGZpbGUuICBUaGUKK2x1bWluYW5jZSBjaGFubmVsIGlzIHByZXNlcnZlZCBleGFjdGx5LCBzbyB0aGlzIGlzIGEgYmV0dGVyIG1ldGhvZCBvZiByZWR1Y2luZwordG8gZ3JheXNjYWxlIHRoYW4gZGVjb21wcmVzc2lvbiwgY29udmVyc2lvbiwgYW5kIHJlY29tcHJlc3Npb24uICBUaGlzIHN3aXRjaAoraXMgcGFydGljdWxhcmx5IGhhbmR5IGZvciBmaXhpbmcgYSBtb25vY2hyb21lIHBpY3R1cmUgdGhhdCB3YXMgbWlzdGFrZW5seQorZW5jb2RlZCBhcyBhIGNvbG9yIEpQRUcuICAoSW4gc3VjaCBhIGNhc2UsIHRoZSBzcGFjZSBzYXZpbmdzIGZyb20gZ2V0dGluZyByaWQKK29mIHRoZSBuZWFyLWVtcHR5IGNocm9tYSBjaGFubmVscyB3b24ndCBiZSBsYXJnZTsgYnV0IHRoZSBkZWNvZGluZyB0aW1lIGZvcgorYSBncmF5c2NhbGUgSlBFRyBpcyBzdWJzdGFudGlhbGx5IGxlc3MgdGhhbiB0aGF0IGZvciBhIGNvbG9yIEpQRUcuKQorCitqcGVndHJhbiBhbHNvIHJlY29nbml6ZXMgdGhlc2Ugc3dpdGNoZXMgdGhhdCBjb250cm9sIHdoYXQgdG8gZG8gd2l0aCAiZXh0cmEiCittYXJrZXJzLCBzdWNoIGFzIGNvbW1lbnQgYmxvY2tzOgorCS1jb3B5IG5vbmUJQ29weSBubyBleHRyYSBtYXJrZXJzIGZyb20gc291cmNlIGZpbGUuICBUaGlzIHNldHRpbmcKKwkJCXN1cHByZXNzZXMgYWxsIGNvbW1lbnRzIGFuZCBvdGhlciBleGNlc3MgYmFnZ2FnZQorCQkJcHJlc2VudCBpbiB0aGUgc291cmNlIGZpbGUuCisJLWNvcHkgY29tbWVudHMJQ29weSBvbmx5IGNvbW1lbnQgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBjb3BpZXMKKwkJCWNvbW1lbnRzIGZyb20gdGhlIHNvdXJjZSBmaWxlLCBidXQgZGlzY2FyZHMKKwkJCWFueSBvdGhlciBpbmVzc2VudGlhbCBkYXRhLiAKKwktY29weSBhbGwJQ29weSBhbGwgZXh0cmEgbWFya2Vycy4gIFRoaXMgc2V0dGluZyBwcmVzZXJ2ZXMKKwkJCW1pc2NlbGxhbmVvdXMgbWFya2VycyBmb3VuZCBpbiB0aGUgc291cmNlIGZpbGUsIHN1Y2gKKwkJCWFzIEpGSUYgdGh1bWJuYWlscyBhbmQgUGhvdG9zaG9wIHNldHRpbmdzLiAgSW4gc29tZQorCQkJZmlsZXMgdGhlc2UgZXh0cmEgbWFya2VycyBjYW4gYmUgc2l6YWJsZS4KK1RoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIC1jb3B5IGNvbW1lbnRzLiAgKE5vdGU6IGluIElKRyByZWxlYXNlcyB2NiBhbmQgdjZhLAoranBlZ3RyYW4gYWx3YXlzIGRpZCB0aGUgZXF1aXZhbGVudCBvZiAtY29weSBub25lLikKKworQWRkaXRpb25hbCBzd2l0Y2hlcyByZWNvZ25pemVkIGJ5IGpwZWd0cmFuIGFyZToKKwktb3V0ZmlsZSBmaWxlbmFtZQorCS1tYXhtZW1vcnkgTgorCS12ZXJib3NlCisJLWRlYnVnCitUaGVzZSB3b3JrIHRoZSBzYW1lIGFzIGluIGNqcGVnIG9yIGRqcGVnLgorCisKK1RIRSBDT01NRU5UIFVUSUxJVElFUworCitUaGUgSlBFRyBzdGFuZGFyZCBhbGxvd3MgImNvbW1lbnQiIChDT00pIGJsb2NrcyB0byBvY2N1ciB3aXRoaW4gYSBKUEVHIGZpbGUuCitBbHRob3VnaCB0aGUgc3RhbmRhcmQgZG9lc24ndCBhY3R1YWxseSBkZWZpbmUgd2hhdCBDT00gYmxvY2tzIGFyZSBmb3IsIHRoZXkKK2FyZSB3aWRlbHkgdXNlZCB0byBob2xkIHVzZXItc3VwcGxpZWQgdGV4dCBzdHJpbmdzLiAgVGhpcyBsZXRzIHlvdSBhZGQKK2Fubm90YXRpb25zLCB0aXRsZXMsIGluZGV4IHRlcm1zLCBldGMgdG8geW91ciBKUEVHIGZpbGVzLCBhbmQgbGF0ZXIgcmV0cmlldmUKK3RoZW0gYXMgdGV4dC4gIENPTSBibG9ja3MgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBpbWFnZSBzdG9yZWQgaW4gdGhlIEpQRUcKK2ZpbGUuICBUaGUgbWF4aW11bSBzaXplIG9mIGEgQ09NIGJsb2NrIGlzIDY0SywgYnV0IHlvdSBjYW4gaGF2ZSBhcyBtYW55IG9mCit0aGVtIGFzIHlvdSBsaWtlIGluIG9uZSBKUEVHIGZpbGUuCisKK1dlIHByb3ZpZGUgdHdvIHV0aWxpdHkgcHJvZ3JhbXMgdG8gZGlzcGxheSBDT00gYmxvY2sgY29udGVudHMgYW5kIGFkZCBDT00KK2Jsb2NrcyB0byBhIEpQRUcgZmlsZS4KKworcmRqcGdjb20gc2VhcmNoZXMgYSBKUEVHIGZpbGUgYW5kIHByaW50cyB0aGUgY29udGVudHMgb2YgYW55IENPTSBibG9ja3Mgb24KK3N0YW5kYXJkIG91dHB1dC4gIFRoZSBjb21tYW5kIGxpbmUgc3ludGF4IGlzCisJcmRqcGdjb20gWy12ZXJib3NlXSBbaW5wdXRmaWxlbmFtZV0KK1RoZSBzd2l0Y2ggIi12ZXJib3NlIiAob3IganVzdCAiLXYiKSBjYXVzZXMgcmRqcGdjb20gdG8gYWxzbyBkaXNwbGF5IHRoZSBKUEVHCitpbWFnZSBkaW1lbnNpb25zLiAgSWYgeW91IG9taXQgdGhlIGlucHV0IGZpbGUgbmFtZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUsCit0aGUgSlBFRyBmaWxlIGlzIHJlYWQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIG1heSBub3Qgd29yayBvbiBzb21lCitvcGVyYXRpbmcgc3lzdGVtcywgaWYgYmluYXJ5IGRhdGEgY2FuJ3QgYmUgcmVhZCBmcm9tIHN0ZGluLikKKword3JqcGdjb20gYWRkcyBhIENPTSBibG9jaywgY29udGFpbmluZyB0ZXh0IHlvdSBwcm92aWRlLCB0byBhIEpQRUcgZmlsZS4KK09yZGluYXJpbHksIHRoZSBDT00gYmxvY2sgaXMgYWRkZWQgYWZ0ZXIgYW55IGV4aXN0aW5nIENPTSBibG9ja3MsIGJ1dCB5b3UKK2NhbiBkZWxldGUgdGhlIG9sZCBDT00gYmxvY2tzIGlmIHlvdSB3aXNoLiAgd3JqcGdjb20gcHJvZHVjZXMgYSBuZXcgSlBFRworZmlsZTsgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBpbnB1dCBmaWxlLiAgRE8gTk9UIHRyeSB0byBvdmVyd3JpdGUgdGhlIGlucHV0CitmaWxlIGJ5IGRpcmVjdGluZyB3cmpwZ2NvbSdzIG91dHB1dCBiYWNrIGludG8gaXQ7IG9uIG1vc3Qgc3lzdGVtcyB0aGlzIHdpbGwKK2p1c3QgZGVzdHJveSB5b3VyIGZpbGUuCisKK1RoZSBjb21tYW5kIGxpbmUgc3ludGF4IGZvciB3cmpwZ2NvbSBpcyBzaW1pbGFyIHRvIGNqcGVnJ3MuICBPbiBVbml4LWxpa2UKK3N5c3RlbXMsIGl0IGlzCisJd3JqcGdjb20gW3N3aXRjaGVzXSBbaW5wdXRmaWxlbmFtZV0KK1RoZSBvdXRwdXQgZmlsZSBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dC4gIFRoZSBpbnB1dCBmaWxlIGNvbWVzIGZyb20KK3RoZSBuYW1lZCBmaWxlLCBvciBmcm9tIHN0YW5kYXJkIGlucHV0IGlmIG5vIGlucHV0IGZpbGUgaXMgbmFtZWQuCisKK09uIG1vc3Qgbm9uLVVuaXggc3lzdGVtcywgdGhlIHN5bnRheCBpcworCXdyanBnY29tIFtzd2l0Y2hlc10gaW5wdXRmaWxlbmFtZSBvdXRwdXRmaWxlbmFtZQord2hlcmUgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbmFtZXMgbXVzdCBiZSBnaXZlbiBleHBsaWNpdGx5LgorCit3cmpwZ2NvbSB1bmRlcnN0YW5kcyB0aHJlZSBzd2l0Y2hlczoKKwktcmVwbGFjZQkJIERlbGV0ZSBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcyBmcm9tIHRoZSBmaWxlLgorCS1jb21tZW50ICJDb21tZW50IHRleHQiCSBTdXBwbHkgbmV3IENPTSB0ZXh0IG9uIGNvbW1hbmQgbGluZS4KKwktY2ZpbGUgbmFtZQkJIFJlYWQgdGV4dCBmb3IgbmV3IENPTSBibG9jayBmcm9tIG5hbWVkIGZpbGUuCisoU3dpdGNoIG5hbWVzIGNhbiBiZSBhYmJyZXZpYXRlZC4pICBJZiB5b3UgaGF2ZSBvbmx5IG9uZSBsaW5lIG9mIGNvbW1lbnQgdGV4dAordG8gYWRkLCB5b3UgY2FuIHByb3ZpZGUgaXQgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoIC1jb21tZW50LiAgVGhlIGNvbW1lbnQKK3RleHQgbXVzdCBiZSBzdXJyb3VuZGVkIHdpdGggcXVvdGVzIHNvIHRoYXQgaXQgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZQorYXJndW1lbnQuICBMb25nZXIgY29tbWVudHMgY2FuIGJlIHJlYWQgZnJvbSBhIHRleHQgZmlsZS4KKworSWYgeW91IGdpdmUgbmVpdGhlciAtY29tbWVudCBub3IgLWNmaWxlLCB0aGVuIHdyanBnY29tIHdpbGwgcmVhZCB0aGUgY29tbWVudAordGV4dCBmcm9tIHN0YW5kYXJkIGlucHV0LiAgKEluIHRoaXMgY2FzZSBhbiBpbnB1dCBpbWFnZSBmaWxlIG5hbWUgTVVTVCBiZQorc3VwcGxpZWQsIHNvIHRoYXQgdGhlIHNvdXJjZSBKUEVHIGZpbGUgY29tZXMgZnJvbSBzb21ld2hlcmUgZWxzZS4pICBZb3UgY2FuCitlbnRlciBtdWx0aXBsZSBsaW5lcywgdXAgdG8gNjRLQiB3b3J0aC4gIFR5cGUgYW4gZW5kLW9mLWZpbGUgaW5kaWNhdG9yCisodXN1YWxseSBjb250cm9sLUQgb3IgY29udHJvbC1aKSB0byB0ZXJtaW5hdGUgdGhlIGNvbW1lbnQgdGV4dCBlbnRyeS4KKword3JqcGdjb20gd2lsbCBub3QgYWRkIGEgQ09NIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjb21tZW50IHN0cmluZyBpcyBlbXB0eS4KK1RoZXJlZm9yZSAtcmVwbGFjZSAtY29tbWVudCAiIiBjYW4gYmUgdXNlZCB0byBkZWxldGUgYWxsIENPTSBibG9ja3MgZnJvbSBhCitmaWxlLgorCitUaGVzZSB1dGlsaXR5IHByb2dyYW1zIGRvIG5vdCBkZXBlbmQgb24gdGhlIElKRyBKUEVHIGxpYnJhcnkuICBJbgorcGFydGljdWxhciwgdGhlIHNvdXJjZSBjb2RlIGZvciByZGpwZ2NvbSBpcyBpbnRlbmRlZCBhcyBhbiBpbGx1c3RyYXRpb24gb2YKK3RoZSBtaW5pbXVtIGFtb3VudCBvZiBjb2RlIHJlcXVpcmVkIHRvIHBhcnNlIGEgSlBFRyBmaWxlIGhlYWRlciBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd2l6YXJkLmRvYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93aXphcmQuZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTcwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd2l6YXJkLmRvYwpAQCAtMCwwICsxLDIxMSBAQAorQWR2YW5jZWQgdXNhZ2UgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIEpQRUcgc29mdHdhcmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZmlsZSBkZXNjcmliZXMgY2pwZWcncyAic3dpdGNoZXMgZm9yIHdpemFyZHMiLgorCitUaGUgIndpemFyZCIgc3dpdGNoZXMgYXJlIGludGVuZGVkIGZvciBleHBlcmltZW50YXRpb24gd2l0aCBKUEVHIGJ5IHBlcnNvbnMKK3dobyBhcmUgcmVhc29uYWJseSBrbm93bGVkZ2VhYmxlIGFib3V0IHRoZSBKUEVHIHN0YW5kYXJkLiAgSWYgeW91IGRvbid0IGtub3cKK3doYXQgeW91IGFyZSBkb2luZywgRE9OJ1QgVVNFIFRIRVNFIFNXSVRDSEVTLiAgWW91J2xsIGxpa2VseSBwcm9kdWNlIGZpbGVzCit3aXRoIHdvcnNlIGltYWdlIHF1YWxpdHkgYW5kL29yIHBvb3JlciBjb21wcmVzc2lvbiB0aGFuIHlvdSdkIGdldCBmcm9tIHRoZQorZGVmYXVsdCBzZXR0aW5ncy4gIEZ1cnRoZXJtb3JlLCB0aGVzZSBzd2l0Y2hlcyBtdXN0IGJlIHVzZWQgd2l0aCBjYXV0aW9uCit3aGVuIG1ha2luZyBmaWxlcyBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UsIGJlY2F1c2Ugbm90IGFsbCBKUEVHIGRlY29kZXJzCit3aWxsIHN1cHBvcnQgdW51c3VhbCBKUEVHIHBhcmFtZXRlciBzZXR0aW5ncy4KKworCitRdWFudGl6YXRpb24gVGFibGUgQWRqdXN0bWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3JkaW5hcmlseSwgY2pwZWcgc3RhcnRzIHdpdGggYSBkZWZhdWx0IHNldCBvZiB0YWJsZXMgKHRoZSBzYW1lIG9uZXMgZ2l2ZW4KK2FzIGV4YW1wbGVzIGluIHRoZSBKUEVHIHN0YW5kYXJkKSBhbmQgc2NhbGVzIHRoZW0gdXAgb3IgZG93biBhY2NvcmRpbmcgdG8KK3RoZSAtcXVhbGl0eSBzZXR0aW5nLiAgVGhlIGRldGFpbHMgb2YgdGhlIHNjYWxpbmcgYWxnb3JpdGhtIGNhbiBiZSBmb3VuZCBpbgoramNwYXJhbS5jLiAgQXQgdmVyeSBsb3cgcXVhbGl0eSBzZXR0aW5ncywgc29tZSBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcworY2FuIGdldCBzY2FsZWQgdXAgdG8gdmFsdWVzIGV4Y2VlZGluZyAyNTUuICBBbHRob3VnaCAyLWJ5dGUgcXVhbnRpemF0aW9uCit2YWx1ZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgSUpHIHNvZnR3YXJlLCB0aGlzIGZlYXR1cmUgaXMgbm90IGluIGJhc2VsaW5lCitKUEVHIGFuZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuICBJZiB5b3UgbmVlZCB0byBlbnN1cmUKK3dpZGUgY29tcGF0aWJpbGl0eSBvZiBsb3ctcXVhbGl0eSBmaWxlcywgeW91IGNhbiBjb25zdHJhaW4gdGhlIHNjYWxlZAorcXVhbnRpemF0aW9uIHZhbHVlcyB0byBubyBtb3JlIHRoYW4gMjU1IGJ5IGdpdmluZyB0aGUgLWJhc2VsaW5lIHN3aXRjaC4KK05vdGUgdGhhdCB1c2Ugb2YgLWJhc2VsaW5lIHdpbGwgcmVzdWx0IGluIHBvb3JlciBxdWFsaXR5IGZvciB0aGUgc2FtZSBmaWxlCitzaXplLCBzaW5jZSBtb3JlIGJpdHMgdGhhbiBuZWNlc3NhcnkgYXJlIGV4cGVuZGVkIG9uIGhpZ2hlciBBQyBjb2VmZmljaWVudHMuCisKK1lvdSBjYW4gc3Vic3RpdHV0ZSBhIGRpZmZlcmVudCBzZXQgb2YgcXVhbnRpemF0aW9uIHZhbHVlcyBieSB1c2luZyB0aGUKKy1xdGFibGVzIHN3aXRjaDoKKworCS1xdGFibGVzIGZpbGUJVXNlIHRoZSBxdWFudGl6YXRpb24gdGFibGVzIGdpdmVuIGluIHRoZSBuYW1lZCBmaWxlLgorCitUaGUgc3BlY2lmaWVkIGZpbGUgc2hvdWxkIGJlIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgZGVjaW1hbCBxdWFudGl6YXRpb24KK3ZhbHVlcy4gIFRoZSBmaWxlIHNob3VsZCBjb250YWluIG9uZSB0byBmb3VyIHRhYmxlcywgZWFjaCBvZiA2NCBlbGVtZW50cy4KK1RoZSB0YWJsZXMgYXJlIGltcGxpY2l0bHkgbnVtYmVyZWQgMCwxLGV0Yy4gaW4gb3JkZXIgb2YgYXBwZWFyYW5jZS4gIFRhYmxlCitlbnRyaWVzIGFwcGVhciBpbiBub3JtYWwgYXJyYXkgb3JkZXIgKE5PVCBpbiB0aGUgemlnemFnIG9yZGVyIGluIHdoaWNoIHRoZXkKK3dpbGwgYmUgc3RvcmVkIGluIHRoZSBKUEVHIGZpbGUpLgorCitRdWFudGl6YXRpb24gdGFibGUgZmlsZXMgYXJlIGZyZWUgZm9ybWF0LCBpbiB0aGF0IGFyYml0cmFyeSB3aGl0ZXNwYWNlIGNhbgorYXBwZWFyIGJldHdlZW4gbnVtYmVycy4gIEFsc28sIGNvbW1lbnRzIGNhbiBiZSBpbmNsdWRlZDogYSBjb21tZW50IHN0YXJ0cword2l0aCAnIycgYW5kIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gIEhlcmUgaXMgYW4gZXhhbXBsZSBmaWxlIHRoYXQKK2R1cGxpY2F0ZXMgdGhlIGRlZmF1bHQgcXVhbnRpemF0aW9uIHRhYmxlczoKKworCSMgUXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBKUEVHIHNwZWMsIHNlY3Rpb24gSy4xCisKKwkjIFRoaXMgaXMgdGFibGUgMCAodGhlIGx1bWluYW5jZSB0YWJsZSk6CisJICAxNiAgMTEgIDEwICAxNiAgMjQgIDQwICA1MSAgNjEKKwkgIDEyICAxMiAgMTQgIDE5ICAyNiAgNTggIDYwICA1NQorCSAgMTQgIDEzICAxNiAgMjQgIDQwICA1NyAgNjkgIDU2CisJICAxNCAgMTcgIDIyICAyOSAgNTEgIDg3ICA4MCAgNjIKKwkgIDE4ICAyMiAgMzcgIDU2ICA2OCAxMDkgMTAzICA3NworCSAgMjQgIDM1ICA1NSAgNjQgIDgxIDEwNCAxMTMgIDkyCisJICA0OSAgNjQgIDc4ICA4NyAxMDMgMTIxIDEyMCAxMDEKKwkgIDcyICA5MiAgOTUgIDk4IDExMiAxMDAgMTAzICA5OQorCisJIyBUaGlzIGlzIHRhYmxlIDEgKHRoZSBjaHJvbWluYW5jZSB0YWJsZSk6CisJICAxNyAgMTggIDI0ICA0NyAgOTkgIDk5ICA5OSAgOTkKKwkgIDE4ICAyMSAgMjYgIDY2ICA5OSAgOTkgIDk5ICA5OQorCSAgMjQgIDI2ICA1NiAgOTkgIDk5ICA5OSAgOTkgIDk5CisJICA0NyAgNjYgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKKwkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQorCSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5CisJICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkKKwkgIDk5ICA5OSAgOTkgIDk5ICA5OSAgOTkgIDk5ICA5OQorCitJZiB0aGUgLXF0YWJsZXMgc3dpdGNoIGlzIHVzZWQgd2l0aG91dCAtcXVhbGl0eSwgdGhlbiB0aGUgc3BlY2lmaWVkIHRhYmxlcworYXJlIHVzZWQgZXhhY3RseSBhcy1pcy4gIElmIGJvdGggLXF0YWJsZXMgYW5kIC1xdWFsaXR5IGFyZSB1c2VkLCB0aGVuIHRoZQordGFibGVzIHRha2VuIGZyb20gdGhlIGZpbGUgYXJlIHNjYWxlZCBpbiB0aGUgc2FtZSBmYXNoaW9uIHRoYXQgdGhlIGRlZmF1bHQKK3RhYmxlcyB3b3VsZCBiZSBzY2FsZWQgZm9yIHRoYXQgcXVhbGl0eSBzZXR0aW5nLiAgSWYgLWJhc2VsaW5lIGFwcGVhcnMsIHRoZW4KK3RoZSBxdWFudGl6YXRpb24gdmFsdWVzIGFyZSBjb25zdHJhaW5lZCB0byB0aGUgcmFuZ2UgMS0yNTUuCisKK0J5IGRlZmF1bHQsIGNqcGVnIHdpbGwgdXNlIHF1YW50aXphdGlvbiB0YWJsZSAwIGZvciBsdW1pbmFuY2UgY29tcG9uZW50cyBhbmQKK3RhYmxlIDEgZm9yIGNocm9taW5hbmNlIGNvbXBvbmVudHMuICBUbyBvdmVycmlkZSB0aGlzIGNob2ljZSwgdXNlIHRoZSAtcXNsb3RzCitzd2l0Y2g6CisKKwktcXNsb3RzIE5bLC4uLl0JCVNlbGVjdCB3aGljaCBxdWFudGl6YXRpb24gdGFibGUgdG8gdXNlIGZvcgorCQkJCWVhY2ggY29sb3IgY29tcG9uZW50LgorCitUaGUgLXFzbG90cyBzd2l0Y2ggc3BlY2lmaWVzIGEgcXVhbnRpemF0aW9uIHRhYmxlIG51bWJlciBmb3IgZWFjaCBjb2xvcgorY29tcG9uZW50LCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNvbXBvbmVudHMgYXBwZWFyIGluIHRoZSBKUEVHIFNPRiBtYXJrZXIuCitGb3IgZXhhbXBsZSwgdG8gY3JlYXRlIGEgc2VwYXJhdGUgdGFibGUgZm9yIGVhY2ggb2YgWSxDYixDciwgeW91IGNvdWxkCitwcm92aWRlIGEgLXF0YWJsZXMgZmlsZSB0aGF0IGRlZmluZXMgdGhyZWUgcXVhbnRpemF0aW9uIHRhYmxlcyBhbmQgc2F5CisiLXFzbG90cyAwLDEsMiIuICBJZiAtcXNsb3RzIGdpdmVzIGZld2VyIHRhYmxlIG51bWJlcnMgdGhhbiB0aGVyZSBhcmUgY29sb3IKK2NvbXBvbmVudHMsIHRoZW4gdGhlIGxhc3QgdGFibGUgbnVtYmVyIGlzIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KKworCitTYW1wbGluZyBGYWN0b3IgQWRqdXN0bWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZGVmYXVsdCwgY2pwZWcgdXNlcyAyOjEgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZG93bnNhbXBsaW5nIHdoZW4KK2NvbXByZXNzaW5nIFlDYkNyIGRhdGEsIGFuZCBubyBkb3duc2FtcGxpbmcgZm9yIGFsbCBvdGhlciBjb2xvciBzcGFjZXMuCitZb3UgY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCB3aXRoIHRoZSAtc2FtcGxlIHN3aXRjaDoKKworCS1zYW1wbGUgSHhWWywuLi5dCVNldCBKUEVHIHNhbXBsaW5nIGZhY3RvcnMgZm9yIGVhY2ggY29sb3IKKwkJCQljb21wb25lbnQuCisKK1RoZSAtc2FtcGxlIHN3aXRjaCBzcGVjaWZpZXMgdGhlIEpQRUcgc2FtcGxpbmcgZmFjdG9ycyBmb3IgZWFjaCBjb2xvcgorY29tcG9uZW50LCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlIEpQRUcgU09GIG1hcmtlci4KK0lmIHlvdSBzcGVjaWZ5IGZld2VyIEh4ViBwYWlycyB0aGFuIHRoZXJlIGFyZSBjb21wb25lbnRzLCB0aGUgcmVtYWluaW5nCitjb21wb25lbnRzIGFyZSBzZXQgdG8gMXgxIHNhbXBsaW5nLiAgRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IFlDYkNyIHNldHRpbmcKK2lzIGVxdWl2YWxlbnQgdG8gIi1zYW1wbGUgMngyLDF4MSwxeDEiLCB3aGljaCBjYW4gYmUgYWJicmV2aWF0ZWQgdG8KKyItc2FtcGxlIDJ4MiIuCisKK1RoZXJlIGFyZSBzdGlsbCBzb21lIEpQRUcgZGVjb2RlcnMgaW4gZXhpc3RlbmNlIHRoYXQgc3VwcG9ydCBvbmx5IDJ4MQorc2FtcGxpbmcgKGFsc28gY2FsbGVkIDQ6MjoyIHNhbXBsaW5nKS4gIENvbXBhdGliaWxpdHkgd2l0aCBzdWNoIGRlY29kZXJzIGNhbgorYmUgYWNoaWV2ZWQgYnkgc3BlY2lmeWluZyAiLXNhbXBsZSAyeDEiLiAgVGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzCityZWFsbHkgbmVjZXNzYXJ5LCBzaW5jZSBpdCBpbmNyZWFzZXMgZmlsZSBzaXplIGFuZCBlbmNvZGluZy9kZWNvZGluZyB0aW1lCit3aXRoIHZlcnkgbGl0dGxlIHF1YWxpdHkgZ2Fpbi4KKworCitNdWx0aXBsZSBTY2FuIC8gUHJvZ3Jlc3Npb24gQ29udHJvbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZGVmYXVsdCwgY2pwZWcgZW1pdHMgYSBzaW5nbGUtc2NhbiBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIFRoZQorLXByb2dyZXNzaXZlIHN3aXRjaCBnZW5lcmF0ZXMgYSBwcm9ncmVzc2l2ZSBKUEVHIGZpbGUgdXNpbmcgYSBkZWZhdWx0IHNlcmllcworb2YgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycy4gIFlvdSBjYW4gY3JlYXRlIG11bHRpcGxlLXNjYW4gc2VxdWVudGlhbCBKUEVHCitmaWxlcyBvciBwcm9ncmVzc2l2ZSBKUEVHIGZpbGVzIHdpdGggY3VzdG9tIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgYnkgdXNpbmcKK3RoZSAtc2NhbnMgc3dpdGNoOgorCisJLXNjYW5zIGZpbGUJVXNlIHRoZSBzY2FuIHNlcXVlbmNlIGdpdmVuIGluIHRoZSBuYW1lZCBmaWxlLgorCitUaGUgc3BlY2lmaWVkIGZpbGUgc2hvdWxkIGJlIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYSAic2NhbiBzY3JpcHQiLgorVGhlIHNjcmlwdCBzcGVjaWZpZXMgdGhlIGNvbnRlbnRzIGFuZCBvcmRlcmluZyBvZiB0aGUgc2NhbnMgdG8gYmUgZW1pdHRlZC4KK0VhY2ggZW50cnkgaW4gdGhlIHNjcmlwdCBkZWZpbmVzIG9uZSBzY2FuLiAgQSBzY2FuIGRlZmluaXRpb24gc3BlY2lmaWVzCit0aGUgY29tcG9uZW50cyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2NhbiwgYW5kIGZvciBwcm9ncmVzc2l2ZSBKUEVHIGl0IGFsc28KK3NwZWNpZmllcyB0aGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBTcyxTZSxBaCxBbCBmb3IgdGhlIHNjYW4uICBTY2FuCitkZWZpbml0aW9ucyBhcmUgc2VwYXJhdGVkIGJ5IHNlbWljb2xvbnMgKCc7JykuICBBIHNlbWljb2xvbiBhZnRlciB0aGUgbGFzdAorc2NhbiBkZWZpbml0aW9uIGlzIG9wdGlvbmFsLgorCitFYWNoIHNjYW4gZGVmaW5pdGlvbiBjb250YWlucyBvbmUgdG8gZm91ciBjb21wb25lbnQgaW5kZXhlcywgb3B0aW9uYWxseQorZm9sbG93ZWQgYnkgYSBjb2xvbiAoJzonKSBhbmQgdGhlIGZvdXIgcHJvZ3Jlc3NpdmUtSlBFRyBwYXJhbWV0ZXJzLiAgVGhlCitjb21wb25lbnQgaW5kZXhlcyBkZW5vdGUgd2hpY2ggY29sb3IgY29tcG9uZW50KHMpIGFyZSB0byBiZSB0cmFuc21pdHRlZCBpbgordGhlIHNjYW4uICBDb21wb25lbnRzIGFyZSBudW1iZXJlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlCitKUEVHIFNPRiBtYXJrZXIsIHdpdGggdGhlIGZpcnN0IGNvbXBvbmVudCBiZWluZyBudW1iZXJlZCAwLiAgKE5vdGUgdGhhdCB0aGVzZQoraW5kZXhlcyBhcmUgbm90IHRoZSAiY29tcG9uZW50IElEIiBjb2RlcyBhc3NpZ25lZCB0byB0aGUgY29tcG9uZW50cywganVzdAorcG9zaXRpb25hbCBpbmRleGVzLikKKworVGhlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgZm9yIGVhY2ggc2NhbiBhcmU6CisJU3MJWmlnemFnIGluZGV4IG9mIGZpcnN0IGNvZWZmaWNpZW50IGluY2x1ZGVkIGluIHNjYW4KKwlTZQlaaWd6YWcgaW5kZXggb2YgbGFzdCBjb2VmZmljaWVudCBpbmNsdWRlZCBpbiBzY2FuCisJQWgJWmVybyBmb3IgZmlyc3Qgc2NhbiBvZiBhIGNvZWZmaWNpZW50LCBlbHNlIEFsIG9mIHByaW9yIHNjYW4KKwlBbAlTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gbG93IGJpdCBwb3NpdGlvbiBmb3Igc2NhbgorSWYgdGhlIHByb2dyZXNzaW9uIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQsIHRoZSB2YWx1ZXMgMCw2MywwLDAgYXJlIHVzZWQsCitwcm9kdWNpbmcgYSBzZXF1ZW50aWFsIEpQRUcgZmlsZS4gIGNqcGVnIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lcyB3aGV0aGVyCit0aGUgc2NyaXB0IHJlcHJlc2VudHMgYSBwcm9ncmVzc2l2ZSBvciBzZXF1ZW50aWFsIGZpbGUsIGJ5IG9ic2VydmluZyB3aGV0aGVyCitTcyBhbmQgU2UgdmFsdWVzIG90aGVyIHRoYW4gMCBhbmQgNjMgYXBwZWFyLiAgKFRoZSAtcHJvZ3Jlc3NpdmUgc3dpdGNoIGlzCitub3QgbmVlZGVkIHRvIHNwZWNpZnkgdGhpczsgaW4gZmFjdCwgaXQgaXMgaWdub3JlZCB3aGVuIC1zY2FucyBhcHBlYXJzLikKK1RoZSBzY2FuIHNjcmlwdCBtdXN0IG1lZXQgdGhlIEpQRUcgcmVzdHJpY3Rpb25zIG9uIHByb2dyZXNzaW9uIHNlcXVlbmNlcy4KKyhjanBlZyBjaGVja3MgdGhhdCB0aGUgc3BlYydzIHJlcXVpcmVtZW50cyBhcmUgb2JleWVkLikKKworU2NhbiBzY3JpcHQgZmlsZXMgYXJlIGZyZWUgZm9ybWF0LCBpbiB0aGF0IGFyYml0cmFyeSB3aGl0ZXNwYWNlIGNhbiBhcHBlYXIKK2JldHdlZW4gbnVtYmVycyBhbmQgYXJvdW5kIHB1bmN0dWF0aW9uLiAgQWxzbywgY29tbWVudHMgY2FuIGJlIGluY2x1ZGVkOiBhCitjb21tZW50IHN0YXJ0cyB3aXRoICcjJyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgRm9yIGFkZGl0aW9uYWwKK2xlZ2liaWxpdHksIGNvbW1hcyBvciBkYXNoZXMgY2FuIGJlIHBsYWNlZCBiZXR3ZWVuIHZhbHVlcy4gIChBY3R1YWxseSwgYW55CitzaW5nbGUgcHVuY3R1YXRpb24gY2hhcmFjdGVyIG90aGVyIHRoYW4gJzonIG9yICc7JyBjYW4gYmUgaW5zZXJ0ZWQuKSAgRm9yCitleGFtcGxlLCB0aGUgZm9sbG93aW5nIHR3byBzY2FuIGRlZmluaXRpb25zIGFyZSBlcXVpdmFsZW50OgorCTAgMSAyOiAwIDYzIDAgMDsKKwkwLDEsMiA6IDAtNjMsIDAsMCA7CisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHNjYW4gc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIGEgcGFydGlhbGx5IGludGVybGVhdmVkCitzZXF1ZW50aWFsIEpQRUcgZmlsZToKKworCTA7CQkJIyBZIG9ubHkgaW4gZmlyc3Qgc2NhbgorCTEgMjsJCQkjIENiIGFuZCBDciBpbiBzZWNvbmQgc2NhbgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBwcm9ncmVzc2l2ZSBzY2FuIHNjcmlwdCB1c2luZyBvbmx5IHNwZWN0cmFsIHNlbGVjdGlvbgorKG5vIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbik6CisKKwkjIEludGVybGVhdmVkIERDIHNjYW4gZm9yIFksQ2IsQ3I6CisJMCwxLDI6IDAtMCwgICAwLCAwIDsKKwkjIEFDIHNjYW5zOgorCTA6ICAgICAxLTIsICAgMCwgMCA7CSMgRmlyc3QgdHdvIFkgQUMgY29lZmZpY2llbnRzCisJMDogICAgIDMtNSwgICAwLCAwIDsJIyBUaHJlZSBtb3JlCisJMTogICAgIDEtNjMsICAwLCAwIDsJIyBBbGwgQUMgY29lZmZpY2llbnRzIGZvciBDYgorCTI6ICAgICAxLTYzLCAgMCwgMCA7CSMgQWxsIEFDIGNvZWZmaWNpZW50cyBmb3IgQ3IKKwkwOiAgICAgNi05LCAgIDAsIDAgOwkjIE1vcmUgWSBjb2VmZmljaWVudHMKKwkwOiAgICAgMTAtNjMsIDAsIDAgOwkjIFJlbWFpbmluZyBZIGNvZWZmaWNpZW50cworCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBzdWNjZXNzaXZlLWFwcHJveGltYXRpb24gc2NyaXB0LiAgVGhpcyBpcyBlcXVpdmFsZW50Cit0byB0aGUgZGVmYXVsdCBzY3JpcHQgdXNlZCBieSAiY2pwZWcgLXByb2dyZXNzaXZlIiBmb3IgWUNiQ3IgaW1hZ2VzOgorCisJIyBJbml0aWFsIERDIHNjYW4gZm9yIFksQ2IsQ3IgKGxvd2VzdCBiaXQgbm90IHNlbnQpCisJMCwxLDI6IDAtMCwgICAwLCAxIDsKKwkjIEZpcnN0IEFDIHNjYW46IHNlbmQgZmlyc3QgNSBZIEFDIGNvZWZmaWNpZW50cywgbWludXMgMiBsb3dlc3QgYml0czoKKwkwOiAgICAgMS01LCAgIDAsIDIgOworCSMgU2VuZCBhbGwgQ3IsQ2IgQUMgY29lZmZpY2llbnRzLCBtaW51cyBsb3dlc3QgYml0OgorCSMgKGNocm9tYSBkYXRhIGlzIHVzdWFsbHkgdG9vIHNtYWxsIHRvIGJlIHdvcnRoIHN1YmRpdmlkaW5nIGZ1cnRoZXI7CisJIyAgYnV0IG5vdGUgd2Ugc2VuZCBDciBmaXJzdCBzaW5jZSBleWUgaXMgbGVhc3Qgc2Vuc2l0aXZlIHRvIENiKQorCTI6ICAgICAxLTYzLCAgMCwgMSA7CisJMTogICAgIDEtNjMsICAwLCAxIDsKKwkjIFNlbmQgcmVtYWluaW5nIFkgQUMgY29lZmZpY2llbnRzLCBtaW51cyAyIGxvd2VzdCBiaXRzOgorCTA6ICAgICA2LTYzLCAgMCwgMiA7CisJIyBTZW5kIG5leHQtdG8tbG93ZXN0IGJpdCBvZiBhbGwgWSBBQyBjb2VmZmljaWVudHM6CisJMDogICAgIDEtNjMsICAyLCAxIDsKKwkjIEF0IHRoaXMgcG9pbnQgd2UndmUgc2VudCBhbGwgYnV0IHRoZSBsb3dlc3QgYml0IG9mIGFsbCBjb2VmZmljaWVudHMuCisJIyBTZW5kIGxvd2VzdCBiaXQgb2YgREMgY29lZmZpY2llbnRzCisJMCwxLDI6IDAtMCwgICAxLCAwIDsKKwkjIFNlbmQgbG93ZXN0IGJpdCBvZiBBQyBjb2VmZmljaWVudHMKKwkyOiAgICAgMS02MywgIDEsIDAgOworCTE6ICAgICAxLTYzLCAgMSwgMCA7CisJIyBZIEFDIGxvd2VzdCBiaXQgc2NhbiBpcyBsYXN0OyBpdCdzIHVzdWFsbHkgdGhlIGxhcmdlc3Qgc2NhbgorCTA6ICAgICAxLTYzLCAgMSwgMCA7CisKK0l0IG1heSBiZSB3b3J0aCBwb2ludGluZyBvdXQgdGhhdCB0aGlzIHNjcmlwdCBpcyB0dW5lZCBmb3IgcXVhbGl0eSBzZXR0aW5ncworb2YgYXJvdW5kIDUwIHRvIDc1LiAgRm9yIGxvd2VyIHF1YWxpdHkgc2V0dGluZ3MsIHlvdSdkIHByb2JhYmx5IHdhbnQgdG8gdXNlCithIHNjcmlwdCB3aXRoIGZld2VyIHN0YWdlcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKG90aGVyd2lzZSB0aGUKK2luaXRpYWwgc2NhbnMgd2lsbCBiZSByZWFsbHkgYmFkKS4gIEZvciBoaWdoZXIgcXVhbGl0eSBzZXR0aW5ncywgeW91IG1pZ2h0Cit3YW50IHRvIHVzZSBtb3JlIHN0YWdlcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gKHNvIHRoYXQgdGhlIGluaXRpYWwKK3NjYW5zIGFyZSBub3QgdG9vIGxhcmdlKS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cmJtcC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dyYm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4M2IwZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cmJtcC5jCkBAIC0wLDAgKzEsNDQyIEBACisvKgorICogd3JibXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRvIHdyaXRlIG91dHB1dCBpbWFnZXMgaW4gTWljcm9zb2Z0ICJCTVAiCisgKiBmb3JtYXQgKE1TIFdpbmRvd3MgMy54IGFuZCBPUy8yIDEueCBmbGF2b3JzKS4KKyAqIEVpdGhlciA4LWJpdCBjb2xvcm1hcHBlZCBvciAyNC1iaXQgZnVsbC1jb2xvciBmb3JtYXQgY2FuIGJlIHdyaXR0ZW4uCisgKiBObyBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bworICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgorICoKKyAqIFRoaXMgY29kZSBjb250cmlidXRlZCBieSBKYW1lcyBBcnRodXIgQm91Y2hlci4KKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgQk1QX1NVUFBPUlRFRAorCisKKy8qCisgKiBUbyBzdXBwb3J0IDEyLWJpdCBKUEVHIGRhdGEsIHdlJ2QgaGF2ZSB0byBzY2FsZSBvdXRwdXQgZG93biB0byA4IGJpdHMuCisgKiBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisvKgorICogU2luY2UgQk1QIHN0b3JlcyBzY2FubGluZXMgYm90dG9tLXRvLXRvcCwgd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGltYWdlCisgKiBmcm9tIEpQRUcncyB0b3AtdG8tYm90dG9tIG9yZGVyLiAgVG8gZG8gdGhpcywgd2Ugc2F2ZSB0aGUgb3V0Z29pbmcgZGF0YQorICogaW4gYSB2aXJ0dWFsIGFycmF5IGR1cmluZyBwdXRfcGl4ZWxfcm93IGNhbGxzLCB0aGVuIGFjdHVhbGx5IGVtaXQgdGhlCisgKiBCTVAgZmlsZSBkdXJpbmcgZmluaXNoX291dHB1dC4gIFRoZSB2aXJ0dWFsIGFycmF5IGNvbnRhaW5zIG9uZSBKU0FNUExFIHBlcgorICogcGl4ZWwgaWYgdGhlIG91dHB1dCBpcyBncmF5c2NhbGUgb3IgY29sb3JtYXBwZWQsIHRocmVlIGlmIGl0IGlzIGZ1bGwgY29sb3IuCisgKi8KKworLyogUHJpdmF0ZSB2ZXJzaW9uIG9mIGRhdGEgZGVzdGluYXRpb24gb2JqZWN0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLworCisgIGJvb2xlYW4gaXNfb3MyOwkJLyogc2F2ZXMgdGhlIE9TMiBmb3JtYXQgcmVxdWVzdCBmbGFnICovCisKKyAganZpcnRfc2FycmF5X3B0ciB3aG9sZV9pbWFnZTsJLyogbmVlZGVkIHRvIHJldmVyc2Ugcm93IG9yZGVyICovCisgIEpESU1FTlNJT04gZGF0YV93aWR0aDsJLyogSlNBTVBMRXMgcGVyIHJvdyAqLworICBKRElNRU5TSU9OIHJvd193aWR0aDsJCS8qIHBoeXNpY2FsIHdpZHRoIG9mIG9uZSByb3cgaW4gdGhlIEJNUCBmaWxlICovCisgIGludCBwYWRfYnl0ZXM7CQkvKiBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBuZWVkZWQgcGVyIHJvdyAqLworICBKRElNRU5TSU9OIGN1cl9vdXRwdXRfcm93OwkvKiBuZXh0IHJvdyMgdG8gd3JpdGUgdG8gdmlydHVhbCBhcnJheSAqLworfSBibXBfZGVzdF9zdHJ1Y3Q7CisKK3R5cGVkZWYgYm1wX2Rlc3Rfc3RydWN0ICogYm1wX2Rlc3RfcHRyOworCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitMT0NBTCh2b2lkKSB3cml0ZV9jb2xvcm1hcAorCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm1wX2Rlc3RfcHRyIGRlc3QsCisJICAgICBpbnQgbWFwX2NvbG9ycywgaW50IG1hcF9lbnRyeV9zaXplKSk7CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KKyAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQorLyogVGhpcyB2ZXJzaW9uIGlzIGZvciB3cml0aW5nIDI0LWJpdCBwaXhlbHMgKi8KK3sKKyAgYm1wX2Rlc3RfcHRyIGRlc3QgPSAoYm1wX2Rlc3RfcHRyKSBkaW5mbzsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworICBpbnQgcGFkOworCisgIC8qIEFjY2VzcyBuZXh0IHJvdyBpbiB2aXJ0dWFsIGFycmF5ICovCisgIGltYWdlX3B0ciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+d2hvbGVfaW1hZ2UsCisgICAgIGRlc3QtPmN1cl9vdXRwdXRfcm93LCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgIGRlc3QtPmN1cl9vdXRwdXRfcm93Kys7CisKKyAgLyogVHJhbnNmZXIgZGF0YS4gIE5vdGUgZGVzdGluYXRpb24gdmFsdWVzIG11c3QgYmUgaW4gQkdSIG9yZGVyCisgICAqIChldmVuIHRob3VnaCBNaWNyb3NvZnQncyBvd24gZG9jdW1lbnRzIHNheSB0aGUgb3Bwb3NpdGUpLgorICAgKi8KKyAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBvdXRwdHIgPSBpbWFnZV9wdHJbMF07CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBvdXRwdHJbMl0gPSAqaW5wdHIrKzsJLyogY2FuIG9taXQgR0VUSlNBTVBMRSgpIHNhZmVseSAqLworICAgIG91dHB0clsxXSA9ICppbnB0cisrOworICAgIG91dHB0clswXSA9ICppbnB0cisrOworICAgIG91dHB0ciArPSAzOworICB9CisKKyAgLyogWmVybyBvdXQgdGhlIHBhZCBieXRlcy4gKi8KKyAgcGFkID0gZGVzdC0+cGFkX2J5dGVzOworICB3aGlsZSAoLS1wYWQgPj0gMCkKKyAgICAqb3V0cHRyKysgPSAwOworfQorCitNRVRIT0RERUYodm9pZCkKK3B1dF9ncmF5X3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCSAgICAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCisvKiBUaGlzIHZlcnNpb24gaXMgZm9yIGdyYXlzY2FsZSBPUiBxdWFudGl6ZWQgY29sb3Igb3V0cHV0ICovCit7CisgIGJtcF9kZXN0X3B0ciBkZXN0ID0gKGJtcF9kZXN0X3B0cikgZGluZm87CisgIEpTQU1QQVJSQVkgaW1hZ2VfcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKyAgaW50IHBhZDsKKworICAvKiBBY2Nlc3MgbmV4dCByb3cgaW4gdmlydHVhbCBhcnJheSAqLworICBpbWFnZV9wdHIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLAorICAgICBkZXN0LT5jdXJfb3V0cHV0X3JvdywgKEpESU1FTlNJT04pIDEsIFRSVUUpOworICBkZXN0LT5jdXJfb3V0cHV0X3JvdysrOworCisgIC8qIFRyYW5zZmVyIGRhdGEuICovCisgIGlucHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgb3V0cHRyID0gaW1hZ2VfcHRyWzBdOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgKm91dHB0cisrID0gKmlucHRyKys7CS8qIGNhbiBvbWl0IEdFVEpTQU1QTEUoKSBzYWZlbHkgKi8KKyAgfQorCisgIC8qIFplcm8gb3V0IHRoZSBwYWQgYnl0ZXMuICovCisgIHBhZCA9IGRlc3QtPnBhZF9ieXRlczsKKyAgd2hpbGUgKC0tcGFkID49IDApCisgICAgKm91dHB0cisrID0gMDsKK30KKworCisvKgorICogU3RhcnR1cDogbm9ybWFsbHkgd3JpdGVzIHRoZSBmaWxlIGhlYWRlci4KKyAqIEluIHRoaXMgbW9kdWxlIHdlIG1heSBhcyB3ZWxsIHBvc3Rwb25lIGV2ZXJ5dGhpbmcgdW50aWwgZmluaXNoX291dHB1dC4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF9ibXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICAvKiBubyB3b3JrIGhlcmUgKi8KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKgorICogSGVyZSBpcyB3aGVyZSB3ZSByZWFsbHkgb3V0cHV0IHRoZSBCTVAgZmlsZS4KKyAqCisgKiBGaXJzdCwgcm91dGluZXMgdG8gd3JpdGUgdGhlIFdpbmRvd3MgYW5kIE9TLzIgdmFyaWFudHMgb2YgdGhlIGZpbGUgaGVhZGVyLgorICovCisKK0xPQ0FMKHZvaWQpCit3cml0ZV9ibXBfaGVhZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBibXBfZGVzdF9wdHIgZGVzdCkKKy8qIFdyaXRlIGEgV2luZG93cy1zdHlsZSBCTVAgZmlsZSBoZWFkZXIsIGluY2x1ZGluZyBjb2xvcm1hcCBpZiBuZWVkZWQgKi8KK3sKKyAgY2hhciBibXBmaWxlaGVhZGVyWzE0XTsKKyAgY2hhciBibXBpbmZvaGVhZGVyWzQwXTsKKyNkZWZpbmUgUFVUXzJCKGFycmF5LG9mZnNldCx2YWx1ZSkgIFwKKwkoYXJyYXlbb2Zmc2V0XSA9IChjaGFyKSAoKHZhbHVlKSAmIDB4RkYpLCBcCisJIGFycmF5W29mZnNldCsxXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gOCkgJiAweEZGKSkKKyNkZWZpbmUgUFVUXzRCKGFycmF5LG9mZnNldCx2YWx1ZSkgIFwKKwkoYXJyYXlbb2Zmc2V0XSA9IChjaGFyKSAoKHZhbHVlKSAmIDB4RkYpLCBcCisJIGFycmF5W29mZnNldCsxXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gOCkgJiAweEZGKSwgXAorCSBhcnJheVtvZmZzZXQrMl0gPSAoY2hhcikgKCgodmFsdWUpID4+IDE2KSAmIDB4RkYpLCBcCisJIGFycmF5W29mZnNldCszXSA9IChjaGFyKSAoKCh2YWx1ZSkgPj4gMjQpICYgMHhGRikpCisgIElOVDMyIGhlYWRlcnNpemUsIGJmU2l6ZTsKKyAgaW50IGJpdHNfcGVyX3BpeGVsLCBjbWFwX2VudHJpZXM7CisKKyAgLyogQ29tcHV0ZSBjb2xvcm1hcCBzaXplIGFuZCB0b3RhbCBmaWxlIHNpemUgKi8KKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgICAvKiBDb2xvcm1hcHBlZCBSR0IgKi8KKyAgICAgIGJpdHNfcGVyX3BpeGVsID0gODsKKyAgICAgIGNtYXBfZW50cmllcyA9IDI1NjsKKyAgICB9IGVsc2UgeworICAgICAgLyogVW5xdWFudGl6ZWQsIGZ1bGwgY29sb3IgUkdCICovCisgICAgICBiaXRzX3Blcl9waXhlbCA9IDI0OworICAgICAgY21hcF9lbnRyaWVzID0gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogR3JheXNjYWxlIG91dHB1dC4gIFdlIG5lZWQgdG8gZmFrZSBhIDI1Ni1lbnRyeSBjb2xvcm1hcC4gKi8KKyAgICBiaXRzX3Blcl9waXhlbCA9IDg7CisgICAgY21hcF9lbnRyaWVzID0gMjU2OworICB9CisgIC8qIEZpbGUgc2l6ZSAqLworICBoZWFkZXJzaXplID0gMTQgKyA0MCArIGNtYXBfZW50cmllcyAqIDQ7IC8qIEhlYWRlciBhbmQgY29sb3JtYXAgKi8KKyAgYmZTaXplID0gaGVhZGVyc2l6ZSArIChJTlQzMikgZGVzdC0+cm93X3dpZHRoICogKElOVDMyKSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgCisgIC8qIFNldCB1bnVzZWQgZmllbGRzIG9mIGhlYWRlciB0byAwICovCisgIE1FTVpFUk8oYm1wZmlsZWhlYWRlciwgU0laRU9GKGJtcGZpbGVoZWFkZXIpKTsKKyAgTUVNWkVSTyhibXBpbmZvaGVhZGVyLCBTSVpFT0YoYm1waW5mb2hlYWRlcikpOworCisgIC8qIEZpbGwgdGhlIGZpbGUgaGVhZGVyICovCisgIGJtcGZpbGVoZWFkZXJbMF0gPSAweDQyOwkvKiBmaXJzdCAyIGJ5dGVzIGFyZSBBU0NJSSAnQicsICdNJyAqLworICBibXBmaWxlaGVhZGVyWzFdID0gMHg0RDsKKyAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDIsIGJmU2l6ZSk7IC8qIGJmU2l6ZSAqLworICAvKiB3ZSBsZWF2ZSBiZlJlc2VydmVkMSAmIGJmUmVzZXJ2ZWQyID0gMCAqLworICBQVVRfNEIoYm1wZmlsZWhlYWRlciwgMTAsIGhlYWRlcnNpemUpOyAvKiBiZk9mZkJpdHMgKi8KKworICAvKiBGaWxsIHRoZSBpbmZvIGhlYWRlciAoTWljcm9zb2Z0IGNhbGxzIHRoaXMgYSBCSVRNQVBJTkZPSEVBREVSKSAqLworICBQVVRfMkIoYm1waW5mb2hlYWRlciwgMCwgNDApOwkvKiBiaVNpemUgKi8KKyAgUFVUXzRCKGJtcGluZm9oZWFkZXIsIDQsIGNpbmZvLT5vdXRwdXRfd2lkdGgpOyAvKiBiaVdpZHRoICovCisgIFBVVF80QihibXBpbmZvaGVhZGVyLCA4LCBjaW5mby0+b3V0cHV0X2hlaWdodCk7IC8qIGJpSGVpZ2h0ICovCisgIFBVVF8yQihibXBpbmZvaGVhZGVyLCAxMiwgMSk7CS8qIGJpUGxhbmVzIC0gbXVzdCBiZSAxICovCisgIFBVVF8yQihibXBpbmZvaGVhZGVyLCAxNCwgYml0c19wZXJfcGl4ZWwpOyAvKiBiaUJpdENvdW50ICovCisgIC8qIHdlIGxlYXZlIGJpQ29tcHJlc3Npb24gPSAwLCBmb3Igbm9uZSAqLworICAvKiB3ZSBsZWF2ZSBiaVNpemVJbWFnZSA9IDA7IHRoaXMgaXMgY29ycmVjdCBmb3IgdW5jb21wcmVzc2VkIGRhdGEgKi8KKyAgaWYgKGNpbmZvLT5kZW5zaXR5X3VuaXQgPT0gMikgeyAvKiBpZiBoYXZlIGRlbnNpdHkgaW4gZG90cy9jbSwgdGhlbiAqLworICAgIFBVVF80QihibXBpbmZvaGVhZGVyLCAyNCwgKElOVDMyKSAoY2luZm8tPlhfZGVuc2l0eSoxMDApKTsgLyogWFBlbHMvTSAqLworICAgIFBVVF80QihibXBpbmZvaGVhZGVyLCAyOCwgKElOVDMyKSAoY2luZm8tPllfZGVuc2l0eSoxMDApKTsgLyogWFBlbHMvTSAqLworICB9CisgIFBVVF8yQihibXBpbmZvaGVhZGVyLCAzMiwgY21hcF9lbnRyaWVzKTsgLyogYmlDbHJVc2VkICovCisgIC8qIHdlIGxlYXZlIGJpQ2xySW1wb3J0YW50ID0gMCAqLworCisgIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1wZmlsZWhlYWRlciwgMTQpICE9IChzaXplX3QpIDE0KQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisgIGlmIChKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgYm1waW5mb2hlYWRlciwgNDApICE9IChzaXplX3QpIDQwKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9XUklURSk7CisKKyAgaWYgKGNtYXBfZW50cmllcyA+IDApCisgICAgd3JpdGVfY29sb3JtYXAoY2luZm8sIGRlc3QsIGNtYXBfZW50cmllcywgNCk7Cit9CisKKworTE9DQUwodm9pZCkKK3dyaXRlX29zMl9oZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0KQorLyogV3JpdGUgYW4gT1MyLXN0eWxlIEJNUCBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIGNvbG9ybWFwIGlmIG5lZWRlZCAqLworeworICBjaGFyIGJtcGZpbGVoZWFkZXJbMTRdOworICBjaGFyIGJtcGNvcmVoZWFkZXJbMTJdOworICBJTlQzMiBoZWFkZXJzaXplLCBiZlNpemU7CisgIGludCBiaXRzX3Blcl9waXhlbCwgY21hcF9lbnRyaWVzOworCisgIC8qIENvbXB1dGUgY29sb3JtYXAgc2l6ZSBhbmQgdG90YWwgZmlsZSBzaXplICovCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogQ29sb3JtYXBwZWQgUkdCICovCisgICAgICBiaXRzX3Blcl9waXhlbCA9IDg7CisgICAgICBjbWFwX2VudHJpZXMgPSAyNTY7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIFVucXVhbnRpemVkLCBmdWxsIGNvbG9yIFJHQiAqLworICAgICAgYml0c19wZXJfcGl4ZWwgPSAyNDsKKyAgICAgIGNtYXBfZW50cmllcyA9IDA7CisgICAgfQorICB9IGVsc2UgeworICAgIC8qIEdyYXlzY2FsZSBvdXRwdXQuICBXZSBuZWVkIHRvIGZha2UgYSAyNTYtZW50cnkgY29sb3JtYXAuICovCisgICAgYml0c19wZXJfcGl4ZWwgPSA4OworICAgIGNtYXBfZW50cmllcyA9IDI1NjsKKyAgfQorICAvKiBGaWxlIHNpemUgKi8KKyAgaGVhZGVyc2l6ZSA9IDE0ICsgMTIgKyBjbWFwX2VudHJpZXMgKiAzOyAvKiBIZWFkZXIgYW5kIGNvbG9ybWFwICovCisgIGJmU2l6ZSA9IGhlYWRlcnNpemUgKyAoSU5UMzIpIGRlc3QtPnJvd193aWR0aCAqIChJTlQzMikgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgIAorICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLworICBNRU1aRVJPKGJtcGZpbGVoZWFkZXIsIFNJWkVPRihibXBmaWxlaGVhZGVyKSk7CisgIE1FTVpFUk8oYm1wY29yZWhlYWRlciwgU0laRU9GKGJtcGNvcmVoZWFkZXIpKTsKKworICAvKiBGaWxsIHRoZSBmaWxlIGhlYWRlciAqLworICBibXBmaWxlaGVhZGVyWzBdID0gMHg0MjsJLyogZmlyc3QgMiBieXRlcyBhcmUgQVNDSUkgJ0InLCAnTScgKi8KKyAgYm1wZmlsZWhlYWRlclsxXSA9IDB4NEQ7CisgIFBVVF80QihibXBmaWxlaGVhZGVyLCAyLCBiZlNpemUpOyAvKiBiZlNpemUgKi8KKyAgLyogd2UgbGVhdmUgYmZSZXNlcnZlZDEgJiBiZlJlc2VydmVkMiA9IDAgKi8KKyAgUFVUXzRCKGJtcGZpbGVoZWFkZXIsIDEwLCBoZWFkZXJzaXplKTsgLyogYmZPZmZCaXRzICovCisKKyAgLyogRmlsbCB0aGUgaW5mbyBoZWFkZXIgKE1pY3Jvc29mdCBjYWxscyB0aGlzIGEgQklUTUFQQ09SRUhFQURFUikgKi8KKyAgUFVUXzJCKGJtcGNvcmVoZWFkZXIsIDAsIDEyKTsJLyogYmNTaXplICovCisgIFBVVF8yQihibXBjb3JlaGVhZGVyLCA0LCBjaW5mby0+b3V0cHV0X3dpZHRoKTsgLyogYmNXaWR0aCAqLworICBQVVRfMkIoYm1wY29yZWhlYWRlciwgNiwgY2luZm8tPm91dHB1dF9oZWlnaHQpOyAvKiBiY0hlaWdodCAqLworICBQVVRfMkIoYm1wY29yZWhlYWRlciwgOCwgMSk7CS8qIGJjUGxhbmVzIC0gbXVzdCBiZSAxICovCisgIFBVVF8yQihibXBjb3JlaGVhZGVyLCAxMCwgYml0c19wZXJfcGl4ZWwpOyAvKiBiY0JpdENvdW50ICovCisKKyAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBmaWxlaGVhZGVyLCAxNCkgIT0gKHNpemVfdCkgMTQpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKyAgaWYgKEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBibXBjb3JlaGVhZGVyLCAxMikgIT0gKHNpemVfdCkgMTIpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKKworICBpZiAoY21hcF9lbnRyaWVzID4gMCkKKyAgICB3cml0ZV9jb2xvcm1hcChjaW5mbywgZGVzdCwgY21hcF9lbnRyaWVzLCAzKTsKK30KKworCisvKgorICogV3JpdGUgdGhlIGNvbG9ybWFwLgorICogV2luZG93cyB1c2VzIEJHUjAgbWFwIGVudHJpZXM7IE9TLzIgdXNlcyBCR1IgZW50cmllcy4KKyAqLworCitMT0NBTCh2b2lkKQord3JpdGVfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJtcF9kZXN0X3B0ciBkZXN0LAorCQlpbnQgbWFwX2NvbG9ycywgaW50IG1hcF9lbnRyeV9zaXplKQoreworICBKU0FNUEFSUkFZIGNvbG9ybWFwID0gY2luZm8tPmNvbG9ybWFwOworICBpbnQgbnVtX2NvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKKyAgRklMRSAqIG91dGZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7CisgIGludCBpOworCisgIGlmIChjb2xvcm1hcCAhPSBOVUxMKSB7CisgICAgaWYgKGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzKSB7CisgICAgICAvKiBOb3JtYWwgY2FzZSB3aXRoIFJHQiBjb2xvcm1hcCAqLworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7IGkrKykgeworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsyXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsxXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOworCWlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQorCSAgcHV0YygwLCBvdXRmaWxlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyogR3JheXNjYWxlIGNvbG9ybWFwIChvbmx5IGhhcHBlbnMgd2l0aCBncmF5c2NhbGUgcXVhbnRpemF0aW9uKSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7IGkrKykgeworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSksIG91dGZpbGUpOworCWlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQorCSAgcHV0YygwLCBvdXRmaWxlKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogSWYgbm8gY29sb3JtYXAsIG11c3QgYmUgZ3JheXNjYWxlIGRhdGEuICBHZW5lcmF0ZSBhIGxpbmVhciAibWFwIi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgIHB1dGMoaSwgb3V0ZmlsZSk7CisgICAgICBwdXRjKGksIG91dGZpbGUpOworICAgICAgcHV0YyhpLCBvdXRmaWxlKTsKKyAgICAgIGlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQorCXB1dGMoMCwgb3V0ZmlsZSk7CisgICAgfQorICB9CisgIC8qIFBhZCBjb2xvcm1hcCB3aXRoIHplcm9zIHRvIGVuc3VyZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbG9ybWFwIGVudHJpZXMgKi8gCisgIGlmIChpID4gbWFwX2NvbG9ycykKKyAgICBFUlJFWElUMShjaW5mbywgSkVSUl9UT09fTUFOWV9DT0xPUlMsIGkpOworICBmb3IgKDsgaSA8IG1hcF9jb2xvcnM7IGkrKykgeworICAgIHB1dGMoMCwgb3V0ZmlsZSk7CisgICAgcHV0YygwLCBvdXRmaWxlKTsKKyAgICBwdXRjKDAsIG91dGZpbGUpOworICAgIGlmIChtYXBfZW50cnlfc2l6ZSA9PSA0KQorICAgICAgcHV0YygwLCBvdXRmaWxlKTsKKyAgfQorfQorCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9ibXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBibXBfZGVzdF9wdHIgZGVzdCA9IChibXBfZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBGSUxFICogb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKKyAgSlNBTVBBUlJBWSBpbWFnZV9wdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGRhdGFfcHRyOworICBKRElNRU5TSU9OIHJvdzsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisgIGNkX3Byb2dyZXNzX3B0ciBwcm9ncmVzcyA9IChjZF9wcm9ncmVzc19wdHIpIGNpbmZvLT5wcm9ncmVzczsKKworICAvKiBXcml0ZSB0aGUgaGVhZGVyIGFuZCBjb2xvcm1hcCAqLworICBpZiAoZGVzdC0+aXNfb3MyKQorICAgIHdyaXRlX29zMl9oZWFkZXIoY2luZm8sIGRlc3QpOworICBlbHNlCisgICAgd3JpdGVfYm1wX2hlYWRlcihjaW5mbywgZGVzdCk7CisKKyAgLyogV3JpdGUgdGhlIGZpbGUgYm9keSBmcm9tIG91ciB2aXJ0dWFsIGFycmF5ICovCisgIGZvciAocm93ID0gY2luZm8tPm91dHB1dF9oZWlnaHQ7IHJvdyA+IDA7IHJvdy0tKSB7CisgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgIHByb2dyZXNzLT5wdWIucGFzc19jb3VudGVyID0gKGxvbmcpIChjaW5mby0+b3V0cHV0X2hlaWdodCAtIHJvdyk7CisgICAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7CisgICAgICAoKnByb2dyZXNzLT5wdWIucHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKKyAgICB9CisgICAgaW1hZ2VfcHRyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIGRlc3QtPndob2xlX2ltYWdlLCByb3ctMSwgKEpESU1FTlNJT04pIDEsIEZBTFNFKTsKKyAgICBkYXRhX3B0ciA9IGltYWdlX3B0clswXTsKKyAgICBmb3IgKGNvbCA9IGRlc3QtPnJvd193aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICAgIHB1dGMoR0VUSlNBTVBMRSgqZGF0YV9wdHIpLCBvdXRmaWxlKTsKKyAgICAgIGRhdGFfcHRyKys7CisgICAgfQorICB9CisgIGlmIChwcm9ncmVzcyAhPSBOVUxMKQorICAgIHByb2dyZXNzLT5jb21wbGV0ZWRfZXh0cmFfcGFzc2VzKys7CisKKyAgLyogTWFrZSBzdXJlIHdlIHdyb3RlIHRoZSBvdXRwdXQgZmlsZSBPSyAqLworICBmZmx1c2gob3V0ZmlsZSk7CisgIGlmIChmZXJyb3Iob3V0ZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgQk1QIGZvcm1hdCBvdXRwdXQuCisgKi8KKworR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQoramluaXRfd3JpdGVfYm1wIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX29zMikKK3sKKyAgYm1wX2Rlc3RfcHRyIGRlc3Q7CisgIEpESU1FTlNJT04gcm93X3dpZHRoOworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KKyAgZGVzdCA9IChibXBfZGVzdF9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKGJtcF9kZXN0X3N0cnVjdCkpOworICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X2JtcDsKKyAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X2JtcDsKKyAgZGVzdC0+aXNfb3MyID0gaXNfb3MyOworCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfZ3JheV9yb3dzOworICB9IGVsc2UgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKKyAgICBlbHNlCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKKyAgfSBlbHNlIHsKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JNUF9DT0xPUlNQQUNFKTsKKyAgfQorCisgIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKworICAvKiBEZXRlcm1pbmUgd2lkdGggb2Ygcm93cyBpbiB0aGUgQk1QIGZpbGUgKHBhZGRlZCB0byA0LWJ5dGUgYm91bmRhcnkpLiAqLworICByb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzOworICBkZXN0LT5kYXRhX3dpZHRoID0gcm93X3dpZHRoOworICB3aGlsZSAoKHJvd193aWR0aCAmIDMpICE9IDApIHJvd193aWR0aCsrOworICBkZXN0LT5yb3dfd2lkdGggPSByb3dfd2lkdGg7CisgIGRlc3QtPnBhZF9ieXRlcyA9IChpbnQpIChyb3dfd2lkdGggLSBkZXN0LT5kYXRhX3dpZHRoKTsKKworICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgaW52ZXJzaW9uIGFycmF5LCBwcmVwYXJlIGZvciB3cml0ZSBwYXNzICovCisgIGRlc3QtPndob2xlX2ltYWdlID0gKCpjaW5mby0+bWVtLT5yZXF1ZXN0X3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIEZBTFNFLAorICAgICByb3dfd2lkdGgsIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7CisgIGRlc3QtPmN1cl9vdXRwdXRfcm93ID0gMDsKKyAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzID0gKGNkX3Byb2dyZXNzX3B0cikgY2luZm8tPnByb2dyZXNzOworICAgIHByb2dyZXNzLT50b3RhbF9leHRyYV9wYXNzZXMrKzsgLyogY291bnQgZmlsZSBpbnB1dCBhcyBzZXBhcmF0ZSBwYXNzICovCisgIH0KKworICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCisgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCByb3dfd2lkdGgsIChKRElNRU5TSU9OKSAxKTsKKyAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworCisgIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Cit9CisKKyNlbmRpZiAvKiBCTVBfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JnaWYuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cmdpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTgzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JnaWYuYwpAQCAtMCwwICsxLDM5OSBAQAorLyoKKyAqIHdyZ2lmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIEdJRiBmb3JtYXQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOT1RFOiB0byBhdm9pZCBlbnRhbmdsZW1lbnRzIHdpdGggVW5pc3lzJyBwYXRlbnQgb24gTFpXIGNvbXByZXNzaW9uLCAgICoKKyAqIHRoaXMgY29kZSBoYXMgYmVlbiBtb2RpZmllZCB0byBvdXRwdXQgInVuY29tcHJlc3NlZCBHSUYiIGZpbGVzLiAgICAgICAgKgorICogVGhlcmUgaXMgbm8gdHJhY2Ugb2YgdGhlIExaVyBhbGdvcml0aG0gaW4gdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCisgKi8KKworLyoKKyAqIFRoaXMgY29kZSBpcyBsb29zZWx5IGJhc2VkIG9uIHBwbXRvZ2lmIGZyb20gdGhlIFBCTVBMVVMgZGlzdHJpYnV0aW9uCisgKiBvZiBGZWIuIDE5OTEuICBUaGF0IGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgbm90aWNlOgorICogICAgQmFzZWQgb24gR0lGRU5DT0RFIGJ5IERhdmlkIFJvd2xleSA8bWdhcmRpQHdhdGRzY3Uud2F0ZXJsb28uZWR1Pi4KKyAqICAgIExlbXBlbC1aaXYgY29tcHJlc3Npb24gYmFzZWQgb24gImNvbXByZXNzIiBieSBTcGVuY2VyIFcuIFRob21hcyBldCBhbC4KKyAqICAgIENvcHlyaWdodCAoQykgMTk4OSBieSBKZWYgUG9za2FuemVyLgorICogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiAgICBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkCisgKiAgICB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorICogICAgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZworICogICAgZG9jdW1lbnRhdGlvbi4gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IKKyAqICAgIGltcGxpZWQgd2FycmFudHkuCisgKgorICogV2UgYXJlIGFsc28gcmVxdWlyZWQgdG8gc3RhdGUgdGhhdAorICogICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgorICogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuIEdJRihzbSkgaXMgYSBTZXJ2aWNlIE1hcmsgcHJvcGVydHkgb2YKKyAqICAgIENvbXB1U2VydmUgSW5jb3Jwb3JhdGVkLiIKKyAqLworCisjaW5jbHVkZSAiY2RqcGVnLmgiCQkvKiBDb21tb24gZGVjbHMgZm9yIGNqcGVnL2RqcGVnIGFwcGxpY2F0aW9ucyAqLworCisjaWZkZWYgR0lGX1NVUFBPUlRFRAorCisKKy8qIFByaXZhdGUgdmVyc2lvbiBvZiBkYXRhIGRlc3RpbmF0aW9uIG9iamVjdCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBqX2RlY29tcHJlc3NfcHRyIGNpbmZvOwkvKiBiYWNrIGxpbmsgc2F2ZXMgcGFzc2luZyBzZXBhcmF0ZSBwYXJtICovCisKKyAgLyogU3RhdGUgZm9yIHBhY2tpbmcgdmFyaWFibGUtd2lkdGggY29kZXMgaW50byBhIGJpdHN0cmVhbSAqLworICBpbnQgbl9iaXRzOwkJCS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJpdHMvY29kZSAqLworICBpbnQgbWF4Y29kZTsJCQkvKiBtYXhpbXVtIGNvZGUsIGdpdmVuIG5fYml0cyAqLworICBJTlQzMiBjdXJfYWNjdW07CQkvKiBob2xkcyBiaXRzIG5vdCB5ZXQgb3V0cHV0ICovCisgIGludCBjdXJfYml0czsJCQkvKiAjIG9mIGJpdHMgaW4gY3VyX2FjY3VtICovCisKKyAgLyogU3RhdGUgZm9yIEdJRiBjb2RlIGFzc2lnbm1lbnQgKi8KKyAgaW50IENsZWFyQ29kZTsJCS8qIGNsZWFyIGNvZGUgKGRvZXNuJ3QgY2hhbmdlKSAqLworICBpbnQgRU9GQ29kZTsJCQkvKiBFT0YgY29kZSAoZGl0dG8pICovCisgIGludCBjb2RlX2NvdW50ZXI7CQkvKiBjb3VudHMgb3V0cHV0IHN5bWJvbHMgKi8KKworICAvKiBHSUYgZGF0YSBwYWNrZXQgY29uc3RydWN0aW9uIGJ1ZmZlciAqLworICBpbnQgYnl0ZXNpbnBrdDsJCS8qICMgb2YgYnl0ZXMgaW4gY3VycmVudCBwYWNrZXQgKi8KKyAgY2hhciBwYWNrZXRidWZbMjU2XTsJCS8qIHdvcmtzcGFjZSBmb3IgYWNjdW11bGF0aW5nIHBhY2tldCAqLworCit9IGdpZl9kZXN0X3N0cnVjdDsKKwordHlwZWRlZiBnaWZfZGVzdF9zdHJ1Y3QgKiBnaWZfZGVzdF9wdHI7CisKKy8qIExhcmdlc3QgdmFsdWUgdGhhdCB3aWxsIGZpdCBpbiBOIGJpdHMgKi8KKyNkZWZpbmUgTUFYQ09ERShuX2JpdHMpCSgoMSA8PCAobl9iaXRzKSkgLSAxKQorCisKKy8qCisgKiBSb3V0aW5lcyB0byBwYWNrYWdlIGZpbmlzaGVkIGRhdGEgYnl0ZXMgaW50byBHSUYgZGF0YSBibG9ja3MuCisgKiBBIGRhdGEgYmxvY2sgY29uc2lzdHMgb2YgYSBjb3VudCBieXRlICgxLi4yNTUpIGFuZCB0aGF0IG1hbnkgZGF0YSBieXRlcy4KKyAqLworCitMT0NBTCh2b2lkKQorZmx1c2hfcGFja2V0IChnaWZfZGVzdF9wdHIgZGluZm8pCisvKiBmbHVzaCBhbnkgYWNjdW11bGF0ZWQgZGF0YSAqLworeworICBpZiAoZGluZm8tPmJ5dGVzaW5wa3QgPiAwKSB7CS8qIG5ldmVyIHdyaXRlIHplcm8tbGVuZ3RoIHBhY2tldCAqLworICAgIGRpbmZvLT5wYWNrZXRidWZbMF0gPSAoY2hhcikgZGluZm8tPmJ5dGVzaW5wa3QrKzsKKyAgICBpZiAoSkZXUklURShkaW5mby0+cHViLm91dHB1dF9maWxlLCBkaW5mby0+cGFja2V0YnVmLCBkaW5mby0+Ynl0ZXNpbnBrdCkKKwkhPSAoc2l6ZV90KSBkaW5mby0+Ynl0ZXNpbnBrdCkKKyAgICAgIEVSUkVYSVQoZGluZm8tPmNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworICAgIGRpbmZvLT5ieXRlc2lucGt0ID0gMDsKKyAgfQorfQorCisKKy8qIEFkZCBhIGNoYXJhY3RlciB0byBjdXJyZW50IHBhY2tldDsgZmx1c2ggdG8gZGlzayBpZiBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgQ0hBUl9PVVQoZGluZm8sYykgIFwKKwl7IChkaW5mbyktPnBhY2tldGJ1ZlsrKyhkaW5mbyktPmJ5dGVzaW5wa3RdID0gKGNoYXIpIChjKTsgIFwKKwkgICAgaWYgKChkaW5mbyktPmJ5dGVzaW5wa3QgPj0gMjU1KSAgXAorCSAgICAgIGZsdXNoX3BhY2tldChkaW5mbyk7ICBcCisJfQorCisKKy8qIFJvdXRpbmUgdG8gY29udmVydCB2YXJpYWJsZS13aWR0aCBjb2RlcyBpbnRvIGEgYnl0ZSBzdHJlYW0gKi8KKworTE9DQUwodm9pZCkKK291dHB1dCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgY29kZSkKKy8qIEVtaXQgYSBjb2RlIG9mIG5fYml0cyBiaXRzICovCisvKiBVc2VzIGN1cl9hY2N1bSBhbmQgY3VyX2JpdHMgdG8gcmVibG9jayBpbnRvIDgtYml0IGJ5dGVzICovCit7CisgIGRpbmZvLT5jdXJfYWNjdW0gfD0gKChJTlQzMikgY29kZSkgPDwgZGluZm8tPmN1cl9iaXRzOworICBkaW5mby0+Y3VyX2JpdHMgKz0gZGluZm8tPm5fYml0czsKKworICB3aGlsZSAoZGluZm8tPmN1cl9iaXRzID49IDgpIHsKKyAgICBDSEFSX09VVChkaW5mbywgZGluZm8tPmN1cl9hY2N1bSAmIDB4RkYpOworICAgIGRpbmZvLT5jdXJfYWNjdW0gPj49IDg7CisgICAgZGluZm8tPmN1cl9iaXRzIC09IDg7CisgIH0KK30KKworCisvKiBUaGUgcHNldWRvLWNvbXByZXNzaW9uIGFsZ29yaXRobS4KKyAqCisgKiBJbiB0aGlzIG1vZHVsZSB3ZSBzaW1wbHkgb3V0cHV0IGVhY2ggcGl4ZWwgdmFsdWUgYXMgYSBzZXBhcmF0ZSBzeW1ib2w7CisgKiB0aHVzLCBubyBjb21wcmVzc2lvbiBvY2N1cnMuICBJbiBmYWN0LCB0aGVyZSBpcyBleHBhbnNpb24gb2Ygb25lIGJpdCBwZXIKKyAqIHBpeGVsLCBiZWNhdXNlIHdlIHVzZSBhIHN5bWJvbCB3aWR0aCBvbmUgYml0IHdpZGVyIHRoYW4gdGhlIHBpeGVsIHdpZHRoLgorICoKKyAqIEdJRiBvcmRpbmFyaWx5IHVzZXMgdmFyaWFibGUtd2lkdGggc3ltYm9scywgYW5kIHRoZSBkZWNvZGVyIHdpbGwgZXhwZWN0CisgKiB0byByYXRjaGV0IHVwIHRoZSBzeW1ib2wgd2lkdGggYWZ0ZXIgYSBmaXhlZCBudW1iZXIgb2Ygc3ltYm9scy4KKyAqIFRvIHNpbXBsaWZ5IHRoZSBsb2dpYyBhbmQga2VlcCB0aGUgZXhwYW5zaW9uIHBlbmFsdHkgZG93biwgd2UgZW1pdCBhCisgKiBHSUYgQ2xlYXIgY29kZSB0byByZXNldCB0aGUgZGVjb2RlciBqdXN0IGJlZm9yZSB0aGUgd2lkdGggd291bGQgcmF0Y2hldCB1cC4KKyAqIFRodXMsIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBoYXZlIHRoZSBzYW1lIGJpdCB3aWR0aC4KKyAqIE5vdGUgdGhhdCBlbWl0dGluZyB0aGUgQ2xlYXIgY29kZXMgYXQgdGhlIHJpZ2h0IHRpbWVzIGlzIGEgbWVyZSBtYXR0ZXIgb2YKKyAqIGNvdW50aW5nIG91dHB1dCBzeW1ib2xzIGFuZCBpcyBpbiBubyB3YXkgZGVwZW5kZW50IG9uIHRoZSBMWlcgcGF0ZW50LgorICoKKyAqIFdpdGggYSBzbWFsbCBiYXNpYyBwaXhlbCB3aWR0aCAobG93IGNvbG9yIGNvdW50KSwgQ2xlYXIgY29kZXMgd2lsbCBiZQorICogbmVlZGVkIHZlcnkgZnJlcXVlbnRseSwgY2F1c2luZyB0aGUgZmlsZSB0byBleHBhbmQgZXZlbiBtb3JlLiAgU28gdGhpcworICogc2ltcGxpc3RpYyBhcHByb2FjaCB3b3VsZG4ndCB3b3JrIHRvbyB3ZWxsIG9uIGJpbGV2ZWwgaW1hZ2VzLCBmb3IgZXhhbXBsZS4KKyAqIEJ1dCBmb3Igb3V0cHV0IG9mIEpQRUcgY29udmVyc2lvbnMgdGhlIHBpeGVsIHdpZHRoIHdpbGwgdXN1YWxseSBiZSA4IGJpdHMKKyAqICgxMjkgdG8gMjU2IGNvbG9ycyksIHNvIHRoZSBvdmVyaGVhZCBhZGRlZCBieSBDbGVhciBzeW1ib2xzIGlzIG9ubHkgYWJvdXQKKyAqIG9uZSBzeW1ib2wgaW4gZXZlcnkgMjU2LgorICovCisKK0xPQ0FMKHZvaWQpCitjb21wcmVzc19pbml0IChnaWZfZGVzdF9wdHIgZGluZm8sIGludCBpX2JpdHMpCisvKiBJbml0aWFsaXplIHBzZXVkby1jb21wcmVzc29yICovCit7CisgIC8qIGluaXQgYWxsIHRoZSBzdGF0ZSB2YXJpYWJsZXMgKi8KKyAgZGluZm8tPm5fYml0cyA9IGlfYml0czsKKyAgZGluZm8tPm1heGNvZGUgPSBNQVhDT0RFKGRpbmZvLT5uX2JpdHMpOworICBkaW5mby0+Q2xlYXJDb2RlID0gKDEgPDwgKGlfYml0cyAtIDEpKTsKKyAgZGluZm8tPkVPRkNvZGUgPSBkaW5mby0+Q2xlYXJDb2RlICsgMTsKKyAgZGluZm8tPmNvZGVfY291bnRlciA9IGRpbmZvLT5DbGVhckNvZGUgKyAyOworICAvKiBpbml0IG91dHB1dCBidWZmZXJpbmcgdmFycyAqLworICBkaW5mby0+Ynl0ZXNpbnBrdCA9IDA7CisgIGRpbmZvLT5jdXJfYWNjdW0gPSAwOworICBkaW5mby0+Y3VyX2JpdHMgPSAwOworICAvKiBHSUYgc3BlY2lmaWVzIGFuIGluaXRpYWwgQ2xlYXIgY29kZSAqLworICBvdXRwdXQoZGluZm8sIGRpbmZvLT5DbGVhckNvZGUpOworfQorCisKK0xPQ0FMKHZvaWQpCitjb21wcmVzc19waXhlbCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCBpbnQgYykKKy8qIEFjY2VwdCBhbmQgImNvbXByZXNzIiBvbmUgcGl4ZWwgdmFsdWUuCisgKiBUaGUgZ2l2ZW4gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gbl9iaXRzIHdpZGUuCisgKi8KK3sKKyAgLyogT3V0cHV0IHRoZSBnaXZlbiBwaXhlbCB2YWx1ZSBhcyBhIHN5bWJvbC4gKi8KKyAgb3V0cHV0KGRpbmZvLCBjKTsKKyAgLyogSXNzdWUgQ2xlYXIgY29kZXMgb2Z0ZW4gZW5vdWdoIHRvIGtlZXAgdGhlIHJlYWRlciBmcm9tIHJhdGNoZXRpbmcgdXAKKyAgICogaXRzIHN5bWJvbCBzaXplLgorICAgKi8KKyAgaWYgKGRpbmZvLT5jb2RlX2NvdW50ZXIgPCBkaW5mby0+bWF4Y29kZSkgeworICAgIGRpbmZvLT5jb2RlX2NvdW50ZXIrKzsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXQoZGluZm8sIGRpbmZvLT5DbGVhckNvZGUpOworICAgIGRpbmZvLT5jb2RlX2NvdW50ZXIgPSBkaW5mby0+Q2xlYXJDb2RlICsgMjsJLyogcmVzZXQgdGhlIGNvdW50ZXIgKi8KKyAgfQorfQorCisKK0xPQ0FMKHZvaWQpCitjb21wcmVzc190ZXJtIChnaWZfZGVzdF9wdHIgZGluZm8pCisvKiBDbGVhbiB1cCBhdCBlbmQgKi8KK3sKKyAgLyogU2VuZCBhbiBFT0YgY29kZSAqLworICBvdXRwdXQoZGluZm8sIGRpbmZvLT5FT0ZDb2RlKTsKKyAgLyogRmx1c2ggdGhlIGJpdC1wYWNraW5nIGJ1ZmZlciAqLworICBpZiAoZGluZm8tPmN1cl9iaXRzID4gMCkgeworICAgIENIQVJfT1VUKGRpbmZvLCBkaW5mby0+Y3VyX2FjY3VtICYgMHhGRik7CisgIH0KKyAgLyogRmx1c2ggdGhlIHBhY2tldCBidWZmZXIgKi8KKyAgZmx1c2hfcGFja2V0KGRpbmZvKTsKK30KKworCisvKiBHSUYgaGVhZGVyIGNvbnN0cnVjdGlvbiAqLworCisKK0xPQ0FMKHZvaWQpCitwdXRfd29yZCAoZ2lmX2Rlc3RfcHRyIGRpbmZvLCB1bnNpZ25lZCBpbnQgdykKKy8qIEVtaXQgYSAxNi1iaXQgd29yZCwgTFNCIGZpcnN0ICovCit7CisgIHB1dGModyAmIDB4RkYsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCh3ID4+IDgpICYgMHhGRiwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7Cit9CisKKworTE9DQUwodm9pZCkKK3B1dF8zYnl0ZXMgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IHZhbCkKKy8qIEVtaXQgMyBjb3BpZXMgb2Ygc2FtZSBieXRlIHZhbHVlIC0tLSBoYW5keSBzdWJyIGZvciBjb2xvcm1hcCBjb25zdHJ1Y3Rpb24gKi8KK3sKKyAgcHV0Yyh2YWwsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKHZhbCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGModmFsLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKK30KKworCitMT0NBTCh2b2lkKQorZW1pdF9oZWFkZXIgKGdpZl9kZXN0X3B0ciBkaW5mbywgaW50IG51bV9jb2xvcnMsIEpTQU1QQVJSQVkgY29sb3JtYXApCisvKiBPdXRwdXQgdGhlIEdJRiBmaWxlIGhlYWRlciwgaW5jbHVkaW5nIGNvbG9yIG1hcCAqLworLyogSWYgY29sb3JtYXA9PU5VTEwsIHN5bnRoZXNpemUgYSBncmF5LXNjYWxlIGNvbG9ybWFwICovCit7CisgIGludCBCaXRzUGVyUGl4ZWwsIENvbG9yTWFwU2l6ZSwgSW5pdENvZGVTaXplLCBGbGFnQnl0ZTsKKyAgaW50IGNzaGlmdCA9IGRpbmZvLT5jaW5mby0+ZGF0YV9wcmVjaXNpb24gLSA4OworICBpbnQgaTsKKworICBpZiAobnVtX2NvbG9ycyA+IDI1NikKKyAgICBFUlJFWElUMShkaW5mby0+Y2luZm8sIEpFUlJfVE9PX01BTllfQ09MT1JTLCBudW1fY29sb3JzKTsKKyAgLyogQ29tcHV0ZSBiaXRzL3BpeGVsIGFuZCByZWxhdGVkIHZhbHVlcyAqLworICBCaXRzUGVyUGl4ZWwgPSAxOworICB3aGlsZSAobnVtX2NvbG9ycyA+ICgxIDw8IEJpdHNQZXJQaXhlbCkpCisgICAgQml0c1BlclBpeGVsKys7CisgIENvbG9yTWFwU2l6ZSA9IDEgPDwgQml0c1BlclBpeGVsOworICBpZiAoQml0c1BlclBpeGVsIDw9IDEpCisgICAgSW5pdENvZGVTaXplID0gMjsKKyAgZWxzZQorICAgIEluaXRDb2RlU2l6ZSA9IEJpdHNQZXJQaXhlbDsKKyAgLyoKKyAgICogV3JpdGUgdGhlIEdJRiBoZWFkZXIuCisgICAqIE5vdGUgdGhhdCB3ZSBnZW5lcmF0ZSBhIHBsYWluIEdJRjg3IGhlYWRlciBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LgorICAgKi8KKyAgcHV0YygnRycsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCdJJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoJ0YnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgcHV0YygnOCcsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKCc3JywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisgIHB1dGMoJ2EnLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgLyogV3JpdGUgdGhlIExvZ2ljYWwgU2NyZWVuIERlc2NyaXB0b3IgKi8KKyAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X3dpZHRoKTsKKyAgcHV0X3dvcmQoZGluZm8sICh1bnNpZ25lZCBpbnQpIGRpbmZvLT5jaW5mby0+b3V0cHV0X2hlaWdodCk7CisgIEZsYWdCeXRlID0gMHg4MDsJCS8qIFllcywgdGhlcmUgaXMgYSBnbG9iYWwgY29sb3IgdGFibGUgKi8KKyAgRmxhZ0J5dGUgfD0gKEJpdHNQZXJQaXhlbC0xKSA8PCA0OyAvKiBjb2xvciByZXNvbHV0aW9uICovCisgIEZsYWdCeXRlIHw9IChCaXRzUGVyUGl4ZWwtMSk7CS8qIHNpemUgb2YgZ2xvYmFsIGNvbG9yIHRhYmxlICovCisgIHB1dGMoRmxhZ0J5dGUsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOworICBwdXRjKDAsIGRpbmZvLT5wdWIub3V0cHV0X2ZpbGUpOyAvKiBCYWNrZ3JvdW5kIGNvbG9yIGluZGV4ICovCisgIHB1dGMoMCwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7IC8qIFJlc2VydmVkIChhc3BlY3QgcmF0aW8gaW4gR0lGODkpICovCisgIC8qIFdyaXRlIHRoZSBHbG9iYWwgQ29sb3IgTWFwICovCisgIC8qIElmIHRoZSBjb2xvciBtYXAgaXMgbW9yZSB0aGFuIDggYml0cyBwcmVjaXNpb24sICovCisgIC8qIHdlIHJlZHVjZSBpdCB0byA4IGJpdHMgYnkgc2hpZnRpbmcgKi8KKyAgZm9yIChpPTA7IGkgPCBDb2xvck1hcFNpemU7IGkrKykgeworICAgIGlmIChpIDwgbnVtX2NvbG9ycykgeworICAgICAgaWYgKGNvbG9ybWFwICE9IE5VTEwpIHsKKwlpZiAoZGluZm8tPmNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX1JHQikgeworCSAgLyogTm9ybWFsIGNhc2U6IFJHQiBjb2xvciBtYXAgKi8KKwkgIHB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSkgPj4gY3NoaWZ0LCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKwkgIHB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsxXVtpXSkgPj4gY3NoaWZ0LCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKwkgIHB1dGMoR0VUSlNBTVBMRShjb2xvcm1hcFsyXVtpXSkgPj4gY3NoaWZ0LCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKwl9IGVsc2UgeworCSAgLyogR3JheXNjYWxlICJjb2xvciBtYXAiOiBwb3NzaWJsZSBpZiBxdWFudGl6aW5nIGdyYXlzY2FsZSBpbWFnZSAqLworCSAgcHV0XzNieXRlcyhkaW5mbywgR0VUSlNBTVBMRShjb2xvcm1hcFswXVtpXSkgPj4gY3NoaWZ0KTsKKwl9CisgICAgICB9IGVsc2UgeworCS8qIENyZWF0ZSBhIGdyYXktc2NhbGUgbWFwIG9mIG51bV9jb2xvcnMgdmFsdWVzLCByYW5nZSAwLi4yNTUgKi8KKwlwdXRfM2J5dGVzKGRpbmZvLCAoaSAqIDI1NSArIChudW1fY29sb3JzLTEpLzIpIC8gKG51bV9jb2xvcnMtMSkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiBmaWxsIG91dCB0aGUgbWFwIHRvIGEgcG93ZXIgb2YgMiAqLworICAgICAgcHV0XzNieXRlcyhkaW5mbywgMCk7CisgICAgfQorICB9CisgIC8qIFdyaXRlIGltYWdlIHNlcGFyYXRvciBhbmQgSW1hZ2UgRGVzY3JpcHRvciAqLworICBwdXRjKCcsJywgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7IC8qIHNlcGFyYXRvciAqLworICBwdXRfd29yZChkaW5mbywgMCk7CQkvKiBsZWZ0L3RvcCBvZmZzZXQgKi8KKyAgcHV0X3dvcmQoZGluZm8sIDApOworICBwdXRfd29yZChkaW5mbywgKHVuc2lnbmVkIGludCkgZGluZm8tPmNpbmZvLT5vdXRwdXRfd2lkdGgpOyAvKiBpbWFnZSBzaXplICovCisgIHB1dF93b3JkKGRpbmZvLCAodW5zaWduZWQgaW50KSBkaW5mby0+Y2luZm8tPm91dHB1dF9oZWlnaHQpOworICAvKiBmbGFnIGJ5dGU6IG5vdCBpbnRlcmxhY2VkLCBubyBsb2NhbCBjb2xvciBtYXAgKi8KKyAgcHV0YygweDAwLCBkaW5mby0+cHViLm91dHB1dF9maWxlKTsKKyAgLyogV3JpdGUgSW5pdGlhbCBDb2RlIFNpemUgYnl0ZSAqLworICBwdXRjKEluaXRDb2RlU2l6ZSwgZGluZm8tPnB1Yi5vdXRwdXRfZmlsZSk7CisKKyAgLyogSW5pdGlhbGl6ZSBmb3IgImNvbXByZXNzaW9uIiBvZiBpbWFnZSBkYXRhICovCisgIGNvbXByZXNzX2luaXQoZGluZm8sIEluaXRDb2RlU2l6ZSsxKTsKK30KKworCisvKgorICogU3RhcnR1cDogd3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X2dpZiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIGdpZl9kZXN0X3B0ciBkZXN0ID0gKGdpZl9kZXN0X3B0cikgZGluZm87CisKKyAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgZW1pdF9oZWFkZXIoZGVzdCwgY2luZm8tPmFjdHVhbF9udW1iZXJfb2ZfY29sb3JzLCBjaW5mby0+Y29sb3JtYXApOworICBlbHNlCisgICAgZW1pdF9oZWFkZXIoZGVzdCwgMjU2LCAoSlNBTVBBUlJBWSkgTlVMTCk7Cit9CisKKworLyoKKyAqIFdyaXRlIHNvbWUgcGl4ZWwgZGF0YS4KKyAqIEluIHRoaXMgbW9kdWxlIHJvd3Nfc3VwcGxpZWQgd2lsbCBhbHdheXMgYmUgMS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBnaWZfZGVzdF9wdHIgZGVzdCA9IChnaWZfZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIGZvciAoY29sID0gY2luZm8tPm91dHB1dF93aWR0aDsgY29sID4gMDsgY29sLS0pIHsKKyAgICBjb21wcmVzc19waXhlbChkZXN0LCBHRVRKU0FNUExFKCpwdHIrKykpOworICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF9naWYgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBnaWZfZGVzdF9wdHIgZGVzdCA9IChnaWZfZGVzdF9wdHIpIGRpbmZvOworCisgIC8qIEZsdXNoICJjb21wcmVzc2lvbiIgbWVjaGFuaXNtICovCisgIGNvbXByZXNzX3Rlcm0oZGVzdCk7CisgIC8qIFdyaXRlIGEgemVyby1sZW5ndGggZGF0YSBibG9jayB0byBlbmQgdGhlIHNlcmllcyAqLworICBwdXRjKDAsIGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7CisgIC8qIFdyaXRlIHRoZSBHSUYgdGVybWluYXRvciBtYXJrICovCisgIHB1dGMoJzsnLCBkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGZmbHVzaChkZXN0LT5wdWIub3V0cHV0X2ZpbGUpOworICBpZiAoZmVycm9yKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgR0lGIGZvcm1hdCBvdXRwdXQuCisgKi8KKworR0xPQkFMKGRqcGVnX2Rlc3RfcHRyKQoramluaXRfd3JpdGVfZ2lmIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQoreworICBnaWZfZGVzdF9wdHIgZGVzdDsKKworICAvKiBDcmVhdGUgbW9kdWxlIGludGVyZmFjZSBvYmplY3QsIGZpbGwgaW4gbWV0aG9kIHBvaW50ZXJzICovCisgIGRlc3QgPSAoZ2lmX2Rlc3RfcHRyKQorICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKwkJCQkgIFNJWkVPRihnaWZfZGVzdF9zdHJ1Y3QpKTsKKyAgZGVzdC0+Y2luZm8gPSBjaW5mbzsJCS8qIG1ha2UgYmFjayBsaW5rIGZvciBzdWJyb3V0aW5lcyAqLworICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X2dpZjsKKyAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7CisgIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9naWY7CisKKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX0dSQVlTQ0FMRSAmJgorICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCKQorICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfR0lGX0NPTE9SU1BBQ0UpOworCisgIC8qIEZvcmNlIHF1YW50aXphdGlvbiBpZiBjb2xvciBvciBpZiA+IDggYml0cyBpbnB1dCAqLworICBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfR1JBWVNDQUxFIHx8IGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA+IDgpIHsKKyAgICAvKiBGb3JjZSBxdWFudGl6YXRpb24gdG8gYXQgbW9zdCAyNTYgY29sb3JzICovCisgICAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IFRSVUU7CisgICAgaWYgKGNpbmZvLT5kZXNpcmVkX251bWJlcl9vZl9jb2xvcnMgPiAyNTYpCisgICAgICBjaW5mby0+ZGVzaXJlZF9udW1iZXJfb2ZfY29sb3JzID0gMjU2OworICB9CisKKyAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworCisgIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgIT0gMSkgLyogc2FmZXR5IGNoZWNrOiBqdXN0IG9uZSBjb21wb25lbnQ/ICovCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9HSUZfQlVHKTsKKworICAvKiBDcmVhdGUgZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCisgIGRlc3QtPnB1Yi5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBjaW5mby0+b3V0cHV0X3dpZHRoLCAoSkRJTUVOU0lPTikgMSk7CisgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKworICByZXR1cm4gKGRqcGVnX2Rlc3RfcHRyKSBkZXN0OworfQorCisjZW5kaWYgLyogR0lGX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dyanBnY29tLjEgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JqcGdjb20uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE5YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dyanBnY29tLjEKQEAgLTAsMCArMSwxMDMgQEAKKy5USCBXUkpQR0NPTSAxICIxNSBKdW5lIDE5OTUiCisuU0ggTkFNRQord3JqcGdjb20gXC0gaW5zZXJ0IHRleHQgY29tbWVudHMgaW50byBhIEpQRUcgZmlsZQorLlNIIFNZTk9QU0lTCisuQiB3cmpwZ2NvbQorWworLkIgXC1yZXBsYWNlCitdCitbCisuQkkgXC1jb21tZW50ICIgdGV4dCIKK10KK1sKKy5CSSBcLWNmaWxlICIgbmFtZSIKK10KK1sKKy5JIGZpbGVuYW1lCitdCisuTFAKKy5TSCBERVNDUklQVElPTgorLkxQCisuQiB3cmpwZ2NvbQorcmVhZHMgdGhlIG5hbWVkIEpQRUcvSkZJRiBmaWxlLCBvciB0aGUgc3RhbmRhcmQgaW5wdXQgaWYgbm8gZmlsZSBpcyBuYW1lZCwKK2FuZCBnZW5lcmF0ZXMgYSBuZXcgSlBFRy9KRklGIGZpbGUgb24gc3RhbmRhcmQgb3V0cHV0LiAgQSBjb21tZW50IGJsb2NrIGlzCithZGRlZCB0byB0aGUgZmlsZS4KKy5QUAorVGhlIEpQRUcgc3RhbmRhcmQgYWxsb3dzICJjb21tZW50IiAoQ09NKSBibG9ja3MgdG8gb2NjdXIgd2l0aGluIGEgSlBFRyBmaWxlLgorQWx0aG91Z2ggdGhlIHN0YW5kYXJkIGRvZXNuJ3QgYWN0dWFsbHkgZGVmaW5lIHdoYXQgQ09NIGJsb2NrcyBhcmUgZm9yLCB0aGV5CithcmUgd2lkZWx5IHVzZWQgdG8gaG9sZCB1c2VyLXN1cHBsaWVkIHRleHQgc3RyaW5ncy4gIFRoaXMgbGV0cyB5b3UgYWRkCithbm5vdGF0aW9ucywgdGl0bGVzLCBpbmRleCB0ZXJtcywgZXRjIHRvIHlvdXIgSlBFRyBmaWxlcywgYW5kIGxhdGVyIHJldHJpZXZlCit0aGVtIGFzIHRleHQuICBDT00gYmxvY2tzIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUgaW1hZ2Ugc3RvcmVkIGluIHRoZSBKUEVHCitmaWxlLiAgVGhlIG1heGltdW0gc2l6ZSBvZiBhIENPTSBibG9jayBpcyA2NEssIGJ1dCB5b3UgY2FuIGhhdmUgYXMgbWFueSBvZgordGhlbSBhcyB5b3UgbGlrZSBpbiBvbmUgSlBFRyBmaWxlLgorLlBQCisuQiB3cmpwZ2NvbQorYWRkcyBhIENPTSBibG9jaywgY29udGFpbmluZyB0ZXh0IHlvdSBwcm92aWRlLCB0byBhIEpQRUcgZmlsZS4KK09yZGluYXJpbHksIHRoZSBDT00gYmxvY2sgaXMgYWRkZWQgYWZ0ZXIgYW55IGV4aXN0aW5nIENPTSBibG9ja3M7IGJ1dCB5b3UKK2NhbiBkZWxldGUgdGhlIG9sZCBDT00gYmxvY2tzIGlmIHlvdSB3aXNoLgorLlNIIE9QVElPTlMKK1N3aXRjaCBuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQsIGFuZCBhcmUgbm90IGNhc2Ugc2Vuc2l0aXZlLgorLlRQCisuQiBcLXJlcGxhY2UKK0RlbGV0ZSBhbnkgZXhpc3RpbmcgQ09NIGJsb2NrcyBmcm9tIHRoZSBmaWxlLgorLlRQCisuQkkgXC1jb21tZW50ICIgdGV4dCIKK1N1cHBseSB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIG9uIGNvbW1hbmQgbGluZS4KKy5UUAorLkJJIFwtY2ZpbGUgIiBuYW1lIgorUmVhZCB0ZXh0IGZvciBuZXcgQ09NIGJsb2NrIGZyb20gbmFtZWQgZmlsZS4KKy5QUAorSWYgeW91IGhhdmUgb25seSBvbmUgbGluZSBvZiBjb21tZW50IHRleHQgdG8gYWRkLCB5b3UgY2FuIHByb3ZpZGUgaXQgb24gdGhlCitjb21tYW5kIGxpbmUgd2l0aAorLkJSIFwtY29tbWVudCAuCitUaGUgY29tbWVudCB0ZXh0IG11c3QgYmUgc3Vycm91bmRlZCB3aXRoIHF1b3RlcyBzbyB0aGF0IGl0IGlzIHRyZWF0ZWQgYXMgYQorc2luZ2xlIGFyZ3VtZW50LiAgTG9uZ2VyIGNvbW1lbnRzIGNhbiBiZSByZWFkIGZyb20gYSB0ZXh0IGZpbGUuCisuUFAKK0lmIHlvdSBnaXZlIG5laXRoZXIKKy5CIFwtY29tbWVudAorbm9yCisuQlIgXC1jZmlsZSAsCit0aGVuCisuQiB3cmpwZ2NvbQord2lsbCByZWFkIHRoZSBjb21tZW50IHRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChJbiB0aGlzIGNhc2UgYW4gaW5wdXQgaW1hZ2UKK2ZpbGUgbmFtZSBNVVNUIGJlIHN1cHBsaWVkLCBzbyB0aGF0IHRoZSBzb3VyY2UgSlBFRyBmaWxlIGNvbWVzIGZyb20gc29tZXdoZXJlCitlbHNlLikgIFlvdSBjYW4gZW50ZXIgbXVsdGlwbGUgbGluZXMsIHVwIHRvIDY0S0Igd29ydGguICBUeXBlIGFuIGVuZC1vZi1maWxlCitpbmRpY2F0b3IgKHVzdWFsbHkgY29udHJvbC1EKSB0byB0ZXJtaW5hdGUgdGhlIGNvbW1lbnQgdGV4dCBlbnRyeS4KKy5QUAorLkIgd3JqcGdjb20KK3dpbGwgbm90IGFkZCBhIENPTSBibG9jayBpZiB0aGUgcHJvdmlkZWQgY29tbWVudCBzdHJpbmcgaXMgZW1wdHkuICBUaGVyZWZvcmUKK1xmQlwtcmVwbGFjZSBcLWNvbW1lbnQgIiJcZlIgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIGFsbCBDT00gYmxvY2tzIGZyb20gYSBmaWxlLgorLlNIIEVYQU1QTEVTCisuTFAKK0FkZCBhIHNob3J0IGNvbW1lbnQgdG8gaW4uanBnLCBwcm9kdWNpbmcgb3V0LmpwZzoKKy5JUAorLkIgd3JqcGdjb20gXC1jCitcZkkiVmlldyBvZiBteSBiYWNrIHlhcmQiIGluLmpwZworLkIgPgorLkkgb3V0LmpwZworLlBQCitBdHRhY2ggYSBsb25nIGNvbW1lbnQgcHJldmlvdXNseSBzdG9yZWQgaW4gY29tbWVudC50eHQ6CisuSVAKKy5CIHdyanBnY29tCisuSSBpbi5qcGcKKy5CIDwKKy5JIGNvbW1lbnQudHh0CisuQiA+CisuSSBvdXQuanBnCisuUFAKK29yIGVxdWl2YWxlbnRseQorLklQCisuQiB3cmpwZ2NvbQorLkIgLWNmaWxlCisuSSBjb21tZW50LnR4dAorLkIgPAorLkkgaW4uanBnCisuQiA+CisuSSBvdXQuanBnCisuU0ggU0VFIEFMU08KKy5CUiBjanBlZyAoMSksCisuQlIgZGpwZWcgKDEpLAorLkJSIGpwZWd0cmFuICgxKSwKKy5CUiByZGpwZ2NvbSAoMSkKKy5TSCBBVVRIT1IKK0luZGVwZW5kZW50IEpQRUcgR3JvdXAKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cmpwZ2NvbS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dyanBnY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNGIwNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cmpwZ2NvbS5jCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogd3JqcGdjb20uYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgdmVyeSBzaW1wbGUgc3RhbmQtYWxvbmUgYXBwbGljYXRpb24gdGhhdCBpbnNlcnRzCisgKiB1c2VyLXN1cHBsaWVkIHRleHQgYXMgYSBDT00gKGNvbW1lbnQpIG1hcmtlciBpbiBhIEpGSUYgZmlsZS4KKyAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBhcyBhbiBleGFtcGxlIG9mIHRoZSBtaW5pbXVtIGxvZ2ljIG5lZWRlZCB0byBwYXJzZQorICogSlBFRyBtYXJrZXJzLgorICovCisKKyNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiB0byBnZXQgdGhlIGNvbW1hbmQtbGluZSBjb25maWcgc3ltYm9scyAqLworI2luY2x1ZGUgImppbmNsdWRlLmgiCQkvKiBnZXQgYXV0by1jb25maWcgc3ltYm9scywgPHN0ZGlvLmg+ICovCisKKyNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBtYWxsb2MoKSAqLworZXh0ZXJuIHZvaWQgKiBtYWxsb2MgKCk7CisjZW5kaWYKKyNpbmNsdWRlIDxjdHlwZS5oPgkJLyogdG8gZGVjbGFyZSBpc3VwcGVyKCksIHRvbG93ZXIoKSAqLworI2lmZGVmIFVTRV9TRVRNT0RFCisjaW5jbHVkZSA8ZmNudGwuaD4JCS8qIHRvIGRlY2xhcmUgc2V0bW9kZSgpJ3MgcGFyYW1ldGVyIG1hY3JvcyAqLworLyogSWYgeW91IGhhdmUgc2V0bW9kZSgpIGJ1dCBub3QgPGlvLmg+LCBqdXN0IGRlbGV0ZSB0aGlzIGxpbmU6ICovCisjaW5jbHVkZSA8aW8uaD4JCQkvKiB0byBkZWNsYXJlIHNldG1vZGUoKSAqLworI2VuZGlmCisKKyNpZmRlZiBVU0VfQ0NPTU1BTkQJCS8qIGNvbW1hbmQtbGluZSByZWFkZXIgZm9yIE1hY2ludG9zaCAqLworI2lmZGVmIF9fTVdFUktTX18KKyNpbmNsdWRlIDxTSU9VWC5oPiAgICAgICAgICAgICAgLyogTWV0cm93ZXJrcyBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogLi4uIGFuZCB0aGlzICovCisjZW5kaWYKKyNpZmRlZiBUSElOS19DCisjaW5jbHVkZSA8Y29uc29sZS5oPgkJLyogVGhpbmsgZGVjbGFyZXMgaXQgaGVyZSAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERPTlRfVVNFX0JfTU9ERQkJLyogZGVmaW5lIG1vZGUgcGFyYW1ldGVycyBmb3IgZm9wZW4oKSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkiciIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3IgorI2Vsc2UKKyNpZmRlZiBWTVMJCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiLCAiY3R4PXN0bSIKKyNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIsICJjdHg9c3RtIgorI2Vsc2UJCQkJLyogc3RhbmRhcmQgQU5TSS1jb21wbGlhbnQgY2FzZSAqLworI2RlZmluZSBSRUFEX0JJTkFSWQkicmIiCisjZGVmaW5lIFdSSVRFX0JJTkFSWQkid2IiCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEVYSVRfRkFJTFVSRQkJLyogZGVmaW5lIGV4aXQoKSBjb2RlcyBpZiBub3QgcHJvdmlkZWQgKi8KKyNkZWZpbmUgRVhJVF9GQUlMVVJFICAxCisjZW5kaWYKKyNpZm5kZWYgRVhJVF9TVUNDRVNTCisjaWZkZWYgVk1TCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMQkJLyogVk1TIGlzIHZlcnkgbm9uc3RhbmRhcmQgKi8KKyNlbHNlCisjZGVmaW5lIEVYSVRfU1VDQ0VTUyAgMAorI2VuZGlmCisjZW5kaWYKKworLyogUmVkdWNlIHRoaXMgdmFsdWUgaWYgeW91ciBtYWxsb2MoKSBjYW4ndCBhbGxvY2F0ZSBibG9ja3MgdXAgdG8gNjRLLgorICogT24gRE9TLCBjb21waWxpbmcgaW4gbGFyZ2UgbW9kZWwgaXMgdXN1YWxseSBhIGJldHRlciBzb2x1dGlvbi4KKyAqLworCisjaWZuZGVmIE1BWF9DT01fTEVOR1RICisjZGVmaW5lIE1BWF9DT01fTEVOR1RIIDY1MDAwTAkvKiBtdXN0IGJlIDw9IDY1NTMzIGluIGFueSBjYXNlICovCisjZW5kaWYKKworCisvKgorICogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIHJlYWQgdGhlIGlucHV0IGZpbGUgYW5kIHdyaXRlIHRoZSBvdXRwdXQgZmlsZS4KKyAqIFRvIHJldXNlIHRoaXMgY29kZSBpbiBhbm90aGVyIGFwcGxpY2F0aW9uLCB5b3UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlc2UuCisgKi8KKworc3RhdGljIEZJTEUgKiBpbmZpbGU7CQkvKiBpbnB1dCBKUEVHIGZpbGUgKi8KKworLyogUmV0dXJuIG5leHQgaW5wdXQgYnl0ZSwgb3IgRU9GIGlmIG5vIG1vcmUgKi8KKyNkZWZpbmUgTkVYVEJZVEUoKSAgZ2V0YyhpbmZpbGUpCisKK3N0YXRpYyBGSUxFICogb3V0ZmlsZTsJCS8qIG91dHB1dCBKUEVHIGZpbGUgKi8KKworLyogRW1pdCBhbiBvdXRwdXQgYnl0ZSAqLworI2RlZmluZSBQVVRCWVRFKHgpICBwdXRjKCh4KSwgb3V0ZmlsZSkKKworCisvKiBFcnJvciBleGl0IGhhbmRsZXIgKi8KKyNkZWZpbmUgRVJSRVhJVChtc2cpICAoZnByaW50ZihzdGRlcnIsICIlc1xuIiwgbXNnKSwgZXhpdChFWElUX0ZBSUxVUkUpKQorCisKKy8qIFJlYWQgb25lIGJ5dGUsIHRlc3RpbmcgZm9yIEVPRiAqLworc3RhdGljIGludAorcmVhZF8xX2J5dGUgKHZvaWQpCit7CisgIGludCBjOworCisgIGMgPSBORVhUQllURSgpOworICBpZiAoYyA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuIGM7Cit9CisKKy8qIFJlYWQgMiBieXRlcywgY29udmVydCB0byB1bnNpZ25lZCBpbnQgKi8KKy8qIEFsbCAyLWJ5dGUgcXVhbnRpdGllcyBpbiBKUEVHIG1hcmtlcnMgYXJlIE1TQiBmaXJzdCAqLworc3RhdGljIHVuc2lnbmVkIGludAorcmVhZF8yX2J5dGVzICh2b2lkKQoreworICBpbnQgYzEsIGMyOworCisgIGMxID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMxID09IEVPRikKKyAgICBFUlJFWElUKCJQcmVtYXR1cmUgRU9GIGluIEpQRUcgZmlsZSIpOworICBjMiA9IE5FWFRCWVRFKCk7CisgIGlmIChjMiA9PSBFT0YpCisgICAgRVJSRVhJVCgiUHJlbWF0dXJlIEVPRiBpbiBKUEVHIGZpbGUiKTsKKyAgcmV0dXJuICgoKHVuc2lnbmVkIGludCkgYzEpIDw8IDgpICsgKCh1bnNpZ25lZCBpbnQpIGMyKTsKK30KKworCisvKiBSb3V0aW5lcyB0byB3cml0ZSBkYXRhIHRvIG91dHB1dCBmaWxlICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV8xX2J5dGUgKGludCBjKQoreworICBQVVRCWVRFKGMpOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfMl9ieXRlcyAodW5zaWduZWQgaW50IHZhbCkKK3sKKyAgUFVUQllURSgodmFsID4+IDgpICYgMHhGRik7CisgIFBVVEJZVEUodmFsICYgMHhGRik7Cit9CisKK3N0YXRpYyB2b2lkCit3cml0ZV9tYXJrZXIgKGludCBtYXJrZXIpCit7CisgIFBVVEJZVEUoMHhGRik7CisgIFBVVEJZVEUobWFya2VyKTsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfcmVzdF9vZl9maWxlICh2b2lkKQoreworICBpbnQgYzsKKworICB3aGlsZSAoKGMgPSBORVhUQllURSgpKSAhPSBFT0YpCisgICAgUFVUQllURShjKTsKK30KKworCisvKgorICogSlBFRyBtYXJrZXJzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgMHhGRiBieXRlcywgZm9sbG93ZWQgYnkgYSBtYXJrZXIKKyAqIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKKyAqIGluIHRoaXMgcHJvZ3JhbS4gIChTZWUgamRtYXJrZXIuYyBmb3IgYSBtb3JlIGNvbXBsZXRlIGxpc3QuKQorICovCisKKyNkZWZpbmUgTV9TT0YwICAweEMwCQkvKiBTdGFydCBPZiBGcmFtZSBOICovCisjZGVmaW5lIE1fU09GMSAgMHhDMQkJLyogTiBpbmRpY2F0ZXMgd2hpY2ggY29tcHJlc3Npb24gcHJvY2VzcyAqLworI2RlZmluZSBNX1NPRjIgIDB4QzIJCS8qIE9ubHkgU09GMC1TT0YyIGFyZSBub3cgaW4gY29tbW9uIHVzZSAqLworI2RlZmluZSBNX1NPRjMgIDB4QzMKKyNkZWZpbmUgTV9TT0Y1ICAweEM1CQkvKiBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMgKi8KKyNkZWZpbmUgTV9TT0Y2ICAweEM2CisjZGVmaW5lIE1fU09GNyAgMHhDNworI2RlZmluZSBNX1NPRjkgIDB4QzkKKyNkZWZpbmUgTV9TT0YxMCAweENBCisjZGVmaW5lIE1fU09GMTEgMHhDQgorI2RlZmluZSBNX1NPRjEzIDB4Q0QKKyNkZWZpbmUgTV9TT0YxNCAweENFCisjZGVmaW5lIE1fU09GMTUgMHhDRgorI2RlZmluZSBNX1NPSSAgIDB4RDgJCS8qIFN0YXJ0IE9mIEltYWdlIChiZWdpbm5pbmcgb2YgZGF0YXN0cmVhbSkgKi8KKyNkZWZpbmUgTV9FT0kgICAweEQ5CQkvKiBFbmQgT2YgSW1hZ2UgKGVuZCBvZiBkYXRhc3RyZWFtKSAqLworI2RlZmluZSBNX1NPUyAgIDB4REEJCS8qIFN0YXJ0IE9mIFNjYW4gKGJlZ2lucyBjb21wcmVzc2VkIGRhdGEpICovCisjZGVmaW5lIE1fQ09NICAgMHhGRQkJLyogQ09NbWVudCAqLworCisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyIGFuZCByZXR1cm4gaXRzIG1hcmtlciBjb2RlLgorICogV2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBGRiBieXRlLCBwb3NzaWJseSBtb3JlIGlmIHRoZSBjb21wcmVzc29yIHVzZWQgRkZzCisgKiB0byBwYWQgdGhlIGZpbGUuICAoUGFkZGluZyBGRnMgd2lsbCBOT1QgYmUgcmVwbGljYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuKQorICogVGhlcmUgY291bGQgYWxzbyBiZSBub24tRkYgZ2FyYmFnZSBiZXR3ZWVuIG1hcmtlcnMuICBUaGUgdHJlYXRtZW50IG9mIHN1Y2gKKyAqIGdhcmJhZ2UgaXMgdW5zcGVjaWZpZWQ7IHdlIGNob29zZSB0byBza2lwIG92ZXIgaXQgYnV0IGVtaXQgYSB3YXJuaW5nIG1zZy4KKyAqIE5COiB0aGlzIHJvdXRpbmUgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBzZWVpbmcgU09TIG1hcmtlciwgc2luY2UgaXQgd2lsbAorICogbm90IGRlYWwgY29ycmVjdGx5IHdpdGggRkYvMDAgc2VxdWVuY2VzIGluIHRoZSBjb21wcmVzc2VkIGltYWdlIGRhdGEuLi4KKyAqLworCitzdGF0aWMgaW50CituZXh0X21hcmtlciAodm9pZCkKK3sKKyAgaW50IGM7CisgIGludCBkaXNjYXJkZWRfYnl0ZXMgPSAwOworCisgIC8qIEZpbmQgMHhGRiBieXRlOyBjb3VudCBhbmQgc2tpcCBhbnkgbm9uLUZGcy4gKi8KKyAgYyA9IHJlYWRfMV9ieXRlKCk7CisgIHdoaWxlIChjICE9IDB4RkYpIHsKKyAgICBkaXNjYXJkZWRfYnl0ZXMrKzsKKyAgICBjID0gcmVhZF8xX2J5dGUoKTsKKyAgfQorICAvKiBHZXQgbWFya2VyIGNvZGUgYnl0ZSwgc3dhbGxvd2luZyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzCisgICAqIGFyZSBsZWdhbCBhcyBwYWQgYnl0ZXMsIHNvIGRvbid0IGNvdW50IHRoZW0gaW4gZGlzY2FyZGVkX2J5dGVzLgorICAgKi8KKyAgZG8geworICAgIGMgPSByZWFkXzFfYnl0ZSgpOworICB9IHdoaWxlIChjID09IDB4RkYpOworCisgIGlmIChkaXNjYXJkZWRfYnl0ZXMgIT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogZ2FyYmFnZSBkYXRhIGZvdW5kIGluIEpQRUcgZmlsZVxuIik7CisgIH0KKworICByZXR1cm4gYzsKK30KKworCisvKgorICogUmVhZCB0aGUgaW5pdGlhbCBtYXJrZXIsIHdoaWNoIHNob3VsZCBiZSBTT0kuCisgKiBGb3IgYSBKRklGIGZpbGUsIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGZpbGUgc2hvdWxkIGJlIGxpdGVyYWxseQorICogMHhGRiBNX1NPSS4gIFRvIGJlIG1vcmUgZ2VuZXJhbCwgd2UgY291bGQgdXNlIG5leHRfbWFya2VyLCBidXQgaWYgdGhlCisgKiBpbnB1dCBmaWxlIHdlcmVuJ3QgYWN0dWFsbHkgSlBFRyBhdCBhbGwsIG5leHRfbWFya2VyIG1pZ2h0IHJlYWQgdGhlIHdob2xlCisgKiBmaWxlIGFuZCB0aGVuIHJldHVybiBhIG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZS4uLgorICovCisKK3N0YXRpYyBpbnQKK2ZpcnN0X21hcmtlciAodm9pZCkKK3sKKyAgaW50IGMxLCBjMjsKKworICBjMSA9IE5FWFRCWVRFKCk7CisgIGMyID0gTkVYVEJZVEUoKTsKKyAgaWYgKGMxICE9IDB4RkYgfHwgYzIgIT0gTV9TT0kpCisgICAgRVJSRVhJVCgiTm90IGEgSlBFRyBmaWxlIik7CisgIHJldHVybiBjMjsKK30KKworCisvKgorICogTW9zdCB0eXBlcyBvZiBtYXJrZXIgYXJlIGZvbGxvd2VkIGJ5IGEgdmFyaWFibGUtbGVuZ3RoIHBhcmFtZXRlciBzZWdtZW50LgorICogVGhpcyByb3V0aW5lIHNraXBzIG92ZXIgdGhlIHBhcmFtZXRlcnMgZm9yIGFueSBtYXJrZXIgd2UgZG9uJ3Qgb3RoZXJ3aXNlCisgKiB3YW50IHRvIHByb2Nlc3MuCisgKiBOb3RlIHRoYXQgd2UgTVVTVCBza2lwIHRoZSBwYXJhbWV0ZXIgc2VnbWVudCBleHBsaWNpdGx5IGluIG9yZGVyIG5vdCB0bworICogYmUgZm9vbGVkIGJ5IDB4RkYgYnl0ZXMgdGhhdCBtaWdodCBhcHBlYXIgd2l0aGluIHRoZSBwYXJhbWV0ZXIgc2VnbWVudDsKKyAqIHN1Y2ggYnl0ZXMgZG8gTk9UIGludHJvZHVjZSBuZXcgbWFya2Vycy4KKyAqLworCitzdGF0aWMgdm9pZAorY29weV92YXJpYWJsZSAodm9pZCkKKy8qIENvcHkgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KK3sKKyAgdW5zaWduZWQgaW50IGxlbmd0aDsKKworICAvKiBHZXQgdGhlIG1hcmtlciBwYXJhbWV0ZXIgbGVuZ3RoIGNvdW50ICovCisgIGxlbmd0aCA9IHJlYWRfMl9ieXRlcygpOworICB3cml0ZV8yX2J5dGVzKGxlbmd0aCk7CisgIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLworICBpZiAobGVuZ3RoIDwgMikKKyAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7CisgIGxlbmd0aCAtPSAyOworICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgIHdyaXRlXzFfYnl0ZShyZWFkXzFfYnl0ZSgpKTsKKyAgICBsZW5ndGgtLTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAorc2tpcF92YXJpYWJsZSAodm9pZCkKKy8qIFNraXAgb3ZlciBhbiB1bmtub3duIG9yIHVuaW50ZXJlc3RpbmcgdmFyaWFibGUtbGVuZ3RoIG1hcmtlciAqLworeworICB1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisgIC8qIEdldCB0aGUgbWFya2VyIHBhcmFtZXRlciBsZW5ndGggY291bnQgKi8KKyAgbGVuZ3RoID0gcmVhZF8yX2J5dGVzKCk7CisgIC8qIExlbmd0aCBpbmNsdWRlcyBpdHNlbGYsIHNvIG11c3QgYmUgYXQgbGVhc3QgMiAqLworICBpZiAobGVuZ3RoIDwgMikKKyAgICBFUlJFWElUKCJFcnJvbmVvdXMgSlBFRyBtYXJrZXIgbGVuZ3RoIik7CisgIGxlbmd0aCAtPSAyOworICAvKiBTa2lwIG92ZXIgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICh2b2lkKSByZWFkXzFfYnl0ZSgpOworICAgIGxlbmd0aC0tOworICB9Cit9CisKKworLyoKKyAqIFBhcnNlIHRoZSBtYXJrZXIgc3RyZWFtIHVudGlsIFNPRm4gb3IgRU9JIGlzIHNlZW47CisgKiBjb3B5IGRhdGEgdG8gb3V0cHV0LCBidXQgZGlzY2FyZCBDT00gbWFya2VycyB1bmxlc3Mga2VlcF9DT00gaXMgdHJ1ZS4KKyAqLworCitzdGF0aWMgaW50CitzY2FuX0pQRUdfaGVhZGVyIChpbnQga2VlcF9DT00pCit7CisgIGludCBtYXJrZXI7CisKKyAgLyogRXhwZWN0IFNPSSBhdCBzdGFydCBvZiBmaWxlICovCisgIGlmIChmaXJzdF9tYXJrZXIoKSAhPSBNX1NPSSkKKyAgICBFUlJFWElUKCJFeHBlY3RlZCBTT0kgbWFya2VyIGZpcnN0Iik7CisgIHdyaXRlX21hcmtlcihNX1NPSSk7CisKKyAgLyogU2NhbiBtaXNjZWxsYW5lb3VzIG1hcmtlcnMgdW50aWwgd2UgcmVhY2ggU09Gbi4gKi8KKyAgZm9yICg7OykgeworICAgIG1hcmtlciA9IG5leHRfbWFya2VyKCk7CisgICAgc3dpdGNoIChtYXJrZXIpIHsKKyAgICAgIC8qIE5vdGUgdGhhdCBtYXJrZXIgY29kZXMgMHhDNCwgMHhDOCwgMHhDQyBhcmUgbm90LCBhbmQgbXVzdCBub3QgYmUsCisgICAgICAgKiB0cmVhdGVkIGFzIFNPRm4uICBDNCBpbiBwYXJ0aWN1bGFyIGlzIGFjdHVhbGx5IERIVC4KKyAgICAgICAqLworICAgIGNhc2UgTV9TT0YwOgkJLyogQmFzZWxpbmUgKi8KKyAgICBjYXNlIE1fU09GMToJCS8qIEV4dGVuZGVkIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GMjoJCS8qIFByb2dyZXNzaXZlLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjM6CQkvKiBMb3NzbGVzcywgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y1OgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIEh1ZmZtYW4gKi8KKyAgICBjYXNlIE1fU09GNjoJCS8qIERpZmZlcmVudGlhbCBwcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLworICAgIGNhc2UgTV9TT0Y3OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBIdWZmbWFuICovCisgICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjEwOgkJLyogUHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KKyAgICBjYXNlIE1fU09GMTE6CQkvKiBMb3NzbGVzcywgYXJpdGhtZXRpYyAqLworICAgIGNhc2UgTV9TT0YxMzoJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE0OgkJLyogRGlmZmVyZW50aWFsIHByb2dyZXNzaXZlLCBhcml0aG1ldGljICovCisgICAgY2FzZSBNX1NPRjE1OgkJLyogRGlmZmVyZW50aWFsIGxvc3NsZXNzLCBhcml0aG1ldGljICovCisgICAgICByZXR1cm4gbWFya2VyOworCisgICAgY2FzZSBNX1NPUzoJCQkvKiBzaG91bGQgbm90IHNlZSBjb21wcmVzc2VkIGRhdGEgYmVmb3JlIFNPRiAqLworICAgICAgRVJSRVhJVCgiU09TIHdpdGhvdXQgcHJpb3IgU09GbiIpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1fRU9JOgkJCS8qIGluIGNhc2UgaXQncyBhIHRhYmxlcy1vbmx5IEpQRUcgc3RyZWFtICovCisgICAgICByZXR1cm4gbWFya2VyOworCisgICAgY2FzZSBNX0NPTToJCQkvKiBFeGlzdGluZyBDT006IGNvbmRpdGlvbmFsbHkgZGlzY2FyZCAqLworICAgICAgaWYgKGtlZXBfQ09NKSB7CisJd3JpdGVfbWFya2VyKG1hcmtlcik7CisJY29weV92YXJpYWJsZSgpOworICAgICAgfSBlbHNlIHsKKwlza2lwX3ZhcmlhYmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CQkJLyogQW55dGhpbmcgZWxzZSBqdXN0IGdldHMgY29waWVkICovCisgICAgICB3cml0ZV9tYXJrZXIobWFya2VyKTsKKyAgICAgIGNvcHlfdmFyaWFibGUoKTsJCS8qIHdlIGFzc3VtZSBpdCBoYXMgYSBwYXJhbWV0ZXIgY291bnQuLi4gKi8KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSAvKiBlbmQgbG9vcCAqLworfQorCisKKy8qIENvbW1hbmQgbGluZSBwYXJzaW5nIGNvZGUgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBwcm9nbmFtZTsJLyogcHJvZ3JhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLworCisKK3N0YXRpYyB2b2lkCit1c2FnZSAodm9pZCkKKy8qIGNvbXBsYWluIGFib3V0IGJhZCBjb21tYW5kIGxpbmUgKi8KK3sKKyAgZnByaW50ZihzdGRlcnIsICJ3cmpwZ2NvbSBpbnNlcnRzIGEgdGV4dHVhbCBjb21tZW50IGluIGEgSlBFRyBmaWxlLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBhZGQgdG8gb3IgcmVwbGFjZSBhbnkgZXhpc3RpbmcgY29tbWVudChzKS5cbiIpOworCisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFtzd2l0Y2hlc10gIiwgcHJvZ25hbWUpOworI2lmZGVmIFRXT19GSUxFX0NPTU1BTkRMSU5FCisgIGZwcmludGYoc3RkZXJyLCAiaW5wdXRmaWxlIG91dHB1dGZpbGVcbiIpOworI2Vsc2UKKyAgZnByaW50ZihzdGRlcnIsICJbaW5wdXRmaWxlXVxuIik7CisjZW5kaWYKKworICBmcHJpbnRmKHN0ZGVyciwgIlN3aXRjaGVzIChuYW1lcyBtYXkgYmUgYWJicmV2aWF0ZWQpOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcmVwbGFjZSAgICAgICAgIERlbGV0ZSBhbnkgZXhpc3RpbmcgY29tbWVudHNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWNvbW1lbnQgXCJ0ZXh0XCIgIEluc2VydCBjb21tZW50IHdpdGggZ2l2ZW4gdGV4dFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtY2ZpbGUgbmFtZSAgICAgIFJlYWQgY29tbWVudCBmcm9tIG5hbWVkIGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk5vdGljZSB0aGF0IHlvdSBtdXN0IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBjb21tZW50IHRleHRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIndoZW4geW91IHVzZSAtY29tbWVudC5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIklmIHlvdSBkbyBub3QgZ2l2ZSBlaXRoZXIgLWNvbW1lbnQgb3IgLWNmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJ0aGVuIHRoZSBjb21tZW50IHRleHQgaXMgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0LlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiSXQgY2FuIGJlIG11bHRpcGxlIGxpbmVzLCB1cCB0byAldSBjaGFyYWN0ZXJzIHRvdGFsLlxuIiwKKwkgICh1bnNpZ25lZCBpbnQpIE1BWF9DT01fTEVOR1RIKTsKKyNpZm5kZWYgVFdPX0ZJTEVfQ09NTUFORExJTkUKKyAgZnByaW50ZihzdGRlcnIsICJZb3UgbXVzdCBzcGVjaWZ5IGFuIGlucHV0IEpQRUcgZmlsZSBuYW1lIHdoZW4gc3VwcGx5aW5nXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJjb21tZW50IHRleHQgZnJvbSBzdGFuZGFyZCBpbnB1dC5cbiIpOworI2VuZGlmCisKKyAgZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisKK3N0YXRpYyBpbnQKK2tleW1hdGNoIChjaGFyICogYXJnLCBjb25zdCBjaGFyICoga2V5d29yZCwgaW50IG1pbmNoYXJzKQorLyogQ2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZyBvZiAocG9zc2libHkgYWJicmV2aWF0ZWQpIGtleXdvcmQgc3dpdGNoZXMuICovCisvKiBrZXl3b3JkIGlzIHRoZSBjb25zdGFudCBrZXl3b3JkIChtdXN0IGJlIGxvd2VyIGNhc2UgYWxyZWFkeSksICovCisvKiBtaW5jaGFycyBpcyBsZW5ndGggb2YgbWluaW11bSBsZWdhbCBhYmJyZXZpYXRpb24uICovCit7CisgIHJlZ2lzdGVyIGludCBjYSwgY2s7CisgIHJlZ2lzdGVyIGludCBubWF0Y2hlZCA9IDA7CisKKyAgd2hpbGUgKChjYSA9ICphcmcrKykgIT0gJ1wwJykgeworICAgIGlmICgoY2sgPSAqa2V5d29yZCsrKSA9PSAnXDAnKQorICAgICAgcmV0dXJuIDA7CQkJLyogYXJnIGxvbmdlciB0aGFuIGtleXdvcmQsIG5vIGdvb2QgKi8KKyAgICBpZiAoaXN1cHBlcihjYSkpCQkvKiBmb3JjZSBhcmcgdG8gbGNhc2UgKGFzc3VtZSBjayBpcyBhbHJlYWR5KSAqLworICAgICAgY2EgPSB0b2xvd2VyKGNhKTsKKyAgICBpZiAoY2EgIT0gY2spCisgICAgICByZXR1cm4gMDsJCQkvKiBubyBnb29kICovCisgICAgbm1hdGNoZWQrKzsJCQkvKiBjb3VudCBtYXRjaGVkIGNoYXJhY3RlcnMgKi8KKyAgfQorICAvKiByZWFjaGVkIGVuZCBvZiBhcmd1bWVudDsgZmFpbCBpZiBpdCdzIHRvbyBzaG9ydCBmb3IgdW5pcXVlIGFiYnJldiAqLworICBpZiAobm1hdGNoZWQgPCBtaW5jaGFycykKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7CQkJLyogQS1PSyAqLworfQorCisKKy8qCisgKiBUaGUgbWFpbiBwcm9ncmFtLgorICovCisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgYXJnbjsKKyAgY2hhciAqIGFyZzsKKyAgaW50IGtlZXBfQ09NID0gMTsKKyAgY2hhciAqIGNvbW1lbnRfYXJnID0gTlVMTDsKKyAgRklMRSAqIGNvbW1lbnRfZmlsZSA9IE5VTEw7CisgIHVuc2lnbmVkIGludCBjb21tZW50X2xlbmd0aCA9IDA7CisgIGludCBtYXJrZXI7CisKKyAgLyogT24gTWFjLCBmZXRjaCBhIGNvbW1hbmQgbGluZS4gKi8KKyNpZmRlZiBVU0VfQ0NPTU1BTkQKKyAgYXJnYyA9IGNjb21tYW5kKCZhcmd2KTsKKyNlbmRpZgorCisgIHByb2duYW1lID0gYXJndlswXTsKKyAgaWYgKHByb2duYW1lID09IE5VTEwgfHwgcHJvZ25hbWVbMF0gPT0gMCkKKyAgICBwcm9nbmFtZSA9ICJ3cmpwZ2NvbSI7CS8qIGluIGNhc2UgQyBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSBpdCAqLworCisgIC8qIFBhcnNlIHN3aXRjaGVzLCBpZiBhbnkgKi8KKyAgZm9yIChhcmduID0gMTsgYXJnbiA8IGFyZ2M7IGFyZ24rKykgeworICAgIGFyZyA9IGFyZ3ZbYXJnbl07CisgICAgaWYgKGFyZ1swXSAhPSAnLScpCisgICAgICBicmVhazsJCQkvKiBub3Qgc3dpdGNoLCBtdXN0IGJlIGZpbGUgbmFtZSAqLworICAgIGFyZysrOwkJCS8qIGFkdmFuY2Ugb3ZlciAnLScgKi8KKyAgICBpZiAoa2V5bWF0Y2goYXJnLCAicmVwbGFjZSIsIDEpKSB7CisgICAgICBrZWVwX0NPTSA9IDA7CisgICAgfSBlbHNlIGlmIChrZXltYXRjaChhcmcsICJjZmlsZSIsIDIpKSB7CisgICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7CisgICAgICBpZiAoKGNvbW1lbnRfZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sICJyIikpID09IE5VTEwpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuICVzXG4iLCBwcm9nbmFtZSwgYXJndlthcmduXSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoa2V5bWF0Y2goYXJnLCAiY29tbWVudCIsIDEpKSB7CisgICAgICBpZiAoKythcmduID49IGFyZ2MpIHVzYWdlKCk7CisgICAgICBjb21tZW50X2FyZyA9IGFyZ3ZbYXJnbl07CisgICAgICAvKiBJZiB0aGUgY29tbWVudCB0ZXh0IHN0YXJ0cyB3aXRoICciJywgdGhlbiB3ZSBhcmUgcHJvYmFibHkgcnVubmluZworICAgICAgICogdW5kZXIgTVMtRE9HIGFuZCBtdXN0IHBhcnNlIG91dCB0aGUgcXVvdGVkIHN0cmluZyBvdXJzZWx2ZXMuICBTaWdoLgorICAgICAgICovCisgICAgICBpZiAoY29tbWVudF9hcmdbMF0gPT0gJyInKSB7CisJY29tbWVudF9hcmcgPSAoY2hhciAqKSBtYWxsb2MoKHNpemVfdCkgTUFYX0NPTV9MRU5HVEgpOworCWlmIChjb21tZW50X2FyZyA9PSBOVUxMKQorCSAgRVJSRVhJVCgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOworCXN0cmNweShjb21tZW50X2FyZywgYXJndlthcmduXSsxKTsKKwlmb3IgKDs7KSB7CisJICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7CisJICBpZiAoY29tbWVudF9sZW5ndGggPiAwICYmIGNvbW1lbnRfYXJnW2NvbW1lbnRfbGVuZ3RoLTFdID09ICciJykgeworCSAgICBjb21tZW50X2FyZ1tjb21tZW50X2xlbmd0aC0xXSA9ICdcMCc7IC8qIHphcCB0ZXJtaW5hdGluZyBxdW90ZSAqLworCSAgICBicmVhazsKKwkgIH0KKwkgIGlmICgrK2FyZ24gPj0gYXJnYykKKwkgICAgRVJSRVhJVCgiTWlzc2luZyBlbmRpbmcgcXVvdGUgbWFyayIpOworCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCAiICIpOworCSAgc3RyY2F0KGNvbW1lbnRfYXJnLCBhcmd2W2FyZ25dKTsKKwl9CisgICAgICB9CisgICAgICBjb21tZW50X2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIHN0cmxlbihjb21tZW50X2FyZyk7CisgICAgfSBlbHNlCisgICAgICB1c2FnZSgpOworICB9CisKKyAgLyogQ2Fubm90IHVzZSBib3RoIC1jb21tZW50IGFuZCAtY2ZpbGUuICovCisgIGlmIChjb21tZW50X2FyZyAhPSBOVUxMICYmIGNvbW1lbnRfZmlsZSAhPSBOVUxMKQorICAgIHVzYWdlKCk7CisgIC8qIElmIHRoZXJlIGlzIG5laXRoZXIgLWNvbW1lbnQgbm9yIC1jZmlsZSwgd2Ugd2lsbCByZWFkIHRoZSBjb21tZW50IHRleHQKKyAgICogZnJvbSBzdGRpbjsgaW4gdGhpcyBjYXNlIHRoZXJlIE1VU1QgYmUgYW4gaW5wdXQgSlBFRyBmaWxlIG5hbWUuCisgICAqLworICBpZiAoY29tbWVudF9hcmcgPT0gTlVMTCAmJiBjb21tZW50X2ZpbGUgPT0gTlVMTCAmJiBhcmduID49IGFyZ2MpCisgICAgdXNhZ2UoKTsKKworICAvKiBPcGVuIHRoZSBpbnB1dCBmaWxlLiAqLworICBpZiAoYXJnbiA8IGFyZ2MpIHsKKyAgICBpZiAoKGluZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbl0sIFJFQURfQklOQVJZKSkgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgcHJvZ25hbWUsIGFyZ3ZbYXJnbl0pOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBkZWZhdWx0IGlucHV0IGZpbGUgaXMgc3RkaW4gKi8KKyNpZmRlZiBVU0VfU0VUTU9ERQkJLyogbmVlZCB0byBoYWNrIGZpbGUgbW9kZT8gKi8KKyAgICBzZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgICBpZiAoKGluZmlsZSA9IGZkb3BlbihmaWxlbm8oc3RkaW4pLCBSRUFEX0JJTkFSWSkpID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gc3RkaW5cbiIsIHByb2duYW1lKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisjZWxzZQorICAgIGluZmlsZSA9IHN0ZGluOworI2VuZGlmCisgIH0KKworICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyNpZmRlZiBUV09fRklMRV9DT01NQU5ETElORQorICAvKiBNdXN0IGhhdmUgZXhwbGljaXQgb3V0cHV0IGZpbGUgbmFtZSAqLworICBpZiAoYXJnbiAhPSBhcmdjLTIpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBtdXN0IG5hbWUgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IGZpbGVcbiIsCisJICAgIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisgIGlmICgob3V0ZmlsZSA9IGZvcGVuKGFyZ3ZbYXJnbisxXSwgV1JJVEVfQklOQVJZKSkgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNhbid0IG9wZW4gJXNcbiIsIHByb2duYW1lLCBhcmd2W2FyZ24rMV0pOworICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2Vsc2UKKyAgLyogVW5peCBzdHlsZTogZXhwZWN0IHplcm8gb3Igb25lIGZpbGUgbmFtZSAqLworICBpZiAoYXJnbiA8IGFyZ2MtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG9ubHkgb25lIGlucHV0IGZpbGVcbiIsIHByb2duYW1lKTsKKyAgICB1c2FnZSgpOworICB9CisgIC8qIGRlZmF1bHQgb3V0cHV0IGZpbGUgaXMgc3Rkb3V0ICovCisjaWZkZWYgVVNFX1NFVE1PREUJCS8qIG5lZWQgdG8gaGFjayBmaWxlIG1vZGU/ICovCisgIHNldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKKyNlbmRpZgorI2lmZGVmIFVTRV9GRE9QRU4JCS8qIG5lZWQgdG8gcmUtb3BlbiBpbiBiaW5hcnkgbW9kZT8gKi8KKyAgaWYgKChvdXRmaWxlID0gZmRvcGVuKGZpbGVubyhzdGRvdXQpLCBXUklURV9CSU5BUlkpKSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBzdGRvdXRcbiIsIHByb2duYW1lKTsKKyAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyNlbHNlCisgIG91dGZpbGUgPSBzdGRvdXQ7CisjZW5kaWYKKyNlbmRpZiAvKiBUV09fRklMRV9DT01NQU5ETElORSAqLworCisgIC8qIENvbGxlY3QgY29tbWVudCB0ZXh0IGZyb20gY29tbWVudF9maWxlIG9yIHN0ZGluLCBpZiBuZWNlc3NhcnkgKi8KKyAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpIHsKKyAgICBGSUxFICogc3JjX2ZpbGU7CisgICAgaW50IGM7CisKKyAgICBjb21tZW50X2FyZyA9IChjaGFyICopIG1hbGxvYygoc2l6ZV90KSBNQVhfQ09NX0xFTkdUSCk7CisgICAgaWYgKGNvbW1lbnRfYXJnID09IE5VTEwpCisgICAgICBFUlJFWElUKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7CisgICAgY29tbWVudF9sZW5ndGggPSAwOworICAgIHNyY19maWxlID0gKGNvbW1lbnRfZmlsZSAhPSBOVUxMID8gY29tbWVudF9maWxlIDogc3RkaW4pOworICAgIHdoaWxlICgoYyA9IGdldGMoc3JjX2ZpbGUpKSAhPSBFT0YpIHsKKyAgICAgIGlmIChjb21tZW50X2xlbmd0aCA+PSAodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCkgeworCWZwcmludGYoc3RkZXJyLCAiQ29tbWVudCB0ZXh0IG1heSBub3QgZXhjZWVkICV1IGJ5dGVzXG4iLAorCQkodW5zaWduZWQgaW50KSBNQVhfQ09NX0xFTkdUSCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgfQorICAgICAgY29tbWVudF9hcmdbY29tbWVudF9sZW5ndGgrK10gPSAoY2hhcikgYzsKKyAgICB9CisgICAgaWYgKGNvbW1lbnRfZmlsZSAhPSBOVUxMKQorICAgICAgZmNsb3NlKGNvbW1lbnRfZmlsZSk7CisgIH0KKworICAvKiBDb3B5IEpQRUcgaGVhZGVycyB1bnRpbCBTT0ZuIG1hcmtlcjsKKyAgICogd2Ugd2lsbCBpbnNlcnQgdGhlIG5ldyBjb21tZW50IG1hcmtlciBqdXN0IGJlZm9yZSBTT0ZuLgorICAgKiBUaGlzIChhKSBjYXVzZXMgdGhlIG5ldyBjb21tZW50IHRvIGFwcGVhciBhZnRlciwgcmF0aGVyIHRoYW4gYmVmb3JlLAorICAgKiBleGlzdGluZyBjb21tZW50czsgYW5kIChiKSBlbnN1cmVzIHRoYXQgY29tbWVudHMgY29tZSBhZnRlciBhbnkgSkZJRgorICAgKiBvciBKRlhYIG1hcmtlcnMsIGFzIHJlcXVpcmVkIGJ5IHRoZSBKRklGIHNwZWNpZmljYXRpb24uCisgICAqLworICBtYXJrZXIgPSBzY2FuX0pQRUdfaGVhZGVyKGtlZXBfQ09NKTsKKyAgLyogSW5zZXJ0IHRoZSBuZXcgQ09NIG1hcmtlciwgYnV0IG9ubHkgaWYgbm9uZW1wdHkgdGV4dCBoYXMgYmVlbiBzdXBwbGllZCAqLworICBpZiAoY29tbWVudF9sZW5ndGggPiAwKSB7CisgICAgd3JpdGVfbWFya2VyKE1fQ09NKTsKKyAgICB3cml0ZV8yX2J5dGVzKGNvbW1lbnRfbGVuZ3RoICsgMik7CisgICAgd2hpbGUgKGNvbW1lbnRfbGVuZ3RoID4gMCkgeworICAgICAgd3JpdGVfMV9ieXRlKCpjb21tZW50X2FyZysrKTsKKyAgICAgIGNvbW1lbnRfbGVuZ3RoLS07CisgICAgfQorICB9CisgIC8qIER1cGxpY2F0ZSB0aGUgcmVtYWluZGVyIG9mIHRoZSBzb3VyY2UgZmlsZS4KKyAgICogTm90ZSB0aGF0IGFueSBDT00gbWFya2VycyBvY2N1cmluZyBhZnRlciBTT0Ygd2lsbCBub3QgYmUgdG91Y2hlZC4KKyAgICovCisgIHdyaXRlX21hcmtlcihtYXJrZXIpOworICBjb3B5X3Jlc3Rfb2ZfZmlsZSgpOworCisgIC8qIEFsbCBkb25lLiAqLworICBleGl0KEVYSVRfU1VDQ0VTUyk7CisgIHJldHVybiAwOwkJCS8qIHN1cHByZXNzIG5vLXJldHVybi12YWx1ZSB3YXJuaW5ncyAqLworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dycHBtLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JwcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZkOTA4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9qcGVnLTZiL3dycHBtLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiB3cnBwbS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBQUE0vUEdNIGZvcm1hdC4KKyAqIFRoZSBleHRlbmRlZCAyLWJ5dGUtcGVyLXNhbXBsZSByYXcgUFBNL1BHTSBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisgKiBUaGUgUEJNUExVUyBsaWJyYXJ5IGlzIE5PVCByZXF1aXJlZCB0byBjb21waWxlIHRoaXMgc29mdHdhcmUKKyAqIChidXQgaXQgaXMgaGlnaGx5IHVzZWZ1bCBhcyBhIHNldCBvZiBQUE0gaW1hZ2UgbWFuaXB1bGF0aW9uIHByb2dyYW1zKS4KKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYXkgbmVlZCBtb2RpZmljYXRpb24gZm9yIG5vbi1Vbml4IGVudmlyb25tZW50cyBvcgorICogc3BlY2lhbGl6ZWQgYXBwbGljYXRpb25zLiAgQXMgdGhleSBzdGFuZCwgdGhleSBhc3N1bWUgb3V0cHV0IHRvCisgKiBhbiBvcmRpbmFyeSBzdGRpbyBzdHJlYW0uCisgKi8KKworI2luY2x1ZGUgImNkanBlZy5oIgkJLyogQ29tbW9uIGRlY2xzIGZvciBjanBlZy9kanBlZyBhcHBsaWNhdGlvbnMgKi8KKworI2lmZGVmIFBQTV9TVVBQT1JURUQKKworCisvKgorICogRm9yIDEyLWJpdCBKUEVHIGRhdGEsIHdlIGVpdGhlciBkb3duc2NhbGUgdGhlIHZhbHVlcyB0byA4IGJpdHMKKyAqICh0byB3cml0ZSBzdGFuZGFyZCBieXRlLXBlci1zYW1wbGUgUFBNL1BHTSBmaWxlcyksIG9yIG91dHB1dAorICogbm9uc3RhbmRhcmQgd29yZC1wZXItc2FtcGxlIFBQTS9QR00gZmlsZXMuICBEb3duc2NhbGluZyBpcyBkb25lCisgKiBpZiBQUE1fTk9SQVdXT1JEIGlzIGRlZmluZWQgKHRoaXMgY2FuIGJlIGRvbmUgaW4gdGhlIE1ha2VmaWxlCisgKiBvciBpbiBqY29uZmlnLmgpLgorICogKFdoZW4gdGhlIGNvcmUgbGlicmFyeSBzdXBwb3J0cyBkYXRhIHByZWNpc2lvbiByZWR1Y3Rpb24sIGEgY2xlYW5lcgorICogaW1wbGVtZW50YXRpb24gd2lsbCBiZSB0byBhc2sgZm9yIHRoYXQgaW5zdGVhZC4pCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4CisjZGVmaW5lIFBVVFBQTVNBTVBMRShwdHIsdikgICpwdHIrKyA9IChjaGFyKSAodikKKyNkZWZpbmUgQllURVNQRVJTQU1QTEUgMQorI2RlZmluZSBQUE1fTUFYVkFMIDI1NQorI2Vsc2UKKyNpZmRlZiBQUE1fTk9SQVdXT1JECisjZGVmaW5lIFBVVFBQTVNBTVBMRShwdHIsdikgICpwdHIrKyA9IChjaGFyKSAoKHYpID4+IChCSVRTX0lOX0pTQU1QTEUtOCkpCisjZGVmaW5lIEJZVEVTUEVSU0FNUExFIDEKKyNkZWZpbmUgUFBNX01BWFZBTCAyNTUKKyNlbHNlCisvKiBUaGUgd29yZC1wZXItc2FtcGxlIGZvcm1hdCBhbHdheXMgcHV0cyB0aGUgTFNCIGZpcnN0LiAqLworI2RlZmluZSBQVVRQUE1TQU1QTEUocHRyLHYpCQkJXAorCXsgcmVnaXN0ZXIgaW50IHZhbF8gPSB2OwkJXAorCSAgKnB0cisrID0gKGNoYXIpICh2YWxfICYgMHhGRik7CVwKKwkgICpwdHIrKyA9IChjaGFyKSAoKHZhbF8gPj4gOCkgJiAweEZGKTsJXAorCX0KKyNkZWZpbmUgQllURVNQRVJTQU1QTEUgMgorI2RlZmluZSBQUE1fTUFYVkFMICgoMTw8QklUU19JTl9KU0FNUExFKS0xKQorI2VuZGlmCisjZW5kaWYKKworCisvKgorICogV2hlbiBKU0FNUExFIGlzIHRoZSBzYW1lIHNpemUgYXMgY2hhciwgd2UgY2FuIGp1c3QgZndyaXRlKCkgdGhlCisgKiBkZWNvbXByZXNzZWQgZGF0YSB0byB0aGUgUFBNIG9yIFBHTSBmaWxlLiAgT24gUENzLCBpbiBvcmRlciB0byBtYWtlIHRoaXMKKyAqIHdvcmsgdGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSBhbGxvY2F0ZWQgaW4gbmVhciBkYXRhIHNwYWNlLCBiZWNhdXNlIHdlIGFyZQorICogYXNzdW1pbmcgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWwgd2hlcmVpbiBmd3JpdGUoKSBjYW4ndCByZWFjaCBmYXIgbWVtb3J5LgorICogSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB2ZXJ5IHdpZGUgaW1hZ2VzIG9uIGEgUEMsIHlvdSBtaWdodCBoYXZlIHRvIGNvbXBpbGUKKyAqIGluIGxhcmdlLW1lbW9yeSBtb2RlbCwgb3IgZWxzZSByZXBsYWNlIGZ3cml0ZSgpIHdpdGggYSBwdXRjKCkgbG9vcCAtLS0KKyAqIHdoaWNoIHdpbGwgYmUgbXVjaCBzbG93ZXIuCisgKi8KKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgLyogVXN1YWxseSB0aGVzZSB0d28gcG9pbnRlcnMgcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2U6ICovCisgIGNoYXIgKmlvYnVmZmVyOwkJLyogZndyaXRlJ3MgSS9PIGJ1ZmZlciAqLworICBKU0FNUFJPVyBwaXhyb3c7CQkvKiBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlciAqLworICBzaXplX3QgYnVmZmVyX3dpZHRoOwkJLyogd2lkdGggb2YgSS9PIGJ1ZmZlciAqLworICBKRElNRU5TSU9OIHNhbXBsZXNfcGVyX3JvdzsJLyogSlNBTVBMRXMgcGVyIG91dHB1dCByb3cgKi8KK30gcHBtX2Rlc3Rfc3RydWN0OworCit0eXBlZGVmIHBwbV9kZXN0X3N0cnVjdCAqIHBwbV9kZXN0X3B0cjsKKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgorICogSW4gdGhpcyBtb2R1bGUgcm93c19zdXBwbGllZCB3aWxsIGFsd2F5cyBiZSAxLgorICoKKyAqIHB1dF9waXhlbF9yb3dzIGhhbmRsZXMgdGhlICJub3JtYWwiIDgtYml0IGNhc2Ugd2hlcmUgdGhlIGRlY29tcHJlc3NvcgorICogb3V0cHV0IGJ1ZmZlciBpcyBwaHlzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBmd3JpdGUgYnVmZmVyLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X3BpeGVsX3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCQlKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87CisKKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCisvKgorICogVGhpcyBjb2RlIGlzIHVzZWQgd2hlbiB3ZSBoYXZlIHRvIGNvcHkgdGhlIGRhdGEgYW5kIGFwcGx5IGEgcGl4ZWwKKyAqIGZvcm1hdCB0cmFuc2xhdGlvbi4gIFR5cGljYWxseSB0aGlzIG9ubHkgaGFwcGVucyBpbiAxMi1iaXQgbW9kZS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK2NvcHlfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCSBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0ID0gKHBwbV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIGNoYXIgKiBidWZmZXJwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgcHRyID0gZGVzdC0+cHViLmJ1ZmZlclswXTsKKyAgYnVmZmVycHRyID0gZGVzdC0+aW9idWZmZXI7CisgIGZvciAoY29sID0gZGVzdC0+c2FtcGxlc19wZXJfcm93OyBjb2wgPiAwOyBjb2wtLSkgeworICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoKnB0cisrKSk7CisgIH0KKyAgKHZvaWQpIEpGV1JJVEUoZGVzdC0+cHViLm91dHB1dF9maWxlLCBkZXN0LT5pb2J1ZmZlciwgZGVzdC0+YnVmZmVyX3dpZHRoKTsKK30KKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhIHdoZW4gY29sb3IgcXVhbnRpemF0aW9uIGlzIGluIGVmZmVjdC4KKyAqIFdlIGhhdmUgdG8gZGVtYXAgdGhlIGNvbG9yIGluZGV4IHZhbHVlcyB0byBzdHJhaWdodCBkYXRhLgorICovCisKK01FVEhPRERFRih2b2lkKQorcHV0X2RlbWFwcGVkX3JnYiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCSAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBjaGFyICogYnVmZmVycHRyOworICByZWdpc3RlciBpbnQgcGl4dmFsOworICByZWdpc3RlciBKU0FNUFJPVyBwdHI7CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcDAgPSBjaW5mby0+Y29sb3JtYXBbMF07CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcDEgPSBjaW5mby0+Y29sb3JtYXBbMV07CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGNvbG9yX21hcDIgPSBjaW5mby0+Y29sb3JtYXBbMl07CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgcGl4dmFsID0gR0VUSlNBTVBMRSgqcHRyKyspOworICAgIFBVVFBQTVNBTVBMRShidWZmZXJwdHIsIEdFVEpTQU1QTEUoY29sb3JfbWFwMFtwaXh2YWxdKSk7CisgICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXAxW3BpeHZhbF0pKTsKKyAgICBQVVRQUE1TQU1QTEUoYnVmZmVycHRyLCBHRVRKU0FNUExFKGNvbG9yX21hcDJbcGl4dmFsXSkpOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworTUVUSE9EREVGKHZvaWQpCitwdXRfZGVtYXBwZWRfZ3JheSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCSAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgcHBtX2Rlc3RfcHRyIGRlc3QgPSAocHBtX2Rlc3RfcHRyKSBkaW5mbzsKKyAgcmVnaXN0ZXIgY2hhciAqIGJ1ZmZlcnB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgcHRyOworICByZWdpc3RlciBKU0FNUFJPVyBjb2xvcl9tYXAgPSBjaW5mby0+Y29sb3JtYXBbMF07CisgIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOworCisgIHB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIGJ1ZmZlcnB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgUFVUUFBNU0FNUExFKGJ1ZmZlcnB0ciwgR0VUSlNBTVBMRShjb2xvcl9tYXBbR0VUSlNBTVBMRSgqcHRyKyspXSkpOworICB9CisgICh2b2lkKSBKRldSSVRFKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgZGVzdC0+aW9idWZmZXIsIGRlc3QtPmJ1ZmZlcl93aWR0aCk7Cit9CisKKworLyoKKyAqIFN0YXJ0dXA6IHdyaXRlIHRoZSBmaWxlIGhlYWRlci4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3N0YXJ0X291dHB1dF9wcG0gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICBwcG1fZGVzdF9wdHIgZGVzdCA9IChwcG1fZGVzdF9wdHIpIGRpbmZvOworCisgIC8qIEVtaXQgZmlsZSBoZWFkZXIgKi8KKyAgc3dpdGNoIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlKSB7CisgIGNhc2UgSkNTX0dSQVlTQ0FMRToKKyAgICAvKiBlbWl0IGhlYWRlciBmb3IgcmF3IFBHTSBmb3JtYXQgKi8KKyAgICBmcHJpbnRmKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgIlA1XG4lbGQgJWxkXG4lZFxuIiwKKwkgICAgKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodCwKKwkgICAgUFBNX01BWFZBTCk7CisgICAgYnJlYWs7CisgIGNhc2UgSkNTX1JHQjoKKyAgICAvKiBlbWl0IGhlYWRlciBmb3IgcmF3IFBQTSBmb3JtYXQgKi8KKyAgICBmcHJpbnRmKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSwgIlA2XG4lbGQgJWxkXG4lZFxuIiwKKwkgICAgKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChsb25nKSBjaW5mby0+b3V0cHV0X2hlaWdodCwKKwkgICAgUFBNX01BWFZBTCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9QUE1fQ09MT1JTUEFDRSk7CisgIH0KK30KKworCisvKgorICogRmluaXNoIHVwIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X3BwbSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIC8qIE1ha2Ugc3VyZSB3ZSB3cm90ZSB0aGUgb3V0cHV0IGZpbGUgT0sgKi8KKyAgZmZsdXNoKGRpbmZvLT5vdXRwdXRfZmlsZSk7CisgIGlmIChmZXJyb3IoZGluZm8tPm91dHB1dF9maWxlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBQUE0gZm9ybWF0IG91dHB1dC4KKyAqLworCitHTE9CQUwoZGpwZWdfZGVzdF9wdHIpCitqaW5pdF93cml0ZV9wcG0gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHBwbV9kZXN0X3B0ciBkZXN0OworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KKyAgZGVzdCA9IChwcG1fZGVzdF9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorCQkJCSAgU0laRU9GKHBwbV9kZXN0X3N0cnVjdCkpOworICBkZXN0LT5wdWIuc3RhcnRfb3V0cHV0ID0gc3RhcnRfb3V0cHV0X3BwbTsKKyAgZGVzdC0+cHViLmZpbmlzaF9vdXRwdXQgPSBmaW5pc2hfb3V0cHV0X3BwbTsKKworICAvKiBDYWxjdWxhdGUgb3V0cHV0IGltYWdlIGRpbWVuc2lvbnMgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlICovCisgIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyhjaW5mbyk7CisKKyAgLyogQ3JlYXRlIHBoeXNpY2FsIEkvTyBidWZmZXIuICBOb3RlIHdlIG1ha2UgdGhpcyBuZWFyIG9uIGEgUEMuICovCisgIGRlc3QtPnNhbXBsZXNfcGVyX3JvdyA9IGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgIGRlc3QtPmJ1ZmZlcl93aWR0aCA9IGRlc3QtPnNhbXBsZXNfcGVyX3JvdyAqIChCWVRFU1BFUlNBTVBMRSAqIFNJWkVPRihjaGFyKSk7CisgIGRlc3QtPmlvYnVmZmVyID0gKGNoYXIgKikgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkKKyAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBkZXN0LT5idWZmZXJfd2lkdGgpOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzIHx8IEJJVFNfSU5fSlNBTVBMRSAhPSA4IHx8CisgICAgICBTSVpFT0YoSlNBTVBMRSkgIT0gU0laRU9GKGNoYXIpKSB7CisgICAgLyogV2hlbiBxdWFudGl6aW5nLCB3ZSBuZWVkIGFuIG91dHB1dCBidWZmZXIgZm9yIGNvbG9ybWFwIGluZGV4ZXMKKyAgICAgKiB0aGF0J3Mgc2VwYXJhdGUgZnJvbSB0aGUgcGh5c2ljYWwgSS9PIGJ1ZmZlci4gIFdlIGFsc28gbmVlZCBhCisgICAgICogc2VwYXJhdGUgYnVmZmVyIGlmIHBpeGVsIGZvcm1hdCB0cmFuc2xhdGlvbiBtdXN0IHRha2UgcGxhY2UuCisgICAgICovCisgICAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKKyAgICAgICBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dHB1dF9jb21wb25lbnRzLCAoSkRJTUVOU0lPTikgMSk7CisgICAgZGVzdC0+cHViLmJ1ZmZlcl9oZWlnaHQgPSAxOworICAgIGlmICghIGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpCisgICAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBjb3B5X3BpeGVsX3Jvd3M7CisgICAgZWxzZSBpZiAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9PSBKQ1NfR1JBWVNDQUxFKQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2RlbWFwcGVkX2dyYXk7CisgICAgZWxzZQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2RlbWFwcGVkX3JnYjsKKyAgfSBlbHNlIHsKKyAgICAvKiBXZSB3aWxsIGZ3cml0ZSgpIGRpcmVjdGx5IGZyb20gZGVjb21wcmVzc29yIG91dHB1dCBidWZmZXIuICovCisgICAgLyogU3ludGhlc2l6ZSBhIEpTQU1QQVJSQVkgcG9pbnRlciBzdHJ1Y3R1cmUgKi8KKyAgICAvKiBDYXN0IGhlcmUgaW1wbGllcyBuZWFyLT5mYXIgcG9pbnRlciBjb252ZXJzaW9uIG9uIFBDcyAqLworICAgIGRlc3QtPnBpeHJvdyA9IChKU0FNUFJPVykgZGVzdC0+aW9idWZmZXI7CisgICAgZGVzdC0+cHViLmJ1ZmZlciA9ICYgZGVzdC0+cGl4cm93OworICAgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKyAgICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBwdXRfcGl4ZWxfcm93czsKKyAgfQorCisgIHJldHVybiAoZGpwZWdfZGVzdF9wdHIpIGRlc3Q7Cit9CisKKyNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JybGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cnJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTczMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3JybGUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIHdycmxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0byB3cml0ZSBvdXRwdXQgaW1hZ2VzIGluIFJMRSBmb3JtYXQuCisgKiBUaGUgVXRhaCBSYXN0ZXIgVG9vbGtpdCBsaWJyYXJ5IGlzIHJlcXVpcmVkICh2ZXJzaW9uIDMuMSBvciBsYXRlcikuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bworICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTWlrZSBMaWpld3NraSwKKyAqIHdpdGggdXBkYXRlcyBmcm9tIFJvYmVydCBIdXRjaGluc29uLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBSTEVfU1VQUE9SVEVECisKKy8qIHJsZS5oIGlzIHByb3ZpZGVkIGJ5IHRoZSBVdGFoIFJhc3RlciBUb29sa2l0LiAqLworCisjaW5jbHVkZSA8cmxlLmg+CisKKy8qCisgKiBXZSBhc3N1bWUgdGhhdCBKU0FNUExFIGhhcyB0aGUgc2FtZSByZXByZXNlbnRhdGlvbiBhcyBybGVfcGl4ZWwsCisgKiB0byB3aXQsICJ1bnNpZ25lZCBjaGFyIi4gIEhlbmNlIHdlIGNhbid0IGNvcGUgd2l0aCAxMi0gb3IgMTYtYml0IHNhbXBsZXMuCisgKi8KKworI2lmIEJJVFNfSU5fSlNBTVBMRSAhPSA4CisgIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDgtYml0IEpTQU1QTEVzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KKyNlbmRpZgorCisKKy8qCisgKiBTaW5jZSBSTEUgc3RvcmVzIHNjYW5saW5lcyBib3R0b20tdG8tdG9wLCB3ZSBoYXZlIHRvIGludmVydCB0aGUgaW1hZ2UKKyAqIGZyb20gSlBFRydzIHRvcC10by1ib3R0b20gb3JkZXIuICBUbyBkbyB0aGlzLCB3ZSBzYXZlIHRoZSBvdXRnb2luZyBkYXRhCisgKiBpbiBhIHZpcnR1YWwgYXJyYXkgZHVyaW5nIHB1dF9waXhlbF9yb3cgY2FsbHMsIHRoZW4gYWN0dWFsbHkgZW1pdCB0aGUKKyAqIFJMRSBmaWxlIGR1cmluZyBmaW5pc2hfb3V0cHV0LgorICovCisKKworLyoKKyAqIEZvciBub3csIGlmIHdlIGVtaXQgYW4gUkxFIGNvbG9yIG1hcCB0aGVuIGl0IGlzIGFsd2F5cyAyNTYgZW50cmllcyBsb25nLAorICogdGhvdWdoIG5vdCBhbGwgb2YgdGhlIGVudHJpZXMgbmVlZCBiZSB1c2VkLgorICovCisKKyNkZWZpbmUgQ01BUEJJVFMJOAorI2RlZmluZSBDTUFQTEVOR1RICSgxPDwoQ01BUEJJVFMpKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KKworICBqdmlydF9zYXJyYXlfcHRyIGltYWdlOwkvKiB2aXJ0dWFsIGFycmF5IHRvIHN0b3JlIHRoZSBvdXRwdXQgaW1hZ2UgKi8KKyAgcmxlX21hcCAqY29sb3JtYXA7CSAJLyogUkxFLXN0eWxlIGNvbG9yIG1hcCwgb3IgTlVMTCBpZiBub25lICovCisgIHJsZV9waXhlbCAqKnJsZV9yb3c7CQkvKiBUbyBwYXNzIHJvd3MgdG8gcmxlX3B1dHJvdygpICovCisKK30gcmxlX2Rlc3Rfc3RydWN0OworCit0eXBlZGVmIHJsZV9kZXN0X3N0cnVjdCAqIHJsZV9kZXN0X3B0cjsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK01FVEhPRERFRih2b2lkKSBybGVfcHV0X3BpeGVsX3Jvd3MKKyAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCSBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpKTsKKworCisvKgorICogV3JpdGUgdGhlIGZpbGUgaGVhZGVyLgorICoKKyAqIEluIHRoaXMgbW9kdWxlIGl0J3MgZWFzaWVyIHRvIHdhaXQgdGlsbCBmaW5pc2hfb3V0cHV0IHRvIHdyaXRlIGFueXRoaW5nLgorICovCisKK01FVEhPRERFRih2b2lkKQorc3RhcnRfb3V0cHV0X3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIHJsZV9kZXN0X3B0ciBkZXN0ID0gKHJsZV9kZXN0X3B0cikgZGluZm87CisgIHNpemVfdCBjbWFwc2l6ZTsKKyAgaW50IGksIGNpOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisjZW5kaWYKKworICAvKgorICAgKiBNYWtlIHN1cmUgdGhlIGltYWdlIGNhbiBiZSBzdG9yZWQgaW4gUkxFIGZvcm1hdC4KKyAgICoKKyAgICogLSBSTEUgc3RvcmVzIGltYWdlIGRpbWVuc2lvbnMgYXMgKnNpZ25lZCogMTYgYml0IGludGVnZXJzLiAgSlBFRworICAgKiAgIHVzZXMgdW5zaWduZWQsIHNvIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHdpZHRoLgorICAgKgorICAgKiAtIENvbG9yc3BhY2UgaXMgZXhwZWN0ZWQgdG8gYmUgZ3JheXNjYWxlIG9yIFJHQi4KKyAgICoKKyAgICogLSBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIChjb21wb25lbnRzKSBpcyBleHBlY3RlZCB0byBiZSAxIChncmF5c2NhbGUvCisgICAqICAgcHNldWRvY29sb3IpIG9yIDMgKHRydWVjb2xvci9kaXJlY3Rjb2xvcikuCisgICAqICAgKGNvdWxkIGJlIDIgb3IgNCBpZiB1c2luZyBhbiBhbHBoYSBjaGFubmVsLCBidXQgd2UgYXJlbid0KQorICAgKi8KKworICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCA+IDMyNzY3IHx8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID4gMzI3NjcpCisgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfUkxFX0RJTUVOU0lPTlMsIGNpbmZvLT5vdXRwdXRfd2lkdGgsIAorCSAgICAgY2luZm8tPm91dHB1dF9oZWlnaHQpOworCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlICE9IEpDU19HUkFZU0NBTEUgJiYKKyAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgIT0gSkNTX1JHQikKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1JMRV9DT0xPUlNQQUNFKTsKKworICBpZiAoY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDEgJiYgY2luZm8tPm91dHB1dF9jb21wb25lbnRzICE9IDMpCisgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfUkxFX1RPT01BTllDSEFOTkVMUywgY2luZm8tPm51bV9jb21wb25lbnRzKTsKKworICAvKiBDb252ZXJ0IGNvbG9ybWFwLCBpZiBhbnksIHRvIFJMRSBmb3JtYXQuICovCisKKyAgZGVzdC0+Y29sb3JtYXAgPSBOVUxMOworCisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgLyogQWxsb2NhdGUgc3RvcmFnZSBmb3IgUkxFLXN0eWxlIGNtYXAsIHplcm8gYW55IGV4dHJhIGVudHJpZXMgKi8KKyAgICBjbWFwc2l6ZSA9IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyAqIENNQVBMRU5HVEggKiBTSVpFT0YocmxlX21hcCk7CisgICAgZGVzdC0+Y29sb3JtYXAgPSAocmxlX21hcCAqKSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgY21hcHNpemUpOworICAgIE1FTVpFUk8oZGVzdC0+Y29sb3JtYXAsIGNtYXBzaXplKTsKKworICAgIC8qIFNhdmUgYXdheSBkYXRhIGluIFJMRSBmb3JtYXQgLS0tIG5vdGUgOC1iaXQgbGVmdCBzaGlmdCEgKi8KKyAgICAvKiBTaGlmdGluZyB3b3VsZCBuZWVkIGFkanVzdG1lbnQgZm9yIEpTQU1QTEVzIHdpZGVyIHRoYW4gOCBiaXRzLiAqLworICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50czsgY2krKykgeworICAgICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsgaSsrKSB7CisgICAgICAgIGRlc3QtPmNvbG9ybWFwW2NpICogQ01BUExFTkdUSCArIGldID0KKyAgICAgICAgICBHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFtjaV1baV0pIDw8IDg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogU2V0IHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBmaXJzdCByb3cgKi8KKyAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsIChKRElNRU5TSU9OKSAwLCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgIGRlc3QtPnB1Yi5idWZmZXJfaGVpZ2h0ID0gMTsKKworICBkZXN0LT5wdWIucHV0X3BpeGVsX3Jvd3MgPSBybGVfcHV0X3BpeGVsX3Jvd3M7CisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBwcm9ncmVzcy0+dG90YWxfZXh0cmFfcGFzc2VzKys7ICAvKiBjb3VudCBmaWxlIHdyaXRpbmcgYXMgc2VwYXJhdGUgcGFzcyAqLworICB9CisjZW5kaWYKK30KKworCisvKgorICogV3JpdGUgc29tZSBwaXhlbCBkYXRhLgorICoKKyAqIFRoaXMgcm91dGluZSBqdXN0IHNhdmVzIHRoZSBkYXRhIGF3YXkgaW4gYSB2aXJ0dWFsIGFycmF5LgorICovCisKK01FVEhPRERFRih2b2lkKQorcmxlX3B1dF9waXhlbF9yb3dzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJICAgIEpESU1FTlNJT04gcm93c19zdXBwbGllZCkKK3sKKyAgcmxlX2Rlc3RfcHRyIGRlc3QgPSAocmxlX2Rlc3RfcHRyKSBkaW5mbzsKKworICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA8IGNpbmZvLT5vdXRwdXRfaGVpZ2h0KSB7CisgICAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfc2FycmF5KQorICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBkZXN0LT5pbWFnZSwKKyAgICAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMSwgVFJVRSk7CisgIH0KK30KKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICoKKyAqIEhlcmUgaXMgd2hlcmUgd2UgcmVhbGx5IG91dHB1dCB0aGUgUkxFIGZpbGUuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitmaW5pc2hfb3V0cHV0X3JsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8pCit7CisgIHJsZV9kZXN0X3B0ciBkZXN0ID0gKHJsZV9kZXN0X3B0cikgZGluZm87CisgIHJsZV9oZHIgaGVhZGVyOwkJLyogT3V0cHV0IGZpbGUgaW5mb3JtYXRpb24gKi8KKyAgcmxlX3BpeGVsICoqcmxlX3JvdywgKnJlZCwgKmdyZWVuLCAqYmx1ZTsKKyAgSlNBTVBST1cgb3V0cHV0X3JvdzsKKyAgY2hhciBjbWFwY29tbWVudFs4MF07CisgIGludCByb3csIGNvbDsKKyAgaW50IGNpOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBjZF9wcm9ncmVzc19wdHIgcHJvZ3Jlc3MgPSAoY2RfcHJvZ3Jlc3NfcHRyKSBjaW5mby0+cHJvZ3Jlc3M7CisjZW5kaWYKKworICAvKiBJbml0aWFsaXplIHRoZSBoZWFkZXIgaW5mbyAqLworICBoZWFkZXIgPSAqcmxlX2hkcl9pbml0KE5VTEwpOworICBoZWFkZXIucmxlX2ZpbGUgPSBkZXN0LT5wdWIub3V0cHV0X2ZpbGU7CisgIGhlYWRlci54bWluICAgICA9IDA7CisgIGhlYWRlci54bWF4ICAgICA9IGNpbmZvLT5vdXRwdXRfd2lkdGggIC0gMTsKKyAgaGVhZGVyLnltaW4gICAgID0gMDsKKyAgaGVhZGVyLnltYXggICAgID0gY2luZm8tPm91dHB1dF9oZWlnaHQgLSAxOworICBoZWFkZXIuYWxwaGEgICAgPSAwOworICBoZWFkZXIubmNvbG9ycyAgPSBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHM7CisgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsgY2krKykgeworICAgIFJMRV9TRVRfQklUKGhlYWRlciwgY2kpOworICB9CisgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7CisgICAgaGVhZGVyLm5jbWFwICAgPSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7CisgICAgaGVhZGVyLmNtYXBsZW4gPSBDTUFQQklUUzsKKyAgICBoZWFkZXIuY21hcCAgICA9IGRlc3QtPmNvbG9ybWFwOworICAgIC8qIEFkZCBhIGNvbW1lbnQgdG8gdGhlIG91dHB1dCBpbWFnZSB3aXRoIHRoZSB0cnVlIGNvbG9ybWFwIGxlbmd0aC4gKi8KKyAgICBzcHJpbnRmKGNtYXBjb21tZW50LCAiY29sb3JfbWFwX2xlbmd0aD0lZCIsIGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9ycyk7CisgICAgcmxlX3B1dGNvbShjbWFwY29tbWVudCwgJmhlYWRlcik7CisgIH0KKworICAvKiBFbWl0IHRoZSBSTEUgaGVhZGVyIGFuZCBjb2xvciBtYXAgKGlmIGFueSkgKi8KKyAgcmxlX3B1dF9zZXR1cCgmaGVhZGVyKTsKKworICAvKiBOb3cgb3V0cHV0IHRoZSBSTEUgZGF0YSBmcm9tIG91ciB2aXJ0dWFsIGFycmF5LgorICAgKiBXZSBhc3N1bWUgaGVyZSB0aGF0IChhKSBybGVfcGl4ZWwgaXMgcmVwcmVzZW50ZWQgdGhlIHNhbWUgYXMgSlNBTVBMRSwKKyAgICogYW5kIChiKSB3ZSBhcmUgbm90IG9uIGEgbWFjaGluZSB3aGVyZSBGQVIgcG9pbnRlcnMgZGlmZmVyIGZyb20gcmVndWxhci4KKyAgICovCisKKyNpZmRlZiBQUk9HUkVTU19SRVBPUlQKKyAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICBwcm9ncmVzcy0+cHViLnBhc3NfbGltaXQgPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKKyAgICBwcm9ncmVzcy0+cHViLnBhc3NfY291bnRlciA9IDA7CisgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgIH0KKyNlbmRpZgorCisgIGlmIChjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPT0gMSkgeworICAgIGZvciAocm93ID0gY2luZm8tPm91dHB1dF9oZWlnaHQtMTsgcm93ID49IDA7IHJvdy0tKSB7CisgICAgICBybGVfcm93ID0gKHJsZV9waXhlbCAqKikgKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsCisJIChKRElNRU5TSU9OKSByb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisgICAgICBybGVfcHV0cm93KHJsZV9yb3csIChpbnQpIGNpbmZvLT5vdXRwdXRfd2lkdGgsICZoZWFkZXIpOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKKyAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChyb3cgPSBjaW5mby0+b3V0cHV0X2hlaWdodC0xOyByb3cgPj0gMDsgcm93LS0pIHsKKyAgICAgIHJsZV9yb3cgPSAocmxlX3BpeGVsICoqKSBkZXN0LT5ybGVfcm93OworICAgICAgb3V0cHV0X3JvdyA9ICogKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCisgICAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgZGVzdC0+aW1hZ2UsCisJIChKRElNRU5TSU9OKSByb3csIChKRElNRU5TSU9OKSAxLCBGQUxTRSk7CisgICAgICByZWQgPSBybGVfcm93WzBdOworICAgICAgZ3JlZW4gPSBybGVfcm93WzFdOworICAgICAgYmx1ZSA9IHJsZV9yb3dbMl07CisgICAgICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgICAgICpyZWQrKyA9IEdFVEpTQU1QTEUoKm91dHB1dF9yb3crKyk7CisgICAgICAgICpncmVlbisrID0gR0VUSlNBTVBMRSgqb3V0cHV0X3JvdysrKTsKKyAgICAgICAgKmJsdWUrKyA9IEdFVEpTQU1QTEUoKm91dHB1dF9yb3crKyk7CisgICAgICB9CisgICAgICBybGVfcHV0cm93KHJsZV9yb3csIChpbnQpIGNpbmZvLT5vdXRwdXRfd2lkdGgsICZoZWFkZXIpOworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICAgICAgaWYgKHByb2dyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgcHJvZ3Jlc3MtPnB1Yi5wYXNzX2NvdW50ZXIrKzsKKyAgICAgICAgKCpwcm9ncmVzcy0+cHViLnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisgIH0KKworI2lmZGVmIFBST0dSRVNTX1JFUE9SVAorICBpZiAocHJvZ3Jlc3MgIT0gTlVMTCkKKyAgICBwcm9ncmVzcy0+Y29tcGxldGVkX2V4dHJhX3Bhc3NlcysrOworI2VuZGlmCisKKyAgLyogRW1pdCBmaWxlIHRyYWlsZXIgKi8KKyAgcmxlX3B1dGVvZigmaGVhZGVyKTsKKyAgZmZsdXNoKGRlc3QtPnB1Yi5vdXRwdXRfZmlsZSk7CisgIGlmIChmZXJyb3IoZGVzdC0+cHViLm91dHB1dF9maWxlKSkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBUaGUgbW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lIGZvciBSTEUgZm9ybWF0IG91dHB1dC4KKyAqLworCitHTE9CQUwoZGpwZWdfZGVzdF9wdHIpCitqaW5pdF93cml0ZV9ybGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCit7CisgIHJsZV9kZXN0X3B0ciBkZXN0OworCisgIC8qIENyZWF0ZSBtb2R1bGUgaW50ZXJmYWNlIG9iamVjdCwgZmlsbCBpbiBtZXRob2QgcG9pbnRlcnMgKi8KKyAgZGVzdCA9IChybGVfZGVzdF9wdHIpCisgICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkVPRihybGVfZGVzdF9zdHJ1Y3QpKTsKKyAgZGVzdC0+cHViLnN0YXJ0X291dHB1dCA9IHN0YXJ0X291dHB1dF9ybGU7CisgIGRlc3QtPnB1Yi5maW5pc2hfb3V0cHV0ID0gZmluaXNoX291dHB1dF9ybGU7CisKKyAgLyogQ2FsY3VsYXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIHNvIHdlIGNhbiBhbGxvY2F0ZSBzcGFjZSAqLworICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOworCisgIC8qIEFsbG9jYXRlIGEgd29yayBhcnJheSBmb3Igb3V0cHV0IHRvIHRoZSBSTEUgbGlicmFyeS4gKi8KKyAgZGVzdC0+cmxlX3JvdyA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisgICAgIGNpbmZvLT5vdXRwdXRfd2lkdGgsIChKRElNRU5TSU9OKSBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMpOworCisgIC8qIEFsbG9jYXRlIGEgdmlydHVhbCBhcnJheSB0byBob2xkIHRoZSBpbWFnZS4gKi8KKyAgZGVzdC0+aW1hZ2UgPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCisgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCisgICAgIChKRElNRU5TSU9OKSAoY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50cyksCisgICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0LCAoSkRJTUVOU0lPTikgMSk7CisKKyAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKK30KKworI2VuZGlmIC8qIFJMRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvanBlZy02Yi93cnRhcmdhLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3J0YXJnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTA0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2pwZWctNmIvd3J0YXJnYS5jCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogd3J0YXJnYS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgb3V0cHV0IGltYWdlcyBpbiBUYXJnYSBmb3JtYXQuCisgKgorICogVGhlc2Ugcm91dGluZXMgbWF5IG5lZWQgbW9kaWZpY2F0aW9uIGZvciBub24tVW5peCBlbnZpcm9ubWVudHMgb3IKKyAqIHNwZWNpYWxpemVkIGFwcGxpY2F0aW9ucy4gIEFzIHRoZXkgc3RhbmQsIHRoZXkgYXNzdW1lIG91dHB1dCB0bworICogYW4gb3JkaW5hcnkgc3RkaW8gc3RyZWFtLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgY29udHJpYnV0ZWQgYnkgTGVlIERhbmllbCBDcm9ja2VyLgorICovCisKKyNpbmNsdWRlICJjZGpwZWcuaCIJCS8qIENvbW1vbiBkZWNscyBmb3IgY2pwZWcvZGpwZWcgYXBwbGljYXRpb25zICovCisKKyNpZmRlZiBUQVJHQV9TVVBQT1JURUQKKworCisvKgorICogVG8gc3VwcG9ydCAxMi1iaXQgSlBFRyBkYXRhLCB3ZSdkIGhhdmUgdG8gc2NhbGUgb3V0cHV0IGRvd24gdG8gOCBiaXRzLgorICogVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorICovCisKKyNpZiBCSVRTX0lOX0pTQU1QTEUgIT0gOAorICBTb3JyeSwgdGhpcyBjb2RlIG9ubHkgY29wZXMgd2l0aCA4LWJpdCBKU0FNUExFcy4gLyogZGVsaWJlcmF0ZSBzeW50YXggZXJyICovCisjZW5kaWYKKworLyoKKyAqIFRoZSBvdXRwdXQgYnVmZmVyIG5lZWRzIHRvIGJlIHdyaXRhYmxlIGJ5IGZ3cml0ZSgpLiAgT24gUENzLCB3ZSBtdXN0CisgKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIGluIG5lYXIgZGF0YSBzcGFjZSwgYmVjYXVzZSB3ZSBhcmUgYXNzdW1pbmcgc21hbGwtZGF0YQorICogbWVtb3J5IG1vZGVsLCB3aGVyZWluIGZ3cml0ZSgpIGNhbid0IHJlYWNoIGZhciBtZW1vcnkuICBJZiB5b3UgbmVlZCB0bworICogcHJvY2VzcyB2ZXJ5IHdpZGUgaW1hZ2VzIG9uIGEgUEMsIHlvdSBtaWdodCBoYXZlIHRvIGNvbXBpbGUgaW4gbGFyZ2UtbWVtb3J5CisgKiBtb2RlbCwgb3IgZWxzZSByZXBsYWNlIGZ3cml0ZSgpIHdpdGggYSBwdXRjKCkgbG9vcCAtLS0gd2hpY2ggd2lsbCBiZSBtdWNoCisgKiBzbG93ZXIuCisgKi8KKworCisvKiBQcml2YXRlIHZlcnNpb24gb2YgZGF0YSBkZXN0aW5hdGlvbiBvYmplY3QgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QgZGpwZWdfZGVzdF9zdHJ1Y3QgcHViOwkvKiBwdWJsaWMgZmllbGRzICovCisKKyAgY2hhciAqaW9idWZmZXI7CQkvKiBwaHlzaWNhbCBJL08gYnVmZmVyICovCisgIEpESU1FTlNJT04gYnVmZmVyX3dpZHRoOwkvKiB3aWR0aCBvZiBvbmUgcm93ICovCit9IHRnYV9kZXN0X3N0cnVjdDsKKwordHlwZWRlZiB0Z2FfZGVzdF9zdHJ1Y3QgKiB0Z2FfZGVzdF9wdHI7CisKKworTE9DQUwodm9pZCkKK3dyaXRlX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sIGludCBudW1fY29sb3JzKQorLyogQ3JlYXRlIGFuZCB3cml0ZSBhIFRhcmdhIGhlYWRlciAqLworeworICBjaGFyIHRhcmdhaGVhZGVyWzE4XTsKKworICAvKiBTZXQgdW51c2VkIGZpZWxkcyBvZiBoZWFkZXIgdG8gMCAqLworICBNRU1aRVJPKHRhcmdhaGVhZGVyLCBTSVpFT0YodGFyZ2FoZWFkZXIpKTsKKworICBpZiAobnVtX2NvbG9ycyA+IDApIHsKKyAgICB0YXJnYWhlYWRlclsxXSA9IDE7CQkvKiBjb2xvciBtYXAgdHlwZSAxICovCisgICAgdGFyZ2FoZWFkZXJbNV0gPSAoY2hhcikgKG51bV9jb2xvcnMgJiAweEZGKTsKKyAgICB0YXJnYWhlYWRlcls2XSA9IChjaGFyKSAobnVtX2NvbG9ycyA+PiA4KTsKKyAgICB0YXJnYWhlYWRlcls3XSA9IDI0OwkvKiAyNCBiaXRzIHBlciBjbWFwIGVudHJ5ICovCisgIH0KKworICB0YXJnYWhlYWRlclsxMl0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAweEZGKTsKKyAgdGFyZ2FoZWFkZXJbMTNdID0gKGNoYXIpIChjaW5mby0+b3V0cHV0X3dpZHRoID4+IDgpOworICB0YXJnYWhlYWRlclsxNF0gPSAoY2hhcikgKGNpbmZvLT5vdXRwdXRfaGVpZ2h0ICYgMHhGRik7CisgIHRhcmdhaGVhZGVyWzE1XSA9IChjaGFyKSAoY2luZm8tPm91dHB1dF9oZWlnaHQgPj4gOCk7CisgIHRhcmdhaGVhZGVyWzE3XSA9IDB4MjA7CS8qIFRvcC1kb3duLCBub24taW50ZXJsYWNlZCAqLworCisgIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19HUkFZU0NBTEUpIHsKKyAgICB0YXJnYWhlYWRlclsyXSA9IDM7CQkvKiBpbWFnZSB0eXBlID0gdW5jb21wcmVzc2VkIGdyYXktc2NhbGUgKi8KKyAgICB0YXJnYWhlYWRlclsxNl0gPSA4OwkvKiBiaXRzIHBlciBwaXhlbCAqLworICB9IGVsc2UgewkJCS8qIG11c3QgYmUgUkdCICovCisgICAgaWYgKG51bV9jb2xvcnMgPiAwKSB7CisgICAgICB0YXJnYWhlYWRlclsyXSA9IDE7CS8qIGltYWdlIHR5cGUgPSBjb2xvcm1hcHBlZCBSR0IgKi8KKyAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDg7CisgICAgfSBlbHNlIHsKKyAgICAgIHRhcmdhaGVhZGVyWzJdID0gMjsJLyogaW1hZ2UgdHlwZSA9IHVuY29tcHJlc3NlZCBSR0IgKi8KKyAgICAgIHRhcmdhaGVhZGVyWzE2XSA9IDI0OworICAgIH0KKyAgfQorCisgIGlmIChKRldSSVRFKGRpbmZvLT5vdXRwdXRfZmlsZSwgdGFyZ2FoZWFkZXIsIDE4KSAhPSAoc2l6ZV90KSAxOCkKKyAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0ZJTEVfV1JJVEUpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIHBpeGVsIGRhdGEuCisgKiBJbiB0aGlzIG1vZHVsZSByb3dzX3N1cHBsaWVkIHdpbGwgYWx3YXlzIGJlIDEuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitwdXRfcGl4ZWxfcm93cyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgZGpwZWdfZGVzdF9wdHIgZGluZm8sCisJCUpESU1FTlNJT04gcm93c19zdXBwbGllZCkKKy8qIHVzZWQgZm9yIHVucXVhbnRpemVkIGZ1bGwtY29sb3Igb3V0cHV0ICovCit7CisgIHRnYV9kZXN0X3B0ciBkZXN0ID0gKHRnYV9kZXN0X3B0cikgZGluZm87CisgIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyOworICByZWdpc3RlciBjaGFyICogb3V0cHRyOworICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKKworICBpbnB0ciA9IGRlc3QtPnB1Yi5idWZmZXJbMF07CisgIG91dHB0ciA9IGRlc3QtPmlvYnVmZmVyOworICBmb3IgKGNvbCA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7IGNvbCA+IDA7IGNvbC0tKSB7CisgICAgb3V0cHRyWzBdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMl0pOyAvKiBSR0IgdG8gQkdSIG9yZGVyICovCisgICAgb3V0cHRyWzFdID0gKGNoYXIpIEdFVEpTQU1QTEUoaW5wdHJbMV0pOworICAgIG91dHB0clsyXSA9IChjaGFyKSBHRVRKU0FNUExFKGlucHRyWzBdKTsKKyAgICBpbnB0ciArPSAzLCBvdXRwdHIgKz0gMzsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCitNRVRIT0RERUYodm9pZCkKK3B1dF9ncmF5X3Jvd3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvLAorCSAgICAgICBKRElNRU5TSU9OIHJvd3Nfc3VwcGxpZWQpCisvKiB1c2VkIGZvciBncmF5c2NhbGUgT1IgcXVhbnRpemVkIGNvbG9yIG91dHB1dCAqLworeworICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKCppbnB0cisrKTsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKKy8qCisgKiBXcml0ZSBzb21lIGRlbWFwcGVkIHBpeGVsIGRhdGEgd2hlbiBjb2xvciBxdWFudGl6YXRpb24gaXMgaW4gZWZmZWN0LgorICogRm9yIFRhcmdhLCB0aGlzIGlzIG9ubHkgYXBwbGllZCB0byBncmF5c2NhbGUgZGF0YS4KKyAqLworCitNRVRIT0RERUYodm9pZCkKK3B1dF9kZW1hcHBlZF9ncmF5IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbywKKwkJICAgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKQoreworICB0Z2FfZGVzdF9wdHIgZGVzdCA9ICh0Z2FfZGVzdF9wdHIpIGRpbmZvOworICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKKyAgcmVnaXN0ZXIgY2hhciAqIG91dHB0cjsKKyAgcmVnaXN0ZXIgSlNBTVBST1cgY29sb3JfbWFwMCA9IGNpbmZvLT5jb2xvcm1hcFswXTsKKyAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7CisKKyAgaW5wdHIgPSBkZXN0LT5wdWIuYnVmZmVyWzBdOworICBvdXRwdHIgPSBkZXN0LT5pb2J1ZmZlcjsKKyAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoOyBjb2wgPiAwOyBjb2wtLSkgeworICAgICpvdXRwdHIrKyA9IChjaGFyKSBHRVRKU0FNUExFKGNvbG9yX21hcDBbR0VUSlNBTVBMRSgqaW5wdHIrKyldKTsKKyAgfQorICAodm9pZCkgSkZXUklURShkZXN0LT5wdWIub3V0cHV0X2ZpbGUsIGRlc3QtPmlvYnVmZmVyLCBkZXN0LT5idWZmZXJfd2lkdGgpOworfQorCisKKy8qCisgKiBTdGFydHVwOiB3cml0ZSB0aGUgZmlsZSBoZWFkZXIuCisgKi8KKworTUVUSE9EREVGKHZvaWQpCitzdGFydF9vdXRwdXRfdGdhIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBkanBlZ19kZXN0X3B0ciBkaW5mbykKK3sKKyAgdGdhX2Rlc3RfcHRyIGRlc3QgPSAodGdhX2Rlc3RfcHRyKSBkaW5mbzsKKyAgaW50IG51bV9jb2xvcnMsIGk7CisgIEZJTEUgKm91dGZpbGU7CisKKyAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgeworICAgIC8qIFRhcmdhIGRvZXNuJ3QgaGF2ZSBhIG1hcHBlZCBncmF5c2NhbGUgZm9ybWF0LCBzbyB3ZSB3aWxsICovCisgICAgLyogZGVtYXAgcXVhbnRpemVkIGdyYXkgb3V0cHV0LiAgTmV2ZXIgZW1pdCBhIGNvbG9ybWFwLiAqLworICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOworICAgIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2RlbWFwcGVkX2dyYXk7CisgICAgZWxzZQorICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X2dyYXlfcm93czsKKyAgfSBlbHNlIGlmIChjaW5mby0+b3V0X2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKKyAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgeworICAgICAgLyogV2Ugb25seSBzdXBwb3J0IDgtYml0IGNvbG9ybWFwIGluZGV4ZXMsIHNvIG9ubHkgMjU2IGNvbG9ycyAqLworICAgICAgbnVtX2NvbG9ycyA9IGNpbmZvLT5hY3R1YWxfbnVtYmVyX29mX2NvbG9yczsKKyAgICAgIGlmIChudW1fY29sb3JzID4gMjU2KQorCUVSUkVYSVQxKGNpbmZvLCBKRVJSX1RPT19NQU5ZX0NPTE9SUywgbnVtX2NvbG9ycyk7CisgICAgICB3cml0ZV9oZWFkZXIoY2luZm8sIGRpbmZvLCBudW1fY29sb3JzKTsKKyAgICAgIC8qIFdyaXRlIHRoZSBjb2xvcm1hcC4gIE5vdGUgVGFyZ2EgdXNlcyBCR1IgYnl0ZSBvcmRlciAqLworICAgICAgb3V0ZmlsZSA9IGRlc3QtPnB1Yi5vdXRwdXRfZmlsZTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyBpKyspIHsKKwlwdXRjKEdFVEpTQU1QTEUoY2luZm8tPmNvbG9ybWFwWzJdW2ldKSwgb3V0ZmlsZSk7CisJcHV0YyhHRVRKU0FNUExFKGNpbmZvLT5jb2xvcm1hcFsxXVtpXSksIG91dGZpbGUpOworCXB1dGMoR0VUSlNBTVBMRShjaW5mby0+Y29sb3JtYXBbMF1baV0pLCBvdXRmaWxlKTsKKyAgICAgIH0KKyAgICAgIGRlc3QtPnB1Yi5wdXRfcGl4ZWxfcm93cyA9IHB1dF9ncmF5X3Jvd3M7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX2hlYWRlcihjaW5mbywgZGluZm8sIDApOworICAgICAgZGVzdC0+cHViLnB1dF9waXhlbF9yb3dzID0gcHV0X3BpeGVsX3Jvd3M7CisgICAgfQorICB9IGVsc2UgeworICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfVEdBX0NPTE9SU1BBQ0UpOworICB9Cit9CisKKworLyoKKyAqIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICovCisKK01FVEhPRERFRih2b2lkKQorZmluaXNoX291dHB1dF90Z2EgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKQoreworICAvKiBNYWtlIHN1cmUgd2Ugd3JvdGUgdGhlIG91dHB1dCBmaWxlIE9LICovCisgIGZmbHVzaChkaW5mby0+b3V0cHV0X2ZpbGUpOworICBpZiAoZmVycm9yKGRpbmZvLT5vdXRwdXRfZmlsZSkpCisgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GSUxFX1dSSVRFKTsKK30KKworCisvKgorICogVGhlIG1vZHVsZSBzZWxlY3Rpb24gcm91dGluZSBmb3IgVGFyZ2EgZm9ybWF0IG91dHB1dC4KKyAqLworCitHTE9CQUwoZGpwZWdfZGVzdF9wdHIpCitqaW5pdF93cml0ZV90YXJnYSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKK3sKKyAgdGdhX2Rlc3RfcHRyIGRlc3Q7CisKKyAgLyogQ3JlYXRlIG1vZHVsZSBpbnRlcmZhY2Ugb2JqZWN0LCBmaWxsIGluIG1ldGhvZCBwb2ludGVycyAqLworICBkZXN0ID0gKHRnYV9kZXN0X3B0cikKKyAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJICBTSVpFT0YodGdhX2Rlc3Rfc3RydWN0KSk7CisgIGRlc3QtPnB1Yi5zdGFydF9vdXRwdXQgPSBzdGFydF9vdXRwdXRfdGdhOworICBkZXN0LT5wdWIuZmluaXNoX291dHB1dCA9IGZpbmlzaF9vdXRwdXRfdGdhOworCisgIC8qIENhbGN1bGF0ZSBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBzbyB3ZSBjYW4gYWxsb2NhdGUgc3BhY2UgKi8KKyAganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKGNpbmZvKTsKKworICAvKiBDcmVhdGUgSS9PIGJ1ZmZlci4gIE5vdGUgd2UgbWFrZSB0aGlzIG5lYXIgb24gYSBQQy4gKi8KKyAgZGVzdC0+YnVmZmVyX3dpZHRoID0gY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKKyAgZGVzdC0+aW9idWZmZXIgPSAoY2hhciAqKQorICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCisJCQkJKHNpemVfdCkgKGRlc3QtPmJ1ZmZlcl93aWR0aCAqIFNJWkVPRihjaGFyKSkpOworCisgIC8qIENyZWF0ZSBkZWNvbXByZXNzb3Igb3V0cHV0IGJ1ZmZlci4gKi8KKyAgZGVzdC0+cHViLmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQorICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsIGRlc3QtPmJ1ZmZlcl93aWR0aCwgKEpESU1FTlNJT04pIDEpOworICBkZXN0LT5wdWIuYnVmZmVyX2hlaWdodCA9IDE7CisKKyAgcmV0dXJuIChkanBlZ19kZXN0X3B0cikgZGVzdDsKK30KKworI2VuZGlmIC8qIFRBUkdBX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJBTkdMRXRyYW5zbGF0aW9uLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJBTkdMRXRyYW5zbGF0aW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjdjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYkFOR0xFdHJhbnNsYXRpb24ubWsKQEAgLTAsMCArMSwzMSBAQAorIyBCdWlsZCBydWxlcyBmb3IgdGhlIHN0YXRpYyBBTkdMRSBwcmVidWlsdCBsaWJyYXJ5LgorQU5HTEVfVFJBTlNMQVRJT05fT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0FOR0xFX1RSQU5TTEFUSU9OX1RPUF9ESVIgOj0gJChBTkdMRV9UUkFOU0xBVElPTl9QUkVCVUlMVFNfRElSKS8kKEJVSUxEX1RBUkdFVF9UQUcpCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSxcCisgICAgZW11bGF0b3ItbGlicHJlcHJvY2Vzc29yLFwKKyAgICAkKEFOR0xFX1RSQU5TTEFUSU9OX1RPUF9ESVIpL2xpYi9saWJwcmVwcm9jZXNzb3IuYSkKKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJ0cmFuc2xhdG9yX2xpYixcCisgICAgJChBTkdMRV9UUkFOU0xBVElPTl9UT1BfRElSKS9saWIvbGlidHJhbnNsYXRvcl9saWIuYSkKKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJhbmdsZV9jb21tb24sXAorICAgICQoQU5HTEVfVFJBTlNMQVRJT05fVE9QX0RJUikvbGliL2xpYmFuZ2xlX2NvbW1vbi5hKQorCiskKGNhbGwgZGVmaW5lLWVtdWxhdG9yLXByZWJ1aWx0LWxpYnJhcnksXAorICAgIGVtdWxhdG9yLWxpYnRyYW5zbGF0b3Jfc3RhdGljLFwKKyAgICAkKEFOR0xFX1RSQU5TTEFUSU9OX1RPUF9ESVIpL2xpYi9saWJ0cmFuc2xhdG9yX3N0YXRpYy5hKQorCitBTkdMRV9UUkFOU0xBVElPTl9JTkNMVURFUyA6PSAkKEFOR0xFX1RSQU5TTEFUSU9OX1RPUF9ESVIpL2luY2x1ZGUKK0FOR0xFX1RSQU5TTEFUSU9OX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGVtdWxhdG9yLWxpYnRyYW5zbGF0b3Jfc3RhdGljIFwKKyAgICBlbXVsYXRvci1saWJ0cmFuc2xhdG9yX2xpYiBcCisgICAgZW11bGF0b3ItbGlicHJlcHJvY2Vzc29yIFwKKyAgICBlbXVsYXRvci1saWJhbmdsZV9jb21tb24gXAorCitMT0NBTF9QQVRIIDo9ICQoQU5HTEVfVFJBTlNMQVRJT05fT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYmJyZWFrcGFkLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJicmVha3BhZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNjY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJicmVha3BhZC5tawpAQCAtMCwwICsxLDMyIEBACisjIEJ1aWxkIHJ1bGVzIGZvciB0aGUgc3RhdGljIGJyZWFrcGFkIHByZWJ1aWx0IGxpYnJhcmllcy4KKworQlJFQUtQQURfT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0JSRUFLUEFEX1RPUF9ESVIgOj0gJChCUkVBS1BBRF9QUkVCVUlMVFNfRElSKS8kKEJVSUxEX1RBUkdFVF9UQUcpCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSxcCisgICAgZW11bGF0b3ItbGliYnJlYWtwYWRfY2xpZW50LCBcCisgICAgJChCUkVBS1BBRF9UT1BfRElSKS9saWIvbGliYnJlYWtwYWRfY2xpZW50LmEpCisKK0JSRUFLUEFEX0NMSUVOVF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBlbXVsYXRvci1saWJicmVha3BhZF9jbGllbnQKK0JSRUFLUEFEX0NMSUVOVF9JTkNMVURFUyA6PSAkKEJSRUFLUEFEX1RPUF9ESVIpL2luY2x1ZGUvYnJlYWtwYWQKK0JSRUFLUEFEX0NMSUVOVF9MRExJQlMgOj0KKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJicmVha3BhZCwgXAorICAgICQoQlJFQUtQQURfVE9QX0RJUikvbGliL2xpYmJyZWFrcGFkLmEpCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSxcCisgICAgZW11bGF0b3ItbGliZGlzYXNtLCBcCisgICAgJChCUkVBS1BBRF9UT1BfRElSKS9saWIvbGliZGlzYXNtLmEpCisKK0JSRUFLUEFEX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGVtdWxhdG9yLWxpYmJyZWFrcGFkIFwKKyAgICBlbXVsYXRvci1saWJkaXNhc20KK0JSRUFLUEFEX0lOQ0xVREVTIDo9ICQoQlJFQUtQQURfVE9QX0RJUikvaW5jbHVkZS9icmVha3BhZAorQlJFQUtQQURfTERMSUJTIDo9CisKK0xPQ0FMX1BBVEggOj0gJChCUkVBS1BBRF9PTERfTE9DQUxfUEFUSCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGliY3VybC5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGliY3VybC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTA4MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJjdXJsLm1rCkBAIC0wLDAgKzEsMzYgQEAKKyMgQnVpbGQgcnVsZXMgZm9yIHRoZSBzdGF0aWMgQ1VSTCBwcmVidWlsdCBsaWJyYXJ5LgorCitMSUJDVVJMX09MRF9MT0NBTF9QQVRIIDo9ICQoTE9DQUxfUEFUSCkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitMSUJDVVJMX1RPUF9ESVIgOj0gJChMSUJDVVJMX1BSRUJVSUxUU19ESVIpLyQoQlVJTERfVEFSR0VUX1RBRykKKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJjdXJsLFwKKyAgICAkKExJQkNVUkxfVE9QX0RJUikvbGliL2xpYmN1cmwuYSkKKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJzc2wsXAorICAgICQoTElCQ1VSTF9UT1BfRElSKS9saWIvbGlic3NsLmEpCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSxcCisgICAgZW11bGF0b3ItbGliY3J5cHRvLFwKKyAgICAkKExJQkNVUkxfVE9QX0RJUikvbGliL2xpYmNyeXB0by5hKQorCitMSUJDVVJMX0lOQ0xVREVTIDo9ICQoTElCQ1VSTF9UT1BfRElSKS9pbmNsdWRlCitMSUJDVVJMX0NGTEFHUyArPSAtRENVUkxfU1RBVElDTElCCitMSUJDVVJMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGVtdWxhdG9yLWxpYmN1cmwgXAorICAgIGVtdWxhdG9yLWxpYnNzbCBcCisgICAgZW11bGF0b3ItbGliY3J5cHRvIFwKKyAgICBlbXVsYXRvci16bGliCisKK2lmZXEgKCQoQlVJTERfVEFSR0VUX09TKSx3aW5kb3dzKQorICAgICMgQmVsaWV2ZSBpdCBvciBub3Q6IGxpYmN1cmwgZGVwZW5kcyBvbiBnZGkzMi5kbGwgb24gV2luZG93cyEKKyAgICBMSUJDVVJMX0xETElCUyArPSAtbGNyeXB0MzIgLWxnZGkzMgorZWxzZQorICAgIExJQkNVUkxfTERMSUJTICs9IC1sZGwKK2VuZGlmCisKK0xPQ0FMX1BBVEggOj0gJChMSUJDVVJMX09MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJwbmcubWsgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnBuZy5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDY2YzNmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJwbmcubWsKQEAgLTAsMCArMSw1IEBACiskKGNhbGwgZGVmaW5lLWVtdWxhdG9yLXByZWJ1aWx0LWxpYnJhcnksXAorICAgIGVtdWxhdG9yLWxpYnBuZyxcCisgICAgJChMSUJQTkdfUFJFQlVJTFRTX0RJUikvJChCVUlMRF9UQVJHRVRfVEFHKS9saWIvbGlicG5nLmEpCisKK0xJQlBOR19JTkNMVURFUyA6PSAkKExJQlBOR19QUkVCVUlMVFNfRElSKS8kKEJVSUxEX1RBUkdFVF9PUykteDg2XzY0L2luY2x1ZGUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9OT1RJQ0UgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvTk9USUNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODYyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvTk9USUNFCkBAIC0wLDAgKzEsMjEgQEAKK1RoaXMgbGlicmFyeSAobGlic2VsaW51eCkgaXMgcHVibGljIGRvbWFpbiBzb2Z0d2FyZSwgaS5lLiBub3QgY29weXJpZ2h0ZWQuCisKK1dhcnJhbnR5IEV4Y2x1c2lvbgorLS0tLS0tLS0tLS0tLS0tLS0tCitZb3UgYWdyZWUgdGhhdCB0aGlzIHNvZnR3YXJlIGlzIGEKK25vbi1jb21tZXJjaWFsbHkgZGV2ZWxvcGVkIHByb2dyYW0gdGhhdCBtYXkgY29udGFpbiAiYnVncyIgKGFzIHRoYXQKK3Rlcm0gaXMgdXNlZCBpbiB0aGUgaW5kdXN0cnkpIGFuZCB0aGF0IGl0IG1heSBub3QgZnVuY3Rpb24gYXMgaW50ZW5kZWQuCitUaGUgc29mdHdhcmUgaXMgbGljZW5zZWQgImFzIGlzIi4gTlNBIG1ha2VzIG5vLCBhbmQgaGVyZWJ5IGV4cHJlc3NseQorZGlzY2xhaW1zIGFsbCwgd2FycmFudGllcywgZXhwcmVzcywgaW1wbGllZCwgc3RhdHV0b3J5LCBvciBvdGhlcndpc2UKK3dpdGggcmVzcGVjdCB0byB0aGUgc29mdHdhcmUsIGluY2x1ZGluZyBub25pbmZyaW5nZW1lbnQgYW5kIHRoZSBpbXBsaWVkCit3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuCisKK0xpbWl0YXRpb24gb2YgTGlhYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSW4gbm8gZXZlbnQgd2lsbCBOU0EgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywgaW5jbHVkaW5nIGxvc3Mgb2YgZGF0YSwKK2xvc3QgcHJvZml0cywgY29zdCBvZiBjb3Zlciwgb3Igb3RoZXIgc3BlY2lhbCwgaW5jaWRlbnRhbCwKK2NvbnNlcXVlbnRpYWwsIGRpcmVjdCBvciBpbmRpcmVjdCBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgc29mdHdhcmUgb3IKK3RoZSB1c2UgdGhlcmVvZiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LiBUaGlzCitsaW1pdGF0aW9uIHdpbGwgYXBwbHkgZXZlbiBpZiBOU0EgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkKK29mIHN1Y2ggZGFtYWdlLiBZb3UgYWNrbm93bGVkZ2UgdGhhdCB0aGlzIGlzIGEgcmVhc29uYWJsZSBhbGxvY2F0aW9uIG9mCityaXNrLgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L1JFQURNRSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlOTZmMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9SRUFETUUKQEAgLTAsMCArMSw0IEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29udGVudCBvZiAkQU9TUC9leHRlcm5hbC9saWJzZWxpbnV4IHRha2VuCitmcm9tIHRoZSBmb2xsb3dpbmcgY29tbWl0OgorCisgICAgZTliNTg5NTBkZjE4ZjU1YTc0ZTNiNzliZmZlN2YxODU1NjYxM2FkMQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9hbmRyb2lkLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvaW5jbHVkZS9zZWxpbnV4L2FuZHJvaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTZjMDVkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9hbmRyb2lkLmgKQEAgLTAsMCArMSw1MSBAQAorI2lmbmRlZiBfU0VMSU5VWF9BTkRST0lEX0hfCisjZGVmaW5lIF9TRUxJTlVYX0FORFJPSURfSF8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gc3RydWN0IHNlbGFiZWxfaGFuZGxlKiBzZWxpbnV4X2FuZHJvaWRfZmlsZV9jb250ZXh0X2hhbmRsZSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgc2VsaW51eF9hbmRyb2lkX3NldF9zZWhhbmRsZShjb25zdCBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhuZGwpOworCitleHRlcm4gaW50IHNlbGludXhfYW5kcm9pZF9sb2FkX3BvbGljeSh2b2lkKTsKKworZXh0ZXJuIGludCBzZWxpbnV4X2FuZHJvaWRfcmVsb2FkX3BvbGljeSh2b2lkKTsKKworZXh0ZXJuIGludCBzZWxpbnV4X2FuZHJvaWRfc2V0Y29udGV4dCh1aWRfdCB1aWQsCisJCQkJICAgICAgaW50IGlzU3lzdGVtU2VydmVyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywKKwkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIGludCBzZWxpbnV4X2FuZHJvaWRfc2V0ZmlsZWNvbihjb25zdCBjaGFyICpwa2dkaXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnBrZ25hbWUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywKKwkJCQkgICAgICAgdWlkX3QgdWlkKTsKKworI2RlZmluZSBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9OT0NIQU5HRSAxCisjZGVmaW5lIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1ZFUkJPU0UgIDIKKyNkZWZpbmUgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fUkVDVVJTRSAgNAorI2RlZmluZSBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9GT1JDRSAgICA4CisjZGVmaW5lIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX0RBVEFEQVRBIDE2CitleHRlcm4gaW50IHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBmbGFncyk7CisKK2V4dGVybiBpbnQgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb25fcGtnZGlyKGNvbnN0IGNoYXIgKnBrZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyk7CisKK2V4dGVybiBpbnQgc2VsaW51eF9hbmRyb2lkX3NlYXBwX2NvbnRleHRfcmVsb2FkKHZvaWQpOworCitleHRlcm4gYm9vbCBzZWxpbnV4X2FuZHJvaWRfdXNlX2RhdGFfcG9saWN5KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvaW5jbHVkZS9zZWxpbnV4L2F2Yy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9hdmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTFhNmRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9hdmMuaApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIEFjY2VzcyB2ZWN0b3IgY2FjaGUgaW50ZXJmYWNlIGZvciBvYmplY3QgbWFuYWdlcnMuCisgKgorICogQXV0aG9yIDogRWFtb24gV2Fsc2ggPGV3YWxzaEBlcG9jaC5uY3NjLm1pbD4KKyAqLworI2lmbmRlZiBfU0VMSU5VWF9BVkNfSF8KKyNkZWZpbmUgX1NFTElOVVhfQVZDX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBTSUQgZm9ybWF0IGFuZCBvcGVyYXRpb25zCisgKi8KK3N0cnVjdCBzZWN1cml0eV9pZCB7CisJY2hhciAqIGN0eDsKKwl1bnNpZ25lZCBpbnQgcmVmY250OworfTsKK3R5cGVkZWYgc3RydWN0IHNlY3VyaXR5X2lkICpzZWN1cml0eV9pZF90OworCisjZGVmaW5lIFNFQ1NJRF9XSUxEIChzZWN1cml0eV9pZF90KU5VTEwJLyogdW5zcGVjaWZpZWQgU0lEICovCisKKy8qKgorICogYXZjX3NpZF90b19jb250ZXh0IC0gZ2V0IGNvcHkgb2YgY29udGV4dCBjb3JyZXNwb25kaW5nIHRvIFNJRC4KKyAqIEBzaWQ6IGlucHV0IFNJRAorICogQGN0eDogcG9pbnRlciB0byBjb250ZXh0IHJlZmVyZW5jZQorICoKKyAqIFJldHVybiBhIGNvcHkgb2YgdGhlIHNlY3VyaXR5IGNvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQKKyAqIEBzaWQgaW4gdGhlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IEBjdHguICBUaGUgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIAorICogZnJlZSB0aGUgY29udGV4dCB3aXRoIGZyZWVjb24oKS4gIFJldHVybiAlMCBvbiBzdWNjZXNzLCAtJTEgb24KKyAqIGZhaWx1cmUsIHdpdGggQGVycm5vIHNldCB0byAlRU5PTUVNIGlmIGluc3VmZmljaWVudCBtZW1vcnkgd2FzCisgKiBhdmFpbGFibGUgdG8gbWFrZSB0aGUgY29weSwgb3IgJUVJTlZBTCBpZiB0aGUgaW5wdXQgU0lEIGlzIGludmFsaWQuCisgKi8KK2ludCBhdmNfc2lkX3RvX2NvbnRleHQoc2VjdXJpdHlfaWRfdCBzaWQsIGNoYXIgKiogY3R4KTsKK2ludCBhdmNfc2lkX3RvX2NvbnRleHRfcmF3KHNlY3VyaXR5X2lkX3Qgc2lkLCBjaGFyICoqIGN0eCk7CisKKy8qKgorICogYXZjX2NvbnRleHRfdG9fc2lkIC0gZ2V0IFNJRCBmb3IgY29udGV4dC4KKyAqIEBjdHg6IGlucHV0IHNlY3VyaXR5IGNvbnRleHQKKyAqIEBzaWQ6IHBvaW50ZXIgdG8gU0lEIHJlZmVyZW5jZQorICoKKyAqIExvb2sgdXAgc2VjdXJpdHkgY29udGV4dCBAY3R4IGluIFNJRCB0YWJsZSwgbWFraW5nCisgKiBhIG5ldyBlbnRyeSBpZiBAY3R4IGlzIG5vdCBmb3VuZC4gIEluY3JlbWVudCB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudGVyIGZvciB0aGUgU0lELiAgU3RvcmUgYSBwb2ludGVyCisgKiB0byB0aGUgU0lEIHN0cnVjdHVyZSBpbnRvIHRoZSBtZW1vcnkgcmVmZXJlbmNlZCBieSBAc2lkLCAKKyAqIHJldHVybmluZyAlMCBvbiBzdWNjZXNzIG9yIC0lMSBvbiBlcnJvciB3aXRoIEBlcnJubyBzZXQuICAKKyAqLworaW50IGF2Y19jb250ZXh0X3RvX3NpZChjb25zdCBjaGFyICogY3R4LCBzZWN1cml0eV9pZF90ICogc2lkKTsKK2ludCBhdmNfY29udGV4dF90b19zaWRfcmF3KGNvbnN0IGNoYXIgKiBjdHgsIHNlY3VyaXR5X2lkX3QgKiBzaWQpOworCisvKioKKyAqIHNpZGdldCAtIGluY3JlbWVudCBTSUQgcmVmZXJlbmNlIGNvdW50ZXIuCisgKiBAc2lkOiBTSUQgcmVmZXJlbmNlCisgKgorICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRlciBmb3IgQHNpZCwgaW5kaWNhdGluZyB0aGF0CisgKiBAc2lkIGlzIGluIHVzZSBieSBhbiAoYWRkaXRpb25hbCkgb2JqZWN0LiAgUmV0dXJuIHRoZQorICogbmV3IHJlZmVyZW5jZSBjb3VudCwgb3IgemVybyBpZiBAc2lkIGlzIGludmFsaWQgKGhhcyB6ZXJvCisgKiByZWZlcmVuY2UgY291bnQpLiAgTm90ZSB0aGF0IGF2Y19jb250ZXh0X3RvX3NpZCgpIGFsc28KKyAqIGluY3JlbWVudHMgcmVmZXJlbmNlIGNvdW50cy4KKyAqLworaW50IHNpZGdldChzZWN1cml0eV9pZF90IHNpZCk7CisKKy8qKgorICogc2lkcHV0IC0gZGVjcmVtZW50IFNJRCByZWZlcmVuY2UgY291bnRlci4KKyAqIEBzaWQ6IFNJRCByZWZlcmVuY2UKKyAqCisgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGZvciBAc2lkLCBpbmRpY2F0aW5nIHRoYXQKKyAqIGEgcmVmZXJlbmNlIHRvIEBzaWQgaXMgbm8gbG9uZ2VyIGluIHVzZS4gIFJldHVybiB0aGUgCisgKiBuZXcgcmVmZXJlbmNlIGNvdW50LiAgV2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMKKyAqIHplcm8sIHRoZSBTSUQgaXMgaW52YWxpZCwgYW5kIGF2Y19jb250ZXh0X3RvX3NpZCgpIG11c3QKKyAqIGJlIGNhbGxlZCB0byBvYnRhaW4gYSBuZXcgU0lEIGZvciB0aGUgc2VjdXJpdHkgY29udGV4dC4KKyAqLworaW50IHNpZHB1dChzZWN1cml0eV9pZF90IHNpZCk7CisKKy8qKgorICogYXZjX2dldF9pbml0aWFsX3NpZCAtIGdldCBTSUQgZm9yIGFuIGluaXRpYWwga2VybmVsIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEBuYW1lOiBpbnB1dCBuYW1lIG9mIGluaXRpYWwga2VybmVsIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEBzaWQ6IHBvaW50ZXIgdG8gYSBTSUQgcmVmZXJlbmNlCisgKgorICogR2V0IHRoZSBjb250ZXh0IGZvciBhbiBpbml0aWFsIGtlcm5lbCBzZWN1cml0eSBpZGVudGlmaWVyIHNwZWNpZmllZCBieSAKKyAqIEBuYW1lIHVzaW5nIHNlY3VyaXR5X2dldF9pbml0aWFsX2NvbnRleHQoKSBhbmQgdGhlbiBjYWxsIAorICogYXZjX2NvbnRleHRfdG9fc2lkKCkgdG8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIFNJRC4KKyAqLworaW50IGF2Y19nZXRfaW5pdGlhbF9zaWQoY29uc3QgY2hhciAqbmFtZSwgc2VjdXJpdHlfaWRfdCAqIHNpZCk7CisKKy8qCisgKiBBVkMgZW50cnkKKyAqLworc3RydWN0IGF2Y19lbnRyeTsKK3N0cnVjdCBhdmNfZW50cnlfcmVmIHsKKwlzdHJ1Y3QgYXZjX2VudHJ5ICphZTsKK307CisKKy8qKgorICogYXZjX2VudHJ5X3JlZl9pbml0IC0gaW5pdGlhbGl6ZSBhbiBBVkMgZW50cnkgcmVmZXJlbmNlLgorICogQGFlcmVmOiBwb2ludGVyIHRvIGF2YyBlbnRyeSByZWZlcmVuY2Ugc3RydWN0dXJlCisgKgorICogVXNlIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSBhbiBhdmMgZW50cnkgcmVmZXJlbmNlIHN0cnVjdHVyZQorICogYmVmb3JlIGZpcnN0IHVzZS4gIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHBhc3NlZCB0byBhdmNfaGFzX3Blcm0oKSwKKyAqIHdoaWNoIHN0b3JlcyBjYWNoZSBlbnRyeSByZWZlcmVuY2VzIGluIHRoZW0uICBUaGV5IGNhbiBpbmNyZWFzZQorICogcGVyZm9ybWFuY2Ugb24gcmVwZWF0ZWQgcXVlcmllcy4KKyAqLworI2RlZmluZSBhdmNfZW50cnlfcmVmX2luaXQoYWVyZWYpICgoYWVyZWYpLT5hZSA9IE5VTEwpCisKKy8qCisgKiBVc2VyLXByb3ZpZGVkIGNhbGxiYWNrcyBmb3IgbWVtb3J5LCBhdWRpdGluZywgYW5kIGxvY2tpbmcKKyAqLworCisvKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGF2Y19pbml0KCkuICBQYXNzaW5nCisgKiBhIE5VTEwgcmVmZXJlbmNlIHdpbGwgY2F1c2UgdGhlIEFWQyB0byB1c2UgYSBkZWZhdWx0LiAgVGhlIGRlZmF1bHQKKyAqIG1lbW9yeSBjYWxsYmFja3MgYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkuICBUaGUgZGVmYXVsdCBsb2dnaW5nIG1ldGhvZAorICogaXMgdG8gcHJpbnQgb24gc3RkZXJyLiAgSWYgbm8gdGhyZWFkIGNhbGxiYWNrcyBhcmUgcGFzc2VkLCBhIHNlcGFyYXRlCisgKiBsaXN0ZW5pbmcgdGhyZWFkIHdvbid0IGJlIHN0YXJ0ZWQgZm9yIGtlcm5lbCBwb2xpY3kgY2hhbmdlIG1lc3NhZ2VzLgorICogSWYgbm8gbG9ja2luZyBjYWxsYmFja3MgYXJlIHBhc3NlZCwgbm8gbG9ja2luZyB3aWxsIHRha2UgcGxhY2UuCisgKi8KK3N0cnVjdCBhdmNfbWVtb3J5X2NhbGxiYWNrIHsKKwkvKiBtYWxsb2MoKSBlcXVpdmFsZW50LiAqLworCXZvaWQgKigqZnVuY19tYWxsb2MpIChzaXplX3Qgc2l6ZSk7CisJLyogZnJlZSgpIGVxdWl2YWxlbnQuICovCisJdm9pZCAoKmZ1bmNfZnJlZSkgKHZvaWQgKnB0cik7CisJLyogTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgc2V0IGVycm5vIG9uIGZhaWx1cmUuCisJICAgSWYgbm90LCBzb21lIGF2YyByb3V0aW5lcyBtYXkgcmV0dXJuIC0xIHdpdGhvdXQgZXJybm8gc2V0LiAqLworfTsKKworc3RydWN0IGF2Y19sb2dfY2FsbGJhY2sgeworCS8qIGxvZyB0aGUgcHJpbnRmLXN0eWxlIGZvcm1hdCBhbmQgYXJndW1lbnRzLiAqLworCXZvaWQgKCpmdW5jX2xvZykgKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwkvKiBzdG9yZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhdWRpdGRhdGEgKGNvcnJlc3BvbmRpbmcKKwkgICB0byB0aGUgZ2l2ZW4gc2VjdXJpdHkgY2xhc3MpIGludG8gbXNnYnVmLiAqLworCXZvaWQgKCpmdW5jX2F1ZGl0KSAodm9pZCAqYXVkaXRkYXRhLCBzZWN1cml0eV9jbGFzc190IGNscywKKwkJCSAgICBjaGFyICptc2didWYsIHNpemVfdCBtc2didWZzaXplKTsKK307CisKK3N0cnVjdCBhdmNfdGhyZWFkX2NhbGxiYWNrIHsKKwkvKiBjcmVhdGUgYW5kIHN0YXJ0IGEgdGhyZWFkLCByZXR1cm5pbmcgYW4gb3BhcXVlIHBvaW50ZXIgdG8gaXQ7IAorCSAgIHRoZSB0aHJlYWQgc2hvdWxkIHJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24uICovCisJdm9pZCAqKCpmdW5jX2NyZWF0ZV90aHJlYWQpICh2b2lkICgqcnVuKSAodm9pZCkpOworCS8qIGNhbmNlbCBhIGdpdmVuIHRocmVhZCBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzLiAqLworCXZvaWQgKCpmdW5jX3N0b3BfdGhyZWFkKSAodm9pZCAqdGhyZWFkKTsKK307CisKK3N0cnVjdCBhdmNfbG9ja19jYWxsYmFjayB7CisJLyogY3JlYXRlIGEgbG9jayBhbmQgcmV0dXJuIGFuIG9wYXF1ZSBwb2ludGVyIHRvIGl0LiAqLworCXZvaWQgKigqZnVuY19hbGxvY19sb2NrKSAodm9pZCk7CisJLyogb2J0YWluIGEgZ2l2ZW4gbG9jaywgYmxvY2tpbmcgaWYgbmVjZXNzYXJ5LiAqLworCXZvaWQgKCpmdW5jX2dldF9sb2NrKSAodm9pZCAqbG9jayk7CisJLyogcmVsZWFzZSBhIGdpdmVuIGxvY2suICovCisJdm9pZCAoKmZ1bmNfcmVsZWFzZV9sb2NrKSAodm9pZCAqbG9jayk7CisJLyogZGVzdHJveSBhIGdpdmVuIGxvY2sgKGZyZWUgbWVtb3J5LCBldGMuKSAqLworCXZvaWQgKCpmdW5jX2ZyZWVfbG9jaykgKHZvaWQgKmxvY2spOworfTsKKworLyoKKyAqIEF2YWlsYWJsZSBvcHRpb25zCisgKi8KKworLyogbm8tb3Agb3B0aW9uLCB1c2VmdWwgZm9yIHVudXNlZCBzbG90cyBpbiBhbiBhcnJheSBvZiBvcHRpb25zICovCisjZGVmaW5lIEFWQ19PUFRfVU5VU0VECQkwCisvKiBvdmVycmlkZSBrZXJuZWwgZW5mb3JjaW5nIG1vZGUgKGJvb2xlYW4gdmFsdWUpICovCisjZGVmaW5lIEFWQ19PUFRfU0VURU5GT1JDRQkxCisKKy8qCisgKiBBVkMgb3BlcmF0aW9ucworICovCisKKy8qKgorICogYXZjX2luaXQgLSBJbml0aWFsaXplIHRoZSBBVkMuCisgKiBAbXNncHJlZml4OiBwcmVmaXggZm9yIGxvZyBtZXNzYWdlcworICogQG1lbV9jYWxsYmFja3M6IHVzZXItc3VwcGxpZWQgbWVtb3J5IGNhbGxiYWNrcworICogQGxvZ19jYWxsYmFja3M6IHVzZXItc3VwcGxpZWQgbG9nZ2luZyBjYWxsYmFja3MKKyAqIEB0aHJlYWRfY2FsbGJhY2tzOiB1c2VyLXN1cHBsaWVkIHRocmVhZGluZyBjYWxsYmFja3MKKyAqIEBsb2NrX2NhbGxiYWNrczogdXNlci1zdXBwbGllZCBsb2NraW5nIGNhbGxiYWNrcworICoKKyAqIEluaXRpYWxpemUgdGhlIGFjY2VzcyB2ZWN0b3IgY2FjaGUuICBSZXR1cm4gJTAgb24KKyAqIHN1Y2Nlc3Mgb3IgLSUxIHdpdGggQGVycm5vIHNldCBvbiBmYWlsdXJlLiAgCisgKiBJZiBAbXNncHJlZml4IGlzIE5VTEwsIHVzZSAidWF2YyIuICBJZiBhbnkgY2FsbGJhY2sgCisgKiBzdHJ1Y3R1cmUgcmVmZXJlbmNlcyBhcmUgTlVMTCwgdXNlIGRlZmF1bHQgbWV0aG9kcyAKKyAqIGZvciB0aG9zZSBjYWxsYmFja3MgKHNlZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2FsbGJhY2sKKyAqIHN0cnVjdHVyZXMgYWJvdmUpLgorICovCitpbnQgYXZjX2luaXQoY29uc3QgY2hhciAqbXNncHJlZml4LAorCSAgICAgY29uc3Qgc3RydWN0IGF2Y19tZW1vcnlfY2FsbGJhY2sgKm1lbV9jYWxsYmFja3MsCisJICAgICBjb25zdCBzdHJ1Y3QgYXZjX2xvZ19jYWxsYmFjayAqbG9nX2NhbGxiYWNrcywKKwkgICAgIGNvbnN0IHN0cnVjdCBhdmNfdGhyZWFkX2NhbGxiYWNrICp0aHJlYWRfY2FsbGJhY2tzLAorCSAgICAgY29uc3Qgc3RydWN0IGF2Y19sb2NrX2NhbGxiYWNrICpsb2NrX2NhbGxiYWNrcyk7CisKKy8qKgorICogYXZjX29wZW4gLSBJbml0aWFsaXplIHRoZSBBVkMuCisgKiBAb3B0czogYXJyYXkgb2Ygc2VsYWJlbF9vcHQgc3RydWN0dXJlcyBzcGVjaWZ5aW5nIEFWQyBvcHRpb25zIG9yIE5VTEwuCisgKiBAbm9wdHM6IG51bWJlciBvZiBlbGVtZW50cyBpbiBvcHRzIGFycmF5IG9yIHplcm8gZm9yIG5vIG9wdGlvbnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gYXZjX2luaXQoKSwgZXhjZXB0IHRoZSBtZXNzYWdlIHByZWZpeAorICogaXMgc2V0IHRvICJhdmMiIGFuZCBhbnkgY2FsbGJhY2tzIGRlc2lyZWQgc2hvdWxkIGJlIHNwZWNpZmllZCB2aWEKKyAqIHNlbGludXhfc2V0X2NhbGxiYWNrKCkuICBBdmFpbGFibGUgb3B0aW9ucyBhcmUgbGlzdGVkIGFib3ZlLgorICovCitpbnQgYXZjX29wZW4oc3RydWN0IHNlbGludXhfb3B0ICpvcHRzLCB1bnNpZ25lZCBub3B0cyk7CisKKy8qKgorICogYXZjX2NsZWFudXAgLSBSZW1vdmUgdW51c2VkIFNJRHMgYW5kIEFWQyBlbnRyaWVzLgorICoKKyAqIFNlYXJjaCB0aGUgU0lEIHRhYmxlIGZvciBTSUQgc3RydWN0dXJlcyB3aXRoIHplcm8KKyAqIHJlZmVyZW5jZSBjb3VudHMsIGFuZCByZW1vdmUgdGhlbSBhbG9uZyB3aXRoIGFsbAorICogQVZDIGVudHJpZXMgdGhhdCByZWZlcmVuY2UgdGhlbS4gIFRoaXMgY2FuIGJlIHVzZWQKKyAqIHRvIHJldHVybiBtZW1vcnkgdG8gdGhlIHN5c3RlbS4KKyAqLwordm9pZCBhdmNfY2xlYW51cCh2b2lkKTsKKworLyoqCisgKiBhdmNfcmVzZXQgLSBGbHVzaCB0aGUgY2FjaGUgYW5kIHJlc2V0IHN0YXRpc3RpY3MuCisgKgorICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIGNhY2hlIGFuZCByZXNldCBhbGwgYWNjZXNzCisgKiBzdGF0aXN0aWNzIChhcyByZXR1cm5lZCBieSBhdmNfY2FjaGVfc3RhdHMoKSkgdG8gemVyby4KKyAqIFRoZSBTSUQgbWFwcGluZyBpcyBub3QgYWZmZWN0ZWQuICBSZXR1cm4gJTAgb24gc3VjY2VzcywgCisgKiAtJTEgd2l0aCBAZXJybm8gc2V0IG9uIGVycm9yLgorICovCitpbnQgYXZjX3Jlc2V0KHZvaWQpOworCisvKioKKyAqIGF2Y19kZXN0cm95IC0gRnJlZSBhbGwgQVZDIHN0cnVjdHVyZXMuCisgKgorICogRGVzdHJveSBhbGwgQVZDIHN0cnVjdHVyZXMgYW5kIGZyZWUgYWxsIGFsbG9jYXRlZAorICogbWVtb3J5LiAgVXNlci1zdXBwbGllZCBsb2NraW5nLCBtZW1vcnksIGFuZCBhdWRpdAorICogY2FsbGJhY2tzIHdpbGwgYmUgcmV0YWluZWQsIGJ1dCBzZWN1cml0eS1ldmVudAorICogY2FsbGJhY2tzIHdpbGwgbm90LiAgQWxsIFNJRCdzIHdpbGwgYmUgaW52YWxpZGF0ZWQuCisgKiBVc2VyIG11c3QgY2FsbCBhdmNfaW5pdCgpIGlmIGZ1cnRoZXIgdXNlIG9mIEFWQyBpcyBkZXNpcmVkLgorICovCit2b2lkIGF2Y19kZXN0cm95KHZvaWQpOworCisvKioKKyAqIGF2Y19oYXNfcGVybV9ub2F1ZGl0IC0gQ2hlY2sgcGVybWlzc2lvbnMgYnV0IHBlcmZvcm0gbm8gYXVkaXRpbmcuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAcmVxdWVzdGVkOiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMsIGludGVycHJldGVkIGJhc2VkIG9uIEB0Y2xhc3MKKyAqIEBhZXJlZjogIEFWQyBlbnRyeSByZWZlcmVuY2UKKyAqIEBhdmQ6IGFjY2VzcyB2ZWN0b3IgZGVjaXNpb25zCisgKgorICogQ2hlY2sgdGhlIEFWQyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgQHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZAorICogZm9yIHRoZSBTSUQgcGFpciAoQHNzaWQsIEB0c2lkKSwgaW50ZXJwcmV0aW5nIHRoZSBwZXJtaXNzaW9ucworICogYmFzZWQgb24gQHRjbGFzcywgYW5kIGNhbGwgdGhlIHNlY3VyaXR5IHNlcnZlciBvbiBhIGNhY2hlIG1pc3MgdG8gb2J0YWluCisgKiBhIG5ldyBkZWNpc2lvbiBhbmQgYWRkIGl0IHRvIHRoZSBjYWNoZS4gIFVwZGF0ZSBAYWVyZWYgdG8gcmVmZXIgdG8gYW4gQVZDCisgKiBlbnRyeSB3aXRoIHRoZSByZXN1bHRpbmcgZGVjaXNpb25zLCBhbmQgcmV0dXJuIGEgY29weSBvZiB0aGUgZGVjaXNpb25zCisgKiBpbiBAYXZkLiAgUmV0dXJuICUwIGlmIGFsbCBAcmVxdWVzdGVkIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLCAtJTEgd2l0aAorICogQGVycm5vIHNldCB0byAlRUFDQ0VTIGlmIGFueSBwZXJtaXNzaW9ucyBhcmUgZGVuaWVkLCBvciB0byBhbm90aGVyIHZhbHVlCisgKiB1cG9uIG90aGVyIGVycm9ycy4gIFRoaXMgZnVuY3Rpb24gaXMgdHlwaWNhbGx5IGNhbGxlZCBieSBhdmNfaGFzX3Blcm0oKSwKKyAqIGJ1dCBtYXkgYWxzbyBiZSBjYWxsZWQgZGlyZWN0bHkgdG8gc2VwYXJhdGUgcGVybWlzc2lvbiBjaGVja2luZyBmcm9tCisgKiBhdWRpdGluZywgZS5nLiBpbiBjYXNlcyB3aGVyZSBhIGxvY2sgbXVzdCBiZSBoZWxkIGZvciB0aGUgY2hlY2sgYnV0CisgKiBzaG91bGQgYmUgcmVsZWFzZWQgZm9yIHRoZSBhdWRpdGluZy4KKyAqLworaW50IGF2Y19oYXNfcGVybV9ub2F1ZGl0KHNlY3VyaXR5X2lkX3Qgc3NpZCwKKwkJCSBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQkgYWNjZXNzX3ZlY3Rvcl90IHJlcXVlc3RlZCwKKwkJCSBzdHJ1Y3QgYXZjX2VudHJ5X3JlZiAqYWVyZWYsIHN0cnVjdCBhdl9kZWNpc2lvbiAqYXZkKTsKKworLyoqCisgKiBhdmNfaGFzX3Blcm0gLSBDaGVjayBwZXJtaXNzaW9ucyBhbmQgcGVyZm9ybSBhbnkgYXBwcm9wcmlhdGUgYXVkaXRpbmcuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAcmVxdWVzdGVkOiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMsIGludGVycHJldGVkIGJhc2VkIG9uIEB0Y2xhc3MKKyAqIEBhZXJlZjogIEFWQyBlbnRyeSByZWZlcmVuY2UKKyAqIEBhdWRpdGRhdGE6IGF1eGlsaWFyeSBhdWRpdCBkYXRhCisgKgorICogQ2hlY2sgdGhlIEFWQyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgQHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBhcmUgZ3JhbnRlZAorICogZm9yIHRoZSBTSUQgcGFpciAoQHNzaWQsIEB0c2lkKSwgaW50ZXJwcmV0aW5nIHRoZSBwZXJtaXNzaW9ucworICogYmFzZWQgb24gQHRjbGFzcywgYW5kIGNhbGwgdGhlIHNlY3VyaXR5IHNlcnZlciBvbiBhIGNhY2hlIG1pc3MgdG8gb2J0YWluCisgKiBhIG5ldyBkZWNpc2lvbiBhbmQgYWRkIGl0IHRvIHRoZSBjYWNoZS4gIFVwZGF0ZSBAYWVyZWYgdG8gcmVmZXIgdG8gYW4gQVZDCisgKiBlbnRyeSB3aXRoIHRoZSByZXN1bHRpbmcgZGVjaXNpb25zLiAgQXVkaXQgdGhlIGdyYW50aW5nIG9yIGRlbmlhbCBvZgorICogcGVybWlzc2lvbnMgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBwb2xpY3kuICBSZXR1cm4gJTAgaWYgYWxsIEByZXF1ZXN0ZWQKKyAqIHBlcm1pc3Npb25zIGFyZSBncmFudGVkLCAtJTEgd2l0aCBAZXJybm8gc2V0IHRvICVFQUNDRVMgaWYgYW55IHBlcm1pc3Npb25zCisgKiBhcmUgZGVuaWVkIG9yIHRvIGFub3RoZXIgdmFsdWUgdXBvbiBvdGhlciBlcnJvcnMuCisgKi8KK2ludCBhdmNfaGFzX3Blcm0oc2VjdXJpdHlfaWRfdCBzc2lkLCBzZWN1cml0eV9pZF90IHRzaWQsCisJCSBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHJlcXVlc3RlZCwKKwkJIHN0cnVjdCBhdmNfZW50cnlfcmVmICphZXJlZiwgdm9pZCAqYXVkaXRkYXRhKTsKKworLyoqCisgKiBhdmNfYXVkaXQgLSBBdWRpdCB0aGUgZ3JhbnRpbmcgb3IgZGVuaWFsIG9mIHBlcm1pc3Npb25zLgorICogQHNzaWQ6IHNvdXJjZSBzZWN1cml0eSBpZGVudGlmaWVyCisgKiBAdHNpZDogdGFyZ2V0IHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0Y2xhc3M6IHRhcmdldCBzZWN1cml0eSBjbGFzcworICogQHJlcXVlc3RlZDogcmVxdWVzdGVkIHBlcm1pc3Npb25zCisgKiBAYXZkOiBhY2Nlc3MgdmVjdG9yIGRlY2lzaW9ucworICogQHJlc3VsdDogcmVzdWx0IGZyb20gYXZjX2hhc19wZXJtX25vYXVkaXQKKyAqIEBhdWRpdGRhdGE6ICBhdXhpbGlhcnkgYXVkaXQgZGF0YQorICoKKyAqIEF1ZGl0IHRoZSBncmFudGluZyBvciBkZW5pYWwgb2YgcGVybWlzc2lvbnMgaW4gYWNjb3JkYW5jZQorICogd2l0aCB0aGUgcG9saWN5LiAgVGhpcyBmdW5jdGlvbiBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5CisgKiBhdmNfaGFzX3Blcm0oKSBhZnRlciBhIHBlcm1pc3Npb24gY2hlY2ssIGJ1dCBjYW4gYWxzbyBiZQorICogY2FsbGVkIGRpcmVjdGx5IGJ5IGNhbGxlcnMgd2hvIHVzZSBhdmNfaGFzX3Blcm1fbm9hdWRpdCgpCisgKiBpbiBvcmRlciB0byBzZXBhcmF0ZSB0aGUgcGVybWlzc2lvbiBjaGVjayBmcm9tIHRoZSBhdWRpdGluZy4KKyAqIEZvciBleGFtcGxlLCB0aGlzIHNlcGFyYXRpb24gaXMgdXNlZnVsIHdoZW4gdGhlIHBlcm1pc3Npb24gY2hlY2sgbXVzdAorICogYmUgcGVyZm9ybWVkIHVuZGVyIGEgbG9jaywgdG8gYWxsb3cgdGhlIGxvY2sgdG8gYmUgcmVsZWFzZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHRoZSBhdWRpdGluZyBjb2RlLgorICovCit2b2lkIGF2Y19hdWRpdChzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkgICAgICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsIGFjY2Vzc192ZWN0b3JfdCByZXF1ZXN0ZWQsCisJICAgICAgIHN0cnVjdCBhdl9kZWNpc2lvbiAqYXZkLCBpbnQgcmVzdWx0LCB2b2lkICphdWRpdGRhdGEpOworCisvKioKKyAqIGF2Y19jb21wdXRlX2NyZWF0ZSAtIENvbXB1dGUgU0lEIGZvciBsYWJlbGluZyBhIG5ldyBvYmplY3QuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAbmV3c2lkOiBwb2ludGVyIHRvIFNJRCByZWZlcmVuY2UKKyAqCisgKiBDYWxsIHRoZSBzZWN1cml0eSBzZXJ2ZXIgdG8gb2J0YWluIGEgY29udGV4dCBmb3IgbGFiZWxpbmcgYQorICogbmV3IG9iamVjdC4gIExvb2sgdXAgdGhlIGNvbnRleHQgaW4gdGhlIFNJRCB0YWJsZSwgbWFraW5nCisgKiBhIG5ldyBlbnRyeSBpZiBub3QgZm91bmQuICBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudGVyCisgKiBmb3IgdGhlIFNJRC4gIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgU0lEIHN0cnVjdHVyZSBpbnRvIHRoZQorICogbWVtb3J5IHJlZmVyZW5jZWQgYnkgQG5ld3NpZCwgcmV0dXJuaW5nICUwIG9uIHN1Y2Nlc3Mgb3IgLSUxIG9uCisgKiBlcnJvciB3aXRoIEBlcnJubyBzZXQuICAKKyAqLworaW50IGF2Y19jb21wdXRlX2NyZWF0ZShzZWN1cml0eV9pZF90IHNzaWQsCisJCSAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsCisJCSAgICAgICBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgc2VjdXJpdHlfaWRfdCAqIG5ld3NpZCk7CisKKy8qKgorICogYXZjX2NvbXB1dGVfbWVtYmVyIC0gQ29tcHV0ZSBTSUQgZm9yIHBvbHlpbnN0YW50YXRpb24uCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAbmV3c2lkOiBwb2ludGVyIHRvIFNJRCByZWZlcmVuY2UKKyAqCisgKiBDYWxsIHRoZSBzZWN1cml0eSBzZXJ2ZXIgdG8gb2J0YWluIGEgY29udGV4dCBmb3IgbGFiZWxpbmcgYW4KKyAqIG9iamVjdCBpbnN0YW5jZS4gIExvb2sgdXAgdGhlIGNvbnRleHQgaW4gdGhlIFNJRCB0YWJsZSwgbWFraW5nCisgKiBhIG5ldyBlbnRyeSBpZiBub3QgZm91bmQuICBJbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudGVyCisgKiBmb3IgdGhlIFNJRC4gIFN0b3JlIGEgcG9pbnRlciB0byB0aGUgU0lEIHN0cnVjdHVyZSBpbnRvIHRoZQorICogbWVtb3J5IHJlZmVyZW5jZWQgYnkgQG5ld3NpZCwgcmV0dXJuaW5nICUwIG9uIHN1Y2Nlc3Mgb3IgLSUxIG9uCisgKiBlcnJvciB3aXRoIEBlcnJubyBzZXQuICAKKyAqLworaW50IGF2Y19jb21wdXRlX21lbWJlcihzZWN1cml0eV9pZF90IHNzaWQsCisJCSAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsCisJCSAgICAgICBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgc2VjdXJpdHlfaWRfdCAqIG5ld3NpZCk7CisKKy8qIAorICogc2VjdXJpdHkgZXZlbnQgY2FsbGJhY2sgZmFjaWxpdHkKKyAqLworCisvKiBzZWN1cml0eSBldmVudHMgKi8KKyNkZWZpbmUgQVZDX0NBTExCQUNLX0dSQU5UCQkxCisjZGVmaW5lIEFWQ19DQUxMQkFDS19UUllfUkVWT0tFCQkyCisjZGVmaW5lIEFWQ19DQUxMQkFDS19SRVZPS0UJCTQKKyNkZWZpbmUgQVZDX0NBTExCQUNLX1JFU0VUCQk4CisjZGVmaW5lIEFWQ19DQUxMQkFDS19BVURJVEFMTE9XX0VOQUJMRQkxNgorI2RlZmluZSBBVkNfQ0FMTEJBQ0tfQVVESVRBTExPV19ESVNBQkxFCTMyCisjZGVmaW5lIEFWQ19DQUxMQkFDS19BVURJVERFTllfRU5BQkxFCTY0CisjZGVmaW5lIEFWQ19DQUxMQkFDS19BVURJVERFTllfRElTQUJMRQkxMjgKKworLyoqCisgKiBhdmNfYWRkX2NhbGxiYWNrIC0gUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3Igc2VjdXJpdHkgZXZlbnRzLgorICogQGNhbGxiYWNrOiBjYWxsYmFjayBmdW5jdGlvbgorICogQGV2ZW50czogYml0d2lzZSBPUiBvZiBkZXNpcmVkIHNlY3VyaXR5IGV2ZW50cworICogQHNzaWQ6IHNvdXJjZSBzZWN1cml0eSBpZGVudGlmaWVyIG9yICVTRUNTSURfV0lMRAorICogQHRzaWQ6IHRhcmdldCBzZWN1cml0eSBpZGVudGlmaWVyIG9yICVTRUNTSURfV0lMRAorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAcGVybXM6IHBlcm1pc3Npb25zCisgKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgZXZlbnRzIGluIHRoZSBzZXQgQGV2ZW50cworICogcmVsYXRlZCB0byB0aGUgU0lEIHBhaXIgKEBzc2lkLCBAdHNpZCkgYW5kCisgKiBhbmQgdGhlIHBlcm1pc3Npb25zIEBwZXJtcywgaW50ZXJwcmV0aW5nCisgKiBAcGVybXMgYmFzZWQgb24gQHRjbGFzcy4gIFJldHVybnMgJTAgb24gc3VjY2VzcyBvcgorICogLSUxIGlmIGluc3VmZmljaWVudCBtZW1vcnkgZXhpc3RzIHRvIGFkZCB0aGUgY2FsbGJhY2suCisgKi8KK2ludCBhdmNfYWRkX2NhbGxiYWNrKGludCAoKmNhbGxiYWNrKQorCQkgICAgICAodWludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwKKwkJICAgICAgIHNlY3VyaXR5X2lkX3QgdHNpZCwgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCSAgICAgICBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCSAgICAgICBhY2Nlc3NfdmVjdG9yX3QgKiBvdXRfcmV0YWluZWQpLAorCQkgICAgIHVpbnQzMl90IGV2ZW50cywgc2VjdXJpdHlfaWRfdCBzc2lkLAorCQkgICAgIHNlY3VyaXR5X2lkX3QgdHNpZCwgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCSAgICAgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zKTsKKworLyoKKyAqIEFWQyBzdGF0aXN0aWNzIAorICovCisKKy8qIElmIHNldCwgY2FjaGUgc3RhdGlzdGljcyBhcmUgdHJhY2tlZC4gIFRoaXMgbWF5CisgKiBiZWNvbWUgYSBjb21waWxlLXRpbWUgb3B0aW9uIGluIHRoZSBmdXR1cmUuCisgKi8KKyNkZWZpbmUgQVZDX0NBQ0hFX1NUQVRTICAgICAxCisKK3N0cnVjdCBhdmNfY2FjaGVfc3RhdHMgeworCXVuc2lnbmVkIGVudHJ5X2xvb2t1cHM7CisJdW5zaWduZWQgZW50cnlfaGl0czsKKwl1bnNpZ25lZCBlbnRyeV9taXNzZXM7CisJdW5zaWduZWQgZW50cnlfZGlzY2FyZHM7CisJdW5zaWduZWQgY2F2X2xvb2t1cHM7CisJdW5zaWduZWQgY2F2X2hpdHM7CisJdW5zaWduZWQgY2F2X3Byb2JlczsKKwl1bnNpZ25lZCBjYXZfbWlzc2VzOworfTsKKworLyoqCisgKiBhdmNfY2FjaGVfc3RhdHMgLSBnZXQgY2FjaGUgYWNjZXNzIHN0YXRpc3RpY3MuCisgKiBAc3RhdHM6IHJlZmVyZW5jZSB0byBzdGF0aXN0aWNzIHN0cnVjdHVyZQorICoKKyAqIEZpbGwgdGhlIHN1cHBsaWVkIHN0cnVjdHVyZSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IEFWQyAKKyAqIGFjdGl2aXR5IHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gYXZjX2luaXQoKSBvcgorICogYXZjX3Jlc2V0KCkuICBTZWUgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLwordm9pZCBhdmNfY2FjaGVfc3RhdHMoc3RydWN0IGF2Y19jYWNoZV9zdGF0cyAqc3RhdHMpOworCisvKioKKyAqIGF2Y19hdl9zdGF0cyAtIGxvZyBhdiB0YWJsZSBzdGF0aXN0aWNzLgorICoKKyAqIExvZyBhIG1lc3NhZ2Ugd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2l6ZSBhbmQKKyAqIGRpc3RyaWJ1dGlvbiBvZiB0aGUgYWNjZXNzIHZlY3RvciB0YWJsZS4gIFRoZSBhdWRpdAorICogY2FsbGJhY2sgaXMgdXNlZCB0byBwcmludCB0aGUgbWVzc2FnZS4KKyAqLwordm9pZCBhdmNfYXZfc3RhdHModm9pZCk7CisKKy8qKgorICogYXZjX3NpZF9zdGF0cyAtIGxvZyBTSUQgdGFibGUgc3RhdGlzdGljcy4KKyAqCisgKiBMb2cgYSBtZXNzYWdlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNpemUgYW5kCisgKiBkaXN0cmlidXRpb24gb2YgdGhlIFNJRCB0YWJsZS4gIFRoZSBhdWRpdCBjYWxsYmFjaworICogaXMgdXNlZCB0byBwcmludCB0aGUgbWVzc2FnZS4KKyAqLwordm9pZCBhdmNfc2lkX3N0YXRzKHZvaWQpOworCisvKioKKyAqIGF2Y19uZXRsaW5rX29wZW4gLSBDcmVhdGUgYSBuZXRsaW5rIHNvY2tldCBhbmQgY29ubmVjdCB0byB0aGUga2VybmVsLgorICovCitpbnQgYXZjX25ldGxpbmtfb3BlbihpbnQgYmxvY2tpbmcpOworCisvKioKKyAqIGF2Y19uZXRsaW5rX2xvb3AgLSBXYWl0IGZvciBuZXRsaW5rIG1lc3NhZ2VzIGZyb20gdGhlIGtlcm5lbAorICovCit2b2lkIGF2Y19uZXRsaW5rX2xvb3Aodm9pZCk7CisKKy8qKgorICogYXZjX25ldGxpbmtfY2xvc2UgLSBDbG9zZSB0aGUgbmV0bGluayBzb2NrZXQKKyAqLwordm9pZCBhdmNfbmV0bGlua19jbG9zZSh2b2lkKTsKKworLyoqCisgKiBhdmNfbmV0bGlua19hY3F1aXJlX2ZkIC0gQWNxdWlyZSBuZXRsaW5rIHNvY2tldCBmZC4KKyAqCisgKiBBbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBtZXNzYWdlcyBmcm9tIHRoZSBuZXRsaW5rIHNvY2tldCBpbgorICogaXRzIG93biBtYWluIGxvb3AuCisgKi8KK2ludCBhdmNfbmV0bGlua19hY3F1aXJlX2ZkKHZvaWQpOworCisvKioKKyAqIGF2Y19uZXRsaW5rX3JlbGVhc2VfZmQgLSBSZWxlYXNlIG5ldGxpbmsgc29ja2V0IGZkLgorICoKKyAqIFJldHVybnMgb3duZXJzaGlwIG9mIHRoZSBuZXRsaW5rIHNvY2tldCB0byB0aGUgbGlicmFyeS4KKyAqLwordm9pZCBhdmNfbmV0bGlua19yZWxlYXNlX2ZkKHZvaWQpOworCisvKioKKyAqIGF2Y19uZXRsaW5rX2NoZWNrX25iIC0gQ2hlY2sgbmV0bGluayBzb2NrZXQgZm9yIG5ldyBtZXNzYWdlcy4KKyAqCisgKiBDYWxsZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gdXNpbmcgYXZjX25ldGxpbmtfYWNxdWlyZV9mZCgpIHRvCisgKiBwcm9jZXNzIGtlcm5lbCBuZXRsaW5rIGV2ZW50cy4KKyAqLworaW50IGF2Y19uZXRsaW5rX2NoZWNrX25iKHZvaWQpOworCisvKioKKyAqIHNlbGludXhfc3RhdHVzX29wZW4gLSBPcGVuIGFuZCBtYXAgU0VMaW51eCBrZXJuZWwgc3RhdHVzIHBhZ2UKKyAqCisgKi8KK2ludCBzZWxpbnV4X3N0YXR1c19vcGVuKGludCBmYWxsYmFjayk7CisKKy8qKgorICogc2VsaW51eF9zdGF0dXNfY2xvc2UgLSBVbm1hcCBhbmQgY2xvc2UgU0VMaW51eCBrZXJuZWwgc3RhdHVzIHBhZ2UKKyAqCisgKi8KK3ZvaWQgc2VsaW51eF9zdGF0dXNfY2xvc2Uodm9pZCk7CisKKy8qKgorICogc2VsaW51eF9zdGF0dXNfdXBkYXRlZCAtIEluZm9ybSB1cyB3aGV0aGVyIHRoZSBrZXJuZWwgc3RhdHVzIGhhcyBiZWVuIHVwZGF0ZWQKKyAqCisgKi8KK2ludCBzZWxpbnV4X3N0YXR1c191cGRhdGVkKHZvaWQpOworCisvKioKKyAqIHNlbGludXhfc3RhdHVzX2dldGVuZm9yY2UgLSBHZXQgdGhlIGVuZm9yY2UgZmxhZyB2YWx1ZQorICoKKyAqLworaW50IHNlbGludXhfc3RhdHVzX2dldGVuZm9yY2Uodm9pZCk7CisKKy8qKgorICogc2VsaW51eF9zdGF0dXNfcG9saWN5bG9hZCAtIEdldCB0aGUgbnVtYmVyIG9mIHBvbGljeSByZWxvYWRlZAorICoKKyAqLworaW50IHNlbGludXhfc3RhdHVzX3BvbGljeWxvYWQodm9pZCk7CisKKy8qKgorICogc2VsaW51eF9zdGF0dXNfZGVueV91bmtub3duIC0gR2V0IHRoZSAgYmVoYXZpb3IgZm9yIHVuZGVmaW5lZCBjbGFzc2VzL3Blcm1pc3Npb25zCisgKgorICovCitpbnQgc2VsaW51eF9zdGF0dXNfZGVueV91bmtub3duKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCQkJCS8qIF9TRUxJTlVYX0FWQ19IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9jb250ZXh0LmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvaW5jbHVkZS9zZWxpbnV4L2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlmYjFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9jb250ZXh0LmgKQEAgLTAsMCArMSw1MCBAQAorI2lmbmRlZiBfU0VMSU5VWF9DT05URVhUX0hfCisjZGVmaW5lIF9TRUxJTlVYX0NPTlRFWFRfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBzZWN1cml0eSBjb250ZXh0cyBpbiB1c2VyIHNwYWNlLgorICovCisKKwl0eXBlZGVmIHN0cnVjdCB7CisJCXZvaWQgKnB0cjsKKwl9IGNvbnRleHRfc190OworCisJdHlwZWRlZiBjb250ZXh0X3NfdCAqY29udGV4dF90OworCisvKiBSZXR1cm4gYSBuZXcgY29udGV4dCBpbml0aWFsaXplZCB0byBhIGNvbnRleHQgc3RyaW5nICovCisKKwlleHRlcm4gY29udGV4dF90IGNvbnRleHRfbmV3KGNvbnN0IGNoYXIgKik7CisKKy8qIAorICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBjb250ZXh0X3QKKyAqIFZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gY29udGV4dF9zdHIgb3IgY29udGV4dF9mcmVlIAorICogZm9yIHRoZSBzYW1lIGNvbnRleHRfdCoKKyAqLworCisJZXh0ZXJuIGNoYXIgKmNvbnRleHRfc3RyKGNvbnRleHRfdCk7CisKKy8qIEZyZWUgdGhlIHN0b3JhZ2UgdXNlZCBieSBhIGNvbnRleHQgKi8KKwlleHRlcm4gdm9pZCBjb250ZXh0X2ZyZWUoY29udGV4dF90KTsKKworLyogR2V0IGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgY29udGV4dCBjb21wb25lbnQgKi8KKworCWV4dGVybiBjb25zdCBjaGFyICpjb250ZXh0X3R5cGVfZ2V0KGNvbnRleHRfdCk7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnRleHRfcmFuZ2VfZ2V0KGNvbnRleHRfdCk7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnRleHRfcm9sZV9nZXQoY29udGV4dF90KTsKKwlleHRlcm4gY29uc3QgY2hhciAqY29udGV4dF91c2VyX2dldChjb250ZXh0X3QpOworCisvKiBTZXQgYSBjb250ZXh0IGNvbXBvbmVudC4gIFJldHVybnMgbm9uemVybyBpZiB1bnN1Y2Nlc3NmdWwgKi8KKworCWV4dGVybiBpbnQgY29udGV4dF90eXBlX3NldChjb250ZXh0X3QsIGNvbnN0IGNoYXIgKik7CisJZXh0ZXJuIGludCBjb250ZXh0X3JhbmdlX3NldChjb250ZXh0X3QsIGNvbnN0IGNoYXIgKik7CisJZXh0ZXJuIGludCBjb250ZXh0X3JvbGVfc2V0KGNvbnRleHRfdCwgY29uc3QgY2hhciAqKTsKKwlleHRlcm4gaW50IGNvbnRleHRfdXNlcl9zZXQoY29udGV4dF90LCBjb25zdCBjaGFyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvaW5jbHVkZS9zZWxpbnV4L2xhYmVsLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvaW5jbHVkZS9zZWxpbnV4L2xhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjZmE1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9pbmNsdWRlL3NlbGludXgvbGFiZWwuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIExhYmVsaW5nIGludGVyZmFjZSBmb3IgdXNlcnNwYWNlIG9iamVjdCBtYW5hZ2VycyBhbmQgb3RoZXJzLgorICoKKyAqIEF1dGhvciA6IEVhbW9uIFdhbHNoIDxld2Fsc2hAdHljaG8ubnNhLmdvdj4KKyAqLworI2lmbmRlZiBfU0VMQUJFTF9IXworI2RlZmluZSBfU0VMQUJFTF9IXworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBPcGFxdWUgdHlwZSB1c2VkIGZvciBhbGwgbGFiZWwgaGFuZGxlcy4KKyAqLworCitzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGU7CisKKy8qIAorICogQXZhaWxhYmxlIGJhY2tlbmRzLgorICovCisKKy8qIGZpbGUgY29udGV4dHMgKi8KKyNkZWZpbmUgU0VMQUJFTF9DVFhfRklMRQkwCisvKiBtZWRpYSBjb250ZXh0cyAqLworI2RlZmluZSBTRUxBQkVMX0NUWF9NRURJQQkxCisvKiB4IGNvbnRleHRzICovCisjZGVmaW5lIFNFTEFCRUxfQ1RYX1gJCTIKKy8qIGRiIG9iamVjdHMgKi8KKyNkZWZpbmUgU0VMQUJFTF9DVFhfREIJCTMKKy8qIEFuZHJvaWQgcHJvcGVydHkgc2VydmljZSBjb250ZXh0cyAqLworI2RlZmluZSBTRUxBQkVMX0NUWF9BTkRST0lEX1BST1AgNAorCisvKgorICogQXZhaWxhYmxlIG9wdGlvbnMKKyAqLworCisvKiBuby1vcCBvcHRpb24sIHVzZWZ1bCBmb3IgdW51c2VkIHNsb3RzIGluIGFuIGFycmF5IG9mIG9wdGlvbnMgKi8KKyNkZWZpbmUgU0VMQUJFTF9PUFRfVU5VU0VECTAKKy8qIHZhbGlkYXRlIGNvbnRleHRzIGJlZm9yZSByZXR1cm5pbmcgdGhlbSAoYm9vbGVhbiB2YWx1ZSkgKi8KKyNkZWZpbmUgU0VMQUJFTF9PUFRfVkFMSURBVEUJMQorLyogZG9uJ3QgdXNlIGxvY2FsIGN1c3RvbWl6YXRpb25zIHRvIGJhY2tlbmQgZGF0YSAoYm9vbGVhbiB2YWx1ZSkgKi8KKyNkZWZpbmUgU0VMQUJFTF9PUFRfQkFTRU9OTFkJMgorLyogc3BlY2lmeSBhbiBhbHRlcm5hdGUgcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIGJhY2tlbmQgZGF0YSAqLworI2RlZmluZSBTRUxBQkVMX09QVF9QQVRICTMKKy8qIHNlbGVjdCBhIHN1YnNldCBvZiB0aGUgc2VhcmNoIHNwYWNlIGFzIGFuIG9wdGltaXphdGlvbiAoZmlsZSBiYWNrZW5kKSAqLworI2RlZmluZSBTRUxBQkVMX09QVF9TVUJTRVQJNAorLyogdG90YWwgbnVtYmVyIG9mIG9wdGlvbnMgKi8KKyNkZWZpbmUgU0VMQUJFTF9OT1BUCQk1CisKKy8qCisgKiBMYWJlbCBvcGVyYXRpb25zCisgKi8KKworLyoqCisgKiBzZWxhYmVsX29wZW4gLSBDcmVhdGUgYSBsYWJlbGluZyBoYW5kbGUuCisgKiBAYmFja2VuZDogb25lIG9mIHRoZSBjb25zdGFudHMgc3BlY2lmeWluZyBhIHN1cHBvcnRlZCBsYWJlbGluZyBiYWNrZW5kLgorICogQG9wdHM6IGFycmF5IG9mIHNlbGFiZWxfb3B0IHN0cnVjdHVyZXMgc3BlY2lmeWluZyBsYWJlbCBvcHRpb25zIG9yIE5VTEwuCisgKiBAbm9wdHM6IG51bWJlciBvZiBlbGVtZW50cyBpbiBvcHRzIGFycmF5IG9yIHplcm8gZm9yIG5vIG9wdGlvbnMuCisgKgorICogT3BlbiBhIGxhYmVsaW5nIGJhY2tlbmQgZm9yIHVzZS4gIFRoZSBhdmFpbGFibGUgYmFja2VuZCBpZGVudGlmaWVycyBhcmUKKyAqIGxpc3RlZCBhYm92ZS4gIE9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIHZpYSB0aGUgb3B0cyBwYXJhbWV0ZXI7IGF2YWlsYWJsZQorICogb3B0aW9ucyBhcmUgbGlzdGVkIGFib3ZlLiAgTm90IGFsbCBvcHRpb25zIG1heSBiZSBzdXBwb3J0ZWQgYnkgZXZlcnkKKyAqIGJhY2tlbmQuICBSZXR1cm4gdmFsdWUgaXMgdGhlIGNyZWF0ZWQgaGFuZGxlIG9uIHN1Y2Nlc3Mgb3IgTlVMTCB3aXRoCisgKiBAZXJybm8gc2V0IG9uIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VsYWJlbF9vcGVuKHVuc2lnbmVkIGludCBiYWNrZW5kLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9vcHQgKm9wdHMsCisJCQkJICAgIHVuc2lnbmVkIG5vcHRzKTsKKworLyoqCisgKiBzZWxhYmVsX2Nsb3NlIC0gQ2xvc2UgYSBsYWJlbGluZyBoYW5kbGUuCisgKiBAaGFuZGxlOiBzcGVjaWZpZXMgaGFuZGxlIHRvIGNsb3NlCisgKgorICogRGVzdHJveSB0aGUgc3BlY2lmaWVkIGhhbmRsZSwgY2xvc2luZyBmaWxlcywgZnJlZWluZyBhbGxvY2F0ZWQgbWVtb3J5LAorICogZXRjLiAgVGhlIGhhbmRsZSBtYXkgbm90IGJlIGZ1cnRoZXIgdXNlZCBhZnRlciBpdCBoYXMgYmVlbiBjbG9zZWQuCisgKi8KK3ZvaWQgc2VsYWJlbF9jbG9zZShzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhhbmRsZSk7CisKKy8qKgorICogc2VsYWJlbF9sb29rdXAgLSBQZXJmb3JtIGxhYmVsaW5nIGxvb2t1cCBvcGVyYXRpb24uCisgKiBAaGFuZGxlOiBzcGVjaWZpZXMgYmFja2VuZCBpbnN0YW5jZSB0byBxdWVyeQorICogQGNvbjogcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCB3aXRoIHdoaWNoIHRvIGxhYmVsIHRoZSBvYmplY3QKKyAqIEBrZXk6IHN0cmluZyBpbnB1dCB0byBsb29rdXAgb3BlcmF0aW9uCisgKiBAdHlwZTogbnVtZXJpYyBpbnB1dCB0byB0aGUgbG9va3VwIG9wZXJhdGlvbgorICoKKyAqIFBlcmZvcm0gYSBsYWJlbGluZyBsb29rdXAgb3BlcmF0aW9uLiAgUmV0dXJuICUwIG9uIHN1Y2Nlc3MsIC0lMSB3aXRoCisgKiBAZXJybm8gc2V0IG9uIGZhaWx1cmUuICBUaGUga2V5IGFuZCB0eXBlIGFyZ3VtZW50cyBhcmUgdGhlIGlucHV0cyB0byB0aGUKKyAqIGxvb2t1cCBvcGVyYXRpb247IGFwcHJvcHJpYXRlIHZhbHVlcyBhcmUgZGljdGF0ZWQgYnkgdGhlIGJhY2tlbmQgaW4gdXNlLgorICogVGhlIHJlc3VsdCBpcyByZXR1cm5lZCBpbiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgQGNvbiBhbmQgbXVzdCBiZSBmcmVlZAorICogYnkgdGhlIHVzZXIgd2l0aCBmcmVlY29uKCkuCisgKi8KK2ludCBzZWxhYmVsX2xvb2t1cChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhhbmRsZSwgY2hhciAqKmNvbiwKKwkJICAgY29uc3QgY2hhciAqa2V5LCBpbnQgdHlwZSk7CitpbnQgc2VsYWJlbF9sb29rdXBfcmF3KHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaGFuZGxlLCBjaGFyICoqY29uLAorCQkgICAgICAgY29uc3QgY2hhciAqa2V5LCBpbnQgdHlwZSk7CisKK2Jvb2wgc2VsYWJlbF9wYXJ0aWFsX21hdGNoKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaGFuZGxlLCBjb25zdCBjaGFyICprZXkpOworCisvKioKKyAqIHNlbGFiZWxfc3RhdHMgLSBsb2cgbGFiZWxpbmcgb3BlcmF0aW9uIHN0YXRpc3RpY3MuCisgKiBAaGFuZGxlOiBzcGVjaWZpZXMgYmFja2VuZCBpbnN0YW5jZSB0byBxdWVyeQorICoKKyAqIExvZyBhIG1lc3NhZ2Ugd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIG9mIHF1ZXJpZXMgcGVyZm9ybWVkLAorICogbnVtYmVyIG9mIHVudXNlZCBtYXRjaGluZyBlbnRyaWVzLCBvciBvdGhlciBvcGVyYXRpb25hbCBzdGF0aXN0aWNzLgorICogTWVzc2FnZSBpcyBiYWNrZW5kLXNwZWNpZmljLCBzb21lIGJhY2tlbmRzIG1heSBub3Qgb3V0cHV0IGEgbWVzc2FnZS4KKyAqLwordm9pZCBzZWxhYmVsX3N0YXRzKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaGFuZGxlKTsKKworLyoKKyAqIFR5cGUgY29kZXMgdXNlZCBieSBzcGVjaWZpYyBiYWNrZW5kcworICovCisKKy8qIFggYmFja2VuZCAqLworI2RlZmluZSBTRUxBQkVMX1hfUFJPUAkJMQorI2RlZmluZSBTRUxBQkVMX1hfRVhUCQkyCisjZGVmaW5lIFNFTEFCRUxfWF9DTElFTlQJMworI2RlZmluZSBTRUxBQkVMX1hfRVZFTlQJCTQKKyNkZWZpbmUgU0VMQUJFTF9YX1NFTE4JCTUKKyNkZWZpbmUgU0VMQUJFTF9YX1BPTFlQUk9QCTYKKyNkZWZpbmUgU0VMQUJFTF9YX1BPTFlTRUxOCTcKKworLyogREIgYmFja2VuZCAqLworI2RlZmluZSBTRUxBQkVMX0RCX0RBVEFCQVNFCTEKKyNkZWZpbmUgU0VMQUJFTF9EQl9TQ0hFTUEJMgorI2RlZmluZSBTRUxBQkVMX0RCX1RBQkxFCTMKKyNkZWZpbmUgU0VMQUJFTF9EQl9DT0xVTU4JNAorI2RlZmluZSBTRUxBQkVMX0RCX1NFUVVFTkNFCTUKKyNkZWZpbmUgU0VMQUJFTF9EQl9WSUVXCQk2CisjZGVmaW5lIFNFTEFCRUxfREJfUFJPQ0VEVVJFCTcKKyNkZWZpbmUgU0VMQUJFTF9EQl9CTE9CCQk4CisjZGVmaW5lIFNFTEFCRUxfREJfVFVQTEUJOQorI2RlZmluZSBTRUxBQkVMX0RCX0xBTkdVQUdFCTEwCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYJLyogX1NFTEFCRUxfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9pbmNsdWRlL3NlbGludXgvc2VsaW51eC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L2luY2x1ZGUvc2VsaW51eC9zZWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyN2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9pbmNsdWRlL3NlbGludXgvc2VsaW51eC5oCkBAIC0wLDAgKzEsMjkxIEBACisjaWZuZGVmIF9TRUxJTlVYX0hfCisjZGVmaW5lIF9TRUxJTlVYX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBSZXR1cm4gMSBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIFNFTGludXgga2VybmVsLCBvciAwIGlmIG5vdCBvciAtMSBpZiB3ZSBnZXQgYW4gZXJyb3IuICovCitleHRlcm4gaW50IGlzX3NlbGludXhfZW5hYmxlZCh2b2lkKTsKKy8qIFJldHVybiAxIGlmIHdlIGFyZSBydW5uaW5nIG9uIGEgU0VMaW51eCBNTFMga2VybmVsLCBvciAwIG90aGVyd2lzZS4gKi8KK2V4dGVybiBpbnQgaXNfc2VsaW51eF9tbHNfZW5hYmxlZCh2b2lkKTsKKworLyogTm8gbG9uZ2VyIHVzZWQ7IGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY2FsbGVycy4gKi8KK3R5cGVkZWYgY2hhciAqc2VjdXJpdHlfY29udGV4dF90OworCisvKiBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhIGNvbnRleHQgYnkgYW55IG9mIHRoZSBiZWxvdyBnZXQqIGNhbGxzLiAqLworZXh0ZXJuIHZvaWQgZnJlZWNvbihjaGFyICogY29uKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBjb250ZXh0IGFycmF5IGJ5IHNlY3VyaXR5X2NvbXB1dGVfdXNlci4gKi8KK2V4dGVybiB2b2lkIGZyZWVjb25hcnkoY2hhciAqKiBjb24pOworCisvKiBXcmFwcGVycyBmb3IgdGhlIC9wcm9jL3BpZC9hdHRyIEFQSS4gKi8KKworLyogR2V0IGN1cnJlbnQgY29udGV4dCwgYW5kIHNldCAqY29uIHRvIHJlZmVyIHRvIGl0LgorICAgQ2FsbGVyIG11c3QgZnJlZSB2aWEgZnJlZWNvbi4gKi8KK2V4dGVybiBpbnQgZ2V0Y29uKGNoYXIgKiogY29uKTsKKworLyogU2V0IHRoZSBjdXJyZW50IHNlY3VyaXR5IGNvbnRleHQgdG8gY29uLiAgCisgICBOb3RlIHRoYXQgdXNlIG9mIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdCB0aGUgZW50aXJlIGFwcGxpY2F0aW9uCisgICBiZSB0cnVzdGVkIHRvIG1haW50YWluIGFueSBkZXNpcmVkIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgCisgICBzZWN1cml0eSBjb250ZXh0cywgdW5saWtlIGV4ZWMtYmFzZWQgdHJhbnNpdGlvbnMgcGVyZm9ybWVkIHZpYSBzZXRleGVjY29uLiAgCisgICBXaGVuIHBvc3NpYmxlLCBkZWNvbXBvc2UgeW91ciBhcHBsaWNhdGlvbiBhbmQgdXNlIHNldGV4ZWNjb24oKStleGVjdmUoKSAKKyAgIGluc3RlYWQuIE5vdGUgdGhhdCB0aGUgYXBwbGljYXRpb24gbWF5IGxvc2UgYWNjZXNzIHRvIGl0cyBvcGVuIGRlc2NyaXB0b3JzCisgICBhcyBhIHJlc3VsdCBvZiBhIHNldGNvbigpIHVubGVzcyBwb2xpY3kgYWxsb3dzIGl0IHRvIHVzZSBkZXNjcmlwdG9ycyBvcGVuZWQKKyAgIGJ5IHRoZSBvbGQgY29udGV4dC4gKi8KK2V4dGVybiBpbnQgc2V0Y29uKGNvbnN0IGNoYXIgKiBjb24pOworCisvKiBHZXQgY29udGV4dCBvZiBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkLCBhbmQgCisgICBzZXQgKmNvbiB0byByZWZlciB0byBpdC4gIENhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IGdldHBpZGNvbihwaWRfdCBwaWQsIGNoYXIgKiogY29uKTsKKworLyogR2V0IHByZXZpb3VzIGNvbnRleHQgKHByaW9yIHRvIGxhc3QgZXhlYyksIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byBpdC4KKyAgIENhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IGdldHByZXZjb24oY2hhciAqKiBjb24pOworCisvKiBHZXQgZXhlYyBjb250ZXh0LCBhbmQgc2V0ICpjb24gdG8gcmVmZXIgdG8gaXQuCisgICBTZXRzICpjb24gdG8gTlVMTCBpZiBubyBleGVjIGNvbnRleHQgaGFzIGJlZW4gc2V0LCBpLmUuIHVzaW5nIGRlZmF1bHQuCisgICBJZiBub24tTlVMTCwgY2FsbGVyIG11c3QgZnJlZSB2aWEgZnJlZWNvbi4gKi8KK2V4dGVybiBpbnQgZ2V0ZXhlY2NvbihjaGFyICoqIGNvbik7CisKKy8qIFNldCBleGVjIHNlY3VyaXR5IGNvbnRleHQgZm9yIHRoZSBuZXh0IGV4ZWN2ZS4gCisgICBDYWxsIHdpdGggTlVMTCBpZiB5b3Ugd2FudCB0byByZXNldCB0byB0aGUgZGVmYXVsdC4gKi8KK2V4dGVybiBpbnQgc2V0ZXhlY2Nvbihjb25zdCBjaGFyICogY29uKTsKKworLyogR2V0IGZzY3JlYXRlIGNvbnRleHQsIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byBpdC4KKyAgIFNldHMgKmNvbiB0byBOVUxMIGlmIG5vIGZzIGNyZWF0ZSBjb250ZXh0IGhhcyBiZWVuIHNldCwgaS5lLiB1c2luZyBkZWZhdWx0LgorICAgSWYgbm9uLU5VTEwsIGNhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IGdldGZzY3JlYXRlY29uKGNoYXIgKiogY29uKTsKKworLyogU2V0IHRoZSBmc2NyZWF0ZSBzZWN1cml0eSBjb250ZXh0IGZvciBzdWJzZXF1ZW50IGZpbGUgY3JlYXRpb25zLgorICAgQ2FsbCB3aXRoIE5VTEwgaWYgeW91IHdhbnQgdG8gcmVzZXQgdG8gdGhlIGRlZmF1bHQuICovCitleHRlcm4gaW50IHNldGZzY3JlYXRlY29uKGNvbnN0IGNoYXIgKiBjb250ZXh0KTsKKworLyogR2V0IGtleWNyZWF0ZSBjb250ZXh0LCBhbmQgc2V0ICpjb24gdG8gcmVmZXIgdG8gaXQuCisgICBTZXRzICpjb24gdG8gTlVMTCBpZiBubyBrZXkgY3JlYXRlIGNvbnRleHQgaGFzIGJlZW4gc2V0LCBpLmUuIHVzaW5nIGRlZmF1bHQuCisgICBJZiBub24tTlVMTCwgY2FsbGVyIG11c3QgZnJlZSB2aWEgZnJlZWNvbi4gKi8KK2V4dGVybiBpbnQgZ2V0a2V5Y3JlYXRlY29uKGNoYXIgKiogY29uKTsKKworLyogU2V0IHRoZSBrZXljcmVhdGUgc2VjdXJpdHkgY29udGV4dCBmb3Igc3Vic2VxdWVudCBrZXkgY3JlYXRpb25zLgorICAgQ2FsbCB3aXRoIE5VTEwgaWYgeW91IHdhbnQgdG8gcmVzZXQgdG8gdGhlIGRlZmF1bHQuICovCitleHRlcm4gaW50IHNldGtleWNyZWF0ZWNvbihjb25zdCBjaGFyICogY29udGV4dCk7CisKKy8qIEdldCBzb2NrY3JlYXRlIGNvbnRleHQsIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byBpdC4KKyAgIFNldHMgKmNvbiB0byBOVUxMIGlmIG5vIHNvY2tldCBjcmVhdGUgY29udGV4dCBoYXMgYmVlbiBzZXQsIGkuZS4gdXNpbmcgZGVmYXVsdC4KKyAgIElmIG5vbi1OVUxMLCBjYWxsZXIgbXVzdCBmcmVlIHZpYSBmcmVlY29uLiAqLworZXh0ZXJuIGludCBnZXRzb2NrY3JlYXRlY29uKGNoYXIgKiogY29uKTsKKworLyogU2V0IHRoZSBzb2NrY3JlYXRlIHNlY3VyaXR5IGNvbnRleHQgZm9yIHN1YnNlcXVlbnQgc29ja2V0IGNyZWF0aW9ucy4KKyAgIENhbGwgd2l0aCBOVUxMIGlmIHlvdSB3YW50IHRvIHJlc2V0IHRvIHRoZSBkZWZhdWx0LiAqLworZXh0ZXJuIGludCBzZXRzb2NrY3JlYXRlY29uKGNvbnN0IGNoYXIgKiBjb250ZXh0KTsKKworLyogV3JhcHBlcnMgZm9yIHRoZSB4YXR0ciBBUEkuICovCisKKy8qIEdldCBmaWxlIGNvbnRleHQsIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byBpdC4KKyAgIENhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IGdldGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKiBjb24pOworZXh0ZXJuIGludCBsZ2V0ZmlsZWNvbihjb25zdCBjaGFyICpwYXRoLCBjaGFyICoqIGNvbik7CitleHRlcm4gaW50IGZnZXRmaWxlY29uKGludCBmZCwgY2hhciAqKiBjb24pOworCisvKiBTZXQgZmlsZSBjb250ZXh0ICovCitleHRlcm4gaW50IHNldGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY29uKTsKK2V4dGVybiBpbnQgbHNldGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY29uKTsKK2V4dGVybiBpbnQgZnNldGZpbGVjb24oaW50IGZkLCBjb25zdCBjaGFyICpjb24pOworCisvKiBXcmFwcGVycyBmb3IgdGhlIHNvY2tldCBBUEkgKi8KKworLyogR2V0IGNvbnRleHQgb2YgcGVlciBzb2NrZXQsIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byBpdC4KKyAgIENhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IGdldHBlZXJjb24oaW50IGZkLCBjaGFyICoqIGNvbik7CisKKy8qIFdyYXBwZXJzIGZvciB0aGUgc2VsaW51eGZzIChwb2xpY3kpIEFQSS4gKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgYWNjZXNzX3ZlY3Rvcl90OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBzZWN1cml0eV9jbGFzc190OworCitzdHJ1Y3QgYXZfZGVjaXNpb24geworCWFjY2Vzc192ZWN0b3JfdCBhbGxvd2VkOworCWFjY2Vzc192ZWN0b3JfdCBkZWNpZGVkOworCWFjY2Vzc192ZWN0b3JfdCBhdWRpdGFsbG93OworCWFjY2Vzc192ZWN0b3JfdCBhdWRpdGRlbnk7CisJdW5zaWduZWQgaW50IHNlcW5vOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKy8qIERlZmluaXRpb25zIG9mIGF2X2RlY2lzaW9uLmZsYWdzICovCisjZGVmaW5lIFNFTElOVVhfQVZEX0ZMQUdTX1BFUk1JU1NJVkUJMHgwMDAxCisKKy8qIFN0cnVjdHVyZSBmb3IgcGFzc2luZyBvcHRpb25zLCB1c2VkIGJ5IEFWQyBhbmQgbGFiZWwgc3Vic3lzdGVtcyAqLworc3RydWN0IHNlbGludXhfb3B0IHsKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICp2YWx1ZTsKK307CisKKy8qIENhbGxiYWNrIGZhY2lsaXRpZXMgKi8KK3VuaW9uIHNlbGludXhfY2FsbGJhY2sgeworCS8qIGxvZyB0aGUgcHJpbnRmLXN0eWxlIGZvcm1hdCBhbmQgYXJndW1lbnRzLAorCSAgIHdpdGggdGhlIHR5cGUgY29kZSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIG1lc3NhZ2UgKi8KKwlpbnQgCisjaWZkZWYgX19HTlVDX18KK19fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCisjZW5kaWYKKwkoKmZ1bmNfbG9nKSAoaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwkvKiBzdG9yZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhdWRpdGRhdGEgKGNvcnJlc3BvbmRpbmcKKwkgICB0byB0aGUgZ2l2ZW4gc2VjdXJpdHkgY2xhc3MpIGludG8gbXNnYnVmLiAqLworCWludCAoKmZ1bmNfYXVkaXQpICh2b2lkICphdWRpdGRhdGEsIHNlY3VyaXR5X2NsYXNzX3QgY2xzLAorCQkJICAgY2hhciAqbXNnYnVmLCBzaXplX3QgbXNnYnVmc2l6ZSk7CisJLyogdmFsaWRhdGUgdGhlIHN1cHBsaWVkIGNvbnRleHQsIG1vZGlmeWluZyBpZiBuZWNlc3NhcnkgKi8KKwlpbnQgKCpmdW5jX3ZhbGlkYXRlKSAoY2hhciAqKmN0eCk7CisJLyogbmV0bGluayBjYWxsYmFjayBmb3Igc2V0ZW5mb3JjZSBtZXNzYWdlICovCisJaW50ICgqZnVuY19zZXRlbmZvcmNlKSAoaW50IGVuZm9yY2luZyk7CisJLyogbmV0bGluayBjYWxsYmFjayBmb3IgcG9saWN5bG9hZCBtZXNzYWdlICovCisJaW50ICgqZnVuY19wb2xpY3lsb2FkKSAoaW50IHNlcW5vKTsKK307CisKKyNkZWZpbmUgU0VMSU5VWF9DQl9MT0cJCTAKKyNkZWZpbmUgU0VMSU5VWF9DQl9BVURJVAkxCisjZGVmaW5lIFNFTElOVVhfQ0JfVkFMSURBVEUJMgorI2RlZmluZSBTRUxJTlVYX0NCX1NFVEVORk9SQ0UJMworI2RlZmluZSBTRUxJTlVYX0NCX1BPTElDWUxPQUQJNAorCitleHRlcm4gdW5pb24gc2VsaW51eF9jYWxsYmFjayBzZWxpbnV4X2dldF9jYWxsYmFjayhpbnQgdHlwZSk7CitleHRlcm4gdm9pZCBzZWxpbnV4X3NldF9jYWxsYmFjayhpbnQgdHlwZSwgdW5pb24gc2VsaW51eF9jYWxsYmFjayBjYik7CisKKwkvKiBMb2dnaW5nIHR5cGUgY29kZXMsIHBhc3NlZCB0byB0aGUgbG9nZ2luZyBjYWxsYmFjayAqLworI2RlZmluZSBTRUxJTlVYX0VSUk9SCSAgICAgICAgMAorI2RlZmluZSBTRUxJTlVYX1dBUk5JTkcJCTEKKyNkZWZpbmUgU0VMSU5VWF9JTkZPCQkyCisjZGVmaW5lIFNFTElOVVhfQVZDCQkzCisKKy8qIENvbXB1dGUgYW4gYWNjZXNzIGRlY2lzaW9uLiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9jb21wdXRlX2F2KGNvbnN0IGNoYXIgKiBzY29uLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKiB0Y29uLAorCQkJICAgICAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkJICAgICAgIGFjY2Vzc192ZWN0b3JfdCByZXF1ZXN0ZWQsCisJCQkgICAgICAgc3RydWN0IGF2X2RlY2lzaW9uICphdmQpOworCisvKiBDb21wdXRlIGEgbGFiZWxpbmcgZGVjaXNpb24gYW5kIHNldCAqbmV3Y29uIHRvIHJlZmVyIHRvIGl0LgorICAgQ2FsbGVyIG11c3QgZnJlZSB2aWEgZnJlZWNvbi4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfY29tcHV0ZV9jcmVhdGUoY29uc3QgY2hhciAqIHNjb24sCisJCQkJICAgY29uc3QgY2hhciAqIHRjb24sCisJCQkJICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQkJICAgY2hhciAqKiBuZXdjb24pOworCisvKiBDb21wdXRlIGEgcmVsYWJlbGluZyBkZWNpc2lvbiBhbmQgc2V0ICpuZXdjb24gdG8gcmVmZXIgdG8gaXQuCisgICBDYWxsZXIgbXVzdCBmcmVlIHZpYSBmcmVlY29uLiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9jb21wdXRlX3JlbGFiZWwoY29uc3QgY2hhciAqIHNjb24sCisJCQkJICAgIGNvbnN0IGNoYXIgKiB0Y29uLAorCQkJCSAgICBzZWN1cml0eV9jbGFzc190IHRjbGFzcywKKwkJCQkgICAgY2hhciAqKiBuZXdjb24pOworCisvKiBDb21wdXRlIGEgcG9seWluc3RhbnRpYXRpb24gbWVtYmVyIGRlY2lzaW9uIGFuZCBzZXQgKm5ld2NvbiB0byByZWZlciB0byBpdC4KKyAgIENhbGxlciBtdXN0IGZyZWUgdmlhIGZyZWVjb24uICovCitleHRlcm4gaW50IHNlY3VyaXR5X2NvbXB1dGVfbWVtYmVyKGNvbnN0IGNoYXIgKiBzY29uLAorCQkJCSAgIGNvbnN0IGNoYXIgKiB0Y29uLAorCQkJCSAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkJCSAgIGNoYXIgKiogbmV3Y29uKTsKKworLyogQ29tcHV0ZSB0aGUgc2V0IG9mIHJlYWNoYWJsZSB1c2VyIGNvbnRleHRzIGFuZCBzZXQgKmNvbiB0byByZWZlciB0byAKKyAgIHRoZSBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY29udGV4dHMuICBDYWxsZXIgbXVzdCBmcmVlIHZpYSBmcmVlY29uYXJ5LiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9jb21wdXRlX3VzZXIoY29uc3QgY2hhciAqIHNjb24sCisJCQkJIGNvbnN0IGNoYXIgKnVzZXJuYW1lLAorCQkJCSBjaGFyICoqKiBjb24pOworCisvKiBMb2FkIGEgcG9saWN5IGNvbmZpZ3VyYXRpb24uICovCitleHRlcm4gaW50IHNlY3VyaXR5X2xvYWRfcG9saWN5KHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworCisvKiBHZXQgdGhlIGNvbnRleHQgb2YgYW4gaW5pdGlhbCBrZXJuZWwgc2VjdXJpdHkgaWRlbnRpZmllciBieSBuYW1lLiAgCisgICBDYWxsZXIgbXVzdCBmcmVlIHZpYSBmcmVlY29uICovCitleHRlcm4gaW50IHNlY3VyaXR5X2dldF9pbml0aWFsX2NvbnRleHQoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJY2hhciAqKiBjb24pOworCisvKiBUcmFuc2xhdGUgYm9vbGVhbiBzdHJpY3QgdG8gbmFtZSB2YWx1ZSBwYWlyLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHZhbHVlOworfSBTRUxib29sZWFuOworLyogc2F2ZSBhIGxpc3Qgb2YgYm9vbGVhbnMgaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uICAqLworZXh0ZXJuIGludCBzZWN1cml0eV9zZXRfYm9vbGVhbl9saXN0KHNpemVfdCBib29sY250LAorCQkJCSAgICAgU0VMYm9vbGVhbiAqIGNvbnN0IGJvb2xsaXN0LCBpbnQgcGVybWFuZW50KTsKKworLyogQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIGEgc2VjdXJpdHkgY29udGV4dC4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfY2hlY2tfY29udGV4dChjb25zdCBjaGFyICogY29uKTsKKworLyogQ2Fub25pY2FsaXplIGEgc2VjdXJpdHkgY29udGV4dC4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfY2Fub25pY2FsaXplX2NvbnRleHQoY29uc3QgY2hhciAqIGNvbiwKKwkJCQkJIGNoYXIgKiogY2Fub25jb24pOworCisvKiBHZXQgdGhlIGVuZm9yY2UgZmxhZyB2YWx1ZS4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfZ2V0ZW5mb3JjZSh2b2lkKTsKKworLyogU2V0IHRoZSBlbmZvcmNlIGZsYWcgdmFsdWUuICovCitleHRlcm4gaW50IHNlY3VyaXR5X3NldGVuZm9yY2UoaW50IHZhbHVlKTsKKworLyogR2V0IHRoZSBiZWhhdmlvciBmb3IgdW5kZWZpbmVkIGNsYXNzZXMvcGVybWlzc2lvbnMgKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfZGVueV91bmtub3duKHZvaWQpOworCisvKiBEaXNhYmxlIFNFTGludXggYXQgcnVudGltZSAobXVzdCBiZSBkb25lIHByaW9yIHRvIGluaXRpYWwgcG9saWN5IGxvYWQpLiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9kaXNhYmxlKHZvaWQpOworCisvKiBHZXQgdGhlIHBvbGljeSB2ZXJzaW9uIG51bWJlci4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfcG9saWN5dmVycyh2b2lkKTsKKworLyogR2V0IHRoZSBib29sZWFuIG5hbWVzICovCitleHRlcm4gaW50IHNlY3VyaXR5X2dldF9ib29sZWFuX25hbWVzKGNoYXIgKioqbmFtZXMsIGludCAqbGVuKTsKKworLyogR2V0IHRoZSBwZW5kaW5nIHZhbHVlIGZvciB0aGUgYm9vbGVhbiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9nZXRfYm9vbGVhbl9wZW5kaW5nKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBHZXQgdGhlIGFjdGl2ZSB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4gKi8KK2V4dGVybiBpbnQgc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fYWN0aXZlKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBTZXQgdGhlIHBlbmRpbmcgdmFsdWUgZm9yIHRoZSBib29sZWFuICovCitleHRlcm4gaW50IHNlY3VyaXR5X3NldF9ib29sZWFuKGNvbnN0IGNoYXIgKm5hbWUsIGludCB2YWx1ZSk7CisKKy8qIENvbW1pdCB0aGUgcGVuZGluZyB2YWx1ZXMgZm9yIHRoZSBib29sZWFucyAqLworZXh0ZXJuIGludCBzZWN1cml0eV9jb21taXRfYm9vbGVhbnModm9pZCk7CisKKy8qIFVzZXJzcGFjZSBjbGFzcyBtYXBwaW5nIHN1cHBvcnQgKi8KK3N0cnVjdCBzZWN1cml0eV9jbGFzc19tYXBwaW5nIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKnBlcm1zW3NpemVvZihhY2Nlc3NfdmVjdG9yX3QpICogOCArIDFdOworfTsKKworZXh0ZXJuIGludCBzZWxpbnV4X3NldF9tYXBwaW5nKHN0cnVjdCBzZWN1cml0eV9jbGFzc19tYXBwaW5nICptYXApOworCisvKiBDb21tb24gaGVscGVycyAqLworCisvKiBDb252ZXJ0IGJldHdlZW4gc2VjdXJpdHkgY2xhc3MgdmFsdWVzIGFuZCBzdHJpbmcgbmFtZXMgKi8KK2V4dGVybiBzZWN1cml0eV9jbGFzc190IHN0cmluZ190b19zZWN1cml0eV9jbGFzcyhjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiBjb25zdCBjaGFyICpzZWN1cml0eV9jbGFzc190b19zdHJpbmcoc2VjdXJpdHlfY2xhc3NfdCBjbHMpOworCisvKiBDb252ZXJ0IGJldHdlZW4gaW5kaXZpZHVhbCBhY2Nlc3MgdmVjdG9yIHBlcm1pc3Npb25zIGFuZCBzdHJpbmcgbmFtZXMgKi8KK2V4dGVybiBjb25zdCBjaGFyICpzZWN1cml0eV9hdl9wZXJtX3RvX3N0cmluZyhzZWN1cml0eV9jbGFzc190IHRjbGFzcywKKwkJCQkJICAgICAgYWNjZXNzX3ZlY3Rvcl90IHBlcm0pOworZXh0ZXJuIGFjY2Vzc192ZWN0b3JfdCBzdHJpbmdfdG9fYXZfcGVybShzZWN1cml0eV9jbGFzc190IHRjbGFzcywKKwkJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBSZXR1cm5zIGFuIGFjY2VzcyB2ZWN0b3IgaW4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uICBVc2VyIG11c3QgZnJlZSB0aGUKKyAqIHJldHVybmVkIHN0cmluZyB2aWEgZnJlZSgpLiAqLworZXh0ZXJuIGludCBzZWN1cml0eV9hdl9zdHJpbmcoc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQkgICAgICBhY2Nlc3NfdmVjdG9yX3QgYXYsIGNoYXIgKipyZXN1bHQpOworCisvKiBDaGVjayBwZXJtaXNzaW9ucyBhbmQgcGVyZm9ybSBhcHByb3ByaWF0ZSBhdWRpdGluZy4gKi8KK2V4dGVybiBpbnQgc2VsaW51eF9jaGVja19hY2Nlc3MoY29uc3QgY2hhciAqIHNjb24sCisJCQkJY29uc3QgY2hhciAqIHRjb24sCisJCQkJY29uc3QgY2hhciAqdGNsYXNzLAorCQkJCWNvbnN0IGNoYXIgKnBlcm0sIHZvaWQgKmF1eCk7CisKKy8qIFNldCB0aGUgcGF0aCB0byB0aGUgc2VsaW51eGZzIG1vdW50IHBvaW50IGV4cGxpY2l0bHkuCisgICBOb3JtYWxseSwgdGhpcyBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIGxpYnNlbGludXggCisgICBpbml0aWFsaXphdGlvbiwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgZS5nLiBmb3IgL3NiaW4vaW5pdAorICAgd2hpY2ggcGVyZm9ybXMgdGhlIGluaXRpYWwgbW91bnQgb2Ygc2VsaW51eGZzLiAqLwordm9pZCBzZXRfc2VsaW51eG1udChjb25zdCBjaGFyICptbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc291cmNlcy5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zb3VyY2VzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGFlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc291cmNlcy5tawpAQCAtMCwwICsxLDMzIEBACitPTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0xJQlNFTElOVVhfU09VUkNFUyA6PSBcCisgICAgc3JjL2NhbGxiYWNrcy5jIFwKKyAgICBzcmMvY2hlY2tfY29udGV4dC5jIFwKKyAgICBzcmMvZnJlZWNvbi5jIFwKKyAgICBzcmMvaW5pdC5jIFwKKyAgICBzcmMvbGFiZWwuYyBcCisgICAgc3JjL2xhYmVsX2ZpbGUuYyBcCisgICAgc3JjL2xhYmVsX2FuZHJvaWRfcHJvcGVydHkuYworCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKyAgICAjIFRoaXMgY29kZSBkb2Vzbid0IG5vdCBidWlsZCBvbiBXaW5kb3dzLCBzbyBjcmVhdGUgZW1wdHkKKyAgICAjIGxpYnJhcmllcyBvbiB0aGlzIHBsYXRmb3JtLCB0aGlzIHNpbXBsaWZpZXMgdGhlIGJ1aWxkCisgICAgIyBjb25maWd1cmF0aW9uLgorICAgIExJQlNFTElOVVhfU09VUkNFUyA6PQorZW5kaWYKKworTElCU0VMSU5VWF9JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKKworTElCU0VMSU5VWF9DRkxBR1MgOj0gLURIT1NUCitpZmVxIChkYXJ3aW4sJChCVUlMRF9UQVJHRVRfT1MpKQorICAgIExJQlNFTElOVVhfQ0ZMQUdTICs9IC1EREFSV0lOCitlbmRpZgorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1saWJzZWxpbnV4KQorTE9DQUxfU1JDX0ZJTEVTIDo9ICQoTElCU0VMSU5VWF9TT1VSQ0VTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExJQlNFTElOVVhfSU5DTFVERVMpCitMT0NBTF9DRkxBR1MgOj0gJChMSUJTRUxJTlVYX0NGTEFHUykKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hbmRyb2lkLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2FuZHJvaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQzMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hbmRyb2lkLmMKQEAgLTAsMCArMSwxMzc2IEBACisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMveGF0dHIuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZ0cy5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHNlbGludXgvY29udGV4dC5oPgorI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgorI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2F2Yy5oPgorI2luY2x1ZGUgPG1pbmNyeXB0L3NoYS5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImNhbGxiYWNrcy5oIgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsYWJlbF9pbnRlcm5hbC5oIgorCisvKgorICogWFhYIFdoZXJlIHNob3VsZCB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBiZSBsb2NhdGVkPworICogTmVlZHMgdG8gYmUgYWNjZXNzaWJsZSBieSB6eWdvdGUgYW5kIGluc3RhbGxkIHdoZW4KKyAqIHNldHRpbmcgY3JlZGVudGlhbHMgZm9yIGFwcCBwcm9jZXNzZXMgYW5kIHNldHRpbmcgcGVybWlzc2lvbnMKKyAqIG9uIGFwcCBkYXRhIGRpcmVjdG9yaWVzLgorICovCitzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IHNlYXBwX2NvbnRleHRzX2ZpbGVbXSA9IHsKKwkiL3NlYXBwX2NvbnRleHRzIiwKKwkiL2RhdGEvc2VjdXJpdHkvY3VycmVudC9zZWFwcF9jb250ZXh0cyIsCisJTlVMTCB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlbGludXhfb3B0IHNlb3B0c1tdID0geworCXsgU0VMQUJFTF9PUFRfUEFUSCwgIi9maWxlX2NvbnRleHRzIiB9LAorCXsgU0VMQUJFTF9PUFRfUEFUSCwgIi9kYXRhL3NlY3VyaXR5L2N1cnJlbnQvZmlsZV9jb250ZXh0cyIgfSwKKwl7IDAsIE5VTEwgfSB9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2Vwb2xpY3lfZmlsZVtdID0geworCSIvc2Vwb2xpY3kiLAorCSIvZGF0YS9zZWN1cml0eS9jdXJyZW50L3NlcG9saWN5IiwKKwlOVUxMIH07CisKK2VudW0gbGV2ZWxGcm9tIHsKKwlMRVZFTEZST01fTk9ORSwKKwlMRVZFTEZST01fQVBQLAorCUxFVkVMRlJPTV9VU0VSLAorCUxFVkVMRlJPTV9BTEwKK307CisKKyNkZWZpbmUgUE9MSUNZX09WRVJSSURFX1ZFUlNJT04gICAgIi9kYXRhL3NlY3VyaXR5L2N1cnJlbnQvc2VsaW51eF92ZXJzaW9uIgorI2RlZmluZSBQT0xJQ1lfQkFTRV9WRVJTSU9OICAgICAgICAiL3NlbGludXhfdmVyc2lvbiIKK3N0YXRpYyBpbnQgcG9saWN5X2luZGV4ID0gMDsKKworc3RhdGljIHZvaWQgc2V0X3BvbGljeV9pbmRleCh2b2lkKQoreworCWludCBmZF9iYXNlID0gLTEsIGZkX292ZXJyaWRlID0gLTE7CisJc3RydWN0IHN0YXQgc2JfYmFzZTsKKwlzdHJ1Y3Qgc3RhdCBzYl9vdmVycmlkZTsKKwl2b2lkICptYXBfYmFzZSwgKm1hcF9vdmVycmlkZTsKKworCXBvbGljeV9pbmRleCA9IDA7CisKKwlmZF9iYXNlID0gb3BlbihQT0xJQ1lfQkFTRV9WRVJTSU9OLCBPX1JET05MWSB8IE9fTk9GT0xMT1cpOworCWlmIChmZF9iYXNlIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKGZzdGF0KGZkX2Jhc2UsICZzYl9iYXNlKSA8IDApIHsKKwkJY2xvc2UoZmRfYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlmZF9vdmVycmlkZSA9IG9wZW4oUE9MSUNZX09WRVJSSURFX1ZFUlNJT04sIE9fUkRPTkxZIHwgT19OT0ZPTExPVyk7CisJaWYgKGZkX292ZXJyaWRlIDwgMCkgeworCQljbG9zZShmZF9iYXNlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChmc3RhdChmZF9vdmVycmlkZSwgJnNiX292ZXJyaWRlKSA8IDApIHsKKwkJY2xvc2UoZmRfYmFzZSk7CisJCWNsb3NlKGZkX292ZXJyaWRlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzYl9iYXNlLnN0X3NpemUgIT0gc2Jfb3ZlcnJpZGUuc3Rfc2l6ZSkgeworCQljbG9zZShmZF9iYXNlKTsKKwkJY2xvc2UoZmRfb3ZlcnJpZGUpOworCQlyZXR1cm47CisJfQorCisJbWFwX2Jhc2UgPSBtbWFwKE5VTEwsIHNiX2Jhc2Uuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmRfYmFzZSwgMCk7CisJaWYgKG1hcF9iYXNlID09IE1BUF9GQUlMRUQpIHsKKwkJY2xvc2UoZmRfYmFzZSk7CisJCWNsb3NlKGZkX292ZXJyaWRlKTsKKwkJcmV0dXJuOworCX0KKworCW1hcF9vdmVycmlkZSA9IG1tYXAoTlVMTCwgc2Jfb3ZlcnJpZGUuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmRfb3ZlcnJpZGUsIDApOworCWlmIChtYXBfb3ZlcnJpZGUgPT0gTUFQX0ZBSUxFRCkgeworCQltdW5tYXAobWFwX2Jhc2UsIHNiX2Jhc2Uuc3Rfc2l6ZSk7CisJCWNsb3NlKGZkX2Jhc2UpOworCQljbG9zZShmZF9vdmVycmlkZSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWVtY21wKG1hcF9iYXNlLCBtYXBfb3ZlcnJpZGUsIHNiX2Jhc2Uuc3Rfc2l6ZSkgPT0gMCkKKwkJcG9saWN5X2luZGV4ID0gMTsKKworCisJY2xvc2UoZmRfYmFzZSk7CisJY2xvc2UoZmRfb3ZlcnJpZGUpOworCW11bm1hcChtYXBfYmFzZSwgc2JfYmFzZS5zdF9zaXplKTsKKwltdW5tYXAobWFwX292ZXJyaWRlLCBzYl9vdmVycmlkZS5zdF9zaXplKTsKK30KKworYm9vbCBzZWxpbnV4X2FuZHJvaWRfdXNlX2RhdGFfcG9saWN5KHZvaWQpCit7CisJc2V0X3BvbGljeV9pbmRleCgpOworCXJldHVybiAocG9saWN5X2luZGV4ID09IDEpOworfQorCisjaWYgREVCVUcKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgbGV2ZWxGcm9tTmFtZVtdID0geworCSJub25lIiwKKwkiYXBwIiwKKwkidXNlciIsCisJImFsbCIKK307CisjZW5kaWYKKworc3RydWN0IHByZWZpeF9zdHIgeworCXNpemVfdCBsZW47CisJY2hhciAqc3RyOworCWNoYXIgaXNfcHJlZml4OworfTsKKworc3RhdGljIHZvaWQgZnJlZV9wcmVmaXhfc3RyKHN0cnVjdCBwcmVmaXhfc3RyICpwKQoreworCWlmICghcCkKKwkJcmV0dXJuOworCWZyZWUocC0+c3RyKTsKK30KKworc3RydWN0IHNlYXBwX2NvbnRleHQgeworCS8qIGlucHV0IHNlbGVjdG9ycyAqLworCWNoYXIgaXNTeXN0ZW1TZXJ2ZXI7CisJc3RydWN0IHByZWZpeF9zdHIgdXNlcjsKKwljaGFyICpzZWluZm87CisJc3RydWN0IHByZWZpeF9zdHIgbmFtZTsKKwlzdHJ1Y3QgcHJlZml4X3N0ciBwYXRoOworCS8qIG91dHB1dHMgKi8KKwljaGFyICpkb21haW47CisJY2hhciAqdHlwZTsKKwljaGFyICpsZXZlbDsKKwljaGFyICpzZWJvb2w7CisJZW51bSBsZXZlbEZyb20gbGV2ZWxGcm9tOworfTsKKworc3RhdGljIHZvaWQgZnJlZV9zZWFwcF9jb250ZXh0KHN0cnVjdCBzZWFwcF9jb250ZXh0ICpzKQoreworCWlmICghcykKKwkJcmV0dXJuOworCisJZnJlZV9wcmVmaXhfc3RyKCZzLT51c2VyKTsKKwlmcmVlKHMtPnNlaW5mbyk7CisJZnJlZV9wcmVmaXhfc3RyKCZzLT5uYW1lKTsKKwlmcmVlX3ByZWZpeF9zdHIoJnMtPnBhdGgpOworCWZyZWUocy0+ZG9tYWluKTsKKwlmcmVlKHMtPnR5cGUpOworCWZyZWUocy0+bGV2ZWwpOworCWZyZWUocy0+c2Vib29sKTsKK30KKworc3RhdGljIGludCBzZWFwcF9jb250ZXh0X2NtcChjb25zdCB2b2lkICpBLCBjb25zdCB2b2lkICpCKQoreworCWNvbnN0IHN0cnVjdCBzZWFwcF9jb250ZXh0ICpjb25zdCAqc3AxID0gKGNvbnN0IHN0cnVjdCBzZWFwcF9jb250ZXh0ICpjb25zdCAqKSBBOworCWNvbnN0IHN0cnVjdCBzZWFwcF9jb250ZXh0ICpjb25zdCAqc3AyID0gKGNvbnN0IHN0cnVjdCBzZWFwcF9jb250ZXh0ICpjb25zdCAqKSBCOworCWNvbnN0IHN0cnVjdCBzZWFwcF9jb250ZXh0ICpzMSA9ICpzcDEsICpzMiA9ICpzcDI7CisKKwkvKiBHaXZlIHByZWNlZGVuY2UgdG8gaXNTeXN0ZW1TZXJ2ZXI9dHJ1ZS4gKi8KKwlpZiAoczEtPmlzU3lzdGVtU2VydmVyICE9IHMyLT5pc1N5c3RlbVNlcnZlcikKKwkJcmV0dXJuIChzMS0+aXNTeXN0ZW1TZXJ2ZXIgPyAtMSA6IDEpOworCisJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgc3BlY2lmaWVkIHVzZXI9IG92ZXIgYW4gdW5zcGVjaWZpZWQgdXNlcj0uICovCisJaWYgKHMxLT51c2VyLnN0ciAmJiAhczItPnVzZXIuc3RyKQorCQlyZXR1cm4gLTE7CisJaWYgKCFzMS0+dXNlci5zdHIgJiYgczItPnVzZXIuc3RyKQorCQlyZXR1cm4gMTsKKworCWlmIChzMS0+dXNlci5zdHIpIHsKKwkJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgZml4ZWQgdXNlcj0gc3RyaW5nIG92ZXIgYSBwcmVmaXguICovCisJCWlmIChzMS0+dXNlci5pc19wcmVmaXggIT0gczItPnVzZXIuaXNfcHJlZml4KQorCQkJcmV0dXJuIChzMi0+dXNlci5pc19wcmVmaXggPyAtMSA6IDEpOworCisJCS8qIEdpdmUgcHJlY2VkZW5jZSB0byBhIGxvbmdlciBwcmVmaXggb3ZlciBhIHNob3J0ZXIgcHJlZml4LiAqLworCQlpZiAoczEtPnVzZXIuaXNfcHJlZml4ICYmIHMxLT51c2VyLmxlbiAhPSBzMi0+dXNlci5sZW4pCisJCQlyZXR1cm4gKHMxLT51c2VyLmxlbiA+IHMyLT51c2VyLmxlbikgPyAtMSA6IDE7CisJfQorCisJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgc3BlY2lmaWVkIHNlaW5mbz0gb3ZlciBhbiB1bnNwZWNpZmllZCBzZWluZm89LiAqLworCWlmIChzMS0+c2VpbmZvICYmICFzMi0+c2VpbmZvKQorCQlyZXR1cm4gLTE7CisJaWYgKCFzMS0+c2VpbmZvICYmIHMyLT5zZWluZm8pCisJCXJldHVybiAxOworCisJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgc3BlY2lmaWVkIG5hbWU9IG92ZXIgYW4gdW5zcGVjaWZpZWQgbmFtZT0uICovCisJaWYgKHMxLT5uYW1lLnN0ciAmJiAhczItPm5hbWUuc3RyKQorCQlyZXR1cm4gLTE7CisJaWYgKCFzMS0+bmFtZS5zdHIgJiYgczItPm5hbWUuc3RyKQorCQlyZXR1cm4gMTsKKworCWlmIChzMS0+bmFtZS5zdHIpIHsKKwkJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgZml4ZWQgbmFtZT0gc3RyaW5nIG92ZXIgYSBwcmVmaXguICovCisJCWlmIChzMS0+bmFtZS5pc19wcmVmaXggIT0gczItPm5hbWUuaXNfcHJlZml4KQorCQkJcmV0dXJuIChzMi0+bmFtZS5pc19wcmVmaXggPyAtMSA6IDEpOworCisJCS8qIEdpdmUgcHJlY2VkZW5jZSB0byBhIGxvbmdlciBwcmVmaXggb3ZlciBhIHNob3J0ZXIgcHJlZml4LiAqLworCQlpZiAoczEtPm5hbWUuaXNfcHJlZml4ICYmIHMxLT5uYW1lLmxlbiAhPSBzMi0+bmFtZS5sZW4pCisJCQlyZXR1cm4gKHMxLT5uYW1lLmxlbiA+IHMyLT5uYW1lLmxlbikgPyAtMSA6IDE7CisJfQorCisJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgc3BlY2lmaWVkIHBhdGg9IG92ZXIgYW4gdW5zcGVjaWZpZWQgcGF0aD0uICovCisJaWYgKHMxLT5wYXRoLnN0ciAmJiAhczItPnBhdGguc3RyKQorCQlyZXR1cm4gLTE7CisJaWYgKCFzMS0+cGF0aC5zdHIgJiYgczItPnBhdGguc3RyKQorCQlyZXR1cm4gMTsKKworCWlmIChzMS0+cGF0aC5zdHIpIHsKKwkJLyogR2l2ZSBwcmVjZWRlbmNlIHRvIGEgZml4ZWQgcGF0aD0gc3RyaW5nIG92ZXIgYSBwcmVmaXguICovCisJCWlmIChzMS0+cGF0aC5pc19wcmVmaXggIT0gczItPnBhdGguaXNfcHJlZml4KQorCQkJcmV0dXJuIChzMi0+cGF0aC5pc19wcmVmaXggPyAtMSA6IDEpOworCisJCS8qIEdpdmUgcHJlY2VkZW5jZSB0byBhIGxvbmdlciBwcmVmaXggb3ZlciBhIHNob3J0ZXIgcHJlZml4LiAqLworCQlpZiAoczEtPnBhdGguaXNfcHJlZml4ICYmIHMxLT5wYXRoLmxlbiAhPSBzMi0+cGF0aC5sZW4pCisJCQlyZXR1cm4gKHMxLT5wYXRoLmxlbiA+IHMyLT5wYXRoLmxlbikgPyAtMSA6IDE7CisJfQorCisgICAgICAgIC8qIEdpdmUgcHJlY2VkZW5jZSB0byBhIHNwZWNpZmllZCBzZWJvb2w9IG92ZXIgYW4gdW5zcGVjaWZpZWQgc2Vib29sPS4gKi8KKyAgICAgICAgaWYgKHMxLT5zZWJvb2wgJiYgIXMyLT5zZWJvb2wpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoIXMxLT5zZWJvb2wgJiYgczItPnNlYm9vbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworCS8qIEFueXRoaW5nIGVsc2UgaGFzIGVxdWFsIHByZWNlZGVuY2UuICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VhcHBfY29udGV4dCAqKnNlYXBwX2NvbnRleHRzID0gTlVMTDsKK3N0YXRpYyBpbnQgbnNwZWMgPSAwOworCitzdGF0aWMgdm9pZCBmcmVlX3NlYXBwX2NvbnRleHRzKHZvaWQpCit7CisJaW50IG47CisKKwlpZiAoIXNlYXBwX2NvbnRleHRzKQorCQlyZXR1cm47CisKKwlmb3IgKG4gPSAwOyBuIDwgbnNwZWM7IG4rKykKKwkJZnJlZV9zZWFwcF9jb250ZXh0KHNlYXBwX2NvbnRleHRzW25dKTsKKworCWZyZWUoc2VhcHBfY29udGV4dHMpOworCXNlYXBwX2NvbnRleHRzID0gTlVMTDsKKwluc3BlYyA9IDA7Cit9CisKK2ludCBzZWxpbnV4X2FuZHJvaWRfc2VhcHBfY29udGV4dF9yZWxvYWQodm9pZCkKK3sKKwlGSUxFICpmcCA9IE5VTEw7CisJY2hhciBsaW5lX2J1ZltCVUZTSVpdOworCWNoYXIgKnRva2VuOworCXVuc2lnbmVkIGxpbmVubzsKKwlzdHJ1Y3Qgc2VhcHBfY29udGV4dCAqY3VyOworCWNoYXIgKnAsICpuYW1lID0gTlVMTCwgKnZhbHVlID0gTlVMTCwgKnNhdmVwdHI7CisJc2l6ZV90IGxlbjsKKwlpbnQgbiwgcmV0OworCisJc2V0X3BvbGljeV9pbmRleCgpOworCisJZnAgPSBmb3BlbihzZWFwcF9jb250ZXh0c19maWxlW3BvbGljeV9pbmRleF0sICJyIik7CisJaWYgKCFmcCkgeworCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiJXM6ICBjb3VsZCBub3Qgb3BlbiBhbnkgc2VhcHBfY29udGV4dHMgZmlsZSIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmcmVlX3NlYXBwX2NvbnRleHRzKCk7CisKKwluc3BlYyA9IDA7CisJd2hpbGUgKGZnZXRzKGxpbmVfYnVmLCBzaXplb2YgbGluZV9idWYgLSAxLCBmcCkpIHsKKwkJcCA9IGxpbmVfYnVmOworCQl3aGlsZSAoaXNzcGFjZSgqcCkpCisJCQlwKys7CisJCWlmICgqcCA9PSAnIycgfHwgKnAgPT0gMCkKKwkJCWNvbnRpbnVlOworCQluc3BlYysrOworCX0KKworCXNlYXBwX2NvbnRleHRzID0gKHN0cnVjdCBzZWFwcF9jb250ZXh0ICoqKSBjYWxsb2MobnNwZWMsIHNpemVvZihzdHJ1Y3Qgc2VhcHBfY29udGV4dCAqKSk7CisJaWYgKCFzZWFwcF9jb250ZXh0cykKKwkJZ290byBvb207CisKKwlyZXdpbmQoZnApOworCW5zcGVjID0gMDsKKwlsaW5lbm8gPSAxOworCXdoaWxlIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mIGxpbmVfYnVmIC0gMSwgZnApKSB7CisJCWxlbiA9IHN0cmxlbihsaW5lX2J1Zik7CisJCWlmIChsaW5lX2J1ZltsZW4gLSAxXSA9PSAnXG4nKQorCQkJbGluZV9idWZbbGVuIC0gMV0gPSAwOworCQlwID0gbGluZV9idWY7CisJCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJCXArKzsKKwkJaWYgKCpwID09ICcjJyB8fCAqcCA9PSAwKQorCQkJY29udGludWU7CisKKwkJY3VyID0gKHN0cnVjdCBzZWFwcF9jb250ZXh0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNlYXBwX2NvbnRleHQpKTsKKwkJaWYgKCFjdXIpCisJCQlnb3RvIG9vbTsKKworCQl0b2tlbiA9IHN0cnRva19yKHAsICIgXHQiLCAmc2F2ZXB0cik7CisJCWlmICghdG9rZW4pIHsKKwkJCWZyZWVfc2VhcHBfY29udGV4dChjdXIpOworCQkJZ290byBlcnI7CisJCX0KKworCQl3aGlsZSAoMSkgeworCQkJbmFtZSA9IHRva2VuOworCQkJdmFsdWUgPSBzdHJjaHIobmFtZSwgJz0nKTsKKwkJCWlmICghdmFsdWUpIHsKKwkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCSp2YWx1ZSsrID0gMDsKKworCQkJaWYgKCFzdHJjYXNlY21wKG5hbWUsICJpc1N5c3RlbVNlcnZlciIpKSB7CisJCQkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKQorCQkJCQljdXItPmlzU3lzdGVtU2VydmVyID0gMTsKKwkJCQllbHNlIGlmICghc3RyY2FzZWNtcCh2YWx1ZSwgImZhbHNlIikpCisJCQkJCWN1ci0+aXNTeXN0ZW1TZXJ2ZXIgPSAwOworCQkJCWVsc2UgeworCQkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAidXNlciIpKSB7CisJCQkJY3VyLT51c2VyLnN0ciA9IHN0cmR1cCh2YWx1ZSk7CisJCQkJaWYgKCFjdXItPnVzZXIuc3RyKSB7CisJCQkJCWZyZWVfc2VhcHBfY29udGV4dChjdXIpOworCQkJCQlnb3RvIG9vbTsKKwkJCQl9CisJCQkJY3VyLT51c2VyLmxlbiA9IHN0cmxlbihjdXItPnVzZXIuc3RyKTsKKwkJCQlpZiAoY3VyLT51c2VyLnN0cltjdXItPnVzZXIubGVuLTFdID09ICcqJykKKwkJCQkJY3VyLT51c2VyLmlzX3ByZWZpeCA9IDE7CisJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJzZWluZm8iKSkgeworCQkJCWN1ci0+c2VpbmZvID0gc3RyZHVwKHZhbHVlKTsKKwkJCQlpZiAoIWN1ci0+c2VpbmZvKSB7CisJCQkJCWZyZWVfc2VhcHBfY29udGV4dChjdXIpOworCQkJCQlnb3RvIG9vbTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJuYW1lIikpIHsKKwkJCQljdXItPm5hbWUuc3RyID0gc3RyZHVwKHZhbHVlKTsKKwkJCQlpZiAoIWN1ci0+bmFtZS5zdHIpIHsKKwkJCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQkJCWdvdG8gb29tOworCQkJCX0KKwkJCQljdXItPm5hbWUubGVuID0gc3RybGVuKGN1ci0+bmFtZS5zdHIpOworCQkJCWlmIChjdXItPm5hbWUuc3RyW2N1ci0+bmFtZS5sZW4tMV0gPT0gJyonKQorCQkJCQljdXItPm5hbWUuaXNfcHJlZml4ID0gMTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImRvbWFpbiIpKSB7CisJCQkJY3VyLT5kb21haW4gPSBzdHJkdXAodmFsdWUpOworCQkJCWlmICghY3VyLT5kb21haW4pIHsKKwkJCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQkJCWdvdG8gb29tOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgInR5cGUiKSkgeworCQkJCWN1ci0+dHlwZSA9IHN0cmR1cCh2YWx1ZSk7CisJCQkJaWYgKCFjdXItPnR5cGUpIHsKKwkJCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQkJCWdvdG8gb29tOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImxldmVsRnJvbVVpZCIpKSB7CisJCQkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAidHJ1ZSIpKQorCQkJCQljdXItPmxldmVsRnJvbSA9IExFVkVMRlJPTV9BUFA7CisJCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJmYWxzZSIpKQorCQkJCQljdXItPmxldmVsRnJvbSA9IExFVkVMRlJPTV9OT05FOworCQkJCWVsc2UgeworCQkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAibGV2ZWxGcm9tIikpIHsKKwkJCQlpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJub25lIikpCisJCQkJCWN1ci0+bGV2ZWxGcm9tID0gTEVWRUxGUk9NX05PTkU7CisJCQkJZWxzZSBpZiAoIXN0cmNhc2VjbXAodmFsdWUsICJhcHAiKSkKKwkJCQkJY3VyLT5sZXZlbEZyb20gPSBMRVZFTEZST01fQVBQOworCQkJCWVsc2UgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAidXNlciIpKQorCQkJCQljdXItPmxldmVsRnJvbSA9IExFVkVMRlJPTV9VU0VSOworCQkJCWVsc2UgaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYWxsIikpCisJCQkJCWN1ci0+bGV2ZWxGcm9tID0gTEVWRUxGUk9NX0FMTDsKKwkJCQllbHNlIHsKKwkJCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImxldmVsIikpIHsKKwkJCQljdXItPmxldmVsID0gc3RyZHVwKHZhbHVlKTsKKwkJCQlpZiAoIWN1ci0+bGV2ZWwpIHsKKwkJCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQkJCWdvdG8gb29tOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgInBhdGgiKSkgeworCQkJCWN1ci0+cGF0aC5zdHIgPSBzdHJkdXAodmFsdWUpOworCQkJCWlmICghY3VyLT5wYXRoLnN0cikgeworCQkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQkJZ290byBvb207CisJCQkJfQorCQkJCWN1ci0+cGF0aC5sZW4gPSBzdHJsZW4oY3VyLT5wYXRoLnN0cik7CisJCQkJaWYgKGN1ci0+cGF0aC5zdHJbY3VyLT5wYXRoLmxlbi0xXSA9PSAnKicpCisJCQkJCWN1ci0+cGF0aC5pc19wcmVmaXggPSAxOworCQkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAic2Vib29sIikpIHsKKwkJCQljdXItPnNlYm9vbCA9IHN0cmR1cCh2YWx1ZSk7CisJCQkJaWYgKCFjdXItPnNlYm9vbCkgeworCQkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQkJZ290byBvb207CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmcmVlX3NlYXBwX2NvbnRleHQoY3VyKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkJdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCAiIFx0IiwgJnNhdmVwdHIpOworCQkJaWYgKCF0b2tlbikKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjdXItPm5hbWUuc3RyICYmCisJCSAgICAoIWN1ci0+c2VpbmZvIHx8ICFzdHJjbXAoY3VyLT5zZWluZm8sICJkZWZhdWx0IikpKSB7CisJCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiJXM6ICBObyBzcGVjaWZpYyBzZWluZm8gdmFsdWUgc3BlY2lmaWVkIHdpdGggbmFtZT1cIiVzXCIsIG9uIGxpbmUgJXU6ICBpbnNlY3VyZSBjb25maWd1cmF0aW9uIVxuIiwKKwkJCQkgICAgc2VhcHBfY29udGV4dHNfZmlsZVtwb2xpY3lfaW5kZXhdLCBjdXItPm5hbWUuc3RyLCBsaW5lbm8pOworCQkJZnJlZV9zZWFwcF9jb250ZXh0KGN1cik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXNlYXBwX2NvbnRleHRzW25zcGVjXSA9IGN1cjsKKwkJbnNwZWMrKzsKKwkJbGluZW5vKys7CisJfQorCisJcXNvcnQoc2VhcHBfY29udGV4dHMsIG5zcGVjLCBzaXplb2Yoc3RydWN0IHNlYXBwX2NvbnRleHQgKiksCisJICAgICAgc2VhcHBfY29udGV4dF9jbXApOworCisjaWYgREVCVUcKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgeworCQkJY3VyID0gc2VhcHBfY29udGV4dHNbaV07CisJCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0lORk8sICIlczogIGlzU3lzdGVtU2VydmVyPSVzIHVzZXI9JXMgc2VpbmZvPSVzIG5hbWU9JXMgcGF0aD0lcyBzZWJvb2w9JXMgLT4gZG9tYWluPSVzIHR5cGU9JXMgbGV2ZWw9JXMgbGV2ZWxGcm9tPSVzIiwKKwkJCV9fRlVOQ1RJT05fXywKKwkJCWN1ci0+aXNTeXN0ZW1TZXJ2ZXIgPyAidHJ1ZSIgOiAiZmFsc2UiLCBjdXItPnVzZXIuc3RyLAorCQkJY3VyLT5zZWluZm8sIGN1ci0+bmFtZS5zdHIsIGN1ci0+cGF0aC5zdHIsIGN1ci0+c2Vib29sLCBjdXItPmRvbWFpbiwKKwkJCWN1ci0+dHlwZSwgY3VyLT5sZXZlbCwKKwkJCWxldmVsRnJvbU5hbWVbY3VyLT5sZXZlbEZyb21dKTsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0ID0gMDsKKworb3V0OgorCWZjbG9zZShmcCk7CisJcmV0dXJuIHJldDsKKworZXJyOgorCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICIlczogIEludmFsaWQgZW50cnkgb24gbGluZSAldVxuIiwKKwkJICAgIHNlYXBwX2NvbnRleHRzX2ZpbGVbcG9saWN5X2luZGV4XSwgbGluZW5vKTsKKwlmcmVlX3NlYXBwX2NvbnRleHRzKCk7CisJcmV0ID0gLTE7CisJZ290byBvdXQ7Citvb206CisJc2VsaW51eF9sb2coU0VMSU5VWF9FUlJPUiwgCisJCSAgICAiJXM6ICBPdXQgb2YgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCWZyZWVfc2VhcHBfY29udGV4dHMoKTsKKwlyZXQgPSAtMTsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBzZWFwcF9jb250ZXh0X2luaXQodm9pZCkKK3sKKyAgICAgICAgc2VsaW51eF9hbmRyb2lkX3NlYXBwX2NvbnRleHRfcmVsb2FkKCk7Cit9CisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKKy8qCisgKiBNYXggaWQgdGhhdCBjYW4gYmUgbWFwcGVkIHRvIGNhdGVnb3J5IHNldCB1bmlxdWVseQorICogdXNpbmcgdGhlIGN1cnJlbnQgc2NoZW1lLgorICovCisjZGVmaW5lIENBVF9NQVBQSU5HX01BWF9JRCAoMHgxPDwxNikKKworZW51bSBzZWFwcF9raW5kIHsKKwlTRUFQUF9UWVBFLAorCVNFQVBQX0RPTUFJTgorfTsKKworc3RhdGljIGludCBzZWFwcF9jb250ZXh0X2xvb2t1cChlbnVtIHNlYXBwX2tpbmQga2luZCwKKwkJCQl1aWRfdCB1aWQsCisJCQkJaW50IGlzU3lzdGVtU2VydmVyLAorCQkJCWNvbnN0IGNoYXIgKnNlaW5mbywKKwkJCQljb25zdCBjaGFyICpwa2duYW1lLAorCQkJCWNvbnN0IGNoYXIgKnBhdGgsCisJCQkJY29udGV4dF90IGN0eCkKK3sKKwljb25zdCBjaGFyICp1c2VybmFtZSA9IE5VTEw7CisJc3RydWN0IHNlYXBwX2NvbnRleHQgKmN1ciA9IE5VTEw7CisJaW50IGk7CisJc2l6ZV90IG47CisJdWlkX3QgdXNlcmlkOworCXVpZF90IGFwcGlkOworCisJX19zZWxpbnV4X29uY2Uob25jZSwgc2VhcHBfY29udGV4dF9pbml0KTsKKworCXVzZXJpZCA9IHVpZCAvIEFJRF9VU0VSOworCWFwcGlkID0gdWlkICUgQUlEX1VTRVI7CisJaWYgKGFwcGlkIDwgQUlEX0FQUCkgeworCQlmb3IgKG4gPSAwOyBuIDwgYW5kcm9pZF9pZF9jb3VudDsgbisrKSB7CisJCQlpZiAoYW5kcm9pZF9pZHNbbl0uYWlkID09IGFwcGlkKSB7CisJCQkJdXNlcm5hbWUgPSBhbmRyb2lkX2lkc1tuXS5uYW1lOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghdXNlcm5hbWUpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgaWYgKGFwcGlkIDwgQUlEX0lTT0xBVEVEX1NUQVJUKSB7CisJCXVzZXJuYW1lID0gIl9hcHAiOworCQlhcHBpZCAtPSBBSURfQVBQOworCX0gZWxzZSB7CisJCXVzZXJuYW1lID0gIl9pc29sYXRlZCI7CisJCWFwcGlkIC09IEFJRF9JU09MQVRFRF9TVEFSVDsKKwl9CisKKwlpZiAoYXBwaWQgPj0gQ0FUX01BUFBJTkdfTUFYX0lEIHx8IHVzZXJpZCA+PSBDQVRfTUFQUElOR19NQVhfSUQpCisJCWdvdG8gZXJyOworCisJZm9yIChpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKKwkJY3VyID0gc2VhcHBfY29udGV4dHNbaV07CisKKwkJaWYgKGN1ci0+aXNTeXN0ZW1TZXJ2ZXIgIT0gaXNTeXN0ZW1TZXJ2ZXIpCisJCQljb250aW51ZTsKKworCQlpZiAoY3VyLT51c2VyLnN0cikgeworCQkJaWYgKGN1ci0+dXNlci5pc19wcmVmaXgpIHsKKwkJCQlpZiAoc3RybmNhc2VjbXAodXNlcm5hbWUsIGN1ci0+dXNlci5zdHIsIGN1ci0+dXNlci5sZW4tMSkpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc3RyY2FzZWNtcCh1c2VybmFtZSwgY3VyLT51c2VyLnN0cikpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKGN1ci0+c2VpbmZvKSB7CisJCQlpZiAoIXNlaW5mbyB8fCBzdHJjYXNlY21wKHNlaW5mbywgY3VyLT5zZWluZm8pKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGN1ci0+bmFtZS5zdHIpIHsKKwkJCWlmKCFwa2duYW1lKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoY3VyLT5uYW1lLmlzX3ByZWZpeCkgeworCQkJCWlmIChzdHJuY2FzZWNtcChwa2duYW1lLCBjdXItPm5hbWUuc3RyLCBjdXItPm5hbWUubGVuLTEpKQorCQkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0cmNhc2VjbXAocGtnbmFtZSwgY3VyLT5uYW1lLnN0cikpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKGN1ci0+cGF0aC5zdHIpIHsKKwkJCWlmICghcGF0aCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGN1ci0+cGF0aC5pc19wcmVmaXgpIHsKKwkJCQlpZiAoc3RybmNtcChwYXRoLCBjdXItPnBhdGguc3RyLCBjdXItPnBhdGgubGVuLTEpKQorCQkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0cmNtcChwYXRoLCBjdXItPnBhdGguc3RyKSkKKwkJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoa2luZCA9PSBTRUFQUF9UWVBFICYmICFjdXItPnR5cGUpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoa2luZCA9PSBTRUFQUF9ET01BSU4gJiYgIWN1ci0+ZG9tYWluKQorCQkJY29udGludWU7CisKKwkJaWYgKGN1ci0+c2Vib29sKSB7CisJCQlpbnQgdmFsdWUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUoY3VyLT5zZWJvb2wpOworCQkJaWYgKHZhbHVlID09IDApCisJCQkJY29udGludWU7CisJCQllbHNlIGlmICh2YWx1ZSA9PSAtMSkgeworCQkJCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsIFwKKwkJCQkiQ291bGQgbm90IGZpbmQgYm9vbGVhbjogJXMgIiwgY3VyLT5zZWJvb2wpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwkJaWYgKGtpbmQgPT0gU0VBUFBfVFlQRSkgeworCQkJaWYgKGNvbnRleHRfdHlwZV9zZXQoY3R4LCBjdXItPnR5cGUpKQorCQkJCWdvdG8gb29tOworCQl9IGVsc2UgaWYgKGtpbmQgPT0gU0VBUFBfRE9NQUlOKSB7CisJCQlpZiAoY29udGV4dF90eXBlX3NldChjdHgsIGN1ci0+ZG9tYWluKSkKKwkJCQlnb3RvIG9vbTsKKwkJfQorCisJCWlmIChjdXItPmxldmVsRnJvbSAhPSBMRVZFTEZST01fTk9ORSkgeworCQkJY2hhciBsZXZlbFsyNTVdOworCQkJc3dpdGNoIChjdXItPmxldmVsRnJvbSkgeworCQkJY2FzZSBMRVZFTEZST01fQVBQOgorCQkJCXNucHJpbnRmKGxldmVsLCBzaXplb2YgbGV2ZWwsICJzMDpjJXUsYyV1IiwKKwkJCQkJIGFwcGlkICYgMHhmZiwKKwkJCQkJIDI1NiArIChhcHBpZD4+OCAmIDB4ZmYpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTEVWRUxGUk9NX1VTRVI6CisJCQkJc25wcmludGYobGV2ZWwsIHNpemVvZiBsZXZlbCwgInMwOmMldSxjJXUiLAorCQkJCQkgNTEyICsgKHVzZXJpZCAmIDB4ZmYpLAorCQkJCQkgNzY4ICsgKHVzZXJpZD4+OCAmIDB4ZmYpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTEVWRUxGUk9NX0FMTDoKKwkJCQlzbnByaW50ZihsZXZlbCwgc2l6ZW9mIGxldmVsLCAiczA6YyV1LGMldSxjJXUsYyV1IiwKKwkJCQkJIGFwcGlkICYgMHhmZiwKKwkJCQkJIDI1NiArIChhcHBpZD4+OCAmIDB4ZmYpLAorCQkJCQkgNTEyICsgKHVzZXJpZCAmIDB4ZmYpLAorCQkJCQkgNzY4ICsgKHVzZXJpZD4+OCAmIDB4ZmYpKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlpZiAoY29udGV4dF9yYW5nZV9zZXQoY3R4LCBsZXZlbCkpCisJCQkJZ290byBvb207CisJCX0gZWxzZSBpZiAoY3VyLT5sZXZlbCkgeworCQkJaWYgKGNvbnRleHRfcmFuZ2Vfc2V0KGN0eCwgY3VyLT5sZXZlbCkpCisJCQkJZ290byBvb207CisJCX0KKworCQlicmVhazsKKwl9CisKKwlpZiAoa2luZCA9PSBTRUFQUF9ET01BSU4gJiYgaSA9PSBuc3BlYykgeworCQkvKgorCQkgKiBObyBtYXRjaC4KKwkJICogRmFpbCB0byBwcmV2ZW50IHN0YXlpbmcgaW4gdGhlIHp5Z290ZSdzIGNvbnRleHQuCisJCSAqLworCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLAorCQkJICAgICIlczogIE5vIG1hdGNoIGZvciBhcHAgd2l0aCB1aWQgJWQsIHNlaW5mbyAlcywgbmFtZSAlc1xuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHVpZCwgc2VpbmZvLCBwa2duYW1lKTsKKworCQlpZiAoc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpID09IDEpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gLTE7Citvb206CisJcmV0dXJuIC0yOworfQorCitpbnQgc2VsaW51eF9hbmRyb2lkX3NldGZpbGVjb24oY29uc3QgY2hhciAqcGtnZGlyLAorCQkJCWNvbnN0IGNoYXIgKnBrZ25hbWUsCisJCQkJY29uc3QgY2hhciAqc2VpbmZvLAorCQkJCXVpZF90IHVpZCkKK3sKKwljaGFyICpvcmlnX2N0eF9zdHIgPSBOVUxMOworCWNoYXIgKmN0eF9zdHIgPSBOVUxMOworCWNvbnRleHRfdCBjdHggPSBOVUxMOworCWludCByYyA9IC0xOworCisJaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpIDw9IDApCisJCXJldHVybiAwOworCisJcmMgPSBnZXRmaWxlY29uKHBrZ2RpciwgJmN0eF9zdHIpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJY3R4ID0gY29udGV4dF9uZXcoY3R4X3N0cik7CisJb3JpZ19jdHhfc3RyID0gY3R4X3N0cjsKKwlpZiAoIWN0eCkKKwkJZ290byBvb207CisKKwlyYyA9IHNlYXBwX2NvbnRleHRfbG9va3VwKFNFQVBQX1RZUEUsIHVpZCwgMCwgc2VpbmZvLCBwa2duYW1lLCBOVUxMLCBjdHgpOworCWlmIChyYyA9PSAtMSkKKwkJZ290byBlcnI7CisJZWxzZSBpZiAocmMgPT0gLTIpCisJCWdvdG8gb29tOworCisJY3R4X3N0ciA9IGNvbnRleHRfc3RyKGN0eCk7CisJaWYgKCFjdHhfc3RyKQorCQlnb3RvIG9vbTsKKworCXJjID0gc2VjdXJpdHlfY2hlY2tfY29udGV4dChjdHhfc3RyKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCWlmIChzdHJjbXAoY3R4X3N0ciwgb3JpZ19jdHhfc3RyKSkgeworCQlyYyA9IHNldGZpbGVjb24ocGtnZGlyLCBjdHhfc3RyKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZXJyOworCX0KKworCXJjID0gMDsKK291dDoKKwlmcmVlY29uKG9yaWdfY3R4X3N0cik7CisJY29udGV4dF9mcmVlKGN0eCk7CisJcmV0dXJuIHJjOworZXJyOgorCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICIlczogIEVycm9yIHNldHRpbmcgY29udGV4dCBmb3IgcGtnZGlyICVzLCB1aWQgJWQ6ICVzXG4iLAorCQkgICAgX19GVU5DVElPTl9fLCBwa2dkaXIsIHVpZCwgc3RyZXJyb3IoZXJybm8pKTsKKwlyYyA9IC0xOworCWdvdG8gb3V0Oworb29tOgorCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICIlczogIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworaW50IHNlbGludXhfYW5kcm9pZF9zZXRjb250ZXh0KHVpZF90IHVpZCwKKwkJCSAgICAgICBpbnQgaXNTeXN0ZW1TZXJ2ZXIsCisJCQkgICAgICAgY29uc3QgY2hhciAqc2VpbmZvLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnBrZ25hbWUpCit7CisJY2hhciAqb3JpZ19jdHhfc3RyID0gTlVMTCwgKmN0eF9zdHI7CisJY29udGV4dF90IGN0eCA9IE5VTEw7CisJaW50IHJjID0gLTE7CisKKwlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlyYyA9IGdldGNvbigmY3R4X3N0cik7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCWN0eCA9IGNvbnRleHRfbmV3KGN0eF9zdHIpOworCW9yaWdfY3R4X3N0ciA9IGN0eF9zdHI7CisJaWYgKCFjdHgpCisJCWdvdG8gb29tOworCisJcmMgPSBzZWFwcF9jb250ZXh0X2xvb2t1cChTRUFQUF9ET01BSU4sIHVpZCwgaXNTeXN0ZW1TZXJ2ZXIsIHNlaW5mbywgcGtnbmFtZSwgTlVMTCwgY3R4KTsKKwlpZiAocmMgPT0gLTEpCisJCWdvdG8gZXJyOworCWVsc2UgaWYgKHJjID09IC0yKQorCQlnb3RvIG9vbTsKKworCWN0eF9zdHIgPSBjb250ZXh0X3N0cihjdHgpOworCWlmICghY3R4X3N0cikKKwkJZ290byBvb207CisKKwlyYyA9IHNlY3VyaXR5X2NoZWNrX2NvbnRleHQoY3R4X3N0cik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlpZiAoc3RyY21wKGN0eF9zdHIsIG9yaWdfY3R4X3N0cikpIHsKKwkJcmMgPSBzZXRjb24oY3R4X3N0cik7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIGVycjsKKwl9CisKKwlyYyA9IDA7CitvdXQ6CisJZnJlZWNvbihvcmlnX2N0eF9zdHIpOworCWNvbnRleHRfZnJlZShjdHgpOworCWF2Y19uZXRsaW5rX2Nsb3NlKCk7CisJcmV0dXJuIHJjOworZXJyOgorCWlmIChpc1N5c3RlbVNlcnZlcikKKwkJc2VsaW51eF9sb2coU0VMSU5VWF9FUlJPUiwKKwkJCQkiJXM6ICBFcnJvciBzZXR0aW5nIGNvbnRleHQgZm9yIHN5c3RlbSBzZXJ2ZXI6ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwllbHNlIAorCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLAorCQkJCSIlczogIEVycm9yIHNldHRpbmcgY29udGV4dCBmb3IgYXBwIHdpdGggdWlkICVkLCBzZWluZm8gJXM6ICVzXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgdWlkLCBzZWluZm8sIHN0cmVycm9yKGVycm5vKSk7CisKKwlyYyA9IC0xOworCWdvdG8gb3V0Oworb29tOgorCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICIlczogIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqc2VoYW5kbGUgPSBOVUxMOworI2RlZmluZSBGQ19ESUdFU1RfU0laRSBTSEFfRElHRVNUX1NJWkUKK3N0YXRpYyB1aW50OF90IGZjX2RpZ2VzdFtGQ19ESUdFU1RfU0laRV07CisKK3N0YXRpYyBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmdldF9zZWxhYmVsX2hhbmRsZShjb25zdCBzdHJ1Y3Qgc2VsaW51eF9vcHQgb3B0c1tdKQoreworICAgIHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaDsKKyAgICBpbnQgZmQ7CisgICAgc3RydWN0IHN0YXQgc2I7CisgICAgdm9pZCAqbWFwOworCisgICAgc2V0X3BvbGljeV9pbmRleCgpOworCisgICAgaCA9IHNlbGFiZWxfb3BlbihTRUxBQkVMX0NUWF9GSUxFLCAmb3B0c1twb2xpY3lfaW5kZXhdLCAxKTsKKyAgICBpZiAoIWgpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZmQgPSBvcGVuKG9wdHNbcG9saWN5X2luZGV4XS52YWx1ZSwgT19SRE9OTFkgfCBPX05PRk9MTE9XKTsKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICJTRUxpbnV4OiAgQ291bGQgbm90IG9wZW4gJXM6ICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgb3B0c1twb2xpY3lfaW5kZXhdLnZhbHVlLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKGZzdGF0KGZkLCAmc2IpIDwgMCkgeworICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiU0VMaW51eDogIENvdWxkIG5vdCBzdGF0ICVzOiAgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIG9wdHNbcG9saWN5X2luZGV4XS52YWx1ZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgbWFwID0gbW1hcChOVUxMLCBzYi5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgICAgaWYgKG1hcCA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICJTRUxpbnV4OiAgQ291bGQgbm90IG1hcCAlczogICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBvcHRzW3BvbGljeV9pbmRleF0udmFsdWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIFNIQV9oYXNoKG1hcCwgc2Iuc3Rfc2l6ZSwgZmNfZGlnZXN0KTsKKyAgICBtdW5tYXAobWFwLCBzYi5zdF9zaXplKTsKKyAgICBjbG9zZShmZCk7CisKKyAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0lORk8sICJTRUxpbnV4OiBMb2FkZWQgZmlsZV9jb250ZXh0cyBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgIG9wdHNbcG9saWN5X2luZGV4XS52YWx1ZSk7CisKKyAgICByZXR1cm4gaDsKKworZXJyOgorICAgIHNlbGFiZWxfY2xvc2UoaCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmZpbGVfY29udGV4dF9vcGVuKHZvaWQpCit7CisJc3RydWN0IHNlbGFiZWxfaGFuZGxlICpoOworCisJaCA9IGdldF9zZWxhYmVsX2hhbmRsZShzZW9wdHMpOworCisJaWYgKCFoKQorCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiJXM6IEVycm9yIGdldHRpbmcgZmlsZSBjb250ZXh0IGhhbmRsZSAoJXMpXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gaDsKK30KKworc3RhdGljIHZvaWQgZmlsZV9jb250ZXh0X2luaXQodm9pZCkKK3sKKyAgICBpZiAoIXNlaGFuZGxlKQorICAgICAgICBzZWhhbmRsZSA9IGZpbGVfY29udGV4dF9vcGVuKCk7Cit9CisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBmY19vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKK3N0cnVjdCBwa2dJbmZvIHsKKyAgICBjaGFyICpuYW1lOworICAgIHVpZF90IHVpZDsKKyAgICBib29sIGRlYnVnZ2FibGU7CisgICAgY2hhciAqZGF0YURpcjsKKyAgICBjaGFyICpzZWluZm87CisgICAgc3RydWN0IHBrZ0luZm8gKm5leHQ7Cit9OworCisjZGVmaW5lIFBLR1RBQl9TSVpFIDI1Ngorc3RhdGljIHN0cnVjdCBwa2dJbmZvICpwa2dUYWJbUEtHVEFCX1NJWkVdOworCitzdGF0aWMgdW5zaWduZWQgaW50IHBrZ2hhc2goY29uc3QgY2hhciAqcGtnbmFtZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaCA9IDc7CisgICAgZm9yICg7ICpwa2duYW1lOyBwa2duYW1lKyspIHsKKyAgICAgICAgaCA9IGggKiAzMSArICpwa2duYW1lOworICAgIH0KKyAgICByZXR1cm4gaCAmIChQS0dUQUJfU0laRSAtIDEpOworfQorCisvKiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcyBvbiB0aGUgc3lzdGVtICovCisjZGVmaW5lIFBBQ0tBR0VTX0xJU1RfRklMRSAgIi9kYXRhL3N5c3RlbS9wYWNrYWdlcy5saXN0IgorCitzdGF0aWMgdm9pZCBwYWNrYWdlX2luZm9faW5pdCh2b2lkKQoreworICAgIGNoYXIgKmJ1ZiA9IE5VTEw7CisgICAgc2l6ZV90IGJ1ZmxlbiA9IDA7CisgICAgc3NpemVfdCBieXRlc3JlYWQ7CisgICAgRklMRSAqZnA7CisgICAgY2hhciAqY3VyLCAqbmV4dDsKKyAgICBzdHJ1Y3QgcGtnSW5mbyAqcGtnSW5mbyA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGhhc2g7CisgICAgdW5zaWduZWQgbG9uZyBsaW5lbm8gPSAxOworCisgICAgZnAgPSBmb3BlbihQQUNLQUdFU19MSVNUX0ZJTEUsICJyIik7CisgICAgaWYgKCFmcCkgeworICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiU0VMaW51eDogIENvdWxkIG5vdCBvcGVuICVzOiAgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICBQQUNLQUdFU19MSVNUX0ZJTEUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKChieXRlc3JlYWQgPSBnZXRsaW5lKCZidWYsICZidWZsZW4sIGZwKSkgPiAwKSB7CisgICAgICAgIHBrZ0luZm8gPSBjYWxsb2MoMSwgc2l6ZW9mKCpwa2dJbmZvKSk7CisgICAgICAgIGlmICghcGtnSW5mbykKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICBjdXIgPSBzdHJzZXAoJm5leHQsICIgXHRcbiIpOworICAgICAgICBpZiAoIWN1cikKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBwa2dJbmZvLT5uYW1lID0gc3RyZHVwKGN1cik7CisgICAgICAgIGlmICghcGtnSW5mby0+bmFtZSkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBjdXIgPSBzdHJzZXAoJm5leHQsICIgXHRcbiIpOworICAgICAgICBpZiAoIWN1cikKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBwa2dJbmZvLT51aWQgPSBhdG9pKGN1cik7CisgICAgICAgIGlmICghcGtnSW5mby0+dWlkKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxuIik7CisgICAgICAgIGlmICghY3VyKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHBrZ0luZm8tPmRlYnVnZ2FibGUgPSBhdG9pKGN1cik7CisgICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxuIik7CisgICAgICAgIGlmICghY3VyKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHBrZ0luZm8tPmRhdGFEaXIgPSBzdHJkdXAoY3VyKTsKKyAgICAgICAgaWYgKCFwa2dJbmZvLT5kYXRhRGlyKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGN1ciA9IHN0cnNlcCgmbmV4dCwgIiBcdFxuIik7CisgICAgICAgIGlmICghY3VyKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHBrZ0luZm8tPnNlaW5mbyA9IHN0cmR1cChjdXIpOworICAgICAgICBpZiAoIXBrZ0luZm8tPnNlaW5mbykKKyAgICAgICAgICAgIGdvdG8gZXJyOworCisgICAgICAgIGhhc2ggPSBwa2doYXNoKHBrZ0luZm8tPm5hbWUpOworICAgICAgICBpZiAocGtnVGFiW2hhc2hdKQorICAgICAgICAgICAgcGtnSW5mby0+bmV4dCA9IHBrZ1RhYltoYXNoXTsKKyAgICAgICAgcGtnVGFiW2hhc2hdID0gcGtnSW5mbzsKKworICAgICAgICBsaW5lbm8rKzsKKyAgICB9CisKKyNpZiBERUJVRworICAgIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGJ1Y2tldHMsIGVudHJpZXMsIGNoYWlubGVuLCBsb25nZXN0Y2hhaW47CisKKyAgICAgICAgYnVja2V0cyA9IGVudHJpZXMgPSBsb25nZXN0Y2hhaW4gPSAwOworICAgICAgICBmb3IgKGhhc2ggPSAwOyBoYXNoIDwgUEtHVEFCX1NJWkU7IGhhc2grKykgeworICAgICAgICAgICAgaWYgKHBrZ1RhYltoYXNoXSkgeworICAgICAgICAgICAgICAgIGJ1Y2tldHMrKzsKKyAgICAgICAgICAgICAgICBjaGFpbmxlbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChwa2dJbmZvID0gcGtnVGFiW2hhc2hdOyBwa2dJbmZvOyBwa2dJbmZvID0gcGtnSW5mby0+bmV4dCkgeworICAgICAgICAgICAgICAgICAgICBjaGFpbmxlbisrOworICAgICAgICAgICAgICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0lORk8sICIlczogIG5hbWU9JXMgdWlkPSV1IGRlYnVnZ2FibGU9JXMgZGF0YURpcj0lcyBzZWluZm89JXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGtnSW5mby0+bmFtZSwgcGtnSW5mby0+dWlkLCBwa2dJbmZvLT5kZWJ1Z2dhYmxlID8gInRydWUiIDogImZhbHNlIiwgcGtnSW5mby0+ZGF0YURpciwgcGtnSW5mby0+c2VpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW50cmllcyArPSBjaGFpbmxlbjsKKyAgICAgICAgICAgICAgICBpZiAobG9uZ2VzdGNoYWluIDwgY2hhaW5sZW4pCisgICAgICAgICAgICAgICAgICAgIGxvbmdlc3RjaGFpbiA9IGNoYWlubGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNlbGludXhfbG9nKFNFTElOVVhfSU5GTywgIlNFTGludXg6ICAlZCBwa2cgZW50cmllcyBhbmQgJWQvJWQgYnVja2V0cyB1c2VkLCBsb25nZXN0IGNoYWluICVkXG4iLCBlbnRyaWVzLCBidWNrZXRzLCBQS0dUQUJfU0laRSwgbG9uZ2VzdGNoYWluKTsKKyAgICB9CisjZW5kaWYKKworb3V0OgorICAgIGZyZWUoYnVmKTsKKyAgICBmY2xvc2UoZnApOworICAgIHJldHVybjsKKworZXJyOgorICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICJTRUxpbnV4OiAgRXJyb3IgcmVhZGluZyAlcyBvbiBsaW5lICVsdS5cbiIsCisgICAgICAgICAgICAgICAgUEFDS0FHRVNfTElTVF9GSUxFLCBsaW5lbm8pOworICAgIGlmIChwa2dJbmZvKSB7CisgICAgICAgIGZyZWUocGtnSW5mby0+bmFtZSk7CisgICAgICAgIGZyZWUocGtnSW5mby0+ZGF0YURpcik7CisgICAgICAgIGZyZWUocGtnSW5mby0+c2VpbmZvKTsKKyAgICAgICAgZnJlZShwa2dJbmZvKTsKKyAgICB9CisgICAgZ290byBvdXQ7Cit9CisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBwa2dfb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworCitzdHJ1Y3QgcGtnSW5mbyAqcGFja2FnZV9pbmZvX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworICAgIHN0cnVjdCBwa2dJbmZvICpwa2dJbmZvOworICAgIHVuc2lnbmVkIGludCBoYXNoOworCisgICAgX19zZWxpbnV4X29uY2UocGtnX29uY2UsIHBhY2thZ2VfaW5mb19pbml0KTsKKworICAgIGhhc2ggPSBwa2doYXNoKG5hbWUpOworICAgIGZvciAocGtnSW5mbyA9IHBrZ1RhYltoYXNoXTsgcGtnSW5mbzsgcGtnSW5mbyA9IHBrZ0luZm8tPm5leHQpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgcGtnSW5mby0+bmFtZSkpCisgICAgICAgICAgICByZXR1cm4gcGtnSW5mbzsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFRoZSBwYXRoIHByZWZpeGVzIG9mIHBhY2thZ2UgZGF0YSBkaXJlY3Rvcmllcy4gKi8KKyNkZWZpbmUgREFUQV9EQVRBX1BBVEggIi9kYXRhL2RhdGEiCisjZGVmaW5lIERBVEFfVVNFUl9QQVRIICIvZGF0YS91c2VyIgorI2RlZmluZSBEQVRBX0RBVEFfUFJFRklYIERBVEFfREFUQV9QQVRIICIvIgorI2RlZmluZSBEQVRBX1VTRVJfUFJFRklYIERBVEFfVVNFUl9QQVRIICIvIgorCitzdGF0aWMgaW50IHBrZ2Rpcl9zZWxhYmVsX2xvb2t1cChjb25zdCBjaGFyICpwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipzZWNvbnRleHRwKQoreworICAgIGNoYXIgKnBrZ25hbWUgPSBOVUxMLCAqZW5kID0gTlVMTDsKKyAgICBzdHJ1Y3QgcGtnSW5mbyAqcGtnSW5mbyA9IE5VTEw7CisgICAgY2hhciAqc2Vjb250ZXh0ID0gKnNlY29udGV4dHA7CisgICAgY29udGV4dF90IGN0eCA9IE5VTEw7CisgICAgaW50IHJjID0gMDsKKworICAgIC8qIFNraXAgZGlyZWN0b3J5IHByZWZpeCBiZWZvcmUgcGFja2FnZSBuYW1lLiAqLworICAgIGlmICghc3RybmNtcChwYXRobmFtZSwgREFUQV9EQVRBX1BSRUZJWCwgc2l6ZW9mKERBVEFfREFUQV9QUkVGSVgpLTEpKSB7CisgICAgICAgIHBhdGhuYW1lICs9IHNpemVvZihEQVRBX0RBVEFfUFJFRklYKSAtIDE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChwYXRobmFtZSwgREFUQV9VU0VSX1BSRUZJWCwgc2l6ZW9mKERBVEFfVVNFUl9QUkVGSVgpLTEpKSB7CisgICAgICAgIHBhdGhuYW1lICs9IHNpemVvZihEQVRBX1VTRVJfUFJFRklYKSAtIDE7CisgICAgICAgIHdoaWxlIChpc2RpZ2l0KCpwYXRobmFtZSkpCisgICAgICAgICAgICBwYXRobmFtZSsrOworICAgICAgICBpZiAoKnBhdGhuYW1lID09ICcvJykKKyAgICAgICAgICAgIHBhdGhuYW1lKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghKCpwYXRobmFtZSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcGtnbmFtZSA9IHN0cmR1cChwYXRobmFtZSk7CisgICAgaWYgKCFwa2duYW1lKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGVuZCA9IHBrZ25hbWU7ICplbmQgJiYgKmVuZCAhPSAnLyc7IGVuZCsrKQorICAgICAgICA7CisgICAgcGF0aG5hbWUgPSBlbmQ7CisgICAgaWYgKCplbmQpCisgICAgICAgIHBhdGhuYW1lKys7CisgICAgKmVuZCA9ICdcMCc7CisKKyAgICBpZiAoIXNlaW5mbykgeworICAgICAgICBwa2dJbmZvID0gcGFja2FnZV9pbmZvX2xvb2t1cChwa2duYW1lKTsKKyAgICAgICAgaWYgKCFwa2dJbmZvKSB7CisgICAgICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX1dBUk5JTkcsICJTRUxpbnV4OiAgQ291bGQgbm90IGxvb2sgdXAgaW5mb3JtYXRpb24gZm9yIHBhY2thZ2UgJXMsIGNhbm5vdCByZXN0b3JlY29uICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZ25hbWUsIHBhdGhuYW1lKTsKKyAgICAgICAgICAgIGZyZWUocGtnbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHggPSBjb250ZXh0X25ldyhzZWNvbnRleHQpOworICAgIGlmICghY3R4KQorICAgICAgICBnb3RvIGVycjsKKworICAgIHJjID0gc2VhcHBfY29udGV4dF9sb29rdXAoU0VBUFBfVFlQRSwgcGtnSW5mbyA/IHBrZ0luZm8tPnVpZCA6IHVpZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ0luZm8gPyBwa2dJbmZvLT5zZWluZm8gOiBzZWluZm8sIHBrZ0luZm8gPyBwa2dJbmZvLT5uYW1lIDogcGtnbmFtZSwgcGF0aG5hbWUsIGN0eCk7CisgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgZ290byBlcnI7CisKKyAgICBzZWNvbnRleHQgPSBjb250ZXh0X3N0cihjdHgpOworICAgIGlmICghc2Vjb250ZXh0KQorICAgICAgICBnb3RvIGVycjsKKworICAgIGlmICghc3RyY21wKHNlY29udGV4dCwgKnNlY29udGV4dHApKQorICAgICAgICBnb3RvIG91dDsKKworICAgIHJjID0gc2VjdXJpdHlfY2hlY2tfY29udGV4dChzZWNvbnRleHQpOworICAgIGlmIChyYyA8IDApCisgICAgICAgIGdvdG8gZXJyOworCisgICAgZnJlZWNvbigqc2Vjb250ZXh0cCk7CisgICAgKnNlY29udGV4dHAgPSBzdHJkdXAoc2Vjb250ZXh0KTsKKyAgICBpZiAoISgqc2Vjb250ZXh0cCkpCisgICAgICAgIGdvdG8gZXJyOworCisgICAgcmMgPSAwOworCitvdXQ6CisgICAgZnJlZShwa2duYW1lKTsKKyAgICBjb250ZXh0X2ZyZWUoY3R4KTsKKyAgICByZXR1cm4gcmM7CitlcnI6CisgICAgc2VsaW51eF9sb2coU0VMSU5VWF9FUlJPUiwgIiVzOiAgRXJyb3IgbG9va2luZyB1cCBjb250ZXh0IGZvciBwYXRoICVzLCBwa2duYW1lICVzLCBzZWluZm8gJXMsIHVpZCAldTogJXNcbiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwYXRobmFtZSwgcGtnbmFtZSwgcGtnSW5mby0+c2VpbmZvLCBwa2dJbmZvLT51aWQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmMgPSAtMTsKKyAgICBnb3RvIG91dDsKK30KKworI2RlZmluZSBSRVNUT1JFQ09OX0xBU1QgInNlY3VyaXR5LnJlc3RvcmVjb25fbGFzdCIKKworc3RhdGljIGludCByZXN0b3JlY29uX3NiKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBub2NoYW5nZSwgYm9vbCB2ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywgdWlkX3QgdWlkKQoreworICAgIGNoYXIgKnNlY29udGV4dCA9IE5VTEw7CisgICAgY2hhciAqb2xkc2Vjb250ZXh0ID0gTlVMTDsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKHNlbGFiZWxfbG9va3VwKHNlaGFuZGxlLCAmc2Vjb250ZXh0LCBwYXRobmFtZSwgc2ItPnN0X21vZGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7ICAvKiBubyBtYXRjaCwgYnV0IG5vdCBhbiBlcnJvciAqLworCisgICAgaWYgKGxnZXRmaWxlY29uKHBhdGhuYW1lLCAmb2xkc2Vjb250ZXh0KSA8IDApCisgICAgICAgIGdvdG8gZXJyOworCisgICAgLyoKKyAgICAgKiBGb3Igc3ViZGlyZWN0b3JpZXMgb2YgL2RhdGEvZGF0YSBvciAvZGF0YS91c2VyLCB3ZSBpZ25vcmUgc2VsYWJlbF9sb29rdXAoKQorICAgICAqIGFuZCB1c2UgcGtnZGlyX3NlbGFiZWxfbG9va3VwKCkgaW5zdGVhZC4gRmlsZXMgd2l0aGluIHRob3NlIGRpcmVjdG9yaWVzCisgICAgICogaGF2ZSBkaWZmZXJlbnQgbGFiZWxpbmcgcnVsZXMsIGJhc2VkIG9mZiBvZiAvc2VhcHBfY29udGV4dHMsIGFuZAorICAgICAqIGluc3RhbGxkIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGVzZSBsYWJlbHMgaW5zdGVhZCBvZiBpbml0LgorICAgICAqLworICAgIGlmICghc3RybmNtcChwYXRobmFtZSwgREFUQV9EQVRBX1BSRUZJWCwgc2l6ZW9mKERBVEFfREFUQV9QUkVGSVgpLTEpIHx8CisgICAgICAgICFzdHJuY21wKHBhdGhuYW1lLCBEQVRBX1VTRVJfUFJFRklYLCBzaXplb2YoREFUQV9VU0VSX1BSRUZJWCktMSkpIHsKKyAgICAgICAgaWYgKHBrZ2Rpcl9zZWxhYmVsX2xvb2t1cChwYXRobmFtZSwgc2VpbmZvLCB1aWQsICZzZWNvbnRleHQpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChzdHJjbXAob2xkc2Vjb250ZXh0LCBzZWNvbnRleHQpICE9IDApIHsKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAiU0VMaW51eDogIFJlbGFiZWxpbmcgJXMgZnJvbSAlcyB0byAlcy5cbiIsIHBhdGhuYW1lLCBvbGRzZWNvbnRleHQsIHNlY29udGV4dCk7CisgICAgICAgIGlmICghbm9jaGFuZ2UpIHsKKyAgICAgICAgICAgIGlmIChsc2V0ZmlsZWNvbihwYXRobmFtZSwgc2Vjb250ZXh0KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IDA7CisKK291dDoKKyAgICBmcmVlY29uKG9sZHNlY29udGV4dCk7CisgICAgZnJlZWNvbihzZWNvbnRleHQpOworICAgIHJldHVybiByYzsKKworZXJyOgorICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsCisgICAgICAgICAgICAgICAgIlNFTGludXg6IENvdWxkIG5vdCBzZXQgY29udGV4dCBmb3IgJXM6ICAlc1xuIiwKKyAgICAgICAgICAgICAgICBwYXRobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByYyA9IC0xOworICAgIGdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uX2NvbW1vbihjb25zdCBjaGFyKiBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgICBib29sIG5vY2hhbmdlID0gKGZsYWdzICYgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fTk9DSEFOR0UpID8gdHJ1ZSA6IGZhbHNlOworICAgIGJvb2wgdmVyYm9zZSA9IChmbGFncyAmIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1ZFUkJPU0UpID8gdHJ1ZSA6IGZhbHNlOworICAgIGJvb2wgcmVjdXJzZSA9IChmbGFncyAmIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX1JFQ1VSU0UpID8gdHJ1ZSA6IGZhbHNlOworICAgIGJvb2wgZm9yY2UgPSAoZmxhZ3MgJiBTRUxJTlVYX0FORFJPSURfUkVTVE9SRUNPTl9GT1JDRSkgPyB0cnVlIDogZmFsc2U7CisgICAgYm9vbCBkYXRhZGF0YSA9IChmbGFncyAmIFNFTElOVVhfQU5EUk9JRF9SRVNUT1JFQ09OX0RBVEFEQVRBKSA/IHRydWUgOiBmYWxzZTsKKyAgICBib29sIGlzc3lzID0gc3RyY21wKHBhdGhuYW1lLCAiL3N5cyIpID09IDAgPyB0cnVlIDogZmFsc2U7CisgICAgYm9vbCBzZXRyZXN0b3JlY29ubGFzdCA9IHRydWU7CisgICAgc3RydWN0IHN0YXQgc2I7CisgICAgRlRTICpmdHM7CisgICAgRlRTRU5UICpmdHNlbnQ7CisgICAgY2hhciAqY29uc3QgcGF0aHNbMl0gPSB7IF9fVU5DT05TVChwYXRobmFtZSksIE5VTEwgfTsKKyAgICBpbnQgZnRzZmxhZ3MgPSBGVFNfQ09NRk9MTE9XIHwgRlRTX05PQ0hESVIgfCBGVFNfWERFViB8IEZUU19QSFlTSUNBTDsKKyAgICBpbnQgZXJyb3IsIHN2ZXJybm87CisgICAgY2hhciB4YXR0cl92YWx1ZVtGQ19ESUdFU1RfU0laRV07CisgICAgc3NpemVfdCBzaXplOworCisgICAgaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpIDw9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgX19zZWxpbnV4X29uY2UoZmNfb25jZSwgZmlsZV9jb250ZXh0X2luaXQpOworCisgICAgaWYgKCFzZWhhbmRsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXJlY3Vyc2UpIHsKKyAgICAgICAgaWYgKGxzdGF0KHBhdGhuYW1lLCAmc2IpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICByZXR1cm4gcmVzdG9yZWNvbl9zYihwYXRobmFtZSwgJnNiLCBub2NoYW5nZSwgdmVyYm9zZSwgc2VpbmZvLCB1aWQpOworICAgIH0KKworICAgIC8qCisgICAgICogSWdub3JlIHJlc3RvcmVjb25fbGFzdCBvbiAvZGF0YS9kYXRhIG9yIC9kYXRhL3VzZXIKKyAgICAgKiBzaW5jZSB0aGVpciBsYWJlbGluZyBpcyBiYXNlZCBvbiBzZWFwcF9jb250ZXh0cyBhbmQgc2VpbmZvCisgICAgICogYXNzaWdubWVudHMgcmF0aGVyIHRoYW4gZmlsZV9jb250ZXh0cyBhbmQgaXMgbWFuYWdlZCBieQorICAgICAqIGluc3RhbGxkIHJhdGhlciB0aGFuIGluaXQuCisgICAgICovCisgICAgaWYgKCFzdHJuY21wKHBhdGhuYW1lLCBEQVRBX0RBVEFfUFJFRklYLCBzaXplb2YoREFUQV9EQVRBX1BSRUZJWCktMSkgfHwKKyAgICAgICAgIXN0cm5jbXAocGF0aG5hbWUsIERBVEFfVVNFUl9QUkVGSVgsIHNpemVvZihEQVRBX1VTRVJfUFJFRklYKS0xKSkKKyAgICAgICAgc2V0cmVzdG9yZWNvbmxhc3QgPSBmYWxzZTsKKworICAgIGlmIChzZXRyZXN0b3JlY29ubGFzdCkgeworICAgICAgICBzaXplID0gZ2V0eGF0dHIocGF0aG5hbWUsIFJFU1RPUkVDT05fTEFTVCwgeGF0dHJfdmFsdWUsIHNpemVvZiBmY19kaWdlc3QpOworICAgICAgICBpZiAoIWZvcmNlICYmIHNpemUgPT0gc2l6ZW9mIGZjX2RpZ2VzdCAmJiBtZW1jbXAoZmNfZGlnZXN0LCB4YXR0cl92YWx1ZSwgc2l6ZW9mIGZjX2RpZ2VzdCkgPT0gMCkgeworICAgICAgICAgICAgc2VsaW51eF9sb2coU0VMSU5VWF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNFTGludXg6IFNraXBwaW5nIHJlc3RvcmVjb25fcmVjdXJzaXZlKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgZnRzID0gZnRzX29wZW4ocGF0aHMsIGZ0c2ZsYWdzLCBOVUxMKTsKKyAgICBpZiAoIWZ0cykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZXJyb3IgPSAwOworICAgIHdoaWxlICgoZnRzZW50ID0gZnRzX3JlYWQoZnRzKSkgIT0gTlVMTCkgeworICAgICAgICBzd2l0Y2ggKGZ0c2VudC0+ZnRzX2luZm8pIHsKKyAgICAgICAgY2FzZSBGVFNfREM6CisgICAgICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNFTGludXg6ICBEaXJlY3RvcnkgY3ljbGUgb24gJXMuXG4iLCBmdHNlbnQtPmZ0c19wYXRoKTsKKyAgICAgICAgICAgIGVycm5vID0gRUxPT1A7CisgICAgICAgICAgICBlcnJvciA9IC0xOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIGNhc2UgRlRTX0RQOgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRlRTX0ROUjoKKyAgICAgICAgICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU0VMaW51eDogIENvdWxkIG5vdCByZWFkICVzOiAlcy5cbiIsIGZ0c2VudC0+ZnRzX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBmdHNfc2V0KGZ0cywgZnRzZW50LCBGVFNfU0tJUCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGVFNfTlM6CisgICAgICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNFTGludXg6ICBDb3VsZCBub3Qgc3RhdCAlczogJXMuXG4iLCBmdHNlbnQtPmZ0c19wYXRoLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgZnRzX3NldChmdHMsIGZ0c2VudCwgRlRTX1NLSVApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNhc2UgRlRTX0VSUjoKKyAgICAgICAgICAgIHNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU0VMaW51eDogIEVycm9yIG9uICVzOiAlcy5cbiIsIGZ0c2VudC0+ZnRzX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBmdHNfc2V0KGZ0cywgZnRzZW50LCBGVFNfU0tJUCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBGVFNfRDoKKyAgICAgICAgICAgIGlmIChpc3N5cyAmJiAhc2VsYWJlbF9wYXJ0aWFsX21hdGNoKHNlaGFuZGxlLCBmdHNlbnQtPmZ0c19wYXRoKSkgeworICAgICAgICAgICAgICAgIGZ0c19zZXQoZnRzLCBmdHNlbnQsIEZUU19TS0lQKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGF0YWRhdGEgJiYKKyAgICAgICAgICAgICAgICAoIXN0cmNtcChmdHNlbnQtPmZ0c19wYXRoLCBEQVRBX0RBVEFfUEFUSCkgfHwKKyAgICAgICAgICAgICAgICAgIXN0cm5jbXAoZnRzZW50LT5mdHNfcGF0aCwgREFUQV9VU0VSX1BSRUZJWCwgc2l6ZW9mKERBVEFfVVNFUl9QUkVGSVgpLTEpKSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGxhYmVsIGFueXRoaW5nIGJlbG93IHRoaXMgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIGZ0c19zZXQoZnRzLCBmdHNlbnQsIEZUU19TS0lQKTsKKyAgICAgICAgICAgICAgICAvLyBidXQgZmFsbCB0aHJvdWdoIGFuZCBtYWtlIHN1cmUgd2UgbGFiZWwgdGhlIGRpcmVjdG9yeSBpdHNlbGYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJyb3IgfD0gcmVzdG9yZWNvbl9zYihmdHNlbnQtPmZ0c19wYXRoLCBmdHNlbnQtPmZ0c19zdGF0cCwgbm9jaGFuZ2UsIHZlcmJvc2UsIHNlaW5mbywgdWlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTGFiZWxpbmcgc3VjY2Vzc2Z1bC4gTWFyayB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhcyBjb21wbGV0ZWQuCisgICAgaWYgKHNldHJlc3RvcmVjb25sYXN0ICYmICFub2NoYW5nZSAmJiAhZXJyb3IpCisgICAgICAgIHNldHhhdHRyKHBhdGhuYW1lLCBSRVNUT1JFQ09OX0xBU1QsIGZjX2RpZ2VzdCwgc2l6ZW9mIGZjX2RpZ2VzdCwgMCk7CisKK291dDoKKyAgICBzdmVycm5vID0gZXJybm87CisgICAgKHZvaWQpIGZ0c19jbG9zZShmdHMpOworICAgIGVycm5vID0gc3ZlcnJubzsKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCBzZWxpbnV4X2FuZHJvaWRfcmVzdG9yZWNvbihjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgcmV0dXJuIHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uX2NvbW1vbihmaWxlLCBOVUxMLCAtMSwgZmxhZ3MpOworfQorCitpbnQgc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb25fcGtnZGlyKGNvbnN0IGNoYXIgKnBrZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgICByZXR1cm4gc2VsaW51eF9hbmRyb2lkX3Jlc3RvcmVjb25fY29tbW9uKHBrZ2Rpciwgc2VpbmZvLCB1aWQsIGZsYWdzIHwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fREFUQURBVEEpOworfQorCitzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUqIHNlbGludXhfYW5kcm9pZF9maWxlX2NvbnRleHRfaGFuZGxlKHZvaWQpCit7CisgICAgcmV0dXJuIGZpbGVfY29udGV4dF9vcGVuKCk7Cit9CisKK3ZvaWQgc2VsaW51eF9hbmRyb2lkX3NldF9zZWhhbmRsZShjb25zdCBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKmhuZGwpCit7CisgICAgc2VoYW5kbGUgPSAoc3RydWN0IHNlbGFiZWxfaGFuZGxlICopIGhuZGw7Cit9CisKK3N0YXRpYyBpbnQgc2VsaW51eF9hbmRyb2lkX2xvYWRfcG9saWN5X2hlbHBlcihib29sIHJlbG9hZCkKK3sKKwlpbnQgZmQgPSAtMSwgcmM7CisJc3RydWN0IHN0YXQgc2I7CisJdm9pZCAqbWFwID0gTlVMTDsKKworCS8qCisJICogSWYgcmVsb2FkaW5nIHBvbGljeSBhbmQgdGhlcmUgaXMgbm8gL2RhdGEgcG9saWN5IG9yCisJICogdGhhdCAvZGF0YSBwb2xpY3kgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIG9yIHRoZSAvZGF0YQorCSAqIHBvbGljeSBpcyBkaXNhYmxlZCB2aWEgc2FmZSBtb2RlLCB0aGVuIGp1c3QgcmV0dXJuLgorCSAqIFRoZXJlIGlzIG5vIHBvaW50IGluIHJlbG9hZGluZyBwb2xpY3kgZnJvbSAvIGEgc2Vjb25kIHRpbWUuCisJICovCisJaWYgKHJlbG9hZCAmJiAhc2VsaW51eF9hbmRyb2lkX3VzZV9kYXRhX3BvbGljeSgpKQorCQlyZXR1cm4gMDsKKworCWZkID0gb3BlbihzZXBvbGljeV9maWxlW3BvbGljeV9pbmRleF0sIE9fUkRPTkxZIHwgT19OT0ZPTExPVyk7CisJaWYgKGZkIDwgMCkgeworCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCAiU0VMaW51eDogIENvdWxkIG5vdCBvcGVuIHNlcG9saWN5OiAgJXNcbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoZnN0YXQoZmQsICZzYikgPCAwKSB7CisJCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICJTRUxpbnV4OiAgQ291bGQgbm90IHN0YXQgJXM6ICAlc1xuIiwKKwkJCQlzZXBvbGljeV9maWxlW3BvbGljeV9pbmRleF0sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHNiLnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpIHsKKwkJc2VsaW51eF9sb2coU0VMSU5VWF9FUlJPUiwgIlNFTGludXg6ICBDb3VsZCBub3QgbWFwICVzOiAgJXNcbiIsCisJCQlzZXBvbGljeV9maWxlW3BvbGljeV9pbmRleF0sIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJjID0gc2VjdXJpdHlfbG9hZF9wb2xpY3kobWFwLCBzYi5zdF9zaXplKTsKKwlpZiAocmMgPCAwKSB7CisJCXNlbGludXhfbG9nKFNFTElOVVhfRVJST1IsICJTRUxpbnV4OiAgQ291bGQgbm90IGxvYWQgcG9saWN5OiAgJXNcbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQltdW5tYXAobWFwLCBzYi5zdF9zaXplKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJbXVubWFwKG1hcCwgc2Iuc3Rfc2l6ZSk7CisJY2xvc2UoZmQpOworCXNlbGludXhfbG9nKFNFTElOVVhfSU5GTywgIlNFTGludXg6IExvYWRlZCBwb2xpY3kgZnJvbSAlc1xuIiwgc2Vwb2xpY3lfZmlsZVtwb2xpY3lfaW5kZXhdKTsKKworCXJldHVybiAwOworfQorCitpbnQgc2VsaW51eF9hbmRyb2lkX3JlbG9hZF9wb2xpY3kodm9pZCkKK3sKKyAgICByZXR1cm4gc2VsaW51eF9hbmRyb2lkX2xvYWRfcG9saWN5X2hlbHBlcih0cnVlKTsKK30KKworaW50IHNlbGludXhfYW5kcm9pZF9sb2FkX3BvbGljeSh2b2lkKQoreworCWNvbnN0IGNoYXIgKm1udCA9IFNFTElOVVhNTlQ7CisJaW50IHJjOworCXJjID0gbW91bnQoU0VMSU5VWEZTLCBtbnQsIFNFTElOVVhGUywgMCwgTlVMTCk7CisJaWYgKHJjIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PREVWKSB7CisJCQkvKiBTRUxpbnV4IG5vdCBlbmFibGVkIGluIGtlcm5lbCAqLworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCS8qIEZhbGwgYmFjayB0byBsZWdhY3kgbW91bnRwb2ludC4gKi8KKwkJCW1udCA9IE9MRFNFTElOVVhNTlQ7CisJCQlyYyA9IG1rZGlyKG1udCwgMDc1NSk7CisJCQlpZiAocmMgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCQkJc2VsaW51eF9sb2coU0VMSU5VWF9FUlJPUiwiU0VMaW51eDogIENvdWxkIG5vdCBta2RpcjogICVzXG4iLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXJjID0gbW91bnQoU0VMSU5VWEZTLCBtbnQsIFNFTElOVVhGUywgMCwgTlVMTCk7CisJCX0KKwl9CisJaWYgKHJjIDwgMCkgeworCQlzZWxpbnV4X2xvZyhTRUxJTlVYX0VSUk9SLCJTRUxpbnV4OiAgQ291bGQgbm90IG1vdW50IHNlbGludXhmczogICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJc2V0X3NlbGludXhtbnQobW50KTsKKworICAgIHJldHVybiBzZWxpbnV4X2FuZHJvaWRfbG9hZF9wb2xpY3lfaGVscGVyKGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2F2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2EyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2F2Yy5jCkBAIC0wLDAgKzEsMTA5MCBAQAorLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB1c2Vyc3BhY2UgYWNjZXNzIHZlY3RvciBjYWNoZSAoQVZDKS4KKyAqCisgKiBBdXRob3IgOiBFYW1vbiBXYWxzaCA8ZXdhbHNoQGVwb2NoLm5jc2MubWlsPgorICoKKyAqIERlcml2ZWQgZnJvbSB0aGUga2VybmVsIEFWQyBpbXBsZW1lbnRhdGlvbiBieQorICogU3RlcGhlbiBTbWFsbGV5IDxzZHNAZXBvY2gubmNzYy5taWw+IGFuZCAKKyAqIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPi4KKyAqLworI2luY2x1ZGUgPHNlbGludXgvYXZjLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Y19zaWR0YWIuaCIKKyNpbmNsdWRlICJhdmNfaW50ZXJuYWwuaCIKKworI2RlZmluZSBBVkNfQ0FDSEVfU0xPVFMJCTUxMgorI2RlZmluZSBBVkNfQ0FDSEVfTUFYTk9ERVMJNDEwCisKK3N0cnVjdCBhdmNfZW50cnkgeworCXNlY3VyaXR5X2lkX3Qgc3NpZDsKKwlzZWN1cml0eV9pZF90IHRzaWQ7CisJc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3M7CisJc3RydWN0IGF2X2RlY2lzaW9uIGF2ZDsKKwlzZWN1cml0eV9pZF90CWNyZWF0ZV9zaWQ7CisJaW50IHVzZWQ7CQkvKiB1c2VkIHJlY2VudGx5ICovCit9OworCitzdHJ1Y3QgYXZjX25vZGUgeworCXN0cnVjdCBhdmNfZW50cnkgYWU7CisJc3RydWN0IGF2Y19ub2RlICpuZXh0OworfTsKKworc3RydWN0IGF2Y19jYWNoZSB7CisJc3RydWN0IGF2Y19ub2RlICpzbG90c1tBVkNfQ0FDSEVfU0xPVFNdOworCXVpbnQzMl90IGxydV9oaW50OwkvKiBMUlUgaGludCBmb3IgcmVjbGFpbSBzY2FuICovCisJdWludDMyX3QgYWN0aXZlX25vZGVzOworCXVpbnQzMl90IGxhdGVzdF9ub3RpZjsJLyogbGF0ZXN0IHJldm9jYXRpb24gbm90aWZpY2F0aW9uICovCit9OworCitzdHJ1Y3QgYXZjX2NhbGxiYWNrX25vZGUgeworCWludCAoKmNhbGxiYWNrKSAodWludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwKKwkJCSBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywKKwkJCSBhY2Nlc3NfdmVjdG9yX3QgKiBvdXRfcmV0YWluZWQpOworCXVpbnQzMl90IGV2ZW50czsKKwlzZWN1cml0eV9pZF90IHNzaWQ7CisJc2VjdXJpdHlfaWRfdCB0c2lkOworCXNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzOworCWFjY2Vzc192ZWN0b3JfdCBwZXJtczsKKwlzdHJ1Y3QgYXZjX2NhbGxiYWNrX25vZGUgKm5leHQ7Cit9OworCitzdGF0aWMgdm9pZCAqYXZjX25ldGxpbmtfdGhyZWFkID0gTlVMTDsKK3N0YXRpYyB2b2lkICphdmNfbG9jayA9IE5VTEw7CitzdGF0aWMgdm9pZCAqYXZjX2xvZ19sb2NrID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYXZjX25vZGUgKmF2Y19ub2RlX2ZyZWVsaXN0ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYXZjX2NhY2hlIGF2Y19jYWNoZTsKK3N0YXRpYyBjaGFyICphdmNfYXVkaXRfYnVmID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgYXZjX2NhY2hlX3N0YXRzIGNhY2hlX3N0YXRzOworc3RhdGljIHN0cnVjdCBhdmNfY2FsbGJhY2tfbm9kZSAqYXZjX2NhbGxiYWNrcyA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNpZHRhYiBhdmNfc2lkdGFiOworCitzdGF0aWMgaW5saW5lIGludCBhdmNfaGFzaChzZWN1cml0eV9pZF90IHNzaWQsCisJCQkgICBzZWN1cml0eV9pZF90IHRzaWQsIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKQoreworCXJldHVybiAoKHVpbnRwdHJfdCkgc3NpZCBeICgodWludHB0cl90KSB0c2lkIDw8IDIpIF4gdGNsYXNzKQorCSAgICAmIChBVkNfQ0FDSEVfU0xPVFMgLSAxKTsKK30KKworaW50IGF2Y19jb250ZXh0X3RvX3NpZChjb25zdCBjaGFyICogY3R4LCBzZWN1cml0eV9pZF90ICogc2lkKQoreworCWludCByYzsKKwlhdmNfZ2V0X2xvY2soYXZjX2xvY2spOworCXJjID0gc2lkdGFiX2NvbnRleHRfdG9fc2lkKCZhdmNfc2lkdGFiLCBjdHgsIHNpZCk7CisJYXZjX3JlbGVhc2VfbG9jayhhdmNfbG9jayk7CisJcmV0dXJuIHJjOworfQorCitpbnQgYXZjX3NpZF90b19jb250ZXh0KHNlY3VyaXR5X2lkX3Qgc2lkLCBjaGFyICoqIGN0eCkKK3sKKwlpbnQgcmM7CisJKmN0eCA9IE5VTEw7CisJYXZjX2dldF9sb2NrKGF2Y19sb2NrKTsKKwkqY3R4ID0gc3RyZHVwKHNpZC0+Y3R4KTsJLyogY2FsbGVyIG11c3QgZnJlZSB2aWEgZnJlZWNvbiAqLworCXJjID0gKmN0eCA/IDAgOiAtMTsKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdmNfZ2V0X2luaXRpYWxfc2lkKGNvbnN0IGNoYXIgKiBuYW1lLCBzZWN1cml0eV9pZF90ICogc2lkKQoreworCWludCByYzsKKwljaGFyICogY29uOworCisJcmMgPSBzZWN1cml0eV9nZXRfaW5pdGlhbF9jb250ZXh0KG5hbWUsICZjb24pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlyYyA9IGF2Y19jb250ZXh0X3RvX3NpZChjb24sIHNpZCk7CisKKwlmcmVlY29uKGNvbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdmNfb3BlbihzdHJ1Y3Qgc2VsaW51eF9vcHQgKm9wdHMsIHVuc2lnbmVkIG5vcHRzKQoreworCWF2Y19zZXRlbmZvcmNlID0gMDsKKworCXdoaWxlIChub3B0cy0tKQorCQlzd2l0Y2gob3B0c1tub3B0c10udHlwZSkgeworCQljYXNlIEFWQ19PUFRfU0VURU5GT1JDRToKKwkJCWF2Y19zZXRlbmZvcmNlID0gMTsKKwkJCWF2Y19lbmZvcmNpbmcgPSAhIW9wdHNbbm9wdHNdLnZhbHVlOworCQkJYnJlYWs7CisJCX0KKworCXJldHVybiBhdmNfaW5pdCgiYXZjIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKK2ludCBhdmNfaW5pdChjb25zdCBjaGFyICpwcmVmaXgsCisJICAgICBjb25zdCBzdHJ1Y3QgYXZjX21lbW9yeV9jYWxsYmFjayAqbWVtX2NiLAorCSAgICAgY29uc3Qgc3RydWN0IGF2Y19sb2dfY2FsbGJhY2sgKmxvZ19jYiwKKwkgICAgIGNvbnN0IHN0cnVjdCBhdmNfdGhyZWFkX2NhbGxiYWNrICp0aHJlYWRfY2IsCisJICAgICBjb25zdCBzdHJ1Y3QgYXZjX2xvY2tfY2FsbGJhY2sgKmxvY2tfY2IpCit7CisJc3RydWN0IGF2Y19ub2RlICpuZXc7CisJaW50IGksIHJjID0gMDsKKworCWlmIChwcmVmaXgpCisJCXN0cm5jcHkoYXZjX3ByZWZpeCwgcHJlZml4LCBBVkNfUFJFRklYX1NJWkUgLSAxKTsKKworCXNldF9jYWxsYmFja3MobWVtX2NiLCBsb2dfY2IsIHRocmVhZF9jYiwgbG9ja19jYik7CisKKwlhdmNfbG9jayA9IGF2Y19hbGxvY19sb2NrKCk7CisJYXZjX2xvZ19sb2NrID0gYXZjX2FsbG9jX2xvY2soKTsKKworCW1lbXNldCgmY2FjaGVfc3RhdHMsIDAsIHNpemVvZihjYWNoZV9zdGF0cykpOworCisJZm9yIChpID0gMDsgaSA8IEFWQ19DQUNIRV9TTE9UUzsgaSsrKQorCQlhdmNfY2FjaGUuc2xvdHNbaV0gPSAwOworCWF2Y19jYWNoZS5scnVfaGludCA9IDA7CisJYXZjX2NhY2hlLmFjdGl2ZV9ub2RlcyA9IDA7CisJYXZjX2NhY2hlLmxhdGVzdF9ub3RpZiA9IDA7CisKKwlyYyA9IHNpZHRhYl9pbml0KCZhdmNfc2lkdGFiKTsKKwlpZiAocmMpIHsKKwkJYXZjX2xvZyhTRUxJTlVYX0VSUk9SLAorCQkJIiVzOiAgdW5hYmxlIHRvIGluaXRpYWxpemUgU0lEIHRhYmxlXG4iLAorCQkJYXZjX3ByZWZpeCk7CisJCWdvdG8gb3V0OworCX0KKworCWF2Y19hdWRpdF9idWYgPSAoY2hhciAqKWF2Y19tYWxsb2MoQVZDX0FVRElUX0JVRlNJWkUpOworCWlmICghYXZjX2F1ZGl0X2J1ZikgeworCQlhdmNfbG9nKFNFTElOVVhfRVJST1IsCisJCQkiJXM6ICB1bmFibGUgdG8gYWxsb2NhdGUgYXVkaXQgYnVmZmVyXG4iLAorCQkJYXZjX3ByZWZpeCk7CisJCXJjID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBVkNfQ0FDSEVfTUFYTk9ERVM7IGkrKykgeworCQluZXcgPSBhdmNfbWFsbG9jKHNpemVvZigqbmV3KSk7CisJCWlmICghbmV3KSB7CisJCQlhdmNfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkiJXM6ICB3YXJuaW5nOiBvbmx5IGdvdCAlZCBhdiBlbnRyaWVzXG4iLAorCQkJCWF2Y19wcmVmaXgsIGkpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtc2V0KG5ldywgMCwgc2l6ZW9mKCpuZXcpKTsKKwkJbmV3LT5uZXh0ID0gYXZjX25vZGVfZnJlZWxpc3Q7CisJCWF2Y19ub2RlX2ZyZWVsaXN0ID0gbmV3OworCX0KKworCWlmICghYXZjX3NldGVuZm9yY2UpIHsKKwkJcmMgPSBzZWN1cml0eV9nZXRlbmZvcmNlKCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWF2Y19sb2coU0VMSU5VWF9FUlJPUiwKKwkJCQkiJXM6ICBjb3VsZCBub3QgZGV0ZXJtaW5lIGVuZm9yY2luZyBtb2RlOiAlc1xuIiwKKwkJCQlhdmNfcHJlZml4LAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlhdmNfZW5mb3JjaW5nID0gcmM7CisJfQorCisJcmMgPSBhdmNfbmV0bGlua19vcGVuKDApOworCWlmIChyYyA8IDApIHsKKwkJYXZjX2xvZyhTRUxJTlVYX0VSUk9SLAorCQkJIiVzOiAgY2FuJ3Qgb3BlbiBuZXRsaW5rIHNvY2tldDogJWQgKCVzKVxuIiwKKwkJCWF2Y19wcmVmaXgsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGF2Y191c2luZ190aHJlYWRzKSB7CisJCWF2Y19uZXRsaW5rX3RocmVhZCA9IGF2Y19jcmVhdGVfdGhyZWFkKCZhdmNfbmV0bGlua19sb29wKTsKKwkJYXZjX25ldGxpbmtfdHJvdWJsZSA9IDA7CisJfQorCWF2Y19ydW5uaW5nID0gMTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgYXZjX2NhY2hlX3N0YXRzKHN0cnVjdCBhdmNfY2FjaGVfc3RhdHMgKnApCit7CisJbWVtY3B5KHAsICZjYWNoZV9zdGF0cywgc2l6ZW9mKGNhY2hlX3N0YXRzKSk7Cit9CisKK3ZvaWQgYXZjX3NpZF9zdGF0cyh2b2lkKQoreworCWF2Y19nZXRfbG9jayhhdmNfbG9nX2xvY2spOworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisJc2lkdGFiX3NpZF9zdGF0cygmYXZjX3NpZHRhYiwgYXZjX2F1ZGl0X2J1ZiwgQVZDX0FVRElUX0JVRlNJWkUpOworCWF2Y19yZWxlYXNlX2xvY2soYXZjX2xvY2spOworCWF2Y19sb2coU0VMSU5VWF9JTkZPLCAiJXMiLCBhdmNfYXVkaXRfYnVmKTsKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2dfbG9jayk7Cit9CisKK3ZvaWQgYXZjX2F2X3N0YXRzKHZvaWQpCit7CisJaW50IGksIGNoYWluX2xlbiwgbWF4X2NoYWluX2xlbiwgc2xvdHNfdXNlZDsKKwlzdHJ1Y3QgYXZjX25vZGUgKm5vZGU7CisKKwlhdmNfZ2V0X2xvY2soYXZjX2xvY2spOworCisJc2xvdHNfdXNlZCA9IDA7CisJbWF4X2NoYWluX2xlbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFWQ19DQUNIRV9TTE9UUzsgaSsrKSB7CisJCW5vZGUgPSBhdmNfY2FjaGUuc2xvdHNbaV07CisJCWlmIChub2RlKSB7CisJCQlzbG90c191c2VkKys7CisJCQljaGFpbl9sZW4gPSAwOworCQkJd2hpbGUgKG5vZGUpIHsKKwkJCQljaGFpbl9sZW4rKzsKKwkJCQlub2RlID0gbm9kZS0+bmV4dDsKKwkJCX0KKwkJCWlmIChjaGFpbl9sZW4gPiBtYXhfY2hhaW5fbGVuKQorCQkJCW1heF9jaGFpbl9sZW4gPSBjaGFpbl9sZW47CisJCX0KKwl9CisKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2NrKTsKKworCWF2Y19sb2coU0VMSU5VWF9JTkZPLCAiJXM6ICAlZCBBViBlbnRyaWVzIGFuZCAlZC8lZCBidWNrZXRzIHVzZWQsICIKKwkJImxvbmdlc3QgY2hhaW4gbGVuZ3RoICVkXG4iLCBhdmNfcHJlZml4LAorCQlhdmNfY2FjaGUuYWN0aXZlX25vZGVzLAorCQlzbG90c191c2VkLCBBVkNfQ0FDSEVfU0xPVFMsIG1heF9jaGFpbl9sZW4pOworfQorCitoaWRkZW5fZGVmKGF2Y19hdl9zdGF0cykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXZjX25vZGUgKmF2Y19yZWNsYWltX25vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgYXZjX25vZGUgKnByZXYsICpjdXI7CisJaW50IHRyeTsKKwl1aW50MzJfdCBodmFsdWU7CisKKwlodmFsdWUgPSBhdmNfY2FjaGUubHJ1X2hpbnQ7CisJZm9yICh0cnkgPSAwOyB0cnkgPCAyOyB0cnkrKykgeworCQlkbyB7CisJCQlwcmV2ID0gTlVMTDsKKwkJCWN1ciA9IGF2Y19jYWNoZS5zbG90c1todmFsdWVdOworCQkJd2hpbGUgKGN1cikgeworCQkJCWlmICghY3VyLT5hZS51c2VkKQorCQkJCQlnb3RvIGZvdW5kOworCisJCQkJY3VyLT5hZS51c2VkID0gMDsKKworCQkJCXByZXYgPSBjdXI7CisJCQkJY3VyID0gY3VyLT5uZXh0OworCQkJfQorCQkJaHZhbHVlID0gKGh2YWx1ZSArIDEpICYgKEFWQ19DQUNIRV9TTE9UUyAtIDEpOworCQl9IHdoaWxlIChodmFsdWUgIT0gYXZjX2NhY2hlLmxydV9oaW50KTsKKwl9CisKKwllcnJubyA9IEVOT01FTTsJCS8qIHRoaXMgd2FzIGEgcGFuaWMgaW4gdGhlIGtlcm5lbC4uLiAqLworCXJldHVybiBOVUxMOworCisgICAgICBmb3VuZDoKKwlhdmNfY2FjaGUubHJ1X2hpbnQgPSBodmFsdWU7CisKKwlpZiAocHJldiA9PSBOVUxMKQorCQlhdmNfY2FjaGUuc2xvdHNbaHZhbHVlXSA9IGN1ci0+bmV4dDsKKwllbHNlCisJCXByZXYtPm5leHQgPSBjdXItPm5leHQ7CisKKwlyZXR1cm4gY3VyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXZjX2NsZWFyX2F2Y19lbnRyeShzdHJ1Y3QgYXZjX2VudHJ5ICphZSkKK3sKKwltZW1zZXQoYWUsIDAsIHNpemVvZiAqYWUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdmNfbm9kZSAqYXZjX2NsYWltX25vZGUoc2VjdXJpdHlfaWRfdCBzc2lkLAorCQkJCQkgICAgICBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkJCSAgICAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKQoreworCXN0cnVjdCBhdmNfbm9kZSAqbmV3OworCWludCBodmFsdWU7CisKKwlpZiAoIWF2Y19ub2RlX2ZyZWVsaXN0KQorCQlhdmNfY2xlYW51cCgpOworCisJaWYgKGF2Y19ub2RlX2ZyZWVsaXN0KSB7CisJCW5ldyA9IGF2Y19ub2RlX2ZyZWVsaXN0OworCQlhdmNfbm9kZV9mcmVlbGlzdCA9IGF2Y19ub2RlX2ZyZWVsaXN0LT5uZXh0OworCQlhdmNfY2FjaGUuYWN0aXZlX25vZGVzKys7CisJfSBlbHNlIHsKKwkJbmV3ID0gYXZjX3JlY2xhaW1fbm9kZSgpOworCQlpZiAoIW5ldykKKwkJCWdvdG8gb3V0OworCX0KKworCWh2YWx1ZSA9IGF2Y19oYXNoKHNzaWQsIHRzaWQsIHRjbGFzcyk7CisJYXZjX2NsZWFyX2F2Y19lbnRyeSgmbmV3LT5hZSk7CisJbmV3LT5hZS51c2VkID0gMTsKKwluZXctPmFlLnNzaWQgPSBzc2lkOworCW5ldy0+YWUudHNpZCA9IHRzaWQ7CisJbmV3LT5hZS50Y2xhc3MgPSB0Y2xhc3M7CisJbmV3LT5uZXh0ID0gYXZjX2NhY2hlLnNsb3RzW2h2YWx1ZV07CisJYXZjX2NhY2hlLnNsb3RzW2h2YWx1ZV0gPSBuZXc7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gbmV3OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdmNfbm9kZSAqYXZjX3NlYXJjaF9ub2RlKHNlY3VyaXR5X2lkX3Qgc3NpZCwKKwkJCQkJICAgICAgIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJCQkJICAgICAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkJCQkgICAgICAgaW50ICpwcm9iZXMpCit7CisJc3RydWN0IGF2Y19ub2RlICpjdXI7CisJaW50IGh2YWx1ZTsKKwlpbnQgdHByb2JlcyA9IDE7CisKKwlodmFsdWUgPSBhdmNfaGFzaChzc2lkLCB0c2lkLCB0Y2xhc3MpOworCWN1ciA9IGF2Y19jYWNoZS5zbG90c1todmFsdWVdOworCXdoaWxlIChjdXIgIT0gTlVMTCAmJgorCSAgICAgICAoc3NpZCAhPSBjdXItPmFlLnNzaWQgfHwKKwkJdGNsYXNzICE9IGN1ci0+YWUudGNsYXNzIHx8IHRzaWQgIT0gY3VyLT5hZS50c2lkKSkgeworCQl0cHJvYmVzKys7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwl9CisKKwlpZiAoY3VyID09IE5VTEwpIHsKKwkJLyogY2FjaGUgbWlzcyAqLworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjYWNoZSBoaXQgKi8KKwlpZiAocHJvYmVzKQorCQkqcHJvYmVzID0gdHByb2JlczsKKworCWN1ci0+YWUudXNlZCA9IDE7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gY3VyOworfQorCisvKioKKyAqIGF2Y19sb29rdXAgLSBMb29rIHVwIGFuIEFWQyBlbnRyeS4KKyAqIEBzc2lkOiBzb3VyY2Ugc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRzaWQ6IHRhcmdldCBzZWN1cml0eSBpZGVudGlmaWVyCisgKiBAdGNsYXNzOiB0YXJnZXQgc2VjdXJpdHkgY2xhc3MKKyAqIEByZXF1ZXN0ZWQ6IHJlcXVlc3RlZCBwZXJtaXNzaW9ucywgaW50ZXJwcmV0ZWQgYmFzZWQgb24gQHRjbGFzcworICogQGFlcmVmOiAgQVZDIGVudHJ5IHJlZmVyZW5jZQorICoKKyAqIExvb2sgdXAgYW4gQVZDIGVudHJ5IHRoYXQgaXMgdmFsaWQgZm9yIHRoZQorICogQHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBiZXR3ZWVuIHRoZSBTSUQgcGFpcgorICogKEBzc2lkLCBAdHNpZCksIGludGVycHJldGluZyB0aGUgcGVybWlzc2lvbnMKKyAqIGJhc2VkIG9uIEB0Y2xhc3MuICBJZiBhIHZhbGlkIEFWQyBlbnRyeSBleGlzdHMsCisgKiB0aGVuIHRoaXMgZnVuY3Rpb24gdXBkYXRlcyBAYWVyZWYgdG8gcmVmZXIgdG8gdGhlCisgKiBlbnRyeSBhbmQgcmV0dXJucyAlMC4gIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgYXZjX2xvb2t1cChzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJICAgICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCSAgICAgIGFjY2Vzc192ZWN0b3JfdCByZXF1ZXN0ZWQsIHN0cnVjdCBhdmNfZW50cnlfcmVmICphZXJlZikKK3sKKwlzdHJ1Y3QgYXZjX25vZGUgKm5vZGU7CisJaW50IHByb2JlcywgcmMgPSAwOworCisJYXZjX2NhY2hlX3N0YXRzX2luY3IoY2F2X2xvb2t1cHMpOworCW5vZGUgPSBhdmNfc2VhcmNoX25vZGUoc3NpZCwgdHNpZCwgdGNsYXNzLCAmcHJvYmVzKTsKKworCWlmIChub2RlICYmICgobm9kZS0+YWUuYXZkLmRlY2lkZWQgJiByZXF1ZXN0ZWQpID09IHJlcXVlc3RlZCkpIHsKKwkJYXZjX2NhY2hlX3N0YXRzX2luY3IoY2F2X2hpdHMpOworCQlhdmNfY2FjaGVfc3RhdHNfYWRkKGNhdl9wcm9iZXMsIHByb2Jlcyk7CisJCWFlcmVmLT5hZSA9ICZub2RlLT5hZTsKKwkJZ290byBvdXQ7CisJfQorCisJYXZjX2NhY2hlX3N0YXRzX2luY3IoY2F2X21pc3Nlcyk7CisJcmMgPSAtMTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogYXZjX2luc2VydCAtIEluc2VydCBhbiBBVkMgZW50cnkuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllcgorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAYWU6IEFWQyBlbnRyeQorICogQGFlcmVmOiAgQVZDIGVudHJ5IHJlZmVyZW5jZQorICoKKyAqIEluc2VydCBhbiBBVkMgZW50cnkgZm9yIHRoZSBTSUQgcGFpcgorICogKEBzc2lkLCBAdHNpZCkgYW5kIGNsYXNzIEB0Y2xhc3MuCisgKiBUaGUgYWNjZXNzIHZlY3RvcnMgYW5kIHRoZSBzZXF1ZW5jZSBudW1iZXIgYXJlCisgKiBub3JtYWxseSBwcm92aWRlZCBieSB0aGUgc2VjdXJpdHkgc2VydmVyIGluCisgKiByZXNwb25zZSB0byBhIHNlY3VyaXR5X2NvbXB1dGVfYXYoKSBjYWxsLiAgSWYgdGhlCisgKiBzZXF1ZW5jZSBudW1iZXIgQGFlLT5hdmQuc2Vxbm8gaXMgbm90IGxlc3MgdGhhbiB0aGUgbGF0ZXN0CisgKiByZXZvY2F0aW9uIG5vdGlmaWNhdGlvbiwgdGhlbiB0aGUgZnVuY3Rpb24gY29waWVzCisgKiB0aGUgYWNjZXNzIHZlY3RvcnMgaW50byBhIGNhY2hlIGVudHJ5LCB1cGRhdGVzCisgKiBAYWVyZWYgdG8gcmVmZXIgdG8gdGhlIGVudHJ5LCBhbmQgcmV0dXJucyAlMC4KKyAqIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0lMSB3aXRoIEBlcnJubyBzZXQgdG8gJUVBR0FJTi4KKyAqLworc3RhdGljIGludCBhdmNfaW5zZXJ0KHNlY3VyaXR5X2lkX3Qgc3NpZCwgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgICAgICBzZWN1cml0eV9jbGFzc190IHRjbGFzcywKKwkJICAgICAgc3RydWN0IGF2Y19lbnRyeSAqYWUsIHN0cnVjdCBhdmNfZW50cnlfcmVmICphZXJlZikKK3sKKwlzdHJ1Y3QgYXZjX25vZGUgKm5vZGU7CisJaW50IHJjID0gMDsKKworCWlmIChhZS0+YXZkLnNlcW5vIDwgYXZjX2NhY2hlLmxhdGVzdF9ub3RpZikgeworCQlhdmNfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCSIlczogIHNlcW5vICVkIDwgbGF0ZXN0X25vdGlmICVkXG4iLCBhdmNfcHJlZml4LAorCQkJYWUtPmF2ZC5zZXFubywgYXZjX2NhY2hlLmxhdGVzdF9ub3RpZik7CisJCWVycm5vID0gRUFHQUlOOworCQlyYyA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlub2RlID0gYXZjX2NsYWltX25vZGUoc3NpZCwgdHNpZCwgdGNsYXNzKTsKKwlpZiAoIW5vZGUpIHsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KCZub2RlLT5hZS5hdmQsICZhZS0+YXZkLCBzaXplb2YgYWUtPmF2ZCk7CisJYWVyZWYtPmFlID0gJm5vZGUtPmFlOworICAgICAgb3V0OgorCXJldHVybiByYzsKK30KKwordm9pZCBhdmNfY2xlYW51cCh2b2lkKQoreworfQorCitoaWRkZW5fZGVmKGF2Y19jbGVhbnVwKQorCitpbnQgYXZjX3Jlc2V0KHZvaWQpCit7CisJc3RydWN0IGF2Y19jYWxsYmFja19ub2RlICpjOworCWludCBpLCByZXQsIHJjID0gMCwgZXJyc2F2ZSA9IDA7CisJc3RydWN0IGF2Y19ub2RlICpub2RlLCAqdG1wOworCWVycm5vID0gMDsKKworCWlmICghYXZjX3J1bm5pbmcpCisJCXJldHVybiAwOworCisJYXZjX2dldF9sb2NrKGF2Y19sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBBVkNfQ0FDSEVfU0xPVFM7IGkrKykgeworCQlub2RlID0gYXZjX2NhY2hlLnNsb3RzW2ldOworCQl3aGlsZSAobm9kZSkgeworCQkJdG1wID0gbm9kZTsKKwkJCW5vZGUgPSBub2RlLT5uZXh0OworCQkJYXZjX2NsZWFyX2F2Y19lbnRyeSgmdG1wLT5hZSk7CisJCQl0bXAtPm5leHQgPSBhdmNfbm9kZV9mcmVlbGlzdDsKKwkJCWF2Y19ub2RlX2ZyZWVsaXN0ID0gdG1wOworCQkJYXZjX2NhY2hlLmFjdGl2ZV9ub2Rlcy0tOworCQl9CisJCWF2Y19jYWNoZS5zbG90c1tpXSA9IDA7CisJfQorCWF2Y19jYWNoZS5scnVfaGludCA9IDA7CisKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2NrKTsKKworCW1lbXNldCgmY2FjaGVfc3RhdHMsIDAsIHNpemVvZihjYWNoZV9zdGF0cykpOworCisJZm9yIChjID0gYXZjX2NhbGxiYWNrczsgYzsgYyA9IGMtPm5leHQpIHsKKwkJaWYgKGMtPmV2ZW50cyAmIEFWQ19DQUxMQkFDS19SRVNFVCkgeworCQkJcmV0ID0gYy0+Y2FsbGJhY2soQVZDX0NBTExCQUNLX1JFU0VULCAwLCAwLCAwLCAwLCAwKTsKKwkJCWlmIChyZXQgJiYgIXJjKSB7CisJCQkJcmMgPSByZXQ7CisJCQkJZXJyc2F2ZSA9IGVycm5vOworCQkJfQorCQl9CisJfQorCWVycm5vID0gZXJyc2F2ZTsKKwlyZXR1cm4gcmM7Cit9CisKK2hpZGRlbl9kZWYoYXZjX3Jlc2V0KQorCit2b2lkIGF2Y19kZXN0cm95KHZvaWQpCit7CisJc3RydWN0IGF2Y19jYWxsYmFja19ub2RlICpjOworCXN0cnVjdCBhdmNfbm9kZSAqbm9kZSwgKnRtcDsKKwlpbnQgaTsKKworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisKKwlpZiAoYXZjX3VzaW5nX3RocmVhZHMpCisJCWF2Y19zdG9wX3RocmVhZChhdmNfbmV0bGlua190aHJlYWQpOworCWF2Y19uZXRsaW5rX2Nsb3NlKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVZDX0NBQ0hFX1NMT1RTOyBpKyspIHsKKwkJbm9kZSA9IGF2Y19jYWNoZS5zbG90c1tpXTsKKwkJd2hpbGUgKG5vZGUpIHsKKwkJCXRtcCA9IG5vZGU7CisJCQlub2RlID0gbm9kZS0+bmV4dDsKKwkJCWF2Y19mcmVlKHRtcCk7CisJCX0KKwl9CisJd2hpbGUgKGF2Y19ub2RlX2ZyZWVsaXN0KSB7CisJCXRtcCA9IGF2Y19ub2RlX2ZyZWVsaXN0OworCQlhdmNfbm9kZV9mcmVlbGlzdCA9IHRtcC0+bmV4dDsKKwkJYXZjX2ZyZWUodG1wKTsKKwl9CisJYXZjX3JlbGVhc2VfbG9jayhhdmNfbG9jayk7CisKKwl3aGlsZSAoYXZjX2NhbGxiYWNrcykgeworCQljID0gYXZjX2NhbGxiYWNrczsKKwkJYXZjX2NhbGxiYWNrcyA9IGMtPm5leHQ7CisJCWF2Y19mcmVlKGMpOworCX0KKwlzaWR0YWJfZGVzdHJveSgmYXZjX3NpZHRhYik7CisJYXZjX2ZyZWVfbG9jayhhdmNfbG9jayk7CisJYXZjX2ZyZWVfbG9jayhhdmNfbG9nX2xvY2spOworCWF2Y19mcmVlKGF2Y19hdWRpdF9idWYpOworCWF2Y19ydW5uaW5nID0gMDsKK30KKworLyogcmF0ZWxpbWl0IHN0dWZmIHB1dCBhc2lkZSBmb3Igbm93IC0tRUZXICovCisjaWYgMAorLyoKKyAqIENvcGllZCBmcm9tIG5ldC9jb3JlL3V0aWxzLmM6bmV0X3JhdGVsaW1pdCBhbmQgbW9kaWZpZWQgZm9yCisgKiB1c2UgYnkgdGhlIEFWQyBhdWRpdCBmYWNpbGl0eS4KKyAqLworI2RlZmluZSBBVkNfTVNHX0NPU1QJNSpIWgorI2RlZmluZSBBVkNfTVNHX0JVUlNUCTEwKjUqSFoKKworLyoKKyAqIFRoaXMgZW5mb3JjZXMgYSByYXRlIGxpbWl0OiBub3QgbW9yZSB0aGFuIG9uZSBrZXJuZWwgbWVzc2FnZQorICogZXZlcnkgNXNlY3MgdG8gbWFrZSBhIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFjayBpbXBvc3NpYmxlLgorICovCitzdGF0aWMgaW50IGF2Y19yYXRlbGltaXQodm9pZCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyB0b2tzID0gMTAgKiA1ICogSFo7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9tc2c7CisJc3RhdGljIGludCBtaXNzZWQsIHJjID0gMDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJdm9pZCAqcmF0ZWxpbWl0X2xvY2sgPSBhdmNfYWxsb2NfbG9jaygpOworCisJYXZjX2dldF9sb2NrKHJhdGVsaW1pdF9sb2NrKTsKKwl0b2tzICs9IG5vdyAtIGxhc3RfbXNnOworCWxhc3RfbXNnID0gbm93OworCWlmICh0b2tzID4gQVZDX01TR19CVVJTVCkKKwkJdG9rcyA9IEFWQ19NU0dfQlVSU1Q7CisJaWYgKHRva3MgPj0gQVZDX01TR19DT1NUKSB7CisJCWludCBsb3N0ID0gbWlzc2VkOworCQltaXNzZWQgPSAwOworCQl0b2tzIC09IEFWQ19NU0dfQ09TVDsKKwkJYXZjX3JlbGVhc2VfbG9jayhyYXRlbGltaXRfbG9jayk7CisJCWlmIChsb3N0KSB7CisJCQlhdmNfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkiJXM6ICAlZCBtZXNzYWdlcyBzdXBwcmVzc2VkLlxuIiwgYXZjX3ByZWZpeCwKKwkJCQlsb3N0KTsKKwkJfQorCQlyYyA9IDE7CisJCWdvdG8gb3V0OworCX0KKwltaXNzZWQrKzsKKwlhdmNfcmVsZWFzZV9sb2NrKHJhdGVsaW1pdF9sb2NrKTsKKyAgICAgIG91dDoKKwlhdmNfZnJlZV9sb2NrKHJhdGVsaW1pdF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2F2Y19yYXRlbGltaXQodm9pZCkKK3sKKwlpZiAoYXZjX2VuZm9yY2luZykKKwkJcmV0dXJuIGF2Y19yYXRlbGltaXQoKTsKKwllbHNlIHsKKwkJLyogSWYgcGVybWlzc2l2ZSwgdGhlbiBuZXZlciBzdXBwcmVzcyBtZXNzYWdlcy4gKi8KKwkJcmV0dXJuIDE7CisJfQorfQorI2VuZGlmCQkJCS8qIHJhdGVsaW1pdCBzdHVmZiAqLworCisvKioKKyAqIGF2Y19kdW1wX2F2IC0gRGlzcGxheSBhbiBhY2Nlc3MgdmVjdG9yIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgKiBAdGNsYXNzOiB0YXJnZXQgc2VjdXJpdHkgY2xhc3MKKyAqIEBhdjogYWNjZXNzIHZlY3RvcgorICovCitzdGF0aWMgdm9pZCBhdmNfZHVtcF9hdihzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IGF2KQoreworCWNvbnN0IGNoYXIgKnBlcm1zdHI7CisJYWNjZXNzX3ZlY3Rvcl90IGJpdCA9IDE7CisKKwlpZiAoYXYgPT0gMCkgeworCQlsb2dfYXBwZW5kKGF2Y19hdWRpdF9idWYsICIgbnVsbCIpOworCQlyZXR1cm47CisJfQorCisJbG9nX2FwcGVuZChhdmNfYXVkaXRfYnVmLCAiIHsiKTsKKworCXdoaWxlIChhdikgeworCQlpZiAoYXYgJiBiaXQpIHsKKwkJCXBlcm1zdHIgPSBzZWN1cml0eV9hdl9wZXJtX3RvX3N0cmluZyh0Y2xhc3MsIGJpdCk7CisJCQlpZiAoIXBlcm1zdHIpCisJCQkJYnJlYWs7CisJCQlsb2dfYXBwZW5kKGF2Y19hdWRpdF9idWYsICIgJXMiLCBwZXJtc3RyKTsKKwkJCWF2ICY9IH5iaXQ7CisJCX0KKwkJYml0IDw8PSAxOworCX0KKworCWlmIChhdikKKwkJbG9nX2FwcGVuZChhdmNfYXVkaXRfYnVmLCAiIDB4JXgiLCBhdik7CisJbG9nX2FwcGVuZChhdmNfYXVkaXRfYnVmLCAiIH0iKTsKK30KKworLyoqCisgKiBhdmNfZHVtcF9xdWVyeSAtIERpc3BsYXkgYSBTSUQgcGFpciBhbmQgYSBjbGFzcyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICogQHNzaWQ6IHNvdXJjZSBzZWN1cml0eSBpZGVudGlmaWVyCisgKiBAdHNpZDogdGFyZ2V0IHNlY3VyaXR5IGlkZW50aWZpZXIKKyAqIEB0Y2xhc3M6IHRhcmdldCBzZWN1cml0eSBjbGFzcworICovCitzdGF0aWMgdm9pZCBhdmNfZHVtcF9xdWVyeShzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJCSAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKQoreworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisKKwlsb2dfYXBwZW5kKGF2Y19hdWRpdF9idWYsICJzY29udGV4dD0lcyB0Y29udGV4dD0lcyIsCisJCSAgIHNzaWQtPmN0eCwgdHNpZC0+Y3R4KTsKKworCWF2Y19yZWxlYXNlX2xvY2soYXZjX2xvY2spOworCWxvZ19hcHBlbmQoYXZjX2F1ZGl0X2J1ZiwgIiB0Y2xhc3M9JXMiLAorCQkgICBzZWN1cml0eV9jbGFzc190b19zdHJpbmcodGNsYXNzKSk7Cit9CisKK3ZvaWQgYXZjX2F1ZGl0KHNlY3VyaXR5X2lkX3Qgc3NpZCwgc2VjdXJpdHlfaWRfdCB0c2lkLAorCSAgICAgICBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHJlcXVlc3RlZCwKKwkgICAgICAgc3RydWN0IGF2X2RlY2lzaW9uICphdmQsIGludCByZXN1bHQsIHZvaWQgKmEpCit7CisJYWNjZXNzX3ZlY3Rvcl90IGRlbmllZCwgYXVkaXRlZDsKKworCWRlbmllZCA9IHJlcXVlc3RlZCAmIH5hdmQtPmFsbG93ZWQ7CisJaWYgKGRlbmllZCkKKwkJYXVkaXRlZCA9IGRlbmllZCAmIGF2ZC0+YXVkaXRkZW55OworCWVsc2UgaWYgKCFyZXF1ZXN0ZWQgfHwgcmVzdWx0KQorCQlhdWRpdGVkID0gZGVuaWVkID0gcmVxdWVzdGVkOworCWVsc2UKKwkJYXVkaXRlZCA9IHJlcXVlc3RlZCAmIGF2ZC0+YXVkaXRhbGxvdzsKKwlpZiAoIWF1ZGl0ZWQpCisJCXJldHVybjsKKyNpZiAwCisJaWYgKCFjaGVja19hdmNfcmF0ZWxpbWl0KCkpCisJCXJldHVybjsKKyNlbmRpZgorCS8qIHByZXZlbnQgb3ZlcmxhcHBpbmcgYnVmZmVyIHdyaXRlcyAqLworCWF2Y19nZXRfbG9jayhhdmNfbG9nX2xvY2spOworCXNucHJpbnRmKGF2Y19hdWRpdF9idWYsIEFWQ19BVURJVF9CVUZTSVpFLAorCQkgIiVzOiAgJXMgIiwgYXZjX3ByZWZpeCwgKGRlbmllZCB8fCAhcmVxdWVzdGVkKSA/ICJkZW5pZWQiIDogImdyYW50ZWQiKTsKKwlhdmNfZHVtcF9hdih0Y2xhc3MsIGF1ZGl0ZWQpOworCWxvZ19hcHBlbmQoYXZjX2F1ZGl0X2J1ZiwgIiBmb3IgIik7CisKKwkvKiBnZXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIHByaW50ZWQgYnkgdGhlIGNhbGxiYWNrICovCisJYXZjX3N1cHBsX2F1ZGl0KGEsIHRjbGFzcywgYXZjX2F1ZGl0X2J1ZiArIHN0cmxlbihhdmNfYXVkaXRfYnVmKSwKKwkJCUFWQ19BVURJVF9CVUZTSVpFIC0gc3RybGVuKGF2Y19hdWRpdF9idWYpKTsKKworCWxvZ19hcHBlbmQoYXZjX2F1ZGl0X2J1ZiwgIiAiKTsKKwlhdmNfZHVtcF9xdWVyeShzc2lkLCB0c2lkLCB0Y2xhc3MpOworCWxvZ19hcHBlbmQoYXZjX2F1ZGl0X2J1ZiwgIlxuIik7CisJYXZjX2xvZyhTRUxJTlVYX0FWQywgIiVzIiwgYXZjX2F1ZGl0X2J1Zik7CisKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2dfbG9jayk7Cit9CisKK2hpZGRlbl9kZWYoYXZjX2F1ZGl0KQorCitpbnQgYXZjX2hhc19wZXJtX25vYXVkaXQoc2VjdXJpdHlfaWRfdCBzc2lkLAorCQkJIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJCSBzZWN1cml0eV9jbGFzc190IHRjbGFzcywKKwkJCSBhY2Nlc3NfdmVjdG9yX3QgcmVxdWVzdGVkLAorCQkJIHN0cnVjdCBhdmNfZW50cnlfcmVmICphZXJlZiwgc3RydWN0IGF2X2RlY2lzaW9uICphdmQpCit7CisJc3RydWN0IGF2Y19lbnRyeSAqYWU7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYXZjX2VudHJ5IGVudHJ5OworCWFjY2Vzc192ZWN0b3JfdCBkZW5pZWQ7CisJc3RydWN0IGF2Y19lbnRyeV9yZWYgcmVmOworCisJaWYgKCFhdmNfdXNpbmdfdGhyZWFkcyAmJiAhYXZjX2FwcF9tYWluX2xvb3ApIHsKKwkJKHZvaWQpYXZjX25ldGxpbmtfY2hlY2tfbmIoKTsKKwl9CisKKwlpZiAoIWFlcmVmKSB7CisJCWF2Y19lbnRyeV9yZWZfaW5pdCgmcmVmKTsKKwkJYWVyZWYgPSAmcmVmOworCX0KKworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisJYXZjX2NhY2hlX3N0YXRzX2luY3IoZW50cnlfbG9va3Vwcyk7CisJYWUgPSBhZXJlZi0+YWU7CisJaWYgKGFlKSB7CisJCWlmIChhZS0+c3NpZCA9PSBzc2lkICYmCisJCSAgICBhZS0+dHNpZCA9PSB0c2lkICYmCisJCSAgICBhZS0+dGNsYXNzID09IHRjbGFzcyAmJgorCQkgICAgKChhZS0+YXZkLmRlY2lkZWQgJiByZXF1ZXN0ZWQpID09IHJlcXVlc3RlZCkpIHsKKwkJCWF2Y19jYWNoZV9zdGF0c19pbmNyKGVudHJ5X2hpdHMpOworCQkJYWUtPnVzZWQgPSAxOworCQl9IGVsc2UgeworCQkJYXZjX2NhY2hlX3N0YXRzX2luY3IoZW50cnlfZGlzY2FyZHMpOworCQkJYWUgPSAwOworCQl9CisJfQorCisJaWYgKCFhZSkgeworCQlhdmNfY2FjaGVfc3RhdHNfaW5jcihlbnRyeV9taXNzZXMpOworCQlyYyA9IGF2Y19sb29rdXAoc3NpZCwgdHNpZCwgdGNsYXNzLCByZXF1ZXN0ZWQsIGFlcmVmKTsKKwkJaWYgKHJjKSB7CisJCQlyYyA9IHNlY3VyaXR5X2NvbXB1dGVfYXYoc3NpZC0+Y3R4LCB0c2lkLT5jdHgsCisJCQkJCQkgdGNsYXNzLCByZXF1ZXN0ZWQsCisJCQkJCQkgJmVudHJ5LmF2ZCk7CisJCQlpZiAocmMpCisJCQkJZ290byBvdXQ7CisJCQlyYyA9IGF2Y19pbnNlcnQoc3NpZCwgdHNpZCwgdGNsYXNzLCAmZW50cnksIGFlcmVmKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlhZSA9IGFlcmVmLT5hZTsKKwl9CisKKwlpZiAoYXZkKQorCQltZW1jcHkoYXZkLCAmYWUtPmF2ZCwgc2l6ZW9mKCphdmQpKTsKKworCWRlbmllZCA9IHJlcXVlc3RlZCAmIH4oYWUtPmF2ZC5hbGxvd2VkKTsKKworCWlmICghcmVxdWVzdGVkIHx8IGRlbmllZCkgeworCQlpZiAoIWF2Y19lbmZvcmNpbmcgfHwKKwkJICAgIChhZS0+YXZkLmZsYWdzICYgU0VMSU5VWF9BVkRfRkxBR1NfUEVSTUlTU0lWRSkpCisJCQlhZS0+YXZkLmFsbG93ZWQgfD0gcmVxdWVzdGVkOworCQllbHNlIHsKKwkJCWVycm5vID0gRUFDQ0VTOworCQkJcmMgPSAtMTsKKwkJfQorCX0KKworICAgICAgb3V0OgorCWF2Y19yZWxlYXNlX2xvY2soYXZjX2xvY2spOworCXJldHVybiByYzsKK30KKworaGlkZGVuX2RlZihhdmNfaGFzX3Blcm1fbm9hdWRpdCkKKworaW50IGF2Y19oYXNfcGVybShzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcmVxdWVzdGVkLAorCQkgc3RydWN0IGF2Y19lbnRyeV9yZWYgKmFlcmVmLCB2b2lkICphdWRpdGRhdGEpCit7CisJc3RydWN0IGF2X2RlY2lzaW9uIGF2ZDsKKwlpbnQgZXJyc2F2ZSwgcmM7CisKKwltZW1zZXQoJmF2ZCwgMCwgc2l6ZW9mKGF2ZCkpOworCisJcmMgPSBhdmNfaGFzX3Blcm1fbm9hdWRpdChzc2lkLCB0c2lkLCB0Y2xhc3MsIHJlcXVlc3RlZCwgYWVyZWYsICZhdmQpOworCWVycnNhdmUgPSBlcnJubzsKKwlhdmNfYXVkaXQoc3NpZCwgdHNpZCwgdGNsYXNzLCByZXF1ZXN0ZWQsICZhdmQsIHJjLCBhdWRpdGRhdGEpOworCWVycm5vID0gZXJyc2F2ZTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdmNfY29tcHV0ZV9jcmVhdGUoc2VjdXJpdHlfaWRfdCBzc2lkLCAgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgICAgICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsIHNlY3VyaXR5X2lkX3QgKm5ld3NpZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IGF2Y19lbnRyeV9yZWYgYWVyZWY7CisJc3RydWN0IGF2Y19lbnRyeSBlbnRyeTsKKwljaGFyICogY3R4OworCisJKm5ld3NpZCA9IE5VTEw7CisJYXZjX2VudHJ5X3JlZl9pbml0KCZhZXJlZik7CisKKwlhdmNfZ2V0X2xvY2soYXZjX2xvY2spOworCisJLyogY2hlY2sgZm9yIGEgY2FjaGVkIGVudHJ5ICovCisJcmMgPSBhdmNfbG9va3VwKHNzaWQsIHRzaWQsIHRjbGFzcywgMCwgJmFlcmVmKTsKKwlpZiAocmMpIHsKKwkJLyogbmVlZCB0byBtYWtlIGEgY2FjaGUgZW50cnkgZm9yIHRoaXMgdHVwbGUgKi8KKwkJcmMgPSBzZWN1cml0eV9jb21wdXRlX2F2KHNzaWQtPmN0eCwgdHNpZC0+Y3R4LAorCQkJCQkgdGNsYXNzLCAwLCAmZW50cnkuYXZkKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJCXJjID0gYXZjX2luc2VydChzc2lkLCB0c2lkLCB0Y2xhc3MsICZlbnRyeSwgJmFlcmVmKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogY2hlY2sgZm9yIGEgc2F2ZWQgY29tcHV0ZV9jcmVhdGUgdmFsdWUgKi8KKwlpZiAoIWFlcmVmLmFlLT5jcmVhdGVfc2lkKSB7CisJCS8qIG5lZWQgdG8gcXVlcnkgdGhlIGtlcm5lbCBwb2xpY3kgKi8KKwkJcmMgPSBzZWN1cml0eV9jb21wdXRlX2NyZWF0ZShzc2lkLT5jdHgsIHRzaWQtPmN0eCwgdGNsYXNzLAorCQkJCQkJICZjdHgpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKwkJcmMgPSBzaWR0YWJfY29udGV4dF90b19zaWQoJmF2Y19zaWR0YWIsIGN0eCwgbmV3c2lkKTsKKwkJZnJlZWNvbihjdHgpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKworCQlhZXJlZi5hZS0+Y3JlYXRlX3NpZCA9ICpuZXdzaWQ7CisJfSBlbHNlIHsKKwkJLyogZm91bmQgc2F2ZWQgdmFsdWUgKi8KKwkJKm5ld3NpZCA9IGFlcmVmLmFlLT5jcmVhdGVfc2lkOworCX0KKworCXJjID0gMDsKK291dDoKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBhdmNfYWRkX2NhbGxiYWNrKGludCAoKmNhbGxiYWNrKSAodWludDMyX3QgZXZlbnQsIHNlY3VyaXR5X2lkX3Qgc3NpZCwKKwkJCQkgICAgICBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkJICAgICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQkJICAgICAgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zLAorCQkJCSAgICAgIGFjY2Vzc192ZWN0b3JfdCAqIG91dF9yZXRhaW5lZCksCisJCSAgICAgdWludDMyX3QgZXZlbnRzLCBzZWN1cml0eV9pZF90IHNzaWQsCisJCSAgICAgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgICAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMpCit7CisJc3RydWN0IGF2Y19jYWxsYmFja19ub2RlICpjOworCWludCByYyA9IDA7CisKKwljID0gYXZjX21hbGxvYyhzaXplb2YoKmMpKTsKKwlpZiAoIWMpIHsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJYy0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwljLT5ldmVudHMgPSBldmVudHM7CisJYy0+c3NpZCA9IHNzaWQ7CisJYy0+dHNpZCA9IHRzaWQ7CisJYy0+dGNsYXNzID0gdGNsYXNzOworCWMtPnBlcm1zID0gcGVybXM7CisJYy0+bmV4dCA9IGF2Y19jYWxsYmFja3M7CisJYXZjX2NhbGxiYWNrcyA9IGM7CisgICAgICBvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdmNfc2lkY21wKHNlY3VyaXR5X2lkX3QgeCwgc2VjdXJpdHlfaWRfdCB5KQoreworCXJldHVybiAoeCA9PSB5IHx8IHggPT0gU0VDU0lEX1dJTEQgfHwgeSA9PSBTRUNTSURfV0lMRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdmNfdXBkYXRlX25vZGUodWludDMyX3QgZXZlbnQsIHN0cnVjdCBhdmNfbm9kZSAqbm9kZSwKKwkJCQkgICBhY2Nlc3NfdmVjdG9yX3QgcGVybXMpCit7CisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQVZDX0NBTExCQUNLX0dSQU5UOgorCQlub2RlLT5hZS5hdmQuYWxsb3dlZCB8PSBwZXJtczsKKwkJYnJlYWs7CisJY2FzZSBBVkNfQ0FMTEJBQ0tfVFJZX1JFVk9LRToKKwljYXNlIEFWQ19DQUxMQkFDS19SRVZPS0U6CisJCW5vZGUtPmFlLmF2ZC5hbGxvd2VkICY9IH5wZXJtczsKKwkJYnJlYWs7CisJY2FzZSBBVkNfQ0FMTEJBQ0tfQVVESVRBTExPV19FTkFCTEU6CisJCW5vZGUtPmFlLmF2ZC5hdWRpdGFsbG93IHw9IHBlcm1zOworCQlicmVhazsKKwljYXNlIEFWQ19DQUxMQkFDS19BVURJVEFMTE9XX0RJU0FCTEU6CisJCW5vZGUtPmFlLmF2ZC5hdWRpdGFsbG93ICY9IH5wZXJtczsKKwkJYnJlYWs7CisJY2FzZSBBVkNfQ0FMTEJBQ0tfQVVESVRERU5ZX0VOQUJMRToKKwkJbm9kZS0+YWUuYXZkLmF1ZGl0ZGVueSB8PSBwZXJtczsKKwkJYnJlYWs7CisJY2FzZSBBVkNfQ0FMTEJBQ0tfQVVESVRERU5ZX0RJU0FCTEU6CisJCW5vZGUtPmFlLmF2ZC5hdWRpdGRlbnkgJj0gfnBlcm1zOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXZjX3VwZGF0ZV9jYWNoZSh1aW50MzJfdCBldmVudCwgc2VjdXJpdHlfaWRfdCBzc2lkLAorCQkJICAgIHNlY3VyaXR5X2lkX3QgdHNpZCwgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQkgICAgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zKQoreworCXN0cnVjdCBhdmNfbm9kZSAqbm9kZTsKKwlpbnQgaTsKKworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisKKwlpZiAoc3NpZCA9PSBTRUNTSURfV0lMRCB8fCB0c2lkID09IFNFQ1NJRF9XSUxEKSB7CisJCS8qIGFwcGx5IHRvIGFsbCBtYXRjaGluZyBub2RlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVZDX0NBQ0hFX1NMT1RTOyBpKyspIHsKKwkJCWZvciAobm9kZSA9IGF2Y19jYWNoZS5zbG90c1tpXTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKwkJCQlpZiAoYXZjX3NpZGNtcChzc2lkLCBub2RlLT5hZS5zc2lkKSAmJgorCQkJCSAgICBhdmNfc2lkY21wKHRzaWQsIG5vZGUtPmFlLnRzaWQpICYmCisJCQkJICAgIHRjbGFzcyA9PSBub2RlLT5hZS50Y2xhc3MpIHsKKwkJCQkJYXZjX3VwZGF0ZV9ub2RlKGV2ZW50LCBub2RlLCBwZXJtcyk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogYXBwbHkgdG8gb25lIG5vZGUgKi8KKwkJbm9kZSA9IGF2Y19zZWFyY2hfbm9kZShzc2lkLCB0c2lkLCB0Y2xhc3MsIDApOworCQlpZiAobm9kZSkgeworCQkJYXZjX3VwZGF0ZV9ub2RlKGV2ZW50LCBub2RlLCBwZXJtcyk7CisJCX0KKwl9CisKKwlhdmNfcmVsZWFzZV9sb2NrKGF2Y19sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBhdmNfY29udHJvbCAtIHVwZGF0ZSBjYWNoZSBhbmQgY2FsbCBjYWxsYmFja3MKKyAqCisgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5OyB1c2UgdGhlIGluZGl2aWR1YWwgZXZlbnQKKyAqIGZ1bmN0aW9ucyBpbnN0ZWFkLgorICovCitzdGF0aWMgaW50IGF2Y19jb250cm9sKHVpbnQzMl90IGV2ZW50LCBzZWN1cml0eV9pZF90IHNzaWQsCisJCSAgICAgICBzZWN1cml0eV9pZF90IHRzaWQsIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkgICAgICAgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zLAorCQkgICAgICAgdWludDMyX3Qgc2Vxbm8sIGFjY2Vzc192ZWN0b3JfdCAqIG91dF9yZXRhaW5lZCkKK3sKKwlzdHJ1Y3QgYXZjX2NhbGxiYWNrX25vZGUgKmM7CisJYWNjZXNzX3ZlY3Rvcl90IHRyZXRhaW5lZCA9IDAsIGNyZXRhaW5lZCA9IDA7CisJaW50IHJldCwgcmMgPSAwLCBlcnJzYXZlID0gMDsKKwllcnJubyA9IDA7CisKKwkvKgorCSAqIHRyeV9yZXZva2Ugb25seSByZW1vdmVzIHBlcm1pc3Npb25zIGZyb20gdGhlIGNhY2hlCisJICogc3RhdGUgaWYgdGhleSBhcmUgbm90IHJldGFpbmVkIGJ5IHRoZSBvYmplY3QgbWFuYWdlci4KKwkgKiBIZW5jZSwgdHJ5X3Jldm9rZSBtdXN0IHdhaXQgdW50aWwgYWZ0ZXIgdGhlIGNhbGxiYWNrcyBoYXZlCisJICogYmVlbiBpbnZva2VkIHRvIHVwZGF0ZSB0aGUgY2FjaGUgc3RhdGUuCisJICovCisJaWYgKGV2ZW50ICE9IEFWQ19DQUxMQkFDS19UUllfUkVWT0tFKQorCQlhdmNfdXBkYXRlX2NhY2hlKGV2ZW50LCBzc2lkLCB0c2lkLCB0Y2xhc3MsIHBlcm1zKTsKKworCWZvciAoYyA9IGF2Y19jYWxsYmFja3M7IGM7IGMgPSBjLT5uZXh0KSB7CisJCWlmICgoYy0+ZXZlbnRzICYgZXZlbnQpICYmCisJCSAgICBhdmNfc2lkY21wKGMtPnNzaWQsIHNzaWQpICYmCisJCSAgICBhdmNfc2lkY21wKGMtPnRzaWQsIHRzaWQpICYmCisJCSAgICBjLT50Y2xhc3MgPT0gdGNsYXNzICYmIChjLT5wZXJtcyAmIHBlcm1zKSkgeworCQkJY3JldGFpbmVkID0gMDsKKwkJCXJldCA9IGMtPmNhbGxiYWNrKGV2ZW50LCBzc2lkLCB0c2lkLCB0Y2xhc3MsCisJCQkJCSAgKGMtPnBlcm1zICYgcGVybXMpLCAmY3JldGFpbmVkKTsKKwkJCWlmIChyZXQgJiYgIXJjKSB7CisJCQkJcmMgPSByZXQ7CisJCQkJZXJyc2F2ZSA9IGVycm5vOworCQkJfQorCQkJaWYgKCFyZXQpCisJCQkJdHJldGFpbmVkIHw9IGNyZXRhaW5lZDsKKwkJfQorCX0KKworCWlmIChldmVudCA9PSBBVkNfQ0FMTEJBQ0tfVFJZX1JFVk9LRSkgeworCQkvKiByZXZva2UgYW55IHVucmV0YWluZWQgcGVybWlzc2lvbnMgKi8KKwkJcGVybXMgJj0gfnRyZXRhaW5lZDsKKwkJYXZjX3VwZGF0ZV9jYWNoZShldmVudCwgc3NpZCwgdHNpZCwgdGNsYXNzLCBwZXJtcyk7CisJCSpvdXRfcmV0YWluZWQgPSB0cmV0YWluZWQ7CisJfQorCisJYXZjX2dldF9sb2NrKGF2Y19sb2NrKTsKKwlpZiAoc2Vxbm8gPiBhdmNfY2FjaGUubGF0ZXN0X25vdGlmKQorCQlhdmNfY2FjaGUubGF0ZXN0X25vdGlmID0gc2Vxbm87CisJYXZjX3JlbGVhc2VfbG9jayhhdmNfbG9jayk7CisKKwllcnJubyA9IGVycnNhdmU7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGF2Y19zc19ncmFudCAtIEdyYW50IHByZXZpb3VzbHkgZGVuaWVkIHBlcm1pc3Npb25zLgorICogQHNzaWQ6IHNvdXJjZSBzZWN1cml0eSBpZGVudGlmaWVyIG9yICVTRUNTSURfV0lMRAorICogQHRzaWQ6IHRhcmdldCBzZWN1cml0eSBpZGVudGlmaWVyIG9yICVTRUNTSURfV0lMRAorICogQHRjbGFzczogdGFyZ2V0IHNlY3VyaXR5IGNsYXNzCisgKiBAcGVybXM6IHBlcm1pc3Npb25zIHRvIGdyYW50CisgKiBAc2Vxbm86IHBvbGljeSBzZXF1ZW5jZSBudW1iZXIKKyAqLworaW50IGF2Y19zc19ncmFudChzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCSB1aW50MzJfdCBzZXFubykKK3sKKwlyZXR1cm4gYXZjX2NvbnRyb2woQVZDX0NBTExCQUNLX0dSQU5ULAorCQkJICAgc3NpZCwgdHNpZCwgdGNsYXNzLCBwZXJtcywgc2Vxbm8sIDApOworfQorCisvKioKKyAqIGF2Y19zc190cnlfcmV2b2tlIC0gVHJ5IHRvIHJldm9rZSBwcmV2aW91c2x5IGdyYW50ZWQgcGVybWlzc2lvbnMuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdHNpZDogdGFyZ2V0IHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdGNsYXNzOiB0YXJnZXQgc2VjdXJpdHkgY2xhc3MKKyAqIEBwZXJtczogcGVybWlzc2lvbnMgdG8gZ3JhbnQKKyAqIEBzZXFubzogcG9saWN5IHNlcXVlbmNlIG51bWJlcgorICogQG91dF9yZXRhaW5lZDogc3Vic2V0IG9mIEBwZXJtcyB0aGF0IGFyZSByZXRhaW5lZAorICoKKyAqIFRyeSB0byByZXZva2UgcHJldmlvdXNseSBncmFudGVkIHBlcm1pc3Npb25zLCBidXQKKyAqIG9ubHkgaWYgdGhleSBhcmUgbm90IHJldGFpbmVkIGFzIG1pZ3JhdGVkIHBlcm1pc3Npb25zLgorICogUmV0dXJuIHRoZSBzdWJzZXQgb2YgcGVybWlzc2lvbnMgdGhhdCBhcmUgcmV0YWluZWQgdmlhIEBvdXRfcmV0YWluZWQuCisgKi8KK2ludCBhdmNfc3NfdHJ5X3Jldm9rZShzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJICAgICAgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCSAgICAgIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywgdWludDMyX3Qgc2Vxbm8sCisJCSAgICAgIGFjY2Vzc192ZWN0b3JfdCAqIG91dF9yZXRhaW5lZCkKK3sKKwlyZXR1cm4gYXZjX2NvbnRyb2woQVZDX0NBTExCQUNLX1RSWV9SRVZPS0UsCisJCQkgICBzc2lkLCB0c2lkLCB0Y2xhc3MsIHBlcm1zLCBzZXFubywgb3V0X3JldGFpbmVkKTsKK30KKworLyoqCisgKiBhdmNfc3NfcmV2b2tlIC0gUmV2b2tlIHByZXZpb3VzbHkgZ3JhbnRlZCBwZXJtaXNzaW9ucy4KKyAqIEBzc2lkOiBzb3VyY2Ugc2VjdXJpdHkgaWRlbnRpZmllciBvciAlU0VDU0lEX1dJTEQKKyAqIEB0c2lkOiB0YXJnZXQgc2VjdXJpdHkgaWRlbnRpZmllciBvciAlU0VDU0lEX1dJTEQKKyAqIEB0Y2xhc3M6IHRhcmdldCBzZWN1cml0eSBjbGFzcworICogQHBlcm1zOiBwZXJtaXNzaW9ucyB0byBncmFudAorICogQHNlcW5vOiBwb2xpY3kgc2VxdWVuY2UgbnVtYmVyCisgKgorICogUmV2b2tlIHByZXZpb3VzbHkgZ3JhbnRlZCBwZXJtaXNzaW9ucywgZXZlbiBpZgorICogdGhleSBhcmUgcmV0YWluZWQgYXMgbWlncmF0ZWQgcGVybWlzc2lvbnMuCisgKi8KK2ludCBhdmNfc3NfcmV2b2tlKHNlY3VyaXR5X2lkX3Qgc3NpZCwgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCSAgdWludDMyX3Qgc2Vxbm8pCit7CisJcmV0dXJuIGF2Y19jb250cm9sKEFWQ19DQUxMQkFDS19SRVZPS0UsCisJCQkgICBzc2lkLCB0c2lkLCB0Y2xhc3MsIHBlcm1zLCBzZXFubywgMCk7Cit9CisKKy8qKgorICogYXZjX3NzX3Jlc2V0IC0gRmx1c2ggdGhlIGNhY2hlIGFuZCByZXZhbGlkYXRlIG1pZ3JhdGVkIHBlcm1pc3Npb25zLgorICogQHNlcW5vOiBwb2xpY3kgc2VxdWVuY2UgbnVtYmVyCisgKi8KK2ludCBhdmNfc3NfcmVzZXQodWludDMyX3Qgc2Vxbm8pCit7CisJaW50IHJjOworCisJcmMgPSBhdmNfcmVzZXQoKTsKKworCWF2Y19nZXRfbG9jayhhdmNfbG9jayk7CisJaWYgKHNlcW5vID4gYXZjX2NhY2hlLmxhdGVzdF9ub3RpZikKKwkJYXZjX2NhY2hlLmxhdGVzdF9ub3RpZiA9IHNlcW5vOworCWF2Y19yZWxlYXNlX2xvY2soYXZjX2xvY2spOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGF2Y19zc19zZXRfYXVkaXRhbGxvdyAtIEVuYWJsZSBvciBkaXNhYmxlIGF1ZGl0aW5nIG9mIGdyYW50ZWQgcGVybWlzc2lvbnMuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdHNpZDogdGFyZ2V0IHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdGNsYXNzOiB0YXJnZXQgc2VjdXJpdHkgY2xhc3MKKyAqIEBwZXJtczogcGVybWlzc2lvbnMgdG8gZ3JhbnQKKyAqIEBzZXFubzogcG9saWN5IHNlcXVlbmNlIG51bWJlcgorICogQGVuYWJsZTogZW5hYmxlIGZsYWcuCisgKi8KK2ludCBhdmNfc3Nfc2V0X2F1ZGl0YWxsb3coc2VjdXJpdHlfaWRfdCBzc2lkLCBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCQkgIHVpbnQzMl90IHNlcW5vLCB1aW50MzJfdCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJcmV0dXJuIGF2Y19jb250cm9sKEFWQ19DQUxMQkFDS19BVURJVEFMTE9XX0VOQUJMRSwKKwkJCQkgICBzc2lkLCB0c2lkLCB0Y2xhc3MsIHBlcm1zLCBzZXFubywgMCk7CisJZWxzZQorCQlyZXR1cm4gYXZjX2NvbnRyb2woQVZDX0NBTExCQUNLX0FVRElUQUxMT1dfRElTQUJMRSwKKwkJCQkgICBzc2lkLCB0c2lkLCB0Y2xhc3MsIHBlcm1zLCBzZXFubywgMCk7Cit9CisKKy8qKgorICogYXZjX3NzX3NldF9hdWRpdGRlbnkgLSBFbmFibGUgb3IgZGlzYWJsZSBhdWRpdGluZyBvZiBkZW5pZWQgcGVybWlzc2lvbnMuCisgKiBAc3NpZDogc291cmNlIHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdHNpZDogdGFyZ2V0IHNlY3VyaXR5IGlkZW50aWZpZXIgb3IgJVNFQ1NJRF9XSUxECisgKiBAdGNsYXNzOiB0YXJnZXQgc2VjdXJpdHkgY2xhc3MKKyAqIEBwZXJtczogcGVybWlzc2lvbnMgdG8gZ3JhbnQKKyAqIEBzZXFubzogcG9saWN5IHNlcXVlbmNlIG51bWJlcgorICogQGVuYWJsZTogZW5hYmxlIGZsYWcuCisgKi8KK2ludCBhdmNfc3Nfc2V0X2F1ZGl0ZGVueShzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJCSBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zLAorCQkJIHVpbnQzMl90IHNlcW5vLCB1aW50MzJfdCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJcmV0dXJuIGF2Y19jb250cm9sKEFWQ19DQUxMQkFDS19BVURJVERFTllfRU5BQkxFLAorCQkJCSAgIHNzaWQsIHRzaWQsIHRjbGFzcywgcGVybXMsIHNlcW5vLCAwKTsKKwllbHNlCisJCXJldHVybiBhdmNfY29udHJvbChBVkNfQ0FMTEJBQ0tfQVVESVRERU5ZX0RJU0FCTEUsCisJCQkJICAgc3NpZCwgdHNpZCwgdGNsYXNzLCBwZXJtcywgc2Vxbm8sIDApOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hdmNfaW50ZXJuYWwuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjX2ludGVybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIxOTMzMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjX2ludGVybmFsLmMKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDYWxsYmFja3MgZm9yIHVzZXItc3VwcGxpZWQgbWVtb3J5IGFsbG9jYXRpb24sIHN1cHBsZW1lbnRhbAorICogYXVkaXRpbmcsIGFuZCBsb2NraW5nIHJvdXRpbmVzLgorICoKKyAqIEF1dGhvciA6IEVhbW9uIFdhbHNoIDxld2Fsc2hAZXBvY2gubmNzYy5taWw+CisgKgorICogTmV0bGluayBjb2RlIGRlcml2ZWQgaW4gcGFydCBmcm9tIHNhbXBsZSBjb2RlIGJ5CisgKiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4uCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSAiY2FsbGJhY2tzLmgiCisjaW5jbHVkZSAic2VsaW51eF9uZXRsaW5rLmgiCisjaW5jbHVkZSAiYXZjX2ludGVybmFsLmgiCisKKyNpZm5kZWYgTkVUTElOS19TRUxJTlVYCisjZGVmaW5lIE5FVExJTktfU0VMSU5VWCA3CisjZW5kaWYKKworLyogY2FsbGJhY2sgcG9pbnRlcnMgKi8KK3ZvaWQgKigqYXZjX2Z1bmNfbWFsbG9jKSAoc2l6ZV90KSA9IE5VTEw7Cit2b2lkICgqYXZjX2Z1bmNfZnJlZSkgKHZvaWQgKikgPSBOVUxMOworCit2b2lkICgqYXZjX2Z1bmNfbG9nKSAoY29uc3QgY2hhciAqLCAuLi4pID0gTlVMTDsKK3ZvaWQgKCphdmNfZnVuY19hdWRpdCkgKHZvaWQgKiwgc2VjdXJpdHlfY2xhc3NfdCwgY2hhciAqLCBzaXplX3QpID0gTlVMTDsKKworaW50IGF2Y191c2luZ190aHJlYWRzID0gMDsKK2ludCBhdmNfYXBwX21haW5fbG9vcCA9IDA7Cit2b2lkICooKmF2Y19mdW5jX2NyZWF0ZV90aHJlYWQpICh2b2lkICgqKSh2b2lkKSkgPSBOVUxMOwordm9pZCAoKmF2Y19mdW5jX3N0b3BfdGhyZWFkKSAodm9pZCAqKSA9IE5VTEw7CisKK3ZvaWQgKigqYXZjX2Z1bmNfYWxsb2NfbG9jaykgKHZvaWQpID0gTlVMTDsKK3ZvaWQgKCphdmNfZnVuY19nZXRfbG9jaykgKHZvaWQgKikgPSBOVUxMOwordm9pZCAoKmF2Y19mdW5jX3JlbGVhc2VfbG9jaykgKHZvaWQgKikgPSBOVUxMOwordm9pZCAoKmF2Y19mdW5jX2ZyZWVfbG9jaykgKHZvaWQgKikgPSBOVUxMOworCisvKiBtZXNzYWdlIHByZWZpeCBzdHJpbmcgYW5kIGF2YyBlbmZvcmNpbmcgbW9kZSAqLworY2hhciBhdmNfcHJlZml4W0FWQ19QUkVGSVhfU0laRV0gPSAidWF2YyI7CitpbnQgYXZjX3J1bm5pbmcgPSAwOworaW50IGF2Y19lbmZvcmNpbmcgPSAxOworaW50IGF2Y19zZXRlbmZvcmNlID0gMDsKK2ludCBhdmNfbmV0bGlua190cm91YmxlID0gMDsKKworLyogbmV0bGluayBzb2NrZXQgY29kZSAqLworc3RhdGljIGludCBmZCA9IC0xOworCitpbnQgYXZjX25ldGxpbmtfb3BlbihpbnQgYmxvY2tpbmcpCit7CisJaW50IGxlbiwgcmMgPSAwOworCXN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOworCisJZmQgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19SQVcsIE5FVExJTktfU0VMSU5VWCk7CisJaWYgKGZkIDwgMCkgeworCQlyYyA9IGZkOworCQlnb3RvIG91dDsKKwl9CisJCisJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworCWlmICghYmxvY2tpbmcgJiYgZmNudGwoZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spKSB7CisJCWNsb3NlKGZkKTsKKwkJZmQgPSAtMTsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJbGVuID0gc2l6ZW9mKGFkZHIpOworCisJbWVtc2V0KCZhZGRyLCAwLCBsZW4pOworCWFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKwlhZGRyLm5sX2dyb3VwcyA9IFNFTE5MX0dSUF9BVkM7CisKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBsZW4pIDwgMCkgeworCQljbG9zZShmZCk7CisJCWZkID0gLTE7CisJCXJjID0gLTE7CisJCWdvdG8gb3V0OworCX0KKyAgICAgIG91dDoKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgYXZjX25ldGxpbmtfY2xvc2Uodm9pZCkKK3sKKwlpZiAoZmQgPj0gMCkKKwkJY2xvc2UoZmQpOworCWZkID0gLTE7CQorfQorCitzdGF0aWMgaW50IGF2Y19uZXRsaW5rX3JlY2VpdmUoY2hhciAqYnVmLCB1bnNpZ25lZCBidWZsZW4sIGludCBibG9ja2luZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBvbGxmZCBwZmQgPSB7IGZkLCBQT0xMSU4gfCBQT0xMUFJJLCAwIH07CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlzb2NrbGVuX3QgbmxhZGRybGVuID0gc2l6ZW9mIG5sYWRkcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilidWY7CisKKwlkbyB7CisJCXJjID0gcG9sbCgmcGZkLCAxLCAoYmxvY2tpbmcgPyAtMSA6IDApKTsKKwl9IHdoaWxlIChyYyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisJaWYgKHJjID09IDAgJiYgIWJsb2NraW5nKSB7CisJCWVycm5vID0gRVdPVUxEQkxPQ0s7CisJCXJldHVybiAtMTsKKwl9CisJZWxzZSBpZiAocmMgPCAxKSB7CisJCWF2Y19sb2coU0VMSU5VWF9FUlJPUiwgIiVzOiAgbmV0bGluayBwb2xsOiBlcnJvciAlZFxuIiwKKwkJCWF2Y19wcmVmaXgsIGVycm5vKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gcmVjdmZyb20oZmQsIGJ1ZiwgYnVmbGVuLCAwLCAoc3RydWN0IHNvY2thZGRyICopJm5sYWRkciwKKwkJICAgICAgJm5sYWRkcmxlbik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKG5sYWRkcmxlbiAhPSBzaXplb2YgbmxhZGRyKSB7CisJCWF2Y19sb2coU0VMSU5VWF9XQVJOSU5HLAorCQkJIiVzOiAgd2FybmluZzogbmV0bGluayBhZGRyZXNzIHRydW5jYXRlZCwgbGVuICVkP1xuIiwKKwkJCWF2Y19wcmVmaXgsIG5sYWRkcmxlbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobmxhZGRyLm5sX3BpZCkgeworCQlhdmNfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCSIlczogIHdhcm5pbmc6IHJlY2VpdmVkIHNwb29mZWQgbmV0bGluayBwYWNrZXQgZnJvbTogJWRcbiIsCisJCQlhdmNfcHJlZml4LCBubGFkZHIubmxfcGlkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyYyA9PSAwKSB7CisJCWF2Y19sb2coU0VMSU5VWF9XQVJOSU5HLAorCQkJIiVzOiAgd2FybmluZzogcmVjZWl2ZWQgRU9GIG9uIG5ldGxpbmsgc29ja2V0XG4iLAorCQkJYXZjX3ByZWZpeCk7CisJCWVycm5vID0gRUJBREZEOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBNU0dfVFJVTkMgfHwgbmxoLT5ubG1zZ19sZW4gPiAodW5zaWduZWQpcmMpIHsKKwkJYXZjX2xvZyhTRUxJTlVYX1dBUk5JTkcsCisJCQkiJXM6ICB3YXJuaW5nOiBpbmNvbXBsZXRlIG5ldGxpbmsgbWVzc2FnZVxuIiwKKwkJCWF2Y19wcmVmaXgpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXZjX25ldGxpbmtfcHJvY2VzcyhjaGFyICpidWYpCit7CisJaW50IHJjOworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKWJ1ZjsKKworCXN3aXRjaCAobmxoLT5ubG1zZ190eXBlKSB7CisJY2FzZSBOTE1TR19FUlJPUjp7CisJCXN0cnVjdCBubG1zZ2VyciAqZXJyID0gTkxNU0dfREFUQShubGgpOworCisJCS8qIE5ldGxpbmsgYWNrICovCisJCWlmIChlcnItPmVycm9yID09IDApCisJCQlicmVhazsKKworCQllcnJubyA9IC1lcnItPmVycm9yOworCQlhdmNfbG9nKFNFTElOVVhfRVJST1IsCisJCQkiJXM6ICBuZXRsaW5rIGVycm9yOiAlZFxuIiwgYXZjX3ByZWZpeCwgZXJybm8pOworCQlyZXR1cm4gLTE7CisJfQorCisJY2FzZSBTRUxOTF9NU0dfU0VURU5GT1JDRTp7CisJCXN0cnVjdCBzZWxubF9tc2dfc2V0ZW5mb3JjZSAqbXNnID0gTkxNU0dfREFUQShubGgpOworCQlhdmNfbG9nKFNFTElOVVhfSU5GTywKKwkJCSIlczogIHJlY2VpdmVkIHNldGVuZm9yY2Ugbm90aWNlIChlbmZvcmNpbmc9JWQpXG4iLAorCQkJYXZjX3ByZWZpeCwgbXNnLT52YWwpOworCQlpZiAoYXZjX3NldGVuZm9yY2UpCisJCQlicmVhazsKKwkJYXZjX2VuZm9yY2luZyA9IG1zZy0+dmFsOworCQlpZiAoYXZjX2VuZm9yY2luZyAmJiAocmMgPSBhdmNfc3NfcmVzZXQoMCkpIDwgMCkgeworCQkJYXZjX2xvZyhTRUxJTlVYX0VSUk9SLAorCQkJCSIlczogIGNhY2hlIHJlc2V0IHJldHVybmVkICVkIChlcnJubyAlZClcbiIsCisJCQkJYXZjX3ByZWZpeCwgcmMsIGVycm5vKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlyYyA9IHNlbGludXhfbmV0bGlua19zZXRlbmZvcmNlKG1zZy0+dmFsKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBTRUxOTF9NU0dfUE9MSUNZTE9BRDp7CisJCXN0cnVjdCBzZWxubF9tc2dfcG9saWN5bG9hZCAqbXNnID0gTkxNU0dfREFUQShubGgpOworCQlhdmNfbG9nKFNFTElOVVhfSU5GTywKKwkJCSIlczogIHJlY2VpdmVkIHBvbGljeWxvYWQgbm90aWNlIChzZXFubz0lZClcbiIsCisJCQlhdmNfcHJlZml4LCBtc2ctPnNlcW5vKTsKKwkJcmMgPSBhdmNfc3NfcmVzZXQobXNnLT5zZXFubyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWF2Y19sb2coU0VMSU5VWF9FUlJPUiwKKwkJCQkiJXM6ICBjYWNoZSByZXNldCByZXR1cm5lZCAlZCAoZXJybm8gJWQpXG4iLAorCQkJCWF2Y19wcmVmaXgsIHJjLCBlcnJubyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcmMgPSBzZWxpbnV4X25ldGxpbmtfcG9saWN5bG9hZChtc2ctPnNlcW5vKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJYXZjX2xvZyhTRUxJTlVYX1dBUk5JTkcsCisJCQkiJXM6ICB3YXJuaW5nOiB1bmtub3duIG5ldGxpbmsgbWVzc2FnZSAlZFxuIiwKKwkJCWF2Y19wcmVmaXgsIG5saC0+bmxtc2dfdHlwZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgYXZjX25ldGxpbmtfY2hlY2tfbmIodm9pZCkKK3sKKwlpbnQgcmM7CisJY2hhciBidWZbMTAyNF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQpKTsKKworCXdoaWxlICgxKSB7CisJCWVycm5vID0gMDsKKwkJcmMgPSBhdmNfbmV0bGlua19yZWNlaXZlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIDApOworCQlpZiAocmMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoZXJybm8gPT0gMCB8fCBlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWVsc2UgeworCQkJCWF2Y19sb2coU0VMSU5VWF9FUlJPUiwKKwkJCQkJIiVzOiAgbmV0bGluayByZWN2ZnJvbTogZXJyb3IgJWRcbiIsCisJCQkJCWF2Y19wcmVmaXgsIGVycm5vKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKworCQkodm9pZClhdmNfbmV0bGlua19wcm9jZXNzKGJ1Zik7CisJfQorCXJldHVybiAwOworfQorCisvKiBydW4gcm91dGluZSBmb3IgdGhlIG5ldGxpbmsgbGlzdGVuaW5nIHRocmVhZCAqLwordm9pZCBhdmNfbmV0bGlua19sb29wKHZvaWQpCit7CisJaW50IHJjOworCWNoYXIgYnVmWzEwMjRdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKSk7CisKKwl3aGlsZSAoMSkgeworCQllcnJubyA9IDA7CisJCXJjID0gYXZjX25ldGxpbmtfcmVjZWl2ZShidWYsIHNpemVvZihidWYpLCAxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJaWYgKGVycm5vID09IDAgfHwgZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQllbHNlIHsKKwkJCQlhdmNfbG9nKFNFTElOVVhfRVJST1IsCisJCQkJCSIlczogIG5ldGxpbmsgcmVjdmZyb206IGVycm9yICVkXG4iLAorCQkJCQlhdmNfcHJlZml4LCBlcnJubyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyYyA9IGF2Y19uZXRsaW5rX3Byb2Nlc3MoYnVmKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCX0KKworCWNsb3NlKGZkKTsKKwlmZCA9IC0xOworCWF2Y19uZXRsaW5rX3Ryb3VibGUgPSAxOworCWF2Y19sb2coU0VMSU5VWF9FUlJPUiwKKwkJIiVzOiAgbmV0bGluayB0aHJlYWQ6IGVycm9ycyBlbmNvdW50ZXJlZCwgdGVybWluYXRpbmdcbiIsCisJCWF2Y19wcmVmaXgpOworfQorCitpbnQgYXZjX25ldGxpbmtfYWNxdWlyZV9mZCh2b2lkKQoreworICAgIGF2Y19hcHBfbWFpbl9sb29wID0gMTsKKworICAgIHJldHVybiBmZDsKK30KKwordm9pZCBhdmNfbmV0bGlua19yZWxlYXNlX2ZkKHZvaWQpCit7CisgICAgYXZjX2FwcF9tYWluX2xvb3AgPSAwOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hdmNfaW50ZXJuYWwuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MTBlOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjX2ludGVybmFsLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSB0aGUgQVZDCisgKiBmb3IgY2FsbGluZyB0aGUgdXNlci1zdXBwbGllZCBtZW1vcnkgYWxsb2NhdGlvbiwgc3VwcGxlbWVudGFsCisgKiBhdWRpdGluZywgYW5kIGxvY2tpbmcgcm91dGluZSwgYXMgd2VsbCBhcyBpbmNyZW1lbnRpbmcgdGhlCisgKiBzdGF0aXN0aWNzIGZpZWxkcy4KKyAqCisgKiBBdXRob3IgOiBFYW1vbiBXYWxzaCA8ZXdhbHNoQGVwb2NoLm5jc2MubWlsPgorICovCisjaWZuZGVmIF9TRUxJTlVYX0FWQ19JTlRFUk5BTF9IXworI2RlZmluZSBfU0VMSU5VWF9BVkNfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2VsaW51eC9hdmMuaD4KKyNpbmNsdWRlICJjYWxsYmFja3MuaCIKKyNpbmNsdWRlICJkc28uaCIKKworLyogY2FsbGJhY2sgcG9pbnRlcnMgKi8KK2V4dGVybiB2b2lkICooKmF2Y19mdW5jX21hbGxvYykgKHNpemVfdCkgaGlkZGVuOworZXh0ZXJuIHZvaWQgKCphdmNfZnVuY19mcmVlKSAodm9pZCAqKWhpZGRlbjsKKworZXh0ZXJuIHZvaWQgKCphdmNfZnVuY19sb2cpIChjb25zdCBjaGFyICosIC4uLiloaWRkZW47CitleHRlcm4gdm9pZCAoKmF2Y19mdW5jX2F1ZGl0KSAodm9pZCAqLCBzZWN1cml0eV9jbGFzc190LCBjaGFyICosIHNpemVfdCloaWRkZW47CisKK2V4dGVybiBpbnQgYXZjX3VzaW5nX3RocmVhZHMgaGlkZGVuOworZXh0ZXJuIGludCBhdmNfYXBwX21haW5fbG9vcCBoaWRkZW47CitleHRlcm4gdm9pZCAqKCphdmNfZnVuY19jcmVhdGVfdGhyZWFkKSAodm9pZCAoKikodm9pZCkpaGlkZGVuOworZXh0ZXJuIHZvaWQgKCphdmNfZnVuY19zdG9wX3RocmVhZCkgKHZvaWQgKiloaWRkZW47CisKK2V4dGVybiB2b2lkICooKmF2Y19mdW5jX2FsbG9jX2xvY2spICh2b2lkKWhpZGRlbjsKK2V4dGVybiB2b2lkICgqYXZjX2Z1bmNfZ2V0X2xvY2spICh2b2lkICopaGlkZGVuOworZXh0ZXJuIHZvaWQgKCphdmNfZnVuY19yZWxlYXNlX2xvY2spICh2b2lkICopaGlkZGVuOworZXh0ZXJuIHZvaWQgKCphdmNfZnVuY19mcmVlX2xvY2spICh2b2lkICopaGlkZGVuOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NhbGxiYWNrcyhjb25zdCBzdHJ1Y3QgYXZjX21lbW9yeV9jYWxsYmFjayAqbWVtX2NiLAorCQkJCSBjb25zdCBzdHJ1Y3QgYXZjX2xvZ19jYWxsYmFjayAqbG9nX2NiLAorCQkJCSBjb25zdCBzdHJ1Y3QgYXZjX3RocmVhZF9jYWxsYmFjayAqdGhyZWFkX2NiLAorCQkJCSBjb25zdCBzdHJ1Y3QgYXZjX2xvY2tfY2FsbGJhY2sgKmxvY2tfY2IpCit7CisJaWYgKG1lbV9jYikgeworCQlhdmNfZnVuY19tYWxsb2MgPSBtZW1fY2ItPmZ1bmNfbWFsbG9jOworCQlhdmNfZnVuY19mcmVlID0gbWVtX2NiLT5mdW5jX2ZyZWU7CisJfQorCWlmIChsb2dfY2IpIHsKKwkJYXZjX2Z1bmNfbG9nID0gbG9nX2NiLT5mdW5jX2xvZzsKKwkJYXZjX2Z1bmNfYXVkaXQgPSBsb2dfY2ItPmZ1bmNfYXVkaXQ7CisJfQorCWlmICh0aHJlYWRfY2IpIHsKKwkJYXZjX3VzaW5nX3RocmVhZHMgPSAxOworCQlhdmNfZnVuY19jcmVhdGVfdGhyZWFkID0gdGhyZWFkX2NiLT5mdW5jX2NyZWF0ZV90aHJlYWQ7CisJCWF2Y19mdW5jX3N0b3BfdGhyZWFkID0gdGhyZWFkX2NiLT5mdW5jX3N0b3BfdGhyZWFkOworCX0KKwlpZiAobG9ja19jYikgeworCQlhdmNfZnVuY19hbGxvY19sb2NrID0gbG9ja19jYi0+ZnVuY19hbGxvY19sb2NrOworCQlhdmNfZnVuY19nZXRfbG9jayA9IGxvY2tfY2ItPmZ1bmNfZ2V0X2xvY2s7CisJCWF2Y19mdW5jX3JlbGVhc2VfbG9jayA9IGxvY2tfY2ItPmZ1bmNfcmVsZWFzZV9sb2NrOworCQlhdmNfZnVuY19mcmVlX2xvY2sgPSBsb2NrX2NiLT5mdW5jX2ZyZWVfbG9jazsKKwl9Cit9CisKKy8qIG1lc3NhZ2UgcHJlZml4IGFuZCBlbmZvcmNpbmcgbW9kZSovCisjZGVmaW5lIEFWQ19QUkVGSVhfU0laRSAxNgorZXh0ZXJuIGNoYXIgYXZjX3ByZWZpeFtBVkNfUFJFRklYX1NJWkVdIGhpZGRlbjsKK2V4dGVybiBpbnQgYXZjX3J1bm5pbmcgaGlkZGVuOworZXh0ZXJuIGludCBhdmNfZW5mb3JjaW5nIGhpZGRlbjsKK2V4dGVybiBpbnQgYXZjX3NldGVuZm9yY2UgaGlkZGVuOworCisvKiB1c2VyLXN1cHBsaWVkIGNhbGxiYWNrIGludGVyZmFjZSBmb3IgYXZjICovCitzdGF0aWMgaW5saW5lIHZvaWQgKmF2Y19tYWxsb2Moc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIGF2Y19mdW5jX21hbGxvYyA/IGF2Y19mdW5jX21hbGxvYyhzaXplKSA6IG1hbGxvYyhzaXplKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Y19mcmVlKHZvaWQgKnB0cikKK3sKKwlpZiAoYXZjX2Z1bmNfZnJlZSkKKwkJYXZjX2Z1bmNfZnJlZShwdHIpOworCWVsc2UKKwkJZnJlZShwdHIpOworfQorCisvKiB0aGlzIGlzIGEgbWFjcm8gaW4gb3JkZXIgdG8gdXNlIHRoZSB2YXJpYWRpYyBjYXBhYmlsaXR5LiAqLworI2RlZmluZSBhdmNfbG9nKHR5cGUsIGZvcm1hdC4uLikgXAorICBpZiAoYXZjX2Z1bmNfbG9nKSBcCisgICAgYXZjX2Z1bmNfbG9nKGZvcm1hdCk7IFwKKyAgZWxzZSBcCisgICAgc2VsaW51eF9sb2codHlwZSwgZm9ybWF0KTsKKworc3RhdGljIGlubGluZSB2b2lkIGF2Y19zdXBwbF9hdWRpdCh2b2lkICpwdHIsIHNlY3VyaXR5X2NsYXNzX3QgY2xhc3MsCisJCQkJICAgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWlmIChhdmNfZnVuY19hdWRpdCkKKwkJYXZjX2Z1bmNfYXVkaXQocHRyLCBjbGFzcywgYnVmLCBsZW4pOworCWVsc2UKKwkJc2VsaW51eF9hdWRpdChwdHIsIGNsYXNzLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYXZjX2NyZWF0ZV90aHJlYWQodm9pZCAoKnJ1bikgKHZvaWQpKQoreworCXJldHVybiBhdmNfZnVuY19jcmVhdGVfdGhyZWFkID8gYXZjX2Z1bmNfY3JlYXRlX3RocmVhZChydW4pIDogTlVMTDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Y19zdG9wX3RocmVhZCh2b2lkICp0aHJlYWQpCit7CisJaWYgKGF2Y19mdW5jX3N0b3BfdGhyZWFkKQorCQlhdmNfZnVuY19zdG9wX3RocmVhZCh0aHJlYWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmF2Y19hbGxvY19sb2NrKHZvaWQpCit7CisJcmV0dXJuIGF2Y19mdW5jX2FsbG9jX2xvY2sgPyBhdmNfZnVuY19hbGxvY19sb2NrKCkgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXZjX2dldF9sb2NrKHZvaWQgKmxvY2spCit7CisJaWYgKGF2Y19mdW5jX2dldF9sb2NrKQorCQlhdmNfZnVuY19nZXRfbG9jayhsb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF2Y19yZWxlYXNlX2xvY2sodm9pZCAqbG9jaykKK3sKKwlpZiAoYXZjX2Z1bmNfcmVsZWFzZV9sb2NrKQorCQlhdmNfZnVuY19yZWxlYXNlX2xvY2sobG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdmNfZnJlZV9sb2NrKHZvaWQgKmxvY2spCit7CisJaWYgKGF2Y19mdW5jX2ZyZWVfbG9jaykKKwkJYXZjX2Z1bmNfZnJlZV9sb2NrKGxvY2spOworfQorCisvKiBzdGF0aXN0aWNzIGhlbHBlciByb3V0aW5lcyAqLworI2lmZGVmIEFWQ19DQUNIRV9TVEFUUworCisjZGVmaW5lIGF2Y19jYWNoZV9zdGF0c19pbmNyKGZpZWxkKSBcCisgIGNhY2hlX3N0YXRzLmZpZWxkICsrOworI2RlZmluZSBhdmNfY2FjaGVfc3RhdHNfYWRkKGZpZWxkLCBudW0pIFwKKyAgY2FjaGVfc3RhdHMuZmllbGQgKz0gbnVtOworCisjZWxzZQorCisjZGVmaW5lIGF2Y19jYWNoZV9zdGF0c19pbmNyKGZpZWxkKQorI2RlZmluZSBhdmNfY2FjaGVfc3RhdHNfYWRkKGZpZWxkLCBudW0pCisKKyNlbmRpZgorCisvKiBsb2dnaW5nIGhlbHBlciByb3V0aW5lcyAqLworI2RlZmluZSBBVkNfQVVESVRfQlVGU0laRSAxMDI0CisKKy8qIGFnYWluLCB3ZSBuZWVkIHRoZSB2YXJpYWRpYyBjYXBhYmlsaXR5IGhlcmUgKi8KKyNkZWZpbmUgbG9nX2FwcGVuZChidWYsZm9ybWF0Li4uKSBcCisgIHNucHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSwgQVZDX0FVRElUX0JVRlNJWkUtc3RybGVuKGJ1ZiksIGZvcm1hdCkKKworLyogaW50ZXJuYWwgY2FsbGJhY2tzICovCitpbnQgYXZjX3NzX2dyYW50KHNlY3VyaXR5X2lkX3Qgc3NpZCwgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsIGFjY2Vzc192ZWN0b3JfdCBwZXJtcywKKwkJIHVpbnQzMl90IHNlcW5vKSBoaWRkZW47CitpbnQgYXZjX3NzX3RyeV9yZXZva2Uoc2VjdXJpdHlfaWRfdCBzc2lkLCBzZWN1cml0eV9pZF90IHRzaWQsCisJCSAgICAgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkgICAgICBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsIHVpbnQzMl90IHNlcW5vLAorCQkgICAgICBhY2Nlc3NfdmVjdG9yX3QgKiBvdXRfcmV0YWluZWQpIGhpZGRlbjsKK2ludCBhdmNfc3NfcmV2b2tlKHNlY3VyaXR5X2lkX3Qgc3NpZCwgc2VjdXJpdHlfaWRfdCB0c2lkLAorCQkgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCSAgdWludDMyX3Qgc2Vxbm8pIGhpZGRlbjsKK2ludCBhdmNfc3NfcmVzZXQodWludDMyX3Qgc2Vxbm8pIGhpZGRlbjsKK2ludCBhdmNfc3Nfc2V0X2F1ZGl0YWxsb3coc2VjdXJpdHlfaWRfdCBzc2lkLCBzZWN1cml0eV9pZF90IHRzaWQsCisJCQkgIHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBhY2Nlc3NfdmVjdG9yX3QgcGVybXMsCisJCQkgIHVpbnQzMl90IHNlcW5vLCB1aW50MzJfdCBlbmFibGUpIGhpZGRlbjsKK2ludCBhdmNfc3Nfc2V0X2F1ZGl0ZGVueShzZWN1cml0eV9pZF90IHNzaWQsIHNlY3VyaXR5X2lkX3QgdHNpZCwKKwkJCSBzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHBlcm1zLAorCQkJIHVpbnQzMl90IHNlcW5vLCB1aW50MzJfdCBlbmFibGUpIGhpZGRlbjsKKworLyogbmV0bGluayBrZXJuZWwgbWVzc2FnZSBjb2RlICovCitleHRlcm4gaW50IGF2Y19uZXRsaW5rX3Ryb3VibGUgaGlkZGVuOworCitoaWRkZW5fcHJvdG8oYXZjX2F2X3N0YXRzKQorICAgIGhpZGRlbl9wcm90byhhdmNfY2xlYW51cCkKKyAgICBoaWRkZW5fcHJvdG8oYXZjX3Jlc2V0KQorICAgIGhpZGRlbl9wcm90byhhdmNfYXVkaXQpCisgICAgaGlkZGVuX3Byb3RvKGF2Y19oYXNfcGVybV9ub2F1ZGl0KQorI2VuZGlmCQkJCS8qIF9TRUxJTlVYX0FWQ19JTlRFUk5BTF9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hdmNfc2lkdGFiLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2F2Y19zaWR0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmYyMWRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9hdmNfc2lkdGFiLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdXNlcnNwYWNlIFNJRCBoYXNodGFibGUuCisgKgorICogQXV0aG9yIDogRWFtb24gV2Fsc2gsIDxld2Fsc2hAZXBvY2gubmNzYy5taWw+CisgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgPHNlbGludXgvYXZjLmg+CisjaW5jbHVkZSAiYXZjX3NpZHRhYi5oIgorI2luY2x1ZGUgImF2Y19pbnRlcm5hbC5oIgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNpZHRhYl9oYXNoKGNvbnN0IGNoYXIgKiBrZXkpCit7CisJY2hhciAqcCwgKmtleXA7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IDA7CisJa2V5cCA9IChjaGFyICopa2V5OworCXNpemUgPSBzdHJsZW4oa2V5cCk7CisJZm9yIChwID0ga2V5cDsgKHVuc2lnbmVkIGludCkocCAtIGtleXApIDwgc2l6ZTsgcCsrKQorCQl2YWwgPQorCQkgICAgKHZhbCA8PCA0IHwgKHZhbCA+PiAoOCAqIHNpemVvZih1bnNpZ25lZCBpbnQpIC0gNCkpKSBeICgqcCk7CisJcmV0dXJuIHZhbCAmIChTSURUQUJfU0laRSAtIDEpOworfQorCitpbnQgc2lkdGFiX2luaXQoc3RydWN0IHNpZHRhYiAqcykKK3sKKwlpbnQgaSwgcmMgPSAwOworCisJcy0+aHRhYmxlID0gKHN0cnVjdCBzaWR0YWJfbm9kZSAqKilhdmNfbWFsbG9jCisJICAgIChzaXplb2Yoc3RydWN0IHNpZHRhYl9ub2RlICopICogU0lEVEFCX1NJWkUpOworCisJaWYgKCFzLT5odGFibGUpIHsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBTSURUQUJfU0laRTsgaSsrKQorCQlzLT5odGFibGVbaV0gPSBOVUxMOworCXMtPm5lbCA9IDA7CisgICAgICBvdXQ6CisJcmV0dXJuIHJjOworfQorCitpbnQgc2lkdGFiX2luc2VydChzdHJ1Y3Qgc2lkdGFiICpzLCBjb25zdCBjaGFyICogY3R4KQoreworCWludCBodmFsdWUsIHJjID0gMDsKKwlzdHJ1Y3Qgc2lkdGFiX25vZGUgKm5ld25vZGU7CisJY2hhciAqIG5ld2N0eDsKKworCW5ld25vZGUgPSAoc3RydWN0IHNpZHRhYl9ub2RlICopYXZjX21hbGxvYyhzaXplb2YoKm5ld25vZGUpKTsKKwlpZiAoIW5ld25vZGUpIHsKKwkJcmMgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCW5ld2N0eCA9IChjaGFyICopIHN0cmR1cChjdHgpOworCWlmICghbmV3Y3R4KSB7CisJCXJjID0gLTE7CisJCWF2Y19mcmVlKG5ld25vZGUpOworCQlnb3RvIG91dDsKKwl9CisKKwlodmFsdWUgPSBzaWR0YWJfaGFzaChuZXdjdHgpOworCW5ld25vZGUtPm5leHQgPSBzLT5odGFibGVbaHZhbHVlXTsKKwluZXdub2RlLT5zaWRfcy5jdHggPSBuZXdjdHg7CisJbmV3bm9kZS0+c2lkX3MucmVmY250ID0gMTsJLyogdW51c2VkICovCisJcy0+aHRhYmxlW2h2YWx1ZV0gPSBuZXdub2RlOworCXMtPm5lbCsrOworICAgICAgb3V0OgorCXJldHVybiByYzsKK30KKworaW50CitzaWR0YWJfY29udGV4dF90b19zaWQoc3RydWN0IHNpZHRhYiAqcywKKwkJICAgICAgY29uc3QgY2hhciAqIGN0eCwgc2VjdXJpdHlfaWRfdCAqIHNpZCkKK3sKKwlpbnQgaHZhbHVlLCByYyA9IDA7CisJc3RydWN0IHNpZHRhYl9ub2RlICpjdXI7CisKKwkqc2lkID0gTlVMTDsKKwlodmFsdWUgPSBzaWR0YWJfaGFzaChjdHgpOworCisgICAgICBsb29wOgorCWN1ciA9IHMtPmh0YWJsZVtodmFsdWVdOworCXdoaWxlIChjdXIgIT0gTlVMTCAmJiBzdHJjbXAoY3VyLT5zaWRfcy5jdHgsIGN0eCkpCisJCWN1ciA9IGN1ci0+bmV4dDsKKworCWlmIChjdXIgPT0gTlVMTCkgewkvKiBuZWVkIHRvIG1ha2UgYSBuZXcgZW50cnkgKi8KKwkJcmMgPSBzaWR0YWJfaW5zZXJ0KHMsIGN0eCk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCQlnb3RvIGxvb3A7CS8qIGZpbmQgdGhlIG5ld2x5IGluc2VydGVkIG5vZGUgKi8KKwl9CisKKwkqc2lkID0gJmN1ci0+c2lkX3M7CisgICAgICBvdXQ6CisJcmV0dXJuIHJjOworfQorCit2b2lkIHNpZHRhYl9zaWRfc3RhdHMoc3RydWN0IHNpZHRhYiAqaCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCWludCBpLCBjaGFpbl9sZW4sIHNsb3RzX3VzZWQsIG1heF9jaGFpbl9sZW47CisJc3RydWN0IHNpZHRhYl9ub2RlICpjdXI7CisKKwlzbG90c191c2VkID0gMDsKKwltYXhfY2hhaW5fbGVuID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgU0lEVEFCX1NJWkU7IGkrKykgeworCQljdXIgPSBoLT5odGFibGVbaV07CisJCWlmIChjdXIpIHsKKwkJCXNsb3RzX3VzZWQrKzsKKwkJCWNoYWluX2xlbiA9IDA7CisJCQl3aGlsZSAoY3VyKSB7CisJCQkJY2hhaW5fbGVuKys7CisJCQkJY3VyID0gY3VyLT5uZXh0OworCQkJfQorCisJCQlpZiAoY2hhaW5fbGVuID4gbWF4X2NoYWluX2xlbikKKwkJCQltYXhfY2hhaW5fbGVuID0gY2hhaW5fbGVuOworCQl9CisJfQorCisJc25wcmludGYoYnVmLCBidWZsZW4sCisJCSAiJXM6ICAlZCBTSUQgZW50cmllcyBhbmQgJWQvJWQgYnVja2V0cyB1c2VkLCBsb25nZXN0ICIKKwkJICJjaGFpbiBsZW5ndGggJWRcbiIsIGF2Y19wcmVmaXgsIGgtPm5lbCwgc2xvdHNfdXNlZCwKKwkJIFNJRFRBQl9TSVpFLCBtYXhfY2hhaW5fbGVuKTsKK30KKwordm9pZCBzaWR0YWJfZGVzdHJveShzdHJ1Y3Qgc2lkdGFiICpzKQoreworCWludCBpOworCXN0cnVjdCBzaWR0YWJfbm9kZSAqY3VyLCAqdGVtcDsKKworCWlmICghcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IFNJRFRBQl9TSVpFOyBpKyspIHsKKwkJY3VyID0gcy0+aHRhYmxlW2ldOworCQl3aGlsZSAoY3VyICE9IE5VTEwpIHsKKwkJCXRlbXAgPSBjdXI7CisJCQljdXIgPSBjdXItPm5leHQ7CisJCQlmcmVlY29uKHRlbXAtPnNpZF9zLmN0eCk7CisJCQlhdmNfZnJlZSh0ZW1wKTsKKwkJfQorCQlzLT5odGFibGVbaV0gPSBOVUxMOworCX0KKwlhdmNfZnJlZShzLT5odGFibGUpOworCXMtPmh0YWJsZSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2F2Y19zaWR0YWIuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYXZjX3NpZHRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZTliODcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2F2Y19zaWR0YWIuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQSBzZWN1cml0eSBpZGVudGlmaWVyIHRhYmxlIChzaWR0YWIpIGlzIGEgaGFzaCB0YWJsZQorICogb2Ygc2VjdXJpdHkgY29udGV4dCBzdHJ1Y3R1cmVzIGluZGV4ZWQgYnkgU0lEIHZhbHVlLgorICovCisjaWZuZGVmIF9TRUxJTlVYX0FWQ19TSURUQUJfSF8KKyNkZWZpbmUgX1NFTElOVVhfQVZDX1NJRFRBQl9IXworCisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9hdmMuaD4KKyNpbmNsdWRlICJkc28uaCIKKworc3RydWN0IHNpZHRhYl9ub2RlIHsKKwlzdHJ1Y3Qgc2VjdXJpdHlfaWQgc2lkX3M7CisJc3RydWN0IHNpZHRhYl9ub2RlICpuZXh0OworfTsKKworI2RlZmluZSBTSURUQUJfSEFTSF9CSVRTIDcKKyNkZWZpbmUgU0lEVEFCX0hBU0hfQlVDS0VUUyAoMSA8PCBTSURUQUJfSEFTSF9CSVRTKQorI2RlZmluZSBTSURUQUJfSEFTSF9NQVNLIChTSURUQUJfSEFTSF9CVUNLRVRTLTEpCisjZGVmaW5lIFNJRFRBQl9TSVpFIFNJRFRBQl9IQVNIX0JVQ0tFVFMKKworc3RydWN0IHNpZHRhYiB7CisJc3RydWN0IHNpZHRhYl9ub2RlICoqaHRhYmxlOworCXVuc2lnbmVkIG5lbDsKK307CisKK2ludCBzaWR0YWJfaW5pdChzdHJ1Y3Qgc2lkdGFiICpzKSBoaWRkZW47CitpbnQgc2lkdGFiX2luc2VydChzdHJ1Y3Qgc2lkdGFiICpzLCBjb25zdCBjaGFyICogY3R4KSBoaWRkZW47CisKK2ludCBzaWR0YWJfY29udGV4dF90b19zaWQoc3RydWN0IHNpZHRhYiAqcywKKwkJCSAgY29uc3QgY2hhciAqIGN0eCwgc2VjdXJpdHlfaWRfdCAqIHNpZCkgaGlkZGVuOworCit2b2lkIHNpZHRhYl9zaWRfc3RhdHMoc3RydWN0IHNpZHRhYiAqcywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKSBoaWRkZW47Cit2b2lkIHNpZHRhYl9kZXN0cm95KHN0cnVjdCBzaWR0YWIgKnMpIGhpZGRlbjsKKworI2VuZGlmCQkJCS8qIF9TRUxJTlVYX0FWQ19TSURUQUJfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYm9vbGVhbnMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvYm9vbGVhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2UwYWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9ib29sZWFucy5jCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQXV0aG9yOiBLYXJsIE1hY01pbGxhbiA8a21hY21pbGxhbkB0cmVzeXMuY29tPgorICoKKyAqIE1vZGlmaWVkOiAgCisgKiAgIERhbiBXYWxzaCA8ZHdhbHNoQHJlZGhhdC5jb20+IC0gQWRkZWQgc2VjdXJpdHlfbG9hZF9ib29sZWFucygpLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorCisjZGVmaW5lIFNFTElOVVhfQk9PTF9ESVIgIi9ib29sZWFucy8iCisKK3N0YXRpYyBpbnQgZmlsZW5hbWVfc2VsZWN0KGNvbnN0IHN0cnVjdCBkaXJlbnQgKmQpCit7CisJaWYgKGQtPmRfbmFtZVswXSA9PSAnLicKKwkgICAgJiYgKGQtPmRfbmFtZVsxXSA9PSAnXDAnCisJCXx8IChkLT5kX25hbWVbMV0gPT0gJy4nICYmIGQtPmRfbmFtZVsyXSA9PSAnXDAnKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoY2hhciAqKipuYW1lcywgaW50ICpsZW4pCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpbnQgaSwgcmM7CisJc3RydWN0IGRpcmVudCAqKm5hbWVsaXN0OworCWNoYXIgKipuOworCisJYXNzZXJ0KGxlbik7CisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMlcyIsIHNlbGludXhfbW50LCBTRUxJTlVYX0JPT0xfRElSKTsKKwkqbGVuID0gc2NhbmRpcihwYXRoLCAmbmFtZWxpc3QsICZmaWxlbmFtZV9zZWxlY3QsIGFscGhhc29ydCk7CisJaWYgKCpsZW4gPD0gMCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJbiA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSAqICpsZW4pOworCWlmICghbikgeworCQlyYyA9IC0xOworCQlnb3RvIGJhZDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKSB7CisJICAgICAgICBuW2ldID0gc3RyZHVwKG5hbWVsaXN0W2ldLT5kX25hbWUpOworCQlpZiAoIW5baV0pIHsKKwkJCXJjID0gLTE7CisJCQlnb3RvIGJhZF9mcmVlbjsKKwkJfQorCX0KKwlyYyA9IDA7CisJKm5hbWVzID0gbjsKKyAgICAgIG91dDoKKwlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKSB7CisJCWZyZWUobmFtZWxpc3RbaV0pOworCX0KKwlmcmVlKG5hbWVsaXN0KTsKKwlyZXR1cm4gcmM7CisgICAgICBiYWRfZnJlZW46CisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKQorCQlmcmVlKG5baV0pOworCWZyZWUobik7CisgICAgICBiYWQ6CisJZ290byBvdXQ7Cit9CisKK2hpZGRlbl9kZWYoc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMpCisjZGVmaW5lIFNUUkJVRl9TSVpFIDMKK3N0YXRpYyBpbnQgZ2V0X2Jvb2xfdmFsdWUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKmJ1ZikKK3sKKwlpbnQgZmQsIGxlbjsKKwljaGFyICpmbmFtZSA9IE5VTEw7CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJKmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqIChTVFJCVUZfU0laRSArIDEpKTsKKwlpZiAoISpidWYpCisJCWdvdG8gb3V0OworCSgqYnVmKVtTVFJCVUZfU0laRV0gPSAwOworCisJbGVuID0gc3RybGVuKG5hbWUpICsgc3RybGVuKHNlbGludXhfbW50KSArIHNpemVvZihTRUxJTlVYX0JPT0xfRElSKTsKKwlmbmFtZSA9IChjaGFyICopbWFsbG9jKHNpemVvZihjaGFyKSAqIGxlbik7CisJaWYgKCFmbmFtZSkKKwkJZ290byBvdXQ7CisJc25wcmludGYoZm5hbWUsIGxlbiwgIiVzJXMlcyIsIHNlbGludXhfbW50LCBTRUxJTlVYX0JPT0xfRElSLCBuYW1lKTsKKworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCWdvdG8gb3V0OworCisJbGVuID0gcmVhZChmZCwgKmJ1ZiwgU1RSQlVGX1NJWkUpOworCWNsb3NlKGZkKTsKKwlpZiAobGVuICE9IFNUUkJVRl9TSVpFKQorCQlnb3RvIG91dDsKKworCWZyZWUoZm5hbWUpOworCXJldHVybiAwOworICAgICAgb3V0OgorCWlmICgqYnVmKQorCQlmcmVlKCpidWYpOworCWlmIChmbmFtZSkKKwkJZnJlZShmbmFtZSk7CisJcmV0dXJuIC0xOworfQorCitpbnQgc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZyhjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmJ1ZjsKKwlpbnQgdmFsOworCisJaWYgKGdldF9ib29sX3ZhbHVlKG5hbWUsICZidWYpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYXRvaSgmYnVmWzFdKSkKKwkJdmFsID0gMTsKKwllbHNlCisJCXZhbCA9IDA7CisJZnJlZShidWYpOworCXJldHVybiB2YWw7Cit9CisKK2ludCBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpidWY7CisJaW50IHZhbDsKKworCWlmIChnZXRfYm9vbF92YWx1ZShuYW1lLCAmYnVmKSkKKwkJcmV0dXJuIC0xOworCisJYnVmWzFdID0gJ1wwJzsKKwlpZiAoYXRvaShidWYpKQorCQl2YWwgPSAxOworCWVsc2UKKwkJdmFsID0gMDsKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHZhbDsKK30KKworaGlkZGVuX2RlZihzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUpCisKK2ludCBzZWN1cml0eV9zZXRfYm9vbGVhbihjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCit7CisJaW50IGZkLCByZXQsIGxlbjsKKwljaGFyIGJ1ZlsyXSwgKmZuYW1lOworCisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMSkgeworCQllcnJubyA9IEVJTlZBTDsKKwkJcmV0dXJuIC0xOworCX0KKworCWxlbiA9IHN0cmxlbihuYW1lKSArIHN0cmxlbihzZWxpbnV4X21udCkgKyBzaXplb2YoU0VMSU5VWF9CT09MX0RJUik7CisJZm5hbWUgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOworCWlmICghZm5hbWUpCisJCXJldHVybiAtMTsKKwlzbnByaW50ZihmbmFtZSwgbGVuLCAiJXMlcyVzIiwgc2VsaW51eF9tbnQsIFNFTElOVVhfQk9PTF9ESVIsIG5hbWUpOworCisJZmQgPSBvcGVuKGZuYW1lLCBPX1dST05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHZhbHVlKQorCQlidWZbMF0gPSAnMSc7CisJZWxzZQorCQlidWZbMF0gPSAnMCc7CisJYnVmWzFdID0gJ1wwJzsKKworCXJldCA9IHdyaXRlKGZkLCBidWYsIDIpOworCWNsb3NlKGZkKTsKKyAgICAgIG91dDoKKwlmcmVlKGZuYW1lKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK2hpZGRlbl9kZWYoc2VjdXJpdHlfc2V0X2Jvb2xlYW4pCisKK2ludCBzZWN1cml0eV9jb21taXRfYm9vbGVhbnModm9pZCkKK3sKKwlpbnQgZmQsIHJldDsKKwljaGFyIGJ1ZlsyXTsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMvY29tbWl0X3BlbmRpbmdfYm9vbHMiLCBzZWxpbnV4X21udCk7CisJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlidWZbMF0gPSAnMSc7CisJYnVmWzFdID0gJ1wwJzsKKworCXJldCA9IHdyaXRlKGZkLCBidWYsIDIpOworCWNsb3NlKGZkKTsKKworCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworaGlkZGVuX2RlZihzZWN1cml0eV9jb21taXRfYm9vbGVhbnMpCisKK3N0YXRpYyB2b2lkIHJvbGxiYWNrKFNFTGJvb2xlYW4gKiBib29sbGlzdCwgaW50IGVuZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBlbmQ7IGkrKykKKwkJc2VjdXJpdHlfc2V0X2Jvb2xlYW4oYm9vbGxpc3RbaV0ubmFtZSwKKwkJCQkgICAgIHNlY3VyaXR5X2dldF9ib29sZWFuX2FjdGl2ZShib29sbGlzdFtpXS4KKwkJCQkJCQkJIG5hbWUpKTsKK30KKworaW50IHNlY3VyaXR5X3NldF9ib29sZWFuX2xpc3Qoc2l6ZV90IGJvb2xjbnQsIFNFTGJvb2xlYW4gKiBjb25zdCBib29sbGlzdCwKKwkJCSAgICAgIGludCBwZXJtYW5lbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisKKwlzaXplX3QgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYm9vbGNudDsgaSsrKSB7CisJCWlmIChzZWN1cml0eV9zZXRfYm9vbGVhbihib29sbGlzdFtpXS5uYW1lLCBib29sbGlzdFtpXS52YWx1ZSkpIHsKKwkJCXJvbGxiYWNrKGJvb2xsaXN0LCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qIE9LLCBsZXQncyBkbyB0aGUgY29tbWl0ICovCisJaWYgKHNlY3VyaXR5X2NvbW1pdF9ib29sZWFucygpKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY2FsbGJhY2tzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NhbGxiYWNrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzY2Y5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NhbGxiYWNrcy5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogVXNlci1zdXBwbGllZCBjYWxsYmFja3MgYW5kIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgorICogQ2xhc3MgYW5kIHBlcm1pc3Npb24gbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlICJjYWxsYmFja3MuaCIKKworLyogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgKi8KK3N0YXRpYyBpbnQgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSkKK2RlZmF1bHRfc2VsaW51eF9sb2coaW50IHR5cGUgX19hdHRyaWJ1dGVfXygodW51c2VkKSksIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWludCByYzsKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJjID0gdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorZGVmYXVsdF9zZWxpbnV4X2F1ZGl0KHZvaWQgKnB0ciBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgc2VjdXJpdHlfY2xhc3NfdCBjbHMgX19hdHRyaWJ1dGVfXygodW51c2VkKSksCisJCSAgICAgIGNoYXIgKmJ1ZiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKKwkJICAgICAgc2l6ZV90IGxlbiBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGVmYXVsdF9zZWxpbnV4X3ZhbGlkYXRlKGNoYXIgKipjdHgpCit7CisJcmV0dXJuIHNlY3VyaXR5X2NoZWNrX2NvbnRleHQoKmN0eCk7Cit9CisKK3N0YXRpYyBpbnQKK2RlZmF1bHRfc2VsaW51eF9zZXRlbmZvcmNlKGludCBlbmZvcmNpbmcgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlZmF1bHRfc2VsaW51eF9wb2xpY3lsb2FkKGludCBzZXFubyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2sgcG9pbnRlcnMgKi8KK2ludCBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorKCpzZWxpbnV4X2xvZykoaW50LCBjb25zdCBjaGFyICosIC4uLikgPQorCWRlZmF1bHRfc2VsaW51eF9sb2c7CisKK2ludAorKCpzZWxpbnV4X2F1ZGl0KSAodm9pZCAqLCBzZWN1cml0eV9jbGFzc190LCBjaGFyICosIHNpemVfdCkgPQorCWRlZmF1bHRfc2VsaW51eF9hdWRpdDsKKworaW50CisoKnNlbGludXhfdmFsaWRhdGUpKGNoYXIgKipjdHgpID0KKwlkZWZhdWx0X3NlbGludXhfdmFsaWRhdGU7CisKK2ludAorKCpzZWxpbnV4X25ldGxpbmtfc2V0ZW5mb3JjZSkgKGludCBlbmZvcmNpbmcpID0KKwlkZWZhdWx0X3NlbGludXhfc2V0ZW5mb3JjZTsKKworaW50CisoKnNlbGludXhfbmV0bGlua19wb2xpY3lsb2FkKSAoaW50IHNlcW5vKSA9CisJZGVmYXVsdF9zZWxpbnV4X3BvbGljeWxvYWQ7CisKKy8qIGNhbGxiYWNrIHNldHRpbmcgZnVuY3Rpb24gKi8KK3ZvaWQKK3NlbGludXhfc2V0X2NhbGxiYWNrKGludCB0eXBlLCB1bmlvbiBzZWxpbnV4X2NhbGxiYWNrIGNiKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0VMSU5VWF9DQl9MT0c6CisJCXNlbGludXhfbG9nID0gY2IuZnVuY19sb2c7CisJCWJyZWFrOworCWNhc2UgU0VMSU5VWF9DQl9BVURJVDoKKwkJc2VsaW51eF9hdWRpdCA9IGNiLmZ1bmNfYXVkaXQ7CisJCWJyZWFrOworCWNhc2UgU0VMSU5VWF9DQl9WQUxJREFURToKKwkJc2VsaW51eF92YWxpZGF0ZSA9IGNiLmZ1bmNfdmFsaWRhdGU7CisJCWJyZWFrOworCWNhc2UgU0VMSU5VWF9DQl9TRVRFTkZPUkNFOgorCQlzZWxpbnV4X25ldGxpbmtfc2V0ZW5mb3JjZSA9IGNiLmZ1bmNfc2V0ZW5mb3JjZTsKKwkJYnJlYWs7CisJY2FzZSBTRUxJTlVYX0NCX1BPTElDWUxPQUQ6CisJCXNlbGludXhfbmV0bGlua19wb2xpY3lsb2FkID0gY2IuZnVuY19wb2xpY3lsb2FkOworCQlicmVhazsKKwl9Cit9CisKKy8qIGNhbGxiYWNrIGdldHRpbmcgZnVuY3Rpb24gKi8KK3VuaW9uIHNlbGludXhfY2FsbGJhY2sKK3NlbGludXhfZ2V0X2NhbGxiYWNrKGludCB0eXBlKQoreworCXVuaW9uIHNlbGludXhfY2FsbGJhY2sgY2I7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNFTElOVVhfQ0JfTE9HOgorCQljYi5mdW5jX2xvZyA9IHNlbGludXhfbG9nOworCQlicmVhazsKKwljYXNlIFNFTElOVVhfQ0JfQVVESVQ6CisJCWNiLmZ1bmNfYXVkaXQgPSBzZWxpbnV4X2F1ZGl0OworCQlicmVhazsKKwljYXNlIFNFTElOVVhfQ0JfVkFMSURBVEU6CisJCWNiLmZ1bmNfdmFsaWRhdGUgPSBzZWxpbnV4X3ZhbGlkYXRlOworCQlicmVhazsKKwljYXNlIFNFTElOVVhfQ0JfU0VURU5GT1JDRToKKwkJY2IuZnVuY19zZXRlbmZvcmNlID0gc2VsaW51eF9uZXRsaW5rX3NldGVuZm9yY2U7CisJCWJyZWFrOworCWNhc2UgU0VMSU5VWF9DQl9QT0xJQ1lMT0FEOgorCQljYi5mdW5jX3BvbGljeWxvYWQgPSBzZWxpbnV4X25ldGxpbmtfcG9saWN5bG9hZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CisJCWVycm5vID0gRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGNiOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jYWxsYmFja3MuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY2FsbGJhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NzJlMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY2FsbGJhY2tzLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGNhbGxiYWNrcyBwYXNzZWQgdG8gc2VsaW51eF9pbml0KCkgYW5kIGF2YWlsYWJsZQorICogZm9yIHVzZSBmcm9tIHRoZSBsaWJyYXJ5IGNvZGUuICBUaGV5IGFsbCBoYXZlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zLgorICovCisjaWZuZGVmIF9TRUxJTlVYX0NBTExCQUNLU19IXworI2RlZmluZSBfU0VMSU5VWF9DQUxMQkFDS1NfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSAiZHNvLmgiCisKKy8qIGNhbGxiYWNrIHBvaW50ZXJzICovCitleHRlcm4gaW50IF9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpCisoKnNlbGludXhfbG9nKSAoaW50IHR5cGUsIGNvbnN0IGNoYXIgKiwgLi4uKSBoaWRkZW47CisKK2V4dGVybiBpbnQKKygqc2VsaW51eF9hdWRpdCkgKHZvaWQgKiwgc2VjdXJpdHlfY2xhc3NfdCwgY2hhciAqLCBzaXplX3QpIGhpZGRlbjsKKworZXh0ZXJuIGludAorKCpzZWxpbnV4X3ZhbGlkYXRlKShjaGFyICoqY3R4KSBoaWRkZW47CisKK2V4dGVybiBpbnQKKygqc2VsaW51eF9uZXRsaW5rX3NldGVuZm9yY2UpIChpbnQgZW5mb3JjaW5nKSBoaWRkZW47CisKK2V4dGVybiBpbnQKKygqc2VsaW51eF9uZXRsaW5rX3BvbGljeWxvYWQpIChpbnQgc2Vxbm8pIGhpZGRlbjsKKworI2VuZGlmCQkJCS8qIF9TRUxJTlVYX0NBTExCQUNLU19IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jYW5vbmljYWxpemVfY29udGV4dC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jYW5vbmljYWxpemVfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Zjg3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2Nhbm9uaWNhbGl6ZV9jb250ZXh0LmMKQEAgLTAsMCArMSw2MiBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50IHNlY3VyaXR5X2Nhbm9uaWNhbGl6ZV9jb250ZXh0KGNvbnN0IGNoYXIgKiBjb24sCisJCQkJICAgICAgY2hhciAqKiBjYW5vbmNvbikKK3sKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgKmJ1ZjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZmQsIHJldDsKKworCWlmICghc2VsaW51eF9tbnQpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAtMTsKKwl9CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzL2NvbnRleHQiLCBzZWxpbnV4X21udCk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJc2l6ZSA9IHNlbGludXhfcGFnZV9zaXplOworCWJ1ZiA9IG1hbGxvYyhzaXplKTsKKwlpZiAoIWJ1ZikgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCXN0cm5jcHkoYnVmLCBjb24sIHNpemUpOworCisJcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikgKyAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQyOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisJcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplIC0gMSk7CisJaWYgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVkFMKSB7CisJCS8qIEZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBmb3Iga2VybmVscworCQkgICB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBleHRlbmRlZCBpbnRlcmZhY2UuICovCisJCXN0cm5jcHkoYnVmLCBjb24sIHNpemUpOworCX0KKworCSpjYW5vbmNvbiA9IHN0cmR1cChidWYpOworCWlmICghKCpjYW5vbmNvbikpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0MjsKKwl9CisJcmV0ID0gMDsKKyAgICAgIG91dDI6CisJZnJlZShidWYpOworICAgICAgb3V0OgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NoZWNrQWNjZXNzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NoZWNrQWNjZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiMjJkOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY2hlY2tBY2Nlc3MuYwpAQCAtMCwwICsxLDQxIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSA8c2VsaW51eC9hdmMuaD4KKworc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKK3N0YXRpYyBpbnQgc2VsaW51eF9lbmFibGVkOworCitzdGF0aWMgdm9pZCBhdmNfaW5pdF9vbmNlKHZvaWQpCit7CisJc2VsaW51eF9lbmFibGVkID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisJaWYgKHNlbGludXhfZW5hYmxlZCA9PSAxKQorCQlhdmNfb3BlbihOVUxMLCAwKTsKK30KKworaW50IHNlbGludXhfY2hlY2tfYWNjZXNzKGNvbnN0IGNoYXIgKiBzY29uLCBjb25zdCBjaGFyICogdGNvbiwgY29uc3QgY2hhciAqY2xhc3MsIGNvbnN0IGNoYXIgKnBlcm0sIHZvaWQgKmF1eCkgeworCWludCBzdGF0dXMgPSAtMTsKKwlpbnQgcmMgPSAtMTsKKwlzZWN1cml0eV9pZF90IHNjb25faWQ7CisJc2VjdXJpdHlfaWRfdCB0Y29uX2lkOworCXNlY3VyaXR5X2NsYXNzX3Qgc2NsYXNzOworCWFjY2Vzc192ZWN0b3JfdCBhdjsKKworCV9fc2VsaW51eF9vbmNlKG9uY2UsIGF2Y19pbml0X29uY2UpOworCisJaWYgKHNlbGludXhfZW5hYmxlZCAhPSAxKQorCQlyZXR1cm4gMDsKKworCWlmICgocmMgPSBhdmNfY29udGV4dF90b19zaWQoc2NvbiwgJnNjb25faWQpKSA8IDApICByZXR1cm4gcmM7CisKKwlpZiAoKHJjID0gYXZjX2NvbnRleHRfdG9fc2lkKHRjb24sICZ0Y29uX2lkKSkgPCAwKSAgcmV0dXJuIHJjOworCisJaWYgKChzY2xhc3MgPSBzdHJpbmdfdG9fc2VjdXJpdHlfY2xhc3MoY2xhc3MpKSA9PSAwKSByZXR1cm4gc3RhdHVzOworCisJaWYgKChhdiA9IHN0cmluZ190b19hdl9wZXJtKHNjbGFzcywgcGVybSkpID09IDApIHJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gYXZjX2hhc19wZXJtIChzY29uX2lkLCB0Y29uX2lkLCBzY2xhc3MsIGF2LCBOVUxMLCBhdXgpOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NoZWNrX2NvbnRleHQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY2hlY2tfY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NzExOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NoZWNrX2NvbnRleHQuYwpAQCAtMCwwICsxLDMzIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQgc2VjdXJpdHlfY2hlY2tfY29udGV4dChjb25zdCBjaGFyICogY29uKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGZkLCByZXQ7CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9jb250ZXh0Iiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXJldCA9IHdyaXRlKGZkLCBjb24sIHN0cmxlbihjb24pICsgMSk7CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY29tcHV0ZV9hdi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jb21wdXRlX2F2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmNzZmOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY29tcHV0ZV9hdi5jCkBAIC0wLDAgKzEsNzIgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAibWFwcGluZy5oIgorCitpbnQgc2VjdXJpdHlfY29tcHV0ZV9hdihjb25zdCBjaGFyICogc2NvbiwKKwkJCWNvbnN0IGNoYXIgKiB0Y29uLAorCQkJc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsCisJCQlhY2Nlc3NfdmVjdG9yX3QgcmVxdWVzdGVkLAorCQkJc3RydWN0IGF2X2RlY2lzaW9uICphdmQpCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyICpidWY7CisJc2l6ZV90IGxlbjsKKwlpbnQgZmQsIHJldDsKKworCWlmICghc2VsaW51eF9tbnQpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAtMTsKKwl9CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzL2FjY2VzcyIsIHNlbGludXhfbW50KTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlsZW4gPSBzZWxpbnV4X3BhZ2Vfc2l6ZTsKKwlidWYgPSBtYWxsb2MobGVuKTsKKwlpZiAoIWJ1ZikgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJc25wcmludGYoYnVmLCBsZW4sICIlcyAlcyAlaHUgJXgiLCBzY29uLCB0Y29uLAorCQkgdW5tYXBfY2xhc3ModGNsYXNzKSwgdW5tYXBfcGVybSh0Y2xhc3MsIHJlcXVlc3RlZCkpOworCisJcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDI7CisKKwltZW1zZXQoYnVmLCAwLCBsZW4pOworCXJldCA9IHJlYWQoZmQsIGJ1ZiwgbGVuIC0gMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0MjsKKworCXJldCA9IHNzY2FuZihidWYsICIleCAleCAleCAleCAldSAleCIsCisJCSAgICAgJmF2ZC0+YWxsb3dlZCwgJmF2ZC0+ZGVjaWRlZCwKKwkJICAgICAmYXZkLT5hdWRpdGFsbG93LCAmYXZkLT5hdWRpdGRlbnksCisJCSAgICAgJmF2ZC0+c2Vxbm8sICZhdmQtPmZsYWdzKTsKKwlpZiAocmV0IDwgNSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQyOworCX0gZWxzZSBpZiAocmV0IDwgNikKKwkJYXZkLT5mbGFncyA9IDA7CisKKwltYXBfZGVjaXNpb24odGNsYXNzLCBhdmQpOworCisJcmV0ID0gMDsKKyAgICAgIG91dDI6CisJZnJlZShidWYpOworICAgICAgb3V0OgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NvbXB1dGVfY3JlYXRlLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NvbXB1dGVfY3JlYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiMTZjOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY29tcHV0ZV9jcmVhdGUuYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgIm1hcHBpbmcuaCIKKworaW50IHNlY3VyaXR5X2NvbXB1dGVfY3JlYXRlKGNvbnN0IGNoYXIgKiBzY29uLAorCQkJCWNvbnN0IGNoYXIgKiB0Y29uLAorCQkJCXNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkJCWNoYXIgKiogbmV3Y29uKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplOworCWludCBmZCwgcmV0OworCisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMvY3JlYXRlIiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXNpemUgPSBzZWxpbnV4X3BhZ2Vfc2l6ZTsKKwlidWYgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFidWYpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlzbnByaW50ZihidWYsIHNpemUsICIlcyAlcyAlaHUiLCBzY29uLCB0Y29uLCB1bm1hcF9jbGFzcyh0Y2xhc3MpKTsKKworCXJldCA9IHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQyOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisJcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplIC0gMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0MjsKKworCSpuZXdjb24gPSBzdHJkdXAoYnVmKTsKKwlpZiAoISgqbmV3Y29uKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQyOworCX0KKwlyZXQgPSAwOworICAgICAgb3V0MjoKKwlmcmVlKGJ1Zik7CisgICAgICBvdXQ6CisJY2xvc2UoZmQpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NvbnRleHQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvY29udGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWJlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NvbnRleHQuYwpAQCAtMCwwICsxLDE5NyBAQAorI2luY2x1ZGUgImNvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgQ09NUF9VU0VSICAwCisjZGVmaW5lIENPTVBfUk9MRSAgMQorI2RlZmluZSBDT01QX1RZUEUgIDIKKyNkZWZpbmUgQ09NUF9SQU5HRSAzCisKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyICpjdXJyZW50X3N0cjsJLyogVGhpcyBpcyBtYWRlIHVwLXRvLWRhdGUgb25seSB3aGVuIG5lZWRlZCAqLworCWNoYXIgKihjb21wb25lbnRbNF0pOworfSBjb250ZXh0X3ByaXZhdGVfdDsKKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGNvbnRleHQsIGluaXRpYWxpemVkIGZyb20gc3RyLiAgVGhlcmUgbXVzdCBiZSAzIG9yCisgKiA0IGNvbG9uLXNlcGFyYXRlZCBjb21wb25lbnRzIGFuZCBubyB3aGl0ZXNwYWNlIGluIGFueSBjb21wb25lbnQgb3RoZXIKKyAqIHRoYW4gdGhlIE1MUyBjb21wb25lbnQuCisgKi8KK2NvbnRleHRfdCBjb250ZXh0X25ldyhjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGksIGNvdW50OworCWVycm5vID0gMDsKKwljb250ZXh0X3ByaXZhdGVfdCAqbiA9CisJICAgIChjb250ZXh0X3ByaXZhdGVfdCAqKSBtYWxsb2Moc2l6ZW9mKGNvbnRleHRfcHJpdmF0ZV90KSk7CisJY29udGV4dF90IHJlc3VsdCA9IChjb250ZXh0X3QpIG1hbGxvYyhzaXplb2YoY29udGV4dF9zX3QpKTsKKwljb25zdCBjaGFyICpwLCAqdG9rOworCisJaWYgKHJlc3VsdCkKKwkJcmVzdWx0LT5wdHIgPSBuOworCWVsc2UKKwkJZnJlZShuKTsKKwlpZiAobiA9PSAwIHx8IHJlc3VsdCA9PSAwKSB7CisJCWdvdG8gZXJyOworCX0KKwluLT5jdXJyZW50X3N0ciA9IG4tPmNvbXBvbmVudFswXSA9IG4tPmNvbXBvbmVudFsxXSA9IG4tPmNvbXBvbmVudFsyXSA9CisJICAgIG4tPmNvbXBvbmVudFszXSA9IDA7CisJZm9yIChpID0gY291bnQgPSAwLCBwID0gc3RyOyAqcDsgcCsrKSB7CisJCXN3aXRjaCAoKnApIHsKKwkJY2FzZSAnOic6CisJCQljb3VudCsrOworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJY2FzZSAnXHQnOgorCQljYXNlICdccic6CisJCQlnb3RvIGVycjsJLyogc2FuaXR5IGNoZWNrICovCisJCWNhc2UgJyAnOgorCQkJaWYgKGNvdW50IDwgMykKKwkJCQlnb3RvIGVycjsJLyogc2FuaXR5IGNoZWNrICovCisJCX0KKwl9CisJLyoKKwkgKiBDb3VsZCBiZSBhbnl3aGVyZSBmcm9tIDIgLSA1CisJICogZS5nIHVzZXI6cm9sZTp0eXBlIHRvIHVzZXI6cm9sZTp0eXBlOnNlbnMxOmNhdGEtc2VuczI6Y2F0YgorCSAqLworCWlmIChjb3VudCA8IDIgfHwgY291bnQgPiA1KSB7CS8qIG1pZ2h0IG5vdCBoYXZlIGEgcmFuZ2UgKi8KKwkJZ290byBlcnI7CisJfQorCisJbi0+Y29tcG9uZW50WzNdID0gMDsKKwlmb3IgKGkgPSAwLCB0b2sgPSBzdHI7ICp0b2s7IGkrKykgeworCQlpZiAoaSA8IDMpCisJCQlmb3IgKHAgPSB0b2s7ICpwICYmICpwICE9ICc6JzsgcCsrKSB7CS8qIGVtcHR5ICovCisJCX0gZWxzZSB7CisJCQkvKiBNTFMgcmFuZ2UgaXMgb25lIGNvbXBvbmVudCAqLworCQkJZm9yIChwID0gdG9rOyAqcDsgcCsrKSB7CS8qIGVtcHR5ICovCisJCQl9CisJCX0KKwkJbi0+Y29tcG9uZW50W2ldID0gKGNoYXIgKiltYWxsb2MocCAtIHRvayArIDEpOworCQlpZiAobi0+Y29tcG9uZW50W2ldID09IDApCisJCQlnb3RvIGVycjsKKwkJc3RybmNweShuLT5jb21wb25lbnRbaV0sIHRvaywgcCAtIHRvayk7CisJCW4tPmNvbXBvbmVudFtpXVtwIC0gdG9rXSA9ICdcMCc7CisJCXRvayA9ICpwID8gcCArIDEgOiBwOworCX0KKwlyZXR1cm4gcmVzdWx0OworICAgICAgZXJyOgorCWlmIChlcnJubyA9PSAwKSBlcnJubyA9IEVJTlZBTDsKKwljb250ZXh0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaGlkZGVuX2RlZihjb250ZXh0X25ldykKKworc3RhdGljIHZvaWQgY29uZGl0aW9uYWxfZnJlZShjaGFyICoqdikKK3sKKwlpZiAoKnYpIHsKKwkJZnJlZSgqdik7CisJfQorCSp2ID0gMDsKK30KKworLyoKKyAqIGZyZWUgYWxsIHN0b3JhZ2UgdXNlZCBieSBhIGNvbnRleHQuICBTYWZlIHRvIGNhbGwgd2l0aAorICogbnVsbCBwb2ludGVyLiAKKyAqLwordm9pZCBjb250ZXh0X2ZyZWUoY29udGV4dF90IGNvbnRleHQpCit7CisJY29udGV4dF9wcml2YXRlX3QgKm47CisJaW50IGk7CisJaWYgKGNvbnRleHQpIHsKKwkJbiA9IGNvbnRleHQtPnB0cjsKKwkJaWYgKG4pIHsKKwkJCWNvbmRpdGlvbmFsX2ZyZWUoJm4tPmN1cnJlbnRfc3RyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCQljb25kaXRpb25hbF9mcmVlKCZuLT5jb21wb25lbnRbaV0pOworCQkJfQorCQkJZnJlZShuKTsKKwkJfQorCQlmcmVlKGNvbnRleHQpOworCX0KK30KKworaGlkZGVuX2RlZihjb250ZXh0X2ZyZWUpCisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGNvbnRleHQuCisgKi8KK2NoYXIgKmNvbnRleHRfc3RyKGNvbnRleHRfdCBjb250ZXh0KQoreworCWNvbnRleHRfcHJpdmF0ZV90ICpuID0gY29udGV4dC0+cHRyOworCWludCBpOworCXNpemVfdCB0b3RhbCA9IDA7CisJY29uZGl0aW9uYWxfZnJlZSgmbi0+Y3VycmVudF9zdHIpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKG4tPmNvbXBvbmVudFtpXSkgeworCQkJdG90YWwgKz0gc3RybGVuKG4tPmNvbXBvbmVudFtpXSkgKyAxOworCQl9CisJfQorCW4tPmN1cnJlbnRfc3RyID0gbWFsbG9jKHRvdGFsKTsKKwlpZiAobi0+Y3VycmVudF9zdHIgIT0gMCkgeworCQljaGFyICpjcCA9IG4tPmN1cnJlbnRfc3RyOworCisJCXN0cmNweShjcCwgbi0+Y29tcG9uZW50WzBdKTsKKwkJY3AgKz0gc3RybGVuKGNwKTsKKwkJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQkJaWYgKG4tPmNvbXBvbmVudFtpXSkgeworCQkJCSpjcCsrID0gJzonOworCQkJCXN0cmNweShjcCwgbi0+Y29tcG9uZW50W2ldKTsKKwkJCQljcCArPSBzdHJsZW4oY3ApOworCQkJfQorCQl9CisJfQorCXJldHVybiBuLT5jdXJyZW50X3N0cjsKK30KKworaGlkZGVuX2RlZihjb250ZXh0X3N0cikKKworLyogUmV0dXJucyBub256ZXJvIGlmZiBmYWlsZWQgKi8KK3N0YXRpYyBpbnQgc2V0X2NvbXAoY29udGV4dF9wcml2YXRlX3QgKiBuLCBpbnQgaWR4LCBjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqdCA9IE5VTEw7CisJY29uc3QgY2hhciAqcDsKKwlpZiAoc3RyKSB7CisJCXQgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3RyKSArIDEpOworCQlpZiAoIXQpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWZvciAocCA9IHN0cjsgKnA7IHArKykgeworCQkJaWYgKCpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInIHx8CisJCQkgICAgKCgqcCA9PSAnOicgfHwgKnAgPT0gJyAnKSAmJiBpZHggIT0gQ09NUF9SQU5HRSkpIHsKKwkJCQlmcmVlKHQpOworCQkJCWVycm5vID0gRUlOVkFMOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCXN0cmNweSh0LCBzdHIpOworCX0KKwljb25kaXRpb25hbF9mcmVlKCZuLT5jb21wb25lbnRbaWR4XSk7CisJbi0+Y29tcG9uZW50W2lkeF0gPSB0OworCXJldHVybiAwOworfQorCisjZGVmaW5lIGRlZl9nZXQobmFtZSx0YWcpIFwKK2NvbnN0IGNoYXIgKiBjb250ZXh0XyAjIyBuYW1lICMjIF9nZXQoY29udGV4dF90IGNvbnRleHQpIFwKK3sgXAorICAgICAgICBjb250ZXh0X3ByaXZhdGVfdCAqbiA9IGNvbnRleHQtPnB0cjsgXAorICAgICAgICByZXR1cm4gbi0+Y29tcG9uZW50W3RhZ107IFwKK30gXAoraGlkZGVuX2RlZihjb250ZXh0XyAjIyBuYW1lICMjIF9nZXQpCisKK2RlZl9nZXQodHlwZSwgQ09NUF9UWVBFKQorICAgIGRlZl9nZXQodXNlciwgQ09NUF9VU0VSKQorICAgIGRlZl9nZXQocmFuZ2UsIENPTVBfUkFOR0UpCisgICAgZGVmX2dldChyb2xlLCBDT01QX1JPTEUpCisjZGVmaW5lIGRlZl9zZXQobmFtZSx0YWcpIFwKK2ludCBjb250ZXh0XyAjIyBuYW1lICMjIF9zZXQoY29udGV4dF90IGNvbnRleHQsIGNvbnN0IGNoYXIqIHN0cikgXAoreyBcCisgICAgICAgIHJldHVybiBzZXRfY29tcChjb250ZXh0LT5wdHIsdGFnLHN0cik7XAorfSBcCitoaWRkZW5fZGVmKGNvbnRleHRfICMjIG5hbWUgIyMgX3NldCkKKyAgICBkZWZfc2V0KHR5cGUsIENPTVBfVFlQRSkKKyAgICBkZWZfc2V0KHJvbGUsIENPTVBfUk9MRSkKKyAgICBkZWZfc2V0KHVzZXIsIENPTVBfVVNFUikKKyAgICBkZWZfc2V0KHJhbmdlLCBDT01QX1JBTkdFKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jb250ZXh0X2ludGVybmFsLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2NvbnRleHRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzcxZTgwCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9jb250ZXh0X2ludGVybmFsLmgKQEAgLTAsMCArMSwxNCBAQAorI2luY2x1ZGUgPHNlbGludXgvY29udGV4dC5oPgorI2luY2x1ZGUgImRzby5oIgorCitoaWRkZW5fcHJvdG8oY29udGV4dF9uZXcpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfZnJlZSkKKyAgICBoaWRkZW5fcHJvdG8oY29udGV4dF9zdHIpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfdHlwZV9zZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfdHlwZV9nZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfcm9sZV9zZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfcm9sZV9nZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfdXNlcl9zZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfdXNlcl9nZXQpCisgICAgaGlkZGVuX3Byb3RvKGNvbnRleHRfcmFuZ2Vfc2V0KQorICAgIGhpZGRlbl9wcm90byhjb250ZXh0X3JhbmdlX2dldCkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZGVueV91bmtub3duLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2RlbnlfdW5rbm93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Mzk5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2RlbnlfdW5rbm93bi5jCkBAIC0wLDAgKzEsNDAgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK2ludCBzZWN1cml0eV9kZW55X3Vua25vd24odm9pZCkKK3sKKwlpbnQgZmQsIHJldCwgZGVueV91bmtub3duID0gMDsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgYnVmWzIwXTsKKworCWlmICghc2VsaW51eF9tbnQpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAtMTsKKwl9CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy9kZW55X3Vua25vd24iLCBzZWxpbnV4X21udCk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNzY2FuZihidWYsICIlZCIsICZkZW55X3Vua25vd24pICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBkZW55X3Vua25vd247Cit9CisKK2hpZGRlbl9kZWYoc2VjdXJpdHlfZGVueV91bmtub3duKTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZGlzYWJsZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9kaXNhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjMGY1YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZGlzYWJsZS5jCkBAIC0wLDAgKzEsMzggQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKK2ludCBzZWN1cml0eV9kaXNhYmxlKHZvaWQpCit7CisJaW50IGZkLCByZXQ7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZlsyMF07CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9kaXNhYmxlIiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJYnVmWzBdID0gJzEnOworCWJ1ZlsxXSA9ICdcMCc7CisJcmV0ID0gd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK2hpZGRlbl9kZWYoc2VjdXJpdHlfZGlzYWJsZSkKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZHNvLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2Rzby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzNkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2Rzby5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX1NFTElOVVhfRFNPX0gKKyNkZWZpbmUgX1NFTElOVVhfRFNPX0gJMQorCisjaWZkZWYgU0hBUkVECisjIGRlZmluZSBoaWRkZW4gX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCisjIGRlZmluZSBoaWRkZW5fcHJvdG8oZmN0KSBfX2hpZGRlbl9wcm90byAoZmN0LCBmY3QjI19pbnRlcm5hbCkKKyMgZGVmaW5lIF9faGlkZGVuX3Byb3RvKGZjdCwgaW50ZXJuYWwpCVwKKyAgICAgZXh0ZXJuIF9fdHlwZW9mIChmY3QpIGludGVybmFsOwlcCisgICAgIGV4dGVybiBfX3R5cGVvZiAoZmN0KSBmY3QgX19hc20gKCNpbnRlcm5hbCkgaGlkZGVuOworIyBpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX21pcHNfXykKKyMgIGRlZmluZSBoaWRkZW5fZGVmKGZjdCkgXAorICAgICBhc20gKCIuZ2xvYmwgIiAjZmN0ICJcbiIgI2ZjdCAiID0gIiAjZmN0ICJfaW50ZXJuYWwiKTsKKyMgZWxzZQorIyAgZGVmaW5lIGhpZGRlbl9kZWYoZmN0KSBcCisgICAgIGFzbSAoIi5nbG9ibCAiICNmY3QgIlxuLnNldCAiICNmY3QgIiwgIiAjZmN0ICJfaW50ZXJuYWwiKTsKKyNlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIGhpZGRlbgorIyBkZWZpbmUgaGlkZGVuX3Byb3RvKGZjdCkKKyMgZGVmaW5lIGhpZGRlbl9kZWYoZmN0KQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9lbmFibGVkLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2VuYWJsZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjAxNWE0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9lbmFibGVkLmMKQEAgLTAsMCArMSwxMDAgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAicG9saWN5LmgiCisKK2ludCBpc19zZWxpbnV4X2VuYWJsZWQodm9pZCkKK3sKKwljaGFyIGJ1ZltCVUZTSVpdOworCUZJTEUgKmZwOworCWNoYXIgKmJ1ZnA7CisJaW50IGVuYWJsZWQgPSAwOworCWNoYXIgKiBjb247CisKKwkvKiBpbml0X3NlbGludXhtbnQoKSBnZXRzIGNhbGxlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbi4gV2UKKyAJICogd2lsbCBhc3N1bWUgdGhhdCBpZiBhIHNlbGludXggZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCwgdGhlbgorIAkgKiBzZWxpbnV4IGlzIGVuYWJsZWQuICovCisJaWYgKHNlbGludXhfbW50KSB7CisKKwkJLyogU2luY2UgYSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLCB3ZSBjb25zaWRlciBzZWxpbnV4CisJCSAqIGVuYWJsZWQuIElmIGdldGNvbiBmYWlscywgc2VsaW51eCBpcyBzdGlsbCBlbmFibGVkLgorCQkgKiBXZSBvbmx5IGNvbnNpZGVyIGl0IGRpc2FibGVkIGlmIG5vIHBvbGljeSBpcyBsb2FkZWQuICovCisJCWVuYWJsZWQgPSAxOworCQlpZiAoZ2V0Y29uKCZjb24pID09IDApIHsKKwkJCWlmICghc3RyY21wKGNvbiwgImtlcm5lbCIpKQorCQkJCWVuYWJsZWQgPSAwOworCQkJZnJlZWNvbihjb24pOworCQl9CisJCXJldHVybiBlbmFibGVkOworICAgICAgICB9CisKKwkvKiBEcm9wIGJhY2sgdG8gZGV0ZWN0aW5nIGl0IHRoZSBsb25nIHdheS4gKi8KKwlmcCA9IGZvcGVuKCIvcHJvYy9maWxlc3lzdGVtcyIsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIC0xOworCisJd2hpbGUgKChidWZwID0gZmdldHMoYnVmLCBzaXplb2YgYnVmIC0gMSwgZnApKSAhPSBOVUxMKSB7CisJCWlmIChzdHJzdHIoYnVmLCAic2VsaW51eGZzIikpIHsKKwkJCWVuYWJsZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWJ1ZnApCisJCWdvdG8gb3V0OworCisJLyogU2luY2UgYW4gc2VsaW51eCBmaWxlIHN5c3RlbSBpcyBhdmFpbGFibGUsIHdlIGNvbnNpZGVyCisJICogc2VsaW51eCBlbmFibGVkLiBJZiBnZXRjb24gZmFpbHMsIHNlbGludXggaXMgc3RpbGwKKwkgKiBlbmFibGVkLiBXZSBvbmx5IGNvbnNpZGVyIGl0IGRpc2FibGVkIGlmIG5vIHBvbGljeSBpcyBsb2FkZWQuICovCisJaWYgKGdldGNvbigmY29uKSA9PSAwKSB7CisJCWlmICghc3RyY21wKGNvbiwgImtlcm5lbCIpKQorCQkJZW5hYmxlZCA9IDA7CisJCWZyZWVjb24oY29uKTsKKwl9CisKKyAgICAgIG91dDoKKwlmY2xvc2UoZnApOworCXJldHVybiBlbmFibGVkOworfQorCitoaWRkZW5fZGVmKGlzX3NlbGludXhfZW5hYmxlZCkKKworLyoKKyAqIEZ1bmN0aW9uOiBpc19zZWxpbnV4X21sc19lbmFibGVkKCkKKyAqIFJldHVybjogICAxIG9uIHN1Y2Nlc3MKKyAqCSAgICAgMCBvbiBmYWlsdXJlCisgKi8KK2ludCBpc19zZWxpbnV4X21sc19lbmFibGVkKHZvaWQpCit7CisJY2hhciBidWZbMjBdLCBwYXRoW1BBVEhfTUFYXTsKKwlpbnQgZmQsIHJldCwgZW5hYmxlZCA9IDA7CisKKwlpZiAoIXNlbGludXhfbW50KQorCQlyZXR1cm4gZW5hYmxlZDsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMvbWxzIiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGVuYWJsZWQ7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YgYnVmKTsKKworCWRvIHsKKwkJcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YgYnVmIC0gMSk7CisJfSB3aGlsZSAocmV0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gZW5hYmxlZDsKKworCWlmICghc3RyY21wKGJ1ZiwgIjEiKSkKKwkJZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gZW5hYmxlZDsKK30KKworaGlkZGVuX2RlZihpc19zZWxpbnV4X21sc19lbmFibGVkKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9mZ2V0ZmlsZWNvbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9mZ2V0ZmlsZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2RjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2ZnZXRmaWxlY29uLmMKQEAgLTAsMCArMSw1MSBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMveGF0dHIuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisKK2ludCBmZ2V0ZmlsZWNvbihpbnQgZmQsIGNoYXIgKiogY29udGV4dCkKK3sKKwljaGFyICpidWY7CisJc3NpemVfdCBzaXplOworCXNzaXplX3QgcmV0OworCisJc2l6ZSA9IElOSVRDT05URVhUTEVOICsgMTsKKwlidWYgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKwltZW1zZXQoYnVmLCAwLCBzaXplKTsKKworCXJldCA9IGZnZXR4YXR0cihmZCwgWEFUVFJfTkFNRV9TRUxJTlVYLCBidWYsIHNpemUgLSAxKTsKKwlpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFUkFOR0UpIHsKKwkJY2hhciAqbmV3YnVmOworCisJCXNpemUgPSBmZ2V0eGF0dHIoZmQsIFhBVFRSX05BTUVfU0VMSU5VWCwgTlVMTCwgMCk7CisJCWlmIChzaXplIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXNpemUrKzsKKwkJbmV3YnVmID0gcmVhbGxvYyhidWYsIHNpemUpOworCQlpZiAoIW5ld2J1ZikKKwkJCWdvdG8gb3V0OworCisJCWJ1ZiA9IG5ld2J1ZjsKKwkJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisJCXJldCA9IGZnZXR4YXR0cihmZCwgWEFUVFJfTkFNRV9TRUxJTlVYLCBidWYsIHNpemUgLSAxKTsKKwl9CisgICAgICBvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCS8qIFJlLW1hcCBlbXB0eSBhdHRyaWJ1dGUgdmFsdWVzIHRvIGVycm9ycy4gKi8KKwkJZXJybm8gPSBFT1BOT1RTVVBQOworCQlyZXQgPSAtMTsKKwl9CisJaWYgKHJldCA8IDApCisJCWZyZWUoYnVmKTsKKwllbHNlCisJCSpjb250ZXh0ID0gYnVmOworCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZnJlZWNvbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9mcmVlY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5MGRmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZnJlZWNvbi5jCkBAIC0wLDAgKzEsMTEgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKwordm9pZCBmcmVlY29uKGNoYXIgKiBjb24pCit7CisJZnJlZShjb24pOworfQorCitoaWRkZW5fZGVmKGZyZWVjb24pCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2ZzZXRmaWxlY29uLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2ZzZXRmaWxlY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmODg3NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZnNldGZpbGVjb24uYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy94YXR0ci5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworaW50IGZzZXRmaWxlY29uKGludCBmZCwgY29uc3QgY2hhciAqY29udGV4dCkKK3sKKwlyZXR1cm4gZnNldHhhdHRyKGZkLCBYQVRUUl9OQU1FX1NFTElOVVgsIGNvbnRleHQsIHN0cmxlbihjb250ZXh0KSArIDEsCisJCQkgMCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZ2V0X2luaXRpYWxfY29udGV4dC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9nZXRfaW5pdGlhbF9jb250ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NjNkZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZ2V0X2luaXRpYWxfY29udGV4dC5jCkBAIC0wLDAgKzEsNTUgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNkZWZpbmUgU0VMSU5VWF9JTklUQ09OX0RJUiAiL2luaXRpYWxfY29udGV4dHMvIgorCitpbnQgc2VjdXJpdHlfZ2V0X2luaXRpYWxfY29udGV4dChjb25zdCBjaGFyICogbmFtZSwgY2hhciAqKiBjb24pCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyICpidWY7CisJc2l6ZV90IHNpemU7CisJaW50IGZkLCByZXQ7CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcyVzJXMiLCAKKwkJIHNlbGludXhfbW50LCBTRUxJTlVYX0lOSVRDT05fRElSLCBuYW1lKTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXNpemUgPSBzZWxpbnV4X3BhZ2Vfc2l6ZTsKKwlidWYgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFidWYpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoYnVmLCAwLCBzaXplKTsKKwlyZXQgPSByZWFkKGZkLCBidWYsIHNpemUgLSAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQyOworCisJKmNvbiA9IHN0cmR1cChidWYpOworCWlmICghKCpjb24pKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDI7CisJfQorCXJldCA9IDA7CisgICAgICBvdXQyOgorCWZyZWUoYnVmKTsKKyAgICAgIG91dDoKKwljbG9zZShmZCk7CisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9nZXRlbmZvcmNlLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2dldGVuZm9yY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI1MTZhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9nZXRlbmZvcmNlLmMKQEAgLTAsMCArMSw0MCBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworaW50IHNlY3VyaXR5X2dldGVuZm9yY2Uodm9pZCkKK3sKKwlpbnQgZmQsIHJldCwgZW5mb3JjZSA9IDA7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZlsyMF07CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9lbmZvcmNlIiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mIGJ1Zik7CisJcmV0ID0gcmVhZChmZCwgYnVmLCBzaXplb2YgYnVmIC0gMSk7CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmVuZm9yY2UpICE9IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBlbmZvcmNlOworfQorCitoaWRkZW5fZGVmKHNlY3VyaXR5X2dldGVuZm9yY2UpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2dldGZpbGVjb24uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZ2V0ZmlsZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDM3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2dldGZpbGVjb24uYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMveGF0dHIuaD4KKyNpbmNsdWRlICJwb2xpY3kuaCIKKworaW50IGdldGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCwgY2hhciAqKiBjb250ZXh0KQoreworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHNpemU7CisJc3NpemVfdCByZXQ7CisKKwlzaXplID0gSU5JVENPTlRFWFRMRU4gKyAxOworCWJ1ZiA9IG1hbGxvYyhzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCW1lbXNldChidWYsIDAsIHNpemUpOworCisJcmV0ID0gZ2V0eGF0dHIocGF0aCwgWEFUVFJfTkFNRV9TRUxJTlVYLCBidWYsIHNpemUgLSAxKTsKKwlpZiAocmV0IDwgMCAmJiBlcnJubyA9PSBFUkFOR0UpIHsKKwkJY2hhciAqbmV3YnVmOworCisJCXNpemUgPSBnZXR4YXR0cihwYXRoLCBYQVRUUl9OQU1FX1NFTElOVVgsIE5VTEwsIDApOworCQlpZiAoc2l6ZSA8IDApCisJCQlnb3RvIG91dDsKKworCQlzaXplKys7CisJCW5ld2J1ZiA9IHJlYWxsb2MoYnVmLCBzaXplKTsKKwkJaWYgKCFuZXdidWYpCisJCQlnb3RvIG91dDsKKworCQlidWYgPSBuZXdidWY7CisJCW1lbXNldChidWYsIDAsIHNpemUpOworCQlyZXQgPSBnZXR4YXR0cihwYXRoLCBYQVRUUl9OQU1FX1NFTElOVVgsIGJ1Ziwgc2l6ZSAtIDEpOworCX0KKyAgICAgIG91dDoKKwlpZiAocmV0ID09IDApIHsKKwkJLyogUmUtbWFwIGVtcHR5IGF0dHJpYnV0ZSB2YWx1ZXMgdG8gZXJyb3JzLiAqLworCQllcnJubyA9IEVPUE5PVFNVUFA7CisJCXJldCA9IC0xOworCX0KKwlpZiAocmV0IDwgMCkKKwkJZnJlZShidWYpOworCWVsc2UKKwkJKmNvbnRleHQgPSBidWY7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZ2V0cGVlcmNvbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9nZXRwZWVyY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkMjlkYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvZ2V0cGVlcmNvbi5jCkBAIC0wLDAgKzEsNDUgQEAKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworI2lmbmRlZiBTT19QRUVSU0VDCisjZGVmaW5lIFNPX1BFRVJTRUMgMzEKKyNlbmRpZgorCitpbnQgZ2V0cGVlcmNvbihpbnQgZmQsIGNoYXIgKiogY29udGV4dCkKK3sKKwljaGFyICpidWY7CisJc29ja2xlbl90IHNpemU7CisJc3NpemVfdCByZXQ7CisKKwlzaXplID0gSU5JVENPTlRFWFRMRU4gKyAxOworCWJ1ZiA9IG1hbGxvYyhzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC0xOworCW1lbXNldChidWYsIDAsIHNpemUpOworCisJcmV0ID0gZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUEVFUlNFQywgYnVmLCAmc2l6ZSk7CisJaWYgKHJldCA8IDAgJiYgZXJybm8gPT0gRVJBTkdFKSB7CisJCWNoYXIgKm5ld2J1ZjsKKworCQluZXdidWYgPSByZWFsbG9jKGJ1Ziwgc2l6ZSk7CisJCWlmICghbmV3YnVmKQorCQkJZ290byBvdXQ7CisKKwkJYnVmID0gbmV3YnVmOworCQltZW1zZXQoYnVmLCAwLCBzaXplKTsKKwkJcmV0ID0gZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUEVFUlNFQywgYnVmLCAmc2l6ZSk7CisJfQorICAgICAgb3V0OgorCWlmIChyZXQgPCAwKQorCQlmcmVlKGJ1Zik7CisJZWxzZQorCQkqY29udGV4dCA9IGJ1ZjsKKwlyZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2luaXQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmMwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2luaXQuYwpAQCAtMCwwICsxLDEyMyBAQAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2lmZGVmIERBUldJTgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiZHNvLmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSAic2VsaW51eF9pbnRlcm5hbC5oIgorCitjaGFyICpzZWxpbnV4X21udCA9IE5VTEw7CitpbnQgc2VsaW51eF9wYWdlX3NpemUgPSAwOworCitzdGF0aWMgdm9pZCBpbml0X3NlbGludXhtbnQodm9pZCkKK3sKKwljaGFyIGJ1ZltCVUZTSVpdLCAqcDsKKwlGSUxFICpmcD1OVUxMOworCXN0cnVjdCBzdGF0ZnMgc2ZidWY7CisJaW50IHJjOworCWNoYXIgKmJ1ZnA7CisJaW50IGV4aXN0cyA9IDA7CisKKwlpZiAoc2VsaW51eF9tbnQpCisJCXJldHVybjsKKworCS8qIFdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgcHJlZmVycmVkIG1vdW50IHBvaW50IGZvciBzZWxpbnV4IGZpbGUKKwkgKiBzeXN0ZW0gaGFzIGEgc2VsaW51eGZzLiAqLworCWRvIHsKKwkJcmMgPSBzdGF0ZnMoU0VMSU5VWE1OVCwgJnNmYnVmKTsKKwl9IHdoaWxlIChyYyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCWlmIChyYyA9PSAwKSB7CisJCWlmICgodWludDMyX3Qpc2ZidWYuZl90eXBlID09ICh1aW50MzJfdClTRUxJTlVYX01BR0lDKSB7CisJCQlzZWxpbnV4X21udCA9IHN0cmR1cChTRUxJTlVYTU5UKTsKKwkJCXJldHVybjsKKwkJfQorCX0gCisKKwkvKiBEcm9wIGJhY2sgdG8gZGV0ZWN0aW5nIGl0IHRoZSBsb25nIHdheS4gKi8KKwlmcCA9IGZvcGVuKCIvcHJvYy9maWxlc3lzdGVtcyIsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJd2hpbGUgKChidWZwID0gZmdldHMoYnVmLCBzaXplb2YgYnVmIC0gMSwgZnApKSAhPSBOVUxMKSB7CisJCWlmIChzdHJzdHIoYnVmLCAic2VsaW51eGZzIikpIHsKKwkJCWV4aXN0cyA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZXhpc3RzKSAKKwkJZ290byBvdXQ7CisKKwlmY2xvc2UoZnApOworCisJLyogQXQgdGhpcyBwb2ludCwgdGhlIHVzdWFsIHNwb3QgZG9lc24ndCBoYXZlIGFuIHNlbGludXhmcyBzbworCSAqIHdlIGxvb2sgYXJvdW5kIGZvciBpdCAqLworCWZwID0gZm9wZW4oIi9wcm9jL21vdW50cyIsICJyIik7CisJaWYgKCFmcCkKKwkJZ290byBvdXQ7CisKKwl3aGlsZSAoKGJ1ZnAgPSBmZ2V0cyhidWYsIHNpemVvZiBidWYgLSAxLCBmcCkpICE9IE5VTEwpIHsKKwkJY2hhciAqdG1wOworCQlwID0gc3RyY2hyKGJ1ZiwgJyAnKTsKKwkJaWYgKCFwKQorCQkJZ290byBvdXQ7CisJCXArKzsKKwkJdG1wID0gc3RyY2hyKHAsICcgJyk7CisJCWlmICghdG1wKQorCQkJZ290byBvdXQ7CisJCWlmICghc3RybmNtcCh0bXAgKyAxLCAic2VsaW51eGZzICIsIDEwKSkgeworCQkJKnRtcCA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElmIHdlIGZvdW5kIHNvbWV0aGluZywgZHVwIGl0ICovCisJaWYgKGJ1ZnApCisJCXNlbGludXhfbW50ID0gc3RyZHVwKHApOworCisgICAgICBvdXQ6CisJaWYgKGZwKQorCQlmY2xvc2UoZnApOworCXJldHVybjsKK30KKwordm9pZCBmaW5pX3NlbGludXhtbnQodm9pZCkKK3sKKwlmcmVlKHNlbGludXhfbW50KTsKKwlzZWxpbnV4X21udCA9IE5VTEw7Cit9CisKK3ZvaWQgc2V0X3NlbGludXhtbnQoY29uc3QgY2hhciAqbW50KQoreworCXNlbGludXhfbW50ID0gc3RyZHVwKG1udCk7Cit9CisKK2hpZGRlbl9kZWYoc2V0X3NlbGludXhtbnQpCisKK3N0YXRpYyB2b2lkIGluaXRfbGliKHZvaWQpIF9fYXR0cmlidXRlX18gKChjb25zdHJ1Y3RvcikpOworc3RhdGljIHZvaWQgaW5pdF9saWIodm9pZCkKK3sKKwlzZWxpbnV4X3BhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisJaW5pdF9zZWxpbnV4bW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlfbGliKHZvaWQpIF9fYXR0cmlidXRlX18gKChkZXN0cnVjdG9yKSk7CitzdGF0aWMgdm9pZCBmaW5pX2xpYih2b2lkKQoreworCWZpbmlfc2VsaW51eG1udCgpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9sYWJlbC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9sYWJlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGE4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xhYmVsLmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBHZW5lcmFsaXplZCBsYWJlbGluZyBmcm9udGVuZCBmb3IgdXNlcnNwYWNlIG9iamVjdCBtYW5hZ2Vycy4KKyAqCisgKiBBdXRob3IgOiBFYW1vbiBXYWxzaCA8ZXdhbHNoQGVwb2NoLm5jc2MubWlsPgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlICJjYWxsYmFja3MuaCIKKyNpbmNsdWRlICJsYWJlbF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKQorCit0eXBlZGVmIGludCAoKnNlbGFiZWxfaW5pdGZ1bmMpKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLAorCQkJCWNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywKKwkJCQl1bnNpZ25lZCBub3B0cyk7CisKK3N0YXRpYyBzZWxhYmVsX2luaXRmdW5jIGluaXRmdW5jc1tdID0geworCSZzZWxhYmVsX2ZpbGVfaW5pdCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwkmc2VsYWJlbF9wcm9wZXJ0eV9pbml0LAorfTsKKworLyoKKyAqIFZhbGlkYXRpb24gZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2VsYWJlbF9pc192YWxpZGF0ZV9zZXQoY29uc3Qgc3RydWN0IHNlbGludXhfb3B0ICpvcHRzLAorCQkJCQkgIHVuc2lnbmVkIG4pCit7CisJd2hpbGUgKG4tLSkKKwkJaWYgKG9wdHNbbl0udHlwZSA9PSBTRUxBQkVMX09QVF9WQUxJREFURSkKKwkJCXJldHVybiAhIW9wdHNbbl0udmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNlbGFiZWxfdmFsaWRhdGUoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsCisJCSAgICAgc3RydWN0IHNlbGFiZWxfbG9va3VwX3JlYyAqY29udGV4dHMpCit7CisJaW50IHJjID0gMDsKKworCWlmICghcmVjLT52YWxpZGF0aW5nIHx8IGNvbnRleHRzLT52YWxpZGF0ZWQpCisJCWdvdG8gb3V0OworCisJcmMgPSBzZWxpbnV4X3ZhbGlkYXRlKCZjb250ZXh0cy0+Y3R4X3Jhdyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXQ7CisKKwljb250ZXh0cy0+dmFsaWRhdGVkID0gMTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBQdWJsaWMgQVBJCisgKi8KKworc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWxhYmVsX29wZW4odW5zaWduZWQgaW50IGJhY2tlbmQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywKKwkJCQkgICAgdW5zaWduZWQgbm9wdHMpCit7CisJc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMgPSBOVUxMOworCisJaWYgKGJhY2tlbmQgPj0gQVJSQVlfU0laRShpbml0ZnVuY3MpKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaW5pdGZ1bmNzW2JhY2tlbmRdID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJcmVjID0gKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqKW1hbGxvYyhzaXplb2YoKnJlYykpOworCWlmICghcmVjKQorCQlnb3RvIG91dDsKKworCW1lbXNldChyZWMsIDAsIHNpemVvZigqcmVjKSk7CisJcmVjLT5iYWNrZW5kID0gYmFja2VuZDsKKwlyZWMtPnZhbGlkYXRpbmcgPSBzZWxhYmVsX2lzX3ZhbGlkYXRlX3NldChvcHRzLCBub3B0cyk7CisKKwlpZiAoKCppbml0ZnVuY3NbYmFja2VuZF0pKHJlYywgb3B0cywgbm9wdHMpKSB7CisJCWZyZWUocmVjKTsKKwkJcmVjID0gTlVMTDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmVjOworfQorCitzdGF0aWMgc3RydWN0IHNlbGFiZWxfbG9va3VwX3JlYyAqCitzZWxhYmVsX2xvb2t1cF9jb21tb24oc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsCisJCSAgICAgIGNvbnN0IGNoYXIgKmtleSwgaW50IHR5cGUpCit7CisJc3RydWN0IHNlbGFiZWxfbG9va3VwX3JlYyAqbHI7CisJbHIgPSByZWMtPmZ1bmNfbG9va3VwKHJlYywga2V5LCB0eXBlKTsgCisJaWYgKCFscikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbHI7Cit9CisKK2ludCBzZWxhYmVsX2xvb2t1cChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywgY2hhciAqKmNvbiwKKwkJICAgY29uc3QgY2hhciAqa2V5LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc2VsYWJlbF9sb29rdXBfcmVjICpscjsKKworCWxyID0gc2VsYWJlbF9sb29rdXBfY29tbW9uKHJlYywga2V5LCB0eXBlKTsKKwlpZiAoIWxyKQorCQlyZXR1cm4gLTE7CisKKwkqY29uID0gc3RyZHVwKGxyLT5jdHhfcmF3KTsKKwlyZXR1cm4gKmNvbiA/IDAgOiAtMTsKK30KKworYm9vbCBzZWxhYmVsX3BhcnRpYWxfbWF0Y2goc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpZiAoIXJlYy0+ZnVuY19wYXJ0aWFsX21hdGNoKSB7CisJCS8qCisJCSAqIElmIHRoZSBsYWJlbCBiYWNrZW5kIGRvZXMgbm90IHN1cHBvcnQgcGFydGlhbCBtYXRjaGluZywKKwkJICogdGhlbiBhc3N1bWUgYSBtYXRjaCBpcyBwb3NzaWJsZS4KKwkJICovCisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gcmVjLT5mdW5jX3BhcnRpYWxfbWF0Y2gocmVjLCBrZXkpOworfQorCit2b2lkIHNlbGFiZWxfY2xvc2Uoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMpCit7CisJcmVjLT5mdW5jX2Nsb3NlKHJlYyk7CisJZnJlZShyZWMpOworfQorCit2b2lkIHNlbGFiZWxfc3RhdHMoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMpCit7CisJcmVjLT5mdW5jX3N0YXRzKHJlYyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xhYmVsX2FuZHJvaWRfcHJvcGVydHkuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbGFiZWxfYW5kcm9pZF9wcm9wZXJ0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDkzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xhYmVsX2FuZHJvaWRfcHJvcGVydHkuYwpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIFByb3BlcnR5IFNlcnZpY2UgY29udGV4dHMgYmFja2VuZCBmb3IgbGFiZWxpbmcgQW5kcm9pZCAKKyAqIHByb3BlcnR5IGtleXMKKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiY2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGFiZWxfaW50ZXJuYWwuaCIKKworLyogQSBwcm9wZXJ0eSBzZWN1cml0eSBjb250ZXh0IHNwZWNpZmljYXRpb24uICovCit0eXBlZGVmIHN0cnVjdCBzcGVjIHsKKwlzdHJ1Y3Qgc2VsYWJlbF9sb29rdXBfcmVjIGxyOwkgLyogaG9sZHMgY29udGV4dHMgZm9yIGxvb2t1cCByZXN1bHQgKi8KKwljaGFyICpwcm9wZXJ0eV9rZXk7CSAgICAgICAgIC8qIHByb3BlcnR5IGtleSBzdHJpbmcgKi8KK30gc3BlY190OworCisvKiBPdXIgc3RvcmVkIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBzYXZlZF9kYXRhIHsKKwkvKgorCSAqIFRoZSBhcnJheSBvZiBzcGVjaWZpY2F0aW9ucyBpcyBzb3J0ZWQgZm9yIGxvbmdlc3QKKwkgKiBwcmVmaXggbWF0Y2gKKwkgKi8KKwlzcGVjX3QgKnNwZWNfYXJyOworCXVuc2lnbmVkIGludCBuc3BlYzsgLyogdG90YWwgbnVtYmVyIG9mIHNwZWNpZmljYXRpb25zICovCit9OworCitzdGF0aWMgaW50IGNtcChjb25zdCB2b2lkICpBLCBjb25zdCB2b2lkICpCKQoreworCWNvbnN0IHN0cnVjdCBzcGVjICpzcDEgPSBBLCAqc3AyID0gQjsKKworCWlmIChzdHJuY21wKHNwMS0+cHJvcGVydHlfa2V5LCIqIiwxKSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZiAoc3RybmNtcChzcDItPnByb3BlcnR5X2tleSwiKiIsMSkgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJc2l6ZV90IEwxID0gc3RybGVuKHNwMS0+cHJvcGVydHlfa2V5KTsKKwlzaXplX3QgTDIgPSBzdHJsZW4oc3AyLT5wcm9wZXJ0eV9rZXkpOworCisJcmV0dXJuIChMMSA8IEwyKSAtIChMMSA+IEwyKTsKK30KKworLyoKKyAqIFdhcm4gYWJvdXQgZHVwbGljYXRlIHNwZWNpZmljYXRpb25zLgorICovCitzdGF0aWMgaW50IG5vZHVwc19zcGVjcyhzdHJ1Y3Qgc2F2ZWRfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBpaSwgamo7CisJc3RydWN0IHNwZWMgKmN1cnJfc3BlYywgKnNwZWNfYXJyID0gZGF0YS0+c3BlY19hcnI7CisKKwlmb3IgKGlpID0gMDsgaWkgPCBkYXRhLT5uc3BlYzsgaWkrKykgeworCQljdXJyX3NwZWMgPSAmc3BlY19hcnJbaWldOworCQlmb3IgKGpqID0gaWkgKyAxOyBqaiA8IGRhdGEtPm5zcGVjOyBqaisrKSB7CisJCQlpZiAoKCFzdHJjbXAoc3BlY19hcnJbampdLnByb3BlcnR5X2tleSwgY3Vycl9zcGVjLT5wcm9wZXJ0eV9rZXkpKSkgeworCQkJCXJjID0gLTE7CisJCQkJZXJybm8gPSBFSU5WQUw7CisJCQkJaWYgKHN0cmNtcAorCQkJCSAgICAoc3BlY19hcnJbampdLmxyLmN0eF9yYXcsCisJCQkJICAgICBjdXJyX3NwZWMtPmxyLmN0eF9yYXcpKSB7CisJCQkJCXNlbGludXhfbG9nCisJCQkJCQkoU0VMSU5VWF9FUlJPUiwKKwkJCQkJCSAiJXM6IE11bHRpcGxlIGRpZmZlcmVudCBzcGVjaWZpY2F0aW9ucyBmb3IgJXMgICglcyBhbmQgJXMpLlxuIiwKKwkJCQkJCSBwYXRoLCBjdXJyX3NwZWMtPnByb3BlcnR5X2tleSwKKwkJCQkJCSBzcGVjX2Fycltqal0ubHIuY3R4X3JhdywKKwkJCQkJCSBjdXJyX3NwZWMtPmxyLmN0eF9yYXcpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlbGludXhfbG9nCisJCQkJCQkoU0VMSU5VWF9FUlJPUiwKKwkJCQkJCSAiJXM6IE11bHRpcGxlIHNhbWUgc3BlY2lmaWNhdGlvbnMgZm9yICVzLlxuIiwKKwkJCQkJCSBwYXRoLCBjdXJyX3NwZWMtPnByb3BlcnR5X2tleSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2xpbmUoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsCisJCQljb25zdCBjaGFyICpwYXRoLCBjaGFyICpsaW5lX2J1ZiwgCisJCQlpbnQgcGFzcywgdW5zaWduZWQgbGluZW5vKQoreworCWludCBpdGVtcywgbGVuOworCWNoYXIgYnVmMVtCVUZTSVpdLCBidWYyW0JVRlNJWl07CisJY2hhciAqYnVmX3AsICpwcm9wID0gYnVmMSwgKmNvbnRleHQgPSBidWYyOworCXN0cnVjdCBzYXZlZF9kYXRhICpkYXRhID0gKHN0cnVjdCBzYXZlZF9kYXRhICopcmVjLT5kYXRhOworCXNwZWNfdCAqc3BlY19hcnIgPSBkYXRhLT5zcGVjX2FycjsKKwl1bnNpZ25lZCBpbnQgbnNwZWMgPSBkYXRhLT5uc3BlYzsKKworCWxlbiA9IHN0cmxlbihsaW5lX2J1Zik7CisJaWYgKGxpbmVfYnVmW2xlbiAtIDFdID09ICdcbicpCisJCWxpbmVfYnVmW2xlbiAtIDFdID0gMDsKKwlidWZfcCA9IGxpbmVfYnVmOworCXdoaWxlIChpc3NwYWNlKCpidWZfcCkpCisJCWJ1Zl9wKys7CisJLyogU2tpcCBjb21tZW50IGxpbmVzIGFuZCBlbXB0eSBsaW5lcy4gKi8KKwlpZiAoKmJ1Zl9wID09ICcjJyB8fCAqYnVmX3AgPT0gMCkKKwkJcmV0dXJuIDA7CisJaXRlbXMgPSBzc2NhbmYobGluZV9idWYsICIlMjU1cyAlMjU1cyIsIHByb3AsIGNvbnRleHQpOworCWlmIChpdGVtcyAhPSAyKSB7CisJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCSAgICAiJXM6ICBsaW5lICVkIGlzIG1pc3NpbmcgZmllbGRzLCBza2lwcGluZ1xuIiwgcGF0aCwKKwkJCSAgICBsaW5lbm8pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGFzcyA9PSAxKSB7CisJCS8qIE9uIHRoZSBzZWNvbmQgcGFzcywgcHJvY2VzcyBhbmQgc3RvcmUgdGhlIHNwZWNpZmljYXRpb24gaW4gc3BlYy4gKi8KKwkJc3BlY19hcnJbbnNwZWNdLnByb3BlcnR5X2tleSA9IHN0cmR1cChwcm9wKTsKKwkJaWYgKCFzcGVjX2Fycltuc3BlY10ucHJvcGVydHlfa2V5KSB7CisJCQlzZWxpbnV4X2xvZyhTRUxJTlVYX1dBUk5JTkcsCisJCQkJICAgICIlczogIG91dCBvZiBtZW1vcnkgYXQgbGluZSAlZCBvbiBwcm9wICVzXG4iLAorCQkJCSAgICBwYXRoLCBsaW5lbm8sIHByb3ApOworCQlyZXR1cm4gLTE7CisJICAgIAorCQl9CisKKwkJc3BlY19hcnJbbnNwZWNdLmxyLmN0eF9yYXcgPSBzdHJkdXAoY29udGV4dCk7CisJCWlmICghc3BlY19hcnJbbnNwZWNdLmxyLmN0eF9yYXcpIHsKKwkJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkgICAgIiVzOiAgb3V0IG9mIG1lbW9yeSBhdCBsaW5lICVkIG9uIGNvbnRleHQgJXNcbiIsCisJCQkJICAgIHBhdGgsIGxpbmVubywgY29udGV4dCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChyZWMtPnZhbGlkYXRpbmcpIHsKKwkJICAgICAgICBpZiAoc2VsYWJlbF92YWxpZGF0ZShyZWMsICZzcGVjX2Fycltuc3BlY10ubHIpIDwgMCkgeworCQkJICAgICAgICBzZWxpbnV4X2xvZyhTRUxJTlVYX1dBUk5JTkcsCisJCQkJCSAgICAiJXM6ICBsaW5lICVkIGhhcyBpbnZhbGlkIGNvbnRleHQgJXNcbiIsCisJCQkJCSAgICBwYXRoLCBsaW5lbm8sIHNwZWNfYXJyW25zcGVjXS5sci5jdHhfcmF3KTsKKwkJCX0KKwkJfQorICAgICAJfQorCisJZGF0YS0+bnNwZWMgPSArK25zcGVjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXQoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywKKwkJdW5zaWduZWQgbikKK3sKKwlzdHJ1Y3Qgc2F2ZWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc2F2ZWRfZGF0YSAqKXJlYy0+ZGF0YTsKKwljb25zdCBjaGFyICpwYXRoID0gTlVMTDsKKwlGSUxFICpmcDsKKwljaGFyIGxpbmVfYnVmW0JVRlNJWl07CisJdW5zaWduZWQgaW50IGxpbmVubyA9IDAsIG1heG5zcGVjLCBwYXNzOworCWludCBzdGF0dXMgPSAtMTsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworCS8qIFByb2Nlc3MgYXJndW1lbnRzICovCisJd2hpbGUgKG4tLSkKKwkJc3dpdGNoIChvcHRzW25dLnR5cGUpIHsKKwkJY2FzZSBTRUxBQkVMX09QVF9QQVRIOgorCQkJcGF0aCA9IG9wdHNbbl0udmFsdWU7CisJCQlicmVhazsKKwkJfQorCisJLyogT3BlbiB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlLiAqLworCWlmICgoZnAgPSBmb3BlbihwYXRoLCAiciIpKSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnNiKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoIVNfSVNSRUcoc2Iuc3RfbW9kZSkpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFR3byBwYXNzZXMgb2YgdGhlIHNwZWNpZmljYXRpb24gZmlsZS4gRmlyc3QgaXMgdG8gZ2V0IHRoZSBzaXplLgorCSAqIEFmdGVyIHRoZSBmaXJzdCBwYXNzLCB0aGUgc3BlYyBhcnJheSBpcyBtYWxsb2NlZCB0byB0aGUgYXBwcm9wcmlhdGUgCisJICogc2l6ZS4gU2Vjb25kIHBhc3MgaXMgdG8gcG9wdWxhdGUgdGhlIHNwZWMgYXJyYXkgYW5kIGNoZWNrIGZvciAKKwkgKiBkdXBzLgorCSAqLworCW1heG5zcGVjID0gVUlOVF9NQVggLyBzaXplb2Yoc3BlY190KTsKKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKSB7CisJCWRhdGEtPm5zcGVjID0gMDsKKworCQl3aGlsZSAoZmdldHMobGluZV9idWYsIHNpemVvZiBsaW5lX2J1ZiAtIDEsIGZwKQorCQkgICAgICAgJiYgZGF0YS0+bnNwZWMgPCBtYXhuc3BlYykgeworCQkJaWYgKHByb2Nlc3NfbGluZShyZWMsIHBhdGgsIGxpbmVfYnVmLCBwYXNzLCArK2xpbmVubykgIT0gMCkgeworCQkJCWdvdG8gZmluaXNoOworCQkJfQorCQl9CisKKwkJaWYgKHBhc3MgPT0gMSkgeworCQkJc3RhdHVzID0gbm9kdXBzX3NwZWNzKGRhdGEsIHBhdGgpOworCSAgICAKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBmaW5pc2g7CisJCX0KKworCQlpZiAocGFzcyA9PSAwKSB7CisKKwkJCWlmIChkYXRhLT5uc3BlYyA9PSAwKSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKworCQkJaWYgKE5VTEwgPT0gKGRhdGEtPnNwZWNfYXJyID0KKwkJCQkgICAgIG1hbGxvYyhzaXplb2Yoc3BlY190KSAqIGRhdGEtPm5zcGVjKSkpCisJCQkJZ290byBmaW5pc2g7CisKKwkJCW1lbXNldChkYXRhLT5zcGVjX2FyciwgMCwgc2l6ZW9mKHNwZWNfdCkqZGF0YS0+bnNwZWMpOworCQkJbWF4bnNwZWMgPSBkYXRhLT5uc3BlYzsKKwkJCXJld2luZChmcCk7CisJCX0KKwl9CisKKwlxc29ydChkYXRhLT5zcGVjX2FyciwgZGF0YS0+bnNwZWMsIHNpemVvZihzdHJ1Y3Qgc3BlYyksIGNtcCk7CisKKwlzdGF0dXMgPSAwOworZmluaXNoOgorCWZjbG9zZShmcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEJhY2tlbmQgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KK3N0YXRpYyB2b2lkIGNsb3NlZihzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYykKK3sKKwlzdHJ1Y3Qgc2F2ZWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc2F2ZWRfZGF0YSAqKXJlYy0+ZGF0YTsKKwlzdHJ1Y3Qgc3BlYyAqc3BlYzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5uc3BlYzsgaSsrKSB7CisJCXNwZWMgPSAmZGF0YS0+c3BlY19hcnJbaV07CisJCWZyZWUoc3BlYy0+cHJvcGVydHlfa2V5KTsKKwkJZnJlZShzcGVjLT5sci5jdHhfcmF3KTsKKwkJZnJlZShzcGVjLT5sci5jdHhfdHJhbnMpOworCX0KKworCWlmIChkYXRhLT5zcGVjX2FycikKKwkJZnJlZShkYXRhLT5zcGVjX2Fycik7CisJCisJZnJlZShkYXRhKTsKK30KKworc3RhdGljIHN0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgKmxvb2t1cChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywgCisJCQkJCSBjb25zdCBjaGFyICprZXksIAorCQkJCQkgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIHR5cGUpCit7CisJc3RydWN0IHNhdmVkX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNhdmVkX2RhdGEgKilyZWMtPmRhdGE7CisJc3BlY190ICpzcGVjX2FyciA9IGRhdGEtPnNwZWNfYXJyOworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgKnJldCA9IE5VTEw7CisKKwlpZiAoIWRhdGEtPm5zcGVjKSB7CisJCWVycm5vID0gRU5PRU5UOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnNwZWM7IGkrKykgeworCQlpZiAoc3RybmNtcChzcGVjX2FycltpXS5wcm9wZXJ0eV9rZXksIGtleSwgCisJCSAgICBzdHJsZW4oc3BlY19hcnJbaV0ucHJvcGVydHlfa2V5KSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cm5jbXAoc3BlY19hcnJbaV0ucHJvcGVydHlfa2V5LCAiKiIsIDEpID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBkYXRhLT5uc3BlYykgeworCQkvKiBObyBtYXRjaGluZyBzcGVjaWZpY2F0aW9uLiAqLworCQllcnJubyA9IEVOT0VOVDsKKwkJZ290byBmaW5pc2g7CisJfQorCisJcmV0ID0gJnNwZWNfYXJyW2ldLmxyOworCitmaW5pc2g6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3RhdHMoc3RydWN0IHNlbGFiZWxfaGFuZGxlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpICpyZWMpCit7CisJc2VsaW51eF9sb2coU0VMSU5VWF9XQVJOSU5HLCAiJ3N0YXRzJyBmdW5jdGlvbmFsaXR5IG5vdCBpbXBsZW1lbnRlZC5cbiIpOworfQorCitpbnQgc2VsYWJlbF9wcm9wZXJ0eV9pbml0KHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLAorCQkJICBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9vcHQgKm9wdHMsCisJCQkgIHVuc2lnbmVkIG5vcHRzKQoreworCXN0cnVjdCBzYXZlZF9kYXRhICpkYXRhOworCisJZGF0YSA9IChzdHJ1Y3Qgc2F2ZWRfZGF0YSAqKW1hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwlyZWMtPmRhdGEgPSBkYXRhOworCXJlYy0+ZnVuY19jbG9zZSA9ICZjbG9zZWY7CisJcmVjLT5mdW5jX3N0YXRzID0gJnN0YXRzOworCXJlYy0+ZnVuY19sb29rdXAgPSAmbG9va3VwOworCisJcmV0dXJuIGluaXQocmVjLCBvcHRzLCBub3B0cyk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xhYmVsX2ZpbGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbGFiZWxfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MjNlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xhYmVsX2ZpbGUuYwpAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIEZpbGUgY29udGV4dHMgYmFja2VuZCBmb3IgbGFiZWxpbmcgc3lzdGVtCisgKgorICogQXV0aG9yIDogRWFtb24gV2Fsc2ggPGV3YWxzaEB0eWNoby5uc2EuZ292PgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJjYWxsYmFja3MuaCIKKyNpbmNsdWRlICJsYWJlbF9pbnRlcm5hbC5oIgorCisvKgorICogSW50ZXJuYWxzLCBtb3N0bHkgbW92ZWQgb3ZlciBmcm9tIG1hdGNocGF0aGNvbi5jCisgKi8KKworLyogQSBmaWxlIHNlY3VyaXR5IGNvbnRleHQgc3BlY2lmaWNhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0IHNwZWMgeworCXN0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgbHI7CS8qIGhvbGRzIGNvbnRleHRzIGZvciBsb29rdXAgcmVzdWx0ICovCisJY2hhciAqcmVnZXhfc3RyOwkvKiByZWd1bGFyIGV4cGVzc2lvbiBzdHJpbmcgZm9yIGRpYWdub3N0aWNzICovCisJY2hhciAqdHlwZV9zdHI7CQkvKiB0eXBlIHN0cmluZyBmb3IgZGlhZ25vc3RpYyBtZXNzYWdlcyAqLworCXJlZ2V4X3QgcmVnZXg7CQkvKiBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gKi8KKwljaGFyIHJlZ2NvbXA7ICAgICAgICAgICAvKiByZWdleF9zdHIgaGFzIGJlZW4gY29tcGlsZWQgdG8gcmVnZXggKi8KKwltb2RlX3QgbW9kZTsJCS8qIG1vZGUgZm9ybWF0IHZhbHVlICovCisJaW50IG1hdGNoZXM7CQkvKiBudW1iZXIgb2YgbWF0Y2hpbmcgcGF0aG5hbWVzICovCisJaW50IGhhc01ldGFDaGFyczsJLyogcmVndWxhciBleHByZXNzaW9uIGhhcyBtZXRhLWNoYXJzICovCisJaW50IHN0ZW1faWQ7CQkvKiBpbmRpY2F0ZXMgd2hpY2ggc3RlbS1jb21wcmVzc2lvbiBpdGVtICovCisJc2l6ZV90IHByZWZpeF9sZW47ICAgICAgLyogbGVuZ3RoIG9mIGZpeGVkIHBhdGggcHJlZml4ICovCit9IHNwZWNfdDsKKworLyogQSByZWd1bGFyIGV4cHJlc3Npb24gc3RlbSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RlbSB7CisJY2hhciAqYnVmOworCWludCBsZW47Cit9IHN0ZW1fdDsKKworLyogT3VyIHN0b3JlZCBjb25maWd1cmF0aW9uICovCitzdHJ1Y3Qgc2F2ZWRfZGF0YSB7CisJLyoKKwkgKiBUaGUgYXJyYXkgb2Ygc3BlY2lmaWNhdGlvbnMsIGluaXRpYWxseSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbiAKKwkgKiB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlLiBTb3J0aW5nIG9jY3VycyBiYXNlZCBvbiBoYXNNZXRhQ2hhcnMuCisJICovCisJc3BlY190ICpzcGVjX2FycjsKKwl1bnNpZ25lZCBpbnQgbnNwZWM7CisJdW5zaWduZWQgaW50IG5jb21wOworCisJLyoKKwkgKiBUaGUgYXJyYXkgb2YgcmVndWxhciBleHByZXNzaW9uIHN0ZW1zLgorCSAqLworCXN0ZW1fdCAqc3RlbV9hcnI7CisJaW50IG51bV9zdGVtczsKKwlpbnQgYWxsb2Nfc3RlbXM7Cit9OworCisvKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCB0aGF0IGNhbiBiZSBjb25zaWRlcmVkIHRoZSBzdGVtLCByZXR1cm5zIDAKKyAqIGlmIHRoZXJlIGlzIG5vIGlkZW50aWZpYWJsZSBzdGVtICovCitzdGF0aWMgaW50IGdldF9zdGVtX2Zyb21fc3BlYyhjb25zdCBjaGFyICpjb25zdCBidWYpCit7CisJY29uc3QgY2hhciAqdG1wID0gc3RyY2hyKGJ1ZiArIDEsICcvJyk7CisJY29uc3QgY2hhciAqaW5kOworCisJaWYgKCF0bXApCisJCXJldHVybiAwOworCisJZm9yIChpbmQgPSBidWY7IGluZCA8IHRtcDsgaW5kKyspIHsKKwkJaWYgKHN0cmNocigiLl4kPyorfFsoeyIsIChpbnQpKmluZCkpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworLyogcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgdGhhdCBpcyB0aGUgc3RlbSBvZiBhIGZpbGUgbmFtZSAqLworc3RhdGljIGludCBnZXRfc3RlbV9mcm9tX2ZpbGVfbmFtZShjb25zdCBjaGFyICpjb25zdCBidWYpCit7CisJY29uc3QgY2hhciAqdG1wID0gc3RyY2hyKGJ1ZiArIDEsICcvJyk7CisKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRtcCAtIGJ1ZjsKK30KKworLyogZmluZCB0aGUgc3RlbSBvZiBhIGZpbGUgc3BlYywgcmV0dXJucyB0aGUgaW5kZXggaW50byBzdGVtX2FyciBmb3IgYSBuZXcKKyAqIG9yIGV4aXN0aW5nIHN0ZW0sIChvciAtMSBpZiB0aGVyZSBpcyBubyBwb3NzaWJsZSBzdGVtIC0gSUUgZm9yIGEgZmlsZSBpbgorICogdGhlIHJvb3QgZGlyZWN0b3J5IG9yIGEgcmVnZXggdGhhdCBpcyB0b28gY29tcGxleCBmb3IgdXMpLiAqLworc3RhdGljIGludCBmaW5kX3N0ZW1fZnJvbV9zcGVjKHN0cnVjdCBzYXZlZF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYpCit7CisJaW50IGksIG51bSA9IGRhdGEtPm51bV9zdGVtczsKKwlpbnQgc3RlbV9sZW4gPSBnZXRfc3RlbV9mcm9tX3NwZWMoYnVmKTsKKworCWlmICghc3RlbV9sZW4pCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKHN0ZW1fbGVuID09IGRhdGEtPnN0ZW1fYXJyW2ldLmxlbgorCQkgICAgJiYgIXN0cm5jbXAoYnVmLCBkYXRhLT5zdGVtX2FycltpXS5idWYsIHN0ZW1fbGVuKSkKKwkJCXJldHVybiBpOworCX0KKwlpZiAoZGF0YS0+YWxsb2Nfc3RlbXMgPT0gbnVtKSB7CisJCXN0ZW1fdCAqdG1wX2FycjsKKwkJZGF0YS0+YWxsb2Nfc3RlbXMgPSBkYXRhLT5hbGxvY19zdGVtcyAqIDIgKyAxNjsKKwkJdG1wX2FyciA9IChzdGVtX3QgKikgcmVhbGxvYyhkYXRhLT5zdGVtX2FyciwKKwkJCQkgIHNpemVvZihzdGVtX3QpICogZGF0YS0+YWxsb2Nfc3RlbXMpOworCQlpZiAoIXRtcF9hcnIpCisJCQlyZXR1cm4gLTE7CisJCWRhdGEtPnN0ZW1fYXJyID0gdG1wX2FycjsKKwl9CisJZGF0YS0+c3RlbV9hcnJbbnVtXS5sZW4gPSBzdGVtX2xlbjsKKwlkYXRhLT5zdGVtX2FycltudW1dLmJ1ZiA9IChjaGFyICopIG1hbGxvYyhzdGVtX2xlbiArIDEpOworCWlmICghZGF0YS0+c3RlbV9hcnJbbnVtXS5idWYpCisJCXJldHVybiAtMTsKKwltZW1jcHkoZGF0YS0+c3RlbV9hcnJbbnVtXS5idWYsIGJ1Ziwgc3RlbV9sZW4pOworCWRhdGEtPnN0ZW1fYXJyW251bV0uYnVmW3N0ZW1fbGVuXSA9ICdcMCc7CisJZGF0YS0+bnVtX3N0ZW1zKys7CisJYnVmICs9IHN0ZW1fbGVuOworCXJldHVybiBudW07Cit9CisKKy8qIGZpbmQgdGhlIHN0ZW0gb2YgYSBmaWxlIG5hbWUsIHJldHVybnMgdGhlIGluZGV4IGludG8gc3RlbV9hcnIgKG9yIC0xIGlmCisgKiB0aGVyZSBpcyBubyBtYXRjaCAtIElFIGZvciBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9yIGEgcmVnZXggdGhhdCBpcworICogdG9vIGNvbXBsZXggZm9yIHVzKS4gIE1ha2VzIGJ1ZiBwb2ludCB0byB0aGUgdGV4dCBBRlRFUiB0aGUgc3RlbS4gKi8KK3N0YXRpYyBpbnQgZmluZF9zdGVtX2Zyb21fZmlsZShzdHJ1Y3Qgc2F2ZWRfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgc3RlbV9sZW4gPSBnZXRfc3RlbV9mcm9tX2ZpbGVfbmFtZSgqYnVmKTsKKworCWlmICghc3RlbV9sZW4pCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnVtX3N0ZW1zOyBpKyspIHsKKwkJaWYgKHN0ZW1fbGVuID09IGRhdGEtPnN0ZW1fYXJyW2ldLmxlbgorCQkgICAgJiYgIXN0cm5jbXAoKmJ1ZiwgZGF0YS0+c3RlbV9hcnJbaV0uYnVmLCBzdGVtX2xlbikpIHsKKwkJCSpidWYgKz0gc3RlbV9sZW47CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBXYXJuIGFib3V0IGR1cGxpY2F0ZSBzcGVjaWZpY2F0aW9ucy4KKyAqLworc3RhdGljIGludCBub2R1cHNfc3BlY3Moc3RydWN0IHNhdmVkX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgaWksIGpqOworCXN0cnVjdCBzcGVjICpjdXJyX3NwZWMsICpzcGVjX2FyciA9IGRhdGEtPnNwZWNfYXJyOworCisJZm9yIChpaSA9IDA7IGlpIDwgZGF0YS0+bnNwZWM7IGlpKyspIHsKKwkJY3Vycl9zcGVjID0gJnNwZWNfYXJyW2lpXTsKKwkJZm9yIChqaiA9IGlpICsgMTsgamogPCBkYXRhLT5uc3BlYzsgamorKykgeworCQkJaWYgKCghc3RyY21wCisJCQkgICAgIChzcGVjX2Fycltqal0ucmVnZXhfc3RyLCBjdXJyX3NwZWMtPnJlZ2V4X3N0cikpCisJCQkgICAgJiYgKCFzcGVjX2Fycltqal0ubW9kZSB8fCAhY3Vycl9zcGVjLT5tb2RlCisJCQkJfHwgc3BlY19hcnJbampdLm1vZGUgPT0gY3Vycl9zcGVjLT5tb2RlKSkgeworCQkJCXJjID0gLTE7CisJCQkJZXJybm8gPSBFSU5WQUw7CisJCQkJaWYgKHN0cmNtcAorCQkJCSAgICAoc3BlY19hcnJbampdLmxyLmN0eF9yYXcsCisJCQkJICAgICBjdXJyX3NwZWMtPmxyLmN0eF9yYXcpKSB7CisJCQkJCXNlbGludXhfbG9nCisJCQkJCQkoU0VMSU5VWF9FUlJPUiwKKwkJCQkJCSAiJXM6IE11bHRpcGxlIGRpZmZlcmVudCBzcGVjaWZpY2F0aW9ucyBmb3IgJXMgICglcyBhbmQgJXMpLlxuIiwKKwkJCQkJCSBwYXRoLCBjdXJyX3NwZWMtPnJlZ2V4X3N0ciwKKwkJCQkJCSBzcGVjX2Fycltqal0ubHIuY3R4X3JhdywKKwkJCQkJCSBjdXJyX3NwZWMtPmxyLmN0eF9yYXcpOworCQkJCX0gZWxzZSB7CisJCQkJCXNlbGludXhfbG9nCisJCQkJCQkoU0VMSU5VWF9FUlJPUiwKKwkJCQkJCSAiJXM6IE11bHRpcGxlIHNhbWUgc3BlY2lmaWNhdGlvbnMgZm9yICVzLlxuIiwKKwkJCQkJCSBwYXRoLCBjdXJyX3NwZWMtPnJlZ2V4X3N0cik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiByYzsKK30KKworLyogRGV0ZXJtaW5lIGlmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3BlY2lmaWNhdGlvbiBoYXMgYW55IG1ldGEgY2hhcmFjdGVycy4gKi8KK3N0YXRpYyB2b2lkIHNwZWNfaGFzTWV0YUNoYXJzKHN0cnVjdCBzcGVjICpzcGVjKQoreworCWNoYXIgKmM7CisJc2l6ZV90IGxlbjsKKwljaGFyICplbmQ7CisKKwljID0gc3BlYy0+cmVnZXhfc3RyOworCWxlbiA9IHN0cmxlbihzcGVjLT5yZWdleF9zdHIpOworCWVuZCA9IGMgKyBsZW47CisKKwlzcGVjLT5oYXNNZXRhQ2hhcnMgPSAwOworCXNwZWMtPnByZWZpeF9sZW4gPSBsZW47CisKKwkvKiBMb29rIGF0IGVhY2ggY2hhcmFjdGVyIGluIHRoZSBSRSBzcGVjaWZpY2F0aW9uIHN0cmluZyBmb3IgYSAKKwkgKiBtZXRhIGNoYXJhY3Rlci4gUmV0dXJuIHdoZW4gYW55IG1ldGEgY2hhcmFjdGVyIHJlYWNoZWQuICovCisJd2hpbGUgKGMgIT0gZW5kKSB7CisJCXN3aXRjaCAoKmMpIHsKKwkJY2FzZSAnLic6CisJCWNhc2UgJ14nOgorCQljYXNlICckJzoKKwkJY2FzZSAnPyc6CisJCWNhc2UgJyonOgorCQljYXNlICcrJzoKKwkJY2FzZSAnfCc6CisJCWNhc2UgJ1snOgorCQljYXNlICcoJzoKKwkJY2FzZSAneyc6CisJCQlzcGVjLT5oYXNNZXRhQ2hhcnMgPSAxOworCQkJc3BlYy0+cHJlZml4X2xlbiA9IGMgLSBzcGVjLT5yZWdleF9zdHI7CisJCQlyZXR1cm47CisJCWNhc2UgJ1xcJzoJLyogc2tpcCB0aGUgbmV4dCBjaGFyYWN0ZXIgKi8KKwkJCWMrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisKKwkJfQorCQljKys7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIGludCBjb21waWxlX3JlZ2V4KHN0cnVjdCBzYXZlZF9kYXRhICpkYXRhLCBzcGVjX3QgKnNwZWMsIGNoYXIgKiplcnJidWYpCit7CisJY2hhciAqcmVnX2J1ZiwgKmFuY2hvcmVkX3JlZ2V4LCAqY3A7CisJc3RlbV90ICpzdGVtX2FyciA9IGRhdGEtPnN0ZW1fYXJyOworCXNpemVfdCBsZW47CisJaW50IHJlZ2VycjsKKworCWlmIChzcGVjLT5yZWdjb21wKQorCQlyZXR1cm4gMDsgLyogYWxyZWFkeSBkb25lICovCisKKwlkYXRhLT5uY29tcCsrOyAvKiBob3cgbWFueSBjb21waWxlZCByZWdleGVzIHJlcXVpcmVkICovCisKKwkvKiBTa2lwIHRoZSBmaXhlZCBzdGVtLiAqLworCXJlZ19idWYgPSBzcGVjLT5yZWdleF9zdHI7CisJaWYgKHNwZWMtPnN0ZW1faWQgPj0gMCkKKwkJcmVnX2J1ZiArPSBzdGVtX2FycltzcGVjLT5zdGVtX2lkXS5sZW47CisKKwkvKiBBbmNob3IgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gKi8KKwlsZW4gPSBzdHJsZW4ocmVnX2J1Zik7CisJY3AgPSBhbmNob3JlZF9yZWdleCA9IChjaGFyICopIG1hbGxvYyhsZW4gKyAzKTsKKwlpZiAoIWFuY2hvcmVkX3JlZ2V4KQorCQlyZXR1cm4gLTE7CisJLyogQ3JlYXRlIF4uLi4kIHJlZ2V4cC4gICovCisJKmNwKysgPSAnXic7CisJbWVtY3B5KGNwLCByZWdfYnVmLCBsZW4pOworCWNwICs9IGxlbjsKKwkqY3ArKyA9ICckJzsKKwkqY3AgPSAnXDAnOworCisJLyogQ29tcGlsZSB0aGUgcmVndWxhciBleHByZXNzaW9uLiAqLworCXJlZ2VyciA9IHJlZ2NvbXAoJnNwZWMtPnJlZ2V4LCBhbmNob3JlZF9yZWdleCwgCisJCQkgUkVHX0VYVEVOREVEIHwgUkVHX05PU1VCKTsKKwlpZiAocmVnZXJyICE9IDApIHsKKwkJc2l6ZV90IGVycnN6ID0gMDsKKwkJZXJyc3ogPSByZWdlcnJvcihyZWdlcnIsICZzcGVjLT5yZWdleCwgTlVMTCwgMCk7CisJCWlmIChlcnJzeiAmJiBlcnJidWYpCisJCQkqZXJyYnVmID0gKGNoYXIgKikgbWFsbG9jKGVycnN6KTsKKwkJaWYgKGVycmJ1ZiAmJiAqZXJyYnVmKQorCQkJKHZvaWQpcmVnZXJyb3IocmVnZXJyLCAmc3BlYy0+cmVnZXgsCisJCQkJICAgICAgICplcnJidWYsIGVycnN6KTsKKworCQlmcmVlKGFuY2hvcmVkX3JlZ2V4KTsKKwkJcmV0dXJuIC0xOworCX0KKwlmcmVlKGFuY2hvcmVkX3JlZ2V4KTsKKworCS8qIERvbmUuICovCisJc3BlYy0+cmVnY29tcCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByb2Nlc3NfbGluZShzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywKKwkJCWNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCWNoYXIgKmxpbmVfYnVmLCBpbnQgcGFzcywgdW5zaWduZWQgbGluZW5vKQoreworCWludCBpdGVtcywgbGVuOworCWNoYXIgYnVmMVtCVUZTSVpdLCBidWYyW0JVRlNJWl0sIGJ1ZjNbQlVGU0laXTsKKwljaGFyICpidWZfcCwgKnJlZ2V4ID0gYnVmMSwgKnR5cGUgPSBidWYyLCAqY29udGV4dCA9IGJ1ZjM7CisJc3RydWN0IHNhdmVkX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNhdmVkX2RhdGEgKilyZWMtPmRhdGE7CisJc3BlY190ICpzcGVjX2FyciA9IGRhdGEtPnNwZWNfYXJyOworCXVuc2lnbmVkIGludCBuc3BlYyA9IGRhdGEtPm5zcGVjOworCisJbGVuID0gc3RybGVuKGxpbmVfYnVmKTsKKwlpZiAobGluZV9idWZbbGVuIC0gMV0gPT0gJ1xuJykKKwkJbGluZV9idWZbbGVuIC0gMV0gPSAwOworCWJ1Zl9wID0gbGluZV9idWY7CisJd2hpbGUgKGlzc3BhY2UoKmJ1Zl9wKSkKKwkJYnVmX3ArKzsKKwkvKiBTa2lwIGNvbW1lbnQgbGluZXMgYW5kIGVtcHR5IGxpbmVzLiAqLworCWlmICgqYnVmX3AgPT0gJyMnIHx8ICpidWZfcCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpdGVtcyA9IHNzY2FuZihsaW5lX2J1ZiwgIiUyNTVzICUyNTVzICUyNTVzIiwgcmVnZXgsIHR5cGUsIGNvbnRleHQpOworCWlmIChpdGVtcyA8IDIpIHsKKwkJc2VsaW51eF9sb2coU0VMSU5VWF9XQVJOSU5HLAorCQkJICAgICIlczogIGxpbmUgJWQgaXMgbWlzc2luZyBmaWVsZHMsIHNraXBwaW5nXG4iLCBwYXRoLAorCQkJICAgIGxpbmVubyk7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaXRlbXMgPT0gMikgeworCQkvKiBUaGUgdHlwZSBmaWVsZCBpcyBvcHRpb25hbC4gKi8KKwkJY29udGV4dCA9IHR5cGU7CisJCXR5cGUgPSBOVUxMOworCX0KKworCWxlbiA9IGdldF9zdGVtX2Zyb21fc3BlYyhyZWdleCk7CisJaWYgKGxlbiAmJiBwcmVmaXggJiYgc3RybmNtcChwcmVmaXgsIHJlZ2V4LCBsZW4pKSB7CisJCS8qIFN0ZW0gb2YgcmVnZXggZG9lcyBub3QgbWF0Y2ggcmVxdWVzdGVkIHByZWZpeCwgZGlzY2FyZC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBhc3MgPT0gMSkgeworCQkvKiBPbiB0aGUgc2Vjb25kIHBhc3MsIHByb2Nlc3MgYW5kIHN0b3JlIHRoZSBzcGVjaWZpY2F0aW9uIGluIHNwZWMuICovCisJCWNoYXIgKmVycmJ1ZiA9IE5VTEw7CisJCXNwZWNfYXJyW25zcGVjXS5zdGVtX2lkID0gZmluZF9zdGVtX2Zyb21fc3BlYyhkYXRhLCByZWdleCk7CisJCXNwZWNfYXJyW25zcGVjXS5yZWdleF9zdHIgPSBzdHJkdXAocmVnZXgpOworCQlpZiAoIXNwZWNfYXJyW25zcGVjXS5yZWdleF9zdHIpIHsKKwkJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkgICAiJXM6ICBvdXQgb2YgbWVtb3J5IGF0IGxpbmUgJWQgb24gcmVnZXggJXNcbiIsCisJCQkJICAgcGF0aCwgbGluZW5vLCByZWdleCk7CisJCQlyZXR1cm4gLTE7CisKKwkJfQorCQlpZiAocmVjLT52YWxpZGF0aW5nICYmIGNvbXBpbGVfcmVnZXgoZGF0YSwgJnNwZWNfYXJyW25zcGVjXSwgJmVycmJ1ZikpIHsKKwkJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkgICAiJXM6ICBsaW5lICVkIGhhcyBpbnZhbGlkIHJlZ2V4ICVzOiAgJXNcbiIsCisJCQkJICAgcGF0aCwgbGluZW5vLCByZWdleCwKKwkJCQkgICAoZXJyYnVmID8gZXJyYnVmIDogIm91dCBvZiBtZW1vcnkiKSk7CisJCX0KKworCQkvKiBDb252ZXJ0IHRoZSB0eXBlIHN0cmluZyB0byBhIG1vZGUgZm9ybWF0ICovCisJCXNwZWNfYXJyW25zcGVjXS5tb2RlID0gMDsKKwkJaWYgKCF0eXBlKQorCQkJZ290byBza2lwX3R5cGU7CisJCXNwZWNfYXJyW25zcGVjXS50eXBlX3N0ciA9IHN0cmR1cCh0eXBlKTsKKwkJbGVuID0gc3RybGVuKHR5cGUpOworCQlpZiAodHlwZVswXSAhPSAnLScgfHwgbGVuICE9IDIpIHsKKwkJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkgICAgIiVzOiAgbGluZSAlZCBoYXMgaW52YWxpZCBmaWxlIHR5cGUgJXNcbiIsCisJCQkJICAgIHBhdGgsIGxpbmVubywgdHlwZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzd2l0Y2ggKHR5cGVbMV0pIHsKKwkJY2FzZSAnYic6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZCTEs7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZDSFI7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZESVI7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZJRk87CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZMTks7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzcGVjX2Fycltuc3BlY10ubW9kZSA9IFNfSUZTT0NLOworCQkJYnJlYWs7CisJCWNhc2UgJy0nOgorCQkJc3BlY19hcnJbbnNwZWNdLm1vZGUgPSBTX0lGUkVHOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZWxpbnV4X2xvZyhTRUxJTlVYX1dBUk5JTkcsCisJCQkJICAgICIlczogIGxpbmUgJWQgaGFzIGludmFsaWQgZmlsZSB0eXBlICVzXG4iLAorCQkJCSAgICBwYXRoLCBsaW5lbm8sIHR5cGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCXNraXBfdHlwZToKKwkJc3BlY19hcnJbbnNwZWNdLmxyLmN0eF9yYXcgPSBzdHJkdXAoY29udGV4dCk7CisKKwkJaWYgKHN0cmNtcChjb250ZXh0LCAiPDxub25lPj4iKSAmJiByZWMtPnZhbGlkYXRpbmcpIHsKKwkJCWlmIChzZWxhYmVsX3ZhbGlkYXRlKHJlYywgJnNwZWNfYXJyW25zcGVjXS5scikgPCAwKSB7CisJCQkJc2VsaW51eF9sb2coU0VMSU5VWF9XQVJOSU5HLAorCQkJCQkgICAgIiVzOiAgbGluZSAlZCBoYXMgaW52YWxpZCBjb250ZXh0ICVzXG4iLAorCQkJCQkgICAgcGF0aCwgbGluZW5vLCBzcGVjX2Fycltuc3BlY10ubHIuY3R4X3Jhdyk7CisJCQl9CisJCX0KKworCQkvKiBEZXRlcm1pbmUgaWYgc3BlY2lmaWNhdGlvbiBoYXMgCisJCSAqIGFueSBtZXRhIGNoYXJhY3RlcnMgaW4gdGhlIFJFICovCisJCXNwZWNfaGFzTWV0YUNoYXJzKCZzcGVjX2Fycltuc3BlY10pOworCX0KKworCWRhdGEtPm5zcGVjID0gKytuc3BlYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0KHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLCBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9vcHQgKm9wdHMsCisJCXVuc2lnbmVkIG4pCit7CisJc3RydWN0IHNhdmVkX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNhdmVkX2RhdGEgKilyZWMtPmRhdGE7CisJY29uc3QgY2hhciAqcGF0aCA9IE5VTEw7CisJY29uc3QgY2hhciAqcHJlZml4ID0gTlVMTDsKKwlGSUxFICpmcDsKKwlGSUxFICpsb2NhbGZwID0gTlVMTDsKKwlGSUxFICpob21lZGlyZnAgPSBOVUxMOworCWNoYXIgbG9jYWxfcGF0aFtQQVRIX01BWCArIDFdOworCWNoYXIgaG9tZWRpcl9wYXRoW1BBVEhfTUFYICsgMV07CisJY2hhciBsaW5lX2J1ZltCVUZTSVpdOworCXVuc2lnbmVkIGludCBsaW5lbm8sIHBhc3MsIGksIGosIG1heG5zcGVjOworCXNwZWNfdCAqc3BlY19jb3B5ID0gTlVMTDsKKwlpbnQgc3RhdHVzID0gLTEsIGJhc2Vvbmx5ID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKworCS8qIFByb2Nlc3MgYXJndW1lbnRzICovCisJd2hpbGUgKG4tLSkKKwkJc3dpdGNoKG9wdHNbbl0udHlwZSkgeworCQljYXNlIFNFTEFCRUxfT1BUX1BBVEg6CisJCQlwYXRoID0gb3B0c1tuXS52YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIFNFTEFCRUxfT1BUX1NVQlNFVDoKKwkJCXByZWZpeCA9IG9wdHNbbl0udmFsdWU7CisJCQlicmVhazsKKwkJY2FzZSBTRUxBQkVMX09QVF9CQVNFT05MWToKKwkJCWJhc2Vvbmx5ID0gISFvcHRzW25dLnZhbHVlOworCQkJYnJlYWs7CisJCX0KKworCS8qIE9wZW4gdGhlIHNwZWNpZmljYXRpb24gZmlsZS4gKi8KKwlpZiAoKGZwID0gZm9wZW4ocGF0aCwgInIiKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGZzdGF0KGZpbGVubyhmcCksICZzYikgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKCFTX0lTUkVHKHNiLnN0X21vZGUpKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFiYXNlb25seSkgeworCQlzbnByaW50Zihob21lZGlyX3BhdGgsIHNpemVvZihob21lZGlyX3BhdGgpLCAiJXMuaG9tZWRpcnMiLAorCQkJIHBhdGgpOworCQlob21lZGlyZnAgPSBmb3Blbihob21lZGlyX3BhdGgsICJyIik7CisKKwkJc25wcmludGYobG9jYWxfcGF0aCwgc2l6ZW9mKGxvY2FsX3BhdGgpLCAiJXMubG9jYWwiLCBwYXRoKTsKKwkJbG9jYWxmcCA9IGZvcGVuKGxvY2FsX3BhdGgsICJyIik7CisJfQorCisJLyogCisJICogUGVyZm9ybSB0d28gcGFzc2VzIG92ZXIgdGhlIHNwZWNpZmljYXRpb24gZmlsZS4KKwkgKiBUaGUgZmlyc3QgcGFzcyBjb3VudHMgdGhlIG51bWJlciBvZiBzcGVjaWZpY2F0aW9ucyBhbmQKKwkgKiBwZXJmb3JtcyBzaW1wbGUgdmFsaWRhdGlvbiBvZiB0aGUgaW5wdXQuICBBdCB0aGUgZW5kCisJICogb2YgdGhlIGZpcnN0IHBhc3MsIHRoZSBzcGVjIGFycmF5IGlzIGFsbG9jYXRlZC4KKwkgKiBUaGUgc2Vjb25kIHBhc3MgcGVyZm9ybXMgZGV0YWlsZWQgdmFsaWRhdGlvbiBvZiB0aGUgaW5wdXQKKwkgKiBhbmQgZmlsbHMgaW4gdGhlIHNwZWMgYXJyYXkuCisJICovCisJbWF4bnNwZWMgPSBVSU5UX01BWCAvIHNpemVvZihzcGVjX3QpOworCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKwkJbGluZW5vID0gMDsKKwkJZGF0YS0+bnNwZWMgPSAwOworCQlkYXRhLT5uY29tcCA9IDA7CisJCXdoaWxlIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mIGxpbmVfYnVmIC0gMSwgZnApCisJCSAgICAgICAmJiBkYXRhLT5uc3BlYyA8IG1heG5zcGVjKSB7CisJCQlpZiAocHJvY2Vzc19saW5lKHJlYywgcGF0aCwgcHJlZml4LCBsaW5lX2J1ZiwKKwkJCQkJIHBhc3MsICsrbGluZW5vKSAhPSAwKQorCQkJCWdvdG8gZmluaXNoOworCQl9CisJCWlmIChwYXNzID09IDEpIHsKKwkJCXN0YXR1cyA9IG5vZHVwc19zcGVjcyhkYXRhLCBwYXRoKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBmaW5pc2g7CisJCX0KKwkJbGluZW5vID0gMDsKKwkJaWYgKGhvbWVkaXJmcCkKKwkJCXdoaWxlIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mIGxpbmVfYnVmIC0gMSwgaG9tZWRpcmZwKQorCQkJICAgICAgICYmIGRhdGEtPm5zcGVjIDwgbWF4bnNwZWMpIHsKKwkJCQlpZiAocHJvY2Vzc19saW5lCisJCQkJICAgIChyZWMsIGhvbWVkaXJfcGF0aCwgcHJlZml4LAorCQkJCSAgICAgbGluZV9idWYsIHBhc3MsICsrbGluZW5vKSAhPSAwKQorCQkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKworCQlsaW5lbm8gPSAwOworCQlpZiAobG9jYWxmcCkKKwkJCXdoaWxlIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mIGxpbmVfYnVmIC0gMSwgbG9jYWxmcCkKKwkJCSAgICAgICAmJiBkYXRhLT5uc3BlYyA8IG1heG5zcGVjKSB7CisJCQkJaWYgKHByb2Nlc3NfbGluZQorCQkJCSAgICAocmVjLCBsb2NhbF9wYXRoLCBwcmVmaXgsIGxpbmVfYnVmLAorCQkJCSAgICAgcGFzcywgKytsaW5lbm8pICE9IDApCisJCQkJCWdvdG8gZmluaXNoOworCQkJfQorCisJCWlmIChwYXNzID09IDApIHsKKwkJCWlmIChkYXRhLT5uc3BlYyA9PSAwKSB7CisJCQkJc3RhdHVzID0gMDsKKwkJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJCWlmIChOVUxMID09IChkYXRhLT5zcGVjX2FyciA9CisJCQkJICAgICAoc3BlY190ICopIG1hbGxvYyhzaXplb2Yoc3BlY190KSAqIGRhdGEtPm5zcGVjKSkpCisJCQkJZ290byBmaW5pc2g7CisJCQltZW1zZXQoZGF0YS0+c3BlY19hcnIsIDAsIHNpemVvZihzcGVjX3QpKmRhdGEtPm5zcGVjKTsKKwkJCW1heG5zcGVjID0gZGF0YS0+bnNwZWM7CisJCQlyZXdpbmQoZnApOworCQkJaWYgKGhvbWVkaXJmcCkKKwkJCQlyZXdpbmQoaG9tZWRpcmZwKTsKKwkJCWlmIChsb2NhbGZwKQorCQkJCXJld2luZChsb2NhbGZwKTsKKwkJfQorCX0KKworCS8qIE1vdmUgZXhhY3QgcGF0aG5hbWUgc3BlY2lmaWNhdGlvbnMgdG8gdGhlIGVuZC4gKi8KKwlzcGVjX2NvcHkgPSAoc3BlY190ICopIG1hbGxvYyhzaXplb2Yoc3BlY190KSAqIGRhdGEtPm5zcGVjKTsKKwlpZiAoIXNwZWNfY29weSkKKwkJZ290byBmaW5pc2g7CisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5zcGVjOyBpKyspCisJCWlmIChkYXRhLT5zcGVjX2FycltpXS5oYXNNZXRhQ2hhcnMpCisJCQltZW1jcHkoJnNwZWNfY29weVtqKytdLAorCQkJICAgICAgICZkYXRhLT5zcGVjX2FycltpXSwgc2l6ZW9mKHNwZWNfdCkpOworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5uc3BlYzsgaSsrKQorCQlpZiAoIWRhdGEtPnNwZWNfYXJyW2ldLmhhc01ldGFDaGFycykKKwkJCW1lbWNweSgmc3BlY19jb3B5W2orK10sCisJCQkgICAgICAgJmRhdGEtPnNwZWNfYXJyW2ldLCBzaXplb2Yoc3BlY190KSk7CisJZnJlZShkYXRhLT5zcGVjX2Fycik7CisJZGF0YS0+c3BlY19hcnIgPSBzcGVjX2NvcHk7CisKKwlzdGF0dXMgPSAwOworZmluaXNoOgorCWZjbG9zZShmcCk7CisJaWYgKGRhdGEtPnNwZWNfYXJyICE9IHNwZWNfY29weSkKKwkJZnJlZShkYXRhLT5zcGVjX2Fycik7CisJaWYgKGhvbWVkaXJmcCkKKwkJZmNsb3NlKGhvbWVkaXJmcCk7CisJaWYgKGxvY2FsZnApCisJCWZjbG9zZShsb2NhbGZwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogQmFja2VuZCBpbnRlcmZhY2Ugcm91dGluZXMKKyAqLworc3RhdGljIHZvaWQgY2xvc2VmKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjKQoreworCXN0cnVjdCBzYXZlZF9kYXRhICpkYXRhID0gKHN0cnVjdCBzYXZlZF9kYXRhICopcmVjLT5kYXRhOworCXN0cnVjdCBzcGVjICpzcGVjOworCXN0cnVjdCBzdGVtICpzdGVtOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5zcGVjOyBpKyspIHsKKwkJc3BlYyA9ICZkYXRhLT5zcGVjX2FycltpXTsKKwkJZnJlZShzcGVjLT5yZWdleF9zdHIpOworCQlmcmVlKHNwZWMtPnR5cGVfc3RyKTsKKwkJZnJlZShzcGVjLT5sci5jdHhfcmF3KTsKKwkJZnJlZShzcGVjLT5sci5jdHhfdHJhbnMpOworCQlpZiAoc3BlYy0+cmVnY29tcCkKKwkJCXJlZ2ZyZWUoJnNwZWMtPnJlZ2V4KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludClkYXRhLT5udW1fc3RlbXM7IGkrKykgeworCQlzdGVtID0gJmRhdGEtPnN0ZW1fYXJyW2ldOworCQlmcmVlKHN0ZW0tPmJ1Zik7CisJfQorCisJaWYgKGRhdGEtPnNwZWNfYXJyKQorCQlmcmVlKGRhdGEtPnNwZWNfYXJyKTsKKwlpZiAoZGF0YS0+c3RlbV9hcnIpCisJCWZyZWUoZGF0YS0+c3RlbV9hcnIpOworCQorCWZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VsYWJlbF9sb29rdXBfcmVjICpsb29rdXBfY29tbW9uKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLAorCQkJCQkJY29uc3QgY2hhciAqa2V5LCBpbnQgdHlwZSwKKwkJCQkJCWJvb2wgcGFydGlhbCkKK3sKKwlzdHJ1Y3Qgc2F2ZWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qgc2F2ZWRfZGF0YSAqKXJlYy0+ZGF0YTsKKwlzcGVjX3QgKnNwZWNfYXJyID0gZGF0YS0+c3BlY19hcnI7CisJaW50IGksIHJjLCBmaWxlX3N0ZW07CisJbW9kZV90IG1vZGUgPSAobW9kZV90KXR5cGU7CisJY29uc3QgY2hhciAqYnVmOworCXN0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgKnJldCA9IE5VTEw7CisJY2hhciAqY2xlYW5fa2V5ID0gTlVMTDsKKwljb25zdCBjaGFyICpwcmV2X3NsYXNoLCAqbmV4dF9zbGFzaDsKKwl1bnNpZ25lZCBpbnQgc29mYXIgPSAwOworCXNpemVfdCBrZXlsZW4gPSBzdHJsZW4oa2V5KTsKKworCWlmICghZGF0YS0+bnNwZWMpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCWdvdG8gZmluaXNoOworCX0KKworCS8qIFJlbW92ZSBkdXBsaWNhdGUgc2xhc2hlcyAqLworCWlmICgobmV4dF9zbGFzaCA9IHN0cnN0cihrZXksICIvLyIpKSkgeworCQljbGVhbl9rZXkgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGtleSkgKyAxKTsKKwkJaWYgKCFjbGVhbl9rZXkpCisJCQlnb3RvIGZpbmlzaDsKKwkJcHJldl9zbGFzaCA9IGtleTsKKwkJd2hpbGUgKG5leHRfc2xhc2gpIHsKKwkJCW1lbWNweShjbGVhbl9rZXkgKyBzb2ZhciwgcHJldl9zbGFzaCwgbmV4dF9zbGFzaCAtIHByZXZfc2xhc2gpOworCQkJc29mYXIgKz0gbmV4dF9zbGFzaCAtIHByZXZfc2xhc2g7CisJCQlwcmV2X3NsYXNoID0gbmV4dF9zbGFzaCArIDE7CisJCQluZXh0X3NsYXNoID0gc3Ryc3RyKHByZXZfc2xhc2gsICIvLyIpOworCQl9CisJCXN0cmNweShjbGVhbl9rZXkgKyBzb2ZhciwgcHJldl9zbGFzaCk7CisJCWtleSA9IGNsZWFuX2tleTsKKwl9CisKKwlidWYgPSBrZXk7CisJZmlsZV9zdGVtID0gZmluZF9zdGVtX2Zyb21fZmlsZShkYXRhLCAmYnVmKTsKKwltb2RlICY9IFNfSUZNVDsKKworCS8qIAorCSAqIENoZWNrIGZvciBtYXRjaGluZyBzcGVjaWZpY2F0aW9ucyBpbiByZXZlcnNlIG9yZGVyLCBzbyB0aGF0CisJICogdGhlIGxhc3QgbWF0Y2hpbmcgc3BlY2lmaWNhdGlvbiBpcyB1c2VkLgorCSAqLworCWZvciAoaSA9IGRhdGEtPm5zcGVjIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJLyogaWYgdGhlIHNwZWMgaW4gcXVlc3Rpb24gbWF0Y2hlcyBubyBzdGVtIG9yIGhhcyB0aGUgc2FtZQorCQkgKiBzdGVtIGFzIHRoZSBmaWxlIEFORCBpZiB0aGUgc3BlYyBpbiBxdWVzdGlvbiBoYXMgbm8gbW9kZQorCQkgKiBzcGVjaWZpZWQgb3IgaWYgdGhlIG1vZGUgbWF0Y2hlcyB0aGUgZmlsZSBtb2RlIHRoZW4gd2UgZG8KKwkJICogYSByZWdleCBjaGVjayAgICAgICAgKi8KKwkJaWYgKChzcGVjX2FycltpXS5zdGVtX2lkID09IC0xCisJCSAgICAgfHwgc3BlY19hcnJbaV0uc3RlbV9pZCA9PSBmaWxlX3N0ZW0pCisJCSAgICAmJiAoIW1vZGUgfHwgIXNwZWNfYXJyW2ldLm1vZGUKKwkJCXx8IG1vZGUgPT0gc3BlY19hcnJbaV0ubW9kZSkpIHsKKwkJCWlmIChjb21waWxlX3JlZ2V4KGRhdGEsICZzcGVjX2FycltpXSwgTlVMTCkgPCAwKQorCQkJCWdvdG8gZmluaXNoOworCQkJaWYgKHNwZWNfYXJyW2ldLnN0ZW1faWQgPT0gLTEpCisJCQkJcmMgPSByZWdleGVjKCZzcGVjX2FycltpXS5yZWdleCwga2V5LCAwLCAwLCAwKTsKKwkJCWVsc2UKKwkJCQlyYyA9IHJlZ2V4ZWMoJnNwZWNfYXJyW2ldLnJlZ2V4LCBidWYsIDAsIDAsIDApOworCisJCQlpZiAocmMgPT0gMCkgeworCQkJCXNwZWNfYXJyW2ldLm1hdGNoZXMrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBhcnRpYWwpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0byBzZWUgaWYgdGhlCisJCQkJICoga2V5IGhhcyBhbnkgZGlyZWN0IG1hdGNoLiAgTm93IHdlIGp1c3QgbmVlZAorCQkJCSAqIHRvIGNoZWNrIGZvciBwYXJ0aWFsIG1hdGNoZXMuCisJCQkJICogU2luY2UgUE9TSVggcmVnZXggZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0CisJCQkJICogcGFydGlhbCBtYXRjaCwgd2UgY3J1ZGVseSBhcHByb3hpbWF0ZSBpdAorCQkJCSAqIHZpYSBhIHByZWZpeCBtYXRjaC4KKwkJCQkgKiBUaGlzIGlzIGltcHJlY2lzZSBhbmQgY291bGQgeWllbGQKKwkJCQkgKiBmYWxzZSBwb3NpdGl2ZXMgb3IgbmVnYXRpdmVzIGJ1dAorCQkJCSAqIGFwcGVhcnMgdG8gd29yayB3aXRoIG91ciBjdXJyZW50IHNldCBvZgorCQkJCSAqIHJlZ2V4IHN0cmluZ3MuCisJCQkJICogQ29udmVydCB0byB1c2luZyBwY3JlIHBhcnRpYWwgbWF0Y2gKKwkJCQkgKiBpZi93aGVuIHBjcmUgYmVjb21lcyBhdmFpbGFibGUgaW4gQW5kcm9pZC4KKwkJCQkgKi8KKwkJCQlpZiAoc3BlY19hcnJbaV0ucHJlZml4X2xlbiA+IDEgJiYKKwkJCQkgICAgIXN0cm5jbXAoa2V5LCBzcGVjX2FycltpXS5yZWdleF9zdHIsCisJCQkJCSAgICAga2V5bGVuIDwgc3BlY19hcnJbaV0ucHJlZml4X2xlbiA/CisJCQkJCSAgICAga2V5bGVuIDogc3BlY19hcnJbaV0ucHJlZml4X2xlbikpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAocmMgPT0gUkVHX05PTUFUQ0gpCisJCQkJY29udGludWU7CisJCQkvKiBlbHNlIGl0J3MgYW4gZXJyb3IgKi8KKwkJCWdvdG8gZmluaXNoOworCQl9CisJfQorCisJaWYgKGkgPCAwIHx8IHN0cmNtcChzcGVjX2FycltpXS5sci5jdHhfcmF3LCAiPDxub25lPj4iKSA9PSAwKSB7CisJCS8qIE5vIG1hdGNoaW5nIHNwZWNpZmljYXRpb24uICovCisJCWVycm5vID0gRU5PRU5UOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwlyZXQgPSAmc3BlY19hcnJbaV0ubHI7CisKK2ZpbmlzaDoKKwlmcmVlKGNsZWFuX2tleSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgKmxvb2t1cChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywKKwkJCQkJIGNvbnN0IGNoYXIgKmtleSwgaW50IHR5cGUpCit7CisJcmV0dXJuIGxvb2t1cF9jb21tb24ocmVjLCBrZXksIHR5cGUsIGZhbHNlKTsKK30KKworc3RhdGljIGJvb2wgcGFydGlhbF9tYXRjaChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywgY29uc3QgY2hhciAqa2V5KQoreworCXJldHVybiBsb29rdXBfY29tbW9uKHJlYywga2V5LCAwLCB0cnVlKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgc3RhdHMoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMpCit7CisJc3RydWN0IHNhdmVkX2RhdGEgKmRhdGEgPSAoc3RydWN0IHNhdmVkX2RhdGEgKilyZWMtPmRhdGE7CisJdW5zaWduZWQgaW50IGksIG5zcGVjID0gZGF0YS0+bnNwZWM7CisJc3BlY190ICpzcGVjX2FyciA9IGRhdGEtPnNwZWNfYXJyOworCisJZm9yIChpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKKwkJaWYgKHNwZWNfYXJyW2ldLm1hdGNoZXMgPT0gMCkgeworCQkJaWYgKHNwZWNfYXJyW2ldLnR5cGVfc3RyKSB7CisJCQkJc2VsaW51eF9sb2coU0VMSU5VWF9XQVJOSU5HLAorCQkJCSAgICAiV2FybmluZyEgIE5vIG1hdGNoZXMgZm9yICglcywgJXMsICVzKVxuIiwKKwkJCQkgICAgc3BlY19hcnJbaV0ucmVnZXhfc3RyLAorCQkJCSAgICBzcGVjX2FycltpXS50eXBlX3N0ciwKKwkJCQkgICAgc3BlY19hcnJbaV0ubHIuY3R4X3Jhdyk7CisJCQl9IGVsc2UgeworCQkJCXNlbGludXhfbG9nKFNFTElOVVhfV0FSTklORywKKwkJCQkgICAgIldhcm5pbmchICBObyBtYXRjaGVzIGZvciAoJXMsICVzKVxuIiwKKwkJCQkgICAgc3BlY19hcnJbaV0ucmVnZXhfc3RyLAorCQkJCSAgICBzcGVjX2FycltpXS5sci5jdHhfcmF3KTsKKwkJCX0KKwkJfQorCX0KK30KKworaW50IHNlbGFiZWxfZmlsZV9pbml0KHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLCBjb25zdCBzdHJ1Y3Qgc2VsaW51eF9vcHQgKm9wdHMsCisJCSAgICAgIHVuc2lnbmVkIG5vcHRzKQoreworCXN0cnVjdCBzYXZlZF9kYXRhICpkYXRhOworCisJZGF0YSA9IChzdHJ1Y3Qgc2F2ZWRfZGF0YSAqKW1hbGxvYyhzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwlyZWMtPmRhdGEgPSBkYXRhOworCXJlYy0+ZnVuY19jbG9zZSA9ICZjbG9zZWY7CisJcmVjLT5mdW5jX3N0YXRzID0gJnN0YXRzOworCXJlYy0+ZnVuY19sb29rdXAgPSAmbG9va3VwOworCXJlYy0+ZnVuY19wYXJ0aWFsX21hdGNoID0gJnBhcnRpYWxfbWF0Y2g7CisKKwlyZXR1cm4gaW5pdChyZWMsIG9wdHMsIG5vcHRzKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbGFiZWxfaW50ZXJuYWwuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbGFiZWxfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRlM2NjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9sYWJlbF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSB0aGUgbGFiZWxlcgorICogZm9yIGNhbGxpbmcgdGhlIHVzZXItc3VwcGxpZWQgbWVtb3J5IGFsbG9jYXRpb24sIHZhbGlkYXRpb24sCisgKiBhbmQgbG9ja2luZyByb3V0aW5lLgorICoKKyAqIEF1dGhvciA6IEVhbW9uIFdhbHNoIDxld2Fsc2hAZXBvY2gubmNzYy5taWw+CisgKi8KKyNpZm5kZWYgX1NFTEFCRUxfSU5URVJOQUxfSF8KKyNkZWZpbmUgX1NFTEFCRUxfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorI2luY2x1ZGUgPHNlbGludXgvbGFiZWwuaD4KKyNpbmNsdWRlICJkc28uaCIKKworLyoKKyAqIEluc3RhbGxlZCBiYWNrZW5kcworICovCitpbnQgc2VsYWJlbF9maWxlX2luaXQoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywKKwkJICAgICAgdW5zaWduZWQgbm9wdHMpIGhpZGRlbjsKK2ludCBzZWxhYmVsX21lZGlhX2luaXQoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywKKwkJICAgICAgdW5zaWduZWQgbm9wdHMpIGhpZGRlbjsKK2ludCBzZWxhYmVsX3hfaW5pdChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywgY29uc3Qgc3RydWN0IHNlbGludXhfb3B0ICpvcHRzLAorCQkgICB1bnNpZ25lZCBub3B0cykgaGlkZGVuOworaW50IHNlbGFiZWxfZGJfaW5pdChzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUgKnJlYywKKwkJICAgIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywgdW5zaWduZWQgbm9wdHMpIGhpZGRlbjsKK2ludCBzZWxhYmVsX3Byb3BlcnR5X2luaXQoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpyZWMsCisJCQkgIGNvbnN0IHN0cnVjdCBzZWxpbnV4X29wdCAqb3B0cywgdW5zaWduZWQgbm9wdHMpIGhpZGRlbjsKKworLyoKKyAqIExhYmVsaW5nIGludGVybmFsIHN0cnVjdHVyZXMKKyAqLworc3RydWN0IHNlbGFiZWxfc3ViIHsKKwljaGFyICpzcmM7CisJaW50IHNsZW47CisJY2hhciAqZHN0OworCXN0cnVjdCBzZWxhYmVsX3N1YiAqbmV4dDsKK307CisKK3N0cnVjdCBzZWxhYmVsX2xvb2t1cF9yZWMgeworCWNoYXIgKiBjdHhfcmF3OworCWNoYXIgKiBjdHhfdHJhbnM7CisJaW50IHZhbGlkYXRlZDsKK307CisKK3N0cnVjdCBzZWxhYmVsX2hhbmRsZSB7CisJLyogYXJndW1lbnRzIHRoYXQgd2VyZSBwYXNzZWQgdG8gc2VsYWJlbF9vcGVuICovCisJdW5zaWduZWQgaW50IGJhY2tlbmQ7CisJaW50IHZhbGlkYXRpbmc7CisKKwkvKiBsYWJlbGluZyBvcGVyYXRpb25zICovCisJc3RydWN0IHNlbGFiZWxfbG9va3VwX3JlYyAqKCpmdW5jX2xvb2t1cCkgKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaCwKKwkJCQkJCSAgIGNvbnN0IGNoYXIgKmtleSwgaW50IHR5cGUpOworCXZvaWQgKCpmdW5jX2Nsb3NlKSAoc3RydWN0IHNlbGFiZWxfaGFuZGxlICpoKTsKKwl2b2lkICgqZnVuY19zdGF0cykgKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaCk7CisJYm9vbCAoKmZ1bmNfcGFydGlhbF9tYXRjaCkgKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqaCwgY29uc3QgY2hhciAqa2V5KTsKKworCS8qIHN1cHBvcnRzIGJhY2tlbmQtc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24gKi8KKwl2b2lkICpkYXRhOworCisJLyogc3Vic3RpdHV0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3Qgc2VsYWJlbF9zdWIgKnN1YnM7Cit9OworCisvKgorICogVmFsaWRhdGlvbiBmdW5jdGlvbgorICovCitleHRlcm4gaW50CitzZWxhYmVsX3ZhbGlkYXRlKHN0cnVjdCBzZWxhYmVsX2hhbmRsZSAqcmVjLAorCQkgc3RydWN0IHNlbGFiZWxfbG9va3VwX3JlYyAqY29udGV4dHMpIGhpZGRlbjsKKworI2VuZGlmCQkJCS8qIF9TRUxBQkVMX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xnZXRmaWxlY29uLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xnZXRmaWxlY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4NTFhNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbGdldGZpbGVjb24uYwpAQCAtMCwwICsxLDUwIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy94YXR0ci5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworaW50IGxnZXRmaWxlY29uKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKiogY29udGV4dCkKK3sKKwljaGFyICpidWY7CisJc3NpemVfdCBzaXplOworCXNzaXplX3QgcmV0OworCisJc2l6ZSA9IElOSVRDT05URVhUTEVOICsgMTsKKwlidWYgPSBtYWxsb2Moc2l6ZSk7CisJaWYgKCFidWYpCisJCXJldHVybiAtMTsKKwltZW1zZXQoYnVmLCAwLCBzaXplKTsKKworCXJldCA9IGxnZXR4YXR0cihwYXRoLCBYQVRUUl9OQU1FX1NFTElOVVgsIGJ1Ziwgc2l6ZSAtIDEpOworCWlmIChyZXQgPCAwICYmIGVycm5vID09IEVSQU5HRSkgeworCQljaGFyICpuZXdidWY7CisKKwkJc2l6ZSA9IGxnZXR4YXR0cihwYXRoLCBYQVRUUl9OQU1FX1NFTElOVVgsIE5VTEwsIDApOworCQlpZiAoc2l6ZSA8IDApCisJCQlnb3RvIG91dDsKKworCQlzaXplKys7CisJCW5ld2J1ZiA9IHJlYWxsb2MoYnVmLCBzaXplKTsKKwkJaWYgKCFuZXdidWYpCisJCQlnb3RvIG91dDsKKworCQlidWYgPSBuZXdidWY7CisJCW1lbXNldChidWYsIDAsIHNpemUpOworCQlyZXQgPSBsZ2V0eGF0dHIocGF0aCwgWEFUVFJfTkFNRV9TRUxJTlVYLCBidWYsIHNpemUgLSAxKTsKKwl9CisgICAgICBvdXQ6CisJaWYgKHJldCA9PSAwKSB7CisJCS8qIFJlLW1hcCBlbXB0eSBhdHRyaWJ1dGUgdmFsdWVzIHRvIGVycm9ycy4gKi8KKwkJZXJybm8gPSBFT1BOT1RTVVBQOworCQlyZXQgPSAtMTsKKwl9CisJaWYgKHJldCA8IDApCisJCWZyZWUoYnVmKTsKKwllbHNlCisJCSpjb250ZXh0ID0gYnVmOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xvYWRfcG9saWN5LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xvYWRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwMzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbG9hZF9wb2xpY3kuYwpAQCAtMCwwICsxLDQxIEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJzZWxpbnV4X2ludGVybmFsLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJjYWxsYmFja3MuaCIKKworaW50IHNlY3VyaXR5X2xvYWRfcG9saWN5KHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwlpbnQgZmQsIHJldDsKKworCWlmICghc2VsaW51eF9tbnQpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiAtMTsKKwl9CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzL2xvYWQiLCBzZWxpbnV4X21udCk7CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcmV0ID0gd3JpdGUoZmQsIGRhdGEsIGxlbik7CisJY2xvc2UoZmQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2hpZGRlbl9kZWYoc2VjdXJpdHlfbG9hZF9wb2xpY3kpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xzZXRmaWxlY29uLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL2xzZXRmaWxlY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0N2Y5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbHNldGZpbGVjb24uYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy94YXR0ci5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworaW50IGxzZXRmaWxlY29uKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmNvbnRleHQpCit7CisJcmV0dXJuIGxzZXR4YXR0cihwYXRoLCBYQVRUUl9OQU1FX1NFTElOVVgsIGNvbnRleHQsIHN0cmxlbihjb250ZXh0KSArIDEsCisJCQkgMCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbWFwcGluZy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9tYXBwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NThjZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvbWFwcGluZy5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ2xhc3MgYW5kIHBlcm1pc3Npb24gbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KKyNpbmNsdWRlIDxzZWxpbnV4L2F2Yy5oPgorI2luY2x1ZGUgIm1hcHBpbmcuaCIKKworLyoKKyAqIENsYXNzIGFuZCBwZXJtaXNzaW9uIG1hcHBpbmdzCisgKi8KKworc3RydWN0IHNlbGludXhfbWFwcGluZyB7CisJc2VjdXJpdHlfY2xhc3NfdCB2YWx1ZTsgLyogcmVhbCwga2VybmVsIHZhbHVlICovCisJdW5zaWduZWQgbnVtX3Blcm1zOworCWFjY2Vzc192ZWN0b3JfdCBwZXJtc1tzaXplb2YoYWNjZXNzX3ZlY3Rvcl90KSAqIDhdOworfTsKKworc3RhdGljIHN0cnVjdCBzZWxpbnV4X21hcHBpbmcgKmN1cnJlbnRfbWFwcGluZyA9IE5VTEw7CitzdGF0aWMgc2VjdXJpdHlfY2xhc3NfdCBjdXJyZW50X21hcHBpbmdfc2l6ZSA9IDA7CisKKy8qCisgKiBNYXBwaW5nIHNldHRpbmcgZnVuY3Rpb24KKyAqLworCitpbnQKK3NlbGludXhfc2V0X21hcHBpbmcoc3RydWN0IHNlY3VyaXR5X2NsYXNzX21hcHBpbmcgKm1hcCkKK3sKKwlzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2VsaW51eF9tYXBwaW5nKTsKKwlzZWN1cml0eV9jbGFzc190IGksIGo7CisJdW5zaWduZWQgazsKKworCWZyZWUoY3VycmVudF9tYXBwaW5nKTsKKwljdXJyZW50X21hcHBpbmcgPSBOVUxMOworCWN1cnJlbnRfbWFwcGluZ19zaXplID0gMDsKKworCWlmIChhdmNfcmVzZXQoKSA8IDApCisJCWdvdG8gZXJyOworCisJLyogRmluZCBudW1iZXIgb2YgY2xhc3NlcyBpbiB0aGUgaW5wdXQgbWFwcGluZyAqLworCWlmICghbWFwKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJaSA9IDA7CisJd2hpbGUgKG1hcFtpXS5uYW1lKQorCQlpKys7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGNsYXNzIHJlY29yZHMsIHBsdXMgb25lIGZvciBjbGFzcyB6ZXJvICovCisJY3VycmVudF9tYXBwaW5nID0gKHN0cnVjdCBzZWxpbnV4X21hcHBpbmcgKiljYWxsb2MoKytpLCBzaXplKTsKKwlpZiAoIWN1cnJlbnRfbWFwcGluZykKKwkJZ290byBlcnI7CisKKwkvKiBTdG9yZSB0aGUgcmF3IGNsYXNzIGFuZCBwZXJtaXNzaW9uIHZhbHVlcyAqLworCWogPSAwOworCXdoaWxlIChtYXBbal0ubmFtZSkgeworCQlzdHJ1Y3Qgc2VjdXJpdHlfY2xhc3NfbWFwcGluZyAqcF9pbiA9IG1hcCArIChqKyspOworCQlzdHJ1Y3Qgc2VsaW51eF9tYXBwaW5nICpwX291dCA9IGN1cnJlbnRfbWFwcGluZyArIGo7CisKKwkJcF9vdXQtPnZhbHVlID0gc3RyaW5nX3RvX3NlY3VyaXR5X2NsYXNzKHBfaW4tPm5hbWUpOworCQlpZiAoIXBfb3V0LT52YWx1ZSkKKwkJCWdvdG8gZXJyMjsKKworCQlrID0gMDsKKwkJd2hpbGUgKHBfaW4tPnBlcm1zICYmIHBfaW4tPnBlcm1zW2tdKSB7CisJCQkvKiBBbiBlbXB0eSBwZXJtaXNzaW9uIHN0cmluZyBza2lwcyBhaGVhZCAqLworCQkJaWYgKCEqcF9pbi0+cGVybXNba10pIHsKKwkJCQlrKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwX291dC0+cGVybXNba10gPSBzdHJpbmdfdG9fYXZfcGVybShwX291dC0+dmFsdWUsCisJCQkJCQkJICAgIHBfaW4tPnBlcm1zW2tdKTsKKwkJCWlmICghcF9vdXQtPnBlcm1zW2tdKQorCQkJCWdvdG8gZXJyMjsKKwkJCWsrKzsKKwkJfQorCQlwX291dC0+bnVtX3Blcm1zID0gazsKKwl9CisKKwkvKiBTZXQgdGhlIG1hcHBpbmcgc2l6ZSBoZXJlIHNvIHRoZSBhYm92ZSBsb29rdXBzIGFyZSAicmF3IiAqLworCWN1cnJlbnRfbWFwcGluZ19zaXplID0gaTsKKwlyZXR1cm4gMDsKK2VycjI6CisJZnJlZShjdXJyZW50X21hcHBpbmcpOworCWN1cnJlbnRfbWFwcGluZyA9IE5VTEw7CisJY3VycmVudF9tYXBwaW5nX3NpemUgPSAwOworZXJyOgorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEdldCByZWFsLCBrZXJuZWwgdmFsdWVzIGZyb20gbWFwcGVkIHZhbHVlcworICovCisKK3NlY3VyaXR5X2NsYXNzX3QKK3VubWFwX2NsYXNzKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKQoreworCWlmICh0Y2xhc3MgPCBjdXJyZW50X21hcHBpbmdfc2l6ZSkKKwkJcmV0dXJuIGN1cnJlbnRfbWFwcGluZ1t0Y2xhc3NdLnZhbHVlOworCisJYXNzZXJ0KGN1cnJlbnRfbWFwcGluZ19zaXplID09IDApOworCXJldHVybiB0Y2xhc3M7Cit9CisKK2FjY2Vzc192ZWN0b3JfdAordW5tYXBfcGVybShzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHRwZXJtKQoreworCWlmICh0Y2xhc3MgPCBjdXJyZW50X21hcHBpbmdfc2l6ZSkgeworCQl1bnNpZ25lZCBpOworCQlhY2Nlc3NfdmVjdG9yX3Qga3Blcm0gPSAwOworCisJCWZvciAoaT0wOyBpPGN1cnJlbnRfbWFwcGluZ1t0Y2xhc3NdLm51bV9wZXJtczsgaSsrKQorCQkJaWYgKHRwZXJtICYgKDE8PGkpKSB7CisJCQkJYXNzZXJ0KGN1cnJlbnRfbWFwcGluZ1t0Y2xhc3NdLnBlcm1zW2ldKTsKKwkJCQlrcGVybSB8PSBjdXJyZW50X21hcHBpbmdbdGNsYXNzXS5wZXJtc1tpXTsKKwkJCQl0cGVybSAmPSB+KDE8PGkpOworCQkJfQorCQlhc3NlcnQodHBlcm0gPT0gMCk7CisJCXJldHVybiBrcGVybTsKKwl9CisKKwlhc3NlcnQoY3VycmVudF9tYXBwaW5nX3NpemUgPT0gMCk7CisJcmV0dXJuIHRwZXJtOworfQorCisvKgorICogR2V0IG1hcHBlZCB2YWx1ZXMgZnJvbSByZWFsLCBrZXJuZWwgdmFsdWVzCisgKi8KKworc2VjdXJpdHlfY2xhc3NfdAorbWFwX2NsYXNzKHNlY3VyaXR5X2NsYXNzX3Qga2NsYXNzKQoreworCXNlY3VyaXR5X2NsYXNzX3QgaTsKKworCWZvciAoaT0wOyBpPGN1cnJlbnRfbWFwcGluZ19zaXplOyBpKyspCisJCWlmIChjdXJyZW50X21hcHBpbmdbaV0udmFsdWUgPT0ga2NsYXNzKQorCQkJcmV0dXJuIGk7CisKKwlhc3NlcnQoY3VycmVudF9tYXBwaW5nX3NpemUgPT0gMCk7CisJcmV0dXJuIGtjbGFzczsKK30KKworYWNjZXNzX3ZlY3Rvcl90CittYXBfcGVybShzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IGtwZXJtKQoreworCWlmICh0Y2xhc3MgPCBjdXJyZW50X21hcHBpbmdfc2l6ZSkgeworCQl1bnNpZ25lZCBpOworCQlhY2Nlc3NfdmVjdG9yX3QgdHBlcm0gPSAwOworCisJCWZvciAoaT0wOyBpPGN1cnJlbnRfbWFwcGluZ1t0Y2xhc3NdLm51bV9wZXJtczsgaSsrKQorCQkJaWYgKGtwZXJtICYgY3VycmVudF9tYXBwaW5nW3RjbGFzc10ucGVybXNbaV0pIHsKKwkJCQl0cGVybSB8PSAxPDxpOworCQkJCWtwZXJtICY9IH5jdXJyZW50X21hcHBpbmdbdGNsYXNzXS5wZXJtc1tpXTsKKwkJCX0KKwkJYXNzZXJ0KGtwZXJtID09IDApOworCQlyZXR1cm4gdHBlcm07CisJfQorCisJYXNzZXJ0KGN1cnJlbnRfbWFwcGluZ19zaXplID09IDApOworCXJldHVybiBrcGVybTsKK30KKwordm9pZAorbWFwX2RlY2lzaW9uKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBzdHJ1Y3QgYXZfZGVjaXNpb24gKmF2ZCkKK3sKKwlpZiAodGNsYXNzIDwgY3VycmVudF9tYXBwaW5nX3NpemUpIHsKKwkJdW5zaWduZWQgaTsKKwkJYWNjZXNzX3ZlY3Rvcl90IHJlc3VsdDsKKworCQlmb3IgKGk9MCwgcmVzdWx0PTA7IGk8Y3VycmVudF9tYXBwaW5nW3RjbGFzc10ubnVtX3Blcm1zOyBpKyspCisJCQlpZiAoYXZkLT5hbGxvd2VkICYgY3VycmVudF9tYXBwaW5nW3RjbGFzc10ucGVybXNbaV0pCisJCQkJcmVzdWx0IHw9IDE8PGk7CisJCWF2ZC0+YWxsb3dlZCA9IHJlc3VsdDsKKworCQlmb3IgKGk9MCwgcmVzdWx0PTA7IGk8Y3VycmVudF9tYXBwaW5nW3RjbGFzc10ubnVtX3Blcm1zOyBpKyspCisJCQlpZiAoYXZkLT5kZWNpZGVkICYgY3VycmVudF9tYXBwaW5nW3RjbGFzc10ucGVybXNbaV0pCisJCQkJcmVzdWx0IHw9IDE8PGk7CisJCWF2ZC0+ZGVjaWRlZCA9IHJlc3VsdDsKKworCQlmb3IgKGk9MCwgcmVzdWx0PTA7IGk8Y3VycmVudF9tYXBwaW5nW3RjbGFzc10ubnVtX3Blcm1zOyBpKyspCisJCQlpZiAoYXZkLT5hdWRpdGFsbG93ICYgY3VycmVudF9tYXBwaW5nW3RjbGFzc10ucGVybXNbaV0pCisJCQkJcmVzdWx0IHw9IDE8PGk7CisJCWF2ZC0+YXVkaXRhbGxvdyA9IHJlc3VsdDsKKworCQlmb3IgKGk9MCwgcmVzdWx0PTA7IGk8Y3VycmVudF9tYXBwaW5nW3RjbGFzc10ubnVtX3Blcm1zOyBpKyspCisJCQlpZiAoYXZkLT5hdWRpdGRlbnkgJiBjdXJyZW50X21hcHBpbmdbdGNsYXNzXS5wZXJtc1tpXSkKKwkJCQlyZXN1bHQgfD0gMTw8aTsKKwkJYXZkLT5hdWRpdGRlbnkgPSByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9tYXBwaW5nLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL21hcHBpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY3NTZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9tYXBwaW5nLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGNsYXNzIGFuZCBwZXJtaXNzaW9uIG1hcHBpbmdzIHVzZWQgdG8gCisgKiBoaWRlIHRoZSBrZXJuZWwgbnVtYmVycyBmcm9tIHVzZXJzcGFjZSBieSBhbGxvd2luZyB1c2Vyc3BhY2Ugb2JqZWN0CisgKiBtYW5hZ2VycyB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjbGFzc2VzIGFuZCBwZXJtaXNzaW9ucy4KKyAqLworI2lmbmRlZiBfU0VMSU5VWF9NQVBQSU5HX0hfCisjZGVmaW5lIF9TRUxJTlVYX01BUFBJTkdfSF8KKworI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPgorCisvKgorICogR2V0IHJlYWwsIGtlcm5lbCB2YWx1ZXMgZnJvbSBtYXBwZWQgdmFsdWVzCisgKi8KKworZXh0ZXJuIHNlY3VyaXR5X2NsYXNzX3QKK3VubWFwX2NsYXNzKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKTsKKworZXh0ZXJuIGFjY2Vzc192ZWN0b3JfdAordW5tYXBfcGVybShzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IHRwZXJtKTsKKworLyoKKyAqIEdldCBtYXBwZWQgdmFsdWVzIGZyb20gcmVhbCwga2VybmVsIHZhbHVlcworICovCisKK2V4dGVybiBzZWN1cml0eV9jbGFzc190CittYXBfY2xhc3Moc2VjdXJpdHlfY2xhc3NfdCBrY2xhc3MpOworCitleHRlcm4gYWNjZXNzX3ZlY3Rvcl90CittYXBfcGVybShzZWN1cml0eV9jbGFzc190IHRjbGFzcywgYWNjZXNzX3ZlY3Rvcl90IGtwZXJtKTsKKworZXh0ZXJuIHZvaWQKK21hcF9kZWNpc2lvbihzZWN1cml0eV9jbGFzc190IHRjbGFzcywgc3RydWN0IGF2X2RlY2lzaW9uICphdmQpOworCisvKm1hcHBpbmcgaXMgbm90IHVzZWQgZm9yIGVtYmVkZGVkIGJ1aWxkKi8KKyNpZmRlZiBESVNBQkxFX0FWQyAKKyNkZWZpbmUgdW5tYXBfcGVybSh4LHkpIHkKKyNkZWZpbmUgdW5tYXBfY2xhc3MoeCkgeAorI2RlZmluZSBtYXBfZGVjaXNpb24oeCx5KSAKKyNlbmRpZgorCisjZW5kaWYJCQkJLyogX1NFTElOVVhfTUFQUElOR19IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9wb2xpY3kuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvcG9saWN5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhNDE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvcG9saWN5LmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfUE9MSUNZX0hfCisjZGVmaW5lIF9QT0xJQ1lfSF8KKworLyogUHJpdmF0ZSBkZWZpbml0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgbGlic2VsaW51eC4gKi8KKworLyogeGF0dHIgbmFtZSBmb3IgU0VMaW51eCBhdHRyaWJ1dGVzLiAqLworI2RlZmluZSBYQVRUUl9OQU1FX1NFTElOVVggInNlY3VyaXR5LnNlbGludXgiCisKKy8qIEluaXRpYWwgbGVuZ3RoIGd1ZXNzIGZvciBnZXR0aW5nIGNvbnRleHRzLiAqLworI2RlZmluZSBJTklUQ09OVEVYVExFTiAyNTUKKworLyogc2VsaW51eGZzIG1hZ2ljIG51bWJlciAqLworI2RlZmluZSBTRUxJTlVYX01BR0lDIDB4Zjk3Y2ZmOGMKKworLyogUHJlZmVycmVkIHNlbGludXhmcyBtb3VudCBwb2ludCBkaXJlY3RvcnkgcGF0aHMuICovCisjZGVmaW5lIFNFTElOVVhNTlQgIi9zeXMvZnMvc2VsaW51eCIKKyNkZWZpbmUgT0xEU0VMSU5VWE1OVCAiL3NlbGludXgiCisKKy8qIHNlbGludXhmcyBmaWxlc3lzdGVtIHR5cGUgc3RyaW5nLiAqLworI2RlZmluZSBTRUxJTlVYRlMgInNlbGludXhmcyIKKworLyogc2VsaW51eGZzIG1vdW50IHBvaW50IGRldGVybWluZWQgYXQgcnVudGltZSAqLworZXh0ZXJuIGNoYXIgKnNlbGludXhfbW50OworCisvKiBGaXJzdCB2ZXJzaW9uIG9mIHBvbGljeSBzdXBwb3J0ZWQgaW4gbWFpbmxpbmUgTGludXguICovCisjZGVmaW5lIERFRkFVTFRfUE9MSUNZX1ZFUlNJT04gMTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3BvbGljeXZlcnMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvcG9saWN5dmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGE3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3BvbGljeXZlcnMuYwpAQCAtMCwwICsxLDQ1IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInBvbGljeS5oIgorI2luY2x1ZGUgImRzby5oIgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQgc2VjdXJpdHlfcG9saWN5dmVycyh2b2lkKQoreworCWludCBmZCwgcmV0OworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJY2hhciBidWZbMjBdOworCXVuc2lnbmVkIHZlcnMgPSBERUZBVUxUX1BPTElDWV9WRVJTSU9OOworCisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXNucHJpbnRmKHBhdGgsIHNpemVvZiBwYXRoLCAiJXMvcG9saWN5dmVycyIsIHNlbGludXhfbW50KTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCXJldHVybiB2ZXJzOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJfQorCW1lbXNldChidWYsIDAsIHNpemVvZiBidWYpOworCXJldCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mIGJ1ZiAtIDEpOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHNzY2FuZihidWYsICIldSIsICZ2ZXJzKSAhPSAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gdmVyczsKK30KKworaGlkZGVuX2RlZihzZWN1cml0eV9wb2xpY3l2ZXJzKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9wcm9jYXR0ci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9wcm9jYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTA4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3Byb2NhdHRyLmMKQEAgLTAsMCArMSwxNjMgQEAKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworI2lmZGVmIEhPU1QKK3N0YXRpYyBwaWRfdCBnZXR0aWQodm9pZCkKK3sKKwlyZXR1cm4gc3lzY2FsbChfX05SX2dldHRpZCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZXRwcm9jYXR0cmNvbihjaGFyICoqIGNvbnRleHQsCisJCQkgIHBpZF90IHBpZCwgY29uc3QgY2hhciAqYXR0cikKK3sKKwljaGFyICpwYXRoLCAqYnVmOworCXNpemVfdCBzaXplOworCWludCBmZCwgcmM7CisJc3NpemVfdCByZXQ7CisJcGlkX3QgdGlkOworCWludCBlcnJub19ob2xkOworCisJaWYgKHBpZCA+IDApCisJCXJjID0gYXNwcmludGYoJnBhdGgsICIvcHJvYy8lZC9hdHRyLyVzIiwgcGlkLCBhdHRyKTsKKwllbHNlIHsKKwkJdGlkID0gZ2V0dGlkKCk7CisJCXJjID0gYXNwcmludGYoJnBhdGgsICIvcHJvYy9zZWxmL3Rhc2svJWQvYXR0ci8lcyIsIHRpZCwgYXR0cik7CisJfQorCWlmIChyYyA8IDApCisJCXJldHVybiAtMTsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJZnJlZShwYXRoKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlzaXplID0gc2VsaW51eF9wYWdlX3NpemU7CisJYnVmID0gbWFsbG9jKHNpemUpOworCWlmICghYnVmKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZSk7CisKKwlkbyB7CisJCXJldCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSAtIDEpOworCX0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDI7CisKKwlpZiAocmV0ID09IDApIHsKKwkJKmNvbnRleHQgPSBOVUxMOworCQlnb3RvIG91dDI7CisJfQorCisJKmNvbnRleHQgPSBzdHJkdXAoYnVmKTsKKwlpZiAoISgqY29udGV4dCkpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0MjsKKwl9CisJcmV0ID0gMDsKKyAgICAgIG91dDI6CisJZnJlZShidWYpOworICAgICAgb3V0OgorCWVycm5vX2hvbGQgPSBlcnJubzsKKwljbG9zZShmZCk7CisJZXJybm8gPSBlcnJub19ob2xkOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2V0cHJvY2F0dHJjb24oY29uc3QgY2hhciAqIGNvbnRleHQsCisJCQkgIHBpZF90IHBpZCwgY29uc3QgY2hhciAqYXR0cikKK3sKKwljaGFyICpwYXRoOworCWludCBmZCwgcmM7CisJcGlkX3QgdGlkOworCXNzaXplX3QgcmV0OworCWludCBlcnJub19ob2xkOworCisJaWYgKHBpZCA+IDApCisJCXJjID0gYXNwcmludGYoJnBhdGgsICIvcHJvYy8lZC9hdHRyLyVzIiwgcGlkLCBhdHRyKTsKKwllbHNlIHsKKwkJdGlkID0gZ2V0dGlkKCk7CisJCXJjID0gYXNwcmludGYoJnBhdGgsICIvcHJvYy9zZWxmL3Rhc2svJWQvYXR0ci8lcyIsIHRpZCwgYXR0cik7CisJfQorCWlmIChyYyA8IDApCisJCXJldHVybiAtMTsKKworCWZkID0gb3BlbihwYXRoLCBPX1JEV1IpOworCWZyZWUocGF0aCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChjb250ZXh0KQorCQlkbyB7CisJCQlyZXQgPSB3cml0ZShmZCwgY29udGV4dCwgc3RybGVuKGNvbnRleHQpICsgMSk7CisJCX0gd2hpbGUgKHJldCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCWVsc2UKKwkJZG8geworCQkJcmV0ID0gd3JpdGUoZmQsIE5VTEwsIDApOwkvKiBjbGVhciAqLworCQl9IHdoaWxlIChyZXQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKwllcnJub19ob2xkID0gZXJybm87CisJY2xvc2UoZmQpOworCWVycm5vID0gZXJybm9faG9sZDsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZ2V0c2VsZmF0dHJfZGVmKGZuLCBhdHRyKSBcCisJaW50IGdldCMjZm4oY2hhciAqKmMpIFwKKwl7IFwKKwkJcmV0dXJuIGdldHByb2NhdHRyY29uKGMsIDAsICNhdHRyKTsgXAorCX0KKworI2RlZmluZSBzZXRzZWxmYXR0cl9kZWYoZm4sIGF0dHIpIFwKKwlpbnQgc2V0IyNmbihjb25zdCBjaGFyICogYykgXAorCXsgXAorCQlyZXR1cm4gc2V0cHJvY2F0dHJjb24oYywgMCwgI2F0dHIpOyBcCisJfQorCisjZGVmaW5lIGFsbF9zZWxmYXR0cl9kZWYoZm4sIGF0dHIpIFwKKwlnZXRzZWxmYXR0cl9kZWYoZm4sIGF0dHIpCSBcCisJc2V0c2VsZmF0dHJfZGVmKGZuLCBhdHRyKQorCisjZGVmaW5lIGdldHBpZGF0dHJfZGVmKGZuLCBhdHRyKSBcCisJaW50IGdldCMjZm4ocGlkX3QgcGlkLCBjaGFyICoqYykJXAorCXsgXAorCQlyZXR1cm4gZ2V0cHJvY2F0dHJjb24oYywgcGlkLCAjYXR0cik7IFwKKwl9CisKK2FsbF9zZWxmYXR0cl9kZWYoY29uLCBjdXJyZW50KQorICAgIGdldHBpZGF0dHJfZGVmKHBpZGNvbiwgY3VycmVudCkKKyAgICBnZXRzZWxmYXR0cl9kZWYocHJldmNvbiwgcHJldikKKyAgICBhbGxfc2VsZmF0dHJfZGVmKGV4ZWNjb24sIGV4ZWMpCisgICAgYWxsX3NlbGZhdHRyX2RlZihmc2NyZWF0ZWNvbiwgZnNjcmVhdGUpCisgICAgYWxsX3NlbGZhdHRyX2RlZihzb2NrY3JlYXRlY29uLCBzb2NrY3JlYXRlKQorICAgIGFsbF9zZWxmYXR0cl9kZWYoa2V5Y3JlYXRlY29uLCBrZXljcmVhdGUpCisKKyAgICBoaWRkZW5fZGVmKGdldGNvbl9yYXcpCisgICAgaGlkZGVuX2RlZihnZXRjb24pCisgICAgaGlkZGVuX2RlZihnZXRleGVjY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKGdldGZpbGVjb25fcmF3KQorICAgIGhpZGRlbl9kZWYoZ2V0ZmlsZWNvbikKKyAgICBoaWRkZW5fZGVmKGdldGZzY3JlYXRlY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKGdldGtleWNyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX2RlZihnZXRwZWVyY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKGdldHBpZGNvbl9yYXcpCisgICAgaGlkZGVuX2RlZihnZXRwcmV2Y29uX3JhdykKKyAgICBoaWRkZW5fZGVmKGdldHByZXZjb24pCisgICAgaGlkZGVuX2RlZihnZXRzb2NrY3JlYXRlY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKHNldGNvbl9yYXcpCisgICAgaGlkZGVuX2RlZihzZXRleGVjY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKHNldGV4ZWNjb24pCisgICAgaGlkZGVuX2RlZihzZXRmaWxlY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKHNldGZzY3JlYXRlY29uX3JhdykKKyAgICBoaWRkZW5fZGVmKHNldGtleWNyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX2RlZihzZXRzb2NrY3JlYXRlY29uX3JhdykKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2VsaW51eF9pbnRlcm5hbC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9zZWxpbnV4X2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4N2JiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2VsaW51eF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTMyIEBACisjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgImRzby5oIgorCitoaWRkZW5fcHJvdG8oc2VsaW51eF9ta2xvYWRfcG9saWN5KQorICAgIGhpZGRlbl9wcm90byhzZXRfc2VsaW51eG1udCkKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfZGlzYWJsZSkKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfcG9saWN5dmVycykKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfbG9hZF9wb2xpY3kpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X2dldF9ib29sZWFuX2FjdGl2ZSkKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X3NldF9ib29sZWFuKQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9jb21taXRfYm9vbGVhbnMpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X2NoZWNrX2NvbnRleHQpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X2NoZWNrX2NvbnRleHRfcmF3KQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9jYW5vbmljYWxpemVfY29udGV4dCkKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY2Fub25pY2FsaXplX2NvbnRleHRfcmF3KQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9jb21wdXRlX2F2KQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9jb21wdXRlX2F2X3JhdykKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY29tcHV0ZV9hdl9mbGFncykKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY29tcHV0ZV9hdl9mbGFnc19yYXcpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X2NvbXB1dGVfdXNlcikKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY29tcHV0ZV91c2VyX3JhdykKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY29tcHV0ZV9jcmVhdGUpCisgICAgaGlkZGVuX3Byb3RvKHNlY3VyaXR5X2NvbXB1dGVfY3JlYXRlX3JhdykKKyAgICBoaWRkZW5fcHJvdG8oc2VjdXJpdHlfY29tcHV0ZV9tZW1iZXJfcmF3KQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9jb21wdXRlX3JlbGFiZWxfcmF3KQorICAgIGhpZGRlbl9wcm90byhpc19zZWxpbnV4X2VuYWJsZWQpCisgICAgaGlkZGVuX3Byb3RvKGlzX3NlbGludXhfbWxzX2VuYWJsZWQpCisgICAgaGlkZGVuX3Byb3RvKGZyZWVjb24pCisgICAgaGlkZGVuX3Byb3RvKGZyZWVjb25hcnkpCisgICAgaGlkZGVuX3Byb3RvKGdldHByZXZjb24pCisgICAgaGlkZGVuX3Byb3RvKGdldHByZXZjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhnZXRjb24pCisgICAgaGlkZGVuX3Byb3RvKGdldGNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKHNldGNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKGdldHBlZXJjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhnZXRwaWRjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhnZXRleGVjY29uX3JhdykKKyAgICBoaWRkZW5fcHJvdG8oZ2V0ZmlsZWNvbikKKyAgICBoaWRkZW5fcHJvdG8oZ2V0ZmlsZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKGxnZXRmaWxlY29uX3JhdykKKyAgICBoaWRkZW5fcHJvdG8oZmdldGZpbGVjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhzZXRmaWxlY29uX3JhdykKKyAgICBoaWRkZW5fcHJvdG8obHNldGZpbGVjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhmc2V0ZmlsZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKHNldGV4ZWNjb24pCisgICAgaGlkZGVuX3Byb3RvKHNldGV4ZWNjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhnZXRmc2NyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKGdldGtleWNyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKGdldHNvY2tjcmVhdGVjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhzZXRmc2NyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKHNldGtleWNyZWF0ZWNvbl9yYXcpCisgICAgaGlkZGVuX3Byb3RvKHNldHNvY2tjcmVhdGVjb25fcmF3KQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9nZXRlbmZvcmNlKQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9zZXRlbmZvcmNlKQorICAgIGhpZGRlbl9wcm90byhzZWN1cml0eV9kZW55X3Vua25vd24pCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfYmluYXJ5X3BvbGljeV9wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X2RlZmF1bHRfY29udGV4dF9wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X3NlY3VyZXR0eV90eXBlc19wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X2ZhaWxzYWZlX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9yZW1vdmFibGVfY29udGV4dF9wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X3ZpcnR1YWxfZG9tYWluX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF92aXJ0dWFsX2ltYWdlX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9maWxlX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9maWxlX2NvbnRleHRfaG9tZWRpcl9wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X2ZpbGVfY29udGV4dF9sb2NhbF9wYXRoKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X2ZpbGVfY29udGV4dF9zdWJzX3BhdGgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfbmV0ZmlsdGVyX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9ob21lZGlyX2NvbnRleHRfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF91c2VyX2NvbnRleHRzX3BhdGgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfYm9vbGVhbnNfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9jdXN0b21pemFibGVfdHlwZXNfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9tZWRpYV9jb250ZXh0X3BhdGgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfeF9jb250ZXh0X3BhdGgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfc2VwZ3NxbF9jb250ZXh0X3BhdGgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9jaGVja19wYXNzd2RfYWNjZXNzKQorICAgIGhpZGRlbl9wcm90byhzZWxpbnV4X2NoZWNrX3NlY3VyZXR0eV9jb250ZXh0KQorICAgIGhpZGRlbl9wcm90byhtYXRjaHBhdGhjb25faW5pdF9wcmVmaXgpCisgICAgaGlkZGVuX3Byb3RvKHNlbGludXhfdXNlcnNfcGF0aCkKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF91c2Vyc2NvbmZfcGF0aCk7CitoaWRkZW5fcHJvdG8oc2VsaW51eF90cmFuc2xhdGlvbnNfcGF0aCk7CitoaWRkZW5fcHJvdG8oc2VsaW51eF9jb2xvcnNfcGF0aCk7CitoaWRkZW5fcHJvdG8oc2VsaW51eF9nZXRlbmZvcmNlbW9kZSk7CitoaWRkZW5fcHJvdG8oc2VsaW51eF9nZXRwb2xpY3l0eXBlKTsKK2hpZGRlbl9wcm90byhzZWxpbnV4X3Jhd190b190cmFuc19jb250ZXh0KTsKK2hpZGRlbl9wcm90byhzZWxpbnV4X3RyYW5zX3RvX3Jhd19jb250ZXh0KTsKKyAgICBoaWRkZW5fcHJvdG8oc2VsaW51eF9yYXdfY29udGV4dF90b19jb2xvcik7CitoaWRkZW5fcHJvdG8oc2VjdXJpdHlfZ2V0X2luaXRpYWxfY29udGV4dCk7CitoaWRkZW5fcHJvdG8oc2VjdXJpdHlfZ2V0X2luaXRpYWxfY29udGV4dF9yYXcpOworaGlkZGVuX3Byb3RvKHNlbGludXhfcmVzZXRfY29uZmlnKTsKKworZXh0ZXJuIGludCBzZWxpbnV4X3BhZ2Vfc2l6ZSBoaWRkZW47CisKKy8qIE1ha2UgcHRocmVhZF9vbmNlIG9wdGlvbmFsICovCisjcHJhZ21hIHdlYWsgcHRocmVhZF9vbmNlCisjcHJhZ21hIHdlYWsgcHRocmVhZF9rZXlfY3JlYXRlCisjcHJhZ21hIHdlYWsgcHRocmVhZF9rZXlfZGVsZXRlCisjcHJhZ21hIHdlYWsgcHRocmVhZF9zZXRzcGVjaWZpYworCisvKiBDYWxsIGhhbmRsZXIgaWZmIHRoZSBmaXJzdCBjYWxsLiAgKi8KKyNkZWZpbmUgX19zZWxpbnV4X29uY2UoT05DRV9DT05UUk9MLCBJTklUX0ZVTkNUSU9OKQlcCisJZG8gewkJCQkJCVwKKwkJaWYgKHB0aHJlYWRfb25jZSAhPSBOVUxMKQkJXAorCQkJcHRocmVhZF9vbmNlICgmKE9OQ0VfQ09OVFJPTCksIChJTklUX0ZVTkNUSU9OKSk7ICBcCisJCWVsc2UgaWYgKChPTkNFX0NPTlRST0wpID09IFBUSFJFQURfT05DRV9JTklUKSB7CQkgIFwKKwkJCUlOSVRfRlVOQ1RJT04gKCk7CQlcCisJCQkoT05DRV9DT05UUk9MKSA9IDI7CQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKiBQdGhyZWFkIGtleSBtYWNyb3MgKi8KKyNkZWZpbmUgX19zZWxpbnV4X2tleV9jcmVhdGUoS0VZLCBERVNUUlVDVE9SKQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKHB0aHJlYWRfa2V5X2NyZWF0ZSAhPSBOVUxMKQkJCVwKKwkJCXB0aHJlYWRfa2V5X2NyZWF0ZShLRVksIERFU1RSVUNUT1IpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX3NlbGludXhfa2V5X2RlbGV0ZShLRVkpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKHB0aHJlYWRfa2V5X2RlbGV0ZSAhPSBOVUxMKQkJCVwKKwkJCXB0aHJlYWRfa2V5X2RlbGV0ZShLRVkpOwkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgX19zZWxpbnV4X3NldHNwZWNpZmljKEtFWSwgVkFMVUUpCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAocHRocmVhZF9zZXRzcGVjaWZpYyAhPSBOVUxMKQkJXAorCQkJcHRocmVhZF9zZXRzcGVjaWZpYyhLRVksIFZBTFVFKTsJXAorCX0gd2hpbGUgKDApCisKKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9zZWxpbnV4X25ldGxpbmsuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2VsaW51eF9uZXRsaW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZjU1MQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2VsaW51eF9uZXRsaW5rLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIE5ldGxpbmsgZXZlbnQgbm90aWZpY2F0aW9ucyBmb3IgU0VMaW51eC4KKyAqCisgKiBBdXRob3I6IEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorICovCisjaWZuZGVmIF9MSU5VWF9TRUxJTlVYX05FVExJTktfSAorI2RlZmluZSBfTElOVVhfU0VMSU5VWF9ORVRMSU5LX0gKKworLyogTWVzc2FnZSB0eXBlcy4gKi8KKyNkZWZpbmUgU0VMTkxfTVNHX0JBU0UgMHgxMAorZW51bSB7CisJU0VMTkxfTVNHX1NFVEVORk9SQ0UgPSBTRUxOTF9NU0dfQkFTRSwKKwlTRUxOTF9NU0dfUE9MSUNZTE9BRCwKKwlTRUxOTF9NU0dfTUFYCit9OworCisvKiBNdWx0aWNhc3QgZ3JvdXBzICovCisjZGVmaW5lIFNFTE5MX0dSUF9OT05FCQkweDAwMDAwMDAwCisjZGVmaW5lIFNFTE5MX0dSUF9BVkMJCTB4MDAwMDAwMDEJLyogQVZDIG5vdGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgU0VMTkxfR1JQX0FMTAkJMHhmZmZmZmZmZgorCisvKiBNZXNzYWdlIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBzZWxubF9tc2dfc2V0ZW5mb3JjZSB7CisJaW50MzJfdCB2YWw7Cit9OworCitzdHJ1Y3Qgc2VsbmxfbXNnX3BvbGljeWxvYWQgeworCXVpbnQzMl90IHNlcW5vOworfTsKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9TRUxJTlVYX05FVExJTktfSCAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9zZXN0YXR1cy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzZWxpbnV4L3NyYy9zZXN0YXR1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjlkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3Nlc3RhdHVzLmMKQEAgLTAsMCArMSwzNDkgQEAKKy8qCisgKiBzZXN0YXR1cy5jCisgKgorICogQVBJcyB0byByZWZlcmVuY2UgU0VMaW51eCBrZXJuZWwgc3RhdHVzIHBhZ2UgKC9zZWxpbnV4L3N0YXR1cykKKyAqCisgKiBBdXRob3I6IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CisgKgorICovCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJhdmNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworLyoKKyAqIGNvcGllZCBmcm9tIHRoZSBzZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAorICovCitzdHJ1Y3Qgc2VsaW51eF9zdGF0dXNfdAoreworCXVpbnQzMl90CXZlcnNpb247CS8qIHZlcnNpb24gbnVtYmVyIG9mIHRoaWUgc3RydWN0dXJlICovCisJdWludDMyX3QJc2VxdWVuY2U7CS8qIHNlcXVlbmNlIG51bWJlciBvZiBzZXFsb2NrIGxvZ2ljICovCisJdWludDMyX3QJZW5mb3JjaW5nOwkvKiBjdXJyZW50IHNldHRpbmcgb2YgZW5mb3JjaW5nIG1vZGUgKi8KKwl1aW50MzJfdAlwb2xpY3lsb2FkOwkvKiB0aW1lcyBvZiBwb2xpY3kgcmVsb2FkZWQgKi8KKwl1aW50MzJfdAlkZW55X3Vua25vd247CS8qIGN1cnJlbnQgc2V0dGluZyBvZiBkZW55X3Vua25vd24gKi8KKwkvKiB2ZXJzaW9uID4gMCBzdXBwb3J0IGFib3ZlIHN0YXR1cyAqLworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKKy8qCisgKiBgc2VsaW51eF9zdGF0dXMnCisgKgorICogTlVMTCA6IG5vdCBpbml0aWFsaXplZCB5ZXQKKyAqIE1BUF9GQUlMRUQgOiBvcGVuZWQsIGJ1dCBmYWxsYmFjay1tb2RlCisgKiBWYWxpZCBQb2ludGVyIDogb3BlbmVkIGFuZCBtYXBwZWQgY29ycmVjdGx5CisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VsaW51eF9zdGF0dXNfdCAqc2VsaW51eF9zdGF0dXMgPSBOVUxMOworc3RhdGljIGludAkJCXNlbGludXhfc3RhdHVzX2ZkOworc3RhdGljIHVpbnQzMl90CQkJbGFzdF9zZXFubzsKKworc3RhdGljIHVpbnQzMl90CQkJZmFsbGJhY2tfc2VxdWVuY2U7CitzdGF0aWMgaW50CQkJZmFsbGJhY2tfZW5mb3JjaW5nOworc3RhdGljIGludAkJCWZhbGxiYWNrX3BvbGljeWxvYWQ7CisKKy8qCisgKiByZWFkX3NlcXVlbmNlCisgKgorICogQSB1dGlsaXR5IHJvdXRpbmUgdG8gcmVmZXJlbmNlIGtlcm5lbCBzdGF0dXMgcGFnZSBhY2NvcmRpbmcgdG8KKyAqIHNlcWxvY2sgbG9naWMuIFNpbmNlIHNlbGludXhfc3RhdHVzLT5zZXF1ZW5jZSBpcyBhbiBvZGQgdmFsdWUgZHVyaW5nCisgKiB0aGUga2VybmVsIHN0YXR1cyBwYWdlIGJlaW5nIHVwZGF0ZWQsIHdlIHRyeSB0byBzeW5jaHJvbml6ZSBjb21wbGV0aW9uCisgKiBvZiB0aGlzIHVwZGF0aW5nLCBidXQgd2UgYXNzdW1lIGl0IGlzIHJhcmUuCisgKiBUaGUgc2VxdWVuY2UgaXMgYWxtb3N0IGV2ZW4gbnVtYmVyLgorICoKKyAqIF9fc3luY19zeW5jaHJvbml6ZSBpcyBhIHBvcnRhYmxlIG1lbW9yeSBiYXJyaWVyIGZvciB2YXJpb3VzIGtpbmQKKyAqIG9mIGFyY2hpdGVjdHVyZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBHQ0MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgcmVhZF9zZXF1ZW5jZShzdHJ1Y3Qgc2VsaW51eF9zdGF0dXNfdCAqc3RhdHVzKQoreworCXVpbnQzMl90CXNlcW5vID0gMDsKKworCWRvIHsKKwkJLyoKKwkJICogTm8gbmVlZCBmb3Igc2NoZWRfeWllbGQoKSBpbiB0aGUgZmlyc3QgdHJpYWwgb2YKKwkJICogdGhpcyBsb29wLgorCQkgKi8KKwkJaWYgKHNlcW5vICYgMHgwMDAxKQorCQkJc2NoZWRfeWllbGQoKTsKKworCQlzZXFubyA9IHN0YXR1cy0+c2VxdWVuY2U7CisKKwkJX19zeW5jX3N5bmNocm9uaXplKCk7CisKKwl9IHdoaWxlIChzZXFubyAmIDB4MDAwMSk7CisKKwlyZXR1cm4gc2Vxbm87Cit9CisKKy8qCisgKiBzZWxpbnV4X3N0YXR1c191cGRhdGVkCisgKgorICogSXQgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBoYXBwZW5lZCBzaW5jZSB0aGUgbGFzdCBjYWxsLgorICogQmVjYXVzZSBgc2VsaW51eF9zdGF0dXMtPnNlcXVlbmNlJyBzaGFsbCBiZSBhbHdheXMgaW5jcmVtZW50ZWQgb24KKyAqIGJvdGggb2Ygc2V0ZW5mb3JjZS9wb2xpY3lyZWxvYWQgZXZlbnRzLCBzbyBkaWZmZXJlbmNlcyBmcm9tIHRoZSBsYXN0CisgKiB2YWx1ZSBpbmZvcm1zIHVzIHNvbWV0aGluZyBoYXMgYmVlbiBoYXBwZW5lZC4KKyAqLworaW50IHNlbGludXhfc3RhdHVzX3VwZGF0ZWQodm9pZCkKK3sKKwl1aW50MzJfdAljdXJyX3NlcW5vOworCWludAkJcmVzdWx0ID0gMDsKKworCWlmIChzZWxpbnV4X3N0YXR1cyA9PSBOVUxMKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNlbGludXhfc3RhdHVzID09IE1BUF9GQUlMRUQpIHsKKwkJaWYgKGF2Y19uZXRsaW5rX2NoZWNrX25iKCkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCWN1cnJfc2Vxbm8gPSBmYWxsYmFja19zZXF1ZW5jZTsKKwl9IGVsc2UgeworCQljdXJyX3NlcW5vID0gcmVhZF9zZXF1ZW5jZShzZWxpbnV4X3N0YXR1cyk7CisJfQorCisJLyoKKwkgKiBgY3Vycl9zZXFubycgaXMgYWx3YXlzIGV2ZW4tbnVtYmVyLCBzbyBpdCBkb2VzIG5vdCBtYXRjaCB3aXRoCisJICogYGxhc3Rfc2Vxbm8nIGJlaW5nIGluaXRpYWxpemVkIHRvIG9kZC1udW1iZXIgaW4gdGhlIGZpcnN0IGNhbGwuCisJICogV2UgbmV2ZXIgcmV0dXJuICdzb21ldGhpbmcgd2FzIHVwZGF0ZWQnIGluIHRoZSBmaXJzdCBjYWxsLAorCSAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBmb2N1c2VzIG9uIHN0YXR1cy11cGRhdGluZyBzaW5jZSB0aGUgbGFzdAorCSAqIGludm9jYXRpb24uCisJICovCisJaWYgKGxhc3Rfc2Vxbm8gJiAweDAwMDEpCisJCWxhc3Rfc2Vxbm8gPSBjdXJyX3NlcW5vOworCisJaWYgKGxhc3Rfc2Vxbm8gIT0gY3Vycl9zZXFubykKKwl7CisJCWxhc3Rfc2Vxbm8gPSBjdXJyX3NlcW5vOworCQlyZXN1bHQgPSAxOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogc2VsaW51eF9zdGF0dXNfZ2V0ZW5mb3JjZQorICoKKyAqIEl0IHJldHVybnMgdGhlIGN1cnJlbnQgcGVyZm9ybWluZyBtb2RlIG9mIFNFTGludXguCisgKiAxIG1lYW5zIGN1cnJlbnRseSB3ZSBydW4gaW4gZW5mb3JjaW5nIG1vZGUsIG9yIDAgbWVhbnMgcGVybWlzc2l2ZSBtb2RlLgorICovCitpbnQgc2VsaW51eF9zdGF0dXNfZ2V0ZW5mb3JjZSh2b2lkKQoreworCXVpbnQzMl90CXNlcW5vOworCXVpbnQzMl90CWVuZm9yY2luZzsKKworCWlmIChzZWxpbnV4X3N0YXR1cyA9PSBOVUxMKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNlbGludXhfc3RhdHVzID09IE1BUF9GQUlMRUQpIHsKKwkJaWYgKGF2Y19uZXRsaW5rX2NoZWNrX25iKCkgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCXJldHVybiBmYWxsYmFja19lbmZvcmNpbmc7CisJfQorCisJLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgcmVmZXJlbmNlcyAqLworCWRvIHsKKwkJc2Vxbm8gPSByZWFkX3NlcXVlbmNlKHNlbGludXhfc3RhdHVzKTsKKworCQllbmZvcmNpbmcgPSBzZWxpbnV4X3N0YXR1cy0+ZW5mb3JjaW5nOworCisJfSB3aGlsZSAoc2Vxbm8gIT0gcmVhZF9zZXF1ZW5jZShzZWxpbnV4X3N0YXR1cykpOworCisJcmV0dXJuIGVuZm9yY2luZyA/IDEgOiAwOworfQorCisvKgorICogc2VsaW51eF9zdGF0dXNfcG9saWN5bG9hZAorICoKKyAqIEl0IHJldHVybnMgdGltZXMgb2YgcG9saWN5IHJlbG9hZGVkIG9uIHRoZSBydW5uaW5nIHN5c3RlbS4KKyAqIE5vdGUgdGhhdCBpdCBpcyBub3QgYSByZWxpYWJsZSB2YWx1ZSBvbiBmYWxsYmFjay1tb2RlIHVudGlsIGl0IHJlY2VpdmVzCisgKiB0aGUgZmlyc3QgZXZlbnQgbWVzc2FnZSB2aWEgbmV0bGluayBzb2NrZXQsIHNvLCBhIGNvcnJlY3QgdXNhZ2Ugb2YgdGhpcworICogdmFsdWUgaXMgdG8gY29tcGFyZSBpdCB3aXRoIHRoZSBwcmV2aW91cyB2YWx1ZSB0byBkZXRlY3QgcG9saWN5IHJlbG9hZGVkCisgKiBldmVudC4KKyAqLworaW50IHNlbGludXhfc3RhdHVzX3BvbGljeWxvYWQodm9pZCkKK3sKKwl1aW50MzJfdAlzZXFubzsKKwl1aW50MzJfdAlwb2xpY3lsb2FkOworCisJaWYgKHNlbGludXhfc3RhdHVzID09IE5VTEwpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2VsaW51eF9zdGF0dXMgPT0gTUFQX0ZBSUxFRCkgeworCQlpZiAoYXZjX25ldGxpbmtfY2hlY2tfbmIoKSA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJcmV0dXJuIGZhbGxiYWNrX3BvbGljeWxvYWQ7CisJfQorCisJLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgcmVmZXJlbmNlcyAqLworCWRvIHsKKwkJc2Vxbm8gPSByZWFkX3NlcXVlbmNlKHNlbGludXhfc3RhdHVzKTsKKworCQlwb2xpY3lsb2FkID0gc2VsaW51eF9zdGF0dXMtPnBvbGljeWxvYWQ7CisKKwl9IHdoaWxlIChzZXFubyAhPSByZWFkX3NlcXVlbmNlKHNlbGludXhfc3RhdHVzKSk7CisKKwlyZXR1cm4gcG9saWN5bG9hZDsKK30KKworLyoKKyAqIHNlbGludXhfc3RhdHVzX2RlbnlfdW5rbm93bgorICoKKyAqIEl0IHJldHVybnMgYSBndWlkZWxpbmUgdG8gaGFuZGxlIHVuZGVmaW5lZCBvYmplY3QgY2xhc3NlcyBvciBwZXJtaXNzaW9ucy4KKyAqIDAgbWVhbnMgU0VMaW51eCB0cmVhdHMgcG9saWN5IHF1ZXJpZXMgb24gdW5kZWZpbmVkIHN0dWZmIGJlaW5nIGFsbG93ZWQsCisgKiBob3dldmVyLCAxIG1lYW5zIHN1Y2ggcXVlcmllcyBhcmUgZGVuaWVkLgorICovCitpbnQgc2VsaW51eF9zdGF0dXNfZGVueV91bmtub3duKHZvaWQpCit7CisJdWludDMyX3QJc2Vxbm87CisJdWludDMyX3QJZGVueV91bmtub3duOworCisJaWYgKHNlbGludXhfc3RhdHVzID09IE5VTEwpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2VsaW51eF9zdGF0dXMgPT0gTUFQX0ZBSUxFRCkKKwkJcmV0dXJuIHNlY3VyaXR5X2RlbnlfdW5rbm93bigpOworCisJLyogc2VxdWVuY2UgbXVzdCBub3QgYmUgY2hhbmdlZCBkdXJpbmcgcmVmZXJlbmNlcyAqLworCWRvIHsKKwkJc2Vxbm8gPSByZWFkX3NlcXVlbmNlKHNlbGludXhfc3RhdHVzKTsKKworCQlkZW55X3Vua25vd24gPSBzZWxpbnV4X3N0YXR1cy0+ZGVueV91bmtub3duOworCisJfSB3aGlsZSAoc2Vxbm8gIT0gcmVhZF9zZXF1ZW5jZShzZWxpbnV4X3N0YXR1cykpOworCisJcmV0dXJuIGRlbnlfdW5rbm93biA/IDEgOiAwOworfQorCisvKgorICogY2FsbGJhY2sgcm91dGluZXMgZm9yIGZhbGxiYWNrIGNhc2UgdXNpbmcgbmV0bGluayBzb2NrZXQKKyAqLworc3RhdGljIGludCBmYWxsYmFja19jYl9zZXRlbmZvcmNlKGludCBlbmZvcmNpbmcpCit7CisJZmFsbGJhY2tfc2VxdWVuY2UgKz0gMjsKKwlmYWxsYmFja19lbmZvcmNpbmcgPSBlbmZvcmNpbmc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYWxsYmFja19jYl9wb2xpY3lsb2FkKGludCBwb2xpY3lsb2FkKQoreworCWZhbGxiYWNrX3NlcXVlbmNlICs9IDI7CisJZmFsbGJhY2tfcG9saWN5bG9hZCA9IHBvbGljeWxvYWQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNlbGludXhfc3RhdHVzX29wZW4KKyAqCisgKiBJdCB0cmllcyB0byBvcGVuIGFuZCBtbWFwIGtlcm5lbCBzdGF0dXMgcGFnZSAoL3NlbGludXgvc3RhdHVzKS4KKyAqIFNpbmNlIExpbnV4IDIuNi4zNyBvciBsYXRlciBzdXBwb3J0cyB0aGlzIGZlYXR1cmUsIHdlIG1heSBydW4KKyAqIGZhbGxiYWNrIHJvdXRpbmUgdXNpbmcgYSBuZXRsaW5rIHNvY2tldCBvbiBvbGRlciBrZXJuZWxzLCBpZgorICogdGhlIHN1cHBsaWVkIGBmYWxsYmFjaycgaXMgbm90IHplcm8uCisgKiBJdCByZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgLTEgb24gZXJyb3IuCisgKi8KK2ludCBzZWxpbnV4X3N0YXR1c19vcGVuKGludCBmYWxsYmFjaykKK3sKKwlpbnQJZmQ7CisJY2hhcglwYXRoW1BBVEhfTUFYXTsKKwlsb25nCXBhZ2VzaXplOworCisJaWYgKCFzZWxpbnV4X21udCkgeworCQllcnJubyA9IEVOT0VOVDsKKwkJcmV0dXJuIC0xOworCX0KKworCXBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCWlmIChwYWdlc2l6ZSA8IDApCisJCXJldHVybiAtMTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL3N0YXR1cyIsIHNlbGludXhfbW50KTsKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOworCWlmIChmZCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzZWxpbnV4X3N0YXR1cyA9IG1tYXAoTlVMTCwgcGFnZXNpemUsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApOworCWlmIChzZWxpbnV4X3N0YXR1cyA9PSBNQVBfRkFJTEVEKSB7CisJCWNsb3NlKGZkKTsKKwkJZ290byBlcnJvcjsKKwl9CisJc2VsaW51eF9zdGF0dXNfZmQgPSBmZDsKKwlsYXN0X3NlcW5vID0gKHVpbnQzMl90KSgtMSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJLyoKKwkgKiBJZiBjYWxsZXIgd2FudHMgZmFsbGJhY2sgcm91dGluZSwgd2UgdHJ5IHRvIHByb3ZpZGUKKwkgKiBhbiBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgdXNpbmcgZXhpc3RpbmcgbmV0bGluaworCSAqIHNvY2tldCwgYWx0aG91Z2ggaXQgbmVlZHMgc3lzdGVtIGNhbGwgaW52b2NhdGlvbiB0bworCSAqIHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9uLgorCSAqLworCWlmIChmYWxsYmFjayAmJiBhdmNfbmV0bGlua19vcGVuKDApID09IDApIHsKKwkJdW5pb24gc2VsaW51eF9jYWxsYmFjawljYjsKKworCQkvKiByZWdpc3RlciBteSBjYWxsYmFja3MgKi8KKwkJY2IuZnVuY19zZXRlbmZvcmNlID0gZmFsbGJhY2tfY2Jfc2V0ZW5mb3JjZTsKKwkJc2VsaW51eF9zZXRfY2FsbGJhY2soU0VMSU5VWF9DQl9TRVRFTkZPUkNFLCBjYik7CisJCWNiLmZ1bmNfcG9saWN5bG9hZCA9IGZhbGxiYWNrX2NiX3BvbGljeWxvYWQ7CisJCXNlbGludXhfc2V0X2NhbGxiYWNrKFNFTElOVVhfQ0JfUE9MSUNZTE9BRCwgY2IpOworCisJCS8qIG1hcmsgYXMgZmFsbGJhY2sgbW9kZSAqLworCQlzZWxpbnV4X3N0YXR1cyA9IE1BUF9GQUlMRUQ7CisJCXNlbGludXhfc3RhdHVzX2ZkID0gYXZjX25ldGxpbmtfYWNxdWlyZV9mZCgpOworCQlsYXN0X3NlcW5vID0gKHVpbnQzMl90KSgtMSk7CisKKwkJZmFsbGJhY2tfc2VxdWVuY2UgPSAwOworCQlmYWxsYmFja19lbmZvcmNpbmcgPSBzZWN1cml0eV9nZXRlbmZvcmNlKCk7CisJCWZhbGxiYWNrX3BvbGljeWxvYWQgPSAwOworCisJCXJldHVybiAxOworCX0KKwlzZWxpbnV4X3N0YXR1cyA9IE5VTEw7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBzZWxpbnV4X3N0YXR1c19jbG9zZQorICoKKyAqIEl0IHVubWFwIGFuZCBjbG9zZSB0aGUga2VybmVsIHN0YXR1cyBwYWdlLCBvciBjbG9zZSBuZXRsaW5rIHNvY2tldAorICogaWYgZmFsbGJhY2sgbW9kZS4KKyAqLwordm9pZCBzZWxpbnV4X3N0YXR1c19jbG9zZSh2b2lkKQoreworCWxvbmcgcGFnZXNpemU7CisKKwkvKiBub3Qgb3BlbmVkICovCisJaWYgKHNlbGludXhfc3RhdHVzID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIGZhbGxiYWNrLW1vZGUgKi8KKwlpZiAoc2VsaW51eF9zdGF0dXMgPT0gTUFQX0ZBSUxFRCkKKwl7CisJCWF2Y19uZXRsaW5rX3JlbGVhc2VfZmQoKTsKKwkJYXZjX25ldGxpbmtfY2xvc2UoKTsKKwkJc2VsaW51eF9zdGF0dXMgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisJLyogbm90IG11Y2ggd2UgY2FuIGRvIG90aGVyIHRoYW4gbGVhayBtZW1vcnkgKi8KKwlpZiAocGFnZXNpemUgPiAwKQorCQltdW5tYXAoc2VsaW51eF9zdGF0dXMsIHBhZ2VzaXplKTsKKwlzZWxpbnV4X3N0YXR1cyA9IE5VTEw7CisKKwljbG9zZShzZWxpbnV4X3N0YXR1c19mZCk7CisJc2VsaW51eF9zdGF0dXNfZmQgPSAtMTsKKwlsYXN0X3NlcW5vID0gKHVpbnQzMl90KSgtMSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3NldGVuZm9yY2UuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2V0ZW5mb3JjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTc2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3NldGVuZm9yY2UuYwpAQCAtMCwwICsxLDM3IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCitpbnQgc2VjdXJpdHlfc2V0ZW5mb3JjZShpbnQgdmFsdWUpCit7CisJaW50IGZkLCByZXQ7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKwljaGFyIGJ1ZlsyMF07CisKKwlpZiAoIXNlbGludXhfbW50KSB7CisJCWVycm5vID0gRU5PRU5UOworCQlyZXR1cm4gLTE7CisJfQorCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9lbmZvcmNlIiwgc2VsaW51eF9tbnQpOworCWZkID0gb3BlbihwYXRoLCBPX1JEV1IpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVkIiwgdmFsdWUpOworCXJldCA9IHdyaXRlKGZkLCBidWYsIHN0cmxlbihidWYpKTsKKwljbG9zZShmZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitoaWRkZW5fZGVmKHNlY3VyaXR5X3NldGVuZm9yY2UpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3NldGZpbGVjb24uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc2V0ZmlsZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzIyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3NldGZpbGVjb24uYwpAQCAtMCwwICsxLDE1IEBACisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy94YXR0ci5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworaW50IHNldGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqY29udGV4dCkKK3sKKwlyZXR1cm4gc2V0eGF0dHIocGF0aCwgWEFUVFJfTkFNRV9TRUxJTlVYLCBjb250ZXh0LCBzdHJsZW4oY29udGV4dCkgKyAxLAorCQkJMCk7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic2VsaW51eC9zcmMvc3RyaW5ncmVwLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3N0cmluZ3JlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNlbGludXgvc3JjL3N0cmluZ3JlcC5jCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIHN1cHBvcnQgZm9yIGNsYXNzZXMgYW5kIHBlcm1pc3Npb25zLgorICovCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgInNlbGludXhfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKyNpbmNsdWRlICJtYXBwaW5nLmgiCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKKyNkZWZpbmUgTUFYVkVDVE9SUyA4KnNpemVvZihhY2Nlc3NfdmVjdG9yX3QpCisKK3N0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CisKK3N0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlIHsKKwljaGFyICpuYW1lOworCXNlY3VyaXR5X2NsYXNzX3QgdmFsdWU7CisJY2hhciAqKnBlcm1zOworCisJc3RydWN0IGRpc2NvdmVyX2NsYXNzX25vZGUgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGRpc2NvdmVyX2NsYXNzX25vZGUgKmRpc2NvdmVyX2NsYXNzX2NhY2hlID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICogZ2V0X2NsYXNzX2NhY2hlX2VudHJ5X25hbWUoY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZGlzY292ZXJfY2xhc3Nfbm9kZSAqbm9kZSA9IGRpc2NvdmVyX2NsYXNzX2NhY2hlOworCisJZm9yICg7IG5vZGUgIT0gTlVMTCAmJiBzdHJjbXAocyxub2RlLT5uYW1lKSAhPSAwOyBub2RlID0gbm9kZS0+bmV4dCk7CisKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICogZ2V0X2NsYXNzX2NhY2hlX2VudHJ5X3ZhbHVlKHNlY3VyaXR5X2NsYXNzX3QgYykKK3sKKwlzdHJ1Y3QgZGlzY292ZXJfY2xhc3Nfbm9kZSAqbm9kZSA9IGRpc2NvdmVyX2NsYXNzX2NhY2hlOworCisJZm9yICg7IG5vZGUgIT0gTlVMTCAmJiBjICE9IG5vZGUtPnZhbHVlOyBub2RlID0gbm9kZS0+bmV4dCk7CisKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIHN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICogZGlzY292ZXJfY2xhc3MoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgZmQsIHJldDsKKwljaGFyIHBhdGhbUEFUSF9NQVhdOworCWNoYXIgYnVmWzIwXTsKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkZW50cnk7CisJc2l6ZV90IGk7CisKKwlzdHJ1Y3QgZGlzY292ZXJfY2xhc3Nfbm9kZSAqbm9kZTsKKworCWlmICghc2VsaW51eF9tbnQpIHsKKwkJZXJybm8gPSBFTk9FTlQ7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGFsbG9jYXRlIGEgbm9kZSAqLworCW5vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlKSk7CisJaWYgKG5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBhbGxvY2F0ZSBhcnJheSBmb3IgcGVybXMgKi8KKwlub2RlLT5wZXJtcyA9IGNhbGxvYyhNQVhWRUNUT1JTLHNpemVvZihjaGFyKikpOworCWlmIChub2RlLT5wZXJtcyA9PSBOVUxMKQorCQlnb3RvIGVycjE7CisKKwkvKiBsb2FkIHVwIHRoZSBuYW1lICovCisJbm9kZS0+bmFtZSA9IHN0cmR1cChzKTsKKwlpZiAobm9kZS0+bmFtZSA9PSBOVUxMKQorCQlnb3RvIGVycjI7CisKKwkvKiBsb2FkIHVwIGNsYXNzIGluZGV4ICovCisJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9jbGFzcy8lcy9pbmRleCIsIHNlbGludXhfbW50LHMpOworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBlcnIzOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCXJldCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwljbG9zZShmZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyMzsKKworCWlmIChzc2NhbmYoYnVmLCAiJWh1IiwgJm5vZGUtPnZhbHVlKSAhPSAxKQorCQlnb3RvIGVycjM7CisKKwkvKiBsb2FkIHVwIHBlcm1pc3Npb24gaW5kaWNpZXMgKi8KKwlzbnByaW50ZihwYXRoLCBzaXplb2YgcGF0aCwgIiVzL2NsYXNzLyVzL3Blcm1zIixzZWxpbnV4X21udCxzKTsKKwlkaXIgPSBvcGVuZGlyKHBhdGgpOworCWlmIChkaXIgPT0gTlVMTCkKKwkJZ290byBlcnIzOworCisJZGVudHJ5ID0gcmVhZGRpcihkaXIpOworCXdoaWxlIChkZW50cnkgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBpbnQgdmFsdWU7CisJCXN0cnVjdCBzdGF0IG07CisKKwkJc25wcmludGYocGF0aCwgc2l6ZW9mIHBhdGgsICIlcy9jbGFzcy8lcy9wZXJtcy8lcyIsIHNlbGludXhfbW50LHMsZGVudHJ5LT5kX25hbWUpOworCQlpZiAoc3RhdChwYXRoLCZtKSA8IDApCisJCQlnb3RvIGVycjQ7CisKKwkJaWYgKG0uc3RfbW9kZSAmIFNfSUZESVIpIHsKKwkJCWRlbnRyeSA9IHJlYWRkaXIoZGlyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkKKwkJCWdvdG8gZXJyNDsKKworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXJldCA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwkJY2xvc2UoZmQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyNDsKKworCQlpZiAoc3NjYW5mKGJ1ZiwgIiV1IiwgJnZhbHVlKSAhPSAxKQorCQkJZ290byBlcnI0OworCisJCW5vZGUtPnBlcm1zW3ZhbHVlLTFdID0gc3RyZHVwKGRlbnRyeS0+ZF9uYW1lKTsKKwkJaWYgKG5vZGUtPnBlcm1zW3ZhbHVlLTFdID09IE5VTEwpCisJCQlnb3RvIGVycjQ7CisKKwkJZGVudHJ5ID0gcmVhZGRpcihkaXIpOworCX0KKwljbG9zZWRpcihkaXIpOworCisJbm9kZS0+bmV4dCA9IGRpc2NvdmVyX2NsYXNzX2NhY2hlOworCWRpc2NvdmVyX2NsYXNzX2NhY2hlID0gbm9kZTsKKworCXJldHVybiBub2RlOworCitlcnI0OgorCWNsb3NlZGlyKGRpcik7CisJZm9yIChpPTA7IGk8TUFYVkVDVE9SUzsgaSsrKQorCQlmcmVlKG5vZGUtPnBlcm1zW2ldKTsKK2VycjM6CisJZnJlZShub2RlLT5uYW1lKTsKK2VycjI6CisJZnJlZShub2RlLT5wZXJtcyk7CitlcnIxOgorCWZyZWUobm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZmx1c2hfY2xhc3NfY2FjaGUodm9pZCkKK3sKKwlzdHJ1Y3QgZGlzY292ZXJfY2xhc3Nfbm9kZSAqY3VyID0gZGlzY292ZXJfY2xhc3NfY2FjaGUsICpwcmV2ID0gTlVMTDsKKwlzaXplX3QgaTsKKworCXdoaWxlIChjdXIgIT0gTlVMTCkgeworCQlmcmVlKGN1ci0+bmFtZSk7CisKKwkJZm9yIChpPTAgOyBpPE1BWFZFQ1RPUlMgOyBpKyspCisJCQlmcmVlKGN1ci0+cGVybXNbaV0pOworCisJCWZyZWUoY3VyLT5wZXJtcyk7CisKKwkJcHJldiA9IGN1cjsKKwkJY3VyID0gY3VyLT5uZXh0OworCisJCWZyZWUocHJldik7CisJfQorCisJZGlzY292ZXJfY2xhc3NfY2FjaGUgPSBOVUxMOworfQorCitzZWN1cml0eV9jbGFzc190IHN0cmluZ190b19zZWN1cml0eV9jbGFzcyhjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICpub2RlOworCisJbm9kZSA9IGdldF9jbGFzc19jYWNoZV9lbnRyeV9uYW1lKHMpOworCWlmIChub2RlID09IE5VTEwpIHsKKwkJbm9kZSA9IGRpc2NvdmVyX2NsYXNzKHMpOworCisJCWlmIChub2RlID09IE5VTEwpIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gbWFwX2NsYXNzKG5vZGUtPnZhbHVlKTsKK30KKworYWNjZXNzX3ZlY3Rvcl90IHN0cmluZ190b19hdl9wZXJtKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLCBjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICpub2RlOworCXNlY3VyaXR5X2NsYXNzX3Qga2NsYXNzID0gdW5tYXBfY2xhc3ModGNsYXNzKTsKKworCW5vZGUgPSBnZXRfY2xhc3NfY2FjaGVfZW50cnlfdmFsdWUoa2NsYXNzKTsKKwlpZiAobm9kZSAhPSBOVUxMKSB7CisJCXNpemVfdCBpOworCQlmb3IgKGk9MDsgaTxNQVhWRUNUT1JTICYmIG5vZGUtPnBlcm1zW2ldICE9IE5VTEw7IGkrKykKKwkJCWlmIChzdHJjbXAobm9kZS0+cGVybXNbaV0scykgPT0gMCkKKwkJCQlyZXR1cm4gbWFwX3Blcm0odGNsYXNzLCAxPDxpKTsKKwl9CisKKwllcnJubyA9IEVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworY29uc3QgY2hhciAqc2VjdXJpdHlfY2xhc3NfdG9fc3RyaW5nKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzKQoreworCXN0cnVjdCBkaXNjb3Zlcl9jbGFzc19ub2RlICpub2RlOworCisJdGNsYXNzID0gdW5tYXBfY2xhc3ModGNsYXNzKTsKKworCW5vZGUgPSBnZXRfY2xhc3NfY2FjaGVfZW50cnlfdmFsdWUodGNsYXNzKTsKKwlpZiAobm9kZSkKKwkJcmV0dXJuIG5vZGUtPm5hbWU7CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKnNlY3VyaXR5X2F2X3Blcm1fdG9fc3RyaW5nKHNlY3VyaXR5X2NsYXNzX3QgdGNsYXNzLAorCQkJCSAgICAgICBhY2Nlc3NfdmVjdG9yX3QgYXYpCit7CisJc3RydWN0IGRpc2NvdmVyX2NsYXNzX25vZGUgKm5vZGU7CisJc2l6ZV90IGk7CisKKwlhdiA9IHVubWFwX3Blcm0odGNsYXNzLCBhdik7CisJdGNsYXNzID0gdW5tYXBfY2xhc3ModGNsYXNzKTsKKworCW5vZGUgPSBnZXRfY2xhc3NfY2FjaGVfZW50cnlfdmFsdWUodGNsYXNzKTsKKwlpZiAoYXYgJiYgbm9kZSkKKwkJZm9yIChpID0gMDsgaTxNQVhWRUNUT1JTOyBpKyspCisJCQlpZiAoKDE8PGkpICYgYXYpCisJCQkJcmV0dXJuIG5vZGUtPnBlcm1zW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBzZWN1cml0eV9hdl9zdHJpbmcoc2VjdXJpdHlfY2xhc3NfdCB0Y2xhc3MsIGFjY2Vzc192ZWN0b3JfdCBhdiwgY2hhciAqKnJlcykKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJc2l6ZV90IGxlbiA9IDU7CisJYWNjZXNzX3ZlY3Rvcl90IHRtcCA9IGF2OworCWludCByYyA9IDA7CisJY29uc3QgY2hhciAqc3RyOworCWNoYXIgKnB0cjsKKworCS8qIGZpcnN0IHBhc3MgY29tcHV0ZXMgdGhlIHJlcXVpcmVkIGxlbmd0aCAqLworCXdoaWxlICh0bXApIHsKKwkJaWYgKHRtcCAmIDEpIHsKKwkJCXN0ciA9IHNlY3VyaXR5X2F2X3Blcm1fdG9fc3RyaW5nKHRjbGFzcywgYXYgJiAoMTw8aSkpOworCQkJaWYgKHN0cikKKwkJCQlsZW4gKz0gc3RybGVuKHN0cikgKyAxOworCQkJZWxzZSB7CisJCQkJcmMgPSAtMTsKKwkJCQllcnJubyA9IEVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQl0bXAgPj49IDE7CisJCWkrKzsKKwl9CisKKwkqcmVzID0gbWFsbG9jKGxlbik7CisJaWYgKCEqcmVzKSB7CisJCXJjID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHNlY29uZCBwYXNzIGNvbnN0cnVjdHMgdGhlIHN0cmluZyAqLworCWkgPSAwOworCXRtcCA9IGF2OworCXB0ciA9ICpyZXM7CisKKwlpZiAoIWF2KSB7CisJCXNwcmludGYocHRyLCAibnVsbCIpOworCQlnb3RvIG91dDsKKwl9CisKKwlwdHIgKz0gc3ByaW50ZihwdHIsICJ7ICIpOworCXdoaWxlICh0bXApIHsKKwkJaWYgKHRtcCAmIDEpCisJCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlcyAiLCBzZWN1cml0eV9hdl9wZXJtX3RvX3N0cmluZygKKwkJCQkJICAgICAgIHRjbGFzcywgYXYgJiAoMTw8aSkpKTsKKwkJdG1wID4+PSAxOworCQlpKys7CisJfQorCXNwcmludGYocHRyLCAifSIpOworb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL1JFQURNRSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWNiYTdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2UvUkVBRE1FCkBAIC0wLDAgKzEsNiBAQAorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBjb3B5IG9mIHRoZSBzb3VyY2VzIG9mIHRoZSBBT1NQIGxpYnNwYXJzZSBsaWJyYXJ5LgorCitGb3IgcmVmZXJlbmNlLCB0aGUgZmlsZXMgd2VyZSB0YWtlbiBmcm9tICRBT1NQL3N5c3RlbS9jb3JlL2xpYnNwYXJzZSB3aXRoCit0aGUgZm9sbG93aW5nIGNvbW1pdDoKKworICAgICAgICAgICAgICAgMjUyYjBlMmI0NmUzZDVlNzFhOGI1YzU1OTI4ZGM5Y2E2MjgxMWYwYQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2UvaW5jbHVkZS9zcGFyc2Uvc3BhcnNlLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9pbmNsdWRlL3NwYXJzZS9zcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc1N2QyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2UvaW5jbHVkZS9zcGFyc2Uvc3BhcnNlLmgKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9MSUJTUEFSU0VfU1BBUlNFX0hfCisjZGVmaW5lIF9MSUJTUEFSU0VfU1BBUlNFX0hfCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IHNwYXJzZV9maWxlOworCisvKioKKyAqIHNwYXJzZV9maWxlX25ldyAtIGNyZWF0ZSBhIG5ldyBzcGFyc2UgZmlsZSBjb29raWUKKyAqCisgKiBAYmxvY2tfc2l6ZSAtIG1pbmltdW0gc2l6ZSBvZiBhIGNodW5rCisgKiBAbGVuIC0gc2l6ZSBvZiB0aGUgZXhwYW5kZWQgc3BhcnNlIGZpbGUuCisgKgorICogQ3JlYXRlcyBhIG5ldyBzcGFyc2VfZmlsZSBjb29raWUgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgZGF0YQorICogYmxvY2tzLiAgQ2FuIGxhdGVyIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIHdpdGggYSB2YXJpZXR5IG9mIG9wdGlvbnMuCisgKiBibG9ja19zaXplIHNwZWNpZmllcyB0aGUgbWluaW11bSBzaXplIG9mIGEgY2h1bmsgaW4gdGhlIGZpbGUuICBUaGUgbWF4aW11bQorICogc2l6ZSBvZiB0aGUgZmlsZSBpcyAyKiozMiAqIGJsb2NrX3NpemUgKDE2VEIgZm9yIDRrIGJsb2NrIHNpemUpLgorICoKKyAqIFJldHVybnMgdGhlIHNwYXJzZSBmaWxlIGNvb2tpZSwgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RydWN0IHNwYXJzZV9maWxlICpzcGFyc2VfZmlsZV9uZXcodW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGludDY0X3QgbGVuKTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV9kZXN0cm95IC0gZGVzdHJveSBhIHNwYXJzZSBmaWxlIGNvb2tpZQorICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKgorICogRGVzdHJveXMgYSBzcGFyc2UgZmlsZSBjb29raWUuICBBZnRlciBkZXN0cm95LCBhbGwgbWVtb3J5IHBhc3NlZCBpbiB0bworICogc3BhcnNlX2ZpbGVfYWRkX2RhdGEgY2FuIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIKKyAqLwordm9pZCBzcGFyc2VfZmlsZV9kZXN0cm95KHN0cnVjdCBzcGFyc2VfZmlsZSAqcyk7CisKKy8qKgorICogc3BhcnNlX2ZpbGVfYWRkX2RhdGEgLSBhc3NvY2lhdGUgYSBkYXRhIGNodW5rIHdpdGggYSBzcGFyc2UgZmlsZQorICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKiBAZGF0YSAtIHBvaW50ZXIgdG8gZGF0YSBibG9jaworICogQGxlbiAtIGxlbmd0aCBvZiB0aGUgZGF0YSBibG9jaworICogQGJsb2NrIC0gb2Zmc2V0IGluIGJsb2NrcyBpbnRvIHRoZSBzcGFyc2UgZmlsZSB0byBwbGFjZSB0aGUgZGF0YSBjaHVuaworICoKKyAqIEFzc29jaWF0ZXMgYSBkYXRhIGNodW5rIHdpdGggYSBzcGFyc2UgZmlsZSBjb29raWUuICBUaGUgcmVnaW9uCisgKiBbYmxvY2sgKiBibG9ja19zaXplIDogYmxvY2sgKiBibG9ja19zaXplICsgbGVuKSBtdXN0IG5vdCBhbHJlYWR5IGJlIHVzZWQgaW4KKyAqIHRoZSBzcGFyc2UgZmlsZS4gSWYgbGVuIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplIHRoZSBkYXRhCisgKiB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zLgorICoKKyAqIFRoZSBkYXRhIHBvaW50ZXIgbXVzdCByZW1haW4gdmFsaWQgdW50aWwgdGhlIHNwYXJzZSBmaWxlIGlzIGNsb3NlZCBvciB0aGUKKyAqIGRhdGEgYmxvY2sgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzcGFyc2UgZmlsZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBzcGFyc2VfZmlsZV9hZGRfZGF0YShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsCisJCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jayk7CisKKy8qKgorICogc3BhcnNlX2ZpbGVfYWRkX2ZpbGwgLSBhc3NvY2lhdGUgYSBmaWxsIGNodW5rIHdpdGggYSBzcGFyc2UgZmlsZQorICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKiBAZmlsbF92YWwgLSAzMiBiaXQgZmlsbCBkYXRhCisgKiBAbGVuIC0gbGVuZ3RoIG9mIHRoZSBmaWxsIGJsb2NrCisgKiBAYmxvY2sgLSBvZmZzZXQgaW4gYmxvY2tzIGludG8gdGhlIHNwYXJzZSBmaWxlIHRvIHBsYWNlIHRoZSBmaWxsIGNodW5rCisgKgorICogQXNzb2NpYXRlcyBhIGNodW5rIGZpbGxlZCB3aXRoIGZpbGxfdmFsIHdpdGggYSBzcGFyc2UgZmlsZSBjb29raWUuCisgKiBUaGUgcmVnaW9uIFtibG9jayAqIGJsb2NrX3NpemUgOiBibG9jayAqIGJsb2NrX3NpemUgKyBsZW4pIG11c3Qgbm90IGFscmVhZHkKKyAqIGJlIHVzZWQgaW4gdGhlIHNwYXJzZSBmaWxlLiBJZiBsZW4gaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUgdGhlCisgKiBkYXRhIHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitpbnQgc3BhcnNlX2ZpbGVfYWRkX2ZpbGwoc3RydWN0IHNwYXJzZV9maWxlICpzLAorCQl1aW50MzJfdCBmaWxsX3ZhbCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGJsb2NrKTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV9hZGRfZmlsZSAtIGFzc29jaWF0ZSBhIGNodW5rIG9mIGEgZmlsZSB3aXRoIGEgc3BhcnNlIGZpbGUKKyAqCisgKiBAcyAtIHNwYXJzZSBmaWxlIGNvb2tpZQorICogQGZpbGVuYW1lIC0gZmlsZW5hbWUgb2YgdGhlIGZpbGUgdG8gYmUgY29waWVkCisgKiBAZmlsZV9vZmZzZXQgLSBvZmZzZXQgaW50byB0aGUgY29waWVkIGZpbGUKKyAqIEBsZW4gLSBsZW5ndGggb2YgdGhlIGNvcGllZCBibG9jaworICogQGJsb2NrIC0gb2Zmc2V0IGluIGJsb2NrcyBpbnRvIHRoZSBzcGFyc2UgZmlsZSB0byBwbGFjZSB0aGUgZmlsZSBjaHVuaworICoKKyAqIEFzc29jaWF0ZXMgYSBjaHVuayBvZiBhbiBleGlzdGluZyBmaWxlIHdpdGggYSBzcGFyc2UgZmlsZSBjb29raWUuCisgKiBUaGUgcmVnaW9uIFtibG9jayAqIGJsb2NrX3NpemUgOiBibG9jayAqIGJsb2NrX3NpemUgKyBsZW4pIG11c3Qgbm90IGFscmVhZHkKKyAqIGJlIHVzZWQgaW4gdGhlIHNwYXJzZSBmaWxlLiBJZiBsZW4gaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUgdGhlCisgKiBkYXRhIHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MuCisgKgorICogQWxsb3dzIGFkZGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgdG8gYSBzcGFyc2UgZmlsZSB3aXRob3V0IG5lZWRpbmcgdG8ga2VlcAorICogaXQgYWxsIG1hcHBlZC4gIEZpbGUgc2l6ZSBpcyBsaW1pdGVkIGJ5IGF2YWlsYWJsZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UsCisgKiBleGNlcHRpb25hbGx5IGxhcmdlIGZpbGVzIG1heSBuZWVkIHRvIGJlIGFkZGVkIGluIG11bHRpcGxlIGNodW5rcy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBzcGFyc2VfZmlsZV9hZGRfZmlsZShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsCisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQ2NF90IGZpbGVfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQl1bnNpZ25lZCBpbnQgYmxvY2spOworCisvKioKKyAqIHNwYXJzZV9maWxlX2FkZF9maWxlIC0gYXNzb2NpYXRlIGEgY2h1bmsgb2YgYSBmaWxlIHdpdGggYSBzcGFyc2UgZmlsZQorICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKiBAZmlsZW5hbWUgLSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBiZSBjb3BpZWQKKyAqIEBmaWxlX29mZnNldCAtIG9mZnNldCBpbnRvIHRoZSBjb3BpZWQgZmlsZQorICogQGxlbiAtIGxlbmd0aCBvZiB0aGUgY29waWVkIGJsb2NrCisgKiBAYmxvY2sgLSBvZmZzZXQgaW4gYmxvY2tzIGludG8gdGhlIHNwYXJzZSBmaWxlIHRvIHBsYWNlIHRoZSBmaWxlIGNodW5rCisgKgorICogQXNzb2NpYXRlcyBhIGNodW5rIG9mIGFuIGV4aXN0aW5nIGZkIHdpdGggYSBzcGFyc2UgZmlsZSBjb29raWUuCisgKiBUaGUgcmVnaW9uIFtibG9jayAqIGJsb2NrX3NpemUgOiBibG9jayAqIGJsb2NrX3NpemUgKyBsZW4pIG11c3Qgbm90IGFscmVhZHkKKyAqIGJlIHVzZWQgaW4gdGhlIHNwYXJzZSBmaWxlLiBJZiBsZW4gaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUgdGhlCisgKiBkYXRhIHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MuCisgKgorICogQWxsb3dzIGFkZGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgdG8gYSBzcGFyc2UgZmlsZSB3aXRob3V0IG5lZWRpbmcgdG8ga2VlcAorICogaXQgYWxsIG1hcHBlZC4gIEZpbGUgc2l6ZSBpcyBsaW1pdGVkIGJ5IGF2YWlsYWJsZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UsCisgKiBleGNlcHRpb25hbGx5IGxhcmdlIGZpbGVzIG1heSBuZWVkIHRvIGJlIGFkZGVkIGluIG11bHRpcGxlIGNodW5rcy4KKyAqCisgKiBUaGUgZmQgbXVzdCByZW1haW4gb3BlbiB1bnRpbCB0aGUgc3BhcnNlIGZpbGUgaXMgY2xvc2VkIG9yIHRoZSBmZCBibG9jayBpcworICogcmVtb3ZlZCBmcm9tIHRoZSBzcGFyc2UgZmlsZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBzcGFyc2VfZmlsZV9hZGRfZmQoc3RydWN0IHNwYXJzZV9maWxlICpzLAorCQlpbnQgZmQsIGludDY0X3QgZmlsZV9vZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jayk7CisKKy8qKgorICogc3BhcnNlX2ZpbGVfd3JpdGUgLSB3cml0ZSBhIHNwYXJzZSBmaWxlIHRvIGEgZmlsZQorICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKiBAZmQgLSBmaWxlIGRlc2NyaXB0b3IgdG8gd3JpdGUgdG8KKyAqIEBneiAtIHdyaXRlIGEgZ3ppcHBlZCBmaWxlCisgKiBAc3BhcnNlIC0gd3JpdGUgaW4gdGhlIEFuZHJvaWQgc3BhcnNlIGZpbGUgZm9ybWF0CisgKiBAY3JjIC0gYXBwZW5kIGEgY3JjIGNodW5rCisgKgorICogV3JpdGVzIGEgc3BhcnNlIGZpbGUgdG8gYSBmaWxlLiAgSWYgZ3ogaXMgdHJ1ZSwgdGhlIGRhdGEgd2lsbCBiZSBwYXNzZWQKKyAqIHRocm91Z2ggemxpYi4gIElmIHNwYXJzZSBpcyB0cnVlLCB0aGUgZmlsZSB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIEFuZHJvaWQKKyAqIHNwYXJzZSBmaWxlIGZvcm1hdC4gIElmIHNwYXJzZSBpcyBmYWxzZSwgdGhlIGZpbGUgd2lsbCBiZSB3cml0dGVuIGJ5IHNlZWtpbmcKKyAqIG92ZXIgdW51c2VkIGNodW5rcywgcHJvZHVjaW5nIGEgc21hbGxlciBmaWxlIGlmIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnRzCisgKiBzcGFyc2UgZmlsZXMuICBJZiBjcmMgaXMgdHJ1ZSwgdGhlIGNyYyBvZiB0aGUgZXhwYW5kZWQgZGF0YSB3aWxsIGJlCisgKiBjYWxjdWxhdGVkIGFuZCBhcHBlbmRlZCBpbiBhIGNyYyBjaHVuay4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCisgKi8KK2ludCBzcGFyc2VfZmlsZV93cml0ZShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsIGludCBmZCwgYm9vbCBneiwgYm9vbCBzcGFyc2UsCisJCWJvb2wgY3JjKTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV9sZW4gLSByZXR1cm4gdGhlIGxlbmd0aCBvZiBhIHNwYXJzZSBmaWxlIGlmIHdyaXR0ZW4gdG8gZGlzaworICoKKyAqIEBzIC0gc3BhcnNlIGZpbGUgY29va2llCisgKiBAc3BhcnNlIC0gd3JpdGUgaW4gdGhlIEFuZHJvaWQgc3BhcnNlIGZpbGUgZm9ybWF0CisgKiBAY3JjIC0gYXBwZW5kIGEgY3JjIGNodW5rCisgKgorICogUmV0dXJucyB0aGUgc2l6ZSBhIHNwYXJzZSBmaWxlIHdvdWxkIGJlIG9uIGRpc2sgaWYgaXQgd2VyZSB3cml0dGVuIGluIHRoZQorICogc3BlY2lmaWVkIGZvcm1hdC4gIElmIHNwYXJzZSBpcyB0cnVlLCB0aGlzIGlzIHRoZSBzaXplIG9mIHRoZSBkYXRhIGluIHRoZQorICogc3BhcnNlIGZvcm1hdC4gIElmIHNwYXJzZSBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgbm9ybWFsCisgKiBub24tc3BhcnNlIGZpbGUuCisgKi8KK2ludDY0X3Qgc3BhcnNlX2ZpbGVfbGVuKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgYm9vbCBzcGFyc2UsIGJvb2wgY3JjKTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV9jYWxsYmFjayAtIGNhbGwgYSBjYWxsYmFjayBmb3IgYmxvY2tzIGluIHNwYXJzZSBmaWxlCisgKgorICogQHMgLSBzcGFyc2UgZmlsZSBjb29raWUKKyAqIEBzcGFyc2UgLSB3cml0ZSBpbiB0aGUgQW5kcm9pZCBzcGFyc2UgZmlsZSBmb3JtYXQKKyAqIEBjcmMgLSBhcHBlbmQgYSBjcmMgY2h1bmsKKyAqIEB3cml0ZSAtIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggYmxvY2sKKyAqIEBwcml2IC0gdmFsdWUgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gd3JpdGUKKyAqCisgKiBXcml0ZXMgYSBzcGFyc2UgZmlsZSBieSBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uICBJZiBzcGFyc2UgaXMgdHJ1ZSwgdGhlCisgKiBmaWxlIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgQW5kcm9pZCBzcGFyc2UgZmlsZSBmb3JtYXQuICBJZiBjcmMgaXMgdHJ1ZSwgdGhlCisgKiBjcmMgb2YgdGhlIGV4cGFuZGVkIGRhdGEgd2lsbCBiZSBjYWxjdWxhdGVkIGFuZCBhcHBlbmRlZCBpbiBhIGNyYyBjaHVuay4KKyAqIFRoZSBjYWxsYmFjayAnd3JpdGUnIHdpbGwgYmUgY2FsbGVkIHdpdGggZGF0YSBhbmQgbGVuZ3RoIGZvciBlYWNoIGRhdGEsCisgKiBhbmQgd2l0aCBkYXRhPT1OVUxMIHRvIHNraXAgb3ZlciBhIHJlZ2lvbiAob25seSB1c2VkIGZvciBub24tc3BhcnNlIGZvcm1hdCkuCisgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIHJldHVybiBuZWdhdGl2ZSBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvci4KKyAqLworaW50IHNwYXJzZV9maWxlX2NhbGxiYWNrKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgYm9vbCBzcGFyc2UsIGJvb2wgY3JjLAorCQlpbnQgKCp3cml0ZSkodm9pZCAqcHJpdiwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbiksIHZvaWQgKnByaXYpOworCisvKioKKyAqIHNwYXJzZV9maWxlX3JlYWQgLSByZWFkIGEgZmlsZSBpbnRvIGEgc3BhcnNlIGZpbGUgY29va2llCisgKgorICogQHMgLSBzcGFyc2UgZmlsZSBjb29raWUKKyAqIEBmZCAtIGZpbGUgZGVzY3JpcHRvciB0byByZWFkIGZyb20KKyAqIEBzcGFyc2UgLSByZWFkIGEgZmlsZSBpbiB0aGUgQW5kcm9pZCBzcGFyc2UgZmlsZSBmb3JtYXQKKyAqIEBjcmMgLSB2ZXJpZnkgdGhlIGNyYyBvZiBhIGZpbGUgaW4gdGhlIEFuZHJvaWQgc3BhcnNlIGZpbGUgZm9ybWF0CisgKgorICogUmVhZHMgYSBmaWxlIGludG8gYSBzcGFyc2UgZmlsZSBjb29raWUuICBJZiBzcGFyc2UgaXMgdHJ1ZSwgdGhlIGZpbGUgaXMKKyAqIGFzc3VtZWQgdG8gYmUgaW4gdGhlIEFuZHJvaWQgc3BhcnNlIGZpbGUgZm9ybWF0LiAgSWYgc3BhcnNlIGlzIGZhbHNlLCB0aGUKKyAqIGZpbGUgd2lsbCBiZSBzcGFyc2VkIGJ5IGxvb2tpbmcgZm9yIGJsb2NrIGFsaWduZWQgY2h1bmtzIG9mIGFsbCB6ZXJvcyBvcgorICogYW5vdGhlciAzMiBiaXQgdmFsdWUuICBJZiBjcmMgaXMgdHJ1ZSwgdGhlIGNyYyBvZiB0aGUgc3BhcnNlIGZpbGUgd2lsbCBiZQorICogdmVyaWZpZWQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgorICovCitpbnQgc3BhcnNlX2ZpbGVfcmVhZChzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsIGludCBmZCwgYm9vbCBzcGFyc2UsIGJvb2wgY3JjKTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV9pbXBvcnQgLSBpbXBvcnQgYW4gZXhpc3Rpbmcgc3BhcnNlIGZpbGUKKyAqCisgKiBAcyAtIHNwYXJzZSBmaWxlIGNvb2tpZQorICogQHZlcmJvc2UgLSBwcmludCB2ZXJib3NlIGVycm9ycyB3aGlsZSByZWFkaW5nIHRoZSBzcGFyc2UgZmlsZQorICogQGNyYyAtIHZlcmlmeSB0aGUgY3JjIG9mIGEgZmlsZSBpbiB0aGUgQW5kcm9pZCBzcGFyc2UgZmlsZSBmb3JtYXQKKyAqCisgKiBSZWFkcyBhbiBleGlzdGluZyBzcGFyc2UgZmlsZSBpbnRvIGEgc3BhcnNlIGZpbGUgY29va2llLCByZWNyZWF0aW5nIHRoZSBzYW1lCisgKiBzcGFyc2UgY29va2llIHRoYXQgd2FzIHVzZWQgdG8gd3JpdGUgaXQuICBJZiB2ZXJib3NlIGlzIHRydWUsIHByaW50cyB2ZXJib3NlCisgKiBlcnJvcnMgd2hlbiB0aGUgc3BhcnNlIGZpbGUgaXMgZm9ybWF0dGVkIGluY29ycmVjdGx5LgorICoKKyAqIFJldHVybnMgYSBuZXcgc3BhcnNlIGZpbGUgY29va2llIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IuCisgKi8KK3N0cnVjdCBzcGFyc2VfZmlsZSAqc3BhcnNlX2ZpbGVfaW1wb3J0KGludCBmZCwgYm9vbCB2ZXJib3NlLCBib29sIGNyYyk7CisKKy8qKgorICogc3BhcnNlX2ZpbGVfaW1wb3J0X2F1dG8gLSBpbXBvcnQgYW4gZXhpc3Rpbmcgc3BhcnNlIG9yIG5vcm1hbCBmaWxlCisgKgorICogQGZkIC0gZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbQorICogQGNyYyAtIHZlcmlmeSB0aGUgY3JjIG9mIGEgZmlsZSBpbiB0aGUgQW5kcm9pZCBzcGFyc2UgZmlsZSBmb3JtYXQKKyAqCisgKiBSZWFkcyBhbiBleGlzdGluZyBzcGFyc2Ugb3Igbm9ybWFsIGZpbGUgaW50byBhIHNwYXJzZSBmaWxlIGNvb2tpZS4KKyAqIEF0dGVtcHRzIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyBzcGFyc2Ugb3Igbm90IGJ5IGxvb2tpbmcgZm9yIHRoZSBzcGFyc2UKKyAqIGZpbGUgbWFnaWMgbnVtYmVyIGluIHRoZSBmaXJzdCA0IGJ5dGVzLiAgSWYgdGhlIGZpbGUgaXMgbm90IHNwYXJzZSwgdGhlIGZpbGUKKyAqIHdpbGwgYmUgc3BhcnNlZCBieSBsb29raW5nIGZvciBibG9jayBhbGlnbmVkIGNodW5rcyBvZiBhbGwgemVyb3Mgb3IgYW5vdGhlcgorICogMzIgYml0IHZhbHVlLiAgSWYgY3JjIGlzIHRydWUsIHRoZSBjcmMgb2YgdGhlIHNwYXJzZSBmaWxlIHdpbGwgYmUgdmVyaWZpZWQuCisgKgorICogUmV0dXJucyBhIG5ldyBzcGFyc2UgZmlsZSBjb29raWUgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KKyAqLworc3RydWN0IHNwYXJzZV9maWxlICpzcGFyc2VfZmlsZV9pbXBvcnRfYXV0byhpbnQgZmQsIGJvb2wgY3JjKTsKKworLyoqIHNwYXJzZV9maWxlX3Jlc3BhcnNlIC0gcmVjaHVuayBhbiBleGlzdGluZyBzcGFyc2UgZmlsZSBpbnRvIHNtYWxsZXIgZmlsZXMKKyAqCisgKiBAaW5fcyAtIHNwYXJzZSBmaWxlIGNvb2tpZSBvZiB0aGUgZXhpc3Rpbmcgc3BhcnNlIGZpbGUKKyAqIEBtYXhfbGVuIC0gbWF4aW11bSBmaWxlIHNpemUKKyAqIEBvdXRfcyAtIGFycmF5IG9mIHNwYXJzZSBmaWxlIGNvb2tpZXMKKyAqIEBvdXRfc19jb3VudCAtIHNpemUgb2Ygb3V0X3MgYXJyYXkKKyAqCisgKiBTcGxpdHMgY2h1bmtzIG9mIGFuIGV4aXN0aW5nIHNwYXJzZSBmaWxlIGludG8gc21hbGxlciBzcGFyc2UgZmlsZXMgc3VjaCB0aGF0CisgKiBlYWNoIHNwYXJzZSBmaWxlIGlzIGxlc3MgdGhhbiBtYXhfbGVuLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNwYXJzZV9maWxlcworICogdGhhdCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiB0byBvdXRfcyBpZiBvdXRfcyB3ZXJlIGJpZyBlbm91Z2guCisgKi8KK2ludCBzcGFyc2VfZmlsZV9yZXNwYXJzZShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKmluX3MsIHVuc2lnbmVkIGludCBtYXhfbGVuLAorCQlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKipvdXRfcywgaW50IG91dF9zX2NvdW50KTsKKworLyoqCisgKiBzcGFyc2VfZmlsZV92ZXJib3NlIC0gc2V0IGEgc3BhcnNlIGZpbGUgY29va2llIHRvIHByaW50IHZlcmJvc2UgZXJyb3JzCisgKgorICogQHMgLSBzcGFyc2UgZmlsZSBjb29raWUKKyAqCisgKiBQcmludCB2ZXJib3NlIHNwYXJzZSBmaWxlIGVycm9ycyB3aGVuZXZlciB1c2luZyB0aGUgc3BhcnNlIGZpbGUgY29va2llLgorICovCit2b2lkIHNwYXJzZV9maWxlX3ZlcmJvc2Uoc3RydWN0IHNwYXJzZV9maWxlICpzKTsKKworLyoqCisgKiBzcGFyc2VfcHJpbnRfdmVyYm9zZSAtIGZ1bmN0aW9uIGNhbGxlZCB0byBwcmludCB2ZXJib3NlIGVycm9ycworICoKKyAqIEJ5IGRlZmF1bHQsIHZlcmJvc2UgZXJyb3JzIHdpbGwgcHJpbnQgdG8gc3RhbmRhcmQgZXJyb3IuCisgKiBzcGFyc2VfcHJpbnRfdmVyYm9zZSBtYXkgYmUgb3ZlcnJpZGRlbiB0byBsb2cgdmVyYm9zZSBlcnJvcnMgc29tZXdoZXJlIGVsc2UuCisgKgorICovCitleHRlcm4gdm9pZCAoKnNwYXJzZV9wcmludF92ZXJib3NlKShjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc291cmNlcy5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NvdXJjZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlM2M5NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NvdXJjZXMubWsKQEAgLTAsMCArMSw0MiBAQAorIyBCdWlsZCBmaWxlIGZvciBsaWJzcGFyc2UgYW5kIGFzc29jaWF0ZWQgZXhlY3V0YWJsZXMuCisKKyMgVXBkYXRlIExPQ0FMX1BBVEggYWZ0ZXIgc2F2aW5nIG9sZCB2YWx1ZS4KK0xJQlNQQVJTRV9PTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK0xJQlNQQVJTRV9JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgJChaTElCX0lOQ0xVREVTKQorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1saWJzcGFyc2UpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgc3JjL2JhY2tlZF9ibG9jay5jIFwKKyAgICBzcmMvb3V0cHV0X2ZpbGUuYyBcCisgICAgc3JjL3NwYXJzZS5jIFwKKyAgICBzcmMvc3BhcnNlX2NyYzMyLmMgXAorICAgIHNyYy9zcGFyc2VfZXJyLmMgXAorICAgIHNyYy9zcGFyc2VfcmVhZC5jIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExJQlNQQVJTRV9JTkNMVURFUykgJChMT0NBTF9QQVRIKS9zcmMKKworaWZlcSAod2luZG93cywkKEJVSUxEX1RBUkdFVF9PUykpCitMT0NBTF9DRkxBR1MgOj0gLURVU0VfTUlOR1c9MQorZW5kaWYKKyMgVGhpcyB0aGlyZC1wYXJ0eSBsaWJyYXJ5IGNyZWF0ZXMgd2FybmluZ3MgYXQgY29tcGlsZSB0aW1lLgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tZXJyb3IKKworJChjYWxsIGVuZC1lbXVsYXRvci1saWJyYXJ5KQorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItcHJvZ3JhbSxlbXVsYXRvciQoQlVJTERfVEFSR0VUX1NVRkZJWClfaW1nMnNpbWcpCitMT0NBTF9TUkNfRklMRVMgOj0gc3JjL2ltZzJzaW1nLmMKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMSUJTUEFSU0VfSU5DTFVERVMpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGVtdWxhdG9yLWxpYnNwYXJzZSBlbXVsYXRvci16bGliCiskKGNhbGwgZW5kLWVtdWxhdG9yLXByb2dyYW0pCisKKyQoY2FsbCBzdGFydC1lbXVsYXRvci1wcm9ncmFtLGVtdWxhdG9yJChCVUlMRF9UQVJHRVRfU1VGRklYKV9zaW1nMmltZykKK0xPQ0FMX1NSQ19GSUxFUyA6PSBzcmMvc2ltZzJpbWcuYworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExJQlNQQVJTRV9JTkNMVURFUykKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZW11bGF0b3ItbGlic3BhcnNlIGVtdWxhdG9yLXpsaWIKKyQoY2FsbCBlbmQtZW11bGF0b3ItcHJvZ3JhbSkKKworIyBSZXNldCBMT0NBTF9QQVRIIGJlZm9yZSBleGl0aW5nIHRoaXMgYnVpbGQgZmlsZS4KK0xPQ0FMX1BBVEggOj0gJChMSUJTUEFSU0VfT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvYmFja2VkX2Jsb2NrLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvYmFja2VkX2Jsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3MmI1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9iYWNrZWRfYmxvY2suYwpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYmFja2VkX2Jsb2NrLmgiCisjaW5jbHVkZSAic3BhcnNlX2RlZnMuaCIKKworc3RydWN0IGJhY2tlZF9ibG9jayB7CisJdW5zaWduZWQgaW50IGJsb2NrOworCXVuc2lnbmVkIGludCBsZW47CisJZW51bSBiYWNrZWRfYmxvY2tfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXZvaWQgKmRhdGE7CisJCX0gZGF0YTsKKwkJc3RydWN0IHsKKwkJCWNoYXIgKmZpbGVuYW1lOworCQkJaW50NjRfdCBvZmZzZXQ7CisJCX0gZmlsZTsKKwkJc3RydWN0IHsKKwkJCWludCBmZDsKKwkJCWludDY0X3Qgb2Zmc2V0OworCQl9IGZkOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgdmFsOworCQl9IGZpbGw7CisJfTsKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpuZXh0OworfTsKKworc3RydWN0IGJhY2tlZF9ibG9ja19saXN0IHsKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpkYXRhX2Jsb2NrczsKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpsYXN0X3VzZWQ7CisJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7Cit9OworCitzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYWNrZWRfYmxvY2tfaXRlcl9uZXcoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwpCit7CisJcmV0dXJuIGJibC0+ZGF0YV9ibG9ja3M7Cit9CisKK3N0cnVjdCBiYWNrZWRfYmxvY2sgKmJhY2tlZF9ibG9ja19pdGVyX25leHQoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpCit7CisJcmV0dXJuIGJiLT5uZXh0OworfQorCit1bnNpZ25lZCBpbnQgYmFja2VkX2Jsb2NrX2xlbihzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYikKK3sKKwlyZXR1cm4gYmItPmxlbjsKK30KKwordW5zaWduZWQgaW50IGJhY2tlZF9ibG9ja19ibG9jayhzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYikKK3sKKwlyZXR1cm4gYmItPmJsb2NrOworfQorCit2b2lkICpiYWNrZWRfYmxvY2tfZGF0YShzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYikKK3sKKwlhc3NlcnQoYmItPnR5cGUgPT0gQkFDS0VEX0JMT0NLX0RBVEEpOworCXJldHVybiBiYi0+ZGF0YS5kYXRhOworfQorCitjb25zdCBjaGFyICpiYWNrZWRfYmxvY2tfZmlsZW5hbWUoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpCit7CisJYXNzZXJ0KGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GSUxFKTsKKwlyZXR1cm4gYmItPmZpbGUuZmlsZW5hbWU7Cit9CisKK2ludCBiYWNrZWRfYmxvY2tfZmQoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpCit7CisJYXNzZXJ0KGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GRCk7CisJcmV0dXJuIGJiLT5mZC5mZDsKK30KKworaW50NjRfdCBiYWNrZWRfYmxvY2tfZmlsZV9vZmZzZXQoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpCit7CisJYXNzZXJ0KGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GSUxFIHx8IGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GRCk7CisJaWYgKGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GSUxFKSB7CisJCXJldHVybiBiYi0+ZmlsZS5vZmZzZXQ7CisJfSBlbHNlIHsgLyogYmItPnR5cGUgPT0gQkFDS0VEX0JMT0NLX0ZEICovCisJCXJldHVybiBiYi0+ZmQub2Zmc2V0OworCX0KK30KKwordWludDMyX3QgYmFja2VkX2Jsb2NrX2ZpbGxfdmFsKHN0cnVjdCBiYWNrZWRfYmxvY2sgKmJiKQoreworCWFzc2VydChiYi0+dHlwZSA9PSBCQUNLRURfQkxPQ0tfRklMTCk7CisJcmV0dXJuIGJiLT5maWxsLnZhbDsKK30KKworZW51bSBiYWNrZWRfYmxvY2tfdHlwZSBiYWNrZWRfYmxvY2tfdHlwZShzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYikKK3sKKwlyZXR1cm4gYmItPnR5cGU7Cit9CisKK3ZvaWQgYmFja2VkX2Jsb2NrX2Rlc3Ryb3koc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpCit7CisJaWYgKGJiLT50eXBlID09IEJBQ0tFRF9CTE9DS19GSUxFKSB7CisJCWZyZWUoYmItPmZpbGUuZmlsZW5hbWUpOworCX0KKworCWZyZWUoYmIpOworfQorCitzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmJhY2tlZF9ibG9ja19saXN0X25ldyh1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSkKK3sKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmIgPSBjYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCksIDEpOworCWItPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworCXJldHVybiBiOworfQorCit2b2lkIGJhY2tlZF9ibG9ja19saXN0X2Rlc3Ryb3koc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwpCit7CisJaWYgKGJibC0+ZGF0YV9ibG9ja3MpIHsKKwkJc3RydWN0IGJhY2tlZF9ibG9jayAqYmIgPSBiYmwtPmRhdGFfYmxvY2tzOworCQl3aGlsZSAoYmIpIHsKKwkJCXN0cnVjdCBiYWNrZWRfYmxvY2sgKm5leHQgPSBiYi0+bmV4dDsKKwkJCWJhY2tlZF9ibG9ja19kZXN0cm95KGJiKTsKKwkJCWJiID0gbmV4dDsKKwkJfQorCX0KKworCWZyZWUoYmJsKTsKK30KKwordm9pZCBiYWNrZWRfYmxvY2tfbGlzdF9tb3ZlKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqZnJvbSwKKwkJc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICp0bywgc3RydWN0IGJhY2tlZF9ibG9jayAqc3RhcnQsCisJCXN0cnVjdCBiYWNrZWRfYmxvY2sgKmVuZCkKK3sKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYjsKKworCWlmIChzdGFydCA9PSBOVUxMKSB7CisJCXN0YXJ0ID0gZnJvbS0+ZGF0YV9ibG9ja3M7CisJfQorCisJaWYgKCFlbmQpIHsKKwkJZm9yIChlbmQgPSBzdGFydDsgZW5kICYmIGVuZC0+bmV4dDsgZW5kID0gZW5kLT5uZXh0KQorCQkJOworCX0KKworCWlmIChzdGFydCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisKKwlmcm9tLT5sYXN0X3VzZWQgPSBOVUxMOworCXRvLT5sYXN0X3VzZWQgPSBOVUxMOworCWlmIChmcm9tLT5kYXRhX2Jsb2NrcyA9PSBzdGFydCkgeworCQlmcm9tLT5kYXRhX2Jsb2NrcyA9IGVuZC0+bmV4dDsKKwl9IGVsc2UgeworCQlmb3IgKGJiID0gZnJvbS0+ZGF0YV9ibG9ja3M7IGJiOyBiYiA9IGJiLT5uZXh0KSB7CisJCQlpZiAoYmItPm5leHQgPT0gc3RhcnQpIHsKKwkJCQliYi0+bmV4dCA9IGVuZC0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghdG8tPmRhdGFfYmxvY2tzKSB7CisJCXRvLT5kYXRhX2Jsb2NrcyA9IHN0YXJ0OworCQllbmQtPm5leHQgPSBOVUxMOworCX0gZWxzZSB7CisJCWZvciAoYmIgPSB0by0+ZGF0YV9ibG9ja3M7IGJiOyBiYiA9IGJiLT5uZXh0KSB7CisJCQlpZiAoIWJiLT5uZXh0IHx8IGJiLT5uZXh0LT5ibG9jayA+IHN0YXJ0LT5ibG9jaykgeworCQkJCWVuZC0+bmV4dCA9IGJiLT5uZXh0OworCQkJCWJiLT5uZXh0ID0gc3RhcnQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIG1heSBmcmVlIGIgKi8KK3N0YXRpYyBpbnQgbWVyZ2VfYmIoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwsCisJCXN0cnVjdCBiYWNrZWRfYmxvY2sgKmEsIHN0cnVjdCBiYWNrZWRfYmxvY2sgKmIpCit7CisJdW5zaWduZWQgaW50IGJsb2NrX2xlbjsKKworCS8qIEJsb2NrIGRvZXNuJ3QgZXhpc3QgKHBvc3NpYmxlIGlmIG9uZSBibG9jayBpcyB0aGUgbGFzdCBibG9jaykgKi8KKwlpZiAoIWEgfHwgIWIpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYXNzZXJ0KGEtPmJsb2NrIDwgYi0+YmxvY2spOworCisJLyogQmxvY2tzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMgKi8KKwlpZiAoYS0+dHlwZSAhPSBiLT50eXBlKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEJsb2NrcyBhcmUgbm90IGFkamFjZW50ICovCisJYmxvY2tfbGVuID0gYS0+bGVuIC8gYmJsLT5ibG9ja19zaXplOyAvKiByb3VuZHMgZG93biAqLworCWlmIChhLT5ibG9jayArIGJsb2NrX2xlbiAhPSBiLT5ibG9jaykgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGEtPnR5cGUpIHsKKwljYXNlIEJBQ0tFRF9CTE9DS19EQVRBOgorCQkvKiBEb24ndCBzdXBwb3J0IG1lcmdpbmcgZGF0YSBmb3Igbm93ICovCisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgQkFDS0VEX0JMT0NLX0ZJTEw6CisJCWlmIChhLT5maWxsLnZhbCAhPSBiLT5maWxsLnZhbCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCQUNLRURfQkxPQ0tfRklMRToKKwkJaWYgKGEtPmZpbGUuZmlsZW5hbWUgIT0gYi0+ZmlsZS5maWxlbmFtZSB8fAorCQkJCWEtPmZpbGUub2Zmc2V0ICsgYS0+bGVuICE9IGItPmZpbGUub2Zmc2V0KSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEJBQ0tFRF9CTE9DS19GRDoKKwkJaWYgKGEtPmZkLmZkICE9IGItPmZkLmZkIHx8CisJCQkJYS0+ZmQub2Zmc2V0ICsgYS0+bGVuICE9IGItPmZkLm9mZnNldCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogQmxvY2tzIGFyZSBjb21wYXRpYmxlIGFuZCBhZGphY2VudCwgd2l0aCBhIGJlZm9yZSBiLiAgTWVyZ2UgYiBpbnRvIGEsCisJICogYW5kIGZyZWUgYiAqLworCWEtPmxlbiArPSBiLT5sZW47CisJYS0+bmV4dCA9IGItPm5leHQ7CisKKwliYWNrZWRfYmxvY2tfZGVzdHJveShiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXVlX2JiKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsLCBzdHJ1Y3QgYmFja2VkX2Jsb2NrICpuZXdfYmIpCit7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmI7CisKKwlpZiAoYmJsLT5kYXRhX2Jsb2NrcyA9PSBOVUxMKSB7CisJCWJibC0+ZGF0YV9ibG9ja3MgPSBuZXdfYmI7CisJCXJldHVybiAwOworCX0KKworCWlmIChiYmwtPmRhdGFfYmxvY2tzLT5ibG9jayA+IG5ld19iYi0+YmxvY2spIHsKKwkJbmV3X2JiLT5uZXh0ID0gYmJsLT5kYXRhX2Jsb2NrczsKKwkJYmJsLT5kYXRhX2Jsb2NrcyA9IG5ld19iYjsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT3B0aW1pemF0aW9uOiBibG9ja3MgYXJlIG1vc3RseSBxdWV1ZWQgaW4gc2VxdWVuY2UsIHNvIHNhdmUgdGhlCisJICAgcG9pbnRlciB0byB0aGUgbGFzdCBiYiB0aGF0IHdhcyBhZGRlZCwgYW5kIHN0YXJ0IHNlYXJjaGluZyBmcm9tCisJICAgdGhlcmUgaWYgdGhlIG5leHQgYmxvY2sgbnVtYmVyIGlzIGhpZ2hlciAqLworCWlmIChiYmwtPmxhc3RfdXNlZCAmJiBuZXdfYmItPmJsb2NrID4gYmJsLT5sYXN0X3VzZWQtPmJsb2NrKQorCQliYiA9IGJibC0+bGFzdF91c2VkOworCWVsc2UKKwkJYmIgPSBiYmwtPmRhdGFfYmxvY2tzOworCWJibC0+bGFzdF91c2VkID0gbmV3X2JiOworCisJZm9yICg7IGJiLT5uZXh0ICYmIGJiLT5uZXh0LT5ibG9jayA8IG5ld19iYi0+YmxvY2s7IGJiID0gYmItPm5leHQpCisJCTsKKworCWlmIChiYi0+bmV4dCA9PSBOVUxMKSB7CisJCWJiLT5uZXh0ID0gbmV3X2JiOworCX0gZWxzZSB7CisJCW5ld19iYi0+bmV4dCA9IGJiLT5uZXh0OworCQliYi0+bmV4dCA9IG5ld19iYjsKKwl9CisKKwltZXJnZV9iYihiYmwsIG5ld19iYiwgbmV3X2JiLT5uZXh0KTsKKwltZXJnZV9iYihiYmwsIGJiLCBuZXdfYmIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFF1ZXVlcyBhIGZpbGwgYmxvY2sgb2YgbWVtb3J5IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZCBkYXRhIGJsb2NrcyAqLworaW50IGJhY2tlZF9ibG9ja19hZGRfZmlsbChzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmJibCwgdW5zaWduZWQgaW50IGZpbGxfdmFsLAorCQl1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgYmxvY2spCit7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBiYWNrZWRfYmxvY2spKTsKKwlpZiAoYmIgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliYi0+YmxvY2sgPSBibG9jazsKKwliYi0+bGVuID0gbGVuOworCWJiLT50eXBlID0gQkFDS0VEX0JMT0NLX0ZJTEw7CisJYmItPmZpbGwudmFsID0gZmlsbF92YWw7CisJYmItPm5leHQgPSBOVUxMOworCisJcmV0dXJuIHF1ZXVlX2JiKGJibCwgYmIpOworfQorCisvKiBRdWV1ZXMgYSBibG9jayBvZiBtZW1vcnkgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3BlY2lmaWVkIGRhdGEgYmxvY2tzICovCitpbnQgYmFja2VkX2Jsb2NrX2FkZF9kYXRhKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsLCB2b2lkICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgYmxvY2spCit7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBiYWNrZWRfYmxvY2spKTsKKwlpZiAoYmIgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliYi0+YmxvY2sgPSBibG9jazsKKwliYi0+bGVuID0gbGVuOworCWJiLT50eXBlID0gQkFDS0VEX0JMT0NLX0RBVEE7CisJYmItPmRhdGEuZGF0YSA9IGRhdGE7CisJYmItPm5leHQgPSBOVUxMOworCisJcmV0dXJuIHF1ZXVlX2JiKGJibCwgYmIpOworfQorCisvKiBRdWV1ZXMgYSBjaHVuayBvZiBhIGZpbGUgb24gZGlzayB0byBiZSB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBibG9ja3MgKi8KK2ludCBiYWNrZWRfYmxvY2tfYWRkX2ZpbGUoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlpbnQ2NF90IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGJsb2NrKQoreworCXN0cnVjdCBiYWNrZWRfYmxvY2sgKmJiID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgYmFja2VkX2Jsb2NrKSk7CisJaWYgKGJiID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYmItPmJsb2NrID0gYmxvY2s7CisJYmItPmxlbiA9IGxlbjsKKwliYi0+dHlwZSA9IEJBQ0tFRF9CTE9DS19GSUxFOworCWJiLT5maWxlLmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKwliYi0+ZmlsZS5vZmZzZXQgPSBvZmZzZXQ7CisJYmItPm5leHQgPSBOVUxMOworCisJcmV0dXJuIHF1ZXVlX2JiKGJibCwgYmIpOworfQorCisvKiBRdWV1ZXMgYSBjaHVuayBvZiBhIGZkIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZCBkYXRhIGJsb2NrcyAqLworaW50IGJhY2tlZF9ibG9ja19hZGRfZmQoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwsIGludCBmZCwgaW50NjRfdCBvZmZzZXQsCisJCXVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYiA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGJhY2tlZF9ibG9jaykpOworCWlmIChiYiA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWJiLT5ibG9jayA9IGJsb2NrOworCWJiLT5sZW4gPSBsZW47CisJYmItPnR5cGUgPSBCQUNLRURfQkxPQ0tfRkQ7CisJYmItPmZkLmZkID0gZmQ7CisJYmItPmZkLm9mZnNldCA9IG9mZnNldDsKKwliYi0+bmV4dCA9IE5VTEw7CisKKwlyZXR1cm4gcXVldWVfYmIoYmJsLCBiYik7Cit9CisKK2ludCBiYWNrZWRfYmxvY2tfc3BsaXQoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwsIHN0cnVjdCBiYWNrZWRfYmxvY2sgKmJiLAorCQl1bnNpZ25lZCBpbnQgbWF4X2xlbikKK3sKKwlzdHJ1Y3QgYmFja2VkX2Jsb2NrICpuZXdfYmI7CisKKwltYXhfbGVuID0gQUxJR05fRE9XTihtYXhfbGVuLCBiYmwtPmJsb2NrX3NpemUpOworCisJaWYgKGJiLT5sZW4gPD0gbWF4X2xlbikgeworCQlyZXR1cm4gMDsKKwl9CisKKwluZXdfYmIgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBiYWNrZWRfYmxvY2spKTsKKwlpZiAobmV3X2JiID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJKm5ld19iYiA9ICpiYjsKKworCW5ld19iYi0+bGVuID0gYmItPmxlbiAtIG1heF9sZW47CisJbmV3X2JiLT5ibG9jayA9IGJiLT5ibG9jayArIG1heF9sZW4gLyBiYmwtPmJsb2NrX3NpemU7CisJbmV3X2JiLT5uZXh0ID0gYmItPm5leHQ7CisJYmItPm5leHQgPSBuZXdfYmI7CisJYmItPmxlbiA9IG1heF9sZW47CisKKwlzd2l0Y2ggKGJiLT50eXBlKSB7CisJY2FzZSBCQUNLRURfQkxPQ0tfREFUQToKKwkJbmV3X2JiLT5kYXRhLmRhdGEgPSAoY2hhciAqKWJiLT5kYXRhLmRhdGEgKyBtYXhfbGVuOworCQlicmVhazsKKwljYXNlIEJBQ0tFRF9CTE9DS19GSUxFOgorCQluZXdfYmItPmZpbGUub2Zmc2V0ICs9IG1heF9sZW47CisJCWJyZWFrOworCWNhc2UgQkFDS0VEX0JMT0NLX0ZEOgorCQluZXdfYmItPmZkLm9mZnNldCArPSBtYXhfbGVuOworCQlicmVhazsKKwljYXNlIEJBQ0tFRF9CTE9DS19GSUxMOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9iYWNrZWRfYmxvY2suaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9iYWNrZWRfYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTE1OWJlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL2JhY2tlZF9ibG9jay5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9CQUNLRURfQkxPQ0tfSF8KKyNkZWZpbmUgX0JBQ0tFRF9CTE9DS19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdDsKK3N0cnVjdCBiYWNrZWRfYmxvY2s7CisKK2VudW0gYmFja2VkX2Jsb2NrX3R5cGUgeworCUJBQ0tFRF9CTE9DS19EQVRBLAorCUJBQ0tFRF9CTE9DS19GSUxFLAorCUJBQ0tFRF9CTE9DS19GRCwKKwlCQUNLRURfQkxPQ0tfRklMTCwKK307CisKK2ludCBiYWNrZWRfYmxvY2tfYWRkX2RhdGEoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwsIHZvaWQgKmRhdGEsCisJCXVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jayk7CitpbnQgYmFja2VkX2Jsb2NrX2FkZF9maWxsKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsLCB1bnNpZ25lZCBpbnQgZmlsbF92YWwsCisJCXVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jayk7CitpbnQgYmFja2VkX2Jsb2NrX2FkZF9maWxlKHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJaW50NjRfdCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jayk7CitpbnQgYmFja2VkX2Jsb2NrX2FkZF9mZChzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmJibCwgaW50IGZkLAorCQlpbnQ2NF90IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGJsb2NrKTsKKworc3RydWN0IGJhY2tlZF9ibG9jayAqYmFja2VkX2Jsb2NrX2l0ZXJfbmV3KHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsKTsKK3N0cnVjdCBiYWNrZWRfYmxvY2sgKmJhY2tlZF9ibG9ja19pdGVyX25leHQoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpOwordW5zaWduZWQgaW50IGJhY2tlZF9ibG9ja19sZW4oc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpOwordW5zaWduZWQgaW50IGJhY2tlZF9ibG9ja19ibG9jayhzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7Cit2b2lkICpiYWNrZWRfYmxvY2tfZGF0YShzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7Citjb25zdCBjaGFyICpiYWNrZWRfYmxvY2tfZmlsZW5hbWUoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpOworaW50IGJhY2tlZF9ibG9ja19mZChzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7CitpbnQ2NF90IGJhY2tlZF9ibG9ja19maWxlX29mZnNldChzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7Cit1aW50MzJfdCBiYWNrZWRfYmxvY2tfZmlsbF92YWwoc3RydWN0IGJhY2tlZF9ibG9jayAqYmIpOworZW51bSBiYWNrZWRfYmxvY2tfdHlwZSBiYWNrZWRfYmxvY2tfdHlwZShzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7CitpbnQgYmFja2VkX2Jsb2NrX3NwbGl0KHN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmJsLCBzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYiwKKwkJdW5zaWduZWQgaW50IG1heF9sZW4pOworCitzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYWNrZWRfYmxvY2tfaXRlcl9uZXcoc3RydWN0IGJhY2tlZF9ibG9ja19saXN0ICpiYmwpOworc3RydWN0IGJhY2tlZF9ibG9jayAqYmFja2VkX2Jsb2NrX2l0ZXJfbmV4dChzdHJ1Y3QgYmFja2VkX2Jsb2NrICpiYik7CisKK3N0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmFja2VkX2Jsb2NrX2xpc3RfbmV3KHVuc2lnbmVkIGludCBibG9ja19zaXplKTsKK3ZvaWQgYmFja2VkX2Jsb2NrX2xpc3RfZGVzdHJveShzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmJibCk7CisKK3ZvaWQgYmFja2VkX2Jsb2NrX2xpc3RfbW92ZShzdHJ1Y3QgYmFja2VkX2Jsb2NrX2xpc3QgKmZyb20sCisJCXN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqdG8sIHN0cnVjdCBiYWNrZWRfYmxvY2sgKnN0YXJ0LAorCQlzdHJ1Y3QgYmFja2VkX2Jsb2NrICplbmQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9kZWZzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvZGVmcy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9MSUJTUEFSU0VfREVGU19IXworCisjaWZuZGVmIF9fdW51c2VkCisjZGVmaW5lIF9fdW51c2VkICAgICAgICBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkKKyNlbmRpZgorCisjZW5kaWYgLyogX0xJQlNQQVJTRV9ERUZTX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvaW1nMnNpbWcuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9pbWcyc2ltZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvaW1nMnNpbWcuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX01BQ0hfXykKKyNkZWZpbmUgbHNlZWs2NCBsc2VlaworI2RlZmluZSBvZmY2NF90IG9mZl90CisjZW5kaWYKKwordm9pZCB1c2FnZSgpCit7CisgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogaW1nMnNpbWcgPHJhd19pbWFnZV9maWxlPiA8c3BhcnNlX2ltYWdlX2ZpbGU+IFs8YmxvY2tfc2l6ZT5dXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaW47CisJaW50IG91dDsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGFyc2VfZmlsZSAqczsKKwl1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSA9IDQwOTY7CisJb2ZmNjRfdCBsZW47CisKKwlpZiAoYXJnYyA8IDMgfHwgYXJnYyA+IDQpIHsKKwkJdXNhZ2UoKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGFyZ2MgPT0gNCkgeworCQlibG9ja19zaXplID0gYXRvaShhcmd2WzNdKTsKKwl9CisKKwlpZiAoYmxvY2tfc2l6ZSA8IDEwMjQgfHwgYmxvY2tfc2l6ZSAlIDQgIT0gMCkgeworCQl1c2FnZSgpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItIikgPT0gMCkgeworCQlpbiA9IFNURElOX0ZJTEVOTzsKKwl9IGVsc2UgeworCQlpbiA9IG9wZW4oYXJndlsxXSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisJCWlmIChpbiA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgYXJndlsxXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCWlmIChzdHJjbXAoYXJndlsyXSwgIi0iKSA9PSAwKSB7CisJCW91dCA9IFNURE9VVF9GSUxFTk87CisJfSBlbHNlIHsKKwkJb3V0ID0gb3Blbihhcmd2WzJdLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjQpOworCQlpZiAob3V0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgYXJndlsyXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCWxlbiA9IGxzZWVrNjQoaW4sIDAsIFNFRUtfRU5EKTsKKwlsc2VlazY0KGluLCAwLCBTRUVLX1NFVCk7CisKKwlzID0gc3BhcnNlX2ZpbGVfbmV3KGJsb2NrX3NpemUsIGxlbik7CisJaWYgKCFzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSBzcGFyc2UgZmlsZVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCXNwYXJzZV9maWxlX3ZlcmJvc2Uocyk7CisJcmV0ID0gc3BhcnNlX2ZpbGVfcmVhZChzLCBpbiwgZmFsc2UsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlYWQgZmlsZVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCXJldCA9IHNwYXJzZV9maWxlX3dyaXRlKHMsIG91dCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKwlpZiAocmV0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIHNwYXJzZSBmaWxlXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJY2xvc2UoaW4pOworCWNsb3NlKG91dCk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL291dHB1dF9maWxlLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvb3V0cHV0X2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTViNGFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL291dHB1dF9maWxlLmMKQEAgLTAsMCArMSw3ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMQorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJvdXRwdXRfZmlsZS5oIgorI2luY2x1ZGUgInNwYXJzZV9jcmMzMi5oIgorI2luY2x1ZGUgInNwYXJzZV9mb3JtYXQuaCIKKworI2lmbmRlZiBVU0VfTUlOR1cKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2RlZmluZSBPX0JJTkFSWSAwCisjZWxzZQorI2RlZmluZSBmdHJ1bmNhdGU2NCBmdHJ1bmNhdGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjZGVmaW5lIGxzZWVrNjQgbHNlZWsKKyNkZWZpbmUgZnRydW5jYXRlNjQgZnRydW5jYXRlCisjZGVmaW5lIG1tYXA2NCBtbWFwCisjZGVmaW5lIG9mZjY0X3Qgb2ZmX3QKKyNlbmRpZgorCisjZGVmaW5lIG1pbihhLCBiKSBcCisJKHsgdHlwZW9mKGEpIF9hID0gKGEpOyB0eXBlb2YoYikgX2IgPSAoYik7IChfYSA8IF9iKSA/IF9hIDogX2I7IH0pCisKKyNkZWZpbmUgU1BBUlNFX0hFQURFUl9NQUpPUl9WRVIgMQorI2RlZmluZSBTUEFSU0VfSEVBREVSX01JTk9SX1ZFUiAwCisjZGVmaW5lIFNQQVJTRV9IRUFERVJfTEVOICAgICAgIChzaXplb2Yoc3BhcnNlX2hlYWRlcl90KSkKKyNkZWZpbmUgQ0hVTktfSEVBREVSX0xFTiAoc2l6ZW9mKGNodW5rX2hlYWRlcl90KSkKKworI2RlZmluZSBjb250YWluZXJfb2YoaW5uZXIsIG91dGVyX3QsIGVsZW0pIFwKKwkoKG91dGVyX3QgKikoKGNoYXIgKilpbm5lciAtIG9mZnNldG9mKG91dGVyX3QsIGVsZW0pKSkKKworc3RydWN0IG91dHB1dF9maWxlX29wcyB7CisJaW50ICgqb3Blbikoc3RydWN0IG91dHB1dF9maWxlICosIGludCBmZCk7CisJaW50ICgqc2tpcCkoc3RydWN0IG91dHB1dF9maWxlICosIGludDY0X3QpOworCWludCAoKnBhZCkoc3RydWN0IG91dHB1dF9maWxlICosIGludDY0X3QpOworCWludCAoKndyaXRlKShzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKiwgdm9pZCAqLCBpbnQpOworCXZvaWQgKCpjbG9zZSkoc3RydWN0IG91dHB1dF9maWxlICopOworfTsKKworc3RydWN0IHNwYXJzZV9maWxlX29wcyB7CisJaW50ICgqd3JpdGVfZGF0YV9jaHVuaykoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQl2b2lkICpkYXRhKTsKKwlpbnQgKCp3cml0ZV9maWxsX2NodW5rKShzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdW5zaWduZWQgaW50IGxlbiwKKwkJCXVpbnQzMl90IGZpbGxfdmFsKTsKKwlpbnQgKCp3cml0ZV9za2lwX2NodW5rKShzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgaW50NjRfdCBsZW4pOworCWludCAoKndyaXRlX2VuZF9jaHVuaykoc3RydWN0IG91dHB1dF9maWxlICpvdXQpOworfTsKKworc3RydWN0IG91dHB1dF9maWxlIHsKKwlpbnQ2NF90IGN1cl9vdXRfcHRyOworCXVuc2lnbmVkIGludCBjaHVua19jbnQ7CisJdWludDMyX3QgY3JjMzI7CisJc3RydWN0IG91dHB1dF9maWxlX29wcyAqb3BzOworCXN0cnVjdCBzcGFyc2VfZmlsZV9vcHMgKnNwYXJzZV9vcHM7CisJaW50IHVzZV9jcmM7CisJdW5zaWduZWQgaW50IGJsb2NrX3NpemU7CisJaW50NjRfdCBsZW47CisJY2hhciAqemVyb19idWY7CisJdWludDMyX3QgKmZpbGxfYnVmOworCWNoYXIgKmJ1ZjsKK307CisKK3N0cnVjdCBvdXRwdXRfZmlsZV9neiB7CisJc3RydWN0IG91dHB1dF9maWxlIG91dDsKKwlnekZpbGUgZ3pfZmQ7Cit9OworCisjZGVmaW5lIHRvX291dHB1dF9maWxlX2d6KF9vKSBcCisJY29udGFpbmVyX29mKChfbyksIHN0cnVjdCBvdXRwdXRfZmlsZV9neiwgb3V0KQorCitzdHJ1Y3Qgb3V0cHV0X2ZpbGVfbm9ybWFsIHsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGUgb3V0OworCWludCBmZDsKK307CisKKyNkZWZpbmUgdG9fb3V0cHV0X2ZpbGVfbm9ybWFsKF9vKSBcCisJY29udGFpbmVyX29mKChfbyksIHN0cnVjdCBvdXRwdXRfZmlsZV9ub3JtYWwsIG91dCkKKworc3RydWN0IG91dHB1dF9maWxlX2NhbGxiYWNrIHsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGUgb3V0OworCXZvaWQgKnByaXY7CisJaW50ICgqd3JpdGUpKHZvaWQgKnByaXYsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbik7Cit9OworCisjZGVmaW5lIHRvX291dHB1dF9maWxlX2NhbGxiYWNrKF9vKSBcCisJY29udGFpbmVyX29mKChfbyksIHN0cnVjdCBvdXRwdXRfZmlsZV9jYWxsYmFjaywgb3V0KQorCitzdGF0aWMgaW50IGZpbGVfb3BlbihzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgaW50IGZkKQoreworCXN0cnVjdCBvdXRwdXRfZmlsZV9ub3JtYWwgKm91dG4gPSB0b19vdXRwdXRfZmlsZV9ub3JtYWwob3V0KTsKKworCW91dG4tPmZkID0gZmQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsZV9za2lwKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQ2NF90IGNudCkKK3sKKwlvZmY2NF90IHJldDsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfbm9ybWFsICpvdXRuID0gdG9fb3V0cHV0X2ZpbGVfbm9ybWFsKG91dCk7CisKKwlyZXQgPSBsc2VlazY0KG91dG4tPmZkLCBjbnQsIFNFRUtfQ1VSKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnJvcl9lcnJubygibHNlZWs2NCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbGVfcGFkKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQ2NF90IGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBvdXRwdXRfZmlsZV9ub3JtYWwgKm91dG4gPSB0b19vdXRwdXRfZmlsZV9ub3JtYWwob3V0KTsKKyNpZmRlZiBVU0VfTUlOR1cKKwkvKiBtaW5ndy13NjQgZG9lcyBmcmVlIHNwYWNlIGNoZWNrIGJlZm9yZSBlbmxhcmdlIGZpbGUsIHRoYXQgY2hlY2sKKwkgKiBkb2Vzbid0IHdvcmsgb24gd2luZSBvZiBVYnVudHUgMTQuMDQuIEFzIGEgd29yayBhcm91bmQsIHdlIGFsd2F5cworCSAqIG1ha2Ugc3VyZSB0aGUgYWN0dWFsIGZpbGUgc2l6ZSBpcyBsYXJnZXIgdGhhbiBsZW4gc28gbWluZ3cgd2lsbAorCSAqIGJ5cGFzcyB0aGF0IGZyZWUgc3BhY2UgY2hlY2suICovCisJcmV0ID0gbHNlZWs2NChvdXRuLT5mZCwgbGVuLCBTRUVLX1NFVCk7CisJLyogSXQgc2VlbXMgbHNlZWs2NCBkb2Vzbid0IHdvcmsgb24gd2luZG93cywgaW4gdGhpcyBjYXNlLCBqdXN0CisJICogaWdub3JlIHRoZSBlcnJvciAqLworCWlmIChyZXQgPj0gMCkgeworCQljaGFyIGMgPSAnXDAnOworCQlyZXQgPSB3cml0ZShvdXRuLT5mZCwgJmMsIDEpOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyb3JfZXJybm8oIndyaXRlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisjZW5kaWYKKwlyZXQgPSBmdHJ1bmNhdGU2NChvdXRuLT5mZCwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gLWVycm5vOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfbm9ybWFsICpvdXRuID0gdG9fb3V0cHV0X2ZpbGVfbm9ybWFsKG91dCk7CisKKwlyZXQgPSB3cml0ZShvdXRuLT5mZCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnJvcl9lcnJubygid3JpdGUiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAocmV0IDwgbGVuKSB7CisJCWVycm9yKCJpbmNvbXBsZXRlIHdyaXRlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmlsZV9jbG9zZShzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCkKK3sKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfbm9ybWFsICpvdXRuID0gdG9fb3V0cHV0X2ZpbGVfbm9ybWFsKG91dCk7CisKKwlmcmVlKG91dG4pOworfQorCitzdGF0aWMgc3RydWN0IG91dHB1dF9maWxlX29wcyBmaWxlX29wcyA9IHsKKwkub3BlbiA9IGZpbGVfb3BlbiwKKwkuc2tpcCA9IGZpbGVfc2tpcCwKKwkucGFkID0gZmlsZV9wYWQsCisJLndyaXRlID0gZmlsZV93cml0ZSwKKwkuY2xvc2UgPSBmaWxlX2Nsb3NlLAorfTsKKworc3RhdGljIGludCBnel9maWxlX29wZW4oc3RydWN0IG91dHB1dF9maWxlICpvdXQsIGludCBmZCkKK3sKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfZ3ogKm91dGd6ID0gdG9fb3V0cHV0X2ZpbGVfZ3oob3V0KTsKKworCW91dGd6LT5nel9mZCA9IGd6ZG9wZW4oZmQsICJ3YjkiKTsKKwlpZiAoIW91dGd6LT5nel9mZCkgeworCQllcnJvcl9lcnJubygiZ3pvcGVuIik7CisJCXJldHVybiAtZXJybm87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnel9maWxlX3NraXAoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIGludDY0X3QgY250KQoreworCW9mZjY0X3QgcmV0OworCXN0cnVjdCBvdXRwdXRfZmlsZV9neiAqb3V0Z3ogPSB0b19vdXRwdXRfZmlsZV9neihvdXQpOworCisJcmV0ID0gZ3pzZWVrKG91dGd6LT5nel9mZCwgY250LCBTRUVLX0NVUik7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyb3JfZXJybm8oImd6c2VlayIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGd6X2ZpbGVfcGFkKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQ2NF90IGxlbikKK3sKKwlvZmY2NF90IHJldDsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfZ3ogKm91dGd6ID0gdG9fb3V0cHV0X2ZpbGVfZ3oob3V0KTsKKworCXJldCA9IGd6dGVsbChvdXRnei0+Z3pfZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmV0ID49IGxlbikgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBnenNlZWsob3V0Z3otPmd6X2ZkLCBsZW4gLSAxLCBTRUVLX1NFVCk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCWd6d3JpdGUob3V0Z3otPmd6X2ZkLCAiIiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnel9maWxlX3dyaXRlKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWludCByZXQ7CisJc3RydWN0IG91dHB1dF9maWxlX2d6ICpvdXRneiA9IHRvX291dHB1dF9maWxlX2d6KG91dCk7CisKKwlyZXQgPSBnendyaXRlKG91dGd6LT5nel9mZCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnJvcl9lcnJubygiZ3p3cml0ZSIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmIChyZXQgPCBsZW4pIHsKKwkJZXJyb3IoImluY29tcGxldGUgZ3p3cml0ZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGd6X2ZpbGVfY2xvc2Uoc3RydWN0IG91dHB1dF9maWxlICpvdXQpCit7CisJc3RydWN0IG91dHB1dF9maWxlX2d6ICpvdXRneiA9IHRvX291dHB1dF9maWxlX2d6KG91dCk7CisKKwlnemNsb3NlKG91dGd6LT5nel9mZCk7CisJZnJlZShvdXRneik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3V0cHV0X2ZpbGVfb3BzIGd6X2ZpbGVfb3BzID0geworCS5vcGVuID0gZ3pfZmlsZV9vcGVuLAorCS5za2lwID0gZ3pfZmlsZV9za2lwLAorCS5wYWQgPSBnel9maWxlX3BhZCwKKwkud3JpdGUgPSBnel9maWxlX3dyaXRlLAorCS5jbG9zZSA9IGd6X2ZpbGVfY2xvc2UsCit9OworCitzdGF0aWMgaW50IGNhbGxiYWNrX2ZpbGVfb3BlbihzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCBfX3VudXNlZCwgaW50IGZkIF9fdW51c2VkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbGxiYWNrX2ZpbGVfc2tpcChzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgaW50NjRfdCBvZmYpCit7CisJc3RydWN0IG91dHB1dF9maWxlX2NhbGxiYWNrICpvdXRjID0gdG9fb3V0cHV0X2ZpbGVfY2FsbGJhY2sob3V0KTsKKwlpbnQgdG9fd3JpdGU7CisJaW50IHJldDsKKworCXdoaWxlIChvZmYgPiAwKSB7CisJCXRvX3dyaXRlID0gbWluKG9mZiwgKGludDY0X3QpSU5UX01BWCk7CisJCXJldCA9IG91dGMtPndyaXRlKG91dGMtPnByaXYsIE5VTEwsIHRvX3dyaXRlKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJb2ZmIC09IHRvX3dyaXRlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbGxiYWNrX2ZpbGVfcGFkKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0IF9fdW51c2VkLCBpbnQ2NF90IGxlbiBfX3VudXNlZCkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgY2FsbGJhY2tfZmlsZV93cml0ZShzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfY2FsbGJhY2sgKm91dGMgPSB0b19vdXRwdXRfZmlsZV9jYWxsYmFjayhvdXQpOworCisJcmV0dXJuIG91dGMtPndyaXRlKG91dGMtPnByaXYsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGNhbGxiYWNrX2ZpbGVfY2xvc2Uoc3RydWN0IG91dHB1dF9maWxlICpvdXQpCit7CisJc3RydWN0IG91dHB1dF9maWxlX2NhbGxiYWNrICpvdXRjID0gdG9fb3V0cHV0X2ZpbGVfY2FsbGJhY2sob3V0KTsKKworCWZyZWUob3V0Yyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3V0cHV0X2ZpbGVfb3BzIGNhbGxiYWNrX2ZpbGVfb3BzID0geworCS5vcGVuID0gY2FsbGJhY2tfZmlsZV9vcGVuLAorCS5za2lwID0gY2FsbGJhY2tfZmlsZV9za2lwLAorCS5wYWQgPSBjYWxsYmFja19maWxlX3BhZCwKKwkud3JpdGUgPSBjYWxsYmFja19maWxlX3dyaXRlLAorCS5jbG9zZSA9IGNhbGxiYWNrX2ZpbGVfY2xvc2UsCit9OworCitpbnQgcmVhZF9hbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc2l6ZV90IHRvdGFsID0gMDsKKwlpbnQgcmV0OworCWNoYXIgKnB0ciA9IGJ1ZjsKKworCXdoaWxlICh0b3RhbCA8IGxlbikgeworCQlyZXQgPSByZWFkKGZkLCBwdHIsIGxlbiAtIHRvdGFsKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiAtZXJybm87CisKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcHRyICs9IHJldDsKKwkJdG90YWwgKz0gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3NwYXJzZV9za2lwX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQ2NF90IHNraXBfbGVuKQoreworCWNodW5rX2hlYWRlcl90IGNodW5rX2hlYWRlcjsKKwlpbnQgcmV0OworCisJaWYgKHNraXBfbGVuICUgb3V0LT5ibG9ja19zaXplKSB7CisJCWVycm9yKCJkb24ndCBjYXJlIHNpemUgJSJQUklpNjQiIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplICV1IiwKKwkJCQlza2lwX2xlbiwgb3V0LT5ibG9ja19zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFdlIGFyZSBza2lwcGluZyBkYXRhLCBzbyBlbWl0IGEgZG9uJ3QgY2FyZSBjaHVuay4gKi8KKwljaHVua19oZWFkZXIuY2h1bmtfdHlwZSA9IENIVU5LX1RZUEVfRE9OVF9DQVJFOworCWNodW5rX2hlYWRlci5yZXNlcnZlZDEgPSAwOworCWNodW5rX2hlYWRlci5jaHVua19zeiA9IHNraXBfbGVuIC8gb3V0LT5ibG9ja19zaXplOworCWNodW5rX2hlYWRlci50b3RhbF9zeiA9IENIVU5LX0hFQURFUl9MRU47CisJcmV0ID0gb3V0LT5vcHMtPndyaXRlKG91dCwgJmNodW5rX2hlYWRlciwgc2l6ZW9mKGNodW5rX2hlYWRlcikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlvdXQtPmN1cl9vdXRfcHRyICs9IHNraXBfbGVuOworCW91dC0+Y2h1bmtfY250Kys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9zcGFyc2VfZmlsbF9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdW5zaWduZWQgaW50IGxlbiwKKwkJdWludDMyX3QgZmlsbF92YWwpCit7CisJY2h1bmtfaGVhZGVyX3QgY2h1bmtfaGVhZGVyOworCWludCBybmRfdXBfbGVuLCBjb3VudDsKKwlpbnQgcmV0OworCisJLyogUm91bmQgdXAgdGhlIGZpbGwgbGVuZ3RoIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUgKi8KKwlybmRfdXBfbGVuID0gQUxJR04obGVuLCBvdXQtPmJsb2NrX3NpemUpOworCisJLyogRmluYWxseSB3ZSBjYW4gc2FmZWx5IGVtaXQgYSBjaHVuayBvZiBkYXRhICovCisJY2h1bmtfaGVhZGVyLmNodW5rX3R5cGUgPSBDSFVOS19UWVBFX0ZJTEw7CisJY2h1bmtfaGVhZGVyLnJlc2VydmVkMSA9IDA7CisJY2h1bmtfaGVhZGVyLmNodW5rX3N6ID0gcm5kX3VwX2xlbiAvIG91dC0+YmxvY2tfc2l6ZTsKKwljaHVua19oZWFkZXIudG90YWxfc3ogPSBDSFVOS19IRUFERVJfTEVOICsgc2l6ZW9mKGZpbGxfdmFsKTsKKwlyZXQgPSBvdXQtPm9wcy0+d3JpdGUob3V0LCAmY2h1bmtfaGVhZGVyLCBzaXplb2YoY2h1bmtfaGVhZGVyKSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOworCXJldCA9IG91dC0+b3BzLT53cml0ZShvdXQsICZmaWxsX3ZhbCwgc2l6ZW9mKGZpbGxfdmFsKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChvdXQtPnVzZV9jcmMpIHsKKwkJY291bnQgPSBvdXQtPmJsb2NrX3NpemUgLyBzaXplb2YodWludDMyX3QpOworCQl3aGlsZSAoY291bnQtLSkKKwkJCW91dC0+Y3JjMzIgPSBzcGFyc2VfY3JjMzIob3V0LT5jcmMzMiwgJmZpbGxfdmFsLCBzaXplb2YodWludDMyX3QpKTsKKwl9CisKKwlvdXQtPmN1cl9vdXRfcHRyICs9IHJuZF91cF9sZW47CisJb3V0LT5jaHVua19jbnQrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX3NwYXJzZV9kYXRhX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQl2b2lkICpkYXRhKQoreworCWNodW5rX2hlYWRlcl90IGNodW5rX2hlYWRlcjsKKwlpbnQgcm5kX3VwX2xlbiwgemVyb19sZW47CisJaW50IHJldDsKKworCS8qIFJvdW5kIHVwIHRoZSBkYXRhIGxlbmd0aCB0byBhIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplICovCisJcm5kX3VwX2xlbiA9IEFMSUdOKGxlbiwgb3V0LT5ibG9ja19zaXplKTsKKwl6ZXJvX2xlbiA9IHJuZF91cF9sZW4gLSBsZW47CisKKwkvKiBGaW5hbGx5IHdlIGNhbiBzYWZlbHkgZW1pdCBhIGNodW5rIG9mIGRhdGEgKi8KKwljaHVua19oZWFkZXIuY2h1bmtfdHlwZSA9IENIVU5LX1RZUEVfUkFXOworCWNodW5rX2hlYWRlci5yZXNlcnZlZDEgPSAwOworCWNodW5rX2hlYWRlci5jaHVua19zeiA9IHJuZF91cF9sZW4gLyBvdXQtPmJsb2NrX3NpemU7CisJY2h1bmtfaGVhZGVyLnRvdGFsX3N6ID0gQ0hVTktfSEVBREVSX0xFTiArIHJuZF91cF9sZW47CisJcmV0ID0gb3V0LT5vcHMtPndyaXRlKG91dCwgJmNodW5rX2hlYWRlciwgc2l6ZW9mKGNodW5rX2hlYWRlcikpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiAtMTsKKwlyZXQgPSBvdXQtPm9wcy0+d3JpdGUob3V0LCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHplcm9fbGVuKSB7CisJCXJldCA9IG91dC0+b3BzLT53cml0ZShvdXQsIG91dC0+emVyb19idWYsIHplcm9fbGVuKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG91dC0+dXNlX2NyYykgeworCQlvdXQtPmNyYzMyID0gc3BhcnNlX2NyYzMyKG91dC0+Y3JjMzIsIGRhdGEsIGxlbik7CisJCWlmICh6ZXJvX2xlbikKKwkJCW91dC0+Y3JjMzIgPSBzcGFyc2VfY3JjMzIob3V0LT5jcmMzMiwgb3V0LT56ZXJvX2J1ZiwgemVyb19sZW4pOworCX0KKworCW91dC0+Y3VyX291dF9wdHIgKz0gcm5kX3VwX2xlbjsKKwlvdXQtPmNodW5rX2NudCsrOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB3cml0ZV9zcGFyc2VfZW5kX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0KQoreworCWNodW5rX2hlYWRlcl90IGNodW5rX2hlYWRlcjsKKwlpbnQgcmV0OworCisJaWYgKG91dC0+dXNlX2NyYykgeworCQljaHVua19oZWFkZXIuY2h1bmtfdHlwZSA9IENIVU5LX1RZUEVfQ1JDMzI7CisJCWNodW5rX2hlYWRlci5yZXNlcnZlZDEgPSAwOworCQljaHVua19oZWFkZXIuY2h1bmtfc3ogPSAwOworCQljaHVua19oZWFkZXIudG90YWxfc3ogPSBDSFVOS19IRUFERVJfTEVOICsgNDsKKworCQlyZXQgPSBvdXQtPm9wcy0+d3JpdGUob3V0LCAmY2h1bmtfaGVhZGVyLCBzaXplb2YoY2h1bmtfaGVhZGVyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW91dC0+b3BzLT53cml0ZShvdXQsICZvdXQtPmNyYzMyLCA0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlvdXQtPmNodW5rX2NudCsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwYXJzZV9maWxlX29wcyBzcGFyc2VfZmlsZV9vcHMgPSB7CisJCS53cml0ZV9kYXRhX2NodW5rID0gd3JpdGVfc3BhcnNlX2RhdGFfY2h1bmssCisJCS53cml0ZV9maWxsX2NodW5rID0gd3JpdGVfc3BhcnNlX2ZpbGxfY2h1bmssCisJCS53cml0ZV9za2lwX2NodW5rID0gd3JpdGVfc3BhcnNlX3NraXBfY2h1bmssCisJCS53cml0ZV9lbmRfY2h1bmsgPSB3cml0ZV9zcGFyc2VfZW5kX2NodW5rLAorfTsKKworc3RhdGljIGludCB3cml0ZV9ub3JtYWxfZGF0YV9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdW5zaWduZWQgaW50IGxlbiwKKwkJdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBybmRfdXBfbGVuID0gQUxJR04obGVuLCBvdXQtPmJsb2NrX3NpemUpOworCisJcmV0ID0gb3V0LT5vcHMtPndyaXRlKG91dCwgZGF0YSwgbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChybmRfdXBfbGVuID4gbGVuKSB7CisJCXJldCA9IG91dC0+b3BzLT5za2lwKG91dCwgcm5kX3VwX2xlbiAtIGxlbik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3cml0ZV9ub3JtYWxfZmlsbF9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdW5zaWduZWQgaW50IGxlbiwKKwkJdWludDMyX3QgZmlsbF92YWwpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgd3JpdGVfbGVuOworCisJLyogSW5pdGlhbGl6ZSBmaWxsX2J1ZiB3aXRoIHRoZSBmaWxsX3ZhbCAqLworCWZvciAoaSA9IDA7IGkgPCBvdXQtPmJsb2NrX3NpemUgLyBzaXplb2YodWludDMyX3QpOyBpKyspIHsKKwkJb3V0LT5maWxsX2J1ZltpXSA9IGZpbGxfdmFsOworCX0KKworCXdoaWxlIChsZW4pIHsKKwkJd3JpdGVfbGVuID0gbWluKGxlbiwgb3V0LT5ibG9ja19zaXplKTsKKwkJcmV0ID0gb3V0LT5vcHMtPndyaXRlKG91dCwgb3V0LT5maWxsX2J1Ziwgd3JpdGVfbGVuKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlsZW4gLT0gd3JpdGVfbGVuOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX25vcm1hbF9za2lwX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQ2NF90IGxlbikKK3sKKwlyZXR1cm4gb3V0LT5vcHMtPnNraXAob3V0LCBsZW4pOworfQorCitpbnQgd3JpdGVfbm9ybWFsX2VuZF9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCkKK3sKKwlyZXR1cm4gb3V0LT5vcHMtPnBhZChvdXQsIG91dC0+bGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBzcGFyc2VfZmlsZV9vcHMgbm9ybWFsX2ZpbGVfb3BzID0geworCQkud3JpdGVfZGF0YV9jaHVuayA9IHdyaXRlX25vcm1hbF9kYXRhX2NodW5rLAorCQkud3JpdGVfZmlsbF9jaHVuayA9IHdyaXRlX25vcm1hbF9maWxsX2NodW5rLAorCQkud3JpdGVfc2tpcF9jaHVuayA9IHdyaXRlX25vcm1hbF9za2lwX2NodW5rLAorCQkud3JpdGVfZW5kX2NodW5rID0gd3JpdGVfbm9ybWFsX2VuZF9jaHVuaywKK307CisKK3ZvaWQgb3V0cHV0X2ZpbGVfY2xvc2Uoc3RydWN0IG91dHB1dF9maWxlICpvdXQpCit7CisJb3V0LT5zcGFyc2Vfb3BzLT53cml0ZV9lbmRfY2h1bmsob3V0KTsKKwlvdXQtPm9wcy0+Y2xvc2Uob3V0KTsKK30KKworc3RhdGljIGludCBvdXRwdXRfZmlsZV9pbml0KHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCBpbnQgYmxvY2tfc2l6ZSwKKwkJaW50NjRfdCBsZW4sIGJvb2wgc3BhcnNlLCBpbnQgY2h1bmtzLCBib29sIGNyYykKK3sKKwlpbnQgcmV0OworCisJb3V0LT5sZW4gPSBsZW47CisJb3V0LT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKwlvdXQtPmN1cl9vdXRfcHRyID0gMGxsOworCW91dC0+Y2h1bmtfY250ID0gMDsKKwlvdXQtPmNyYzMyID0gMDsKKwlvdXQtPnVzZV9jcmMgPSBjcmM7CisKKwlvdXQtPnplcm9fYnVmID0gY2FsbG9jKGJsb2NrX3NpemUsIDEpOworCWlmICghb3V0LT56ZXJvX2J1ZikgeworCQllcnJvcl9lcnJubygibWFsbG9jIHplcm9fYnVmIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW91dC0+ZmlsbF9idWYgPSBjYWxsb2MoYmxvY2tfc2l6ZSwgMSk7CisJaWYgKCFvdXQtPmZpbGxfYnVmKSB7CisJCWVycm9yX2Vycm5vKCJtYWxsb2MgZmlsbF9idWYiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZmlsbF9idWY7CisJfQorCisJaWYgKHNwYXJzZSkgeworCQlvdXQtPnNwYXJzZV9vcHMgPSAmc3BhcnNlX2ZpbGVfb3BzOworCX0gZWxzZSB7CisJCW91dC0+c3BhcnNlX29wcyA9ICZub3JtYWxfZmlsZV9vcHM7CisJfQorCisJaWYgKHNwYXJzZSkgeworCQlzcGFyc2VfaGVhZGVyX3Qgc3BhcnNlX2hlYWRlciA9IHsKKwkJCQkubWFnaWMgPSBTUEFSU0VfSEVBREVSX01BR0lDLAorCQkJCS5tYWpvcl92ZXJzaW9uID0gU1BBUlNFX0hFQURFUl9NQUpPUl9WRVIsCisJCQkJLm1pbm9yX3ZlcnNpb24gPSBTUEFSU0VfSEVBREVSX01JTk9SX1ZFUiwKKwkJCQkuZmlsZV9oZHJfc3ogPSBTUEFSU0VfSEVBREVSX0xFTiwKKwkJCQkuY2h1bmtfaGRyX3N6ID0gQ0hVTktfSEVBREVSX0xFTiwKKwkJCQkuYmxrX3N6ID0gb3V0LT5ibG9ja19zaXplLAorCQkJCS50b3RhbF9ibGtzID0gb3V0LT5sZW4gLyBvdXQtPmJsb2NrX3NpemUsCisJCQkJLnRvdGFsX2NodW5rcyA9IGNodW5rcywKKwkJCQkuaW1hZ2VfY2hlY2tzdW0gPSAwCisJCX07CisKKwkJaWYgKG91dC0+dXNlX2NyYykgeworCQkJc3BhcnNlX2hlYWRlci50b3RhbF9jaHVua3MrKzsKKwkJfQorCisJCXJldCA9IG91dC0+b3BzLT53cml0ZShvdXQsICZzcGFyc2VfaGVhZGVyLCBzaXplb2Yoc3BhcnNlX2hlYWRlcikpOworCQlpZiAocmV0IDwgMCkgeworCQkJZ290byBlcnJfd3JpdGU7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3dyaXRlOgorCWZyZWUob3V0LT5maWxsX2J1Zik7CitlcnJfZmlsbF9idWY6CisJZnJlZShvdXQtPnplcm9fYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXRfZmlsZV9uZXdfZ3oodm9pZCkKK3sKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfZ3ogKm91dGd6ID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb3V0cHV0X2ZpbGVfZ3opKTsKKwlpZiAoIW91dGd6KSB7CisJCWVycm9yX2Vycm5vKCJtYWxsb2Mgc3RydWN0IG91dGd6Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCW91dGd6LT5vdXQub3BzID0gJmd6X2ZpbGVfb3BzOworCisJcmV0dXJuICZvdXRnei0+b3V0OworfQorCitzdGF0aWMgc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXRfZmlsZV9uZXdfbm9ybWFsKHZvaWQpCit7CisJc3RydWN0IG91dHB1dF9maWxlX25vcm1hbCAqb3V0biA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG91dHB1dF9maWxlX25vcm1hbCkpOworCWlmICghb3V0bikgeworCQllcnJvcl9lcnJubygibWFsbG9jIHN0cnVjdCBvdXRuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW91dG4tPm91dC5vcHMgPSAmZmlsZV9vcHM7CisKKwlyZXR1cm4gJm91dG4tPm91dDsKK30KKworc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXRfZmlsZV9vcGVuX2NhbGxiYWNrKGludCAoKndyaXRlKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgaW50KSwKKwkJdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGludDY0X3QgbGVuLAorCQlpbnQgZ3ogX191bnVzZWQsIGludCBzcGFyc2UsIGludCBjaHVua3MsIGludCBjcmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgb3V0cHV0X2ZpbGVfY2FsbGJhY2sgKm91dGM7CisKKwlvdXRjID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgb3V0cHV0X2ZpbGVfY2FsbGJhY2spKTsKKwlpZiAoIW91dGMpIHsKKwkJZXJyb3JfZXJybm8oIm1hbGxvYyBzdHJ1Y3Qgb3V0YyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvdXRjLT5vdXQub3BzID0gJmNhbGxiYWNrX2ZpbGVfb3BzOworCW91dGMtPnByaXYgPSBwcml2OworCW91dGMtPndyaXRlID0gd3JpdGU7CisKKwlyZXQgPSBvdXRwdXRfZmlsZV9pbml0KCZvdXRjLT5vdXQsIGJsb2NrX3NpemUsIGxlbiwgc3BhcnNlLCBjaHVua3MsIGNyYyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnJlZShvdXRjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuICZvdXRjLT5vdXQ7Cit9CisKK3N0cnVjdCBvdXRwdXRfZmlsZSAqb3V0cHV0X2ZpbGVfb3Blbl9mZChpbnQgZmQsIHVuc2lnbmVkIGludCBibG9ja19zaXplLCBpbnQ2NF90IGxlbiwKKwkJaW50IGd6LCBpbnQgc3BhcnNlLCBpbnQgY2h1bmtzLCBpbnQgY3JjKQoreworCWludCByZXQ7CisJc3RydWN0IG91dHB1dF9maWxlICpvdXQ7CisKKwlpZiAoZ3opIHsKKwkJb3V0ID0gb3V0cHV0X2ZpbGVfbmV3X2d6KCk7CisJfSBlbHNlIHsKKwkJb3V0ID0gb3V0cHV0X2ZpbGVfbmV3X25vcm1hbCgpOworCX0KKwlpZiAoIW91dCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvdXQtPm9wcy0+b3BlbihvdXQsIGZkKTsKKworCXJldCA9IG91dHB1dF9maWxlX2luaXQob3V0LCBibG9ja19zaXplLCBsZW4sIHNwYXJzZSwgY2h1bmtzLCBjcmMpOworCWlmIChyZXQgPCAwKSB7CisJCWZyZWUob3V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIG91dDsKK30KKworLyogV3JpdGUgYSBjb250aWd1b3VzIHJlZ2lvbiBvZiBkYXRhIGJsb2NrcyBmcm9tIGEgbWVtb3J5IGJ1ZmZlciAqLworaW50IHdyaXRlX2RhdGFfY2h1bmsoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHVuc2lnbmVkIGludCBsZW4sIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIG91dC0+c3BhcnNlX29wcy0+d3JpdGVfZGF0YV9jaHVuayhvdXQsIGxlbiwgZGF0YSk7Cit9CisKKy8qIFdyaXRlIGEgY29udGlndW91cyByZWdpb24gb2YgZGF0YSBibG9ja3Mgd2l0aCBhIGZpbGwgdmFsdWUgKi8KK2ludCB3cml0ZV9maWxsX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQl1aW50MzJfdCBmaWxsX3ZhbCkKK3sKKwlyZXR1cm4gb3V0LT5zcGFyc2Vfb3BzLT53cml0ZV9maWxsX2NodW5rKG91dCwgbGVuLCBmaWxsX3ZhbCk7Cit9CisKK2ludCB3cml0ZV9mZF9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgdW5zaWduZWQgaW50IGxlbiwKKwkJaW50IGZkLCBpbnQ2NF90IG9mZnNldCkKK3sKKwlpbnQgcmV0OworCWludDY0X3QgYWxpZ25lZF9vZmZzZXQ7CisJaW50IGFsaWduZWRfZGlmZjsKKwlpbnQgYnVmZmVyX3NpemU7CisJY2hhciAqcHRyOworCisJYWxpZ25lZF9vZmZzZXQgPSBvZmZzZXQgJiB+KDQwOTYgLSAxKTsKKwlhbGlnbmVkX2RpZmYgPSBvZmZzZXQgLSBhbGlnbmVkX29mZnNldDsKKwlidWZmZXJfc2l6ZSA9IGxlbiArIGFsaWduZWRfZGlmZjsKKworI2lmbmRlZiBVU0VfTUlOR1cKKwljaGFyICpkYXRhID0gbW1hcDY0KE5VTEwsIGJ1ZmZlcl9zaXplLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLAorCQkJYWxpZ25lZF9vZmZzZXQpOworCWlmIChkYXRhID09IE1BUF9GQUlMRUQpIHsKKwkJcmV0dXJuIC1lcnJubzsKKwl9CisJcHRyID0gZGF0YSArIGFsaWduZWRfZGlmZjsKKyNlbHNlCisJb2ZmNjRfdCBwb3M7CisJY2hhciAqZGF0YSA9IG1hbGxvYyhsZW4pOworCWlmICghZGF0YSkgeworCQlyZXR1cm4gLWVycm5vOworCX0KKwlwb3MgPSBsc2VlazY0KGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKKwlpZiAocG9zIDwgMCkgeworICAgICAgICAgICAgICAgIGZyZWUoZGF0YSk7CisJCXJldHVybiAtZXJybm87CisJfQorCXJldCA9IHJlYWRfYWxsKGZkLCBkYXRhLCBsZW4pOworCWlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnJlZShkYXRhKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHRyID0gZGF0YTsKKyNlbmRpZgorCisJcmV0ID0gb3V0LT5zcGFyc2Vfb3BzLT53cml0ZV9kYXRhX2NodW5rKG91dCwgbGVuLCBwdHIpOworCisjaWZuZGVmIFVTRV9NSU5HVworCW11bm1hcChkYXRhLCBidWZmZXJfc2l6ZSk7CisjZWxzZQorCWZyZWUoZGF0YSk7CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFdyaXRlIGEgY29udGlndW91cyByZWdpb24gb2YgZGF0YSBibG9ja3MgZnJvbSBhIGZpbGUgKi8KK2ludCB3cml0ZV9maWxlX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQljb25zdCBjaGFyICpmaWxlLCBpbnQ2NF90IG9mZnNldCkKK3sKKwlpbnQgcmV0OworCisJaW50IGZpbGVfZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZIHwgT19CSU5BUlkpOworCWlmIChmaWxlX2ZkIDwgMCkgeworCQlyZXR1cm4gLWVycm5vOworCX0KKworCXJldCA9IHdyaXRlX2ZkX2NodW5rKG91dCwgbGVuLCBmaWxlX2ZkLCBvZmZzZXQpOworCisJY2xvc2UoZmlsZV9mZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgd3JpdGVfc2tpcF9jaHVuayhzdHJ1Y3Qgb3V0cHV0X2ZpbGUgKm91dCwgaW50NjRfdCBsZW4pCit7CisJcmV0dXJuIG91dC0+c3BhcnNlX29wcy0+d3JpdGVfc2tpcF9jaHVuayhvdXQsIGxlbik7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvb3V0cHV0X2ZpbGUuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9vdXRwdXRfZmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGMxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvb3V0cHV0X2ZpbGUuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfT1VUUFVUX0ZJTEVfSF8KKyNkZWZpbmUgX09VVFBVVF9GSUxFX0hfCisKKyNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CisKK3N0cnVjdCBvdXRwdXRfZmlsZTsKKworc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXRfZmlsZV9vcGVuX2ZkKGludCBmZCwgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGludDY0X3QgbGVuLAorCQlpbnQgZ3osIGludCBzcGFyc2UsIGludCBjaHVua3MsIGludCBjcmMpOworc3RydWN0IG91dHB1dF9maWxlICpvdXRwdXRfZmlsZV9vcGVuX2NhbGxiYWNrKGludCAoKndyaXRlKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgaW50KSwKKwkJdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIGludDY0X3QgbGVuLCBpbnQgZ3osIGludCBzcGFyc2UsCisJCWludCBjaHVua3MsIGludCBjcmMpOworaW50IHdyaXRlX2RhdGFfY2h1bmsoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHVuc2lnbmVkIGludCBsZW4sIHZvaWQgKmRhdGEpOworaW50IHdyaXRlX2ZpbGxfY2h1bmsoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHVuc2lnbmVkIGludCBsZW4sCisJCXVpbnQzMl90IGZpbGxfdmFsKTsKK2ludCB3cml0ZV9maWxlX2NodW5rKHN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQljb25zdCBjaGFyICpmaWxlLCBpbnQ2NF90IG9mZnNldCk7CitpbnQgd3JpdGVfZmRfY2h1bmsoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIHVuc2lnbmVkIGludCBsZW4sCisJCWludCBmZCwgaW50NjRfdCBvZmZzZXQpOworaW50IHdyaXRlX3NraXBfY2h1bmsoc3RydWN0IG91dHB1dF9maWxlICpvdXQsIGludDY0X3QgbGVuKTsKK3ZvaWQgb3V0cHV0X2ZpbGVfY2xvc2Uoc3RydWN0IG91dHB1dF9maWxlICpvdXQpOworCitpbnQgcmVhZF9hbGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zaW1nMmltZy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NpbWcyaW1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlOWI1YgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zaW1nMmltZy5jCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIE9fQklOQVJZCisjZGVmaW5lIE9fQklOQVJZIDAKKyNlbmRpZgorCit2b2lkIHVzYWdlKCkKK3sKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogc2ltZzJpbWcgPHNwYXJzZV9pbWFnZV9maWxlcz4gPHJhd19pbWFnZV9maWxlPlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGluOworCWludCBvdXQ7CisJaW50IGk7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnM7CisKKwlpZiAoYXJnYyA8IDMpIHsKKwkJdXNhZ2UoKTsKKwkJZXhpdCgtMSk7CisJfQorCisJb3V0ID0gb3Blbihhcmd2W2FyZ2MgLSAxXSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY0KTsKKwlpZiAob3V0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBhcmd2W2FyZ2MgLSAxXSk7CisJCWV4aXQoLTEpOworCX0KKworCWZvciAoaSA9IDE7IGkgPCBhcmdjIC0gMTsgaSsrKSB7CisJCWlmIChzdHJjbXAoYXJndltpXSwgIi0iKSA9PSAwKSB7CisJCQlpbiA9IFNURElOX0ZJTEVOTzsKKwkJfSBlbHNlIHsKKwkJCWluID0gb3Blbihhcmd2W2ldLCBPX1JET05MWSB8IE9fQklOQVJZKTsKKwkJCWlmIChpbiA8IDApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGFyZ3ZbaV0pOworCQkJCWV4aXQoLTEpOworCQkJfQorCQl9CisKKwkJcyA9IHNwYXJzZV9maWxlX2ltcG9ydChpbiwgdHJ1ZSwgZmFsc2UpOworCQlpZiAoIXMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlYWQgc3BhcnNlIGZpbGVcbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKworCQlsc2VlayhvdXQsIFNFRUtfU0VULCAwKTsKKworCQlyZXQgPSBzcGFyc2VfZmlsZV93cml0ZShzLCBvdXQsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgd3JpdGUgb3V0cHV0IGZpbGVcbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwkJc3BhcnNlX2ZpbGVfZGVzdHJveShzKTsKKwkJY2xvc2UoaW4pOworCX0KKworCWNsb3NlKG91dCk7CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc2ltZzJzaW1nLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc2ltZzJzaW1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5Y2NmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zaW1nMnNpbWcuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNkZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSAxCisjZGVmaW5lIF9HTlVfU09VUkNFCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisKK3ZvaWQgdXNhZ2UoKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBzaW1nMnNpbWcgPHNwYXJzZSBpbWFnZSBmaWxlPiA8c3BhcnNlX2ltYWdlX2ZpbGU+IDxtYXhfc2l6ZT5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBpbjsKKwlpbnQgb3V0OworCWludCBpOworCWludCByZXQ7CisJc3RydWN0IHNwYXJzZV9maWxlICpzOworCWludDY0X3QgbWF4X3NpemU7CisJc3RydWN0IHNwYXJzZV9maWxlICoqb3V0X3M7CisJaW50IGZpbGVzOworCWNoYXIgZmlsZW5hbWVbNDA5Nl07CisKKwlpZiAoYXJnYyAhPSA0KSB7CisJCXVzYWdlKCk7CisJCWV4aXQoLTEpOworCX0KKworCW1heF9zaXplID0gYXRvbGwoYXJndlszXSk7CisKKwlpbiA9IG9wZW4oYXJndlsxXSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7CisJaWYgKGluIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KC0xKTsKKwl9CisKKwlzID0gc3BhcnNlX2ZpbGVfaW1wb3J0KGluLCB0cnVlLCBmYWxzZSk7CisJaWYgKCFzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGltcG9ydCBzcGFyc2UgZmlsZVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWZpbGVzID0gc3BhcnNlX2ZpbGVfcmVzcGFyc2UocywgbWF4X3NpemUsIE5VTEwsIDApOworCWlmIChmaWxlcyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVzcGFyc2VcbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlvdXRfcyA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IHNwYXJzZV9maWxlICopLCBmaWxlcyk7CisJaWYgKCFvdXRfcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFyc2UgZmlsZSBhcnJheVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWZpbGVzID0gc3BhcnNlX2ZpbGVfcmVzcGFyc2UocywgbWF4X3NpemUsIG91dF9zLCBmaWxlcyk7CisJaWYgKGZpbGVzIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZXNwYXJzZVxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmaWxlczsgaSsrKSB7CisJCXJldCA9IHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMuJWQiLCBhcmd2WzJdLCBpKTsKKwkJaWYgKHJldCA+PSAoaW50KXNpemVvZihmaWxlbmFtZSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmlsZW5hbWUgdG9vIGxvbmdcbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKworCQlvdXQgPSBvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjQpOworCQlpZiAob3V0IDwgMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgYXJndlsyXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCisJCXJldCA9IHNwYXJzZV9maWxlX3dyaXRlKG91dF9zW2ldLCBvdXQsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisJCWlmIChyZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIHNwYXJzZSBmaWxlXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCWNsb3NlKG91dCk7CisJfQorCisJY2xvc2UoaW4pOworCisJZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zaW1nX2R1bXAucHkgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc2ltZ19kdW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlY2UzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc2ltZ19kdW1wLnB5CkBAIC0wLDAgKzEsMTY5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBnZXRvcHQsIHBvc2l4cGF0aCwgc2lnbmFsLCBzdHJ1Y3QsIHN5cworCitkZWYgdXNhZ2UoYXJndjApOgorICBwcmludCgiIiIKK1VzYWdlOiAlcyBbLXZdIHNwYXJzZV9pbWFnZV9maWxlIC4uLgorIC12ICAgICAgICAgICAgIHZlcmJvc2Ugb3V0cHV0CisiIiIgJSAoIGFyZ3YwICkpCisgIHN5cy5leGl0KDIpCisKK2RlZiBtYWluKCk6CisKKyAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHUElQRSwgc2lnbmFsLlNJR19ERkwpCisKKyAgbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisKKyAgIyBQYXJzZSB0aGUgY29tbWFuZCBsaW5lCisgIHZlcmJvc2UgPSAwCQkJIyAtdgorICB0cnk6CisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbInZlcmJvc2UiXSkKKyAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciwgZToKKyAgICBwcmludChlKQorICAgIHVzYWdlKG1lKQorICBmb3IgbywgYSBpbiBvcHRzOgorICAgIGlmIG8gaW4gKCItdiIsICItLXZlcmJvc2UiKToKKyAgICAgIHZlcmJvc2UgKz0gMQorICAgIGVsc2U6CisgICAgICBwcmludCgiVW5yZWNvZ25pemVkIG9wdGlvbiBcIiVzXCIiICUgKG8pKQorICAgICAgdXNhZ2UobWUpCisKKyAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgcHJpbnQoIk5vIHNwYXJzZV9pbWFnZV9maWxlIHNwZWNpZmllZCIpCisgICAgdXNhZ2UobWUpCisKKyAgZm9yIHBhdGggaW4gYXJnczoKKyAgICBGSCA9IG9wZW4ocGF0aCwgJ3JiJykKKyAgICBoZWFkZXJfYmluID0gRkgucmVhZCgyOCkKKyAgICBoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKCI8STRINEkiLCBoZWFkZXJfYmluKQorCisgICAgbWFnaWMgPSBoZWFkZXJbMF0KKyAgICBtYWpvcl92ZXJzaW9uID0gaGVhZGVyWzFdCisgICAgbWlub3JfdmVyc2lvbiA9IGhlYWRlclsyXQorICAgIGZpbGVfaGRyX3N6ID0gaGVhZGVyWzNdCisgICAgY2h1bmtfaGRyX3N6ID0gaGVhZGVyWzRdCisgICAgYmxrX3N6ID0gaGVhZGVyWzVdCisgICAgdG90YWxfYmxrcyA9IGhlYWRlcls2XQorICAgIHRvdGFsX2NodW5rcyA9IGhlYWRlcls3XQorICAgIGltYWdlX2NoZWNrc3VtID0gaGVhZGVyWzhdCisKKyAgICBpZiBtYWdpYyAhPSAweEVEMjZGRjNBOgorICAgICAgcHJpbnQoIiVzOiAlczogTWFnaWMgc2hvdWxkIGJlIDB4RUQyNkZGM0EgYnV0IGlzIDB4JTA4WCIKKyAgICAgICAgICAgICUgKG1lLCBwYXRoLCBtYWdpYykpCisgICAgICBjb250aW51ZQorICAgIGlmIG1ham9yX3ZlcnNpb24gIT0gMSBvciBtaW5vcl92ZXJzaW9uICE9IDA6CisgICAgICBwcmludCgiJXM6ICVzOiBJIG9ubHkga25vdyBhYm91dCB2ZXJzaW9uIDEuMCwgYnV0IHRoaXMgaXMgdmVyc2lvbiAldS4ldSIKKyAgICAgICAgICAgICUgKG1lLCBwYXRoLCBtYWpvcl92ZXJzaW9uLCBtaW5vcl92ZXJzaW9uKSkKKyAgICAgIGNvbnRpbnVlCisgICAgaWYgZmlsZV9oZHJfc3ogIT0gMjg6CisgICAgICBwcmludCgiJXM6ICVzOiBUaGUgZmlsZSBoZWFkZXIgc2l6ZSB3YXMgZXhwZWN0ZWQgdG8gYmUgMjgsIGJ1dCBpcyAldS4iCisgICAgICAgICAgICAlIChtZSwgcGF0aCwgZmlsZV9oZHJfc3opKQorICAgICAgY29udGludWUKKyAgICBpZiBjaHVua19oZHJfc3ogIT0gMTI6CisgICAgICBwcmludCgiJXM6ICVzOiBUaGUgY2h1bmsgaGVhZGVyIHNpemUgd2FzIGV4cGVjdGVkIHRvIGJlIDEyLCBidXQgaXMgJXUuIgorICAgICAgICAgICAgJSAobWUsIHBhdGgsIGNodW5rX2hkcl9zeikpCisgICAgICBjb250aW51ZQorCisgICAgcHJpbnQoIiVzOiBUb3RhbCBvZiAldSAldS1ieXRlIG91dHB1dCBibG9ja3MgaW4gJXUgaW5wdXQgY2h1bmtzLiIKKyAgICAgICAgICAlIChwYXRoLCB0b3RhbF9ibGtzLCBibGtfc3osIHRvdGFsX2NodW5rcykpCisKKyAgICBpZiBpbWFnZV9jaGVja3N1bSAhPSAwOgorICAgICAgcHJpbnQoImNoZWNrc3VtPTB4JTA4WCIgJSAoaW1hZ2VfY2hlY2tzdW0pKQorCisgICAgaWYgbm90IHZlcmJvc2U6CisgICAgICBjb250aW51ZQorICAgIHByaW50KCIgICAgICAgICAgICBpbnB1dF9ieXRlcyAgICAgIG91dHB1dF9ibG9ja3MiKQorICAgIHByaW50KCJjaHVuayAgICBvZmZzZXQgICAgIG51bWJlciAgb2Zmc2V0ICBudW1iZXIiKQorICAgIG9mZnNldCA9IDAKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMSx0b3RhbF9jaHVua3MrMSk6CisgICAgICBoZWFkZXJfYmluID0gRkgucmVhZCgxMikKKyAgICAgIGhlYWRlciA9IHN0cnVjdC51bnBhY2soIjwySDJJIiwgaGVhZGVyX2JpbikKKyAgICAgIGNodW5rX3R5cGUgPSBoZWFkZXJbMF0KKyAgICAgIHJlc2VydmVkMSA9IGhlYWRlclsxXQorICAgICAgY2h1bmtfc3ogPSBoZWFkZXJbMl0KKyAgICAgIHRvdGFsX3N6ID0gaGVhZGVyWzNdCisgICAgICBkYXRhX3N6ID0gdG90YWxfc3ogLSAxMgorCisgICAgICBwcmludCgiJTR1ICUxMHUgJTEwdSAlN3UgJTd1IiAlIChpLCBGSC50ZWxsKCksIGRhdGFfc3osIG9mZnNldCwgY2h1bmtfc3opLAorICAgICAgICAgICAgZW5kPSIgIikKKworICAgICAgaWYgY2h1bmtfdHlwZSA9PSAweENBQzE6CisgICAgICAgIGlmIGRhdGFfc3ogIT0gKGNodW5rX3N6ICogYmxrX3N6KToKKyAgICAgICAgICBwcmludCgiUmF3IGNodW5rIGlucHV0IHNpemUgKCV1KSBkb2VzIG5vdCBtYXRjaCBvdXRwdXQgc2l6ZSAoJXUpIgorICAgICAgICAgICAgICAgICUgKGRhdGFfc3osIGNodW5rX3N6ICogYmxrX3N6KSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBwcmludCgiUmF3IGRhdGEiLCBlbmQ9IiIpCisgICAgICAgICAgRkgucmVhZChkYXRhX3N6KQorICAgICAgZWxpZiBjaHVua190eXBlID09IDB4Q0FDMjoKKyAgICAgICAgaWYgZGF0YV9zeiAhPSA0OgorICAgICAgICAgIHByaW50KCJGaWxsIGNodW5rIHNob3VsZCBoYXZlIDQgYnl0ZXMgb2YgZmlsbCwgYnV0IHRoaXMgaGFzICV1IgorICAgICAgICAgICAgICAgICUgKGRhdGFfc3opLCBlbmQ9IiIpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2U6CisgICAgICAgICAgZmlsbF9iaW4gPSBGSC5yZWFkKDQpCisgICAgICAgICAgZmlsbCA9IHN0cnVjdC51bnBhY2soIjxJIiwgZmlsbF9iaW4pCisgICAgICAgICAgcHJpbnQoIkZpbGwgd2l0aCAweCUwOFgiICUgKGZpbGwpKQorICAgICAgZWxpZiBjaHVua190eXBlID09IDB4Q0FDMzoKKyAgICAgICAgaWYgZGF0YV9zeiAhPSAwOgorICAgICAgICAgIHByaW50KCJEb24ndCBjYXJlIGNodW5rIGlucHV0IHNpemUgaXMgbm9uLXplcm8gKCV1KSIgJSAoZGF0YV9zeikpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2U6CisgICAgICAgICAgcHJpbnQoIkRvbid0IGNhcmUiLCBlbmQ9IiIpCisgICAgICBlbGlmIGNodW5rX3R5cGUgPT0gMHhDQUM0OgorICAgICAgICBpZiBkYXRhX3N6ICE9IDQ6CisgICAgICAgICAgcHJpbnQoIkNSQzMyIGNodW5rIHNob3VsZCBoYXZlIDQgYnl0ZXMgb2YgQ1JDLCBidXQgdGhpcyBoYXMgJXUiCisgICAgICAgICAgICAgICAgJSAoZGF0YV9zeiksIGVuZD0iIikKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBjcmNfYmluID0gRkgucmVhZCg0KQorICAgICAgICAgIGNyYyA9IHN0cnVjdC51bnBhY2soIjxJIiwgY3JjKQorICAgICAgICAgIHByaW50KCJVbnZlcmlmaWVkIENSQzMyIDB4JTA4WCIgJSAoY3JjKSkKKyAgICAgIGVsc2U6CisgICAgICAgICAgcHJpbnQoIlVua25vd24gY2h1bmsgdHlwZSAweCUwNFgiICUgKGNodW5rX3R5cGUpLCBlbmQ9IiIpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmIHZlcmJvc2UgPiAxOgorICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKCI8MTJCIiwgaGVhZGVyX2JpbikKKyAgICAgICAgcHJpbnQoIiAoJTAyWCUwMlggJTAyWCUwMlggJTAyWCUwMlglMDJYJTAyWCAlMDJYJTAyWCUwMlglMDJYKSIKKyAgICAgICAgICAgICAgJSAoaGVhZGVyWzBdLCBoZWFkZXJbMV0sIGhlYWRlclsyXSwgaGVhZGVyWzNdLAorICAgICAgICAgICAgICAgICBoZWFkZXJbNF0sIGhlYWRlcls1XSwgaGVhZGVyWzZdLCBoZWFkZXJbN10sCisgICAgICAgICAgICAgICAgIGhlYWRlcls4XSwgaGVhZGVyWzldLCBoZWFkZXJbMTBdLCBoZWFkZXJbMTFdKSkKKyAgICAgIGVsc2U6CisgICAgICAgIHByaW50KCkKKworICAgICAgb2Zmc2V0ICs9IGNodW5rX3N6CisKKyAgICBwcmludCgiICAgICAlMTB1ICAgICAgICAgICAgJTd1ICAgICAgICAgRW5kIiAlIChGSC50ZWxsKCksIG9mZnNldCkpCisKKyAgICBpZiB0b3RhbF9ibGtzICE9IG9mZnNldDoKKyAgICAgIHByaW50KCJUaGUgaGVhZGVyIHNhaWQgd2Ugc2hvdWxkIGhhdmUgJXUgb3V0cHV0IGJsb2NrcywgYnV0IHdlIHNhdyAldSIKKyAgICAgICAgICAgICUgKHRvdGFsX2Jsa3MsIG9mZnNldCkpCisKKyAgICBqdW5rX2xlbiA9IGxlbihGSC5yZWFkKCkpCisgICAgaWYganVua19sZW46CisgICAgICBwcmludCgiVGhlcmUgd2VyZSAldSBieXRlcyBvZiBleHRyYSBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIgorICAgICAgICAgICAgJSAoanVua19sZW4pKQorCisgIHN5cy5leGl0KDApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYTMwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxzcGFyc2Uvc3BhcnNlLmg+CisKKyNpbmNsdWRlICJkZWZzLmgiCisjaW5jbHVkZSAic3BhcnNlX2ZpbGUuaCIKKworI2luY2x1ZGUgIm91dHB1dF9maWxlLmgiCisjaW5jbHVkZSAiYmFja2VkX2Jsb2NrLmgiCisjaW5jbHVkZSAic3BhcnNlX2RlZnMuaCIKKyNpbmNsdWRlICJzcGFyc2VfZm9ybWF0LmgiCisKK3N0cnVjdCBzcGFyc2VfZmlsZSAqc3BhcnNlX2ZpbGVfbmV3KHVuc2lnbmVkIGludCBibG9ja19zaXplLCBpbnQ2NF90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMgPSBjYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGFyc2VfZmlsZSksIDEpOworCWlmICghcykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzLT5iYWNrZWRfYmxvY2tfbGlzdCA9IGJhY2tlZF9ibG9ja19saXN0X25ldyhibG9ja19zaXplKTsKKwlpZiAoIXMtPmJhY2tlZF9ibG9ja19saXN0KSB7CisJCWZyZWUocyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXMtPmJsb2NrX3NpemUgPSBibG9ja19zaXplOworCXMtPmxlbiA9IGxlbjsKKworCXJldHVybiBzOworfQorCit2b2lkIHNwYXJzZV9maWxlX2Rlc3Ryb3koc3RydWN0IHNwYXJzZV9maWxlICpzKQoreworCWJhY2tlZF9ibG9ja19saXN0X2Rlc3Ryb3kocy0+YmFja2VkX2Jsb2NrX2xpc3QpOworCWZyZWUocyk7Cit9CisKK2ludCBzcGFyc2VfZmlsZV9hZGRfZGF0YShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsCisJCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlyZXR1cm4gYmFja2VkX2Jsb2NrX2FkZF9kYXRhKHMtPmJhY2tlZF9ibG9ja19saXN0LCBkYXRhLCBsZW4sIGJsb2NrKTsKK30KKworaW50IHNwYXJzZV9maWxlX2FkZF9maWxsKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywKKwkJdWludDMyX3QgZmlsbF92YWwsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlyZXR1cm4gYmFja2VkX2Jsb2NrX2FkZF9maWxsKHMtPmJhY2tlZF9ibG9ja19saXN0LCBmaWxsX3ZhbCwgbGVuLCBibG9jayk7Cit9CisKK2ludCBzcGFyc2VfZmlsZV9hZGRfZmlsZShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsCisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQ2NF90IGZpbGVfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQl1bnNpZ25lZCBpbnQgYmxvY2spCit7CisJcmV0dXJuIGJhY2tlZF9ibG9ja19hZGRfZmlsZShzLT5iYWNrZWRfYmxvY2tfbGlzdCwgZmlsZW5hbWUsIGZpbGVfb2Zmc2V0LAorCQkJbGVuLCBibG9jayk7Cit9CisKK2ludCBzcGFyc2VfZmlsZV9hZGRfZmQoc3RydWN0IHNwYXJzZV9maWxlICpzLAorCQlpbnQgZmQsIGludDY0X3QgZmlsZV9vZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlyZXR1cm4gYmFja2VkX2Jsb2NrX2FkZF9mZChzLT5iYWNrZWRfYmxvY2tfbGlzdCwgZmQsIGZpbGVfb2Zmc2V0LAorCQkJbGVuLCBibG9jayk7Cit9Cit1bnNpZ25lZCBpbnQgc3BhcnNlX2NvdW50X2NodW5rcyhzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMpCit7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmI7CisJdW5zaWduZWQgaW50IGxhc3RfYmxvY2sgPSAwOworCXVuc2lnbmVkIGludCBjaHVua3MgPSAwOworCisJZm9yIChiYiA9IGJhY2tlZF9ibG9ja19pdGVyX25ldyhzLT5iYWNrZWRfYmxvY2tfbGlzdCk7IGJiOworCQkJYmIgPSBiYWNrZWRfYmxvY2tfaXRlcl9uZXh0KGJiKSkgeworCQlpZiAoYmFja2VkX2Jsb2NrX2Jsb2NrKGJiKSA+IGxhc3RfYmxvY2spIHsKKwkJCS8qIElmIHRoZXJlIGlzIGEgZ2FwIGJldHdlZW4gY2h1bmtzLCBhZGQgYSBza2lwIGNodW5rICovCisJCQljaHVua3MrKzsKKwkJfQorCQljaHVua3MrKzsKKwkJbGFzdF9ibG9jayA9IGJhY2tlZF9ibG9ja19ibG9jayhiYikgKworCQkJCURJVl9ST1VORF9VUChiYWNrZWRfYmxvY2tfbGVuKGJiKSwgcy0+YmxvY2tfc2l6ZSk7CisJfQorCWlmIChsYXN0X2Jsb2NrIDwgRElWX1JPVU5EX1VQKHMtPmxlbiwgcy0+YmxvY2tfc2l6ZSkpIHsKKwkJY2h1bmtzKys7CisJfQorCisJcmV0dXJuIGNodW5rczsKK30KKworc3RhdGljIHZvaWQgc3BhcnNlX2ZpbGVfd3JpdGVfYmxvY2soc3RydWN0IG91dHB1dF9maWxlICpvdXQsCisJCXN0cnVjdCBiYWNrZWRfYmxvY2sgKmJiKQoreworCXN3aXRjaCAoYmFja2VkX2Jsb2NrX3R5cGUoYmIpKSB7CisJY2FzZSBCQUNLRURfQkxPQ0tfREFUQToKKwkJd3JpdGVfZGF0YV9jaHVuayhvdXQsIGJhY2tlZF9ibG9ja19sZW4oYmIpLCBiYWNrZWRfYmxvY2tfZGF0YShiYikpOworCQlicmVhazsKKwljYXNlIEJBQ0tFRF9CTE9DS19GSUxFOgorCQl3cml0ZV9maWxlX2NodW5rKG91dCwgYmFja2VkX2Jsb2NrX2xlbihiYiksCisJCQkJYmFja2VkX2Jsb2NrX2ZpbGVuYW1lKGJiKSwgYmFja2VkX2Jsb2NrX2ZpbGVfb2Zmc2V0KGJiKSk7CisJCWJyZWFrOworCWNhc2UgQkFDS0VEX0JMT0NLX0ZEOgorCQl3cml0ZV9mZF9jaHVuayhvdXQsIGJhY2tlZF9ibG9ja19sZW4oYmIpLAorCQkJCWJhY2tlZF9ibG9ja19mZChiYiksIGJhY2tlZF9ibG9ja19maWxlX29mZnNldChiYikpOworCQlicmVhazsKKwljYXNlIEJBQ0tFRF9CTE9DS19GSUxMOgorCQl3cml0ZV9maWxsX2NodW5rKG91dCwgYmFja2VkX2Jsb2NrX2xlbihiYiksCisJCQkJYmFja2VkX2Jsb2NrX2ZpbGxfdmFsKGJiKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCB3cml0ZV9hbGxfYmxvY2tzKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgc3RydWN0IG91dHB1dF9maWxlICpvdXQpCit7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmI7CisJdW5zaWduZWQgaW50IGxhc3RfYmxvY2sgPSAwOworCWludDY0X3QgcGFkOworCisJZm9yIChiYiA9IGJhY2tlZF9ibG9ja19pdGVyX25ldyhzLT5iYWNrZWRfYmxvY2tfbGlzdCk7IGJiOworCQkJYmIgPSBiYWNrZWRfYmxvY2tfaXRlcl9uZXh0KGJiKSkgeworCQlpZiAoYmFja2VkX2Jsb2NrX2Jsb2NrKGJiKSA+IGxhc3RfYmxvY2spIHsKKwkJCXVuc2lnbmVkIGludCBibG9ja3MgPSBiYWNrZWRfYmxvY2tfYmxvY2soYmIpIC0gbGFzdF9ibG9jazsKKwkJCXdyaXRlX3NraXBfY2h1bmsob3V0LCAoaW50NjRfdClibG9ja3MgKiBzLT5ibG9ja19zaXplKTsKKwkJfQorCQlzcGFyc2VfZmlsZV93cml0ZV9ibG9jayhvdXQsIGJiKTsKKwkJbGFzdF9ibG9jayA9IGJhY2tlZF9ibG9ja19ibG9jayhiYikgKworCQkJCURJVl9ST1VORF9VUChiYWNrZWRfYmxvY2tfbGVuKGJiKSwgcy0+YmxvY2tfc2l6ZSk7CisJfQorCisJcGFkID0gcy0+bGVuIC0gKGludDY0X3QpbGFzdF9ibG9jayAqIHMtPmJsb2NrX3NpemU7CisJYXNzZXJ0KHBhZCA+PSAwKTsKKwlpZiAocGFkID4gMCkgeworCQl3cml0ZV9za2lwX2NodW5rKG91dCwgcGFkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNwYXJzZV9maWxlX3dyaXRlKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgaW50IGZkLCBib29sIGd6LCBib29sIHNwYXJzZSwKKwkJYm9vbCBjcmMpCit7CisJaW50IHJldDsKKwlpbnQgY2h1bmtzOworCXN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0OworCisJY2h1bmtzID0gc3BhcnNlX2NvdW50X2NodW5rcyhzKTsKKwlvdXQgPSBvdXRwdXRfZmlsZV9vcGVuX2ZkKGZkLCBzLT5ibG9ja19zaXplLCBzLT5sZW4sIGd6LCBzcGFyc2UsIGNodW5rcywgY3JjKTsKKworCWlmICghb3V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHdyaXRlX2FsbF9ibG9ja3Mocywgb3V0KTsKKworCW91dHB1dF9maWxlX2Nsb3NlKG91dCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3BhcnNlX2ZpbGVfY2FsbGJhY2soc3RydWN0IHNwYXJzZV9maWxlICpzLCBib29sIHNwYXJzZSwgYm9vbCBjcmMsCisJCWludCAoKndyaXRlKSh2b2lkICpwcml2LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKSwgdm9pZCAqcHJpdikKK3sKKwlpbnQgcmV0OworCWludCBjaHVua3M7CisJc3RydWN0IG91dHB1dF9maWxlICpvdXQ7CisKKwljaHVua3MgPSBzcGFyc2VfY291bnRfY2h1bmtzKHMpOworCW91dCA9IG91dHB1dF9maWxlX29wZW5fY2FsbGJhY2sod3JpdGUsIHByaXYsIHMtPmJsb2NrX3NpemUsIHMtPmxlbiwgZmFsc2UsCisJCQlzcGFyc2UsIGNodW5rcywgY3JjKTsKKworCWlmICghb3V0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHdyaXRlX2FsbF9ibG9ja3Mocywgb3V0KTsKKworCW91dHB1dF9maWxlX2Nsb3NlKG91dCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG91dF9jb3VudGVyX3dyaXRlKHZvaWQgKnByaXYsIGNvbnN0IHZvaWQgKmRhdGEgX191bnVzZWQsIGludCBsZW4pCit7CisJaW50NjRfdCAqY291bnQgPSBwcml2OworCSpjb3VudCArPSBsZW47CisJcmV0dXJuIDA7Cit9CisKK2ludDY0X3Qgc3BhcnNlX2ZpbGVfbGVuKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgYm9vbCBzcGFyc2UsIGJvb2wgY3JjKQoreworCWludCByZXQ7CisJaW50IGNodW5rcyA9IHNwYXJzZV9jb3VudF9jaHVua3Mocyk7CisJaW50NjRfdCBjb3VudCA9IDA7CisJc3RydWN0IG91dHB1dF9maWxlICpvdXQ7CisKKwlvdXQgPSBvdXRwdXRfZmlsZV9vcGVuX2NhbGxiYWNrKG91dF9jb3VudGVyX3dyaXRlLCAmY291bnQsCisJCQlzLT5ibG9ja19zaXplLCBzLT5sZW4sIGZhbHNlLCBzcGFyc2UsIGNodW5rcywgY3JjKTsKKwlpZiAoIW91dCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gd3JpdGVfYWxsX2Jsb2NrcyhzLCBvdXQpOworCisJb3V0cHV0X2ZpbGVfY2xvc2Uob3V0KTsKKworCWlmIChyZXQgPCAwKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmFja2VkX2Jsb2NrICptb3ZlX2NodW5rc191cF90b19sZW4oc3RydWN0IHNwYXJzZV9maWxlICpmcm9tLAorCQlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnRvLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludDY0X3QgY291bnQgPSAwOworCXN0cnVjdCBvdXRwdXRfZmlsZSAqb3V0X2NvdW50ZXI7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqbGFzdF9iYiA9IE5VTEw7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqYmI7CisJc3RydWN0IGJhY2tlZF9ibG9jayAqc3RhcnQ7CisJaW50NjRfdCBmaWxlX2xlbiA9IDA7CisKKwkvKgorCSAqIG92ZXJoZWFkIGlzIHNwYXJzZSBmaWxlIGhlYWRlciwgaW5pdGlhbCBza2lwIGNodW5rLCBzcGxpdCBjaHVuaywgZW5kCisJICogc2tpcCBjaHVuaywgYW5kIGNyYyBjaHVuay4KKwkgKi8KKwlpbnQgb3ZlcmhlYWQgPSBzaXplb2Yoc3BhcnNlX2hlYWRlcl90KSArIDQgKiBzaXplb2YoY2h1bmtfaGVhZGVyX3QpICsKKwkJCXNpemVvZih1aW50MzJfdCk7CisJbGVuIC09IG92ZXJoZWFkOworCisJc3RhcnQgPSBiYWNrZWRfYmxvY2tfaXRlcl9uZXcoZnJvbS0+YmFja2VkX2Jsb2NrX2xpc3QpOworCW91dF9jb3VudGVyID0gb3V0cHV0X2ZpbGVfb3Blbl9jYWxsYmFjayhvdXRfY291bnRlcl93cml0ZSwgJmNvdW50LAorCQkJdG8tPmJsb2NrX3NpemUsIHRvLT5sZW4sIGZhbHNlLCB0cnVlLCAwLCBmYWxzZSk7CisJaWYgKCFvdXRfY291bnRlcikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGJiID0gc3RhcnQ7IGJiOyBiYiA9IGJhY2tlZF9ibG9ja19pdGVyX25leHQoYmIpKSB7CisJCWNvdW50ID0gMDsKKwkJLyogd2lsbCBjYWxsIG91dF9jb3VudGVyX3dyaXRlIHRvIHVwZGF0ZSBjb3VudCAqLworCQlzcGFyc2VfZmlsZV93cml0ZV9ibG9jayhvdXRfY291bnRlciwgYmIpOworCQlpZiAoZmlsZV9sZW4gKyBjb3VudCA+IGxlbikgeworCQkJLyoKKwkJCSAqIElmIHRoZSByZW1haW5pbmcgYXZhaWxhYmxlIHNpemUgaXMgbW9yZSB0aGFuIDEvOHRoIG9mIHRoZQorCQkJICogcmVxdWVzdGVkIHNpemUsIHNwbGl0IHRoZSBjaHVuay4gIFJlc3VsdHMgaW4gc3BhcnNlIGZpbGVzIHRoYXQKKwkJCSAqIGFyZSBhdCBsZWFzdCA3Lzh0aHMgb2YgdGhlIHJlcXVlc3RlZCBzaXplCisJCQkgKi8KKwkJCWlmICghbGFzdF9iYiB8fCAobGVuIC0gZmlsZV9sZW4gPiAobGVuIC8gOCkpKSB7CisJCQkJYmFja2VkX2Jsb2NrX3NwbGl0KGZyb20tPmJhY2tlZF9ibG9ja19saXN0LCBiYiwgbGVuIC0gZmlsZV9sZW4pOworCQkJCWxhc3RfYmIgPSBiYjsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbGVfbGVuICs9IGNvdW50OworCQlsYXN0X2JiID0gYmI7CisJfQorCitvdXQ6CisJYmFja2VkX2Jsb2NrX2xpc3RfbW92ZShmcm9tLT5iYWNrZWRfYmxvY2tfbGlzdCwKKwkJdG8tPmJhY2tlZF9ibG9ja19saXN0LCBzdGFydCwgbGFzdF9iYik7CisKKwlvdXRwdXRfZmlsZV9jbG9zZShvdXRfY291bnRlcik7CisKKwlyZXR1cm4gYmI7Cit9CisKK2ludCBzcGFyc2VfZmlsZV9yZXNwYXJzZShzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKmluX3MsIHVuc2lnbmVkIGludCBtYXhfbGVuLAorCQlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKipvdXRfcywgaW50IG91dF9zX2NvdW50KQoreworCXN0cnVjdCBiYWNrZWRfYmxvY2sgKmJiOworCXN0cnVjdCBzcGFyc2VfZmlsZSAqczsKKwlzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnRtcDsKKwlpbnQgYyA9IDA7CisKKwl0bXAgPSBzcGFyc2VfZmlsZV9uZXcoaW5fcy0+YmxvY2tfc2l6ZSwgaW5fcy0+bGVuKTsKKwlpZiAoIXRtcCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbyB7CisJCXMgPSBzcGFyc2VfZmlsZV9uZXcoaW5fcy0+YmxvY2tfc2l6ZSwgaW5fcy0+bGVuKTsKKworCQliYiA9IG1vdmVfY2h1bmtzX3VwX3RvX2xlbihpbl9zLCBzLCBtYXhfbGVuKTsKKworCQlpZiAoYyA8IG91dF9zX2NvdW50KSB7CisJCQlvdXRfc1tjXSA9IHM7CisJCX0gZWxzZSB7CisJCQliYWNrZWRfYmxvY2tfbGlzdF9tb3ZlKHMtPmJhY2tlZF9ibG9ja19saXN0LCB0bXAtPmJhY2tlZF9ibG9ja19saXN0LAorCQkJCQlOVUxMLCBOVUxMKTsKKwkJCXNwYXJzZV9maWxlX2Rlc3Ryb3kocyk7CisJCX0KKwkJYysrOworCX0gd2hpbGUgKGJiKTsKKworCWJhY2tlZF9ibG9ja19saXN0X21vdmUodG1wLT5iYWNrZWRfYmxvY2tfbGlzdCwgaW5fcy0+YmFja2VkX2Jsb2NrX2xpc3QsCisJCQlOVUxMLCBOVUxMKTsKKworCXNwYXJzZV9maWxlX2Rlc3Ryb3kodG1wKTsKKworCXJldHVybiBjOworfQorCit2b2lkIHNwYXJzZV9maWxlX3ZlcmJvc2Uoc3RydWN0IHNwYXJzZV9maWxlICpzKQoreworCXMtPnZlcmJvc2UgPSB0cnVlOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9jcmMzMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmZlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlX2NyYzMyLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qLQorICogIENPUFlSSUdIVCAoQykgMTk4NiBHYXJ5IFMuIEJyb3duLiAgWW91IG1heSB1c2UgdGhpcyBwcm9ncmFtLCBvcgorICogIGNvZGUgb3IgdGFibGVzIGV4dHJhY3RlZCBmcm9tIGl0LCBhcyBkZXNpcmVkIHdpdGhvdXQgcmVzdHJpY3Rpb24uCisgKi8KKworLyoKKyAqICBGaXJzdCwgdGhlIHBvbHlub21pYWwgaXRzZWxmIGFuZCBpdHMgdGFibGUgb2YgZmVlZGJhY2sgdGVybXMuICBUaGUKKyAqICBwb2x5bm9taWFsIGlzCisgKiAgWF4zMitYXjI2K1heMjMrWF4yMitYXjE2K1heMTIrWF4xMStYXjEwK1heOCtYXjcrWF41K1heNCtYXjIrWF4xK1heMAorICoKKyAqICBOb3RlIHRoYXQgd2UgdGFrZSBpdCAiYmFja3dhcmRzIiBhbmQgcHV0IHRoZSBoaWdoZXN0LW9yZGVyIHRlcm0gaW4KKyAqICB0aGUgbG93ZXN0LW9yZGVyIGJpdC4gIFRoZSBYXjMyIHRlcm0gaXMgImltcGxpZWQiOyB0aGUgTFNCIGlzIHRoZQorICogIFheMzEgdGVybSwgZXRjLiAgVGhlIFheMCB0ZXJtICh1c3VhbGx5IHNob3duIGFzICIrMSIpIHJlc3VsdHMgaW4KKyAqICB0aGUgTVNCIGJlaW5nIDEKKyAqCisgKiAgTm90ZSB0aGF0IHRoZSB1c3VhbCBoYXJkd2FyZSBzaGlmdCByZWdpc3RlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2gKKyAqICBpcyB3aGF0IHdlJ3JlIHVzaW5nICh3ZSdyZSBtZXJlbHkgb3B0aW1pemluZyBpdCBieSBkb2luZyBlaWdodC1iaXQKKyAqICBjaHVua3MgYXQgYSB0aW1lKSBzaGlmdHMgYml0cyBpbnRvIHRoZSBsb3dlc3Qtb3JkZXIgdGVybS4gIEluIG91cgorICogIGltcGxlbWVudGF0aW9uLCB0aGF0IG1lYW5zIHNoaWZ0aW5nIHRvd2FyZHMgdGhlIHJpZ2h0LiAgV2h5IGRvIHdlCisgKiAgZG8gaXQgdGhpcyB3YXk/ICBCZWNhdXNlIHRoZSBjYWxjdWxhdGVkIENSQyBtdXN0IGJlIHRyYW5zbWl0dGVkIGluCisgKiAgb3JkZXIgZnJvbSBoaWdoZXN0LW9yZGVyIHRlcm0gdG8gbG93ZXN0LW9yZGVyIHRlcm0uICBVQVJUcyB0cmFuc21pdAorICogIGNoYXJhY3RlcnMgaW4gb3JkZXIgZnJvbSBMU0IgdG8gTVNCLiAgQnkgc3RvcmluZyB0aGUgQ1JDIHRoaXMgd2F5CisgKiAgd2UgaGFuZCBpdCB0byB0aGUgVUFSVCBpbiB0aGUgb3JkZXIgbG93LWJ5dGUgdG8gaGlnaC1ieXRlOyB0aGUgVUFSVAorICogIHNlbmRzIGVhY2ggbG93LWJpdCB0byBoaWdodC1iaXQ7IGFuZCB0aGUgcmVzdWx0IGlzIHRyYW5zbWlzc2lvbiBiaXQKKyAqICBieSBiaXQgZnJvbSBoaWdoZXN0LSB0byBsb3dlc3Qtb3JkZXIgdGVybSB3aXRob3V0IHJlcXVpcmluZyBhbnkgYml0CisgKiAgc2h1ZmZsaW5nIG9uIG91ciBwYXJ0LiAgUmVjZXB0aW9uIHdvcmtzIHNpbWlsYXJseQorICoKKyAqICBUaGUgZmVlZGJhY2sgdGVybXMgdGFibGUgY29uc2lzdHMgb2YgMjU2LCAzMi1iaXQgZW50cmllcy4gIE5vdGVzCisgKgorICogICAgICBUaGUgdGFibGUgY2FuIGJlIGdlbmVyYXRlZCBhdCBydW50aW1lIGlmIGRlc2lyZWQ7IGNvZGUgdG8gZG8gc28KKyAqICAgICAgaXMgc2hvd24gbGF0ZXIuICBJdCBtaWdodCBub3QgYmUgb2J2aW91cywgYnV0IHRoZSBmZWVkYmFjaworICogICAgICB0ZXJtcyBzaW1wbHkgcmVwcmVzZW50IHRoZSByZXN1bHRzIG9mIGVpZ2h0IHNoaWZ0L3hvciBvcGVyYQorICogICAgICB0aW9ucyBmb3IgYWxsIGNvbWJpbmF0aW9ucyBvZiBkYXRhIGFuZCBDUkMgcmVnaXN0ZXIgdmFsdWVzCisgKgorICogICAgICBUaGUgdmFsdWVzIG11c3QgYmUgcmlnaHQtc2hpZnRlZCBieSBlaWdodCBiaXRzIGJ5IHRoZSAidXBkY3JjCisgKiAgICAgIGxvZ2ljOyB0aGUgc2hpZnQgbXVzdCBiZSB1bnNpZ25lZCAoYnJpbmcgaW4gemVyb2VzKS4gIE9uIHNvbWUKKyAqICAgICAgaGFyZHdhcmUgeW91IGNvdWxkIHByb2JhYmx5IG9wdGltaXplIHRoZSBzaGlmdCBpbiBhc3NlbWJsZXIgYnkKKyAqICAgICAgdXNpbmcgYnl0ZS1zd2FwIGluc3RydWN0aW9ucworICogICAgICBwb2x5bm9taWFsICRlZGI4ODMyMAorICoKKyAqCisgKiBDUkMzMiBjb2RlIGRlcml2ZWQgZnJvbSB3b3JrIGJ5IEdhcnkgUy4gQnJvd24uCisgKi8KKworLyogQ29kZSB0YWtlbiBmcm9tIEZyZWVCU0QgOCAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorCitzdGF0aWMgdWludDMyX3QgY3JjMzJfdGFiW10gPSB7CisgICAgICAgIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4ZWUwZTYxMmMsIDB4OTkwOTUxYmEsIDB4MDc2ZGM0MTksIDB4NzA2YWY0OGYsCisgICAgICAgIDB4ZTk2M2E1MzUsIDB4OWU2NDk1YTMsIDB4MGVkYjg4MzIsIDB4NzlkY2I4YTQsIDB4ZTBkNWU5MWUsIDB4OTdkMmQ5ODgsCisgICAgICAgIDB4MDliNjRjMmIsIDB4N2ViMTdjYmQsIDB4ZTdiODJkMDcsIDB4OTBiZjFkOTEsIDB4MWRiNzEwNjQsIDB4NmFiMDIwZjIsCisgICAgICAgIDB4ZjNiOTcxNDgsIDB4ODRiZTQxZGUsIDB4MWFkYWQ0N2QsIDB4NmRkZGU0ZWIsIDB4ZjRkNGI1NTEsIDB4ODNkMzg1YzcsCisgICAgICAgIDB4MTM2Yzk4NTYsIDB4NjQ2YmE4YzAsIDB4ZmQ2MmY5N2EsIDB4OGE2NWM5ZWMsIDB4MTQwMTVjNGYsIDB4NjMwNjZjZDksCisgICAgICAgIDB4ZmEwZjNkNjMsIDB4OGQwODBkZjUsIDB4M2I2ZTIwYzgsIDB4NGM2OTEwNWUsIDB4ZDU2MDQxZTQsIDB4YTI2NzcxNzIsCisgICAgICAgIDB4M2MwM2U0ZDEsIDB4NGIwNGQ0NDcsIDB4ZDIwZDg1ZmQsIDB4YTUwYWI1NmIsIDB4MzViNWE4ZmEsIDB4NDJiMjk4NmMsCisgICAgICAgIDB4ZGJiYmM5ZDYsIDB4YWNiY2Y5NDAsIDB4MzJkODZjZTMsIDB4NDVkZjVjNzUsIDB4ZGNkNjBkY2YsIDB4YWJkMTNkNTksCisgICAgICAgIDB4MjZkOTMwYWMsIDB4NTFkZTAwM2EsIDB4YzhkNzUxODAsIDB4YmZkMDYxMTYsIDB4MjFiNGY0YjUsIDB4NTZiM2M0MjMsCisgICAgICAgIDB4Y2ZiYTk1OTksIDB4YjhiZGE1MGYsIDB4MjgwMmI4OWUsIDB4NWYwNTg4MDgsIDB4YzYwY2Q5YjIsIDB4YjEwYmU5MjQsCisgICAgICAgIDB4MmY2ZjdjODcsIDB4NTg2ODRjMTEsIDB4YzE2MTFkYWIsIDB4YjY2NjJkM2QsIDB4NzZkYzQxOTAsIDB4MDFkYjcxMDYsCisgICAgICAgIDB4OThkMjIwYmMsIDB4ZWZkNTEwMmEsIDB4NzFiMTg1ODksIDB4MDZiNmI1MWYsIDB4OWZiZmU0YTUsIDB4ZThiOGQ0MzMsCisgICAgICAgIDB4NzgwN2M5YTIsIDB4MGYwMGY5MzQsIDB4OTYwOWE4OGUsIDB4ZTEwZTk4MTgsIDB4N2Y2YTBkYmIsIDB4MDg2ZDNkMmQsCisgICAgICAgIDB4OTE2NDZjOTcsIDB4ZTY2MzVjMDEsIDB4NmI2YjUxZjQsIDB4MWM2YzYxNjIsIDB4ODU2NTMwZDgsIDB4ZjI2MjAwNGUsCisgICAgICAgIDB4NmMwNjk1ZWQsIDB4MWIwMWE1N2IsIDB4ODIwOGY0YzEsIDB4ZjUwZmM0NTcsIDB4NjViMGQ5YzYsIDB4MTJiN2U5NTAsCisgICAgICAgIDB4OGJiZWI4ZWEsIDB4ZmNiOTg4N2MsIDB4NjJkZDFkZGYsIDB4MTVkYTJkNDksIDB4OGNkMzdjZjMsIDB4ZmJkNDRjNjUsCisgICAgICAgIDB4NGRiMjYxNTgsIDB4M2FiNTUxY2UsIDB4YTNiYzAwNzQsIDB4ZDRiYjMwZTIsIDB4NGFkZmE1NDEsIDB4M2RkODk1ZDcsCisgICAgICAgIDB4YTRkMWM0NmQsIDB4ZDNkNmY0ZmIsIDB4NDM2OWU5NmEsIDB4MzQ2ZWQ5ZmMsIDB4YWQ2Nzg4NDYsIDB4ZGE2MGI4ZDAsCisgICAgICAgIDB4NDQwNDJkNzMsIDB4MzMwMzFkZTUsIDB4YWEwYTRjNWYsIDB4ZGQwZDdjYzksIDB4NTAwNTcxM2MsIDB4MjcwMjQxYWEsCisgICAgICAgIDB4YmUwYjEwMTAsIDB4YzkwYzIwODYsIDB4NTc2OGI1MjUsIDB4MjA2Zjg1YjMsIDB4Yjk2NmQ0MDksIDB4Y2U2MWU0OWYsCisgICAgICAgIDB4NWVkZWY5MGUsIDB4MjlkOWM5OTgsIDB4YjBkMDk4MjIsIDB4YzdkN2E4YjQsIDB4NTliMzNkMTcsIDB4MmViNDBkODEsCisgICAgICAgIDB4YjdiZDVjM2IsIDB4YzBiYTZjYWQsIDB4ZWRiODgzMjAsIDB4OWFiZmIzYjYsIDB4MDNiNmUyMGMsIDB4NzRiMWQyOWEsCisgICAgICAgIDB4ZWFkNTQ3MzksIDB4OWRkMjc3YWYsIDB4MDRkYjI2MTUsIDB4NzNkYzE2ODMsIDB4ZTM2MzBiMTIsIDB4OTQ2NDNiODQsCisgICAgICAgIDB4MGQ2ZDZhM2UsIDB4N2E2YTVhYTgsIDB4ZTQwZWNmMGIsIDB4OTMwOWZmOWQsIDB4MGEwMGFlMjcsIDB4N2QwNzllYjEsCisgICAgICAgIDB4ZjAwZjkzNDQsIDB4ODcwOGEzZDIsIDB4MWUwMWYyNjgsIDB4NjkwNmMyZmUsIDB4Zjc2MjU3NWQsIDB4ODA2NTY3Y2IsCisgICAgICAgIDB4MTk2YzM2NzEsIDB4NmU2YjA2ZTcsIDB4ZmVkNDFiNzYsIDB4ODlkMzJiZTAsIDB4MTBkYTdhNWEsIDB4NjdkZDRhY2MsCisgICAgICAgIDB4ZjliOWRmNmYsIDB4OGViZWVmZjksIDB4MTdiN2JlNDMsIDB4NjBiMDhlZDUsIDB4ZDZkNmEzZTgsIDB4YTFkMTkzN2UsCisgICAgICAgIDB4MzhkOGMyYzQsIDB4NGZkZmYyNTIsIDB4ZDFiYjY3ZjEsIDB4YTZiYzU3NjcsIDB4M2ZiNTA2ZGQsIDB4NDhiMjM2NGIsCisgICAgICAgIDB4ZDgwZDJiZGEsIDB4YWYwYTFiNGMsIDB4MzYwMzRhZjYsIDB4NDEwNDdhNjAsIDB4ZGY2MGVmYzMsIDB4YTg2N2RmNTUsCisgICAgICAgIDB4MzE2ZThlZWYsIDB4NDY2OWJlNzksIDB4Y2I2MWIzOGMsIDB4YmM2NjgzMWEsIDB4MjU2ZmQyYTAsIDB4NTI2OGUyMzYsCisgICAgICAgIDB4Y2MwYzc3OTUsIDB4YmIwYjQ3MDMsIDB4MjIwMjE2YjksIDB4NTUwNTI2MmYsIDB4YzViYTNiYmUsIDB4YjJiZDBiMjgsCisgICAgICAgIDB4MmJiNDVhOTIsIDB4NWNiMzZhMDQsIDB4YzJkN2ZmYTcsIDB4YjVkMGNmMzEsIDB4MmNkOTllOGIsIDB4NWJkZWFlMWQsCisgICAgICAgIDB4OWI2NGMyYjAsIDB4ZWM2M2YyMjYsIDB4NzU2YWEzOWMsIDB4MDI2ZDkzMGEsIDB4OWMwOTA2YTksIDB4ZWIwZTM2M2YsCisgICAgICAgIDB4NzIwNzY3ODUsIDB4MDUwMDU3MTMsIDB4OTViZjRhODIsIDB4ZTJiODdhMTQsIDB4N2JiMTJiYWUsIDB4MGNiNjFiMzgsCisgICAgICAgIDB4OTJkMjhlOWIsIDB4ZTVkNWJlMGQsIDB4N2NkY2VmYjcsIDB4MGJkYmRmMjEsIDB4ODZkM2QyZDQsIDB4ZjFkNGUyNDIsCisgICAgICAgIDB4NjhkZGIzZjgsIDB4MWZkYTgzNmUsIDB4ODFiZTE2Y2QsIDB4ZjZiOTI2NWIsIDB4NmZiMDc3ZTEsIDB4MThiNzQ3NzcsCisgICAgICAgIDB4ODgwODVhZTYsIDB4ZmYwZjZhNzAsIDB4NjYwNjNiY2EsIDB4MTEwMTBiNWMsIDB4OGY2NTllZmYsIDB4Zjg2MmFlNjksCisgICAgICAgIDB4NjE2YmZmZDMsIDB4MTY2Y2NmNDUsIDB4YTAwYWUyNzgsIDB4ZDcwZGQyZWUsIDB4NGUwNDgzNTQsIDB4MzkwM2IzYzIsCisgICAgICAgIDB4YTc2NzI2NjEsIDB4ZDA2MDE2ZjcsIDB4NDk2OTQ3NGQsIDB4M2U2ZTc3ZGIsIDB4YWVkMTZhNGEsIDB4ZDlkNjVhZGMsCisgICAgICAgIDB4NDBkZjBiNjYsIDB4MzdkODNiZjAsIDB4YTliY2FlNTMsIDB4ZGViYjllYzUsIDB4NDdiMmNmN2YsIDB4MzBiNWZmZTksCisgICAgICAgIDB4YmRiZGYyMWMsIDB4Y2FiYWMyOGEsIDB4NTNiMzkzMzAsIDB4MjRiNGEzYTYsIDB4YmFkMDM2MDUsIDB4Y2RkNzA2OTMsCisgICAgICAgIDB4NTRkZTU3MjksIDB4MjNkOTY3YmYsIDB4YjM2NjdhMmUsIDB4YzQ2MTRhYjgsIDB4NWQ2ODFiMDIsIDB4MmE2ZjJiOTQsCisgICAgICAgIDB4YjQwYmJlMzcsIDB4YzMwYzhlYTEsIDB4NWEwNWRmMWIsIDB4MmQwMmVmOGQKK307CisKKy8qCisgKiBBIGZ1bmN0aW9uIHRoYXQgY2FsY3VsYXRlcyB0aGUgQ1JDLTMyIGJhc2VkIG9uIHRoZSB0YWJsZSBhYm92ZSBpcworICogZ2l2ZW4gYmVsb3cgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuIEFuIGVxdWl2YWxlbnQgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoaXMgZnVuY3Rpb24gdGhhdCdzIGFjdHVhbGx5IHVzZWQgaW4gdGhlIGtlcm5lbCBjYW4gYmUgZm91bmQKKyAqIGluIHN5cy9saWJrZXJuLmgsIHdoZXJlIGl0IGNhbiBiZSBpbmxpbmVkLgorICovCisKK3VpbnQzMl90IHNwYXJzZV9jcmMzMih1aW50MzJfdCBjcmNfaW4sIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBidWY7CisgICAgICAgIHVpbnQzMl90IGNyYzsKKworICAgICAgICBjcmMgPSBjcmNfaW4gXiB+MFU7CisgICAgICAgIHdoaWxlIChzaXplLS0pCisgICAgICAgICAgICAgICAgY3JjID0gY3JjMzJfdGFiWyhjcmMgXiAqcCsrKSAmIDB4RkZdIF4gKGNyYyA+PiA4KTsKKyAgICAgICAgcmV0dXJuIGNyYyBeIH4wVTsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9jcmMzMi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9jcmMzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZDhhODYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlX2NyYzMyLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordWludDMyX3Qgc3BhcnNlX2NyYzMyKHVpbnQzMl90IGNyYywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfZGVmcy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5Y2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfZGVmcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9MSUJTUEFSU0VfU1BBUlNFX0RFRlNfCisjZGVmaW5lIF9MSUJTUEFSU0VfU1BBUlNFX0RFRlNfCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgX19sZTY0IHU2NAorI2RlZmluZSBfX2xlMzIgdTMyCisjZGVmaW5lIF9fbGUxNiB1MTYKKworI2RlZmluZSBfX2JlNjQgdTY0CisjZGVmaW5lIF9fYmUzMiB1MzIKKyNkZWZpbmUgX19iZTE2IHUxNgorCisjZGVmaW5lIF9fdTY0IHU2NAorI2RlZmluZSBfX3UzMiB1MzIKKyNkZWZpbmUgX191MTYgdTE2CisjZGVmaW5lIF9fdTggdTgKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdTY0OwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIHM2NDsKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IHUxNjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworI2RlZmluZSBESVZfUk9VTkRfVVAoeCwgeSkgKCgoeCkgKyAoeSkgLSAxKS8oeSkpCisjZGVmaW5lIEFMSUdOKHgsIHkpICgoeSkgKiBESVZfUk9VTkRfVVAoKHgpLCAoeSkpKQorI2RlZmluZSBBTElHTl9ET1dOKHgsIHkpICgoeSkgKiAoKHgpIC8gKHkpKSkKKworI2RlZmluZSBlcnJvcihmbXQsIGFyZ3MuLi4pIGRvIHsgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZXJyb3JfZXJybm8ocywgYXJncy4uLikgZXJyb3IocyAiOiAlcyIsICMjYXJncywgc3RyZXJyb3IoZXJybm8pKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfZXJyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzkyYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlX2Vyci5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwordm9pZCBzcGFyc2VfZGVmYXVsdF9wcmludChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3A7CisKKwl2YV9zdGFydChhcmdwLCBmbXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdwKTsKKwl2YV9lbmQoYXJncCk7Cit9CisKK3ZvaWQgKCpzcGFyc2VfcHJpbnRfZXJyb3IpKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSA9IHNwYXJzZV9kZWZhdWx0X3ByaW50Owordm9pZCAoKnNwYXJzZV9wcmludF92ZXJib3NlKShjb25zdCBjaGFyICpmbXQsIC4uLikgPSBzcGFyc2VfZGVmYXVsdF9wcmludDsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfZmlsZS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhMTJlNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfZmlsZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9MSUJTUEFSU0VfU1BBUlNFX0ZJTEVfSF8KKyNkZWZpbmUgX0xJQlNQQVJTRV9TUEFSU0VfRklMRV9IXworCisjaW5jbHVkZSA8c3BhcnNlL3NwYXJzZS5oPgorCitzdHJ1Y3Qgc3BhcnNlX2ZpbGUgeworCXVuc2lnbmVkIGludCBibG9ja19zaXplOworCWludDY0X3QgbGVuOworCWJvb2wgdmVyYm9zZTsKKworCXN0cnVjdCBiYWNrZWRfYmxvY2tfbGlzdCAqYmFja2VkX2Jsb2NrX2xpc3Q7CisJc3RydWN0IG91dHB1dF9maWxlICpvdXQ7Cit9OworCisKKyNlbmRpZiAvKiBfTElCU1BBUlNFX1NQQVJTRV9GSUxFX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnNwYXJzZS9zcmMvc3BhcnNlX2Zvcm1hdC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmMTJhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9mb3JtYXQuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTElCU1BBUlNFX1NQQVJTRV9GT1JNQVRfSF8KKyNkZWZpbmUgX0xJQlNQQVJTRV9TUEFSU0VfRk9STUFUX0hfCisjaW5jbHVkZSAic3BhcnNlX2RlZnMuaCIKKwordHlwZWRlZiBzdHJ1Y3Qgc3BhcnNlX2hlYWRlciB7CisgIF9fbGUzMgltYWdpYzsJCS8qIDB4ZWQyNmZmM2EgKi8KKyAgX19sZTE2CW1ham9yX3ZlcnNpb247CS8qICgweDEpIC0gcmVqZWN0IGltYWdlcyB3aXRoIGhpZ2hlciBtYWpvciB2ZXJzaW9ucyAqLworICBfX2xlMTYJbWlub3JfdmVyc2lvbjsJLyogKDB4MCkgLSBhbGxvdyBpbWFnZXMgd2l0aCBoaWdlciBtaW5vciB2ZXJzaW9ucyAqLworICBfX2xlMTYJZmlsZV9oZHJfc3o7CS8qIDI4IGJ5dGVzIGZvciBmaXJzdCByZXZpc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQgKi8KKyAgX19sZTE2CWNodW5rX2hkcl9zejsJLyogMTIgYnl0ZXMgZm9yIGZpcnN0IHJldmlzaW9uIG9mIHRoZSBmaWxlIGZvcm1hdCAqLworICBfX2xlMzIJYmxrX3N6OwkJLyogYmxvY2sgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQgKDQwOTYpICovCisgIF9fbGUzMgl0b3RhbF9ibGtzOwkvKiB0b3RhbCBibG9ja3MgaW4gdGhlIG5vbi1zcGFyc2Ugb3V0cHV0IGltYWdlICovCisgIF9fbGUzMgl0b3RhbF9jaHVua3M7CS8qIHRvdGFsIGNodW5rcyBpbiB0aGUgc3BhcnNlIGlucHV0IGltYWdlICovCisgIF9fbGUzMglpbWFnZV9jaGVja3N1bTsgLyogQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIG9yaWdpbmFsIGRhdGEsIGNvdW50aW5nICJkb24ndCBjYXJlIiAqLworCQkJCS8qIGFzIDAuIFN0YW5kYXJkIDgwMi4zIHBvbHlub21pYWwsIHVzZSBhIFB1YmxpYyBEb21haW4gKi8KKwkJCQkvKiB0YWJsZSBpbXBsZW1lbnRhdGlvbiAqLworfSBzcGFyc2VfaGVhZGVyX3Q7CisKKyNkZWZpbmUgU1BBUlNFX0hFQURFUl9NQUdJQwkweGVkMjZmZjNhCisKKyNkZWZpbmUgQ0hVTktfVFlQRV9SQVcJCTB4Q0FDMQorI2RlZmluZSBDSFVOS19UWVBFX0ZJTEwJCTB4Q0FDMgorI2RlZmluZSBDSFVOS19UWVBFX0RPTlRfQ0FSRQkweENBQzMKKyNkZWZpbmUgQ0hVTktfVFlQRV9DUkMzMiAgICAweENBQzQKKwordHlwZWRlZiBzdHJ1Y3QgY2h1bmtfaGVhZGVyIHsKKyAgX19sZTE2CWNodW5rX3R5cGU7CS8qIDB4Q0FDMSAtPiByYXc7IDB4Q0FDMiAtPiBmaWxsOyAweENBQzMgLT4gZG9uJ3QgY2FyZSAqLworICBfX2xlMTYJcmVzZXJ2ZWQxOworICBfX2xlMzIJY2h1bmtfc3o7CS8qIGluIGJsb2NrcyBpbiBvdXRwdXQgaW1hZ2UgKi8KKyAgX19sZTMyCXRvdGFsX3N6OwkvKiBpbiBieXRlcyBvZiBjaHVuayBpbnB1dCBmaWxlIGluY2x1ZGluZyBjaHVuayBoZWFkZXIgYW5kIGRhdGEgKi8KK30gY2h1bmtfaGVhZGVyX3Q7CisKKy8qIEZvbGxvd2luZyBhIFJhdyBvciBGaWxsIG9yIENSQzMyIGNodW5rIGlzIGRhdGEuCisgKiAgRm9yIGEgUmF3IGNodW5rLCBpdCdzIHRoZSBkYXRhIGluIGNodW5rX3N6ICogYmxrX3N6LgorICogIEZvciBhIEZpbGwgY2h1bmssIGl0J3MgNCBieXRlcyBvZiB0aGUgZmlsbCBkYXRhLgorICogIEZvciBhIENSQzMyIGNodW5rLCBpdCdzIDQgYnl0ZXMgb2YgQ1JDMzIKKyAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfcmVhZC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJzcGFyc2Uvc3JjL3NwYXJzZV9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0MTQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlic3BhcnNlL3NyYy9zcGFyc2VfcmVhZC5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZGVmaW5lIF9GSUxFX09GRlNFVF9CSVRTIDY0CisjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMQorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNwYXJzZS9zcGFyc2UuaD4KKworI2luY2x1ZGUgImRlZnMuaCIKKyNpbmNsdWRlICJvdXRwdXRfZmlsZS5oIgorI2luY2x1ZGUgInNwYXJzZV9jcmMzMi5oIgorI2luY2x1ZGUgInNwYXJzZV9maWxlLmgiCisjaW5jbHVkZSAic3BhcnNlX2Zvcm1hdC5oIgorCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoX19NQUNIX18pCisjZGVmaW5lIGxzZWVrNjQgbHNlZWsKKyNkZWZpbmUgb2ZmNjRfdCBvZmZfdAorI2VuZGlmCisKKyNkZWZpbmUgU1BBUlNFX0hFQURFUl9NQUpPUl9WRVIgMQorI2RlZmluZSBTUEFSU0VfSEVBREVSX0xFTiAgICAgICAoc2l6ZW9mKHNwYXJzZV9oZWFkZXJfdCkpCisjZGVmaW5lIENIVU5LX0hFQURFUl9MRU4gKHNpemVvZihjaHVua19oZWFkZXJfdCkpCisKKyNkZWZpbmUgQ09QWV9CVUZfU0laRSAoMTAyNFUqMTAyNFUpCitzdGF0aWMgY2hhciAqY29weWJ1ZjsKKworI2RlZmluZSBtaW4oYSwgYikgXAorCSh7IHR5cGVvZihhKSBfYSA9IChhKTsgdHlwZW9mKGIpIF9iID0gKGIpOyAoX2EgPCBfYikgPyBfYSA6IF9iOyB9KQorCitzdGF0aWMgdm9pZCB2ZXJib3NlX2Vycm9yKGJvb2wgdmVyYm9zZSwgaW50IGVyciwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJY2hhciAqcyA9ICIiOworCWNoYXIgKmF0ID0gIiI7CisJaWYgKGZtdCkgeworCQl2YV9saXN0IGFyZ3A7CisJCWludCBzaXplOworCisJCXZhX3N0YXJ0KGFyZ3AsIGZtdCk7CisJCXNpemUgPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCBhcmdwKTsKKwkJdmFfZW5kKGFyZ3ApOworCisJCWlmIChzaXplIDwgMCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJYXQgPSBtYWxsb2Moc2l6ZSArIDEpOworCQlpZiAoYXQgPT0gTlVMTCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdmFfc3RhcnQoYXJncCwgZm10KTsKKwkJdnNucHJpbnRmKGF0LCBzaXplLCBmbXQsIGFyZ3ApOworCQl2YV9lbmQoYXJncCk7CisJCWF0W3NpemVdID0gMDsKKwkJcyA9ICIgYXQgIjsKKwl9CisJaWYgKHZlcmJvc2UpIHsKKyNpZm5kZWYgVVNFX01JTkdXCisJCWlmIChlcnIgPT0gLUVPVkVSRkxPVykgeworCQkJc3BhcnNlX3ByaW50X3ZlcmJvc2UoIkVPRiB3aGlsZSByZWFkaW5nIGZpbGUlcyVzXG4iLCBzLCBhdCk7CisJCX0gZWxzZQorI2VuZGlmCisJCWlmIChlcnIgPT0gLUVJTlZBTCkgeworCQkJc3BhcnNlX3ByaW50X3ZlcmJvc2UoIkludmFsaWQgc3BhcnNlIGZpbGUgZm9ybWF0JXMlc1xuIiwgcywgYXQpOworCQl9IGVsc2UgaWYgKGVyciA9PSAtRU5PTUVNKSB7CisJCQlzcGFyc2VfcHJpbnRfdmVyYm9zZSgiRmFpbGVkIGFsbG9jYXRpb24gd2hpbGUgcmVhZGluZyBmaWxlJXMlc1xuIiwKKwkJCQkJcywgYXQpOworCQl9IGVsc2UgeworCQkJc3BhcnNlX3ByaW50X3ZlcmJvc2UoIlVua25vd24gZXJyb3IgJWQlcyVzXG4iLCBlcnIsIHMsIGF0KTsKKwkJfQorCX0KKwlpZiAoZm10KSB7CisJCWZyZWUoYXQpOworCX0KK30KKworc3RhdGljIGludCBwcm9jZXNzX3Jhd19jaHVuayhzdHJ1Y3Qgc3BhcnNlX2ZpbGUgKnMsIHVuc2lnbmVkIGludCBjaHVua19zaXplLAorCQlpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgYmxvY2tzLCB1bnNpZ25lZCBpbnQgYmxvY2ssCisJCXVpbnQzMl90ICpjcmMzMikKK3sKKwlpbnQgcmV0OworCWludCBjaHVuazsKKwl1bnNpZ25lZCBpbnQgbGVuID0gYmxvY2tzICogcy0+YmxvY2tfc2l6ZTsKKworCWlmIChjaHVua19zaXplICUgcy0+YmxvY2tfc2l6ZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaHVua19zaXplIC8gcy0+YmxvY2tfc2l6ZSAhPSBibG9ja3MpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc3BhcnNlX2ZpbGVfYWRkX2ZkKHMsIGZkLCBvZmZzZXQsIGxlbiwgYmxvY2spOworCWlmIChyZXQgPCAwKSB7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKGNyYzMyKSB7CisJCXdoaWxlIChsZW4pIHsKKwkJCWNodW5rID0gbWluKGxlbiwgQ09QWV9CVUZfU0laRSk7CisJCQlyZXQgPSByZWFkX2FsbChmZCwgY29weWJ1ZiwgY2h1bmspOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJKmNyYzMyID0gc3BhcnNlX2NyYzMyKCpjcmMzMiwgY29weWJ1ZiwgY2h1bmspOworCQkJbGVuIC09IGNodW5rOworCQl9CisJfSBlbHNlIHsKKwkJbHNlZWs2NChmZCwgbGVuLCBTRUVLX0NVUik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19maWxsX2NodW5rKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgdW5zaWduZWQgaW50IGNodW5rX3NpemUsCisJCWludCBmZCwgdW5zaWduZWQgaW50IGJsb2NrcywgdW5zaWduZWQgaW50IGJsb2NrLCB1aW50MzJfdCAqY3JjMzIpCit7CisJaW50IHJldDsKKwlpbnQgY2h1bms7CisJaW50NjRfdCBsZW4gPSAoaW50NjRfdClibG9ja3MgKiBzLT5ibG9ja19zaXplOworCXVpbnQzMl90IGZpbGxfdmFsOworCXVpbnQzMl90ICpmaWxsYnVmOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGNodW5rX3NpemUgIT0gc2l6ZW9mKGZpbGxfdmFsKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWFkX2FsbChmZCwgJmZpbGxfdmFsLCBzaXplb2YoZmlsbF92YWwpKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwYXJzZV9maWxlX2FkZF9maWxsKHMsIGZpbGxfdmFsLCBsZW4sIGJsb2NrKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChjcmMzMikgeworCQkvKiBGaWxsIGNvcHlfYnVmIHdpdGggdGhlIGZpbGwgdmFsdWUgKi8KKwkJZmlsbGJ1ZiA9ICh1aW50MzJfdCAqKWNvcHlidWY7CisJCWZvciAoaSA9IDA7IGkgPCAoQ09QWV9CVUZfU0laRSAvIHNpemVvZihmaWxsX3ZhbCkpOyBpKyspIHsKKwkJCWZpbGxidWZbaV0gPSBmaWxsX3ZhbDsKKwkJfQorCisJCXdoaWxlIChsZW4pIHsKKwkJCWNodW5rID0gbWluKGxlbiwgQ09QWV9CVUZfU0laRSk7CisJCQkqY3JjMzIgPSBzcGFyc2VfY3JjMzIoKmNyYzMyLCBjb3B5YnVmLCBjaHVuayk7CisJCQlsZW4gLT0gY2h1bms7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3NraXBfY2h1bmsoc3RydWN0IHNwYXJzZV9maWxlICpzLCB1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZSwKKwkJaW50IGZkIF9fdW51c2VkLCB1bnNpZ25lZCBpbnQgYmxvY2tzLAorCQl1bnNpZ25lZCBpbnQgYmxvY2sgX191bnVzZWQsIHVpbnQzMl90ICpjcmMzMikKK3sKKwlpZiAoY2h1bmtfc2l6ZSAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjcmMzMikgeworCSAgICAgICAgaW50NjRfdCBsZW4gPSAoaW50NjRfdClibG9ja3MgKiBzLT5ibG9ja19zaXplOworCQltZW1zZXQoY29weWJ1ZiwgMCwgQ09QWV9CVUZfU0laRSk7CisKKwkJd2hpbGUgKGxlbikgeworCQkJaW50IGNodW5rID0gbWluKGxlbiwgQ09QWV9CVUZfU0laRSk7CisJCQkqY3JjMzIgPSBzcGFyc2VfY3JjMzIoKmNyYzMyLCBjb3B5YnVmLCBjaHVuayk7CisJCQlsZW4gLT0gY2h1bms7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NyYzMyX2NodW5rKGludCBmZCwgdW5zaWduZWQgaW50IGNodW5rX3NpemUsIHVpbnQzMl90IGNyYzMyKQoreworCXVpbnQzMl90IGZpbGVfY3JjMzI7CisJaW50IHJldDsKKworCWlmIChjaHVua19zaXplICE9IHNpemVvZihmaWxlX2NyYzMyKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWFkX2FsbChmZCwgJmZpbGVfY3JjMzIsIHNpemVvZihmaWxlX2NyYzMyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZmlsZV9jcmMzMiAhPSBjcmMzMikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2NodW5rKHN0cnVjdCBzcGFyc2VfZmlsZSAqcywgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKwkJdW5zaWduZWQgaW50IGNodW5rX2hkcl9zeiwgY2h1bmtfaGVhZGVyX3QgKmNodW5rX2hlYWRlciwKKwkJdW5zaWduZWQgaW50IGN1cl9ibG9jaywgdWludDMyX3QgKmNyY19wdHIpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY2h1bmtfZGF0YV9zaXplOworCisJY2h1bmtfZGF0YV9zaXplID0gY2h1bmtfaGVhZGVyLT50b3RhbF9zeiAtIGNodW5rX2hkcl9zejsKKworCXN3aXRjaCAoY2h1bmtfaGVhZGVyLT5jaHVua190eXBlKSB7CisJCWNhc2UgQ0hVTktfVFlQRV9SQVc6CisJCQlyZXQgPSBwcm9jZXNzX3Jhd19jaHVuayhzLCBjaHVua19kYXRhX3NpemUsIGZkLCBvZmZzZXQsCisJCQkJCWNodW5rX2hlYWRlci0+Y2h1bmtfc3osIGN1cl9ibG9jaywgY3JjX3B0cik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXZlcmJvc2VfZXJyb3Iocy0+dmVyYm9zZSwgcmV0LCAiZGF0YSBibG9jayBhdCAlbGxkIiwgb2Zmc2V0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJcmV0dXJuIGNodW5rX2hlYWRlci0+Y2h1bmtfc3o7CisJCWNhc2UgQ0hVTktfVFlQRV9GSUxMOgorCQkJcmV0ID0gcHJvY2Vzc19maWxsX2NodW5rKHMsIGNodW5rX2RhdGFfc2l6ZSwgZmQsCisJCQkJCWNodW5rX2hlYWRlci0+Y2h1bmtfc3osIGN1cl9ibG9jaywgY3JjX3B0cik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXZlcmJvc2VfZXJyb3Iocy0+dmVyYm9zZSwgcmV0LCAiZmlsbCBibG9jayBhdCAlbGxkIiwgb2Zmc2V0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJcmV0dXJuIGNodW5rX2hlYWRlci0+Y2h1bmtfc3o7CisJCWNhc2UgQ0hVTktfVFlQRV9ET05UX0NBUkU6CisJCQlyZXQgPSBwcm9jZXNzX3NraXBfY2h1bmsocywgY2h1bmtfZGF0YV9zaXplLCBmZCwKKwkJCQkJY2h1bmtfaGVhZGVyLT5jaHVua19zeiwgY3VyX2Jsb2NrLCBjcmNfcHRyKTsKKwkJCWlmIChjaHVua19kYXRhX3NpemUgIT0gMCkgeworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCXZlcmJvc2VfZXJyb3Iocy0+dmVyYm9zZSwgcmV0LCAic2tpcCBibG9jayBhdCAlbGxkIiwgb2Zmc2V0KTsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gY2h1bmtfaGVhZGVyLT5jaHVua19zejsKKwkJY2FzZSBDSFVOS19UWVBFX0NSQzMyOgorCQkJcmV0ID0gcHJvY2Vzc19jcmMzMl9jaHVuayhmZCwgY2h1bmtfZGF0YV9zaXplLCAqY3JjX3B0cik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXZlcmJvc2VfZXJyb3Iocy0+dmVyYm9zZSwgLUVJTlZBTCwgImNyYyBibG9jayBhdCAlbGxkIiwKKwkJCQkJCW9mZnNldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCXJldHVybiAwOworCQlkZWZhdWx0OgorCQkJdmVyYm9zZV9lcnJvcihzLT52ZXJib3NlLCAtRUlOVkFMLCAidW5rbm93biBibG9jayAlMDRYIGF0ICVsbGQiLAorCQkJCQljaHVua19oZWFkZXItPmNodW5rX3R5cGUsIG9mZnNldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BhcnNlX2ZpbGVfcmVhZF9zcGFyc2Uoc3RydWN0IHNwYXJzZV9maWxlICpzLCBpbnQgZmQsIGJvb2wgY3JjKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGk7CisJc3BhcnNlX2hlYWRlcl90IHNwYXJzZV9oZWFkZXI7CisJY2h1bmtfaGVhZGVyX3QgY2h1bmtfaGVhZGVyOworCXVpbnQzMl90IGNyYzMyID0gMDsKKwl1aW50MzJfdCAqY3JjX3B0ciA9IDA7CisJdW5zaWduZWQgaW50IGN1cl9ibG9jayA9IDA7CisJb2ZmNjRfdCBvZmZzZXQ7CisKKwlpZiAoIWNvcHlidWYpIHsKKwkJY29weWJ1ZiA9IG1hbGxvYyhDT1BZX0JVRl9TSVpFKTsKKwl9CisKKwlpZiAoIWNvcHlidWYpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGNyYykgeworCQljcmNfcHRyID0gJmNyYzMyOworCX0KKworCXJldCA9IHJlYWRfYWxsKGZkLCAmc3BhcnNlX2hlYWRlciwgc2l6ZW9mKHNwYXJzZV9oZWFkZXIpKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChzcGFyc2VfaGVhZGVyLm1hZ2ljICE9IFNQQVJTRV9IRUFERVJfTUFHSUMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNwYXJzZV9oZWFkZXIubWFqb3JfdmVyc2lvbiAhPSBTUEFSU0VfSEVBREVSX01BSk9SX1ZFUikgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3BhcnNlX2hlYWRlci5maWxlX2hkcl9zeiA8IFNQQVJTRV9IRUFERVJfTEVOKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzcGFyc2VfaGVhZGVyLmNodW5rX2hkcl9zeiA8IHNpemVvZihjaHVua19oZWFkZXIpKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzcGFyc2VfaGVhZGVyLmZpbGVfaGRyX3N6ID4gU1BBUlNFX0hFQURFUl9MRU4pIHsKKwkJLyogU2tpcCB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIGEgaGVhZGVyIHRoYXQgaXMgbG9uZ2VyIHRoYW4KKwkJICogd2UgZXhwZWN0ZWQuCisJCSAqLworCQlsc2VlazY0KGZkLCBzcGFyc2VfaGVhZGVyLmZpbGVfaGRyX3N6IC0gU1BBUlNFX0hFQURFUl9MRU4sIFNFRUtfQ1VSKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc3BhcnNlX2hlYWRlci50b3RhbF9jaHVua3M7IGkrKykgeworCQlyZXQgPSByZWFkX2FsbChmZCwgJmNodW5rX2hlYWRlciwgc2l6ZW9mKGNodW5rX2hlYWRlcikpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmIChzcGFyc2VfaGVhZGVyLmNodW5rX2hkcl9zeiA+IENIVU5LX0hFQURFUl9MRU4pIHsKKwkJCS8qIFNraXAgdGhlIHJlbWFpbmluZyBieXRlcyBpbiBhIGhlYWRlciB0aGF0IGlzIGxvbmdlciB0aGFuCisJCQkgKiB3ZSBleHBlY3RlZC4KKwkJCSAqLworCQkJbHNlZWs2NChmZCwgc3BhcnNlX2hlYWRlci5jaHVua19oZHJfc3ogLSBDSFVOS19IRUFERVJfTEVOLCBTRUVLX0NVUik7CisJCX0KKworCQlvZmZzZXQgPSBsc2VlazY0KGZkLCAwLCBTRUVLX0NVUik7CisKKwkJcmV0ID0gcHJvY2Vzc19jaHVuayhzLCBmZCwgb2Zmc2V0LCBzcGFyc2VfaGVhZGVyLmNodW5rX2hkcl9zeiwgJmNodW5rX2hlYWRlciwKKwkJCQljdXJfYmxvY2ssIGNyY19wdHIpOworCQlpZiAocmV0IDwgMCkgeworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWN1cl9ibG9jayArPSByZXQ7CisJfQorCisJaWYgKHNwYXJzZV9oZWFkZXIudG90YWxfYmxrcyAhPSBjdXJfYmxvY2spIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3BhcnNlX2ZpbGVfcmVhZF9ub3JtYWwoc3RydWN0IHNwYXJzZV9maWxlICpzLCBpbnQgZmQpCit7CisJaW50IHJldDsKKwl1aW50MzJfdCAqYnVmID0gbWFsbG9jKHMtPmJsb2NrX3NpemUpOworCXVuc2lnbmVkIGludCBibG9jayA9IDA7CisJaW50NjRfdCByZW1haW4gPSBzLT5sZW47CisJaW50NjRfdCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGludCB0b19yZWFkOworCXVuc2lnbmVkIGludCBpOworCWJvb2wgc3BhcnNlX2Jsb2NrOworCisJaWYgKCFidWYpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2hpbGUgKHJlbWFpbiA+IDApIHsKKwkJdG9fcmVhZCA9IG1pbihyZW1haW4sIHMtPmJsb2NrX3NpemUpOworCQlyZXQgPSByZWFkX2FsbChmZCwgYnVmLCB0b19yZWFkKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVycm9yKCJmYWlsZWQgdG8gcmVhZCBzcGFyc2UgZmlsZSIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICh0b19yZWFkID09IHMtPmJsb2NrX3NpemUpIHsKKwkJCXNwYXJzZV9ibG9jayA9IHRydWU7CisJCQlmb3IgKGkgPSAxOyBpIDwgcy0+YmxvY2tfc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7IGkrKykgeworCQkJCWlmIChidWZbMF0gIT0gYnVmW2ldKSB7CisJCQkJCXNwYXJzZV9ibG9jayA9IGZhbHNlOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlzcGFyc2VfYmxvY2sgPSBmYWxzZTsKKwkJfQorCisJCWlmIChzcGFyc2VfYmxvY2spIHsKKwkJCS8qIFRPRE86IGFkZCBmbGFnIHRvIHVzZSBza2lwIGluc3RlYWQgb2YgZmlsbCBmb3IgYnVmWzBdID09IDAgKi8KKwkJCXNwYXJzZV9maWxlX2FkZF9maWxsKHMsIGJ1ZlswXSwgdG9fcmVhZCwgYmxvY2spOworCQl9IGVsc2UgeworCQkJc3BhcnNlX2ZpbGVfYWRkX2ZkKHMsIGZkLCBvZmZzZXQsIHRvX3JlYWQsIGJsb2NrKTsKKwkJfQorCisJCXJlbWFpbiAtPSB0b19yZWFkOworCQlvZmZzZXQgKz0gdG9fcmVhZDsKKwkJYmxvY2srKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNwYXJzZV9maWxlX3JlYWQoc3RydWN0IHNwYXJzZV9maWxlICpzLCBpbnQgZmQsIGJvb2wgc3BhcnNlLCBib29sIGNyYykKK3sKKwlpZiAoY3JjICYmICFzcGFyc2UpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNwYXJzZSkgeworCQlyZXR1cm4gc3BhcnNlX2ZpbGVfcmVhZF9zcGFyc2UocywgZmQsIGNyYyk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNwYXJzZV9maWxlX3JlYWRfbm9ybWFsKHMsIGZkKTsKKwl9Cit9CisKK3N0cnVjdCBzcGFyc2VfZmlsZSAqc3BhcnNlX2ZpbGVfaW1wb3J0KGludCBmZCwgYm9vbCB2ZXJib3NlLCBib29sIGNyYykKK3sKKwlpbnQgcmV0OworCXNwYXJzZV9oZWFkZXJfdCBzcGFyc2VfaGVhZGVyOworCWludDY0X3QgbGVuOworCXN0cnVjdCBzcGFyc2VfZmlsZSAqczsKKworCXJldCA9IHJlYWRfYWxsKGZkLCAmc3BhcnNlX2hlYWRlciwgc2l6ZW9mKHNwYXJzZV9oZWFkZXIpKTsKKwlpZiAocmV0IDwgMCkgeworCQl2ZXJib3NlX2Vycm9yKHZlcmJvc2UsIHJldCwgImhlYWRlciIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc3BhcnNlX2hlYWRlci5tYWdpYyAhPSBTUEFSU0VfSEVBREVSX01BR0lDKSB7CisJCXZlcmJvc2VfZXJyb3IodmVyYm9zZSwgLUVJTlZBTCwgImhlYWRlciBtYWdpYyIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoc3BhcnNlX2hlYWRlci5tYWpvcl92ZXJzaW9uICE9IFNQQVJTRV9IRUFERVJfTUFKT1JfVkVSKSB7CisJCXZlcmJvc2VfZXJyb3IodmVyYm9zZSwgLUVJTlZBTCwgImhlYWRlciBtYWpvciB2ZXJzaW9uIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChzcGFyc2VfaGVhZGVyLmZpbGVfaGRyX3N6IDwgU1BBUlNFX0hFQURFUl9MRU4pIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKHNwYXJzZV9oZWFkZXIuY2h1bmtfaGRyX3N6IDwgc2l6ZW9mKGNodW5rX2hlYWRlcl90KSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsZW4gPSAoaW50NjRfdClzcGFyc2VfaGVhZGVyLnRvdGFsX2Jsa3MgKiBzcGFyc2VfaGVhZGVyLmJsa19zejsKKwlzID0gc3BhcnNlX2ZpbGVfbmV3KHNwYXJzZV9oZWFkZXIuYmxrX3N6LCBsZW4pOworCWlmICghcykgeworCQl2ZXJib3NlX2Vycm9yKHZlcmJvc2UsIC1FSU5WQUwsIE5VTEwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBsc2VlazY0KGZkLCAwLCBTRUVLX1NFVCk7CisJaWYgKHJldCA8IDApIHsKKwkJdmVyYm9zZV9lcnJvcih2ZXJib3NlLCByZXQsICJzZWVraW5nIik7CisJCXNwYXJzZV9maWxlX2Rlc3Ryb3kocyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXMtPnZlcmJvc2UgPSB2ZXJib3NlOworCisJcmV0ID0gc3BhcnNlX2ZpbGVfcmVhZChzLCBmZCwgdHJ1ZSwgY3JjKTsKKwlpZiAocmV0IDwgMCkgeworCQlzcGFyc2VfZmlsZV9kZXN0cm95KHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gczsKK30KKworc3RydWN0IHNwYXJzZV9maWxlICpzcGFyc2VfZmlsZV9pbXBvcnRfYXV0byhpbnQgZmQsIGJvb2wgY3JjKQoreworCXN0cnVjdCBzcGFyc2VfZmlsZSAqczsKKwlpbnQ2NF90IGxlbjsKKwlpbnQgcmV0OworCisJcyA9IHNwYXJzZV9maWxlX2ltcG9ydChmZCwgdHJ1ZSwgY3JjKTsKKwlpZiAocykgeworCQlyZXR1cm4gczsKKwl9CisKKwlsZW4gPSBsc2VlazY0KGZkLCAwLCBTRUVLX0VORCk7CisJaWYgKGxlbiA8IDApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbHNlZWs2NChmZCwgMCwgU0VFS19TRVQpOworCisJcyA9IHNwYXJzZV9maWxlX25ldyg0MDk2LCBsZW4pOworCWlmICghcykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXQgPSBzcGFyc2VfZmlsZV9yZWFkX25vcm1hbChzLCBmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJc3BhcnNlX2ZpbGVfZGVzdHJveShzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHM7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnV1aWQubWsgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYnV1aWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2MmRiNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlidXVpZC5tawpAQCAtMCwwICsxLDI5IEBACisjIEJ1aWxkIHJ1bGVzIGZvciB0aGUgc3RhdGljIFVVSUQgcHJlYnVpbHQgbGlicmFyeSAoTGludXggb25seSkuCisjIEZvciBXaW5kb3dzIHdlIG5lZWQgdG8gbGluayB0byB0aGUgUnBjcnQ0LmxpYiBmb3IgdGhlIHNldCBvZiBHdWlkIGZ1bmN0aW9ucy4KKyMgTWFjIGhhcyBhbiBvbncgcHJlaW5zdGFsbGVkIHZlcnNpb24gb2YgbGlidXVkOyB1c2luZyBsaWJ1dWlkIGJyZWFrcyBzb21ld2hlcmUKKyMgIGRlZXAgaW4gQ29jb2EgaGVhZGVycworCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksbGludXgpCisKK0xJQlVVSURfT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitMSUJVVUlEX1RPUF9ESVIgOj0gJChMSUJVVUlEX1BSRUJVSUxUU19ESVIpLyQoQlVJTERfVEFSR0VUX1RBRykKKworJChjYWxsIGRlZmluZS1lbXVsYXRvci1wcmVidWlsdC1saWJyYXJ5LFwKKyAgICBlbXVsYXRvci1saWJ1dWlkLFwKKyAgICAkKExJQlVVSURfVE9QX0RJUikvbGliL2xpYnV1aWQuYSkKKworTElCVVVJRF9JTkNMVURFUyA6PSAkKExJQlVVSURfVE9QX0RJUikvaW5jbHVkZQorTElCVVVJRF9TVEFUSUNfTElCUkFSSUVTIDo9IGVtdWxhdG9yLWxpYnV1aWQKK0xJQlVVSURfTERMSUJTIDo9CisKK0xPQ0FMX1BBVEggOj0gJChMSUJVVUlEX09MRF9MT0NBTF9QQVRIKQorCitlbmRpZgorCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKKworTElCVVVJRF9MRExJQlMgOj0gLWxycGNydDQKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUudHh0IGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZGQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMyBAQAorVGhlIGZpbGVzIHVuZGVyIHRoaXJkcGFydHkvIHdlcmUgY29waWVkIGZyb20KKyAgICBnb29nbGUzL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAKKzIwMTYtMTAtMTIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9sb2Fkd2VicC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xvYWR3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhMzJiNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9sb2Fkd2VicC5jCkBAIC0wLDAgKzEsMTY5IEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyoqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisqKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorKioKKyoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2RlY29kZS5oIgorCisjaWYgMAorI2RlZmluZSBMT0coeC4uLikgZnByaW50ZihzdGRlcnIsIldlYlAgZGVjb2RlIGVycm9yOiAiIHgpCisjZWxzZQorI2RlZmluZSBMT0coeC4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gcmVhZFdlYlAKKy8vCisvLyBEZWNvZGUgYSBXZWJQLWNvbXByZXNzZWQgaW1hZ2UgZnJvbSBtZW1vcnksIHByb2R1Y2luZyBSR0JBCisvLworLy8gSW5wdXQ6CisvLyAgICAgfGJhc2V8ICBBZGRyZXNzIG9mIHRoZSBXZWJQIGltYWdlIGluIG1lbW9yeQorLy8gICAgIHxzaXplfCAgTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBXZWJQIGltYWdlCisvLworLy8gT3V0cHV0OgorLy8gICAgIHxwV2lkdGh8ICAgVGhlIHdpZHRoIG9mIHRoZSBkZWNvZGVkIGltYWdlCisvLyAgICAgfHBIZWlnaHR8ICBUaGUgaGVpZ2h0IG9mIHRoZSBkZWNvZGVkIGltYWdlCisvLworLy8gUmV0dXJuIHZhbHVlOiBJZiBzdWNjZXNzZnVsLCB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vICAgICAgICAgICAgICAgbWFsbG9jJ2QgYnVmZmVyIHRoYXQgaG9sZHMgdGhlCisvLyAgICAgICAgICAgICAgIGRlY29kZWQgUkdCQSBkYXRhCisvLyAgICAgICAgICAgICAgIElmIHVuc3VjY2Vzc2Z1bCwgMAorCit2b2lkKiByZWFkV2ViUChjb25zdCB1bnNpZ25lZCBjaGFyKiAgYmFzZSwgc2l6ZV90ICBzaXplLAorICAgICAgICAgICAgICAgdW5zaWduZWQgKnBXaWR0aCwgdW5zaWduZWQgKnBIZWlnaHQpCit7CisgICAgV2ViUERlY29kZXJDb25maWcgd2VicENvbmZpZzsKKyAgICBWUDhTdGF0dXNDb2RlICAgICBkZWNvZGVTdGF0dXM7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICpwV2lkdGggID0gMDsKKyAgICAqcEhlaWdodCA9IDA7CisKKyAgICAvLyBDb25maWd1cmUgdGhlIGRlY29kZXIgZm9yIFJHQkEgb3V0cHV0CisgICAgbWVtc2V0KCZ3ZWJwQ29uZmlnLCAwLCBzaXplb2Yod2VicENvbmZpZykpOworICAgIHdlYnBDb25maWcub3V0cHV0LmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7CisKKyAgICAvLyBEZWNvZGUgdG8gUkdCQQorICAgIGRlY29kZVN0YXR1cyA9IFdlYlBEZWNvZGUoYmFzZSwgc2l6ZSwgJndlYnBDb25maWcpOworICAgIGlmIChkZWNvZGVTdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgICAgICBMT0coIldlYlBEZWNvZGUoKSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzCisKKyAgICAqcFdpZHRoICA9IHdlYnBDb25maWcub3V0cHV0LndpZHRoOworICAgICpwSGVpZ2h0ID0gd2VicENvbmZpZy5vdXRwdXQuaGVpZ2h0OworICAgIHJldHVybiAodm9pZCopd2VicENvbmZpZy5vdXRwdXQudS5SR0JBLnJnYmE7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIGxvYWRXZWJQCisvLworLy8gRGVjb2RlIGEgV2ViUC1jb21wcmVzc2VkIGltYWdlIGZyb20gYSBmaWxlLCBwcm9kdWNpbmcgUkdCQQorLy8KKy8vIElucHV0OgorLy8gICAgIHxmaWxlTmFtZXwgIFBhdGggYW5kIG5hbWUgb2YgdGhlIFdlYlAgZmlsZQorLy8KKy8vIE91dHB1dDoKKy8vICAgICB8cFdpZHRofCAgIFRoZSB3aWR0aCBvZiB0aGUgZGVjb2RlZCBpbWFnZQorLy8gICAgIHxwSGVpZ2h0fCAgVGhlIGhlaWdodCBvZiB0aGUgZGVjb2RlIGltYWdlCisvLworLy8gUmV0dXJuIHZhbHVlOiBJZiBzdWNjZXNzZnVsLCB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vICAgICAgICAgICAgICAgbWFsbG9jJ2QgYnVmZmVyIHRoYXQgaG9sZHMgdGhlCisvLyAgICAgICAgICAgICAgIGRlY29kZWQgUkdCQSBkYXRhCisvLyAgICAgICAgICAgICAgIElmIHVuc3VjY2Vzc2Z1bCwgMAorCisjZGVmaW5lIEhFQURFUl9TSVpFIDEyCisKK3ZvaWQqIGxvYWRXZWJQKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCB1bnNpZ25lZCAqcFdpZHRoLCB1bnNpZ25lZCAqcEhlaWdodCkgeworICAgIGludCAgICAgICAgICAgICAgIGJ5dGVzUmVhZDsKKyAgICBpbnQgICAgICAgICAgICAgICBmaWxlU2l6ZTsKKyAgICBzdHJ1Y3Qgc3RhdCAgICAgICBmaWxlU3RhdHVzOworICAgIEZJTEUqICAgICAgICAgICAgIGZwOworICAgIHZvaWQqICAgICAgICAgICAgIHJnYmFBZGRyOworICAgIHVpbnQ4X3QqICAgICAgICAgIHdlYnBCeXRlczsKKyAgICB1aW50OF90ICAgICAgICAgICB3ZWJwSGVhZGVyW0hFQURFUl9TSVpFXTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgKnBXaWR0aCAgPSAwOworICAgICpwSGVpZ2h0ID0gMDsKKworICAgIC8vIEdldCB0aGUgZmlsZSBzaXplCisgICAgaWYgKHN0YXQoZmlsZU5hbWUsICZmaWxlU3RhdHVzKSAhPSAwKSB7CisgICAgICAgIExPRygiQ291bGQgbm90IHN0YXR1cyBmaWxlOiAlc1xuIiwgZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmlsZVNpemUgPSBmaWxlU3RhdHVzLnN0X3NpemU7CisgICAgaWYgKGZpbGVTaXplIDwgSEVBREVSX1NJWkUpIHsKKyAgICAgICAgTE9HKCJXZWJQIGZpbGUgaXMgd2F5IHRvbyBzbWFsbDogJXNcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGludG8gbWVtb3J5CisgICAgZnAgPSBmb3BlbihmaWxlTmFtZSwgInJiIik7CisgICAgaWYoZnAgPT0gMCkgeworICAgICAgICBMT0coIkZhaWxlZCB0byBvcGVuIGZpbGU6ICVzXG4iLCBmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBieXRlc1JlYWQgPSBmcmVhZCh3ZWJwSGVhZGVyLCAxLCBIRUFERVJfU0laRSwgZnApOworICAgIGlmIChieXRlc1JlYWQgIT0gSEVBREVSX1NJWkUpIHsKKyAgICAgICAgTE9HKCJGYWlsZWQgdG8gcmVhZCBoZWFkZXIgb2YgZmlsZTogJXNcbiIsIGZpbGVOYW1lKTsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIFZlcmlmeSB0aGF0IGl0IGlzIHByb2JhYmx5IFdlYlAKKyAgICBpZiAod2VicEhlYWRlclsgMF0gIT0gJ1InIHx8CisgICAgICAgIHdlYnBIZWFkZXJbIDFdICE9ICdJJyB8fAorICAgICAgICB3ZWJwSGVhZGVyWyAyXSAhPSAnRicgfHwKKyAgICAgICAgd2VicEhlYWRlclsgM10gIT0gJ0YnIHx8CisgICAgICAgIHdlYnBIZWFkZXJbIDhdICE9ICdXJyB8fAorICAgICAgICB3ZWJwSGVhZGVyWyA5XSAhPSAnRScgfHwKKyAgICAgICAgd2VicEhlYWRlclsxMF0gIT0gJ0InIHx8CisgICAgICAgIHdlYnBIZWFkZXJbMTFdICE9ICdQJyAgICkKKyAgICB7CisgICAgICAgIExPRygiTm90IGEgV2ViUCBmaWxlOiAlc1xuIiwgZmlsZU5hbWUpOworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV3aW5kKGZwKTsKKworICAgIC8vIFJlYWQgdGhlIGVudGlyZSBmaWxlIGludG8gbWVtb3J5CisgICAgd2VicEJ5dGVzID0gbWFsbG9jKGZpbGVTaXplKTsKKyAgICBpZiAod2VicEJ5dGVzID09IE5VTEwpIHsKKyAgICAgICAgTE9HKCJtYWxsb2MoJWQpIGZhaWxlZFxuIiwgZmlsZVNpemUpOworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBieXRlc1JlYWQgPSBmcmVhZCh3ZWJwQnl0ZXMsIDEsIGZpbGVTaXplLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAoYnl0ZXNSZWFkICE9IGZpbGVTaXplKSB7CisgICAgICAgIExPRygiRmFpbGVkIHRvIHJlYWQgY29udGVudHMgb2YgZmlsZSAlc1xuIiwgZmlsZU5hbWUpOworICAgICAgICBmcmVlKHdlYnBCeXRlcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJnYmFBZGRyID0gcmVhZFdlYlAod2VicEJ5dGVzLCBmaWxlU2l6ZSwgcFdpZHRoLCBwSGVpZ2h0KTsKKworICAgIC8vIEZyZWUgdGhlIGZpbGUgZGF0YS4gS2VlcCB0aGUgcGl4ZWwgZGF0YS4KKyAgICBmcmVlKHdlYnBCeXRlcyk7CisKKyAgICByZXR1cm4gcmdiYUFkZHI7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvc291cmNlcy5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC9zb3VyY2VzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTdkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvc291cmNlcy5tawpAQCAtMCwwICsxLDExNiBAQAorIyBCdWlsZCBmaWxlIGZvciBsaWJ3ZWJwCisKKyMgVXBkYXRlIExPQ0FMX1BBVEggYWZ0ZXIgc2F2aW5nIG9sZCB2YWx1ZS4KK0xJQldFQlBfT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitMSUJXRUJQX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1saWJ3ZWJwKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGxvYWR3ZWJwLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2FscGhhLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2J1ZmZlci5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9mcmFtZS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9pZGVjLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2lvLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3F1YW50LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3RyZWUuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGwuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicC5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hcmdiLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2JfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYXJnYl9zc2UyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3QuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY29zdF9taXBzMzIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY29zdF9taXBzX2RzcF9yMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb3N0X3NzZTIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY3B1LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlYy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfY2xpcF90YWJsZXMuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX21pcHMzMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX21zYS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfc3NlMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfc3NlNDEuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19hdngyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19taXBzMzIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX21pcHNfZHNwX3IyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19zc2UyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19zc2U0MS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9maWx0ZXJzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZmlsdGVyc19zc2UyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuYy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfbWlwczMyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3Nfc3NlMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9yZXNjYWxlci5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9yZXNjYWxlcl9taXBzMzIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfc3NlMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvdXBzYW1wbGluZ19zc2UyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXZfbWlwczMyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1dl9taXBzX2RzcF9yMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXZfc3NlMi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9hbHBoYS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9hbmFseXNpcy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2NvbmZpZy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvZmlsdGVyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2ZyYW1lLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9pdGVyYXRvci5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9uZWFyX2xvc3NsZXNzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3BpY3R1cmUuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9jc3AuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9wc25yLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3BpY3R1cmVfcmVzY2FsZS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX3Rvb2xzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3F1YW50LmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3N5bnRheC5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy90b2tlbi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy90cmVlLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGwuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvd2VicGVuYy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuYyBcCisgICAgdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9maWx0ZXJzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbi5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5jIFwKKyAgICB0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmMgXAorICAgIHRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuYyBcCisKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExJQldFQlBfSU5DTFVERVMpICQoTE9DQUxfUEFUSCkvc3JjCisKK2lmZXEgKHdpbmRvd3MsJChCVUlMRF9UQVJHRVRfT1MpKQorTE9DQUxfQ0ZMQUdTIDo9IC1EVVNFX01JTkdXPTEKK2VuZGlmCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworIyBSZXNldCBMT0NBTF9QQVRIIGJlZm9yZSBleGl0aW5nIHRoaXMgYnVpbGQgZmlsZS4KK0xPQ0FMX1BBVEggOj0gJChMSUJXRUJQX09MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvQlVJTEQgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9CVUlMRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVhODA2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvQlVJTEQKQEAgLTAsMCArMSw3NzYgQEAKK2xpY2Vuc2VzKFsibm90aWNlIl0pCisKK2V4cG9ydHNfZmlsZXMoWyJMSUNFTlNFIl0pCisKK3BhY2thZ2UoCisgICAgZGVmYXVsdF92aXNpYmlsaXR5ID0gWworICAgICAgICAiOmhlYWRsZXNzX2Nocm9taXVtIiwKKyAgICAgICAgIi8vaHRtbHJlbmRlci9jaHJvbWl1bV9oZWFkbGVzczpfX2ZyaWVuZHNfXyIsCisgICAgXSwKKykKKworcGFja2FnZV9ncm91cCgKKyAgICBuYW1lID0gImhlYWRsZXNzX2Nocm9taXVtIiwKKyAgICBwYWNrYWdlcyA9IFsKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvLi4uIiwKKyAgICBdLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAiaGVhZGVycyIsCisgICAgdGV4dHVhbF9oZHJzID0gWworICAgICAgICAiZGVjL2FscGhhaS5oIiwKKyAgICAgICAgImRlYy9jb21tb24uaCIsCisgICAgICAgICJkZWMvZGVjb2RlX3ZwOC5oIiwKKyAgICAgICAgImRlYy92cDhpLmgiLAorICAgICAgICAiZGVjL3ZwOGxpLmgiLAorICAgICAgICAiZGVjL3dlYnBpLmgiLAorICAgICAgICAiZHNwL2NvbW1vbl9zc2UyLmgiLAorICAgICAgICAiZHNwL2RzcC5oIiwKKyAgICAgICAgImRzcC9sb3NzbGVzcy5oIiwKKyAgICAgICAgImRzcC95dXYuaCIsCisgICAgICAgICJlbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oIiwKKyAgICAgICAgImVuYy9jb3N0LmgiLAorICAgICAgICAiZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uaCIsCisgICAgICAgICJlbmMvaGlzdG9ncmFtLmgiLAorICAgICAgICAiZW5jL3ZwOGVuY2kuaCIsCisgICAgICAgICJlbmMvdnA4bGkuaCIsCisgICAgICAgICJ1dGlscy9iaXRfcmVhZGVyLmgiLAorICAgICAgICAidXRpbHMvYml0X3JlYWRlcl9pbmwuaCIsCisgICAgICAgICJ1dGlscy9iaXRfd3JpdGVyLmgiLAorICAgICAgICAidXRpbHMvY29sb3JfY2FjaGUuaCIsCisgICAgICAgICJ1dGlscy9lbmRpYW5faW5sLmgiLAorICAgICAgICAidXRpbHMvZmlsdGVycy5oIiwKKyAgICAgICAgInV0aWxzL2h1ZmZtYW4uaCIsCisgICAgICAgICJ1dGlscy9odWZmbWFuX2VuY29kZS5oIiwKKyAgICAgICAgInV0aWxzL3F1YW50X2xldmVscy5oIiwKKyAgICAgICAgInV0aWxzL3F1YW50X2xldmVsc19kZWMuaCIsCisgICAgICAgICJ1dGlscy9yYW5kb20uaCIsCisgICAgICAgICJ1dGlscy9yZXNjYWxlci5oIiwKKyAgICAgICAgInV0aWxzL3RocmVhZC5oIiwKKyAgICAgICAgInV0aWxzL3V0aWxzLmgiLAorICAgICAgICAid2VicC9kZWNvZGUuaCIsCisgICAgICAgICJ3ZWJwL2RlbXV4LmgiLAorICAgICAgICAid2VicC9lbmNvZGUuaCIsCisgICAgICAgICJ3ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIsCisgICAgICAgICJ3ZWJwL211eF90eXBlcy5oIiwKKyAgICAgICAgIndlYnAvdHlwZXMuaCIsCisgICAgXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImxpYndlYnBfZGVjIiwKKyAgICBzcmNzID0gWworICAgICAgICAiZGVjL2FscGhhLmMiLAorICAgICAgICAiZGVjL2J1ZmZlci5jIiwKKyAgICAgICAgImRlYy9mcmFtZS5jIiwKKyAgICAgICAgImRlYy9pZGVjLmMiLAorICAgICAgICAiZGVjL2lvLmMiLAorICAgICAgICAiZGVjL3F1YW50LmMiLAorICAgICAgICAiZGVjL3RyZWUuYyIsCisgICAgICAgICJkZWMvdnA4LmMiLAorICAgICAgICAiZGVjL3ZwOGwuYyIsCisgICAgICAgICJkZWMvd2VicC5jIiwKKyAgICBdLAorICAgIGNvcHRzID0gWworICAgICAgICAiLVhnY2Mtb25seT0tdyIsCisgICAgICAgICItWGdjYy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1mbm8tc3RyaWN0LWFsaWFzaW5nIiwKKyAgICAgICAgIi0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQiLAorICAgICAgICAiLWZzdGFjay1wcm90ZWN0b3IiLAorICAgICAgICAiLWZ1bndpbmQtdGFibGVzIiwKKyAgICAgICAgIi1mUElDIiwKKyAgICAgICAgIi1waXBlIiwKKyAgICAgICAgIi1mY29sb3ItZGlhZ25vc3RpY3MiLAorICAgICAgICAiLXB0aHJlYWQiLAorICAgICAgICAiLW02NCIsCisgICAgICAgICItbWFyY2g9eDg2LTY0IiwKKyAgICAgICAgIi1mbm8taWRlbnQiLAorICAgICAgICAiLWZkYXRhLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mZnVuY3Rpb24tc2VjdGlvbnMiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdoZWFkZXItaHlnaWVuZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdzdHJpbmctY29udmVyc2lvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdlcnJvciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdhbGwiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bmRlZmluZWQtdmFyLXRlbXBsYXRlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW5vbnBvcnRhYmxlLWluY2x1ZGUtcGF0aCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1hZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMiLAorICAgICAgICAiLVduby12bGEiLAorICAgICAgICAiLVdhLC0tbm9leGVjc3RhY2siLAorICAgICAgICAiLURESVNBQkxFX0dPT0dMRV9HTE9CQUxfVVNJTkdfREVDTEFSQVRJT05TIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfU1RSSU5HIiwKKyAgICAgICAgIi1ER09PR0xFX1RZUEVTX0lOQ09NUEFUSUJJTElUWSIsCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICAgICAgIi1ERU5BQkxFX01ETlM9MSIsCisgICAgICAgICItREVOQUJMRV9OT1RJRklDQVRJT05TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BFUFBFUl9DRE1TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BMVUdJTlM9MSIsCisgICAgICAgICItREVOQUJMRV9QREY9MSIsCisgICAgICAgICItREVOQUJMRV9TUEVMTENIRUNLPTEiLAorICAgICAgICAiLURVSV9DT01QT1NJVE9SX0lNQUdFX1RSQU5TUE9SVCIsCisgICAgICAgICItRFVTRV9BVVJBPTEiLAorICAgICAgICAiLURVU0VfREVGQVVMVF9SRU5ERVJfVEhFTUU9MSIsCisgICAgICAgICItRFVTRV9OU1NfQ0VSVFM9MSIsCisgICAgICAgICItRFVTRV9PWk9ORT0xIiwKKyAgICAgICAgIi1ETk9fVENNQUxMT0MiLAorICAgICAgICAiLURFTkFCTEVfV0VCUlRDPTEiLAorICAgICAgICAiLURESVNBQkxFX05BQ0wiLAorICAgICAgICAiLURFTkFCTEVfRVhURU5TSU9OUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RBU0tfTUFOQUdFUj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RIRU1FUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0NBUFRJVkVfUE9SVEFMX0RFVEVDVElPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFU1NJT05fU0VSVklDRT0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NVUEVSVklTRURfVVNFUlM9MSIsCisgICAgICAgICItREVOQUJMRV9TRVJWSUNFX0RJU0NPVkVSWT0xIiwKKyAgICAgICAgIi1ERlVMTF9TQUZFX0JST1dTSU5HIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19DU0QiLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0RCX0xPQ0FMIiwKKyAgICAgICAgIi1EQ0hST01JVU1fQlVJTEQiLAorICAgICAgICAiLURFTkFCTEVfTUVESUFfUk9VVEVSPTEiLAorICAgICAgICAiLURGSUVMRFRSSUFMX1RFU1RJTkdfRU5BQkxFRCIsCisgICAgICAgICItRENSX0NMQU5HX1JFVklTSU9OPTI4MjA5Ny0xIiwKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLURfTEFSR0VGSUxFX1NPVVJDRSIsCisgICAgICAgICItRF9MQVJHRUZJTEU2NF9TT1VSQ0UiLAorICAgICAgICAiLURDT01QT05FTlRfQlVJTEQiLAorICAgICAgICAiLURDSFJPTUlVTV9OREVCVUciLAorICAgICAgICAiLUROREVCVUciLAorICAgICAgICAiLUROVkFMR1JJTkQiLAorICAgICAgICAiLUREWU5BTUlDX0FOTk9UQVRJT05TX0VOQUJMRUQ9MCIsCisgICAgXSwKKyAgICBsaW5rc3RhdGljID0gMSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmhlYWRlcnMiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmxpYndlYnBfZHNwIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicDpsaWJ3ZWJwX3V0aWxzIiwKKyAgICBdLAorICAgIGFsd2F5c2xpbmsgPSAxLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAibGlid2VicF9kZW11eCIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImRlbXV4L2RlbXV4LmMiLAorICAgIF0sCisgICAgY29wdHMgPSBbCisgICAgICAgICItWGdjYy1vbmx5PS13IiwKKyAgICAgICAgIi1YZ2NjLW9ubHk9LVduby1jKysxMS1uYXJyb3dpbmciLAorICAgICAgICAiLWZuby1zdHJpY3QtYWxpYXNpbmciLAorICAgICAgICAiLS1wYXJhbT1zc3AtYnVmZmVyLXNpemU9NCIsCisgICAgICAgICItZnN0YWNrLXByb3RlY3RvciIsCisgICAgICAgICItZnVud2luZC10YWJsZXMiLAorICAgICAgICAiLWZQSUMiLAorICAgICAgICAiLXBpcGUiLAorICAgICAgICAiLWZjb2xvci1kaWFnbm9zdGljcyIsCisgICAgICAgICItcHRocmVhZCIsCisgICAgICAgICItbTY0IiwKKyAgICAgICAgIi1tYXJjaD14ODYtNjQiLAorICAgICAgICAiLWZuby1pZGVudCIsCisgICAgICAgICItZmRhdGEtc2VjdGlvbnMiLAorICAgICAgICAiLWZmdW5jdGlvbi1zZWN0aW9ucyIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV2hlYWRlci1oeWdpZW5lIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV3N0cmluZy1jb252ZXJzaW9uIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV2Vycm9yIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV2FsbCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bnVzZWQtdmFyaWFibGUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1jKysxMS1uYXJyb3dpbmciLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1kZXByZWNhdGVkLXJlZ2lzdGVyIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVubmVlZGVkLWludGVybmFsLWRlY2xhcmF0aW9uIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWluY29uc2lzdGVudC1taXNzaW5nLW92ZXJyaWRlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXNoaWZ0LW5lZ2F0aXZlLXZhbHVlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVuZGVmaW5lZC12YXItdGVtcGxhdGUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tbm9ucG9ydGFibGUtaW5jbHVkZS1wYXRoIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWFkZHJlc3Mtb2YtcGFja2VkLW1lbWJlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1pbmNvbXBhdGlibGUtcG9pbnRlci10eXBlcyIsCisgICAgICAgICItV25vLXZsYSIsCisgICAgICAgICItV2EsLS1ub2V4ZWNzdGFjayIsCisgICAgICAgICItRERJU0FCTEVfR09PR0xFX0dMT0JBTF9VU0lOR19ERUNMQVJBVElPTlMiLAorICAgICAgICAiLURESVNBQkxFX0dPT0dMRV9TVFJJTkciLAorICAgICAgICAiLURHT09HTEVfVFlQRVNfSU5DT01QQVRJQklMSVRZIiwKKyAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAorICAgICAgICAiLURFTkFCTEVfTUROUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX05PVElGSUNBVElPTlMiLAorICAgICAgICAiLURFTkFCTEVfUEVQUEVSX0NETVMiLAorICAgICAgICAiLURFTkFCTEVfUExVR0lOUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1BERj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NQRUxMQ0hFQ0s9MSIsCisgICAgICAgICItRFVJX0NPTVBPU0lUT1JfSU1BR0VfVFJBTlNQT1JUIiwKKyAgICAgICAgIi1EVVNFX0FVUkE9MSIsCisgICAgICAgICItRFVTRV9ERUZBVUxUX1JFTkRFUl9USEVNRT0xIiwKKyAgICAgICAgIi1EVVNFX05TU19DRVJUUz0xIiwKKyAgICAgICAgIi1EVVNFX09aT05FPTEiLAorICAgICAgICAiLUROT19UQ01BTExPQyIsCisgICAgICAgICItREVOQUJMRV9XRUJSVEM9MSIsCisgICAgICAgICItRERJU0FCTEVfTkFDTCIsCisgICAgICAgICItREVOQUJMRV9FWFRFTlNJT05TPTEiLAorICAgICAgICAiLURFTkFCTEVfVEFTS19NQU5BR0VSPTEiLAorICAgICAgICAiLURFTkFCTEVfVEhFTUVTPTEiLAorICAgICAgICAiLURFTkFCTEVfQ0FQVElWRV9QT1JUQUxfREVURUNUSU9OPTEiLAorICAgICAgICAiLURFTkFCTEVfU0VTU0lPTl9TRVJWSUNFPTEiLAorICAgICAgICAiLURFTkFCTEVfU1VQRVJWSVNFRF9VU0VSUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFUlZJQ0VfRElTQ09WRVJZPTEiLAorICAgICAgICAiLURGVUxMX1NBRkVfQlJPV1NJTkciLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0NTRCIsCisgICAgICAgICItRFNBRkVfQlJPV1NJTkdfREJfTE9DQUwiLAorICAgICAgICAiLURDSFJPTUlVTV9CVUlMRCIsCisgICAgICAgICItREVOQUJMRV9NRURJQV9ST1VURVI9MSIsCisgICAgICAgICItREZJRUxEVFJJQUxfVEVTVElOR19FTkFCTEVEIiwKKyAgICAgICAgIi1EQ1JfQ0xBTkdfUkVWSVNJT049MjgyMDk3LTEiLAorICAgICAgICAiLURfRklMRV9PRkZTRVRfQklUUz02NCIsCisgICAgICAgICItRF9MQVJHRUZJTEVfU09VUkNFIiwKKyAgICAgICAgIi1EX0xBUkdFRklMRTY0X1NPVVJDRSIsCisgICAgICAgICItRENPTVBPTkVOVF9CVUlMRCIsCisgICAgICAgICItRENIUk9NSVVNX05ERUJVRyIsCisgICAgICAgICItRE5ERUJVRyIsCisgICAgICAgICItRE5WQUxHUklORCIsCisgICAgICAgICItRERZTkFNSUNfQU5OT1RBVElPTlNfRU5BQkxFRD0wIiwKKyAgICBdLAorICAgIGxpbmtzdGF0aWMgPSAxLAorICAgIGRlcHMgPSBbCisgICAgICAgICIvL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnA6aGVhZGVycyIsCisgICAgICAgICIvL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnA6bGlid2VicF91dGlscyIsCisgICAgXSwKKyAgICBhbHdheXNsaW5rID0gMSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gImxpYndlYnBfZHNwIiwKKyAgICBzcmNzID0gWworICAgICAgICAiZHNwL2FscGhhX3Byb2Nlc3NpbmcuYyIsCisgICAgICAgICJkc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIiwKKyAgICAgICAgImRzcC9hcmdiLmMiLAorICAgICAgICAiZHNwL2FyZ2JfbWlwc19kc3BfcjIuYyIsCisgICAgICAgICJkc3AvY29zdC5jIiwKKyAgICAgICAgImRzcC9jb3N0X21pcHMzMi5jIiwKKyAgICAgICAgImRzcC9jb3N0X21pcHNfZHNwX3IyLmMiLAorICAgICAgICAiZHNwL2NwdS5jIiwKKyAgICAgICAgImRzcC9kZWMuYyIsCisgICAgICAgICJkc3AvZGVjX2NsaXBfdGFibGVzLmMiLAorICAgICAgICAiZHNwL2RlY19taXBzMzIuYyIsCisgICAgICAgICJkc3AvZGVjX21pcHNfZHNwX3IyLmMiLAorICAgICAgICAiZHNwL2RlY19tc2EuYyIsCisgICAgICAgICJkc3AvZW5jLmMiLAorICAgICAgICAiZHNwL2VuY19hdngyLmMiLAorICAgICAgICAiZHNwL2VuY19taXBzMzIuYyIsCisgICAgICAgICJkc3AvZW5jX21pcHNfZHNwX3IyLmMiLAorICAgICAgICAiZHNwL2ZpbHRlcnMuYyIsCisgICAgICAgICJkc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jIiwKKyAgICAgICAgImRzcC9sb3NzbGVzcy5jIiwKKyAgICAgICAgImRzcC9sb3NzbGVzc19lbmMuYyIsCisgICAgICAgICJkc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jIiwKKyAgICAgICAgImRzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYyIsCisgICAgICAgICJkc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYyIsCisgICAgICAgICJkc3AvcmVzY2FsZXIuYyIsCisgICAgICAgICJkc3AvcmVzY2FsZXJfbWlwczMyLmMiLAorICAgICAgICAiZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMiLAorICAgICAgICAiZHNwL3Vwc2FtcGxpbmcuYyIsCisgICAgICAgICJkc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jIiwKKyAgICAgICAgImRzcC95dXYuYyIsCisgICAgICAgICJkc3AveXV2X21pcHMzMi5jIiwKKyAgICAgICAgImRzcC95dXZfbWlwc19kc3BfcjIuYyIsCisgICAgXSwKKyAgICBjb3B0cyA9IFsKKyAgICAgICAgIi1YZ2NjLW9ubHk9LXciLAorICAgICAgICAiLVhnY2Mtb25seT0tV25vLWMrKzExLW5hcnJvd2luZyIsCisgICAgICAgICItZm5vLXN0cmljdC1hbGlhc2luZyIsCisgICAgICAgICItLXBhcmFtPXNzcC1idWZmZXItc2l6ZT00IiwKKyAgICAgICAgIi1mc3RhY2stcHJvdGVjdG9yIiwKKyAgICAgICAgIi1mdW53aW5kLXRhYmxlcyIsCisgICAgICAgICItZlBJQyIsCisgICAgICAgICItcGlwZSIsCisgICAgICAgICItZmNvbG9yLWRpYWdub3N0aWNzIiwKKyAgICAgICAgIi1wdGhyZWFkIiwKKyAgICAgICAgIi1tNjQiLAorICAgICAgICAiLW1hcmNoPXg4Ni02NCIsCisgICAgICAgICItZm5vLWlkZW50IiwKKyAgICAgICAgIi1mZGF0YS1zZWN0aW9ucyIsCisgICAgICAgICItZmZ1bmN0aW9uLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XaGVhZGVyLWh5Z2llbmUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xc3RyaW5nLWNvbnZlcnNpb24iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XZXJyb3IiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XYWxsIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWMrKzExLW5hcnJvd2luZyIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW5uZWVkZWQtaW50ZXJuYWwtZGVjbGFyYXRpb24iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8taW5jb25zaXN0ZW50LW1pc3Npbmctb3ZlcnJpZGUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tc2hpZnQtbmVnYXRpdmUtdmFsdWUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW5kZWZpbmVkLXZhci10ZW1wbGF0ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1ub25wb3J0YWJsZS1pbmNsdWRlLXBhdGgiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYWRkcmVzcy1vZi1wYWNrZWQtbWVtYmVyIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWluY29tcGF0aWJsZS1wb2ludGVyLXR5cGVzIiwKKyAgICAgICAgIi1Xbm8tdmxhIiwKKyAgICAgICAgIi1XYSwtLW5vZXhlY3N0YWNrIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfR0xPQkFMX1VTSU5HX0RFQ0xBUkFUSU9OUyIsCisgICAgICAgICItRERJU0FCTEVfR09PR0xFX1NUUklORyIsCisgICAgICAgICItREdPT0dMRV9UWVBFU19JTkNPTVBBVElCSUxJVFkiLAorICAgICAgICAiLURXRUJQX0hBVkVfU1NFMiIsCisgICAgICAgICItRFdFQlBfSEFWRV9TU0U0MSIsCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICAgICAgIi1ERU5BQkxFX01ETlM9MSIsCisgICAgICAgICItREVOQUJMRV9OT1RJRklDQVRJT05TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BFUFBFUl9DRE1TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BMVUdJTlM9MSIsCisgICAgICAgICItREVOQUJMRV9QREY9MSIsCisgICAgICAgICItREVOQUJMRV9TUEVMTENIRUNLPTEiLAorICAgICAgICAiLURVSV9DT01QT1NJVE9SX0lNQUdFX1RSQU5TUE9SVCIsCisgICAgICAgICItRFVTRV9BVVJBPTEiLAorICAgICAgICAiLURVU0VfREVGQVVMVF9SRU5ERVJfVEhFTUU9MSIsCisgICAgICAgICItRFVTRV9OU1NfQ0VSVFM9MSIsCisgICAgICAgICItRFVTRV9PWk9ORT0xIiwKKyAgICAgICAgIi1ETk9fVENNQUxMT0MiLAorICAgICAgICAiLURFTkFCTEVfV0VCUlRDPTEiLAorICAgICAgICAiLURESVNBQkxFX05BQ0wiLAorICAgICAgICAiLURFTkFCTEVfRVhURU5TSU9OUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RBU0tfTUFOQUdFUj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RIRU1FUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0NBUFRJVkVfUE9SVEFMX0RFVEVDVElPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFU1NJT05fU0VSVklDRT0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NVUEVSVklTRURfVVNFUlM9MSIsCisgICAgICAgICItREVOQUJMRV9TRVJWSUNFX0RJU0NPVkVSWT0xIiwKKyAgICAgICAgIi1ERlVMTF9TQUZFX0JST1dTSU5HIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19DU0QiLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0RCX0xPQ0FMIiwKKyAgICAgICAgIi1EQ0hST01JVU1fQlVJTEQiLAorICAgICAgICAiLURFTkFCTEVfTUVESUFfUk9VVEVSPTEiLAorICAgICAgICAiLURGSUVMRFRSSUFMX1RFU1RJTkdfRU5BQkxFRCIsCisgICAgICAgICItRENSX0NMQU5HX1JFVklTSU9OPTI4MjA5Ny0xIiwKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLURfTEFSR0VGSUxFX1NPVVJDRSIsCisgICAgICAgICItRF9MQVJHRUZJTEU2NF9TT1VSQ0UiLAorICAgICAgICAiLURDT01QT05FTlRfQlVJTEQiLAorICAgICAgICAiLURDSFJPTUlVTV9OREVCVUciLAorICAgICAgICAiLUROREVCVUciLAorICAgICAgICAiLUROVkFMR1JJTkQiLAorICAgICAgICAiLUREWU5BTUlDX0FOTk9UQVRJT05TX0VOQUJMRUQ9MCIsCisgICAgXSwKKyAgICBsaW5rc3RhdGljID0gMSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmhlYWRlcnMiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmxpYndlYnBfZHNwX3NzZTIiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmxpYndlYnBfZHNwX3NzZTQxIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicDpsaWJ3ZWJwX3V0aWxzIiwKKyAgICBdLAorICAgIGFsd2F5c2xpbmsgPSAxLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAibGlid2VicF9kc3Bfc3NlMiIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImRzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyIsCisgICAgICAgICJkc3AvYXJnYl9zc2UyLmMiLAorICAgICAgICAiZHNwL2Nvc3Rfc3NlMi5jIiwKKyAgICAgICAgImRzcC9kZWNfc3NlMi5jIiwKKyAgICAgICAgImRzcC9lbmNfc3NlMi5jIiwKKyAgICAgICAgImRzcC9maWx0ZXJzX3NzZTIuYyIsCisgICAgICAgICJkc3AvbG9zc2xlc3NfZW5jX3NzZTIuYyIsCisgICAgICAgICJkc3AvbG9zc2xlc3Nfc3NlMi5jIiwKKyAgICAgICAgImRzcC9yZXNjYWxlcl9zc2UyLmMiLAorICAgICAgICAiZHNwL3Vwc2FtcGxpbmdfc3NlMi5jIiwKKyAgICAgICAgImRzcC95dXZfc3NlMi5jIiwKKyAgICBdLAorICAgIGNvcHRzID0gWworICAgICAgICAiLVhnY2Mtb25seT0tdyIsCisgICAgICAgICItWGdjYy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1tc3NlMiIsCisgICAgICAgICItZm5vLXN0cmljdC1hbGlhc2luZyIsCisgICAgICAgICItLXBhcmFtPXNzcC1idWZmZXItc2l6ZT00IiwKKyAgICAgICAgIi1mc3RhY2stcHJvdGVjdG9yIiwKKyAgICAgICAgIi1mdW53aW5kLXRhYmxlcyIsCisgICAgICAgICItZlBJQyIsCisgICAgICAgICItcGlwZSIsCisgICAgICAgICItZmNvbG9yLWRpYWdub3N0aWNzIiwKKyAgICAgICAgIi1wdGhyZWFkIiwKKyAgICAgICAgIi1tNjQiLAorICAgICAgICAiLW1hcmNoPXg4Ni02NCIsCisgICAgICAgICItZm5vLWlkZW50IiwKKyAgICAgICAgIi1mZGF0YS1zZWN0aW9ucyIsCisgICAgICAgICItZmZ1bmN0aW9uLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XaGVhZGVyLWh5Z2llbmUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xc3RyaW5nLWNvbnZlcnNpb24iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XZXJyb3IiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1XYWxsIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWMrKzExLW5hcnJvd2luZyIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1jb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW5uZWVkZWQtaW50ZXJuYWwtZGVjbGFyYXRpb24iLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8taW5jb25zaXN0ZW50LW1pc3Npbmctb3ZlcnJpZGUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tc2hpZnQtbmVnYXRpdmUtdmFsdWUiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW5kZWZpbmVkLXZhci10ZW1wbGF0ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1ub25wb3J0YWJsZS1pbmNsdWRlLXBhdGgiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYWRkcmVzcy1vZi1wYWNrZWQtbWVtYmVyIiwKKyAgICAgICAgIi1Xbm8tdmxhIiwKKyAgICAgICAgIi1XYSwtLW5vZXhlY3N0YWNrIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfR0xPQkFMX1VTSU5HX0RFQ0xBUkFUSU9OUyIsCisgICAgICAgICItRERJU0FCTEVfR09PR0xFX1NUUklORyIsCisgICAgICAgICItREdPT0dMRV9UWVBFU19JTkNPTVBBVElCSUxJVFkiLAorICAgICAgICAiLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyIsCisgICAgICAgICItREVOQUJMRV9NRE5TPTEiLAorICAgICAgICAiLURFTkFCTEVfTk9USUZJQ0FUSU9OUyIsCisgICAgICAgICItREVOQUJMRV9QRVBQRVJfQ0RNUyIsCisgICAgICAgICItREVOQUJMRV9QTFVHSU5TPTEiLAorICAgICAgICAiLURFTkFCTEVfUERGPTEiLAorICAgICAgICAiLURFTkFCTEVfU1BFTExDSEVDSz0xIiwKKyAgICAgICAgIi1EVUlfQ09NUE9TSVRPUl9JTUFHRV9UUkFOU1BPUlQiLAorICAgICAgICAiLURVU0VfQVVSQT0xIiwKKyAgICAgICAgIi1EVVNFX0RFRkFVTFRfUkVOREVSX1RIRU1FPTEiLAorICAgICAgICAiLURVU0VfTlNTX0NFUlRTPTEiLAorICAgICAgICAiLURVU0VfT1pPTkU9MSIsCisgICAgICAgICItRE5PX1RDTUFMTE9DIiwKKyAgICAgICAgIi1ERU5BQkxFX1dFQlJUQz0xIiwKKyAgICAgICAgIi1ERElTQUJMRV9OQUNMIiwKKyAgICAgICAgIi1ERU5BQkxFX0VYVEVOU0lPTlM9MSIsCisgICAgICAgICItREVOQUJMRV9UQVNLX01BTkFHRVI9MSIsCisgICAgICAgICItREVOQUJMRV9USEVNRVM9MSIsCisgICAgICAgICItREVOQUJMRV9DQVBUSVZFX1BPUlRBTF9ERVRFQ1RJT049MSIsCisgICAgICAgICItREVOQUJMRV9TRVNTSU9OX1NFUlZJQ0U9MSIsCisgICAgICAgICItREVOQUJMRV9TVVBFUlZJU0VEX1VTRVJTPTEiLAorICAgICAgICAiLURFTkFCTEVfU0VSVklDRV9ESVNDT1ZFUlk9MSIsCisgICAgICAgICItREZVTExfU0FGRV9CUk9XU0lORyIsCisgICAgICAgICItRFNBRkVfQlJPV1NJTkdfQ1NEIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19EQl9MT0NBTCIsCisgICAgICAgICItRENIUk9NSVVNX0JVSUxEIiwKKyAgICAgICAgIi1ERU5BQkxFX01FRElBX1JPVVRFUj0xIiwKKyAgICAgICAgIi1ERklFTERUUklBTF9URVNUSU5HX0VOQUJMRUQiLAorICAgICAgICAiLURDUl9DTEFOR19SRVZJU0lPTj0yODIwOTctMSIsCisgICAgICAgICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IiwKKyAgICAgICAgIi1EX0xBUkdFRklMRV9TT1VSQ0UiLAorICAgICAgICAiLURfTEFSR0VGSUxFNjRfU09VUkNFIiwKKyAgICAgICAgIi1EQ09NUE9ORU5UX0JVSUxEIiwKKyAgICAgICAgIi1EQ0hST01JVU1fTkRFQlVHIiwKKyAgICAgICAgIi1ETkRFQlVHIiwKKyAgICAgICAgIi1ETlZBTEdSSU5EIiwKKyAgICAgICAgIi1ERFlOQU1JQ19BTk5PVEFUSU9OU19FTkFCTEVEPTAiLAorICAgIF0sCisgICAgbGlua3N0YXRpYyA9IDEsCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicDpoZWFkZXJzIiwKKyAgICBdLAorICAgIGFsd2F5c2xpbmsgPSAxLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAibGlid2VicF9kc3Bfc3NlNDEiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJkc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jIiwKKyAgICAgICAgImRzcC9kZWNfc3NlNDEuYyIsCisgICAgICAgICJkc3AvZW5jX3NzZTQxLmMiLAorICAgICAgICAiZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5jIiwKKyAgICBdLAorICAgIGNvcHRzID0gWworICAgICAgICAiLVhnY2Mtb25seT0tdyIsCisgICAgICAgICItWGdjYy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1tc3NlNC4xIiwKKyAgICAgICAgIi1mbm8tc3RyaWN0LWFsaWFzaW5nIiwKKyAgICAgICAgIi0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQiLAorICAgICAgICAiLWZzdGFjay1wcm90ZWN0b3IiLAorICAgICAgICAiLWZ1bndpbmQtdGFibGVzIiwKKyAgICAgICAgIi1mUElDIiwKKyAgICAgICAgIi1waXBlIiwKKyAgICAgICAgIi1mY29sb3ItZGlhZ25vc3RpY3MiLAorICAgICAgICAiLXB0aHJlYWQiLAorICAgICAgICAiLW02NCIsCisgICAgICAgICItbWFyY2g9eDg2LTY0IiwKKyAgICAgICAgIi1mbm8taWRlbnQiLAorICAgICAgICAiLWZkYXRhLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mZnVuY3Rpb24tc2VjdGlvbnMiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdoZWFkZXItaHlnaWVuZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdzdHJpbmctY29udmVyc2lvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdlcnJvciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdhbGwiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bmRlZmluZWQtdmFyLXRlbXBsYXRlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW5vbnBvcnRhYmxlLWluY2x1ZGUtcGF0aCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1hZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIiLAorICAgICAgICAiLVduby12bGEiLAorICAgICAgICAiLVdhLC0tbm9leGVjc3RhY2siLAorICAgICAgICAiLURESVNBQkxFX0dPT0dMRV9HTE9CQUxfVVNJTkdfREVDTEFSQVRJT05TIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfU1RSSU5HIiwKKyAgICAgICAgIi1ER09PR0xFX1RZUEVTX0lOQ09NUEFUSUJJTElUWSIsCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICAgICAgIi1ERU5BQkxFX01ETlM9MSIsCisgICAgICAgICItREVOQUJMRV9OT1RJRklDQVRJT05TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BFUFBFUl9DRE1TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BMVUdJTlM9MSIsCisgICAgICAgICItREVOQUJMRV9QREY9MSIsCisgICAgICAgICItREVOQUJMRV9TUEVMTENIRUNLPTEiLAorICAgICAgICAiLURVSV9DT01QT1NJVE9SX0lNQUdFX1RSQU5TUE9SVCIsCisgICAgICAgICItRFVTRV9BVVJBPTEiLAorICAgICAgICAiLURVU0VfREVGQVVMVF9SRU5ERVJfVEhFTUU9MSIsCisgICAgICAgICItRFVTRV9OU1NfQ0VSVFM9MSIsCisgICAgICAgICItRFVTRV9PWk9ORT0xIiwKKyAgICAgICAgIi1ETk9fVENNQUxMT0MiLAorICAgICAgICAiLURFTkFCTEVfV0VCUlRDPTEiLAorICAgICAgICAiLURESVNBQkxFX05BQ0wiLAorICAgICAgICAiLURFTkFCTEVfRVhURU5TSU9OUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RBU0tfTUFOQUdFUj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RIRU1FUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0NBUFRJVkVfUE9SVEFMX0RFVEVDVElPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFU1NJT05fU0VSVklDRT0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NVUEVSVklTRURfVVNFUlM9MSIsCisgICAgICAgICItREVOQUJMRV9TRVJWSUNFX0RJU0NPVkVSWT0xIiwKKyAgICAgICAgIi1ERlVMTF9TQUZFX0JST1dTSU5HIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19DU0QiLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0RCX0xPQ0FMIiwKKyAgICAgICAgIi1EQ0hST01JVU1fQlVJTEQiLAorICAgICAgICAiLURFTkFCTEVfTUVESUFfUk9VVEVSPTEiLAorICAgICAgICAiLURGSUVMRFRSSUFMX1RFU1RJTkdfRU5BQkxFRCIsCisgICAgICAgICItRENSX0NMQU5HX1JFVklTSU9OPTI4MjA5Ny0xIiwKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLURfTEFSR0VGSUxFX1NPVVJDRSIsCisgICAgICAgICItRF9MQVJHRUZJTEU2NF9TT1VSQ0UiLAorICAgICAgICAiLURDT01QT05FTlRfQlVJTEQiLAorICAgICAgICAiLURDSFJPTUlVTV9OREVCVUciLAorICAgICAgICAiLUROREVCVUciLAorICAgICAgICAiLUROVkFMR1JJTkQiLAorICAgICAgICAiLUREWU5BTUlDX0FOTk9UQVRJT05TX0VOQUJMRUQ9MCIsCisgICAgXSwKKyAgICBsaW5rc3RhdGljID0gMSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmhlYWRlcnMiLAorICAgIF0sCisgICAgYWx3YXlzbGluayA9IDEsCispCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJsaWJ3ZWJwX2VuYyIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImVuYy9hbHBoYS5jIiwKKyAgICAgICAgImVuYy9hbmFseXNpcy5jIiwKKyAgICAgICAgImVuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMiLAorICAgICAgICAiZW5jL2NvbmZpZy5jIiwKKyAgICAgICAgImVuYy9jb3N0LmMiLAorICAgICAgICAiZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uYyIsCisgICAgICAgICJlbmMvZmlsdGVyLmMiLAorICAgICAgICAiZW5jL2ZyYW1lLmMiLAorICAgICAgICAiZW5jL2hpc3RvZ3JhbS5jIiwKKyAgICAgICAgImVuYy9pdGVyYXRvci5jIiwKKyAgICAgICAgImVuYy9uZWFyX2xvc3NsZXNzLmMiLAorICAgICAgICAiZW5jL3BpY3R1cmUuYyIsCisgICAgICAgICJlbmMvcGljdHVyZV9jc3AuYyIsCisgICAgICAgICJlbmMvcGljdHVyZV9wc25yLmMiLAorICAgICAgICAiZW5jL3BpY3R1cmVfcmVzY2FsZS5jIiwKKyAgICAgICAgImVuYy9waWN0dXJlX3Rvb2xzLmMiLAorICAgICAgICAiZW5jL3F1YW50LmMiLAorICAgICAgICAiZW5jL3N5bnRheC5jIiwKKyAgICAgICAgImVuYy90b2tlbi5jIiwKKyAgICAgICAgImVuYy90cmVlLmMiLAorICAgICAgICAiZW5jL3ZwOGwuYyIsCisgICAgICAgICJlbmMvd2VicGVuYy5jIiwKKyAgICBdLAorICAgIGNvcHRzID0gWworICAgICAgICAiLVhnY2Mtb25seT0tdyIsCisgICAgICAgICItWGdjYy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1mbm8tc3RyaWN0LWFsaWFzaW5nIiwKKyAgICAgICAgIi0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQiLAorICAgICAgICAiLWZzdGFjay1wcm90ZWN0b3IiLAorICAgICAgICAiLWZ1bndpbmQtdGFibGVzIiwKKyAgICAgICAgIi1mUElDIiwKKyAgICAgICAgIi1waXBlIiwKKyAgICAgICAgIi1mY29sb3ItZGlhZ25vc3RpY3MiLAorICAgICAgICAiLXB0aHJlYWQiLAorICAgICAgICAiLW02NCIsCisgICAgICAgICItbWFyY2g9eDg2LTY0IiwKKyAgICAgICAgIi1mbm8taWRlbnQiLAorICAgICAgICAiLWZkYXRhLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mZnVuY3Rpb24tc2VjdGlvbnMiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdoZWFkZXItaHlnaWVuZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdzdHJpbmctY29udmVyc2lvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdlcnJvciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdhbGwiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bmRlZmluZWQtdmFyLXRlbXBsYXRlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW5vbnBvcnRhYmxlLWluY2x1ZGUtcGF0aCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1hZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMiLAorICAgICAgICAiLVduby12bGEiLAorICAgICAgICAiLVdhLC0tbm9leGVjc3RhY2siLAorICAgICAgICAiLURESVNBQkxFX0dPT0dMRV9HTE9CQUxfVVNJTkdfREVDTEFSQVRJT05TIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfU1RSSU5HIiwKKyAgICAgICAgIi1ER09PR0xFX1RZUEVTX0lOQ09NUEFUSUJJTElUWSIsCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICAgICAgIi1ERU5BQkxFX01ETlM9MSIsCisgICAgICAgICItREVOQUJMRV9OT1RJRklDQVRJT05TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BFUFBFUl9DRE1TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BMVUdJTlM9MSIsCisgICAgICAgICItREVOQUJMRV9QREY9MSIsCisgICAgICAgICItREVOQUJMRV9TUEVMTENIRUNLPTEiLAorICAgICAgICAiLURVSV9DT01QT1NJVE9SX0lNQUdFX1RSQU5TUE9SVCIsCisgICAgICAgICItRFVTRV9BVVJBPTEiLAorICAgICAgICAiLURVU0VfREVGQVVMVF9SRU5ERVJfVEhFTUU9MSIsCisgICAgICAgICItRFVTRV9OU1NfQ0VSVFM9MSIsCisgICAgICAgICItRFVTRV9PWk9ORT0xIiwKKyAgICAgICAgIi1ETk9fVENNQUxMT0MiLAorICAgICAgICAiLURFTkFCTEVfV0VCUlRDPTEiLAorICAgICAgICAiLURESVNBQkxFX05BQ0wiLAorICAgICAgICAiLURFTkFCTEVfRVhURU5TSU9OUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RBU0tfTUFOQUdFUj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RIRU1FUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0NBUFRJVkVfUE9SVEFMX0RFVEVDVElPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFU1NJT05fU0VSVklDRT0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NVUEVSVklTRURfVVNFUlM9MSIsCisgICAgICAgICItREVOQUJMRV9TRVJWSUNFX0RJU0NPVkVSWT0xIiwKKyAgICAgICAgIi1ERlVMTF9TQUZFX0JST1dTSU5HIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19DU0QiLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0RCX0xPQ0FMIiwKKyAgICAgICAgIi1EQ0hST01JVU1fQlVJTEQiLAorICAgICAgICAiLURFTkFCTEVfTUVESUFfUk9VVEVSPTEiLAorICAgICAgICAiLURGSUVMRFRSSUFMX1RFU1RJTkdfRU5BQkxFRCIsCisgICAgICAgICItRENSX0NMQU5HX1JFVklTSU9OPTI4MjA5Ny0xIiwKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLURfTEFSR0VGSUxFX1NPVVJDRSIsCisgICAgICAgICItRF9MQVJHRUZJTEU2NF9TT1VSQ0UiLAorICAgICAgICAiLURDT01QT05FTlRfQlVJTEQiLAorICAgICAgICAiLURDSFJPTUlVTV9OREVCVUciLAorICAgICAgICAiLUROREVCVUciLAorICAgICAgICAiLUROVkFMR1JJTkQiLAorICAgICAgICAiLUREWU5BTUlDX0FOTk9UQVRJT05TX0VOQUJMRUQ9MCIsCisgICAgXSwKKyAgICBsaW5rc3RhdGljID0gMSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmhlYWRlcnMiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmxpYndlYnBfdXRpbHMiLAorICAgIF0sCisgICAgYWx3YXlzbGluayA9IDEsCispCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJsaWJ3ZWJwX3V0aWxzIiwKKyAgICBzcmNzID0gWworICAgICAgICAidXRpbHMvYml0X3JlYWRlci5jIiwKKyAgICAgICAgInV0aWxzL2JpdF93cml0ZXIuYyIsCisgICAgICAgICJ1dGlscy9jb2xvcl9jYWNoZS5jIiwKKyAgICAgICAgInV0aWxzL2ZpbHRlcnMuYyIsCisgICAgICAgICJ1dGlscy9odWZmbWFuLmMiLAorICAgICAgICAidXRpbHMvaHVmZm1hbl9lbmNvZGUuYyIsCisgICAgICAgICJ1dGlscy9xdWFudF9sZXZlbHMuYyIsCisgICAgICAgICJ1dGlscy9xdWFudF9sZXZlbHNfZGVjLmMiLAorICAgICAgICAidXRpbHMvcmFuZG9tLmMiLAorICAgICAgICAidXRpbHMvcmVzY2FsZXIuYyIsCisgICAgICAgICJ1dGlscy90aHJlYWQuYyIsCisgICAgICAgICJ1dGlscy91dGlscy5jIiwKKyAgICBdLAorICAgIGNvcHRzID0gWworICAgICAgICAiLVhnY2Mtb25seT0tdyIsCisgICAgICAgICItWGdjYy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1mbm8tc3RyaWN0LWFsaWFzaW5nIiwKKyAgICAgICAgIi0tcGFyYW09c3NwLWJ1ZmZlci1zaXplPTQiLAorICAgICAgICAiLWZzdGFjay1wcm90ZWN0b3IiLAorICAgICAgICAiLWZ1bndpbmQtdGFibGVzIiwKKyAgICAgICAgIi1mUElDIiwKKyAgICAgICAgIi1waXBlIiwKKyAgICAgICAgIi1mY29sb3ItZGlhZ25vc3RpY3MiLAorICAgICAgICAiLXB0aHJlYWQiLAorICAgICAgICAiLW02NCIsCisgICAgICAgICItbWFyY2g9eDg2LTY0IiwKKyAgICAgICAgIi1mbm8taWRlbnQiLAorICAgICAgICAiLWZkYXRhLXNlY3Rpb25zIiwKKyAgICAgICAgIi1mZnVuY3Rpb24tc2VjdGlvbnMiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdoZWFkZXItaHlnaWVuZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdzdHJpbmctY29udmVyc2lvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdlcnJvciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVdhbGwiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tYysrMTEtbmFycm93aW5nIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLWNvdmVyZWQtc3dpdGNoLWRlZmF1bHQiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bm5lZWRlZC1pbnRlcm5hbC1kZWNsYXJhdGlvbiIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby11bmRlZmluZWQtdmFyLXRlbXBsYXRlIiwKKyAgICAgICAgIi1YY2xhbmctb25seT0tV25vLW5vbnBvcnRhYmxlLWluY2x1ZGUtcGF0aCIsCisgICAgICAgICItWGNsYW5nLW9ubHk9LVduby1hZGRyZXNzLW9mLXBhY2tlZC1tZW1iZXIiLAorICAgICAgICAiLVhjbGFuZy1vbmx5PS1Xbm8taW5jb21wYXRpYmxlLXBvaW50ZXItdHlwZXMiLAorICAgICAgICAiLVduby12bGEiLAorICAgICAgICAiLVdhLC0tbm9leGVjc3RhY2siLAorICAgICAgICAiLURESVNBQkxFX0dPT0dMRV9HTE9CQUxfVVNJTkdfREVDTEFSQVRJT05TIiwKKyAgICAgICAgIi1ERElTQUJMRV9HT09HTEVfU1RSSU5HIiwKKyAgICAgICAgIi1ER09PR0xFX1RZUEVTX0lOQ09NUEFUSUJJTElUWSIsCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICAgICAgIi1ERU5BQkxFX01ETlM9MSIsCisgICAgICAgICItREVOQUJMRV9OT1RJRklDQVRJT05TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BFUFBFUl9DRE1TIiwKKyAgICAgICAgIi1ERU5BQkxFX1BMVUdJTlM9MSIsCisgICAgICAgICItREVOQUJMRV9QREY9MSIsCisgICAgICAgICItREVOQUJMRV9TUEVMTENIRUNLPTEiLAorICAgICAgICAiLURVSV9DT01QT1NJVE9SX0lNQUdFX1RSQU5TUE9SVCIsCisgICAgICAgICItRFVTRV9BVVJBPTEiLAorICAgICAgICAiLURVU0VfREVGQVVMVF9SRU5ERVJfVEhFTUU9MSIsCisgICAgICAgICItRFVTRV9OU1NfQ0VSVFM9MSIsCisgICAgICAgICItRFVTRV9PWk9ORT0xIiwKKyAgICAgICAgIi1ETk9fVENNQUxMT0MiLAorICAgICAgICAiLURFTkFCTEVfV0VCUlRDPTEiLAorICAgICAgICAiLURESVNBQkxFX05BQ0wiLAorICAgICAgICAiLURFTkFCTEVfRVhURU5TSU9OUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RBU0tfTUFOQUdFUj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1RIRU1FUz0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0NBUFRJVkVfUE9SVEFMX0RFVEVDVElPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NFU1NJT05fU0VSVklDRT0xIiwKKyAgICAgICAgIi1ERU5BQkxFX1NVUEVSVklTRURfVVNFUlM9MSIsCisgICAgICAgICItREVOQUJMRV9TRVJWSUNFX0RJU0NPVkVSWT0xIiwKKyAgICAgICAgIi1ERlVMTF9TQUZFX0JST1dTSU5HIiwKKyAgICAgICAgIi1EU0FGRV9CUk9XU0lOR19DU0QiLAorICAgICAgICAiLURTQUZFX0JST1dTSU5HX0RCX0xPQ0FMIiwKKyAgICAgICAgIi1EQ0hST01JVU1fQlVJTEQiLAorICAgICAgICAiLURFTkFCTEVfTUVESUFfUk9VVEVSPTEiLAorICAgICAgICAiLURGSUVMRFRSSUFMX1RFU1RJTkdfRU5BQkxFRCIsCisgICAgICAgICItRENSX0NMQU5HX1JFVklTSU9OPTI4MjA5Ny0xIiwKKyAgICAgICAgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiLAorICAgICAgICAiLURfTEFSR0VGSUxFX1NPVVJDRSIsCisgICAgICAgICItRF9MQVJHRUZJTEU2NF9TT1VSQ0UiLAorICAgICAgICAiLURDT01QT05FTlRfQlVJTEQiLAorICAgICAgICAiLURDSFJPTUlVTV9OREVCVUciLAorICAgICAgICAiLUROREVCVUciLAorICAgICAgICAiLUROVkFMR1JJTkQiLAorICAgICAgICAiLUREWU5BTUlDX0FOTk9UQVRJT05TX0VOQUJMRUQ9MCIsCisgICAgXSwKKyAgICBsaW5rc3RhdGljID0gMSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwOmhlYWRlcnMiLAorICAgIF0sCisgICAgYWx3YXlzbGluayA9IDEsCispCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9MSUNFTlNFIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTExYThhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvTElDRU5TRQpAQCAtMCwwICsxLDUzIEBACitDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICBkaXN0cmlidXRpb24uCisKKyAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5CisgICAgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKK0hPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCitUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKK09GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0FkZGl0aW9uYWwgSVAgUmlnaHRzIEdyYW50IChQYXRlbnRzKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyJUaGVzZSBpbXBsZW1lbnRhdGlvbnMiIG1lYW5zIHRoZSBjb3B5cmlnaHRhYmxlIHdvcmtzIHRoYXQgaW1wbGVtZW50IHRoZSBXZWJNCitjb2RlY3MgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIFdlYk0gUHJvamVjdC4KKworR29vZ2xlIGhlcmVieSBncmFudHMgdG8geW91IGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKK3JveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0bworbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgdHJhbnNmZXIsIGFuZCBvdGhlcndpc2UKK3J1biwgbW9kaWZ5IGFuZCBwcm9wYWdhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNLCB3aGVyZQorc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zLCBib3RoIGN1cnJlbnRseSBvd25lZCBieQorR29vZ2xlIGFuZCBhY3F1aXJlZCBpbiB0aGUgZnV0dXJlLCBsaWNlbnNhYmxlIGJ5IEdvb2dsZSB0aGF0IGFyZSBuZWNlc3NhcmlseQoraW5mcmluZ2VkIGJ5IHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNLiBUaGlzIGdyYW50IGRvZXMgbm90IGluY2x1ZGUgY2xhaW1zCit0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhlc2UKK2ltcGxlbWVudGF0aW9ucy4gSWYgeW91IG9yIHlvdXIgYWdlbnQgb3IgZXhjbHVzaXZlIGxpY2Vuc2VlIGluc3RpdHV0ZSBvciBvcmRlcgorb3IgYWdyZWUgdG8gdGhlIGluc3RpdHV0aW9uIG9mIHBhdGVudCBsaXRpZ2F0aW9uIG9yIGFueSBvdGhlciBwYXRlbnQKK2VuZm9yY2VtZW50IGFjdGl2aXR5IGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IKK2NvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgYW55IG9mIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNCitvciBhbnkgY29kZSBpbmNvcnBvcmF0ZWQgd2l0aGluIGFueSBvZiB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTQorY29uc3RpdHV0ZSBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIG9yIGluZHVjZW1lbnQgb2YKK3BhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCByaWdodHMgZ3JhbnRlZCB0byB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlCitmb3IgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0gc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9NRVRBREFUQSBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL01FVEFEQVRBCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjA3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9NRVRBREFUQQpAQCAtMCwwICsxLDI1IEBACisjIEZvcm1hdDogZ29vZ2xlMy9kZXZ0b29scy9tZXRhZGF0YS9tZXRhZGF0YS5wcm90byAoZ28vZ29vZ2xlM21ldGFkYXRhKQorCituYW1lOiAibGlid2VicCIKK2Rlc2NyaXB0aW9uOgorICAgICJMaWJyYXJ5IGxpYndlYnAgd2hpY2ggaXMgYnVuZGxlZCB3aXRoIENocm9taXVtIGFuZCByZXF1aXJlZCBieSBIZWFkbGVzcyAiCisgICAgIkNocm9taXVtLiBQbGVhc2Ugc2VlIC8vdGhpcmRfcGFydHkvaGVhZGxlc3NfY2hyb21pdW0vUkVBRE1FLnR4dCBmb3IgIgorICAgICJkZXRhaWxzLiIKKwordGhpcmRfcGFydHkgeworICB1cmwgeworICAgIHR5cGU6IEFSQ0hJVkUKKyAgICB2YWx1ZTogImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9mYzQ4ODQ3OTM3ZGU4Y2MzOTA3Mjk1OTZiMGE5YmU2ZTIxNmY4ODIwL3RoaXJkX3BhcnR5L2xpYndlYnAiCisgIH0KKyAgdmVyc2lvbjogImZjNDg4NDc5MzdkZThjYzM5MDcyOTU5NmIwYTliZTZlMjE2Zjg4MjAgKENocm9taXVtIDUzLjAuMjc1OC4xKSIKKyAgbGFzdF91cGdyYWRlX2RhdGU6IHsKKyAgICB5ZWFyOiAyMDE2CisgICAgbW9udGg6IDYKKyAgICBkYXk6IDgKKyAgfQorCisgICMgTk9URTogVGhlICJsb2NhbF9tb2RpZmljYXRpb25zIiBmaWVsZCBpcyBlbnRpcmVseSBvcHRpb25hbCBhbmQgbWF5IGJlCisgICMgcmVtb3ZlZCBpZiBpdCdzIG5vdCB1c2VmdWwgZm9yIHRoZSBwYWNrYWdlLgorICAjICAgICBTZWUgZ28vdGhpcmRwYXJ0eS1tZXRhZGF0YS1sb2NhbC1tb2RpZmljYXRpb25zCisgIGxvY2FsX21vZGlmaWNhdGlvbnM6ICJodHRwOi8vZ29vZ2xlMy90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL1JFQURNRS5nb29nbGU/Y2w9MTI0MzczMTg4IgorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvT1dORVJTIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTc0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9PV05FUlMKQEAgLTAsMCArMSBAQAorZmlsZTovL2RlcG90L2dvb2dsZTMvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvT1dORVJTLmhlYWRsZXNzX2Nocm9taXVtCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9SRUFETUUuY2hyb21pdW0gYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9SRUFETUUuY2hyb21pdW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmZjlkYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL1JFQURNRS5jaHJvbWl1bQpAQCAtMCwwICsxLDI2IEBACitOYW1lOiBXZWJQIGltYWdlIGVuY29kZXIvZGVjb2RlcgorU2hvcnQgTmFtZTogbGlid2VicAorVVJMOiBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAKK1ZlcnNpb246IHYwLjUuMAorTGljZW5zZTogQlNECitMaWNlbnNlIEZpbGU6IExJQ0VOU0UKK1NlY3VyaXR5IENyaXRpY2FsOiBZZXMKKworRGVzY3JpcHRpb246CitTb3VyY2UgYXJjaGl2ZToKKyAgaHR0cDovL2Rvd25sb2Fkcy53ZWJtcHJvamVjdC5vcmcvcmVsZWFzZXMvd2VicC9saWJ3ZWJwLTAuNS4wLnRhci5negorCitXZWJQIGlzIGFuIGltYWdlIGZvcm1hdCB0aGF0IGRvZXMgYm90aCBsb3NzeSBhbmQgbG9zc2xlc3MgY29tcHJlc3Npb24gb2YKK2RpZ2l0YWwgcGhvdG9ncmFwaGljIGltYWdlcy4gV2ViUCBjb25zaXN0cyBvZiBhIGNvZGVjIGJhc2VkIG9uIFZQOCwgdGhhdCBHb29nbGUKK29wZW4tc291cmNlZCBpbiBNYXkgMjAxMCBhbmQgYSBjb250YWluZXIgYmFzZWQgb24gUklGRi4gV2VibWFzdGVycywgd2ViCitkZXZlbG9wZXJzIGFuZCBicm93c2VyIGRldmVsb3BlcnMgY2FuIHVzZSBXZWJQIHRvIGNvbXByZXNzLCBhcmNoaXZlIGFuZAorZGlzdHJpYnV0ZSBkaWdpdGFsIGltYWdlcyBtb3JlIGVmZmljaWVudGx5LgorCitMb2NhbCBjaGFuZ2VzOgorICogUmVtb3ZlZCBleGFtcGxlcy8sIGRvY3VtZW50YXRpb24gYW5kIGJ1aWxkIHJlbGF0ZWQgZmlsZXMsIGtlZXBpbmcgb25seQorICAgdGhlIGNvbnRlbnRzIG9mIHNyYy8gbGVzcyBtdXgvIHdoaWNoIGlzIHVudXNlZC4KKyAqIE1lcmdlZCBDT1BZSU5HL1BBVEVOVFMgdG8gTElDRU5TRQorICogQWRkZWQgYW4gZXhwbGljaXQgY2FzdCB0byBzaG9ydCBpbiB5dXZfc3NlMi5jCitDaGVycnktcGlja3M6CisgIFJldmVydCBwYXRjaCBmN2ZjNGJjOiBkZWMvd2VicC5jOiBkb24ndCB3YWl0IGZvciBkYXRhIGJlZm9yZSByZXBvcnRpbmcgdy9oCisgIFJldmVydCBwYXRjaCBkMWMzNTllOiBmaXggc2hhcmVkIG9iamVjdCBidWlsZCB3aXRoIC1mdmlzaWJpbGl0eT1oaWRkZW4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9hbHBoYS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzMDk2MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9hbHBoYS5jCkBAIC0wLDAgKzEsMjMyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEtcGxhbmUgZGVjb21wcmVzc2lvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvYWxwaGFpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGxpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBTFBIRGVjb2RlciBvYmplY3QuCisKKy8vIEFsbG9jYXRlcyBhIG5ldyBhbHBoYSBkZWNvZGVyIGluc3RhbmNlLgorc3RhdGljIEFMUEhEZWNvZGVyKiBBTFBITmV3KHZvaWQpIHsKKyAgQUxQSERlY29kZXIqIGNvbnN0IGRlYyA9IChBTFBIRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgcmV0dXJuIGRlYzsKK30KKworLy8gQ2xlYXJzIGFuZCBkZWFsbG9jYXRlcyBhbiBhbHBoYSBkZWNvZGVyIGluc3RhbmNlLgorc3RhdGljIHZvaWQgQUxQSERlbGV0ZShBTFBIRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFZQOExEZWxldGUoZGVjLT52cDhsX2RlY18pOworICAgIGRlYy0+dnA4bF9kZWNfID0gTlVMTDsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVjb2RpbmcuCisKKy8vIEluaXRpYWxpemUgYWxwaGEgZGVjb2RpbmcgYnkgcGFyc2luZyB0aGUgYWxwaGEgaGVhZGVyIGFuZCBkZWNvZGluZyB0aGUgaW1hZ2UKKy8vIGhlYWRlciBmb3IgYWxwaGEgZGF0YSBzdG9yZWQgdXNpbmcgbG9zc2xlc3MgY29tcHJlc3Npb24uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgaW4gYWxwaGEgaGVhZGVyIChkYXRhIHRvbyBzaG9ydCwgaW52YWxpZAorLy8gY29tcHJlc3Npb24gbWV0aG9kIG9yIGZpbHRlciwgZXJyb3IgaW4gbG9zc2xlc3MgaGVhZGVyIGRhdGEgZXRjKS4KK3N0YXRpYyBpbnQgQUxQSEluaXQoQUxQSERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgVlA4SW8qIGNvbnN0IHNyY19pbywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0KSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhX2RhdGEgPSBkYXRhICsgQUxQSEFfSEVBREVSX0xFTjsKKyAgY29uc3Qgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIEFMUEhBX0hFQURFUl9MRU47CisgIGludCByc3J2OworICBWUDhJbyogY29uc3QgaW8gPSAmZGVjLT5pb187CisKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCAmJiBvdXRwdXQgIT0gTlVMTCAmJiBzcmNfaW8gIT0gTlVMTCk7CisKKyAgVlA4RmlsdGVyc0luaXQoKTsKKyAgZGVjLT5vdXRwdXRfID0gb3V0cHV0OworICBkZWMtPndpZHRoXyA9IHNyY19pby0+d2lkdGg7CisgIGRlYy0+aGVpZ2h0XyA9IHNyY19pby0+aGVpZ2h0OworICBhc3NlcnQoZGVjLT53aWR0aF8gPiAwICYmIGRlYy0+aGVpZ2h0XyA+IDApOworCisgIGlmIChkYXRhX3NpemUgPD0gQUxQSEFfSEVBREVSX0xFTikgeworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5tZXRob2RfID0gKGRhdGFbMF0gPj4gMCkgJiAweDAzOworICBkZWMtPmZpbHRlcl8gPSAoZGF0YVswXSA+PiAyKSAmIDB4MDM7CisgIGRlYy0+cHJlX3Byb2Nlc3NpbmdfID0gKGRhdGFbMF0gPj4gNCkgJiAweDAzOworICByc3J2ID0gKGRhdGFbMF0gPj4gNikgJiAweDAzOworICBpZiAoZGVjLT5tZXRob2RfIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwKKyAgICAgIGRlYy0+bWV0aG9kXyA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OIHx8CisgICAgICBkZWMtPmZpbHRlcl8gPj0gV0VCUF9GSUxURVJfTEFTVCB8fAorICAgICAgZGVjLT5wcmVfcHJvY2Vzc2luZ18gPiBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIHx8CisgICAgICByc3J2ICE9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIENvcHkgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGZyb20gc3JjX2lvIHRvIGlvCisgIFZQOEluaXRJbyhpbyk7CisgIFdlYlBJbml0Q3VzdG9tSW8oTlVMTCwgaW8pOworICBpby0+b3BhcXVlID0gZGVjOworICBpby0+d2lkdGggPSBzcmNfaW8tPndpZHRoOworICBpby0+aGVpZ2h0ID0gc3JjX2lvLT5oZWlnaHQ7CisKKyAgaW8tPnVzZV9jcm9wcGluZyA9IHNyY19pby0+dXNlX2Nyb3BwaW5nOworICBpby0+Y3JvcF9sZWZ0ID0gc3JjX2lvLT5jcm9wX2xlZnQ7CisgIGlvLT5jcm9wX3JpZ2h0ID0gc3JjX2lvLT5jcm9wX3JpZ2h0OworICBpby0+Y3JvcF90b3AgPSBzcmNfaW8tPmNyb3BfdG9wOworICBpby0+Y3JvcF9ib3R0b20gPSBzcmNfaW8tPmNyb3BfYm90dG9tOworICAvLyBObyBuZWVkIHRvIGNvcHkgdGhlIHNjYWxpbmcgcGFyYW1ldGVycy4KKworICBpZiAoZGVjLT5tZXRob2RfID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgY29uc3Qgc2l6ZV90IGFscGhhX2RlY29kZWRfc2l6ZSA9IGRlYy0+d2lkdGhfICogZGVjLT5oZWlnaHRfOworICAgIG9rID0gKGFscGhhX2RhdGFfc2l6ZSA+PSBhbHBoYV9kZWNvZGVkX3NpemUpOworICB9IGVsc2UgeworICAgIGFzc2VydChkZWMtPm1ldGhvZF8gPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pOworICAgIG9rID0gVlA4TERlY29kZUFscGhhSGVhZGVyKGRlYywgYWxwaGFfZGF0YSwgYWxwaGFfZGF0YV9zaXplKTsKKyAgfQorCisgIHJldHVybiBvazsKK30KKworLy8gRGVjb2RlcywgdW5maWx0ZXJzIGFuZCBkZXF1YW50aXplcyAqYXQgbGVhc3QqICdudW1fcm93cycgcm93cyBvZiBhbHBoYQorLy8gc3RhcnRpbmcgZnJvbSByb3cgbnVtYmVyICdyb3cnLiBJdCBhc3N1bWVzIHRoYXQgcm93cyB1cCB0byAocm93IC0gMSkgaGF2ZQorLy8gYWxyZWFkeSBiZWVuIGRlY29kZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9yLgorc3RhdGljIGludCBBTFBIRGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdywgaW50IG51bV9yb3dzKSB7CisgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IGRlYy0+YWxwaF9kZWNfOworICBjb25zdCBpbnQgd2lkdGggPSBhbHBoX2RlYy0+d2lkdGhfOworICBjb25zdCBpbnQgaGVpZ2h0ID0gYWxwaF9kZWMtPmlvXy5jcm9wX2JvdHRvbTsKKyAgaWYgKGFscGhfZGVjLT5tZXRob2RfID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgaW50IHk7CisgICAgY29uc3QgdWludDhfdCogcHJldl9saW5lID0gZGVjLT5hbHBoYV9wcmV2X2xpbmVfOworICAgIGNvbnN0IHVpbnQ4X3QqIGRlbHRhcyA9IGRlYy0+YWxwaGFfZGF0YV8gKyBBTFBIQV9IRUFERVJfTEVOICsgcm93ICogd2lkdGg7CisgICAgdWludDhfdCogZHN0ID0gZGVjLT5hbHBoYV9wbGFuZV8gKyByb3cgKiB3aWR0aDsKKyAgICBhc3NlcnQoZGVsdGFzIDw9ICZkZWMtPmFscGhhX2RhdGFfW2RlYy0+YWxwaGFfZGF0YV9zaXplX10pOworICAgIGlmIChhbHBoX2RlYy0+ZmlsdGVyXyAhPSBXRUJQX0ZJTFRFUl9OT05FKSB7CisgICAgICBhc3NlcnQoV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10gIT0gTlVMTCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgbnVtX3Jvd3M7ICsreSkgeworICAgICAgICBXZWJQVW5maWx0ZXJzW2FscGhfZGVjLT5maWx0ZXJfXShwcmV2X2xpbmUsIGRlbHRhcywgZHN0LCB3aWR0aCk7CisgICAgICAgIHByZXZfbGluZSA9IGRzdDsKKyAgICAgICAgZHN0ICs9IHdpZHRoOworICAgICAgICBkZWx0YXMgKz0gd2lkdGg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBudW1fcm93czsgKyt5KSB7CisgICAgICAgIG1lbWNweShkc3QsIGRlbHRhcywgd2lkdGggKiBzaXplb2YoKmRzdCkpOworICAgICAgICBwcmV2X2xpbmUgPSBkc3Q7CisgICAgICAgIGRzdCArPSB3aWR0aDsKKyAgICAgICAgZGVsdGFzICs9IHdpZHRoOworICAgICAgfQorICAgIH0KKyAgICBkZWMtPmFscGhhX3ByZXZfbGluZV8gPSBwcmV2X2xpbmU7CisgIH0gZWxzZSB7ICAvLyBhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTgorICAgIGFzc2VydChhbHBoX2RlYy0+dnA4bF9kZWNfICE9IE5VTEwpOworICAgIGlmICghVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oYWxwaF9kZWMsIHJvdyArIG51bV9yb3dzKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKHJvdyArIG51bV9yb3dzID49IGhlaWdodCkgeworICAgIGRlYy0+aXNfYWxwaGFfZGVjb2RlZF8gPSAxOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEFsbG9jYXRlQWxwaGFQbGFuZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGNvbnN0IFZQOElvKiBjb25zdCBpbykgeworICBjb25zdCBpbnQgc3RyaWRlID0gaW8tPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gaW8tPmNyb3BfYm90dG9tOworICBjb25zdCB1aW50NjRfdCBhbHBoYV9zaXplID0gKHVpbnQ2NF90KXN0cmlkZSAqIGhlaWdodDsKKyAgYXNzZXJ0KGRlYy0+YWxwaGFfcGxhbmVfbWVtXyA9PSBOVUxMKTsKKyAgZGVjLT5hbHBoYV9wbGFuZV9tZW1fID0KKyAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhhbHBoYV9zaXplLCBzaXplb2YoKmRlYy0+YWxwaGFfcGxhbmVfKSk7CisgIGlmIChkZWMtPmFscGhhX3BsYW5lX21lbV8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YWxwaGFfcGxhbmVfID0gZGVjLT5hbHBoYV9wbGFuZV9tZW1fOworICBkZWMtPmFscGhhX3ByZXZfbGluZV8gPSBOVUxMOworICByZXR1cm4gMTsKK30KKwordm9pZCBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBhc3NlcnQoZGVjICE9IE5VTEwpOworICBXZWJQU2FmZUZyZWUoZGVjLT5hbHBoYV9wbGFuZV9tZW1fKTsKKyAgZGVjLT5hbHBoYV9wbGFuZV9tZW1fID0gTlVMTDsKKyAgZGVjLT5hbHBoYV9wbGFuZV8gPSBOVUxMOworICBBTFBIRGVsZXRlKGRlYy0+YWxwaF9kZWNfKTsKKyAgZGVjLT5hbHBoX2RlY18gPSBOVUxMOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBwb2ludC4KKworY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOElvKiBjb25zdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKSB7CisgIGNvbnN0IGludCB3aWR0aCA9IGlvLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IGlvLT5jcm9wX2JvdHRvbTsKKworICBhc3NlcnQoZGVjICE9IE5VTEwgJiYgaW8gIT0gTlVMTCk7CisKKyAgaWYgKHJvdyA8IDAgfHwgbnVtX3Jvd3MgPD0gMCB8fCByb3cgKyBudW1fcm93cyA+IGhlaWdodCkgeworICAgIHJldHVybiBOVUxMOyAgICAvLyBzYW5pdHkgY2hlY2suCisgIH0KKworICBpZiAoIWRlYy0+aXNfYWxwaGFfZGVjb2RlZF8pIHsKKyAgICBpZiAoZGVjLT5hbHBoX2RlY18gPT0gTlVMTCkgeyAgICAvLyBJbml0aWFsaXplIGRlY29kZXIuCisgICAgICBkZWMtPmFscGhfZGVjXyA9IEFMUEhOZXcoKTsKKyAgICAgIGlmIChkZWMtPmFscGhfZGVjXyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIGlmICghQWxsb2NhdGVBbHBoYVBsYW5lKGRlYywgaW8pKSBnb3RvIEVycm9yOworICAgICAgaWYgKCFBTFBISW5pdChkZWMtPmFscGhfZGVjXywgZGVjLT5hbHBoYV9kYXRhXywgZGVjLT5hbHBoYV9kYXRhX3NpemVfLAorICAgICAgICAgICAgICAgICAgICBpbywgZGVjLT5hbHBoYV9wbGFuZV8pKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICAvLyBpZiB3ZSBhbGxvd2VkIHVzZSBvZiBhbHBoYSBkaXRoZXJpbmcsIGNoZWNrIHdoZXRoZXIgaXQncyBuZWVkZWQgYXQgYWxsCisgICAgICBpZiAoZGVjLT5hbHBoX2RlY18tPnByZV9wcm9jZXNzaW5nXyAhPSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTKSB7CisgICAgICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IDA7ICAgLy8gZGlzYWJsZSBkaXRoZXJpbmcKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bV9yb3dzID0gaGVpZ2h0IC0gcm93OyAgICAgLy8gZGVjb2RlIGV2ZXJ5dGhpbmcgaW4gb25lIHBhc3MKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoZGVjLT5hbHBoX2RlY18gIT0gTlVMTCk7CisgICAgYXNzZXJ0KHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7CisgICAgaWYgKCFBTFBIRGVjb2RlKGRlYywgcm93LCBudW1fcm93cykpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoZGVjLT5pc19hbHBoYV9kZWNvZGVkXykgeyAgIC8vIGZpbmlzaGVkPworICAgICAgQUxQSERlbGV0ZShkZWMtPmFscGhfZGVjXyk7CisgICAgICBkZWMtPmFscGhfZGVjXyA9IE5VTEw7CisgICAgICBpZiAoZGVjLT5hbHBoYV9kaXRoZXJpbmdfID4gMCkgeworICAgICAgICB1aW50OF90KiBjb25zdCBhbHBoYSA9IGRlYy0+YWxwaGFfcGxhbmVfICsgaW8tPmNyb3BfdG9wICogd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpby0+Y3JvcF9sZWZ0OworICAgICAgICBpZiAoIVdlYlBEZXF1YW50aXplTGV2ZWxzKGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+Y3JvcF9ib3R0b20gLSBpby0+Y3JvcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGRlYy0+YWxwaGFfZGl0aGVyaW5nXykpIHsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWNvZGVkIHJvdy4KKyAgcmV0dXJuIGRlYy0+YWxwaGFfcGxhbmVfICsgcm93ICogd2lkdGg7CisKKyBFcnJvcjoKKyAgV2ViUERlYWxsb2NhdGVBbHBoYU1lbW9yeShkZWMpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9hbHBoYWkuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9hbHBoYWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2FscGhhaS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYSBkZWNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfREVDX0FMUEhBSV9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX0RFQ19BTFBIQUlfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3dlYnBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9maWx0ZXJzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IFZQOExEZWNvZGVyOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KKwordHlwZWRlZiBzdHJ1Y3QgQUxQSERlY29kZXIgQUxQSERlY29kZXI7CitzdHJ1Y3QgQUxQSERlY29kZXIgeworICBpbnQgd2lkdGhfOworICBpbnQgaGVpZ2h0XzsKKyAgaW50IG1ldGhvZF87CisgIFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyXzsKKyAgaW50IHByZV9wcm9jZXNzaW5nXzsKKyAgc3RydWN0IFZQOExEZWNvZGVyKiB2cDhsX2RlY187CisgIFZQOElvIGlvXzsKKyAgaW50IHVzZV84Yl9kZWNvZGVfOyAgLy8gQWx0aG91Z2ggYWxwaGEgY2hhbm5lbCByZXF1aXJlcyBvbmx5IDEgYnl0ZSBwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gcGl4ZWwsIHNvbWV0aW1lcyBWUDhMRGVjb2RlciBtYXkgbmVlZCB0byBhbGxvY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAvLyA0IGJ5dGVzIHBlciBwaXhlbCBpbnRlcm5hbGx5IGR1cmluZyBkZWNvZGUuCisgIHVpbnQ4X3QqIG91dHB1dF87CisgIGNvbnN0IHVpbnQ4X3QqIHByZXZfbGluZV87ICAgLy8gbGFzdCBvdXRwdXQgcm93IChvciBOVUxMKQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KKworLy8gRGVhbGxvY2F0ZSBtZW1vcnkgYXNzb2NpYXRlZCB0byBkZWMtPmFscGhhX3BsYW5lXyBkZWNvZGluZwordm9pZCBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX0RFQ19BTFBIQUlfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9idWZmZXIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYxMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2J1ZmZlci5jCkBAIC0wLDAgKzEsMzAwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRXZlcnl0aGluZyBhYm91dCBXZWJQRGVjQnVmZmVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3dlYnBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUERlY0J1ZmZlcgorCisvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsIGZvciB0aGUgZGlmZmVyZW50IGNvbG9yLXNwYWNlcy4KK3N0YXRpYyBjb25zdCBpbnQga01vZGVCcHBbTU9ERV9MQVNUXSA9IHsKKyAgMywgNCwgMywgNCwgNCwgMiwgMiwKKyAgNCwgNCwgNCwgMiwgICAgLy8gcHJlLW11bHRpcGxpZWQgbW9kZXMKKyAgMSwgMSB9OworCisvLyBDaGVjayB0aGF0IHdlYnBfY3NwX21vZGUgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgV0VCUF9DU1BfTU9ERS4KKy8vIENvbnZlcnQgdG8gYW4gaW50ZWdlciB0byBoYW5kbGUgYm90aCB0aGUgdW5zaWduZWQvc2lnbmVkIGVudW0gY2FzZXMKKy8vIHdpdGhvdXQgdGhlIG5lZWQgZm9yIGNhc3RpbmcgdG8gcmVtb3ZlIHR5cGUgbGltaXQgd2FybmluZ3MuCitzdGF0aWMgaW50IElzVmFsaWRDb2xvcnNwYWNlKGludCB3ZWJwX2NzcF9tb2RlKSB7CisgIHJldHVybiAod2VicF9jc3BfbW9kZSA+PSBNT0RFX1JHQiAmJiB3ZWJwX2NzcF9tb2RlIDwgTU9ERV9MQVNUKTsKK30KKworLy8gc3RyaWN0bHkgc3BlYWtpbmcsIHRoZSB2ZXJ5IGxhc3QgKG9yIGZpcnN0LCBpZiBmbGlwcGVkKSByb3cKKy8vIGRvZXNuJ3QgcmVxdWlyZSBwYWRkaW5nLgorI2RlZmluZSBNSU5fQlVGRkVSX1NJWkUoV0lEVEgsIEhFSUdIVCwgU1RSSURFKSAgICAgICBcCisgICAgKHVpbnQ2NF90KShTVFJJREUpICogKChIRUlHSFQpIC0gMSkgKyAoV0lEVEgpCisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIENoZWNrRGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpbnQgb2sgPSAxOworICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7CisgIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgaWYgKCFJc1ZhbGlkQ29sb3JzcGFjZShtb2RlKSkgeworICAgIG9rID0gMDsKKyAgfSBlbHNlIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeyAgIC8vIFlVViBjaGVja3MKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgIGNvbnN0IGludCB1dl93aWR0aCAgPSAod2lkdGggICsgMSkgLyAyOworICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAoaGVpZ2h0ICsgMSkgLyAyOworICAgIGNvbnN0IGludCB5X3N0cmlkZSA9IGFicyhidWYtPnlfc3RyaWRlKTsKKyAgICBjb25zdCBpbnQgdV9zdHJpZGUgPSBhYnMoYnVmLT51X3N0cmlkZSk7CisgICAgY29uc3QgaW50IHZfc3RyaWRlID0gYWJzKGJ1Zi0+dl9zdHJpZGUpOworICAgIGNvbnN0IGludCBhX3N0cmlkZSA9IGFicyhidWYtPmFfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCB5X3NpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgeV9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHVfc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh1dl93aWR0aCwgdXZfaGVpZ2h0LCB1X3N0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3Qgdl9zaXplID0gTUlOX0JVRkZFUl9TSVpFKHV2X3dpZHRoLCB1dl9oZWlnaHQsIHZfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCBhX3NpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgYV9zdHJpZGUpOworICAgIG9rICY9ICh5X3NpemUgPD0gYnVmLT55X3NpemUpOworICAgIG9rICY9ICh1X3NpemUgPD0gYnVmLT51X3NpemUpOworICAgIG9rICY9ICh2X3NpemUgPD0gYnVmLT52X3NpemUpOworICAgIG9rICY9ICh5X3N0cmlkZSA+PSB3aWR0aCk7CisgICAgb2sgJj0gKHVfc3RyaWRlID49IHV2X3dpZHRoKTsKKyAgICBvayAmPSAodl9zdHJpZGUgPj0gdXZfd2lkdGgpOworICAgIG9rICY9IChidWYtPnkgIT0gTlVMTCk7CisgICAgb2sgJj0gKGJ1Zi0+dSAhPSBOVUxMKTsKKyAgICBvayAmPSAoYnVmLT52ICE9IE5VTEwpOworICAgIGlmIChtb2RlID09IE1PREVfWVVWQSkgeworICAgICAgb2sgJj0gKGFfc3RyaWRlID49IHdpZHRoKTsKKyAgICAgIG9rICY9IChhX3NpemUgPD0gYnVmLT5hX3NpemUpOworICAgICAgb2sgJj0gKGJ1Zi0+YSAhPSBOVUxMKTsKKyAgICB9CisgIH0gZWxzZSB7ICAgIC8vIFJHQiBjaGVja3MKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5SR0JBOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBhYnMoYnVmLT5zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSBNSU5fQlVGRkVSX1NJWkUod2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKyAgICBvayAmPSAoc2l6ZSA8PSBidWYtPnNpemUpOworICAgIG9rICY9IChzdHJpZGUgPj0gd2lkdGggKiBrTW9kZUJwcFttb2RlXSk7CisgICAgb2sgJj0gKGJ1Zi0+cmdiYSAhPSBOVUxMKTsKKyAgfQorICByZXR1cm4gb2sgPyBWUDhfU1RBVFVTX09LIDogVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworfQorI3VuZGVmIE1JTl9CVUZGRVJfU0laRQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBBbGxvY2F0ZUJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgaW50IHcgPSBidWZmZXItPndpZHRoOworICBjb25zdCBpbnQgaCA9IGJ1ZmZlci0+aGVpZ2h0OworICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7CisKKyAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgIUlzVmFsaWRDb2xvcnNwYWNlKG1vZGUpKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIGlmIChidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA8PSAwICYmIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIG91dHB1dDsKKyAgICBpbnQgdXZfc3RyaWRlID0gMCwgYV9zdHJpZGUgPSAwOworICAgIHVpbnQ2NF90IHV2X3NpemUgPSAwLCBhX3NpemUgPSAwLCB0b3RhbF9zaXplOworICAgIC8vIFdlIG5lZWQgbWVtb3J5IGFuZCBpdCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LgorICAgIC8vID0+IGluaXRpYWxpemUgb3V0cHV0IGJ1ZmZlciwgbm93IHRoYXQgZGltZW5zaW9ucyBhcmUga25vd24uCisgICAgY29uc3QgaW50IHN0cmlkZSA9IHcgKiBrTW9kZUJwcFttb2RlXTsKKyAgICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXN0cmlkZSAqIGg7CisKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsKKyAgICAgIHV2X3N0cmlkZSA9ICh3ICsgMSkgLyAyOworICAgICAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiAoKGggKyAxKSAvIDIpOworICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7CisgICAgICAgIGFfc3RyaWRlID0gdzsKKyAgICAgICAgYV9zaXplID0gKHVpbnQ2NF90KWFfc3RyaWRlICogaDsKKyAgICAgIH0KKyAgICB9CisgICAgdG90YWxfc2l6ZSA9IHNpemUgKyAyICogdXZfc2l6ZSArIGFfc2l6ZTsKKworICAgIC8vIFNlY3VyaXR5L3Nhbml0eSBjaGVja3MKKyAgICBvdXRwdXQgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpvdXRwdXQpKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBvdXRwdXQ7CisKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsgICAvLyBZVVZBIGluaXRpYWxpemF0aW9uCisgICAgICBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgICAgYnVmLT55ID0gb3V0cHV0OworICAgICAgYnVmLT55X3N0cmlkZSA9IHN0cmlkZTsKKyAgICAgIGJ1Zi0+eV9zaXplID0gKHNpemVfdClzaXplOworICAgICAgYnVmLT51ID0gb3V0cHV0ICsgc2l6ZTsKKyAgICAgIGJ1Zi0+dV9zdHJpZGUgPSB1dl9zdHJpZGU7CisgICAgICBidWYtPnVfc2l6ZSA9IChzaXplX3QpdXZfc2l6ZTsKKyAgICAgIGJ1Zi0+diA9IG91dHB1dCArIHNpemUgKyB1dl9zaXplOworICAgICAgYnVmLT52X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgICAgIGJ1Zi0+dl9zaXplID0gKHNpemVfdCl1dl9zaXplOworICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7CisgICAgICAgIGJ1Zi0+YSA9IG91dHB1dCArIHNpemUgKyAyICogdXZfc2l6ZTsKKyAgICAgIH0KKyAgICAgIGJ1Zi0+YV9zaXplID0gKHNpemVfdClhX3NpemU7CisgICAgICBidWYtPmFfc3RyaWRlID0gYV9zdHJpZGU7CisgICAgfSBlbHNlIHsgIC8vIFJHQkEgaW5pdGlhbGl6YXRpb24KKyAgICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7CisgICAgICBidWYtPnJnYmEgPSBvdXRwdXQ7CisgICAgICBidWYtPnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgIGJ1Zi0+c2l6ZSA9IChzaXplX3Qpc2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENoZWNrRGVjQnVmZmVyKGJ1ZmZlcik7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUEZsaXBCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKFdlYlBJc1JHQk1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKSkgeworICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7CisgICAgYnVmLT5yZ2JhICs9IChidWZmZXItPmhlaWdodCAtIDEpICogYnVmLT5zdHJpZGU7CisgICAgYnVmLT5zdHJpZGUgPSAtYnVmLT5zdHJpZGU7CisgIH0gZWxzZSB7CisgICAgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKKyAgICBjb25zdCBpbnQgSCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGJ1Zi0+eSArPSAoSCAtIDEpICogYnVmLT55X3N0cmlkZTsKKyAgICBidWYtPnlfc3RyaWRlID0gLWJ1Zi0+eV9zdHJpZGU7CisgICAgYnVmLT51ICs9ICgoSCAtIDEpID4+IDEpICogYnVmLT51X3N0cmlkZTsKKyAgICBidWYtPnVfc3RyaWRlID0gLWJ1Zi0+dV9zdHJpZGU7CisgICAgYnVmLT52ICs9ICgoSCAtIDEpID4+IDEpICogYnVmLT52X3N0cmlkZTsKKyAgICBidWYtPnZfc3RyaWRlID0gLWJ1Zi0+dl9zdHJpZGU7CisgICAgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgICBidWYtPmEgKz0gKEggLSAxKSAqIGJ1Zi0+YV9zdHJpZGU7CisgICAgICBidWYtPmFfc3RyaWRlID0gLWJ1Zi0+YV9zdHJpZGU7CisgICAgfQorICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXQpIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIGlmIChvdXQgPT0gTlVMTCB8fCB3IDw9IDAgfHwgaCA8PSAwKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAob3B0aW9ucyAhPSBOVUxMKSB7ICAgIC8vIEZpcnN0LCBhcHBseSBvcHRpb25zIGlmIHRoZXJlIGlzIGFueS4KKyAgICBpZiAob3B0aW9ucy0+dXNlX2Nyb3BwaW5nKSB7CisgICAgICBjb25zdCBpbnQgY3cgPSBvcHRpb25zLT5jcm9wX3dpZHRoOworICAgICAgY29uc3QgaW50IGNoID0gb3B0aW9ucy0+Y3JvcF9oZWlnaHQ7CisgICAgICBjb25zdCBpbnQgeCA9IG9wdGlvbnMtPmNyb3BfbGVmdCAmIH4xOworICAgICAgY29uc3QgaW50IHkgPSBvcHRpb25zLT5jcm9wX3RvcCAmIH4xOworICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IGN3IDw9IDAgfHwgY2ggPD0gMCB8fCB4ICsgY3cgPiB3IHx8IHkgKyBjaCA+IGgpIHsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsgICAvLyBvdXQgb2YgZnJhbWUgYm91bmRhcnkuCisgICAgICB9CisgICAgICB3ID0gY3c7CisgICAgICBoID0gY2g7CisgICAgfQorICAgIGlmIChvcHRpb25zLT51c2Vfc2NhbGluZykgeworICAgICAgaW50IHNjYWxlZF93aWR0aCA9IG9wdGlvbnMtPnNjYWxlZF93aWR0aDsKKyAgICAgIGludCBzY2FsZWRfaGVpZ2h0ID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKKyAgICAgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucygKKyAgICAgICAgICAgICAgdywgaCwgJnNjYWxlZF93aWR0aCwgJnNjYWxlZF9oZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgICB9CisgICAgICB3ID0gc2NhbGVkX3dpZHRoOworICAgICAgaCA9IHNjYWxlZF9oZWlnaHQ7CisgICAgfQorICB9CisgIG91dC0+d2lkdGggPSB3OworICBvdXQtPmhlaWdodCA9IGg7CisKKyAgLy8gVGhlbiwgYWxsb2NhdGUgYnVmZmVyIGZvciByZWFsLgorICBzdGF0dXMgPSBBbGxvY2F0ZUJ1ZmZlcihvdXQpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisKKyAgLy8gVXNlIHRoZSBzdHJpZGUgdHJpY2sgaWYgdmVydGljYWwgZmxpcCBpcyBuZWVkZWQuCisgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+ZmxpcCkgeworICAgIHN0YXR1cyA9IFdlYlBGbGlwQnVmZmVyKG91dCk7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0cnVjdG9ycyAvIGRlc3RydWN0b3JzCisKK2ludCBXZWJQSW5pdERlY0J1ZmZlckludGVybmFsKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlciwgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAvLyB2ZXJzaW9uIG1pc21hdGNoCisgIH0KKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKSB7CisgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgIGlmIChidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA8PSAwKSB7CisgICAgICBXZWJQU2FmZUZyZWUoYnVmZmVyLT5wcml2YXRlX21lbW9yeSk7CisgICAgfQorICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOworICB9Cit9CisKK3ZvaWQgV2ViUENvcHlEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKKyAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7CisgICAgKmRzdCA9ICpzcmM7CisgICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgeworICAgICAgZHN0LT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIGRzdCBidWZmZXIgZG9lc24ndCBvd24gdGhlIG1lbW9yeS4KKyAgICAgIGRzdC0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOworICAgIH0KKyAgfQorfQorCisvLyBDb3B5IGFuZCB0cmFuc2ZlciBvd25lcnNoaXAgZnJvbSBzcmMgdG8gZHN0IChiZXdhcmUgb2YgcGFyYW1ldGVyIG9yZGVyISkKK3ZvaWQgV2ViUEdyYWJEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLCBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKKyAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7CisgICAgKmRzdCA9ICpzcmM7CisgICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgeworICAgICAgc3JjLT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIHNyYyByZWxpbnF1aXNoZXMgb3duZXJzaGlwCisgICAgICBzcmMtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworVlA4U3RhdHVzQ29kZSBXZWJQQ29weURlY0J1ZmZlclBpeGVscyhjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3RfYnVmKSB7CisgIGFzc2VydChzcmNfYnVmICE9IE5VTEwgJiYgZHN0X2J1ZiAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyY19idWYtPmNvbG9yc3BhY2UgPT0gZHN0X2J1Zi0+Y29sb3JzcGFjZSk7CisKKyAgZHN0X2J1Zi0+d2lkdGggPSBzcmNfYnVmLT53aWR0aDsKKyAgZHN0X2J1Zi0+aGVpZ2h0ID0gc3JjX2J1Zi0+aGVpZ2h0OworICBpZiAoQ2hlY2tEZWNCdWZmZXIoZHN0X2J1ZikgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKFdlYlBJc1JHQk1vZGUoc3JjX2J1Zi0+Y29sb3JzcGFjZSkpIHsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3Qgc3JjID0gJnNyY19idWYtPnUuUkdCQTsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgZHN0ID0gJmRzdF9idWYtPnUuUkdCQTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+cmdiYSwgc3JjLT5zdHJpZGUsIGRzdC0+cmdiYSwgZHN0LT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICBzcmNfYnVmLT53aWR0aCAqIGtNb2RlQnBwW3NyY19idWYtPmNvbG9yc3BhY2VdLAorICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+aGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3Qgc3JjID0gJnNyY19idWYtPnUuWVVWQTsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgZHN0ID0gJmRzdF9idWYtPnUuWVVWQTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+eSwgc3JjLT55X3N0cmlkZSwgZHN0LT55LCBkc3QtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+d2lkdGgsIHNyY19idWYtPmhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dV9zdHJpZGUsIGRzdC0+dSwgZHN0LT51X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIChzcmNfYnVmLT53aWR0aCArIDEpIC8gMiwgKHNyY19idWYtPmhlaWdodCArIDEpIC8gMik7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnYsIHNyYy0+dl9zdHJpZGUsIGRzdC0+diwgZHN0LT52X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIChzcmNfYnVmLT53aWR0aCArIDEpIC8gMiwgKHNyY19idWYtPmhlaWdodCArIDEpIC8gMik7CisgICAgaWYgKFdlYlBJc0FscGhhTW9kZShzcmNfYnVmLT5jb2xvcnNwYWNlKSkgeworICAgICAgV2ViUENvcHlQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsIGRzdC0+YSwgZHN0LT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+d2lkdGgsIHNyY19idWYtPmhlaWdodCk7CisgICAgfQorICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitpbnQgV2ViUEF2b2lkU2xvd01lbW9yeShjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGZlYXR1cmVzKSB7CisgIGFzc2VydChvdXRwdXQgIT0gTlVMTCk7CisgIHJldHVybiAob3V0cHV0LT5pc19leHRlcm5hbF9tZW1vcnkgPj0gMikgJiYKKyAgICAgICAgIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKG91dHB1dC0+Y29sb3JzcGFjZSkgJiYKKyAgICAgICAgIChmZWF0dXJlcyAhPSBOVUxMICYmIGZlYXR1cmVzLT5oYXNfYWxwaGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2NvbW1vbi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDc3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvY29tbW9uLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIERlZmluaXRpb25zIGFuZCBtYWNyb3MgY29tbW9uIHRvIGVuY29kaW5nIGFuZCBkZWNvZGluZworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9ERUNfQ09NTU9OX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfREVDX0NPTU1PTl9IXworCisvLyBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCitlbnVtIHsgQl9EQ19QUkVEID0gMCwgICAvLyA0eDQgbW9kZXMKKyAgICAgICBCX1RNX1BSRUQgPSAxLAorICAgICAgIEJfVkVfUFJFRCA9IDIsCisgICAgICAgQl9IRV9QUkVEID0gMywKKyAgICAgICBCX1JEX1BSRUQgPSA0LAorICAgICAgIEJfVlJfUFJFRCA9IDUsCisgICAgICAgQl9MRF9QUkVEID0gNiwKKyAgICAgICBCX1ZMX1BSRUQgPSA3LAorICAgICAgIEJfSERfUFJFRCA9IDgsCisgICAgICAgQl9IVV9QUkVEID0gOSwKKyAgICAgICBOVU1fQk1PREVTID0gQl9IVV9QUkVEICsgMSAtIEJfRENfUFJFRCwgIC8vID0gMTAKKworICAgICAgIC8vIEx1bWExNiBvciBVViBtb2RlcworICAgICAgIERDX1BSRUQgPSBCX0RDX1BSRUQsIFZfUFJFRCA9IEJfVkVfUFJFRCwKKyAgICAgICBIX1BSRUQgPSBCX0hFX1BSRUQsIFRNX1BSRUQgPSBCX1RNX1BSRUQsCisgICAgICAgQl9QUkVEID0gTlVNX0JNT0RFUywgICAvLyByZWZpbmVkIEk0eDQgbW9kZQorICAgICAgIE5VTV9QUkVEX01PREVTID0gNCwKKworICAgICAgIC8vIHNwZWNpYWwgbW9kZXMKKyAgICAgICBCX0RDX1BSRURfTk9UT1AgPSA0LAorICAgICAgIEJfRENfUFJFRF9OT0xFRlQgPSA1LAorICAgICAgIEJfRENfUFJFRF9OT1RPUExFRlQgPSA2LAorICAgICAgIE5VTV9CX0RDX01PREVTID0gNyB9OworCitlbnVtIHsgTUJfRkVBVFVSRV9UUkVFX1BST0JTID0gMywKKyAgICAgICBOVU1fTUJfU0VHTUVOVFMgPSA0LAorICAgICAgIE5VTV9SRUZfTEZfREVMVEFTID0gNCwKKyAgICAgICBOVU1fTU9ERV9MRl9ERUxUQVMgPSA0LCAgICAvLyBJNHg0LCBaRVJPLCAqLCBTUExJVAorICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCisgICAgICAgLy8gUHJvYmFiaWxpdGllcworICAgICAgIE5VTV9UWVBFUyA9IDQsICAgLy8gMDogaTE2LUFDLCAgMTogaTE2LURDLCAgMjpjaHJvbWEtQUMsICAzOmk0LUFDCisgICAgICAgTlVNX0JBTkRTID0gOCwKKyAgICAgICBOVU1fQ1RYID0gMywKKyAgICAgICBOVU1fUFJPQkFTID0gMTEKKyAgICAgfTsKKworI2VuZGlmICAgIC8vIENIUk9NSVVNX1dFQlBfREVDX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2RlY29kZV92cDguaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9kZWNvZGVfdnA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNGE3YwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9kZWNvZGVfdnA4LmgKQEAgLTAsMCArMSwxODUgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTG93LWxldmVsIEFQSSBmb3IgVlA4IGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfV0VCUF9ERUNPREVfVlA4X0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfV0VCUF9ERUNPREVfVlA4X0hfCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvd2VyLWxldmVsIEFQSQorLy8KKy8vIFRoZXNlIGZ1bmN0aW9ucyBwcm92aWRlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG9mIHRoZSBkZWNvZGluZyBwcm9jZXNzLgorLy8gVGhlIGNhbGwgZmxvdyBzaG91bGQgcmVzZW1ibGU6CisvLworLy8gICBWUDhJbyBpbzsKKy8vICAgVlA4SW5pdElvKCZpbyk7CisvLyAgIGlvLmRhdGEgPSBkYXRhOworLy8gICBpby5kYXRhX3NpemUgPSBzaXplOworLy8gICAvKiBjdXN0b21pemUgaW8ncyBmdW5jdGlvbnMgKHNldHVwKCkvcHV0KCkvdGVhcmRvd24oKSkgaWYgbmVlZGVkLiAqLworLy8KKy8vICAgVlA4RGVjb2RlciogZGVjID0gVlA4TmV3KCk7CisvLyAgIGJvb2wgb2sgPSBWUDhEZWNvZGUoZGVjKTsKKy8vICAgaWYgKCFvaykgcHJpbnRmKCJFcnJvcjogJXNcbiIsIFZQOFN0YXR1c01lc3NhZ2UoZGVjKSk7CisvLyAgIFZQOERlbGV0ZShkZWMpOworLy8gICByZXR1cm4gb2s7CisKKy8vIElucHV0IC8gT3V0cHV0Cit0eXBlZGVmIHN0cnVjdCBWUDhJbyBWUDhJbzsKK3R5cGVkZWYgaW50ICgqVlA4SW9QdXRIb29rKShjb25zdCBWUDhJbyogaW8pOwordHlwZWRlZiBpbnQgKCpWUDhJb1NldHVwSG9vaykoVlA4SW8qIGlvKTsKK3R5cGVkZWYgdm9pZCAoKlZQOElvVGVhcmRvd25Ib29rKShjb25zdCBWUDhJbyogaW8pOworCitzdHJ1Y3QgVlA4SW8geworICAvLyBzZXQgYnkgVlA4R2V0SGVhZGVycygpCisgIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAgIC8vIHBpY3R1cmUgZGltZW5zaW9ucywgaW4gcGl4ZWxzIChpbnZhcmlhYmxlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBvcmlnaW5hbCwgdW5jcm9wcGVkIGRpbWVuc2lvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgYXJlYSBwYXNzZWQgdG8gcHV0KCkgaXMgc3RvcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIG1iX3cgLyBtYl9oIGZpZWxkcy4KKworICAvLyBzZXQgYmVmb3JlIGNhbGxpbmcgcHV0KCkKKyAgaW50IG1iX3k7ICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgcm93cyAoaW4gcGl4ZWxzKQorICBpbnQgbWJfdzsgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgc2FtcGxlCisgIGludCBtYl9oOyAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiByb3dzIGluIHRoZSBzYW1wbGUKKyAgY29uc3QgdWludDhfdCogeSwgKnUsICp2OyAgLy8gcm93cyB0byBjb3B5IChpbiB5dXY0MjAgZm9ybWF0KQorICBpbnQgeV9zdHJpZGU7ICAgICAgICAgICAgICAvLyByb3cgc3RyaWRlIGZvciBsdW1hCisgIGludCB1dl9zdHJpZGU7ICAgICAgICAgICAgIC8vIHJvdyBzdHJpZGUgZm9yIGNocm9tYQorCisgIHZvaWQqIG9wYXF1ZTsgICAgICAgICAgICAgIC8vIHVzZXIgZGF0YQorCisgIC8vIGNhbGxlZCB3aGVuIGZyZXNoIHNhbXBsZXMgYXJlIGF2YWlsYWJsZS4gQ3VycmVudGx5LCBzYW1wbGVzIGFyZSBpbgorICAvLyBZVVY0MjAgZm9ybWF0LCBhbmQgY2FuIGJlIHVwIHRvIHdpZHRoIHggMjQgaW4gc2l6ZSAoZGVwZW5kaW5nIG9uIHRoZQorICAvLyBpbi1sb29wIGZpbHRlcmluZyBsZXZlbCwgZS5nLikuIFNob3VsZCByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBlcnJvcgorICAvLyBvciBhYm9ydCByZXF1ZXN0LiBUaGUgYWN0dWFsIHNpemUgb2YgdGhlIGFyZWEgdG8gdXBkYXRlIGlzIG1iX3cgeCBtYl9oCisgIC8vIGluIHNpemUsIHRha2luZyBjcm9wcGluZyBpbnRvIGFjY291bnQuCisgIFZQOElvUHV0SG9vayBwdXQ7CisKKyAgLy8gY2FsbGVkIGp1c3QgYmVmb3JlIHN0YXJ0aW5nIHRvIGRlY29kZSB0aGUgYmxvY2tzLgorICAvLyBNdXN0IHJldHVybiBmYWxzZSBpbiBjYXNlIG9mIHNldHVwIGVycm9yLCB0cnVlIG90aGVyd2lzZS4gSWYgZmFsc2UgaXMKKyAgLy8gcmV0dXJuZWQsIHRlYXJkb3duKCkgd2lsbCBOT1QgYmUgY2FsbGVkLiBCdXQgaWYgdGhlIHNldHVwIHN1Y2NlZWRlZAorICAvLyBhbmQgdHJ1ZSBpcyByZXR1cm5lZCwgdGhlbiB0ZWFyZG93bigpIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBhZnRlcndhcmQuCisgIFZQOElvU2V0dXBIb29rIHNldHVwOworCisgIC8vIENhbGxlZCBqdXN0IGFmdGVyIGJsb2NrIGRlY29kaW5nIGlzIGZpbmlzaGVkIChvciB3aGVuIGFuIGVycm9yIG9jY3VycmVkCisgIC8vIGR1cmluZyBwdXQoKSkuIElzIE5PVCBjYWxsZWQgaWYgc2V0dXAoKSBmYWlsZWQuCisgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duOworCisgIC8vIHRoaXMgaXMgYSByZWNvbW1lbmRhdGlvbiBmb3IgdGhlIHVzZXItc2lkZSB5dXYtPnJnYiBjb252ZXJ0ZXIuIFRoaXMgZmxhZworICAvLyBpcyBzZXQgd2hlbiBjYWxsaW5nIHNldHVwKCkgaG9vayBhbmQgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGl0LiBJdCB0aGVuCisgIC8vIGNhbiBiZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gZHVyaW5nIHRoZSBwdXQoKSBtZXRob2QuCisgIGludCBmYW5jeV91cHNhbXBsaW5nOworCisgIC8vIElucHV0IGJ1ZmZlci4KKyAgc2l6ZV90IGRhdGFfc2l6ZTsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKworICAvLyBJZiB0cnVlLCBpbi1sb29wIGZpbHRlcmluZyB3aWxsIG5vdCBiZSBwZXJmb3JtZWQgZXZlbiBpZiBwcmVzZW50IGluIHRoZQorICAvLyBiaXRzdHJlYW0uIFN3aXRjaGluZyBvZmYgZmlsdGVyaW5nIG1heSBzcGVlZCB1cCBkZWNvZGluZyBhdCB0aGUgZXhwZW5zZQorICAvLyBvZiBtb3JlIHZpc2libGUgYmxvY2tpbmcuIE5vdGUgdGhhdCBvdXRwdXQgd2lsbCBhbHNvIGJlIG5vbi1jb21wbGlhbnQKKyAgLy8gd2l0aCB0aGUgVlA4IHNwZWNpZmljYXRpb25zLgorICBpbnQgYnlwYXNzX2ZpbHRlcmluZzsKKworICAvLyBDcm9wcGluZyBwYXJhbWV0ZXJzLgorICBpbnQgdXNlX2Nyb3BwaW5nOworICBpbnQgY3JvcF9sZWZ0LCBjcm9wX3JpZ2h0LCBjcm9wX3RvcCwgY3JvcF9ib3R0b207CisKKyAgLy8gU2NhbGluZyBwYXJhbWV0ZXJzLgorICBpbnQgdXNlX3NjYWxpbmc7CisgIGludCBzY2FsZWRfd2lkdGgsIHNjYWxlZF9oZWlnaHQ7CisKKyAgLy8gSWYgbm9uIE5VTEwsIHBvaW50ZXIgdG8gdGhlIGFscGhhIGRhdGEgKGlmIHByZXNlbnQpIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHJvdyAoVGhhdCBpczogaXQgaXMgcHJlLW9mZnNldCBieSBtYl95IGFuZCB0YWtlcworICAvLyBjcm9wcGluZyBpbnRvIGFjY291bnQpLgorICBjb25zdCB1aW50OF90KiBhOworfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK2ludCBWUDhJbml0SW9JbnRlcm5hbChWUDhJbyogY29uc3QsIGludCk7CisKKy8vIFNldCB0aGUgY3VzdG9tIElPIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCB1c2VyLWRhdGEuIFRoZSBzZXR0ZXIgZm9yIElPIGhvb2tzCisvLyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBpbml0aWF0aW5nIGluY3JlbWVudGFsIGRlY29kaW5nLiBSZXR1cm5zIHRydWUgaWYKKy8vIFdlYlBJRGVjb2RlciBvYmplY3QgaXMgc3VjY2Vzc2Z1bGx5IG1vZGlmaWVkLCBmYWxzZSBvdGhlcndpc2UuCitpbnQgV2ViUElTZXRJT0hvb2tzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKKyAgICAgICAgICAgICAgICAgICAgVlA4SW9QdXRIb29rIHB1dCwKKyAgICAgICAgICAgICAgICAgICAgVlA4SW9TZXR1cEhvb2sgc2V0dXAsCisgICAgICAgICAgICAgICAgICAgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOworCisvLyBNYWluIGRlY29kaW5nIG9iamVjdC4gVGhpcyBpcyBhbiBvcGFxdWUgc3RydWN0dXJlLgordHlwZWRlZiBzdHJ1Y3QgVlA4RGVjb2RlciBWUDhEZWNvZGVyOworCisvLyBDcmVhdGUgYSBuZXcgZGVjb2RlciBvYmplY3QuCitWUDhEZWNvZGVyKiBWUDhOZXcodm9pZCk7CisKKy8vIE11c3QgYmUgY2FsbGVkIHRvIG1ha2Ugc3VyZSAnaW8nIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guIFVwb24gc3VjaCBmYWlsdXJlLCBubyBvdGhlcgorLy8gZGVjb2RpbmcgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCAoVlA4RGVjb2RlLCBWUDhHZXRIZWFkZXJzLCAuLi4pCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEluaXRJbyhWUDhJbyogY29uc3QgaW8pIHsKKyAgcmV0dXJuIFZQOEluaXRJb0ludGVybmFsKGlvLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pOworfQorCisvLyBEZWNvZGUgdGhlIFZQOCBmcmFtZSBoZWFkZXIuIFJldHVybnMgdHJ1ZSBpZiBvay4KKy8vIE5vdGU6ICdpby0+ZGF0YScgbXVzdCBiZSBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIFZQOCBmcmFtZSBoZWFkZXIuCitpbnQgVlA4R2V0SGVhZGVycyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbyk7CisKKy8vIERlY29kZSBhIHBpY3R1cmUuIFdpbGwgY2FsbCBWUDhHZXRIZWFkZXJzKCkgaWYgaXQgd2Fzbid0IGRvbmUgYWxyZWFkeS4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBWUDhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworCisvLyBSZXR1cm4gY3VycmVudCBzdGF0dXMgb2YgdGhlIGRlY29kZXI6CitWUDhTdGF0dXNDb2RlIFZQOFN0YXR1cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyByZXR1cm4gcmVhZGFibGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxhc3Qgc3RhdHVzLgorY29uc3QgY2hhciogVlA4U3RhdHVzTWVzc2FnZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBSZXNldHMgdGhlIGRlY29kZXIgaW4gaXRzIGluaXRpYWwgc3RhdGUsIHJlY2xhaW1pbmcgbWVtb3J5LgorLy8gTm90IGEgbWFuZGF0b3J5IGNhbGwgYmV0d2VlbiBjYWxscyB0byBWUDhEZWNvZGUoKS4KK3ZvaWQgVlA4Q2xlYXIoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKworLy8gRGVzdHJveSB0aGUgZGVjb2RlciBvYmplY3QuCit2b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzY2VsbGFuZW91cyBWUDgvVlA4TCBiaXRzdHJlYW0gcHJvYmluZyBmdW5jdGlvbnMuCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCAzIGJ5dGVzIGluIGRhdGEgY29udGFpbiB0aGUgVlA4IHNpZ25hdHVyZS4KK1dFQlBfRVhURVJOKGludCkgVlA4Q2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vIFZhbGlkYXRlcyB0aGUgVlA4IGRhdGEtaGVhZGVyIGFuZCByZXRyaWV2ZXMgYmFzaWMgaGVhZGVyIGluZm9ybWF0aW9uIHZpegorLy8gd2lkdGggYW5kIGhlaWdodC4gUmV0dXJucyAwIGluIGNhc2Ugb2YgZm9ybWF0dGluZyBlcnJvci4gKndpZHRoLypoZWlnaHQKKy8vIGNhbiBiZSBwYXNzZWQgTlVMTC4KK1dFQlBfRVhURVJOKGludCkgVlA4R2V0SW5mbygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgIHNpemVfdCBkYXRhX3NpemUsICAgIC8vIGRhdGEgYXZhaWxhYmxlIHNvIGZhcgorICAgIHNpemVfdCBjaHVua19zaXplLCAgIC8vIHRvdGFsIGRhdGEgc2l6ZSBleHBlY3RlZCBpbiB0aGUgY2h1bmsKKyAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCBieXRlKHMpIGluIGRhdGEgaXMgYSBWUDhMIHNpZ25hdHVyZS4KK1dFQlBfRVhURVJOKGludCkgVlA4TENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8gVmFsaWRhdGVzIHRoZSBWUDhMIGRhdGEtaGVhZGVyIGFuZCByZXRyaWV2ZXMgYmFzaWMgaGVhZGVyIGluZm9ybWF0aW9uIHZpegorLy8gd2lkdGgsIGhlaWdodCBhbmQgYWxwaGEuIFJldHVybnMgMCBpbiBjYXNlIG9mIGZvcm1hdHRpbmcgZXJyb3IuCisvLyB3aWR0aC9oZWlnaHQvaGFzX2FscGhhIGNhbiBiZSBwYXNzZWQgTlVMTC4KK1dFQlBfRVhURVJOKGludCkgVlA4TEdldEluZm8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgIC8vIGRhdGEgYXZhaWxhYmxlIHNvIGZhcgorICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LCBpbnQqIGNvbnN0IGhhc19hbHBoYSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1dFQlBfREVDT0RFX1ZQOF9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2ZyYW1lLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg2YmFjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2ZyYW1lLmMKQEAgLTAsMCArMSw4MTIgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGcmFtZS1yZWNvbnN0cnVjdGlvbiBmdW5jdGlvbi4gTWVtb3J5IGFsbG9jYXRpb24uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9uLgorCitzdGF0aWMgY29uc3QgaW50IGtTY2FuWzE2XSA9IHsKKyAgMCArICAwICogQlBTLCAgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMsCisgIDAgKyAgNCAqIEJQUywgIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTLAorICAwICsgIDggKiBCUFMsICA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUywKKyAgMCArIDEyICogQlBTLCAgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMKK307CisKK3N0YXRpYyBpbnQgQ2hlY2tNb2RlKGludCBtYl94LCBpbnQgbWJfeSwgaW50IG1vZGUpIHsKKyAgaWYgKG1vZGUgPT0gQl9EQ19QUkVEKSB7CisgICAgaWYgKG1iX3ggPT0gMCkgeworICAgICAgcmV0dXJuIChtYl95ID09IDApID8gQl9EQ19QUkVEX05PVE9QTEVGVCA6IEJfRENfUFJFRF9OT0xFRlQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAobWJfeSA9PSAwKSA/IEJfRENfUFJFRF9OT1RPUCA6IEJfRENfUFJFRDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyB2b2lkIENvcHkzMmIodWludDhfdCogY29uc3QgZHN0LCBjb25zdCB1aW50OF90KiBjb25zdCBzcmMpIHsKKyAgbWVtY3B5KGRzdCwgc3JjLCA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9UcmFuc2Zvcm0odWludDMyX3QgYml0cywgY29uc3QgaW50MTZfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIHN3aXRjaCAoYml0cyA+PiAzMCkgeworICAgIGNhc2UgMzoKKyAgICAgIFZQOFRyYW5zZm9ybShzcmMsIGRzdCwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBWUDhUcmFuc2Zvcm1BQzMoc3JjLCBkc3QpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgVlA4VHJhbnNmb3JtREMoc3JjLCBkc3QpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERvVVZUcmFuc2Zvcm0odWludDMyX3QgYml0cywgY29uc3QgaW50MTZfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgaWYgKGJpdHMgJiAweGZmKSB7ICAgIC8vIGFueSBub24temVybyBjb2VmZiBhdCBhbGw/CisgICAgaWYgKGJpdHMgJiAweGFhKSB7ICAvLyBhbnkgbm9uLXplcm8gQUMgY29lZmZpY2llbnQ/CisgICAgICBWUDhUcmFuc2Zvcm1VVihzcmMsIGRzdCk7ICAgLy8gbm90ZSB3ZSBkb24ndCB1c2UgdGhlIEFDMyB2YXJpYW50IGZvciBVL1YKKyAgICB9IGVsc2UgeworICAgICAgVlA4VHJhbnNmb3JtRENVVihzcmMsIGRzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlY29uc3RydWN0Um93KGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGN0eCkgeworICBpbnQgajsKKyAgaW50IG1iX3g7CisgIGNvbnN0IGludCBtYl95ID0gY3R4LT5tYl95XzsKKyAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gZGVjLT55dXZfYl8gKyBZX09GRjsKKyAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPnl1dl9iXyArIFVfT0ZGOworICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+eXV2X2JfICsgVl9PRkY7CisKKyAgLy8gSW5pdGlhbGl6ZSBsZWZ0LW1vc3QgYmxvY2suCisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgeV9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OworICB9CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICB1X2RzdFtqICogQlBTIC0gMV0gPSAxMjk7CisgICAgdl9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OworICB9CisKKyAgLy8gSW5pdCB0b3AtbGVmdCBzYW1wbGUgb24gbGVmdCBjb2x1bW4gdG9vLgorICBpZiAobWJfeSA+IDApIHsKKyAgICB5X2RzdFstMSAtIEJQU10gPSB1X2RzdFstMSAtIEJQU10gPSB2X2RzdFstMSAtIEJQU10gPSAxMjk7CisgIH0gZWxzZSB7CisgICAgLy8gd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW5pdCBvbmNlIGF0IGJsb2NrICgwLDApLgorICAgIC8vIEFmdGVyd2FyZCwgaXQgcmVtYWlucyB2YWxpZCBmb3IgdGhlIHdob2xlIHRvcG1vc3Qgcm93LgorICAgIG1lbXNldCh5X2RzdCAtIEJQUyAtIDEsIDEyNywgMTYgKyA0ICsgMSk7CisgICAgbWVtc2V0KHVfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7CisgICAgbWVtc2V0KHZfZHN0IC0gQlBTIC0gMSwgMTI3LCA4ICsgMSk7CisgIH0KKworICAvLyBSZWNvbnN0cnVjdCBvbmUgcm93LgorICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgZGVjLT5tYl93XzsgKyttYl94KSB7CisgICAgY29uc3QgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGN0eC0+bWJfZGF0YV8gKyBtYl94OworCisgICAgLy8gUm90YXRlIGluIHRoZSBsZWZ0IHNhbXBsZXMgZnJvbSBwcmV2aW91c2x5IGRlY29kZWQgYmxvY2suIFdlIG1vdmUgZm91cgorICAgIC8vIHBpeGVscyBhdCBhIHRpbWUgZm9yIGFsaWdubWVudCByZWFzb24sIGFuZCBiZWNhdXNlIG9mIGluLWxvb3AgZmlsdGVyLgorICAgIGlmIChtYl94ID4gMCkgeworICAgICAgZm9yIChqID0gLTE7IGogPCAxNjsgKytqKSB7CisgICAgICAgIENvcHkzMmIoJnlfZHN0W2ogKiBCUFMgLSA0XSwgJnlfZHN0W2ogKiBCUFMgKyAxMl0pOworICAgICAgfQorICAgICAgZm9yIChqID0gLTE7IGogPCA4OyArK2opIHsKKyAgICAgICAgQ29weTMyYigmdV9kc3RbaiAqIEJQUyAtIDRdLCAmdV9kc3RbaiAqIEJQUyArIDRdKTsKKyAgICAgICAgQ29weTMyYigmdl9kc3RbaiAqIEJQUyAtIDRdLCAmdl9kc3RbaiAqIEJQUyArIDRdKTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgLy8gYnJpbmcgdG9wIHNhbXBsZXMgaW50byB0aGUgY2FjaGUKKyAgICAgIFZQOFRvcFNhbXBsZXMqIGNvbnN0IHRvcF95dXYgPSBkZWMtPnl1dl90XyArIG1iX3g7CisgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMgPSBibG9jay0+Y29lZmZzXzsKKyAgICAgIHVpbnQzMl90IGJpdHMgPSBibG9jay0+bm9uX3plcm9feV87CisgICAgICBpbnQgbjsKKworICAgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICAgIG1lbWNweSh5X2RzdCAtIEJQUywgdG9wX3l1dlswXS55LCAxNik7CisgICAgICAgIG1lbWNweSh1X2RzdCAtIEJQUywgdG9wX3l1dlswXS51LCA4KTsKKyAgICAgICAgbWVtY3B5KHZfZHN0IC0gQlBTLCB0b3BfeXV2WzBdLnYsIDgpOworICAgICAgfQorCisgICAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1YWxzCisgICAgICBpZiAoYmxvY2stPmlzX2k0eDRfKSB7ICAgLy8gNHg0CisgICAgICAgIHVpbnQzMl90KiBjb25zdCB0b3BfcmlnaHQgPSAodWludDMyX3QqKSh5X2RzdCAtIEJQUyArIDE2KTsKKworICAgICAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgICAgICBpZiAobWJfeCA+PSBkZWMtPm1iX3dfIC0gMSkgeyAgICAvLyBvbiByaWdodG1vc3QgYm9yZGVyCisgICAgICAgICAgICBtZW1zZXQodG9wX3JpZ2h0LCB0b3BfeXV2WzBdLnlbMTVdLCBzaXplb2YoKnRvcF9yaWdodCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkodG9wX3JpZ2h0LCB0b3BfeXV2WzFdLnksIHNpemVvZigqdG9wX3JpZ2h0KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlcGxpY2F0ZSB0aGUgdG9wLXJpZ2h0IHBpeGVscyBiZWxvdworICAgICAgICB0b3BfcmlnaHRbQlBTXSA9IHRvcF9yaWdodFsyICogQlBTXSA9IHRvcF9yaWdodFszICogQlBTXSA9IHRvcF9yaWdodFswXTsKKworICAgICAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1YWxzIGZvciBhbGwgNHg0IGJsb2NrcyBpbiB0dXJuLgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbiwgYml0cyA8PD0gMikgeworICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHlfZHN0ICsga1NjYW5bbl07CisgICAgICAgICAgVlA4UHJlZEx1bWE0W2Jsb2NrLT5pbW9kZXNfW25dXShkc3QpOworICAgICAgICAgIERvVHJhbnNmb3JtKGJpdHMsIGNvZWZmcyArIG4gKiAxNiwgZHN0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsgICAgLy8gMTZ4MTYKKyAgICAgICAgY29uc3QgaW50IHByZWRfZnVuYyA9IENoZWNrTW9kZShtYl94LCBtYl95LCBibG9jay0+aW1vZGVzX1swXSk7CisgICAgICAgIFZQOFByZWRMdW1hMTZbcHJlZF9mdW5jXSh5X2RzdCk7CisgICAgICAgIGlmIChiaXRzICE9IDApIHsKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTY7ICsrbiwgYml0cyA8PD0gMikgeworICAgICAgICAgICAgRG9UcmFuc2Zvcm0oYml0cywgY29lZmZzICsgbiAqIDE2LCB5X2RzdCArIGtTY2FuW25dKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHsKKyAgICAgICAgLy8gQ2hyb21hCisgICAgICAgIGNvbnN0IHVpbnQzMl90IGJpdHNfdXYgPSBibG9jay0+bm9uX3plcm9fdXZfOworICAgICAgICBjb25zdCBpbnQgcHJlZF9mdW5jID0gQ2hlY2tNb2RlKG1iX3gsIG1iX3ksIGJsb2NrLT51dm1vZGVfKTsKKyAgICAgICAgVlA4UHJlZENocm9tYThbcHJlZF9mdW5jXSh1X2RzdCk7CisgICAgICAgIFZQOFByZWRDaHJvbWE4W3ByZWRfZnVuY10odl9kc3QpOworICAgICAgICBEb1VWVHJhbnNmb3JtKGJpdHNfdXYgPj4gMCwgY29lZmZzICsgMTYgKiAxNiwgdV9kc3QpOworICAgICAgICBEb1VWVHJhbnNmb3JtKGJpdHNfdXYgPj4gOCwgY29lZmZzICsgMjAgKiAxNiwgdl9kc3QpOworICAgICAgfQorCisgICAgICAvLyBzdGFzaCBhd2F5IHRvcCBzYW1wbGVzIGZvciBuZXh0IGJsb2NrCisgICAgICBpZiAobWJfeSA8IGRlYy0+bWJfaF8gLSAxKSB7CisgICAgICAgIG1lbWNweSh0b3BfeXV2WzBdLnksIHlfZHN0ICsgMTUgKiBCUFMsIDE2KTsKKyAgICAgICAgbWVtY3B5KHRvcF95dXZbMF0udSwgdV9kc3QgKyAgNyAqIEJQUywgIDgpOworICAgICAgICBtZW1jcHkodG9wX3l1dlswXS52LCB2X2RzdCArICA3ICogQlBTLCAgOCk7CisgICAgICB9CisgICAgfQorICAgIC8vIFRyYW5zZmVyIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBmcm9tIHl1dl9iXyBjYWNoZSB0byBmaW5hbCBkZXN0aW5hdGlvbi4KKyAgICB7CisgICAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSBjYWNoZV9pZCAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgICAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gY2FjaGVfaWQgKiA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICAgICAgdWludDhfdCogY29uc3QgeV9vdXQgPSBkZWMtPmNhY2hlX3lfICsgbWJfeCAqIDE2ICsgeV9vZmZzZXQ7CisgICAgICB1aW50OF90KiBjb25zdCB1X291dCA9IGRlYy0+Y2FjaGVfdV8gKyBtYl94ICogOCArIHV2X29mZnNldDsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHZfb3V0ID0gZGVjLT5jYWNoZV92XyArIG1iX3ggKiA4ICsgdXZfb2Zmc2V0OworICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgbWVtY3B5KHlfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfLCB5X2RzdCArIGogKiBCUFMsIDE2KTsKKyAgICAgIH0KKyAgICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICAgICAgbWVtY3B5KHVfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdV9kc3QgKyBqICogQlBTLCA4KTsKKyAgICAgICAgbWVtY3B5KHZfb3V0ICsgaiAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdl9kc3QgKyBqICogQlBTLCA4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbHRlcmluZworCisvLyBrRmlsdGVyRXh0cmFSb3dzW10gPSBIb3cgbWFueSBleHRyYSBsaW5lcyBhcmUgbmVlZGVkIG9uIHRoZSBNQiBib3VuZGFyeQorLy8gZm9yIGNhY2hpbmcsIGdpdmVuIGEgZmlsdGVyaW5nIGxldmVsLgorLy8gU2ltcGxlIGZpbHRlcjogIHVwIHRvIDIgbHVtYSBzYW1wbGVzIGFyZSByZWFkIGFuZCAxIGlzIHdyaXR0ZW4uCisvLyBDb21wbGV4IGZpbHRlcjogdXAgdG8gNCBsdW1hIHNhbXBsZXMgYXJlIHJlYWQgYW5kIDMgYXJlIHdyaXR0ZW4uIFNhbWUgZm9yCisvLyAgICAgICAgICAgICAgICAgVS9WLCBzbyBpdCdzIDggc2FtcGxlcyB0b3RhbCAoYmVjYXVzZSBvZiB0aGUgMnggdXBzYW1wbGluZykuCitzdGF0aWMgY29uc3QgdWludDhfdCBrRmlsdGVyRXh0cmFSb3dzWzNdID0geyAwLCAyLCA4IH07CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IG1iX3gsIGludCBtYl95KSB7CisgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOworICBjb25zdCBpbnQgY2FjaGVfaWQgPSBjdHgtPmlkXzsKKyAgY29uc3QgaW50IHlfYnBzID0gZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGNvbnN0IFZQOEZJbmZvKiBjb25zdCBmX2luZm8gPSBjdHgtPmZfaW5mb18gKyBtYl94OworICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGRlYy0+Y2FjaGVfeV8gKyBjYWNoZV9pZCAqIDE2ICogeV9icHMgKyBtYl94ICogMTY7CisgIGNvbnN0IGludCBpbGV2ZWwgPSBmX2luZm8tPmZfaWxldmVsXzsKKyAgY29uc3QgaW50IGxpbWl0ID0gZl9pbmZvLT5mX2xpbWl0XzsKKyAgaWYgKGxpbWl0ID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgYXNzZXJ0KGxpbWl0ID49IDMpOworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQorICAgIGlmIChtYl94ID4gMCkgeworICAgICAgVlA4U2ltcGxlSEZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7CisgICAgfQorICAgIGlmIChtYl95ID4gMCkgeworICAgICAgVlA4U2ltcGxlVkZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0KTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCk7CisgICAgfQorICB9IGVsc2UgeyAgICAvLyBjb21wbGV4CisgICAgY29uc3QgaW50IHV2X2JwcyA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+Y2FjaGVfdV8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+Y2FjaGVfdl8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICBjb25zdCBpbnQgaGV2X3RocmVzaCA9IGZfaW5mby0+aGV2X3RocmVzaF87CisgICAgaWYgKG1iX3ggPiAwKSB7CisgICAgICBWUDhIRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhIRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4SEZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4SEZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICBWUDhWRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgICBWUDhWRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIH0KKyAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgeworICAgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4VkZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgIH0KK30KKworLy8gRmlsdGVyIHRoZSBkZWNvZGVkIG1hY3JvYmxvY2sgcm93IChpZiBuZWVkZWQpCitzdGF0aWMgdm9pZCBGaWx0ZXJSb3coY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBtYl94OworICBjb25zdCBpbnQgbWJfeSA9IGRlYy0+dGhyZWFkX2N0eF8ubWJfeV87CisgIGFzc2VydChkZWMtPnRocmVhZF9jdHhfLmZpbHRlcl9yb3dfKTsKKyAgZm9yIChtYl94ID0gZGVjLT50bF9tYl94XzsgbWJfeCA8IGRlYy0+YnJfbWJfeF87ICsrbWJfeCkgeworICAgIERvRmlsdGVyKGRlYywgbWJfeCwgbWJfeSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWNvbXB1dGUgdGhlIGZpbHRlcmluZyBzdHJlbmd0aCBmb3IgZWFjaCBzZWdtZW50IGFuZCBlYWNoIGk0eDQvaTE2eDE2IG1vZGUuCisKK3N0YXRpYyB2b2lkIFByZWNvbXB1dGVGaWx0ZXJTdHJlbmd0aHMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA+IDApIHsKKyAgICBpbnQgczsKKyAgICBjb25zdCBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZkZWMtPmZpbHRlcl9oZHJfOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgaW50IGk0eDQ7CisgICAgICAvLyBGaXJzdCwgY29tcHV0ZSB0aGUgaW5pdGlhbCBsZXZlbAorICAgICAgaW50IGJhc2VfbGV2ZWw7CisgICAgICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXNlX3NlZ21lbnRfKSB7CisgICAgICAgIGJhc2VfbGV2ZWwgPSBkZWMtPnNlZ21lbnRfaGRyXy5maWx0ZXJfc3RyZW5ndGhfW3NdOworICAgICAgICBpZiAoIWRlYy0+c2VnbWVudF9oZHJfLmFic29sdXRlX2RlbHRhXykgeworICAgICAgICAgIGJhc2VfbGV2ZWwgKz0gaGRyLT5sZXZlbF87CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJhc2VfbGV2ZWwgPSBoZHItPmxldmVsXzsKKyAgICAgIH0KKyAgICAgIGZvciAoaTR4NCA9IDA7IGk0eDQgPD0gMTsgKytpNHg0KSB7CisgICAgICAgIFZQOEZJbmZvKiBjb25zdCBpbmZvID0gJmRlYy0+ZnN0cmVuZ3Roc19bc11baTR4NF07CisgICAgICAgIGludCBsZXZlbCA9IGJhc2VfbGV2ZWw7CisgICAgICAgIGlmIChoZHItPnVzZV9sZl9kZWx0YV8pIHsKKyAgICAgICAgICBsZXZlbCArPSBoZHItPnJlZl9sZl9kZWx0YV9bMF07CisgICAgICAgICAgaWYgKGk0eDQpIHsKKyAgICAgICAgICAgIGxldmVsICs9IGhkci0+bW9kZV9sZl9kZWx0YV9bMF07CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxldmVsID0gKGxldmVsIDwgMCkgPyAwIDogKGxldmVsID4gNjMpID8gNjMgOiBsZXZlbDsKKyAgICAgICAgaWYgKGxldmVsID4gMCkgeworICAgICAgICAgIGludCBpbGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICBpZiAoaGRyLT5zaGFycG5lc3NfID4gMCkgeworICAgICAgICAgICAgaWYgKGhkci0+c2hhcnBuZXNzXyA+IDQpIHsKKyAgICAgICAgICAgICAgaWxldmVsID4+PSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWxldmVsID4+PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlsZXZlbCA+IDkgLSBoZHItPnNoYXJwbmVzc18pIHsKKyAgICAgICAgICAgICAgaWxldmVsID0gOSAtIGhkci0+c2hhcnBuZXNzXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlsZXZlbCA8IDEpIGlsZXZlbCA9IDE7CisgICAgICAgICAgaW5mby0+Zl9pbGV2ZWxfID0gaWxldmVsOworICAgICAgICAgIGluZm8tPmZfbGltaXRfID0gMiAqIGxldmVsICsgaWxldmVsOworICAgICAgICAgIGluZm8tPmhldl90aHJlc2hfID0gKGxldmVsID49IDQwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5mby0+Zl9saW1pdF8gPSAwOyAgLy8gbm8gZmlsdGVyaW5nCisgICAgICAgIH0KKyAgICAgICAgaW5mby0+Zl9pbm5lcl8gPSBpNHg0OworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGl0aGVyaW5nCisKKy8vIG1pbmltYWwgYW1wIHRoYXQgd2lsbCBwcm92aWRlIGEgbm9uLXplcm8gZGl0aGVyaW5nIGVmZmVjdAorI2RlZmluZSBNSU5fRElUSEVSX0FNUCA0CisKKyNkZWZpbmUgRElUSEVSX0FNUF9UQUJfU0laRSAxMgorc3RhdGljIGNvbnN0IGludCBrUXVhbnRUb0RpdGhlckFtcFtESVRIRVJfQU1QX1RBQl9TSVpFXSA9IHsKKyAgLy8gcm91Z2hseSwgaXQncyBkcW0tPnV2X21hdF9bMV0KKyAgOCwgNywgNiwgNCwgNCwgMiwgMiwgMiwgMSwgMSwgMSwgMQorfTsKKwordm9pZCBWUDhJbml0RGl0aGVyaW5nKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgYXNzZXJ0KGRlYyAhPSBOVUxMKTsKKyAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBkID0gb3B0aW9ucy0+ZGl0aGVyaW5nX3N0cmVuZ3RoOworICAgIGNvbnN0IGludCBtYXhfYW1wID0gKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKSAtIDE7CisgICAgY29uc3QgaW50IGYgPSAoZCA8IDApID8gMCA6IChkID4gMTAwKSA/IG1heF9hbXAgOiAoZCAqIG1heF9hbXAgLyAxMDApOworICAgIGlmIChmID4gMCkgeworICAgICAgaW50IHM7CisgICAgICBpbnQgYWxsX2FtcCA9IDA7CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgVlA4UXVhbnRNYXRyaXgqIGNvbnN0IGRxbSA9ICZkZWMtPmRxbV9bc107CisgICAgICAgIGlmIChkcW0tPnV2X3F1YW50XyA8IERJVEhFUl9BTVBfVEFCX1NJWkUpIHsKKyAgICAgICAgICAvLyBUT0RPKHNrYWwpOiBzaG91bGQgd2Ugc3BlY2lhbGx5IGRpdGhlciBtb3JlIGZvciB1dl9xdWFudF8gPCAwPworICAgICAgICAgIGNvbnN0IGludCBpZHggPSAoZHFtLT51dl9xdWFudF8gPCAwKSA/IDAgOiBkcW0tPnV2X3F1YW50XzsKKyAgICAgICAgICBkcW0tPmRpdGhlcl8gPSAoZiAqIGtRdWFudFRvRGl0aGVyQW1wW2lkeF0pID4+IDM7CisgICAgICAgIH0KKyAgICAgICAgYWxsX2FtcCB8PSBkcW0tPmRpdGhlcl87CisgICAgICB9CisgICAgICBpZiAoYWxsX2FtcCAhPSAwKSB7CisgICAgICAgIFZQOEluaXRSYW5kb20oJmRlYy0+ZGl0aGVyaW5nX3JnXywgMS4wZik7CisgICAgICAgIGRlYy0+ZGl0aGVyXyA9IDE7CisgICAgICB9CisgICAgfQorICAgIC8vIHBvdGVudGlhbGx5IGFsbG93IGFscGhhIGRpdGhlcmluZworICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IG9wdGlvbnMtPmFscGhhX2RpdGhlcmluZ19zdHJlbmd0aDsKKyAgICBpZiAoZGVjLT5hbHBoYV9kaXRoZXJpbmdfID4gMTAwKSB7CisgICAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSAxMDA7CisgICAgfSBlbHNlIGlmIChkZWMtPmFscGhhX2RpdGhlcmluZ18gPCAwKSB7CisgICAgICBkZWMtPmFscGhhX2RpdGhlcmluZ18gPSAwOworICAgIH0KKyAgfQorfQorCisvLyBDb252ZXJ0IHRvIHJhbmdlOiBbLTIsMl0gZm9yIGRpdGhlcj01MCwgWy00LDRdIGZvciBkaXRoZXI9MTAwCitzdGF0aWMgdm9pZCBEaXRoZXI4eDgoVlA4UmFuZG9tKiBjb25zdCByZywgdWludDhfdCogZHN0LCBpbnQgYnBzLCBpbnQgYW1wKSB7CisgIHVpbnQ4X3QgZGl0aGVyWzY0XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4ICogODsgKytpKSB7CisgICAgZGl0aGVyW2ldID0gVlA4UmFuZG9tQml0czIocmcsIFZQOF9ESVRIRVJfQU1QX0JJVFMgKyAxLCBhbXApOworICB9CisgIFZQOERpdGhlckNvbWJpbmU4eDgoZGl0aGVyLCBkc3QsIGJwcyk7Cit9CisKK3N0YXRpYyB2b2lkIERpdGhlclJvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaW50IG1iX3g7CisgIGFzc2VydChkZWMtPmRpdGhlcl8pOworICBmb3IgKG1iX3ggPSBkZWMtPnRsX21iX3hfOyBtYl94IDwgZGVjLT5icl9tYl94XzsgKyttYl94KSB7CisgICAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgICAgY29uc3QgVlA4TUJEYXRhKiBjb25zdCBkYXRhID0gY3R4LT5tYl9kYXRhXyArIG1iX3g7CisgICAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgICAgY29uc3QgaW50IHV2X2JwcyA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICBpZiAoZGF0YS0+ZGl0aGVyXyA+PSBNSU5fRElUSEVSX0FNUCkgeworICAgICAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPmNhY2hlX3VfICsgY2FjaGVfaWQgKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7CisgICAgICB1aW50OF90KiBjb25zdCB2X2RzdCA9IGRlYy0+Y2FjaGVfdl8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICAgIERpdGhlcjh4OCgmZGVjLT5kaXRoZXJpbmdfcmdfLCB1X2RzdCwgdXZfYnBzLCBkYXRhLT5kaXRoZXJfKTsKKyAgICAgIERpdGhlcjh4OCgmZGVjLT5kaXRoZXJpbmdfcmdfLCB2X2RzdCwgdXZfYnBzLCBkYXRhLT5kaXRoZXJfKTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgcm93IG9mIG1hY3JvYmxvY2tzIGlzIGZpbmlzaGVkIGRlY29kaW5nLgorLy8gSXQgYWxzbyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisvLyAgKiBJbiBjYXNlIG9mIGluLWxvb3AgZmlsdGVyaW5nLCB3ZSBtdXN0IGhvbGQgb2ZmIHNlbmRpbmcgc29tZSBvZiB0aGUgYm90dG9tCisvLyAgICBwaXhlbHMgYXMgdGhleSBhcmUgeWV0IHVuZmlsdGVyZWQuIFRoZXkgd2lsbCBiZSB3aGVuIHRoZSBuZXh0IG1hY3JvYmxvY2sKKy8vICAgIHJvdyBpcyBkZWNvZGVkLiBNZWFud2hpbGUsIHdlIG11c3QgcHJlc2VydmUgdGhlbSBieSByb3RhdGluZyB0aGVtIGluIHRoZQorLy8gICAgY2FjaGUgYXJlYS4gVGhpcyBkb2Vzbid0IGhvbGQgZm9yIHRoZSB2ZXJ5IGJvdHRvbSByb3cgb2YgdGhlIHVuY3JvcHBlZAorLy8gICAgcGljdHVyZSBvZiBjb3Vyc2UuCisvLyAgKiB3ZSBtdXN0IGNsaXAgdGhlIHJlbWFpbmluZyBwaXhlbHMgYWdhaW5zdCB0aGUgY3JvcHBpbmcgYXJlYS4gVGhlIFZQOElvCisvLyAgICBzdHJ1Y3QgbXVzdCBoYXZlIHRoZSBmb2xsb3dpbmcgZmllbGRzIHNldCBjb3JyZWN0bHkgYmVmb3JlIGNhbGxpbmcgcHV0KCk6CisKKyNkZWZpbmUgTUFDUk9CTE9DS19WUE9TKG1iX3kpICAoKG1iX3kpICogMTYpICAgIC8vIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGEgTUIKKworLy8gRmluYWxpemUgYW5kIHRyYW5zbWl0IGEgY29tcGxldGUgcm93LiBSZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiB1c2VyLWFib3J0Lgorc3RhdGljIGludCBGaW5pc2hSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgIGNvbnN0IGludCBjYWNoZV9pZCA9IGN0eC0+aWRfOworICBjb25zdCBpbnQgZXh0cmFfeV9yb3dzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107CisgIGNvbnN0IGludCB5c2l6ZSA9IGV4dHJhX3lfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBjb25zdCBpbnQgdXZzaXplID0gKGV4dHJhX3lfcm93cyAvIDIpICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICBjb25zdCBpbnQgeV9vZmZzZXQgPSBjYWNoZV9pZCAqIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgIGNvbnN0IGludCB1dl9vZmZzZXQgPSBjYWNoZV9pZCAqIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgIHVpbnQ4X3QqIGNvbnN0IHlkc3QgPSBkZWMtPmNhY2hlX3lfIC0geXNpemUgKyB5X29mZnNldDsKKyAgdWludDhfdCogY29uc3QgdWRzdCA9IGRlYy0+Y2FjaGVfdV8gLSB1dnNpemUgKyB1dl9vZmZzZXQ7CisgIHVpbnQ4X3QqIGNvbnN0IHZkc3QgPSBkZWMtPmNhY2hlX3ZfIC0gdXZzaXplICsgdXZfb2Zmc2V0OworICBjb25zdCBpbnQgbWJfeSA9IGN0eC0+bWJfeV87CisgIGNvbnN0IGludCBpc19maXJzdF9yb3cgPSAobWJfeSA9PSAwKTsKKyAgY29uc3QgaW50IGlzX2xhc3Rfcm93ID0gKG1iX3kgPj0gZGVjLT5icl9tYl95XyAtIDEpOworCisgIGlmIChkZWMtPm10X21ldGhvZF8gPT0gMikgeworICAgIFJlY29uc3RydWN0Um93KGRlYywgY3R4KTsKKyAgfQorCisgIGlmIChjdHgtPmZpbHRlcl9yb3dfKSB7CisgICAgRmlsdGVyUm93KGRlYyk7CisgIH0KKworICBpZiAoZGVjLT5kaXRoZXJfKSB7CisgICAgRGl0aGVyUm93KGRlYyk7CisgIH0KKworICBpZiAoaW8tPnB1dCAhPSBOVUxMKSB7CisgICAgaW50IHlfc3RhcnQgPSBNQUNST0JMT0NLX1ZQT1MobWJfeSk7CisgICAgaW50IHlfZW5kID0gTUFDUk9CTE9DS19WUE9TKG1iX3kgKyAxKTsKKyAgICBpZiAoIWlzX2ZpcnN0X3JvdykgeworICAgICAgeV9zdGFydCAtPSBleHRyYV95X3Jvd3M7CisgICAgICBpby0+eSA9IHlkc3Q7CisgICAgICBpby0+dSA9IHVkc3Q7CisgICAgICBpby0+diA9IHZkc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIGlvLT55ID0gZGVjLT5jYWNoZV95XyArIHlfb2Zmc2V0OworICAgICAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfICsgdXZfb2Zmc2V0OworICAgICAgaW8tPnYgPSBkZWMtPmNhY2hlX3ZfICsgdXZfb2Zmc2V0OworICAgIH0KKworICAgIGlmICghaXNfbGFzdF9yb3cpIHsKKyAgICAgIHlfZW5kIC09IGV4dHJhX3lfcm93czsKKyAgICB9CisgICAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7CisgICAgICB5X2VuZCA9IGlvLT5jcm9wX2JvdHRvbTsgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IG9uIGxhc3Qgcm93LgorICAgIH0KKyAgICBpby0+YSA9IE5VTEw7CisgICAgaWYgKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCAmJiB5X3N0YXJ0IDwgeV9lbmQpIHsKKyAgICAgIC8vIFRPRE8oc2thbCk6IHRlc3RpbmcgcHJlc2VuY2Ugb2YgYWxwaGEgd2l0aCBkZWMtPmFscGhhX2RhdGFfIGlzIG5vdCBhCisgICAgICAvLyBnb29kIGlkZWEuCisgICAgICBpby0+YSA9IFZQOERlY29tcHJlc3NBbHBoYVJvd3MoZGVjLCBpbywgeV9zdGFydCwgeV9lbmQgLSB5X3N0YXJ0KTsKKyAgICAgIGlmIChpby0+YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWNvZGUgYWxwaGEgZGF0YS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKKyAgICAgIGNvbnN0IGludCBkZWx0YV95ID0gaW8tPmNyb3BfdG9wIC0geV9zdGFydDsKKyAgICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7CisgICAgICBhc3NlcnQoIShkZWx0YV95ICYgMSkpOworICAgICAgaW8tPnkgKz0gZGVjLT5jYWNoZV95X3N0cmlkZV8gKiBkZWx0YV95OworICAgICAgaW8tPnUgKz0gZGVjLT5jYWNoZV91dl9zdHJpZGVfICogKGRlbHRhX3kgPj4gMSk7CisgICAgICBpby0+diArPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKiAoZGVsdGFfeSA+PiAxKTsKKyAgICAgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgICAgIGlvLT5hICs9IGlvLT53aWR0aCAqIGRlbHRhX3k7CisgICAgICB9CisgICAgfQorICAgIGlmICh5X3N0YXJ0IDwgeV9lbmQpIHsKKyAgICAgIGlvLT55ICs9IGlvLT5jcm9wX2xlZnQ7CisgICAgICBpby0+dSArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7CisgICAgICBpby0+diArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7CisgICAgICBpZiAoaW8tPmEgIT0gTlVMTCkgeworICAgICAgICBpby0+YSArPSBpby0+Y3JvcF9sZWZ0OworICAgICAgfQorICAgICAgaW8tPm1iX3kgPSB5X3N0YXJ0IC0gaW8tPmNyb3BfdG9wOworICAgICAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7CisgICAgICBpby0+bWJfaCA9IHlfZW5kIC0geV9zdGFydDsKKyAgICAgIG9rID0gaW8tPnB1dChpbyk7CisgICAgfQorICB9CisgIC8vIHJvdGF0ZSB0b3Agc2FtcGxlcyBpZiBuZWVkZWQKKyAgaWYgKGNhY2hlX2lkICsgMSA9PSBkZWMtPm51bV9jYWNoZXNfKSB7CisgICAgaWYgKCFpc19sYXN0X3JvdykgeworICAgICAgbWVtY3B5KGRlYy0+Y2FjaGVfeV8gLSB5c2l6ZSwgeWRzdCArIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV8sIHlzaXplKTsKKyAgICAgIG1lbWNweShkZWMtPmNhY2hlX3VfIC0gdXZzaXplLCB1ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKKyAgICAgIG1lbWNweShkZWMtPmNhY2hlX3ZfIC0gdXZzaXplLCB2ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gb2s7Cit9CisKKyN1bmRlZiBNQUNST0JMT0NLX1ZQT1MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMTsKKyAgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgIGNvbnN0IGludCBmaWx0ZXJfcm93ID0KKyAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApICYmCisgICAgICAoZGVjLT5tYl95XyA+PSBkZWMtPnRsX21iX3lfKSAmJiAoZGVjLT5tYl95XyA8PSBkZWMtPmJyX21iX3lfKTsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA9PSAwKSB7CisgICAgLy8gY3R4LT5pZF8gYW5kIGN0eC0+Zl9pbmZvXyBhcmUgYWxyZWFkeSBzZXQKKyAgICBjdHgtPm1iX3lfID0gZGVjLT5tYl95XzsKKyAgICBjdHgtPmZpbHRlcl9yb3dfID0gZmlsdGVyX3JvdzsKKyAgICBSZWNvbnN0cnVjdFJvdyhkZWMsIGN0eCk7CisgICAgb2sgPSBGaW5pc2hSb3coZGVjLCBpbyk7CisgIH0gZWxzZSB7CisgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmRlYy0+d29ya2VyXzsKKyAgICAvLyBGaW5pc2ggcHJldmlvdXMgam9iICpiZWZvcmUqIHVwZGF0aW5nIGNvbnRleHQKKyAgICBvayAmPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMod29ya2VyKTsKKyAgICBhc3NlcnQod29ya2VyLT5zdGF0dXNfID09IE9LKTsKKyAgICBpZiAob2spIHsgICAvLyBzcGF3biBhIG5ldyBkZWJsb2NraW5nL291dHB1dCBqb2IKKyAgICAgIGN0eC0+aW9fID0gKmlvOworICAgICAgY3R4LT5pZF8gPSBkZWMtPmNhY2hlX2lkXzsKKyAgICAgIGN0eC0+bWJfeV8gPSBkZWMtPm1iX3lfOworICAgICAgY3R4LT5maWx0ZXJfcm93XyA9IGZpbHRlcl9yb3c7CisgICAgICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDIpIHsgIC8vIHN3YXAgbWFjcm9ibG9jayBkYXRhCisgICAgICAgIFZQOE1CRGF0YSogY29uc3QgdG1wID0gY3R4LT5tYl9kYXRhXzsKKyAgICAgICAgY3R4LT5tYl9kYXRhXyA9IGRlYy0+bWJfZGF0YV87CisgICAgICAgIGRlYy0+bWJfZGF0YV8gPSB0bXA7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwZXJmb3JtIHJlY29uc3RydWN0aW9uIGRpcmVjdGx5IGluIG1haW4gdGhyZWFkCisgICAgICAgIFJlY29uc3RydWN0Um93KGRlYywgY3R4KTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWx0ZXJfcm93KSB7ICAgICAgICAgICAgLy8gc3dhcCBmaWx0ZXIgaW5mbworICAgICAgICBWUDhGSW5mbyogY29uc3QgdG1wID0gY3R4LT5mX2luZm9fOworICAgICAgICBjdHgtPmZfaW5mb18gPSBkZWMtPmZfaW5mb187CisgICAgICAgIGRlYy0+Zl9pbmZvXyA9IHRtcDsKKyAgICAgIH0KKyAgICAgIC8vIChyZWNvbnN0cnVjdCkrZmlsdGVyIGluIHBhcmFsbGVsCisgICAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkxhdW5jaCh3b3JrZXIpOworICAgICAgaWYgKCsrZGVjLT5jYWNoZV9pZF8gPT0gZGVjLT5udW1fY2FjaGVzXykgeworICAgICAgICBkZWMtPmNhY2hlX2lkXyA9IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIgb25jZSB1c2VyJ3Mgc2V0dXAoKSBpcyBjYWxsZWQuCisKK1ZQOFN0YXR1c0NvZGUgVlA4RW50ZXJDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICAvLyBDYWxsIHNldHVwKCkgZmlyc3QuIFRoaXMgbWF5IHRyaWdnZXIgYWRkaXRpb25hbCBkZWNvZGluZyBmZWF0dXJlcyBvbiAnaW8nLgorICAvLyBOb3RlOiBBZnRlcndhcmQsIHdlIG11c3QgY2FsbCB0ZWFyZG93bigpIG5vIG1hdHRlciB3aGF0LgorICBpZiAoaW8tPnNldHVwICE9IE5VTEwgJiYgIWlvLT5zZXR1cChpbykpIHsKKyAgICBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwgIkZyYW1lIHNldHVwIGZhaWxlZCIpOworICAgIHJldHVybiBkZWMtPnN0YXR1c187CisgIH0KKworICAvLyBEaXNhYmxlIGZpbHRlcmluZyBwZXIgdXNlciByZXF1ZXN0CisgIGlmIChpby0+YnlwYXNzX2ZpbHRlcmluZykgeworICAgIGRlYy0+ZmlsdGVyX3R5cGVfID0gMDsKKyAgfQorICAvLyBUT0RPKHNrYWwpOiBmaWx0ZXIgdHlwZSAvIHN0cmVuZ3RoIC8gc2hhcnBuZXNzIGZvcmNpbmcKKworICAvLyBEZWZpbmUgdGhlIGFyZWEgd2hlcmUgd2UgY2FuIHNraXAgaW4tbG9vcCBmaWx0ZXJpbmcsIGluIGNhc2Ugb2YgY3JvcHBpbmcuCisgIC8vCisgIC8vICdTaW1wbGUnIGZpbHRlciByZWFkcyB0d28gbHVtYSBzYW1wbGVzIG91dHNpZGUgb2YgdGhlIG1hY3JvYmxvY2sKKyAgLy8gYW5kIGZpbHRlcnMgb25lLiBJdCBkb2Vzbid0IGZpbHRlciB0aGUgY2hyb21hIHNhbXBsZXMuIEhlbmNlLCB3ZSBjYW4KKyAgLy8gYXZvaWQgZG9pbmcgdGhlIGluLWxvb3AgZmlsdGVyaW5nIGJlZm9yZSBjcm9wX3RvcC9jcm9wX2xlZnQgcG9zaXRpb24uCisgIC8vIEZvciB0aGUgJ0NvbXBsZXgnIGZpbHRlciwgMyBzYW1wbGVzIGFyZSByZWFkIGFuZCB1cCB0byAzIGFyZSBmaWx0ZXJlZC4KKyAgLy8gTWVhbnM6IHRoZXJlJ3MgYSBkZXBlbmRlbmN5IGNoYWluIHRoYXQgZ29lcyBhbGwgdGhlIHdheSB1cCB0byB0aGUKKyAgLy8gdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwaWN0dXJlIChNQiAjMCkuIFdlIG11c3QgZmlsdGVyIGFsbCB0aGUgcHJldmlvdXMKKyAgLy8gbWFjcm9ibG9ja3MuCisgIC8vIFRPRE8oc2thbCk6IGFkZCBhbiAnYXBwcm94aW1hdGVfZGVjb2RpbmcnIG9wdGlvbiwgdGhhdCB3b24ndCBwcm9kdWNlCisgIC8vIGEgMToxIGJpdC1leGFjdG5lc3MgZm9yIGNvbXBsZXggZmlsdGVyaW5nPworICB7CisgICAgY29uc3QgaW50IGV4dHJhX3BpeGVscyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOworICAgIGlmIChkZWMtPmZpbHRlcl90eXBlXyA9PSAyKSB7CisgICAgICAvLyBGb3IgY29tcGxleCBmaWx0ZXIsIHdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGRlcGVuZGVuY3kgY2hhaW4uCisgICAgICBkZWMtPnRsX21iX3hfID0gMDsKKyAgICAgIGRlYy0+dGxfbWJfeV8gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvLyBGb3Igc2ltcGxlIGZpbHRlciwgd2UgY2FuIGZpbHRlciBvbmx5IHRoZSBjcm9wcGVkIHJlZ2lvbi4KKyAgICAgIC8vIFdlIGluY2x1ZGUgJ2V4dHJhX3BpeGVscycgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIGJvdW5kYXJ5LCBzaW5jZQorICAgICAgLy8gdmVydGljYWwgb3IgaG9yaXpvbnRhbCBmaWx0ZXJpbmcgb2YgdGhlIHByZXZpb3VzIG1hY3JvYmxvY2sgY2FuCisgICAgICAvLyBtb2RpZnkgc29tZSBhYnV0dGluZyBwaXhlbHMuCisgICAgICBkZWMtPnRsX21iX3hfID0gKGlvLT5jcm9wX2xlZnQgLSBleHRyYV9waXhlbHMpID4+IDQ7CisgICAgICBkZWMtPnRsX21iX3lfID0gKGlvLT5jcm9wX3RvcCAtIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICAgIGlmIChkZWMtPnRsX21iX3hfIDwgMCkgZGVjLT50bF9tYl94XyA9IDA7CisgICAgICBpZiAoZGVjLT50bF9tYl95XyA8IDApIGRlYy0+dGxfbWJfeV8gPSAwOworICAgIH0KKyAgICAvLyBXZSBuZWVkIHNvbWUgJ2V4dHJhJyBwaXhlbHMgb24gdGhlIHJpZ2h0L2JvdHRvbS4KKyAgICBkZWMtPmJyX21iX3lfID0gKGlvLT5jcm9wX2JvdHRvbSArIDE1ICsgZXh0cmFfcGl4ZWxzKSA+PiA0OworICAgIGRlYy0+YnJfbWJfeF8gPSAoaW8tPmNyb3BfcmlnaHQgKyAxNSArIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICBpZiAoZGVjLT5icl9tYl94XyA+IGRlYy0+bWJfd18pIHsKKyAgICAgIGRlYy0+YnJfbWJfeF8gPSBkZWMtPm1iX3dfOworICAgIH0KKyAgICBpZiAoZGVjLT5icl9tYl95XyA+IGRlYy0+bWJfaF8pIHsKKyAgICAgIGRlYy0+YnJfbWJfeV8gPSBkZWMtPm1iX2hfOworICAgIH0KKyAgfQorICBQcmVjb21wdXRlRmlsdGVyU3RyZW5ndGhzKGRlYyk7CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitpbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGludCBvayA9IDE7CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgb2sgPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMoJmRlYy0+d29ya2VyXyk7CisgIH0KKworICBpZiAoaW8tPnRlYXJkb3duICE9IE5VTEwpIHsKKyAgICBpby0+dGVhcmRvd24oaW8pOworICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvciBtdWx0aS10aHJlYWRlZCBkZWNvZGluZyB3ZSBuZWVkIHRvIHVzZSAzIHJvd3Mgb2YgMTYgcGl4ZWxzIGFzIGRlbGF5IGxpbmUuCisvLworLy8gUmVhc29uIGlzOiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgY2Fubm90IGRlYmxvY2sgdGhlIGJvdHRvbSBob3Jpem9udGFsIGVkZ2VzCisvLyBpbW1lZGlhdGVseSwgYW5kIG5lZWRzIHRvIHdhaXQgZm9yIGZpcnN0IGZldyByb3dzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgdG8KKy8vIGJlIGRlY29kZWQuIEhlbmNlLCBkZWJsb2NraW5nIGlzIGxhZ2dpbmcgYmVoaW5kIGJ5IDQgb3IgOCBwaXhlbHMgKGRlcGVuZGluZworLy8gb24gc3RyZW5ndGgpLgorLy8gV2l0aCB0d28gdGhyZWFkcywgdGhlIHZlcnRpY2FsIHBvc2l0aW9ucyBvZiB0aGUgcm93cyBiZWluZyBkZWNvZGVkIGFyZToKKy8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVs0OC4uNjNdWzY0Li43OV1bLi4uCisvLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yN11bMjguLjQzXVs0NC4uNTldWy4uLgorLy8gSWYgd2UgdXNlIHR3byB0aHJlYWRzIGFuZCB0d28gY2FjaGVzIG9mIDE2IHBpeGVscywgdGhlIHNlcXVlbmNlIHdvdWxkIGJlOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTUhIV1bMTYuLjMxXVsgMC4uMTVdWy4uLgorLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjchIV1bLTQuLjExXVsxMi4uMjddWy4uLgorLy8gVGhlIHByb2JsZW0gb2NjdXJzIGR1cmluZyByb3cgWzEyLi4xNSEhXSB0aGF0IGJvdGggdGhlIGRlY29kaW5nIGFuZAorLy8gZGVibG9ja2luZyB0aHJlYWRzIGFyZSB3cml0aW5nIHNpbXVsdGFuZW91c2x5LgorLy8gV2l0aCAzIGNhY2hlIGxpbmVzLCBvbmUgZ2V0IGEgc2FmZSB3cml0ZSBwYXR0ZXJuOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWzAuLgorLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjddWzI4Li40M11bLTQuLjExXVsxMi4uMjddWzI4Li4uCisvLyBOb3RlIHRoYXQgbXVsdGktdGhyZWFkZWQgb3V0cHV0IF93aXRob3V0XyBkZWJsb2NraW5nIGNhbiBtYWtlIHVzZSBvZiB0d28KKy8vIGNhY2hlIGxpbmVzIG9mIDE2IHBpeGVscyBvbmx5LCBzaW5jZSB0aGVyZSdzIG5vIGxhZ2dpbmcgYmVoaW5kLiBUaGUgZGVjb2RpbmcKKy8vIGFuZCBvdXRwdXQgcHJvY2VzcyBoYXZlIG5vbi1jb25jdXJyZW50IHdyaXRpbmc6CisvLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNV1bMTYuLjMxXVsuLi4KKy8vIGlvLT5wdXQ6ICAgICAgICAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTVdWy4uLgorCisjZGVmaW5lIE1UX0NBQ0hFX0xJTkVTIDMKKyNkZWZpbmUgU1RfQ0FDSEVfTElORVMgMSAgIC8vIDEgY2FjaGUgcm93IG9ubHkgZm9yIHNpbmdsZS10aHJlYWRlZCBjYXNlCisKKy8vIEluaXRpYWxpemUgbXVsdGkvc2luZ2xlLXRocmVhZCB3b3JrZXIKK3N0YXRpYyBpbnQgSW5pdFRocmVhZENvbnRleHQoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGRlYy0+Y2FjaGVfaWRfID0gMDsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA+IDApIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZGVjLT53b3JrZXJfOworICAgIGlmICghV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5SZXNldCh3b3JrZXIpKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7CisgICAgfQorICAgIHdvcmtlci0+ZGF0YTEgPSBkZWM7CisgICAgd29ya2VyLT5kYXRhMiA9ICh2b2lkKikmZGVjLT50aHJlYWRfY3R4Xy5pb187CisgICAgd29ya2VyLT5ob29rID0gKFdlYlBXb3JrZXJIb29rKUZpbmlzaFJvdzsKKyAgICBkZWMtPm51bV9jYWNoZXNfID0KKyAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApID8gTVRfQ0FDSEVfTElORVMgOiBNVF9DQUNIRV9MSU5FUyAtIDE7CisgIH0gZWxzZSB7CisgICAgZGVjLT5udW1fY2FjaGVzXyA9IFNUX0NBQ0hFX0xJTkVTOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgVlA4R2V0VGhyZWFkTWV0aG9kKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGlmIChvcHRpb25zID09IE5VTEwgfHwgb3B0aW9ucy0+dXNlX3RocmVhZHMgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgICh2b2lkKWhlYWRlcnM7CisgICh2b2lkKXdpZHRoOworICAodm9pZCloZWlnaHQ7CisgIGFzc2VydChoZWFkZXJzID09IE5VTEwgfHwgIWhlYWRlcnMtPmlzX2xvc3NsZXNzKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1RIUkVBRCkKKyAgaWYgKHdpZHRoIDwgTUlOX1dJRFRIX0ZPUl9USFJFQURTKSByZXR1cm4gMDsKKyAgLy8gVE9ETyhza2FsKTogdHVuZSB0aGUgaGV1cmlzdGljIGZ1cnRoZXIKKyNpZiAwCisgIGlmIChoZWlnaHQgPCAyICogd2lkdGgpIHJldHVybiAyOworI2VuZGlmCisgIHJldHVybiAyOworI2Vsc2UgICAvLyAhV0VCUF9VU0VfVEhSRUFECisgIHJldHVybiAwOworI2VuZGlmCit9CisKKyN1bmRlZiBNVF9DQUNIRV9MSU5FUworI3VuZGVmIFNUX0NBQ0hFX0xJTkVTCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZW1vcnkgc2V0dXAKKworc3RhdGljIGludCBBbGxvY2F0ZU1lbW9yeShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgY29uc3QgaW50IG51bV9jYWNoZXMgPSBkZWMtPm51bV9jYWNoZXNfOworICBjb25zdCBpbnQgbWJfdyA9IGRlYy0+bWJfd187CisgIC8vIE5vdGU6IHdlIHVzZSAnc2l6ZV90JyB3aGVuIHRoZXJlJ3Mgbm8gb3ZlcmZsb3cgcmlzaywgdWludDY0X3Qgb3RoZXJ3aXNlLgorICBjb25zdCBzaXplX3QgaW50cmFfcHJlZF9tb2RlX3NpemUgPSA0ICogbWJfdyAqIHNpemVvZih1aW50OF90KTsKKyAgY29uc3Qgc2l6ZV90IHRvcF9zaXplID0gc2l6ZW9mKFZQOFRvcFNhbXBsZXMpICogbWJfdzsKKyAgY29uc3Qgc2l6ZV90IG1iX2luZm9fc2l6ZSA9IChtYl93ICsgMSkgKiBzaXplb2YoVlA4TUIpOworICBjb25zdCBzaXplX3QgZl9pbmZvX3NpemUgPQorICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgPworICAgICAgICAgIG1iX3cgKiAoZGVjLT5tdF9tZXRob2RfID4gMCA/IDIgOiAxKSAqIHNpemVvZihWUDhGSW5mbykKKyAgICAgICAgOiAwOworICBjb25zdCBzaXplX3QgeXV2X3NpemUgPSBZVVZfU0laRSAqIHNpemVvZigqZGVjLT55dXZfYl8pOworICBjb25zdCBzaXplX3QgbWJfZGF0YV9zaXplID0KKyAgICAgIChkZWMtPm10X21ldGhvZF8gPT0gMiA/IDIgOiAxKSAqIG1iX3cgKiBzaXplb2YoKmRlYy0+bWJfZGF0YV8pOworICBjb25zdCBzaXplX3QgY2FjaGVfaGVpZ2h0ID0gKDE2ICogbnVtX2NhY2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX10pICogMyAvIDI7CisgIGNvbnN0IHNpemVfdCBjYWNoZV9zaXplID0gdG9wX3NpemUgKiBjYWNoZV9oZWlnaHQ7CisgIC8vIGFscGhhX3NpemUgaXMgdGhlIG9ubHkgb25lIHRoYXQgc2NhbGVzIGFzIHdpZHRoIHggaGVpZ2h0LgorICBjb25zdCB1aW50NjRfdCBhbHBoYV9zaXplID0gKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCkgPworICAgICAgKHVpbnQ2NF90KWRlYy0+cGljX2hkcl8ud2lkdGhfICogZGVjLT5waWNfaGRyXy5oZWlnaHRfIDogMFVMTDsKKyAgY29uc3QgdWludDY0X3QgbmVlZGVkID0gKHVpbnQ2NF90KWludHJhX3ByZWRfbW9kZV9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICArIHRvcF9zaXplICsgbWJfaW5mb19zaXplICsgZl9pbmZvX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgeXV2X3NpemUgKyBtYl9kYXRhX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVfc2l6ZSArIGFscGhhX3NpemUgKyBXRUJQX0FMSUdOX0NTVDsKKyAgdWludDhfdCogbWVtOworCisgIGlmIChuZWVkZWQgIT0gKHNpemVfdCluZWVkZWQpIHJldHVybiAwOyAgLy8gY2hlY2sgZm9yIG92ZXJmbG93CisgIGlmIChuZWVkZWQgPiBkZWMtPm1lbV9zaXplXykgeworICAgIFdlYlBTYWZlRnJlZShkZWMtPm1lbV8pOworICAgIGRlYy0+bWVtX3NpemVfID0gMDsKKyAgICBkZWMtPm1lbV8gPSBXZWJQU2FmZU1hbGxvYyhuZWVkZWQsIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKGRlYy0+bWVtXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbW9yeSBkdXJpbmcgZnJhbWUgaW5pdGlhbGl6YXRpb24uIik7CisgICAgfQorICAgIC8vIGRvd24tY2FzdCBpcyBvaywgdGhhbmtzIHRvIFdlYlBTYWZlQWxsb2MoKSBhYm92ZS4KKyAgICBkZWMtPm1lbV9zaXplXyA9IChzaXplX3QpbmVlZGVkOworICB9CisKKyAgbWVtID0gKHVpbnQ4X3QqKWRlYy0+bWVtXzsKKyAgZGVjLT5pbnRyYV90XyA9ICh1aW50OF90KiltZW07CisgIG1lbSArPSBpbnRyYV9wcmVkX21vZGVfc2l6ZTsKKworICBkZWMtPnl1dl90XyA9IChWUDhUb3BTYW1wbGVzKiltZW07CisgIG1lbSArPSB0b3Bfc2l6ZTsKKworICBkZWMtPm1iX2luZm9fID0gKChWUDhNQiopbWVtKSArIDE7CisgIG1lbSArPSBtYl9pbmZvX3NpemU7CisKKyAgZGVjLT5mX2luZm9fID0gZl9pbmZvX3NpemUgPyAoVlA4RkluZm8qKW1lbSA6IE5VTEw7CisgIG1lbSArPSBmX2luZm9fc2l6ZTsKKyAgZGVjLT50aHJlYWRfY3R4Xy5pZF8gPSAwOworICBkZWMtPnRocmVhZF9jdHhfLmZfaW5mb18gPSBkZWMtPmZfaW5mb187CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgLy8gc2Vjb25kYXJ5IGNhY2hlIGxpbmUuIFRoZSBkZWJsb2NraW5nIHByb2Nlc3MgbmVlZCB0byBtYWtlIHVzZSBvZiB0aGUKKyAgICAvLyBmaWx0ZXJpbmcgc3RyZW5ndGggZnJvbSBwcmV2aW91cyBtYWNyb2Jsb2NrIHJvdywgd2hpbGUgdGhlIG5ldyBvbmVzCisgICAgLy8gYXJlIGJlaW5nIGRlY29kZWQgaW4gcGFyYWxsZWwuIFdlJ2xsIGp1c3Qgc3dhcCB0aGUgcG9pbnRlcnMuCisgICAgZGVjLT50aHJlYWRfY3R4Xy5mX2luZm9fICs9IG1iX3c7CisgIH0KKworICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0pOworICBhc3NlcnQoKHl1dl9zaXplICYgV0VCUF9BTElHTl9DU1QpID09IDApOworICBkZWMtPnl1dl9iXyA9ICh1aW50OF90KiltZW07CisgIG1lbSArPSB5dXZfc2l6ZTsKKworICBkZWMtPm1iX2RhdGFfID0gKFZQOE1CRGF0YSopbWVtOworICBkZWMtPnRocmVhZF9jdHhfLm1iX2RhdGFfID0gKFZQOE1CRGF0YSopbWVtOworICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDIpIHsKKyAgICBkZWMtPnRocmVhZF9jdHhfLm1iX2RhdGFfICs9IG1iX3c7CisgIH0KKyAgbWVtICs9IG1iX2RhdGFfc2l6ZTsKKworICBkZWMtPmNhY2hlX3lfc3RyaWRlXyA9IDE2ICogbWJfdzsKKyAgZGVjLT5jYWNoZV91dl9zdHJpZGVfID0gOCAqIG1iX3c7CisgIHsKKyAgICBjb25zdCBpbnQgZXh0cmFfcm93cyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOworICAgIGNvbnN0IGludCBleHRyYV95ID0gZXh0cmFfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICAgIGNvbnN0IGludCBleHRyYV91diA9IChleHRyYV9yb3dzIC8gMikgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgICAgZGVjLT5jYWNoZV95XyA9ICgodWludDhfdCopbWVtKSArIGV4dHJhX3k7CisgICAgZGVjLT5jYWNoZV91XyA9IGRlYy0+Y2FjaGVfeV8KKyAgICAgICAgICAgICAgICAgICsgMTYgKiBudW1fY2FjaGVzICogZGVjLT5jYWNoZV95X3N0cmlkZV8gKyBleHRyYV91djsKKyAgICBkZWMtPmNhY2hlX3ZfID0gZGVjLT5jYWNoZV91XworICAgICAgICAgICAgICAgICAgKyA4ICogbnVtX2NhY2hlcyAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyArIGV4dHJhX3V2OworICAgIGRlYy0+Y2FjaGVfaWRfID0gMDsKKyAgfQorICBtZW0gKz0gY2FjaGVfc2l6ZTsKKworICAvLyBhbHBoYSBwbGFuZQorICBkZWMtPmFscGhhX3BsYW5lXyA9IGFscGhhX3NpemUgPyAodWludDhfdCopbWVtIDogTlVMTDsKKyAgbWVtICs9IGFscGhhX3NpemU7CisgIGFzc2VydChtZW0gPD0gKHVpbnQ4X3QqKWRlYy0+bWVtXyArIGRlYy0+bWVtX3NpemVfKTsKKworICAvLyBub3RlOiBsZWZ0L3RvcC1pbmZvIGlzIGluaXRpYWxpemVkIG9uY2UgZm9yIGFsbC4KKyAgbWVtc2V0KGRlYy0+bWJfaW5mb18gLSAxLCAwLCBtYl9pbmZvX3NpemUpOworICBWUDhJbml0U2NhbmxpbmUoZGVjKTsgICAvLyBpbml0aWFsaXplIGxlZnQgdG9vLgorCisgIC8vIGluaXRpYWxpemUgdG9wCisgIG1lbXNldChkZWMtPmludHJhX3RfLCBCX0RDX1BSRUQsIGludHJhX3ByZWRfbW9kZV9zaXplKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgSW5pdElvKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7CisgIC8vIHByZXBhcmUgJ2lvJworICBpby0+bWJfeSA9IDA7CisgIGlvLT55ID0gZGVjLT5jYWNoZV95XzsKKyAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfOworICBpby0+diA9IGRlYy0+Y2FjaGVfdl87CisgIGlvLT55X3N0cmlkZSA9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBpby0+dXZfc3RyaWRlID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICBpby0+YSA9IE5VTEw7Cit9CisKK2ludCBWUDhJbml0RnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaWYgKCFJbml0VGhyZWFkQ29udGV4dChkZWMpKSByZXR1cm4gMDsgIC8vIGNhbGwgZmlyc3QuIFNldHMgZGVjLT5udW1fY2FjaGVzXy4KKyAgaWYgKCFBbGxvY2F0ZU1lbW9yeShkZWMpKSByZXR1cm4gMDsKKyAgSW5pdElvKGRlYywgaW8pOworICBWUDhEc3BJbml0KCk7ICAvLyBJbml0IGNyaXRpY2FsIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBsb29rLXVwIHRhYmxlcy4KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvaWRlYy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2lkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZiMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2lkZWMuYwpAQCAtMCwwICsxLDg5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEluY3JlbWVudGFsIGRlY29kaW5nCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2FscGhhaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3dlYnBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8gSW4gYXBwZW5kIG1vZGUsIGJ1ZmZlciBhbGxvY2F0aW9ucyBpbmNyZWFzZSBhcyBtdWx0aXBsZXMgb2YgdGhpcyB2YWx1ZS4KKy8vIE5lZWRzIHRvIGJlIGEgcG93ZXIgb2YgMi4KKyNkZWZpbmUgQ0hVTktfU0laRSA0MDk2CisjZGVmaW5lIE1BWF9NQl9TSVpFIDQwOTYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERhdGEgc3RydWN0dXJlcyBmb3IgbWVtb3J5IGFuZCBzdGF0ZXMKKworLy8gRGVjb2Rpbmcgc3RhdGVzLiBTdGF0ZSBub3JtYWxseSBmbG93cyBhczoKKy8vIFdFQlBfSEVBREVSLT5WUDhfSEVBREVSLT5WUDhfUEFSVFMwLT5WUDhfREFUQS0+RE9ORSBmb3IgYSBsb3NzeSBpbWFnZSwgYW5kCisvLyBXRUJQX0hFQURFUi0+VlA4TF9IRUFERVItPlZQOExfREFUQS0+RE9ORSBmb3IgYSBsb3NzbGVzcyBpbWFnZS4KKy8vIElmIHRoZXJlIGlzIGFueSBlcnJvciB0aGUgZGVjb2RlciBnb2VzIGludG8gc3RhdGUgRVJST1IuCit0eXBlZGVmIGVudW0geworICBTVEFURV9XRUJQX0hFQURFUiwgIC8vIEFsbCB0aGUgZGF0YSBiZWZvcmUgdGhhdCBvZiB0aGUgVlA4L1ZQOEwgY2h1bmsuCisgIFNUQVRFX1ZQOF9IRUFERVIsICAgLy8gVGhlIFZQOCBGcmFtZSBoZWFkZXIgKHdpdGhpbiB0aGUgVlA4IGNodW5rKS4KKyAgU1RBVEVfVlA4X1BBUlRTMCwKKyAgU1RBVEVfVlA4X0RBVEEsCisgIFNUQVRFX1ZQOExfSEVBREVSLAorICBTVEFURV9WUDhMX0RBVEEsCisgIFNUQVRFX0RPTkUsCisgIFNUQVRFX0VSUk9SCit9IERlY1N0YXRlOworCisvLyBPcGVyYXRpbmcgc3RhdGUgZm9yIHRoZSBNZW1CdWZmZXIKK3R5cGVkZWYgZW51bSB7CisgIE1FTV9NT0RFX05PTkUgPSAwLAorICBNRU1fTU9ERV9BUFBFTkQsCisgIE1FTV9NT0RFX01BUAorfSBNZW1CdWZmZXJNb2RlOworCisvLyBzdG9yYWdlIGZvciBwYXJ0aXRpb24gIzAgYW5kIHBhcnRpYWwgZGF0YSAoaW4gYSByb2xsaW5nIGZhc2hpb24pCit0eXBlZGVmIHN0cnVjdCB7CisgIE1lbUJ1ZmZlck1vZGUgbW9kZV87ICAvLyBPcGVyYXRpb24gbW9kZQorICBzaXplX3Qgc3RhcnRfOyAgICAgICAgLy8gc3RhcnQgbG9jYXRpb24gb2YgdGhlIGRhdGEgdG8gYmUgZGVjb2RlZAorICBzaXplX3QgZW5kXzsgICAgICAgICAgLy8gZW5kIGxvY2F0aW9uCisgIHNpemVfdCBidWZfc2l6ZV87ICAgICAvLyBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCisgIHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBXZSBkb24ndCBvd24gdGhpcyBidWZmZXIgaW4gY2FzZSBXZWJQSVVwZGF0ZSgpCisKKyAgc2l6ZV90IHBhcnQwX3NpemVfOyAgICAgICAgIC8vIHNpemUgb2YgcGFydGl0aW9uICMwCisgIGNvbnN0IHVpbnQ4X3QqIHBhcnQwX2J1Zl87ICAvLyBidWZmZXIgdG8gc3RvcmUgcGFydGl0aW9uICMwCit9IE1lbUJ1ZmZlcjsKKworc3RydWN0IFdlYlBJRGVjb2RlciB7CisgIERlY1N0YXRlIHN0YXRlXzsgICAgICAgICAvLyBjdXJyZW50IGRlY29kaW5nIHN0YXRlCisgIFdlYlBEZWNQYXJhbXMgcGFyYW1zXzsgICAvLyBQYXJhbXMgdG8gc3RvcmUgb3V0cHV0IGluZm8KKyAgaW50IGlzX2xvc3NsZXNzXzsgICAgICAgIC8vIGZvciBkb3duLWNhc3RpbmcgJ2RlY18nLgorICB2b2lkKiBkZWNfOyAgICAgICAgICAgICAgLy8gZWl0aGVyIGEgVlA4RGVjb2RlciBvciBhIFZQOExEZWNvZGVyIGluc3RhbmNlCisgIFZQOElvIGlvXzsKKworICBNZW1CdWZmZXIgbWVtXzsgICAgICAgICAgLy8gaW5wdXQgbWVtb3J5IGJ1ZmZlci4KKyAgV2ViUERlY0J1ZmZlciBvdXRwdXRfOyAgIC8vIG91dHB1dCBidWZmZXIgKHdoZW4gbm8gZXh0ZXJuYWwgb25lIGlzIHN1cHBsaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgaWYgdGhlIGV4dGVybmFsIG9uZSBoYXMgc2xvdy1tZW1vcnkpCisgIFdlYlBEZWNCdWZmZXIqIGZpbmFsX291dHB1dF87ICAvLyBTbG93LW1lbW9yeSBvdXRwdXQgdG8gY29weSB0byBldmVudHVhbGx5LgorICBzaXplX3QgY2h1bmtfc2l6ZV87ICAgICAgLy8gQ29tcHJlc3NlZCBWUDgvVlA4TCBzaXplIGV4dHJhY3RlZCBmcm9tIEhlYWRlci4KKworICBpbnQgbGFzdF9tYl95XzsgICAgICAgICAgLy8gbGFzdCByb3cgcmVhY2hlZCBmb3IgaW50cmEtbW9kZSBkZWNvZGluZworfTsKKworLy8gTUIgY29udGV4dCB0byByZXN0b3JlIGluIGNhc2UgVlA4RGVjb2RlTUIoKSBmYWlscwordHlwZWRlZiBzdHJ1Y3QgeworICBWUDhNQiBsZWZ0XzsKKyAgVlA4TUIgaW5mb187CisgIFZQOEJpdFJlYWRlciB0b2tlbl9icl87Cit9IE1CQ29udGV4dDsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbUJ1ZmZlcjogaW5jb21pbmcgZGF0YSBoYW5kbGluZworCitzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IE1lbURhdGFTaXplKGNvbnN0IE1lbUJ1ZmZlciogbWVtKSB7CisgIHJldHVybiAobWVtLT5lbmRfIC0gbWVtLT5zdGFydF8pOworfQorCisvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBjb21wcmVzc2VkIGFscGhhIGRhdGEsIGFzIGl0IG1heSBub3QgaGF2ZQorLy8gYmVlbiBkZWNvZGVkIHlldC4KK3N0YXRpYyBpbnQgTmVlZENvbXByZXNzZWRBbHBoYShjb25zdCBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9XRUJQX0hFQURFUikgeworICAgIC8vIFdlIGhhdmVuJ3QgcGFyc2VkIHRoZSBoZWFkZXJzIHlldCwgc28gd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBpbWFnZSBpcworICAgIC8vIGxvc3N5IG9yIGxvc3NsZXNzLiBUaGlzIGFsc28gbWVhbnMgdGhhdCB3ZSBoYXZlbid0IHBhcnNlZCB0aGUgQUxQSCBjaHVuay4KKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaWRlYy0+aXNfbG9zc2xlc3NfKSB7CisgICAgcmV0dXJuIDA7ICAvLyBBTFBIIGNodW5rIGlzIG5vdCBwcmVzZW50IGZvciBsb3NzbGVzcyBpbWFnZXMuCisgIH0gZWxzZSB7CisgICAgY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187CisgICAgYXNzZXJ0KGRlYyAhPSBOVUxMKTsgIC8vIE11c3QgYmUgdHJ1ZSBhcyBpZGVjLT5zdGF0ZV8gIT0gU1RBVEVfV0VCUF9IRUFERVIuCisgICAgcmV0dXJuIChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwpICYmICFkZWMtPmlzX2FscGhhX2RlY29kZWRfOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERvUmVtYXAoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLCBwdHJkaWZmX3Qgb2Zmc2V0KSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG5ld19iYXNlID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87CisgIC8vIG5vdGU6IGZvciBWUDgsIHNldHRpbmcgdXAgaWRlYy0+aW9fIGlzIG9ubHkgcmVhbGx5IG5lZWRlZCBhdCB0aGUgYmVnaW5uaW5nCisgIC8vIG9mIHRoZSBkZWNvZGluZywgdGlsbCBwYXJ0aXRpb24gIzAgaXMgY29tcGxldGUuCisgIGlkZWMtPmlvXy5kYXRhID0gbmV3X2Jhc2U7CisgIGlkZWMtPmlvXy5kYXRhX3NpemUgPSBNZW1EYXRhU2l6ZShtZW0pOworCisgIGlmIChpZGVjLT5kZWNfICE9IE5VTEwpIHsKKyAgICBpZiAoIWlkZWMtPmlzX2xvc3NsZXNzXykgeworICAgICAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187CisgICAgICBjb25zdCB1aW50MzJfdCBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfOworICAgICAgaWYgKG9mZnNldCAhPSAwKSB7CisgICAgICAgIHVpbnQzMl90IHA7CisgICAgICAgIGZvciAocCA9IDA7IHAgPD0gbGFzdF9wYXJ0OyArK3ApIHsKKyAgICAgICAgICBWUDhSZW1hcEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVtYXAgcGFydGl0aW9uICMwIGRhdGEgcG9pbnRlciB0byBuZXcgb2Zmc2V0LCBidXQgb25seSBpbiBNQVAKKyAgICAgICAgLy8gbW9kZSAoaW4gQVBQRU5EIG1vZGUsIHBhcnRpdGlvbiAjMCBpcyBjb3BpZWQgaW50byBhIGZpeGVkIG1lbW9yeSkuCisgICAgICAgIGlmIChtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCkgeworICAgICAgICAgIFZQOFJlbWFwQml0UmVhZGVyKCZkZWMtPmJyXywgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBsYXN0X3N0YXJ0ID0gZGVjLT5wYXJ0c19bbGFzdF9wYXJ0XS5idWZfOworICAgICAgICBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoJmRlYy0+cGFydHNfW2xhc3RfcGFydF0sIGxhc3Rfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0tPmJ1Zl8gKyBtZW0tPmVuZF8gLSBsYXN0X3N0YXJ0KTsKKyAgICAgIH0KKyAgICAgIGlmIChOZWVkQ29tcHJlc3NlZEFscGhhKGlkZWMpKSB7CisgICAgICAgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IGRlYy0+YWxwaF9kZWNfOworICAgICAgICBkZWMtPmFscGhhX2RhdGFfICs9IG9mZnNldDsKKyAgICAgICAgaWYgKGFscGhfZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoYWxwaF9kZWMtPm1ldGhvZF8gPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKKyAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBhbHBoX3ZwOGxfZGVjID0gYWxwaF9kZWMtPnZwOGxfZGVjXzsKKyAgICAgICAgICAgIGFzc2VydChhbHBoX3ZwOGxfZGVjICE9IE5VTEwpOworICAgICAgICAgICAgYXNzZXJ0KGRlYy0+YWxwaGFfZGF0YV9zaXplXyA+PSBBTFBIQV9IRUFERVJfTEVOKTsKKyAgICAgICAgICAgIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoJmFscGhfdnA4bF9kZWMtPmJyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5hbHBoYV9kYXRhXyArIEFMUEhBX0hFQURFUl9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyAtIEFMUEhBX0hFQURFUl9MRU4pOworICAgICAgICAgIH0gZWxzZSB7ICAvLyBhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9OT19DT01QUkVTU0lPTgorICAgICAgICAgICAgLy8gTm90aGluZyBzcGVjaWFsIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgICAvLyBSZXNpemUgbG9zc2xlc3MgYml0cmVhZGVyCisgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOworICAgICAgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcigmZGVjLT5icl8sIG5ld19iYXNlLCBNZW1EYXRhU2l6ZShtZW0pKTsKKyAgICB9CisgIH0KK30KKworLy8gQXBwZW5kcyBkYXRhIHRvIHRoZSBlbmQgb2YgTWVtQnVmZmVyLT5idWZfLiBJdCBleHBhbmRzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5CisvLyBzaXplIGlmIHJlcXVpcmVkIGFuZCBhbHNvIHVwZGF0ZXMgVlA4Qml0UmVhZGVyJ3MgaWYgbmV3IG1lbW9yeSBpcyBhbGxvY2F0ZWQuCitzdGF0aWMgaW50IEFwcGVuZFRvTWVtQnVmZmVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKKyAgY29uc3QgaW50IG5lZWRfY29tcHJlc3NlZF9hbHBoYSA9IE5lZWRDb21wcmVzc2VkQWxwaGEoaWRlYyk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG9sZF9zdGFydCA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfYmFzZSA9CisgICAgICBuZWVkX2NvbXByZXNzZWRfYWxwaGEgPyBkZWMtPmFscGhhX2RhdGFfIDogb2xkX3N0YXJ0OworICBhc3NlcnQobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpOworICBpZiAoZGF0YV9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICAvLyBzZWN1cml0eSBzYWZlZ3VhcmQ6IHRyeWluZyB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gd2hhdCB0aGUgZm9ybWF0CisgICAgLy8gYWxsb3dzIGZvciBhIGNodW5rIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgc21va2Ugc21lbGwuCisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAobWVtLT5lbmRfICsgZGF0YV9zaXplID4gbWVtLT5idWZfc2l6ZV8pIHsgIC8vIE5lZWQgc29tZSBmcmVlIG1lbW9yeQorICAgIGNvbnN0IHNpemVfdCBuZXdfbWVtX3N0YXJ0ID0gb2xkX3N0YXJ0IC0gb2xkX2Jhc2U7CisgICAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSkgKyBuZXdfbWVtX3N0YXJ0OworICAgIGNvbnN0IHVpbnQ2NF90IG5ld19zaXplID0gKHVpbnQ2NF90KWN1cnJlbnRfc2l6ZSArIGRhdGFfc2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBleHRyYV9zaXplID0gKG5ld19zaXplICsgQ0hVTktfU0laRSAtIDEpICYgfihDSFVOS19TSVpFIC0gMSk7CisgICAgdWludDhfdCogY29uc3QgbmV3X2J1ZiA9CisgICAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhleHRyYV9zaXplLCBzaXplb2YoKm5ld19idWYpKTsKKyAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBtZW1jcHkobmV3X2J1Ziwgb2xkX2Jhc2UsIGN1cnJlbnRfc2l6ZSk7CisgICAgV2ViUFNhZmVGcmVlKG1lbS0+YnVmXyk7CisgICAgbWVtLT5idWZfID0gbmV3X2J1ZjsKKyAgICBtZW0tPmJ1Zl9zaXplXyA9IChzaXplX3QpZXh0cmFfc2l6ZTsKKyAgICBtZW0tPnN0YXJ0XyA9IG5ld19tZW1fc3RhcnQ7CisgICAgbWVtLT5lbmRfID0gY3VycmVudF9zaXplOworICB9CisKKyAgbWVtY3B5KG1lbS0+YnVmXyArIG1lbS0+ZW5kXywgZGF0YSwgZGF0YV9zaXplKTsKKyAgbWVtLT5lbmRfICs9IGRhdGFfc2l6ZTsKKyAgYXNzZXJ0KG1lbS0+ZW5kXyA8PSBtZW0tPmJ1Zl9zaXplXyk7CisKKyAgRG9SZW1hcChpZGVjLCBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XyAtIG9sZF9zdGFydCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFJlbWFwTWVtQnVmZmVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOworICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfYnVmID0gbWVtLT5idWZfOworICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfc3RhcnQgPSBvbGRfYnVmICsgbWVtLT5zdGFydF87CisgIGFzc2VydChtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCk7CisKKyAgaWYgKGRhdGFfc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCisKKyAgbWVtLT5idWZfID0gKHVpbnQ4X3QqKWRhdGE7CisgIG1lbS0+ZW5kXyA9IG1lbS0+YnVmX3NpemVfID0gZGF0YV9zaXplOworCisgIERvUmVtYXAoaWRlYywgbWVtLT5idWZfICsgbWVtLT5zdGFydF8gLSBvbGRfc3RhcnQpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgSW5pdE1lbUJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICBtZW0tPm1vZGVfICAgICAgID0gTUVNX01PREVfTk9ORTsKKyAgbWVtLT5idWZfICAgICAgICA9IE5VTEw7CisgIG1lbS0+YnVmX3NpemVfICAgPSAwOworICBtZW0tPnBhcnQwX2J1Zl8gID0gTlVMTDsKKyAgbWVtLT5wYXJ0MF9zaXplXyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIENsZWFyTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGFzc2VydChtZW0pOworICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpIHsKKyAgICBXZWJQU2FmZUZyZWUobWVtLT5idWZfKTsKKyAgICBXZWJQU2FmZUZyZWUoKHZvaWQqKW1lbS0+cGFydDBfYnVmXyk7CisgIH0KK30KKworc3RhdGljIGludCBDaGVja01lbUJ1ZmZlck1vZGUoTWVtQnVmZmVyKiBjb25zdCBtZW0sIE1lbUJ1ZmZlck1vZGUgZXhwZWN0ZWQpIHsKKyAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfTk9ORSkgeworICAgIG1lbS0+bW9kZV8gPSBleHBlY3RlZDsgICAgLy8gc3dpdGNoIHRvIHRoZSBleHBlY3RlZCBtb2RlCisgIH0gZWxzZSBpZiAobWVtLT5tb2RlXyAhPSBleHBlY3RlZCkgeworICAgIHJldHVybiAwOyAgICAgICAgIC8vIHdlIG1peGVkIHRoZSBtb2RlcyA9PiBlcnJvcgorICB9CisgIGFzc2VydChtZW0tPm1vZGVfID09IGV4cGVjdGVkKTsgICAvLyBtb2RlIGlzIG9rCisgIHJldHVybiAxOworfQorCisvLyBUbyBiZSBjYWxsZWQgbGFzdC4KK3N0YXRpYyBWUDhTdGF0dXNDb2RlIEZpbmlzaERlY29kaW5nKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMgPSBpZGVjLT5wYXJhbXNfLm9wdGlvbnM7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IGlkZWMtPnBhcmFtc18ub3V0cHV0OworCisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX0RPTkU7CisgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+ZmxpcCkgeworICAgIGNvbnN0IFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gV2ViUEZsaXBCdWZmZXIob3V0cHV0KTsKKyAgICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisgIH0KKyAgaWYgKGlkZWMtPmZpbmFsX291dHB1dF8gIT0gTlVMTCkgeworICAgIFdlYlBDb3B5RGVjQnVmZmVyUGl4ZWxzKG91dHB1dCwgaWRlYy0+ZmluYWxfb3V0cHV0Xyk7ICAvLyBkbyB0aGUgc2xvdy1jb3B5CisgICAgV2ViUEZyZWVEZWNCdWZmZXIoJmlkZWMtPm91dHB1dF8pOworICAgICpvdXRwdXQgPSAqaWRlYy0+ZmluYWxfb3V0cHV0XzsKKyAgICBpZGVjLT5maW5hbF9vdXRwdXRfID0gTlVMTDsKKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvYmxvY2stZGVjb2RpbmcgY29udGV4dHMKKworc3RhdGljIHZvaWQgU2F2ZUNvbnRleHQoY29uc3QgVlA4RGVjb2RlciogZGVjLCBjb25zdCBWUDhCaXRSZWFkZXIqIHRva2VuX2JyLAorICAgICAgICAgICAgICAgICAgICAgICAgTUJDb250ZXh0KiBjb25zdCBjb250ZXh0KSB7CisgIGNvbnRleHQtPmxlZnRfID0gZGVjLT5tYl9pbmZvX1stMV07CisgIGNvbnRleHQtPmluZm9fID0gZGVjLT5tYl9pbmZvX1tkZWMtPm1iX3hfXTsKKyAgY29udGV4dC0+dG9rZW5fYnJfID0gKnRva2VuX2JyOworfQorCitzdGF0aWMgdm9pZCBSZXN0b3JlQ29udGV4dChjb25zdCBNQkNvbnRleHQqIGNvbnRleHQsIFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKKyAgZGVjLT5tYl9pbmZvX1stMV0gPSBjb250ZXh0LT5sZWZ0XzsKKyAgZGVjLT5tYl9pbmZvX1tkZWMtPm1iX3hfXSA9IGNvbnRleHQtPmluZm9fOworICAqdG9rZW5fYnIgPSBjb250ZXh0LT50b2tlbl9icl87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIElEZWNFcnJvcihXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsIFZQOFN0YXR1c0NvZGUgZXJyb3IpIHsKKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfREFUQSkgeworICAgIFZQOElvKiBjb25zdCBpbyA9ICZpZGVjLT5pb187CisgICAgaWYgKGlvLT50ZWFyZG93biAhPSBOVUxMKSB7CisgICAgICBpby0+dGVhcmRvd24oaW8pOworICAgIH0KKyAgfQorICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9FUlJPUjsKKyAgcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBDaGFuZ2VTdGF0ZShXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsIERlY1N0YXRlIG5ld19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb25zdW1lZF9ieXRlcykgeworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOworICBpZGVjLT5zdGF0ZV8gPSBuZXdfc3RhdGU7CisgIG1lbS0+c3RhcnRfICs9IGNvbnN1bWVkX2J5dGVzOworICBhc3NlcnQobWVtLT5zdGFydF8gPD0gbWVtLT5lbmRfKTsKKyAgaWRlYy0+aW9fLmRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgaWRlYy0+aW9fLmRhdGFfc2l6ZSA9IE1lbURhdGFTaXplKG1lbSk7Cit9CisKKy8vIEhlYWRlcnMKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVdlYlBIZWFkZXJzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOworICBjb25zdCB1aW50OF90KiBkYXRhID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87CisgIHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZShtZW0pOworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgV2ViUEhlYWRlclN0cnVjdHVyZSBoZWFkZXJzOworCisgIGhlYWRlcnMuZGF0YSA9IGRhdGE7CisgIGhlYWRlcnMuZGF0YV9zaXplID0gY3Vycl9zaXplOworICBoZWFkZXJzLmhhdmVfYWxsX2RhdGEgPSAwOworICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsKKyAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgIC8vIFdlIGhhdmVuJ3QgZm91bmQgYSBWUDggY2h1bmsgeWV0LgorICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBzdGF0dXMpOworICB9CisKKyAgaWRlYy0+Y2h1bmtfc2l6ZV8gPSBoZWFkZXJzLmNvbXByZXNzZWRfc2l6ZTsKKyAgaWRlYy0+aXNfbG9zc2xlc3NfID0gaGVhZGVycy5pc19sb3NzbGVzczsKKyAgaWYgKCFpZGVjLT5pc19sb3NzbGVzc18pIHsKKyAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSBWUDhOZXcoKTsKKyAgICBpZiAoZGVjID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIGlkZWMtPmRlY18gPSBkZWM7CisgICAgZGVjLT5hbHBoYV9kYXRhXyA9IGhlYWRlcnMuYWxwaGFfZGF0YTsKKyAgICBkZWMtPmFscGhhX2RhdGFfc2l6ZV8gPSBoZWFkZXJzLmFscGhhX2RhdGFfc2l6ZTsKKyAgICBDaGFuZ2VTdGF0ZShpZGVjLCBTVEFURV9WUDhfSEVBREVSLCBoZWFkZXJzLm9mZnNldCk7CisgIH0gZWxzZSB7CisgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOExOZXcoKTsKKyAgICBpZiAoZGVjID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIGlkZWMtPmRlY18gPSBkZWM7CisgICAgQ2hhbmdlU3RhdGUoaWRlYywgU1RBVEVfVlA4TF9IRUFERVIsIGhlYWRlcnMub2Zmc2V0KTsKKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlVlA4RnJhbWVIZWFkZXIoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBpZGVjLT5tZW1fLmJ1Zl8gKyBpZGVjLT5tZW1fLnN0YXJ0XzsKKyAgY29uc3Qgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIHVpbnQzMl90IGJpdHM7CisKKyAgaWYgKGN1cnJfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgeworICAgIC8vIE5vdCBlbm91Z2ggZGF0YSBieXRlcyB0byBleHRyYWN0IFZQOCBGcmFtZSBIZWFkZXIuCisgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICB9CisgIGlmICghVlA4R2V0SW5mbyhkYXRhLCBjdXJyX3NpemUsIGlkZWMtPmNodW5rX3NpemVfLCAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUik7CisgIH0KKworICBiaXRzID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOworICBpZGVjLT5tZW1fLnBhcnQwX3NpemVfID0gKGJpdHMgPj4gNSkgKyBWUDhfRlJBTUVfSEVBREVSX1NJWkU7CisKKyAgaWRlYy0+aW9fLmRhdGEgPSBkYXRhOworICBpZGVjLT5pb18uZGF0YV9zaXplID0gY3Vycl9zaXplOworICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9WUDhfUEFSVFMwOworICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworLy8gUGFydGl0aW9uICMwCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBDb3B5UGFydHMwRGF0YShXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKWlkZWMtPmRlY187CisgIFZQOEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIGNvbnN0IHNpemVfdCBwYXJ0X3NpemUgPSBici0+YnVmX2VuZF8gLSBici0+YnVmXzsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKKyAgYXNzZXJ0KCFpZGVjLT5pc19sb3NzbGVzc18pOworICBhc3NlcnQobWVtLT5wYXJ0MF9idWZfID09IE5VTEwpOworICAvLyB0aGUgZm9sbG93aW5nIGlzIGEgZm9ybWF0IGxpbWl0YXRpb24sIG5vIG5lZWQgZm9yIHJ1bnRpbWUgY2hlY2s6CisgIGFzc2VydChwYXJ0X3NpemUgPD0gbWVtLT5wYXJ0MF9zaXplXyk7CisgIGlmIChwYXJ0X3NpemUgPT0gMCkgeyAgIC8vIGNhbid0IGhhdmUgemVyby1zaXplIHBhcnRpdGlvbiAjMAorICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpIHsKKyAgICAvLyBXZSBjb3B5IGFuZCBncmFiIG93bmVyc2hpcCBvZiB0aGUgcGFydGl0aW9uICMwIGRhdGEuCisgICAgdWludDhfdCogY29uc3QgcGFydDBfYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHBhcnRfc2l6ZSk7CisgICAgaWYgKHBhcnQwX2J1ZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIH0KKyAgICBtZW1jcHkocGFydDBfYnVmLCBici0+YnVmXywgcGFydF9zaXplKTsKKyAgICBtZW0tPnBhcnQwX2J1Zl8gPSBwYXJ0MF9idWY7CisgICAgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKGJyLCBwYXJ0MF9idWYsIHBhcnRfc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgLy8gRWxzZToganVzdCBrZWVwIHBvaW50ZXJzIHRvIHRoZSBwYXJ0aXRpb24gIzAncyBkYXRhIGluIGRlY18tPmJyXy4KKyAgfQorICBtZW0tPnN0YXJ0XyArPSBwYXJ0X3NpemU7CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVQYXJ0aXRpb24wKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKKyAgY29uc3QgV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zID0gJmlkZWMtPnBhcmFtc187CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IHBhcmFtcy0+b3V0cHV0OworCisgIC8vIFdhaXQgdGlsbCB3ZSBoYXZlIGVub3VnaCBkYXRhIGZvciB0aGUgd2hvbGUgcGFydGl0aW9uICMwCisgIGlmIChNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXykgPCBpZGVjLT5tZW1fLnBhcnQwX3NpemVfKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICB9CisKKyAgaWYgKCFWUDhHZXRIZWFkZXJzKGRlYywgaW8pKSB7CisgICAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBkZWMtPnN0YXR1c187CisgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCB8fAorICAgICAgICBzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgIC8vIHRyZWF0aW5nIE5PVF9FTk9VR0hfREFUQSBhcyBTVVNQRU5ERUQgc3RhdGUKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICB9CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBzdGF0dXMpOworICB9CisKKyAgLy8gQWxsb2NhdGUvVmVyaWZ5IG91dHB1dCBidWZmZXIgbm93CisgIGRlYy0+c3RhdHVzXyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby0+d2lkdGgsIGlvLT5oZWlnaHQsIHBhcmFtcy0+b3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIGlmIChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgZGVjLT5zdGF0dXNfKTsKKyAgfQorICAvLyBUaGlzIGNoYW5nZSBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgVlA4SW5pdEZyYW1lKCkKKyAgZGVjLT5tdF9tZXRob2RfID0gVlA4R2V0VGhyZWFkTWV0aG9kKHBhcmFtcy0+b3B0aW9ucywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT53aWR0aCwgaW8tPmhlaWdodCk7CisgIFZQOEluaXREaXRoZXJpbmcocGFyYW1zLT5vcHRpb25zLCBkZWMpOworCisgIGRlYy0+c3RhdHVzXyA9IENvcHlQYXJ0czBEYXRhKGlkZWMpOworICBpZiAoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKworICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVycy4gV2lsbCBjYWxsIGlvLT5zZXR1cCgpLgorICBpZiAoVlA4RW50ZXJDcml0aWNhbChkZWMsIGlvKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBkZWMtPnN0YXR1c18pOworICB9CisKKyAgLy8gTm90ZTogcGFzdCB0aGlzIHBvaW50LCB0ZWFyZG93bigpIG11c3QgYWx3YXlzIGJlIGNhbGxlZAorICAvLyBpbiBjYXNlIG9mIGVycm9yLgorICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9WUDhfREFUQTsKKyAgLy8gQWxsb2NhdGUgbWVtb3J5IGFuZCBwcmVwYXJlIGV2ZXJ5dGhpbmcuCisgIGlmICghVlA4SW5pdEZyYW1lKGRlYywgaW8pKSB7CisgICAgcmV0dXJuIElEZWNFcnJvcihpZGVjLCBkZWMtPnN0YXR1c18pOworICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCisvLyBSZW1haW5pbmcgcGFydGl0aW9ucworc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlUmVtYWluaW5nKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKKworICBhc3NlcnQoZGVjLT5yZWFkeV8pOworICBmb3IgKDsgZGVjLT5tYl95XyA8IGRlYy0+bWJfaF87ICsrZGVjLT5tYl95XykgeworICAgIGlmIChpZGVjLT5sYXN0X21iX3lfICE9IGRlYy0+bWJfeV8pIHsKKyAgICAgIGlmICghVlA4UGFyc2VJbnRyYU1vZGVSb3coJmRlYy0+YnJfLCBkZWMpKSB7CisgICAgICAgIC8vIG5vdGU6IG5vcm1hbGx5LCBlcnJvciBzaG91bGRuJ3Qgb2NjdXIgc2luY2Ugd2UgYWxyZWFkeSBoYXZlIHRoZSB3aG9sZQorICAgICAgICAvLyBwYXJ0aXRpb24wIGF2YWlsYWJsZSBoZXJlIGluIERlY29kZVJlbWFpbmluZygpLiBSZWFjaGluZyBFT0Ygd2hpbGUKKyAgICAgICAgLy8gcmVhZGluZyBpbnRyYSBtb2RlcyByZWFsbHkgbWVhbnMgYSBCSVRTVFJFQU1fRVJST1IuCisgICAgICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IpOworICAgICAgfQorICAgICAgaWRlYy0+bGFzdF9tYl95XyA9IGRlYy0+bWJfeV87CisgICAgfQorICAgIGZvciAoOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgKytkZWMtPm1iX3hfKSB7CisgICAgICBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyID0KKyAgICAgICAgICAmZGVjLT5wYXJ0c19bZGVjLT5tYl95XyAmIGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV9dOworICAgICAgTUJDb250ZXh0IGNvbnRleHQ7CisgICAgICBTYXZlQ29udGV4dChkZWMsIHRva2VuX2JyLCAmY29udGV4dCk7CisgICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7CisgICAgICAgIC8vIFdlIHNob3VsZG4ndCBmYWlsIHdoZW4gTUFYX01CIGRhdGEgd2FzIGF2YWlsYWJsZQorICAgICAgICBpZiAoZGVjLT5udW1fcGFydHNfbWludXNfb25lXyA9PSAwICYmCisgICAgICAgICAgICBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXykgPiBNQVhfTUJfU0laRSkgeworICAgICAgICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IpOworICAgICAgICB9CisgICAgICAgIFJlc3RvcmVDb250ZXh0KCZjb250ZXh0LCBkZWMsIHRva2VuX2JyKTsKKyAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICAgICAgfQorICAgICAgLy8gUmVsZWFzZSBidWZmZXIgb25seSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0aXRpb24KKyAgICAgIGlmIChkZWMtPm51bV9wYXJ0c19taW51c19vbmVfID09IDApIHsKKyAgICAgICAgaWRlYy0+bWVtXy5zdGFydF8gPSB0b2tlbl9ici0+YnVmXyAtIGlkZWMtPm1lbV8uYnVmXzsKKyAgICAgICAgYXNzZXJ0KGlkZWMtPm1lbV8uc3RhcnRfIDw9IGlkZWMtPm1lbV8uZW5kXyk7CisgICAgICB9CisgICAgfQorICAgIFZQOEluaXRTY2FubGluZShkZWMpOyAgIC8vIFByZXBhcmUgZm9yIG5leHQgc2NhbmxpbmUKKworICAgIC8vIFJlY29uc3RydWN0LCBmaWx0ZXIgYW5kIGVtaXQgdGhlIHJvdy4KKyAgICBpZiAoIVZQOFByb2Nlc3NSb3coZGVjLCBpbykpIHsKKyAgICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JUKTsKKyAgICB9CisgIH0KKyAgLy8gU3luY2hyb25pemUgdGhlIHRocmVhZCBhbmQgY2hlY2sgZm9yIGVycm9ycy4KKyAgaWYgKCFWUDhFeGl0Q3JpdGljYWwoZGVjLCBpbykpIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCk7CisgIH0KKyAgZGVjLT5yZWFkeV8gPSAwOworICByZXR1cm4gRmluaXNoRGVjb2RpbmcoaWRlYyk7Cit9CisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIEVycm9yU3RhdHVzTG9zc2xlc3MoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIHN0YXR1cykgeworICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfU1VTUEVOREVEIHx8IHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgfQorICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVZQOExIZWFkZXIoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIFZQOElvKiBjb25zdCBpbyA9ICZpZGVjLT5pb187CisgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4TERlY29kZXIqKWlkZWMtPmRlY187CisgIGNvbnN0IFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyA9ICZpZGVjLT5wYXJhbXNfOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBwYXJhbXMtPm91dHB1dDsKKyAgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKTsKKyAgYXNzZXJ0KGlkZWMtPmlzX2xvc3NsZXNzXyk7CisKKyAgLy8gV2FpdCB1bnRpbCB0aGVyZSdzIGVub3VnaCBkYXRhIGZvciBkZWNvZGluZyBoZWFkZXIuCisgIGlmIChjdXJyX3NpemUgPCAoaWRlYy0+Y2h1bmtfc2l6ZV8gPj4gMykpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICByZXR1cm4gRXJyb3JTdGF0dXNMb3NzbGVzcyhpZGVjLCBkZWMtPnN0YXR1c18pOworICB9CisKKyAgaWYgKCFWUDhMRGVjb2RlSGVhZGVyKGRlYywgaW8pKSB7CisgICAgaWYgKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiAmJgorICAgICAgICBjdXJyX3NpemUgPCBpZGVjLT5jaHVua19zaXplXykgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CisgICAgfQorICAgIHJldHVybiBFcnJvclN0YXR1c0xvc3NsZXNzKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKyAgLy8gQWxsb2NhdGUvdmVyaWZ5IG91dHB1dCBidWZmZXIgbm93LgorICBkZWMtPnN0YXR1c18gPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8tPndpZHRoLCBpby0+aGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworICBpZiAoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7CisgIH0KKworICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9WUDhMX0RBVEE7CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBEZWNvZGVWUDhMRGF0YShXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopaWRlYy0+ZGVjXzsKKyAgY29uc3Qgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKTsKKyAgYXNzZXJ0KGlkZWMtPmlzX2xvc3NsZXNzXyk7CisKKyAgLy8gU3dpdGNoIHRvIGluY3JlbWVudGFsIGRlY29kaW5nIGlmIHdlIGRvbid0IGhhdmUgYWxsIHRoZSBieXRlcyBhdmFpbGFibGUuCisgIGRlYy0+aW5jcmVtZW50YWxfID0gKGN1cnJfc2l6ZSA8IGlkZWMtPmNodW5rX3NpemVfKTsKKworICBpZiAoIVZQOExEZWNvZGVJbWFnZShkZWMpKSB7CisgICAgcmV0dXJuIEVycm9yU3RhdHVzTG9zc2xlc3MoaWRlYywgZGVjLT5zdGF0dXNfKTsKKyAgfQorICBhc3NlcnQoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfT0sgfHwgZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfU1VTUEVOREVEKTsKKyAgcmV0dXJuIChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpID8gZGVjLT5zdGF0dXNfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpbmlzaERlY29kaW5nKGlkZWMpOworfQorCisgIC8vIE1haW4gZGVjb2RpbmcgbG9vcAorc3RhdGljIFZQOFN0YXR1c0NvZGUgSURlY29kZShXZWJQSURlY29kZXIqIGlkZWMpIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1dFQlBfSEVBREVSKSB7CisgICAgc3RhdHVzID0gRGVjb2RlV2ViUEhlYWRlcnMoaWRlYyk7CisgIH0gZWxzZSB7CisgICAgaWYgKGlkZWMtPmRlY18gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgICAvLyBjYW4ndCBjb250aW51ZSBpZiB3ZSBoYXZlIG5vIGRlY29kZXIuCisgICAgfQorICB9CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0hFQURFUikgeworICAgIHN0YXR1cyA9IERlY29kZVZQOEZyYW1lSGVhZGVyKGlkZWMpOworICB9CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X1BBUlRTMCkgeworICAgIHN0YXR1cyA9IERlY29kZVBhcnRpdGlvbjAoaWRlYyk7CisgIH0KKyAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfREFUQSkgeworICAgIHN0YXR1cyA9IERlY29kZVJlbWFpbmluZyhpZGVjKTsKKyAgfQorICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOExfSEVBREVSKSB7CisgICAgc3RhdHVzID0gRGVjb2RlVlA4TEhlYWRlcihpZGVjKTsKKyAgfQorICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX1ZQOExfREFUQSkgeworICAgIHN0YXR1cyA9IERlY29kZVZQOExEYXRhKGlkZWMpOworICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRlcm5hbCBjb25zdHJ1Y3RvcgorCitzdGF0aWMgV2ViUElEZWNvZGVyKiBOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKKyAgV2ViUElEZWNvZGVyKiBpZGVjID0gKFdlYlBJRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCppZGVjKSk7CisgIGlmIChpZGVjID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1dFQlBfSEVBREVSOworICBpZGVjLT5jaHVua19zaXplXyA9IDA7CisKKyAgaWRlYy0+bGFzdF9tYl95XyA9IC0xOworCisgIEluaXRNZW1CdWZmZXIoJmlkZWMtPm1lbV8pOworICBXZWJQSW5pdERlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7CisgIFZQOEluaXRJbygmaWRlYy0+aW9fKTsKKworICBXZWJQUmVzZXREZWNQYXJhbXMoJmlkZWMtPnBhcmFtc18pOworICBpZiAob3V0cHV0X2J1ZmZlciA9PSBOVUxMIHx8IFdlYlBBdm9pZFNsb3dNZW1vcnkob3V0cHV0X2J1ZmZlciwgZmVhdHVyZXMpKSB7CisgICAgaWRlYy0+cGFyYW1zXy5vdXRwdXQgPSAmaWRlYy0+b3V0cHV0XzsKKyAgICBpZGVjLT5maW5hbF9vdXRwdXRfID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBpZiAob3V0cHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICBpZGVjLT5wYXJhbXNfLm91dHB1dC0+Y29sb3JzcGFjZSA9IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlkZWMtPnBhcmFtc18ub3V0cHV0ID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBpZGVjLT5maW5hbF9vdXRwdXRfID0gTlVMTDsKKyAgfQorICBXZWJQSW5pdEN1c3RvbUlvKCZpZGVjLT5wYXJhbXNfLCAmaWRlYy0+aW9fKTsgIC8vIFBsdWcgdGhlIEkvTyBmdW5jdGlvbnMuCisKKyAgcmV0dXJuIGlkZWM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQdWJsaWMgZnVuY3Rpb25zCisKK1dlYlBJRGVjb2RlciogV2ViUElOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIG91dHB1dF9idWZmZXIpIHsKKyAgcmV0dXJuIE5ld0RlY29kZXIob3V0cHV0X2J1ZmZlciwgTlVMTCk7Cit9CisKK1dlYlBJRGVjb2RlciogV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZykgeworICBXZWJQSURlY29kZXIqIGlkZWM7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyB0bXBfZmVhdHVyZXM7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMgPQorICAgICAgKGNvbmZpZyA9PSBOVUxMKSA/ICZ0bXBfZmVhdHVyZXMgOiAmY29uZmlnLT5pbnB1dDsKKyAgbWVtc2V0KCZ0bXBfZmVhdHVyZXMsIDAsIHNpemVvZih0bXBfZmVhdHVyZXMpKTsKKworICAvLyBQYXJzZSB0aGUgYml0c3RyZWFtJ3MgZmVhdHVyZXMsIGlmIHJlcXVlc3RlZDoKKyAgaWYgKGRhdGEgIT0gTlVMTCAmJiBkYXRhX3NpemUgPiAwKSB7CisgICAgaWYgKFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsIGZlYXR1cmVzKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKworICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGluY3JlbWVudGFsIGRlY29kZXIKKyAgaWRlYyA9IChjb25maWcgIT0gTlVMTCkgPyBOZXdEZWNvZGVyKCZjb25maWctPm91dHB1dCwgZmVhdHVyZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogTmV3RGVjb2RlcihOVUxMLCBmZWF0dXJlcyk7CisgIGlmIChpZGVjID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICAvLyBGaW5pc2ggaW5pdGlhbGl6YXRpb24KKyAgaWYgKGNvbmZpZyAhPSBOVUxMKSB7CisgICAgaWRlYy0+cGFyYW1zXy5vcHRpb25zID0gJmNvbmZpZy0+b3B0aW9uczsKKyAgfQorICByZXR1cm4gaWRlYzsKK30KKwordm9pZCBXZWJQSURlbGV0ZShXZWJQSURlY29kZXIqIGlkZWMpIHsKKyAgaWYgKGlkZWMgPT0gTlVMTCkgcmV0dXJuOworICBpZiAoaWRlYy0+ZGVjXyAhPSBOVUxMKSB7CisgICAgaWYgKCFpZGVjLT5pc19sb3NzbGVzc18pIHsKKyAgICAgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0RBVEEpIHsKKyAgICAgICAgLy8gU3luY2hyb25pemUgdGhlIHRocmVhZCwgY2xlYW4tdXAgYW5kIGNoZWNrIGZvciBlcnJvcnMuCisgICAgICAgIFZQOEV4aXRDcml0aWNhbCgoVlA4RGVjb2RlciopaWRlYy0+ZGVjXywgJmlkZWMtPmlvXyk7CisgICAgICB9CisgICAgICBWUDhEZWxldGUoKFZQOERlY29kZXIqKWlkZWMtPmRlY18pOworICAgIH0gZWxzZSB7CisgICAgICBWUDhMRGVsZXRlKChWUDhMRGVjb2RlciopaWRlYy0+ZGVjXyk7CisgICAgfQorICB9CisgIENsZWFyTWVtQnVmZmVyKCZpZGVjLT5tZW1fKTsKKyAgV2ViUEZyZWVEZWNCdWZmZXIoJmlkZWMtPm91dHB1dF8pOworICBXZWJQU2FmZUZyZWUoaWRlYyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXcmFwcGVyIHRvd2FyZCBXZWJQSU5ld0RlY29kZXIKKworV2ViUElEZWNvZGVyKiBXZWJQSU5ld1JHQihXRUJQX0NTUF9NT0RFIG1vZGUsIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKSB7CisgIGNvbnN0IGludCBpc19leHRlcm5hbF9tZW1vcnkgPSAob3V0cHV0X2J1ZmZlciAhPSBOVUxMKSA/IDEgOiAwOworICBXZWJQSURlY29kZXIqIGlkZWM7CisKKyAgaWYgKG1vZGUgPj0gTU9ERV9ZVVYpIHJldHVybiBOVUxMOworICBpZiAoaXNfZXh0ZXJuYWxfbWVtb3J5ID09IDApIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCisgICAgb3V0cHV0X2J1ZmZlcl9zaXplID0gMDsKKyAgICBvdXRwdXRfc3RyaWRlID0gMDsKKyAgfSBlbHNlIHsgIC8vIEEgYnVmZmVyIHdhcyBwYXNzZWQuIFZhbGlkYXRlIHRoZSBvdGhlciBwYXJhbXMuCisgICAgaWYgKG91dHB1dF9zdHJpZGUgPT0gMCB8fCBvdXRwdXRfYnVmZmVyX3NpemUgPT0gMCkgeworICAgICAgcmV0dXJuIE5VTEw7ICAgLy8gaW52YWxpZCBwYXJhbWV0ZXIuCisgICAgfQorICB9CisgIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoTlVMTCk7CisgIGlmIChpZGVjID09IE5VTEwpIHJldHVybiBOVUxMOworICBpZGVjLT5vdXRwdXRfLmNvbG9yc3BhY2UgPSBtb2RlOworICBpZGVjLT5vdXRwdXRfLmlzX2V4dGVybmFsX21lbW9yeSA9IGlzX2V4dGVybmFsX21lbW9yeTsKKyAgaWRlYy0+b3V0cHV0Xy51LlJHQkEucmdiYSA9IG91dHB1dF9idWZmZXI7CisgIGlkZWMtPm91dHB1dF8udS5SR0JBLnN0cmlkZSA9IG91dHB1dF9zdHJpZGU7CisgIGlkZWMtPm91dHB1dF8udS5SR0JBLnNpemUgPSBvdXRwdXRfYnVmZmVyX3NpemU7CisgIHJldHVybiBpZGVjOworfQorCitXZWJQSURlY29kZXIqIFdlYlBJTmV3WVVWQSh1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCBzaXplX3QgdV9zaXplLCBpbnQgdV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhLCBzaXplX3QgYV9zaXplLCBpbnQgYV9zdHJpZGUpIHsKKyAgY29uc3QgaW50IGlzX2V4dGVybmFsX21lbW9yeSA9IChsdW1hICE9IE5VTEwpID8gMSA6IDA7CisgIFdlYlBJRGVjb2RlciogaWRlYzsKKyAgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlOworCisgIGlmIChpc19leHRlcm5hbF9tZW1vcnkgPT0gMCkgeyAgICAvLyBPdmVyd3JpdGUgcGFyYW1ldGVycyB0byBzYW5lIHZhbHVlcy4KKyAgICBsdW1hX3NpemUgPSB1X3NpemUgPSB2X3NpemUgPSBhX3NpemUgPSAwOworICAgIGx1bWFfc3RyaWRlID0gdV9zdHJpZGUgPSB2X3N0cmlkZSA9IGFfc3RyaWRlID0gMDsKKyAgICB1ID0gdiA9IGEgPSBOVUxMOworICAgIGNvbG9yc3BhY2UgPSBNT0RFX1lVVkE7CisgIH0gZWxzZSB7ICAvLyBBIGx1bWEgYnVmZmVyIHdhcyBwYXNzZWQuIFZhbGlkYXRlIHRoZSBvdGhlciBwYXJhbWV0ZXJzLgorICAgIGlmICh1ID09IE5VTEwgfHwgdiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpZiAobHVtYV9zaXplID09IDAgfHwgdV9zaXplID09IDAgfHwgdl9zaXplID09IDApIHJldHVybiBOVUxMOworICAgIGlmIChsdW1hX3N0cmlkZSA9PSAwIHx8IHVfc3RyaWRlID09IDAgfHwgdl9zdHJpZGUgPT0gMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKGEgIT0gTlVMTCkgeworICAgICAgaWYgKGFfc2l6ZSA9PSAwIHx8IGFfc3RyaWRlID09IDApIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb2xvcnNwYWNlID0gKGEgPT0gTlVMTCkgPyBNT0RFX1lVViA6IE1PREVfWVVWQTsKKyAgfQorCisgIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoTlVMTCk7CisgIGlmIChpZGVjID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIGlkZWMtPm91dHB1dF8uY29sb3JzcGFjZSA9IGNvbG9yc3BhY2U7CisgIGlkZWMtPm91dHB1dF8uaXNfZXh0ZXJuYWxfbWVtb3J5ID0gaXNfZXh0ZXJuYWxfbWVtb3J5OworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS55ID0gbHVtYTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEueV9zdHJpZGUgPSBsdW1hX3N0cmlkZTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEueV9zaXplID0gbHVtYV9zaXplOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS51ID0gdTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEudV9zdHJpZGUgPSB1X3N0cmlkZTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEudV9zaXplID0gdV9zaXplOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS52ID0gdjsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEudl9zdHJpZGUgPSB2X3N0cmlkZTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEudl9zaXplID0gdl9zaXplOworICBpZGVjLT5vdXRwdXRfLnUuWVVWQS5hID0gYTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEuYV9zdHJpZGUgPSBhX3N0cmlkZTsKKyAgaWRlYy0+b3V0cHV0Xy51LllVVkEuYV9zaXplID0gYV9zaXplOworICByZXR1cm4gaWRlYzsKK30KKworV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVih1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdiwgc2l6ZV90IHZfc2l6ZSwgaW50IHZfc3RyaWRlKSB7CisgIHJldHVybiBXZWJQSU5ld1lVVkEobHVtYSwgbHVtYV9zaXplLCBsdW1hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB1LCB1X3NpemUsIHVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIHYsIHZfc2l6ZSwgdl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIElEZWNDaGVja1N0YXR1cyhjb25zdCBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgYXNzZXJ0KGlkZWMpOworICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX0VSUk9SKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICB9CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfRE9ORSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX09LOworICB9CisgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKK30KKworVlA4U3RhdHVzQ29kZSBXZWJQSUFwcGVuZChXZWJQSURlY29kZXIqIGlkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIGlmIChpZGVjID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBzdGF0dXMgPSBJRGVjQ2hlY2tTdGF0dXMoaWRlYyk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIC8vIENoZWNrIG1peGVkIGNhbGxzIGJldHdlZW4gUmVtYXBNZW1CdWZmZXIgYW5kIEFwcGVuZFRvTWVtQnVmZmVyLgorICBpZiAoIUNoZWNrTWVtQnVmZmVyTW9kZSgmaWRlYy0+bWVtXywgTUVNX01PREVfQVBQRU5EKSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgLy8gQXBwZW5kIGRhdGEgdG8gbWVtb3J5IGJ1ZmZlcgorICBpZiAoIUFwcGVuZFRvTWVtQnVmZmVyKGlkZWMsIGRhdGEsIGRhdGFfc2l6ZSkpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICB9CisgIHJldHVybiBJRGVjb2RlKGlkZWMpOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBJVXBkYXRlKFdlYlBJRGVjb2RlciogaWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgaWYgKGlkZWMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIHN0YXR1cyA9IElEZWNDaGVja1N0YXR1cyhpZGVjKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgLy8gQ2hlY2sgbWl4ZWQgY2FsbHMgYmV0d2VlbiBSZW1hcE1lbUJ1ZmZlciBhbmQgQXBwZW5kVG9NZW1CdWZmZXIuCisgIGlmICghQ2hlY2tNZW1CdWZmZXJNb2RlKCZpZGVjLT5tZW1fLCBNRU1fTU9ERV9NQVApKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICAvLyBNYWtlIHRoZSBtZW1vcnkgYnVmZmVyIHBvaW50IHRvIHRoZSBuZXcgYnVmZmVyCisgIGlmICghUmVtYXBNZW1CdWZmZXIoaWRlYywgZGF0YSwgZGF0YV9zaXplKSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgcmV0dXJuIElEZWNvZGUoaWRlYyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBjb25zdCBXZWJQRGVjQnVmZmVyKiBHZXRPdXRwdXRCdWZmZXIoY29uc3QgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CisgIGlmIChpZGVjID09IE5VTEwgfHwgaWRlYy0+ZGVjXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGlkZWMtPnN0YXRlXyA8PSBTVEFURV9WUDhfUEFSVFMwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaWYgKGlkZWMtPmZpbmFsX291dHB1dF8gIT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOyAgIC8vIG5vdCB5ZXQgc2xvdy1jb3BpZWQKKyAgfQorICByZXR1cm4gaWRlYy0+cGFyYW1zXy5vdXRwdXQ7Cit9CisKK2NvbnN0IFdlYlBEZWNCdWZmZXIqIFdlYlBJRGVjb2RlZEFyZWEoY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxlZnQsIGludCogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMgPSBHZXRPdXRwdXRCdWZmZXIoaWRlYyk7CisgIGlmIChsZWZ0ICE9IE5VTEwpICpsZWZ0ID0gMDsKKyAgaWYgKHRvcCAhPSBOVUxMKSAqdG9wID0gMDsKKyAgaWYgKHNyYyAhPSBOVUxMKSB7CisgICAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaWRlYy0+cGFyYW1zXy5sYXN0X3k7CisgIH0gZWxzZSB7CisgICAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IDA7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gMDsKKyAgfQorICByZXR1cm4gc3JjOworfQorCit1aW50OF90KiBXZWJQSURlY0dldFJHQihjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlKSB7CisgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYyA9IEdldE91dHB1dEJ1ZmZlcihpZGVjKTsKKyAgaWYgKHNyYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaWYgKHNyYy0+Y29sb3JzcGFjZSA+PSBNT0RFX1lVVikgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGxhc3RfeSAhPSBOVUxMKSAqbGFzdF95ID0gaWRlYy0+cGFyYW1zXy5sYXN0X3k7CisgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBzcmMtPndpZHRoOworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgaWYgKHN0cmlkZSAhPSBOVUxMKSAqc3RyaWRlID0gc3JjLT51LlJHQkEuc3RyaWRlOworCisgIHJldHVybiBzcmMtPnUuUkdCQS5yZ2JhOworfQorCit1aW50OF90KiBXZWJQSURlY0dldFlVVkEoY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxhc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogdSwgdWludDhfdCoqIHYsIHVpbnQ4X3QqKiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSwgaW50KiBhX3N0cmlkZSkgeworICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMgPSBHZXRPdXRwdXRCdWZmZXIoaWRlYyk7CisgIGlmIChzcmMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGlmIChzcmMtPmNvbG9yc3BhY2UgPCBNT0RFX1lVVikgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKGxhc3RfeSAhPSBOVUxMKSAqbGFzdF95ID0gaWRlYy0+cGFyYW1zXy5sYXN0X3k7CisgIGlmICh1ICE9IE5VTEwpICp1ID0gc3JjLT51LllVVkEudTsKKyAgaWYgKHYgIT0gTlVMTCkgKnYgPSBzcmMtPnUuWVVWQS52OworICBpZiAoYSAhPSBOVUxMKSAqYSA9IHNyYy0+dS5ZVVZBLmE7CisgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBzcmMtPndpZHRoOworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgaWYgKHN0cmlkZSAhPSBOVUxMKSAqc3RyaWRlID0gc3JjLT51LllVVkEueV9zdHJpZGU7CisgIGlmICh1dl9zdHJpZGUgIT0gTlVMTCkgKnV2X3N0cmlkZSA9IHNyYy0+dS5ZVVZBLnVfc3RyaWRlOworICBpZiAoYV9zdHJpZGUgIT0gTlVMTCkgKmFfc3RyaWRlID0gc3JjLT51LllVVkEuYV9zdHJpZGU7CisKKyAgcmV0dXJuIHNyYy0+dS5ZVVZBLnk7Cit9CisKK2ludCBXZWJQSVNldElPSG9va3MoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLAorICAgICAgICAgICAgICAgICAgICBWUDhJb1B1dEhvb2sgcHV0LAorICAgICAgICAgICAgICAgICAgICBWUDhJb1NldHVwSG9vayBzZXR1cCwKKyAgICAgICAgICAgICAgICAgICAgVlA4SW9UZWFyZG93bkhvb2sgdGVhcmRvd24sCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkgeworICBpZiAoaWRlYyA9PSBOVUxMIHx8IGlkZWMtPnN0YXRlXyA+IFNUQVRFX1dFQlBfSEVBREVSKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZGVjLT5pb18ucHV0ID0gcHV0OworICBpZGVjLT5pb18uc2V0dXAgPSBzZXR1cDsKKyAgaWRlYy0+aW9fLnRlYXJkb3duID0gdGVhcmRvd247CisgIGlkZWMtPmlvXy5vcGFxdWUgPSB1c2VyX2RhdGE7CisKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvaW8uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDkyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvaW8uYwpAQCAtMCwwICsxLDYyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGZ1bmN0aW9ucyBmb3Igc2FtcGxlIG91dHB1dC4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3dlYnBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBZVVY8LT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKworc3RhdGljIGludCBFbWl0WVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQgPSBwLT5vdXRwdXQ7CisgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LllVVkE7CisgIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gYnVmLT55ICsgaW8tPm1iX3kgKiBidWYtPnlfc3RyaWRlOworICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGJ1Zi0+dSArIChpby0+bWJfeSA+PiAxKSAqIGJ1Zi0+dV9zdHJpZGU7CisgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gYnVmLT52ICsgKGlvLT5tYl95ID4+IDEpICogYnVmLT52X3N0cmlkZTsKKyAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKKyAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IHV2X3cgPSAobWJfdyArIDEpIC8gMjsKKyAgY29uc3QgaW50IHV2X2ggPSAobWJfaCArIDEpIC8gMjsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCBtYl9oOyArK2opIHsKKyAgICBtZW1jcHkoeV9kc3QgKyBqICogYnVmLT55X3N0cmlkZSwgaW8tPnkgKyBqICogaW8tPnlfc3RyaWRlLCBtYl93KTsKKyAgfQorICBmb3IgKGogPSAwOyBqIDwgdXZfaDsgKytqKSB7CisgICAgbWVtY3B5KHVfZHN0ICsgaiAqIGJ1Zi0+dV9zdHJpZGUsIGlvLT51ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOworICAgIG1lbWNweSh2X2RzdCArIGogKiBidWYtPnZfc3RyaWRlLCBpby0+diArIGogKiBpby0+dXZfc3RyaWRlLCB1dl93KTsKKyAgfQorICByZXR1cm4gaW8tPm1iX2g7Cit9CisKKy8vIFBvaW50LXNhbXBsaW5nIFUvViBzYW1wbGVyLgorc3RhdGljIGludCBFbWl0U2FtcGxlZFJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gcC0+b3V0cHV0OworICBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOworICB1aW50OF90KiBjb25zdCBkc3QgPSBidWYtPnJnYmEgKyBpby0+bWJfeSAqIGJ1Zi0+c3RyaWRlOworICBXZWJQU2FtcGxlclByb2Nlc3NQbGFuZShpby0+eSwgaW8tPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+dSwgaW8tPnYsIGlvLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgYnVmLT5zdHJpZGUsIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFNhbXBsZXJzW291dHB1dC0+Y29sb3JzcGFjZV0pOworICByZXR1cm4gaW8tPm1iX2g7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYW5jeSB1cHNhbXBsaW5nCisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCitzdGF0aWMgaW50IEVtaXRGYW5jeVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgaW50IG51bV9saW5lc19vdXQgPSBpby0+bWJfaDsgICAvLyBhIHByaW9yaSBndWVzcworICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5SR0JBOworICB1aW50OF90KiBkc3QgPSBidWYtPnJnYmEgKyBpby0+bWJfeSAqIGJ1Zi0+c3RyaWRlOworICBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgdXBzYW1wbGUgPSBXZWJQVXBzYW1wbGVyc1twLT5vdXRwdXQtPmNvbG9yc3BhY2VdOworICBjb25zdCB1aW50OF90KiBjdXJfeSA9IGlvLT55OworICBjb25zdCB1aW50OF90KiBjdXJfdSA9IGlvLT51OworICBjb25zdCB1aW50OF90KiBjdXJfdiA9IGlvLT52OworICBjb25zdCB1aW50OF90KiB0b3BfdSA9IHAtPnRtcF91OworICBjb25zdCB1aW50OF90KiB0b3BfdiA9IHAtPnRtcF92OworICBpbnQgeSA9IGlvLT5tYl95OworICBjb25zdCBpbnQgeV9lbmQgPSBpby0+bWJfeSArIGlvLT5tYl9oOworICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OworICBjb25zdCBpbnQgdXZfdyA9IChtYl93ICsgMSkgLyAyOworCisgIGlmICh5ID09IDApIHsKKyAgICAvLyBGaXJzdCBsaW5lIGlzIHNwZWNpYWwgY2FzZWQuIFdlIG1pcnJvciB0aGUgdS92IHNhbXBsZXMgYXQgYm91bmRhcnkuCisgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBkc3QsIE5VTEwsIG1iX3cpOworICB9IGVsc2UgeworICAgIC8vIFdlIGNhbiBmaW5pc2ggdGhlIGxlZnQtb3ZlciBsaW5lIGZyb20gcHJldmlvdXMgY2FsbC4KKyAgICB1cHNhbXBsZShwLT50bXBfeSwgY3VyX3ksIHRvcF91LCB0b3BfdiwgY3VyX3UsIGN1cl92LAorICAgICAgICAgICAgIGRzdCAtIGJ1Zi0+c3RyaWRlLCBkc3QsIG1iX3cpOworICAgICsrbnVtX2xpbmVzX291dDsKKyAgfQorICAvLyBMb29wIG92ZXIgZWFjaCBvdXRwdXQgcGFpcnMgb2Ygcm93LgorICBmb3IgKDsgeSArIDIgPCB5X2VuZDsgeSArPSAyKSB7CisgICAgdG9wX3UgPSBjdXJfdTsKKyAgICB0b3BfdiA9IGN1cl92OworICAgIGN1cl91ICs9IGlvLT51dl9zdHJpZGU7CisgICAgY3VyX3YgKz0gaW8tPnV2X3N0cmlkZTsKKyAgICBkc3QgKz0gMiAqIGJ1Zi0+c3RyaWRlOworICAgIGN1cl95ICs9IDIgKiBpby0+eV9zdHJpZGU7CisgICAgdXBzYW1wbGUoY3VyX3kgLSBpby0+eV9zdHJpZGUsIGN1cl95LAorICAgICAgICAgICAgIHRvcF91LCB0b3BfdiwgY3VyX3UsIGN1cl92LAorICAgICAgICAgICAgIGRzdCAtIGJ1Zi0+c3RyaWRlLCBkc3QsIG1iX3cpOworICB9CisgIC8vIG1vdmUgdG8gbGFzdCByb3cKKyAgY3VyX3kgKz0gaW8tPnlfc3RyaWRlOworICBpZiAoaW8tPmNyb3BfdG9wICsgeV9lbmQgPCBpby0+Y3JvcF9ib3R0b20pIHsKKyAgICAvLyBTYXZlIHRoZSB1bmZpbmlzaGVkIHNhbXBsZXMgZm9yIG5leHQgY2FsbCAoYXMgd2UncmUgbm90IGRvbmUgeWV0KS4KKyAgICBtZW1jcHkocC0+dG1wX3ksIGN1cl95LCBtYl93ICogc2l6ZW9mKCpwLT50bXBfeSkpOworICAgIG1lbWNweShwLT50bXBfdSwgY3VyX3UsIHV2X3cgKiBzaXplb2YoKnAtPnRtcF91KSk7CisgICAgbWVtY3B5KHAtPnRtcF92LCBjdXJfdiwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3YpKTsKKyAgICAvLyBUaGUgZmFuY3kgdXBzYW1wbGVyIGxlYXZlcyBhIHJvdyB1bmZpbmlzaGVkIGJlaGluZAorICAgIC8vIChleGNlcHQgZm9yIHRoZSB2ZXJ5IGxhc3Qgcm93KQorICAgIG51bV9saW5lc19vdXQtLTsKKyAgfSBlbHNlIHsKKyAgICAvLyBQcm9jZXNzIHRoZSB2ZXJ5IGxhc3Qgcm93IG9mIGV2ZW4tc2l6ZWQgcGljdHVyZQorICAgIGlmICghKHlfZW5kICYgMSkpIHsKKyAgICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwKKyAgICAgICAgICAgICAgIGRzdCArIGJ1Zi0+c3RyaWRlLCBOVUxMLCBtYl93KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKKyNlbmRpZiAgICAvKiBGQU5DWV9VUFNBTVBMSU5HICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEZpbGxBbHBoYVBsYW5lKHVpbnQ4X3QqIGRzdCwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgaDsgKytqKSB7CisgICAgbWVtc2V0KGRzdCwgMHhmZiwgdyAqIHNpemVvZigqZHN0KSk7CisgICAgZHN0ICs9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEVtaXRBbHBoYVlVVihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCkgeworICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOworICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJnAtPm91dHB1dC0+dS5ZVVZBOworICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OworICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOworICB1aW50OF90KiBkc3QgPSBidWYtPmEgKyBpby0+bWJfeSAqIGJ1Zi0+YV9zdHJpZGU7CisgIGludCBqOworICAodm9pZClleHBlY3RlZF9udW1fbGluZXNfb3V0OworICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBtYl9oKTsKKyAgaWYgKGFscGhhICE9IE5VTEwpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgbWJfaDsgKytqKSB7CisgICAgICBtZW1jcHkoZHN0LCBhbHBoYSwgbWJfdyAqIHNpemVvZigqZHN0KSk7CisgICAgICBhbHBoYSArPSBpby0+d2lkdGg7CisgICAgICBkc3QgKz0gYnVmLT5hX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYnVmLT5hICE9IE5VTEwpIHsKKyAgICAvLyB0aGUgdXNlciByZXF1ZXN0ZWQgYWxwaGEsIGJ1dCB0aGVyZSBpcyBub25lLCBzZXQgaXQgdG8gb3BhcXVlLgorICAgIEZpbGxBbHBoYVBsYW5lKGRzdCwgbWJfdywgbWJfaCwgYnVmLT5hX3N0cmlkZSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR2V0QWxwaGFTb3VyY2VSb3coY29uc3QgVlA4SW8qIGNvbnN0IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogYWxwaGEsIGludCogY29uc3QgbnVtX3Jvd3MpIHsKKyAgaW50IHN0YXJ0X3kgPSBpby0+bWJfeTsKKyAgKm51bV9yb3dzID0gaW8tPm1iX2g7CisKKyAgLy8gQ29tcGVuc2F0ZSBmb3IgdGhlIDEtbGluZSBkZWxheSBvZiB0aGUgZmFuY3kgdXBzY2FsZXIuCisgIC8vIFRoaXMgaXMgc2ltaWxhciB0byBFbWl0RmFuY3lSR0IoKS4KKyAgaWYgKGlvLT5mYW5jeV91cHNhbXBsaW5nKSB7CisgICAgaWYgKHN0YXJ0X3kgPT0gMCkgeworICAgICAgLy8gV2UgZG9uJ3QgcHJvY2VzcyB0aGUgbGFzdCByb3cgeWV0LiBJdCdsbCBiZSBkb25lIGR1cmluZyB0aGUgbmV4dCBjYWxsLgorICAgICAgLS0qbnVtX3Jvd3M7CisgICAgfSBlbHNlIHsKKyAgICAgIC0tc3RhcnRfeTsKKyAgICAgIC8vIEZvcnR1bmF0ZWx5LCAqYWxwaGEgZGF0YSBpcyBwZXJzaXN0ZW50LCBzbyB3ZSBjYW4gZ28gYmFjaworICAgICAgLy8gb25lIHJvdyBhbmQgZmluaXNoIGFscGhhIGJsZW5kaW5nLCBub3cgdGhhdCB0aGUgZmFuY3kgdXBzY2FsZXIKKyAgICAgIC8vIGNvbXBsZXRlZCB0aGUgWVVWLT5SR0IgaW50ZXJwb2xhdGlvbi4KKyAgICAgICphbHBoYSAtPSBpby0+d2lkdGg7CisgICAgfQorICAgIGlmIChpby0+Y3JvcF90b3AgKyBpby0+bWJfeSArIGlvLT5tYl9oID09IGlvLT5jcm9wX2JvdHRvbSkgeworICAgICAgLy8gSWYgaXQncyB0aGUgdmVyeSBsYXN0IGNhbGwsIHdlIHByb2Nlc3MgYWxsIHRoZSByZW1haW5pbmcgcm93cyEKKyAgICAgICpudW1fcm93cyA9IGlvLT5jcm9wX2JvdHRvbSAtIGlvLT5jcm9wX3RvcCAtIHN0YXJ0X3k7CisgICAgfQorICB9CisgIHJldHVybiBzdGFydF95OworfQorCitzdGF0aWMgaW50IEVtaXRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCkgeworICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOworICBpZiAoYWxwaGEgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CisgICAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOworICAgIGNvbnN0IGludCBhbHBoYV9maXJzdCA9CisgICAgICAgIChjb2xvcnNwYWNlID09IE1PREVfQVJHQiB8fCBjb2xvcnNwYWNlID09IE1PREVfQXJnYik7CisgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKKyAgICBpbnQgbnVtX3Jvd3M7CisgICAgY29uc3QgaW50IHN0YXJ0X3kgPSBHZXRBbHBoYVNvdXJjZVJvdyhpbywgJmFscGhhLCAmbnVtX3Jvd3MpOworICAgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHN0YXJ0X3kgKiBidWYtPnN0cmlkZTsKKyAgICB1aW50OF90KiBjb25zdCBkc3QgPSBiYXNlX3JnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBEaXNwYXRjaEFscGhhKGFscGhhLCBpby0+d2lkdGgsIG1iX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9yb3dzLCBkc3QsIGJ1Zi0+c3RyaWRlKTsKKyAgICAodm9pZClleHBlY3RlZF9udW1fbGluZXNfb3V0OworICAgIGFzc2VydChleHBlY3RlZF9udW1fbGluZXNfb3V0ID09IG51bV9yb3dzKTsKKyAgICAvLyBoYXNfYWxwaGEgaXMgdHJ1ZSBpZiB0aGVyZSdzIG5vbi10cml2aWFsIGFscGhhIHRvIHByZW11bHRpcGx5IHdpdGguCisgICAgaWYgKGhhc19hbHBoYSAmJiBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKSkgeworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShiYXNlX3JnYmEsIGFscGhhX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl93LCBudW1fcm93cywgYnVmLT5zdHJpZGUpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBFbWl0QWxwaGFSR0JBNDQ0NChjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhID0gaW8tPmE7CisgIGlmIChhbHBoYSAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKKyAgICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBwLT5vdXRwdXQtPmNvbG9yc3BhY2U7CisgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKKyAgICBpbnQgbnVtX3Jvd3M7CisgICAgY29uc3QgaW50IHN0YXJ0X3kgPSBHZXRBbHBoYVNvdXJjZVJvdyhpbywgJmFscGhhLCAmbnVtX3Jvd3MpOworICAgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHN0YXJ0X3kgKiBidWYtPnN0cmlkZTsKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgdWludDhfdCogYWxwaGFfZHN0ID0gYmFzZV9yZ2JhOworI2Vsc2UKKyAgICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCisgICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4MGY7CisgICAgaW50IGksIGo7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9yb3dzOyArK2opIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtYl93OyArK2kpIHsKKyAgICAgICAgLy8gRmlsbCBpbiB0aGUgYWxwaGEgdmFsdWUgKGNvbnZlcnRlZCB0byA0IGJpdHMpLgorICAgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldID4+IDQ7CisgICAgICAgIGFscGhhX2RzdFsyICogaV0gPSAoYWxwaGFfZHN0WzIgKiBpXSAmIDB4ZjApIHwgYWxwaGFfdmFsdWU7CisgICAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7CisgICAgICB9CisgICAgICBhbHBoYSArPSBpby0+d2lkdGg7CisgICAgICBhbHBoYV9kc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgfQorICAgICh2b2lkKWV4cGVjdGVkX251bV9saW5lc19vdXQ7CisgICAgYXNzZXJ0KGV4cGVjdGVkX251bV9saW5lc19vdXQgPT0gbnVtX3Jvd3MpOworICAgIGlmIChhbHBoYV9tYXNrICE9IDB4MGYgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KGJhc2VfcmdiYSwgbWJfdywgbnVtX3Jvd3MsIGJ1Zi0+c3RyaWRlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBZVVYgcmVzY2FsaW5nIChubyBmaW5hbCBSR0IgY29udmVyc2lvbiBuZWVkZWQpCisKK3N0YXRpYyBpbnQgUmVzY2FsZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIGludCBuZXdfbGluZXMsIFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgd2hpbGUgKG5ld19saW5lcyA+IDApIHsgICAgLy8gaW1wb3J0IG5ldyBjb250cmlidXRpb25zIG9mIHNvdXJjZSByb3dzLgorICAgIGNvbnN0IGludCBsaW5lc19pbiA9IFdlYlBSZXNjYWxlckltcG9ydCh3cmssIG5ld19saW5lcywgc3JjLCBzcmNfc3RyaWRlKTsKKyAgICBzcmMgKz0gbGluZXNfaW4gKiBzcmNfc3RyaWRlOworICAgIG5ld19saW5lcyAtPSBsaW5lc19pbjsKKyAgICBudW1fbGluZXNfb3V0ICs9IFdlYlBSZXNjYWxlckV4cG9ydCh3cmspOyAgICAvLyBlbWl0IG91dHB1dCByb3cocykKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CisgIGNvbnN0IGludCB1dl9tYl9oID0gKG1iX2ggKyAxKSA+PiAxOworICBXZWJQUmVzY2FsZXIqIGNvbnN0IHNjYWxlciA9ICZwLT5zY2FsZXJfeTsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICBpZiAoV2ViUElzQWxwaGFNb2RlKHAtPm91dHB1dC0+Y29sb3JzcGFjZSkgJiYgaW8tPmEgIT0gTlVMTCkgeworICAgIC8vIEJlZm9yZSByZXNjYWxpbmcsIHdlIHByZW11bHRpcGx5IHRoZSBsdW1hIGRpcmVjdGx5IGludG8gdGhlIGlvLT55CisgICAgLy8gaW50ZXJuYWwgYnVmZmVyLiBUaGlzIGlzIE9LIHNpbmNlIHRoZXNlIHNhbXBsZXMgYXJlIG5vdCB1c2VkIGZvcgorICAgIC8vIGludHJhLXByZWRpY3Rpb24gKHRoZSB0b3Agc2FtcGxlcyBhcmUgc2F2ZWQgaW4gY2FjaGVfeV8vdV8vdl8pLgorICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIGNhc3QgdGhlIGNvbnN0IGF3YXksIHRob3VnaC4KKyAgICBXZWJQTXVsdFJvd3MoKHVpbnQ4X3QqKWlvLT55LCBpby0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgIGlvLT5hLCBpby0+d2lkdGgsIGlvLT5tYl93LCBtYl9oLCAwKTsKKyAgfQorICBudW1fbGluZXNfb3V0ID0gUmVzY2FsZShpby0+eSwgaW8tPnlfc3RyaWRlLCBtYl9oLCBzY2FsZXIpOworICBSZXNjYWxlKGlvLT51LCBpby0+dXZfc3RyaWRlLCB1dl9tYl9oLCAmcC0+c2NhbGVyX3UpOworICBSZXNjYWxlKGlvLT52LCBpby0+dXZfc3RyaWRlLCB1dl9tYl9oLCAmcC0+c2NhbGVyX3YpOworICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVlVVihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fbGluZXNfb3V0KSB7CisgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LllVVkE7CisgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgdWludDhfdCogZHN0X3kgPSBidWYtPnkgKyBwLT5sYXN0X3kgKiBidWYtPnlfc3RyaWRlOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hID0gYnVmLT5hICsgcC0+bGFzdF95ICogYnVmLT5hX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPmEsIGlvLT53aWR0aCwgaW8tPm1iX2gsICZwLT5zY2FsZXJfYSk7CisgICAgKHZvaWQpZXhwZWN0ZWRfbnVtX2xpbmVzX291dDsKKyAgICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBudW1fbGluZXNfb3V0KTsKKyAgICBpZiAobnVtX2xpbmVzX291dCA+IDApIHsgICAvLyB1bm11bHRpcGx5IHRoZSBZCisgICAgICBXZWJQTXVsdFJvd3MoZHN0X3ksIGJ1Zi0+eV9zdHJpZGUsIHNyY19hLCBidWYtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHAtPnNjYWxlcl9hLmRzdF93aWR0aCwgbnVtX2xpbmVzX291dCwgMSk7CisgICAgfQorICB9IGVsc2UgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgLy8gdGhlIHVzZXIgcmVxdWVzdGVkIGFscGhhLCBidXQgdGhlcmUgaXMgbm9uZSwgc2V0IGl0IHRvIG9wYXF1ZS4KKyAgICBhc3NlcnQocC0+bGFzdF95ICsgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA8PSBpby0+c2NhbGVkX2hlaWdodCk7CisgICAgRmlsbEFscGhhUGxhbmUoYnVmLT5hICsgcC0+bGFzdF95ICogYnVmLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICBpby0+c2NhbGVkX3dpZHRoLCBleHBlY3RlZF9udW1fbGluZXNfb3V0LCBidWYtPmFfc3RyaWRlKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBJbml0WVVWUmVzY2FsZXIoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUocC0+b3V0cHV0LT5jb2xvcnNwYWNlKTsKKyAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuWVVWQTsKKyAgY29uc3QgaW50IG91dF93aWR0aCAgPSBpby0+c2NhbGVkX3dpZHRoOworICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OworICBjb25zdCBpbnQgdXZfb3V0X3dpZHRoICA9IChvdXRfd2lkdGggKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfb3V0X2hlaWdodCA9IChvdXRfaGVpZ2h0ICsgMSkgPj4gMTsKKyAgY29uc3QgaW50IHV2X2luX3dpZHRoICA9IChpby0+bWJfdyArIDEpID4+IDE7CisgIGNvbnN0IGludCB1dl9pbl9oZWlnaHQgPSAoaW8tPm1iX2ggKyAxKSA+PiAxOworICBjb25zdCBzaXplX3Qgd29ya19zaXplID0gMiAqIG91dF93aWR0aDsgICAvLyBzY3JhdGNoIG1lbW9yeSBmb3IgbHVtYSByZXNjYWxlcgorICBjb25zdCBzaXplX3QgdXZfd29ya19zaXplID0gMiAqIHV2X291dF93aWR0aDsgIC8vIGFuZCBmb3IgZWFjaCB1L3Ygb25lcworICBzaXplX3QgdG1wX3NpemU7CisgIHJlc2NhbGVyX3QqIHdvcms7CisKKyAgdG1wX3NpemUgPSAod29ya19zaXplICsgMiAqIHV2X3dvcmtfc2l6ZSkgKiBzaXplb2YoKndvcmspOworICBpZiAoaGFzX2FscGhhKSB7CisgICAgdG1wX3NpemUgKz0gd29ya19zaXplICogc2l6ZW9mKCp3b3JrKTsKKyAgfQorICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCB0bXBfc2l6ZSk7CisgIGlmIChwLT5tZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgorICB9CisgIHdvcmsgPSAocmVzY2FsZXJfdCopcC0+bWVtb3J5OworICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfeSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgIGJ1Zi0+eSwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCBidWYtPnlfc3RyaWRlLCAxLAorICAgICAgICAgICAgICAgICAgIHdvcmspOworICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfdSwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICBidWYtPnUsIHV2X291dF93aWR0aCwgdXZfb3V0X2hlaWdodCwgYnVmLT51X3N0cmlkZSwgMSwKKyAgICAgICAgICAgICAgICAgICB3b3JrICsgd29ya19zaXplKTsKKyAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3YsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYnVmLT52LCB1dl9vdXRfd2lkdGgsIHV2X291dF9oZWlnaHQsIGJ1Zi0+dl9zdHJpZGUsIDEsCisgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSArIHV2X3dvcmtfc2l6ZSk7CisgIHAtPmVtaXQgPSBFbWl0UmVzY2FsZWRZVVY7CisKKyAgaWYgKGhhc19hbHBoYSkgeworICAgIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl9hLCBpby0+bWJfdywgaW8tPm1iX2gsCisgICAgICAgICAgICAgICAgICAgICBidWYtPmEsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgYnVmLT5hX3N0cmlkZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIHdvcmsgKyB3b3JrX3NpemUgKyAyICogdXZfd29ya19zaXplKTsKKyAgICBwLT5lbWl0X2FscGhhID0gRW1pdFJlc2NhbGVkQWxwaGFZVVY7CisgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQkEgcmVzY2FsaW5nCisKK3N0YXRpYyBpbnQgRXhwb3J0UkdCKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3BvcykgeworICBjb25zdCBXZWJQWVVWNDQ0Q29udmVydGVyIGNvbnZlcnQgPQorICAgICAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbcC0+b3V0cHV0LT5jb2xvcnNwYWNlXTsKKyAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKKyAgdWludDhfdCogZHN0ID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICAvLyBGb3IgUkdCIHJlc2NhbGluZywgYmVjYXVzZSBvZiB0aGUgWVVWNDIwLCBjdXJyZW50IHNjYW4gcG9zaXRpb24KKyAgLy8gVS9WIGNhbiBiZSArMS8tMSBsaW5lIGZyb20gdGhlIFkgb25lLiAgSGVuY2UgdGhlIGRvdWJsZSB0ZXN0LgorICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dCgmcC0+c2NhbGVyX3kpICYmCisgICAgICAgICBXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfdSkpIHsKKyAgICBhc3NlcnQoeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOworICAgIGFzc2VydChwLT5zY2FsZXJfdS55X2FjY3VtID09IHAtPnNjYWxlcl92LnlfYWNjdW0pOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3kpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3UpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX3YpOworICAgIGNvbnZlcnQocC0+c2NhbGVyX3kuZHN0LCBwLT5zY2FsZXJfdS5kc3QsIHAtPnNjYWxlcl92LmRzdCwKKyAgICAgICAgICAgIGRzdCwgcC0+c2NhbGVyX3kuZHN0X3dpZHRoKTsKKyAgICBkc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IHV2X21iX2ggPSAobWJfaCArIDEpID4+IDE7CisgIGludCBqID0gMCwgdXZfaiA9IDA7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgd2hpbGUgKGogPCBtYl9oKSB7CisgICAgY29uc3QgaW50IHlfbGluZXNfaW4gPQorICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl95LCBtYl9oIC0gaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT55ICsgaiAqIGlvLT55X3N0cmlkZSwgaW8tPnlfc3RyaWRlKTsKKyAgICBqICs9IHlfbGluZXNfaW47CisgICAgaWYgKFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoJnAtPnNjYWxlcl91LCB1dl9tYl9oIC0gdXZfaikpIHsKKyAgICAgIGNvbnN0IGludCB1X2xpbmVzX2luID0KKyAgICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoJnAtPnNjYWxlcl91LCB1dl9tYl9oIC0gdXZfaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnUgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7CisgICAgICBjb25zdCBpbnQgdl9saW5lc19pbiA9CisgICAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KCZwLT5zY2FsZXJfdiwgdXZfbWJfaCAtIHV2X2osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT52ICsgdXZfaiAqIGlvLT51dl9zdHJpZGUsIGlvLT51dl9zdHJpZGUpOworICAgICAgKHZvaWQpdl9saW5lc19pbjsgICAvLyByZW1vdmUgYSBnY2Mgd2FybmluZworICAgICAgYXNzZXJ0KHVfbGluZXNfaW4gPT0gdl9saW5lc19pbik7CisgICAgICB1dl9qICs9IHVfbGluZXNfaW47CisgICAgfQorICAgIG51bV9saW5lc19vdXQgKz0gRXhwb3J0UkdCKHAsIHAtPmxhc3RfeSArIG51bV9saW5lc19vdXQpOworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEV4cG9ydEFscGhhKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3BvcywgaW50IG1heF9saW5lc19vdXQpIHsKKyAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKKyAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOworICBjb25zdCBpbnQgYWxwaGFfZmlyc3QgPQorICAgICAgKGNvbG9yc3BhY2UgPT0gTU9ERV9BUkdCIHx8IGNvbG9yc3BhY2UgPT0gTU9ERV9BcmdiKTsKKyAgdWludDhfdCogZHN0ID0gYmFzZV9yZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIGNvbnN0IGludCBpc19wcmVtdWx0X2FscGhhID0gV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSk7CisgIHVpbnQzMl90IG5vbl9vcGFxdWUgPSAwOworICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS5kc3Rfd2lkdGg7CisKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoJnAtPnNjYWxlcl9hKSAmJgorICAgICAgICAgbnVtX2xpbmVzX291dCA8IG1heF9saW5lc19vdXQpIHsKKyAgICBhc3NlcnQoeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX2EpOworICAgIG5vbl9vcGFxdWUgfD0gV2ViUERpc3BhdGNoQWxwaGEocC0+c2NhbGVyX2EuZHN0LCAwLCB3aWR0aCwgMSwgZHN0LCAwKTsKKyAgICBkc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIGlmIChpc19wcmVtdWx0X2FscGhhICYmIG5vbl9vcGFxdWUpIHsKKyAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KGJhc2VfcmdiYSwgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbnVtX2xpbmVzX291dCwgYnVmLT5zdHJpZGUpOworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCitzdGF0aWMgaW50IEV4cG9ydEFscGhhUkdCQTQ0NDQoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbGluZXNfb3V0KSB7CisgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7CisgIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIHlfcG9zICogYnVmLT5zdHJpZGU7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmE7CisjZWxzZQorICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOworICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS5kc3Rfd2lkdGg7CisgIGNvbnN0IGludCBpc19wcmVtdWx0X2FscGhhID0gV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSk7CisgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweDBmOworCisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfYSkgJiYKKyAgICAgICAgIG51bV9saW5lc19vdXQgPCBtYXhfbGluZXNfb3V0KSB7CisgICAgaW50IGk7CisgICAgYXNzZXJ0KHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3coJnAtPnNjYWxlcl9hKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgLy8gRmlsbCBpbiB0aGUgYWxwaGEgdmFsdWUgKGNvbnZlcnRlZCB0byA0IGJpdHMpLgorICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBwLT5zY2FsZXJfYS5kc3RbaV0gPj4gNDsKKyAgICAgIGFscGhhX2RzdFsyICogaV0gPSAoYWxwaGFfZHN0WzIgKiBpXSAmIDB4ZjApIHwgYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhbHBoYV9kc3QgKz0gYnVmLT5zdHJpZGU7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIGlmIChpc19wcmVtdWx0X2FscGhhICYmIGFscGhhX21hc2sgIT0gMHgwZikgeworICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KGJhc2VfcmdiYSwgd2lkdGgsIG51bV9saW5lc19vdXQsIGJ1Zi0+c3RyaWRlKTsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fb3V0X2xpbmVzKSB7CisgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgV2ViUFJlc2NhbGVyKiBjb25zdCBzY2FsZXIgPSAmcC0+c2NhbGVyX2E7CisgICAgaW50IGxpbmVzX2xlZnQgPSBleHBlY3RlZF9udW1fb3V0X2xpbmVzOworICAgIGNvbnN0IGludCB5X2VuZCA9IHAtPmxhc3RfeSArIGxpbmVzX2xlZnQ7CisgICAgd2hpbGUgKGxpbmVzX2xlZnQgPiAwKSB7CisgICAgICBjb25zdCBpbnQgcm93X29mZnNldCA9IHNjYWxlci0+c3JjX3kgLSBpby0+bWJfeTsKKyAgICAgIFdlYlBSZXNjYWxlckltcG9ydChzY2FsZXIsIGlvLT5tYl9oICsgaW8tPm1iX3kgLSBzY2FsZXItPnNyY195LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5hICsgcm93X29mZnNldCAqIGlvLT53aWR0aCwgaW8tPndpZHRoKTsKKyAgICAgIGxpbmVzX2xlZnQgLT0gcC0+ZW1pdF9hbHBoYV9yb3cocCwgeV9lbmQgLSBsaW5lc19sZWZ0LCBsaW5lc19sZWZ0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgSW5pdFJHQlJlc2NhbGVyKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworICBjb25zdCBpbnQgaGFzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKHAtPm91dHB1dC0+Y29sb3JzcGFjZSk7CisgIGNvbnN0IGludCBvdXRfd2lkdGggID0gaW8tPnNjYWxlZF93aWR0aDsKKyAgY29uc3QgaW50IG91dF9oZWlnaHQgPSBpby0+c2NhbGVkX2hlaWdodDsKKyAgY29uc3QgaW50IHV2X2luX3dpZHRoICA9IChpby0+bWJfdyArIDEpID4+IDE7CisgIGNvbnN0IGludCB1dl9pbl9oZWlnaHQgPSAoaW8tPm1iX2ggKyAxKSA+PiAxOworICBjb25zdCBzaXplX3Qgd29ya19zaXplID0gMiAqIG91dF93aWR0aDsgICAvLyBzY3JhdGNoIG1lbW9yeSBmb3Igb25lIHJlc2NhbGVyCisgIHJlc2NhbGVyX3QqIHdvcms7ICAvLyByZXNjYWxlcnMgd29yayBhcmVhCisgIHVpbnQ4X3QqIHRtcDsgICAvLyB0bXAgc3RvcmFnZSBmb3Igc2NhbGVkIFlVVjQ0NCBzYW1wbGVzIGJlZm9yZSBSR0IgY29udmVyc2lvbgorICBzaXplX3QgdG1wX3NpemUxLCB0bXBfc2l6ZTIsIHRvdGFsX3NpemU7CisKKyAgdG1wX3NpemUxID0gMyAqIHdvcmtfc2l6ZTsKKyAgdG1wX3NpemUyID0gMyAqIG91dF93aWR0aDsKKyAgaWYgKGhhc19hbHBoYSkgeworICAgIHRtcF9zaXplMSArPSB3b3JrX3NpemU7CisgICAgdG1wX3NpemUyICs9IG91dF93aWR0aDsKKyAgfQorICB0b3RhbF9zaXplID0gdG1wX3NpemUxICogc2l6ZW9mKCp3b3JrKSArIHRtcF9zaXplMiAqIHNpemVvZigqdG1wKTsKKyAgcC0+bWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG90YWxfc2l6ZSk7CisgIGlmIChwLT5tZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgorICB9CisgIHdvcmsgPSAocmVzY2FsZXJfdCopcC0+bWVtb3J5OworICB0bXAgPSAodWludDhfdCopKHdvcmsgKyB0bXBfc2l6ZTEpOworICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfeSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgIHRtcCArIDAgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICB3b3JrICsgMCAqIHdvcmtfc2l6ZSk7CisgIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl91LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHRtcCArIDEgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICB3b3JrICsgMSAqIHdvcmtfc2l6ZSk7CisgIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl92LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHRtcCArIDIgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICB3b3JrICsgMiAqIHdvcmtfc2l6ZSk7CisgIHAtPmVtaXQgPSBFbWl0UmVzY2FsZWRSR0I7CisgIFdlYlBJbml0WVVWNDQ0Q29udmVydGVycygpOworCisgIGlmIChoYXNfYWxwaGEpIHsKKyAgICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfYSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgICAgdG1wICsgMyAqIG91dF93aWR0aCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgd29yayArIDMgKiB3b3JrX3NpemUpOworICAgIHAtPmVtaXRfYWxwaGEgPSBFbWl0UmVzY2FsZWRBbHBoYVJHQjsKKyAgICBpZiAocC0+b3V0cHV0LT5jb2xvcnNwYWNlID09IE1PREVfUkdCQV80NDQ0IHx8CisgICAgICAgIHAtPm91dHB1dC0+Y29sb3JzcGFjZSA9PSBNT0RFX3JnYkFfNDQ0NCkgeworICAgICAgcC0+ZW1pdF9hbHBoYV9yb3cgPSBFeHBvcnRBbHBoYVJHQkE0NDQ0OworICAgIH0gZWxzZSB7CisgICAgICBwLT5lbWl0X2FscGhhX3JvdyA9IEV4cG9ydEFscGhhOworICAgIH0KKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmYXVsdCBjdXN0b20gZnVuY3Rpb25zCisKK3N0YXRpYyBpbnQgQ3VzdG9tU2V0dXAoVlA4SW8qIGlvKSB7CisgIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAgPSAoV2ViUERlY1BhcmFtcyopaW8tPm9wYXF1ZTsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOworICBjb25zdCBpbnQgaXNfcmdiID0gV2ViUElzUkdCTW9kZShjb2xvcnNwYWNlKTsKKyAgY29uc3QgaW50IGlzX2FscGhhID0gV2ViUElzQWxwaGFNb2RlKGNvbG9yc3BhY2UpOworCisgIHAtPm1lbW9yeSA9IE5VTEw7CisgIHAtPmVtaXQgPSBOVUxMOworICBwLT5lbWl0X2FscGhhID0gTlVMTDsKKyAgcC0+ZW1pdF9hbHBoYV9yb3cgPSBOVUxMOworICBpZiAoIVdlYlBJb0luaXRGcm9tT3B0aW9ucyhwLT5vcHRpb25zLCBpbywgaXNfYWxwaGEgPyBNT0RFX1lVViA6IE1PREVfWVVWQSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaXNfYWxwaGEgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKKyAgICBXZWJQSW5pdFVwc2FtcGxlcnMoKTsKKyAgfQorICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7CisgICAgY29uc3QgaW50IG9rID0gaXNfcmdiID8gSW5pdFJHQlJlc2NhbGVyKGlvLCBwKSA6IEluaXRZVVZSZXNjYWxlcihpbywgcCk7CisgICAgaWYgKCFvaykgeworICAgICAgcmV0dXJuIDA7ICAgIC8vIG1lbW9yeSBlcnJvcgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfcmdiKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzKCk7CisgICAgICBwLT5lbWl0ID0gRW1pdFNhbXBsZWRSR0I7ICAgLy8gZGVmYXVsdAorICAgICAgaWYgKGlvLT5mYW5jeV91cHNhbXBsaW5nKSB7CisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworICAgICAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAoaW8tPm1iX3cgKyAxKSA+PiAxOworICAgICAgICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCAoc2l6ZV90KShpby0+bWJfdyArIDIgKiB1dl93aWR0aCkpOworICAgICAgICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IuCisgICAgICAgIH0KKyAgICAgICAgcC0+dG1wX3kgPSAodWludDhfdCopcC0+bWVtb3J5OworICAgICAgICBwLT50bXBfdSA9IHAtPnRtcF95ICsgaW8tPm1iX3c7CisgICAgICAgIHAtPnRtcF92ID0gcC0+dG1wX3UgKyB1dl93aWR0aDsKKyAgICAgICAgcC0+ZW1pdCA9IEVtaXRGYW5jeVJHQjsKKyAgICAgICAgV2ViUEluaXRVcHNhbXBsZXJzKCk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcC0+ZW1pdCA9IEVtaXRZVVY7CisgICAgfQorICAgIGlmIChpc19hbHBoYSkgeyAgLy8gbmVlZCB0cmFuc3BhcmVuY3kgb3V0cHV0CisgICAgICBwLT5lbWl0X2FscGhhID0KKyAgICAgICAgICAoY29sb3JzcGFjZSA9PSBNT0RFX1JHQkFfNDQ0NCB8fCBjb2xvcnNwYWNlID09IE1PREVfcmdiQV80NDQ0KSA/CisgICAgICAgICAgICAgIEVtaXRBbHBoYVJHQkE0NDQ0CisgICAgICAgICAgOiBpc19yZ2IgPyBFbWl0QWxwaGFSR0IKKyAgICAgICAgICA6IEVtaXRBbHBoYVlVVjsKKyAgICAgIGlmIChpc19yZ2IpIHsKKyAgICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaXNfcmdiKSB7CisgICAgVlA4WVVWSW5pdCgpOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEN1c3RvbVB1dChjb25zdCBWUDhJbyogaW8pIHsKKyAgV2ViUERlY1BhcmFtcyogY29uc3QgcCA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOworICBjb25zdCBpbnQgbWJfdyA9IGlvLT5tYl93OworICBjb25zdCBpbnQgbWJfaCA9IGlvLT5tYl9oOworICBpbnQgbnVtX2xpbmVzX291dDsKKyAgYXNzZXJ0KCEoaW8tPm1iX3kgJiAxKSk7CisKKyAgaWYgKG1iX3cgPD0gMCB8fCBtYl9oIDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBudW1fbGluZXNfb3V0ID0gcC0+ZW1pdChpbywgcCk7CisgIGlmIChwLT5lbWl0X2FscGhhICE9IE5VTEwpIHsKKyAgICBwLT5lbWl0X2FscGhhKGlvLCBwLCBudW1fbGluZXNfb3V0KTsKKyAgfQorICBwLT5sYXN0X3kgKz0gbnVtX2xpbmVzX291dDsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEN1c3RvbVRlYXJkb3duKGNvbnN0IFZQOElvKiBpbykgeworICBXZWJQRGVjUGFyYW1zKiBjb25zdCBwID0gKFdlYlBEZWNQYXJhbXMqKWlvLT5vcGFxdWU7CisgIFdlYlBTYWZlRnJlZShwLT5tZW1vcnkpOworICBwLT5tZW1vcnkgPSBOVUxMOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBwb2ludAorCit2b2lkIFdlYlBJbml0Q3VzdG9tSW8oV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW8tPnB1dCAgICAgID0gQ3VzdG9tUHV0OworICBpby0+c2V0dXAgICAgPSBDdXN0b21TZXR1cDsKKyAgaW8tPnRlYXJkb3duID0gQ3VzdG9tVGVhcmRvd247CisgIGlvLT5vcGFxdWUgICA9IHBhcmFtczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9xdWFudC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3F1YW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5YTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9xdWFudC5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUXVhbnRpemVyIGluaXRpYWxpemF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGkuaCIKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgTSkgeworICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IE0gPyBNIDogdjsKK30KKworLy8gUGFyYWdyYXBoIDE0LjEKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEY1RhYmxlWzEyOF0gPSB7CisgIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEwLAorICAxMSwgICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxNywKKyAgMTgsICAgMTksICAyMCwgIDIwLCAgMjEsICAyMSwgIDIyLCAgMjIsCisgIDIzLCAgIDIzLCAgMjQsICAyNSwgIDI1LCAgMjYsICAyNywgIDI4LAorICAyOSwgICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwKKyAgMzcsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLAorICA1MSwgICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwKKyAgNTksICAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsCisgIDY3LCAgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LAorICA3NSwgICA3NiwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwKKyAgODIsICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksCisgIDkxLCAgIDkzLCAgOTUsICA5NiwgIDk4LCAxMDAsIDEwMSwgMTAyLAorICAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwgMTE0LCAxMTYsIDExOCwKKyAgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAxMzYsCisgIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ4LCAxNTEsIDE1NCwgMTU3Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsCisgIDEyLCAgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LAorICAyMCwgICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywKKyAgMjgsICAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCisgIDM2LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAorICA0NCwgICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwKKyAgNTIsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNjAsCisgIDYyLCAgIDY0LCAgNjYsICA2OCwgIDcwLCAgNzIsICA3NCwgIDc2LAorICA3OCwgICA4MCwgIDgyLCAgODQsICA4NiwgIDg4LCAgOTAsICA5MiwKKyAgOTQsICAgOTYsICA5OCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsCisgIDExMCwgMTEyLCAxMTQsIDExNiwgMTE5LCAxMjIsIDEyNSwgMTI4LAorICAxMzEsIDEzNCwgMTM3LCAxNDAsIDE0MywgMTQ2LCAxNDksIDE1MiwKKyAgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsIDE3MCwgMTczLCAxNzcsCisgIDE4MSwgMTg1LCAxODksIDE5MywgMTk3LCAyMDEsIDIwNSwgMjA5LAorICAyMTMsIDIxNywgMjIxLCAyMjUsIDIyOSwgMjM0LCAyMzksIDI0NSwKKyAgMjQ5LCAyNTQsIDI1OSwgMjY0LCAyNjksIDI3NCwgMjc5LCAyODQKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhZ3JhcGggOS42CisKK3ZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3QgaW50IGJhc2VfcTAgPSBWUDhHZXRWYWx1ZShiciwgNyk7CisgIGNvbnN0IGludCBkcXkxX2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7CisgIGNvbnN0IGludCBkcXkyX2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7CisgIGNvbnN0IGludCBkcXkyX2FjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7CisgIGNvbnN0IGludCBkcXV2X2RjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7CisgIGNvbnN0IGludCBkcXV2X2FjID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA0KSA6IDA7CisKKyAgY29uc3QgVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+c2VnbWVudF9oZHJfOworICBpbnQgaTsKKworICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICBpbnQgcTsKKyAgICBpZiAoaGRyLT51c2Vfc2VnbWVudF8pIHsKKyAgICAgIHEgPSBoZHItPnF1YW50aXplcl9baV07CisgICAgICBpZiAoIWhkci0+YWJzb2x1dGVfZGVsdGFfKSB7CisgICAgICAgIHEgKz0gYmFzZV9xMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIGRlYy0+ZHFtX1tpXSA9IGRlYy0+ZHFtX1swXTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBxID0gYmFzZV9xMDsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgVlA4UXVhbnRNYXRyaXgqIGNvbnN0IG0gPSAmZGVjLT5kcW1fW2ldOworICAgICAgbS0+eTFfbWF0X1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGRxeTFfZGMsIDEyNyldOworICAgICAgbS0+eTFfbWF0X1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIDAsICAgICAgIDEyNyldOworCisgICAgICBtLT55Ml9tYXRfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZHF5Ml9kYywgMTI3KV0gKiAyOworICAgICAgLy8gRm9yIGFsbCB4IGluIFswLi4yODRdLCB4KjE1NS8xMDAgaXMgYml0d2lzZSBlcXVhbCB0byAoeCoxMDE1ODEpID4+IDE2LgorICAgICAgLy8gVGhlIHNtYWxsZXN0IHByZWNpc2lvbiBmb3IgdGhhdCBpcyAnKHgqNjM0OSkgPj4gMTInIGJ1dCAxNiBpcyBhIGdvb2QKKyAgICAgIC8vIHdvcmQgc2l6ZS4KKyAgICAgIG0tPnkyX21hdF9bMV0gPSAoa0FjVGFibGVbY2xpcChxICsgZHF5Ml9hYywgMTI3KV0gKiAxMDE1ODEpID4+IDE2OworICAgICAgaWYgKG0tPnkyX21hdF9bMV0gPCA4KSBtLT55Ml9tYXRfWzFdID0gODsKKworICAgICAgbS0+dXZfbWF0X1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGRxdXZfZGMsIDExNyldOworICAgICAgbS0+dXZfbWF0X1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGRxdXZfYWMsIDEyNyldOworCisgICAgICBtLT51dl9xdWFudF8gPSBxICsgZHF1dl9hYzsgICAvLyBmb3IgZGl0aGVyaW5nIHN0cmVuZ3RoIGV2YWx1YXRpb24KKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3RyZWUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzYTNmMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy90cmVlLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb2RpbmcgdHJlZXMgYW5kIHByb2JhcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfcmVhZGVyX2lubC5oIgorCisjZGVmaW5lIFVTRV9HRU5FUklDX1RSRUUKKworI2lmZGVmIFVTRV9HRU5FUklDX1RSRUUKK3N0YXRpYyBjb25zdCBpbnQ4X3Qga1lNb2Rlc0ludHJhNFsxOF0gPSB7CisgIC1CX0RDX1BSRUQsIDEsCisgICAgLUJfVE1fUFJFRCwgMiwKKyAgICAgIC1CX1ZFX1BSRUQsIDMsCisgICAgICAgIDQsIDYsCisgICAgICAgICAgLUJfSEVfUFJFRCwgNSwKKyAgICAgICAgICAgIC1CX1JEX1BSRUQsIC1CX1ZSX1BSRUQsCisgICAgICAgIC1CX0xEX1BSRUQsIDcsCisgICAgICAgICAgLUJfVkxfUFJFRCwgOCwKKyAgICAgICAgICAgIC1CX0hEX1BSRUQsIC1CX0hVX1BSRUQKK307CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmF1bHQgcHJvYmFiaWxpdGllcworCisvLyBQYXJhZ3JhcGggMTMuNQorc3RhdGljIGNvbnN0IHVpbnQ4X3QKKyAgQ29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKKyAgeyB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDI1MywgMTM2LCAyNTQsIDI1NSwgMjI4LCAyMTksIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4OSwgMTI5LCAyNDIsIDI1NSwgMjI3LCAyMTMsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEwNiwgMTI2LCAyMjcsIDI1MiwgMjE0LCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA5OCwgMjQ4LCAyNTUsIDIzNiwgMjI2LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxODEsIDEzMywgMjM4LCAyNTQsIDIyMSwgMjM0LCAyNTUsIDE1NCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA3OCwgMTM0LCAyMDIsIDI0NywgMTk4LCAxODAsIDI1NSwgMjE5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgfSwKKyAgICB7IHsgMSwgMTg1LCAyNDksIDI1NSwgMjQzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4NCwgMTUwLCAyNDcsIDI1NSwgMjM2LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDc3LCAxMTAsIDIxNiwgMjU1LCAyMzYsIDIzMCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICB9LAorICAgIHsgeyAxLCAxMDEsIDI1MSwgMjU1LCAyNDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTcwLCAxMzksIDI0MSwgMjUyLCAyMzYsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMzcsIDExNiwgMTk2LCAyNDMsIDIyOCwgMjU1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMjA0LCAyNTQsIDI1NSwgMjQ1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwNywgMTYwLCAyNTAsIDI1NSwgMjM4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEwMiwgMTAzLCAyMzEsIDI1NSwgMjExLCAxNzEsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNTIsIDI1MiwgMjU1LCAyNDAsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTc3LCAxMzUsIDI0MywgMjU1LCAyMzQsIDIyNSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgODAsIDEyOSwgMjExLCAyNTUsIDE5NCwgMjI0LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyNDYsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMTk4LCAzNSwgMjM3LCAyMjMsIDE5MywgMTg3LCAxNjIsIDE2MCwgMTQ1LCAxNTUsIDYyIH0sCisgICAgICB7IDEzMSwgNDUsIDE5OCwgMjIxLCAxNzIsIDE3NiwgMjIwLCAxNTcsIDI1MiwgMjIxLCAxIH0sCisgICAgICB7IDY4LCA0NywgMTQ2LCAyMDgsIDE0OSwgMTY3LCAyMjEsIDE2MiwgMjU1LCAyMjMsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTQ5LCAyNDEsIDI1NSwgMjIxLCAyMjQsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4NCwgMTQxLCAyMzQsIDI1MywgMjIyLCAyMjAsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDgxLCA5OSwgMTgxLCAyNDIsIDE3NiwgMTkwLCAyNDksIDIwMiwgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTI5LCAyMzIsIDI1MywgMjE0LCAxOTcsIDI0MiwgMTk2LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDk5LCAxMjEsIDIxMCwgMjUwLCAyMDEsIDE5OCwgMjU1LCAyMDIsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjMsIDkxLCAxNjMsIDI0MiwgMTcwLCAxODcsIDI0NywgMjEwLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMDAsIDI0NiwgMjU1LCAyMzQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTA5LCAxNzgsIDI0MSwgMjU1LCAyMzEsIDI0NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDQsIDEzMCwgMjAxLCAyNTMsIDIwNSwgMTkyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTMyLCAyMzksIDI1MSwgMjE5LCAyMDksIDI1NSwgMTY1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDk0LCAxMzYsIDIyNSwgMjUxLCAyMTgsIDE5MCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjIsIDEwMCwgMTc0LCAyNDUsIDE4NiwgMTYxLCAyNTUsIDE5OSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTgyLCAyNDksIDI1NSwgMjMyLCAyMzUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyNCwgMTQzLCAyNDEsIDI1NSwgMjI3LCAyMzQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDM1LCA3NywgMTgxLCAyNTEsIDE5MywgMjExLCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTU3LCAyNDcsIDI1NSwgMjM2LCAyMzEsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyMSwgMTQxLCAyMzUsIDI1NSwgMjI1LCAyMjcsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDQ1LCA5OSwgMTg4LCAyNTEsIDE5NSwgMjE3LCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMSwgMjUxLCAyNTUsIDIxMywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMDMsIDEsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTM3LCAxLCAxNzcsIDI1NSwgMjI0LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDI1MywgOSwgMjQ4LCAyNTEsIDIwNywgMjA4LCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzUsIDEzLCAyMjQsIDI0MywgMTkzLCAxODUsIDI0OSwgMTk4LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDczLCAxNywgMTcxLCAyMjEsIDE2MSwgMTc5LCAyMzYsIDE2NywgMjU1LCAyMzQsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgOTUsIDI0NywgMjUzLCAyMTIsIDE4MywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjM5LCA5MCwgMjQ0LCAyNTAsIDIxMSwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNTUsIDc3LCAxOTUsIDI0OCwgMTg4LCAxOTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyNCwgMjM5LCAyNTEsIDIxOCwgMjE5LCAyNTUsIDIwNSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMDEsIDUxLCAyMTksIDI1NSwgMTk2LCAxODYsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDY5LCA0NiwgMTkwLCAyMzksIDIwMSwgMjE4LCAyNTUsIDIyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTkxLCAyNTEsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIyMywgMTY1LCAyNDksIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0MSwgMTI0LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNiwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxOTAsIDM2LCAyMzAsIDI1NSwgMjM2LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0OSwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMjI2LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NywgMTkyLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0MCwgMTI4LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMzQsIDI1MiwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjEzLCA2MiwgMjUwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA1NSwgOTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDIwMiwgMjQsIDIxMywgMjM1LCAxODYsIDE5MSwgMjIwLCAxNjAsIDI0MCwgMTc1LCAyNTUgfSwKKyAgICAgIHsgMTI2LCAzOCwgMTgyLCAyMzIsIDE2OSwgMTg0LCAyMjgsIDE3NCwgMjU1LCAxODcsIDEyOCB9LAorICAgICAgeyA2MSwgNDYsIDEzOCwgMjE5LCAxNTEsIDE3OCwgMjQwLCAxNzAsIDI1NSwgMjE2LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDExMiwgMjMwLCAyNTAsIDE5OSwgMTkxLCAyNDcsIDE1OSwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgeyAxNjYsIDEwOSwgMjI4LCAyNTIsIDIxMSwgMjE1LCAyNTUsIDE3NCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAzOSwgNzcsIDE2MiwgMjMyLCAxNzIsIDE4MCwgMjQ1LCAxNzgsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDUyLCAyMjAsIDI0NiwgMTk4LCAxOTksIDI0OSwgMjIwLCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDEyNCwgNzQsIDE5MSwgMjQzLCAxODMsIDE5MywgMjUwLCAyMjEsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgMjQsIDcxLCAxMzAsIDIxOSwgMTU0LCAxNzAsIDI0MywgMTgyLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxODIsIDIyNSwgMjQ5LCAyMTksIDI0MCwgMjU1LCAyMjQsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQ5LCAxNTAsIDIyNiwgMjUyLCAyMTYsIDIwNSwgMjU1LCAxNzEsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjgsIDEwOCwgMTcwLCAyNDIsIDE4MywgMTk0LCAyNTQsIDIyMywgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgODEsIDIzMCwgMjUyLCAyMDQsIDIwMywgMjU1LCAxOTIsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTIzLCAxMDIsIDIwOSwgMjQ3LCAxODgsIDE5NiwgMjU1LCAyMzMsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjAsIDk1LCAxNTMsIDI0MywgMTY0LCAxNzMsIDI1NSwgMjAzLCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMjIsIDI0OCwgMjU1LCAyMTYsIDIxMywgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTY4LCAxNzUsIDI0NiwgMjUyLCAyMzUsIDIwNSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDcsIDExNiwgMjE1LCAyNTUsIDIxMSwgMjEyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTIxLCAyMzYsIDI1MywgMjEyLCAyMTQsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE0MSwgODQsIDIxMywgMjUyLCAyMDEsIDIwMiwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDIsIDgwLCAxNjAsIDI0MCwgMTYyLCAxODUsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NCwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMzgsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfQorfTsKKworLy8gUGFyYWdyYXBoIDExLjUKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCTW9kZXNQcm9iYVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTIC0gMV0gPSB7CisgIHsgeyAyMzEsIDEyMCwgNDgsIDg5LCAxMTUsIDExMywgMTIwLCAxNTIsIDExMiB9LAorICAgIHsgMTUyLCAxNzksIDY0LCAxMjYsIDE3MCwgMTE4LCA0NiwgNzAsIDk1IH0sCisgICAgeyAxNzUsIDY5LCAxNDMsIDgwLCA4NSwgODIsIDcyLCAxNTUsIDEwMyB9LAorICAgIHsgNTYsIDU4LCAxMCwgMTcxLCAyMTgsIDE4OSwgMTcsIDEzLCAxNTIgfSwKKyAgICB7IDExNCwgMjYsIDE3LCAxNjMsIDQ0LCAxOTUsIDIxLCAxMCwgMTczIH0sCisgICAgeyAxMjEsIDI0LCA4MCwgMTk1LCAyNiwgNjIsIDQ0LCA2NCwgODUgfSwKKyAgICB7IDE0NCwgNzEsIDEwLCAzOCwgMTcxLCAyMTMsIDE0NCwgMzQsIDI2IH0sCisgICAgeyAxNzAsIDQ2LCA1NSwgMTksIDEzNiwgMTYwLCAzMywgMjA2LCA3MSB9LAorICAgIHsgNjMsIDIwLCA4LCAxMTQsIDExNCwgMjA4LCAxMiwgOSwgMjI2IH0sCisgICAgeyA4MSwgNDAsIDExLCA5NiwgMTgyLCA4NCwgMjksIDE2LCAzNiB9IH0sCisgIHsgeyAxMzQsIDE4MywgODksIDEzNywgOTgsIDEwMSwgMTA2LCAxNjUsIDE0OCB9LAorICAgIHsgNzIsIDE4NywgMTAwLCAxMzAsIDE1NywgMTExLCAzMiwgNzUsIDgwIH0sCisgICAgeyA2NiwgMTAyLCAxNjcsIDk5LCA3NCwgNjIsIDQwLCAyMzQsIDEyOCB9LAorICAgIHsgNDEsIDUzLCA5LCAxNzgsIDI0MSwgMTQxLCAyNiwgOCwgMTA3IH0sCisgICAgeyA3NCwgNDMsIDI2LCAxNDYsIDczLCAxNjYsIDQ5LCAyMywgMTU3IH0sCisgICAgeyA2NSwgMzgsIDEwNSwgMTYwLCA1MSwgNTIsIDMxLCAxMTUsIDEyOCB9LAorICAgIHsgMTA0LCA3OSwgMTIsIDI3LCAyMTcsIDI1NSwgODcsIDE3LCA3IH0sCisgICAgeyA4NywgNjgsIDcxLCA0NCwgMTE0LCA1MSwgMTUsIDE4NiwgMjMgfSwKKyAgICB7IDQ3LCA0MSwgMTQsIDExMCwgMTgyLCAxODMsIDIxLCAxNywgMTk0IH0sCisgICAgeyA2NiwgNDUsIDI1LCAxMDIsIDE5NywgMTg5LCAyMywgMTgsIDIyIH0gfSwKKyAgeyB7IDg4LCA4OCwgMTQ3LCAxNTAsIDQyLCA0NiwgNDUsIDE5NiwgMjA1IH0sCisgICAgeyA0MywgOTcsIDE4MywgMTE3LCA4NSwgMzgsIDM1LCAxNzksIDYxIH0sCisgICAgeyAzOSwgNTMsIDIwMCwgODcsIDI2LCAyMSwgNDMsIDIzMiwgMTcxIH0sCisgICAgeyA1NiwgMzQsIDUxLCAxMDQsIDExNCwgMTAyLCAyOSwgOTMsIDc3IH0sCisgICAgeyAzOSwgMjgsIDg1LCAxNzEsIDU4LCAxNjUsIDkwLCA5OCwgNjQgfSwKKyAgICB7IDM0LCAyMiwgMTE2LCAyMDYsIDIzLCAzNCwgNDMsIDE2NiwgNzMgfSwKKyAgICB7IDEwNywgNTQsIDMyLCAyNiwgNTEsIDEsIDgxLCA0MywgMzEgfSwKKyAgICB7IDY4LCAyNSwgMTA2LCAyMiwgNjQsIDE3MSwgMzYsIDIyNSwgMTE0IH0sCisgICAgeyAzNCwgMTksIDIxLCAxMDIsIDEzMiwgMTg4LCAxNiwgNzYsIDEyNCB9LAorICAgIHsgNjIsIDE4LCA3OCwgOTUsIDg1LCA1NywgNTAsIDQ4LCA1MSB9IH0sCisgIHsgeyAxOTMsIDEwMSwgMzUsIDE1OSwgMjE1LCAxMTEsIDg5LCA0NiwgMTExIH0sCisgICAgeyA2MCwgMTQ4LCAzMSwgMTcyLCAyMTksIDIyOCwgMjEsIDE4LCAxMTEgfSwKKyAgICB7IDExMiwgMTEzLCA3NywgODUsIDE3OSwgMjU1LCAzOCwgMTIwLCAxMTQgfSwKKyAgICB7IDQwLCA0MiwgMSwgMTk2LCAyNDUsIDIwOSwgMTAsIDI1LCAxMDkgfSwKKyAgICB7IDg4LCA0MywgMjksIDE0MCwgMTY2LCAyMTMsIDM3LCA0MywgMTU0IH0sCisgICAgeyA2MSwgNjMsIDMwLCAxNTUsIDY3LCA0NSwgNjgsIDEsIDIwOSB9LAorICAgIHsgMTAwLCA4MCwgOCwgNDMsIDE1NCwgMSwgNTEsIDI2LCA3MSB9LAorICAgIHsgMTQyLCA3OCwgNzgsIDE2LCAyNTUsIDEyOCwgMzQsIDE5NywgMTcxIH0sCisgICAgeyA0MSwgNDAsIDUsIDEwMiwgMjExLCAxODMsIDQsIDEsIDIyMSB9LAorICAgIHsgNTEsIDUwLCAxNywgMTY4LCAyMDksIDE5MiwgMjMsIDI1LCA4MiB9IH0sCisgIHsgeyAxMzgsIDMxLCAzNiwgMTcxLCAyNywgMTY2LCAzOCwgNDQsIDIyOSB9LAorICAgIHsgNjcsIDg3LCA1OCwgMTY5LCA4MiwgMTE1LCAyNiwgNTksIDE3OSB9LAorICAgIHsgNjMsIDU5LCA5MCwgMTgwLCA1OSwgMTY2LCA5MywgNzMsIDE1NCB9LAorICAgIHsgNDAsIDQwLCAyMSwgMTE2LCAxNDMsIDIwOSwgMzQsIDM5LCAxNzUgfSwKKyAgICB7IDQ3LCAxNSwgMTYsIDE4MywgMzQsIDIyMywgNDksIDQ1LCAxODMgfSwKKyAgICB7IDQ2LCAxNywgMzMsIDE4MywgNiwgOTgsIDE1LCAzMiwgMTgzIH0sCisgICAgeyA1NywgNDYsIDIyLCAyNCwgMTI4LCAxLCA1NCwgMTcsIDM3IH0sCisgICAgeyA2NSwgMzIsIDczLCAxMTUsIDI4LCAxMjgsIDIzLCAxMjgsIDIwNSB9LAorICAgIHsgNDAsIDMsIDksIDExNSwgNTEsIDE5MiwgMTgsIDYsIDIyMyB9LAorICAgIHsgODcsIDM3LCA5LCAxMTUsIDU5LCA3NywgNjQsIDIxLCA0NyB9IH0sCisgIHsgeyAxMDQsIDU1LCA0NCwgMjE4LCA5LCA1NCwgNTMsIDEzMCwgMjI2IH0sCisgICAgeyA2NCwgOTAsIDcwLCAyMDUsIDQwLCA0MSwgMjMsIDI2LCA1NyB9LAorICAgIHsgNTQsIDU3LCAxMTIsIDE4NCwgNSwgNDEsIDM4LCAxNjYsIDIxMyB9LAorICAgIHsgMzAsIDM0LCAyNiwgMTMzLCAxNTIsIDExNiwgMTAsIDMyLCAxMzQgfSwKKyAgICB7IDM5LCAxOSwgNTMsIDIyMSwgMjYsIDExNCwgMzIsIDczLCAyNTUgfSwKKyAgICB7IDMxLCA5LCA2NSwgMjM0LCAyLCAxNSwgMSwgMTE4LCA3MyB9LAorICAgIHsgNzUsIDMyLCAxMiwgNTEsIDE5MiwgMjU1LCAxNjAsIDQzLCA1MSB9LAorICAgIHsgODgsIDMxLCAzNSwgNjcsIDEwMiwgODUsIDU1LCAxODYsIDg1IH0sCisgICAgeyA1NiwgMjEsIDIzLCAxMTEsIDU5LCAyMDUsIDQ1LCAzNywgMTkyIH0sCisgICAgeyA1NSwgMzgsIDcwLCAxMjQsIDczLCAxMDIsIDEsIDM0LCA5OCB9IH0sCisgIHsgeyAxMjUsIDk4LCA0MiwgODgsIDEwNCwgODUsIDExNywgMTc1LCA4MiB9LAorICAgIHsgOTUsIDg0LCA1MywgODksIDEyOCwgMTAwLCAxMTMsIDEwMSwgNDUgfSwKKyAgICB7IDc1LCA3OSwgMTIzLCA0NywgNTEsIDEyOCwgODEsIDE3MSwgMSB9LAorICAgIHsgNTcsIDE3LCA1LCA3MSwgMTAyLCA1NywgNTMsIDQxLCA0OSB9LAorICAgIHsgMzgsIDMzLCAxMywgMTIxLCA1NywgNzMsIDI2LCAxLCA4NSB9LAorICAgIHsgNDEsIDEwLCA2NywgMTM4LCA3NywgMTEwLCA5MCwgNDcsIDExNCB9LAorICAgIHsgMTE1LCAyMSwgMiwgMTAsIDEwMiwgMjU1LCAxNjYsIDIzLCA2IH0sCisgICAgeyAxMDEsIDI5LCAxNiwgMTAsIDg1LCAxMjgsIDEwMSwgMTk2LCAyNiB9LAorICAgIHsgNTcsIDE4LCAxMCwgMTAyLCAxMDIsIDIxMywgMzQsIDIwLCA0MyB9LAorICAgIHsgMTE3LCAyMCwgMTUsIDM2LCAxNjMsIDEyOCwgNjgsIDEsIDI2IH0gfSwKKyAgeyB7IDEwMiwgNjEsIDcxLCAzNywgMzQsIDUzLCAzMSwgMjQzLCAxOTIgfSwKKyAgICB7IDY5LCA2MCwgNzEsIDM4LCA3MywgMTE5LCAyOCwgMjIyLCAzNyB9LAorICAgIHsgNjgsIDQ1LCAxMjgsIDM0LCAxLCA0NywgMTEsIDI0NSwgMTcxIH0sCisgICAgeyA2MiwgMTcsIDE5LCA3MCwgMTQ2LCA4NSwgNTUsIDYyLCA3MCB9LAorICAgIHsgMzcsIDQzLCAzNywgMTU0LCAxMDAsIDE2MywgODUsIDE2MCwgMSB9LAorICAgIHsgNjMsIDksIDkyLCAxMzYsIDI4LCA2NCwgMzIsIDIwMSwgODUgfSwKKyAgICB7IDc1LCAxNSwgOSwgOSwgNjQsIDI1NSwgMTg0LCAxMTksIDE2IH0sCisgICAgeyA4NiwgNiwgMjgsIDUsIDY0LCAyNTUsIDI1LCAyNDgsIDEgfSwKKyAgICB7IDU2LCA4LCAxNywgMTMyLCAxMzcsIDI1NSwgNTUsIDExNiwgMTI4IH0sCisgICAgeyA1OCwgMTUsIDIwLCA4MiwgMTM1LCA1NywgMjYsIDEyMSwgNDAgfSB9LAorICB7IHsgMTY0LCA1MCwgMzEsIDEzNywgMTU0LCAxMzMsIDI1LCAzNSwgMjE4IH0sCisgICAgeyA1MSwgMTAzLCA0NCwgMTMxLCAxMzEsIDEyMywgMzEsIDYsIDE1OCB9LAorICAgIHsgODYsIDQwLCA2NCwgMTM1LCAxNDgsIDIyNCwgNDUsIDE4MywgMTI4IH0sCisgICAgeyAyMiwgMjYsIDE3LCAxMzEsIDI0MCwgMTU0LCAxNCwgMSwgMjA5IH0sCisgICAgeyA0NSwgMTYsIDIxLCA5MSwgNjQsIDIyMiwgNywgMSwgMTk3IH0sCisgICAgeyA1NiwgMjEsIDM5LCAxNTUsIDYwLCAxMzgsIDIzLCAxMDIsIDIxMyB9LAorICAgIHsgODMsIDEyLCAxMywgNTQsIDE5MiwgMjU1LCA2OCwgNDcsIDI4IH0sCisgICAgeyA4NSwgMjYsIDg1LCA4NSwgMTI4LCAxMjgsIDMyLCAxNDYsIDE3MSB9LAorICAgIHsgMTgsIDExLCA3LCA2MywgMTQ0LCAxNzEsIDQsIDQsIDI0NiB9LAorICAgIHsgMzUsIDI3LCAxMCwgMTQ2LCAxNzQsIDE3MSwgMTIsIDI2LCAxMjggfSB9LAorICB7IHsgMTkwLCA4MCwgMzUsIDk5LCAxODAsIDgwLCAxMjYsIDU0LCA0NSB9LAorICAgIHsgODUsIDEyNiwgNDcsIDg3LCAxNzYsIDUxLCA0MSwgMjAsIDMyIH0sCisgICAgeyAxMDEsIDc1LCAxMjgsIDEzOSwgMTE4LCAxNDYsIDExNiwgMTI4LCA4NSB9LAorICAgIHsgNTYsIDQxLCAxNSwgMTc2LCAyMzYsIDg1LCAzNywgOSwgNjIgfSwKKyAgICB7IDcxLCAzMCwgMTcsIDExOSwgMTE4LCAyNTUsIDE3LCAxOCwgMTM4IH0sCisgICAgeyAxMDEsIDM4LCA2MCwgMTM4LCA1NSwgNzAsIDQzLCAyNiwgMTQyIH0sCisgICAgeyAxNDYsIDM2LCAxOSwgMzAsIDE3MSwgMjU1LCA5NywgMjcsIDIwIH0sCisgICAgeyAxMzgsIDQ1LCA2MSwgNjIsIDIxOSwgMSwgODEsIDE4OCwgNjQgfSwKKyAgICB7IDMyLCA0MSwgMjAsIDExNywgMTUxLCAxNDIsIDIwLCAyMSwgMTYzIH0sCisgICAgeyAxMTIsIDE5LCAxMiwgNjEsIDE5NSwgMTI4LCA0OCwgNCwgMjQgfSB9Cit9OworCit2b2lkIFZQOFJlc2V0UHJvYmEoVlA4UHJvYmEqIGNvbnN0IHByb2JhKSB7CisgIG1lbXNldChwcm9iYS0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmEtPnNlZ21lbnRzXykpOworICAvLyBwcm9iYS0+YmFuZHNfW11bXSBpcyBpbml0aWFsaXplZCBsYXRlcgorfQorCitzdGF0aWMgdm9pZCBQYXJzZUludHJhTW9kZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RGVjb2RlciogY29uc3QgZGVjLCBpbnQgbWJfeCkgeworICB1aW50OF90KiBjb25zdCB0b3AgPSBkZWMtPmludHJhX3RfICsgNCAqIG1iX3g7CisgIHVpbnQ4X3QqIGNvbnN0IGxlZnQgPSBkZWMtPmludHJhX2xfOworICBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gZGVjLT5tYl9kYXRhXyArIG1iX3g7CisKKyAgLy8gTm90ZTogd2UgZG9uJ3Qgc2F2ZSBzZWdtZW50IG1hcCAoeWV0KSwgYXMgd2UgZG9uJ3QgZXhwZWN0CisgIC8vIHRvIGRlY29kZSBtb3JlIHRoYW4gMSBrZXlmcmFtZS4KKyAgaWYgKGRlYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfKSB7CisgICAgLy8gSGFyZGNvZGVkIHRyZWUgcGFyc2luZworICAgIGJsb2NrLT5zZWdtZW50XyA9ICFWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1swXSkKKyAgICAgICAgICAgICAgICAgICAgPyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1sxXSkKKyAgICAgICAgICAgICAgICAgICAgOiAyICsgVlA4R2V0Qml0KGJyLCBkZWMtPnByb2JhXy5zZWdtZW50c19bMl0pOworICB9IGVsc2UgeworICAgIGJsb2NrLT5zZWdtZW50XyA9IDA7ICAvLyBkZWZhdWx0IGZvciBpbnRyYQorICB9CisgIGlmIChkZWMtPnVzZV9za2lwX3Byb2JhXykgYmxvY2stPnNraXBfID0gVlA4R2V0Qml0KGJyLCBkZWMtPnNraXBfcF8pOworCisgIGJsb2NrLT5pc19pNHg0XyA9ICFWUDhHZXRCaXQoYnIsIDE0NSk7ICAgLy8gZGVjaWRlIGZvciBCX1BSRUQgZmlyc3QKKyAgaWYgKCFibG9jay0+aXNfaTR4NF8pIHsKKyAgICAvLyBIYXJkY29kZWQgMTZ4MTYgaW50cmEtbW9kZSBkZWNpc2lvbiB0cmVlLgorICAgIGNvbnN0IGludCB5bW9kZSA9CisgICAgICAgIFZQOEdldEJpdChiciwgMTU2KSA/IChWUDhHZXRCaXQoYnIsIDEyOCkgPyBUTV9QUkVEIDogSF9QUkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoVlA4R2V0Qml0KGJyLCAxNjMpID8gVl9QUkVEIDogRENfUFJFRCk7CisgICAgYmxvY2stPmltb2Rlc19bMF0gPSB5bW9kZTsKKyAgICBtZW1zZXQodG9wLCB5bW9kZSwgNCAqIHNpemVvZigqdG9wKSk7CisgICAgbWVtc2V0KGxlZnQsIHltb2RlLCA0ICogc2l6ZW9mKCpsZWZ0KSk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogbW9kZXMgPSBibG9jay0+aW1vZGVzXzsKKyAgICBpbnQgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgICBpbnQgeW1vZGUgPSBsZWZ0W3ldOworICAgICAgaW50IHg7CisgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2IgPSBrQk1vZGVzUHJvYmFbdG9wW3hdXVt5bW9kZV07CisjaWZkZWYgVVNFX0dFTkVSSUNfVFJFRQorICAgICAgICAvLyBHZW5lcmljIHRyZWUtcGFyc2luZworICAgICAgICBpbnQgaSA9IGtZTW9kZXNJbnRyYTRbVlA4R2V0Qml0KGJyLCBwcm9iWzBdKV07CisgICAgICAgIHdoaWxlIChpID4gMCkgeworICAgICAgICAgIGkgPSBrWU1vZGVzSW50cmE0WzIgKiBpICsgVlA4R2V0Qml0KGJyLCBwcm9iW2ldKV07CisgICAgICAgIH0KKyAgICAgICAgeW1vZGUgPSAtaTsKKyNlbHNlCisgICAgICAgIC8vIEhhcmRjb2RlZCB0cmVlIHBhcnNpbmcKKyAgICAgICAgeW1vZGUgPSAhVlA4R2V0Qml0KGJyLCBwcm9iWzBdKSA/IEJfRENfUFJFRCA6CisgICAgICAgICAgICAgICAgICAhVlA4R2V0Qml0KGJyLCBwcm9iWzFdKSA/IEJfVE1fUFJFRCA6CisgICAgICAgICAgICAgICAgICAgICFWUDhHZXRCaXQoYnIsIHByb2JbMl0pID8gQl9WRV9QUkVEIDoKKyAgICAgICAgICAgICAgICAgICAgICAhVlA4R2V0Qml0KGJyLCBwcm9iWzNdKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls0XSkgPyBCX0hFX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls1XSkgPyBCX1JEX1BSRUQgOiBCX1ZSX1BSRUQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls2XSkgPyBCX0xEX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls3XSkgPyBCX1ZMX1BSRUQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICghVlA4R2V0Qml0KGJyLCBwcm9iWzhdKSA/IEJfSERfUFJFRCA6IEJfSFVfUFJFRCkpKTsKKyNlbmRpZiAgICAvLyBVU0VfR0VORVJJQ19UUkVFCisgICAgICAgIHRvcFt4XSA9IHltb2RlOworICAgICAgfQorICAgICAgbWVtY3B5KG1vZGVzLCB0b3AsIDQgKiBzaXplb2YoKnRvcCkpOworICAgICAgbW9kZXMgKz0gNDsKKyAgICAgIGxlZnRbeV0gPSB5bW9kZTsKKyAgICB9CisgIH0KKyAgLy8gSGFyZGNvZGVkIFVWTW9kZSBkZWNpc2lvbiB0cmVlCisgIGJsb2NrLT51dm1vZGVfID0gIVZQOEdldEJpdChiciwgMTQyKSA/IERDX1BSRUQKKyAgICAgICAgICAgICAgICAgOiAhVlA4R2V0Qml0KGJyLCAxMTQpID8gVl9QUkVECisgICAgICAgICAgICAgICAgIDogVlA4R2V0Qml0KGJyLCAxODMpID8gVE1fUFJFRCA6IEhfUFJFRDsKK30KKworaW50IFZQOFBhcnNlSW50cmFNb2RlUm93KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgbWJfeDsKKyAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGRlYy0+bWJfd187ICsrbWJfeCkgeworICAgIFBhcnNlSW50cmFNb2RlKGJyLCBkZWMsIG1iX3gpOworICB9CisgIHJldHVybiAhZGVjLT5icl8uZW9mXzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCAxMworCitzdGF0aWMgY29uc3QgdWludDhfdAorICAgIENvZWZmc1VwZGF0ZVByb2JhW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKKyAgeyB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDE3NiwgMjQ2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIyMywgMjQxLCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OSwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI0NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNDYsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM5LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ4LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTEsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1MywgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUwLCAyNTUsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDIxNywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIyNSwgMjUyLCAyNDEsIDI1MywgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzNCwgMjUwLCAyNDEsIDI1MCwgMjUzLCAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMjMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzgsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNDgsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ5LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0NywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9LAorICB7IHsgeyAxODYsIDI1MSwgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzQsIDI1MSwgMjQ0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTEsIDI1MSwgMjQzLCAyNTMsIDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM2LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTMsIDI1MywgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjQ4LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUwLCAyNTQsIDI1MiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ4LCAyNTQsIDI0OSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0NiwgMjUzLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MiwgMjU0LCAyNTEsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDgsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTMsIDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ1LCAyNTEsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUxLCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDksIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUwLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9CisgIH0KK307CisKKy8vIFBhcmFncmFwaCA5LjkKKworc3RhdGljIGNvbnN0IGludCBrQmFuZHNbMTYgKyAxXSA9IHsKKyAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKKyAgMCAgLy8gZXh0cmEgZW50cnkgYXMgc2VudGluZWwKK307CisKK3ZvaWQgVlA4UGFyc2VQcm9iYShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmRlYy0+cHJvYmFfOworICBpbnQgdCwgYiwgYywgcDsKKyAgZm9yICh0ID0gMDsgdCA8IE5VTV9UWVBFUzsgKyt0KSB7CisgICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKKyAgICAgICAgICBjb25zdCBpbnQgdiA9IFZQOEdldEJpdChiciwgQ29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF0pID8KKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOEdldFZhbHVlKGJyLCA4KSA6IENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXTsKKyAgICAgICAgICBwcm9iYS0+YmFuZHNfW3RdW2JdLnByb2Jhc19bY11bcF0gPSB2OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvciAoYiA9IDA7IGIgPCAxNiArIDE7ICsrYikgeworICAgICAgcHJvYmEtPmJhbmRzX3B0cl9bdF1bYl0gPSAmcHJvYmEtPmJhbmRzX1t0XVtrQmFuZHNbYl1dOworICAgIH0KKyAgfQorICBkZWMtPnVzZV9za2lwX3Byb2JhXyA9IFZQOEdldChicik7CisgIGlmIChkZWMtPnVzZV9za2lwX3Byb2JhXykgeworICAgIGRlYy0+c2tpcF9wXyA9IFZQOEdldFZhbHVlKGJyLCA4KTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlNDBkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDguYwpAQCAtMCwwICsxLDY2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvYWxwaGFpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGxpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXJfaW5sLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChERUNfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKERFQ19NSU5fVkVSU0lPTiA8PCA4KSB8IERFQ19SRVZfVkVSU0lPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOERlY29kZXIKKworc3RhdGljIHZvaWQgU2V0T2soVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT0s7CisgIGRlYy0+ZXJyb3JfbXNnXyA9ICJPSyI7Cit9CisKK2ludCBWUDhJbml0SW9JbnRlcm5hbChWUDhJbyogY29uc3QgaW8sIGludCB2ZXJzaW9uKSB7CisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOyAgLy8gbWlzbWF0Y2ggZXJyb3IKKyAgfQorICBpZiAoaW8gIT0gTlVMTCkgeworICAgIG1lbXNldChpbywgMCwgc2l6ZW9mKCppbykpOworICB9CisgIHJldHVybiAxOworfQorCitWUDhEZWNvZGVyKiBWUDhOZXcodm9pZCkgeworICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgU2V0T2soZGVjKTsKKyAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkluaXQoJmRlYy0+d29ya2VyXyk7CisgICAgZGVjLT5yZWFkeV8gPSAwOworICAgIGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPSAwOworICB9CisgIHJldHVybiBkZWM7Cit9CisKK1ZQOFN0YXR1c0NvZGUgVlA4U3RhdHVzKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoIWRlYykgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgcmV0dXJuIGRlYy0+c3RhdHVzXzsKK30KKworY29uc3QgY2hhciogVlA4U3RhdHVzTWVzc2FnZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gIm5vIG9iamVjdCI7CisgIGlmICghZGVjLT5lcnJvcl9tc2dfKSByZXR1cm4gIk9LIjsKKyAgcmV0dXJuIGRlYy0+ZXJyb3JfbXNnXzsKK30KKwordm9pZCBWUDhEZWxldGUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFZQOENsZWFyKGRlYyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KKworaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpIHsKKyAgLy8gVGhlIG9sZGVzdCBlcnJvciByZXBvcnRlZCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG5ldyBvbmUuCisgIGlmIChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19PSykgeworICAgIGRlYy0+c3RhdHVzXyA9IGVycm9yOworICAgIGRlYy0+ZXJyb3JfbXNnXyA9IG1zZzsKKyAgICBkZWMtPnJlYWR5XyA9IDA7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIHJldHVybiAoZGF0YV9zaXplID49IDMgJiYKKyAgICAgICAgICBkYXRhWzBdID09IDB4OWQgJiYgZGF0YVsxXSA9PSAweDAxICYmIGRhdGFbMl0gPT0gMHgyYSk7Cit9CisKK2ludCBWUDhHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHNpemVfdCBjaHVua19zaXplLAorICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQpIHsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBWUDhfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKKyAgfQorICAvLyBjaGVjayBzaWduYXR1cmUKKyAgaWYgKCFWUDhDaGVja1NpZ25hdHVyZShkYXRhICsgMywgZGF0YV9zaXplIC0gMykpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBXcm9uZyBzaWduYXR1cmUuCisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgYml0cyA9IGRhdGFbMF0gfCAoZGF0YVsxXSA8PCA4KSB8IChkYXRhWzJdIDw8IDE2KTsKKyAgICBjb25zdCBpbnQga2V5X2ZyYW1lID0gIShiaXRzICYgMSk7CisgICAgY29uc3QgaW50IHcgPSAoKGRhdGFbN10gPDwgOCkgfCBkYXRhWzZdKSAmIDB4M2ZmZjsKKyAgICBjb25zdCBpbnQgaCA9ICgoZGF0YVs5XSA8PCA4KSB8IGRhdGFbOF0pICYgMHgzZmZmOworCisgICAgaWYgKCFrZXlfZnJhbWUpIHsgICAvLyBOb3QgYSBrZXlmcmFtZS4KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICgoKGJpdHMgPj4gMSkgJiA3KSA+IDMpIHsKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIHVua25vd24gcHJvZmlsZQorICAgIH0KKyAgICBpZiAoISgoYml0cyA+PiA0KSAmIDEpKSB7CisgICAgICByZXR1cm4gMDsgICAgICAgICAvLyBmaXJzdCBmcmFtZSBpcyBpbnZpc2libGUhCisgICAgfQorICAgIGlmICgoKGJpdHMgPj4gNSkpID49IGNodW5rX3NpemUpIHsgIC8vIHBhcnRpdGlvbl9sZW5ndGgKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIGluY29uc2lzdGVudCBzaXplIGluZm9ybWF0aW9uLgorICAgIH0KKyAgICBpZiAodyA9PSAwIHx8IGggPT0gMCkgeworICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBib3RoIHdpZHRoIGFuZCBoZWlnaHQgdG8gYmUgemVyby4KKyAgICB9CisKKyAgICBpZiAod2lkdGgpIHsKKyAgICAgICp3aWR0aCA9IHc7CisgICAgfQorICAgIGlmIChoZWlnaHQpIHsKKyAgICAgICpoZWlnaHQgPSBoOworICAgIH0KKworICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXIgcGFyc2luZworCitzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyKSB7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisgIGhkci0+dXNlX3NlZ21lbnRfID0gMDsKKyAgaGRyLT51cGRhdGVfbWFwXyA9IDA7CisgIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gMTsKKyAgbWVtc2V0KGhkci0+cXVhbnRpemVyXywgMCwgc2l6ZW9mKGhkci0+cXVhbnRpemVyXykpOworICBtZW1zZXQoaGRyLT5maWx0ZXJfc3RyZW5ndGhfLCAwLCBzaXplb2YoaGRyLT5maWx0ZXJfc3RyZW5ndGhfKSk7Cit9CisKKy8vIFBhcmFncmFwaCA5LjMKK3N0YXRpYyBpbnQgUGFyc2VTZWdtZW50SGVhZGVyKFZQOEJpdFJlYWRlciogYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhTZWdtZW50SGVhZGVyKiBoZHIsIFZQOFByb2JhKiBwcm9iYSkgeworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisgIGhkci0+dXNlX3NlZ21lbnRfID0gVlA4R2V0KGJyKTsKKyAgaWYgKGhkci0+dXNlX3NlZ21lbnRfKSB7CisgICAgaGRyLT51cGRhdGVfbWFwXyA9IFZQOEdldChicik7CisgICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgZGF0YQorICAgICAgaW50IHM7CisgICAgICBoZHItPmFic29sdXRlX2RlbHRhXyA9IFZQOEdldChicik7CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgaGRyLT5xdWFudGl6ZXJfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA3KSA6IDA7CisgICAgICB9CisgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgaGRyLT5maWx0ZXJfc3RyZW5ndGhfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KSA6IDA7CisgICAgICB9CisgICAgfQorICAgIGlmIChoZHItPnVwZGF0ZV9tYXBfKSB7CisgICAgICBpbnQgczsKKyAgICAgIGZvciAocyA9IDA7IHMgPCBNQl9GRUFUVVJFX1RSRUVfUFJPQlM7ICsrcykgeworICAgICAgICBwcm9iYS0+c2VnbWVudHNfW3NdID0gVlA4R2V0KGJyKSA/IFZQOEdldFZhbHVlKGJyLCA4KSA6IDI1NXU7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGhkci0+dXBkYXRlX21hcF8gPSAwOworICB9CisgIHJldHVybiAhYnItPmVvZl87Cit9CisKKy8vIFBhcmFncmFwaCA5LjUKKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBWUDhfU1RBVFVTX1NVU1BFTkRFRCBpZiB3ZSBkb24ndCBoYXZlIGFsbCB0aGUKKy8vIG5lY2Vzc2FyeSBkYXRhIGluICdidWYnLgorLy8gVGhpcyBjYXNlIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBlcnJvciAoZm9yIGluY3JlbWVudGFsIGRlY29kaW5nKS4KKy8vIFN0aWxsLCBubyBiaXRyZWFkZXIgaXMgZXZlciBpbml0aWFsaXplZCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlYWQKKy8vIHVuYXZhaWxhYmxlIG1lbW9yeS4KKy8vIElmIHdlIGRvbid0IGV2ZW4gaGF2ZSB0aGUgcGFydGl0aW9ucycgc2l6ZXMsIHRoYW4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEKKy8vIGlzIHJldHVybmVkLCBhbmQgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorLy8gSWYgdGhlIHBhcnRpdGlvbnMgd2VyZSBwb3NpdGlvbmVkIG9rLCBWUDhfU1RBVFVTX09LIGlzIHJldHVybmVkLgorc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VQYXJ0aXRpb25zKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBzaXplKSB7CisgIFZQOEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIGNvbnN0IHVpbnQ4X3QqIHN6ID0gYnVmOworICBjb25zdCB1aW50OF90KiBidWZfZW5kID0gYnVmICsgc2l6ZTsKKyAgY29uc3QgdWludDhfdCogcGFydF9zdGFydDsKKyAgc2l6ZV90IHNpemVfbGVmdCA9IHNpemU7CisgIHNpemVfdCBsYXN0X3BhcnQ7CisgIHNpemVfdCBwOworCisgIGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPSAoMSA8PCBWUDhHZXRWYWx1ZShiciwgMikpIC0gMTsKKyAgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfbWludXNfb25lXzsKKyAgaWYgKHNpemUgPCAzICogbGFzdF9wYXJ0KSB7CisgICAgLy8gd2UgY2FuJ3QgZXZlbiByZWFkIHRoZSBzaXplcyB3aXRoIHN6W10hIFRoYXQncyBhIGZhaWx1cmUuCisgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICB9CisgIHBhcnRfc3RhcnQgPSBidWYgKyBsYXN0X3BhcnQgKiAzOworICBzaXplX2xlZnQgLT0gbGFzdF9wYXJ0ICogMzsKKyAgZm9yIChwID0gMDsgcCA8IGxhc3RfcGFydDsgKytwKSB7CisgICAgc2l6ZV90IHBzaXplID0gc3pbMF0gfCAoc3pbMV0gPDwgOCkgfCAoc3pbMl0gPDwgMTYpOworICAgIGlmIChwc2l6ZSA+IHNpemVfbGVmdCkgcHNpemUgPSBzaXplX2xlZnQ7CisgICAgVlA4SW5pdEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIHBhcnRfc3RhcnQsIHBzaXplKTsKKyAgICBwYXJ0X3N0YXJ0ICs9IHBzaXplOworICAgIHNpemVfbGVmdCAtPSBwc2l6ZTsKKyAgICBzeiArPSAzOworICB9CisgIFZQOEluaXRCaXRSZWFkZXIoZGVjLT5wYXJ0c18gKyBsYXN0X3BhcnQsIHBhcnRfc3RhcnQsIHNpemVfbGVmdCk7CisgIHJldHVybiAocGFydF9zdGFydCA8IGJ1Zl9lbmQpID8gVlA4X1NUQVRVU19PSyA6CisgICAgICAgICAgIFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgIC8vIEluaXQgaXMgb2ssIGJ1dCB0aGVyZSdzIG5vdCBlbm91Z2ggZGF0YQorfQorCisvLyBQYXJhZ3JhcGggOS40CitzdGF0aWMgaW50IFBhcnNlRmlsdGVySGVhZGVyKFZQOEJpdFJlYWRlciogYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZkZWMtPmZpbHRlcl9oZHJfOworICBoZHItPnNpbXBsZV8gICAgPSBWUDhHZXQoYnIpOworICBoZHItPmxldmVsXyAgICAgPSBWUDhHZXRWYWx1ZShiciwgNik7CisgIGhkci0+c2hhcnBuZXNzXyA9IFZQOEdldFZhbHVlKGJyLCAzKTsKKyAgaGRyLT51c2VfbGZfZGVsdGFfID0gVlA4R2V0KGJyKTsKKyAgaWYgKGhkci0+dXNlX2xmX2RlbHRhXykgeworICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIGxmLWRlbHRhPworICAgICAgaW50IGk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1JFRl9MRl9ERUxUQVM7ICsraSkgeworICAgICAgICBpZiAoVlA4R2V0KGJyKSkgeworICAgICAgICAgIGhkci0+cmVmX2xmX2RlbHRhX1tpXSA9IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9NT0RFX0xGX0RFTFRBUzsgKytpKSB7CisgICAgICAgIGlmIChWUDhHZXQoYnIpKSB7CisgICAgICAgICAgaGRyLT5tb2RlX2xmX2RlbHRhX1tpXSA9IFZQOEdldFNpZ25lZFZhbHVlKGJyLCA2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWMtPmZpbHRlcl90eXBlXyA9IChoZHItPmxldmVsXyA9PSAwKSA/IDAgOiBoZHItPnNpbXBsZV8gPyAxIDogMjsKKyAgcmV0dXJuICFici0+ZW9mXzsKK30KKworLy8gVG9wbW9zdCBjYWxsCitpbnQgVlA4R2V0SGVhZGVycyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBjb25zdCB1aW50OF90KiBidWY7CisgIHNpemVfdCBidWZfc2l6ZTsKKyAgVlA4RnJhbWVIZWFkZXIqIGZybV9oZHI7CisgIFZQOFBpY3R1cmVIZWFkZXIqIHBpY19oZHI7CisgIFZQOEJpdFJlYWRlciogYnI7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworCisgIGlmIChkZWMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIFNldE9rKGRlYyk7CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBWUDhJbyBwYXNzZWQgdG8gVlA4R2V0SGVhZGVycygpIik7CisgIH0KKyAgYnVmID0gaW8tPmRhdGE7CisgIGJ1Zl9zaXplID0gaW8tPmRhdGFfc2l6ZTsKKyAgaWYgKGJ1Zl9zaXplIDwgNCkgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGVkIGhlYWRlci4iKTsKKyAgfQorCisgIC8vIFBhcmFncmFwaCA5LjEKKyAgeworICAgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSBidWZbMF0gfCAoYnVmWzFdIDw8IDgpIHwgKGJ1ZlsyXSA8PCAxNik7CisgICAgZnJtX2hkciA9ICZkZWMtPmZybV9oZHJfOworICAgIGZybV9oZHItPmtleV9mcmFtZV8gPSAhKGJpdHMgJiAxKTsKKyAgICBmcm1faGRyLT5wcm9maWxlXyA9IChiaXRzID4+IDEpICYgNzsKKyAgICBmcm1faGRyLT5zaG93XyA9IChiaXRzID4+IDQpICYgMTsKKyAgICBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA9IChiaXRzID4+IDUpOworICAgIGlmIChmcm1faGRyLT5wcm9maWxlXyA+IDMpCisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGtleWZyYW1lIHBhcmFtZXRlcnMuIik7CisgICAgaWYgKCFmcm1faGRyLT5zaG93XykKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWUgbm90IGRpc3BsYXlhYmxlLiIpOworICAgIGJ1ZiArPSAzOworICAgIGJ1Zl9zaXplIC09IDM7CisgIH0KKworICBwaWNfaGRyID0gJmRlYy0+cGljX2hkcl87CisgIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgLy8gUGFyYWdyYXBoIDkuMgorICAgIGlmIChidWZfc2l6ZSA8IDcpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgcGljdHVyZSBoZWFkZXIiKTsKKyAgICB9CisgICAgaWYgKCFWUDhDaGVja1NpZ25hdHVyZShidWYsIGJ1Zl9zaXplKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBjb2RlIHdvcmQiKTsKKyAgICB9CisgICAgcGljX2hkci0+d2lkdGhfID0gKChidWZbNF0gPDwgOCkgfCBidWZbM10pICYgMHgzZmZmOworICAgIHBpY19oZHItPnhzY2FsZV8gPSBidWZbNF0gPj4gNjsgICAvLyByYXRpbzogMSwgNS80IDUvMyBvciAyCisgICAgcGljX2hkci0+aGVpZ2h0XyA9ICgoYnVmWzZdIDw8IDgpIHwgYnVmWzVdKSAmIDB4M2ZmZjsKKyAgICBwaWNfaGRyLT55c2NhbGVfID0gYnVmWzZdID4+IDY7CisgICAgYnVmICs9IDc7CisgICAgYnVmX3NpemUgLT0gNzsKKworICAgIGRlYy0+bWJfd18gPSAocGljX2hkci0+d2lkdGhfICsgMTUpID4+IDQ7CisgICAgZGVjLT5tYl9oXyA9IChwaWNfaGRyLT5oZWlnaHRfICsgMTUpID4+IDQ7CisKKyAgICAvLyBTZXR1cCBkZWZhdWx0IG91dHB1dCBhcmVhIChjYW4gYmUgbGF0ZXIgbW9kaWZpZWQgZHVyaW5nIGlvLT5zZXR1cCgpKQorICAgIGlvLT53aWR0aCA9IHBpY19oZHItPndpZHRoXzsKKyAgICBpby0+aGVpZ2h0ID0gcGljX2hkci0+aGVpZ2h0XzsKKyAgICAvLyBJTVBPUlRBTlQhIHVzZSBzb21lIHNhbmUgZGltZW5zaW9ucyBpbiBjcm9wXyogYW5kIHNjYWxlZF8qIGZpZWxkcy4KKyAgICAvLyBTbyB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRob3V0IGFsd2F5cyB0ZXN0aW5nIGZvcgorICAgIC8vICd1c2VfY3JvcHBpbmcnLgorICAgIGlvLT51c2VfY3JvcHBpbmcgPSAwOworICAgIGlvLT5jcm9wX3RvcCAgPSAwOworICAgIGlvLT5jcm9wX2xlZnQgPSAwOworICAgIGlvLT5jcm9wX3JpZ2h0ICA9IGlvLT53aWR0aDsKKyAgICBpby0+Y3JvcF9ib3R0b20gPSBpby0+aGVpZ2h0OworICAgIGlvLT51c2Vfc2NhbGluZyAgPSAwOworICAgIGlvLT5zY2FsZWRfd2lkdGggPSBpby0+d2lkdGg7CisgICAgaW8tPnNjYWxlZF9oZWlnaHQgPSBpby0+aGVpZ2h0OworCisgICAgaW8tPm1iX3cgPSBpby0+d2lkdGg7ICAgLy8gc2FuaXR5IGNoZWNrCisgICAgaW8tPm1iX2ggPSBpby0+aGVpZ2h0OyAgLy8gZGl0dG8KKworICAgIFZQOFJlc2V0UHJvYmEoJmRlYy0+cHJvYmFfKTsKKyAgICBSZXNldFNlZ21lbnRIZWFkZXIoJmRlYy0+c2VnbWVudF9oZHJfKTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHRoZSBwYXJ0aXRpb24gIzAgYXZhaWxhYmxlLCBhbmQgaW5pdGlhbGl6ZSBkZWMtPmJyXworICAvLyB0byByZWFkIHRoaXMgcGFydGl0aW9uIChhbmQgdGhpcyBwYXJ0aXRpb24gb25seSkuCisgIGlmIChmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA+IGJ1Zl9zaXplKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFydGl0aW9uIGxlbmd0aCIpOworICB9CisKKyAgYnIgPSAmZGVjLT5icl87CisgIFZQOEluaXRCaXRSZWFkZXIoYnIsIGJ1ZiwgZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF8pOworICBidWYgKz0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87CisgIGJ1Zl9zaXplIC09IGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfOworCisgIGlmIChmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgcGljX2hkci0+Y29sb3JzcGFjZV8gPSBWUDhHZXQoYnIpOworICAgIHBpY19oZHItPmNsYW1wX3R5cGVfID0gVlA4R2V0KGJyKTsKKyAgfQorICBpZiAoIVBhcnNlU2VnbWVudEhlYWRlcihiciwgJmRlYy0+c2VnbWVudF9oZHJfLCAmZGVjLT5wcm9iYV8pKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2Ugc2VnbWVudCBoZWFkZXIiKTsKKyAgfQorICAvLyBGaWx0ZXIgc3BlY3MKKyAgaWYgKCFQYXJzZUZpbHRlckhlYWRlcihiciwgZGVjKSkgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHBhcnNlIGZpbHRlciBoZWFkZXIiKTsKKyAgfQorICBzdGF0dXMgPSBQYXJzZVBhcnRpdGlvbnMoZGVjLCBidWYsIGJ1Zl9zaXplKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgc3RhdHVzLCAiY2Fubm90IHBhcnNlIHBhcnRpdGlvbnMiKTsKKyAgfQorCisgIC8vIHF1YW50aXplciBjaGFuZ2UKKyAgVlA4UGFyc2VRdWFudChkZWMpOworCisgIC8vIEZyYW1lIGJ1ZmZlciBtYXJraW5nCisgIGlmICghZnJtX2hkci0+a2V5X2ZyYW1lXykgeworICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBhIGtleSBmcmFtZS4iKTsKKyAgfQorCisgIFZQOEdldChicik7ICAgLy8gaWdub3JlIHRoZSB2YWx1ZSBvZiB1cGRhdGVfcHJvYmFfCisKKyAgVlA4UGFyc2VQcm9iYShiciwgZGVjKTsKKworICAvLyBzYW5pdGl6ZWQgc3RhdGUKKyAgZGVjLT5yZWFkeV8gPSAxOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlc2lkdWFsIGRlY29kaW5nIChQYXJhZ3JhcGggMTMuMiAvIDEzLjMpCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAsIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ2W10gPQorICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5LCAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCogY29uc3Qga0NhdDM0NTZbXSA9IHsga0NhdDMsIGtDYXQ0LCBrQ2F0NSwga0NhdDYgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0geworICAwLCAxLCA0LCA4LCAgNSwgMiwgMywgNiwgIDksIDEyLCAxMywgMTAsICA3LCAxMSwgMTQsIDE1Cit9OworCisvLyBTZWUgc2VjdGlvbiAxMy0yOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2Mzg2I3NlY3Rpb24tMTMuMgorc3RhdGljIGludCBHZXRMYXJnZVZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHApIHsKKyAgaW50IHY7CisgIGlmICghVlA4R2V0Qml0KGJyLCBwWzNdKSkgeworICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzRdKSkgeworICAgICAgdiA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIHYgPSAzICsgVlA4R2V0Qml0KGJyLCBwWzVdKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNl0pKSB7CisgICAgICBpZiAoIVZQOEdldEJpdChiciwgcFs3XSkpIHsKKyAgICAgICAgdiA9IDUgKyBWUDhHZXRCaXQoYnIsIDE1OSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2ID0gNyArIDIgKiBWUDhHZXRCaXQoYnIsIDE2NSk7CisgICAgICAgIHYgKz0gVlA4R2V0Qml0KGJyLCAxNDUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1aW50OF90KiB0YWI7CisgICAgICBjb25zdCBpbnQgYml0MSA9IFZQOEdldEJpdChiciwgcFs4XSk7CisgICAgICBjb25zdCBpbnQgYml0MCA9IFZQOEdldEJpdChiciwgcFs5ICsgYml0MV0pOworICAgICAgY29uc3QgaW50IGNhdCA9IDIgKiBiaXQxICsgYml0MDsKKyAgICAgIHYgPSAwOworICAgICAgZm9yICh0YWIgPSBrQ2F0MzQ1NltjYXRdOyAqdGFiOyArK3RhYikgeworICAgICAgICB2ICs9IHYgKyBWUDhHZXRCaXQoYnIsICp0YWIpOworICAgICAgfQorICAgICAgdiArPSAzICsgKDggPDwgY2F0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKKy8vIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG5vbi16ZXJvIGNvZWZmIHBsdXMgb25lCitzdGF0aWMgaW50IEdldENvZWZmcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCBwcm9iW10sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwcm9iW25dLT5wcm9iYXNfW2N0eF07CisgIGZvciAoOyBuIDwgMTY7ICsrbikgeworICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzBdKSkgeworICAgICAgcmV0dXJuIG47ICAvLyBwcmV2aW91cyBjb2VmZiB3YXMgbGFzdCBub24temVybyBjb2VmZgorICAgIH0KKyAgICB3aGlsZSAoIVZQOEdldEJpdChiciwgcFsxXSkpIHsgICAgICAgLy8gc2VxdWVuY2Ugb2YgemVybyBjb2VmZnMKKyAgICAgIHAgPSBwcm9iWysrbl0tPnByb2Jhc19bMF07CisgICAgICBpZiAobiA9PSAxNikgcmV0dXJuIDE2OworICAgIH0KKyAgICB7ICAgICAgICAvLyBub24gemVybyBjb2VmZgorICAgICAgY29uc3QgVlA4UHJvYmFBcnJheSogY29uc3QgcF9jdHggPSAmcHJvYltuICsgMV0tPnByb2Jhc19bMF07CisgICAgICBpbnQgdjsKKyAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkgeworICAgICAgICB2ID0gMTsKKyAgICAgICAgcCA9IHBfY3R4WzFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOworICAgICAgICBwID0gcF9jdHhbMl07CisgICAgICB9CisgICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOworICAgIH0KKyAgfQorICByZXR1cm4gMTY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBOekNvZGVCaXRzKHVpbnQzMl90IG56X2NvZWZmcywgaW50IG56LCBpbnQgZGNfbnopIHsKKyAgbnpfY29lZmZzIDw8PSAyOworICBuel9jb2VmZnMgfD0gKG56ID4gMykgPyAzIDogKG56ID4gMSkgPyAyIDogZGNfbno7CisgIHJldHVybiBuel9jb2VmZnM7Cit9CisKK3N0YXRpYyBpbnQgUGFyc2VSZXNpZHVhbHMoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNQiogY29uc3QgbWIsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogKCogY29uc3QgYmFuZHMpWzE2ICsgMV0gPSBkZWMtPnByb2JhXy5iYW5kc19wdHJfOworICBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCAqIGFjX3Byb2JhOworICBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gZGVjLT5tYl9kYXRhXyArIGRlYy0+bWJfeF87CisgIGNvbnN0IFZQOFF1YW50TWF0cml4KiBjb25zdCBxID0gJmRlYy0+ZHFtX1tibG9jay0+c2VnbWVudF9dOworICBpbnQxNl90KiBkc3QgPSBibG9jay0+Y29lZmZzXzsKKyAgVlA4TUIqIGNvbnN0IGxlZnRfbWIgPSBkZWMtPm1iX2luZm9fIC0gMTsKKyAgdWludDhfdCB0bnosIGxuejsKKyAgdWludDMyX3Qgbm9uX3plcm9feSA9IDA7CisgIHVpbnQzMl90IG5vbl96ZXJvX3V2ID0gMDsKKyAgaW50IHgsIHksIGNoOworICB1aW50MzJfdCBvdXRfdF9ueiwgb3V0X2xfbno7CisgIGludCBmaXJzdDsKKworICBtZW1zZXQoZHN0LCAwLCAzODQgKiBzaXplb2YoKmRzdCkpOworICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeyAgICAvLyBwYXJzZSBEQworICAgIGludDE2X3QgZGNbMTZdID0geyAwIH07CisgICAgY29uc3QgaW50IGN0eCA9IG1iLT5uel9kY18gKyBsZWZ0X21iLT5uel9kY187CisgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1sxXSwgY3R4LCBxLT55Ml9tYXRfLCAwLCBkYyk7CisgICAgbWItPm56X2RjXyA9IGxlZnRfbWItPm56X2RjXyA9IChueiA+IDApOworICAgIGlmIChueiA+IDEpIHsgICAvLyBtb3JlIHRoYW4ganVzdCB0aGUgREMgLT4gcGVyZm9ybSB0aGUgZnVsbCB0cmFuc2Zvcm0KKyAgICAgIFZQOFRyYW5zZm9ybVdIVChkYywgZHN0KTsKKyAgICB9IGVsc2UgeyAgICAgICAgLy8gb25seSBEQyBpcyBub24temVybyAtPiBpbmxpbmVkIHNpbXBsaWZpZWQgdHJhbnNmb3JtCisgICAgICBpbnQgaTsKKyAgICAgIGNvbnN0IGludCBkYzAgPSAoZGNbMF0gKyAzKSA+PiAzOworICAgICAgZm9yIChpID0gMDsgaSA8IDE2ICogMTY7IGkgKz0gMTYpIGRzdFtpXSA9IGRjMDsKKyAgICB9CisgICAgZmlyc3QgPSAxOworICAgIGFjX3Byb2JhID0gYmFuZHNbMF07CisgIH0gZWxzZSB7CisgICAgZmlyc3QgPSAwOworICAgIGFjX3Byb2JhID0gYmFuZHNbM107CisgIH0KKworICB0bnogPSBtYi0+bnpfICYgMHgwZjsKKyAgbG56ID0gbGVmdF9tYi0+bnpfICYgMHgwZjsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGludCBsID0gbG56ICYgMTsKKyAgICB1aW50MzJfdCBuel9jb2VmZnMgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCBjdHggPSBsICsgKHRueiAmIDEpOworICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBhY19wcm9iYSwgY3R4LCBxLT55MV9tYXRfLCBmaXJzdCwgZHN0KTsKKyAgICAgIGwgPSAobnogPiBmaXJzdCk7CisgICAgICB0bnogPSAodG56ID4+IDEpIHwgKGwgPDwgNyk7CisgICAgICBuel9jb2VmZnMgPSBOekNvZGVCaXRzKG56X2NvZWZmcywgbnosIGRzdFswXSAhPSAwKTsKKyAgICAgIGRzdCArPSAxNjsKKyAgICB9CisgICAgdG56ID4+PSA0OworICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA3KTsKKyAgICBub25femVyb195ID0gKG5vbl96ZXJvX3kgPDwgOCkgfCBuel9jb2VmZnM7CisgIH0KKyAgb3V0X3RfbnogPSB0bno7CisgIG91dF9sX256ID0gbG56ID4+IDQ7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgNDsgY2ggKz0gMikgeworICAgIHVpbnQzMl90IG56X2NvZWZmcyA9IDA7CisgICAgdG56ID0gbWItPm56XyA+PiAoNCArIGNoKTsKKyAgICBsbnogPSBsZWZ0X21iLT5uel8gPj4gKDQgKyBjaCk7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgaW50IGwgPSBsbnogJiAxOworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gbCArICh0bnogJiAxKTsKKyAgICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1syXSwgY3R4LCBxLT51dl9tYXRfLCAwLCBkc3QpOworICAgICAgICBsID0gKG56ID4gMCk7CisgICAgICAgIHRueiA9ICh0bnogPj4gMSkgfCAobCA8PCAzKTsKKyAgICAgICAgbnpfY29lZmZzID0gTnpDb2RlQml0cyhuel9jb2VmZnMsIG56LCBkc3RbMF0gIT0gMCk7CisgICAgICAgIGRzdCArPSAxNjsKKyAgICAgIH0KKyAgICAgIHRueiA+Pj0gMjsKKyAgICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA1KTsKKyAgICB9CisgICAgLy8gTm90ZTogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIHBlci00eDQgZGV0YWlscyBmb3IgVS9WIGJsb2Nrcy4KKyAgICBub25femVyb191diB8PSBuel9jb2VmZnMgPDwgKDQgKiBjaCk7CisgICAgb3V0X3RfbnogfD0gKHRueiA8PCA0KSA8PCBjaDsKKyAgICBvdXRfbF9ueiB8PSAobG56ICYgMHhmMCkgPDwgY2g7CisgIH0KKyAgbWItPm56XyA9IG91dF90X256OworICBsZWZ0X21iLT5uel8gPSBvdXRfbF9uejsKKworICBibG9jay0+bm9uX3plcm9feV8gPSBub25femVyb195OworICBibG9jay0+bm9uX3plcm9fdXZfID0gbm9uX3plcm9fdXY7CisKKyAgLy8gV2UgbG9vayBhdCB0aGUgbW9kZS1jb2RlIG9mIGVhY2ggYmxvY2sgYW5kIGNoZWNrIGlmIHNvbWUgYmxvY2tzIGhhdmUgbGVzcworICAvLyB0aGFuIHRocmVlIG5vbi16ZXJvIGNvZWZmcyAoY29kZSA8IDIpLiBUaGlzIGlzIHRvIGF2b2lkIGRpdGhlcmluZyBmbGF0IGFuZAorICAvLyBlbXB0eSBibG9ja3MuCisgIGJsb2NrLT5kaXRoZXJfID0gKG5vbl96ZXJvX3V2ICYgMHhhYWFhKSA/IDAgOiBxLT5kaXRoZXJfOworCisgIHJldHVybiAhKG5vbl96ZXJvX3kgfCBub25femVyb191dik7ICAvLyB3aWxsIGJlIHVzZWQgZm9yIGZ1cnRoZXIgb3B0aW1pemF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3AKKworaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgeworICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOworICBWUDhNQiogY29uc3QgbWIgPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKKyAgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGRlYy0+bWJfZGF0YV8gKyBkZWMtPm1iX3hfOworICBpbnQgc2tpcCA9IGRlYy0+dXNlX3NraXBfcHJvYmFfID8gYmxvY2stPnNraXBfIDogMDsKKworICBpZiAoIXNraXApIHsKKyAgICBza2lwID0gUGFyc2VSZXNpZHVhbHMoZGVjLCBtYiwgdG9rZW5fYnIpOworICB9IGVsc2UgeworICAgIGxlZnQtPm56XyA9IG1iLT5uel8gPSAwOworICAgIGlmICghYmxvY2stPmlzX2k0eDRfKSB7CisgICAgICBsZWZ0LT5uel9kY18gPSBtYi0+bnpfZGNfID0gMDsKKyAgICB9CisgICAgYmxvY2stPm5vbl96ZXJvX3lfID0gMDsKKyAgICBibG9jay0+bm9uX3plcm9fdXZfID0gMDsKKyAgICBibG9jay0+ZGl0aGVyXyA9IDA7CisgIH0KKworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSB7ICAvLyBzdG9yZSBmaWx0ZXIgaW5mbworICAgIFZQOEZJbmZvKiBjb25zdCBmaW5mbyA9IGRlYy0+Zl9pbmZvXyArIGRlYy0+bWJfeF87CisgICAgKmZpbmZvID0gZGVjLT5mc3RyZW5ndGhzX1tibG9jay0+c2VnbWVudF9dW2Jsb2NrLT5pc19pNHg0X107CisgICAgZmluZm8tPmZfaW5uZXJfIHw9ICFza2lwOworICB9CisKKyAgcmV0dXJuICF0b2tlbl9ici0+ZW9mXzsKK30KKwordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7CisgIGxlZnQtPm56XyA9IDA7CisgIGxlZnQtPm56X2RjXyA9IDA7CisgIG1lbXNldChkZWMtPmludHJhX2xfLCBCX0RDX1BSRUQsIHNpemVvZihkZWMtPmludHJhX2xfKSk7CisgIGRlYy0+bWJfeF8gPSAwOworfQorCitzdGF0aWMgaW50IFBhcnNlRnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKKyAgZm9yIChkZWMtPm1iX3lfID0gMDsgZGVjLT5tYl95XyA8IGRlYy0+YnJfbWJfeV87ICsrZGVjLT5tYl95XykgeworICAgIC8vIFBhcnNlIGJpdHN0cmVhbSBmb3IgdGhpcyByb3cuCisgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9iciA9CisgICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgZGVjLT5udW1fcGFydHNfbWludXNfb25lX107CisgICAgaWYgKCFWUDhQYXJzZUludHJhTW9kZVJvdygmZGVjLT5icl8sIGRlYykpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kLW9mLXBhcnRpdGlvbjAgZW5jb3VudGVyZWQuIik7CisgICAgfQorICAgIGZvciAoOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgKytkZWMtPm1iX3hfKSB7CisgICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7CisgICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZC4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7ICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBzY2FubGluZQorCisgICAgLy8gUmVjb25zdHJ1Y3QsIGZpbHRlciBhbmQgZW1pdCB0aGUgcm93LgorICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiT3V0cHV0IGFib3J0ZWQuIik7CisgICAgfQorICB9CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMoJmRlYy0+d29ya2VyXykpIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIE1haW4gZW50cnkgcG9pbnQKK2ludCBWUDhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMDsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIFZQOElvIHBhcmFtZXRlciBpbiBWUDhEZWNvZGUoKS4iKTsKKyAgfQorCisgIGlmICghZGVjLT5yZWFkeV8pIHsKKyAgICBpZiAoIVZQOEdldEhlYWRlcnMoZGVjLCBpbykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBhc3NlcnQoZGVjLT5yZWFkeV8pOworCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIuIFdpbGwgY2FsbCBpby0+c2V0dXAoKS4KKyAgb2sgPSAoVlA4RW50ZXJDcml0aWNhbChkZWMsIGlvKSA9PSBWUDhfU1RBVFVTX09LKTsKKyAgaWYgKG9rKSB7ICAgLy8gZ29vZCB0byBnby4KKyAgICAvLyBXaWxsIGFsbG9jYXRlIG1lbW9yeSBhbmQgcHJlcGFyZSBldmVyeXRoaW5nLgorICAgIGlmIChvaykgb2sgPSBWUDhJbml0RnJhbWUoZGVjLCBpbyk7CisKKyAgICAvLyBNYWluIGRlY29kaW5nIGxvb3AKKyAgICBpZiAob2spIG9rID0gUGFyc2VGcmFtZShkZWMsIGlvKTsKKworICAgIC8vIEV4aXQuCisgICAgb2sgJj0gVlA4RXhpdENyaXRpY2FsKGRlYywgaW8pOworICB9CisKKyAgaWYgKCFvaykgeworICAgIFZQOENsZWFyKGRlYyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkZWMtPnJlYWR5XyA9IDA7CisgIHJldHVybiBvazsKK30KKwordm9pZCBWUDhDbGVhcihWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RW5kKCZkZWMtPndvcmtlcl8pOworICBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KGRlYyk7CisgIFdlYlBTYWZlRnJlZShkZWMtPm1lbV8pOworICBkZWMtPm1lbV8gPSBOVUxMOworICBkZWMtPm1lbV9zaXplXyA9IDA7CisgIG1lbXNldCgmZGVjLT5icl8sIDAsIHNpemVvZihkZWMtPmJyXykpOworICBkZWMtPnJlYWR5XyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ2NDY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGkuaApAQCAtMCwwICsxLDMyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFZQOCBkZWNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX0RFQ19WUDhJX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfREVDX1ZQOElfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvY29tbW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4bGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgZGVmaW5lcyBhbmQgZW51bXMKKworLy8gdmVyc2lvbiBudW1iZXJzCisjZGVmaW5lIERFQ19NQUpfVkVSU0lPTiAwCisjZGVmaW5lIERFQ19NSU5fVkVSU0lPTiA1CisjZGVmaW5lIERFQ19SRVZfVkVSU0lPTiAxCisKKy8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLiBDYWNoZSBpcyAzMi1ieXRlcyB3aWRlICg9IG9uZSBjYWNoZWxpbmUpLgorLy8gQ29uc3RyYWludHMgYXJlOiBXZSBuZWVkIHRvIHN0b3JlIG9uZSAxNngxNiBibG9jayBvZiBsdW1hIHNhbXBsZXMgKHkpLAorLy8gYW5kIHR3byA4eDggY2hyb21hIGJsb2NrcyAodS92KS4gVGhlc2UgYXJlIGJldHRlciBiZSAxNi1ieXRlcyBhbGlnbmVkLAorLy8gaW4gb3JkZXIgdG8gYmUgU0lNRC1mcmllbmRseS4gV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3AsIGxlZnQgYW5kCisvLyB0b3AtbGVmdCBzYW1wbGVzIChmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9ja3MpLCBhbG9uZyB3aXRoIGZvdXIKKy8vIGV4dHJhIHRvcC1yaWdodCBzYW1wbGVzIGZvciBsdW1hIChpbnRyYTR4NCBwcmVkaWN0aW9uIG9ubHkpLgorLy8gT25lIHBvc3NpYmxlIGxheW91dCBpcywgdXNpbmcgMzIgKiAoMTcgKyA5KSBieXRlczoKKy8vCisvLyAgIC4rLS0tLS0tICAgPC0gb25seSAxIHBpeGVsIGhpZ2gKKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5dC4KKy8vICAgLnx5eXl5Li4KKy8vICAgListLS4rLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAorLy8gICAufHV1Lnx2dgorLy8gICAufHV1Lnx2dgorLy8KKy8vIEV2ZXJ5IGNoYXJhY3RlciBpcyBhIDR4NCBibG9jaywgd2l0aCBsZWdlbmQ6CisvLyAgJy4nID0gdW51c2VkCisvLyAgJ3knID0geS1zYW1wbGVzICAgJ3UnID0gdS1zYW1wbGVzICAgICAndicgPSB1LXNhbXBsZXMKKy8vICAnfCcgPSBsZWZ0IHNhbXBsZSwgICAnLScgPSB0b3Agc2FtcGxlLCAgICAnKycgPSB0b3AtbGVmdCBzYW1wbGUKKy8vICAndCcgPSBleHRyYSB0b3AtcmlnaHQgc2FtcGxlIGZvciA0eDQgbW9kZXMKKyNkZWZpbmUgWVVWX1NJWkUgKEJQUyAqIDE3ICsgQlBTICogOSkKKyNkZWZpbmUgWV9TSVpFICAgKEJQUyAqIDE3KQorI2RlZmluZSBZX09GRiAgICAoQlBTICogMSArIDgpCisjZGVmaW5lIFVfT0ZGICAgIChZX09GRiArIEJQUyAqIDE2ICsgQlBTKQorI2RlZmluZSBWX09GRiAgICAoVV9PRkYgKyAxNikKKworLy8gbWluaW1hbCB3aWR0aCB1bmRlciB3aGljaCBsb3NzeSBtdWx0aS10aHJlYWRpbmcgaXMgYWx3YXlzIGRpc2FibGVkCisjZGVmaW5lIE1JTl9XSURUSF9GT1JfVEhSRUFEUyA1MTIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlcnMKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGtleV9mcmFtZV87CisgIHVpbnQ4X3QgcHJvZmlsZV87CisgIHVpbnQ4X3Qgc2hvd187CisgIHVpbnQzMl90IHBhcnRpdGlvbl9sZW5ndGhfOworfSBWUDhGcmFtZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCB3aWR0aF87CisgIHVpbnQxNl90IGhlaWdodF87CisgIHVpbnQ4X3QgeHNjYWxlXzsKKyAgdWludDhfdCB5c2NhbGVfOworICB1aW50OF90IGNvbG9yc3BhY2VfOyAgIC8vIDAgPSBZQ2JDcgorICB1aW50OF90IGNsYW1wX3R5cGVfOworfSBWUDhQaWN0dXJlSGVhZGVyOworCisvLyBzZWdtZW50IGZlYXR1cmVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB1c2Vfc2VnbWVudF87CisgIGludCB1cGRhdGVfbWFwXzsgICAgICAgIC8vIHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBzZWdtZW50IG1hcCBvciBub3QKKyAgaW50IGFic29sdXRlX2RlbHRhXzsgICAgLy8gYWJzb2x1dGUgb3IgZGVsdGEgdmFsdWVzIGZvciBxdWFudGl6ZXIgYW5kIGZpbHRlcgorICBpbnQ4X3QgcXVhbnRpemVyX1tOVU1fTUJfU0VHTUVOVFNdOyAgICAgICAgLy8gcXVhbnRpemF0aW9uIGNoYW5nZXMKKyAgaW50OF90IGZpbHRlcl9zdHJlbmd0aF9bTlVNX01CX1NFR01FTlRTXTsgIC8vIGZpbHRlciBzdHJlbmd0aCBmb3Igc2VnbWVudHMKK30gVlA4U2VnbWVudEhlYWRlcjsKKworLy8gcHJvYmFzIGFzc29jaWF0ZWQgdG8gb25lIG9mIHRoZSBjb250ZXh0cwordHlwZWRlZiB1aW50OF90IFZQOFByb2JhQXJyYXlbTlVNX1BST0JBU107CisKK3R5cGVkZWYgc3RydWN0IHsgICAvLyBhbGwgdGhlIHByb2JhcyBhc3NvY2lhdGVkIHRvIG9uZSBiYW5kCisgIFZQOFByb2JhQXJyYXkgcHJvYmFzX1tOVU1fQ1RYXTsKK30gVlA4QmFuZFByb2JhczsKKworLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBzZWdtZW50c19bTUJfRkVBVFVSRV9UUkVFX1BST0JTXTsKKyAgLy8gVHlwZTogMDpJbnRyYTE2LUFDICAxOkludHJhMTYtREMgICAyOkNocm9tYSAgIDM6SW50cmE0CisgIFZQOEJhbmRQcm9iYXMgYmFuZHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogYmFuZHNfcHRyX1tOVU1fVFlQRVNdWzE2ICsgMV07Cit9IFZQOFByb2JhOworCisvLyBGaWx0ZXIgcGFyYW1ldGVycwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2ltcGxlXzsgICAgICAgICAgICAgICAgICAvLyAwPWNvbXBsZXgsIDE9c2ltcGxlCisgIGludCBsZXZlbF87ICAgICAgICAgICAgICAgICAgIC8vIFswLi42M10KKyAgaW50IHNoYXJwbmVzc187ICAgICAgICAgICAgICAgLy8gWzAuLjddCisgIGludCB1c2VfbGZfZGVsdGFfOworICBpbnQgcmVmX2xmX2RlbHRhX1tOVU1fUkVGX0xGX0RFTFRBU107CisgIGludCBtb2RlX2xmX2RlbHRhX1tOVU1fTU9ERV9MRl9ERUxUQVNdOworfSBWUDhGaWx0ZXJIZWFkZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgorCit0eXBlZGVmIHN0cnVjdCB7ICAvLyBmaWx0ZXIgc3BlY3MKKyAgdWludDhfdCBmX2xpbWl0XzsgICAgICAvLyBmaWx0ZXIgbGltaXQgaW4gWzMuLjE4OV0sIG9yIDAgaWYgbm8gZmlsdGVyaW5nCisgIHVpbnQ4X3QgZl9pbGV2ZWxfOyAgICAgLy8gaW5uZXIgbGltaXQgaW4gWzEuLjYzXQorICB1aW50OF90IGZfaW5uZXJfOyAgICAgIC8vIGRvIGlubmVyIGZpbHRlcmluZz8KKyAgdWludDhfdCBoZXZfdGhyZXNoXzsgICAvLyBoaWdoIGVkZ2UgdmFyaWFuY2UgdGhyZXNob2xkIGluIFswLi4yXQorfSBWUDhGSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gVG9wL0xlZnQgQ29udGV4dHMgdXNlZCBmb3Igc3ludGF4LXBhcnNpbmcKKyAgdWludDhfdCBuel87ICAgICAgICAvLyBub24temVybyBBQy9EQyBjb2VmZnMgKDRiaXQgZm9yIGx1bWEgKyA0Yml0IGZvciBjaHJvbWEpCisgIHVpbnQ4X3QgbnpfZGNfOyAgICAgLy8gbm9uLXplcm8gREMgY29lZmYgKDFiaXQpCit9IFZQOE1COworCisvLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwordHlwZWRlZiBpbnQgcXVhbnRfdFsyXTsgICAgICAvLyBbREMgLyBBQ10uICBDYW4gYmUgJ3VpbnQxNl90WzJdJyB0b28gKH5zbG93ZXIpLgordHlwZWRlZiBzdHJ1Y3QgeworICBxdWFudF90IHkxX21hdF8sIHkyX21hdF8sIHV2X21hdF87CisKKyAgaW50IHV2X3F1YW50XzsgICAvLyBVL1YgcXVhbnRpemVyIHZhbHVlCisgIGludCBkaXRoZXJfOyAgICAgLy8gZGl0aGVyaW5nIGFtcGxpdHVkZSAoMCA9IG9mZiwgbWF4PTI1NSkKK30gVlA4UXVhbnRNYXRyaXg7CisKKy8vIERhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IGEgbWFjcm9ibG9jawordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQxNl90IGNvZWZmc19bMzg0XTsgICAvLyAzODQgY29lZmZzID0gKDE2KzQrNCkgKiA0KjQKKyAgdWludDhfdCBpc19pNHg0XzsgICAgICAgLy8gdHJ1ZSBpZiBpbnRyYTR4NAorICB1aW50OF90IGltb2Rlc19bMTZdOyAgICAvLyBvbmUgMTZ4MTYgbW9kZSAoIzApIG9yIHNpeHRlZW4gNHg0IG1vZGVzCisgIHVpbnQ4X3QgdXZtb2RlXzsgICAgICAgIC8vIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUKKyAgLy8gYml0LXdpc2UgaW5mbyBhYm91dCB0aGUgY29udGVudCBvZiBlYWNoIHN1Yi00eDQgYmxvY2tzIChpbiBkZWNvZGluZyBvcmRlcikuCisgIC8vIEVhY2ggb2YgdGhlIDR4NCBibG9ja3MgZm9yIHkvdS92IGlzIGFzc29jaWF0ZWQgd2l0aCBhIDJiIGNvZGUgYWNjb3JkaW5nIHRvOgorICAvLyAgIGNvZGU9MCAtPiBubyBjb2VmZmljaWVudAorICAvLyAgIGNvZGU9MSAtPiBvbmx5IERDCisgIC8vICAgY29kZT0yIC0+IGZpcnN0IHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gICBjb2RlPTMgLT4gbW9yZSB0aGFuIHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gVGhpcyBhbGxvd3MgdG8gY2FsbCBzcGVjaWFsaXplZCB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorICB1aW50MzJfdCBub25femVyb195XzsKKyAgdWludDMyX3Qgbm9uX3plcm9fdXZfOworICB1aW50OF90IGRpdGhlcl87ICAgICAgLy8gbG9jYWwgZGl0aGVyaW5nIHN0cmVuZ3RoIChkZWR1Y2VkIGZyb20gbm9uX3plcm9fKikKKyAgdWludDhfdCBza2lwXzsKKyAgdWludDhfdCBzZWdtZW50XzsKK30gVlA4TUJEYXRhOworCisvLyBQZXJzaXN0ZW50IGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaWRfOyAgICAgICAgICAgICAgLy8gY2FjaGUgcm93IHRvIHByb2Nlc3MgKGluIFswLi4yXSkKKyAgaW50IG1iX3lfOyAgICAgICAgICAgIC8vIG1hY3JvYmxvY2sgcG9zaXRpb24gb2YgdGhlIHJvdworICBpbnQgZmlsdGVyX3Jvd187ICAgICAgLy8gdHJ1ZSBpZiByb3ctZmlsdGVyaW5nIGlzIG5lZWRlZAorICBWUDhGSW5mbyogZl9pbmZvXzsgICAgLy8gZmlsdGVyIHN0cmVuZ3RocyAoc3dhcHBlZCB3aXRoIGRlYy0+Zl9pbmZvXykKKyAgVlA4TUJEYXRhKiBtYl9kYXRhXzsgIC8vIHJlY29uc3RydWN0aW9uIGRhdGEgKHN3YXBwZWQgd2l0aCBkZWMtPm1iX2RhdGFfKQorICBWUDhJbyBpb187ICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgVlA4SW8gdG8gcGFzcyB0byBwdXQoKQorfSBWUDhUaHJlYWRDb250ZXh0OworCisvLyBTYXZlZCB0b3Agc2FtcGxlcywgcGVyIG1hY3JvYmxvY2suIEZpdHMgaW50byBhIGNhY2hlLWxpbmUuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgeVsxNl0sIHVbOF0sIHZbOF07Cit9IFZQOFRvcFNhbXBsZXM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhEZWNvZGVyOiB0aGUgbWFpbiBvcGFxdWUgc3RydWN0dXJlIGhhbmRlZCBvdmVyIHRvIHVzZXIKKworc3RydWN0IFZQOERlY29kZXIgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1c187CisgIGludCByZWFkeV87ICAgICAvLyB0cnVlIGlmIHJlYWR5IHRvIGRlY29kZSBhIHBpY3R1cmUgd2l0aCBWUDhEZWNvZGUoKQorICBjb25zdCBjaGFyKiBlcnJvcl9tc2dfOyAgLy8gc2V0IHdoZW4gc3RhdHVzXyBpcyBub3QgT0suCisKKyAgLy8gTWFpbiBkYXRhIHNvdXJjZQorICBWUDhCaXRSZWFkZXIgYnJfOworCisgIC8vIGhlYWRlcnMKKyAgVlA4RnJhbWVIZWFkZXIgICBmcm1faGRyXzsKKyAgVlA4UGljdHVyZUhlYWRlciBwaWNfaGRyXzsKKyAgVlA4RmlsdGVySGVhZGVyICBmaWx0ZXJfaGRyXzsKKyAgVlA4U2VnbWVudEhlYWRlciBzZWdtZW50X2hkcl87CisKKyAgLy8gV29ya2VyCisgIFdlYlBXb3JrZXIgd29ya2VyXzsKKyAgaW50IG10X21ldGhvZF87ICAgICAgLy8gbXVsdGktdGhyZWFkIG1ldGhvZDogMD1vZmYsIDE9W3BhcnNlK3JlY29uXVtmaWx0ZXJdCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDI9W3BhcnNlXVtyZWNvbitmaWx0ZXJdCisgIGludCBjYWNoZV9pZF87ICAgICAgIC8vIGN1cnJlbnQgY2FjaGUgcm93CisgIGludCBudW1fY2FjaGVzXzsgICAgIC8vIG51bWJlciBvZiBjYWNoZWQgcm93cyBvZiAxNiBwaXhlbHMgKDEsIDIgb3IgMykKKyAgVlA4VGhyZWFkQ29udGV4dCB0aHJlYWRfY3R4XzsgIC8vIFRocmVhZCBjb250ZXh0CisKKyAgLy8gZGltZW5zaW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzLgorICBpbnQgbWJfd18sIG1iX2hfOworCisgIC8vIE1hY3JvYmxvY2sgdG8gcHJvY2Vzcy9maWx0ZXIsIGRlcGVuZGluZyBvbiBjcm9wcGluZyBhbmQgZmlsdGVyX3R5cGUuCisgIGludCB0bF9tYl94XywgdGxfbWJfeV87ICAvLyB0b3AtbGVmdCBNQiB0aGF0IG11c3QgYmUgaW4tbG9vcCBmaWx0ZXJlZAorICBpbnQgYnJfbWJfeF8sIGJyX21iX3lfOyAgLy8gbGFzdCBib3R0b20tcmlnaHQgTUIgdGhhdCBtdXN0IGJlIGRlY29kZWQKKworICAvLyBudW1iZXIgb2YgcGFydGl0aW9ucyBtaW51cyBvbmUuCisgIHVpbnQzMl90IG51bV9wYXJ0c19taW51c19vbmVfOworICAvLyBwZXItcGFydGl0aW9uIGJvb2xlYW4gZGVjb2RlcnMuCisgIFZQOEJpdFJlYWRlciBwYXJ0c19bTUFYX05VTV9QQVJUSVRJT05TXTsKKworICAvLyBEaXRoZXJpbmcgc3RyZW5ndGgsIGRlZHVjZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zCisgIGludCBkaXRoZXJfOyAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHVzZSBkaXRoZXJpbmcgb3Igbm90CisgIFZQOFJhbmRvbSBkaXRoZXJpbmdfcmdfOyAgICAvLyByYW5kb20gZ2VuZXJhdG9yIGZvciBkaXRoZXJpbmcKKworICAvLyBkZXF1YW50aXphdGlvbiAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKKyAgVlA4UXVhbnRNYXRyaXggZHFtX1tOVU1fTUJfU0VHTUVOVFNdOworCisgIC8vIHByb2JhYmlsaXRpZXMKKyAgVlA4UHJvYmEgcHJvYmFfOworICBpbnQgdXNlX3NraXBfcHJvYmFfOworICB1aW50OF90IHNraXBfcF87CisKKyAgLy8gQm91bmRhcnkgZGF0YSBjYWNoZSBhbmQgcGVyc2lzdGVudCBidWZmZXJzLgorICB1aW50OF90KiBpbnRyYV90XzsgICAgICAvLyB0b3AgaW50cmEgbW9kZXMgdmFsdWVzOiA0ICogbWJfd18KKyAgdWludDhfdCAgaW50cmFfbF9bNF07ICAgLy8gbGVmdCBpbnRyYSBtb2RlcyB2YWx1ZXMKKworICBWUDhUb3BTYW1wbGVzKiB5dXZfdF87ICAvLyB0b3AgeS91L3Ygc2FtcGxlcworCisgIFZQOE1CKiBtYl9pbmZvXzsgICAgICAgIC8vIGNvbnRleHR1YWwgbWFjcm9ibG9jayBpbmZvIChtYl93XyArIDEpCisgIFZQOEZJbmZvKiBmX2luZm9fOyAgICAgIC8vIGZpbHRlciBzdHJlbmd0aCBpbmZvCisgIHVpbnQ4X3QqIHl1dl9iXzsgICAgICAgIC8vIG1haW4gYmxvY2sgZm9yIFkvVS9WIChzaXplID0gWVVWX1NJWkUpCisKKyAgdWludDhfdCogY2FjaGVfeV87ICAgICAgLy8gbWFjcm9ibG9jayByb3cgZm9yIHN0b3JpbmcgdW5maWx0ZXJlZCBzYW1wbGVzCisgIHVpbnQ4X3QqIGNhY2hlX3VfOworICB1aW50OF90KiBjYWNoZV92XzsKKyAgaW50IGNhY2hlX3lfc3RyaWRlXzsKKyAgaW50IGNhY2hlX3V2X3N0cmlkZV87CisKKyAgLy8gbWFpbiBtZW1vcnkgY2h1bmsgZm9yIHRoZSBhYm92ZSBkYXRhLiBQZXJzaXN0ZW50LgorICB2b2lkKiBtZW1fOworICBzaXplX3QgbWVtX3NpemVfOworCisgIC8vIFBlciBtYWNyb2Jsb2NrIG5vbi1wZXJzaXN0ZW50IGluZm9zLgorICBpbnQgbWJfeF8sIG1iX3lfOyAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzCisgIFZQOE1CRGF0YSogbWJfZGF0YV87ICAgIC8vIHBhcnNlZCByZWNvbnN0cnVjdGlvbiBkYXRhCisKKyAgLy8gRmlsdGVyaW5nIHNpZGUtaW5mbworICBpbnQgZmlsdGVyX3R5cGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMD1vZmYsIDE9c2ltcGxlLCAyPWNvbXBsZXgKKyAgVlA4RkluZm8gZnN0cmVuZ3Roc19bTlVNX01CX1NFR01FTlRTXVsyXTsgIC8vIHByZWNhbGN1bGF0ZWQgcGVyLXNlZ21lbnQvdHlwZQorCisgIC8vIEFscGhhCisgIHN0cnVjdCBBTFBIRGVjb2RlciogYWxwaF9kZWNfOyAgLy8gYWxwaGEtcGxhbmUgZGVjb2RlciBvYmplY3QKKyAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YV87ICAgICAvLyBjb21wcmVzc2VkIGFscGhhIGRhdGEgKGlmIHByZXNlbnQpCisgIHNpemVfdCBhbHBoYV9kYXRhX3NpemVfOworICBpbnQgaXNfYWxwaGFfZGVjb2RlZF87ICAgICAgLy8gdHJ1ZSBpZiBhbHBoYV9kYXRhXyBpcyBkZWNvZGVkIGluIGFscGhhX3BsYW5lXworICB1aW50OF90KiBhbHBoYV9wbGFuZV9tZW1fOyAgLy8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgYWxwaGFfcGxhbmVfCisgIHVpbnQ4X3QqIGFscGhhX3BsYW5lXzsgICAgICAvLyBvdXRwdXQuIFBlcnNpc3RlbnQsIGNvbnRhaW5zIHRoZSB3aG9sZSBkYXRhLgorICBjb25zdCB1aW50OF90KiBhbHBoYV9wcmV2X2xpbmVfOyAgLy8gbGFzdCBkZWNvZGVkIGFscGhhIHJvdyAob3IgTlVMTCkKKyAgaW50IGFscGhhX2RpdGhlcmluZ187ICAgICAgIC8vIGRlcml2ZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zICgwPW9mZiwgMTAwPWZ1bGwpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBpbiB2cDguYworaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpOworCisvLyBpbiB0cmVlLmMKK3ZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpOwordm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBwYXJzZXMgb25lIHJvdyBvZiBpbnRyYSBtb2RlIGRhdGEgaW4gcGFydGl0aW9uIDAsIHJldHVybnMgIWVvZgoraW50IFZQOFBhcnNlSW50cmFNb2RlUm93KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vIGluIHF1YW50LmMKK3ZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBpbiBmcmFtZS5jCitpbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIENhbGwgaW8tPnNldHVwKCkgYW5kIGZpbmlzaCBzZXR0aW5nIHVwIHNjYW4gcGFyYW1ldGVycy4KKy8vIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLCBvbmUgbXVzdCBhbHdheXMgY2FsbCBWUDhFeGl0Q3JpdGljYWwoKSB3aXRoIHRoZQorLy8gc2FtZSBwYXJhbWV0ZXJzLiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbiBwYWlyLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sKKy8vIGlmIG9rLCBvdGhlcndpc2Ugc2V0cyBhbmQgcmV0dXJucyB0aGUgZXJyb3Igc3RhdHVzIG9uICpkZWMuCitWUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGluIHBhaXIgd2l0aCBWUDhFbnRlckNyaXRpY2FsKCkuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIFJldHVybiB0aGUgbXVsdGktdGhyZWFkaW5nIG1ldGhvZCB0byB1c2UgKDA9b2ZmKSwgZGVwZW5kaW5nCisvLyBvbiBvcHRpb25zIGFuZCBiaXRzdHJlYW0gc2l6ZS4gT25seSBmb3IgbG9zc3kgZGVjb2RpbmcuCitpbnQgVlA4R2V0VGhyZWFkTWV0aG9kKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKy8vIEluaXRpYWxpemUgZGl0aGVyaW5nIHBvc3QtcHJvY2VzcyBpZiBuZWVkZWQuCit2b2lkIFZQOEluaXREaXRoZXJpbmcoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBQcm9jZXNzIHRoZSBsYXN0IGRlY29kZWQgcm93IChmaWx0ZXJpbmcgKyBvdXRwdXQpLgoraW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gVG8gYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBzY2FubGluZSwgdG8gaW5pdGlhbGl6ZSBwcmVkaWN0b3JzLgordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKy8vIERlY29kZSBvbmUgbWFjcm9ibG9jay4gUmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEuCitpbnQgVlA4RGVjb2RlTUIoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyKTsKKworLy8gaW4gYWxwaGEuYworY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOElvKiBjb25zdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfREVDX1ZQOElfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NjA3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4bC5jCkBAIC0wLDAgKzEsMTY2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCisvLworLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9hbHBoYWkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9lbmRpYW5faW5sLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisjZGVmaW5lIE5VTV9BUkdCX0NBQ0hFX1JPV1MgICAgICAgICAgMTYKKworc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aExpdGVyYWxzID0gMTY7CitzdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSA9IDE2Oworc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aEV4dHJhQml0c1szXSA9IHsgMiwgMywgNyB9Oworc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbM10gPSB7IDMsIDMsIDExIH07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRml2ZSBIdWZmbWFuIGNvZGVzIGFyZSB1c2VkIGF0IGVhY2ggbWV0YSBjb2RlOgorLy8gIDEuIGdyZWVuICsgbGVuZ3RoIHByZWZpeCBjb2RlcyArIGNvbG9yIGNhY2hlIGNvZGVzLAorLy8gIDIuIGFscGhhLAorLy8gIDMuIHJlZCwKKy8vICA0LiBibHVlLCBhbmQsCisvLyAgNS4gZGlzdGFuY2UgcHJlZml4IGNvZGVzLgordHlwZWRlZiBlbnVtIHsKKyAgR1JFRU4gPSAwLAorICBSRUQgICA9IDEsCisgIEJMVUUgID0gMiwKKyAgQUxQSEEgPSAzLAorICBESVNUICA9IDQKK30gSHVmZkluZGV4OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FscGhhYmV0U2l6ZVtIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdID0geworICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsCisgIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsCisgIE5VTV9ESVNUQU5DRV9DT0RFUworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0xpdGVyYWxNYXBbSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXSA9IHsKKyAgMCwgMSwgMSwgMSwgMAorfTsKKworI2RlZmluZSBOVU1fQ09ERV9MRU5HVEhfQ09ERVMgICAgICAgMTkKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb2RlTGVuZ3RoQ29kZU9yZGVyW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7CisgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKK307CisKKyNkZWZpbmUgQ09ERV9UT19QTEFORV9DT0RFUyAgICAgICAgMTIwCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZVRvUGxhbmVbQ09ERV9UT19QTEFORV9DT0RFU10gPSB7CisgIDB4MTgsIDB4MDcsIDB4MTcsIDB4MTksIDB4MjgsIDB4MDYsIDB4MjcsIDB4MjksIDB4MTYsIDB4MWEsCisgIDB4MjYsIDB4MmEsIDB4MzgsIDB4MDUsIDB4MzcsIDB4MzksIDB4MTUsIDB4MWIsIDB4MzYsIDB4M2EsCisgIDB4MjUsIDB4MmIsIDB4NDgsIDB4MDQsIDB4NDcsIDB4NDksIDB4MTQsIDB4MWMsIDB4MzUsIDB4M2IsCisgIDB4NDYsIDB4NGEsIDB4MjQsIDB4MmMsIDB4NTgsIDB4NDUsIDB4NGIsIDB4MzQsIDB4M2MsIDB4MDMsCisgIDB4NTcsIDB4NTksIDB4MTMsIDB4MWQsIDB4NTYsIDB4NWEsIDB4MjMsIDB4MmQsIDB4NDQsIDB4NGMsCisgIDB4NTUsIDB4NWIsIDB4MzMsIDB4M2QsIDB4NjgsIDB4MDIsIDB4NjcsIDB4NjksIDB4MTIsIDB4MWUsCisgIDB4NjYsIDB4NmEsIDB4MjIsIDB4MmUsIDB4NTQsIDB4NWMsIDB4NDMsIDB4NGQsIDB4NjUsIDB4NmIsCisgIDB4MzIsIDB4M2UsIDB4NzgsIDB4MDEsIDB4NzcsIDB4NzksIDB4NTMsIDB4NWQsIDB4MTEsIDB4MWYsCisgIDB4NjQsIDB4NmMsIDB4NDIsIDB4NGUsIDB4NzYsIDB4N2EsIDB4MjEsIDB4MmYsIDB4NzUsIDB4N2IsCisgIDB4MzEsIDB4M2YsIDB4NjMsIDB4NmQsIDB4NTIsIDB4NWUsIDB4MDAsIDB4NzQsIDB4N2MsIDB4NDEsCisgIDB4NGYsIDB4MTAsIDB4MjAsIDB4NjIsIDB4NmUsIDB4MzAsIDB4NzMsIDB4N2QsIDB4NTEsIDB4NWYsCisgIDB4NDAsIDB4NzIsIDB4N2UsIDB4NjEsIDB4NmYsIDB4NTAsIDB4NzEsIDB4N2YsIDB4NjAsIDB4NzAKK307CisKKy8vIE1lbW9yeSBuZWVkZWQgZm9yIGxvb2t1cCB0YWJsZXMgb2Ygb25lIEh1ZmZtYW4gdHJlZSBncm91cC4gUmVkLCBibHVlLCBhbHBoYQorLy8gYW5kIGRpc3RhbmNlIGFscGhhYmV0cyBhcmUgY29uc3RhbnQgKDI1NiBmb3IgcmVkLCBibHVlIGFuZCBhbHBoYSwgNDAgZm9yCisvLyBkaXN0YW5jZSkgYW5kIGxvb2t1cCB0YWJsZSBzaXplcyBmb3IgdGhlbSBpbiB3b3JzdCBjYXNlIGFyZSA2MzAgYW5kIDQxMAorLy8gcmVzcGVjdGl2ZWx5LiBTaXplIG9mIGdyZWVuIGFscGhhYmV0IGRlcGVuZHMgb24gY29sb3IgY2FjaGUgc2l6ZSBhbmQgaXMgZXF1YWwKKy8vIHRvIDI1NiAoZ3JlZW4gY29tcG9uZW50IHZhbHVlcykgKyAyNCAobGVuZ3RoIHByZWZpeCB2YWx1ZXMpCisvLyArIGNvbG9yX2NhY2hlX3NpemUgKGJldHdlZW4gMCBhbmQgMjA0OCkuCisvLyBBbGwgdmFsdWVzIGNvbXB1dGVkIGZvciA4LWJpdCBmaXJzdCBsZXZlbCBsb29rdXAgd2l0aCBNYXJrIEFkbGVyJ3MgdG9vbDoKKy8vIGh0dHA6Ly93d3cuaGRmZ3JvdXAub3JnL2Z0cC9saWItZXh0ZXJuYWwvemxpYi96bGliLTEuMi41L2V4YW1wbGVzL2Vub3VnaC5jCisjZGVmaW5lIEZJWEVEX1RBQkxFX1NJWkUgKDYzMCAqIDMgKyA0MTApCitzdGF0aWMgY29uc3QgaW50IGtUYWJsZVNpemVbMTJdID0geworICBGSVhFRF9UQUJMRV9TSVpFICsgNjU0LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjU2LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjU4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjYyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjcwLAorICBGSVhFRF9UQUJMRV9TSVpFICsgNjg2LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNzE4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgNzgyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgOTEyLAorICBGSVhFRF9UQUJMRV9TSVpFICsgMTE2OCwKKyAgRklYRURfVEFCTEVfU0laRSArIDE2ODAsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyAyNzA0Cit9OworCitzdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhMQ2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIChzaXplID49IFZQOExfRlJBTUVfSEVBREVSX1NJWkUgJiYKKyAgICAgICAgICBkYXRhWzBdID09IFZQOExfTUFHSUNfQllURSAmJgorICAgICAgICAgIChkYXRhWzRdID4+IDUpID09IDApOyAgLy8gdmVyc2lvbgorfQorCitzdGF0aWMgaW50IFJlYWRJbWFnZUluZm8oVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aCwgaW50KiBjb25zdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYWxwaGEpIHsKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgOCkgIT0gVlA4TF9NQUdJQ19CWVRFKSByZXR1cm4gMDsKKyAgKndpZHRoID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOworICAqaGVpZ2h0ID0gVlA4TFJlYWRCaXRzKGJyLCBWUDhMX0lNQUdFX1NJWkVfQklUUykgKyAxOworICAqaGFzX2FscGhhID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgVlA4TF9WRVJTSU9OX0JJVFMpICE9IDApIHJldHVybiAwOworICByZXR1cm4gIWJyLT5lb3NfOworfQorCitpbnQgVlA4TEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwgaW50KiBjb25zdCBoYXNfYWxwaGEpIHsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhCisgIH0gZWxzZSBpZiAoIVZQOExDaGVja1NpZ25hdHVyZShkYXRhLCBkYXRhX3NpemUpKSB7CisgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gYmFkIHNpZ25hdHVyZQorICB9IGVsc2UgeworICAgIGludCB3LCBoLCBhOworICAgIFZQOExCaXRSZWFkZXIgYnI7CisgICAgVlA4TEluaXRCaXRSZWFkZXIoJmJyLCBkYXRhLCBkYXRhX3NpemUpOworICAgIGlmICghUmVhZEltYWdlSW5mbygmYnIsICZ3LCAmaCwgJmEpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHc7CisgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaDsKKyAgICBpZiAoaGFzX2FscGhhICE9IE5VTEwpICpoYXNfYWxwaGEgPSBhOworICAgIHJldHVybiAxOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0Q29weURpc3RhbmNlKGludCBkaXN0YW5jZV9zeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBpbnQgZXh0cmFfYml0cywgb2Zmc2V0OworICBpZiAoZGlzdGFuY2Vfc3ltYm9sIDwgNCkgeworICAgIHJldHVybiBkaXN0YW5jZV9zeW1ib2wgKyAxOworICB9CisgIGV4dHJhX2JpdHMgPSAoZGlzdGFuY2Vfc3ltYm9sIC0gMikgPj4gMTsKKyAgb2Zmc2V0ID0gKDIgKyAoZGlzdGFuY2Vfc3ltYm9sICYgMSkpIDw8IGV4dHJhX2JpdHM7CisgIHJldHVybiBvZmZzZXQgKyBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRDb3B5TGVuZ3RoKGludCBsZW5ndGhfc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIC8vIExlbmd0aCBhbmQgZGlzdGFuY2UgcHJlZml4ZXMgYXJlIGVuY29kZWQgdGhlIHNhbWUgd2F5LgorICByZXR1cm4gR2V0Q29weURpc3RhbmNlKGxlbmd0aF9zeW1ib2wsIGJyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQbGFuZUNvZGVUb0Rpc3RhbmNlKGludCB4c2l6ZSwgaW50IHBsYW5lX2NvZGUpIHsKKyAgaWYgKHBsYW5lX2NvZGUgPiBDT0RFX1RPX1BMQU5FX0NPREVTKSB7CisgICAgcmV0dXJuIHBsYW5lX2NvZGUgLSBDT0RFX1RPX1BMQU5FX0NPREVTOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBkaXN0X2NvZGUgPSBrQ29kZVRvUGxhbmVbcGxhbmVfY29kZSAtIDFdOworICAgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdF9jb2RlID4+IDQ7CisgICAgY29uc3QgaW50IHhvZmZzZXQgPSA4IC0gKGRpc3RfY29kZSAmIDB4Zik7CisgICAgY29uc3QgaW50IGRpc3QgPSB5b2Zmc2V0ICogeHNpemUgKyB4b2Zmc2V0OworICAgIHJldHVybiAoZGlzdCA+PSAxKSA/IGRpc3QgOiAxOyAgLy8gZGlzdDwxIGNhbiBoYXBwZW4gaWYgeHNpemUgaXMgdmVyeSBzbWFsbAorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGVzIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBmcm9tIGJpdC1zdHJlYW0uCisvLyBGaWxsQml0V2luZG93KGJyKSBuZWVkcyB0byBiZSBjYWxsZWQgYXQgbWluaW11bSBldmVyeSBzZWNvbmQgY2FsbAorLy8gdG8gUmVhZFN5bWJvbCwgaW4gb3JkZXIgdG8gcHJlLWZldGNoIGVub3VnaCBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkU3ltYm9sKGNvbnN0IEh1ZmZtYW5Db2RlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBpbnQgbmJpdHM7CisgIHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpOworICB0YWJsZSArPSB2YWwgJiBIVUZGTUFOX1RBQkxFX01BU0s7CisgIG5iaXRzID0gdGFibGUtPmJpdHMgLSBIVUZGTUFOX1RBQkxFX0JJVFM7CisgIGlmIChuYml0cyA+IDApIHsKKyAgICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyBIVUZGTUFOX1RBQkxFX0JJVFMpOworICAgIHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpOworICAgIHRhYmxlICs9IHRhYmxlLT52YWx1ZTsKKyAgICB0YWJsZSArPSB2YWwgJiAoKDEgPDwgbmJpdHMpIC0gMSk7CisgIH0KKyAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgdGFibGUtPmJpdHMpOworICByZXR1cm4gdGFibGUtPnZhbHVlOworfQorCisvLyBSZWFkcyBwYWNrZWQgc3ltYm9sIGRlcGVuZGluZyBvbiBHUkVFTiBjaGFubmVsCisjZGVmaW5lIEJJVFNfU1BFQ0lBTF9NQVJLRVIgMHgxMDAgIC8vIHNvbWV0aGluZyBsYXJnZSBlbm91Z2ggKGFuZCBhIGJpdC1tYXNrKQorI2RlZmluZSBQQUNLRURfTk9OX0xJVEVSQUxfQ09ERSAwICAvLyBtdXN0IGJlIDwgTlVNX0xJVEVSQUxfQ09ERVMKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUmVhZFBhY2tlZFN5bWJvbHMoY29uc3QgSFRyZWVHcm91cCogZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpICYgKEhVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkUgLSAxKTsKKyAgY29uc3QgSHVmZm1hbkNvZGUzMiBjb2RlID0gZ3JvdXAtPnBhY2tlZF90YWJsZVt2YWxdOworICBhc3NlcnQoZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUpOworICBpZiAoY29kZS5iaXRzIDwgQklUU19TUEVDSUFMX01BUktFUikgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIGNvZGUuYml0cyk7CisgICAgKmRzdCA9IGNvZGUudmFsdWU7CisgICAgcmV0dXJuIFBBQ0tFRF9OT05fTElURVJBTF9DT0RFOworICB9IGVsc2UgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIGNvZGUuYml0cyAtIEJJVFNfU1BFQ0lBTF9NQVJLRVIpOworICAgIGFzc2VydChjb2RlLnZhbHVlID49IE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICByZXR1cm4gY29kZS52YWx1ZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEFjY3VtdWxhdGVIQ29kZShIdWZmbWFuQ29kZSBoY29kZSwgaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hbkNvZGUzMiogY29uc3QgaHVmZikgeworICBodWZmLT5iaXRzICs9IGhjb2RlLmJpdHM7CisgIGh1ZmYtPnZhbHVlIHw9ICh1aW50MzJfdCloY29kZS52YWx1ZSA8PCBzaGlmdDsKKyAgYXNzZXJ0KGh1ZmYtPmJpdHMgPD0gSFVGRk1BTl9UQUJMRV9CSVRTKTsKKyAgcmV0dXJuIGhjb2RlLmJpdHM7Cit9CisKK3N0YXRpYyB2b2lkIEJ1aWxkUGFja2VkVGFibGUoSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXApIHsKKyAgdWludDMyX3QgY29kZTsKKyAgZm9yIChjb2RlID0gMDsgY29kZSA8IEhVRkZNQU5fUEFDS0VEX1RBQkxFX1NJWkU7ICsrY29kZSkgeworICAgIHVpbnQzMl90IGJpdHMgPSBjb2RlOworICAgIEh1ZmZtYW5Db2RlMzIqIGNvbnN0IGh1ZmYgPSAmaHRyZWVfZ3JvdXAtPnBhY2tlZF90YWJsZVtiaXRzXTsKKyAgICBIdWZmbWFuQ29kZSBoY29kZSA9IGh0cmVlX2dyb3VwLT5odHJlZXNbR1JFRU5dW2JpdHNdOworICAgIGlmIChoY29kZS52YWx1ZSA+PSBOVU1fTElURVJBTF9DT0RFUykgeworICAgICAgaHVmZi0+Yml0cyA9IGhjb2RlLmJpdHMgKyBCSVRTX1NQRUNJQUxfTUFSS0VSOworICAgICAgaHVmZi0+dmFsdWUgPSBoY29kZS52YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgaHVmZi0+Yml0cyA9IDA7CisgICAgICBodWZmLT52YWx1ZSA9IDA7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaGNvZGUsIDgsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbUkVEXVtiaXRzXSwgMTYsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbQkxVRV1bYml0c10sIDAsIGh1ZmYpOworICAgICAgYml0cyA+Pj0gQWNjdW11bGF0ZUhDb2RlKGh0cmVlX2dyb3VwLT5odHJlZXNbQUxQSEFdW2JpdHNdLCAyNCwgaHVmZik7CisgICAgICAodm9pZCliaXRzOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoCisgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsCisgICAgaW50IG51bV9zeW1ib2xzLCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocykgeworICBpbnQgb2sgPSAwOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgaW50IHN5bWJvbDsKKyAgaW50IG1heF9zeW1ib2w7CisgIGludCBwcmV2X2NvZGVfbGVuID0gREVGQVVMVF9DT0RFX0xFTkdUSDsKKyAgSHVmZm1hbkNvZGUgdGFibGVbMSA8PCBMRU5HVEhTX1RBQkxFX0JJVFNdOworCisgIGlmICghVlA4TEJ1aWxkSHVmZm1hblRhYmxlKHRhYmxlLCBMRU5HVEhTX1RBQkxFX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVNX0NPREVfTEVOR1RIX0NPREVTKSkgeworICAgIGdvdG8gRW5kOworICB9CisKKyAgaWYgKFZQOExSZWFkQml0cyhiciwgMSkpIHsgICAgLy8gdXNlIGxlbmd0aAorICAgIGNvbnN0IGludCBsZW5ndGhfbmJpdHMgPSAyICsgMiAqIFZQOExSZWFkQml0cyhiciwgMyk7CisgICAgbWF4X3N5bWJvbCA9IDIgKyBWUDhMUmVhZEJpdHMoYnIsIGxlbmd0aF9uYml0cyk7CisgICAgaWYgKG1heF9zeW1ib2wgPiBudW1fc3ltYm9scykgeworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9IGVsc2UgeworICAgIG1heF9zeW1ib2wgPSBudW1fc3ltYm9sczsKKyAgfQorCisgIHN5bWJvbCA9IDA7CisgIHdoaWxlIChzeW1ib2wgPCBudW1fc3ltYm9scykgeworICAgIGNvbnN0IEh1ZmZtYW5Db2RlKiBwOworICAgIGludCBjb2RlX2xlbjsKKyAgICBpZiAobWF4X3N5bWJvbC0tID09IDApIGJyZWFrOworICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICBwID0gJnRhYmxlW1ZQOExQcmVmZXRjaEJpdHMoYnIpICYgTEVOR1RIU19UQUJMRV9NQVNLXTsKKyAgICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyBwLT5iaXRzKTsKKyAgICBjb2RlX2xlbiA9IHAtPnZhbHVlOworICAgIGlmIChjb2RlX2xlbiA8IGtDb2RlTGVuZ3RoTGl0ZXJhbHMpIHsKKyAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2wrK10gPSBjb2RlX2xlbjsKKyAgICAgIGlmIChjb2RlX2xlbiAhPSAwKSBwcmV2X2NvZGVfbGVuID0gY29kZV9sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IGludCB1c2VfcHJldiA9IChjb2RlX2xlbiA9PSBrQ29kZUxlbmd0aFJlcGVhdENvZGUpOworICAgICAgY29uc3QgaW50IHNsb3QgPSBjb2RlX2xlbiAtIGtDb2RlTGVuZ3RoTGl0ZXJhbHM7CisgICAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IGtDb2RlTGVuZ3RoRXh0cmFCaXRzW3Nsb3RdOworICAgICAgY29uc3QgaW50IHJlcGVhdF9vZmZzZXQgPSBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbc2xvdF07CisgICAgICBpbnQgcmVwZWF0ID0gVlA4TFJlYWRCaXRzKGJyLCBleHRyYV9iaXRzKSArIHJlcGVhdF9vZmZzZXQ7CisgICAgICBpZiAoc3ltYm9sICsgcmVwZWF0ID4gbnVtX3N5bWJvbHMpIHsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gdXNlX3ByZXYgPyBwcmV2X2NvZGVfbGVuIDogMDsKKyAgICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGxlbmd0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgb2sgPSAxOworCisgRW5kOgorICBpZiAoIW9rKSBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgcmV0dXJuIG9rOworfQorCisvLyAnY29kZV9sZW5ndGhzJyBpcyBwcmUtYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIsIHVzZWQgZm9yIGNyZWF0aW5nIEh1ZmZtYW4KKy8vIHRyZWUuCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZShpbnQgYWxwaGFiZXRfc2l6ZSwgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgY29kZV9sZW5ndGhzLCBIdWZmbWFuQ29kZSogY29uc3QgdGFibGUpIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IHNpemUgPSAwOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3QgaW50IHNpbXBsZV9jb2RlID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKworICBtZW1zZXQoY29kZV9sZW5ndGhzLCAwLCBhbHBoYWJldF9zaXplICogc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKKworICBpZiAoc2ltcGxlX2NvZGUpIHsgIC8vIFJlYWQgc3ltYm9scywgY29kZXMgJiBjb2RlIGxlbmd0aHMgZGlyZWN0bHkuCisgICAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gVlA4TFJlYWRCaXRzKGJyLCAxKSArIDE7CisgICAgY29uc3QgaW50IGZpcnN0X3N5bWJvbF9sZW5fY29kZSA9IFZQOExSZWFkQml0cyhiciwgMSk7CisgICAgLy8gVGhlIGZpcnN0IGNvZGUgaXMgZWl0aGVyIDEgYml0IG9yIDggYml0IGNvZGUuCisgICAgaW50IHN5bWJvbCA9IFZQOExSZWFkQml0cyhiciwgKGZpcnN0X3N5bWJvbF9sZW5fY29kZSA9PSAwKSA/IDEgOiA4KTsKKyAgICBjb2RlX2xlbmd0aHNbc3ltYm9sXSA9IDE7CisgICAgLy8gVGhlIHNlY29uZCBjb2RlIChpZiBwcmVzZW50KSwgaXMgYWx3YXlzIDggYml0IGxvbmcuCisgICAgaWYgKG51bV9zeW1ib2xzID09IDIpIHsKKyAgICAgIHN5bWJvbCA9IFZQOExSZWFkQml0cyhiciwgOCk7CisgICAgICBjb2RlX2xlbmd0aHNbc3ltYm9sXSA9IDE7CisgICAgfQorICAgIG9rID0gMTsKKyAgfSBlbHNlIHsgIC8vIERlY29kZSBIdWZmbWFuLWNvZGVkIGNvZGUgbGVuZ3Rocy4KKyAgICBpbnQgaTsKKyAgICBpbnQgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgICBjb25zdCBpbnQgbnVtX2NvZGVzID0gVlA4TFJlYWRCaXRzKGJyLCA0KSArIDQ7CisgICAgaWYgKG51bV9jb2RlcyA+IE5VTV9DT0RFX0xFTkdUSF9DT0RFUykgeworICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZGVzOyArK2kpIHsKKyAgICAgIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3Roc1trQ29kZUxlbmd0aENvZGVPcmRlcltpXV0gPSBWUDhMUmVhZEJpdHMoYnIsIDMpOworICAgIH0KKyAgICBvayA9IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoZGVjLCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3Rocyk7CisgIH0KKworICBvayA9IG9rICYmICFici0+ZW9zXzsKKyAgaWYgKG9rKSB7CisgICAgc2l6ZSA9IFZQOExCdWlsZEh1ZmZtYW5UYWJsZSh0YWJsZSwgSFVGRk1BTl9UQUJMRV9CSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzLCBhbHBoYWJldF9zaXplKTsKKyAgfQorICBpZiAoIW9rIHx8IHNpemUgPT0gMCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX2NhY2hlX2JpdHMsIGludCBhbGxvd19yZWN1cnNpb24pIHsKKyAgaW50IGksIGo7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIHVpbnQzMl90KiBodWZmbWFuX2ltYWdlID0gTlVMTDsKKyAgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzID0gTlVMTDsKKyAgSHVmZm1hbkNvZGUqIGh1ZmZtYW5fdGFibGVzID0gTlVMTDsKKyAgSHVmZm1hbkNvZGUqIG5leHQgPSBOVUxMOworICBpbnQgbnVtX2h0cmVlX2dyb3VwcyA9IDE7CisgIGludCBtYXhfYWxwaGFiZXRfc2l6ZSA9IDA7CisgIGludCogY29kZV9sZW5ndGhzID0gTlVMTDsKKyAgY29uc3QgaW50IHRhYmxlX3NpemUgPSBrVGFibGVTaXplW2NvbG9yX2NhY2hlX2JpdHNdOworCisgIGlmIChhbGxvd19yZWN1cnNpb24gJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgeworICAgIC8vIHVzZSBtZXRhIEh1ZmZtYW4gY29kZXMuCisgICAgY29uc3QgaW50IGh1ZmZtYW5fcHJlY2lzaW9uID0gVlA4TFJlYWRCaXRzKGJyLCAzKSArIDI7CisgICAgY29uc3QgaW50IGh1ZmZtYW5feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOworICAgIGNvbnN0IGludCBodWZmbWFuX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGh1ZmZtYW5fcHJlY2lzaW9uKTsKKyAgICBjb25zdCBpbnQgaHVmZm1hbl9waXhzID0gaHVmZm1hbl94c2l6ZSAqIGh1ZmZtYW5feXNpemU7CisgICAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShodWZmbWFuX3hzaXplLCBodWZmbWFuX3lzaXplLCAwLCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVmZm1hbl9pbWFnZSkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c18gPSBodWZmbWFuX3ByZWNpc2lvbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaHVmZm1hbl9waXhzOyArK2kpIHsKKyAgICAgIC8vIFRoZSBodWZmbWFuIGRhdGEgaXMgc3RvcmVkIGluIHJlZCBhbmQgZ3JlZW4gYnl0ZXMuCisgICAgICBjb25zdCBpbnQgZ3JvdXAgPSAoaHVmZm1hbl9pbWFnZVtpXSA+PiA4KSAmIDB4ZmZmZjsKKyAgICAgIGh1ZmZtYW5faW1hZ2VbaV0gPSBncm91cDsKKyAgICAgIGlmIChncm91cCA+PSBudW1faHRyZWVfZ3JvdXBzKSB7CisgICAgICAgIG51bV9odHJlZV9ncm91cHMgPSBncm91cCArIDE7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGJyLT5lb3NfKSBnb3RvIEVycm9yOworCisgIC8vIEZpbmQgbWF4aW11bSBhbHBoYWJldCBzaXplIGZvciB0aGUgaHRyZWUgZ3JvdXAuCisgIGZvciAoaiA9IDA7IGogPCBIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREU7ICsraikgeworICAgIGludCBhbHBoYWJldF9zaXplID0ga0FscGhhYmV0U2l6ZVtqXTsKKyAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7CisgICAgICBhbHBoYWJldF9zaXplICs9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKKyAgICB9CisgICAgaWYgKG1heF9hbHBoYWJldF9zaXplIDwgYWxwaGFiZXRfc2l6ZSkgeworICAgICAgbWF4X2FscGhhYmV0X3NpemUgPSBhbHBoYWJldF9zaXplOworICAgIH0KKyAgfQorCisgIGh1ZmZtYW5fdGFibGVzID0gKEh1ZmZtYW5Db2RlKilXZWJQU2FmZU1hbGxvYyhudW1faHRyZWVfZ3JvdXBzICogdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZm1hbl90YWJsZXMpKTsKKyAgaHRyZWVfZ3JvdXBzID0gVlA4TEh0cmVlR3JvdXBzTmV3KG51bV9odHJlZV9ncm91cHMpOworICBjb2RlX2xlbmd0aHMgPSAoaW50KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpbWF4X2FscGhhYmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY29kZV9sZW5ndGhzKSk7CisKKyAgaWYgKGh0cmVlX2dyb3VwcyA9PSBOVUxMIHx8IGNvZGVfbGVuZ3RocyA9PSBOVUxMIHx8IGh1ZmZtYW5fdGFibGVzID09IE5VTEwpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIG5leHQgPSBodWZmbWFuX3RhYmxlczsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9odHJlZV9ncm91cHM7ICsraSkgeworICAgIEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3VwID0gJmh0cmVlX2dyb3Vwc1tpXTsKKyAgICBIdWZmbWFuQ29kZSoqIGNvbnN0IGh0cmVlcyA9IGh0cmVlX2dyb3VwLT5odHJlZXM7CisgICAgaW50IHNpemU7CisgICAgaW50IHRvdGFsX3NpemUgPSAwOworICAgIGludCBpc190cml2aWFsX2xpdGVyYWwgPSAxOworICAgIGludCBtYXhfYml0cyA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7CisgICAgICBpbnQgYWxwaGFiZXRfc2l6ZSA9IGtBbHBoYWJldFNpemVbal07CisgICAgICBodHJlZXNbal0gPSBuZXh0OworICAgICAgaWYgKGogPT0gMCAmJiBjb2xvcl9jYWNoZV9iaXRzID4gMCkgeworICAgICAgICBhbHBoYWJldF9zaXplICs9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKKyAgICAgIH0KKyAgICAgIHNpemUgPSBSZWFkSHVmZm1hbkNvZGUoYWxwaGFiZXRfc2l6ZSwgZGVjLCBjb2RlX2xlbmd0aHMsIG5leHQpOworICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgICAgaWYgKGlzX3RyaXZpYWxfbGl0ZXJhbCAmJiBrTGl0ZXJhbE1hcFtqXSA9PSAxKSB7CisgICAgICAgIGlzX3RyaXZpYWxfbGl0ZXJhbCA9IChuZXh0LT5iaXRzID09IDApOworICAgICAgfQorICAgICAgdG90YWxfc2l6ZSArPSBuZXh0LT5iaXRzOworICAgICAgbmV4dCArPSBzaXplOworICAgICAgaWYgKGogPD0gQUxQSEEpIHsKKyAgICAgICAgaW50IGxvY2FsX21heF9iaXRzID0gY29kZV9sZW5ndGhzWzBdOworICAgICAgICBpbnQgazsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IGFscGhhYmV0X3NpemU7ICsraykgeworICAgICAgICAgIGlmIChjb2RlX2xlbmd0aHNba10gPiBsb2NhbF9tYXhfYml0cykgeworICAgICAgICAgICAgbG9jYWxfbWF4X2JpdHMgPSBjb2RlX2xlbmd0aHNba107CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1heF9iaXRzICs9IGxvY2FsX21heF9iaXRzOworICAgICAgfQorICAgIH0KKyAgICBodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9saXRlcmFsID0gaXNfdHJpdmlhbF9saXRlcmFsOworICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUgPSAwOworICAgIGlmIChpc190cml2aWFsX2xpdGVyYWwpIHsKKyAgICAgIGNvbnN0IGludCByZWQgPSBodHJlZXNbUkVEXVswXS52YWx1ZTsKKyAgICAgIGNvbnN0IGludCBibHVlID0gaHRyZWVzW0JMVUVdWzBdLnZhbHVlOworICAgICAgY29uc3QgaW50IGFscGhhID0gaHRyZWVzW0FMUEhBXVswXS52YWx1ZTsKKyAgICAgIGh0cmVlX2dyb3VwLT5saXRlcmFsX2FyYiA9CisgICAgICAgICAgKCh1aW50MzJfdClhbHBoYSA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IGJsdWU7CisgICAgICBpZiAodG90YWxfc2l6ZSA9PSAwICYmIGh0cmVlc1tHUkVFTl1bMF0udmFsdWUgPCBOVU1fTElURVJBTF9DT0RFUykgeworICAgICAgICBodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9jb2RlID0gMTsKKyAgICAgICAgaHRyZWVfZ3JvdXAtPmxpdGVyYWxfYXJiIHw9IGh0cmVlc1tHUkVFTl1bMF0udmFsdWUgPDwgODsKKyAgICAgIH0KKyAgICB9CisgICAgaHRyZWVfZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUgPSAhaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heF9iaXRzIDwgSFVGRk1BTl9QQUNLRURfQklUUyk7CisgICAgaWYgKGh0cmVlX2dyb3VwLT51c2VfcGFja2VkX3RhYmxlKSBCdWlsZFBhY2tlZFRhYmxlKGh0cmVlX2dyb3VwKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoY29kZV9sZW5ndGhzKTsKKworICAvLyBBbGwgT0suIEZpbmFsaXplIHBvaW50ZXJzIGFuZCByZXR1cm4uCisgIGhkci0+aHVmZm1hbl9pbWFnZV8gPSBodWZmbWFuX2ltYWdlOworICBoZHItPm51bV9odHJlZV9ncm91cHNfID0gbnVtX2h0cmVlX2dyb3VwczsKKyAgaGRyLT5odHJlZV9ncm91cHNfID0gaHRyZWVfZ3JvdXBzOworICBoZHItPmh1ZmZtYW5fdGFibGVzXyA9IGh1ZmZtYW5fdGFibGVzOworICByZXR1cm4gMTsKKworIEVycm9yOgorICBXZWJQU2FmZUZyZWUoY29kZV9sZW5ndGhzKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5faW1hZ2UpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl90YWJsZXMpOworICBWUDhMSHRyZWVHcm91cHNGcmVlKGh0cmVlX2dyb3Vwcyk7CisgIHJldHVybiAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2NhbGluZy4KKworc3RhdGljIGludCBBbGxvY2F0ZUFuZEluaXRSZXNjYWxlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgY29uc3QgaW50IG51bV9jaGFubmVscyA9IDQ7CisgIGNvbnN0IGludCBpbl93aWR0aCA9IGlvLT5tYl93OworICBjb25zdCBpbnQgb3V0X3dpZHRoID0gaW8tPnNjYWxlZF93aWR0aDsKKyAgY29uc3QgaW50IGluX2hlaWdodCA9IGlvLT5tYl9oOworICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OworICBjb25zdCB1aW50NjRfdCB3b3JrX3NpemUgPSAyICogbnVtX2NoYW5uZWxzICogKHVpbnQ2NF90KW91dF93aWR0aDsKKyAgcmVzY2FsZXJfdCogd29yazsgICAgICAgIC8vIFJlc2NhbGVyIHdvcmsgYXJlYS4KKyAgY29uc3QgdWludDY0X3Qgc2NhbGVkX2RhdGFfc2l6ZSA9ICh1aW50NjRfdClvdXRfd2lkdGg7CisgIHVpbnQzMl90KiBzY2FsZWRfZGF0YTsgIC8vIFRlbXBvcmFyeSBzdG9yYWdlIGZvciBzY2FsZWQgQkdSQSBkYXRhLgorICBjb25zdCB1aW50NjRfdCBtZW1vcnlfc2l6ZSA9IHNpemVvZigqZGVjLT5yZXNjYWxlcikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfc2l6ZSAqIHNpemVvZigqd29yaykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZF9kYXRhX3NpemUgKiBzaXplb2YoKnNjYWxlZF9kYXRhKTsKKyAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKG1lbW9yeV9zaXplLCBzaXplb2YoKm1lbW9yeSkpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgYXNzZXJ0KGRlYy0+cmVzY2FsZXJfbWVtb3J5ID09IE5VTEwpOworICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IG1lbW9yeTsKKworICBkZWMtPnJlc2NhbGVyID0gKFdlYlBSZXNjYWxlciopbWVtb3J5OworICBtZW1vcnkgKz0gc2l6ZW9mKCpkZWMtPnJlc2NhbGVyKTsKKyAgd29yayA9IChyZXNjYWxlcl90KiltZW1vcnk7CisgIG1lbW9yeSArPSB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspOworICBzY2FsZWRfZGF0YSA9ICh1aW50MzJfdCopbWVtb3J5OworCisgIFdlYlBSZXNjYWxlckluaXQoZGVjLT5yZXNjYWxlciwgaW5fd2lkdGgsIGluX2hlaWdodCwgKHVpbnQ4X3QqKXNjYWxlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgbnVtX2NoYW5uZWxzLCB3b3JrKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHBvcnQgdG8gQVJHQgorCisvLyBXZSBoYXZlIHNwZWNpYWwgImV4cG9ydCIgZnVuY3Rpb24gc2luY2Ugd2UgbmVlZCB0byBjb252ZXJ0IGZyb20gQkdSQQorc3RhdGljIGludCBFeHBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgaW50IHJnYmFfc3RyaWRlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIHVpbnQzMl90KiBjb25zdCBzcmMgPSAodWludDMyX3QqKXJlc2NhbGVyLT5kc3Q7CisgIGNvbnN0IGludCBkc3Rfd2lkdGggPSByZXNjYWxlci0+ZHN0X3dpZHRoOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHJnYmEgKyBudW1fbGluZXNfb3V0ICogcmdiYV9zdHJpZGU7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKKyAgICBXZWJQTXVsdEFSR0JSb3coc3JjLCBkc3Rfd2lkdGgsIDEpOworICAgIFZQOExDb252ZXJ0RnJvbUJHUkEoc3JjLCBkc3Rfd2lkdGgsIGNvbG9yc3BhY2UsIGRzdCk7CisgICAgKytudW1fbGluZXNfb3V0OworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCisvLyBFbWl0IHNjYWxlZCByb3dzLgorc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzUkdCQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IG91dF9zdHJpZGUpIHsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gZGVjLT5vdXRwdXRfLT5jb2xvcnNwYWNlOworICBpbnQgbnVtX2xpbmVzX2luID0gMDsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICB3aGlsZSAobnVtX2xpbmVzX2luIDwgbWJfaCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHJvd19pbiA9IGluICsgbnVtX2xpbmVzX2luICogaW5fc3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IHJvd19vdXQgPSBvdXQgKyBudW1fbGluZXNfb3V0ICogb3V0X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgbGluZXNfbGVmdCA9IG1iX2ggLSBudW1fbGluZXNfaW47CisgICAgY29uc3QgaW50IG5lZWRlZF9saW5lcyA9IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCk7CisgICAgYXNzZXJ0KG5lZWRlZF9saW5lcyA+IDAgJiYgbmVlZGVkX2xpbmVzIDw9IGxpbmVzX2xlZnQpOworICAgIFdlYlBNdWx0QVJHQlJvd3Mocm93X2luLCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBkZWMtPnJlc2NhbGVyLT5zcmNfd2lkdGgsIG5lZWRlZF9saW5lcywgMCk7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQsIHJvd19pbiwgaW5fc3RyaWRlKTsKKyAgICBudW1fbGluZXNfaW4gKz0gbmVlZGVkX2xpbmVzOworICAgIG51bV9saW5lc19vdXQgKz0gRXhwb3J0KGRlYy0+cmVzY2FsZXIsIGNvbG9yc3BhY2UsIG91dF9zdHJpZGUsIHJvd19vdXQpOworICB9CisgIHJldHVybiBudW1fbGluZXNfb3V0OworfQorCisvLyBFbWl0IHJvd3Mgd2l0aG91dCBhbnkgc2NhbGluZy4KK3N0YXRpYyBpbnQgRW1pdFJvd3MoV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByb3dfaW4sIGludCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbWJfaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgeworICBpbnQgbGluZXMgPSBtYl9oOworICB1aW50OF90KiByb3dfb3V0ID0gb3V0OworICB3aGlsZSAobGluZXMtLSA+IDApIHsKKyAgICBWUDhMQ29udmVydEZyb21CR1JBKChjb25zdCB1aW50MzJfdCopcm93X2luLCBtYl93LCBjb2xvcnNwYWNlLCByb3dfb3V0KTsKKyAgICByb3dfaW4gKz0gaW5fc3RyaWRlOworICAgIHJvd19vdXQgKz0gb3V0X3N0cmlkZTsKKyAgfQorICByZXR1cm4gbWJfaDsgIC8vIE51bSByb3dzIG91dCA9PSBudW0gcm93cyBpbi4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4cG9ydCB0byBZVVZBCisKK3N0YXRpYyB2b2lkIENvbnZlcnRUb1lVVkEoY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywgaW50IHdpZHRoLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCkgeworICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5ZVVZBOworCisgIC8vIGZpcnN0LCB0aGUgbHVtYSBwbGFuZQorICBXZWJQQ29udmVydEFSR0JUb1koc3JjLCBidWYtPnkgKyB5X3BvcyAqIGJ1Zi0+eV9zdHJpZGUsIHdpZHRoKTsKKworICAvLyB0aGVuIFUvViBwbGFuZXMKKyAgeworICAgIHVpbnQ4X3QqIGNvbnN0IHUgPSBidWYtPnUgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnVfc3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBidWYtPnYgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnZfc3RyaWRlOworICAgIC8vIGV2ZW4gbGluZXM6IHN0b3JlIHZhbHVlcworICAgIC8vIG9kZCBsaW5lczogYXZlcmFnZSB3aXRoIHByZXZpb3VzIHZhbHVlcworICAgIFdlYlBDb252ZXJ0QVJHQlRvVVYoc3JjLCB1LCB2LCB3aWR0aCwgISh5X3BvcyAmIDEpKTsKKyAgfQorICAvLyBMYXN0bHksIHN0b3JlIGFscGhhIGlmIG5lZWRlZC4KKyAgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgdWludDhfdCogY29uc3QgYSA9IGJ1Zi0+YSArIHlfcG9zICogYnVmLT5hX3N0cmlkZTsKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgICBXZWJQRXh0cmFjdEFscGhhKCh1aW50OF90KilzcmMgKyAwLCAwLCB3aWR0aCwgMSwgYSwgMCk7CisjZWxzZQorICAgIFdlYlBFeHRyYWN0QWxwaGEoKHVpbnQ4X3QqKXNyYyArIDMsIDAsIHdpZHRoLCAxLCBhLCAwKTsKKyNlbmRpZgorICB9Cit9CisKK3N0YXRpYyBpbnQgRXhwb3J0WVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgeV9wb3MpIHsKKyAgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciA9IGRlYy0+cmVzY2FsZXI7CisgIHVpbnQzMl90KiBjb25zdCBzcmMgPSAodWludDMyX3QqKXJlc2NhbGVyLT5kc3Q7CisgIGNvbnN0IGludCBkc3Rfd2lkdGggPSByZXNjYWxlci0+ZHN0X3dpZHRoOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7CisgICAgV2ViUE11bHRBUkdCUm93KHNyYywgZHN0X3dpZHRoLCAxKTsKKyAgICBDb252ZXJ0VG9ZVVZBKHNyYywgZHN0X3dpZHRoLCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKKyAgICArK3lfcG9zOworICAgICsrbnVtX2xpbmVzX291dDsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gpIHsKKyAgaW50IG51bV9saW5lc19pbiA9IDA7CisgIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgd2hpbGUgKG51bV9saW5lc19pbiA8IG1iX2gpIHsKKyAgICBjb25zdCBpbnQgbGluZXNfbGVmdCA9IG1iX2ggLSBudW1fbGluZXNfaW47CisgICAgY29uc3QgaW50IG5lZWRlZF9saW5lcyA9IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCk7CisgICAgV2ViUE11bHRBUkdCUm93cyhpbiwgaW5fc3RyaWRlLCBkZWMtPnJlc2NhbGVyLT5zcmNfd2lkdGgsIG5lZWRlZF9saW5lcywgMCk7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQsIGluLCBpbl9zdHJpZGUpOworICAgIG51bV9saW5lc19pbiArPSBuZWVkZWRfbGluZXM7CisgICAgaW4gKz0gbmVlZGVkX2xpbmVzICogaW5fc3RyaWRlOworICAgIHlfcG9zICs9IEV4cG9ydFlVVkEoZGVjLCB5X3Bvcyk7CisgIH0KKyAgcmV0dXJuIHlfcG9zOworfQorCitzdGF0aWMgaW50IEVtaXRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW4sIGludCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdywgaW50IG51bV9yb3dzKSB7CisgIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgd2hpbGUgKG51bV9yb3dzLS0gPiAwKSB7CisgICAgQ29udmVydFRvWVVWQSgoY29uc3QgdWludDMyX3QqKWluLCBtYl93LCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKKyAgICBpbiArPSBpbl9zdHJpZGU7CisgICAgKyt5X3BvczsKKyAgfQorICByZXR1cm4geV9wb3M7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcm9wcGluZy4KKworLy8gU2V0cyBpby0+bWJfeSwgaW8tPm1iX2ggJiBpby0+bWJfdyBhY2NvcmRpbmcgdG8gc3RhcnQgcm93LCBlbmQgcm93IGFuZAorLy8gY3JvcCBvcHRpb25zLiBBbHNvIHVwZGF0ZXMgdGhlIGlucHV0IGRhdGEgcG9pbnRlciwgc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlCisvLyBzdGFydCBvZiB0aGUgY3JvcHBlZCB3aW5kb3cuIE5vdGUgdGhhdCBwaXhlbHMgYXJlIGluIEFSR0IgZm9ybWF0IGV2ZW4gaWYKKy8vICdpbl9kYXRhJyBpcyB1aW50OF90Ki4KKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3JvcCB3aW5kb3cgaXMgbm90IGVtcHR5Lgorc3RhdGljIGludCBTZXRDcm9wV2luZG93KFZQOElvKiBjb25zdCBpbywgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogY29uc3QgaW5fZGF0YSwgaW50IHBpeGVsX3N0cmlkZSkgeworICBhc3NlcnQoeV9zdGFydCA8IHlfZW5kKTsKKyAgYXNzZXJ0KGlvLT5jcm9wX2xlZnQgPCBpby0+Y3JvcF9yaWdodCk7CisgIGlmICh5X2VuZCA+IGlvLT5jcm9wX2JvdHRvbSkgeworICAgIHlfZW5kID0gaW8tPmNyb3BfYm90dG9tOyAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IG9uIGxhc3Qgcm93LgorICB9CisgIGlmICh5X3N0YXJ0IDwgaW8tPmNyb3BfdG9wKSB7CisgICAgY29uc3QgaW50IGRlbHRhID0gaW8tPmNyb3BfdG9wIC0geV9zdGFydDsKKyAgICB5X3N0YXJ0ID0gaW8tPmNyb3BfdG9wOworICAgICppbl9kYXRhICs9IGRlbHRhICogcGl4ZWxfc3RyaWRlOworICB9CisgIGlmICh5X3N0YXJ0ID49IHlfZW5kKSByZXR1cm4gMDsgIC8vIENyb3Agd2luZG93IGlzIGVtcHR5LgorCisgICppbl9kYXRhICs9IGlvLT5jcm9wX2xlZnQgKiBzaXplb2YodWludDMyX3QpOworCisgIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKKyAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7CisgIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OworICByZXR1cm4gMTsgIC8vIE5vbi1lbXB0eSBjcm9wIHdpbmRvdy4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNZXRhSW5kZXgoCisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgeHNpemUsIGludCBiaXRzLCBpbnQgeCwgaW50IHkpIHsKKyAgaWYgKGJpdHMgPT0gMCkgcmV0dXJuIDA7CisgIHJldHVybiBpbWFnZVt4c2l6ZSAqICh5ID4+IGJpdHMpICsgKHggPj4gYml0cyldOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgSFRyZWVHcm91cCogR2V0SHRyZWVHcm91cEZvclBvcyhWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgeworICBjb25zdCBpbnQgbWV0YV9pbmRleCA9IEdldE1ldGFJbmRleChoZHItPmh1ZmZtYW5faW1hZ2VfLCBoZHItPmh1ZmZtYW5feHNpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfLCB4LCB5KTsKKyAgYXNzZXJ0KG1ldGFfaW5kZXggPCBoZHItPm51bV9odHJlZV9ncm91cHNfKTsKKyAgcmV0dXJuIGhkci0+aHRyZWVfZ3JvdXBzXyArIG1ldGFfaW5kZXg7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3AsIHdpdGggY3VzdG9tIHJvdy1wcm9jZXNzaW5nIGZ1bmN0aW9uCisKK3R5cGVkZWYgdm9pZCAoKlByb2Nlc3NSb3dzRnVuYykoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdyk7CisKK3N0YXRpYyB2b2lkIEFwcGx5SW52ZXJzZVRyYW5zZm9ybXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cykgeworICBpbnQgbiA9IGRlYy0+bmV4dF90cmFuc2Zvcm1fOworICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IGRlYy0+d2lkdGhfICogbnVtX3Jvd3M7CisgIGNvbnN0IGludCBzdGFydF9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKKyAgY29uc3QgaW50IGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKKyAgY29uc3QgdWludDMyX3QqIHJvd3NfaW4gPSByb3dzOworICB1aW50MzJfdCogY29uc3Qgcm93c19vdXQgPSBkZWMtPmFyZ2JfY2FjaGVfOworCisgIC8vIEludmVyc2UgdHJhbnNmb3Jtcy4KKyAgLy8gVE9ETzogbW9zdCB0cmFuc2Zvcm1zIG9ubHkgbmVlZCB0byBvcGVyYXRlIG9uIHRoZSBjcm9wcGVkIHJlZ2lvbiBvbmx5LgorICBtZW1jcHkocm93c19vdXQsIHJvd3NfaW4sIGNhY2hlX3BpeHMgKiBzaXplb2YoKnJvd3Nfb3V0KSk7CisgIHdoaWxlIChuLS0gPiAwKSB7CisgICAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bbl07CisgICAgVlA4TEludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCBzdGFydF9yb3csIGVuZF9yb3csIHJvd3NfaW4sIHJvd3Nfb3V0KTsKKyAgICByb3dzX2luID0gcm93c19vdXQ7CisgIH0KK30KKworLy8gUHJvY2Vzc2VzICh0cmFuc2Zvcm1zLCBzY2FsZXMgJiBjb2xvci1jb252ZXJ0cykgdGhlIHJvd3MgZGVjb2RlZCBhZnRlciB0aGUKKy8vIGxhc3QgY2FsbC4KK3N0YXRpYyB2b2lkIFByb2Nlc3NSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJvd3MgPSBkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKKworICBhc3NlcnQocm93IDw9IGRlYy0+aW9fLT5jcm9wX2JvdHRvbSk7CisgIC8vIFdlIGNhbid0IHByb2Nlc3MgbW9yZSB0aGFuIE5VTV9BUkdCX0NBQ0hFX1JPV1MgYXQgYSB0aW1lICh0aGF0J3MgdGhlIHNpemUKKyAgLy8gb2YgYXJnYl9jYWNoZV8pLCBidXQgd2UgY3VycmVudGx5IGRvbid0IG5lZWQgbW9yZSB0aGFuIHRoYXQuCisgIGFzc2VydChudW1fcm93cyA8PSBOVU1fQVJHQl9DQUNIRV9ST1dTKTsKKyAgaWYgKG51bV9yb3dzID4gMCkgeyAgICAvLyBFbWl0IG91dHB1dC4KKyAgICBWUDhJbyogY29uc3QgaW8gPSBkZWMtPmlvXzsKKyAgICB1aW50OF90KiByb3dzX2RhdGEgPSAodWludDhfdCopZGVjLT5hcmdiX2NhY2hlXzsKKyAgICBjb25zdCBpbnQgaW5fc3RyaWRlID0gaW8tPndpZHRoICogc2l6ZW9mKHVpbnQzMl90KTsgIC8vIGluIHVuaXQgb2YgUkdCQQorCisgICAgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhkZWMsIG51bV9yb3dzLCByb3dzKTsKKyAgICBpZiAoIVNldENyb3BXaW5kb3coaW8sIGRlYy0+bGFzdF9yb3dfLCByb3csICZyb3dzX2RhdGEsIGluX3N0cmlkZSkpIHsKKyAgICAgIC8vIE5vdGhpbmcgdG8gb3V0cHV0ICh0aGlzIHRpbWUpLgorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBkZWMtPm91dHB1dF87CisgICAgICBpZiAoV2ViUElzUkdCTW9kZShvdXRwdXQtPmNvbG9yc3BhY2UpKSB7ICAvLyBjb252ZXJ0IHRvIFJHQkEKKyAgICAgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuUkdCQTsKKyAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSA9IGJ1Zi0+cmdiYSArIGRlYy0+bGFzdF9vdXRfcm93XyAqIGJ1Zi0+c3RyaWRlOworICAgICAgICBjb25zdCBpbnQgbnVtX3Jvd3Nfb3V0ID0gaW8tPnVzZV9zY2FsaW5nID8KKyAgICAgICAgICAgIEVtaXRSZXNjYWxlZFJvd3NSR0JBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSwgYnVmLT5zdHJpZGUpIDoKKyAgICAgICAgICAgIEVtaXRSb3dzKG91dHB1dC0+Y29sb3JzcGFjZSwgcm93c19kYXRhLCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgaW8tPm1iX2gsIHJnYmEsIGJ1Zi0+c3RyaWRlKTsKKyAgICAgICAgLy8gVXBkYXRlICdsYXN0X291dF9yb3dfJy4KKyAgICAgICAgZGVjLT5sYXN0X291dF9yb3dfICs9IG51bV9yb3dzX291dDsKKyAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byBZVVZBCisgICAgICAgIGRlYy0+bGFzdF9vdXRfcm93XyA9IGlvLT51c2Vfc2NhbGluZyA/CisgICAgICAgICAgICBFbWl0UmVzY2FsZWRSb3dzWVVWQShkZWMsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLCBpby0+bWJfaCkgOgorICAgICAgICAgICAgRW1pdFJvd3NZVVZBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl93LCBpby0+bWJfaCk7CisgICAgICB9CisgICAgICBhc3NlcnQoZGVjLT5sYXN0X291dF9yb3dfIDw9IG91dHB1dC0+aGVpZ2h0KTsKKyAgICB9CisgIH0KKworICAvLyBVcGRhdGUgJ2xhc3Rfcm93XycuCisgIGRlYy0+bGFzdF9yb3dfID0gcm93OworICBhc3NlcnQoZGVjLT5sYXN0X3Jvd18gPD0gZGVjLT5oZWlnaHRfKTsKK30KKworLy8gUm93LXByb2Nlc3NpbmcgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlbiBhbHBoYSBkYXRhIGNvbnRhaW5zIG9ubHkgb25lCisvLyB0cmFuc2Zvcm0gKGNvbG9yIGluZGV4aW5nKSwgYW5kIHRyaXZpYWwgbm9uLWdyZWVuIGxpdGVyYWxzLgorc3RhdGljIGludCBJczhiT3B0aW1pemFibGUoY29uc3QgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIpIHsKKyAgaW50IGk7CisgIGlmIChoZHItPmNvbG9yX2NhY2hlX3NpemVfID4gMCkgcmV0dXJuIDA7CisgIC8vIFdoZW4gdGhlIEh1ZmZtYW4gdHJlZSBjb250YWlucyBvbmx5IG9uZSBzeW1ib2wsIHdlIGNhbiBza2lwIHRoZQorICAvLyBjYWxsIHRvIFJlYWRTeW1ib2woKSBmb3IgcmVkL2JsdWUvYWxwaGEgY2hhbm5lbHMuCisgIGZvciAoaSA9IDA7IGkgPCBoZHItPm51bV9odHJlZV9ncm91cHNfOyArK2kpIHsKKyAgICBIdWZmbWFuQ29kZSoqIGNvbnN0IGh0cmVlcyA9IGhkci0+aHRyZWVfZ3JvdXBzX1tpXS5odHJlZXM7CisgICAgaWYgKGh0cmVlc1tSRURdWzBdLmJpdHMgPiAwKSByZXR1cm4gMDsKKyAgICBpZiAoaHRyZWVzW0JMVUVdWzBdLmJpdHMgPiAwKSByZXR1cm4gMDsKKyAgICBpZiAoaHRyZWVzW0FMUEhBXVswXS5iaXRzID4gMCkgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhQXBwbHlGaWx0ZXIoQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3Rfcm93LCBpbnQgbGFzdF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHN0cmlkZSkgeworICBpZiAoYWxwaF9kZWMtPmZpbHRlcl8gIT0gV0VCUF9GSUxURVJfTk9ORSkgeworICAgIGludCB5OworICAgIGNvbnN0IHVpbnQ4X3QqIHByZXZfbGluZSA9IGFscGhfZGVjLT5wcmV2X2xpbmVfOworICAgIGFzc2VydChXZWJQVW5maWx0ZXJzW2FscGhfZGVjLT5maWx0ZXJfXSAhPSBOVUxMKTsKKyAgICBmb3IgKHkgPSBmaXJzdF9yb3c7IHkgPCBsYXN0X3JvdzsgKyt5KSB7CisgICAgICBXZWJQVW5maWx0ZXJzW2FscGhfZGVjLT5maWx0ZXJfXShwcmV2X2xpbmUsIG91dCwgb3V0LCBzdHJpZGUpOworICAgICAgcHJldl9saW5lID0gb3V0OworICAgICAgb3V0ICs9IHN0cmlkZTsKKyAgICB9CisgICAgYWxwaF9kZWMtPnByZXZfbGluZV8gPSBwcmV2X2xpbmU7CisgIH0KK30KKworc3RhdGljIHZvaWQgRXh0cmFjdFBhbGV0dGVkQWxwaGFSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBsYXN0X3JvdykgeworICAvLyBGb3IgdmVydGljYWwgYW5kIGdyYWRpZW50IGZpbHRlcmluZywgd2UgbmVlZCB0byBkZWNvZGUgdGhlIHBhcnQgYWJvdmUgdGhlCisgIC8vIGNyb3BfdG9wIHJvdywgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgY29ycmVjdCBzcGF0aWFsIHByZWRpY3RvcnMuCisgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IChBTFBIRGVjb2RlciopZGVjLT5pb18tPm9wYXF1ZTsKKyAgY29uc3QgaW50IHRvcF9yb3cgPQorICAgICAgKGFscGhfZGVjLT5maWx0ZXJfID09IFdFQlBfRklMVEVSX05PTkUgfHwKKyAgICAgICBhbHBoX2RlYy0+ZmlsdGVyXyA9PSBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMKSA/IGRlYy0+aW9fLT5jcm9wX3RvcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGVjLT5sYXN0X3Jvd187CisgIGNvbnN0IGludCBmaXJzdF9yb3cgPSAoZGVjLT5sYXN0X3Jvd18gPCB0b3Bfcm93KSA/IHRvcF9yb3cgOiBkZWMtPmxhc3Rfcm93XzsKKyAgYXNzZXJ0KGxhc3Rfcm93IDw9IGRlYy0+aW9fLT5jcm9wX2JvdHRvbSk7CisgIGlmIChsYXN0X3JvdyA+IGZpcnN0X3JvdykgeworICAgIC8vIFNwZWNpYWwgbWV0aG9kIGZvciBwYWxldHRlZCBhbHBoYSBkYXRhLiBXZSBvbmx5IHByb2Nlc3MgdGhlIGNyb3BwZWQgYXJlYS4KKyAgICBjb25zdCBpbnQgd2lkdGggPSBkZWMtPmlvXy0+d2lkdGg7CisgICAgdWludDhfdCogb3V0ID0gYWxwaF9kZWMtPm91dHB1dF8gKyB3aWR0aCAqIGZpcnN0X3JvdzsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9CisgICAgICAodWludDhfdCopZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBmaXJzdF9yb3c7CisgICAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bMF07CisgICAgYXNzZXJ0KGRlYy0+bmV4dF90cmFuc2Zvcm1fID09IDEpOworICAgIGFzc2VydCh0cmFuc2Zvcm0tPnR5cGVfID09IENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSk7CisgICAgVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEodHJhbnNmb3JtLCBmaXJzdF9yb3csIGxhc3Rfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLCBvdXQpOworICAgIEFscGhhQXBwbHlGaWx0ZXIoYWxwaF9kZWMsIGZpcnN0X3JvdywgbGFzdF9yb3csIG91dCwgd2lkdGgpOworICB9CisgIGRlYy0+bGFzdF9yb3dfID0gZGVjLT5sYXN0X291dF9yb3dfID0gbGFzdF9yb3c7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBmYXN0IHBhdHRlcm4gY29weSAoOGIgYW5kIDMyYikKKworLy8gY3ljbGljIHJvdGF0aW9uIG9mIHBhdHRlcm4gd29yZAorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFJvdGF0ZThiKHVpbnQzMl90IFYpIHsKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgcmV0dXJuICgoViAmIDB4ZmYwMDAwMDB1KSA+PiAyNCkgfCAoViA8PCA4KTsKKyNlbHNlCisgIHJldHVybiAoKFYgJiAweGZmdSkgPDwgMjQpIHwgKFYgPj4gOCk7CisjZW5kaWYKK30KKworLy8gY29weSAxLCAyIG9yIDQtYnl0ZXMgcGF0dGVybgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weVNtYWxsUGF0dGVybjhiKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIHVpbnQzMl90IHBhdHRlcm4pIHsKKyAgaW50IGk7CisgIC8vIGFsaWduICdkc3QnIHRvIDQtYnl0ZXMgYm91bmRhcnkuIEFkanVzdCB0aGUgcGF0dGVybiBhbG9uZyB0aGUgd2F5LgorICB3aGlsZSAoKHVpbnRwdHJfdClkc3QgJiAzKSB7CisgICAgKmRzdCsrID0gKnNyYysrOworICAgIHBhdHRlcm4gPSBSb3RhdGU4YihwYXR0ZXJuKTsKKyAgICAtLWxlbmd0aDsKKyAgfQorICAvLyBDb3B5IHRoZSBwYXR0ZXJuIDQgYnl0ZXMgYXQgYSB0aW1lLgorICBmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCA+PiAyKTsgKytpKSB7CisgICAgKCh1aW50MzJfdCopZHN0KVtpXSA9IHBhdHRlcm47CisgIH0KKyAgLy8gRmluaXNoIHdpdGggbGVmdC1vdmVycy4gJ3BhdHRlcm4nIGlzIHN0aWxsIGNvcnJlY3RseSBwb3NpdGlvbmVkLAorICAvLyBzbyBubyBSb3RhdGU4YigpIGNhbGwgaXMgbmVlZGVkLgorICBmb3IgKGkgPDw9IDI7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5QmxvY2s4Yih1aW50OF90KiBjb25zdCBkc3QsIGludCBkaXN0LCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IGRzdCAtIGRpc3Q7CisgIGlmIChsZW5ndGggPj0gOCkgeworICAgIHVpbnQzMl90IHBhdHRlcm4gPSAwOworICAgIHN3aXRjaCAoZGlzdCkgeworICAgICAgY2FzZSAxOgorICAgICAgICBwYXR0ZXJuID0gc3JjWzBdOworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pICAgLy8gYXJtIGRvZXNuJ3QgbGlrZSBtdWx0aXBseSB0aGF0IG11Y2gKKyAgICAgICAgcGF0dGVybiB8PSBwYXR0ZXJuIDw8IDg7CisgICAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCAxNjsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJyZXBsdi5xYiAlMCwgJTAiIDogIityIihwYXR0ZXJuKSk7CisjZWxzZQorICAgICAgICBwYXR0ZXJuID0gMHgwMTAxMDEwMXUgKiBwYXR0ZXJuOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBtZW1jcHkoJnBhdHRlcm4sIHNyYywgc2l6ZW9mKHVpbnQxNl90KSk7CisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkKKyAgICAgICAgcGF0dGVybiB8PSBwYXR0ZXJuIDw8IDE2OworI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoInJlcGx2LnBoICUwLCAlMCIgOiAiK3IiKHBhdHRlcm4pKTsKKyNlbHNlCisgICAgICAgIHBhdHRlcm4gPSAweDAwMDEwMDAxdSAqIHBhdHRlcm47CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIG1lbWNweSgmcGF0dGVybiwgc3JjLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBnb3RvIENvcHk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBDb3B5U21hbGxQYXR0ZXJuOGIoc3JjLCBkc3QsIGxlbmd0aCwgcGF0dGVybik7CisgICAgcmV0dXJuOworICB9CisgQ29weToKKyAgaWYgKGRpc3QgPj0gbGVuZ3RoKSB7ICAvLyBubyBvdmVybGFwIC0+IHVzZSBtZW1jcHkoKQorICAgIG1lbWNweShkc3QsIHNyYywgbGVuZ3RoICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXTsKKyAgfQorfQorCisvLyBjb3B5IHBhdHRlcm4gb2YgMSBvciAyIHVpbnQzMl90J3MKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHlTbWFsbFBhdHRlcm4zMmIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgdWludDY0X3QgcGF0dGVybikgeworICBpbnQgaTsKKyAgaWYgKCh1aW50cHRyX3QpZHN0ICYgNCkgeyAgICAgICAgICAgLy8gQWxpZ24gJ2RzdCcgdG8gOC1ieXRlcyBib3VuZGFyeS4KKyAgICAqZHN0KysgPSAqc3JjKys7CisgICAgcGF0dGVybiA9IChwYXR0ZXJuID4+IDMyKSB8IChwYXR0ZXJuIDw8IDMyKTsKKyAgICAtLWxlbmd0aDsKKyAgfQorICBhc3NlcnQoMCA9PSAoKHVpbnRwdHJfdClkc3QgJiA3KSk7CisgIGZvciAoaSA9IDA7IGkgPCAobGVuZ3RoID4+IDEpOyArK2kpIHsKKyAgICAoKHVpbnQ2NF90Kilkc3QpW2ldID0gcGF0dGVybjsgICAgLy8gQ29weSB0aGUgcGF0dGVybiA4IGJ5dGVzIGF0IGEgdGltZS4KKyAgfQorICBpZiAobGVuZ3RoICYgMSkgeyAgICAgICAgICAgICAgICAgICAvLyBGaW5pc2ggd2l0aCBsZWZ0LW92ZXIuCisgICAgZHN0W2kgPDwgMV0gPSBzcmNbaSA8PCAxXTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5QmxvY2szMmIodWludDMyX3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdCwgaW50IGxlbmd0aCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gZHN0IC0gZGlzdDsKKyAgaWYgKGRpc3QgPD0gMiAmJiBsZW5ndGggPj0gNCAmJiAoKHVpbnRwdHJfdClkc3QgJiAzKSA9PSAwKSB7CisgICAgdWludDY0X3QgcGF0dGVybjsKKyAgICBpZiAoZGlzdCA9PSAxKSB7CisgICAgICBwYXR0ZXJuID0gKHVpbnQ2NF90KXNyY1swXTsKKyAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCAzMjsKKyAgICB9IGVsc2UgeworICAgICAgbWVtY3B5KCZwYXR0ZXJuLCBzcmMsIHNpemVvZihwYXR0ZXJuKSk7CisgICAgfQorICAgIENvcHlTbWFsbFBhdHRlcm4zMmIoc3JjLCBkc3QsIGxlbmd0aCwgcGF0dGVybik7CisgIH0gZWxzZSBpZiAoZGlzdCA+PSBsZW5ndGgpIHsgIC8vIG5vIG92ZXJsYXAKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBEZWNvZGVBbHBoYURhdGEoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxhc3Rfcm93KSB7CisgIGludCBvayA9IDE7CisgIGludCByb3cgPSBkZWMtPmxhc3RfcGl4ZWxfIC8gd2lkdGg7CisgIGludCBjb2wgPSBkZWMtPmxhc3RfcGl4ZWxfICUgd2lkdGg7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIGludCBwb3MgPSBkZWMtPmxhc3RfcGl4ZWxfOyAgICAgICAgIC8vIGN1cnJlbnQgcG9zaXRpb24KKyAgY29uc3QgaW50IGVuZCA9IHdpZHRoICogaGVpZ2h0OyAgICAgLy8gRW5kIG9mIGRhdGEKKyAgY29uc3QgaW50IGxhc3QgPSB3aWR0aCAqIGxhc3Rfcm93OyAgLy8gTGFzdCBwaXhlbCB0byBkZWNvZGUKKyAgY29uc3QgaW50IGxlbl9jb2RlX2xpbWl0ID0gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTOworICBjb25zdCBpbnQgbWFzayA9IGhkci0+aHVmZm1hbl9tYXNrXzsKKyAgY29uc3QgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXAgPQorICAgICAgKHBvcyA8IGxhc3QpID8gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KSA6IE5VTEw7CisgIGFzc2VydChwb3MgPD0gZW5kKTsKKyAgYXNzZXJ0KGxhc3Rfcm93IDw9IGhlaWdodCk7CisgIGFzc2VydChJczhiT3B0aW1pemFibGUoaGRyKSk7CisKKyAgd2hpbGUgKCFici0+ZW9zXyAmJiBwb3MgPCBsYXN0KSB7CisgICAgaW50IGNvZGU7CisgICAgLy8gT25seSB1cGRhdGUgd2hlbiBjaGFuZ2luZyB0aWxlLgorICAgIGlmICgoY29sICYgbWFzaykgPT0gMCkgeworICAgICAgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgIH0KKyAgICBhc3NlcnQoaHRyZWVfZ3JvdXAgIT0gTlVMTCk7CisgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgIGNvZGUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbR1JFRU5dLCBicik7CisgICAgaWYgKGNvZGUgPCBOVU1fTElURVJBTF9DT0RFUykgeyAgLy8gTGl0ZXJhbAorICAgICAgZGF0YVtwb3NdID0gY29kZTsKKyAgICAgICsrcG9zOworICAgICAgKytjb2w7CisgICAgICBpZiAoY29sID49IHdpZHRoKSB7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgICsrcm93OworICAgICAgICBpZiAocm93IDw9IGxhc3Rfcm93ICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7CisgICAgICAgICAgRXh0cmFjdFBhbGV0dGVkQWxwaGFSb3dzKGRlYywgcm93KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29kZSA8IGxlbl9jb2RlX2xpbWl0KSB7ICAvLyBCYWNrd2FyZCByZWZlcmVuY2UKKyAgICAgIGludCBkaXN0X2NvZGUsIGRpc3Q7CisgICAgICBjb25zdCBpbnQgbGVuZ3RoX3N5bSA9IGNvZGUgLSBOVU1fTElURVJBTF9DT0RFUzsKKyAgICAgIGNvbnN0IGludCBsZW5ndGggPSBHZXRDb3B5TGVuZ3RoKGxlbmd0aF9zeW0sIGJyKTsKKyAgICAgIGNvbnN0IGludCBkaXN0X3N5bWJvbCA9IFJlYWRTeW1ib2woaHRyZWVfZ3JvdXAtPmh0cmVlc1tESVNUXSwgYnIpOworICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgICAgZGlzdF9jb2RlID0gR2V0Q29weURpc3RhbmNlKGRpc3Rfc3ltYm9sLCBicik7CisgICAgICBkaXN0ID0gUGxhbmVDb2RlVG9EaXN0YW5jZSh3aWR0aCwgZGlzdF9jb2RlKTsKKyAgICAgIGlmIChwb3MgPj0gZGlzdCAmJiBlbmQgLSBwb3MgPj0gbGVuZ3RoKSB7CisgICAgICAgIENvcHlCbG9jazhiKGRhdGEgKyBwb3MsIGRpc3QsIGxlbmd0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvayA9IDA7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgICAgcG9zICs9IGxlbmd0aDsKKyAgICAgIGNvbCArPSBsZW5ndGg7CisgICAgICB3aGlsZSAoY29sID49IHdpZHRoKSB7CisgICAgICAgIGNvbCAtPSB3aWR0aDsKKyAgICAgICAgKytyb3c7CisgICAgICAgIGlmIChyb3cgPD0gbGFzdF9yb3cgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsKKyAgICAgICAgICBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoZGVjLCByb3cpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocG9zIDwgbGFzdCAmJiAoY29sICYgbWFzaykpIHsKKyAgICAgICAgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgICAgfQorICAgIH0gZWxzZSB7ICAvLyBOb3QgcmVhY2hlZAorICAgICAgb2sgPSAwOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIGFzc2VydChici0+ZW9zXyA9PSBWUDhMSXNFbmRPZlN0cmVhbShicikpOworICB9CisgIC8vIFByb2Nlc3MgdGhlIHJlbWFpbmluZyByb3dzIGNvcnJlc3BvbmRpbmcgdG8gbGFzdCByb3ctYmxvY2suCisgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhkZWMsIHJvdyA+IGxhc3Rfcm93ID8gbGFzdF9yb3cgOiByb3cpOworCisgRW5kOgorICBpZiAoIW9rIHx8IChici0+ZW9zXyAmJiBwb3MgPCBlbmQpKSB7CisgICAgb2sgPSAwOworICAgIGRlYy0+c3RhdHVzXyA9IGJyLT5lb3NfID8gVlA4X1NUQVRVU19TVVNQRU5ERUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICB9IGVsc2UgeworICAgIGRlYy0+bGFzdF9waXhlbF8gPSBwb3M7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBTYXZlU3RhdGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGxhc3RfcGl4ZWwpIHsKKyAgYXNzZXJ0KGRlYy0+aW5jcmVtZW50YWxfKTsKKyAgZGVjLT5zYXZlZF9icl8gPSBkZWMtPmJyXzsKKyAgZGVjLT5zYXZlZF9sYXN0X3BpeGVsXyA9IGxhc3RfcGl4ZWw7CisgIGlmIChkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPiAwKSB7CisgICAgVlA4TENvbG9yQ2FjaGVDb3B5KCZkZWMtPmhkcl8uY29sb3JfY2FjaGVfLCAmZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzdG9yZVN0YXRlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgYXNzZXJ0KGRlYy0+YnJfLmVvc18pOworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgZGVjLT5icl8gPSBkZWMtPnNhdmVkX2JyXzsKKyAgZGVjLT5sYXN0X3BpeGVsXyA9IGRlYy0+c2F2ZWRfbGFzdF9waXhlbF87CisgIGlmIChkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPiAwKSB7CisgICAgVlA4TENvbG9yQ2FjaGVDb3B5KCZkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfLCAmZGVjLT5oZHJfLmNvbG9yX2NhY2hlXyk7CisgIH0KK30KKworI2RlZmluZSBTWU5DX0VWRVJZX05fUk9XUyA4ICAvLyBtaW5pbXVtIG51bWJlciBvZiByb3dzIGJldHdlZW4gY2hlY2stcG9pbnRzCitzdGF0aWMgaW50IERlY29kZUltYWdlRGF0YShWUDhMRGVjb2RlciogY29uc3QgZGVjLCB1aW50MzJfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGxhc3Rfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1Jvd3NGdW5jIHByb2Nlc3NfZnVuYykgeworICBpbnQgcm93ID0gZGVjLT5sYXN0X3BpeGVsXyAvIHdpZHRoOworICBpbnQgY29sID0gZGVjLT5sYXN0X3BpeGVsXyAlIHdpZHRoOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOworICB1aW50MzJfdCogc3JjID0gZGF0YSArIGRlYy0+bGFzdF9waXhlbF87CisgIHVpbnQzMl90KiBsYXN0X2NhY2hlZCA9IHNyYzsKKyAgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBkYXRhICsgd2lkdGggKiBoZWlnaHQ7ICAgICAvLyBFbmQgb2YgZGF0YQorICB1aW50MzJfdCogY29uc3Qgc3JjX2xhc3QgPSBkYXRhICsgd2lkdGggKiBsYXN0X3JvdzsgIC8vIExhc3QgcGl4ZWwgdG8gZGVjb2RlCisgIGNvbnN0IGludCBsZW5fY29kZV9saW1pdCA9IE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUzsKKyAgY29uc3QgaW50IGNvbG9yX2NhY2hlX2xpbWl0ID0gbGVuX2NvZGVfbGltaXQgKyBoZHItPmNvbG9yX2NhY2hlX3NpemVfOworICBpbnQgbmV4dF9zeW5jX3JvdyA9IGRlYy0+aW5jcmVtZW50YWxfID8gcm93IDogMSA8PCAyNDsKKyAgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlID0KKyAgICAgIChoZHItPmNvbG9yX2NhY2hlX3NpemVfID4gMCkgPyAmaGRyLT5jb2xvcl9jYWNoZV8gOiBOVUxMOworICBjb25zdCBpbnQgbWFzayA9IGhkci0+aHVmZm1hbl9tYXNrXzsKKyAgY29uc3QgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXAgPQorICAgICAgKHNyYyA8IHNyY19sYXN0KSA/IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdykgOiBOVUxMOworICBhc3NlcnQoZGVjLT5sYXN0X3Jvd18gPCBsYXN0X3Jvdyk7CisgIGFzc2VydChzcmNfbGFzdCA8PSBzcmNfZW5kKTsKKworICB3aGlsZSAoc3JjIDwgc3JjX2xhc3QpIHsKKyAgICBpbnQgY29kZTsKKyAgICBpZiAocm93ID49IG5leHRfc3luY19yb3cpIHsKKyAgICAgIFNhdmVTdGF0ZShkZWMsIChpbnQpKHNyYyAtIGRhdGEpKTsKKyAgICAgIG5leHRfc3luY19yb3cgPSByb3cgKyBTWU5DX0VWRVJZX05fUk9XUzsKKyAgICB9CisgICAgLy8gT25seSB1cGRhdGUgd2hlbiBjaGFuZ2luZyB0aWxlLiBOb3RlIHdlIGNvdWxkIHVzZSB0aGlzIHRlc3Q6CisgICAgLy8gaWYgIigoKChwcmV2X2NvbCBeIGNvbCkgfCBwcmV2X3JvdyBeIHJvdykpID4gbWFzaykiIC0+IHRpbGUgY2hhbmdlZAorICAgIC8vIGJ1dCB0aGF0J3MgYWN0dWFsbHkgc2xvd2VyIGFuZCBuZWVkcyBzdG9yaW5nIHRoZSBwcmV2aW91cyBjb2wvcm93LgorICAgIGlmICgoY29sICYgbWFzaykgPT0gMCkgeworICAgICAgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgIH0KKyAgICBhc3NlcnQoaHRyZWVfZ3JvdXAgIT0gTlVMTCk7CisgICAgaWYgKGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUpIHsKKyAgICAgICpzcmMgPSBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmI7CisgICAgICBnb3RvIEFkdmFuY2VCeU9uZTsKKyAgICB9CisgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgIGlmIChodHJlZV9ncm91cC0+dXNlX3BhY2tlZF90YWJsZSkgeworICAgICAgY29kZSA9IFJlYWRQYWNrZWRTeW1ib2xzKGh0cmVlX2dyb3VwLCBiciwgc3JjKTsKKyAgICAgIGlmIChjb2RlID09IFBBQ0tFRF9OT05fTElURVJBTF9DT0RFKSBnb3RvIEFkdmFuY2VCeU9uZTsKKyAgICB9IGVsc2UgeworICAgICAgY29kZSA9IFJlYWRTeW1ib2woaHRyZWVfZ3JvdXAtPmh0cmVlc1tHUkVFTl0sIGJyKTsKKyAgICB9CisgICAgaWYgKGJyLT5lb3NfKSBicmVhazsgIC8vIGVhcmx5IG91dAorICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8vIExpdGVyYWwKKyAgICAgIGlmIChodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9saXRlcmFsKSB7CisgICAgICAgICpzcmMgPSBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmIgfCAoY29kZSA8PCA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZWQsIGJsdWUsIGFscGhhOworICAgICAgICByZWQgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbUkVEXSwgYnIpOworICAgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICAgIGJsdWUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQkxVRV0sIGJyKTsKKyAgICAgICAgYWxwaGEgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQUxQSEFdLCBicik7CisgICAgICAgIGlmIChici0+ZW9zXykgYnJlYWs7CisgICAgICAgICpzcmMgPSAoKHVpbnQzMl90KWFscGhhIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGNvZGUgPDwgOCkgfCBibHVlOworICAgICAgfQorICAgIEFkdmFuY2VCeU9uZToKKyAgICAgICsrc3JjOworICAgICAgKytjb2w7CisgICAgICBpZiAoY29sID49IHdpZHRoKSB7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgICsrcm93OworICAgICAgICBpZiAocHJvY2Vzc19mdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAocm93IDw9IGxhc3Rfcm93ICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7CisgICAgICAgICAgICBwcm9jZXNzX2Z1bmMoZGVjLCByb3cpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29sb3JfY2FjaGUgIT0gTlVMTCkgeworICAgICAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeworICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvZGUgPCBsZW5fY29kZV9saW1pdCkgeyAgLy8gQmFja3dhcmQgcmVmZXJlbmNlCisgICAgICBpbnQgZGlzdF9jb2RlLCBkaXN0OworICAgICAgY29uc3QgaW50IGxlbmd0aF9zeW0gPSBjb2RlIC0gTlVNX0xJVEVSQUxfQ09ERVM7CisgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gR2V0Q29weUxlbmd0aChsZW5ndGhfc3ltLCBicik7CisgICAgICBjb25zdCBpbnQgZGlzdF9zeW1ib2wgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbRElTVF0sIGJyKTsKKyAgICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICAgIGRpc3RfY29kZSA9IEdldENvcHlEaXN0YW5jZShkaXN0X3N5bWJvbCwgYnIpOworICAgICAgZGlzdCA9IFBsYW5lQ29kZVRvRGlzdGFuY2Uod2lkdGgsIGRpc3RfY29kZSk7CisgICAgICBpZiAoYnItPmVvc18pIGJyZWFrOworICAgICAgaWYgKHNyYyAtIGRhdGEgPCAocHRyZGlmZl90KWRpc3QgfHwgc3JjX2VuZCAtIHNyYyA8IChwdHJkaWZmX3QpbGVuZ3RoKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb3B5QmxvY2szMmIoc3JjLCBkaXN0LCBsZW5ndGgpOworICAgICAgfQorICAgICAgc3JjICs9IGxlbmd0aDsKKyAgICAgIGNvbCArPSBsZW5ndGg7CisgICAgICB3aGlsZSAoY29sID49IHdpZHRoKSB7CisgICAgICAgIGNvbCAtPSB3aWR0aDsKKyAgICAgICAgKytyb3c7CisgICAgICAgIGlmIChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChyb3cgPD0gbGFzdF9yb3cgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBCZWNhdXNlIG9mIHRoZSBjaGVjayBkb25lIGFib3ZlIChiZWZvcmUgJ3NyYycgd2FzIGluY3JlbWVudGVkIGJ5CisgICAgICAvLyAnbGVuZ3RoJyksIHRoZSBmb2xsb3dpbmcgaG9sZHMgdHJ1ZS4KKyAgICAgIGFzc2VydChzcmMgPD0gc3JjX2VuZCk7CisgICAgICBpZiAoY29sICYgbWFzaykgaHRyZWVfZ3JvdXAgPSBHZXRIdHJlZUdyb3VwRm9yUG9zKGhkciwgY29sLCByb3cpOworICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsKKyAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29kZSA8IGNvbG9yX2NhY2hlX2xpbWl0KSB7ICAvLyBDb2xvciBjYWNoZQorICAgICAgY29uc3QgaW50IGtleSA9IGNvZGUgLSBsZW5fY29kZV9saW1pdDsKKyAgICAgIGFzc2VydChjb2xvcl9jYWNoZSAhPSBOVUxMKTsKKyAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeworICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOworICAgICAgfQorICAgICAgKnNyYyA9IFZQOExDb2xvckNhY2hlTG9va3VwKGNvbG9yX2NhY2hlLCBrZXkpOworICAgICAgZ290byBBZHZhbmNlQnlPbmU7CisgICAgfSBlbHNlIHsgIC8vIE5vdCByZWFjaGVkCisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBhc3NlcnQoYnItPmVvc18gPT0gVlA4TElzRW5kT2ZTdHJlYW0oYnIpKTsKKyAgfQorCisgIGlmIChkZWMtPmluY3JlbWVudGFsXyAmJiBici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSB7CisgICAgUmVzdG9yZVN0YXRlKGRlYyk7CisgIH0gZWxzZSBpZiAoIWJyLT5lb3NfKSB7CisgICAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4KKyAgICBpZiAocHJvY2Vzc19mdW5jICE9IE5VTEwpIHsKKyAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyA+IGxhc3Rfcm93ID8gbGFzdF9yb3cgOiByb3cpOworICAgIH0KKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICAgIGRlYy0+bGFzdF9waXhlbF8gPSAoaW50KShzcmMgLSBkYXRhKTsgIC8vIGVuZC1vZi1zY2FuIG1hcmtlcgorICB9IGVsc2UgeworICAgIC8vIGlmIG5vdCBpbmNyZW1lbnRhbCwgYW5kIHdlIGFyZSBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyIChlb3NfPTEpLCB0aGVuIHRoaXMKKyAgICAvLyBpcyBhIHJlYWwgYml0c3RyZWFtIGVycm9yLgorICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybShWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKKyAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICB0cmFuc2Zvcm0tPmRhdGFfID0gTlVMTDsKK30KKworLy8gRm9yIHNlY3VyaXR5IHJlYXNvbiwgd2UgbmVlZCB0byByZW1hcCB0aGUgY29sb3IgbWFwIHRvIHNwYW4KKy8vIHRoZSB0b3RhbCBwb3NzaWJsZSBidW5kbGVkIHZhbHVlcywgYW5kIG5vdCBqdXN0IHRoZSBudW1fY29sb3JzLgorc3RhdGljIGludCBFeHBhbmRDb2xvck1hcChpbnQgbnVtX2NvbG9ycywgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtKSB7CisgIGludCBpOworICBjb25zdCBpbnQgZmluYWxfbnVtX2NvbG9ycyA9IDEgPDwgKDggPj4gdHJhbnNmb3JtLT5iaXRzXyk7CisgIHVpbnQzMl90KiBjb25zdCBuZXdfY29sb3JfbWFwID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWZpbmFsX251bV9jb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbmV3X2NvbG9yX21hcCkpOworICBpZiAobmV3X2NvbG9yX21hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogY29uc3QgZGF0YSA9ICh1aW50OF90Kil0cmFuc2Zvcm0tPmRhdGFfOworICAgIHVpbnQ4X3QqIGNvbnN0IG5ld19kYXRhID0gKHVpbnQ4X3QqKW5ld19jb2xvcl9tYXA7CisgICAgbmV3X2NvbG9yX21hcFswXSA9IHRyYW5zZm9ybS0+ZGF0YV9bMF07CisgICAgZm9yIChpID0gNDsgaSA8IDQgKiBudW1fY29sb3JzOyArK2kpIHsKKyAgICAgIC8vIEVxdWl2YWxlbnQgdG8gQWRkUGl4ZWxFcSgpLCBvbiBhIGJ5dGUtYmFzaXMuCisgICAgICBuZXdfZGF0YVtpXSA9IChkYXRhW2ldICsgbmV3X2RhdGFbaSAtIDRdKSAmIDB4ZmY7CisgICAgfQorICAgIGZvciAoOyBpIDwgNCAqIGZpbmFsX251bV9jb2xvcnM7ICsraSkKKyAgICAgIG5ld19kYXRhW2ldID0gMDsgIC8vIGJsYWNrIHRhaWwuCisgICAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICAgIHRyYW5zZm9ybS0+ZGF0YV8gPSBuZXdfY29sb3JfbWFwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFJlYWRUcmFuc2Zvcm0oaW50KiBjb25zdCB4c2l6ZSwgaW50IGNvbnN0KiB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBvayA9IDE7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMVHJhbnNmb3JtKiB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1tkZWMtPm5leHRfdHJhbnNmb3JtX107CisgIGNvbnN0IFZQOExJbWFnZVRyYW5zZm9ybVR5cGUgdHlwZSA9CisgICAgICAoVlA4TEltYWdlVHJhbnNmb3JtVHlwZSlWUDhMUmVhZEJpdHMoYnIsIDIpOworCisgIC8vIEVhY2ggdHJhbnNmb3JtIHR5cGUgY2FuIG9ubHkgYmUgcHJlc2VudCBvbmNlIGluIHRoZSBzdHJlYW0uCisgIGlmIChkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gJiAoMVUgPDwgdHlwZSkpIHsKKyAgICByZXR1cm4gMDsgIC8vIEFscmVhZHkgdGhlcmUsIGxldCdzIG5vdCBhY2NlcHQgdGhlIHNlY29uZCBzYW1lIHRyYW5zZm9ybS4KKyAgfQorICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gfD0gKDFVIDw8IHR5cGUpOworCisgIHRyYW5zZm9ybS0+dHlwZV8gPSB0eXBlOworICB0cmFuc2Zvcm0tPnhzaXplXyA9ICp4c2l6ZTsKKyAgdHJhbnNmb3JtLT55c2l6ZV8gPSAqeXNpemU7CisgIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOworICArK2RlYy0+bmV4dF90cmFuc2Zvcm1fOworICBhc3NlcnQoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPD0gTlVNX1RSQU5TRk9STVMpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKKyAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKKyAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0oVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS0+Yml0c18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnlzaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGRlYywgJnRyYW5zZm9ybS0+ZGF0YV8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06IHsKKyAgICAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IFZQOExSZWFkQml0cyhiciwgOCkgKyAxOworICAgICAgIGNvbnN0IGludCBiaXRzID0gKG51bV9jb2xvcnMgPiAxNikgPyAwCisgICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDQpID8gMQorICAgICAgICAgICAgICAgICAgICAgIDogKG51bV9jb2xvcnMgPiAyKSA/IDIKKyAgICAgICAgICAgICAgICAgICAgICA6IDM7CisgICAgICAgKnhzaXplID0gVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIGJpdHMpOworICAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBiaXRzOworICAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0obnVtX2NvbG9ycywgMSwgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7CisgICAgICAgb2sgPSBvayAmJiBFeHBhbmRDb2xvck1hcChudW1fY29sb3JzLCB0cmFuc2Zvcm0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KDApOyAgICAvLyBjYW4ndCBoYXBwZW4KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TE1ldGFkYXRhCisKK3N0YXRpYyB2b2lkIEluaXRNZXRhZGF0YShWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgeworICBhc3NlcnQoaGRyICE9IE5VTEwpOworICBtZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOworfQorCitzdGF0aWMgdm9pZCBDbGVhck1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisKKyAgV2ViUFNhZmVGcmVlKGhkci0+aHVmZm1hbl9pbWFnZV8pOworICBXZWJQU2FmZUZyZWUoaGRyLT5odWZmbWFuX3RhYmxlc18pOworICBWUDhMSHRyZWVHcm91cHNGcmVlKGhkci0+aHRyZWVfZ3JvdXBzXyk7CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhkci0+Y29sb3JfY2FjaGVfKTsKKyAgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGRyLT5zYXZlZF9jb2xvcl9jYWNoZV8pOworICBJbml0TWV0YWRhdGEoaGRyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExEZWNvZGVyCisKK1ZQOExEZWNvZGVyKiBWUDhMTmV3KHZvaWQpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKKworICBWUDhMRHNwSW5pdCgpOyAgLy8gSW5pdCBjcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycy4KKworICByZXR1cm4gZGVjOworfQorCit2b2lkIFZQOExDbGVhcihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBpOworICBpZiAoZGVjID09IE5VTEwpIHJldHVybjsKKyAgQ2xlYXJNZXRhZGF0YSgmZGVjLT5oZHJfKTsKKworICBXZWJQU2FmZUZyZWUoZGVjLT5waXhlbHNfKTsKKyAgZGVjLT5waXhlbHNfID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IGRlYy0+bmV4dF90cmFuc2Zvcm1fOyArK2kpIHsKKyAgICBDbGVhclRyYW5zZm9ybSgmZGVjLT50cmFuc2Zvcm1zX1tpXSk7CisgIH0KKyAgZGVjLT5uZXh0X3RyYW5zZm9ybV8gPSAwOworICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gPSAwOworCisgIFdlYlBTYWZlRnJlZShkZWMtPnJlc2NhbGVyX21lbW9yeSk7CisgIGRlYy0+cmVzY2FsZXJfbWVtb3J5ID0gTlVMTDsKKworICBkZWMtPm91dHB1dF8gPSBOVUxMOyAgIC8vIGxlYXZlIG5vIHRyYWNlIGJlaGluZAorfQorCit2b2lkIFZQOExEZWxldGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBWUDhMQ2xlYXIoZGVjKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBVcGRhdGVEZWNvZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIGNvbnN0IGludCBudW1fYml0cyA9IGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c187CisgIGRlYy0+d2lkdGhfID0gd2lkdGg7CisgIGRlYy0+aGVpZ2h0XyA9IGhlaWdodDsKKworICBoZHItPmh1ZmZtYW5feHNpemVfID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIG51bV9iaXRzKTsKKyAgaGRyLT5odWZmbWFuX21hc2tfID0gKG51bV9iaXRzID09IDApID8gfjAgOiAoMSA8PCBudW1fYml0cykgLSAxOworfQorCitzdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSkgeworICBpbnQgb2sgPSAxOworICBpbnQgdHJhbnNmb3JtX3hzaXplID0geHNpemU7CisgIGludCB0cmFuc2Zvcm1feXNpemUgPSB5c2l6ZTsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgdWludDMyX3QqIGRhdGEgPSBOVUxMOworICBpbnQgY29sb3JfY2FjaGVfYml0cyA9IDA7CisKKyAgLy8gUmVhZCB0aGUgdHJhbnNmb3JtcyAobWF5IHJlY3Vyc2UpLgorICBpZiAoaXNfbGV2ZWwwKSB7CisgICAgd2hpbGUgKG9rICYmIFZQOExSZWFkQml0cyhiciwgMSkpIHsKKyAgICAgIG9rID0gUmVhZFRyYW5zZm9ybSgmdHJhbnNmb3JtX3hzaXplLCAmdHJhbnNmb3JtX3lzaXplLCBkZWMpOworICAgIH0KKyAgfQorCisgIC8vIENvbG9yIGNhY2hlCisgIGlmIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgY29sb3JfY2FjaGVfYml0cyA9IFZQOExSZWFkQml0cyhiciwgNCk7CisgICAgb2sgPSAoY29sb3JfY2FjaGVfYml0cyA+PSAxICYmIGNvbG9yX2NhY2hlX2JpdHMgPD0gTUFYX0NBQ0hFX0JJVFMpOworICAgIGlmICghb2spIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCB0aGUgSHVmZm1hbiBjb2RlcyAobWF5IHJlY3Vyc2UpLgorICBvayA9IG9rICYmIFJlYWRIdWZmbWFuQ29kZXMoZGVjLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2NhY2hlX2JpdHMsIGlzX2xldmVsMCk7CisgIGlmICghb2spIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBjb2xvci1jYWNoZQorICBpZiAoY29sb3JfY2FjaGVfYml0cyA+IDApIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgIGlmICghVlA4TENvbG9yQ2FjaGVJbml0KCZoZHItPmNvbG9yX2NhY2hlXywgY29sb3JfY2FjaGVfYml0cykpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMDsKKyAgfQorICBVcGRhdGVEZWNvZGVyKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUpOworCisgIGlmIChpc19sZXZlbDApIHsgICAvLyBsZXZlbCAwIGNvbXBsZXRlCisgICAgZGVjLT5zdGF0ZV8gPSBSRUFEX0hEUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIHsKKyAgICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gKHVpbnQ2NF90KXRyYW5zZm9ybV94c2l6ZSAqIHRyYW5zZm9ybV95c2l6ZTsKKyAgICBkYXRhID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKmRhdGEpKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBvayA9IDA7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0KKworICAvLyBVc2UgdGhlIEh1ZmZtYW4gdHJlZXMgdG8gZGVjb2RlIHRoZSBMWjc3IGVuY29kZWQgZGF0YS4KKyAgb2sgPSBEZWNvZGVJbWFnZURhdGEoZGVjLCBkYXRhLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3lzaXplLCBOVUxMKTsKKyAgb2sgPSBvayAmJiAhYnItPmVvc187CisKKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBXZWJQU2FmZUZyZWUoZGF0YSk7CisgICAgQ2xlYXJNZXRhZGF0YShoZHIpOworICB9IGVsc2UgeworICAgIGlmIChkZWNvZGVkX2RhdGEgIT0gTlVMTCkgeworICAgICAgKmRlY29kZWRfZGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGFsbG9jYXRlIGltYWdlIGRhdGEgaW4gdGhpcyBmdW5jdGlvbiBvbmx5IGZvciB0cmFuc2Zvcm1zLiBBdCBsZXZlbCAwCisgICAgICAvLyAodGhhdCBpczogbm90IHRoZSB0cmFuc2Zvcm1zKSwgd2Ugc2hvdWxkbid0IGhhdmUgYWxsb2NhdGVkIGFueXRoaW5nLgorICAgICAgYXNzZXJ0KGRhdGEgPT0gTlVMTCk7CisgICAgICBhc3NlcnQoaXNfbGV2ZWwwKTsKKyAgICB9CisgICAgZGVjLT5sYXN0X3BpeGVsXyA9IDA7ICAvLyBSZXNldCBmb3IgZnV0dXJlIERFQ09ERV9EQVRBX0ZVTkMoKSBjYWxscy4KKyAgICBpZiAoIWlzX2xldmVsMCkgQ2xlYXJNZXRhZGF0YShoZHIpOyAgLy8gQ2xlYW4gdXAgdGVtcG9yYXJ5IGRhdGEgYmVoaW5kLgorICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgZGVjLT5waXhlbHNfIGFuZCBkZWMtPmFyZ2JfY2FjaGVfLgorc3RhdGljIGludCBBbGxvY2F0ZUludGVybmFsQnVmZmVyczMyYihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgZmluYWxfd2lkdGgpIHsKKyAgY29uc3QgdWludDY0X3QgbnVtX3BpeGVscyA9ICh1aW50NjRfdClkZWMtPndpZHRoXyAqIGRlYy0+aGVpZ2h0XzsKKyAgLy8gU2NyYXRjaCBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0b3AtcHJlZGljdGlvbiByb3cgZm9yIHRyYW5zZm9ybWluZyB0aGUKKyAgLy8gZmlyc3Qgcm93IGluIHRoZSByb3ctYmxvY2tzLiBOb3QgbmVlZGVkIGZvciBwYWxldHRlZCBhbHBoYS4KKyAgY29uc3QgdWludDY0X3QgY2FjaGVfdG9wX3BpeGVscyA9ICh1aW50MTZfdClmaW5hbF93aWR0aDsKKyAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIHRlbXBvcmFyeSBCR1JBIHN0b3JhZ2UuIE5vdCBuZWVkZWQgZm9yIHBhbGV0dGVkIGFscGhhLgorICBjb25zdCB1aW50NjRfdCBjYWNoZV9waXhlbHMgPSAodWludDY0X3QpZmluYWxfd2lkdGggKiBOVU1fQVJHQl9DQUNIRV9ST1dTOworICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0KKyAgICAgIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzICsgY2FjaGVfcGl4ZWxzOworCisgIGFzc2VydChkZWMtPndpZHRoXyA8PSBmaW5hbF93aWR0aCk7CisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQzMl90KSk7CisgIGlmIChkZWMtPnBpeGVsc18gPT0gTlVMTCkgeworICAgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBkZWMtPnBpeGVsc18gKyBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVsczsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnM4YihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX251bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgaWYgKGRlYy0+cGl4ZWxzXyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTcGVjaWFsIHJvdy1wcm9jZXNzaW5nIHRoYXQgb25seSBzdG9yZXMgdGhlIGFscGhhIGRhdGEuCitzdGF0aWMgdm9pZCBFeHRyYWN0QWxwaGFSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBsYXN0X3JvdykgeworICBpbnQgY3VyX3JvdyA9IGRlYy0+bGFzdF9yb3dfOworICBpbnQgbnVtX3Jvd3MgPSBsYXN0X3JvdyAtIGN1cl9yb3c7CisgIGNvbnN0IHVpbnQzMl90KiBpbiA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogY3VyX3JvdzsKKworICBhc3NlcnQobGFzdF9yb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgd2hpbGUgKG51bV9yb3dzID4gMCkgeworICAgIGNvbnN0IGludCBudW1fcm93c190b19wcm9jZXNzID0KKyAgICAgICAgKG51bV9yb3dzID4gTlVNX0FSR0JfQ0FDSEVfUk9XUykgPyBOVU1fQVJHQl9DQUNIRV9ST1dTIDogbnVtX3Jvd3M7CisgICAgLy8gRXh0cmFjdCBhbHBoYSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZSBncmVlbiBwbGFuZSkuCisgICAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gKEFMUEhEZWNvZGVyKilkZWMtPmlvXy0+b3BhcXVlOworICAgIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCA9IGFscGhfZGVjLT5vdXRwdXRfOworICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsgICAgICAvLyB0aGUgZmluYWwgd2lkdGggKCE9IGRlYy0+d2lkdGhfKQorICAgIGNvbnN0IGludCBjYWNoZV9waXhzID0gd2lkdGggKiBudW1fcm93c190b19wcm9jZXNzOworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IG91dHB1dCArIHdpZHRoICogY3VyX3JvdzsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gZGVjLT5hcmdiX2NhY2hlXzsKKyAgICBpbnQgaTsKKyAgICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3NfdG9fcHJvY2VzcywgaW4pOworICAgIGZvciAoaSA9IDA7IGkgPCBjYWNoZV9waXhzOyArK2kpIGRzdFtpXSA9IChzcmNbaV0gPj4gOCkgJiAweGZmOworICAgIEFscGhhQXBwbHlGaWx0ZXIoYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICBjdXJfcm93LCBjdXJfcm93ICsgbnVtX3Jvd3NfdG9fcHJvY2VzcywgZHN0LCB3aWR0aCk7CisgICAgbnVtX3Jvd3MgLT0gbnVtX3Jvd3NfdG9fcHJvY2VzczsKKyAgICBpbiArPSBudW1fcm93c190b19wcm9jZXNzICogZGVjLT53aWR0aF87CisgICAgY3VyX3JvdyArPSBudW1fcm93c190b19wcm9jZXNzOworICB9CisgIGFzc2VydChjdXJfcm93ID09IGxhc3Rfcm93KTsKKyAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBsYXN0X3JvdzsKK30KKworaW50IFZQOExEZWNvZGVBbHBoYUhlYWRlcihBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4TERlY29kZXIqIGRlYyA9IFZQOExOZXcoKTsKKworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChhbHBoX2RlYyAhPSBOVUxMKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IGRlYzsKKworICBkZWMtPndpZHRoXyA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aGVpZ2h0XyA9IGFscGhfZGVjLT5oZWlnaHRfOworICBkZWMtPmlvXyA9ICZhbHBoX2RlYy0+aW9fOworICBkZWMtPmlvXy0+b3BhcXVlID0gYWxwaF9kZWM7CisgIGRlYy0+aW9fLT53aWR0aCA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aW9fLT5oZWlnaHQgPSBhbHBoX2RlYy0+aGVpZ2h0XzsKKworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICBWUDhMSW5pdEJpdFJlYWRlcigmZGVjLT5icl8sIGRhdGEsIGRhdGFfc2l6ZSk7CisKKyAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShhbHBoX2RlYy0+d2lkdGhfLCBhbHBoX2RlYy0+aGVpZ2h0XywgMSwgZGVjLCBOVUxMKSkgeworICAgIGdvdG8gRXJyOworICB9CisKKyAgLy8gU3BlY2lhbCBjYXNlOiBpZiBhbHBoYSBkYXRhIHVzZXMgb25seSB0aGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGFuZAorICAvLyBkb2Vzbid0IHVzZSBjb2xvciBjYWNoZSAoYSBmcmVxdWVudCBjYXNlKSwgd2Ugd2lsbCB1c2UgRGVjb2RlQWxwaGFEYXRhKCkKKyAgLy8gbWV0aG9kIHRoYXQgb25seSBuZWVkcyBhbGxvY2F0aW9uIG9mIDEgYnl0ZSBwZXIgcGl4ZWwgKGFscGhhIGNoYW5uZWwpLgorICBpZiAoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPT0gMSAmJgorICAgICAgZGVjLT50cmFuc2Zvcm1zX1swXS50eXBlXyA9PSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0gJiYKKyAgICAgIElzOGJPcHRpbWl6YWJsZSgmZGVjLT5oZHJfKSkgeworICAgIGFscGhfZGVjLT51c2VfOGJfZGVjb2RlXyA9IDE7CisgICAgb2sgPSBBbGxvY2F0ZUludGVybmFsQnVmZmVyczhiKGRlYyk7CisgIH0gZWxzZSB7CisgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycyAobm90ZSB0aGF0IGRlYy0+d2lkdGhfIG1heSBoYXZlIGNoYW5nZWQgaGVyZSkuCisgICAgYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID0gMDsKKyAgICBvayA9IEFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzMzJiKGRlYywgYWxwaF9kZWMtPndpZHRoXyk7CisgIH0KKworICBpZiAoIW9rKSBnb3RvIEVycjsKKworICByZXR1cm4gMTsKKworIEVycjoKKyAgVlA4TERlbGV0ZShhbHBoX2RlYy0+dnA4bF9kZWNfKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IGFscGhfZGVjLT52cDhsX2RlY187CisgIGFzc2VydChkZWMgIT0gTlVMTCk7CisgIGFzc2VydChsYXN0X3JvdyA8PSBkZWMtPmhlaWdodF8pOworCisgIGlmIChkZWMtPmxhc3Rfcm93XyA+PSBsYXN0X3JvdykgeworICAgIHJldHVybiAxOyAgLy8gZG9uZQorICB9CisKKyAgLy8gRGVjb2RlICh3aXRoIHNwZWNpYWwgcm93IHByb2Nlc3NpbmcpLgorICByZXR1cm4gYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID8KKyAgICAgIERlY29kZUFscGhhRGF0YShkZWMsICh1aW50OF90KilkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yb3cpIDoKKyAgICAgIERlY29kZUltYWdlRGF0YShkZWMsIGRlYy0+cGl4ZWxzXywgZGVjLT53aWR0aF8sIGRlYy0+aGVpZ2h0XywKKyAgICAgICAgICAgICAgICAgICAgICBsYXN0X3JvdywgRXh0cmFjdEFscGhhUm93cyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhMRGVjb2RlSGVhZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpbnQgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhOworCisgIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5pb18gPSBpbzsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBpby0+ZGF0YSwgaW8tPmRhdGFfc2l6ZSk7CisgIGlmICghUmVhZEltYWdlSW5mbygmZGVjLT5icl8sICZ3aWR0aCwgJmhlaWdodCwgJmhhc19hbHBoYSkpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07CisgIGlvLT53aWR0aCA9IHdpZHRoOworICBpby0+aGVpZ2h0ID0gaGVpZ2h0OworCisgIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgMSwgZGVjLCBOVUxMKSkgZ290byBFcnJvcjsKKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgVlA4TENsZWFyKGRlYyk7CisgIGFzc2VydChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgVlA4SW8qIGlvID0gTlVMTDsKKyAgV2ViUERlY1BhcmFtcyogcGFyYW1zID0gTlVMTDsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChkZWMtPmhkcl8uaHVmZm1hbl90YWJsZXNfICE9IE5VTEwpOworICBhc3NlcnQoZGVjLT5oZHJfLmh0cmVlX2dyb3Vwc18gIT0gTlVMTCk7CisgIGFzc2VydChkZWMtPmhkcl8ubnVtX2h0cmVlX2dyb3Vwc18gPiAwKTsKKworICBpbyA9IGRlYy0+aW9fOworICBhc3NlcnQoaW8gIT0gTlVMTCk7CisgIHBhcmFtcyA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOworICBhc3NlcnQocGFyYW1zICE9IE5VTEwpOworCisgIC8vIEluaXRpYWxpemF0aW9uLgorICBpZiAoZGVjLT5zdGF0ZV8gIT0gUkVBRF9EQVRBKSB7CisgICAgZGVjLT5vdXRwdXRfID0gcGFyYW1zLT5vdXRwdXQ7CisgICAgYXNzZXJ0KGRlYy0+b3V0cHV0XyAhPSBOVUxMKTsKKworICAgIGlmICghV2ViUElvSW5pdEZyb21PcHRpb25zKHBhcmFtcy0+b3B0aW9ucywgaW8sIE1PREVfQkdSQSkpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKworICAgIGlmICghQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMzMmIoZGVjLCBpby0+d2lkdGgpKSBnb3RvIEVycjsKKworICAgIGlmIChpby0+dXNlX3NjYWxpbmcgJiYgIUFsbG9jYXRlQW5kSW5pdFJlc2NhbGVyKGRlYywgaW8pKSBnb3RvIEVycjsKKworICAgIGlmIChpby0+dXNlX3NjYWxpbmcgfHwgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoZGVjLT5vdXRwdXRfLT5jb2xvcnNwYWNlKSkgeworICAgICAgLy8gbmVlZCB0aGUgYWxwaGEtbXVsdGlwbHkgZnVuY3Rpb25zIGZvciBwcmVtdWx0aXBsaWVkIG91dHB1dCBvciByZXNjYWxpbmcKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgfQorICAgIGlmICghV2ViUElzUkdCTW9kZShkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2UpKSB7CisgICAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYoKTsKKyAgICAgIGlmIChkZWMtPm91dHB1dF8tPnUuWVVWQS5hICE9IE5VTEwpIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgfQorICAgIGlmIChkZWMtPmluY3JlbWVudGFsXykgeworICAgICAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDAgJiYKKyAgICAgICAgICBkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfLmNvbG9yc18gPT0gTlVMTCkgeworICAgICAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5oZHJfLmNvbG9yX2NhY2hlXy5oYXNoX2JpdHNfKSkgeworICAgICAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkZWMtPnN0YXRlXyA9IFJFQURfREFUQTsKKyAgfQorCisgIC8vIERlY29kZS4KKyAgaWYgKCFEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX2JvdHRvbSwgUHJvY2Vzc1Jvd3MpKSB7CisgICAgZ290byBFcnI7CisgIH0KKworICBwYXJhbXMtPmxhc3RfeSA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIFZQOExDbGVhcihkZWMpOworICBhc3NlcnQoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOworICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsaS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGxpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2YzZiYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsaS5oCkBAIC0wLDAgKzEsMTM1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTG9zc2xlc3MgZGVjb2RlcjogaW50ZXJuYWwgaGVhZGVyLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9ERUNfVlA4TElfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9ERUNfVlA4TElfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgUkVBRF9EQVRBID0gMCwKKyAgUkVBRF9IRFIgPSAxLAorICBSRUFEX0RJTSA9IDIKK30gVlA4TERlY29kZVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCBWUDhMVHJhbnNmb3JtIFZQOExUcmFuc2Zvcm07CitzdHJ1Y3QgVlA4TFRyYW5zZm9ybSB7CisgIFZQOExJbWFnZVRyYW5zZm9ybVR5cGUgdHlwZV87ICAgLy8gdHJhbnNmb3JtIHR5cGUuCisgIGludCAgICAgICAgICAgICAgICAgICAgYml0c187ICAgLy8gc3Vic2FtcGxpbmcgYml0cyBkZWZpbmluZyB0cmFuc2Zvcm0gd2luZG93LgorICBpbnQgICAgICAgICAgICAgICAgICAgIHhzaXplXzsgIC8vIHRyYW5zZm9ybSB3aW5kb3cgWCBpbmRleC4KKyAgaW50ICAgICAgICAgICAgICAgICAgICB5c2l6ZV87ICAvLyB0cmFuc2Zvcm0gd2luZG93IFkgaW5kZXguCisgIHVpbnQzMl90ICAgICAgICAgICAgICAqZGF0YV87ICAgLy8gdHJhbnNmb3JtIGRhdGEuCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCAgICAgICAgICAgICBjb2xvcl9jYWNoZV9zaXplXzsKKyAgVlA4TENvbG9yQ2FjaGUgIGNvbG9yX2NhY2hlXzsKKyAgVlA4TENvbG9yQ2FjaGUgIHNhdmVkX2NvbG9yX2NhY2hlXzsgIC8vIGZvciBpbmNyZW1lbnRhbAorCisgIGludCAgICAgICAgICAgICBodWZmbWFuX21hc2tfOworICBpbnQgICAgICAgICAgICAgaHVmZm1hbl9zdWJzYW1wbGVfYml0c187CisgIGludCAgICAgICAgICAgICBodWZmbWFuX3hzaXplXzsKKyAgdWludDMyX3QgICAgICAgKmh1ZmZtYW5faW1hZ2VfOworICBpbnQgICAgICAgICAgICAgbnVtX2h0cmVlX2dyb3Vwc187CisgIEhUcmVlR3JvdXAgICAgICpodHJlZV9ncm91cHNfOworICBIdWZmbWFuQ29kZSAgICAqaHVmZm1hbl90YWJsZXNfOworfSBWUDhMTWV0YWRhdGE7CisKK3R5cGVkZWYgc3RydWN0IFZQOExEZWNvZGVyIFZQOExEZWNvZGVyOworc3RydWN0IFZQOExEZWNvZGVyIHsKKyAgVlA4U3RhdHVzQ29kZSAgICBzdGF0dXNfOworICBWUDhMRGVjb2RlU3RhdGUgIHN0YXRlXzsKKyAgVlA4SW8gICAgICAgICAgICppb187CisKKyAgY29uc3QgV2ViUERlY0J1ZmZlciAqb3V0cHV0XzsgICAgLy8gc2hvcnRjdXQgdG8gaW8tPm9wYXF1ZS0+b3V0cHV0CisKKyAgdWludDMyX3QgICAgICAgICpwaXhlbHNfOyAgICAgICAgLy8gSW50ZXJuYWwgZGF0YTogZWl0aGVyIHVpbnQ4X3QqIGZvciBhbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciB1aW50MzJfdCogZm9yIEJHUkEuCisgIHVpbnQzMl90ICAgICAgICAqYXJnYl9jYWNoZV87ICAgIC8vIFNjcmF0Y2ggYnVmZmVyIGZvciB0ZW1wb3JhcnkgQkdSQSBzdG9yYWdlLgorCisgIFZQOExCaXRSZWFkZXIgICAgYnJfOworICBpbnQgICAgICAgICAgICAgIGluY3JlbWVudGFsXzsgICAvLyBpZiB0cnVlLCBpbmNyZW1lbnRhbCBkZWNvZGluZyBpcyBleHBlY3RlZAorICBWUDhMQml0UmVhZGVyICAgIHNhdmVkX2JyXzsgICAgICAvLyBub3RlOiBjb3VsZCBiZSBsb2NhbCB2YXJpYWJsZXMgdG9vCisgIGludCAgICAgICAgICAgICAgc2F2ZWRfbGFzdF9waXhlbF87CisKKyAgaW50ICAgICAgICAgICAgICB3aWR0aF87CisgIGludCAgICAgICAgICAgICAgaGVpZ2h0XzsKKyAgaW50ICAgICAgICAgICAgICBsYXN0X3Jvd187ICAgICAgLy8gbGFzdCBpbnB1dCByb3cgZGVjb2RlZCBzbyBmYXIuCisgIGludCAgICAgICAgICAgICAgbGFzdF9waXhlbF87ICAgIC8vIGxhc3QgcGl4ZWwgZGVjb2RlZCBzbyBmYXIuIEhvd2V2ZXIsIGl0IG1heQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYmUgdHJhbnNmb3JtZWQsIHNjYWxlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3ItY29udmVydGVkIHlldC4KKyAgaW50ICAgICAgICAgICAgICBsYXN0X291dF9yb3dfOyAgLy8gbGFzdCByb3cgb3V0cHV0IHNvIGZhci4KKworICBWUDhMTWV0YWRhdGEgICAgIGhkcl87CisKKyAgaW50ICAgICAgICAgICAgICBuZXh0X3RyYW5zZm9ybV87CisgIFZQOExUcmFuc2Zvcm0gICAgdHJhbnNmb3Jtc19bTlVNX1RSQU5TRk9STVNdOworICAvLyBvcidkIGJpdHNldCBzdG9yaW5nIHRoZSB0cmFuc2Zvcm1zIHR5cGVzLgorICB1aW50MzJfdCAgICAgICAgIHRyYW5zZm9ybXNfc2Vlbl87CisKKyAgdWludDhfdCAgICAgICAgICpyZXNjYWxlcl9tZW1vcnk7ICAvLyBXb3JraW5nIG1lbW9yeSBmb3IgcmVzY2FsaW5nIHdvcmsuCisgIFdlYlBSZXNjYWxlciAgICAqcmVzY2FsZXI7ICAgICAgICAgLy8gQ29tbW9uIHJlc2NhbGVyIGZvciBhbGwgY2hhbm5lbHMuCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCitzdHJ1Y3QgQUxQSERlY29kZXI7ICAvLyBEZWZpbmVkIGluIGRlYy9hbHBoYWkuaC4KKworLy8gaW4gdnA4bC5jCisKKy8vIERlY29kZXMgaW1hZ2UgaGVhZGVyIGZvciBhbHBoYSBkYXRhIHN0b3JlZCB1c2luZyBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBWUDhMRGVjb2RlQWxwaGFIZWFkZXIoc3RydWN0IEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vIERlY29kZXMgKmF0IGxlYXN0KiAnbGFzdF9yb3cnIHJvd3Mgb2YgYWxwaGEuIElmIHNvbWUgb2YgdGhlIGluaXRpYWwgcm93cyBhcmUKKy8vIGFscmVhZHkgZGVjb2RlZCBpbiBwcmV2aW91cyBjYWxsKHMpLCBpdCB3aWxsIHJlc3VtZSBkZWNvZGluZyBmcm9tIHdoZXJlIGl0CisvLyB3YXMgcGF1c2VkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGJpdHN0cmVhbSBlcnJvci4KK2ludCBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShzdHJ1Y3QgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X3Jvdyk7CisKKy8vIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBsb3NzbGVzcyBkZWNvZGVyIGluc3RhbmNlLgorVlA4TERlY29kZXIqIFZQOExOZXcodm9pZCk7CisKKy8vIERlY29kZXMgdGhlIGltYWdlIGhlYWRlci4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgoraW50IFZQOExEZWNvZGVIZWFkZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKworLy8gRGVjb2RlcyBhbiBpbWFnZS4gSXQncyByZXF1aXJlZCB0byBkZWNvZGUgdGhlIGxvc3NsZXNzIGhlYWRlciBiZWZvcmUgY2FsbGluZworLy8gdGhpcyBmdW5jdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLCB3aXRoIHVwZGF0ZWQgZGVjLT5zdGF0dXNfLgoraW50IFZQOExEZWNvZGVJbWFnZShWUDhMRGVjb2RlciogY29uc3QgZGVjKTsKKworLy8gUmVzZXRzIHRoZSBkZWNvZGVyIGluIGl0cyBpbml0aWFsIHN0YXRlLCByZWNsYWltaW5nIG1lbW9yeS4KKy8vIFByZXNlcnZlcyB0aGUgZGVjLT5zdGF0dXNfIHZhbHVlLgordm9pZCBWUDhMQ2xlYXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vIENsZWFycyBhbmQgZGVhbGxvY2F0ZSBhIGxvc3NsZXNzIGRlY29kZXIgaW5zdGFuY2UuCit2b2lkIFZQOExEZWxldGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX0RFQ19WUDhMSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3dlYnAuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy93ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxYzA4NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy93ZWJwLmMKQEAgLTAsMCArMSw4MzQgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNYWluIGRlY29kaW5nIGZ1bmN0aW9ucyBmb3IgV0VCUCBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL3ZwOGxpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL211eF90eXBlcy5oIiAgLy8gQUxQSEFfRkxBRworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUklGRiBsYXlvdXQgaXM6CisvLyAgIE9mZnNldCAgdGFnCisvLyAgIDAuLi4zICAgIlJJRkYiIDQtYnl0ZSB0YWcKKy8vICAgNC4uLjcgICBzaXplIG9mIGltYWdlIGRhdGEgKGluY2x1ZGluZyBtZXRhZGF0YSkgc3RhcnRpbmcgYXQgb2Zmc2V0IDgKKy8vICAgOC4uLjExICAiV0VCUCIgICBvdXIgZm9ybS10eXBlIHNpZ25hdHVyZQorLy8gVGhlIFJJRkYgY29udGFpbmVyICgxMiBieXRlcykgaXMgZm9sbG93ZWQgYnkgYXBwcm9wcmlhdGUgY2h1bmtzOgorLy8gICAxMi4uMTUgICJWUDggIjogNC1ieXRlcyB0YWdzLCBzaWduYWxpbmcgdGhlIHVzZSBvZiBWUDggdmlkZW8gZm9ybWF0CisvLyAgIDE2Li4xOSAgc2l6ZSBvZiB0aGUgcmF3IFZQOCBpbWFnZSBkYXRhLCBzdGFydGluZyBhdCBvZmZzZXQgMjAKKy8vICAgMjAuLi4uICB0aGUgVlA4IGJ5dGVzCisvLyBPciwKKy8vICAgMTIuLjE1ICAiVlA4TCI6IDQtYnl0ZXMgdGFncywgc2lnbmFsaW5nIHRoZSB1c2Ugb2YgVlA4TCBsb3NzbGVzcyBmb3JtYXQKKy8vICAgMTYuLjE5ICBzaXplIG9mIHRoZSByYXcgVlA4TCBpbWFnZSBkYXRhLCBzdGFydGluZyBhdCBvZmZzZXQgMjAKKy8vICAgMjAuLi4uICB0aGUgVlA4TCBieXRlcworLy8gT3IsCisvLyAgIDEyLi4xNSAgIlZQOFgiOiA0LWJ5dGVzIHRhZ3MsIGRlc2NyaWJpbmcgdGhlIGV4dGVuZGVkLVZQOCBjaHVuay4KKy8vICAgMTYuLjE5ICBzaXplIG9mIHRoZSBWUDhYIGNodW5rIHN0YXJ0aW5nIGF0IG9mZnNldCAyMC4KKy8vICAgMjAuLjIzICBWUDhYIGZsYWdzIGJpdC1tYXAgY29ycmVzcG9uZGluZyB0byB0aGUgY2h1bmstdHlwZXMgcHJlc2VudC4KKy8vICAgMjQuLjI2ICBXaWR0aCBvZiB0aGUgQ2FudmFzIEltYWdlLgorLy8gICAyNy4uMjkgIEhlaWdodCBvZiB0aGUgQ2FudmFzIEltYWdlLgorLy8gVGhlcmUgY2FuIGJlIGV4dHJhIGNodW5rcyBhZnRlciB0aGUgIlZQOFgiIGNodW5rIChJQ0NQLCBGUkdNLCBBTk1GLCBWUDgsCisvLyBWUDhMLCBYTVAsIEVYSUYgIC4uLikKKy8vIEFsbCBzaXplcyBhcmUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KKy8vIE5vdGU6IGNodW5rIGRhdGEgc2l6ZSBtdXN0IGJlIHBhZGRlZCB0byBtdWx0aXBsZSBvZiAyIHdoZW4gd3JpdHRlbi4KKworLy8gVmFsaWRhdGVzIHRoZSBSSUZGIGNvbnRhaW5lciAoaWYgZGV0ZWN0ZWQpIGFuZCBza2lwcyBvdmVyIGl0LgorLy8gSWYgYSBSSUZGIGNvbnRhaW5lciBpcyBkZXRlY3RlZCwgcmV0dXJuczoKKy8vICAgICBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiBmb3IgaW52YWxpZCBoZWFkZXIsCisvLyAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgZm9yIHRydW5jYXRlZCBkYXRhIGlmIGhhdmVfYWxsX2RhdGEgaXMgdHJ1ZSwKKy8vIGFuZCBWUDhfU1RBVFVTX09LIG90aGVyd2lzZS4KKy8vIEluIGNhc2UgdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgKHBhcnRpYWwgUklGRiBjb250YWluZXIpLCByZXR1cm4gMCBmb3IKKy8vICpyaWZmX3NpemUuIEVsc2UgcmV0dXJuIHRoZSBSSUZGIHNpemUgZXh0cmFjdGVkIGZyb20gdGhlIGhlYWRlci4KK3N0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlUklGRihjb25zdCB1aW50OF90KiogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwgaW50IGhhdmVfYWxsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCByaWZmX3NpemUpIHsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChyaWZmX3NpemUgIT0gTlVMTCk7CisKKyAgKnJpZmZfc2l6ZSA9IDA7ICAvLyBEZWZhdWx0OiBubyBSSUZGIHByZXNlbnQuCisgIGlmICgqZGF0YV9zaXplID49IFJJRkZfSEVBREVSX1NJWkUgJiYgIW1lbWNtcCgqZGF0YSwgIlJJRkYiLCBUQUdfU0laRSkpIHsKKyAgICBpZiAobWVtY21wKCpkYXRhICsgOCwgIldFQlAiLCBUQUdfU0laRSkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIFdyb25nIGltYWdlIGZpbGUgc2lnbmF0dXJlLgorICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gR2V0TEUzMigqZGF0YSArIFRBR19TSVpFKTsKKyAgICAgIC8vIENoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2h1bmsgKGkuZSAiV0VCUCIgKyAiVlA4P25ubm4iKS4KKyAgICAgIGlmIChzaXplIDwgVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgICB9CisgICAgICBpZiAoc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICAgIH0KKyAgICAgIGlmIChoYXZlX2FsbF9kYXRhICYmIChzaXplID4gKmRhdGFfc2l6ZSAtIENIVU5LX0hFQURFUl9TSVpFKSkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBUcnVuY2F0ZWQgYml0c3RyZWFtLgorICAgICAgfQorICAgICAgLy8gV2UgaGF2ZSBhIFJJRkYgY29udGFpbmVyLiBTa2lwIGl0LgorICAgICAgKnJpZmZfc2l6ZSA9IHNpemU7CisgICAgICAqZGF0YSArPSBSSUZGX0hFQURFUl9TSVpFOworICAgICAgKmRhdGFfc2l6ZSAtPSBSSUZGX0hFQURFUl9TSVpFOworICAgIH0KKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworLy8gVmFsaWRhdGVzIHRoZSBWUDhYIGhlYWRlciBhbmQgc2tpcHMgb3ZlciBpdC4KKy8vIFJldHVybnMgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgZm9yIGludmFsaWQgVlA4WCBoZWFkZXIsCisvLyAgICAgICAgIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBIGluIGNhc2Ugb2YgaW5zdWZmaWNpZW50IGRhdGEsIGFuZAorLy8gICAgICAgICBWUDhfU1RBVFVTX09LIG90aGVyd2lzZS4KKy8vIElmIGEgVlA4WCBjaHVuayBpcyBmb3VuZCwgZm91bmRfdnA4eCBpcyBzZXQgdG8gdHJ1ZSBhbmQgKndpZHRoX3B0ciwKKy8vICpoZWlnaHRfcHRyIGFuZCAqZmxhZ3NfcHRyIGFyZSBzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGV4dHJhY3RlZAorLy8gZnJvbSB0aGUgVlA4WCBjaHVuay4KK3N0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlVlA4WChjb25zdCB1aW50OF90KiogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGZvdW5kX3ZwOHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aF9wdHIsIGludCogY29uc3QgaGVpZ2h0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZmxhZ3NfcHRyKSB7CisgIGNvbnN0IHVpbnQzMl90IHZwOHhfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgVlA4WF9DSFVOS19TSVpFOworICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGFfc2l6ZSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGZvdW5kX3ZwOHggIT0gTlVMTCk7CisKKyAgKmZvdW5kX3ZwOHggPSAwOworCisgIGlmICgqZGF0YV9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KKyAgfQorCisgIGlmICghbWVtY21wKCpkYXRhLCAiVlA4WCIsIFRBR19TSVpFKSkgeworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBHZXRMRTMyKCpkYXRhICsgVEFHX1NJWkUpOworICAgIGlmIChjaHVua19zaXplICE9IFZQOFhfQ0hVTktfU0laRSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gV3JvbmcgY2h1bmsgc2l6ZS4KKyAgICB9CisKKyAgICAvLyBWZXJpZnkgaWYgZW5vdWdoIGRhdGEgaXMgYXZhaWxhYmxlIHRvIHZhbGlkYXRlIHRoZSBWUDhYIGNodW5rLgorICAgIGlmICgqZGF0YV9zaXplIDwgdnA4eF9zaXplKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KKyAgICB9CisgICAgZmxhZ3MgPSBHZXRMRTMyKCpkYXRhICsgOCk7CisgICAgd2lkdGggPSAxICsgR2V0TEUyNCgqZGF0YSArIDEyKTsKKyAgICBoZWlnaHQgPSAxICsgR2V0TEUyNCgqZGF0YSArIDE1KTsKKyAgICBpZiAod2lkdGggKiAodWludDY0X3QpaGVpZ2h0ID49IE1BWF9JTUFHRV9BUkVBKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBpbWFnZSBpcyB0b28gbGFyZ2UKKyAgICB9CisKKyAgICBpZiAoZmxhZ3NfcHRyICE9IE5VTEwpICpmbGFnc19wdHIgPSBmbGFnczsKKyAgICBpZiAod2lkdGhfcHRyICE9IE5VTEwpICp3aWR0aF9wdHIgPSB3aWR0aDsKKyAgICBpZiAoaGVpZ2h0X3B0ciAhPSBOVUxMKSAqaGVpZ2h0X3B0ciA9IGhlaWdodDsKKyAgICAvLyBTa2lwIG92ZXIgVlA4WCBoZWFkZXIgYnl0ZXMuCisgICAgKmRhdGEgKz0gdnA4eF9zaXplOworICAgICpkYXRhX3NpemUgLT0gdnA4eF9zaXplOworICAgICpmb3VuZF92cDh4ID0gMTsKKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworLy8gU2tpcHMgdG8gdGhlIG5leHQgVlA4L1ZQOEwgY2h1bmsgaGVhZGVyIGluIHRoZSBkYXRhIGdpdmVuIHRoZSBzaXplIG9mIHRoZQorLy8gUklGRiBjaHVuayAncmlmZl9zaXplJy4KKy8vIFJldHVybnMgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgaWYgYW55IGludmFsaWQgY2h1bmsgc2l6ZSBpcyBlbmNvdW50ZXJlZCwKKy8vICAgICAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgaW4gY2FzZSBvZiBpbnN1ZmZpY2llbnQgZGF0YSwgYW5kCisvLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgorLy8gSWYgYW4gYWxwaGEgY2h1bmsgaXMgZm91bmQsICphbHBoYV9kYXRhIGFuZCAqYWxwaGFfc2l6ZSBhcmUgc2V0CisvLyBhcHByb3ByaWF0ZWx5Lgorc3RhdGljIFZQOFN0YXR1c0NvZGUgUGFyc2VPcHRpb25hbENodW5rcyhjb25zdCB1aW50OF90KiogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb25zdCByaWZmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBjb25zdCBhbHBoYV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGFscGhhX3NpemUpIHsKKyAgY29uc3QgdWludDhfdCogYnVmOworICBzaXplX3QgYnVmX3NpemU7CisgIHVpbnQzMl90IHRvdGFsX3NpemUgPSBUQUdfU0laRSArICAgICAgICAgICAvLyAiV0VCUCIuCisgICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSArICAvLyAiVlA4WG5ubm4iLgorICAgICAgICAgICAgICAgICAgICAgICAgVlA4WF9DSFVOS19TSVpFOyAgICAgLy8gZGF0YS4KKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisgIGJ1ZiA9ICpkYXRhOworICBidWZfc2l6ZSA9ICpkYXRhX3NpemU7CisKKyAgYXNzZXJ0KGFscGhhX2RhdGEgIT0gTlVMTCk7CisgIGFzc2VydChhbHBoYV9zaXplICE9IE5VTEwpOworICAqYWxwaGFfZGF0YSA9IE5VTEw7CisgICphbHBoYV9zaXplID0gMDsKKworICB3aGlsZSAoMSkgeworICAgIHVpbnQzMl90IGNodW5rX3NpemU7CisgICAgdWludDMyX3QgZGlza19jaHVua19zaXplOyAgIC8vIGNodW5rX3NpemUgd2l0aCBwYWRkaW5nCisKKyAgICAqZGF0YSA9IGJ1ZjsKKyAgICAqZGF0YV9zaXplID0gYnVmX3NpemU7CisKKyAgICBpZiAoYnVmX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgeyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgfQorCisgICAgY2h1bmtfc2l6ZSA9IEdldExFMzIoYnVmICsgVEFHX1NJWkUpOworICAgIGlmIChjaHVua19zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgICAgICAgICAgLy8gTm90IGEgdmFsaWQgY2h1bmsgc2l6ZS4KKyAgICB9CisgICAgLy8gRm9yIG9kZC1zaXplZCBjaHVuay1wYXlsb2FkLCB0aGVyZSdzIG9uZSBieXRlIHBhZGRpbmcgYXQgdGhlIGVuZC4KKyAgICBkaXNrX2NodW5rX3NpemUgPSAoQ0hVTktfSEVBREVSX1NJWkUgKyBjaHVua19zaXplICsgMSkgJiB+MTsKKyAgICB0b3RhbF9zaXplICs9IGRpc2tfY2h1bmtfc2l6ZTsKKworICAgIC8vIENoZWNrIHRoYXQgdG90YWwgYnl0ZXMgc2tpcHBlZCBzbyBmYXIgZG9lcyBub3QgZXhjZWVkIHJpZmZfc2l6ZS4KKyAgICBpZiAocmlmZl9zaXplID4gMCAmJiAodG90YWxfc2l6ZSA+IHJpZmZfc2l6ZSkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgICAgICAgICAgLy8gTm90IGEgdmFsaWQgY2h1bmsgc2l6ZS4KKyAgICB9CisKKyAgICAvLyBTdGFydCBvZiBhIChwb3NzaWJseSBpbmNvbXBsZXRlKSBWUDgvVlA4TCBjaHVuayBpbXBsaWVzIHRoYXQgd2UgaGF2ZQorICAgIC8vIHBhcnNlZCBhbGwgdGhlIG9wdGlvbmFsIGNodW5rcy4KKyAgICAvLyBOb3RlOiBUaGlzIGNoZWNrIG11c3Qgb2NjdXIgYmVmb3JlIHRoZSBjaGVjayAnYnVmX3NpemUgPCBkaXNrX2NodW5rX3NpemUnCisgICAgLy8gYmVsb3cgdG8gYWxsb3cgaW5jb21wbGV0ZSBWUDgvVlA4TCBjaHVua3MuCisgICAgaWYgKCFtZW1jbXAoYnVmLCAiVlA4ICIsIFRBR19TSVpFKSB8fAorICAgICAgICAhbWVtY21wKGJ1ZiwgIlZQOEwiLCBUQUdfU0laRSkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmIChidWZfc2l6ZSA8IGRpc2tfY2h1bmtfc2l6ZSkgeyAgICAgICAgICAgICAvLyBJbnN1ZmZpY2llbnQgZGF0YS4KKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKKyAgICB9CisKKyAgICBpZiAoIW1lbWNtcChidWYsICJBTFBIIiwgVEFHX1NJWkUpKSB7ICAgICAgICAgLy8gQSB2YWxpZCBBTFBIIGhlYWRlci4KKyAgICAgICphbHBoYV9kYXRhID0gYnVmICsgQ0hVTktfSEVBREVSX1NJWkU7CisgICAgICAqYWxwaGFfc2l6ZSA9IGNodW5rX3NpemU7CisgICAgfQorCisgICAgLy8gV2UgaGF2ZSBhIGZ1bGwgYW5kIHZhbGlkIGNodW5rOyBza2lwIGl0LgorICAgIGJ1ZiArPSBkaXNrX2NodW5rX3NpemU7CisgICAgYnVmX3NpemUgLT0gZGlza19jaHVua19zaXplOworICB9Cit9CisKKy8vIFZhbGlkYXRlcyB0aGUgVlA4L1ZQOEwgSGVhZGVyICgiVlA4IG5ubm4iIG9yICJWUDhMIG5ubm4iKSBhbmQgc2tpcHMgb3ZlciBpdC4KKy8vIFJldHVybnMgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgZm9yIGludmFsaWQgKGNodW5rIGxhcmdlciB0aGFuCisvLyAgICAgICAgIHJpZmZfc2l6ZSkgVlA4L1ZQOEwgaGVhZGVyLAorLy8gICAgICAgICBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSBpbiBjYXNlIG9mIGluc3VmZmljaWVudCBkYXRhLCBhbmQKKy8vICAgICAgICAgVlA4X1NUQVRVU19PSyBvdGhlcndpc2UuCisvLyBJZiBhIFZQOC9WUDhMIGNodW5rIGlzIGZvdW5kLCAqY2h1bmtfc2l6ZSBpcyBzZXQgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcworLy8gZXh0cmFjdGVkIGZyb20gdGhlIFZQOC9WUDhMIGNodW5rIGhlYWRlci4KKy8vIFRoZSBmbGFnICcqaXNfbG9zc2xlc3MnIGlzIHNldCB0byAxIGluIGNhc2Ugb2YgVlA4TCBjaHVuayAvIHJhdyBWUDhMIGRhdGEuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVZQOEhlYWRlcihjb25zdCB1aW50OF90KiogY29uc3QgZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwgaW50IGhhdmVfYWxsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLCBzaXplX3QqIGNvbnN0IGNodW5rX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGlzX2xvc3NsZXNzKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSAqZGF0YV9wdHI7CisgIGNvbnN0IGludCBpc192cDggPSAhbWVtY21wKGRhdGEsICJWUDggIiwgVEFHX1NJWkUpOworICBjb25zdCBpbnQgaXNfdnA4bCA9ICFtZW1jbXAoZGF0YSwgIlZQOEwiLCBUQUdfU0laRSk7CisgIGNvbnN0IHVpbnQzMl90IG1pbmltYWxfc2l6ZSA9CisgICAgICBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFOyAgLy8gIldFQlAiICsgIlZQOCBubm5uIiBPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJXRUJQIiArICJWUDhMbm5ubiIKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChjaHVua19zaXplICE9IE5VTEwpOworICBhc3NlcnQoaXNfbG9zc2xlc3MgIT0gTlVMTCk7CisKKyAgaWYgKCpkYXRhX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIEluc3VmZmljaWVudCBkYXRhLgorICB9CisKKyAgaWYgKGlzX3ZwOCB8fCBpc192cDhsKSB7CisgICAgLy8gQml0c3RyZWFtIGNvbnRhaW5zIFZQOC9WUDhMIGhlYWRlci4KKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gR2V0TEUzMihkYXRhICsgVEFHX1NJWkUpOworICAgIGlmICgocmlmZl9zaXplID49IG1pbmltYWxfc2l6ZSkgJiYgKHNpemUgPiByaWZmX3NpemUgLSBtaW5pbWFsX3NpemUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBJbmNvbnNpc3RlbnQgc2l6ZSBpbmZvcm1hdGlvbi4KKyAgICB9CisgICAgaWYgKGhhdmVfYWxsX2RhdGEgJiYgKHNpemUgPiAqZGF0YV9zaXplIC0gQ0hVTktfSEVBREVSX1NJWkUpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBUcnVuY2F0ZWQgYml0c3RyZWFtLgorICAgIH0KKyAgICAvLyBTa2lwIG92ZXIgQ0hVTktfSEVBREVSX1NJWkUgYnl0ZXMgZnJvbSBWUDgvVlA4TCBIZWFkZXIuCisgICAgKmNodW5rX3NpemUgPSBzaXplOworICAgICpkYXRhX3B0ciArPSBDSFVOS19IRUFERVJfU0laRTsKKyAgICAqZGF0YV9zaXplIC09IENIVU5LX0hFQURFUl9TSVpFOworICAgICppc19sb3NzbGVzcyA9IGlzX3ZwOGw7CisgIH0gZWxzZSB7CisgICAgLy8gUmF3IFZQOC9WUDhMIGJpdHN0cmVhbSAobm8gaGVhZGVyKS4KKyAgICAqaXNfbG9zc2xlc3MgPSBWUDhMQ2hlY2tTaWduYXR1cmUoZGF0YSwgKmRhdGFfc2l6ZSk7CisgICAgKmNodW5rX3NpemUgPSAqZGF0YV9zaXplOworICB9CisKKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZldGNoICcqd2lkdGgnLCAnKmhlaWdodCcsICcqaGFzX2FscGhhJyBhbmQgZmlsbCBvdXQgJ2hlYWRlcnMnIGJhc2VkIG9uCisvLyAnZGF0YScuIEFsbCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgbWF5IGJlIE5VTEwuIElmICdoZWFkZXJzJyBpcyBOVUxMIG9ubHkgdGhlCisvLyBtaW5pbWFsIGFtb3VudCB3aWxsIGJlIHJlYWQgdG8gZmV0Y2ggdGhlIHJlbWFpbmluZyBwYXJhbWV0ZXJzLgorLy8gSWYgJ2hlYWRlcnMnIGlzIG5vbi1OVUxMIHRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZSBib3RoIGFscGhhCisvLyBkYXRhICh3aXRoIG9yIHdpdGhvdXQgYSBWUDhYIGNodW5rKSBhbmQgdGhlIGJpdHN0cmVhbSBjaHVuayAoVlA4L1ZQOEwpLgorLy8gTm90ZTogVGhlIGZvbGxvd2luZyBjaHVuayBzZXF1ZW5jZXMgKGJlZm9yZSB0aGUgcmF3IFZQOC9WUDhMIGRhdGEpIGFyZQorLy8gY29uc2lkZXJlZCB2YWxpZCBieSB0aGlzIGZ1bmN0aW9uOgorLy8gUklGRiArIFZQOChMKQorLy8gUklGRiArIFZQOFggKyAob3B0aW9uYWwgY2h1bmtzKSArIFZQOChMKQorLy8gQUxQSCArIFZQOCA8LS0gTm90IGEgdmFsaWQgV2ViUCBmb3JtYXQ6IG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJuYWwgcHVycG9zZS4KKy8vIFZQOChMKSAgICAgPC0tIE5vdCBhIHZhbGlkIFdlYlAgZm9ybWF0OiBvbmx5IGFsbG93ZWQgZm9yIGludGVybmFsIHB1cnBvc2UuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZUhlYWRlcnNJbnRlcm5hbChjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSGVhZGVyU3RydWN0dXJlKiBjb25zdCBoZWFkZXJzKSB7CisgIGludCBjYW52YXNfd2lkdGggPSAwOworICBpbnQgY2FudmFzX2hlaWdodCA9IDA7CisgIGludCBpbWFnZV93aWR0aCA9IDA7CisgIGludCBpbWFnZV9oZWlnaHQgPSAwOworICBpbnQgZm91bmRfcmlmZiA9IDA7CisgIGludCBmb3VuZF92cDh4ID0gMDsKKyAgaW50IGFuaW1hdGlvbl9wcmVzZW50ID0gMDsKKyAgaW50IGZyYWdtZW50c19wcmVzZW50ID0gMDsKKyAgY29uc3QgaW50IGhhdmVfYWxsX2RhdGEgPSAoaGVhZGVycyAhPSBOVUxMKSA/IGhlYWRlcnMtPmhhdmVfYWxsX2RhdGEgOiAwOworCisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBXZWJQSGVhZGVyU3RydWN0dXJlIGhkcnM7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPCBSSUZGX0hFQURFUl9TSVpFKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICB9CisgIG1lbXNldCgmaGRycywgMCwgc2l6ZW9mKGhkcnMpKTsKKyAgaGRycy5kYXRhID0gZGF0YTsKKyAgaGRycy5kYXRhX3NpemUgPSBkYXRhX3NpemU7CisKKyAgLy8gU2tpcCBvdmVyIFJJRkYgaGVhZGVyLgorICBzdGF0dXMgPSBQYXJzZVJJRkYoJmRhdGEsICZkYXRhX3NpemUsIGhhdmVfYWxsX2RhdGEsICZoZHJzLnJpZmZfc2l6ZSk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBzdGF0dXM7ICAgLy8gV3JvbmcgUklGRiBoZWFkZXIgLyBpbnN1ZmZpY2llbnQgZGF0YS4KKyAgfQorICBmb3VuZF9yaWZmID0gKGhkcnMucmlmZl9zaXplID4gMCk7CisKKyAgLy8gU2tpcCBvdmVyIFZQOFguCisgIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgc3RhdHVzID0gUGFyc2VWUDhYKCZkYXRhLCAmZGF0YV9zaXplLCAmZm91bmRfdnA4eCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNhbnZhc193aWR0aCwgJmNhbnZhc19oZWlnaHQsICZmbGFncyk7CisgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgICByZXR1cm4gc3RhdHVzOyAgLy8gV3JvbmcgVlA4WCAvIGluc3VmZmljaWVudCBkYXRhLgorICAgIH0KKyAgICBhbmltYXRpb25fcHJlc2VudCA9ICEhKGZsYWdzICYgQU5JTUFUSU9OX0ZMQUcpOworICAgIGZyYWdtZW50c19wcmVzZW50ID0gISEoZmxhZ3MgJiBGUkFHTUVOVFNfRkxBRyk7CisgICAgaWYgKCFmb3VuZF9yaWZmICYmIGZvdW5kX3ZwOHgpIHsKKyAgICAgIC8vIE5vdGU6IFRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgaWYgaXQgYmVjb21lcworICAgICAgLy8gbmVjZXNzYXJ5IHRvIHNlbmQgVlA4WCBjaHVuayB0byB0aGUgZGVjb2Rlci4KKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSAqaGFzX2FscGhhID0gISEoZmxhZ3MgJiBBTFBIQV9GTEFHKTsKKyAgICBpZiAoaGFzX2FuaW1hdGlvbiAhPSBOVUxMKSAqaGFzX2FuaW1hdGlvbiA9IGFuaW1hdGlvbl9wcmVzZW50OworICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgKmZvcm1hdCA9IDA7ICAgLy8gZGVmYXVsdCA9IHVuZGVmaW5lZAorCisgICAgaWYgKGZvdW5kX3ZwOHggJiYgKGFuaW1hdGlvbl9wcmVzZW50IHx8IGZyYWdtZW50c19wcmVzZW50KSAmJgorICAgICAgICBoZWFkZXJzID09IE5VTEwpIHsKKyAgICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBjYW52YXNfd2lkdGg7CisgICAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBjYW52YXNfaGVpZ2h0OworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7ICAvLyBKdXN0IHJldHVybiBmZWF0dXJlcyBmcm9tIFZQOFggaGVhZGVyLgorICAgIH0KKyAgfQorCisgIGlmIChkYXRhX3NpemUgPCBUQUdfU0laRSkgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworCisgIC8vIFNraXAgb3ZlciBvcHRpb25hbCBjaHVua3MgaWYgZGF0YSBzdGFydGVkIHdpdGggIlJJRkYgKyBWUDhYIiBvciAiQUxQSCIuCisgIGlmICgoZm91bmRfcmlmZiAmJiBmb3VuZF92cDh4KSB8fAorICAgICAgKCFmb3VuZF9yaWZmICYmICFmb3VuZF92cDh4ICYmICFtZW1jbXAoZGF0YSwgIkFMUEgiLCBUQUdfU0laRSkpKSB7CisgICAgc3RhdHVzID0gUGFyc2VPcHRpb25hbENodW5rcygmZGF0YSwgJmRhdGFfc2l6ZSwgaGRycy5yaWZmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRycy5hbHBoYV9kYXRhLCAmaGRycy5hbHBoYV9kYXRhX3NpemUpOworICAgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgICAgcmV0dXJuIHN0YXR1czsgIC8vIEZvdW5kIGFuIGludmFsaWQgY2h1bmsgc2l6ZSAvIGluc3VmZmljaWVudCBkYXRhLgorICAgIH0KKyAgfQorCisgIC8vIFNraXAgb3ZlciBWUDgvVlA4TCBoZWFkZXIuCisgIHN0YXR1cyA9IFBhcnNlVlA4SGVhZGVyKCZkYXRhLCAmZGF0YV9zaXplLCBoYXZlX2FsbF9kYXRhLCBoZHJzLnJpZmZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhkcnMuY29tcHJlc3NlZF9zaXplLCAmaGRycy5pc19sb3NzbGVzcyk7CisgIGlmIChzdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBzdGF0dXM7ICAvLyBXcm9uZyBWUDgvVlA4TCBjaHVuay1oZWFkZXIgLyBpbnN1ZmZpY2llbnQgZGF0YS4KKyAgfQorICBpZiAoaGRycy5jb21wcmVzc2VkX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgfQorCisgIGlmIChmb3JtYXQgIT0gTlVMTCAmJiAhKGFuaW1hdGlvbl9wcmVzZW50IHx8IGZyYWdtZW50c19wcmVzZW50KSkgeworICAgICpmb3JtYXQgPSBoZHJzLmlzX2xvc3NsZXNzID8gMiA6IDE7CisgIH0KKworICBpZiAoIWhkcnMuaXNfbG9zc2xlc3MpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIC8vIFZhbGlkYXRlcyByYXcgVlA4IGRhdGEuCisgICAgaWYgKCFWUDhHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwgKHVpbnQzMl90KWhkcnMuY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQpKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgfQorICAgIC8vIFZhbGlkYXRlcyByYXcgVlA4TCBkYXRhLgorICAgIGlmICghVlA4TEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQsIGhhc19hbHBoYSkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgIH0KKyAgLy8gVmFsaWRhdGVzIGltYWdlIHNpemUgY29oZXJlbmN5LgorICBpZiAoZm91bmRfdnA4eCkgeworICAgIGlmIChjYW52YXNfd2lkdGggIT0gaW1hZ2Vfd2lkdGggfHwgY2FudmFzX2hlaWdodCAhPSBpbWFnZV9oZWlnaHQpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgIH0KKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IGltYWdlX3dpZHRoOworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBpbWFnZV9oZWlnaHQ7CisgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgeworICAgIC8vIElmIHRoZSBkYXRhIGRpZCBub3QgY29udGFpbiBhIFZQOFgvVlA4TCBjaHVuayB0aGUgb25seSBkZWZpbml0aXZlIHdheQorICAgIC8vIHRvIHNldCB0aGlzIGlzIGJ5IGxvb2tpbmcgZm9yIGFscGhhIGRhdGEgKGZyb20gYW4gQUxQSCBjaHVuaykuCisgICAgKmhhc19hbHBoYSB8PSAoaGRycy5hbHBoYV9kYXRhICE9IE5VTEwpOworICB9CisgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAqaGVhZGVycyA9IGhkcnM7CisgICAgaGVhZGVycy0+b2Zmc2V0ID0gZGF0YSAtIGhlYWRlcnMtPmRhdGE7CisgICAgYXNzZXJ0KCh1aW50NjRfdCkoZGF0YSAtIGhlYWRlcnMtPmRhdGEpIDwgTUFYX0NIVU5LX1BBWUxPQUQpOworICAgIGFzc2VydChoZWFkZXJzLT5vZmZzZXQgPT0gaGVhZGVycy0+ZGF0YV9zaXplIC0gZGF0YV9zaXplKTsKKyAgfQorICByZXR1cm4gVlA4X1NUQVRVU19PSzsgIC8vIFJldHVybiBmZWF0dXJlcyBmcm9tIFZQOCBoZWFkZXIuCit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUFBhcnNlSGVhZGVycyhXZWJQSGVhZGVyU3RydWN0dXJlKiBjb25zdCBoZWFkZXJzKSB7CisgIC8vIHN0YXR1cyBpcyBtYXJrZWQgdm9sYXRpbGUgYXMgYSB3b3JrYXJvdW5kIGZvciBhIGNsYW5nLTMuOCAoYWFyY2g2NCkgYnVnCisgIHZvbGF0aWxlIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBpbnQgaGFzX2FuaW1hdGlvbiA9IDA7CisgIGFzc2VydChoZWFkZXJzICE9IE5VTEwpOworICAvLyBmaWxsIG91dCBoZWFkZXJzLCBpZ25vcmUgd2lkdGgvaGVpZ2h0L2hhc19hbHBoYS4KKyAgc3RhdHVzID0gUGFyc2VIZWFkZXJzSW50ZXJuYWwoaGVhZGVycy0+ZGF0YSwgaGVhZGVycy0+ZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmaGFzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaGVhZGVycyk7CisgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyB8fCBzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAvLyBUT0RPKGp6ZXJuKTogZnVsbCBzdXBwb3J0IG9mIGFuaW1hdGlvbiBmcmFtZXMgd2lsbCByZXF1aXJlIEFQSSBhZGRpdGlvbnMuCisgICAgaWYgKGhhc19hbmltYXRpb24pIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBEZWNQYXJhbXMKKwordm9pZCBXZWJQUmVzZXREZWNQYXJhbXMoV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMgIT0gTlVMTCkgeworICAgIG1lbXNldChwYXJhbXMsIDAsIHNpemVvZigqcGFyYW1zKSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICJJbnRvIiBkZWNvZGluZyB2YXJpYW50cworCisvLyBNYWluIGZsb3cKK3N0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZUludG8oY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zKSB7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBWUDhJbyBpbzsKKyAgV2ViUEhlYWRlclN0cnVjdHVyZSBoZWFkZXJzOworCisgIGhlYWRlcnMuZGF0YSA9IGRhdGE7CisgIGhlYWRlcnMuZGF0YV9zaXplID0gZGF0YV9zaXplOworICBoZWFkZXJzLmhhdmVfYWxsX2RhdGEgPSAxOworICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsgICAvLyBQcm9jZXNzIFByZS1WUDggY2h1bmtzLgorICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisKKyAgYXNzZXJ0KHBhcmFtcyAhPSBOVUxMKTsKKyAgVlA4SW5pdElvKCZpbyk7CisgIGlvLmRhdGEgPSBoZWFkZXJzLmRhdGEgKyBoZWFkZXJzLm9mZnNldDsKKyAgaW8uZGF0YV9zaXplID0gaGVhZGVycy5kYXRhX3NpemUgLSBoZWFkZXJzLm9mZnNldDsKKyAgV2ViUEluaXRDdXN0b21JbyhwYXJhbXMsICZpbyk7ICAvLyBQbHVnIHRoZSBJL08gZnVuY3Rpb25zLgorCisgIGlmICghaGVhZGVycy5pc19sb3NzbGVzcykgeworICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IFZQOE5ldygpOworICAgIGlmIChkZWMgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICB9CisgICAgZGVjLT5hbHBoYV9kYXRhXyA9IGhlYWRlcnMuYWxwaGFfZGF0YTsKKyAgICBkZWMtPmFscGhhX2RhdGFfc2l6ZV8gPSBoZWFkZXJzLmFscGhhX2RhdGFfc2l6ZTsKKworICAgIC8vIERlY29kZSBiaXRzdHJlYW0gaGVhZGVyLCB1cGRhdGUgaW8tPndpZHRoL2lvLT5oZWlnaHQuCisgICAgaWYgKCFWUDhHZXRIZWFkZXJzKGRlYywgJmlvKSkgeworICAgICAgc3RhdHVzID0gZGVjLT5zdGF0dXNfOyAgIC8vIEFuIGVycm9yIG9jY3VycmVkLiBHcmFiIGVycm9yIHN0YXR1cy4KKyAgICB9IGVsc2UgeworICAgICAgLy8gQWxsb2NhdGUvY2hlY2sgb3V0cHV0IGJ1ZmZlcnMuCisgICAgICBzdGF0dXMgPSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW8ud2lkdGgsIGlvLmhlaWdodCwgcGFyYW1zLT5vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+b3V0cHV0KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSykgeyAgLy8gRGVjb2RlCisgICAgICAgIC8vIFRoaXMgY2hhbmdlIG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyBWUDhEZWNvZGUoKQorICAgICAgICBkZWMtPm10X21ldGhvZF8gPSBWUDhHZXRUaHJlYWRNZXRob2QocGFyYW1zLT5vcHRpb25zLCAmaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLndpZHRoLCBpby5oZWlnaHQpOworICAgICAgICBWUDhJbml0RGl0aGVyaW5nKHBhcmFtcy0+b3B0aW9ucywgZGVjKTsKKyAgICAgICAgaWYgKCFWUDhEZWNvZGUoZGVjLCAmaW8pKSB7CisgICAgICAgICAgc3RhdHVzID0gZGVjLT5zdGF0dXNfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFZQOERlbGV0ZShkZWMpOworICB9IGVsc2UgeworICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSBWUDhMTmV3KCk7CisgICAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIH0KKyAgICBpZiAoIVZQOExEZWNvZGVIZWFkZXIoZGVjLCAmaW8pKSB7CisgICAgICBzdGF0dXMgPSBkZWMtPnN0YXR1c187ICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQuIEdyYWIgZXJyb3Igc3RhdHVzLgorICAgIH0gZWxzZSB7CisgICAgICAvLyBBbGxvY2F0ZS9jaGVjayBvdXRwdXQgYnVmZmVycy4KKyAgICAgIHN0YXR1cyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby53aWR0aCwgaW8uaGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdXRwdXQpOworICAgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBEZWNvZGUKKyAgICAgICAgaWYgKCFWUDhMRGVjb2RlSW1hZ2UoZGVjKSkgeworICAgICAgICAgIHN0YXR1cyA9IGRlYy0+c3RhdHVzXzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBWUDhMRGVsZXRlKGRlYyk7CisgIH0KKworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBXZWJQRnJlZURlY0J1ZmZlcihwYXJhbXMtPm91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHBhcmFtcy0+b3B0aW9ucyAhPSBOVUxMICYmIHBhcmFtcy0+b3B0aW9ucy0+ZmxpcCkgeworICAgICAgLy8gVGhpcyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyaWRlIHZhbHVlcyBpZiBvcHRpb25zLT5mbGlwIHdhcyB1c2VkCisgICAgICAvLyBkdXJpbmcgdGhlIGNhbGwgdG8gV2ViUEFsbG9jYXRlRGVjQnVmZmVyIGFib3ZlLgorICAgICAgc3RhdHVzID0gV2ViUEZsaXBCdWZmZXIocGFyYW1zLT5vdXRwdXQpOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCisvLyBIZWxwZXJzCitzdGF0aWMgdWludDhfdCogRGVjb2RlSW50b1JHQkFCdWZmZXIoV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHNpemVfdCBzaXplKSB7CisgIFdlYlBEZWNQYXJhbXMgcGFyYW1zOworICBXZWJQRGVjQnVmZmVyIGJ1ZjsKKyAgaWYgKHJnYmEgPT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIFdlYlBJbml0RGVjQnVmZmVyKCZidWYpOworICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7CisgIHBhcmFtcy5vdXRwdXQgPSAmYnVmOworICBidWYuY29sb3JzcGFjZSAgICA9IGNvbG9yc3BhY2U7CisgIGJ1Zi51LlJHQkEucmdiYSAgID0gcmdiYTsKKyAgYnVmLnUuUkdCQS5zdHJpZGUgPSBzdHJpZGU7CisgIGJ1Zi51LlJHQkEuc2l6ZSAgID0gc2l6ZTsKKyAgYnVmLmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisgIGlmIChEZWNvZGVJbnRvKGRhdGEsIGRhdGFfc2l6ZSwgJnBhcmFtcykgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByZ2JhOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCSW50byhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgeworICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9SR0IsIGRhdGEsIGRhdGFfc2l6ZSwgb3V0cHV0LCBzdHJpZGUsIHNpemUpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCQUludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBzaXplLCBpbnQgc3RyaWRlKSB7CisgIHJldHVybiBEZWNvZGVJbnRvUkdCQUJ1ZmZlcihNT0RFX1JHQkEsIGRhdGEsIGRhdGFfc2l6ZSwgb3V0cHV0LCBzdHJpZGUsIHNpemUpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlQVJHQkludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBzaXplLCBpbnQgc3RyaWRlKSB7CisgIHJldHVybiBEZWNvZGVJbnRvUkdCQUJ1ZmZlcihNT0RFX0FSR0IsIGRhdGEsIGRhdGFfc2l6ZSwgb3V0cHV0LCBzdHJpZGUsIHNpemUpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlQkdSSW50byhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgc2l6ZSwgaW50IHN0cmlkZSkgeworICByZXR1cm4gRGVjb2RlSW50b1JHQkFCdWZmZXIoTU9ERV9CR1IsIGRhdGEsIGRhdGFfc2l6ZSwgb3V0cHV0LCBzdHJpZGUsIHNpemUpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlQkdSQUludG8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBzaXplLCBpbnQgc3RyaWRlKSB7CisgIHJldHVybiBEZWNvZGVJbnRvUkdCQUJ1ZmZlcihNT0RFX0JHUkEsIGRhdGEsIGRhdGFfc2l6ZSwgb3V0cHV0LCBzdHJpZGUsIHNpemUpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlWVVWSW50byhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdiwgc2l6ZV90IHZfc2l6ZSwgaW50IHZfc3RyaWRlKSB7CisgIFdlYlBEZWNQYXJhbXMgcGFyYW1zOworICBXZWJQRGVjQnVmZmVyIG91dHB1dDsKKyAgaWYgKGx1bWEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIFdlYlBJbml0RGVjQnVmZmVyKCZvdXRwdXQpOworICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7CisgIHBhcmFtcy5vdXRwdXQgPSAmb3V0cHV0OworICBvdXRwdXQuY29sb3JzcGFjZSAgICAgID0gTU9ERV9ZVVY7CisgIG91dHB1dC51LllVVkEueSAgICAgICAgPSBsdW1hOworICBvdXRwdXQudS5ZVVZBLnlfc3RyaWRlID0gbHVtYV9zdHJpZGU7CisgIG91dHB1dC51LllVVkEueV9zaXplICAgPSBsdW1hX3NpemU7CisgIG91dHB1dC51LllVVkEudSAgICAgICAgPSB1OworICBvdXRwdXQudS5ZVVZBLnVfc3RyaWRlID0gdV9zdHJpZGU7CisgIG91dHB1dC51LllVVkEudV9zaXplICAgPSB1X3NpemU7CisgIG91dHB1dC51LllVVkEudiAgICAgICAgPSB2OworICBvdXRwdXQudS5ZVVZBLnZfc3RyaWRlID0gdl9zdHJpZGU7CisgIG91dHB1dC51LllVVkEudl9zaXplICAgPSB2X3NpemU7CisgIG91dHB1dC5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICBpZiAoRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gbHVtYTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHVpbnQ4X3QqIERlY29kZShXRUJQX0NTUF9NT0RFIG1vZGUsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBrZWVwX2luZm8pIHsKKyAgV2ViUERlY1BhcmFtcyBwYXJhbXM7CisgIFdlYlBEZWNCdWZmZXIgb3V0cHV0OworCisgIFdlYlBJbml0RGVjQnVmZmVyKCZvdXRwdXQpOworICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7CisgIHBhcmFtcy5vdXRwdXQgPSAmb3V0cHV0OworICBvdXRwdXQuY29sb3JzcGFjZSA9IG1vZGU7CisKKyAgLy8gUmV0cmlldmUgKGFuZCByZXBvcnQgYmFjaykgdGhlIHJlcXVpcmVkIGRpbWVuc2lvbnMgZnJvbSBiaXRzdHJlYW0uCisgIGlmICghV2ViUEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCAmb3V0cHV0LndpZHRoLCAmb3V0cHV0LmhlaWdodCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gb3V0cHV0LndpZHRoOworICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBvdXRwdXQuaGVpZ2h0OworCisgIC8vIERlY29kZQorICBpZiAoRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoa2VlcF9pbmZvICE9IE5VTEwpIHsgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgc2lkZS1pbmZvCisgICAgV2ViUENvcHlEZWNCdWZmZXIoJm91dHB1dCwga2VlcF9pbmZvKTsKKyAgfQorICAvLyByZXR1cm4gZGVjb2RlZCBzYW1wbGVzIChkb24ndCBjbGVhciAnb3V0cHV0JyEpCisgIHJldHVybiBXZWJQSXNSR0JNb2RlKG1vZGUpID8gb3V0cHV0LnUuUkdCQS5yZ2JhIDogb3V0cHV0LnUuWVVWQS55OworfQorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHJldHVybiBEZWNvZGUoTU9ERV9SR0IsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Cit9CisKK3VpbnQ4X3QqIFdlYlBEZWNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKE1PREVfUkdCQSwgZGF0YSwgZGF0YV9zaXplLCB3aWR0aCwgaGVpZ2h0LCBOVUxMKTsKK30KKwordWludDhfdCogV2ViUERlY29kZUFSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHJldHVybiBEZWNvZGUoTU9ERV9BUkdCLCBkYXRhLCBkYXRhX3NpemUsIHdpZHRoLCBoZWlnaHQsIE5VTEwpOworfQorCit1aW50OF90KiBXZWJQRGVjb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHJldHVybiBEZWNvZGUoTU9ERV9CR1IsIGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgTlVMTCk7Cit9CisKK3VpbnQ4X3QqIFdlYlBEZWNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKE1PREVfQkdSQSwgZGF0YSwgZGF0YV9zaXplLCB3aWR0aCwgaGVpZ2h0LCBOVUxMKTsKK30KKwordWludDhfdCogV2ViUERlY29kZVlVVihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUpIHsKKyAgV2ViUERlY0J1ZmZlciBvdXRwdXQ7ICAgLy8gb25seSB0byBwcmVzZXJ2ZSB0aGUgc2lkZS1pbmZvcworICB1aW50OF90KiBjb25zdCBvdXQgPSBEZWNvZGUoTU9ERV9ZVVYsIGRhdGEsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsICZvdXRwdXQpOworCisgIGlmIChvdXQgIT0gTlVMTCkgeworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LnUuWVVWQTsKKyAgICAqdSA9IGJ1Zi0+dTsKKyAgICAqdiA9IGJ1Zi0+djsKKyAgICAqc3RyaWRlID0gYnVmLT55X3N0cmlkZTsKKyAgICAqdXZfc3RyaWRlID0gYnVmLT51X3N0cmlkZTsKKyAgICBhc3NlcnQoYnVmLT51X3N0cmlkZSA9PSBidWYtPnZfc3RyaWRlKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgdm9pZCBEZWZhdWx0RmVhdHVyZXMoV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgeworICBhc3NlcnQoZmVhdHVyZXMgIT0gTlVMTCk7CisgIG1lbXNldChmZWF0dXJlcywgMCwgc2l6ZW9mKCpmZWF0dXJlcykpOworfQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBHZXRGZWF0dXJlcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgeworICBpZiAoZmVhdHVyZXMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIERlZmF1bHRGZWF0dXJlcyhmZWF0dXJlcyk7CisKKyAgLy8gT25seSBwYXJzZSBlbm91Z2ggb2YgdGhlIGRhdGEgdG8gcmV0cmlldmUgdGhlIGZlYXR1cmVzLgorICByZXR1cm4gUGFyc2VIZWFkZXJzSW50ZXJuYWwoZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT53aWR0aCwgJmZlYXR1cmVzLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMtPmhhc19hbHBoYSwgJmZlYXR1cmVzLT5oYXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT5mb3JtYXQsIE5VTEwpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUEdldEluZm8oKQorCitpbnQgV2ViUEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgZmVhdHVyZXM7CisKKyAgaWYgKEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmZlYXR1cmVzKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAod2lkdGggIT0gTlVMTCkgeworICAgICp3aWR0aCAgPSBmZWF0dXJlcy53aWR0aDsKKyAgfQorICBpZiAoaGVpZ2h0ICE9IE5VTEwpIHsKKyAgICAqaGVpZ2h0ID0gZmVhdHVyZXMuaGVpZ2h0OworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZHZhbmNlIGRlY29kaW5nIEFQSQorCitpbnQgV2ViUEluaXREZWNvZGVyQ29uZmlnSW50ZXJuYWwoV2ViUERlY29kZXJDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyB2ZXJzaW9uIG1pc21hdGNoCisgIH0KKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKKyAgRGVmYXVsdEZlYXR1cmVzKCZjb25maWctPmlucHV0KTsKKyAgV2ViUEluaXREZWNCdWZmZXIoJmNvbmZpZy0+b3V0cHV0KTsKKyAgcmV0dXJuIDE7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUEdldEZlYXR1cmVzSW50ZXJuYWwoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBmZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsgICAvLyB2ZXJzaW9uIG1pc21hdGNoCisgIH0KKyAgaWYgKGZlYXR1cmVzID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICB9CisgIHJldHVybiBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsIGZlYXR1cmVzKTsKK30KKworVlA4U3RhdHVzQ29kZSBXZWJQRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZykgeworICBXZWJQRGVjUGFyYW1zIHBhcmFtczsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisKKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorCisgIHN0YXR1cyA9IEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy0+aW5wdXQpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBOb3QtZW5vdWdoLWRhdGEgdHJlYXRlZCBhcyBlcnJvci4KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIFdlYlBSZXNldERlY1BhcmFtcygmcGFyYW1zKTsKKyAgcGFyYW1zLm9wdGlvbnMgPSAmY29uZmlnLT5vcHRpb25zOworICBwYXJhbXMub3V0cHV0ID0gJmNvbmZpZy0+b3V0cHV0OworICBpZiAoV2ViUEF2b2lkU2xvd01lbW9yeShwYXJhbXMub3V0cHV0LCAmY29uZmlnLT5pbnB1dCkpIHsKKyAgICAvLyBkZWNvZGluZyB0byBzbG93IG1lbW9yeTogdXNlIGEgdGVtcG9yYXJ5IGluLW1lbSBidWZmZXIgdG8gZGVjb2RlIGludG8uCisgICAgV2ViUERlY0J1ZmZlciBpbl9tZW1fYnVmZmVyOworICAgIFdlYlBJbml0RGVjQnVmZmVyKCZpbl9tZW1fYnVmZmVyKTsKKyAgICBpbl9tZW1fYnVmZmVyLmNvbG9yc3BhY2UgPSBjb25maWctPm91dHB1dC5jb2xvcnNwYWNlOworICAgIGluX21lbV9idWZmZXIud2lkdGggPSBjb25maWctPmlucHV0LndpZHRoOworICAgIGluX21lbV9idWZmZXIuaGVpZ2h0ID0gY29uZmlnLT5pbnB1dC5oZWlnaHQ7CisgICAgcGFyYW1zLm91dHB1dCA9ICZpbl9tZW1fYnVmZmVyOworICAgIHN0YXR1cyA9IERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spIHsgIC8vIGRvIHRoZSBzbG93LWNvcHkKKyAgICAgIHN0YXR1cyA9IFdlYlBDb3B5RGVjQnVmZmVyUGl4ZWxzKCZpbl9tZW1fYnVmZmVyLCAmY29uZmlnLT5vdXRwdXQpOworICAgIH0KKyAgICBXZWJQRnJlZURlY0J1ZmZlcigmaW5fbWVtX2J1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzID0gRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpOworICB9CisKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3BwaW5nIGFuZCByZXNjYWxpbmcuCisKK2ludCBXZWJQSW9Jbml0RnJvbU9wdGlvbnMoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhJbyogY29uc3QgaW8sIFdFQlBfQ1NQX01PREUgc3JjX2NvbG9yc3BhY2UpIHsKKyAgY29uc3QgaW50IFcgPSBpby0+d2lkdGg7CisgIGNvbnN0IGludCBIID0gaW8tPmhlaWdodDsKKyAgaW50IHggPSAwLCB5ID0gMCwgdyA9IFcsIGggPSBIOworCisgIC8vIENyb3BwaW5nCisgIGlvLT51c2VfY3JvcHBpbmcgPSAob3B0aW9ucyAhPSBOVUxMKSAmJiAob3B0aW9ucy0+dXNlX2Nyb3BwaW5nID4gMCk7CisgIGlmIChpby0+dXNlX2Nyb3BwaW5nKSB7CisgICAgdyA9IG9wdGlvbnMtPmNyb3Bfd2lkdGg7CisgICAgaCA9IG9wdGlvbnMtPmNyb3BfaGVpZ2h0OworICAgIHggPSBvcHRpb25zLT5jcm9wX2xlZnQ7CisgICAgeSA9IG9wdGlvbnMtPmNyb3BfdG9wOworICAgIGlmICghV2ViUElzUkdCTW9kZShzcmNfY29sb3JzcGFjZSkpIHsgICAvLyBvbmx5IHNuYXAgZm9yIFlVVjQyMAorICAgICAgeCAmPSB+MTsKKyAgICAgIHkgJj0gfjE7CisgICAgfQorICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB3IDw9IDAgfHwgaCA8PSAwIHx8IHggKyB3ID4gVyB8fCB5ICsgaCA+IEgpIHsKKyAgICAgIHJldHVybiAwOyAgLy8gb3V0IG9mIGZyYW1lIGJvdW5kYXJ5IGVycm9yCisgICAgfQorICB9CisgIGlvLT5jcm9wX2xlZnQgICA9IHg7CisgIGlvLT5jcm9wX3RvcCAgICA9IHk7CisgIGlvLT5jcm9wX3JpZ2h0ICA9IHggKyB3OworICBpby0+Y3JvcF9ib3R0b20gPSB5ICsgaDsKKyAgaW8tPm1iX3cgPSB3OworICBpby0+bWJfaCA9IGg7CisKKyAgLy8gU2NhbGluZworICBpby0+dXNlX3NjYWxpbmcgPSAob3B0aW9ucyAhPSBOVUxMKSAmJiAob3B0aW9ucy0+dXNlX3NjYWxpbmcgPiAwKTsKKyAgaWYgKGlvLT51c2Vfc2NhbGluZykgeworICAgIGludCBzY2FsZWRfd2lkdGggPSBvcHRpb25zLT5zY2FsZWRfd2lkdGg7CisgICAgaW50IHNjYWxlZF9oZWlnaHQgPSBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0OworICAgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyh3LCBoLCAmc2NhbGVkX3dpZHRoLCAmc2NhbGVkX2hlaWdodCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpby0+c2NhbGVkX3dpZHRoID0gc2NhbGVkX3dpZHRoOworICAgIGlvLT5zY2FsZWRfaGVpZ2h0ID0gc2NhbGVkX2hlaWdodDsKKyAgfQorCisgIC8vIEZpbHRlcgorICBpby0+YnlwYXNzX2ZpbHRlcmluZyA9IChvcHRpb25zICE9IE5VTEwpICYmIG9wdGlvbnMtPmJ5cGFzc19maWx0ZXJpbmc7CisKKyAgLy8gRmFuY3kgdXBzYW1wbGVyCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworICBpby0+ZmFuY3lfdXBzYW1wbGluZyA9IChvcHRpb25zID09IE5VTEwpIHx8ICghb3B0aW9ucy0+bm9fZmFuY3lfdXBzYW1wbGluZyk7CisjZW5kaWYKKworICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7CisgICAgLy8gZGlzYWJsZSBmaWx0ZXIgKG9ubHkgZm9yIGxhcmdlIGRvd25zY2FsaW5nIHJhdGlvKS4KKyAgICBpby0+YnlwYXNzX2ZpbHRlcmluZyA9IChpby0+c2NhbGVkX3dpZHRoIDwgVyAqIDMgLyA0KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlvLT5zY2FsZWRfaGVpZ2h0IDwgSCAqIDMgLyA0KTsKKyAgICBpby0+ZmFuY3lfdXBzYW1wbGluZyA9IDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicGkuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy93ZWJwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGRhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvd2VicGkuaApAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEludGVybmFsIGhlYWRlcjogV2ViUCBkZWNvZGluZyBwYXJhbWV0ZXJzIGFuZCBjdXN0b20gSU8gb24gYnVmZmVyCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9ERUNfV0VCUElfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9ERUNfV0VCUElfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2RlY29kZV92cDguaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBEZWNQYXJhbXM6IERlY29kaW5nIG91dHB1dCBwYXJhbWV0ZXJzLiBUcmFuc2llbnQgaW50ZXJuYWwgb2JqZWN0LgorCit0eXBlZGVmIHN0cnVjdCBXZWJQRGVjUGFyYW1zIFdlYlBEZWNQYXJhbXM7Cit0eXBlZGVmIGludCAoKk91dHB1dEZ1bmMpKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCk7Cit0eXBlZGVmIGludCAoKk91dHB1dEFscGhhRnVuYykoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fb3V0X2xpbmVzKTsKK3R5cGVkZWYgaW50ICgqT3V0cHV0Um93RnVuYykoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X291dF9saW5lcyk7CisKK3N0cnVjdCBXZWJQRGVjUGFyYW1zIHsKKyAgV2ViUERlY0J1ZmZlciogb3V0cHV0OyAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyLgorICB1aW50OF90KiB0bXBfeSwgKnRtcF91LCAqdG1wX3Y7ICAgIC8vIGNhY2hlIGZvciB0aGUgZmFuY3kgdXBzYW1wbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgdXNlZCBmb3IgdG1wIHJlc2NhbGluZworCisgIGludCBsYXN0X3k7ICAgICAgICAgICAgICAgICAvLyBjb29yZGluYXRlIG9mIHRoZSBsaW5lIHRoYXQgd2FzIGxhc3Qgb3V0cHV0CisgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogb3B0aW9uczsgIC8vIGlmIG5vdCBOVUxMLCB1c2UgYWx0IGRlY29kaW5nIGZlYXR1cmVzCisgIC8vIHJlc2NhbGVycworICBXZWJQUmVzY2FsZXIgc2NhbGVyX3ksIHNjYWxlcl91LCBzY2FsZXJfdiwgc2NhbGVyX2E7CisgIHZvaWQqIG1lbW9yeTsgICAgICAgICAgICAgICAgICAvLyBvdmVyYWxsIHNjcmF0Y2ggbWVtb3J5IGZvciB0aGUgb3V0cHV0IHdvcmsuCisKKyAgT3V0cHV0RnVuYyBlbWl0OyAgICAgICAgICAgICAgIC8vIG91dHB1dCBSR0Igb3IgWVVWIHNhbXBsZXMKKyAgT3V0cHV0QWxwaGFGdW5jIGVtaXRfYWxwaGE7ICAgIC8vIG91dHB1dCBhbHBoYSBjaGFubmVsCisgIE91dHB1dFJvd0Z1bmMgZW1pdF9hbHBoYV9yb3c7ICAvLyBvdXRwdXQgb25lIGxpbmUgb2YgcmVzY2FsZWQgYWxwaGEgdmFsdWVzCisKKyAgV2ViUERlY0J1ZmZlciogZmluYWxfb3V0cHV0OyAgIC8vIEluIGNhc2UgdGhlIHVzZXIgc3VwcGxpZWQgYSBzbG93LW1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0LCB3ZSBkZWNvZGUgaW1hZ2UgaW4gdGVtcG9yYXJ5IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRoaXM6Om91dHB1dCkgYW5kIGNvcHkgaXQgaGVyZS4KKyAgV2ViUERlY0J1ZmZlciB0bXBfYnVmZmVyOyAgICAgIC8vIHRoaXM6Om91dHB1dCB3aWxsIHBvaW50IHRvIHRoaXMgb25lIGluIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHNsb3cgbWVtb3J5LgorfTsKKworLy8gU2hvdWxkIGJlIGNhbGxlZCBmaXJzdCwgYmVmb3JlIGFueSB1c2Ugb2YgdGhlIFdlYlBEZWNQYXJhbXMgb2JqZWN0Lgordm9pZCBXZWJQUmVzZXREZWNQYXJhbXMoV2ViUERlY1BhcmFtcyogY29uc3QgcGFyYW1zKTsKKworLy8gRGVsZXRlIGFsbCBtZW1vcnkgKGFmdGVyIGFuIGVycm9yIG9jY3VycmVkLCBmb3IgaW5zdGFuY2UpCit2b2lkIFdlYlBGcmVlRGVjUGFyYW1zKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXIgcGFyc2luZyBoZWxwZXJzCisKKy8vIFN0cnVjdHVyZSBzdG9yaW5nIGEgZGVzY3JpcHRpb24gb2YgdGhlIFJJRkYgaGVhZGVycy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsgICAgICAgICAvLyBpbnB1dCBidWZmZXIKKyAgc2l6ZV90IGRhdGFfc2l6ZTsgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICBpbnQgaGF2ZV9hbGxfZGF0YTsgICAgICAgICAgIC8vIHRydWUgaWYgYWxsIGRhdGEgaXMga25vd24gdG8gYmUgYXZhaWxhYmxlCisgIHNpemVfdCBvZmZzZXQ7ICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIG1haW4gZGF0YSBjaHVuayAoVlA4IG9yIFZQOEwpCisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX2RhdGE7ICAgLy8gcG9pbnRzIHRvIGFscGhhIGNodW5rIChpZiBwcmVzZW50KQorICBzaXplX3QgYWxwaGFfZGF0YV9zaXplOyAgICAgIC8vIGFscGhhIGNodW5rIHNpemUKKyAgc2l6ZV90IGNvbXByZXNzZWRfc2l6ZTsgICAgICAvLyBWUDgvVlA4TCBjb21wcmVzc2VkIGRhdGEgc2l6ZQorICBzaXplX3QgcmlmZl9zaXplOyAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHJpZmYgcGF5bG9hZCAob3IgMCBpZiBhYnNlbnQpCisgIGludCBpc19sb3NzbGVzczsgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBhIFZQOEwgY2h1bmsgaXMgcHJlc2VudAorfSBXZWJQSGVhZGVyU3RydWN0dXJlOworCisvLyBTa2lwcyBvdmVyIGFsbCB2YWxpZCBjaHVua3MgcHJpb3IgdG8gdGhlIGZpcnN0IFZQOC9WUDhMIGZyYW1lIGhlYWRlci4KKy8vIFJldHVybnM6IFZQOF9TVEFUVVNfT0ssIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIChpbnZhbGlkIGhlYWRlci9jaHVuayksCisvLyBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSAocGFydGlhbCBpbnB1dCkgb3IgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFCisvLyBpbiB0aGUgY2FzZSBvZiBub24tZGVjb2RhYmxlIGZlYXR1cmVzIChhbmltYXRpb24gZm9yIGluc3RhbmNlKS4KKy8vIEluICdoZWFkZXJzJywgY29tcHJlc3NlZF9zaXplLCBvZmZzZXQsIGFscGhhX2RhdGEsIGFscGhhX3NpemUsIGFuZCBsb3NzbGVzcworLy8gZmllbGRzIGFyZSB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgdXBvbiBzdWNjZXNzLgorVlA4U3RhdHVzQ29kZSBXZWJQUGFyc2VIZWFkZXJzKFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzYyB1dGlscworCisvLyBJbml0aWFsaXplcyBWUDhJbyB3aXRoIGN1c3RvbSBzZXR1cCwgaW8gYW5kIHRlYXJkb3duIGZ1bmN0aW9ucy4gVGhlIGRlZmF1bHQKKy8vIGhvb2tzIHdpbGwgdXNlIHRoZSBzdXBwbGllZCAncGFyYW1zJyBhcyBpby0+b3BhcXVlIGhhbmRsZS4KK3ZvaWQgV2ViUEluaXRDdXN0b21JbyhXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMsIFZQOElvKiBjb25zdCBpbyk7CisKKy8vIFNldHVwIGNyb3BfeHh4IGZpZWxkcywgbWJfdyBhbmQgbWJfaCBpbiBpby4gJ3NyY19jb2xvcnNwYWNlJyByZWZlcnMKKy8vIHRvIHRoZSAqY29tcHJlc3NlZCogZm9ybWF0LCBub3QgdGhlIG91dHB1dCBvbmUuCitpbnQgV2ViUElvSW5pdEZyb21PcHRpb25zKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SW8qIGNvbnN0IGlvLCBXRUJQX0NTUF9NT0RFIHNyY19jb2xvcnNwYWNlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludGVybmFsIGZ1bmN0aW9ucyByZWdhcmRpbmcgV2ViUERlY0J1ZmZlciBtZW1vcnkgKGluIGJ1ZmZlci5jKS4KKy8vIERvbid0IHJlYWxseSBuZWVkIHRvIGJlIGV4dGVybmFsbHkgdmlzaWJsZSBmb3Igbm93LgorCisvLyBQcmVwYXJlICdidWZmZXInIHdpdGggdGhlIHJlcXVlc3RlZCBpbml0aWFsIGRpbWVuc2lvbnMgd2lkdGgvaGVpZ2h0LgorLy8gSWYgbm8gZXh0ZXJuYWwgc3RvcmFnZSBpcyBzdXBwbGllZCwgaW5pdGlhbGl6ZXMgYnVmZmVyIGJ5IGFsbG9jYXRpbmcgb3V0cHV0CisvLyBtZW1vcnkgYW5kIHNldHRpbmcgdXAgdGhlIHN0cmlkZSBpbmZvcm1hdGlvbi4gVmFsaWRhdGUgdGhlIHBhcmFtZXRlcnMuIFJldHVybgorLy8gYW4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIHByb2JsZW0gKG5vIG1lbW9yeSwgb3IgaW52YWxpZCBzdHJpZGUgLyBzaXplIC8KKy8vIGRpbWVuc2lvbiAvIGV0Yy4pLiBJZiAqb3B0aW9ucyBpcyBub3QgTlVMTCwgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgb3B0aW9ucycKKy8vIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGFuZCBhcHBseSB0aGVtIHRvIHRoZSB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucyBvZiB0aGUKKy8vIG91dHB1dCBidWZmZXIuIFRoaXMgdGFrZXMgY3JvcHBpbmcgLyBzY2FsaW5nIC8gcm90YXRpb24gaW50byBhY2NvdW50LgorLy8gQWxzbyBpbmNvcnBvcmF0ZXMgdGhlIG9wdGlvbnMtPmZsaXAgZmxhZyB0byBmbGlwIHRoZSBidWZmZXIgcGFyYW1ldGVycyBpZgorLy8gbmVlZGVkLgorVlA4U3RhdHVzQ29kZSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworLy8gRmxpcCBidWZmZXIgdmVydGljYWxseSBieSBuZWdhdGluZyB0aGUgdmFyaW91cyBzdHJpZGVzLgorVlA4U3RhdHVzQ29kZSBXZWJQRmxpcEJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBDb3B5ICdzcmMnIGludG8gJ2RzdCcgYnVmZmVyLCBtYWtpbmcgc3VyZSAnZHN0JyBpcyBub3QgbWFya2VkIGFzIG93bmVyIG9mIHRoZQorLy8gbWVtb3J5IChzdGlsbCBoZWxkIGJ5ICdzcmMnKS4gTm8gcGl4ZWxzIGFyZSBjb3BpZWQuCit2b2lkIFdlYlBDb3B5RGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KTsKKworLy8gQ29weSBhbmQgdHJhbnNmZXIgb3duZXJzaGlwIGZyb20gc3JjIHRvIGRzdCAoYmV3YXJlIG9mIHBhcmFtZXRlciBvcmRlciEpCit2b2lkIFdlYlBHcmFiRGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KTsKKworLy8gQ29weSBwaXhlbHMgZnJvbSAnc3JjJyBpbnRvIGEgKnByZWFsbG9jYXRlZCogJ2RzdCcgYnVmZmVyLiBSZXR1cm5zCisvLyBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0gaWYgdGhlICdkc3QnIGlzIG5vdCBzZXQgdXAgY29ycmVjdGx5IGZvciB0aGUgY29weS4KK1ZQOFN0YXR1c0NvZGUgV2ViUENvcHlEZWNCdWZmZXJQaXhlbHMoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpOworCisvLyBSZXR1cm5zIHRydWUgaWYgZGVjb2Rpbmcgd2lsbCBiZSBzbG93IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgorLy8gYW5kIGJpdHN0cmVhbSBmZWF0dXJlcy4KK2ludCBXZWJQQXZvaWRTbG93TWVtb3J5KGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9ERUNfV0VCUElfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZW11eC9kZW11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzQ0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZW11eC9kZW11eC5jCkBAIC0wLDAgKzEsOTY2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFdlYlAgY29udGFpbmVyIGRlbXV4LgorLy8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICIuLi93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgiICAgICAvLyBXZWJQR2V0RmVhdHVyZXMKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZGVtdXguaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisjZGVmaW5lIERNVVhfTUFKX1ZFUlNJT04gMAorI2RlZmluZSBETVVYX01JTl9WRVJTSU9OIDMKKyNkZWZpbmUgRE1VWF9SRVZfVkVSU0lPTiAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2l6ZV90IHN0YXJ0XzsgICAgICAgIC8vIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBkYXRhCisgIHNpemVfdCBlbmRfOyAgICAgICAgICAvLyBlbmQgbG9jYXRpb24KKyAgc2l6ZV90IHJpZmZfZW5kXzsgICAgIC8vIHJpZmYgY2h1bmsgZW5kIGxvY2F0aW9uLCBjYW4gYmUgPiBlbmRfLgorICBzaXplX3QgYnVmX3NpemVfOyAgICAgLy8gc2l6ZSBvZiB0aGUgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87Cit9IE1lbUJ1ZmZlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3Qgb2Zmc2V0XzsKKyAgc2l6ZV90IHNpemVfOworfSBDaHVua0RhdGE7CisKK3R5cGVkZWYgc3RydWN0IEZyYW1lIHsKKyAgaW50IHhfb2Zmc2V0XywgeV9vZmZzZXRfOworICBpbnQgd2lkdGhfLCBoZWlnaHRfOworICBpbnQgaGFzX2FscGhhXzsKKyAgaW50IGR1cmF0aW9uXzsKKyAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kXzsKKyAgV2ViUE11eEFuaW1CbGVuZCBibGVuZF9tZXRob2RfOworICBpbnQgZnJhbWVfbnVtXzsKKyAgaW50IGNvbXBsZXRlXzsgICAvLyBpbWdfY29tcG9uZW50c18gY29udGFpbnMgYSBmdWxsIGltYWdlLgorICBDaHVua0RhdGEgaW1nX2NvbXBvbmVudHNfWzJdOyAgLy8gMD1WUDh7LEx9IDE9QUxQSAorICBzdHJ1Y3QgRnJhbWUqIG5leHRfOworfSBGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ2h1bmsgeworICBDaHVua0RhdGEgZGF0YV87CisgIHN0cnVjdCBDaHVuayogbmV4dF87Cit9IENodW5rOworCitzdHJ1Y3QgV2ViUERlbXV4ZXIgeworICBNZW1CdWZmZXIgbWVtXzsKKyAgV2ViUERlbXV4U3RhdGUgc3RhdGVfOworICBpbnQgaXNfZXh0X2Zvcm1hdF87CisgIHVpbnQzMl90IGZlYXR1cmVfZmxhZ3NfOworICBpbnQgY2FudmFzX3dpZHRoXywgY2FudmFzX2hlaWdodF87CisgIGludCBsb29wX2NvdW50XzsKKyAgdWludDMyX3QgYmdjb2xvcl87CisgIGludCBudW1fZnJhbWVzXzsKKyAgRnJhbWUqIGZyYW1lc187CisgIEZyYW1lKiogZnJhbWVzX3RhaWxfOworICBDaHVuayogY2h1bmtzXzsgIC8vIG5vbi1pbWFnZSBjaHVua3MKKyAgQ2h1bmsqKiBjaHVua3NfdGFpbF87Cit9OworCit0eXBlZGVmIGVudW0geworICBQQVJTRV9PSywKKyAgUEFSU0VfTkVFRF9NT1JFX0RBVEEsCisgIFBBUlNFX0VSUk9SCit9IFBhcnNlU3RhdHVzOworCit0eXBlZGVmIHN0cnVjdCBDaHVua1BhcnNlciB7CisgIHVpbnQ4X3QgaWRbNF07CisgIFBhcnNlU3RhdHVzICgqcGFyc2UpKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKKyAgaW50ICgqdmFsaWQpKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK30gQ2h1bmtQYXJzZXI7CisKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVNpbmdsZUltYWdlKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK3N0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVZQOFgoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpOworc3RhdGljIGludCBJc1ZhbGlkU2ltcGxlRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKK3N0YXRpYyBpbnQgSXNWYWxpZEV4dGVuZGVkRm9ybWF0KGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KTsKKworc3RhdGljIGNvbnN0IENodW5rUGFyc2VyIGtNYXN0ZXJDaHVua3NbXSA9IHsKKyAgeyB7ICdWJywgJ1AnLCAnOCcsICcgJyB9LCBQYXJzZVNpbmdsZUltYWdlLCBJc1ZhbGlkU2ltcGxlRm9ybWF0IH0sCisgIHsgeyAnVicsICdQJywgJzgnLCAnTCcgfSwgUGFyc2VTaW5nbGVJbWFnZSwgSXNWYWxpZFNpbXBsZUZvcm1hdCB9LAorICB7IHsgJ1YnLCAnUCcsICc4JywgJ1gnIH0sIFBhcnNlVlA4WCwgICAgICAgIElzVmFsaWRFeHRlbmRlZEZvcm1hdCB9LAorICB7IHsgJzAnLCAnMCcsICcwJywgJzAnIH0sIE5VTEwsICAgICAgICAgICAgIE5VTEwgfSwKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChETVVYX01BSl9WRVJTSU9OIDw8IDE2KSB8IChETVVYX01JTl9WRVJTSU9OIDw8IDgpIHwgRE1VWF9SRVZfVkVSU0lPTjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbUJ1ZmZlcgorCitzdGF0aWMgaW50IFJlbWFwTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCisKKyAgbWVtLT5idWZfID0gZGF0YTsKKyAgbWVtLT5lbmRfID0gbWVtLT5idWZfc2l6ZV8gPSBzaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBJbml0TWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIG1lbXNldChtZW0sIDAsIHNpemVvZigqbWVtKSk7CisgIHJldHVybiBSZW1hcE1lbUJ1ZmZlcihtZW0sIGRhdGEsIHNpemUpOworfQorCisvLyBSZXR1cm4gdGhlIHJlbWFpbmluZyBkYXRhIHNpemUgYXZhaWxhYmxlIGluICdtZW0nLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBNZW1EYXRhU2l6ZShjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gKG1lbS0+ZW5kXyAtIG1lbS0+c3RhcnRfKTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgJ3NpemUnIGV4Y2VlZHMgdGhlIGVuZCBvZiB0aGUgUklGRiBjaHVuay4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgU2l6ZUlzSW52YWxpZChjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIChzaXplID4gbWVtLT5yaWZmX2VuZF8gLSBtZW0tPnN0YXJ0Xyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNraXAoTWVtQnVmZmVyKiBjb25zdCBtZW0sIHNpemVfdCBzaXplKSB7CisgIG1lbS0+c3RhcnRfICs9IHNpemU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJld2luZChNZW1CdWZmZXIqIGNvbnN0IG1lbSwgc2l6ZV90IHNpemUpIHsKKyAgbWVtLT5zdGFydF8gLT0gc2l6ZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGNvbnN0IHVpbnQ4X3QqIEdldEJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Cit9CisKKy8vIFJlYWQgZnJvbSAnbWVtJyBhbmQgc2tpcCB0aGUgcmVhZCBieXRlcy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFJlYWRCeXRlKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHVpbnQ4X3QgYnl0ZSA9IG1lbS0+YnVmX1ttZW0tPnN0YXJ0X107CisgIFNraXAobWVtLCAxKTsKKyAgcmV0dXJuIGJ5dGU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUmVhZExFMTZzKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKKyAgY29uc3QgaW50IHZhbCA9IEdldExFMTYoZGF0YSk7CisgIFNraXAobWVtLCAyKTsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkTEUyNHMoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCBpbnQgdmFsID0gR2V0TEUyNChkYXRhKTsKKyAgU2tpcChtZW0sIDMpOworICByZXR1cm4gdmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUmVhZExFMzIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOworICBjb25zdCB1aW50MzJfdCB2YWwgPSBHZXRMRTMyKGRhdGEpOworICBTa2lwKG1lbSwgNCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZWNvbmRhcnkgY2h1bmsgcGFyc2luZworCitzdGF0aWMgdm9pZCBBZGRDaHVuayhXZWJQRGVtdXhlciogY29uc3QgZG11eCwgQ2h1bmsqIGNvbnN0IGNodW5rKSB7CisgICpkbXV4LT5jaHVua3NfdGFpbF8gPSBjaHVuazsKKyAgY2h1bmstPm5leHRfID0gTlVMTDsKKyAgZG11eC0+Y2h1bmtzX3RhaWxfID0gJmNodW5rLT5uZXh0XzsKK30KKworLy8gQWRkIGEgZnJhbWUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCwgZW5zdXJpbmcgdGhlIGxhc3QgZnJhbWUgaXMgY29tcGxldGUuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorc3RhdGljIGludCBBZGRGcmFtZShXZWJQRGVtdXhlciogY29uc3QgZG11eCwgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CisgIGNvbnN0IEZyYW1lKiBjb25zdCBsYXN0X2ZyYW1lID0gKmRtdXgtPmZyYW1lc190YWlsXzsKKyAgaWYgKGxhc3RfZnJhbWUgIT0gTlVMTCAmJiAhbGFzdF9mcmFtZS0+Y29tcGxldGVfKSByZXR1cm4gMDsKKworICAqZG11eC0+ZnJhbWVzX3RhaWxfID0gZnJhbWU7CisgIGZyYW1lLT5uZXh0XyA9IE5VTEw7CisgIGRtdXgtPmZyYW1lc190YWlsXyA9ICZmcmFtZS0+bmV4dF87CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBTZXRGcmFtZUluZm8oc2l6ZV90IHN0YXJ0X29mZnNldCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwgaW50IGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUqIGNvbnN0IGZyYW1lKSB7CisgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMF0ub2Zmc2V0XyA9IHN0YXJ0X29mZnNldDsKKyAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5zaXplXyA9IHNpemU7CisgIGZyYW1lLT53aWR0aF8gPSBmZWF0dXJlcy0+d2lkdGg7CisgIGZyYW1lLT5oZWlnaHRfID0gZmVhdHVyZXMtPmhlaWdodDsKKyAgZnJhbWUtPmhhc19hbHBoYV8gfD0gZmVhdHVyZXMtPmhhc19hbHBoYTsKKyAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07CisgIGZyYW1lLT5jb21wbGV0ZV8gPSBjb21wbGV0ZTsKK30KKworLy8gU3RvcmUgaW1hZ2UgYmVhcmluZyBjaHVua3MgdG8gJ2ZyYW1lJy4KK3N0YXRpYyBQYXJzZVN0YXR1cyBTdG9yZUZyYW1lKGludCBmcmFtZV9udW0sIHVpbnQzMl90IG1pbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtQnVmZmVyKiBjb25zdCBtZW0sIEZyYW1lKiBjb25zdCBmcmFtZSkgeworICBpbnQgYWxwaGFfY2h1bmtzID0gMDsKKyAgaW50IGltYWdlX2NodW5rcyA9IDA7CisgIGludCBkb25lID0gKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSk7CisgIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOworCisgIGlmIChkb25lKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZG8geworICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKKyAgICBjb25zdCB1aW50MzJfdCBmb3VyY2MgPSBSZWFkTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IHBheWxvYWRfc2l6ZSA9IFJlYWRMRTMyKG1lbSk7CisgICAgY29uc3QgdWludDMyX3QgcGF5bG9hZF9zaXplX3BhZGRlZCA9IHBheWxvYWRfc2l6ZSArIChwYXlsb2FkX3NpemUgJiAxKTsKKyAgICBjb25zdCBzaXplX3QgcGF5bG9hZF9hdmFpbGFibGUgPSAocGF5bG9hZF9zaXplX3BhZGRlZCA+IE1lbURhdGFTaXplKG1lbSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTWVtRGF0YVNpemUobWVtKSA6IHBheWxvYWRfc2l6ZV9wYWRkZWQ7CisgICAgY29uc3Qgc2l6ZV90IGNodW5rX3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIHBheWxvYWRfYXZhaWxhYmxlOworCisgICAgaWYgKHBheWxvYWRfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBwYXlsb2FkX3NpemVfcGFkZGVkKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICAgIGlmIChwYXlsb2FkX3NpemVfcGFkZGVkID4gTWVtRGF0YVNpemUobWVtKSkgc3RhdHVzID0gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgICAgY2FzZSBNS0ZPVVJDQygnQScsICdMJywgJ1AnLCAnSCcpOgorICAgICAgICBpZiAoYWxwaGFfY2h1bmtzID09IDApIHsKKyAgICAgICAgICArK2FscGhhX2NodW5rczsKKyAgICAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLm9mZnNldF8gPSBjaHVua19zdGFydF9vZmZzZXQ7CisgICAgICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5zaXplXyA9IGNodW5rX3NpemU7CisgICAgICAgICAgZnJhbWUtPmhhc19hbHBoYV8gPSAxOworICAgICAgICAgIGZyYW1lLT5mcmFtZV9udW1fID0gZnJhbWVfbnVtOworICAgICAgICAgIFNraXAobWVtLCBwYXlsb2FkX2F2YWlsYWJsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOgorICAgICAgICBpZiAoYWxwaGFfY2h1bmtzID4gMCkgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gVlA4TCBoYXMgaXRzIG93biBhbHBoYQorICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJyAnKToKKyAgICAgICAgaWYgKGltYWdlX2NodW5rcyA9PSAwKSB7CisgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgYml0c3RyZWFtIGZlYXR1cmVzLCB0b2xlcmF0aW5nIGZhaWx1cmVzIHdoZW4gdGhlIGRhdGEKKyAgICAgICAgICAvLyBpcyBpbmNvbXBsZXRlLgorICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgICAgICAgICBjb25zdCBWUDhTdGF0dXNDb2RlIHZwOF9zdGF0dXMgPQorICAgICAgICAgICAgICBXZWJQR2V0RmVhdHVyZXMobWVtLT5idWZfICsgY2h1bmtfc3RhcnRfb2Zmc2V0LCBjaHVua19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzKTsKKyAgICAgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX05FRURfTU9SRV9EQVRBICYmCisgICAgICAgICAgICAgIHZwOF9zdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZwOF9zdGF0dXMgIT0gVlA4X1NUQVRVU19PSykgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBlbm91Z2ggZGF0YSwgYW5kIHlldCBXZWJQR2V0RmVhdHVyZXMoKSBmYWlsZWQuCisgICAgICAgICAgICByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgICAgICAgfQorICAgICAgICAgICsraW1hZ2VfY2h1bmtzOworICAgICAgICAgIFNldEZyYW1lSW5mbyhjaHVua19zdGFydF9vZmZzZXQsIGNodW5rX3NpemUsIGZyYW1lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IFBBUlNFX09LLCAmZmVhdHVyZXMsIGZyYW1lKTsKKyAgICAgICAgICBTa2lwKG1lbSwgcGF5bG9hZF9hdmFpbGFibGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyBEb25lOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gUmVzdG9yZSBmb3VyY2Mvc2l6ZSB3aGVuIG1vdmluZyB1cCBvbmUgbGV2ZWwgaW4gcGFyc2luZy4KKyAgICAgICAgUmV3aW5kKG1lbSwgQ0hVTktfSEVBREVSX1NJWkUpOworICAgICAgICBkb25lID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1lbS0+c3RhcnRfID09IG1lbS0+cmlmZl9lbmRfKSB7CisgICAgICBkb25lID0gMTsKKyAgICB9IGVsc2UgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgeworICAgICAgc3RhdHVzID0gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisgICAgfQorICB9IHdoaWxlICghZG9uZSAmJiBzdGF0dXMgPT0gUEFSU0VfT0spOworCisgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIENyZWF0ZXMgYSBuZXcgRnJhbWUgaWYgJ2FjdHVhbF9zaXplJyBpcyB3aXRoaW4gYm91bmRzIGFuZCAnbWVtJyBjb250YWlucworLy8gZW5vdWdoIGRhdGEgKCdtaW5fc2l6ZScpIHRvIHBhcnNlIHRoZSBwYXlsb2FkLgorLy8gUmV0dXJucyBQQVJTRV9PSyBvbiBzdWNjZXNzIHdpdGggKmZyYW1lIHBvaW50aW5nIHRvIHRoZSBuZXcgRnJhbWUuCisvLyBSZXR1cm5zIFBBUlNFX05FRURfTU9SRV9EQVRBIHdpdGggaW5zdWZmaWNpZW50IGRhdGEsIFBBUlNFX0VSUk9SIG90aGVyd2lzZS4KK3N0YXRpYyBQYXJzZVN0YXR1cyBOZXdGcmFtZShjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaW5fc2l6ZSwgdWludDMyX3QgYWN0dWFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUqKiBmcmFtZSkgeworICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIG1pbl9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoYWN0dWFsX3NpemUgPCBtaW5fc2l6ZSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSAgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworCisgICpmcmFtZSA9IChGcmFtZSopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCoqZnJhbWUpKTsKKyAgcmV0dXJuICgqZnJhbWUgPT0gTlVMTCkgPyBQQVJTRV9FUlJPUiA6IFBBUlNFX09LOworfQorCisvLyBQYXJzZSBhICdBTk1GJyBjaHVuayBhbmQgYW55IGltYWdlIGJlYXJpbmcgY2h1bmtzIHRoYXQgaW1tZWRpYXRlbHkgZm9sbG93LgorLy8gJ2ZyYW1lX2NodW5rX3NpemUnIGlzIHRoZSBwcmV2aW91c2x5IHZhbGlkYXRlZCwgcGFkZGVkIGNodW5rIHNpemUuCitzdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VBbmltYXRpb25GcmFtZSgKKyAgICBXZWJQRGVtdXhlciogY29uc3QgZG11eCwgdWludDMyX3QgZnJhbWVfY2h1bmtfc2l6ZSkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIGNvbnN0IHVpbnQzMl90IGFubWZfcGF5bG9hZF9zaXplID0gZnJhbWVfY2h1bmtfc2l6ZSAtIEFOTUZfQ0hVTktfU0laRTsKKyAgaW50IGFkZGVkX2ZyYW1lID0gMDsKKyAgaW50IGJpdHM7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CisgIEZyYW1lKiBmcmFtZTsKKyAgUGFyc2VTdGF0dXMgc3RhdHVzID0KKyAgICAgIE5ld0ZyYW1lKG1lbSwgQU5NRl9DSFVOS19TSVpFLCBmcmFtZV9jaHVua19zaXplLCAmZnJhbWUpOworICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSByZXR1cm4gc3RhdHVzOworCisgIGZyYW1lLT54X29mZnNldF8gICAgICAgPSAyICogUmVhZExFMjRzKG1lbSk7CisgIGZyYW1lLT55X29mZnNldF8gICAgICAgPSAyICogUmVhZExFMjRzKG1lbSk7CisgIGZyYW1lLT53aWR0aF8gICAgICAgICAgPSAxICsgUmVhZExFMjRzKG1lbSk7CisgIGZyYW1lLT5oZWlnaHRfICAgICAgICAgPSAxICsgUmVhZExFMjRzKG1lbSk7CisgIGZyYW1lLT5kdXJhdGlvbl8gICAgICAgPSBSZWFkTEUyNHMobWVtKTsKKyAgYml0cyA9IFJlYWRCeXRlKG1lbSk7CisgIGZyYW1lLT5kaXNwb3NlX21ldGhvZF8gPQorICAgICAgKGJpdHMgJiAxKSA/IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCA6IFdFQlBfTVVYX0RJU1BPU0VfTk9ORTsKKyAgZnJhbWUtPmJsZW5kX21ldGhvZF8gPSAoYml0cyAmIDIpID8gV0VCUF9NVVhfTk9fQkxFTkQgOiBXRUJQX01VWF9CTEVORDsKKyAgaWYgKGZyYW1lLT53aWR0aF8gKiAodWludDY0X3QpZnJhbWUtPmhlaWdodF8gPj0gTUFYX0lNQUdFX0FSRUEpIHsKKyAgICBXZWJQU2FmZUZyZWUoZnJhbWUpOworICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgfQorCisgIC8vIFN0b3JlIGEgZnJhbWUgb25seSBpZiB0aGUgYW5pbWF0aW9uIGZsYWcgaXMgc2V0IHRoZXJlIGlzIHNvbWUgZGF0YSBmb3IKKyAgLy8gdGhpcyBmcmFtZSBpcyBhdmFpbGFibGUuCisgIHN0YXR1cyA9IFN0b3JlRnJhbWUoZG11eC0+bnVtX2ZyYW1lc18gKyAxLCBhbm1mX3BheWxvYWRfc2l6ZSwgbWVtLCBmcmFtZSk7CisgIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgaXNfYW5pbWF0aW9uICYmIGZyYW1lLT5mcmFtZV9udW1fID4gMCkgeworICAgIGFkZGVkX2ZyYW1lID0gQWRkRnJhbWUoZG11eCwgZnJhbWUpOworICAgIGlmIChhZGRlZF9mcmFtZSkgeworICAgICAgKytkbXV4LT5udW1fZnJhbWVzXzsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgICAgfQorICB9CisKKyAgaWYgKCFhZGRlZF9mcmFtZSkgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gR2VuZXJhbCBjaHVuayBzdG9yYWdlLCBzdGFydGluZyB3aXRoIHRoZSBoZWFkZXIgYXQgJ3N0YXJ0X29mZnNldCcsIGFsbG93aW5nCisvLyB0aGUgdXNlciB0byByZXF1ZXN0IHRoZSBwYXlsb2FkIHZpYSBhIGZvdXJjYyBzdHJpbmcuICdzaXplJyBpbmNsdWRlcyB0aGUKKy8vIGhlYWRlciBhbmQgdGhlIHVucGFkZGVkIHBheWxvYWQgc2l6ZS4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCitzdGF0aWMgaW50IFN0b3JlQ2h1bmsoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0YXJ0X29mZnNldCwgdWludDMyX3Qgc2l6ZSkgeworICBDaHVuayogY29uc3QgY2h1bmsgPSAoQ2h1bmsqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqY2h1bmspKTsKKyAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiAwOworCisgIGNodW5rLT5kYXRhXy5vZmZzZXRfID0gc3RhcnRfb2Zmc2V0OworICBjaHVuay0+ZGF0YV8uc2l6ZV8gPSBzaXplOworICBBZGRDaHVuayhkbXV4LCBjaHVuayk7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJpbWFyeSBjaHVuayBwYXJzaW5nCisKK3N0YXRpYyBQYXJzZVN0YXR1cyBSZWFkSGVhZGVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHNpemVfdCBtaW5fc2l6ZSA9IFJJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRTsKKyAgdWludDMyX3QgcmlmZl9zaXplOworCisgIC8vIEJhc2ljIGZpbGUgbGV2ZWwgdmFsaWRhdGlvbi4KKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworICBpZiAobWVtY21wKEdldEJ1ZmZlcihtZW0pLCAiUklGRiIsIENIVU5LX1NJWkVfQllURVMpIHx8CisgICAgICBtZW1jbXAoR2V0QnVmZmVyKG1lbSkgKyBDSFVOS19IRUFERVJfU0laRSwgIldFQlAiLCBDSFVOS19TSVpFX0JZVEVTKSkgeworICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgfQorCisgIHJpZmZfc2l6ZSA9IEdldExFMzIoR2V0QnVmZmVyKG1lbSkgKyBUQUdfU0laRSk7CisgIGlmIChyaWZmX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAocmlmZl9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHJldHVybiBQQVJTRV9FUlJPUjsKKworICAvLyBUaGVyZSdzIG5vIHBvaW50IGluIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBSSUZGIGNodW5rCisgIG1lbS0+cmlmZl9lbmRfID0gcmlmZl9zaXplICsgQ0hVTktfSEVBREVSX1NJWkU7CisgIGlmIChtZW0tPmJ1Zl9zaXplXyA+IG1lbS0+cmlmZl9lbmRfKSB7CisgICAgbWVtLT5idWZfc2l6ZV8gPSBtZW0tPmVuZF8gPSBtZW0tPnJpZmZfZW5kXzsKKyAgfQorCisgIFNraXAobWVtLCBSSUZGX0hFQURFUl9TSVpFKTsKKyAgcmV0dXJuIFBBUlNFX09LOworfQorCitzdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VTaW5nbGVJbWFnZShXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBzaXplX3QgbWluX3NpemUgPSBDSFVOS19IRUFERVJfU0laRTsKKyAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmZG11eC0+bWVtXzsKKyAgRnJhbWUqIGZyYW1lOworICBQYXJzZVN0YXR1cyBzdGF0dXM7CisgIGludCBpbWFnZV9hZGRlZCA9IDA7CisKKyAgaWYgKGRtdXgtPmZyYW1lc18gIT0gTlVMTCkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIG1pbl9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZnJhbWUgPSAoRnJhbWUqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZnJhbWUpKTsKKyAgaWYgKGZyYW1lID09IE5VTEwpIHJldHVybiBQQVJTRV9FUlJPUjsKKworICAvLyBGb3IgdGhlIHNpbmdsZSBpbWFnZSBjYXNlIHdlIGFsbG93IHBhcnNpbmcgb2YgYSBwYXJ0aWFsIGZyYW1lLCBidXQgd2UgbmVlZAorICAvLyBhdCBsZWFzdCBDSFVOS19IRUFERVJfU0laRSBmb3IgcGFyc2luZy4KKyAgc3RhdHVzID0gU3RvcmVGcmFtZSgxLCBDSFVOS19IRUFERVJfU0laRSwgJmRtdXgtPm1lbV8sIGZyYW1lKTsKKyAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUikgeworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFMUEhBX0ZMQUcpOworICAgIC8vIENsZWFyIGFueSBhbHBoYSB3aGVuIHRoZSBhbHBoYSBmbGFnIGlzIG1pc3NpbmcuCisgICAgaWYgKCFoYXNfYWxwaGEgJiYgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5zaXplXyA+IDApIHsKKyAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0ub2Zmc2V0XyA9IDA7CisgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID0gMDsKKyAgICAgIGZyYW1lLT5oYXNfYWxwaGFfID0gMDsKKyAgICB9CisKKyAgICAvLyBVc2UgdGhlIGZyYW1lIHdpZHRoL2hlaWdodCBhcyB0aGUgY2FudmFzIHZhbHVlcyBmb3Igbm9uLXZwOHggZmlsZXMuCisgICAgLy8gQWxzbywgc2V0IEFMUEhBX0ZMQUcgaWYgdGhpcyBpcyBhIGxvc3NsZXNzIGltYWdlIHdpdGggYWxwaGEuCisgICAgaWYgKCFkbXV4LT5pc19leHRfZm9ybWF0XyAmJiBmcmFtZS0+d2lkdGhfID4gMCAmJiBmcmFtZS0+aGVpZ2h0XyA+IDApIHsKKyAgICAgIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUjsKKyAgICAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSBmcmFtZS0+d2lkdGhfOworICAgICAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSBmcmFtZS0+aGVpZ2h0XzsKKyAgICAgIGRtdXgtPmZlYXR1cmVfZmxhZ3NfIHw9IGZyYW1lLT5oYXNfYWxwaGFfID8gQUxQSEFfRkxBRyA6IDA7CisgICAgfQorICAgIGlmICghQWRkRnJhbWUoZG11eCwgZnJhbWUpKSB7CisgICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsgIC8vIGxhc3QgZnJhbWUgd2FzIGxlZnQgaW5jb21wbGV0ZQorICAgIH0gZWxzZSB7CisgICAgICBpbWFnZV9hZGRlZCA9IDE7CisgICAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgfQorICB9CisKKyAgaWYgKCFpbWFnZV9hZGRlZCkgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlVlA4WENodW5rcyhXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CisgIGludCBhbmltX2NodW5rcyA9IDA7CisgIFBhcnNlU3RhdHVzIHN0YXR1cyA9IFBBUlNFX09LOworCisgIGRvIHsKKyAgICBpbnQgc3RvcmVfY2h1bmsgPSAxOworICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKKyAgICBjb25zdCB1aW50MzJfdCBmb3VyY2MgPSBSZWFkTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBSZWFkTEUzMihtZW0pOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemVfcGFkZGVkID0gY2h1bmtfc2l6ZSArIChjaHVua19zaXplICYgMSk7CisKKyAgICBpZiAoY2h1bmtfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBjaHVua19zaXplX3BhZGRlZCkpIHJldHVybiBQQVJTRV9FUlJPUjsKKworICAgIHN3aXRjaCAoZm91cmNjKSB7CisgICAgICBjYXNlIE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICdYJyk6IHsKKyAgICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOworICAgICAgfQorICAgICAgY2FzZSBNS0ZPVVJDQygnQScsICdMJywgJ1AnLCAnSCcpOgorICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpOgorICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOiB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBhbmltYXRpb24gKGFsbCBmcmFtZXMgc2hvdWxkIGJlIGluIGFuIEFOTUYpLgorICAgICAgICBpZiAoYW5pbV9jaHVua3MgPiAwIHx8IGlzX2FuaW1hdGlvbikgcmV0dXJuIFBBUlNFX0VSUk9SOworCisgICAgICAgIFJld2luZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKTsKKyAgICAgICAgc3RhdHVzID0gUGFyc2VTaW5nbGVJbWFnZShkbXV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIE1LRk9VUkNDKCdBJywgJ04nLCAnSScsICdNJyk6IHsKKyAgICAgICAgaWYgKGNodW5rX3NpemVfcGFkZGVkIDwgQU5JTV9DSFVOS19TSVpFKSByZXR1cm4gUEFSU0VfRVJST1I7CisKKyAgICAgICAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBjaHVua19zaXplX3BhZGRlZCkgeworICAgICAgICAgIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOworICAgICAgICB9IGVsc2UgaWYgKGFuaW1fY2h1bmtzID09IDApIHsKKyAgICAgICAgICArK2FuaW1fY2h1bmtzOworICAgICAgICAgIGRtdXgtPmJnY29sb3JfID0gUmVhZExFMzIobWVtKTsKKyAgICAgICAgICBkbXV4LT5sb29wX2NvdW50XyA9IFJlYWRMRTE2cyhtZW0pOworICAgICAgICAgIFNraXAobWVtLCBjaHVua19zaXplX3BhZGRlZCAtIEFOSU1fQ0hVTktfU0laRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RvcmVfY2h1bmsgPSAwOworICAgICAgICAgIGdvdG8gU2tpcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ0EnLCAnTicsICdNJywgJ0YnKTogeworICAgICAgICBpZiAoYW5pbV9jaHVua3MgPT0gMCkgcmV0dXJuIFBBUlNFX0VSUk9SOyAgLy8gJ0FOSU0nIHByZWNlZGVzIGZyYW1lcy4KKyAgICAgICAgc3RhdHVzID0gUGFyc2VBbmltYXRpb25GcmFtZShkbXV4LCBjaHVua19zaXplX3BhZGRlZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBNS0ZPVVJDQygnSScsICdDJywgJ0MnLCAnUCcpOiB7CisgICAgICAgIHN0b3JlX2NodW5rID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBJQ0NQX0ZMQUcpOworICAgICAgICBnb3RvIFNraXA7CisgICAgICB9CisgICAgICBjYXNlIE1LRk9VUkNDKCdFJywgJ1gnLCAnSScsICdGJyk6IHsKKyAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEVYSUZfRkxBRyk7CisgICAgICAgIGdvdG8gU2tpcDsKKyAgICAgIH0KKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ1gnLCAnTScsICdQJywgJyAnKTogeworICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpOworICAgICAgICBnb3RvIFNraXA7CisgICAgICB9CisgU2tpcDoKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKGNodW5rX3NpemVfcGFkZGVkIDw9IE1lbURhdGFTaXplKG1lbSkpIHsKKyAgICAgICAgICBpZiAoc3RvcmVfY2h1bmspIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIG9ubHkgdGhlIGNodW5rIGhlYWRlciBhbmQgdW5wYWRkZWQgc2l6ZSBhcyBvbmx5IHRoZSBwYXlsb2FkCisgICAgICAgICAgICAvLyB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyLgorICAgICAgICAgICAgaWYgKCFTdG9yZUNodW5rKGRtdXgsIGNodW5rX3N0YXJ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSArIGNodW5rX3NpemUpKSB7CisgICAgICAgICAgICAgIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgU2tpcChtZW0sIGNodW5rX3NpemVfcGFkZGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdGF0dXMgPSBQQVJTRV9ORUVEX01PUkVfREFUQTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmIChtZW0tPnN0YXJ0XyA9PSBtZW0tPnJpZmZfZW5kXykgeworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICAgIHN0YXR1cyA9IFBBUlNFX05FRURfTU9SRV9EQVRBOworICAgIH0KKyAgfSB3aGlsZSAoc3RhdHVzID09IFBBUlNFX09LKTsKKworICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgUGFyc2VTdGF0dXMgUGFyc2VWUDhYKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7CisgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CisgIHVpbnQzMl90IHZwOHhfc2l6ZTsKKworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZG11eC0+aXNfZXh0X2Zvcm1hdF8gPSAxOworICBTa2lwKG1lbSwgVEFHX1NJWkUpOyAgLy8gVlA4WAorICB2cDh4X3NpemUgPSBSZWFkTEUzMihtZW0pOworICBpZiAodnA4eF9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgaWYgKHZwOHhfc2l6ZSA8IFZQOFhfQ0hVTktfU0laRSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICB2cDh4X3NpemUgKz0gdnA4eF9zaXplICYgMTsKKyAgaWYgKFNpemVJc0ludmFsaWQobWVtLCB2cDh4X3NpemUpKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgdnA4eF9zaXplKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgZG11eC0+ZmVhdHVyZV9mbGFnc18gPSBSZWFkQnl0ZShtZW0pOworICBTa2lwKG1lbSwgMyk7ICAvLyBSZXNlcnZlZC4KKyAgZG11eC0+Y2FudmFzX3dpZHRoXyAgPSAxICsgUmVhZExFMjRzKG1lbSk7CisgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gMSArIFJlYWRMRTI0cyhtZW0pOworICBpZiAoZG11eC0+Y2FudmFzX3dpZHRoXyAqICh1aW50NjRfdClkbXV4LT5jYW52YXNfaGVpZ2h0XyA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgIHJldHVybiBQQVJTRV9FUlJPUjsgIC8vIGltYWdlIGZpbmFsIGRpbWVuc2lvbiBpcyB0b28gbGFyZ2UKKyAgfQorICBTa2lwKG1lbSwgdnA4eF9zaXplIC0gVlA4WF9DSFVOS19TSVpFKTsgIC8vIHNraXAgYW55IHRyYWlsaW5nIGRhdGEuCisgIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUjsKKworICBpZiAoU2l6ZUlzSW52YWxpZChtZW0sIENIVU5LX0hFQURFUl9TSVpFKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CisKKyAgcmV0dXJuIFBhcnNlVlA4WENodW5rcyhkbXV4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm1hdCB2YWxpZGF0aW9uCisKK3N0YXRpYyBpbnQgSXNWYWxpZFNpbXBsZUZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWUgPSBkbXV4LT5mcmFtZXNfOworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOworCisgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIGlmIChkbXV4LT5zdGF0ZV8gPT0gV0VCUF9ERU1VWF9ET05FICYmIGZyYW1lID09IE5VTEwpIHJldHVybiAwOworCisgIGlmIChmcmFtZS0+d2lkdGhfIDw9IDAgfHwgZnJhbWUtPmhlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCisvLyBJZiAnZXhhY3QnIGlzIHRydWUsIGNoZWNrIHRoYXQgdGhlIGltYWdlIHJlc29sdXRpb24gbWF0Y2hlcyB0aGUgY2FudmFzLgorLy8gSWYgJ2V4YWN0JyBpcyBmYWxzZSwgY2hlY2sgdGhhdCB0aGUgeC95IG9mZnNldHMgZG8gbm90IGV4Y2VlZCB0aGUgY2FudmFzLgorc3RhdGljIGludCBDaGVja0ZyYW1lQm91bmRzKGNvbnN0IEZyYW1lKiBjb25zdCBmcmFtZSwgaW50IGV4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNfd2lkdGgsIGludCBjYW52YXNfaGVpZ2h0KSB7CisgIGlmIChleGFjdCkgeworICAgIGlmIChmcmFtZS0+eF9vZmZzZXRfICE9IDAgfHwgZnJhbWUtPnlfb2Zmc2V0XyAhPSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGZyYW1lLT53aWR0aF8gIT0gY2FudmFzX3dpZHRoIHx8IGZyYW1lLT5oZWlnaHRfICE9IGNhbnZhc19oZWlnaHQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZnJhbWUtPnhfb2Zmc2V0XyA8IDAgfHwgZnJhbWUtPnlfb2Zmc2V0XyA8IDApIHJldHVybiAwOworICAgIGlmIChmcmFtZS0+d2lkdGhfICsgZnJhbWUtPnhfb2Zmc2V0XyA+IGNhbnZhc193aWR0aCkgcmV0dXJuIDA7CisgICAgaWYgKGZyYW1lLT5oZWlnaHRfICsgZnJhbWUtPnlfb2Zmc2V0XyA+IGNhbnZhc19oZWlnaHQpIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IElzVmFsaWRFeHRlbmRlZEZvcm1hdChjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgIGNvbnN0IGludCBpc19mcmFnbWVudGVkID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBGUkFHTUVOVFNfRkxBRyk7CisgIGNvbnN0IEZyYW1lKiBmID0gZG11eC0+ZnJhbWVzXzsKKworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIpIHJldHVybiAxOworCisgIGlmIChkbXV4LT5jYW52YXNfd2lkdGhfIDw9IDAgfHwgZG11eC0+Y2FudmFzX2hlaWdodF8gPD0gMCkgcmV0dXJuIDA7CisgIGlmIChkbXV4LT5sb29wX2NvdW50XyA8IDApIHJldHVybiAwOworICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSAmJiBkbXV4LT5mcmFtZXNfID09IE5VTEwpIHJldHVybiAwOworICBpZiAoaXNfZnJhZ21lbnRlZCkgcmV0dXJuIDA7CisKKyAgd2hpbGUgKGYgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBjdXJfZnJhbWVfc2V0ID0gZi0+ZnJhbWVfbnVtXzsKKyAgICBpbnQgZnJhbWVfY291bnQgPSAwOworCisgICAgLy8gQ2hlY2sgZnJhbWUgcHJvcGVydGllcy4KKyAgICBmb3IgKDsgZiAhPSBOVUxMICYmIGYtPmZyYW1lX251bV8gPT0gY3VyX2ZyYW1lX3NldDsgZiA9IGYtPm5leHRfKSB7CisgICAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGltYWdlID0gZi0+aW1nX2NvbXBvbmVudHNfOworICAgICAgY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBhbHBoYSA9IGYtPmltZ19jb21wb25lbnRzXyArIDE7CisKKyAgICAgIGlmICghaXNfYW5pbWF0aW9uICYmIGYtPmZyYW1lX251bV8gPiAxKSByZXR1cm4gMDsKKworICAgICAgaWYgKGYtPmNvbXBsZXRlXykgeworICAgICAgICBpZiAoYWxwaGEtPnNpemVfID09IDAgJiYgaW1hZ2UtPnNpemVfID09IDApIHJldHVybiAwOworICAgICAgICAvLyBFbnN1cmUgYWxwaGEgcHJlY2VkZXMgaW1hZ2UgYml0c3RyZWFtLgorICAgICAgICBpZiAoYWxwaGEtPnNpemVfID4gMCAmJiBhbHBoYS0+b2Zmc2V0XyA+IGltYWdlLT5vZmZzZXRfKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZi0+d2lkdGhfIDw9IDAgfHwgZi0+aGVpZ2h0XyA8PSAwKSByZXR1cm4gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhIHBhcnRpYWwgZnJhbWUgaW4gYSBjb21wbGV0ZSBmaWxlLgorICAgICAgICBpZiAoZG11eC0+c3RhdGVfID09IFdFQlBfREVNVVhfRE9ORSkgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gRW5zdXJlIGFscGhhIHByZWNlZGVzIGltYWdlIGJpdHN0cmVhbS4KKyAgICAgICAgaWYgKGFscGhhLT5zaXplXyA+IDAgJiYgaW1hZ2UtPnNpemVfID4gMCAmJgorICAgICAgICAgICAgYWxwaGEtPm9mZnNldF8gPiBpbWFnZS0+b2Zmc2V0XykgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgZnJhbWVzIGFmdGVyIGFuIGluY29tcGxldGUgb25lLgorICAgICAgICBpZiAoZi0+bmV4dF8gIT0gTlVMTCkgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmIChmLT53aWR0aF8gPiAwICYmIGYtPmhlaWdodF8gPiAwICYmCisgICAgICAgICAgIUNoZWNrRnJhbWVCb3VuZHMoZiwgIWlzX2FuaW1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbXV4LT5jYW52YXNfd2lkdGhfLCBkbXV4LT5jYW52YXNfaGVpZ2h0XykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgICsrZnJhbWVfY291bnQ7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUERlbXV4ZXIgb2JqZWN0CisKK3N0YXRpYyB2b2lkIEluaXREZW11eChXZWJQRGVtdXhlciogY29uc3QgZG11eCwgY29uc3QgTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKKyAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUjsKKyAgZG11eC0+bG9vcF9jb3VudF8gPSAxOworICBkbXV4LT5iZ2NvbG9yXyA9IDB4RkZGRkZGRkY7ICAvLyBXaGl0ZSBiYWNrZ3JvdW5kIGJ5IGRlZmF1bHQuCisgIGRtdXgtPmNhbnZhc193aWR0aF8gPSAtMTsKKyAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSAtMTsKKyAgZG11eC0+ZnJhbWVzX3RhaWxfID0gJmRtdXgtPmZyYW1lc187CisgIGRtdXgtPmNodW5rc190YWlsXyA9ICZkbXV4LT5jaHVua3NfOworICBkbXV4LT5tZW1fID0gKm1lbTsKK30KKworc3RhdGljIFBhcnNlU3RhdHVzIENyZWF0ZVJhd0ltYWdlRGVtdXhlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlbXV4ZXIqKiBkZW11eGVyKSB7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPQorICAgICAgV2ViUEdldEZlYXR1cmVzKG1lbS0+YnVmXywgbWVtLT5idWZfc2l6ZV8sICZmZWF0dXJlcyk7CisgICpkZW11eGVyID0gTlVMTDsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpID8gUEFSU0VfTkVFRF9NT1JFX0RBVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQQVJTRV9FUlJPUjsKKyAgfQorCisgIHsKKyAgICBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CisgICAgRnJhbWUqIGNvbnN0IGZyYW1lID0gKEZyYW1lKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmZyYW1lKSk7CisgICAgaWYgKGRtdXggPT0gTlVMTCB8fCBmcmFtZSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIEluaXREZW11eChkbXV4LCBtZW0pOworICAgIFNldEZyYW1lSW5mbygwLCBtZW0tPmJ1Zl9zaXplXywgMSAvKmZyYW1lX251bSovLCAxIC8qY29tcGxldGUqLywgJmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBmcmFtZSk7CisgICAgaWYgKCFBZGRGcmFtZShkbXV4LCBmcmFtZSkpIGdvdG8gRXJyb3I7CisgICAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9ET05FOworICAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSBmcmFtZS0+d2lkdGhfOworICAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gZnJhbWUtPmhlaWdodF87CisgICAgZG11eC0+ZmVhdHVyZV9mbGFnc18gfD0gZnJhbWUtPmhhc19hbHBoYV8gPyBBTFBIQV9GTEFHIDogMDsKKyAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgYXNzZXJ0KElzVmFsaWRTaW1wbGVGb3JtYXQoZG11eCkpOworICAgICpkZW11eGVyID0gZG11eDsKKyAgICByZXR1cm4gUEFSU0VfT0s7CisKKyBFcnJvcjoKKyAgICBXZWJQU2FmZUZyZWUoZG11eCk7CisgICAgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgICByZXR1cm4gUEFSU0VfRVJST1I7CisgIH0KK30KKworV2ViUERlbXV4ZXIqIFdlYlBEZW11eEludGVybmFsKGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBpbnQgYWxsb3dfcGFydGlhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVtdXhTdGF0ZSogc3RhdGUsIGludCB2ZXJzaW9uKSB7CisgIGNvbnN0IENodW5rUGFyc2VyKiBwYXJzZXI7CisgIGludCBwYXJ0aWFsOworICBQYXJzZVN0YXR1cyBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKKyAgTWVtQnVmZmVyIG1lbTsKKyAgV2ViUERlbXV4ZXIqIGRtdXg7CisKKyAgaWYgKHN0YXRlICE9IE5VTEwpICpzdGF0ZSA9IFdFQlBfREVNVVhfUEFSU0VfRVJST1I7CisKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgcmV0dXJuIE5VTEw7CisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Ynl0ZXMgPT0gTlVMTCB8fCBkYXRhLT5zaXplID09IDApIHJldHVybiBOVUxMOworCisgIGlmICghSW5pdE1lbUJ1ZmZlcigmbWVtLCBkYXRhLT5ieXRlcywgZGF0YS0+c2l6ZSkpIHJldHVybiBOVUxMOworICBzdGF0dXMgPSBSZWFkSGVhZGVyKCZtZW0pOworICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSB7CisgICAgLy8gSWYgcGFyc2luZyBvZiB0aGUgd2VicCBmaWxlIGhlYWRlciBmYWlscyBhdHRlbXB0IHRvIGhhbmRsZSBhIHJhdworICAgIC8vIFZQOC9WUDhMIGZyYW1lLiBOb3RlICdhbGxvd19wYXJ0aWFsJyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSB7CisgICAgICBzdGF0dXMgPSBDcmVhdGVSYXdJbWFnZURlbXV4ZXIoJm1lbSwgJmRtdXgpOworICAgICAgaWYgKHN0YXR1cyA9PSBQQVJTRV9PSykgeworICAgICAgICBpZiAoc3RhdGUgIT0gTlVMTCkgKnN0YXRlID0gV0VCUF9ERU1VWF9ET05FOworICAgICAgICByZXR1cm4gZG11eDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICpzdGF0ZSA9IChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEpID8gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHBhcnRpYWwgPSAobWVtLmJ1Zl9zaXplXyA8IG1lbS5yaWZmX2VuZF8pOworICBpZiAoIWFsbG93X3BhcnRpYWwgJiYgcGFydGlhbCkgcmV0dXJuIE5VTEw7CisKKyAgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CisgIGlmIChkbXV4ID09IE5VTEwpIHJldHVybiBOVUxMOworICBJbml0RGVtdXgoZG11eCwgJm1lbSk7CisKKyAgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgIGZvciAocGFyc2VyID0ga01hc3RlckNodW5rczsgcGFyc2VyLT5wYXJzZSAhPSBOVUxMOyArK3BhcnNlcikgeworICAgIGlmICghbWVtY21wKHBhcnNlci0+aWQsIEdldEJ1ZmZlcigmZG11eC0+bWVtXyksIFRBR19TSVpFKSkgeworICAgICAgc3RhdHVzID0gcGFyc2VyLT5wYXJzZShkbXV4KTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfT0spIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfRE9ORTsKKyAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEgJiYgIXBhcnRpYWwpIHN0YXR1cyA9IFBBUlNFX0VSUk9SOworICAgICAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiAhcGFyc2VyLT52YWxpZChkbXV4KSkgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChzdGF0ZSAhPSBOVUxMKSAqc3RhdGUgPSBkbXV4LT5zdGF0ZV87CisKKyAgaWYgKHN0YXR1cyA9PSBQQVJTRV9FUlJPUikgeworICAgIFdlYlBEZW11eERlbGV0ZShkbXV4KTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gZG11eDsKK30KKwordm9pZCBXZWJQRGVtdXhEZWxldGUoV2ViUERlbXV4ZXIqIGRtdXgpIHsKKyAgQ2h1bmsqIGM7CisgIEZyYW1lKiBmOworICBpZiAoZG11eCA9PSBOVUxMKSByZXR1cm47CisKKyAgZm9yIChmID0gZG11eC0+ZnJhbWVzXzsgZiAhPSBOVUxMOykgeworICAgIEZyYW1lKiBjb25zdCBjdXJfZnJhbWUgPSBmOworICAgIGYgPSBmLT5uZXh0XzsKKyAgICBXZWJQU2FmZUZyZWUoY3VyX2ZyYW1lKTsKKyAgfQorICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7KSB7CisgICAgQ2h1bmsqIGNvbnN0IGN1cl9jaHVuayA9IGM7CisgICAgYyA9IGMtPm5leHRfOworICAgIFdlYlBTYWZlRnJlZShjdXJfY2h1bmspOworICB9CisgIFdlYlBTYWZlRnJlZShkbXV4KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordWludDMyX3QgV2ViUERlbXV4R2V0SShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgV2ViUEZvcm1hdEZlYXR1cmUgZmVhdHVyZSkgeworICBpZiAoZG11eCA9PSBOVUxMKSByZXR1cm4gMDsKKworICBzd2l0Y2ggKGZlYXR1cmUpIHsKKyAgICBjYXNlIFdFQlBfRkZfRk9STUFUX0ZMQUdTOiAgICAgcmV0dXJuIGRtdXgtPmZlYXR1cmVfZmxhZ3NfOworICAgIGNhc2UgV0VCUF9GRl9DQU5WQVNfV0lEVEg6ICAgICByZXR1cm4gKHVpbnQzMl90KWRtdXgtPmNhbnZhc193aWR0aF87CisgICAgY2FzZSBXRUJQX0ZGX0NBTlZBU19IRUlHSFQ6ICAgIHJldHVybiAodWludDMyX3QpZG11eC0+Y2FudmFzX2hlaWdodF87CisgICAgY2FzZSBXRUJQX0ZGX0xPT1BfQ09VTlQ6ICAgICAgIHJldHVybiAodWludDMyX3QpZG11eC0+bG9vcF9jb3VudF87CisgICAgY2FzZSBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1I6IHJldHVybiBkbXV4LT5iZ2NvbG9yXzsKKyAgICBjYXNlIFdFQlBfRkZfRlJBTUVfQ09VTlQ6ICAgICAgcmV0dXJuICh1aW50MzJfdClkbXV4LT5udW1fZnJhbWVzXzsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZyYW1lIGl0ZXJhdGlvbgorCitzdGF0aWMgY29uc3QgRnJhbWUqIEdldEZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LCBpbnQgZnJhbWVfbnVtKSB7CisgIGNvbnN0IEZyYW1lKiBmOworICBmb3IgKGYgPSBkbXV4LT5mcmFtZXNfOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0XykgeworICAgIGlmIChmcmFtZV9udW0gPT0gZi0+ZnJhbWVfbnVtXykgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGY7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90KiBHZXRGcmFtZVBheWxvYWQoY29uc3QgdWludDhfdCogY29uc3QgbWVtX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSkgeworICAqZGF0YV9zaXplID0gMDsKKyAgaWYgKGZyYW1lICE9IE5VTEwpIHsKKyAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGltYWdlID0gZnJhbWUtPmltZ19jb21wb25lbnRzXzsKKyAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGFscGhhID0gZnJhbWUtPmltZ19jb21wb25lbnRzXyArIDE7CisgICAgc2l6ZV90IHN0YXJ0X29mZnNldCA9IGltYWdlLT5vZmZzZXRfOworICAgICpkYXRhX3NpemUgPSBpbWFnZS0+c2l6ZV87CisKKyAgICAvLyBpZiBhbHBoYSBleGlzdHMgaXQgcHJlY2VkZXMgaW1hZ2UsIHVwZGF0ZSB0aGUgc2l6ZSBhbGxvd2luZyBmb3IKKyAgICAvLyBpbnRlcnZlbmluZyBjaHVua3MuCisgICAgaWYgKGFscGhhLT5zaXplXyA+IDApIHsKKyAgICAgIGNvbnN0IHNpemVfdCBpbnRlcl9zaXplID0gKGltYWdlLT5vZmZzZXRfID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW1hZ2UtPm9mZnNldF8gLSAoYWxwaGEtPm9mZnNldF8gKyBhbHBoYS0+c2l6ZV8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICBzdGFydF9vZmZzZXQgPSBhbHBoYS0+b2Zmc2V0XzsKKyAgICAgICpkYXRhX3NpemUgICs9IGFscGhhLT5zaXplXyArIGludGVyX3NpemU7CisgICAgfQorICAgIHJldHVybiBtZW1fYnVmICsgc3RhcnRfb2Zmc2V0OworICB9CisgIHJldHVybiBOVUxMOworfQorCisvLyBDcmVhdGUgYSB3aG9sZSAnZnJhbWUnIGZyb20gVlA4ICgrIGFscGhhKSBvciBsb3NzbGVzcy4KK3N0YXRpYyBpbnQgU3ludGhlc2l6ZUZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEl0ZXJhdG9yKiBjb25zdCBpdGVyKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87CisgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOworICBjb25zdCB1aW50OF90KiBjb25zdCBwYXlsb2FkID0gR2V0RnJhbWVQYXlsb2FkKG1lbV9idWYsIGZyYW1lLCAmcGF5bG9hZF9zaXplKTsKKyAgaWYgKHBheWxvYWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGFzc2VydChmcmFtZSAhPSBOVUxMKTsKKworICBpdGVyLT5mcmFtZV9udW0gICAgICA9IGZyYW1lLT5mcmFtZV9udW1fOworICBpdGVyLT5udW1fZnJhbWVzICAgICA9IGRtdXgtPm51bV9mcmFtZXNfOworICBpdGVyLT54X29mZnNldCAgICAgICA9IGZyYW1lLT54X29mZnNldF87CisgIGl0ZXItPnlfb2Zmc2V0ICAgICAgID0gZnJhbWUtPnlfb2Zmc2V0XzsKKyAgaXRlci0+d2lkdGggICAgICAgICAgPSBmcmFtZS0+d2lkdGhfOworICBpdGVyLT5oZWlnaHQgICAgICAgICA9IGZyYW1lLT5oZWlnaHRfOworICBpdGVyLT5oYXNfYWxwaGEgICAgICA9IGZyYW1lLT5oYXNfYWxwaGFfOworICBpdGVyLT5kdXJhdGlvbiAgICAgICA9IGZyYW1lLT5kdXJhdGlvbl87CisgIGl0ZXItPmRpc3Bvc2VfbWV0aG9kID0gZnJhbWUtPmRpc3Bvc2VfbWV0aG9kXzsKKyAgaXRlci0+YmxlbmRfbWV0aG9kICAgPSBmcmFtZS0+YmxlbmRfbWV0aG9kXzsKKyAgaXRlci0+Y29tcGxldGUgICAgICAgPSBmcmFtZS0+Y29tcGxldGVfOworICBpdGVyLT5mcmFnbWVudC5ieXRlcyA9IHBheWxvYWQ7CisgIGl0ZXItPmZyYWdtZW50LnNpemUgID0gcGF5bG9hZF9zaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBTZXRGcmFtZShpbnQgZnJhbWVfbnVtLCBXZWJQSXRlcmF0b3IqIGNvbnN0IGl0ZXIpIHsKKyAgY29uc3QgRnJhbWUqIGZyYW1lOworICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87CisgIGlmIChkbXV4ID09IE5VTEwgfHwgZnJhbWVfbnVtIDwgMCkgcmV0dXJuIDA7CisgIGlmIChmcmFtZV9udW0gPiBkbXV4LT5udW1fZnJhbWVzXykgcmV0dXJuIDA7CisgIGlmIChmcmFtZV9udW0gPT0gMCkgZnJhbWVfbnVtID0gZG11eC0+bnVtX2ZyYW1lc187CisKKyAgZnJhbWUgPSBHZXRGcmFtZShkbXV4LCBmcmFtZV9udW0pOworICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIFN5bnRoZXNpemVGcmFtZShkbXV4LCBmcmFtZSwgaXRlcik7Cit9CisKK2ludCBXZWJQRGVtdXhHZXRGcmFtZShjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lLCBXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKKyAgaWYgKGl0ZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgbWVtc2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOworICBpdGVyLT5wcml2YXRlXyA9ICh2b2lkKilkbXV4OworICByZXR1cm4gU2V0RnJhbWUoZnJhbWUsIGl0ZXIpOworfQorCitpbnQgV2ViUERlbXV4TmV4dEZyYW1lKFdlYlBJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcmV0dXJuIFNldEZyYW1lKGl0ZXItPmZyYW1lX251bSArIDEsIGl0ZXIpOworfQorCitpbnQgV2ViUERlbXV4UHJldkZyYW1lKFdlYlBJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGl0ZXItPmZyYW1lX251bSA8PSAxKSByZXR1cm4gMDsKKyAgcmV0dXJuIFNldEZyYW1lKGl0ZXItPmZyYW1lX251bSAtIDEsIGl0ZXIpOworfQorCit2b2lkIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKKyAgKHZvaWQpaXRlcjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGl0ZXJhdGlvbgorCitzdGF0aWMgaW50IENodW5rQ291bnQoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IG1lbV9idWYgPSBkbXV4LT5tZW1fLmJ1Zl87CisgIGNvbnN0IENodW5rKiBjOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0XykgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlciA9IG1lbV9idWYgKyBjLT5kYXRhXy5vZmZzZXRfOworICAgIGlmICghbWVtY21wKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3QgQ2h1bmsqIEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGZvdXJjY1s0XSwgaW50IGNodW5rX251bSkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOworICBjb25zdCBDaHVuayogYzsKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChjID0gZG11eC0+Y2h1bmtzXzsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dF8pIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXIgPSBtZW1fYnVmICsgYy0+ZGF0YV8ub2Zmc2V0XzsKKyAgICBpZiAoIW1lbWNtcChoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OworICAgIGlmIChjb3VudCA9PSBjaHVua19udW0pIGJyZWFrOworICB9CisgIHJldHVybiBjOworfQorCitzdGF0aWMgaW50IFNldENodW5rKGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAorICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogY29uc3QgaXRlcikgeworICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87CisgIGludCBjb3VudDsKKworICBpZiAoZG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMIHx8IGNodW5rX251bSA8IDApIHJldHVybiAwOworICBjb3VudCA9IENodW5rQ291bnQoZG11eCwgZm91cmNjKTsKKyAgaWYgKGNvdW50ID09IDApIHJldHVybiAwOworICBpZiAoY2h1bmtfbnVtID09IDApIGNodW5rX251bSA9IGNvdW50OworCisgIGlmIChjaHVua19udW0gPD0gY291bnQpIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmID0gZG11eC0+bWVtXy5idWZfOworICAgIGNvbnN0IENodW5rKiBjb25zdCBjaHVuayA9IEdldENodW5rKGRtdXgsIGZvdXJjYywgY2h1bmtfbnVtKTsKKyAgICBpdGVyLT5jaHVuay5ieXRlcyA9IG1lbV9idWYgKyBjaHVuay0+ZGF0YV8ub2Zmc2V0XyArIENIVU5LX0hFQURFUl9TSVpFOworICAgIGl0ZXItPmNodW5rLnNpemUgID0gY2h1bmstPmRhdGFfLnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgaXRlci0+bnVtX2NodW5rcyAgPSBjb3VudDsKKyAgICBpdGVyLT5jaHVua19udW0gICA9IGNodW5rX251bTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IFdlYlBEZW11eEdldENodW5rKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBpbnQgY2h1bmtfbnVtLAorICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKSB7CisgIGlmIChpdGVyID09IE5VTEwpIHJldHVybiAwOworCisgIG1lbXNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKKyAgaXRlci0+cHJpdmF0ZV8gPSAodm9pZCopZG11eDsKKyAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgY2h1bmtfbnVtLCBpdGVyKTsKK30KKworaW50IFdlYlBEZW11eE5leHRDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcikgeworICBpZiAoaXRlciAhPSBOVUxMKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgZm91cmNjID0KKyAgICAgICAgKGNvbnN0IGNoYXIqKWl0ZXItPmNodW5rLmJ5dGVzIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgaXRlci0+Y2h1bmtfbnVtICsgMSwgaXRlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQRGVtdXhQcmV2Q2h1bmsoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpIHsKKyAgaWYgKGl0ZXIgIT0gTlVMTCAmJiBpdGVyLT5jaHVua19udW0gPiAxKSB7CisgICAgY29uc3QgY2hhciogY29uc3QgZm91cmNjID0KKyAgICAgICAgKGNvbnN0IGNoYXIqKWl0ZXItPmNodW5rLmJ5dGVzIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgcmV0dXJuIFNldENodW5rKGZvdXJjYywgaXRlci0+Y2h1bmtfbnVtIC0gMSwgaXRlcik7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpIHsKKyAgKHZvaWQpaXRlcjsKK30KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlMzgwNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMKQEAgLTAsMCArMSwzODMgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbC4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKy8vIFRhYmxlcyBjYW4gYmUgZmFzdGVyIG9uIHNvbWUgcGxhdGZvcm0gYnV0IGluY3VyIHNvbWUgZXh0cmEgYmluYXJ5IHNpemUgKH4yaykuCisvLyAjZGVmaW5lIFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNRklYIDI0ICAgIC8vIDI0Yml0IGZpeGVkLXBvaW50IGFyaXRobWV0aWMKKyNkZWZpbmUgSEFMRiAoKDF1IDw8IE1GSVgpID4+IDEpCisjZGVmaW5lIEtJTlZfMjU1ICgoMXUgPDwgTUZJWCkgLyAyNTV1KQorCitzdGF0aWMgdWludDMyX3QgTXVsdCh1aW50OF90IHgsIHVpbnQzMl90IG11bHQpIHsKKyAgY29uc3QgdWludDMyX3QgdiA9ICh4ICogbXVsdCArIEhBTEYpID4+IE1GSVg7CisgIGFzc2VydCh2IDw9IDI1NSk7ICAvLyA8LSAyNGJpdCBwcmVjaXNpb24gaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGF0LgorICByZXR1cm4gdjsKK30KKworI2lmZGVmIFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNdWx0VGFibGVzWzJdWzI1Nl0gPSB7CisgIHsgICAgLy8gKDI1NXUgPDwgTUZJWCkgLyBhbHBoYQorICAgIDB4MDAwMDAwMDAsIDB4ZmYwMDAwMDAsIDB4N2Y4MDAwMDAsIDB4NTUwMDAwMDAsIDB4M2ZjMDAwMDAsIDB4MzMwMDAwMDAsCisgICAgMHgyYTgwMDAwMCwgMHgyNDZkYjZkYiwgMHgxZmUwMDAwMCwgMHgxYzU1NTU1NSwgMHgxOTgwMDAwMCwgMHgxNzJlOGJhMiwKKyAgICAweDE1NDAwMDAwLCAweDEzOWQ4OWQ4LCAweDEyMzZkYjZkLCAweDExMDAwMDAwLCAweDBmZjAwMDAwLCAweDBmMDAwMDAwLAorICAgIDB4MGUyYWFhYWEsIDB4MGQ2YmNhMWEsIDB4MGNjMDAwMDAsIDB4MGMyNDkyNDksIDB4MGI5NzQ1ZDEsIDB4MGIxNjQyYzgsCisgICAgMHgwYWEwMDAwMCwgMHgwYTMzMzMzMywgMHgwOWNlYzRlYywgMHgwOTcxYzcxYywgMHgwOTFiNmRiNiwgMHgwOGNiMDhkMywKKyAgICAweDA4ODAwMDAwLCAweDA4MzljZTczLCAweDA3ZjgwMDAwLCAweDA3YmEyZThiLCAweDA3ODAwMDAwLCAweDA3NDkyNDkyLAorICAgIDB4MDcxNTU1NTUsIDB4MDZlNDUzMDYsIDB4MDZiNWU1MGQsIDB4MDY4OWQ4OWQsIDB4MDY2MDAwMDAsIDB4MDYzODMxZjMsCisgICAgMHgwNjEyNDkyNCwgMHgwNWVlMjNiOCwgMHgwNWNiYTJlOCwgMHgwNWFhYWFhYSwgMHgwNThiMjE2NCwgMHgwNTZjZWZhOCwKKyAgICAweDA1NTAwMDAwLCAweDA1MzQzZWIxLCAweDA1MTk5OTk5LCAweDA1MDAwMDAwLCAweDA0ZTc2Mjc2LCAweDA0Y2ZiMmI3LAorICAgIDB4MDRiOGUzOGUsIDB4MDRhMmU4YmEsIDB4MDQ4ZGI2ZGIsIDB4MDQ3OTQzNWUsIDB4MDQ2NTg0NjksIDB4MDQ1MjcwZDAsCisgICAgMHgwNDQwMDAwMCwgMHgwNDJlMjlmNywgMHgwNDFjZTczOSwgMHgwNDBjMzBjMywgMHgwM2ZjMDAwMCwgMHgwM2VjNGVjNCwKKyAgICAweDAzZGQxNzQ1LCAweDAzY2U1NDBmLCAweDAzYzAwMDAwLCAweDAzYjIxNjQyLCAweDAzYTQ5MjQ5LCAweDAzOTc2ZmM2LAorICAgIDB4MDM4YWFhYWEsIDB4MDM3ZTNmMWYsIDB4MDM3MjI5ODMsIDB4MDM2NjY2NjYsIDB4MDM1YWYyODYsIDB4MDM0ZmNhY2UsCisgICAgMHgwMzQ0ZWM0ZSwgMHgwMzNhNTQ0MCwgMHgwMzMwMDAwMCwgMHgwMzI1ZWQwOSwgMHgwMzFjMThmOSwgMHgwMzEyODE4YSwKKyAgICAweDAzMDkyNDkyLCAweDAzMDAwMDAwLCAweDAyZjcxMWRjLCAweDAyZWU1ODQ2LCAweDAyZTVkMTc0LCAweDAyZGQ3YmFmLAorICAgIDB4MDJkNTU1NTUsIDB4MDJjZDVjZDUsIDB4MDJjNTkwYjIsIDB4MDJiZGVmN2IsIDB4MDJiNjc3ZDQsIDB4MDJhZjI4NmIsCisgICAgMHgwMmE4MDAwMCwgMHgwMmEwZmQ1YywgMHgwMjlhMWY1OCwgMHgwMjkzNjRkOSwgMHgwMjhjY2NjYywgMHgwMjg2NTYyZCwKKyAgICAweDAyODAwMDAwLCAweDAyNzljOTUyLCAweDAyNzNiMTNiLCAweDAyNmRiNmRiLCAweDAyNjdkOTViLCAweDAyNjIxN2VjLAorICAgIDB4MDI1YzcxYzcsIDB4MDI1NmU2MmEsIDB4MDI1MTc0NWQsIDB4MDI0YzFiYWMsIDB4MDI0NmRiNmQsIDB4MDI0MWIyZjksCisgICAgMHgwMjNjYTFhZiwgMHgwMjM3YTZmNCwgMHgwMjMyYzIzNCwgMHgwMjJkZjJkZiwgMHgwMjI5Mzg2OCwgMHgwMjI0OTI0OSwKKyAgICAweDAyMjAwMDAwLCAweDAyMWI4MTBlLCAweDAyMTcxNGZiLCAweDAyMTJiYjUxLCAweDAyMGU3MzljLCAweDAyMGEzZDcwLAorICAgIDB4MDIwNjE4NjEsIDB4MDIwMjA0MDgsIDB4MDFmZTAwMDAsIDB4MDFmYTBiZTgsIDB4MDFmNjI3NjIsIDB4MDFmMjUyMTMsCisgICAgMHgwMWVlOGJhMiwgMHgwMWVhZDNiYSwgMHgwMWU3MmEwNywgMHgwMWUzOGUzOCwgMHgwMWUwMDAwMCwgMHgwMWRjN2YxMCwKKyAgICAweDAxZDkwYjIxLCAweDAxZDVhM2U5LCAweDAxZDI0OTI0LCAweDAxY2VmYThkLCAweDAxY2JiN2UzLCAweDAxYzg4MGU1LAorICAgIDB4MDFjNTU1NTUsIDB4MDFjMjM0ZjcsIDB4MDFiZjFmOGYsIDB4MDFiYzE0ZTUsIDB4MDFiOTE0YzEsIDB4MDFiNjFlZWQsCisgICAgMHgwMWIzMzMzMywgMHgwMWIwNTE2MCwgMHgwMWFkNzk0MywgMHgwMWFhYWFhYSwgMHgwMWE3ZTU2NywgMHgwMWE1Mjk0YSwKKyAgICAweDAxYTI3NjI3LCAweDAxOWZjYmQyLCAweDAxOWQyYTIwLCAweDAxOWE5MGU3LCAweDAxOTgwMDAwLCAweDAxOTU3NzQxLAorICAgIDB4MDE5MmY2ODQsIDB4MDE5MDdkYTQsIDB4MDE4ZTBjN2MsIDB4MDE4YmEyZTgsIDB4MDE4OTQwYzUsIDB4MDE4NmU1ZjAsCisgICAgMHgwMTg0OTI0OSwgMHgwMTgyNDVhZSwgMHgwMTgwMDAwMCwgMHgwMTdkYzExZiwgMHgwMTdiODhlZSwgMHgwMTc5NTc0ZSwKKyAgICAweDAxNzcyYzIzLCAweDAxNzUwNzUwLCAweDAxNzJlOGJhLCAweDAxNzBkMDQ1LCAweDAxNmViZGQ3LCAweDAxNmNiMTU3LAorICAgIDB4MDE2YWFhYWEsIDB4MDE2OGE5YjksIDB4MDE2NmFlNmEsIDB4MDE2NGI4YTcsIDB4MDE2MmM4NTksIDB4MDE2MGRkNjcsCisgICAgMHgwMTVlZjdiZCwgMHgwMTVkMTc0NSwgMHgwMTViM2JlYSwgMHgwMTU5NjU5NiwgMHgwMTU3OTQzNSwgMHgwMTU1YzdiNCwKKyAgICAweDAxNTQwMDAwLCAweDAxNTIzZDAzLCAweDAxNTA3ZWFlLCAweDAxNGVjNGVjLCAweDAxNGQwZmFjLCAweDAxNGI1ZWRjLAorICAgIDB4MDE0OWIyNmMsIDB4MDE0ODBhNGEsIDB4MDE0NjY2NjYsIDB4MDE0NGM2YWYsIDB4MDE0MzJiMTYsIDB4MDE0MTkzOGIsCisgICAgMHgwMTQwMDAwMCwgMHgwMTNlNzA2MywgMHgwMTNjZTRhOSwgMHgwMTNiNWNjMCwgMHgwMTM5ZDg5ZCwgMHgwMTM4NTgzMCwKKyAgICAweDAxMzZkYjZkLCAweDAxMzU2MjQ2LCAweDAxMzNlY2FkLCAweDAxMzI3YTk3LCAweDAxMzEwYmY2LCAweDAxMmZhMGJlLAorICAgIDB4MDEyZTM4ZTMsIDB4MDEyY2Q0NTksIDB4MDEyYjczMTUsIDB4MDEyYTE1MGEsIDB4MDEyOGJhMmUsIDB4MDEyNzYyNzYsCisgICAgMHgwMTI2MGRkNiwgMHgwMTI0YmM0NCwgMHgwMTIzNmRiNiwgMHgwMTIyMjIyMiwgMHgwMTIwZDk3YywgMHgwMTFmOTNiYywKKyAgICAweDAxMWU1MGQ3LCAweDAxMWQxMGM0LCAweDAxMWJkMzdhLCAweDAxMWE5OGVmLCAweDAxMTk2MTFhLCAweDAxMTgyYmYyLAorICAgIDB4MDExNmY5NmYsIDB4MDExNWM5ODgsIDB4MDExNDljMzQsIDB4MDExMzcxNmEsIDB4MDExMjQ5MjQsIDB4MDExMTIzNTgsCisgICAgMHgwMTEwMDAwMCwgMHgwMTBlZGYxMiwgMHgwMTBkYzA4NywgMHgwMTBjYTQ1OCwgMHgwMTBiOGE3ZCwgMHgwMTBhNzJmMCwKKyAgICAweDAxMDk1ZGE4LCAweDAxMDg0YTlmLCAweDAxMDczOWNlLCAweDAxMDYyYjJlLCAweDAxMDUxZWI4LCAweDAxMDQxNDY1LAorICAgIDB4MDEwMzBjMzAsIDB4MDEwMjA2MTIsIDB4MDEwMTAyMDQsIDB4MDEwMDAwMDAgfSwKKyAgeyAgIC8vIGFscGhhICogS0lOVl8yNTUKKyAgICAweDAwMDAwMDAwLCAweDAwMDEwMTAxLCAweDAwMDIwMjAyLCAweDAwMDMwMzAzLCAweDAwMDQwNDA0LCAweDAwMDUwNTA1LAorICAgIDB4MDAwNjA2MDYsIDB4MDAwNzA3MDcsIDB4MDAwODA4MDgsIDB4MDAwOTA5MDksIDB4MDAwYTBhMGEsIDB4MDAwYjBiMGIsCisgICAgMHgwMDBjMGMwYywgMHgwMDBkMGQwZCwgMHgwMDBlMGUwZSwgMHgwMDBmMGYwZiwgMHgwMDEwMTAxMCwgMHgwMDExMTExMSwKKyAgICAweDAwMTIxMjEyLCAweDAwMTMxMzEzLCAweDAwMTQxNDE0LCAweDAwMTUxNTE1LCAweDAwMTYxNjE2LCAweDAwMTcxNzE3LAorICAgIDB4MDAxODE4MTgsIDB4MDAxOTE5MTksIDB4MDAxYTFhMWEsIDB4MDAxYjFiMWIsIDB4MDAxYzFjMWMsIDB4MDAxZDFkMWQsCisgICAgMHgwMDFlMWUxZSwgMHgwMDFmMWYxZiwgMHgwMDIwMjAyMCwgMHgwMDIxMjEyMSwgMHgwMDIyMjIyMiwgMHgwMDIzMjMyMywKKyAgICAweDAwMjQyNDI0LCAweDAwMjUyNTI1LCAweDAwMjYyNjI2LCAweDAwMjcyNzI3LCAweDAwMjgyODI4LCAweDAwMjkyOTI5LAorICAgIDB4MDAyYTJhMmEsIDB4MDAyYjJiMmIsIDB4MDAyYzJjMmMsIDB4MDAyZDJkMmQsIDB4MDAyZTJlMmUsIDB4MDAyZjJmMmYsCisgICAgMHgwMDMwMzAzMCwgMHgwMDMxMzEzMSwgMHgwMDMyMzIzMiwgMHgwMDMzMzMzMywgMHgwMDM0MzQzNCwgMHgwMDM1MzUzNSwKKyAgICAweDAwMzYzNjM2LCAweDAwMzczNzM3LCAweDAwMzgzODM4LCAweDAwMzkzOTM5LCAweDAwM2EzYTNhLCAweDAwM2IzYjNiLAorICAgIDB4MDAzYzNjM2MsIDB4MDAzZDNkM2QsIDB4MDAzZTNlM2UsIDB4MDAzZjNmM2YsIDB4MDA0MDQwNDAsIDB4MDA0MTQxNDEsCisgICAgMHgwMDQyNDI0MiwgMHgwMDQzNDM0MywgMHgwMDQ0NDQ0NCwgMHgwMDQ1NDU0NSwgMHgwMDQ2NDY0NiwgMHgwMDQ3NDc0NywKKyAgICAweDAwNDg0ODQ4LCAweDAwNDk0OTQ5LCAweDAwNGE0YTRhLCAweDAwNGI0YjRiLCAweDAwNGM0YzRjLCAweDAwNGQ0ZDRkLAorICAgIDB4MDA0ZTRlNGUsIDB4MDA0ZjRmNGYsIDB4MDA1MDUwNTAsIDB4MDA1MTUxNTEsIDB4MDA1MjUyNTIsIDB4MDA1MzUzNTMsCisgICAgMHgwMDU0NTQ1NCwgMHgwMDU1NTU1NSwgMHgwMDU2NTY1NiwgMHgwMDU3NTc1NywgMHgwMDU4NTg1OCwgMHgwMDU5NTk1OSwKKyAgICAweDAwNWE1YTVhLCAweDAwNWI1YjViLCAweDAwNWM1YzVjLCAweDAwNWQ1ZDVkLCAweDAwNWU1ZTVlLCAweDAwNWY1ZjVmLAorICAgIDB4MDA2MDYwNjAsIDB4MDA2MTYxNjEsIDB4MDA2MjYyNjIsIDB4MDA2MzYzNjMsIDB4MDA2NDY0NjQsIDB4MDA2NTY1NjUsCisgICAgMHgwMDY2NjY2NiwgMHgwMDY3Njc2NywgMHgwMDY4Njg2OCwgMHgwMDY5Njk2OSwgMHgwMDZhNmE2YSwgMHgwMDZiNmI2YiwKKyAgICAweDAwNmM2YzZjLCAweDAwNmQ2ZDZkLCAweDAwNmU2ZTZlLCAweDAwNmY2ZjZmLCAweDAwNzA3MDcwLCAweDAwNzE3MTcxLAorICAgIDB4MDA3MjcyNzIsIDB4MDA3MzczNzMsIDB4MDA3NDc0NzQsIDB4MDA3NTc1NzUsIDB4MDA3Njc2NzYsIDB4MDA3Nzc3NzcsCisgICAgMHgwMDc4Nzg3OCwgMHgwMDc5Nzk3OSwgMHgwMDdhN2E3YSwgMHgwMDdiN2I3YiwgMHgwMDdjN2M3YywgMHgwMDdkN2Q3ZCwKKyAgICAweDAwN2U3ZTdlLCAweDAwN2Y3ZjdmLCAweDAwODA4MDgwLCAweDAwODE4MTgxLCAweDAwODI4MjgyLCAweDAwODM4MzgzLAorICAgIDB4MDA4NDg0ODQsIDB4MDA4NTg1ODUsIDB4MDA4Njg2ODYsIDB4MDA4Nzg3ODcsIDB4MDA4ODg4ODgsIDB4MDA4OTg5ODksCisgICAgMHgwMDhhOGE4YSwgMHgwMDhiOGI4YiwgMHgwMDhjOGM4YywgMHgwMDhkOGQ4ZCwgMHgwMDhlOGU4ZSwgMHgwMDhmOGY4ZiwKKyAgICAweDAwOTA5MDkwLCAweDAwOTE5MTkxLCAweDAwOTI5MjkyLCAweDAwOTM5MzkzLCAweDAwOTQ5NDk0LCAweDAwOTU5NTk1LAorICAgIDB4MDA5Njk2OTYsIDB4MDA5Nzk3OTcsIDB4MDA5ODk4OTgsIDB4MDA5OTk5OTksIDB4MDA5YTlhOWEsIDB4MDA5YjliOWIsCisgICAgMHgwMDljOWM5YywgMHgwMDlkOWQ5ZCwgMHgwMDllOWU5ZSwgMHgwMDlmOWY5ZiwgMHgwMGEwYTBhMCwgMHgwMGExYTFhMSwKKyAgICAweDAwYTJhMmEyLCAweDAwYTNhM2EzLCAweDAwYTRhNGE0LCAweDAwYTVhNWE1LCAweDAwYTZhNmE2LCAweDAwYTdhN2E3LAorICAgIDB4MDBhOGE4YTgsIDB4MDBhOWE5YTksIDB4MDBhYWFhYWEsIDB4MDBhYmFiYWIsIDB4MDBhY2FjYWMsIDB4MDBhZGFkYWQsCisgICAgMHgwMGFlYWVhZSwgMHgwMGFmYWZhZiwgMHgwMGIwYjBiMCwgMHgwMGIxYjFiMSwgMHgwMGIyYjJiMiwgMHgwMGIzYjNiMywKKyAgICAweDAwYjRiNGI0LCAweDAwYjViNWI1LCAweDAwYjZiNmI2LCAweDAwYjdiN2I3LCAweDAwYjhiOGI4LCAweDAwYjliOWI5LAorICAgIDB4MDBiYWJhYmEsIDB4MDBiYmJiYmIsIDB4MDBiY2JjYmMsIDB4MDBiZGJkYmQsIDB4MDBiZWJlYmUsIDB4MDBiZmJmYmYsCisgICAgMHgwMGMwYzBjMCwgMHgwMGMxYzFjMSwgMHgwMGMyYzJjMiwgMHgwMGMzYzNjMywgMHgwMGM0YzRjNCwgMHgwMGM1YzVjNSwKKyAgICAweDAwYzZjNmM2LCAweDAwYzdjN2M3LCAweDAwYzhjOGM4LCAweDAwYzljOWM5LCAweDAwY2FjYWNhLCAweDAwY2JjYmNiLAorICAgIDB4MDBjY2NjY2MsIDB4MDBjZGNkY2QsIDB4MDBjZWNlY2UsIDB4MDBjZmNmY2YsIDB4MDBkMGQwZDAsIDB4MDBkMWQxZDEsCisgICAgMHgwMGQyZDJkMiwgMHgwMGQzZDNkMywgMHgwMGQ0ZDRkNCwgMHgwMGQ1ZDVkNSwgMHgwMGQ2ZDZkNiwgMHgwMGQ3ZDdkNywKKyAgICAweDAwZDhkOGQ4LCAweDAwZDlkOWQ5LCAweDAwZGFkYWRhLCAweDAwZGJkYmRiLCAweDAwZGNkY2RjLCAweDAwZGRkZGRkLAorICAgIDB4MDBkZWRlZGUsIDB4MDBkZmRmZGYsIDB4MDBlMGUwZTAsIDB4MDBlMWUxZTEsIDB4MDBlMmUyZTIsIDB4MDBlM2UzZTMsCisgICAgMHgwMGU0ZTRlNCwgMHgwMGU1ZTVlNSwgMHgwMGU2ZTZlNiwgMHgwMGU3ZTdlNywgMHgwMGU4ZThlOCwgMHgwMGU5ZTllOSwKKyAgICAweDAwZWFlYWVhLCAweDAwZWJlYmViLCAweDAwZWNlY2VjLCAweDAwZWRlZGVkLCAweDAwZWVlZWVlLCAweDAwZWZlZmVmLAorICAgIDB4MDBmMGYwZjAsIDB4MDBmMWYxZjEsIDB4MDBmMmYyZjIsIDB4MDBmM2YzZjMsIDB4MDBmNGY0ZjQsIDB4MDBmNWY1ZjUsCisgICAgMHgwMGY2ZjZmNiwgMHgwMGY3ZjdmNywgMHgwMGY4ZjhmOCwgMHgwMGY5ZjlmOSwgMHgwMGZhZmFmYSwgMHgwMGZiZmJmYiwKKyAgICAweDAwZmNmY2ZjLCAweDAwZmRmZGZkLCAweDAwZmVmZWZlLCAweDAwZmZmZmZmIH0KK307CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRTY2FsZSh1aW50MzJfdCBhLCBpbnQgaW52ZXJzZSkgeworICByZXR1cm4ga011bHRUYWJsZXNbIWludmVyc2VdW2FdOworfQorCisjZWxzZQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0U2NhbGUodWludDMyX3QgYSwgaW50IGludmVyc2UpIHsKKyAgcmV0dXJuIGludmVyc2UgPyAoMjU1dSA8PCBNRklYKSAvIGEgOiBhICogS0lOVl8yNTU7Cit9CisKKyNlbmRpZiAgICAvLyBVU0VfVEFCTEVTX0ZPUl9BTFBIQV9NVUxUCisKK3ZvaWQgV2ViUE11bHRBUkdCUm93Qyh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBwdHJbeF07CisgICAgaWYgKGFyZ2IgPCAweGZmMDAwMDAwdSkgeyAgICAgIC8vIGFscGhhIDwgMjU1CisgICAgICBpZiAoYXJnYiA8PSAweDAwZmZmZmZmdSkgeyAgIC8vIGFscGhhID09IDAKKyAgICAgICAgcHRyW3hdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSBHZXRTY2FsZShhbHBoYSwgaW52ZXJzZSk7CisgICAgICAgIHVpbnQzMl90IG91dCA9IGFyZ2IgJiAweGZmMDAwMDAwdTsKKyAgICAgICAgb3V0IHw9IE11bHQoYXJnYiA+PiAgMCwgc2NhbGUpIDw8ICAwOworICAgICAgICBvdXQgfD0gTXVsdChhcmdiID4+ICA4LCBzY2FsZSkgPDwgIDg7CisgICAgICAgIG91dCB8PSBNdWx0KGFyZ2IgPj4gMTYsIHNjYWxlKSA8PCAxNjsKKyAgICAgICAgcHRyW3hdID0gb3V0OworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFdlYlBNdWx0Um93Qyh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gYWxwaGFbeF07CisgICAgaWYgKGEgIT0gMjU1KSB7CisgICAgICBpZiAoYSA9PSAwKSB7CisgICAgICAgIHB0clt4XSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IEdldFNjYWxlKGEsIGludmVyc2UpOworICAgICAgICBwdHJbeF0gPSBNdWx0KHB0clt4XSwgc2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisjdW5kZWYgS0lOVl8yNTUKKyN1bmRlZiBIQUxGCisjdW5kZWYgTUZJWAorCit2b2lkICgqV2ViUE11bHRBUkdCUm93KSh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKK3ZvaWQgKCpXZWJQTXVsdFJvdykodWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHZW5lcmljIHBlci1wbGFuZSBjYWxscworCit2b2lkIFdlYlBNdWx0QVJHQlJvd3ModWludDhfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSkgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IG51bV9yb3dzOyArK24pIHsKKyAgICBXZWJQTXVsdEFSR0JSb3coKHVpbnQzMl90KilwdHIsIHdpZHRoLCBpbnZlcnNlKTsKKyAgICBwdHIgKz0gc3RyaWRlOworICB9Cit9CisKK3ZvaWQgV2ViUE11bHRSb3dzKHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgbnVtX3Jvd3MsIGludCBpbnZlcnNlKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3Jvd3M7ICsrbikgeworICAgIFdlYlBNdWx0Um93KHB0ciwgYWxwaGEsIHdpZHRoLCBpbnZlcnNlKTsKKyAgICBwdHIgKz0gc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlbXVsdGlwbGllZCBtb2RlcworCisvLyBub24gZGl0aGVyZWQtbW9kZXMKKworLy8gKHggKiBhICogMzI4OTcpID4+IDIzIGlzIGJpdC13aXNlIGVxdWl2YWxlbnQgdG8gKGludCkoeCAqIGEgLyAyNTUuKQorLy8gZm9yIGFsbCA4Yml0IHggb3IgYS4gRm9yIGJpdC13aXNlIGVxdWl2YWxlbmNlIHRvIChpbnQpKHggKiBhIC8gMjU1LiArIC41KSwKKy8vIG9uZSBjYW4gdXNlIGluc3RlYWQ6ICh4ICogYSAqIDY1NzkzICsgKDEgPDwgMjMpKSA+PiAyNAorI2lmIDEgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LikKKyNkZWZpbmUgTVVMVElQTElFUihhKSAgICgoYSkgKiAzMjg5N1UpCisjZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pKSA+PiAyMykKKyNlbHNlICAgICAvLyAoaW50KSh4ICogYSAvIDI1NS4gKyAuNSkKKyNkZWZpbmUgTVVMVElQTElFUihhKSAoKGEpICogNjU3OTNVKQorI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSArICgxVSA8PCAyMykpID4+IDI0KQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseSh1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgIHdoaWxlIChoLS0gPiAwKSB7CisgICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKKyAgICAgIGlmIChhICE9IDB4ZmYpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9Cit9CisjdW5kZWYgTVVMVElQTElFUgorI3VuZGVmIFBSRU1VTFRJUExZCisKKy8vIHJnYkE0NDQ0CisKKyNkZWZpbmUgTVVMVElQTElFUihhKSAgKChhKSAqIDB4MTExMSkgICAgLy8gMHgxMTExIH49ICgxIDw8IDE2KSAvIDE1CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9oaSh1aW50OF90IHgpIHsKKyAgcmV0dXJuICh4ICYgMHhmMCkgfCAoeCA+PiA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgZGl0aGVyX2xvKHVpbnQ4X3QgeCkgeworICByZXR1cm4gKHggJiAweDBmKSB8ICh4IDw8IDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBtdWx0aXBseSh1aW50OF90IHgsIHVpbnQzMl90IG0pIHsKKyAgcmV0dXJuICh4ICogbSkgPj4gMTY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQodWludDhfdCogcmdiYTQ0NDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnX2J5dGVfcG9zIC8qIDAgb3IgMSAqLykgeworICB3aGlsZSAoaC0tID4gMCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiYTQ0NDRbMiAqIGkgKyByZ19ieXRlX3Bvc107CisgICAgICBjb25zdCB1aW50MzJfdCBiYSA9IHJnYmE0NDQ0WzIgKiBpICsgKHJnX2J5dGVfcG9zIF4gMSldOworICAgICAgY29uc3QgdWludDhfdCBhID0gYmEgJiAweDBmOworICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICBjb25zdCB1aW50OF90IHIgPSBtdWx0aXBseShkaXRoZXJfaGkocmcpLCBtdWx0KTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IG11bHRpcGx5KGRpdGhlcl9sbyhyZyksIG11bHQpOworICAgICAgY29uc3QgdWludDhfdCBiID0gbXVsdGlwbHkoZGl0aGVyX2hpKGJhKSwgbXVsdCk7CisgICAgICByZ2JhNDQ0NFsyICogaSArIHJnX2J5dGVfcG9zXSA9IChyICYgMHhmMCkgfCAoKGcgPj4gNCkgJiAweDBmKTsKKyAgICAgIHJnYmE0NDQ0WzIgKiBpICsgKHJnX2J5dGVfcG9zIF4gMSldID0gKGIgJiAweGYwKSB8IGE7CisgICAgfQorICAgIHJnYmE0NDQ0ICs9IHN0cmlkZTsKKyAgfQorfQorI3VuZGVmIE1VTFRJUExJRVIKKworc3RhdGljIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5XzE2Yih1aW50OF90KiByZ2JhNDQ0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHJnYmE0NDQ0LCB3LCBoLCBzdHJpZGUsIDEpOworI2Vsc2UKKyAgQXBwbHlBbHBoYU11bHRpcGx5NDQ0NChyZ2JhNDQ0NCwgdywgaCwgc3RyaWRlLCAwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGEoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmY7CisgIGludCBpLCBqOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOworICAgICAgZHN0WzQgKiBpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9CisKKyAgcmV0dXJuIChhbHBoYV9tYXNrICE9IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBEaXNwYXRjaEFscGhhVG9HcmVlbihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgZHN0W2ldID0gYWxwaGFbaV0gPDwgODsgIC8vIGxlYXZlIEEvUi9CIGNoYW5uZWxzIHplcm8nZC4KKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBpbnQgRXh0cmFjdEFscGhhKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKSB7CisgIHVpbnQ4X3QgYWxwaGFfbWFzayA9IDB4ZmY7CisgIGludCBpLCBqOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50OF90IGFscGhhX3ZhbHVlID0gYXJnYls0ICogaV07CisgICAgICBhbHBoYVtpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIChhbHBoYV9tYXNrID09IDB4ZmYpOworfQorCit2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseSkodWludDhfdCosIGludCwgaW50LCBpbnQsIGludCk7Cit2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50KTsKK2ludCAoKldlYlBEaXNwYXRjaEFscGhhKShjb25zdCB1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDhfdCosIGludCk7Cit2b2lkICgqV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuKShjb25zdCB1aW50OF90KiwgaW50LCBpbnQsIGludCwgdWludDMyX3QqLCBpbnQpOworaW50ICgqV2ViUEV4dHJhY3RBbHBoYSkoY29uc3QgdWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQ4X3QqLCBpbnQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdCBmdW5jdGlvbgorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGFscGhhX3Byb2Nlc3NpbmdfbGFzdF9jcHVpbmZvX3VzZWQgPQorICAgIChWUDhDUFVJbmZvKSZhbHBoYV9wcm9jZXNzaW5nX2xhc3RfY3B1aW5mb191c2VkOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3Npbmcodm9pZCkgeworICBpZiAoYWxwaGFfcHJvY2Vzc2luZ19sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgV2ViUE11bHRBUkdCUm93ID0gV2ViUE11bHRBUkdCUm93QzsKKyAgV2ViUE11bHRSb3cgPSBXZWJQTXVsdFJvd0M7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkgPSBBcHBseUFscGhhTXVsdGlwbHk7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0ID0gQXBwbHlBbHBoYU11bHRpcGx5XzE2YjsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhOworICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4gPSBEaXNwYXRjaEFscGhhVG9HcmVlbjsKKyAgV2ViUEV4dHJhY3RBbHBoYSA9IEV4dHJhY3RBbHBoYTsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKCk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgYWxwaGFfcHJvY2Vzc2luZ19sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUyYTI0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLgorLy8KKy8vIEF1dGhvcihzKTogQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKK3N0YXRpYyBpbnQgRGlzcGF0Y2hBbHBoYShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZmZmZmZmZjsKKyAgaW50IGksIGosIHRlbXAwOworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIHVpbnQ4X3QqIHBkc3QgPSBkc3Q7CisgICAgY29uc3QgdWludDhfdCogcGFscGhhID0gYWxwaGE7CisgICAgZm9yIChpID0gMDsgaSA8ICh3aWR0aCA+PiAyKTsgKytpKSB7CisgICAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ1bHcgICAgJVt0ZW1wMF0sICAgICAgMCglW3BhbHBoYV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwYWxwaGFdLCAgICAgJVtwYWxwaGFdLCAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwZHN0XSwgICAgICAgJVtwZHN0XSwgICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMF0sICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMF0sICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMF0sICAgICAgMjQgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMF0sICAgICAgLTE2KCVbcGRzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMV0sICAgICAgLTEyKCVbcGRzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMl0sICAgICAgLTgoJVtwZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wM10sICAgICAgLTQoJVtwZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbcGFscGhhXSIrciIocGFscGhhKSwgW3Bkc3RdIityIihwZHN0KSwKKyAgICAgICAgICBbYWxwaGFfbWFza10iK3IiKGFscGhhX21hc2spCisgICAgICAgIDoKKyAgICAgICAgOiAibWVtb3J5IgorICAgICAgKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoICYgMyk7ICsraSkgeworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsYnUgICAgJVt0ZW1wMF0sICAgICAgMCglW3BhbHBoYV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwYWxwaGFdLCAgICAgJVtwYWxwaGFdLCAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgJVt0ZW1wMF0sICAgICAgMCglW3Bkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgJVtwZHN0XSwgICAgICAgJVtwZHN0XSwgICAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3BhbHBoYV0iK3IiKHBhbHBoYSksIFtwZHN0XSIrciIocGRzdCksCisgICAgICAgICAgW2FscGhhX21hc2tdIityIihhbHBoYV9tYXNrKQorICAgICAgICA6CisgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICk7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJleHQgICAgJVt0ZW1wMF0sICAgICAgJVthbHBoYV9tYXNrXSwgMCwgMTYgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgICJleHQgICAgJVt0ZW1wMF0sICAgICAgJVthbHBoYV9tYXNrXSwgMCwgOCAgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgOCAgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgJVthbHBoYV9tYXNrXSwgJVthbHBoYV9tYXNrXSwgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW2FscGhhX21hc2tdIityIihhbHBoYV9tYXNrKQorICAgIDoKKyAgKTsKKworICByZXR1cm4gKGFscGhhX21hc2sgIT0gMHhmZik7Cit9CisKK3N0YXRpYyB2b2lkIE11bHRBUkdCUm93KHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpIHsKKyAgaW50IHg7CisgIGNvbnN0IHVpbnQzMl90IGNfMDBmZmZmZmYgPSAweDAwZmZmZmZmdTsKKyAgY29uc3QgdWludDMyX3QgY19mZjAwMDAwMCA9IDB4ZmYwMDAwMDB1OworICBjb25zdCB1aW50MzJfdCBjXzgwMDAwMDAgID0gMHgwMDgwMDAwMHU7CisgIGNvbnN0IHVpbnQzMl90IGNfODAwMDA4MCAgPSAweDAwODAwMDgwdTsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gcHRyW3hdOworICAgIGlmIChhcmdiIDwgMHhmZjAwMDAwMHUpIHsgICAgICAvLyBhbHBoYSA8IDI1NQorICAgICAgaWYgKGFyZ2IgPD0gMHgwMGZmZmZmZnUpIHsgICAvLyBhbHBoYSA9PSAwCisgICAgICAgIHB0clt4XSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGFscGhhOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAic3JsICAgICAgICAgICVbYWxwaGFdLCAgICVbYXJnYl0sICAgICAgIDI0ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW2FscGhhXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJhbmQgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICAgJVtjXzAwZmZmZmZmXSAgICAgXG5cdCIKKyAgICAgICAgICAiYmVxeiAgICAgICAgICVbaW52ZXJzZV0sIDBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImRpdnUgICAgICAgICAkemVybywgICAgICAlW2NfZmYwMDAwMDBdLCAlW2FscGhhXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJtZmxvICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImFuZGkgICAgICAgICAlW3RlbXAxXSwgICAlW2FyZ2JdLCAgICAgICAweGZmICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICJleHQgICAgICAgICAgJVt0ZW1wMl0sICAgJVthcmdiXSwgICAgICAgOCwgICAgICAgICAgICAgOCAgXG5cdCIKKyAgICAgICAgICAiZXh0ICAgICAgICAgICVbdGVtcDNdLCAgICVbYXJnYl0sICAgICAgIDE2LCAgICAgICAgICAgIDggIFxuXHQiCisgICAgICAgICAgIm11bCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJtdWwgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAibXVsICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICVbdGVtcDBdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgInByZWNycS5waC53ICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgICAlW3RlbXAxXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJhZGR1ICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgJVtjXzgwMDAwMDBdICAgICAgXG5cdCIKKyAgICAgICAgICAiYWRkdSAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICVbY184MDAwMDgwXSAgICAgIFxuXHQiCisgICAgICAgICAgInByZWNycS5waC53ICAlW3RlbXAzXSwgICAlW2FyZ2JdLCAgICAgICAlW3RlbXAzXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJwcmVjcnEucWIucGggJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbYWxwaGFdIj0mciIoYWxwaGEpCisgICAgICAgICAgOiBbaW52ZXJzZV0iciIoaW52ZXJzZSksIFtjXzAwZmZmZmZmXSJyIihjXzAwZmZmZmZmKSwKKyAgICAgICAgICAgIFtjXzgwMDAwMDBdInIiKGNfODAwMDAwMCksIFtjXzgwMDAwODBdInIiKGNfODAwMDA4MCksCisgICAgICAgICAgICBbY19mZjAwMDAwMF0iciIoY19mZjAwMDAwMCksIFthcmdiXSJyIihhcmdiKQorICAgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICAgKTsKKyAgICAgICAgcHRyW3hdID0gdGVtcDE7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhOworICBXZWJQTXVsdEFSR0JSb3cgPSBNdWx0QVJHQlJvdzsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE3YjdiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlMi5jCkBAIC0wLDAgKzEsMjk4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IERpc3BhdGNoQWxwaGEoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgLy8gYWxwaGFfYW5kIHN0b3JlcyBhbiAnYW5kJyBvcGVyYXRpb24gb2YgYWxsIHRoZSBhbHBoYVtdIHZhbHVlcy4gVGhlIGZpbmFsCisgIC8vIHZhbHVlIGlzIG5vdCAweGZmIGlmIGFueSBvZiB0aGUgYWxwaGFbXSBpcyBub3QgZXF1YWwgdG8gMHhmZi4KKyAgdWludDMyX3QgYWxwaGFfYW5kID0gMHhmZjsKKyAgaW50IGksIGo7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgcmdiX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmZmZmZjAwdSk7ICAvLyB0byBwcmVzZXJ2ZSBSR0IKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgfjB1LCB+MHUpOworICBfX20xMjhpIGFsbF9hbHBoYXMgPSBhbGxfMHhmZjsKKworICAvLyBXZSBtdXN0IGJlIGFibGUgdG8gYWNjZXNzIDMgZXh0cmEgYnl0ZXMgYWZ0ZXIgdGhlIGxhc3Qgd3JpdHRlbiBieXRlCisgIC8vICdkc3RbNCAqIHdpZHRoIC0gNF0nLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgdGhlIGZpcnN0IG9yIHRoZQorICAvLyBsYXN0IGJ5dGUgb2YgdGhlIHF1YWRydXBsZXQuCisgIGNvbnN0IGludCBsaW1pdCA9ICh3aWR0aCAtIDEpICYgfjc7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gOCkgeworICAgICAgLy8gbG9hZCA4IGFscGhhIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYWxwaGFbaV0pOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV91bnBhY2tsb19lcGk4KGEwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBhMl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihhMSwgemVybyk7CisgICAgICAvLyBsb2FkIDggZHN0IHBpeGVscyAoMzIgYnl0ZXMpCisgICAgICBjb25zdCBfX20xMjhpIGIwX2xvID0gX21tX2xvYWR1X3NpMTI4KG91dCArIDApOworICAgICAgY29uc3QgX19tMTI4aSBiMF9oaSA9IF9tbV9sb2FkdV9zaTEyOChvdXQgKyAxKTsKKyAgICAgIC8vIG1hc2sgZHN0IGFscGhhIHZhbHVlcworICAgICAgY29uc3QgX19tMTI4aSBiMV9sbyA9IF9tbV9hbmRfc2kxMjgoYjBfbG8sIHJnYl9tYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjFfaGkgPSBfbW1fYW5kX3NpMTI4KGIwX2hpLCByZ2JfbWFzayk7CisgICAgICAvLyBjb21iaW5lCisgICAgICBjb25zdCBfX20xMjhpIGIyX2xvID0gX21tX29yX3NpMTI4KGIxX2xvLCBhMl9sbyk7CisgICAgICBjb25zdCBfX20xMjhpIGIyX2hpID0gX21tX29yX3NpMTI4KGIxX2hpLCBhMl9oaSk7CisgICAgICAvLyBzdG9yZQorICAgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAwLCBiMl9sbyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDEsIGIyX2hpKTsKKyAgICAgIC8vIGFjY3VtdWxhdGUgZWlnaHQgYWxwaGEgJ2FuZCcgaW4gcGFyYWxsZWwKKyAgICAgIGFsbF9hbHBoYXMgPSBfbW1fYW5kX3NpMTI4KGFsbF9hbHBoYXMsIGEwKTsKKyAgICAgIG91dCArPSAyOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYWxwaGFbaV07CisgICAgICBkc3RbNCAqIGldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorICAvLyBDb21iaW5lIHRoZSBlaWdodCBhbHBoYSAnYW5kJyBpbnRvIGEgOC1iaXQgbWFzay4KKyAgYWxwaGFfYW5kICY9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KGFsbF9hbHBoYXMsIGFsbF8weGZmKSk7CisgIHJldHVybiAoYWxwaGFfYW5kICE9IDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBEaXNwYXRjaEFscGhhVG9HcmVlbihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBpbnQgbGltaXQgPSB3aWR0aCAmIH4xNTsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpICs9IDE2KSB7ICAgLy8gcHJvY2VzcyAxNiBhbHBoYSBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFscGhhW2ldKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCBhMCk7ICAvLyBub3RlIHRoZSAnemVybycgZmlyc3QhCisgICAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3VucGFja2hpX2VwaTgoemVybywgYTApOworICAgICAgY29uc3QgX19tMTI4aSBhMl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNihhMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGIyX2xvID0gX21tX3VucGFja2xvX2VwaTE2KGIxLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoYTEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBiMl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihiMSwgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAgMF0sIGEyX2xvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArICA0XSwgYTJfaGkpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDhdLCBiMl9sbyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAxMl0sIGIyX2hpKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBkc3RbaV0gPSBhbHBoYVtpXSA8PCA4OworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYShjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICAvLyBhbHBoYV9hbmQgc3RvcmVzIGFuICdhbmQnIG9wZXJhdGlvbiBvZiBhbGwgdGhlIGFscGhhW10gdmFsdWVzLiBUaGUgZmluYWwKKyAgLy8gdmFsdWUgaXMgbm90IDB4ZmYgaWYgYW55IG9mIHRoZSBhbHBoYVtdIGlzIG5vdCBlcXVhbCB0byAweGZmLgorICB1aW50MzJfdCBhbHBoYV9hbmQgPSAweGZmOworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSBhX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmdSk7ICAvLyB0byBwcmVzZXJ2ZSBhbHBoYQorICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldF9lcGkzMigwLCAwLCB+MHUsIH4wdSk7CisgIF9fbTEyOGkgYWxsX2FscGhhcyA9IGFsbF8weGZmOworCisgIC8vIFdlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgMyBleHRyYSBieXRlcyBhZnRlciB0aGUgbGFzdCB3cml0dGVuIGJ5dGUKKyAgLy8gJ3NyY1s0ICogd2lkdGggLSA0XScsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3Qgb3IgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldC4KKyAgY29uc3QgaW50IGxpbWl0ID0gKHdpZHRoIC0gMSkgJiB+NzsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpKiBzcmMgPSAoY29uc3QgX19tMTI4aSopYXJnYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gOCkgeworICAgICAgLy8gbG9hZCAzMiBhcmdiIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDApOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYW5kX3NpMTI4KGEwLCBhX21hc2spOworICAgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hbmRfc2kxMjgoYTEsIGFfbWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX3BhY2tzX2VwaTMyKGIwLCBiMSk7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3BhY2t1c19lcGkxNihjMCwgYzApOworICAgICAgLy8gc3RvcmUKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZhbHBoYVtpXSwgZDApOworICAgICAgLy8gYWNjdW11bGF0ZSBlaWdodCBhbHBoYSAnYW5kJyBpbiBwYXJhbGxlbAorICAgICAgYWxsX2FscGhhcyA9IF9tbV9hbmRfc2kxMjgoYWxsX2FscGhhcywgZDApOworICAgICAgc3JjICs9IDI7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhW2ldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIC8vIENvbWJpbmUgdGhlIGVpZ2h0IGFscGhhICdhbmQnIGludG8gYSA4LWJpdCBtYXNrLgorICBhbHBoYV9hbmQgJj0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgoYWxsX2FscGhhcywgYWxsXzB4ZmYpKTsKKyAgcmV0dXJuIChhbHBoYV9hbmQgPT0gMHhmZik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24tZGl0aGVyIHByZW11bHRpcGxpZWQgbW9kZXMKKworI2RlZmluZSBNVUxUSVBMSUVSKGEpICAgKChhKSAqIDB4ODA4MSkKKyNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkpID4+IDIzKQorCisvLyBXZSBjYW4ndCB1c2UgYSAnY29uc3QgaW50JyBmb3IgdGhlIFNIVUZGTEUgdmFsdWUsIGJlY2F1c2UgaXQgaGFzIHRvIGJlIGFuCisvLyBpbW1lZGlhdGUgaW4gdGhlIF9tbV9zaHVmZmxleHhfZXBpMTYoKSBpbnN0cnVjdGlvbi4gV2UgcmVhbGx5IGEgbWFjcm8gaGVyZS4KKyNkZWZpbmUgQVBQTFlfQUxQSEEoUkdCWCwgU0hVRkZMRSwgTUFTSywgTVVMVCkgZG8geyAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYoUkdCWCkpOyAgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2IxID0gX21tX3VucGFja2xvX2VwaTgoYXJnYjAsIHplcm8pOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbHBoYTAgPSBfbW1fYW5kX3NpMTI4KGFyZ2IxLCBNQVNLKTsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGExID0gX21tX3NodWZmbGVsb19lcGkxNihhbHBoYTAsIFNIVUZGTEUpOyAgXAorICBjb25zdCBfX20xMjhpIGFscGhhMiA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoYWxwaGExLCBTSFVGRkxFKTsgIFwKKyAgLyogYWxwaGEyID0gWzAgYTAgYTAgYTBdWzAgYTEgYTEgYTFdICovICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgc2NhbGUwID0gX21tX211bGxvX2VwaTE2KGFscGhhMiwgTVVMVCk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHNjYWxlMSA9IF9tbV9tdWxoaV9lcHUxNihhbHBoYTIsIE1VTFQpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhcmdiMiA9IF9tbV9tdWxoaV9lcHUxNihhcmdiMSwgc2NhbGUwKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjMgPSBfbW1fbXVsbG9fZXBpMTYoYXJnYjEsIHNjYWxlMSk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2I0ID0gX21tX2FkZHNfZXB1MTYoYXJnYjIsIGFyZ2IzKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhcmdiNSA9IF9tbV9zcmxpX2VwaTE2KGFyZ2I0LCA3KTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjYgPSBfbW1fb3Jfc2kxMjgoYXJnYjUsIGFscGhhMCk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFyZ2I3ID0gX21tX3BhY2t1c19lcGkxNihhcmdiNiwgemVybyk7ICAgICAgICAgIFwKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJihSR0JYKSwgYXJnYjcpOyAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHkodWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBpbnQga1NwYW4gPSAyOworICBjb25zdCBpbnQgdzIgPSB3ICYgfihrU3BhbiAtIDEpOworICB3aGlsZSAoaC0tID4gMCkgeworICAgIHVpbnQzMl90KiBjb25zdCByZ2J4ID0gKHVpbnQzMl90KilyZ2JhOworICAgIGludCBpOworICAgIGlmICghYWxwaGFfZmlyc3QpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkga01hc2sgPSBfbW1fc2V0X2VwaTE2KDB4ZmYsIDAsIDAsIDAsIDB4ZmYsIDAsIDAsIDApOworICAgICAgY29uc3QgX19tMTI4aSBrTXVsdCA9CisgICAgICAgICAgX21tX3NldF9lcGkxNigwLCAweDgwODEsIDB4ODA4MSwgMHg4MDgxLCAwLCAweDgwODEsIDB4ODA4MSwgMHg4MDgxKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCB3MjsgaSArPSBrU3BhbikgeworICAgICAgICBBUFBMWV9BTFBIQShyZ2J4W2ldLCBfTU1fU0hVRkZMRSgwLCAzLCAzLCAzKSwga01hc2ssIGtNdWx0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgX19tMTI4aSBrTWFzayA9IF9tbV9zZXRfZXBpMTYoMCwgMCwgMCwgMHhmZiwgMCwgMCwgMCwgMHhmZik7CisgICAgICBjb25zdCBfX20xMjhpIGtNdWx0ID0KKyAgICAgICAgICBfbW1fc2V0X2VwaTE2KDB4ODA4MSwgMHg4MDgxLCAweDgwODEsIDAsIDB4ODA4MSwgMHg4MDgxLCAweDgwODEsIDApOworICAgICAgZm9yIChpID0gMDsgaSA8IHcyOyBpICs9IGtTcGFuKSB7CisgICAgICAgIEFQUExZX0FMUEhBKHJnYnhbaV0sIF9NTV9TSFVGRkxFKDAsIDAsIDAsIDMpLCBrTWFzaywga011bHQpOworICAgICAgfQorICAgIH0KKyAgICAvLyBGaW5pc2ggd2l0aCBsZWZ0LW92ZXJzLgorICAgIGZvciAoOyBpIDwgdzsgKytpKSB7CisgICAgICB1aW50OF90KiBjb25zdCByZ2IgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMSA6IDApOworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKKyAgICAgIGlmIChhICE9IDB4ZmYpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9Cit9CisjdW5kZWYgTVVMVElQTElFUgorI3VuZGVmIFBSRU1VTFRJUExZCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBcHBseSBhbHBoYSB2YWx1ZSB0byByb3dzCisKKy8vIFdlIHVzZToga0lOVjI1NSA9ICgxIDw8IDI0KSAvIDI1NSA9IDB4MDEwMTAxCisvLyBTbzogYSAqIGtJTlYyNTUgPSAoYSA8PCAxNikgfCBbKGEgPDwgOCkgfCBhXQorLy8gLT4gX21tX211bGhpX2VwdTE2KCkgdGFrZXMgY2FyZSBvZiB0aGUgKGE8PDE2KSBwYXJ0LAorLy8gYW5kIF9tbV9tdWxsb19lcHUxNihhICogMHgwMTAxLC4uLikgdGFrZXMgY2FyZSBvZiB0aGUgIihhIDw8IDgpIHwgYSIgb25lLgorCitzdGF0aWMgdm9pZCBNdWx0QVJHQlJvdyh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4ID0gMDsKKyAgaWYgKCFpbnZlcnNlKSB7CisgICAgY29uc3QgaW50IGtTcGFuID0gMjsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGNvbnN0IF9fbTEyOGkga1JvdW5kID0KKyAgICAgICAgX21tX3NldF9lcGkxNigwLCAxIDw8IDcsIDEgPDwgNywgMSA8PCA3LCAwLCAxIDw8IDcsIDEgPDwgNywgMSA8PCA3KTsKKyAgICBjb25zdCBfX20xMjhpIGtNdWx0ID0KKyAgICAgICAgX21tX3NldF9lcGkxNigwLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxLCAwLCAweDAxMDEsIDB4MDEwMSwgMHgwMTAxKTsKKyAgICBjb25zdCBfX20xMjhpIGtPbmU2NCA9IF9tbV9zZXRfZXBpMTYoMXUgPDwgOCwgMCwgMCwgMCwgMXUgPDwgOCwgMCwgMCwgMCk7CisgICAgY29uc3QgaW50IHcyID0gd2lkdGggJiB+KGtTcGFuIC0gMSk7CisgICAgZm9yICh4ID0gMDsgeCA8IHcyOyB4ICs9IGtTcGFuKSB7CisgICAgICBjb25zdCBfX20xMjhpIGFyZ2IwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYXJnYjEgPSBfbW1fdW5wYWNrbG9fZXBpOChhcmdiMCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KGFyZ2IxLCBfTU1fU0hVRkZMRSgzLCAzLCAzLCAzKSk7CisgICAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KHRtcDAsIF9NTV9TSFVGRkxFKDMsIDMsIDMsIDMpKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zcmxpX2VwaTY0KHRtcDEsIDE2KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgc2NhbGUwID0gX21tX211bGxvX2VwaTE2KHRtcDEsIGtNdWx0KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgc2NhbGUxID0gX21tX29yX3NpMTI4KHRtcDIsIGtPbmU2NCk7CisgICAgICBjb25zdCBfX20xMjhpIGFyZ2IyID0gX21tX211bGhpX2VwdTE2KGFyZ2IxLCBzY2FsZTApOworICAgICAgY29uc3QgX19tMTI4aSBhcmdiMyA9IF9tbV9tdWxsb19lcGkxNihhcmdiMSwgc2NhbGUxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYXJnYjQgPSBfbW1fYWRkc19lcHUxNihhcmdiMiwgYXJnYjMpOworICAgICAgY29uc3QgX19tMTI4aSBhcmdiNSA9IF9tbV9hZGRzX2VwdTE2KGFyZ2I0LCBrUm91bmQpOworICAgICAgY29uc3QgX19tMTI4aSBhcmdiNiA9IF9tbV9zcmxpX2VwaTE2KGFyZ2I1LCA4KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYXJnYjcgPSBfbW1fcGFja3VzX2VwaTE2KGFyZ2I2LCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZwdHJbeF0sIGFyZ2I3KTsKKyAgICB9CisgIH0KKyAgd2lkdGggLT0geDsKKyAgaWYgKHdpZHRoID4gMCkgV2ViUE11bHRBUkdCUm93QyhwdHIgKyB4LCB3aWR0aCwgaW52ZXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkIE11bHRSb3codWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeCA9IDA7CisgIGlmICghaW52ZXJzZSkgeworICAgIGNvbnN0IGludCBrU3BhbiA9IDg7CisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGtSb3VuZCA9IF9tbV9zZXQxX2VwaTE2KDEgPDwgNyk7CisgICAgY29uc3QgaW50IHcyID0gd2lkdGggJiB+KGtTcGFuIC0gMSk7CisgICAgZm9yICh4ID0gMDsgeCA8IHcyOyB4ICs9IGtTcGFuKSB7CisgICAgICBjb25zdCBfX20xMjhpIHYwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGFscGhhMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFscGhhW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWxwaGExID0gX21tX3VucGFja2xvX2VwaTgoYWxwaGEwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWxwaGEyID0gX21tX3VucGFja2xvX2VwaTgoYWxwaGEwLCBhbHBoYTApOworICAgICAgY29uc3QgX19tMTI4aSB2MiA9IF9tbV9tdWxoaV9lcHUxNih2MSwgYWxwaGEyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjMgPSBfbW1fbXVsbG9fZXBpMTYodjEsIGFscGhhMSk7CisgICAgICBjb25zdCBfX20xMjhpIHY0ID0gX21tX2FkZHNfZXB1MTYodjIsIHYzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjUgPSBfbW1fYWRkc19lcHUxNih2NCwga1JvdW5kKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjYgPSBfbW1fc3JsaV9lcGkxNih2NSwgOCk7CisgICAgICBjb25zdCBfX20xMjhpIHY3ID0gX21tX3BhY2t1c19lcGkxNih2NiwgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdLCB2Nyk7CisgICAgfQorICB9CisgIHdpZHRoIC09IHg7CisgIGlmICh3aWR0aCA+IDApIFdlYlBNdWx0Um93QyhwdHIgKyB4LCBhbHBoYSArIHgsIHdpZHRoLCBpbnZlcnNlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKSB7CisgIFdlYlBNdWx0QVJHQlJvdyA9IE11bHRBUkdCUm93OworICBXZWJQTXVsdFJvdyA9IE11bHRSb3c7CisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkgPSBBcHBseUFscGhhTXVsdGlwbHk7CisgIFdlYlBEaXNwYXRjaEFscGhhID0gRGlzcGF0Y2hBbHBoYTsKKyAgV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuID0gRGlzcGF0Y2hBbHBoYVRvR3JlZW47CisgIFdlYlBFeHRyYWN0QWxwaGEgPSBFeHRyYWN0QWxwaGE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTg1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbCwgU1NFNC4xIHZhcmlhbnQuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYShjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICAvLyBhbHBoYV9hbmQgc3RvcmVzIGFuICdhbmQnIG9wZXJhdGlvbiBvZiBhbGwgdGhlIGFscGhhW10gdmFsdWVzLiBUaGUgZmluYWwKKyAgLy8gdmFsdWUgaXMgbm90IDB4ZmYgaWYgYW55IG9mIHRoZSBhbHBoYVtdIGlzIG5vdCBlcXVhbCB0byAweGZmLgorICB1aW50MzJfdCBhbHBoYV9hbmQgPSAweGZmOworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXQxX2VwaTMyKH4wdSk7CisgIF9fbTEyOGkgYWxsX2FscGhhcyA9IGFsbF8weGZmOworCisgIC8vIFdlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgMyBleHRyYSBieXRlcyBhZnRlciB0aGUgbGFzdCB3cml0dGVuIGJ5dGUKKyAgLy8gJ3NyY1s0ICogd2lkdGggLSA0XScsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3Qgb3IgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldC4KKyAgY29uc3QgaW50IGxpbWl0ID0gKHdpZHRoIC0gMSkgJiB+MTU7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMCA9IF9tbV9zZXRfZXBpOCgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgMTIsIDgsIDQsIDApOworICBjb25zdCBfX20xMjhpIGtDc3RBbHBoYTEgPSBfbW1fc2V0X2VwaTgoLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIDgsIDQsIDAsIC0xLCAtMSwgLTEsIC0xKTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0QWxwaGEyID0gX21tX3NldF9lcGk4KC0xLCAtMSwgLTEsIC0xLCAxMiwgOCwgNCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMyA9IF9tbV9zZXRfZXBpOCgxMiwgOCwgNCwgMCwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpKiBzcmMgPSAoY29uc3QgX19tMTI4aSopYXJnYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7IGkgKz0gMTYpIHsKKyAgICAgIC8vIGxvYWQgNjQgYXJnYiBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMSk7CisgICAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDIpOworICAgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fc2h1ZmZsZV9lcGk4KGEwLCBrQ3N0QWxwaGEwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc2h1ZmZsZV9lcGk4KGExLCBrQ3N0QWxwaGExKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc2h1ZmZsZV9lcGk4KGEyLCBrQ3N0QWxwaGEyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc2h1ZmZsZV9lcGk4KGEzLCBrQ3N0QWxwaGEzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fb3Jfc2kxMjgoYjAsIGIxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fb3Jfc2kxMjgoYjIsIGIzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fb3Jfc2kxMjgoYzAsIGMxKTsKKyAgICAgIC8vIHN0b3JlCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYWxwaGFbaV0sIGQwKTsKKyAgICAgIC8vIGFjY3VtdWxhdGUgc2l4dGVlbiBhbHBoYSAnYW5kJyBpbiBwYXJhbGxlbAorICAgICAgYWxsX2FscGhhcyA9IF9tbV9hbmRfc2kxMjgoYWxsX2FscGhhcywgZDApOworICAgICAgc3JjICs9IDQ7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhcmdiWzQgKiBpXTsKKyAgICAgIGFscGhhW2ldID0gYWxwaGFfdmFsdWU7CisgICAgICBhbHBoYV9hbmQgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIC8vIENvbWJpbmUgdGhlIHNpeHRlZW4gYWxwaGEgJ2FuZCcgaW50byBhbiA4LWJpdCBtYXNrLgorICBhbHBoYV9hbmQgfD0gMHhmZjAwdTsgIC8vIHByZXRlbmQgdGhlIHVwcGVyIGJpdHMgWzguLjE1XSB3ZXJlIHRlc3RlZCBvay4KKyAgYWxwaGFfYW5kICY9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KGFsbF9hbHBoYXMsIGFsbF8weGZmKSk7CisgIHJldHVybiAoYWxwaGFfYW5kID09IDB4ZmZmZnUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEodm9pZCkgeworICBXZWJQRXh0cmFjdEFscGhhID0gRXh0cmFjdEFscGhhOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYXJnYi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJhNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2IuYwpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBBUkdCIG1ha2luZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE1ha2VBUkdCMzIoaW50IGEsIGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgcmV0dXJuICgoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiKTsKK30KKworc3RhdGljIHZvaWQgUGFja0FSR0IoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIG91dFtpXSA9IE1ha2VBUkdCMzIoYVs0ICogaV0sIHJbNCAqIGldLCBnWzQgKiBpXSwgYls0ICogaV0pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFBhY2tSR0IoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGksIG9mZnNldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIG91dFtpXSA9IE1ha2VBUkdCMzIoMHhmZiwgcltvZmZzZXRdLCBnW29mZnNldF0sIGJbb2Zmc2V0XSk7CisgICAgb2Zmc2V0ICs9IHN0ZXA7CisgIH0KK30KKwordm9pZCAoKlZQOFBhY2tBUkdCKShjb25zdCB1aW50OF90KiwgY29uc3QgdWludDhfdCosIGNvbnN0IHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiwgaW50LCB1aW50MzJfdCopOwordm9pZCAoKlZQOFBhY2tSR0IpKGNvbnN0IHVpbnQ4X3QqLCBjb25zdCB1aW50OF90KiwgY29uc3QgdWludDhfdCosCisgICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIHVpbnQzMl90Kik7CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEFSR0JJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQVJHQkluaXRTU0UyKHZvaWQpOworCitzdGF0aWMgdm9sYXRpbGUgVlA4Q1BVSW5mbyBhcmdiX2xhc3RfY3B1aW5mb191c2VkID0KKyAgICAoVlA4Q1BVSW5mbykmYXJnYl9sYXN0X2NwdWluZm9fdXNlZDsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEFSR0JJbml0KHZvaWQpIHsKKyAgaWYgKGFyZ2JfbGFzdF9jcHVpbmZvX3VzZWQgPT0gVlA4R2V0Q1BVSW5mbykgcmV0dXJuOworCisgIFZQOFBhY2tBUkdCID0gUGFja0FSR0I7CisgIFZQOFBhY2tSR0IgPSBQYWNrUkdCOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhFbmNEc3BBUkdCSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhFbmNEc3BBUkdCSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9CisgIGFyZ2JfbGFzdF9jcHVpbmZvX3VzZWQgPSBWUDhHZXRDUFVJbmZvOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2JfbWlwc19kc3BfcjIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hcmdiX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3NzcxMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9hcmdiX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIEFSR0IgbWFraW5nIGZ1bmN0aW9ucyAobWlwcyB2ZXJzaW9uKS4KKy8vCisvLyBBdXRob3I6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworc3RhdGljIHZvaWQgUGFja0FSR0IoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBvZmZzZXQ7CisgIGNvbnN0IGludCByZXN0ID0gbGVuICYgMTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGxvb3BfZW5kID0gb3V0ICsgbGVuIC0gcmVzdDsKKyAgY29uc3QgaW50IHN0ZXAgPSA0OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAieG9yICAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbb2Zmc2V0XSAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMGYgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDBdLCAgICAlW29mZnNldF0oJVthXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMV0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAyXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDNdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICVbb3V0XSwgICAgICAlW291dF0sICAgIDQgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgJVt0ZW1wM10gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtvdXRdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbc3RlcF0gICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMmIgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbcmVzdF0sICAgICAkemVybywgICAgIDFmICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW2FdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbcl0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtnXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wM10sICAgICVbb2Zmc2V0XSglW2JdKSAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgJVt0ZW1wM10gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW291dF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtvZmZzZXRdIj0mciIob2Zmc2V0KSwgW291dF0iKyZyIihvdXQpCisgICAgOiBbYV0iciIoYSksIFtyXSJyIihyKSwgW2ddInIiKGcpLCBbYl0iciIoYiksIFtzdGVwXSJyIihzdGVwKSwKKyAgICAgIFtsb29wX2VuZF0iciIobG9vcF9lbmQpLCBbcmVzdF0iciIocmVzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFBhY2tSR0IoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIG9mZnNldDsKKyAgY29uc3QgaW50IHJlc3QgPSBsZW4gJiAxOworICBjb25zdCBpbnQgYSA9IDB4ZmY7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBsb29wX2VuZCA9IG91dCArIGxlbiAtIHJlc3Q7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ4b3IgICAgICAgICAgJVtvZmZzZXRdLCAgICVbb2Zmc2V0XSwgJVtvZmZzZXRdICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAlW2xvb3BfZW5kXSwgJVtvdXRdLCAgICAwZiAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMF0sICAgICVbYV0sICAgICAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICVbb3V0XSwgICAgICAlW291dF0sICAgIDQgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgLTQoJVtvdXRdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbb2Zmc2V0XSwgICAlW29mZnNldF0sICVbc3RlcF0gICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgJVtsb29wX2VuZF0sICVbb3V0XSwgICAgMmIgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbcmVzdF0sICAgICAkemVybywgICAgIDFmICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMF0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAxXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDJdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMF0sICAgICVbYV0sICAgICAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICVbdGVtcDJdICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtvdXRdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbb2Zmc2V0XSI9JnIiKG9mZnNldCksIFtvdXRdIismciIob3V0KQorICAgIDogW2FdInIiKGEpLCBbcl0iciIociksIFtnXSJyIihnKSwgW2JdInIiKGIpLCBbc3RlcF0iciIoc3RlcCksCisgICAgICBbbG9vcF9lbmRdInIiKGxvb3BfZW5kKSwgW3Jlc3RdInIiKHJlc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQVJHQkluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BBUkdCSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOFBhY2tBUkdCID0gUGFja0FSR0I7CisgIFZQOFBhY2tSR0IgPSBQYWNrUkdCOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BBUkdCSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2Jfc3NlMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2FyZ2Jfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjM0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvYXJnYl9zc2UyLmMKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgQVJHQiBtYWtpbmcgZnVuY3Rpb25zIChTU0UyIHZlcnNpb24pLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTWFrZUFSR0IzMihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICByZXR1cm4gKCgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorCitzdGF0aWMgdm9pZCBQYWNrQVJHQihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYiwgaW50IGxlbiwgdWludDMyX3QqIG91dCkgeworICBpZiAoZyA9PSByICsgMSkgeyAgLy8gUkdCQSBpbnB1dCBvcmRlci4gTmVlZCB0byBzd2FwIFIgYW5kIEIuCisgICAgaW50IGkgPSAwOworICAgIGNvbnN0IGludCBsZW5fbWF4ID0gbGVuICYgfjM7ICAvLyBtYXggbGVuZ3RoIHByb2Nlc3NlZCBpbiBtYWluIGxvb3AKKyAgICBjb25zdCBfX20xMjhpIHJlZF9ibHVlX21hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMGZmdSk7CisgICAgYXNzZXJ0KGIgPT0gciArIDIpOworICAgIGFzc2VydChhID09IHIgKyAzKTsKKyAgICBmb3IgKDsgaSA8IGxlbl9tYXg7IGkgKz0gNCkgeworICAgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikociArIDQgKiBpKSk7CisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fYW5kX3NpMTI4KEEsIHJlZF9ibHVlX21hc2spOyAgICAgLy8gUiAwIEIgMAorICAgICAgY29uc3QgX19tMTI4aSBDID0gX21tX2FuZG5vdF9zaTEyOChyZWRfYmx1ZV9tYXNrLCBBKTsgIC8vIDAgRyAwIEEKKyAgICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgICAgY29uc3QgX19tMTI4aSBFID0gX21tX3NodWZmbGVoaV9lcGkxNihELCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgICAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fb3Jfc2kxMjgoRSwgQyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikob3V0ICsgaSksIEYpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgICBvdXRbaV0gPSBNYWtlQVJHQjMyKGFbNCAqIGldLCByWzQgKiBpXSwgZ1s0ICogaV0sIGJbNCAqIGldKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgYXNzZXJ0KGcgPT0gYiArIDEpOworICAgIGFzc2VydChyID09IGIgKyAyKTsKKyAgICBhc3NlcnQoYSA9PSBiICsgMyk7CisgICAgbWVtY3B5KG91dCwgYiwgbGVuICogNCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEFSR0JJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEFSR0JJbml0U1NFMih2b2lkKSB7CisgIFZQOFBhY2tBUkdCID0gUGFja0FSR0I7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwQVJHQkluaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb21tb25fc3NlMi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2NvbW1vbl9zc2UyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVkMjQxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb21tb25fc3NlMi5oCkBAIC0wLDAgKzEsMTA5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiBjb2RlIGNvbW1vbiB0byBzZXZlcmFsIGZpbGVzLgorLy8KKy8vIEF1dGhvcjogVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX0RTUF9DT01NT05fU1NFMl9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX0RTUF9DT01NT05fU1NFMl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1aXRlIHVzZWZ1bCBtYWNybyBmb3IgZGVidWdnaW5nLiBMZWZ0IGhlcmUgZm9yIGNvbnZlbmllbmNlLgorCisjaWYgMAorI2luY2x1ZGUgPHN0ZGlvLmg+CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmludFJlZyhjb25zdCBfX20xMjhpIHIsIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpbnQgbjsKKyAgdW5pb24geworICAgIF9fbTEyOGkgcjsKKyAgICB1aW50OF90IGk4WzE2XTsKKyAgICB1aW50MTZfdCBpMTZbOF07CisgICAgdWludDMyX3QgaTMyWzRdOworICAgIHVpbnQ2NF90IGk2NFsyXTsKKyAgfSB0bXA7CisgIHRtcC5yID0gcjsKKyAgZnByaW50ZihzdGRlcnIsICIlc1x0OiAiLCBuYW1lKTsKKyAgaWYgKHNpemUgPT0gOCkgeworICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuMnggIiwgdG1wLmk4W25dKTsKKyAgfSBlbHNlIGlmIChzaXplID09IDE2KSB7CisgICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjR4ICIsIHRtcC5pMTZbbl0pOworICB9IGVsc2UgaWYgKHNpemUgPT0gMzIpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgNDsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuOHggIiwgdG1wLmkzMltuXSk7CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IDI7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjE2bHggIiwgdG1wLmk2NFtuXSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYXRoIGZ1bmN0aW9ucy4KKworLy8gUmV0dXJuIHRoZSBzdW0gb2YgYWxsIHRoZSA4YiBpbiB0aGUgcmVnaXN0ZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEhvcml6b250YWxBZGQ4Yihjb25zdCBfX20xMjhpKiBjb25zdCBhKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgc2FkOHgyID0gX21tX3NhZF9lcHU4KCphLCB6ZXJvKTsKKyAgLy8gc3VtIHRoZSB0d28gc2Fkczogc2FkOHgyWzA6MV0gKyBzYWQ4eDJbODo5XQorICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMzIoc2FkOHgyLCBfbW1fc2h1ZmZsZV9lcGkzMihzYWQ4eDIsIDIpKTsKKyAgcmV0dXJuIF9tbV9jdnRzaTEyOF9zaTMyKHN1bSk7Cit9CisKKy8vIFRyYW5zcG9zZSB0d28gNHg0IDE2YiBtYXRyaWNlcyBob3Jpem9udGFsbHkgc3RvcmVkIGluIHJlZ2lzdGVycy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoCisgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4wLCBjb25zdCBfX20xMjhpKiBjb25zdCBpbjEsCisgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4yLCBjb25zdCBfX20xMjhpKiBjb25zdCBpbjMsIF9fbTEyOGkqIGNvbnN0IG91dDAsCisgICAgX19tMTI4aSogY29uc3Qgb3V0MSwgX19tMTI4aSogY29uc3Qgb3V0MiwgX19tMTI4aSogY29uc3Qgb3V0MykgeworICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNigqaW4wLCAqaW4xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoKmluMiwgKmluMyk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KCppbjAsICppbjEpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNigqaW4yLCAqaW4zKTsKKyAgLy8gYTAwIGExMCBhMDEgYTExICAgYTAyIGExMiBhMDMgYTEzCisgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMworICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKKyAgLy8gYjIwIGIzMCBiMjEgYjMxICAgYjIyIGIzMiBiMjMgYjMzCisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMiA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKKyAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQorICAvLyBiMDAgYjEwIGIyMCBiMzAgYjAxIGIxMSBiMjEgYjMxCisgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKKyAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMworICAqb3V0MCA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7CisgICpvdXQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKKyAgKm91dDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOworICAqb3V0MyA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7CisgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKKyAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCisgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworfQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBDSFJPTUlVTV9XRUJQX0RTUF9DT01NT05fU1NFMl9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3QuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlZTc5MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb3N0LmMKQEAgLTAsMCArMSw0MTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvY29zdC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQm9vbGVhbi1jb3N0IGNvc3QgdGFibGUKKworY29uc3QgdWludDE2X3QgVlA4RW50cm9weUNvc3RbMjU2XSA9IHsKKyAgMTc5MiwgMTc5MiwgMTc5MiwgMTUzNiwgMTUzNiwgMTQwOCwgMTM2NiwgMTI4MCwgMTI4MCwgMTIxNiwKKyAgMTE3OCwgMTE1MiwgMTExMCwgMTA3NiwgMTA2MSwgMTAyNCwgMTAyNCwgIDk5MiwgIDk2OCwgIDk1MSwKKyAgIDkzOSwgIDkxMSwgIDg5NiwgIDg3OCwgIDg3MSwgIDg1NCwgIDgzOCwgIDgyMCwgIDgxMSwgIDc5NCwKKyAgIDc4NiwgIDc2OCwgIDc2OCwgIDc1MiwgIDc0MCwgIDczMiwgIDcyMCwgIDcwOSwgIDcwNCwgIDY5MCwKKyAgIDY4MywgIDY3MiwgIDY2NiwgIDY1NSwgIDY0NywgIDY0MCwgIDYzMSwgIDYyMiwgIDYxNSwgIDYwNywKKyAgIDU5OCwgIDU5MiwgIDU4NiwgIDU3NiwgIDU3MiwgIDU2NCwgIDU1OSwgIDU1NSwgIDU0NywgIDU0MSwKKyAgIDUzNCwgIDUyOCwgIDUyMiwgIDUxMiwgIDUxMiwgIDUwNCwgIDUwMCwgIDQ5NCwgIDQ4OCwgIDQ4MywKKyAgIDQ3NywgIDQ3MywgIDQ2NywgIDQ2MSwgIDQ1OCwgIDQ1MiwgIDQ0OCwgIDQ0MywgIDQzOCwgIDQzNCwKKyAgIDQyNywgIDQyNCwgIDQxOSwgIDQxNSwgIDQxMCwgIDQwNiwgIDQwMywgIDM5OSwgIDM5NCwgIDM5MCwKKyAgIDM4NCwgIDM4NCwgIDM3NywgIDM3NCwgIDM3MCwgIDM2NiwgIDM2MiwgIDM1OSwgIDM1NSwgIDM1MSwKKyAgIDM0NywgIDM0MiwgIDM0MiwgIDMzNiwgIDMzMywgIDMzMCwgIDMyNiwgIDMyMywgIDMyMCwgIDMxNiwKKyAgIDMxMiwgIDMwOCwgIDMwNSwgIDMwMiwgIDI5OSwgIDI5NiwgIDI5MywgIDI4OCwgIDI4NywgIDI4MywKKyAgIDI4MCwgIDI3NywgIDI3NCwgIDI3MiwgIDI2OCwgIDI2NiwgIDI2MiwgIDI1NiwgIDI1NiwgIDI1NiwKKyAgIDI1MSwgIDI0OCwgIDI0NSwgIDI0MiwgIDI0MCwgIDIzNywgIDIzNCwgIDIzMiwgIDIyOCwgIDIyNiwKKyAgIDIyMywgIDIyMSwgIDIxOCwgIDIxNiwgIDIxNCwgIDIxMSwgIDIwOCwgIDIwNSwgIDIwMywgIDIwMSwKKyAgIDE5OCwgIDE5NiwgIDE5MiwgIDE5MSwgIDE4OCwgIDE4NywgIDE4MywgIDE4MSwgIDE3OSwgIDE3NiwKKyAgIDE3NSwgIDE3MSwgIDE3MSwgIDE2OCwgIDE2NSwgIDE2MywgIDE2MCwgIDE1OSwgIDE1NiwgIDE1NCwKKyAgIDE1MiwgIDE1MCwgIDE0OCwgIDE0NiwgIDE0NCwgIDE0MiwgIDEzOSwgIDEzOCwgIDEzNSwgIDEzMywKKyAgIDEzMSwgIDEyOCwgIDEyOCwgIDEyNSwgIDEyMywgIDEyMSwgIDExOSwgIDExNywgIDExNSwgIDExMywKKyAgIDExMSwgIDExMCwgIDEwNywgIDEwNSwgIDEwMywgIDEwMiwgIDEwMCwgICA5OCwgICA5NiwgICA5NCwKKyAgICA5MiwgICA5MSwgICA4OSwgICA4NiwgICA4NiwgICA4MywgICA4MiwgICA4MCwgICA3NywgICA3NiwKKyAgICA3NCwgICA3MywgICA3MSwgICA2OSwgICA2NywgICA2NiwgICA2NCwgICA2MywgICA2MSwgICA1OSwKKyAgICA1NywgICA1NSwgICA1NCwgICA1MiwgICA1MSwgICA0OSwgICA0NywgICA0NiwgICA0NCwgICA0MywKKyAgICA0MSwgICA0MCwgICAzOCwgICAzNiwgICAzNSwgICAzMywgICAzMiwgICAzMCwgICAyOSwgICAyNywKKyAgICAyNSwgICAyNCwgICAyMiwgICAyMSwgICAxOSwgICAxOCwgICAxNiwgICAxNSwgICAxMywgICAxMiwKKyAgICAxMCwgICAgOSwgICAgNywgICAgNiwgICAgNCwgICAgMworfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExldmVsIGNvc3QgdGFibGVzCisKKy8vIGZpeGVkIGNvc3RzIGZvciBjb2RpbmcgbGV2ZWxzLCBkZWR1Y2UgZnJvbSB0aGUgY29kaW5nIHRyZWUuCisvLyBUaGlzIGlzIG9ubHkgdGhlIHBhcnQgdGhhdCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgcHJvYmFiaWxpdHkgc3RhdGUuCitjb25zdCB1aW50MTZfdCBWUDhMZXZlbEZpeGVkQ29zdHNbTUFYX0xFVkVMICsgMV0gPSB7CisgICAgIDAsICAyNTYsICAyNTYsICAyNTYsICAyNTYsICA0MzIsICA2MTgsICA2MzAsCisgICA3MzEsICA2NDAsICA2NDAsICA4MjgsICA5MDEsICA5NDgsIDEwMjEsIDExMDEsCisgIDExNzQsIDEyMjEsIDEyOTQsIDEwNDIsIDEwODUsIDExMTUsIDExNTgsIDEyMDIsCisgIDEyNDUsIDEyNzUsIDEzMTgsIDEzMzcsIDEzODAsIDE0MTAsIDE0NTMsIDE0OTcsCisgIDE1NDAsIDE1NzAsIDE2MTMsIDEyODAsIDEyOTUsIDEzMTcsIDEzMzIsIDEzNTgsCisgIDEzNzMsIDEzOTUsIDE0MTAsIDE0NTQsIDE0NjksIDE0OTEsIDE1MDYsIDE1MzIsCisgIDE1NDcsIDE1NjksIDE1ODQsIDE2MDEsIDE2MTYsIDE2MzgsIDE2NTMsIDE2NzksCisgIDE2OTQsIDE3MTYsIDE3MzEsIDE3NzUsIDE3OTAsIDE4MTIsIDE4MjcsIDE4NTMsCisgIDE4NjgsIDE4OTAsIDE5MDUsIDE3MjcsIDE3MzMsIDE3NDIsIDE3NDgsIDE3NTksCisgIDE3NjUsIDE3NzQsIDE3ODAsIDE4MDAsIDE4MDYsIDE4MTUsIDE4MjEsIDE4MzIsCisgIDE4MzgsIDE4NDcsIDE4NTMsIDE4NzgsIDE4ODQsIDE4OTMsIDE4OTksIDE5MTAsCisgIDE5MTYsIDE5MjUsIDE5MzEsIDE5NTEsIDE5NTcsIDE5NjYsIDE5NzIsIDE5ODMsCisgIDE5ODksIDE5OTgsIDIwMDQsIDIwMjcsIDIwMzMsIDIwNDIsIDIwNDgsIDIwNTksCisgIDIwNjUsIDIwNzQsIDIwODAsIDIxMDAsIDIxMDYsIDIxMTUsIDIxMjEsIDIxMzIsCisgIDIxMzgsIDIxNDcsIDIxNTMsIDIxNzgsIDIxODQsIDIxOTMsIDIxOTksIDIyMTAsCisgIDIyMTYsIDIyMjUsIDIyMzEsIDIyNTEsIDIyNTcsIDIyNjYsIDIyNzIsIDIyODMsCisgIDIyODksIDIyOTgsIDIzMDQsIDIxNjgsIDIxNzQsIDIxODMsIDIxODksIDIyMDAsCisgIDIyMDYsIDIyMTUsIDIyMjEsIDIyNDEsIDIyNDcsIDIyNTYsIDIyNjIsIDIyNzMsCisgIDIyNzksIDIyODgsIDIyOTQsIDIzMTksIDIzMjUsIDIzMzQsIDIzNDAsIDIzNTEsCisgIDIzNTcsIDIzNjYsIDIzNzIsIDIzOTIsIDIzOTgsIDI0MDcsIDI0MTMsIDI0MjQsCisgIDI0MzAsIDI0MzksIDI0NDUsIDI0NjgsIDI0NzQsIDI0ODMsIDI0ODksIDI1MDAsCisgIDI1MDYsIDI1MTUsIDI1MjEsIDI1NDEsIDI1NDcsIDI1NTYsIDI1NjIsIDI1NzMsCisgIDI1NzksIDI1ODgsIDI1OTQsIDI2MTksIDI2MjUsIDI2MzQsIDI2NDAsIDI2NTEsCisgIDI2NTcsIDI2NjYsIDI2NzIsIDI2OTIsIDI2OTgsIDI3MDcsIDI3MTMsIDI3MjQsCisgIDI3MzAsIDI3MzksIDI3NDUsIDI1NDAsIDI1NDYsIDI1NTUsIDI1NjEsIDI1NzIsCisgIDI1NzgsIDI1ODcsIDI1OTMsIDI2MTMsIDI2MTksIDI2MjgsIDI2MzQsIDI2NDUsCisgIDI2NTEsIDI2NjAsIDI2NjYsIDI2OTEsIDI2OTcsIDI3MDYsIDI3MTIsIDI3MjMsCisgIDI3MjksIDI3MzgsIDI3NDQsIDI3NjQsIDI3NzAsIDI3NzksIDI3ODUsIDI3OTYsCisgIDI4MDIsIDI4MTEsIDI4MTcsIDI4NDAsIDI4NDYsIDI4NTUsIDI4NjEsIDI4NzIsCisgIDI4NzgsIDI4ODcsIDI4OTMsIDI5MTMsIDI5MTksIDI5MjgsIDI5MzQsIDI5NDUsCisgIDI5NTEsIDI5NjAsIDI5NjYsIDI5OTEsIDI5OTcsIDMwMDYsIDMwMTIsIDMwMjMsCisgIDMwMjksIDMwMzgsIDMwNDQsIDMwNjQsIDMwNzAsIDMwNzksIDMwODUsIDMwOTYsCisgIDMxMDIsIDMxMTEsIDMxMTcsIDI5ODEsIDI5ODcsIDI5OTYsIDMwMDIsIDMwMTMsCisgIDMwMTksIDMwMjgsIDMwMzQsIDMwNTQsIDMwNjAsIDMwNjksIDMwNzUsIDMwODYsCisgIDMwOTIsIDMxMDEsIDMxMDcsIDMxMzIsIDMxMzgsIDMxNDcsIDMxNTMsIDMxNjQsCisgIDMxNzAsIDMxNzksIDMxODUsIDMyMDUsIDMyMTEsIDMyMjAsIDMyMjYsIDMyMzcsCisgIDMyNDMsIDMyNTIsIDMyNTgsIDMyODEsIDMyODcsIDMyOTYsIDMzMDIsIDMzMTMsCisgIDMzMTksIDMzMjgsIDMzMzQsIDMzNTQsIDMzNjAsIDMzNjksIDMzNzUsIDMzODYsCisgIDMzOTIsIDM0MDEsIDM0MDcsIDM0MzIsIDM0MzgsIDM0NDcsIDM0NTMsIDM0NjQsCisgIDM0NzAsIDM0NzksIDM0ODUsIDM1MDUsIDM1MTEsIDM1MjAsIDM1MjYsIDM1MzcsCisgIDM1NDMsIDM1NTIsIDM1NTgsIDI4MTYsIDI4MjIsIDI4MzEsIDI4MzcsIDI4NDgsCisgIDI4NTQsIDI4NjMsIDI4NjksIDI4ODksIDI4OTUsIDI5MDQsIDI5MTAsIDI5MjEsCisgIDI5MjcsIDI5MzYsIDI5NDIsIDI5NjcsIDI5NzMsIDI5ODIsIDI5ODgsIDI5OTksCisgIDMwMDUsIDMwMTQsIDMwMjAsIDMwNDAsIDMwNDYsIDMwNTUsIDMwNjEsIDMwNzIsCisgIDMwNzgsIDMwODcsIDMwOTMsIDMxMTYsIDMxMjIsIDMxMzEsIDMxMzcsIDMxNDgsCisgIDMxNTQsIDMxNjMsIDMxNjksIDMxODksIDMxOTUsIDMyMDQsIDMyMTAsIDMyMjEsCisgIDMyMjcsIDMyMzYsIDMyNDIsIDMyNjcsIDMyNzMsIDMyODIsIDMyODgsIDMyOTksCisgIDMzMDUsIDMzMTQsIDMzMjAsIDMzNDAsIDMzNDYsIDMzNTUsIDMzNjEsIDMzNzIsCisgIDMzNzgsIDMzODcsIDMzOTMsIDMyNTcsIDMyNjMsIDMyNzIsIDMyNzgsIDMyODksCisgIDMyOTUsIDMzMDQsIDMzMTAsIDMzMzAsIDMzMzYsIDMzNDUsIDMzNTEsIDMzNjIsCisgIDMzNjgsIDMzNzcsIDMzODMsIDM0MDgsIDM0MTQsIDM0MjMsIDM0MjksIDM0NDAsCisgIDM0NDYsIDM0NTUsIDM0NjEsIDM0ODEsIDM0ODcsIDM0OTYsIDM1MDIsIDM1MTMsCisgIDM1MTksIDM1MjgsIDM1MzQsIDM1NTcsIDM1NjMsIDM1NzIsIDM1NzgsIDM1ODksCisgIDM1OTUsIDM2MDQsIDM2MTAsIDM2MzAsIDM2MzYsIDM2NDUsIDM2NTEsIDM2NjIsCisgIDM2NjgsIDM2NzcsIDM2ODMsIDM3MDgsIDM3MTQsIDM3MjMsIDM3MjksIDM3NDAsCisgIDM3NDYsIDM3NTUsIDM3NjEsIDM3ODEsIDM3ODcsIDM3OTYsIDM4MDIsIDM4MTMsCisgIDM4MTksIDM4MjgsIDM4MzQsIDM2MjksIDM2MzUsIDM2NDQsIDM2NTAsIDM2NjEsCisgIDM2NjcsIDM2NzYsIDM2ODIsIDM3MDIsIDM3MDgsIDM3MTcsIDM3MjMsIDM3MzQsCisgIDM3NDAsIDM3NDksIDM3NTUsIDM3ODAsIDM3ODYsIDM3OTUsIDM4MDEsIDM4MTIsCisgIDM4MTgsIDM4MjcsIDM4MzMsIDM4NTMsIDM4NTksIDM4NjgsIDM4NzQsIDM4ODUsCisgIDM4OTEsIDM5MDAsIDM5MDYsIDM5MjksIDM5MzUsIDM5NDQsIDM5NTAsIDM5NjEsCisgIDM5NjcsIDM5NzYsIDM5ODIsIDQwMDIsIDQwMDgsIDQwMTcsIDQwMjMsIDQwMzQsCisgIDQwNDAsIDQwNDksIDQwNTUsIDQwODAsIDQwODYsIDQwOTUsIDQxMDEsIDQxMTIsCisgIDQxMTgsIDQxMjcsIDQxMzMsIDQxNTMsIDQxNTksIDQxNjgsIDQxNzQsIDQxODUsCisgIDQxOTEsIDQyMDAsIDQyMDYsIDQwNzAsIDQwNzYsIDQwODUsIDQwOTEsIDQxMDIsCisgIDQxMDgsIDQxMTcsIDQxMjMsIDQxNDMsIDQxNDksIDQxNTgsIDQxNjQsIDQxNzUsCisgIDQxODEsIDQxOTAsIDQxOTYsIDQyMjEsIDQyMjcsIDQyMzYsIDQyNDIsIDQyNTMsCisgIDQyNTksIDQyNjgsIDQyNzQsIDQyOTQsIDQzMDAsIDQzMDksIDQzMTUsIDQzMjYsCisgIDQzMzIsIDQzNDEsIDQzNDcsIDQzNzAsIDQzNzYsIDQzODUsIDQzOTEsIDQ0MDIsCisgIDQ0MDgsIDQ0MTcsIDQ0MjMsIDQ0NDMsIDQ0NDksIDQ0NTgsIDQ0NjQsIDQ0NzUsCisgIDQ0ODEsIDQ0OTAsIDQ0OTYsIDQ1MjEsIDQ1MjcsIDQ1MzYsIDQ1NDIsIDQ1NTMsCisgIDQ1NTksIDQ1NjgsIDQ1NzQsIDQ1OTQsIDQ2MDAsIDQ2MDksIDQ2MTUsIDQ2MjYsCisgIDQ2MzIsIDQ2NDEsIDQ2NDcsIDM1MTUsIDM1MjEsIDM1MzAsIDM1MzYsIDM1NDcsCisgIDM1NTMsIDM1NjIsIDM1NjgsIDM1ODgsIDM1OTQsIDM2MDMsIDM2MDksIDM2MjAsCisgIDM2MjYsIDM2MzUsIDM2NDEsIDM2NjYsIDM2NzIsIDM2ODEsIDM2ODcsIDM2OTgsCisgIDM3MDQsIDM3MTMsIDM3MTksIDM3MzksIDM3NDUsIDM3NTQsIDM3NjAsIDM3NzEsCisgIDM3NzcsIDM3ODYsIDM3OTIsIDM4MTUsIDM4MjEsIDM4MzAsIDM4MzYsIDM4NDcsCisgIDM4NTMsIDM4NjIsIDM4NjgsIDM4ODgsIDM4OTQsIDM5MDMsIDM5MDksIDM5MjAsCisgIDM5MjYsIDM5MzUsIDM5NDEsIDM5NjYsIDM5NzIsIDM5ODEsIDM5ODcsIDM5OTgsCisgIDQwMDQsIDQwMTMsIDQwMTksIDQwMzksIDQwNDUsIDQwNTQsIDQwNjAsIDQwNzEsCisgIDQwNzcsIDQwODYsIDQwOTIsIDM5NTYsIDM5NjIsIDM5NzEsIDM5NzcsIDM5ODgsCisgIDM5OTQsIDQwMDMsIDQwMDksIDQwMjksIDQwMzUsIDQwNDQsIDQwNTAsIDQwNjEsCisgIDQwNjcsIDQwNzYsIDQwODIsIDQxMDcsIDQxMTMsIDQxMjIsIDQxMjgsIDQxMzksCisgIDQxNDUsIDQxNTQsIDQxNjAsIDQxODAsIDQxODYsIDQxOTUsIDQyMDEsIDQyMTIsCisgIDQyMTgsIDQyMjcsIDQyMzMsIDQyNTYsIDQyNjIsIDQyNzEsIDQyNzcsIDQyODgsCisgIDQyOTQsIDQzMDMsIDQzMDksIDQzMjksIDQzMzUsIDQzNDQsIDQzNTAsIDQzNjEsCisgIDQzNjcsIDQzNzYsIDQzODIsIDQ0MDcsIDQ0MTMsIDQ0MjIsIDQ0MjgsIDQ0MzksCisgIDQ0NDUsIDQ0NTQsIDQ0NjAsIDQ0ODAsIDQ0ODYsIDQ0OTUsIDQ1MDEsIDQ1MTIsCisgIDQ1MTgsIDQ1MjcsIDQ1MzMsIDQzMjgsIDQzMzQsIDQzNDMsIDQzNDksIDQzNjAsCisgIDQzNjYsIDQzNzUsIDQzODEsIDQ0MDEsIDQ0MDcsIDQ0MTYsIDQ0MjIsIDQ0MzMsCisgIDQ0MzksIDQ0NDgsIDQ0NTQsIDQ0NzksIDQ0ODUsIDQ0OTQsIDQ1MDAsIDQ1MTEsCisgIDQ1MTcsIDQ1MjYsIDQ1MzIsIDQ1NTIsIDQ1NTgsIDQ1NjcsIDQ1NzMsIDQ1ODQsCisgIDQ1OTAsIDQ1OTksIDQ2MDUsIDQ2MjgsIDQ2MzQsIDQ2NDMsIDQ2NDksIDQ2NjAsCisgIDQ2NjYsIDQ2NzUsIDQ2ODEsIDQ3MDEsIDQ3MDcsIDQ3MTYsIDQ3MjIsIDQ3MzMsCisgIDQ3MzksIDQ3NDgsIDQ3NTQsIDQ3NzksIDQ3ODUsIDQ3OTQsIDQ4MDAsIDQ4MTEsCisgIDQ4MTcsIDQ4MjYsIDQ4MzIsIDQ4NTIsIDQ4NTgsIDQ4NjcsIDQ4NzMsIDQ4ODQsCisgIDQ4OTAsIDQ4OTksIDQ5MDUsIDQ3NjksIDQ3NzUsIDQ3ODQsIDQ3OTAsIDQ4MDEsCisgIDQ4MDcsIDQ4MTYsIDQ4MjIsIDQ4NDIsIDQ4NDgsIDQ4NTcsIDQ4NjMsIDQ4NzQsCisgIDQ4ODAsIDQ4ODksIDQ4OTUsIDQ5MjAsIDQ5MjYsIDQ5MzUsIDQ5NDEsIDQ5NTIsCisgIDQ5NTgsIDQ5NjcsIDQ5NzMsIDQ5OTMsIDQ5OTksIDUwMDgsIDUwMTQsIDUwMjUsCisgIDUwMzEsIDUwNDAsIDUwNDYsIDUwNjksIDUwNzUsIDUwODQsIDUwOTAsIDUxMDEsCisgIDUxMDcsIDUxMTYsIDUxMjIsIDUxNDIsIDUxNDgsIDUxNTcsIDUxNjMsIDUxNzQsCisgIDUxODAsIDUxODksIDUxOTUsIDUyMjAsIDUyMjYsIDUyMzUsIDUyNDEsIDUyNTIsCisgIDUyNTgsIDUyNjcsIDUyNzMsIDUyOTMsIDUyOTksIDUzMDgsIDUzMTQsIDUzMjUsCisgIDUzMzEsIDUzNDAsIDUzNDYsIDQ2MDQsIDQ2MTAsIDQ2MTksIDQ2MjUsIDQ2MzYsCisgIDQ2NDIsIDQ2NTEsIDQ2NTcsIDQ2NzcsIDQ2ODMsIDQ2OTIsIDQ2OTgsIDQ3MDksCisgIDQ3MTUsIDQ3MjQsIDQ3MzAsIDQ3NTUsIDQ3NjEsIDQ3NzAsIDQ3NzYsIDQ3ODcsCisgIDQ3OTMsIDQ4MDIsIDQ4MDgsIDQ4MjgsIDQ4MzQsIDQ4NDMsIDQ4NDksIDQ4NjAsCisgIDQ4NjYsIDQ4NzUsIDQ4ODEsIDQ5MDQsIDQ5MTAsIDQ5MTksIDQ5MjUsIDQ5MzYsCisgIDQ5NDIsIDQ5NTEsIDQ5NTcsIDQ5NzcsIDQ5ODMsIDQ5OTIsIDQ5OTgsIDUwMDksCisgIDUwMTUsIDUwMjQsIDUwMzAsIDUwNTUsIDUwNjEsIDUwNzAsIDUwNzYsIDUwODcsCisgIDUwOTMsIDUxMDIsIDUxMDgsIDUxMjgsIDUxMzQsIDUxNDMsIDUxNDksIDUxNjAsCisgIDUxNjYsIDUxNzUsIDUxODEsIDUwNDUsIDUwNTEsIDUwNjAsIDUwNjYsIDUwNzcsCisgIDUwODMsIDUwOTIsIDUwOTgsIDUxMTgsIDUxMjQsIDUxMzMsIDUxMzksIDUxNTAsCisgIDUxNTYsIDUxNjUsIDUxNzEsIDUxOTYsIDUyMDIsIDUyMTEsIDUyMTcsIDUyMjgsCisgIDUyMzQsIDUyNDMsIDUyNDksIDUyNjksIDUyNzUsIDUyODQsIDUyOTAsIDUzMDEsCisgIDUzMDcsIDUzMTYsIDUzMjIsIDUzNDUsIDUzNTEsIDUzNjAsIDUzNjYsIDUzNzcsCisgIDUzODMsIDUzOTIsIDUzOTgsIDU0MTgsIDU0MjQsIDU0MzMsIDU0MzksIDU0NTAsCisgIDU0NTYsIDU0NjUsIDU0NzEsIDU0OTYsIDU1MDIsIDU1MTEsIDU1MTcsIDU1MjgsCisgIDU1MzQsIDU1NDMsIDU1NDksIDU1NjksIDU1NzUsIDU1ODQsIDU1OTAsIDU2MDEsCisgIDU2MDcsIDU2MTYsIDU2MjIsIDU0MTcsIDU0MjMsIDU0MzIsIDU0MzgsIDU0NDksCisgIDU0NTUsIDU0NjQsIDU0NzAsIDU0OTAsIDU0OTYsIDU1MDUsIDU1MTEsIDU1MjIsCisgIDU1MjgsIDU1MzcsIDU1NDMsIDU1NjgsIDU1NzQsIDU1ODMsIDU1ODksIDU2MDAsCisgIDU2MDYsIDU2MTUsIDU2MjEsIDU2NDEsIDU2NDcsIDU2NTYsIDU2NjIsIDU2NzMsCisgIDU2NzksIDU2ODgsIDU2OTQsIDU3MTcsIDU3MjMsIDU3MzIsIDU3MzgsIDU3NDksCisgIDU3NTUsIDU3NjQsIDU3NzAsIDU3OTAsIDU3OTYsIDU4MDUsIDU4MTEsIDU4MjIsCisgIDU4MjgsIDU4MzcsIDU4NDMsIDU4NjgsIDU4NzQsIDU4ODMsIDU4ODksIDU5MDAsCisgIDU5MDYsIDU5MTUsIDU5MjEsIDU5NDEsIDU5NDcsIDU5NTYsIDU5NjIsIDU5NzMsCisgIDU5NzksIDU5ODgsIDU5OTQsIDU4NTgsIDU4NjQsIDU4NzMsIDU4NzksIDU4OTAsCisgIDU4OTYsIDU5MDUsIDU5MTEsIDU5MzEsIDU5MzcsIDU5NDYsIDU5NTIsIDU5NjMsCisgIDU5NjksIDU5NzgsIDU5ODQsIDYwMDksIDYwMTUsIDYwMjQsIDYwMzAsIDYwNDEsCisgIDYwNDcsIDYwNTYsIDYwNjIsIDYwODIsIDYwODgsIDYwOTcsIDYxMDMsIDYxMTQsCisgIDYxMjAsIDYxMjksIDYxMzUsIDYxNTgsIDYxNjQsIDYxNzMsIDYxNzksIDYxOTAsCisgIDYxOTYsIDYyMDUsIDYyMTEsIDYyMzEsIDYyMzcsIDYyNDYsIDYyNTIsIDYyNjMsCisgIDYyNjksIDYyNzgsIDYyODQsIDYzMDksIDYzMTUsIDYzMjQsIDYzMzAsIDYzNDEsCisgIDYzNDcsIDYzNTYsIDYzNjIsIDYzODIsIDYzODgsIDYzOTcsIDY0MDMsIDY0MTQsCisgIDY0MjAsIDY0MjksIDY0MzUsIDM1MTUsIDM1MjEsIDM1MzAsIDM1MzYsIDM1NDcsCisgIDM1NTMsIDM1NjIsIDM1NjgsIDM1ODgsIDM1OTQsIDM2MDMsIDM2MDksIDM2MjAsCisgIDM2MjYsIDM2MzUsIDM2NDEsIDM2NjYsIDM2NzIsIDM2ODEsIDM2ODcsIDM2OTgsCisgIDM3MDQsIDM3MTMsIDM3MTksIDM3MzksIDM3NDUsIDM3NTQsIDM3NjAsIDM3NzEsCisgIDM3NzcsIDM3ODYsIDM3OTIsIDM4MTUsIDM4MjEsIDM4MzAsIDM4MzYsIDM4NDcsCisgIDM4NTMsIDM4NjIsIDM4NjgsIDM4ODgsIDM4OTQsIDM5MDMsIDM5MDksIDM5MjAsCisgIDM5MjYsIDM5MzUsIDM5NDEsIDM5NjYsIDM5NzIsIDM5ODEsIDM5ODcsIDM5OTgsCisgIDQwMDQsIDQwMTMsIDQwMTksIDQwMzksIDQwNDUsIDQwNTQsIDQwNjAsIDQwNzEsCisgIDQwNzcsIDQwODYsIDQwOTIsIDM5NTYsIDM5NjIsIDM5NzEsIDM5NzcsIDM5ODgsCisgIDM5OTQsIDQwMDMsIDQwMDksIDQwMjksIDQwMzUsIDQwNDQsIDQwNTAsIDQwNjEsCisgIDQwNjcsIDQwNzYsIDQwODIsIDQxMDcsIDQxMTMsIDQxMjIsIDQxMjgsIDQxMzksCisgIDQxNDUsIDQxNTQsIDQxNjAsIDQxODAsIDQxODYsIDQxOTUsIDQyMDEsIDQyMTIsCisgIDQyMTgsIDQyMjcsIDQyMzMsIDQyNTYsIDQyNjIsIDQyNzEsIDQyNzcsIDQyODgsCisgIDQyOTQsIDQzMDMsIDQzMDksIDQzMjksIDQzMzUsIDQzNDQsIDQzNTAsIDQzNjEsCisgIDQzNjcsIDQzNzYsIDQzODIsIDQ0MDcsIDQ0MTMsIDQ0MjIsIDQ0MjgsIDQ0MzksCisgIDQ0NDUsIDQ0NTQsIDQ0NjAsIDQ0ODAsIDQ0ODYsIDQ0OTUsIDQ1MDEsIDQ1MTIsCisgIDQ1MTgsIDQ1MjcsIDQ1MzMsIDQzMjgsIDQzMzQsIDQzNDMsIDQzNDksIDQzNjAsCisgIDQzNjYsIDQzNzUsIDQzODEsIDQ0MDEsIDQ0MDcsIDQ0MTYsIDQ0MjIsIDQ0MzMsCisgIDQ0MzksIDQ0NDgsIDQ0NTQsIDQ0NzksIDQ0ODUsIDQ0OTQsIDQ1MDAsIDQ1MTEsCisgIDQ1MTcsIDQ1MjYsIDQ1MzIsIDQ1NTIsIDQ1NTgsIDQ1NjcsIDQ1NzMsIDQ1ODQsCisgIDQ1OTAsIDQ1OTksIDQ2MDUsIDQ2MjgsIDQ2MzQsIDQ2NDMsIDQ2NDksIDQ2NjAsCisgIDQ2NjYsIDQ2NzUsIDQ2ODEsIDQ3MDEsIDQ3MDcsIDQ3MTYsIDQ3MjIsIDQ3MzMsCisgIDQ3MzksIDQ3NDgsIDQ3NTQsIDQ3NzksIDQ3ODUsIDQ3OTQsIDQ4MDAsIDQ4MTEsCisgIDQ4MTcsIDQ4MjYsIDQ4MzIsIDQ4NTIsIDQ4NTgsIDQ4NjcsIDQ4NzMsIDQ4ODQsCisgIDQ4OTAsIDQ4OTksIDQ5MDUsIDQ3NjksIDQ3NzUsIDQ3ODQsIDQ3OTAsIDQ4MDEsCisgIDQ4MDcsIDQ4MTYsIDQ4MjIsIDQ4NDIsIDQ4NDgsIDQ4NTcsIDQ4NjMsIDQ4NzQsCisgIDQ4ODAsIDQ4ODksIDQ4OTUsIDQ5MjAsIDQ5MjYsIDQ5MzUsIDQ5NDEsIDQ5NTIsCisgIDQ5NTgsIDQ5NjcsIDQ5NzMsIDQ5OTMsIDQ5OTksIDUwMDgsIDUwMTQsIDUwMjUsCisgIDUwMzEsIDUwNDAsIDUwNDYsIDUwNjksIDUwNzUsIDUwODQsIDUwOTAsIDUxMDEsCisgIDUxMDcsIDUxMTYsIDUxMjIsIDUxNDIsIDUxNDgsIDUxNTcsIDUxNjMsIDUxNzQsCisgIDUxODAsIDUxODksIDUxOTUsIDUyMjAsIDUyMjYsIDUyMzUsIDUyNDEsIDUyNTIsCisgIDUyNTgsIDUyNjcsIDUyNzMsIDUyOTMsIDUyOTksIDUzMDgsIDUzMTQsIDUzMjUsCisgIDUzMzEsIDUzNDAsIDUzNDYsIDQ2MDQsIDQ2MTAsIDQ2MTksIDQ2MjUsIDQ2MzYsCisgIDQ2NDIsIDQ2NTEsIDQ2NTcsIDQ2NzcsIDQ2ODMsIDQ2OTIsIDQ2OTgsIDQ3MDksCisgIDQ3MTUsIDQ3MjQsIDQ3MzAsIDQ3NTUsIDQ3NjEsIDQ3NzAsIDQ3NzYsIDQ3ODcsCisgIDQ3OTMsIDQ4MDIsIDQ4MDgsIDQ4MjgsIDQ4MzQsIDQ4NDMsIDQ4NDksIDQ4NjAsCisgIDQ4NjYsIDQ4NzUsIDQ4ODEsIDQ5MDQsIDQ5MTAsIDQ5MTksIDQ5MjUsIDQ5MzYsCisgIDQ5NDIsIDQ5NTEsIDQ5NTcsIDQ5NzcsIDQ5ODMsIDQ5OTIsIDQ5OTgsIDUwMDksCisgIDUwMTUsIDUwMjQsIDUwMzAsIDUwNTUsIDUwNjEsIDUwNzAsIDUwNzYsIDUwODcsCisgIDUwOTMsIDUxMDIsIDUxMDgsIDUxMjgsIDUxMzQsIDUxNDMsIDUxNDksIDUxNjAsCisgIDUxNjYsIDUxNzUsIDUxODEsIDUwNDUsIDUwNTEsIDUwNjAsIDUwNjYsIDUwNzcsCisgIDUwODMsIDUwOTIsIDUwOTgsIDUxMTgsIDUxMjQsIDUxMzMsIDUxMzksIDUxNTAsCisgIDUxNTYsIDUxNjUsIDUxNzEsIDUxOTYsIDUyMDIsIDUyMTEsIDUyMTcsIDUyMjgsCisgIDUyMzQsIDUyNDMsIDUyNDksIDUyNjksIDUyNzUsIDUyODQsIDUyOTAsIDUzMDEsCisgIDUzMDcsIDUzMTYsIDUzMjIsIDUzNDUsIDUzNTEsIDUzNjAsIDUzNjYsIDUzNzcsCisgIDUzODMsIDUzOTIsIDUzOTgsIDU0MTgsIDU0MjQsIDU0MzMsIDU0MzksIDU0NTAsCisgIDU0NTYsIDU0NjUsIDU0NzEsIDU0OTYsIDU1MDIsIDU1MTEsIDU1MTcsIDU1MjgsCisgIDU1MzQsIDU1NDMsIDU1NDksIDU1NjksIDU1NzUsIDU1ODQsIDU1OTAsIDU2MDEsCisgIDU2MDcsIDU2MTYsIDU2MjIsIDU0MTcsIDU0MjMsIDU0MzIsIDU0MzgsIDU0NDksCisgIDU0NTUsIDU0NjQsIDU0NzAsIDU0OTAsIDU0OTYsIDU1MDUsIDU1MTEsIDU1MjIsCisgIDU1MjgsIDU1MzcsIDU1NDMsIDU1NjgsIDU1NzQsIDU1ODMsIDU1ODksIDU2MDAsCisgIDU2MDYsIDU2MTUsIDU2MjEsIDU2NDEsIDU2NDcsIDU2NTYsIDU2NjIsIDU2NzMsCisgIDU2NzksIDU2ODgsIDU2OTQsIDU3MTcsIDU3MjMsIDU3MzIsIDU3MzgsIDU3NDksCisgIDU3NTUsIDU3NjQsIDU3NzAsIDU3OTAsIDU3OTYsIDU4MDUsIDU4MTEsIDU4MjIsCisgIDU4MjgsIDU4MzcsIDU4NDMsIDU4NjgsIDU4NzQsIDU4ODMsIDU4ODksIDU5MDAsCisgIDU5MDYsIDU5MTUsIDU5MjEsIDU5NDEsIDU5NDcsIDU5NTYsIDU5NjIsIDU5NzMsCisgIDU5NzksIDU5ODgsIDU5OTQsIDU4NTgsIDU4NjQsIDU4NzMsIDU4NzksIDU4OTAsCisgIDU4OTYsIDU5MDUsIDU5MTEsIDU5MzEsIDU5MzcsIDU5NDYsIDU5NTIsIDU5NjMsCisgIDU5NjksIDU5NzgsIDU5ODQsIDYwMDksIDYwMTUsIDYwMjQsIDYwMzAsIDYwNDEsCisgIDYwNDcsIDYwNTYsIDYwNjIsIDYwODIsIDYwODgsIDYwOTcsIDYxMDMsIDYxMTQsCisgIDYxMjAsIDYxMjksIDYxMzUsIDYxNTgsIDYxNjQsIDYxNzMsIDYxNzksIDYxOTAsCisgIDYxOTYsIDYyMDUsIDYyMTEsIDYyMzEsIDYyMzcsIDYyNDYsIDYyNTIsIDYyNjMsCisgIDYyNjksIDYyNzgsIDYyODQsIDYzMDksIDYzMTUsIDYzMjQsIDYzMzAsIDYzNDEsCisgIDYzNDcsIDYzNTYsIDYzNjIsIDYzODIsIDYzODgsIDYzOTcsIDY0MDMsIDY0MTQsCisgIDY0MjAsIDY0MjksIDY0MzUsIDUzMDMsIDUzMDksIDUzMTgsIDUzMjQsIDUzMzUsCisgIDUzNDEsIDUzNTAsIDUzNTYsIDUzNzYsIDUzODIsIDUzOTEsIDUzOTcsIDU0MDgsCisgIDU0MTQsIDU0MjMsIDU0MjksIDU0NTQsIDU0NjAsIDU0NjksIDU0NzUsIDU0ODYsCisgIDU0OTIsIDU1MDEsIDU1MDcsIDU1MjcsIDU1MzMsIDU1NDIsIDU1NDgsIDU1NTksCisgIDU1NjUsIDU1NzQsIDU1ODAsIDU2MDMsIDU2MDksIDU2MTgsIDU2MjQsIDU2MzUsCisgIDU2NDEsIDU2NTAsIDU2NTYsIDU2NzYsIDU2ODIsIDU2OTEsIDU2OTcsIDU3MDgsCisgIDU3MTQsIDU3MjMsIDU3MjksIDU3NTQsIDU3NjAsIDU3NjksIDU3NzUsIDU3ODYsCisgIDU3OTIsIDU4MDEsIDU4MDcsIDU4MjcsIDU4MzMsIDU4NDIsIDU4NDgsIDU4NTksCisgIDU4NjUsIDU4NzQsIDU4ODAsIDU3NDQsIDU3NTAsIDU3NTksIDU3NjUsIDU3NzYsCisgIDU3ODIsIDU3OTEsIDU3OTcsIDU4MTcsIDU4MjMsIDU4MzIsIDU4MzgsIDU4NDksCisgIDU4NTUsIDU4NjQsIDU4NzAsIDU4OTUsIDU5MDEsIDU5MTAsIDU5MTYsIDU5MjcsCisgIDU5MzMsIDU5NDIsIDU5NDgsIDU5NjgsIDU5NzQsIDU5ODMsIDU5ODksIDYwMDAsCisgIDYwMDYsIDYwMTUsIDYwMjEsIDYwNDQsIDYwNTAsIDYwNTksIDYwNjUsIDYwNzYsCisgIDYwODIsIDYwOTEsIDYwOTcsIDYxMTcsIDYxMjMsIDYxMzIsIDYxMzgsIDYxNDksCisgIDYxNTUsIDYxNjQsIDYxNzAsIDYxOTUsIDYyMDEsIDYyMTAsIDYyMTYsIDYyMjcsCisgIDYyMzMsIDYyNDIsIDYyNDgsIDYyNjgsIDYyNzQsIDYyODMsIDYyODksIDYzMDAsCisgIDYzMDYsIDYzMTUsIDYzMjEsIDYxMTYsIDYxMjIsIDYxMzEsIDYxMzcsIDYxNDgsCisgIDYxNTQsIDYxNjMsIDYxNjksIDYxODksIDYxOTUsIDYyMDQsIDYyMTAsIDYyMjEsCisgIDYyMjcsIDYyMzYsIDYyNDIsIDYyNjcsIDYyNzMsIDYyODIsIDYyODgsIDYyOTksCisgIDYzMDUsIDYzMTQsIDYzMjAsIDYzNDAsIDYzNDYsIDYzNTUsIDYzNjEsIDYzNzIsCisgIDYzNzgsIDYzODcsIDYzOTMsIDY0MTYsIDY0MjIsIDY0MzEsIDY0MzcsIDY0NDgsCisgIDY0NTQsIDY0NjMsIDY0NjksIDY0ODksIDY0OTUsIDY1MDQsIDY1MTAsIDY1MjEsCisgIDY1MjcsIDY1MzYsIDY1NDIsIDY1NjcsIDY1NzMsIDY1ODIsIDY1ODgsIDY1OTksCisgIDY2MDUsIDY2MTQsIDY2MjAsIDY2NDAsIDY2NDYsIDY2NTUsIDY2NjEsIDY2NzIsCisgIDY2NzgsIDY2ODcsIDY2OTMsIDY1NTcsIDY1NjMsIDY1NzIsIDY1NzgsIDY1ODksCisgIDY1OTUsIDY2MDQsIDY2MTAsIDY2MzAsIDY2MzYsIDY2NDUsIDY2NTEsIDY2NjIsCisgIDY2NjgsIDY2NzcsIDY2ODMsIDY3MDgsIDY3MTQsIDY3MjMsIDY3MjksIDY3NDAsCisgIDY3NDYsIDY3NTUsIDY3NjEsIDY3ODEsIDY3ODcsIDY3OTYsIDY4MDIsIDY4MTMsCisgIDY4MTksIDY4MjgsIDY4MzQsIDY4NTcsIDY4NjMsIDY4NzIsIDY4NzgsIDY4ODksCisgIDY4OTUsIDY5MDQsIDY5MTAsIDY5MzAsIDY5MzYsIDY5NDUsIDY5NTEsIDY5NjIsCisgIDY5NjgsIDY5NzcsIDY5ODMsIDcwMDgsIDcwMTQsIDcwMjMsIDcwMjksIDcwNDAsCisgIDcwNDYsIDcwNTUsIDcwNjEsIDcwODEsIDcwODcsIDcwOTYsIDcxMDIsIDcxMTMsCisgIDcxMTksIDcxMjgsIDcxMzQsIDYzOTIsIDYzOTgsIDY0MDcsIDY0MTMsIDY0MjQsCisgIDY0MzAsIDY0MzksIDY0NDUsIDY0NjUsIDY0NzEsIDY0ODAsIDY0ODYsIDY0OTcsCisgIDY1MDMsIDY1MTIsIDY1MTgsIDY1NDMsIDY1NDksIDY1NTgsIDY1NjQsIDY1NzUsCisgIDY1ODEsIDY1OTAsIDY1OTYsIDY2MTYsIDY2MjIsIDY2MzEsIDY2MzcsIDY2NDgsCisgIDY2NTQsIDY2NjMsIDY2NjksIDY2OTIsIDY2OTgsIDY3MDcsIDY3MTMsIDY3MjQsCisgIDY3MzAsIDY3MzksIDY3NDUsIDY3NjUsIDY3NzEsIDY3ODAsIDY3ODYsIDY3OTcsCisgIDY4MDMsIDY4MTIsIDY4MTgsIDY4NDMsIDY4NDksIDY4NTgsIDY4NjQsIDY4NzUsCisgIDY4ODEsIDY4OTAsIDY4OTYsIDY5MTYsIDY5MjIsIDY5MzEsIDY5MzcsIDY5NDgsCisgIDY5NTQsIDY5NjMsIDY5NjksIDY4MzMsIDY4MzksIDY4NDgsIDY4NTQsIDY4NjUsCisgIDY4NzEsIDY4ODAsIDY4ODYsIDY5MDYsIDY5MTIsIDY5MjEsIDY5MjcsIDY5MzgsCisgIDY5NDQsIDY5NTMsIDY5NTksIDY5ODQsIDY5OTAsIDY5OTksIDcwMDUsIDcwMTYsCisgIDcwMjIsIDcwMzEsIDcwMzcsIDcwNTcsIDcwNjMsIDcwNzIsIDcwNzgsIDcwODksCisgIDcwOTUsIDcxMDQsIDcxMTAsIDcxMzMsIDcxMzksIDcxNDgsIDcxNTQsIDcxNjUsCisgIDcxNzEsIDcxODAsIDcxODYsIDcyMDYsIDcyMTIsIDcyMjEsIDcyMjcsIDcyMzgsCisgIDcyNDQsIDcyNTMsIDcyNTksIDcyODQsIDcyOTAsIDcyOTksIDczMDUsIDczMTYsCisgIDczMjIsIDczMzEsIDczMzcsIDczNTcsIDczNjMsIDczNzIsIDczNzgsIDczODksCisgIDczOTUsIDc0MDQsIDc0MTAsIDcyMDUsIDcyMTEsIDcyMjAsIDcyMjYsIDcyMzcsCisgIDcyNDMsIDcyNTIsIDcyNTgsIDcyNzgsIDcyODQsIDcyOTMsIDcyOTksIDczMTAsCisgIDczMTYsIDczMjUsIDczMzEsIDczNTYsIDczNjIsIDczNzEsIDczNzcsIDczODgsCisgIDczOTQsIDc0MDMsIDc0MDksIDc0MjksIDc0MzUsIDc0NDQsIDc0NTAsIDc0NjEsCisgIDc0NjcsIDc0NzYsIDc0ODIsIDc1MDUsIDc1MTEsIDc1MjAsIDc1MjYsIDc1MzcsCisgIDc1NDMsIDc1NTIsIDc1NTgsIDc1NzgsIDc1ODQsIDc1OTMsIDc1OTksIDc2MTAsCisgIDc2MTYsIDc2MjUsIDc2MzEsIDc2NTYsIDc2NjIsIDc2NzEsIDc2NzcsIDc2ODgsCisgIDc2OTQsIDc3MDMsIDc3MDksIDc3MjksIDc3MzUsIDc3NDQsIDc3NTAsIDc3NjEKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUYWJsZXMgZm9yIGxldmVsIGNvZGluZworCitjb25zdCB1aW50OF90IFZQOEVuY0JhbmRzWzE2ICsgMV0gPSB7CisgIDAsIDEsIDIsIDMsIDYsIDQsIDUsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDcsCisgIDAgIC8vIHNlbnRpbmVsCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9kZSBjb3N0cworCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdChpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgY29uc3QgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisgIGZvciAoOyBuIDwgcmVzLT5sYXN0OyArK24pIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgY29uc3QgaW50IGN0eCA9ICh2ID49IDIpID8gMiA6IHY7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgdCA9IGNvc3RzW24gKyAxXVtjdHhdOworICB9CisgIC8vIExhc3QgY29lZmZpY2llbnQgaXMgYWx3YXlzIG5vbi16ZXJvCisgIHsKKyAgICBjb25zdCBpbnQgdiA9IGFicyhyZXMtPmNvZWZmc1tuXSk7CisgICAgYXNzZXJ0KHYgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbENvc3QodCwgdik7CisgICAgaWYgKG4gPCAxNSkgeworICAgICAgY29uc3QgaW50IGIgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBjb25zdCBpbnQgY3R4ID0gKHYgPT0gMSkgPyAxIDogMjsKKyAgICAgIGNvbnN0IGludCBsYXN0X3AwID0gcmVzLT5wcm9iW2JdW2N0eF1bMF07CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoMCwgbGFzdF9wMCk7CisgICAgfQorICB9CisgIHJldHVybiBjb3N0OworfQorCitzdGF0aWMgdm9pZCBTZXRSZXNpZHVhbENvZWZmcyhjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCBuOworICByZXMtPmxhc3QgPSAtMTsKKyAgYXNzZXJ0KHJlcy0+Zmlyc3QgPT0gMCB8fCBjb2VmZnNbMF0gPT0gMCk7CisgIGZvciAobiA9IDE1OyBuID49IDA7IC0tbikgeworICAgIGlmIChjb2VmZnNbbl0pIHsKKyAgICAgIHJlcy0+bGFzdCA9IG47CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmVzLT5jb2VmZnMgPSBjb2VmZnM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbml0IGZ1bmN0aW9uCisKK1ZQOEdldFJlc2lkdWFsQ29zdEZ1bmMgVlA4R2V0UmVzaWR1YWxDb3N0OworVlA4U2V0UmVzaWR1YWxDb2VmZnNGdW5jIFZQOFNldFJlc2lkdWFsQ29lZmZzOworCitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRTU0UyKHZvaWQpOworCitzdGF0aWMgdm9sYXRpbGUgVlA4Q1BVSW5mbyBjb3N0X2xhc3RfY3B1aW5mb191c2VkID0KKyAgICAoVlA4Q1BVSW5mbykmY29zdF9sYXN0X2NwdWluZm9fdXNlZDsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0KHZvaWQpIHsKKyAgaWYgKGNvc3RfbGFzdF9jcHVpbmZvX3VzZWQgPT0gVlA4R2V0Q1BVSW5mbykgcmV0dXJuOworCisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdDsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMgPSBTZXRSZXNpZHVhbENvZWZmczsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4RW5jRHNwQ29zdEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhFbmNEc3BDb3N0SW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorCisgIGNvc3RfbGFzdF9jcHVpbmZvX3VzZWQgPSBWUDhHZXRDUFVJbmZvOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3RfbWlwczMyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY29zdF9taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRkZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3RfbWlwczMyLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlICIuLi9lbmMvY29zdC5oIgorCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdChpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgdGVtcDAsIHRlbXAxOworICBpbnQgdl9yZWcsIGN0eF9yZWc7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9IHJlcy0+Y29zdHM7CisgIGNvbnN0IHVpbnQxNl90KiB0ID0gY29zdHNbbl1bY3R4MF07CisgIC8vIGJpdF9jb3N0KDEsIHAwKSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiB0W10gdGFibGVzLCBidXQgb25seSBpZiBjdHggIT0gMAorICAvLyAoYXMgcmVxdWlyZWQgYnkgdGhlIHN5bnRheCkuIEZvciBjdHgwID09IDAsIHdlIG5lZWQgdG8gYWRkIGl0IGhlcmUgb3IgaXQnbGwKKyAgLy8gYmUgbWlzc2luZyBkdXJpbmcgdGhlIGxvb3AuCisgIGludCBjb3N0ID0gKGN0eDAgPT0gMCkgPyBWUDhCaXRDb3N0KDEsIHAwKSA6IDA7CisgIGNvbnN0IGludDE2X3QqIHJlc19jb2VmZnMgPSByZXMtPmNvZWZmczsKKyAgY29uc3QgaW50IHJlc19sYXN0ID0gcmVzLT5sYXN0OworICBjb25zdCBpbnQgY29uc3RfbWF4X2xldmVsID0gTUFYX1ZBUklBQkxFX0xFVkVMOworICBjb25zdCBpbnQgY29uc3RfMiA9IDI7CisgIGNvbnN0IHVpbnQxNl90KiogcF9jb3N0cyA9ICZjb3N0c1tuXVswXTsKKyAgY29uc3Qgc2l6ZV90IGluY19wX2Nvc3RzID0gTlVNX0NUWCAqIHNpemVvZigqcF9jb3N0cyk7CisKKyAgaWYgKHJlcy0+bGFzdCA8IDApIHsKKyAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7CisgIH0KKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgICVbbl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDBdLCAgICAgICAgJVtuXSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJsZXogICAgICAlW3RlbXAxXSwgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkdSAgICAgJVtyZXNfY29lZmZzXSwgICAlW3Jlc19jb2VmZnNdLCAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICAlW3ZfcmVnXSwgICAgICAgIDAoJVtyZXNfY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtuXSwgICAgICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdGkgICAgICAlW3RlbXAxXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3ZuICAgICAgJVt2X3JlZ10sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0aXUgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdmUgICAgICAlW2N0eF9yZWddLCAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2NvbnN0XzJdLCAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDFdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgJVtWUDhMZXZlbEZpeGVkQ29zdHNdICBcblx0IgorICAgICJsaHUgICAgICAgJVt0ZW1wMV0sICAgICAgICAwKCVbdGVtcDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0ICAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAlW2NvbnN0X21heF9sZXZlbF0gICAgIFxuXHQiCisgICAgIm1vdnogICAgICAlW3ZfcmVnXSwgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSwgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtjb3N0XSwgICAgICAgICAlW2Nvc3RdLCAgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdl9yZWddLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW2N0eF9yZWddLCAgICAgICVbY3R4X3JlZ10sICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgICVbdF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh1ICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW3ZfcmVnXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3BfY29zdHNdLCAgICAgICVbcF9jb3N0c10sICAgICAgICAgJVtpbmNfcF9jb3N0c10gICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0XSwgICAgICAgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbY3R4X3JlZ10gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbY29zdF0sICAgICAgICAgJVtjb3N0XSwgICAgICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3Jlc19jb2VmZnNdLCAgICVbcmVzX2NvZWZmc10sICAgICAgMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgJVtuXSwgICAgICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGx3ICAgICAgICVbdF0sICAgICAgICAgICAgMCglW3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtjb3N0XSIrJnIiKGNvc3QpLCBbdF0iKyZyIih0KSwgW25dIismciIobiksIFt2X3JlZ10iPSZyIih2X3JlZyksCisgICAgICBbY3R4X3JlZ10iPSZyIihjdHhfcmVnKSwgW3BfY29zdHNdIismciIocF9jb3N0cyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpLCBbcmVzX2NvZWZmc10iKyZyIihyZXNfY29lZmZzKQorICAgIDogW2NvbnN0XzJdInIiKGNvbnN0XzIpLCBbY29uc3RfbWF4X2xldmVsXSJyIihjb25zdF9tYXhfbGV2ZWwpLAorICAgICAgW1ZQOExldmVsRml4ZWRDb3N0c10iciIoVlA4TGV2ZWxGaXhlZENvc3RzKSwgW3Jlc19sYXN0XSJyIihyZXNfbGFzdCksCisgICAgICBbaW5jX3BfY29zdHNdInIiKGluY19wX2Nvc3RzKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKworICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IHYgPSBhYnMocmVzLT5jb2VmZnNbbl0pOworICAgIGFzc2VydCh2ICE9IDApOworICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9ICh2ID09IDEpID8gMSA6IDI7CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOworICAgIH0KKyAgfQorICByZXR1cm4gY29zdDsKK30KKworc3RhdGljIHZvaWQgU2V0UmVzaWR1YWxDb2VmZnMoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBjb25zdCBpbnQxNl90KiBwX2NvZWZmcyA9IChpbnQxNl90Kiljb2VmZnM7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCBuLCBuMTsKKyAgYXNzZXJ0KHJlcy0+Zmlyc3QgPT0gMCB8fCBjb2VmZnNbMF0gPT0gMCk7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbcF9jb2VmZnNdLCAgICVbcF9jb2VmZnNdLCAgICAyOCAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICVbbl0sICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICVbdGVtcDJdLCAgICAgIC0xICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICVbdGVtcDBdLCAgICAgIDAoJVtwX2NvZWZmc10pICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDBdLCAgICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgICAgIiBzbGwgICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDBdLCAgICAgICAxNiAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICIgc3JsICAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSwgICAgICAgMTYgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImFkZGl1ICAgICVbbjFdLCAgICAgICAgICVbbl0sICAgICAgICAgICAtMSAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDBdLCAgICAgICVbbjFdLCAgICAgICAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgIm1vdm4gICAgICVbdGVtcDBdLCAgICAgICVbbl0sICAgICAgICAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImogICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICVbdGVtcDJdLCAgICAgICVbdGVtcDBdLCAgICAgICAwICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbbl0sICAgICAgICAgICVbbl0sICAgICAgICAgICAtMiAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICVbbl0sICAgICAgICAgIDBiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICVbcF9jb2VmZnNdLCAgICVbcF9jb2VmZnNdLCAgICAtNCAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbcF9jb2VmZnNdIismciIocF9jb2VmZnMpLCBbdGVtcDBdIj0mciIodGVtcDApLAorICAgICAgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFtuXSI9JnIiKG4pLCBbbjFdIj0mciIobjEpCisgICAgOgorICAgIDogIm1lbW9yeSIKKyAgKTsKKyAgcmVzLT5sYXN0ID0gdGVtcDI7CisgIHJlcy0+Y29lZmZzID0gY29lZmZzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdDsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMgPSBTZXRSZXNpZHVhbENvZWZmczsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3RfbWlwc19kc3BfcjIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjZGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgIi4uL2VuYy9jb3N0LmgiCisKK3N0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0KGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCB0ZW1wMCwgdGVtcDE7CisgIGludCB2X3JlZywgY3R4X3JlZzsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGludCBwMCA9IHJlcy0+cHJvYltuXVtjdHgwXVswXTsKKyAgQ29zdEFycmF5UHRyIGNvbnN0IGNvc3RzID0gcmVzLT5jb3N0czsKKyAgY29uc3QgdWludDE2X3QqIHQgPSBjb3N0c1tuXVtjdHgwXTsKKyAgLy8gYml0X2Nvc3QoMSwgcDApIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGluIHRbXSB0YWJsZXMsIGJ1dCBvbmx5IGlmIGN0eCAhPSAwCisgIC8vIChhcyByZXF1aXJlZCBieSB0aGUgc3ludGF4KS4gRm9yIGN0eDAgPT0gMCwgd2UgbmVlZCB0byBhZGQgaXQgaGVyZSBvciBpdCdsbAorICAvLyBiZSBtaXNzaW5nIGR1cmluZyB0aGUgbG9vcC4KKyAgaW50IGNvc3QgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgcDApIDogMDsKKyAgY29uc3QgaW50MTZfdCogcmVzX2NvZWZmcyA9IHJlcy0+Y29lZmZzOworICBjb25zdCBpbnQgcmVzX2xhc3QgPSByZXMtPmxhc3Q7CisgIGNvbnN0IGludCBjb25zdF9tYXhfbGV2ZWwgPSBNQVhfVkFSSUFCTEVfTEVWRUw7CisgIGNvbnN0IGludCBjb25zdF8yID0gMjsKKyAgY29uc3QgdWludDE2X3QqKiBwX2Nvc3RzID0gJmNvc3RzW25dWzBdOworICBjb25zdCBzaXplX3QgaW5jX3BfY29zdHMgPSBOVU1fQ1RYICogc2l6ZW9mKCpwX2Nvc3RzKTsKKworICBpZiAocmVzLT5sYXN0IDwgMCkgeworICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKKyAgfQorCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICAgICAgICVbcmVzX2xhc3RdLCAgICAgICAgJVtuXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJibGV6ICAgICAgJVt0ZW1wMV0sICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh4ICAgICAgICVbdl9yZWddLCAgICAgICAgJVt0ZW1wMF0oJVtyZXNfY29lZmZzXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW25dLCAgICAgICAgICAgICVbbl0sICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0aXUgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdmUgICAgICAlW2N0eF9yZWddLCAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2NvbnN0XzJdLCAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDFdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoeCAgICAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdKCVbVlA4TGV2ZWxGaXhlZENvc3RzXSkgICAgICAgICBcblx0IgorICAgICJzbHQgICAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSAgXG5cdCIKKyAgICAibW92eiAgICAgICVbdl9yZWddLCAgICAgICAgJVtjb25zdF9tYXhfbGV2ZWxdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMV0gICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbY3R4X3JlZ10sICAgICAgJVtjdHhfcmVnXSwgICAgICAgICAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoeCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddKCVbdF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwX2Nvc3RzXSwgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbaW5jX3BfY29zdHNdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdF0sICAgICAgICAgICAgJVtwX2Nvc3RzXSwgICAgICAgICAlW2N0eF9yZWddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW2Nvc3RdLCAgICAgICAgICVbY29zdF0sICAgICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgJVtuXSwgICAgICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGx3ICAgICAgICVbdF0sICAgICAgICAgICAgMCglW3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtjb3N0XSIrJnIiKGNvc3QpLCBbdF0iKyZyIih0KSwgW25dIismciIobiksIFt2X3JlZ10iPSZyIih2X3JlZyksCisgICAgICBbY3R4X3JlZ10iPSZyIihjdHhfcmVnKSwgW3BfY29zdHNdIismciIocF9jb3N0cyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpCisgICAgOiBbY29uc3RfMl0iciIoY29uc3RfMiksIFtjb25zdF9tYXhfbGV2ZWxdInIiKGNvbnN0X21heF9sZXZlbCksCisgICAgICBbVlA4TGV2ZWxGaXhlZENvc3RzXSJyIihWUDhMZXZlbEZpeGVkQ29zdHMpLCBbcmVzX2xhc3RdInIiKHJlc19sYXN0KSwKKyAgICAgIFtyZXNfY29lZmZzXSJyIihyZXNfY29lZmZzKSwgW2luY19wX2Nvc3RzXSJyIihpbmNfcF9jb3N0cykKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KKyAgeworICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKKyAgICBhc3NlcnQodiAhPSAwKTsKKyAgICBjb3N0ICs9IFZQOExldmVsQ29zdCh0LCB2KTsKKyAgICBpZiAobiA8IDE1KSB7CisgICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOworICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4R2V0UmVzaWR1YWxDb3N0ID0gR2V0UmVzaWR1YWxDb3N0OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3Rfc3NlMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2Nvc3Rfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0M2I0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY29zdF9zc2UyLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2YgY29zdCBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgU2V0UmVzaWR1YWxDb2VmZnNTU0UyKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShjb2VmZnMgKyAwKSk7CisgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShjb2VmZnMgKyA4KSk7CisgIC8vIFVzZSBTU0UyIHRvIGNvbXBhcmUgMTYgdmFsdWVzIHdpdGggYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbTAgPSBfbW1fcGFja3NfZXBpMTYoYzAsIGMxKTsKKyAgY29uc3QgX19tMTI4aSBtMSA9IF9tbV9jbXBlcV9lcGk4KG0wLCB6ZXJvKTsKKyAgLy8gR2V0IHRoZSBjb21wYXJpc29uIHJlc3VsdHMgYXMgYSBiaXRtYXNrIGludG8gMTZiaXRzLiBOZWdhdGUgdGhlIG1hc2sgdG8gZ2V0CisgIC8vIHRoZSBwb3NpdGlvbiBvZiBlbnRyaWVzIHRoYXQgYXJlIG5vdCBlcXVhbCB0byB6ZXJvLiBXZSBkb24ndCBuZWVkIHRvIG1hc2sKKyAgLy8gb3V0IGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYWNjb3JkaW5nIHRvIHJlcy0+Zmlyc3QsIHNpbmNlIGNvZWZmc1swXSBpcyAwCisgIC8vIGlmIHJlcy0+Zmlyc3QgPiAwLgorICBjb25zdCB1aW50MzJfdCBtYXNrID0gMHgwMDAwZmZmZnUgXiAodWludDMyX3QpX21tX21vdmVtYXNrX2VwaTgobTEpOworICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLXplcm8gYml0IGluZGljYXRlcyB0aGUgcG9zaXRpb24gb2YKKyAgLy8gdGhlIGxhc3Qgbm9uLXplcm8gdmFsdWUuCisgIGFzc2VydChyZXMtPmZpcnN0ID09IDAgfHwgY29lZmZzWzBdID09IDApOworICByZXMtPmxhc3QgPSBtYXNrID8gQml0c0xvZzJGbG9vcihtYXNrKSA6IC0xOworICByZXMtPmNvZWZmcyA9IGNvZWZmczsKK30KKworc3RhdGljIGludCBHZXRSZXNpZHVhbENvc3RTU0UyKGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIHVpbnQ4X3QgbGV2ZWxzWzE2XSwgY3R4c1sxNl07CisgIHVpbnQxNl90IGFic19sZXZlbHNbMTZdOworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgY29uc3QgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisKKyAgeyAgIC8vIHByZWNvbXB1dGUgY2xhbXBlZCBsZXZlbHMgYW5kIGNvbnRleHRzLCBwYWNrZWQgdG8gOGIuCisgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3QyID0gX21tX3NldDFfZXBpOCgyKTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3Q2NyA9IF9tbV9zZXQxX2VwaTgoTUFYX1ZBUklBQkxFX0xFVkVMKTsKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVzLT5jb2VmZnNbMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZXMtPmNvZWZmc1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zdWJfZXBpMTYoemVybywgYzApOworICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fc3ViX2VwaTE2KHplcm8sIGMxKTsKKyAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX21heF9lcGkxNihjMCwgRDApOyAgIC8vIGFicyh2KSwgMTZiCisgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9tYXhfZXBpMTYoYzEsIEQxKTsKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fcGFja3NfZXBpMTYoRTAsIEUxKTsKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fbWluX2VwdTgoRiwga0NzdDIpOyAgICAvLyBjb250ZXh0ID0gMCwxLDIKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fbWluX2VwdTgoRiwga0NzdDY3KTsgICAvLyBjbGFtcF9sZXZlbCBpbiBbMC4uNjddCisKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmY3R4c1swXSwgRyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmxldmVsc1swXSwgSCk7CisKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYWJzX2xldmVsc1swXSwgRTApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhYnNfbGV2ZWxzWzhdLCBFMSk7CisgIH0KKyAgZm9yICg7IG4gPCByZXMtPmxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCBjdHggPSBjdHhzW25dOworICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsc1tuXTsKKyAgICBjb25zdCBpbnQgZmxldmVsID0gYWJzX2xldmVsc1tuXTsgICAvLyBmdWxsIGxldmVsCisgICAgY29zdCArPSBWUDhMZXZlbEZpeGVkQ29zdHNbZmxldmVsXSArIHRbbGV2ZWxdOyAgLy8gc2ltcGxpZmllZCBWUDhMZXZlbENvc3QoKQorICAgIHQgPSBjb3N0c1tuICsgMV1bY3R4XTsKKyAgfQorICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWxzW25dOworICAgIGNvbnN0IGludCBmbGV2ZWwgPSBhYnNfbGV2ZWxzW25dOworICAgIGFzc2VydChmbGV2ZWwgIT0gMCk7CisgICAgY29zdCArPSBWUDhMZXZlbEZpeGVkQ29zdHNbZmxldmVsXSArIHRbbGV2ZWxdOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9IGN0eHNbbl07CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOworICAgIH0KKyAgfQorICByZXR1cm4gY29zdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKSB7CisgIFZQOFNldFJlc2lkdWFsQ29lZmZzID0gU2V0UmVzaWR1YWxDb2VmZnNTU0UyOworICBWUDhHZXRSZXNpZHVhbENvc3QgPSBHZXRSZXNpZHVhbENvc3RTU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcENvc3RJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY3B1LmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY3B1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjOTdiZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jcHUuYwpAQCAtMCwwICsxLDE4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENQVSBkZXRlY3Rpb24KKy8vCisvLyBBdXRob3I6IENocmlzdGlhbiBEdXZpdmllciAoY2R1dml2aWVyQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX05FT05fUlRDRCkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfQU5EUk9JRF9ORU9OKQorI2luY2x1ZGUgPGNwdS1mZWF0dXJlcy5oPgorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0UyIGRldGVjdGlvbi4KKy8vCisKKy8vIGFwcGxlL2RhcndpbiBnY2MtNC4wLjEgZGVmaW5lcyBfX1BJQ19fLCBidXQgbm90IF9fcGljX18gd2l0aCAtZlBJQy4KKyNpZiAoZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKF9fUElDX18pKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm1vdiAlJWVieCwgJSVlZGlcbiIKKyAgICAiY3B1aWRcbiIKKyAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPUQiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCisgICAgOiAiYSIoaW5mb190eXBlKSwgImMiKDApKTsKK30KKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgJiYgXAorICAgICAgKGRlZmluZWQoX19jb2RlX21vZGVsX21lZGl1bV9fKSB8fCBkZWZpbmVkKF9fY29kZV9tb2RlbF9sYXJnZV9fKSkgJiYgXAorICAgICAgZGVmaW5lZChfX1BJQ19fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInhjaGd7cX1cdHslJXJieH0sICVxMVxuIgorICAgICJjcHVpZFxuIgorICAgICJ4Y2hne3F9XHR7JSVyYnh9LCAlcTFcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPSZyIihjcHVfaW5mb1sxXSksICI9YyIoY3B1X2luZm9bMl0pLAorICAgICAgIj1kIihjcHVfaW5mb1szXSkKKyAgICA6ICJhIihpbmZvX3R5cGUpLCAiYyIoMCkpOworfQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0Q1BVSW5mbyhpbnQgY3B1X2luZm9bNF0sIGludCBpbmZvX3R5cGUpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImNwdWlkXG4iCisgICAgOiAiPWEiKGNwdV9pbmZvWzBdKSwgIj1iIihjcHVfaW5mb1sxXSksICI9YyIoY3B1X2luZm9bMl0pLCAiPWQiKGNwdV9pbmZvWzNdKQorICAgIDogImEiKGluZm9fdHlwZSksICJjIigwKSk7Cit9CisjZWxpZiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpICYmIFwKKyAgICAgIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxNTAwMzA3MjkgIC8vID49IFZTMjAwOCBTUDEKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNkZWZpbmUgR2V0Q1BVSW5mbyhpbmZvLCB0eXBlKSBfX2NwdWlkZXgoaW5mbywgdHlwZSwgMCkgIC8vIHNldCBlY3g9MAorI2VsaWYgZGVmaW5lZChXRUJQX01TQ19TU0UyKQorI2RlZmluZSBHZXRDUFVJbmZvIF9fY3B1aWQKKyNlbmRpZgorCisvLyBOYUNsIGhhcyBubyBzdXBwb3J0IGZvciB4Z2V0YnYgb3IgdGhlIHJhdyBvcGNvZGUuCisjaWYgIWRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pICYmIChkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IHhnZXRidih2b2lkKSB7CisgIGNvbnN0IHVpbnQzMl90IGVjeCA9IDA7CisgIHVpbnQzMl90IGVheCwgZWR4OworICAvLyBVc2UgdGhlIHJhdyBvcGNvZGUgZm9yIHhnZXRidiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRvb2xjaGFpbnMuCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuYnl0ZSAweDBmLCAweDAxLCAweGQwXG4iCisgICAgOiAiPWEiKGVheCksICI9ZCIoZWR4KSA6ICJjIiAoZWN4KSk7CisgIHJldHVybiAoKHVpbnQ2NF90KWVkeCA8PCAzMikgfCBlYXg7Cit9CisjZWxpZiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpICYmIFwKKyAgICAgIGRlZmluZWQoX01TQ19GVUxMX1ZFUikgJiYgX01TQ19GVUxMX1ZFUiA+PSAxNjAwNDAyMTkgIC8vID49IFZTMjAxMCBTUDEKKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNkZWZpbmUgeGdldGJ2KCkgX3hnZXRidigwKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfTV9JWDg2KQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IHhnZXRidih2b2lkKSB7CisgIHVpbnQzMl90IGVheF8sIGVkeF87CisgIF9fYXNtIHsKKyAgICB4b3IgZWN4LCBlY3ggIC8vIGVjeCA9IDAKKyAgICAvLyBVc2UgdGhlIHJhdyBvcGNvZGUgZm9yIHhnZXRidiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRvb2xjaGFpbnMuCisgICAgX19hc20gX2VtaXQgMHgwZiBfX2FzbSBfZW1pdCAweDAxIF9fYXNtIF9lbWl0IDB4ZDAKKyAgICBtb3YgZWF4XywgZWF4CisgICAgbW92IGVkeF8sIGVkeAorICB9CisgIHJldHVybiAoKHVpbnQ2NF90KWVkeF8gPDwgMzIpIHwgZWF4XzsKK30KKyNlbHNlCisjZGVmaW5lIHhnZXRidigpIDBVICAvLyBubyBBVlggZm9yIG9sZGVyIHg2NCBvciB1bnJlY29nbml6ZWQgdG9vbGNoYWlucy4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCitzdGF0aWMgaW50IHg4NkNQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7CisgIGludCBtYXhfY3B1aWRfdmFsdWU7CisgIGludCBjcHVfaW5mb1s0XTsKKworICAvLyBnZXQgdGhlIGhpZ2hlc3QgZmVhdHVyZSB2YWx1ZSBjcHVpZCBzdXBwb3J0cworICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAwKTsKKyAgbWF4X2NwdWlkX3ZhbHVlID0gY3B1X2luZm9bMF07CisgIGlmIChtYXhfY3B1aWRfdmFsdWUgPCAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAxKTsKKyAgaWYgKGZlYXR1cmUgPT0ga1NTRTIpIHsKKyAgICByZXR1cm4gMCAhPSAoY3B1X2luZm9bM10gJiAweDA0MDAwMDAwKTsKKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrU1NFMykgeworICAgIHJldHVybiAwICE9IChjcHVfaW5mb1syXSAmIDB4MDAwMDAwMDEpOworICB9CisgIGlmIChmZWF0dXJlID09IGtTU0U0XzEpIHsKKyAgICByZXR1cm4gMCAhPSAoY3B1X2luZm9bMl0gJiAweDAwMDgwMDAwKTsKKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrQVZYKSB7CisgICAgLy8gYml0cyAyNyAoT1NYU0FWRSkgJiAyOCAoMjU2LWJpdCBBVlgpCisgICAgaWYgKChjcHVfaW5mb1syXSAmIDB4MTgwMDAwMDApID09IDB4MTgwMDAwMDApIHsKKyAgICAgIC8vIFhNTSBzdGF0ZSBhbmQgWU1NIHN0YXRlIGVuYWJsZWQgYnkgdGhlIE9TLgorICAgICAgcmV0dXJuICh4Z2V0YnYoKSAmIDB4NikgPT0gMHg2OworICAgIH0KKyAgfQorICBpZiAoZmVhdHVyZSA9PSBrQVZYMikgeworICAgIGlmICh4ODZDUFVJbmZvKGtBVlgpICYmIG1heF9jcHVpZF92YWx1ZSA+PSA3KSB7CisgICAgICBHZXRDUFVJbmZvKGNwdV9pbmZvLCA3KTsKKyAgICAgIHJldHVybiAoKGNwdV9pbmZvWzFdICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCk7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0geDg2Q1BVSW5mbzsKKyNlbGlmIGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pICAvLyBOQjogbmVlZHMgdG8gYmUgYmVmb3JlIGdlbmVyaWMgTkVPTiB0ZXN0Lgorc3RhdGljIGludCBBbmRyb2lkQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgY29uc3QgQW5kcm9pZENwdUZhbWlseSBjcHVfZmFtaWx5ID0gYW5kcm9pZF9nZXRDcHVGYW1pbHkoKTsKKyAgY29uc3QgdWludDY0X3QgY3B1X2ZlYXR1cmVzID0gYW5kcm9pZF9nZXRDcHVGZWF0dXJlcygpOworICBpZiAoZmVhdHVyZSA9PSBrTkVPTikgeworICAgIHJldHVybiAoY3B1X2ZhbWlseSA9PSBBTkRST0lEX0NQVV9GQU1JTFlfQVJNICYmCisgICAgICAgICAgICAwICE9IChjcHVfZmVhdHVyZXMgJiBBTkRST0lEX0NQVV9BUk1fRkVBVFVSRV9ORU9OKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBBbmRyb2lkQ1BVSW5mbzsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKy8vIGRlZmluZSBhIGR1bW15IGZ1bmN0aW9uIHRvIGVuYWJsZSB0dXJuaW5nIG9mZiBORU9OIGF0IHJ1bnRpbWUgYnkgc2V0dGluZworLy8gVlA4RGVjR2V0Q1BVSW5mbyA9IE5VTEwKK3N0YXRpYyBpbnQgYXJtQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgaWYgKGZlYXR1cmUgIT0ga05FT04pIHJldHVybiAwOworI2lmIGRlZmluZWQoX19saW51eF9fKSAmJiBkZWZpbmVkKFdFQlBfSEFWRV9ORU9OX1JUQ0QpCisgIHsKKyAgICBpbnQgaGFzX25lb24gPSAwOworICAgIGNoYXIgbGluZVsyMDBdOworICAgIEZJTEUqIGNvbnN0IGNwdWluZm8gPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisgICAgaWYgKGNwdWluZm8gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgY3B1aW5mbykpIHsKKyAgICAgIGlmICghc3RybmNtcChsaW5lLCAiRmVhdHVyZXMiLCA4KSkgeworICAgICAgICBpZiAoc3Ryc3RyKGxpbmUsICIgbmVvbiAiKSAhPSBOVUxMKSB7CisgICAgICAgICAgaGFzX25lb24gPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZjbG9zZShjcHVpbmZvKTsKKyAgICByZXR1cm4gaGFzX25lb247CisgIH0KKyNlbHNlCisgIHJldHVybiAxOworI2VuZGlmCit9CitWUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBhcm1DUFVJbmZvOworI2VsaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpIHx8IGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpIHx8IFwKKyAgICAgIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorc3RhdGljIGludCBtaXBzQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKKyAgaWYgKChmZWF0dXJlID09IGtNSVBTMzIpIHx8IChmZWF0dXJlID09IGtNSVBTZHNwUjIpIHx8IChmZWF0dXJlID09IGtNU0EpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gbWlwc0NQVUluZm87CisjZWxzZQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gTlVMTDsKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmOTliMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWMuYwpAQCAtMCwwICsxLDc5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwZWVkLWNyaXRpY2FsIGRlY29kaW5nIGZ1bmN0aW9ucywgZGVmYXVsdCBwbGFpbi1DIGltcGxlbWVudGF0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgeworICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworI2RlZmluZSBTVE9SRSh4LCB5LCB2KSBcCisgIGRzdFt4ICsgeSAqIEJQU10gPSBjbGlwXzhiKGRzdFt4ICsgeSAqIEJQU10gKyAoKHYpID4+IDMpKQorCisjZGVmaW5lIFNUT1JFMih5LCBkYywgZCwgYykgZG8geyAgICBcCisgIGNvbnN0IGludCBEQyA9IChkYyk7ICAgICAgICAgICAgICBcCisgIFNUT1JFKDAsIHksIERDICsgKGQpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDEsIHksIERDICsgKGMpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDIsIHksIERDIC0gKGMpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDMsIHksIERDIC0gKGQpKTsgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1VTDEoYSkgKCgoKGEpICogMjAwOTEpID4+IDE2KSArIChhKSkKKyNkZWZpbmUgTVVMMihhKSAoKChhKSAqIDM1NDY4KSA+PiAxNikKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IENbNCAqIDRdLCAqdG1wOworICBpbnQgaTsKKyAgdG1wID0gQzsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyB2ZXJ0aWNhbCBwYXNzCisgICAgY29uc3QgaW50IGEgPSBpblswXSArIGluWzhdOyAgICAvLyBbLTQwOTYsIDQwOTRdCisgICAgY29uc3QgaW50IGIgPSBpblswXSAtIGluWzhdOyAgICAvLyBbLTQwOTUsIDQwOTVdCisgICAgY29uc3QgaW50IGMgPSBNVUwyKGluWzRdKSAtIE1VTDEoaW5bMTJdKTsgICAvLyBbLTM3ODMsIDM3ODNdCisgICAgY29uc3QgaW50IGQgPSBNVUwxKGluWzRdKSArIE1VTDIoaW5bMTJdKTsgICAvLyBbLTM3ODUsIDM3ODFdCisgICAgdG1wWzBdID0gYSArIGQ7ICAgLy8gWy03ODgxLCA3ODc1XQorICAgIHRtcFsxXSA9IGIgKyBjOyAgIC8vIFstNzg3OCwgNzg3OF0KKyAgICB0bXBbMl0gPSBiIC0gYzsgICAvLyBbLTc4NzgsIDc4NzhdCisgICAgdG1wWzNdID0gYSAtIGQ7ICAgLy8gWy03ODc3LCA3ODc5XQorICAgIHRtcCArPSA0OworICAgIGluKys7CisgIH0KKyAgLy8gRWFjaCBwYXNzIGlzIGV4cGFuZGluZyB0aGUgZHluYW1pYyByYW5nZSBieSB+My44NSAodXBwZXIgYm91bmQpLgorICAvLyBUaGUgZXhhY3QgdmFsdWUgaXMgKDIuICsgKDIwMDkxICsgMzU0NjgpIC8gNjU1MzYpLgorICAvLyBBZnRlciB0aGUgc2Vjb25kIHBhc3MsIG1heGltdW0gaW50ZXJ2YWwgaXMgWy0zNzk0LCAzNzk0XSwgYXNzdW1pbmcKKyAgLy8gYW4gaW5wdXQgaW4gWy0yMDQ4LCAyMDQ3XSBpbnRlcnZhbC4gV2UgdGhlbiBuZWVkIHRvIGFkZCBhIGRzdCB2YWx1ZQorICAvLyBpbiB0aGUgWzAsIDI1NV0gcmFuZ2UuCisgIC8vIEluIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLCB0aGUgaW5wdXQgdG8gY2xpcF84YigpIGNhbiBiZSBhcyBsYXJnZSBhcworICAvLyBbLTYwNzEzLCA2MDk2OF0uCisgIHRtcCA9IEM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgY29uc3QgaW50IGRjID0gdG1wWzBdICsgNDsKKyAgICBjb25zdCBpbnQgYSA9ICBkYyArICB0bXBbOF07CisgICAgY29uc3QgaW50IGIgPSAgZGMgLSAgdG1wWzhdOworICAgIGNvbnN0IGludCBjID0gTVVMMih0bXBbNF0pIC0gTVVMMSh0bXBbMTJdKTsKKyAgICBjb25zdCBpbnQgZCA9IE1VTDEodG1wWzRdKSArIE1VTDIodG1wWzEyXSk7CisgICAgU1RPUkUoMCwgMCwgYSArIGQpOworICAgIFNUT1JFKDEsIDAsIGIgKyBjKTsKKyAgICBTVE9SRSgyLCAwLCBiIC0gYyk7CisgICAgU1RPUkUoMywgMCwgYSAtIGQpOworICAgIHRtcCsrOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8gU2ltcGxpZmllZCB0cmFuc2Zvcm0gd2hlbiBvbmx5IGluWzBdLCBpblsxXSBhbmQgaW5bNF0gYXJlIG5vbi16ZXJvCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgYSA9IGluWzBdICsgNDsKKyAgY29uc3QgaW50IGM0ID0gTVVMMihpbls0XSk7CisgIGNvbnN0IGludCBkNCA9IE1VTDEoaW5bNF0pOworICBjb25zdCBpbnQgYzEgPSBNVUwyKGluWzFdKTsKKyAgY29uc3QgaW50IGQxID0gTVVMMShpblsxXSk7CisgIFNUT1JFMigwLCBhICsgZDQsIGQxLCBjMSk7CisgIFNUT1JFMigxLCBhICsgYzQsIGQxLCBjMSk7CisgIFNUT1JFMigyLCBhIC0gYzQsIGQxLCBjMSk7CisgIFNUT1JFMigzLCBhIC0gZDQsIGQxLCBjMSk7Cit9CisjdW5kZWYgTVVMMQorI3VuZGVmIE1VTDIKKyN1bmRlZiBTVE9SRTIKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVVWKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgVlA4VHJhbnNmb3JtKGluICsgMCAqIDE2LCBkc3QsIDEpOworICBWUDhUcmFuc2Zvcm0oaW4gKyAyICogMTYsIGRzdCArIDQgKiBCUFMsIDEpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBEQyA9IGluWzBdICsgNDsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICBTVE9SRShpLCBqLCBEQyk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDVVYoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpZiAoaW5bMCAqIDE2XSkgVlA4VHJhbnNmb3JtREMoaW4gKyAwICogMTYsIGRzdCk7CisgIGlmIChpblsxICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDEgKiAxNiwgZHN0ICsgNCk7CisgIGlmIChpblsyICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUyk7CisgIGlmIChpblszICogMTZdKSBWUDhUcmFuc2Zvcm1EQyhpbiArIDMgKiAxNiwgZHN0ICsgNCAqIEJQUyArIDQpOworfQorCisjdW5kZWYgU1RPUkUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCAxNC4zCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIGludCB0bXBbMTZdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGNvbnN0IGludCBhMCA9IGluWzAgKyBpXSArIGluWzEyICsgaV07CisgICAgY29uc3QgaW50IGExID0gaW5bNCArIGldICsgaW5bIDggKyBpXTsKKyAgICBjb25zdCBpbnQgYTIgPSBpbls0ICsgaV0gLSBpblsgOCArIGldOworICAgIGNvbnN0IGludCBhMyA9IGluWzAgKyBpXSAtIGluWzEyICsgaV07CisgICAgdG1wWzAgICsgaV0gPSBhMCArIGExOworICAgIHRtcFs4ICArIGldID0gYTAgLSBhMTsKKyAgICB0bXBbNCAgKyBpXSA9IGEzICsgYTI7CisgICAgdG1wWzEyICsgaV0gPSBhMyAtIGEyOworICB9CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGMgPSB0bXBbMCArIGkgKiA0XSArIDM7ICAgIC8vIHcvIHJvdW5kZXIKKyAgICBjb25zdCBpbnQgYTAgPSBkYyAgICAgICAgICAgICArIHRtcFszICsgaSAqIDRdOworICAgIGNvbnN0IGludCBhMSA9IHRtcFsxICsgaSAqIDRdICsgdG1wWzIgKyBpICogNF07CisgICAgY29uc3QgaW50IGEyID0gdG1wWzEgKyBpICogNF0gLSB0bXBbMiArIGkgKiA0XTsKKyAgICBjb25zdCBpbnQgYTMgPSBkYyAgICAgICAgICAgICAtIHRtcFszICsgaSAqIDRdOworICAgIG91dFsgMF0gPSAoYTAgKyBhMSkgPj4gMzsKKyAgICBvdXRbMTZdID0gKGEzICsgYTIpID4+IDM7CisgICAgb3V0WzMyXSA9IChhMCAtIGExKSA+PiAzOworICAgIG91dFs0OF0gPSAoYTMgLSBhMikgPj4gMzsKKyAgICBvdXQgKz0gNjQ7CisgIH0KK30KKwordm9pZCAoKlZQOFRyYW5zZm9ybVdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QqIGRzdCwgaW50IHNpemUpIHsKKyAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOworICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwMCA9IFZQOGtjbGlwMSAtIHRvcFstMV07CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAwICsgZHN0Wy0xXTsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7CisgICAgICBkc3RbeF0gPSBjbGlwW3RvcFt4XV07CisgICAgfQorICAgIGRzdCArPSBCUFM7CisgIH0KK30KK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QpICAgeyBUcnVlTW90aW9uKGRzdCwgNCk7IH0KK3N0YXRpYyB2b2lkIFRNOHV2KHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uKGRzdCwgOCk7IH0KK3N0YXRpYyB2b2lkIFRNMTYodWludDhfdCogZHN0KSAgeyBUcnVlTW90aW9uKGRzdCwgMTYpOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAxNngxNgorCitzdGF0aWMgdm9pZCBWRTE2KHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gdmVydGljYWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgbWVtY3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFMTYodWludDhfdCogZHN0KSB7ICAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAxNjsgaiA+IDA7IC0taikgeworICAgIG1lbXNldChkc3QsIGRzdFstMV0sIDE2KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDE2KGludCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIHYsIDE2KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQworICBpbnQgREMgPSAxNjsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgREMgKz0gZHN0Wy0xICsgaiAqIEJQU10gKyBkc3RbaiAtIEJQU107CisgIH0KKyAgUHV0MTYoREMgPj4gNSwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICBQdXQxNihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBEQyArPSBkc3RbaSAtIEJQU107CisgIH0KKyAgUHV0MTYoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIGFuZCBsZWZ0IHNhbXBsZXMKKyAgUHV0MTYoMHg4MCwgZHN0KTsKK30KKworVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWExNltOVU1fQl9EQ19NT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQKKworI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisjZGVmaW5lIEFWRzIoYSwgYikgKCgoYSkgKyAoYikgKyAxKSA+PiAxKQorCitzdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IGRzdCAtIEJQUzsKKyAgY29uc3QgdWludDhfdCB2YWxzWzRdID0geworICAgIEFWRzModG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pLAorICAgIEFWRzModG9wWyAwXSwgdG9wWzFdLCB0b3BbMl0pLAorICAgIEFWRzModG9wWyAxXSwgdG9wWzJdLCB0b3BbM10pLAorICAgIEFWRzModG9wWyAyXSwgdG9wWzNdLCB0b3BbNF0pCisgIH07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgbWVtY3B5KGRzdCArIGkgKiBCUFMsIHZhbHMsIHNpemVvZih2YWxzKSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEU0KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBob3Jpem9udGFsCisgIGNvbnN0IGludCBBID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbLTFdOworICBjb25zdCBpbnQgQyA9IGRzdFstMSArIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBFID0gZHN0Wy0xICsgMyAqIEJQU107CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoQSwgQiwgQykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEIsIEMsIEQpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhDLCBELCBFKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoRCwgRSwgRSkpOworfQorCitzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107CisgIGRjID4+PSAzOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBtZW1zZXQoZHN0ICsgaSAqIEJQUywgZGMsIDQpOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOworICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOworICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBEU1QoMCwgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEosIEssIEwpOworICBEU1QoMSwgMykgPSBEU1QoMCwgMikgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEksIEosIEspOworICBEU1QoMiwgMykgPSBEU1QoMSwgMikgPSBEU1QoMCwgMSkgICAgICAgICAgICAgPSBBVkczKFgsIEksIEopOworICBEU1QoMywgMykgPSBEU1QoMiwgMikgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMCkgPSBBVkczKEEsIFgsIEkpOworICAgICAgICAgICAgICBEU1QoMywgMikgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMCkgPSBBVkczKEIsIEEsIFgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMSkgPSBEU1QoMiwgMCkgPSBBVkczKEMsIEIsIEEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU1QoMywgMCkgPSBBVkczKEQsIEMsIEIpOworfQorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1MZWZ0CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBjb25zdCBpbnQgRSA9IGRzdFs0IC0gQlBTXTsKKyAgY29uc3QgaW50IEYgPSBkc3RbNSAtIEJQU107CisgIGNvbnN0IGludCBHID0gZHN0WzYgLSBCUFNdOworICBjb25zdCBpbnQgSCA9IGRzdFs3IC0gQlBTXTsKKyAgRFNUKDAsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDEsIDApID0gRFNUKDAsIDEpICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhCLCBDLCBEKTsKKyAgRFNUKDIsIDApID0gRFNUKDEsIDEpID0gRFNUKDAsIDIpICAgICAgICAgICAgID0gQVZHMyhDLCBELCBFKTsKKyAgRFNUKDMsIDApID0gRFNUKDIsIDEpID0gRFNUKDEsIDIpID0gRFNUKDAsIDMpID0gQVZHMyhELCBFLCBGKTsKKyAgICAgICAgICAgICAgRFNUKDMsIDEpID0gRFNUKDIsIDIpID0gRFNUKDEsIDMpID0gQVZHMyhFLCBGLCBHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDIpID0gRFNUKDIsIDMpID0gQVZHMyhGLCBHLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNUKDMsIDMpID0gQVZHMyhHLCBILCBIKTsKK30KKworc3RhdGljIHZvaWQgVlI0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLVJpZ2h0CisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIERTVCgwLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoWCwgQSk7CisgIERTVCgxLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoQSwgQik7CisgIERTVCgyLCAwKSA9IERTVCgzLCAyKSA9IEFWRzIoQiwgQyk7CisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzIoQywgRCk7CisKKyAgRFNUKDAsIDMpID0gICAgICAgICAgICAgQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDAsIDIpID0gICAgICAgICAgICAgQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDEsIDMpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDIsIDMpID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDIsIDEpID0gRFNUKDMsIDMpID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDMsIDEpID0gICAgICAgICAgICAgQVZHMyhCLCBDLCBEKTsKK30KKworc3RhdGljIHZvaWQgVkw0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLUxlZnQKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIGNvbnN0IGludCBFID0gZHN0WzQgLSBCUFNdOworICBjb25zdCBpbnQgRiA9IGRzdFs1IC0gQlBTXTsKKyAgY29uc3QgaW50IEcgPSBkc3RbNiAtIEJQU107CisgIGNvbnN0IGludCBIID0gZHN0WzcgLSBCUFNdOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOworCisgIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QpIHsgICAvLyBIb3Jpem9udGFsLVVwCisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgICAgRFNUKDAsIDMpID0gRFNUKDEsIDMpID0gRFNUKDIsIDMpID0gRFNUKDMsIDMpID0gTDsKK30KKworc3RhdGljIHZvaWQgSEQ0KHVpbnQ4X3QqIGRzdCkgeyAgLy8gSG9yaXpvbnRhbC1Eb3duCisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCitWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTRbTlVNX0JNT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEKKworc3RhdGljIHZvaWQgVkU4dXYodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbWVtY3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgOCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEU4dXYodWludDhfdCogZHN0KSB7ICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBtZW1zZXQoZHN0LCBkc3RbLTFdLCA4KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKy8vIGhlbHBlciBmb3IgY2hyb21hLURDIHByZWRpY3Rpb25zCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQ4eDh1dih1aW50OF90IHZhbHVlLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIDgpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2KHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gREMKKyAgaW50IGRjMCA9IDg7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMwICs9IGRzdFtpIC0gQlBTXSArIGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIFB1dDh4OHV2KGRjMCA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcworICBpbnQgZGMwID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0W2kgLSBCUFNdOworICB9CisgIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcworICBpbnQgZGMwID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgUHV0OHg4dXYoZGMwID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQyB3aXRoIG5vdGhpbmcKKyAgUHV0OHg4dXYoMHg4MCwgZHN0KTsKK30KKworVlA4UHJlZEZ1bmMgVlA4UHJlZENocm9tYThbTlVNX0JfRENfTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisKKy8vIDQgcGl4ZWxzIGluLCAyIHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIGRvX2ZpbHRlcjIodWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKSArIFZQOGtzY2xpcDFbcDEgLSBxMV07ICAvLyBpbiBbLTg5Myw4OTJdCisgIGNvbnN0IGludCBhMSA9IFZQOGtzY2xpcDJbKGEgKyA0KSA+PiAzXTsgICAgICAgICAgICAvLyBpbiBbLTE2LDE1XQorICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIHBbLXN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKK30KKworLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNCh1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgY29uc3QgaW50IGEgPSAzICogKHEwIC0gcDApOworICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107CisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgY29uc3QgaW50IGEzID0gKGExICsgMSkgPj4gMTsKKyAgcFstMipzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEzXTsKKyAgcFstICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGEyXTsKKyAgcFsgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEzXTsKK30KKworLy8gNiBwaXhlbHMgaW4sIDYgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNih1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDIgPSBwWy0zKnN0ZXBdLCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF07CisgIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIqc3RlcF07CisgIGNvbnN0IGludCBhID0gVlA4a3NjbGlwMVszICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXV07CisgIC8vIGEgaXMgaW4gWy0xMjgsMTI3XSwgYTEgaW4gWy0yNywyN10sIGEyIGluIFstMTgsMThdIGFuZCBhMyBpbiBbLTksOV0KKyAgY29uc3QgaW50IGExID0gKDI3ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMyAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEyID0gKDE4ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMiAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEzID0gKDkgICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMSAqIGEgKyA3KSAqIDkpID4+IDcKKyAgcFstMypzdGVwXSA9IFZQOGtjbGlwMVtwMiArIGEzXTsKKyAgcFstMipzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEyXTsKKyAgcFstICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGExXTsKKyAgcFsgICAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKKyAgcFsgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEyXTsKKyAgcFsgMipzdGVwXSA9IFZQOGtjbGlwMVtxMiAtIGEzXTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIHJldHVybiAoVlA4a2FiczBbcDEgLSBwMF0gPiB0aHJlc2gpIHx8IChWUDhrYWJzMFtxMSAtIHEwXSA+IHRocmVzaCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKCg0ICogVlA4a2FiczBbcDAgLSBxMF0gKyBWUDhrYWJzMFtwMSAtIHExXSkgPD0gdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyMihjb25zdCB1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgdCwgaW50IGl0KSB7CisgIGNvbnN0IGludCBwMyA9IHBbLTQgKiBzdGVwXSwgcDIgPSBwWy0zICogc3RlcF0sIHAxID0gcFstMiAqIHN0ZXBdOworICBjb25zdCBpbnQgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdOworICBjb25zdCBpbnQgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMiAqIHN0ZXBdLCBxMyA9IHBbMyAqIHN0ZXBdOworICBpZiAoKDQgKiBWUDhrYWJzMFtwMCAtIHEwXSArIFZQOGthYnMwW3AxIC0gcTFdKSA+IHQpIHJldHVybiAwOworICByZXR1cm4gVlA4a2FiczBbcDMgLSBwMl0gPD0gaXQgJiYgVlA4a2FiczBbcDIgLSBwMV0gPD0gaXQgJiYKKyAgICAgICAgIFZQOGthYnMwW3AxIC0gcDBdIDw9IGl0ICYmIFZQOGthYnMwW3EzIC0gcTJdIDw9IGl0ICYmCisgICAgICAgICBWUDhrYWJzMFtxMiAtIHExXSA8PSBpdCAmJiBWUDhrYWJzMFtxMSAtIHEwXSA8PSBpdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChuZWVkc19maWx0ZXIocCArIGksIHN0cmlkZSwgdGhyZXNoMikpIHsKKyAgICAgIGRvX2ZpbHRlcjIocCArIGksIHN0cmlkZSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmIChuZWVkc19maWx0ZXIocCArIGkgKiBzdHJpZGUsIDEsIHRocmVzaDIpKSB7CisgICAgICBkb19maWx0ZXIyKHAgKyBpICogc3RyaWRlLCAxKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb19maWx0ZXI2KHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG9fZmlsdGVyNChwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIERpdGhlckNvbWJpbmU4eDgoY29uc3QgdWludDhfdCogZGl0aGVyLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKSB7CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgICAgY29uc3QgaW50IGRlbHRhMCA9IGRpdGhlcltpXSAtIFZQOF9ESVRIRVJfQU1QX0NFTlRFUjsKKyAgICAgIGNvbnN0IGludCBkZWx0YTEgPQorICAgICAgICAgIChkZWx0YTAgKyBWUDhfRElUSEVSX0RFU0NBTEVfUk9VTkRFUikgPj4gVlA4X0RJVEhFUl9ERVNDQUxFOworICAgICAgZHN0W2ldID0gY2xpcF84YigoaW50KWRzdFtpXSArIGRlbHRhMSk7CisgICAgfQorICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIGRpdGhlciArPSA4OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQOERlY0lkY3QyIFZQOFRyYW5zZm9ybTsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtQUMzOworVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1VVjsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtREM7CitWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDVVY7CisKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNjsKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNjsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjg7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4OworVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2aTsKK1ZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNmk7CitWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4aTsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjhpOworVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTY7CitWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNjsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2aTsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2aTsKKwordm9pZCAoKlZQOERpdGhlckNvbWJpbmU4eDgpKGNvbnN0IHVpbnQ4X3QqIGRpdGhlciwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKTsKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1TQSh2b2lkKTsKKworc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gZGVjX2xhc3RfY3B1aW5mb191c2VkID0KKyAgICAoVlA4Q1BVSW5mbykmZGVjX2xhc3RfY3B1aW5mb191c2VkOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdCh2b2lkKSB7CisgIGlmIChkZWNfbGFzdF9jcHVpbmZvX3VzZWQgPT0gVlA4R2V0Q1BVSW5mbykgcmV0dXJuOworCisgIFZQOEluaXRDbGlwVGFibGVzKCk7CisKKyAgVlA4VHJhbnNmb3JtV0hUID0gVHJhbnNmb3JtV0hUOworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud287CisgIFZQOFRyYW5zZm9ybVVWID0gVHJhbnNmb3JtVVY7CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtREM7CisgIFZQOFRyYW5zZm9ybURDVVYgPSBUcmFuc2Zvcm1EQ1VWOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzM7CisKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2OworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTY7CisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjg7CisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjg7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpOworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aTsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGk7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2OworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aTsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmk7CisKKyAgVlA4UHJlZEx1bWE0WzBdID0gREM0OworICBWUDhQcmVkTHVtYTRbMV0gPSBUTTQ7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNDsKKyAgVlA4UHJlZEx1bWE0WzNdID0gSEU0OworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDQ7CisgIFZQOFByZWRMdW1hNFs1XSA9IFZSNDsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0OworICBWUDhQcmVkTHVtYTRbN10gPSBWTDQ7CisgIFZQOFByZWRMdW1hNFs4XSA9IEhENDsKKyAgVlA4UHJlZEx1bWE0WzldID0gSFU0OworCisgIFZQOFByZWRMdW1hMTZbMF0gPSBEQzE2OworICBWUDhQcmVkTHVtYTE2WzFdID0gVE0xNjsKKyAgVlA4UHJlZEx1bWExNlsyXSA9IFZFMTY7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2OworICBWUDhQcmVkTHVtYTE2WzRdID0gREMxNk5vVG9wOworICBWUDhQcmVkTHVtYTE2WzVdID0gREMxNk5vTGVmdDsKKyAgVlA4UHJlZEx1bWExNls2XSA9IERDMTZOb1RvcExlZnQ7CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1djsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUTTh1djsKKyAgVlA4UHJlZENocm9tYThbMl0gPSBWRTh1djsKKyAgVlA4UHJlZENocm9tYThbM10gPSBIRTh1djsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0OworICBWUDhQcmVkQ2hyb21hOFs2XSA9IERDOHV2Tm9Ub3BMZWZ0OworCisgIFZQOERpdGhlckNvbWJpbmU4eDggPSBEaXRoZXJDb21iaW5lOHg4OworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhEc3BJbml0U1NFMigpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgICBWUDhEc3BJbml0U1NFNDEoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTkVPTikpIHsKKyAgICAgIFZQOERzcEluaXRORU9OKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOERzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOERzcEluaXRNU0EoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICBkZWNfbGFzdF9jcHVpbmZvX3VzZWQgPSBWUDhHZXRDUFVJbmZvOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19jbGlwX3RhYmxlcy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19jbGlwX3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWU3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX2NsaXBfdGFibGVzLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDbGlwcGluZyB0YWJsZXMgZm9yIGZpbHRlcmluZworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2RlZmluZSBVU0VfU1RBVElDX1RBQkxFUyAgICAgLy8gdW5kZWZpbmUgdG8gaGF2ZSBydW4tdGltZSB0YWJsZSBpbml0aWFsaXphdGlvbgorCisjaWZkZWYgVVNFX1NUQVRJQ19UQUJMRVMKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXSA9IHsKKyAgMHhmZiwgMHhmZSwgMHhmZCwgMHhmYywgMHhmYiwgMHhmYSwgMHhmOSwgMHhmOCwgMHhmNywgMHhmNiwgMHhmNSwgMHhmNCwKKyAgMHhmMywgMHhmMiwgMHhmMSwgMHhmMCwgMHhlZiwgMHhlZSwgMHhlZCwgMHhlYywgMHhlYiwgMHhlYSwgMHhlOSwgMHhlOCwKKyAgMHhlNywgMHhlNiwgMHhlNSwgMHhlNCwgMHhlMywgMHhlMiwgMHhlMSwgMHhlMCwgMHhkZiwgMHhkZSwgMHhkZCwgMHhkYywKKyAgMHhkYiwgMHhkYSwgMHhkOSwgMHhkOCwgMHhkNywgMHhkNiwgMHhkNSwgMHhkNCwgMHhkMywgMHhkMiwgMHhkMSwgMHhkMCwKKyAgMHhjZiwgMHhjZSwgMHhjZCwgMHhjYywgMHhjYiwgMHhjYSwgMHhjOSwgMHhjOCwgMHhjNywgMHhjNiwgMHhjNSwgMHhjNCwKKyAgMHhjMywgMHhjMiwgMHhjMSwgMHhjMCwgMHhiZiwgMHhiZSwgMHhiZCwgMHhiYywgMHhiYiwgMHhiYSwgMHhiOSwgMHhiOCwKKyAgMHhiNywgMHhiNiwgMHhiNSwgMHhiNCwgMHhiMywgMHhiMiwgMHhiMSwgMHhiMCwgMHhhZiwgMHhhZSwgMHhhZCwgMHhhYywKKyAgMHhhYiwgMHhhYSwgMHhhOSwgMHhhOCwgMHhhNywgMHhhNiwgMHhhNSwgMHhhNCwgMHhhMywgMHhhMiwgMHhhMSwgMHhhMCwKKyAgMHg5ZiwgMHg5ZSwgMHg5ZCwgMHg5YywgMHg5YiwgMHg5YSwgMHg5OSwgMHg5OCwgMHg5NywgMHg5NiwgMHg5NSwgMHg5NCwKKyAgMHg5MywgMHg5MiwgMHg5MSwgMHg5MCwgMHg4ZiwgMHg4ZSwgMHg4ZCwgMHg4YywgMHg4YiwgMHg4YSwgMHg4OSwgMHg4OCwKKyAgMHg4NywgMHg4NiwgMHg4NSwgMHg4NCwgMHg4MywgMHg4MiwgMHg4MSwgMHg4MCwgMHg3ZiwgMHg3ZSwgMHg3ZCwgMHg3YywKKyAgMHg3YiwgMHg3YSwgMHg3OSwgMHg3OCwgMHg3NywgMHg3NiwgMHg3NSwgMHg3NCwgMHg3MywgMHg3MiwgMHg3MSwgMHg3MCwKKyAgMHg2ZiwgMHg2ZSwgMHg2ZCwgMHg2YywgMHg2YiwgMHg2YSwgMHg2OSwgMHg2OCwgMHg2NywgMHg2NiwgMHg2NSwgMHg2NCwKKyAgMHg2MywgMHg2MiwgMHg2MSwgMHg2MCwgMHg1ZiwgMHg1ZSwgMHg1ZCwgMHg1YywgMHg1YiwgMHg1YSwgMHg1OSwgMHg1OCwKKyAgMHg1NywgMHg1NiwgMHg1NSwgMHg1NCwgMHg1MywgMHg1MiwgMHg1MSwgMHg1MCwgMHg0ZiwgMHg0ZSwgMHg0ZCwgMHg0YywKKyAgMHg0YiwgMHg0YSwgMHg0OSwgMHg0OCwgMHg0NywgMHg0NiwgMHg0NSwgMHg0NCwgMHg0MywgMHg0MiwgMHg0MSwgMHg0MCwKKyAgMHgzZiwgMHgzZSwgMHgzZCwgMHgzYywgMHgzYiwgMHgzYSwgMHgzOSwgMHgzOCwgMHgzNywgMHgzNiwgMHgzNSwgMHgzNCwKKyAgMHgzMywgMHgzMiwgMHgzMSwgMHgzMCwgMHgyZiwgMHgyZSwgMHgyZCwgMHgyYywgMHgyYiwgMHgyYSwgMHgyOSwgMHgyOCwKKyAgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwgMHgyMSwgMHgyMCwgMHgxZiwgMHgxZSwgMHgxZCwgMHgxYywKKyAgMHgxYiwgMHgxYSwgMHgxOSwgMHgxOCwgMHgxNywgMHgxNiwgMHgxNSwgMHgxNCwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwKKyAgMHgwZiwgMHgwZSwgMHgwZCwgMHgwYywgMHgwYiwgMHgwYSwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNiwgMHgwNSwgMHgwNCwKKyAgMHgwMywgMHgwMiwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKKyAgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwKKyAgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKKyAgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywKKyAgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwKKyAgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKKyAgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywKKyAgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwKKyAgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg4MCwKKyAgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywKKyAgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwKKyAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwKKyAgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywKKyAgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKKyAgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwKKyAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywKKyAgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZgorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXSA9IHsKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKKyAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwKKyAgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKKyAgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywKKyAgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKKyAgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwKKyAgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKKyAgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywKKyAgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKKyAgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwKKyAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwKKyAgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKyAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKKyAgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwKKyAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwKKyAgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKKyAgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywKKyAgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwKKyAgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwKKyAgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKyAgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZgorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBzY2xpcDJbMTEyICsgMTEyICsgMV0gPSB7CisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsIDB4ZjAsCisgIDB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsCisgIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisgIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsaXAxWzI1NSArIDUxMSArIDFdID0geworICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAorICAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LAorICAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLAorICAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLAorICAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LAorICAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLAorICAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLAorICAweDVkLCAweDVlLCAweDVmLCAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LAorICAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLAorICAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLAorICAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LAorICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLAorICAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLAorICAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAorICAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LAorICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLAorICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLAorICAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorICAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmCit9OworCisjZWxzZQorCisvLyB1bmluaXRpYWxpemVkIHRhYmxlcworc3RhdGljIHVpbnQ4X3QgYWJzMFsyNTUgKyAyNTUgKyAxXTsKK3N0YXRpYyBpbnQ4X3Qgc2NsaXAxWzEwMjAgKyAxMDIwICsgMV07CitzdGF0aWMgaW50OF90IHNjbGlwMlsxMTIgKyAxMTIgKyAxXTsKK3N0YXRpYyB1aW50OF90IGNsaXAxWzI1NSArIDUxMSArIDFdOworCisvLyBXZSBkZWNsYXJlIHRoaXMgdmFyaWFibGUgJ3ZvbGF0aWxlJyB0byBwcmV2ZW50IGluc3RydWN0aW9uIHJlb3JkZXJpbmcKKy8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQorc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOworCisjZW5kaWYKKworY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAxID0gJnNjbGlwMVsxMDIwXTsKK2NvbnN0IGludDhfdCogY29uc3QgVlA4a3NjbGlwMiA9ICZzY2xpcDJbMTEyXTsKK2NvbnN0IHVpbnQ4X3QqIGNvbnN0IFZQOGtjbGlwMSA9ICZjbGlwMVsyNTVdOworY29uc3QgdWludDhfdCogY29uc3QgVlA4a2FiczAgPSAmYWJzMFsyNTVdOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4SW5pdENsaXBUYWJsZXModm9pZCkgeworI2lmICFkZWZpbmVkKFVTRV9TVEFUSUNfVEFCTEVTKQorICBpbnQgaTsKKyAgaWYgKCF0YWJsZXNfb2spIHsKKyAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NTsgKytpKSB7CisgICAgICBhYnMwWzI1NSArIGldID0gKGkgPCAwKSA/IC1pIDogaTsKKyAgICB9CisgICAgZm9yIChpID0gLTEwMjA7IGkgPD0gMTAyMDsgKytpKSB7CisgICAgICBzY2xpcDFbMTAyMCArIGldID0gKGkgPCAtMTI4KSA/IC0xMjggOiAoaSA+IDEyNykgPyAxMjcgOiBpOworICAgIH0KKyAgICBmb3IgKGkgPSAtMTEyOyBpIDw9IDExMjsgKytpKSB7CisgICAgICBzY2xpcDJbMTEyICsgaV0gPSAoaSA8IC0xNikgPyAtMTYgOiAoaSA+IDE1KSA/IDE1IDogaTsKKyAgICB9CisgICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTUgKyAyNTU7ICsraSkgeworICAgICAgY2xpcDFbMjU1ICsgaV0gPSAoaSA8IDApID8gMCA6IChpID4gMjU1KSA/IDI1NSA6IGk7CisgICAgfQorICAgIHRhYmxlc19vayA9IDE7CisgIH0KKyNlbmRpZiAgICAvLyBVU0VfU1RBVElDX1RBQkxFUworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19taXBzMzIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmODlhMQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfbWlwczMyLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlICIuL21pcHNfbWFjcm8uaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgYWJzX21pcHMzMihpbnQgeCkgeworICBjb25zdCBpbnQgc2lnbiA9IHggPj4gMzE7CisgIHJldHVybiAoeCBeIHNpZ24pIC0gc2lnbjsKK30KKworLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCkgKyBWUDhrc2NsaXAxW3AxIC0gcTFdOworICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107CisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgcFstc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMl07CisgIHBbICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworfQorCisvLyA0IHBpeGVscyBpbiwgNCBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXI0KHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKTsKKyAgY29uc3QgaW50IGExID0gVlA4a3NjbGlwMlsoYSArIDQpID4+IDNdOworICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIGNvbnN0IGludCBhMyA9IChhMSArIDEpID4+IDE7CisgIHBbLTIgKiBzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEzXTsKKyAgcFstICAgIHN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07CisgIHBbICAgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEzXTsKK30KKworLy8gNiBwaXhlbHMgaW4sIDYgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNih1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDIgPSBwWy0zICogc3RlcF0sIHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdOworICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyICogc3RlcF07CisgIGNvbnN0IGludCBhID0gVlA4a3NjbGlwMVszICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXV07CisgIC8vIGEgaXMgaW4gWy0xMjgsMTI3XSwgYTEgaW4gWy0yNywyN10sIGEyIGluIFstMTgsMThdIGFuZCBhMyBpbiBbLTksOV0KKyAgY29uc3QgaW50IGExID0gKDI3ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMyAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEyID0gKDE4ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMiAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEzID0gKDkgICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMSAqIGEgKyA3KSAqIDkpID4+IDcKKyAgcFstMyAqIHN0ZXBdID0gVlA4a2NsaXAxW3AyICsgYTNdOworICBwWy0yICogc3RlcF0gPSBWUDhrY2xpcDFbcDEgKyBhMl07CisgIHBbLSAgICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGExXTsKKyAgcFsgICAgICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworICBwWyAgICAgc3RlcF0gPSBWUDhrY2xpcDFbcTEgLSBhMl07CisgIHBbIDIgKiBzdGVwXSA9IFZQOGtjbGlwMVtxMiAtIGEzXTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgcmV0dXJuIChhYnNfbWlwczMyKHAxIC0gcDApID4gdGhyZXNoKSB8fCAoYWJzX21pcHMzMihxMSAtIHEwKSA+IHRocmVzaCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKCg0ICogYWJzX21pcHMzMihwMCAtIHEwKSArIGFic19taXBzMzIocDEgLSBxMSkpIDw9IHQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcjIoY29uc3QgdWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgeworICBjb25zdCBpbnQgcDMgPSBwWy00ICogc3RlcF0sIHAyID0gcFstMyAqIHN0ZXBdOworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF07CisgIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIgKiBzdGVwXSwgcTMgPSBwWzMgKiBzdGVwXTsKKyAgaWYgKCg0ICogYWJzX21pcHMzMihwMCAtIHEwKSArIGFic19taXBzMzIocDEgLSBxMSkpID4gdCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBhYnNfbWlwczMyKHAzIC0gcDIpIDw9IGl0ICYmIGFic19taXBzMzIocDIgLSBwMSkgPD0gaXQgJiYKKyAgICAgICAgIGFic19taXBzMzIocDEgLSBwMCkgPD0gaXQgJiYgYWJzX21pcHMzMihxMyAtIHEyKSA8PSBpdCAmJgorICAgICAgICAgYWJzX21pcHMzMihxMiAtIHExKSA8PSBpdCAmJiBhYnNfbWlwczMyKHExIC0gcTApIDw9IGl0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb19maWx0ZXI2KHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG9fZmlsdGVyNChwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpLCBzdHJpZGUsIHRocmVzaDIpKSB7CisgICAgICBkb19maWx0ZXIyKHAgKyBpLCBzdHJpZGUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gyKSkgeworICAgICAgZG9fZmlsdGVyMihwICsgaSAqIHN0cmlkZSwgMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZShjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNDsKKyAgaW50IHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKyAgaW50MTZfdCogcF9pbiA9IChpbnQxNl90KilpbjsKKworICAvLyBsb29wcyB1bnJvbGxlZCBhbmQgbWVyZ2VkIHRvIGF2b2lkIHVzYWdlIG9mIHRtcCBidWZmZXIKKyAgLy8gYW5kIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3RhbGxzLiBNVUwgbWFjcm8gaXMgd3JpdHRlbgorICAvLyBpbiBhc3NlbWJsZXIgYW5kIGlubGluZWQKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibGggICAgICAgJVt0ZW1wMF0sICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA4XSwgIDE2KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDRdLCAgOCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTJdLCAyNCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDBdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOF0sICAlW3RlbXA0XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDEyXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxXSwgIDIoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDVdLCAgMTAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wOV0sICAxOCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxM10sIDI2KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMl0sICA0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA2XSwgIDEyKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDEwXSwgMjAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTRdLCAyOCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW3RlbXAxMl0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOF0sICAlW3RlbXAxNl0sICVbdGVtcDRdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDE2XSwgJVt0ZW1wNF0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMV0sICAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAzXSwgIDYoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDddLCAgMTQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTFdLCAyMiglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxNV0sIDMwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEyXSwgJVt0ZW1wMF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA5XSwgICVbdGVtcDVdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTNdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDldLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEzXSwgJVt0ZW1wMV0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDE0XSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNl0sICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA1XSwgICVbdGVtcDE2XSwgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMF0sICVbdGVtcDZdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTBdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDEwXSwgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAlW3RlbXAxNF0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxNl0sICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA2XSwgICVbdGVtcDE2XSwgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE0XSwgJVt0ZW1wMl0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDE1XSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAzXSwgICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDExXSwgJVt0ZW1wN10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCA0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgIDQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMV0sICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE1XSwgJVt0ZW1wM10sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDE2XSwgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDddLCAgJVt0ZW1wMTZdLCAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXA4XSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEwXSwgJVt0ZW1wOV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMV0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDEwXSwgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wOV0sICAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMl0sICVbdGVtcDE0XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTNdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNV0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA5XSwgICVbdGVtcDE0XSwgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTNdLCAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTRdLCAlW3RlbXAwXSwgICVbdGVtcDJdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAzXSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxM10sICVbdGVtcDJdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMl0sICAlW3RlbXA0XSwgICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMV0sICAlW3RlbXA3XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDddLCAgJVt0ZW1wNV0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXAxNl0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wOF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTBdLCAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNV0sICVbdGVtcDEyXSwgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDEwXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA5XSwgICVbdGVtcDE0XSwgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wM10sICAlW3RlbXAwXSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTNdLCAlW3RlbXAyXSwgICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDddLCAgJVt0ZW1wNF0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDZdLCAgJHplcm8sICAgICAyNTUgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMV0sICAwKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxXSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA1XSwgIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE4XSwgMSswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMV0sICAwKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMThdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxOF0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxMV0sIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMThdLCAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDFdLCAgMiswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMThdLCAxKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxXSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA4XSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE4XSwgMyswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMV0sICAyKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMThdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxOF0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxNl0sIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMThdLCAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE4XSwgMyswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMisxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDEyXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wOF0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA4XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDZmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wOF0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMTFdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxMV0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE2XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTZdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCA3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxN10sIDhmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAiODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCsxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMysxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMisyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDBdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wOF0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMV0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDExXSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTZdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAxNl0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDlmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiOTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE3XSwgMTBmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA4XSwgICVbdGVtcDZdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICIxMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTJdLCAxMWYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgIjExOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA5XSwgIDEyZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAiMTI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCsyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMysyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMiszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDRdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMl0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wOF0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMV0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDExXSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTZdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAxNl0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDEzZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiMTM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE3XSwgMTRmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA4XSwgICVbdGVtcDZdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICIxNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTJdLCAxNWYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgIjE1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA5XSwgIDE2ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAiMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMyszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSksCisgICAgICBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLAorICAgICAgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksIFt0ZW1wMTddIj0mciIodGVtcDE3KSwKKyAgICAgIFt0ZW1wMThdIj0mciIodGVtcDE4KQorICAgIDogW2luXSJyIihwX2luKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOEluaXRDbGlwVGFibGVzKCk7CisKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2OworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4OworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4OworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOworCisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2OworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aTsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmk7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19taXBzX2RzcF9yMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTY4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSw5OTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgIi4vbWlwc19tYWNyby5oIgorCitzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKworI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1EQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTA7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgImxoICAgICAgICAgICAgICAgJVt0ZW1wNV0sICAwKCVbaW5dKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDQgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDE2LCAxNiAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDMgICAgICAgICAgIFxuXHQiCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDEsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAzLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCkKKyAgICBTVE9SRV9TQVRfU1VNX1gyKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsCisgICAgICAgICAgICAgICAgICAgICBkc3QsIDAsIDEsIDIsIDMsIEJQUykKKworICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTAoKQorICAgIDogW2luXSJyIihpbiksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDMyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBhID0gaW5bMF0gKyA0OworICBpbnQgYzQgPSBNVUwoaW5bNF0sIGtDMik7CisgIGNvbnN0IGludCBkNCA9IE1VTChpbls0XSwga0MxKTsKKyAgY29uc3QgaW50IGMxID0gTVVMKGluWzFdLCBrQzIpOworICBjb25zdCBpbnQgZDEgPSBNVUwoaW5bMV0sIGtDMSk7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiaW5zICAgICAgICAgICAgICAlW2M0XSwgICAgICAlW2Q0XSwgICAgIDE2LCAgICAgICAxNiAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDFdLCAgICVbYV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNF0sICAgJVtkMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMiwgdGVtcDMsIHRlbXAxLCBjNCkKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA1XSwgICAlW2MxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNISUZUX1JfU1VNX1gyKHRlbXAxLCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMiwgdGVtcDksIHRlbXAxMCwgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgdGVtcDIsIHRlbXAyLCB0ZW1wMywgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDQsIHRlbXA1KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDMsIHRlbXA1LCB0ZW1wMTEsIHRlbXAxMiwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDEzLCB0ZW1wMTQsIHRlbXAzLCB0ZW1wMTUsIHRlbXA1LCB0ZW1wMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDExLCB0ZW1wMTcsIHRlbXAzLCB0ZW1wNSwgdGVtcDExLCB0ZW1wMTIpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXAxMiwgdGVtcDE4LCB0ZW1wNywgdGVtcDYsIHRlbXAxLCB0ZW1wOCwgdGVtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA0LCB0ZW1wNywgdGVtcDYsIHRlbXAxMCwgdGVtcDkpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wMTMsIHRlbXAxNCwgdGVtcDMsIHRlbXAxNSwgdGVtcDUsIHRlbXAxNiwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDE3LCB0ZW1wMTIsIHRlbXAxOCwgdGVtcDEsIHRlbXA4LCB0ZW1wMiwgdGVtcDQsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wNywgdGVtcDYsIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpLAorICAgICAgW2M0XSIrJnIiKGM0KQorICAgIDogW2RzdF0iciIoZHN0KSwgW2FdInIiKGEpLCBbZDFdInIiKGQxKSwgW2Q0XSJyIihkNCksIFtjMV0iciIoYzEpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTg7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMl0sICAgMTYoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9JTl9YMih0ZW1wNSwgdGVtcDYsIDI0LCAyNikKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wMikKKyAgICBMT0FEX0lOX1gyKHRlbXAxLCB0ZW1wMiwgOCwgMTApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMCwgdGVtcDgsIHRlbXA5LCB0ZW1wNywgdGVtcDEsIHRlbXAyLCB0ZW1wNSwgdGVtcDYsCisgICAgICAgICAgICAgICAgICB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTIpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDgsIHRlbXA3LCB0ZW1wMTAsIHRlbXA5KQorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE3XSwgIDQoJVtpbl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE4XSwgIDIwKCVbaW5dKSAgICAgICAgICAgICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA4KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNiwgdGVtcDQsIHRlbXA3KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgpCisgICAgTE9BRF9JTl9YMih0ZW1wMTcsIHRlbXAxOCwgMTIsIDE0KQorICAgIExPQURfSU5fWDIodGVtcDksIHRlbXAxMCwgMjgsIDMwKQorICAgIE1VTF9TSElGVF9TVU0odGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDQsIHRlbXAxNywKKyAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDE0LCB0ZW1wMTEsIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsIHRlbXA5LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICB0ZW1wMTUsIHRlbXA0LCB0ZW1wMTYsIHRlbXAxNykKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDE3LCB0ZW1wOCwgdGVtcDgsIHRlbXAxMSkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXA3LCB0ZW1wMTIpCisKKyAgICAvLyBob3Jpem9udGFsCisgICAgU1JBXzE2KHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDYsIHRlbXA1LCB0ZW1wMikKKyAgICBTUkFfMTYodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMywgdGVtcDQsIHRlbXAxNywgdGVtcDgpCisgICAgInJlcGwucGggICAgICAgICAgJVt0ZW1wMl0sICAgMHg0ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDMsIHRlbXA4LCB0ZW1wMTcsIHRlbXA0KQorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAyLCB0ZW1wNCwgdGVtcDEsIHRlbXAzKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNywgdGVtcDYsIHRlbXA4KQorICAgIE1VTF9TSElGVF9TVU0odGVtcDEsIHRlbXAzLCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMTMsIHRlbXAxNywgdGVtcDE4LAorICAgICAgICAgICAgICAgICAgdGVtcDMsIHRlbXAxMywgdGVtcDEsIHRlbXA5LCB0ZW1wOSwgdGVtcDEzLCB0ZW1wMTEsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgIHRlbXA2LCB0ZW1wMTcsIHRlbXA4LCB0ZW1wMTgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNiwgdGVtcDgsIHRlbXAxOCwgdGVtcDE3LCB0ZW1wMTEsIHRlbXAxNSwgdGVtcDEyLCB0ZW1wMTYsCisgICAgICAgICAgICAgICAgICB0ZW1wOCwgdGVtcDE1LCB0ZW1wNiwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxNiwgdGVtcDEwLCB0ZW1wMTQsCisgICAgICAgICAgICAgICAgICB0ZW1wMTgsIHRlbXAxMiwgdGVtcDE3LCB0ZW1wMTYpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDEsIHRlbXAzLCB0ZW1wOSwgdGVtcDEzKQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXA2LCB0ZW1wOCwgdGVtcDExLCB0ZW1wMTUpCisgICAgU0hJRlRfUl9TVU1fWDIodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsCisgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMiwgdGVtcDQsIHRlbXA1LCB0ZW1wNywgdGVtcDMsIHRlbXAxLCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICB0ZW1wNikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA5LCB0ZW1wMTIsIHRlbXAxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMTEsIHRlbXAxMCwgdGVtcDE1LCB0ZW1wMTQpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUsIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDE1KQorICAgIFNUT1JFX1NBVF9TVU1fWDIodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXA5LCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDEzLCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpCisgICAgOiBbZHN0XSJyIihkc3QpLCBbaW5dInIiKGluKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNih1aW50OF90KiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDFdLCAgJVtoc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3NpemVdLCAgICVbc2l6ZV0sICAgICAgICAtMSAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMl0sICAlW2hzdHJpZGVdLCAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICAgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA0XSwgICVbdGVtcDJdLCAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICVbdGVtcDddLCAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA2XSwgICVbdGVtcDNdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA1XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDldLCAgJVt0ZW1wM10oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxMF0sICVbdGVtcDFdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTFdLCAlW3RlbXA2XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDEyXSwgJVtoc3RyaWRlXSglW3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxM10sICVbdGVtcDJdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTRdLCAlW3RlbXA0XSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMTBdLCAgICAgICVbdGVtcDddICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAxMl0gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgMiAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wM10sICAgICAgICVbdGVtcDRdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDE1XSwgICAgICAlW3RocmVzaDJdICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wNl0sICAlW3RlbXAxXSwgICAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDExXSwgICAgICAlW3RlbXA4XSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wOF0sICAgICAgICVbdGVtcDldICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA1XSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAxMF0gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDVdLCAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTRdLCAgICAgICVbdGVtcDEzXSAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbHQgICAgICAgJVt0ZW1wNV0sICAlW2hldl90aHJlc2hdLCAgJVt0ZW1wNV0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAxM10sICAgICAgJVt0ZW1wMTJdICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICVbdGVtcDJdLCAgICAgICAyNCAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAxNV0sICVbdGVtcDEyXSwgICAgICAlW3RlbXA3XSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAxNV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDE1XSwgJVt0ZW1wMTVdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNsdCAgICAgICVbdGVtcDE1XSwgJVtoZXZfdGhyZXNoXSwgICVbdGVtcDE1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICVbdGVtcDZdLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJvciAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSwgICAgICAgJVt0ZW1wMTVdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDNdICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAlW3RlbXAyXSwgIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2hyYV9yLncgJVt0ZW1wMV0sICAlW3RlbXA1XSwgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDJdLCAgJVt0ZW1wNV0sICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbcF0sICAgICAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDI3ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxXSwgICVbdGVtcDddLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxMF0sICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICVbdGVtcDFdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaiAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAlW3RlbXAxXSwgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxNF0sICVbcF0sICAgICAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxNF0sICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxMV0sICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNl0sICAgICAgICVbdGVtcDFdICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAzXSwgICVbdGVtcDJdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNF0sICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDYzICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICA2MyAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgICAgNjMgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDcgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICA3ICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICAgICAgNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wOF0sICAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICVbdGVtcDldLCAgICAgICAlW3RlbXAzXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNl0sICAlW3RlbXAxMF0sICAgICAgJVt0ZW1wNF0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wN10sICAgICAgICVbdGVtcDRdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA3XSwgICVbdGVtcDEyXSwgICAgICAlW3RlbXAzXSAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMTBdLCAlW3BdLCAgICAgICAgICAgJVtoc3RyaWRlXSAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTNdLCAgICAgICVbdGVtcDJdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxMl0sICVbdGVtcDEwXSwgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxXSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wNV0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICVbdGVtcDZdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNV0sICAlW3RlbXA4XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wN10oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA4XSwgICVbdGVtcDldKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAwKCVbdGVtcDE1XSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgMCglW3RlbXAxMV0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgIDAoJVt0ZW1wMTRdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNV0sICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDZdLCAgMCglW3RlbXAxMF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMTJdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbc2l6ZV0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3BdLCAgICAgICVbcF0sICAgICAgICAgICAlW3ZzdHJpZGVdICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wNl0iPSZyIih0ZW1wNiksCisgICAgICBbdGVtcDddIj0mciIodGVtcDcpLFt0ZW1wOF0iPSZyIih0ZW1wOCksW3RlbXA5XSI9JnIiKHRlbXA5KSwKKyAgICAgIFt0ZW1wMTBdIj0mciIodGVtcDEwKSxbdGVtcDExXSI9JnIiKHRlbXAxMSksW3RlbXAxMl0iPSZyIih0ZW1wMTIpLAorICAgICAgW3RlbXAxM10iPSZyIih0ZW1wMTMpLFt0ZW1wMTRdIj0mciIodGVtcDE0KSxbdGVtcDE1XSI9JnIiKHRlbXAxNSksCisgICAgICBbc2l6ZV0iKyZyIihzaXplKSwgW3BdIismciIocCkKKyAgICA6IFtoc3RyaWRlXSJyIihoc3RyaWRlKSwgW3RocmVzaDJdInIiKHRocmVzaDIpLAorICAgICAgW2l0aHJlc2hdInIiKGl0aHJlc2gpLFt2c3RyaWRlXSJyIih2c3RyaWRlKSwgW2hldl90aHJlc2hdInIiKGhldl90aHJlc2gpLAorICAgICAgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IHAwLCBxMCwgcDEsIHExLCBwMiwgcTIsIHAzLCBxMzsKKyAgaW50IHN0ZXAxLCBzdGVwMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIHVpbnQ4X3QqIHBUZW1wMDsKKyAgdWludDhfdCogcFRlbXAxOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJsdHogICAgICAlW3NpemVdLCAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3N0ZXAxXSwgICAlW2hzdHJpZGVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgJVtxMF0sICAgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcDBdLCAgICAgICVbc3RlcDFdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJsYnV4ICAgICAgJVtxMV0sICAgICAgJVtoc3RyaWRlXSglW3BdKSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgICVbcDBdLCAgICAgICAgICVbcTBdICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3AxXSwgICAgICAlW3N0ZXAxXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtzdGVwMl0sICAgJVtoc3RyaWRlXSwgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDJdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICAlW3AxXSwgICAgICAgICAlW3ExXSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0sICAgICAgJVt0aHJlc2gyXSAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbGJ1eCAgICAgJVtwMl0sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImxidXggICAgICAlW3EyXSwgICAgICAlW3N0ZXAyXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtwM10sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbcDJdLCAgICAgICAgICVbcDFdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3N0ZXAyXSwgICAlW3N0ZXAyXSwgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVtwM10sICAgICAgICAgJVtwMl0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtxM10sICAgICAgJVtzdGVwMl0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgInN1YnUgICAgICAlW3AzXSwgICAgICAlW3AxXSwgICAgICAgICAlW3AwXSAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wMl0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFic3Ffcy53ICVbcDNdLCAgICAgICVbcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICAlW3EzXSwgICAgICAgICAlW3EyXSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtwVGVtcDBdLCAgJVtwXSwgICAgICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3AzXSwgICAgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzbGwgICAgICAgJVtzdGVwMV0sICAgJVt0ZW1wMV0sICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDJdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgJVtxMl0sICAgICAgICAgJVtxMV0gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhYnNxX3MudyAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxM10sICAgICAgJVtxMV0sICAgICAgICAgJVtxMF0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbcTNdLCAgICAgICVbcTNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgJVtzdGVwMV0gICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDJdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXA0XSwgICAlW3EzXSwgICAgICAgICAlW2l0aHJlc2hdICBcblx0IgorICAgICJzbHQgICAgICAgJVtwM10sICAgICAgJVtoZXZfdGhyZXNoXSwgJVtwM10gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzbHQgICAgICAlW3EzXSwgICAgICAlW2hldl90aHJlc2hdLCAlW3EzXSAgICAgICBcblx0IgorICAgICJvciAgICAgICAgJVtxM10sICAgICAgJVtxM10sICAgICAgICAgJVtwM10gICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbcTNdLCAgICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzaHJhX3IudyAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcFRlbXAxXSwgICVbcF0sICAgICAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbc3RlcDFdLCAgICVbdGVtcDJdLCAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3N0ZXAxXSwgICAlW3N0ZXAxXSwgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwMF0sICAgICAgJVtwMF0sICAgICAgICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcDFdLCAgICAgICVbcDFdLCAgICAgICAgICVbc3RlcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3EwXSwgICAgICAlW3EwXSwgICAgICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtxMV0sICAgICAgJVtxMV0sICAgICAgICAgJVtzdGVwMV0gICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgICVbcDBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAlW3EwXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNF0sICAgJVtxMV0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDJdLCAgIDAoJVtwVGVtcDBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICAlW3AxXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtwVGVtcDBdLCAgJVtwVGVtcDBdLCAgICAlW2hzdHJpZGVdICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAwKCVbcFRlbXAxXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJqICAgICAgICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICVbdGVtcDFdLCAgIDAoJVtwVGVtcDBdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgMjQgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJzaHJhX3IudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbcDBdLCAgICAgICVbcDBdLCAgICAgICAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3EwXSwgICAgICAlW3EwXSwgICAgICAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMV0sICAgJVtwMF0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDJdLCAgICVbcTBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAyXSwgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMV0sICAgMCglW3BUZW1wMF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3NpemVdLCAgICAlW3NpemVdLCAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtzaXplXSwgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZHUgICAgICVbcF0sICAgICAgICVbcF0sICAgICAgICAgICVbdnN0cmlkZV0gIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtwMF0iPSZyIihwMCksIFtxMF0iPSZyIihxMCksIFtwMV0iPSZyIihwMSksIFtxMV0iPSZyIihxMSksCisgICAgICBbcDJdIj0mciIocDIpLCBbcTJdIj0mciIocTIpLCBbcDNdIj0mciIocDMpLCBbcTNdIj0mciIocTMpLAorICAgICAgW3N0ZXAyXSI9JnIiKHN0ZXAyKSwgW3N0ZXAxXSI9JnIiKHN0ZXAxKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksCisgICAgICBbcFRlbXAwXSI9JnIiKHBUZW1wMCksIFtwVGVtcDFdIj0mciIocFRlbXAxKSwgW3BdIismciIocCksCisgICAgICBbc2l6ZV0iKyZyIihzaXplKQorICAgIDogW3ZzdHJpZGVdInIiKHZzdHJpZGUpLCBbaXRocmVzaF0iciIoaXRocmVzaCksCisgICAgICBbaGV2X3RocmVzaF0iciIoaGV2X3RocmVzaCksIFtoc3RyaWRlXSJyIihoc3RyaWRlKSwKKyAgICAgIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworI3VuZGVmIE1VTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICB1aW50OF90KiBwMSA9IHAgLSBzdHJpZGU7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAlW2ldLCAgICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDRdLCAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0sICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICAlW3N0cmlkZV0oJVtwXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNF0oJVtwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdKCVbcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDddLCAgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDNdICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDVdLCAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDIgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdLCAgICAgICAlW3RocmVzaDJdICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wNV0gICAgIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNV0sICAgIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICVbaV0sICAgICAgICAlW2ldLCAgICAgICAgICAgLTEgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNV0sICAgICVbdGVtcDZdLCAgICAgICAyNCAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wOF0gICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXA1XSAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDddLCAgICAlW3RlbXAzXSwgICAgICAgMyAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICAgIDMgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgJVt0ZW1wOF0sICAgICVbdGVtcDNdLCAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDBdLCAgICAlW3RlbXA3XSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDI3ICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAyNyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDBdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAlW3RlbXA0XSAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSglW1ZQOGtjbGlwMV0pICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgIDAoJVtwMV0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDRdLCAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtwMV0sICAgICAgICVbcDFdLCAgICAgICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbaV0sICAgICAgICAwYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAlW3BdLCAgICAgICAgJVtwXSwgICAgICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICIgLnNldCAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFtwXSIrJnIiKHApLCBbaV0iPSZyIihpKSwgW3AxXSIrJnIiKHAxKQorICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKSwgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKSwgW3RocmVzaDJdInIiKHRocmVzaDIpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLyBURU1QMCA9IFNSQ1tBICsgQTEgKiBCUFNdCisvLyBURU1QMSA9IFNSQ1tCICsgQjEgKiBCUFNdCisvLyBURU1QMiA9IFNSQ1tDICsgQzEgKiBCUFNdCisvLyBURU1QMyA9IFNSQ1tEICsgRDEgKiBCUFNdCisjZGVmaW5lIExPQURfNF9CWVRFUyhURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgQSwgQTEsIEIsIEIxLCBDLCBDMSwgRCwgRDEsIFNSQykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDAgIl0sICAgIiAjQSAiKyIgI0ExICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisgICJsYnUgICAgICAlWyIgI1RFTVAxICJdLCAgICIgI0IgIisiICNCMSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pIFxuXHQiICAgXAorICAibGJ1ICAgICAgJVsiICNURU1QMiAiXSwgICAiICNDICIrIiAjQzEgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSBcblx0IiAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDMgIl0sICAgIiAjRCAiKyIgI0QxICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAlW2ldLCAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF80X0JZVEVTKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCAtMiwgMCwgLTEsIDAsIDAsIDAsIDEsIDAsIHApCisgICAgInN1YnUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDVdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgICVbdGhyZXNoMl0gIFxuXHQiCisgICAgIm5lZ3UgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA1XSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAlW2ldLCAgICAgICAgJVtpXSwgICAgICAgICAgIC0xICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0sICAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDhdICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDVdICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAlW3RlbXA4XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAwXSwgICAgJVt0ZW1wN10sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wOF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wMV0sICAgICAgICVbdGVtcDBdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wN10oJVtWUDhrY2xpcDFdKSAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0oJVtWUDhrY2xpcDFdKSAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgLTEoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW2ldLCAgICAgICAgMGIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBhZGR1ICAgICAlW3BdLCAgICAgICAgJVtwXSwgICAgICAgICAgICVbc3RyaWRlXSAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbcF0iKyZyIihwKSwgW2ldIj0mciIoaSkKKyAgICA6IFtzdHJpZGVdInIiKHN0cmlkZSksIFtWUDhrY2xpcDFdInIiKFZQOGtjbGlwMSksIFt0aHJlc2gyXSJyIih0aHJlc2gyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworLy8gRFNUW0EgKiBCUFNdICAgICA9IFRFTVAwCisvLyBEU1RbQiArIEMgKiBCUFNdID0gVEVNUDEKKyNkZWZpbmUgU1RPUkVfOF9CWVRFUyhURU1QMCwgVEVNUDEsIEEsIEIsIEMsIERTVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1c3cgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIqIiBYU1RSKEJQUykgIiglWyIgI0RTVCAiXSkgICAgICAgICBcblx0IiAgICAgXAorICAidXN3ICAgICVbIiAjVEVNUDEgIl0sICAgIiAjQiAiKyIgI0MgIioiIFhTVFIoQlBTKSAiKCVbIiAjRFNUICJdKSAgXG5cdCIKKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCkgeyAgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAtMSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bGggICAgICAgICAgICAgJVt0ZW1wMV0sICAgMyglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA0XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDQsIHRlbXA0LCAwLCAwLCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wNCwgdGVtcDQsIDIsIDAsIDMsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgREM0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgJVt0ZW1wMF0sICAgLTEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgTE9BRF80X0JZVEVTKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgZHN0KQorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0sICAgIDgsICAgICA4ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAzXSwgICAgMTYsICAgIDggICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDRdLCAgICAyNCwgICAgOCAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMCwgMCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCAwLCAzLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzRfQllURVModGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgInVsdyAgICAgICAgICAgICVbdGVtcDddLCAgIC0xLSIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAwXSwgMTYsIDE2ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgJVt0ZW1wNV0sICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAxNiwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAlW3RlbXA0XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sIDE2LCAxNiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAxICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNV0sICVbdGVtcDFdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAlW3RlbXAyXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sIDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAlW3RlbXA2XSAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAlW3RlbXAwXSwgICAlW3RlbXA0XSwgJVt0ZW1wNV0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNV0sICVbdGVtcDRdICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDBdLCAlW3RlbXA4XSAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAlW3RlbXA1XSwgICAzLSIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICVbdGVtcDddICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAyICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA1XSwgMCwgIDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sICVbdGVtcDNdICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAgICVbdGVtcDRdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXA2XSwgICAlW3RlbXA4XSwgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMiwgdGVtcDYsIDMsIDAsIDEsIGRzdCkKKyAgICAicHJlcGVuZCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wOF0sIDggICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDRdLCA4ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDIsIHRlbXA2LCAyLCAwLCAwLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vIFRFTVAwID0gU1JDW0EgKiBCUFNdCisvLyBURU1QMSA9IFNSQ1tCICsgQyAqIEJQU10KKyNkZWZpbmUgTE9BRF84X0JZVEVTKFRFTVAwLCBURU1QMSwgQSwgQiwgQywgU1JDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgICAgICAgICBcblx0IiAgICAgXAorICAidWx3ICAgICVbIiAjVEVNUDEgIl0sICAgIiAjQiAiKyIgI0MgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSAgXG5cdCIKKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzhfQllURVModGVtcDAsIHRlbXAxLCAtMSwgNCwgLTEsIGRzdCkKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDNdICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA4XSAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAyICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDI0ICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wM10sICAgICVbdGVtcDldICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDIgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDksIHRlbXAzLCAwLCAwLCAyLCBkc3QpCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMF0sICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICA4ICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXA5LCB0ZW1wMywgMSwgMCwgMywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCitzdGF0aWMgdm9pZCBEQzh1dih1aW50OF90KiBkc3QpIHsgICAgIC8vIERDCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfOF9CWVRFUyh0ZW1wMCwgdGVtcDEsIC0xLCA0LCAtMSwgZHN0KQorICAgIExPQURfNF9CWVRFUyh0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgLTEsIDAsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIGRzdCkKKyAgICBMT0FEXzRfQllURVModGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIC0xLCA0LCAtMSwgNSwgLTEsIDYsIC0xLCA3LCBkc3QpCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA4XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCA0LCAwLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDEsIDQsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgNCwgMiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAzLCA0LCAzLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDQsIDQsIDQsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNSwgNCwgNSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA2LCA0LCA2LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDcsIDQsIDcsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gbGVmdCBzYW1wbGVzCisgIGludCB0ZW1wMCwgdGVtcDE7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfOF9CWVRFUyh0ZW1wMCwgdGVtcDEsIC0xLCA0LCAtMSwgZHN0KQorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDAsIDQsIDAsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMSwgNCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCA0LCAyLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDMsIDQsIDMsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNCwgNCwgNCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA1LCA0LCA1LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDYsIDQsIDYsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNywgNCwgNywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcCh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEXzRfQllURVModGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgTE9BRF80X0JZVEVTKHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxLCAtMSwgNCwgLTEsIDUsIC0xLCA2LCAtMSwgNywgZHN0KQorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wOF0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCA0LCAwLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDEsIDQsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMiwgNCwgMiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAzLCA0LCAzLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDQsIDQsIDQsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNSwgNCwgNSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA2LCA0LCA2LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDcsIDQsIDcsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworI3VuZGVmIExPQURfOF9CWVRFUworI3VuZGVmIFNUT1JFXzhfQllURVMKKyN1bmRlZiBMT0FEXzRfQllURVMKKworI2RlZmluZSBDTElQUElORyhTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVtkc3RfMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5pZiAiICNTSVpFICIgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmlmICIgI1NJWkUgIiA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDFdLCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKworI2RlZmluZSBDTElQXzhCX1RPX0RTVChEU1QsIFRPUCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGRzdF8xID0gKChpbnQpKERTVClbLTFdIDw8IDE2KSArIChEU1QpWy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtkc3RfMV0sICAgJVtkc3RfMV0sICAgICVbdG9wXzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtkc3RfMV0sICAgJVtkc3RfMV0sICAgICVbdG9wXzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORyg4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIDogW2RzdF8xXSIrJnIiKGRzdF8xKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgICAgICAgICAgIFwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbdG9wXzFdInIiKHRvcF8xKSwgW3RvcF0iciIoKFRPUCkpLCBbZHN0XSJyIigoRFNUKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfVE9fRFNUKERTVCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDhfdCogdG9wID0gKERTVCkgLSBCUFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0b3BfMSA9ICgoaW50KXRvcFstMV0gPDwgMTYpICsgdG9wWy0xXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHkgPSAwOyB5IDwgKFNJWkUpOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQXzhCX1RPX0RTVCgoRFNUKSwgdG9wLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKERTVCkgKz0gQlBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJVRV9NT1RJT04oRFNULCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBUcnVlTW90aW9uIyNTSVpFKHVpbnQ4X3QqIChEU1QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1RPX0RTVCgoRFNUKSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVFJVRV9NT1RJT04oZHN0LCA0KQorVFJVRV9NT1RJT04oZHN0LCA4KQorVFJVRV9NT1RJT04oZHN0LCAxNikKKworI3VuZGVmIFRSVUVfTU9USU9OCisjdW5kZWYgQ0xJUF9UT19EU1QKKyN1bmRlZiBDTElQXzhCX1RPX0RTVAorI3VuZGVmIENMSVBQSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtREM7CisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDMzsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2OworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4OworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4OworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTY7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOworCisgIFZQOFByZWRMdW1hNFswXSA9IERDNDsKKyAgVlA4UHJlZEx1bWE0WzFdID0gVHJ1ZU1vdGlvbjQ7CisgIFZQOFByZWRMdW1hNFsyXSA9IFZFNDsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0OworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDQ7CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1djsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUcnVlTW90aW9uODsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0OworCisgIFZQOFByZWRMdW1hMTZbMV0gPSBUcnVlTW90aW9uMTY7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kZWNfbXNhLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTY1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX21zYS5jCkBAIC0wLDAgKzEsMTcyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIFByYXNoYW50IFBhdGlsICAgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICIuL21zYV9tYWNyby5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworCisjZGVmaW5lIElEQ1RfMURfVyhpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIHsgIFwKKyAgdjRpMzIgYTFfbSwgYjFfbSwgYzFfbSwgZDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBjX3RtcDFfbSwgY190bXAyX20sIGRfdG1wMV9tLCBkX3RtcDJfbTsgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIGNvc3BpOHNxcnQybWludXMxID0gX19tc2FfZmlsbF93KDIwMDkxKTsgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgc2lucGk4c3FydDIgPSBfX21zYV9maWxsX3coMzU0NjgpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGExX20gPSBpbjAgKyBpbjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYjFfbSA9IGluMCAtIGluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjX3RtcDFfbSA9IChpbjEgKiBzaW5waThzcXJ0MikgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNfdG1wMl9tID0gaW4zICsgKChpbjMgKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOyAgICAgICAgICAgIFwKKyAgYzFfbSA9IGNfdG1wMV9tIC0gY190bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkX3RtcDFfbSA9IGluMSArICgoaW4xICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsgICAgICAgICAgICBcCisgIGRfdG1wMl9tID0gKGluMyAqIHNpbnBpOHNxcnQyKSA+PiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZDFfbSA9IGRfdG1wMV9tICsgZF90bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBCVVRURVJGTFlfNChhMV9tLCBiMV9tLCBjMV9tLCBkMV9tLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICBcCit9CisjZGVmaW5lIE1VTFQxKGEpICgoKChhKSAqIDIwMDkxKSA+PiAxNikgKyAoYSkpCisjZGVmaW5lIE1VTFQyKGEpICgoKGEpICogMzU0NjgpID4+IDE2KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmUoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICB2OGkxNiBpbnB1dDAsIGlucHV0MTsKKyAgdjRpMzIgaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMsIHZ0MCwgdnQxLCB2dDIsIHZ0MzsKKyAgdjRpMzIgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICB2MTZpOCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0MzsKKworICBMRF9TSDIoaW4sIDgsIGlucHV0MCwgaW5wdXQxKTsKKyAgVU5QQ0tfU0hfU1coaW5wdXQwLCBpbjAsIGluMSk7CisgIFVOUENLX1NIX1NXKGlucHV0MSwgaW4yLCBpbjMpOworICBJRENUXzFEX1coaW4wLCBpbjEsIGluMiwgaW4zLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBUUkFOU1BPU0U0eDRfU1dfU1coaHowLCBoejEsIGh6MiwgaHozLCBoejAsIGh6MSwgaHoyLCBoejMpOworICBJRENUXzFEX1coaHowLCBoejEsIGh6MiwgaHozLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBTUkFSSV9XNF9TVyh2dDAsIHZ0MSwgdnQyLCB2dDMsIDMpOworICBUUkFOU1BPU0U0eDRfU1dfU1codnQwLCB2dDEsIHZ0MiwgdnQzLCB2dDAsIHZ0MSwgdnQyLCB2dDMpOworICBMRF9TQjQoZHN0LCBCUFMsIGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzKTsKKyAgSUxWUl9CNF9TVyh6ZXJvLCBkZXN0MCwgemVybywgZGVzdDEsIHplcm8sIGRlc3QyLCB6ZXJvLCBkZXN0MywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgSUxWUl9INF9TVyh6ZXJvLCByZXMwLCB6ZXJvLCByZXMxLCB6ZXJvLCByZXMyLCB6ZXJvLCByZXMzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBBREQ0KHJlczAsIHZ0MCwgcmVzMSwgdnQxLCByZXMyLCB2dDIsIHJlczMsIHZ0MywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIENMSVBfU1c0XzBfMjU1KHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBQQ0tFVl9CMl9TVyhyZXMwLCByZXMxLCByZXMyLCByZXMzLCB2dDAsIHZ0MSk7CisgIHJlczAgPSAodjRpMzIpX19tc2FfcGNrZXZfYigodjE2aTgpdnQwLCAodjE2aTgpdnQxKTsKKyAgU1Q0eDRfVUIocmVzMCwgcmVzMCwgMywgMiwgMSwgMCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud28oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmUoaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmUoaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgdjhpMTYgaW5wdXQwLCBpbnB1dDE7CisgIGNvbnN0IHY4aTE2IG1hc2swID0geyAwLCAxLCAyLCAzLCA4LCA5LCAxMCwgMTEgfTsKKyAgY29uc3QgdjhpMTYgbWFzazEgPSB7IDQsIDUsIDYsIDcsIDEyLCAxMywgMTQsIDE1IH07CisgIGNvbnN0IHY4aTE2IG1hc2syID0geyAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazMgPSB7IDMsIDcsIDExLCAxNSwgMiwgNiwgMTAsIDE0IH07CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgIHY4aTE2IG91dDAsIG91dDE7CisKKyAgTERfU0gyKGluLCA4LCBpbnB1dDAsIGlucHV0MSk7CisgIGlucHV0MSA9IFNMRElfU0goaW5wdXQxLCBpbnB1dDEsIDgpOworICB0bXAwID0gaW5wdXQwICsgaW5wdXQxOworICB0bXAxID0gaW5wdXQwIC0gaW5wdXQxOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIG91dDAgPSB0bXAyICsgdG1wMzsKKyAgb3V0MSA9IHRtcDIgLSB0bXAzOworICBWU0hGX0gyX1NIKG91dDAsIG91dDEsIG91dDAsIG91dDEsIG1hc2syLCBtYXNrMywgaW5wdXQwLCBpbnB1dDEpOworICB0bXAwID0gaW5wdXQwICsgaW5wdXQxOworICB0bXAxID0gaW5wdXQwIC0gaW5wdXQxOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIHRtcDAgPSB0bXAyICsgdG1wMzsKKyAgdG1wMSA9IHRtcDIgLSB0bXAzOworICBBRERWSV9IMl9TSCh0bXAwLCAzLCB0bXAxLCAzLCBvdXQwLCBvdXQxKTsKKyAgU1JBSV9IMl9TSChvdXQwLCBvdXQxLCAzKTsKKyAgb3V0WzBdID0gX19tc2FfY29weV9zX2gob3V0MCwgMCk7CisgIG91dFsxNl0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCA0KTsKKyAgb3V0WzMyXSA9IF9fbXNhX2NvcHlfc19oKG91dDEsIDApOworICBvdXRbNDhdID0gX19tc2FfY29weV9zX2gob3V0MSwgNCk7CisgIG91dFs2NF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCAxKTsKKyAgb3V0WzgwXSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDUpOworICBvdXRbOTZdID0gX19tc2FfY29weV9zX2gob3V0MSwgMSk7CisgIG91dFsxMTJdID0gX19tc2FfY29weV9zX2gob3V0MSwgNSk7CisgIG91dFsxMjhdID0gX19tc2FfY29weV9zX2gob3V0MCwgMik7CisgIG91dFsxNDRdID0gX19tc2FfY29weV9zX2gob3V0MCwgNik7CisgIG91dFsxNjBdID0gX19tc2FfY29weV9zX2gob3V0MSwgMik7CisgIG91dFsxNzZdID0gX19tc2FfY29weV9zX2gob3V0MSwgNik7CisgIG91dFsxOTJdID0gX19tc2FfY29weV9zX2gob3V0MCwgMyk7CisgIG91dFsyMDhdID0gX19tc2FfY29weV9zX2gob3V0MCwgNyk7CisgIG91dFsyMjRdID0gX19tc2FfY29weV9zX2gob3V0MSwgMyk7CisgIG91dFsyNDBdID0gX19tc2FfY29weV9zX2gob3V0MSwgNyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IERDID0gKGluWzBdICsgNCkgPj4gMzsKKyAgY29uc3QgdjhpMTYgdG1wMCA9IF9fbXNhX2ZpbGxfaChEQyk7CisgIEFEREJMS19TVDR4NF9VQih0bXAwLCB0bXAwLCB0bXAwLCB0bXAwLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDMyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBhID0gaW5bMF0gKyA0OworICBjb25zdCBpbnQgYzQgPSBNVUxUMihpbls0XSk7CisgIGNvbnN0IGludCBkNCA9IE1VTFQxKGluWzRdKTsKKyAgY29uc3QgaW50IGluMiA9IE1VTFQyKGluWzFdKTsKKyAgY29uc3QgaW50IGluMyA9IE1VTFQxKGluWzFdKTsKKyAgdjRpMzIgdG1wMCA9IHsgMCB9OworICB2NGkzMiBvdXQwID0gX19tc2FfZmlsbF93KGEgKyBkNCk7CisgIHY0aTMyIG91dDEgPSBfX21zYV9maWxsX3coYSArIGM0KTsKKyAgdjRpMzIgb3V0MiA9IF9fbXNhX2ZpbGxfdyhhIC0gYzQpOworICB2NGkzMiBvdXQzID0gX19tc2FfZmlsbF93KGEgLSBkNCk7CisgIHY0aTMyIHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgIGNvbnN0IHY0aTMyIHplcm8gPSB7IDAgfTsKKyAgdjE2dTggZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDM7CisKKyAgSU5TRVJUX1c0X1NXKGluMywgaW4yLCAtaW4yLCAtaW4zLCB0bXAwKTsKKyAgQURENChvdXQwLCB0bXAwLCBvdXQxLCB0bXAwLCBvdXQyLCB0bXAwLCBvdXQzLCB0bXAwLAorICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBTUkFJX1c0X1NXKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDMpOworICBMRF9VQjQoZHN0LCBCUFMsIGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzKTsKKyAgSUxWUl9CNF9TVyh6ZXJvLCBkZXN0MCwgemVybywgZGVzdDEsIHplcm8sIGRlc3QyLCB6ZXJvLCBkZXN0MywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgSUxWUl9INF9TVyh6ZXJvLCByZXMwLCB6ZXJvLCByZXMxLCB6ZXJvLCByZXMyLCB6ZXJvLCByZXMzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBBREQ0KHJlczAsIG91dDAsIHJlczEsIG91dDEsIHJlczIsIG91dDIsIHJlczMsIG91dDMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBDTElQX1NXNF8wXzI1NShyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgUENLRVZfQjJfU1cocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgb3V0MCwgb3V0MSk7CisgIHJlczAgPSAodjRpMzIpX19tc2FfcGNrZXZfYigodjE2aTgpb3V0MCwgKHYxNmk4KW91dDEpOworICBTVDR4NF9VQihyZXMwLCByZXMwLCAzLCAyLCAxLCAwLCBkc3QsIEJQUyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1TQSh2b2lkKSB7CisgIFZQOFRyYW5zZm9ybVdIVCA9IFRyYW5zZm9ybVdIVDsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDOworICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzM7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19zc2UyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUxMmY3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19zc2UyLmMKQEAgLTAsMCArMSwxMjMxIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIHNvbWUgZGVjb2RpbmcgZnVuY3Rpb25zIChpZGN0LCBsb29wIGZpbHRlcmluZykuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisvLyAgICAgICAgIGNkdXZpdmllckBnb29nbGUuY29tIChDaHJpc3RpYW4gRHV2aXZpZXIpCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworLy8gVGhlIDMtY29lZmYgc3BhcnNlIHRyYW5zZm9ybSBpbiBTU0UyIGlzIG5vdCByZWFsbHkgZmFzdGVyIHRoYW4gdGhlIHBsYWluLUMKKy8vIG9uZSBpdCBzZWVtcyA9PiBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQuIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIGVuYWJsZToKKy8vICNkZWZpbmUgVVNFX1RSQU5TRk9STV9BQzMKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm0oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNi1iaXQgZml4ZWQgcG9pbnQgdmVyc2lvbnMgb2YgdHdvCisgIC8vIG11bHRpcGx5IGNvbnN0YW50czoKKyAgLy8gICAgSzEgPSBzcXJ0KDIpICogY29zIChwaS84KSB+PSA4NTYyNyAvIDJeMTYKKyAgLy8gICAgSzIgPSBzcXJ0KDIpICogc2luIChwaS84KSB+PSAzNTQ2OCAvIDJeMTYKKyAgLy8KKyAgLy8gVG8gYmUgYWJsZSB0byB1c2Ugc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8KKyAgLy8gaGF2ZSBjb25zdGFudHMgd2l0aGluIHJhbmdlOgorICAvLyAtIEFzc29jaWF0ZWQgY29uc3RhbnRzIGFyZSBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyB0aGUgMTYtYml0IGZpeGVkIHBvaW50CisgIC8vICAgdmVyc2lvbiBvZiBvbmU6CisgIC8vICAgICAgayA9IEsgLSAoMSA8PCAxNikgID0+ICBLID0gayArICgxIDw8IDE2KQorICAvLyAgICAgIEsxID0gODUyNjcgID0+ICBrMSA9ICAyMDA5MQorICAvLyAgICAgIEsyID0gMzU0NjggID0+ICBrMiA9IC0zMDA2OAorICAvLyAtIFRoZSBtdWx0aXBsaWNhdGlvbiBvZiBhIHZhcmlhYmxlIGJ5IGEgY29uc3RhbnQgYmVjb21lIHRoZSBzdW0gb2YgdGhlCisgIC8vICAgdmFyaWFibGUgYW5kIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGF0IHZhcmlhYmxlIGJ5IHRoZSBhc3NvY2lhdGVkCisgIC8vICAgY29uc3RhbnQ6CisgIC8vICAgICAgKHggKiBLKSA+PiAxNiA9ICh4ICogKGsgKyAoMSA8PCAxNikpKSA+PiAxNiA9ICgoeCAqIGsgKSA+PiAxNikgKyB4CisgIGNvbnN0IF9fbTEyOGkgazEgPSBfbW1fc2V0MV9lcGkxNigyMDA5MSk7CisgIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigtMzAwNjgpOworICBfX20xMjhpIFQwLCBUMSwgVDIsIFQzOworCisgIC8vIExvYWQgYW5kIGNvbmNhdGVuYXRlIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcworICAvLyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIHRyYW5zZm9ybSwgdGhlIHNlY29uZCBoYWxmIG9mIHRoZQorICAvLyB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlciB1c2Ugbm9yIHN0b3JlLgorICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKKyAgeworICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzBdKTsKKyAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls0XSk7CisgICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bOF0pOworICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzEyXSk7CisgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAorICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKKyAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4CisgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAorICAgIGlmIChkb190d28pIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjRdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI4XSk7CisgICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKKyAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOworICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7CisgICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKKyAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCisgICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKKyAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworICAgIH0KKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOworICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZ0bXAwLCAmdG1wMSwgJnRtcDIsICZ0bXAzLCAmVDAsICZUMSwgJlQyLCAmVDMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKKyAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7CisgICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOworICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnNoaWZ0ZWQwLCAmc2hpZnRlZDEsICZzaGlmdGVkMiwgJnNoaWZ0ZWQzLCAmVDAsICZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEFkZCBpbnZlcnNlIHRyYW5zZm9ybSB0byAnZHN0JyBhbmQgc3RvcmUuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIC8vIExvYWQgdGhlIHJlZmVyZW5jZShzKS4KKyAgICBfX20xMjhpIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gTG9hZCBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBkc3QwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMCAqIEJQUykpOworICAgICAgZHN0MSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDEgKiBCUFMpKTsKKyAgICAgIGRzdDIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAyICogQlBTKSk7CisgICAgICBkc3QzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMyAqIEJQUykpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgZHN0MCA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAwICogQlBTKSk7CisgICAgICBkc3QxID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDEgKiBCUFMpKTsKKyAgICAgIGRzdDIgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMiAqIEJQUykpOworICAgICAgZHN0MyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAzICogQlBTKSk7CisgICAgfQorICAgIC8vIENvbnZlcnQgdG8gMTZiLgorICAgIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QwLCB6ZXJvKTsKKyAgICBkc3QxID0gX21tX3VucGFja2xvX2VwaTgoZHN0MSwgemVybyk7CisgICAgZHN0MiA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDIsIHplcm8pOworICAgIGRzdDMgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QzLCB6ZXJvKTsKKyAgICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtKHMpLgorICAgIGRzdDAgPSBfbW1fYWRkX2VwaTE2KGRzdDAsIFQwKTsKKyAgICBkc3QxID0gX21tX2FkZF9lcGkxNihkc3QxLCBUMSk7CisgICAgZHN0MiA9IF9tbV9hZGRfZXBpMTYoZHN0MiwgVDIpOworICAgIGRzdDMgPSBfbW1fYWRkX2VwaTE2KGRzdDMsIFQzKTsKKyAgICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgICBkc3QwID0gX21tX3BhY2t1c19lcGkxNihkc3QwLCBkc3QwKTsKKyAgICBkc3QxID0gX21tX3BhY2t1c19lcGkxNihkc3QxLCBkc3QxKTsKKyAgICBkc3QyID0gX21tX3BhY2t1c19lcGkxNihkc3QyLCBkc3QyKTsKKyAgICBkc3QzID0gX21tX3BhY2t1c19lcGkxNihkc3QzLCBkc3QzKTsKKyAgICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICAvLyBTdG9yZSBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMCAqIEJQUyksIGRzdDApOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDEgKiBCUFMpLCBkc3QxKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAyICogQlBTKSwgZHN0Mik7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMyAqIEJQUyksIGRzdDMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QwKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MSkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDIpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QzKSk7CisgICAgfQorICB9Cit9CisKKyNpZiBkZWZpbmVkKFVTRV9UUkFOU0ZPUk1fQUMzKQorI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKKyAgc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX3NldDFfZXBpMTYoaW5bMF0gKyA0KTsKKyAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zZXQxX2VwaTE2KE1VTChpbls0XSwga0MyKSk7CisgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fc2V0MV9lcGkxNihNVUwoaW5bNF0sIGtDMSkpOworICBjb25zdCBpbnQgYzEgPSBNVUwoaW5bMV0sIGtDMik7CisgIGNvbnN0IGludCBkMSA9IE1VTChpblsxXSwga0MxKTsKKyAgY29uc3QgX19tMTI4aSBDRCA9IF9tbV9zZXRfZXBpMTYoMCwgMCwgMCwgMCwgLWQxLCAtYzEsIGMxLCBkMSk7CisgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9hZGRzX2VwaTE2KEEsIENEKTsKKyAgY29uc3QgX19tMTI4aSBtMCA9IF9tbV9hZGRzX2VwaTE2KEIsIGQ0KTsKKyAgY29uc3QgX19tMTI4aSBtMSA9IF9tbV9hZGRzX2VwaTE2KEIsIGM0KTsKKyAgY29uc3QgX19tMTI4aSBtMiA9IF9tbV9zdWJzX2VwaTE2KEIsIGM0KTsKKyAgY29uc3QgX19tMTI4aSBtMyA9IF9tbV9zdWJzX2VwaTE2KEIsIGQ0KTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgLy8gTG9hZCB0aGUgc291cmNlIHBpeGVscy4KKyAgX19tMTI4aSBkc3QwID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDAgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QxID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDEgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QyID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDIgKiBCUFMpKTsKKyAgX19tMTI4aSBkc3QzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDMgKiBCUFMpKTsKKyAgLy8gQ29udmVydCB0byAxNmIuCisgIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QwLCB6ZXJvKTsKKyAgZHN0MSA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDEsIHplcm8pOworICBkc3QyID0gX21tX3VucGFja2xvX2VwaTgoZHN0MiwgemVybyk7CisgIGRzdDMgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QzLCB6ZXJvKTsKKyAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybS4KKyAgZHN0MCA9IF9tbV9hZGRzX2VwaTE2KGRzdDAsIF9tbV9zcmFpX2VwaTE2KG0wLCAzKSk7CisgIGRzdDEgPSBfbW1fYWRkc19lcGkxNihkc3QxLCBfbW1fc3JhaV9lcGkxNihtMSwgMykpOworICBkc3QyID0gX21tX2FkZHNfZXBpMTYoZHN0MiwgX21tX3NyYWlfZXBpMTYobTIsIDMpKTsKKyAgZHN0MyA9IF9tbV9hZGRzX2VwaTE2KGRzdDMsIF9tbV9zcmFpX2VwaTE2KG0zLCAzKSk7CisgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICBkc3QwID0gX21tX3BhY2t1c19lcGkxNihkc3QwLCBkc3QwKTsKKyAgZHN0MSA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MSwgZHN0MSk7CisgIGRzdDIgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDIsIGRzdDIpOworICBkc3QzID0gX21tX3BhY2t1c19lcGkxNihkc3QzLCBkc3QzKTsKKyAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QwKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QxKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QyKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QzKSk7Cit9CisjdW5kZWYgTVVMCisjZW5kaWYgICAvLyBVU0VfVFJBTlNGT1JNX0FDMworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9vcCBGaWx0ZXIgKFBhcmFncmFwaCAxNSkKKworLy8gQ29tcHV0ZSBhYnMocCAtIHEpID0gc3VicyhwIC0gcSkgT1Igc3VicyhxIC0gcCkKKyNkZWZpbmUgTU1fQUJTKHAsIHEpICBfbW1fb3Jfc2kxMjgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX21tX3N1YnNfZXB1OCgocSksIChwKSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdWJzX2VwdTgoKHApLCAocSkpKQorCisvLyBTaGlmdCBlYWNoIGJ5dGUgb2YgIngiIGJ5IDMgYml0cyB3aGlsZSBwcmVzZXJ2aW5nIGJ5IHRoZSBzaWduIGJpdC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNpZ25lZFNoaWZ0OGIoX19tMTI4aSogY29uc3QgeCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIGxvXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCAqeCk7CisgIGNvbnN0IF9fbTEyOGkgaGlfMCA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sICp4KTsKKyAgY29uc3QgX19tMTI4aSBsb18xID0gX21tX3NyYWlfZXBpMTYobG9fMCwgMyArIDgpOworICBjb25zdCBfX20xMjhpIGhpXzEgPSBfbW1fc3JhaV9lcGkxNihoaV8wLCAzICsgOCk7CisgICp4ID0gX21tX3BhY2tzX2VwaTE2KGxvXzEsIGhpXzEpOworfQorCisjZGVmaW5lIEZMSVBfU0lHTl9CSVQyKGEsIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhID0gX21tX3hvcl9zaTEyOChhLCBzaWduX2JpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYiA9IF9tbV94b3Jfc2kxMjgoYiwgc2lnbl9iaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgRkxJUF9TSUdOX0JJVDQoYSwgYiwgYywgZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKGEsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihjLCBkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gaW5wdXQvb3V0cHV0IGlzIHVpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldE5vdEhFVihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCwgX19tMTI4aSogY29uc3Qgbm90X2hldikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRfMSA9IE1NX0FCUygqcDEsICpwMCk7CisgIGNvbnN0IF9fbTEyOGkgdF8yID0gTU1fQUJTKCpxMSwgKnEwKTsKKworICBjb25zdCBfX20xMjhpIGggPSBfbW1fc2V0MV9lcGk4KGhldl90aHJlc2gpOworICBjb25zdCBfX20xMjhpIHRfbWF4ID0gX21tX21heF9lcHU4KHRfMSwgdF8yKTsKKworICBjb25zdCBfX20xMjhpIHRfbWF4X2ggPSBfbW1fc3Vic19lcHU4KHRfbWF4LCBoKTsKKyAgKm5vdF9oZXYgPSBfbW1fY21wZXFfZXBpOCh0X21heF9oLCB6ZXJvKTsgIC8vIG5vdF9oZXYgPD0gdDEgJiYgbm90X2hldiA8PSB0MgorfQorCisvLyBpbnB1dCBwaXhlbHMgYXJlIGludDhfdAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0QmFzZURlbHRhKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGRlbHRhKSB7CisgIC8vIGJld2FyZSBvZiBhZGRpdGlvbiBvcmRlciwgZm9yIHNhdHVyYXRpb24hCisgIGNvbnN0IF9fbTEyOGkgcDFfcTEgPSBfbW1fc3Vic19lcGk4KCpwMSwgKnExKTsgICAvLyBwMSAtIHExCisgIGNvbnN0IF9fbTEyOGkgcTBfcDAgPSBfbW1fc3Vic19lcGk4KCpxMCwgKnAwKTsgICAvLyBxMCAtIHAwCisgIGNvbnN0IF9fbTEyOGkgczEgPSBfbW1fYWRkc19lcGk4KHAxX3ExLCBxMF9wMCk7ICAvLyBwMSAtIHExICsgMSAqIChxMCAtIHAwKQorICBjb25zdCBfX20xMjhpIHMyID0gX21tX2FkZHNfZXBpOChxMF9wMCwgczEpOyAgICAgLy8gcDEgLSBxMSArIDIgKiAocTAgLSBwMCkKKyAgY29uc3QgX19tMTI4aSBzMyA9IF9tbV9hZGRzX2VwaTgocTBfcDAsIHMyKTsgICAgIC8vIHAxIC0gcTEgKyAzICogKHEwIC0gcDApCisgICpkZWx0YSA9IHMzOworfQorCisvLyBpbnB1dCBhbmQgb3V0cHV0IGFyZSBpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvU2ltcGxlRmlsdGVyKF9fbTEyOGkqIGNvbnN0IHAwLCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGZsKSB7CisgIGNvbnN0IF9fbTEyOGkgazMgPSBfbW1fc2V0MV9lcGk4KDMpOworICBjb25zdCBfX20xMjhpIGs0ID0gX21tX3NldDFfZXBpOCg0KTsKKyAgX19tMTI4aSB2MyA9IF9tbV9hZGRzX2VwaTgoKmZsLCBrMyk7CisgIF9fbTEyOGkgdjQgPSBfbW1fYWRkc19lcGk4KCpmbCwgazQpOworCisgIFNpZ25lZFNoaWZ0OGIoJnY0KTsgICAgICAgICAgICAgICAgICAvLyB2NCA+PiAzCisgIFNpZ25lZFNoaWZ0OGIoJnYzKTsgICAgICAgICAgICAgICAgICAvLyB2MyA+PiAzCisgICpxMCA9IF9tbV9zdWJzX2VwaTgoKnEwLCB2NCk7ICAgICAgICAvLyBxMCAtPSB2NAorICAqcDAgPSBfbW1fYWRkc19lcGk4KCpwMCwgdjMpOyAgICAgICAgLy8gcDAgKz0gdjMKK30KKworLy8gVXBkYXRlcyB2YWx1ZXMgb2YgMiBwaXhlbHMgYXQgTUIgZWRnZSBkdXJpbmcgY29tcGxleCBmaWx0ZXJpbmcuCisvLyBVcGRhdGUgb3BlcmF0aW9uczoKKy8vIHEgPSBxIC0gZGVsdGEgYW5kIHAgPSBwICsgZGVsdGE7IHdoZXJlIGRlbHRhID0gWyhhX2hpID4+IDcpLCAoYV9sbyA+PiA3KV0KKy8vIFBpeGVscyAncGknIGFuZCAncWknIGFyZSBpbnQ4X3Qgb24gaW5wdXQsIHVpbnQ4X3Qgb24gb3V0cHV0IChzaWduIGZsaXApLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlMlBpeGVscyhfX20xMjhpKiBjb25zdCBwaSwgX19tMTI4aSogY29uc3QgcWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEwX2xvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBhMF9oaSkgeworICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX3NyYWlfZXBpMTYoKmEwX2xvLCA3KTsKKyAgY29uc3QgX19tMTI4aSBhMV9oaSA9IF9tbV9zcmFpX2VwaTE2KCphMF9oaSwgNyk7CisgIGNvbnN0IF9fbTEyOGkgZGVsdGEgPSBfbW1fcGFja3NfZXBpMTYoYTFfbG8sIGExX2hpKTsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgICpwaSA9IF9tbV9hZGRzX2VwaTgoKnBpLCBkZWx0YSk7CisgICpxaSA9IF9tbV9zdWJzX2VwaTgoKnFpLCBkZWx0YSk7CisgIEZMSVBfU0lHTl9CSVQyKCpwaSwgKnFpKTsKK30KKworLy8gaW5wdXQgcGl4ZWxzIGFyZSB1aW50OF90CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBOZWVkc0ZpbHRlcihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIF9fbTEyOGkqIGNvbnN0IG1hc2spIHsKKyAgY29uc3QgX19tMTI4aSBtX3RocmVzaCA9IF9tbV9zZXQxX2VwaTgodGhyZXNoKTsKKyAgY29uc3QgX19tMTI4aSB0MSA9IE1NX0FCUygqcDEsICpxMSk7ICAgICAgICAvLyBhYnMocDEgLSBxMSkKKyAgY29uc3QgX19tMTI4aSBrRkUgPSBfbW1fc2V0MV9lcGk4KDB4RkUpOworICBjb25zdCBfX20xMjhpIHQyID0gX21tX2FuZF9zaTEyOCh0MSwga0ZFKTsgIC8vIHNldCBsc2Igb2YgZWFjaCBieXRlIHRvIHplcm8KKyAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9zcmxpX2VwaTE2KHQyLCAxKTsgICAvLyBhYnMocDEgLSBxMSkgLyAyCisKKyAgY29uc3QgX19tMTI4aSB0NCA9IE1NX0FCUygqcDAsICpxMCk7ICAgICAgICAvLyBhYnMocDAgLSBxMCkKKyAgY29uc3QgX19tMTI4aSB0NSA9IF9tbV9hZGRzX2VwdTgodDQsIHQ0KTsgICAvLyBhYnMocDAgLSBxMCkgKiAyCisgIGNvbnN0IF9fbTEyOGkgdDYgPSBfbW1fYWRkc19lcHU4KHQ1LCB0Myk7ICAgLy8gYWJzKHAwLXEwKSoyICsgYWJzKHAxLXExKS8yCisKKyAgY29uc3QgX19tMTI4aSB0NyA9IF9tbV9zdWJzX2VwdTgodDYsIG1fdGhyZXNoKTsgIC8vIG1hc2sgPD0gbV90aHJlc2gKKyAgKm1hc2sgPSBfbW1fY21wZXFfZXBpOCh0NywgX21tX3NldHplcm9fc2kxMjgoKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKworLy8gQXBwbGllcyBmaWx0ZXIgb24gMiBwaXhlbHMgKHAwIGFuZCBxMCkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyMihfX20xMjhpKiBjb25zdCBwMSwgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTAsIF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gpIHsKKyAgX19tMTI4aSBhLCBtYXNrOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgLy8gY29udmVydCBwMS9xMSB0byBpbnQ4X3QgKGZvciBHZXRCYXNlRGVsdGEpCisgIGNvbnN0IF9fbTEyOGkgcDFzID0gX21tX3hvcl9zaTEyOCgqcDEsIHNpZ25fYml0KTsKKyAgY29uc3QgX19tMTI4aSBxMXMgPSBfbW1feG9yX3NpMTI4KCpxMSwgc2lnbl9iaXQpOworCisgIE5lZWRzRmlsdGVyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsICZtYXNrKTsKKworICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7CisgIEdldEJhc2VEZWx0YSgmcDFzLCBwMCwgcTAsICZxMXMsICZhKTsKKyAgYSA9IF9tbV9hbmRfc2kxMjgoYSwgbWFzayk7ICAgICAvLyBtYXNrIGZpbHRlciB2YWx1ZXMgd2UgZG9uJ3QgY2FyZSBhYm91dAorICBEb1NpbXBsZUZpbHRlcihwMCwgcTAsICZhKTsKKyAgRkxJUF9TSUdOX0JJVDIoKnAwLCAqcTApOworfQorCisvLyBBcHBsaWVzIGZpbHRlciBvbiA0IHBpeGVscyAocDEsIHAwLCBxMCBhbmQgcTEpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjQoX19tMTI4aSogY29uc3QgcDEsIF9fbTEyOGkqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBtYXNrLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHNpZ25fYml0ID0gX21tX3NldDFfZXBpOCgweDgwKTsKKyAgY29uc3QgX19tMTI4aSBrNjQgPSBfbW1fc2V0MV9lcGk4KDY0KTsKKyAgY29uc3QgX19tMTI4aSBrMyA9IF9tbV9zZXQxX2VwaTgoMyk7CisgIGNvbnN0IF9fbTEyOGkgazQgPSBfbW1fc2V0MV9lcGk4KDQpOworICBfX20xMjhpIG5vdF9oZXY7CisgIF9fbTEyOGkgdDEsIHQyLCB0MzsKKworICAvLyBjb21wdXRlIGhldiBtYXNrCisgIEdldE5vdEhFVihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCwgJm5vdF9oZXYpOworCisgIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOworCisgIHQxID0gX21tX3N1YnNfZXBpOCgqcDEsICpxMSk7ICAgICAgICAvLyBwMSAtIHExCisgIHQxID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCB0MSk7ICAvLyBoZXYocDEgLSBxMSkKKyAgdDIgPSBfbW1fc3Vic19lcGk4KCpxMCwgKnAwKTsgICAgICAgIC8vIHEwIC0gcDAKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDEgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDIgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDMgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYW5kX3NpMTI4KHQxLCAqbWFzayk7ICAgICAgIC8vIG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisKKyAgdDIgPSBfbW1fYWRkc19lcGk4KHQxLCBrMyk7ICAgICAgICAvLyAzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgMworICB0MyA9IF9tbV9hZGRzX2VwaTgodDEsIGs0KTsgICAgICAgIC8vIDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0CisgIFNpZ25lZFNoaWZ0OGIoJnQyKTsgICAgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyAzKSA+PiAzCisgIFNpZ25lZFNoaWZ0OGIoJnQzKTsgICAgICAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiAzCisgICpwMCA9IF9tbV9hZGRzX2VwaTgoKnAwLCB0Mik7ICAgICAgLy8gcDAgKz0gdDIKKyAgKnEwID0gX21tX3N1YnNfZXBpOCgqcTAsIHQzKTsgICAgICAvLyBxMCAtPSB0MworICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7CisKKyAgLy8gdGhpcyBpcyBlcXVpdmFsZW50IHRvIHNpZ25lZCAoYSArIDEpID4+IDEgY2FsY3VsYXRpb24KKyAgdDIgPSBfbW1fYWRkX2VwaTgodDMsIHNpZ25fYml0KTsKKyAgdDMgPSBfbW1fYXZnX2VwdTgodDIsIHplcm8pOworICB0MyA9IF9tbV9zdWJfZXBpOCh0MywgazY0KTsKKworICB0MyA9IF9tbV9hbmRfc2kxMjgobm90X2hldiwgdDMpOyAgIC8vIGlmICFoZXYKKyAgKnExID0gX21tX3N1YnNfZXBpOCgqcTEsIHQzKTsgICAgICAvLyBxMSAtPSB0MworICAqcDEgPSBfbW1fYWRkc19lcGk4KCpwMSwgdDMpOyAgICAgIC8vIHAxICs9IHQzCisgIEZMSVBfU0lHTl9CSVQyKCpwMSwgKnExKTsKK30KKworLy8gQXBwbGllcyBmaWx0ZXIgb24gNiBwaXhlbHMgKHAyLCBwMSwgcDAsIHEwLCBxMSBhbmQgcTIpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjYoX19tMTI4aSogY29uc3QgcDIsIF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHAwLCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMSwgX19tMTI4aSogY29uc3QgcTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbWFzaywgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgIF9fbTEyOGkgYSwgbm90X2hldjsKKworICAvLyBjb21wdXRlIGhldiBtYXNrCisgIEdldE5vdEhFVihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCwgJm5vdF9oZXYpOworCisgIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7CisgIEZMSVBfU0lHTl9CSVQyKCpwMiwgKnEyKTsKKyAgR2V0QmFzZURlbHRhKHAxLCBwMCwgcTAsIHExLCAmYSk7CisKKyAgeyAvLyBkbyBzaW1wbGUgZmlsdGVyIG9uIHBpeGVscyB3aXRoIGhldgorICAgIGNvbnN0IF9fbTEyOGkgbSA9IF9tbV9hbmRub3Rfc2kxMjgobm90X2hldiwgKm1hc2spOworICAgIGNvbnN0IF9fbTEyOGkgZiA9IF9tbV9hbmRfc2kxMjgoYSwgbSk7CisgICAgRG9TaW1wbGVGaWx0ZXIocDAsIHEwLCAmZik7CisgIH0KKworICB7IC8vIGRvIHN0cm9uZyBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggbm90IGhldgorICAgIGNvbnN0IF9fbTEyOGkgazkgPSBfbW1fc2V0MV9lcGkxNigweDA5MDApOworICAgIGNvbnN0IF9fbTEyOGkgazYzID0gX21tX3NldDFfZXBpMTYoNjMpOworCisgICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZF9zaTEyOChub3RfaGV2LCAqbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKKworICAgIGNvbnN0IF9fbTEyOGkgZl9sbyA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIGYpOworICAgIGNvbnN0IF9fbTEyOGkgZl9oaSA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sIGYpOworCisgICAgY29uc3QgX19tMTI4aSBmOV9sbyA9IF9tbV9tdWxoaV9lcGkxNihmX2xvLCBrOSk7ICAgIC8vIEZpbHRlciAobG8pICogOQorICAgIGNvbnN0IF9fbTEyOGkgZjlfaGkgPSBfbW1fbXVsaGlfZXBpMTYoZl9oaSwgazkpOyAgICAvLyBGaWx0ZXIgKGhpKSAqIDkKKworICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fYWRkX2VwaTE2KGY5X2xvLCBrNjMpOyAgICAvLyBGaWx0ZXIgKiA5ICsgNjMKKyAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX2FkZF9lcGkxNihmOV9oaSwgazYzKTsgICAgLy8gRmlsdGVyICogOSArIDYzCisKKyAgICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX2FkZF9lcGkxNihhMl9sbywgZjlfbG8pOyAgLy8gRmlsdGVyICogMTggKyA2MworICAgIGNvbnN0IF9fbTEyOGkgYTFfaGkgPSBfbW1fYWRkX2VwaTE2KGEyX2hpLCBmOV9oaSk7ICAvLyBGaWx0ZXIgKiAxOCArIDYzCisKKyAgICBjb25zdCBfX20xMjhpIGEwX2xvID0gX21tX2FkZF9lcGkxNihhMV9sbywgZjlfbG8pOyAgLy8gRmlsdGVyICogMjcgKyA2MworICAgIGNvbnN0IF9fbTEyOGkgYTBfaGkgPSBfbW1fYWRkX2VwaTE2KGExX2hpLCBmOV9oaSk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCisKKyAgICBVcGRhdGUyUGl4ZWxzKHAyLCBxMiwgJmEyX2xvLCAmYTJfaGkpOworICAgIFVwZGF0ZTJQaXhlbHMocDEsIHExLCAmYTFfbG8sICZhMV9oaSk7CisgICAgVXBkYXRlMlBpeGVscyhwMCwgcTAsICZhMF9sbywgJmEwX2hpKTsKKyAgfQorfQorCisvLyByZWFkcyA4IHJvd3MgYWNyb3NzIGEgdmVydGljYWwgZWRnZS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ4eDQoY29uc3QgdWludDhfdCogY29uc3QgYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcCwgX19tMTI4aSogY29uc3QgcSkgeworICAvLyBBMCA9IDYzIDYyIDYxIDYwIDIzIDIyIDIxIDIwIDQzIDQyIDQxIDQwIDAzIDAyIDAxIDAwCisgIC8vIEExID0gNzMgNzIgNzEgNzAgMzMgMzIgMzEgMzAgNTMgNTIgNTEgNTAgMTMgMTIgMTEgMTAKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zZXRfZXBpMzIoCisgICAgICBXZWJQTWVtVG9VaW50MzIoJmJbNiAqIHN0cmlkZV0pLCBXZWJQTWVtVG9VaW50MzIoJmJbMiAqIHN0cmlkZV0pLAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzQgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzAgKiBzdHJpZGVdKSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc2V0X2VwaTMyKAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzcgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzMgKiBzdHJpZGVdKSwKKyAgICAgIFdlYlBNZW1Ub1VpbnQzMigmYls1ICogc3RyaWRlXSksIFdlYlBNZW1Ub1VpbnQzMigmYlsxICogc3RyaWRlXSkpOworCisgIC8vIEIwID0gNTMgNDMgNTIgNDIgNTEgNDEgNTAgNDAgMTMgMDMgMTIgMDIgMTEgMDEgMTAgMDAKKyAgLy8gQjEgPSA3MyA2MyA3MiA2MiA3MSA2MSA3MCA2MCAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAorICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGk4KEEwLCBBMSk7CisKKyAgLy8gQzAgPSAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMiAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAorICAvLyBDMSA9IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyIDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQjAsIEIxKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2toaV9lcGkxNihCMCwgQjEpOworCisgIC8vICpwID0gNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEgNzAgNjAgNTAgNDAgMzAgMjAgMTAgMDAKKyAgLy8gKnEgPSA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMyA3MiA2MiA1MiA0MiAzMiAyMiAxMiAwMgorICAqcCA9IF9tbV91bnBhY2tsb19lcGkzMihDMCwgQzEpOworICAqcSA9IF9tbV91bnBhY2toaV9lcGkzMihDMCwgQzEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4NChjb25zdCB1aW50OF90KiBjb25zdCByMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHAxLCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHEwLCBfX20xMjhpKiBjb25zdCBxMSkgeworICAvLyBBc3N1bWUgdGhlIHBpeGVscyBhcm91bmQgdGhlIGVkZ2UgKHwpIGFyZSBudW1iZXJlZCBhcyBmb2xsb3dzCisgIC8vICAgICAgICAgICAgICAgIDAwIDAxIHwgMDIgMDMKKyAgLy8gICAgICAgICAgICAgICAgMTAgMTEgfCAxMiAxMworICAvLyAgICAgICAgICAgICAgICAgLi4uICB8ICAuLi4KKyAgLy8gICAgICAgICAgICAgICAgZTAgZTEgfCBlMiBlMworICAvLyAgICAgICAgICAgICAgICBmMCBmMSB8IGYyIGYzCisgIC8vCisgIC8vIHIwIGlzIHBvaW50aW5nIHRvIHRoZSAwdGggcm93ICgwMCkKKyAgLy8gcjggaXMgcG9pbnRpbmcgdG8gdGhlIDh0aCByb3cgKDgwKQorCisgIC8vIExvYWQKKyAgLy8gcDEgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAvLyBxMCA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgZjAgZTAgZDAgYzAgYjAgYTAgOTAgODAKKyAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyBmMiBlMiBkMiBjMiBiMiBhMiA5MiA4MgorICBMb2FkOHg0KHIwLCBzdHJpZGUsIHAxLCBxMCk7CisgIExvYWQ4eDQocjgsIHN0cmlkZSwgcDAsIHExKTsKKworICB7CisgICAgLy8gcDEgPSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEKKyAgICAvLyBxMCA9IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMworICAgIGNvbnN0IF9fbTEyOGkgdDEgPSAqcDE7CisgICAgY29uc3QgX19tMTI4aSB0MiA9ICpxMDsKKyAgICAqcDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDEsICpwMCk7CisgICAgKnAwID0gX21tX3VucGFja2hpX2VwaTY0KHQxLCAqcDApOworICAgICpxMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0MiwgKnExKTsKKyAgICAqcTEgPSBfbW1fdW5wYWNraGlfZXBpNjQodDIsICpxMSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU0eDQoX19tMTI4aSogY29uc3QgeCwgdWludDhfdCogZHN0LCBpbnQgc3RyaWRlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBkc3QgKz0gc3RyaWRlKSB7CisgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgX21tX2N2dHNpMTI4X3NpMzIoKngpKTsKKyAgICAqeCA9IF9tbV9zcmxpX3NpMTI4KCp4LCA0KTsKKyAgfQorfQorCisvLyBUcmFuc3Bvc2UgYmFjayBhbmQgc3RvcmUKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMTZ4NChjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByMCwgdWludDhfdCogcjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBfX20xMjhpIHQxLCBwMV9zLCBwMF9zLCBxMF9zLCBxMV9zOworCisgIC8vIHAwID0gNzEgNzAgNjEgNjAgNTEgNTAgNDEgNDAgMzEgMzAgMjEgMjAgMTEgMTAgMDEgMDAKKyAgLy8gcDEgPSBmMSBmMCBlMSBlMCBkMSBkMCBjMSBjMCBiMSBiMCBhMSBhMCA5MSA5MCA4MSA4MAorICB0MSA9ICpwMDsKKyAgcDBfcyA9IF9tbV91bnBhY2tsb19lcGk4KCpwMSwgdDEpOworICBwMV9zID0gX21tX3VucGFja2hpX2VwaTgoKnAxLCB0MSk7CisKKyAgLy8gcTAgPSA3MyA3MiA2MyA2MiA1MyA1MiA0MyA0MiAzMyAzMiAyMyAyMiAxMyAxMiAwMyAwMgorICAvLyBxMSA9IGYzIGYyIGUzIGUyIGQzIGQyIGMzIGMyIGIzIGIyIGEzIGEyIDkzIDkyIDgzIDgyCisgIHQxID0gKnEwOworICBxMF9zID0gX21tX3VucGFja2xvX2VwaTgodDEsICpxMSk7CisgIHExX3MgPSBfbW1fdW5wYWNraGlfZXBpOCh0MSwgKnExKTsKKworICAvLyBwMCA9IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwIDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCisgIC8vIHEwID0gNzMgNzIgNzEgNzAgNjMgNjIgNjEgNjAgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKKyAgdDEgPSBwMF9zOworICBwMF9zID0gX21tX3VucGFja2xvX2VwaTE2KHQxLCBxMF9zKTsKKyAgcTBfcyA9IF9tbV91bnBhY2toaV9lcGkxNih0MSwgcTBfcyk7CisKKyAgLy8gcDEgPSBiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMCA5MyA5MiA5MSA5MCA4MyA4MiA4MSA4MAorICAvLyBxMSA9IGYzIGYyIGYxIGYwIGUzIGUyIGUxIGUwIGQzIGQyIGQxIGQwIGMzIGMyIGMxIGMwCisgIHQxID0gcDFfczsKKyAgcDFfcyA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgcTFfcyk7CisgIHExX3MgPSBfbW1fdW5wYWNraGlfZXBpMTYodDEsIHExX3MpOworCisgIFN0b3JlNHg0KCZwMF9zLCByMCwgc3RyaWRlKTsKKyAgcjAgKz0gNCAqIHN0cmlkZTsKKyAgU3RvcmU0eDQoJnEwX3MsIHIwLCBzdHJpZGUpOworCisgIFN0b3JlNHg0KCZwMV9zLCByOCwgc3RyaWRlKTsKKyAgcjggKz0gNCAqIHN0cmlkZTsKKyAgU3RvcmU0eDQoJnExX3MsIHI4LCBzdHJpZGUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgLy8gTG9hZAorICBfX20xMjhpIHAxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0pOworICBfX20xMjhpIHAwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSk7CisgIF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwWzBdKTsKKyAgX19tMTI4aSBxMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbc3RyaWRlXSk7CisKKyAgRG9GaWx0ZXIyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKKworICAvLyBTdG9yZQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSwgcDApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFswXSwgcTApOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBfX20xMjhpIHAxLCBwMCwgcTAsIHExOworCisgIHAgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQorCisgIExvYWQxNng0KHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7CisgIERvRmlsdGVyMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCk7CisgIFN0b3JlMTZ4NCgmcDEsICZwMCwgJnEwLCAmcTEsIHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCisKKyNkZWZpbmUgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG0gPSBNTV9BQlMocDEsIHAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMywgcDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDIsIHAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BWF9ESUZGMihwMywgcDIsIHAxLCBwMCwgbSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMSwgcDApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDMsIHAyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG0gPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAyLCBwMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMCAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGUyID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzEgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlMyA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsyICogc3RyaWRlXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZTQgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMyAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTE9BRFVWX0hfRURHRShwLCB1LCB2LCBzdHJpZGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJih1KVsoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodilbKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgIFwKKyAgcCA9IF9tbV91bnBhY2tsb19lcGk2NChVLCBWKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIGUxLCBlMiwgZTMsIGU0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGUxLCB1LCB2LCAwICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9BRFVWX0hfRURHRShlMiwgdSwgdiwgMSAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPQURVVl9IX0VER0UoZTMsIHUsIHYsIDIgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGU0LCB1LCB2LCAzICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTVE9SRVVWKHAsIHUsIHYsIHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJnVbKHN0cmlkZSldLCBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHAgPSBfbW1fc3JsaV9zaTEyOChwLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmdlsoc3RyaWRlKV0sIHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29tcGxleE1hc2soY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG1hc2spIHsKKyAgY29uc3QgX19tMTI4aSBpdCA9IF9tbV9zZXQxX2VwaTgoaXRocmVzaCk7CisgIGNvbnN0IF9fbTEyOGkgZGlmZiA9IF9tbV9zdWJzX2VwdTgoKm1hc2ssIGl0KTsKKyAgY29uc3QgX19tMTI4aSB0aHJlc2hfbWFzayA9IF9tbV9jbXBlcV9lcGk4KGRpZmYsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworICBfX20xMjhpIGZpbHRlcl9tYXNrOworICBOZWVkc0ZpbHRlcihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCAmZmlsdGVyX21hc2spOworICAqbWFzayA9IF9tbV9hbmRfc2kxMjgodGhyZXNoX21hc2ssIGZpbHRlcl9tYXNrKTsKK30KKworLy8gb24gbWFjcm9ibG9jayBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgdDE7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyOworCisgIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKKyAgTE9BRF9IX0VER0VTNChwIC0gNCAqIHN0cmlkZSwgc3RyaWRlLCB0MSwgcDIsIHAxLCBwMCk7CisgIE1BWF9ESUZGMSh0MSwgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMworICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcTAsIHExLCBxMiwgdDEpOworICBNQVhfRElGRjIodDEsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgLy8gU3RvcmUKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTMgKiBzdHJpZGVdLCBwMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSwgcDEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMSAqIHN0cmlkZV0sIHAwKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbKzAgKiBzdHJpZGVdLCBxMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWysxICogc3RyaWRlXSwgcTEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsrMiAqIHN0cmlkZV0sIHEyKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisKKyAgdWludDhfdCogY29uc3QgYiA9IHAgLSA0OworICBMb2FkMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOyAgLy8gcDMsIHAyLCBwMSwgcDAKKyAgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICBMb2FkMTZ4NChwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOyAgLy8gcTAsIHExLCBxMiwgcTMKKyAgTUFYX0RJRkYyKHEzLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFzaygmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjYoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIFN0b3JlMTZ4NCgmcDMsICZwMiwgJnAxLCAmcDAsIGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTE2eDQoJnEwLCAmcTEsICZxMiwgJnEzLCBwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwOyAgIC8vIGxvb3AgaW52YXJpYW50cworCisgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCk7ICAvLyBwcm9sb2d1ZQorCisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBfX20xMjhpIG1hc2ssIHRtcDEsIHRtcDI7CisgICAgdWludDhfdCogY29uc3QgYiA9IHAgKyAyICogc3RyaWRlOyAgIC8vIGJlZ2lubmluZyBvZiBwMQorICAgIHAgKz0gNCAqIHN0cmlkZTsKKworICAgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7ICAgLy8gY29tcHV0ZSBwYXJ0aWFsIG1hc2sKKyAgICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcDMsIHAyLCB0bXAxLCB0bXAyKTsKKyAgICBNQVhfRElGRjIocDMsIHAyLCB0bXAxLCB0bXAyLCBtYXNrKTsKKworICAgIC8vIHAzIGFuZCBwMiBhcmUgbm90IGp1c3QgdGVtcG9yYXJ5IHZhcmlhYmxlcyBoZXJlOiB0aGV5IHdpbGwgYmUKKyAgICAvLyByZS11c2VkIGZvciBuZXh0IHNwYW4uIEFuZCBxMi9xMyB3aWxsIGJlY29tZSBwMS9wMCBhY2NvcmRpbmdseS4KKyAgICBDb21wbGV4TWFzaygmcDEsICZwMCwgJnAzLCAmcDIsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICAgIERvRmlsdGVyNCgmcDEsICZwMCwgJnAzLCAmcDIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICAgIC8vIFN0b3JlCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMCAqIHN0cmlkZV0sIHAxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYlsxICogc3RyaWRlXSwgcDApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZiWzIgKiBzdHJpZGVdLCBwMyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMyAqIHN0cmlkZV0sIHAyKTsKKworICAgIC8vIHJvdGF0ZSBzYW1wbGVzCisgICAgcDEgPSB0bXAxOworICAgIHAwID0gdG1wMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMDsgICAvLyBsb29wIGludmFyaWFudHMKKworICBMb2FkMTZ4NChwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOyAgLy8gcHJvbG9ndWUKKworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgX19tMTI4aSBtYXNrLCB0bXAxLCB0bXAyOworICAgIHVpbnQ4X3QqIGNvbnN0IGIgPSBwICsgMjsgICAvLyBiZWdpbm5pbmcgb2YgcDEKKworICAgIHAgKz0gNDsgIC8vIGJlZ2lubmluZyBvZiBxMCAoYW5kIG5leHQgc3BhbikKKworICAgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7ICAgLy8gY29tcHV0ZSBwYXJ0aWFsIG1hc2sKKyAgICBMb2FkMTZ4NChwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnRtcDEsICZ0bXAyKTsKKyAgICBNQVhfRElGRjIocDMsIHAyLCB0bXAxLCB0bXAyLCBtYXNrKTsKKworICAgIENvbXBsZXhNYXNrKCZwMSwgJnAwLCAmcDMsICZwMiwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgICAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcDMsICZwMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgICAgU3RvcmUxNng0KCZwMSwgJnAwLCAmcDMsICZwMiwgYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSk7CisKKyAgICAvLyByb3RhdGUgc2FtcGxlcworICAgIHAxID0gdG1wMTsKKyAgICBwMCA9IHRtcDI7CisgIH0KK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgdDEsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7CisKKyAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAorICBMT0FEVVZfSF9FREdFUzQodSAtIDQgKiBzdHJpZGUsIHYgLSA0ICogc3RyaWRlLCBzdHJpZGUsIHQxLCBwMiwgcDEsIHAwKTsKKyAgTUFYX0RJRkYxKHQxLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICAvLyBMb2FkIHEwLCBxMSwgcTIsIHEzCisgIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIHEwLCBxMSwgcTIsIHQxKTsKKyAgTUFYX0RJRkYyKHQxLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFzaygmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjYoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIC8vIFN0b3JlCisgIFNUT1JFVVYocDIsIHUsIHYsIC0zICogc3RyaWRlKTsKKyAgU1RPUkVVVihwMSwgdSwgdiwgLTIgKiBzdHJpZGUpOworICBTVE9SRVVWKHAwLCB1LCB2LCAtMSAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTAsIHUsIHYsIDAgKiBzdHJpZGUpOworICBTVE9SRVVWKHExLCB1LCB2LCAxICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMiwgdSwgdiwgMiAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKworICB1aW50OF90KiBjb25zdCB0dSA9IHUgLSA0OworICB1aW50OF90KiBjb25zdCB0diA9IHYgLSA0OworICBMb2FkMTZ4NCh0dSwgdHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsgIC8vIHAzLCBwMiwgcDEsIHAwCisgIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOyAgICAvLyBxMCwgcTEsIHEyLCBxMworICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgU3RvcmUxNng0KCZwMywgJnAyLCAmcDEsICZwMCwgdHUsIHR2LCBzdHJpZGUpOworICBTdG9yZTE2eDQoJnEwLCAmcTEsICZxMiwgJnEzLCB1LCB2LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHQxLCB0MiwgcDEsIHAwLCBxMCwgcTE7CisKKyAgLy8gTG9hZCBwMywgcDIsIHAxLCBwMAorICBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCB0MiwgdDEsIHAxLCBwMCk7CisgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7CisKKyAgdSArPSA0ICogc3RyaWRlOworICB2ICs9IDQgKiBzdHJpZGU7CisKKyAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMworICBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCBxMCwgcTEsIHQxLCB0Mik7CisgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2soJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIC8vIFN0b3JlCisgIFNUT1JFVVYocDEsIHUsIHYsIC0yICogc3RyaWRlKTsKKyAgU1RPUkVVVihwMCwgdSwgdiwgLTEgKiBzdHJpZGUpOworICBTVE9SRVVWKHEwLCB1LCB2LCAwICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMSwgdSwgdiwgMSAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKKyAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmdDIsICZ0MSwgJnAxLCAmcDApOyAgIC8vIHAzLCBwMiwgcDEsIHAwCisgIE1BWF9ESUZGMSh0MiwgdDEsIHAxLCBwMCwgbWFzayk7CisKKyAgdSArPSA0OyAgLy8gYmVnaW5uaW5nIG9mIHEwCisgIHYgKz0gNDsKKyAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnQxLCAmdDIpOyAgLy8gcTAsIHExLCBxMiwgcTMKKyAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFzaygmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjQoJnAxLCAmcDAsICZxMCwgJnExLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgdSAtPSAyOyAgLy8gYmVnaW5uaW5nIG9mIHAxCisgIHYgLT0gMjsKKyAgU3RvcmUxNng0KCZwMSwgJnAwLCAmcTAsICZxMSwgdSwgdiwgc3RyaWRlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDR4NCBwcmVkaWN0aW9ucworCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisKKy8vIFdlIHVzZSB0aGUgZm9sbG93aW5nIDhiLWFyaXRobWV0aWMgdHJpY2tzOgorLy8gICAgIChhICsgMiAqIGIgKyBjICsgMikgPj4gMiA9IChBQyArIGIgKyAxKSA+PiAxCisvLyAgIHdoZXJlOiBBQyA9IChhICsgYykgPj4gMSA9IFsoYSArIGMgKyAxKSA+PiAxXSAtIFsoYV5jKSAmIDFdCisvLyBhbmQ6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFCICsgQkMgKyAxKSA+PiAxIC0gKGFifGJjKSZsc2IKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBiICsgMSkgPj4gMSwgICBCQyA9IChiICsgYyArIDEpID4+IDEKKy8vICAgYW5kIGFiID0gYSBeIGIsIGJjID0gYiBeIGMsIGxzYiA9IChBQ15CQykmMQorCitzdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUyAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0gwMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0gwMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJzX2VwdTgoYSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhdmcgPSBfbW1fYXZnX2VwdTgoYiwgQkNERUZHSDApOworICBjb25zdCB1aW50MzJfdCB2YWxzID0gX21tX2N2dHNpMTI4X3NpMzIoYXZnKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgaSAqIEJQUywgdmFscyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0hIMCA9IF9tbV9pbnNlcnRfZXBpMTYoQ0RFRkdIMDAsIGRzdFstQlBTICsgN10sIDMpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSEgwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSEgwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgQkNERUZHSDApOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZGVmZyAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAyKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMykpKTsKK30KKworc3RhdGljIHZvaWQgVlI0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIFZlcnRpY2FsLVJpZ2h0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBfX20xMjhpIFhBQkNEID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0IC0gQlBTIC0gMSkpOworICBjb25zdCBfX20xMjhpIEFCQ0QwID0gX21tX3NybGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIGFiY2QgPSBfbW1fYXZnX2VwdTgoWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBfWEFCQ0QgPSBfbW1fc2xsaV9zaTEyOChYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgSVhBQkNEID0gX21tX2luc2VydF9lcGkxNihfWEFCQ0QsIEkgfCAoWCA8PCA4KSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChJWEFCQ0QsIEFCQ0QwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoSVhBQkNELCBBQkNEMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBlZmdoID0gX21tX2F2Z19lcHU4KGF2ZzIsIFhBQkNEKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2QgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBlZmdoICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NsbGlfc2kxMjgoYWJjZCwgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGVmZ2gsIDEpKSk7CisKKyAgLy8gdGhlc2UgdHdvIGFyZSBoYXJkIHRvIGltcGxlbWVudCBpbiBTU0UyLCBzbyB3ZSBrZWVwIHRoZSBDLXZlcnNpb246CisgIERTVCgwLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgwLCAzKSA9IEFWRzMoSywgSiwgSSk7Cit9CisKK3N0YXRpYyB2b2lkIFZMNCh1aW50OF90KiBkc3QpIHsgICAvLyBWZXJ0aWNhbC1MZWZ0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIEJDREVGR0hfID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSF9fID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX2F2Z19lcHU4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMyA9IF9tbV9hdmdfZXB1OChhdmcxLCBhdmcyKTsKKyAgY29uc3QgX19tMTI4aSBsc2IxID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KGF2ZzEsIGF2ZzIpLCBvbmUpOworICBjb25zdCBfX20xMjhpIGFiID0gX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChDREVGR0hfXywgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGFiYmMgPSBfbW1fb3Jfc2kxMjgoYWIsIGJjKTsKKyAgY29uc3QgX19tMTI4aSBsc2IyID0gX21tX2FuZF9zaTEyOChhYmJjLCBsc2IxKTsKKyAgY29uc3QgX19tMTI4aSBhdmc0ID0gX21tX3N1YnNfZXB1OChhdmczLCBsc2IyKTsKKyAgY29uc3QgdWludDMyX3QgZXh0cmFfb3V0ID0gX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgNCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnMSAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGF2ZzQgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmcxLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgMSkpKTsKKworICAvLyB0aGVzZSB0d28gYXJlIGhhcmQgdG8gZ2V0IGFuZCBpcnJlZ3VsYXIKKyAgRFNUKDMsIDIpID0gKGV4dHJhX291dCA+PiAwKSAmIDB4ZmY7CisgIERTVCgzLCAzKSA9IChleHRyYV9vdXQgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgWEFCQ0QgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgLSBCUFMgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgX19fX1hBQkNEID0gX21tX3NsbGlfc2kxMjgoWEFCQ0QsIDQpOworICBjb25zdCB1aW50MzJfdCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IF9fbTEyOGkgTEtKSV9fX19fID0KKyAgICAgIF9tbV9jdnRzaTMyX3NpMTI4KEwgfCAoSyA8PCA4KSB8IChKIDw8IDE2KSB8IChJIDw8IDI0KSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkNEID0gX21tX29yX3NpMTI4KExLSklfX19fXywgX19fX1hBQkNEKTsKKyAgY29uc3QgX19tMTI4aSBLSklYQUJDRF8gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIEpJWEFCQ0RfXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChKSVhBQkNEX18sIExLSklYQUJDRCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgS0pJWEFCQ0RfKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdW1hIDE2eDE2CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24odWludDhfdCogZHN0LCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCB5OworICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKHRvcCkpOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gZHN0Wy0xXSAtIHRvcFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QsIF9tbV9jdnRzaTEyOF9zaTMyKG91dCkpOworICAgIH0KKyAgfSBlbHNlIGlmIChzaXplID09IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCA4OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBkc3RbLTFdIC0gdG9wWy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZSksIHplcm8pOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8wID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8xID0gX21tX3VucGFja2hpX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBkc3RbLTFdIC0gdG9wWy0xXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dF8wID0gX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZV8wKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzEgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzEpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KG91dF8wLCBvdXRfMSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QpICAgeyBUcnVlTW90aW9uKGRzdCwgNCk7IH0KK3N0YXRpYyB2b2lkIFRNOHV2KHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uKGRzdCwgOCk7IH0KK3N0YXRpYyB2b2lkIFRNMTYodWludDhfdCogZHN0KSAgeyBUcnVlTW90aW9uKGRzdCwgMTYpOyB9CisKK3N0YXRpYyB2b2lkIFZFMTYodWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTE2KHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgoZHN0Wy0xXSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0MTYodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNih1aW50OF90KiBkc3QpIHsgICAgLy8gREMKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzYWQ4eDIgPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgLy8gc3VtIHRoZSB0d28gc2Fkczogc2FkOHgyWzA6MV0gKyBzYWQ4eDJbODo5XQorICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoc2FkOHgyLCBfbW1fc2h1ZmZsZV9lcGkzMihzYWQ4eDIsIDIpKTsKKyAgaW50IGxlZnQgPSAwOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBsZWZ0ICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgbGVmdCArIDE2OworICAgIFB1dDE2KERDID4+IDUsIGRzdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICBQdXQxNihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHNhZDh4MiA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICAvLyBzdW0gdGhlIHR3byBzYWRzOiBzYWQ4eDJbMDoxXSArIHNhZDh4Mls4OjldCisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihzYWQ4eDIsIF9tbV9zaHVmZmxlX2VwaTMyKHNhZDh4MiwgMikpOworICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgODsKKyAgUHV0MTYoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIGFuZCBsZWZ0IHNhbXBsZXMKKyAgUHV0MTYoMHg4MCwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCitzdGF0aWMgdm9pZCBWRTh1dih1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHRvcCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSEU4dXYodWludDhfdCogZHN0KSB7ICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgoZHN0Wy0xXSk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8gaGVscGVyIGZvciBjaHJvbWEtREMgcHJlZGljdGlvbnMKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDh4OHV2KHVpbnQ4X3QgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgodik7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXYodWludDhfdCogZHN0KSB7ICAgICAvLyBEQworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9zYWRfZXB1OCh0b3AsIHplcm8pOworICBpbnQgbGVmdCA9IDA7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbGVmdCArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIGxlZnQgKyA4OworICAgIFB1dDh4OHV2KERDID4+IDQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZOb0xlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIDQ7CisgIFB1dDh4OHV2KERDID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3AodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCBzYW1wbGVzCisgIGludCBkYzAgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjMCArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBQdXQ4eDh1dihkYzAgPj4gMywgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcExlZnQodWludDhfdCogZHN0KSB7ICAgIC8vIERDIHdpdGggbm90aGluZworICBQdXQ4eDh1digweDgwLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybTsKKyNpZiBkZWZpbmVkKFVTRV9UUkFOU0ZPUk1fQUMzKQorICBWUDhUcmFuc2Zvcm1BQzMgPSBUcmFuc2Zvcm1BQzM7CisjZW5kaWYKKworICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTY7CisgIFZQOEhGaWx0ZXIxNiA9IEhGaWx0ZXIxNjsKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyODsKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyODsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmk7CisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKKworICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTY7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOworCisgIFZQOFByZWRMdW1hNFsxXSA9IFRNNDsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0OworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDQ7CisgIFZQOFByZWRMdW1hNFs1XSA9IFZSNDsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0OworICBWUDhQcmVkTHVtYTRbN10gPSBWTDQ7CisKKyAgVlA4UHJlZEx1bWExNlswXSA9IERDMTY7CisgIFZQOFByZWRMdW1hMTZbMV0gPSBUTTE2OworICBWUDhQcmVkTHVtYTE2WzJdID0gVkUxNjsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTY7CisgIFZQOFByZWRMdW1hMTZbNF0gPSBEQzE2Tm9Ub3A7CisgIFZQOFByZWRMdW1hMTZbNV0gPSBEQzE2Tm9MZWZ0OworICBWUDhQcmVkTHVtYTE2WzZdID0gREMxNk5vVG9wTGVmdDsKKworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2OworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRNOHV2OworICBWUDhQcmVkQ2hyb21hOFsyXSA9IFZFOHV2OworICBWUDhQcmVkQ2hyb21hOFszXSA9IEhFOHV2OworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3A7CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnQ7CisgIFZQOFByZWRDaHJvbWE4WzZdID0gREM4dXZOb1RvcExlZnQ7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19zc2U0MS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RlY19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGQ3NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZGVjX3NzZTQxLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTQgdmVyc2lvbiBvZiBzb21lIGRlY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kZWMvdnA4aS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworc3RhdGljIHZvaWQgSEUxNih1aW50OF90KiBkc3QpIHsgICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkga1NodWZmbGUzID0gX21tX3NldDFfZXBpOCgzKTsKKyAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCAtIDQpKTsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zaHVmZmxlX2VwaTgoaW4sIGtTaHVmZmxlMyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRTU0U0MSh2b2lkKSB7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0U1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYzMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oCkBAIC0wLDAgKzEsNTY5IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX0RTUF9EU1BfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9EU1BfRFNQX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiLi4vd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBCUFMgMzIgICAvLyB0aGlzIGlzIHRoZSBjb21tb24gc3RyaWRlIGZvciBlbmMvZGVjCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDUFUgZGV0ZWN0aW9uCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgTE9DQUxfR0NDX1ZFUlNJT04gKChfX0dOVUNfXyA8PCA4KSB8IF9fR05VQ19NSU5PUl9fKQorIyBkZWZpbmUgTE9DQUxfR0NDX1BSRVJFUShtYWosIG1pbikgXAorICAgIChMT0NBTF9HQ0NfVkVSU0lPTiA+PSAoKChtYWopIDw8IDgpIHwgKG1pbikpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0dDQ19WRVJTSU9OIDAKKyMgZGVmaW5lIExPQ0FMX0dDQ19QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2J1aWx0aW4KKyMgZGVmaW5lIF9faGFzX2J1aWx0aW4oeCkgMAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+IDEzMTAgJiYgXAorICAgIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkKKyNkZWZpbmUgV0VCUF9NU0NfU1NFMiAgLy8gVmlzdWFsIEMrKyBTU0UyIHRhcmdldHMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTUwMCAmJiBcCisgICAgKGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9NX0lYODYpKQorI2RlZmluZSBXRUJQX01TQ19TU0U0MSAgLy8gVmlzdWFsIEMrKyBTU0U0LjEgdGFyZ2V0cworI2VuZGlmCisKKy8vIFdFQlBfSEFWRV8qIGFyZSB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGluIGRzcAorLy8gZmlsZXMgd2l0aG91dCBpbnRyaW5zaWNzLCBhbGxvd2luZyB0aGUgY29ycmVzcG9uZGluZyBJbml0KCkgdG8gYmUgY2FsbGVkLgorLy8gRmlsZXMgY29udGFpbmluZyBpbnRyaW5zaWNzIHdpbGwgbmVlZCB0byBiZSBidWlsdCB0YXJnZXRpbmcgdGhlIGluc3RydWN0aW9uCisvLyBzZXQgc28gc2hvdWxkIHN1Y2NlZWQgb24gb25lIG9mIHRoZSBlYXJsaWVyIHRlc3RzLgorI2lmIGRlZmluZWQoX19TU0UyX18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikgfHwgZGVmaW5lZChXRUJQX0hBVkVfU1NFMikKKyNkZWZpbmUgV0VCUF9VU0VfU1NFMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fU1NFNF8xX18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFNDEpIHx8IGRlZmluZWQoV0VCUF9IQVZFX1NTRTQxKQorI2RlZmluZSBXRUJQX1VTRV9TU0U0MQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVZYMl9fKSB8fCBkZWZpbmVkKFdFQlBfSEFWRV9BVlgyKQorI2RlZmluZSBXRUJQX1VTRV9BVlgyCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKQorI2RlZmluZSBXRUJQX0FORFJPSURfTkVPTiAgLy8gQW5kcm9pZCB0YXJnZXRzIHRoYXQgbWlnaHQgc3VwcG9ydCBORU9OCisjZW5kaWYKKworLy8gVGhlIGludHJpbnNpY3MgY3VycmVudGx5IGNhdXNlIGNvbXBpbGVyIGVycm9ycyB3aXRoIGFybS1uYWNsLWdjYyBhbmQgdGhlCisvLyBpbmxpbmUgYXNzZW1ibHkgd291bGQgbmVlZCB0byBiZSBtb2RpZmllZCBmb3IgdXNlIHdpdGggTmF0aXZlIENsaWVudC4KKyNpZiAoZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pIHx8IFwKKyAgICAgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgZGVmaW5lZChXRUJQX0hBVkVfTkVPTikpICYmIFwKKyAgICAhZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKKyNkZWZpbmUgV0VCUF9VU0VfTkVPTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxNzAwICYmIGRlZmluZWQoX01fQVJNKQorI2RlZmluZSBXRUJQX1VTRV9ORU9OCisjZGVmaW5lIFdFQlBfVVNFX0lOVFJJTlNJQ1MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX21pcHNfXykgJiYgIWRlZmluZWQoX19taXBzNjQpICYmIFwKKyAgICBkZWZpbmVkKF9fbWlwc19pc2FfcmV2KSAmJiAoX19taXBzX2lzYV9yZXYgPj0gMSkgJiYgKF9fbWlwc19pc2FfcmV2IDwgNikKKyNkZWZpbmUgV0VCUF9VU0VfTUlQUzMyCisjaWYgKF9fbWlwc19pc2FfcmV2ID49IDIpCisjZGVmaW5lIFdFQlBfVVNFX01JUFMzMl9SMgorI2lmIGRlZmluZWQoX19taXBzX2RzcHIyKSB8fCAoX19taXBzX2RzcF9yZXYgPj0gMikKKyNkZWZpbmUgV0VCUF9VU0VfTUlQU19EU1BfUjIKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19taXBzX21zYSkgJiYgZGVmaW5lZChfX21pcHNfaXNhX3JldikgJiYgKF9fbWlwc19pc2FfcmV2ID49IDUpCisjZGVmaW5lIFdFQlBfVVNFX01TQQorI2VuZGlmCisKKy8vIFRoaXMgbWFjcm8gcHJldmVudHMgdGhyZWFkX3Nhbml0aXplciBmcm9tIHJlcG9ydGluZyBrbm93biBjb25jdXJyZW50IHdyaXRlcy4KKyNkZWZpbmUgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTgorI2lmIGRlZmluZWQoX19oYXNfZmVhdHVyZSkKKyNpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpCisjdW5kZWYgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTgorI2RlZmluZSBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplX3RocmVhZCkpCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XCisjaWYgIWRlZmluZWQoV0VCUF9GT1JDRV9BTElHTkVEKSAmJiBkZWZpbmVkKF9fY2xhbmdfXykgJiYgXAorICAgIGRlZmluZWQoX19oYXNfYXR0cmlidXRlKQorI2lmIF9faGFzX2F0dHJpYnV0ZShub19zYW5pdGl6ZSkKKy8vIFRoaXMgbWFjcm8gcHJldmVudHMgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBzYW5pdGl6ZXIgZnJvbSByZXBvcnRpbmcKKy8vIGZhaWx1cmVzLiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gc2lsZW5jZSB1bmFsaWduZWQgbG9hZHMgb24gcGxhdGZvcm1zIHRoYXQKKy8vIGFyZSBrbm93biB0byBzdXBwb3J0IHRoZW0uCisjdW5kZWYgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYgXAorICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5kZWZpbmVkIikpKQorCisvLyBUaGlzIG1hY3JvIHByZXZlbnRzIHRoZSB1bmRlZmluZWQgYmVoYXZpb3Igc2FuaXRpemVyIGZyb20gcmVwb3J0aW5nCisvLyBmYWlsdXJlcyByZWxhdGVkIHRvIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3dzLiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8KKy8vIHNpbGVuY2UgY2FzZXMgd2hlcmUgdGhpcyB3ZWxsIGRlZmluZWQgYmVoYXZpb3IgaXMgZXhwZWN0ZWQuCisjdW5kZWYgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cKKyNkZWZpbmUgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cgXAorICBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKKyNlbmRpZgorI2VuZGlmCisKK3R5cGVkZWYgZW51bSB7CisgIGtTU0UyLAorICBrU1NFMywKKyAga1NTRTRfMSwKKyAga0FWWCwKKyAga0FWWDIsCisgIGtORU9OLAorICBrTUlQUzMyLAorICBrTUlQU2RzcFIyLAorICBrTVNBCit9IENQVUZlYXR1cmU7CisvLyByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBzdXBwb3J0cyB0aGUgZmVhdHVyZS4KK3R5cGVkZWYgaW50ICgqVlA4Q1BVSW5mbykoQ1BVRmVhdHVyZSBmZWF0dXJlKTsKK2V4dGVybiBWUDhDUFVJbmZvIFZQOEdldENQVUluZm87CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0IHN0dWIgZ2VuZXJhdG9yCisKKy8vIERlZmluZXMgYW4gaW5pdCBmdW5jdGlvbiBzdHViIHRvIGVuc3VyZSBlYWNoIG1vZHVsZSBleHBvc2VzIGEgc3ltYm9sLAorLy8gYXZvaWRpbmcgYSBjb21waWxlciB3YXJuaW5nLgorI2RlZmluZSBXRUJQX0RTUF9JTklUX1NUVUIoZnVuYykgXAorICBleHRlcm4gdm9pZCBmdW5jKHZvaWQpOyBcCisgIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBmdW5jKHZvaWQpIHt9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGluZworCisvLyBUcmFuc2Zvcm1zCisvLyBWUDhJZGN0OiBEb2VzIG9uZSBvZiB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLiBJZiBkb190d28gaXMgc2V0LCB0aGUgdHJhbnNmb3JtcworLy8gICAgICAgICAgd2lsbCBiZSBkb25lIGZvciAocmVmLCBpbiwgZHN0KSBhbmQgKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpLgordHlwZWRlZiB2b2lkICgqVlA4SWRjdCkoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3byk7Cit0eXBlZGVmIHZvaWQgKCpWUDhGZGN0KShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KTsKK3R5cGVkZWYgdm9pZCAoKlZQOFdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7CitleHRlcm4gVlA4SWRjdCBWUDhJVHJhbnNmb3JtOworZXh0ZXJuIFZQOEZkY3QgVlA4RlRyYW5zZm9ybTsKK2V4dGVybiBWUDhGZGN0IFZQOEZUcmFuc2Zvcm0yOyAgIC8vIHBlcmZvcm1zIHR3byB0cmFuc2Zvcm1zIGF0IGEgdGltZQorZXh0ZXJuIFZQOFdIVCBWUDhGVHJhbnNmb3JtV0hUOworLy8gUHJlZGljdGlvbnMKKy8vICpkc3QgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLiAqdG9wIGFuZCAqbGVmdCBjYW4gYmUgTlVMTC4KK3R5cGVkZWYgdm9pZCAoKlZQOEludHJhUHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhJbnRyYTRQcmVkcykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90KiB0b3ApOworZXh0ZXJuIFZQOEludHJhNFByZWRzIFZQOEVuY1ByZWRMdW1hNDsKK2V4dGVybiBWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRMdW1hMTY7CitleHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkQ2hyb21hODsKKwordHlwZWRlZiBpbnQgKCpWUDhNZXRyaWMpKGNvbnN0IHVpbnQ4X3QqIHBpeCwgY29uc3QgdWludDhfdCogcmVmKTsKK2V4dGVybiBWUDhNZXRyaWMgVlA4U1NFMTZ4MTYsIFZQOFNTRTE2eDgsIFZQOFNTRTh4OCwgVlA4U1NFNHg0OwordHlwZWRlZiBpbnQgKCpWUDhXTWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHdlaWdodHMpOworLy8gVGhlIHdlaWdodHMgZm9yIFZQOFREaXN0bzR4NCBhbmQgVlA4VERpc3RvMTZ4MTYgY29udGFpbiBhIHJvdy1tYWpvcgorLy8gNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitleHRlcm4gVlA4V01ldHJpYyBWUDhURGlzdG80eDQsIFZQOFREaXN0bzE2eDE2OworCit0eXBlZGVmIHZvaWQgKCpWUDhCbG9ja0NvcHkpKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKK2V4dGVybiBWUDhCbG9ja0NvcHkgVlA4Q29weTR4NDsKK2V4dGVybiBWUDhCbG9ja0NvcHkgVlA4Q29weTE2eDg7CisvLyBRdWFudGl6YXRpb24KK3N0cnVjdCBWUDhNYXRyaXg7ICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgordHlwZWRlZiBpbnQgKCpWUDhRdWFudGl6ZUJsb2NrKShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4TWF0cml4KiBjb25zdCBtdHgpOworLy8gU2FtZSBhcyBWUDhRdWFudGl6ZUJsb2NrLCBidXQgcXVhbnRpemVzIHR3byBjb25zZWN1dGl2ZSBibG9ja3MuCit0eXBlZGVmIGludCAoKlZQOFF1YW50aXplMkJsb2NrcykoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4TWF0cml4KiBjb25zdCBtdHgpOworCitleHRlcm4gVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOworZXh0ZXJuIFZQOFF1YW50aXplMkJsb2NrcyBWUDhFbmNRdWFudGl6ZTJCbG9ja3M7CisKKy8vIHNwZWNpZmljIHRvIDJuZCB0cmFuc2Zvcm06Cit0eXBlZGVmIGludCAoKlZQOFF1YW50aXplQmxvY2tXSFQpKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7CitleHRlcm4gVlA4UXVhbnRpemVCbG9ja1dIVCBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUOworCitleHRlcm4gY29uc3QgaW50IFZQOERzcFNjYW5bMTYgKyA0ICsgNF07CisKKy8vIENvbGxlY3QgaGlzdG9ncmFtIGZvciBzdXNjZXB0aWJpbGl0eSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgTUFYX0NPRUZGX1RIUkVTSCAgIDMxICAgLy8gc2l6ZSBvZiBoaXN0b2dyYW0gdXNlZCBieSBDb2xsZWN0SGlzdG9ncmFtLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBXZSBvbmx5IG5lZWQgdG8gc3RvcmUgbWF4X3ZhbHVlIGFuZCBsYXN0X25vbl96ZXJvLCBub3QgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgaW50IG1heF92YWx1ZTsKKyAgaW50IGxhc3Rfbm9uX3plcm87Cit9IFZQOEhpc3RvZ3JhbTsKK3R5cGVkZWYgdm9pZCAoKlZQOENIaXN0bykoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworZXh0ZXJuIFZQOENIaXN0byBWUDhDb2xsZWN0SGlzdG9ncmFtOworLy8gR2VuZXJhbC1wdXJwb3NlIHV0aWwgZnVuY3Rpb24gdG8gaGVscCBWUDhDb2xsZWN0SGlzdG9ncmFtKCkuCit2b2lkIFZQOFNldEhpc3RvZ3JhbURhdGEoY29uc3QgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0byk7CisKKy8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb2YgdGhlIGFib3ZlCit2b2lkIFZQOEVuY0RzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3N0IGZ1bmN0aW9ucyAoZW5jb2RpbmcpCisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhFbnRyb3B5Q29zdFsyNTZdOyAgICAgICAgLy8gOGJpdCBmaXhlZC1wb2ludCBsb2cocCkKKy8vIGFwcHJveGltYXRlIGNvc3QgcGVyIGxldmVsOgorZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsRml4ZWRDb3N0c1syMDQ3IC8qTUFYX0xFVkVMKi8gKyAxXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOEVuY0JhbmRzWzE2ICsgMV07CisKK3N0cnVjdCBWUDhSZXNpZHVhbDsKK3R5cGVkZWYgdm9pZCAoKlZQOFNldFJlc2lkdWFsQ29lZmZzRnVuYykoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcyk7CitleHRlcm4gVlA4U2V0UmVzaWR1YWxDb2VmZnNGdW5jIFZQOFNldFJlc2lkdWFsQ29lZmZzOworCisvLyBDb3N0IGNhbGN1bGF0aW9uIGZ1bmN0aW9uLgordHlwZWRlZiBpbnQgKCpWUDhHZXRSZXNpZHVhbENvc3RGdW5jKShpbnQgY3R4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpOworZXh0ZXJuIFZQOEdldFJlc2lkdWFsQ29zdEZ1bmMgVlA4R2V0UmVzaWR1YWxDb3N0OworCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgdXNpbmcgdGhlIGFib3ZlCit2b2lkIFZQOEVuY0RzcENvc3RJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NJTSB1dGlscworCisvLyBzdHJ1Y3QgZm9yIGFjY3VtdWxhdGluZyBzdGF0aXN0aWNhbCBtb21lbnRzCit0eXBlZGVmIHN0cnVjdCB7CisgIGRvdWJsZSB3OyAgICAgICAgICAgICAgLy8gc3VtKHdfaSkgOiBzdW0gb2Ygd2VpZ2h0cworICBkb3VibGUgeG0sIHltOyAgICAgICAgIC8vIHN1bSh3X2kgKiB4X2kpLCBzdW0od19pICogeV9pKQorICBkb3VibGUgeHhtLCB4eW0sIHl5bTsgIC8vIHN1bSh3X2kgKiB4X2kgKiB4X2kpLCBldGMuCit9IFZQOERpc3RvU3RhdHM7CisKKyNkZWZpbmUgVlA4X1NTSU1fS0VSTkVMIDMgICAvLyB0b3RhbCBzaXplIG9mIHRoZSBrZXJuZWw6IDIgKiBWUDhfU1NJTV9LRVJORUwgKyAxCit0eXBlZGVmIHZvaWQgKCpWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWRGdW5jKShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sICAvLyBjZW50ZXIgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXLCBpbnQgSCwgICAgLy8gcGxhbmUgZGltZW5zaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7CisKKy8vIFRoaXMgdmVyc2lvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZ3VhcmFudGVlIHRoYXQgeW91IGNhbiBsb2FkIDggYnl0ZXMgYW5kCisvLyA4IHJvd3MgYXQgb2Zmc2V0IHNyYzEgYW5kIHNyYzIKK3R5cGVkZWYgdm9pZCAoKlZQOFNTSU1BY2N1bXVsYXRlRnVuYykoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cyk7CisKK2V4dGVybiBWUDhTU0lNQWNjdW11bGF0ZUZ1bmMgVlA4U1NJTUFjY3VtdWxhdGU7ICAgICAgICAgLy8gdW5jbGlwcGVkIC8gdW5jaGVja2VkCitleHRlcm4gVlA4U1NJTUFjY3VtdWxhdGVDbGlwcGVkRnVuYyBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQ7ICAgLy8gd2l0aCBjbGlwcGluZworCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBhYm92ZSBkaXJlY3RseQordm9pZCBWUDhTU0lNRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kaW5nCisKK3R5cGVkZWYgdm9pZCAoKlZQOERlY0lkY3QpKGNvbnN0IGludDE2X3QqIGNvZWZmcywgdWludDhfdCogZHN0KTsKKy8vIHdoZW4gZG9pbmcgdHdvIHRyYW5zZm9ybXMsIGNvZWZmcyBpcyBhY3R1YWxseSBpbnQxNl90WzJdWzE2XS4KK3R5cGVkZWYgdm9pZCAoKlZQOERlY0lkY3QyKShjb25zdCBpbnQxNl90KiBjb2VmZnMsIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3byk7CitleHRlcm4gVlA4RGVjSWRjdDIgVlA4VHJhbnNmb3JtOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtQUMzOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtVVY7CitleHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQzsKK2V4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDVVY7CitleHRlcm4gVlA4V0hUIFZQOFRyYW5zZm9ybVdIVDsKKworLy8gKmRzdCBpcyB0aGUgZGVzdGluYXRpb24gYmxvY2ssIHdpdGggc3RyaWRlIEJQUy4gQm91bmRhcnkgc2FtcGxlcyBhcmUKKy8vIGFzc3VtZWQgYWNjZXNzaWJsZSB3aGVuIG5lZWRlZC4KK3R5cGVkZWYgdm9pZCAoKlZQOFByZWRGdW5jKSh1aW50OF90KiBkc3QpOworZXh0ZXJuIFZQOFByZWRGdW5jIFZQOFByZWRMdW1hMTZbLyogTlVNX0JfRENfTU9ERVMgKi9dOworZXh0ZXJuIFZQOFByZWRGdW5jIFZQOFByZWRDaHJvbWE4Wy8qIE5VTV9CX0RDX01PREVTICovXTsKK2V4dGVybiBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTRbLyogTlVNX0JNT0RFUyAqL107CisKKy8vIGNsaXBwaW5nIHRhYmxlcyAoZm9yIGZpbHRlcmluZykKK2V4dGVybiBjb25zdCBpbnQ4X3QqIGNvbnN0IFZQOGtzY2xpcDE7ICAvLyBjbGlwcyBbLTEwMjAsIDEwMjBdIHRvIFstMTI4LCAxMjddCitleHRlcm4gY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAyOyAgLy8gY2xpcHMgWy0xMTIsIDExMl0gdG8gWy0xNiwgMTVdCitleHRlcm4gY29uc3QgdWludDhfdCogY29uc3QgVlA4a2NsaXAxOyAgLy8gY2xpcHMgWy0yNTUsNTExXSB0byBbMCwyNTVdCitleHRlcm4gY29uc3QgdWludDhfdCogY29uc3QgVlA4a2FiczA7ICAgLy8gYWJzKHgpIGZvciB4IGluIFstMjU1LDI1NV0KKy8vIG11c3QgYmUgY2FsbGVkIGZpcnN0Cit2b2lkIFZQOEluaXRDbGlwVGFibGVzKHZvaWQpOworCisvLyBzaW1wbGUgZmlsdGVyIChvbmx5IGZvciBsdW1hKQordHlwZWRlZiB2b2lkICgqVlA4U2ltcGxlRmlsdGVyRnVuYykodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCk7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTY7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTY7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOyAgLy8gZmlsdGVyIDMgaW5uZXIgZWRnZXMKK2V4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNmk7CisKKy8vIHJlZ3VsYXIgZmlsdGVyIChvbiBib3RoIG1hY3JvYmxvY2sgZWRnZXMgYW5kIGlubmVyIGVkZ2VzKQordHlwZWRlZiB2b2lkICgqVlA4THVtYUZpbHRlckZ1bmMpKHVpbnQ4X3QqIGx1bWEsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhDaHJvbWFGaWx0ZXJGdW5jKSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7CisvLyBvbiBvdXRlciBlZGdlCitleHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OworZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNjsKK2V4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4OworZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7CisKKy8vIG9uIGlubmVyIGVkZ2UKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOyAgIC8vIGZpbHRlcmluZyAzIGlubmVyIGVkZ2VzIGFsdG9nZXRoZXIKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTZpOworZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOyAgLy8gZmlsdGVyaW5nIHUgYW5kIHYgYWx0b2dldGhlcgorZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjhpOworCisvLyBEaXRoZXJpbmcuIENvbWJpbmVzIGRpdGhlcmluZyB2YWx1ZXMgKGNlbnRlcmVkIGFyb3VuZCAxMjgpIHdpdGggZHN0W10sCisvLyBhY2NvcmRpbmcgdG86IGRzdFtdID0gY2xpcChkc3RbXSArICgoKGRpdGhlcltdLTEyOCkgKyA4KSA+PiA0KQorI2RlZmluZSBWUDhfRElUSEVSX0RFU0NBTEUgNAorI2RlZmluZSBWUDhfRElUSEVSX0RFU0NBTEVfUk9VTkRFUiAoMSA8PCAoVlA4X0RJVEhFUl9ERVNDQUxFIC0gMSkpCisjZGVmaW5lIFZQOF9ESVRIRVJfQU1QX0JJVFMgNworI2RlZmluZSBWUDhfRElUSEVSX0FNUF9DRU5URVIgKDEgPDwgVlA4X0RJVEhFUl9BTVBfQklUUykKK2V4dGVybiB2b2lkICgqVlA4RGl0aGVyQ29tYmluZTh4OCkoY29uc3QgdWludDhfdCogZGl0aGVyLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKTsKKworLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIHVzaW5nIHRoZSBhYm92ZQordm9pZCBWUDhEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUCBJL08KKworI2RlZmluZSBGQU5DWV9VUFNBTVBMSU5HICAgLy8gdW5kZWZpbmVkIHRvIHJlbW92ZSBmYW5jeSB1cHNhbXBsaW5nIHN1cHBvcnQKKworLy8gQ29udmVydCBhIHBhaXIgb2YgeS91L3YgbGluZXMgdG9nZXRoZXIgdG8gdGhlIG91dHB1dCByZ2IvYSBjb2xvcnNwYWNlLgorLy8gYm90dG9tX3kgY2FuIGJlIE5VTEwgaWYgb25seSBvbmUgbGluZSBvZiBvdXRwdXQgaXMgbmVlZGVkIChhdCB0b3AvYm90dG9tKS4KK3R5cGVkZWYgdm9pZCAoKldlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYykoCisgICAgY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LAorICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwKKyAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsCisgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbik7CisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIEZhbmN5IHVwc2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgWVVWIHRvIFJHQihBKSBtb2RlcworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCisjZW5kaWYgICAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLyBQZXItcm93IHBvaW50LXNhbXBsaW5nIG1ldGhvZHMuCit0eXBlZGVmIHZvaWQgKCpXZWJQU2FtcGxlclJvd0Z1bmMpKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7CisvLyBHZW5lcmljIGZ1bmN0aW9uIHRvIGFwcGx5ICdXZWJQU2FtcGxlclJvd0Z1bmMnIHRvIHRoZSB3aG9sZSBwbGFuZToKK3ZvaWQgV2ViUFNhbXBsZXJQcm9jZXNzUGxhbmUoY29uc3QgdWludDhfdCogeSwgaW50IHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBpbnQgdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jKTsKKworLy8gU2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgcm93cyBvZiBZVVYgdG8gUkdCKEEpCitleHRlcm4gV2ViUFNhbXBsZXJSb3dGdW5jIFdlYlBTYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCisvLyBHZW5lcmFsIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHR3byBsaW5lcyBvZiBBUkdCIG9yIFJHQkEuCisvLyAnYWxwaGFfaXNfbGFzdCcgc2hvdWxkIGJlIHRydWUgaWYgMHhmZjAwMDAwMCBpcyBzdG9yZWQgaW4gbWVtb3J5IGFzCisvLyBhcyAweDAwLCAweDAwLCAweDAwLCAweGZmIChsaXR0bGUgZW5kaWFuKS4KK1dlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQR2V0TGluZVBhaXJDb252ZXJ0ZXIoaW50IGFscGhhX2lzX2xhc3QpOworCisvLyBZVVY0NDQtPlJHQiBjb252ZXJ0ZXJzCit0eXBlZGVmIHZvaWQgKCpXZWJQWVVWNDQ0Q29udmVydGVyKShjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7CisKK2V4dGVybiBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzWy8qIE1PREVfTEFTVCAqL107CisKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyB0aGUgV2ViUFVwc2FtcGxlcnNbXSAoYW5kIGZvciBwcmVtdWx0aXBsaWVkCisvLyBjb2xvcnNwYWNlcyBsaWtlIHJnYkEsIHJnYkE0NDQ0LCBldGMpCit2b2lkIFdlYlBJbml0VXBzYW1wbGVycyh2b2lkKTsKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBXZWJQU2FtcGxlcnNbXQordm9pZCBXZWJQSW5pdFNhbXBsZXJzKHZvaWQpOworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW10KK3ZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVJHQiAtPiBZVVYgY29udmVydGVycworCisvLyBDb252ZXJ0IEFSR0Igc2FtcGxlcyB0byBsdW1hIFkuCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvWSkoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7CisvLyBDb252ZXJ0IEFSR0Igc2FtcGxlcyB0byBVL1Ygd2l0aCBkb3duc2FtcGxpbmcuIGRvX3N0b3JlIHNob3VsZCBiZSAnMScgZm9yCisvLyBldmVuIGxpbmVzIGFuZCAnMCcgZm9yIG9kZCBvbmVzLiAnc3JjX3dpZHRoJyBpcyB0aGUgb3JpZ2luYWwgd2lkdGgsIG5vdAorLy8gdGhlIFUvViBvbmUuCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvVVYpKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpOworCisvLyBDb252ZXJ0IGEgcm93IG9mIGFjY3VtdWxhdGVkIChmb3VyLXZhbHVlcykgb2YgcmdiYTMyIHRvd2FyZCBVL1YKK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRSR0JBMzJUb1VWKShjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCk7CisKKy8vIENvbnZlcnQgUkdCIG9yIEJHUiB0byBZCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0UkdCMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRCR1IyNFRvWSkoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOworCisvLyB1c2VkIGZvciBwbGFpbi1DIGZhbGxiYWNrLgorZXh0ZXJuIHZvaWQgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSk7CitleHRlcm4gdm9pZCBXZWJQQ29udmVydFJHQkEzMlRvVVZfQyhjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKTsKKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzY2FsZXIKKworc3RydWN0IFdlYlBSZXNjYWxlcjsKKworLy8gSW1wb3J0IGEgcm93IG9mIGRhdGEgYW5kIHNhdmUgaXRzIGNvbnRyaWJ1dGlvbiBpbiB0aGUgcmVzY2FsZXIuCisvLyAnY2hhbm5lbCcgZGVub3RlcyB0aGUgY2hhbm5lbCBudW1iZXIgdG8gYmUgaW1wb3J0ZWQuICdFeHBhbmQnIGNvcnJlc3BvbmRzIHRvCisvLyB0aGUgd3JrLT54X2V4cGFuZCBjYXNlLiBPdGhlcndpc2UsICdTaHJpbmsnIGlzIHRvIGJlIHVzZWQuCit0eXBlZGVmIHZvaWQgKCpXZWJQUmVzY2FsZXJJbXBvcnRSb3dGdW5jKShzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpOworCitleHRlcm4gV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQ7CitleHRlcm4gV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbms7CisKKy8vIEV4cG9ydCBvbmUgcm93IChzdGFydGluZyBhdCB4X291dCBwb3NpdGlvbikgZnJvbSByZXNjYWxlci4KKy8vICdFeHBhbmQnIGNvcnJlc3BvbmRzIHRvIHRoZSB3cmstPnlfZXhwYW5kIGNhc2UuCisvLyBPdGhlcndpc2UgJ1NocmluaycgaXMgdG8gYmUgdXNlZAordHlwZWRlZiB2b2lkICgqV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYykoc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKK2V4dGVybiBXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZDsKK2V4dGVybiBXZWJQUmVzY2FsZXJFeHBvcnRSb3dGdW5jIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluazsKKworLy8gUGxhaW4tQyBpbXBsZW1lbnRhdGlvbiwgYXMgZmFsbC1iYWNrLgorZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kQyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtDKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZEMoc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmlua0Moc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKKworLy8gTWFpbiBlbnRyeSBjYWxsczoKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvdyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKKy8vIEV4cG9ydCBvbmUgcm93IChzdGFydGluZyBhdCB4X291dCBwb3NpdGlvbikgZnJvbSByZXNjYWxlci4KK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOworCisvLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwuCisKKy8vIEFwcGx5IGFscGhhIHByZS1tdWx0aXBseSBvbiBhbiByZ2JhLCBiZ3JhIG9yIGFyZ2IgcGxhbmUgb2Ygc2l6ZSB3ICogaC4KKy8vIGFscGhhX2ZpcnN0IHNob3VsZCBiZSAwIGZvciBhcmdiLCAxIGZvciByZ2JhIG9yIGJncmEgKHdoZXJlIGFscGhhIGlzIGxhc3QpLgorZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5KSgKKyAgICB1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7CisKKy8vIFNhbWUsIGJ1ZiBzcGVjaWZpY2FsbHkgZm9yIFJHQkE0NDQ0IGZvcm1hdAorZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCkoCisgICAgdWludDhfdCogcmdiYTQ0NDQsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7CisKKy8vIERpc3BhdGNoIHRoZSB2YWx1ZXMgZnJvbSBhbHBoYVtdIHBsYW5lIHRvIHRoZSBBUkdCIGRlc3RpbmF0aW9uICdkc3QnLgorLy8gUmV0dXJucyB0cnVlIGlmIGFscGhhW10gcGxhbmUgaGFzIG5vbi10cml2aWFsIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSAweGZmLgorZXh0ZXJuIGludCAoKldlYlBEaXNwYXRjaEFscGhhKShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKTsKKworLy8gVHJhbnNmZXIgcGFja2VkIDhiIGFscGhhW10gdmFsdWVzIHRvIGdyZWVuIGNoYW5uZWwgaW4gZHN0W10sIHplcm8naW5nIHRoZQorLy8gQS9SL0IgdmFsdWVzLiAnZHN0X3N0cmlkZScgaXMgdGhlIHN0cmlkZSBmb3IgZHN0W10gaW4gdWludDMyX3QgdW5pdHMuCitleHRlcm4gdm9pZCAoKldlYlBEaXNwYXRjaEFscGhhVG9HcmVlbikoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RyaWRlKTsKKworLy8gRXh0cmFjdCB0aGUgYWxwaGEgdmFsdWVzIGZyb20gMzJiIHZhbHVlcyBpbiBhcmdiW10gYW5kIHBhY2sgdGhlbSBpbnRvIGFscGhhW10KKy8vICh0aGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBXZWJQRGlzcGF0Y2hBbHBoYSkuCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBvbmx5IHRyaXZpYWwgMHhmZiBhbHBoYSB2YWx1ZXMuCitleHRlcm4gaW50ICgqV2ViUEV4dHJhY3RBbHBoYSkoY29uc3QgdWludDhfdCogYXJnYiwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSk7CisKKy8vIFByZS1NdWx0aXBseSBvcGVyYXRpb24gdHJhbnNmb3JtcyB4IGludG8geCAqIEEgLyAyNTUgICh3aGVyZSB4PVksUixHIG9yIEIpLgorLy8gVW4tTXVsdGlwbHkgb3BlcmF0aW9uIHRyYW5zZm9ybXMgeCBpbnRvIHggKiAyNTUgLyBBLgorCisvLyBQcmUtTXVsdGlwbHkgb3IgVW4tTXVsdGlwbHkgKGlmICdpbnZlcnNlJyBpcyB0cnVlKSBhcmdiIHZhbHVlcyBpbiBhIHJvdy4KK2V4dGVybiB2b2lkICgqV2ViUE11bHRBUkdCUm93KSh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBhIFdlYlBNdWx0QVJHQlJvdygpLCBidXQgZm9yIHNldmVyYWwgcm93cy4KK3ZvaWQgV2ViUE11bHRBUkdCUm93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBmb3IgYSByb3cgb2Ygc2luZ2xlIHZhbHVlcywgd2l0aCBzaWRlIGFscGhhIHZhbHVlcy4KK2V4dGVybiB2b2lkICgqV2ViUE11bHRSb3cpKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworLy8gU2FtZSBhIFdlYlBNdWx0Um93KCksIGJ1dCBmb3Igc2V2ZXJhbCAnbnVtX3Jvd3MnIHJvd3MuCit2b2lkIFdlYlBNdWx0Um93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IG51bV9yb3dzLCBpbnQgaW52ZXJzZSk7CisKKy8vIFBsYWluLUMgdmVyc2lvbnMsIHVzZWQgYXMgZmFsbGJhY2sgYnkgc29tZSBpbXBsZW1lbnRhdGlvbnMuCit2b2lkIFdlYlBNdWx0Um93Qyh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7Cit2b2lkIFdlYlBNdWx0QVJHQlJvd0ModWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKy8vIFRvIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgordm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZyh2b2lkKTsKKworLy8gQVJHQiBwYWNraW5nIGZ1bmN0aW9uOiBhL3IvZy9iIGlucHV0IGlzIHJnYmEgb3IgYmdyYSBvcmRlci4KK2V4dGVybiB2b2lkICgqVlA4UGFja0FSR0IpKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCk7CisKKy8vIFJHQiBwYWNraW5nIGZ1bmN0aW9uLiAnc3RlcCcgY2FuIGJlIDMgb3IgNC4gci9nL2IgaW5wdXQgaXMgcmdiIG9yIGJnciBvcmRlci4KK2V4dGVybiB2b2lkICgqVlA4UGFja1JHQikoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpOworCisvLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgVlA4RW5jRHNwQVJHQkluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWx0ZXIgZnVuY3Rpb25zCisKK3R5cGVkZWYgZW51bSB7ICAgICAvLyBGaWx0ZXIgdHlwZXMuCisgIFdFQlBfRklMVEVSX05PTkUgPSAwLAorICBXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMLAorICBXRUJQX0ZJTFRFUl9WRVJUSUNBTCwKKyAgV0VCUF9GSUxURVJfR1JBRElFTlQsCisgIFdFQlBfRklMVEVSX0xBU1QgPSBXRUJQX0ZJTFRFUl9HUkFESUVOVCArIDEsICAvLyBlbmQgbWFya2VyCisgIFdFQlBfRklMVEVSX0JFU1QsICAgIC8vIG1ldGEtdHlwZXMKKyAgV0VCUF9GSUxURVJfRkFTVAorfSBXRUJQX0ZJTFRFUl9UWVBFOworCit0eXBlZGVmIHZvaWQgKCpXZWJQRmlsdGVyRnVuYykoY29uc3QgdWludDhfdCogaW4sIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBvdXQpOworLy8gSW4tcGxhY2UgdW4tZmlsdGVyaW5nLgorLy8gV2FybmluZyEgJ3ByZXZfbGluZScgcG9pbnRlciBjYW4gYmUgZXF1YWwgdG8gJ2N1cl9saW5lJyBvciAncHJlZHMnLgordHlwZWRlZiB2b2lkICgqV2ViUFVuZmlsdGVyRnVuYykoY29uc3QgdWludDhfdCogcHJldl9saW5lLCBjb25zdCB1aW50OF90KiBwcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGN1cl9saW5lLCBpbnQgd2lkdGgpOworCisvLyBGaWx0ZXIgdGhlIGdpdmVuIGRhdGEgdXNpbmcgdGhlIGdpdmVuIHByZWRpY3Rvci4KKy8vICdpbicgY29ycmVzcG9uZHMgdG8gYSAyLWRpbWVuc2lvbmFsIHBpeGVsIGFycmF5IG9mIHNpemUgKHN0cmlkZSAqIGhlaWdodCkKKy8vIGluIHJhc3RlciBvcmRlci4KKy8vICdzdHJpZGUnIGlzIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbiBsaW5lICh3aXRoIHBvc3NpYmxlIHBhZGRpbmcpLgorLy8gJ291dCcgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQuCitleHRlcm4gV2ViUEZpbHRlckZ1bmMgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfTEFTVF07CisKKy8vIEluLXBsYWNlIHJlY29uc3RydWN0IHRoZSBvcmlnaW5hbCBkYXRhIGZyb20gdGhlIGdpdmVuIGZpbHRlcmVkIGRhdGEuCisvLyBUaGUgcmVjb25zdHJ1Y3Rpb24gd2lsbCBiZSBkb25lIGZvciAnbnVtX3Jvd3MnIHJvd3Mgc3RhcnRpbmcgZnJvbSAncm93JworLy8gKGFzc3VtaW5nIHJvd3MgdXB0byAncm93IC0gMScgYXJlIGFscmVhZHkgcmVjb25zdHJ1Y3RlZCkuCitleHRlcm4gV2ViUFVuZmlsdGVyRnVuYyBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOworCisvLyBUbyBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgVlA4RmlsdGVyc0luaXQodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX0RTUF9EU1BfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGExNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuYy5jCkBAIC0wLDAgKzEsODYzIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwXzhiKGludCB2KSB7CisgIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwX21heChpbnQgdiwgaW50IG1heCkgeworICByZXR1cm4gKHYgPiBtYXgpID8gbWF4IDogdjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXB1dGUgc3VzY2VwdGliaWxpdHkgYmFzZWQgb24gRENULWNvZWZmIGhpc3RvZ3JhbXM6CisvLyB0aGUgaGlnaGVyLCB0aGUgImVhc2llciIgdGhlIG1hY3JvYmxvY2sgaXMgdG8gY29tcHJlc3MuCisKK2NvbnN0IGludCBWUDhEc3BTY2FuWzE2ICsgNCArIDRdID0geworICAvLyBMdW1hCisgIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAorICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKKyAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCisgIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTLAorCisgIDAgKyAwICogQlBTLCAgIDQgKyAwICogQlBTLCAwICsgNCAqIEJQUywgIDQgKyA0ICogQlBTLCAgICAvLyBVCisgIDggKyAwICogQlBTLCAgMTIgKyAwICogQlBTLCA4ICsgNCAqIEJQUywgMTIgKyA0ICogQlBTICAgICAvLyBWCit9OworCisvLyBnZW5lcmFsLXB1cnBvc2UgdXRpbCBmdW5jdGlvbgordm9pZCBWUDhTZXRIaXN0b2dyYW1EYXRhKGNvbnN0IGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IG1heF92YWx1ZSA9IDAsIGxhc3Rfbm9uX3plcm8gPSAxOworICBpbnQgazsKKyAgZm9yIChrID0gMDsgayA8PSBNQVhfQ09FRkZfVEhSRVNIOyArK2spIHsKKyAgICBjb25zdCBpbnQgdmFsdWUgPSBkaXN0cmlidXRpb25ba107CisgICAgaWYgKHZhbHVlID4gMCkgeworICAgICAgaWYgKHZhbHVlID4gbWF4X3ZhbHVlKSBtYXhfdmFsdWUgPSB2YWx1ZTsKKyAgICAgIGxhc3Rfbm9uX3plcm8gPSBrOworICAgIH0KKyAgfQorICBoaXN0by0+bWF4X3ZhbHVlID0gbWF4X3ZhbHVlOworICBoaXN0by0+bGFzdF9ub25femVybyA9IGxhc3Rfbm9uX3plcm87Cit9CisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKKyAgICBpbnQgazsKKyAgICBpbnQxNl90IG91dFsxNl07CisKKyAgICBWUDhGVHJhbnNmb3JtKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICBjb25zdCBpbnQgdiA9IGFicyhvdXRba10pID4+IDM7CisgICAgICBjb25zdCBpbnQgY2xpcHBlZF92YWx1ZSA9IGNsaXBfbWF4KHYsIE1BWF9DT0VGRl9USFJFU0gpOworICAgICAgKytkaXN0cmlidXRpb25bY2xpcHBlZF92YWx1ZV07CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBydW4tdGltZSB0YWJsZXMgKH40aykKKworc3RhdGljIHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTEwICsgMV07ICAgIC8vIGNsaXBzIFstMjU1LDUxMF0gdG8gWzAsMjU1XQorCisvLyBXZSBkZWNsYXJlIHRoaXMgdmFyaWFibGUgJ3ZvbGF0aWxlJyB0byBwcmV2ZW50IGluc3RydWN0aW9uIHJlb3JkZXJpbmcKKy8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQorc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOworCitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRUYWJsZXModm9pZCkgeworICBpZiAoIXRhYmxlc19vaykgeworICAgIGludCBpOworICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKKyAgICAgIGNsaXAxWzI1NSArIGldID0gY2xpcF84YihpKTsKKyAgICB9CisgICAgdGFibGVzX29rID0gMTsKKyAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworI2RlZmluZSBTVE9SRSh4LCB5LCB2KSBcCisgIGRzdFsoeCkgKyAoeSkgKiBCUFNdID0gY2xpcF84YihyZWZbKHgpICsgKHkpICogQlBTXSArICgodikgPj4gMykpCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworI2RlZmluZSBNVUwoYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBJVHJhbnNmb3JtT25lKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgQ1s0ICogNF0sICp0bXA7CisgIGludCBpOworICB0bXAgPSBDOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIHZlcnRpY2FsIHBhc3MKKyAgICBjb25zdCBpbnQgYSA9IGluWzBdICsgaW5bOF07CisgICAgY29uc3QgaW50IGIgPSBpblswXSAtIGluWzhdOworICAgIGNvbnN0IGludCBjID0gTVVMKGluWzRdLCBrQzIpIC0gTVVMKGluWzEyXSwga0MxKTsKKyAgICBjb25zdCBpbnQgZCA9IE1VTChpbls0XSwga0MxKSArIE1VTChpblsxMl0sIGtDMik7CisgICAgdG1wWzBdID0gYSArIGQ7CisgICAgdG1wWzFdID0gYiArIGM7CisgICAgdG1wWzJdID0gYiAtIGM7CisgICAgdG1wWzNdID0gYSAtIGQ7CisgICAgdG1wICs9IDQ7CisgICAgaW4rKzsKKyAgfQorCisgIHRtcCA9IEM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgY29uc3QgaW50IGRjID0gdG1wWzBdICsgNDsKKyAgICBjb25zdCBpbnQgYSA9ICBkYyArICB0bXBbOF07CisgICAgY29uc3QgaW50IGIgPSAgZGMgLSAgdG1wWzhdOworICAgIGNvbnN0IGludCBjID0gTVVMKHRtcFs0XSwga0MyKSAtIE1VTCh0bXBbMTJdLCBrQzEpOworICAgIGNvbnN0IGludCBkID0gTVVMKHRtcFs0XSwga0MxKSArIE1VTCh0bXBbMTJdLCBrQzIpOworICAgIFNUT1JFKDAsIGksIGEgKyBkKTsKKyAgICBTVE9SRSgxLCBpLCBiICsgYyk7CisgICAgU1RPUkUoMiwgaSwgYiAtIGMpOworICAgIFNUT1JFKDMsIGksIGEgLSBkKTsKKyAgICB0bXArKzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsIGludDE2X3QqIG91dCkgeworICBpbnQgaTsKKyAgaW50IHRtcFsxNl07CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIHNyYyArPSBCUFMsIHJlZiArPSBCUFMpIHsKKyAgICBjb25zdCBpbnQgZDAgPSBzcmNbMF0gLSByZWZbMF07ICAgLy8gOWJpdCBkeW5hbWljIHJhbmdlIChbLTI1NSwyNTVdKQorICAgIGNvbnN0IGludCBkMSA9IHNyY1sxXSAtIHJlZlsxXTsKKyAgICBjb25zdCBpbnQgZDIgPSBzcmNbMl0gLSByZWZbMl07CisgICAgY29uc3QgaW50IGQzID0gc3JjWzNdIC0gcmVmWzNdOworICAgIGNvbnN0IGludCBhMCA9IChkMCArIGQzKTsgICAgICAgICAvLyAxMGIgICAgICAgICAgICAgICAgICAgICAgWy01MTAsNTEwXQorICAgIGNvbnN0IGludCBhMSA9IChkMSArIGQyKTsKKyAgICBjb25zdCBpbnQgYTIgPSAoZDEgLSBkMik7CisgICAgY29uc3QgaW50IGEzID0gKGQwIC0gZDMpOworICAgIHRtcFswICsgaSAqIDRdID0gKGEwICsgYTEpICogODsgICAvLyAxNGIgICAgICAgICAgICAgICAgICAgICAgWy04MTYwLDgxNjBdCisgICAgdG1wWzEgKyBpICogNF0gPSAoYTIgKiAyMjE3ICsgYTMgKiA1MzUyICsgMTgxMikgPj4gOTsgICAgICAvLyBbLTc1MzYsNzU0Ml0KKyAgICB0bXBbMiArIGkgKiA0XSA9IChhMCAtIGExKSAqIDg7CisgICAgdG1wWzMgKyBpICogNF0gPSAoYTMgKiAyMjE3IC0gYTIgKiA1MzUyICsgIDkzNykgPj4gOTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGEwID0gKHRtcFswICsgaV0gKyB0bXBbMTIgKyBpXSk7ICAvLyAxNWIKKyAgICBjb25zdCBpbnQgYTEgPSAodG1wWzQgKyBpXSArIHRtcFsgOCArIGldKTsKKyAgICBjb25zdCBpbnQgYTIgPSAodG1wWzQgKyBpXSAtIHRtcFsgOCArIGldKTsKKyAgICBjb25zdCBpbnQgYTMgPSAodG1wWzAgKyBpXSAtIHRtcFsxMiArIGldKTsKKyAgICBvdXRbMCArIGldID0gKGEwICsgYTEgKyA3KSA+PiA0OyAgICAgICAgICAgIC8vIDEyYgorICAgIG91dFs0ICsgaV0gPSAoKGEyICogMjIxNyArIGEzICogNTM1MiArIDEyMDAwKSA+PiAxNikgKyAoYTMgIT0gMCk7CisgICAgb3V0WzggKyBpXSA9IChhMCAtIGExICsgNykgPj4gNDsKKyAgICBvdXRbMTIrIGldID0gKChhMyAqIDIyMTcgLSBhMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0yKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpIHsKKyAgVlA4RlRyYW5zZm9ybShzcmMsIHJlZiwgb3V0KTsKKyAgVlA4RlRyYW5zZm9ybShzcmMgKyA0LCByZWYgKyA0LCBvdXQgKyAxNik7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICAvLyBpbnB1dCBpcyAxMmIgc2lnbmVkCisgIGludDMyX3QgdG1wWzE2XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IDY0KSB7CisgICAgY29uc3QgaW50IGEwID0gKGluWzAgKiAxNl0gKyBpblsyICogMTZdKTsgIC8vIDEzYgorICAgIGNvbnN0IGludCBhMSA9IChpblsxICogMTZdICsgaW5bMyAqIDE2XSk7CisgICAgY29uc3QgaW50IGEyID0gKGluWzEgKiAxNl0gLSBpblszICogMTZdKTsKKyAgICBjb25zdCBpbnQgYTMgPSAoaW5bMCAqIDE2XSAtIGluWzIgKiAxNl0pOworICAgIHRtcFswICsgaSAqIDRdID0gYTAgKyBhMTsgICAvLyAxNGIKKyAgICB0bXBbMSArIGkgKiA0XSA9IGEzICsgYTI7CisgICAgdG1wWzIgKyBpICogNF0gPSBhMyAtIGEyOworICAgIHRtcFszICsgaSAqIDRdID0gYTAgLSBhMTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGEwID0gKHRtcFswICsgaV0gKyB0bXBbOCArIGldKTsgIC8vIDE1YgorICAgIGNvbnN0IGludCBhMSA9ICh0bXBbNCArIGldICsgdG1wWzEyKyBpXSk7CisgICAgY29uc3QgaW50IGEyID0gKHRtcFs0ICsgaV0gLSB0bXBbMTIrIGldKTsKKyAgICBjb25zdCBpbnQgYTMgPSAodG1wWzAgKyBpXSAtIHRtcFs4ICsgaV0pOworICAgIGNvbnN0IGludCBiMCA9IGEwICsgYTE7ICAgIC8vIDE2YgorICAgIGNvbnN0IGludCBiMSA9IGEzICsgYTI7CisgICAgY29uc3QgaW50IGIyID0gYTMgLSBhMjsKKyAgICBjb25zdCBpbnQgYjMgPSBhMCAtIGExOworICAgIG91dFsgMCArIGldID0gYjAgPj4gMTsgICAgIC8vIDE1YgorICAgIG91dFsgNCArIGldID0gYjEgPj4gMTsKKyAgICBvdXRbIDggKyBpXSA9IGIyID4+IDE7CisgICAgb3V0WzEyICsgaV0gPSBiMyA+PiAxOworICB9Cit9CisKKyN1bmRlZiBNVUwKKyN1bmRlZiBTVE9SRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsbCh1aW50OF90KiBkc3QsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIHsKKyAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZCh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBpbnQgajsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgbWVtY3B5KGRzdCArIGogKiBCUFMsIHRvcCwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgRmlsbChkc3QsIDEyNywgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSG9yaXpvbnRhbFByZWQodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgaW50IHNpemUpIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIHsKKyAgICAgIG1lbXNldChkc3QgKyBqICogQlBTLCBsZWZ0W2pdLCBzaXplKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRmlsbChkc3QsIDEyOSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwgaW50IHNpemUpIHsKKyAgaW50IHk7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAgPSBjbGlwMSArIDI1NSAtIGxlZnRbLTFdOworICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBjbGlwX3RhYmxlID0gY2xpcCArIGxlZnRbeV07CisgICAgICAgIGludCB4OworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7CisgICAgICAgICAgZHN0W3hdID0gY2xpcF90YWJsZVt0b3BbeF1dOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBCUFM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEhvcml6b250YWxQcmVkKGRzdCwgbGVmdCwgc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkKKyAgICAvLyBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuCisgICAgLy8gTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcworICAgIC8vIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuCisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBWZXJ0aWNhbFByZWQoZHN0LCB0b3AsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBGaWxsKGRzdCwgMTI5LCBzaXplKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCByb3VuZCwgaW50IHNoaWZ0KSB7CisgIGludCBEQyA9IDA7CisgIGludCBqOworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSB0b3Bbal07CisgICAgaWYgKGxlZnQgIT0gTlVMTCkgeyAgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CisgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSBsZWZ0W2pdOworICAgIH0gZWxzZSB7ICAgICAgLy8gdG9wLCBidXQgbm8gbGVmdAorICAgICAgREMgKz0gREM7CisgICAgfQorICAgIERDID0gKERDICsgcm91bmQpID4+IHNoaWZ0OworICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgIC8vIGxlZnQgYnV0IG5vIHRvcAorICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIERDICs9IGxlZnRbal07CisgICAgREMgKz0gREM7CisgICAgREMgPSAoREMgKyByb3VuZCkgPj4gc2hpZnQ7CisgIH0gZWxzZSB7ICAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIERDID0gMHg4MDsKKyAgfQorICBGaWxsKGRzdCwgREMsIHNpemUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hIDh4OCBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMikKKworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkcyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICAvLyBVIGJsb2NrCisgIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKKyAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb24oQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3AgIT0gTlVMTCkgdG9wICs9IDg7CisgIGlmIChsZWZ0ICE9IE5VTEwpIGxlZnQgKz0gMTY7CisgIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKKyAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7CisgIFRydWVNb3Rpb24oQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHModWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQ01vZGUoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wLCAxNiwgMTYsIDUpOworICBWZXJ0aWNhbFByZWQoSTE2VkUxNiArIGRzdCwgdG9wLCAxNik7CisgIEhvcml6b250YWxQcmVkKEkxNkhFMTYgKyBkc3QsIGxlZnQsIDE2KTsKKyAgVHJ1ZU1vdGlvbihJMTZUTTE2ICsgZHN0LCBsZWZ0LCB0b3AsIDE2KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGx1bWEgNHg0IHByZWRpY3Rpb24KKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QgdmFsc1s0XSA9IHsKKyAgICBBVkczKHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKSwKKyAgICBBVkczKHRvcFsgMF0sIHRvcFsxXSwgdG9wWzJdKSwKKyAgICBBVkczKHRvcFsgMV0sIHRvcFsyXSwgdG9wWzNdKSwKKyAgICBBVkczKHRvcFsgMl0sIHRvcFszXSwgdG9wWzRdKQorICB9OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIG1lbWNweShkc3QgKyBpICogQlBTLCB2YWxzLCA0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgICAgLy8gaG9yaXpvbnRhbAorICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSSwgSiwgSykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKSk7Cit9CisKK3N0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSB0b3BbaV0gKyB0b3BbLTUgKyBpXTsKKyAgRmlsbChkc3QsIGRjID4+IDMsIDQpOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIGNvbnN0IGludCBBID0gdG9wWzBdOworICBjb25zdCBpbnQgQiA9IHRvcFsxXTsKKyAgY29uc3QgaW50IEMgPSB0b3BbMl07CisgIGNvbnN0IGludCBEID0gdG9wWzNdOworICBEU1QoMCwgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEosIEssIEwpOworICBEU1QoMCwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEksIEosIEspOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgPSBBVkczKFgsIEksIEopOworICBEU1QoMCwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMiwgMikgPSBEU1QoMywgMykgPSBBVkczKEEsIFgsIEkpOworICBEU1QoMSwgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMywgMikgICAgICAgICAgICAgPSBBVkczKEIsIEEsIFgpOworICBEU1QoMiwgMCkgPSBEU1QoMywgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEMsIEIsIEEpOworICBEU1QoMywgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEQsIEMsIEIpOworfQorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIGNvbnN0IGludCBFID0gdG9wWzRdOworICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKKyAgY29uc3QgaW50IEcgPSB0b3BbNl07CisgIGNvbnN0IGludCBIID0gdG9wWzddOworICBEU1QoMCwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEIsIEMsIEQpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMSkgPSBEU1QoMCwgMikgICAgICAgICAgICAgPSBBVkczKEMsIEQsIEUpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMSkgPSBEU1QoMSwgMikgPSBEU1QoMCwgMykgPSBBVkczKEQsIEUsIEYpOworICBEU1QoMywgMSkgPSBEU1QoMiwgMikgPSBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEUsIEYsIEcpOworICBEU1QoMywgMikgPSBEU1QoMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEYsIEcsIEgpOworICBEU1QoMywgMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBVkczKEcsIEgsIEgpOworfQorCitzdGF0aWMgdm9pZCBWUjQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworICBjb25zdCBpbnQgRCA9IHRvcFszXTsKKyAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKKyAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKKyAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKKworICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOworICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOworfQorCitzdGF0aWMgdm9pZCBWTDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIGNvbnN0IGludCBFID0gdG9wWzRdOworICBjb25zdCBpbnQgRiA9IHRvcFs1XTsKKyAgY29uc3QgaW50IEcgPSB0b3BbNl07CisgIGNvbnN0IGludCBIID0gdG9wWzddOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEEsIEIpOworICBEU1QoMSwgMCkgPSBEU1QoMCwgMikgPSBBVkcyKEIsIEMpOworICBEU1QoMiwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKEMsIEQpOworICBEU1QoMywgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEQsIEUpOworCisgIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgeCwgeTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAxICsgMjU1IC0gdG9wWy0xXTsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXBfdGFibGUgPSBjbGlwICsgdG9wWy0yIC0geV07CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgZHN0W3hdID0gY2xpcF90YWJsZVt0b3BbeF1dOworICAgIH0KKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCisvLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKKy8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQorc3RhdGljIHZvaWQgSW50cmE0UHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREM0KEk0REM0ICsgZHN0LCB0b3ApOworICBUTTQoSTRUTTQgKyBkc3QsIHRvcCk7CisgIFZFNChJNFZFNCArIGRzdCwgdG9wKTsKKyAgSEU0KEk0SEU0ICsgZHN0LCB0b3ApOworICBSRDQoSTRSRDQgKyBkc3QsIHRvcCk7CisgIFZSNChJNFZSNCArIGRzdCwgdG9wKTsKKyAgTEQ0KEk0TEQ0ICsgZHN0LCB0b3ApOworICBWTDQoSTRWTDQgKyBkc3QsIHRvcCk7CisgIEhENChJNEhENCArIGRzdCwgdG9wKTsKKyAgSFU0KEk0SFU0ICsgZHN0LCB0b3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0cmljCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0U1NFKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHksIHg7CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgZGlmZiA9IChpbnQpYVt4XSAtIGJbeF07CisgICAgICBjb3VudCArPSBkaWZmICogZGlmZjsKKyAgICB9CisgICAgYSArPSBCUFM7CisgICAgYiArPSBCUFM7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTE2eDE2KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgMTYpOworfQorc3RhdGljIGludCBTU0UxNng4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgOCk7Cit9CitzdGF0aWMgaW50IFNTRTh4OChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBHZXRTU0UoYSwgYiwgOCwgOCk7Cit9CitzdGF0aWMgaW50IFNTRTR4NChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBHZXRTU0UoYSwgYiwgNCwgNCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXh0dXJlIGRpc3RvcnRpb24KKy8vCisvLyBXZSB0cnkgdG8gbWF0Y2ggdGhlIHNwZWN0cmFsIGNvbnRlbnQgKHdlaWdodGVkKSBiZXR3ZWVuIHNvdXJjZSBhbmQKKy8vIHJlY29uc3RydWN0ZWQgc2FtcGxlcy4KKworLy8gSGFkYW1hcmQgdHJhbnNmb3JtCisvLyBSZXR1cm5zIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRyYW5zZm9ybWVkIGNvZWZmaWNpZW50cy4KKy8vIHdbXSBjb250YWlucyBhIHJvdy1tYWpvciA0IGJ5IDQgc3ltbWV0cmljIG1hdHJpeC4KK3N0YXRpYyBpbnQgVFRyYW5zZm9ybShjb25zdCB1aW50OF90KiBpbiwgY29uc3QgdWludDE2X3QqIHcpIHsKKyAgaW50IHN1bSA9IDA7CisgIGludCB0bXBbMTZdOworICBpbnQgaTsKKyAgLy8gaG9yaXpvbnRhbCBwYXNzCisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGluICs9IEJQUykgeworICAgIGNvbnN0IGludCBhMCA9IGluWzBdICsgaW5bMl07CisgICAgY29uc3QgaW50IGExID0gaW5bMV0gKyBpblszXTsKKyAgICBjb25zdCBpbnQgYTIgPSBpblsxXSAtIGluWzNdOworICAgIGNvbnN0IGludCBhMyA9IGluWzBdIC0gaW5bMl07CisgICAgdG1wWzAgKyBpICogNF0gPSBhMCArIGExOworICAgIHRtcFsxICsgaSAqIDRdID0gYTMgKyBhMjsKKyAgICB0bXBbMiArIGkgKiA0XSA9IGEzIC0gYTI7CisgICAgdG1wWzMgKyBpICogNF0gPSBhMCAtIGExOworICB9CisgIC8vIHZlcnRpY2FsIHBhc3MKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgKyt3KSB7CisgICAgY29uc3QgaW50IGEwID0gdG1wWzAgKyBpXSArIHRtcFs4ICsgaV07CisgICAgY29uc3QgaW50IGExID0gdG1wWzQgKyBpXSArIHRtcFsxMisgaV07CisgICAgY29uc3QgaW50IGEyID0gdG1wWzQgKyBpXSAtIHRtcFsxMisgaV07CisgICAgY29uc3QgaW50IGEzID0gdG1wWzAgKyBpXSAtIHRtcFs4ICsgaV07CisgICAgY29uc3QgaW50IGIwID0gYTAgKyBhMTsKKyAgICBjb25zdCBpbnQgYjEgPSBhMyArIGEyOworICAgIGNvbnN0IGludCBiMiA9IGEzIC0gYTI7CisgICAgY29uc3QgaW50IGIzID0gYTAgLSBhMTsKKworICAgIHN1bSArPSB3WyAwXSAqIGFicyhiMCk7CisgICAgc3VtICs9IHdbIDRdICogYWJzKGIxKTsKKyAgICBzdW0gKz0gd1sgOF0gKiBhYnMoYjIpOworICAgIHN1bSArPSB3WzEyXSAqIGFicyhiMyk7CisgIH0KKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBEaXN0bzR4NChjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBjb25zdCBpbnQgc3VtMSA9IFRUcmFuc2Zvcm0oYSwgdyk7CisgIGNvbnN0IGludCBzdW0yID0gVFRyYW5zZm9ybShiLCB3KTsKKyAgcmV0dXJuIGFicyhzdW0yIC0gc3VtMSkgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NChhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisvLworCitzdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKKyAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworLy8gU2ltcGxlIHF1YW50aXphdGlvbgorc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IGxhc3QgPSAtMTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7CisgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7CisgICAgY29uc3QgdWludDMyX3QgY29lZmYgPSAoc2lnbiA/IC1pbltqXSA6IGluW2pdKSArIG10eC0+c2hhcnBlbl9bal07CisgICAgaWYgKGNvZWZmID4gbXR4LT56dGhyZXNoX1tqXSkgeworICAgICAgY29uc3QgdWludDMyX3QgUSA9IG10eC0+cV9bal07CisgICAgICBjb25zdCB1aW50MzJfdCBpUSA9IG10eC0+aXFfW2pdOworICAgICAgY29uc3QgdWludDMyX3QgQiA9IG10eC0+Ymlhc19bal07CisgICAgICBpbnQgbGV2ZWwgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIpOworICAgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKSBsZXZlbCA9IE1BWF9MRVZFTDsKKyAgICAgIGlmIChzaWduKSBsZXZlbCA9IC1sZXZlbDsKKyAgICAgIGluW2pdID0gbGV2ZWwgKiAoaW50KVE7CisgICAgICBvdXRbbl0gPSBsZXZlbDsKKyAgICAgIGlmIChsZXZlbCkgbGFzdCA9IG47CisgICAgfSBlbHNlIHsKKyAgICAgIG91dFtuXSA9IDA7CisgICAgICBpbltqXSA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAobGFzdCA+PSAwKTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3MoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuejsKKyAgbnogID0gVlA4RW5jUXVhbnRpemVCbG9jayhpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2soaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja1dIVChpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBuLCBsYXN0ID0gLTE7CisgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7CisgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7CisgICAgY29uc3QgdWludDMyX3QgY29lZmYgPSBzaWduID8gLWluW2pdIDogaW5bal07CisgICAgYXNzZXJ0KG10eC0+c2hhcnBlbl9bal0gPT0gMCk7CisgICAgaWYgKGNvZWZmID4gbXR4LT56dGhyZXNoX1tqXSkgeworICAgICAgY29uc3QgdWludDMyX3QgUSA9IG10eC0+cV9bal07CisgICAgICBjb25zdCB1aW50MzJfdCBpUSA9IG10eC0+aXFfW2pdOworICAgICAgY29uc3QgdWludDMyX3QgQiA9IG10eC0+Ymlhc19bal07CisgICAgICBpbnQgbGV2ZWwgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIpOworICAgICAgaWYgKGxldmVsID4gTUFYX0xFVkVMKSBsZXZlbCA9IE1BWF9MRVZFTDsKKyAgICAgIGlmIChzaWduKSBsZXZlbCA9IC1sZXZlbDsKKyAgICAgIGluW2pdID0gbGV2ZWwgKiAoaW50KVE7CisgICAgICBvdXRbbl0gPSBsZXZlbDsKKyAgICAgIGlmIChsZXZlbCkgbGFzdCA9IG47CisgICAgfSBlbHNlIHsKKyAgICAgIG91dFtuXSA9IDA7CisgICAgICBpbltqXSA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAobGFzdCA+PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJsb2NrIGNvcHkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHcsIGludCBoKSB7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsKKyAgICBzcmMgKz0gQlBTOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29weTR4NChjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCkgeworICBDb3B5KHNyYywgZHN0LCA0LCA0KTsKK30KKworc3RhdGljIHZvaWQgQ29weTE2eDgoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgQ29weShzcmMsIGRzdCwgMTYsIDgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBTU0lNQWNjdW11bGF0ZUNsaXBwZWQoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sIGludCBXLCBpbnQgSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICBjb25zdCBpbnQgeW1pbiA9ICh5byAtIFZQOF9TU0lNX0tFUk5FTCA8IDApID8gMCA6IHlvIC0gVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeW1heCA9ICh5byArIFZQOF9TU0lNX0tFUk5FTCA+IEggLSAxKSA/IEggLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeW8gKyBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWluID0gKHhvIC0gVlA4X1NTSU1fS0VSTkVMIDwgMCkgPyAwIDogeG8gLSBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWF4ID0gKHhvICsgVlA4X1NTSU1fS0VSTkVMID4gVyAtIDEpID8gVyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB4byArIFZQOF9TU0lNX0tFUk5FTDsKKyAgaW50IHgsIHk7CisgIHNyYzEgKz0geW1pbiAqIHN0cmlkZTE7CisgIHNyYzIgKz0geW1pbiAqIHN0cmlkZTI7CisgIGZvciAoeSA9IHltaW47IHkgPD0geW1heDsgKyt5LCBzcmMxICs9IHN0cmlkZTEsIHNyYzIgKz0gc3RyaWRlMikgeworICAgIGZvciAoeCA9IHhtaW47IHggPD0geG1heDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgczEgPSBzcmMxW3hdOworICAgICAgY29uc3QgaW50IHMyID0gc3JjMlt4XTsKKyAgICAgIHN0YXRzLT53ICAgKz0gMTsKKyAgICAgIHN0YXRzLT54bSAgKz0gczE7CisgICAgICBzdGF0cy0+eW0gICs9IHMyOworICAgICAgc3RhdHMtPnh4bSArPSBzMSAqIHMxOworICAgICAgc3RhdHMtPnh5bSArPSBzMSAqIHMyOworICAgICAgc3RhdHMtPnl5bSArPSBzMiAqIHMyOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTU0lNQWNjdW11bGF0ZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPD0gMiAqIFZQOF9TU0lNX0tFUk5FTDsgKyt5LCBzcmMxICs9IHN0cmlkZTEsIHNyYzIgKz0gc3RyaWRlMikgeworICAgIGZvciAoeCA9IDA7IHggPD0gMiAqIFZQOF9TU0lNX0tFUk5FTDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgczEgPSBzcmMxW3hdOworICAgICAgY29uc3QgaW50IHMyID0gc3JjMlt4XTsKKyAgICAgIHN0YXRzLT53ICAgKz0gMTsKKyAgICAgIHN0YXRzLT54bSAgKz0gczE7CisgICAgICBzdGF0cy0+eW0gICs9IHMyOworICAgICAgc3RhdHMtPnh4bSArPSBzMSAqIHMxOworICAgICAgc3RhdHMtPnh5bSArPSBzMSAqIHMyOworICAgICAgc3RhdHMtPnl5bSArPSBzMiAqIHMyOworICAgIH0KKyAgfQorfQorCitWUDhTU0lNQWNjdW11bGF0ZUZ1bmMgVlA4U1NJTUFjY3VtdWxhdGU7CitWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWRGdW5jIFZQOFNTSU1BY2N1bXVsYXRlQ2xpcHBlZDsKKworc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gc3NpbV9sYXN0X2NwdWluZm9fdXNlZCA9CisgICAgKFZQOENQVUluZm8pJnNzaW1fbGFzdF9jcHVpbmZvX3VzZWQ7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhTU0lNRHNwSW5pdCh2b2lkKSB7CisgIGlmIChzc2ltX2xhc3RfY3B1aW5mb191c2VkID09IFZQOEdldENQVUluZm8pIHJldHVybjsKKworICBWUDhTU0lNQWNjdW11bGF0ZSA9IFNTSU1BY2N1bXVsYXRlOworICBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQgPSBTU0lNQWNjdW11bGF0ZUNsaXBwZWQ7CisKKyAgc3NpbV9sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXphdGlvbgorCisvLyBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycy4gV2UgaGF2ZSB0byBpbml0aWFsaXplIHRoZW0gdG8gdGhlIGRlZmF1bHQKKy8vIGltcGxlbWVudGF0aW9ucyB3aXRoaW4gVlA4RW5jRHNwSW5pdCgpLgorVlA4Q0hpc3RvIFZQOENvbGxlY3RIaXN0b2dyYW07CitWUDhJZGN0IFZQOElUcmFuc2Zvcm07CitWUDhGZGN0IFZQOEZUcmFuc2Zvcm07CitWUDhGZGN0IFZQOEZUcmFuc2Zvcm0yOworVlA4V0hUIFZQOEZUcmFuc2Zvcm1XSFQ7CitWUDhJbnRyYTRQcmVkcyBWUDhFbmNQcmVkTHVtYTQ7CitWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRMdW1hMTY7CitWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRDaHJvbWE4OworVlA4TWV0cmljIFZQOFNTRTE2eDE2OworVlA4TWV0cmljIFZQOFNTRTh4ODsKK1ZQOE1ldHJpYyBWUDhTU0UxNng4OworVlA4TWV0cmljIFZQOFNTRTR4NDsKK1ZQOFdNZXRyaWMgVlA4VERpc3RvNHg0OworVlA4V01ldHJpYyBWUDhURGlzdG8xNngxNjsKK1ZQOFF1YW50aXplQmxvY2sgVlA4RW5jUXVhbnRpemVCbG9jazsKK1ZQOFF1YW50aXplMkJsb2NrcyBWUDhFbmNRdWFudGl6ZTJCbG9ja3M7CitWUDhRdWFudGl6ZUJsb2NrV0hUIFZQOEVuY1F1YW50aXplQmxvY2tXSFQ7CitWUDhCbG9ja0NvcHkgVlA4Q29weTR4NDsKK1ZQOEJsb2NrQ29weSBWUDhDb3B5MTZ4ODsKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0QVZYMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGVuY19sYXN0X2NwdWluZm9fdXNlZCA9CisgICAgKFZQOENQVUluZm8pJmVuY19sYXN0X2NwdWluZm9fdXNlZDsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXQodm9pZCkgeworICBpZiAoZW5jX2xhc3RfY3B1aW5mb191c2VkID09IFZQOEdldENQVUluZm8pIHJldHVybjsKKworICBWUDhEc3BJbml0KCk7ICAvLyBjb21tb24gaW52ZXJzZSB0cmFuc2Zvcm1zCisgIEluaXRUYWJsZXMoKTsKKworICAvLyBkZWZhdWx0IEMgaW1wbGVtZW50YXRpb25zCisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtOworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybTsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm07CisgIFZQOEZUcmFuc2Zvcm0yID0gRlRyYW5zZm9ybTI7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUOworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkczsKKyAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkczsKKyAgVlA4RW5jUHJlZENocm9tYTggPSBJbnRyYUNocm9tYVByZWRzOworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2OworICBWUDhTU0U4eDggPSBTU0U4eDg7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4OworICBWUDhTU0U0eDQgPSBTU0U0eDQ7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0OworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTY7CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3M7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrV0hUOworICBWUDhDb3B5NHg0ID0gQ29weTR4NDsKKyAgVlA4Q29weTE2eDggPSBDb3B5MTZ4ODsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RW5jRHNwSW5pdFNTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgVlA4RW5jRHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0FWWDIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa0FWWDIpKSB7CisgICAgICBWUDhFbmNEc3BJbml0QVZYMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTkVPTikpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRORU9OKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFMzMikpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhFbmNEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZW5jX2xhc3RfY3B1aW5mb191c2VkID0gVlA4R2V0Q1BVSW5mbzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfYXZ4Mi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19hdngyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiOWQxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfYXZ4Mi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBVlgyIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX0FWWDIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfQVZYMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRBVlgyKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19taXBzMzIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkODlhYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfbWlwczMyLmMKQEAgLTAsMCArMSw2NzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIFNsb2JvZGFuIFByaWppYyAgKHNsb2JvZGFuLnByaWppY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2luY2x1ZGUgIi4vbWlwc19tYWNyby5oIgorI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAiLi4vZW5jL2Nvc3QuaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBJVHJhbnNmb3JtT25lCisvLyBNVUwgbWFjcm8gaW5saW5lZAorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBpbiBidWZmZXIKKy8vIFRFTVAwLi5URU1QMyAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKy8vIFRFTVA0Li5URU1QNSAtIHRlbXBvcmFyeSByZWdpc3RlcnMKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBURU1QNCwgVEVNUDAsIFRFTVAxLCBURU1QMiwgVEVNUDMpICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE2XSwgICAgICAiICNBICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGggICAgICAlW3RlbXAxOF0sICAgICAgIiAjQiAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxoICAgICAgJVt0ZW1wMTddLCAgICAgICIgI0MgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE5XSwgICAgICAiICNEICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMThdICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDE3XSwgICAgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlW3RlbXAxOF0sICAgICAgJVt0ZW1wMTldLCAgICAgICVba0MxXSAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE3XSwgICAgICAlW2tDMV0gICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbdGVtcDE5XSwgICAgICAlW3RlbXAxOV0sICAgICAgJVtrQzJdICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAxNiAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInNyYSAgICAgJVt0ZW1wMThdLCAgICAgICVbdGVtcDE4XSwgICAgICAxNiAgICAgICAgICAgICAgICBcblxuIiAgICAgICAgICBcCisgICJzcmEgICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxN10sICAgICAgMTYgICAgICAgICAgICAgICAgXG5cbiIgICAgICAgICAgXAorICAic3JhICAgICAlW3RlbXAxOV0sICAgICAgJVt0ZW1wMTldLCAgICAgIDE2ICAgICAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QMiAiXSwgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMThdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDMgIl0sICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxOV0gICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVAzICJdIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMSAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDIgIl0gICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDIgIl0sICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAyICJdICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAzICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVAzICJdIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIElUcmFuc2Zvcm1PbmUKKy8vIE1VTCBhbmQgU1RPUkUgbWFjcm9zIGlubGluZWQKKy8vIGEgPSBjbGlwXzhiKGEpIGlzIHJlcGxhY2VkIHdpdGg6IGEgPSBtYXgoYSwgMCk7IGEgPSBtaW4oYSwgMjU1KQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIHJlZiBhbmQgc3RvcmUgdG8gZHN0IGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVA0LCBURU1QOCBhbmQgVEVNUDEyIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1MoQSwgVEVNUDAsIFRFTVA0LCBURU1QOCwgVEVNUDEyKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICA0ICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVAxMiAiXSwgICAlW2tDMV0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAlW2tDMV0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAlW2tDMl0gICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVA4ICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAxNiAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QNCAiXSwgICAgJVsiICNURU1QMTIgIl0gICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibHcgICAgICAlW3RlbXAyMF0sICAgICAgMCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVA0ICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVA4ICJdLCAgICAlWyIgI1RFTVA4ICJdLCAgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JhICAgICAlWyIgI1RFTVAxMiAiXSwgICAlWyIgI1RFTVAxMiAiXSwgICAzICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxNl0sICAgICAgMCsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxN10sICAgICAgMSsiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxOF0sICAgICAgMisiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxOV0sICAgICAgMysiIFhTVFIoQlBTKSAiKiIgI0EgIiglW3RlbXAyMF0pICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0gICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSwgICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0sICAgJHplcm8gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVAwICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMTZdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVA0ICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMTddICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVA4ICJdLCAgICAkemVybywgICAgICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92biAgICAlWyIgI1RFTVAxMiAiXSwgICAkemVybywgICAgICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkaXUgICAlW3RlbXAyMF0sICAgICAgJHplcm8sICAgICAgICAgIDI1NSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxN10sICAgICAgJVsiICNURU1QNCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOF0sICAgICAgJVsiICNURU1QOCAiXSwgICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2x0ICAgICAlW3RlbXAxOV0sICAgICAgJVsiICNURU1QMTIgIl0sICAgJVt0ZW1wMjBdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTZdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTddICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibHcgICAgICAlW3RlbXAxNl0sICAgICAgOCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMThdICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibW92eiAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAyMF0sICAgICAgJVt0ZW1wMTldICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVAwICJdLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVA0ICJdLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVA4ICJdLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAlWyIgI1RFTVAxMiAiXSwgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDE2XSkgXG5cdCIKKworLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmUoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgaW50IHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMzsKKyAgaW50IHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTksIHRlbXAyMDsKKyAgY29uc3QgaW50KiBhcmdzWzNdID0geyhjb25zdCBpbnQqKXJlZiwgKGNvbnN0IGludCopaW4sIChjb25zdCBpbnQqKWRzdH07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibHcgICAgICAlW3RlbXAyMF0sICAgICAgNCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoMCwgMTYsICA4LCAyNCwgdGVtcDQsICB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBWRVJUSUNBTF9QQVNTKDIsIDE4LCAxMCwgMjYsIHRlbXA4LCAgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgVkVSVElDQUxfUEFTUyg0LCAyMCwgMTIsIDI4LCB0ZW1wMTIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBWRVJUSUNBTF9QQVNTKDYsIDIyLCAxNCwgMzAsIHRlbXAyMCwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsIHRlbXAwLCB0ZW1wNCwgdGVtcDgsICB0ZW1wMTIpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsIHRlbXAxLCB0ZW1wNSwgdGVtcDksICB0ZW1wMTMpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXAyLCB0ZW1wNiwgdGVtcDEwLCB0ZW1wMTQpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsIHRlbXAzLCB0ZW1wNywgdGVtcDExLCB0ZW1wMTUpCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLAorICAgICAgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwKKyAgICAgIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCBbdGVtcDE3XSI9JnIiKHRlbXAxNyksCisgICAgICBbdGVtcDE4XSI9JnIiKHRlbXAxOCksIFt0ZW1wMTldIj0mciIodGVtcDE5KSwgW3RlbXAyMF0iPSZyIih0ZW1wMjApCisgICAgOiBbYXJnc10iciIoYXJncyksIFtrQzFdInIiKGtDMSksIFtrQzJdInIiKGtDMikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIElUcmFuc2Zvcm1PbmUocmVmLCBpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIElUcmFuc2Zvcm1PbmUocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1MKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1MKKworLy8gbWFjcm8gZm9yIG9uZSBwYXNzIHRocm91Z2ggZm9yIGxvb3AgaW4gUXVhbnRpemVCbG9jaworLy8gUVVBTlRESVYgbWFjcm8gaW5saW5lZAorLy8gSiAtIG9mZnNldCBpbiBieXRlcyAoa1ppZ3phZ1tuXSAqIDIpCisvLyBLIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogNCkKKy8vIE4gLSBvZmZzZXQgaW4gYnl0ZXMgKG4gKiAyKQorI2RlZmluZSBRVUFOVElaRV9PTkUoSiwgSywgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAlW3RlbXAwXSwgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsaHUgICAgICAgICAgJVt0ZW1wMV0sICAgICAgICIgI0ogIiglW3Bwc2hhcnBlbl0pICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibHcgICAgICAgICAgICVbdGVtcDJdLCAgICAgICAiICNLICIoJVtwcHp0aHJlc2hdKSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNyYSAgICAgICAgICAlW3NpZ25dLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAxNSAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJ4b3IgICAgICAgICAgJVtjb2VmZl0sICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAic3VidSAgICAgICAgICVbY29lZmZdLCAgICAgICAlW2NvZWZmXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgImFkZHUgICAgICAgICAlW2NvZWZmXSwgICAgICAgJVtjb2VmZl0sICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgXG5cdCIgICBcCisgICJzbHQgICAgICAgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgJVtjb2VmZl0gICAgICAgIFxuXHQiICAgXAorICAiYWRkaXUgICAgICAgICVbdGVtcDVdLCAgICAgICAkemVybywgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImFkZGl1ICAgICAgICAlW2xldmVsXSwgICAgICAgJHplcm8sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJiZXF6ICAgICAgICAgJVt0ZW1wNF0sICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibGh1ICAgICAgICAgICVbdGVtcDFdLCAgICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImx3ICAgICAgICAgICAlW3RlbXAyXSwgICAgICAgIiAjSyAiKCVbcHBiaWFzXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsaHUgICAgICAgICAgJVt0ZW1wM10sICAgICAgICIgI0ogIiglW3BwcV0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibXVsICAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2NvZWZmXSwgICAgICAgICAgICVbdGVtcDFdICAgICAgICBcblx0IiAgIFwKKyAgImFkZHUgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIgICBcCisgICJzcmEgICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic2x0ICAgICAgICAgICVbdGVtcDRdLCAgICAgICAlW21heF9sZXZlbF0sICAgICAgICVbbGV2ZWxdICAgICAgICBcblx0IiAgIFwKKyAgIm1vdm4gICAgICAgICAlW2xldmVsXSwgICAgICAgJVttYXhfbGV2ZWxdLCAgICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICBcCisgICJ4b3IgICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAic3VidSAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgIm11bCAgICAgICAgICAlW3RlbXA1XSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICBcCisiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic2ggICAgICAgICAgICVbdGVtcDVdLCAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNoICAgICAgICAgICAlW2xldmVsXSwgICAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGludCBzaWduLCBjb2VmZiwgbGV2ZWwsIGk7CisgIGludCBtYXhfbGV2ZWwgPSBNQVhfTEVWRUw7CisKKyAgaW50MTZfdCogcHBpbiAgICAgICAgICAgICA9ICZpblswXTsKKyAgaW50MTZfdCogcG91dCAgICAgICAgICAgICA9ICZvdXRbMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHNoYXJwZW4gPSAmbXR4LT5zaGFycGVuX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwenRocmVzaCA9ICZtdHgtPnp0aHJlc2hfWzBdOworICBjb25zdCB1aW50MTZfdCogcHBxICAgICAgID0gJm10eC0+cV9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcGlxICAgICAgPSAmbXR4LT5pcV9bMF07CisgIGNvbnN0IHVpbnQzMl90KiBwcGJpYXMgICAgPSAmbXR4LT5iaWFzX1swXTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgIFFVQU5USVpFX09ORSggMCwgIDAsICAwKQorICAgIFFVQU5USVpFX09ORSggMiwgIDQsICAyKQorICAgIFFVQU5USVpFX09ORSggOCwgMTYsICA0KQorICAgIFFVQU5USVpFX09ORSgxNiwgMzIsICA2KQorICAgIFFVQU5USVpFX09ORSgxMCwgMjAsICA4KQorICAgIFFVQU5USVpFX09ORSggNCwgIDgsIDEwKQorICAgIFFVQU5USVpFX09ORSggNiwgMTIsIDEyKQorICAgIFFVQU5USVpFX09ORSgxMiwgMjQsIDE0KQorICAgIFFVQU5USVpFX09ORSgxOCwgMzYsIDE2KQorICAgIFFVQU5USVpFX09ORSgyNCwgNDgsIDE4KQorICAgIFFVQU5USVpFX09ORSgyNiwgNTIsIDIwKQorICAgIFFVQU5USVpFX09ORSgyMCwgNDAsIDIyKQorICAgIFFVQU5USVpFX09ORSgxNCwgMjgsIDI0KQorICAgIFFVQU5USVpFX09ORSgyMiwgNDQsIDI2KQorICAgIFFVQU5USVpFX09ORSgyOCwgNTYsIDI4KQorICAgIFFVQU5USVpFX09ORSgzMCwgNjAsIDMwKQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbc2lnbl0iPSZyIihzaWduKSwgW2NvZWZmXSI9JnIiKGNvZWZmKSwKKyAgICAgIFtsZXZlbF0iPSZyIihsZXZlbCkKKyAgICA6IFtwb3V0XSJyIihwb3V0KSwgW3BwaW5dInIiKHBwaW4pLAorICAgICAgW3BwaXFdInIiKHBwaXEpLCBbbWF4X2xldmVsXSJyIihtYXhfbGV2ZWwpLAorICAgICAgW3BwYmlhc10iciIocHBiaWFzKSwgW3BwenRocmVzaF0iciIocHB6dGhyZXNoKSwKKyAgICAgIFtwcHNoYXJwZW5dInIiKHBwc2hhcnBlbiksIFtwcHFdInIiKHBwcSkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgLy8gbW92ZWQgb3V0IGZyb20gbWFjcm8gdG8gaW5jcmVhc2UgcG9zc2liaWxpdHkgZm9yIGVhcmxpZXIgYnJlYWtpbmcKKyAgZm9yIChpID0gMTU7IGkgPj0gMDsgaS0tKSB7CisgICAgaWYgKG91dFtpXSkgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFF1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBRdWFudGl6ZUJsb2NrKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisjdW5kZWYgUVVBTlRJWkVfT05FCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIERpc3RvNHg0IChUVHJhbnNmb3JtKQorLy8gdHdvIGNhbGxzIG9mIGZ1bmN0aW9uIFRUcmFuc2Zvcm0gYXJlIG1lcmdlZCBpbnRvIHNpbmdsZSBvbmUKKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIGEgYW5kIGIgYnVmZmVycworLy8gRS4uSCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgZmlyc3QgcmVzdWx0cyB0byB0bXAgYnVmZmVyCisvLyBFMS4uSDEgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHNlY29uZCByZXN1bHRzIHRvIHRtcCBidWZmZXIKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTKEEsIEUsIEYsIEcsIEgsIEUxLCBGMSwgRzEsIEgxKSAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAwXSwgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAxXSwgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAyXSwgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAzXSwgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA0XSwgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA1XSwgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA2XSwgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA3XSwgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAyXSwgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDRdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA2XSwgICVbdGVtcDVdLCAgICAlW3RlbXA3XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgICAlW3RlbXA3XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA3XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDNdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA2XSwgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA3XSwgICIgI0UgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAyXSwgICIgI0ggIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA4XSwgICIgI0YgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAwXSwgICIgI0cgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAxXSwgICIgI0UxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAzXSwgICIgI0gxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA2XSwgICIgI0YxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA0XSwgICIgI0cxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBEaXN0bzR4NCAoVFRyYW5zZm9ybSkKKy8vIHR3byBjYWxscyBvZiBmdW5jdGlvbiBUVHJhbnNmb3JtIGFyZSBtZXJnZWQgaW50byBzaW5nbGUgb25lCisvLyBzaW5jZSBvbmx5IG9uZSBhY2N1IGlzIGF2YWlsYWJsZSBpbiBtaXBzMzJyMSBpbnN0cnVjdGlvbiBzZXQKKy8vICAgZmlyc3QgaXMgZG9uZSBzZWNvbmQgY2FsbCBvZiBmdW5jdGlvbiBUVHJhbnNmb3JtIGFuZCBhZnRlcgorLy8gICB0aGF0IGZpcnN0IG9uZS4KKy8vICAgY29uc3QgaW50IHN1bTEgPSBUVHJhbnNmb3JtKGEsIHcpOworLy8gICBjb25zdCBpbnQgc3VtMiA9IFRUcmFuc2Zvcm0oYiwgdyk7CisvLyAgIHJldHVybiBhYnMoc3VtMiAtIHN1bTEpID4+IDU7CisvLyAgIChzdW0yIC0gc3VtMSkgaXMgY2FsY3VsYXRlZCB3aXRoIG1hZGRzIChzdWIyKSBhbmQgbXN1YnMgKHN1YjEpCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZpcnN0IHJlc3VsdHMgZnJvbSB0bXAgYnVmZmVyCisvLyBBMS4uRDEgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgc2Vjb25kIHJlc3VsdHMgZnJvbSB0bXAgYnVmZmVyCisvLyBFLi5IIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZyb20gdyBidWZmZXIKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBBMSwgQjEsIEMxLCBEMSwgRSwgRiwgRywgSCkgICAgIFwKKyAgImx3ICAgICAlW3RlbXAwXSwgICIgI0ExICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAxXSwgICIgI0MxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAyXSwgICIgI0IxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAzXSwgICIgI0QxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA0XSwgICVbdGVtcDNdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA1XSwgICVbdGVtcDFdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA2XSwgICVbdGVtcDBdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA3XSwgICVbdGVtcDhdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXA2XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXA2XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA0XSwgICIgI0UgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA1XSwgICIgI0YgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA2XSwgICIgI0cgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA3XSwgICIgI0ggIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA0XSwgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA1XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA2XSwgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA3XSwgICVbdGVtcDhdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAwXSwgICIgI0EgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAxXSwgICIgI0MgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAyXSwgICIgI0IgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAzXSwgICIgI0QgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAyXSwgICVbdGVtcDNdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA0XSwgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAyXSwgICVbdGVtcDhdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAzXSwgICVbdGVtcDBdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA0XSwgICVbdGVtcDFdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA1XSwgICVbdGVtcDhdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA2XSwgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA3XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyBpbnQgRGlzdG80eDQoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IHRtcFszMl07CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgSE9SSVpPTlRBTF9QQVNTKDAsICAgMCwgIDQsICA4LCAxMiwgICAgNjQsICA2OCwgIDcyLCAgNzYpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsICAxNiwgMjAsIDI0LCAyOCwgICAgODAsICA4NCwgIDg4LCAgOTIpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsICAzMiwgMzYsIDQwLCA0NCwgICAgOTYsIDEwMCwgMTA0LCAxMDgpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsICA0OCwgNTIsIDU2LCA2MCwgICAxMTIsIDExNiwgMTIwLCAxMjQpCisgICAgIm10aGkgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibXRsbyAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoIDAsIDE2LCAzMiwgNDgsICAgICA2NCwgODAsICA5NiwgMTEyLCAgIDAsICA4LCAxNiwgMjQpCisgICAgVkVSVElDQUxfUEFTUyggNCwgMjAsIDM2LCA1MiwgICAgIDY4LCA4NCwgMTAwLCAxMTYsICAgMiwgMTAsIDE4LCAyNikKKyAgICBWRVJUSUNBTF9QQVNTKCA4LCAyNCwgNDAsIDU2LCAgICAgNzIsIDg4LCAxMDQsIDEyMCwgICA0LCAxMiwgMjAsIDI4KQorICAgIFZFUlRJQ0FMX1BBU1MoMTIsIDI4LCA0NCwgNjAsICAgICA3NiwgOTIsIDEwOCwgMTI0LCAgIDYsIDE0LCAyMiwgMzApCisgICAgIm1mbG8gICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAzMSAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAic3JhICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICA1ICAgICAgICAgICBcblx0IgorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpLCBbd10iciIodyksIFt0bXBdInIiKHRtcCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIHRlbXAwOworfQorCisjdW5kZWYgVkVSVElDQUxfUEFTUworI3VuZGVmIEhPUklaT05UQUxfUEFTUworCitzdGF0aWMgaW50IERpc3RvMTZ4MTYoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0KGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBzcmMgYW5kIHJlZiBidWZmZXJzCisvLyBURU1QMC4uVEVNUDMgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMykgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgJVsiICNURU1QMSAiXSwgIDAoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsdyAgICAgJVsiICNURU1QMiAiXSwgIDQoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTZdLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTddLCAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMThdLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTldLCAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMjBdLCAgICAlW3RlbXAxNl0sICAgICVbdGVtcDE3XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTZdLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTddLCAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMCAiXSwgICVbdGVtcDE4XSwgICAgJVt0ZW1wMTldICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMThdLCAgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDEgIl0pICBcblx0IiAgICBcCisgICJsYnUgICAgJVt0ZW1wMTldLCAgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDIgIl0pICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTddICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDE4XSwgICAgJVt0ZW1wMTldICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMyAiXSwgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMiAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDIwXSwgICAgJVsiICNURU1QMiAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMSAiXSAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxICJdICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTZdLCAgICAlWyIgI1RFTVAyICJdLCAgJVtjNTM1Ml0gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTddLCAgICAlWyIgI1RFTVAyICJdLCAgJVtjMjIxN10gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMThdLCAgICAlWyIgI1RFTVAwICJdLCAgJVtjNTM1Ml0gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJtdWwgICAgJVt0ZW1wMTldLCAgICAlWyIgI1RFTVAwICJdLCAgJVtjMjIxN10gICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDMgIl0sICAlW3RlbXAyMF0gICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAzICJdLCAgJVt0ZW1wMjBdICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzbGwgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEgIl0sICAzICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzbGwgICAgJVsiICNURU1QMiAiXSwgICVbdGVtcDIwXSwgICAgMyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxNl0sICAgIDE4MTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGRpdSAgJVt0ZW1wMTddLCAgICAlW3RlbXAxN10sICAgIDkzNyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJhZGR1ICAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxNl0sICAgICVbdGVtcDE5XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzdWJ1ICAgJVt0ZW1wMTddLCAgICAlW3RlbXAxN10sICAgICVbdGVtcDE4XSAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDE2XSwgICAgOSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICBcCisgICJzcmEgICAgJVsiICNURU1QMyAiXSwgICVbdGVtcDE3XSwgICAgOSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gRlRyYW5zZm9ybQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHRvIG91dCBidWZmZXIKKy8vIFRFTVAwLCBURU1QNCwgVEVNUDggYW5kIFRFTVAxMiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBURU1QMCwgVEVNUDQsIFRFTVA4LCBURU1QMTIpICAgIFwKKyAgImFkZHUgICAlW3RlbXAxNl0sICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAxOV0sICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlW3RlbXAxN10sICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAxOF0sICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVA4ICJdLCAgJVt0ZW1wMTldLCAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVAxMiAiXSwgJVt0ZW1wMThdLCAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlWyIgI1RFTVA0ICJdLCAgJVt0ZW1wMTldLCAgICAlW2M1MzUyXSAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxOF0sICAgICVbdGVtcDE4XSwgICAgJVtjNTM1Ml0gICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxNl0sICAgICVbdGVtcDE2XSwgICAgNyAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMCAiXSwgIDQgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sICVbIiAjVEVNUDQgIl0gIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVA0ICJdLCAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QNCAiXSwgIDQgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDMwMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sIDEyMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDIxMDAwICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgICVbdGVtcDE4XSAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QMTIgIl0sIDE2ICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVA4ICJdLCAgJVsiICNURU1QOCAiXSwgIDE2ICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxNl0sICAgICVbIiAjVEVNUDEyICJdLCAxICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgIm1vdm4gICAlWyIgI1RFTVAxMiAiXSwgJVt0ZW1wMTZdLCAgICAlW3RlbXAxOV0gICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVA0ICJdLCAgIiAjQyAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVA4ICJdLCAgIiAjRCAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNoICAgICAlWyIgI1RFTVAxMiAiXSwgIiAjQiAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsIGludDE2X3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgaW50IHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTY7CisgIGludCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDE5LCB0ZW1wMjA7CisgIGNvbnN0IGludCBjMjIxNyA9IDIyMTc7CisgIGNvbnN0IGludCBjNTM1MiA9IDUzNTI7CisgIGNvbnN0IGludCogY29uc3QgYXJnc1szXSA9CisgICAgICB7IChjb25zdCBpbnQqKXNyYywgKGNvbnN0IGludCopcmVmLCAoY29uc3QgaW50KilvdXQgfTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgIEhPUklaT05UQUxfUEFTUygwLCB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorICAgICJsdyAgICVbdGVtcDIwXSwgICAgOCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgVkVSVElDQUxfUEFTUygwLCAgOCwgMTYsIDI0LCB0ZW1wMCwgdGVtcDQsIHRlbXA4LCAgdGVtcDEyKQorICAgIFZFUlRJQ0FMX1BBU1MoMiwgMTAsIDE4LCAyNiwgdGVtcDEsIHRlbXA1LCB0ZW1wOSwgIHRlbXAxMykKKyAgICBWRVJUSUNBTF9QQVNTKDQsIDEyLCAyMCwgMjgsIHRlbXAyLCB0ZW1wNiwgdGVtcDEwLCB0ZW1wMTQpCisgICAgVkVSVElDQUxfUEFTUyg2LCAxNCwgMjIsIDMwLCB0ZW1wMywgdGVtcDcsIHRlbXAxMSwgdGVtcDE1KQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKSwKKyAgICAgIFt0ZW1wMTJdIj0mciIodGVtcDEyKSwgW3RlbXAxM10iPSZyIih0ZW1wMTMpLCBbdGVtcDE0XSI9JnIiKHRlbXAxNCksCisgICAgICBbdGVtcDE1XSI9JnIiKHRlbXAxNSksIFt0ZW1wMTZdIj0mciIodGVtcDE2KSwgW3RlbXAxN10iPSZyIih0ZW1wMTcpLAorICAgICAgW3RlbXAxOF0iPSZyIih0ZW1wMTgpLCBbdGVtcDE5XSI9JnIiKHRlbXAxOSksIFt0ZW1wMjBdIj0mciIodGVtcDIwKQorICAgIDogW2FyZ3NdInIiKGFyZ3MpLCBbYzIyMTddInIiKGMyMjE3KSwgW2M1MzUyXSJyIihjNTM1MikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKyNkZWZpbmUgR0VUX1NTRV9JTk5FUihBLCBCLCBDLCBEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDBdLCAgICAiICNBICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAxXSwgICAgIiAjQSAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMl0sICAgICIgI0IgIiglW2FdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDNdLCAgICAiICNCICIoJVtiXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA0XSwgICAgIiAjQyAiKCVbYV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wNV0sICAgICIgI0MgIiglW2JdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDZdLCAgICAiICNEICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA3XSwgICAgIiAjRCAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICVbdGVtcDNdICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA1XSAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAgJVt0ZW1wN10gICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibWFkZCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIm1hZGQgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgR0VUX1NTRShBLCBCLCBDLCBEKSAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihBLCBBICsgMSwgQSArIDIsIEEgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihCLCBCICsgMSwgQiArIDIsIEIgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihDLCBDICsgMSwgQyArIDIsIEMgKyAzKSAgIFwKKyAgR0VUX1NTRV9JTk5FUihELCBEICsgMSwgRCArIDIsIEQgKyAzKQorCitzdGF0aWMgaW50IFNTRTE2eDE2KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorICAgICBHRVRfU1NFKCA4ICogQlBTLCA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUykKKyAgICAgR0VUX1NTRSggOSAqIEJQUywgNCArICA5ICogQlBTLCA4ICsgIDkgKiBCUFMsIDEyICsgIDkgKiBCUFMpCisgICAgIEdFVF9TU0UoMTAgKiBCUFMsIDQgKyAxMCAqIEJQUywgOCArIDEwICogQlBTLCAxMiArIDEwICogQlBTKQorICAgICBHRVRfU1NFKDExICogQlBTLCA0ICsgMTEgKiBCUFMsIDggKyAxMSAqIEJQUywgMTIgKyAxMSAqIEJQUykKKyAgICAgR0VUX1NTRSgxMiAqIEJQUywgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMpCisgICAgIEdFVF9TU0UoMTMgKiBCUFMsIDQgKyAxMyAqIEJQUywgOCArIDEzICogQlBTLCAxMiArIDEzICogQlBTKQorICAgICBHRVRfU1NFKDE0ICogQlBTLCA0ICsgMTQgKiBCUFMsIDggKyAxNCAqIEJQUywgMTIgKyAxNCAqIEJQUykKKyAgICAgR0VUX1NTRSgxNSAqIEJQUywgNCArIDE1ICogQlBTLCA4ICsgMTUgKiBCUFMsIDEyICsgMTUgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0UxNng4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorCisgICAgIm1mbG8gICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSgwICogQlBTLCA0ICsgMCAqIEJQUywgMSAqIEJQUywgNCArIDEgKiBCUFMpCisgICAgIEdFVF9TU0UoMiAqIEJQUywgNCArIDIgKiBCUFMsIDMgKiBCUFMsIDQgKyAzICogQlBTKQorICAgICBHRVRfU1NFKDQgKiBCUFMsIDQgKyA0ICogQlBTLCA1ICogQlBTLCA0ICsgNSAqIEJQUykKKyAgICAgR0VUX1NTRSg2ICogQlBTLCA0ICsgNiAqIEJQUywgNyAqIEJQUywgNCArIDcgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0U0eDQoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICBHRVRfU1NFKDAgKiBCUFMsIDEgKiBCUFMsIDIgKiBCUFMsIDMgKiBCUFMpCisKKyAgICAibWZsbyAgICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworI3VuZGVmIEdFVF9TU0UKKyN1bmRlZiBHRVRfU1NFX0lOTkVSCisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTMzIodm9pZCkgeworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybTsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm07CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3M7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0OworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTY7CisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2OworICBWUDhTU0U4eDggPSBTU0U4eDg7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4OworICBWUDhTU0U0eDQgPSBTU0U0eDQ7CisjZW5kaWYKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX21pcHNfZHNwX3IyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDE1MTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogRGFya28gTGF1cyAoZGFya28ubGF1c0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBNaXJrbyBSYXVzIChtaXJrby5yYXVzQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICIuL21pcHNfbWFjcm8uaCIKKyNpbmNsdWRlICIuLi9lbmMvY29zdC5oIgorI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBBRERfU1VCX0hBTFZFU19YNChPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNiwgTzcsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3KSAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgICVbIiAjSTEgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0sICAlWyIgI0kxICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI0kyICJdLCAgJVsiICNJMyAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNJMiAiXSwgICVbIiAjSTMgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjSTQgIl0sICAlWyIgI0k1ICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI0k0ICJdLCAgJVsiICNJNSAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNJNiAiXSwgICVbIiAjSTcgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjSTYgIl0sICAlWyIgI0k3ICJdICAgICBcblx0IgorCisvLyBJTyAtIGlucHV0L291dHB1dAorI2RlZmluZSBBQlNfWDgoSU8wLCBJTzEsIElPMiwgSU8zLCBJTzQsIElPNSwgSU82LCBJTzcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzAgIl0sICAgJVsiICNJTzAgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU8xICJdLCAgICVbIiAjSU8xICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPMiAiXSwgICAlWyIgI0lPMiAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzMgIl0sICAgJVsiICNJTzMgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU80ICJdLCAgICVbIiAjSU80ICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPNSAiXSwgICAlWyIgI0lPNSAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzYgIl0sICAgJVsiICNJTzYgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU83ICJdLCAgICVbIiAjSU83ICJdICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIGRwYS53LnBoICRhYzAgdGVtcDAgLHRlbXAxCisvLyAgJGFjICs9IHRlbXAwWzMxLi4xNl0gKiB0ZW1wMVszMS4uMTZdICsgdGVtcDBbMTUuLjBdICogdGVtcDFbMTUuLjBdCisvLyBkcGF4LncucGggJGFjMCB0ZW1wMCAsdGVtcDEKKy8vICAkYWMgKz0gdGVtcDBbMzEuLjE2XSAqIHRlbXAxWzE1Li4wXSArIHRlbXAwWzE1Li4wXSAqIHRlbXAxWzMxLi4xNl0KKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIE1VTF9IQUxGKE8wLCBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBJOCwgSTksIEkxMCwgSTExLCBJMTIsIEkxMywgSTE0LCBJMTUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXVsdCAgICAgICAgICAgICRhYzAsICAgICAgJHplcm8sICAgICAkemVybyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTIgIl0sICAlWyIgI0kwICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0k1ICJdLCAgJVsiICNJNiAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBhLncucGggICAgICAgICRhYzAsICAgICAgJVsiICNJOCAiXSwgICVbIiAjSTkgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYXgudy5waCAgICAgICAkYWMwLCAgICAgICVbIiAjSTExICJdLCAlWyIgI0k0ICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGEudy5waCAgICAgICAgJGFjMCwgICAgICAlWyIgI0kxMiAiXSwgJVsiICNJNyAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBheC53LnBoICAgICAgICRhYzAsICAgICAgJVsiICNJMTMgIl0sICVbIiAjSTEgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTE0ICJdLCAlWyIgI0kzICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0kxNSAiXSwgJVsiICNJMTAgIl0gICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAibWZsbyAgICAgICAgICAgICVbIiAjTzAgIl0sICAkYWMwICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE3KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xMCgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAxMl0iPSZyIih0ZW1wMTIpLCBbdGVtcDEzXSI9JnIiKHRlbXAxMyksICAgICAgICAgXAorICBbdGVtcDE0XSI9JnIiKHRlbXAxNCksIFt0ZW1wMTVdIj0mciIodGVtcDE1KSwgW3RlbXAxNl0iPSZyIih0ZW1wMTYpLCAgICAgICAgIFwKKyAgW3RlbXAxN10iPSZyIih0ZW1wMTcpCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBIC0gb2Zmc2V0IGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBzcmMgYW5kIHJlZiBidWZmZXJzCisvLyBURU1QMC4uVEVNUDMgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgMCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImx3ICAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgIDQoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJsdyAgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAwICJdKSBcblx0IiAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYmwgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDIgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJwcmVjZXUucGgucWJsICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAzICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAicHJlY2V1LnBoLnFiciAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMiAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYnIgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEgIl0gICAgICBcblx0IiAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAzICJdICAgICAgXG5cdCIgIFwKKyAgInJvdHIgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgMTYgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJhZGRxLnBoICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDAgIl0gICAgICBcblx0IiAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAwICJdICAgICAgXG5cdCIgIFwKKyAgInNlaCAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMSAiXSwgICAxNiAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic2VoICAgICAgICAgICAgICVbdGVtcDE5XSwgICAgICVbIiAjVEVNUDMgIl0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0sICAgMTYgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAwICJdLCAgICVbdGVtcDE2XSAgICAgICAgICBcblx0IiAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxN10sICAgICAlW3RlbXAxOV0sICAgICAlW2MyMjE3XSAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJtdWwgICAgICAgICAgICAgJVt0ZW1wMThdLCAgICAgJVsiICNURU1QMyAiXSwgICAlW2M1MzUyXSAgICAgICAgICAgICBcblx0IiAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVt0ZW1wMTldLCAgICAgJVtjNTM1Ml0gICAgICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAzICJdLCAgICVbYzIyMTddICAgICAgICAgICAgIFxuXHQiICBcCisgICJzbGwgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAyICJdLCAgIDMgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic2xsICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAzICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInN1YnUgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbdGVtcDE3XSwgICAgICVbdGVtcDE4XSAgICAgICAgICAgIFxuXHQiICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAxICJdICAgICAgICBcblx0IiAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMyAiXSwgICA5MzcgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbIiAjVEVNUDEgIl0sICAgMTgxMiAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAzICJdLCAgIDkgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVsiICNURU1QMSAiXSwgICA5ICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIEZUcmFuc2Zvcm0KKy8vIHRlbXAwLi50ZW1wMTUgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSB0byBvdXQgYnVmZmVyCisvLyBURU1QMCwgVEVNUDQsIFRFTVA4IGFuZCBURU1QMTIgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIFZFUlRJQ0FMX1BBU1MoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVA0LCBURU1QOCwgVEVNUDEyKSAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMTIgIl0gICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAlW3RlbXAxOV0sICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDEyICJdICAgXG5cdCIgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMTddLCAgICAgJVsiICNURU1QNCAiXSwgICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbdGVtcDE4XSwgICAgICVbIiAjVEVNUDQgIl0sICAgJVsiICNURU1QOCAiXSAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbdGVtcDE5XSwgICAgICVbYzIyMTddICAgICAgICAgXG5cdCIgICAgICBcCisgICJtdWwgICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlW3RlbXAxOF0sICAgICAlW2MyMjE3XSAgICAgICAgIFxuXHQiICAgICAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgJVt0ZW1wMTldLCAgICAgJVtjNTM1Ml0gICAgICAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxOF0sICAgICAlW3RlbXAxOF0sICAgICAlW2M1MzUyXSAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTZdLCAgICAgNyAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgNCAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlWyIgI1RFTVAxMiAiXSwgICVbIiAjVEVNUDQgIl0gIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTddICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgICVbIiAjVEVNUDQgIl0sICAgNCAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgIDMwMDAwICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QMTIgIl0sICAxMjAwMCAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgMjEwMDAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAlWyIgI1RFTVA4ICJdLCAgICVbdGVtcDE4XSAgICAgIFxuXHQiICAgICAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QMTIgIl0sICAxNiAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgMTYgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMTIgIl0sICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibW92biAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgJVt0ZW1wMTZdLCAgICAgJVt0ZW1wMTldICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgICIgI0EgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaCAgICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICAiICNDICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2ggICAgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgIiAjRCAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICIgI0IgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IGludCBjMjIxNyA9IDIyMTc7CisgIGNvbnN0IGludCBjNTM1MiA9IDUzNTI7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBpbnQgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNjsKKyAgaW50IHRlbXAxNywgdGVtcDE4LCB0ZW1wMTksIHRlbXAyMDsKKyAgY29uc3QgaW50KiBjb25zdCBhcmdzWzNdID0KKyAgICAgIHsgKGNvbnN0IGludCopc3JjLCAoY29uc3QgaW50KilyZWYsIChjb25zdCBpbnQqKW91dCB9OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIEhPUklaT05UQUxfUEFTUygwLCB0ZW1wMCwgIHRlbXAxLCAgdGVtcDIsICB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgdGVtcDQsICB0ZW1wNSwgIHRlbXA2LCAgdGVtcDcpCisgICAgSE9SSVpPTlRBTF9QQVNTKDIsIHRlbXA4LCAgdGVtcDksICB0ZW1wMTAsIHRlbXAxMSkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1KQorICAgICJsdyAgICAgICAgICAgICVbdGVtcDIwXSwgICAgIDgoJVthcmdzXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoMCwgIDgsIDE2LCAyNCwgdGVtcDAsIHRlbXA0LCB0ZW1wOCwgIHRlbXAxMikKKyAgICBWRVJUSUNBTF9QQVNTKDIsIDEwLCAxOCwgMjYsIHRlbXAxLCB0ZW1wNSwgdGVtcDksICB0ZW1wMTMpCisgICAgVkVSVElDQUxfUEFTUyg0LCAxMiwgMjAsIDI4LCB0ZW1wMiwgdGVtcDYsIHRlbXAxMCwgdGVtcDE0KQorICAgIFZFUlRJQ0FMX1BBU1MoNiwgMTQsIDIyLCAzMCwgdGVtcDMsIHRlbXA3LCB0ZW1wMTEsIHRlbXAxNSkKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCksCisgICAgICBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDE5XSI9JnIiKHRlbXAxOSksIFt0ZW1wMjBdIj0mciIodGVtcDIwKQorICAgIDogW2FyZ3NdInIiKGFyZ3MpLCBbYzIyMTddInIiKGMyMjE3KSwgW2M1MzUyXSJyIihjNTM1MikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIElUcmFuc2Zvcm1PbmUoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAyXSwgICAxNiglW2luXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX0lOX1gyKHRlbXA1LCB0ZW1wNiwgMjQsIDI2KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDEsIHRlbXAyKQorICAgIExPQURfSU5fWDIodGVtcDEsIHRlbXAyLCA4LCAxMCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LAorICAgICAgICAgICAgICAgICAgdGVtcDEwLCB0ZW1wOCwgdGVtcDksIHRlbXA3LCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNiwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMywgdGVtcDExLCB0ZW1wMTQsIHRlbXAxMikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wOCwgdGVtcDcsIHRlbXAxMCwgdGVtcDkpCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMTddLCAgNCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMThdLCAgMjAoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA2LCB0ZW1wNCwgdGVtcDcpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCkKKyAgICBMT0FEX0lOX1gyKHRlbXAxNywgdGVtcDE4LCAxMiwgMTQpCisgICAgTE9BRF9JTl9YMih0ZW1wOSwgdGVtcDEwLCAyOCwgMzApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wNCwgdGVtcDE3LAorICAgICAgICAgICAgICAgICAgdGVtcDEyLCB0ZW1wMTQsIHRlbXAxMSwgdGVtcDEzLCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDksIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxNSwgdGVtcDQsIHRlbXAxNiwgdGVtcDE3KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMTcsIHRlbXA4LCB0ZW1wOCwgdGVtcDExKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDcsIHRlbXAxMikKKworICAgIC8vIGhvcml6b250YWwKKyAgICBTUkFfMTYodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDUsIHRlbXA2KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxLCB0ZW1wNiwgdGVtcDUsIHRlbXAyKQorICAgIFNSQV8xNih0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwgdGVtcDE3LCB0ZW1wOCkKKyAgICAicmVwbC5waCAgICAgICAgICAlW3RlbXAyXSwgICAweDQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMywgdGVtcDgsIHRlbXAxNywgdGVtcDQpCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDIsIHRlbXA0LCB0ZW1wMSwgdGVtcDMpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA3LCB0ZW1wNiwgdGVtcDgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMSwgdGVtcDMsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsCisgICAgICAgICAgICAgICAgICB0ZW1wMywgdGVtcDEzLCB0ZW1wMSwgdGVtcDksIHRlbXA5LCB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE1LAorICAgICAgICAgICAgICAgICAgdGVtcDYsIHRlbXAxNywgdGVtcDgsIHRlbXAxOCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA2LCB0ZW1wOCwgdGVtcDE4LCB0ZW1wMTcsIHRlbXAxMSwgdGVtcDE1LCB0ZW1wMTIsIHRlbXAxNiwKKyAgICAgICAgICAgICAgICAgIHRlbXA4LCB0ZW1wMTUsIHRlbXA2LCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDE2LCB0ZW1wMTAsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxOCwgdGVtcDEyLCB0ZW1wMTcsIHRlbXAxNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDMsIHRlbXA5LCB0ZW1wMTMpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDYsIHRlbXA4LCB0ZW1wMTEsIHRlbXAxNSkKKyAgICBTSElGVF9SX1NVTV9YMih0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAyLCB0ZW1wNCwgdGVtcDUsIHRlbXA3LCB0ZW1wMywgdGVtcDEsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgIHRlbXA2KQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDksIHRlbXAxMiwgdGVtcDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTUsIHRlbXAxNCkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxMCwgdGVtcDExLCB0ZW1wMTQsIHRlbXAxNSwgcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDExLCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDksIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMTMsIHRlbXAxNiwgdGVtcDMsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgICAgZHN0LCAwLCAxLCAyLCAzLCBCUFMpCisKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCkKKyAgICA6IFtkc3RdInIiKGRzdCksIFtpbl0iciIoaW4pLCBba0MxXSJyIihrQzEpLCBba0MyXSJyIihrQzIpLCBbcmVmXSJyIihyZWYpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDQoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNzsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMywgdGVtcDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA3LCB0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxLCB0ZW1wMywgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAxLCB0ZW1wOSwgdGVtcDMsIHRlbXAxMCwgdGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAxMikKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wNSwgdGVtcDExLCB0ZW1wNywgdGVtcDIsIHRlbXA5LCB0ZW1wMywgdGVtcDYsIHRlbXAxMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wOCwgdGVtcDEwKQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wNCwgdGVtcDEwLCB0ZW1wOCwgdGVtcDcsIHRlbXAxMSwgdGVtcDUsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNywgdGVtcDExLCB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDEyKQorICAgIEFCU19YOCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMikKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAzLCB0ZW1wNiwgdGVtcDksIHRlbXAxMiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxNikKKyAgICBNVUxfSEFMRih0ZW1wMTcsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2KQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNSx0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSx0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0KQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIpCisgICAgUEFDS18yX0hBTFZFU19UT19XT1JEKHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDMsIHRlbXA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wNywgdGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDIsIHRlbXA0LCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMSwgdGVtcDMsIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSwgdGVtcDksIHRlbXAzLCB0ZW1wMTAsIHRlbXA1LCB0ZW1wMTEsIHRlbXA3LCB0ZW1wMTIpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAyLCB0ZW1wOSwgdGVtcDMsIHRlbXA2LCB0ZW1wMTIsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXA0LCB0ZW1wMSwgdGVtcDgsIHRlbXAxMCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDcsIHRlbXAxMSwgdGVtcDIsIHRlbXA5LCB0ZW1wNiwgdGVtcDMsIHRlbXAxMikKKyAgICBBQlNfWDgodGVtcDEsIHRlbXA0LCB0ZW1wMTAsIHRlbXA4LCB0ZW1wNywgdGVtcDExLCB0ZW1wNSwgdGVtcDIpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMywgdGVtcDYsIHRlbXA5LCB0ZW1wMTIsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMTYpCisgICAgTVVMX0hBTEYodGVtcDMsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwKKyAgICAgICAgICAgICB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2KQorICAgIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTcoKQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYiksIFt3XSJyIih3KQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGFicyh0ZW1wMyAtIHRlbXAxNykgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NChhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworI2RlZmluZSBGSUxMX1BBUlQoSiwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgIDArIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sICA0KyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA9PSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgIDgrIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICAgInVzdyAgICAgICAgJVt2YWx1ZV0sIDEyKyIgI0ogIioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIEZJTExfOF9PUl8xNihEU1QsIFZBTFVFLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHZhbHVlID0gKFZBTFVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJlcGx2LnFiICAgJVt2YWx1ZV0sICAlW3ZhbHVlXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDAsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggMSwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCAyLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDMsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA1LCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDYsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNywgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuaWYgIiAjU0laRSAiID09IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDgsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggOSwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDEwLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTEsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxMiwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDEzLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTQsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxNSwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICA6IFt2YWx1ZV0iKyZyIih2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW2RzdF0iciIoKERTVCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBWRVJUSUNBTF9QUkVEKERTVCwgVE9QLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZCMjU0laRSh1aW50OF90KiAoRFNUKSwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKFRPUCkpIHsgICAgICAgICAgICAgXAorICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChUT1ApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IChTSVpFKTsgKytqKSBtZW1jcHkoKERTVCkgKyBqICogQlBTLCAoVE9QKSwgKFNJWkUpKTsgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMXzhfT1JfMTYoKERTVCksIDEyNywgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitWRVJUSUNBTF9QUkVEKGRzdCwgdG9wLCA4KQorVkVSVElDQUxfUFJFRChkc3QsIHRvcCwgMTYpCisKKyN1bmRlZiBWRVJUSUNBTF9QUkVECisKKyNkZWZpbmUgSE9SSVpPTlRBTF9QUkVEKERTVCwgTEVGVCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZCMjU0laRSh1aW50OF90KiAoRFNUKSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKExFRlQpKSB7ICAgICAgICAgIFwKKyAgaWYgKExFRlQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaiA9IDA7IGogPCAoU0laRSk7ICsraikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG1lbXNldCgoRFNUKSArIGogKiBCUFMsIChMRUZUKVtqXSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMXzhfT1JfMTYoKERTVCksIDEyOSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitIT1JJWk9OVEFMX1BSRUQoZHN0LCBsZWZ0LCA4KQorSE9SSVpPTlRBTF9QUkVEKGRzdCwgbGVmdCwgMTYpCisKKyN1bmRlZiBIT1JJWk9OVEFMX1BSRUQKKworI2RlZmluZSBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbbGVmdFlfMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAlW2xlZnRZXzFdICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICBcblx0IgorCisjZGVmaW5lIENMSVBfOEJfVE9fRFNUKERTVCwgTEVGVCwgVE9QLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgbGVmdFlfMSA9ICgoaW50KShMRUZUKVt5XSA8PCAxNikgKyAoTEVGVClbeV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJyZXBsdi5waCAgICAgICAgJVtsZWZ0WV8xXSwgJVtsZWZ0WV8xXSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJzdWJ1LnBoICAgICAgICAgJVtsZWZ0WV8xXSwgJVtsZWZ0WV8xXSwgJVtsZWZ0XzFdICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW2RzdF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQUElORygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAwXSwgICA4KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgOiBbbGVmdFlfMV0iKyZyIihsZWZ0WV8xKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgICAgICAgXAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtsZWZ0XzFdInIiKGxlZnRfMSksIFt0b3BdInIiKChUT1ApKSwgW2RzdF0iciIoKERTVCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9UT19EU1QoRFNULCBMRUZULCBUT1AsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGVmdF8xID0gKChpbnQpKExFRlQpWy0xXSA8PCAxNikgKyAoTEVGVClbLTFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0gMDsgeSA8IChTSVpFKTsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUF84Ql9UT19EU1QoKERTVCksIChMRUZUKSwgKFRPUCksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChEU1QpICs9IEJQUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSVUVfTU9USU9OKERTVCwgTEVGVCwgVE9QLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbiMjU0laRSh1aW50OF90KiAoRFNUKSwgY29uc3QgdWludDhfdCogKExFRlQpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogKFRPUCkpIHsgICAgICAgICAgICAgICBcCisgIGlmICgoTEVGVCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoVE9QKSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENMSVBfVE9fRFNUKChEU1QpLCAoTEVGVCksIChUT1ApLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgSG9yaXpvbnRhbFByZWQjI1NJWkUoKERTVCksIChMRUZUKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkgICAgKi8gIFwKKyAgICAvKiBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuICovICBcCisgICAgLyogTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAgICAqLyAgXAorICAgIC8qIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuICAgICAgICAgICAgICAgICAgKi8gIFwKKyAgICBpZiAoKFRPUCkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWZXJ0aWNhbFByZWQjI1NJWkUoKERTVCksIChUT1ApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZJTExfOF9PUl8xNigoRFNUKSwgMTI5LCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVFJVRV9NT1RJT04oZHN0LCBsZWZ0LCB0b3AsIDgpCitUUlVFX01PVElPTihkc3QsIGxlZnQsIHRvcCwgMTYpCisKKyN1bmRlZiBUUlVFX01PVElPTgorI3VuZGVmIENMSVBfVE9fRFNUCisjdW5kZWYgQ0xJUF84Ql9UT19EU1QKKyN1bmRlZiBDTElQUElORworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGUxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IERDLCBEQzE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJiZXF6ICAgICAgICAlW3RvcF0sICAgMmYgICAgICAgICAgICAgICAgICBcblx0IgorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICAgIm1vdmUgICAgICAgICVbREMxXSwgICAlW0RDXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICAxZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbREMxXSwgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICVbRENdLCAgICAgJVtEQzFdICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICA0ZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDBdLCAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbdGVtcDJdLCAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMl0gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQ10gICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICVbRENdLCAgICAlW0RDXSwgICAgNSAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAgICVbRENdLCAgICAweDgwICAgICAgICAgICAgICAgIFxuXHQiCisgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbRENdIj0mciIoREMpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW0RDMV0iPSZyIihEQzEpCisgICAgOiBbbGVmdF0iciIobGVmdCksIFt0b3BdInIiKHRvcCkKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgRklMTF84X09SXzE2KGRzdCwgREMsIDE2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRENNb2RlOCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgREMsIERDMTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgImJlcXogICAgICAgICVbdG9wXSwgICAyZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDBdLCAwKCVbdG9wXSkgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDFdLCA0KCVbdG9wXSkgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDFdLCAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAwXSwgJVt0ZW1wMV0gIFxuXHQiCisgICAgIm1vdmUgICAgICAgICVbREMxXSwgICAlW0RDXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICAxZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDJdLCAwKCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDNdLCA0KCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbREMxXSwgICAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQzFdICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICAgICVbbGVmdF0sICA0ZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDJdLCAwKCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICVbdGVtcDNdLCA0KCVbbGVmdF0pICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDJdLCAlW3RlbXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICVbdGVtcDNdLCAlW3RlbXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW3RlbXAyXSwgJVt0ZW1wM10gIFxuXHQiCisgICAgImFkZHUgICAgICAgICVbRENdLCAgICAlW0RDXSwgICAgJVtEQ10gICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICVbRENdLCAlW0RDXSwgNCAgICAgICAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAgIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxpICAgICAgICAgICVbRENdLCAweDgwICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbRENdIj0mciIoREMpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW0RDMV0iPSZyIihEQzEpCisgICAgOiBbbGVmdF0iciIobGVmdCksIFt0b3BdInIiKHRvcCkKKyAgICA6ICJtZW1vcnkiCisgICk7CisKKyAgRklMTF84X09SXzE2KGRzdCwgREMsIDgpOworfQorCitzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMTsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAlW3RlbXAxXSwgICAtNSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGRpdSAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAzICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICVbdGVtcDBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAlW3RlbXAwXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgYTEwLCBhMzIsIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGNvbnN0IGludCBjMzUgPSAweGZmMDBmZjsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMV0sICAwKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgICVbYTEwXSwgICAgMSglW3RvcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAyXSwgIDIoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAgJVthMzJdLCAgICAzKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW3RlbXA0XSwgIC0xKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVthMTBdLCAgICAlW3RlbXAxXSwgICAxNiAgICAgICAgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbYTMyXSwgICAgJVt0ZW1wMl0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNocmwucGggICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgICA4ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhbmQgICAgICAgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgJVtjMzVdICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICVbdGVtcDRdICAgICAgICAgIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAlW3RlbXA0XSAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMV0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDBdLCAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wM10sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDNdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAyXSwgICAlW2ExMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgJVthMzJdICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMF0sICAlW3RlbXAxXSwgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDFdLCAgJVt0ZW1wMl0sICAgJVt0ZW1wM10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDVdLCAgICVbYTEwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXA1XSwgICAlW2EzMl0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNF0sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDJdLCAgJVt0ZW1wM10sICAgJVt0ZW1wMl0gICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAzXSwgICVbdGVtcDRdLCAgICVbdGVtcDVdICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDBdLCAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wMl0sICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbYTEwXSI9JnIiKGExMCksIFthMzJdIj0mciIoYTMyKQorICAgIDogW2MzNV0iciIoYzM1KSwgW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsaCAgICAgICAgICAgICAlW3RlbXAxXSwgICAzKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDRdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDRdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTQoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICVbdGVtcDFdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wM10sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBpbnQgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIC01KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDhdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAyICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDVdLCAgICAlW3RlbXA4XSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAyICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAyICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDMoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDIoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDEoJVt0b3BdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAxICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDEwXSwgICAlW3RlbXA5XSAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAyICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDExXSwgICAlW3RlbXAxMF0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDExXSwgICA4ICAgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDBdLCAgICA4ICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFZSNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAtNCglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDFdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgIm1vdmUgICAgICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDddLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDldICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wOF0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA4XSwgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDVdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wM10sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wNl0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBpbnQgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgMiAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyNCAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDEwXSwgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDEwXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDEwXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDExXSwgICA4ICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMV0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDldLCAgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVkw0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgNCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDJdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA4XSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDRdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAwXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDhdLCAgICVbdGVtcDhdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVwZW5kICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDZdLCAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibGEgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDldLCAgICVbdGVtcDJdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA3XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDhdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDNdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wNl0sICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDddLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wNl0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA1XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA0XSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDVdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSkKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAxXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAzXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAyXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAlW3RlbXAyXSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNV0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAzXSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wN10sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDddLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDJdLCAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNykKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHJvbWEgOHg4IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4yKQorCitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVByZWRzKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIC8vIFUgYmxvY2sKKyAgRENNb2RlOChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7CisgIC8vIFYgYmxvY2sKKyAgZHN0ICs9IDg7CisgIGlmICh0b3ApIHRvcCArPSA4OworICBpZiAobGVmdCkgbGVmdCArPSAxNjsKKyAgRENNb2RlOChDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkOChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4KEM4SEU4ICsgZHN0LCBsZWZ0KTsKKyAgVHJ1ZU1vdGlvbjgoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHModWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQ01vZGUxNihJMTZEQzE2ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQxNihJMTZWRTE2ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDE2KEkxNkhFMTYgKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uMTYoSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wKTsKK30KKworLy8gTGVmdCBzYW1wbGVzIGFyZSB0b3BbLTUgLi4gLTJdLCB0b3BfbGVmdCBpcyB0b3BbLTFdLCB0b3AgYXJlCisvLyBsb2NhdGVkIGF0IHRvcFswLi4zXSwgYW5kIHRvcCByaWdodCBpcyB0b3BbNC4uN10KK3N0YXRpYyB2b2lkIEludHJhNFByZWRzKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDNChJNERDNCArIGRzdCwgdG9wKTsKKyAgVE00KEk0VE00ICsgZHN0LCB0b3ApOworICBWRTQoSTRWRTQgKyBkc3QsIHRvcCk7CisgIEhFNChJNEhFNCArIGRzdCwgdG9wKTsKKyAgUkQ0KEk0UkQ0ICsgZHN0LCB0b3ApOworICBWUjQoSTRWUjQgKyBkc3QsIHRvcCk7CisgIExENChJNExENCArIGRzdCwgdG9wKTsKKyAgVkw0KEk0Vkw0ICsgZHN0LCB0b3ApOworICBIRDQoSTRIRDQgKyBkc3QsIHRvcCk7CisgIEhVNChJNEhVNCArIGRzdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldHJpYworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisjZGVmaW5lIEdFVF9TU0VfSU5ORVIoQSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgICIgI0EgIiglW2FdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibHcgICAgICAgICAgICAgICAlW3RlbXAxXSwgICAgIiAjQSAiKCVbYl0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgICAgXG5cdCIgICAgICBcCisgICJkcGEudy5waCAgICAgICAgICRhYzAsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgImRwYS53LnBoICAgICAgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgR0VUX1NTRShBLCBCLCBDLCBEKSAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihBKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihCKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihDKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX1NTRV9JTk5FUihEKQorCitzdGF0aWMgaW50IFNTRTE2eDE2KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgR0VUX1NTRSggMSAqIEJQUywgNCArICAxICogQlBTLCA4ICsgIDEgKiBCUFMsIDEyICsgIDEgKiBCUFMpCisgICAgR0VUX1NTRSggMiAqIEJQUywgNCArICAyICogQlBTLCA4ICsgIDIgKiBCUFMsIDEyICsgIDIgKiBCUFMpCisgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgR0VUX1NTRSggNCAqIEJQUywgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMpCisgICAgR0VUX1NTRSggNSAqIEJQUywgNCArICA1ICogQlBTLCA4ICsgIDUgKiBCUFMsIDEyICsgIDUgKiBCUFMpCisgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgR0VUX1NTRSggNyAqIEJQUywgNCArICA3ICogQlBTLCA4ICsgIDcgKiBCUFMsIDEyICsgIDcgKiBCUFMpCisgICAgR0VUX1NTRSggOCAqIEJQUywgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMpCisgICAgR0VUX1NTRSggOSAqIEJQUywgNCArICA5ICogQlBTLCA4ICsgIDkgKiBCUFMsIDEyICsgIDkgKiBCUFMpCisgICAgR0VUX1NTRSgxMCAqIEJQUywgNCArIDEwICogQlBTLCA4ICsgMTAgKiBCUFMsIDEyICsgMTAgKiBCUFMpCisgICAgR0VUX1NTRSgxMSAqIEJQUywgNCArIDExICogQlBTLCA4ICsgMTEgKiBCUFMsIDEyICsgMTEgKiBCUFMpCisgICAgR0VUX1NTRSgxMiAqIEJQUywgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMpCisgICAgR0VUX1NTRSgxMyAqIEJQUywgNCArIDEzICogQlBTLCA4ICsgMTMgKiBCUFMsIDEyICsgMTMgKiBCUFMpCisgICAgR0VUX1NTRSgxNCAqIEJQUywgNCArIDE0ICogQlBTLCA4ICsgMTQgKiBCUFMsIDEyICsgMTQgKiBCUFMpCisgICAgR0VUX1NTRSgxNSAqIEJQUywgNCArIDE1ICogQlBTLCA4ICsgMTUgKiBCUFMsIDEyICsgMTUgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTE2eDgoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBHRVRfU1NFKCAwICogQlBTLCA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUykKKyAgICBHRVRfU1NFKCAxICogQlBTLCA0ICsgIDEgKiBCUFMsIDggKyAgMSAqIEJQUywgMTIgKyAgMSAqIEJQUykKKyAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICBHRVRfU1NFKCAzICogQlBTLCA0ICsgIDMgKiBCUFMsIDggKyAgMyAqIEJQUywgMTIgKyAgMyAqIEJQUykKKyAgICBHRVRfU1NFKCA0ICogQlBTLCA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUykKKyAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICBHRVRfU1NFKCA2ICogQlBTLCA0ICsgIDYgKiBCUFMsIDggKyAgNiAqIEJQUywgMTIgKyAgNiAqIEJQUykKKyAgICBHRVRfU1NFKCA3ICogQlBTLCA0ICsgIDcgKiBCUFMsIDggKyAgNyAqIEJQUywgMTIgKyAgNyAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSgwICogQlBTLCA0ICsgMCAqIEJQUywgMSAqIEJQUywgNCArIDEgKiBCUFMpCisgICAgR0VUX1NTRSgyICogQlBTLCA0ICsgMiAqIEJQUywgMyAqIEJQUywgNCArIDMgKiBCUFMpCisgICAgR0VUX1NTRSg0ICogQlBTLCA0ICsgNCAqIEJQUywgNSAqIEJQUywgNCArIDUgKiBCUFMpCisgICAgR0VUX1NTRSg2ICogQlBTLCA0ICsgNiAqIEJQUywgNyAqIEJQUywgNCArIDcgKiBCUFMpCisgICAgIm1mbG8gICAlW2NvdW50XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTR4NChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEdFVF9TU0UoMCAqIEJQUywgMSAqIEJQUywgMiAqIEJQUywgMyAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKKyN1bmRlZiBHRVRfU1NFCisjdW5kZWYgR0VUX1NTRV9JTk5FUgorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworI3VuZGVmIEZJTExfOF9PUl8xNgorI3VuZGVmIEZJTExfUEFSVAorI3VuZGVmIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTcKKyN1bmRlZiBNVUxfSEFMRgorI3VuZGVmIEFCU19YOAorI3VuZGVmIEFERF9TVUJfSEFMVkVTX1g0CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6YXRpb24KKy8vCisKKy8vIG1hY3JvIGZvciBvbmUgcGFzcyB0aHJvdWdoIGZvciBsb29wIGluIFF1YW50aXplQmxvY2sgcmVhZGluZyAyIHZhbHVlcyBhdCB0aW1lCisvLyBRVUFOVERJViBtYWNybyBpbmxpbmVkCisvLyBKIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogMikKKy8vIEsgLSBvZmZzZXQgaW4gYnl0ZXMgKGtaaWd6YWdbbl0gKiA0KQorLy8gTiAtIG9mZnNldCBpbiBieXRlcyAobiAqIDIpCisvLyBOMSAtIG9mZnNldCBpbiBieXRlcyAoKG4gKyAxKSAqIDIpCisjZGVmaW5lIFFVQU5USVpFX09ORShKLCBLLCBOLCBOMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgICVbdGVtcDFdLCAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidWx3ICAgICAgICAgJVt0ZW1wMl0sICAgICAiICNKICIoJVtwcHNoYXJwZW5dKSAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0sgIiglW3BwenRocmVzaF0pICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDZdLCAgICAgIiAjSyAiKzQoJVtwcHp0aHJlc2hdKSAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWJzcV9zLnBoICAgJVt0ZW1wNF0sICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDZdLCAgICAgICAgIDE2LCAgICAgICAxNiAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUucGggICAgICVbY29lZmZdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVt0ZW1wMl0gICAgICBcblx0IiAgICAgICAgXAorICAic2hyYS5waCAgICAgJVtzaWduXSwgICAgICAlW3RlbXAxXSwgICAgICAgICAxNSAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaSAgICAgICAgICAlW2xldmVsXSwgICAgIDB4MTAwMDEgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImNtcC5sdC5waCAgICVbdGVtcDNdLCAgICAgJVtjb2VmZl0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwaWNrLnBoICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICQwICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImx3ICAgICAgICAgICVbdGVtcDJdLCAgICAgIiAjSyAiKCVbcHBiaWFzXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYmVxeiAgICAgICAgJVt0ZW1wNV0sICAgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIiglW3BwcV0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImJlcSAgICAgICAgICVbdGVtcDVdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMWYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgICAweDEgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA0XSwgICAgICVbY29lZmZdLCAgICAgICAgIDB4ZmZmZiAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImJlcXogICAgICAgICVbdGVtcDVdLCAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVtsZXZlbF0sICAgICAlW3RlbXA0XSwgICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI0ogIisyKCVbcHBpbl0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDE3ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNsdCAgICAgICAgICVbdGVtcDRdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAibW92biAgICAgICAgJVtsZXZlbF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW3RlbXA0XSAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA2XSwgICAgICVbc2lnbl0sICAgICAgICAgIDB4ZmZmZiAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInhvciAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAic3VidSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm9yICAgICAgICAgICVbcmV0XSwgICAgICAgJVtyZXRdLCAgICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW3RlbXA1XSwgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAxXSwgICAgICIgI0ogIisyKCVbcHBpcV0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbdGVtcDVdLCAgICAgJVtjb2VmZl0sICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVtsZXZlbF0sICAgICAlW3RlbXA1XSwgICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0sgIis0KCVbcHBiaWFzXSkgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKzIoJVtwcHFdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDE3ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbdGVtcDZdLCAgICAgJVtzaWduXSwgICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2x0ICAgICAgICAgJVt0ZW1wNF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJtb3ZuICAgICAgICAlW2xldmVsXSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbdGVtcDRdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInhvciAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAic3VidSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW3RlbXA1XSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDNdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNOICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJvciAgICAgICAgICAlW3JldF0sICAgICAgICVbcmV0XSwgICAgICAgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbdGVtcDVdLCAgICAgIiAjSiAiKzIoJVtwcGluXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJqICAgICAgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0sgIiglW3BwYmlhc10pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVsdyAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKCVbcHBxXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYW5kaSAgICAgICAgJVt0ZW1wNV0sICAgICAlW2NvZWZmXSwgICAgICAgICAweGZmZmYgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmwgICAgICAgICAlW3RlbXAwXSwgICAgICVbY29lZmZdLCAgICAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDZdLCAgICAgIiAjSiAiKzIoJVtwcGlxXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibHcgICAgICAgICAgJVtjb2VmZl0sICAgICAiICNLICIrNCglW3BwYmlhc10pICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW2xldmVsXSwgICAgICVbdGVtcDVdLCAgICAgICAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wMF0sICAgICAgICAgJVt0ZW1wNl0gICAgICBcblx0IiAgICAgICAgXAorICAiYWRkdSAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJhZGR1ICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAgICVbY29lZmZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNycS5waC53ICVbbGV2ZWxdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2hyYS5waCAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAxICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJjbXAubHQucGggICAlW21heF9sZXZlbDFdLCVbbGV2ZWxdICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInBpY2sucGggICAgICVbbGV2ZWxdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAieG9yICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3NpZ25dICAgICAgIFxuXHQiICAgICAgICBcCisgICJzdWJ1LnBoICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbc2lnbl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bC5waCAgICAgICVbdGVtcDNdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wM10gICAgICBcblx0IiAgICAgICAgXAorICAib3IgICAgICAgICAgJVtyZXRdLCAgICAgICAlW3JldF0sICAgICAgICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW2xldmVsXSwgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVtsZXZlbF0sICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAlW3RlbXAzXSwgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTjEgIiglW3BvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgJDAsICAgICAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsdGVtcDY7CisgIGludCBzaWduLCBjb2VmZiwgbGV2ZWw7CisgIGludCBtYXhfbGV2ZWwgPSBNQVhfTEVWRUw7CisgIGludCBtYXhfbGV2ZWwxID0gbWF4X2xldmVsIDw8IDE2IHwgbWF4X2xldmVsOworICBpbnQgcmV0ID0gMDsKKworICBpbnQxNl90KiBwcGluICAgICAgICAgICAgID0gJmluWzBdOworICBpbnQxNl90KiBwb3V0ICAgICAgICAgICAgID0gJm91dFswXTsKKyAgY29uc3QgdWludDE2X3QqIHBwc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBjb25zdCB1aW50MzJfdCogcHB6dGhyZXNoID0gJm10eC0+enRocmVzaF9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHEgICAgICAgPSAmbXR4LT5xX1swXTsKKyAgY29uc3QgdWludDE2X3QqIHBwaXEgICAgICA9ICZtdHgtPmlxX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwYmlhcyAgICA9ICZtdHgtPmJpYXNfWzBdOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIFFVQU5USVpFX09ORSggMCwgIDAsICAwLCAgMikKKyAgICBRVUFOVElaRV9PTkUoIDQsICA4LCAxMCwgMTIpCisgICAgUVVBTlRJWkVfT05FKCA4LCAxNiwgIDQsICA4KQorICAgIFFVQU5USVpFX09ORSgxMiwgMjQsIDE0LCAyNCkKKyAgICBRVUFOVElaRV9PTkUoMTYsIDMyLCAgNiwgMTYpCisgICAgUVVBTlRJWkVfT05FKDIwLCA0MCwgMjIsIDI2KQorICAgIFFVQU5USVpFX09ORSgyNCwgNDgsIDE4LCAyMCkKKyAgICBRVUFOVElaRV9PTkUoMjgsIDU2LCAyOCwgMzApCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtzaWduXSI9JnIiKHNpZ24pLCBbY29lZmZdIj0mciIoY29lZmYpLAorICAgICAgW2xldmVsXSI9JnIiKGxldmVsKSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3JldF0iKyZyIihyZXQpCisgICAgOiBbcHBpbl0iciIocHBpbiksIFtwb3V0XSJyIihwb3V0KSwgW21heF9sZXZlbDFdInIiKG1heF9sZXZlbDEpLAorICAgICAgW3BwaXFdInIiKHBwaXEpLCBbbWF4X2xldmVsXSJyIihtYXhfbGV2ZWwpLAorICAgICAgW3BwYmlhc10iciIocHBiaWFzKSwgW3BwenRocmVzaF0iciIocHB6dGhyZXNoKSwKKyAgICAgIFtwcHNoYXJwZW5dInIiKHBwc2hhcnBlbiksIFtwcHFdInIiKHBwcSkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIChyZXQgIT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFF1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBRdWFudGl6ZUJsb2NrKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisjdW5kZWYgUVVBTlRJWkVfT05FCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIEZUcmFuc2Zvcm1XSFQKKy8vIHRlbXAwLi50ZW1wNyBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEsIEIsIEMsIEQgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIGluIGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVAxIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBIT1JJWk9OVEFMX1BBU1NfV0hUKEEsIEIsIEMsIEQsIFRFTVAwLCBURU1QMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbaW5dKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICIgI0IgIiglW2luXSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICVbdGVtcDhdLCAgICAgIiAjQyAiKCVbaW5dKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlW3RlbXA5XSwgICAgICIgI0QgIiglW2luXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDAgIl0sICAxNiwgIDE2ICBcblx0IiAgICAgICAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICVbdGVtcDldLCAgICAgJVt0ZW1wOF0sICAgICAxNiwgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlW3RlbXA4XSwgICAgICVbIiAjVEVNUDEgIl0sICAlW3RlbXA5XSAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICAlWyIgI1RFTVAxICJdLCAgJVt0ZW1wOV0gICBcblx0IiAgICAgICAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImFwcGVuZCAgICAgICAgICAlW3RlbXA4XSwgICAgICVbdGVtcDldLCAgICAgMTYgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMSAiXSwgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSBcblx0IiAgICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wOF0gXG5cdCIgICAgICAgICAgICAgIFwKKyAgInJvdHIgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgJVsiICNURU1QMSAiXSwgIDE2ICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBGVHJhbnNmb3JtV0hUCisvLyB0ZW1wMC4udGVtcDcgaG9sZHMgdG1wWzBdLi50bXBbMTVdCisvLyBBLCBCLCBDLCBEIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBzdG9yZSB0byBvdXQgYnVmZmVyCisvLyBURU1QMCwgVEVNUDIsIFRFTVA0IGFuZCBURU1QNiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgVkVSVElDQUxfUEFTU19XSFQoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVAyLCBURU1QNCwgVEVNUDYpICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOF0sICAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QNCAiXSAgICBcblx0IiAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDYgIl0gICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDYgIl0gIFxuXHQiICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QNiAiXSwgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVA0ICJdICBcblx0IiAgICAgICAgXAorICAiYWRkcWgucGggICAgICAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnFoLnBoICAgICAgICAlWyIgI1RFTVA0ICJdLCAgJVsiICNURU1QNiAiXSwgICVbIiAjVEVNUDIgIl0gIFxuXHQiICAgICAgICBcCisgICJhZGRxaC5waCAgICAgICAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVA2ICJdICBcblx0IiAgICAgICAgXAorICAic3VicWgucGggICAgICAgICVbIiAjVEVNUDYgIl0sICAlW3RlbXA4XSwgICAgICVbdGVtcDldICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVAwICJdLCAgIiAjQSAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgJVsiICNURU1QMiAiXSwgICIgI0IgIiglW291dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAiICNDICIoJVtvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVA2ICJdLCAgIiAjRCAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIEhPUklaT05UQUxfUEFTU19XSFQoICAwLCAgMzIsICA2NCwgIDk2LCB0ZW1wMCwgdGVtcDEpCisgICAgSE9SSVpPTlRBTF9QQVNTX1dIVCgxMjgsIDE2MCwgMTkyLCAyMjQsIHRlbXAyLCB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1NfV0hUKDI1NiwgMjg4LCAzMjAsIDM1MiwgdGVtcDQsIHRlbXA1KQorICAgIEhPUklaT05UQUxfUEFTU19XSFQoMzg0LCA0MTYsIDQ0OCwgNDgwLCB0ZW1wNiwgdGVtcDcpCisgICAgVkVSVElDQUxfUEFTU19XSFQoMCwgIDgsIDE2LCAyNCwgdGVtcDAsIHRlbXAyLCB0ZW1wNCwgdGVtcDYpCisgICAgVkVSVElDQUxfUEFTU19XSFQoNCwgMTIsIDIwLCAyOCwgdGVtcDEsIHRlbXAzLCB0ZW1wNSwgdGVtcDcpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbaW5dInIiKGluKSwgW291dF0iciIob3V0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1NfV0hUCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTX1dIVAorCisvLyBtYWNybyBmb3IgY29udmVydGluZyBjb2VmZmljaWVudHMgdG8gYmluCisvLyBjb252ZXJ0IDggY29lZmZzIGF0IHRpbWUKKy8vIEEsIEIsIEMsIEQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBvdXQgYnVmZmVyCisjZGVmaW5lIENPTlZFUlRfQ09FRkZTX1RPX0JJTihBLCBCLCBDLCBEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAwXSwgICIgI0EgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgJVt0ZW1wMV0sICAiICNCICIoJVtvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICVbdGVtcDJdLCAgIiAjQyAiKCVbb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAzXSwgICIgI0QgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wMF0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICVbdGVtcDFdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAlW3RlbXAyXSwgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAzICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJsLnBoICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hybC5waCAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbC5waCAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAyICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGwucGggICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMiAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDBdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXAxXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxNiwgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNF0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDBdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA2XSwgICVbdGVtcDJdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAwXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDVdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAxXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wN10sICAlW3RlbXAzXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDZdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDE2LCAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA2XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDddKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wN10pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGNvbnN0IGludCBtYXhfY29lZmYgPSAoTUFYX0NPRUZGX1RIUkVTSCA8PCAxNikgKyBNQVhfQ09FRkZfVEhSRVNIOworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworCisgICAgVlA4RlRyYW5zZm9ybShyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgIENPTlZFUlRfQ09FRkZTX1RPX0JJTiggMCwgIDQsICA4LCAxMikKKyAgICAgIENPTlZFUlRfQ09FRkZTX1RPX0JJTigxNiwgMjAsIDI0LCAyOCkKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgICAgOiBbZGlzdF0iciIoZGlzdHJpYnV0aW9uKSwgW291dF0iciIob3V0KSwgW21heF9jb2VmZl0iciIobWF4X2NvZWZmKQorICAgICAgOiAibWVtb3J5IgorICAgICk7CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworI3VuZGVmIENPTlZFUlRfQ09FRkZTX1RPX0JJTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybTsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm07CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0OworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTY7CisgIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHM7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkczsKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHM7CisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2OworICBWUDhTU0U4eDggPSBTU0U4eDg7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4OworICBWUDhTU0U0eDQgPSBTU0U0eDQ7CisjZW5kaWYKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2s7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2NrczsKKyAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFQ7CisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9lbmNfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjE2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX3NzZTIuYwpAQCAtMCwwICsxLDEzNDAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogQ2hyaXN0aWFuIER1dml2aWVyIChjZHV2aXZpZXJAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKSB7CisgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2LWJpdCBmaXhlZCBwb2ludCB2ZXJzaW9ucyBvZiB0d28KKyAgLy8gbXVsdGlwbHkgY29uc3RhbnRzOgorICAvLyAgICBLMSA9IHNxcnQoMikgKiBjb3MgKHBpLzgpIH49IDg1NjI3IC8gMl4xNgorICAvLyAgICBLMiA9IHNxcnQoMikgKiBzaW4gKHBpLzgpIH49IDM1NDY4IC8gMl4xNgorICAvLworICAvLyBUbyBiZSBhYmxlIHRvIHVzZSBzaWduZWQgMTYtYml0IGludGVnZXJzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayB0bworICAvLyBoYXZlIGNvbnN0YW50cyB3aXRoaW4gcmFuZ2U6CisgIC8vIC0gQXNzb2NpYXRlZCBjb25zdGFudHMgYXJlIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nIHRoZSAxNi1iaXQgZml4ZWQgcG9pbnQKKyAgLy8gICB2ZXJzaW9uIG9mIG9uZToKKyAgLy8gICAgICBrID0gSyAtICgxIDw8IDE2KSAgPT4gIEsgPSBrICsgKDEgPDwgMTYpCisgIC8vICAgICAgSzEgPSA4NTI2NyAgPT4gIGsxID0gIDIwMDkxCisgIC8vICAgICAgSzIgPSAzNTQ2OCAgPT4gIGsyID0gLTMwMDY4CisgIC8vIC0gVGhlIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFyaWFibGUgYnkgYSBjb25zdGFudCBiZWNvbWUgdGhlIHN1bSBvZiB0aGUKKyAgLy8gICB2YXJpYWJsZSBhbmQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoYXQgdmFyaWFibGUgYnkgdGhlIGFzc29jaWF0ZWQKKyAgLy8gICBjb25zdGFudDoKKyAgLy8gICAgICAoeCAqIEspID4+IDE2ID0gKHggKiAoayArICgxIDw8IDE2KSkpID4+IDE2ID0gKCh4ICogayApID4+IDE2KSArIHgKKyAgY29uc3QgX19tMTI4aSBrMSA9IF9tbV9zZXQxX2VwaTE2KDIwMDkxKTsKKyAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KC0zMDA2OCk7CisgIF9fbTEyOGkgVDAsIFQxLCBUMiwgVDM7CisKKyAgLy8gTG9hZCBhbmQgY29uY2F0ZW5hdGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgKHdlJ2xsIGRvIHR3byBpbnZlcnNlCisgIC8vIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwpLiBJbiB0aGUgY2FzZSBvZiBvbmx5IG9uZSBpbnZlcnNlIHRyYW5zZm9ybSwgdGhlCisgIC8vIHNlY29uZCBoYWxmIG9mIHRoZSB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlcgorICAvLyB1c2Ugbm9yIHN0b3JlLgorICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKKyAgeworICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzBdKTsKKyAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls0XSk7CisgICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bOF0pOworICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzEyXSk7CisgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAorICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKKyAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4CisgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAorICAgIGlmIChkb190d28pIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjRdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI4XSk7CisgICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKKyAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOworICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7CisgICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKKyAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCisgICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKKyAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworICAgIH0KKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOworICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZ0bXAwLCAmdG1wMSwgJnRtcDIsICZ0bXAzLCAmVDAsICZUMSwgJlQyLCAmVDMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKKyAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7CisgICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOworICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnNoaWZ0ZWQwLCAmc2hpZnRlZDEsICZzaGlmdGVkMiwgJnNoaWZ0ZWQzLCAmVDAsICZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEFkZCBpbnZlcnNlIHRyYW5zZm9ybSB0byAncmVmJyBhbmQgc3RvcmUuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIC8vIExvYWQgdGhlIHJlZmVyZW5jZShzKS4KKyAgICBfX20xMjhpIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjM7CisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gTG9hZCBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICByZWYwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKKyAgICAgIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOworICAgICAgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsyICogQlBTXSk7CisgICAgICByZWYzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gTG9hZCBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIHJlZjAgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlswICogQlBTXSkpOworICAgICAgcmVmMSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMigmcmVmWzEgKiBCUFNdKSk7CisgICAgICByZWYyID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKCZyZWZbMiAqIEJQU10pKTsKKyAgICAgIHJlZjMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlszICogQlBTXSkpOworICAgIH0KKyAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgICByZWYwID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7CisgICAgcmVmMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOworICAgIHJlZjIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKKyAgICByZWYzID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7CisgICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KKyAgICByZWYwID0gX21tX2FkZF9lcGkxNihyZWYwLCBUMCk7CisgICAgcmVmMSA9IF9tbV9hZGRfZXBpMTYocmVmMSwgVDEpOworICAgIHJlZjIgPSBfbW1fYWRkX2VwaTE2KHJlZjIsIFQyKTsKKyAgICByZWYzID0gX21tX2FkZF9lcGkxNihyZWYzLCBUMyk7CisgICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCisgICAgcmVmMCA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMCwgcmVmMCk7CisgICAgcmVmMSA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMSwgcmVmMSk7CisgICAgcmVmMiA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMiwgcmVmMik7CisgICAgcmVmMyA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMywgcmVmMyk7CisgICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSwgcmVmMCk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdLCByZWYxKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10sIHJlZjIpOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSwgcmVmMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMCAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjApKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbSgmZHN0WzEgKiBCUFNdLCBfbW1fY3Z0c2kxMjhfc2kzMihyZWYxKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oJmRzdFsyICogQlBTXSwgX21tX2N2dHNpMTI4X3NpMzIocmVmMikpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMyAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjMpKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVBhc3MxKGNvbnN0IF9fbTEyOGkqIGNvbnN0IGluMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4yMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQzMikgeworICBjb25zdCBfX20xMjhpIGs5MzcgPSBfbW1fc2V0MV9lcGkzMig5MzcpOworICBjb25zdCBfX20xMjhpIGsxODEyID0gX21tX3NldDFfZXBpMzIoMTgxMik7CisKKyAgY29uc3QgX19tMTI4aSBrODhwID0gX21tX3NldF9lcGkxNig4LCA4LCA4LCA4LCA4LCA4LCA4LCA4KTsKKyAgY29uc3QgX19tMTI4aSBrODhtID0gX21tX3NldF9lcGkxNigtOCwgOCwgLTgsIDgsIC04LCA4LCAtOCwgOCk7CisgIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxN3AgPSBfbW1fc2V0X2VwaTE2KDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMTcsIDUzNTIsIDIyMTcsIDUzNTIpOworICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTdtID0gX21tX3NldF9lcGkxNigtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC01MzUyLCAyMjE3LCAtNTM1MiwgMjIxNyk7CisKKyAgLy8gKmluMDEgPSAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMworICAvLyAqaW4yMyA9IDIwIDIxIDMwIDMxIDIyIDIzIDMyIDMzCisgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxX3AgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KCppbjAxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzX3AgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KCppbjIzLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgIC8vIDAwIDAxIDEwIDExIDAzIDAyIDEzIDEyCisgIC8vIDIwIDIxIDMwIDMxIDIzIDIyIDMzIDMyCisgIGNvbnN0IF9fbTEyOGkgczAxID0gX21tX3VucGFja2xvX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7CisgIGNvbnN0IF9fbTEyOGkgczMyID0gX21tX3VucGFja2hpX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7CisgIC8vIDAwIDAxIDEwIDExIDIwIDIxIDMwIDMxCisgIC8vIDAzIDAyIDEzIDEyIDIzIDIyIDMzIDMyCisgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX2FkZF9lcGkxNihzMDEsIHMzMik7CisgIGNvbnN0IF9fbTEyOGkgYTMyID0gX21tX3N1Yl9lcGkxNihzMDEsIHMzMik7CisgIC8vIFtkMCArIGQzIHwgZDEgKyBkMiB8IC4uLl0gPSBbYTAgYTEgfCBhMCcgYTEnIHwgLi4uIF0KKyAgLy8gW2QwIC0gZDMgfCBkMSAtIGQyIHwgLi4uXSA9IFthMyBhMiB8IGEzJyBhMicgfCAuLi4gXQorCisgIGNvbnN0IF9fbTEyOGkgdG1wMCAgID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhwKTsgIC8vIFsgKGEwICsgYTEpIDw8IDMsIC4uLiBdCisgIGNvbnN0IF9fbTEyOGkgdG1wMiAgID0gX21tX21hZGRfZXBpMTYoYTAxLCBrODhtKTsgIC8vIFsgKGEwIC0gYTEpIDw8IDMsIC4uLiBdCisgIGNvbnN0IF9fbTEyOGkgdG1wMV8xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3cCk7CisgIGNvbnN0IF9fbTEyOGkgdG1wM18xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3bSk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMV8yID0gX21tX2FkZF9lcGkzMih0bXAxXzEsIGsxODEyKTsKKyAgY29uc3QgX19tMTI4aSB0bXAzXzIgPSBfbW1fYWRkX2VwaTMyKHRtcDNfMSwgazkzNyk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMSAgID0gX21tX3NyYWlfZXBpMzIodG1wMV8yLCA5KTsKKyAgY29uc3QgX19tMTI4aSB0bXAzICAgPSBfbW1fc3JhaV9lcGkzMih0bXAzXzIsIDkpOworICBjb25zdCBfX20xMjhpIHMwMyAgICA9IF9tbV9wYWNrc19lcGkzMih0bXAwLCB0bXAyKTsKKyAgY29uc3QgX19tMTI4aSBzMTIgICAgPSBfbW1fcGFja3NfZXBpMzIodG1wMSwgdG1wMyk7CisgIGNvbnN0IF9fbTEyOGkgc19sbyAgID0gX21tX3VucGFja2xvX2VwaTE2KHMwMywgczEyKTsgICAvLyAwIDEgMCAxIDAgMS4uLgorICBjb25zdCBfX20xMjhpIHNfaGkgICA9IF9tbV91bnBhY2toaV9lcGkxNihzMDMsIHMxMik7ICAgLy8gMiAzIDIgMyAyIDMKKyAgY29uc3QgX19tMTI4aSB2MjMgICAgPSBfbW1fdW5wYWNraGlfZXBpMzIoc19sbywgc19oaSk7CisgICpvdXQwMSA9IF9tbV91bnBhY2tsb19lcGkzMihzX2xvLCBzX2hpKTsKKyAgKm91dDMyID0gX21tX3NodWZmbGVfZXBpMzIodjIzLCBfTU1fU0hVRkZMRSgxLCAwLCAzLCAyKSk7ICAvLyAzIDIgMyAyIDMgMi4uCit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1QYXNzMihjb25zdCBfX20xMjhpKiBjb25zdCB2MDEsIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHYzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzZXZlbiA9IF9tbV9zZXQxX2VwaTE2KDcpOworICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTcgPSBfbW1fc2V0X2VwaTE2KDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzUyLCAgMjIxNywgNTM1MiwgIDIyMTcpOworICBjb25zdCBfX20xMjhpIGsyMjE3XzUzNTIgPSBfbW1fc2V0X2VwaTE2KDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIpOworICBjb25zdCBfX20xMjhpIGsxMjAwMF9wbHVzX29uZSA9IF9tbV9zZXQxX2VwaTMyKDEyMDAwICsgKDEgPDwgMTYpKTsKKyAgY29uc3QgX19tMTI4aSBrNTEwMDAgPSBfbW1fc2V0MV9lcGkzMig1MTAwMCk7CisKKyAgLy8gU2FtZSBvcGVyYXRpb25zIGFyZSBkb25lIG9uIHRoZSAoMCwzKSBhbmQgKDEsMikgcGFpcnMuCisgIC8vIGEwID0gdjAgKyB2MworICAvLyBhMSA9IHYxICsgdjIKKyAgLy8gYTMgPSB2MCAtIHYzCisgIC8vIGEyID0gdjEgLSB2MgorICBjb25zdCBfX20xMjhpIGEwMSA9IF9tbV9hZGRfZXBpMTYoKnYwMSwgKnYzMik7CisgIGNvbnN0IF9fbTEyOGkgYTMyID0gX21tX3N1Yl9lcGkxNigqdjAxLCAqdjMyKTsKKyAgY29uc3QgX19tMTI4aSBhMTEgPSBfbW1fdW5wYWNraGlfZXBpNjQoYTAxLCBhMDEpOworICBjb25zdCBfX20xMjhpIGEyMiA9IF9tbV91bnBhY2toaV9lcGk2NChhMzIsIGEzMik7CisgIGNvbnN0IF9fbTEyOGkgYTAxX3BsdXNfNyA9IF9tbV9hZGRfZXBpMTYoYTAxLCBzZXZlbik7CisKKyAgLy8gZDAgPSAoYTAgKyBhMSArIDcpID4+IDQ7CisgIC8vIGQyID0gKGEwIC0gYTEgKyA3KSA+PiA0OworICBjb25zdCBfX20xMjhpIGMwID0gX21tX2FkZF9lcGkxNihhMDFfcGx1c183LCBhMTEpOworICBjb25zdCBfX20xMjhpIGMyID0gX21tX3N1Yl9lcGkxNihhMDFfcGx1c183LCBhMTEpOworICBjb25zdCBfX20xMjhpIGQwID0gX21tX3NyYWlfZXBpMTYoYzAsIDQpOworICBjb25zdCBfX20xMjhpIGQyID0gX21tX3NyYWlfZXBpMTYoYzIsIDQpOworCisgIC8vIGYxID0gKChiMyAqIDUzNTIgKyBiMiAqIDIyMTcgKyAxMjAwMCkgPj4gMTYpCisgIC8vIGYzID0gKChiMyAqIDIyMTcgLSBiMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpCisgIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTE2KGEyMiwgYTMyKTsKKyAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9tYWRkX2VwaTE2KGIyMywgazUzNTJfMjIxNyk7CisgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGsyMjE3XzUzNTIpOworICBjb25zdCBfX20xMjhpIGQxID0gX21tX2FkZF9lcGkzMihjMSwgazEyMDAwX3BsdXNfb25lKTsKKyAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMzIoYzMsIGs1MTAwMCk7CisgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fc3JhaV9lcGkzMihkMSwgMTYpOworICBjb25zdCBfX20xMjhpIGUzID0gX21tX3NyYWlfZXBpMzIoZDMsIDE2KTsKKyAgY29uc3QgX19tMTI4aSBmMSA9IF9tbV9wYWNrc19lcGkzMihlMSwgZTEpOworICBjb25zdCBfX20xMjhpIGYzID0gX21tX3BhY2tzX2VwaTMyKGUzLCBlMyk7CisgIC8vIGYxID0gZjEgKyAoYTMgIT0gMCk7CisgIC8vIFRoZSBjb21wYXJlIHdpbGwgcmV0dXJuICgweGZmZmYsIDApIGZvciAoPT0wLCAhPTApLiBUbyB0dXJuIHRoYXQgaW50byB0aGUKKyAgLy8gZGVzaXJlZCAoMCwgMSksIHdlIGFkZCBvbmUgZWFybGllciB0aHJvdWdoIGsxMjAwMF9wbHVzX29uZS4KKyAgLy8gLT4gZjEgPSBmMSArIDEgLSAoYTMgPT0gMCkKKyAgY29uc3QgX19tMTI4aSBnMSA9IF9tbV9hZGRfZXBpMTYoZjEsIF9tbV9jbXBlcV9lcGkxNihhMzIsIHplcm8pKTsKKworICBjb25zdCBfX20xMjhpIGQwX2cxID0gX21tX3VucGFja2xvX2VwaTY0KGQwLCBnMSk7CisgIGNvbnN0IF9fbTEyOGkgZDJfZjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoZDIsIGYzKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgZDBfZzEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBkMl9mMyk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsIGludDE2X3QqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAvLyBMb2FkIHNyYy4KKyAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmc3JjWzMgKiBCUFNdKTsKKyAgLy8gMDAgMDEgMDIgMDMgKgorICAvLyAxMCAxMSAxMiAxMyAqCisgIC8vIDIwIDIxIDIyIDIzICoKKyAgLy8gMzAgMzEgMzIgMzMgKgorICAvLyBTaHVmZmxlLgorICBjb25zdCBfX20xMjhpIHNyY18wID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzAsIHNyYzEpOworICBjb25zdCBfX20xMjhpIHNyY18xID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzIsIHNyYzMpOworICAvLyAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMyAqICogLi4uCisgIC8vIDIwIDIxIDMwIDMxIDIyIDIyIDMyIDMzICogKiAuLi4KKworICAvLyBMb2FkIHJlZi4KKyAgY29uc3QgX19tMTI4aSByZWYwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMCA9IF9tbV91bnBhY2tsb19lcGkxNihyZWYwLCByZWYxKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMSA9IF9tbV91bnBhY2tsb19lcGkxNihyZWYyLCByZWYzKTsKKworICAvLyBDb252ZXJ0IGJvdGggdG8gMTYgYml0LgorICBjb25zdCBfX20xMjhpIHNyY18wXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHNyY18wLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMV8xNmIgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmNfMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzBfMTZiID0gX21tX3VucGFja2xvX2VwaTgocmVmXzAsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8xXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZl8xLCB6ZXJvKTsKKworICAvLyBDb21wdXRlIHRoZSBkaWZmZXJlbmNlLgorICBjb25zdCBfX20xMjhpIHJvdzAxID0gX21tX3N1Yl9lcGkxNihzcmNfMF8xNmIsIHJlZl8wXzE2Yik7CisgIGNvbnN0IF9fbTEyOGkgcm93MjMgPSBfbW1fc3ViX2VwaTE2KHNyY18xXzE2YiwgcmVmXzFfMTZiKTsKKyAgX19tMTI4aSB2MDEsIHYzMjsKKworICAvLyBGaXJzdCBwYXNzCisgIEZUcmFuc2Zvcm1QYXNzMSgmcm93MDEsICZyb3cyMywgJnYwMSwgJnYzMik7CisKKyAgLy8gU2Vjb25kIHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MyKCZ2MDEsICZ2MzIsIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm0yKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKworICAvLyBMb2FkIHNyYyBhbmQgY29udmVydCB0byAxNmIuCisgIGNvbnN0IF9fbTEyOGkgc3JjMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1swICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1sxICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1syICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1szICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMwLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMSA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzEsIHplcm8pOworICBjb25zdCBfX20xMjhpIHNyY18yID0gX21tX3VucGFja2xvX2VwaTgoc3JjMiwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMzLCB6ZXJvKTsKKyAgLy8gTG9hZCByZWYgYW5kIGNvbnZlcnQgdG8gMTZiLgorICBjb25zdCBfX20xMjhpIHJlZjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMCAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMyAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHJlZl8wID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYxLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjIsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8zID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7CisgIC8vIENvbXB1dGUgZGlmZmVyZW5jZS4gLT4gMDAgMDEgMDIgMDMgIDAwJyAwMScgMDInIDAzJworICBjb25zdCBfX20xMjhpIGRpZmYwID0gX21tX3N1Yl9lcGkxNihzcmNfMCwgcmVmXzApOworICBjb25zdCBfX20xMjhpIGRpZmYxID0gX21tX3N1Yl9lcGkxNihzcmNfMSwgcmVmXzEpOworICBjb25zdCBfX20xMjhpIGRpZmYyID0gX21tX3N1Yl9lcGkxNihzcmNfMiwgcmVmXzIpOworICBjb25zdCBfX20xMjhpIGRpZmYzID0gX21tX3N1Yl9lcGkxNihzcmNfMywgcmVmXzMpOworCisgIC8vIFVucGFjayBhbmQgc2h1ZmZsZQorICAvLyAwMCAwMSAwMiAwMyAgIDAgMCAwIDAKKyAgLy8gMTAgMTEgMTIgMTMgICAwIDAgMCAwCisgIC8vIDIwIDIxIDIyIDIzICAgMCAwIDAgMAorICAvLyAzMCAzMSAzMiAzMyAgIDAgMCAwIDAKKyAgY29uc3QgX19tMTI4aSBzaHVmMDFsID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYwLCBkaWZmMSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzbCA9IF9tbV91bnBhY2tsb19lcGkzMihkaWZmMiwgZGlmZjMpOworICBjb25zdCBfX20xMjhpIHNodWYwMWggPSBfbW1fdW5wYWNraGlfZXBpMzIoZGlmZjAsIGRpZmYxKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmMjNoID0gX21tX3VucGFja2hpX2VwaTMyKGRpZmYyLCBkaWZmMyk7CisgIF9fbTEyOGkgdjAxbCwgdjMybDsKKyAgX19tMTI4aSB2MDFoLCB2MzJoOworCisgIC8vIEZpcnN0IHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MxKCZzaHVmMDFsLCAmc2h1ZjIzbCwgJnYwMWwsICZ2MzJsKTsKKyAgRlRyYW5zZm9ybVBhc3MxKCZzaHVmMDFoLCAmc2h1ZjIzaCwgJnYwMWgsICZ2MzJoKTsKKworICAvLyBTZWNvbmQgcGFzcworICBGVHJhbnNmb3JtUGFzczIoJnYwMWwsICZ2MzJsLCBvdXQgKyAwKTsKKyAgRlRyYW5zZm9ybVBhc3MyKCZ2MDFoLCAmdjMyaCwgb3V0ICsgMTYpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUUm93KGNvbnN0IGludDE2X3QqIGNvbnN0IGluLCBfX20xMjhpKiBjb25zdCBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSBrTXVsdCA9IF9tbV9zZXRfZXBpMTYoLTEsIDEsIC0xLCAxLCAxLCAxLCAxLCAxKTsKKyAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMCAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzEgKiAxNl0pOworICBjb25zdCBfX20xMjhpIHNyYzIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyICogMTZdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMyAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgQTAxID0gX21tX3VucGFja2xvX2VwaTE2KHNyYzAsIHNyYzEpOyAgLy8gQTAgQTEgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBBMjMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc3JjMiwgc3JjMyk7ICAvLyBBMiBBMyB8IC4uLgorICBjb25zdCBfX20xMjhpIEIwID0gX21tX2FkZHNfZXBpMTYoQTAxLCBBMjMpOyAgICAvLyBhMCB8IGExIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fc3Vic19lcGkxNihBMDEsIEEyMyk7ICAgIC8vIGEzIHwgYTIgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGkzMihCMCwgQjEpOyAgLy8gYTAgfCBhMSB8IGEzIHwgYTIgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGkzMihCMSwgQjApOyAgLy8gYTMgfCBhMiB8IGEwIHwgYTEgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBEID0gX21tX3VucGFja2xvX2VwaTY0KEMwLCBDMSk7ICAgLy8gYTAgYTEgYTMgYTIgYTMgYTIgYTAgYTEKKyAgKm91dCA9IF9tbV9tYWRkX2VwaTE2KEQsIGtNdWx0KTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7CisgIC8vIElucHV0IGlzIDEyYiBzaWduZWQuCisgIF9fbTEyOGkgcm93MCwgcm93MSwgcm93Miwgcm93MzsKKyAgLy8gUm93cyBhcmUgMTRiIHNpZ25lZC4KKyAgRlRyYW5zZm9ybVdIVFJvdyhpbiArIDAgKiA2NCwgJnJvdzApOworICBGVHJhbnNmb3JtV0hUUm93KGluICsgMSAqIDY0LCAmcm93MSk7CisgIEZUcmFuc2Zvcm1XSFRSb3coaW4gKyAyICogNjQsICZyb3cyKTsKKyAgRlRyYW5zZm9ybVdIVFJvdyhpbiArIDMgKiA2NCwgJnJvdzMpOworCisgIHsKKyAgICAvLyBUaGUgYSogYXJlIDE1YiBzaWduZWQuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMzIocm93MCwgcm93Mik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMzIocm93MSwgcm93Myk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMzIocm93MSwgcm93Myk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMzIocm93MCwgcm93Mik7CisgICAgY29uc3QgX19tMTI4aSBhMGEzID0gX21tX3BhY2tzX2VwaTMyKGEwLCBhMyk7CisgICAgY29uc3QgX19tMTI4aSBhMWEyID0gX21tX3BhY2tzX2VwaTMyKGExLCBhMik7CisKKyAgICAvLyBUaGUgYiogYXJlIDE2YiBzaWduZWQuCisgICAgY29uc3QgX19tMTI4aSBiMGIxID0gX21tX2FkZF9lcGkxNihhMGEzLCBhMWEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzYjIgPSBfbW1fc3ViX2VwaTE2KGEwYTMsIGExYTIpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wX2IyYjMgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjNiMiwgYjNiMik7CisgICAgY29uc3QgX19tMTI4aSBiMmIzID0gX21tX3VucGFja2xvX2VwaTY0KHRtcF9iMmIzLCBiM2IyKTsKKworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIF9tbV9zcmFpX2VwaTE2KGIwYjEsIDEpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBfbW1fc3JhaV9lcGkxNihiMmIzLCAxKSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXB1dGUgc3VzY2VwdGliaWxpdHkgYmFzZWQgb24gRENULWNvZWZmIGhpc3RvZ3JhbXM6CisvLyB0aGUgaGlnaGVyLCB0aGUgImVhc2llciIgdGhlIG1hY3JvYmxvY2sgaXMgdG8gY29tcHJlc3MuCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfdGhyZXNoID0gX21tX3NldDFfZXBpMTYoTUFYX0NPRUZGX1RIUkVTSCk7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIGludCBrOworCisgICAgRlRyYW5zZm9ybShyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbiAod2l0aGluIG91dFtdKS4KKyAgICB7CisgICAgICAvLyBMb2FkLgorICAgICAgY29uc3QgX19tMTI4aSBvdXQwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSk7CisgICAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBvdXQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3ViX2VwaTE2KHplcm8sIG91dDEpOworICAgICAgY29uc3QgX19tMTI4aSBhYnMwID0gX21tX21heF9lcGkxNihvdXQwLCBkMCk7ICAgLy8gYWJzKHYpLCAxNmIKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMSA9IF9tbV9tYXhfZXBpMTYob3V0MSwgZDEpOworICAgICAgLy8gdiA9IGFicyhvdXQpID4+IDMKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjAgPSBfbW1fc3JhaV9lcGkxNihhYnMwLCAzKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjEgPSBfbW1fc3JhaV9lcGkxNihhYnMxLCAzKTsKKyAgICAgIC8vIGJpbiA9IG1pbih2LCBNQVhfQ09FRkZfVEhSRVNIKQorICAgICAgY29uc3QgX19tMTI4aSBiaW4wID0gX21tX21pbl9lcGkxNih2MCwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICBjb25zdCBfX20xMjhpIGJpbjEgPSBfbW1fbWluX2VwaTE2KHYxLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIC8vIFN0b3JlLgorICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgYmluMCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBiaW4xKTsKKyAgICB9CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4uCisgICAgZm9yIChrID0gMDsgayA8IDE2OyArK2spIHsKKyAgICAgICsrZGlzdHJpYnV0aW9uW291dFtrXV07CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisvLyBoZWxwZXIgZm9yIGNocm9tYS1EQyBwcmVkaWN0aW9ucworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0OHg4dXYodWludDhfdCB2LCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOCh2KTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNih1aW50OF90IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KHYpOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB2YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbGwodWludDhfdCogZHN0LCBpbnQgdmFsdWUsIGludCBzaXplKSB7CisgIGlmIChzaXplID09IDQpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisgICAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIDQpOworICAgIH0KKyAgfSBlbHNlIGlmIChzaXplID09IDgpIHsKKyAgICBQdXQ4eDh1dih2YWx1ZSwgZHN0KTsKKyAgfSBlbHNlIHsKKyAgICBQdXQxNih2YWx1ZSwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTh1dih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB0b3BfdmFsdWVzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wX3ZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgIFZFOHV2KGRzdCwgdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgVkUxNihkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEZpbGwoZHN0LCAxMjcsIHNpemUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhFOHV2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOChsZWZ0W2pdKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgobGVmdFtqXSk7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZCh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBpbnQgc2l6ZSkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgSEU4dXYoZHN0LCBsZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgSEUxNihkc3QsIGxlZnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBGaWxsKGRzdCwgMTI5LCBzaXplKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUTSh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCB5OworICBpZiAoc2l6ZSA9PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gbGVmdFt5XSAtIGxlZnRbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlKSwgemVybyk7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMCA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMSA9IF9tbV91bnBhY2toaV9lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gbGVmdFt5XSAtIGxlZnRbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0XzAgPSBfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlXzApOworICAgICAgY29uc3QgX19tMTI4aSBvdXRfMSA9IF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2VfMSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYob3V0XzAsIG91dF8xKTsKKyAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBUTShkc3QsIGxlZnQsIHRvcCwgc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEhvcml6b250YWxQcmVkKGRzdCwgbGVmdCwgc2l6ZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIHRydWUgbW90aW9uIHdpdGhvdXQgbGVmdCBzYW1wbGVzIChoZW5jZTogd2l0aCBkZWZhdWx0IDEyOSB2YWx1ZSkKKyAgICAvLyBpcyBlcXVpdmFsZW50IHRvIFZFIHByZWRpY3Rpb24gd2hlcmUgeW91IGp1c3QgY29weSB0aGUgdG9wIHNhbXBsZXMuCisgICAgLy8gTm90ZSB0aGF0IGlmIHRvcCBzYW1wbGVzIGFyZSBub3QgYXZhaWxhYmxlLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcworICAgIC8vIHRoZW4gMTI5LCBhbmQgbm90IDEyNyBhcyBpbiB0aGUgVmVydGljYWxQcmVkIGNhc2UuCisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBWZXJ0aWNhbFByZWQoZHN0LCB0b3AsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBGaWxsKGRzdCwgMTI5LCBzaXplKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXYodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBsZWZ0X3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopbGVmdCk7CisgIGNvbnN0IF9fbTEyOGkgY29tYmluZWQgPSBfbW1fdW5wYWNrbG9fZXBpNjQodG9wX3ZhbHVlcywgbGVmdF92YWx1ZXMpOworICBjb25zdCBpbnQgREMgPSBWUDhIb3Jpem9udGFsQWRkOGIoJmNvbWJpbmVkKSArIDg7CisgIFB1dDh4OHV2KERDID4+IDQsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fc2FkX2VwdTgodG9wX3ZhbHVlcywgemVybyk7CisgIGNvbnN0IGludCBEQyA9IF9tbV9jdnRzaTEyOF9zaTMyKHN1bSkgKyA0OworICBQdXQ4eDh1dihEQyA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk5vVG9wKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICAvLyAnbGVmdCcgaXMgY29udGlndW91cyBzbyB3ZSBjYW4gcmV1c2UgdGhlIHRvcCBzdW1tYXRpb24uCisgIERDOHV2Tm9MZWZ0KGRzdCwgbGVmdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2Tm9Ub3BMZWZ0KHVpbnQ4X3QqIGRzdCkgeworICBQdXQ4eDh1digweDgwLCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk1vZGUodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBpZiAobGVmdCAhPSBOVUxMKSB7ICAvLyB0b3AgYW5kIGxlZnQgcHJlc2VudAorICAgICAgREM4dXYoZHN0LCBsZWZ0LCB0b3ApOworICAgIH0gZWxzZSB7ICAvLyB0b3AsIGJ1dCBubyBsZWZ0CisgICAgICBEQzh1dk5vTGVmdChkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgREM4dXZOb1RvcChkc3QsIGxlZnQpOworICB9IGVsc2UgeyAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIERDOHV2Tm9Ub3BMZWZ0KGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHRvcF9yb3cgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBsZWZ0X3JvdyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKilsZWZ0KTsKKyAgY29uc3QgaW50IERDID0KKyAgICAgIFZQOEhvcml6b250YWxBZGQ4YigmdG9wX3JvdykgKyBWUDhIb3Jpem9udGFsQWRkOGIoJmxlZnRfcm93KSArIDE2OworICBQdXQxNihEQyA+PiA1LCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2Tm9MZWZ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3JvdyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBpbnQgREMgPSBWUDhIb3Jpem9udGFsQWRkOGIoJnRvcF9yb3cpICsgODsKKyAgUHV0MTYoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk5vVG9wKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICAvLyAnbGVmdCcgaXMgY29udGlndW91cyBzbyB3ZSBjYW4gcmV1c2UgdGhlIHRvcCBzdW1tYXRpb24uCisgIERDMTZOb0xlZnQoZHN0LCBsZWZ0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk5vVG9wTGVmdCh1aW50OF90KiBkc3QpIHsKKyAgUHV0MTYoMHg4MCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk1vZGUodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGlmIChsZWZ0ICE9IE5VTEwpIHsgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CisgICAgICBEQzE2KGRzdCwgbGVmdCwgdG9wKTsKKyAgICB9IGVsc2UgeyAgLy8gdG9wLCBidXQgbm8gbGVmdAorICAgICAgREMxNk5vTGVmdChkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgLy8gbGVmdCBidXQgbm8gdG9wCisgICAgREMxNk5vVG9wKGRzdCwgbGVmdCk7CisgIH0gZWxzZSB7ICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgREMxNk5vVG9wTGVmdChkc3QpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQgcHJlZGljdGlvbnMKKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQorI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKworLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgOGItYXJpdGhtZXRpYyB0cmlja3M6CisvLyAgICAgKGEgKyAyICogYiArIGMgKyAyKSA+PiAyID0gKEFDICsgYiArIDEpID4+IDEKKy8vICAgd2hlcmU6IEFDID0gKGEgKyBjKSA+PiAxID0gWyhhICsgYyArIDEpID4+IDFdIC0gWyhhXmMpICYgMV0KKy8vIGFuZDoKKy8vICAgICAoYSArIDIgKiBiICsgYyArIDIpID4+IDIgPSAoQUIgKyBCQyArIDEpID4+IDEgLSAoYWJ8YmMpJmxzYgorLy8gICB3aGVyZTogQUMgPSAoYSArIGIgKyAxKSA+PiAxLCAgIEJDID0gKGIgKyBjICsgMSkgPj4gMQorLy8gICBhbmQgYWIgPSBhIF4gYiwgYmMgPSBiIF4gYywgbHNiID0gKEFDXkJDKSYxCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gdmVydGljYWwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikodG9wIC0gMSkpOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIENERUZHSDAwKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIENERUZHSDAwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1YnNfZXB1OChhLCBsc2IpOworICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9hdmdfZXB1OChiLCBCQ0RFRkdIMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbHMgPSBfbW1fY3Z0c2kxMjhfc2kzMihhdmcpOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyBpICogQlBTLCB2YWxzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgIC8vIGhvcml6b250YWwKKyAgY29uc3QgaW50IFggPSB0b3BbLTFdOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoWCwgSSwgSikpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEksIEosIEspKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhKLCBLLCBMKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSywgTCwgTCkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gdG9wW2ldICsgdG9wWy01ICsgaV07CisgIEZpbGwoZHN0LCBkYyA+PiAzLCA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBEb3duLUxlZnQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIENERUZHSEgwID0gX21tX2luc2VydF9lcGkxNihDREVGR0gwMCwgdG9wWzddLCAzKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0hIMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0hIMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkZWZnID0gX21tX2F2Z19lcHU4KGF2ZzIsIEJDREVGR0gwKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZSNCh1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBWZXJ0aWNhbC1SaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgX19tMTI4aSBYQUJDRCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHRvcCAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBBQkNEMCA9IF9tbV9zcmxpX3NpMTI4KFhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkID0gX21tX2F2Z19lcHU4KFhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgX1hBQkNEID0gX21tX3NsbGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIElYQUJDRCA9IF9tbV9pbnNlcnRfZXBpMTYoX1hBQkNELCBJIHwgKFggPDwgOCksIDApOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoSVhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KElYQUJDRCwgQUJDRDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgZWZnaCA9IF9tbV9hdmdfZXB1OChhdmcyLCBYQUJDRCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgZWZnaCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGFiY2QsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2xsaV9zaTEyOChlZmdoLCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBpbXBsZW1lbnQgaW4gU1NFMiwgc28gd2Uga2VlcCB0aGUgQy12ZXJzaW9uOgorICBEU1QoMCwgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMCwgMykgPSBBVkczKEssIEosIEkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWTDQodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gVmVydGljYWwtTGVmdAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSF8gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIX18gPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fYXZnX2VwdTgoQ0RFRkdIX18sIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmczID0gX21tX2F2Z19lcHU4KGF2ZzEsIGF2ZzIpOworICBjb25zdCBfX20xMjhpIGxzYjEgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoYXZnMSwgYXZnMiksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYWIgPSBfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYWJiYyA9IF9tbV9vcl9zaTEyOChhYiwgYmMpOworICBjb25zdCBfX20xMjhpIGxzYjIgPSBfbW1fYW5kX3NpMTI4KGFiYmMsIGxzYjEpOworICBjb25zdCBfX20xMjhpIGF2ZzQgPSBfbW1fc3Vic19lcHU4KGF2ZzMsIGxzYjIpOworICBjb25zdCB1aW50MzJfdCBleHRyYV9vdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCA0KSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhdmcxICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnNCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzEsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmc0LCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBnZXQgYW5kIGlycmVndWxhcgorICBEU1QoMywgMikgPSAoZXh0cmFfb3V0ID4+IDApICYgMHhmZjsKKyAgRFNUKDMsIDMpID0gKGV4dHJhX291dCA+PiA4KSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gRG93bi1yaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSh0b3AgLSA1KSk7CisgIGNvbnN0IF9fbTEyOGkgTEtKSVhBQkNEID0gX21tX2luc2VydF9lcGkxNihMS0pJWEFCQywgdG9wWzNdLCA0KTsKKyAgY29uc3QgX19tMTI4aSBLSklYQUJDRF8gPSBfbW1fc3JsaV9zaTEyOChMS0pJWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIEpJWEFCQ0RfXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChKSVhBQkNEX18sIExLSklYQUJDRCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGFiY2RlZmcgPSBfbW1fYXZnX2VwdTgoYXZnMiwgS0pJWEFCQ0RfKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRNNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIodG9wKSk7CisgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICBjb25zdCBpbnQgdmFsID0gdG9wWy0yIC0geV0gLSB0b3BbLTFdOworICAgIGNvbnN0IF9fbTEyOGkgYmFzZSA9IF9tbV9zZXQxX2VwaTE2KHZhbCk7CisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0LCBfbW1fY3Z0c2kxMjhfc2kzMihvdXQpKTsKKyAgfQorfQorCisjdW5kZWYgRFNUCisjdW5kZWYgQVZHMworI3VuZGVmIEFWRzIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGx1bWEgNHg0IHByZWRpY3Rpb24KKworLy8gTGVmdCBzYW1wbGVzIGFyZSB0b3BbLTUgLi4gLTJdLCB0b3BfbGVmdCBpcyB0b3BbLTFdLCB0b3AgYXJlCisvLyBsb2NhdGVkIGF0IHRvcFswLi4zXSwgYW5kIHRvcCByaWdodCBpcyB0b3BbNC4uN10KK3N0YXRpYyB2b2lkIEludHJhNFByZWRzKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDNChJNERDNCArIGRzdCwgdG9wKTsKKyAgVE00KEk0VE00ICsgZHN0LCB0b3ApOworICBWRTQoSTRWRTQgKyBkc3QsIHRvcCk7CisgIEhFNChJNEhFNCArIGRzdCwgdG9wKTsKKyAgUkQ0KEk0UkQ0ICsgZHN0LCB0b3ApOworICBWUjQoSTRWUjQgKyBkc3QsIHRvcCk7CisgIExENChJNExENCArIGRzdCwgdG9wKTsKKyAgVkw0KEk0Vkw0ICsgZHN0LCB0b3ApOworICBIRDQoSTRIRDQgKyBkc3QsIHRvcCk7CisgIEhVNChJNEhVNCArIGRzdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYSA4eDggcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjIpCisKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHModWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgLy8gVSBibG9jaworICBEQzh1dk1vZGUoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZChDOFZFOCArIGRzdCwgdG9wLCA4KTsKKyAgSG9yaXpvbnRhbFByZWQoQzhIRTggKyBkc3QsIGxlZnQsIDgpOworICBUcnVlTW90aW9uKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOworICAvLyBWIGJsb2NrCisgIGRzdCArPSA4OworICBpZiAodG9wICE9IE5VTEwpIHRvcCArPSA4OworICBpZiAobGVmdCAhPSBOVUxMKSBsZWZ0ICs9IDE2OworICBEQzh1dk1vZGUoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZChDOFZFOCArIGRzdCwgdG9wLCA4KTsKKyAgSG9yaXpvbnRhbFByZWQoQzhIRTggKyBkc3QsIGxlZnQsIDgpOworICBUcnVlTW90aW9uKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbHVtYSAxNngxNiBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMykKKworc3RhdGljIHZvaWQgSW50cmExNlByZWRzKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREMxNk1vZGUoSTE2REMxNiArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkKEkxNlZFMTYgKyBkc3QsIHRvcCwgMTYpOworICBIb3Jpem9udGFsUHJlZChJMTZIRTE2ICsgZHN0LCBsZWZ0LCAxNik7CisgIFRydWVNb3Rpb24oSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wLCAxNik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRyaWMKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3VidHJhY3RBbmRBY2N1bXVsYXRlKGNvbnN0IF9fbTEyOGkgYSwgY29uc3QgX19tMTI4aSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHN1bSkgeworICAvLyB0YWtlIGFicyhhLWIpIGluIDhiCisgIGNvbnN0IF9fbTEyOGkgYV9iID0gX21tX3N1YnNfZXB1OChhLCBiKTsKKyAgY29uc3QgX19tMTI4aSBiX2EgPSBfbW1fc3Vic19lcHU4KGIsIGEpOworICBjb25zdCBfX20xMjhpIGFic19hX2IgPSBfbW1fb3Jfc2kxMjgoYV9iLCBiX2EpOworICAvLyB6ZXJvLWV4dGVuZCB0byAxNmIKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KGFic19hX2IsIHplcm8pOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTgoYWJzX2FfYiwgemVybyk7CisgIC8vIG11bHRpcGx5IHdpdGggc2VsZgorICBjb25zdCBfX20xMjhpIHN1bTEgPSBfbW1fbWFkZF9lcGkxNihDMCwgQzApOworICBjb25zdCBfX20xMjhpIHN1bTIgPSBfbW1fbWFkZF9lcGkxNihDMSwgQzEpOworICAqc3VtID0gX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBTU0VfMTZ4Tihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BhaXJzKSB7CisgIF9fbTEyOGkgc3VtID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgaW50MzJfdCB0bXBbNF07CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGFpcnM7ICsraSkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDFdKTsKKyAgICBfX20xMjhpIHN1bTEsIHN1bTI7CisgICAgU3VidHJhY3RBbmRBY2N1bXVsYXRlKGEwLCBiMCwgJnN1bTEpOworICAgIFN1YnRyYWN0QW5kQWNjdW11bGF0ZShhMSwgYjEsICZzdW0yKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKSk7CisgICAgYSArPSAyICogQlBTOworICAgIGIgKz0gMiAqIEJQUzsKKyAgfQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKK30KKworc3RhdGljIGludCBTU0UxNngxNihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHJldHVybiBTU0VfMTZ4TihhLCBiLCA4KTsKK30KKworc3RhdGljIGludCBTU0UxNng4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIFNTRV8xNnhOKGEsIGIsIDQpOworfQorCisjZGVmaW5lIExPQURfOHgxNmIocHRyKSBcCisgIF9tbV91bnBhY2tsb19lcGk4KF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHB0cikpLCB6ZXJvKQorCitzdGF0aWMgaW50IFNTRTh4OChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGludCBudW1fcGFpcnMgPSA0OworICBfX20xMjhpIHN1bSA9IHplcm87CisgIGludDMyX3QgdG1wWzRdOworICB3aGlsZSAobnVtX3BhaXJzLS0gPiAwKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IExPQURfOHgxNmIoJmFbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBMT0FEXzh4MTZiKCZhW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gTE9BRF84eDE2YigmYltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IExPQURfOHgxNmIoJmJbQlBTICogMV0pOworICAgIC8vIHN1YnRyYWN0CisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9zdWJzX2VwaTE2KGEwLCBiMCk7CisgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9zdWJzX2VwaTE2KGExLCBiMSk7CisgICAgLy8gbXVsdGlwbHkvYWNjdW11bGF0ZSB3aXRoIHNlbGYKKyAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX21hZGRfZXBpMTYoYzAsIGMwKTsKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX21hZGRfZXBpMTYoYzEsIGMxKTsKKyAgICAvLyBjb2xsZWN0CisgICAgY29uc3QgX19tMTI4aSBzdW0wMSA9IF9tbV9hZGRfZXBpMzIoZDAsIGQxKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgc3VtMDEpOworICAgIGEgKz0gMiAqIEJQUzsKKyAgICBiICs9IDIgKiBCUFM7CisgIH0KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICByZXR1cm4gKHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXSk7Cit9CisjdW5kZWYgTE9BRF84eDE2YgorCitzdGF0aWMgaW50IFNTRTR4NChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisKKyAgLy8gTG9hZCB2YWx1ZXMuIE5vdGUgdGhhdCB3ZSByZWFkIDggcGl4ZWxzIGluc3RlYWQgb2YgNCwKKyAgLy8gYnV0IHRoZSBhL2IgYnVmZmVycyBhcmUgb3Zlci1hbGxvY2F0ZWQgdG8gdGhhdCBlZmZlY3QuCisgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKKyAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMV0pOworICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAyXSk7CisgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDNdKTsKKyAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMF0pOworICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAxXSk7CisgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDJdKTsKKyAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogM10pOworICAvLyBDb21iaW5lIHBhaXIgb2YgbGluZXMuCisgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX3VucGFja2xvX2VwaTMyKGEwLCBhMSk7CisgIGNvbnN0IF9fbTEyOGkgYTIzID0gX21tX3VucGFja2xvX2VwaTMyKGEyLCBhMyk7CisgIGNvbnN0IF9fbTEyOGkgYjAxID0gX21tX3VucGFja2xvX2VwaTMyKGIwLCBiMSk7CisgIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTMyKGIyLCBiMyk7CisgIC8vIENvbnZlcnQgdG8gMTZiLgorICBjb25zdCBfX20xMjhpIGEwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChhMDEsIHplcm8pOworICBjb25zdCBfX20xMjhpIGEyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChhMjMsIHplcm8pOworICBjb25zdCBfX20xMjhpIGIwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChiMDEsIHplcm8pOworICBjb25zdCBfX20xMjhpIGIyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChiMjMsIHplcm8pOworICAvLyBzdWJ0cmFjdCwgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3Vic19lcGkxNihhMDFzLCBiMDFzKTsKKyAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9zdWJzX2VwaTE2KGEyM3MsIGIyM3MpOworICBjb25zdCBfX20xMjhpIGUwID0gX21tX21hZGRfZXBpMTYoZDAsIGQwKTsKKyAgY29uc3QgX19tMTI4aSBlMSA9IF9tbV9tYWRkX2VwaTE2KGQxLCBkMSk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkzMihlMCwgZTEpOworCisgIGludDMyX3QgdG1wWzRdOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHR1cmUgZGlzdG9ydGlvbgorLy8KKy8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAorLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgorCisvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KKy8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgorc3RhdGljIGludCBUVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludDMyX3Qgc3VtWzRdOworICBfX20xMjhpIHRtcF8wLCB0bXBfMSwgdG1wXzIsIHRtcF8zOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworCisgIC8vIExvYWQgYW5kIGNvbWJpbmUgaW5wdXRzLgorICB7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAyXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAzXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAyXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkJfMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluQltCUFMgKiAzXSk7CisKKyAgICAvLyBDb21iaW5lIGluQSBhbmQgaW5CICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuCisgICAgY29uc3QgX19tMTI4aSBpbkFCXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzAsIGluQl8wKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMSA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMSwgaW5CXzEpOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8yID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8yLCBpbkJfMik7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzMsIGluQl8zKTsKKyAgICB0bXBfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMCwgemVybyk7CisgICAgdG1wXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzEsIHplcm8pOworICAgIHRtcF8yID0gX21tX3VucGFja2xvX2VwaTgoaW5BQl8yLCB6ZXJvKTsKKyAgICB0bXBfMyA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMywgemVybyk7CisgICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisgIH0KKworICAvLyBWZXJ0aWNhbCBwYXNzIGZpcnN0IHRvIGF2b2lkIGEgdHJhbnNwb3NlICh2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwYXNzZXMKKyAgLy8gYXJlIGNvbW11dGF0aXZlIGJlY2F1c2Ugdy9rV2VpZ2h0WSBpcyBzeW1tZXRyaWMpIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZiMCwgJmIxLCAmYjIsICZiMywgJnRtcF8wLCAmdG1wXzEsICZ0bXBfMiwgJnRtcF8zKTsKKyAgfQorCisgIC8vIEhvcml6b250YWwgcGFzcyBhbmQgZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zLgorICB7CisgICAgLy8gTG9hZCBhbGwgaW5wdXRzLgorICAgIGNvbnN0IF9fbTEyOGkgd18wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmd1swXSk7CisgICAgY29uc3QgX19tMTI4aSB3XzggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzhdKTsKKworICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgorICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKKworICAgIC8vIFNlcGFyYXRlIHRoZSB0cmFuc2Zvcm1zIG9mIGluQSBhbmQgaW5CLgorICAgIF9fbTEyOGkgQV9iMCA9IF9tbV91bnBhY2tsb19lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQV9iMiA9IF9tbV91bnBhY2tsb19lcGk2NChiMiwgYjMpOworICAgIF9fbTEyOGkgQl9iMCA9IF9tbV91bnBhY2toaV9lcGk2NChiMCwgYjEpOworICAgIF9fbTEyOGkgQl9iMiA9IF9tbV91bnBhY2toaV9lcGk2NChiMiwgYjMpOworCisgICAgeworICAgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJfZXBpMTYoemVybywgQV9iMCk7CisgICAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBBX2IyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fc3ViX2VwaTE2KHplcm8sIEJfYjApOworICAgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9zdWJfZXBpMTYoemVybywgQl9iMik7CisgICAgICBBX2IwID0gX21tX21heF9lcGkxNihBX2IwLCBkMCk7ICAgLy8gYWJzKHYpLCAxNmIKKyAgICAgIEFfYjIgPSBfbW1fbWF4X2VwaTE2KEFfYjIsIGQxKTsKKyAgICAgIEJfYjAgPSBfbW1fbWF4X2VwaTE2KEJfYjAsIGQyKTsKKyAgICAgIEJfYjIgPSBfbW1fbWF4X2VwaTE2KEJfYjIsIGQzKTsKKyAgICB9CisKKyAgICAvLyB3ZWlnaHRlZCBzdW1zCisgICAgQV9iMCA9IF9tbV9tYWRkX2VwaTE2KEFfYjAsIHdfMCk7CisgICAgQV9iMiA9IF9tbV9tYWRkX2VwaTE2KEFfYjIsIHdfOCk7CisgICAgQl9iMCA9IF9tbV9tYWRkX2VwaTE2KEJfYjAsIHdfMCk7CisgICAgQl9iMiA9IF9tbV9tYWRkX2VwaTE2KEJfYjIsIHdfOCk7CisgICAgQV9iMCA9IF9tbV9hZGRfZXBpMzIoQV9iMCwgQV9iMik7CisgICAgQl9iMCA9IF9tbV9hZGRfZXBpMzIoQl9iMCwgQl9iMik7CisKKyAgICAvLyBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMKKyAgICBBX2IwID0gX21tX3N1Yl9lcGkzMihBX2IwLCBCX2IwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmc3VtWzBdLCBBX2IwKTsKKyAgfQorICByZXR1cm4gc3VtWzBdICsgc3VtWzFdICsgc3VtWzJdICsgc3VtWzNdOworfQorCitzdGF0aWMgaW50IERpc3RvNHg0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGNvbnN0IGludCBkaWZmX3N1bSA9IFRUcmFuc2Zvcm0oYSwgYiwgdyk7CisgIHJldHVybiBhYnMoZGlmZl9zdW0pID4+IDU7Cit9CisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDQoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorLy8KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBEb1F1YW50aXplQmxvY2soaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfMjA0NyA9IF9tbV9zZXQxX2VwaTE2KE1BWF9MRVZFTCk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgY29lZmYwLCBjb2VmZjg7CisgIF9fbTEyOGkgb3V0MCwgb3V0ODsKKyAgX19tMTI4aSBwYWNrZWRfb3V0OworCisgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSk7CisgIF9fbTEyOGkgaW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bOF0pOworICBjb25zdCBfX20xMjhpIGlxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBpcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1s4XSk7CisgIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bOF0pOworCisgIC8vIGV4dHJhY3Qgc2lnbihpbikgICgweDAwMDAgaWYgcG9zaXRpdmUsIDB4ZmZmZiBpZiBuZWdhdGl2ZSkKKyAgY29uc3QgX19tMTI4aSBzaWduMCA9IF9tbV9jbXBndF9lcGkxNih6ZXJvLCBpbjApOworICBjb25zdCBfX20xMjhpIHNpZ244ID0gX21tX2NtcGd0X2VwaTE2KHplcm8sIGluOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pID0gKGluIF4gc2lnbikgLSBzaWduCisgIGNvZWZmMCA9IF9tbV94b3Jfc2kxMjgoaW4wLCBzaWduMCk7CisgIGNvZWZmOCA9IF9tbV94b3Jfc2kxMjgoaW44LCBzaWduOCk7CisgIGNvZWZmMCA9IF9tbV9zdWJfZXBpMTYoY29lZmYwLCBzaWduMCk7CisgIGNvZWZmOCA9IF9tbV9zdWJfZXBpMTYoY29lZmY4LCBzaWduOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pICsgc2hhcnBlbgorICBpZiAoc2hhcnBlbiAhPSBOVUxMKSB7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzhdKTsKKyAgICBjb2VmZjAgPSBfbW1fYWRkX2VwaTE2KGNvZWZmMCwgc2hhcnBlbjApOworICAgIGNvZWZmOCA9IF9tbV9hZGRfZXBpMTYoY29lZmY4LCBzaGFycGVuOCk7CisgIH0KKworICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVgKKyAgeworICAgIC8vIGRvaW5nIGNhbGN1bGF0aW9ucyB3aXRoIDMyYiBwcmVjaXNpb24gKFFGSVg9MTcpCisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEpCisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBIID0gX21tX211bGhpX2VwdTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4SCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjgsIGlxOCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThMID0gX21tX211bGxvX2VwaTE2KGNvZWZmOCwgaXE4KTsKKyAgICBfX20xMjhpIG91dF8wMCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wNCA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wOCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICBfX20xMjhpIG91dF8xMiA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCisgICAgY29uc3QgX19tMTI4aSBiaWFzXzAwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1swXSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA0ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s0XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1sxMl0pOworICAgIG91dF8wMCA9IF9tbV9hZGRfZXBpMzIob3V0XzAwLCBiaWFzXzAwKTsKKyAgICBvdXRfMDQgPSBfbW1fYWRkX2VwaTMyKG91dF8wNCwgYmlhc18wNCk7CisgICAgb3V0XzA4ID0gX21tX2FkZF9lcGkzMihvdXRfMDgsIGJpYXNfMDgpOworICAgIG91dF8xMiA9IF9tbV9hZGRfZXBpMzIob3V0XzEyLCBiaWFzXzEyKTsKKyAgICAvLyBvdXQgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIsIFFGSVgpCisgICAgb3V0XzAwID0gX21tX3NyYWlfZXBpMzIob3V0XzAwLCBRRklYKTsKKyAgICBvdXRfMDQgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDQsIFFGSVgpOworICAgIG91dF8wOCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wOCwgUUZJWCk7CisgICAgb3V0XzEyID0gX21tX3NyYWlfZXBpMzIob3V0XzEyLCBRRklYKTsKKworICAgIC8vIHBhY2sgcmVzdWx0IGFzIDE2YgorICAgIG91dDAgPSBfbW1fcGFja3NfZXBpMzIob3V0XzAwLCBvdXRfMDQpOworICAgIG91dDggPSBfbW1fcGFja3NfZXBpMzIob3V0XzA4LCBvdXRfMTIpOworCisgICAgLy8gaWYgKGNvZWZmID4gMjA0NykgY29lZmYgPSAyMDQ3CisgICAgb3V0MCA9IF9tbV9taW5fZXBpMTYob3V0MCwgbWF4X2NvZWZmXzIwNDcpOworICAgIG91dDggPSBfbW1fbWluX2VwaTE2KG91dDgsIG1heF9jb2VmZl8yMDQ3KTsKKyAgfQorCisgIC8vIGdldCBzaWduIGJhY2sgKGlmIChzaWduW2pdKSBvdXRfbiA9IC1vdXRfbikKKyAgb3V0MCA9IF9tbV94b3Jfc2kxMjgob3V0MCwgc2lnbjApOworICBvdXQ4ID0gX21tX3hvcl9zaTEyOChvdXQ4LCBzaWduOCk7CisgIG91dDAgPSBfbW1fc3ViX2VwaTE2KG91dDAsIHNpZ24wKTsKKyAgb3V0OCA9IF9tbV9zdWJfZXBpMTYob3V0OCwgc2lnbjgpOworCisgIC8vIGluID0gb3V0ICogUQorICBpbjAgPSBfbW1fbXVsbG9fZXBpMTYob3V0MCwgcTApOworICBpbjggPSBfbW1fbXVsbG9fZXBpMTYob3V0OCwgcTgpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSwgaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzhdLCBpbjgpOworCisgIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LgorICAvLworICAvLyBUaGUgemlnemFnIHBhdHRlcm4gY2FuIGFsbW9zdCBiZSByZXByb2R1Y2VkIHdpdGggYSBzbWFsbCBzZXF1ZW5jZSBvZgorICAvLyBzaHVmZmxlcy4gQWZ0ZXIgaXQsIHdlIG9ubHkgbmVlZCB0byBzd2FwIHRoZSA3dGggKGVuZGluZyB1cCBpbiB0aGlyZAorICAvLyBwb3NpdGlvbiBpbnN0ZWFkIG9mIHR3ZWxmdGgpIGFuZCA4dGggdmFsdWVzLgorICB7CisgICAgX19tMTI4aSBvdXRaMCwgb3V0Wjg7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dDAsICBfTU1fU0hVRkZMRSgyLCAxLCAzLCAwKSk7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7CisgICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAwLCAyKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dDgsICBfTU1fU0hVRkZMRSgzLCAwLCAyLCAxKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFo4LCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7CisgICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dFo4LCBfTU1fU0hVRkZMRSgxLCAzLCAyLCAwKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0WjApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIG91dFo4KTsKKyAgICBwYWNrZWRfb3V0ID0gX21tX3BhY2tzX2VwaTE2KG91dFowLCBvdXRaOCk7CisgIH0KKyAgeworICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8xMiA9IG91dFsxMl07CisgICAgY29uc3QgaW50MTZfdCBvdXRaXzMgPSBvdXRbM107CisgICAgb3V0WzNdID0gb3V0Wl8xMjsKKyAgICBvdXRbMTJdID0gb3V0Wl8zOworICB9CisKKyAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKKyAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChwYWNrZWRfb3V0LCB6ZXJvKSkgIT0gMHhmZmZmKTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9jayhpbiwgb3V0LCAmbXR4LT5zaGFycGVuX1swXSwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrV0hUKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9jayhpbiwgb3V0LCBOVUxMLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2NrcyhpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBueiAgPSBEb1F1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAwOworICBueiB8PSBEb1F1YW50aXplQmxvY2soaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW07CisgIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHM7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkczsKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHM7CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3M7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrV0hUOworICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybTsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm07CisgIFZQOEZUcmFuc2Zvcm0yID0gRlRyYW5zZm9ybTI7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUOworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2OworICBWUDhTU0UxNng4ID0gU1NFMTZ4ODsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4OworICBWUDhTU0U0eDQgPSBTU0U0eDQ7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0OworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTY7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19zc2U0MS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2VuY19zc2U0MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTlmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZW5jX3NzZTQxLmMKQEAgLTAsMCArMSwzMzkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0IHZlcnNpb24gb2Ygc29tZSBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zLgorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmX3RocmVzaCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9DT0VGRl9USFJFU0gpOworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBpbnQgazsKKworICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisKKyAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4gKHdpdGhpbiBvdXRbXSkuCisgICAgeworICAgICAgLy8gTG9hZC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFswXSk7CisgICAgICBjb25zdCBfX20xMjhpIG91dDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0pOworICAgICAgLy8gdiA9IGFicyhvdXQpID4+IDMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMCA9IF9tbV9hYnNfZXBpMTYob3V0MCk7CisgICAgICBjb25zdCBfX20xMjhpIGFiczEgPSBfbW1fYWJzX2VwaTE2KG91dDEpOworICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9zcmFpX2VwaTE2KGFiczAsIDMpOworICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV9zcmFpX2VwaTE2KGFiczEsIDMpOworICAgICAgLy8gYmluID0gbWluKHYsIE1BWF9DT0VGRl9USFJFU0gpCisgICAgICBjb25zdCBfX20xMjhpIGJpbjAgPSBfbW1fbWluX2VwaTE2KHYwLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmluMSA9IF9tbV9taW5fZXBpMTYodjEsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgLy8gU3RvcmUuCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBiaW4wKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGJpbjEpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgICAgKytkaXN0cmlidXRpb25bb3V0W2tdXTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHR1cmUgZGlzdG9ydGlvbgorLy8KKy8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAorLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgorCisvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KKy8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgorc3RhdGljIGludCBUVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludDMyX3Qgc3VtWzRdOworICBfX20xMjhpIHRtcF8wLCB0bXBfMSwgdG1wXzIsIHRtcF8zOworCisgIC8vIExvYWQgYW5kIGNvbWJpbmUgaW5wdXRzLgorICB7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAwXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFfMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluQVtCUFMgKiAyXSk7CisgICAgLy8gSW4gU1NFNC4xLCB3aXRoIGdjYyA0LjggYXQgbGVhc3QgKG1heWJlIG90aGVyIHZlcnNpb25zKSwKKyAgICAvLyBfbW1fbG9hZHVfc2kxMjggaXMgZmFzdGVyIHRoYW4gX21tX2xvYWRsX2VwaTY0LiBCdXQgZm9yIHRoZSBsYXN0IGx1bXAKKyAgICAvLyBvZiBpbkEgYW5kIGluQiwgX21tX2xvYWRsX2VwaTY0IGlzIHN0aWxsIHVzZWQgbm90IHRvIGhhdmUgYW4gb3V0IG9mCisgICAgLy8gYm91bmQgcmVhZC4KKyAgICBjb25zdCBfX20xMjhpIGluQV8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDNdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8xID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8yID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDJdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQl8zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5CW0JQUyAqIDNdKTsKKworICAgIC8vIENvbWJpbmUgaW5BIGFuZCBpbkIgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4KKyAgICBjb25zdCBfX20xMjhpIGluQUJfMCA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMCwgaW5CXzApOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8xID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8xLCBpbkJfMSk7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzIsIGluQl8yKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMyA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMywgaW5CXzMpOworICAgIHRtcF8wID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8wKTsKKyAgICB0bXBfMSA9IF9tbV9jdnRlcHU4X2VwaTE2KGluQUJfMSk7CisgICAgdG1wXzIgPSBfbW1fY3Z0ZXB1OF9lcGkxNihpbkFCXzIpOworICAgIHRtcF8zID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8zKTsKKyAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKKyAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKKyAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgZmlyc3QgdG8gYXZvaWQgYSB0cmFuc3Bvc2UgKHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcworICAvLyBhcmUgY29tbXV0YXRpdmUgYmVjYXVzZSB3L2tXZWlnaHRZIGlzIHN5bW1ldHJpYykgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJmIwLCAmYjEsICZiMiwgJmIzLCAmdG1wXzAsICZ0bXBfMSwgJnRtcF8yLCAmdG1wXzMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBkaWZmZXJlbmNlIG9mIHdlaWdodGVkIHN1bXMuCisgIHsKKyAgICAvLyBMb2FkIGFsbCBpbnB1dHMuCisgICAgY29uc3QgX19tMTI4aSB3XzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ3WzBdKTsKKyAgICBjb25zdCBfX20xMjhpIHdfOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJndbOF0pOworCisgICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7CisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOworCisgICAgLy8gU2VwYXJhdGUgdGhlIHRyYW5zZm9ybXMgb2YgaW5BIGFuZCBpbkIuCisgICAgX19tMTI4aSBBX2IwID0gX21tX3VucGFja2xvX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBBX2IyID0gX21tX3VucGFja2xvX2VwaTY0KGIyLCBiMyk7CisgICAgX19tMTI4aSBCX2IwID0gX21tX3VucGFja2hpX2VwaTY0KGIwLCBiMSk7CisgICAgX19tMTI4aSBCX2IyID0gX21tX3VucGFja2hpX2VwaTY0KGIyLCBiMyk7CisKKyAgICBBX2IwID0gX21tX2Fic19lcGkxNihBX2IwKTsKKyAgICBBX2IyID0gX21tX2Fic19lcGkxNihBX2IyKTsKKyAgICBCX2IwID0gX21tX2Fic19lcGkxNihCX2IwKTsKKyAgICBCX2IyID0gX21tX2Fic19lcGkxNihCX2IyKTsKKworICAgIC8vIHdlaWdodGVkIHN1bXMKKyAgICBBX2IwID0gX21tX21hZGRfZXBpMTYoQV9iMCwgd18wKTsKKyAgICBBX2IyID0gX21tX21hZGRfZXBpMTYoQV9iMiwgd184KTsKKyAgICBCX2IwID0gX21tX21hZGRfZXBpMTYoQl9iMCwgd18wKTsKKyAgICBCX2IyID0gX21tX21hZGRfZXBpMTYoQl9iMiwgd184KTsKKyAgICBBX2IwID0gX21tX2FkZF9lcGkzMihBX2IwLCBBX2IyKTsKKyAgICBCX2IwID0gX21tX2FkZF9lcGkzMihCX2IwLCBCX2IyKTsKKworICAgIC8vIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3VtcworICAgIEFfYjIgPSBfbW1fc3ViX2VwaTMyKEFfYjAsIEJfYjApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZzdW1bMF0sIEFfYjIpOworICB9CisgIHJldHVybiBzdW1bMF0gKyBzdW1bMV0gKyBzdW1bMl0gKyBzdW1bM107Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDQoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgY29uc3QgaW50IGRpZmZfc3VtID0gVFRyYW5zZm9ybShhLCBiLCB3KTsKKyAgcmV0dXJuIGFicyhkaWZmX3N1bSkgPj4gNTsKK30KKworc3RhdGljIGludCBEaXN0bzE2eDE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NChhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemF0aW9uCisvLworCisvLyBHZW5lcmF0ZXMgYSBwc2h1ZmIgY29uc3RhbnQgZm9yIHNodWZmbGluZyAxNmIgd29yZHMuCisjZGVmaW5lIFBTSFVGQl9DU1QoQSxCLEMsRCxFLEYsRyxIKSBcCisgIF9tbV9zZXRfZXBpOCgyICogKEgpICsgMSwgMiAqIChIKSArIDAsIDIgKiAoRykgKyAxLCAyICogKEcpICsgMCwgXAorICAgICAgICAgICAgICAgMiAqIChGKSArIDEsIDIgKiAoRikgKyAwLCAyICogKEUpICsgMSwgMiAqIChFKSArIDAsIFwKKyAgICAgICAgICAgICAgIDIgKiAoRCkgKyAxLCAyICogKEQpICsgMCwgMiAqIChDKSArIDEsIDIgKiAoQykgKyAwLCBcCisgICAgICAgICAgICAgICAyICogKEIpICsgMSwgMiAqIChCKSArIDAsIDIgKiAoQSkgKyAxLCAyICogKEEpICsgMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBEb1F1YW50aXplQmxvY2soaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfMjA0NyA9IF9tbV9zZXQxX2VwaTE2KE1BWF9MRVZFTCk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIF9fbTEyOGkgb3V0MCwgb3V0ODsKKyAgX19tMTI4aSBwYWNrZWRfb3V0OworCisgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSk7CisgIF9fbTEyOGkgaW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bOF0pOworICBjb25zdCBfX20xMjhpIGlxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBpcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1s4XSk7CisgIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKKyAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bOF0pOworCisgIC8vIGNvZWZmID0gYWJzKGluKQorICBfX20xMjhpIGNvZWZmMCA9IF9tbV9hYnNfZXBpMTYoaW4wKTsKKyAgX19tMTI4aSBjb2VmZjggPSBfbW1fYWJzX2VwaTE2KGluOCk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pICsgc2hhcnBlbgorICBpZiAoc2hhcnBlbiAhPSBOVUxMKSB7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzhdKTsKKyAgICBjb2VmZjAgPSBfbW1fYWRkX2VwaTE2KGNvZWZmMCwgc2hhcnBlbjApOworICAgIGNvZWZmOCA9IF9tbV9hZGRfZXBpMTYoY29lZmY4LCBzaGFycGVuOCk7CisgIH0KKworICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVgKKyAgeworICAgIC8vIGRvaW5nIGNhbGN1bGF0aW9ucyB3aXRoIDMyYiBwcmVjaXNpb24gKFFGSVg9MTcpCisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEpCisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBIID0gX21tX211bGhpX2VwdTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4SCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjgsIGlxOCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThMID0gX21tX211bGxvX2VwaTE2KGNvZWZmOCwgaXE4KTsKKyAgICBfX20xMjhpIG91dF8wMCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wNCA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUTBMLCBjb2VmZl9pUTBIKTsKKyAgICBfX20xMjhpIG91dF8wOCA9IF9tbV91bnBhY2tsb19lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICBfX20xMjhpIG91dF8xMiA9IF9tbV91bnBhY2toaV9lcGkxNihjb2VmZl9pUThMLCBjb2VmZl9pUThIKTsKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCisgICAgY29uc3QgX19tMTI4aSBiaWFzXzAwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1swXSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA0ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s0XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzA4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7CisgICAgY29uc3QgX19tMTI4aSBiaWFzXzEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5iaWFzX1sxMl0pOworICAgIG91dF8wMCA9IF9tbV9hZGRfZXBpMzIob3V0XzAwLCBiaWFzXzAwKTsKKyAgICBvdXRfMDQgPSBfbW1fYWRkX2VwaTMyKG91dF8wNCwgYmlhc18wNCk7CisgICAgb3V0XzA4ID0gX21tX2FkZF9lcGkzMihvdXRfMDgsIGJpYXNfMDgpOworICAgIG91dF8xMiA9IF9tbV9hZGRfZXBpMzIob3V0XzEyLCBiaWFzXzEyKTsKKyAgICAvLyBvdXQgPSBRVUFOVERJVihjb2VmZiwgaVEsIEIsIFFGSVgpCisgICAgb3V0XzAwID0gX21tX3NyYWlfZXBpMzIob3V0XzAwLCBRRklYKTsKKyAgICBvdXRfMDQgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDQsIFFGSVgpOworICAgIG91dF8wOCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wOCwgUUZJWCk7CisgICAgb3V0XzEyID0gX21tX3NyYWlfZXBpMzIob3V0XzEyLCBRRklYKTsKKworICAgIC8vIHBhY2sgcmVzdWx0IGFzIDE2YgorICAgIG91dDAgPSBfbW1fcGFja3NfZXBpMzIob3V0XzAwLCBvdXRfMDQpOworICAgIG91dDggPSBfbW1fcGFja3NfZXBpMzIob3V0XzA4LCBvdXRfMTIpOworCisgICAgLy8gaWYgKGNvZWZmID4gMjA0NykgY29lZmYgPSAyMDQ3CisgICAgb3V0MCA9IF9tbV9taW5fZXBpMTYob3V0MCwgbWF4X2NvZWZmXzIwNDcpOworICAgIG91dDggPSBfbW1fbWluX2VwaTE2KG91dDgsIG1heF9jb2VmZl8yMDQ3KTsKKyAgfQorCisgIC8vIHB1dCBzaWduIGJhY2sKKyAgb3V0MCA9IF9tbV9zaWduX2VwaTE2KG91dDAsIGluMCk7CisgIG91dDggPSBfbW1fc2lnbl9lcGkxNihvdXQ4LCBpbjgpOworCisgIC8vIGluID0gb3V0ICogUQorICBpbjAgPSBfbW1fbXVsbG9fZXBpMTYob3V0MCwgcTApOworICBpbjggPSBfbW1fbXVsbG9fZXBpMTYob3V0OCwgcTgpOworCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpblswXSwgaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzhdLCBpbjgpOworCisgIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LiBUaGUgcmUtb3JkZXJpbmcgaXM6CisgIC8vICAgIDAgMSAyIDMgNCA1IDYgNyB8IDggIDkgMTAgMTEgMTIgMTMgMTQgMTUKKyAgLy8gLT4gMCAxIDRbOF01IDIgMyA2IHwgOSAxMiAxMyAxMCBbN10xMSAxNCAxNQorICAvLyBUaGVyZSdzIG9ubHkgdHdvIG1pc3BsYWNlZCBlbnRyaWVzIChbOF0gYW5kIFs3XSkgdGhhdCBhcmUgY3Jvc3NpbmcgdGhlCisgIC8vIHJlZydzIGJvdW5kYXJpZXMuCisgIC8vIFdlIHVzZSBwc2h1ZmIgaW5zdGVhZCBvZiBwc2h1ZmxvL3BzaHVmaGkuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfbG8gPSBQU0hVRkJfQ1NUKDAsIDEsIDQsIC0xLCA1LCAyLCAzLCA2KTsKKyAgICBjb25zdCBfX20xMjhpIGtDc3RfNyA9IFBTSFVGQl9DU1QoLTEsIC0xLCAtMSwgLTEsIDcsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wX2xvID0gX21tX3NodWZmbGVfZXBpOChvdXQwLCBrQ3N0X2xvKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF83ID0gX21tX3NodWZmbGVfZXBpOChvdXQwLCBrQ3N0XzcpOyAgLy8gZXh0cmFjdCAjNworICAgIGNvbnN0IF9fbTEyOGkga0NzdF9oaSA9IFBTSFVGQl9DU1QoMSwgNCwgNSwgMiwgLTEsIDMsIDYsIDcpOworICAgIGNvbnN0IF9fbTEyOGkga0NzdF84ID0gUFNIVUZCX0NTVCgtMSwgLTEsIC0xLCAwLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSB0bXBfaGkgPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDgsIGtDc3RfaGkpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wXzggPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDgsIGtDc3RfOCk7ICAvLyBleHRyYWN0ICM4CisgICAgY29uc3QgX19tMTI4aSBvdXRfejAgPSBfbW1fb3Jfc2kxMjgodG1wX2xvLCB0bXBfOCk7CisgICAgY29uc3QgX19tMTI4aSBvdXRfejggPSBfbW1fb3Jfc2kxMjgodG1wX2hpLCB0bXBfNyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0X3owKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBvdXRfejgpOworICAgIHBhY2tlZF9vdXQgPSBfbW1fcGFja3NfZXBpMTYob3V0X3owLCBvdXRfejgpOworICB9CisKKyAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKKyAgcmV0dXJuIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChwYWNrZWRfb3V0LCB6ZXJvKSkgIT0gMHhmZmZmKTsKK30KKworI3VuZGVmIFBTSFVGQl9DU1QKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9jayhpbiwgb3V0LCAmbXR4LT5zaGFycGVuX1swXSwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrV0hUKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgcmV0dXJuIERvUXVhbnRpemVCbG9jayhpbiwgb3V0LCBOVUxMLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2NrcyhpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBjb25zdCB1aW50MTZfdCogY29uc3Qgc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBueiAgPSBEb1F1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAwOworICBueiB8PSBEb1F1YW50aXplQmxvY2soaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFNDEodm9pZCk7CitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTQxKHZvaWQpIHsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW07CisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3M7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrV0hUOworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NDsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0U1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9maWx0ZXJzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDkwZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZmlsdGVycy5jCkBAIC0wLDAgKzEsMjYxIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BhdGlhbCBwcmVkaWN0aW9uIHVzaW5nIHZhcmlvdXMgZmlsdGVycworLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyby4KKworIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGluICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChvdXQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQocm93ID49IDAgJiYgbnVtX3Jvd3MgPiAwICYmIHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpaGVpZ2h0OyAgLy8gU2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmUoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgaTsKKyAgaWYgKGludmVyc2UpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSArIHByZWRbaV07CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGludmVyc2UgPyBvdXQgOiBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZShpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgIHJvdyA9IDE7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUuCisgICAgUHJlZGljdExpbmUoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOworICAgIFByZWRpY3RMaW5lKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW52ZXJzZSA/IG91dCA6IGluOworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIFZlcnkgZmlyc3QgdG9wLWxlZnQgcGl4ZWwgaXMgY29waWVkLgorICAgIG91dFswXSA9IGluWzBdOworICAgIC8vIFJlc3Qgb2YgdG9wIHNjYW4tbGluZSBpcyBsZWZ0LXByZWRpY3RlZC4KKyAgICBQcmVkaWN0TGluZShpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgYXJlIHN0YXJ0aW5nIGZyb20gaW4tYmV0d2Vlbi4gTWFrZSBzdXJlICdwcmVkcycgcG9pbnRzIHRvIHByZXYgcm93LgorICAgIHByZWRzIC09IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIFByZWRpY3RMaW5lKGluLCBwcmVkcywgb3V0LCB3aWR0aCwgaW52ZXJzZSk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3IodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0dyYWRpZW50RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGludmVyc2UgPyBvdXQgOiBpbjsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmUoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIGludCB3OworICAgIC8vIGxlZnRtb3N0IHBpeGVsOiBwcmVkaWN0IGZyb20gYWJvdmUuCisgICAgUHJlZGljdExpbmUoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOworICAgIGZvciAodyA9IDE7IHcgPCB3aWR0aDsgKyt3KSB7CisgICAgICBjb25zdCBpbnQgcHJlZCA9IEdyYWRpZW50UHJlZGljdG9yKHByZWRzW3cgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHNbdyAtIHN0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRzW3cgLSBzdHJpZGUgLSAxXSk7CisgICAgICBvdXRbd10gPSBpblt3XSArIChpbnZlcnNlID8gcHJlZCA6IC1wcmVkKTsKKyAgICB9CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCAwLCBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCAwLCBmaWx0ZXJlZF9kYXRhKTsKK30KKworCitzdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvR3JhZGllbnRGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIDAsIGZpbHRlcmVkX2RhdGEpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICB1aW50OF90IHByZWQgPSAocHJldiA9PSBOVUxMKSA/IDAgOiBwcmV2WzBdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICBvdXRbaV0gPSBwcmVkICsgaW5baV07CisgICAgcHJlZCA9IG91dFtpXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gcHJldltpXSArIGluW2ldOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgdG9wID0gcHJldlswXSwgdG9wX2xlZnQgPSB0b3AsIGxlZnQgPSB0b3A7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIHRvcCA9IHByZXZbaV07ICAvLyBuZWVkIHRvIHJlYWQgdGhpcyBmaXJzdCwgaW4gY2FzZSBwcmV2PT1vdXQKKyAgICAgIGxlZnQgPSBpbltpXSArIEdyYWRpZW50UHJlZGljdG9yKGxlZnQsIHRvcCwgdG9wX2xlZnQpOworICAgICAgdG9wX2xlZnQgPSB0b3A7CisgICAgICBvdXRbaV0gPSBsZWZ0OworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdCBmdW5jdGlvbgorCitXZWJQRmlsdGVyRnVuYyBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKK1dlYlBVbmZpbHRlckZ1bmMgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdFNTRTIodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGZpbHRlcnNfbGFzdF9jcHVpbmZvX3VzZWQgPQorICAgIChWUDhDUFVJbmZvKSZmaWx0ZXJzX2xhc3RfY3B1aW5mb191c2VkOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXQodm9pZCkgeworICBpZiAoZmlsdGVyc19sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9OT05FXSA9IE5VTEw7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsVW5maWx0ZXI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxVbmZpbHRlcjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudFVuZmlsdGVyOworCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX05PTkVdID0gTlVMTDsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXI7CisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOEZpbHRlcnNJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgZmlsdGVyc19sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDdjY2U4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDM5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKKy8vCisvLyBBdXRob3Iocyk6IEJyYW5pbWlyIFZhc2ljIChicmFuaW1pci52YXNpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICIuLi9kc3AvZHNwLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3JvLgorCisjIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaW4gIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KG91dCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChyb3cgPj0gMCAmJiBudW1fcm93cyA+IDAgJiYgcm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsgICAgICAgICAgICAgICAgXAorICAodm9pZCloZWlnaHQ7ICAvLyBTaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorCisjZGVmaW5lIERPX1BSRURJQ1RfTElORShTUkMsIERTVCwgTEVOR1RILCBJTlZFUlNFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIHBzcmMgPSAodWludDhfdCopKFNSQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBwZHN0ID0gKHVpbnQ4X3QqKShEU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGlsZW5ndGggPSAoaW50KShMRU5HVEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzcmwgICAgICAgJVt0ZW1wMF0sICAgICVbbGVuZ3RoXSwgICAgMiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDBdLCAgICA0ZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhbmRpICAgICAlW3RlbXA2XSwgICAgJVtsZW5ndGhdLCAgICAzICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDNdLCAgICAxKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXA0XSwgICAgMiglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wNV0sICAgIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAzXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSwgICAgICVbdGVtcDVdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAxXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAgIDEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAyKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAgMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDJdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICA0ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidS5xYiAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICVbdGVtcDFdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVzdyAgICAgICAlW3RlbXAzXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDQgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDZdLCAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuaWYgIiAjSU5WRVJTRSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wNl0sICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksICAgICAgICAgXAorICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW2RzdF0iKyZyIihwZHN0KSwgW3NyY10iKyZyIihwc3JjKSAgICAgICAgICAgICAgICBcCisgICAgICA6IFtsZW5ndGhdInIiKGlsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICBET19QUkVESUNUX0xJTkUoc3JjLCBkc3QsIGxlbmd0aCwgMCk7Cit9CisKKyNkZWZpbmUgRE9fUFJFRElDVF9MSU5FX1ZFUlRJQ0FMKFNSQywgUFJFRCwgRFNULCBMRU5HVEgsIElOVkVSU0UpIGRvIHsgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCogcHNyYyA9ICh1aW50OF90KikoU1JDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIHBwcmVkID0gKHVpbnQ4X3QqKShQUkVEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBwZHN0ID0gKHVpbnQ4X3QqKShEU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGlsZW5ndGggPSAoaW50KShMRU5HVEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7ICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzcmwgICAgICAgJVt0ZW1wMF0sICAgICVbbGVuZ3RoXSwgICAgMHgzICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDBdLCAgICA0ZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhbmRpICAgICAlW3RlbXA3XSwgICAgJVtsZW5ndGhdLCAgICAweDcgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDFdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAyXSwgICAgMCglW3ByZWRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wM10sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDRdLCAgICA0KCVbcHJlZF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICA4ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdS5xYiAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUucWIgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10sICAgICAlW3RlbXA0XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidS5xYiAgICVbdGVtcDVdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUucWIgICAlW3RlbXA2XSwgICAgJVt0ZW1wM10sICAgICAlW3RlbXA0XSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbcHJlZF0sICAgICAlW3ByZWRdLCAgICAgIDggICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVzdyAgICAgICAlW3RlbXA1XSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1c3cgICAgICAgJVt0ZW1wNl0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgOCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJlcXogICAgICAlW3RlbXA3XSwgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtwcmVkXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3ByZWRdLCAgICAgJVtwcmVkXSwgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDddLCAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAxICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgICAgICAgICBcCisgICAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtwcmVkXSIrJnIiKHBwcmVkKSwgICAgICAgICAgXAorICAgICAgICBbZHN0XSIrJnIiKHBkc3QpLCBbc3JjXSIrJnIiKHBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW2xlbmd0aF0iciIoaWxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBQUkVESUNUX0xJTkVfT05FX1BBU1MoU1JDLCBQUkVELCBEU1QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAwKCVbc3JjXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgMCglW3ByZWRdKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAwKCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSAgICAgICAgICBcCisgICAgICA6IFtwcmVkXSJyIigoUFJFRCkpLCBbZHN0XSJyIigoRFNUKSksIFtzcmNdInIiKChTUkMpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworI2RlZmluZSBGSUxURVJfTElORV9CWV9MSU5FIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBQUkVESUNUX0xJTkVfT05FX1BBU1MoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRE9fUFJFRElDVF9MSU5FKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxLCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrcm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwcmVkcyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW4gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG91dCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZShpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICBGSUxURVJfTElORV9CWV9MSU5FOworfQorI3VuZGVmIEZJTFRFUl9MSU5FX0JZX0xJTkUKKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlci4KKworI2RlZmluZSBGSUxURVJfTElORV9CWV9MSU5FIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBET19QUkVESUNUX0xJTkVfVkVSVElDQUwoaW4sIHByZWRzLCBvdXQsIHdpZHRoLCAwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByZWRzICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbiArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3V0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLCB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmUoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgYXJlIHN0YXJ0aW5nIGZyb20gaW4tYmV0d2Vlbi4gTWFrZSBzdXJlICdwcmVkcycgcG9pbnRzIHRvIHByZXYgcm93LgorICAgIHByZWRzIC09IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIEZJTFRFUl9MSU5FX0JZX0xJTkU7Cit9CisjdW5kZWYgRklMVEVSX0xJTkVfQllfTElORQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvVmVydGljYWxGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yKHVpbnQ4X3QgYSwgdWludDhfdCBiLCB1aW50OF90IGMpIHsKKyAgaW50IHRlbXAwOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiYWRkdSAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW2FdLCAgICAgICAlW2JdICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICVbY10gICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgMjMgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAkemVybyAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgIDI0ICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApCisgICAgOiBbYV0iciIoYSksW2JdInIiKGIpLFtjXSJyIihjKQorICApOworICByZXR1cm4gdGVtcDA7Cit9CisKKyNkZWZpbmUgRklMVEVSX0xJTkVfQllfTElORShQUkVEUywgT1BFUkFUSU9OKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBSRURJQ1RfTElORV9PTkVfUEFTUyhpbiwgUFJFRFMgLSBzdHJpZGUsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKHcgPSAxOyB3IDwgd2lkdGg7ICsrdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgcHJlZCA9IEdyYWRpZW50UHJlZGljdG9yKFBSRURTW3cgLSAxXSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVEU1t3IC0gc3RyaWRlXSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRFNbdyAtIHN0cmlkZSAtIDFdKTsgICAgICAgICAgICAgXAorICAgICAgICBvdXRbd10gPSBpblt3XSBPUEVSQVRJT04gcHJlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW4gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG91dCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0dyYWRpZW50RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW47CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIEZJTFRFUl9MSU5FX0JZX0xJTkUoaW4sIC0pOworfQorI3VuZGVmIEZJTFRFUl9MSU5FX0JZX0xJTkUKKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7Cisgb3V0WzBdID0gaW5bMF0gKyAocHJldiA9PSBOVUxMID8gMCA6IHByZXZbMF0pOworIERPX1BSRURJQ1RfTElORShpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIERPX1BSRURJQ1RfTElORV9WRVJUSUNBTChpbiwgcHJldiwgb3V0LCB3aWR0aCwgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaWYgKHByZXYgPT0gTlVMTCkgeworICAgIEhvcml6b250YWxVbmZpbHRlcihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCB0b3AgPSBwcmV2WzBdLCB0b3BfbGVmdCA9IHRvcCwgbGVmdCA9IHRvcDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgdG9wID0gcHJldltpXTsgIC8vIG5lZWQgdG8gcmVhZCB0aGlzIGZpcnN0LCBpbiBjYXNlIHByZXY9PWRzdAorICAgICAgbGVmdCA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3IobGVmdCwgdG9wLCB0b3BfbGVmdCk7CisgICAgICB0b3BfbGVmdCA9IHRvcDsKKyAgICAgIG91dFtpXSA9IGxlZnQ7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBET19QUkVESUNUX0xJTkVfVkVSVElDQUwKKyN1bmRlZiBQUkVESUNUX0xJTkVfT05FX1BBU1MKKyN1bmRlZiBET19QUkVESUNUX0xJTkUKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIodm9pZCkgeworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbFVuZmlsdGVyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsVW5maWx0ZXI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRVbmZpbHRlcjsKKworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXI7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSA9IFZlcnRpY2FsRmlsdGVyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9maWx0ZXJzX3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9maWx0ZXJzX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTkzOWNlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2ZpbHRlcnNfc3NlMi5jCkBAIC0wLDAgKzEsMzMwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2YXJpYW50IG9mIGFscGhhIGZpbHRlcnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm8uCisKKyMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChpbiAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQob3V0ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHJvdyA+PSAwICYmIG51bV9yb3dzID4gMCAmJiByb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOyAgICAgICAgICAgICAgICBcCisgICh2b2lkKWhlaWdodDsgIC8vIFNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisKK3N0YXRpYyB2b2lkIFByZWRpY3RMaW5lVG9wKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+MzE7CisgIGFzc2VydChsZW5ndGggPj0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDMyKSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyY1tpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjW2kgKyAxNl0pOworICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmVkW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmVkW2kgKyAxNl0pOworICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fc3ViX2VwaTgoQTAsIEIwKTsKKyAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX3N1Yl9lcGk4KEExLCBCMSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDBdLCBDMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgMTZdLCBDMSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gcHJlZFtpXTsKK30KKworLy8gU3BlY2lhbCBjYXNlIGZvciBsZWZ0LWJhc2VkIHByZWRpY3Rpb24gKHdoZW4gcHJlZHM9PWRzdC0xIG9yIHByZWRzPT1zcmMtMSkuCitzdGF0aWMgdm9pZCBQcmVkaWN0TGluZUxlZnQoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBtYXhfcG9zID0gbGVuZ3RoICYgfjMxOworICBhc3NlcnQobGVuZ3RoID49IDApOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSAzMikgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgIDAgICAgKSk7CisgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAgMCAtIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDE2ICAgICkpOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMTYgLSAxKSk7CisgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9zdWJfZXBpOChBMCwgQjApOworICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fc3ViX2VwaTgoQTEsIEIxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaSArICAwKSwgQzApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBpICsgMTYpLCBDMSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldIC0gc3JjW2kgLSAxXTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcml6b250YWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0hvcml6b250YWxGaWx0ZXIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdChpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlLgorICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgUHJlZGljdExpbmVMZWZ0KGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmVydGljYWwgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmVMZWZ0KGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgUHJlZGljdExpbmVUb3AoaW4sIGluIC0gc3RyaWRlLCBvdXQsIHdpZHRoKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yQyh1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGNvbnN0IGludCBnID0gYSArIGIgLSBjOworICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdERpcmVjdChjb25zdCB1aW50OF90KiBjb25zdCByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IGxlbmd0aCkgeworICBjb25zdCBpbnQgbWF4X3BvcyA9IGxlbmd0aCAmIH43OworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyb3dbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcm93W2ldKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoQTAsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNrbG9fZXBpOChCMCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KEMwLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fYWRkX2VwaTE2KEExLCBCMSk7CisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX3N1Yl9lcGkxNihFLCBDMSk7CisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX3BhY2t1c19lcGkxNihGLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fc3ViX2VwaTgoRCwgRyk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKG91dCArIGkpLCBIKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgb3V0W2ldID0gcm93W2ldIC0gR3JhZGllbnRQcmVkaWN0b3JDKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9HcmFkaWVudEZpbHRlcihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdChpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgR3JhZGllbnRQcmVkaWN0RGlyZWN0KGluICsgMSwgaW4gKyAxIC0gc3RyaWRlLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9Ib3Jpem9udGFsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb1ZlcnRpY2FsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0dyYWRpZW50RmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LCBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludmVyc2UgdHJhbnNmb3JtcworCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIF9fbTEyOGkgbGFzdDsKKyAgb3V0WzBdID0gaW5bMF0gKyAocHJldiA9PSBOVUxMID8gMCA6IHByZXZbMF0pOworICBpZiAod2lkdGggPD0gMSkgcmV0dXJuOworICBsYXN0ID0gX21tX3NldF9lcGkzMigwLCAwLCAwLCBvdXRbMF0pOworICBmb3IgKGkgPSAxOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGluICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fYWRkX2VwaTgoQTAsIGxhc3QpOworICAgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc2xsaV9zaTEyOChBMSwgMSk7CisgICAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9hZGRfZXBpOChBMSwgQTIpOworICAgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fc2xsaV9zaTEyOChBMywgMik7CisgICAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9hZGRfZXBpOChBMywgQTQpOworICAgIGNvbnN0IF9fbTEyOGkgQTYgPSBfbW1fc2xsaV9zaTEyOChBNSwgNCk7CisgICAgY29uc3QgX19tMTI4aSBBNyA9IF9tbV9hZGRfZXBpOChBNSwgQTYpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShvdXQgKyBpKSwgQTcpOworICAgIGxhc3QgPSBfbW1fc3JsaV9lcGk2NChBNywgNTYpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBvdXRbaSAtIDFdOworfQorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbFVuZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQgbWF4X3BvcyA9IHdpZHRoICYgfjMxOworICAgIGFzc2VydCh3aWR0aCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSAzMikgeworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgKyAgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgKyAxNl0pOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnByZXZbaSArICAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcHJldltpICsgMTZdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTgoQTAsIEIwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTgoQTEsIEIxKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICAwXSwgQzApOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgMTZdLCBDMSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgb3V0W2ldID0gaW5baV0gKyBwcmV2W2ldOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdEludmVyc2UoY29uc3QgdWludDhfdCogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgcm93LCBpbnQgbGVuZ3RoKSB7CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IGk7CisgICAgY29uc3QgaW50IG1heF9wb3MgPSBsZW5ndGggJiB+NzsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIF9fbTEyOGkgQSA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgMCwgcm93Wy0xXSk7ICAgLy8gbGVmdCBzYW1wbGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X3BvczsgaSArPSA4KSB7CisgICAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ0b3BbaV0pOworICAgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2kgLSAxXSk7CisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fdW5wYWNrbG9fZXBpOCh0bXAwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBEID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgLy8gYmFzZSBpbnB1dAorICAgICAgY29uc3QgX19tMTI4aSBFID0gX21tX3N1Yl9lcGkxNihCLCBDKTsgIC8vIHVuY2xpcHBlZCBncmFkaWVudCBiYXNpcyBCIC0gQworICAgICAgX19tMTI4aSBvdXQgPSB6ZXJvOyAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdG9yIGZvciBvdXRwdXQKKyAgICAgIF9fbTEyOGkgbWFza19oaSA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgMCwgMHhmZik7CisgICAgICBpbnQgayA9IDg7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fYWRkX2VwaTE2KEEsIEUpOyAgICAgICAgICAgLy8gZGVsdGEgPSBBICsgQiAtIEMKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX3BhY2t1c19lcGkxNih0bXAzLCB6ZXJvKTsgIC8vIHNhdHVyYXRlIGRlbHRhCisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wNSA9IF9tbV9hZGRfZXBpOCh0bXA0LCBEKTsgICAgICAgICAvLyBhZGQgdG8gaW5bXQorICAgICAgICBBID0gX21tX2FuZF9zaTEyOCh0bXA1LCBtYXNrX2hpKTsgICAgICAgICAgICAgICAgICAgLy8gMS1jb21wbGVtZW50IGNsaXAKKyAgICAgICAgb3V0ID0gX21tX29yX3NpMTI4KG91dCwgQSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdGUgb3V0cHV0CisgICAgICAgIGlmICgtLWsgPT0gMCkgYnJlYWs7CisgICAgICAgIEEgPSBfbW1fc2xsaV9zaTEyOChBLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyByb3RhdGUgbGVmdCBzYW1wbGUKKyAgICAgICAgbWFza19oaSA9IF9tbV9zbGxpX3NpMTI4KG1hc2tfaGksIDEpOyAgICAgICAgICAgIC8vIHJvdGF0ZSBtYXNrCisgICAgICAgIEEgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IDhiLT4xNmIKKyAgICAgIH0KKyAgICAgIEEgPSBfbW1fc3JsaV9zaTEyOChBLCA3KTsgICAgICAgLy8gcHJlcGFyZSBsZWZ0IHNhbXBsZSBmb3IgbmV4dCBpdGVyYXRpb24KKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZyb3dbaV0sIG91dCk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgIHJvd1tpXSA9IGluW2ldICsgR3JhZGllbnRQcmVkaWN0b3JDKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIG91dFswXSA9IGluWzBdICsgcHJldlswXTsgIC8vIHByZWRpY3QgZnJvbSBhYm92ZQorICAgIEdyYWRpZW50UHJlZGljdEludmVyc2UoaW4gKyAxLCBwcmV2ICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRTU0UyKHZvaWQpIHsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxVbmZpbHRlcjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbFVuZmlsdGVyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50VW5maWx0ZXI7CisKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gPSBIb3Jpem9udGFsRmlsdGVyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3M2NhMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5jCkBAIC0wLDAgKzEsNjMzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZW5kaWFuX2lubC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmgiCisKKyNkZWZpbmUgTUFYX0RJRkZfQ09TVCAoMWUzMGYpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZSB0cmFuc2Zvcm1zLgorCisvLyBJbi1wbGFjZSBzdW0gb2YgZWFjaCBjb21wb25lbnQgd2l0aCBtb2QgMjU2Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkUGl4ZWxzRXEodWludDMyX3QqIGEsIHVpbnQzMl90IGIpIHsKKyAgKmEgPSBWUDhMQWRkUGl4ZWxzKCphLCBiKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICByZXR1cm4gKCgoYTAgXiBhMSkgJiAweGZlZmVmZWZldSkgPj4gMSkgKyAoYTAgJiBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMyh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsIHVpbnQzMl90IGEyKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTIpLCBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNCh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTEpLCBBdmVyYWdlMihhMiwgYTMpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsaXAyNTUodWludDMyX3QgYSkgeworICBpZiAoYSA8IDI1NikgeworICAgIHJldHVybiBhOworICB9CisgIC8vIHJldHVybiAwLCB3aGVuIGEgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLgorICAvLyByZXR1cm4gMjU1LCB3aGVuIGEgaXMgcG9zaXRpdmUuCisgIHJldHVybiB+YSA+PiAyNDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgeworICByZXR1cm4gQ2xpcDI1NShhICsgYiAtIGMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiA4KSAmIDB4ZmYpOworICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCAmIDB4ZmYsIGMxICYgMHhmZiwgYzIgJiAweGZmKTsKKyAgcmV0dXJuICgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGludCBhLCBpbnQgYikgeworICByZXR1cm4gQ2xpcDI1NShhICsgKGEgLSBiKSAvIDIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCB1aW50MzJfdCBhdmUgPSBBdmVyYWdlMihjMCwgYzEpOworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihhdmUgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAxNikgJiAweGZmLCAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gOCkgJiAweGZmLCAoYzIgPj4gOCkgJiAweGZmKTsKKyAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAwKSAmIDB4ZmYsIChjMiA+PiAwKSAmIDB4ZmYpOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK30KKworLy8gZ2NjLTQuOSBvbiBBUk0gZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGluIFNlbGVjdCgpIHdoZW4gU3ViMygpIGlzIGlubGluZWQuCisjaWYgZGVmaW5lZChfX2FybV9fKSAmJiBMT0NBTF9HQ0NfVkVSU0lPTiA9PSAweDQwOQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfSU5MSU5FIFdFQlBfSU5MSU5FCisjZW5kaWYKKworc3RhdGljIExPQ0FMX0lOTElORSBpbnQgU3ViMyhpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIGNvbnN0IGludCBwYiA9IGIgLSBjOworICBjb25zdCBpbnQgcGEgPSBhIC0gYzsKKyAgcmV0dXJuIGFicyhwYikgLSBhYnMocGEpOworfQorCisjdW5kZWYgTE9DQUxfSU5MSU5FCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWxlY3QodWludDMyX3QgYSwgdWludDMyX3QgYiwgdWludDMyX3QgYykgeworICBjb25zdCBpbnQgcGFfbWludXNfcGIgPQorICAgICAgU3ViMygoYSA+PiAyNCkgICAgICAgLCAoYiA+PiAyNCkgICAgICAgLCAoYyA+PiAyNCkgICAgICAgKSArCisgICAgICBTdWIzKChhID4+IDE2KSAmIDB4ZmYsIChiID4+IDE2KSAmIDB4ZmYsIChjID4+IDE2KSAmIDB4ZmYpICsKKyAgICAgIFN1YjMoKGEgPj4gIDgpICYgMHhmZiwgKGIgPj4gIDgpICYgMHhmZiwgKGMgPj4gIDgpICYgMHhmZikgKworICAgICAgU3ViMygoYSAgICAgICkgJiAweGZmLCAoYiAgICAgICkgJiAweGZmLCAoYyAgICAgICkgJiAweGZmKTsKKyAgcmV0dXJuIChwYV9taW51c19wYiA8PSAwKSA/IGEgOiBiOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9ycworCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKXRvcDsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEFSR0JfQkxBQ0s7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKXRvcDsKKyAgcmV0dXJuIGxlZnQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMF07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMV07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbLTFdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjUodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjgodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTEodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gSW52ZXJzZSBwcmVkaWN0aW9uLgorc3RhdGljIHZvaWQgUHJlZGljdG9ySW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIHVpbnQzMl90KiBkYXRhKSB7CisgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOworICBpZiAoeV9zdGFydCA9PSAwKSB7ICAvLyBGaXJzdCBSb3cgZm9sbG93cyB0aGUgTCAobW9kZT0xKSBtb2RlLgorICAgIGludCB4OworICAgIGNvbnN0IHVpbnQzMl90IHByZWQwID0gUHJlZGljdG9yMChkYXRhWy0xXSwgTlVMTCk7CisgICAgQWRkUGl4ZWxzRXEoZGF0YSwgcHJlZDApOworICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBwcmVkMSA9IFByZWRpY3RvcjEoZGF0YVt4IC0gMV0sIE5VTEwpOworICAgICAgQWRkUGl4ZWxzRXEoZGF0YSArIHgsIHByZWQxKTsKKyAgICB9CisgICAgZGF0YSArPSB3aWR0aDsKKyAgICArK3lfc3RhcnQ7CisgIH0KKworICB7CisgICAgaW50IHkgPSB5X3N0YXJ0OworICAgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOworICAgIGNvbnN0IGludCBtYXNrID0gdGlsZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHNhZmVfd2lkdGggPSB3aWR0aCAmIH5tYXNrOworICAgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybS0+Yml0c18pOworICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkX21vZGVfYmFzZSA9CisgICAgICAgIHRyYW5zZm9ybS0+ZGF0YV8gKyAoeSA+PiB0cmFuc2Zvcm0tPmJpdHNfKSAqIHRpbGVzX3Blcl9yb3c7CisKKyAgICB3aGlsZSAoeSA8IHlfZW5kKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBwcmVkMiA9IFByZWRpY3RvcjIoZGF0YVstMV0sIGRhdGEgLSB3aWR0aCk7CisgICAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX3NyYyA9IHByZWRfbW9kZV9iYXNlOworICAgICAgVlA4TFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jOworICAgICAgaW50IHggPSAxOworICAgICAgaW50IHQgPSAxOworICAgICAgLy8gRmlyc3QgcGl4ZWwgZm9sbG93cyB0aGUgVCAobW9kZT0yKSBtb2RlLgorICAgICAgQWRkUGl4ZWxzRXEoZGF0YSwgcHJlZDIpOworICAgICAgLy8gLi4gdGhlIHJlc3Q6CisgICAgICB3aGlsZSAoeCA8IHNhZmVfd2lkdGgpIHsKKyAgICAgICAgcHJlZF9mdW5jID0gVlA4TFByZWRpY3RvcnNbKCgqcHJlZF9tb2RlX3NyYysrKSA+PiA4KSAmIDB4Zl07CisgICAgICAgIGZvciAoOyB0IDwgdGlsZV93aWR0aDsgKyt0LCArK3gpIHsKKyAgICAgICAgICBjb25zdCB1aW50MzJfdCBwcmVkID0gcHJlZF9mdW5jKGRhdGFbeCAtIDFdLCBkYXRhICsgeCAtIHdpZHRoKTsKKyAgICAgICAgICBBZGRQaXhlbHNFcShkYXRhICsgeCwgcHJlZCk7CisgICAgICAgIH0KKyAgICAgICAgdCA9IDA7CisgICAgICB9CisgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgIHByZWRfZnVuYyA9IFZQOExQcmVkaWN0b3JzWygoKnByZWRfbW9kZV9zcmMrKykgPj4gOCkgJiAweGZdOworICAgICAgICBmb3IgKDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICBjb25zdCB1aW50MzJfdCBwcmVkID0gcHJlZF9mdW5jKGRhdGFbeCAtIDFdLCBkYXRhICsgeCAtIHdpZHRoKTsKKyAgICAgICAgICBBZGRQaXhlbHNFcShkYXRhICsgeCwgcHJlZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRhdGEgKz0gd2lkdGg7CisgICAgICArK3k7CisgICAgICBpZiAoKHkgJiBtYXNrKSA9PSAwKSB7ICAgLy8gVXNlIHRoZSBzYW1lIG1hc2ssIHNpbmNlIHRpbGVzIGFyZSBzcXVhcmVzLgorICAgICAgICBwcmVkX21vZGVfYmFzZSArPSB0aWxlc19wZXJfcm93OworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCisvLyAnc3VidHJhY3QgZ3JlZW4nKS4KK3ZvaWQgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0ModWludDMyX3QqIGRhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IGRhdGFbaV07CisgICAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSAoKGFyZ2IgPj4gOCkgJiAweGZmKTsKKyAgICB1aW50MzJfdCByZWRfYmx1ZSA9IChhcmdiICYgMHgwMGZmMDBmZnUpOworICAgIHJlZF9ibHVlICs9IChncmVlbiA8PCAxNikgfCBncmVlbjsKKyAgICByZWRfYmx1ZSAmPSAweDAwZmYwMGZmdTsKKyAgICBkYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCByZWRfYmx1ZTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgeworICByZXR1cm4gKHVpbnQzMl90KSgoaW50KShjb2xvcl9wcmVkKSAqIGNvbG9yKSA+PiA1OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb2xvckNvZGVUb011bHRpcGxpZXJzKHVpbnQzMl90IGNvbG9yX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExNdWx0aXBsaWVycyogY29uc3QgbSkgeworICBtLT5ncmVlbl90b19yZWRfICA9IChjb2xvcl9jb2RlID4+ICAwKSAmIDB4ZmY7CisgIG0tPmdyZWVuX3RvX2JsdWVfID0gKGNvbG9yX2NvZGUgPj4gIDgpICYgMHhmZjsKKyAgbS0+cmVkX3RvX2JsdWVfICAgPSAoY29sb3JfY29kZSA+PiAxNikgJiAweGZmOworfQorCit2b2lkIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sIHVpbnQzMl90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gZGF0YVtpXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICAgIHVpbnQzMl90IG5ld19yZWQgPSByZWQ7CisgICAgdWludDMyX3QgbmV3X2JsdWUgPSBhcmdiOworICAgIG5ld19yZWQgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7CisgICAgbmV3X3JlZCAmPSAweGZmOworICAgIG5ld19ibHVlICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgICBuZXdfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgbmV3X3JlZCk7CisgICAgbmV3X2JsdWUgJj0gMHhmZjsKKyAgICBkYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCAobmV3X3JlZCA8PCAxNikgfCAobmV3X2JsdWUpOworICB9Cit9CisKKy8vIENvbG9yIHNwYWNlIGludmVyc2UgdHJhbnNmb3JtLgorc3RhdGljIHZvaWQgQ29sb3JTcGFjZUludmVyc2VUcmFuc2Zvcm0oY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgdWludDMyX3QqIGRhdGEpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87CisgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOworICBjb25zdCBpbnQgbWFzayA9IHRpbGVfd2lkdGggLSAxOworICBjb25zdCBpbnQgc2FmZV93aWR0aCA9IHdpZHRoICYgfm1hc2s7CisgIGNvbnN0IGludCByZW1haW5pbmdfd2lkdGggPSB3aWR0aCAtIHNhZmVfd2lkdGg7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybS0+Yml0c18pOworICBpbnQgeSA9IHlfc3RhcnQ7CisgIGNvbnN0IHVpbnQzMl90KiBwcmVkX3JvdyA9CisgICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OworCisgIHdoaWxlICh5IDwgeV9lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCogcHJlZCA9IHByZWRfcm93OworICAgIFZQOExNdWx0aXBsaWVycyBtID0geyAwLCAwLCAwIH07CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRhdGFfc2FmZV9lbmQgPSBkYXRhICsgc2FmZV93aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YV9lbmQgPSBkYXRhICsgd2lkdGg7CisgICAgd2hpbGUgKGRhdGEgPCBkYXRhX3NhZmVfZW5kKSB7CisgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKCpwcmVkKyssICZtKTsKKyAgICAgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UoJm0sIGRhdGEsIHRpbGVfd2lkdGgpOworICAgICAgZGF0YSArPSB0aWxlX3dpZHRoOworICAgIH0KKyAgICBpZiAoZGF0YSA8IGRhdGFfZW5kKSB7ICAvLyBMZWZ0LW92ZXJzIHVzaW5nIEMtdmVyc2lvbi4KKyAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoKnByZWQrKywgJm0pOworICAgICAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSgmbSwgZGF0YSwgcmVtYWluaW5nX3dpZHRoKTsKKyAgICAgIGRhdGEgKz0gcmVtYWluaW5nX3dpZHRoOworICAgIH0KKyAgICArK3k7CisgICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgcHJlZF9yb3cgKz0gdGlsZXNfcGVyX3JvdzsKKyAgfQorfQorCisvLyBTZXBhcmF0ZSBvdXQgcGl4ZWxzIHBhY2tlZCB0b2dldGhlciB1c2luZyBwaXhlbC1idW5kbGluZy4KKy8vIFdlIGRlZmluZSB0d28gbWV0aG9kcyBmb3IgQVJHQiBkYXRhICh1aW50MzJfdCkgYW5kIGFscGhhLW9ubHkgZGF0YSAodWludDhfdCkuCisjZGVmaW5lIENPTE9SX0lOREVYX0lOVkVSU0UoRlVOQ19OQU1FLCBGX05BTUUsIFNUQVRJQ19ERUNMLCBUWVBFLCBCSVRfU1VGRklYLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9JTkRFWCwgR0VUX1ZBTFVFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZfTkFNRShjb25zdCBUWVBFKiBzcmMsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgVFlQRSogZHN0LCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCBpbnQgd2lkdGgpIHsgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbR0VUX0lOREVYKCpzcmMrKyldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitTVEFUSUNfREVDTCB2b2lkIEZVTkNfTkFNRShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgY29uc3QgVFlQRSogc3JjLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUqIGRzdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgYml0c19wZXJfcGl4ZWwgPSA4ID4+IHRyYW5zZm9ybS0+Yml0c187ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAgPSB0cmFuc2Zvcm0tPmRhdGFfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYml0c19wZXJfcGl4ZWwgPCA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgcGl4ZWxzX3Blcl9ieXRlID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGNvdW50X21hc2sgPSBwaXhlbHNfcGVyX2J5dGUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGJpdF9tYXNrID0gKDEgPDwgYml0c19wZXJfcGl4ZWwpIC0gMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB1aW50MzJfdCBwYWNrZWRfcGl4ZWxzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIFdlIG5lZWQgdG8gbG9hZCBmcmVzaCAncGFja2VkX3BpeGVscycgb25jZSBldmVyeSAgICAgICAgICAgICAgICAqLyAgXAorICAgICAgICAvKiAncGl4ZWxzX3Blcl9ieXRlJyBpbmNyZW1lbnRzIG9mIHguIEZvcnR1bmF0ZWx5LCBwaXhlbHNfcGVyX2J5dGUgKi8gIFwKKyAgICAgICAgLyogaXMgYSBwb3dlciBvZiAyLCBzbyBjYW4ganVzdCB1c2UgYSBtYXNrIGZvciB0aGF0LCBpbnN0ZWFkIG9mICAgICovICBcCisgICAgICAgIC8qIGRlY3JlbWVudGluZyBhIGNvdW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgXAorICAgICAgICBpZiAoKHggJiBjb3VudF9tYXNrKSA9PSAwKSBwYWNrZWRfcGl4ZWxzID0gR0VUX0lOREVYKCpzcmMrKyk7ICAgICAgICAgIFwKKyAgICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtwYWNrZWRfcGl4ZWxzICYgYml0X21hc2tdKTsgICAgICAgICAgICAgICBcCisgICAgICAgIHBhY2tlZF9waXhlbHMgPj49IGJpdHNfcGVyX3BpeGVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExNYXBDb2xvciMjQklUX1NVRkZJWChzcmMsIGNvbG9yX21hcCwgZHN0LCB5X3N0YXJ0LCB5X2VuZCwgd2lkdGgpOyAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0NPTE9SX0lOREVYX0lOVkVSU0UoQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0sIE1hcEFSR0IsIHN0YXRpYywgdWludDMyX3QsIDMyYiwKKyAgICAgICAgICAgICAgICAgICAgVlA4R2V0QVJHQkluZGV4LCBWUDhHZXRBUkdCVmFsdWUpCitDT0xPUl9JTkRFWF9JTlZFUlNFKFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhLCBNYXBBbHBoYSwgLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICA4YiwgVlA4R2V0QWxwaGFJbmRleCwgVlA4R2V0QWxwaGFWYWx1ZSkKKworI3VuZGVmIENPTE9SX0lOREVYX0lOVkVSU0UKKwordm9pZCBWUDhMSW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87CisgIGFzc2VydChyb3dfc3RhcnQgPCByb3dfZW5kKTsKKyAgYXNzZXJ0KHJvd19lbmQgPD0gdHJhbnNmb3JtLT55c2l6ZV8pOworICBzd2l0Y2ggKHRyYW5zZm9ybS0+dHlwZV8pIHsKKyAgICBjYXNlIFNVQlRSQUNUX0dSRUVOOgorICAgICAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkKG91dCwgKHJvd19lbmQgLSByb3dfc3RhcnQpICogd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUkVESUNUT1JfVFJBTlNGT1JNOgorICAgICAgUHJlZGljdG9ySW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgb3V0KTsKKyAgICAgIGlmIChyb3dfZW5kICE9IHRyYW5zZm9ybS0+eXNpemVfKSB7CisgICAgICAgIC8vIFRoZSBsYXN0IHByZWRpY3RlZCByb3cgaW4gdGhpcyBpdGVyYXRpb24gd2lsbCBiZSB0aGUgdG9wLXByZWQgcm93CisgICAgICAgIC8vIGZvciB0aGUgZmlyc3Qgcm93IGluIG5leHQgaXRlcmF0aW9uLgorICAgICAgICBtZW1jcHkob3V0IC0gd2lkdGgsIG91dCArIChyb3dfZW5kIC0gcm93X3N0YXJ0IC0gMSkgKiB3aWR0aCwKKyAgICAgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCpvdXQpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgorICAgICAgQ29sb3JTcGFjZUludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIG91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STToKKyAgICAgIGlmIChpbiA9PSBvdXQgJiYgdHJhbnNmb3JtLT5iaXRzXyA+IDApIHsKKyAgICAgICAgLy8gTW92ZSBwYWNrZWQgcGl4ZWxzIHRvIHRoZSBlbmQgb2YgdW5wYWNrZWQgcmVnaW9uLCBzbyB0aGF0IHVucGFja2luZworICAgICAgICAvLyBjYW4gb2NjdXIgc2VhbWxlc3NseS4KKyAgICAgICAgLy8gQWxzbywgbm90ZSB0aGF0IHRoaXMgaXMgdGhlIG9ubHkgdHJhbnNmb3JtIHRoYXQgYXBwbGllcyBvbgorICAgICAgICAvLyB0aGUgZWZmZWN0aXZlIHdpZHRoIG9mIFZQOExTdWJTYW1wbGVTaXplKHhzaXplXywgYml0c18pLiBBbGwgb3RoZXIKKyAgICAgICAgLy8gdHJhbnNmb3JtcyB3b3JrIG9uIGVmZmVjdGl2ZSB3aWR0aCBvZiB4c2l6ZV8uCisgICAgICAgIGNvbnN0IGludCBvdXRfc3RyaWRlID0gKHJvd19lbmQgLSByb3dfc3RhcnQpICogd2lkdGg7CisgICAgICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKgorICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIHRyYW5zZm9ybS0+Yml0c18pOworICAgICAgICB1aW50MzJfdCogY29uc3Qgc3JjID0gb3V0ICsgb3V0X3N0cmlkZSAtIGluX3N0cmlkZTsKKyAgICAgICAgbWVtbW92ZShzcmMsIG91dCwgaW5fc3RyaWRlICogc2l6ZW9mKCpzcmMpKTsKKyAgICAgICAgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIHNyYywgb3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBpbiwgb3V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBzcGFjZSBjb252ZXJzaW9uLgorCitzdGF0aWMgaW50IGlzX2JpZ19lbmRpYW4odm9pZCkgeworICBzdGF0aWMgY29uc3QgdW5pb24geworICAgIHVpbnQxNl90IHc7CisgICAgdWludDhfdCBiWzJdOworICB9IHRtcCA9IHsgMSB9OworICByZXR1cm4gKHRtcC5iWzBdICE9IDEpOworfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCX0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOworICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAyNCkgJiAweGZmOworICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKGFyZ2IgPj4gMTYpICYgMHhmMCkgfCAoKGFyZ2IgPj4gMTIpICYgMHhmKTsKKyAgICBjb25zdCB1aW50OF90IGJhID0gKChhcmdiID4+ICAwKSAmIDB4ZjApIHwgKChhcmdiID4+IDI4KSAmIDB4Zik7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgICpkc3QrKyA9IGJhOworICAgICpkc3QrKyA9IHJnOworI2Vsc2UKKyAgICAqZHN0KysgPSByZzsKKyAgICAqZHN0KysgPSBiYTsKKyNlbmRpZgorICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGY4KSB8ICgoYXJnYiA+PiAxMykgJiAweDcpOworICAgIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoKGFyZ2IgPj4gIDUpICYgMHhlMCkgfCAoKGFyZ2IgPj4gIDMpICYgMHgxZik7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgICpkc3QrKyA9IGdiOworICAgICpkc3QrKyA9IHJnOworI2Vsc2UKKyAgICAqZHN0KysgPSByZzsKKyAgICAqZHN0KysgPSBnYjsKKyNlbmRpZgorICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9CR1JfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29weU9yU3dhcChjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3dhcF9vbl9iaWdfZW5kaWFuKSB7CisgIGlmIChpc19iaWdfZW5kaWFuKCkgPT0gc3dhcF9vbl9iaWdfZW5kaWFuKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICAgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworCisjaWYgIWRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorI2lmICFkZWZpbmVkKFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OKQorICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCwgQlN3YXAzMihhcmdiKSk7CisjZWxzZSAgLy8gV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04KKyAgICAgIGRzdFswXSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7CisgICAgICBkc3RbMV0gPSAoYXJnYiA+PiAxNikgJiAweGZmOworICAgICAgZHN0WzJdID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAgIGRzdFszXSA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisjZW5kaWYKKyNlbHNlICAvLyBXT1JEU19CSUdFTkRJQU4KKyAgICAgIGRzdFswXSA9IChhcmdiID4+ICAwKSAmIDB4ZmY7CisgICAgICBkc3RbMV0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOworICAgICAgZHN0WzJdID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKKyAgICAgIGRzdFszXSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7CisjZW5kaWYKKyAgICAgIGRzdCArPSBzaXplb2YoYXJnYik7CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbWNweShkc3QsIHNyYywgbnVtX3BpeGVscyAqIHNpemVvZigqc3JjKSk7CisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEZyb21CR1JBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbl9kYXRhLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NTUF9NT0RFIG91dF9jb2xvcnNwYWNlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIHN3aXRjaCAob3V0X2NvbG9yc3BhY2UpIHsKKyAgICBjYXNlIE1PREVfUkdCOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0IoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfUkdCQToKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9yZ2JBOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9CR1I6CisgICAgICBWUDhMQ29udmVydEJHUkFUb0JHUihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9CR1JBOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9iZ3JBOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMCwgbnVtX3BpeGVscywgMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQVJHQjoKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQXJnYjoKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KHJnYmEsIDEsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1JHQkFfNDQ0NDoKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfcmdiQV80NDQ0OgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHJnYmEsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1JHQl81NjU6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCk7ICAgICAgICAgIC8vIENvZGUgZmxvdyBzaG91bGQgbm90IHJlYWNoIGhlcmUuCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4TFByb2Nlc3NCbHVlQW5kUmVkRnVuYyBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQ7CitWUDhMUHJlZGljdG9yRnVuYyBWUDhMUHJlZGljdG9yc1sxNl07CisKK1ZQOExUcmFuc2Zvcm1Db2xvckZ1bmMgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZTsKKworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCOworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCQTsKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0OworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1OworVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvQkdSOworCitWUDhMTWFwQVJHQkZ1bmMgVlA4TE1hcENvbG9yMzJiOworVlA4TE1hcEFscGhhRnVuYyBWUDhMTWFwQ29sb3I4YjsKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGxvc3NsZXNzX2xhc3RfY3B1aW5mb191c2VkID0KKyAgICAoVlA4Q1BVSW5mbykmbG9zc2xlc3NfbGFzdF9jcHVpbmZvX3VzZWQ7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdCh2b2lkKSB7CisgIGlmIChsb3NzbGVzc19sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgVlA4TFByZWRpY3RvcnNbMF0gPSBQcmVkaWN0b3IwOworICBWUDhMUHJlZGljdG9yc1sxXSA9IFByZWRpY3RvcjE7CisgIFZQOExQcmVkaWN0b3JzWzJdID0gUHJlZGljdG9yMjsKKyAgVlA4TFByZWRpY3RvcnNbM10gPSBQcmVkaWN0b3IzOworICBWUDhMUHJlZGljdG9yc1s0XSA9IFByZWRpY3RvcjQ7CisgIFZQOExQcmVkaWN0b3JzWzVdID0gUHJlZGljdG9yNTsKKyAgVlA4TFByZWRpY3RvcnNbNl0gPSBQcmVkaWN0b3I2OworICBWUDhMUHJlZGljdG9yc1s3XSA9IFByZWRpY3Rvcjc7CisgIFZQOExQcmVkaWN0b3JzWzhdID0gUHJlZGljdG9yODsKKyAgVlA4TFByZWRpY3RvcnNbOV0gPSBQcmVkaWN0b3I5OworICBWUDhMUHJlZGljdG9yc1sxMF0gPSBQcmVkaWN0b3IxMDsKKyAgVlA4TFByZWRpY3RvcnNbMTFdID0gUHJlZGljdG9yMTE7CisgIFZQOExQcmVkaWN0b3JzWzEyXSA9IFByZWRpY3RvcjEyOworICBWUDhMUHJlZGljdG9yc1sxM10gPSBQcmVkaWN0b3IxMzsKKyAgVlA4TFByZWRpY3RvcnNbMTRdID0gUHJlZGljdG9yMDsgICAgIC8vIDwtIHBhZGRpbmcgc2VjdXJpdHkgc2VudGluZWxzCisgIFZQOExQcmVkaWN0b3JzWzE1XSA9IFByZWRpY3RvcjA7CisKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0M7CisKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQzsKKworICBWUDhMQ29udmVydEJHUkFUb1JHQiA9IFZQOExDb252ZXJ0QkdSQVRvUkdCX0M7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DOworICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ID0gVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DOworICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NSA9IFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1X0M7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gVlA4TENvbnZlcnRCR1JBVG9CR1JfQzsKKworICBWUDhMTWFwQ29sb3IzMmIgPSBNYXBBUkdCOworICBWUDhMTWFwQ29sb3I4YiA9IE1hcEFscGhhOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhMRHNwSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7CisgICAgICBWUDhMRHNwSW5pdE5FT04oKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhMRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9CisgIGxvc3NsZXNzX2xhc3RfY3B1aW5mb191c2VkID0gVlA4R2V0Q1BVSW5mbzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkOGZkYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oCkBAIC0wLDAgKzEsMzcyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX0RTUF9MT1NTTEVTU19IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX0RTUF9MT1NTTEVTU19IXworCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2RlY29kZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworI2luY2x1ZGUgIi4uL2VuYy9kZWx0YV9wYWxldHRpemF0aW9uLmgiCisjZW5kaWYgIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGluZworCit0eXBlZGVmIHVpbnQzMl90ICgqVlA4TFByZWRpY3RvckZ1bmMpKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApOworZXh0ZXJuIFZQOExQcmVkaWN0b3JGdW5jIFZQOExQcmVkaWN0b3JzWzE2XTsKKwordHlwZWRlZiB2b2lkICgqVlA4TFByb2Nlc3NCbHVlQW5kUmVkRnVuYykodWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpOworZXh0ZXJuIFZQOExQcm9jZXNzQmx1ZUFuZFJlZEZ1bmMgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIE5vdGU6IHRoZSBtZW1iZXJzIGFyZSB1aW50OF90LCBzbyB0aGF0IGFueSBuZWdhdGl2ZSB2YWx1ZXMgYXJlCisgIC8vIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvICJtb2QgMjU2IiB2YWx1ZXMuCisgIHVpbnQ4X3QgZ3JlZW5fdG9fcmVkXzsKKyAgdWludDhfdCBncmVlbl90b19ibHVlXzsKKyAgdWludDhfdCByZWRfdG9fYmx1ZV87Cit9IFZQOExNdWx0aXBsaWVyczsKK3R5cGVkZWYgdm9pZCAoKlZQOExUcmFuc2Zvcm1Db2xvckZ1bmMpKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKTsKK2V4dGVybiBWUDhMVHJhbnNmb3JtQ29sb3JGdW5jIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2U7CisKK3N0cnVjdCBWUDhMVHJhbnNmb3JtOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KKworLy8gUGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gb2YgZGF0YSBnaXZlbiB0cmFuc2Zvcm0gaW5mb3JtYXRpb24sIHN0YXJ0IGFuZCBlbmQKKy8vIHJvd3MuIFRyYW5zZm9ybSB3aWxsIGJlIGFwcGxpZWQgdG8gcm93cyBbcm93X3N0YXJ0LCByb3dfZW5kWy4KKy8vIFRoZSAqaW4gYW5kICpvdXQgcG9pbnRlcnMgcmVmZXIgdG8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkYXRhIHJlc3BlY3RpdmVseQorLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJtZWRpYXRlIHJvdyAocm93X3N0YXJ0KS4KK3ZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiwgdWludDMyX3QqIGNvbnN0IG91dCk7CisKKy8vIENvbG9yIHNwYWNlIGNvbnZlcnNpb24uCit0eXBlZGVmIHZvaWQgKCpWUDhMQ29udmVydEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0JBOworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0OworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjU2NTsKK2V4dGVybiBWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9CR1I7CisKKy8vIENvbnZlcnRzIGZyb20gQkdSQSB0byBvdGhlciBjb2xvciBzcGFjZXMuCit2b2lkIFZQOExDb252ZXJ0RnJvbUJHUkEoY29uc3QgdWludDMyX3QqIGNvbnN0IGluX2RhdGEsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ1NQX01PREUgb3V0X2NvbG9yc3BhY2UsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpOworCisvLyBjb2xvciBtYXBwaW5nIHJlbGF0ZWQgZnVuY3Rpb25zLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOEdldEFSR0JJbmRleCh1aW50MzJfdCBpZHgpIHsKKyAgcmV0dXJuIChpZHggPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBWUDhHZXRBbHBoYUluZGV4KHVpbnQ4X3QgaWR4KSB7CisgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXRBUkdCVmFsdWUodWludDMyX3QgdmFsKSB7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOEdldEFscGhhVmFsdWUodWludDMyX3QgdmFsKSB7CisgIHJldHVybiAodmFsID4+IDgpICYgMHhmZjsKK30KKwordHlwZWRlZiB2b2lkICgqVlA4TE1hcEFSR0JGdW5jKShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgeV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfZW5kLCBpbnQgd2lkdGgpOwordHlwZWRlZiB2b2lkICgqVlA4TE1hcEFscGhhRnVuYykoY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IHlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9lbmQsIGludCB3aWR0aCk7CisKK2V4dGVybiBWUDhMTWFwQVJHQkZ1bmMgVlA4TE1hcENvbG9yMzJiOworZXh0ZXJuIFZQOExNYXBBbHBoYUZ1bmMgVlA4TE1hcENvbG9yOGI7CisKKy8vIFNpbWlsYXIgdG8gdGhlIHN0YXRpYyBtZXRob2QgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0oKSB0aGF0IGlzIHBhcnQgb2YKKy8vIGxvc3NsZXNzLmMsIGJ1dCB1c2VkIG9ubHkgZm9yIGFscGhhIGRlY29kaW5nLiBJdCB0YWtlcyB1aW50OF90IChyYXRoZXIgdGhhbgorLy8gdWludDMyX3QpIGFyZ3VtZW50cyBmb3IgJ3NyYycgYW5kICdkc3QnLgordm9pZCBWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSgKKyAgICBjb25zdCBzdHJ1Y3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKKworLy8gRXhwb3NlIHNvbWUgQy1vbmx5IGZhbGxiYWNrIGZ1bmN0aW9ucwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRhdGEsIGludCBudW1fcGl4ZWxzKTsKKwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb1JHQkFfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQ29udmVydEJHUkFUb0JHUl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpOwordm9pZCBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyh1aW50MzJfdCogZGF0YSwgaW50IG51bV9waXhlbHMpOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIGFib3ZlIG1ldGhvZHMuCit2b2lkIFZQOExEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW5jb2RpbmcKKworZXh0ZXJuIFZQOExQcm9jZXNzQmx1ZUFuZFJlZEZ1bmMgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZDsKK2V4dGVybiBWUDhMVHJhbnNmb3JtQ29sb3JGdW5jIFZQOExUcmFuc2Zvcm1Db2xvcjsKK3R5cGVkZWYgdm9pZCAoKlZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc0Z1bmMpKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwgaW50IGhpc3RvW10pOworZXh0ZXJuIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zOworCit0eXBlZGVmIHZvaWQgKCpWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc0Z1bmMpKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pOworZXh0ZXJuIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtczsKKworLy8gRXhwb3NlIHNvbWUgQy1vbmx5IGZhbGxiYWNrIGZ1bmN0aW9ucwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkYXRhLCBpbnQgbnVtX3BpeGVscyk7Cit2b2lkIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyh1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscyk7Cit2b2lkIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSk7Cit2b2lkIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZSB0cmFuc2Zvcm1zLgorCit2b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgbmVhcl9sb3NzbGVzcywgaW50IGV4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisKK3ZvaWQgVlA4TENvbG9yU3BhY2VUcmFuc2Zvcm0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogaW1hZ2UpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzYyBtZXRob2RzLgorCisvLyBDb21wdXRlcyBzYW1wbGVkIHNpemUgb2YgJ3NpemUnIHdoZW4gc2FtcGxpbmcgdXNpbmcgJ3NhbXBsaW5nIGJpdHMnLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExTdWJTYW1wbGVTaXplKHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdfYml0cykgeworICByZXR1cm4gKHNpemUgKyAoMSA8PCBzYW1wbGluZ19iaXRzKSAtIDEpID4+IHNhbXBsaW5nX2JpdHM7Cit9CisKKy8vIENvbnZlcnRzIG5lYXIgbG9zc2xlc3MgcXVhbGl0eSBpbnRvIG1heCBudW1iZXIgb2YgYml0cyBzaGF2ZWQgb2ZmLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMTmVhckxvc3NsZXNzQml0cyhpbnQgbmVhcl9sb3NzbGVzc19xdWFsaXR5KSB7CisgIC8vICAgIDEwMCAtPiAwCisgIC8vIDgwLi45OSAtPiAxCisgIC8vIDYwLi43OSAtPiAyCisgIC8vIDQwLi41OSAtPiAzCisgIC8vIDIwLi4zOSAtPiA0CisgIC8vICAwLi4xOSAtPiA1CisgIHJldHVybiA1IC0gbmVhcl9sb3NzbGVzc19xdWFsaXR5IC8gMjA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYXN0ZXIgbG9nYXJpdGhtIGZvciBpbnRlZ2Vycy4gU21hbGwgdmFsdWVzIHVzZSBhIGxvb2stdXAgdGFibGUuCisKKy8vIFRoZSB0aHJlc2hvbGQgdGlsbCBhcHByb3hpbWF0ZSB2ZXJzaW9uIG9mIGxvZ18yIGNhbiBiZSB1c2VkLgorLy8gUHJhY3RpY2FsbHksIHdlIGNhbiBnZXQgcmlkIG9mIHRoZSBjYWxsIHRvIGxvZygpIGFzIHRoZSB0d28gdmFsdWVzIG1hdGNoIHRvCisvLyB2ZXJ5IGhpZ2ggZGVncmVlICh0aGUgcmF0aW8gb2YgdGhlc2UgdHdvIGlzIDAuOTk5OTl4KS4KKy8vIEtlZXBpbmcgYSBoaWdoIHRocmVzaG9sZCBmb3Igbm93LgorI2RlZmluZSBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVggIDY1NTM2CisjZGVmaW5lIEFQUFJPWF9MT0dfTUFYICAgICAgICAgICAgICAgICAgIDQwOTYKKyNkZWZpbmUgTE9HXzJfUkVDSVBST0NBTCAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwNDY1MDk0MDA3MDg2CisjZGVmaW5lIExPR19MT09LVVBfSURYX01BWCAyNTYKK2V4dGVybiBjb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF07CitleHRlcm4gY29uc3QgZmxvYXQga1NMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXTsKK3R5cGVkZWYgZmxvYXQgKCpWUDhMRmFzdExvZzJTbG93RnVuYykodWludDMyX3Qgdik7CisKK2V4dGVybiBWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdExvZzJTbG93OworZXh0ZXJuIFZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0U0xvZzJTbG93OworCitzdGF0aWMgV0VCUF9JTkxJTkUgZmxvYXQgVlA4TEZhc3RMb2cyKHVpbnQzMl90IHYpIHsKKyAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtMb2cyVGFibGVbdl0gOiBWUDhMRmFzdExvZzJTbG93KHYpOworfQorLy8gRmFzdCBjYWxjdWxhdGlvbiBvZiB2ICogbG9nMih2KSBmb3IgaW50ZWdlciBpbnB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSBmbG9hdCBWUDhMRmFzdFNMb2cyKHVpbnQzMl90IHYpIHsKKyAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtTTG9nMlRhYmxlW3ZdIDogVlA4TEZhc3RTTG9nMlNsb3codik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIdWZmbWFuLWNvc3QgcmVsYXRlZCBmdW5jdGlvbnMuCisKK3R5cGVkZWYgZG91YmxlICgqVlA4TENvc3RGdW5jKShjb25zdCB1aW50MzJfdCogcG9wdWxhdGlvbiwgaW50IGxlbmd0aCk7Cit0eXBlZGVmIGRvdWJsZSAoKlZQOExDb3N0Q29tYmluZWRGdW5jKShjb25zdCB1aW50MzJfdCogWCwgY29uc3QgdWludDMyX3QqIFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKK3R5cGVkZWYgZmxvYXQgKCpWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMpKGNvbnN0IGludCBYWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgWVsyNTZdKTsKKworZXh0ZXJuIFZQOExDb3N0RnVuYyBWUDhMRXh0cmFDb3N0OworZXh0ZXJuIFZQOExDb3N0Q29tYmluZWRGdW5jIFZQOExFeHRyYUNvc3RDb21iaW5lZDsKK2V4dGVybiBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIC8vIHNtYWxsIHN0cnVjdCB0byBob2xkIGNvdW50ZXJzCisgIGludCBjb3VudHNbMl07ICAgICAgICAvLyBpbmRleDogMD16ZXJvIHN0ZWFrLCAxPW5vbi16ZXJvIHN0cmVhaworICBpbnQgc3RyZWFrc1syXVsyXTsgICAgLy8gW3plcm8vbm9uLXplcm9dW3N0cmVhazwzIC8gc3RyZWFrPj0zXQorfSBWUDhMU3RyZWFrczsKKwordHlwZWRlZiBWUDhMU3RyZWFrcyAoKlZQOExDb3N0Q29tYmluZWRDb3VudEZ1bmMpKGNvbnN0IHVpbnQzMl90KiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBZLCBpbnQgbGVuZ3RoKTsKKworZXh0ZXJuIFZQOExDb3N0Q29tYmluZWRDb3VudEZ1bmMgVlA4TEh1ZmZtYW5Db3N0Q29tYmluZWRDb3VudDsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgIC8vIHNtYWxsIHN0cnVjdCB0byBob2xkIGJpdCBlbnRyb3B5IHJlc3VsdHMKKyAgZG91YmxlIGVudHJvcHk7ICAgICAgICAgICAvLyBlbnRyb3B5CisgIHVpbnQzMl90IHN1bTsgICAgICAgICAgICAgLy8gc3VtIG9mIHRoZSBwb3B1bGF0aW9uCisgIGludCBub256ZXJvczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIG5vbi16ZXJvIGVsZW1lbnRzIGluIHRoZSBwb3B1bGF0aW9uCisgIHVpbnQzMl90IG1heF92YWw7ICAgICAgICAgLy8gbWF4aW11bSB2YWx1ZSBpbiB0aGUgcG9wdWxhdGlvbgorICB1aW50MzJfdCBub256ZXJvX2NvZGU7ICAgIC8vIGluZGV4IG9mIHRoZSBsYXN0IG5vbi16ZXJvIGluIHRoZSBwb3B1bGF0aW9uCit9IFZQOExCaXRFbnRyb3B5OworCit2b2lkIFZQOExCaXRFbnRyb3B5SW5pdChWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSk7CisKKy8vIEdldCB0aGUgY29tYmluZWQgc3ltYm9sIGJpdCBlbnRyb3B5IGFuZCBIdWZmbWFuIGNvc3Qgc3RhdHMgZm9yIHRoZQorLy8gZGlzdHJpYnV0aW9ucyAnWCcgYW5kICdZJy4gVGhvc2UgcmVzdWx0cyBjYW4gdGhlbiBiZSByZWZpbmVkIGFjY29yZGluZyB0bworLy8gY29kZWMgc3BlY2lmaWMgaGV1cmlzdGljcy4KK3ZvaWQgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZChjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgWSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKTsKKy8vIEdldCB0aGUgZW50cm9weSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiAnWCcuCit2b2lkIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBYLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cyk7CisKK3ZvaWQgVlA4TEJpdHNFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSk7CisKK3R5cGVkZWYgdm9pZCAoKkdldEVudHJvcHlVbnJlZmluZWRIZWxwZXJGdW5jKSh1aW50MzJfdCB2YWwsIGludCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCB2YWxfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGlfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKTsKKy8vIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgVlA4TEdldCpFbnRyb3B5VW5yZWZpbmVkLgorZXh0ZXJuIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXJGdW5jIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyOworCit0eXBlZGVmIHZvaWQgKCpWUDhMSGlzdG9ncmFtQWRkRnVuYykoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCk7CitleHRlcm4gVlA4TEhpc3RvZ3JhbUFkZEZ1bmMgVlA4TEhpc3RvZ3JhbUFkZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWZpeEVuY29kZSgpCisKK3R5cGVkZWYgaW50ICgqVlA4TFZlY3Rvck1pc21hdGNoRnVuYykoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwgaW50IGxlbmd0aCk7CisvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBhcnJheTEgYW5kIGFycmF5MiBhcmUgZGlmZmVyZW50LgorZXh0ZXJuIFZQOExWZWN0b3JNaXNtYXRjaEZ1bmMgVlA4TFZlY3Rvck1pc21hdGNoOworCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExCaXRzTG9nMkNlaWxpbmcodWludDMyX3QgbikgeworICBjb25zdCBpbnQgbG9nX2Zsb29yID0gQml0c0xvZzJGbG9vcihuKTsKKyAgaWYgKG4gPT0gKG4gJiB+KG4gLSAxKSkpICAvLyB6ZXJvIG9yIGEgcG93ZXIgb2YgdHdvLgorICAgIHJldHVybiBsb2dfZmxvb3I7CisgIGVsc2UKKyAgICByZXR1cm4gbG9nX2Zsb29yICsgMTsKK30KKworLy8gU3BsaXR0aW5nIG9mIGRpc3RhbmNlIGFuZCBsZW5ndGggY29kZXMgaW50byBwcmVmaXhlcyBhbmQKKy8vIGV4dHJhIGJpdHMuIFRoZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB3aXRoIGFuIGVudHJvcHkgY29kZQorLy8gd2hpbGUgdGhlIGV4dHJhIGJpdHMgYXJlIHN0b3JlZCBqdXN0IGFzIG5vcm1hbCBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFByZWZpeEVuY29kZUJpdHNOb0xVVChpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzKSB7CisgIGNvbnN0IGludCBoaWdoZXN0X2JpdCA9IEJpdHNMb2cyRmxvb3IoLS1kaXN0YW5jZSk7CisgIGNvbnN0IGludCBzZWNvbmRfaGlnaGVzdF9iaXQgPSAoZGlzdGFuY2UgPj4gKGhpZ2hlc3RfYml0IC0gMSkpICYgMTsKKyAgKmV4dHJhX2JpdHMgPSBoaWdoZXN0X2JpdCAtIDE7CisgICpjb2RlID0gMiAqIGhpZ2hlc3RfYml0ICsgc2Vjb25kX2hpZ2hlc3RfYml0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlTm9MVVQoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c192YWx1ZSkgeworICBjb25zdCBpbnQgaGlnaGVzdF9iaXQgPSBCaXRzTG9nMkZsb29yKC0tZGlzdGFuY2UpOworICBjb25zdCBpbnQgc2Vjb25kX2hpZ2hlc3RfYml0ID0gKGRpc3RhbmNlID4+IChoaWdoZXN0X2JpdCAtIDEpKSAmIDE7CisgICpleHRyYV9iaXRzID0gaGlnaGVzdF9iaXQgLSAxOworICAqZXh0cmFfYml0c192YWx1ZSA9IGRpc3RhbmNlICYgKCgxIDw8ICpleHRyYV9iaXRzKSAtIDEpOworICAqY29kZSA9IDIgKiBoaWdoZXN0X2JpdCArIHNlY29uZF9oaWdoZXN0X2JpdDsKK30KKworI2RlZmluZSBQUkVGSVhfTE9PS1VQX0lEWF9NQVggICA1MTIKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50OF90IGNvZGVfOworICBpbnQ4X3QgZXh0cmFfYml0c187Cit9IFZQOExQcmVmaXhDb2RlOworCisvLyBUaGVzZSB0YWJsZXMgYXJlIGRlcml2ZWQgdXNpbmcgVlA4TFByZWZpeEVuY29kZU5vTFVULgorZXh0ZXJuIGNvbnN0IFZQOExQcmVmaXhDb2RlIGtQcmVmaXhFbmNvZGVDb2RlW1BSRUZJWF9MT09LVVBfSURYX01BWF07CitleHRlcm4gY29uc3QgdWludDhfdCBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXTsKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQcmVmaXhFbmNvZGVCaXRzKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzKSB7CisgIGlmIChkaXN0YW5jZSA8IFBSRUZJWF9MT09LVVBfSURYX01BWCkgeworICAgIGNvbnN0IFZQOExQcmVmaXhDb2RlIHByZWZpeF9jb2RlID0ga1ByZWZpeEVuY29kZUNvZGVbZGlzdGFuY2VdOworICAgICpjb2RlID0gcHJlZml4X2NvZGUuY29kZV87CisgICAgKmV4dHJhX2JpdHMgPSBwcmVmaXhfY29kZS5leHRyYV9iaXRzXzsKKyAgfSBlbHNlIHsKKyAgICBWUDhMUHJlZml4RW5jb2RlQml0c05vTFVUKGRpc3RhbmNlLCBjb2RlLCBleHRyYV9iaXRzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c192YWx1ZSkgeworICBpZiAoZGlzdGFuY2UgPCBQUkVGSVhfTE9PS1VQX0lEWF9NQVgpIHsKKyAgICBjb25zdCBWUDhMUHJlZml4Q29kZSBwcmVmaXhfY29kZSA9IGtQcmVmaXhFbmNvZGVDb2RlW2Rpc3RhbmNlXTsKKyAgICAqY29kZSA9IHByZWZpeF9jb2RlLmNvZGVfOworICAgICpleHRyYV9iaXRzID0gcHJlZml4X2NvZGUuZXh0cmFfYml0c187CisgICAgKmV4dHJhX2JpdHNfdmFsdWUgPSBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbZGlzdGFuY2VdOworICB9IGVsc2UgeworICAgIFZQOExQcmVmaXhFbmNvZGVOb0xVVChkaXN0YW5jZSwgY29kZSwgZXh0cmFfYml0cywgZXh0cmFfYml0c192YWx1ZSk7CisgIH0KK30KKworLy8gU3VtIG9mIGVhY2ggY29tcG9uZW50LCBtb2QgMjU2Lgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOExBZGRQaXhlbHModWludDMyX3QgYSwgdWludDMyX3QgYikgeworICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPSAoYSAmIDB4ZmYwMGZmMDB1KSArIChiICYgMHhmZjAwZmYwMHUpOworICBjb25zdCB1aW50MzJfdCByZWRfYW5kX2JsdWUgPSAoYSAmIDB4MDBmZjAwZmZ1KSArIChiICYgMHgwMGZmMDBmZnUpOworICByZXR1cm4gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Cit9CisKKy8vIERpZmZlcmVuY2Ugb2YgZWFjaCBjb21wb25lbnQsIG1vZCAyNTYuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlBpeGVscyh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7CisgIGNvbnN0IHVpbnQzMl90IGFscGhhX2FuZF9ncmVlbiA9CisgICAgICAweDAwZmYwMGZmdSArIChhICYgMHhmZjAwZmYwMHUpIC0gKGIgJiAweGZmMDBmZjAwdSk7CisgIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9CisgICAgICAweGZmMDBmZjAwdSArIChhICYgMHgwMGZmMDBmZnUpIC0gKGIgJiAweDAwZmYwMGZmdSk7CisgIHJldHVybiAoYWxwaGFfYW5kX2dyZWVuICYgMHhmZjAwZmYwMHUpIHwgKHJlZF9hbmRfYmx1ZSAmIDB4MDBmZjAwZmZ1KTsKK30KKwordm9pZCBWUDhMQnVuZGxlQ29sb3JNYXAoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBjb25zdCBkc3QpOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIGFib3ZlIG1ldGhvZHMuCit2b2lkIFZQOExFbmNEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQ0hST01JVU1fV0VCUF9EU1BfTE9TU0xFU1NfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc1ZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuYy5jCkBAIC0wLDAgKzEsMTQzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy92cDhsaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZW5kaWFuX2lubC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2LmgiCisKKyNkZWZpbmUgTUFYX0RJRkZfQ09TVCAoMWUzMGYpCisKK3N0YXRpYyBjb25zdCBpbnQga1ByZWRMb3dFZmZvcnQgPSAxMTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTWFza0FscGhhID0gMHhmZjAwMDAwMDsKKworLy8gbG9va3VwIHRhYmxlIGZvciBzbWFsbCB2YWx1ZXMgb2YgbG9nMihpbnQpCitjb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7CisgIDAuMDAwMDAwMDAwMDAwMDAwMGYsIDAuMDAwMDAwMDAwMDAwMDAwMGYsCisgIDEuMDAwMDAwMDAwMDAwMDAwMGYsIDEuNTg0OTYyNTAwNzIxMTU2MGYsCisgIDIuMDAwMDAwMDAwMDAwMDAwMGYsIDIuMzIxOTI4MDk0ODg3MzYyMWYsCisgIDIuNTg0OTYyNTAwNzIxMTU2MGYsIDIuODA3MzU0OTIyMDU3NjA0MWYsCisgIDMuMDAwMDAwMDAwMDAwMDAwMGYsIDMuMTY5OTI1MDAxNDQyMzEyMWYsCisgIDMuMzIxOTI4MDk0ODg3MzYyMWYsIDMuNDU5NDMxNjE4NjM3Mjk3M2YsCisgIDMuNTg0OTYyNTAwNzIxMTU2MGYsIDMuNzAwNDM5NzE4MTQxMDkyMWYsCisgIDMuODA3MzU0OTIyMDU3NjA0MWYsIDMuOTA2ODkwNTk1NjA4NTE4N2YsCisgIDQuMDAwMDAwMDAwMDAwMDAwMGYsIDQuMDg3NDYyODQxMjUwMzM5MGYsCisgIDQuMTY5OTI1MDAxNDQyMzEyMWYsIDQuMjQ3OTI3NTEzNDQzNTg1MmYsCisgIDQuMzIxOTI4MDk0ODg3MzYyNmYsIDQuMzkyMzE3NDIyNzc4NzYwNmYsCisgIDQuNDU5NDMxNjE4NjM3Mjk3M2YsIDQuNTIzNTYxOTU2MDU3MDEzMGYsCisgIDQuNTg0OTYyNTAwNzIxMTU2MGYsIDQuNjQzODU2MTg5Nzc0NzI0M2YsCisgIDQuNzAwNDM5NzE4MTQxMDkxN2YsIDQuNzU0ODg3NTAyMTYzNDY4MmYsCisgIDQuODA3MzU0OTIyMDU3NjAzN2YsIDQuODU3OTgwOTk1MTI3NTcxOGYsCisgIDQuOTA2ODkwNTk1NjA4NTE4N2YsIDQuOTU0MTk2MzEwMzg2ODc0OWYsCisgIDUuMDAwMDAwMDAwMDAwMDAwMGYsIDUuMDQ0Mzk0MTE5MzU4NDUzM2YsCisgIDUuMDg3NDYyODQxMjUwMzM5MGYsIDUuMTI5MjgzMDE2OTQ0OTY2M2YsCisgIDUuMTY5OTI1MDAxNDQyMzEyMWYsIDUuMjA5NDUzMzY1NjI4OTUwMWYsCisgIDUuMjQ3OTI3NTEzNDQzNTg1MmYsIDUuMjg1NDAyMjE4ODYyMjQ4N2YsCisgIDUuMzIxOTI4MDk0ODg3MzYyNmYsIDUuMzU3NTUyMDA0NjE4MDgzN2YsCisgIDUuMzkyMzE3NDIyNzc4NzYwNmYsIDUuNDI2MjY0NzU0NzAyMDk3OWYsCisgIDUuNDU5NDMxNjE4NjM3Mjk3M2YsIDUuNDkxODUzMDk2MzI5Njc0N2YsCisgIDUuNTIzNTYxOTU2MDU3MDEzMGYsIDUuNTU0NTg4ODUxNjc3NjM3NmYsCisgIDUuNTg0OTYyNTAwNzIxMTU2MGYsIDUuNjE0NzA5ODQ0MTE1MjA4M2YsCisgIDUuNjQzODU2MTg5Nzc0NzI0M2YsIDUuNjcyNDI1MzQxOTcxNDk1MWYsCisgIDUuNzAwNDM5NzE4MTQxMDkxN2YsIDUuNzI3OTIwNDU0NTYzMTk4N2YsCisgIDUuNzU0ODg3NTAyMTYzNDY4MmYsIDUuNzgxMzU5NzEzNTI0NjU5OWYsCisgIDUuODA3MzU0OTIyMDU3NjAzN2YsIDUuODMyODkwMDE0MTY0NzQxMmYsCisgIDUuODU3OTgwOTk1MTI3NTcxOGYsIDUuODgyNjQzMDQ5MzYxODQxNWYsCisgIDUuOTA2ODkwNTk1NjA4NTE4N2YsIDUuOTMwNzM3MzM3NTYyODg2NmYsCisgIDUuOTU0MTk2MzEwMzg2ODc0OWYsIDUuOTc3Mjc5OTIzNDk5OTE2N2YsCisgIDYuMDAwMDAwMDAwMDAwMDAwMGYsIDYuMDIyMzY3ODEzMDI4NDU0M2YsCisgIDYuMDQ0Mzk0MTE5MzU4NDUzM2YsIDYuMDY2MDg5MTkwNDU3NzcyMGYsCisgIDYuMDg3NDYyODQxMjUwMzM5MGYsIDYuMTA4NTI0NDU2Nzc4MTY5MWYsCisgIDYuMTI5MjgzMDE2OTQ0OTY2M2YsIDYuMTQ5NzQ3MTE5NTA0NjgyMmYsCisgIDYuMTY5OTI1MDAxNDQyMzEyMWYsIDYuMTg5ODI0NTU4ODgwMDE3NWYsCisgIDYuMjA5NDUzMzY1NjI4OTUwMWYsIDYuMjI4ODE4NjkwNDk1ODgwNGYsCisgIDYuMjQ3OTI3NTEzNDQzNTg1MmYsIDYuMjY2Nzg2NTQwNjk0OTAxMGYsCisgIDYuMjg1NDAyMjE4ODYyMjQ4N2YsIDYuMzAzNzgwNzQ4MTc3MTAzMGYsCisgIDYuMzIxOTI4MDk0ODg3MzYyNmYsIDYuMzM5ODUwMDAyODg0NjI0M2YsCisgIDYuMzU3NTUyMDA0NjE4MDgzN2YsIDYuMzc1MDM5NDMxMzQ2OTI0NWYsCisgIDYuMzkyMzE3NDIyNzc4NzYwNmYsIDYuNDA5MzkwOTM2MTM3NzAxN2YsCisgIDYuNDI2MjY0NzU0NzAyMDk3OWYsIDYuNDQyOTQzNDk1ODQ4NzI3OWYsCisgIDYuNDU5NDMxNjE4NjM3Mjk3M2YsIDYuNDc1NzMzNDMwOTY2Mzk3NmYsCisgIDYuNDkxODUzMDk2MzI5Njc0N2YsIDYuNTA3Nzk0NjQwMTk4Njk2M2YsCisgIDYuNTIzNTYxOTU2MDU3MDEzMGYsIDYuNTM5MTU4ODExMTA4MDMwOWYsCisgIDYuNTU0NTg4ODUxNjc3NjM3NmYsIDYuNTY5ODU1NjA4MzMwOTQ3OGYsCisgIDYuNTg0OTYyNTAwNzIxMTU2MGYsIDYuNTk5OTEyODQyMTg3MTI3OGYsCisgIDYuNjE0NzA5ODQ0MTE1MjA4M2YsIDYuNjI5MzU2NjIwMDc5NjA5NGYsCisgIDYuNjQzODU2MTg5Nzc0NzI0M2YsIDYuNjU4MjExNDgyNzUxNzk0NmYsCisgIDYuNjcyNDI1MzQxOTcxNDk1MWYsIDYuNjg2NTAwNTI3MTgzMjE4NWYsCisgIDYuNzAwNDM5NzE4MTQxMDkxN2YsIDYuNzE0MjQ1NTE3NjY2MTIyNGYsCisgIDYuNzI3OTIwNDU0NTYzMTk4N2YsIDYuNzQxNDY2OTg2NDAxMTQ2NGYsCisgIDYuNzU0ODg3NTAyMTYzNDY4MmYsIDYuNzY4MTg0MzI0Nzc2OTI1OWYsCisgIDYuNzgxMzU5NzEzNTI0NjU5OWYsIDYuNzk0NDE1ODY2MzUwMTA2MWYsCisgIDYuODA3MzU0OTIyMDU3NjAzN2YsIDYuODIwMTc4OTYyNDE1MTg3OGYsCisgIDYuODMyODkwMDE0MTY0NzQxMmYsIDYuODQ1NDkwMDUwOTQ0Mzc0N2YsCisgIDYuODU3OTgwOTk1MTI3NTcxOGYsIDYuODcwMzY0NzE5NTgzNDA0N2YsCisgIDYuODgyNjQzMDQ5MzYxODQxNWYsIDYuODk0ODE3NzYzMzA3OTQzN2YsCisgIDYuOTA2ODkwNTk1NjA4NTE4N2YsIDYuOTE4ODYzMjM3Mjc0NTk0NmYsCisgIDYuOTMwNzM3MzM3NTYyODg2NmYsIDYuOTQyNTE0NTA1MzM5MjM5OGYsCisgIDYuOTU0MTk2MzEwMzg2ODc0OWYsIDYuOTY1Nzg0Mjg0NjYyMDg2OWYsCisgIDYuOTc3Mjc5OTIzNDk5OTE2N2YsIDYuOTg4Njg0Njg2NzcyMTY1NGYsCisgIDcuMDAwMDAwMDAwMDAwMDAwMGYsIDcuMDExMjI3MjU1NDIzMjUzOWYsCisgIDcuMDIyMzY3ODEzMDI4NDU0M2YsIDcuMDMzNDIzMDAxNTM3NDUwMWYsCisgIDcuMDQ0Mzk0MTE5MzU4NDUzM2YsIDcuMDU1MjgyNDM1NTAxMTg5OGYsCisgIDcuMDY2MDg5MTkwNDU3NzcyMGYsIDcuMDc2ODE1NTk3MDUwODMwOGYsCisgIDcuMDg3NDYyODQxMjUwMzM5MGYsIDcuMDk4MDMyMDgyOTYwNTI2M2YsCisgIDcuMTA4NTI0NDU2Nzc4MTY5MWYsIDcuMTE4OTQxMDcyNzIzNTA3NmYsCisgIDcuMTI5MjgzMDE2OTQ0OTY2M2YsIDcuMTM5NTUxMzUyMzk4NzkzNmYsCisgIDcuMTQ5NzQ3MTE5NTA0NjgyMmYsIDcuMTU5ODcxMzM2Nzc4Mzg5MGYsCisgIDcuMTY5OTI1MDAxNDQyMzEyMWYsIDcuMTc5OTA5MDkwMDE0OTM0NGYsCisgIDcuMTg5ODI0NTU4ODgwMDE3NWYsIDcuMTk5NjcyMzQ0ODM2MzY0NGYsCisgIDcuMjA5NDUzMzY1NjI4OTUwMWYsIDcuMjE5MTY4NTIwNDYyMTYxMWYsCisgIDcuMjI4ODE4NjkwNDk1ODgwNGYsIDcuMjM4NDA0NzM5MzI1MDc4NWYsCisgIDcuMjQ3OTI3NTEzNDQzNTg1MmYsIDcuMjU3Mzg3ODQyNjkyNjUyMWYsCisgIDcuMjY2Nzg2NTQwNjk0OTAxMGYsIDcuMjc2MTI0NDA1Mjc0MjM3NWYsCisgIDcuMjg1NDAyMjE4ODYyMjQ4N2YsIDcuMjk0NjIwNzQ4ODkxNjI3MGYsCisgIDcuMzAzNzgwNzQ4MTc3MTAzMGYsIDcuMzEyODgyOTU1Mjg0MzU1N2YsCisgIDcuMzIxOTI4MDk0ODg3MzYyNmYsIDcuMzMwOTE2ODc4MTE0NjE2N2YsCisgIDcuMzM5ODUwMDAyODg0NjI0M2YsIDcuMzQ4NzI4MTU0MjMxMDc3MWYsCisgIDcuMzU3NTUyMDA0NjE4MDgzN2YsIDcuMzY2MzIyMjE0MjQ1ODE2MGYsCisgIDcuMzc1MDM5NDMxMzQ2OTI0NWYsIDcuMzgzNzA0MjkyNDc0MDUxOWYsCisgIDcuMzkyMzE3NDIyNzc4NzYwNmYsIDcuNDAwODc5NDM2MjgyMTg0M2YsCisgIDcuNDA5MzkwOTM2MTM3NzAxN2YsIDcuNDE3ODUyNTE0ODg1ODk4MmYsCisgIDcuNDI2MjY0NzU0NzAyMDk3OWYsIDcuNDM0NjI4MjI3NjM2NzI0NWYsCisgIDcuNDQyOTQzNDk1ODQ4NzI3OWYsIDcuNDUxMjExMTExODMyMzI4OWYsCisgIDcuNDU5NDMxNjE4NjM3Mjk3M2YsIDcuNDY3NjA1NTUwMDgyOTk3NmYsCisgIDcuNDc1NzMzNDMwOTY2Mzk3NmYsIDcuNDgzODE1Nzc3MjY0MjU2M2YsCisgIDcuNDkxODUzMDk2MzI5Njc0N2YsIDcuNDk5ODQ1ODg3MDgzMjA1NmYsCisgIDcuNTA3Nzk0NjQwMTk4Njk2M2YsIDcuNTE1Njk5ODM4Mjg0MDQyN2YsCisgIDcuNTIzNTYxOTU2MDU3MDEzMGYsIDcuNTMxMzgxNDYwNTE2MzExOGYsCisgIDcuNTM5MTU4ODExMTA4MDMwOWYsIDcuNTQ2ODk0NDU5ODg3NjM2NGYsCisgIDcuNTU0NTg4ODUxNjc3NjM3NmYsIDcuNTYyMjQyNDI0MjIxMDcyOGYsCisgIDcuNTY5ODU1NjA4MzMwOTQ3OGYsIDcuNTc3NDI4ODI4MDM1NzQ4NmYsCisgIDcuNTg0OTYyNTAwNzIxMTU2MGYsIDcuNTkyNDU3MDM3MjY4MDgwNmYsCisgIDcuNTk5OTEyODQyMTg3MTI3OGYsIDcuNjA3MzMwMzEzNzQ5NjEwNGYsCisgIDcuNjE0NzA5ODQ0MTE1MjA4M2YsIDcuNjIyMDUxODE5NDU2Mzc2NGYsCisgIDcuNjI5MzU2NjIwMDc5NjA5NGYsIDcuNjM2NjI0NjIwNTQzNjQ4N2YsCisgIDcuNjQzODU2MTg5Nzc0NzI0M2YsIDcuNjUxMDUxNjkxMTc4OTI4MWYsCisgIDcuNjU4MjExNDgyNzUxNzk0NmYsIDcuNjY1MzM1OTE3MTg1MTc2NGYsCisgIDcuNjcyNDI1MzQxOTcxNDk1MWYsIDcuNjc5NDgwMDk5NTA1NDQ2NGYsCisgIDcuNjg2NTAwNTI3MTgzMjE4NWYsIDcuNjkzNDg2OTU3NDk5MzI1MmYsCisgIDcuNzAwNDM5NzE4MTQxMDkxN2YsIDcuNzA3MzU5MTMyMDgwODgyNWYsCisgIDcuNzE0MjQ1NTE3NjY2MTIyNGYsIDcuNzIxMDk5MTg4NzA3MTg1NWYsCisgIDcuNzI3OTIwNDU0NTYzMTk4N2YsIDcuNzM0NzA5NjIwMjI1ODM4M2YsCisgIDcuNzQxNDY2OTg2NDAxMTQ2NGYsIDcuNzQ4MTkyODQ5NTg5NDYwNWYsCisgIDcuNzU0ODg3NTAyMTYzNDY4MmYsIDcuNzYxNTUxMjMyNDQ0NDc5NWYsCisgIDcuNzY4MTg0MzI0Nzc2OTI1OWYsIDcuNzc0Nzg3MDU5NjAxMTczNmYsCisgIDcuNzgxMzU5NzEzNTI0NjU5OWYsIDcuNzg3OTAyNTU5MzkxNDMxN2YsCisgIDcuNzk0NDE1ODY2MzUwMTA2MWYsIDcuODAwODk5ODk5OTIwMzA0N2YsCisgIDcuODA3MzU0OTIyMDU3NjAzN2YsIDcuODEzNzgxMTkxMjE3MDM3NGYsCisgIDcuODIwMTc4OTYyNDE1MTg3OGYsIDcuODI2NTQ4NDg3MjkwOTE1MGYsCisgIDcuODMyODkwMDE0MTY0NzQxMmYsIDcuODM5MjAzNzg4MDk2OTQzNmYsCisgIDcuODQ1NDkwMDUwOTQ0Mzc0N2YsIDcuODUxNzQ5MDQxNDE2MDU3MWYsCisgIDcuODU3OTgwOTk1MTI3NTcxOGYsIDcuODY0MTg2MTQ0NjU0Mjc5N2YsCisgIDcuODcwMzY0NzE5NTgzNDA0N2YsIDcuODc2NTE2OTQ2NTY0OTk5M2YsCisgIDcuODgyNjQzMDQ5MzYxODQxNWYsIDcuODg4NzQzMjQ4ODk4MjU5MWYsCisgIDcuODk0ODE3NzYzMzA3OTQzN2YsIDcuOTAwODY2ODA3OTgwNzQ4NmYsCisgIDcuOTA2ODkwNTk1NjA4NTE4N2YsIDcuOTEyODg5MzM2MjI5OTYxOWYsCisgIDcuOTE4ODYzMjM3Mjc0NTk0NmYsIDcuOTI0ODEyNTAzNjA1NzgxMmYsCisgIDcuOTMwNzM3MzM3NTYyODg2NmYsIDcuOTM2NjM3OTM5MDAyNTcwOWYsCisgIDcuOTQyNTE0NTA1MzM5MjM5OGYsIDcuOTQ4MzY3MjMxNTg0Njc3OGYsCisgIDcuOTU0MTk2MzEwMzg2ODc0OWYsIDcuOTYwMDAxOTMyMDY4MDgwNWYsCisgIDcuOTY1Nzg0Mjg0NjYyMDg2OWYsIDcuOTcxNTQzNTUzOTUwNzcxOWYsCisgIDcuOTc3Mjc5OTIzNDk5OTE2N2YsIDcuOTgyOTkzNTc0Njk0MzEwM2YsCisgIDcuOTg4Njg0Njg2NzcyMTY1NGYsIDcuOTk0MzUzNDM2ODU4ODU3N2YKK307CisKK2NvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7CisgIDAuMDAwMDAwMDBmLCAgICAwLjAwMDAwMDAwZiwgIDIuMDAwMDAwMDBmLCAgIDQuNzU0ODg3NTBmLAorICA4LjAwMDAwMDAwZiwgICAxMS42MDk2NDA0N2YsICAxNS41MDk3NzUwMGYsICAxOS42NTE0ODQ0NWYsCisgIDI0LjAwMDAwMDAwZiwgIDI4LjUyOTMyNTAxZiwgIDMzLjIxOTI4MDk1ZiwgIDM4LjA1Mzc0NzgxZiwKKyAgNDMuMDE5NTUwMDFmLCAgNDguMTA1NzE2MzRmLCAgNTMuMzAyOTY4OTFmLCAgNTguNjAzMzU4OTNmLAorICA2NC4wMDAwMDAwMGYsICA2OS40ODY4NjgzMGYsICA3NS4wNTg2NTAwM2YsICA4MC43MTA2MjI3NmYsCisgIDg2LjQzODU2MTkwZiwgIDkyLjIzODY2NTg4ZiwgIDk4LjEwNzQ5NTYxZiwgIDEwNC4wNDE5MjQ5OWYsCisgIDExMC4wMzkxMDAwMmYsIDExNi4wOTY0MDQ3NGYsIDEyMi4yMTE0MzI2N2YsIDEyOC4zODE5NjI1NmYsCisgIDEzNC42MDU5Mzc4MmYsIDE0MC44ODE0NDg4NmYsIDE0Ny4yMDY3MTc4N2YsIDE1My41ODAwODU2MmYsCisgIDE2MC4wMDAwMDAwMGYsIDE2Ni40NjUwMDU5NGYsIDE3Mi45NzM3MzY2MGYsIDE3OS41MjQ5MDU1OWYsCisgIDE4Ni4xMTczMDAwNWYsIDE5Mi43NDk3NzQ1M2YsIDE5OS40MjEyNDU1MWYsIDIwNi4xMzA2ODY1NGYsCisgIDIxMi44NzcxMjM4MGYsIDIxOS42NTk2MzIxOWYsIDIyNi40NzczMzE3NmYsIDIzMy4zMjkzODQ0NWYsCisgIDI0MC4yMTQ5OTEyMmYsIDI0Ny4xMzMzODkzM2YsIDI1NC4wODM4NDk5OGYsIDI2MS4wNjU2NzYwM2YsCisgIDI2OC4wNzgyMDAwM2YsIDI3NS4xMjA3ODIzNmYsIDI4Mi4xOTI4MDk0OWYsIDI4OS4yOTM2OTI0NGYsCisgIDI5Ni40MjI4NjUzNGYsIDMwMy41Nzk3ODQwOWYsIDMxMC43NjM5MjUxMmYsIDMxNy45NzQ3ODQyNGYsCisgIDMyNS4yMTE4NzU2NGYsIDMzMi40NzQ3MzA4MWYsIDMzOS43NjI4OTc3MmYsIDM0Ny4wNzU5Mzk5MWYsCisgIDM1NC40MTM0MzU3NGYsIDM2MS43NzQ5Nzc1OWYsIDM2OS4xNjAxNzEyNGYsIDM3Ni41Njg2MzUxOGYsCisgIDM4NC4wMDAwMDAwMGYsIDM5MS40NTM5MDc4NWYsIDM5OC45MzAwMTE4OGYsIDQwNi40Mjc5NzU3NmYsCisgIDQxMy45NDc0NzMyMWYsIDQyMS40ODgxODc1MmYsIDQyOS4wNDk4MTExOWYsIDQzNi42MzIwNDU0OGYsCisgIDQ0NC4yMzQ2MDAxMGYsIDQ1MS44NTcxOTI4MGYsIDQ1OS40OTk1NDkwNmYsIDQ2Ny4xNjE0MDE3OWYsCisgIDQ3NC44NDI0OTEwMmYsIDQ4Mi41NDI1NjM2M2YsIDQ5MC4yNjEzNzMwN2YsIDQ5Ny45OTg2NzkxMWYsCisgIDUwNS43NTQyNDc1OWYsIDUxMy41Mjc4NTAyM2YsIDUyMS4zMTkyNjQzOGYsIDUyOS4xMjgyNzI4MGYsCisgIDUzNi45NTQ2NjM1MWYsIDU0NC43OTgyMjk1N2YsIDU1Mi42NTg3Njg5MGYsIDU2MC41MzYwODQxNGYsCisgIDU2OC40Mjk5ODI0NGYsIDU3Ni4zNDAyNzUzNmYsIDU4NC4yNjY3Nzg2N2YsIDU5Mi4yMDkzMTIyNmYsCisgIDYwMC4xNjc2OTk5NmYsIDYwOC4xNDE3Njk0M2YsIDYxNi4xMzEzNTIwNmYsIDYyNC4xMzYyODI3OWYsCisgIDYzMi4xNTY0MDAwN2YsIDY0MC4xOTE1NDU2OWYsIDY0OC4yNDE1NjQ3MmYsIDY1Ni4zMDYzMDUzOWYsCisgIDY2NC4zODU2MTg5OGYsIDY3Mi40NzkzNTk3NmYsIDY4MC41ODczODQ4OGYsIDY4OC43MDk1NTQzMGYsCisgIDY5Ni44NDU3MzA2OWYsIDcwNC45OTU3NzkzNWYsIDcxMy4xNTk1NjgxOGYsIDcyMS4zMzY5Njc1NGYsCisgIDcyOS41Mjc4NTAyM2YsIDczNy43MzIwOTE0MGYsIDc0NS45NDk1Njg0OWYsIDc1NC4xODAxNjExNmYsCisgIDc2Mi40MjM3NTEyN2YsIDc3MC42ODAyMjI3NWYsIDc3OC45NDk0NjE2MWYsIDc4Ny4yMzEzNTU4NmYsCisgIDc5NS41MjU3OTU0M2YsIDgwMy44MzI2NzIxOWYsIDgxMi4xNTE4Nzk4MmYsIDgyMC40ODMzMTM4M2YsCisgIDgyOC44MjY4NzE0N2YsIDgzNy4xODI0NTE3MWYsIDg0NS41NDk5NTUxOGYsIDg1My45MjkyODQxNmYsCisgIDg2Mi4zMjAzNDI0OWYsIDg3MC43MjMwMzU1OGYsIDg3OS4xMzcyNzAzNmYsIDg4Ny41NjI5NTUyMmYsCisgIDg5Ni4wMDAwMDAwMGYsIDkwNC40NDgzMTU5NWYsIDkxMi45MDc4MTU2OWYsIDkyMS4zNzg0MTMyMGYsCisgIDkyOS44NjAwMjM3NmYsIDkzOC4zNTI1NjM5MmYsIDk0Ni44NTU5NTE1MmYsIDk1NS4zNzAxMDU2MGYsCisgIDk2My44OTQ5NDY0MWYsIDk3Mi40MzAzOTUzN2YsIDk4MC45NzYzNzUwNGYsIDk4OS41MzI4MDkxMWYsCisgIDk5OC4wOTk2MjIzN2YsIDEwMDYuNjc2NzQwNjlmLCAxMDE1LjI2NDA5MDk3ZiwgMTAyMy44NjE2MDExNmYsCisgIDEwMzIuNDY5MjAwMjFmLCAxMDQxLjA4NjgxODA1ZiwgMTA0OS43MTQzODU2MGYsIDEwNTguMzUxODM0NjlmLAorICAxMDY2Ljk5OTA5ODExZiwgMTA3NS42NTYxMDk1NWYsIDEwODQuMzIyODAzNTdmLCAxMDkyLjk5OTExNTY0ZiwKKyAgMTEwMS42ODQ5ODIwNGYsIDExMTAuMzgwMzM5OTNmLCAxMTE5LjA4NTEyNzI3ZiwgMTEyNy43OTkyODI4MmYsCisgIDExMzYuNTIyNzQ2MTRmLCAxMTQ1LjI1NTQ1NzU4ZiwgMTE1My45OTczNTgyMWYsIDExNjIuNzQ4Mzg5ODlmLAorICAxMTcxLjUwODQ5NTE4ZiwgMTE4MC4yNzc2MTczOGYsIDExODkuMDU1NzAwNDdmLCAxMTk3Ljg0MjY4OTE0ZiwKKyAgMTIwNi42Mzg1Mjg3NmYsIDEyMTUuNDQzMTY1MzVmLCAxMjI0LjI1NjU0NTYwZiwgMTIzMy4wNzg2MTY4NGYsCisgIDEyNDEuOTA5MzI3MDNmLCAxMjUwLjc0ODYyNDczZiwgMTI1OS41OTY0NTkxNGYsIDEyNjguNDUyNzgwMDVmLAorICAxMjc3LjMxNzUzNzgxZiwgMTI4Ni4xOTA2ODMzOGYsIDEyOTUuMDcyMTY4MjhmLCAxMzAzLjk2MTk0NDU3ZiwKKyAgMTMxMi44NTk5NjQ4OGYsIDEzMjEuNzY2MTgyMzZmLCAxMzMwLjY4MDU1MDcxZiwgMTMzOS42MDMwMjQxM2YsCisgIDEzNDguNTMzNTU3MzRmLCAxMzU3LjQ3MjEwNTU2ZiwgMTM2Ni40MTg2MjQ1MmYsIDEzNzUuMzczMDcwNDFmLAorICAxMzg0LjMzNTM5OTkxZiwgMTM5My4zMDU1NzAyMGYsIDE0MDIuMjgzNTM4ODdmLCAxNDExLjI2OTI2NDAwZiwKKyAgMTQyMC4yNjI3MDQxMmYsIDE0MjkuMjYzODE4MThmLCAxNDM4LjI3MjU2NTU4ZiwgMTQ0Ny4yODg5MDYxNWYsCisgIDE0NTYuMzEyODAwMTRmLCAxNDY1LjM0NDIwODE5ZiwgMTQ3NC4zODMwOTEzOGYsIDE0ODMuNDI5NDExMThmLAorICAxNDkyLjQ4MzEyOTQ1ZiwgMTUwMS41NDQyMDg0M2YsIDE1MTAuNjEyNjEwNzhmLCAxNTE5LjY4ODI5OTQ5ZiwKKyAgMTUyOC43NzEyMzc5NWYsIDE1MzcuODYxMzg5OTNmLCAxNTQ2Ljk1ODcxOTUyZiwgMTU1Ni4wNjMxOTExOWYsCisgIDE1NjUuMTc0NzY5NzZmLCAxNTc0LjI5MzQyMDQwZiwgMTU4My40MTkxMDg2MGYsIDE1OTIuNTUxODAwMjBmLAorICAxNjAxLjY5MTQ2MTM3ZiwgMTYxMC44MzgwNTg2MGYsIDE2MTkuOTkxNTU4NzFmLCAxNjI5LjE1MTkyODgyZiwKKyAgMTYzOC4zMTkxMzYzN2YsIDE2NDcuNDkzMTQ5MTFmLCAxNjU2LjY3MzkzNTA5ZiwgMTY2NS44NjE0NjI2NmYsCisgIDE2NzUuMDU1NzAwNDdmLCAxNjg0LjI1NjYxNzQ0ZiwgMTY5My40NjQxODI4MGYsIDE3MDIuNjc4MzY2MDVmLAorICAxNzExLjg5OTEzNjk4ZiwgMTcyMS4xMjY0NjU2M2YsIDE3MzAuMzYwMzIyMzNmLCAxNzM5LjYwMDY3NzY4ZiwKKyAgMTc0OC44NDc1MDI1NGYsIDE3NTguMTAwNzY4MDJmLCAxNzY3LjM2MDQ0NTUxZiwgMTc3Ni42MjY1MDY2MmYsCisgIDE3ODUuODk4OTIzMjNmLCAxNzk1LjE3NzY2NzQ3ZiwgMTgwNC40NjI3MTE3MmYsIDE4MTMuNzU0MDI4NTdmLAorICAxODIzLjA1MTU5MDg3ZiwgMTgzMi4zNTUzNzE3MGYsIDE4NDEuNjY1MzQ0MzhmLCAxODUwLjk4MTQ4MjQ0ZiwKKyAgMTg2MC4zMDM3NTk2NWYsIDE4NjkuNjMyMTQ5OTlmLCAxODc4Ljk2NjYyNzY3ZiwgMTg4OC4zMDcxNjcxMWYsCisgIDE4OTcuNjUzNzQyOTVmLCAxOTA3LjAwNjMzMDAzZiwgMTkxNi4zNjQ5MDM0MmYsIDE5MjUuNzI5NDM4MzhmLAorICAxOTM1LjA5OTkxMDM3ZiwgMTk0NC40NzYyOTUwNmYsIDE5NTMuODU4NTY4MzFmLCAxOTYzLjI0NjcwNjIwZiwKKyAgMTk3Mi42NDA2ODQ5OGYsIDE5ODIuMDQwNDgxMDhmLCAxOTkxLjQ0NjA3MTE3ZiwgMjAwMC44NTc0MzIwNGYsCisgIDIwMTAuMjc0NTQwNzJmLCAyMDE5LjY5NzM3NDQwZiwgMjAyOS4xMjU5MTA0NGYsIDIwMzguNTYwMTI2NDBmCit9OworCitjb25zdCBWUDhMUHJlZml4Q29kZSBrUHJlZml4RW5jb2RlQ29kZVtQUkVGSVhfTE9PS1VQX0lEWF9NQVhdID0geworICB7IDAsIDB9LCB7IDAsIDB9LCB7IDEsIDB9LCB7IDIsIDB9LCB7IDMsIDB9LCB7IDQsIDF9LCB7IDQsIDF9LCB7IDUsIDF9LAorICB7IDUsIDF9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDYsIDJ9LCB7IDcsIDJ9LCB7IDcsIDJ9LCB7IDcsIDJ9LAorICB7IDcsIDJ9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LCB7IDgsIDN9LAorICB7IDgsIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LCB7IDksIDN9LAorICB7IDksIDN9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LAorICB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LCB7MTAsIDR9LAorICB7MTAsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LAorICB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LCB7MTEsIDR9LAorICB7MTEsIDR9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LCB7MTIsIDV9LAorICB7MTIsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LCB7MTMsIDV9LAorICB7MTMsIDV9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LCB7MTQsIDZ9LAorICB7MTQsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LCB7MTUsIDZ9LAorICB7MTUsIDZ9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LCB7MTYsIDd9LAorICB7MTYsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorICB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LCB7MTcsIDd9LAorfTsKKworY29uc3QgdWludDhfdCBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXSA9IHsKKyAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMiwgIDMsICAwLCAgMSwgIDIsICAzLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksCisgIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAorICA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwKKyAgMTI3LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksCisgIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LAorICA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwKKyAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNgorfTsKKworc3RhdGljIGZsb2F0IEZhc3RTTG9nMlNsb3codWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIGludCBsb2dfY250ID0gMDsKKyAgICB1aW50MzJfdCB5ID0gMTsKKyAgICBpbnQgY29ycmVjdGlvbiA9IDA7CisgICAgY29uc3QgZmxvYXQgdl9mID0gKGZsb2F0KXY7CisgICAgY29uc3QgdWludDMyX3Qgb3JpZ192ID0gdjsKKyAgICBkbyB7CisgICAgICArK2xvZ19jbnQ7CisgICAgICB2ID0gdiA+PiAxOworICAgICAgeSA9IHkgPDwgMTsKKyAgICB9IHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgICAgLy8gdmYgPSAoMl5sb2dfY250KSAqIFhmOyB3aGVyZSB5ID0gMl5sb2dfY250IGFuZCBYZiA8IDI1NgorICAgIC8vIFhmID0gZmxvb3IoWGYpICogKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBsb2cyKFhmKSA9IGxvZzIoZmxvb3IoWGYpKSArIGxvZzIoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIFRoZSBjb3JyZWN0aW9uIGZhY3RvcjogbG9nKDEgKyBkKSB+IGQ7IGZvciB2ZXJ5IHNtYWxsIGQgdmFsdWVzLCBzbworICAgIC8vIGxvZzIoMSArICh2ICUgeSkgLyB2KSB+IExPR18yX1JFQ0lQUk9DQUwgKiAodiAlIHkpL3YKKyAgICAvLyBMT0dfMl9SRUNJUFJPQ0FMIH4gMjMvMTYKKyAgICBjb3JyZWN0aW9uID0gKDIzICogKG9yaWdfdiAmICh5IC0gMSkpKSA+PiA0OworICAgIHJldHVybiB2X2YgKiAoa0xvZzJUYWJsZVt2XSArIGxvZ19jbnQpICsgY29ycmVjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogdiAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCitzdGF0aWMgZmxvYXQgRmFzdExvZzJTbG93KHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICBpbnQgbG9nX2NudCA9IDA7CisgICAgdWludDMyX3QgeSA9IDE7CisgICAgY29uc3QgdWludDMyX3Qgb3JpZ192ID0gdjsKKyAgICBkb3VibGUgbG9nXzI7CisgICAgZG8geworICAgICAgKytsb2dfY250OworICAgICAgdiA9IHYgPj4gMTsKKyAgICAgIHkgPSB5IDw8IDE7CisgICAgfSB3aGlsZSAodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICAgIGxvZ18yID0ga0xvZzJUYWJsZVt2XSArIGxvZ19jbnQ7CisgICAgaWYgKG9yaWdfdiA+PSBBUFBST1hfTE9HX01BWCkgeworICAgICAgLy8gU2luY2UgdGhlIGRpdmlzaW9uIGlzIHN0aWxsIGV4cGVuc2l2ZSwgYWRkIHRoaXMgY29ycmVjdGlvbiBmYWN0b3Igb25seQorICAgICAgLy8gZm9yIGxhcmdlIHZhbHVlcyBvZiAndicuCisgICAgICBjb25zdCBpbnQgY29ycmVjdGlvbiA9ICgyMyAqIChvcmlnX3YgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICAgIGxvZ18yICs9IChkb3VibGUpY29ycmVjdGlvbiAvIG9yaWdfdjsKKyAgICB9CisgICAgcmV0dXJuIChmbG9hdClsb2dfMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKKy8vIE1vc3RseSB1c2VkIHRvIHJlZHVjZSBjb2RlIHNpemUgKyByZWFkYWJpbGl0eQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNaW4oaW50IGEsIGludCBiKSB7IHJldHVybiAoYSA+IGIpID8gYiA6IGE7IH0KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TWF4KGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGIgOiBhOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRob2RzIHRvIGNhbGN1bGF0ZSBFbnRyb3B5IChTaGFubm9uKS4KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb25zdCBpbnQgY291bnRzWzI1Nl0sIGludCB3ZWlnaHRfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGV4cF92YWwpIHsKKyAgY29uc3QgaW50IHNpZ25pZmljYW50X3N5bWJvbHMgPSAyNTYgPj4gNDsKKyAgY29uc3QgZG91YmxlIGV4cF9kZWNheV9mYWN0b3IgPSAwLjY7CisgIGRvdWJsZSBiaXRzID0gd2VpZ2h0XzAgKiBjb3VudHNbMF07CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDwgc2lnbmlmaWNhbnRfc3ltYm9sczsgKytpKSB7CisgICAgYml0cyArPSBleHBfdmFsICogKGNvdW50c1tpXSArIGNvdW50c1syNTYgLSBpXSk7CisgICAgZXhwX3ZhbCAqPSBleHBfZGVjYXlfZmFjdG9yOworICB9CisgIHJldHVybiAoZmxvYXQpKC0wLjEgKiBiaXRzKTsKK30KKworLy8gQ29tcHV0ZSB0aGUgY29tYmluZWQgU2hhbm9uJ3MgZW50cm9weSBmb3IgZGlzdHJpYnV0aW9uIHtYfSBhbmQge1grWX0KK3N0YXRpYyBmbG9hdCBDb21iaW5lZFNoYW5ub25FbnRyb3B5KGNvbnN0IGludCBYWzI1Nl0sIGNvbnN0IGludCBZWzI1Nl0pIHsKKyAgaW50IGk7CisgIGRvdWJsZSByZXR2YWwgPSAwLjsKKyAgaW50IHN1bVggPSAwLCBzdW1YWSA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIGNvbnN0IGludCB4ID0gWFtpXTsKKyAgICBpZiAoeCAhPSAwKSB7CisgICAgICBjb25zdCBpbnQgeHkgPSB4ICsgWVtpXTsKKyAgICAgIHN1bVggKz0geDsKKyAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHgpOworICAgICAgc3VtWFkgKz0geHk7CisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih4eSk7CisgICAgfSBlbHNlIGlmIChZW2ldICE9IDApIHsKKyAgICAgIHN1bVhZICs9IFlbaV07CisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMihZW2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dmFsICs9IFZQOExGYXN0U0xvZzIoc3VtWCkgKyBWUDhMRmFzdFNMb2cyKHN1bVhZKTsKKyAgcmV0dXJuIChmbG9hdClyZXR2YWw7Cit9CisKK3N0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdFNwYXRpYWxIaXN0b2dyYW0oY29uc3QgaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0aWxlWzRdWzI1Nl0pIHsKKyAgaW50IGk7CisgIGRvdWJsZSByZXR2YWwgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgZG91YmxlIGtFeHBWYWx1ZSA9IDAuOTQ7CisgICAgcmV0dmFsICs9IFByZWRpY3Rpb25Db3N0U3BhdGlhbCh0aWxlW2ldLCAxLCBrRXhwVmFsdWUpOworICAgIHJldHZhbCArPSBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSh0aWxlW2ldLCBhY2N1bXVsYXRlZFtpXSk7CisgIH0KKyAgcmV0dXJuIChmbG9hdClyZXR2YWw7Cit9CisKK3ZvaWQgVlA4TEJpdEVudHJvcHlJbml0KFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5KSB7CisgIGVudHJvcHktPmVudHJvcHkgPSAwLjsKKyAgZW50cm9weS0+c3VtID0gMDsKKyAgZW50cm9weS0+bm9uemVyb3MgPSAwOworICBlbnRyb3B5LT5tYXhfdmFsID0gMDsKKyAgZW50cm9weS0+bm9uemVyb19jb2RlID0gVlA4TF9OT05fVFJJVklBTF9TWU07Cit9CisKK3ZvaWQgVlA4TEJpdHNFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheSwgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSkgeworICBpbnQgaTsKKworICBWUDhMQml0RW50cm9weUluaXQoZW50cm9weSk7CisKKyAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgIGlmIChhcnJheVtpXSAhPSAwKSB7CisgICAgICBlbnRyb3B5LT5zdW0gKz0gYXJyYXlbaV07CisgICAgICBlbnRyb3B5LT5ub256ZXJvX2NvZGUgPSBpOworICAgICAgKytlbnRyb3B5LT5ub256ZXJvczsKKyAgICAgIGVudHJvcHktPmVudHJvcHkgLT0gVlA4TEZhc3RTTG9nMihhcnJheVtpXSk7CisgICAgICBpZiAoZW50cm9weS0+bWF4X3ZhbCA8IGFycmF5W2ldKSB7CisgICAgICAgIGVudHJvcHktPm1heF92YWwgPSBhcnJheVtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGVudHJvcHktPnN1bSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoCisgICAgdWludDMyX3QgdmFsLCBpbnQgaSwgdWludDMyX3QqIGNvbnN0IHZhbF9wcmV2LCBpbnQqIGNvbnN0IGlfcHJldiwKKyAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBjb25zdCBpbnQgc3RyZWFrID0gaSAtICppX3ByZXY7CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBiaXQgZW50cm9weS4KKyAgaWYgKCp2YWxfcHJldiAhPSAwKSB7CisgICAgYml0X2VudHJvcHktPnN1bSArPSAoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBiaXRfZW50cm9weS0+bm9uemVyb3MgKz0gc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvX2NvZGUgPSAqaV9wcmV2OworICAgIGJpdF9lbnRyb3B5LT5lbnRyb3B5IC09IFZQOExGYXN0U0xvZzIoKnZhbF9wcmV2KSAqIHN0cmVhazsKKyAgICBpZiAoYml0X2VudHJvcHktPm1heF92YWwgPCAqdmFsX3ByZXYpIHsKKyAgICAgIGJpdF9lbnRyb3B5LT5tYXhfdmFsID0gKnZhbF9wcmV2OworICAgIH0KKyAgfQorCisgIC8vIEdhdGhlciBpbmZvIGZvciB0aGUgSHVmZm1hbiBjb3N0LgorICBzdGF0cy0+Y291bnRzWyp2YWxfcHJldiAhPSAwXSArPSAoc3RyZWFrID4gMyk7CisgIHN0YXRzLT5zdHJlYWtzWyp2YWxfcHJldiAhPSAwXVsoc3RyZWFrID4gMyldICs9IHN0cmVhazsKKworICAqdmFsX3ByZXYgPSB2YWw7CisgICppX3ByZXYgPSBpOworfQorCit2b2lkIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkKGNvbnN0IHVpbnQzMl90KiBjb25zdCBYLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQgaTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHhfcHJldiA9IFhbMF07CisKKyAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgIFZQOExCaXRFbnRyb3B5SW5pdChiaXRfZW50cm9weSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgeCA9IFhbaV07CisgICAgaWYgKHggIT0geF9wcmV2KSB7CisgICAgICBWUDhMR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4LCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworICAgIH0KKyAgfQorICBWUDhMR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeF9wcmV2LCAmaV9wcmV2LCBiaXRfZW50cm9weSwgc3RhdHMpOworCisgIGJpdF9lbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoYml0X2VudHJvcHktPnN1bSk7Cit9CisKK3ZvaWQgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZChjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgWSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCBpID0gMTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHh5X3ByZXYgPSBYWzBdICsgWVswXTsKKworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgVlA4TEJpdEVudHJvcHlJbml0KGJpdF9lbnRyb3B5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4eSA9IFhbaV0gKyBZW2ldOworICAgIGlmICh4eSAhPSB4eV9wcmV2KSB7CisgICAgICBWUDhMR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcih4eSwgaSwgJnh5X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMpOworICAgIH0KKyAgfQorICBWUDhMR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeHlfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKworICBiaXRfZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGJpdF9lbnRyb3B5LT5zdW0pOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBVcGRhdGVIaXN0byhpbnQgaGlzdG9fYXJnYls0XVsyNTZdLCB1aW50MzJfdCBhcmdiKSB7CisgICsraGlzdG9fYXJnYlswXVthcmdiID4+IDI0XTsKKyAgKytoaXN0b19hcmdiWzFdWyhhcmdiID4+IDE2KSAmIDB4ZmZdOworICArK2hpc3RvX2FyZ2JbMl1bKGFyZ2IgPj4gOCkgJiAweGZmXTsKKyAgKytoaXN0b19hcmdiWzNdW2FyZ2IgJiAweGZmXTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFByZWRpY3QoVlA4TFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGN1cnJlbnRfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHVwcGVyX3JvdykgeworICBpZiAoeSA9PSAwKSB7CisgICAgcmV0dXJuICh4ID09IDApID8gQVJHQl9CTEFDSyA6IGN1cnJlbnRfcm93W3ggLSAxXTsgIC8vIExlZnQuCisgIH0gZWxzZSBpZiAoeCA9PSAwKSB7CisgICAgcmV0dXJuIHVwcGVyX3Jvd1t4XTsgIC8vIFRvcC4KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcHJlZF9mdW5jKGN1cnJlbnRfcm93W3ggLSAxXSwgdXBwZXJfcm93ICsgeCk7CisgIH0KK30KKworc3RhdGljIGludCBNYXhEaWZmQmV0d2VlblBpeGVscyh1aW50MzJfdCBwMSwgdWludDMyX3QgcDIpIHsKKyAgY29uc3QgaW50IGRpZmZfYSA9IGFicygoaW50KShwMSA+PiAyNCkgLSAoaW50KShwMiA+PiAyNCkpOworICBjb25zdCBpbnQgZGlmZl9yID0gYWJzKChpbnQpKChwMSA+PiAxNikgJiAweGZmKSAtIChpbnQpKChwMiA+PiAxNikgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2cgPSBhYnMoKGludCkoKHAxID4+IDgpICYgMHhmZikgLSAoaW50KSgocDIgPj4gOCkgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2IgPSBhYnMoKGludCkocDEgJiAweGZmKSAtIChpbnQpKHAyICYgMHhmZikpOworICByZXR1cm4gR2V0TWF4KEdldE1heChkaWZmX2EsIGRpZmZfciksIEdldE1heChkaWZmX2csIGRpZmZfYikpOworfQorCitzdGF0aWMgaW50IE1heERpZmZBcm91bmRQaXhlbCh1aW50MzJfdCBjdXJyZW50LCB1aW50MzJfdCB1cCwgdWludDMyX3QgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KSB7CisgIGNvbnN0IGludCBkaWZmX3VwID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgdXApOworICBjb25zdCBpbnQgZGlmZl9kb3duID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgZG93bik7CisgIGNvbnN0IGludCBkaWZmX2xlZnQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCBsZWZ0KTsKKyAgY29uc3QgaW50IGRpZmZfcmlnaHQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCByaWdodCk7CisgIHJldHVybiBHZXRNYXgoR2V0TWF4KGRpZmZfdXAsIGRpZmZfZG93biksIEdldE1heChkaWZmX2xlZnQsIGRpZmZfcmlnaHQpKTsKK30KKworc3RhdGljIHVpbnQzMl90IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSAoYXJnYiA+PiA4KSAmIDB4ZmY7CisgIHVpbnQzMl90IHJlZF9ibHVlID0gYXJnYiAmIDB4MDBmZjAwZmZ1OworICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47CisgIHJlZF9ibHVlICY9IDB4MDBmZjAwZmZ1OworICByZXR1cm4gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCByZWRfYmx1ZTsKK30KKworc3RhdGljIHZvaWQgTWF4RGlmZnNGb3JSb3coaW50IHdpZHRoLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcywgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgdWludDMyX3QgY3VycmVudCwgdXAsIGRvd24sIGxlZnQsIHJpZ2h0OworICBpbnQgeDsKKyAgaWYgKHdpZHRoIDw9IDIpIHJldHVybjsKKyAgY3VycmVudCA9IGFyZ2JbMF07CisgIHJpZ2h0ID0gYXJnYlsxXTsKKyAgaWYgKHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgICBjdXJyZW50ID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoY3VycmVudCk7CisgICAgcmlnaHQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZChyaWdodCk7CisgIH0KKyAgLy8gbWF4X2RpZmZzWzBdIGFuZCBtYXhfZGlmZnNbd2lkdGggLSAxXSBhcmUgbmV2ZXIgdXNlZC4KKyAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgKyt4KSB7CisgICAgdXAgPSBhcmdiWy1zdHJpZGUgKyB4XTsKKyAgICBkb3duID0gYXJnYltzdHJpZGUgKyB4XTsKKyAgICBsZWZ0ID0gY3VycmVudDsKKyAgICBjdXJyZW50ID0gcmlnaHQ7CisgICAgcmlnaHQgPSBhcmdiW3ggKyAxXTsKKyAgICBpZiAodXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICAgICAgdXAgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1cCk7CisgICAgICBkb3duID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoZG93bik7CisgICAgICByaWdodCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHJpZ2h0KTsKKyAgICB9CisgICAgbWF4X2RpZmZzW3hdID0gTWF4RGlmZkFyb3VuZFBpeGVsKGN1cnJlbnQsIHVwLCBkb3duLCBsZWZ0LCByaWdodCk7CisgIH0KK30KKworLy8gUXVhbnRpemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGNvbXBvbmVudCB2YWx1ZSBhbmQgaXRzIHByZWRpY3Rpb24KKy8vIHRvIGEgbXVsdGlwbGUgb2YgcXVhbnRpemF0aW9uLCB3b3JraW5nIG1vZHVsbyAyNTYsIHRha2luZyBjYXJlIG5vdCB0byBjcm9zcworLy8gYSBib3VuZGFyeSAoaW5jbHVzaXZlIHVwcGVyIGxpbWl0KS4KK3N0YXRpYyB1aW50OF90IE5lYXJMb3NzbGVzc0NvbXBvbmVudCh1aW50OF90IHZhbHVlLCB1aW50OF90IHByZWRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBib3VuZGFyeSwgaW50IHF1YW50aXphdGlvbikgeworICBjb25zdCBpbnQgcmVzaWR1YWwgPSAodmFsdWUgLSBwcmVkaWN0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBib3VuZGFyeV9yZXNpZHVhbCA9IChib3VuZGFyeSAtIHByZWRpY3QpICYgMHhmZjsKKyAgY29uc3QgaW50IGxvd2VyID0gcmVzaWR1YWwgJiB+KHF1YW50aXphdGlvbiAtIDEpOworICBjb25zdCBpbnQgdXBwZXIgPSBsb3dlciArIHF1YW50aXphdGlvbjsKKyAgLy8gUmVzb2x2ZSB0aWVzIHRvd2FyZHMgYSB2YWx1ZSBjbG9zZXIgdG8gdGhlIHByZWRpY3Rpb24gKGkuZS4gdG93YXJkcyBsb3dlcgorICAvLyBpZiB2YWx1ZSBjb21lcyBhZnRlciBwcmVkaWN0aW9uIGFuZCB0b3dhcmRzIHVwcGVyIG90aGVyd2lzZSkuCisgIGNvbnN0IGludCBiaWFzID0gKChib3VuZGFyeSAtIHZhbHVlKSAmIDB4ZmYpIDwgYm91bmRhcnlfcmVzaWR1YWw7CisgIGlmIChyZXNpZHVhbCAtIGxvd2VyIDwgdXBwZXIgLSByZXNpZHVhbCArIGJpYXMpIHsKKyAgICAvLyBsb3dlciBpcyBjbG9zZXIgdG8gcmVzaWR1YWwgdGhhbiB1cHBlci4KKyAgICBpZiAocmVzaWR1YWwgPiBib3VuZGFyeV9yZXNpZHVhbCAmJiBsb3dlciA8PSBib3VuZGFyeV9yZXNpZHVhbCkgeworICAgICAgLy8gSGFsdmUgcXVhbnRpemF0aW9uIHN0ZXAgdG8gYXZvaWQgY3Jvc3NpbmcgYm91bmRhcnkuIFRoaXMgbWlkcG9pbnQgaXMKKyAgICAgIC8vIG9uIHRoZSBzYW1lIHNpZGUgb2YgYm91bmRhcnkgYXMgcmVzaWR1YWwgYmVjYXVzZSBtaWRwb2ludCA+PSByZXNpZHVhbAorICAgICAgLy8gKHNpbmNlIGxvd2VyIGlzIGNsb3NlciB0aGFuIHVwcGVyKSBhbmQgcmVzaWR1YWwgaXMgYWJvdmUgdGhlIGJvdW5kYXJ5LgorICAgICAgcmV0dXJuIGxvd2VyICsgKHF1YW50aXphdGlvbiA+PiAxKTsKKyAgICB9CisgICAgcmV0dXJuIGxvd2VyOworICB9IGVsc2UgeworICAgIC8vIHVwcGVyIGlzIGNsb3NlciB0byByZXNpZHVhbCB0aGFuIGxvd2VyLgorICAgIGlmIChyZXNpZHVhbCA8PSBib3VuZGFyeV9yZXNpZHVhbCAmJiB1cHBlciA+IGJvdW5kYXJ5X3Jlc2lkdWFsKSB7CisgICAgICAvLyBIYWx2ZSBxdWFudGl6YXRpb24gc3RlcCB0byBhdm9pZCBjcm9zc2luZyBib3VuZGFyeS4gVGhpcyBtaWRwb2ludCBpcworICAgICAgLy8gb24gdGhlIHNhbWUgc2lkZSBvZiBib3VuZGFyeSBhcyByZXNpZHVhbCBiZWNhdXNlIG1pZHBvaW50IDw9IHJlc2lkdWFsCisgICAgICAvLyAoc2luY2UgdXBwZXIgaXMgY2xvc2VyIHRoYW4gbG93ZXIpIGFuZCByZXNpZHVhbCBpcyBiZWxvdyB0aGUgYm91bmRhcnkuCisgICAgICByZXR1cm4gbG93ZXIgKyAocXVhbnRpemF0aW9uID4+IDEpOworICAgIH0KKyAgICByZXR1cm4gdXBwZXIgJiAweGZmOworICB9Cit9CisKKy8vIFF1YW50aXplIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgcGl4ZWwgdmFsdWUgYW5kCisvLyBpdHMgcHJlZGljdGlvbiB0byBhIG11bHRpcGxlIG9mIGEgcXVhbnRpemF0aW9uIChhIHBvd2VyIG9mIDIsIG5vdCBsYXJnZXIgdGhhbgorLy8gbWF4X3F1YW50aXphdGlvbiB3aGljaCBpcyBhIHBvd2VyIG9mIDIsIHNtYWxsZXIgdGhhbiBtYXhfZGlmZikuIFRha2UgY2FyZSBpZgorLy8gdmFsdWUgYW5kIHByZWRpY3QgaGF2ZSB1bmRlcmdvbmUgc3VidHJhY3QgZ3JlZW4sIHdoaWNoIG1lYW5zIHRoYXQgcmVkIGFuZAorLy8gYmx1ZSBhcmUgcmVwcmVzZW50ZWQgYXMgb2Zmc2V0cyBmcm9tIGdyZWVuLgorc3RhdGljIHVpbnQzMl90IE5lYXJMb3NzbGVzcyh1aW50MzJfdCB2YWx1ZSwgdWludDMyX3QgcHJlZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9xdWFudGl6YXRpb24sIGludCBtYXhfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgaW50IHF1YW50aXphdGlvbjsKKyAgdWludDhfdCBuZXdfZ3JlZW4gPSAwOworICB1aW50OF90IGdyZWVuX2RpZmYgPSAwOworICB1aW50OF90IGEsIHIsIGcsIGI7CisgIGlmIChtYXhfZGlmZiA8PSAyKSB7CisgICAgcmV0dXJuIFZQOExTdWJQaXhlbHModmFsdWUsIHByZWRpY3QpOworICB9CisgIHF1YW50aXphdGlvbiA9IG1heF9xdWFudGl6YXRpb247CisgIHdoaWxlIChxdWFudGl6YXRpb24gPj0gbWF4X2RpZmYpIHsKKyAgICBxdWFudGl6YXRpb24gPj49IDE7CisgIH0KKyAgaWYgKCh2YWx1ZSA+PiAyNCkgPT0gMCB8fCAodmFsdWUgPj4gMjQpID09IDB4ZmYpIHsKKyAgICAvLyBQcmVzZXJ2ZSB0cmFuc3BhcmVuY3kgb2YgZnVsbHkgdHJhbnNwYXJlbnQgb3IgZnVsbHkgb3BhcXVlIHBpeGVscy4KKyAgICBhID0gKCh2YWx1ZSA+PiAyNCkgLSAocHJlZGljdCA+PiAyNCkpICYgMHhmZjsKKyAgfSBlbHNlIHsKKyAgICBhID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KHZhbHVlID4+IDI0LCBwcmVkaWN0ID4+IDI0LCAweGZmLCBxdWFudGl6YXRpb24pOworICB9CisgIGcgPSBOZWFyTG9zc2xlc3NDb21wb25lbnQoKHZhbHVlID4+IDgpICYgMHhmZiwgKHByZWRpY3QgPj4gOCkgJiAweGZmLCAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbik7CisgIGlmICh1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgICAgLy8gVGhlIGdyZWVuIG9mZnNldCB3aWxsIGJlIGFkZGVkIHRvIHJlZCBhbmQgYmx1ZSBjb21wb25lbnRzIGR1cmluZyBkZWNvZGluZworICAgIC8vIHRvIG9idGFpbiB0aGUgYWN0dWFsIHJlZCBhbmQgYmx1ZSB2YWx1ZXMuCisgICAgbmV3X2dyZWVuID0gKChwcmVkaWN0ID4+IDgpICsgZykgJiAweGZmOworICAgIC8vIFRoZSBhbW91bnQgYnkgd2hpY2ggZ3JlZW4gaGFzIGJlZW4gYWRqdXN0ZWQgZHVyaW5nIHF1YW50aXphdGlvbi4gSXQgaXMKKyAgICAvLyBzdWJ0cmFjdGVkIGZyb20gcmVkIGFuZCBibHVlIGZvciBjb21wZW5zYXRpb24sIHRvIGF2b2lkIGFjY3VtdWxhdGluZyB0d28KKyAgICAvLyBxdWFudGl6YXRpb24gZXJyb3JzIGluIHRoZW0uCisgICAgZ3JlZW5fZGlmZiA9IChuZXdfZ3JlZW4gLSAodmFsdWUgPj4gOCkpICYgMHhmZjsKKyAgfQorICByID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KCgodmFsdWUgPj4gMTYpIC0gZ3JlZW5fZGlmZikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVkaWN0ID4+IDE2KSAmIDB4ZmYsIDB4ZmYgLSBuZXdfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uKTsKKyAgYiA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudCgodmFsdWUgLSBncmVlbl9kaWZmKSAmIDB4ZmYsIHByZWRpY3QgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYgLSBuZXdfZ3JlZW4sIHF1YW50aXphdGlvbik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8ICgodWludDMyX3QpZyA8PCA4KSB8IGI7Cit9CisKKy8vIFJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcGl4ZWwgYW5kIGl0cyBwcmVkaWN0aW9uLiBJbiBjYXNlIG9mIGEKKy8vIGxvc3N5IGVuY29kaW5nLCB1cGRhdGVzIHRoZSBzb3VyY2UgaW1hZ2UgdG8gYXZvaWQgcHJvcGFnYXRpbmcgdGhlIGRldmlhdGlvbgorLy8gZnVydGhlciB0byBwaXhlbHMgd2hpY2ggZGVwZW5kIG9uIHRoZSBjdXJyZW50IHBpeGVsIGZvciB0aGVpciBwcmVkaWN0aW9ucy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRSZXNpZHVhbChpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHVwcGVyX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgY3VycmVudF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgbWF4X2RpZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBWUDhMUHJlZGljdG9yRnVuYyBwcmVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgbWF4X3F1YW50aXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWRpY3QgPSBQcmVkaWN0KHByZWRfZnVuYywgeCwgeSwgY3VycmVudF9yb3csIHVwcGVyX3Jvdyk7CisgIHVpbnQzMl90IHJlc2lkdWFsOworICBpZiAobWF4X3F1YW50aXphdGlvbiA9PSAxIHx8IG1vZGUgPT0gMCB8fCB5ID09IDAgfHwgeSA9PSBoZWlnaHQgLSAxIHx8CisgICAgICB4ID09IDAgfHwgeCA9PSB3aWR0aCAtIDEpIHsKKyAgICByZXNpZHVhbCA9IFZQOExTdWJQaXhlbHMoY3VycmVudF9yb3dbeF0sIHByZWRpY3QpOworICB9IGVsc2UgeworICAgIHJlc2lkdWFsID0gTmVhckxvc3NsZXNzKGN1cnJlbnRfcm93W3hdLCBwcmVkaWN0LCBtYXhfcXVhbnRpemF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmc1t4XSwgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisgICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgY3VycmVudF9yb3dbeF0gPSBWUDhMQWRkUGl4ZWxzKHByZWRpY3QsIHJlc2lkdWFsKTsKKyAgICAvLyB4IGlzIG5ldmVyIDAgaGVyZSBzbyB3ZSBkbyBub3QgbmVlZCB0byB1cGRhdGUgdXBwZXJfcm93IGxpa2UgYmVsb3cuCisgIH0KKyAgaWYgKCFleGFjdCAmJiAoY3VycmVudF9yb3dbeF0gJiBrTWFza0FscGhhKSA9PSAwKSB7CisgICAgLy8gSWYgYWxwaGEgaXMgMCwgY2xlYW51cCBSR0IuIFdlIGNhbiBjaG9vc2UgdGhlIFJHQiB2YWx1ZXMgb2YgdGhlIHJlc2lkdWFsCisgICAgLy8gZm9yIGJlc3QgY29tcHJlc3Npb24uIFRoZSBwcmVkaWN0aW9uIG9mIGFscGhhIGl0c2VsZiBjYW4gYmUgbm9uLXplcm8gYW5kCisgICAgLy8gbXVzdCBiZSBrZXB0IHRob3VnaC4gV2UgY2hvb3NlIFJHQiBvZiB0aGUgcmVzaWR1YWwgdG8gYmUgMC4KKyAgICByZXNpZHVhbCAmPSBrTWFza0FscGhhOworICAgIC8vIFVwZGF0ZSB0aGUgc291cmNlIGltYWdlLgorICAgIGN1cnJlbnRfcm93W3hdID0gcHJlZGljdCAmIH5rTWFza0FscGhhOworICAgIC8vIFRoZSBwcmVkaWN0aW9uIGZvciB0aGUgcmlnaHRtb3N0IHBpeGVsIGluIGEgcm93IHVzZXMgdGhlIGxlZnRtb3N0IHBpeGVsCisgICAgLy8gaW4gdGhhdCByb3cgYXMgaXRzIHRvcC1yaWdodCBjb250ZXh0IHBpeGVsLiBIZW5jZSBpZiB3ZSBjaGFuZ2UgdGhlCisgICAgLy8gbGVmdG1vc3QgcGl4ZWwgb2YgY3VycmVudF9yb3csIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZSBtdXN0IGJlIGFwcGxpZWQKKyAgICAvLyB0byB1cHBlcl9yb3cgYXMgd2VsbCB3aGVyZSB0b3AtcmlnaHQgY29udGV4dCBpcyBiZWluZyByZWFkIGZyb20uCisgICAgaWYgKHggPT0gMCAmJiB5ICE9IDApIHVwcGVyX3Jvd1t3aWR0aF0gPSBjdXJyZW50X3Jvd1swXTsKKyAgfQorICByZXR1cm4gcmVzaWR1YWw7Cit9CisKKy8vIFJldHVybnMgYmVzdCBwcmVkaWN0b3IgYW5kIHVwZGF0ZXMgdGhlIGFjY3VtdWxhdGVkIGhpc3RvZ3JhbS4KKy8vIElmIG1heF9xdWFudGl6YXRpb24gPiAxLCBhc3N1bWVzIHRoYXQgbmVhciBsb3NzbGVzcyBwcm9jZXNzaW5nIHdpbGwgYmUKKy8vIGFwcGxpZWQsIHF1YW50aXppbmcgcmVzaWR1YWxzIHRvIG11bHRpcGxlcyBvZiBxdWFudGl6YXRpb24gbGV2ZWxzIHVwIHRvCisvLyBtYXhfcXVhbnRpemF0aW9uICh0aGUgYWN0dWFsIHF1YW50aXphdGlvbiBsZXZlbCBkZXBlbmRzIG9uIHNtb290aG5lc3MgbmVhcgorLy8gdGhlIGdpdmVuIHBpeGVsKS4KK3N0YXRpYyBpbnQgR2V0QmVzdFByZWRpY3RvckZvclRpbGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3F1YW50aXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LCBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICBjb25zdCBpbnQga051bVByZWRNb2RlcyA9IDE0OworICBjb25zdCBpbnQgc3RhcnRfeCA9IHRpbGVfeCA8PCBiaXRzOworICBjb25zdCBpbnQgc3RhcnRfeSA9IHRpbGVfeSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgbWF4X3kgPSBHZXRNaW4odGlsZV9zaXplLCBoZWlnaHQgLSBzdGFydF95KTsKKyAgY29uc3QgaW50IG1heF94ID0gR2V0TWluKHRpbGVfc2l6ZSwgd2lkdGggLSBzdGFydF94KTsKKyAgLy8gV2hldGhlciB0aGVyZSBleGlzdCBjb2x1bW5zIGp1c3Qgb3V0c2lkZSB0aGUgdGlsZS4KKyAgY29uc3QgaW50IGhhdmVfbGVmdCA9IChzdGFydF94ID4gMCk7CisgIGNvbnN0IGludCBoYXZlX3JpZ2h0ID0gKG1heF94IDwgd2lkdGggLSBzdGFydF94KTsKKyAgLy8gUG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIHN0cmlwIGNvdmVyaW5nIHRoZSB0aWxlIGFuZCBhZGphY2VudCBjb2x1bW5zIGlmCisgIC8vIHRoZXkgZXhpc3QuCisgIGNvbnN0IGludCBjb250ZXh0X3N0YXJ0X3ggPSBzdGFydF94IC0gaGF2ZV9sZWZ0OworICBjb25zdCBpbnQgY29udGV4dF93aWR0aCA9IG1heF94ICsgaGF2ZV9sZWZ0ICsgaGF2ZV9yaWdodDsKKyAgLy8gVGhlIHdpZHRoIG9mIHVwcGVyX3JvdyBhbmQgY3VycmVudF9yb3cgaXMgb25lIHBpeGVsIGxhcmdlciB0aGFuIGltYWdlIHdpZHRoCisgIC8vIHRvIGFsbG93IHRoZSB0b3AgcmlnaHQgcGl4ZWwgdG8gcG9pbnQgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdworICAvLyB3aGVuIGF0IHRoZSByaWdodCBlZGdlLgorICB1aW50MzJfdCogdXBwZXJfcm93ID0gYXJnYl9zY3JhdGNoOworICB1aW50MzJfdCogY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aCArIDE7CisgIHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcyA9ICh1aW50OF90KikoY3VycmVudF9yb3cgKyB3aWR0aCArIDEpOworICBmbG9hdCBiZXN0X2RpZmYgPSBNQVhfRElGRl9DT1NUOworICBpbnQgYmVzdF9tb2RlID0gMDsKKyAgaW50IG1vZGU7CisgIGludCBoaXN0b19zdGFja18xWzRdWzI1Nl07CisgIGludCBoaXN0b19zdGFja18yWzRdWzI1Nl07CisgIC8vIE5lZWQgcG9pbnRlcnMgdG8gYmUgYWJsZSB0byBzd2FwIGFycmF5cy4KKyAgaW50ICgqaGlzdG9fYXJnYilbMjU2XSA9IGhpc3RvX3N0YWNrXzE7CisgIGludCAoKmJlc3RfaGlzdG8pWzI1Nl0gPSBoaXN0b19zdGFja18yOworICBpbnQgaSwgajsKKworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwga051bVByZWRNb2RlczsgKyttb2RlKSB7CisgICAgY29uc3QgVlA4TFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jID0gVlA4TFByZWRpY3RvcnNbbW9kZV07CisgICAgZmxvYXQgY3VyX2RpZmY7CisgICAgaW50IHJlbGF0aXZlX3k7CisgICAgbWVtc2V0KGhpc3RvX2FyZ2IsIDAsIHNpemVvZihoaXN0b19zdGFja18xKSk7CisgICAgaWYgKHN0YXJ0X3kgPiAwKSB7CisgICAgICAvLyBSZWFkIHRoZSByb3cgYWJvdmUgdGhlIHRpbGUgd2hpY2ggd2lsbCBiZWNvbWUgdGhlIGZpcnN0IHVwcGVyX3Jvdy4KKyAgICAgIC8vIEluY2x1ZGUgYSBwaXhlbCB0byB0aGUgbGVmdCBpZiBpdCBleGlzdHM7IGluY2x1ZGUgYSBwaXhlbCB0byB0aGUgcmlnaHQKKyAgICAgIC8vIGluIGFsbCBjYXNlcyAod3JhcHBpbmcgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdyBpZiBpdCBkb2VzCisgICAgICAvLyBub3QgZXhpc3QpLgorICAgICAgbWVtY3B5KGN1cnJlbnRfcm93ICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIGFyZ2IgKyAoc3RhcnRfeSAtIDEpICogd2lkdGggKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgc2l6ZW9mKCphcmdiKSAqIChtYXhfeCArIGhhdmVfbGVmdCArIDEpKTsKKyAgICB9CisgICAgZm9yIChyZWxhdGl2ZV95ID0gMDsgcmVsYXRpdmVfeSA8IG1heF95OyArK3JlbGF0aXZlX3kpIHsKKyAgICAgIGNvbnN0IGludCB5ID0gc3RhcnRfeSArIHJlbGF0aXZlX3k7CisgICAgICBpbnQgcmVsYXRpdmVfeDsKKyAgICAgIHVpbnQzMl90KiB0bXAgPSB1cHBlcl9yb3c7CisgICAgICB1cHBlcl9yb3cgPSBjdXJyZW50X3JvdzsKKyAgICAgIGN1cnJlbnRfcm93ID0gdG1wOworICAgICAgLy8gUmVhZCBjdXJyZW50X3Jvdy4gSW5jbHVkZSBhIHBpeGVsIHRvIHRoZSBsZWZ0IGlmIGl0IGV4aXN0czsgaW5jbHVkZSBhCisgICAgICAvLyBwaXhlbCB0byB0aGUgcmlnaHQgaW4gYWxsIGNhc2VzIGV4Y2VwdCBhdCB0aGUgYm90dG9tIHJpZ2h0IGNvcm5lciBvZgorICAgICAgLy8gdGhlIGltYWdlICh3cmFwcGluZyB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93IGlmIGl0IGRvZXMKKyAgICAgIC8vIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCByb3cpLgorICAgICAgbWVtY3B5KGN1cnJlbnRfcm93ICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIGFyZ2IgKyB5ICogd2lkdGggKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgc2l6ZW9mKCphcmdiKSAqIChtYXhfeCArIGhhdmVfbGVmdCArICh5ICsgMSA8IGhlaWdodCkpKTsKKyAgICAgIGlmIChtYXhfcXVhbnRpemF0aW9uID4gMSAmJiB5ID49IDEgJiYgeSArIDEgPCBoZWlnaHQpIHsKKyAgICAgICAgTWF4RGlmZnNGb3JSb3coY29udGV4dF93aWR0aCwgd2lkdGgsIGFyZ2IgKyB5ICogd2lkdGggKyBjb250ZXh0X3N0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmcyArIGNvbnRleHRfc3RhcnRfeCwgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisgICAgICB9CisKKyAgICAgIGZvciAocmVsYXRpdmVfeCA9IDA7IHJlbGF0aXZlX3ggPCBtYXhfeDsgKytyZWxhdGl2ZV94KSB7CisgICAgICAgIGNvbnN0IGludCB4ID0gc3RhcnRfeCArIHJlbGF0aXZlX3g7CisgICAgICAgIFVwZGF0ZUhpc3RvKGhpc3RvX2FyZ2IsCisgICAgICAgICAgICAgICAgICAgIEdldFJlc2lkdWFsKHdpZHRoLCBoZWlnaHQsIHVwcGVyX3JvdywgY3VycmVudF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmcywgbW9kZSwgcHJlZF9mdW5jLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwgdXNlZF9zdWJ0cmFjdF9ncmVlbikpOworICAgICAgfQorICAgIH0KKyAgICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbSgKKyAgICAgICAgKGNvbnN0IGludCAoKilbMjU2XSlhY2N1bXVsYXRlZCwgKGNvbnN0IGludCAoKilbMjU2XSloaXN0b19hcmdiKTsKKyAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKKyAgICAgIGludCAoKnRtcClbMjU2XSA9IGhpc3RvX2FyZ2I7CisgICAgICBoaXN0b19hcmdiID0gYmVzdF9oaXN0bzsKKyAgICAgIGJlc3RfaGlzdG8gPSB0bXA7CisgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKKyAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgeworICAgICAgYWNjdW11bGF0ZWRbaV1bal0gKz0gYmVzdF9oaXN0b1tpXVtqXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gYmVzdF9tb2RlOworfQorCisvLyBDb252ZXJ0cyBwaXhlbHMgb2YgdGhlIGltYWdlIHRvIHJlc2lkdWFscyB3aXRoIHJlc3BlY3QgdG8gcHJlZGljdGlvbnMuCisvLyBJZiBtYXhfcXVhbnRpemF0aW9uID4gMSwgYXBwbGllcyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHF1YW50aXppbmcKKy8vIHJlc2lkdWFscyB0byBtdWx0aXBsZXMgb2YgcXVhbnRpemF0aW9uIGxldmVscyB1cCB0byBtYXhfcXVhbnRpemF0aW9uCisvLyAodGhlIGFjdHVhbCBxdWFudGl6YXRpb24gbGV2ZWwgZGVwZW5kcyBvbiBzbW9vdGhuZXNzIG5lYXIgdGhlIGdpdmVuIHBpeGVsKS4KK3N0YXRpYyB2b2lkIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLCB1aW50MzJfdCogY29uc3QgbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCwgaW50IG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IGJpdHMpIC0gMTsKKyAgLy8gVGhlIHdpZHRoIG9mIHVwcGVyX3JvdyBhbmQgY3VycmVudF9yb3cgaXMgb25lIHBpeGVsIGxhcmdlciB0aGFuIGltYWdlIHdpZHRoCisgIC8vIHRvIGFsbG93IHRoZSB0b3AgcmlnaHQgcGl4ZWwgdG8gcG9pbnQgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdworICAvLyB3aGVuIGF0IHRoZSByaWdodCBlZGdlLgorICB1aW50MzJfdCogdXBwZXJfcm93ID0gYXJnYl9zY3JhdGNoOworICB1aW50MzJfdCogY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aCArIDE7CisgIHVpbnQ4X3QqIGN1cnJlbnRfbWF4X2RpZmZzID0gKHVpbnQ4X3QqKShjdXJyZW50X3JvdyArIHdpZHRoICsgMSk7CisgIHVpbnQ4X3QqIGxvd2VyX21heF9kaWZmcyA9IGN1cnJlbnRfbWF4X2RpZmZzICsgd2lkdGg7CisgIGludCB5OworICBpbnQgbW9kZSA9IDA7CisgIFZQOExQcmVkaWN0b3JGdW5jIHByZWRfZnVuYyA9IE5VTEw7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaW50IHg7CisgICAgdWludDMyX3QqIGNvbnN0IHRtcDMyID0gdXBwZXJfcm93OworICAgIHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OworICAgIGN1cnJlbnRfcm93ID0gdG1wMzI7CisgICAgbWVtY3B5KGN1cnJlbnRfcm93LCBhcmdiICsgeSAqIHdpZHRoLAorICAgICAgICAgICBzaXplb2YoKmFyZ2IpICogKHdpZHRoICsgKHkgKyAxIDwgaGVpZ2h0KSkpOworCisgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHByZWRpY3QgPSBQcmVkaWN0KFZQOExQcmVkaWN0b3JzW2tQcmVkTG93RWZmb3J0XSwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9yb3csIHVwcGVyX3Jvdyk7CisgICAgICAgIGFyZ2JbeSAqIHdpZHRoICsgeF0gPSBWUDhMU3ViUGl4ZWxzKGN1cnJlbnRfcm93W3hdLCBwcmVkaWN0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1heF9xdWFudGl6YXRpb24gPiAxKSB7CisgICAgICAgIC8vIENvbXB1dGUgbWF4X2RpZmZzIGZvciB0aGUgbG93ZXIgcm93IG5vdywgYmVjYXVzZSB0aGF0IG5lZWRzIHRoZQorICAgICAgICAvLyBjb250ZW50cyBvZiBhcmdiIGZvciB0aGUgY3VycmVudCByb3csIHdoaWNoIHdlIHdpbGwgb3ZlcndyaXRlIHdpdGgKKyAgICAgICAgLy8gcmVzaWR1YWxzIGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggdGhlIG5leHQgcm93LgorICAgICAgICB1aW50OF90KiBjb25zdCB0bXA4ID0gY3VycmVudF9tYXhfZGlmZnM7CisgICAgICAgIGN1cnJlbnRfbWF4X2RpZmZzID0gbG93ZXJfbWF4X2RpZmZzOworICAgICAgICBsb3dlcl9tYXhfZGlmZnMgPSB0bXA4OworICAgICAgICBpZiAoeSArIDIgPCBoZWlnaHQpIHsKKyAgICAgICAgICBNYXhEaWZmc0ZvclJvdyh3aWR0aCwgd2lkdGgsIGFyZ2IgKyAoeSArIDEpICogd2lkdGgsIGxvd2VyX21heF9kaWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgaWYgKCh4ICYgbWFzaykgPT0gMCkgeworICAgICAgICAgIG1vZGUgPSAobW9kZXNbKHkgPj4gYml0cykgKiB0aWxlc19wZXJfcm93ICsgKHggPj4gYml0cyldID4+IDgpICYgMHhmZjsKKyAgICAgICAgICBwcmVkX2Z1bmMgPSBWUDhMUHJlZGljdG9yc1ttb2RlXTsKKyAgICAgICAgfQorICAgICAgICBhcmdiW3kgKiB3aWR0aCArIHhdID0gR2V0UmVzaWR1YWwoCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB1cHBlcl9yb3csIGN1cnJlbnRfcm93LCBjdXJyZW50X21heF9kaWZmcywgbW9kZSwKKyAgICAgICAgICAgIHByZWRfZnVuYywgeCwgeSwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBGaW5kcyB0aGUgYmVzdCBwcmVkaWN0b3IgZm9yIGVhY2ggdGlsZSwgYW5kIGNvbnZlcnRzIHRoZSBpbWFnZSB0byByZXNpZHVhbHMKKy8vIHdpdGggcmVzcGVjdCB0byBwcmVkaWN0aW9ucy4gSWYgbmVhcl9sb3NzbGVzc19xdWFsaXR5IDwgMTAwLCBhcHBsaWVzCisvLyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHNoYXZpbmcgb2ZmIG1vcmUgYml0cyBvZiByZXNpZHVhbHMgZm9yIGxvd2VyCisvLyBxdWFsaXRpZXMuCit2b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgbmVhcl9sb3NzbGVzc19xdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICBjb25zdCBpbnQgdGlsZXNfcGVyX2NvbCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgYml0cyk7CisgIGludCB0aWxlX3k7CisgIGludCBoaXN0b1s0XVsyNTZdOworICBjb25zdCBpbnQgbWF4X3F1YW50aXphdGlvbiA9IDEgPDwgVlA4TE5lYXJMb3NzbGVzc0JpdHMobmVhcl9sb3NzbGVzc19xdWFsaXR5KTsKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXNfcGVyX3JvdyAqIHRpbGVzX3Blcl9jb2w7ICsraSkgeworICAgICAgaW1hZ2VbaV0gPSBBUkdCX0JMQUNLIHwgKGtQcmVkTG93RWZmb3J0IDw8IDgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZW1zZXQoaGlzdG8sIDAsIHNpemVvZihoaXN0bykpOworICAgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZXNfcGVyX2NvbDsgKyt0aWxlX3kpIHsKKyAgICAgIGludCB0aWxlX3g7CisgICAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVzX3Blcl9yb3c7ICsrdGlsZV94KSB7CisgICAgICAgIGNvbnN0IGludCBwcmVkID0gR2V0QmVzdFByZWRpY3RvckZvclRpbGUod2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksCisgICAgICAgICAgICBiaXRzLCBoaXN0bywgYXJnYl9zY3JhdGNoLCBhcmdiLCBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwKKyAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICAgICAgICBpbWFnZVt0aWxlX3kgKiB0aWxlc19wZXJfcm93ICsgdGlsZV94XSA9IEFSR0JfQkxBQ0sgfCAocHJlZCA8PCA4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDb3B5SW1hZ2VXaXRoUHJlZGljdGlvbih3aWR0aCwgaGVpZ2h0LCBiaXRzLCBpbWFnZSwgYXJnYl9zY3JhdGNoLCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfZWZmb3J0LCBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZF9zdWJ0cmFjdF9ncmVlbik7Cit9CisKK3ZvaWQgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IGFyZ2JfZGF0YVtpXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IChhcmdiID4+IDgpICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBuZXdfciA9ICgoKGFyZ2IgPj4gMTYpICYgMHhmZikgLSBncmVlbikgJiAweGZmOworICAgIGNvbnN0IHVpbnQzMl90IG5ld19iID0gKChhcmdiICYgMHhmZikgLSBncmVlbikgJiAweGZmOworICAgIGFyZ2JfZGF0YVtpXSA9IChhcmdiICYgMHhmZjAwZmYwMCkgfCAobmV3X3IgPDwgMTYpIHwgbmV3X2I7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTXVsdGlwbGllcnNDbGVhcihWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyA9IDA7CisgIG0tPmdyZWVuX3RvX2JsdWVfID0gMDsKKyAgbS0+cmVkX3RvX2JsdWVfID0gMDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OF90IGNvbG9yX3ByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgY29sb3IpIHsKKyAgcmV0dXJuICh1aW50MzJfdCkoKGludCkoY29sb3JfcHJlZCkgKiBjb2xvcikgPj4gNTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyh1aW50MzJfdCBjb2xvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyAgPSAoY29sb3JfY29kZSA+PiAgMCkgJiAweGZmOworICBtLT5ncmVlbl90b19ibHVlXyA9IChjb2xvcl9jb2RlID4+ICA4KSAmIDB4ZmY7CisgIG0tPnJlZF90b19ibHVlXyAgID0gKGNvbG9yX2NvZGUgPj4gMTYpICYgMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE11bHRpcGxpZXJzVG9Db2xvckNvZGUoCisgICAgY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIHJldHVybiAweGZmMDAwMDAwdSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5yZWRfdG9fYmx1ZV8pIDw8IDE2KSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5ncmVlbl90b19ibHVlXykgPDwgOCkgfAorICAgICAgICAgbS0+Z3JlZW5fdG9fcmVkXzsKK30KKwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sIHVpbnQzMl90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBkYXRhW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICAgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7CisgICAgdWludDMyX3QgbmV3X3JlZCA9IHJlZDsKKyAgICB1aW50MzJfdCBuZXdfYmx1ZSA9IGFyZ2I7CisgICAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKKyAgICBuZXdfcmVkICY9IDB4ZmY7CisgICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCByZWQpOworICAgIG5ld19ibHVlICY9IDB4ZmY7CisgICAgZGF0YVtpXSA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvclJlZCh1aW50OF90IGdyZWVuX3RvX3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgIHVpbnQzMl90IG5ld19yZWQgPSBhcmdiID4+IDE2OworICBuZXdfcmVkIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fcmVkLCBncmVlbik7CisgIHJldHVybiAobmV3X3JlZCAmIDB4ZmYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBUcmFuc2Zvcm1Db2xvckJsdWUodWludDhfdCBncmVlbl90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYiA+PiAxNjsKKyAgdWludDhfdCBuZXdfYmx1ZSA9IGFyZ2I7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEoZ3JlZW5fdG9fYmx1ZSwgZ3JlZW4pOworICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHJlZF90b19ibHVlLCByZWQpOworICByZXR1cm4gKG5ld19ibHVlICYgMHhmZik7Cit9CisKK3N0YXRpYyBmbG9hdCBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoY29uc3QgaW50IGFjY3VtdWxhdGVkWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb3VudHNbMjU2XSkgeworICAvLyBGYXZvciBsb3cgZW50cm9weSwgbG9jYWxseSBhbmQgZ2xvYmFsbHkuCisgIC8vIEZhdm9yIHNtYWxsIGFic29sdXRlIHZhbHVlcyBmb3IgUHJlZGljdGlvbkNvc3RTcGF0aWFsCisgIHN0YXRpYyBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMi40OworICByZXR1cm4gVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHkoY291bnRzLCBhY2N1bXVsYXRlZCkgKworICAgICAgICAgUHJlZGljdGlvbkNvc3RTcGF0aWFsKGNvdW50cywgMywga0V4cFZhbHVlKTsKK30KKwordm9pZCBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHRpbGVfd2lkdGg7ICsreCkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvclJlZChncmVlbl90b19yZWQsIGFyZ2JbeF0pXTsKKyAgICB9CisgICAgYXJnYiArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIGZsb2F0IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgZ3JlZW5fdG9fcmVkLAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSkgeworICBpbnQgaGlzdG9bMjU2XSA9IHsgMCB9OworICBmbG9hdCBjdXJfZGlmZjsKKworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyhhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl90b19yZWQsIGhpc3RvKTsKKworICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihhY2N1bXVsYXRlZF9yZWRfaGlzdG8sIGhpc3RvKTsKKyAgaWYgKCh1aW50OF90KWdyZWVuX3RvX3JlZCA9PSBwcmV2X3guZ3JlZW5fdG9fcmVkXykgeworICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKKyAgfQorICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZfeS5ncmVlbl90b19yZWRfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmIChncmVlbl90b19yZWQgPT0gMCkgeworICAgIGN1cl9kaWZmIC09IDM7CisgIH0KKyAgcmV0dXJuIGN1cl9kaWZmOworfQorCitzdGF0aWMgdm9pZCBHZXRCZXN0R3JlZW5Ub1JlZCgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgcXVhbGl0eSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0sIFZQOExNdWx0aXBsaWVycyogY29uc3QgYmVzdF90eCkgeworICBjb25zdCBpbnQga01heEl0ZXJzID0gNCArICgoNyAqIHF1YWxpdHkpID4+IDgpOyAgLy8gaW4gcmFuZ2UgWzQuLjZdCisgIGludCBncmVlbl90b19yZWRfYmVzdCA9IDA7CisgIGludCBpdGVyLCBvZmZzZXQ7CisgIGZsb2F0IGJlc3RfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgZ3JlZW5fdG9fcmVkX2Jlc3QsIGFjY3VtdWxhdGVkX3JlZF9oaXN0byk7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBrTWF4SXRlcnM7ICsraXRlcikgeworICAgIC8vIENvbG9yVHJhbnNmb3JtRGVsdGEgaXMgYSAzLjUgYml0IGZpeGVkIHBvaW50LCBzbyAzMiBpcyBlcXVhbCB0bworICAgIC8vIG9uZSBpbiBjb2xvciBjb21wdXRhdGlvbi4gSGF2aW5nIGluaXRpYWwgZGVsdGEgaGVyZSBhcyAxIGlzIHN1ZmZpY2llbnQKKyAgICAvLyB0byBleHBsb3JlIHRoZSByYW5nZSBvZiAoLTIsIDIpLgorICAgIGNvbnN0IGludCBkZWx0YSA9IDMyID4+IGl0ZXI7CisgICAgLy8gVHJ5IGEgbmVnYXRpdmUgYW5kIGEgcG9zaXRpdmUgZGVsdGEgZnJvbSB0aGUgYmVzdCBrbm93biB2YWx1ZS4KKyAgICBmb3IgKG9mZnNldCA9IC1kZWx0YTsgb2Zmc2V0IDw9IGRlbHRhOyBvZmZzZXQgKz0gMiAqIGRlbHRhKSB7CisgICAgICBjb25zdCBpbnQgZ3JlZW5fdG9fcmVkX2N1ciA9IG9mZnNldCArIGdyZWVuX3RvX3JlZF9iZXN0OworICAgICAgY29uc3QgZmxvYXQgY3VyX2RpZmYgPSBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JSZWQoCisgICAgICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgZ3JlZW5fdG9fcmVkX2N1ciwgYWNjdW11bGF0ZWRfcmVkX2hpc3RvKTsKKyAgICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgeworICAgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKKyAgICAgICAgZ3JlZW5fdG9fcmVkX2Jlc3QgPSBncmVlbl90b19yZWRfY3VyOworICAgICAgfQorICAgIH0KKyAgfQorICBiZXN0X3R4LT5ncmVlbl90b19yZWRfID0gZ3JlZW5fdG9fcmVkX2Jlc3Q7Cit9CisKK3ZvaWQgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGZvciAoeCA9IDA7IHggPCB0aWxlX3dpZHRoOyArK3gpIHsKKyAgICAgICsraGlzdG9bVHJhbnNmb3JtQ29sb3JCbHVlKGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBhcmdiW3hdKV07CisgICAgfQorICAgIGFyZ2IgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyBmbG9hdCBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JCbHVlKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksCisgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwgY29uc3QgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSkgeworICBpbnQgaGlzdG9bMjU2XSA9IHsgMCB9OworICBmbG9hdCBjdXJfZGlmZjsKKworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMoYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBoaXN0byk7CisKKyAgY3VyX2RpZmYgPSBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywgaGlzdG8pOworICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2X3guZ3JlZW5fdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KWdyZWVuX3RvX2JsdWUgPT0gcHJldl95LmdyZWVuX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2X3gucmVkX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2X3kucmVkX3RvX2JsdWVfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmIChncmVlbl90b19ibHVlID09IDApIHsKKyAgICBjdXJfZGlmZiAtPSAzOworICB9CisgIGlmIChyZWRfdG9fYmx1ZSA9PSAwKSB7CisgICAgY3VyX2RpZmYgLT0gMzsKKyAgfQorICByZXR1cm4gY3VyX2RpZmY7Cit9CisKKyNkZWZpbmUga0dyZWVuUmVkVG9CbHVlTnVtQXhpcyA4CisjZGVmaW5lIGtHcmVlblJlZFRvQmx1ZU1heEl0ZXJzIDcKK3N0YXRpYyB2b2lkIEdldEJlc3RHcmVlblJlZFRvQmx1ZSgKKyAgICBjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBWUDhMTXVsdGlwbGllcnMgcHJldl95LCBpbnQgcXVhbGl0eSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdLAorICAgIFZQOExNdWx0aXBsaWVycyogY29uc3QgYmVzdF90eCkgeworICBjb25zdCBpbnQ4X3Qgb2Zmc2V0W2tHcmVlblJlZFRvQmx1ZU51bUF4aXNdWzJdID0KKyAgICAgIHt7MCwgLTF9LCB7MCwgMX0sIHstMSwgMH0sIHsxLCAwfSwgey0xLCAtMX0sIHstMSwgMX0sIHsxLCAtMX0sIHsxLCAxfX07CisgIGNvbnN0IGludDhfdCBkZWx0YV9sdXRba0dyZWVuUmVkVG9CbHVlTWF4SXRlcnNdID0geyAxNiwgMTYsIDgsIDQsIDIsIDIsIDIgfTsKKyAgY29uc3QgaW50IGl0ZXJzID0KKyAgICAgIChxdWFsaXR5IDwgMjUpID8gMSA6IChxdWFsaXR5ID4gNTApID8ga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMgOiA0OworICBpbnQgZ3JlZW5fdG9fYmx1ZV9iZXN0ID0gMDsKKyAgaW50IHJlZF90b19ibHVlX2Jlc3QgPSAwOworICBpbnQgaXRlcjsKKyAgLy8gSW5pdGlhbCB2YWx1ZSBhdCBvcmlnaW46CisgIGZsb2F0IGJlc3RfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgICBhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LCBwcmV2X3gsIHByZXZfeSwKKyAgICAgIGdyZWVuX3RvX2JsdWVfYmVzdCwgcmVkX3RvX2JsdWVfYmVzdCwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0byk7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBpdGVyczsgKytpdGVyKSB7CisgICAgY29uc3QgaW50IGRlbHRhID0gZGVsdGFfbHV0W2l0ZXJdOworICAgIGludCBheGlzOworICAgIGZvciAoYXhpcyA9IDA7IGF4aXMgPCBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzOyArK2F4aXMpIHsKKyAgICAgIGNvbnN0IGludCBncmVlbl90b19ibHVlX2N1ciA9CisgICAgICAgICAgb2Zmc2V0W2F4aXNdWzBdICogZGVsdGEgKyBncmVlbl90b19ibHVlX2Jlc3Q7CisgICAgICBjb25zdCBpbnQgcmVkX3RvX2JsdWVfY3VyID0gb2Zmc2V0W2F4aXNdWzFdICogZGVsdGEgKyByZWRfdG9fYmx1ZV9iZXN0OworICAgICAgY29uc3QgZmxvYXQgY3VyX2RpZmYgPSBHZXRQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3JCbHVlKAorICAgICAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgICAgIGdyZWVuX3RvX2JsdWVfY3VyLCByZWRfdG9fYmx1ZV9jdXIsIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8pOworICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOworICAgICAgICBncmVlbl90b19ibHVlX2Jlc3QgPSBncmVlbl90b19ibHVlX2N1cjsKKyAgICAgICAgcmVkX3RvX2JsdWVfYmVzdCA9IHJlZF90b19ibHVlX2N1cjsKKyAgICAgIH0KKyAgICAgIGlmIChxdWFsaXR5IDwgMjUgJiYgaXRlciA9PSA0KSB7CisgICAgICAgIC8vIE9ubHkgYXhpcyBhbGlnbmVkIGRpZmZzIGZvciBsb3dlciBxdWFsaXR5LgorICAgICAgICBicmVhazsgIC8vIG5leHQgaXRlci4KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlbHRhID09IDIgJiYgZ3JlZW5fdG9fYmx1ZV9iZXN0ID09IDAgJiYgcmVkX3RvX2JsdWVfYmVzdCA9PSAwKSB7CisgICAgICAvLyBGdXJ0aGVyIGl0ZXJhdGlvbnMgd291bGQgbm90IGhlbHAuCisgICAgICBicmVhazsgIC8vIG91dCBvZiBpdGVyLWxvb3AuCisgICAgfQorICB9CisgIGJlc3RfdHgtPmdyZWVuX3RvX2JsdWVfID0gZ3JlZW5fdG9fYmx1ZV9iZXN0OworICBiZXN0X3R4LT5yZWRfdG9fYmx1ZV8gPSByZWRfdG9fYmx1ZV9iZXN0OworfQorI3VuZGVmIGtHcmVlblJlZFRvQmx1ZU1heEl0ZXJzCisjdW5kZWYga0dyZWVuUmVkVG9CbHVlTnVtQXhpcworCitzdGF0aWMgVlA4TE11bHRpcGxpZXJzIEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUoCisgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCisgICAgVlA4TE11bHRpcGxpZXJzIHByZXZfeCwKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl95LAorICAgIGludCBxdWFsaXR5LCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0sCisgICAgY29uc3QgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSwKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgeworICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKKyAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOworICBjb25zdCBpbnQgdGlsZV94X29mZnNldCA9IHRpbGVfeCAqIG1heF90aWxlX3NpemU7CisgIGNvbnN0IGludCBhbGxfeF9tYXggPSBHZXRNaW4odGlsZV94X29mZnNldCArIG1heF90aWxlX3NpemUsIHhzaXplKTsKKyAgY29uc3QgaW50IGFsbF95X21heCA9IEdldE1pbih0aWxlX3lfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgeXNpemUpOworICBjb25zdCBpbnQgdGlsZV93aWR0aCA9IGFsbF94X21heCAtIHRpbGVfeF9vZmZzZXQ7CisgIGNvbnN0IGludCB0aWxlX2hlaWdodCA9IGFsbF95X21heCAtIHRpbGVfeV9vZmZzZXQ7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0aWxlX2FyZ2IgPSBhcmdiICsgdGlsZV95X29mZnNldCAqIHhzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aWxlX3hfb2Zmc2V0OworICBWUDhMTXVsdGlwbGllcnMgYmVzdF90eDsKKyAgTXVsdGlwbGllcnNDbGVhcigmYmVzdF90eCk7CisKKyAgR2V0QmVzdEdyZWVuVG9SZWQodGlsZV9hcmdiLCB4c2l6ZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHByZXZfeCwgcHJldl95LCBxdWFsaXR5LCBhY2N1bXVsYXRlZF9yZWRfaGlzdG8sICZiZXN0X3R4KTsKKyAgR2V0QmVzdEdyZWVuUmVkVG9CbHVlKHRpbGVfYXJnYiwgeHNpemUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksIHF1YWxpdHksIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmVzdF90eCk7CisgIHJldHVybiBiZXN0X3R4OworfQorCitzdGF0aWMgdm9pZCBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybShpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3gsIGludCB0aWxlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3RpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExNdWx0aXBsaWVycyBjb2xvcl90cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYikgeworICBjb25zdCBpbnQgeHNjYW4gPSBHZXRNaW4obWF4X3RpbGVfc2l6ZSwgeHNpemUgLSB0aWxlX3gpOworICBpbnQgeXNjYW4gPSBHZXRNaW4obWF4X3RpbGVfc2l6ZSwgeXNpemUgLSB0aWxlX3kpOworICBhcmdiICs9IHRpbGVfeSAqIHhzaXplICsgdGlsZV94OworICB3aGlsZSAoeXNjYW4tLSA+IDApIHsKKyAgICBWUDhMVHJhbnNmb3JtQ29sb3IoJmNvbG9yX3RyYW5zZm9ybSwgYXJnYiwgeHNjYW4pOworICAgIGFyZ2IgKz0geHNpemU7CisgIH0KK30KKwordm9pZCBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBpbWFnZSkgeworICBjb25zdCBpbnQgbWF4X3RpbGVfc2l6ZSA9IDEgPDwgYml0czsKKyAgY29uc3QgaW50IHRpbGVfeHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgYml0cyk7CisgIGNvbnN0IGludCB0aWxlX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBiaXRzKTsKKyAgaW50IGFjY3VtdWxhdGVkX3JlZF9oaXN0b1syNTZdID0geyAwIH07CisgIGludCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvWzI1Nl0gPSB7IDAgfTsKKyAgaW50IHRpbGVfeCwgdGlsZV95OworICBWUDhMTXVsdGlwbGllcnMgcHJldl94LCBwcmV2X3k7CisgIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZfeSk7CisgIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZfeCk7CisgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZV95c2l6ZTsgKyt0aWxlX3kpIHsKKyAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVfeHNpemU7ICsrdGlsZV94KSB7CisgICAgICBpbnQgeTsKKyAgICAgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKKyAgICAgIGNvbnN0IGludCB0aWxlX3lfb2Zmc2V0ID0gdGlsZV95ICogbWF4X3RpbGVfc2l6ZTsKKyAgICAgIGNvbnN0IGludCBhbGxfeF9tYXggPSBHZXRNaW4odGlsZV94X29mZnNldCArIG1heF90aWxlX3NpemUsIHdpZHRoKTsKKyAgICAgIGNvbnN0IGludCBhbGxfeV9tYXggPSBHZXRNaW4odGlsZV95X29mZnNldCArIG1heF90aWxlX3NpemUsIGhlaWdodCk7CisgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeDsKKyAgICAgIGlmICh0aWxlX3kgIT0gMCkgeworICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlW29mZnNldCAtIHRpbGVfeHNpemVdLCAmcHJldl95KTsKKyAgICAgIH0KKyAgICAgIHByZXZfeCA9IEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUodGlsZV94LCB0aWxlX3ksIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeCwgcHJldl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlZF9yZWRfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkX2JsdWVfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IpOworICAgICAgaW1hZ2Vbb2Zmc2V0XSA9IE11bHRpcGxpZXJzVG9Db2xvckNvZGUoJnByZXZfeCk7CisgICAgICBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3hfb2Zmc2V0LCB0aWxlX3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RpbGVfc2l6ZSwgcHJldl94LCBhcmdiKTsKKworICAgICAgLy8gR2F0aGVyIGFjY3VtdWxhdGVkIGhpc3RvZ3JhbSBkYXRhLgorICAgICAgZm9yICh5ID0gdGlsZV95X29mZnNldDsgeSA8IGFsbF95X21heDsgKyt5KSB7CisgICAgICAgIGludCBpeCA9IHkgKiB3aWR0aCArIHRpbGVfeF9vZmZzZXQ7CisgICAgICAgIGNvbnN0IGludCBpeF9lbmQgPSBpeCArIGFsbF94X21heCAtIHRpbGVfeF9vZmZzZXQ7CisgICAgICAgIGZvciAoOyBpeCA8IGl4X2VuZDsgKytpeCkgeworICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IGFyZ2JbaXhdOworICAgICAgICAgIGlmIChpeCA+PSAyICYmCisgICAgICAgICAgICAgIHBpeCA9PSBhcmdiW2l4IC0gMl0gJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSAxXSkgeworICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXggPj0gd2lkdGggKyAyICYmCisgICAgICAgICAgICAgIGFyZ2JbaXggLSAyXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAyXSAmJgorICAgICAgICAgICAgICBhcmdiW2l4IC0gMV0gPT0gYXJnYltpeCAtIHdpZHRoIC0gMV0gJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSB3aWR0aF0pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgLy8gcmVwZWF0ZWQgcGl4ZWxzIGFyZSBoYW5kbGVkIGJ5IGJhY2t3YXJkIHJlZmVyZW5jZXMKKyAgICAgICAgICB9CisgICAgICAgICAgKythY2N1bXVsYXRlZF9yZWRfaGlzdG9bKHBpeCA+PiAxNikgJiAweGZmXTsKKyAgICAgICAgICArK2FjY3VtdWxhdGVkX2JsdWVfaGlzdG9bKHBpeCA+PiAwKSAmIDB4ZmZdOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgVmVjdG9yTWlzbWF0Y2goY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwgaW50IGxlbmd0aCkgeworICBpbnQgbWF0Y2hfbGVuID0gMDsKKworICB3aGlsZSAobWF0Y2hfbGVuIDwgbGVuZ3RoICYmIGFycmF5MVttYXRjaF9sZW5dID09IGFycmF5MlttYXRjaF9sZW5dKSB7CisgICAgKyttYXRjaF9sZW47CisgIH0KKyAgcmV0dXJuIG1hdGNoX2xlbjsKK30KKworLy8gQnVuZGxlcyBtdWx0aXBsZSAoMSwgMiwgNCBvciA4KSBwaXhlbHMgaW50byBhIHNpbmdsZSBwaXhlbC4KK3ZvaWQgVlA4TEJ1bmRsZUNvbG9yTWFwKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhiaXRzLCB1aW50MzJfdCogY29uc3QgZHN0KSB7CisgIGludCB4OworICBpZiAoeGJpdHMgPiAwKSB7CisgICAgY29uc3QgaW50IGJpdF9kZXB0aCA9IDEgPDwgKDMgLSB4Yml0cyk7CisgICAgY29uc3QgaW50IG1hc2sgPSAoMSA8PCB4Yml0cykgLSAxOworICAgIHVpbnQzMl90IGNvZGUgPSAweGZmMDAwMDAwOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgeHN1YiA9IHggJiBtYXNrOworICAgICAgaWYgKHhzdWIgPT0gMCkgeworICAgICAgICBjb2RlID0gMHhmZjAwMDAwMDsKKyAgICAgIH0KKyAgICAgIGNvZGUgfD0gcm93W3hdIDw8ICg4ICsgYml0X2RlcHRoICogeHN1Yik7CisgICAgICBkc3RbeCA+PiB4Yml0c10gPSBjb2RlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgZHN0W3hdID0gMHhmZjAwMDAwMCB8IChyb3dbeF0gPDwgOCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3QoY29uc3QgdWludDMyX3QqIHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGRvdWJsZSBjb3N0ID0gMC47CisgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGggLSAyOyArK2kpIGNvc3QgKz0gKGkgPj4gMSkgKiBwb3B1bGF0aW9uW2kgKyAyXTsKKyAgcmV0dXJuIGNvc3Q7Cit9CisKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0Q29tYmluZWQoY29uc3QgdWludDMyX3QqIFgsIGNvbnN0IHVpbnQzMl90KiBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBkb3VibGUgY29zdCA9IDAuOworICBmb3IgKGkgPSAyOyBpIDwgbGVuZ3RoIC0gMjsgKytpKSB7CisgICAgY29uc3QgaW50IHh5ID0gWFtpICsgMl0gKyBZW2kgKyAyXTsKKyAgICBjb3N0ICs9IChpID4+IDEpICogeHk7CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgbGl0ZXJhbF9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEtPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgaWYgKGIgIT0gb3V0KSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpdGVyYWxfc2l6ZTsgKytpKSB7CisgICAgICBvdXQtPmxpdGVyYWxfW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNUQU5DRV9DT0RFUzsgKytpKSB7CisgICAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MSVRFUkFMX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+cmVkX1tpXSA9IGEtPnJlZF9baV0gKyBiLT5yZWRfW2ldOworICAgICAgb3V0LT5ibHVlX1tpXSA9IGEtPmJsdWVfW2ldICsgYi0+Ymx1ZV9baV07CisgICAgICBvdXQtPmFscGhhX1tpXSA9IGEtPmFscGhhX1tpXSArIGItPmFscGhhX1tpXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxpdGVyYWxfc2l6ZTsgKytpKSB7CisgICAgICBvdXQtPmxpdGVyYWxfW2ldICs9IGEtPmxpdGVyYWxfW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+ZGlzdGFuY2VfW2ldICs9IGEtPmRpc3RhbmNlX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9MSVRFUkFMX0NPREVTOyArK2kpIHsKKyAgICAgIG91dC0+cmVkX1tpXSArPSBhLT5yZWRfW2ldOworICAgICAgb3V0LT5ibHVlX1tpXSArPSBhLT5ibHVlX1tpXTsKKyAgICAgIG91dC0+YWxwaGFfW2ldICs9IGEtPmFscGhhX1tpXTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4TFByb2Nlc3NCbHVlQW5kUmVkRnVuYyBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkOworCitWUDhMVHJhbnNmb3JtQ29sb3JGdW5jIFZQOExUcmFuc2Zvcm1Db2xvcjsKKworVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXM7CitWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXM7CisKK1ZQOExGYXN0TG9nMlNsb3dGdW5jIFZQOExGYXN0TG9nMlNsb3c7CitWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdFNMb2cyU2xvdzsKKworVlA4TENvc3RGdW5jIFZQOExFeHRyYUNvc3Q7CitWUDhMQ29zdENvbWJpbmVkRnVuYyBWUDhMRXh0cmFDb3N0Q29tYmluZWQ7CitWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisKK0dldEVudHJvcHlVbnJlZmluZWRIZWxwZXJGdW5jIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyOworCitWUDhMSGlzdG9ncmFtQWRkRnVuYyBWUDhMSGlzdG9ncmFtQWRkOworCitWUDhMVmVjdG9yTWlzbWF0Y2hGdW5jIFZQOExWZWN0b3JNaXNtYXRjaDsKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGxvc3NsZXNzX2VuY19sYXN0X2NwdWluZm9fdXNlZCA9CisgICAgKFZQOENQVUluZm8pJmxvc3NsZXNzX2VuY19sYXN0X2NwdWluZm9fdXNlZDsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0KHZvaWQpIHsKKyAgaWYgKGxvc3NsZXNzX2VuY19sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgVlA4TERzcEluaXQoKTsKKworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DOworCisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFZQOExUcmFuc2Zvcm1Db2xvcl9DOworCisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyA9IFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DOworICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyA9IFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0M7CisKKyAgVlA4TEZhc3RMb2cyU2xvdyA9IEZhc3RMb2cyU2xvdzsKKyAgVlA4TEZhc3RTTG9nMlNsb3cgPSBGYXN0U0xvZzJTbG93OworCisgIFZQOExFeHRyYUNvc3QgPSBFeHRyYUNvc3Q7CisgIFZQOExFeHRyYUNvc3RDb21iaW5lZCA9IEV4dHJhQ29zdENvbWJpbmVkOworICBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSA9IENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIgPSBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyOworCisgIFZQOExIaXN0b2dyYW1BZGQgPSBIaXN0b2dyYW1BZGQ7CisKKyAgVlA4TFZlY3Rvck1pc21hdGNoID0gVmVjdG9yTWlzbWF0Y2g7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOExFbmNEc3BJbml0U1NFMigpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgICBWUDhMRW5jRHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdE5FT04oKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgVlA4TEVuY0RzcEluaXRNSVBTMzIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9CisgIGxvc3NsZXNzX2VuY19sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWI2NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYwpAQCAtMCwwICsxLDM4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBsb3NzbGVzcyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBmbG9hdCBGYXN0U0xvZzJTbG93KHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICB1aW50MzJfdCBsb2dfY250LCB5LCBjb3JyZWN0aW9uOworICAgIGNvbnN0IGludCBjMjQgPSAyNDsKKyAgICBjb25zdCBmbG9hdCB2X2YgPSAoZmxvYXQpdjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgLy8gWGYgPSAyNTYgPSAyXjgKKyAgICAvLyBsb2dfY250IGlzIGluZGV4IG9mIGxlYWRpbmcgb25lIGluIHVwcGVyIDI0IGJpdHMKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgImNseiAgICAgICVbbG9nX2NudF0sICVbdl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW3ldLCAgICAgICAkemVybywgICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICAgJVtsb2dfY250XSwgJVtjMjRdLCAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgInNsbHYgICAgICVbeV0sICAgICAgICVbeV0sICAgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzcmx2ICAgICAlW3RlbXBdLCAgICAlW3ZdLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICA6IFtsb2dfY250XSI9JnIiKGxvZ19jbnQpLCBbeV0iPSZyIih5KSwKKyAgICAgICAgW3RlbXBdIj1yIih0ZW1wKQorICAgICAgOiBbYzI0XSJyIihjMjQpLCBbdl0iciIodikKKyAgICApOworCisgICAgLy8gdmYgPSAoMl5sb2dfY250KSAqIFhmOyB3aGVyZSB5ID0gMl5sb2dfY250IGFuZCBYZiA8IDI1NgorICAgIC8vIFhmID0gZmxvb3IoWGYpICogKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBsb2cyKFhmKSA9IGxvZzIoZmxvb3IoWGYpKSArIGxvZzIoMSArICh2ICUgeSkgLyB2KQorICAgIC8vIFRoZSBjb3JyZWN0aW9uIGZhY3RvcjogbG9nKDEgKyBkKSB+IGQ7IGZvciB2ZXJ5IHNtYWxsIGQgdmFsdWVzLCBzbworICAgIC8vIGxvZzIoMSArICh2ICUgeSkgLyB2KSB+IExPR18yX1JFQ0lQUk9DQUwgKiAodiAlIHkpL3YKKyAgICAvLyBMT0dfMl9SRUNJUFJPQ0FMIH4gMjMvMTYKKworICAgIC8vICh2ICUgeSkgPSAodiAlIDJebG9nX2NudCkgPSB2ICYgKDJebG9nX2NudCAtIDEpCisgICAgY29ycmVjdGlvbiA9ICgyMyAqICh2ICYgKHkgLSAxKSkpID4+IDQ7CisgICAgcmV0dXJuIHZfZiAqIChrTG9nMlRhYmxlW3RlbXBdICsgbG9nX2NudCkgKyBjb3JyZWN0aW9uOworICB9IGVsc2UgeworICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiB2ICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKK3N0YXRpYyBmbG9hdCBGYXN0TG9nMlNsb3codWludDMyX3QgdikgeworICBhc3NlcnQodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICBpZiAodiA8IEFQUFJPWF9MT0dfV0lUSF9DT1JSRUNUSU9OX01BWCkgeworICAgIHVpbnQzMl90IGxvZ19jbnQsIHk7CisgICAgY29uc3QgaW50IGMyNCA9IDI0OworICAgIGRvdWJsZSBsb2dfMjsKKyAgICB1aW50MzJfdCB0ZW1wOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICJjbHogICAgICAlW2xvZ19jbnRdLCAlW3ZdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVt5XSwgICAgICAgJHplcm8sICAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAgICVbbG9nX2NudF0sICVbYzI0XSwgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzbGx2ICAgICAlW3ldLCAgICAgICAlW3ldLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICAic3JsdiAgICAgJVt0ZW1wXSwgICAgJVt2XSwgICAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgOiBbbG9nX2NudF0iPSZyIihsb2dfY250KSwgW3ldIj0mciIoeSksCisgICAgICAgIFt0ZW1wXSI9ciIodGVtcCkKKyAgICAgIDogW2MyNF0iciIoYzI0KSwgW3ZdInIiKHYpCisgICAgKTsKKworICAgIGxvZ18yID0ga0xvZzJUYWJsZVt0ZW1wXSArIGxvZ19jbnQ7CisgICAgaWYgKHYgPj0gQVBQUk9YX0xPR19NQVgpIHsKKyAgICAgIC8vIFNpbmNlIHRoZSBkaXZpc2lvbiBpcyBzdGlsbCBleHBlbnNpdmUsIGFkZCB0aGlzIGNvcnJlY3Rpb24gZmFjdG9yIG9ubHkKKyAgICAgIC8vIGZvciBsYXJnZSB2YWx1ZXMgb2YgJ3YnLgorCisgICAgICBjb25zdCB1aW50MzJfdCBjb3JyZWN0aW9uID0gKDIzICogKHYgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICAgIGxvZ18yICs9IChkb3VibGUpY29ycmVjdGlvbiAvIHY7CisgICAgfQorICAgIHJldHVybiAoZmxvYXQpbG9nXzI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCisvLyBDIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbjoKKy8vICAgaW50IGkgPSAwOworLy8gICBpbnQ2NF90IGNvc3QgPSAwOworLy8gICBjb25zdCB1aW50MzJfdCogcG9wID0gJnBvcHVsYXRpb25bNF07CisvLyAgIGNvbnN0IHVpbnQzMl90KiBMb29wRW5kID0gJnBvcHVsYXRpb25bbGVuZ3RoXTsKKy8vICAgd2hpbGUgKHBvcCAhPSBMb29wRW5kKSB7CisvLyAgICAgKytpOworLy8gICAgIGNvc3QgKz0gaSAqICpwb3A7CisvLyAgICAgY29zdCArPSBpICogKihwb3AgKyAxKTsKKy8vICAgICBwb3AgKz0gMjsKKy8vICAgfQorLy8gICByZXR1cm4gKGRvdWJsZSljb3N0Oworc3RhdGljIGRvdWJsZSBFeHRyYUNvc3QoY29uc3QgdWludDMyX3QqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKKyAgaW50IGksIHRlbXAwLCB0ZW1wMTsKKyAgY29uc3QgdWludDMyX3QqIHBvcCA9ICZwb3B1bGF0aW9uWzRdOworICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9ICZwb3B1bGF0aW9uW2xlbmd0aF07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAlW2ldLCAgICAgJVtpXSwgICAgICAgJVtpXSAgICAgICBcblx0IgorICAgICJiZXEgICAgJVtwb3BdLCAgICVbTG9vcEVuZF0sIDJmICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAwXSwgMCglW3BvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMV0sIDQoJVtwb3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbaV0sICAgICAlW2ldLCAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAlW3BvcF0sICAgJVtwb3BdLCAgICAgOCAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWFkZCAgICVbaV0sICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAlW3BvcF0sICAgJVtMb29wRW5kXSwgMWIgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZoaSAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1mbG8gICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFtpXSI9JnIiKGkpLCBbcG9wXSIrciIocG9wKQorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiAoZG91YmxlKSgoaW50NjRfdCl0ZW1wMCA8PCAzMiB8IHRlbXAxKTsKK30KKworLy8gQyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb246CisvLyAgIGludCBpID0gMDsKKy8vICAgaW50NjRfdCBjb3N0ID0gMDsKKy8vICAgY29uc3QgdWludDMyX3QqIHBYID0gJlhbNF07CisvLyAgIGNvbnN0IHVpbnQzMl90KiBwWSA9ICZZWzRdOworLy8gICBjb25zdCB1aW50MzJfdCogTG9vcEVuZCA9ICZYW2xlbmd0aF07CisvLyAgIHdoaWxlIChwWCAhPSBMb29wRW5kKSB7CisvLyAgICAgY29uc3QgdWludDMyX3QgeHkwID0gKnBYICsgKnBZOworLy8gICAgIGNvbnN0IHVpbnQzMl90IHh5MSA9ICoocFggKyAxKSArICoocFkgKyAxKTsKKy8vICAgICArK2k7CisvLyAgICAgY29zdCArPSBpICogeHkwOworLy8gICAgIGNvc3QgKz0gaSAqIHh5MTsKKy8vICAgICBwWCArPSAyOworLy8gICAgIHBZICs9IDI7CisvLyAgIH0KKy8vICAgcmV0dXJuIChkb3VibGUpY29zdDsKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0Q29tYmluZWQoY29uc3QgdWludDMyX3QqIGNvbnN0IFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBZLCBpbnQgbGVuZ3RoKSB7CisgIGludCBpLCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgdWludDMyX3QqIHBYID0gJlhbNF07CisgIGNvbnN0IHVpbnQzMl90KiBwWSA9ICZZWzRdOworICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9ICZYW2xlbmd0aF07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAlW2ldLCAgICAgJVtpXSwgICAgICAgJVtpXSAgICAgICBcblx0IgorICAgICJiZXEgICAgJVtwWF0sICAgICVbTG9vcEVuZF0sIDJmICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAwXSwgMCglW3BYXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMV0sIDAoJVtwWV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDJdLCA0KCVbcFhdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAzXSwgNCglW3BZXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgJVtpXSwgICAgICVbaV0sICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICVbdGVtcDBdLCAlW3RlbXAwXSwgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFkZHUgICAlW3RlbXAyXSwgJVt0ZW1wMl0sICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGRpdSAgJVtwWF0sICAgICVbcFhdLCAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbcFldLCAgICAlW3BZXSwgICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgIm1hZGQgICAlW2ldLCAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICVbcFhdLCAgICAlW0xvb3BFbmRdLCAxYiAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtZmhpICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZsbyAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFtpXSI9JnIiKGkpLCBbcFhdIityIihwWCksIFtwWV0iK3IiKHBZKQorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiAoZG91YmxlKSgoaW50NjRfdCl0ZW1wMCA8PCAzMiB8IHRlbXAxKTsKK30KKworI2RlZmluZSBIVUZGTUFOX0NPU1RfUEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNsbCAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGRpdSAlW3RlbXAzXSwgICVbc3RyZWFrXSwgICAtMyAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wMl0sICAlW3BzdHJlYWtzXSwgJVt0ZW1wMV0gICAgXG5cdCIgICAgICBcCisgICAgImJsZXogICVbdGVtcDNdLCAgMWYgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJzcmwgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wM10sICAlW3BjbnRzXSwgICAgJVt0ZW1wMV0gICAgXG5cdCIgICAgICBcCisgICAgImx3ICAgICVbdGVtcDBdLCAgNCglW3RlbXAyXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJsdyAgICAlW3RlbXAxXSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVtzdHJlYWtdICAgXG5cdCIgICAgICBcCisgICAgImFkZGl1ICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJzdyAgICAlW3RlbXAwXSwgIDQoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAic3cgICAgJVt0ZW1wMV0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImIgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAibHcgICAgJVt0ZW1wMF0sICAwKCVbdGVtcDJdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZHUgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgICVbc3RyZWFrXSAgIFxuXHQiICAgICAgXAorICAgICJzdyAgICAlW3RlbXAwXSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgICAgXAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXAwXSIrciIodGVtcDApICAgICAgICAgICAgIFwKKyAgICA6IFtwc3RyZWFrc10iciIocHN0cmVha3MpLCBbcGNudHNdInIiKHBjbnRzKSwgICAgICAgICBcCisgICAgICBbc3RyZWFrXSJyIihzdHJlYWspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsKKworLy8gUmV0dXJucyB0aGUgdmFyaW91cyBSTEUgY291bnRzCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKAorICAgIHVpbnQzMl90IHZhbCwgaW50IGksIHVpbnQzMl90KiBjb25zdCB2YWxfcHJldiwgaW50KiBjb25zdCBpX3ByZXYsCisgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LCBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgaW50KiBjb25zdCBwc3RyZWFrcyA9ICZzdGF0cy0+c3RyZWFrc1swXVswXTsKKyAgaW50KiBjb25zdCBwY250cyA9ICZzdGF0cy0+Y291bnRzWzBdOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IGludCBzdHJlYWsgPSBpIC0gKmlfcHJldjsKKworICAvLyBHYXRoZXIgaW5mbyBmb3IgdGhlIGJpdCBlbnRyb3B5LgorICBpZiAoKnZhbF9wcmV2ICE9IDApIHsKKyAgICBiaXRfZW50cm9weS0+c3VtICs9ICgqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvcyArPSBzdHJlYWs7CisgICAgYml0X2VudHJvcHktPm5vbnplcm9fY29kZSA9ICppX3ByZXY7CisgICAgYml0X2VudHJvcHktPmVudHJvcHkgLT0gVlA4TEZhc3RTTG9nMigqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGlmIChiaXRfZW50cm9weS0+bWF4X3ZhbCA8ICp2YWxfcHJldikgeworICAgICAgYml0X2VudHJvcHktPm1heF92YWwgPSAqdmFsX3ByZXY7CisgICAgfQorICB9CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBIdWZmbWFuIGNvc3QuCisgIHRlbXAwID0gKCp2YWxfcHJldiAhPSAwKTsKKyAgSFVGRk1BTl9DT1NUX1BBU1MKKworICAqdmFsX3ByZXYgPSB2YWw7CisgICppX3ByZXYgPSBpOworfQorCisjZGVmaW5lIEFTTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICIuc2V0ICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICAgIi5zZXQgICBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiLnNldCAgIG1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBQMiA9IFAwICsgUDEKKy8vIEEuLkQgLSBvZmZzZXRzCisvLyBFIC0gdGVtcCB2YXJpYWJsZSB0byB0ZWxsIG1hY3JvCisvLyAgICAgaWYgcG9pbnRlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQKKy8vIGxpdGVyYWxfIGFuZCBzdWNjZXNzaXZlIGhpc3RvZ3JhbXMgY291bGQgYmUgdW5hbGlnbmVkCisvLyBzbyB3ZSBtdXN0IHVzZSB1bHcgYW5kIHVzdworI2RlZmluZSBBRERfVE9fT1VUKEEsIEIsIEMsIEQsIEUsIFAwLCBQMSwgUDIpICAgICAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAwXSwgIiAjQSAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDFdLCAiICNCICIoJVsiICNQMCAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wMl0sICIgI0MgIiglWyIgI1AwICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAzXSwgIiAjRCAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDRdLCAiICNBICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wNV0sICIgI0IgIiglWyIgI1AxICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXA2XSwgIiAjQyAiKCVbIiAjUDEgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDddLCAiICNEICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wNF0sICVbdGVtcDRdLCAgICVbdGVtcDBdICBcblx0IiAgICAgICBcCisgICAgImFkZHUgICAlW3RlbXA1XSwgJVt0ZW1wNV0sICAgJVt0ZW1wMV0gIFxuXHQiICAgICAgIFwKKyAgICAiYWRkdSAgICVbdGVtcDZdLCAlW3RlbXA2XSwgICAlW3RlbXAyXSAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wN10sICVbdGVtcDddLCAgICVbdGVtcDNdICBcblx0IiAgICAgICBcCisgICAgImFkZGl1ICAlWyIgI1AwICJdLCAgJVsiICNQMCAiXSwgIDE2ICAgIFxuXHQiICAgICAgIFwKKyAgIi5pZiAiICNFICIgPT0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAgICJhZGRpdSAgJVsiICNQMSAiXSwgICVbIiAjUDEgIl0sICAxNiAgICBcblx0IiAgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDRdLCAiICNBICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1c3cgICAgJVt0ZW1wNV0sICIgI0IgIiglWyIgI1AyICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVzdyAgICAlW3RlbXA2XSwgIiAjQyAiKCVbIiAjUDIgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDddLCAiICNEICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJhZGRpdSAgJVsiICNQMiAiXSwgJVsiICNQMiAiXSwgICAxNiAgICBcblx0IiAgICAgICBcCisgICAgImJuZSAgICAlWyIgI1AwICJdLCAlW0xvb3BFbmRdLCAxYiAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiLnNldCAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorCisjZGVmaW5lIEFTTV9FTkRfQ09NTU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksICAgICAgICAgXAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgICAgICAgICBcCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgIFwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksICAgICAgICAgXAorICAgICAgW3BhXSIrciIocGEpLCBbcG91dF0iK3IiKHBvdXQpCisKKyNkZWZpbmUgQVNNX0VORF9DT01NT05fMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiwgImF0IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKTsKKworI2RlZmluZSBBU01fRU5EXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICwgW3BiXSIrciIocGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTTV9FTkRfQ09NTU9OXzEKKworI2RlZmluZSBBU01fRU5EXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU01fRU5EX0NPTU1PTl8xCisKKyNkZWZpbmUgQUREX1ZFQ1RPUihBLCBCLCBPVVQsIFNJWkUsIEVYVFJBX1NJWkUpICBkbyB7ICAgXAorICBjb25zdCB1aW50MzJfdCogcGEgPSAoY29uc3QgdWludDMyX3QqKShBKTsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBwYiA9IChjb25zdCB1aW50MzJfdCopKEIpOyAgICAgICAgICAgIFwKKyAgdWludDMyX3QqIHBvdXQgPSAodWludDMyX3QqKShPVVQpOyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9IHBhICsgKFNJWkUpOyAgICAgICAgICBcCisgIGFzc2VydCgoU0laRSkgJSA0ID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVE9fT1VUKDAsIDQsIDgsIDEyLCAxLCBwYSwgcGIsIHBvdXQpICAgICAgICAgICAgICBcCisgIEFTTV9FTkRfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChFWFRSQV9TSVpFKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsYXN0ID0gKEVYVFJBX1NJWkUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGFzdDsgKytpKSBwb3V0W2ldID0gcGFbaV0gKyBwYltpXTsgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEFERF9WRUNUT1JfRVEoQSwgT1VULCBTSVpFLCBFWFRSQV9TSVpFKSAgZG8geyAgIFwKKyAgY29uc3QgdWludDMyX3QqIHBhID0gKGNvbnN0IHVpbnQzMl90KikoQSk7ICAgICAgICAgICAgXAorICB1aW50MzJfdCogcG91dCA9ICh1aW50MzJfdCopKE9VVCk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBMb29wRW5kID0gcGEgKyAoU0laRSk7ICAgICAgICAgIFwKKyAgYXNzZXJ0KChTSVpFKSAlIDQgPT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBU01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFERF9UT19PVVQoMCwgNCwgOCwgMTIsIDAsIHBhLCBwb3V0LCBwb3V0KSAgICAgICAgICAgIFwKKyAgQVNNX0VORF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKEVYVFJBX1NJWkUpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxhc3QgPSAoRVhUUkFfU0laRSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBsYXN0OyArK2kpIHBvdXRbaV0gKz0gcGFbaV07ICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgY29uc3QgaW50IGV4dHJhX2NhY2hlX3NpemUgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIChOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMpOworICBhc3NlcnQoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGItPnBhbGV0dGVfY29kZV9iaXRzXyk7CisKKyAgaWYgKGIgIT0gb3V0KSB7CisgICAgQUREX1ZFQ1RPUihhLT5saXRlcmFsXywgYi0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sCisgICAgICAgICAgICAgICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsIGV4dHJhX2NhY2hlX3NpemUpOworICAgIEFERF9WRUNUT1IoYS0+ZGlzdGFuY2VfLCBiLT5kaXN0YW5jZV8sIG91dC0+ZGlzdGFuY2VfLAorICAgICAgICAgICAgICAgTlVNX0RJU1RBTkNFX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SKGEtPnJlZF8sIGItPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1IoYS0+Ymx1ZV8sIGItPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUihhLT5hbHBoYV8sIGItPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgfSBlbHNlIHsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmxpdGVyYWxfLCBvdXQtPmxpdGVyYWxfLAorICAgICAgICAgICAgICAgICAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTLCBleHRyYV9jYWNoZV9zaXplKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmRpc3RhbmNlXywgb3V0LT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5yZWRfLCBvdXQtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SX0VRKGEtPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5hbHBoYV8sIG91dC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgIH0KK30KKworI3VuZGVmIEFERF9WRUNUT1JfRVEKKyN1bmRlZiBBRERfVkVDVE9SCisjdW5kZWYgQVNNX0VORF8xCisjdW5kZWYgQVNNX0VORF8wCisjdW5kZWYgQVNNX0VORF9DT01NT05fMQorI3VuZGVmIEFTTV9FTkRfQ09NTU9OXzAKKyN1bmRlZiBBRERfVE9fT1VUCisjdW5kZWYgQVNNX1NUQVJUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0TUlQUzMyKHZvaWQpIHsKKyAgVlA4TEZhc3RTTG9nMlNsb3cgPSBGYXN0U0xvZzJTbG93OworICBWUDhMRmFzdExvZzJTbG93ID0gRmFzdExvZzJTbG93OworICBWUDhMRXh0cmFDb3N0ID0gRXh0cmFDb3N0OworICBWUDhMRXh0cmFDb3N0Q29tYmluZWQgPSBFeHRyYUNvc3RDb21iaW5lZDsKKyAgVlA4TEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIgPSBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyOworICBWUDhMSGlzdG9ncmFtQWRkID0gSGlzdG9ncmFtQWRkOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhN2ZjMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDI3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgIi4vbG9zc2xlc3MuaCIKKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgdWludDMyX3QgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBhcmdiX2RhdGEgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gcF9sb29wMV9lbmQgKyAobnVtX3BpeGVscyAmIDMpOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMV9lbmRdLCAgICAgM2YgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgICAgIDQoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgICAgIDgoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgICAgIDEyKCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbYXJnYl9kYXRhXSwgICAgICAgMTYgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgJVt0ZW1wNV0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAyXSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgJVt0ZW1wNl0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAzXSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgJVt0ZW1wN10gXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAwXSwgICAgICAgIC0xNiglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAxXSwgICAgICAgIC0xMiglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAyXSwgICAgICAgIC04KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMV9lbmRdLCAgICAgMGIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAzXSwgICAgICAgIC00KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMl9lbmRdLCAgICAgMmYgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbYXJnYl9kYXRhXSwgICAgICAgNCAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAiYm5lICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMl9lbmRdLCAgICAgMWIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAwXSwgICAgICAgIC00KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFthcmdiX2RhdGFdIismciIoYXJnYl9kYXRhKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpLAorICAgICAgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgeworICByZXR1cm4gKHVpbnQzMl90KSgoaW50KShjb2xvcl9wcmVkKSAqIGNvbG9yKSA+PiA1OworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvcihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sIHVpbnQzMl90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIHVpbnQzMl90IGFyZ2IsIGFyZ2IxLCBuZXdfcmVkLCBuZXdfcmVkMTsKKyAgY29uc3QgdWludDMyX3QgR190b19SID0gbS0+Z3JlZW5fdG9fcmVkXzsKKyAgY29uc3QgdWludDMyX3QgR190b19CID0gbS0+Z3JlZW5fdG9fYmx1ZV87CisgIGNvbnN0IHVpbnQzMl90IFJfdG9fQiA9IG0tPnJlZF90b19ibHVlXzsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcF9lbmQgPSBkYXRhICsgKG51bV9waXhlbHMgJiB+MSk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgICVbZGF0YV0sICAgICAgJVtwX2xvb3BfZW5kXSwgIDFmICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAwXSwgICAgICVbR190b19SXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDFdLCAgICAgJVtHX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMl0sICAgICAlW1JfdG9fQl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAwXSwgICAgICVbdGVtcDBdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAyXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYl0sICAgICAgMCglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAgJVthcmdiMV0sICAgICA0KCVbZGF0YV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxodSAgICAgICAgICAgICAlW25ld19yZWRdLCAgIDIoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh1ICAgICAgICAgICAgICVbbmV3X3JlZDFdLCAgNiglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucWIucGggICAgJVt0ZW1wM10sICAgICAlW2FyZ2JdLCAgICAgICAgJVthcmdiMV0gIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA0XSwgICAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDBdICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXAyXSAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgICVbZGF0YV0sICAgICAgJVtkYXRhXSwgICAgICAgIDggICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAgJVtuZXdfcmVkMV0sICAlW25ld19yZWRdLCAgICAgMTYsICAgMTYgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYl0sICAgICAgICAxNiwgICAxNiAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICVbbmV3X3JlZDFdLCAgJVtuZXdfcmVkMV0sICAgICVbdGVtcDVdICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wM10gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXA1XSwgICAgICVbbmV3X3JlZDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDRdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW2FyZ2IxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC0yKCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTQoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICAxNiAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTYoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgICAgJVtkYXRhXSwgICAgICAlW3BfbG9vcF9lbmRdLCAgMGIgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAgICAgICAlW3RlbXAzXSwgICAgIC04KCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtuZXdfcmVkMV0iPSZyIihuZXdfcmVkMSksIFtuZXdfcmVkXSI9JnIiKG5ld19yZWQpLAorICAgICAgW2FyZ2JdIj0mciIoYXJnYiksIFthcmdiMV0iPSZyIihhcmdiMSksIFtkYXRhXSIrJnIiKGRhdGEpCisgICAgOiBbR190b19SXSJyIihHX3RvX1IpLCBbUl90b19CXSJyIihSX3RvX0IpLAorICAgICAgW0dfdG9fQl0iciIoR190b19CKSwgW3BfbG9vcF9lbmRdInIiKHBfbG9vcF9lbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIGlmIChudW1fcGl4ZWxzICYgMSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2JfID0gZGF0YVswXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2JfID4+IDg7CisgICAgY29uc3QgdWludDMyX3QgcmVkID0gYXJnYl8gPj4gMTY7CisgICAgdWludDMyX3QgbmV3X2JsdWUgPSBhcmdiXzsKKyAgICBuZXdfcmVkID0gcmVkOworICAgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7CisgICAgbmV3X3JlZCAmPSAweGZmOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgcmVkKTsKKyAgICBuZXdfYmx1ZSAmPSAweGZmOworICAgIGRhdGFbMF0gPSAoYXJnYl8gJiAweGZmMDBmZjAwdSkgfCAobmV3X3JlZCA8PCAxNikgfCAobmV3X2JsdWUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yQmx1ZSh1aW50OF90IGdyZWVuX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICB1aW50OF90IG5ld19ibHVlID0gYXJnYjsKKyAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19ibHVlLCBncmVlbik7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocmVkX3RvX2JsdWUsIHJlZCk7CisgIHJldHVybiAobmV3X2JsdWUgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IGludCBydGIgPSAocmVkX3RvX2JsdWUgPDwgMTYpIHwgKHJlZF90b19ibHVlICYgMHhmZmZmKTsKKyAgY29uc3QgaW50IGd0YiA9IChncmVlbl90b19ibHVlIDw8IDE2KSB8IChncmVlbl90b19ibHVlICYgMHhmZmZmKTsKKyAgY29uc3QgdWludDMyX3QgbWFzayA9IDB4ZmYwMGZmdTsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgY29uc3QgdWludDMyX3QqIHBfYXJnYiA9IGFyZ2I7CisgICAgYXJnYiArPSBzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8ICh0aWxlX3dpZHRoID4+IDEpOyArK3gpIHsKKyAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHcgICAgICAgICAgICVbdGVtcDBdLCAgMCglW3BfYXJnYl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMV0sICA0KCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAlW3RlbXAyXSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAxNiwgICAgMTYgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnBoICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMl0sICAlW3J0Yl0gICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucGggICAgICAgJVt0ZW1wNl0sICAlW3RlbXAzXSwgICVbZ3RiXSAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDFdLCAgJVttYXNrXSAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgICAgICVbcF9hcmdiXSwgJVtwX2FyZ2JdLCA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidS5xYiAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNF0sICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICAgOiBbcF9hcmdiXSIrJnIiKHBfYXJnYiksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwKKyAgICAgICAgICBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgICAgIDogW3J0Yl0iciIocnRiKSwgW2d0Yl0iciIoZ3RiKSwgW21hc2tdInIiKG1hc2spCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICk7CisgICAgICArK2hpc3RvWyh1aW50OF90KSh0ZW1wMiA+PiAxNildOworICAgICAgKytoaXN0b1sodWludDhfdCl0ZW1wMl07CisgICAgfQorICAgIGlmICh0aWxlX3dpZHRoICYgMSkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvckJsdWUoZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsICpwX2FyZ2IpXTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JSZWQodWludDhfdCBncmVlbl90b19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICB1aW50MzJfdCBuZXdfcmVkID0gYXJnYiA+PiAxNjsKKyAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX3JlZCwgZ3JlZW4pOworICByZXR1cm4gKG5ld19yZWQgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtcyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgaW50IGd0ciA9IChncmVlbl90b19yZWQgPDwgMTYpIHwgKGdyZWVuX3RvX3JlZCAmIDB4ZmZmZik7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGNvbnN0IHVpbnQzMl90KiBwX2FyZ2IgPSBhcmdiOworICAgIGFyZ2IgKz0gc3RyaWRlOworICAgIGZvciAoeCA9IDA7IHggPCAodGlsZV93aWR0aCA+PiAxKTsgKyt4KSB7CisgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMF0sICAwKCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICAgICAlW3RlbXAxXSwgIDQoJVtwX2FyZ2JdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnBoLncgICVbdGVtcDRdLCAgJVt0ZW1wMF0sICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgIDE2LCAgICAxNiAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnBoICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wM10sICAlW2d0cl0gICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAgICAgJVtwX2FyZ2JdLCAlW3BfYXJnYl0sIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidS5xYiAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNF0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgIDogW3BfYXJnYl0iKyZyIihwX2FyZ2IpLCBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCkKKyAgICAgICAgOiBbZ3RyXSJyIihndHIpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICk7CisgICAgICArK2hpc3RvWyh1aW50OF90KSh0ZW1wMiA+PiAxNildOworICAgICAgKytoaXN0b1sodWludDhfdCl0ZW1wMl07CisgICAgfQorICAgIGlmICh0aWxlX3dpZHRoICYgMSkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvclJlZChncmVlbl90b19yZWQsICpwX2FyZ2IpXTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkOworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBUcmFuc2Zvcm1Db2xvcjsKKyAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXM7CisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtczsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwNjVjZgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5jCkBAIC0wLDAgKzEsMzk3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3MuaCIKKworLy8gRm9yIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA1OgorI2RlZmluZSBDU1RfNWIoWCkgICgoKGludDE2X3QpKCh1aW50MTZfdClYIDw8IDgpKSA+PiA1KQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCh1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fc3JsaV9lcGkxNihpbiwgOCk7ICAgICAvLyAwIGEgMCBnCisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3NodWZmbGVsb19lcGkxNihBLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3NodWZmbGVoaV9lcGkxNihCLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7ICAvLyAwZzBnCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fc3ViX2VwaTgoaW4sIEMpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0sIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyhhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3IoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19yYiA9IF9tbV9zZXRfZXBpMTYoCisgICAgICBDU1RfNWIobS0+Z3JlZW5fdG9fcmVkXyksIENTVF81YihtLT5ncmVlbl90b19ibHVlXyksCisgICAgICBDU1RfNWIobS0+Z3JlZW5fdG9fcmVkXyksIENTVF81YihtLT5ncmVlbl90b19ibHVlXyksCisgICAgICBDU1RfNWIobS0+Z3JlZW5fdG9fcmVkXyksIENTVF81YihtLT5ncmVlbl90b19ibHVlXyksCisgICAgICBDU1RfNWIobS0+Z3JlZW5fdG9fcmVkXyksIENTVF81YihtLT5ncmVlbl90b19ibHVlXykpOworICBjb25zdCBfX20xMjhpIG11bHRzX2IyID0gX21tX3NldF9lcGkxNigKKyAgICAgIENTVF81YihtLT5yZWRfdG9fYmx1ZV8pLCAwLCBDU1RfNWIobS0+cmVkX3RvX2JsdWVfKSwgMCwKKyAgICAgIENTVF81YihtLT5yZWRfdG9fYmx1ZV8pLCAwLCBDU1RfNWIobS0+cmVkX3RvX2JsdWVfKSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19hZyA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYwMGZmMDApOyAgLy8gYWxwaGEtZ3JlZW4gbWFza3MKKyAgY29uc3QgX19tMTI4aSBtYXNrX3JiID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDBmZik7ICAvLyByZWQtYmx1ZSBtYXNrcworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7IC8vIGFyZ2IKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fYW5kX3NpMTI4KGluLCBtYXNrX2FnKTsgICAgIC8vIGEgICAwICAgZyAgIDAKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsKKyAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KEIsIF9NTV9TSFVGRkxFKDIsIDIsIDAsIDApKTsgIC8vIGcwZzAKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbXVsaGlfZXBpMTYoQywgbXVsdHNfcmIpOyAgICAvLyB4IGRyICB4IGRiMQorICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9zbGxpX2VwaTE2KGluLCA4KTsgICAgICAgICAgIC8vIHIgMCAgIGIgICAwCisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX211bGhpX2VwaTE2KEUsIG11bHRzX2IyKTsgICAgLy8geCBkYjIgMCAgIDAKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fc3JsaV9lcGkzMihGLCAxNik7ICAgICAgICAgICAvLyAwIDAgICB4IGRiMgorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9hZGRfZXBpOChHLCBEKTsgICAgICAgICAgICAgIC8vIHggZHIgIHggIGRiCisgICAgY29uc3QgX19tMTI4aSBJID0gX21tX2FuZF9zaTEyOChILCBtYXNrX3JiKTsgICAgICAgLy8gMCBkciAgMCAgZGIKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgSSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgVlA4TFRyYW5zZm9ybUNvbG9yX0MobSwgYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBTUEFOIDgKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19ibHVlLCBpbnQgcmVkX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSkgeworICBjb25zdCBfX20xMjhpIG11bHRzX3IgPSBfbW1fc2V0X2VwaTE2KAorICAgICAgQ1NUXzViKHJlZF90b19ibHVlKSwgMCwgQ1NUXzViKHJlZF90b19ibHVlKSwgMCwKKyAgICAgIENTVF81YihyZWRfdG9fYmx1ZSksIDAsIENTVF81YihyZWRfdG9fYmx1ZSksIDApOworICBjb25zdCBfX20xMjhpIG11bHRzX2cgPSBfbW1fc2V0X2VwaTE2KAorICAgICAgMCwgQ1NUXzViKGdyZWVuX3RvX2JsdWUpLCAwLCBDU1RfNWIoZ3JlZW5fdG9fYmx1ZSksCisgICAgICAwLCBDU1RfNWIoZ3JlZW5fdG9fYmx1ZSksIDAsIENTVF81YihncmVlbl90b19ibHVlKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDApOyAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2tfYiA9IF9tbV9zZXQxX2VwaTMyKDB4MDAwMGZmKTsgIC8vIGJsdWUgbWFzaworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgICAgICAgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zbGxpX2VwaTE2KGluMCwgOCk7ICAgICAgICAvLyByIDAgIHwgYiAwCisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3NsbGlfZXBpMTYoaW4xLCA4KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fYW5kX3NpMTI4KGluMCwgbWFza19nKTsgICAgLy8gMCAwICB8IGcgMAorICAgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hbmRfc2kxMjgoaW4xLCBtYXNrX2cpOworICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9tdWxoaV9lcGkxNihBMCwgbXVsdHNfcik7ICAvLyB4IGRiIHwgMCAwCisgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX211bGhpX2VwaTE2KEExLCBtdWx0c19yKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fbXVsaGlfZXBpMTYoQjAsIG11bHRzX2cpOyAgLy8gMCAwICB8IHggZGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fbXVsaGlfZXBpMTYoQjEsIG11bHRzX2cpOworICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zdWJfZXBpOChpbjAsIEQwKTsgICAgICAgICAvLyB4IHggIHwgeCBiJworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zdWJfZXBpOChpbjEsIEQxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjAgPSBfbW1fc3JsaV9lcGkzMihDMCwgMTYpOyAgICAgICAgLy8gMCAwICB8IHggZGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjEgPSBfbW1fc3JsaV9lcGkzMihDMSwgMTYpOworICAgICAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9zdWJfZXBpOChFMCwgRjApOyAgICAgICAgICAvLyAwIDAgIHwgeCBiJworICAgICAgY29uc3QgX19tMTI4aSBHMSA9IF9tbV9zdWJfZXBpOChFMSwgRjEpOworICAgICAgY29uc3QgX19tMTI4aSBIMCA9IF9tbV9hbmRfc2kxMjgoRzAsIG1hc2tfYik7ICAgICAvLyAwIDAgIHwgMCBiCisgICAgICBjb25zdCBfX20xMjhpIEgxID0gX21tX2FuZF9zaTEyOChHMSwgbWFza19iKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9wYWNrc19lcGkzMihIMCwgSDEpOyAgICAgICAgLy8gMCBiJyB8IDAgYicKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXZhbHVlcywgSSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgU1BBTjsgKytpKSArK2hpc3RvW3ZhbHVlc1tpXV07CisgICAgfQorICB9CisgIHsKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gdGlsZV93aWR0aCAmIChTUEFOIC0gMSk7CisgICAgaWYgKGxlZnRfb3ZlciA+IDApIHsKKyAgICAgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X292ZXIsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGhpc3RvKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtcyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19nID0gX21tX3NldF9lcGkxNigKKyAgICAgIDAsIENTVF81YihncmVlbl90b19yZWQpLCAwLCBDU1RfNWIoZ3JlZW5fdG9fcmVkKSwKKyAgICAgIDAsIENTVF81YihncmVlbl90b19yZWQpLCAwLCBDU1RfNWIoZ3JlZW5fdG9fcmVkKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMzIoMHgwMGZmMDApOyAgLy8gZ3JlZW4gbWFzaworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweGZmKTsKKworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgICAgICAgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyBTUEFOIC8gMl0pOworICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBtYXNrX2cpOyAgICAvLyAwIDAgIHwgZyAwCisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2FuZF9zaTEyOChpbjEsIG1hc2tfZyk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX3NybGlfZXBpMzIoaW4wLCAxNik7ICAgICAgIC8vIDAgMCAgfCB4IHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fc3JsaV9lcGkzMihpbjEsIDE2KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fbXVsaGlfZXBpMTYoQTAsIG11bHRzX2cpOyAgLy8gMCAwICB8IHggZHIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fbXVsaGlfZXBpMTYoQTEsIG11bHRzX2cpOworICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zdWJfZXBpOChCMCwgQzApOyAgICAgICAgICAvLyB4IHggIHwgeCByJworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zdWJfZXBpOChCMSwgQzEpOworICAgICAgY29uc3QgX19tMTI4aSBGMCA9IF9tbV9hbmRfc2kxMjgoRTAsIG1hc2spOyAgICAgICAvLyAwIDAgIHwgMCByJworICAgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9hbmRfc2kxMjgoRTEsIG1hc2spOworICAgICAgY29uc3QgX19tMTI4aSBJID0gX21tX3BhY2tzX2VwaTMyKEYwLCBGMSk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil2YWx1ZXMsIEkpOworICAgICAgZm9yIChpID0gMDsgaSA8IFNQQU47ICsraSkgKytoaXN0b1t2YWx1ZXNbaV1dOworICAgIH0KKyAgfQorICB7CisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHRpbGVfd2lkdGggJiAoU1BBTiAtIDEpOworICAgIGlmIChsZWZ0X292ZXIgPiAwKSB7CisgICAgICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfb3ZlciwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX3JlZCwgaGlzdG8pOworICAgIH0KKyAgfQorfQorI3VuZGVmIFNQQU4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBMSU5FX1NJWkUgMTYgICAgLy8gOCBvciAxNgorc3RhdGljIHZvaWQgQWRkVmVjdG9yKGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYiwgdWludDMyX3QqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgYXNzZXJ0KHNpemUgJSBMSU5FX1NJWkUgPT0gMCk7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IExJTkVfU0laRSkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICA4XSk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArIDEyXSk7CisjZW5kaWYKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYltpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAxMl0pOworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDBdLCBfbW1fYWRkX2VwaTMyKGEwLCBiMCkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA0XSwgX21tX2FkZF9lcGkzMihhMSwgYjEpKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA4XSwgX21tX2FkZF9lcGkzMihhMiwgYjIpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAxMl0sIF9tbV9hZGRfZXBpMzIoYTMsIGIzKSk7CisjZW5kaWYKKyAgfQorfQorCitzdGF0aWMgdm9pZCBBZGRWZWN0b3JFcShjb25zdCB1aW50MzJfdCogYSwgdWludDMyX3QqIG91dCwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGFzc2VydChzaXplICUgTElORV9TSVpFID09IDApOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBMSU5FX1NJWkUpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAgOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhW2kgKyAxMl0pOworI2VuZGlmCisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgIDhdKTsKKyAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmb3V0W2kgKyAxMl0pOworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDBdLCBfbW1fYWRkX2VwaTMyKGEwLCBiMCkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA0XSwgX21tX2FkZF9lcGkzMihhMSwgYjEpKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICA4XSwgX21tX2FkZF9lcGkzMihhMiwgYjIpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAxMl0sIF9tbV9hZGRfZXBpMzIoYTMsIGIzKSk7CisjZW5kaWYKKyAgfQorfQorI3VuZGVmIExJTkVfU0laRQorCisvLyBOb3RlIHdlIGFyZSBhZGRpbmcgdWludDMyX3QncyBhcyAqc2lnbmVkKiBpbnQzMidzICh1c2luZyBfbW1fYWRkX2VwaTMyKS4gQnV0CisvLyB0aGF0J3Mgb2sgc2luY2UgdGhlIGhpc3RvZ3JhbSB2YWx1ZXMgYXJlIGxlc3MgdGhhbiAxPDwyOCAobWF4IHBpY3R1cmUgc2l6ZSkuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGQoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGxpdGVyYWxfc2l6ZSA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhhLT5wYWxldHRlX2NvZGVfYml0c18pOworICBhc3NlcnQoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGItPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGlmIChiICE9IG91dCkgeworICAgIEFkZFZlY3RvcihhLT5saXRlcmFsXywgYi0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3IoYS0+cmVkXywgYi0+cmVkXywgb3V0LT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yKGEtPmJsdWVfLCBiLT5ibHVlXywgb3V0LT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvcihhLT5hbHBoYV8sIGItPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgfSBlbHNlIHsKKyAgICBBZGRWZWN0b3JFcShhLT5saXRlcmFsXywgb3V0LT5saXRlcmFsXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvckVxKGEtPnJlZF8sIG91dC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIEFkZFZlY3RvckVxKGEtPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yRXEoYS0+YWxwaGFfLCBvdXQtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMpOworICB9CisgIGZvciAoaSA9IE5VTV9MSVRFUkFMX0NPREVTOyBpIDwgbGl0ZXJhbF9zaXplOyArK2kpIHsKKyAgICBvdXQtPmxpdGVyYWxfW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICBvdXQtPmRpc3RhbmNlX1tpXSA9IGEtPmRpc3RhbmNlX1tpXSArIGItPmRpc3RhbmNlX1tpXTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cm9weQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgWCBvciBZIGNvbnRyaWJ1dGlvbiBpcyB3b3J0aCBjb21wdXRpbmcgYW5kIGFkZGluZy4KKy8vIFVzZWQgaW4gbG9vcCB1bnJvbGxpbmcuCisjZGVmaW5lIEFOQUxZWkVfWF9PUl9ZKHhfb3JfeSwgaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh4X29yX3lbaSArIGpdICE9IDApIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHhfb3JfeVtpICsgal0pOyBcCisgIH0gd2hpbGUgKDApCisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBYICsgWSBjb250cmlidXRpb24gaXMgd29ydGggY29tcHV0aW5nIGFuZCBhZGRpbmcuCisvLyBVc2VkIGluIGxvb3AgdW5yb2xsaW5nLgorI2RlZmluZSBBTkFMWVpFX1hZKGopICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh0bXBbal0gIT0gMCkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIodG1wW2pdKTsgXAorICAgICAgQU5BTFlaRV9YX09SX1koWCwgaik7ICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgZmxvYXQgQ29tYmluZWRTaGFubm9uRW50cm9weShjb25zdCBpbnQgWFsyNTZdLCBjb25zdCBpbnQgWVsyNTZdKSB7CisgIGludCBpOworICBkb3VibGUgcmV0dmFsID0gMC47CisgIGludCBzdW1YLCBzdW1YWTsKKyAgaW50MzJfdCB0bXBbNF07CisgIF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIC8vIFN1bXMgdXAgWCArIFksIDQgaW50cyBhdCBhIHRpbWUgKGFuZCB3aWxsIG1lcmdlIGl0IGF0IHRoZSBlbmQgZm9yIHN1bVhZKS4KKyAgX19tMTI4aSBzdW1YWV8xMjggPSB6ZXJvOworICBfX20xMjhpIHN1bVhfMTI4ID0gemVybzsKKworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShYICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgeSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKFkgKyBpKSk7CisKKyAgICAvLyBDaGVjayBpZiBhbnkgWCBpcyBub24temVybzogdGhpcyBhY3R1YWxseSBwcm92aWRlcyBhIHNwZWVkdXAgYXMgWCBpcworICAgIC8vIHVzdWFsbHkgc3BhcnNlLgorICAgIGlmIChfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpMzIoeCwgemVybykpICE9IDB4RkZGRikgeworICAgICAgY29uc3QgX19tMTI4aSB4eV8xMjggPSBfbW1fYWRkX2VwaTMyKHgsIHkpOworICAgICAgc3VtWFlfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YWV8xMjgsIHh5XzEyOCk7CisKKyAgICAgIHN1bVhfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YXzEyOCwgeCk7CisKKyAgICAgIC8vIEFuYWx5emUgdGhlIGRpZmZlcmVudCBYICsgWS4KKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgeHlfMTI4KTsKKworICAgICAgQU5BTFlaRV9YWSgwKTsKKyAgICAgIEFOQUxZWkVfWFkoMSk7CisgICAgICBBTkFMWVpFX1hZKDIpOworICAgICAgQU5BTFlaRV9YWSgzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gWCBpcyBmdWxseSAwLCBzbyBvbmx5IGRlYWwgd2l0aCBZLgorICAgICAgc3VtWFlfMTI4ID0gX21tX2FkZF9lcGkzMihzdW1YWV8xMjgsIHkpOworCisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAwKTsKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFksIDEpOworICAgICAgQU5BTFlaRV9YX09SX1koWSwgMik7CisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAzKTsKKyAgICB9CisgIH0KKworICAvLyBTdW0gdXAgc3VtWF8xMjggdG8gZ2V0IHN1bVguCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtWF8xMjgpOworICBzdW1YID0gdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworCisgIC8vIFN1bSB1cCBzdW1YWV8xMjggdG8gZ2V0IHN1bVhZLgorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bVhZXzEyOCk7CisgIHN1bVhZID0gdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworCisgIHJldHZhbCArPSBWUDhMRmFzdFNMb2cyKHN1bVgpICsgVlA4TEZhc3RTTG9nMihzdW1YWSk7CisgIHJldHVybiAoZmxvYXQpcmV0dmFsOworfQorI3VuZGVmIEFOQUxZWkVfWF9PUl9ZCisjdW5kZWYgQU5BTFlaRV9YWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFZlY3Rvck1pc21hdGNoKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTIsIGludCBsZW5ndGgpIHsKKyAgaW50IG1hdGNoX2xlbjsKKworICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVswXSk7CisgICAgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MlswXSk7CisgICAgbWF0Y2hfbGVuID0gMDsKKyAgICBkbyB7CisgICAgICAvLyBMb29wIHVucm9sbGluZyBhbmQgZWFybHkgbG9hZCBib3RoIHByb3ZpZGUgYSBzcGVlZHVwIG9mIDEwJSBmb3IgdGhlCisgICAgICAvLyBjdXJyZW50IGZ1bmN0aW9uLiBBbHNvLCBtYXhfbGltaXQgY2FuIGJlIE1BWF9MRU5HVEg9NDA5NiBhdCBtb3N0LgorICAgICAgY29uc3QgX19tMTI4aSBjbXBBID0gX21tX2NtcGVxX2VwaTMyKEEwLCBBMSk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0KKyAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbbWF0Y2hfbGVuICsgNF0pOworICAgICAgY29uc3QgX19tMTI4aSBCMSA9CisgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyW21hdGNoX2xlbiArIDRdKTsKKyAgICAgIGlmIChfbW1fbW92ZW1hc2tfZXBpOChjbXBBKSAhPSAweGZmZmYpIGJyZWFrOworICAgICAgbWF0Y2hfbGVuICs9IDQ7CisKKyAgICAgIHsKKyAgICAgICAgY29uc3QgX19tMTI4aSBjbXBCID0gX21tX2NtcGVxX2VwaTMyKEIwLCBCMSk7CisgICAgICAgIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxW21hdGNoX2xlbiArIDRdKTsKKyAgICAgICAgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbbWF0Y2hfbGVuICsgNF0pOworICAgICAgICBpZiAoX21tX21vdmVtYXNrX2VwaTgoY21wQikgIT0gMHhmZmZmKSBicmVhazsKKyAgICAgICAgbWF0Y2hfbGVuICs9IDQ7CisgICAgICB9CisgICAgfSB3aGlsZSAobWF0Y2hfbGVuICsgMTIgPCBsZW5ndGgpOworICB9IGVsc2UgeworICAgIG1hdGNoX2xlbiA9IDA7CisgICAgLy8gVW5yb2xsIHRoZSBwb3RlbnRpYWwgZmlyc3QgdHdvIGxvb3BzLgorICAgIGlmIChsZW5ndGggPj0gNCAmJgorICAgICAgICBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpMzIoCisgICAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbMF0pLAorICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyWzBdKSkpID09IDB4ZmZmZikgeworICAgICAgbWF0Y2hfbGVuID0gNDsKKyAgICAgIGlmIChsZW5ndGggPj0gOCAmJgorICAgICAgICAgIF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGkzMigKKyAgICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxWzRdKSwKKyAgICAgICAgICAgICAgX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyWzRdKSkpID09IDB4ZmZmZikKKyAgICAgICAgbWF0Y2hfbGVuID0gODsKKyAgICB9CisgIH0KKworICB3aGlsZSAobWF0Y2hfbGVuIDwgbGVuZ3RoICYmIGFycmF5MVttYXRjaF9sZW5dID09IGFycmF5MlttYXRjaF9sZW5dKSB7CisgICAgKyttYXRjaF9sZW47CisgIH0KKyAgcmV0dXJuIG1hdGNoX2xlbjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQ7CisgIFZQOExUcmFuc2Zvcm1Db2xvciA9IFRyYW5zZm9ybUNvbG9yOworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtczsKKyAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zOworICBWUDhMSGlzdG9ncmFtQWRkID0gSGlzdG9ncmFtQWRkOworICBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSA9IENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisgIFZQOExWZWN0b3JNaXNtYXRjaCA9IFZlY3Rvck1pc21hdGNoOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwYjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYwpAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNC4xIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZW5jb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c21taW50cmluLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3MuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQodWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkga0NzdFNodWZmbGUgPSBfbW1fc2V0X2VwaTgoLTEsIDEzLCAtMSwgMTMsIC0xLCA5LCAtMSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgIDUsIC0xLCAgNSwgLTEsIDEsIC0xLCAxKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7CisgICAgY29uc3QgX19tMTI4aSBpbl8wZzBnID0gX21tX3NodWZmbGVfZXBpOChpbiwga0NzdFNodWZmbGUpOworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3N1Yl9lcGk4KGluLCBpbl8wZzBnKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0MoYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0U1NFNDEodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdFNTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZGI3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDY4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICIuL2xvc3NsZXNzLmgiCisKKyNkZWZpbmUgTUFQX0NPTE9SX0ZVTkNTKEZVTkNfTkFNRSwgVFlQRSwgR0VUX0lOREVYLCBHRVRfVkFMVUUpICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgVFlQRSogc3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBUWVBFKiBkc3QsIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMik7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5pZmMgICAgICAgICIgI1RZUEUgIiwgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDFdLCAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsYnUgICAgICAgJVt0bXAyXSwgIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGJ1ICAgICAgICVbdG1wM10sICAyKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDRdLCAgMyglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICVbc3JjXSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50MzJfdCAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXAxXSwgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHcgICAgICAgICVbdG1wMl0sICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3ICAgICAgICAlW3RtcDNdLCAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXA0XSwgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgJVtzcmNdLCAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNsbCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzbGwgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICAyICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDFdLCAgJVt0bXAxXSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsd3ggICAgICAgJVt0bXAyXSwgICVbdG1wMl0oJVtjb2xvcl9tYXBdKSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHd4ICAgICAgICVbdG1wM10sICAlW3RtcDNdKCVbY29sb3JfbWFwXSkgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDRdLCAgJVt0bXA0XSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmlmYyAgICAgICAgIiAjVFlQRSAiLCAgdWludDhfdCAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wMV0sICAlW3RtcDFdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDJdLCAgJVt0bXAyXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAzXSwgICVbdG1wM10sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wNF0sICAlW3RtcDRdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDFdLCAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzYiAgICAgICAgJVt0bXAyXSwgIDEoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2IgICAgICAgICVbdG1wM10sICAyKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDRdLCAgMyglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtkc3RdLCAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50MzJfdCAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXAxXSwgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic3cgICAgICAgICVbdG1wMl0sICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInN3ICAgICAgICAlW3RtcDNdLCAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXA0XSwgIDEyKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkaXUgICAgICVbZHN0XSwgICAlW2RzdF0sICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogW3RtcDFdIj0mciIodG1wMSksIFt0bXAyXSI9JnIiKHRtcDIpLCBbdG1wM10iPSZyIih0bXAzKSwgICAgICAgICAgICAgXAorICAgICAgICAgIFt0bXA0XSI9JnIiKHRtcDQpLCBbc3JjXSIrJnIiKHNyYyksIFtkc3RdIityIihkc3QpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBbY29sb3JfbWFwXSJyIihjb2xvcl9tYXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8ICh3aWR0aCAmIDMpOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtHRVRfSU5ERVgoKnNyYysrKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitNQVBfQ09MT1JfRlVOQ1MoTWFwQVJHQiwgdWludDMyX3QsIFZQOEdldEFSR0JJbmRleCwgVlA4R2V0QVJHQlZhbHVlKQorTUFQX0NPTE9SX0ZVTkNTKE1hcEFscGhhLCB1aW50OF90LCBWUDhHZXRBbHBoYUluZGV4LCBWUDhHZXRBbHBoYVZhbHVlKQorCisjdW5kZWYgTUFQX0NPTE9SX0ZVTkNTCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDFdLCAgICVbYzBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgJVtjMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAlW2MxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDRdLCAgICVbYzFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNV0sICAgJVtjMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAwXSwgICAlW2MyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VicS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDVdICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wMF0gIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDRdICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDFdICBcblx0IgorICAgIDogW3RlbXAwXSI9ciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KQorICAgIDogW2MwXSJyIihjMCksIFtjMV0iciIoYzEpLCBbYzJdInIiKGMyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKyAgcmV0dXJuIHRlbXAyOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImFkZHVoLnFiICAgICAgICAgJVt0ZW1wNV0sICAgJVtjMF0sICAgICAgJVtjMV0gICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAzXSwgICAlW2MyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDFdLCAgICVbdGVtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXA0XSwgICAlW2MyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgInN1YnEucGggICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hybC5waCAgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAxNSAgICAgICAgICBcblx0IgorICAgICJzaHJsLnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAgIDE1ICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAwXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj1yIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj1yIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSkKKyAgICA6IFtjMF0iciIoYzApLCBbYzFdInIiKGMxKSwgW2MyXSJyIihjMikKKyAgICA6ICJtZW1vcnkiCisgICk7CisgIHJldHVybiB0ZW1wMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiY21wZ2R1Lmx0LnFiICVbdGVtcDFdLCAlW2NdLCAgICAgJVtiXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wMV0sICVbYl0sICAgICAlW2NdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXAyXSwgJVtjXSwgICAgICVbYl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiY21wZ2R1Lmx0LnFiICVbdGVtcDRdLCAlW2NdLCAgICAgJVthXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wNF0sICVbYV0sICAgICAlW2NdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXA1XSwgJVtjXSwgICAgICVbYV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAgICVbdGVtcDNdLCAlW3RlbXAxXSwgJVt0ZW1wMl0gICAgICAgICBcblx0IgorICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMF0sICVbdGVtcDRdLCAlW3RlbXA1XSAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgICAgJVt0ZW1wM10sICVbdGVtcDNdLCAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisgICAgInNsdGkgICAgICAgICAlW3RlbXAwXSwgJVt0ZW1wM10sIDB4MSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgICAgICVbYV0sICAgICAlW2JdLCAgICAgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbYV0iKyZyIihhKQorICAgIDogW2JdInIiKGIpLCBbY10iciIoYykKKyAgKTsKKyAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImFkZHVoLnFiICAgICVbYTBdLCAlW2EwXSwgJVthMV0gICAgICAgXG5cdCIKKyAgICA6IFthMF0iK3IiKGEwKQorICAgIDogW2ExXSJyIihhMSkKKyAgKTsKKyAgcmV0dXJuIGEwOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjYodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQXZlcmFnZTIobGVmdCwgdG9wWy0xXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I5KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEF2ZXJhZ2UyKHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbChsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworfQorCisvLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCisvLyAnc3VidHJhY3QgZ3JlZW4nKS4KK3N0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkKHVpbnQzMl90KiBkYXRhLCBpbnQgbnVtX3BpeGVscykgeworICB1aW50MzJfdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgIHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IGRhdGEgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gZGF0YSArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbZGF0YV0sICAgICAgICAgJVtwX2xvb3AxX2VuZF0sICAgICAzZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW2RhdGFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgNCglW2RhdGFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgOCglW2RhdGFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAgICAgMTIoJVtkYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZGF0YV0sICAgICAgICAgJVtkYXRhXSwgICAgICAgICAgICAxNiAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDFdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICAlW3RlbXA1XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDJdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICAlW3RlbXA2XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDNdLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICAlW3RlbXA3XSBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTE2KCVbZGF0YV0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgLTEyKCVbZGF0YV0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgLTgoJVtkYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbZGF0YV0sICAgICAgICAgJVtwX2xvb3AxX2VuZF0sICAgICAwYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDNdLCAgICAgICAgLTQoJVtkYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbZGF0YV0sICAgICAgICAgJVtwX2xvb3AyX2VuZF0sICAgICAyZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW2RhdGFdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZGF0YV0sICAgICAgICAgJVtkYXRhXSwgICAgICAgICAgICA0ICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJibmUgICAgICAgICVbZGF0YV0sICAgICAgICAgJVtwX2xvb3AyX2VuZF0sICAgICAxYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTQoJVtkYXRhXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW2RhdGFdIismciIoZGF0YSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLAorICAgICAgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvckludmVyc2UoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkYXRhLCBpbnQgbnVtX3BpeGVscykgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgdWludDMyX3QgYXJnYiwgYXJnYjEsIG5ld19yZWQ7CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fUiA9IG0tPmdyZWVuX3RvX3JlZF87CisgIGNvbnN0IHVpbnQzMl90IEdfdG9fQiA9IG0tPmdyZWVuX3RvX2JsdWVfOworICBjb25zdCB1aW50MzJfdCBSX3RvX0IgPSBtLT5yZWRfdG9fYmx1ZV87CisgIHVpbnQzMl90KiBjb25zdCBwX2xvb3BfZW5kID0gZGF0YSArIChudW1fcGl4ZWxzICYgfjEpOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICAlW2RhdGFdLCAgICAgICVbcF9sb29wX2VuZF0sICAxZiAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMF0sICAgICAlW0dfdG9fUl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAxXSwgICAgICVbR190b19CXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDJdLCAgICAgJVtSX3RvX0JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMF0sICAgICAlW3RlbXAwXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAxXSwgICAgICVbdGVtcDFdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wMl0sICAgICAgIDggICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICAlW2FyZ2JdLCAgICAgIDAoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgNCglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAgJVtkYXRhXSwgICAgICAlW2RhdGFdLCAgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5xYi5waCAgICAlW3RlbXAzXSwgICAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDBdICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMV0gIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAlW25ld19yZWRdLCAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiXSwgICAgICAgIDE2LCAgIDE2ICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbbmV3X3JlZF0sICAgJVtuZXdfcmVkXSwgICAgICVbdGVtcDVdICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wM10gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXA1XSwgICAgICVbbmV3X3JlZF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNV0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXAyXSAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTIoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDRdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDRdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW2FyZ2IxXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC02KCVbZGF0YV0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTQoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgMTYgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgICAgICAlW2RhdGFdLCAgICAgICVbcF9sb29wX2VuZF0sICAwYiAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTgoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW25ld19yZWRdIj0mciIobmV3X3JlZCksIFthcmdiXSI9JnIiKGFyZ2IpLAorICAgICAgW2FyZ2IxXSI9JnIiKGFyZ2IxKSwgW2RhdGFdIismciIoZGF0YSkKKyAgICA6IFtHX3RvX1JdInIiKEdfdG9fUiksIFtSX3RvX0JdInIiKFJfdG9fQiksCisgICAgICBbR190b19CXSJyIihHX3RvX0IpLCBbcF9sb29wX2VuZF0iciIocF9sb29wX2VuZCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgLy8gRmFsbC1iYWNrIHRvIEMtdmVyc2lvbiBmb3IgbGVmdC1vdmVycy4KKyAgaWYgKG51bV9waXhlbHMgJiAxKSBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MobSwgZGF0YSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0IoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDI0LCAgIDggICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDAsICAgIDE2ICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAzXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAyXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDEyICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDMgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAlW3RlbXAxXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAlW3RlbXAwXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAxXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAyXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAxXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDNdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wM10sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgICAgJVt0ZW1wMl0gICBcblx0IgorI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDNdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAxXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wM10sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgOCAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAlW3RlbXAwXSAgIFxuXHQiCisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJibmUgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAyICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQjU2NShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDNdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAyXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDJdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2VuZGlmCisgICAgImJuZSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgMGIgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDggICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMmYgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDBdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMiAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1IoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDI0LCAgICA4ICAgICBcblx0IgorICAgICJzcmEgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICAgICAgOCAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdLCAgICAgICAgICAxNiwgICAgMTYgICAgXG5cdCIKKyAgICAic2xsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDggICAgICAgICAgICBcblx0IgorICAgICJiYWxpZ24gICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDFdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wM10sICAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMTIgICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAlW3RlbXAwXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAlW3RlbXAwXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdE1JUFNkc3BSMih2b2lkKSB7CisgIFZQOExNYXBDb2xvcjMyYiA9IE1hcEFSR0I7CisgIFZQOExNYXBDb2xvcjhiID0gTWFwQWxwaGE7CisgIFZQOExQcmVkaWN0b3JzWzVdID0gUHJlZGljdG9yNTsKKyAgVlA4TFByZWRpY3RvcnNbNl0gPSBQcmVkaWN0b3I2OworICBWUDhMUHJlZGljdG9yc1s3XSA9IFByZWRpY3Rvcjc7CisgIFZQOExQcmVkaWN0b3JzWzhdID0gUHJlZGljdG9yODsKKyAgVlA4TFByZWRpY3RvcnNbOV0gPSBQcmVkaWN0b3I5OworICBWUDhMUHJlZGljdG9yc1sxMF0gPSBQcmVkaWN0b3IxMDsKKyAgVlA4TFByZWRpY3RvcnNbMTFdID0gUHJlZGljdG9yMTE7CisgIFZQOExQcmVkaWN0b3JzWzEyXSA9IFByZWRpY3RvcjEyOworICBWUDhMUHJlZGljdG9yc1sxM10gPSBQcmVkaWN0b3IxMzsKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQ7CisgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgPSBUcmFuc2Zvcm1Db2xvckludmVyc2U7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gQ29udmVydEJHUkFUb1JHQjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gQ29udmVydEJHUkFUb1JHQkE7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQgPSBDb252ZXJ0QkdSQVRvUkdCQTQ0NDQ7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1ID0gQ29udmVydEJHUkFUb1JHQjU2NTsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBDb252ZXJ0QkdSQVRvQkdSOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzX3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlODlhNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzc19zc2UyLmMKQEAgLTAsMCArMSwzNzIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZGljdG9yIFRyYW5zZm9ybQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzApLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMxKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMiksIHplcm8pOworICBjb25zdCBfX20xMjhpIFYxID0gX21tX2FkZF9lcGkxNihDMCwgQzEpOworICBjb25zdCBfX20xMjhpIFYyID0gX21tX3N1Yl9lcGkxNihWMSwgQzIpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fcGFja3VzX2VwaTE2KFYyLCBWMik7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKGIpOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzApLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMxKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMiksIHplcm8pOworICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9hZGRfZXBpMTYoQzEsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zcmxpX2VwaTE2KGF2ZywgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc3ViX2VwaTE2KEEwLCBCMCk7CisgIGNvbnN0IF9fbTEyOGkgQmd0QSA9IF9tbV9jbXBndF9lcGkxNihCMCwgQTApOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3N1Yl9lcGkxNihBMSwgQmd0QSk7CisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc3JhaV9lcGkxNihBMiwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fYWRkX2VwaTE2KEEwLCBBMyk7CisgIGNvbnN0IF9fbTEyOGkgQTUgPSBfbW1fcGFja3VzX2VwaTE2KEE0LCBBNCk7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKEE1KTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGludCBwYV9taW51c19wYjsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGEpOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX2N2dHNpMzJfc2kxMjgoYik7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fY3Z0c2kzMl9zaTEyOChjKTsKKyAgY29uc3QgX19tMTI4aSBBQzAgPSBfbW1fc3Vic19lcHU4KEEwLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgQ0EwID0gX21tX3N1YnNfZXB1OChDMCwgQTApOworICBjb25zdCBfX20xMjhpIEJDMCA9IF9tbV9zdWJzX2VwdTgoQjAsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBDQjAgPSBfbW1fc3Vic19lcHU4KEMwLCBCMCk7CisgIGNvbnN0IF9fbTEyOGkgQUMgPSBfbW1fb3Jfc2kxMjgoQUMwLCBDQTApOworICBjb25zdCBfX20xMjhpIEJDID0gX21tX29yX3NpMTI4KEJDMCwgQ0IwKTsKKyAgY29uc3QgX19tMTI4aSBwYSA9IF9tbV91bnBhY2tsb19lcGk4KEFDLCB6ZXJvKTsgIC8vIHxhIC0gY3wKKyAgY29uc3QgX19tMTI4aSBwYiA9IF9tbV91bnBhY2tsb19lcGk4KEJDLCB6ZXJvKTsgIC8vIHxiIC0gY3wKKyAgY29uc3QgX19tMTI4aSBkaWZmID0gX21tX3N1Yl9lcGkxNihwYiwgcGEpOworICB7CisgICAgaW50MTZfdCBvdXRbOF07CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopb3V0LCBkaWZmKTsKKyAgICBwYV9taW51c19wYiA9IG91dFswXSArIG91dFsxXSArIG91dFsyXSArIG91dFszXTsKKyAgfQorICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIEF2ZXJhZ2UyXzEyOGkodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChhMCksIHplcm8pOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYTEpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KEExLCBBMCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnID0gX21tX3NybGlfZXBpMTYoc3VtLCAxKTsKKyAgcmV0dXJuIGF2ZzsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICBjb25zdCBfX20xMjhpIGF2ZyA9IEF2ZXJhZ2UyXzEyOGkoYTAsIGExKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9wYWNrdXNfZXBpMTYoYXZnLCBhdmcpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBMik7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMyh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsIHVpbnQzMl90IGEyKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IEF2ZXJhZ2UyXzEyOGkoYTAsIGEyKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGExKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihhdmcxLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fcGFja3VzX2VwaTE2KGF2ZzIsIGF2ZzIpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBMik7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNCh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IEF2ZXJhZ2UyXzEyOGkoYTAsIGExKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gQXZlcmFnZTJfMTI4aShhMiwgYTMpOworICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoYXZnMiwgYXZnMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMyA9IF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fcGFja3VzX2VwaTE2KGF2ZzMsIGF2ZzMpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBMCk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMihsZWZ0LCB0b3BbMF0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjkodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWzBdLCB0b3BbMV0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlNChsZWZ0LCB0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEzKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgQWRkR3JlZW5Ub0JsdWVBbmRSZWQodWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOyAvLyBhcmdiCisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX3NybGlfZXBpMTYoaW4sIDgpOyAgICAgLy8gMCBhIDAgZworICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gMGcwZworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX2FkZF9lcGk4KGluLCBDKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyhhcmdiX2RhdGEgKyBpLCBudW1fcGl4ZWxzIC0gaSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JJbnZlcnNlKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscykgeworICAvLyBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNS4KKyNkZWZpbmUgQ1NUKFgpICAoKChpbnQxNl90KShtLT5YIDw8IDgpKSA+PiA1KSAgIC8vIHNpZ24tZXh0ZW5kCisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfcmIgPSBfbW1fc2V0X2VwaTE2KAorICAgICAgQ1NUKGdyZWVuX3RvX3JlZF8pLCBDU1QoZ3JlZW5fdG9fYmx1ZV8pLAorICAgICAgQ1NUKGdyZWVuX3RvX3JlZF8pLCBDU1QoZ3JlZW5fdG9fYmx1ZV8pLAorICAgICAgQ1NUKGdyZWVuX3RvX3JlZF8pLCBDU1QoZ3JlZW5fdG9fYmx1ZV8pLAorICAgICAgQ1NUKGdyZWVuX3RvX3JlZF8pLCBDU1QoZ3JlZW5fdG9fYmx1ZV8pKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19iMiA9IF9tbV9zZXRfZXBpMTYoCisgICAgICBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksIDAsCisgICAgICBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksIDApOworI3VuZGVmIENTVAorICBjb25zdCBfX20xMjhpIG1hc2tfYWcgPSBfbW1fc2V0MV9lcGkzMigweGZmMDBmZjAwKTsgIC8vIGFscGhhLWdyZWVuIG1hc2tzCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldKTsgLy8gYXJnYgorICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2tfYWcpOyAgICAgLy8gYSAgIDAgICBnICAgMAorICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gZzBnMAorICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tdWxoaV9lcGkxNihDLCBtdWx0c19yYik7ICAgIC8vIHggZHIgIHggZGIxCisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX2FkZF9lcGk4KGluLCBEKTsgICAgICAgICAgICAgLy8geCByJyAgeCAgIGInCisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX3NsbGlfZXBpMTYoRSwgOCk7ICAgICAgICAgICAgLy8gcicgMCAgIGInIDAKKyAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fbXVsaGlfZXBpMTYoRiwgbXVsdHNfYjIpOyAgICAvLyB4IGRiMiAgMCAgMAorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9zcmxpX2VwaTMyKEcsIDgpOyAgICAgICAgICAgIC8vIDAgIHggZGIyICAwCisgICAgY29uc3QgX19tMTI4aSBJID0gX21tX2FkZF9lcGk4KEgsIEYpOyAgICAgICAgICAgICAgLy8gcicgeCAgYicnIDAKKyAgICBjb25zdCBfX20xMjhpIEogPSBfbW1fc3JsaV9lcGkxNihJLCA4KTsgICAgICAgICAgICAvLyAwICByJyAgMCAgYicnCisgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fb3Jfc2kxMjgoSiwgQSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKKyAgfQorICAvLyBGYWxsLWJhY2sgdG8gQy12ZXJzaW9uIGZvciBsZWZ0LW92ZXJzLgorICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MobSwgYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3Itc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkEoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBiZ3JhMCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmEwfGJncmExfGJncmEyfGJncmEzCisgICAgY29uc3QgX19tMTI4aSBiZ3JhNCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmE0fGJncmE1fGJncmE2fGJncmE3CisgICAgY29uc3QgX19tMTI4aSB2MGwgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjBiNGcwZzRyMHI0YTBhNC4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjBoID0gX21tX3VucGFja2hpX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIyYjZnMmc2cjJyNmEyYTYuLi4KKyAgICBjb25zdCBfX20xMjhpIHYxbCA9IF9tbV91bnBhY2tsb19lcGk4KHYwbCwgdjBoKTsgICAvLyBiMGIyYjRiNmcwZzJnNGc2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWggPSBfbW1fdW5wYWNraGlfZXBpOCh2MGwsIHYwaCk7ICAgLy8gYjFiM2I1YjdnMWczZzVnNy4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjJsID0gX21tX3VucGFja2xvX2VwaTgodjFsLCB2MWgpOyAgIC8vIGIwLi4uYjcgfCBnMC4uLmc3CisgICAgY29uc3QgX19tMTI4aSB2MmggPSBfbW1fdW5wYWNraGlfZXBpOCh2MWwsIHYxaCk7ICAgLy8gcjAuLi5yNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIGdhMCA9IF9tbV91bnBhY2toaV9lcGk2NCh2MmwsIHYyaCk7ICAvLyBnMC4uLmc3IHwgYTAuLi5hNworICAgIGNvbnN0IF9fbTEyOGkgcmIwID0gX21tX3VucGFja2xvX2VwaTY0KHYyaCwgdjJsKTsgIC8vIHIwLi4ucjcgfCBiMC4uLmI3CisgICAgY29uc3QgX19tMTI4aSByZzAgPSBfbW1fdW5wYWNrbG9fZXBpOChyYjAsIGdhMCk7ICAgLy8gcjBnMHIxZzEgLi4uIHI2ZzZyN2c3CisgICAgY29uc3QgX19tMTI4aSBiYTAgPSBfbW1fdW5wYWNraGlfZXBpOChyYjAsIGdhMCk7ICAgLy8gYjBhMGIxYTEgLi4uIGI2YTZiN2E3CisgICAgY29uc3QgX19tMTI4aSByZ2JhMCA9IF9tbV91bnBhY2tsb19lcGkxNihyZzAsIGJhMCk7ICAvLyByZ2JhMHxyZ2JhMS4uLgorICAgIGNvbnN0IF9fbTEyOGkgcmdiYTQgPSBfbW1fdW5wYWNraGlfZXBpMTYocmcwLCBiYTApOyAgLy8gcmdiYTR8cmdiYTUuLi4KKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCsrLCByZ2JhMCk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgcmdiYTQpOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsICh1aW50OF90KilvdXQpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weDBmID0gX21tX3NldDFfZXBpOCgweDBmKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZjAgPSBfbW1fc2V0MV9lcGk4KDB4ZjApOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIGJncmEwID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTB8YmdyYTF8YmdyYTJ8YmdyYTMKKyAgICBjb25zdCBfX20xMjhpIGJncmE0ID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTR8YmdyYTV8YmdyYTZ8YmdyYTcKKyAgICBjb25zdCBfX20xMjhpIHYwbCA9IF9tbV91bnBhY2tsb19lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMGI0ZzBnNHIwcjRhMGE0Li4uCisgICAgY29uc3QgX19tMTI4aSB2MGggPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjJiNmcyZzZyMnI2YTJhNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFsID0gX21tX3VucGFja2xvX2VwaTgodjBsLCB2MGgpOyAgICAvLyBiMGIyYjRiNmcwZzJnNGc2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWggPSBfbW1fdW5wYWNraGlfZXBpOCh2MGwsIHYwaCk7ICAgIC8vIGIxYjNiNWI3ZzFnM2c1ZzcuLi4KKyAgICBjb25zdCBfX20xMjhpIHYybCA9IF9tbV91bnBhY2tsb19lcGk4KHYxbCwgdjFoKTsgICAgLy8gYjAuLi5iNyB8IGcwLi4uZzcKKyAgICBjb25zdCBfX20xMjhpIHYyaCA9IF9tbV91bnBhY2toaV9lcGk4KHYxbCwgdjFoKTsgICAgLy8gcjAuLi5yNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIGdhMCA9IF9tbV91bnBhY2toaV9lcGk2NCh2MmwsIHYyaCk7ICAgLy8gZzAuLi5nNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIHJiMCA9IF9tbV91bnBhY2tsb19lcGk2NCh2MmgsIHYybCk7ICAgLy8gcjAuLi5yNyB8IGIwLi4uYjcKKyAgICBjb25zdCBfX20xMjhpIGdhMSA9IF9tbV9zcmxpX2VwaTE2KGdhMCwgNCk7ICAgICAgICAgLy8gZzAtfGcxLXwuLi58YTYtfGE3LQorICAgIGNvbnN0IF9fbTEyOGkgcmIxID0gX21tX2FuZF9zaTEyOChyYjAsIG1hc2tfMHhmMCk7ICAvLyAtcjB8LXIxfC4uLnwtYjZ8LWE3CisgICAgY29uc3QgX19tMTI4aSBnYTIgPSBfbW1fYW5kX3NpMTI4KGdhMSwgbWFza18weDBmKTsgIC8vIGcwLXxnMS18Li4ufGE2LXxhNy0KKyAgICBjb25zdCBfX20xMjhpIHJnYmEwID0gX21tX29yX3NpMTI4KGdhMiwgcmIxKTsgICAgICAgLy8gcmcwLi5yZzcgfCBiYTAuLmJhNworICAgIGNvbnN0IF9fbTEyOGkgcmdiYTEgPSBfbW1fc3JsaV9zaTEyOChyZ2JhMCwgOCk7ICAgICAvLyBiYTAuLmJhNyB8IDAKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmdiYTEsIHJnYmEwKTsgIC8vIGJhcmcwLi4uYmFyZzcKKyNlbHNlCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmdiYTAsIHJnYmExKTsgIC8vIHJnYmEwLi4ucmdiYTcKKyNlbmRpZgorICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0KyssIHJnYmEpOworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQjU2NShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weGUwID0gX21tX3NldDFfZXBpOCgweGUwKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZjggPSBfbW1fc2V0MV9lcGk4KDB4ZjgpOworICBjb25zdCBfX20xMjhpIG1hc2tfMHgwNyA9IF9tbV9zZXQxX2VwaTgoMHgwNyk7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTAgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhMHxiZ3JhMXxiZ3JhMnxiZ3JhMworICAgIGNvbnN0IF9fbTEyOGkgYmdyYTQgPSBfbW1fbG9hZHVfc2kxMjgoaW4rKyk7ICAgICAvLyBiZ3JhNHxiZ3JhNXxiZ3JhNnxiZ3JhNworICAgIGNvbnN0IF9fbTEyOGkgdjBsID0gX21tX3VucGFja2xvX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIwYjRnMGc0cjByNGEwYTQuLi4KKyAgICBjb25zdCBfX20xMjhpIHYwaCA9IF9tbV91bnBhY2toaV9lcGk4KGJncmEwLCBiZ3JhNCk7ICAvLyBiMmI2ZzJnNnIycjZhMmE2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWwgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MGwsIHYwaCk7ICAgICAgLy8gYjBiMmI0YjZnMGcyZzRnNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFoID0gX21tX3VucGFja2hpX2VwaTgodjBsLCB2MGgpOyAgICAgIC8vIGIxYjNiNWI3ZzFnM2c1ZzcuLi4KKyAgICBjb25zdCBfX20xMjhpIHYybCA9IF9tbV91bnBhY2tsb19lcGk4KHYxbCwgdjFoKTsgICAgICAvLyBiMC4uLmI3IHwgZzAuLi5nNworICAgIGNvbnN0IF9fbTEyOGkgdjJoID0gX21tX3VucGFja2hpX2VwaTgodjFsLCB2MWgpOyAgICAgIC8vIHIwLi4ucjcgfCBhMC4uLmE3CisgICAgY29uc3QgX19tMTI4aSBnYTAgPSBfbW1fdW5wYWNraGlfZXBpNjQodjJsLCB2MmgpOyAgICAgLy8gZzAuLi5nNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIHJiMCA9IF9tbV91bnBhY2tsb19lcGk2NCh2MmgsIHYybCk7ICAgICAvLyByMC4uLnI3IHwgYjAuLi5iNworICAgIGNvbnN0IF9fbTEyOGkgcmIxID0gX21tX2FuZF9zaTEyOChyYjAsIG1hc2tfMHhmOCk7ICAgIC8vIC1yMC4uLXI3fC1iMC4uLWI3CisgICAgY29uc3QgX19tMTI4aSBnX2xvMSA9IF9tbV9zcmxpX2VwaTE2KGdhMCwgNSk7CisgICAgY29uc3QgX19tMTI4aSBnX2xvMiA9IF9tbV9hbmRfc2kxMjgoZ19sbzEsIG1hc2tfMHgwNyk7ICAvLyBnMC0uLi5nNy18eHggKDNiKQorICAgIGNvbnN0IF9fbTEyOGkgZ19oaTEgPSBfbW1fc2xsaV9lcGkxNihnYTAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgZ19oaTIgPSBfbW1fYW5kX3NpMTI4KGdfaGkxLCBtYXNrXzB4ZTApOyAgLy8gLWcwLi4uLWc3fHh4ICgzYikKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX3NybGlfc2kxMjgocmIxLCA4KTsgICAgICAgICAgICAgIC8vIC1iMC4uLi1iN3wwCisgICAgY29uc3QgX19tMTI4aSByZzEgPSBfbW1fb3Jfc2kxMjgocmIxLCBnX2xvMik7ICAgICAgICAgICAvLyBncjAuLi5ncjd8eHgKKyAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX3NybGlfZXBpMTYoYjAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgZ2IxID0gX21tX29yX3NpMTI4KGIxLCBnX2hpMik7ICAgICAgICAgICAgLy8gYmcwLi4uYmc3fHh4CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgIGNvbnN0IF9fbTEyOGkgcmdiYSA9IF9tbV91bnBhY2tsb19lcGk4KGdiMSwgcmcxKTsgICAgIC8vIHJnZ2IwLi4ucmdnYjcKKyNlbHNlCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmcxLCBnYjEpOyAgICAgLy8gYmdyYjAuLi5iZ3JiNworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgcmdiYSk7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza19sID0gX21tX3NldF9lcGkzMigwLCAweDAwZmZmZmZmLCAwLCAweDAwZmZmZmZmKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2ggPSBfbW1fc2V0X2VwaTMyKDB4MDBmZmZmZmYsIDAsIDB4MDBmZmZmZmYsIDApOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZCA9IGRzdCArIG51bV9waXhlbHMgKiAzOworICAvLyB0aGUgbGFzdCBzdG9yZWxfZXBpNjQgYmVsb3cgd3JpdGVzIDggYnl0ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDE4CisgIHdoaWxlIChkc3QgKyAyNiA8PSBlbmQpIHsKKyAgICBjb25zdCBfX20xMjhpIGJncmEwID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTB8YmdyYTF8YmdyYTJ8YmdyYTMKKyAgICBjb25zdCBfX20xMjhpIGJncmE0ID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTR8YmdyYTV8YmdyYTZ8YmdyYTcKKyAgICBjb25zdCBfX20xMjhpIGEwbCA9IF9tbV9hbmRfc2kxMjgoYmdyYTAsIG1hc2tfbCk7ICAgLy8gYmdyMHwwfGJncjB8MAorICAgIGNvbnN0IF9fbTEyOGkgYTRsID0gX21tX2FuZF9zaTEyOChiZ3JhNCwgbWFza19sKTsgICAvLyBiZ3IwfDB8YmdyMHwwCisgICAgY29uc3QgX19tMTI4aSBhMGggPSBfbW1fYW5kX3NpMTI4KGJncmEwLCBtYXNrX2gpOyAgIC8vIDB8YmdyMHwwfGJncjAKKyAgICBjb25zdCBfX20xMjhpIGE0aCA9IF9tbV9hbmRfc2kxMjgoYmdyYTQsIG1hc2tfaCk7ICAgLy8gMHxiZ3IwfDB8YmdyMAorICAgIGNvbnN0IF9fbTEyOGkgYjBoID0gX21tX3NybGlfZXBpNjQoYTBoLCA4KTsgICAgICAgICAvLyAwMDBifGdyMDB8MDAwYnxncjAwCisgICAgY29uc3QgX19tMTI4aSBiNGggPSBfbW1fc3JsaV9lcGk2NChhNGgsIDgpOyAgICAgICAgIC8vIDAwMGJ8Z3IwMHwwMDBifGdyMDAKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX29yX3NpMTI4KGEwbCwgYjBoKTsgICAgICAgICAgLy8gcmdicmdiMDB8cmdicmdiMDAKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX29yX3NpMTI4KGE0bCwgYjRoKTsgICAgICAgICAgLy8gcmdicmdiMDB8cmdicmdiMDAKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX3NybGlfc2kxMjgoYzAsIDgpOworICAgIGNvbnN0IF9fbTEyOGkgYzYgPSBfbW1fc3JsaV9zaTEyOChjNCwgOCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAgMCksIGMwKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgICA2KSwgYzIpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAgMTIpLCBjNCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAxOCksIGM2KTsKKyAgICBkc3QgKz0gMjQ7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1JfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TERzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4TFByZWRpY3RvcnNbNV0gPSBQcmVkaWN0b3I1OworICBWUDhMUHJlZGljdG9yc1s2XSA9IFByZWRpY3RvcjY7CisgIFZQOExQcmVkaWN0b3JzWzddID0gUHJlZGljdG9yNzsKKyAgVlA4TFByZWRpY3RvcnNbOF0gPSBQcmVkaWN0b3I4OworICBWUDhMUHJlZGljdG9yc1s5XSA9IFByZWRpY3Rvcjk7CisgIFZQOExQcmVkaWN0b3JzWzEwXSA9IFByZWRpY3RvcjEwOworICBWUDhMUHJlZGljdG9yc1sxMV0gPSBQcmVkaWN0b3IxMTsKKyAgVlA4TFByZWRpY3RvcnNbMTJdID0gUHJlZGljdG9yMTI7CisgIFZQOExQcmVkaWN0b3JzWzEzXSA9IFByZWRpY3RvcjEzOworCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkOworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVHJhbnNmb3JtQ29sb3JJbnZlcnNlOworCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQSA9IENvbnZlcnRCR1JBVG9SR0JBOworICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ID0gQ29udmVydEJHUkFUb1JHQkE0NDQ0OworICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NSA9IENvbnZlcnRCR1JBVG9SR0I1NjU7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gQ29udmVydEJHUkFUb0JHUjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Jlc2NhbGVyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM1MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Jlc2NhbGVyLmMKQEAgLTAsMCArMSwyMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wbGVtZW50YXRpb25zIG9mIGNyaXRpY2FsIGZ1bmN0aW9ucyBJbXBvcnRSb3cgLyBFeHBvcnRSb3cKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgaW1wb3J0CisKK3ZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT54X2V4cGFuZCk7CisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgaW50IHhfaW4gPSBjaGFubmVsOworICAgIGludCB4X291dCA9IGNoYW5uZWw7CisgICAgLy8gc2ltcGxlIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgICBpbnQgYWNjdW0gPSB3cmstPnhfYWRkOworICAgIGludCBsZWZ0ID0gc3JjW3hfaW5dOworICAgIGludCByaWdodCA9ICh3cmstPnNyY193aWR0aCA+IDEpID8gc3JjW3hfaW4gKyB4X3N0cmlkZV0gOiBsZWZ0OworICAgIHhfaW4gKz0geF9zdHJpZGU7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIHdyay0+ZnJvd1t4X291dF0gPSByaWdodCAqIHdyay0+eF9hZGQgKyAobGVmdCAtIHJpZ2h0KSAqIGFjY3VtOworICAgICAgeF9vdXQgKz0geF9zdHJpZGU7CisgICAgICBpZiAoeF9vdXQgPj0geF9vdXRfbWF4KSBicmVhazsKKyAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICBpZiAoYWNjdW0gPCAwKSB7CisgICAgICAgIGxlZnQgPSByaWdodDsKKyAgICAgICAgeF9pbiArPSB4X3N0cmlkZTsKKyAgICAgICAgYXNzZXJ0KHhfaW4gPCB3cmstPnNyY193aWR0aCAqIHhfc3RyaWRlKTsKKyAgICAgICAgcmlnaHQgPSBzcmNbeF9pbl07CisgICAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7CisgICAgICB9CisgICAgfQorICAgIGFzc2VydCh3cmstPnhfc3ViID09IDAgLyogPC0gc3BlY2lhbCBjYXNlIGZvciBzcmNfd2lkdGg9MSAqLyB8fCBhY2N1bSA9PSAwKTsKKyAgfQorfQorCit2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua0MoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGludCBjaGFubmVsOworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KCF3cmstPnhfZXhwYW5kKTsKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBpbnQgeF9pbiA9IGNoYW5uZWw7CisgICAgaW50IHhfb3V0ID0gY2hhbm5lbDsKKyAgICB1aW50MzJfdCBzdW0gPSAwOworICAgIGludCBhY2N1bSA9IDA7CisgICAgd2hpbGUgKHhfb3V0IDwgeF9vdXRfbWF4KSB7CisgICAgICB1aW50MzJfdCBiYXNlID0gMDsKKyAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7CisgICAgICB3aGlsZSAoYWNjdW0gPiAwKSB7CisgICAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICAgIGFzc2VydCh4X2luIDwgd3JrLT5zcmNfd2lkdGggKiB4X3N0cmlkZSk7CisgICAgICAgIGJhc2UgPSBzcmNbeF9pbl07CisgICAgICAgIHN1bSArPSBiYXNlOworICAgICAgICB4X2luICs9IHhfc3RyaWRlOworICAgICAgfQorICAgICAgeyAgICAgICAgLy8gRW1pdCBuZXh0IGhvcml6b250YWwgcGl4ZWwuCisgICAgICAgIGNvbnN0IHJlc2NhbGVyX3QgZnJhYyA9IGJhc2UgKiAoLWFjY3VtKTsKKyAgICAgICAgd3JrLT5mcm93W3hfb3V0XSA9IHN1bSAqIHdyay0+eF9zdWIgLSBmcmFjOworICAgICAgICAvLyBmcmVzaCBmcmFjdGlvbmFsIHN0YXJ0IGZvciBuZXh0IHBpeGVsCisgICAgICAgIHN1bSA9IChpbnQpTVVMVF9GSVgoZnJhYywgd3JrLT5meF9zY2FsZSk7CisgICAgICB9CisgICAgICB4X291dCArPSB4X3N0cmlkZTsKKyAgICB9CisgICAgYXNzZXJ0KGFjY3VtID09IDApOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKK3ZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqIGZyb3dbeF9vdXRdCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiBpcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3ZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBpZiAoeXNjYWxlKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYKGZyb3dbeF9vdXRdLCB5c2NhbGUpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdIC0gZnJhYywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSwgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gMDsKKyAgICB9CisgIH0KK30KKworI3VuZGVmIE1VTFRfRklYCisjdW5kZWYgUk9VTkRFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBjYWxscworCit2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvdyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBpZiAoIXdyay0+eF9leHBhbmQpIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsod3JrLCBzcmMpOworICB9IGVsc2UgeworICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCh3cmssIHNyYyk7CisgIH0KK30KKwordm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaWYgKHdyay0+eV9hY2N1bSA8PSAwKSB7CisgICAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICAgIGlmICh3cmstPnlfZXhwYW5kKSB7CisgICAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQod3JrKTsKKyAgICB9IGVsc2UgaWYgKHdyay0+Znh5X3NjYWxlKSB7CisgICAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsod3JrKTsKKyAgICB9IGVsc2UgeyAgLy8gdmVyeSBzcGVjaWFsIGNhc2UgZm9yIHNyYyA9IGRzdCA9IDF4MQorICAgICAgaW50IGk7CisgICAgICBhc3NlcnQod3JrLT5zcmNfd2lkdGggPT0gMSAmJiB3cmstPmRzdF93aWR0aCA8PSAyKTsKKyAgICAgIGFzc2VydCh3cmstPnNyY19oZWlnaHQgPT0gMSAmJiB3cmstPmRzdF9oZWlnaHQgPT0gMSk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JrLT5udW1fY2hhbm5lbHMgKiB3cmstPmRzdF93aWR0aDsgKytpKSB7CisgICAgICAgIHdyay0+ZHN0W2ldID0gd3JrLT5pcm93W2ldOworICAgICAgICB3cmstPmlyb3dbaV0gPSAwOworICAgICAgfQorICAgIH0KKyAgICB3cmstPnlfYWNjdW0gKz0gd3JrLT55X2FkZDsKKyAgICB3cmstPmRzdCArPSB3cmstPmRzdF9zdHJpZGU7CisgICAgKyt3cmstPmRzdF95OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kOworV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbms7CisKK1dlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kOworV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbms7CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TkVPTih2b2lkKTsKKworc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gcmVzY2FsZXJfbGFzdF9jcHVpbmZvX3VzZWQgPQorICAgIChWUDhDUFVJbmZvKSZyZXNjYWxlcl9sYXN0X2NwdWluZm9fdXNlZDsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXQodm9pZCkgeworICBpZiAocmVzY2FsZXJfbGFzdF9jcHVpbmZvX3VzZWQgPT0gVlA4R2V0Q1BVSW5mbykgcmV0dXJuOworCisgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCA9IFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZEM7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IFdlYlBSZXNjYWxlckltcG9ydFJvd1Nocmlua0M7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZEM7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmlua0M7CisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04oKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorICByZXNjYWxlcl9sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfbWlwczMyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjNTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9yZXNjYWxlcl9taXBzMzIuYwpAQCAtMCwwICsxLDI5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiByZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yKHMpOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvcmVzY2FsZXIuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBpbXBvcnQKKworc3RhdGljIHZvaWQgSW1wb3J0Um93U2hyaW5rKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3RyaWRlID0gd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgZnhfc2NhbGUgPSB3cmstPmZ4X3NjYWxlOworICBjb25zdCBpbnQgeF9hZGQgPSB3cmstPnhfYWRkOworICBjb25zdCBpbnQgeF9zdWIgPSB3cmstPnhfc3ViOworICBjb25zdCBpbnQgeF9zdHJpZGUxID0geF9zdHJpZGUgPDwgMjsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCghd3JrLT54X2V4cGFuZCk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworCisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjMSA9IHNyYyArIGNoYW5uZWw7CisgICAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdyArIGNoYW5uZWw7CisgICAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgICAgaW50IGJhc2UsIGZyYWMsIHN1bTsKKyAgICBpbnQgYWNjdW0sIGFjY3VtMTsKKyAgICBpbnQgbG9vcF9jID0geF9vdXRfbWF4IC0gY2hhbm5lbDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAlW3RlbXAxXSwgICAweDgwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICVbdGVtcDJdLCAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgJVtzdW1dLCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAlW2FjY3VtXSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVthY2N1bV0sICAgJVthY2N1bV0sICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICAgImxpICAgICAlW2Jhc2VdLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYmxleiAgICVbYWNjdW1dLCAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxidSAgICAlW2Jhc2VdLCAgICAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICVbeF9zdWJdICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgImFkZHUgICAlW3N1bV0sICAgICAlW3N1bV0sICAgICAlW2Jhc2VdICAgICAgIFxuXHQiCisgICAgICAiYmd0eiAgICVbYWNjdW1dLCAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm5lZ3UgICAlW2FjY3VtMV0sICAlW2FjY3VtXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsICAgICVbZnJhY10sICAgICVbYmFzZV0sICAgICVbYWNjdW0xXSAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVt0ZW1wM10sICAgJVtzdW1dLCAgICAgJVt4X3N1Yl0gICAgICBcblx0IgorICAgICAgInN1YnUgICAlW2xvb3BfY10sICAlW2xvb3BfY10sICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAibXVsdCAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgJVtmcmFjXSwgICAgJVtmeF9zY2FsZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAlW3N1bV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbZnJhY10gICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgJVt0ZW1wM10sICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW2Zyb3ddLCAgICAlW2Zyb3ddLCAgICAlW3hfc3RyaWRlMV0gIFxuXHQiCisgICAgICAiYmd0eiAgICVbbG9vcF9jXSwgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW2FjY3VtXSI9JnIiKGFjY3VtKSwgW3NyYzFdIityIihzcmMxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3N1bV0iPSZyIihzdW0pLCBbYmFzZV0iPSZyIihiYXNlKSwgW2ZyYWNdIj0mciIoZnJhYyksCisgICAgICAgIFtmcm93XSIrciIoZnJvdyksIFthY2N1bTFdIj0mciIoYWNjdW0xKSwKKyAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgICAgOiBbeF9zdHJpZGVdInIiKHhfc3RyaWRlKSwgW2Z4X3NjYWxlXSJyIihmeF9zY2FsZSksCisgICAgICAgIFt4X3N1Yl0iciIoeF9zdWIpLCBbeF9hZGRdInIiKHhfYWRkKSwKKyAgICAgICAgW2xvb3BfY10iciIobG9vcF9jKSwgW3hfc3RyaWRlMV0iciIoeF9zdHJpZGUxKQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgICAgYXNzZXJ0KGFjY3VtID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydFJvd0V4cGFuZChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfYWRkID0gd3JrLT54X2FkZDsKKyAgY29uc3QgaW50IHhfc3ViID0gd3JrLT54X3N1YjsKKyAgY29uc3QgaW50IHNyY193aWR0aCA9IHdyay0+c3JjX3dpZHRoOworICBjb25zdCBpbnQgeF9zdHJpZGUxID0geF9zdHJpZGUgPDwgMjsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCh3cmstPnhfZXhwYW5kKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisKKyAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHhfc3RyaWRlOyArK2NoYW5uZWwpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmMxID0gc3JjICsgY2hhbm5lbDsKKyAgICByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93ICsgY2hhbm5lbDsKKyAgICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgICAgaW50IGZyYWM7CisgICAgaW50IGFjY3VtOworICAgIGludCB4X291dCA9IGNoYW5uZWw7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJhZGRpdSAgJVt0ZW1wM10sICAgJVtzcmNfd2lkdGhdLCAtMSAgICAgICAgICAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbdGVtcDJdLCAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJiZ3R6ICAgJVt0ZW1wM10sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICAgMCAgICAgICAgICAgICBcblx0IgorICAgICAgImIgICAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbdGVtcDFdLCAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgJVthY2N1bV0sICAgJVt4X2FkZF0sICAgICAwICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAlW2FjY3VtXSAgICAgIFxuXHQiCisgICAgICAibXVsICAgICVbdGVtcDRdLCAgICVbdGVtcDFdLCAgICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3RlbXAzXSwgICAlW3RlbXA0XSwgICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgJVt0ZW1wM10sICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbZnJvd10sICAgICVbZnJvd10sICAgICAgJVt4X3N0cmlkZTFdICBcblx0IgorICAgICAgImFkZHUgICAlW3hfb3V0XSwgICAlW3hfb3V0XSwgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVt0ZW1wM10sICAgJVt4X291dF0sICAgICAlW3hfb3V0X21heF0gIFxuXHQiCisgICAgICAiYmdleiAgICVbdGVtcDNdLCAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAlW2FjY3VtXSwgICAlW2FjY3VtXSwgICAgICVbeF9zdWJdICAgICAgXG5cdCIKKyAgICAgICJiZ2V6ICAgJVthY2N1bV0sICAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAgICAgMCAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICVbeF9zdHJpZGVdICAgXG5cdCIKKyAgICAgICJsYnUgICAgJVt0ZW1wMV0sICAgMCglW3NyYzFdKSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJiICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgOiBbc3JjMV0iK3IiKHNyYzEpLCBbYWNjdW1dIj0mciIoYWNjdW0pLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLAorICAgICAgICBbeF9vdXRdIityIih4X291dCksIFtmcmFjXSI9JnIiKGZyYWMpLCBbZnJvd10iK3IiKGZyb3cpCisgICAgICA6IFt4X3N0cmlkZV0iciIoeF9zdHJpZGUpLCBbeF9hZGRdInIiKHhfYWRkKSwgW3hfc3ViXSJyIih4X3N1YiksCisgICAgICAgIFt4X3N0cmlkZTFdInIiKHhfc3RyaWRlMSksIFtzcmNfd2lkdGhdInIiKHNyY193aWR0aCksCisgICAgICAgIFt4X291dF9tYXhdInIiKHhfb3V0X21heCkKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICAgIGFzc2VydCh3cmstPnhfc3ViID09IDAgLyogPC0gc3BlY2lhbCBjYXNlIGZvciBzcmNfd2lkdGg9MSAqLyB8fCBhY2N1bSA9PSAwKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGV4cG9ydAorCitzdGF0aWMgdm9pZCBFeHBvcnRSb3dFeHBhbmQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXAyID0gKGludCl3cmstPmZ5X3NjYWxlOworICBjb25zdCBpbnQgdGVtcDYgPSB4X291dF9tYXggPDwgMjsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gV0VCUF9SRVNDQUxFUl9GUkFDKC13cmstPnlfYWNjdW0sIHdyay0+eV9zdWIpOworICAgIGNvbnN0IHVpbnQzMl90IEEgPSAodWludDMyX3QpKFdFQlBfUkVTQ0FMRVJfT05FIC0gQik7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAxICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVtBXSwgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVtCXSwgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsdCAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWFkZHUgICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibWZoaSAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpCisgICAgICA6IFt0ZW1wMl0iciIodGVtcDIpLCBbdGVtcDZdInIiKHRlbXA2KSwgW0FdInIiKEEpLCBbQl0iciIoQikKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd1NocmluayhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IGludCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXAyID0gKGludCl3cmstPmZ4eV9zY2FsZTsKKyAgY29uc3QgaW50IHRlbXA2ID0geF9vdXRfbWF4IDw8IDI7CisKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT5meHlfc2NhbGUgIT0gMCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt5c2NhbGVdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgICAlW3RlbXAxXSwgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt5c2NhbGVdInIiKHlzY2FsZSksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfSBlbHNlIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtpcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2lyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2lyb3ddIityIihpcm93KSwKKyAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIodm9pZCkgeworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgPSBJbXBvcnRSb3dFeHBhbmQ7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IEltcG9ydFJvd1NocmluazsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gRXhwb3J0Um93RXhwYW5kOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBFeHBvcnRSb3dTaHJpbms7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzJmN2FkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgcmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAiLi4vdXRpbHMvcmVzY2FsZXIuaCIKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgZXhwb3J0CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd1NocmluayhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCBpbnQgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIGxvb3BfZW5kOworICBjb25zdCBpbnQgdGVtcDcgPSAoaW50KXdyay0+Znh5X3NjYWxlOworICBjb25zdCBpbnQgdGVtcDYgPSAoeF9vdXRfbWF4ICYgfjB4MykgPDwgMjsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT5meHlfc2NhbGUgIT0gMCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIGludCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDVdLCAgICAxMiglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3lzY2FsZV0gICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt5c2NhbGVdICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wNV0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wNV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA4XSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDldLCAgICA0KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTBdLCAgIDgoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxMV0sICAgMTIoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgICVbdGVtcDBdICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAic3VidSAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXA4XSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDldLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMTBdLCAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxMV0sICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDBdLCAgICAtMTYoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJVt0ZW1wMV0sICAgIC0xMiglW2lyb3ddKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAlW3RlbXAyXSwgICAgLTgoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDVdLCAgICAtNCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wOF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXA5XSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDEwXSwgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMTFdLCAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksCisgICAgICAgICAgW3RlbXA4XSI9JnIiKHRlbXA4KSwgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLAorICAgICAgICAgIFt0ZW1wMTFdIj0mciIodGVtcDExKSwgW3RlbXAyXSI9JnIiKHRlbXAyKQorICAgICAgICA6IFt0ZW1wN10iciIodGVtcDcpLCBbeXNjYWxlXSJyIih5c2NhbGUpLCBbdGVtcDZdInIiKHRlbXA2KQorICAgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iLCAiJGFjMWhpIiwgIiRhYzFsbyIsCisgICAgICAgICAgIiRhYzJoaSIsICIkYWMybG8iLCAiJGFjM2hpIiwgIiRhYzNsbyIKKyAgICAgICk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCAoeF9vdXRfbWF4ICYgMHgzKTsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYKCpmcm93KyssIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoKmlyb3cgLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgICAqaXJvdysrID0gZnJhYzsgICAvLyBuZXcgZnJhY3Rpb25hbCBzdGFydAorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgJVt0ZW1wM10sICAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2lyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDFdLCAgICA0KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA1XSwgICAgMTIoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMF0sICAgICRhYzAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxXSwgICAgJGFjMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDJdLCAgICAkYWMyICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wNV0sICAgICRhYzMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTE2KCVbaXJvd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtMTIoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC04KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDBdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAyXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtpcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbaXJvd10iK3IiKGlyb3cpLAorICAgICAgICAgIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLCBbdGVtcDJdIj0mciIodGVtcDIpCisgICAgICAgIDogW3RlbXA3XSJyIih0ZW1wNyksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWCgqaXJvdywgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICAqZHN0KysgPSB2OworICAgICAgKmlyb3crKyA9IDA7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4cG9ydFJvd0V4cGFuZChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgaTsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgbG9vcF9lbmQ7CisgIGNvbnN0IGludCB0ZW1wNiA9ICh4X291dF9tYXggJiB+MHgzKSA8PCAyOworICBjb25zdCBpbnQgdGVtcDcgPSAoaW50KXdyay0+Znlfc2NhbGU7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgaWYgKHhfb3V0X21heCA+PSA0KSB7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgJVt0ZW1wNV0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgNCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZnJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDNdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDJdLCAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wM10sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iLAorICAgICAgICAgICIkYWMyaGkiLCAiJGFjMmxvIiwgIiRhYzNoaSIsICIkYWMzbG8iCisgICAgICApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHhfb3V0X21heCAmIDB4Myk7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICpmcm93Kys7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIGludCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXA4XSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDldLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDNdLCAgICAxMiglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA1XSwgICAgNCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDEwXSwgICA4KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTFdLCAgIDEyKCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAwXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDEwXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDExXSAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAzXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAzXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDBdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAyXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDNdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLAorICAgICAgICAgIFt0ZW1wOF0iPSZyIih0ZW1wOCksIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwKKyAgICAgICAgICBbdGVtcDExXSI9JnIiKHRlbXAxMSksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3RlbXA2XSJyIih0ZW1wNiksIFtBXSJyIihBKSwgW0JdInIiKEIpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqICpmcm93KysKKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqICppcm93Kys7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBNVUxUX0ZJWAorI3VuZGVmIFJPVU5ERVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gRXhwb3J0Um93RXhwYW5kOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBFeHBvcnRSb3dTaHJpbms7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9yZXNjYWxlcl9zc2UyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzFiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvcmVzY2FsZXJfc3NlMi5jCkBAIC0wLDAgKzEsMzc1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltcGxlbWVudGF0aW9ucyBvZiBjcml0aWNhbCBmdW5jdGlvbnMgSW1wb3J0Um93IC8gRXhwb3J0Um93CisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisvLyBpbnB1dDogOCBieXRlcyBBQkNERUZHSCAtPiBvdXRwdXQ6IEEwRTBCMEYwQzBHMEQwSDAKK3N0YXRpYyB2b2lkIExvYWRUd29QaXhlbHMoY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBfX20xMjhpKiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoc3JjKSk7ICAvLyBBQkNERUZHSAorICBjb25zdCBfX20xMjhpIEIgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsgICAgICAgICAgICAgIC8vIEEwQjBDMEQwRTBGMEcwSDAKKyAgY29uc3QgX19tMTI4aSBDID0gX21tX3NybGlfc2kxMjgoQiwgOCk7ICAgICAgICAgICAgICAgICAgICAvLyBFMEYwRzBIMAorICAqb3V0ID0gX21tX3VucGFja2xvX2VwaTE2KEIsIEMpOworfQorCisvLyBpbnB1dDogOCBieXRlcyBBQkNERUZHSCAtPiBvdXRwdXQ6IEEwQjBDMEQwRTBGMEcwSDAKK3N0YXRpYyB2b2lkIExvYWRIZWlnaHRQaXhlbHMoY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBfX20xMjhpKiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoc3JjKSk7ICAvLyBBQkNERUZHSAorICAqb3V0ID0gX21tX3VucGFja2xvX2VwaTgoQSwgemVybyk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVySW1wb3J0Um93RXhwYW5kU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvd19lbmQgPSBmcm93ICsgd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfYWRkID0gd3JrLT54X2FkZDsKKyAgaW50IGFjY3VtID0geF9hZGQ7CisgIF9fbTEyOGkgY3VyX3BpeGVsczsKKworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eF9leHBhbmQpOworICBpZiAod3JrLT5udW1fY2hhbm5lbHMgPT0gNCkgeworICAgIGlmICh3cmstPnNyY193aWR0aCA8IDIpIHsKKyAgICAgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZEMod3JrLCBzcmMpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMb2FkVHdvUGl4ZWxzKHNyYywgJmN1cl9waXhlbHMpOworICAgIHNyYyArPSA0OworICAgIHdoaWxlICgxKSB7CisgICAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0MV9lcGkzMigoKHhfYWRkIC0gYWNjdW0pIDw8IDE2KSB8IGFjY3VtKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX21hZGRfZXBpMTYoY3VyX3BpeGVscywgbXVsdCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilmcm93LCBvdXQpOworICAgICAgZnJvdyArPSA0OworICAgICAgaWYgKGZyb3cgPj0gZnJvd19lbmQpIGJyZWFrOworICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKKyAgICAgIGlmIChhY2N1bSA8IDApIHsKKyAgICAgICAgTG9hZFR3b1BpeGVscyhzcmMsICZjdXJfcGl4ZWxzKTsKKyAgICAgICAgc3JjICs9IDQ7CisgICAgICAgIGFjY3VtICs9IHhfYWRkOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgbGVmdDsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmNfbGltaXQgPSBzcmMgKyB3cmstPnNyY193aWR0aCAtIDg7CisgICAgaWYgKHdyay0+c3JjX3dpZHRoIDwgOCkgeworICAgICAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kQyh3cmssIHNyYyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIExvYWRIZWlnaHRQaXhlbHMoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgc3JjICs9IDc7CisgICAgbGVmdCA9IDc7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9jdnRzaTMyX3NpMTI4KCgoeF9hZGQgLSBhY2N1bSkgPDwgMTYpIHwgYWNjdW0pOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fbWFkZF9lcGkxNihjdXJfcGl4ZWxzLCBtdWx0KTsKKyAgICAgIGFzc2VydChzaXplb2YoKmZyb3cpID09IHNpemVvZih1aW50MzJfdCkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCh1aW50OF90Kilmcm93LCBfbW1fY3Z0c2kxMjhfc2kzMihvdXQpKTsKKyAgICAgIGZyb3cgKz0gMTsKKyAgICAgIGlmIChmcm93ID49IGZyb3dfZW5kKSBicmVhazsKKyAgICAgIGFjY3VtIC09IHdyay0+eF9zdWI7CisgICAgICBpZiAoYWNjdW0gPCAwKSB7CisgICAgICAgIGlmICgtLWxlZnQpIHsKKyAgICAgICAgICBjdXJfcGl4ZWxzID0gX21tX3NybGlfc2kxMjgoY3VyX3BpeGVscywgMik7CisgICAgICAgIH0gZWxzZSBpZiAoc3JjIDw9IHNyY19saW1pdCkgeworICAgICAgICAgIExvYWRIZWlnaHRQaXhlbHMoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgICAgICAgc3JjICs9IDc7CisgICAgICAgICAgbGVmdCA9IDc7CisgICAgICAgIH0gZWxzZSB7ICAgLy8gdGFpbAorICAgICAgICAgIGN1cl9waXhlbHMgPSBfbW1fc3JsaV9zaTEyOChjdXJfcGl4ZWxzLCAyKTsKKyAgICAgICAgICBjdXJfcGl4ZWxzID0gX21tX2luc2VydF9lcGkxNihjdXJfcGl4ZWxzLCBzcmNbMV0sIDEpOworICAgICAgICAgIHNyYyArPSAxOworICAgICAgICAgIGxlZnQgPSAxOworICAgICAgICB9CisgICAgICAgIGFjY3VtICs9IHhfYWRkOworICAgICAgfQorICAgIH0KKyAgfQorICBhc3NlcnQoYWNjdW0gPT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVySW1wb3J0Um93U2hyaW5rU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3ViID0gd3JrLT54X3N1YjsKKyAgaW50IGFjY3VtID0gMDsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0MCA9IF9tbV9zZXQxX2VwaTE2KHhfc3ViKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0MSA9IF9tbV9zZXQxX2VwaTMyKHdyay0+Znhfc2NhbGUpOworICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICBfX20xMjhpIHN1bSA9IHplcm87CisgIHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3dfZW5kID0gd3JrLT5mcm93ICsgNCAqIHdyay0+ZHN0X3dpZHRoOworCisgIGlmICh3cmstPm51bV9jaGFubmVscyAhPSA0IHx8IHdyay0+eF9hZGQgPiAoeF9zdWIgPDwgNykpIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtDKHdyaywgc3JjKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGFzc2VydCghd3JrLT54X2V4cGFuZCk7CisKKyAgZm9yICg7IGZyb3cgPCBmcm93X2VuZDsgZnJvdyArPSA0KSB7CisgICAgX19tMTI4aSBiYXNlID0gemVybzsKKyAgICBhY2N1bSArPSB3cmstPnhfYWRkOworICAgIHdoaWxlIChhY2N1bSA+IDApIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihzcmMpKTsKKyAgICAgIHNyYyArPSA0OworICAgICAgYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KEEsIHplcm8pOworICAgICAgLy8gVG8gYXZvaWQgb3ZlcmZsb3csIHdlIG5lZWQ6IGJhc2UgKiB4X2FkZCAvIHhfc3ViIDwgMzI3NjgKKyAgICAgIC8vID0+IHhfYWRkIDwgeF9zdWIgPDwgNy4gVGhhdCdzIGEgMS8xMjggcmVkdWN0aW9uIHJhdGlvIGxpbWl0LgorICAgICAgc3VtID0gX21tX2FkZF9lcGkxNihzdW0sIGJhc2UpOworICAgICAgYWNjdW0gLT0geF9zdWI7CisgICAgfQorICAgIHsgICAgLy8gRW1pdCBuZXh0IGhvcml6b250YWwgcGl4ZWwuCisgICAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0MV9lcGkxNigtYWNjdW0pOworICAgICAgY29uc3QgX19tMTI4aSBmcmFjMCA9IF9tbV9tdWxsb19lcGkxNihiYXNlLCBtdWx0KTsgIC8vIDE2YiB4IDE2YiAtPiAzMmIKKyAgICAgIGNvbnN0IF9fbTEyOGkgZnJhYzEgPSBfbW1fbXVsaGlfZXB1MTYoYmFzZSwgbXVsdCk7CisgICAgICBjb25zdCBfX20xMjhpIGZyYWMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoZnJhYzAsIGZyYWMxKTsgIC8vIGZyYWMgaXMgMzJiCisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX211bGxvX2VwaTE2KHN1bSwgbXVsdDApOworICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9tdWxoaV9lcHUxNihzdW0sIG11bHQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQTAsIEExKTsgICAgICAvLyBzdW0gKiB4X3N1YgorICAgICAgY29uc3QgX19tMTI4aSBmcm93X291dCA9IF9tbV9zdWJfZXBpMzIoQjAsIGZyYWMpOyAgIC8vIHN1bSAqIHhfc3ViIC0gZnJhYworICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zcmxpX2VwaTY0KGZyYWMsIDMyKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fbXVsX2VwdTMyKGZyYWMsIG11bHQxKTsgICAgICAvLyAzMmIgeCAxNmIgLT4gNjRiCisgICAgICBjb25zdCBfX20xMjhpIEQyID0gX21tX211bF9lcHUzMihEMCwgbXVsdDEpOworICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9hZGRfZXBpNjQoRDEsIHJvdW5kZXIpOworICAgICAgY29uc3QgX19tMTI4aSBFMiA9IF9tbV9hZGRfZXBpNjQoRDIsIHJvdW5kZXIpOworICAgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9zaHVmZmxlX2VwaTMyKEUxLCAxIHwgKDMgPDwgMikpOworICAgICAgY29uc3QgX19tMTI4aSBGMiA9IF9tbV9zaHVmZmxlX2VwaTMyKEUyLCAxIHwgKDMgPDwgMikpOworICAgICAgY29uc3QgX19tMTI4aSBHID0gX21tX3VucGFja2xvX2VwaTMyKEYxLCBGMik7CisgICAgICBzdW0gPSBfbW1fcGFja3NfZXBpMzIoRywgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilmcm93LCBmcm93X291dCk7CisgICAgfQorICB9CisgIGFzc2VydChhY2N1bSA9PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBleHBvcnQKKworLy8gbG9hZCAqc3JjIGFzIGVwaTY0LCBtdWx0aXBseSBieSBtdWx0IGFuZCBzdG9yZSByZXN1bHQgaW4gW291dDAgLi4uIG91dDNdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkRGlzcGF0Y2hBbmRNdWx0KGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MykgeworICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgMCkpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgNCkpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3NybGlfZXBpNjQoQTAsIDMyKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmxpX2VwaTY0KEExLCAzMik7CisgIGlmIChtdWx0ICE9IE5VTEwpIHsKKyAgICAqb3V0MCA9IF9tbV9tdWxfZXB1MzIoQTAsICptdWx0KTsKKyAgICAqb3V0MSA9IF9tbV9tdWxfZXB1MzIoQTEsICptdWx0KTsKKyAgICAqb3V0MiA9IF9tbV9tdWxfZXB1MzIoQTIsICptdWx0KTsKKyAgICAqb3V0MyA9IF9tbV9tdWxfZXB1MzIoQTMsICptdWx0KTsKKyAgfSBlbHNlIHsKKyAgICAqb3V0MCA9IEEwOworICAgICpvdXQxID0gQTE7CisgICAgKm91dDIgPSBBMjsKKyAgICAqb3V0MyA9IEEzOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByb2Nlc3NSb3coY29uc3QgX19tMTI4aSogY29uc3QgQTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBBMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IG11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0X2VwaTMyKDB4ZmZmZmZmZmZ1LCAwLCAweGZmZmZmZmZmdSwgMCk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbXVsX2VwdTMyKCpBMCwgKm11bHQpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX211bF9lcHUzMigqQTEsICptdWx0KTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV9tdWxfZXB1MzIoKkEyLCAqbXVsdCk7CisgIGNvbnN0IF9fbTEyOGkgQjMgPSBfbW1fbXVsX2VwdTMyKCpBMywgKm11bHQpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk2NChCMCwgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTY0KEIxLCByb3VuZGVyKTsKKyAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV9hZGRfZXBpNjQoQjIsIHJvdW5kZXIpOworICBjb25zdCBfX20xMjhpIEMzID0gX21tX2FkZF9lcGk2NChCMywgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fc3JsaV9lcGk2NChDMCwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9zcmxpX2VwaTY0KEMxLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworI2lmIChXRUJQX1JFU0NBTEVSX0ZJWCA8IDMyKQorICBjb25zdCBfX20xMjhpIEQyID0KKyAgICAgIF9tbV9hbmRfc2kxMjgoX21tX3NsbGlfZXBpNjQoQzIsIDMyIC0gV0VCUF9SRVNDQUxFUl9SRklYKSwgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgRDMgPQorICAgICAgX21tX2FuZF9zaTEyOChfbW1fc2xsaV9lcGk2NChDMywgMzIgLSBXRUJQX1JFU0NBTEVSX1JGSVgpLCBtYXNrKTsKKyNlbHNlCisgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fYW5kX3NpMTI4KEMyLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBEMyA9IF9tbV9hbmRfc2kxMjgoQzMsIG1hc2spOworI2VuZGlmCisgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fb3Jfc2kxMjgoRDAsIEQyKTsKKyAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9vcl9zaTEyOChEMSwgRDMpOworICBjb25zdCBfX20xMjhpIEYgPSBfbW1fcGFja3NfZXBpMzIoRTAsIEUxKTsKKyAgY29uc3QgX19tMTI4aSBHID0gX21tX3BhY2t1c19lcGkxNihGLCBGKTsKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCBHKTsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRTU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fc2V0X2VwaTMyKDAsIHdyay0+Znlfc2NhbGUsIDAsIHdyay0+Znlfc2NhbGUpOworCisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwICYmIHdyay0+eV9zdWIgKyB3cmstPnlfYWNjdW0gPj0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0KGZyb3cgKyB4X291dCwgTlVMTCwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIFByb2Nlc3NSb3coJkEwLCAmQTEsICZBMiwgJkEzLCAmbXVsdCwgZHN0ICsgeF9vdXQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBjb25zdCBfX20xMjhpIG1BID0gX21tX3NldF9lcGkzMigwLCBBLCAwLCBBKTsKKyAgICBjb25zdCBfX20xMjhpIG1CID0gX21tX3NldF9lcGkzMigwLCBCLCAwLCBCKTsKKyAgICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzLCBCMCwgQjEsIEIyLCBCMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHQoZnJvdyArIHhfb3V0LCAmbUEsICZBMCwgJkExLCAmQTIsICZBMyk7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0KGlyb3cgKyB4X291dCwgJm1CLCAmQjAsICZCMSwgJkIyLCAmQjMpOworICAgICAgeworICAgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk2NChBMCwgQjApOworICAgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FkZF9lcGk2NChBMSwgQjEpOworICAgICAgICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FkZF9lcGk2NChBMiwgQjIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMzID0gX21tX2FkZF9lcGk2NChBMywgQjMpOworICAgICAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX2FkZF9lcGk2NChDMCwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fYWRkX2VwaTY0KEMxLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9hZGRfZXBpNjQoQzIsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEQzID0gX21tX2FkZF9lcGk2NChDMywgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fc3JsaV9lcGk2NChEMCwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zcmxpX2VwaTY0KEQxLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUyID0gX21tX3NybGlfZXBpNjQoRDIsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTMgPSBfbW1fc3JsaV9lcGk2NChEMywgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgUHJvY2Vzc1JvdygmRTAsICZFMSwgJkUyLCAmRTMsICZtdWx0LCBkc3QgKyB4X291dCk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogZnJvd1t4X291dF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqIGlyb3dbeF9vdXRdOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtTU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBjb25zdCBpbnQgc2NhbGVfeHkgPSB3cmstPmZ4eV9zY2FsZTsKKyAgICBjb25zdCBfX20xMjhpIG11bHRfeHkgPSBfbW1fc2V0X2VwaTMyKDAsIHNjYWxlX3h5LCAwLCBzY2FsZV94eSk7CisgICAgY29uc3QgX19tMTI4aSBtdWx0X3kgPSBfbW1fc2V0X2VwaTMyKDAsIHlzY2FsZSwgMCwgeXNjYWxlKTsKKyAgICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzLCBCMCwgQjEsIEIyLCBCMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHQoaXJvdyArIHhfb3V0LCBOVUxMLCAmQTAsICZBMSwgJkEyLCAmQTMpOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdChmcm93ICsgeF9vdXQsICZtdWx0X3ksICZCMCwgJkIxLCAmQjIsICZCMyk7CisgICAgICB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTY0KEIwLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hZGRfZXBpNjQoQjEsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FkZF9lcGk2NChCMiwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzMgPSBfbW1fYWRkX2VwaTY0KEIzLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zcmxpX2VwaTY0KEMwLCBXRUJQX1JFU0NBTEVSX1JGSVgpOyAgIC8vID0gZnJhYworICAgICAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX3NybGlfZXBpNjQoQzEsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fc3JsaV9lcGk2NChDMiwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMyA9IF9tbV9zcmxpX2VwaTY0KEMzLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX3N1Yl9lcGk2NChBMCwgRDApOyAgIC8vIGlyb3dbeF0gLSBmcmFjCisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc3ViX2VwaTY0KEExLCBEMSk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTIgPSBfbW1fc3ViX2VwaTY0KEEyLCBEMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTMgPSBfbW1fc3ViX2VwaTY0KEEzLCBEMyk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRjIgPSBfbW1fc2xsaV9lcGk2NChEMiwgMzIpOworICAgICAgICBjb25zdCBfX20xMjhpIEYzID0gX21tX3NsbGlfZXBpNjQoRDMsIDMyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9vcl9zaTEyOChEMCwgRjIpOworICAgICAgICBjb25zdCBfX20xMjhpIEcxID0gX21tX29yX3NpMTI4KEQxLCBGMyk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyAwKSwgRzApOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgNCksIEcxKTsKKyAgICAgICAgUHJvY2Vzc1JvdygmRTAsICZFMSwgJkUyLCAmRTMsICZtdWx0X3h5LCBkc3QgKyB4X291dCk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9IChpbnQpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gd3JrLT5meHlfc2NhbGU7CisgICAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX3NldF9lcGkzMigwLCBzY2FsZSwgMCwgc2NhbGUpOworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0KGlyb3cgKyB4X291dCwgTlVMTCwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyAwKSwgemVybyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgNCksIHplcm8pOworICAgICAgUHJvY2Vzc1JvdygmQTAsICZBMSwgJkEyLCAmQTMsICZtdWx0LCBkc3QgKyB4X291dCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKGlyb3dbeF9vdXRdLCBzY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSAwOworICAgIH0KKyAgfQorfQorCisjdW5kZWYgTVVMVF9GSVgKKyN1bmRlZiBST1VOREVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIodm9pZCkgeworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgPSBSZXNjYWxlckltcG9ydFJvd0V4cGFuZFNTRTI7CisgIFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayA9IFJlc2NhbGVySW1wb3J0Um93U2hyaW5rU1NFMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRTU0UyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBSZXNjYWxlckV4cG9ydFJvd1Nocmlua1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Vwc2FtcGxpbmcuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhNGFmNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2LmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhbmN5IHVwc2FtcGxlcgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBGYW5jeSB1cHNhbXBsaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IFlVViB0byBSR0IKK1dlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1tNT0RFX0xBU1RdOworCisvLyBHaXZlbiBzYW1wbGVzIGxhaWQgb3V0IGluIGEgc3F1YXJlIGFzOgorLy8gIFthIGJdCisvLyAgW2MgZF0KKy8vIHdlIGludGVycG9sYXRlIHUvdiBhczoKKy8vICAoWzkqYSArIDMqYiArIDMqYyArICAgZCAgICAzKmEgKyA5KmIgKyAzKmMgKyAgIGRdICsgWzggOF0pIC8gMTYKKy8vICAoWzMqYSArICAgYiArIDkqYyArIDMqZCAgICAgIGEgKyAzKmIgKyAzKmMgKyA5KmRdICAgWzggOF0pIC8gMTYKKworLy8gV2UgcHJvY2VzcyB1IGFuZCB2IHRvZ2V0aGVyIHN0YXNoZWQgaW50byAzMmJpdCAoMTZiaXQgZWFjaCkuCisjZGVmaW5lIExPQURfVVYodSwgdikgKCh1KSB8ICgodikgPDwgMTYpKQorCisjZGVmaW5lIFVQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsYXN0X3BpeGVsX3BhaXIgPSAobGVuIC0gMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCB0bF91diA9IExPQURfVVYodG9wX3VbMF0sIHRvcF92WzBdKTsgICAvKiB0b3AtbGVmdCBzYW1wbGUgKi8gICAgICAgIFwKKyAgdWludDMyX3QgbF91diAgPSBMT0FEX1VWKGN1cl91WzBdLCBjdXJfdlswXSk7ICAgLyogbGVmdC1zYW1wbGUgKi8gICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCisgICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAorICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgVlA4WXV2VG9SZ2IsICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyLCAgVlA4WXV2VG9CZ3IsICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpciwgVlA4WXV2VG9SZ2JhLCA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgVlA4WXV2VG9CZ3JhLCA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpciwgVlA4WXV2VG9BcmdiLCA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsICBWUDhZdXZUb1JnYjU2NSwgIDIpCisKKyN1bmRlZiBMT0FEX1VWCisjdW5kZWYgVVBTQU1QTEVfRlVOQworCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpCisjZGVmaW5lIERVQUxfU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3RfeSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYm90X3UsIGNvbnN0IHVpbnQ4X3QqIGJvdF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdF9kc3QsIGludCBsZW4pIHsgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGhhbGZfbGVuID0gbGVuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX2RzdCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IGhhbGZfbGVuOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCArIDBdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCArIDApOyAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggKyAxXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHggKyA0KTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChsZW4gJiAxKSBGVU5DKHRvcF95WzIgKiB4ICsgMF0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4KTsgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3RfZHN0ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90X3lbMiAqIHggKyAwXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHggKyAwKTsgICAgICAgICBcCisgICAgICBGVU5DKGJvdF95WzIgKiB4ICsgMV0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4ICsgNCk7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGVuICYgMSkgRlVOQyhib3RfeVsyICogeCArIDBdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCk7ICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitEVUFMX1NBTVBMRV9GVU5DKER1YWxMaW5lU2FtcGxlckJHUkEsIFZQOFl1dlRvQmdyYSkKK0RVQUxfU0FNUExFX0ZVTkMoRHVhbExpbmVTYW1wbGVyQVJHQiwgVlA4WXV2VG9BcmdiKQorI3VuZGVmIERVQUxfU0FNUExFX0ZVTkMKKworI2VuZGlmICAvLyAhRkFOQ1lfVVBTQU1QTElORworCitXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKGludCBhbHBoYV9pc19sYXN0KSB7CisgIFdlYlBJbml0VXBzYW1wbGVycygpOworICBWUDhZVVZJbml0KCk7CisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworICByZXR1cm4gV2ViUFVwc2FtcGxlcnNbYWxwaGFfaXNfbGFzdCA/IE1PREVfQkdSQSA6IE1PREVfQVJHQl07CisjZWxzZQorICByZXR1cm4gKGFscGhhX2lzX2xhc3QgPyBEdWFsTGluZVNhbXBsZXJCR1JBIDogRHVhbExpbmVTYW1wbGVyQVJHQik7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVVjQ0NCBjb252ZXJ0ZXIKKworI2RlZmluZSBZVVY0NDRfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2V4dGVybiB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIEZVTkMoeVtpXSwgdVtpXSwgdltpXSwgJmRzdFtpICogWFNURVBdKTsgICAgICAgICAgIFwKK30KKworWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvUmdiQywgICAgICBWUDhZdXZUb1JnYiwgIDMpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9CZ3JDLCAgICAgIFZQOFl1dlRvQmdyLCAgMykKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYmFDLCAgICAgVlA4WXV2VG9SZ2JhLCA0KQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvQmdyYUMsICAgICBWUDhZdXZUb0JncmEsIDQpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9BcmdiQywgICAgIFZQOFl1dlRvQXJnYiwgNCkKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYmE0NDQ0QywgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYjU2NUMsICAgVlA4WXV2VG9SZ2I1NjUsIDIpCisKKyN1bmRlZiBZVVY0NDRfRlVOQworCitXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfTEFTVF07CisKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIodm9pZCk7CisKK3N0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIHVwc2FtcGxpbmdfbGFzdF9jcHVpbmZvX3VzZWQxID0KKyAgICAoVlA4Q1BVSW5mbykmdXBzYW1wbGluZ19sYXN0X2NwdWluZm9fdXNlZDE7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnModm9pZCkgeworICBpZiAodXBzYW1wbGluZ19sYXN0X2NwdWluZm9fdXNlZDEgPT0gVlA4R2V0Q1BVSW5mbykgcmV0dXJuOworCisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXSAgICAgICA9IFdlYlBZdXY0NDRUb1JnYkM7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV0gICAgICA9IFdlYlBZdXY0NDRUb1JnYmFDOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBXZWJQWXV2NDQ0VG9CZ3JDOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUkFdICAgICAgPSBXZWJQWXV2NDQ0VG9CZ3JhQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BUkdCXSAgICAgID0gV2ViUFl1djQ0NFRvQXJnYkM7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV80NDQ0XSA9IFdlYlBZdXY0NDRUb1JnYmE0NDQ0QzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JfNTY1XSAgID0gV2ViUFl1djQ0NFRvUmdiNTY1QzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXSAgICAgID0gV2ViUFl1djQ0NFRvUmdiYUM7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfYmdyQV0gICAgICA9IFdlYlBZdXY0NDRUb0JncmFDOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FyZ2JdICAgICAgPSBXZWJQWXV2NDQ0VG9BcmdiQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gV2ViUFl1djQ0NFRvUmdiYTQ0NDRDOworCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgdXBzYW1wbGluZ19sYXN0X2NwdWluZm9fdXNlZDEgPSBWUDhHZXRDUFVJbmZvOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxscworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMih2b2lkKTsKKworc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gdXBzYW1wbGluZ19sYXN0X2NwdWluZm9fdXNlZDIgPQorICAgIChWUDhDUFVJbmZvKSZ1cHNhbXBsaW5nX2xhc3RfY3B1aW5mb191c2VkMjsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVycyh2b2lkKSB7CisgIGlmICh1cHNhbXBsaW5nX2xhc3RfY3B1aW5mb191c2VkMiA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFVwc2FtcGxlUmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gICAgICAgPSBVcHNhbXBsZUJnckxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtORU9OKSkgeworICAgICAgV2ViUEluaXRVcHNhbXBsZXJzTkVPTigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9CisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKyAgdXBzYW1wbGluZ19sYXN0X2NwdWluZm9fdXNlZDIgPSBWUDhHZXRDUFVJbmZvOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmNGFiZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwyODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICIuL3l1di5oIgorCisjaWYgIWRlZmluZWQoV0VCUF9ZVVZfVVNFX1RBQkxFKQorCisjZGVmaW5lIFlVVl9UT19SR0IoWSwgVSwgViwgUiwgRywgQikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0MSA9IE11bHRIaShZLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdDIgPSBNdWx0SGkoViwgMTMzMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IE11bHRIaShWLCAyNjE0OSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSBNdWx0SGkoVSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gTXVsdEhpKFUsIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IHQxICsgUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSB0MSAtIEc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gdDEgKyBCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IFIgLSAxNDIzNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSBHIC0gdDIgKyA4NzA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gQiAtIDE3Njg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgInNobGxfcy53ICAgICAgICAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgIDE3ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzaGxsX3MudyAgICAgICAgICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAxNyAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic2hsbF9zLncgICAgICAgICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgMTcgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInByZWNycXVfcy5xYi5waCAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgICR6ZXJvICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJwcmVjcnF1X3MucWIucGggICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAkemVybyAgICAgIFxuXHQiICAgICBcCisgICAgICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgJHplcm8gICAgICBcblx0IiAgICAgXAorICAgICAgInNybCAgICAgICAgICAgICAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgIDI0ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzcmwgICAgICAgICAgICAgICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAyNCAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic3JsICAgICAgICAgICAgICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgMjQgICAgICAgICBcblx0IiAgICAgXAorICAgICAgOiBbUl0iK3IiKFIpLCBbR10iK3IiKEcpLCBbQl0iK3IiKEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHJnYlswXSA9IHI7CisgIHJnYlsxXSA9IGc7CisgIHJnYlsyXSA9IGI7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb0JncihpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCBiZ3IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIGJnclswXSA9IGI7CisgIGJnclsxXSA9IGc7CisgIGJnclsyXSA9IHI7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYjU2NShpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIHsKKyAgICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gNSk7CisgICAgY29uc3QgaW50IGdiID0gKChnIDw8IDMpICYgMHhlMCkgfCAoYiA+PiAzKTsKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgcmdiWzBdID0gZ2I7CisgICAgcmdiWzFdID0gcmc7CisjZWxzZQorICAgIHJnYlswXSA9IHJnOworICAgIHJnYlsxXSA9IGdiOworI2VuZGlmCisgIH0KK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvUmdiYTQ0NDQoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgeworICAgIGNvbnN0IGludCByZyA9IChyICYgMHhmMCkgfCAoZyA+PiA0KTsKKyAgICBjb25zdCBpbnQgYmEgPSAoYiAmIDB4ZjApIHwgMHgwZjsgICAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgIGFyZ2JbMF0gPSBiYTsKKyAgICBhcmdiWzFdID0gcmc7CisjZWxzZQorICAgIGFyZ2JbMF0gPSByZzsKKyAgICBhcmdiWzFdID0gYmE7CisjZW5kaWYKKyAgIH0KK30KKyNlbmRpZiAgLy8gV0VCUF9ZVVZfVVNFX1RBQkxFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFscGhhIGhhbmRsaW5nIHZhcmlhbnRzCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIGFyZ2JbMF0gPSAweGZmOworICBhcmdiWzFdID0gcjsKKyAgYXJnYlsyXSA9IGc7CisgIGFyZ2JbM10gPSBiOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyYSkgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgYmdyYVswXSA9IGI7CisgIGJncmFbMV0gPSBnOworICBiZ3JhWzJdID0gcjsKKyAgYmdyYVszXSA9IDB4ZmY7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICByZ2JhWzBdID0gcjsKKyAgcmdiYVsxXSA9IGc7CisgIHJnYmFbMl0gPSBiOworICByZ2JhWzNdID0gMHhmZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZhbmN5IHVwc2FtcGxlcgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBHaXZlbiBzYW1wbGVzIGxhaWQgb3V0IGluIGEgc3F1YXJlIGFzOgorLy8gIFthIGJdCisvLyAgW2MgZF0KKy8vIHdlIGludGVycG9sYXRlIHUvdiBhczoKKy8vICAoWzkqYSArIDMqYiArIDMqYyArICAgZCAgICAzKmEgKyA5KmIgKyAzKmMgKyAgIGRdICsgWzggOF0pIC8gMTYKKy8vICAoWzMqYSArICAgYiArIDkqYyArIDMqZCAgICAgIGEgKyAzKmIgKyAzKmMgKyA5KmRdICAgWzggOF0pIC8gMTYKKworLy8gV2UgcHJvY2VzcyB1IGFuZCB2IHRvZ2V0aGVyIHN0YXNoZWQgaW50byAzMmJpdCAoMTZiaXQgZWFjaCkuCisjZGVmaW5lIExPQURfVVYodSwgdikgKCh1KSB8ICgodikgPDwgMTYpKQorCisjZGVmaW5lIFVQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsYXN0X3BpeGVsX3BhaXIgPSAobGVuIC0gMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCB0bF91diA9IExPQURfVVYodG9wX3VbMF0sIHRvcF92WzBdKTsgICAvKiB0b3AtbGVmdCBzYW1wbGUgKi8gICAgICAgIFwKKyAgdWludDMyX3QgbF91diAgPSBMT0FEX1VWKGN1cl91WzBdLCBjdXJfdlswXSk7ICAgLyogbGVmdC1zYW1wbGUgKi8gICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCisgICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAorICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgICAgIFl1dlRvUmdiLCAgICAgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXIsICAgICAgWXV2VG9CZ3IsICAgICAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXIsICAgICBZdXZUb1JnYmEsICAgICA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgICAgIFl1dlRvQmdyYSwgICAgIDQpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyLCAgICAgWXV2VG9BcmdiLCAgICAgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBZdXZUb1JnYmE0NDQ0LCAyKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgIFl1dlRvUmdiNTY1LCAgIDIpCisKKyN1bmRlZiBMT0FEX1VWCisjdW5kZWYgVVBTQU1QTEVfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gVXBzYW1wbGVSZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFVwc2FtcGxlQmdyTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICAgPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7Cit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWVVWNDQ0IGNvbnZlcnRlcgorCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIEZVTkMoeVtpXSwgdVtpXSwgdltpXSwgJmRzdFtpICogWFNURVBdKTsgICAgICAgICAgIFwKK30KKworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2IsICAgICAgWXV2VG9SZ2IsICAgICAgMykKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyLCAgICAgIFl1dlRvQmdyLCAgICAgIDMpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmEsICAgICBZdXZUb1JnYmEsICAgICA0KQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JhLCAgICAgWXV2VG9CZ3JhLCAgICAgNCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQXJnYiwgICAgIFl1dlRvQXJnYiwgICAgIDQpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmE0NDQ0LCBZdXZUb1JnYmE0NDQ0LCAyKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2I1NjUsICAgWXV2VG9SZ2I1NjUsICAgMikKKworI3VuZGVmIFlVVjQ0NF9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIodm9pZCkgeworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl0gICAgICAgPSBZdXY0NDRUb1JnYjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXSAgICAgID0gWXV2NDQ0VG9SZ2JhOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gICAgICAgPSBZdXY0NDRUb0JncjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JBXSAgICAgID0gWXV2NDQ0VG9CZ3JhOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FSR0JdICAgICAgPSBZdXY0NDRUb0FyZ2I7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV80NDQ0XSA9IFl1djQ0NFRvUmdiYTQ0NDQ7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXzU2NV0gICA9IFl1djQ0NFRvUmdiNTY1OworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFdICAgICAgPSBZdXY0NDRUb1JnYmE7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfYmdyQV0gICAgICA9IFl1djQ0NFRvQmdyYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9BcmdiXSAgICAgID0gWXV2NDQ0VG9BcmdiOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBZdXY0NDRUb1JnYmE0NDQ0OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZhMGE1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jCkBAIC0wLDAgKzEsMjQ5IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5oIgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLyBXZSBjb21wdXRlICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNiBhcyBmb2xsb3dzCisvLyB1ID0gKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2CisvLyAgID0gKGEgKyAoYSArIDMqYiArIDMqYyArIGQpIC8gOCArIDEpIC8gMgorLy8gICA9IChhICsgbSArIDEpIC8gMgorLy8gd2hlcmUgbSA9IChhICsgMypiICsgMypjICsgZCkgLyA4CisvLyAgICAgICAgID0gKChhICsgYiArIGMgKyBkKSAvIDIgKyBiICsgYykgLyA0CisvLworLy8gTGV0J3Mgc2F5ICBrID0gKGEgKyBiICsgYyArIGQpIC8gNC4KKy8vIFdlIGNhbiBjb21wdXRlIGsgYXMKKy8vIGsgPSAocyArIHQgKyAxKSAvIDIgLSAoKGFeZCkgfCAoYl5jKSB8IChzXnQpKSAmIDEKKy8vIHdoZXJlIHMgPSAoYSArIGQgKyAxKSAvIDIgYW5kIHQgPSAoYiArIGMgKyAxKSAvIDIKKy8vCisvLyBUaGVuIG0gY2FuIGJlIHdyaXR0ZW4gYXMKKy8vIG0gPSAoayArIHQgKyAxKSAvIDIgLSAoKChiXmMpICYgKHNedCkpIHwgKGtedCkpICYgMQorCisvLyBDb21wdXRlcyBvdXQgPSAoayArIGluICsgMSkgLyAyIC0gKChpaiAmIChzXnQpKSB8IChrXmluKSkgJiAxCisjZGVmaW5lIEdFVF9NKGlqLCBpbiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYXZnX2VwdTgoaywgKGluKSk7ICAgICAvKiAoayArIGluICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FuZF9zaTEyOCgoaWopLCBzdCk7ICAgLyogKGlqKSAmIChzXnQpICovICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV94b3Jfc2kxMjgoaywgKGluKSk7ICAgIC8qIChrXmluKSAqLyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fb3Jfc2kxMjgodG1wMSwgdG1wMik7ICAvKiAoKGlqKSAmIChzXnQpKSB8IChrXmluKSAqL1wKKyAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX2FuZF9zaTEyOCh0bXAzLCBvbmUpOyAgLyogJiAxIC0+IGxzYl9jb3JyZWN0aW9uICovICBcCisgIChvdXQpID0gX21tX3N1Yl9lcGk4KHRtcDAsIHRtcDQpOyAgICAvKiAoayArIGluICsgMSkgLyAyIC0gbHNiX2NvcnJlY3Rpb24gKi8gXAorfSB3aGlsZSAoMCkKKworLy8gcGFjayBhbmQgc3RvcmUgdHdvIGFsdGVybmF0aW5nIHBpeGVsIHJvd3MKKyNkZWZpbmUgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGEsIGRiLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF9hID0gX21tX2F2Z19lcHU4KGEsIGRhKTsgIC8qICg5YSArIDNiICsgM2MgKyAgZCArIDgpIC8gMTYgKi8gXAorICBjb25zdCBfX20xMjhpIHRfYiA9IF9tbV9hdmdfZXB1OChiLCBkYik7ICAvKiAoM2EgKyA5YiArICBjICsgM2QgKyA4KSAvIDE2ICovIFwKKyAgY29uc3QgX19tMTI4aSB0XzEgPSBfbW1fdW5wYWNrbG9fZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF8yID0gX21tX3VucGFja2hpX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAwLCB0XzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMSwgdF8yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBMb2FkcyAxNyBwaXhlbHMgZWFjaCBmcm9tIHJvd3MgcjEgYW5kIHIyIGFuZCBnZW5lcmF0ZXMgMzIgcGl4ZWxzLgorI2RlZmluZSBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMSlbMF0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjEpWzFdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIyKVswXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMilbMV0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBzID0gX21tX2F2Z19lcHU4KGEsIGQpOyAgICAgICAgLyogcyA9IChhICsgZCArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdCA9IF9tbV9hdmdfZXB1OChiLCBjKTsgICAgICAgIC8qIHQgPSAoYiArIGMgKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHN0ID0gX21tX3hvcl9zaTEyOChzLCB0KTsgICAgICAvKiBzdCA9IHNedCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWQgPSBfbW1feG9yX3NpMTI4KGEsIGQpOyAgICAgIC8qIGFkID0gYV5kICovICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChiLCBjKTsgICAgICAvKiBiYyA9IGJeYyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDEgPSBfbW1fb3Jfc2kxMjgoYWQsIGJjKTsgICAgIC8qIChhXmQpIHwgKGJeYykgKi8gICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHQyID0gX21tX29yX3NpMTI4KHQxLCBzdCk7ICAgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgKi8gICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9hbmRfc2kxMjgodDIsIG9uZSk7ICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICYgMSAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdDQgPSBfbW1fYXZnX2VwdTgocywgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGsgPSBfbW1fc3ViX2VwaTgodDQsIHQzKTsgICAgICAvKiBrID0gKGEgKyBiICsgYyArIGQpIC8gNCAqLyAgIFwKKyAgX19tMTI4aSBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfTShiYywgdCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcxID0gKGEgKyAzYiArIDNjICsgZCkgLyA4ICovICAgIFwKKyAgR0VUX00oYWQsIHMsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMiA9ICgzYSArIGIgKyBjICsgM2QpIC8gOCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBwYWNrIHRoZSBhbHRlcm5hdGUgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGlhZzEsIGRpYWcyLCBvdXQgKyAgICAgIDApOyAgLyogc3RvcmUgdG9wICovICAgICAgICAgICBcCisgIFBBQ0tfQU5EX1NUT1JFKGMsIGQsIGRpYWcyLCBkaWFnMSwgb3V0ICsgMiAqIDMyKTsgIC8qIHN0b3JlIGJvdHRvbSAqLyAgICAgICAgXAorfQorCisvLyBUdXJuIHRoZSBtYWNybyBpbnRvIGEgZnVuY3Rpb24gZm9yIHJlZHVjaW5nIGNvZGUtc2l6ZSB3aGVuIG5vbi1jcml0aWNhbAorc3RhdGljIHZvaWQgVXBzYW1wbGUzMlBpeGVscyhjb25zdCB1aW50OF90IHIxW10sIGNvbnN0IHVpbnQ4X3QgcjJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0KSB7CisgIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KTsKK30KKworI2RlZmluZSBVUFNBTVBMRV9MQVNUX0JMT0NLKHRiLCBiYiwgbnVtX3BpeGVscywgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCByMVsxN10sIHIyWzE3XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtZW1jcHkocjIsIChiYiksIChudW1fcGl4ZWxzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcmVwbGljYXRlIGxhc3QgYnl0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldChyMSArIChudW1fcGl4ZWxzKSwgcjFbKG51bV9waXhlbHMpIC0gMV0sIDE3IC0gKG51bV9waXhlbHMpKTsgICAgICAgICAgXAorICBtZW1zZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKKyAgLyogdXNpbmcgdGhlIHNoYXJlZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBtYWNybyBzYXZlcyB+M2sgY29kZSBzaXplICovICAgICBcCisgIFVwc2FtcGxlMzJQaXhlbHMocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgIFwKKyAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAobiA9IDA7IG4gPCAobnVtX3BpeGVscyk7ICsrbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbKGN1cl94KSArIG5dLCByX3Vbbl0sIHJfdltuXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIHRvcF9kc3QgKyAoKGN1cl94KSArIG4pICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKG4gPSAwOyBuIDwgKG51bV9waXhlbHMpOyArK24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WyhjdXJfeCkgKyBuXSwgcl91WzY0ICsgbl0sIHJfdls2NCArIG5dLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKChjdXJfeCkgKyBuKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRlVOQyMjMzIodG9wX3kgKyAoY3VyX3gpLCByX3UsIHJfdiwgdG9wX2RzdCArIChjdXJfeCkgKiBYU1RFUCk7ICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMjIzMyKGJvdHRvbV95ICsgKGN1cl94KSwgcl91ICsgNjQsIHJfdiArIDY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBib3R0b21fZHN0ICsgKGN1cl94KSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTU0UyX1VQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCisgIGludCB1dl9wb3MsIHBvczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiAxNmJ5dGUtYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCB1dl9idWZbNCAqIDMyICsgMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHJfdSA9ICh1aW50OF90KikoKHVpbnRwdHJfdCkodXZfYnVmICsgMTUpICYgfjE1KTsgICAgICAgICAgICAgXAorICB1aW50OF90KiBjb25zdCByX3YgPSByX3UgKyAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh0b3BfeSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgLyogVHJlYXQgdGhlIGZpcnN0IHBpeGVsIGluIHJlZ3VsYXIgd2F5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdV9kaWFnID0gKCh0b3BfdVswXSArIGN1cl91WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHZfZGlhZyA9ICgodG9wX3ZbMF0gKyBjdXJfdlswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1MF90ID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdjBfdCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh0b3BfeVswXSwgdTBfdCwgdjBfdCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IGludCB1MF9iID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCBpbnQgdjBfYiA9IChjdXJfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVswXSwgdTBfYiwgdjBfYiwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBGb3IgVVBTQU1QTEVfMzJQSVhFTFMsIDE3IHUvdiB2YWx1ZXMgbXVzdCBiZSByZWFkLWFibGUgZm9yIGVhY2ggYmxvY2sgKi8gIFwKKyAgZm9yIChwb3MgPSAxLCB1dl9wb3MgPSAwOyBwb3MgKyAzMiArIDEgPD0gbGVuOyBwb3MgKz0gMzIsIHV2X3BvcyArPSAxNikgeyAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCByX3UpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3Bvcywgcl92KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB0b3BfZHN0LCBib3R0b21fZHN0LCBwb3MpOyAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuID4gMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGVmdF9vdmVyID0gKChsZW4gKyAxKSA+PiAxKSAtIChwb3MgPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KGxlZnRfb3ZlciA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCBsZWZ0X292ZXIsIHJfdSk7ICAgICAgIFwKKyAgICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3BvcywgbGVmdF9vdmVyLCByX3YpOyAgICAgICBcCisgICAgQ09OVkVSVDJSR0IoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgdG9wX2RzdCwgYm90dG9tX2RzdCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBvcywgbGVuIC0gcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIFNTRTIgdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgVlA4WXV2VG9SZ2IsICAzKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXIsICBWUDhZdXZUb0JnciwgIDMpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXIsIFZQOFl1dlRvUmdiYSwgNCkKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgVlA4WXV2VG9CZ3JhLCA0KQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyLCBWUDhZdXZUb0FyZ2IsIDQpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsIFZQOFl1dlRvUmdiNTY1LCAyKQorCisjdW5kZWYgR0VUX00KKyN1bmRlZiBQQUNLX0FORF9TVE9SRQorI3VuZGVmIFVQU0FNUExFXzMyUElYRUxTCisjdW5kZWYgVVBTQU1QTEVfTEFTVF9CTE9DSworI3VuZGVmIENPTlZFUlQyUkdCCisjdW5kZWYgQ09OVkVSVDJSR0JfMzIKKyN1bmRlZiBTU0UyX1VQU0FNUExFX0ZVTkMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIodm9pZCkgeworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gID0gVXBzYW1wbGVCZ3JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gPSBVcHNhbXBsZVJnYjU2NUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzWy8qIE1PREVfTEFTVCAqL107CitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKHZvaWQpOworCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgQ0FMTCwgWFNURVApIFwKK2V4dGVybiB2b2lkIFdlYlAjI0ZVTkNfTkFNRSMjQyhjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuKTsgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbWF4X2xlbiA9IGxlbiAmIH4zMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IG1heF9sZW47IGkgKz0gMzIpIENBTEwoeSArIGksIHUgKyBpLCB2ICsgaSwgZHN0ICsgaSAqIFhTVEVQKTtcCisgIGlmIChpIDwgbGVuKSB7ICAvKiBDLWZhbGxiYWNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFdlYlAjI0ZVTkNfTkFNRSMjQyh5ICsgaSwgdSArIGksIHYgKyBpLCBkc3QgKyBpICogWFNURVAsIGxlbiAtIGkpOyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiYSwgVlA4WXV2VG9SZ2JhMzIsIDQpOworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JhLCBWUDhZdXZUb0JncmEzMiwgNCk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYiwgVlA4WXV2VG9SZ2IzMiwgMyk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb0JnciwgVlA4WXV2VG9CZ3IzMiwgMyk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKHZvaWQpIHsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXSA9IFl1djQ0NFRvUmdiYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JBXSA9IFl1djQ0NFRvQmdyYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JdICA9IFl1djQ0NFRvUmdiOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUl0gID0gWXV2NDQ0VG9CZ3I7Cit9CisKKyNlbHNlCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc1NTRTIpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXYuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVkNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5jCkBAIC0wLDAgKzEsMjgwIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2LmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfWVVWX1VTRV9UQUJMRSkKKworc3RhdGljIGludCBkb25lID0gMDsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcChpbnQgdiwgaW50IG1heF92YWx1ZSkgeworICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IG1heF92YWx1ZSA/IG1heF92YWx1ZSA6IHY7Cit9CisKK2ludDE2X3QgVlA4a1ZUb1JbMjU2XSwgVlA4a1VUb0JbMjU2XTsKK2ludDMyX3QgVlA4a1ZUb0dbMjU2XSwgVlA4a1VUb0dbMjU2XTsKK3VpbnQ4X3QgVlA4a0NsaXBbWVVWX1JBTkdFX01BWCAtIFlVVl9SQU5HRV9NSU5dOwordWludDhfdCBWUDhrQ2xpcDRCaXRzW1lVVl9SQU5HRV9NQVggLSBZVVZfUkFOR0VfTUlOXTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOFlVVkluaXQodm9pZCkgeworICBpbnQgaTsKKyAgaWYgKGRvbmUpIHsKKyAgICByZXR1cm47CisgIH0KKyNpZm5kZWYgVVNFX1lVVmoKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgVlA4a1ZUb1JbaV0gPSAoODk4NTggKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKKyAgICBWUDhrVVRvR1tpXSA9IC0yMjAxNCAqIChpIC0gMTI4KSArIFlVVl9IQUxGOworICAgIFZQOGtWVG9HW2ldID0gLTQ1NzczICogKGkgLSAxMjgpOworICAgIFZQOGtVVG9CW2ldID0gKDExMzYxOCAqIChpIC0gMTI4KSArIFlVVl9IQUxGKSA+PiBZVVZfRklYOworICB9CisgIGZvciAoaSA9IFlVVl9SQU5HRV9NSU47IGkgPCBZVVZfUkFOR0VfTUFYOyArK2kpIHsKKyAgICBjb25zdCBpbnQgayA9ICgoaSAtIDE2KSAqIDc2MjgzICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7CisgICAgVlA4a0NsaXBbaSAtIFlVVl9SQU5HRV9NSU5dID0gY2xpcChrLCAyNTUpOworICAgIFZQOGtDbGlwNEJpdHNbaSAtIFlVVl9SQU5HRV9NSU5dID0gY2xpcCgoayArIDgpID4+IDQsIDE1KTsKKyAgfQorI2Vsc2UKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgVlA4a1ZUb1JbaV0gPSAoOTE4ODEgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKKyAgICBWUDhrVVRvR1tpXSA9IC0yMjU1NCAqIChpIC0gMTI4KSArIFlVVl9IQUxGOworICAgIFZQOGtWVG9HW2ldID0gLTQ2ODAyICogKGkgLSAxMjgpOworICAgIFZQOGtVVG9CW2ldID0gKDExNjEzMCAqIChpIC0gMTI4KSArIFlVVl9IQUxGKSA+PiBZVVZfRklYOworICB9CisgIGZvciAoaSA9IFlVVl9SQU5HRV9NSU47IGkgPCBZVVZfUkFOR0VfTUFYOyArK2kpIHsKKyAgICBjb25zdCBpbnQgayA9IGk7CisgICAgVlA4a0NsaXBbaSAtIFlVVl9SQU5HRV9NSU5dID0gY2xpcChrLCAyNTUpOworICAgIFZQOGtDbGlwNEJpdHNbaSAtIFlVVl9SQU5HRV9NSU5dID0gY2xpcCgoayArIDgpID4+IDQsIDE1KTsKKyAgfQorI2VuZGlmCisKKyAgZG9uZSA9IDE7Cit9CisKKyNlbHNlCisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhZVVZJbml0KHZvaWQpIHt9CisKKyNlbmRpZiAgLy8gV0VCUF9ZVVZfVVNFX1RBQkxFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBsYWluLUMgdmVyc2lvbgorCisjZGVmaW5lIFJPV19GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90KiBjb25zdCBlbmQgPSBkc3QgKyAobGVuICYgfjEpICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKGRzdCAhPSBlbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoeVsxXSwgdVswXSwgdlswXSwgZHN0ICsgWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB5ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMiAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgorUk9XX0ZVTkMoWXV2VG9SZ2JSb3csICAgICAgVlA4WXV2VG9SZ2IsICAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3csICAgICAgVlA4WXV2VG9CZ3IsICAzKQorUk9XX0ZVTkMoWXV2VG9SZ2JhUm93LCAgICAgVlA4WXV2VG9SZ2JhLCA0KQorUk9XX0ZVTkMoWXV2VG9CZ3JhUm93LCAgICAgVlA4WXV2VG9CZ3JhLCA0KQorUk9XX0ZVTkMoWXV2VG9BcmdiUm93LCAgICAgVlA4WXV2VG9BcmdiLCA0KQorUk9XX0ZVTkMoWXV2VG9SZ2JhNDQ0NFJvdywgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1JPV19GVU5DKFl1dlRvUmdiNTY1Um93LCAgIFZQOFl1dlRvUmdiNTY1LCAyKQorCisjdW5kZWYgUk9XX0ZVTkMKKworLy8gTWFpbiBjYWxsIGZvciBwcm9jZXNzaW5nIGEgcGxhbmUgd2l0aCBhIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jdGlvbjoKK3ZvaWQgV2ViUFNhbXBsZXJQcm9jZXNzUGxhbmUoY29uc3QgdWludDhfdCogeSwgaW50IHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBpbnQgdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jKSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmdW5jKHksIHUsIHYsIGRzdCwgd2lkdGgpOworICAgIHkgKz0geV9zdHJpZGU7CisgICAgaWYgKGogJiAxKSB7CisgICAgICB1ICs9IHV2X3N0cmlkZTsKKyAgICAgIHYgKz0gdXZfc3RyaWRlOworICAgIH0KKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGwKKworV2ViUFNhbXBsZXJSb3dGdW5jIFdlYlBTYW1wbGVyc1tNT0RFX0xBU1RdOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpOworCitzdGF0aWMgdm9sYXRpbGUgVlA4Q1BVSW5mbyB5dXZfbGFzdF9jcHVpbmZvX3VzZWQgPQorICAgIChWUDhDUFVJbmZvKSZ5dXZfbGFzdF9jcHVpbmZvX3VzZWQ7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzKHZvaWQpIHsKKyAgaWYgKHl1dl9sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFl1dlRvUmdiUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gWXV2VG9SZ2JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gWXV2VG9CZ3JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBZdXZUb0JncmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBZdXZUb0FyZ2JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBZdXZUb1JnYmE0NDQ0Um93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gWXV2VG9SZ2I1NjVSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBZdXZUb1JnYmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBZdXZUb0JncmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBZdXZUb0FyZ2JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBZdXZUb1JnYmE0NDQ0Um93OworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzU1NFMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgorICB9CisgIHl1dl9sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFSR0IgLT4gWVVWIGNvbnZlcnRlcnMKKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1koY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCBwID0gYXJnYltpXTsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKChwID4+IDE2KSAmIDB4ZmYsIChwID4+IDgpICYgMHhmZiwgKHAgPj4gIDApICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgIFlVVl9IQUxGKTsKKyAgfQorfQorCit2b2lkIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSkgeworICAvLyBObyByb3VuZGluZy4gTGFzdCBwaXhlbCBpcyBkZWFsdCB3aXRoIHNlcGFyYXRlbHkuCisgIGNvbnN0IGludCB1dl93aWR0aCA9IHNyY193aWR0aCA+PiAxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHV2X3dpZHRoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB2MCA9IGFyZ2JbMiAqIGkgKyAwXTsKKyAgICBjb25zdCB1aW50MzJfdCB2MSA9IGFyZ2JbMiAqIGkgKyAxXTsKKyAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIGZvdXIgYWNjdW11bGF0ZWQgcGl4ZWxzLiBIZW5jZSB3ZSBuZWVkIHRvCisgICAgLy8gc2NhbGUgci9nL2IgdmFsdWUgYnkgYSBmYWN0b3IgMi4gV2UganVzdCBzaGlmdCB2MC92MSBvbmUgYml0IGxlc3MuCisgICAgY29uc3QgaW50IHIgPSAoKHYwID4+IDE1KSAmIDB4MWZlKSArICgodjEgPj4gMTUpICYgMHgxZmUpOworICAgIGNvbnN0IGludCBnID0gKCh2MCA+PiAgNykgJiAweDFmZSkgKyAoKHYxID4+ICA3KSAmIDB4MWZlKTsKKyAgICBjb25zdCBpbnQgYiA9ICgodjAgPDwgIDEpICYgMHgxZmUpICsgKCh2MSA8PCAgMSkgJiAweDFmZSk7CisgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGNvbnN0IGludCB0bXBfdiA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBpZiAoZG9fc3RvcmUpIHsKKyAgICAgIHVbaV0gPSB0bXBfdTsKKyAgICAgIHZbaV0gPSB0bXBfdjsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQXBwcm94aW1hdGVkIGF2ZXJhZ2Utb2YtZm91ci4gQnV0IGl0J3MgYW4gYWNjZXB0YWJsZSBkaWZmLgorICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOworICAgICAgdltpXSA9ICh2W2ldICsgdG1wX3YgKyAxKSA+PiAxOworICAgIH0KKyAgfQorICBpZiAoc3JjX3dpZHRoICYgMSkgeyAgICAgICAvLyBsYXN0IHBpeGVsCisgICAgY29uc3QgdWludDMyX3QgdjAgPSBhcmdiWzIgKiBpICsgMF07CisgICAgY29uc3QgaW50IHIgPSAodjAgPj4gMTQpICYgMHgzZmM7CisgICAgY29uc3QgaW50IGcgPSAodjAgPj4gIDYpICYgMHgzZmM7CisgICAgY29uc3QgaW50IGIgPSAodjAgPDwgIDIpICYgMHgzZmM7CisgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIGNvbnN0IGludCB0bXBfdiA9IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBpZiAoZG9fc3RvcmUpIHsKKyAgICAgIHVbaV0gPSB0bXBfdTsKKyAgICAgIHZbaV0gPSB0bXBfdjsKKyAgICB9IGVsc2UgeworICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOworICAgICAgdltpXSA9ICh2W2ldICsgdG1wX3YgKyAxKSA+PiAxOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWShjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2ksIHJnYiArPSAzKSB7CisgICAgeVtpXSA9IFZQOFJHQlRvWShyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUjI0VG9ZKGNvbnN0IHVpbnQ4X3QqIGJnciwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSwgYmdyICs9IDMpIHsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCit2b2lkIFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DKGNvbnN0IHVpbnQxNl90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgdVtpXSA9IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICB2W2ldID0gVlA4UkdCVG9WKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCAoKldlYlBDb252ZXJ0UkdCMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK3ZvaWQgKCpXZWJQQ29udmVydEJHUjI0VG9ZKShjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7Cit2b2lkICgqV2ViUENvbnZlcnRSR0JBMzJUb1VWKShjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKTsKKwordm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvWSkoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7Cit2b2lkICgqV2ViUENvbnZlcnRBUkdCVG9VVikoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKTsKKworc3RhdGljIHZvbGF0aWxlIFZQOENQVUluZm8gcmdiYV90b195dXZfbGFzdF9jcHVpbmZvX3VzZWQgPQorICAgIChWUDhDUFVJbmZvKSZyZ2JhX3RvX3l1dl9sYXN0X2NwdWluZm9fdXNlZDsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVih2b2lkKSB7CisgIGlmIChyZ2JhX3RvX3l1dl9sYXN0X2NwdWluZm9fdXNlZCA9PSBWUDhHZXRDUFVJbmZvKSByZXR1cm47CisKKyAgV2ViUENvbnZlcnRBUkdCVG9ZID0gQ29udmVydEFSR0JUb1k7CisgIFdlYlBDb252ZXJ0QVJHQlRvVVYgPSBXZWJQQ29udmVydEFSR0JUb1VWX0M7CisKKyAgV2ViUENvbnZlcnRSR0IyNFRvWSA9IENvbnZlcnRSR0IyNFRvWTsKKyAgV2ViUENvbnZlcnRCR1IyNFRvWSA9IENvbnZlcnRCR1IyNFRvWTsKKworICBXZWJQQ29udmVydFJHQkEzMlRvVVYgPSBXZWJQQ29udmVydFJHQkEzMlRvVVZfQzsKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorICB9CisgIHJnYmFfdG9feXV2X2xhc3RfY3B1aW5mb191c2VkID0gVlA4R2V0Q1BVSW5mbzsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXYuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGFmMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5oCkBAIC0wLDAgKzEsMjM4IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gaW5saW5lIFlVVjwtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9uCisvLworLy8gVGhlIGV4YWN0IG5hbWluZyBpcyBZJ0NiQ3IsIGZvbGxvd2luZyB0aGUgSVRVLVIgQlQuNjAxIHN0YW5kYXJkLgorLy8gTW9yZSBpbmZvcm1hdGlvbiBhdDogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZQ2JDcgorLy8gWSA9IDAuMjU2OSAqIFIgKyAwLjUwNDQgKiBHICsgMC4wOTc5ICogQiArIDE2CisvLyBVID0gLTAuMTQ4MyAqIFIgLSAwLjI5MTEgKiBHICsgMC40Mzk0ICogQiArIDEyOAorLy8gViA9IDAuNDM5NCAqIFIgLSAwLjM2NzkgKiBHIC0gMC4wNzE1ICogQiArIDEyOAorLy8gV2UgdXNlIDE2Yml0IGZpeGVkIHBvaW50IG9wZXJhdGlvbnMgZm9yIFJHQi0+WVVWIGNvbnZlcnNpb24gKFlVVl9GSVgpLgorLy8KKy8vIEZvciB0aGUgWSdDYkNyIHRvIFJHQiBjb252ZXJzaW9uLCB0aGUgQlQuNjAxIHNwZWNpZmljYXRpb24gcmVhZHM6CisvLyAgIFIgPSAxLjE2NCAqIChZLTE2KSArIDEuNTk2ICogKFYtMTI4KQorLy8gICBHID0gMS4xNjQgKiAoWS0xNikgLSAwLjgxMyAqIChWLTEyOCkgLSAwLjM5MSAqIChVLTEyOCkKKy8vICAgQiA9IDEuMTY0ICogKFktMTYpICAgICAgICAgICAgICAgICAgICsgMi4wMTggKiAoVS0xMjgpCisvLyB3aGVyZSBZIGlzIGluIHRoZSBbMTYsMjM1XSByYW5nZSwgYW5kIFUvViBpbiB0aGUgWzE2LDI0MF0gcmFuZ2UuCisvLworLy8gVGhlIGZpeGVkLXBvaW50IGltcGxlbWVudGF0aW9uIHVzZWQgaGVyZSBpczoKKy8vICBSID0gKDE5MDc3IC4geSAgICAgICAgICAgICArIDI2MTQ5IC4gdiAtIDE0MjM0KSA+PiA2CisvLyAgRyA9ICgxOTA3NyAuIHkgLSAgNjQxOSAuIHUgLSAxMzMyMCAuIHYgKyAgODcwOCkgPj4gNgorLy8gIEIgPSAoMTkwNzcgLiB5ICsgMzMwNTAgLiB1ICAgICAgICAgICAgIC0gMTc2ODUpID4+IDYKKy8vIHdoZXJlIHRoZSAnLicgb3BlcmF0b3IgaXMgdGhlIG11bGhpX2VwdTE2IHZhcmlhbnQ6CisvLyAgIGEgLiBiID0gKChhIDw8IDgpICogYikgPj4gMTYKKy8vIHRoYXQgcHJlc2VydmVzIDggYml0cyBvZiBmcmFjdGlvbmFsIHByZWNpc2lvbiBiZWZvcmUgZmluYWwgZGVzY2FsaW5nLgorCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRFNQX1lVVl9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX0RTUF9ZVVZfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZGVjL2RlY29kZV92cDguaCIKKworI2lmIGRlZmluZWQoV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMpCisvLyBEbyBOT1QgYWN0aXZhdGUgdGhpcyBmZWF0dXJlIGZvciByZWFsIGNvbXByZXNzaW9uLiBUaGlzIGlzIG9ubHkgZXhwZXJpbWVudGFsIQorLy8gVGhpcyBmbGFnIGlzIGZvciBjb21wYXJpc29uIHB1cnBvc2UgYWdhaW5zdCBKUEVHJ3MgIllVVmoiIG5hdHVyYWwgY29sb3JzcGFjZS4KKy8vIFRoaXMgY29sb3JzcGFjZSBpcyBjbG9zZSB0byBSZWMuNjAxJ3MgWSdDYkNyIG1vZGVsIHdpdGggdGhlIG5vdGFibGUKKy8vIGRpZmZlcmVuY2Ugb2YgYWxsb3dpbmcgbGFyZ2VyIHJhbmdlIGZvciBsdW1hL2Nocm9tYS4KKy8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0pQRUdfY29udmVyc2lvbiBwYXJhZ3JhcGgsIGFuZCBpdHMKKy8vIGRpZmZlcmVuY2Ugd2l0aCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0lUVS1SX0JULjYwMV9jb252ZXJzaW9uCisvLyAjZGVmaW5lIFVTRV9ZVVZqCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVViAtPiBSR0IgY29udmVyc2lvbgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2VudW0geworICBZVVZfRklYID0gMTYsICAgICAgICAgICAgICAgICAgICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIFJHQi0+WVVWCisgIFlVVl9IQUxGID0gMSA8PCAoWVVWX0ZJWCAtIDEpLAorICBZVVZfTUFTSyA9ICgyNTYgPDwgWVVWX0ZJWCkgLSAxLAorICBZVVZfUkFOR0VfTUlOID0gLTIyNywgICAgICAgICAgICAvLyBtaW4gdmFsdWUgb2Ygci9nL2Igb3V0cHV0CisgIFlVVl9SQU5HRV9NQVggPSAyNTYgKyAyMjYsICAgICAgIC8vIG1heCB2YWx1ZSBvZiByL2cvYiBvdXRwdXQKKworICBZVVZfRklYMiA9IDYsICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgWVVWLT5SR0IKKyAgWVVWX0hBTEYyID0gMSA8PCBZVVZfRklYMiA+PiAxLAorICBZVVZfTUFTSzIgPSAoMjU2IDw8IFlVVl9GSVgyKSAtIDEKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzbG93ZXIgb24geDg2IGJ5IH43LTglLCBidXQgYml0LWV4YWN0IHdpdGggdGhlIFNTRTIvTkVPTiB2ZXJzaW9uCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTXVsdEhpKGludCB2LCBpbnQgY29lZmYpIHsgICAvLyBfbW1fbXVsaGlfZXB1MTYgZW11bGF0aW9uCisgIHJldHVybiAodiAqIGNvZWZmKSA+PiA4OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOENsaXA4KGludCB2KSB7CisgIHJldHVybiAoKHYgJiB+WVVWX01BU0syKSA9PSAwKSA/ICh2ID4+IFlVVl9GSVgyKSA6ICh2IDwgMCkgPyAwIDogMjU1OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvUihpbnQgeSwgaW50IHYpIHsKKyAgcmV0dXJuIFZQOENsaXA4KE11bHRIaSh5LCAxOTA3NykgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvRyhpbnQgeSwgaW50IHUsIGludCB2KSB7CisgIHJldHVybiBWUDhDbGlwOChNdWx0SGkoeSwgMTkwNzcpIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvQihpbnQgeSwgaW50IHUpIHsKKyAgcmV0dXJuIFZQOENsaXA4KE11bHRIaSh5LCAxOTA3NykgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYihpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7CisgIHJnYlswXSA9IFZQOFlVVlRvUih5LCB2KTsKKyAgcmdiWzFdID0gVlA4WVVWVG9HKHksIHUsIHYpOworICByZ2JbMl0gPSBWUDhZVVZUb0IoeSwgdSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyKGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiZ3IpIHsKKyAgYmdyWzBdID0gVlA4WVVWVG9CKHksIHUpOworICBiZ3JbMV0gPSBWUDhZVVZUb0coeSwgdSwgdik7CisgIGJnclsyXSA9IFZQOFlVVlRvUih5LCB2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2I1NjUoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBjb25zdCBpbnQgciA9IFZQOFlVVlRvUih5LCB2KTsgICAgICAvLyA1IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCBnID0gVlA4WVVWVG9HKHksIHUsIHYpOyAgIC8vIDYgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGIgPSBWUDhZVVZUb0IoeSwgdSk7ICAgICAgLy8gNSB1c2FibGUgYml0cworICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gNSk7CisgIGNvbnN0IGludCBnYiA9ICgoZyA8PCAzKSAmIDB4ZTApIHwgKGIgPj4gMyk7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICByZ2JbMF0gPSBnYjsKKyAgcmdiWzFdID0gcmc7CisjZWxzZQorICByZ2JbMF0gPSByZzsKKyAgcmdiWzFdID0gZ2I7CisjZW5kaWYKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NChpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGNvbnN0IGludCByID0gVlA4WVVWVG9SKHksIHYpOyAgICAgICAgLy8gNCB1c2FibGUgYml0cworICBjb25zdCBpbnQgZyA9IFZQOFlVVlRvRyh5LCB1LCB2KTsgICAgIC8vIDQgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGIgPSBWUDhZVVZUb0IoeSwgdSk7ICAgICAgICAvLyA0IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCByZyA9IChyICYgMHhmMCkgfCAoZyA+PiA0KTsKKyAgY29uc3QgaW50IGJhID0gKGIgJiAweGYwKSB8IDB4MGY7ICAgICAvLyBvdmVyd3JpdGUgdGhlIGxvd2VyIDQgYml0cworI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKKyAgYXJnYlswXSA9IGJhOworICBhcmdiWzFdID0gcmc7CisjZWxzZQorICBhcmdiWzBdID0gcmc7CisgIGFyZ2JbMV0gPSBiYTsKKyNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbHBoYSBoYW5kbGluZyB2YXJpYW50cworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0FyZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGFyZ2JbMF0gPSAweGZmOworICBWUDhZdXZUb1JnYih5LCB1LCB2LCBhcmdiICsgMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQmdyYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncmEpIHsKKyAgVlA4WXV2VG9CZ3IoeSwgdSwgdiwgYmdyYSk7CisgIGJncmFbM10gPSAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIFZQOFl1dlRvUmdiKHksIHUsIHYsIHJnYmEpOworICByZ2JhWzNdID0gMHhmZjsKK30KKworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV2ZXJ5dGhpbmcsIHRvIGluaXRpYWxpemUgdGhlIHRhYmxlcy4KK3ZvaWQgVlA4WVVWSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NFMiBleHRyYSBmdW5jdGlvbnMgKG1vc3RseSBmb3IgdXBzYW1wbGluZ19zc2UyLmMpCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKy8vIFByb2Nlc3MgMzIgcGl4ZWxzIGFuZCBzdG9yZSB0aGUgcmVzdWx0ICgxNmIsIDI0YiBvciAzMmIgcGVyIHBpeGVsKSBpbiAqZHN0Lgordm9pZCBWUDhZdXZUb1JnYmEzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpOwordm9pZCBWUDhZdXZUb1JnYjMyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9CZ3JhMzIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9CZ3IzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvQXJnYjMyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvUmdiYTQ0NDQzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9SZ2I1NjUzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7CisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9TU0UyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSR0IgLT4gWVVWIGNvbnZlcnNpb24KKworLy8gU3R1YiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggdmFyaW91cyByb3VuZGluZyB2YWx1ZXM6CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOENsaXBVVihpbnQgdXYsIGludCByb3VuZGluZykgeworICB1diA9ICh1diArIHJvdW5kaW5nICsgKDEyOCA8PCAoWVVWX0ZJWCArIDIpKSkgPj4gKFlVVl9GSVggKyAyKTsKKyAgcmV0dXJuICgodXYgJiB+MHhmZikgPT0gMCkgPyB1diA6ICh1diA8IDApID8gMCA6IDI1NTsKK30KKworI2lmbmRlZiBVU0VfWVVWagorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgcm91bmRpbmcpIHsKKyAgY29uc3QgaW50IGx1bWEgPSAxNjgzOSAqIHIgKyAzMzA1OSAqIGcgKyA2NDIwICogYjsKKyAgcmV0dXJuIChsdW1hICsgcm91bmRpbmcgKyAoMTYgPDwgWVVWX0ZJWCkpID4+IFlVVl9GSVg7ICAvLyBubyBuZWVkIHRvIGNsaXAKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1UoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCB1ID0gLTk3MTkgKiByIC0gMTkwODEgKiBnICsgMjg4MDAgKiBiOworICByZXR1cm4gVlA4Q2xpcFVWKHUsIHJvdW5kaW5nKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCB2ID0gKzI4ODAwICogciAtIDI0MTE2ICogZyAtIDQ2ODQgKiBiOworICByZXR1cm4gVlA4Q2xpcFVWKHYsIHJvdW5kaW5nKTsKK30KKworI2Vsc2UKKworLy8gVGhpcyBKUEVHLVlVViBjb2xvcnNwYWNlLCBvbmx5IGZvciBjb21wYXJpc29uIQorLy8gVGhlc2UgYXJlIGFsc28gMTZiaXQgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyBmcm9tIFJlYy42MDEsIGJ1dCB3aXRoIGZ1bGwKKy8vIFswLi4yNTVdIG91dHB1dCByYW5nZS4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIsIGludCByb3VuZGluZykgeworICBjb25zdCBpbnQgbHVtYSA9IDE5NTk1ICogciArIDM4NDcwICogZyArIDc0NzEgKiBiOworICByZXR1cm4gKGx1bWEgKyByb3VuZGluZykgPj4gWVVWX0ZJWDsgIC8vIG5vIG5lZWQgdG8gY2xpcAorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgcm91bmRpbmcpIHsKKyAgY29uc3QgaW50IHUgPSAtMTEwNTggKiByIC0gMjE3MTAgKiBnICsgMzI3NjggKiBiOworICByZXR1cm4gVlA4Q2xpcFVWKHUsIHJvdW5kaW5nKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IHJvdW5kaW5nKSB7CisgIGNvbnN0IGludCB2ID0gMzI3NjggKiByIC0gMjc0MzkgKiBnIC0gNTMyOSAqIGI7CisgIHJldHVybiBWUDhDbGlwVVYodiwgcm91bmRpbmcpOworfQorCisjZW5kaWYgICAgLy8gVVNFX1lVVmoKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfRFNQX1lVVl9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1dl9taXBzMzIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXZfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2MDM0NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXZfbWlwczMyLmMKQEAgLTAsMCArMSwxMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaW5jbHVkZSAiLi95dXYuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsZSBwb2ludC1zYW1wbGluZworCisjZGVmaW5lIFJPV19GVU5DKEZVTkNfTkFNRSwgWFNURVAsIFIsIEcsIEIsIEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaSwgciwgZywgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAobGVuID4+IDEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gTXVsdEhpKHZbMF0sIDI2MTQ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyA9IE11bHRIaSh2WzBdLCAxMzMyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgPSBNdWx0SGkodVswXSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0ID0gTXVsdEhpKHVbMF0sIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMCA9IE11bHRIaSh5WzBdLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgLT0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzIC09IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiArPSB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgLT0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gVlA4Q2xpcDgodGVtcDAgLSB0ZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAwID0gTXVsdEhpKHlbMV0sIDE5MDc3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbUl0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0ddID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtCXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0FdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgciA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGcgPSBWUDhDbGlwOCh0ZW1wMCAtIHRlbXAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W1IgKyBYU1RFUF0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtHICsgWFNURVBdID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbQiArIFhTVEVQXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBICsgWFNURVBdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHkgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gTXVsdEhpKHZbMF0sIDI2MTQ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyA9IE11bHRIaSh2WzBdLCAxMzMyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgPSBNdWx0SGkodVswXSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0ID0gTXVsdEhpKHVbMF0sIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMCA9IE11bHRIaSh5WzBdLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgLT0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAzIC09IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMiArPSB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDQgLT0gMTc2ODU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gVlA4Q2xpcDgodGVtcDAgLSB0ZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtSXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbR10gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0JdID0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1JPV19GVU5DKFl1dlRvUmdiUm93LCAgICAgIDMsIDAsIDEsIDIsIDApCitST1dfRlVOQyhZdXZUb1JnYmFSb3csICAgICA0LCAwLCAxLCAyLCAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3csICAgICAgMywgMiwgMSwgMCwgMCkKK1JPV19GVU5DKFl1dlRvQmdyYVJvdywgICAgIDQsIDIsIDEsIDAsIDMpCisKKyN1bmRlZiBST1dfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTMzIodm9pZCkgeworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JdICA9IFl1dlRvUmdiUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSA9IFl1dlRvUmdiYVJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgPSBZdXZUb0JnclJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSQV0gPSBZdXZUb0JncmFSb3c7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1dl9taXBzX2RzcF9yMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1dl9taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZmJjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2X21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIERTUHIyIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6ICBCcmFuaW1pciBWYXNpYyAoYnJhbmltaXIudmFzaWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICIuL3l1di5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2ltcGxlIHBvaW50LXNhbXBsaW5nCisKKyNkZWZpbmUgUk9XX0ZVTkNfUEFSVF8xKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsYnUgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDAoJVt2XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXA0XSwgICAwKCVbdV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxidSAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3ldKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDFdLCAgICVbdF9jb25fMV0sICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RfY29uXzJdLCAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0X2Nvbl8zXSwgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDRdLCAgICVbdF9jb25fNF0sICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAwXSwgICAlW3RfY29uXzVdLCAgICAgJVt0ZW1wMF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgICVbdF9jb25fNl0gICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgICAlW3RfY29uXzddICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICAgICVbdF9jb25fOF0gICAgICBcblx0IiAgICAgICAgICBcCisKKyNkZWZpbmUgUk9XX0ZVTkNfUEFSVF8yKFIsIEcsIEIsIEspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDBdLCAgICAgICAlW3RlbXAxXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wMl0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgICAgICAgICBcCisiLmlmICIgI0sgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAxKCVbeV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzaGxsX3MudyAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAxNyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2hsbF9zLncgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuaWYgIiAjSyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdF9jb25fNV0sICAgICAlW3RlbXAwXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgIDE3ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmwgICAgICAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAgICAyNCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JsICAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgICAgMjQgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNybCAgICAgICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgICAgIDI0ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICAgICAgICAgICVbdGVtcDVdLCAgICIgI1IgIiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAgICAgICAgICAlW3RlbXA2XSwgICAiICNHICIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgICAgICAgICAgJVt0ZW1wN10sICAgIiAjQiAiKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisKKyNkZWZpbmUgQVNNX0NMT0JCRVJfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogW3RfY29uXzFdInIiKHRfY29uXzEpLCBbdF9jb25fMl0iciIodF9jb25fMiksIFt0X2Nvbl8zXSJyIih0X2Nvbl8zKSwgICAgICAgXAorICAgIFt0X2Nvbl80XSJyIih0X2Nvbl80KSwgW3RfY29uXzVdInIiKHRfY29uXzUpLCBbdF9jb25fNl0iciIodF9jb25fNiksICAgICAgIFwKKyAgICBbdV0iciIodSksIFt2XSJyIih2KSwgW3ldInIiKHkpLCBbZHN0XSJyIihkc3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgW3RfY29uXzddInIiKHRfY29uXzcpLCBbdF9jb25fOF0iciIodF9jb25fOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBST1dfRlVOQyhGVU5DX05BTUUsIFhTVEVQLCBSLCBHLCBCLCBBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fMSA9IDI2MTQ5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzIgPSAxMzMyMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl8zID0gNjQxOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNCA9IDMzMDUwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzUgPSAxOTA3NzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl82ID0gMTQyMzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNyA9IDg3MDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzggPSAxNzY4NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCAobGVuID4+IDEpOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzIoUiwgRywgQiwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8yKFIgKyBYU1RFUCwgRyArIFhTVEVQLCBCICsgWFNURVAsIDApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFTTV9DTE9CQkVSX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSBkc3RbQSArIFhTVEVQXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB5ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMiAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8yKFIsIEcsIEIsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFTTV9DTE9CQkVSX0xJU1QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQV0gPSAweGZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1JPV19GVU5DKFl1dlRvUmdiUm93LCAgICAgIDMsIDAsIDEsIDIsIDApCitST1dfRlVOQyhZdXZUb1JnYmFSb3csICAgICA0LCAwLCAxLCAyLCAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3csICAgICAgMywgMiwgMSwgMCwgMCkKK1JPV19GVU5DKFl1dlRvQmdyYVJvdywgICAgIDQsIDIsIDEsIDAsIDMpCisKKyN1bmRlZiBST1dfRlVOQworI3VuZGVmIEFTTV9DTE9CQkVSX0xJU1QKKyN1bmRlZiBST1dfRlVOQ19QQVJUXzIKKyN1bmRlZiBST1dfRlVOQ19QQVJUXzEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gPSBZdXZUb1JnYmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdID0gWXV2VG9CZ3JhUm93OworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2X3NzZTIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXZfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGZkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AveXV2X3NzZTIuYwpAQCAtMCwwICsxLDc3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnZlcnQgc3BhbnMgb2YgMzIgcGl4ZWxzIHRvIHZhcmlvdXMgUkdCIGZvcm1hdHMgZm9yIHRoZSBmYW5jeSB1cHNhbXBsZXIuCisKKy8vIFRoZXNlIGNvbnN0YW50cyBhcmUgMTRiIGZpeGVkLXBvaW50IHZlcnNpb24gb2YgSVRVLVIgQlQuNjAxIGNvbnN0YW50cy4KKy8vIFIgPSAoMTkwNzcgKiB5ICAgICAgICAgICAgICsgMjYxNDkgKiB2IC0gMTQyMzQpID4+IDYKKy8vIEcgPSAoMTkwNzcgKiB5IC0gIDY0MTkgKiB1IC0gMTMzMjAgKiB2ICsgIDg3MDgpID4+IDYKKy8vIEIgPSAoMTkwNzcgKiB5ICsgMzMwNTAgKiB1ICAgICAgICAgICAgIC0gMTc2ODUpID4+IDYKK3N0YXRpYyB2b2lkIENvbnZlcnRZVVY0NDRUb1JHQihjb25zdCBfX20xMjhpKiBjb25zdCBZMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBVMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBWMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIGsxOTA3NyA9IF9tbV9zZXQxX2VwaTE2KDE5MDc3KTsKKyAgY29uc3QgX19tMTI4aSBrMjYxNDkgPSBfbW1fc2V0MV9lcGkxNigyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgazE0MjM0ID0gX21tX3NldDFfZXBpMTYoMTQyMzQpOworICAvLyAzMzA1MCBkb2Vzbid0IGZpdCBpbiBhIHNpZ25lZCBzaG9ydDogb25seSB1c2UgdGhpcyB3aXRoIHVuc2lnbmVkIGFyaXRobWV0aWMKKyAgY29uc3QgX19tMTI4aSBrMzMwNTAgPSBfbW1fc2V0MV9lcGkxNigoc2hvcnQpMzMwNTApOworICBjb25zdCBfX20xMjhpIGsxNzY4NSA9IF9tbV9zZXQxX2VwaTE2KDE3Njg1KTsKKyAgY29uc3QgX19tMTI4aSBrNjQxOSAgPSBfbW1fc2V0MV9lcGkxNig2NDE5KTsKKyAgY29uc3QgX19tMTI4aSBrMTMzMjAgPSBfbW1fc2V0MV9lcGkxNigxMzMyMCk7CisgIGNvbnN0IF9fbTEyOGkgazg3MDggID0gX21tX3NldDFfZXBpMTYoODcwOCk7CisKKyAgY29uc3QgX19tMTI4aSBZMSA9IF9tbV9tdWxoaV9lcHUxNigqWTAsIGsxOTA3Nyk7CisKKyAgY29uc3QgX19tMTI4aSBSMCA9IF9tbV9tdWxoaV9lcHUxNigqVjAsIGsyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgUjEgPSBfbW1fc3ViX2VwaTE2KFkxLCBrMTQyMzQpOworICBjb25zdCBfX20xMjhpIFIyID0gX21tX2FkZF9lcGkxNihSMSwgUjApOworCisgIGNvbnN0IF9fbTEyOGkgRzAgPSBfbW1fbXVsaGlfZXB1MTYoKlUwLCBrNjQxOSk7CisgIGNvbnN0IF9fbTEyOGkgRzEgPSBfbW1fbXVsaGlfZXB1MTYoKlYwLCBrMTMzMjApOworICBjb25zdCBfX20xMjhpIEcyID0gX21tX2FkZF9lcGkxNihZMSwgazg3MDgpOworICBjb25zdCBfX20xMjhpIEczID0gX21tX2FkZF9lcGkxNihHMCwgRzEpOworICBjb25zdCBfX20xMjhpIEc0ID0gX21tX3N1Yl9lcGkxNihHMiwgRzMpOworCisgIC8vIGJlIGNhcmVmdWwgd2l0aCB0aGUgc2F0dXJhdGVkICp1bnNpZ25lZCogYXJpdGhtZXRpYyBoZXJlIQorICBjb25zdCBfX20xMjhpIEIwID0gX21tX211bGhpX2VwdTE2KCpVMCwgazMzMDUwKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hZGRzX2VwdTE2KEIwLCBZMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fc3Vic19lcHUxNihCMSwgazE3Njg1KTsKKworICAvLyB1c2UgbG9naWNhbCBzaGlmdCBmb3IgQjIsIHdoaWNoIGNhbiBiZSBsYXJnZXIgdGhhbiAzMjc2NworICAqUiA9IF9tbV9zcmFpX2VwaTE2KFIyLCA2KTsgICAvLyByYW5nZTogWy0xNDIzNCwgMzA4MTVdCisgICpHID0gX21tX3NyYWlfZXBpMTYoRzQsIDYpOyAgIC8vIHJhbmdlOiBbLTEwOTUzLCAyNzcxMF0KKyAgKkIgPSBfbW1fc3JsaV9lcGkxNihCMiwgNik7ICAgLy8gcmFuZ2U6IFswLCAzNDIzOF0KK30KKworLy8gTG9hZCB0aGUgYnl0ZXMgaW50byB0aGUgKnVwcGVyKiBwYXJ0IG9mIDE2YiB3b3Jkcy4gVGhhdCdzICI8PCA4IiwgYmFzaWNhbGx5Lgorc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgTG9hZF9ISV8xNihjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGk4KHplcm8sIF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopc3JjKSk7Cit9CisKKy8vIExvYWQgYW5kIHJlcGxpY2F0ZSB0aGUgVS9WIHNhbXBsZXMKK3N0YXRpYyBXRUJQX0lOTElORSBfX20xMjhpIExvYWRfVVZfSElfOChjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2N2dHNpMzJfc2kxMjgoKihjb25zdCB1aW50MzJfdCopc3JjKTsKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX3VucGFja2xvX2VwaTgoemVybywgdG1wMCk7CisgIHJldHVybiBfbW1fdW5wYWNrbG9fZXBpMTYodG1wMSwgdG1wMSk7ICAgLy8gcmVwbGljYXRlIHNhbXBsZXMKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQ0NCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDQ0VG9SR0IoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNih5KSwgVTAgPSBMb2FkX0hJXzE2KHUpLCBWMCA9IExvYWRfSElfMTYodik7CisgIENvbnZlcnRZVVY0NDRUb1JHQigmWTAsICZVMCwgJlYwLCBSLCBHLCBCKTsKK30KKworLy8gQ29udmVydCAzMiBzYW1wbGVzIG9mIFlVVjQyMCB0byBSL0cvQgorc3RhdGljIHZvaWQgWVVWNDIwVG9SR0IoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNih5KSwgVTAgPSBMb2FkX1VWX0hJXzgodSksIFYwID0gTG9hZF9VVl9ISV84KHYpOworICBDb252ZXJ0WVVWNDQ0VG9SR0IoJlkwLCAmVTAsICZWMCwgUiwgRywgQik7Cit9CisKKy8vIFBhY2sgUi9HL0IvQSByZXN1bHRzIGludG8gMzJiIG91dHB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBhY2tBbmRTdG9yZTQoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgcmIgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgZ2EgPSBfbW1fcGFja3VzX2VwaTE2KCpHLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgcmcgPSBfbW1fdW5wYWNrbG9fZXBpOChyYiwgZ2EpOworICBjb25zdCBfX20xMjhpIGJhID0gX21tX3VucGFja2hpX2VwaTgocmIsIGdhKTsKKyAgY29uc3QgX19tMTI4aSBSR0JBX2xvID0gX21tX3VucGFja2xvX2VwaTE2KHJnLCBiYSk7CisgIGNvbnN0IF9fbTEyOGkgUkdCQV9oaSA9IF9tbV91bnBhY2toaV9lcGkxNihyZywgYmEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgIDApLCBSR0JBX2xvKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIDE2KSwgUkdCQV9oaSk7Cit9CisKKy8vIFBhY2sgUi9HL0IvQSByZXN1bHRzIGludG8gMTZiIG91dHB1dC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBhY2tBbmRTdG9yZTQ0NDQoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9TV0FQXzE2QklUX0NTUCkKKyAgY29uc3QgX19tMTI4aSByZzAgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgYmEwID0gX21tX3BhY2t1c19lcGkxNigqQiwgKkEpOworI2Vsc2UKKyAgY29uc3QgX19tMTI4aSByZzAgPSBfbW1fcGFja3VzX2VwaTE2KCpCLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgYmEwID0gX21tX3BhY2t1c19lcGkxNigqUiwgKkcpOworI2VuZGlmCisgIGNvbnN0IF9fbTEyOGkgbWFza18weGYwID0gX21tX3NldDFfZXBpOCgweGYwKTsKKyAgY29uc3QgX19tMTI4aSByYjEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZzAsIGJhMCk7ICAvLyByYnJicmJyYnJiLi4uCisgIGNvbnN0IF9fbTEyOGkgZ2ExID0gX21tX3VucGFja2hpX2VwaTgocmcwLCBiYTApOyAgLy8gZ2FnYWdhZ2FnYS4uLgorICBjb25zdCBfX20xMjhpIHJiMiA9IF9tbV9hbmRfc2kxMjgocmIxLCBtYXNrXzB4ZjApOworICBjb25zdCBfX20xMjhpIGdhMiA9IF9tbV9zcmxpX2VwaTE2KF9tbV9hbmRfc2kxMjgoZ2ExLCBtYXNrXzB4ZjApLCA0KTsKKyAgY29uc3QgX19tMTI4aSByZ2JhNDQ0NCA9IF9tbV9vcl9zaTEyOChyYjIsIGdhMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgcmdiYTQ0NDQpOworfQorCisvLyBQYWNrIFIvRy9CIHJlc3VsdHMgaW50byAxNmIgb3V0cHV0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGFja0FuZFN0b3JlNTY1KGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBjb25zdCBfX20xMjhpIHIwID0gX21tX3BhY2t1c19lcGkxNigqUiwgKlIpOworICBjb25zdCBfX20xMjhpIGcwID0gX21tX3BhY2t1c19lcGkxNigqRywgKkcpOworICBjb25zdCBfX20xMjhpIGIwID0gX21tX3BhY2t1c19lcGkxNigqQiwgKkIpOworICBjb25zdCBfX20xMjhpIHIxID0gX21tX2FuZF9zaTEyOChyMCwgX21tX3NldDFfZXBpOCgweGY4KSk7CisgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYW5kX3NpMTI4KF9tbV9zcmxpX2VwaTE2KGIwLCAzKSwgX21tX3NldDFfZXBpOCgweDFmKSk7CisgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fc3JsaV9lcGkxNihfbW1fYW5kX3NpMTI4KGcwLCBfbW1fc2V0MV9lcGk4KDB4ZTApKSwgNSk7CisgIGNvbnN0IF9fbTEyOGkgZzIgPSBfbW1fc2xsaV9lcGkxNihfbW1fYW5kX3NpMTI4KGcwLCBfbW1fc2V0MV9lcGk4KDB4MWMpKSwgMyk7CisgIGNvbnN0IF9fbTEyOGkgcmcgPSBfbW1fb3Jfc2kxMjgocjEsIGcxKTsKKyAgY29uc3QgX19tMTI4aSBnYiA9IF9tbV9vcl9zaTEyOChnMiwgYjEpOworI2lmICFkZWZpbmVkKFdFQlBfU1dBUF8xNkJJVF9DU1ApCisgIGNvbnN0IF9fbTEyOGkgcmdiNTY1ID0gX21tX3VucGFja2xvX2VwaTgocmcsIGdiKTsKKyNlbHNlCisgIGNvbnN0IF9fbTEyOGkgcmdiNTY1ID0gX21tX3VucGFja2xvX2VwaTgoZ2IsIHJnKTsKKyNlbmRpZgorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHJnYjU2NSk7Cit9CisKKy8vIEZ1bmN0aW9uIHVzZWQgc2V2ZXJhbCB0aW1lcyBpbiBQbGFuYXJUbzI0Yi4KKy8vIEl0IHNhbXBsZXMgdGhlIGluIGJ1ZmZlciBhcyBmb2xsb3dzOiBvbmUgZXZlcnkgdHdvIHVuc2lnbmVkIGNoYXIgaXMgc3RvcmVkCisvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHdoaWxlIHRoZSBvdGhlciBoYWxmIGlzIHN0b3JlZCBhdCB0aGUgZW5kLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGxhbmFyVG8yNGJIZWxwZXIoY29uc3QgX19tMTI4aSogY29uc3QgaW4gLyppbls2XSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0IC8qb3V0WzZdKi8pIHsKKyAgY29uc3QgX19tMTI4aSB2X21hc2sgPSBfbW1fc2V0MV9lcGkxNigweDAwZmYpOworCisgIC8vIFRha2Ugb25lIGV2ZXJ5IHR3byB1cHBlciA4YiB2YWx1ZXMuCisgIG91dFswXSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FuZF9zaTEyOChpblswXSwgdl9tYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3NpMTI4KGluWzFdLCB2X21hc2spKTsKKyAgb3V0WzFdID0gX21tX3BhY2t1c19lcGkxNihfbW1fYW5kX3NpMTI4KGluWzJdLCB2X21hc2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9hbmRfc2kxMjgoaW5bM10sIHZfbWFzaykpOworICBvdXRbMl0gPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hbmRfc2kxMjgoaW5bNF0sIHZfbWFzayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2FuZF9zaTEyOChpbls1XSwgdl9tYXNrKSk7CisgIC8vIFRha2Ugb25lIGV2ZXJ5IHR3byBsb3dlciA4YiB2YWx1ZXMuCisgIG91dFszXSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX3NybGlfZXBpMTYoaW5bMF0sIDgpLCBfbW1fc3JsaV9lcGkxNihpblsxXSwgOCkpOworICBvdXRbNF0gPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9zcmxpX2VwaTE2KGluWzJdLCA4KSwgX21tX3NybGlfZXBpMTYoaW5bM10sIDgpKTsKKyAgb3V0WzVdID0gX21tX3BhY2t1c19lcGkxNihfbW1fc3JsaV9lcGkxNihpbls0XSwgOCksIF9tbV9zcmxpX2VwaTE2KGluWzVdLCA4KSk7Cit9CisKKy8vIFBhY2sgdGhlIHBsYW5hciBidWZmZXJzCisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIHRyaXBsZXQgYnkgdHJpcGxldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciByZ2IgYXMgcmdicmdicmdicmdiIC4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGxhbmFyVG8yNGIoX19tMTI4aSogY29uc3QgaW4gLyppbls2XSovLCB1aW50OF90KiByZ2IpIHsKKyAgLy8gVGhlIGlucHV0IGlzIDYgcmVnaXN0ZXJzIG9mIHNpeHRlZW4gOGIgYnV0IGZvciB0aGUgc2FrZSBvZiBleHBsYW5hdGlvbiwKKyAgLy8gbGV0J3MgdGFrZSA2IHJlZ2lzdGVycyBvZiBmb3VyIDhiIHZhbHVlcy4KKyAgLy8gVG8gcGFjaywgd2Ugd2lsbCBrZWVwIHRha2luZyBvbmUgZXZlcnkgdHdvIDhiIGludGVnZXIgYW5kIG1vdmUgaXQKKyAgLy8gYXJvdW5kIGFzIGZvbGxvd3M6CisgIC8vIElucHV0OgorICAvLyAgIHIwcjFyMnIzIHwgcjRyNXI2cjcgfCBnMGcxZzJnMyB8IGc0ZzVnNmc3IHwgYjBiMWIyYjMgfCBiNGI1YjZiNworICAvLyBTcGxpdCB0aGUgNiByZWdpc3RlcnMgaW4gdHdvIHNldHMgb2YgMyByZWdpc3RlcnM6IHRoZSBmaXJzdCBzZXQgYXMgdGhlIGV2ZW4KKyAgLy8gOGIgYnl0ZXMsIHRoZSBzZWNvbmQgdGhlIG9kZCBvbmVzOgorICAvLyAgIHIwcjJyNHI2IHwgZzBnMmc0ZzYgfCBiMGIyYjRiNiB8IHIxcjNyNXI3IHwgZzFnM2c1ZzcgfCBiMWIzYjViNworICAvLyBSZXBlYXQgdGhlIHNhbWUgcGVybXV0YXRpb25zIHR3aWNlIG1vcmU6CisgIC8vICAgcjByNGcwZzQgfCBiMGI0cjFyNSB8IGcxZzViMWI1IHwgcjJyNmcyZzYgfCBiMmI2cjNyNyB8IGczZzdiM2I3CisgIC8vICAgcjBnMGIwcjEgfCBnMWIxcjJnMiB8IGIycjNnM2IzIHwgcjRnNGI0cjUgfCBnNWI1cjZnNiB8IGI2cjdnN2I3CisgIF9fbTEyOGkgdG1wWzZdOworICBQbGFuYXJUbzI0YkhlbHBlcihpbiwgdG1wKTsKKyAgUGxhbmFyVG8yNGJIZWxwZXIodG1wLCBpbik7CisgIFBsYW5hclRvMjRiSGVscGVyKGluLCB0bXApOworICAvLyBXZSBuZWVkIHRvIGRvIGl0IHR3byBtb3JlIHRpbWVzIHRoYW4gdGhlIGV4YW1wbGUgYXMgd2UgaGF2ZSBzaXh0ZWVuIGJ5dGVzLgorICBQbGFuYXJUbzI0YkhlbHBlcih0bXAsIGluKTsKKyAgUGxhbmFyVG8yNGJIZWxwZXIoaW4sIHRtcCk7CisKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArICAwKSwgdG1wWzBdKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDE2KSwgdG1wWzFdKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDMyKSwgdG1wWzJdKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDQ4KSwgdG1wWzNdKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDY0KSwgdG1wWzRdKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDgwKSwgdG1wWzVdKTsKK30KKyN1bmRlZiBNS19VSU5UMzIKKwordm9pZCBWUDhZdXZUb1JnYmEzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZSLCAmRywgJkIsICZrQWxwaGEsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb0JncmEzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZCLCAmRywgJlIsICZrQWxwaGEsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb0FyZ2IzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZrQWxwaGEsICZSLCAmRywgJkIsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb1JnYmE0NDQ0MzIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDE2KSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTQ0NDQoJlIsICZHLCAmQiwgJmtBbHBoYSwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvUmdiNTY1MzIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMTYpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0IoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNTY1KCZSLCAmRywgJkIsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb1JnYjMyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgX19tMTI4aSByZ2JbNl07CisKKyAgWVVWNDQ0VG9SR0IoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgIFlVVjQ0NFRvUkdCKHkgKyAgOCwgdSArICA4LCB2ICsgIDgsICZSMSwgJkcxLCAmQjEpOworICBZVVY0NDRUb1JHQih5ICsgMTYsIHUgKyAxNiwgdiArIDE2LCAmUjIsICZHMiwgJkIyKTsKKyAgWVVWNDQ0VG9SR0IoeSArIDI0LCB1ICsgMjQsIHYgKyAyNCwgJlIzLCAmRzMsICZCMyk7CisKKyAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgUlJSUkdHR0dCQkJCLgorICByZ2JbMF0gPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIHJnYlsxXSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgcmdiWzJdID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICByZ2JbM10gPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgIHJnYls0XSA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgcmdiWzVdID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworCisgIC8vIFBhY2sgYXMgUkdCUkdCUkdCUkdCLgorICBQbGFuYXJUbzI0YihyZ2IsIGRzdCk7Cit9CisKK3ZvaWQgVlA4WXV2VG9CZ3IzMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgIF9fbTEyOGkgYmdyWzZdOworCisgIFlVVjQ0NFRvUkdCKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICBZVVY0NDRUb1JHQih5ICsgIDgsIHUgKyAgOCwgdiArICA4LCAmUjEsICZHMSwgJkIxKTsKKyAgWVVWNDQ0VG9SR0IoeSArIDE2LCB1ICsgMTYsIHYgKyAxNiwgJlIyLCAmRzIsICZCMik7CisgIFlVVjQ0NFRvUkdCKHkgKyAyNCwgdSArIDI0LCB2ICsgMjQsICZSMywgJkczLCAmQjMpOworCisgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIEJCQkJHR0dHUlJSUi4KKyAgYmdyWzBdID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICBiZ3JbMV0gPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgIGJnclsyXSA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgYmdyWzNdID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICBiZ3JbNF0gPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgIGJncls1XSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKworICAvLyBQYWNrIGFzIEJHUkJHUkJHUkJHUi4KKyAgUGxhbmFyVG8yNGIoYmdyLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBcmJpdHJhcnktbGVuZ3RoIHJvdyBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitzdGF0aWMgdm9pZCBZdXZUb1JnYmFSb3coY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZSLCAmRywgJkIsICZrQWxwaGEsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb1JnYmEoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JncmFSb3coY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZCLCAmRywgJlIsICZrQWxwaGEsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0JncmEoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0FyZ2JSb3coY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQih5LCB1LCB2LCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0KCZrQWxwaGEsICZSLCAmRywgJkIsIGRzdCk7CisgICAgeSArPSA4OworICAgIHUgKz0gNDsKKyAgICB2ICs9IDQ7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0FyZ2IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gNDsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYlJvdyhjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgMzIgPD0gbGVuOyBuICs9IDMyLCBkc3QgKz0gMzIgKiAzKSB7CisgICAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICAgIF9fbTEyOGkgcmdiWzZdOworCisgICAgWVVWNDIwVG9SR0IoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgICAgWVVWNDIwVG9SR0IoeSArICA4LCB1ICsgIDQsIHYgKyAgNCwgJlIxLCAmRzEsICZCMSk7CisgICAgWVVWNDIwVG9SR0IoeSArIDE2LCB1ICsgIDgsIHYgKyAgOCwgJlIyLCAmRzIsICZCMik7CisgICAgWVVWNDIwVG9SR0IoeSArIDI0LCB1ICsgMTIsIHYgKyAxMiwgJlIzLCAmRzMsICZCMyk7CisKKyAgICAvLyBDYXN0IHRvIDhiIGFuZCBzdG9yZSBhcyBSUlJSR0dHR0JCQkIuCisgICAgcmdiWzBdID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICAgIHJnYlsxXSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgICByZ2JbMl0gPSBfbW1fcGFja3VzX2VwaTE2KEcwLCBHMSk7CisgICAgcmdiWzNdID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICAgIHJnYls0XSA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICByZ2JbNV0gPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisKKyAgICAvLyBQYWNrIGFzIFJHQlJHQlJHQlJHQi4KKyAgICBQbGFuYXJUbzI0YihyZ2IsIGRzdCk7CisKKyAgICB5ICs9IDMyOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvUmdiKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDM7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JSb3coY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDMyIDw9IGxlbjsgbiArPSAzMiwgZHN0ICs9IDMyICogMykgeworICAgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgICBfX20xMjhpIGJncls2XTsKKworICAgIFlVVjQyMFRvUkdCKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICAgIFlVVjQyMFRvUkdCKHkgKyAgOCwgdSArICA0LCB2ICsgIDQsICZSMSwgJkcxLCAmQjEpOworICAgIFlVVjQyMFRvUkdCKHkgKyAxNiwgdSArICA4LCB2ICsgIDgsICZSMiwgJkcyLCAmQjIpOworICAgIFlVVjQyMFRvUkdCKHkgKyAyNCwgdSArIDEyLCB2ICsgMTIsICZSMywgJkczLCAmQjMpOworCisgICAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgQkJCQkdHR0dSUlJSLgorICAgIGJnclswXSA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICBiZ3JbMV0gPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgICAgYmdyWzJdID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICAgIGJnclszXSA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgICBiZ3JbNF0gPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgICAgYmdyWzVdID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworCisgICAgLy8gUGFjayBhcyBCR1JCR1JCR1JCR1IuCisgICAgUGxhbmFyVG8yNGIoYmdyLCBkc3QpOworCisgICAgeSArPSAzMjsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0Jncih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSAzOworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0UyKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvdzsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCQV0gPSBZdXZUb1JnYmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdID0gWXV2VG9CZ3JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9BUkdCXSA9IFl1dlRvQXJnYlJvdzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQjI0LzMyIC0+IFlVViBjb252ZXJ0ZXJzCisKKy8vIExvYWQgZWlnaHQgMTZiLXdvcmRzIGZyb20gKnNyYy4KKyNkZWZpbmUgTE9BRF8xNihzcmMpIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYykpCisvLyBTdG9yZSBlaXRoZXIgMTZiLXdvcmRzIGludG8gKmRzdAorI2RlZmluZSBTVE9SRV8xNihWLCBkc3QpIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QpLCAoVikpCisKKy8vIEZ1bmN0aW9uIHRoYXQgaW5zZXJ0cyBhIHZhbHVlIG9mIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgaW4gYnVmZmVyIGluIGJldHdlZW4KKy8vIGV2ZXJ5IHR3byBjaGFyIG9mIHRoZSBmaXJzdCBoYWxmLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcigKKyAgICBjb25zdCBfX20xMjhpKiBjb25zdCBpbiAvKmluWzZdKi8sIF9fbTEyOGkqIGNvbnN0IG91dCAvKm91dFs2XSovKSB7CisgIG91dFswXSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzBdLCBpblszXSk7CisgIG91dFsxXSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzBdLCBpblszXSk7CisgIG91dFsyXSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzFdLCBpbls0XSk7CisgIG91dFszXSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzFdLCBpbls0XSk7CisgIG91dFs0XSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzJdLCBpbls1XSk7CisgIG91dFs1XSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzJdLCBpbls1XSk7Cit9CisKKy8vIFVucGFjayB0aGUgOGIgaW5wdXQgcmdicmdicmdicmdiIC4uLiBhcyBjb250aWd1b3VzIHJlZ2lzdGVyczoKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gU2ltaWxhciB0byBQbGFuYXJUbzI0YkhlbHBlcigpLCBidXQgaW4gcmV2ZXJzZSBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjI0UGFja2VkVG9QbGFuYXIoY29uc3QgdWludDhfdCogY29uc3QgcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQgLypvdXRbNl0qLykgeworICBfX20xMjhpIHRtcFs2XTsKKyAgdG1wWzBdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgIDApKTsKKyAgdG1wWzFdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMTYpKTsKKyAgdG1wWzJdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMzIpKTsKKyAgdG1wWzNdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNDgpKTsKKyAgdG1wWzRdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgNjQpKTsKKyAgdG1wWzVdID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgODApKTsKKworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyKHRtcCwgb3V0KTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcihvdXQsIHRtcCk7CisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXIodG1wLCBvdXQpOworICBSR0IyNFBhY2tlZFRvUGxhbmFySGVscGVyKG91dCwgdG1wKTsKKyAgUkdCMjRQYWNrZWRUb1BsYW5hckhlbHBlcih0bXAsIG91dCk7Cit9CisKKy8vIENvbnZlcnQgOCBwYWNrZWQgQVJHQiB0byByW10sIGdbXSwgYltdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IzMlBhY2tlZFRvUGxhbmFyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBiKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgaW4wID0gTE9BRF8xNihhcmdiICsgMCk7ICAgIC8vIGFyZ2IzIHwgYXJnYjIgfCBhcmdiMSB8IGFyZ2IwCisgIGNvbnN0IF9fbTEyOGkgaW4xID0gTE9BRF8xNihhcmdiICsgNCk7ICAgIC8vIGFyZ2I3IHwgYXJnYjYgfCBhcmdiNSB8IGFyZ2I0CisgIC8vIGNvbHVtbi13aXNlIHRyYW5zcG9zZQorICBjb25zdCBfX20xMjhpIEEwID0gX21tX3VucGFja2xvX2VwaTgoaW4wLCBpbjEpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2hpX2VwaTgoaW4wLCBpbjEpOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGk4KEEwLCBBMSk7CisgIC8vIEMwID0gZzcgZzYgLi4uIGcxIGcwIHwgYjcgYjYgLi4uIGIxIGIwCisgIC8vIEMxID0gYTcgYTYgLi4uIGExIGEwIHwgcjcgcjYgLi4uIHIxIHIwCisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChCMCwgQjEpOworICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2hpX2VwaTgoQjAsIEIxKTsKKyAgLy8gc3RvcmUgMTZiCisgICpyID0gX21tX3VucGFja2xvX2VwaTgoQzEsIHplcm8pOworICAqZyA9IF9tbV91bnBhY2toaV9lcGk4KEMwLCB6ZXJvKTsKKyAgKmIgPSBfbW1fdW5wYWNrbG9fZXBpOChDMCwgemVybyk7Cit9CisKKy8vIFRoaXMgbWFjcm8gY29tcHV0ZXMgKFJHICogTVVMVF9SRyArIEdCICogTVVMVF9HQiArIFJPVU5ERVIpID4+IERFU0NBTEVfRklYCisvLyBJdCdzIGEgbWFjcm8gYW5kIG5vdCBhIGZ1bmN0aW9uIGJlY2F1c2Ugd2UgbmVlZCB0byB1c2UgaW1tZWRpYXRlIHZhbHVlcyB3aXRoCisvLyBzcmFpX2VwaTMyLCBlLmcuCisjZGVmaW5lIFRSQU5TRk9STShSR19MTywgUkdfSEksIEdCX0xPLCBHQl9ISSwgTVVMVF9SRywgTVVMVF9HQiwgXAorICAgICAgICAgICAgICAgICAgUk9VTkRFUiwgREVTQ0FMRV9GSVgsIE9VVCkgZG8geyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMF9sbyA9IF9tbV9tYWRkX2VwaTE2KFJHX0xPLCBNVUxUX1JHKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjBfaGkgPSBfbW1fbWFkZF9lcGkxNihSR19ISSwgTVVMVF9SRyk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYxX2xvID0gX21tX21hZGRfZXBpMTYoR0JfTE8sIE1VTFRfR0IpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMV9oaSA9IF9tbV9tYWRkX2VwaTE2KEdCX0hJLCBNVUxUX0dCKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjJfbG8gPSBfbW1fYWRkX2VwaTMyKFYwX2xvLCBWMV9sbyk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYyX2hpID0gX21tX2FkZF9lcGkzMihWMF9oaSwgVjFfaGkpOyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWM19sbyA9IF9tbV9hZGRfZXBpMzIoVjJfbG8sIFJPVU5ERVIpOyAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjNfaGkgPSBfbW1fYWRkX2VwaTMyKFYyX2hpLCBST1VOREVSKTsgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFY1X2xvID0gX21tX3NyYWlfZXBpMzIoVjNfbG8sIERFU0NBTEVfRklYKTsgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWNV9oaSA9IF9tbV9zcmFpX2VwaTMyKFYzX2hpLCBERVNDQUxFX0ZJWCk7ICAgICBcCisgIChPVVQpID0gX21tX3BhY2tzX2VwaTMyKFY1X2xvLCBWNV9oaSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNS19DU1RfMTYoQSwgQikgX21tX3NldF9lcGkxNigoQiksIChBKSwgKEIpLCAoQSksIChCKSwgKEEpLCAoQiksIChBKSkKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1koY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgWSkgeworICBjb25zdCBfX20xMjhpIGtSR195ID0gTUtfQ1NUXzE2KDE2ODM5LCAzMzA1OSAtIDE2Mzg0KTsKKyAgY29uc3QgX19tMTI4aSBrR0JfeSA9IE1LX0NTVF8xNigxNjM4NCwgNjQyMCk7CisgIGNvbnN0IF9fbTEyOGkga0hBTEZfWSA9IF9tbV9zZXQxX2VwaTMyKCgxNiA8PCBZVVZfRklYKSArIFlVVl9IQUxGKTsKKworICBjb25zdCBfX20xMjhpIFJHX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgUkdfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBHQl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqRywgKkIpOworICBjb25zdCBfX20xMjhpIEdCX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpHLCAqQik7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3ksIGtHQl95LCBrSEFMRl9ZLCBZVVZfRklYLCAqWSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1VWKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFUsIF9fbTEyOGkqIGNvbnN0IFYpIHsKKyAgY29uc3QgX19tMTI4aSBrUkdfdSA9IE1LX0NTVF8xNigtOTcxOSwgLTE5MDgxKTsKKyAgY29uc3QgX19tMTI4aSBrR0JfdSA9IE1LX0NTVF8xNigwLCAyODgwMCk7CisgIGNvbnN0IF9fbTEyOGkga1JHX3YgPSBNS19DU1RfMTYoMjg4MDAsIDApOworICBjb25zdCBfX20xMjhpIGtHQl92ID0gTUtfQ1NUXzE2KC0yNDExNiwgLTQ2ODQpOworICBjb25zdCBfX20xMjhpIGtIQUxGX1VWID0gX21tX3NldDFfZXBpMzIoKCgxMjggPDwgWVVWX0ZJWCkgKyBZVVZfSEFMRikgPDwgMik7CisKKyAgY29uc3QgX19tMTI4aSBSR19sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIFJHX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgR0JfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKkcsICpCKTsKKyAgY29uc3QgX19tMTI4aSBHQl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqRywgKkIpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR191LCBrR0JfdSwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlUpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR192LCBrR0JfdiwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlYpOworfQorCisjdW5kZWYgTUtfQ1NUXzE2CisjdW5kZWYgVFJBTlNGT1JNCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWShjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyByZ2IgKz0gMyAqIDE2ICogMikgeworICAgIF9fbTEyOGkgcmdiX3BsYW5lWzZdOworICAgIGludCBqOworCisgICAgUkdCMjRQYWNrZWRUb1BsYW5hcihyZ2IsIHJnYl9wbGFuZSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqLCBpICs9IDE2KSB7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgX19tMTI4aSByLCBnLCBiLCBZMCwgWTE7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZKCZyLCAmZywgJmIsICZZMCk7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZKCZyLCAmZywgJmIsICZZMSk7CisKKyAgICAgIC8vIENhc3QgdG8gOC1iaXQgYW5kIHN0b3JlLgorICAgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgcmdiICs9IDMpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSMjRUb1koY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgYmdyICs9IDMgKiAxNiAqIDIpIHsKKyAgICBfX20xMjhpIGJncl9wbGFuZVs2XTsKKyAgICBpbnQgajsKKworICAgIFJHQjI0UGFja2VkVG9QbGFuYXIoYmdyLCBiZ3JfcGxhbmUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraiwgaSArPSAxNikgeworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIF9fbTEyOGkgciwgZywgYiwgWTAsIFkxOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWSgmciwgJmcsICZiLCAmWTApOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWSgmciwgJmcsICZiLCAmWTEpOworCisgICAgICAvLyBDYXN0IHRvIDgtYml0IGFuZCBzdG9yZS4KKyAgICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICAgIH0KKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIGJnciArPSAzKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvWShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4xNTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMTYpIHsKKyAgICBfX20xMjhpIHIsIGcsIGIsIFkwLCBZMTsKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyKCZhcmdiW2kgKyAwXSwgJnIsICZnLCAmYik7CisgICAgQ29udmVydFJHQlRvWSgmciwgJmcsICZiLCAmWTApOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXIoJmFyZ2JbaSArIDhdLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9ZKCZyLCAmZywgJmIsICZZMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgY29uc3QgdWludDMyX3QgcCA9IGFyZ2JbaV07CisgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+ICAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICBZVVZfSEFMRik7CisgIH0KK30KKworLy8gSG9yaXpvbnRhbCBhZGQgKGRvdWJsZWQpIG9mIHR3byAxNmIgdmFsdWVzLCByZXN1bHQgaXMgMTZiLgorLy8gaW46IEEgfCBCIHwgQyB8IEQgfCAuLi4gLT4gb3V0OiAyKihBK0IpIHwgMiooQytEKSB8IC4uLgorc3RhdGljIHZvaWQgSG9yaXpvbnRhbEFkZFBhY2soY29uc3QgX19tMTI4aSogY29uc3QgQSwgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dCkgeworICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoMik7CisgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9tYWRkX2VwaTE2KCpBLCBrMik7CisgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tYWRkX2VwaTE2KCpCLCBrMik7CisgICpvdXQgPSBfbW1fcGFja3NfZXBpMzIoQywgRCk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9VVihjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogdSwgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHNyY193aWR0aCAmIH4zMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMzIsIHUgKz0gMTYsIHYgKz0gMTYpIHsKKyAgICBfX20xMjhpIHIwLCBnMCwgYjAsIHIxLCBnMSwgYjEsIFUwLCBWMCwgVTEsIFYxOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXIoJmFyZ2JbaSArICAwXSwgJnIwLCAmZzAsICZiMCk7CisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcigmYXJnYltpICsgIDhdLCAmcjEsICZnMSwgJmIxKTsKKyAgICBIb3Jpem9udGFsQWRkUGFjaygmcjAsICZyMSwgJnIwKTsKKyAgICBIb3Jpem9udGFsQWRkUGFjaygmZzAsICZnMSwgJmcwKTsKKyAgICBIb3Jpem9udGFsQWRkUGFjaygmYjAsICZiMSwgJmIwKTsKKyAgICBDb252ZXJ0UkdCVG9VVigmcjAsICZnMCwgJmIwLCAmVTAsICZWMCk7CisKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyKCZhcmdiW2kgKyAxNl0sICZyMCwgJmcwLCAmYjApOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXIoJmFyZ2JbaSArIDI0XSwgJnIxLCAmZzEsICZiMSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2soJnIwLCAmcjEsICZyMCk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2soJmcwLCAmZzEsICZnMCk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2soJmIwLCAmYjEsICZiMCk7CisgICAgQ29udmVydFJHQlRvVVYoJnIwLCAmZzAsICZiMCwgJlUxLCAmVjEpOworCisgICAgVTAgPSBfbW1fcGFja3VzX2VwaTE2KFUwLCBVMSk7CisgICAgVjAgPSBfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSk7CisgICAgaWYgKCFkb19zdG9yZSkgeworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3UgPSBMT0FEXzE2KHUpOworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3YgPSBMT0FEXzE2KHYpOworICAgICAgVTAgPSBfbW1fYXZnX2VwdTgoVTAsIHByZXZfdSk7CisgICAgICBWMCA9IF9tbV9hdmdfZXB1OChWMCwgcHJldl92KTsKKyAgICB9CisgICAgU1RPUkVfMTYoVTAsIHUpOworICAgIFNUT1JFXzE2KFYwLCB2KTsKKyAgfQorICBpZiAoaSA8IHNyY193aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGFyZ2IgKyBpLCB1LCB2LCBzcmNfd2lkdGggLSBpLCBkb19zdG9yZSk7CisgIH0KK30KKworLy8gQ29udmVydCAxNiBwYWNrZWQgQVJHQiAxNmItdmFsdWVzIHRvIHJbXSwgZ1tdLCBiW10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yihjb25zdCB1aW50MTZfdCogY29uc3QgcmdieCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgYikgeworICBjb25zdCBfX20xMjhpIGluMCA9IExPQURfMTYocmdieCArICAwKTsgIC8vIHIwIHwgZzAgfCBiMCB8eHwgcjEgfCBnMSB8IGIxIHx4CisgIGNvbnN0IF9fbTEyOGkgaW4xID0gTE9BRF8xNihyZ2J4ICsgIDgpOyAgLy8gcjIgfCBnMiB8IGIyIHx4fCByMyB8IGczIHwgYjMgfHgKKyAgY29uc3QgX19tMTI4aSBpbjIgPSBMT0FEXzE2KHJnYnggKyAxNik7ICAvLyByNCB8IC4uLgorICBjb25zdCBfX20xMjhpIGluMyA9IExPQURfMTYocmdieCArIDI0KTsgIC8vIHI2IHwgLi4uCisgIC8vIGNvbHVtbi13aXNlIHRyYW5zcG9zZQorICBjb25zdCBfX20xMjhpIEEwID0gX21tX3VucGFja2xvX2VwaTE2KGluMCwgaW4xKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2toaV9lcGkxNihpbjAsIGluMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fdW5wYWNrbG9fZXBpMTYoaW4yLCBpbjMpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3VucGFja2hpX2VwaTE2KGluMiwgaW4zKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGkxNihBMCwgQTEpOyAgLy8gcjAgcjEgcjIgcjMgfCBnMCBnMSAuLgorICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2hpX2VwaTE2KEEwLCBBMSk7ICAvLyBiMCBiMSBiMiBiMyB8IHggeCB4IHgKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV91bnBhY2tsb19lcGkxNihBMiwgQTMpOyAgLy8gcjQgcjUgcjYgcjcgfCBnNCBnNSAuLgorICBjb25zdCBfX20xMjhpIEIzID0gX21tX3VucGFja2hpX2VwaTE2KEEyLCBBMyk7ICAvLyBiNCBiNSBiNiBiNyB8IHggeCB4IHgKKyAgKnIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjAsIEIyKTsKKyAgKmcgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjAsIEIyKTsKKyAgKmIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQjEsIEIzKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydFJHQkEzMlRvVVYoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MTU7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBsYXN0X3JnYiA9IHJnYiArIDQgKiBtYXhfd2lkdGg7CisgIHdoaWxlIChyZ2IgPCBsYXN0X3JnYikgeworICAgIF9fbTEyOGkgciwgZywgYiwgVTAsIFYwLCBVMSwgVjE7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiKHJnYiArICAwLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVigmciwgJmcsICZiLCAmVTAsICZWMCk7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiKHJnYiArIDMyLCAmciwgJmcsICZiKTsKKyAgICBDb252ZXJ0UkdCVG9VVigmciwgJmcsICZiLCAmVTEsICZWMSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihVMCwgVTEpLCB1KTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSksIHYpOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgICByZ2IgKz0gMiAqIDMyOworICB9CisgIGlmIChtYXhfd2lkdGggPCB3aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRSR0JBMzJUb1VWX0MocmdiLCB1LCB2LCB3aWR0aCAtIG1heF93aWR0aCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIodm9pZCkgeworICBXZWJQQ29udmVydEFSR0JUb1kgPSBDb252ZXJ0QVJHQlRvWTsKKyAgV2ViUENvbnZlcnRBUkdCVG9VViA9IENvbnZlcnRBUkdCVG9VVjsKKworICBXZWJQQ29udmVydFJHQjI0VG9ZID0gQ29udmVydFJHQjI0VG9ZOworICBXZWJQQ29udmVydEJHUjI0VG9ZID0gQ29udmVydEJHUjI0VG9ZOworCisgIFdlYlBDb252ZXJ0UkdCQTMyVG9VViA9IENvbnZlcnRSR0JBMzJUb1VWOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0U2FtcGxlcnNTU0UyKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2FscGhhLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYWxwaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTI3ZjRhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2FscGhhLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYS1wbGFuZSBjb21wcmVzc2lvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9maWx0ZXJzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kZXMgdGhlIGdpdmVuIGFscGhhIGRhdGEgdmlhIHNwZWNpZmllZCBjb21wcmVzc2lvbiBtZXRob2QgJ21ldGhvZCcuCisvLyBUaGUgcHJlLXByb2Nlc3NpbmcgKHF1YW50aXphdGlvbikgaXMgcGVyZm9ybWVkIGlmICdxdWFsaXR5JyBpcyBsZXNzIHRoYW4gMTAwLgorLy8gRm9yIHN1Y2ggY2FzZXMsIHRoZSBlbmNvZGluZyBpcyBsb3NzeS4gVGhlIHZhbGlkIHJhbmdlIGlzIFswLCAxMDBdIGZvcgorLy8gJ3F1YWxpdHknIGFuZCBbMCwgMV0gZm9yICdtZXRob2QnOgorLy8gICAnbWV0aG9kID0gMCcgLSBObyBjb21wcmVzc2lvbjsKKy8vICAgJ21ldGhvZCA9IDEnIC0gVXNlIGxvc3NsZXNzIGNvZGVyIG9uIHRoZSBhbHBoYSBwbGFuZSBvbmx5CisvLyAnZmlsdGVyJyB2YWx1ZXMgWzAsIDRdIGNvcnJlc3BvbmQgdG8gcHJlZGljdGlvbiBtb2RlcyBub25lLCBob3Jpem9udGFsLAorLy8gdmVydGljYWwgJiBncmFkaWVudCBmaWx0ZXJzLiBUaGUgcHJlZGljdGlvbiBtb2RlIDQgd2lsbCB0cnkgYWxsIHRoZQorLy8gcHJlZGljdGlvbiBtb2RlcyAwIHRvIDMgYW5kIHBpY2sgdGhlIGJlc3Qgb25lLgorLy8gJ2VmZm9ydF9sZXZlbCc6IHNwZWNpZmllcyBob3cgbXVjaCBlZmZvcnQgbXVzdCBiZSBzcGVudCB0byB0cnkgYW5kIHJlZHVjZQorLy8gIHRoZSBjb21wcmVzc2VkIG91dHB1dCBzaXplLiBJbiByYW5nZSAwIChxdWljaykgdG8gNiAoc2xvdykuCisvLworLy8gJ291dHB1dCcgY29ycmVzcG9uZHMgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIGNvbXByZXNzZWQgYWxwaGEgZGF0YS4KKy8vICAgICAgICAgIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZCBhbmQgY2FsbGVyIHNob3VsZCBjYWxsCisvLyAgICAgICAgICBXZWJQU2FmZUZyZWUoKm91dHB1dCkgd2hlbiBkb25lLgorLy8gJ291dHB1dF9zaXplJyBjb3JyZXNwb25kcyB0byBzaXplIG9mIHRoaXMgY29tcHJlc3NlZCBhbHBoYSBidWZmZXIuCisvLworLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3NmdWxseSBlbmNvZGluZyB0aGUgYWxwaGEgYW5kCisvLyAgICAgICAgIDAgaWYgZWl0aGVyOgorLy8gICAgICAgICAgIGludmFsaWQgcXVhbGl0eSBvciBtZXRob2QsIG9yCisvLyAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgZmFpbHMuCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhsaS5oIgorCitzdGF0aWMgaW50IEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwgIC8vIGluIFswLi42XSByYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgb2sgPSAwOworICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgV2ViUFBpY3R1cmUgcGljdHVyZTsKKworICBXZWJQUGljdHVyZUluaXQoJnBpY3R1cmUpOworICBwaWN0dXJlLndpZHRoID0gd2lkdGg7CisgIHBpY3R1cmUuaGVpZ2h0ID0gaGVpZ2h0OworICBwaWN0dXJlLnVzZV9hcmdiID0gMTsKKyAgcGljdHVyZS5zdGF0cyA9IHN0YXRzOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJnBpY3R1cmUpKSByZXR1cm4gMDsKKworICAvLyBUcmFuc2ZlciB0aGUgYWxwaGEgdmFsdWVzIHRvIHRoZSBncmVlbiBjaGFubmVsLgorICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4oZGF0YSwgd2lkdGgsIHBpY3R1cmUud2lkdGgsIHBpY3R1cmUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS5hcmdiLCBwaWN0dXJlLmFyZ2Jfc3RyaWRlKTsKKworICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKyAgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgLy8gRW5hYmxlIGV4YWN0LCBvciBpdCB3b3VsZCBhbHRlciBSR0IgdmFsdWVzIG9mIHRyYW5zcGFyZW50IGFscGhhLCB3aGljaCBpcworICAvLyBub3JtYWxseSBPSyBidXQgbm90IGhlcmUgc2luY2Ugd2UgYXJlIG5vdCBlbmNvZGluZyB0aGUgaW5wdXQgaW1hZ2UgYnV0ICBhbgorICAvLyBpbnRlcm5hbCBlbmNvZGluZy1yZWxhdGVkIGltYWdlIGNvbnRhaW5pbmcgbmVjZXNzYXJ5IGV4YWN0IGluZm9ybWF0aW9uIGluCisgIC8vIFJHQiBjaGFubmVscy4KKyAgY29uZmlnLmV4YWN0ID0gMTsKKyAgY29uZmlnLm1ldGhvZCA9IGVmZm9ydF9sZXZlbDsgIC8vIGltcGFjdCBpcyB2ZXJ5IHNtYWxsCisgIC8vIFNldCBhIGxvdyBkZWZhdWx0IHF1YWxpdHkgZm9yIGVuY29kaW5nIGFscGhhLiBFbnN1cmUgdGhhdCBBbHBoYSBxdWFsaXR5IGF0CisgIC8vIGxvd2VyIG1ldGhvZHMgKDMgYW5kIGJlbG93KSBpcyBsZXNzIHRoYW4gdGhlIHRocmVzaG9sZCBmb3IgdHJpZ2dlcmluZworICAvLyBjb3N0bHkgJ0JhY2t3YXJkUmVmZXJlbmNlc1RyYWNlQmFja3dhcmRzJy4KKyAgY29uZmlnLnF1YWxpdHkgPSA4LmYgKiBlZmZvcnRfbGV2ZWw7CisgIGFzc2VydChjb25maWcucXVhbGl0eSA+PSAwICYmIGNvbmZpZy5xdWFsaXR5IDw9IDEwMC5mKTsKKworICAvLyBUT0RPKHVydmFuZyk6IFRlbXBvcmFyeSBmaXggdG8gYXZvaWQgZ2VuZXJhdGluZyBpbWFnZXMgdGhhdCB0cmlnZ2VyCisgIC8vIGEgZGVjb2RlciBidWcgcmVsYXRlZCB0byBhbHBoYSB3aXRoIGNvbG9yIGNhY2hlLgorICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VicC9pc3N1ZXMvZGV0YWlsP2lkPTIzOQorICAvLyBOZWVkIHRvIHJlLWVuYWJsZSB0aGlzIGxhdGVyLgorICBvayA9IChWUDhMRW5jb2RlU3RyZWFtKCZjb25maWcsICZwaWN0dXJlLCBidywgMCAvKnVzZV9jYWNoZSovKSA9PSBWUDhfRU5DX09LKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWN0dXJlKTsKKyAgb2sgPSBvayAmJiAhYnctPmVycm9yXzsKKyAgaWYgKCFvaykgeworICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KGJ3KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU21hbGwgc3RydWN0IHRvIGhvbGQgdGhlIHJlc3VsdCBvZiBhIGZpbHRlciBtb2RlIGNvbXByZXNzaW9uIGF0dGVtcHQuCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBzY29yZTsKKyAgVlA4Qml0V3JpdGVyIGJ3OworICBXZWJQQXV4U3RhdHMgc3RhdHM7Cit9IEZpbHRlclRyaWFsOworCisvLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGluaXRpYWxpemVkICdidycgb2JqZWN0LCBldmVuIHVwb24gZXJyb3IuCitzdGF0aWMgaW50IEVuY29kZUFscGhhSW50ZXJuYWwoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGludCBmaWx0ZXIsIGludCByZWR1Y2VfbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyVHJpYWwqIHJlc3VsdCkgeworICBpbnQgb2sgPSAwOworICBjb25zdCB1aW50OF90KiBhbHBoYV9zcmM7CisgIFdlYlBGaWx0ZXJGdW5jIGZpbHRlcl9mdW5jOworICB1aW50OF90IGhlYWRlcjsKKyAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICBjb25zdCB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBzaXplX3Qgb3V0cHV0X3NpemUgPSAwOworICBWUDhMQml0V3JpdGVyIHRtcF9idzsKKworICBhc3NlcnQoKHVpbnQ2NF90KWRhdGFfc2l6ZSA9PSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpOyAgLy8gYXMgcGVyIHNwZWMKKyAgYXNzZXJ0KGZpbHRlciA+PSAwICYmIGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1QpOworICBhc3NlcnQobWV0aG9kID49IEFMUEhBX05PX0NPTVBSRVNTSU9OKTsKKyAgYXNzZXJ0KG1ldGhvZCA8PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTik7CisgIGFzc2VydChzaXplb2YoaGVhZGVyKSA9PSBBTFBIQV9IRUFERVJfTEVOKTsKKworICBmaWx0ZXJfZnVuYyA9IFdlYlBGaWx0ZXJzW2ZpbHRlcl07CisgIGlmIChmaWx0ZXJfZnVuYyAhPSBOVUxMKSB7CisgICAgZmlsdGVyX2Z1bmMoZGF0YSwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHRtcF9hbHBoYSk7CisgICAgYWxwaGFfc3JjID0gdG1wX2FscGhhOworICB9ICBlbHNlIHsKKyAgICBhbHBoYV9zcmMgPSBkYXRhOworICB9CisKKyAgaWYgKG1ldGhvZCAhPSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIG9rID0gVlA4TEJpdFdyaXRlckluaXQoJnRtcF9idywgZGF0YV9zaXplID4+IDMpOworICAgIG9rID0gb2sgJiYgRW5jb2RlTG9zc2xlc3MoYWxwaGFfc3JjLCB3aWR0aCwgaGVpZ2h0LCBlZmZvcnRfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wX2J3LCAmcmVzdWx0LT5zdGF0cyk7CisgICAgaWYgKG9rKSB7CisgICAgICBvdXRwdXQgPSBWUDhMQml0V3JpdGVyRmluaXNoKCZ0bXBfYncpOworICAgICAgb3V0cHV0X3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJnRtcF9idyk7CisgICAgICBpZiAob3V0cHV0X3NpemUgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgLy8gY29tcHJlc3NlZCBzaXplIGlzIGxhcmdlciB0aGFuIHNvdXJjZSEgUmV2ZXJ0IHRvIHVuY29tcHJlc3NlZCBtb2RlLgorICAgICAgICBtZXRob2QgPSBBTFBIQV9OT19DT01QUkVTU0lPTjsKKyAgICAgICAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIG91dHB1dCA9IGFscGhhX3NyYzsKKyAgICBvdXRwdXRfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICBvayA9IDE7CisgIH0KKworICAvLyBFbWl0IGZpbmFsIHJlc3VsdC4KKyAgaGVhZGVyID0gbWV0aG9kIHwgKGZpbHRlciA8PCAyKTsKKyAgaWYgKHJlZHVjZV9sZXZlbHMpIGhlYWRlciB8PSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIDw8IDQ7CisKKyAgVlA4Qml0V3JpdGVySW5pdCgmcmVzdWx0LT5idywgQUxQSEFfSEVBREVSX0xFTiArIG91dHB1dF9zaXplKTsKKyAgb2sgPSBvayAmJiBWUDhCaXRXcml0ZXJBcHBlbmQoJnJlc3VsdC0+YncsICZoZWFkZXIsIEFMUEhBX0hFQURFUl9MRU4pOworICBvayA9IG9rICYmIFZQOEJpdFdyaXRlckFwcGVuZCgmcmVzdWx0LT5idywgb3V0cHV0LCBvdXRwdXRfc2l6ZSk7CisKKyAgaWYgKG1ldGhvZCAhPSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOworICB9CisgIG9rID0gb2sgJiYgIXJlc3VsdC0+YncuZXJyb3JfOworICByZXN1bHQtPnNjb3JlID0gVlA4Qml0V3JpdGVyU2l6ZSgmcmVzdWx0LT5idyk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBHZXROdW1Db2xvcnMoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBpbnQgajsKKyAgaW50IGNvbG9ycyA9IDA7CisgIHVpbnQ4X3QgY29sb3JbMjU2XSA9IHsgMCB9OworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGludCBpOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBkYXRhICsgaiAqIHN0cmlkZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29sb3JbcFtpXV0gPSAxOworICAgIH0KKyAgfQorICBmb3IgKGogPSAwOyBqIDwgMjU2OyArK2opIHsKKyAgICBpZiAoY29sb3Jbal0gPiAwKSArK2NvbG9yczsKKyAgfQorICByZXR1cm4gY29sb3JzOworfQorCisjZGVmaW5lIEZJTFRFUl9UUllfTk9ORSAoMSA8PCBXRUJQX0ZJTFRFUl9OT05FKQorI2RlZmluZSBGSUxURVJfVFJZX0FMTCAoKDEgPDwgV0VCUF9GSUxURVJfTEFTVCkgLSAxKQorCisvLyBHaXZlbiB0aGUgaW5wdXQgJ2ZpbHRlcicgb3B0aW9uLCByZXR1cm4gYW4gT1InZCBiaXQtc2V0IG9mIGZpbHRlcnMgdG8gdHJ5Lgorc3RhdGljIHVpbnQzMl90IEdldEZpbHRlck1hcChjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyLCBpbnQgZWZmb3J0X2xldmVsKSB7CisgIHVpbnQzMl90IGJpdF9tYXAgPSAwVTsKKyAgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9GQVNUKSB7CisgICAgLy8gUXVpY2sgZXN0aW1hdGUgb2YgdGhlIGJlc3QgY2FuZGlkYXRlLgorICAgIGludCB0cnlfZmlsdGVyX25vbmUgPSAoZWZmb3J0X2xldmVsID4gMyk7CisgICAgY29uc3QgaW50IGtNaW5Db2xvcnNGb3JGaWx0ZXJOb25lID0gMTY7CisgICAgY29uc3QgaW50IGtNYXhDb2xvcnNGb3JGaWx0ZXJOb25lID0gMTkyOworICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gR2V0TnVtQ29sb3JzKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7CisgICAgLy8gRm9yIGxvdyBudW1iZXIgb2YgY29sb3JzLCBOT05FIHlpZWxkcyBiZXR0ZXIgY29tcHJlc3Npb24uCisgICAgZmlsdGVyID0gKG51bV9jb2xvcnMgPD0ga01pbkNvbG9yc0ZvckZpbHRlck5vbmUpCisgICAgICAgID8gV0VCUF9GSUxURVJfTk9ORQorICAgICAgICA6IFdlYlBFc3RpbWF0ZUJlc3RGaWx0ZXIoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKKyAgICBiaXRfbWFwIHw9IDEgPDwgZmlsdGVyOworICAgIC8vIEZvciBsYXJnZSBudW1iZXIgb2YgY29sb3JzLCB0cnkgRklMVEVSX05PTkUgaW4gYWRkaXRpb24gdG8gdGhlIGJlc3QKKyAgICAvLyBmaWx0ZXIgYXMgd2VsbC4KKyAgICBpZiAodHJ5X2ZpbHRlcl9ub25lIHx8IG51bV9jb2xvcnMgPiBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSkgeworICAgICAgYml0X21hcCB8PSBGSUxURVJfVFJZX05PTkU7CisgICAgfQorICB9IGVsc2UgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9OT05FKSB7CisgICAgYml0X21hcCA9IEZJTFRFUl9UUllfTk9ORTsKKyAgfSBlbHNlIHsgIC8vIFdFQlBfRklMVEVSX0JFU1QgLT4gdHJ5IGFsbAorICAgIGJpdF9tYXAgPSBGSUxURVJfVFJZX0FMTDsKKyAgfQorICByZXR1cm4gYml0X21hcDsKK30KKworc3RhdGljIHZvaWQgSW5pdEZpbHRlclRyaWFsKEZpbHRlclRyaWFsKiBjb25zdCBzY29yZSkgeworICBzY29yZS0+c2NvcmUgPSAoc2l6ZV90KX4wVTsKKyAgVlA4Qml0V3JpdGVySW5pdCgmc2NvcmUtPmJ3LCAwKTsKK30KKworc3RhdGljIGludCBBcHBseUZpbHRlcnNBbmRFbmNvZGUoY29uc3QgdWludDhfdCogYWxwaGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGludCBtZXRob2QsIGludCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVkdWNlX2xldmVscywgaW50IGVmZm9ydF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IG91dHB1dF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgb2sgPSAxOworICBGaWx0ZXJUcmlhbCBiZXN0OworICB1aW50MzJfdCB0cnlfbWFwID0KKyAgICAgIEdldEZpbHRlck1hcChhbHBoYSwgd2lkdGgsIGhlaWdodCwgZmlsdGVyLCBlZmZvcnRfbGV2ZWwpOworICBJbml0RmlsdGVyVHJpYWwoJmJlc3QpOworCisgIGlmICh0cnlfbWFwICE9IEZJTFRFUl9UUllfTk9ORSkgeworICAgIHVpbnQ4X3QqIGZpbHRlcmVkX2FscGhhID0gICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBkYXRhX3NpemUpOworICAgIGlmIChmaWx0ZXJlZF9hbHBoYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIGZvciAoZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsgb2sgJiYgdHJ5X21hcDsgKytmaWx0ZXIsIHRyeV9tYXAgPj49IDEpIHsKKyAgICAgIGlmICh0cnlfbWFwICYgMSkgeworICAgICAgICBGaWx0ZXJUcmlhbCB0cmlhbDsKKyAgICAgICAgb2sgPSBFbmNvZGVBbHBoYUludGVybmFsKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCBtZXRob2QsIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZV9sZXZlbHMsIGVmZm9ydF9sZXZlbCwgZmlsdGVyZWRfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJpYWwpOworICAgICAgICBpZiAob2sgJiYgdHJpYWwuc2NvcmUgPCBiZXN0LnNjb3JlKSB7CisgICAgICAgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmYmVzdC5idyk7CisgICAgICAgICAgYmVzdCA9IHRyaWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJnRyaWFsLmJ3KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBXZWJQU2FmZUZyZWUoZmlsdGVyZWRfYWxwaGEpOworICB9IGVsc2UgeworICAgIG9rID0gRW5jb2RlQWxwaGFJbnRlcm5hbChhbHBoYSwgd2lkdGgsIGhlaWdodCwgbWV0aG9kLCBXRUJQX0ZJTFRFUl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VfbGV2ZWxzLCBlZmZvcnRfbGV2ZWwsIE5VTEwsICZiZXN0KTsKKyAgfQorICBpZiAob2spIHsKKyAgICBpZiAoc3RhdHMgIT0gTlVMTCkgeworICAgICAgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzID0gYmVzdC5zdGF0cy5sb3NzbGVzc19mZWF0dXJlczsKKyAgICAgIHN0YXRzLT5oaXN0b2dyYW1fYml0cyA9IGJlc3Quc3RhdHMuaGlzdG9ncmFtX2JpdHM7CisgICAgICBzdGF0cy0+dHJhbnNmb3JtX2JpdHMgPSBiZXN0LnN0YXRzLnRyYW5zZm9ybV9iaXRzOworICAgICAgc3RhdHMtPmNhY2hlX2JpdHMgPSBiZXN0LnN0YXRzLmNhY2hlX2JpdHM7CisgICAgICBzdGF0cy0+cGFsZXR0ZV9zaXplID0gYmVzdC5zdGF0cy5wYWxldHRlX3NpemU7CisgICAgICBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IGJlc3Quc3RhdHMubG9zc2xlc3Nfc2l6ZTsKKyAgICAgIHN0YXRzLT5sb3NzbGVzc19oZHJfc2l6ZSA9IGJlc3Quc3RhdHMubG9zc2xlc3NfaGRyX3NpemU7CisgICAgICBzdGF0cy0+bG9zc2xlc3NfZGF0YV9zaXplID0gYmVzdC5zdGF0cy5sb3NzbGVzc19kYXRhX3NpemU7CisgICAgfQorICAgICpvdXRwdXRfc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoJmJlc3QuYncpOworICAgICpvdXRwdXQgPSBWUDhCaXRXcml0ZXJCdWYoJmJlc3QuYncpOworICB9IGVsc2UgeworICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJlc3QuYncpOworICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBFbmNvZGVBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbWV0aG9kLCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogY29uc3Qgb3V0cHV0LCBzaXplX3QqIGNvbnN0IG91dHB1dF9zaXplKSB7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKworICB1aW50OF90KiBxdWFudF9hbHBoYSA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgdWludDY0X3Qgc3NlID0gMDsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgaW50IHJlZHVjZV9sZXZlbHMgPSAocXVhbGl0eSA8IDEwMCk7CisKKyAgLy8gcXVpY2sgc2FuaXR5IGNoZWNrcworICBhc3NlcnQoKHVpbnQ2NF90KWRhdGFfc2l6ZSA9PSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpOyAgLy8gYXMgcGVyIHNwZWMKKyAgYXNzZXJ0KGVuYyAhPSBOVUxMICYmIHBpYyAhPSBOVUxMICYmIHBpYy0+YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KG91dHB1dCAhPSBOVUxMICYmIG91dHB1dF9zaXplICE9IE5VTEwpOworICBhc3NlcnQod2lkdGggPiAwICYmIGhlaWdodCA+IDApOworICBhc3NlcnQocGljLT5hX3N0cmlkZSA+PSB3aWR0aCk7CisgIGFzc2VydChmaWx0ZXIgPj0gV0VCUF9GSUxURVJfTk9ORSAmJiBmaWx0ZXIgPD0gV0VCUF9GSUxURVJfRkFTVCk7CisKKyAgaWYgKHF1YWxpdHkgPCAwIHx8IHF1YWxpdHkgPiAxMDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChtZXRob2QgPCBBTFBIQV9OT19DT01QUkVTU0lPTiB8fCBtZXRob2QgPiBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTikgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIC8vIERvbid0IGZpbHRlciwgYXMgZmlsdGVyaW5nIHdpbGwgbWFrZSBubyBpbXBhY3Qgb24gY29tcHJlc3NlZCBzaXplLgorICAgIGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7CisgIH0KKworICBxdWFudF9hbHBoYSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBkYXRhX3NpemUpOworICBpZiAocXVhbnRfYWxwaGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRXh0cmFjdCBhbHBoYSBkYXRhICh3aWR0aCB4IGhlaWdodCkgZnJvbSByYXdfZGF0YSAoc3RyaWRlIHggaGVpZ2h0KS4KKyAgV2ViUENvcHlQbGFuZShwaWMtPmEsIHBpYy0+YV9zdHJpZGUsIHF1YW50X2FscGhhLCB3aWR0aCwgd2lkdGgsIGhlaWdodCk7CisKKyAgaWYgKHJlZHVjZV9sZXZlbHMpIHsgIC8vIE5vIFF1YW50aXphdGlvbiByZXF1aXJlZCBmb3IgJ3F1YWxpdHkgPSAxMDAnLgorICAgIC8vIDE2IGFscGhhIGxldmVscyBnaXZlcyBxdWl0ZSBhIGxvdyBNU0Ugdy5yLnQgb3JpZ2luYWwgYWxwaGEgcGxhbmUgaGVuY2UKKyAgICAvLyBtYXBwZWQgdG8gbW9kZXJhdGUgcXVhbGl0eSA3MC4gSGVuY2UgUXVhbGl0eTpbMCwgNzBdIC0+IExldmVsczpbMiwgMTZdCisgICAgLy8gYW5kIFF1YWxpdHk6XTcwLCAxMDBdIC0+IExldmVsczpdMTYsIDI1Nl0uCisgICAgY29uc3QgaW50IGFscGhhX2xldmVscyA9IChxdWFsaXR5IDw9IDcwKSA/ICgyICsgcXVhbGl0eSAvIDUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgxNiArIChxdWFsaXR5IC0gNzApICogOCk7CisgICAgb2sgPSBRdWFudGl6ZUxldmVscyhxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwgYWxwaGFfbGV2ZWxzLCAmc3NlKTsKKyAgfQorCisgIGlmIChvaykgeworICAgIFZQOEZpbHRlcnNJbml0KCk7CisgICAgb2sgPSBBcHBseUZpbHRlcnNBbmRFbmNvZGUocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIGRhdGFfc2l6ZSwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgcmVkdWNlX2xldmVscywgZWZmb3J0X2xldmVsLCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NpemUsIHBpYy0+c3RhdHMpOworICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsgIC8vIG5lZWQgc3RhdHM/CisgICAgICBwaWMtPnN0YXRzLT5jb2RlZF9zaXplICs9IChpbnQpKCpvdXRwdXRfc2l6ZSk7CisgICAgICBlbmMtPnNzZV9bM10gPSBzc2U7CisgICAgfQorICB9CisKKyAgV2ViUFNhZmVGcmVlKHF1YW50X2FscGhhKTsKKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxscworCitzdGF0aWMgaW50IENvbXByZXNzQWxwaGFKb2IoVlA4RW5jb2RlciogY29uc3QgZW5jLCB2b2lkKiBkdW1teSkgeworICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWcgPSBlbmMtPmNvbmZpZ187CisgIHVpbnQ4X3QqIGFscGhhX2RhdGEgPSBOVUxMOworICBzaXplX3QgYWxwaGFfc2l6ZSA9IDA7CisgIGNvbnN0IGludCBlZmZvcnRfbGV2ZWwgPSBjb25maWctPm1ldGhvZDsgIC8vIG1hcHMgdG8gWzAuLjZdCisgIGNvbnN0IFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyID0KKyAgICAgIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA9PSAwKSA/IFdFQlBfRklMVEVSX05PTkUgOgorICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDEpID8gV0VCUF9GSUxURVJfRkFTVCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0ZJTFRFUl9CRVNUOworICBpZiAoIUVuY29kZUFscGhhKGVuYywgY29uZmlnLT5hbHBoYV9xdWFsaXR5LCBjb25maWctPmFscGhhX2NvbXByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGZpbHRlciwgZWZmb3J0X2xldmVsLCAmYWxwaGFfZGF0YSwgJmFscGhhX3NpemUpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGFscGhhX3NpemUgIT0gKHVpbnQzMl90KWFscGhhX3NpemUpIHsgIC8vIFNhbml0eSBjaGVjay4KKyAgICBXZWJQU2FmZUZyZWUoYWxwaGFfZGF0YSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gKHVpbnQzMl90KWFscGhhX3NpemU7CisgIGVuYy0+YWxwaGFfZGF0YV8gPSBhbHBoYV9kYXRhOworICAodm9pZClkdW1teTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4RW5jSW5pdEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICBlbmMtPmhhc19hbHBoYV8gPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShlbmMtPnBpY18pOworICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKKyAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOworICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+SW5pdCh3b3JrZXIpOworICAgIHdvcmtlci0+ZGF0YTEgPSBlbmM7CisgICAgd29ya2VyLT5kYXRhMiA9IE5VTEw7CisgICAgd29ya2VyLT5ob29rID0gKFdlYlBXb3JrZXJIb29rKUNvbXByZXNzQWxwaGFKb2I7CisgIH0KK30KKworaW50IFZQOEVuY1N0YXJ0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKKyAgICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKKyAgICAgIC8vIE1ha2VzIHN1cmUgd29ya2VyIGlzIGdvb2QgdG8gZ28uCisgICAgICBpZiAoIVdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+UmVzZXQod29ya2VyKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+TGF1bmNoKHdvcmtlcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIENvbXByZXNzQWxwaGFKb2IoZW5jLCBOVUxMKTsgICAvLyBqdXN0IGRvIHRoZSBqb2IgcmlnaHQgYXdheQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFZQOEVuY0ZpbmlzaEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7CisgICAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgICBpZiAoIVdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+U3luYyh3b3JrZXIpKSByZXR1cm4gMDsgIC8vIGVycm9yCisgICAgfQorICB9CisgIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKK30KKworaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgb2sgPSAxOworICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgLy8gZmluaXNoIGFueXRoaW5nIGxlZnQgaW4gZmxpZ2h0CisgICAgb2sgPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMod29ya2VyKTsKKyAgICAvLyBzdGlsbCBuZWVkIHRvIGVuZCB0aGUgd29ya2VyLCBldmVuIGlmICFvaworICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RW5kKHdvcmtlcik7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGVuYy0+YWxwaGFfZGF0YV8pOworICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKKyAgZW5jLT5oYXNfYWxwaGFfID0gMDsKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2FuYWx5c2lzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYW5hbHlzaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjgwMmZmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2FuYWx5c2lzLmMKQEAgLTAsMCArMSw1MDEgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNYWNyb2Jsb2NrIGFuYWx5c2lzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgTUFYX0lURVJTX0tfTUVBTlMgIDYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNtb290aCB0aGUgc2VnbWVudCBtYXAgYnkgcmVwbGFjaW5nIGlzb2xhdGVkIGJsb2NrIGJ5IHRoZSBtYWpvcml0eSBvZiBpdHMKKy8vIG5laWdoYm91cnMuCisKK3N0YXRpYyB2b2lkIFNtb290aFNlZ21lbnRNYXAoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBuLCB4LCB5OworICBjb25zdCBpbnQgdyA9IGVuYy0+bWJfd187CisgIGNvbnN0IGludCBoID0gZW5jLT5tYl9oXzsKKyAgY29uc3QgaW50IG1ham9yaXR5X2NudF8zX3hfM19ncmlkID0gNTsKKyAgdWludDhfdCogY29uc3QgdG1wID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHcgKiBoLCBzaXplb2YoKnRtcCkpOworICBhc3NlcnQoKHVpbnQ2NF90KSh3ICogaCkgPT0gKHVpbnQ2NF90KXcgKiBoKTsgICAvLyBubyBvdmVyZmxvdywgYXMgcGVyIHNwZWMKKworICBpZiAodG1wID09IE5VTEwpIHJldHVybjsKKyAgZm9yICh5ID0gMTsgeSA8IGggLSAxOyArK3kpIHsKKyAgICBmb3IgKHggPSAxOyB4IDwgdyAtIDE7ICsreCkgeworICAgICAgaW50IGNudFtOVU1fTUJfU0VHTUVOVFNdID0geyAwIH07CisgICAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19beCArIHcgKiB5XTsKKyAgICAgIGludCBtYWpvcml0eV9zZWcgPSBtYi0+c2VnbWVudF87CisgICAgICAvLyBDaGVjayB0aGUgOCBuZWlnaGJvdXJpbmcgc2VnbWVudCB2YWx1ZXMuCisgICAgICBjbnRbbWJbLXcgLSAxXS5zZWdtZW50X10rKzsgIC8vIHRvcC1sZWZ0CisgICAgICBjbnRbbWJbLXcgKyAwXS5zZWdtZW50X10rKzsgIC8vIHRvcAorICAgICAgY250W21iWy13ICsgMV0uc2VnbWVudF9dKys7ICAvLyB0b3AtcmlnaHQKKyAgICAgIGNudFttYlsgICAtIDFdLnNlZ21lbnRfXSsrOyAgLy8gbGVmdAorICAgICAgY250W21iWyAgICsgMV0uc2VnbWVudF9dKys7ICAvLyByaWdodAorICAgICAgY250W21iWyB3IC0gMV0uc2VnbWVudF9dKys7ICAvLyBib3R0b20tbGVmdAorICAgICAgY250W21iWyB3ICsgMF0uc2VnbWVudF9dKys7ICAvLyBib3R0b20KKyAgICAgIGNudFttYlsgdyArIDFdLnNlZ21lbnRfXSsrOyAgLy8gYm90dG9tLXJpZ2h0CisgICAgICBmb3IgKG4gPSAwOyBuIDwgTlVNX01CX1NFR01FTlRTOyArK24pIHsKKyAgICAgICAgaWYgKGNudFtuXSA+PSBtYWpvcml0eV9jbnRfM194XzNfZ3JpZCkgeworICAgICAgICAgIG1ham9yaXR5X3NlZyA9IG47CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRtcFt4ICsgeSAqIHddID0gbWFqb3JpdHlfc2VnOworICAgIH0KKyAgfQorICBmb3IgKHkgPSAxOyB5IDwgaCAtIDE7ICsreSkgeworICAgIGZvciAoeCA9IDE7IHggPCB3IC0gMTsgKyt4KSB7CisgICAgICBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19beCArIHcgKiB5XTsKKyAgICAgIG1iLT5zZWdtZW50XyA9IHRtcFt4ICsgeSAqIHddOworICAgIH0KKyAgfQorICBXZWJQU2FmZUZyZWUodG1wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNldCBzZWdtZW50IHN1c2NlcHRpYmlsaXR5IGFscGhhXyAvIGJldGFfCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IG0sIGludCBNKSB7CisgIHJldHVybiAodiA8IG0pID8gbSA6ICh2ID4gTSkgPyBNIDogdjsKK30KKworc3RhdGljIHZvaWQgU2V0U2VnbWVudEFscGhhcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjZW50ZXJzW05VTV9NQl9TRUdNRU5UU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaWQpIHsKKyAgY29uc3QgaW50IG5iID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgaW50IG1pbiA9IGNlbnRlcnNbMF0sIG1heCA9IGNlbnRlcnNbMF07CisgIGludCBuOworCisgIGlmIChuYiA+IDEpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgeworICAgICAgaWYgKG1pbiA+IGNlbnRlcnNbbl0pIG1pbiA9IGNlbnRlcnNbbl07CisgICAgICBpZiAobWF4IDwgY2VudGVyc1tuXSkgbWF4ID0gY2VudGVyc1tuXTsKKyAgICB9CisgIH0KKyAgaWYgKG1heCA9PSBtaW4pIG1heCA9IG1pbiArIDE7CisgIGFzc2VydChtaWQgPD0gbWF4ICYmIG1pZCA+PSBtaW4pOworICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgeworICAgIGNvbnN0IGludCBhbHBoYSA9IDI1NSAqIChjZW50ZXJzW25dIC0gbWlkKSAvIChtYXggLSBtaW4pOworICAgIGNvbnN0IGludCBiZXRhID0gMjU1ICogKGNlbnRlcnNbbl0gLSBtaW4pIC8gKG1heCAtIG1pbik7CisgICAgZW5jLT5kcW1fW25dLmFscGhhXyA9IGNsaXAoYWxwaGEsIC0xMjcsIDEyNyk7CisgICAgZW5jLT5kcW1fW25dLmJldGFfID0gY2xpcChiZXRhLCAwLCAyNTUpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgorLy8gdGhlIGhpZ2hlciwgdGhlICJlYXNpZXIiIHRoZSBtYWNyb2Jsb2NrIGlzIHRvIGNvbXByZXNzLgorCisjZGVmaW5lIE1BWF9BTFBIQSAyNTUgICAgICAgICAgICAgICAgLy8gOGIgb2YgcHJlY2lzaW9uIGZvciBzdXNjZXB0aWJpbGl0aWVzLgorI2RlZmluZSBBTFBIQV9TQ0FMRSAoMiAqIE1BWF9BTFBIQSkgIC8vIHNjYWxpbmcgZmFjdG9yIGZvciBhbHBoYS4KKyNkZWZpbmUgREVGQVVMVF9BTFBIQSAoLTEpCisjZGVmaW5lIElTX0JFVFRFUl9BTFBIQShhbHBoYSwgYmVzdF9hbHBoYSkgKChhbHBoYSkgPiAoYmVzdF9hbHBoYSkpCisKK3N0YXRpYyBpbnQgRmluYWxBbHBoYVZhbHVlKGludCBhbHBoYSkgeworICBhbHBoYSA9IE1BWF9BTFBIQSAtIGFscGhhOworICByZXR1cm4gY2xpcChhbHBoYSwgMCwgTUFYX0FMUEhBKTsKK30KKworc3RhdGljIGludCBHZXRBbHBoYShjb25zdCBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIC8vICdhbHBoYScgd2lsbCBsYXRlciBiZSBjbGlwcGVkIHRvIFswLi5NQVhfQUxQSEFdIHJhbmdlLCBjbGFtcGluZyBvdXRlcgorICAvLyB2YWx1ZXMgd2hpY2ggaGFwcGVuIHRvIGJlIG1vc3RseSBub2lzZS4gVGhpcyBsZWF2ZXMgdGhlIG1heGltdW0gcHJlY2lzaW9uCisgIC8vIGZvciBoYW5kbGluZyB0aGUgdXNlZnVsIHNtYWxsIHZhbHVlcyB3aGljaCBjb250cmlidXRlIG1vc3QuCisgIGNvbnN0IGludCBtYXhfdmFsdWUgPSBoaXN0by0+bWF4X3ZhbHVlOworICBjb25zdCBpbnQgbGFzdF9ub25femVybyA9IGhpc3RvLT5sYXN0X25vbl96ZXJvOworICBjb25zdCBpbnQgYWxwaGEgPQorICAgICAgKG1heF92YWx1ZSA+IDEpID8gQUxQSEFfU0NBTEUgKiBsYXN0X25vbl96ZXJvIC8gbWF4X3ZhbHVlIDogMDsKKyAgcmV0dXJuIGFscGhhOworfQorCitzdGF0aWMgdm9pZCBJbml0SGlzdG9ncmFtKFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaGlzdG8tPm1heF92YWx1ZSA9IDA7CisgIGhpc3RvLT5sYXN0X25vbl96ZXJvID0gMTsKK30KKworc3RhdGljIHZvaWQgTWVyZ2VIaXN0b2dyYW1zKGNvbnN0IFZQOEhpc3RvZ3JhbSogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKKyAgaWYgKGluLT5tYXhfdmFsdWUgPiBvdXQtPm1heF92YWx1ZSkgeworICAgIG91dC0+bWF4X3ZhbHVlID0gaW4tPm1heF92YWx1ZTsKKyAgfQorICBpZiAoaW4tPmxhc3Rfbm9uX3plcm8gPiBvdXQtPmxhc3Rfbm9uX3plcm8pIHsKKyAgICBvdXQtPmxhc3Rfbm9uX3plcm8gPSBpbi0+bGFzdF9ub25femVybzsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxpZmllZCBrLU1lYW5zLCB0byBhc3NpZ24gTmIgc2VnbWVudHMgYmFzZWQgb24gYWxwaGEtaGlzdG9ncmFtCisKK3N0YXRpYyB2b2lkIEFzc2lnblNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhbHBoYXNbTUFYX0FMUEhBICsgMV0pIHsKKyAgLy8gJ251bV9zZWdtZW50c18nIGlzIHByZXZpb3VzbHkgdmFsaWRhdGVkIGFuZCA8PSBOVU1fTUJfU0VHTUVOVFMsIGJ1dCBhbgorICAvLyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgc3B1cmlvdXMgd2FybmluZyBhYm91dCAnbiArIDEnIGV4Y2VlZGluZworICAvLyBhcnJheSBib3VuZHMgb2YgJ2NlbnRlcnMnIHdpdGggc29tZSBjb21waWxlcnMgKG5vdGljZWQgd2l0aCBnY2MtNC45KS4KKyAgY29uc3QgaW50IG5iID0gKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPCBOVU1fTUJfU0VHTUVOVFMpID8KKyAgICAgICAgICAgICAgICAgZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA6IE5VTV9NQl9TRUdNRU5UUzsKKyAgaW50IGNlbnRlcnNbTlVNX01CX1NFR01FTlRTXTsKKyAgaW50IHdlaWdodGVkX2F2ZXJhZ2UgPSAwOworICBpbnQgbWFwW01BWF9BTFBIQSArIDFdOworICBpbnQgYSwgbiwgazsKKyAgaW50IG1pbl9hID0gMCwgbWF4X2EgPSBNQVhfQUxQSEEsIHJhbmdlX2E7CisgIC8vICdpbnQnIHR5cGUgaXMgb2sgZm9yIGhpc3RvLCBhbmQgd29uJ3Qgb3ZlcmZsb3cKKyAgaW50IGFjY3VtW05VTV9NQl9TRUdNRU5UU10sIGRpc3RfYWNjdW1bTlVNX01CX1NFR01FTlRTXTsKKworICBhc3NlcnQobmIgPj0gMSk7CisgIGFzc2VydChuYiA8PSBOVU1fTUJfU0VHTUVOVFMpOworCisgIC8vIGJyYWNrZXQgdGhlIGlucHV0CisgIGZvciAobiA9IDA7IG4gPD0gTUFYX0FMUEhBICYmIGFscGhhc1tuXSA9PSAwOyArK24pIHt9CisgIG1pbl9hID0gbjsKKyAgZm9yIChuID0gTUFYX0FMUEhBOyBuID4gbWluX2EgJiYgYWxwaGFzW25dID09IDA7IC0tbikge30KKyAgbWF4X2EgPSBuOworICByYW5nZV9hID0gbWF4X2EgLSBtaW5fYTsKKworICAvLyBTcHJlYWQgaW5pdGlhbCBjZW50ZXJzIGV2ZW5seQorICBmb3IgKGsgPSAwLCBuID0gMTsgayA8IG5iOyArK2ssIG4gKz0gMikgeworICAgIGFzc2VydChuIDwgMiAqIG5iKTsKKyAgICBjZW50ZXJzW2tdID0gbWluX2EgKyAobiAqIHJhbmdlX2EpIC8gKDIgKiBuYik7CisgIH0KKworICBmb3IgKGsgPSAwOyBrIDwgTUFYX0lURVJTX0tfTUVBTlM7ICsraykgeyAgICAgLy8gZmV3IGl0ZXJzIGFyZSBlbm91Z2gKKyAgICBpbnQgdG90YWxfd2VpZ2h0OworICAgIGludCBkaXNwbGFjZWQ7CisgICAgLy8gUmVzZXQgc3RhdHMKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgeworICAgICAgYWNjdW1bbl0gPSAwOworICAgICAgZGlzdF9hY2N1bVtuXSA9IDA7CisgICAgfQorICAgIC8vIEFzc2lnbiBuZWFyZXN0IGNlbnRlciBmb3IgZWFjaCAnYScKKyAgICBuID0gMDsgICAgLy8gdHJhY2sgdGhlIG5lYXJlc3QgY2VudGVyIGZvciBjdXJyZW50ICdhJworICAgIGZvciAoYSA9IG1pbl9hOyBhIDw9IG1heF9hOyArK2EpIHsKKyAgICAgIGlmIChhbHBoYXNbYV0pIHsKKyAgICAgICAgd2hpbGUgKG4gKyAxIDwgbmIgJiYgYWJzKGEgLSBjZW50ZXJzW24gKyAxXSkgPCBhYnMoYSAtIGNlbnRlcnNbbl0pKSB7CisgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgICAgIG1hcFthXSA9IG47CisgICAgICAgIC8vIGFjY3VtdWxhdGUgY29udHJpYnV0aW9uIGludG8gYmVzdCBjZW50cm9pZAorICAgICAgICBkaXN0X2FjY3VtW25dICs9IGEgKiBhbHBoYXNbYV07CisgICAgICAgIGFjY3VtW25dICs9IGFscGhhc1thXTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gQWxsIHBvaW50IGFyZSBjbGFzc2lmaWVkLiBNb3ZlIHRoZSBjZW50cm9pZHMgdG8gdGhlCisgICAgLy8gY2VudGVyIG9mIHRoZWlyIHJlc3BlY3RpdmUgY2xvdWQuCisgICAgZGlzcGxhY2VkID0gMDsKKyAgICB3ZWlnaHRlZF9hdmVyYWdlID0gMDsKKyAgICB0b3RhbF93ZWlnaHQgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBuYjsgKytuKSB7CisgICAgICBpZiAoYWNjdW1bbl0pIHsKKyAgICAgICAgY29uc3QgaW50IG5ld19jZW50ZXIgPSAoZGlzdF9hY2N1bVtuXSArIGFjY3VtW25dIC8gMikgLyBhY2N1bVtuXTsKKyAgICAgICAgZGlzcGxhY2VkICs9IGFicyhjZW50ZXJzW25dIC0gbmV3X2NlbnRlcik7CisgICAgICAgIGNlbnRlcnNbbl0gPSBuZXdfY2VudGVyOworICAgICAgICB3ZWlnaHRlZF9hdmVyYWdlICs9IG5ld19jZW50ZXIgKiBhY2N1bVtuXTsKKyAgICAgICAgdG90YWxfd2VpZ2h0ICs9IGFjY3VtW25dOworICAgICAgfQorICAgIH0KKyAgICB3ZWlnaHRlZF9hdmVyYWdlID0gKHdlaWdodGVkX2F2ZXJhZ2UgKyB0b3RhbF93ZWlnaHQgLyAyKSAvIHRvdGFsX3dlaWdodDsKKyAgICBpZiAoZGlzcGxhY2VkIDwgNSkgYnJlYWs7ICAgLy8gbm8gbmVlZCB0byBrZWVwIG9uIGxvb3BpbmcuLi4KKyAgfQorCisgIC8vIE1hcCBlYWNoIG9yaWdpbmFsIHZhbHVlIHRvIHRoZSBjbG9zZXN0IGNlbnRyb2lkCisgIGZvciAobiA9IDA7IG4gPCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsgKytuKSB7CisgICAgVlA4TUJJbmZvKiBjb25zdCBtYiA9ICZlbmMtPm1iX2luZm9fW25dOworICAgIGNvbnN0IGludCBhbHBoYSA9IG1iLT5hbHBoYV87CisgICAgbWItPnNlZ21lbnRfID0gbWFwW2FscGhhXTsKKyAgICBtYi0+YWxwaGFfID0gY2VudGVyc1ttYXBbYWxwaGFdXTsgIC8vIGZvciB0aGUgcmVjb3JkLgorICB9CisKKyAgaWYgKG5iID4gMSkgeworICAgIGNvbnN0IGludCBzbW9vdGggPSAoZW5jLT5jb25maWdfLT5wcmVwcm9jZXNzaW5nICYgMSk7CisgICAgaWYgKHNtb290aCkgU21vb3RoU2VnbWVudE1hcChlbmMpOworICB9CisKKyAgU2V0U2VnbWVudEFscGhhcyhlbmMsIGNlbnRlcnMsIHdlaWdodGVkX2F2ZXJhZ2UpOyAgLy8gcGljayBzb21lIGFscGhhcy4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1hY3JvYmxvY2sgYW5hbHlzaXM6IGNvbGxlY3QgaGlzdG9ncmFtIGZvciBlYWNoIG1vZGUsIGRlZHVjZSB0aGUgbWF4aW1hbAorLy8gc3VzY2VwdGliaWxpdHkgYW5kIHNldCBiZXN0IG1vZGVzIGZvciB0aGlzIG1hY3JvYmxvY2suCisvLyBTZWdtZW50IGFzc2lnbm1lbnQgaXMgZG9uZSBsYXRlci4KKworLy8gTnVtYmVyIG9mIG1vZGVzIHRvIGluc3BlY3QgZm9yIGFscGhhXyBldmFsdWF0aW9uLiBXZSBkb24ndCBuZWVkIHRvIHRlc3QgYWxsCisvLyB0aGUgcG9zc2libGUgbW9kZXMgZHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZTogd2UgcmlzayBmYWxsaW5nIGludG8gYSBsb2NhbAorLy8gb3B0aW11bSwgb3IgYmUgc3ViamVjdCB0byBib3VuZGFyeSBlZmZlY3QKKyNkZWZpbmUgTUFYX0lOVFJBMTZfTU9ERSAyCisjZGVmaW5lIE1BWF9JTlRSQTRfTU9ERSAgMgorI2RlZmluZSBNQVhfVVZfTU9ERSAgICAgIDIKKworc3RhdGljIGludCBNQkFuYWx5emVCZXN0SW50cmExNk1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGNvbnN0IGludCBtYXhfbW9kZSA9IE1BWF9JTlRSQTE2X01PREU7CisgIGludCBtb2RlOworICBpbnQgYmVzdF9hbHBoYSA9IERFRkFVTFRfQUxQSEE7CisgIGludCBiZXN0X21vZGUgPSAwOworCisgIFZQOE1ha2VMdW1hMTZQcmVkcyhpdCk7CisgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBtYXhfbW9kZTsgKyttb2RlKSB7CisgICAgVlA4SGlzdG9ncmFtIGhpc3RvOworICAgIGludCBhbHBoYTsKKworICAgIEluaXRIaXN0b2dyYW0oJmhpc3RvKTsKKyAgICBWUDhDb2xsZWN0SGlzdG9ncmFtKGl0LT55dXZfaW5fICsgWV9PRkZfRU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsICZoaXN0byk7CisgICAgYWxwaGEgPSBHZXRBbHBoYSgmaGlzdG8pOworICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfYWxwaGEpKSB7CisgICAgICBiZXN0X2FscGhhID0gYWxwaGE7CisgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgIH0KKyAgfQorICBWUDhTZXRJbnRyYTE2TW9kZShpdCwgYmVzdF9tb2RlKTsKKyAgcmV0dXJuIGJlc3RfYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgTUJBbmFseXplQmVzdEludHJhNE1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9hbHBoYSkgeworICB1aW50OF90IG1vZGVzWzE2XTsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX0lOVFJBNF9NT0RFOworICBpbnQgaTRfYWxwaGE7CisgIFZQOEhpc3RvZ3JhbSB0b3RhbF9oaXN0bzsKKyAgaW50IGN1cl9oaXN0byA9IDA7CisgIEluaXRIaXN0b2dyYW0oJnRvdGFsX2hpc3RvKTsKKworICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICBkbyB7CisgICAgaW50IG1vZGU7CisgICAgaW50IGJlc3RfbW9kZV9hbHBoYSA9IERFRkFVTFRfQUxQSEE7CisgICAgVlA4SGlzdG9ncmFtIGhpc3Rvc1syXTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisKKyAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBtYXhfbW9kZTsgKyttb2RlKSB7CisgICAgICBpbnQgYWxwaGE7CisKKyAgICAgIEluaXRIaXN0b2dyYW0oJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oc3JjLCBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3Rvc1tjdXJfaGlzdG9dKTsKKyAgICAgIGlmIChJU19CRVRURVJfQUxQSEEoYWxwaGEsIGJlc3RfbW9kZV9hbHBoYSkpIHsKKyAgICAgICAgYmVzdF9tb2RlX2FscGhhID0gYWxwaGE7CisgICAgICAgIG1vZGVzW2l0LT5pNF9dID0gbW9kZTsKKyAgICAgICAgY3VyX2hpc3RvIF49IDE7ICAgLy8ga2VlcCB0cmFjayBvZiBiZXN0IGhpc3RvIHNvIGZhci4KKyAgICAgIH0KKyAgICB9CisgICAgLy8gYWNjdW11bGF0ZSBiZXN0IGhpc3RvZ3JhbQorICAgIE1lcmdlSGlzdG9ncmFtcygmaGlzdG9zW2N1cl9oaXN0byBeIDFdLCAmdG90YWxfaGlzdG8pOworICAgIC8vIE5vdGU6IHdlIHJldXNlIHRoZSBvcmlnaW5hbCBzYW1wbGVzIGZvciBwcmVkaWN0b3JzCisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkZfRU5DKSk7CisKKyAgaTRfYWxwaGEgPSBHZXRBbHBoYSgmdG90YWxfaGlzdG8pOworICBpZiAoSVNfQkVUVEVSX0FMUEhBKGk0X2FscGhhLCBiZXN0X2FscGhhKSkgeworICAgIFZQOFNldEludHJhNE1vZGUoaXQsIG1vZGVzKTsKKyAgICBiZXN0X2FscGhhID0gaTRfYWxwaGE7CisgIH0KKyAgcmV0dXJuIGJlc3RfYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgTUJBbmFseXplQmVzdFVWTW9kZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBpbnQgYmVzdF9tb2RlID0gMDsKKyAgY29uc3QgaW50IG1heF9tb2RlID0gTUFYX1VWX01PREU7CisgIGludCBtb2RlOworCisgIFZQOE1ha2VDaHJvbWE4UHJlZHMoaXQpOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgeworICAgIFZQOEhpc3RvZ3JhbSBoaXN0bzsKKyAgICBpbnQgYWxwaGE7CisgICAgSW5pdEhpc3RvZ3JhbSgmaGlzdG8pOworICAgIFZQOENvbGxlY3RIaXN0b2dyYW0oaXQtPnl1dl9pbl8gKyBVX09GRl9FTkMsCisgICAgICAgICAgICAgICAgICAgICAgICBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAxNiArIDQgKyA0LCAmaGlzdG8pOworICAgIGFscGhhID0gR2V0QWxwaGEoJmhpc3RvKTsKKyAgICBpZiAoSVNfQkVUVEVSX0FMUEhBKGFscGhhLCBiZXN0X2FscGhhKSkgeworICAgICAgYmVzdF9hbHBoYSA9IGFscGhhOworICAgICAgYmVzdF9tb2RlID0gbW9kZTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SW50cmFVVk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgIHJldHVybiBiZXN0X2FscGhhOworfQorCitzdGF0aWMgdm9pZCBNQkFuYWx5emUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYXNbTUFYX0FMUEhBICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBhbHBoYSwgaW50KiBjb25zdCB1dl9hbHBoYSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaW50IGJlc3RfYWxwaGEsIGJlc3RfdXZfYWxwaGE7CisKKyAgVlA4U2V0SW50cmExNk1vZGUoaXQsIDApOyAgLy8gZGVmYXVsdDogSW50cmExNiwgRENfUFJFRAorICBWUDhTZXRTa2lwKGl0LCAwKTsgICAgICAgICAvLyBub3Qgc2tpcHBlZAorICBWUDhTZXRTZWdtZW50KGl0LCAwKTsgICAgICAvLyBkZWZhdWx0IHNlZ21lbnQsIHNwZWMtd2lzZS4KKworICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhMTZNb2RlKGl0KTsKKyAgaWYgKGVuYy0+bWV0aG9kXyA+PSA1KSB7CisgICAgLy8gV2UgZ28gYW5kIG1ha2UgYSBmYXN0IGRlY2lzaW9uIGZvciBpbnRyYTQvaW50cmExNi4KKyAgICAvLyBJdCdzIHVzdWFsbHkgbm90IGEgZ29vZCBhbmQgZGVmaW5pdGl2ZSBwaWNrLCBidXQgaGVscHMgc2VlZGluZyB0aGUgc3RhdHMKKyAgICAvLyBhYm91dCBsZXZlbCBiaXQtY29zdC4KKyAgICAvLyBUT0RPKHNrYWwpOiBpbXByb3ZlIGNyaXRlcmlvbi4KKyAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhNE1vZGUoaXQsIGJlc3RfYWxwaGEpOworICB9CisgIGJlc3RfdXZfYWxwaGEgPSBNQkFuYWx5emVCZXN0VVZNb2RlKGl0KTsKKworICAvLyBGaW5hbCBzdXNjZXB0aWJpbGl0eSBtaXgKKyAgYmVzdF9hbHBoYSA9ICgzICogYmVzdF9hbHBoYSArIGJlc3RfdXZfYWxwaGEgKyAyKSA+PiAyOworICBiZXN0X2FscGhhID0gRmluYWxBbHBoYVZhbHVlKGJlc3RfYWxwaGEpOworICBhbHBoYXNbYmVzdF9hbHBoYV0rKzsKKyAgaXQtPm1iXy0+YWxwaGFfID0gYmVzdF9hbHBoYTsgICAvLyBmb3IgbGF0ZXIgcmVtYXBwaW5nLgorCisgIC8vIEFjY3VtdWxhdGUgZm9yIGxhdGVyIGNvbXBsZXhpdHkgYW5hbHlzaXMuCisgICphbHBoYSArPSBiZXN0X2FscGhhOyAgIC8vIG1peGVkIHN1c2NlcHRpYmlsaXR5IChub3QganVzdCBsdW1hKQorICAqdXZfYWxwaGEgKz0gYmVzdF91dl9hbHBoYTsKK30KKworc3RhdGljIHZvaWQgRGVmYXVsdE1CSW5mbyhWUDhNQkluZm8qIGNvbnN0IG1iKSB7CisgIG1iLT50eXBlXyA9IDE7ICAgICAvLyBJMTZ4MTYKKyAgbWItPnV2X21vZGVfID0gMDsKKyAgbWItPnNraXBfID0gMDsgICAgIC8vIG5vdCBza2lwcGVkCisgIG1iLT5zZWdtZW50XyA9IDA7ICAvLyBkZWZhdWx0IHNlZ21lbnQKKyAgbWItPmFscGhhXyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGFuYWx5c2lzIGxvb3A6CisvLyBDb2xsZWN0IGFsbCBzdXNjZXB0aWJpbGl0aWVzIGZvciBlYWNoIG1hY3JvYmxvY2sgYW5kIHJlY29yZCB0aGVpcgorLy8gZGlzdHJpYnV0aW9uIGluIGFscGhhc1tdLiBTZWdtZW50cyBpcyBhc3NpZ25lZCBhLXBvc3RlcmlvcmksIGJhc2VkIG9uCisvLyB0aGlzIGhpc3RvZ3JhbS4KKy8vIFdlIGFsc28gcGljayBhbiBpbnRyYTE2IHByZWRpY3Rpb24gbW9kZSwgd2hpY2ggc2hvdWxkbid0IGJlIGNvbnNpZGVyZWQKKy8vIGZpbmFsIGV4Y2VwdCBmb3IgZmFzdC1lbmNvZGUgc2V0dGluZ3MuIFdlIGNhbiBhbHNvIHBpY2sgc29tZSBpbnRyYTQgbW9kZXMKKy8vIGFuZCBkZWNpZGUgaW50cmE0L2ludHJhMTYsIGJ1dCB0aGF0J3MgdXN1YWxseSBhbG1vc3QgYWx3YXlzIGEgYmFkIGNob2ljZSBhdAorLy8gdGhpcyBzdGFnZS4KKworc3RhdGljIHZvaWQgUmVzZXRBbGxNQkluZm8oVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87ICsrbikgeworICAgIERlZmF1bHRNQkluZm8oJmVuYy0+bWJfaW5mb19bbl0pOworICB9CisgIC8vIERlZmF1bHQgc3VzY2VwdGliaWxpdGllcy4KKyAgZW5jLT5kcW1fWzBdLmFscGhhXyA9IDA7CisgIGVuYy0+ZHFtX1swXS5iZXRhXyA9IDA7CisgIC8vIE5vdGU6IHdlIGNhbid0IGNvbXB1dGUgdGhpcyBhbHBoYV8gLyB1dl9hbHBoYV8gLT4gc2V0IHRvIGRlZmF1bHQgdmFsdWUuCisgIGVuYy0+YWxwaGFfID0gMDsKKyAgZW5jLT51dl9hbHBoYV8gPSAwOworICBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKK30KKworLy8gc3RydWN0IHVzZWQgdG8gY29sbGVjdCBqb2IgcmVzdWx0Cit0eXBlZGVmIHN0cnVjdCB7CisgIFdlYlBXb3JrZXIgd29ya2VyOworICBpbnQgYWxwaGFzW01BWF9BTFBIQSArIDFdOworICBpbnQgYWxwaGEsIHV2X2FscGhhOworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgaW50IGRlbHRhX3Byb2dyZXNzOworfSBTZWdtZW50Sm9iOworCisvLyBtYWluIHdvcmsgY2FsbAorc3RhdGljIGludCBEb1NlZ21lbnRzSm9iKFNlZ21lbnRKb2IqIGNvbnN0IGpvYiwgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGludCBvayA9IDE7CisgIGlmICghVlA4SXRlcmF0b3JJc0RvbmUoaXQpKSB7CisgICAgdWludDhfdCB0bXBbMzIgKyBXRUJQX0FMSUdOX0NTVF07CisgICAgdWludDhfdCogY29uc3Qgc2NyYXRjaCA9ICh1aW50OF90KilXRUJQX0FMSUdOKHRtcCk7CisgICAgZG8geworICAgICAgLy8gTGV0J3MgcHJldGVuZCB3ZSBoYXZlIHBlcmZlY3QgbG9zc2xlc3MgcmVjb25zdHJ1Y3Rpb24uCisgICAgICBWUDhJdGVyYXRvckltcG9ydChpdCwgc2NyYXRjaCk7CisgICAgICBNQkFuYWx5emUoaXQsIGpvYi0+YWxwaGFzLCAmam9iLT5hbHBoYSwgJmpvYi0+dXZfYWxwaGEpOworICAgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKGl0LCBqb2ItPmRlbHRhX3Byb2dyZXNzKTsKKyAgICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoaXQpKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIE1lcmdlSm9icyhjb25zdCBTZWdtZW50Sm9iKiBjb25zdCBzcmMsIFNlZ21lbnRKb2IqIGNvbnN0IGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfQUxQSEE7ICsraSkgZHN0LT5hbHBoYXNbaV0gKz0gc3JjLT5hbHBoYXNbaV07CisgIGRzdC0+YWxwaGEgKz0gc3JjLT5hbHBoYTsKKyAgZHN0LT51dl9hbHBoYSArPSBzcmMtPnV2X2FscGhhOworfQorCisvLyBpbml0aWFsaXplIHRoZSBqb2Igc3RydWN0IHdpdGggc29tZSBUT0RPcworc3RhdGljIHZvaWQgSW5pdFNlZ21lbnRKb2IoVlA4RW5jb2RlciogY29uc3QgZW5jLCBTZWdtZW50Sm9iKiBjb25zdCBqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcm93LCBpbnQgZW5kX3JvdykgeworICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkluaXQoJmpvYi0+d29ya2VyKTsKKyAgam9iLT53b3JrZXIuZGF0YTEgPSBqb2I7CisgIGpvYi0+d29ya2VyLmRhdGEyID0gJmpvYi0+aXQ7CisgIGpvYi0+d29ya2VyLmhvb2sgPSAoV2ViUFdvcmtlckhvb2spRG9TZWdtZW50c0pvYjsKKyAgVlA4SXRlcmF0b3JJbml0KGVuYywgJmpvYi0+aXQpOworICBWUDhJdGVyYXRvclNldFJvdygmam9iLT5pdCwgc3RhcnRfcm93KTsKKyAgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oJmpvYi0+aXQsIChlbmRfcm93IC0gc3RhcnRfcm93KSAqIGVuYy0+bWJfd18pOworICBtZW1zZXQoam9iLT5hbHBoYXMsIDAsIHNpemVvZihqb2ItPmFscGhhcykpOworICBqb2ItPmFscGhhID0gMDsKKyAgam9iLT51dl9hbHBoYSA9IDA7CisgIC8vIG9ubHkgb25lIG9mIGJvdGggam9icyBjYW4gcmVjb3JkIHRoZSBwcm9ncmVzcywgc2luY2Ugd2UgZG9uJ3QKKyAgLy8gZXhwZWN0IHRoZSB1c2VyJ3MgaG9vayB0byBiZSBtdWx0aS10aHJlYWQgc2FmZQorICBqb2ItPmRlbHRhX3Byb2dyZXNzID0gKHN0YXJ0X3JvdyA9PSAwKSA/IDIwIDogMDsKK30KKworLy8gbWFpbiBlbnRyeSBwb2ludAoraW50IFZQOEVuY0FuYWx5emUoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBvayA9IDE7CisgIGNvbnN0IGludCBkb19zZWdtZW50cyA9CisgICAgICBlbmMtPmNvbmZpZ18tPmVtdWxhdGVfanBlZ19zaXplIHx8ICAgLy8gV2UgbmVlZCB0aGUgY29tcGxleGl0eSBldmFsdWF0aW9uLgorICAgICAgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB8fAorICAgICAgKGVuYy0+bWV0aG9kXyA9PSAwKTsgIC8vIGZvciBtZXRob2QgMCwgd2UgbmVlZCBwcmVkc19bXSB0byBiZSBmaWxsZWQuCisgIGlmIChkb19zZWdtZW50cykgeworICAgIGNvbnN0IGludCBsYXN0X3JvdyA9IGVuYy0+bWJfaF87CisgICAgLy8gV2UgZ2l2ZSBhIGxpdHRsZSBtb3JlIHRoYW4gYSBoYWxmIHdvcmsgdG8gdGhlIG1haW4gdGhyZWFkLgorICAgIGNvbnN0IGludCBzcGxpdF9yb3cgPSAoOSAqIGxhc3Rfcm93ICsgMTUpID4+IDQ7CisgICAgY29uc3QgaW50IHRvdGFsX21iID0gbGFzdF9yb3cgKiBlbmMtPm1iX3dfOworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICAgIGNvbnN0IGludCBrTWluU3BsaXRSb3cgPSAyOyAgLy8gbWluaW1hbCByb3dzIG5lZWRlZCBmb3IgbXQgdG8gYmUgd29ydGggaXQKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgJiYgKHNwbGl0X3JvdyA+PSBrTWluU3BsaXRSb3cpOworI2Vsc2UKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAwOworI2VuZGlmCisgICAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd29ya2VyX2ludGVyZmFjZSA9CisgICAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKTsKKyAgICBTZWdtZW50Sm9iIG1haW5fam9iOworICAgIGlmIChkb19tdCkgeworICAgICAgU2VnbWVudEpvYiBzaWRlX2pvYjsKKyAgICAgIC8vIE5vdGUgdGhlIHVzZSBvZiAnJicgaW5zdGVhZCBvZiAnJiYnIGJlY2F1c2Ugd2UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbnMKKyAgICAgIC8vIG5vIG1hdHRlciB3aGF0LgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIHNwbGl0X3Jvdyk7CisgICAgICBJbml0U2VnbWVudEpvYihlbmMsICZzaWRlX2pvYiwgc3BsaXRfcm93LCBsYXN0X3Jvdyk7CisgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgUmVzZXQoKSBvbiBtYWluX2pvYi53b3JrZXIsIHNpbmNlIHdlJ3JlIGNhbGxpbmcKKyAgICAgIC8vIFdlYlBXb3JrZXJFeGVjdXRlKCkgb24gaXQKKyAgICAgIG9rICY9IHdvcmtlcl9pbnRlcmZhY2UtPlJlc2V0KCZzaWRlX2pvYi53b3JrZXIpOworICAgICAgLy8gbGF1bmNoIHRoZSB0d28gam9icyBpbiBwYXJhbGxlbAorICAgICAgaWYgKG9rKSB7CisgICAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkxhdW5jaCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgd29ya2VyX2ludGVyZmFjZS0+RXhlY3V0ZSgmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgIH0KKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgIGlmIChvaykgTWVyZ2VKb2JzKCZzaWRlX2pvYiwgJm1haW5fam9iKTsgIC8vIG1lcmdlIHJlc3VsdHMgdG9nZXRoZXIKKyAgICB9IGVsc2UgeworICAgICAgLy8gRXZlbiBmb3Igc2luZ2xlLXRocmVhZCBjYXNlLCB3ZSB1c2UgdGhlIGdlbmVyaWMgV29ya2VyIHRvb2xzLgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIGxhc3Rfcm93KTsKKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkV4ZWN1dGUoJm1haW5fam9iLndvcmtlcik7CisgICAgICBvayAmPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZtYWluX2pvYi53b3JrZXIpOworICAgIH0KKyAgICB3b3JrZXJfaW50ZXJmYWNlLT5FbmQoJm1haW5fam9iLndvcmtlcik7CisgICAgaWYgKG9rKSB7CisgICAgICBlbmMtPmFscGhhXyA9IG1haW5fam9iLmFscGhhIC8gdG90YWxfbWI7CisgICAgICBlbmMtPnV2X2FscGhhXyA9IG1haW5fam9iLnV2X2FscGhhIC8gdG90YWxfbWI7CisgICAgICBBc3NpZ25TZWdtZW50cyhlbmMsIG1haW5fam9iLmFscGhhcyk7CisgICAgfQorICB9IGVsc2UgeyAgIC8vIFVzZSBvbmx5IG9uZSBkZWZhdWx0IHNlZ21lbnQuCisgICAgUmVzZXRBbGxNQkluZm8oZW5jKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxN2M4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5jCkBAIC0wLDAgKzEsMTcxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisjZGVmaW5lIFZBTFVFU19JTl9CWVRFIDI1NgorCisjZGVmaW5lIE1JTl9CTE9DS19TSVpFIDI1NiAgLy8gbWluaW11bSBibG9jayBzaXplIGZvciBiYWNrd2FyZCByZWZlcmVuY2VzCisKKyNkZWZpbmUgTUFYX0VOVFJPUFkgICAgKDFlMzBmKQorCisvLyAxTSB3aW5kb3cgKDRNIGJ5dGVzKSBtaW51cyAxMjAgc3BlY2lhbCBjb2RlcyBmb3Igc2hvcnQgZGlzdGFuY2VzLgorI2RlZmluZSBXSU5ET1dfU0laRV9CSVRTIDIwCisjZGVmaW5lIFdJTkRPV19TSVpFICgoMSA8PCBXSU5ET1dfU0laRV9CSVRTKSAtIDEyMCkKKworLy8gQm91bmRzIGZvciB0aGUgbWF0Y2ggbGVuZ3RoLgorI2RlZmluZSBNSU5fTEVOR1RIIDIKKy8vIElmIHlvdSBjaGFuZ2UgdGhpcywgeW91IG5lZWQgTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA8PSAzMiBhcyBpdAorLy8gaXMgdXNlZCBpbiBWUDhMSGFzaENoYWluLgorI2RlZmluZSBNQVhfTEVOR1RIX0JJVFMgMTIKKy8vIFdlIHdhbnQgdGhlIG1heCB2YWx1ZSB0byBiZSBhdHRhaW5hYmxlIGFuZCBzdG9yZWQgaW4gTUFYX0xFTkdUSF9CSVRTIGJpdHMuCisjZGVmaW5lIE1BWF9MRU5HVEggKCgxIDw8IE1BWF9MRU5HVEhfQklUUykgLSAxKQorI2lmIE1BWF9MRU5HVEhfQklUUyArIFdJTkRPV19TSVpFX0JJVFMgPiAzMgorI2Vycm9yICJNQVhfTEVOR1RIX0JJVFMgKyBXSU5ET1dfU0laRV9CSVRTID4gMzIiCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGxhbmVfdG9fY29kZV9sdXRbMTI4XSA9IHsKKyA5NiwgICA3MywgIDU1LCAgMzksICAyMywgIDEzLCAgIDUsICAxLCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgMTAxLCAgNzgsICA1OCwgIDQyLCAgMjYsICAxNiwgICA4LCAgMiwgICAgMCwgICAzLCAgOSwgICAxNywgIDI3LCAgNDMsICA1OSwgIDc5LAorIDEwMiwgIDg2LCAgNjIsICA0NiwgIDMyLCAgMjAsICAxMCwgIDYsICAgIDQsICAgNywgIDExLCAgMjEsICAzMywgIDQ3LCAgNjMsICA4NywKKyAxMDUsICA5MCwgIDcwLCAgNTIsICAzNywgIDI4LCAgMTgsICAxNCwgIDEyLCAgMTUsICAxOSwgIDI5LCAgMzgsICA1MywgIDcxLCAgOTEsCisgMTEwLCAgOTksICA4MiwgIDY2LCAgNDgsICAzNSwgIDMwLCAgMjQsICAyMiwgIDI1LCAgMzEsICAzNiwgIDQ5LCAgNjcsICA4MywgMTAwLAorIDExNSwgMTA4LCAgOTQsICA3NiwgIDY0LCAgNTAsICA0NCwgIDQwLCAgMzQsICA0MSwgIDQ1LCAgNTEsICA2NSwgIDc3LCAgOTUsIDEwOSwKKyAxMTgsIDExMywgMTAzLCAgOTIsICA4MCwgIDY4LCAgNjAsICA1NiwgIDU0LCAgNTcsICA2MSwgIDY5LCAgODEsICA5MywgMTA0LCAxMTQsCisgMTE5LCAxMTYsIDExMSwgMTA2LCAgOTcsICA4OCwgIDg0LCAgNzQsICA3MiwgIDc1LCAgODUsICA4OSwgIDk4LCAxMDcsIDExMiwgMTE3Cit9OworCitzdGF0aWMgaW50IERpc3RhbmNlVG9QbGFuZUNvZGUoaW50IHhzaXplLCBpbnQgZGlzdCkgeworICBjb25zdCBpbnQgeW9mZnNldCA9IGRpc3QgLyB4c2l6ZTsKKyAgY29uc3QgaW50IHhvZmZzZXQgPSBkaXN0IC0geW9mZnNldCAqIHhzaXplOworICBpZiAoeG9mZnNldCA8PSA4ICYmIHlvZmZzZXQgPCA4KSB7CisgICAgcmV0dXJuIHBsYW5lX3RvX2NvZGVfbHV0W3lvZmZzZXQgKiAxNiArIDggLSB4b2Zmc2V0XSArIDE7CisgIH0gZWxzZSBpZiAoeG9mZnNldCA+IHhzaXplIC0gOCAmJiB5b2Zmc2V0IDwgNykgeworICAgIHJldHVybiBwbGFuZV90b19jb2RlX2x1dFsoeW9mZnNldCArIDEpICogMTYgKyA4ICsgKHhzaXplIC0geG9mZnNldCldICsgMTsKKyAgfQorICByZXR1cm4gZGlzdCArIDEyMDsKK30KKworLy8gUmV0dXJucyB0aGUgZXhhY3QgaW5kZXggd2hlcmUgYXJyYXkxIGFuZCBhcnJheTIgYXJlIGRpZmZlcmVudC4gRm9yIGFuIGluZGV4CisvLyBpbmZlcmlvciBvciBlcXVhbCB0byBiZXN0X2xlbl9tYXRjaCwgdGhlIHJldHVybiB2YWx1ZSBqdXN0IGhhcyB0byBiZSBzdHJpY3RseQorLy8gaW5mZXJpb3IgdG8gYmVzdF9sZW5fbWF0Y2guIFRoZSBjdXJyZW50IGJlaGF2aW9yIGlzIHRvIHJldHVybiAwIGlmIHRoaXMgaW5kZXgKKy8vIGlzIGJlc3RfbGVuX21hdGNoLCBhbmQgdGhlIGluZGV4IGl0c2VsZiBvdGhlcndpc2UuCisvLyBJZiBubyB0d28gZWxlbWVudHMgYXJlIHRoZSBzYW1lLCBpdCByZXR1cm5zIG1heF9saW1pdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgRmluZE1hdGNoTGVuZ3RoKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlc3RfbGVuX21hdGNoLCBpbnQgbWF4X2xpbWl0KSB7CisgIC8vIEJlZm9yZSAnZXhwZW5zaXZlJyBsaW5lYXIgbWF0Y2gsIGNoZWNrIGlmIHRoZSB0d28gYXJyYXlzIG1hdGNoIGF0IHRoZQorICAvLyBjdXJyZW50IGJlc3QgbGVuZ3RoIGluZGV4LgorICBpZiAoYXJyYXkxW2Jlc3RfbGVuX21hdGNoXSAhPSBhcnJheTJbYmVzdF9sZW5fbWF0Y2hdKSByZXR1cm4gMDsKKworICByZXR1cm4gVlA4TFZlY3Rvck1pc21hdGNoKGFycmF5MSwgYXJyYXkyLCBtYXhfbGltaXQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFZQOExCYWNrd2FyZFJlZnMKKworc3RydWN0IFBpeE9yQ29weUJsb2NrIHsKKyAgUGl4T3JDb3B5QmxvY2sqIG5leHRfOyAgIC8vIG5leHQgYmxvY2sgKG9yIE5VTEwpCisgIFBpeE9yQ29weSogc3RhcnRfOyAgICAgICAvLyBkYXRhIHN0YXJ0CisgIGludCBzaXplXzsgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNlZCBzaXplCit9OworCitzdGF0aWMgdm9pZCBDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGFzc2VydChyZWZzICE9IE5VTEwpOworICBpZiAocmVmcy0+dGFpbF8gIT0gTlVMTCkgeworICAgICpyZWZzLT50YWlsXyA9IHJlZnMtPmZyZWVfYmxvY2tzXzsgIC8vIHJlY3ljbGUgYWxsIGJsb2NrcyBhdCBvbmNlCisgIH0KKyAgcmVmcy0+ZnJlZV9ibG9ja3NfID0gcmVmcy0+cmVmc187CisgIHJlZnMtPnRhaWxfID0gJnJlZnMtPnJlZnNfOworICByZWZzLT5sYXN0X2Jsb2NrXyA9IE5VTEw7CisgIHJlZnMtPnJlZnNfID0gTlVMTDsKK30KKwordm9pZCBWUDhMQmFja3dhcmRSZWZzQ2xlYXIoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBhc3NlcnQocmVmcyAhPSBOVUxMKTsKKyAgQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIHdoaWxlIChyZWZzLT5mcmVlX2Jsb2Nrc18gIT0gTlVMTCkgeworICAgIFBpeE9yQ29weUJsb2NrKiBjb25zdCBuZXh0ID0gcmVmcy0+ZnJlZV9ibG9ja3NfLT5uZXh0XzsKKyAgICBXZWJQU2FmZUZyZWUocmVmcy0+ZnJlZV9ibG9ja3NfKTsKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBuZXh0OworICB9Cit9CisKK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0luaXQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IGJsb2NrX3NpemUpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIG1lbXNldChyZWZzLCAwLCBzaXplb2YoKnJlZnMpKTsKKyAgcmVmcy0+dGFpbF8gPSAmcmVmcy0+cmVmc187CisgIHJlZnMtPmJsb2NrX3NpemVfID0KKyAgICAgIChibG9ja19zaXplIDwgTUlOX0JMT0NLX1NJWkUpID8gTUlOX0JMT0NLX1NJWkUgOiBibG9ja19zaXplOworfQorCitWUDhMUmVmc0N1cnNvciBWUDhMUmVmc0N1cnNvckluaXQoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBWUDhMUmVmc0N1cnNvciBjOworICBjLmN1cl9ibG9ja18gPSByZWZzLT5yZWZzXzsKKyAgaWYgKHJlZnMtPnJlZnNfICE9IE5VTEwpIHsKKyAgICBjLmN1cl9wb3MgPSBjLmN1cl9ibG9ja18tPnN0YXJ0XzsKKyAgICBjLmxhc3RfcG9zXyA9IGMuY3VyX3BvcyArIGMuY3VyX2Jsb2NrXy0+c2l6ZV87CisgIH0gZWxzZSB7CisgICAgYy5jdXJfcG9zID0gTlVMTDsKKyAgICBjLmxhc3RfcG9zXyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGNvbnN0IGIgPSBjLT5jdXJfYmxvY2tfLT5uZXh0XzsKKyAgYy0+Y3VyX3BvcyA9IChiID09IE5VTEwpID8gTlVMTCA6IGItPnN0YXJ0XzsKKyAgYy0+bGFzdF9wb3NfID0gKGIgPT0gTlVMTCkgPyBOVUxMIDogYi0+c3RhcnRfICsgYi0+c2l6ZV87CisgIGMtPmN1cl9ibG9ja18gPSBiOworfQorCisvLyBDcmVhdGUgYSBuZXcgYmxvY2ssIGVpdGhlciBmcm9tIHRoZSBmcmVlIGxpc3Qgb3IgYWxsb2NhdGVkCitzdGF0aWMgUGl4T3JDb3B5QmxvY2sqIEJhY2t3YXJkUmVmc05ld0Jsb2NrKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgUGl4T3JDb3B5QmxvY2sqIGIgPSByZWZzLT5mcmVlX2Jsb2Nrc187CisgIGlmIChiID09IE5VTEwpIHsgICAvLyBhbGxvY2F0ZSBuZXcgbWVtb3J5IGNodW5rCisgICAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPQorICAgICAgICBzaXplb2YoKmIpICsgcmVmcy0+YmxvY2tfc2l6ZV8gKiBzaXplb2YoKmItPnN0YXJ0Xyk7CisgICAgYiA9IChQaXhPckNvcHlCbG9jayopV2ViUFNhZmVNYWxsb2MoMVVMTCwgdG90YWxfc2l6ZSk7CisgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgcmVmcy0+ZXJyb3JfIHw9IDE7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYi0+c3RhcnRfID0gKFBpeE9yQ29weSopKCh1aW50OF90KiliICsgc2l6ZW9mKCpiKSk7ICAvLyBub3QgYWx3YXlzIGFsaWduZWQKKyAgfSBlbHNlIHsgIC8vIHJlY3ljbGUgZnJvbSBmcmVlLWxpc3QKKyAgICByZWZzLT5mcmVlX2Jsb2Nrc18gPSBiLT5uZXh0XzsKKyAgfQorICAqcmVmcy0+dGFpbF8gPSBiOworICByZWZzLT50YWlsXyA9ICZiLT5uZXh0XzsKKyAgcmVmcy0+bGFzdF9ibG9ja18gPSBiOworICBiLT5uZXh0XyA9IE5VTEw7CisgIGItPnNpemVfID0gMDsKKyAgcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEJhY2t3YXJkUmVmc0N1cnNvckFkZChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSB2KSB7CisgIFBpeE9yQ29weUJsb2NrKiBiID0gcmVmcy0+bGFzdF9ibG9ja187CisgIGlmIChiID09IE5VTEwgfHwgYi0+c2l6ZV8gPT0gcmVmcy0+YmxvY2tfc2l6ZV8pIHsKKyAgICBiID0gQmFja3dhcmRSZWZzTmV3QmxvY2socmVmcyk7CisgICAgaWYgKGIgPT0gTlVMTCkgcmV0dXJuOyAgIC8vIHJlZnMtPmVycm9yXyBpcyBzZXQKKyAgfQorICBiLT5zdGFydF9bYi0+c2l6ZV8rK10gPSB2OworfQorCitpbnQgVlA4TEJhY2t3YXJkUmVmc0NvcHkoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IGRzdCkgeworICBjb25zdCBQaXhPckNvcHlCbG9jayogYiA9IHNyYy0+cmVmc187CisgIENsZWFyQmFja3dhcmRSZWZzKGRzdCk7CisgIGFzc2VydChzcmMtPmJsb2NrX3NpemVfID09IGRzdC0+YmxvY2tfc2l6ZV8pOworICB3aGlsZSAoYiAhPSBOVUxMKSB7CisgICAgUGl4T3JDb3B5QmxvY2sqIGNvbnN0IG5ld19iID0gQmFja3dhcmRSZWZzTmV3QmxvY2soZHN0KTsKKyAgICBpZiAobmV3X2IgPT0gTlVMTCkgcmV0dXJuIDA7ICAgLy8gZHN0LT5lcnJvcl8gaXMgc2V0CisgICAgbWVtY3B5KG5ld19iLT5zdGFydF8sIGItPnN0YXJ0XywgYi0+c2l6ZV8gKiBzaXplb2YoKmItPnN0YXJ0XykpOworICAgIG5ld19iLT5zaXplXyA9IGItPnNpemVfOworICAgIGIgPSBiLT5uZXh0XzsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhc2ggY2hhaW5zCisKK2ludCBWUDhMSGFzaENoYWluSW5pdChWUDhMSGFzaENoYWluKiBjb25zdCBwLCBpbnQgc2l6ZSkgeworICBhc3NlcnQocC0+c2l6ZV8gPT0gMCk7CisgIGFzc2VydChwLT5vZmZzZXRfbGVuZ3RoXyA9PSBOVUxMKTsKKyAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgcC0+b2Zmc2V0X2xlbmd0aF8gPQorICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhzaXplLCBzaXplb2YoKnAtPm9mZnNldF9sZW5ndGhfKSk7CisgIGlmIChwLT5vZmZzZXRfbGVuZ3RoXyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcC0+c2l6ZV8gPSBzaXplOworCisgIHJldHVybiAxOworfQorCit2b2lkIFZQOExIYXNoQ2hhaW5DbGVhcihWUDhMSGFzaENoYWluKiBjb25zdCBwKSB7CisgIGFzc2VydChwICE9IE5VTEwpOworICBXZWJQU2FmZUZyZWUocC0+b2Zmc2V0X2xlbmd0aF8pOworCisgIHAtPnNpemVfID0gMDsKKyAgcC0+b2Zmc2V0X2xlbmd0aF8gPSBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEhBU0hfTVVMVElQTElFUl9ISSAoMHhjNmE0YTc5M1UpCisjZGVmaW5lIEhBU0hfTVVMVElQTElFUl9MTyAoMHg1YmQxZTk5NlUpCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRQaXhQYWlySGFzaDY0KGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiKSB7CisgIHVpbnQzMl90IGtleTsKKyAga2V5ICA9IGFyZ2JbMV0gKiBIQVNIX01VTFRJUExJRVJfSEk7CisgIGtleSArPSBhcmdiWzBdICogSEFTSF9NVUxUSVBMSUVSX0xPOworICBrZXkgPSBrZXkgPj4gKDMyIC0gSEFTSF9CSVRTKTsKKyAgcmV0dXJuIGtleTsKK30KKworLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaGFzaCBjaGFpbiBsb29rdXBzIHRvIGRvIGZvciBhCisvLyBnaXZlbiBjb21wcmVzc2lvbiBxdWFsaXR5LiBSZXR1cm4gdmFsdWUgaW4gcmFuZ2UgWzgsIDg2XS4KK3N0YXRpYyBpbnQgR2V0TWF4SXRlcnNGb3JRdWFsaXR5KGludCBxdWFsaXR5KSB7CisgIHJldHVybiA4ICsgKHF1YWxpdHkgKiBxdWFsaXR5KSAvIDEyODsKK30KKworc3RhdGljIGludCBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluKGludCBxdWFsaXR5LCBpbnQgeHNpemUpIHsKKyAgY29uc3QgaW50IG1heF93aW5kb3dfc2l6ZSA9IChxdWFsaXR5ID4gNzUpID8gV0lORE9XX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChxdWFsaXR5ID4gNTApID8gKHhzaXplIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocXVhbGl0eSA+IDI1KSA/ICh4c2l6ZSA8PCA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHhzaXplIDw8IDQpOworICBhc3NlcnQoeHNpemUgPiAwKTsKKyAgcmV0dXJuIChtYXhfd2luZG93X3NpemUgPiBXSU5ET1dfU0laRSkgPyBXSU5ET1dfU0laRSA6IG1heF93aW5kb3dfc2l6ZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBNYXhGaW5kQ29weUxlbmd0aChpbnQgbGVuKSB7CisgIHJldHVybiAobGVuIDwgTUFYX0xFTkdUSCkgPyBsZW4gOiBNQVhfTEVOR1RIOworfQorCitpbnQgVlA4TEhhc2hDaGFpbkZpbGwoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCB4c2l6ZSwgaW50IHlzaXplKSB7CisgIGNvbnN0IGludCBzaXplID0geHNpemUgKiB5c2l6ZTsKKyAgY29uc3QgaW50IGl0ZXJfbWF4ID0gR2V0TWF4SXRlcnNGb3JRdWFsaXR5KHF1YWxpdHkpOworICBjb25zdCBpbnQgaXRlcl9taW4gPSBpdGVyX21heCAtIHF1YWxpdHkgLyAxMDsKKyAgY29uc3QgdWludDMyX3Qgd2luZG93X3NpemUgPSBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluKHF1YWxpdHksIHhzaXplKTsKKyAgaW50IHBvczsKKyAgdWludDMyX3QgYmFzZV9wb3NpdGlvbjsKKyAgaW50MzJfdCogaGFzaF90b19maXJzdF9pbmRleDsKKyAgLy8gVGVtcG9yYXJpbHkgdXNlIHRoZSBwLT5vZmZzZXRfbGVuZ3RoXyBhcyBhIGhhc2ggY2hhaW4uCisgIGludDMyX3QqIGNoYWluID0gKGludDMyX3QqKXAtPm9mZnNldF9sZW5ndGhfOworICBhc3NlcnQocC0+c2l6ZV8gIT0gMCk7CisgIGFzc2VydChwLT5vZmZzZXRfbGVuZ3RoXyAhPSBOVUxMKTsKKworICBoYXNoX3RvX2ZpcnN0X2luZGV4ID0KKyAgICAgIChpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhIQVNIX1NJWkUsIHNpemVvZigqaGFzaF90b19maXJzdF9pbmRleCkpOworICBpZiAoaGFzaF90b19maXJzdF9pbmRleCA9PSBOVUxMKSByZXR1cm4gMDsKKworICAvLyBTZXQgdGhlIGludDMyX3QgYXJyYXkgdG8gLTEuCisgIG1lbXNldChoYXNoX3RvX2ZpcnN0X2luZGV4LCAweGZmLCBIQVNIX1NJWkUgKiBzaXplb2YoKmhhc2hfdG9fZmlyc3RfaW5kZXgpKTsKKyAgLy8gRmlsbCB0aGUgY2hhaW4gbGlua2luZyBwaXhlbHMgd2l0aCB0aGUgc2FtZSBoYXNoLgorICBmb3IgKHBvcyA9IDA7IHBvcyA8IHNpemUgLSAxOyArK3BvcykgeworICAgIGNvbnN0IHVpbnQzMl90IGhhc2hfY29kZSA9IEdldFBpeFBhaXJIYXNoNjQoYXJnYiArIHBvcyk7CisgICAgY2hhaW5bcG9zXSA9IGhhc2hfdG9fZmlyc3RfaW5kZXhbaGFzaF9jb2RlXTsKKyAgICBoYXNoX3RvX2ZpcnN0X2luZGV4W2hhc2hfY29kZV0gPSBwb3M7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGhhc2hfdG9fZmlyc3RfaW5kZXgpOworCisgIC8vIEZpbmQgdGhlIGJlc3QgbWF0Y2ggaW50ZXJ2YWwgYXQgZWFjaCBwaXhlbCwgZGVmaW5lZCBieSBhbiBvZmZzZXQgdG8gdGhlCisgIC8vIHBpeGVsIGFuZCBhIGxlbmd0aC4gVGhlIHJpZ2h0LW1vc3QgcGl4ZWwgY2Fubm90IG1hdGNoIGFueXRoaW5nIHRvIHRoZSByaWdodAorICAvLyAoaGVuY2UgYSBiZXN0IGxlbmd0aCBvZiAwKSBhbmQgdGhlIGxlZnQtbW9zdCBwaXhlbCBub3RoaW5nIHRvIHRoZSBsZWZ0CisgIC8vIChoZW5jZSBhbiBvZmZzZXQgb2YgMCkuCisgIHAtPm9mZnNldF9sZW5ndGhfWzBdID0gcC0+b2Zmc2V0X2xlbmd0aF9bc2l6ZSAtIDFdID0gMDsKKyAgZm9yIChiYXNlX3Bvc2l0aW9uID0gc2l6ZSAtIDIgPCAwID8gMCA6IHNpemUgLSAyOyBiYXNlX3Bvc2l0aW9uID4gMDspIHsKKyAgICBjb25zdCBpbnQgbWF4X2xlbiA9IE1heEZpbmRDb3B5TGVuZ3RoKHNpemUgLSAxIC0gYmFzZV9wb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc3RhcnQgPSBhcmdiICsgYmFzZV9wb3NpdGlvbjsKKyAgICBpbnQgaXRlciA9IGl0ZXJfbWF4OworICAgIGludCBiZXN0X2xlbmd0aCA9IDA7CisgICAgdWludDMyX3QgYmVzdF9kaXN0YW5jZSA9IDA7CisgICAgY29uc3QgaW50IG1pbl9wb3MgPQorICAgICAgICAoYmFzZV9wb3NpdGlvbiA+IHdpbmRvd19zaXplKSA/IGJhc2VfcG9zaXRpb24gLSB3aW5kb3dfc2l6ZSA6IDA7CisgICAgY29uc3QgaW50IGxlbmd0aF9tYXggPSAobWF4X2xlbiA8IDI1NikgPyBtYXhfbGVuIDogMjU2OworICAgIHVpbnQzMl90IG1heF9iYXNlX3Bvc2l0aW9uOworCisgICAgZm9yIChwb3MgPSBjaGFpbltiYXNlX3Bvc2l0aW9uXTsgcG9zID49IG1pbl9wb3M7IHBvcyA9IGNoYWluW3Bvc10pIHsKKyAgICAgIGludCBjdXJyX2xlbmd0aDsKKyAgICAgIGlmICgtLWl0ZXIgPCAwKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYXNzZXJ0KGJhc2VfcG9zaXRpb24gPiAodWludDMyX3QpcG9zKTsKKworICAgICAgY3Vycl9sZW5ndGggPQorICAgICAgICAgIEZpbmRNYXRjaExlbmd0aChhcmdiICsgcG9zLCBhcmdiX3N0YXJ0LCBiZXN0X2xlbmd0aCwgbWF4X2xlbik7CisgICAgICBpZiAoYmVzdF9sZW5ndGggPCBjdXJyX2xlbmd0aCkgeworICAgICAgICBiZXN0X2xlbmd0aCA9IGN1cnJfbGVuZ3RoOworICAgICAgICBiZXN0X2Rpc3RhbmNlID0gYmFzZV9wb3NpdGlvbiAtIHBvczsKKyAgICAgICAgLy8gU3RvcCBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIG1heGltdW0gbGVuZ3RoLiBPdGhlcndpc2UsIG1ha2Ugc3VyZQorICAgICAgICAvLyB3ZSBoYXZlIGV4ZWN1dGVkIGEgbWluaW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIC8vIHF1YWxpdHkuCisgICAgICAgIGlmICgoYmVzdF9sZW5ndGggPT0gTUFYX0xFTkdUSCkgfHwKKyAgICAgICAgICAgIChjdXJyX2xlbmd0aCA+PSBsZW5ndGhfbWF4ICYmIGl0ZXIgPCBpdGVyX21pbikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBXZSBoYXZlIHRoZSBiZXN0IG1hdGNoIGJ1dCBpbiBjYXNlIHRoZSB0d28gaW50ZXJ2YWxzIGNvbnRpbnVlIG1hdGNoaW5nCisgICAgLy8gdG8gdGhlIGxlZnQsIHdlIGhhdmUgdGhlIGJlc3QgbWF0Y2hlcyBmb3IgdGhlIGxlZnQtZXh0ZW5kZWQgcGl4ZWxzLgorICAgIG1heF9iYXNlX3Bvc2l0aW9uID0gYmFzZV9wb3NpdGlvbjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgYXNzZXJ0KGJlc3RfbGVuZ3RoIDw9IE1BWF9MRU5HVEgpOworICAgICAgYXNzZXJ0KGJlc3RfZGlzdGFuY2UgPD0gV0lORE9XX1NJWkUpOworICAgICAgcC0+b2Zmc2V0X2xlbmd0aF9bYmFzZV9wb3NpdGlvbl0gPQorICAgICAgICAgIChiZXN0X2Rpc3RhbmNlIDw8IE1BWF9MRU5HVEhfQklUUykgfCAodWludDMyX3QpYmVzdF9sZW5ndGg7CisgICAgICAtLWJhc2VfcG9zaXRpb247CisgICAgICAvLyBTdG9wIGlmIHdlIGRvbid0IGhhdmUgYSBtYXRjaCBvciBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcy4KKyAgICAgIGlmIChiZXN0X2Rpc3RhbmNlID09IDAgfHwgYmFzZV9wb3NpdGlvbiA9PSAwKSBicmVhazsKKyAgICAgIC8vIFN0b3AgaWYgd2UgY2Fubm90IGV4dGVuZCB0aGUgbWF0Y2hpbmcgaW50ZXJ2YWxzIHRvIHRoZSBsZWZ0LgorICAgICAgaWYgKGJhc2VfcG9zaXRpb24gPCBiZXN0X2Rpc3RhbmNlIHx8CisgICAgICAgICAgYXJnYltiYXNlX3Bvc2l0aW9uIC0gYmVzdF9kaXN0YW5jZV0gIT0gYXJnYltiYXNlX3Bvc2l0aW9uXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIFN0b3AgaWYgd2UgYXJlIG1hdGNoaW5nIGF0IGl0cyBsaW1pdCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGEgY2xvc2VyCisgICAgICAvLyBtYXRjaGluZyBpbnRlcnZhbCB3aXRoIHRoZSBzYW1lIG1heGltdW0gbGVuZ3RoLiBUaGVuIGFnYWluLCBpZiB0aGUKKyAgICAgIC8vIG1hdGNoaW5nIGludGVydmFsIGlzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIChiZXN0X2Rpc3RhbmNlID09IDEpLCB3ZSB3aWxsCisgICAgICAvLyBuZXZlciBmaW5kIGFueXRoaW5nIGJldHRlciBzbyBsZXQncyBjb250aW51ZS4KKyAgICAgIGlmIChiZXN0X2xlbmd0aCA9PSBNQVhfTEVOR1RIICYmIGJlc3RfZGlzdGFuY2UgIT0gMSAmJgorICAgICAgICAgIGJhc2VfcG9zaXRpb24gKyBNQVhfTEVOR1RIIDwgbWF4X2Jhc2VfcG9zaXRpb24pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYmVzdF9sZW5ndGggPCBNQVhfTEVOR1RIKSB7CisgICAgICAgICsrYmVzdF9sZW5ndGg7CisgICAgICAgIG1heF9iYXNlX3Bvc2l0aW9uID0gYmFzZV9wb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgSGFzaENoYWluRmluZE9mZnNldChjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXNlX3Bvc2l0aW9uKSB7CisgIHJldHVybiBwLT5vZmZzZXRfbGVuZ3RoX1tiYXNlX3Bvc2l0aW9uXSA+PiBNQVhfTEVOR1RIX0JJVFM7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgSGFzaENoYWluRmluZExlbmd0aChjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXNlX3Bvc2l0aW9uKSB7CisgIHJldHVybiBwLT5vZmZzZXRfbGVuZ3RoX1tiYXNlX3Bvc2l0aW9uXSAmICgoMVUgPDwgTUFYX0xFTkdUSF9CSVRTKSAtIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIYXNoQ2hhaW5GaW5kQ29weShjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2VfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IG9mZnNldF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlbmd0aF9wdHIpIHsKKyAgKm9mZnNldF9wdHIgPSBIYXNoQ2hhaW5GaW5kT2Zmc2V0KHAsIGJhc2VfcG9zaXRpb24pOworICAqbGVuZ3RoX3B0ciA9IEhhc2hDaGFpbkZpbmRMZW5ndGgocCwgYmFzZV9wb3NpdGlvbik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFkZFNpbmdsZUxpdGVyYWwodWludDMyX3QgcGl4ZWwsIGludCB1c2VfY29sb3JfY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBoYXNoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIFBpeE9yQ29weSB2OworICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgY29uc3QgdWludDMyX3Qga2V5ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleChoYXNoZXJzLCBwaXhlbCk7CisgICAgaWYgKFZQOExDb2xvckNhY2hlTG9va3VwKGhhc2hlcnMsIGtleSkgPT0gcGl4ZWwpIHsKKyAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChrZXkpOworICAgIH0gZWxzZSB7CisgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXhlbCk7CisgICAgICBWUDhMQ29sb3JDYWNoZVNldChoYXNoZXJzLCBrZXksIHBpeGVsKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOworICB9CisgIEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCB2KTsKK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNSbGUoaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9iaXRzLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOworICBpbnQgaSwgazsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJiAhVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKSkgeworICAgIHJldHVybiAwOworICB9CisgIENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiWzBdLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgaSA9IDE7CisgIHdoaWxlIChpIDwgcGl4X2NvdW50KSB7CisgICAgY29uc3QgaW50IG1heF9sZW4gPSBNYXhGaW5kQ29weUxlbmd0aChwaXhfY291bnQgLSBpKTsKKyAgICBjb25zdCBpbnQga01pbkxlbmd0aCA9IDQ7CisgICAgY29uc3QgaW50IHJsZV9sZW4gPSBGaW5kTWF0Y2hMZW5ndGgoYXJnYiArIGksIGFyZ2IgKyBpIC0gMSwgMCwgbWF4X2xlbik7CisgICAgY29uc3QgaW50IHByZXZfcm93X2xlbiA9IChpIDwgeHNpemUpID8gMCA6CisgICAgICAgIEZpbmRNYXRjaExlbmd0aChhcmdiICsgaSwgYXJnYiArIGkgLSB4c2l6ZSwgMCwgbWF4X2xlbik7CisgICAgaWYgKHJsZV9sZW4gPj0gcHJldl9yb3dfbGVuICYmIHJsZV9sZW4gPj0ga01pbkxlbmd0aCkgeworICAgICAgQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIFBpeE9yQ29weUNyZWF0ZUNvcHkoMSwgcmxlX2xlbikpOworICAgICAgLy8gV2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUgdGhlIGNvbG9yIGNhY2hlIGhlcmUgc2luY2UgaXQgaXMgYWx3YXlzIHRoZQorICAgICAgLy8gc2FtZSBwaXhlbCBiZWluZyBjb3BpZWQsIGFuZCB0aGF0IGRvZXMgbm90IGNoYW5nZSB0aGUgY29sb3IgY2FjaGUKKyAgICAgIC8vIHN0YXRlLgorICAgICAgaSArPSBybGVfbGVuOworICAgIH0gZWxzZSBpZiAocHJldl9yb3dfbGVuID49IGtNaW5MZW5ndGgpIHsKKyAgICAgIEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KHhzaXplLCBwcmV2X3Jvd19sZW4pKTsKKyAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHByZXZfcm93X2xlbjsgKytrKSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaSArIGtdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaSArPSBwcmV2X3Jvd19sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZFNpbmdsZUxpdGVyYWwoYXJnYltpXSwgdXNlX2NvbG9yX2NhY2hlLCAmaGFzaGVycywgcmVmcyk7CisgICAgICBpKys7CisgICAgfQorICB9CisgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gIXJlZnMtPmVycm9yXzsKK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNMejc3KGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgaW50IGk7CisgIGludCBpX2xhc3RfY2hlY2sgPSAtMTsKKyAgaW50IG9rID0gMDsKKyAgaW50IGNjX2luaXQgPSAwOworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorICBDbGVhckJhY2t3YXJkUmVmcyhyZWZzKTsKKyAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDspIHsKKyAgICAvLyBBbHRlcm5hdGl2ZSMxOiBDb2RlIHRoZSBwaXhlbHMgc3RhcnRpbmcgYXQgJ2knIHVzaW5nIGJhY2t3YXJkIHJlZmVyZW5jZS4KKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgbGVuID0gMDsKKyAgICBpbnQgajsKKyAgICBIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCAmb2Zmc2V0LCAmbGVuKTsKKyAgICBpZiAobGVuID4gTUlOX0xFTkdUSCArIDEpIHsKKyAgICAgIGNvbnN0IGludCBsZW5faW5pID0gbGVuOworICAgICAgaW50IG1heF9yZWFjaCA9IDA7CisgICAgICBhc3NlcnQoaSArIGxlbiA8IHBpeF9jb3VudCk7CisgICAgICAvLyBPbmx5IHN0YXJ0IGZyb20gd2hhdCB3ZSBoYXZlIG5vdCBjaGVja2VkIGFscmVhZHkuCisgICAgICBpX2xhc3RfY2hlY2sgPSAoaSA+IGlfbGFzdF9jaGVjaykgPyBpIDogaV9sYXN0X2NoZWNrOworICAgICAgLy8gV2Uga25vdyB0aGUgYmVzdCBtYXRjaCBmb3IgdGhlIGN1cnJlbnQgcGl4ZWwgYnV0IHdlIHRyeSB0byBmaW5kIHRoZQorICAgICAgLy8gYmVzdCBtYXRjaGVzIGZvciB0aGUgY3VycmVudCBwaXhlbCBBTkQgdGhlIG5leHQgb25lIGNvbWJpbmVkLgorICAgICAgLy8gVGhlIG5haXZlIG1ldGhvZCB3b3VsZCB1c2UgdGhlIGludGVydmFsczoKKyAgICAgIC8vIFtpLGkrbGVuKSArIFtpK2xlbiwgbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggYXQgaStsZW4pCisgICAgICAvLyB3aGlsZSB3ZSBjaGVjayBpZiB3ZSBjYW4gdXNlOgorICAgICAgLy8gW2ksaikgKHdoZXJlIGo8PWkrbGVuKSArIFtqLCBsZW5ndGggb2YgYmVzdCBtYXRjaCBhdCBqKQorICAgICAgZm9yIChqID0gaV9sYXN0X2NoZWNrICsgMTsgaiA8PSBpICsgbGVuX2luaTsgKytqKSB7CisgICAgICAgIGNvbnN0IGludCBsZW5faiA9IEhhc2hDaGFpbkZpbmRMZW5ndGgoaGFzaF9jaGFpbiwgaik7CisgICAgICAgIGNvbnN0IGludCByZWFjaCA9CisgICAgICAgICAgICBqICsgKGxlbl9qID4gTUlOX0xFTkdUSCArIDEgPyBsZW5faiA6IDEpOyAgLy8gMSBmb3Igc2luZ2xlIGxpdGVyYWwuCisgICAgICAgIGlmIChyZWFjaCA+IG1heF9yZWFjaCkgeworICAgICAgICAgIGxlbiA9IGogLSBpOworICAgICAgICAgIG1heF9yZWFjaCA9IHJlYWNoOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGxlbiA9IDE7CisgICAgfQorICAgIC8vIEdvIHdpdGggbGl0ZXJhbCBvciBiYWNrd2FyZCByZWZlcmVuY2UuCisgICAgYXNzZXJ0KGxlbiA+IDApOworICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgQWRkU2luZ2xlTGl0ZXJhbChhcmdiW2ldLCB1c2VfY29sb3JfY2FjaGUsICZoYXNoZXJzLCByZWZzKTsKKyAgICB9IGVsc2UgeworICAgICAgQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIFBpeE9yQ29weUNyZWF0ZUNvcHkob2Zmc2V0LCBsZW4pKTsKKyAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyBsZW47ICsraikgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2Jbal0pOworICAgICAgfQorICAgIH0KKyAgICBpICs9IGxlbjsKKyAgfQorCisgIG9rID0gIXJlZnMtPmVycm9yXzsKKyBFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZG91YmxlIGFscGhhX1tWQUxVRVNfSU5fQllURV07CisgIGRvdWJsZSByZWRfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGJsdWVfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBkb3VibGUqIGxpdGVyYWxfOworfSBDb3N0TW9kZWw7CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgY2FjaGVfYml0cywgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKKworc3RhdGljIHZvaWQgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCisgICAgaW50IG51bV9zeW1ib2xzLCBjb25zdCB1aW50MzJfdCBwb3B1bGF0aW9uX2NvdW50c1tdLCBkb3VibGUgb3V0cHV0W10pIHsKKyAgdWludDMyX3Qgc3VtID0gMDsKKyAgaW50IG5vbnplcm9zID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7CisgICAgc3VtICs9IHBvcHVsYXRpb25fY291bnRzW2ldOworICAgIGlmIChwb3B1bGF0aW9uX2NvdW50c1tpXSA+IDApIHsKKyAgICAgICsrbm9uemVyb3M7CisgICAgfQorICB9CisgIGlmIChub256ZXJvcyA8PSAxKSB7CisgICAgbWVtc2V0KG91dHB1dCwgMCwgbnVtX3N5bWJvbHMgKiBzaXplb2YoKm91dHB1dCkpOworICB9IGVsc2UgeworICAgIGNvbnN0IGRvdWJsZSBsb2dzdW0gPSBWUDhMRmFzdExvZzIoc3VtKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgeworICAgICAgb3V0cHV0W2ldID0gbG9nc3VtIC0gVlA4TEZhc3RMb2cyKHBvcHVsYXRpb25fY291bnRzW2ldKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBDb3N0TW9kZWxCdWlsZChDb3N0TW9kZWwqIGNvbnN0IG0sIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBvayA9IDA7CisgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtKGNhY2hlX2JpdHMpOworICBpZiAoaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCByZWZzLCBjYWNoZV9iaXRzKTsKKworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhoaXN0by0+cGFsZXR0ZV9jb2RlX2JpdHNfKSwKKyAgICAgIGhpc3RvLT5saXRlcmFsXywgbS0+bGl0ZXJhbF8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+cmVkXywgbS0+cmVkXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLT5ibHVlXywgbS0+Ymx1ZV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by0+YWxwaGFfLCBtLT5hbHBoYV8pOworICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKKyAgICAgIE5VTV9ESVNUQU5DRV9DT0RFUywgaGlzdG8tPmRpc3RhbmNlXywgbS0+ZGlzdGFuY2VfKTsKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExpdGVyYWxDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgdikgeworICByZXR1cm4gbS0+YWxwaGFfW3YgPj4gMjRdICsKKyAgICAgICAgIG0tPnJlZF9bKHYgPj4gMTYpICYgMHhmZl0gKworICAgICAgICAgbS0+bGl0ZXJhbF9bKHYgPj4gOCkgJiAweGZmXSArCisgICAgICAgICBtLT5ibHVlX1t2ICYgMHhmZl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0Q2FjaGVDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgaWR4KSB7CisgIGNvbnN0IGludCBsaXRlcmFsX2lkeCA9IFZBTFVFU19JTl9CWVRFICsgTlVNX0xFTkdUSF9DT0RFUyArIGlkeDsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW2xpdGVyYWxfaWR4XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRMZW5ndGhDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaW50IGNvZGUsIGV4dHJhX2JpdHM7CisgIFZQOExQcmVmaXhFbmNvZGVCaXRzKGxlbmd0aCwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgcmV0dXJuIG0tPmxpdGVyYWxfW1ZBTFVFU19JTl9CWVRFICsgY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldERpc3RhbmNlQ29zdChjb25zdCBDb3N0TW9kZWwqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaXN0YW5jZSkgeworICBpbnQgY29kZSwgZXh0cmFfYml0czsKKyAgVlA4TFByZWZpeEVuY29kZUJpdHMoZGlzdGFuY2UsICZjb2RlLCAmZXh0cmFfYml0cyk7CisgIHJldHVybiBtLT5kaXN0YW5jZV9bY29kZV0gKyBleHRyYV9iaXRzOworfQorCitzdGF0aWMgdm9pZCBBZGRTaW5nbGVMaXRlcmFsV2l0aENvc3RNb2RlbChjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBoYXNoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCwgaW50IHVzZV9jb2xvcl9jYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwcmV2X2Nvc3QsIGZsb2F0KiBjb25zdCBjb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGRpc3RfYXJyYXkpIHsKKyAgZG91YmxlIGNvc3RfdmFsID0gcHJldl9jb3N0OworICBjb25zdCB1aW50MzJfdCBjb2xvciA9IGFyZ2JbMF07CisgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucyhoYXNoZXJzLCBjb2xvcikpIHsKKyAgICBjb25zdCBkb3VibGUgbXVsMCA9IDAuNjg7CisgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleChoYXNoZXJzLCBjb2xvcik7CisgICAgY29zdF92YWwgKz0gR2V0Q2FjaGVDb3N0KGNvc3RfbW9kZWwsIGl4KSAqIG11bDA7CisgIH0gZWxzZSB7CisgICAgY29uc3QgZG91YmxlIG11bDEgPSAwLjgyOworICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlSW5zZXJ0KGhhc2hlcnMsIGNvbG9yKTsKKyAgICBjb3N0X3ZhbCArPSBHZXRMaXRlcmFsQ29zdChjb3N0X21vZGVsLCBjb2xvcikgKiBtdWwxOworICB9CisgIGlmIChjb3N0W2lkeF0gPiBjb3N0X3ZhbCkgeworICAgIGNvc3RbaWR4XSA9IChmbG9hdCljb3N0X3ZhbDsKKyAgICBkaXN0X2FycmF5W2lkeF0gPSAxOyAgLy8gb25seSBvbmUgaXMgaW5zZXJ0ZWQuCisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvc3RNYW5hZ2VyIGFuZCBpbnRlcnZhbCBoYW5kbGluZworCisvLyBFbXBpcmljYWwgdmFsdWUgdG8gYXZvaWQgaGlnaCBtZW1vcnkgY29uc3VtcHRpb24gYnV0IGdvb2QgZm9yIHBlcmZvcm1hbmNlLgorI2RlZmluZSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYIDEwMAorCisvLyBUbyBwZXJmb3JtIGJhY2t3YXJkIHJlZmVyZW5jZSBldmVyeSBwaXhlbCBhdCBpbmRleCBpbmRleF8gaXMgY29uc2lkZXJlZCBhbmQKKy8vIHRoZSBjb3N0IGZvciB0aGUgTUFYX0xFTkdUSCBmb2xsb3dpbmcgcGl4ZWxzIGNvbXB1dGVkLiBUaG9zZSBmb2xsb3dpbmcgcGl4ZWxzCisvLyBhdCBpbmRleCBpbmRleF8gKyBrIChrIGZyb20gMCB0byBNQVhfTEVOR1RIKSBoYXZlIGEgY29zdCBvZjoKKy8vICAgICBkaXN0YW5jZV9jb3N0XyBhdCBpbmRleF8gKyBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspCisvLyAgICAgICAgICAgIChuYW1lZCBjb3N0KSAgICAgICAgICAgIChuYW1lZCBjYWNoZWQgY29zdCkKKy8vIGFuZCB0aGUgbWluaW11bSB2YWx1ZSBpcyBrZXB0LiBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspIGlzIGNhY2hlZCBpbiBhbgorLy8gYXJyYXkgb2Ygc2l6ZSBNQVhfTEVOR1RILgorLy8gSW5zdGVhZCBvZiBwZXJmb3JtaW5nIE1BWF9MRU5HVEggY29tcGFyaXNvbnMgcGVyIHBpeGVsLCB3ZSBrZWVwIHRyYWNrIG9mIHRoZQorLy8gbWluaW1hbCB2YWx1ZXMgdXNpbmcgaW50ZXJ2YWxzLCBmb3Igd2hpY2ggbG93ZXJfIGFuZCB1cHBlcl8gYm91bmRzIGFyZSBrZXB0LgorLy8gQW4gaW50ZXJ2YWwgaXMgZGVmaW5lZCBieSB0aGUgaW5kZXhfIG9mIHRoZSBwaXhlbCB0aGF0IGdlbmVyYXRlZCBpdCBhbmQKKy8vIGlzIG9ubHkgdXNlZnVsIGluIGEgcmFuZ2Ugb2YgaW5kaWNlcyBmcm9tIHN0YXJ0XyB0byBlbmRfIChleGNsdXNpdmUpLCBpLmUuCisvLyBpdCBjb250YWlucyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgcGl4ZWxzIGJldHdlZW4gc3RhcnRfIGFuZCBlbmRfLgorLy8gSW50ZXJ2YWxzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBhbmQgb3JkZXJlZCBieSBzdGFydF8uIFdoZW4gYSBuZXcKKy8vIGludGVydmFsIGhhcyBhIGJldHRlciBtaW5pbXVtLCBvbGQgaW50ZXJ2YWxzIGFyZSBzcGxpdCBvciByZW1vdmVkLgordHlwZWRlZiBzdHJ1Y3QgQ29zdEludGVydmFsIENvc3RJbnRlcnZhbDsKK3N0cnVjdCBDb3N0SW50ZXJ2YWwgeworICBkb3VibGUgbG93ZXJfOworICBkb3VibGUgdXBwZXJfOworICBpbnQgc3RhcnRfOworICBpbnQgZW5kXzsKKyAgZG91YmxlIGRpc3RhbmNlX2Nvc3RfOworICBpbnQgaW5kZXhfOworICBDb3N0SW50ZXJ2YWwqIHByZXZpb3VzXzsKKyAgQ29zdEludGVydmFsKiBuZXh0XzsKK307CisKKy8vIFRoZSBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspIHBhcnQgb2YgdGhlIGNvc3RzIGlzIGFsc28gYm91bmRlZCBmb3IKKy8vIGVmZmljaWVuY3kgaW4gYSBzZXQgb2YgaW50ZXJ2YWxzIG9mIGEgZGlmZmVyZW50IHR5cGUuCisvLyBJZiB0aG9zZSBpbnRlcnZhbHMgYXJlIHNtYWxsIGVub3VnaCwgdGhleSBhcmUgbm90IHVzZWQgZm9yIGNvbXBhcmlzb24gYW5kCisvLyB3cml0dGVuIGludG8gdGhlIGNvc3RzIHJpZ2h0IGF3YXkuCit0eXBlZGVmIHN0cnVjdCB7CisgIGRvdWJsZSBsb3dlcl87ICAvLyBMb3dlciBib3VuZCBvZiB0aGUgaW50ZXJ2YWwuCisgIGRvdWJsZSB1cHBlcl87ICAvLyBVcHBlciBib3VuZCBvZiB0aGUgaW50ZXJ2YWwuCisgIGludCBzdGFydF87CisgIGludCBlbmRfOyAgICAgICAvLyBFeGNsdXNpdmUuCisgIGludCBkb193cml0ZV87ICAvLyBJZiAhPTAsIHRoZSBpbnRlcnZhbCBpcyBzYXZlZCB0byBjb3N0IGluc3RlYWQgb2YgYmVpbmcga2VwdAorICAgICAgICAgICAgICAgICAgLy8gZm9yIGNvbXBhcmlzb24uCit9IENvc3RDYWNoZUludGVydmFsOworCisvLyBUaGlzIHN0cnVjdHVyZSBpcyBpbiBjaGFyZ2Ugb2YgbWFuYWdpbmcgaW50ZXJ2YWxzIGFuZCBjb3N0cy4KKy8vIEl0IGNhY2hlcyB0aGUgZGlmZmVyZW50IENvc3RDYWNoZUludGVydmFsLCBjYWNoZXMgdGhlIGRpZmZlcmVudAorLy8gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBpbiBjb3N0X2NhY2hlXyBhbmQgdGhlIENvc3RJbnRlcnZhbCdzICh3aG9zZQorLy8gY291bnRfIGlzIGxpbWl0ZWQgYnkgQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWCkuCisjZGVmaW5lIENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNUIDEwCit0eXBlZGVmIHN0cnVjdCB7CisgIENvc3RJbnRlcnZhbCogaGVhZF87CisgIGludCBjb3VudF87ICAvLyBUaGUgbnVtYmVyIG9mIHN0b3JlZCBpbnRlcnZhbHMuCisgIENvc3RDYWNoZUludGVydmFsKiBjYWNoZV9pbnRlcnZhbHNfOworICBzaXplX3QgY2FjaGVfaW50ZXJ2YWxzX3NpemVfOworICBkb3VibGUgY29zdF9jYWNoZV9bTUFYX0xFTkdUSF07ICAvLyBDb250YWlucyB0aGUgR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKS4KKyAgZG91YmxlIG1pbl9jb3N0X2NhY2hlXzsgICAgICAgICAgLy8gVGhlIG1pbmltdW0gdmFsdWUgaW4gY29zdF9jYWNoZV9bMTpdLgorICBkb3VibGUgbWF4X2Nvc3RfY2FjaGVfOyAgICAgICAgICAvLyBUaGUgbWF4aW11bSB2YWx1ZSBpbiBjb3N0X2NhY2hlX1sxOl0uCisgIGZsb2F0KiBjb3N0c187CisgIHVpbnQxNl90KiBkaXN0X2FycmF5XzsKKyAgLy8gTW9zdCBvZiB0aGUgdGltZSwgd2Ugb25seSBuZWVkIGZldyBpbnRlcnZhbHMgLT4gdXNlIGEgZnJlZS1saXN0LCB0byBhdm9pZAorICAvLyBmcmFnbWVudGF0aW9uIHdpdGggc21hbGwgYWxsb2NzIGluIG1vc3QgY29tbW9uIGNhc2VzLgorICBDb3N0SW50ZXJ2YWwgaW50ZXJ2YWxzX1tDT1NUX01BTkFHRVJfTUFYX0ZSRUVfTElTVF07CisgIENvc3RJbnRlcnZhbCogZnJlZV9pbnRlcnZhbHNfOworICAvLyBUaGVzZSBhcmUgcmVndWxhcmx5IG1hbGxvYydkIHJlbWFpbnMuIFRoaXMgbGlzdCBjYW4ndCBncm93IGxhcmdlciB0aGFuIHRoYW4KKyAgLy8gc2l6ZSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYIC0gQ09TVF9NQU5BR0VSX01BWF9GUkVFX0xJU1QsIG5vdGUuCisgIENvc3RJbnRlcnZhbCogcmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgLy8gQnVmZmVyIHVzZWQgaW4gQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5IHRvIHN0b3JlIHRoZSBlbmRzCisgIC8vIG9mIHRoZSBpbnRlcnZhbHMgdGhhdCBjYW4gaGF2ZSBpbXBhY3RlZCB0aGUgY29zdCBhdCBhIHBpeGVsLgorICBpbnQqIGludGVydmFsX2VuZHNfOworICBpbnQgaW50ZXJ2YWxfZW5kc19zaXplXzsKK30gQ29zdE1hbmFnZXI7CisKK3N0YXRpYyBpbnQgSXNDb3N0Q2FjaGVJbnRlcnZhbFdyaXRhYmxlKGludCBzdGFydCwgaW50IGVuZCkgeworICAvLyAxMDAgaXMgdGhlIGxlbmd0aCBmb3Igd2hpY2ggd2UgY29uc2lkZXIgYW4gaW50ZXJ2YWwgZm9yIGNvbXBhcmlzb24sIGFuZCBub3QKKyAgLy8gZm9yIHdyaXRpbmcuCisgIC8vIFRoZSBmaXJzdCBpbnRlcnZhbHMgYXJlIHZlcnkgc21hbGwgYW5kIGdvIGluIGluY3JlYXNpbmcgc2l6ZS4gVGhpcyBjb25zdGFudAorICAvLyBoZWxwcyBtZXJnaW5nIHRoZW0gaW50byBvbmUgYmlnIGludGVydmFsICh1cCB0byBpbmRleCAxNTAvMjAwIHVzdWFsbHkgZnJvbQorICAvLyB3aGljaCBpbnRlcnZhbHMgc3RhcnQgZ2V0dGluZyBtdWNoIGJpZ2dlcikuCisgIC8vIFRoaXMgdmFsdWUgaXMgZW1waXJpY2FsLgorICByZXR1cm4gKGVuZCAtIHN0YXJ0ICsgMSA8IDEwMCk7Cit9CisKK3N0YXRpYyB2b2lkIENvc3RJbnRlcnZhbEFkZFRvRnJlZUxpc3QoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgaW50ZXJ2YWwtPm5leHRfID0gbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfOworICBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc18gPSBpbnRlcnZhbDsKK30KKworc3RhdGljIGludCBDb3N0SW50ZXJ2YWxJc0luRnJlZUxpc3QoY29uc3QgQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3N0SW50ZXJ2YWwqIGNvbnN0IGludGVydmFsKSB7CisgIHJldHVybiAoaW50ZXJ2YWwgPj0gJm1hbmFnZXItPmludGVydmFsc19bMF0gJiYKKyAgICAgICAgICBpbnRlcnZhbCA8PSAmbWFuYWdlci0+aW50ZXJ2YWxzX1tDT1NUX01BTkFHRVJfTUFYX0ZSRUVfTElTVCAtIDFdKTsKK30KKworc3RhdGljIHZvaWQgQ29zdE1hbmFnZXJJbml0RnJlZUxpc3QoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIpIHsKKyAgaW50IGk7CisgIG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXyA9IE5VTEw7CisgIGZvciAoaSA9IDA7IGkgPCBDT1NUX01BTkFHRVJfTUFYX0ZSRUVfTElTVDsgKytpKSB7CisgICAgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChtYW5hZ2VyLCAmbWFuYWdlci0+aW50ZXJ2YWxzX1tpXSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgRGVsZXRlSW50ZXJ2YWxMaXN0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3RJbnRlcnZhbCogaW50ZXJ2YWwpIHsKKyAgd2hpbGUgKGludGVydmFsICE9IE5VTEwpIHsKKyAgICBjb25zdCBDb3N0SW50ZXJ2YWwqIGNvbnN0IG5leHQgPSBpbnRlcnZhbC0+bmV4dF87CisgICAgaWYgKCFDb3N0SW50ZXJ2YWxJc0luRnJlZUxpc3QobWFuYWdlciwgaW50ZXJ2YWwpKSB7CisgICAgICBXZWJQU2FmZUZyZWUoKHZvaWQqKWludGVydmFsKTsKKyAgICB9ICAvLyBlbHNlOiBkbyBub3RoaW5nCisgICAgaW50ZXJ2YWwgPSBuZXh0OworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvc3RNYW5hZ2VyQ2xlYXIoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIpIHsKKyAgaWYgKG1hbmFnZXIgPT0gTlVMTCkgcmV0dXJuOworCisgIFdlYlBTYWZlRnJlZShtYW5hZ2VyLT5jb3N0c18pOworICBXZWJQU2FmZUZyZWUobWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyk7CisgIFdlYlBTYWZlRnJlZShtYW5hZ2VyLT5pbnRlcnZhbF9lbmRzXyk7CisKKyAgLy8gQ2xlYXIgdGhlIGludGVydmFsIGxpc3RzLgorICBEZWxldGVJbnRlcnZhbExpc3QobWFuYWdlciwgbWFuYWdlci0+aGVhZF8pOworICBtYW5hZ2VyLT5oZWFkXyA9IE5VTEw7CisgIERlbGV0ZUludGVydmFsTGlzdChtYW5hZ2VyLCBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfKTsKKyAgbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyA9IE5VTEw7CisKKyAgLy8gUmVzZXQgcG9pbnRlcnMsIGNvdW50XyBhbmQgY2FjaGVfaW50ZXJ2YWxzX3NpemVfLgorICBtZW1zZXQobWFuYWdlciwgMCwgc2l6ZW9mKCptYW5hZ2VyKSk7CisgIENvc3RNYW5hZ2VySW5pdEZyZWVMaXN0KG1hbmFnZXIpOworfQorCitzdGF0aWMgaW50IENvc3RNYW5hZ2VySW5pdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5LCBpbnQgcGl4X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdE1vZGVsKiBjb25zdCBjb3N0X21vZGVsKSB7CisgIGludCBpOworICBjb25zdCBpbnQgY29zdF9jYWNoZV9zaXplID0gKHBpeF9jb3VudCA+IE1BWF9MRU5HVEgpID8gTUFYX0xFTkdUSCA6IHBpeF9jb3VudDsKKyAgLy8gVGhpcyBjb25zdGFudCBpcyB0aWVkIHRvIHRoZSBjb3N0X21vZGVsIHdlIHVzZS4KKyAgLy8gRW1waXJpY2FsbHksIGRpZmZlcmVuY2VzIGJldHdlZW4gaW50ZXJ2YWxzIGlzIHVzdWFsbHkgb2YgbW9yZSB0aGFuIDEuCisgIGNvbnN0IGRvdWJsZSBtaW5fY29zdF9kaWZmID0gMC4xOworCisgIG1hbmFnZXItPmNvc3RzXyA9IE5VTEw7CisgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc18gPSBOVUxMOworICBtYW5hZ2VyLT5pbnRlcnZhbF9lbmRzXyA9IE5VTEw7CisgIG1hbmFnZXItPmhlYWRfID0gTlVMTDsKKyAgbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyA9IE5VTEw7CisgIG1hbmFnZXItPmNvdW50XyA9IDA7CisgIG1hbmFnZXItPmRpc3RfYXJyYXlfID0gZGlzdF9hcnJheTsKKyAgQ29zdE1hbmFnZXJJbml0RnJlZUxpc3QobWFuYWdlcik7CisKKyAgLy8gRmlsbCBpbiB0aGUgY29zdF9jYWNoZV8uCisgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXyA9IDE7CisgIG1hbmFnZXItPmNvc3RfY2FjaGVfWzBdID0gMDsKKyAgZm9yIChpID0gMTsgaSA8IGNvc3RfY2FjaGVfc2l6ZTsgKytpKSB7CisgICAgbWFuYWdlci0+Y29zdF9jYWNoZV9baV0gPSBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGkpOworICAgIC8vIEdldCBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBudW1iZXIgb2YgYm91bmQgaW50ZXJ2YWxzLgorICAgIGlmIChmYWJzKG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldIC0gbWFuYWdlci0+Y29zdF9jYWNoZV9baSAtIDFdKSA+CisgICAgICAgIG1pbl9jb3N0X2RpZmYpIHsKKyAgICAgICsrbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfOworICAgIH0KKyAgICAvLyBDb21wdXRlIHRoZSBtaW5pbXVtIG9mIGNvc3RfY2FjaGVfLgorICAgIGlmIChpID09IDEpIHsKKyAgICAgIG1hbmFnZXItPm1pbl9jb3N0X2NhY2hlXyA9IG1hbmFnZXItPmNvc3RfY2FjaGVfWzFdOworICAgICAgbWFuYWdlci0+bWF4X2Nvc3RfY2FjaGVfID0gbWFuYWdlci0+Y29zdF9jYWNoZV9bMV07CisgICAgfSBlbHNlIGlmIChtYW5hZ2VyLT5jb3N0X2NhY2hlX1tpXSA8IG1hbmFnZXItPm1pbl9jb3N0X2NhY2hlXykgeworICAgICAgbWFuYWdlci0+bWluX2Nvc3RfY2FjaGVfID0gbWFuYWdlci0+Y29zdF9jYWNoZV9baV07CisgICAgfSBlbHNlIGlmIChtYW5hZ2VyLT5jb3N0X2NhY2hlX1tpXSA+IG1hbmFnZXItPm1heF9jb3N0X2NhY2hlXykgeworICAgICAgbWFuYWdlci0+bWF4X2Nvc3RfY2FjaGVfID0gbWFuYWdlci0+Y29zdF9jYWNoZV9baV07CisgICAgfQorICB9CisKKyAgLy8gV2l0aCB0aGUgY3VycmVudCBjb3N0IG1vZGVscywgd2UgaGF2ZSAxNSBpbnRlcnZhbHMsIHNvIHdlIGFyZSBzYWZlIGJ5CisgIC8vIHNldHRpbmcgYSBtYXhpbXVtIG9mIENPU1RfQ0FDSEVfSU5URVJWQUxfU0laRV9NQVguCisgIGlmIChtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8gPiBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYKSB7CisgICAgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfID0gQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWDsKKyAgfQorICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfID0gKENvc3RDYWNoZUludGVydmFsKilXZWJQU2FmZU1hbGxvYygKKyAgICAgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXywgc2l6ZW9mKCptYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfKSk7CisgIGlmIChtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfID09IE5VTEwpIHsKKyAgICBDb3N0TWFuYWdlckNsZWFyKG1hbmFnZXIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRmlsbCBpbiB0aGUgY2FjaGVfaW50ZXJ2YWxzXy4KKyAgeworICAgIGRvdWJsZSBjb3N0X3ByZXYgPSAtMWUzOGY7ICAvLyB1bnByb2JhYmx5IGxvdyBpbml0aWFsIHZhbHVlCisgICAgQ29zdENhY2hlSW50ZXJ2YWwqIHByZXYgPSBOVUxMOworICAgIENvc3RDYWNoZUludGVydmFsKiBjdXIgPSBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfOworICAgIGNvbnN0IENvc3RDYWNoZUludGVydmFsKiBjb25zdCBlbmQgPQorICAgICAgICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfICsgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfOworCisgICAgLy8gQ29uc2VjdXRpdmUgdmFsdWVzIGluIGNvc3RfY2FjaGVfIGFyZSBjb21wYXJlZCBhbmQgaWYgYSBiaWcgZW5vdWdoCisgICAgLy8gZGlmZmVyZW5jZSBpcyBmb3VuZCwgYSBuZXcgaW50ZXJ2YWwgaXMgY3JlYXRlZCBhbmQgYm91bmRlZC4KKyAgICBmb3IgKGkgPSAwOyBpIDwgY29zdF9jYWNoZV9zaXplOyArK2kpIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBjb3N0X3ZhbCA9IG1hbmFnZXItPmNvc3RfY2FjaGVfW2ldOworICAgICAgaWYgKGkgPT0gMCB8fAorICAgICAgICAgIChmYWJzKGNvc3RfdmFsIC0gY29zdF9wcmV2KSA+IG1pbl9jb3N0X2RpZmYgJiYgY3VyICsgMSA8IGVuZCkpIHsKKyAgICAgICAgaWYgKGkgPiAxKSB7CisgICAgICAgICAgY29uc3QgaW50IGlzX3dyaXRhYmxlID0KKyAgICAgICAgICAgICAgSXNDb3N0Q2FjaGVJbnRlcnZhbFdyaXRhYmxlKGN1ci0+c3RhcnRfLCBjdXItPmVuZF8pOworICAgICAgICAgIC8vIE1lcmdlIHdpdGggdGhlIHByZXZpb3VzIGludGVydmFsIGlmIGJvdGggYXJlIHdyaXRhYmxlLgorICAgICAgICAgIGlmIChpc193cml0YWJsZSAmJiBjdXIgIT0gbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyAmJgorICAgICAgICAgICAgICBwcmV2LT5kb193cml0ZV8pIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW50ZXJ2YWwuCisgICAgICAgICAgICBwcmV2LT5lbmRfID0gY3VyLT5lbmRfOworICAgICAgICAgICAgaWYgKGN1ci0+bG93ZXJfIDwgcHJldi0+bG93ZXJfKSB7CisgICAgICAgICAgICAgIHByZXYtPmxvd2VyXyA9IGN1ci0+bG93ZXJfOworICAgICAgICAgICAgfSBlbHNlIGlmIChjdXItPnVwcGVyXyA+IHByZXYtPnVwcGVyXykgeworICAgICAgICAgICAgICBwcmV2LT51cHBlcl8gPSBjdXItPnVwcGVyXzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3VyLT5kb193cml0ZV8gPSBpc193cml0YWJsZTsKKyAgICAgICAgICAgIHByZXYgPSBjdXI7CisgICAgICAgICAgICArK2N1cjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbiBpbnRlcnZhbC4KKyAgICAgICAgY3VyLT5zdGFydF8gPSBpOworICAgICAgICBjdXItPmRvX3dyaXRlXyA9IDA7CisgICAgICAgIGN1ci0+bG93ZXJfID0gY29zdF92YWw7CisgICAgICAgIGN1ci0+dXBwZXJfID0gY29zdF92YWw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgYm91bmRzLgorICAgICAgICBpZiAoY29zdF92YWwgPCBjdXItPmxvd2VyXykgeworICAgICAgICAgIGN1ci0+bG93ZXJfID0gY29zdF92YWw7CisgICAgICAgIH0gZWxzZSBpZiAoY29zdF92YWwgPiBjdXItPnVwcGVyXykgeworICAgICAgICAgIGN1ci0+dXBwZXJfID0gY29zdF92YWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGN1ci0+ZW5kXyA9IGkgKyAxOworICAgICAgY29zdF9wcmV2ID0gY29zdF92YWw7CisgICAgfQorICAgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXyA9IGN1ciArIDEgLSBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfOworICB9CisKKyAgbWFuYWdlci0+Y29zdHNfID0gKGZsb2F0KilXZWJQU2FmZU1hbGxvYyhwaXhfY291bnQsIHNpemVvZigqbWFuYWdlci0+Y29zdHNfKSk7CisgIGlmIChtYW5hZ2VyLT5jb3N0c18gPT0gTlVMTCkgeworICAgIENvc3RNYW5hZ2VyQ2xlYXIobWFuYWdlcik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gU2V0IHRoZSBpbml0aWFsIGNvc3RzXyBoaWdoIGZvciBldmVyeSBwaXhlbCBhcyB3ZSB3aWxsIGtlZXAgdGhlIG1pbmltdW0uCisgIGZvciAoaSA9IDA7IGkgPCBwaXhfY291bnQ7ICsraSkgbWFuYWdlci0+Y29zdHNfW2ldID0gMWUzOGY7CisKKyAgLy8gVGhlIGNvc3QgYXQgcGl4ZWwgaXMgaW5mbHVlbmNlZCBieSB0aGUgY29zdCBpbnRlcnZhbHMgZnJvbSBwcmV2aW91cyBwaXhlbHMuCisgIC8vIExldCB1cyB0YWtlIHRoZSBzcGVjaWZpYyBjYXNlIHdoZXJlIHRoZSBvZmZzZXQgaXMgdGhlIHNhbWUgKHdoaWNoIGFjdHVhbGx5CisgIC8vIGhhcHBlbnMgYSBsb3QgaW4gY2FzZSBvZiB1bmlmb3JtIHJlZ2lvbnMpLgorICAvLyBwaXhlbCBpIGNvbnRyaWJ1dGVzIHRvIGo+aSBhIGNvc3Qgb2Y6IG9mZnNldCBjb3N0ICsgY29zdF9jYWNoZV9bai1pXQorICAvLyBwaXhlbCBpKzEgY29udHJpYnV0ZXMgdG8gaj5pIGEgY29zdCBvZjogMipvZmZzZXQgY29zdCArIGNvc3RfY2FjaGVfW2otaS0xXQorICAvLyBwaXhlbCBpKzIgY29udHJpYnV0ZXMgdG8gaj5pIGEgY29zdCBvZjogMypvZmZzZXQgY29zdCArIGNvc3RfY2FjaGVfW2otaS0yXQorICAvLyBhbmQgc28gb24uCisgIC8vIEEgcGl4ZWwgaSBpbmZsdWVuY2VzIHRoZSBmb2xsb3dpbmcgbGVuZ3RoKGopIDwgTUFYX0xFTkdUSCBwaXhlbHMuIFdoYXQgaXMKKyAgLy8gdGhlIHZhbHVlIG9mIGogc3VjaCB0aGF0IHBpeGVsIGkgKyBqIGNhbm5vdCBpbmZsdWVuY2UgYW55IG9mIHRob3NlIHBpeGVscz8KKyAgLy8gVGhpcyB2YWx1ZSBpcyBzdWNoIHRoYXQ6CisgIC8vICAgICAgICAgICAgICAgbWF4IG9mIGNvc3RfY2FjaGVfIDwgaipvZmZzZXQgY29zdCArIG1pbiBvZiBjb3N0X2NhY2hlXworICAvLyAocGl4ZWwgaSArIGogJ3MgY29zdCBjYW5ub3QgYmVhdCB0aGUgd29yc3QgY29zdCBnaXZlbiBieSBwaXhlbCBpKS4KKyAgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gb3B0aW1pemUgdGhlIGNvc3QgY29tcHV0YXRpb24gaW4KKyAgLy8gQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5LgorICB7CisgICAgLy8gVGhlIG9mZnNldCBjb3N0IGlzIGNvbXB1dGVkIGluIEdldERpc3RhbmNlQ29zdCBhbmQgaGFzIGEgbWluaW11bSB2YWx1ZSBvZgorICAgIC8vIHRoZSBtaW5pbXVtIGluIGNvc3RfbW9kZWwtPmRpc3RhbmNlXy4gVGhlIGNhc2Ugd2hlcmUgdGhlIG9mZnNldCBjb3N0IGlzIDAKKyAgICAvLyB3aWxsIGJlIGRlYWx0IHdpdGggZGlmZmVyZW50bHkgbGF0ZXIgc28gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUKKyAgICAvLyBtaW5pbXVtIG5vbi16ZXJvIG9mZnNldCBjb3N0LgorICAgIGRvdWJsZSBvZmZzZXRfY29zdF9taW4gPSAwLjsKKyAgICBpbnQgc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0RJU1RBTkNFX0NPREVTOyArK2kpIHsKKyAgICAgIGlmIChjb3N0X21vZGVsLT5kaXN0YW5jZV9baV0gIT0gMCkgeworICAgICAgICBpZiAob2Zmc2V0X2Nvc3RfbWluID09IDAuKSB7CisgICAgICAgICAgb2Zmc2V0X2Nvc3RfbWluID0gY29zdF9tb2RlbC0+ZGlzdGFuY2VfW2ldOworICAgICAgICB9IGVsc2UgaWYgKGNvc3RfbW9kZWwtPmRpc3RhbmNlX1tpXSA8IG9mZnNldF9jb3N0X21pbikgeworICAgICAgICAgIG9mZnNldF9jb3N0X21pbiA9IGNvc3RfbW9kZWwtPmRpc3RhbmNlX1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvLyBJbiBjYXNlIGFsbCB0aGUgY29zdF9tb2RlbC0+ZGlzdGFuY2VfIGlzIDAsIHRoZSBuZXh0IG5vbi16ZXJvIGNvc3Qgd2UKKyAgICAvLyBjYW4gaGF2ZSBpcyBmcm9tIHRoZSBleHRyYSBiaXQgaW4gR2V0RGlzdGFuY2VDb3N0LCBoZW5jZSAxLgorICAgIGlmIChvZmZzZXRfY29zdF9taW4gPCAxLikgb2Zmc2V0X2Nvc3RfbWluID0gMS47CisKKyAgICBzaXplID0gMSArIChpbnQpY2VpbCgobWFuYWdlci0+bWF4X2Nvc3RfY2FjaGVfIC0gbWFuYWdlci0+bWluX2Nvc3RfY2FjaGVfKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X2Nvc3RfbWluKTsKKyAgICAvLyBFbXBpcmljYWxseSwgd2UgdXN1YWxseSBlbmQgdXAgd2l0aCBhIHZhbHVlIGJlbG93IDEwMC4KKyAgICBpZiAoc2l6ZSA+IE1BWF9MRU5HVEgpIHNpemUgPSBNQVhfTEVOR1RIOworCisgICAgbWFuYWdlci0+aW50ZXJ2YWxfZW5kc18gPQorICAgICAgICAoaW50KilXZWJQU2FmZU1hbGxvYyhzaXplLCBzaXplb2YoKm1hbmFnZXItPmludGVydmFsX2VuZHNfKSk7CisgICAgaWYgKG1hbmFnZXItPmludGVydmFsX2VuZHNfID09IE5VTEwpIHsKKyAgICAgIENvc3RNYW5hZ2VyQ2xlYXIobWFuYWdlcik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbWFuYWdlci0+aW50ZXJ2YWxfZW5kc19zaXplXyA9IHNpemU7CisgIH0KKworICByZXR1cm4gMTsKK30KKworLy8gR2l2ZW4gdGhlIGRpc3RhbmNlX2Nvc3QgZm9yIHBpeGVsICdpbmRleCcsIHVwZGF0ZSB0aGUgY29zdCBhdCBwaXhlbCAnaScgaWYgaXQKKy8vIGlzIHNtYWxsZXIgdGhhbiB0aGUgcHJldmlvdXNseSBjb21wdXRlZCB2YWx1ZS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUNvc3QoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsIGludCBpLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZV9jb3N0KSB7CisgIGludCBrID0gaSAtIGluZGV4OworICBkb3VibGUgY29zdF90bXA7CisgIGFzc2VydChrID49IDAgJiYgayA8IE1BWF9MRU5HVEgpOworICBjb3N0X3RtcCA9IGRpc3RhbmNlX2Nvc3QgKyBtYW5hZ2VyLT5jb3N0X2NhY2hlX1trXTsKKworICBpZiAobWFuYWdlci0+Y29zdHNfW2ldID4gY29zdF90bXApIHsKKyAgICBtYW5hZ2VyLT5jb3N0c19baV0gPSAoZmxvYXQpY29zdF90bXA7CisgICAgbWFuYWdlci0+ZGlzdF9hcnJheV9baV0gPSBrICsgMTsKKyAgfQorfQorCisvLyBHaXZlbiB0aGUgZGlzdGFuY2VfY29zdCBmb3IgcGl4ZWwgJ2luZGV4JywgdXBkYXRlIHRoZSBjb3N0IGZvciBhbGwgdGhlIHBpeGVscworLy8gYmV0d2VlbiAnc3RhcnQnIGFuZCAnZW5kJyBleGNsdWRlZC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUNvc3RQZXJJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGlzdGFuY2VfY29zdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkgVXBkYXRlQ29zdChtYW5hZ2VyLCBpLCBpbmRleCwgZGlzdGFuY2VfY29zdCk7Cit9CisKKy8vIEdpdmVuIHR3byBpbnRlcnZhbHMsIG1ha2UgJ3ByZXYnIGJlIHRoZSBwcmV2aW91cyBvbmUgb2YgJ25leHQnIGluICdtYW5hZ2VyJy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbm5lY3RJbnRlcnZhbHMoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBuZXh0KSB7CisgIGlmIChwcmV2ICE9IE5VTEwpIHsKKyAgICBwcmV2LT5uZXh0XyA9IG5leHQ7CisgIH0gZWxzZSB7CisgICAgbWFuYWdlci0+aGVhZF8gPSBuZXh0OworICB9CisKKyAgaWYgKG5leHQgIT0gTlVMTCkgbmV4dC0+cHJldmlvdXNfID0gcHJldjsKK30KKworLy8gUG9wIGFuIGludGVydmFsIGluIHRoZSBtYW5hZ2VyLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUG9wSW50ZXJ2YWwoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGludGVydmFsKSB7CisgIENvc3RJbnRlcnZhbCogY29uc3QgbmV4dCA9IGludGVydmFsLT5uZXh0XzsKKworICBpZiAoaW50ZXJ2YWwgPT0gTlVMTCkgcmV0dXJuOworCisgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgaW50ZXJ2YWwtPnByZXZpb3VzXywgbmV4dCk7CisgIGlmIChDb3N0SW50ZXJ2YWxJc0luRnJlZUxpc3QobWFuYWdlciwgaW50ZXJ2YWwpKSB7CisgICAgQ29zdEludGVydmFsQWRkVG9GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgIH0gZWxzZSB7ICAvLyByZWN5Y2xlIHJlZ3VsYXJseSBtYWxsb2MnZCBpbnRlcnZhbHMgdG9vCisgICAgaW50ZXJ2YWwtPm5leHRfID0gbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXzsKKyAgICBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfID0gaW50ZXJ2YWw7CisgIH0KKyAgLS1tYW5hZ2VyLT5jb3VudF87CisgIGFzc2VydChtYW5hZ2VyLT5jb3VudF8gPj0gMCk7Cit9CisKKy8vIFVwZGF0ZSB0aGUgY29zdCBhdCBpbmRleCBpIGJ5IGdvaW5nIG92ZXIgYWxsIHRoZSBzdG9yZWQgaW50ZXJ2YWxzIHRoYXQKKy8vIG92ZXJsYXAgd2l0aCBpLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlQ29zdFBlckluZGV4KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLCBpbnQgaSkgeworICBDb3N0SW50ZXJ2YWwqIGN1cnJlbnQgPSBtYW5hZ2VyLT5oZWFkXzsKKworICB3aGlsZSAoY3VycmVudCAhPSBOVUxMICYmIGN1cnJlbnQtPnN0YXJ0XyA8PSBpKSB7CisgICAgaWYgKGN1cnJlbnQtPmVuZF8gPD0gaSkgeworICAgICAgLy8gV2UgaGF2ZSBhbiBvdXRkYXRlZCBpbnRlcnZhbCwgcmVtb3ZlIGl0LgorICAgICAgQ29zdEludGVydmFsKiBuZXh0ID0gY3VycmVudC0+bmV4dF87CisgICAgICBQb3BJbnRlcnZhbChtYW5hZ2VyLCBjdXJyZW50KTsKKyAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgIH0gZWxzZSB7CisgICAgICBVcGRhdGVDb3N0KG1hbmFnZXIsIGksIGN1cnJlbnQtPmluZGV4XywgY3VycmVudC0+ZGlzdGFuY2VfY29zdF8pOworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHRfOworICAgIH0KKyAgfQorfQorCisvLyBHaXZlbiBhIGN1cnJlbnQgb3JwaGFuIGludGVydmFsIGFuZCBpdHMgcHJldmlvdXMgaW50ZXJ2YWwsIGJlZm9yZQorLy8gaXQgd2FzIG9ycGhhbmVkICh3aGljaCBjYW4gYmUgTlVMTCksIHNldCBpdCBhdCB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIGxpc3QKKy8vIG9mIGludGVydmFscyB1c2luZyB0aGUgc3RhcnRfIG9yZGVyaW5nIGFuZCB0aGUgcHJldmlvdXMgaW50ZXJ2YWwgYXMgYSBoaW50Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUG9zaXRpb25PcnBoYW5JbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIHByZXZpb3VzKSB7CisgIGFzc2VydChjdXJyZW50ICE9IE5VTEwpOworCisgIGlmIChwcmV2aW91cyA9PSBOVUxMKSBwcmV2aW91cyA9IG1hbmFnZXItPmhlYWRfOworICB3aGlsZSAocHJldmlvdXMgIT0gTlVMTCAmJiBjdXJyZW50LT5zdGFydF8gPCBwcmV2aW91cy0+c3RhcnRfKSB7CisgICAgcHJldmlvdXMgPSBwcmV2aW91cy0+cHJldmlvdXNfOworICB9CisgIHdoaWxlIChwcmV2aW91cyAhPSBOVUxMICYmIHByZXZpb3VzLT5uZXh0XyAhPSBOVUxMICYmCisgICAgICAgICBwcmV2aW91cy0+bmV4dF8tPnN0YXJ0XyA8IGN1cnJlbnQtPnN0YXJ0XykgeworICAgIHByZXZpb3VzID0gcHJldmlvdXMtPm5leHRfOworICB9CisKKyAgaWYgKHByZXZpb3VzICE9IE5VTEwpIHsKKyAgICBDb25uZWN0SW50ZXJ2YWxzKG1hbmFnZXIsIGN1cnJlbnQsIHByZXZpb3VzLT5uZXh0Xyk7CisgIH0gZWxzZSB7CisgICAgQ29ubmVjdEludGVydmFscyhtYW5hZ2VyLCBjdXJyZW50LCBtYW5hZ2VyLT5oZWFkXyk7CisgIH0KKyAgQ29ubmVjdEludGVydmFscyhtYW5hZ2VyLCBwcmV2aW91cywgY3VycmVudCk7Cit9CisKKy8vIEluc2VydCBhbiBpbnRlcnZhbCBpbiB0aGUgbGlzdCBjb250YWluZWQgaW4gdGhlIG1hbmFnZXIgYnkgc3RhcnRpbmcgYXQKKy8vIGludGVydmFsX2luIGFzIGEgaGludC4gVGhlIGludGVydmFscyBhcmUgc29ydGVkIGJ5IHN0YXJ0XyB2YWx1ZS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEluc2VydEludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBpbnRlcnZhbF9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZV9jb3N0LCBkb3VibGUgbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdXBwZXIsIGludCBpbmRleCwgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCkgeworICBDb3N0SW50ZXJ2YWwqIGludGVydmFsX25ldzsKKworICBpZiAoSXNDb3N0Q2FjaGVJbnRlcnZhbFdyaXRhYmxlKHN0YXJ0LCBlbmQpIHx8CisgICAgICBtYW5hZ2VyLT5jb3VudF8gPj0gQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWCkgeworICAgIC8vIFdyaXRlIGRvd24gdGhlIGludGVydmFsIGlmIGl0IGlzIHRvbyBzbWFsbC4KKyAgICBVcGRhdGVDb3N0UGVySW50ZXJ2YWwobWFuYWdlciwgc3RhcnQsIGVuZCwgaW5kZXgsIGRpc3RhbmNlX2Nvc3QpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfICE9IE5VTEwpIHsKKyAgICBpbnRlcnZhbF9uZXcgPSBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc187CisgICAgbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfID0gaW50ZXJ2YWxfbmV3LT5uZXh0XzsKKyAgfSBlbHNlIGlmIChtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfICE9IE5VTEwpIHsKKyAgICBpbnRlcnZhbF9uZXcgPSBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfOworICAgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBpbnRlcnZhbF9uZXctPm5leHRfOworICB9IGVsc2UgeyAgIC8vIG1hbGxvYyBmb3IgZ29vZAorICAgIGludGVydmFsX25ldyA9IChDb3N0SW50ZXJ2YWwqKVdlYlBTYWZlTWFsbG9jKDEsIHNpemVvZigqaW50ZXJ2YWxfbmV3KSk7CisgICAgaWYgKGludGVydmFsX25ldyA9PSBOVUxMKSB7CisgICAgICAvLyBXcml0ZSBkb3duIHRoZSBpbnRlcnZhbCBpZiB3ZSBjYW5ub3QgY3JlYXRlIGl0LgorICAgICAgVXBkYXRlQ29zdFBlckludGVydmFsKG1hbmFnZXIsIHN0YXJ0LCBlbmQsIGluZGV4LCBkaXN0YW5jZV9jb3N0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpbnRlcnZhbF9uZXctPmRpc3RhbmNlX2Nvc3RfID0gZGlzdGFuY2VfY29zdDsKKyAgaW50ZXJ2YWxfbmV3LT5sb3dlcl8gPSBsb3dlcjsKKyAgaW50ZXJ2YWxfbmV3LT51cHBlcl8gPSB1cHBlcjsKKyAgaW50ZXJ2YWxfbmV3LT5pbmRleF8gPSBpbmRleDsKKyAgaW50ZXJ2YWxfbmV3LT5zdGFydF8gPSBzdGFydDsKKyAgaW50ZXJ2YWxfbmV3LT5lbmRfID0gZW5kOworICBQb3NpdGlvbk9ycGhhbkludGVydmFsKG1hbmFnZXIsIGludGVydmFsX25ldywgaW50ZXJ2YWxfaW4pOworCisgICsrbWFuYWdlci0+Y291bnRfOworfQorCisvLyBXaGVuIGFuIGludGVydmFsIGhhcyBpdHMgc3RhcnRfIG9yIGVuZF8gbW9kaWZpZWQsIGl0IG5lZWRzIHRvIGJlCisvLyByZXBvc2l0aW9uZWQgaW4gdGhlIGxpbmtlZCBsaXN0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUmVwb3NpdGlvbkludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWwpIHsKKyAgaWYgKElzQ29zdENhY2hlSW50ZXJ2YWxXcml0YWJsZShpbnRlcnZhbC0+c3RhcnRfLCBpbnRlcnZhbC0+ZW5kXykpIHsKKyAgICAvLyBNYXliZSBpbnRlcnZhbCBoYXMgYmVlbiByZXNpemVkIGFuZCBpcyBzbWFsbCBlbm91Z2ggdG8gYmUgcmVtb3ZlZC4KKyAgICBVcGRhdGVDb3N0UGVySW50ZXJ2YWwobWFuYWdlciwgaW50ZXJ2YWwtPnN0YXJ0XywgaW50ZXJ2YWwtPmVuZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5pbmRleF8sIGludGVydmFsLT5kaXN0YW5jZV9jb3N0Xyk7CisgICAgUG9wSW50ZXJ2YWwobWFuYWdlciwgaW50ZXJ2YWwpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEVhcmx5IGV4aXQgaWYgaW50ZXJ2YWwgaXMgYXQgdGhlIHJpZ2h0IHNwb3QuCisgIGlmICgoaW50ZXJ2YWwtPnByZXZpb3VzXyA9PSBOVUxMIHx8CisgICAgICAgaW50ZXJ2YWwtPnByZXZpb3VzXy0+c3RhcnRfIDw9IGludGVydmFsLT5zdGFydF8pICYmCisgICAgICAoaW50ZXJ2YWwtPm5leHRfID09IE5VTEwgfHwKKyAgICAgICBpbnRlcnZhbC0+c3RhcnRfIDw9IGludGVydmFsLT5uZXh0Xy0+c3RhcnRfKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgaW50ZXJ2YWwtPnByZXZpb3VzXywgaW50ZXJ2YWwtPm5leHRfKTsKKyAgUG9zaXRpb25PcnBoYW5JbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCwgaW50ZXJ2YWwtPnByZXZpb3VzXyk7Cit9CisKKy8vIEdpdmVuIGEgbmV3IGNvc3QgaW50ZXJ2YWwgZGVmaW5lZCBieSBpdHMgc3RhcnQgYXQgaW5kZXgsIGl0cyBsYXN0IHZhbHVlIGFuZAorLy8gZGlzdGFuY2VfY29zdCwgYWRkIGl0cyBjb250cmlidXRpb25zIHRvIHRoZSBwcmV2aW91cyBpbnRlcnZhbHMgYW5kIGNvc3RzLgorLy8gSWYgaGFuZGxpbmcgdGhlIGludGVydmFsIG9yIG9uZSBvZiBpdHMgc3ViaW50ZXJ2YWxzIGJlY29tZXMgdG8gaGVhdnksIGl0cworLy8gY29udHJpYnV0aW9uIGlzIGFkZGVkIHRvIHRoZSBjb3N0cyByaWdodCBhd2F5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHVzaEludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0YW5jZV9jb3N0LCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3QpIHsKKyAgc2l6ZV90IGk7CisgIENvc3RJbnRlcnZhbCogaW50ZXJ2YWwgPSBtYW5hZ2VyLT5oZWFkXzsKKyAgQ29zdEludGVydmFsKiBpbnRlcnZhbF9uZXh0OworICBjb25zdCBDb3N0Q2FjaGVJbnRlcnZhbCogY29uc3QgY29zdF9jYWNoZV9pbnRlcnZhbHMgPQorICAgICAgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXzsKKworICBmb3IgKGkgPSAwOyBpIDwgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfICYmCisgICAgICAgICAgICAgIGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLnN0YXJ0XyA8IGxhc3Q7CisgICAgICAgKytpKSB7CisgICAgLy8gRGVmaW5lIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGl0aCBpbnRlcnZhbCB3aXRoIHRoZSBuZXcgb25lLgorICAgIGludCBzdGFydCA9IGluZGV4ICsgY29zdF9jYWNoZV9pbnRlcnZhbHNbaV0uc3RhcnRfOworICAgIGNvbnN0IGludCBlbmQgPSBpbmRleCArIChjb3N0X2NhY2hlX2ludGVydmFsc1tpXS5lbmRfID4gbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmVuZF8pOworICAgIGNvbnN0IGRvdWJsZSBsb3dlcl9pbiA9IGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmxvd2VyXzsKKyAgICBjb25zdCBkb3VibGUgdXBwZXJfaW4gPSBjb3N0X2NhY2hlX2ludGVydmFsc1tpXS51cHBlcl87CisgICAgY29uc3QgZG91YmxlIGxvd2VyX2Z1bGxfaW4gPSBkaXN0YW5jZV9jb3N0ICsgbG93ZXJfaW47CisgICAgY29uc3QgZG91YmxlIHVwcGVyX2Z1bGxfaW4gPSBkaXN0YW5jZV9jb3N0ICsgdXBwZXJfaW47CisKKyAgICBpZiAoY29zdF9jYWNoZV9pbnRlcnZhbHNbaV0uZG9fd3JpdGVfKSB7CisgICAgICBVcGRhdGVDb3N0UGVySW50ZXJ2YWwobWFuYWdlciwgc3RhcnQsIGVuZCwgaW5kZXgsIGRpc3RhbmNlX2Nvc3QpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgZm9yICg7IGludGVydmFsICE9IE5VTEwgJiYgaW50ZXJ2YWwtPnN0YXJ0XyA8IGVuZCAmJiBzdGFydCA8IGVuZDsKKyAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWxfbmV4dCkgeworICAgICAgY29uc3QgZG91YmxlIGxvd2VyX2Z1bGxfaW50ZXJ2YWwgPQorICAgICAgICAgIGludGVydmFsLT5kaXN0YW5jZV9jb3N0XyArIGludGVydmFsLT5sb3dlcl87CisgICAgICBjb25zdCBkb3VibGUgdXBwZXJfZnVsbF9pbnRlcnZhbCA9CisgICAgICAgICAgaW50ZXJ2YWwtPmRpc3RhbmNlX2Nvc3RfICsgaW50ZXJ2YWwtPnVwcGVyXzsKKworICAgICAgaW50ZXJ2YWxfbmV4dCA9IGludGVydmFsLT5uZXh0XzsKKworICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgc29tZSBvdmVybGFwCisgICAgICBpZiAoc3RhcnQgPj0gaW50ZXJ2YWwtPmVuZF8pIGNvbnRpbnVlOworCisgICAgICBpZiAobG93ZXJfZnVsbF9pbiA+PSB1cHBlcl9mdWxsX2ludGVydmFsKSB7CisgICAgICAgIC8vIFdoZW4gaW50ZXJ2YWxzIGFyZSByZXByZXNlbnRlZCwgdGhlIGxvd2VyLCB0aGUgYmV0dGVyLgorICAgICAgICAvLyBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKl0KKyAgICAgICAgLy8gc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXQorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgIC8vIElmIHdlIGFyZSB3b3JzZSB0aGFuIHdoYXQgd2UgYWxyZWFkeSBoYXZlLCBhZGQgd2hhdGV2ZXIgd2UgaGF2ZSBzbworICAgICAgICAvLyBmYXIgdXAgdG8gaW50ZXJ2YWwuCisgICAgICAgIGNvbnN0IGludCBzdGFydF9uZXcgPSBpbnRlcnZhbC0+ZW5kXzsKKyAgICAgICAgSW5zZXJ0SW50ZXJ2YWwobWFuYWdlciwgaW50ZXJ2YWwsIGRpc3RhbmNlX2Nvc3QsIGxvd2VyX2luLCB1cHBlcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHN0YXJ0LCBpbnRlcnZhbC0+c3RhcnRfKTsKKyAgICAgICAgc3RhcnQgPSBzdGFydF9uZXc7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBXZSBrbm93IHRoZSB0d28gaW50ZXJ2YWxzIGludGVyc2VjdC4KKyAgICAgIGlmICh1cHBlcl9mdWxsX2luID49IGxvd2VyX2Z1bGxfaW50ZXJ2YWwpIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gY2xlYXIgY3V0IG9uIHdoaWNoIGlzIGJlc3QsIHNvIGxldCdzIGtlZXAgYm90aC4KKyAgICAgICAgLy8gWyoqKioqKioqKlsqLSotKi0qLSotKi0qLSotKi0qLSotKi0qLSotKi0qLSpdKioqKioqKioqKipdCisgICAgICAgIC8vIHN0YXJ0ICAgICBpbnRlcnZhbC0+c3RhcnRfICAgICBpbnRlcnZhbC0+ZW5kXyAgICAgICAgIGVuZAorICAgICAgICAvLyBPUgorICAgICAgICAvLyBbKioqKioqKioqWyotKi0qLSotKi0qLSotKi0qLSotKi1dLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAgICAgICAgLy8gc3RhcnQgICAgIGludGVydmFsLT5zdGFydF8gICAgIGVuZCAgICAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICBjb25zdCBpbnQgZW5kX25ldyA9IChpbnRlcnZhbC0+ZW5kXyA8PSBlbmQpID8gaW50ZXJ2YWwtPmVuZF8gOiBlbmQ7CisgICAgICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBkaXN0YW5jZV9jb3N0LCBsb3dlcl9pbiwgdXBwZXJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzdGFydCwgZW5kX25ldyk7CisgICAgICAgIHN0YXJ0ID0gZW5kX25ldzsKKyAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPD0gaW50ZXJ2YWwtPnN0YXJ0XyAmJiBpbnRlcnZhbC0+ZW5kXyA8PSBlbmQpIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1dCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8gICAgICAgaW50ZXJ2YWwtPmVuZF8KKyAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXQorICAgICAgICAvLyBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIC8vIFdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoZSBvbGQgaW50ZXJ2YWwgYXMgaXQgaXMgZnVsbHkgaW5jbHVkZWQuCisgICAgICAgIFBvcEludGVydmFsKG1hbmFnZXIsIGludGVydmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbnRlcnZhbC0+c3RhcnRfIDw9IHN0YXJ0ICYmIGVuZCA8PSBpbnRlcnZhbC0+ZW5kXykgeworICAgICAgICAgIC8vIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAgICAgICAgICAvLyBpbnRlcnZhbC0+c3RhcnRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKipdCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGUgb2xkIGludGVydmFsIGFzIGl0IGZ1bGx5IGNvbnRhaW5zIHRoZSBuZXcgb25lLgorICAgICAgICAgIGNvbnN0IGludCBlbmRfb3JpZ2luYWwgPSBpbnRlcnZhbC0+ZW5kXzsKKyAgICAgICAgICBpbnRlcnZhbC0+ZW5kXyA9IHN0YXJ0OworICAgICAgICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBpbnRlcnZhbC0+ZGlzdGFuY2VfY29zdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPmxvd2VyXywgaW50ZXJ2YWwtPnVwcGVyXywgaW50ZXJ2YWwtPmluZGV4XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsIGVuZF9vcmlnaW5hbCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW50ZXJ2YWwtPnN0YXJ0XyA8IHN0YXJ0KSB7CisgICAgICAgICAgLy8gWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0KKyAgICAgICAgICAvLyBpbnRlcnZhbC0+c3RhcnRfICAgICAgICBpbnRlcnZhbC0+ZW5kXworICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXQorICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgIGludGVydmFsLT5lbmRfID0gc3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1dCisgICAgICAgICAgLy8gICAgICAgICAgICAgIGludGVydmFsLT5zdGFydF8gICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXQorICAgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfID0gZW5kOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGludGVydmFsIGhhcyBiZWVuIG1vZGlmaWVkLCB3ZSBuZWVkIHRvIHJlcG9zaXRpb24gaXQgb3Igd3JpdGUgaXQuCisgICAgICAgIFJlcG9zaXRpb25JbnRlcnZhbChtYW5hZ2VyLCBpbnRlcnZhbCk7CisgICAgICB9CisgICAgfQorICAgIC8vIEluc2VydCB0aGUgcmVtYWluaW5nIGludGVydmFsIGZyb20gc3RhcnQgdG8gZW5kLgorICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBkaXN0YW5jZV9jb3N0LCBsb3dlcl9pbiwgdXBwZXJfaW4sIGluZGV4LAorICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAorICAgIGludCB4c2l6ZSwgaW50IHlzaXplLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHF1YWxpdHksCisgICAgaW50IGNhY2hlX2JpdHMsIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgdWludDE2X3QqIGNvbnN0IGRpc3RfYXJyYXkpIHsKKyAgaW50IGk7CisgIGludCBvayA9IDA7CisgIGludCBjY19pbml0ID0gMDsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOworICBjb25zdCBzaXplX3QgbGl0ZXJhbF9hcnJheV9zaXplID0gc2l6ZW9mKGRvdWJsZSkgKgorICAgICAgKE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUyArCisgICAgICAgKChjYWNoZV9iaXRzID4gMCkgPyAoMSA8PCBjYWNoZV9iaXRzKSA6IDApKTsKKyAgY29uc3Qgc2l6ZV90IGNvc3RfbW9kZWxfc2l6ZSA9IHNpemVvZihDb3N0TW9kZWwpICsgbGl0ZXJhbF9hcnJheV9zaXplOworICBDb3N0TW9kZWwqIGNvbnN0IGNvc3RfbW9kZWwgPQorICAgICAgKENvc3RNb2RlbCopV2ViUFNhZmVDYWxsb2MoMVVMTCwgY29zdF9tb2RlbF9zaXplKTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKyAgY29uc3QgaW50IHNraXBfbGVuZ3RoID0gMzIgKyBxdWFsaXR5OworICBjb25zdCBpbnQgc2tpcF9taW5fZGlzdGFuY2VfY29kZSA9IDI7CisgIENvc3RNYW5hZ2VyKiBjb3N0X21hbmFnZXIgPQorICAgICAgKENvc3RNYW5hZ2VyKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplb2YoKmNvc3RfbWFuYWdlcikpOworCisgIGlmIChjb3N0X21vZGVsID09IE5VTEwgfHwgY29zdF9tYW5hZ2VyID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgY29zdF9tb2RlbC0+bGl0ZXJhbF8gPSAoZG91YmxlKikoY29zdF9tb2RlbCArIDEpOworICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7CisgICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFDb3N0TW9kZWxCdWlsZChjb3N0X21vZGVsLCBjYWNoZV9iaXRzLCByZWZzKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIUNvc3RNYW5hZ2VySW5pdChjb3N0X21hbmFnZXIsIGRpc3RfYXJyYXksIHBpeF9jb3VudCwgY29zdF9tb2RlbCkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gV2UgbG9vcCBvbmUgcGl4ZWwgYXQgYSB0aW1lLCBidXQgc3RvcmUgYWxsIGN1cnJlbnRseSBiZXN0IHBvaW50cyB0bworICAvLyBub24tcHJvY2Vzc2VkIGxvY2F0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCisgIGRpc3RfYXJyYXlbMF0gPSAwOworICAvLyBBZGQgZmlyc3QgcGl4ZWwgYXMgbGl0ZXJhbC4KKyAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoYXJnYiArIDAsICZoYXNoZXJzLCBjb3N0X21vZGVsLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY29sb3JfY2FjaGUsIDAuMCwgY29zdF9tYW5hZ2VyLT5jb3N0c18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfYXJyYXkpOworCisgIGZvciAoaSA9IDE7IGkgPCBwaXhfY291bnQgLSAxOyArK2kpIHsKKyAgICBpbnQgb2Zmc2V0ID0gMCwgbGVuID0gMDsKKyAgICBkb3VibGUgcHJldl9jb3N0ID0gY29zdF9tYW5hZ2VyLT5jb3N0c19baSAtIDFdOworICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGksICZvZmZzZXQsICZsZW4pOworICAgIGlmIChsZW4gPj0gTUlOX0xFTkdUSCkgeworICAgICAgY29uc3QgaW50IGNvZGUgPSBEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpOworICAgICAgY29uc3QgZG91YmxlIG9mZnNldF9jb3N0ID0gR2V0RGlzdGFuY2VDb3N0KGNvc3RfbW9kZWwsIGNvZGUpOworICAgICAgY29uc3QgaW50IGZpcnN0X2kgPSBpOworICAgICAgaW50IGpfbWF4ID0gMCwgaW50ZXJ2YWxfZW5kc19pbmRleCA9IDA7CisgICAgICBjb25zdCBpbnQgaXNfb2Zmc2V0X3plcm8gPSAob2Zmc2V0X2Nvc3QgPT0gMC4pOworCisgICAgICBpZiAoIWlzX29mZnNldF96ZXJvKSB7CisgICAgICAgIGpfbWF4ID0gKGludCljZWlsKAorICAgICAgICAgICAgKGNvc3RfbWFuYWdlci0+bWF4X2Nvc3RfY2FjaGVfIC0gY29zdF9tYW5hZ2VyLT5taW5fY29zdF9jYWNoZV8pIC8KKyAgICAgICAgICAgIG9mZnNldF9jb3N0KTsKKyAgICAgICAgaWYgKGpfbWF4IDwgMSkgeworICAgICAgICAgIGpfbWF4ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChqX21heCA+IGNvc3RfbWFuYWdlci0+aW50ZXJ2YWxfZW5kc19zaXplXyAtIDEpIHsKKyAgICAgICAgICAvLyBUaGlzIGNvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSBjYXNlIG9mIE1BWF9MRU5HVEguCisgICAgICAgICAgal9tYXggPSBjb3N0X21hbmFnZXItPmludGVydmFsX2VuZHNfc2l6ZV8gLSAxOworICAgICAgICB9CisgICAgICB9ICAvLyBlbHNlIGpfbWF4IGlzIHVudXNlZCBhbnl3YXkuCisKKyAgICAgIC8vIEluc3RlYWQgb2YgY29uc2lkZXJpbmcgYWxsIGNvbnRyaWJ1dGlvbnMgZnJvbSBhIHBpeGVsIGkgYnkgY2FsbGluZzoKKyAgICAgIC8vICAgICAgICAgUHVzaEludGVydmFsKGNvc3RfbWFuYWdlciwgcHJldl9jb3N0ICsgb2Zmc2V0X2Nvc3QsIGksIGxlbik7CisgICAgICAvLyB3ZSBvcHRpbWl6ZSB0aGVzZSBjb250cmlidXRpb25zIGluIGNhc2Ugb2Zmc2V0X2Nvc3Qgc3RheXMgdGhlIHNhbWUgZm9yCisgICAgICAvLyBjb25zZWN1dGl2ZSBwaXhlbHMuIFRoaXMgZGVzY3JpYmVzIGEgc2V0IG9mIHBpeGVscyBzaW1pbGFyIHRvIGEKKyAgICAgIC8vIHByZXZpb3VzIHNldCAoZS5nLiBjb25zdGFudCBjb2xvciByZWdpb25zKS4KKyAgICAgIGZvciAoOyBpIDwgcGl4X2NvdW50IC0gMTsgKytpKSB7CisgICAgICAgIGludCBvZmZzZXRfbmV4dCwgbGVuX25leHQ7CisgICAgICAgIHByZXZfY29zdCA9IGNvc3RfbWFuYWdlci0+Y29zdHNfW2kgLSAxXTsKKworICAgICAgICBpZiAoaXNfb2Zmc2V0X3plcm8pIHsKKyAgICAgICAgICAvLyBObyBvcHRpbWl6YXRpb24gY2FuIGJlIG1hZGUgc28gd2UganVzdCBwdXNoIGFsbCBvZiB0aGUKKyAgICAgICAgICAvLyBjb250cmlidXRpb25zIGZyb20gaS4KKyAgICAgICAgICBQdXNoSW50ZXJ2YWwoY29zdF9tYW5hZ2VyLCBwcmV2X2Nvc3QsIGksIGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gal9tYXggaXMgY2hvc2VuIGFzIHRoZSBzbWFsbGVzdCBqIHN1Y2ggdGhhdDoKKyAgICAgICAgICAvLyAgICAgICBtYXggb2YgY29zdF9jYWNoZV8gPCBqKm9mZnNldCBjb3N0ICsgbWluIG9mIGNvc3RfY2FjaGVfCisgICAgICAgICAgLy8gVGhlcmVmb3JlLCB0aGUgcGl4ZWwgaW5mbHVlbmNlZCBieSBpLWpfbWF4LCBjYW5ub3QgYmUgaW5mbHVlbmNlZAorICAgICAgICAgIC8vIGJ5IGkuIE9ubHkgdGhlIGNvc3RzIGFmdGVyIHRoZSBlbmQgb2Ygd2hhdCBpIGNvbnRyaWJ1dGVkIG5lZWQgdG8gYmUKKyAgICAgICAgICAvLyB1cGRhdGVkLiBjb3N0X21hbmFnZXItPmludGVydmFsX2VuZHNfIGlzIGEgY2lyY3VsYXIgYnVmZmVyIHRoYXQKKyAgICAgICAgICAvLyBzdG9yZXMgdGhvc2UgZW5kcy4KKyAgICAgICAgICBjb25zdCBkb3VibGUgZGlzdGFuY2VfY29zdCA9IHByZXZfY29zdCArIG9mZnNldF9jb3N0OworICAgICAgICAgIGludCBqID0gY29zdF9tYW5hZ2VyLT5pbnRlcnZhbF9lbmRzX1tpbnRlcnZhbF9lbmRzX2luZGV4XTsKKyAgICAgICAgICBpZiAoaSAtIGZpcnN0X2kgPD0gal9tYXggfHwKKyAgICAgICAgICAgICAgIUlzQ29zdENhY2hlSW50ZXJ2YWxXcml0YWJsZShqLCBpICsgbGVuKSkgeworICAgICAgICAgICAgUHVzaEludGVydmFsKGNvc3RfbWFuYWdlciwgZGlzdGFuY2VfY29zdCwgaSwgbGVuKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICg7IGogPCBpICsgbGVuOyArK2opIHsKKyAgICAgICAgICAgICAgVXBkYXRlQ29zdChjb3N0X21hbmFnZXIsIGosIGksIGRpc3RhbmNlX2Nvc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBTdG9yZSB0aGUgbmV3IGVuZCBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICAgICAgICAgIGFzc2VydChpbnRlcnZhbF9lbmRzX2luZGV4IDwgY29zdF9tYW5hZ2VyLT5pbnRlcnZhbF9lbmRzX3NpemVfKTsKKyAgICAgICAgICBjb3N0X21hbmFnZXItPmludGVydmFsX2VuZHNfW2ludGVydmFsX2VuZHNfaW5kZXhdID0gaSArIGxlbjsKKyAgICAgICAgICBpZiAoKytpbnRlcnZhbF9lbmRzX2luZGV4ID4gal9tYXgpIGludGVydmFsX2VuZHNfaW5kZXggPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBpIGlzIHRoZSBsYXN0IHBpeGVsIHRvIGNvbnNpZGVyLCBhcyBpdCBpcyBoYW5kbGVkCisgICAgICAgIC8vIGRpZmZlcmVudGx5LgorICAgICAgICBpZiAoaSArIDEgPj0gcGl4X2NvdW50IC0gMSkgYnJlYWs7CisgICAgICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGkgKyAxLCAmb2Zmc2V0X25leHQsICZsZW5fbmV4dCk7CisgICAgICAgIGlmIChvZmZzZXRfbmV4dCAhPSBvZmZzZXQpIGJyZWFrOworICAgICAgICBsZW4gPSBsZW5fbmV4dDsKKyAgICAgICAgVXBkYXRlQ29zdFBlckluZGV4KGNvc3RfbWFuYWdlciwgaSk7CisgICAgICAgIEFkZFNpbmdsZUxpdGVyYWxXaXRoQ29zdE1vZGVsKGFyZ2IgKyBpLCAmaGFzaGVycywgY29zdF9tb2RlbCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2NvbG9yX2NhY2hlLCBwcmV2X2Nvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvc3RfbWFuYWdlci0+Y29zdHNfLCBkaXN0X2FycmF5KTsKKyAgICAgIH0KKyAgICAgIC8vIFN1Ym1pdCB0aGUgbGFzdCBwaXhlbC4KKyAgICAgIFVwZGF0ZUNvc3RQZXJJbmRleChjb3N0X21hbmFnZXIsIGkgKyAxKTsKKworICAgICAgLy8gVGhpcyBpZiBpcyBmb3Igc3BlZWR1cCBvbmx5LiBJdCByb3VnaGx5IGRvdWJsZXMgdGhlIHNwZWVkLCBhbmQKKyAgICAgIC8vIG1ha2VzIGNvbXByZXNzaW9uIHdvcnNlIGJ5IC4xICUuCisgICAgICBpZiAobGVuID49IHNraXBfbGVuZ3RoICYmIGNvZGUgPD0gc2tpcF9taW5fZGlzdGFuY2VfY29kZSkgeworICAgICAgICAvLyBMb25nIGNvcHkgZm9yIHNob3J0IGRpc3RhbmNlcywgbGV0J3Mgc2tpcCB0aGUgbWlkZGxlCisgICAgICAgIC8vIGxvb2t1cHMgZm9yIGJldHRlciBjb3BpZXMuCisgICAgICAgIC8vIDEpIGluc2VydCB0aGUgaGFzaGVzLgorICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgICAgaW50IGs7CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxlbjsgKytrKSB7CisgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyAyKSBqdW1wLgorICAgICAgICB7CisgICAgICAgICAgY29uc3QgaW50IGlfbmV4dCA9IGkgKyBsZW4gLSAxOyAgLy8gZm9yIGxvb3AgZG9lcyArK2ksIHRodXMgLTEgaGVyZS4KKyAgICAgICAgICBmb3IgKDsgaSA8PSBpX25leHQ7ICsraSkgVXBkYXRlQ29zdFBlckluZGV4KGNvc3RfbWFuYWdlciwgaSArIDEpOworICAgICAgICAgIGkgPSBpX25leHQ7CisgICAgICAgIH0KKyAgICAgICAgZ290byBuZXh0X3N5bWJvbDsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4gPiBNSU5fTEVOR1RIKSB7CisgICAgICAgIGludCBjb2RlX21pbl9sZW5ndGg7CisgICAgICAgIGRvdWJsZSBjb3N0X3RvdGFsOworICAgICAgICBvZmZzZXQgPSBIYXNoQ2hhaW5GaW5kT2Zmc2V0KGhhc2hfY2hhaW4sIGkpOworICAgICAgICBjb2RlX21pbl9sZW5ndGggPSBEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpOworICAgICAgICBjb3N0X3RvdGFsID0gcHJldl9jb3N0ICsKKyAgICAgICAgICAgIEdldERpc3RhbmNlQ29zdChjb3N0X21vZGVsLCBjb2RlX21pbl9sZW5ndGgpICsKKyAgICAgICAgICAgIEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgMSk7CisgICAgICAgIGlmIChjb3N0X21hbmFnZXItPmNvc3RzX1tpICsgMV0gPiBjb3N0X3RvdGFsKSB7CisgICAgICAgICAgY29zdF9tYW5hZ2VyLT5jb3N0c19baSArIDFdID0gKGZsb2F0KWNvc3RfdG90YWw7CisgICAgICAgICAgZGlzdF9hcnJheVtpICsgMV0gPSAyOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsgICAgLy8gbGVuIDwgTUlOX0xFTkdUSAorICAgICAgVXBkYXRlQ29zdFBlckluZGV4KGNvc3RfbWFuYWdlciwgaSArIDEpOworICAgIH0KKworICAgIEFkZFNpbmdsZUxpdGVyYWxXaXRoQ29zdE1vZGVsKGFyZ2IgKyBpLCAmaGFzaGVycywgY29zdF9tb2RlbCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY29sb3JfY2FjaGUsIHByZXZfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0X21hbmFnZXItPmNvc3RzXywgZGlzdF9hcnJheSk7CisKKyBuZXh0X3N5bWJvbDogOworICB9CisgIC8vIEhhbmRsZSB0aGUgbGFzdCBwaXhlbC4KKyAgaWYgKGkgPT0gKHBpeF9jb3VudCAtIDEpKSB7CisgICAgQWRkU2luZ2xlTGl0ZXJhbFdpdGhDb3N0TW9kZWwoCisgICAgICAgIGFyZ2IgKyBpLCAmaGFzaGVycywgY29zdF9tb2RlbCwgaSwgdXNlX2NvbG9yX2NhY2hlLAorICAgICAgICBjb3N0X21hbmFnZXItPmNvc3RzX1twaXhfY291bnQgLSAyXSwgY29zdF9tYW5hZ2VyLT5jb3N0c18sIGRpc3RfYXJyYXkpOworICB9CisKKyAgb2sgPSAhcmVmcy0+ZXJyb3JfOworIEVycm9yOgorICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7CisgIENvc3RNYW5hZ2VyQ2xlYXIoY29zdF9tYW5hZ2VyKTsKKyAgV2ViUFNhZmVGcmVlKGNvc3RfbW9kZWwpOworICBXZWJQU2FmZUZyZWUoY29zdF9tYW5hZ2VyKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBXZSBwYWNrIHRoZSBwYXRoIGF0IHRoZSBlbmQgb2YgKmRpc3RfYXJyYXkgYW5kIHJldHVybgorLy8gYSBwb2ludGVyIHRvIHRoaXMgcGFydCBvZiB0aGUgYXJyYXkuIEV4YW1wbGU6CisvLyBkaXN0X2FycmF5ID0gWzF4Mnh4M3gyXSA9PiBwYWNrZWQgWzF4MngxMjMyXSwgY2hvc2VuX3BhdGggPSBbMTIzMl0KK3N0YXRpYyB2b2lkIFRyYWNlQmFja3dhcmRzKHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RfYXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogY29uc3QgY2hvc2VuX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGNob3Nlbl9wYXRoX3NpemUpIHsKKyAgdWludDE2X3QqIHBhdGggPSBkaXN0X2FycmF5ICsgZGlzdF9hcnJheV9zaXplOworICB1aW50MTZfdCogY3VyID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIDE7CisgIHdoaWxlIChjdXIgPj0gZGlzdF9hcnJheSkgeworICAgIGNvbnN0IGludCBrID0gKmN1cjsKKyAgICAtLXBhdGg7CisgICAgKnBhdGggPSBrOworICAgIGN1ciAtPSBrOworICB9CisgICpjaG9zZW5fcGF0aCA9IHBhdGg7CisgICpjaG9zZW5fcGF0aF9zaXplID0gKGludCkoZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIHBhdGgpOworfQorCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGgoCisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBjYWNoZV9iaXRzLAorICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBjaG9zZW5fcGF0aCwgaW50IGNob3Nlbl9wYXRoX3NpemUsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgaW50IGl4OworICBpbnQgaSA9IDA7CisgIGludCBvayA9IDA7CisgIGludCBjY19pbml0ID0gMDsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKworICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7CisgICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOworICB9CisKKyAgQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIGZvciAoaXggPSAwOyBpeCA8IGNob3Nlbl9wYXRoX3NpemU7ICsraXgpIHsKKyAgICBjb25zdCBpbnQgbGVuID0gY2hvc2VuX3BhdGhbaXhdOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgaW50IGs7CisgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gSGFzaENoYWluRmluZE9mZnNldChoYXNoX2NoYWluLCBpKTsKKyAgICAgIEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47ICsraykgeworICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGkgKz0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICBQaXhPckNvcHkgdjsKKyAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgYXJnYltpXSkpIHsKKyAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIGNvbG9yIGNhY2hlIGluZGV4CisgICAgICAgIGNvbnN0IGludCBpZHggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBhcmdiW2ldKTsKKyAgICAgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGlkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpXSk7CisgICAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKGFyZ2JbaV0pOworICAgICAgfQorICAgICAgQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIHYpOworICAgICAgKytpOworICAgIH0KKyAgfQorICBvayA9ICFyZWZzLT5lcnJvcl87CisgRXJyb3I6CisgIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBSZXR1cm5zIDEgb24gc3VjY2Vzcy4KK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQgY2FjaGVfYml0cywgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGludCBkaXN0X2FycmF5X3NpemUgPSB4c2l6ZSAqIHlzaXplOworICB1aW50MTZfdCogY2hvc2VuX3BhdGggPSBOVUxMOworICBpbnQgY2hvc2VuX3BhdGhfc2l6ZSA9IDA7CisgIHVpbnQxNl90KiBkaXN0X2FycmF5ID0KKyAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoZGlzdF9hcnJheV9zaXplLCBzaXplb2YoKmRpc3RfYXJyYXkpKTsKKworICBpZiAoZGlzdF9hcnJheSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAorICAgICAgeHNpemUsIHlzaXplLCBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgcmVmcywgZGlzdF9hcnJheSkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisgIFRyYWNlQmFja3dhcmRzKGRpc3RfYXJyYXksIGRpc3RfYXJyYXlfc2l6ZSwgJmNob3Nlbl9wYXRoLCAmY2hvc2VuX3BhdGhfc2l6ZSk7CisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRm9sbG93Q2hvc2VuUGF0aCgKKyAgICAgICAgICBhcmdiLCBjYWNoZV9iaXRzLCBjaG9zZW5fcGF0aCwgY2hvc2VuX3BhdGhfc2l6ZSwgaGFzaF9jaGFpbiwgcmVmcykpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisgIG9rID0gMTsKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKGRpc3RfYXJyYXkpOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkoaW50IHhzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIGlmIChQaXhPckNvcHlJc0NvcHkoYy5jdXJfcG9zKSkgeworICAgICAgY29uc3QgaW50IGRpc3QgPSBjLmN1cl9wb3MtPmFyZ2Jfb3JfZGlzdGFuY2U7CisgICAgICBjb25zdCBpbnQgdHJhbnNmb3JtZWRfZGlzdCA9IERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIGRpc3QpOworICAgICAgYy5jdXJfcG9zLT5hcmdiX29yX2Rpc3RhbmNlID0gdHJhbnNmb3JtZWRfZGlzdDsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIGVudHJvcHkgZm9yIHRoZSBnaXZlbiBjYWNoZSBiaXRzLgorc3RhdGljIGRvdWJsZSBDb21wdXRlQ2FjaGVFbnRyb3B5KGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMpIHsKKyAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7CisgIGludCBjY19pbml0ID0gMDsKKyAgZG91YmxlIGVudHJvcHkgPSBNQVhfRU5UUk9QWTsKKyAgY29uc3QgZG91YmxlIGtTbWFsbFBlbmFsdHlGb3JMYXJnZUNhY2hlID0gNC4wOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICBWUDhMSGlzdG9ncmFtKiBoaXN0byA9IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbShjYWNoZV9iaXRzKTsKKyAgaWYgKGhpc3RvID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorICBpZiAoIXVzZV9jb2xvcl9jYWNoZSkgeworICAgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgYy5jdXJfcG9zKTsKKyAgICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgICAgfQorICB9IGVsc2UgeworICAgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gYy5jdXJfcG9zOworICAgICAgaWYgKFBpeE9yQ29weUlzTGl0ZXJhbCh2KSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXggPSAqYXJnYisrOworICAgICAgICBjb25zdCB1aW50MzJfdCBrZXkgPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBwaXgpOworICAgICAgICBpZiAoVlA4TENvbG9yQ2FjaGVMb29rdXAoJmhhc2hlcnMsIGtleSkgPT0gcGl4KSB7CisgICAgICAgICAgKytoaXN0by0+bGl0ZXJhbF9bTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsga2V5XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZVNldCgmaGFzaGVycywga2V5LCBwaXgpOworICAgICAgICAgICsraGlzdG8tPmJsdWVfW3BpeCAmIDB4ZmZdOworICAgICAgICAgICsraGlzdG8tPmxpdGVyYWxfWyhwaXggPj4gOCkgJiAweGZmXTsKKyAgICAgICAgICArK2hpc3RvLT5yZWRfWyhwaXggPj4gMTYpICYgMHhmZl07CisgICAgICAgICAgKytoaXN0by0+YWxwaGFfW3BpeCA+PiAyNF07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBsZW4gPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgICAgIGludCBjb2RlLCBleHRyYV9iaXRzOworICAgICAgICBWUDhMUHJlZml4RW5jb2RlQml0cyhsZW4sICZjb2RlLCAmZXh0cmFfYml0cyk7CisgICAgICAgICsraGlzdG8tPmxpdGVyYWxfW05VTV9MSVRFUkFMX0NPREVTICsgY29kZV07CisgICAgICAgIFZQOExQcmVmaXhFbmNvZGVCaXRzKFBpeE9yQ29weURpc3RhbmNlKHYpLCAmY29kZSwgJmV4dHJhX2JpdHMpOworICAgICAgICArK2hpc3RvLT5kaXN0YW5jZV9bY29kZV07CisgICAgICAgIGRvIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgKmFyZ2IrKyk7CisgICAgICAgIH0gd2hpbGUoLS1sZW4gIT0gMCk7CisgICAgICB9CisgICAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICAgIH0KKyAgfQorICBlbnRyb3B5ID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0bykgKworICAgICAga1NtYWxsUGVuYWx0eUZvckxhcmdlQ2FjaGUgKiBjYWNoZV9iaXRzOworIEVycm9yOgorICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIGVudHJvcHk7Cit9CisKKy8vIEV2YWx1YXRlIG9wdGltYWwgY2FjaGUgYml0cyBmb3IgdGhlIGxvY2FsIGNvbG9yIGNhY2hlLgorLy8gVGhlIGlucHV0ICpiZXN0X2NhY2hlX2JpdHMgc2V0cyB0aGUgbWF4aW11bSBjYWNoZSBiaXRzIHRvIHVzZSAocGFzc2luZyAwCisvLyBpbXBsaWVzIGRpc2FibGluZyB0aGUgbG9jYWwgY29sb3IgY2FjaGUpLiBUaGUgbG9jYWwgY29sb3IgY2FjaGUgaXMgYWxzbworLy8gZGlzYWJsZWQgZm9yIHRoZSBsb3dlciAoPD0gMjUpIHF1YWxpdHkuCisvLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgaW50IENhbGN1bGF0ZUJlc3RDYWNoZVNpemUoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGx6NzdfY29tcHV0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBiZXN0X2NhY2hlX2JpdHMpIHsKKyAgaW50IGV2YWxfbG93ID0gMTsKKyAgaW50IGV2YWxfaGlnaCA9IDE7CisgIGRvdWJsZSBlbnRyb3B5X2xvdyA9IE1BWF9FTlRST1BZOworICBkb3VibGUgZW50cm9weV9oaWdoID0gTUFYX0VOVFJPUFk7CisgIGNvbnN0IGRvdWJsZSBjb3N0X211bCA9IDVlLTQ7CisgIGludCBjYWNoZV9iaXRzX2xvdyA9IDA7CisgIGludCBjYWNoZV9iaXRzX2hpZ2ggPSAocXVhbGl0eSA8PSAyNSkgPyAwIDogKmJlc3RfY2FjaGVfYml0czsKKworICBhc3NlcnQoY2FjaGVfYml0c19oaWdoIDw9IE1BWF9DT0xPUl9DQUNIRV9CSVRTKTsKKworICAqbHo3N19jb21wdXRlZCA9IDA7CisgIGlmIChjYWNoZV9iaXRzX2hpZ2ggPT0gMCkgeworICAgICpiZXN0X2NhY2hlX2JpdHMgPSAwOworICAgIC8vIExvY2FsIGNvbG9yIGNhY2hlIGlzIGRpc2FibGVkLgorICAgIHJldHVybiAxOworICB9CisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzTHo3Nyh4c2l6ZSwgeXNpemUsIGFyZ2IsIGNhY2hlX2JpdHNfbG93LCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgb3B0aW1hbCBlbnRyb3B5IGZvciBjYWNoZV9iaXRzLgorICB3aGlsZSAoZXZhbF9sb3cgfHwgZXZhbF9oaWdoKSB7CisgICAgaWYgKGV2YWxfbG93KSB7CisgICAgICBlbnRyb3B5X2xvdyA9IENvbXB1dGVDYWNoZUVudHJvcHkoYXJnYiwgcmVmcywgY2FjaGVfYml0c19sb3cpOworICAgICAgZW50cm9weV9sb3cgKz0gZW50cm9weV9sb3cgKiBjYWNoZV9iaXRzX2xvdyAqIGNvc3RfbXVsOworICAgICAgZXZhbF9sb3cgPSAwOworICAgIH0KKyAgICBpZiAoZXZhbF9oaWdoKSB7CisgICAgICBlbnRyb3B5X2hpZ2ggPSBDb21wdXRlQ2FjaGVFbnRyb3B5KGFyZ2IsIHJlZnMsIGNhY2hlX2JpdHNfaGlnaCk7CisgICAgICBlbnRyb3B5X2hpZ2ggKz0gZW50cm9weV9oaWdoICogY2FjaGVfYml0c19oaWdoICogY29zdF9tdWw7CisgICAgICBldmFsX2hpZ2ggPSAwOworICAgIH0KKyAgICBpZiAoZW50cm9weV9oaWdoIDwgZW50cm9weV9sb3cpIHsKKyAgICAgIGNvbnN0IGludCBwcmV2X2NhY2hlX2JpdHNfbG93ID0gY2FjaGVfYml0c19sb3c7CisgICAgICAqYmVzdF9jYWNoZV9iaXRzID0gY2FjaGVfYml0c19oaWdoOworICAgICAgY2FjaGVfYml0c19sb3cgPSAoY2FjaGVfYml0c19sb3cgKyBjYWNoZV9iaXRzX2hpZ2gpIC8gMjsKKyAgICAgIGlmIChjYWNoZV9iaXRzX2xvdyAhPSBwcmV2X2NhY2hlX2JpdHNfbG93KSBldmFsX2xvdyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICpiZXN0X2NhY2hlX2JpdHMgPSBjYWNoZV9iaXRzX2xvdzsKKyAgICAgIGNhY2hlX2JpdHNfaGlnaCA9IChjYWNoZV9iaXRzX2xvdyArIGNhY2hlX2JpdHNfaGlnaCkgLyAyOworICAgICAgaWYgKGNhY2hlX2JpdHNfaGlnaCAhPSBjYWNoZV9iaXRzX2xvdykgZXZhbF9oaWdoID0gMTsKKyAgICB9CisgIH0KKyAgKmx6NzdfY29tcHV0ZWQgPSAxOworICByZXR1cm4gMTsKK30KKworLy8gVXBkYXRlIChpbi1wbGFjZSkgYmFja3dhcmQgcmVmZXJlbmNlcyBmb3Igc3BlY2lmaWVkIGNhY2hlX2JpdHMuCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmc1dpdGhMb2NhbENhY2hlKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBpbnQgcGl4ZWxfaW5kZXggPSAwOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cykpIHJldHVybiAwOworCisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhcmdiX2xpdGVyYWwgPSB2LT5hcmdiX29yX2Rpc3RhbmNlOworICAgICAgaWYgKFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JfbGl0ZXJhbCkpIHsKKyAgICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgYXJnYl9saXRlcmFsKTsKKyAgICAgICAgKnYgPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYl9saXRlcmFsKTsKKyAgICAgIH0KKyAgICAgICsrcGl4ZWxfaW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIHJlZnMgd2FzIGNyZWF0ZWQgd2l0aG91dCBsb2NhbCBjYWNoZSwgc28gaXQgY2FuIG5vdCBoYXZlIGNhY2hlIGluZGV4ZXMuCisgICAgICBpbnQgazsKKyAgICAgIGFzc2VydChQaXhPckNvcHlJc0NvcHkodikpOworICAgICAgZm9yIChrID0gMDsgayA8IHYtPmxlbjsgKytrKSB7CisgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW3BpeGVsX2luZGV4KytdKTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorICBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBWUDhMQmFja3dhcmRSZWZzKiBHZXRCYWNrd2FyZFJlZmVyZW5jZXNMb3dFZmZvcnQoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICBpbnQqIGNvbnN0IGNhY2hlX2JpdHMsIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgVlA4TEJhY2t3YXJkUmVmcyByZWZzX2FycmF5WzJdKSB7CisgIFZQOExCYWNrd2FyZFJlZnMqIHJlZnNfbHo3NyA9ICZyZWZzX2FycmF5WzBdOworICAqY2FjaGVfYml0cyA9IDA7CisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzTHo3Nyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAwLCBoYXNoX2NoYWluLCByZWZzX2x6NzcpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eSh3aWR0aCwgcmVmc19sejc3KTsKKyAgcmV0dXJuIHJlZnNfbHo3NzsKK30KKworc3RhdGljIFZQOExCYWNrd2FyZFJlZnMqIEdldEJhY2t3YXJkUmVmZXJlbmNlcygKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwKKyAgICBpbnQqIGNvbnN0IGNhY2hlX2JpdHMsIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgVlA4TEJhY2t3YXJkUmVmcyByZWZzX2FycmF5WzJdKSB7CisgIGludCBsejc3X2lzX3VzZWZ1bDsKKyAgaW50IGx6NzdfY29tcHV0ZWQ7CisgIGRvdWJsZSBiaXRfY29zdF9sejc3LCBiaXRfY29zdF9ybGU7CisgIFZQOExCYWNrd2FyZFJlZnMqIGJlc3QgPSBOVUxMOworICBWUDhMQmFja3dhcmRSZWZzKiByZWZzX2x6NzcgPSAmcmVmc19hcnJheVswXTsKKyAgVlA4TEJhY2t3YXJkUmVmcyogcmVmc19ybGUgPSAmcmVmc19hcnJheVsxXTsKKyAgVlA4TEhpc3RvZ3JhbSogaGlzdG8gPSBOVUxMOworCisgIGlmICghQ2FsY3VsYXRlQmVzdENhY2hlU2l6ZShhcmdiLCB3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5LCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmc19sejc3LCAmbHo3N19jb21wdXRlZCwgY2FjaGVfYml0cykpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKGx6NzdfY29tcHV0ZWQpIHsKKyAgICAvLyBUcmFuc2Zvcm0gcmVmc19sejc3IGZvciB0aGUgb3B0aW1pemVkIGNhY2hlX2JpdHMuCisgICAgaWYgKCpjYWNoZV9iaXRzID4gMCkgeworICAgICAgaWYgKCFCYWNrd2FyZFJlZnNXaXRoTG9jYWxDYWNoZShhcmdiLCAqY2FjaGVfYml0cywgcmVmc19sejc3KSkgeworICAgICAgICBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0x6Nzcod2lkdGgsIGhlaWdodCwgYXJnYiwgKmNhY2hlX2JpdHMsIGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNfbHo3NykpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNSbGUod2lkdGgsIGhlaWdodCwgYXJnYiwgKmNhY2hlX2JpdHMsIHJlZnNfcmxlKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBoaXN0byA9IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbSgqY2FjaGVfYml0cyk7CisgIGlmIChoaXN0byA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIHsKKyAgICAvLyBFdmFsdWF0ZSBMWjc3IGNvZGluZy4KKyAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCByZWZzX2x6NzcsICpjYWNoZV9iaXRzKTsKKyAgICBiaXRfY29zdF9sejc3ID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7CisgICAgLy8gRXZhbHVhdGUgUkxFIGNvZGluZy4KKyAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCByZWZzX3JsZSwgKmNhY2hlX2JpdHMpOworICAgIGJpdF9jb3N0X3JsZSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOworICAgIC8vIERlY2lkZSBpZiBMWjc3IGlzIHVzZWZ1bC4KKyAgICBsejc3X2lzX3VzZWZ1bCA9IChiaXRfY29zdF9sejc3IDwgYml0X2Nvc3RfcmxlKTsKKyAgfQorCisgIC8vIENob29zZSBhcHByb3ByaWF0ZSBiYWNrd2FyZCByZWZlcmVuY2UuCisgIGlmIChsejc3X2lzX3VzZWZ1bCkgeworICAgIC8vIFRyYWNlQmFja3dhcmRzIGlzIGNvc3RseS4gRG9uJ3QgZXhlY3V0ZSBpdCBhdCBsb3dlciBxdWFsaXR5LgorICAgIGNvbnN0IGludCB0cnlfbHo3N190cmFjZV9iYWNrd2FyZHMgPSAocXVhbGl0eSA+PSAyNSk7CisgICAgYmVzdCA9IHJlZnNfbHo3NzsgICAvLyBkZWZhdWx0IGd1ZXNzOiBsejc3IGlzIGJldHRlcgorICAgIGlmICh0cnlfbHo3N190cmFjZV9iYWNrd2FyZHMpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdHJhY2UgPSByZWZzX3JsZTsKKyAgICAgIGlmICghVlA4TEJhY2t3YXJkUmVmc0NvcHkocmVmc19sejc3LCByZWZzX3RyYWNlKSkgeworICAgICAgICBiZXN0ID0gTlVMTDsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmIChCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNfdHJhY2UpKSB7CisgICAgICAgIGRvdWJsZSBiaXRfY29zdF90cmFjZTsKKyAgICAgICAgLy8gRXZhbHVhdGUgTFo3NyBjb2RpbmcuCisgICAgICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sIHJlZnNfdHJhY2UsICpjYWNoZV9iaXRzKTsKKyAgICAgICAgYml0X2Nvc3RfdHJhY2UgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKKyAgICAgICAgaWYgKGJpdF9jb3N0X3RyYWNlIDwgYml0X2Nvc3RfbHo3NykgeworICAgICAgICAgIGJlc3QgPSByZWZzX3RyYWNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGJlc3QgPSByZWZzX3JsZTsKKyAgfQorCisgIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkod2lkdGgsIGJlc3QpOworCisgRXJyb3I6CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIGJlc3Q7Cit9CisKK1ZQOExCYWNrd2FyZFJlZnMqIFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHF1YWxpdHksCisgICAgaW50IGxvd19lZmZvcnQsIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzIHJlZnNfYXJyYXlbMl0pIHsKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICByZXR1cm4gR2V0QmFja3dhcmRSZWZlcmVuY2VzTG93RWZmb3J0KHdpZHRoLCBoZWlnaHQsIGFyZ2IsIGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluLCByZWZzX2FycmF5KTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gR2V0QmFja3dhcmRSZWZlcmVuY2VzKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksIGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluLCByZWZzX2FycmF5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMzAxYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRU5DX0JBQ0tXQVJEX1JFRkVSRU5DRVNfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19IXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGxpbWl0IGlzIDExLgorI2RlZmluZSBNQVhfQ09MT1JfQ0FDSEVfQklUUyAxMAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGl4T3JDb3B5CisKK2VudW0gTW9kZSB7CisgIGtMaXRlcmFsLAorICBrQ2FjaGVJZHgsCisgIGtDb3B5LAorICBrTm9uZQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBtb2RlIGFzIHVpbnQ4X3QgdG8gbWFrZSB0aGUgbWVtb3J5IGxheW91dCB0byBiZSBleGFjdGx5IDggYnl0ZXMuCisgIHVpbnQ4X3QgbW9kZTsKKyAgdWludDE2X3QgbGVuOworICB1aW50MzJfdCBhcmdiX29yX2Rpc3RhbmNlOworfSBQaXhPckNvcHk7CisKK3N0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ29weSh1aW50MzJfdCBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKKyAgUGl4T3JDb3B5IHJldHZhbDsKKyAgcmV0dmFsLm1vZGUgPSBrQ29weTsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgcmV0dmFsLmxlbiA9IGxlbjsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpbnQgaWR4KSB7CisgIFBpeE9yQ29weSByZXR2YWw7CisgIGFzc2VydChpZHggPj0gMCk7CisgIGFzc2VydChpZHggPCAoMSA8PCBNQVhfQ09MT1JfQ0FDSEVfQklUUykpOworICByZXR2YWwubW9kZSA9IGtDYWNoZUlkeDsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBpZHg7CisgIHJldHZhbC5sZW4gPSAxOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwodWludDMyX3QgYXJnYikgeworICBQaXhPckNvcHkgcmV0dmFsOworICByZXR2YWwubW9kZSA9IGtMaXRlcmFsOworICByZXR2YWwuYXJnYl9vcl9kaXN0YW5jZSA9IGFyZ2I7CisgIHJldHZhbC5sZW4gPSAxOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeE9yQ29weUlzTGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgcmV0dXJuIChwLT5tb2RlID09IGtMaXRlcmFsKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NhY2hlSWR4KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gKHAtPm1vZGUgPT0ga0NhY2hlSWR4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NvcHkoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiAocC0+bW9kZSA9PSBrQ29weSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMaXRlcmFsKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQpIHsKKyAgYXNzZXJ0KHAtPm1vZGUgPT0ga0xpdGVyYWwpOworICByZXR1cm4gKHAtPmFyZ2Jfb3JfZGlzdGFuY2UgPj4gKGNvbXBvbmVudCAqIDgpKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMZW5ndGgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiBwLT5sZW47Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlBcmdiKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICBhc3NlcnQocC0+bW9kZSA9PSBrTGl0ZXJhbCk7CisgIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5Q2FjaGVJZHgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIGFzc2VydChwLT5tb2RlID09IGtDYWNoZUlkeCk7CisgIGFzc2VydChwLT5hcmdiX29yX2Rpc3RhbmNlIDwgKDFVIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSk7CisgIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5RGlzdGFuY2UoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIGFzc2VydChwLT5tb2RlID09IGtDb3B5KTsKKyAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMSGFzaENoYWluCisKKyNkZWZpbmUgSEFTSF9CSVRTIDE4CisjZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCisKK3R5cGVkZWYgc3RydWN0IFZQOExIYXNoQ2hhaW4gVlA4TEhhc2hDaGFpbjsKK3N0cnVjdCBWUDhMSGFzaENoYWluIHsKKyAgLy8gVGhlIDIwIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBjb250YWluIHRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGJlc3QgbWF0Y2gKKyAgLy8gaXMgZm91bmQuIFRoZXNlIDIwIGJpdHMgYXJlIHRoZSBsaW1pdCBkZWZpbmVkIGJ5IEdldFdpbmRvd1NpemVGb3JIYXNoQ2hhaW4KKyAgLy8gKHRocm91Z2ggV0lORE9XX1NJWkUgPSAxPDwyMCkuCisgIC8vIFRoZSBsb3dlciAxMiBiaXRzIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIFRoZSAxMiBiaXQgbGltaXQgaXMKKyAgLy8gZGVmaW5lZCBpbiBNYXhGaW5kQ29weUxlbmd0aCB3aXRoIE1BWF9MRU5HVEg9NDA5Ni4KKyAgdWludDMyX3QqIG9mZnNldF9sZW5ndGhfOworICAvLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGhhc2hfY2hhaW4gdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuCisgIC8vIFR5cGljYWxseSB0aGlzIGlzIHRoZSBwaXhlbCBjb3VudCAod2lkdGggeCBoZWlnaHQpIGZvciBhIGdpdmVuIGltYWdlLgorICBpbnQgc2l6ZV87Cit9OworCisvLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCwgdG8gc2V0IHNpemUuCitpbnQgVlA4TEhhc2hDaGFpbkluaXQoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHNpemUpOworLy8gUHJlLWNvbXB1dGUgdGhlIGJlc3QgbWF0Y2hlcyBmb3IgYXJnYi4KK2ludCBWUDhMSGFzaENoYWluRmlsbChWUDhMSGFzaENoYWluKiBjb25zdCBwLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHhzaXplLCBpbnQgeXNpemUpOwordm9pZCBWUDhMSGFzaENoYWluQ2xlYXIoVlA4TEhhc2hDaGFpbiogY29uc3QgcCk7ICAvLyByZWxlYXNlIG1lbW9yeQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJhY2t3YXJkUmVmcyAoYmxvY2stYmFzZWQgYmFja3dhcmQtcmVmZXJlbmNlcyBzdG9yYWdlKQorCisvLyBtYXhpbXVtIG51bWJlciBvZiByZWZlcmVuY2UgYmxvY2tzIHRoZSBpbWFnZSB3aWxsIGJlIHNlZ21lbnRlZCBpbnRvCisjZGVmaW5lIE1BWF9SRUZTX0JMT0NLX1BFUl9JTUFHRSAxNgorCit0eXBlZGVmIHN0cnVjdCBQaXhPckNvcHlCbG9jayBQaXhPckNvcHlCbG9jazsgICAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCit0eXBlZGVmIHN0cnVjdCBWUDhMQmFja3dhcmRSZWZzIFZQOExCYWNrd2FyZFJlZnM7CisKKy8vIENvbnRhaW5lciBmb3IgYmxvY2tzIGNoYWluCitzdHJ1Y3QgVlA4TEJhY2t3YXJkUmVmcyB7CisgIGludCBibG9ja19zaXplXzsgICAgICAgICAgICAgICAvLyBjb21tb24gYmxvY2stc2l6ZQorICBpbnQgZXJyb3JfOyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvIHRydWUgaWYgc29tZSBtZW1vcnkgZXJyb3Igb2NjdXJyZWQKKyAgUGl4T3JDb3B5QmxvY2sqIHJlZnNfOyAgICAgICAgIC8vIGxpc3Qgb2YgY3VycmVudGx5IHVzZWQgYmxvY2tzCisgIFBpeE9yQ29weUJsb2NrKiogdGFpbF87ICAgICAgICAvLyBmb3IgbGlzdCByZWN5Y2xpbmcKKyAgUGl4T3JDb3B5QmxvY2sqIGZyZWVfYmxvY2tzXzsgIC8vIGZyZWUtbGlzdAorICBQaXhPckNvcHlCbG9jayogbGFzdF9ibG9ja187ICAgLy8gdXNlZCBmb3IgYWRkaW5nIG5ldyByZWZzIChpbnRlcm5hbCkKK307CisKKy8vIEluaXRpYWxpemUgdGhlIG9iamVjdC4gJ2Jsb2NrX3NpemUnIGlzIHRoZSBjb21tb24gYmxvY2sgc2l6ZSB0byBzdG9yZQorLy8gcmVmZXJlbmNlcyAodHlwaWNhbGx5LCB3aWR0aCAqIGhlaWdodCAvIE1BWF9SRUZTX0JMT0NLX1BFUl9JTUFHRSkuCit2b2lkIFZQOExCYWNrd2FyZFJlZnNJbml0KFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsIGludCBibG9ja19zaXplKTsKKy8vIFJlbGVhc2UgbWVtb3J5IGZvciBiYWNrd2FyZCByZWZlcmVuY2VzLgordm9pZCBWUDhMQmFja3dhcmRSZWZzQ2xlYXIoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7CisvLyBDb3BpZXMgdGhlICdzcmMnIGJhY2t3YXJkIHJlZnMgdG8gdGhlICdkc3QnLiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBWUDhMQmFja3dhcmRSZWZzQ29weShjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgZHN0KTsKKworLy8gQ3Vyc29yIGZvciBpdGVyYXRpbmcgb24gcmVmZXJlbmNlcyBjb250ZW50Cit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIHB1YmxpYzoKKyAgUGl4T3JDb3B5KiBjdXJfcG9zOyAgICAgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbgorICAvLyBwcml2YXRlOgorICBQaXhPckNvcHlCbG9jayogY3VyX2Jsb2NrXzsgICAvLyBjdXJyZW50IGJsb2NrIGluIHRoZSByZWZzIGxpc3QKKyAgY29uc3QgUGl4T3JDb3B5KiBsYXN0X3Bvc187ICAgLy8gc2VudGluZWwgZm9yIHN3aXRjaGluZyB0byBuZXh0IGJsb2NrCit9IFZQOExSZWZzQ3Vyc29yOworCisvLyBSZXR1cm5zIGEgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVmZXJlbmNlcyBsaXN0LgorVlA4TFJlZnNDdXJzb3IgVlA4TFJlZnNDdXJzb3JJbml0KGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOworLy8gUmV0dXJucyB0cnVlIGlmIGN1cnNvciBpcyBwb2ludGluZyBhdCBhIHZhbGlkIHBvc2l0aW9uLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMUmVmc0N1cnNvck9rKGNvbnN0IFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIHJldHVybiAoYy0+Y3VyX3BvcyAhPSBOVUxMKTsKK30KKy8vIE1vdmUgdG8gbmV4dCBibG9jayBvZiByZWZlcmVuY2VzLiBJbnRlcm5hbCwgbm90IHRvIGJlIGNhbGxlZCBkaXJlY3RseS4KK3ZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0QmxvY2soVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpOworLy8gTW92ZSB0byBuZXh0IHBvc2l0aW9uLCBvciBOVUxMLiBTaG91bGQgbm90IGJlIGNhbGxlZCBpZiAhVlA4TFJlZnNDdXJzb3JPaygpLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFJlZnNDdXJzb3JOZXh0KFZQOExSZWZzQ3Vyc29yKiBjb25zdCBjKSB7CisgIGFzc2VydChjICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFJlZnNDdXJzb3JPayhjKSk7CisgIGlmICgrK2MtPmN1cl9wb3MgPT0gYy0+bGFzdF9wb3NfKSBWUDhMUmVmc0N1cnNvck5leHRCbG9jayhjKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnRzCisKKy8vIEV2YWx1YXRlcyBiZXN0IHBvc3NpYmxlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBxdWFsaXR5LgorLy8gVGhlIGlucHV0IGNhY2hlX2JpdHMgdG8gJ1ZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMnIHNldHMgdGhlIG1heGltdW0gY2FjaGUKKy8vIGJpdHMgdG8gdXNlIChwYXNzaW5nIDAgaW1wbGllcyBkaXNhYmxpbmcgdGhlIGxvY2FsIGNvbG9yIGNhY2hlKS4KKy8vIFRoZSBvcHRpbWFsIGNhY2hlIGJpdHMgaXMgZXZhbHVhdGVkIGFuZCBzZXQgZm9yIHRoZSAqY2FjaGVfYml0cyBwYXJhbWV0ZXIuCisvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiZXN0IG9mIHRoZSB0d28gYmFja3dhcmQgcmVmcyB2aXosCisvLyByZWZzWzBdIG9yIHJlZnNbMV0uCitWUDhMQmFja3dhcmRSZWZzKiBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LAorICAgIGludCBsb3dfZWZmb3J0LCBpbnQqIGNvbnN0IGNhY2hlX2JpdHMsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgVlA4TEJhY2t3YXJkUmVmcyByZWZzWzJdKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBDSFJPTUlVTV9XRUJQX0VOQ19CQUNLV0FSRF9SRUZFUkVOQ0VTX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvY29uZmlnLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2ZGMzNwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb25maWcuYwpAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvZGluZyB0b29scyBjb25maWd1cmF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9lbmNvZGUuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBDb25maWcKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQcmVzZXQgcHJlc2V0LCBmbG9hdCBxdWFsaXR5LCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCisgIH0KKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBjb25maWctPnF1YWxpdHkgPSBxdWFsaXR5OworICBjb25maWctPnRhcmdldF9zaXplID0gMDsKKyAgY29uZmlnLT50YXJnZXRfUFNOUiA9IDAuOworICBjb25maWctPm1ldGhvZCA9IDQ7CisgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gNTA7CisgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gNjA7ICAgLy8gbWlkLWZpbHRlcmluZworICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSAwOworICBjb25maWctPmZpbHRlcl90eXBlID0gMTsgICAgICAgIC8vIGRlZmF1bHQ6IHN0cm9uZyAoc28gVS9WIGlzIGZpbHRlcmVkIHRvbykKKyAgY29uZmlnLT5wYXJ0aXRpb25zID0gMDsKKyAgY29uZmlnLT5zZWdtZW50cyA9IDQ7CisgIGNvbmZpZy0+cGFzcyA9IDE7CisgIGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID0gMDsKKyAgY29uZmlnLT5wcmVwcm9jZXNzaW5nID0gMDsKKyAgY29uZmlnLT5hdXRvZmlsdGVyID0gMDsKKyAgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPSAwOworICBjb25maWctPmFscGhhX2NvbXByZXNzaW9uID0gMTsKKyAgY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPSAxOworICBjb25maWctPmFscGhhX3F1YWxpdHkgPSAxMDA7CisgIGNvbmZpZy0+bG9zc2xlc3MgPSAwOworICBjb25maWctPmV4YWN0ID0gMDsKKyAgY29uZmlnLT5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX0RFRkFVTFQ7CisgIGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPSAwOworICBjb25maWctPnRocmVhZF9sZXZlbCA9IDA7CisgIGNvbmZpZy0+bG93X21lbW9yeSA9IDA7CisgIGNvbmZpZy0+bmVhcl9sb3NzbGVzcyA9IDEwMDsKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworICBjb25maWctPmRlbHRhX3BhbGV0dGl6YXRpb24gPSAwOworI2VuZGlmIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCisKKyAgLy8gVE9ETyhza2FsKTogdHVuZS4KKyAgc3dpdGNoIChwcmVzZXQpIHsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BJQ1RVUkU6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzU7CisgICAgICBjb25maWctPnByZXByb2Nlc3NpbmcgJj0gfjI7ICAgLy8gbm8gZGl0aGVyaW5nCisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1BIT1RPOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA4MDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDM7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDMwOworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nIHw9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0RSQVdJTkc6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDI1OworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNjsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0lDT046CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nICY9IH4yOyAgIC8vIG5vIGRpdGhlcmluZworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9URVhUOgorICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAwOworICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAwOyAgIC8vIGRpc2FibGUgZmlsdGVyaW5nIHRvIHJldGFpbiBzaGFycG5lc3MKKyAgICAgIGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmPSB+MjsgICAvLyBubyBkaXRoZXJpbmcKKyAgICAgIGNvbmZpZy0+c2VnbWVudHMgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBXRUJQX1BSRVNFVF9ERUZBVUxUOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gV2ViUFZhbGlkYXRlQ29uZmlnKGNvbmZpZyk7Cit9CisKK2ludCBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKSB7CisgIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnF1YWxpdHkgPCAwIHx8IGNvbmZpZy0+cXVhbGl0eSA+IDEwMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dGFyZ2V0X3NpemUgPCAwKQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT50YXJnZXRfUFNOUiA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPm1ldGhvZCA8IDAgfHwgY29uZmlnLT5tZXRob2QgPiA2KQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5zZWdtZW50cyA8IDEgfHwgY29uZmlnLT5zZWdtZW50cyA+IDQpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnNuc19zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5zbnNfc3RyZW5ndGggPiAxMDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPiAxMDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA+IDcpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl90eXBlIDwgMCB8fCBjb25maWctPmZpbHRlcl90eXBlID4gMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+YXV0b2ZpbHRlciA8IDAgfHwgY29uZmlnLT5hdXRvZmlsdGVyID4gMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cGFzcyA8IDEgfHwgY29uZmlnLT5wYXNzID4gMTApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnNob3dfY29tcHJlc3NlZCA8IDAgfHwgY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPiAxKQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nIDwgMCB8fCBjb25maWctPnByZXByb2Nlc3NpbmcgPiA3KQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wYXJ0aXRpb25zIDwgMCB8fCBjb25maWctPnBhcnRpdGlvbnMgPiAzKQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPCAwIHx8IGNvbmZpZy0+cGFydGl0aW9uX2xpbWl0ID4gMTAwKQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA8IDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmFscGhhX3F1YWxpdHkgPCAwIHx8IGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA+IDEwMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bG9zc2xlc3MgPCAwIHx8IGNvbmZpZy0+bG9zc2xlc3MgPiAxKQorICAgIHJldHVybiAwOworICBpZiAoY29uZmlnLT5uZWFyX2xvc3NsZXNzIDwgMCB8fCBjb25maWctPm5lYXJfbG9zc2xlc3MgPiAxMDApCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmltYWdlX2hpbnQgPj0gV0VCUF9ISU5UX0xBU1QpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmVtdWxhdGVfanBlZ19zaXplIDwgMCB8fCBjb25maWctPmVtdWxhdGVfanBlZ19zaXplID4gMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dGhyZWFkX2xldmVsIDwgMCB8fCBjb25maWctPnRocmVhZF9sZXZlbCA+IDEpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmxvd19tZW1vcnkgPCAwIHx8IGNvbmZpZy0+bG93X21lbW9yeSA+IDEpCisgICAgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmV4YWN0IDwgMCB8fCBjb25maWctPmV4YWN0ID4gMSkKKyAgICByZXR1cm4gMDsKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworICBpZiAoY29uZmlnLT5kZWx0YV9wYWxldHRpemF0aW9uIDwgMCB8fCBjb25maWctPmRlbHRhX3BhbGV0dGl6YXRpb24gPiAxKQorICAgIHJldHVybiAwOworI2VuZGlmICAvLyBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNQVhfTEVWRUwgOQorCisvLyBNYXBwaW5nIGJldHdlZW4gLXogbGV2ZWwgYW5kIC1tIC8gLXEgcGFyYW1ldGVyIHNldHRpbmdzLgorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIHVpbnQ4X3QgbWV0aG9kXzsKKyAgdWludDhfdCBxdWFsaXR5XzsKK30ga0xvc3NsZXNzUHJlc2V0c1tNQVhfTEVWRUwgKyAxXSA9IHsKKyAgeyAwLCAgMCB9LCB7IDEsIDIwIH0sIHsgMiwgMjUgfSwgeyAzLCAzMCB9LCB7IDMsIDUwIH0sCisgIHsgNCwgNTAgfSwgeyA0LCA3NSB9LCB7IDQsIDkwIH0sIHsgNSwgOTAgfSwgeyA2LCAxMDAgfQorfTsKKworaW50IFdlYlBDb25maWdMb3NzbGVzc1ByZXNldChXZWJQQ29uZmlnKiBjb25maWcsIGludCBsZXZlbCkgeworICBpZiAoY29uZmlnID09IE5VTEwgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gTUFYX0xFVkVMKSByZXR1cm4gMDsKKyAgY29uZmlnLT5sb3NzbGVzcyA9IDE7CisgIGNvbmZpZy0+bWV0aG9kID0ga0xvc3NsZXNzUHJlc2V0c1tsZXZlbF0ubWV0aG9kXzsKKyAgY29uZmlnLT5xdWFsaXR5ID0ga0xvc3NsZXNzUHJlc2V0c1tsZXZlbF0ucXVhbGl0eV87CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkNDRiMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmMKQEAgLTAsMCArMSwzNTQgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3N0IHRhYmxlcyBmb3IgbGV2ZWwgYW5kIG1vZGVzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExldmVsIGNvc3QgdGFibGVzCisKKy8vIEZvciBlYWNoIGdpdmVuIGxldmVsLCB0aGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIHRoZSBwYXR0ZXJuIG9mIGNvbnRleHRzIHRvCisvLyB1c2UgZm9yIGNvZGluZyBpdCAoaW4gW11bMF0pIGFzIHdlbGwgYXMgdGhlIGJpdCB2YWx1ZSB0byB1c2UgZm9yIGVhY2gKKy8vIGNvbnRleHQgKGluIFtdWzFdKS4KK2NvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXSA9IHsKKyAgICAgICAgICAgICAgICAgIHsweDAwMSwgMHgwMDB9LCB7MHgwMDcsIDB4MDAxfSwgezB4MDBmLCAweDAwNX0sCisgIHsweDAwZiwgMHgwMGR9LCB7MHgwMzMsIDB4MDAzfSwgezB4MDMzLCAweDAwM30sIHsweDAzMywgMHgwMjN9LAorICB7MHgwMzMsIDB4MDIzfSwgezB4MDMzLCAweDAyM30sIHsweDAzMywgMHgwMjN9LCB7MHgwZDMsIDB4MDEzfSwKKyAgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sCisgIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwOTN9LAorICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKKyAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAorICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgxNTN9Cit9OworCitzdGF0aWMgaW50IFZhcmlhYmxlTGV2ZWxDb3N0KGludCBsZXZlbCwgY29uc3QgdWludDhfdCBwcm9iYXNbTlVNX1BST0JBU10pIHsKKyAgaW50IHBhdHRlcm4gPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMF07CisgIGludCBiaXRzID0gVlA4TGV2ZWxDb2Rlc1tsZXZlbCAtIDFdWzFdOworICBpbnQgY29zdCA9IDA7CisgIGludCBpOworICBmb3IgKGkgPSAyOyBwYXR0ZXJuOyArK2kpIHsKKyAgICBpZiAocGF0dGVybiAmIDEpIHsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdChiaXRzICYgMSwgcHJvYmFzW2ldKTsKKyAgICB9CisgICAgYml0cyA+Pj0gMTsKKyAgICBwYXR0ZXJuID4+PSAxOworICB9CisgIHJldHVybiBjb3N0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlLWNhbGMgbGV2ZWwgY29zdHMgb25jZSBmb3IgYWxsCisKK3ZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEpIHsKKyAgaW50IGN0eXBlLCBiYW5kLCBjdHg7CisKKyAgaWYgKCFwcm9iYS0+ZGlydHlfKSByZXR1cm47ICAvLyBub3RoaW5nIHRvIGRvLgorCisgIGZvciAoY3R5cGUgPSAwOyBjdHlwZSA8IE5VTV9UWVBFUzsgKytjdHlwZSkgeworICAgIGludCBuOworICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBOVU1fQkFORFM7ICsrYmFuZCkgeworICAgICAgZm9yIChjdHggPSAwOyBjdHggPCBOVU1fQ1RYOyArK2N0eCkgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gcHJvYmEtPmNvZWZmc19bY3R5cGVdW2JhbmRdW2N0eF07CisgICAgICAgIHVpbnQxNl90KiBjb25zdCB0YWJsZSA9IHByb2JhLT5sZXZlbF9jb3N0X1tjdHlwZV1bYmFuZF1bY3R4XTsKKyAgICAgICAgY29uc3QgaW50IGNvc3QwID0gKGN0eCA+IDApID8gVlA4Qml0Q29zdCgxLCBwWzBdKSA6IDA7CisgICAgICAgIGNvbnN0IGludCBjb3N0X2Jhc2UgPSBWUDhCaXRDb3N0KDEsIHBbMV0pICsgY29zdDA7CisgICAgICAgIGludCB2OworICAgICAgICB0YWJsZVswXSA9IFZQOEJpdENvc3QoMCwgcFsxXSkgKyBjb3N0MDsKKyAgICAgICAgZm9yICh2ID0gMTsgdiA8PSBNQVhfVkFSSUFCTEVfTEVWRUw7ICsrdikgeworICAgICAgICAgIHRhYmxlW3ZdID0gY29zdF9iYXNlICsgVmFyaWFibGVMZXZlbENvc3QodiwgcCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RhcnRpbmcgYXQgbGV2ZWwgNjcgYW5kIHVwLCB0aGUgdmFyaWFibGUgcGFydCBvZiB0aGUgY29zdCBpcworICAgICAgICAvLyBhY3R1YWxseSBjb25zdGFudC4KKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsgICAgLy8gcmVwbGljYXRlIGJhbmRzLiBXZSBkb24ndCBuZWVkIHRvIHNlbnRpbmVsLgorICAgICAgZm9yIChjdHggPSAwOyBjdHggPCBOVU1fQ1RYOyArK2N0eCkgeworICAgICAgICBwcm9iYS0+cmVtYXBwZWRfY29zdHNfW2N0eXBlXVtuXVtjdHhdID0KKyAgICAgICAgICAgIHByb2JhLT5sZXZlbF9jb3N0X1tjdHlwZV1bVlA4RW5jQmFuZHNbbl1dW2N0eF07CisgICAgICB9CisgICAgfQorICB9CisgIHByb2JhLT5kaXJ0eV8gPSAwOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTW9kZSBjb3N0IHRhYmxlcy4KKworLy8gVGhlc2UgYXJlIHRoZSBmaXhlZCBwcm9iYWJpbGl0aWVzIChpbiB0aGUgY29kaW5nIHRyZWVzKSB0dXJuZWQgaW50byBiaXQtY29zdAorLy8gYnkgY2FsbGluZyBWUDhCaXRDb3N0KCkuCitjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF0gPSB7IDMwMiwgOTg0LCA0MzksIDY0MiB9OworLy8gbm90ZTogdGhlc2UgdmFsdWVzIGluY2x1ZGUgdGhlIGZpeGVkIFZQOEJpdENvc3QoMSwgMTQ1KSBtb2RlIHNlbGVjdGlvbiBjb3N0LgorY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XSA9IHsgNjYzLCA5MTksIDg3MiwgOTE5IH07Citjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU10gPSB7CisgIHsgeyAgIDQwLCAxMTUxLCAxNzIzLCAxODc0LCAyMTAzLCAyMDE5LCAxNjI4LCAxNzc3LCAyMjI2LCAyMTM3IH0sCisgICAgeyAgMTkyLCAgNDY5LCAxMjk2LCAxMzA4LCAxODQ5LCAxNzk0LCAxNzgxLCAxNzAzLCAxNzEzLCAxNTIyIH0sCisgICAgeyAgMTQyLCAgOTEwLCAgNzYyLCAxNjg0LCAxODQ5LCAxNTc2LCAxNDYwLCAxMzA1LCAxODAxLCAxNjU3IH0sCisgICAgeyAgNTU5LCAgNjQxLCAxMzcwLCAgNDIxLCAxMTgyLCAxNTY5LCAxNjEyLCAxNzI1LCAgODYzLCAxMDA3IH0sCisgICAgeyAgMjk5LCAxMDU5LCAxMjU2LCAxMTA4LCAgNjM2LCAxMDY4LCAxNTgxLCAxODgzLCAgODY5LCAxMTQyIH0sCisgICAgeyAgMjc3LCAxMTExLCAgNzA3LCAxMzYyLCAxMDg5LCAgNjcyLCAxNjAzLCAxNTQxLCAxNTQ1LCAxMjkxIH0sCisgICAgeyAgMjE0LCAgNzgxLCAxNjA5LCAxMzAzLCAxNjMyLCAyMjI5LCAgNzI2LCAxNTYwLCAxNzEzLCAgOTE4IH0sCisgICAgeyAgMTUyLCAxMDM3LCAxMDQ2LCAxNzU5LCAxOTgzLCAyMTc0LCAxMzU4LCAgNzQyLCAxNzQwLCAxMzkwIH0sCisgICAgeyAgNTEyLCAxMDQ2LCAxNDIwLCAgNzUzLCAgNzUyLCAxMjk3LCAxNDg2LCAxNjEzLCAgNDYwLCAxMjA3IH0sCisgICAgeyAgNDI0LCAgODI3LCAxMzYyLCAgNzE5LCAxNDYyLCAxMjAyLCAxMTk5LCAxNDc2LCAxMTk5LCAgNTM4IH0gfSwKKyAgeyB7ICAyNDAsICA0MDIsIDExMzQsIDE0OTEsIDE2NTksIDE1MDUsIDE1MTcsIDE1NTUsIDE5NzksIDIwOTkgfSwKKyAgICB7ICA0NjcsICAyNDIsICA5NjAsIDEyMzIsIDE3MTQsIDE2MjAsIDE4MzQsIDE1NzAsIDE2NzYsIDEzOTEgfSwKKyAgICB7ICA1MDAsICA0NTUsICA0NjMsIDE1MDcsIDE2OTksIDEyODIsIDE1NjQsICA5ODIsIDIxMTQsIDIxMTQgfSwKKyAgICB7ICA2NzIsICA2NDMsIDEzNzIsICAzMzEsIDE1ODksIDE2NjcsIDE0NTMsIDE5MzgsICA5OTYsICA4NzYgfSwKKyAgICB7ICA0NTgsICA3ODMsIDEwMzcsICA5MTEsICA3MzgsICA5NjgsIDExNjUsIDE1MTgsICA4NTksIDEwMzMgfSwKKyAgICB7ICA1MDQsICA4MTUsICA1MDQsIDExMzksIDEyMTksICA3MTksIDE1MDYsIDEwODUsIDEyNjgsIDEyNjggfSwKKyAgICB7ICAzMzMsICA2MzAsIDE0NDUsIDEyMzksIDE4ODMsIDM2NzIsICA3OTksIDE1NDgsIDE4NjUsICA1OTggfSwKKyAgICB7ICAzOTksICA2NDQsICA3NDYsIDEzNDIsIDE4NTYsIDEzNTAsIDE0OTMsICA2MTMsIDE4NTUsIDEwMTUgfSwKKyAgICB7ICA2MjIsICA3NDksIDEyMDUsICA2MDgsIDEwNjYsIDE0MDgsIDEyOTAsIDE0MDYsICA1NDYsICA5NzEgfSwKKyAgICB7ICA1MDAsICA3NTMsIDEwNDEsICA2NjgsIDEyMzAsIDE2MTcsIDEyOTcsIDE0MjUsIDEzODMsICA1MjMgfSB9LAorICB7IHsgIDM5NCwgIDU1MywgIDUyMywgMTUwMiwgMTUzNiwgIDk4MSwgMTYwOCwgMTE0MiwgMTY2NiwgMjE4MSB9LAorICAgIHsgIDY1NSwgIDQzMCwgIDM3NSwgMTQxMSwgMTg2MSwgMTIyMCwgMTY3NywgMTEzNSwgMTk3OCwgMTU1MyB9LAorICAgIHsgIDY5MCwgIDY0MCwgIDI0NSwgMTk1NCwgMjA3MCwgMTE5NCwgMTUyOCwgIDk4MiwgMTk3MiwgMjIzMiB9LAorICAgIHsgIDU1OSwgIDgzNCwgIDc0MSwgIDg2NywgMTEzMSwgIDk4MCwgMTIyNSwgIDg1MiwgMTA5MiwgIDc4NCB9LAorICAgIHsgIDY5MCwgIDg3NSwgIDUxNiwgIDk1OSwgIDY3MywgIDg5NCwgMTA1NiwgMTE5MCwgMTUyOCwgMTEyNiB9LAorICAgIHsgIDc0MCwgIDk1MSwgIDM4NCwgMTI3NywgMTE3NywgIDQ5MiwgMTU3OSwgMTE1NSwgMTg0NiwgMTUxMyB9LAorICAgIHsgIDMyMywgIDc3NSwgMTA2MiwgMTc3NiwgMzA2MiwgMTI3NCwgIDgxMywgMTE4OCwgMTM3MiwgIDY1NSB9LAorICAgIHsgIDQ4OCwgIDk3MSwgIDQ4NCwgMTc2NywgMTUxNSwgMTc3NSwgMTExNSwgIDUwMywgMTUzOSwgMTQ2MSB9LAorICAgIHsgIDc0MCwgMTAwNiwgIDk5OCwgIDcwOSwgIDg1MSwgMTIzMCwgMTMzNywgIDc4OCwgIDc0MSwgIDcyMSB9LAorICAgIHsgIDUyMiwgMTA3MywgIDU3MywgMTA0NSwgMTM0NiwgIDg4NywgMTA0NiwgMTE0NiwgMTIwMywgIDY5NyB9IH0sCisgIHsgeyAgMTA1LCAgODY0LCAxNDQyLCAxMDA5LCAxOTM0LCAxODQwLCAxNTE5LCAxOTIwLCAxNjczLCAxNTc5IH0sCisgICAgeyAgNTM0LCAgMzA1LCAxMTkzLCAgNjgzLCAxMzg4LCAyMTY0LCAxODAyLCAxODk0LCAxMjY0LCAxMTcwIH0sCisgICAgeyAgMzA1LCAgNTE4LCAgODc3LCAxMTA4LCAxNDI2LCAzMjE1LCAxNDI1LCAxMDY0LCAxMzIwLCAxMjQyIH0sCisgICAgeyAgNjgzLCAgNzMyLCAxOTI3LCAgMjU3LCAxNDkzLCAyMDQ4LCAxODU4LCAxNTUyLCAxMDU1LCAgOTQ3IH0sCisgICAgeyAgMzk0LCAgODE0LCAxMDI0LCAgNjYwLCAgOTU5LCAxNTU2LCAxMjgyLCAxMjg5LCAgODkzLCAxMDQ3IH0sCisgICAgeyAgNTI4LCAgNjE1LCAgOTk2LCAgOTQwLCAxMjAxLCAgNjM1LCAxMDk0LCAyNTE1LCAgODAzLCAxMzU4IH0sCisgICAgeyAgMzQ3LCAgNjE0LCAxNjA5LCAxMTg3LCAzMTMzLCAxMzQ1LCAxMDA3LCAxMzM5LCAxMDE3LCAgNjY3IH0sCisgICAgeyAgMjE4LCAgNzQwLCAgODc4LCAxNjA1LCAzNjUwLCAzNjUwLCAxMzQ1LCAgNzU4LCAxMzU3LCAxNjE3IH0sCisgICAgeyAgNjcyLCAgNzUwLCAxNTQxLCAgNTU4LCAxMjU3LCAxNTk5LCAxODcwLCAyMTM1LCAgNDAyLCAxMDg3IH0sCisgICAgeyAgNTkyLCAgNjg0LCAxMTYxLCAgNDMwLCAxMDkyLCAxNDk3LCAxNDc1LCAxNDg5LCAxMDk1LCAgODIyIH0gfSwKKyAgeyB7ICAyMjgsIDEwNTYsIDEwNTksIDEzNjgsICA3NTIsICA5ODIsIDE1MTIsIDE1MTgsICA5ODcsIDE3ODIgfSwKKyAgICB7ICA0OTQsICA1MTQsICA4MTgsICA5NDIsICA5NjUsICA4OTIsIDE2MTAsIDEzNTYsIDEwNDgsIDEzNjMgfSwKKyAgICB7ICA1MTIsICA2NDgsICA1OTEsIDEwNDIsICA3NjEsICA5OTEsIDExOTYsIDE0NTQsIDEzMDksIDE0NjMgfSwKKyAgICB7ICA2ODMsICA3NDksIDEwNDMsICA2NzYsICA4NDEsIDEzOTYsIDExMzMsIDExMzgsICA2NTQsICA5MzkgfSwKKyAgICB7ICA2MjIsIDExMDEsIDExMjYsICA5OTQsICAzNjEsIDEwNzcsIDEyMDMsIDEzMTgsICA4NzcsIDEyMTkgfSwKKyAgICB7ICA2MzEsIDEwNjgsICA4NTcsIDE2NTAsICA2NTEsICA0NzcsIDE2NTAsIDE0MTksICA4MjgsIDExNzAgfSwKKyAgICB7ICA1NTUsICA3MjcsIDEwNjgsIDEzMzUsIDMxMjcsIDEzMzksICA4MjAsIDEzMzEsIDEwNzcsICA0MjkgfSwKKyAgICB7ICA1MDQsICA4NzksICA2MjQsIDEzOTgsICA4ODksICA4ODksIDEzOTIsICA4MDgsICA4OTEsIDE0MDYgfSwKKyAgICB7ICA2ODMsIDE2MDIsIDEyODksICA5NzcsICA1NzgsICA5ODMsIDEyODAsIDE3MDgsICA0MDYsIDExMjIgfSwKKyAgICB7ICAzOTksICA4NjUsIDE0MzMsIDEwNzAsIDEwNzIsICA3NjQsICA5NjgsIDE0NzcsIDEyMjMsICA2NzggfSB9LAorICB7IHsgIDMzMywgIDc2MCwgIDkzNSwgMTYzOCwgMTAxMCwgIDUyOSwgMTY0NiwgMTQxMCwgMTQ3MiwgMjIxOSB9LAorICAgIHsgIDUxMiwgIDQ5NCwgIDc1MCwgMTE2MCwgMTIxNSwgIDYxMCwgMTg3MCwgMTg2OCwgMTYyOCwgMTE2OSB9LAorICAgIHsgIDU3MiwgIDY0NiwgIDQ5MiwgMTkzNCwgMTIwOCwgIDYwMywgMTU4MCwgMTA5OSwgMTM5OCwgMTk5NSB9LAorICAgIHsgIDc4NiwgIDc4OSwgIDk0MiwgIDU4MSwgMTAxOCwgIDk1MSwgMTU5OSwgMTIwNywgIDczMSwgIDc2OCB9LAorICAgIHsgIDY5MCwgMTAxNSwgIDY3MiwgMTA3OCwgIDU4MiwgIDUwNCwgMTY5MywgMTQzOCwgMTEwOCwgMjg5NyB9LAorICAgIHsgIDc2OCwgMTI2NywgIDU3MSwgMjAwNSwgMTI0MywgIDI0NCwgMjg4MSwgMTM4MCwgMTc4NiwgMTQ1MyB9LAorICAgIHsgIDQ1MiwgIDg5OSwgMTI5MywgIDkwMywgMTMxMSwgMzEwMCwgIDQ2NSwgMTMxMSwgMTMxOSwgIDgxMyB9LAorICAgIHsgIDM5NCwgIDkyNywgIDk0MiwgMTEwMywgMTM1OCwgMTEwNCwgIDk0NiwgIDU5MywgMTM2MywgMTEwOSB9LAorICAgIHsgIDU1OSwgMTAwNSwgMTAwNywgMTAxNiwgIDY1OCwgMTE3MywgMTAyMSwgMTE2NCwgIDYyMywgMTAyOCB9LAorICAgIHsgIDU2NCwgIDc5NiwgIDYzMiwgMTAwNSwgMTAxNCwgIDg2MywgMjMxNiwgMTI2OCwgIDkzOCwgIDc2NCB9IH0sCisgIHsgeyAgMjY2LCAgNjA2LCAxMDk4LCAxMjI4LCAxNDk3LCAxMjQzLCAgOTQ4LCAxMDMwLCAxNzM0LCAxNDYxIH0sCisgICAgeyAgMzY2LCAgNTg1LCAgOTAxLCAxMDYwLCAxNDA3LCAxMjQ3LCAgODc2LCAxMTM0LCAxNjIwLCAxMDU0IH0sCisgICAgeyAgNDUyLCAgNTY1LCAgNTQyLCAxNzI5LCAxNDc5LCAxNDc5LCAxMDE2LCAgODg2LCAyOTM4LCAxMTUwIH0sCisgICAgeyAgNTU1LCAxMDg4LCAxNTMzLCAgOTUwLCAxMzU0LCAgODk1LCAgODM0LCAxMDE5LCAxMDIxLCAgNDk2IH0sCisgICAgeyAgNzA0LCAgODE1LCAxMTkzLCAgOTcxLCAgOTczLCAgNjQwLCAxMjE3LCAyMjE0LCAgODMyLCAgNTc4IH0sCisgICAgeyAgNjcyLCAxMjQ1LCAgNTc5LCAgODcxLCAgODc1LCAgNzc0LCAgODcyLCAxMjczLCAxMDI3LCAgOTQ5IH0sCisgICAgeyAgMjk2LCAxMTM0LCAyMDUwLCAxNzg0LCAxNjM2LCAzNDI1LCAgNDQyLCAxNTUwLCAyMDc2LCAgNzIyIH0sCisgICAgeyAgMzQyLCAgOTgyLCAxMjU5LCAxODQ2LCAxODQ4LCAxODQ4LCAgNjIyLCAgNTY4LCAxODQ3LCAxMDUyIH0sCisgICAgeyAgNTU1LCAxMDY0LCAxMzA0LCAgODI4LCAgNzQ2LCAxMzQzLCAxMDc1LCAxMzI5LCAxMDc4LCAgNDk0IH0sCisgICAgeyAgMjg4LCAxMTY3LCAxMjg1LCAxMTc0LCAxNjM5LCAxNjM5LCAgODMzLCAyMjU0LCAxMzA0LCAgNTA5IH0gfSwKKyAgeyB7ICAzNDIsICA3MTksICA3NjcsIDE4NjYsIDE3NTcsIDEyNzAsIDEyNDYsICA1NTAsIDE3NDYsIDIxNTEgfSwKKyAgICB7ICA0ODMsICA2NTMsICA2OTQsIDE1MDksIDE0NTksIDE0MTAsIDEyMTgsICA1MDcsIDE5MTQsIDEyNjYgfSwKKyAgICB7ICA0ODgsICA3NTcsICA0NDcsIDI5NzksIDE4MTMsIDEyNjgsIDE2NTQsICA1MzksIDE4NDksIDIxMDkgfSwKKyAgICB7ICA1MjIsIDEwOTcsIDEwODUsICA4NTEsIDEzNjUsIDExMTEsICA4NTEsICA5MDEsICA5NjEsICA2MDUgfSwKKyAgICB7ICA3MDksICA3MTYsICA4NDEsICA3MjgsICA3MzYsICA5NDUsICA5NDEsICA4NjIsIDI4NDUsIDEwNTcgfSwKKyAgICB7ICA1MTIsIDEzMjMsICA1MDAsIDEzMzYsIDEwODMsICA2ODEsIDEzNDIsICA3MTcsIDE2MDQsIDEzNTAgfSwKKyAgICB7ICA0NTIsIDExNTUsIDEzNzIsIDE5MDAsIDE1MDEsIDMyOTAsICAzMTEsICA5NDQsIDE5MTksICA5MjIgfSwKKyAgICB7ICA0MDMsIDE1MjAsICA5NzcsIDIxMzIsIDE3MzMsIDM1MjIsIDEwNzYsICAyNzYsIDMzMzUsIDE1NDcgfSwKKyAgICB7ICA1NTksIDEzNzQsIDExMDEsICA2MTUsICA2NzMsIDI0NjIsICA5NzQsICA3OTUsICA5ODQsICA5ODQgfSwKKyAgICB7ICA1NDcsIDExMjIsIDEwNjIsICA4MTIsIDE0MTAsICA5NTEsIDExNDAsICA2MjIsIDEyNjgsICA2NTEgfSB9LAorICB7IHsgIDE2NSwgIDk4MiwgMTIzNSwgIDkzOCwgMTMzNCwgMTM2NiwgMTY1OSwgMTU3OCwgIDk2NCwgMTYxMiB9LAorICAgIHsgIDU5MiwgIDQyMiwgIDkyNSwgIDg0NywgMTEzOSwgMTExMiwgMTM4NywgMjAzNiwgIDg2MSwgMTA0MSB9LAorICAgIHsgIDQwMywgIDgzNywgIDczMiwgIDc3MCwgIDk0MSwgMTY1OCwgMTI1MCwgIDgwOSwgMTQwNywgMTQwNyB9LAorICAgIHsgIDg5NiwgIDg3NCwgMTA3MSwgIDM4MSwgMTU2OCwgMTcyMiwgMTQzNywgMjE5MiwgIDQ4MCwgMTAzNSB9LAorICAgIHsgIDY0MCwgMTA5OCwgMTAxMiwgMTAzMiwgIDY4NCwgMTM4MiwgMTU4MSwgMjEwNiwgIDQxNiwgIDg2NSB9LAorICAgIHsgIDU1OSwgMTAwNSwgIDgxOSwgIDkxNCwgIDcxMCwgIDc3MCwgMTQxOCwgIDkyMCwgIDgzOCwgMTQzNSB9LAorICAgIHsgIDQxNSwgMTI1OCwgMTI0NSwgIDg3MCwgMTI3OCwgMzA2NywgIDc3MCwgMTAyMSwgMTI4NywgIDUyMiB9LAorICAgIHsgIDQwNiwgIDk5MCwgIDYwMSwgMTAwOSwgMTI2NSwgMTI2NSwgMTI2NywgIDc1OSwgMTAxNywgMTI3NyB9LAorICAgIHsgIDk2OCwgMTE4MiwgMTMyOSwgIDc4OCwgMTAzMiwgMTI5MiwgMTcwNSwgMTcxNCwgIDIwMywgMTQwMyB9LAorICAgIHsgIDczMiwgIDg3NywgMTI3OSwgIDQ3MSwgIDkwMSwgMTE2MSwgMTU0NSwgMTI5NCwgIDc1NSwgIDc1NSB9IH0sCisgIHsgeyAgMTExLCAgOTMxLCAxMzc4LCAxMTg1LCAxOTMzLCAxNjQ4LCAxMTQ4LCAxNzE0LCAxODczLCAxMzA3IH0sCisgICAgeyAgNDA2LCAgNDE0LCAxMDMwLCAxMDIzLCAxOTEwLCAxNDA0LCAxMzEzLCAxNjQ3LCAxNTA5LCAgNzkzIH0sCisgICAgeyAgMzQyLCAgNjQwLCAgNTc1LCAxMDg4LCAxMjQxLCAxMzQ5LCAxMTYxLCAxMzUwLCAxNzU2LCAxNTAyIH0sCisgICAgeyAgNTU5LCAgNzY2LCAxMTg1LCAgMzU3LCAxNjgyLCAxNDI4LCAxMzI5LCAxODk3LCAxMjE5LCAgODAyIH0sCisgICAgeyAgNDczLCAgOTA5LCAxMTY0LCAgNzcxLCAgNzE5LCAyNTA4LCAxNDI3LCAxNDMyLCAgNzIyLCAgNzgyIH0sCisgICAgeyAgMzQyLCAgODkyLCAgNzg1LCAxMTQ1LCAxMTUwLCAgNzk0LCAxMjk2LCAxNTUwLCAgOTczLCAxMDU3IH0sCisgICAgeyAgMjA4LCAxMDM2LCAxMzI2LCAxMzQzLCAxNjA2LCAzMzk1LCAgODE1LCAxNDU1LCAxNjE4LCAgNzEyIH0sCisgICAgeyAgMjI4LCAgOTI4LCAgODkwLCAxMDQ2LCAzNDk5LCAxNzExLCAgOTk0LCAgODI5LCAxNzIwLCAxMzE4IH0sCisgICAgeyAgNzY4LCAgNzI0LCAxMDU4LCAgNjM2LCAgOTkxLCAxMDc1LCAxMzE5LCAxMzI0LCAgNjE2LCAgODI1IH0sCisgICAgeyAgMzA1LCAxMTY3LCAxMzU4LCAgODk5LCAxNTg3LCAxNTg3LCAgOTg3LCAxOTg4LCAxMzMyLCAgNTAxIH0gfQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJlc2lkdWFscyBzdHJ1Y3QgVlA4UmVzaWR1YWwuCisKK3ZvaWQgVlA4SW5pdFJlc2lkdWFsKGludCBmaXJzdCwgaW50IGNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgcmVzLT5jb2VmZl90eXBlID0gY29lZmZfdHlwZTsKKyAgcmVzLT5wcm9iICA9IGVuYy0+cHJvYmFfLmNvZWZmc19bY29lZmZfdHlwZV07CisgIHJlcy0+c3RhdHMgPSBlbmMtPnByb2JhXy5zdGF0c19bY29lZmZfdHlwZV07CisgIHJlcy0+Y29zdHMgPSBlbmMtPnByb2JhXy5yZW1hcHBlZF9jb3N0c19bY29lZmZfdHlwZV07CisgIHJlcy0+Zmlyc3QgPSBmaXJzdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1vZGUgY29zdHMKKworaW50IFZQOEdldENvc3RMdW1hNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IGludDE2X3QgbGV2ZWxzWzE2XSkgeworICBjb25zdCBpbnQgeCA9IChpdC0+aTRfICYgMyksIHkgPSAoaXQtPmk0XyA+PiAyKTsKKyAgVlA4UmVzaWR1YWwgcmVzOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaW50IFIgPSAwOworICBpbnQgY3R4OworCisgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMobGV2ZWxzLCAmcmVzKTsKKyAgUiArPSBWUDhHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKKyAgcmV0dXJuIFI7Cit9CisKK2ludCBWUDhHZXRDb3N0THVtYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBWUDhSZXNpZHVhbCByZXM7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpbnQgeCwgeTsKKyAgaW50IFIgPSAwOworCisgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgICAvLyByZS1pbXBvcnQgdGhlIG5vbi16ZXJvIGNvbnRleHQKKworICAvLyBEQworICBWUDhJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKKyAgUiArPSBWUDhHZXRSZXNpZHVhbENvc3QoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOworCisgIC8vIEFDCisgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgUiArPSBWUDhHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKKyAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gKHJlcy5sYXN0ID49IDApOworICAgIH0KKyAgfQorICByZXR1cm4gUjsKK30KKworaW50IFZQOEdldENvc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgVlA4UmVzaWR1YWwgcmVzOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaW50IGNoLCB4LCB5OworICBpbnQgUiA9IDA7CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOyAgLy8gcmUtaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0CisKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIFIgKz0gVlA4R2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0gKHJlcy5sYXN0ID49IDApOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gUjsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVjb3JkaW5nIG9mIHRva2VuIHByb2JhYmlsaXRpZXMuCisKKy8vIFJlY29yZCBwcm9iYSBjb250ZXh0IHVzZWQKK3N0YXRpYyBpbnQgUmVjb3JkKGludCBiaXQsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7CisgIHByb2JhX3QgcCA9ICpzdGF0czsKKyAgaWYgKHAgPj0gMHhmZmZmMDAwMHUpIHsgICAgICAgICAgICAgICAvLyBhbiBvdmVyZmxvdyBpcyBpbmJvdW5kLgorICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KKyAgfQorICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KKyAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKKyAgKnN0YXRzID0gcDsKKyAgcmV0dXJuIGJpdDsKK30KKworLy8gV2Uga2VlcCB0aGUgdGFibGUtZnJlZSB2YXJpYW50IGFyb3VuZCBmb3IgcmVmZXJlbmNlLCBpbiBjYXNlLgorI2RlZmluZSBVU0VfTEVWRUxfQ09ERV9UQUJMRQorCisvLyBTaW11bGF0ZSBibG9jayBjb2RpbmcsIGJ1dCBvbmx5IHJlY29yZCBzdGF0aXN0aWNzLgorLy8gTm90ZTogbm8gbmVlZCB0byByZWNvcmQgdGhlIGZpeGVkIHByb2Jhcy4KK2ludCBWUDhSZWNvcmRDb2VmZnMoaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07CisgIGlmIChyZXMtPmxhc3QgIDwgMCkgeworICAgIFJlY29yZCgwLCBzICsgMCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgd2hpbGUgKG4gPD0gcmVzLT5sYXN0KSB7CisgICAgaW50IHY7CisgICAgUmVjb3JkKDEsIHMgKyAwKTsgIC8vIG9yZGVyIG9mIHJlY29yZCBkb2Vzbid0IG1hdHRlcgorICAgIHdoaWxlICgodiA9IHJlcy0+Y29lZmZzW24rK10pID09IDApIHsKKyAgICAgIFJlY29yZCgwLCBzICsgMSk7CisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgfQorICAgIFJlY29yZCgxLCBzICsgMSk7CisgICAgaWYgKCFSZWNvcmQoMnUgPCAodW5zaWduZWQgaW50KSh2ICsgMSksIHMgKyAyKSkgeyAgLy8gdiA9IC0xIG9yIDEKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IGFicyh2KTsKKyNpZiAhZGVmaW5lZChVU0VfTEVWRUxfQ09ERV9UQUJMRSkKKyAgICAgIGlmICghUmVjb3JkKHYgPiA0LCBzICsgMykpIHsKKyAgICAgICAgaWYgKFJlY29yZCh2ICE9IDIsIHMgKyA0KSkKKyAgICAgICAgICBSZWNvcmQodiA9PSA0LCBzICsgNSk7CisgICAgICB9IGVsc2UgaWYgKCFSZWNvcmQodiA+IDEwLCBzICsgNikpIHsKKyAgICAgICAgUmVjb3JkKHYgPiA2LCBzICsgNyk7CisgICAgICB9IGVsc2UgaWYgKCFSZWNvcmQoKHYgPj0gMyArICg4IDw8IDIpKSwgcyArIDgpKSB7CisgICAgICAgIFJlY29yZCgodiA+PSAzICsgKDggPDwgMSkpLCBzICsgOSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBSZWNvcmQoKHYgPj0gMyArICg4IDw8IDMpKSwgcyArIDEwKTsKKyAgICAgIH0KKyNlbHNlCisgICAgICBpZiAodiA+IE1BWF9WQVJJQUJMRV9MRVZFTCkgeworICAgICAgICB2ID0gTUFYX1ZBUklBQkxFX0xFVkVMOworICAgICAgfQorCisgICAgICB7CisgICAgICAgIGNvbnN0IGludCBiaXRzID0gVlA4TGV2ZWxDb2Rlc1t2IC0gMV1bMV07CisgICAgICAgIGludCBwYXR0ZXJuID0gVlA4TGV2ZWxDb2Rlc1t2IC0gMV1bMF07CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyAocGF0dGVybiA+Pj0gMSkgIT0gMDsgKytpKSB7CisgICAgICAgICAgY29uc3QgaW50IG1hc2sgPSAyIDw8IGk7CisgICAgICAgICAgaWYgKHBhdHRlcm4gJiAxKSBSZWNvcmQoISEoYml0cyAmIG1hc2spLCBzICsgMyArIGkpOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsyXTsKKyAgICB9CisgIH0KKyAgaWYgKG4gPCAxNikgUmVjb3JkKDAsIHMgKyAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvY29zdC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhkY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29zdCB0YWJsZXMgZm9yIGxldmVsIGFuZCBtb2Rlcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRU5DX0NPU1RfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9FTkNfQ09TVF9IXworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIE9uLXRoZS1mbHkgaW5mbyBhYm91dCB0aGUgY3VycmVudCBzZXQgb2YgcmVzaWR1YWxzLiBIYW5keSB0byBhdm9pZAorLy8gcGFzc2luZyB6aWxsaW9ucyBvZiBwYXJhbXMuCit0eXBlZGVmIHN0cnVjdCBWUDhSZXNpZHVhbCBWUDhSZXNpZHVhbDsKK3N0cnVjdCBWUDhSZXNpZHVhbCB7CisgIGludCBmaXJzdDsKKyAgaW50IGxhc3Q7CisgIGNvbnN0IGludDE2X3QqIGNvZWZmczsKKworICBpbnQgY29lZmZfdHlwZTsKKyAgUHJvYmFBcnJheSogICBwcm9iOworICBTdGF0c0FycmF5KiAgIHN0YXRzOworICBDb3N0QXJyYXlQdHIgIGNvc3RzOworfTsKKwordm9pZCBWUDhJbml0UmVzaWR1YWwoaW50IGZpcnN0LCBpbnQgY29lZmZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcyk7CisKK2ludCBWUDhSZWNvcmRDb2VmZnMoaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcyk7CisKKy8vIENvc3Qgb2YgY29kaW5nIG9uZSBldmVudCB3aXRoIHByb2JhYmlsaXR5ICdwcm9iYScuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEJpdENvc3QoaW50IGJpdCwgdWludDhfdCBwcm9iYSkgeworICByZXR1cm4gIWJpdCA/IFZQOEVudHJvcHlDb3N0W3Byb2JhXSA6IFZQOEVudHJvcHlDb3N0WzI1NSAtIHByb2JhXTsKK30KKworLy8gTGV2ZWwgY29zdCBjYWxjdWxhdGlvbnMKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhMZXZlbENvZGVzW01BWF9WQVJJQUJMRV9MRVZFTF1bMl07Cit2b2lkIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKTsKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TGV2ZWxDb3N0KGNvbnN0IHVpbnQxNl90KiBjb25zdCB0YWJsZSwgaW50IGxldmVsKSB7CisgIHJldHVybiBWUDhMZXZlbEZpeGVkQ29zdHNbbGV2ZWxdCisgICAgICAgKyB0YWJsZVsobGV2ZWwgPiBNQVhfVkFSSUFCTEVfTEVWRUwpID8gTUFYX1ZBUklBQkxFX0xFVkVMIDogbGV2ZWxdOworfQorCisvLyBNb2RlIGNvc3RzCitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c1VWWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJMTZbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0k0W05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9FTkNfQ09TVF9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9kZWx0YV9wYWxldHRpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYTEyOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9kZWx0YV9wYWxldHRpemF0aW9uLmMKQEAgLTAsMCArMSw0NTUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IE1pc2xhdiBCcmFkYWMgKG1pc2xhdm1AZ29vZ2xlLmNvbSkKKy8vCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9kZWx0YV9wYWxldHRpemF0aW9uLmgiCisKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICIuLi9kc3AvbG9zc2xlc3MuaCIKKworI2RlZmluZSBNS19DT0wociwgZywgYikgKCgocikgPDwgMTYpICsgKChnKSA8PCA4KSArIChiKSkKKworLy8gRm9ybWF0IGFsbG93cyBwYWxldHRlIHVwIHRvIDI1NiBlbnRyaWVzLCBidXQgbW9yZSBwYWxldHRlIGVudHJpZXMgcHJvZHVjZQorLy8gYmlnZ2VyIGVudHJvcHkuIEluIHRoZSBmdXR1cmUgaXQgd2lsbCBwcm9iYWJseSBiZSB1c2VmdWwgdG8gYWRkIG1vcmUgZW50cmllcworLy8gdGhhdCBhcmUgZmFyIGZyb20gdGhlIG9yaWdpbiBvZiB0aGUgcGFsZXR0ZSBvciBjaG9vc2UgcmVtYWluaW5nIGVudHJpZXMKKy8vIGR5bmFtaWNhbGx5LgorI2RlZmluZSBERUxUQV9QQUxFVFRFX1NJWkUgMjI2CisKKy8vIFBhbGV0dGUgdXNlZCBmb3IgZGVsdGFfcGFsZXR0aXphdGlvbi4gRW50cmllcyBhcmUgcm91Z2hseSBzb3J0ZWQgYnkgZGlzdGFuY2UKKy8vIG9mIHRoZWlyIHNpZ25lZCBlcXVpdmFsZW50cyBmcm9tIHRoZSBvcmlnaW4uCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0RlbHRhUGFsZXR0ZVtERUxUQV9QQUxFVFRFX1NJWkVdID0geworICBNS19DT0woMHUsIDB1LCAwdSksCisgIE1LX0NPTCgyNTV1LCAyNTV1LCAyNTV1KSwKKyAgTUtfQ09MKDF1LCAxdSwgMXUpLAorICBNS19DT0woMjU0dSwgMjU0dSwgMjU0dSksCisgIE1LX0NPTCgydSwgMnUsIDJ1KSwKKyAgTUtfQ09MKDR1LCA0dSwgNHUpLAorICBNS19DT0woMjUydSwgMjUydSwgMjUydSksCisgIE1LX0NPTCgyNTB1LCAwdSwgMHUpLAorICBNS19DT0woMHUsIDI1MHUsIDB1KSwKKyAgTUtfQ09MKDB1LCAwdSwgMjUwdSksCisgIE1LX0NPTCg2dSwgMHUsIDB1KSwKKyAgTUtfQ09MKDB1LCA2dSwgMHUpLAorICBNS19DT0woMHUsIDB1LCA2dSksCisgIE1LX0NPTCgwdSwgMHUsIDI0OHUpLAorICBNS19DT0woMHUsIDB1LCA4dSksCisgIE1LX0NPTCgwdSwgMjQ4dSwgMHUpLAorICBNS19DT0woMHUsIDI0OHUsIDI0OHUpLAorICBNS19DT0woMHUsIDI0OHUsIDh1KSwKKyAgTUtfQ09MKDB1LCA4dSwgMHUpLAorICBNS19DT0woMHUsIDh1LCAyNDh1KSwKKyAgTUtfQ09MKDB1LCA4dSwgOHUpLAorICBNS19DT0woOHUsIDh1LCA4dSksCisgIE1LX0NPTCgyNDh1LCAwdSwgMHUpLAorICBNS19DT0woMjQ4dSwgMHUsIDI0OHUpLAorICBNS19DT0woMjQ4dSwgMHUsIDh1KSwKKyAgTUtfQ09MKDI0OHUsIDI0OHUsIDB1KSwKKyAgTUtfQ09MKDI0OHUsIDh1LCAwdSksCisgIE1LX0NPTCg4dSwgMHUsIDB1KSwKKyAgTUtfQ09MKDh1LCAwdSwgMjQ4dSksCisgIE1LX0NPTCg4dSwgMHUsIDh1KSwKKyAgTUtfQ09MKDh1LCAyNDh1LCAwdSksCisgIE1LX0NPTCg4dSwgOHUsIDB1KSwKKyAgTUtfQ09MKDIzdSwgMjN1LCAyM3UpLAorICBNS19DT0woMTN1LCAxM3UsIDEzdSksCisgIE1LX0NPTCgyMzJ1LCAyMzJ1LCAyMzJ1KSwKKyAgTUtfQ09MKDI0NHUsIDI0NHUsIDI0NHUpLAorICBNS19DT0woMjQ1dSwgMjQ1dSwgMjUwdSksCisgIE1LX0NPTCg1MHUsIDUwdSwgNTB1KSwKKyAgTUtfQ09MKDIwNHUsIDIwNHUsIDIwNHUpLAorICBNS19DT0woMjM2dSwgMjM2dSwgMjM2dSksCisgIE1LX0NPTCgxNnUsIDE2dSwgMTZ1KSwKKyAgTUtfQ09MKDI0MHUsIDE2dSwgMTZ1KSwKKyAgTUtfQ09MKDE2dSwgMjQwdSwgMTZ1KSwKKyAgTUtfQ09MKDI0MHUsIDI0MHUsIDE2dSksCisgIE1LX0NPTCgxNnUsIDE2dSwgMjQwdSksCisgIE1LX0NPTCgyNDB1LCAxNnUsIDI0MHUpLAorICBNS19DT0woMTZ1LCAyNDB1LCAyNDB1KSwKKyAgTUtfQ09MKDI0MHUsIDI0MHUsIDI0MHUpLAorICBNS19DT0woMHUsIDB1LCAyMzJ1KSwKKyAgTUtfQ09MKDB1LCAyMzJ1LCAwdSksCisgIE1LX0NPTCgyMzJ1LCAwdSwgMHUpLAorICBNS19DT0woMHUsIDB1LCAyNHUpLAorICBNS19DT0woMHUsIDI0dSwgMHUpLAorICBNS19DT0woMjR1LCAwdSwgMHUpLAorICBNS19DT0woMzJ1LCAzMnUsIDMydSksCisgIE1LX0NPTCgyMjR1LCAzMnUsIDMydSksCisgIE1LX0NPTCgzMnUsIDIyNHUsIDMydSksCisgIE1LX0NPTCgyMjR1LCAyMjR1LCAzMnUpLAorICBNS19DT0woMzJ1LCAzMnUsIDIyNHUpLAorICBNS19DT0woMjI0dSwgMzJ1LCAyMjR1KSwKKyAgTUtfQ09MKDMydSwgMjI0dSwgMjI0dSksCisgIE1LX0NPTCgyMjR1LCAyMjR1LCAyMjR1KSwKKyAgTUtfQ09MKDB1LCAwdSwgMTc2dSksCisgIE1LX0NPTCgwdSwgMHUsIDgwdSksCisgIE1LX0NPTCgwdSwgMTc2dSwgMHUpLAorICBNS19DT0woMHUsIDE3NnUsIDE3NnUpLAorICBNS19DT0woMHUsIDE3NnUsIDgwdSksCisgIE1LX0NPTCgwdSwgODB1LCAwdSksCisgIE1LX0NPTCgwdSwgODB1LCAxNzZ1KSwKKyAgTUtfQ09MKDB1LCA4MHUsIDgwdSksCisgIE1LX0NPTCgxNzZ1LCAwdSwgMHUpLAorICBNS19DT0woMTc2dSwgMHUsIDE3NnUpLAorICBNS19DT0woMTc2dSwgMHUsIDgwdSksCisgIE1LX0NPTCgxNzZ1LCAxNzZ1LCAwdSksCisgIE1LX0NPTCgxNzZ1LCA4MHUsIDB1KSwKKyAgTUtfQ09MKDgwdSwgMHUsIDB1KSwKKyAgTUtfQ09MKDgwdSwgMHUsIDE3NnUpLAorICBNS19DT0woODB1LCAwdSwgODB1KSwKKyAgTUtfQ09MKDgwdSwgMTc2dSwgMHUpLAorICBNS19DT0woODB1LCA4MHUsIDB1KSwKKyAgTUtfQ09MKDB1LCAwdSwgMTUydSksCisgIE1LX0NPTCgwdSwgMHUsIDEwNHUpLAorICBNS19DT0woMHUsIDE1MnUsIDB1KSwKKyAgTUtfQ09MKDB1LCAxNTJ1LCAxNTJ1KSwKKyAgTUtfQ09MKDB1LCAxNTJ1LCAxMDR1KSwKKyAgTUtfQ09MKDB1LCAxMDR1LCAwdSksCisgIE1LX0NPTCgwdSwgMTA0dSwgMTUydSksCisgIE1LX0NPTCgwdSwgMTA0dSwgMTA0dSksCisgIE1LX0NPTCgxNTJ1LCAwdSwgMHUpLAorICBNS19DT0woMTUydSwgMHUsIDE1MnUpLAorICBNS19DT0woMTUydSwgMHUsIDEwNHUpLAorICBNS19DT0woMTUydSwgMTUydSwgMHUpLAorICBNS19DT0woMTUydSwgMTA0dSwgMHUpLAorICBNS19DT0woMTA0dSwgMHUsIDB1KSwKKyAgTUtfQ09MKDEwNHUsIDB1LCAxNTJ1KSwKKyAgTUtfQ09MKDEwNHUsIDB1LCAxMDR1KSwKKyAgTUtfQ09MKDEwNHUsIDE1MnUsIDB1KSwKKyAgTUtfQ09MKDEwNHUsIDEwNHUsIDB1KSwKKyAgTUtfQ09MKDIxNnUsIDIxNnUsIDIxNnUpLAorICBNS19DT0woMjE2dSwgMjE2dSwgNDB1KSwKKyAgTUtfQ09MKDIxNnUsIDIxNnUsIDE3NnUpLAorICBNS19DT0woMjE2dSwgMjE2dSwgODB1KSwKKyAgTUtfQ09MKDIxNnUsIDQwdSwgMjE2dSksCisgIE1LX0NPTCgyMTZ1LCA0MHUsIDQwdSksCisgIE1LX0NPTCgyMTZ1LCA0MHUsIDE3NnUpLAorICBNS19DT0woMjE2dSwgNDB1LCA4MHUpLAorICBNS19DT0woMjE2dSwgMTc2dSwgMjE2dSksCisgIE1LX0NPTCgyMTZ1LCAxNzZ1LCA0MHUpLAorICBNS19DT0woMjE2dSwgMTc2dSwgMTc2dSksCisgIE1LX0NPTCgyMTZ1LCAxNzZ1LCA4MHUpLAorICBNS19DT0woMjE2dSwgODB1LCAyMTZ1KSwKKyAgTUtfQ09MKDIxNnUsIDgwdSwgNDB1KSwKKyAgTUtfQ09MKDIxNnUsIDgwdSwgMTc2dSksCisgIE1LX0NPTCgyMTZ1LCA4MHUsIDgwdSksCisgIE1LX0NPTCg0MHUsIDIxNnUsIDIxNnUpLAorICBNS19DT0woNDB1LCAyMTZ1LCA0MHUpLAorICBNS19DT0woNDB1LCAyMTZ1LCAxNzZ1KSwKKyAgTUtfQ09MKDQwdSwgMjE2dSwgODB1KSwKKyAgTUtfQ09MKDQwdSwgNDB1LCAyMTZ1KSwKKyAgTUtfQ09MKDQwdSwgNDB1LCA0MHUpLAorICBNS19DT0woNDB1LCA0MHUsIDE3NnUpLAorICBNS19DT0woNDB1LCA0MHUsIDgwdSksCisgIE1LX0NPTCg0MHUsIDE3NnUsIDIxNnUpLAorICBNS19DT0woNDB1LCAxNzZ1LCA0MHUpLAorICBNS19DT0woNDB1LCAxNzZ1LCAxNzZ1KSwKKyAgTUtfQ09MKDQwdSwgMTc2dSwgODB1KSwKKyAgTUtfQ09MKDQwdSwgODB1LCAyMTZ1KSwKKyAgTUtfQ09MKDQwdSwgODB1LCA0MHUpLAorICBNS19DT0woNDB1LCA4MHUsIDE3NnUpLAorICBNS19DT0woNDB1LCA4MHUsIDgwdSksCisgIE1LX0NPTCg4MHUsIDIxNnUsIDIxNnUpLAorICBNS19DT0woODB1LCAyMTZ1LCA0MHUpLAorICBNS19DT0woODB1LCAyMTZ1LCAxNzZ1KSwKKyAgTUtfQ09MKDgwdSwgMjE2dSwgODB1KSwKKyAgTUtfQ09MKDgwdSwgNDB1LCAyMTZ1KSwKKyAgTUtfQ09MKDgwdSwgNDB1LCA0MHUpLAorICBNS19DT0woODB1LCA0MHUsIDE3NnUpLAorICBNS19DT0woODB1LCA0MHUsIDgwdSksCisgIE1LX0NPTCg4MHUsIDE3NnUsIDIxNnUpLAorICBNS19DT0woODB1LCAxNzZ1LCA0MHUpLAorICBNS19DT0woODB1LCAxNzZ1LCAxNzZ1KSwKKyAgTUtfQ09MKDgwdSwgMTc2dSwgODB1KSwKKyAgTUtfQ09MKDgwdSwgODB1LCAyMTZ1KSwKKyAgTUtfQ09MKDgwdSwgODB1LCA0MHUpLAorICBNS19DT0woODB1LCA4MHUsIDE3NnUpLAorICBNS19DT0woODB1LCA4MHUsIDgwdSksCisgIE1LX0NPTCgwdSwgMHUsIDE5MnUpLAorICBNS19DT0woMHUsIDB1LCA2NHUpLAorICBNS19DT0woMHUsIDB1LCAxMjh1KSwKKyAgTUtfQ09MKDB1LCAxOTJ1LCAwdSksCisgIE1LX0NPTCgwdSwgMTkydSwgMTkydSksCisgIE1LX0NPTCgwdSwgMTkydSwgNjR1KSwKKyAgTUtfQ09MKDB1LCAxOTJ1LCAxMjh1KSwKKyAgTUtfQ09MKDB1LCA2NHUsIDB1KSwKKyAgTUtfQ09MKDB1LCA2NHUsIDE5MnUpLAorICBNS19DT0woMHUsIDY0dSwgNjR1KSwKKyAgTUtfQ09MKDB1LCA2NHUsIDEyOHUpLAorICBNS19DT0woMHUsIDEyOHUsIDB1KSwKKyAgTUtfQ09MKDB1LCAxMjh1LCAxOTJ1KSwKKyAgTUtfQ09MKDB1LCAxMjh1LCA2NHUpLAorICBNS19DT0woMHUsIDEyOHUsIDEyOHUpLAorICBNS19DT0woMTc2dSwgMjE2dSwgMjE2dSksCisgIE1LX0NPTCgxNzZ1LCAyMTZ1LCA0MHUpLAorICBNS19DT0woMTc2dSwgMjE2dSwgMTc2dSksCisgIE1LX0NPTCgxNzZ1LCAyMTZ1LCA4MHUpLAorICBNS19DT0woMTc2dSwgNDB1LCAyMTZ1KSwKKyAgTUtfQ09MKDE3NnUsIDQwdSwgNDB1KSwKKyAgTUtfQ09MKDE3NnUsIDQwdSwgMTc2dSksCisgIE1LX0NPTCgxNzZ1LCA0MHUsIDgwdSksCisgIE1LX0NPTCgxNzZ1LCAxNzZ1LCAyMTZ1KSwKKyAgTUtfQ09MKDE3NnUsIDE3NnUsIDQwdSksCisgIE1LX0NPTCgxNzZ1LCAxNzZ1LCAxNzZ1KSwKKyAgTUtfQ09MKDE3NnUsIDE3NnUsIDgwdSksCisgIE1LX0NPTCgxNzZ1LCA4MHUsIDIxNnUpLAorICBNS19DT0woMTc2dSwgODB1LCA0MHUpLAorICBNS19DT0woMTc2dSwgODB1LCAxNzZ1KSwKKyAgTUtfQ09MKDE3NnUsIDgwdSwgODB1KSwKKyAgTUtfQ09MKDE5MnUsIDB1LCAwdSksCisgIE1LX0NPTCgxOTJ1LCAwdSwgMTkydSksCisgIE1LX0NPTCgxOTJ1LCAwdSwgNjR1KSwKKyAgTUtfQ09MKDE5MnUsIDB1LCAxMjh1KSwKKyAgTUtfQ09MKDE5MnUsIDE5MnUsIDB1KSwKKyAgTUtfQ09MKDE5MnUsIDE5MnUsIDE5MnUpLAorICBNS19DT0woMTkydSwgMTkydSwgNjR1KSwKKyAgTUtfQ09MKDE5MnUsIDE5MnUsIDEyOHUpLAorICBNS19DT0woMTkydSwgNjR1LCAwdSksCisgIE1LX0NPTCgxOTJ1LCA2NHUsIDE5MnUpLAorICBNS19DT0woMTkydSwgNjR1LCA2NHUpLAorICBNS19DT0woMTkydSwgNjR1LCAxMjh1KSwKKyAgTUtfQ09MKDE5MnUsIDEyOHUsIDB1KSwKKyAgTUtfQ09MKDE5MnUsIDEyOHUsIDE5MnUpLAorICBNS19DT0woMTkydSwgMTI4dSwgNjR1KSwKKyAgTUtfQ09MKDE5MnUsIDEyOHUsIDEyOHUpLAorICBNS19DT0woNjR1LCAwdSwgMHUpLAorICBNS19DT0woNjR1LCAwdSwgMTkydSksCisgIE1LX0NPTCg2NHUsIDB1LCA2NHUpLAorICBNS19DT0woNjR1LCAwdSwgMTI4dSksCisgIE1LX0NPTCg2NHUsIDE5MnUsIDB1KSwKKyAgTUtfQ09MKDY0dSwgMTkydSwgMTkydSksCisgIE1LX0NPTCg2NHUsIDE5MnUsIDY0dSksCisgIE1LX0NPTCg2NHUsIDE5MnUsIDEyOHUpLAorICBNS19DT0woNjR1LCA2NHUsIDB1KSwKKyAgTUtfQ09MKDY0dSwgNjR1LCAxOTJ1KSwKKyAgTUtfQ09MKDY0dSwgNjR1LCA2NHUpLAorICBNS19DT0woNjR1LCA2NHUsIDEyOHUpLAorICBNS19DT0woNjR1LCAxMjh1LCAwdSksCisgIE1LX0NPTCg2NHUsIDEyOHUsIDE5MnUpLAorICBNS19DT0woNjR1LCAxMjh1LCA2NHUpLAorICBNS19DT0woNjR1LCAxMjh1LCAxMjh1KSwKKyAgTUtfQ09MKDEyOHUsIDB1LCAwdSksCisgIE1LX0NPTCgxMjh1LCAwdSwgMTkydSksCisgIE1LX0NPTCgxMjh1LCAwdSwgNjR1KSwKKyAgTUtfQ09MKDEyOHUsIDB1LCAxMjh1KSwKKyAgTUtfQ09MKDEyOHUsIDE5MnUsIDB1KSwKKyAgTUtfQ09MKDEyOHUsIDE5MnUsIDE5MnUpLAorICBNS19DT0woMTI4dSwgMTkydSwgNjR1KSwKKyAgTUtfQ09MKDEyOHUsIDE5MnUsIDEyOHUpLAorICBNS19DT0woMTI4dSwgNjR1LCAwdSksCisgIE1LX0NPTCgxMjh1LCA2NHUsIDE5MnUpLAorICBNS19DT0woMTI4dSwgNjR1LCA2NHUpLAorICBNS19DT0woMTI4dSwgNjR1LCAxMjh1KSwKKyAgTUtfQ09MKDEyOHUsIDEyOHUsIDB1KSwKKyAgTUtfQ09MKDEyOHUsIDEyOHUsIDE5MnUpLAorICBNS19DT0woMTI4dSwgMTI4dSwgNjR1KSwKKyAgTUtfQ09MKDEyOHUsIDEyOHUsIDEyOHUpLAorfTsKKworI3VuZGVmIE1LX0NPTAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVE9ETyhza2FsKTogbW92ZSB0aGUgZnVuY3Rpb25zIHRvIGRzcC9sb3NzbGVzcy5jIHdoZW4gdGhlIGNvcnJlY3QKKy8vIGdyYW51bGFyaXR5IGlzIGZvdW5kLiBGb3Igbm93LCB3ZSdsbCBqdXN0IGNvcHktcGFzdGUgc29tZSB1c2VmdWwgYml0cworLy8gaGVyZSBpbnN0ZWFkLgorCisvLyBJbi1wbGFjZSBzdW0gb2YgZWFjaCBjb21wb25lbnQgd2l0aCBtb2QgMjU2Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkUGl4ZWxzRXEodWludDMyX3QqIGEsIHVpbnQzMl90IGIpIHsKKyAgY29uc3QgdWludDMyX3QgYWxwaGFfYW5kX2dyZWVuID0gKCphICYgMHhmZjAwZmYwMHUpICsgKGIgJiAweGZmMDBmZjAwdSk7CisgIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9ICgqYSAmIDB4MDBmZjAwZmZ1KSArIChiICYgMHgwMGZmMDBmZnUpOworICAqYSA9IChhbHBoYV9hbmRfZ3JlZW4gJiAweGZmMDBmZjAwdSkgfCAocmVkX2FuZF9ibHVlICYgMHgwMGZmMDBmZnUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xpcDI1NSh1aW50MzJfdCBhKSB7CisgIGlmIChhIDwgMjU2KSB7CisgICAgcmV0dXJuIGE7CisgIH0KKyAgLy8gcmV0dXJuIDAsIHdoZW4gYSBpcyBhIG5lZ2F0aXZlIGludGVnZXIuCisgIC8vIHJldHVybiAyNTUsIHdoZW4gYSBpcyBwb3NpdGl2ZS4KKyAgcmV0dXJuIH5hID4+IDI0OworfQorCisvLyBEZWx0YSBwYWxldHRpemF0aW9uIGZ1bmN0aW9ucy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgU3F1YXJlKGludCB4KSB7CisgIHJldHVybiB4ICogeDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEludGVuc2l0eSh1aW50MzJfdCBhKSB7CisgIHJldHVybgorICAgICAgMzAgKiAoKGEgPj4gMTYpICYgMHhmZikgKworICAgICAgNTkgKiAoKGEgPj4gIDgpICYgMHhmZikgKworICAgICAgMTEgKiAoKGEgPj4gIDApICYgMHhmZik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBDYWxjRGlzdCh1aW50MzJfdCBwcmVkaWN0ZWRfdmFsdWUsIHVpbnQzMl90IGFjdHVhbF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYWxldHRlX2VudHJ5KSB7CisgIGludCBpOworICB1aW50MzJfdCBkaXN0YW5jZSA9IDA7CisgIEFkZFBpeGVsc0VxKCZwcmVkaWN0ZWRfdmFsdWUsIHBhbGV0dGVfZW50cnkpOworICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gOCkgeworICAgIGNvbnN0IGludDMyX3QgYXYgPSAoYWN0dWFsX3ZhbHVlID4+IGkpICYgMHhmZjsKKyAgICBjb25zdCBpbnQzMl90IHB2ID0gKHByZWRpY3RlZF92YWx1ZSA+PiBpKSAmIDB4ZmY7CisgICAgZGlzdGFuY2UgKz0gU3F1YXJlKHB2IC0gYXYpOworICB9CisgIC8vIFdlIHN1bSBzcXVhcmUgb2YgaW50ZW5zaXR5IGRpZmZlcmVuY2Ugd2l0aCBmYWN0b3IgMTAsIGJ1dCBiZWNhdXNlIEludGVuc2l0eQorICAvLyByZXR1cm5zIDEwMCB0aW1lcyByZWFsIGludGVuc2l0eSB3ZSBuZWVkIHRvIG11bHRpcGx5IGRpZmZlcmVuY2VzIG9mIGNvbG9ycworICAvLyBieSAxMDAwLgorICBkaXN0YW5jZSAqPSAxMDAwdTsKKyAgZGlzdGFuY2UgKz0gU3F1YXJlKEludGVuc2l0eShwcmVkaWN0ZWRfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAtIEludGVuc2l0eShhY3R1YWxfdmFsdWUpKTsKKyAgcmV0dXJuIGRpc3RhbmNlOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdChpbnQgeCwgaW50IHksIHVpbnQzMl90KiBpbWFnZSkgeworICBjb25zdCB1aW50MzJfdCB0ID0gKHkgPT0gMCkgPyBBUkdCX0JMQUNLIDogaW1hZ2VbeF07CisgIGNvbnN0IHVpbnQzMl90IGwgPSAoeCA9PSAwKSA/IEFSR0JfQkxBQ0sgOiBpbWFnZVt4IC0gMV07CisgIGNvbnN0IHVpbnQzMl90IHAgPQorICAgICAgKCgoKCh0ID4+IDI0KSAmIDB4ZmYpICsgKChsID4+IDI0KSAmIDB4ZmYpKSAvIDIpIDw8IDI0KSArCisgICAgICAoKCgoKHQgPj4gMTYpICYgMHhmZikgKyAoKGwgPj4gMTYpICYgMHhmZikpIC8gMikgPDwgMTYpICsKKyAgICAgICgoKCgodCA+PiAgOCkgJiAweGZmKSArICgobCA+PiAgOCkgJiAweGZmKSkgLyAyKSA8PCAgOCkgKworICAgICAgKCgoKCh0ID4+ICAwKSAmIDB4ZmYpICsgKChsID4+ICAwKSAmIDB4ZmYpKSAvIDIpIDw8ICAwKTsKKyAgaWYgKHggPT0gMCAmJiB5ID09IDApIHJldHVybiBBUkdCX0JMQUNLOworICBpZiAoeCA9PSAwKSByZXR1cm4gdDsKKyAgaWYgKHkgPT0gMCkgcmV0dXJuIGw7CisgIHJldHVybiBwOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbFdpdGhDb2VmZmljaWVudCgKKyAgICBpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIHJldHVybiBDbGlwMjU1KGEgKyAoKGIgLSBjKSA+PiAyKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsV2l0aENvZWZmaWNpZW50KAorICAgIHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgaW50IGEgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGxXaXRoQ29lZmZpY2llbnQoCisgICAgICBjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGxXaXRoQ29lZmZpY2llbnQoKGMwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDE2KSAmIDB4ZmYpOworICBjb25zdCBpbnQgZyA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbFdpdGhDb2VmZmljaWVudCgoYzAgPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDgpICYgMHhmZik7CisgIGNvbnN0IGludCBiID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsV2l0aENvZWZmaWNpZW50KAorICAgICAgYzAgJiAweGZmLCBjMSAmIDB4ZmYsIGMyICYgMHhmZik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaW5kIHBhbGV0dGUgZW50cnkgd2l0aCBtaW5pbXVtIGVycm9yIGZyb20gZGlmZmVyZW5jZSBvZiBhY3R1YWwgcGl4ZWwgdmFsdWUKKy8vIGFuZCBwcmVkaWN0ZWQgcGl4ZWwgdmFsdWUuIFByb3BhZ2F0ZSBlcnJvciBvZiBwaXhlbCB0byBpdHMgdG9wIGFuZCBsZWZ0IHBpeGVsCisvLyBpbiBzcmMgYXJyYXkuIFdyaXRlIHByZWRpY3RlZF92YWx1ZSArIHBhbGV0dGVfZW50cnkgdG8gbmV3X2ltYWdlLiBSZXR1cm4KKy8vIGluZGV4IG9mIGJlc3QgcGFsZXR0ZSBlbnRyeS4KK3N0YXRpYyBpbnQgRmluZEJlc3RQYWxldHRlRW50cnkodWludDMyX3Qgc3JjLCB1aW50MzJfdCBwcmVkaWN0ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IHBhbGV0dGVfc2l6ZSkgeworICBpbnQgaTsKKyAgaW50IGlkeCA9IDA7CisgIHVpbnQzMl90IGJlc3RfZGlzdGFuY2UgPSBDYWxjRGlzdChwcmVkaWN0ZWRfdmFsdWUsIHNyYywgcGFsZXR0ZVswXSk7CisgIGZvciAoaSA9IDE7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGRpc3RhbmNlID0gQ2FsY0Rpc3QocHJlZGljdGVkX3ZhbHVlLCBzcmMsIHBhbGV0dGVbaV0pOworICAgIGlmIChkaXN0YW5jZSA8IGJlc3RfZGlzdGFuY2UpIHsKKyAgICAgIGJlc3RfZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICAgIGlkeCA9IGk7CisgICAgfQorICB9CisgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIEFwcGx5QmVzdFBhbGV0dGVFbnRyeShpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmV3X3ZhbHVlLCB1aW50MzJfdCBwYWxldHRlX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBuZXdfaW1hZ2UpIHsKKyAgQWRkUGl4ZWxzRXEoJm5ld192YWx1ZSwgcGFsZXR0ZV92YWx1ZSk7CisgIGlmICh4ID4gMCkgeworICAgIHNyY1t4IC0gMV0gPSBDbGFtcGVkQWRkU3VidHJhY3RGdWxsV2l0aENvZWZmaWNpZW50KHNyY1t4IC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlLCBzcmNbeF0pOworICB9CisgIGlmICh5ID4gMCkgeworICAgIHNyY1t4IC0gc3JjX3N0cmlkZV0gPQorICAgICAgICBDbGFtcGVkQWRkU3VidHJhY3RGdWxsV2l0aENvZWZmaWNpZW50KHNyY1t4IC0gc3JjX3N0cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlLCBzcmNbeF0pOworICB9CisgIG5ld19pbWFnZVt4XSA9IG5ld192YWx1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgcG9pbnQKKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEFwcGx5RGVsdGFQYWxldHRlKHVpbnQzMl90KiBzcmMsIHVpbnQzMl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFzc2VzKSB7CisgIGludCB4LCB5OworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICB1aW50MzJfdCogbmV3X2ltYWdlID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh3aWR0aCwgc2l6ZW9mKCpuZXdfaW1hZ2UpKTsKKyAgdWludDhfdCogY29uc3QgdG1wX3JvdyA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh3aWR0aCwgc2l6ZW9mKCp0bXBfcm93KSk7CisgIGlmIChuZXdfaW1hZ2UgPT0gTlVMTCB8fCB0bXBfcm93ID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHdoaWxlIChudW1fcGFzc2VzLS0pIHsKKyAgICB1aW50MzJfdCogY3VyX3NyYyA9IHNyYzsKKyAgICB1aW50MzJfdCogY3VyX2RzdCA9IGRzdDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHByZWRpY3RlZF92YWx1ZSA9IFByZWRpY3QoeCwgeSwgbmV3X2ltYWdlKTsKKyAgICAgICAgdG1wX3Jvd1t4XSA9IEZpbmRCZXN0UGFsZXR0ZUVudHJ5KGN1cl9zcmNbeF0sIHByZWRpY3RlZF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSk7CisgICAgICAgIEFwcGx5QmVzdFBhbGV0dGVFbnRyeSh4LCB5LCBwcmVkaWN0ZWRfdmFsdWUsIHBhbGV0dGVbdG1wX3Jvd1t4XV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3JjLCBzcmNfc3RyaWRlLCBuZXdfaW1hZ2UpOworICAgICAgfQorICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgY3VyX2RzdFt4XSA9IHBhbGV0dGVbdG1wX3Jvd1t4XV07CisgICAgICB9CisgICAgICBjdXJfc3JjICs9IHNyY19zdHJpZGU7CisgICAgICBjdXJfZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQorICB9CisgRXJyb3I6CisgIFdlYlBTYWZlRnJlZShuZXdfaW1hZ2UpOworICBXZWJQU2FmZUZyZWUodG1wX3Jvdyk7CisgIHJldHVybiBlcnI7Cit9CisKKy8vIHJlcGxhY2VzIGVuYy0+YXJnYl8gYnkgYSBwYWxldHRpemFibGUgYXBwcm94aW1hdGlvbiBvZiBpdCwKKy8vIGFuZCBnZW5lcmF0ZXMgb3B0aW1hbCBlbmMtPnBhbGV0dGVfW10KK1dlYlBFbmNvZGluZ0Vycm9yIFdlYlBTZWFyY2hPcHRpbWFsRGVsdGFQYWxldHRlKFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgdWludDMyX3QqIHNyYyA9IHBpYy0+YXJnYjsKKyAgdWludDMyX3QqIGRzdCA9IGVuYy0+YXJnYl87CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBtZW1jcHkoZW5jLT5wYWxldHRlXywga0RlbHRhUGFsZXR0ZSwgc2l6ZW9mKGtEZWx0YVBhbGV0dGUpKTsKKyAgZW5jLT5wYWxldHRlX1tERUxUQV9QQUxFVFRFX1NJWkUgLSAxXSA9IHNyY1swXSAtIDB4ZmYwMDAwMDB1OworICBlbmMtPnBhbGV0dGVfc2l6ZV8gPSBERUxUQV9QQUxFVFRFX1NJWkU7CisgIGVyciA9IEFwcGx5RGVsdGFQYWxldHRlKHNyYywgZHN0LCBwaWMtPmFyZ2Jfc3RyaWRlLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnBhbGV0dGVfLCBlbmMtPnBhbGV0dGVfc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDIpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisKKyBFcnJvcjoKKyAgcmV0dXJuIGVycjsKK30KKworI2Vsc2UgIC8vICFXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworCitXZWJQRW5jb2RpbmdFcnJvciBXZWJQU2VhcmNoT3B0aW1hbERlbHRhUGFsZXR0ZShWUDhMRW5jb2RlciogY29uc3QgZW5jKSB7CisgICh2b2lkKWVuYzsKKyAgcmV0dXJuIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworfQorCisjZW5kaWYgIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvZGVsdGFfcGFsZXR0aXphdGlvbi5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGU0OWMxCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBNaXNsYXYgQnJhZGFjIChtaXNsYXZtQGdvb2dsZS5jb20pCisvLworCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRU5DX0RFTFRBX1BBTEVUVElaQVRJT05fSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9FTkNfREVMVEFfUEFMRVRUSVpBVElPTl9IXworCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGxpLmgiCisKKy8vIFJlcGxhY2VzIGVuYy0+YXJnYl9bXSBpbnB1dCBieSBhIHBhbGV0dGl6YWJsZSBhcHByb3hpbWF0aW9uIG9mIGl0LAorLy8gYW5kIGdlbmVyYXRlcyBvcHRpbWFsIGVuYy0+cGFsZXR0ZV9bXS4KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIHJldmVydCBlbmMtPnVzZV9wYWxldHRlXyAvIGVuYy0+dXNlX3ByZWRpY3RfIGZsYWcKKy8vIGlmIGRlbHRhLXBhbGV0dGl6YXRpb24gaXMgbm90IHByb2R1Y2luZyBleHBlY3RlZCBzYXZpbmcuCitXZWJQRW5jb2RpbmdFcnJvciBXZWJQU2VhcmNoT3B0aW1hbERlbHRhUGFsZXR0ZShWUDhMRW5jb2RlciogY29uc3QgZW5jKTsKKworI2VuZGlmICAvLyBDSFJPTUlVTV9XRUJQX0VOQ19ERUxUQV9QQUxFVFRJWkFUSU9OX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvZmlsdGVyLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2MDNiMAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9maWx0ZXIuYwpAQCAtMCwwICsxLDMwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNlbGVjdGluZyBmaWx0ZXIgbGV2ZWwKKy8vCisvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGVuY2kuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKworLy8gVGhpcyB0YWJsZSBnaXZlcywgZm9yIGEgZ2l2ZW4gc2hhcnBuZXNzLCB0aGUgZmlsdGVyaW5nIHN0cmVuZ3RoIHRvIGJlCisvLyB1c2VkIChhdCBsZWFzdCkgaW4gb3JkZXIgdG8gZmlsdGVyIGEgZ2l2ZW4gZWRnZSBzdGVwIGRlbHRhLgorLy8gVGhpcyBpcyBjb25zdHJ1Y3RlZCBieSBicnV0ZSBmb3JjZSBpbnNwZWN0aW9uOiBmb3IgYWxsIGRlbHRhLCB3ZSBpdGVyYXRlCisvLyBvdmVyIGFsbCBwb3NzaWJsZSBmaWx0ZXJpbmcgc3RyZW5ndGggLyB0aHJlc2ggdW50aWwgbmVlZHNfZmlsdGVyKCkgcmV0dXJucworLy8gdHJ1ZS4KKyNkZWZpbmUgTUFYX0RFTFRBX1NJWkUgNjQKK3N0YXRpYyBjb25zdCB1aW50OF90IGtMZXZlbHNGcm9tRGVsdGFbOF1bTUFYX0RFTFRBX1NJWkVdID0geworICB7IDAsICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICAgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzIH0sCisgIHsgMCwgIDEsICAyLCAgMywgIDUsICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE3LCAxOCwKKyAgICAyMCwgMjEsIDIzLCAyNCwgMjYsIDI3LCAyOSwgMzAsIDMyLCAzMywgMzUsIDM2LCAzOCwgMzksIDQxLCA0MiwKKyAgICA0NCwgNDUsIDQ3LCA0OCwgNTAsIDUxLCA1MywgNTQsIDU2LCA1NywgNTksIDYwLCA2MiwgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE5LAorICAgIDIwLCAyMiwgMjMsIDI1LCAyNiwgMjgsIDI5LCAzMSwgMzIsIDM0LCAzNSwgMzcsIDM4LCA0MCwgNDEsIDQzLAorICAgIDQ0LCA0NiwgNDcsIDQ5LCA1MCwgNTIsIDUzLCA1NSwgNTYsIDU4LCA1OSwgNjEsIDYyLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDMsICA1LCAgNiwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxOCwgMTksCisgICAgMjEsIDIyLCAyNCwgMjUsIDI3LCAyOCwgMzAsIDMxLCAzMywgMzQsIDM2LCAzNywgMzksIDQwLCA0MiwgNDMsCisgICAgNDUsIDQ2LCA0OCwgNDksIDUxLCA1MiwgNTQsIDU1LCA1NywgNTgsIDYwLCA2MSwgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDUsICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDE0LCAxNSwgMTcsIDE4LCAyMCwKKyAgICAyMSwgMjMsIDI0LCAyNiwgMjcsIDI5LCAzMCwgMzIsIDMzLCAzNSwgMzYsIDM4LCAzOSwgNDEsIDQyLCA0NCwKKyAgICA0NSwgNDcsIDQ4LCA1MCwgNTEsIDUzLCA1NCwgNTYsIDU3LCA1OSwgNjAsIDYyLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxNywgMTksIDIwLAorICAgIDIyLCAyMywgMjUsIDI2LCAyOCwgMjksIDMxLCAzMiwgMzQsIDM1LCAzNywgMzgsIDQwLCA0MSwgNDMsIDQ0LAorICAgIDQ2LCA0NywgNDksIDUwLCA1MiwgNTMsIDU1LCA1NiwgNTgsIDU5LCA2MSwgNjIsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDQsICA1LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE4LCAxOSwgMjEsCisgICAgMjIsIDI0LCAyNSwgMjcsIDI4LCAzMCwgMzEsIDMzLCAzNCwgMzYsIDM3LCAzOSwgNDAsIDQyLCA0MywgNDUsCisgICAgNDYsIDQ4LCA0OSwgNTEsIDUyLCA1NCwgNTUsIDU3LCA1OCwgNjAsIDYxLCA2MywgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgNCwgIDUsICA3LCAgOCwgIDksIDExLCAxMiwgMTQsIDE1LCAxNywgMTgsIDIwLCAyMSwKKyAgICAyMywgMjQsIDI2LCAyNywgMjksIDMwLCAzMiwgMzMsIDM1LCAzNiwgMzgsIDM5LCA0MSwgNDIsIDQ0LCA0NSwKKyAgICA0NywgNDgsIDUwLCA1MSwgNTMsIDU0LCA1NiwgNTcsIDU5LCA2MCwgNjIsIDYzLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9Cit9OworCitpbnQgVlA4RmlsdGVyU3RyZW5ndGhGcm9tRGVsdGEoaW50IHNoYXJwbmVzcywgaW50IGRlbHRhKSB7CisgIGNvbnN0IGludCBwb3MgPSAoZGVsdGEgPCBNQVhfREVMVEFfU0laRSkgPyBkZWx0YSA6IE1BWF9ERUxUQV9TSVpFIC0gMTsKKyAgYXNzZXJ0KHNoYXJwbmVzcyA+PSAwICYmIHNoYXJwbmVzcyA8PSA3KTsKKyAgcmV0dXJuIGtMZXZlbHNGcm9tRGVsdGFbc2hhcnBuZXNzXVtwb3NdOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFyYWdyYXBoIDE1LjQ6IGNvbXB1dGUgdGhlIGlubmVyLWVkZ2UgZmlsdGVyaW5nIHN0cmVuZ3RoCisKK3N0YXRpYyBpbnQgR2V0SUxldmVsKGludCBzaGFycG5lc3MsIGludCBsZXZlbCkgeworICBpZiAoc2hhcnBuZXNzID4gMCkgeworICAgIGlmIChzaGFycG5lc3MgPiA0KSB7CisgICAgICBsZXZlbCA+Pj0gMjsKKyAgICB9IGVsc2UgeworICAgICAgbGV2ZWwgPj49IDE7CisgICAgfQorICAgIGlmIChsZXZlbCA+IDkgLSBzaGFycG5lc3MpIHsKKyAgICAgIGxldmVsID0gOSAtIHNoYXJwbmVzczsKKyAgICB9CisgIH0KKyAgaWYgKGxldmVsIDwgMSkgbGV2ZWwgPSAxOworICByZXR1cm4gbGV2ZWw7Cit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGxldmVsKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgaWxldmVsID0gR2V0SUxldmVsKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3NoYXJwbmVzcywgbGV2ZWwpOworICBjb25zdCBpbnQgbGltaXQgPSAyICogbGV2ZWwgKyBpbGV2ZWw7CisKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOworICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFZfT0ZGX0VOQzsKKworICAvLyBjb3B5IGN1cnJlbnQgYmxvY2sgdG8geXV2X291dDJfCisgIG1lbWNweSh5X2RzdCwgaXQtPnl1dl9vdXRfLCBZVVZfU0laRV9FTkMgKiBzaXplb2YodWludDhfdCkpOworCisgIGlmIChlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQorICAgIFZQOFNpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICAgIFZQOFNpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOworICB9IGVsc2UgeyAgICAvLyBjb21wbGV4CisgICAgY29uc3QgaW50IGhldl90aHJlc2ggPSAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKKyAgICBWUDhIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIFZQOEhGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICBWUDhWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTU0lNIG1ldHJpYworCitzdGF0aWMgY29uc3QgZG91YmxlIGtNaW5WYWx1ZSA9IDEuZS0xMDsgIC8vIG1pbmltYWwgdGhyZXNob2xkCisKK3ZvaWQgVlA4U1NJTUFkZFN0YXRzKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHNyYywgVlA4RGlzdG9TdGF0cyogY29uc3QgZHN0KSB7CisgIGRzdC0+dyAgICs9IHNyYy0+dzsKKyAgZHN0LT54bSAgKz0gc3JjLT54bTsKKyAgZHN0LT55bSAgKz0gc3JjLT55bTsKKyAgZHN0LT54eG0gKz0gc3JjLT54eG07CisgIGRzdC0+eHltICs9IHNyYy0+eHltOworICBkc3QtPnl5bSArPSBzcmMtPnl5bTsKK30KKworZG91YmxlIFZQOFNTSU1HZXQoY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgY29uc3QgZG91YmxlIHhteG0gPSBzdGF0cy0+eG0gKiBzdGF0cy0+eG07CisgIGNvbnN0IGRvdWJsZSB5bXltID0gc3RhdHMtPnltICogc3RhdHMtPnltOworICBjb25zdCBkb3VibGUgeG15bSA9IHN0YXRzLT54bSAqIHN0YXRzLT55bTsKKyAgY29uc3QgZG91YmxlIHcyID0gc3RhdHMtPncgKiBzdGF0cy0+dzsKKyAgZG91YmxlIHN4eCA9IHN0YXRzLT54eG0gKiBzdGF0cy0+dyAtIHhteG07CisgIGRvdWJsZSBzeXkgPSBzdGF0cy0+eXltICogc3RhdHMtPncgLSB5bXltOworICBkb3VibGUgc3h5ID0gc3RhdHMtPnh5bSAqIHN0YXRzLT53IC0geG15bTsKKyAgZG91YmxlIEMxLCBDMjsKKyAgZG91YmxlIGZudW07CisgIGRvdWJsZSBmZGVuOworICAvLyBzbWFsbCBlcnJvcnMgYXJlIHBvc3NpYmxlLCBkdWUgdG8gcm91bmRpbmcuIENsYW1wIHRvIHplcm8uCisgIGlmIChzeHggPCAwLikgc3h4ID0gMC47CisgIGlmIChzeXkgPCAwLikgc3l5ID0gMC47CisgIEMxID0gNi41MDI1ICogdzI7CisgIEMyID0gNTguNTIyNSAqIHcyOworICBmbnVtID0gKDIgKiB4bXltICsgQzEpICogKDIgKiBzeHkgKyBDMik7CisgIGZkZW4gPSAoeG14bSArIHlteW0gKyBDMSkgKiAoc3h4ICsgc3l5ICsgQzIpOworICByZXR1cm4gKGZkZW4gIT0gMC4pID8gZm51bSAvIGZkZW4gOiBrTWluVmFsdWU7Cit9CisKK2RvdWJsZSBWUDhTU0lNR2V0U3F1YXJlZEVycm9yKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHMpIHsKKyAgaWYgKHMtPncgPiAwLikgeworICAgIGNvbnN0IGRvdWJsZSBpdzIgPSAxLiAvIChzLT53ICogcy0+dyk7CisgICAgY29uc3QgZG91YmxlIHN4eCA9IHMtPnh4bSAqIHMtPncgLSBzLT54bSAqIHMtPnhtOworICAgIGNvbnN0IGRvdWJsZSBzeXkgPSBzLT55eW0gKiBzLT53IC0gcy0+eW0gKiBzLT55bTsKKyAgICBjb25zdCBkb3VibGUgc3h5ID0gcy0+eHltICogcy0+dyAtIHMtPnhtICogcy0+eW07CisgICAgY29uc3QgZG91YmxlIFNTRSA9IGl3MiAqIChzeHggKyBzeXkgLSAyLiAqIHN4eSk7CisgICAgaWYgKFNTRSA+IGtNaW5WYWx1ZSkgcmV0dXJuIFNTRTsKKyAgfQorICByZXR1cm4ga01pblZhbHVlOworfQorCisjZGVmaW5lIExJTUlUKEEsIE0pICAoKEEpID4gKE0pID8gKE0pIDogKEEpKQorc3RhdGljIHZvaWQgVlA4U1NJTUFjY3VtdWxhdGVSb3coY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgVywgaW50IEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgeCA9IDA7CisgIGNvbnN0IGludCB3MCA9IExJTUlUKFZQOF9TU0lNX0tFUk5FTCwgVyk7CisgIGZvciAoeCA9IDA7IHggPCB3MDsgKyt4KSB7CisgICAgVlA4U1NJTUFjY3VtdWxhdGVDbGlwcGVkKHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIsIHgsIHksIFcsIEgsIHN0YXRzKTsKKyAgfQorICBmb3IgKDsgeCA8PSBXIC0gOCArIFZQOF9TU0lNX0tFUk5FTDsgKyt4KSB7CisgICAgVlA4U1NJTUFjY3VtdWxhdGUoCisgICAgICAgIHNyYzEgKyAoeSAtIFZQOF9TU0lNX0tFUk5FTCkgKiBzdHJpZGUxICsgKHggLSBWUDhfU1NJTV9LRVJORUwpLCBzdHJpZGUxLAorICAgICAgICBzcmMyICsgKHkgLSBWUDhfU1NJTV9LRVJORUwpICogc3RyaWRlMiArICh4IC0gVlA4X1NTSU1fS0VSTkVMKSwgc3RyaWRlMiwKKyAgICAgICAgc3RhdHMpOworICB9CisgIGZvciAoOyB4IDwgVzsgKyt4KSB7CisgICAgVlA4U1NJTUFjY3VtdWxhdGVDbGlwcGVkKHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIsIHgsIHksIFcsIEgsIHN0YXRzKTsKKyAgfQorfQorCit2b2lkIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFcsIGludCBILCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICBpbnQgeCwgeTsKKyAgY29uc3QgaW50IGgwID0gTElNSVQoVlA4X1NTSU1fS0VSTkVMLCBIKTsKKyAgY29uc3QgaW50IGgxID0gTElNSVQoVlA4X1NTSU1fS0VSTkVMLCBIIC0gVlA4X1NTSU1fS0VSTkVMKTsKKyAgZm9yICh5ID0gMDsgeSA8IGgwOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgVzsgKyt4KSB7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQoc3JjMSwgc3RyaWRlMSwgc3JjMiwgc3RyaWRlMiwgeCwgeSwgVywgSCwgc3RhdHMpOworICAgIH0KKyAgfQorICBmb3IgKDsgeSA8IGgxOyArK3kpIHsKKyAgICBWUDhTU0lNQWNjdW11bGF0ZVJvdyhzcmMxLCBzdHJpZGUxLCBzcmMyLCBzdHJpZGUyLCB5LCBXLCBILCBzdGF0cyk7CisgIH0KKyAgZm9yICg7IHkgPCBIOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgVzsgKyt4KSB7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQoc3JjMSwgc3RyaWRlMSwgc3JjMiwgc3RyaWRlMiwgeCwgeSwgVywgSCwgc3RhdHMpOworICAgIH0KKyAgfQorfQorI3VuZGVmIExJTUlUCisKK3N0YXRpYyBkb3VibGUgR2V0TUJTU0lNKGNvbnN0IHVpbnQ4X3QqIHl1djEsIGNvbnN0IHVpbnQ4X3QqIHl1djIpIHsKKyAgaW50IHgsIHk7CisgIFZQOERpc3RvU3RhdHMgcyA9IHsgLjAsIC4wLCAuMCwgLjAsIC4wLCAuMCB9OworCisgIC8vIGNvbXB1dGUgU1NJTSBpbiBhIDEwIHggMTAgd2luZG93CisgIGZvciAoeSA9IFZQOF9TU0lNX0tFUk5FTDsgeSA8IDE2IC0gVlA4X1NTSU1fS0VSTkVMOyB5KyspIHsKKyAgICBmb3IgKHggPSBWUDhfU1NJTV9LRVJORUw7IHggPCAxNiAtIFZQOF9TU0lNX0tFUk5FTDsgeCsrKSB7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQoeXV2MSArIFlfT0ZGX0VOQywgQlBTLCB5dXYyICsgWV9PRkZfRU5DLCBCUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgMTYsIDE2LCAmcyk7CisgICAgfQorICB9CisgIGZvciAoeCA9IDE7IHggPCA3OyB4KyspIHsKKyAgICBmb3IgKHkgPSAxOyB5IDwgNzsgeSsrKSB7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZUNsaXBwZWQoeXV2MSArIFVfT0ZGX0VOQywgQlBTLCB5dXYyICsgVV9PRkZfRU5DLCBCUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgOCwgOCwgJnMpOworICAgICAgVlA4U1NJTUFjY3VtdWxhdGVDbGlwcGVkKHl1djEgKyBWX09GRl9FTkMsIEJQUywgeXV2MiArIFZfT0ZGX0VOQywgQlBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIDgsIDgsICZzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOFNTSU1HZXQoJnMpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXhwb3NlZCBBUElzOiBFbmNvZGVyIHNob3VsZCBjYWxsIHRoZSBmb2xsb3dpbmcgMyBmdW5jdGlvbnMgdG8gYWRqdXN0CisvLyBsb29wIGZpbHRlciBzdHJlbmd0aAorCit2b2lkIFZQOEluaXRGaWx0ZXIoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGlmIChpdC0+bGZfc3RhdHNfICE9IE5VTEwpIHsKKyAgICBpbnQgcywgaTsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTEZfTEVWRUxTOyBpKyspIHsKKyAgICAgICAgKCppdC0+bGZfc3RhdHNfKVtzXVtpXSA9IDA7CisgICAgICB9CisgICAgfQorICAgIFZQOFNTSU1Ec3BJbml0KCk7CisgIH0KK30KKwordm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpbnQgZDsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IGludCBzID0gaXQtPm1iXy0+c2VnbWVudF87CisgIGNvbnN0IGludCBsZXZlbDAgPSBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXzsKKworICAvLyBleHBsb3JlICsvLXF1YW50IHJhbmdlIG9mIHZhbHVlcyBhcm91bmQgbGV2ZWwwCisgIGNvbnN0IGludCBkZWx0YV9taW4gPSAtZW5jLT5kcW1fW3NdLnF1YW50XzsKKyAgY29uc3QgaW50IGRlbHRhX21heCA9IGVuYy0+ZHFtX1tzXS5xdWFudF87CisgIGNvbnN0IGludCBzdGVwX3NpemUgPSAoZGVsdGFfbWF4IC0gZGVsdGFfbWluID49IDQpID8gNCA6IDE7CisKKyAgaWYgKGl0LT5sZl9zdGF0c18gPT0gTlVMTCkgcmV0dXJuOworCisgIC8vIE5PVEU6IEN1cnJlbnRseSB3ZSBhcmUgYXBwbHlpbmcgZmlsdGVyIG9ubHkgYWNyb3NzIHRoZSBzdWJsb2NrIGVkZ2VzCisgIC8vIFRoZXJlIGFyZSB0d28gcmVhc29ucyBmb3IgdGhhdC4KKyAgLy8gMS4gQXBwbHlpbmcgZmlsdGVyIG9uIG1hY3JvIGJsb2NrIGVkZ2VzIHdpbGwgY2hhbmdlIHRoZSBwaXhlbHMgaW4KKyAgLy8gdGhlIGxlZnQgYW5kIHRvcCBtYWNybyBibG9ja3MuIFRoYXQgd2lsbCBiZSBoYXJkIHRvIHJlc3RvcmUKKyAgLy8gMi4gTWFjcm8gQmxvY2tzIG9uIHRoZSBib3R0b20gYW5kIHJpZ2h0IGFyZSBub3QgeWV0IGNvbXByZXNzZWQuIFNvIHdlCisgIC8vIGNhbm5vdCBhcHBseSBmaWx0ZXIgb24gdGhlIHJpZ2h0IGFuZCBib3R0b20gbWFjcm8gYmxvY2sgZWRnZXMuCisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxICYmIGl0LT5tYl8tPnNraXBfKSByZXR1cm47CisKKyAgLy8gQWx3YXlzIHRyeSBmaWx0ZXIgbGV2ZWwgIHplcm8KKyAgKCppdC0+bGZfc3RhdHNfKVtzXVswXSArPSBHZXRNQlNTSU0oaXQtPnl1dl9pbl8sIGl0LT55dXZfb3V0Xyk7CisKKyAgZm9yIChkID0gZGVsdGFfbWluOyBkIDw9IGRlbHRhX21heDsgZCArPSBzdGVwX3NpemUpIHsKKyAgICBjb25zdCBpbnQgbGV2ZWwgPSBsZXZlbDAgKyBkOworICAgIGlmIChsZXZlbCA8PSAwIHx8IGxldmVsID49IE1BWF9MRl9MRVZFTFMpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBEb0ZpbHRlcihpdCwgbGV2ZWwpOworICAgICgqaXQtPmxmX3N0YXRzXylbc11bbGV2ZWxdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXQyXyk7CisgIH0KK30KKwordm9pZCBWUDhBZGp1c3RGaWx0ZXJTdHJlbmd0aChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChpdC0+bGZfc3RhdHNfICE9IE5VTEwpIHsKKyAgICBpbnQgczsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKKyAgICAgIGludCBpLCBiZXN0X2xldmVsID0gMDsKKyAgICAgIC8vIEltcHJvdmVtZW50IG92ZXIgZmlsdGVyIGxldmVsIDAgc2hvdWxkIGJlIGF0IGxlYXN0IDFlLTUgKHJlbGF0aXZlbHkpCisgICAgICBkb3VibGUgYmVzdF92ID0gMS4wMDAwMSAqICgqaXQtPmxmX3N0YXRzXylbc11bMF07CisgICAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gKCppdC0+bGZfc3RhdHNfKVtzXVtpXTsKKyAgICAgICAgaWYgKHYgPiBiZXN0X3YpIHsKKyAgICAgICAgICBiZXN0X3YgPSB2OworICAgICAgICAgIGJlc3RfbGV2ZWwgPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXyA9IGJlc3RfbGV2ZWw7CisgICAgfQorICB9IGVsc2UgaWYgKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3N0cmVuZ3RoID4gMCkgeworICAgIGludCBtYXhfbGV2ZWwgPSAwOworICAgIGludCBzOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7IHMrKykgeworICAgICAgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9bc107CisgICAgICAvLyB0aGlzICc+PiAzJyBhY2NvdW50cyBmb3Igc29tZSBpbnZlcnNlIFdIVCBzY2FsaW5nCisgICAgICBjb25zdCBpbnQgZGVsdGEgPSAoZHFtLT5tYXhfZWRnZV8gKiBkcW0tPnkyXy5xX1sxXSkgPj4gMzsKKyAgICAgIGNvbnN0IGludCBsZXZlbCA9CisgICAgICAgICAgVlA4RmlsdGVyU3RyZW5ndGhGcm9tRGVsdGEoZW5jLT5maWx0ZXJfaGRyXy5zaGFycG5lc3NfLCBkZWx0YSk7CisgICAgICBpZiAobGV2ZWwgPiBkcW0tPmZzdHJlbmd0aF8pIHsKKyAgICAgICAgZHFtLT5mc3RyZW5ndGhfID0gbGV2ZWw7CisgICAgICB9CisgICAgICBpZiAobWF4X2xldmVsIDwgZHFtLT5mc3RyZW5ndGhfKSB7CisgICAgICAgIG1heF9sZXZlbCA9IGRxbS0+ZnN0cmVuZ3RoXzsKKyAgICAgIH0KKyAgICB9CisgICAgZW5jLT5maWx0ZXJfaGRyXy5sZXZlbF8gPSBtYXhfbGV2ZWw7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9mcmFtZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2ZyYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhN2VkYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9mcmFtZS5jCkBAIC0wLDAgKzEsODUwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBmcmFtZSBjb2RpbmcgYW5kIGFuYWx5c2lzCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2Nvc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIgIC8vIFJJRkYgY29uc3RhbnRzCisKKyNkZWZpbmUgU0VHTUVOVF9WSVNVIDAKKyNkZWZpbmUgREVCVUdfU0VBUkNIIDAgICAgLy8gdXNlZnVsIHRvIHRyYWNrIHNlYXJjaCBjb252ZXJnZW5jZQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbXVsdGktcGFzcyBjb252ZXJnZW5jZQorCisjZGVmaW5lIEhFQURFUl9TSVpFX0VTVElNQVRFIChSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKQorI2RlZmluZSBEUV9MSU1JVCAwLjQgIC8vIGNvbnZlcmdlbmNlIGlzIGNvbnNpZGVyZWQgcmVhY2hlZCBpZiBkcSA8IERRX0xJTUlUCisvLyB3ZSBhbGxvdyAyayBvZiBleHRyYSBoZWFkLXJvb20gaW4gUEFSVElUSU9OMCBsaW1pdC4KKyNkZWZpbmUgUEFSVElUSU9OMF9TSVpFX0xJTUlUICgoVlA4X01BWF9QQVJUSVRJT04wX1NJWkUgLSAyMDQ4VUxMKSA8PCAxMSkKKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gc3RydWN0IGZvciBvcmdhbml6aW5nIGNvbnZlcmdlbmNlIGluIGVpdGhlciBzaXplIG9yIFBTTlIKKyAgaW50IGlzX2ZpcnN0OworICBmbG9hdCBkcTsKKyAgZmxvYXQgcSwgbGFzdF9xOworICBkb3VibGUgdmFsdWUsIGxhc3RfdmFsdWU7ICAgLy8gUFNOUiBvciBzaXplCisgIGRvdWJsZSB0YXJnZXQ7CisgIGludCBkb19zaXplX3NlYXJjaDsKK30gUGFzc1N0YXRzOworCitzdGF0aWMgaW50IEluaXRQYXNzU3RhdHMoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLCBQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgY29uc3QgdWludDY0X3QgdGFyZ2V0X3NpemUgPSAodWludDY0X3QpZW5jLT5jb25maWdfLT50YXJnZXRfc2l6ZTsKKyAgY29uc3QgaW50IGRvX3NpemVfc2VhcmNoID0gKHRhcmdldF9zaXplICE9IDApOworICBjb25zdCBmbG9hdCB0YXJnZXRfUFNOUiA9IGVuYy0+Y29uZmlnXy0+dGFyZ2V0X1BTTlI7CisKKyAgcy0+aXNfZmlyc3QgPSAxOworICBzLT5kcSA9IDEwLmY7CisgIHMtPnEgPSBzLT5sYXN0X3EgPSBlbmMtPmNvbmZpZ18tPnF1YWxpdHk7CisgIHMtPnRhcmdldCA9IGRvX3NpemVfc2VhcmNoID8gKGRvdWJsZSl0YXJnZXRfc2l6ZQorICAgICAgICAgICAgOiAodGFyZ2V0X1BTTlIgPiAwLikgPyB0YXJnZXRfUFNOUgorICAgICAgICAgICAgOiA0MC47ICAgLy8gZGVmYXVsdCwganVzdCBpbiBjYXNlCisgIHMtPnZhbHVlID0gcy0+bGFzdF92YWx1ZSA9IDAuOworICBzLT5kb19zaXplX3NlYXJjaCA9IGRvX3NpemVfc2VhcmNoOworICByZXR1cm4gZG9fc2l6ZV9zZWFyY2g7Cit9CisKK3N0YXRpYyBmbG9hdCBDbGFtcChmbG9hdCB2LCBmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICByZXR1cm4gKHYgPCBtaW4pID8gbWluIDogKHYgPiBtYXgpID8gbWF4IDogdjsKK30KKworc3RhdGljIGZsb2F0IENvbXB1dGVOZXh0UShQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgZmxvYXQgZHE7CisgIGlmIChzLT5pc19maXJzdCkgeworICAgIGRxID0gKHMtPnZhbHVlID4gcy0+dGFyZ2V0KSA/IC1zLT5kcSA6IHMtPmRxOworICAgIHMtPmlzX2ZpcnN0ID0gMDsKKyAgfSBlbHNlIGlmIChzLT52YWx1ZSAhPSBzLT5sYXN0X3ZhbHVlKSB7CisgICAgY29uc3QgZG91YmxlIHNsb3BlID0gKHMtPnRhcmdldCAtIHMtPnZhbHVlKSAvIChzLT5sYXN0X3ZhbHVlIC0gcy0+dmFsdWUpOworICAgIGRxID0gKGZsb2F0KShzbG9wZSAqIChzLT5sYXN0X3EgLSBzLT5xKSk7CisgIH0gZWxzZSB7CisgICAgZHEgPSAwLjsgIC8vIHdlJ3JlIGRvbmU/IQorICB9CisgIC8vIExpbWl0IHZhcmlhYmxlIHRvIGF2b2lkIGxhcmdlIHN3aW5ncy4KKyAgcy0+ZHEgPSBDbGFtcChkcSwgLTMwLmYsIDMwLmYpOworICBzLT5sYXN0X3EgPSBzLT5xOworICBzLT5sYXN0X3ZhbHVlID0gcy0+dmFsdWU7CisgIHMtPnEgPSBDbGFtcChzLT5xICsgcy0+ZHEsIDAuZiwgMTAwLmYpOworICByZXR1cm4gcy0+cTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlcyBmb3IgbGV2ZWwgY29kaW5nCisKK2NvbnN0IHVpbnQ4X3QgVlA4Q2F0M1tdID0geyAxNzMsIDE0OCwgMTQwIH07Citjb25zdCB1aW50OF90IFZQOENhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1IH07Citjb25zdCB1aW50OF90IFZQOENhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAgfTsKK2NvbnN0IHVpbnQ4X3QgVlA4Q2F0NltdID0KKyAgICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5IH07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXNldCB0aGUgc3RhdGlzdGljcyBhYm91dDogbnVtYmVyIG9mIHNraXBzLCB0b2tlbiBwcm9iYSwgbGV2ZWwgY29zdCwuLi4KKworc3RhdGljIHZvaWQgUmVzZXRTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKHByb2JhKTsKKyAgcHJvYmEtPm5iX3NraXBfID0gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNraXAgZGVjaXNpb24gcHJvYmFiaWxpdHkKKworI2RlZmluZSBTS0lQX1BST0JBX1RIUkVTSE9MRCAyNTAgIC8vIHZhbHVlIGJlbG93IHdoaWNoIHVzaW5nIHNraXBfcHJvYmEgaXMgT0suCisKK3N0YXRpYyBpbnQgQ2FsY1NraXBQcm9iYSh1aW50NjRfdCBuYiwgdWludDY0X3QgdG90YWwpIHsKKyAgcmV0dXJuIChpbnQpKHRvdGFsID8gKHRvdGFsIC0gbmIpICogMjU1IC8gdG90YWwgOiAyNTUpOworfQorCisvLyBSZXR1cm5zIHRoZSBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBza2lwIHByb2JhYmlsaXR5Lgorc3RhdGljIGludCBGaW5hbGl6ZVNraXBQcm9iYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBjb25zdCBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgIGNvbnN0IGludCBuYl9ldmVudHMgPSBwcm9iYS0+bmJfc2tpcF87CisgIGludCBzaXplOworICBwcm9iYS0+c2tpcF9wcm9iYV8gPSBDYWxjU2tpcFByb2JhKG5iX2V2ZW50cywgbmJfbWJzKTsKKyAgcHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9IChwcm9iYS0+c2tpcF9wcm9iYV8gPCBTS0lQX1BST0JBX1RIUkVTSE9MRCk7CisgIHNpemUgPSAyNTY7ICAgLy8gJ3VzZV9za2lwX3Byb2JhJyBiaXQKKyAgaWYgKHByb2JhLT51c2Vfc2tpcF9wcm9iYV8pIHsKKyAgICBzaXplICs9ICBuYl9ldmVudHMgKiBWUDhCaXRDb3N0KDEsIHByb2JhLT5za2lwX3Byb2JhXykKKyAgICAgICAgICsgKG5iX21icyAtIG5iX2V2ZW50cykgKiBWUDhCaXRDb3N0KDAsIHByb2JhLT5za2lwX3Byb2JhXyk7CisgICAgc2l6ZSArPSA4ICogMjU2OyAgIC8vIGNvc3Qgb2Ygc2lnbmFsaW5nIHRoZSBza2lwX3Byb2JhXyBpdHNlbGYuCisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIENvbGxlY3Qgc3RhdGlzdGljcyBhbmQgZGVkdWNlIHByb2JhYmlsaXRpZXMgZm9yIG5leHQgY29kaW5nIHBhc3MuCisvLyBSZXR1cm4gdGhlIHRvdGFsIGJpdC1jb3N0IGZvciBjb2RpbmcgdGhlIHByb2JhYmlsaXR5IHVwZGF0ZXMuCitzdGF0aWMgaW50IENhbGNUb2tlblByb2JhKGludCBuYiwgaW50IHRvdGFsKSB7CisgIGFzc2VydChuYiA8PSB0b3RhbCk7CisgIHJldHVybiBuYiA/ICgyNTUgLSBuYiAqIDI1NSAvIHRvdGFsKSA6IDI1NTsKK30KKworLy8gQ29zdCBvZiBjb2RpbmcgJ25iJyAxJ3MgYW5kICd0b3RhbC1uYicgMCdzIHVzaW5nICdwcm9iYScgcHJvYmFiaWxpdHkuCitzdGF0aWMgaW50IEJyYW5jaENvc3QoaW50IG5iLCBpbnQgdG90YWwsIGludCBwcm9iYSkgeworICByZXR1cm4gbmIgKiBWUDhCaXRDb3N0KDEsIHByb2JhKSArICh0b3RhbCAtIG5iKSAqIFZQOEJpdENvc3QoMCwgcHJvYmEpOworfQorCitzdGF0aWMgdm9pZCBSZXNldFRva2VuU3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgbWVtc2V0KHByb2JhLT5zdGF0c18sIDAsIHNpemVvZihwcm9iYS0+c3RhdHNfKSk7Cit9CisKK3N0YXRpYyBpbnQgRmluYWxpemVUb2tlblByb2JhcyhWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEpIHsKKyAgaW50IGhhc19jaGFuZ2VkID0gMDsKKyAgaW50IHNpemUgPSAwOworICBpbnQgdCwgYiwgYywgcDsKKyAgZm9yICh0ID0gMDsgdCA8IE5VTV9UWVBFUzsgKyt0KSB7CisgICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKKyAgICAgICAgICBjb25zdCBwcm9iYV90IHN0YXRzID0gcHJvYmEtPnN0YXRzX1t0XVtiXVtjXVtwXTsKKyAgICAgICAgICBjb25zdCBpbnQgbmIgPSAoc3RhdHMgPj4gMCkgJiAweGZmZmY7CisgICAgICAgICAgY29uc3QgaW50IHRvdGFsID0gKHN0YXRzID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlX3Byb2JhID0gVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF07CisgICAgICAgICAgY29uc3QgaW50IG9sZF9wID0gVlA4Q29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOworICAgICAgICAgIGNvbnN0IGludCBuZXdfcCA9IENhbGNUb2tlblByb2JhKG5iLCB0b3RhbCk7CisgICAgICAgICAgY29uc3QgaW50IG9sZF9jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG9sZF9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMCwgdXBkYXRlX3Byb2JhKTsKKyAgICAgICAgICBjb25zdCBpbnQgbmV3X2Nvc3QgPSBCcmFuY2hDb3N0KG5iLCB0b3RhbCwgbmV3X3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Qml0Q29zdCgxLCB1cGRhdGVfcHJvYmEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgOCAqIDI1NjsKKyAgICAgICAgICBjb25zdCBpbnQgdXNlX25ld19wID0gKG9sZF9jb3N0ID4gbmV3X2Nvc3QpOworICAgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdCh1c2VfbmV3X3AsIHVwZGF0ZV9wcm9iYSk7CisgICAgICAgICAgaWYgKHVzZV9uZXdfcCkgeyAgLy8gb25seSB1c2UgcHJvYmEgdGhhdCBzZWVtIG1lYW5pbmdmdWwgZW5vdWdoLgorICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBuZXdfcDsKKyAgICAgICAgICAgIGhhc19jaGFuZ2VkIHw9IChuZXdfcCAhPSBvbGRfcCk7CisgICAgICAgICAgICBzaXplICs9IDggKiAyNTY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gb2xkX3A7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHByb2JhLT5kaXJ0eV8gPSBoYXNfY2hhbmdlZDsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaW5hbGl6ZSBTZWdtZW50IHByb2JhYmlsaXR5IGJhc2VkIG9uIHRoZSBjb2RpbmcgdHJlZQorCitzdGF0aWMgaW50IEdldFByb2JhKGludCBhLCBpbnQgYikgeworICBjb25zdCBpbnQgdG90YWwgPSBhICsgYjsKKyAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDI1NSAgICAgLy8gdGhhdCdzIHRoZSBkZWZhdWx0IHByb2JhYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICAgIDogKDI1NSAqIGEgKyB0b3RhbCAvIDIpIC8gdG90YWw7ICAvLyByb3VuZGVkIHByb2JhCit9CisKK3N0YXRpYyB2b2lkIFNldFNlZ21lbnRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAgfTsKKyAgaW50IG47CisKKyAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKKyAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19bbl07CisgICAgcFttYi0+c2VnbWVudF9dKys7CisgIH0KKyAgaWYgKGVuYy0+cGljXy0+c3RhdHMgIT0gTlVMTCkgeworICAgIGZvciAobiA9IDA7IG4gPCBOVU1fTUJfU0VHTUVOVFM7ICsrbikgeworICAgICAgZW5jLT5waWNfLT5zdGF0cy0+c2VnbWVudF9zaXplW25dID0gcFtuXTsKKyAgICB9CisgIH0KKyAgaWYgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB7CisgICAgdWludDhfdCogY29uc3QgcHJvYmFzID0gZW5jLT5wcm9iYV8uc2VnbWVudHNfOworICAgIHByb2Jhc1swXSA9IEdldFByb2JhKHBbMF0gKyBwWzFdLCBwWzJdICsgcFszXSk7CisgICAgcHJvYmFzWzFdID0gR2V0UHJvYmEocFswXSwgcFsxXSk7CisgICAgcHJvYmFzWzJdID0gR2V0UHJvYmEocFsyXSwgcFszXSk7CisKKyAgICBlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXyA9CisgICAgICAgIChwcm9iYXNbMF0gIT0gMjU1KSB8fCAocHJvYmFzWzFdICE9IDI1NSkgfHwgKHByb2Jhc1syXSAhPSAyNTUpOworICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0KKyAgICAgICAgcFswXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1sxXSkpICsKKyAgICAgICAgcFsxXSAqIChWUDhCaXRDb3N0KDAsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1sxXSkpICsKKyAgICAgICAgcFsyXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDAsIHByb2Jhc1syXSkpICsKKyAgICAgICAgcFszXSAqIChWUDhCaXRDb3N0KDEsIHByb2Jhc1swXSkgKyBWUDhCaXRDb3N0KDEsIHByb2Jhc1syXSkpOworICB9IGVsc2UgeworICAgIGVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfID0gMDsKKyAgICBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXyA9IDA7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZWZmaWNpZW50IGNvZGluZworCitzdGF0aWMgaW50IFB1dENvZWZmcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgY3R4LCBjb25zdCBWUDhSZXNpZHVhbCogcmVzKSB7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBjb25zdCB1aW50OF90KiBwID0gcmVzLT5wcm9iW25dW2N0eF07CisgIGlmICghVlA4UHV0Qml0KGJ3LCByZXMtPmxhc3QgPj0gMCwgcFswXSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdoaWxlIChuIDwgMTYpIHsKKyAgICBjb25zdCBpbnQgYyA9IHJlcy0+Y29lZmZzW24rK107CisgICAgY29uc3QgaW50IHNpZ24gPSBjIDwgMDsKKyAgICBpbnQgdiA9IHNpZ24gPyAtYyA6IGM7CisgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgIT0gMCwgcFsxXSkpIHsKKyAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzBdOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMSwgcFsyXSkpIHsKKyAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzFdOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDQsIHBbM10pKSB7CisgICAgICAgIGlmIChWUDhQdXRCaXQoYncsIHYgIT0gMiwgcFs0XSkpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID09IDQsIHBbNV0pOworICAgICAgfSBlbHNlIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMTAsIHBbNl0pKSB7CisgICAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNiwgcFs3XSkpIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPT0gNiwgMTU5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPj0gOSwgMTY1KTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsICEodiAmIDEpLCAxNDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgY29uc3QgdWludDhfdCogdGFiOworICAgICAgICBpZiAodiA8IDMgKyAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzhdKTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOV0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOworICAgICAgICAgIG1hc2sgPSAxIDw8IDI7CisgICAgICAgICAgdGFiID0gVlA4Q2F0MzsKKyAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzldKTsKKyAgICAgICAgICB2IC09IDMgKyAoOCA8PCAxKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAzOworICAgICAgICAgIHRhYiA9IFZQOENhdDQ7CisgICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOworICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFsxMF0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDIpOworICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzEwXSk7CisgICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMTA7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NjsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAobWFzaykgeworICAgICAgICAgIFZQOFB1dEJpdChidywgISEodiAmIG1hc2spLCAqdGFiKyspOworICAgICAgICAgIG1hc2sgPj49IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzJdOworICAgIH0KKyAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBzaWduKTsKKyAgICBpZiAobiA9PSAxNiB8fCAhVlA4UHV0Qml0KGJ3LCBuIDw9IHJlcy0+bGFzdCwgcFswXSkpIHsKKyAgICAgIHJldHVybiAxOyAgIC8vIEVPQgorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ29kZVJlc2lkdWFscyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IHgsIHksIGNoOworICBWUDhSZXNpZHVhbCByZXM7CisgIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7CisgIGNvbnN0IGludCBpMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGNvbnN0IGludCBzZWdtZW50ID0gaXQtPm1iXy0+c2VnbWVudF87CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworCisgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKKworICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKyAgaWYgKGkxNikgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7CisgICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQorICAgICAgUHV0Q29lZmZzKGJ3LCBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisgICAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIH0gZWxzZSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIH0KKworICAvLyBsdW1hLUFDCisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IFB1dENvZWZmcyhidywgY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKyAgcG9zMiA9IFZQOEJpdFdyaXRlclBvcyhidyk7CisKKyAgLy8gVS9WCisgIFZQOEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOworICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgeworICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOworICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9CisgICAgICAgICAgICBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7CisgICAgICB9CisgICAgfQorICB9CisgIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworICBpdC0+bHVtYV9iaXRzXyA9IHBvczIgLSBwb3MxOworICBpdC0+dXZfYml0c18gPSBwb3MzIC0gcG9zMjsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1baTE2XSArPSBpdC0+bHVtYV9iaXRzXzsKKyAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1bMl0gKz0gaXQtPnV2X2JpdHNfOworICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Cit9CisKKy8vIFNhbWUgYXMgQ29kZVJlc2lkdWFscywgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgd3JpdGUgYW55dGhpbmcuCisvLyBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHMgdGhlIGV2ZW50IGRpc3RyaWJ1dGlvbi4KK3N0YXRpYyB2b2lkIFJlY29yZFJlc2lkdWFscyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworCisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7CisgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKKyAgICBpdC0+dG9wX256X1s4XSA9IGl0LT5sZWZ0X256X1s4XSA9CisgICAgICBWUDhSZWNvcmRDb2VmZnMoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBWUDhSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKKyAgICB9CisgIH0KKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRva2VuIGJ1ZmZlcgorCisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisKK3N0YXRpYyBpbnQgUmVjb3JkVG9rZW5zKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeyAgIC8vIGkxNngxNgorICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XTsKKyAgICBWUDhJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKKyAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KKyAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZmlyc3QsIHJlcy5sYXN0LCByZXMuY29lZmZzLCB0b2tlbnMpOworICAgIFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgIFZQOEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOworICB9IGVsc2UgeworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOworICB9CisKKyAgLy8gbHVtYS1BQworICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOworICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPQorICAgICAgICAgIFZQOFJlY29yZENvZWZmVG9rZW5zKGN0eCwgcmVzLmNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKKyAgICAgIFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgIH0KKyAgfQorCisgIC8vIFUvVgorICBWUDhJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKKyAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQorICAgICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmZpcnN0LCByZXMubGFzdCwgcmVzLmNvZWZmcywgdG9rZW5zKTsKKyAgICAgICAgVlA4UmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7CisgICAgICB9CisgICAgfQorICB9CisgIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKKyAgcmV0dXJuICF0b2tlbnMtPmVycm9yXzsKK30KKworI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXh0cmFJbmZvIG1hcCAvIERlYnVnIGZ1bmN0aW9uCisKKyNpZiBTRUdNRU5UX1ZJU1UKK3N0YXRpYyB2b2lkIFNldEJsb2NrKHVpbnQ4X3QqIHAsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBtZW1zZXQocCwgdmFsdWUsIHNpemUpOworICAgIHAgKz0gQlBTOworICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgUmVzZXRTU0UoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGVuYy0+c3NlX1swXSA9IDA7CisgIGVuYy0+c3NlX1sxXSA9IDA7CisgIGVuYy0+c3NlX1syXSA9IDA7CisgIC8vIE5vdGU6IGVuYy0+c3NlX1szXSBpcyBtYW5hZ2VkIGJ5IGFscGhhLmMKKyAgZW5jLT5zc2VfY291bnRfID0gMDsKK30KKworc3RhdGljIHZvaWQgU3RvcmVTU0UoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9IGl0LT55dXZfaW5fOworICBjb25zdCB1aW50OF90KiBjb25zdCBvdXQgPSBpdC0+eXV2X291dF87CisgIC8vIE5vdGU6IG5vdCB0b3RhbGx5IGFjY3VyYXRlIGF0IGJvdW5kYXJ5LiBBbmQgZG9lc24ndCBpbmNsdWRlIGluLWxvb3AgZmlsdGVyLgorICBlbmMtPnNzZV9bMF0gKz0gVlA4U1NFMTZ4MTYoaW4gKyBZX09GRl9FTkMsIG91dCArIFlfT0ZGX0VOQyk7CisgIGVuYy0+c3NlX1sxXSArPSBWUDhTU0U4eDgoaW4gKyBVX09GRl9FTkMsIG91dCArIFVfT0ZGX0VOQyk7CisgIGVuYy0+c3NlX1syXSArPSBWUDhTU0U4eDgoaW4gKyBWX09GRl9FTkMsIG91dCArIFZfT0ZGX0VOQyk7CisgIGVuYy0+c3NlX2NvdW50XyArPSAxNiAqIDE2OworfQorCitzdGF0aWMgdm9pZCBTdG9yZVNpZGVJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgVlA4TUJJbmZvKiBjb25zdCBtYiA9IGl0LT5tYl87CisgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisKKyAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgeworICAgIFN0b3JlU1NFKGl0KTsKKyAgICBlbmMtPmJsb2NrX2NvdW50X1swXSArPSAobWItPnR5cGVfID09IDApOworICAgIGVuYy0+YmxvY2tfY291bnRfWzFdICs9IChtYi0+dHlwZV8gPT0gMSk7CisgICAgZW5jLT5ibG9ja19jb3VudF9bMl0gKz0gKG1iLT5za2lwXyAhPSAwKTsKKyAgfQorCisgIGlmIChwaWMtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IGluZm8gPSAmcGljLT5leHRyYV9pbmZvW2l0LT54XyArIGl0LT55XyAqIGVuYy0+bWJfd19dOworICAgIHN3aXRjaCAocGljLT5leHRyYV9pbmZvX3R5cGUpIHsKKyAgICAgIGNhc2UgMTogKmluZm8gPSBtYi0+dHlwZV87IGJyZWFrOworICAgICAgY2FzZSAyOiAqaW5mbyA9IG1iLT5zZWdtZW50XzsgYnJlYWs7CisgICAgICBjYXNlIDM6ICppbmZvID0gZW5jLT5kcW1fW21iLT5zZWdtZW50X10ucXVhbnRfOyBicmVhazsKKyAgICAgIGNhc2UgNDogKmluZm8gPSAobWItPnR5cGVfID09IDEpID8gaXQtPnByZWRzX1swXSA6IDB4ZmY7IGJyZWFrOworICAgICAgY2FzZSA1OiAqaW5mbyA9IG1iLT51dl9tb2RlXzsgYnJlYWs7CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgY29uc3QgaW50IGIgPSAoaW50KSgoaXQtPmx1bWFfYml0c18gKyBpdC0+dXZfYml0c18gKyA3KSA+PiAzKTsKKyAgICAgICAgKmluZm8gPSAoYiA+IDI1NSkgPyAyNTUgOiBiOyBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNzogKmluZm8gPSBtYi0+YWxwaGFfOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6ICppbmZvID0gMDsgYnJlYWs7CisgICAgfQorICB9CisjaWYgU0VHTUVOVF9WSVNVICAvLyB2aXN1YWxpemUgc2VnbWVudHMgYW5kIHByZWRpY3Rpb24gbW9kZXMKKyAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DLCBtYi0+c2VnbWVudF8gKiA2NCwgMTYpOworICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBVX09GRl9FTkMsIGl0LT5wcmVkc19bMF0gKiA2NCwgOCk7CisgIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFZfT0ZGX0VOQywgbWItPnV2X21vZGVfICogNjQsIDgpOworI2VuZGlmCit9CisKK3N0YXRpYyBkb3VibGUgR2V0UFNOUih1aW50NjRfdCBtc2UsIHVpbnQ2NF90IHNpemUpIHsKKyAgcmV0dXJuIChtc2UgPiAwICYmIHNpemUgPiAwKSA/IDEwLiAqIGxvZzEwKDI1NS4gKiAyNTUuICogc2l6ZSAvIG1zZSkgOiA5OTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGF0TG9vcCgpOiBvbmx5IGNvbGxlY3Qgc3RhdGlzdGljcyAobnVtYmVyIG9mIHNraXBzLCB0b2tlbiB1c2FnZSwgLi4uKS4KKy8vICBUaGlzIGlzIHVzZWQgZm9yIGRlY2lkaW5nIG9wdGltYWwgcHJvYmFiaWxpdGllcy4gSXQgYWxzbyBtb2RpZmllcyB0aGUKKy8vICBxdWFudGl6ZXIgdmFsdWUgaWYgc29tZSB0YXJnZXQgKHNpemUsIFBTTlIpIHdhcyBzcGVjaWZpZWQuCisKK3N0YXRpYyB2b2lkIFNldExvb3BQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGUgcXVhbGl0eSBwYXJhbWV0ZXIgaXMgaW5zaWRlIHZhbGlkIGJvdW5kcworICBxID0gQ2xhbXAocSwgMC5mLCAxMDAuZik7CisKKyAgVlA4U2V0U2VnbWVudFBhcmFtcyhlbmMsIHEpOyAgICAgIC8vIHNldHVwIHNlZ21lbnQgcXVhbnRpemF0aW9ucyBhbmQgZmlsdGVycworICBTZXRTZWdtZW50UHJvYmFzKGVuYyk7ICAgICAgICAgICAgLy8gY29tcHV0ZSBzZWdtZW50IHByb2JhYmlsaXRpZXMKKworICBSZXNldFN0YXRzKGVuYyk7CisgIFJlc2V0U1NFKGVuYyk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBPbmVTdGF0UGFzcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOFJETGV2ZWwgcmRfb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9tYnMsIGludCBwZXJjZW50X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NTdGF0cyogY29uc3QgcykgeworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgdWludDY0X3Qgc2l6ZSA9IDA7CisgIHVpbnQ2NF90IHNpemVfcDAgPSAwOworICB1aW50NjRfdCBkaXN0b3J0aW9uID0gMDsKKyAgY29uc3QgdWludDY0X3QgcGl4ZWxfY291bnQgPSBuYl9tYnMgKiAzODQ7CisKKyAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKKyAgU2V0TG9vcFBhcmFtcyhlbmMsIHMtPnEpOworICBkbyB7CisgICAgVlA4TW9kZVNjb3JlIGluZm87CisgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0LCBOVUxMKTsKKyAgICBpZiAoVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSkgeworICAgICAgLy8gSnVzdCByZWNvcmQgdGhlIG51bWJlciBvZiBza2lwcyBhbmQgYWN0IGxpa2Ugc2tpcF9wcm9iYSBpcyBub3QgdXNlZC4KKyAgICAgIGVuYy0+cHJvYmFfLm5iX3NraXBfKys7CisgICAgfQorICAgIFJlY29yZFJlc2lkdWFscygmaXQsICZpbmZvKTsKKyAgICBzaXplICs9IGluZm8uUiArIGluZm8uSDsKKyAgICBzaXplX3AwICs9IGluZm8uSDsKKyAgICBkaXN0b3J0aW9uICs9IGluZm8uRDsKKyAgICBpZiAocGVyY2VudF9kZWx0YSAmJiAhVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIHBlcmNlbnRfZGVsdGEpKQorICAgICAgcmV0dXJuIDA7CisgICAgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoJml0KTsKKyAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCkgJiYgLS1uYl9tYnMgPiAwKTsKKworICBzaXplX3AwICs9IGVuYy0+c2VnbWVudF9oZHJfLnNpemVfOworICBpZiAocy0+ZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICBzaXplICs9IEZpbmFsaXplU2tpcFByb2JhKGVuYyk7CisgICAgc2l6ZSArPSBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7CisgICAgc2l6ZSA9ICgoc2l6ZSArIHNpemVfcDAgKyAxMDI0KSA+PiAxMSkgKyBIRUFERVJfU0laRV9FU1RJTUFURTsKKyAgICBzLT52YWx1ZSA9IChkb3VibGUpc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBzLT52YWx1ZSA9IEdldFBTTlIoZGlzdG9ydGlvbiwgcGl4ZWxfY291bnQpOworICB9CisgIHJldHVybiBzaXplX3AwOworfQorCitzdGF0aWMgaW50IFN0YXRMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBpbnQgbWV0aG9kID0gZW5jLT5tZXRob2RfOworICBjb25zdCBpbnQgZG9fc2VhcmNoID0gZW5jLT5kb19zZWFyY2hfOworICBjb25zdCBpbnQgZmFzdF9wcm9iZSA9ICgobWV0aG9kID09IDAgfHwgbWV0aG9kID09IDMpICYmICFkb19zZWFyY2gpOworICBpbnQgbnVtX3Bhc3NfbGVmdCA9IGVuYy0+Y29uZmlnXy0+cGFzczsKKyAgY29uc3QgaW50IHRhc2tfcGVyY2VudCA9IDIwOworICBjb25zdCBpbnQgcGVyY2VudF9wZXJfcGFzcyA9CisgICAgICAodGFza19wZXJjZW50ICsgbnVtX3Bhc3NfbGVmdCAvIDIpIC8gbnVtX3Bhc3NfbGVmdDsKKyAgY29uc3QgaW50IGZpbmFsX3BlcmNlbnQgPSBlbmMtPnBlcmNlbnRfICsgdGFza19wZXJjZW50OworICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9CisgICAgICAobWV0aG9kID49IDMgfHwgZG9fc2VhcmNoKSA/IFJEX09QVF9CQVNJQyA6IFJEX09QVF9OT05FOworICBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgIFBhc3NTdGF0cyBzdGF0czsKKworICBJbml0UGFzc1N0YXRzKGVuYywgJnN0YXRzKTsKKyAgUmVzZXRUb2tlblN0YXRzKGVuYyk7CisKKyAgLy8gRmFzdCBtb2RlOiBxdWljayBhbmFseXNpcyBwYXNzIG92ZXIgZmV3IG1icy4gQmV0dGVyIHRoYW4gbm90aGluZy4KKyAgaWYgKGZhc3RfcHJvYmUpIHsKKyAgICBpZiAobWV0aG9kID09IDMpIHsgIC8vIHdlIG5lZWQgbW9yZSBzdGF0cyBmb3IgbWV0aG9kIDMgdG8gYmUgcmVsaWFibGUuCisgICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAxIDogMTAwOworICAgIH0gZWxzZSB7CisgICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAyIDogNTA7CisgICAgfQorICB9CisKKyAgd2hpbGUgKG51bV9wYXNzX2xlZnQtLSA+IDApIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9wYXNzID0gKGZhYnMoc3RhdHMuZHEpIDw9IERRX0xJTUlUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3Bhc3NfbGVmdCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApOworICAgIGNvbnN0IHVpbnQ2NF90IHNpemVfcDAgPQorICAgICAgICBPbmVTdGF0UGFzcyhlbmMsIHJkX29wdCwgbmJfbWJzLCBwZXJjZW50X3Blcl9wYXNzLCAmc3RhdHMpOworICAgIGlmIChzaXplX3AwID09IDApIHJldHVybiAwOworI2lmIChERUJVR19TRUFSQ0ggPiAwKQorICAgIHByaW50ZigiIyVkIHZhbHVlOiUuMWxmIC0+ICUuMWxmICAgcTolLjJmIC0+ICUuMmZcbiIsCisgICAgICAgICAgIG51bV9wYXNzX2xlZnQsIHN0YXRzLmxhc3RfdmFsdWUsIHN0YXRzLnZhbHVlLCBzdGF0cy5sYXN0X3EsIHN0YXRzLnEpOworI2VuZGlmCisgICAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+IDAgJiYgc2l6ZV9wMCA+IFBBUlRJVElPTjBfU0laRV9MSU1JVCkgeworICAgICAgKytudW1fcGFzc19sZWZ0OworICAgICAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID4+PSAxOyAgLy8gc3RyZW5ndGhlbiBoZWFkZXIgYml0IGxpbWl0YXRpb24uLi4KKyAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBzdGFydCBvdmVyCisgICAgfQorICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBJZiBubyB0YXJnZXQgc2l6ZToganVzdCBkbyBzZXZlcmFsIHBhc3Mgd2l0aG91dCBjaGFuZ2luZyAncScKKyAgICBpZiAoZG9fc2VhcmNoKSB7CisgICAgICBDb21wdXRlTmV4dFEoJnN0YXRzKTsKKyAgICAgIGlmIChmYWJzKHN0YXRzLmRxKSA8PSBEUV9MSU1JVCkgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZG9fc2VhcmNoIHx8ICFzdGF0cy5kb19zaXplX3NlYXJjaCkgeworICAgIC8vIE5lZWQgdG8gZmluYWxpemUgcHJvYmFzIG5vdywgc2luY2UgaXQgd2Fzbid0IGRvbmUgZHVyaW5nIHRoZSBzZWFyY2guCisgICAgRmluYWxpemVTa2lwUHJvYmEoZW5jKTsKKyAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7CisgIH0KKyAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cygmZW5jLT5wcm9iYV8pOyAgLy8gZmluYWxpemUgY29zdHMKKyAgcmV0dXJuIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGZpbmFsX3BlcmNlbnQsICZlbmMtPnBlcmNlbnRfKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gbG9vcHMKKy8vCisKK3N0YXRpYyBjb25zdCBpbnQga0F2ZXJhZ2VCeXRlc1Blck1CWzhdID0geyA1MCwgMjQsIDE2LCA5LCA3LCA1LCAzLCAyIH07CisKK3N0YXRpYyBpbnQgUHJlTG9vcEluaXRpYWxpemUoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBwOworICBpbnQgb2sgPSAxOworICBjb25zdCBpbnQgYXZlcmFnZV9ieXRlc19wZXJfTUIgPSBrQXZlcmFnZUJ5dGVzUGVyTUJbZW5jLT5iYXNlX3F1YW50XyA+PiA0XTsKKyAgY29uc3QgaW50IGJ5dGVzX3Blcl9wYXJ0cyA9CisgICAgICBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyAqIGF2ZXJhZ2VfYnl0ZXNfcGVyX01CIC8gZW5jLT5udW1fcGFydHNfOworICAvLyBJbml0aWFsaXplIHRoZSBiaXQtd3JpdGVycworICBmb3IgKHAgPSAwOyBvayAmJiBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKKyAgICBvayA9IFZQOEJpdFdyaXRlckluaXQoZW5jLT5wYXJ0c18gKyBwLCBieXRlc19wZXJfcGFydHMpOworICB9CisgIGlmICghb2spIHsKKyAgICBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOyAgLy8gbWFsbG9jIGVycm9yIG9jY3VycmVkCisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IoZW5jLT5waWNfLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBQb3N0TG9vcEZpbmFsaXplKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG9rKSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpZiAob2spIHsgICAgICAvLyBGaW5hbGl6ZSB0aGUgcGFydGl0aW9ucywgY2hlY2sgZm9yIGV4dHJhIGVycm9ycy4KKyAgICBpbnQgcDsKKyAgICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKKyAgICAgIFZQOEJpdFdyaXRlckZpbmlzaChlbmMtPnBhcnRzXyArIHApOworICAgICAgb2sgJj0gIWVuYy0+cGFydHNfW3BdLmVycm9yXzsKKyAgICB9CisgIH0KKworICBpZiAob2spIHsgICAgICAvLyBBbGwgZ29vZC4gRmluaXNoIHVwLgorICAgIGlmIChlbmMtPnBpY18tPnN0YXRzICE9IE5VTEwpIHsgIC8vIGZpbmFsaXplIGJ5dGUgY291bnRlcnMuLi4KKyAgICAgIGludCBpLCBzOworICAgICAgZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsKKyAgICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgICAgZW5jLT5yZXNpZHVhbF9ieXRlc19baV1bc10gPSAoaW50KSgoaXQtPmJpdF9jb3VudF9bc11baV0gKyA3KSA+PiAzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBWUDhBZGp1c3RGaWx0ZXJTdHJlbmd0aChpdCk7ICAgICAvLyAuLi5hbmQgc3RvcmUgZmlsdGVyIHN0YXRzLgorICB9IGVsc2UgeworICAgIC8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQgLT4gbmVlZCB0byBkbyBzb21lIG1lbW9yeSBjbGVhbnVwLgorICAgIFZQOEVuY0ZyZWVCaXRXcml0ZXJzKGVuYyk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIFZQOEVuY0xvb3AoKTogZG9lcyB0aGUgZmluYWwgYml0c3RyZWFtIGNvZGluZy4KKworc3RhdGljIHZvaWQgUmVzZXRBZnRlclNraXAoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7CisgICAgKml0LT5uel8gPSAwOyAgLy8gcmVzZXQgYWxsIHByZWRpY3RvcnMKKyAgICBpdC0+bGVmdF9uel9bOF0gPSAwOworICB9IGVsc2UgeworICAgICppdC0+bnpfICY9ICgxIDw8IDI0KTsgIC8vIHByZXNlcnZlIHRoZSBkY19ueiBiaXQKKyAgfQorfQorCitpbnQgVlA4RW5jTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIGludCBvayA9IFByZUxvb3BJbml0aWFsaXplKGVuYyk7CisgIGlmICghb2spIHJldHVybiAwOworCisgIFN0YXRMb29wKGVuYyk7ICAvLyBzdGF0cy1jb2xsZWN0aW9uIGxvb3AKKworICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOworICBWUDhJbml0RmlsdGVyKCZpdCk7CisgIGRvIHsKKyAgICBWUDhNb2RlU2NvcmUgaW5mbzsKKyAgICBjb25zdCBpbnQgZG9udF91c2Vfc2tpcCA9ICFlbmMtPnByb2JhXy51c2Vfc2tpcF9wcm9iYV87CisgICAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSBlbmMtPnJkX29wdF9sZXZlbF87CisKKyAgICBWUDhJdGVyYXRvckltcG9ydCgmaXQsIE5VTEwpOworICAgIC8vIFdhcm5pbmchIG9yZGVyIGlzIGltcG9ydGFudDogZmlyc3QgY2FsbCBWUDhEZWNpbWF0ZSgpIGFuZAorICAgIC8vICp0aGVuKiBkZWNpZGUgaG93IHRvIGNvZGUgdGhlIHNraXAgZGVjaXNpb24gaWYgdGhlcmUncyBvbmUuCisgICAgaWYgKCFWUDhEZWNpbWF0ZSgmaXQsICZpbmZvLCByZF9vcHQpIHx8IGRvbnRfdXNlX3NraXApIHsKKyAgICAgIENvZGVSZXNpZHVhbHMoaXQuYndfLCAmaXQsICZpbmZvKTsKKyAgICB9IGVsc2UgeyAgIC8vIHJlc2V0IHByZWRpY3RvcnMgYWZ0ZXIgYSBza2lwCisgICAgICBSZXNldEFmdGVyU2tpcCgmaXQpOworICAgIH0KKyAgICBTdG9yZVNpZGVJbmZvKCZpdCk7CisgICAgVlA4U3RvcmVGaWx0ZXJTdGF0cygmaXQpOworICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7CisgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOworICAgIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCZpdCk7CisgIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQpKTsKKworICByZXR1cm4gUG9zdExvb3BGaW5hbGl6ZSgmaXQsIG9rKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbmdsZSBwYXNzIHVzaW5nIFRva2VuIEJ1ZmZlci4KKworI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQorCisjZGVmaW5lIE1JTl9DT1VOVCA5NiAgLy8gbWluaW11bSBudW1iZXIgb2YgbWFjcm9ibG9ja3MgYmVmb3JlIHVwZGF0aW5nIHN0YXRzCisKK2ludCBWUDhFbmNUb2tlbkxvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIC8vIFJvdWdobHkgcmVmcmVzaCB0aGUgcHJvYmEgZWlnaHQgdGltZXMgcGVyIHBhc3MKKyAgaW50IG1heF9jb3VudCA9IChlbmMtPm1iX3dfICogZW5jLT5tYl9oXykgPj4gMzsKKyAgaW50IG51bV9wYXNzX2xlZnQgPSBlbmMtPmNvbmZpZ18tPnBhc3M7CisgIGNvbnN0IGludCBkb19zZWFyY2ggPSBlbmMtPmRvX3NlYXJjaF87CisgIFZQOEVuY0l0ZXJhdG9yIGl0OworICBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87CisgIGNvbnN0IFZQOFJETGV2ZWwgcmRfb3B0ID0gZW5jLT5yZF9vcHRfbGV2ZWxfOworICBjb25zdCB1aW50NjRfdCBwaXhlbF9jb3VudCA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfICogMzg0OworICBQYXNzU3RhdHMgc3RhdHM7CisgIGludCBvazsKKworICBJbml0UGFzc1N0YXRzKGVuYywgJnN0YXRzKTsKKyAgb2sgPSBQcmVMb29wSW5pdGlhbGl6ZShlbmMpOworICBpZiAoIW9rKSByZXR1cm4gMDsKKworICBpZiAobWF4X2NvdW50IDwgTUlOX0NPVU5UKSBtYXhfY291bnQgPSBNSU5fQ09VTlQ7CisKKyAgYXNzZXJ0KGVuYy0+bnVtX3BhcnRzXyA9PSAxKTsKKyAgYXNzZXJ0KGVuYy0+dXNlX3Rva2Vuc18pOworICBhc3NlcnQocHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9PSAwKTsKKyAgYXNzZXJ0KHJkX29wdCA+PSBSRF9PUFRfQkFTSUMpOyAgIC8vIG90aGVyd2lzZSwgdG9rZW4tYnVmZmVyIHdvbid0IGJlIHVzZWZ1bAorICBhc3NlcnQobnVtX3Bhc3NfbGVmdCA+IDApOworCisgIHdoaWxlIChvayAmJiBudW1fcGFzc19sZWZ0LS0gPiAwKSB7CisgICAgY29uc3QgaW50IGlzX2xhc3RfcGFzcyA9IChmYWJzKHN0YXRzLmRxKSA8PSBEUV9MSU1JVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYXNzX2xlZnQgPT0gMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKTsKKyAgICB1aW50NjRfdCBzaXplX3AwID0gMDsKKyAgICB1aW50NjRfdCBkaXN0b3J0aW9uID0gMDsKKyAgICBpbnQgY250ID0gbWF4X2NvdW50OworICAgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgICAgU2V0TG9vcFBhcmFtcyhlbmMsIHN0YXRzLnEpOworICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgIFJlc2V0VG9rZW5TdGF0cyhlbmMpOworICAgICAgVlA4SW5pdEZpbHRlcigmaXQpOyAgLy8gZG9uJ3QgY29sbGVjdCBzdGF0cyB1bnRpbCBsYXN0IHBhc3MgKHRvbyBjb3N0bHkpCisgICAgfQorICAgIFZQOFRCdWZmZXJDbGVhcigmZW5jLT50b2tlbnNfKTsKKyAgICBkbyB7CisgICAgICBWUDhNb2RlU2NvcmUgaW5mbzsKKyAgICAgIFZQOEl0ZXJhdG9ySW1wb3J0KCZpdCwgTlVMTCk7CisgICAgICBpZiAoLS1jbnQgPCAwKSB7CisgICAgICAgIEZpbmFsaXplVG9rZW5Qcm9iYXMocHJvYmEpOworICAgICAgICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKHByb2JhKTsgIC8vIHJlZnJlc2ggY29zdCB0YWJsZXMgZm9yIHJkLW9wdAorICAgICAgICBjbnQgPSBtYXhfY291bnQ7CisgICAgICB9CisgICAgICBWUDhEZWNpbWF0ZSgmaXQsICZpbmZvLCByZF9vcHQpOworICAgICAgb2sgPSBSZWNvcmRUb2tlbnMoJml0LCAmaW5mbywgJmVuYy0+dG9rZW5zXyk7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzaXplX3AwICs9IGluZm8uSDsKKyAgICAgIGRpc3RvcnRpb24gKz0gaW5mby5EOworICAgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgICBTdG9yZVNpZGVJbmZvKCZpdCk7CisgICAgICAgIFZQOFN0b3JlRmlsdGVyU3RhdHMoJml0KTsKKyAgICAgICAgVlA4SXRlcmF0b3JFeHBvcnQoJml0KTsKKyAgICAgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOworICAgICAgfQorICAgICAgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoJml0KTsKKyAgICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0KSk7CisgICAgaWYgKCFvaykgYnJlYWs7CisKKyAgICBzaXplX3AwICs9IGVuYy0+c2VnbWVudF9oZHJfLnNpemVfOworICAgIGlmIChzdGF0cy5kb19zaXplX3NlYXJjaCkgeworICAgICAgdWludDY0X3Qgc2l6ZSA9IEZpbmFsaXplVG9rZW5Qcm9iYXMoJmVuYy0+cHJvYmFfKTsKKyAgICAgIHNpemUgKz0gVlA4RXN0aW1hdGVUb2tlblNpemUoJmVuYy0+dG9rZW5zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfKTsKKyAgICAgIHNpemUgPSAoc2l6ZSArIHNpemVfcDAgKyAxMDI0KSA+PiAxMTsgIC8vIC0+IHNpemUgaW4gYnl0ZXMKKyAgICAgIHNpemUgKz0gSEVBREVSX1NJWkVfRVNUSU1BVEU7CisgICAgICBzdGF0cy52YWx1ZSA9IChkb3VibGUpc2l6ZTsKKyAgICB9IGVsc2UgeyAgLy8gY29tcHV0ZSBhbmQgc3RvcmUgUFNOUgorICAgICAgc3RhdHMudmFsdWUgPSBHZXRQU05SKGRpc3RvcnRpb24sIHBpeGVsX2NvdW50KTsKKyAgICB9CisKKyNpZiAoREVCVUdfU0VBUkNIID4gMCkKKyAgICBwcmludGYoIiMlMmQgbWV0cmljOiUuMWxmIC0+ICUuMWxmICAgbGFzdF9xPSUuMmxmIHE9JS4ybGYgZHE9JS4ybGZcbiIsCisgICAgICAgICAgIG51bV9wYXNzX2xlZnQsIHN0YXRzLmxhc3RfdmFsdWUsIHN0YXRzLnZhbHVlLAorICAgICAgICAgICBzdGF0cy5sYXN0X3EsIHN0YXRzLnEsIHN0YXRzLmRxKTsKKyNlbmRpZgorICAgIGlmIChzaXplX3AwID4gUEFSVElUSU9OMF9TSVpFX0xJTUlUKSB7CisgICAgICArK251bV9wYXNzX2xlZnQ7CisgICAgICBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPj49IDE7ICAvLyBzdHJlbmd0aGVuIGhlYWRlciBiaXQgbGltaXRhdGlvbi4uLgorICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4uYW5kIHN0YXJ0IG92ZXIKKyAgICB9CisgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgYnJlYWs7ICAgLy8gZG9uZQorICAgIH0KKyAgICBpZiAoZG9fc2VhcmNoKSB7CisgICAgICBDb21wdXRlTmV4dFEoJnN0YXRzKTsgIC8vIEFkanVzdCBxCisgICAgfQorICB9CisgIGlmIChvaykgeworICAgIGlmICghc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAgIEZpbmFsaXplVG9rZW5Qcm9iYXMoJmVuYy0+cHJvYmFfKTsKKyAgICB9CisgICAgb2sgPSBWUDhFbWl0VG9rZW5zKCZlbmMtPnRva2Vuc18sIGVuYy0+cGFydHNfICsgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXByb2JhLT5jb2VmZnNfLCAxKTsKKyAgfQorICBvayA9IG9rICYmIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGVuYy0+cGVyY2VudF8gKyAyMCwgJmVuYy0+cGVyY2VudF8pOworICByZXR1cm4gUG9zdExvb3BGaW5hbGl6ZSgmaXQsIG9rKTsKK30KKworI2Vsc2UKKworaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgKHZvaWQpZW5jOworICByZXR1cm4gMDsgICAvLyB3ZSBzaG91bGRuJ3QgYmUgaGVyZS4KK30KKworI2VuZGlmICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzcwMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5jCkBAIC0wLDAgKzEsOTM3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiLi4vd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisjZGVmaW5lIE1BWF9DT1NUIDEuZTM4CisKKy8vIE51bWJlciBvZiBwYXJ0aXRpb25zIGZvciB0aGUgdGhyZWUgZG9taW5hbnQgKGxpdGVyYWwsIHJlZCBhbmQgYmx1ZSkgc3ltYm9sCisvLyBjb3N0cy4KKyNkZWZpbmUgTlVNX1BBUlRJVElPTlMgNAorLy8gVGhlIHNpemUgb2YgdGhlIGJpbi1oYXNoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRocmVlIGRvbWluYW50IGNvc3RzLgorI2RlZmluZSBCSU5fU0laRSAoTlVNX1BBUlRJVElPTlMgKiBOVU1fUEFSVElUSU9OUyAqIE5VTV9QQVJUSVRJT05TKQorLy8gTWF4aW11bSBudW1iZXIgb2YgaGlzdG9ncmFtcyBhbGxvd2VkIGluIGdyZWVkeSBjb21iaW5pbmcgYWxnb3JpdGhtLgorI2RlZmluZSBNQVhfSElTVE9fR1JFRURZIDEwMAorCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1DbGVhcihWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7CisgIHVpbnQzMl90KiBjb25zdCBsaXRlcmFsID0gcC0+bGl0ZXJhbF87CisgIGNvbnN0IGludCBjYWNoZV9iaXRzID0gcC0+cGFsZXR0ZV9jb2RlX2JpdHNfOworICBjb25zdCBpbnQgaGlzdG9fc2l6ZSA9IFZQOExHZXRIaXN0b2dyYW1TaXplKGNhY2hlX2JpdHMpOworICBtZW1zZXQocCwgMCwgaGlzdG9fc2l6ZSk7CisgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IGNhY2hlX2JpdHM7CisgIHAtPmxpdGVyYWxfID0gbGl0ZXJhbDsKK30KKworLy8gU3dhcCB0d28gaGlzdG9ncmFtIHBvaW50ZXJzLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtU3dhcChWUDhMSGlzdG9ncmFtKiogY29uc3QgQSwgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IEIpIHsKKyAgVlA4TEhpc3RvZ3JhbSogY29uc3QgdG1wID0gKkE7CisgICpBID0gKkI7CisgICpCID0gdG1wOworfQorCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Db3B5KGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgZHN0KSB7CisgIHVpbnQzMl90KiBjb25zdCBkc3RfbGl0ZXJhbCA9IGRzdC0+bGl0ZXJhbF87CisgIGNvbnN0IGludCBkc3RfY2FjaGVfYml0cyA9IGRzdC0+cGFsZXR0ZV9jb2RlX2JpdHNfOworICBjb25zdCBpbnQgaGlzdG9fc2l6ZSA9IFZQOExHZXRIaXN0b2dyYW1TaXplKGRzdF9jYWNoZV9iaXRzKTsKKyAgYXNzZXJ0KHNyYy0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGRzdF9jYWNoZV9iaXRzKTsKKyAgbWVtY3B5KGRzdCwgc3JjLCBoaXN0b19zaXplKTsKKyAgZHN0LT5saXRlcmFsXyA9IGRzdF9saXRlcmFsOworfQorCitpbnQgVlA4TEdldEhpc3RvZ3JhbVNpemUoaW50IGNhY2hlX2JpdHMpIHsKKyAgY29uc3QgaW50IGxpdGVyYWxfc2l6ZSA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhjYWNoZV9iaXRzKTsKKyAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBzaXplb2YoVlA4TEhpc3RvZ3JhbSkgKyBzaXplb2YoaW50KSAqIGxpdGVyYWxfc2l6ZTsKKyAgYXNzZXJ0KHRvdGFsX3NpemUgPD0gKHNpemVfdCkweDdmZmZmZmZmKTsKKyAgcmV0dXJuIChpbnQpdG90YWxfc2l6ZTsKK30KKwordm9pZCBWUDhMRnJlZUhpc3RvZ3JhbShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBXZWJQU2FmZUZyZWUoaGlzdG8pOworfQorCit2b2lkIFZQOExGcmVlSGlzdG9ncmFtU2V0KFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvKSB7CisgIFdlYlBTYWZlRnJlZShoaXN0byk7Cit9CisKK3ZvaWQgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sIGMuY3VyX3Bvcyk7CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorfQorCit2b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cykgeworICBpZiAocGFsZXR0ZV9jb2RlX2JpdHMgPj0gMCkgeworICAgIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOworICB9CisgIEhpc3RvZ3JhbUNsZWFyKHApOworICBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKHJlZnMsIHApOworfQorCit2b2lkIFZQOExIaXN0b2dyYW1Jbml0KFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsIGludCBwYWxldHRlX2NvZGVfYml0cykgeworICBwLT5wYWxldHRlX2NvZGVfYml0c18gPSBwYWxldHRlX2NvZGVfYml0czsKKyAgSGlzdG9ncmFtQ2xlYXIocCk7Cit9CisKK1ZQOExIaXN0b2dyYW0qIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbShpbnQgY2FjaGVfYml0cykgeworICBWUDhMSGlzdG9ncmFtKiBoaXN0byA9IE5VTEw7CisgIGNvbnN0IGludCB0b3RhbF9zaXplID0gVlA4TEdldEhpc3RvZ3JhbVNpemUoY2FjaGVfYml0cyk7CisgIHVpbnQ4X3QqIGNvbnN0IG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbW9yeSkpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHJldHVybiBOVUxMOworICBoaXN0byA9IChWUDhMSGlzdG9ncmFtKiltZW1vcnk7CisgIC8vIGxpdGVyYWxfIHdvbid0IG5lY2Vzc2FyeSBiZSBhbGlnbmVkLgorICBoaXN0by0+bGl0ZXJhbF8gPSAodWludDMyX3QqKShtZW1vcnkgKyBzaXplb2YoVlA4TEhpc3RvZ3JhbSkpOworICBWUDhMSGlzdG9ncmFtSW5pdChoaXN0bywgY2FjaGVfYml0cyk7CisgIHJldHVybiBoaXN0bzsKK30KKworVlA4TEhpc3RvZ3JhbVNldCogVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KGludCBzaXplLCBpbnQgY2FjaGVfYml0cykgeworICBpbnQgaTsKKyAgVlA4TEhpc3RvZ3JhbVNldCogc2V0OworICBjb25zdCBpbnQgaGlzdG9fc2l6ZSA9IFZQOExHZXRIaXN0b2dyYW1TaXplKGNhY2hlX2JpdHMpOworICBjb25zdCBzaXplX3QgdG90YWxfc2l6ZSA9CisgICAgICBzaXplb2YoKnNldCkgKyBzaXplICogKHNpemVvZigqc2V0LT5oaXN0b2dyYW1zKSArCisgICAgICBoaXN0b19zaXplICsgV0VCUF9BTElHTl9DU1QpOworICB1aW50OF90KiBtZW1vcnkgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKKyAgaWYgKG1lbW9yeSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBzZXQgPSAoVlA4TEhpc3RvZ3JhbVNldCopbWVtb3J5OworICBtZW1vcnkgKz0gc2l6ZW9mKCpzZXQpOworICBzZXQtPmhpc3RvZ3JhbXMgPSAoVlA4TEhpc3RvZ3JhbSoqKW1lbW9yeTsKKyAgbWVtb3J5ICs9IHNpemUgKiBzaXplb2YoKnNldC0+aGlzdG9ncmFtcyk7CisgIHNldC0+bWF4X3NpemUgPSBzaXplOworICBzZXQtPnNpemUgPSBzaXplOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgbWVtb3J5ID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04obWVtb3J5KTsKKyAgICBzZXQtPmhpc3RvZ3JhbXNbaV0gPSAoVlA4TEhpc3RvZ3JhbSopbWVtb3J5OworICAgIC8vIGxpdGVyYWxfIHdvbid0IG5lY2Vzc2FyeSBiZSBhbGlnbmVkLgorICAgIHNldC0+aGlzdG9ncmFtc1tpXS0+bGl0ZXJhbF8gPSAodWludDMyX3QqKShtZW1vcnkgKyBzaXplb2YoVlA4TEhpc3RvZ3JhbSkpOworICAgIFZQOExIaXN0b2dyYW1Jbml0KHNldC0+aGlzdG9ncmFtc1tpXSwgY2FjaGVfYml0cyk7CisgICAgbWVtb3J5ICs9IGhpc3RvX3NpemU7CisgIH0KKyAgcmV0dXJuIHNldDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdikgeworICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgKytoaXN0by0+YWxwaGFfW1BpeE9yQ29weUxpdGVyYWwodiwgMyldOworICAgICsraGlzdG8tPnJlZF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAyKV07CisgICAgKytoaXN0by0+bGl0ZXJhbF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAxKV07CisgICAgKytoaXN0by0+Ymx1ZV9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAwKV07CisgIH0gZWxzZSBpZiAoUGl4T3JDb3B5SXNDYWNoZUlkeCh2KSkgeworICAgIGNvbnN0IGludCBsaXRlcmFsX2l4ID0KKyAgICAgICAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsgUGl4T3JDb3B5Q2FjaGVJZHgodik7CisgICAgKytoaXN0by0+bGl0ZXJhbF9bbGl0ZXJhbF9peF07CisgIH0gZWxzZSB7CisgICAgaW50IGNvZGUsIGV4dHJhX2JpdHM7CisgICAgVlA4TFByZWZpeEVuY29kZUJpdHMoUGl4T3JDb3B5TGVuZ3RoKHYpLCAmY29kZSwgJmV4dHJhX2JpdHMpOworICAgICsraGlzdG8tPmxpdGVyYWxfW05VTV9MSVRFUkFMX0NPREVTICsgY29kZV07CisgICAgVlA4TFByZWZpeEVuY29kZUJpdHMoUGl4T3JDb3B5RGlzdGFuY2UodiksICZjb2RlLCAmZXh0cmFfYml0cyk7CisgICAgKytoaXN0by0+ZGlzdGFuY2VfW2NvZGVdOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyb3B5LXJlbGF0ZWQgZnVuY3Rpb25zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEJpdHNFbnRyb3B5UmVmaW5lKGNvbnN0IFZQOExCaXRFbnRyb3B5KiBlbnRyb3B5KSB7CisgIGRvdWJsZSBtaXg7CisgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA8IDUpIHsKKyAgICBpZiAoZW50cm9weS0+bm9uemVyb3MgPD0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIFR3byBzeW1ib2xzLCB0aGV5IHdpbGwgYmUgMCBhbmQgMSBpbiBhIEh1ZmZtYW4gY29kZS4KKyAgICAvLyBMZXQncyBtaXggaW4gYSBiaXQgb2YgZW50cm9weSB0byBmYXZvciBnb29kIGNsdXN0ZXJpbmcgd2hlbgorICAgIC8vIGRpc3RyaWJ1dGlvbnMgb2YgdGhlc2UgYXJlIGNvbWJpbmVkLgorICAgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA9PSAyKSB7CisgICAgICByZXR1cm4gMC45OSAqIGVudHJvcHktPnN1bSArIDAuMDEgKiBlbnRyb3B5LT5lbnRyb3B5OworICAgIH0KKyAgICAvLyBObyBtYXR0ZXIgd2hhdCB0aGUgZW50cm9weSBzYXlzLCB3ZSBjYW5ub3QgYmUgYmV0dGVyIHRoYW4gbWluX2xpbWl0CisgICAgLy8gd2l0aCBIdWZmbWFuIGNvZGluZy4gSSBhbSBtaXhpbmcgYSBiaXQgb2YgZW50cm9weSBpbnRvIHRoZQorICAgIC8vIG1pbl9saW1pdCBzaW5jZSBpdCBwcm9kdWNlcyBtdWNoIGJldHRlciAofjAuNSAlKSBjb21wcmVzc2lvbiByZXN1bHRzCisgICAgLy8gcGVyaGFwcyBiZWNhdXNlIG9mIGJldHRlciBlbnRyb3B5IGNsdXN0ZXJpbmcuCisgICAgaWYgKGVudHJvcHktPm5vbnplcm9zID09IDMpIHsKKyAgICAgIG1peCA9IDAuOTU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1peCA9IDAuNzsgIC8vIG5vbnplcm9zID09IDQuCisgICAgfQorICB9IGVsc2UgeworICAgIG1peCA9IDAuNjI3OworICB9CisKKyAgeworICAgIGRvdWJsZSBtaW5fbGltaXQgPSAyICogZW50cm9weS0+c3VtIC0gZW50cm9weS0+bWF4X3ZhbDsKKyAgICBtaW5fbGltaXQgPSBtaXggKiBtaW5fbGltaXQgKyAoMS4wIC0gbWl4KSAqIGVudHJvcHktPmVudHJvcHk7CisgICAgcmV0dXJuIChlbnRyb3B5LT5lbnRyb3B5IDwgbWluX2xpbWl0KSA/IG1pbl9saW1pdCA6IGVudHJvcHktPmVudHJvcHk7CisgIH0KK30KKworZG91YmxlIFZQOExCaXRzRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXksIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgdHJpdmlhbF9zeW1ib2wpIHsKKyAgVlA4TEJpdEVudHJvcHkgZW50cm9weTsKKyAgVlA4TEJpdHNFbnRyb3B5VW5yZWZpbmVkKGFycmF5LCBuLCAmZW50cm9weSk7CisgIGlmICh0cml2aWFsX3N5bWJvbCAhPSBOVUxMKSB7CisgICAgKnRyaXZpYWxfc3ltYm9sID0KKyAgICAgICAgKGVudHJvcHkubm9uemVyb3MgPT0gMSkgPyBlbnRyb3B5Lm5vbnplcm9fY29kZSA6IFZQOExfTk9OX1RSSVZJQUxfU1lNOworICB9CisKKyAgcmV0dXJuIEJpdHNFbnRyb3B5UmVmaW5lKCZlbnRyb3B5KTsKK30KKworc3RhdGljIGRvdWJsZSBJbml0aWFsSHVmZm1hbkNvc3Qodm9pZCkgeworICAvLyBTbWFsbCBiaWFzIGJlY2F1c2UgSHVmZm1hbiBjb2RlIGxlbmd0aCBpcyB0eXBpY2FsbHkgbm90IHN0b3JlZCBpbgorICAvLyBmdWxsIGxlbmd0aC4KKyAgc3RhdGljIGNvbnN0IGludCBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSA9IENPREVfTEVOR1RIX0NPREVTICogMzsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrU21hbGxCaWFzID0gOS4xOworICByZXR1cm4ga0h1ZmZtYW5Db2RlT2ZIdWZmbWFuQ29kZVNpemUgLSBrU21hbGxCaWFzOworfQorCisvLyBGaW5hbGl6ZSB0aGUgSHVmZm1hbiBjb3N0IGJhc2VkIG9uIHN0cmVhayBudW1iZXJzIGFuZCBsZW5ndGggdHlwZSAoPDMgb3IgPj0zKQorc3RhdGljIGRvdWJsZSBGaW5hbEh1ZmZtYW5Db3N0KGNvbnN0IFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBkb3VibGUgcmV0dmFsID0gSW5pdGlhbEh1ZmZtYW5Db3N0KCk7CisgIHJldHZhbCArPSBzdGF0cy0+Y291bnRzWzBdICogMS41NjI1ICsgMC4yMzQzNzUgKiBzdGF0cy0+c3RyZWFrc1swXVsxXTsKKyAgcmV0dmFsICs9IHN0YXRzLT5jb3VudHNbMV0gKiAyLjU3ODEyNSArIDAuNzAzMTI1ICogc3RhdHMtPnN0cmVha3NbMV1bMV07CisgIHJldHZhbCArPSAxLjc5Njg3NSAqIHN0YXRzLT5zdHJlYWtzWzBdWzBdOworICByZXR2YWwgKz0gMy4yODEyNSAqIHN0YXRzLT5zdHJlYWtzWzFdWzBdOworICByZXR1cm4gcmV0dmFsOworfQorCisvLyBHZXQgdGhlIHN5bWJvbCBlbnRyb3B5IGZvciB0aGUgZGlzdHJpYnV0aW9uICdwb3B1bGF0aW9uJy4KKy8vIFNldCAndHJpdmlhbF9zeW0nLCBpZiB0aGVyZSdzIG9ubHkgb25lIHN5bWJvbCBwcmVzZW50IGluIHRoZSBkaXN0cmlidXRpb24uCitzdGF0aWMgZG91YmxlIFBvcHVsYXRpb25Db3N0KGNvbnN0IHVpbnQzMl90KiBjb25zdCBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgdHJpdmlhbF9zeW0pIHsKKyAgVlA4TEJpdEVudHJvcHkgYml0X2VudHJvcHk7CisgIFZQOExTdHJlYWtzIHN0YXRzOworICBWUDhMR2V0RW50cm9weVVucmVmaW5lZChwb3B1bGF0aW9uLCBsZW5ndGgsICZiaXRfZW50cm9weSwgJnN0YXRzKTsKKyAgaWYgKHRyaXZpYWxfc3ltICE9IE5VTEwpIHsKKyAgICAqdHJpdmlhbF9zeW0gPSAoYml0X2VudHJvcHkubm9uemVyb3MgPT0gMSkgPyBiaXRfZW50cm9weS5ub256ZXJvX2NvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWUDhMX05PTl9UUklWSUFMX1NZTTsKKyAgfQorCisgIHJldHVybiBCaXRzRW50cm9weVJlZmluZSgmYml0X2VudHJvcHkpICsgRmluYWxIdWZmbWFuQ29zdCgmc3RhdHMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldENvbWJpbmVkRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICBWUDhMQml0RW50cm9weSBiaXRfZW50cm9weTsKKyAgVlA4TFN0cmVha3Mgc3RhdHM7CisgIFZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWQoWCwgWSwgbGVuZ3RoLCAmYml0X2VudHJvcHksICZzdGF0cyk7CisKKyAgcmV0dXJuIEJpdHNFbnRyb3B5UmVmaW5lKCZiaXRfZW50cm9weSkgKyBGaW5hbEh1ZmZtYW5Db3N0KCZzdGF0cyk7Cit9CisKKy8vIEVzdGltYXRlcyB0aGUgRW50cm9weSArIEh1ZmZtYW4gKyBvdGhlciBibG9jayBvdmVyaGVhZCBzaXplIGNvc3QuCitkb3VibGUgVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7CisgIHJldHVybgorICAgICAgUG9wdWxhdGlvbkNvc3QoCisgICAgICAgICAgcC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwLT5wYWxldHRlX2NvZGVfYml0c18pLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgTlVMTCkKKyAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUywgTlVMTCkKKyAgICAgICsgVlA4TEV4dHJhQ29zdChwLT5saXRlcmFsXyArIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTEVOR1RIX0NPREVTKQorICAgICAgKyBWUDhMRXh0cmFDb3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgaGlzdG9ncmFtIGNvbWJpbmUvY29zdC1ldmFsIGZ1bmN0aW9ucworCitzdGF0aWMgaW50IEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogY29zdCkgeworICBjb25zdCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMgPSBhLT5wYWxldHRlX2NvZGVfYml0c187CisgIGFzc2VydChhLT5wYWxldHRlX2NvZGVfYml0c18gPT0gYi0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgKmNvc3QgKz0gR2V0Q29tYmluZWRFbnRyb3B5KGEtPmxpdGVyYWxfLCBiLT5saXRlcmFsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhwYWxldHRlX2NvZGVfYml0cykpOworICAqY29zdCArPSBWUDhMRXh0cmFDb3N0Q29tYmluZWQoYS0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPmxpdGVyYWxfICsgTlVNX0xJVEVSQUxfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fTEVOR1RIX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgICpjb3N0ICs9IEdldENvbWJpbmVkRW50cm9weShhLT5yZWRfLCBiLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPSBHZXRDb21iaW5lZEVudHJvcHkoYS0+Ymx1ZV8sIGItPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPSBHZXRDb21iaW5lZEVudHJvcHkoYS0+YWxwaGFfLCBiLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgICpjb3N0ICs9IEdldENvbWJpbmVkRW50cm9weShhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKKyAgKmNvc3QgKz0KKyAgICAgIFZQOExFeHRyYUNvc3RDb21iaW5lZChhLT5kaXN0YW5jZV8sIGItPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgIHJldHVybiAxOworfQorCisvLyBQZXJmb3JtcyBvdXQgPSBhICsgYiwgY29tcHV0aW5nIHRoZSBjb3N0IEMoYStiKSAtIEMoYSkgLSBDKGIpIHdoaWxlIGNvbXBhcmluZworLy8gdG8gdGhlIHRocmVzaG9sZCB2YWx1ZSAnY29zdF90aHJlc2hvbGQnLiBUaGUgc2NvcmUgcmV0dXJuZWQgaXMKKy8vICBTY29yZSA9IEMoYStiKSAtIEMoYSkgLSBDKGIpLCB3aGVyZSBDKGEpICsgQyhiKSBpcyBrbm93biBhbmQgZml4ZWQuCisvLyBTaW5jZSB0aGUgcHJldmlvdXMgc2NvcmUgcGFzc2VkIGlzICdjb3N0X3RocmVzaG9sZCcsIHdlIG9ubHkgbmVlZCB0byBjb21wYXJlCisvLyB0aGUgcGFydGlhbCBjb3N0IGFnYWluc3QgJ2Nvc3RfdGhyZXNob2xkICsgQyhhKSArIEMoYiknIHRvIHBvc3NpYmx5IGJhaWwtb3V0CisvLyBlYXJseS4KK3N0YXRpYyBkb3VibGUgSGlzdG9ncmFtQWRkRXZhbChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgeworICBkb3VibGUgY29zdCA9IDA7CisgIGNvbnN0IGRvdWJsZSBzdW1fY29zdCA9IGEtPmJpdF9jb3N0XyArIGItPmJpdF9jb3N0XzsKKyAgY29zdF90aHJlc2hvbGQgKz0gc3VtX2Nvc3Q7CisKKyAgaWYgKEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShhLCBiLCBjb3N0X3RocmVzaG9sZCwgJmNvc3QpKSB7CisgICAgVlA4TEhpc3RvZ3JhbUFkZChhLCBiLCBvdXQpOworICAgIG91dC0+Yml0X2Nvc3RfID0gY29zdDsKKyAgICBvdXQtPnBhbGV0dGVfY29kZV9iaXRzXyA9IGEtPnBhbGV0dGVfY29kZV9iaXRzXzsKKyAgICBvdXQtPnRyaXZpYWxfc3ltYm9sXyA9IChhLT50cml2aWFsX3N5bWJvbF8gPT0gYi0+dHJpdmlhbF9zeW1ib2xfKSA/CisgICAgICAgIGEtPnRyaXZpYWxfc3ltYm9sXyA6IFZQOExfTk9OX1RSSVZJQUxfU1lNOworICB9CisKKyAgcmV0dXJuIGNvc3QgLSBzdW1fY29zdDsKK30KKworLy8gU2FtZSBhcyBIaXN0b2dyYW1BZGRFdmFsKCksIGV4Y2VwdCB0aGF0IHRoZSByZXN1bHRpbmcgaGlzdG9ncmFtCisvLyBpcyBub3Qgc3RvcmVkLiBPbmx5IHRoZSBjb3N0IEMoYStiKSAtIEMoYSkgaXMgZXZhbHVhdGVkLiBXZSBvbWl0CisvLyB0aGUgdGVybSBDKGIpIHdoaWNoIGlzIGNvbnN0YW50IG92ZXIgYWxsIHRoZSBldmFsdWF0aW9ucy4KK3N0YXRpYyBkb3VibGUgSGlzdG9ncmFtQWRkVGhyZXNoKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7CisgIGRvdWJsZSBjb3N0ID0gLWEtPmJpdF9jb3N0XzsKKyAgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGEsIGIsIGNvc3RfdGhyZXNob2xkLCAmY29zdCk7CisgIHJldHVybiBjb3N0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGUgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgY29zdCByYW5nZSBmb3IgdGhlIHRocmVlIGRvbWluYW50IGVudHJvcHkKKy8vIHN5bWJvbHMuCisvLyBUT0RPKHNrYWwpOiBFdmFsdWF0ZSBpZiBmbG9hdCBjYW4gYmUgdXNlZCBoZXJlIGluc3RlYWQgb2YgZG91YmxlIGZvcgorLy8gcmVwcmVzZW50aW5nIHRoZSBlbnRyb3B5IGNvc3RzLgordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgbGl0ZXJhbF9tYXhfOworICBkb3VibGUgbGl0ZXJhbF9taW5fOworICBkb3VibGUgcmVkX21heF87CisgIGRvdWJsZSByZWRfbWluXzsKKyAgZG91YmxlIGJsdWVfbWF4XzsKKyAgZG91YmxlIGJsdWVfbWluXzsKK30gRG9taW5hbnRDb3N0UmFuZ2U7CisKK3N0YXRpYyB2b2lkIERvbWluYW50Q29zdFJhbmdlSW5pdChEb21pbmFudENvc3RSYW5nZSogY29uc3QgYykgeworICBjLT5saXRlcmFsX21heF8gPSAwLjsKKyAgYy0+bGl0ZXJhbF9taW5fID0gTUFYX0NPU1Q7CisgIGMtPnJlZF9tYXhfID0gMC47CisgIGMtPnJlZF9taW5fID0gTUFYX0NPU1Q7CisgIGMtPmJsdWVfbWF4XyA9IDAuOworICBjLT5ibHVlX21pbl8gPSBNQVhfQ09TVDsKK30KKworc3RhdGljIHZvaWQgVXBkYXRlRG9taW5hbnRDb3N0UmFuZ2UoCisgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaCwgRG9taW5hbnRDb3N0UmFuZ2UqIGNvbnN0IGMpIHsKKyAgaWYgKGMtPmxpdGVyYWxfbWF4XyA8IGgtPmxpdGVyYWxfY29zdF8pIGMtPmxpdGVyYWxfbWF4XyA9IGgtPmxpdGVyYWxfY29zdF87CisgIGlmIChjLT5saXRlcmFsX21pbl8gPiBoLT5saXRlcmFsX2Nvc3RfKSBjLT5saXRlcmFsX21pbl8gPSBoLT5saXRlcmFsX2Nvc3RfOworICBpZiAoYy0+cmVkX21heF8gPCBoLT5yZWRfY29zdF8pIGMtPnJlZF9tYXhfID0gaC0+cmVkX2Nvc3RfOworICBpZiAoYy0+cmVkX21pbl8gPiBoLT5yZWRfY29zdF8pIGMtPnJlZF9taW5fID0gaC0+cmVkX2Nvc3RfOworICBpZiAoYy0+Ymx1ZV9tYXhfIDwgaC0+Ymx1ZV9jb3N0XykgYy0+Ymx1ZV9tYXhfID0gaC0+Ymx1ZV9jb3N0XzsKKyAgaWYgKGMtPmJsdWVfbWluXyA+IGgtPmJsdWVfY29zdF8pIGMtPmJsdWVfbWluXyA9IGgtPmJsdWVfY29zdF87Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZUhpc3RvZ3JhbUNvc3QoVlA4TEhpc3RvZ3JhbSogY29uc3QgaCkgeworICB1aW50MzJfdCBhbHBoYV9zeW0sIHJlZF9zeW0sIGJsdWVfc3ltOworICBjb25zdCBkb3VibGUgYWxwaGFfY29zdCA9CisgICAgICBQb3B1bGF0aW9uQ29zdChoLT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTLCAmYWxwaGFfc3ltKTsKKyAgY29uc3QgZG91YmxlIGRpc3RhbmNlX2Nvc3QgPQorICAgICAgUG9wdWxhdGlvbkNvc3QoaC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMsIE5VTEwpICsKKyAgICAgIFZQOExFeHRyYUNvc3QoaC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOworICBjb25zdCBpbnQgbnVtX2NvZGVzID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGgtPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGgtPmxpdGVyYWxfY29zdF8gPSBQb3B1bGF0aW9uQ29zdChoLT5saXRlcmFsXywgbnVtX2NvZGVzLCBOVUxMKSArCisgICAgICAgICAgICAgICAgICAgICBWUDhMRXh0cmFDb3N0KGgtPmxpdGVyYWxfICsgTlVNX0xJVEVSQUxfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9MRU5HVEhfQ09ERVMpOworICBoLT5yZWRfY29zdF8gPSBQb3B1bGF0aW9uQ29zdChoLT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgJnJlZF9zeW0pOworICBoLT5ibHVlX2Nvc3RfID0gUG9wdWxhdGlvbkNvc3QoaC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTLCAmYmx1ZV9zeW0pOworICBoLT5iaXRfY29zdF8gPSBoLT5saXRlcmFsX2Nvc3RfICsgaC0+cmVkX2Nvc3RfICsgaC0+Ymx1ZV9jb3N0XyArCisgICAgICAgICAgICAgICAgIGFscGhhX2Nvc3QgKyBkaXN0YW5jZV9jb3N0OworICBpZiAoKGFscGhhX3N5bSB8IHJlZF9zeW0gfCBibHVlX3N5bSkgPT0gVlA4TF9OT05fVFJJVklBTF9TWU0pIHsKKyAgICBoLT50cml2aWFsX3N5bWJvbF8gPSBWUDhMX05PTl9UUklWSUFMX1NZTTsKKyAgfSBlbHNlIHsKKyAgICBoLT50cml2aWFsX3N5bWJvbF8gPQorICAgICAgICAoKHVpbnQzMl90KWFscGhhX3N5bSA8PCAyNCkgfCAocmVkX3N5bSA8PCAxNikgfCAoYmx1ZV9zeW0gPDwgMCk7CisgIH0KK30KKworc3RhdGljIGludCBHZXRCaW5JZEZvckVudHJvcHkoZG91YmxlIG1pbiwgZG91YmxlIG1heCwgZG91YmxlIHZhbCkgeworICBjb25zdCBkb3VibGUgcmFuZ2UgPSBtYXggLSBtaW47CisgIGlmIChyYW5nZSA+IDAuKSB7CisgICAgY29uc3QgZG91YmxlIGRlbHRhID0gdmFsIC0gbWluOworICAgIHJldHVybiAoaW50KSgoTlVNX1BBUlRJVElPTlMgLSAxZS02KSAqIGRlbHRhIC8gcmFuZ2UpOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK3N0YXRpYyBpbnQgR2V0SGlzdG9CaW5JbmRleChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYW50Q29zdFJhbmdlKiBjb25zdCBjLCBpbnQgbG93X2VmZm9ydCkgeworICBpbnQgYmluX2lkID0gR2V0QmluSWRGb3JFbnRyb3B5KGMtPmxpdGVyYWxfbWluXywgYy0+bGl0ZXJhbF9tYXhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmxpdGVyYWxfY29zdF8pOworICBhc3NlcnQoYmluX2lkIDwgTlVNX1BBUlRJVElPTlMpOworICBpZiAoIWxvd19lZmZvcnQpIHsKKyAgICBiaW5faWQgPSBiaW5faWQgKiBOVU1fUEFSVElUSU9OUworICAgICAgICAgICArIEdldEJpbklkRm9yRW50cm9weShjLT5yZWRfbWluXywgYy0+cmVkX21heF8sIGgtPnJlZF9jb3N0Xyk7CisgICAgYmluX2lkID0gYmluX2lkICogTlVNX1BBUlRJVElPTlMKKyAgICAgICAgICAgKyBHZXRCaW5JZEZvckVudHJvcHkoYy0+Ymx1ZV9taW5fLCBjLT5ibHVlX21heF8sIGgtPmJsdWVfY29zdF8pOworICAgIGFzc2VydChiaW5faWQgPCBCSU5fU0laRSk7CisgIH0KKyAgcmV0dXJuIGJpbl9pZDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBoaXN0b2dyYW1zIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUJ1aWxkKAorICAgIGludCB4c2l6ZSwgaW50IGhpc3RvX2JpdHMsIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IGJhY2t3YXJkX3JlZnMsCisgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8pIHsKKyAgaW50IHggPSAwLCB5ID0gMDsKKyAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeHNpemUsIGhpc3RvX2JpdHMpOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KGJhY2t3YXJkX3JlZnMpOworICBhc3NlcnQoaGlzdG9fYml0cyA+IDApOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgY29uc3QgaW50IGl4ID0gKHkgPj4gaGlzdG9fYml0cykgKiBoaXN0b194c2l6ZSArICh4ID4+IGhpc3RvX2JpdHMpOworICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG9ncmFtc1tpeF0sIHYpOworICAgIHggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOworICAgIHdoaWxlICh4ID49IHhzaXplKSB7CisgICAgICB4IC09IHhzaXplOworICAgICAgKyt5OworICAgIH0KKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9Cit9CisKKy8vIENvcGllcyB0aGUgaGlzdG9ncmFtcyBhbmQgY29tcHV0ZXMgaXRzIGJpdF9jb3N0Lgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQ29weUFuZEFuYWx5emUoCisgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3JpZ19oaXN0bywgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8pIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBoaXN0b19zaXplID0gb3JpZ19oaXN0by0+c2l6ZTsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IG9yaWdfaGlzdG9ncmFtcyA9IG9yaWdfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b19zaXplOyArK2kpIHsKKyAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IG9yaWdfaGlzdG9ncmFtc1tpXTsKKyAgICBVcGRhdGVIaXN0b2dyYW1Db3N0KGhpc3RvKTsKKyAgICAvLyBDb3B5IGhpc3RvZ3JhbXMgZnJvbSBvcmlnX2hpc3RvW10gdG8gaW1hZ2VfaGlzdG9bXS4KKyAgICBIaXN0b2dyYW1Db3B5KGhpc3RvLCBoaXN0b2dyYW1zW2ldKTsKKyAgfQorfQorCisvLyBQYXJ0aXRpb24gaGlzdG9ncmFtcyB0byBkaWZmZXJlbnQgZW50cm9weSBiaW5zIGZvciB0aHJlZSBkb21pbmFudCAobGl0ZXJhbCwKKy8vIHJlZCBhbmQgYmx1ZSkgc3ltYm9sIGNvc3RzIGFuZCBjb21wdXRlIHRoZSBoaXN0b2dyYW0gYWdncmVnYXRlIGJpdF9jb3N0Lgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQW5hbHl6ZUVudHJvcHlCaW4oVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBjb25zdCBiaW5fbWFwLCBpbnQgbG93X2VmZm9ydCkgeworICBpbnQgaTsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBpbWFnZV9oaXN0by0+c2l6ZTsKKyAgY29uc3QgaW50IGJpbl9kZXB0aCA9IGhpc3RvX3NpemUgKyAxOworICBEb21pbmFudENvc3RSYW5nZSBjb3N0X3JhbmdlOworICBEb21pbmFudENvc3RSYW5nZUluaXQoJmNvc3RfcmFuZ2UpOworCisgIC8vIEFuYWx5emUgdGhlIGRvbWluYW50IChsaXRlcmFsLCByZWQgYW5kIGJsdWUpIGVudHJvcHkgY29zdHMuCisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b19zaXplOyArK2kpIHsKKyAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbXNbaV07CisgICAgVXBkYXRlRG9taW5hbnRDb3N0UmFuZ2UoaGlzdG8sICZjb3N0X3JhbmdlKTsKKyAgfQorCisgIC8vIGJpbi1oYXNoIGhpc3RvZ3JhbXMgb24gdGhyZWUgb2YgdGhlIGRvbWluYW50IChsaXRlcmFsLCByZWQgYW5kIGJsdWUpCisgIC8vIHN5bWJvbCBjb3N0cy4KKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3NpemU7ICsraSkgeworICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gaGlzdG9ncmFtc1tpXTsKKyAgICBjb25zdCBpbnQgYmluX2lkID0gR2V0SGlzdG9CaW5JbmRleChoaXN0bywgJmNvc3RfcmFuZ2UsIGxvd19lZmZvcnQpOworICAgIGNvbnN0IGludCBiaW5fb2Zmc2V0ID0gYmluX2lkICogYmluX2RlcHRoOworICAgIC8vIGJpbl9tYXBbbl1bMF0gZm9yIGV2ZXJ5IGJpbiAnbicgbWFpbnRhaW5zIHRoZSBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mCisgICAgLy8gaGlzdG9ncmFtcyBpbiB0aGF0IGJpbi4KKyAgICAvLyBHZXQgYW5kIGluY3JlbWVudCB0aGUgbnVtX2hpc3RvcyBpbiB0aGF0IGJpbi4KKyAgICBjb25zdCBpbnQgbnVtX2hpc3RvcyA9ICsrYmluX21hcFtiaW5fb2Zmc2V0XTsKKyAgICBhc3NlcnQoYmluX29mZnNldCArIG51bV9oaXN0b3MgPCBiaW5fZGVwdGggKiBCSU5fU0laRSk7CisgICAgLy8gQWRkIGhpc3RvZ3JhbSBpJ3RoIGluZGV4IGF0IG51bV9oaXN0b3MgKGxhc3QpIHBvc2l0aW9uIGluIHRoZSBiaW5fbWFwLgorICAgIGJpbl9tYXBbYmluX29mZnNldCArIG51bV9oaXN0b3NdID0gaTsKKyAgfQorfQorCisvLyBDb21wYWN0IHRoZSBoaXN0b2dyYW0gc2V0IGJ5IHJlbW92aW5nIHVudXNlZCBlbnRyaWVzLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQ29tcGFjdEJpbnMoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8pIHsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgaW50IGksIGo7CisKKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpbWFnZV9oaXN0by0+c2l6ZTsgKytpKSB7CisgICAgaWYgKGhpc3RvZ3JhbXNbaV0gIT0gTlVMTCAmJiBoaXN0b2dyYW1zW2ldLT5iaXRfY29zdF8gIT0gMC4pIHsKKyAgICAgIGlmIChqIDwgaSkgeworICAgICAgICBoaXN0b2dyYW1zW2pdID0gaGlzdG9ncmFtc1tpXTsKKyAgICAgICAgaGlzdG9ncmFtc1tpXSA9IE5VTEw7CisgICAgICB9CisgICAgICArK2o7CisgICAgfQorICB9CisgIGltYWdlX2hpc3RvLT5zaXplID0gajsKK30KKworc3RhdGljIFZQOExIaXN0b2dyYW0qIEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKAorICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvLAorICAgIFZQOExIaXN0b2dyYW0qIGN1cl9jb21ibywKKyAgICBpbnQxNl90KiBjb25zdCBiaW5fbWFwLCBpbnQgYmluX2RlcHRoLCBpbnQgbnVtX2JpbnMsCisgICAgZG91YmxlIGNvbWJpbmVfY29zdF9mYWN0b3IsIGludCBsb3dfZWZmb3J0KSB7CisgIGludCBiaW5faWQ7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBoaXN0b2dyYW1zID0gaW1hZ2VfaGlzdG8tPmhpc3RvZ3JhbXM7CisKKyAgZm9yIChiaW5faWQgPSAwOyBiaW5faWQgPCBudW1fYmluczsgKytiaW5faWQpIHsKKyAgICBjb25zdCBpbnQgYmluX29mZnNldCA9IGJpbl9pZCAqIGJpbl9kZXB0aDsKKyAgICBjb25zdCBpbnQgbnVtX2hpc3RvcyA9IGJpbl9tYXBbYmluX29mZnNldF07CisgICAgY29uc3QgaW50IGlkeDEgPSBiaW5fbWFwW2Jpbl9vZmZzZXQgKyAxXTsKKyAgICBpbnQgbnVtX2NvbWJpbmVfZmFpbHVyZXMgPSAwOworICAgIGludCBuOworICAgIGZvciAobiA9IDI7IG4gPD0gbnVtX2hpc3RvczsgKytuKSB7CisgICAgICBjb25zdCBpbnQgaWR4MiA9IGJpbl9tYXBbYmluX29mZnNldCArIG5dOworICAgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgICAgLy8gTWVyZ2UgYWxsIGhpc3RvZ3JhbXMgd2l0aCB0aGUgc2FtZSBiaW4gaW5kZXgsIGlycmVzcGVjdGl2ZSBvZiBjb3N0IG9mCisgICAgICAgIC8vIHRoZSBtZXJnZWQgaGlzdG9ncmFtcy4KKyAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZChoaXN0b2dyYW1zW2lkeDFdLCBoaXN0b2dyYW1zW2lkeDJdLCBoaXN0b2dyYW1zW2lkeDFdKTsKKyAgICAgICAgaGlzdG9ncmFtc1tpZHgyXS0+Yml0X2Nvc3RfID0gMC47CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBkb3VibGUgYml0X2Nvc3RfaWR4MiA9IGhpc3RvZ3JhbXNbaWR4Ml0tPmJpdF9jb3N0XzsKKyAgICAgICAgaWYgKGJpdF9jb3N0X2lkeDIgPiAwLikgeworICAgICAgICAgIGNvbnN0IGRvdWJsZSBiaXRfY29zdF90aHJlc2ggPSAtYml0X2Nvc3RfaWR4MiAqIGNvbWJpbmVfY29zdF9mYWN0b3I7CisgICAgICAgICAgY29uc3QgZG91YmxlIGN1cnJfY29zdF9kaWZmID0KKyAgICAgICAgICAgICAgSGlzdG9ncmFtQWRkRXZhbChoaXN0b2dyYW1zW2lkeDFdLCBoaXN0b2dyYW1zW2lkeDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb21ibywgYml0X2Nvc3RfdGhyZXNoKTsKKyAgICAgICAgICBpZiAoY3Vycl9jb3N0X2RpZmYgPCBiaXRfY29zdF90aHJlc2gpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBtZXJnZSB0d28gaGlzdG9ncmFtcyBvbmx5IGlmIHRoZSBjb21ibyBpcyBhIHRyaXZpYWwgb25lIG9yCisgICAgICAgICAgICAvLyB0aGUgdHdvIGNhbmRpZGF0ZSBoaXN0b2dyYW1zIGFyZSBhbHJlYWR5IG5vbi10cml2aWFsLgorICAgICAgICAgICAgLy8gRm9yIHNvbWUgaW1hZ2VzLCAndHJ5X2NvbWJpbmUnIHR1cm5zIG91dCB0byBiZSBmYWxzZSBmb3IgYSBsb3Qgb2YKKyAgICAgICAgICAgIC8vIGhpc3RvZ3JhbSBwYWlycy4gSW4gdGhhdCBjYXNlLCB3ZSBmYWxsYmFjayB0byBjb21iaW5pbmcKKyAgICAgICAgICAgIC8vIGhpc3RvZ3JhbXMgYXMgdXN1YWwgdG8gYXZvaWQgaW5jcmVhc2luZyB0aGUgaGVhZGVyIHNpemUuCisgICAgICAgICAgICBjb25zdCBpbnQgdHJ5X2NvbWJpbmUgPQorICAgICAgICAgICAgICAgIChjdXJfY29tYm8tPnRyaXZpYWxfc3ltYm9sXyAhPSBWUDhMX05PTl9UUklWSUFMX1NZTSkgfHwKKyAgICAgICAgICAgICAgICAoKGhpc3RvZ3JhbXNbaWR4MV0tPnRyaXZpYWxfc3ltYm9sXyA9PSBWUDhMX05PTl9UUklWSUFMX1NZTSkgJiYKKyAgICAgICAgICAgICAgICAgKGhpc3RvZ3JhbXNbaWR4Ml0tPnRyaXZpYWxfc3ltYm9sXyA9PSBWUDhMX05PTl9UUklWSUFMX1NZTSkpOworICAgICAgICAgICAgY29uc3QgaW50IG1heF9jb21iaW5lX2ZhaWx1cmVzID0gMzI7CisgICAgICAgICAgICBpZiAodHJ5X2NvbWJpbmUgfHwgKG51bV9jb21iaW5lX2ZhaWx1cmVzID49IG1heF9jb21iaW5lX2ZhaWx1cmVzKSkgeworICAgICAgICAgICAgICBIaXN0b2dyYW1Td2FwKCZjdXJfY29tYm8sICZoaXN0b2dyYW1zW2lkeDFdKTsKKyAgICAgICAgICAgICAgaGlzdG9ncmFtc1tpZHgyXS0+Yml0X2Nvc3RfID0gMC47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICArK251bV9jb21iaW5lX2ZhaWx1cmVzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobG93X2VmZm9ydCkgeworICAgICAgLy8gVXBkYXRlIHRoZSBiaXRfY29zdCBmb3IgdGhlIG1lcmdlZCBoaXN0b2dyYW1zIChwZXIgYmluIGluZGV4KS4KKyAgICAgIFVwZGF0ZUhpc3RvZ3JhbUNvc3QoaGlzdG9ncmFtc1tpZHgxXSk7CisgICAgfQorICB9CisgIEhpc3RvZ3JhbUNvbXBhY3RCaW5zKGltYWdlX2hpc3RvKTsKKyAgcmV0dXJuIGN1cl9jb21ibzsKK30KKworc3RhdGljIHVpbnQzMl90IE15UmFuZCh1aW50MzJfdCAqc2VlZCkgeworICAqc2VlZCAqPSAxNjgwN1U7CisgIGlmICgqc2VlZCA9PSAwKSB7CisgICAgKnNlZWQgPSAxOworICB9CisgIHJldHVybiAqc2VlZDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpc3RvZ3JhbSBwYWlycyBwcmlvcml0eSBxdWV1ZQorCisvLyBQYWlyIG9mIGhpc3RvZ3JhbXMuIE5lZ2F0aXZlIGlkeDEgdmFsdWUgbWVhbnMgdGhhdCBwYWlyIGlzIG91dC1vZi1kYXRlLgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaWR4MTsKKyAgaW50IGlkeDI7CisgIGRvdWJsZSBjb3N0X2RpZmY7CisgIGRvdWJsZSBjb3N0X2NvbWJvOworfSBIaXN0b2dyYW1QYWlyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEhpc3RvZ3JhbVBhaXIqIHF1ZXVlOworICBpbnQgc2l6ZTsKKyAgaW50IG1heF9zaXplOworfSBIaXN0b1F1ZXVlOworCitzdGF0aWMgaW50IEhpc3RvUXVldWVJbml0KEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLCBjb25zdCBpbnQgbWF4X2luZGV4KSB7CisgIGhpc3RvX3F1ZXVlLT5zaXplID0gMDsKKyAgLy8gbWF4X2luZGV4XjIgZm9yIHRoZSBxdWV1ZSBzaXplIGlzIHNhZmUuIElmIHlvdSBsb29rIGF0CisgIC8vIEhpc3RvZ3JhbUNvbWJpbmVHcmVlZHksIGFuZCBpbWFnaW5lIHRoYXQgVXBkYXRlUXVldWVGcm9udCBhbHdheXMgcHVzaGVzCisgIC8vIGRhdGEgdG8gdGhlIHF1ZXVlLCB5b3UgaW5zZXJ0IGF0IG1vc3Q6CisgIC8vIC0gbWF4X2luZGV4KihtYXhfaW5kZXgtMSkvMiAodGhlIGZpcnN0IHR3byBmb3IgbG9vcHMpCisgIC8vIC0gbWF4X2luZGV4IC0gMSBpbiB0aGUgbGFzdCBmb3IgbG9vcCBhdCB0aGUgZmlyc3QgaXRlcmF0aW9uIG9mIHRoZSB3aGlsZQorICAvLyAgIGxvb3AsIG1heF9pbmRleCAtIDIgYXQgdGhlIHNlY29uZCBpdGVyYXRpb24gLi4uIHRoZXJlZm9yZQorICAvLyAgIG1heF9pbmRleCoobWF4X2luZGV4LTEpLzIgb3ZlcmFsbCB0b28KKyAgaGlzdG9fcXVldWUtPm1heF9zaXplID0gbWF4X2luZGV4ICogbWF4X2luZGV4OworICAvLyBXZSBhbGxvY2F0ZSBtYXhfc2l6ZSArIDEgYmVjYXVzZSB0aGUgbGFzdCBlbGVtZW50IGF0IGluZGV4ICJzaXplIiBpcworICAvLyB1c2VkIGFzIHRlbXBvcmFyeSBkYXRhIChhbmQgaXQgY291bGQgYmUgdXAgdG8gbWF4X3NpemUpLgorICBoaXN0b19xdWV1ZS0+cXVldWUgPSBXZWJQU2FmZU1hbGxvYyhoaXN0b19xdWV1ZS0+bWF4X3NpemUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhpc3RvX3F1ZXVlLT5xdWV1ZSkpOworICByZXR1cm4gaGlzdG9fcXVldWUtPnF1ZXVlICE9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIEhpc3RvUXVldWVDbGVhcihIaXN0b1F1ZXVlKiBjb25zdCBoaXN0b19xdWV1ZSkgeworICBhc3NlcnQoaGlzdG9fcXVldWUgIT0gTlVMTCk7CisgIFdlYlBTYWZlRnJlZShoaXN0b19xdWV1ZS0+cXVldWUpOworfQorCitzdGF0aWMgdm9pZCBTd2FwSGlzdG9ncmFtUGFpcnMoSGlzdG9ncmFtUGFpciAqcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciAqcDIpIHsKKyAgY29uc3QgSGlzdG9ncmFtUGFpciB0bXAgPSAqcDE7CisgICpwMSA9ICpwMjsKKyAgKnAyID0gdG1wOworfQorCisvLyBHaXZlbiBhIHZhbGlkIHByaW9yaXR5IHF1ZXVlIGluIHJhbmdlIFswLCBxdWV1ZV9zaXplKSB0aGlzIGZ1bmN0aW9uIGNoZWNrcworLy8gd2hldGhlciBoaXN0b19xdWV1ZVtxdWV1ZV9zaXplXSBzaG91bGQgYmUgYWNjZXB0ZWQgYW5kIHN3YXBzIGl0IHdpdGggdGhlCisvLyBmcm9udCBpZiBpdCBpcyBzbWFsbGVyLiBPdGhlcndpc2UsIGl0IGxlYXZlcyBpdCBhcyBpcy4KK3N0YXRpYyB2b2lkIFVwZGF0ZVF1ZXVlRnJvbnQoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUpIHsKKyAgaWYgKGhpc3RvX3F1ZXVlLT5xdWV1ZVtoaXN0b19xdWV1ZS0+c2l6ZV0uY29zdF9kaWZmID49IDApIHJldHVybjsKKworICBpZiAoaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplXS5jb3N0X2RpZmYgPAorICAgICAgaGlzdG9fcXVldWUtPnF1ZXVlWzBdLmNvc3RfZGlmZikgeworICAgIFN3YXBIaXN0b2dyYW1QYWlycyhoaXN0b19xdWV1ZS0+cXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvX3F1ZXVlLT5xdWV1ZSArIGhpc3RvX3F1ZXVlLT5zaXplKTsKKyAgfQorICArK2hpc3RvX3F1ZXVlLT5zaXplOworCisgIC8vIFdlIGNhbm5vdCBhZGQgbW9yZSBlbGVtZW50cyB0aGFuIHRoZSBjYXBhY2l0eS4KKyAgLy8gVGhlIGFsbG9jYXRpb24gYWRkcyBhbiBleHRyYSBlbGVtZW50IHRvIHRoZSBvZmZpY2lhbCBjYXBhY2l0eSBzbyB0aGF0CisgIC8vIGhpc3RvX3F1ZXVlLT5xdWV1ZVtoaXN0b19xdWV1ZS0+bWF4X3NpemVdIGlzIHJlYWQvd3JpdHRlbiB3aXRoaW4gYm91bmQuCisgIGFzc2VydChoaXN0b19xdWV1ZS0+c2l6ZSA8PSBoaXN0b19xdWV1ZS0+bWF4X3NpemUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBQcmVwYXJlUGFpcihWUDhMSGlzdG9ncmFtKiogaGlzdG9ncmFtcywgaW50IGlkeDEsIGludCBpZHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcGFpcikgeworICBWUDhMSGlzdG9ncmFtKiBoMTsKKyAgVlA4TEhpc3RvZ3JhbSogaDI7CisgIGRvdWJsZSBzdW1fY29zdDsKKworICBpZiAoaWR4MSA+IGlkeDIpIHsKKyAgICBjb25zdCBpbnQgdG1wID0gaWR4MjsKKyAgICBpZHgyID0gaWR4MTsKKyAgICBpZHgxID0gdG1wOworICB9CisgIHBhaXItPmlkeDEgPSBpZHgxOworICBwYWlyLT5pZHgyID0gaWR4MjsKKyAgaDEgPSBoaXN0b2dyYW1zW2lkeDFdOworICBoMiA9IGhpc3RvZ3JhbXNbaWR4Ml07CisgIHN1bV9jb3N0ID0gaDEtPmJpdF9jb3N0XyArIGgyLT5iaXRfY29zdF87CisgIHBhaXItPmNvc3RfY29tYm8gPSAwLjsKKyAgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGgxLCBoMiwgc3VtX2Nvc3QsICZwYWlyLT5jb3N0X2NvbWJvKTsKKyAgcGFpci0+Y29zdF9kaWZmID0gcGFpci0+Y29zdF9jb21ibyAtIHN1bV9jb3N0OworfQorCisvLyBDb21iaW5lcyBoaXN0b2dyYW1zIGJ5IGNvbnRpbnVvdXNseSBjaG9vc2luZyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgY29zdAorLy8gcmVkdWN0aW9uLgorc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lR3JlZWR5KFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvKSB7CisgIGludCBvayA9IDA7CisgIGludCBpbWFnZV9oaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIGludCBpLCBqOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworICAvLyBJbmRleGVzIG9mIHJlbWFpbmluZyBoaXN0b2dyYW1zLgorICBpbnQqIGNvbnN0IGNsdXN0ZXJzID0gV2ViUFNhZmVNYWxsb2MoaW1hZ2VfaGlzdG9fc2l6ZSwgc2l6ZW9mKCpjbHVzdGVycykpOworICAvLyBQcmlvcml0eSBxdWV1ZSBvZiBoaXN0b2dyYW0gcGFpcnMuCisgIEhpc3RvUXVldWUgaGlzdG9fcXVldWU7CisKKyAgaWYgKCFIaXN0b1F1ZXVlSW5pdCgmaGlzdG9fcXVldWUsIGltYWdlX2hpc3RvX3NpemUpIHx8IGNsdXN0ZXJzID09IE5VTEwpIHsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV9oaXN0b19zaXplOyArK2kpIHsKKyAgICAvLyBJbml0aWFsaXplIGNsdXN0ZXJzIGluZGV4ZXMuCisgICAgY2x1c3RlcnNbaV0gPSBpOworICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytqKSB7CisgICAgICAvLyBJbml0aWFsaXplIHBvc2l0aW9ucyBhcnJheS4KKyAgICAgIFByZXBhcmVQYWlyKGhpc3RvZ3JhbXMsIGksIGosICZoaXN0b19xdWV1ZS5xdWV1ZVtoaXN0b19xdWV1ZS5zaXplXSk7CisgICAgICBVcGRhdGVRdWV1ZUZyb250KCZoaXN0b19xdWV1ZSk7CisgICAgfQorICB9CisKKyAgd2hpbGUgKGltYWdlX2hpc3RvX3NpemUgPiAxICYmIGhpc3RvX3F1ZXVlLnNpemUgPiAwKSB7CisgICAgSGlzdG9ncmFtUGFpciogY29weV90bzsKKyAgICBjb25zdCBpbnQgaWR4MSA9IGhpc3RvX3F1ZXVlLnF1ZXVlWzBdLmlkeDE7CisgICAgY29uc3QgaW50IGlkeDIgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgyOworICAgIFZQOExIaXN0b2dyYW1BZGQoaGlzdG9ncmFtc1tpZHgyXSwgaGlzdG9ncmFtc1tpZHgxXSwgaGlzdG9ncmFtc1tpZHgxXSk7CisgICAgaGlzdG9ncmFtc1tpZHgxXS0+Yml0X2Nvc3RfID0gaGlzdG9fcXVldWUucXVldWVbMF0uY29zdF9jb21ibzsKKyAgICAvLyBSZW1vdmUgbWVyZ2VkIGhpc3RvZ3JhbS4KKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGltYWdlX2hpc3RvX3NpemU7ICsraSkgeworICAgICAgaWYgKGNsdXN0ZXJzW2ldID49IGlkeDIpIHsKKyAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tpICsgMV07CisgICAgICB9CisgICAgfQorICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKworICAgIC8vIFJlbW92ZSBwYWlycyBpbnRlcnNlY3RpbmcgdGhlIGp1c3QgY29tYmluZWQgYmVzdCBwYWlyLiBUaGlzIHdpbGwKKyAgICAvLyB0aGVyZWZvcmUgcG9wIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KKyAgICBjb3B5X3RvID0gaGlzdG9fcXVldWUucXVldWU7CisgICAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3F1ZXVlLnNpemU7ICsraSkgeworICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcCA9IGhpc3RvX3F1ZXVlLnF1ZXVlICsgaTsKKyAgICAgIGlmIChwLT5pZHgxID09IGlkeDEgfHwgcC0+aWR4MiA9PSBpZHgxIHx8CisgICAgICAgICAgcC0+aWR4MSA9PSBpZHgyIHx8IHAtPmlkeDIgPT0gaWR4MikgeworICAgICAgICAvLyBEbyBub3QgY29weSB0aGUgaW52YWxpZCBwYWlyLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwLT5jb3N0X2RpZmYgPCBoaXN0b19xdWV1ZS5xdWV1ZVswXS5jb3N0X2RpZmYpIHsKKyAgICAgICAgLy8gUmVwbGFjZSB0aGUgdG9wIG9mIHRoZSBxdWV1ZSBpZiB3ZSBmb3VuZCBiZXR0ZXIuCisgICAgICAgIFN3YXBIaXN0b2dyYW1QYWlycyhoaXN0b19xdWV1ZS5xdWV1ZSwgcCk7CisgICAgICB9CisgICAgICBTd2FwSGlzdG9ncmFtUGFpcnMoY29weV90bywgcCk7CisgICAgICArK2NvcHlfdG87CisgICAgfQorICAgIGhpc3RvX3F1ZXVlLnNpemUgPSAoaW50KShjb3B5X3RvIC0gaGlzdG9fcXVldWUucXVldWUpOworCisgICAgLy8gUHVzaCBuZXcgcGFpcnMgZm9ybWVkIHdpdGggY29tYmluZWQgaGlzdG9ncmFtIHRvIHRoZSBxdWV1ZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgICBpZiAoY2x1c3RlcnNbaV0gIT0gaWR4MSkgeworICAgICAgICBQcmVwYXJlUGFpcihoaXN0b2dyYW1zLCBpZHgxLCBjbHVzdGVyc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgJmhpc3RvX3F1ZXVlLnF1ZXVlW2hpc3RvX3F1ZXVlLnNpemVdKTsKKyAgICAgICAgVXBkYXRlUXVldWVGcm9udCgmaGlzdG9fcXVldWUpOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBNb3ZlIHJlbWFpbmluZyBoaXN0b2dyYW1zIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LgorICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgaWYgKGkgIT0gY2x1c3RlcnNbaV0pIHsgIC8vIHN3YXAgdGhlIHR3byBoaXN0b2dyYW1zCisgICAgICBIaXN0b2dyYW1Td2FwKCZoaXN0b2dyYW1zW2ldLCAmaGlzdG9ncmFtc1tjbHVzdGVyc1tpXV0pOworICAgIH0KKyAgfQorCisgIGltYWdlX2hpc3RvLT5zaXplID0gaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgb2sgPSAxOworCisgRW5kOgorICBXZWJQU2FmZUZyZWUoY2x1c3RlcnMpOworICBIaXN0b1F1ZXVlQ2xlYXIoJmhpc3RvX3F1ZXVlKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYyhWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIHRtcF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGJlc3RfY29tYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IG1pbl9jbHVzdGVyX3NpemUpIHsKKyAgaW50IGl0ZXI7CisgIHVpbnQzMl90IHNlZWQgPSAwOworICBpbnQgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKKyAgaW50IGltYWdlX2hpc3RvX3NpemUgPSBpbWFnZV9oaXN0by0+c2l6ZTsKKyAgY29uc3QgaW50IGl0ZXJfbXVsdCA9IChxdWFsaXR5IDwgMjUpID8gMiA6IDIgKyAocXVhbGl0eSAtIDI1KSAvIDg7CisgIGNvbnN0IGludCBvdXRlcl9pdGVycyA9IGltYWdlX2hpc3RvX3NpemUgKiBpdGVyX211bHQ7CisgIGNvbnN0IGludCBudW1fcGFpcnMgPSBpbWFnZV9oaXN0b19zaXplIC8gMjsKKyAgY29uc3QgaW50IG51bV90cmllc19ub19zdWNjZXNzID0gb3V0ZXJfaXRlcnMgLyAyOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworCisgIC8vIENvbGxhcHNlIHNpbWlsYXIgaGlzdG9ncmFtcyBpbiAnaW1hZ2VfaGlzdG8nLgorICArK21pbl9jbHVzdGVyX3NpemU7CisgIGZvciAoaXRlciA9IDA7CisgICAgICAgaXRlciA8IG91dGVyX2l0ZXJzICYmIGltYWdlX2hpc3RvX3NpemUgPj0gbWluX2NsdXN0ZXJfc2l6ZTsKKyAgICAgICArK2l0ZXIpIHsKKyAgICBkb3VibGUgYmVzdF9jb3N0X2RpZmYgPSAwLjsKKyAgICBpbnQgYmVzdF9pZHgxID0gLTEsIGJlc3RfaWR4MiA9IDE7CisgICAgaW50IGo7CisgICAgY29uc3QgaW50IG51bV90cmllcyA9CisgICAgICAgIChudW1fcGFpcnMgPCBpbWFnZV9oaXN0b19zaXplKSA/IG51bV9wYWlycyA6IGltYWdlX2hpc3RvX3NpemU7CisgICAgc2VlZCArPSBpdGVyOworICAgIGZvciAoaiA9IDA7IGogPCBudW1fdHJpZXM7ICsraikgeworICAgICAgZG91YmxlIGN1cnJfY29zdF9kaWZmOworICAgICAgLy8gQ2hvb3NlIHR3byBoaXN0b2dyYW1zIGF0IHJhbmRvbSBhbmQgdHJ5IHRvIGNvbWJpbmUgdGhlbS4KKyAgICAgIGNvbnN0IHVpbnQzMl90IGlkeDEgPSBNeVJhbmQoJnNlZWQpICUgaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHRtcCA9IChqICYgNykgKyAxOworICAgICAgY29uc3QgdWludDMyX3QgZGlmZiA9CisgICAgICAgICAgKHRtcCA8IDMpID8gdG1wIDogTXlSYW5kKCZzZWVkKSAlIChpbWFnZV9oaXN0b19zaXplIC0gMSk7CisgICAgICBjb25zdCB1aW50MzJfdCBpZHgyID0gKGlkeDEgKyBkaWZmICsgMSkgJSBpbWFnZV9oaXN0b19zaXplOworICAgICAgaWYgKGlkeDEgPT0gaWR4MikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gQ2FsY3VsYXRlIGNvc3QgcmVkdWN0aW9uIG9uIGNvbWJpbmluZy4KKyAgICAgIGN1cnJfY29zdF9kaWZmID0gSGlzdG9ncmFtQWRkRXZhbChoaXN0b2dyYW1zW2lkeDFdLCBoaXN0b2dyYW1zW2lkeDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9oaXN0bywgYmVzdF9jb3N0X2RpZmYpOworICAgICAgaWYgKGN1cnJfY29zdF9kaWZmIDwgYmVzdF9jb3N0X2RpZmYpIHsgICAgLy8gZm91bmQgYSBiZXR0ZXIgcGFpcj8KKyAgICAgICAgSGlzdG9ncmFtU3dhcCgmYmVzdF9jb21ibywgJnRtcF9oaXN0byk7CisgICAgICAgIGJlc3RfY29zdF9kaWZmID0gY3Vycl9jb3N0X2RpZmY7CisgICAgICAgIGJlc3RfaWR4MSA9IGlkeDE7CisgICAgICAgIGJlc3RfaWR4MiA9IGlkeDI7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGJlc3RfaWR4MSA+PSAwKSB7CisgICAgICBIaXN0b2dyYW1Td2FwKCZiZXN0X2NvbWJvLCAmaGlzdG9ncmFtc1tiZXN0X2lkeDFdKTsKKyAgICAgIC8vIHN3YXAgYmVzdF9pZHgyIHNsb3Qgd2l0aCBsYXN0IG9uZSAod2hpY2ggaXMgbm93IHVudXNlZCkKKyAgICAgIC0taW1hZ2VfaGlzdG9fc2l6ZTsKKyAgICAgIGlmIChiZXN0X2lkeDIgIT0gaW1hZ2VfaGlzdG9fc2l6ZSkgeworICAgICAgICBIaXN0b2dyYW1Td2FwKCZoaXN0b2dyYW1zW2ltYWdlX2hpc3RvX3NpemVdLCAmaGlzdG9ncmFtc1tiZXN0X2lkeDJdKTsKKyAgICAgICAgaGlzdG9ncmFtc1tpbWFnZV9oaXN0b19zaXplXSA9IE5VTEw7CisgICAgICB9CisgICAgICB0cmllc193aXRoX25vX3N1Y2Nlc3MgPSAwOworICAgIH0KKyAgICBpZiAoKyt0cmllc193aXRoX25vX3N1Y2Nlc3MgPj0gbnVtX3RyaWVzX25vX3N1Y2Nlc3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpbWFnZV9oaXN0by0+c2l6ZSA9IGltYWdlX2hpc3RvX3NpemU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaXN0b2dyYW0gcmVmaW5lbWVudAorCisvLyBGaW5kIHRoZSBiZXN0ICdvdXQnIGhpc3RvZ3JhbSBmb3IgZWFjaCBvZiB0aGUgJ2luJyBoaXN0b2dyYW1zLgorLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb3V0W10tPmJpdF9jb3N0XyBpcyBhbHJlYWR5IHVwLXRvLWRhdGUuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1SZW1hcChjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBzeW1ib2xzKSB7CisgIGludCBpOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaW5faGlzdG8gPSBpbi0+aGlzdG9ncmFtczsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IG91dF9oaXN0byA9IG91dC0+aGlzdG9ncmFtczsKKyAgY29uc3QgaW50IGluX3NpemUgPSBpbi0+c2l6ZTsKKyAgY29uc3QgaW50IG91dF9zaXplID0gb3V0LT5zaXplOworICBpZiAob3V0X3NpemUgPiAxKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGluX3NpemU7ICsraSkgeworICAgICAgaW50IGJlc3Rfb3V0ID0gMDsKKyAgICAgIGRvdWJsZSBiZXN0X2JpdHMgPSBNQVhfQ09TVDsKKyAgICAgIGludCBrOworICAgICAgZm9yIChrID0gMDsgayA8IG91dF9zaXplOyArK2spIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGN1cl9iaXRzID0KKyAgICAgICAgICAgIEhpc3RvZ3JhbUFkZFRocmVzaChvdXRfaGlzdG9ba10sIGluX2hpc3RvW2ldLCBiZXN0X2JpdHMpOworICAgICAgICBpZiAoayA9PSAwIHx8IGN1cl9iaXRzIDwgYmVzdF9iaXRzKSB7CisgICAgICAgICAgYmVzdF9iaXRzID0gY3VyX2JpdHM7CisgICAgICAgICAgYmVzdF9vdXQgPSBrOworICAgICAgICB9CisgICAgICB9CisgICAgICBzeW1ib2xzW2ldID0gYmVzdF9vdXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGFzc2VydChvdXRfc2l6ZSA9PSAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgKytpKSB7CisgICAgICBzeW1ib2xzW2ldID0gMDsKKyAgICB9CisgIH0KKworICAvLyBSZWNvbXB1dGUgZWFjaCBvdXQgYmFzZWQgb24gcmF3IGFuZCBzeW1ib2xzLgorICBmb3IgKGkgPSAwOyBpIDwgb3V0X3NpemU7ICsraSkgeworICAgIEhpc3RvZ3JhbUNsZWFyKG91dF9oaXN0b1tpXSk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaW5fc2l6ZTsgKytpKSB7CisgICAgY29uc3QgaW50IGlkeCA9IHN5bWJvbHNbaV07CisgICAgVlA4TEhpc3RvZ3JhbUFkZChpbl9oaXN0b1tpXSwgb3V0X2hpc3RvW2lkeF0sIG91dF9oaXN0b1tpZHhdKTsKKyAgfQorfQorCitzdGF0aWMgZG91YmxlIEdldENvbWJpbmVDb3N0RmFjdG9yKGludCBoaXN0b19zaXplLCBpbnQgcXVhbGl0eSkgeworICBkb3VibGUgY29tYmluZV9jb3N0X2ZhY3RvciA9IDAuMTY7CisgIGlmIChxdWFsaXR5IDwgOTApIHsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDI1NikgY29tYmluZV9jb3N0X2ZhY3RvciAvPSAyLjsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDUxMikgY29tYmluZV9jb3N0X2ZhY3RvciAvPSAyLjsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDEwMjQpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKHF1YWxpdHkgPD0gNTApIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgIH0KKyAgcmV0dXJuIGNvbWJpbmVfY29zdF9mYWN0b3I7Cit9CisKK2ludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvX2JpdHMsIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgdG1wX2hpc3RvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaGlzdG9fYml0cykgOiAxOworICBjb25zdCBpbnQgaGlzdG9feXNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGhpc3RvX2JpdHMpIDogMTsKKyAgY29uc3QgaW50IGltYWdlX2hpc3RvX3Jhd19zaXplID0gaGlzdG9feHNpemUgKiBoaXN0b195c2l6ZTsKKyAgY29uc3QgaW50IGVudHJvcHlfY29tYmluZV9udW1fYmlucyA9IGxvd19lZmZvcnQgPyBOVU1fUEFSVElUSU9OUyA6IEJJTl9TSVpFOworCisgIC8vIFRoZSBiaW5fbWFwIGZvciBldmVyeSBiaW4gZm9sbG93cyBmb2xsb3dpbmcgc2VtYW50aWNzOgorICAvLyBiaW5fbWFwW25dWzBdID0gbnVtX2hpc3RvOyAvLyBUaGUgbnVtYmVyIG9mIGhpc3RvZ3JhbXMgaW4gdGhhdCBiaW4uCisgIC8vIGJpbl9tYXBbbl1bMV0gPSBpbmRleCBvZiBmaXJzdCBoaXN0b2dyYW0gaW4gdGhhdCBiaW47CisgIC8vIGJpbl9tYXBbbl1bbnVtX2hpc3RvXSA9IGluZGV4IG9mIGxhc3QgaGlzdG9ncmFtIGluIHRoYXQgYmluOworICAvLyBiaW5fbWFwW25dW251bV9oaXN0byArIDFdIC4uLiBiaW5fbWFwW25dW2Jpbl9kZXB0aCAtIDFdID0gdW51c2VkIGluZGljZXMuCisgIGNvbnN0IGludCBiaW5fZGVwdGggPSBpbWFnZV9oaXN0b19yYXdfc2l6ZSArIDE7CisgIGludDE2X3QqIGJpbl9tYXAgPSBOVUxMOworICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBvcmlnX2hpc3RvID0KKyAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbWFnZV9oaXN0b19yYXdfc2l6ZSwgY2FjaGVfYml0cyk7CisgIFZQOExIaXN0b2dyYW0qIGN1cl9jb21ibzsKKyAgY29uc3QgaW50IGVudHJvcHlfY29tYmluZSA9CisgICAgICAob3JpZ19oaXN0by0+c2l6ZSA+IGVudHJvcHlfY29tYmluZV9udW1fYmlucyAqIDIpICYmIChxdWFsaXR5IDwgMTAwKTsKKworICBpZiAob3JpZ19oaXN0byA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIC8vIERvbid0IGF0dGVtcHQgbGluZWFyIGJpbi1wYXJ0aXRpb24gaGV1cmlzdGljIGZvcjoKKyAgLy8gaGlzdG9ncmFtcyBvZiBzbWFsbCBzaXplcywgYXMgYmluX21hcCB3aWxsIGJlIHZlcnkgc3BhcnNlIGFuZDsKKyAgLy8gTWF4aW11bSBxdWFsaXR5IChxPT0xMDApLCB0byBwcmVzZXJ2ZSB0aGUgY29tcHJlc3Npb24gZ2FpbnMgYXQgdGhhdCBsZXZlbC4KKyAgaWYgKGVudHJvcHlfY29tYmluZSkgeworICAgIGNvbnN0IGludCBiaW5fbWFwX3NpemUgPSBiaW5fZGVwdGggKiBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnM7CisgICAgYmluX21hcCA9IChpbnQxNl90KilXZWJQU2FmZUNhbGxvYyhiaW5fbWFwX3NpemUsIHNpemVvZigqYmluX21hcCkpOworICAgIGlmIChiaW5fbWFwID09IE5VTEwpIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBDb25zdHJ1Y3QgdGhlIGhpc3RvZ3JhbXMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorICBIaXN0b2dyYW1CdWlsZCh4c2l6ZSwgaGlzdG9fYml0cywgcmVmcywgb3JpZ19oaXN0byk7CisgIC8vIENvcGllcyB0aGUgaGlzdG9ncmFtcyBhbmQgY29tcHV0ZXMgaXRzIGJpdF9jb3N0LgorICBIaXN0b2dyYW1Db3B5QW5kQW5hbHl6ZShvcmlnX2hpc3RvLCBpbWFnZV9oaXN0byk7CisKKyAgY3VyX2NvbWJvID0gdG1wX2hpc3Rvcy0+aGlzdG9ncmFtc1sxXTsgIC8vIHBpY2sgdXAgd29ya2luZyBzbG90CisgIGlmIChlbnRyb3B5X2NvbWJpbmUpIHsKKyAgICBjb25zdCBkb3VibGUgY29tYmluZV9jb3N0X2ZhY3RvciA9CisgICAgICAgIEdldENvbWJpbmVDb3N0RmFjdG9yKGltYWdlX2hpc3RvX3Jhd19zaXplLCBxdWFsaXR5KTsKKyAgICBIaXN0b2dyYW1BbmFseXplRW50cm9weUJpbihvcmlnX2hpc3RvLCBiaW5fbWFwLCBsb3dfZWZmb3J0KTsKKyAgICAvLyBDb2xsYXBzZSBoaXN0b2dyYW1zIHdpdGggc2ltaWxhciBlbnRyb3B5LgorICAgIGN1cl9jb21ibyA9IEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKGltYWdlX2hpc3RvLCBjdXJfY29tYm8sIGJpbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluX2RlcHRoLCBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZV9jb3N0X2ZhY3RvciwgbG93X2VmZm9ydCk7CisgIH0KKworICAvLyBEb24ndCBjb21iaW5lIHRoZSBoaXN0b2dyYW1zIHVzaW5nIHN0b2NoYXN0aWMgYW5kIGdyZWVkeSBoZXVyaXN0aWNzIGZvcgorICAvLyBsb3ctZWZmb3J0IGNvbXByZXNzaW9uIG1vZGUuCisgIGlmICghbG93X2VmZm9ydCB8fCAhZW50cm9weV9jb21iaW5lKSB7CisgICAgY29uc3QgZmxvYXQgeCA9IHF1YWxpdHkgLyAxMDAuZjsKKyAgICAvLyBjdWJpYyByYW1wIGJldHdlZW4gMSBhbmQgTUFYX0hJU1RPX0dSRUVEWToKKyAgICBjb25zdCBpbnQgdGhyZXNob2xkX3NpemUgPSAoaW50KSgxICsgKHggKiB4ICogeCkgKiAoTUFYX0hJU1RPX0dSRUVEWSAtIDEpKTsKKyAgICBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYyhpbWFnZV9oaXN0bywgdG1wX2hpc3Rvcy0+aGlzdG9ncmFtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfY29tYm8sIHF1YWxpdHksIHRocmVzaG9sZF9zaXplKTsKKyAgICBpZiAoKGltYWdlX2hpc3RvLT5zaXplIDw9IHRocmVzaG9sZF9zaXplKSAmJgorICAgICAgICAhSGlzdG9ncmFtQ29tYmluZUdyZWVkeShpbWFnZV9oaXN0bykpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgLy8gVE9ETyh2aWthc2EpOiBPcHRpbWl6ZSBIaXN0b2dyYW1SZW1hcCBmb3IgbG93LWVmZm9ydCBjb21wcmVzc2lvbiBtb2RlIGFsc28uCisgIC8vIEZpbmQgdGhlIG9wdGltYWwgbWFwIGZyb20gb3JpZ2luYWwgaGlzdG9ncmFtcyB0byB0aGUgZmluYWwgb25lcy4KKyAgSGlzdG9ncmFtUmVtYXAob3JpZ19oaXN0bywgaW1hZ2VfaGlzdG8sIGhpc3RvZ3JhbV9zeW1ib2xzKTsKKworICBvayA9IDE7CisKKyBFcnJvcjoKKyAgV2ViUFNhZmVGcmVlKGJpbl9tYXApOworICBWUDhMRnJlZUhpc3RvZ3JhbVNldChvcmlnX2hpc3RvKTsKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2hpc3RvZ3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzM2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworLy8gTW9kZWxzIHRoZSBoaXN0b2dyYW1zIG9mIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGVzLgorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRU5DX0hJU1RPR1JBTV9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX0VOQ19ISVNUT0dSQU1fSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTm90IGEgdHJpdmlhbCBsaXRlcmFsIHN5bWJvbC4KKyNkZWZpbmUgVlA4TF9OT05fVFJJVklBTF9TWU0gKDB4ZmZmZmZmZmYpCisKKy8vIEEgc2ltcGxlIGNvbnRhaW5lciBmb3IgaGlzdG9ncmFtcyBvZiBkYXRhLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBsaXRlcmFsXyBjb250YWlucyBncmVlbiBsaXRlcmFsLCBwYWxldHRlLWNvZGUgYW5kCisgIC8vIGNvcHktbGVuZ3RoLXByZWZpeCBoaXN0b2dyYW0KKyAgdWludDMyX3QqIGxpdGVyYWxfOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgZm9yIGxpdGVyYWwuCisgIHVpbnQzMl90IHJlZF9bTlVNX0xJVEVSQUxfQ09ERVNdOworICB1aW50MzJfdCBibHVlX1tOVU1fTElURVJBTF9DT0RFU107CisgIHVpbnQzMl90IGFscGhhX1tOVU1fTElURVJBTF9DT0RFU107CisgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSBwcmVmaXgtY29kZSBoaXN0b2dyYW0uCisgIHVpbnQzMl90IGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOworICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHNfOworICB1aW50MzJfdCB0cml2aWFsX3N5bWJvbF87ICAvLyBUcnVlLCBpZiBoaXN0b2dyYW1zIGZvciBSZWQsIEJsdWUgJiBBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaXRlcmFsIHN5bWJvbHMgYXJlIHNpbmdsZSB2YWx1ZWQuCisgIGRvdWJsZSBiaXRfY29zdF87ICAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZSBvZiBiaXQgY29zdC4KKyAgZG91YmxlIGxpdGVyYWxfY29zdF87ICAgICAgLy8gQ2FjaGVkIHZhbHVlcyBvZiBkb21pbmFudCBlbnRyb3B5IGNvc3RzOgorICBkb3VibGUgcmVkX2Nvc3RfOyAgICAgICAgICAvLyBsaXRlcmFsLCByZWQgJiBibHVlLgorICBkb3VibGUgYmx1ZV9jb3N0XzsKK30gVlA4TEhpc3RvZ3JhbTsKKworLy8gQ29sbGVjdGlvbiBvZiBoaXN0b2dyYW1zIHdpdGggZml4ZWQgY2FwYWNpdHksIGFsbG9jYXRlZCBhcyBvbmUKKy8vIGJpZyBtZW1vcnkgY2h1bmsuIENhbiBiZSBkZXN0cm95ZWQgYnkgY2FsbGluZyBXZWJQU2FmZUZyZWUoKS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNpemU7ICAgICAgICAgLy8gbnVtYmVyIG9mIHNsb3RzIGN1cnJlbnRseSBpbiB1c2UKKyAgaW50IG1heF9zaXplOyAgICAgLy8gbWF4aW11bSBjYXBhY2l0eQorICBWUDhMSGlzdG9ncmFtKiogaGlzdG9ncmFtczsKK30gVlA4TEhpc3RvZ3JhbVNldDsKKworLy8gQ3JlYXRlIHRoZSBoaXN0b2dyYW0uCisvLworLy8gVGhlIGlucHV0IGRhdGEgaXMgdGhlIFBpeE9yQ29weSBkYXRhLCB3aGljaCBtb2RlbHMgdGhlIGxpdGVyYWxzLCBzdG9wCisvLyBjb2RlcyBhbmQgYmFja3dhcmQgcmVmZXJlbmNlcyAoYm90aCBkaXN0YW5jZXMgYW5kIGxlbmd0aHMpLiAgQWxzbzogaWYKKy8vIHBhbGV0dGVfY29kZV9iaXRzIGlzID49IDAsIGluaXRpYWxpemUgdGhlIGhpc3RvZ3JhbSB3aXRoIHRoaXMgdmFsdWUuCit2b2lkIFZQOExIaXN0b2dyYW1DcmVhdGUoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaGlzdG9ncmFtIGZvciBhIGdpdmVuIHBhbGV0dGVfY29kZV9iaXRzLgoraW50IFZQOExHZXRIaXN0b2dyYW1TaXplKGludCBwYWxldHRlX2NvZGVfYml0cyk7CisKKy8vIFNldCB0aGUgcGFsZXR0ZV9jb2RlX2JpdHMgYW5kIHJlc2V0IHRoZSBzdGF0cy4KK3ZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKKworLy8gQ29sbGVjdCBhbGwgdGhlIHJlZmVyZW5jZXMgaW50byBhIGhpc3RvZ3JhbSAod2l0aG91dCByZXNldCkKK3ZvaWQgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKKworLy8gRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGhpc3RvZ3JhbS4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW0oVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworCisvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9ncmFtIHNldC4KK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW1TZXQoVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaGlzdG8pOworCisvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBwb2ludGVyIHRvIGhpc3RvZ3JhbXMsIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKy8vIHVzaW5nICdjYWNoZV9iaXRzJy4gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitWUDhMSGlzdG9ncmFtU2V0KiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaW50IHNpemUsIGludCBjYWNoZV9iaXRzKTsKKworLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgaGlzdG9ncmFtIG9iamVjdCB3aXRoIHNwZWNpZmllZCAnY2FjaGVfYml0cycuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCisvLyBTcGVjaWFsIGNhc2Ugb2YgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0LCB3aXRoIHNpemUgZXF1YWxzIDEuCitWUDhMSGlzdG9ncmFtKiBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oaW50IGNhY2hlX2JpdHMpOworCisvLyBBY2N1bXVsYXRlIGEgdG9rZW4gJ3YnIGludG8gYSBoaXN0b2dyYW0uCit2b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2KTsKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7CisgIHJldHVybiBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMgKworICAgICAgKChwYWxldHRlX2NvZGVfYml0cyA+IDApID8gKDEgPDwgcGFsZXR0ZV9jb2RlX2JpdHMpIDogMCk7Cit9CisKKy8vIEJ1aWxkcyB0aGUgaGlzdG9ncmFtIGltYWdlLgoraW50IFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyhpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9ncmFtX2JpdHMsIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgdG1wX2hpc3RvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKTsKKworLy8gUmV0dXJucyB0aGUgZW50cm9weSBmb3IgdGhlIHN5bWJvbHMgaW4gdGhlIGlucHV0IGFycmF5LgorLy8gQWxzbyBzZXRzIHRyaXZpYWxfc3ltYm9sIHRvIHRoZSBjb2RlIHZhbHVlLCBpZiB0aGUgYXJyYXkgaGFzIG9ubHkgb25lIGNvZGUKKy8vIHZhbHVlLiBPdGhlcndpc2UsIHNldCBpdCB0byBWUDhMX05PTl9UUklWSUFMX1NZTS4KK2RvdWJsZSBWUDhMQml0c0VudHJvcHkoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IHRyaXZpYWxfc3ltYm9sKTsKKworLy8gRXN0aW1hdGUgaG93IG1hbnkgYml0cyB0aGUgY29tYmluZWQgZW50cm9weSBvZiBsaXRlcmFscyBhbmQgZGlzdGFuY2UKKy8vIGFwcHJveGltYXRlbHkgbWFwcyB0by4KK2RvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIENIUk9NSVVNX1dFQlBfRU5DX0hJU1RPR1JBTV9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvaXRlcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM2ZThkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2l0ZXJhdG9yLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBWUDhJdGVyYXRvcjogYmxvY2sgaXRlcmF0b3IKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhJdGVyYXRvcgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSW5pdExlZnQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGl0LT55X2xlZnRfWy0xXSA9IGl0LT51X2xlZnRfWy0xXSA9IGl0LT52X2xlZnRfWy0xXSA9CisgICAgICAoaXQtPnlfID4gMCkgPyAxMjkgOiAxMjc7CisgIG1lbXNldChpdC0+eV9sZWZ0XywgMTI5LCAxNik7CisgIG1lbXNldChpdC0+dV9sZWZ0XywgMTI5LCA4KTsKKyAgbWVtc2V0KGl0LT52X2xlZnRfLCAxMjksIDgpOworICBpdC0+bGVmdF9uel9bOF0gPSAwOworfQorCitzdGF0aWMgdm9pZCBJbml0VG9wKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3Qgc2l6ZV90IHRvcF9zaXplID0gZW5jLT5tYl93XyAqIDE2OworICBtZW1zZXQoZW5jLT55X3RvcF8sIDEyNywgMiAqIHRvcF9zaXplKTsKKyAgbWVtc2V0KGVuYy0+bnpfLCAwLCBlbmMtPm1iX3dfICogc2l6ZW9mKCplbmMtPm56XykpOworfQorCit2b2lkIFZQOEl0ZXJhdG9yU2V0Um93KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHkpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGl0LT54XyA9IDA7CisgIGl0LT55XyA9IHk7CisgIGl0LT5id18gPSAmZW5jLT5wYXJ0c19beSAmIChlbmMtPm51bV9wYXJ0c18gLSAxKV07CisgIGl0LT5wcmVkc18gPSBlbmMtPnByZWRzXyArIHkgKiA0ICogZW5jLT5wcmVkc193XzsKKyAgaXQtPm56XyA9IGVuYy0+bnpfOworICBpdC0+bWJfID0gZW5jLT5tYl9pbmZvXyArIHkgKiBlbmMtPm1iX3dfOworICBpdC0+eV90b3BfID0gZW5jLT55X3RvcF87CisgIGl0LT51dl90b3BfID0gZW5jLT51dl90b3BfOworICBJbml0TGVmdChpdCk7Cit9CisKK3ZvaWQgVlA4SXRlcmF0b3JSZXNldChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIFZQOEl0ZXJhdG9yU2V0Um93KGl0LCAwKTsKKyAgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oaXQsIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKTsgIC8vIGRlZmF1bHQKKyAgSW5pdFRvcChpdCk7CisgIEluaXRMZWZ0KGl0KTsKKyAgbWVtc2V0KGl0LT5iaXRfY291bnRfLCAwLCBzaXplb2YoaXQtPmJpdF9jb3VudF8pKTsKKyAgaXQtPmRvX3RyZWxsaXNfID0gMDsKK30KKwordm9pZCBWUDhJdGVyYXRvclNldENvdW50RG93bihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBjb3VudF9kb3duKSB7CisgIGl0LT5jb3VudF9kb3duXyA9IGl0LT5jb3VudF9kb3duMF8gPSBjb3VudF9kb3duOworfQorCitpbnQgVlA4SXRlcmF0b3JJc0RvbmUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIHJldHVybiAoaXQtPmNvdW50X2Rvd25fIDw9IDApOworfQorCit2b2lkIFZQOEl0ZXJhdG9ySW5pdChWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpdC0+ZW5jXyA9IGVuYzsKKyAgaXQtPnlfc3RyaWRlXyAgPSBlbmMtPnBpY18tPnlfc3RyaWRlOworICBpdC0+dXZfc3RyaWRlXyA9IGVuYy0+cGljXy0+dXZfc3RyaWRlOworICBpdC0+eXV2X2luXyAgID0gKHVpbnQ4X3QqKVdFQlBfQUxJR04oaXQtPnl1dl9tZW1fKTsKKyAgaXQtPnl1dl9vdXRfICA9IGl0LT55dXZfaW5fICsgWVVWX1NJWkVfRU5DOworICBpdC0+eXV2X291dDJfID0gaXQtPnl1dl9vdXRfICsgWVVWX1NJWkVfRU5DOworICBpdC0+eXV2X3BfICAgID0gaXQtPnl1dl9vdXQyXyArIFlVVl9TSVpFX0VOQzsKKyAgaXQtPmxmX3N0YXRzXyA9IGVuYy0+bGZfc3RhdHNfOworICBpdC0+cGVyY2VudDBfID0gZW5jLT5wZXJjZW50XzsKKyAgaXQtPnlfbGVmdF8gPSAodWludDhfdCopV0VCUF9BTElHTihpdC0+eXV2X2xlZnRfbWVtXyArIDEpOworICBpdC0+dV9sZWZ0XyA9IGl0LT55X2xlZnRfICsgMTYgKyAxNjsKKyAgaXQtPnZfbGVmdF8gPSBpdC0+dV9sZWZ0XyArIDE2OworICBWUDhJdGVyYXRvclJlc2V0KGl0KTsKK30KKworaW50IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgZGVsdGEpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChkZWx0YSAmJiBlbmMtPnBpY18tPnByb2dyZXNzX2hvb2sgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBkb25lID0gaXQtPmNvdW50X2Rvd24wXyAtIGl0LT5jb3VudF9kb3duXzsKKyAgICBjb25zdCBpbnQgcGVyY2VudCA9IChpdC0+Y291bnRfZG93bjBfIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgPyBpdC0+cGVyY2VudDBfCisgICAgICAgICAgICAgICAgICAgICAgOiBpdC0+cGVyY2VudDBfICsgZGVsdGEgKiBkb25lIC8gaXQtPmNvdW50X2Rvd24wXzsKKyAgICByZXR1cm4gV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wb3J0IHRoZSBzb3VyY2Ugc2FtcGxlcyBpbnRvIHRoZSBjYWNoZS4gVGFrZXMgY2FyZSBvZiByZXBsaWNhdGluZworLy8gYm91bmRhcnkgcGl4ZWxzIGlmIG5lY2Vzc2FyeS4KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBNaW5TaXplKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPCBiKSA/IGEgOiBiOyB9CisKK3N0YXRpYyB2b2lkIEltcG9ydEJsb2NrKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCB3LCBpbnQgaCwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBoOyArK2kpIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOworICAgIGlmICh3IDwgc2l6ZSkgeworICAgICAgbWVtc2V0KGRzdCArIHcsIGRzdFt3IC0gMV0sIHNpemUgLSB3KTsKKyAgICB9CisgICAgZHN0ICs9IEJQUzsKKyAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgfQorICBmb3IgKGkgPSBoOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgbWVtY3B5KGRzdCwgZHN0IC0gQlBTLCBzaXplKTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydExpbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuLCBpbnQgdG90YWxfbGVuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2ksIHNyYyArPSBzcmNfc3RyaWRlKSBkc3RbaV0gPSAqc3JjOworICBmb3IgKDsgaSA8IHRvdGFsX2xlbjsgKytpKSBkc3RbaV0gPSBkc3RbbGVuIC0gMV07Cit9CisKK3ZvaWQgVlA4SXRlcmF0b3JJbXBvcnQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCB1aW50OF90KiB0bXBfMzIpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCB1aW50OF90KiBjb25zdCB5c3JjID0gcGljLT55ICsgKHkgKiBwaWMtPnlfc3RyaWRlICArIHgpICogMTY7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHVzcmMgPSBwaWMtPnUgKyAoeSAqIHBpYy0+dXZfc3RyaWRlICsgeCkgKiA4OworICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gcGljLT52ICsgKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogODsKKyAgY29uc3QgaW50IHcgPSBNaW5TaXplKHBpYy0+d2lkdGggLSB4ICogMTYsIDE2KTsKKyAgY29uc3QgaW50IGggPSBNaW5TaXplKHBpYy0+aGVpZ2h0IC0geSAqIDE2LCAxNik7CisgIGNvbnN0IGludCB1dl93ID0gKHcgKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfaCA9IChoICsgMSkgPj4gMTsKKworICBJbXBvcnRCbG9jayh5c3JjLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMsIHcsIGgsIDE2KTsKKyAgSW1wb3J0QmxvY2sodXNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVV9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKKyAgSW1wb3J0QmxvY2sodnNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVl9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKKworICBpZiAodG1wXzMyID09IE5VTEwpIHJldHVybjsKKworICAvLyBJbXBvcnQgc291cmNlICh1bmNvbXByZXNzZWQpIHNhbXBsZXMgaW50byBib3VuZGFyeS4KKyAgaWYgKHggPT0gMCkgeworICAgIEluaXRMZWZ0KGl0KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dl9sZWZ0X1stMV0gPSAxMjc7CisgICAgfSBlbHNlIHsKKyAgICAgIGl0LT55X2xlZnRfWy0xXSA9IHlzcmNbLSAxIC0gcGljLT55X3N0cmlkZV07CisgICAgICBpdC0+dV9sZWZ0X1stMV0gPSB1c3JjWy0gMSAtIHBpYy0+dXZfc3RyaWRlXTsKKyAgICAgIGl0LT52X2xlZnRfWy0xXSA9IHZzcmNbLSAxIC0gcGljLT51dl9zdHJpZGVdOworICAgIH0KKyAgICBJbXBvcnRMaW5lKHlzcmMgLSAxLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnlfbGVmdF8sIGgsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIDEsIHBpYy0+dXZfc3RyaWRlLCBpdC0+dV9sZWZ0XywgdXZfaCwgOCk7CisgICAgSW1wb3J0TGluZSh2c3JjIC0gMSwgcGljLT51dl9zdHJpZGUsIGl0LT52X2xlZnRfLCB1dl9oLCA4KTsKKyAgfQorCisgIGl0LT55X3RvcF8gID0gdG1wXzMyICsgMDsKKyAgaXQtPnV2X3RvcF8gPSB0bXBfMzIgKyAxNjsKKyAgaWYgKHkgPT0gMCkgeworICAgIG1lbXNldCh0bXBfMzIsIDEyNywgMzIgKiBzaXplb2YoKnRtcF8zMikpOworICB9IGVsc2UgeworICAgIEltcG9ydExpbmUoeXNyYyAtIHBpYy0+eV9zdHJpZGUsICAxLCB0bXBfMzIsICAgICAgICAgIHcsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiwgICAgIHV2X3csIDgpOworICAgIEltcG9ydExpbmUodnNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiArIDgsIHV2X3csIDgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb3B5IGJhY2sgdGhlIGNvbXByZXNzZWQgc2FtcGxlcyBpbnRvIHVzZXIgc3BhY2UgaWYgcmVxdWVzdGVkLgorCitzdGF0aWMgdm9pZCBFeHBvcnRCbG9jayhjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpIHsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIHNyYyArPSBCUFM7CisgIH0KK30KKwordm9pZCBWUDhJdGVyYXRvckV4cG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGlmIChlbmMtPmNvbmZpZ18tPnNob3dfY29tcHJlc3NlZCkgeworICAgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgdXNyYyA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gaXQtPnl1dl9vdXRfICsgVl9PRkZfRU5DOworICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgICAgdWludDhfdCogY29uc3QgeWRzdCA9IHBpYy0+eSArICh5ICogcGljLT55X3N0cmlkZSArIHgpICogMTY7CisgICAgdWludDhfdCogY29uc3QgdWRzdCA9IHBpYy0+dSArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CisgICAgdWludDhfdCogY29uc3QgdmRzdCA9IHBpYy0+diArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CisgICAgaW50IHcgPSAocGljLT53aWR0aCAtIHggKiAxNik7CisgICAgaW50IGggPSAocGljLT5oZWlnaHQgLSB5ICogMTYpOworCisgICAgaWYgKHcgPiAxNikgdyA9IDE2OworICAgIGlmIChoID4gMTYpIGggPSAxNjsKKworICAgIC8vIEx1bWEgcGxhbmUKKyAgICBFeHBvcnRCbG9jayh5c3JjLCB5ZHN0LCBwaWMtPnlfc3RyaWRlLCB3LCBoKTsKKworICAgIHsgICAvLyBVL1YgcGxhbmVzCisgICAgICBjb25zdCBpbnQgdXZfdyA9ICh3ICsgMSkgPj4gMTsKKyAgICAgIGNvbnN0IGludCB1dl9oID0gKGggKyAxKSA+PiAxOworICAgICAgRXhwb3J0QmxvY2sodXNyYywgdWRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOworICAgICAgRXhwb3J0QmxvY2sodnNyYywgdmRzdCwgcGljLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLXplcm8gY29udGV4dHMgc2V0dXAvdGVhcmRvd24KKworLy8gTnogYml0czoKKy8vICAwICAxICAyICAzICBZCisvLyAgNCAgNSAgNiAgNworLy8gIDggIDkgMTAgMTEKKy8vIDEyIDEzIDE0IDE1CisvLyAxNiAxNyAgICAgICAgVQorLy8gMTggMTkKKy8vIDIwIDIxICAgICAgICBWCisvLyAyMiAyMworLy8gMjQgICAgICAgICAgIERDLWludHJhMTYKKworLy8gQ29udmVydCBwYWNrZWQgY29udGV4dCB0byBieXRlIGFycmF5CisjZGVmaW5lIEJJVChueiwgbikgKCEhKChueikgJiAoMSA8PCAobikpKSkKKwordm9pZCBWUDhJdGVyYXRvck56VG9CeXRlcyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgaW50IHRueiA9IGl0LT5uel9bMF0sIGxueiA9IGl0LT5uel9bLTFdOworICBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOworICBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87CisKKyAgLy8gVG9wLVkKKyAgdG9wX256WzBdID0gQklUKHRueiwgMTIpOworICB0b3BfbnpbMV0gPSBCSVQodG56LCAxMyk7CisgIHRvcF9uelsyXSA9IEJJVCh0bnosIDE0KTsKKyAgdG9wX256WzNdID0gQklUKHRueiwgMTUpOworICAvLyBUb3AtVQorICB0b3BfbnpbNF0gPSBCSVQodG56LCAxOCk7CisgIHRvcF9uels1XSA9IEJJVCh0bnosIDE5KTsKKyAgLy8gVG9wLVYKKyAgdG9wX256WzZdID0gQklUKHRueiwgMjIpOworICB0b3BfbnpbN10gPSBCSVQodG56LCAyMyk7CisgIC8vIERDCisgIHRvcF9uels4XSA9IEJJVCh0bnosIDI0KTsKKworICAvLyBsZWZ0LVkKKyAgbGVmdF9uelswXSA9IEJJVChsbnosICAzKTsKKyAgbGVmdF9uelsxXSA9IEJJVChsbnosICA3KTsKKyAgbGVmdF9uelsyXSA9IEJJVChsbnosIDExKTsKKyAgbGVmdF9uelszXSA9IEJJVChsbnosIDE1KTsKKyAgLy8gbGVmdC1VCisgIGxlZnRfbnpbNF0gPSBCSVQobG56LCAxNyk7CisgIGxlZnRfbnpbNV0gPSBCSVQobG56LCAxOSk7CisgIC8vIGxlZnQtVgorICBsZWZ0X256WzZdID0gQklUKGxueiwgMjEpOworICBsZWZ0X256WzddID0gQklUKGxueiwgMjMpOworICAvLyBsZWZ0LURDIGlzIHNwZWNpYWwsIGl0ZXJhdGVkIHNlcGFyYXRlbHkKK30KKwordm9pZCBWUDhJdGVyYXRvckJ5dGVzVG9OeihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgdWludDMyX3QgbnogPSAwOworICBjb25zdCBpbnQqIGNvbnN0IHRvcF9ueiA9IGl0LT50b3BfbnpfOworICBjb25zdCBpbnQqIGNvbnN0IGxlZnRfbnogPSBpdC0+bGVmdF9uel87CisgIC8vIHRvcAorICBueiB8PSAodG9wX256WzBdIDw8IDEyKSB8ICh0b3BfbnpbMV0gPDwgMTMpOworICBueiB8PSAodG9wX256WzJdIDw8IDE0KSB8ICh0b3BfbnpbM10gPDwgMTUpOworICBueiB8PSAodG9wX256WzRdIDw8IDE4KSB8ICh0b3BfbnpbNV0gPDwgMTkpOworICBueiB8PSAodG9wX256WzZdIDw8IDIyKSB8ICh0b3BfbnpbN10gPDwgMjMpOworICBueiB8PSAodG9wX256WzhdIDw8IDI0KTsgIC8vIHdlIHByb3BhZ2F0ZSB0aGUgX3RvcF8gYml0LCBlc3AuIGZvciBpbnRyYTQKKyAgLy8gbGVmdAorICBueiB8PSAobGVmdF9uelswXSA8PCAzKSB8IChsZWZ0X256WzFdIDw8IDcpOworICBueiB8PSAobGVmdF9uelsyXSA8PCAxMSk7CisgIG56IHw9IChsZWZ0X256WzRdIDw8IDE3KSB8IChsZWZ0X256WzZdIDw8IDIxKTsKKworICAqaXQtPm56XyA9IG56OworfQorCisjdW5kZWYgQklUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBkb2luZyB0aGUgYm9va2tlZXBpbmcuCisKK3ZvaWQgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgeCA9IGl0LT54XywgeSA9IGl0LT55XzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZzcmMgPSBpdC0+eXV2X291dF8gKyBVX09GRl9FTkM7CisgIGlmICh4IDwgZW5jLT5tYl93XyAtIDEpIHsgICAvLyBsZWZ0CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIGl0LT55X2xlZnRfW2ldID0geXNyY1sxNSArIGkgKiBCUFNdOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBpdC0+dV9sZWZ0X1tpXSA9IHV2c3JjWzcgKyBpICogQlBTXTsKKyAgICAgIGl0LT52X2xlZnRfW2ldID0gdXZzcmNbMTUgKyBpICogQlBTXTsKKyAgICB9CisgICAgLy8gdG9wLWxlZnQgKGJlZm9yZSAndG9wJyEpCisgICAgaXQtPnlfbGVmdF9bLTFdID0gaXQtPnlfdG9wX1sxNV07CisgICAgaXQtPnVfbGVmdF9bLTFdID0gaXQtPnV2X3RvcF9bMCArIDddOworICAgIGl0LT52X2xlZnRfWy0xXSA9IGl0LT51dl90b3BfWzggKyA3XTsKKyAgfQorICBpZiAoeSA8IGVuYy0+bWJfaF8gLSAxKSB7ICAvLyB0b3AKKyAgICBtZW1jcHkoaXQtPnlfdG9wXywgeXNyYyArIDE1ICogQlBTLCAxNik7CisgICAgbWVtY3B5KGl0LT51dl90b3BfLCB1dnNyYyArIDcgKiBCUFMsIDggKyA4KTsKKyAgfQorfQorCitpbnQgVlA4SXRlcmF0b3JOZXh0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpdC0+cHJlZHNfICs9IDQ7CisgIGl0LT5tYl8gKz0gMTsKKyAgaXQtPm56XyArPSAxOworICBpdC0+eV90b3BfICs9IDE2OworICBpdC0+dXZfdG9wXyArPSAxNjsKKyAgaXQtPnhfICs9IDE7CisgIGlmIChpdC0+eF8gPT0gaXQtPmVuY18tPm1iX3dfKSB7CisgICAgVlA4SXRlcmF0b3JTZXRSb3coaXQsICsraXQtPnlfKTsKKyAgfQorICByZXR1cm4gKDAgPCAtLWl0LT5jb3VudF9kb3duXyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IG1vZGUgcHJvcGVydGllcworCit2b2lkIFZQOFNldEludHJhMTZNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG1vZGUpIHsKKyAgdWludDhfdCogcHJlZHMgPSBpdC0+cHJlZHNfOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIG1lbXNldChwcmVkcywgbW9kZSwgNCk7CisgICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOworICB9CisgIGl0LT5tYl8tPnR5cGVfID0gMTsKK30KKwordm9pZCBWUDhTZXRJbnRyYTRNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgdWludDhfdCogbW9kZXMpIHsKKyAgdWludDhfdCogcHJlZHMgPSBpdC0+cHJlZHNfOworICBpbnQgeTsKKyAgZm9yICh5ID0gNDsgeSA+IDA7IC0teSkgeworICAgIG1lbWNweShwcmVkcywgbW9kZXMsIDQgKiBzaXplb2YoKm1vZGVzKSk7CisgICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOworICAgIG1vZGVzICs9IDQ7CisgIH0KKyAgaXQtPm1iXy0+dHlwZV8gPSAwOworfQorCit2b2lkIFZQOFNldEludHJhVVZNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG1vZGUpIHsKKyAgaXQtPm1iXy0+dXZfbW9kZV8gPSBtb2RlOworfQorCit2b2lkIFZQOFNldFNraXAoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgc2tpcCkgeworICBpdC0+bWJfLT5za2lwXyA9IHNraXA7Cit9CisKK3ZvaWQgVlA4U2V0U2VnbWVudChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBzZWdtZW50KSB7CisgIGl0LT5tYl8tPnNlZ21lbnRfID0gc2VnbWVudDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhNHg0IHN1Yi1ibG9ja3MgaXRlcmF0aW9uCisvLworLy8gIFdlIHN0b3JlIGFuZCB1cGRhdGUgdGhlIGJvdW5kYXJ5IHNhbXBsZXMgaW50byBhbiBhcnJheSBvZiAzNyBwaXhlbHMuIFRoZXkKKy8vICBhcmUgdXBkYXRlZCBhcyB3ZSBpdGVyYXRlIGFuZCByZWNvbnN0cnVjdHMgZWFjaCBpbnRyYTR4NCBibG9ja3MgaW4gdHVybi4KKy8vICBUaGUgcG9zaXRpb24gb2YgdGhlIHNhbXBsZXMgaGFzIHRoZSBmb2xsb3dpbmcgc25ha2UgcGF0dGVybjoKKy8vCisvLyAxNnwxNyAxOCAxOSAyMHwyMSAyMiAyMyAyNHwyNSAyNiAyNyAyOHwyOSAzMCAzMSAzMnwzMyAzNCAzNSAzNiAgPC0gVG9wLXJpZ2h0CisvLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKy8vIDE1fCAgICAgICAgIDE5fCAgICAgICAgIDIzfCAgICAgICAgIDI3fCAgICAgICAgIDMxfAorLy8gMTR8ICAgICAgICAgMTh8ICAgICAgICAgMjJ8ICAgICAgICAgMjZ8ICAgICAgICAgMzB8CisvLyAxM3wgICAgICAgICAxN3wgICAgICAgICAyMXwgICAgICAgICAyNXwgICAgICAgICAyOXwKKy8vIDEyfDEzIDE0IDE1IDE2fDE3IDE4IDE5IDIwfDIxIDIyIDIzIDI0fDI1IDI2IDI3IDI4fAorLy8gLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisvLyAxMXwgICAgICAgICAxNXwgICAgICAgICAxOXwgICAgICAgICAyM3wgICAgICAgICAyN3wKKy8vIDEwfCAgICAgICAgIDE0fCAgICAgICAgIDE4fCAgICAgICAgIDIyfCAgICAgICAgIDI2fAorLy8gIDl8ICAgICAgICAgMTN8ICAgICAgICAgMTd8ICAgICAgICAgMjF8ICAgICAgICAgMjV8CisvLyAgOHwgOSAxMCAxMSAxMnwxMyAxNCAxNSAxNnwxNyAxOCAxOSAyMHwyMSAyMiAyMyAyNHwKKy8vIC0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKworLy8gIDd8ICAgICAgICAgMTF8ICAgICAgICAgMTV8ICAgICAgICAgMTl8ICAgICAgICAgMjN8CisvLyAgNnwgICAgICAgICAxMHwgICAgICAgICAxNHwgICAgICAgICAxOHwgICAgICAgICAyMnwKKy8vICA1fCAgICAgICAgICA5fCAgICAgICAgIDEzfCAgICAgICAgIDE3fCAgICAgICAgIDIxfAorLy8gIDR8IDUgIDYgIDcgIDh8IDkgMTAgMTEgMTJ8MTMgMTQgMTUgMTZ8MTcgMTggMTkgMjB8CisvLyAtLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKy8vICAzfCAgICAgICAgICA3fCAgICAgICAgIDExfCAgICAgICAgIDE1fCAgICAgICAgIDE5fAorLy8gIDJ8ICAgICAgICAgIDZ8ICAgICAgICAgMTB8ICAgICAgICAgMTR8ICAgICAgICAgMTh8CisvLyAgMXwgICAgICAgICAgNXwgICAgICAgICAgOXwgICAgICAgICAxM3wgICAgICAgICAxN3wKKy8vICAwfCAxICAyICAzICA0fCA1ICA2ICA3ICA4fCA5IDEwIDExIDEyfDEzIDE0IDE1IDE2fAorLy8gLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCisKKy8vIEFycmF5IHRvIHJlY29yZCB0aGUgcG9zaXRpb24gb2YgdGhlIHRvcCBzYW1wbGUgdG8gcGFzcyB0byB0aGUgcHJlZGljdGlvbgorLy8gZnVuY3Rpb25zIGluIGRzcC5jLgorc3RhdGljIGNvbnN0IHVpbnQ4X3QgVlA4VG9wTGVmdEk0WzE2XSA9IHsKKyAgMTcsIDIxLCAyNSwgMjksCisgIDEzLCAxNywgMjEsIDI1LAorICA5LCAgMTMsIDE3LCAyMSwKKyAgNSwgICA5LCAxMywgMTcKK307CisKK3ZvaWQgVlA4SXRlcmF0b3JTdGFydEk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaW50IGk7CisKKyAgaXQtPmk0XyA9IDA7ICAgIC8vIGZpcnN0IDR4NCBzdWItYmxvY2sKKyAgaXQtPmk0X3RvcF8gPSBpdC0+aTRfYm91bmRhcnlfICsgVlA4VG9wTGVmdEk0WzBdOworCisgIC8vIEltcG9ydCB0aGUgYm91bmRhcnkgc2FtcGxlcworICBmb3IgKGkgPSAwOyBpIDwgMTc7ICsraSkgeyAgICAvLyBsZWZ0CisgICAgaXQtPmk0X2JvdW5kYXJ5X1tpXSA9IGl0LT55X2xlZnRfWzE1IC0gaV07CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsgICAgLy8gdG9wCisgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gaXQtPnlfdG9wX1tpXTsKKyAgfQorICAvLyB0b3AtcmlnaHQgc2FtcGxlcyBoYXZlIGEgc3BlY2lhbCBjYXNlIG9uIHRoZSBmYXIgcmlnaHQgb2YgdGhlIHBpY3R1cmUKKyAgaWYgKGl0LT54XyA8IGVuYy0+bWJfd18gLSAxKSB7CisgICAgZm9yIChpID0gMTY7IGkgPCAxNiArIDQ7ICsraSkgeworICAgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gaXQtPnlfdG9wX1tpXTsKKyAgICB9CisgIH0gZWxzZSB7ICAgIC8vIGVsc2UsIHJlcGxpY2F0ZSB0aGUgbGFzdCB2YWxpZCBwaXhlbCBmb3VyIHRpbWVzCisgICAgZm9yIChpID0gMTY7IGkgPCAxNiArIDQ7ICsraSkgeworICAgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gaXQtPmk0X2JvdW5kYXJ5X1sxNyArIDE1XTsKKyAgICB9CisgIH0KKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOyAgLy8gaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0Cit9CisKK2ludCBWUDhJdGVyYXRvclJvdGF0ZUk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQpIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgYmxrID0geXV2X291dCArIFZQOFNjYW5baXQtPmk0X107CisgIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT5pNF90b3BfOworICBpbnQgaTsKKworICAvLyBVcGRhdGUgdGhlIGNhY2hlIHdpdGggNyBmcmVzaCBzYW1wbGVzCisgIGZvciAoaSA9IDA7IGkgPD0gMzsgKytpKSB7CisgICAgdG9wWy00ICsgaV0gPSBibGtbaSArIDMgKiBCUFNdOyAgIC8vIHN0b3JlIGZ1dHVyZSB0b3Agc2FtcGxlcworICB9CisgIGlmICgoaXQtPmk0XyAmIDMpICE9IDMpIHsgIC8vIGlmIG5vdCBvbiB0aGUgcmlnaHQgc3ViLWJsb2NrcyAjMywgIzcsICMxMSwgIzE1CisgICAgZm9yIChpID0gMDsgaSA8PSAyOyArK2kpIHsgICAgICAgIC8vIHN0b3JlIGZ1dHVyZSBsZWZ0IHNhbXBsZXMKKyAgICAgIHRvcFtpXSA9IGJsa1szICsgKDIgLSBpKSAqIEJQU107CisgICAgfQorICB9IGVsc2UgeyAgLy8gZWxzZSByZXBsaWNhdGUgdG9wLXJpZ2h0IHNhbXBsZXMsIGFzIHNheXMgdGhlIHNwZWNzLgorICAgIGZvciAoaSA9IDA7IGkgPD0gMzsgKytpKSB7CisgICAgICB0b3BbaV0gPSB0b3BbaSArIDRdOworICAgIH0KKyAgfQorICAvLyBtb3ZlIHBvaW50ZXJzIHRvIG5leHQgc3ViLWJsb2NrCisgICsraXQtPmk0XzsKKyAgaWYgKGl0LT5pNF8gPT0gMTYpIHsgICAgLy8gd2UncmUgZG9uZQorICAgIHJldHVybiAwOworICB9CisKKyAgaXQtPmk0X3RvcF8gPSBpdC0+aTRfYm91bmRhcnlfICsgVlA4VG9wTGVmdEk0W2l0LT5pNF9dOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL25lYXJfbG9zc2xlc3MuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9uZWFyX2xvc3NsZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNTNiMgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9uZWFyX2xvc3NsZXNzLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBOZWFyLWxvc3NsZXNzIGltYWdlIHByZXByb2Nlc3NpbmcgYWRqdXN0cyBwaXhlbCB2YWx1ZXMgdG8gaGVscAorLy8gY29tcHJlc3NpYmlsaXR5IHdpdGggYSBndWFyYW50ZWUgb2YgbWF4aW11bSBkZXZpYXRpb24gYmV0d2VlbiBvcmlnaW5hbCBhbmQKKy8vIHJlc3VsdGluZyBwaXhlbCB2YWx1ZXMuCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gQ29udmVydGVkIHRvIEMgYnkgQWxla3NhbmRlciBLcmFtYXJ6IChha3JhbWFyekBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisKKyNkZWZpbmUgTUlOX0RJTV9GT1JfTkVBUl9MT1NTTEVTUyA2NAorI2RlZmluZSBNQVhfTElNSVRfQklUUyAgICAgICAgICAgICA1CisKKy8vIFF1YW50aXplcyB0aGUgdmFsdWUgdXAgb3IgZG93biB0byBhIG11bHRpcGxlIG9mIDE8PGJpdHMgKG9yIHRvIDI1NSksCisvLyBjaG9vc2luZyB0aGUgY2xvc2VyIG9uZSwgcmVzb2x2aW5nIHRpZXMgdXNpbmcgYmFua2Vycycgcm91bmRpbmcuCitzdGF0aWMgaW50IEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoaW50IGEsIGludCBiaXRzKSB7CisgIGNvbnN0IGludCBtYXNrID0gKDEgPDwgYml0cykgLSAxOworICBjb25zdCBpbnQgYmlhc2VkID0gYSArIChtYXNrID4+IDEpICsgKChhID4+IGJpdHMpICYgMSk7CisgIGFzc2VydChiaXRzID4gMCk7CisgIGlmIChiaWFzZWQgPiAweGZmKSByZXR1cm4gMHhmZjsKKyAgcmV0dXJuIGJpYXNlZCAmIH5tYXNrOworfQorCisvLyBBcHBsaWVzIEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQgdG8gYWxsIGNoYW5uZWxzIG9mIHBpeGVsLgorc3RhdGljIHVpbnQzMl90IENsb3Nlc3REaXNjcmV0aXplZEFyZ2IodWludDMyX3QgYSwgaW50IGJpdHMpIHsKKyAgcmV0dXJuCisgICAgICAoRmluZENsb3Nlc3REaXNjcmV0aXplZChhID4+IDI0LCBiaXRzKSA8PCAyNCkgfAorICAgICAgKEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoKGEgPj4gMTYpICYgMHhmZiwgYml0cykgPDwgMTYpIHwKKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKChhID4+IDgpICYgMHhmZiwgYml0cykgPDwgOCkgfAorICAgICAgKEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoYSAmIDB4ZmYsIGJpdHMpKTsKK30KKworLy8gQ2hlY2tzIGlmIGRpc3RhbmNlIGJldHdlZW4gY29ycmVzcG9uZGluZyBjaGFubmVsIHZhbHVlcyBvZiBwaXhlbHMgYSBhbmQgYgorLy8gaXMgd2l0aGluIHRoZSBnaXZlbiBsaW1pdC4KK3N0YXRpYyBpbnQgSXNOZWFyKHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIGludCBsaW1pdCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMDsgayA8IDQ7ICsraykgeworICAgIGNvbnN0IGludCBkZWx0YSA9CisgICAgICAgIChpbnQpKChhID4+IChrICogOCkpICYgMHhmZikgLSAoaW50KSgoYiA+PiAoayAqIDgpKSAmIDB4ZmYpOworICAgIGlmIChkZWx0YSA+PSBsaW1pdCB8fCBkZWx0YSA8PSAtbGltaXQpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBJc1Ntb290aChjb25zdCB1aW50MzJfdCogY29uc3QgcHJldl9yb3csCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjdXJyX3JvdywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IG5leHRfcm93LAorICAgICAgICAgICAgICAgICAgICBpbnQgaXgsIGludCBsaW1pdCkgeworICAvLyBDaGVjayB0aGF0IGFsbCBwaXhlbHMgaW4gNC1jb25uZWN0ZWQgbmVpZ2hib3Job29kIGFyZSBzbW9vdGguCisgIHJldHVybiAoSXNOZWFyKGN1cnJfcm93W2l4XSwgY3Vycl9yb3dbaXggLSAxXSwgbGltaXQpICYmCisgICAgICAgICAgSXNOZWFyKGN1cnJfcm93W2l4XSwgY3Vycl9yb3dbaXggKyAxXSwgbGltaXQpICYmCisgICAgICAgICAgSXNOZWFyKGN1cnJfcm93W2l4XSwgcHJldl9yb3dbaXhdLCBsaW1pdCkgJiYKKyAgICAgICAgICBJc05lYXIoY3Vycl9yb3dbaXhdLCBuZXh0X3Jvd1tpeF0sIGxpbWl0KSk7Cit9CisKKy8vIEFkanVzdHMgcGl4ZWwgdmFsdWVzIG9mIGltYWdlIHdpdGggZ2l2ZW4gbWF4aW11bSBlcnJvci4KK3N0YXRpYyB2b2lkIE5lYXJMb3NzbGVzcyhpbnQgeHNpemUsIGludCB5c2l6ZSwgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbWl0X2JpdHMsIHVpbnQzMl90KiBjb3B5X2J1ZmZlcikgeworICBpbnQgeCwgeTsKKyAgY29uc3QgaW50IGxpbWl0ID0gMSA8PCBsaW1pdF9iaXRzOworICB1aW50MzJfdCogcHJldl9yb3cgPSBjb3B5X2J1ZmZlcjsKKyAgdWludDMyX3QqIGN1cnJfcm93ID0gcHJldl9yb3cgKyB4c2l6ZTsKKyAgdWludDMyX3QqIG5leHRfcm93ID0gY3Vycl9yb3cgKyB4c2l6ZTsKKyAgbWVtY3B5KGNvcHlfYnVmZmVyLCBhcmdiLCB4c2l6ZSAqIDIgKiBzaXplb2YoYXJnYlswXSkpOworCisgIGZvciAoeSA9IDE7IHkgPCB5c2l6ZSAtIDE7ICsreSkgeworICAgIHVpbnQzMl90KiBjb25zdCBjdXJyX2FyZ2Jfcm93ID0gYXJnYiArIHkgKiB4c2l6ZTsKKyAgICB1aW50MzJfdCogY29uc3QgbmV4dF9hcmdiX3JvdyA9IGN1cnJfYXJnYl9yb3cgKyB4c2l6ZTsKKyAgICBtZW1jcHkobmV4dF9yb3csIG5leHRfYXJnYl9yb3csIHhzaXplICogc2l6ZW9mKGFyZ2JbMF0pKTsKKyAgICBmb3IgKHggPSAxOyB4IDwgeHNpemUgLSAxOyArK3gpIHsKKyAgICAgIGlmICghSXNTbW9vdGgocHJldl9yb3csIGN1cnJfcm93LCBuZXh0X3JvdywgeCwgbGltaXQpKSB7CisgICAgICAgIGN1cnJfYXJnYl9yb3dbeF0gPSBDbG9zZXN0RGlzY3JldGl6ZWRBcmdiKGN1cnJfcm93W3hdLCBsaW1pdF9iaXRzKTsKKyAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgLy8gVGhyZWUtd2F5IHN3YXAuCisgICAgICB1aW50MzJfdCogY29uc3QgdGVtcCA9IHByZXZfcm93OworICAgICAgcHJldl9yb3cgPSBjdXJyX3JvdzsKKyAgICAgIGN1cnJfcm93ID0gbmV4dF9yb3c7CisgICAgICBuZXh0X3JvdyA9IHRlbXA7CisgICAgfQorICB9Cit9CisKK2ludCBWUDhBcHBseU5lYXJMb3NzbGVzcyhpbnQgeHNpemUsIGludCB5c2l6ZSwgdWludDMyX3QqIGFyZ2IsIGludCBxdWFsaXR5KSB7CisgIGludCBpOworICB1aW50MzJfdCogY29uc3QgY29weV9idWZmZXIgPQorICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh4c2l6ZSAqIDMsIHNpemVvZigqY29weV9idWZmZXIpKTsKKyAgY29uc3QgaW50IGxpbWl0X2JpdHMgPSBWUDhMTmVhckxvc3NsZXNzQml0cyhxdWFsaXR5KTsKKyAgYXNzZXJ0KGFyZ2IgIT0gTlVMTCk7CisgIGFzc2VydChsaW1pdF9iaXRzID49IDApOworICBhc3NlcnQobGltaXRfYml0cyA8PSBNQVhfTElNSVRfQklUUyk7CisgIGlmIChjb3B5X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gRm9yIHNtYWxsIGljb24gaW1hZ2VzLCBkb24ndCBhdHRlbXB0IHRvIGFwcGx5IG5lYXItbG9zc2xlc3MgY29tcHJlc3Npb24uCisgIGlmICh4c2l6ZSA8IE1JTl9ESU1fRk9SX05FQVJfTE9TU0xFU1MgJiYgeXNpemUgPCBNSU5fRElNX0ZPUl9ORUFSX0xPU1NMRVNTKSB7CisgICAgV2ViUFNhZmVGcmVlKGNvcHlfYnVmZmVyKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGZvciAoaSA9IGxpbWl0X2JpdHM7IGkgIT0gMDsgLS1pKSB7CisgICAgTmVhckxvc3NsZXNzKHhzaXplLCB5c2l6ZSwgYXJnYiwgaSwgY29weV9idWZmZXIpOworICB9CisgIFdlYlBTYWZlRnJlZShjb3B5X2J1ZmZlcik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3BpY3R1cmUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwNDFkOAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQUGljdHVyZSBjbGFzcyBiYXNpcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGVuY2kuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQUGljdHVyZQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBEdW1teVdyaXRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICAvLyBUaGUgZm9sbG93aW5nIGFyZSB0byBwcmV2ZW50ICd1bnVzZWQgdmFyaWFibGUnIGVycm9yIG1lc3NhZ2UuCisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljdHVyZTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSogcGljdHVyZSwgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gY2FsbGVyL3N5c3RlbSB2ZXJzaW9uIG1pc21hdGNoIQorICB9CisgIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKKyAgICBtZW1zZXQocGljdHVyZSwgMCwgc2l6ZW9mKCpwaWN0dXJlKSk7CisgICAgcGljdHVyZS0+d3JpdGVyID0gRHVtbXlXcml0ZXI7CisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19PSyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IE5VTEw7CisgIHBpY3R1cmUtPmFyZ2IgPSBOVUxMOworICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIHBpY3R1cmUtPm1lbW9yeV8gPSBOVUxMOworICBwaWN0dXJlLT55ID0gcGljdHVyZS0+dSA9IHBpY3R1cmUtPnYgPSBwaWN0dXJlLT5hID0gTlVMTDsKKyAgcGljdHVyZS0+eV9zdHJpZGUgPSBwaWN0dXJlLT51dl9zdHJpZGUgPSAwOworICBwaWN0dXJlLT5hX3N0cmlkZSA9IDA7Cit9CisKK3ZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IocGljdHVyZSk7CisgIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKHBpY3R1cmUpOworfQorCitpbnQgV2ViUFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICB2b2lkKiBtZW1vcnk7CisgIGNvbnN0IHVpbnQ2NF90IGFyZ2Jfc2l6ZSA9ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodDsKKworICBhc3NlcnQocGljdHVyZSAhPSBOVUxMKTsKKworICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IocGljdHVyZSk7CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OKTsKKyAgfQorICAvLyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgIG1lbW9yeSA9IFdlYlBTYWZlTWFsbG9jKGFyZ2Jfc2l6ZSwgc2l6ZW9mKCpwaWN0dXJlLT5hcmdiKSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICB9CisgIC8vIFRPRE8oc2thbCk6IGFsaWduIHBsYW5lIHRvIGNhY2hlIGxpbmU/CisgIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IG1lbW9yeTsKKyAgcGljdHVyZS0+YXJnYiA9ICh1aW50MzJfdCopbWVtb3J5OworICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IHdpZHRoOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlQWxsb2NZVVZBKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgY29uc3QgV2ViUEVuY0NTUCB1dl9jc3AgPSBwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSzsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQ7CisgIGNvbnN0IGludCB5X3N0cmlkZSA9IHdpZHRoOworICBjb25zdCBpbnQgdXZfd2lkdGggPSAod2lkdGggKyAxKSA+PiAxOworICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGhlaWdodCArIDEpID4+IDE7CisgIGNvbnN0IGludCB1dl9zdHJpZGUgPSB1dl93aWR0aDsKKyAgaW50IGFfd2lkdGgsIGFfc3RyaWRlOworICB1aW50NjRfdCB5X3NpemUsIHV2X3NpemUsIGFfc2l6ZSwgdG90YWxfc2l6ZTsKKyAgdWludDhfdCogbWVtOworCisgIGFzc2VydChwaWN0dXJlICE9IE5VTEwpOworCisgIFdlYlBTYWZlRnJlZShwaWN0dXJlLT5tZW1vcnlfKTsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcllVVkEocGljdHVyZSk7CisKKyAgaWYgKHV2X2NzcCAhPSBXRUJQX1lVVjQyMCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7CisgIH0KKworICAvLyBhbHBoYQorICBhX3dpZHRoID0gaGFzX2FscGhhID8gd2lkdGggOiAwOworICBhX3N0cmlkZSA9IGFfd2lkdGg7CisgIHlfc2l6ZSA9ICh1aW50NjRfdCl5X3N0cmlkZSAqIGhlaWdodDsKKyAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiB1dl9oZWlnaHQ7CisgIGFfc2l6ZSA9ICAodWludDY0X3QpYV9zdHJpZGUgKiBoZWlnaHQ7CisKKyAgdG90YWxfc2l6ZSA9IHlfc2l6ZSArIGFfc2l6ZSArIDIgKiB1dl9zaXplOworCisgIC8vIFNlY3VyaXR5IGFuZCB2YWxpZGF0aW9uIGNoZWNrcworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCAgICAgICAgIC8vIGx1bWEvYWxwaGEgcGFyYW0gZXJyb3IKKyAgICAgIHV2X3dpZHRoIDwgMCB8fCB1dl9oZWlnaHQgPCAwKSB7ICAgICAvLyB1L3YgcGFyYW0gZXJyb3IKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OKTsKKyAgfQorICAvLyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgIG1lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKm1lbSkpOworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorCisgIC8vIEZyb20gbm93IG9uLCB3ZSdyZSBpbiB0aGUgY2xlYXIsIHdlIGNhbiBubyBsb25nZXIgZmFpbC4uLgorICBwaWN0dXJlLT5tZW1vcnlfID0gKHZvaWQqKW1lbTsKKyAgcGljdHVyZS0+eV9zdHJpZGUgID0geV9zdHJpZGU7CisgIHBpY3R1cmUtPnV2X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgcGljdHVyZS0+YV9zdHJpZGUgID0gYV9zdHJpZGU7CisKKyAgLy8gVE9ETyhza2FsKTogd2UgY291bGQgYWxpZ24gdGhlIHkvdS92IHBsYW5lcyBhbmQgYWRqdXN0IHN0cmlkZS4KKyAgcGljdHVyZS0+eSA9IG1lbTsKKyAgbWVtICs9IHlfc2l6ZTsKKworICBwaWN0dXJlLT51ID0gbWVtOworICBtZW0gKz0gdXZfc2l6ZTsKKyAgcGljdHVyZS0+diA9IG1lbTsKKyAgbWVtICs9IHV2X3NpemU7CisKKyAgaWYgKGFfc2l6ZSA+IDApIHsKKyAgICBwaWN0dXJlLT5hID0gbWVtOworICAgIG1lbSArPSBhX3NpemU7CisgIH0KKyAgKHZvaWQpbWVtOyAgLy8gbWFrZXMgdGhlIHN0YXRpYyBhbmFseXplciBoYXBweQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlQWxsb2MoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisKKyAgICBXZWJQUGljdHVyZUZyZWUocGljdHVyZSk7ICAgLy8gZXJhc2UgcHJldmlvdXMgYnVmZmVyCisKKyAgICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7CisgICAgICByZXR1cm4gV2ViUFBpY3R1cmVBbGxvY1lVVkEocGljdHVyZSwgd2lkdGgsIGhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBXZWJQUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUFBpY3R1cmVGcmVlKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5Xyk7CisgICAgV2ViUFNhZmVGcmVlKHBpY3R1cmUtPm1lbW9yeV9hcmdiXyk7CisgICAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMocGljdHVyZSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBNZW1vcnlXcml0ZXI6IFdyaXRlLXRvLW1lbW9yeQorCit2b2lkIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcikgeworICB3cml0ZXItPm1lbSA9IE5VTEw7CisgIHdyaXRlci0+c2l6ZSA9IDA7CisgIHdyaXRlci0+bWF4X3NpemUgPSAwOworfQorCitpbnQgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IHcgPSAoV2ViUE1lbW9yeVdyaXRlciopcGljdHVyZS0+Y3VzdG9tX3B0cjsKKyAgdWludDY0X3QgbmV4dF9zaXplOworICBpZiAodyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgbmV4dF9zaXplID0gKHVpbnQ2NF90KXctPnNpemUgKyBkYXRhX3NpemU7CisgIGlmIChuZXh0X3NpemUgPiB3LT5tYXhfc2l6ZSkgeworICAgIHVpbnQ4X3QqIG5ld19tZW07CisgICAgdWludDY0X3QgbmV4dF9tYXhfc2l6ZSA9IDJVTEwgKiB3LT5tYXhfc2l6ZTsKKyAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IG5leHRfc2l6ZSkgbmV4dF9tYXhfc2l6ZSA9IG5leHRfc2l6ZTsKKyAgICBpZiAobmV4dF9tYXhfc2l6ZSA8IDgxOTJVTEwpIG5leHRfbWF4X3NpemUgPSA4MTkyVUxMOworICAgIG5ld19tZW0gPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MobmV4dF9tYXhfc2l6ZSwgMSk7CisgICAgaWYgKG5ld19tZW0gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICh3LT5zaXplID4gMCkgeworICAgICAgbWVtY3B5KG5ld19tZW0sIHctPm1lbSwgdy0+c2l6ZSk7CisgICAgfQorICAgIFdlYlBTYWZlRnJlZSh3LT5tZW0pOworICAgIHctPm1lbSA9IG5ld19tZW07CisgICAgLy8gZG93bi1jYXN0IGlzIG9rLCB0aGFua3MgdG8gV2ViUFNhZmVNYWxsb2MKKyAgICB3LT5tYXhfc2l6ZSA9IChzaXplX3QpbmV4dF9tYXhfc2l6ZTsKKyAgfQorICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgIG1lbWNweSh3LT5tZW0gKyB3LT5zaXplLCBkYXRhLCBkYXRhX3NpemUpOworICAgIHctPnNpemUgKz0gZGF0YV9zaXplOworICB9CisgIHJldHVybiAxOworfQorCit2b2lkIFdlYlBNZW1vcnlXcml0ZXJDbGVhcihXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpIHsKKyAgaWYgKHdyaXRlciAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKHdyaXRlci0+bWVtKTsKKyAgICB3cml0ZXItPm1lbSA9IE5VTEw7CisgICAgd3JpdGVyLT5zaXplID0gMDsKKyAgICB3cml0ZXItPm1heF9zaXplID0gMDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlc3QgaGlnaC1sZXZlbCBjYWxsczoKKwordHlwZWRlZiBpbnQgKCpJbXBvcnRlcikoV2ViUFBpY3R1cmUqIGNvbnN0LCBjb25zdCB1aW50OF90KiBjb25zdCwgaW50KTsKKworc3RhdGljIHNpemVfdCBFbmNvZGUoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgaW1wb3J0LCBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgaW50IGxvc3NsZXNzLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCkgeworICBXZWJQUGljdHVyZSBwaWM7CisgIFdlYlBDb25maWcgY29uZmlnOworICBXZWJQTWVtb3J5V3JpdGVyIHdydDsKKyAgaW50IG9rOworCisgIGlmIChvdXRwdXQgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKCFXZWJQQ29uZmlnUHJlc2V0KCZjb25maWcsIFdFQlBfUFJFU0VUX0RFRkFVTFQsIHF1YWxpdHlfZmFjdG9yKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmcGljKSkgeworICAgIHJldHVybiAwOyAgLy8gc2hvdWxkbid0IGhhcHBlbiwgZXhjZXB0IGlmIHN5c3RlbSBpbnN0YWxsYXRpb24gaXMgYnJva2VuCisgIH0KKworICBjb25maWcubG9zc2xlc3MgPSAhIWxvc3NsZXNzOworICBwaWMudXNlX2FyZ2IgPSAhIWxvc3NsZXNzOworICBwaWMud2lkdGggPSB3aWR0aDsKKyAgcGljLmhlaWdodCA9IGhlaWdodDsKKyAgcGljLndyaXRlciA9IFdlYlBNZW1vcnlXcml0ZTsKKyAgcGljLmN1c3RvbV9wdHIgPSAmd3J0OworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmd3J0KTsKKworICBvayA9IGltcG9ydCgmcGljLCByZ2JhLCBzdHJpZGUpICYmIFdlYlBFbmNvZGUoJmNvbmZpZywgJnBpYyk7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGljKTsKKyAgaWYgKCFvaykgeworICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmd3J0KTsKKyAgICAqb3V0cHV0ID0gTlVMTDsKKyAgICByZXR1cm4gMDsKKyAgfQorICAqb3V0cHV0ID0gd3J0Lm1lbTsKKyAgcmV0dXJuIHdydC5zaXplOworfQorCisjZGVmaW5lIEVOQ09ERV9GVU5DKE5BTUUsIElNUE9SVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzaXplX3QgTkFNRShjb25zdCB1aW50OF90KiBpbiwgaW50IHcsIGludCBoLCBpbnQgYnBzLCBmbG9hdCBxLCAgICAgICAgICBcCisgICAgICAgICAgICB1aW50OF90Kiogb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHJldHVybiBFbmNvZGUoaW4sIHcsIGgsIGJwcywgSU1QT1JURVIsIHEsIDAsIG91dCk7ICAgICAgICAgICAgICAgICAgICBcCit9CisKK0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVSR0IsIFdlYlBQaWN0dXJlSW1wb3J0UkdCKQorRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUJHUiwgV2ViUFBpY3R1cmVJbXBvcnRCR1IpCitFTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKQorRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUJHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSkKKworI3VuZGVmIEVOQ09ERV9GVU5DCisKKyNkZWZpbmUgTE9TU0xFU1NfREVGQVVMVF9RVUFMSVRZIDcwLgorI2RlZmluZSBMT1NTTEVTU19FTkNPREVfRlVOQyhOQU1FLCBJTVBPUlRFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzaXplX3QgTkFNRShjb25zdCB1aW50OF90KiBpbiwgaW50IHcsIGludCBoLCBpbnQgYnBzLCB1aW50OF90Kiogb3V0KSB7ICAgICAgIFwKKyAgcmV0dXJuIEVuY29kZShpbiwgdywgaCwgYnBzLCBJTVBPUlRFUiwgTE9TU0xFU1NfREVGQVVMVF9RVUFMSVRZLCAxLCBvdXQpOyAgXAorfQorCitMT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NSR0IsIFdlYlBQaWN0dXJlSW1wb3J0UkdCKQorTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUikKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSkKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSkKKworI3VuZGVmIExPU1NMRVNTX0VOQ09ERV9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9jc3AuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX2NzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmM5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9jc3AuYwpAQCAtMCwwICsxLDExNjggQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBXZWJQUGljdHVyZSB1dGlscyBmb3IgY29sb3JzcGFjZSBjb252ZXJzaW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGVuY2kuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC95dXYuaCIKKworLy8gVW5jb21tZW50IHRvIGRpc2FibGUgZ2FtbWEtY29tcHJlc3Npb24gZHVyaW5nIFJHQi0+VS9WIGF2ZXJhZ2luZworI2RlZmluZSBVU0VfR0FNTUFfQ09NUFJFU1NJT04KKworLy8gSWYgZGVmaW5lZCwgdXNlIHRhYmxlIHRvIGNvbXB1dGUgeCAvIGFscGhhLgorI2RlZmluZSBVU0VfSU5WRVJTRV9BTFBIQV9UQUJMRQorCitzdGF0aWMgY29uc3QgdW5pb24geworICB1aW50MzJfdCBhcmdiOworICB1aW50OF90ICBieXRlc1s0XTsKK30gdGVzdF9lbmRpYW4gPSB7IDB4ZmYwMDAwMDB1IH07CisjZGVmaW5lIEFMUEhBX0lTX0xBU1QgKHRlc3RfZW5kaWFuLmJ5dGVzWzNdID09IDB4ZmYpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZXRlY3Rpb24gb2Ygbm9uLXRyaXZpYWwgdHJhbnNwYXJlbmN5CisKKy8vIFJldHVybnMgdHJ1ZSBpZiBhbHBoYVtdIGhhcyBub24tMHhmZiB2YWx1ZXMuCitzdGF0aWMgaW50IENoZWNrTm9uT3BhcXVlKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0ZXAsIGludCB5X3N0ZXApIHsKKyAgaWYgKGFscGhhID09IE5VTEwpIHJldHVybiAwOworICB3aGlsZSAoaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICogeF9zdGVwOyB4ICs9IHhfc3RlcCkgeworICAgICAgaWYgKGFscGhhW3hdICE9IDB4ZmYpIHJldHVybiAxOyAgLy8gVE9ETyhza2FsKTogY2hlY2sgNC84IGJ5dGVzIGF0IGEgdGltZS4KKyAgICB9CisgICAgYWxwaGEgKz0geV9zdGVwOworICB9CisgIHJldHVybiAwOworfQorCisvLyBDaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIG5vbi1vcGFxdWUgYWxwaGEuCitpbnQgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUocGljdHVyZS0+YSwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgcGljdHVyZS0+YV9zdHJpZGUpOworICB9IGVsc2UgeworICAgIGludCB4LCB5OworICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljdHVyZS0+YXJnYjsKKyAgICBpZiAoYXJnYiA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgcGljdHVyZS0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBwaWN0dXJlLT53aWR0aDsgKyt4KSB7CisgICAgICAgIGlmIChhcmdiW3hdIDwgMHhmZjAwMDAwMHUpIHJldHVybiAxOyAgIC8vIHRlc3QgYW55IGFscGhhIHZhbHVlcyAhPSAweGZmCisgICAgICB9CisgICAgICBhcmdiICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIGdhbW1hIGNvcnJlY3Rpb24KKworI2lmIGRlZmluZWQoVVNFX0dBTU1BX0NPTVBSRVNTSU9OKQorCisvLyBnYW1tYS1jb21wZW5zYXRlcyBsb3NzIG9mIHJlc29sdXRpb24gZHVyaW5nIGNocm9tYSBzdWJzYW1wbGluZworI2RlZmluZSBrR2FtbWEgMC44MCAgICAgIC8vIGZvciBub3cgd2UgdXNlIGEgZGlmZmVyZW50IGdhbW1hIHZhbHVlIHRoYW4ga0dhbW1hRgorI2RlZmluZSBrR2FtbWFGaXggMTIgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgbGluZWFyIHZhbHVlcworI2RlZmluZSBrR2FtbWFTY2FsZSAoKDEgPDwga0dhbW1hRml4KSAtIDEpCisjZGVmaW5lIGtHYW1tYVRhYkZpeCA3ICAgLy8gZml4ZWQtcG9pbnQgZnJhY3Rpb25hbCBiaXRzIHByZWNpc2lvbgorI2RlZmluZSBrR2FtbWFUYWJTY2FsZSAoMSA8PCBrR2FtbWFUYWJGaXgpCisjZGVmaW5lIGtHYW1tYVRhYlJvdW5kZXIgKGtHYW1tYVRhYlNjYWxlID4+IDEpCisjZGVmaW5lIGtHYW1tYVRhYlNpemUgKDEgPDwgKGtHYW1tYUZpeCAtIGtHYW1tYVRhYkZpeCkpCisKK3N0YXRpYyBpbnQga0xpbmVhclRvR2FtbWFUYWJba0dhbW1hVGFiU2l6ZSArIDFdOworc3RhdGljIHVpbnQxNl90IGtHYW1tYVRvTGluZWFyVGFiWzI1Nl07CitzdGF0aWMgdm9sYXRpbGUgaW50IGtHYW1tYVRhYmxlc09rID0gMDsKKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2FtbWFUYWJsZXModm9pZCkgeworICBpZiAoIWtHYW1tYVRhYmxlc09rKSB7CisgICAgaW50IHY7CisgICAgY29uc3QgZG91YmxlIHNjYWxlID0gKGRvdWJsZSkoMSA8PCBrR2FtbWFUYWJGaXgpIC8ga0dhbW1hU2NhbGU7CisgICAgY29uc3QgZG91YmxlIG5vcm0gPSAxLiAvIDI1NS47CisgICAgZm9yICh2ID0gMDsgdiA8PSAyNTU7ICsrdikgeworICAgICAga0dhbW1hVG9MaW5lYXJUYWJbdl0gPQorICAgICAgICAgICh1aW50MTZfdCkocG93KG5vcm0gKiB2LCBrR2FtbWEpICoga0dhbW1hU2NhbGUgKyAuNSk7CisgICAgfQorICAgIGZvciAodiA9IDA7IHYgPD0ga0dhbW1hVGFiU2l6ZTsgKyt2KSB7CisgICAgICBrTGluZWFyVG9HYW1tYVRhYlt2XSA9IChpbnQpKDI1NS4gKiBwb3coc2NhbGUgKiB2LCAxLiAvIGtHYW1tYSkgKyAuNSk7CisgICAgfQorICAgIGtHYW1tYVRhYmxlc09rID0gMTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2FtbWFUb0xpbmVhcih1aW50OF90IHYpIHsKKyAgcmV0dXJuIGtHYW1tYVRvTGluZWFyVGFiW3ZdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEludGVycG9sYXRlKGludCB2KSB7CisgIGNvbnN0IGludCB0YWJfcG9zID0gdiA+PiAoa0dhbW1hVGFiRml4ICsgMik7ICAgIC8vIGludGVnZXIgcGFydAorICBjb25zdCBpbnQgeCA9IHYgJiAoKGtHYW1tYVRhYlNjYWxlIDw8IDIpIC0gMSk7ICAvLyBmcmFjdGlvbmFsIHBhcnQKKyAgY29uc3QgaW50IHYwID0ga0xpbmVhclRvR2FtbWFUYWJbdGFiX3Bvc107CisgIGNvbnN0IGludCB2MSA9IGtMaW5lYXJUb0dhbW1hVGFiW3RhYl9wb3MgKyAxXTsKKyAgY29uc3QgaW50IHkgPSB2MSAqIHggKyB2MCAqICgoa0dhbW1hVGFiU2NhbGUgPDwgMikgLSB4KTsgICAvLyBpbnRlcnBvbGF0ZQorICBhc3NlcnQodGFiX3BvcyArIDEgPCBrR2FtbWFUYWJTaXplICsgMSk7CisgIHJldHVybiB5OworfQorCisvLyBDb252ZXJ0IGEgbGluZWFyIHZhbHVlICd2JyB0byBZVVZfRklYKzIgZml4ZWQtcG9pbnQgcHJlY2lzaW9uCisvLyBVL1YgdmFsdWUsIHN1aXRhYmxlIGZvciBSR0JUb1UvViBjYWxscy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYSh1aW50MzJfdCBiYXNlX3ZhbHVlLCBpbnQgc2hpZnQpIHsKKyAgY29uc3QgaW50IHkgPSBJbnRlcnBvbGF0ZShiYXNlX3ZhbHVlIDw8IHNoaWZ0KTsgICAvLyBmaW5hbCB1cGxpZnRlZCB2YWx1ZQorICByZXR1cm4gKHkgKyBrR2FtbWFUYWJSb3VuZGVyKSA+PiBrR2FtbWFUYWJGaXg7ICAgIC8vIGRlc2NhbGUKK30KKworI2Vsc2UKKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2FtbWFUYWJsZXModm9pZCkge30KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHYW1tYVRvTGluZWFyKHVpbnQ4X3QgdikgeyByZXR1cm4gdjsgfQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBMaW5lYXJUb0dhbW1hKHVpbnQzMl90IGJhc2VfdmFsdWUsIGludCBzaGlmdCkgeworICByZXR1cm4gKGludCkoYmFzZV92YWx1ZSA8PCBzaGlmdCk7Cit9CisKKyNlbmRpZiAgICAvLyBVU0VfR0FNTUFfQ09NUFJFU1NJT04KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgorCitzdGF0aWMgaW50IFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1kociwgZywgYiwgWVVWX0hBTEYpCisgICAgICAgICAgICAgICAgICAgICAgOiBWUDhSR0JUb1kociwgZywgYiwgVlA4UmFuZG9tQml0cyhyZywgWVVWX0ZJWCkpOworfQorCitzdGF0aWMgaW50IFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1UociwgZywgYiwgWVVWX0hBTEYgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvVShyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYICsgMikpOworfQorCitzdGF0aWMgaW50IFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiLCBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIHJldHVybiAocmcgPT0gTlVMTCkgPyBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvVihyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYICsgMikpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU21hcnQgUkdCLT5ZVVYgY29udmVyc2lvbgorCitzdGF0aWMgY29uc3QgaW50IGtOdW1JdGVyYXRpb25zID0gNjsKK3N0YXRpYyBjb25zdCBpbnQga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24gPSA0OworCisvLyBXZSBjb3VsZCB1c2UgU0ZJWD0wIGFuZCBvbmx5IHVpbnQ4X3QgZm9yIGZpeGVkX3lfdCwgYnV0IGl0IHByb2R1Y2VzIHNvbWUKKy8vIGJhbmRpbmcgc29tZXRpbWVzLiBCZXR0ZXIgdXNlIGV4dHJhIHByZWNpc2lvbi4KKyNkZWZpbmUgU0ZJWCAyICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBvZiBSR0IgYW5kIFkvVwordHlwZWRlZiBpbnQxNl90IGZpeGVkX3Q7ICAgICAgLy8gc2lnbmVkIHR5cGUgd2l0aCBleHRyYSBTRklYIHByZWNpc2lvbiBmb3IgVVYKK3R5cGVkZWYgdWludDE2X3QgZml4ZWRfeV90OyAgIC8vIHVuc2lnbmVkIHR5cGUgd2l0aCBleHRyYSBTRklYIHByZWNpc2lvbiBmb3IgVworCisjZGVmaW5lIFNIQUxGICgxIDw8IFNGSVggPj4gMSkKKyNkZWZpbmUgTUFYX1lfVCAoKDI1NiA8PCBTRklYKSAtIDEpCisjZGVmaW5lIFNST1VOREVSICgxIDw8IChZVVZfRklYICsgU0ZJWCAtIDEpKQorCisjaWYgZGVmaW5lZChVU0VfR0FNTUFfQ09NUFJFU1NJT04pCisKKy8vIGZsb2F0IHZhcmlhbnQgb2YgZ2FtbWEtY29ycmVjdGlvbgorLy8gV2UgdXNlIHRhYmxlcyBvZiBkaWZmZXJlbnQgc2l6ZSBhbmQgcHJlY2lzaW9uLCBhbG9uZyB3aXRoIGEgJ3JlYWwtd29ybGQnCisvLyBHYW1tYSB2YWx1ZSBjbG9zZSB0byB+Mi4KKyNkZWZpbmUga0dhbW1hRiAyLjIKK3N0YXRpYyBmbG9hdCBrR2FtbWFUb0xpbmVhclRhYkZbTUFYX1lfVCArIDFdOyAgIC8vIHNpemUgc2NhbGVzIHdpdGggWV9GSVgKK3N0YXRpYyBmbG9hdCBrTGluZWFyVG9HYW1tYVRhYkZba0dhbW1hVGFiU2l6ZSArIDJdOworc3RhdGljIHZvbGF0aWxlIGludCBrR2FtbWFUYWJsZXNGT2sgPSAwOworCitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRHYW1tYVRhYmxlc0Yodm9pZCkgeworICBpZiAoIWtHYW1tYVRhYmxlc0ZPaykgeworICAgIGludCB2OworICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyBNQVhfWV9UOworICAgIGNvbnN0IGRvdWJsZSBzY2FsZSA9IDEuIC8ga0dhbW1hVGFiU2l6ZTsKKyAgICBmb3IgKHYgPSAwOyB2IDw9IE1BWF9ZX1Q7ICsrdikgeworICAgICAga0dhbW1hVG9MaW5lYXJUYWJGW3ZdID0gKGZsb2F0KXBvdyhub3JtICogdiwga0dhbW1hRik7CisgICAgfQorICAgIGZvciAodiA9IDA7IHYgPD0ga0dhbW1hVGFiU2l6ZTsgKyt2KSB7CisgICAgICBrTGluZWFyVG9HYW1tYVRhYkZbdl0gPSAoZmxvYXQpKE1BWF9ZX1QgKiBwb3coc2NhbGUgKiB2LCAxLiAvIGtHYW1tYUYpKTsKKyAgICB9CisgICAgLy8gdG8gcHJldmVudCBzbWFsbCByb3VuZGluZyBlcnJvcnMgdG8gY2F1c2UgcmVhZC1vdmVyZmxvdzoKKyAgICBrTGluZWFyVG9HYW1tYVRhYkZba0dhbW1hVGFiU2l6ZSArIDFdID0ga0xpbmVhclRvR2FtbWFUYWJGW2tHYW1tYVRhYlNpemVdOworICAgIGtHYW1tYVRhYmxlc0ZPayA9IDE7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IEdhbW1hVG9MaW5lYXJGKGludCB2KSB7CisgIHJldHVybiBrR2FtbWFUb0xpbmVhclRhYkZbdl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYUYoZmxvYXQgdmFsdWUpIHsKKyAgY29uc3QgZmxvYXQgdiA9IHZhbHVlICoga0dhbW1hVGFiU2l6ZTsKKyAgY29uc3QgaW50IHRhYl9wb3MgPSAoaW50KXY7CisgIGNvbnN0IGZsb2F0IHggPSB2IC0gKGZsb2F0KXRhYl9wb3M7ICAgICAgLy8gZnJhY3Rpb25hbCBwYXJ0CisgIGNvbnN0IGZsb2F0IHYwID0ga0xpbmVhclRvR2FtbWFUYWJGW3RhYl9wb3MgKyAwXTsKKyAgY29uc3QgZmxvYXQgdjEgPSBrTGluZWFyVG9HYW1tYVRhYkZbdGFiX3BvcyArIDFdOworICBjb25zdCBmbG9hdCB5ID0gdjEgKiB4ICsgdjAgKiAoMS5mIC0geCk7ICAvLyBpbnRlcnBvbGF0ZQorICByZXR1cm4gKGludCkoeSArIC41KTsKK30KKworI2Vsc2UKKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2FtbWFUYWJsZXNGKHZvaWQpIHt9CitzdGF0aWMgV0VCUF9JTkxJTkUgZmxvYXQgR2FtbWFUb0xpbmVhckYoaW50IHYpIHsKKyAgY29uc3QgZmxvYXQgbm9ybSA9IDEuZiAvIE1BWF9ZX1Q7CisgIHJldHVybiBub3JtICogdjsKK30KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYUYoZmxvYXQgdmFsdWUpIHsKKyAgcmV0dXJuIChpbnQpKE1BWF9ZX1QgKiB2YWx1ZSArIC41KTsKK30KKworI2VuZGlmICAgIC8vIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdWludDhfdCBjbGlwXzhiKGZpeGVkX3QgdikgeworICByZXR1cm4gKCEodiAmIH4weGZmKSkgPyAodWludDhfdCl2IDogKHYgPCAwKSA/IDB1IDogMjU1dTsKK30KKworc3RhdGljIGZpeGVkX3lfdCBjbGlwX3koaW50IHkpIHsKKyAgcmV0dXJuICghKHkgJiB+TUFYX1lfVCkpID8gKGZpeGVkX3lfdCl5IDogKHkgPCAwKSA/IDAgOiBNQVhfWV9UOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFJHQlRvR3JheShpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCBsdW1hID0gMTk1OTUgKiByICsgMzg0NzAgKiBnICsgNzQ3MSAqIGIgKyBZVVZfSEFMRjsKKyAgcmV0dXJuIChsdW1hID4+IFlVVl9GSVgpOworfQorCitzdGF0aWMgZmxvYXQgUkdCVG9HcmF5RihmbG9hdCByLCBmbG9hdCBnLCBmbG9hdCBiKSB7CisgIHJldHVybiAwLjI5OWYgKiByICsgMC41ODdmICogZyArIDAuMTE0ZiAqIGI7Cit9CisKK3N0YXRpYyBpbnQgU2NhbGVEb3duKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CisgIGNvbnN0IGZsb2F0IEEgPSBHYW1tYVRvTGluZWFyRihhKTsKKyAgY29uc3QgZmxvYXQgQiA9IEdhbW1hVG9MaW5lYXJGKGIpOworICBjb25zdCBmbG9hdCBDID0gR2FtbWFUb0xpbmVhckYoYyk7CisgIGNvbnN0IGZsb2F0IEQgPSBHYW1tYVRvTGluZWFyRihkKTsKKyAgcmV0dXJuIExpbmVhclRvR2FtbWFGKDAuMjVmICogKEEgKyBCICsgQyArIEQpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlVyhjb25zdCBmaXhlZF95X3QqIHNyYywgZml4ZWRfeV90KiBkc3QsIGludCBsZW4pIHsKKyAgd2hpbGUgKGxlbi0tID4gMCkgeworICAgIGNvbnN0IGZsb2F0IFIgPSBHYW1tYVRvTGluZWFyRihzcmNbMF0pOworICAgIGNvbnN0IGZsb2F0IEcgPSBHYW1tYVRvTGluZWFyRihzcmNbMV0pOworICAgIGNvbnN0IGZsb2F0IEIgPSBHYW1tYVRvTGluZWFyRihzcmNbMl0pOworICAgIGNvbnN0IGZsb2F0IFkgPSBSR0JUb0dyYXlGKFIsIEcsIEIpOworICAgICpkc3QrKyA9IChmaXhlZF95X3QpTGluZWFyVG9HYW1tYUYoWSk7CisgICAgc3JjICs9IDM7CisgIH0KK30KKworc3RhdGljIGludCBVcGRhdGVDaHJvbWEoY29uc3QgZml4ZWRfeV90KiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfeV90KiBzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfdCogZHN0LCBmaXhlZF95X3QqIHRtcCwgaW50IGxlbikgeworICBpbnQgZGlmZiA9IDA7CisgIHdoaWxlIChsZW4tLT4gMCkgeworICAgIGNvbnN0IGludCByID0gU2NhbGVEb3duKHNyYzFbMF0sIHNyYzFbM10sIHNyYzJbMF0sIHNyYzJbM10pOworICAgIGNvbnN0IGludCBnID0gU2NhbGVEb3duKHNyYzFbMV0sIHNyYzFbNF0sIHNyYzJbMV0sIHNyYzJbNF0pOworICAgIGNvbnN0IGludCBiID0gU2NhbGVEb3duKHNyYzFbMl0sIHNyYzFbNV0sIHNyYzJbMl0sIHNyYzJbNV0pOworICAgIGNvbnN0IGludCBXID0gUkdCVG9HcmF5KHIsIGcsIGIpOworICAgIGNvbnN0IGludCByX2F2ZyA9IChzcmMxWzBdICsgc3JjMVszXSArIHNyYzJbMF0gKyBzcmMyWzNdICsgMikgPj4gMjsKKyAgICBjb25zdCBpbnQgZ19hdmcgPSAoc3JjMVsxXSArIHNyYzFbNF0gKyBzcmMyWzFdICsgc3JjMls0XSArIDIpID4+IDI7CisgICAgY29uc3QgaW50IGJfYXZnID0gKHNyYzFbMl0gKyBzcmMxWzVdICsgc3JjMlsyXSArIHNyYzJbNV0gKyAyKSA+PiAyOworICAgIGRzdFswXSA9IChmaXhlZF90KShyIC0gVyk7CisgICAgZHN0WzFdID0gKGZpeGVkX3QpKGcgLSBXKTsKKyAgICBkc3RbMl0gPSAoZml4ZWRfdCkoYiAtIFcpOworICAgIGRzdCArPSAzOworICAgIHNyYzEgKz0gNjsKKyAgICBzcmMyICs9IDY7CisgICAgaWYgKHRtcCAhPSBOVUxMKSB7CisgICAgICB0bXBbMF0gPSB0bXBbMV0gPSBjbGlwX3koVyk7CisgICAgICB0bXAgKz0gMjsKKyAgICB9CisgICAgZGlmZiArPSBhYnMoUkdCVG9HcmF5KHJfYXZnLCBnX2F2ZywgYl9hdmcpIC0gVyk7CisgIH0KKyAgcmV0dXJuIGRpZmY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgRmlsdGVyKGNvbnN0IGZpeGVkX3QqIGNvbnN0IEEsIGNvbnN0IGZpeGVkX3QqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHR3aXNlKSB7CisgIGludCB2OworICBpZiAoIXJpZ2h0d2lzZSkgeworICAgIHYgPSAoQVswXSAqIDkgKyBBWy0zXSAqIDMgKyBCWzBdICogMyArIEJbLTNdKTsKKyAgfSBlbHNlIHsKKyAgICB2ID0gKEFbMF0gKiA5ICsgQVsrM10gKiAzICsgQlswXSAqIDMgKyBCWyszXSk7CisgIH0KKyAgcmV0dXJuICh2ICsgOCkgPj4gNDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBGaWx0ZXIyKGludCBBLCBpbnQgQikgeyByZXR1cm4gKEEgKiAzICsgQiArIDIpID4+IDI7IH0KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGZpeGVkX3lfdCBVcExpZnQodWludDhfdCBhKSB7ICAvLyA4Yml0IC0+IFNGSVgKKyAgcmV0dXJuICgoZml4ZWRfeV90KWEgPDwgU0ZJWCkgfCBTSEFMRjsKK30KKworc3RhdGljIHZvaWQgSW1wb3J0T25lUm93KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWNfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfeV90KiBjb25zdCBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBwaWNfd2lkdGg7ICsraSkgeworICAgIGNvbnN0IGludCBvZmYgPSBpICogc3RlcDsKKyAgICBkc3RbMyAqIGkgKyAwXSA9IFVwTGlmdChyX3B0cltvZmZdKTsKKyAgICBkc3RbMyAqIGkgKyAxXSA9IFVwTGlmdChnX3B0cltvZmZdKTsKKyAgICBkc3RbMyAqIGkgKyAyXSA9IFVwTGlmdChiX3B0cltvZmZdKTsKKyAgfQorICBpZiAocGljX3dpZHRoICYgMSkgeyAgLy8gcmVwbGljYXRlIHJpZ2h0bW9zdCBwaXhlbAorICAgIG1lbWNweShkc3QgKyAzICogcGljX3dpZHRoLCBkc3QgKyAzICogKHBpY193aWR0aCAtIDEpLCAzICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbnRlcnBvbGF0ZVR3b1Jvd3MoY29uc3QgZml4ZWRfeV90KiBjb25zdCBiZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogY29uc3QgcHJldl91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXhlZF90KiBjb25zdCBjdXJfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogY29uc3QgbmV4dF91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF95X3QqIGNvbnN0IG91dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfeV90KiBjb25zdCBvdXQyKSB7CisgIGludCBpLCBrOworICB7ICAvLyBzcGVjaWFsIGJvdW5kYXJ5IGNhc2UgZm9yIGk9PTAKKyAgICBjb25zdCBpbnQgVzAgPSBiZXN0X3lbMF07CisgICAgY29uc3QgaW50IFcxID0gYmVzdF95W3ddOworICAgIGZvciAoayA9IDA7IGsgPD0gMjsgKytrKSB7CisgICAgICBvdXQxW2tdID0gY2xpcF95KEZpbHRlcjIoY3VyX3V2W2tdLCBwcmV2X3V2W2tdKSArIFcwKTsKKyAgICAgIG91dDJba10gPSBjbGlwX3koRmlsdGVyMihjdXJfdXZba10sIG5leHRfdXZba10pICsgVzEpOworICAgIH0KKyAgfQorICBmb3IgKGkgPSAxOyBpIDwgdyAtIDE7ICsraSkgeworICAgIGNvbnN0IGludCBXMCA9IGJlc3RfeVtpICsgMF07CisgICAgY29uc3QgaW50IFcxID0gYmVzdF95W2kgKyB3XTsKKyAgICBjb25zdCBpbnQgb2ZmID0gMyAqIChpID4+IDEpOworICAgIGZvciAoayA9IDA7IGsgPD0gMjsgKytrKSB7CisgICAgICBjb25zdCBpbnQgdG1wMCA9IEZpbHRlcihjdXJfdXYgKyBvZmYgKyBrLCBwcmV2X3V2ICsgb2ZmICsgaywgaSAmIDEpOworICAgICAgY29uc3QgaW50IHRtcDEgPSBGaWx0ZXIoY3VyX3V2ICsgb2ZmICsgaywgbmV4dF91diArIG9mZiArIGssIGkgJiAxKTsKKyAgICAgIG91dDFbMyAqIGkgKyBrXSA9IGNsaXBfeSh0bXAwICsgVzApOworICAgICAgb3V0MlszICogaSArIGtdID0gY2xpcF95KHRtcDEgKyBXMSk7CisgICAgfQorICB9CisgIHsgIC8vIHNwZWNpYWwgYm91bmRhcnkgY2FzZSBmb3IgaSA9PSB3IC0gMQorICAgIGNvbnN0IGludCBXMCA9IGJlc3RfeVtpICsgMF07CisgICAgY29uc3QgaW50IFcxID0gYmVzdF95W2kgKyB3XTsKKyAgICBjb25zdCBpbnQgb2ZmID0gMyAqIChpID4+IDEpOworICAgIGZvciAoayA9IDA7IGsgPD0gMjsgKytrKSB7CisgICAgICBvdXQxWzMgKiBpICsga10gPSBjbGlwX3koRmlsdGVyMihjdXJfdXZbb2ZmICsga10sIHByZXZfdXZbb2ZmICsga10pICsgVzApOworICAgICAgb3V0MlszICogaSArIGtdID0gY2xpcF95KEZpbHRlcjIoY3VyX3V2W29mZiArIGtdLCBuZXh0X3V2W29mZiArIGtdKSArIFcxKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgQ29udmVydFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCBsdW1hID0gMTY4MzkgKiByICsgMzMwNTkgKiBnICsgNjQyMCAqIGIgKyBTUk9VTkRFUjsKKyAgcmV0dXJuIGNsaXBfOGIoMTYgKyAobHVtYSA+PiAoWVVWX0ZJWCArIFNGSVgpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IENvbnZlcnRSR0JUb1UoaW50IHIsIGludCBnLCBpbnQgYikgeworICBjb25zdCBpbnQgdSA9ICAtOTcxOSAqIHIgLSAxOTA4MSAqIGcgKyAyODgwMCAqIGIgKyBTUk9VTkRFUjsKKyAgcmV0dXJuIGNsaXBfOGIoMTI4ICsgKHUgPj4gKFlVVl9GSVggKyBTRklYKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBDb252ZXJ0UkdCVG9WKGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IHYgPSArMjg4MDAgKiByIC0gMjQxMTYgKiBnIC0gIDQ2ODQgKiBiICsgU1JPVU5ERVI7CisgIHJldHVybiBjbGlwXzhiKDEyOCArICh2ID4+IChZVVZfRklYICsgU0ZJWCkpKTsKK30KKworc3RhdGljIGludCBDb252ZXJ0V1JHQlRvWVVWKGNvbnN0IGZpeGVkX3lfdCogY29uc3QgYmVzdF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeGVkX3QqIGNvbnN0IGJlc3RfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IGludCB3ID0gKHBpY3R1cmUtPndpZHRoICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IGggPSAocGljdHVyZS0+aGVpZ2h0ICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IHV2X3cgPSB3ID4+IDE7CisgIGNvbnN0IGludCB1dl9oID0gaCA+PiAxOworICBmb3IgKGogPSAwOyBqIDwgcGljdHVyZS0+aGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljdHVyZS0+d2lkdGg7ICsraSkgeworICAgICAgY29uc3QgaW50IG9mZiA9IDMgKiAoKGkgPj4gMSkgKyAoaiA+PiAxKSAqIHV2X3cpOworICAgICAgY29uc3QgaW50IG9mZjIgPSBpICsgaiAqIHBpY3R1cmUtPnlfc3RyaWRlOworICAgICAgY29uc3QgaW50IFcgPSBiZXN0X3lbaSArIGogKiB3XTsKKyAgICAgIGNvbnN0IGludCByID0gYmVzdF91dltvZmYgKyAwXSArIFc7CisgICAgICBjb25zdCBpbnQgZyA9IGJlc3RfdXZbb2ZmICsgMV0gKyBXOworICAgICAgY29uc3QgaW50IGIgPSBiZXN0X3V2W29mZiArIDJdICsgVzsKKyAgICAgIHBpY3R1cmUtPnlbb2ZmMl0gPSBDb252ZXJ0UkdCVG9ZKHIsIGcsIGIpOworICAgIH0KKyAgfQorICBmb3IgKGogPSAwOyBqIDwgdXZfaDsgKytqKSB7CisgICAgdWludDhfdCogY29uc3QgZHN0X3UgPSBwaWN0dXJlLT51ICsgaiAqIHBpY3R1cmUtPnV2X3N0cmlkZTsKKyAgICB1aW50OF90KiBjb25zdCBkc3RfdiA9IHBpY3R1cmUtPnYgKyBqICogcGljdHVyZS0+dXZfc3RyaWRlOworICAgIGZvciAoaSA9IDA7IGkgPCB1dl93OyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBvZmYgPSAzICogKGkgKyBqICogdXZfdyk7CisgICAgICBjb25zdCBpbnQgciA9IGJlc3RfdXZbb2ZmICsgMF07CisgICAgICBjb25zdCBpbnQgZyA9IGJlc3RfdXZbb2ZmICsgMV07CisgICAgICBjb25zdCBpbnQgYiA9IGJlc3RfdXZbb2ZmICsgMl07CisgICAgICBkc3RfdVtpXSA9IENvbnZlcnRSR0JUb1UociwgZywgYik7CisgICAgICBkc3RfdltpXSA9IENvbnZlcnRSR0JUb1YociwgZywgYik7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBmdW5jdGlvbgorCisjZGVmaW5lIFNBRkVfQUxMT0MoVywgSCwgVCkgKChUKilXZWJQU2FmZU1hbGxvYygoVykgKiAoSCksIHNpemVvZihUKSkpCisKK3N0YXRpYyBpbnQgUHJlcHJvY2Vzc0FSR0IoY29uc3QgdWludDhfdCogY29uc3Qgcl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBiX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICAvLyB3ZSBleHBhbmQgdGhlIHJpZ2h0L2JvdHRvbSBib3JkZXIgaWYgbmVlZGVkCisgIGNvbnN0IGludCB3ID0gKHBpY3R1cmUtPndpZHRoICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IGggPSAocGljdHVyZS0+aGVpZ2h0ICsgMSkgJiB+MTsKKyAgY29uc3QgaW50IHV2X3cgPSB3ID4+IDE7CisgIGNvbnN0IGludCB1dl9oID0gaCA+PiAxOworICBpbnQgaSwgaiwgaXRlcjsKKworICAvLyBUT0RPKHNrYWwpOiBhbGxvY2F0ZSBvbmUgYmlnIG1lbW9yeSBjaHVuay4gQnV0IGZvciBub3csIGl0J3MgZWFzaWVyCisgIC8vIGZvciB2YWxncmluZCBkZWJ1Z2dpbmcgdG8gaGF2ZSBzZXZlcmFsIGNodW5rcy4KKyAgZml4ZWRfeV90KiBjb25zdCB0bXBfYnVmZmVyID0gU0FGRV9BTExPQyh3ICogMywgMiwgZml4ZWRfeV90KTsgICAvLyBzY3JhdGNoCisgIGZpeGVkX3lfdCogY29uc3QgYmVzdF95ID0gU0FGRV9BTExPQyh3LCBoLCBmaXhlZF95X3QpOworICBmaXhlZF95X3QqIGNvbnN0IHRhcmdldF95ID0gU0FGRV9BTExPQyh3LCBoLCBmaXhlZF95X3QpOworICBmaXhlZF95X3QqIGNvbnN0IGJlc3RfcmdiX3kgPSBTQUZFX0FMTE9DKHcsIDIsIGZpeGVkX3lfdCk7CisgIGZpeGVkX3QqIGNvbnN0IGJlc3RfdXYgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCB1dl9oLCBmaXhlZF90KTsKKyAgZml4ZWRfdCogY29uc3QgdGFyZ2V0X3V2ID0gU0FGRV9BTExPQyh1dl93ICogMywgdXZfaCwgZml4ZWRfdCk7CisgIGZpeGVkX3QqIGNvbnN0IGJlc3RfcmdiX3V2ID0gU0FGRV9BTExPQyh1dl93ICogMywgMSwgZml4ZWRfdCk7CisgIGludCBvazsKKyAgaW50IGRpZmZfc3VtID0gMDsKKyAgY29uc3QgaW50IGZpcnN0X2RpZmZfdGhyZXNob2xkID0gKGludCkoMi41ICogdyAqIGgpOworICBjb25zdCBpbnQgbWluX2ltcHJvdmVtZW50ID0gNTsgICAvLyBzdG9wIGlmIGltcHJvdmVtZW50IGlzIGJlbG93IHRoaXMgJQorICBjb25zdCBpbnQgbWluX2ZpcnN0X2ltcHJvdmVtZW50ID0gODA7CisKKyAgaWYgKGJlc3RfeSA9PSBOVUxMIHx8IGJlc3RfdXYgPT0gTlVMTCB8fAorICAgICAgdGFyZ2V0X3kgPT0gTlVMTCB8fCB0YXJnZXRfdXYgPT0gTlVMTCB8fAorICAgICAgYmVzdF9yZ2JfeSA9PSBOVUxMIHx8IGJlc3RfcmdiX3V2ID09IE5VTEwgfHwKKyAgICAgIHRtcF9idWZmZXIgPT0gTlVMTCkgeworICAgIG9rID0gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorICBhc3NlcnQocGljdHVyZS0+d2lkdGggPj0ga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24pOworICBhc3NlcnQocGljdHVyZS0+aGVpZ2h0ID49IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKTsKKworICAvLyBJbXBvcnQgUkdCIHNhbXBsZXMgdG8gVy9SR0IgcmVwcmVzZW50YXRpb24uCisgIGZvciAoaiA9IDA7IGogPCBwaWN0dXJlLT5oZWlnaHQ7IGogKz0gMikgeworICAgIGNvbnN0IGludCBpc19sYXN0X3JvdyA9IChqID09IHBpY3R1cmUtPmhlaWdodCAtIDEpOworICAgIGZpeGVkX3lfdCogY29uc3Qgc3JjMSA9IHRtcF9idWZmZXI7CisgICAgZml4ZWRfeV90KiBjb25zdCBzcmMyID0gdG1wX2J1ZmZlciArIDMgKiB3OworICAgIGNvbnN0IGludCBvZmYxID0gaiAqIHJnYl9zdHJpZGU7CisgICAgY29uc3QgaW50IG9mZjIgPSBvZmYxICsgcmdiX3N0cmlkZTsKKyAgICBjb25zdCBpbnQgdXZfb2ZmID0gKGogPj4gMSkgKiAzICogdXZfdzsKKyAgICBmaXhlZF95X3QqIGNvbnN0IGRzdF95ID0gYmVzdF95ICsgaiAqIHc7CisKKyAgICAvLyBwcmVwYXJlIHR3byByb3dzIG9mIGlucHV0CisgICAgSW1wb3J0T25lUm93KHJfcHRyICsgb2ZmMSwgZ19wdHIgKyBvZmYxLCBiX3B0ciArIG9mZjEsCisgICAgICAgICAgICAgICAgIHN0ZXAsIHBpY3R1cmUtPndpZHRoLCBzcmMxKTsKKyAgICBpZiAoIWlzX2xhc3Rfcm93KSB7CisgICAgICBJbXBvcnRPbmVSb3cocl9wdHIgKyBvZmYyLCBnX3B0ciArIG9mZjIsIGJfcHRyICsgb2ZmMiwKKyAgICAgICAgICAgICAgICAgICBzdGVwLCBwaWN0dXJlLT53aWR0aCwgc3JjMik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweShzcmMyLCBzcmMxLCAzICogdyAqIHNpemVvZigqc3JjMikpOworICAgIH0KKyAgICBVcGRhdGVXKHNyYzEsIHRhcmdldF95ICsgKGogKyAwKSAqIHcsIHcpOworICAgIFVwZGF0ZVcoc3JjMiwgdGFyZ2V0X3kgKyAoaiArIDEpICogdywgdyk7CisgICAgZGlmZl9zdW0gKz0gVXBkYXRlQ2hyb21hKHNyYzEsIHNyYzIsIHRhcmdldF91diArIHV2X29mZiwgZHN0X3ksIHV2X3cpOworICAgIG1lbWNweShiZXN0X3V2ICsgdXZfb2ZmLCB0YXJnZXRfdXYgKyB1dl9vZmYsIDMgKiB1dl93ICogc2l6ZW9mKCpiZXN0X3V2KSk7CisgICAgbWVtY3B5KGRzdF95ICsgdywgZHN0X3ksIHcgKiBzaXplb2YoKmRzdF95KSk7CisgIH0KKworICAvLyBJdGVyYXRlIGFuZCByZXNvbHZlIGNsaXBwaW5nIGNvbmZsaWN0cy4KKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGtOdW1JdGVyYXRpb25zOyArK2l0ZXIpIHsKKyAgICBpbnQgazsKKyAgICBjb25zdCBmaXhlZF90KiBjdXJfdXYgPSBiZXN0X3V2OworICAgIGNvbnN0IGZpeGVkX3QqIHByZXZfdXYgPSBiZXN0X3V2OworICAgIGNvbnN0IGludCBvbGRfZGlmZl9zdW0gPSBkaWZmX3N1bTsKKyAgICBkaWZmX3N1bSA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGogKz0gMikgeworICAgICAgZml4ZWRfeV90KiBjb25zdCBzcmMxID0gdG1wX2J1ZmZlcjsKKyAgICAgIGZpeGVkX3lfdCogY29uc3Qgc3JjMiA9IHRtcF9idWZmZXIgKyAzICogdzsKKyAgICAgIHsKKyAgICAgICAgY29uc3QgZml4ZWRfdCogY29uc3QgbmV4dF91diA9IGN1cl91diArICgoaiA8IGggLSAyKSA/IDMgKiB1dl93IDogMCk7CisgICAgICAgIEludGVycG9sYXRlVHdvUm93cyhiZXN0X3kgKyBqICogdywgcHJldl91diwgY3VyX3V2LCBuZXh0X3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgc3JjMSwgc3JjMik7CisgICAgICAgIHByZXZfdXYgPSBjdXJfdXY7CisgICAgICAgIGN1cl91diA9IG5leHRfdXY7CisgICAgICB9CisKKyAgICAgIFVwZGF0ZVcoc3JjMSwgYmVzdF9yZ2JfeSArIDAgKiB3LCB3KTsKKyAgICAgIFVwZGF0ZVcoc3JjMiwgYmVzdF9yZ2JfeSArIDEgKiB3LCB3KTsKKyAgICAgIGRpZmZfc3VtICs9IFVwZGF0ZUNocm9tYShzcmMxLCBzcmMyLCBiZXN0X3JnYl91diwgTlVMTCwgdXZfdyk7CisKKyAgICAgIC8vIHVwZGF0ZSB0d28gcm93cyBvZiBZIGFuZCBvbmUgcm93IG9mIFJHQgorICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiB3OyArK2kpIHsKKyAgICAgICAgY29uc3QgaW50IG9mZiA9IGkgKyBqICogdzsKKyAgICAgICAgY29uc3QgaW50IGRpZmZfeSA9IHRhcmdldF95W29mZl0gLSBiZXN0X3JnYl95W2ldOworICAgICAgICBjb25zdCBpbnQgbmV3X3kgPSAoaW50KWJlc3RfeVtvZmZdICsgZGlmZl95OworICAgICAgICBiZXN0X3lbb2ZmXSA9IGNsaXBfeShuZXdfeSk7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgdXZfdzsgKytpKSB7CisgICAgICAgIGNvbnN0IGludCBvZmYgPSAzICogKGkgKyAoaiA+PiAxKSAqIHV2X3cpOworICAgICAgICBpbnQgVzsKKyAgICAgICAgZm9yIChrID0gMDsgayA8PSAyOyArK2spIHsKKyAgICAgICAgICBjb25zdCBpbnQgZGlmZl91diA9IChpbnQpdGFyZ2V0X3V2W29mZiArIGtdIC0gYmVzdF9yZ2JfdXZbMyAqIGkgKyBrXTsKKyAgICAgICAgICBiZXN0X3V2W29mZiArIGtdICs9IGRpZmZfdXY7CisgICAgICAgIH0KKyAgICAgICAgVyA9IFJHQlRvR3JheShiZXN0X3V2W29mZiArIDBdLCBiZXN0X3V2W29mZiArIDFdLCBiZXN0X3V2W29mZiArIDJdKTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8PSAyOyArK2spIHsKKyAgICAgICAgICBiZXN0X3V2W29mZiArIGtdIC09IFc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gdGVzdCBleGl0IGNvbmRpdGlvbgorICAgIGlmIChkaWZmX3N1bSA+IDApIHsKKyAgICAgIGNvbnN0IGludCBpbXByb3ZlbWVudCA9IDEwMCAqIGFicyhkaWZmX3N1bSAtIG9sZF9kaWZmX3N1bSkgLyBkaWZmX3N1bTsKKyAgICAgIC8vIENoZWNrIGlmIGZpcnN0IGl0ZXJhdGlvbiBnYXZlIGdvb2QgcmVzdWx0IGFscmVhZHksIHdpdGhvdXQgYSBsYXJnZQorICAgICAgLy8ganVtcCBvZiBpbXByb3ZlbWVudCAob3RoZXJ3aXNlIGl0IG1lYW5zIHdlIG5lZWQgdG8gdHJ5IGZldyBleHRyYQorICAgICAgLy8gaXRlcmF0aW9ucywganVzdCB0byBiZSBzdXJlKS4KKyAgICAgIGlmIChpdGVyID09IDAgJiYgZGlmZl9zdW0gPCBmaXJzdF9kaWZmX3RocmVzaG9sZCAmJgorICAgICAgICAgIGltcHJvdmVtZW50IDwgbWluX2ZpcnN0X2ltcHJvdmVtZW50KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gdGhlbiwgY2hlY2sgaWYgaW1wcm92ZW1lbnQgaXMgc3RhbGxpbmcuCisgICAgICBpZiAoaW1wcm92ZW1lbnQgPCBtaW5faW1wcm92ZW1lbnQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIGZpbmFsIHJlY29uc3RydWN0aW9uCisgIG9rID0gQ29udmVydFdSR0JUb1lVVihiZXN0X3ksIGJlc3RfdXYsIHBpY3R1cmUpOworCisgRW5kOgorICBXZWJQU2FmZUZyZWUoYmVzdF95KTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfdXYpOworICBXZWJQU2FmZUZyZWUodGFyZ2V0X3kpOworICBXZWJQU2FmZUZyZWUodGFyZ2V0X3V2KTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfcmdiX3kpOworICBXZWJQU2FmZUZyZWUoYmVzdF9yZ2JfdXYpOworICBXZWJQU2FmZUZyZWUodG1wX2J1ZmZlcik7CisgIHJldHVybiBvazsKK30KKyN1bmRlZiBTQUZFX0FMTE9DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAiRmFzdCIgcmVndWxhciBSR0ItPllVVgorCisjZGVmaW5lIFNVTTQocHRyLCBzdGVwKSBMaW5lYXJUb0dhbW1hKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdhbW1hVG9MaW5lYXIoKHB0cilbKHN0ZXApXSkgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR2FtbWFUb0xpbmVhcigocHRyKVtyZ2Jfc3RyaWRlXSkgKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpW3JnYl9zdHJpZGUgKyAoc3RlcCldKSwgMCkgICAgICAgICAgXAorCisjZGVmaW5lIFNVTTIocHRyKSBcCisgICAgTGluZWFyVG9HYW1tYShHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArIEdhbW1hVG9MaW5lYXIoKHB0cilbcmdiX3N0cmlkZV0pLCAxKQorCisjZGVmaW5lIFNVTTJBTFBIQShwdHIpICgocHRyKVswXSArIChwdHIpW3JnYl9zdHJpZGVdKQorI2RlZmluZSBTVU00QUxQSEEocHRyKSAoU1VNMkFMUEhBKHB0cikgKyBTVU0yQUxQSEEoKHB0cikgKyA0KSkKKworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisKK3N0YXRpYyBjb25zdCBpbnQga0FscGhhRml4ID0gMTk7CisvLyBGb2xsb3dpbmcgdGFibGUgaXMgKDEgPDwga0FscGhhRml4KSAvIGEuIFRoZSAodiAqIGtJbnZBbHBoYVthXSkgPj4ga0FscGhhRml4CisvLyBmb3JtdWxhIGlzIHRoZW4gZXF1YWwgdG8gdiAvIGEgaW4gbW9zdCAoOTkuNiUpIGNhc2VzLiBOb3RlIHRoYXQgdGhpcyB0YWJsZQorLy8gYW5kIGNvbnN0YW50IGFyZSBhZGp1c3RlZCB2ZXJ5IHRpZ2h0bHkgdG8gZml0IDMyYiBhcml0aG1ldGljLgorLy8gSW4gcGFydGljdWxhciwgdGhleSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgb3BlcmFuZHMgZm9yICd2IC8gYScgYXJlIGFjdHVhbGx5CisvLyBkZXJpdmVkIGFzIHYgPSAoYTAucDAgKyBhMS5wMSArIGEyLnAyICsgYTMucDMpIGFuZCBhID0gYTAgKyBhMSArIGEyICsgYTMKKy8vIHdpdGggYWkgaW4gWzAuLjI1NV0gYW5kIHBpIGluIFswLi4xPDxrR2FtbWFGaXgpLiBUaGUgY29uc3RyYWludCB0byBhdm9pZAorLy8gb3ZlcmZsb3cgaXM6IGtHYW1tYUZpeCArIGtBbHBoYUZpeCA8PSAzMS4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrSW52QWxwaGFbNCAqIDB4ZmYgKyAxXSA9IHsKKyAgMCwgIC8qIGFscGhhID0gMCAqLworICA1MjQyODgsIDI2MjE0NCwgMTc0NzYyLCAxMzEwNzIsIDEwNDg1NywgODczODEsIDc0ODk4LCA2NTUzNiwKKyAgNTgyNTQsIDUyNDI4LCA0NzY2MiwgNDM2OTAsIDQwMzI5LCAzNzQ0OSwgMzQ5NTIsIDMyNzY4LAorICAzMDg0MCwgMjkxMjcsIDI3NTk0LCAyNjIxNCwgMjQ5NjYsIDIzODMxLCAyMjc5NSwgMjE4NDUsCisgIDIwOTcxLCAyMDE2NCwgMTk0MTgsIDE4NzI0LCAxODA3OCwgMTc0NzYsIDE2OTEyLCAxNjM4NCwKKyAgMTU4ODcsIDE1NDIwLCAxNDk3OSwgMTQ1NjMsIDE0MTY5LCAxMzc5NywgMTM0NDMsIDEzMTA3LAorICAxMjc4NywgMTI0ODMsIDEyMTkyLCAxMTkxNSwgMTE2NTAsIDExMzk3LCAxMTE1NSwgMTA5MjIsCisgIDEwNjk5LCAxMDQ4NSwgMTAyODAsIDEwMDgyLCA5ODkyLCA5NzA5LCA5NTMyLCA5MzYyLAorICA5MTk4LCA5MDM5LCA4ODg2LCA4NzM4LCA4NTk0LCA4NDU2LCA4MzIyLCA4MTkyLAorICA4MDY1LCA3OTQzLCA3ODI1LCA3NzEwLCA3NTk4LCA3NDg5LCA3Mzg0LCA3MjgxLAorICA3MTgyLCA3MDg0LCA2OTkwLCA2ODk4LCA2ODA4LCA2NzIxLCA2NjM2LCA2NTUzLAorICA2NDcyLCA2MzkzLCA2MzE2LCA2MjQxLCA2MTY4LCA2MDk2LCA2MDI2LCA1OTU3LAorICA1ODkwLCA1ODI1LCA1NzYxLCA1Njk4LCA1NjM3LCA1NTc3LCA1NTE4LCA1NDYxLAorICA1NDA1LCA1MzQ5LCA1Mjk1LCA1MjQyLCA1MTkwLCA1MTQwLCA1MDkwLCA1MDQxLAorICA0OTkzLCA0OTQ2LCA0ODk5LCA0ODU0LCA0ODA5LCA0NzY2LCA0NzIzLCA0NjgxLAorICA0NjM5LCA0NTk5LCA0NTU5LCA0NTE5LCA0NDgxLCA0NDQzLCA0NDA1LCA0MzY5LAorICA0MzMyLCA0Mjk3LCA0MjYyLCA0MjI4LCA0MTk0LCA0MTYxLCA0MTI4LCA0MDk2LAorICA0MDY0LCA0MDMyLCA0MDAyLCAzOTcxLCAzOTQyLCAzOTEyLCAzODgzLCAzODU1LAorICAzODI2LCAzNzk5LCAzNzcxLCAzNzQ0LCAzNzE4LCAzNjkyLCAzNjY2LCAzNjQwLAorICAzNjE1LCAzNTkxLCAzNTY2LCAzNTQyLCAzNTE4LCAzNDk1LCAzNDcyLCAzNDQ5LAorICAzNDI2LCAzNDA0LCAzMzgyLCAzMzYwLCAzMzM5LCAzMzE4LCAzMjk3LCAzMjc2LAorICAzMjU2LCAzMjM2LCAzMjE2LCAzMTk2LCAzMTc3LCAzMTU4LCAzMTM5LCAzMTIwLAorICAzMTAyLCAzMDg0LCAzMDY2LCAzMDQ4LCAzMDMwLCAzMDEzLCAyOTk1LCAyOTc4LAorICAyOTYyLCAyOTQ1LCAyOTI4LCAyOTEyLCAyODk2LCAyODgwLCAyODY0LCAyODQ5LAorICAyODMzLCAyODE4LCAyODAzLCAyNzg4LCAyNzc0LCAyNzU5LCAyNzQ0LCAyNzMwLAorICAyNzE2LCAyNzAyLCAyNjg4LCAyNjc0LCAyNjYxLCAyNjQ3LCAyNjM0LCAyNjIxLAorICAyNjA4LCAyNTk1LCAyNTgyLCAyNTcwLCAyNTU3LCAyNTQ1LCAyNTMyLCAyNTIwLAorICAyNTA4LCAyNDk2LCAyNDg0LCAyNDczLCAyNDYxLCAyNDQ5LCAyNDM4LCAyNDI3LAorICAyNDE2LCAyNDA0LCAyMzk0LCAyMzgzLCAyMzcyLCAyMzYxLCAyMzUxLCAyMzQwLAorICAyMzMwLCAyMzE5LCAyMzA5LCAyMjk5LCAyMjg5LCAyMjc5LCAyMjY5LCAyMjU5LAorICAyMjUwLCAyMjQwLCAyMjMxLCAyMjIxLCAyMjEyLCAyMjAyLCAyMTkzLCAyMTg0LAorICAyMTc1LCAyMTY2LCAyMTU3LCAyMTQ4LCAyMTM5LCAyMTMxLCAyMTIyLCAyMTE0LAorICAyMTA1LCAyMDk3LCAyMDg4LCAyMDgwLCAyMDcyLCAyMDY0LCAyMDU2LCAyMDQ4LAorICAyMDQwLCAyMDMyLCAyMDI0LCAyMDE2LCAyMDA4LCAyMDAxLCAxOTkzLCAxOTg1LAorICAxOTc4LCAxOTcxLCAxOTYzLCAxOTU2LCAxOTQ5LCAxOTQxLCAxOTM0LCAxOTI3LAorICAxOTIwLCAxOTEzLCAxOTA2LCAxODk5LCAxODkyLCAxODg1LCAxODc5LCAxODcyLAorICAxODY1LCAxODU5LCAxODUyLCAxODQ2LCAxODM5LCAxODMzLCAxODI2LCAxODIwLAorICAxODE0LCAxODA3LCAxODAxLCAxNzk1LCAxNzg5LCAxNzgzLCAxNzc3LCAxNzcxLAorICAxNzY1LCAxNzU5LCAxNzUzLCAxNzQ3LCAxNzQxLCAxNzM2LCAxNzMwLCAxNzI0LAorICAxNzE4LCAxNzEzLCAxNzA3LCAxNzAyLCAxNjk2LCAxNjkxLCAxNjg1LCAxNjgwLAorICAxNjc1LCAxNjY5LCAxNjY0LCAxNjU5LCAxNjUzLCAxNjQ4LCAxNjQzLCAxNjM4LAorICAxNjMzLCAxNjI4LCAxNjIzLCAxNjE4LCAxNjEzLCAxNjA4LCAxNjAzLCAxNTk4LAorICAxNTkzLCAxNTg4LCAxNTgzLCAxNTc5LCAxNTc0LCAxNTY5LCAxNTY1LCAxNTYwLAorICAxNTU1LCAxNTUxLCAxNTQ2LCAxNTQyLCAxNTM3LCAxNTMzLCAxNTI4LCAxNTI0LAorICAxNTE5LCAxNTE1LCAxNTEwLCAxNTA2LCAxNTAyLCAxNDk3LCAxNDkzLCAxNDg5LAorICAxNDg1LCAxNDgxLCAxNDc2LCAxNDcyLCAxNDY4LCAxNDY0LCAxNDYwLCAxNDU2LAorICAxNDUyLCAxNDQ4LCAxNDQ0LCAxNDQwLCAxNDM2LCAxNDMyLCAxNDI4LCAxNDI0LAorICAxNDIwLCAxNDE2LCAxNDEzLCAxNDA5LCAxNDA1LCAxNDAxLCAxMzk4LCAxMzk0LAorICAxMzkwLCAxMzg3LCAxMzgzLCAxMzc5LCAxMzc2LCAxMzcyLCAxMzY4LCAxMzY1LAorICAxMzYxLCAxMzU4LCAxMzU0LCAxMzUxLCAxMzQ3LCAxMzQ0LCAxMzQwLCAxMzM3LAorICAxMzM0LCAxMzMwLCAxMzI3LCAxMzIzLCAxMzIwLCAxMzE3LCAxMzE0LCAxMzEwLAorICAxMzA3LCAxMzA0LCAxMzAwLCAxMjk3LCAxMjk0LCAxMjkxLCAxMjg4LCAxMjg1LAorICAxMjgxLCAxMjc4LCAxMjc1LCAxMjcyLCAxMjY5LCAxMjY2LCAxMjYzLCAxMjYwLAorICAxMjU3LCAxMjU0LCAxMjUxLCAxMjQ4LCAxMjQ1LCAxMjQyLCAxMjM5LCAxMjM2LAorICAxMjMzLCAxMjMwLCAxMjI3LCAxMjI0LCAxMjIyLCAxMjE5LCAxMjE2LCAxMjEzLAorICAxMjEwLCAxMjA4LCAxMjA1LCAxMjAyLCAxMTk5LCAxMTk3LCAxMTk0LCAxMTkxLAorICAxMTg4LCAxMTg2LCAxMTgzLCAxMTgwLCAxMTc4LCAxMTc1LCAxMTcyLCAxMTcwLAorICAxMTY3LCAxMTY1LCAxMTYyLCAxMTU5LCAxMTU3LCAxMTU0LCAxMTUyLCAxMTQ5LAorICAxMTQ3LCAxMTQ0LCAxMTQyLCAxMTM5LCAxMTM3LCAxMTM0LCAxMTMyLCAxMTI5LAorICAxMTI3LCAxMTI1LCAxMTIyLCAxMTIwLCAxMTE3LCAxMTE1LCAxMTEzLCAxMTEwLAorICAxMTA4LCAxMTA2LCAxMTAzLCAxMTAxLCAxMDk5LCAxMDk2LCAxMDk0LCAxMDkyLAorICAxMDg5LCAxMDg3LCAxMDg1LCAxMDgzLCAxMDgxLCAxMDc4LCAxMDc2LCAxMDc0LAorICAxMDcyLCAxMDY5LCAxMDY3LCAxMDY1LCAxMDYzLCAxMDYxLCAxMDU5LCAxMDU3LAorICAxMDU0LCAxMDUyLCAxMDUwLCAxMDQ4LCAxMDQ2LCAxMDQ0LCAxMDQyLCAxMDQwLAorICAxMDM4LCAxMDM2LCAxMDM0LCAxMDMyLCAxMDMwLCAxMDI4LCAxMDI2LCAxMDI0LAorICAxMDIyLCAxMDIwLCAxMDE4LCAxMDE2LCAxMDE0LCAxMDEyLCAxMDEwLCAxMDA4LAorICAxMDA2LCAxMDA0LCAxMDAyLCAxMDAwLCA5OTgsIDk5NiwgOTk0LCA5OTIsCisgIDk5MSwgOTg5LCA5ODcsIDk4NSwgOTgzLCA5ODEsIDk3OSwgOTc4LAorICA5NzYsIDk3NCwgOTcyLCA5NzAsIDk2OSwgOTY3LCA5NjUsIDk2MywKKyAgOTYxLCA5NjAsIDk1OCwgOTU2LCA5NTQsIDk1MywgOTUxLCA5NDksCisgIDk0OCwgOTQ2LCA5NDQsIDk0MiwgOTQxLCA5MzksIDkzNywgOTM2LAorICA5MzQsIDkzMiwgOTMxLCA5MjksIDkyNywgOTI2LCA5MjQsIDkyMywKKyAgOTIxLCA5MTksIDkxOCwgOTE2LCA5MTQsIDkxMywgOTExLCA5MTAsCisgIDkwOCwgOTA3LCA5MDUsIDkwMywgOTAyLCA5MDAsIDg5OSwgODk3LAorICA4OTYsIDg5NCwgODkzLCA4OTEsIDg5MCwgODg4LCA4ODcsIDg4NSwKKyAgODg0LCA4ODIsIDg4MSwgODc5LCA4NzgsIDg3NiwgODc1LCA4NzMsCisgIDg3MiwgODcwLCA4NjksIDg2OCwgODY2LCA4NjUsIDg2MywgODYyLAorICA4NjAsIDg1OSwgODU4LCA4NTYsIDg1NSwgODUzLCA4NTIsIDg1MSwKKyAgODQ5LCA4NDgsIDg0NiwgODQ1LCA4NDQsIDg0MiwgODQxLCA4NDAsCisgIDgzOCwgODM3LCA4MzYsIDgzNCwgODMzLCA4MzIsIDgzMCwgODI5LAorICA4MjgsIDgyNiwgODI1LCA4MjQsIDgyMywgODIxLCA4MjAsIDgxOSwKKyAgODE3LCA4MTYsIDgxNSwgODE0LCA4MTIsIDgxMSwgODEwLCA4MDksCisgIDgwNywgODA2LCA4MDUsIDgwNCwgODAyLCA4MDEsIDgwMCwgNzk5LAorICA3OTgsIDc5NiwgNzk1LCA3OTQsIDc5MywgNzkxLCA3OTAsIDc4OSwKKyAgNzg4LCA3ODcsIDc4NiwgNzg0LCA3ODMsIDc4MiwgNzgxLCA3ODAsCisgIDc3OSwgNzc3LCA3NzYsIDc3NSwgNzc0LCA3NzMsIDc3MiwgNzcxLAorICA3NjksIDc2OCwgNzY3LCA3NjYsIDc2NSwgNzY0LCA3NjMsIDc2MiwKKyAgNzYwLCA3NTksIDc1OCwgNzU3LCA3NTYsIDc1NSwgNzU0LCA3NTMsCisgIDc1MiwgNzUxLCA3NTAsIDc0OCwgNzQ3LCA3NDYsIDc0NSwgNzQ0LAorICA3NDMsIDc0MiwgNzQxLCA3NDAsIDczOSwgNzM4LCA3MzcsIDczNiwKKyAgNzM1LCA3MzQsIDczMywgNzMyLCA3MzEsIDczMCwgNzI5LCA3MjgsCisgIDcyNywgNzI2LCA3MjUsIDcyNCwgNzIzLCA3MjIsIDcyMSwgNzIwLAorICA3MTksIDcxOCwgNzE3LCA3MTYsIDcxNSwgNzE0LCA3MTMsIDcxMiwKKyAgNzExLCA3MTAsIDcwOSwgNzA4LCA3MDcsIDcwNiwgNzA1LCA3MDQsCisgIDcwMywgNzAyLCA3MDEsIDcwMCwgNjk5LCA2OTksIDY5OCwgNjk3LAorICA2OTYsIDY5NSwgNjk0LCA2OTMsIDY5MiwgNjkxLCA2OTAsIDY4OSwKKyAgNjg4LCA2ODgsIDY4NywgNjg2LCA2ODUsIDY4NCwgNjgzLCA2ODIsCisgIDY4MSwgNjgwLCA2ODAsIDY3OSwgNjc4LCA2NzcsIDY3NiwgNjc1LAorICA2NzQsIDY3MywgNjczLCA2NzIsIDY3MSwgNjcwLCA2NjksIDY2OCwKKyAgNjY3LCA2NjcsIDY2NiwgNjY1LCA2NjQsIDY2MywgNjYyLCA2NjEsCisgIDY2MSwgNjYwLCA2NTksIDY1OCwgNjU3LCA2NTcsIDY1NiwgNjU1LAorICA2NTQsIDY1MywgNjUyLCA2NTIsIDY1MSwgNjUwLCA2NDksIDY0OCwKKyAgNjQ4LCA2NDcsIDY0NiwgNjQ1LCA2NDQsIDY0NCwgNjQzLCA2NDIsCisgIDY0MSwgNjQwLCA2NDAsIDYzOSwgNjM4LCA2MzcsIDYzNywgNjM2LAorICA2MzUsIDYzNCwgNjMzLCA2MzMsIDYzMiwgNjMxLCA2MzAsIDYzMCwKKyAgNjI5LCA2MjgsIDYyNywgNjI3LCA2MjYsIDYyNSwgNjI0LCA2MjQsCisgIDYyMywgNjIyLCA2MjEsIDYyMSwgNjIwLCA2MTksIDYxOCwgNjE4LAorICA2MTcsIDYxNiwgNjE2LCA2MTUsIDYxNCwgNjEzLCA2MTMsIDYxMiwKKyAgNjExLCA2MTEsIDYxMCwgNjA5LCA2MDgsIDYwOCwgNjA3LCA2MDYsCisgIDYwNiwgNjA1LCA2MDQsIDYwNCwgNjAzLCA2MDIsIDYwMSwgNjAxLAorICA2MDAsIDU5OSwgNTk5LCA1OTgsIDU5NywgNTk3LCA1OTYsIDU5NSwKKyAgNTk1LCA1OTQsIDU5MywgNTkzLCA1OTIsIDU5MSwgNTkxLCA1OTAsCisgIDU4OSwgNTg5LCA1ODgsIDU4NywgNTg3LCA1ODYsIDU4NSwgNTg1LAorICA1ODQsIDU4MywgNTgzLCA1ODIsIDU4MSwgNTgxLCA1ODAsIDU3OSwKKyAgNTc5LCA1NzgsIDU3OCwgNTc3LCA1NzYsIDU3NiwgNTc1LCA1NzQsCisgIDU3NCwgNTczLCA1NzIsIDU3MiwgNTcxLCA1NzEsIDU3MCwgNTY5LAorICA1NjksIDU2OCwgNTY4LCA1NjcsIDU2NiwgNTY2LCA1NjUsIDU2NCwKKyAgNTY0LCA1NjMsIDU2MywgNTYyLCA1NjEsIDU2MSwgNTYwLCA1NjAsCisgIDU1OSwgNTU4LCA1NTgsIDU1NywgNTU3LCA1NTYsIDU1NSwgNTU1LAorICA1NTQsIDU1NCwgNTUzLCA1NTMsIDU1MiwgNTUxLCA1NTEsIDU1MCwKKyAgNTUwLCA1NDksIDU0OCwgNTQ4LCA1NDcsIDU0NywgNTQ2LCA1NDYsCisgIDU0NSwgNTQ0LCA1NDQsIDU0MywgNTQzLCA1NDIsIDU0MiwgNTQxLAorICA1NDEsIDU0MCwgNTM5LCA1MzksIDUzOCwgNTM4LCA1MzcsIDUzNywKKyAgNTM2LCA1MzYsIDUzNSwgNTM0LCA1MzQsIDUzMywgNTMzLCA1MzIsCisgIDUzMiwgNTMxLCA1MzEsIDUzMCwgNTMwLCA1MjksIDUyOSwgNTI4LAorICA1MjcsIDUyNywgNTI2LCA1MjYsIDUyNSwgNTI1LCA1MjQsIDUyNCwKKyAgNTIzLCA1MjMsIDUyMiwgNTIyLCA1MjEsIDUyMSwgNTIwLCA1MjAsCisgIDUxOSwgNTE5LCA1MTgsIDUxOCwgNTE3LCA1MTcsIDUxNiwgNTE2LAorICA1MTUsIDUxNSwgNTE0LCA1MTQKK307CisKKy8vIE5vdGUgdGhhdCBMaW5lYXJUb0dhbW1hKCkgZXhwZWN0cyB0aGUgdmFsdWVzIHRvIGJlIHByZW11bHRpcGxpZWQgYnkgNCwKKy8vIHNvIHdlIGluY29ycG9yYXRlIHRoaXMgZmFjdG9yIDQgaW5zaWRlIHRoZSBESVZJREVfQllfQUxQSEEgbWFjcm8gZGlyZWN0bHkuCisjZGVmaW5lIERJVklERV9CWV9BTFBIQShzdW0sIGEpICAoKChzdW0pICoga0ludkFscGhhWyhhKV0pID4+IChrQWxwaGFGaXggLSAyKSkKKworI2Vsc2UKKworI2RlZmluZSBESVZJREVfQllfQUxQSEEoc3VtLCBhKSAoNCAqIChzdW0pIC8gKGEpKQorCisjZW5kaWYgIC8vIFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYVdlaWdodGVkKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxfYSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3N0cmlkZSkgeworICBjb25zdCB1aW50MzJfdCBzdW0gPQorICAgICAgYV9wdHJbMF0gKiBHYW1tYVRvTGluZWFyKHNyY1swXSkgKworICAgICAgYV9wdHJbc3RlcF0gKiBHYW1tYVRvTGluZWFyKHNyY1tzdGVwXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZV0gKiBHYW1tYVRvTGluZWFyKHNyY1tyZ2Jfc3RyaWRlXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZSArIHN0ZXBdICogR2FtbWFUb0xpbmVhcihzcmNbcmdiX3N0cmlkZSArIHN0ZXBdKTsKKyAgYXNzZXJ0KHRvdGFsX2EgPiAwICYmIHRvdGFsX2EgPD0gNCAqIDB4ZmYpOworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisgIGFzc2VydCgodWludDY0X3Qpc3VtICoga0ludkFscGhhW3RvdGFsX2FdIDwgKCh1aW50NjRfdCkxIDw8IDMyKSk7CisjZW5kaWYKKyAgcmV0dXJuIExpbmVhclRvR2FtbWEoRElWSURFX0JZX0FMUEhBKHN1bSwgdG90YWxfYSksIDApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93VG9ZKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIGogKz0gc3RlcCkgeworICAgIGRzdF95W2ldID0gUkdCVG9ZKHJfcHRyW2pdLCBnX3B0cltqXSwgYl9wdHJbal0sIHJnKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICAvLyB3ZSBsb29wIG92ZXIgMngyIGJsb2NrcyBhbmQgcHJvZHVjZSBvbmUgUi9HL0IvQSB2YWx1ZSBmb3IgZWFjaC4KKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkgKz0gMSwgaiArPSAyICogNCwgZHN0ICs9IDQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gU1VNNEFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNNChyX3B0ciArIGosIDQpOworICAgICAgZyA9IFNVTTQoZ19wdHIgKyBqLCA0KTsKKyAgICAgIGIgPSBTVU00KGJfcHRyICsgaiwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDQsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgNCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCA0LCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorICBpZiAod2lkdGggJiAxKSB7CisgICAgY29uc3QgdWludDMyX3QgYSA9IDJ1ICogU1VNMkFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNMihyX3B0ciArIGopOworICAgICAgZyA9IFNVTTIoZ19wdHIgKyBqKTsKKyAgICAgIGIgPSBTVU0yKGJfcHRyICsgaik7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDAsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgMCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCAwLCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSArPSAxLCBqICs9IDIgKiBzdGVwLCBkc3QgKz0gNCkgeworICAgIGRzdFswXSA9IFNVTTQocl9wdHIgKyBqLCBzdGVwKTsKKyAgICBkc3RbMV0gPSBTVU00KGdfcHRyICsgaiwgc3RlcCk7CisgICAgZHN0WzJdID0gU1VNNChiX3B0ciArIGosIHN0ZXApOworICB9CisgIGlmICh3aWR0aCAmIDEpIHsKKyAgICBkc3RbMF0gPSBTVU0yKHJfcHRyICsgaik7CisgICAgZHN0WzFdID0gU1VNMihnX3B0ciArIGopOworICAgIGRzdFsyXSA9IFNVTTIoYl9wdHIgKyBqKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93c1RvVVYoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmFuZG9tKiBjb25zdCByZykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgZHN0X3VbaV0gPSBSR0JUb1UociwgZywgYiwgcmcpOworICAgIGRzdF92W2ldID0gUkdCVG9WKHIsIGcsIGIsIHJnKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEltcG9ydFlVVkFGcm9tUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCAgICAgICAgIC8vIGJ5dGVzIHBlciBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUsICAgLy8gYnl0ZXMgcGVyIHNjYW5saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXRoZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHk7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBjb25zdCBpbnQgaGFzX2FscGhhID0gQ2hlY2tOb25PcGFxdWUoYV9wdHIsIHdpZHRoLCBoZWlnaHQsIHN0ZXAsIHJnYl9zdHJpZGUpOworICBjb25zdCBpbnQgaXNfcmdiID0gKHJfcHRyIDwgYl9wdHIpOyAgLy8gb3RoZXJ3aXNlIGl0J3MgYmdyCisKKyAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IGhhc19hbHBoYSA/IFdFQlBfWVVWNDIwQSA6IFdFQlBfWVVWNDIwOworICBwaWN0dXJlLT51c2VfYXJnYiA9IDA7CisKKyAgLy8gZGlzYWJsZSBzbWFydCBjb252ZXJzaW9uIGlmIHNvdXJjZSBpcyB0b28gc21hbGwgKG92ZXJraWxsKS4KKyAgaWYgKHdpZHRoIDwga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24gfHwKKyAgICAgIGhlaWdodCA8IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKSB7CisgICAgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uID0gMDsKKyAgfQorCisgIGlmICghV2ViUFBpY3R1cmVBbGxvY1lVVkEocGljdHVyZSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaGFzX2FscGhhKSB7CisgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgICBhc3NlcnQoc3RlcCA9PSA0KTsKKyNpZiBkZWZpbmVkKFVTRV9HQU1NQV9DT01QUkVTU0lPTikgJiYgZGVmaW5lZChVU0VfSU5WRVJTRV9BTFBIQV9UQUJMRSkKKyAgICBhc3NlcnQoa0FscGhhRml4ICsga0dhbW1hRml4IDw9IDMxKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbikgeworICAgIEluaXRHYW1tYVRhYmxlc0YoKTsKKyAgICBpZiAoIVByZXByb2Nlc3NBUkdCKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHN0ZXAsIHJnYl9zdHJpZGUsIHBpY3R1cmUpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgV2ViUEV4dHJhY3RBbHBoYShhX3B0ciwgcmdiX3N0cmlkZSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS0+YSwgcGljdHVyZS0+YV9zdHJpZGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgdXZfd2lkdGggPSAod2lkdGggKyAxKSA+PiAxOworICAgIGludCB1c2VfZHNwID0gKHN0ZXAgPT0gMyk7ICAvLyB1c2Ugc3BlY2lhbCBmdW5jdGlvbiBpbiB0aGlzIGNhc2UKKyAgICAvLyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgYWNjdW11bGF0ZWQgUi9HL0IgdmFsdWVzIGR1cmluZyBjb252ZXJzaW9uIHRvIFUvVgorICAgIHVpbnQxNl90KiBjb25zdCB0bXBfcmdiID0KKyAgICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYyg0ICogdXZfd2lkdGgsIHNpemVvZigqdG1wX3JnYikpOworICAgIHVpbnQ4X3QqIGRzdF95ID0gcGljdHVyZS0+eTsKKyAgICB1aW50OF90KiBkc3RfdSA9IHBpY3R1cmUtPnU7CisgICAgdWludDhfdCogZHN0X3YgPSBwaWN0dXJlLT52OworICAgIHVpbnQ4X3QqIGRzdF9hID0gcGljdHVyZS0+YTsKKworICAgIFZQOFJhbmRvbSBiYXNlX3JnOworICAgIFZQOFJhbmRvbSogcmcgPSBOVUxMOworICAgIGlmIChkaXRoZXJpbmcgPiAwLikgeworICAgICAgVlA4SW5pdFJhbmRvbSgmYmFzZV9yZywgZGl0aGVyaW5nKTsKKyAgICAgIHJnID0gJmJhc2Vfcmc7CisgICAgICB1c2VfZHNwID0gMDsgICAvLyBjYW4ndCB1c2UgZHNwIGluIHRoaXMgY2FzZQorICAgIH0KKyAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYoKTsKKyAgICBJbml0R2FtbWFUYWJsZXMoKTsKKworICAgIGlmICh0bXBfcmdiID09IE5VTEwpIHJldHVybiAwOyAgLy8gbWFsbG9jIGVycm9yCisKKyAgICAvLyBEb3duc2FtcGxlIFkvVS9WIHBsYW5lcywgdHdvIHJvd3MgYXQgYSB0aW1lCisgICAgZm9yICh5ID0gMDsgeSA8IChoZWlnaHQgPj4gMSk7ICsreSkgeworICAgICAgaW50IHJvd3NfaGF2ZV9hbHBoYSA9IGhhc19hbHBoYTsKKyAgICAgIGNvbnN0IGludCBvZmYxID0gKDIgKiB5ICsgMCkgKiByZ2Jfc3RyaWRlOworICAgICAgY29uc3QgaW50IG9mZjIgPSAoMiAqIHkgKyAxKSAqIHJnYl9zdHJpZGU7CisgICAgICBpZiAodXNlX2RzcCkgeworICAgICAgICBpZiAoaXNfcmdiKSB7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciArIG9mZjEsIGRzdF95LCB3aWR0aCk7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciArIG9mZjIsIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyICsgb2ZmMSwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyICsgb2ZmMiwgZHN0X3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgd2lkdGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyICsgb2ZmMSwgZ19wdHIgKyBvZmYxLCBiX3B0ciArIG9mZjEsIHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgZHN0X3ksIHdpZHRoLCByZyk7CisgICAgICAgIENvbnZlcnRSb3dUb1kocl9wdHIgKyBvZmYyLCBnX3B0ciArIG9mZjIsIGJfcHRyICsgb2ZmMiwgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBkc3RfeSArIHBpY3R1cmUtPnlfc3RyaWRlLCB3aWR0aCwgcmcpOworICAgICAgfQorICAgICAgZHN0X3kgKz0gMiAqIHBpY3R1cmUtPnlfc3RyaWRlOworICAgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgICByb3dzX2hhdmVfYWxwaGEgJj0gIVdlYlBFeHRyYWN0QWxwaGEoYV9wdHIgKyBvZmYxLCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYSwgcGljdHVyZS0+YV9zdHJpZGUpOworICAgICAgICBkc3RfYSArPSAyICogcGljdHVyZS0+YV9zdHJpZGU7CisgICAgICB9CisgICAgICAvLyBDb2xsZWN0IGF2ZXJhZ2VkIFIvRy9CKC9BKQorICAgICAgaWYgKCFyb3dzX2hhdmVfYWxwaGEpIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQihyX3B0ciArIG9mZjEsIGdfcHRyICsgb2ZmMSwgYl9wdHIgKyBvZmYxLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZXAsIHJnYl9zdHJpZGUsIHRtcF9yZ2IsIHdpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFjY3VtdWxhdGVSR0JBKHJfcHRyICsgb2ZmMSwgZ19wdHIgKyBvZmYxLCBiX3B0ciArIG9mZjEsIGFfcHRyICsgb2ZmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmdiX3N0cmlkZSwgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfQorICAgICAgLy8gQ29udmVydCB0byBVL1YKKyAgICAgIGlmIChyZyA9PSBOVUxMKSB7CisgICAgICAgIFdlYlBDb252ZXJ0UkdCQTMyVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnZlcnRSb3dzVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoLCByZyk7CisgICAgICB9CisgICAgICBkc3RfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBkc3RfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgfQorICAgIGlmIChoZWlnaHQgJiAxKSB7ICAgIC8vIGV4dHJhIGxhc3Qgcm93CisgICAgICBjb25zdCBpbnQgb2ZmID0gMiAqIHkgKiByZ2Jfc3RyaWRlOworICAgICAgaW50IHJvd19oYXNfYWxwaGEgPSBoYXNfYWxwaGE7CisgICAgICBpZiAodXNlX2RzcCkgeworICAgICAgICBpZiAocl9wdHIgPCBiX3B0cikgeworICAgICAgICAgIFdlYlBDb252ZXJ0UkdCMjRUb1kocl9wdHIgKyBvZmYsIGRzdF95LCB3aWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV2ViUENvbnZlcnRCR1IyNFRvWShiX3B0ciArIG9mZiwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29udmVydFJvd1RvWShyX3B0ciArIG9mZiwgZ19wdHIgKyBvZmYsIGJfcHRyICsgb2ZmLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGRzdF95LCB3aWR0aCwgcmcpOworICAgICAgfQorICAgICAgaWYgKHJvd19oYXNfYWxwaGEpIHsKKyAgICAgICAgcm93X2hhc19hbHBoYSAmPSAhV2ViUEV4dHJhY3RBbHBoYShhX3B0ciArIG9mZiwgMCwgd2lkdGgsIDEsIGRzdF9hLCAwKTsKKyAgICAgIH0KKyAgICAgIC8vIENvbGxlY3QgYXZlcmFnZWQgUi9HL0IoL0EpCisgICAgICBpZiAoIXJvd19oYXNfYWxwaGEpIHsKKyAgICAgICAgLy8gQ29sbGVjdCBhdmVyYWdlZCBSL0cvQgorICAgICAgICBBY2N1bXVsYXRlUkdCKHJfcHRyICsgb2ZmLCBnX3B0ciArIG9mZiwgYl9wdHIgKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgc3RlcCwgLyogcmdiX3N0cmlkZSA9ICovIDAsIHRtcF9yZ2IsIHdpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFjY3VtdWxhdGVSR0JBKHJfcHRyICsgb2ZmLCBnX3B0ciArIG9mZiwgYl9wdHIgKyBvZmYsIGFfcHRyICsgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAvKiByZ2Jfc3RyaWRlID0gKi8gMCwgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfQorICAgICAgaWYgKHJnID09IE5VTEwpIHsKKyAgICAgICAgV2ViUENvbnZlcnRSR0JBMzJUb1VWKHRtcF9yZ2IsIGRzdF91LCBkc3RfdiwgdXZfd2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29udmVydFJvd3NUb1VWKHRtcF9yZ2IsIGRzdF91LCBkc3RfdiwgdXZfd2lkdGgsIHJnKTsKKyAgICAgIH0KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHRtcF9yZ2IpOworICB9CisgIHJldHVybiAxOworfQorCisjdW5kZWYgU1VNNAorI3VuZGVmIFNVTTIKKyN1bmRlZiBTVU00QUxQSEEKKyN1bmRlZiBTVU0yQUxQSEEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNhbGwgZm9yIEFSR0ItPllVVkEgY29udmVyc2lvbgorCitzdGF0aWMgaW50IFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpdGhlcmluZywgaW50IHVzZV9pdGVyYXRpdmVfY29udmVyc2lvbikgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgfSBlbHNlIGlmICgoY29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0spICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhcmdiID0gKGNvbnN0IHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2I7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgciA9IEFMUEhBX0lTX0xBU1QgPyBhcmdiICsgMiA6IGFyZ2IgKyAxOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGcgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDEgOiBhcmdiICsgMjsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBiID0gQUxQSEFfSVNfTEFTVCA/IGFyZ2IgKyAwIDogYXJnYiArIDM7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgYSA9IEFMUEhBX0lTX0xBU1QgPyBhcmdiICsgMyA6IGFyZ2IgKyAwOworCisgICAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IFdFQlBfWVVWNDIwOworICAgIHJldHVybiBJbXBvcnRZVVZBRnJvbVJHQkEociwgZywgYiwgYSwgNCwgNCAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl0aGVyaW5nLCB1c2VfaXRlcmF0aXZlX2NvbnZlcnNpb24sIHBpY3R1cmUpOworICB9Cit9CisKK2ludCBXZWJQUGljdHVyZUFSR0JUb1lVVkFEaXRoZXJlZChXZWJQUGljdHVyZSogcGljdHVyZSwgV2ViUEVuY0NTUCBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpdGhlcmluZykgeworICByZXR1cm4gUGljdHVyZUFSR0JUb1lVVkEocGljdHVyZSwgY29sb3JzcGFjZSwgZGl0aGVyaW5nLCAwKTsKK30KKworaW50IFdlYlBQaWN0dXJlQVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSwgV2ViUEVuY0NTUCBjb2xvcnNwYWNlKSB7CisgIHJldHVybiBQaWN0dXJlQVJHQlRvWVVWQShwaWN0dXJlLCBjb2xvcnNwYWNlLCAwLmYsIDApOworfQorCitpbnQgV2ViUFBpY3R1cmVTbWFydEFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgcmV0dXJuIFBpY3R1cmVBUkdCVG9ZVVZBKHBpY3R1cmUsIFdFQlBfWVVWNDIwLCAwLmYsIDEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbCBmb3IgWVVWQSAtPiBBUkdCIGNvbnZlcnNpb24KKworaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHBpY3R1cmUtPnkgPT0gTlVMTCB8fCBwaWN0dXJlLT51ID09IE5VTEwgfHwgcGljdHVyZS0+diA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgJiYgcGljdHVyZS0+YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0spICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfQorICAvLyBBbGxvY2F0ZSBhIG5ldyBhcmdiIGJ1ZmZlciAoZGlzY2FyZGluZyB0aGUgcHJldmlvdXMgb25lKS4KKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0KSkgcmV0dXJuIDA7CisgIHBpY3R1cmUtPnVzZV9hcmdiID0gMTsKKworICAvLyBDb252ZXJ0CisgIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICAgIGNvbnN0IGludCBhcmdiX3N0cmlkZSA9IDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICB1aW50OF90KiBkc3QgPSAodWludDhfdCopcGljdHVyZS0+YXJnYjsKKyAgICBjb25zdCB1aW50OF90ICpjdXJfdSA9IHBpY3R1cmUtPnUsICpjdXJfdiA9IHBpY3R1cmUtPnYsICpjdXJfeSA9IHBpY3R1cmUtPnk7CisgICAgV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIHVwc2FtcGxlID0gV2ViUEdldExpbmVQYWlyQ29udmVydGVyKEFMUEhBX0lTX0xBU1QpOworCisgICAgLy8gRmlyc3Qgcm93LCB3aXRoIHJlcGxpY2F0ZWQgdG9wIHNhbXBsZXMuCisgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBkc3QsIE5VTEwsIHdpZHRoKTsKKyAgICBjdXJfeSArPSBwaWN0dXJlLT55X3N0cmlkZTsKKyAgICBkc3QgKz0gYXJnYl9zdHJpZGU7CisgICAgLy8gQ2VudGVyIHJvd3MuCisgICAgZm9yICh5ID0gMTsgeSArIDEgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wX3UgPSBjdXJfdTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF92ID0gY3VyX3Y7CisgICAgICBjdXJfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBjdXJfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICB1cHNhbXBsZShjdXJfeSwgY3VyX3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCisgICAgICAgICAgICAgICBkc3QsIGRzdCArIGFyZ2Jfc3RyaWRlLCB3aWR0aCk7CisgICAgICBjdXJfeSArPSAyICogcGljdHVyZS0+eV9zdHJpZGU7CisgICAgICBkc3QgKz0gMiAqIGFyZ2Jfc3RyaWRlOworICAgIH0KKyAgICAvLyBMYXN0IHJvdyAoaWYgbmVlZGVkKSwgd2l0aCByZXBsaWNhdGVkIGJvdHRvbSBzYW1wbGVzLgorICAgIGlmIChoZWlnaHQgPiAxICYmICEoaGVpZ2h0ICYgMSkpIHsKKyAgICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgZHN0LCBOVUxMLCB3aWR0aCk7CisgICAgfQorICAgIC8vIEluc2VydCBhbHBoYSB2YWx1ZXMgaWYgbmVlZGVkLCBpbiByZXBsYWNlbWVudCBmb3IgdGhlIGRlZmF1bHQgMHhmZiBvbmVzLgorICAgIGlmIChwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2JfZHN0ID0gcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gcGljdHVyZS0+YSArIHkgKiBwaWN0dXJlLT5hX3N0cmlkZTsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgYXJnYl9kc3RbeF0gPSAoYXJnYl9kc3RbeF0gJiAweDAwZmZmZmZmdSkgfCAoKHVpbnQzMl90KXNyY1t4XSA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhdXRvbWF0aWMgaW1wb3J0IC8gY29udmVyc2lvbgorCitzdGF0aWMgaW50IEltcG9ydChXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYiwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHN3YXBfcmIsIGludCBpbXBvcnRfYWxwaGEpIHsKKyAgaW50IHk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyID0gcmdiICsgKHN3YXBfcmIgPyAyIDogMCk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyID0gcmdiICsgMTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIgPSByZ2IgKyAoc3dhcF9yYiA/IDAgOiAyKTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgYV9wdHIgPSBpbXBvcnRfYWxwaGEgPyByZ2IgKyAzIDogTlVMTDsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisKKyAgaWYgKCFwaWN0dXJlLT51c2VfYXJnYikgeworICAgIHJldHVybiBJbXBvcnRZVVZBRnJvbVJHQkEocl9wdHIsIGdfcHRyLCBiX3B0ciwgYV9wdHIsIHN0ZXAsIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLmYgLyogbm8gZGl0aGVyaW5nICovLCAwLCBwaWN0dXJlKTsKKyAgfQorICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljdHVyZSkpIHJldHVybiAwOworCisgIFZQOEVuY0RzcEFSR0JJbml0KCk7CisKKyAgaWYgKGltcG9ydF9hbHBoYSkgeworICAgIGFzc2VydChzdGVwID09IDQpOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgdWludDMyX3QqIGNvbnN0IGRzdCA9ICZwaWN0dXJlLT5hcmdiW3kgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZV07CisgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0geSAqIHJnYl9zdHJpZGU7CisgICAgICBWUDhQYWNrQVJHQihhX3B0ciArIG9mZnNldCwgcl9wdHIgKyBvZmZzZXQsIGdfcHRyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgYl9wdHIgKyBvZmZzZXQsIHdpZHRoLCBkc3QpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQoc3RlcCA+PSAzKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIHVpbnQzMl90KiBjb25zdCBkc3QgPSAmcGljdHVyZS0+YXJnYlt5ICogcGljdHVyZS0+YXJnYl9zdHJpZGVdOworICAgICAgY29uc3QgaW50IG9mZnNldCA9IHkgKiByZ2Jfc3RyaWRlOworICAgICAgVlA4UGFja1JHQihyX3B0ciArIG9mZnNldCwgZ19wdHIgKyBvZmZzZXQsIGJfcHRyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICB3aWR0aCwgc3RlcCwgZHN0KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFB1YmxpYyBBUEkKKworaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAwLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAxLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCQShXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYmEgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMCwgMSkKKyAgICAgICAgICAgICA6IDA7Cit9CisKK2ludCBXZWJQUGljdHVyZUltcG9ydEJHUkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2JhICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDEsIDEpCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAwLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSWChXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYmEgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMCkKKyAgICAgICAgICAgICA6IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9wc25yLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV9wc25yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlMTlmOQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX3BzbnIuYwpAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzIGZvciBtZWFzdXJpbmcgZGlzdG9ydGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwtbWluIGRpc3RvcnRpb24KKy8vCisvLyBGb3IgZXZlcnkgcGl4ZWwgaW4gdGhlICpyZWZlcmVuY2UqIHBpY3R1cmUsIHdlIHNlYXJjaCBmb3IgdGhlIGxvY2FsIGJlc3QKKy8vIG1hdGNoIGluIHRoZSBjb21wcmVzc2VkIGltYWdlLiBUaGlzIGlzIG5vdCBhIHN5bW1ldHJpY2FsIG1lYXN1cmUuCisKKyNkZWZpbmUgUkFESVVTIDIgIC8vIHNlYXJjaCByYWRpdXMuIFNob3VsZG4ndCBiZSB0b28gbGFyZ2UuCisKK3N0YXRpYyB2b2lkIEFjY3VtdWxhdGVMU0lNKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBWUDhEaXN0b1N0YXRzKiBzdGF0cykgeworICBpbnQgeCwgeTsKKyAgZG91YmxlIHRvdGFsX3NzZSA9IDAuOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgY29uc3QgaW50IHlfMCA9ICh5IC0gUkFESVVTIDwgMCkgPyAwIDogeSAtIFJBRElVUzsKKyAgICBjb25zdCBpbnQgeV8xID0gKHkgKyBSQURJVVMgKyAxID49IGgpID8gaCA6IHkgKyBSQURJVVMgKyAxOworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCB4XzAgPSAoeCAtIFJBRElVUyA8IDApID8gMCA6IHggLSBSQURJVVM7CisgICAgICBjb25zdCBpbnQgeF8xID0gKHggKyBSQURJVVMgKyAxID49IHcpID8gdyA6IHggKyBSQURJVVMgKyAxOworICAgICAgZG91YmxlIGJlc3Rfc3NlID0gMjU1LiAqIDI1NS47CisgICAgICBjb25zdCBkb3VibGUgdmFsdWUgPSAoZG91YmxlKXJlZlt5ICogcmVmX3N0cmlkZSArIHhdOworICAgICAgaW50IGksIGo7CisgICAgICBmb3IgKGogPSB5XzA7IGogPCB5XzE7ICsraikgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzID0gc3JjICsgaiAqIHNyY19zdHJpZGU7CisgICAgICAgIGZvciAoaSA9IHhfMDsgaSA8IHhfMTsgKytpKSB7CisgICAgICAgICAgY29uc3QgZG91YmxlIGRpZmYgPSBzW2ldIC0gdmFsdWU7CisgICAgICAgICAgY29uc3QgZG91YmxlIHNzZSA9IGRpZmYgKiBkaWZmOworICAgICAgICAgIGlmIChzc2UgPCBiZXN0X3NzZSkgYmVzdF9zc2UgPSBzc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRvdGFsX3NzZSArPSBiZXN0X3NzZTsKKyAgICB9CisgIH0KKyAgc3RhdHMtPncgPSB3ICogaDsKKyAgc3RhdHMtPnhtID0gMDsKKyAgc3RhdHMtPnltID0gMDsKKyAgc3RhdHMtPnh4bSA9IHRvdGFsX3NzZTsKKyAgc3RhdHMtPnl5bSA9IDA7CisgIHN0YXRzLT54eG0gPSAwOworfQorI3VuZGVmIFJBRElVUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGlzdG9ydGlvbgorCisvLyBNYXggdmFsdWUgcmV0dXJuZWQgaW4gY2FzZSBvZiBleGFjdCBzaW1pbGFyaXR5Lgorc3RhdGljIGNvbnN0IGRvdWJsZSBrTWluRGlzdG9ydGlvbl9kQiA9IDk5LjsKK3N0YXRpYyBmbG9hdCBHZXRQU05SKGNvbnN0IGRvdWJsZSB2KSB7CisgIHJldHVybiAoZmxvYXQpKCh2ID4gMC4pID8gLTQuMzQyOTQ0OCAqIGxvZyh2IC8gKDI1NSAqIDI1NS4pKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCKTsKK30KKworaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbihjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQgcmVzdWx0WzVdKSB7CisgIFZQOERpc3RvU3RhdHMgc3RhdHNbNV07CisgIGludCB3LCBoOworCisgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CisKKyAgVlA4U1NJTURzcEluaXQoKTsKKworICBpZiAoc3JjID09IE5VTEwgfHwgcmVmID09IE5VTEwgfHwKKyAgICAgIHNyYy0+d2lkdGggIT0gcmVmLT53aWR0aCB8fCBzcmMtPmhlaWdodCAhPSByZWYtPmhlaWdodCB8fAorICAgICAgc3JjLT51c2VfYXJnYiAhPSByZWYtPnVzZV9hcmdiIHx8IHJlc3VsdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgdyA9IHNyYy0+d2lkdGg7CisgIGggPSBzcmMtPmhlaWdodDsKKworICBpZiAoc3JjLT51c2VfYXJnYiA9PSAxKSB7CisgICAgaWYgKHNyYy0+YXJnYiA9PSBOVUxMIHx8IHJlZi0+YXJnYiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGksIGosIGM7CisgICAgICB1aW50OF90KiB0bXAxLCAqdG1wMjsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9wbGFuZSA9CisgICAgICAgICAgKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDJVTEwgKiB3ICogaCwgc2l6ZW9mKCp0bXBfcGxhbmUpKTsKKyAgICAgIGlmICh0bXBfcGxhbmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgICB0bXAxID0gdG1wX3BsYW5lOworICAgICAgdG1wMiA9IHRtcF9wbGFuZSArIHcgKiBoOworICAgICAgZm9yIChjID0gMDsgYyA8IDQ7ICsrYykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgKytqKSB7CisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgeworICAgICAgICAgICAgdG1wMVtqICogdyArIGldID0gc3JjLT5hcmdiW2kgKyBqICogc3JjLT5hcmdiX3N0cmlkZV0gPj4gKGMgKiA4KTsKKyAgICAgICAgICAgIHRtcDJbaiAqIHcgKyBpXSA9IHJlZi0+YXJnYltpICsgaiAqIHJlZi0+YXJnYl9zdHJpZGVdID4+IChjICogOCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID49IDIpIHsKKyAgICAgICAgICBBY2N1bXVsYXRlTFNJTSh0bXAxLCB3LCB0bXAyLCB3LCB3LCBoLCAmc3RhdHNbY10pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUodG1wMSwgdywgdG1wMiwgdywgdywgaCwgJnN0YXRzW2NdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZnJlZSh0bXBfcGxhbmUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgaGFzX2FscGhhLCB1dl93LCB1dl9oOworICAgIGlmIChzcmMtPnkgPT0gTlVMTCB8fCByZWYtPnkgPT0gTlVMTCB8fAorICAgICAgICBzcmMtPnUgPT0gTlVMTCB8fCByZWYtPnUgPT0gTlVMTCB8fAorICAgICAgICBzcmMtPnYgPT0gTlVMTCB8fCByZWYtPnYgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGhhc19hbHBoYSA9ICEhKHNyYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCk7CisgICAgaWYgKGhhc19hbHBoYSAhPSAhIShyZWYtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpIHx8CisgICAgICAgIChoYXNfYWxwaGEgJiYgKHNyYy0+YSA9PSBOVUxMIHx8IHJlZi0+YSA9PSBOVUxMKSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHV2X3cgPSAoc3JjLT53aWR0aCArIDEpID4+IDE7CisgICAgdXZfaCA9IChzcmMtPmhlaWdodCArIDEpID4+IDE7CisgICAgaWYgKHR5cGUgPj0gMikgeworICAgICAgQWNjdW11bGF0ZUxTSU0oc3JjLT55LCBzcmMtPnlfc3RyaWRlLCByZWYtPnksIHJlZi0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICB3LCBoLCAmc3RhdHNbMF0pOworICAgICAgQWNjdW11bGF0ZUxTSU0oc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwgcmVmLT51LCByZWYtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIHV2X3csIHV2X2gsICZzdGF0c1sxXSk7CisgICAgICBBY2N1bXVsYXRlTFNJTShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLCByZWYtPnYsIHJlZi0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgdXZfdywgdXZfaCwgJnN0YXRzWzJdKTsKKyAgICAgIGlmIChoYXNfYWxwaGEpIHsKKyAgICAgICAgQWNjdW11bGF0ZUxTSU0oc3JjLT5hLCBzcmMtPmFfc3RyaWRlLCByZWYtPmEsIHJlZi0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsICZzdGF0c1szXSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnksIHJlZi0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgsICZzdGF0c1swXSk7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+dSwgc3JjLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+dSwgcmVmLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2X3csIHV2X2gsICZzdGF0c1sxXSk7CisgICAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+diwgc3JjLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+diwgcmVmLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2X3csIHV2X2gsICZzdGF0c1syXSk7CisgICAgICBpZiAoaGFzX2FscGhhKSB7CisgICAgICAgIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoc3JjLT5hLCBzcmMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+YSwgcmVmLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCAmc3RhdHNbM10pOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBGaW5hbCBzdGF0IGNhbGN1bGF0aW9ucy4KKyAgeworICAgIGludCBjOworICAgIGZvciAoYyA9IDA7IGMgPD0gNDsgKytjKSB7CisgICAgICBpZiAodHlwZSA9PSAxKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gVlA4U1NJTUdldCgmc3RhdHNbY10pOworICAgICAgICByZXN1bHRbY10gPSAoZmxvYXQpKCh2IDwgMS4pID8gLTEwLjAgKiBsb2cxMCgxLiAtIHYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrTWluRGlzdG9ydGlvbl9kQik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBkb3VibGUgdiA9IFZQOFNTSU1HZXRTcXVhcmVkRXJyb3IoJnN0YXRzW2NdKTsKKyAgICAgICAgcmVzdWx0W2NdID0gR2V0UFNOUih2KTsKKyAgICAgIH0KKyAgICAgIC8vIEFjY3VtdWxhdGUgZm9yd2FyZAorICAgICAgaWYgKGMgPCA0KSBWUDhTU0lNQWRkU3RhdHMoJnN0YXRzW2NdLCAmc3RhdHNbNF0pOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX3Jlc2NhbGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX3Jlc2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM1MDZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3BpY3R1cmVfcmVzY2FsZS5jCkBAIC0wLDAgKzEsMjY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdG9vbHM6IGNvcHksIGNyb3AsIHJlc2NhbGluZyBhbmQgdmlldy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBIQUxWRSh4KSAoKCh4KSArIDEpID4+IDEpCisKKy8vIEdyYWIgdGhlICdzcGVjcycgKHdyaXRlciwgKm9wYXF1ZSwgd2lkdGgsIGhlaWdodC4uLikgZnJvbSAnc3JjJyBhbmQgY29weSB0aGVtCisvLyBpbnRvICdkc3QnLiBNYXJrICdkc3QnIGFzIG5vdCBvd25pbmcgYW55IG1lbW9yeS4KK3N0YXRpYyB2b2lkIFBpY3R1cmVHcmFiU3BlY3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICAqZHN0ID0gKnNyYzsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcnMoZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQWRqdXN0IHRvcC1sZWZ0IGNvcm5lciB0byBjaHJvbWEgc2FtcGxlIHBvc2l0aW9uLgorc3RhdGljIHZvaWQgU25hcFRvcExlZnRQb3NpdGlvbihjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQsIGludCogY29uc3QgdG9wKSB7CisgIGlmICghcGljLT51c2VfYXJnYikgeworICAgICpsZWZ0ICY9IH4xOworICAgICp0b3AgJj0gfjE7CisgIH0KK30KKworLy8gQWRqdXN0IHRvcC1sZWZ0IGNvcm5lciBhbmQgdmVyaWZ5IHRoYXQgdGhlIHN1Yi1yZWN0YW5nbGUgaXMgdmFsaWQuCitzdGF0aWMgaW50IEFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdCwgaW50KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBTbmFwVG9wTGVmdFBvc2l0aW9uKHBpYywgbGVmdCwgdG9wKTsKKyAgaWYgKCgqbGVmdCkgPCAwIHx8ICgqdG9wKSA8IDApIHJldHVybiAwOworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgcmV0dXJuIDA7CisgIGlmICgoKmxlZnQpICsgd2lkdGggPiBwaWMtPndpZHRoKSByZXR1cm4gMDsKKyAgaWYgKCgqdG9wKSArIGhlaWdodCA+IHBpYy0+aGVpZ2h0KSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUNvcHkoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgV2ViUFBpY3R1cmUqIGRzdCkgeworICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHJldHVybiAwOworICBpZiAoc3JjID09IGRzdCkgcmV0dXJuIDE7CisKKyAgUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhkc3QpKSByZXR1cm4gMDsKKworICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+eSwgc3JjLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIGRzdC0+eSwgZHN0LT55X3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwgZHN0LT51LCBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIEhBTFZFKGRzdC0+d2lkdGgpLCBIQUxWRShkc3QtPmhlaWdodCkpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT52LCBzcmMtPnV2X3N0cmlkZSwgZHN0LT52LCBkc3QtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIEhBTFZFKGRzdC0+d2lkdGgpLCBIQUxWRShkc3QtPmhlaWdodCkpOworICAgIGlmIChkc3QtPmEgIT0gTlVMTCkgIHsKKyAgICAgIFdlYlBDb3B5UGxhbmUoc3JjLT5hLCBzcmMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmEsIGRzdC0+YV9zdHJpZGUsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgV2ViUENvcHlQbGFuZSgoY29uc3QgdWludDhfdCopc3JjLT5hcmdiLCA0ICogc3JjLT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICh1aW50OF90Kilkc3QtPmFyZ2IsIDQgKiBkc3QtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgNCAqIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlSXNWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOworICBpZiAocGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICByZXR1cm4gKHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9PSBOVUxMKTsKKyAgfQorICByZXR1cm4gKHBpY3R1cmUtPm1lbW9yeV8gPT0gTlVMTCk7Cit9CisKK2ludCBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCkgeworICBpZiAoc3JjID09IE5VTEwgfHwgZHN0ID09IE5VTEwpIHJldHVybiAwOworCisgIC8vIHZlcmlmeSByZWN0YW5nbGUgcG9zaXRpb24uCisgIGlmICghQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUoc3JjLCAmbGVmdCwgJnRvcCwgd2lkdGgsIGhlaWdodCkpIHJldHVybiAwOworCisgIGlmIChzcmMgIT0gZHN0KSB7ICAvLyBiZXdhcmUgb2YgYWxpYXNpbmchIFdlIGRvbid0IHdhbnQgdG8gbGVhayAnbWVtb3J5XycuCisgICAgUGljdHVyZUdyYWJTcGVjcyhzcmMsIGRzdCk7CisgIH0KKyAgZHN0LT53aWR0aCA9IHdpZHRoOworICBkc3QtPmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFzcmMtPnVzZV9hcmdiKSB7CisgICAgZHN0LT55ID0gc3JjLT55ICsgdG9wICogc3JjLT55X3N0cmlkZSArIGxlZnQ7CisgICAgZHN0LT51ID0gc3JjLT51ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7CisgICAgZHN0LT52ID0gc3JjLT52ICsgKHRvcCA+PiAxKSAqIHNyYy0+dXZfc3RyaWRlICsgKGxlZnQgPj4gMSk7CisgICAgZHN0LT55X3N0cmlkZSA9IHNyYy0+eV9zdHJpZGU7CisgICAgZHN0LT51dl9zdHJpZGUgPSBzcmMtPnV2X3N0cmlkZTsKKyAgICBpZiAoc3JjLT5hICE9IE5VTEwpIHsKKyAgICAgIGRzdC0+YSA9IHNyYy0+YSArIHRvcCAqIHNyYy0+YV9zdHJpZGUgKyBsZWZ0OworICAgICAgZHN0LT5hX3N0cmlkZSA9IHNyYy0+YV9zdHJpZGU7CisgICAgfQorICB9IGVsc2UgeworICAgIGRzdC0+YXJnYiA9IHNyYy0+YXJnYiArIHRvcCAqIHNyYy0+YXJnYl9zdHJpZGUgKyBsZWZ0OworICAgIGRzdC0+YXJnYl9zdHJpZGUgPSBzcmMtPmFyZ2Jfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGljdHVyZSBjcm9wcGluZworCitpbnQgV2ViUFBpY3R1cmVDcm9wKFdlYlBQaWN0dXJlKiBwaWMsCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUFBpY3R1cmUgdG1wOworCisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmICghQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUocGljLCAmbGVmdCwgJnRvcCwgd2lkdGgsIGhlaWdodCkpIHJldHVybiAwOworCisgIFBpY3R1cmVHcmFiU3BlY3MocGljLCAmdG1wKTsKKyAgdG1wLndpZHRoID0gd2lkdGg7CisgIHRtcC5oZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgcmV0dXJuIDA7CisKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgaW50IHlfb2Zmc2V0ID0gdG9wICogcGljLT55X3N0cmlkZSArIGxlZnQ7CisgICAgY29uc3QgaW50IHV2X29mZnNldCA9ICh0b3AgLyAyKSAqIHBpYy0+dXZfc3RyaWRlICsgbGVmdCAvIDI7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnkgKyB5X29mZnNldCwgcGljLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC55LCB0bXAueV9zdHJpZGUsIHdpZHRoLCBoZWlnaHQpOworICAgIFdlYlBDb3B5UGxhbmUocGljLT51ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC51LCB0bXAudXZfc3RyaWRlLCBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCkpOworICAgIFdlYlBDb3B5UGxhbmUocGljLT52ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIHRtcC52LCB0bXAudXZfc3RyaWRlLCBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCkpOworCisgICAgaWYgKHRtcC5hICE9IE5VTEwpIHsKKyAgICAgIGNvbnN0IGludCBhX29mZnNldCA9IHRvcCAqIHBpYy0+YV9zdHJpZGUgKyBsZWZ0OworICAgICAgV2ViUENvcHlQbGFuZShwaWMtPmEgKyBhX29mZnNldCwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgdG1wLmEsIHRtcC5hX3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9CisgICAgICAgIChjb25zdCB1aW50OF90KikocGljLT5hcmdiICsgdG9wICogcGljLT5hcmdiX3N0cmlkZSArIGxlZnQpOworICAgIFdlYlBDb3B5UGxhbmUoc3JjLCBwaWMtPmFyZ2Jfc3RyaWRlICogNCwgKHVpbnQ4X3QqKXRtcC5hcmdiLAorICAgICAgICAgICAgICAgICAgdG1wLmFyZ2Jfc3RyaWRlICogNCwgd2lkdGggKiA0LCBoZWlnaHQpOworICB9CisgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICAqcGljID0gdG1wOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBwaWN0dXJlIHJlc2NhbGVyCisKK3N0YXRpYyB2b2lkIFJlc2NhbGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZXJfdCogY29uc3Qgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKSB7CisgIFdlYlBSZXNjYWxlciByZXNjYWxlcjsKKyAgaW50IHkgPSAwOworICBXZWJQUmVzY2FsZXJJbml0KCZyZXNjYWxlciwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVscywgd29yayk7CisgIHdoaWxlICh5IDwgc3JjX2hlaWdodCkgeworICAgIHkgKz0gV2ViUFJlc2NhbGVySW1wb3J0KCZyZXNjYWxlciwgc3JjX2hlaWdodCAtIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgeSAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydCgmcmVzY2FsZXIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhTXVsdGlwbHlBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBpbnZlcnNlKSB7CisgIGFzc2VydChwaWMtPmFyZ2IgIT0gTlVMTCk7CisgIFdlYlBNdWx0QVJHQlJvd3MoKHVpbnQ4X3QqKXBpYy0+YXJnYiwgcGljLT5hcmdiX3N0cmlkZSAqIHNpemVvZigqcGljLT5hcmdiKSwKKyAgICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwgaW52ZXJzZSk7Cit9CisKK3N0YXRpYyB2b2lkIEFscGhhTXVsdGlwbHlZKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBpbnZlcnNlKSB7CisgIGlmIChwaWMtPmEgIT0gTlVMTCkgeworICAgIFdlYlBNdWx0Um93cyhwaWMtPnksIHBpYy0+eV9zdHJpZGUsIHBpYy0+YSwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgcGljLT53aWR0aCwgcGljLT5oZWlnaHQsIGludmVyc2UpOworICB9Cit9CisKK2ludCBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFdlYlBQaWN0dXJlIHRtcDsKKyAgaW50IHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0OworICByZXNjYWxlcl90KiB3b3JrOworCisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIHByZXZfd2lkdGggPSBwaWMtPndpZHRoOworICBwcmV2X2hlaWdodCA9IHBpYy0+aGVpZ2h0OworICBpZiAoIVdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnMoCisgICAgICAgICAgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsICZ3aWR0aCwgJmhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFBpY3R1cmVHcmFiU3BlY3MocGljLCAmdG1wKTsKKyAgdG1wLndpZHRoID0gd2lkdGg7CisgIHRtcC5oZWlnaHQgPSBoZWlnaHQ7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmdG1wKSkgcmV0dXJuIDA7CisKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgd29yayA9IChyZXNjYWxlcl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGgsIHNpemVvZigqd29yaykpOworICAgIGlmICh3b3JrID09IE5VTEwpIHsKKyAgICAgIFdlYlBQaWN0dXJlRnJlZSgmdG1wKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBJZiBwcmVzZW50LCB3ZSBuZWVkIHRvIHJlc2NhbGUgYWxwaGEgZmlyc3QgKGZvciBBbHBoYU11bHRpcGx5WSkuCisgICAgaWYgKHBpYy0+YSAhPSBOVUxMKSB7CisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgICAgUmVzY2FsZVBsYW5lKHBpYy0+YSwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsIHBpYy0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgdG1wLmEsIHdpZHRoLCBoZWlnaHQsIHRtcC5hX3N0cmlkZSwgd29yaywgMSk7CisgICAgfQorCisgICAgLy8gV2UgdGFrZSB0cmFuc3BhcmVuY3kgaW50byBhY2NvdW50IG9uIHRoZSBsdW1hIHBsYW5lIG9ubHkuIFRoYXQncyBub3QKKyAgICAvLyB0b3RhbGx5IGV4YWN0IGJsZW5kaW5nLCBidXQgc3RpbGwgaXMgYSBnb29kIGFwcHJveGltYXRpb24uCisgICAgQWxwaGFNdWx0aXBseVkocGljLCAwKTsKKyAgICBSZXNjYWxlUGxhbmUocGljLT55LCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT55X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnksIHdpZHRoLCBoZWlnaHQsIHRtcC55X3N0cmlkZSwgd29yaywgMSk7CisgICAgQWxwaGFNdWx0aXBseVkoJnRtcCwgMSk7CisKKyAgICBSZXNjYWxlUGxhbmUocGljLT51LAorICAgICAgICAgICAgICAgICBIQUxWRShwcmV2X3dpZHRoKSwgSEFMVkUocHJldl9oZWlnaHQpLCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnUsCisgICAgICAgICAgICAgICAgIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSwgdG1wLnV2X3N0cmlkZSwgd29yaywgMSk7CisgICAgUmVzY2FsZVBsYW5lKHBpYy0+diwKKyAgICAgICAgICAgICAgICAgSEFMVkUocHJldl93aWR0aCksIEhBTFZFKHByZXZfaGVpZ2h0KSwgcGljLT51dl9zdHJpZGUsCisgICAgICAgICAgICAgICAgIHRtcC52LAorICAgICAgICAgICAgICAgICBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCksIHRtcC51dl9zdHJpZGUsIHdvcmssIDEpOworICB9IGVsc2UgeworICAgIHdvcmsgPSAocmVzY2FsZXJfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoICogNCwgc2l6ZW9mKCp3b3JrKSk7CisgICAgaWYgKHdvcmsgPT0gTlVMTCkgeworICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEluIG9yZGVyIHRvIGNvcnJlY3RseSBpbnRlcnBvbGF0ZSBjb2xvcnMsIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGFscGhhCisgICAgLy8gd2VpZ2h0aW5nIGZpcnN0IChibGFjay1tYXR0aW5nKSwgc2NhbGUgdGhlIFJHQiB2YWx1ZXMsIGFuZCByZW1vdmUKKyAgICAvLyB0aGUgcHJlbXVsdGlwbGljYXRpb24gYWZ0ZXJ3YXJkICh3aGlsZSBwcmVzZXJ2aW5nIHRoZSBhbHBoYSBjaGFubmVsKS4KKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgIEFscGhhTXVsdGlwbHlBUkdCKHBpYywgMCk7CisgICAgUmVzY2FsZVBsYW5lKChjb25zdCB1aW50OF90KilwaWMtPmFyZ2IsIHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0LAorICAgICAgICAgICAgICAgICBwaWMtPmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKXRtcC5hcmdiLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICB0bXAuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICB3b3JrLCA0KTsKKyAgICBBbHBoYU11bHRpcGx5QVJHQigmdG1wLCAxKTsKKyAgfQorICBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgV2ViUFNhZmVGcmVlKHdvcmspOworICAqcGljID0gdG1wOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9waWN0dXJlX3Rvb2xzLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV90b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTk4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcGljdHVyZV90b29scy5jCkBAIC0wLDAgKzEsMjI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdG9vbHM6IGFscGhhIGhhbmRsaW5nLCBldGMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL3l1di5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTWFrZUFSR0IzMihpbnQgciwgaW50IGcsIGludCBiKSB7CisgIHJldHVybiAoMHhmZjAwMDAwMHUgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyOiBjbGVhbiB1cCBmdWxseSB0cmFuc3BhcmVudCBhcmVhIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5LgorCisjZGVmaW5lIFNJWkUgOAorI2RlZmluZSBTSVpFMiAoU0laRSAvIDIpCitzdGF0aWMgaW50IGlzX3RyYW5zcGFyZW50X2FyZWEoY29uc3QgdWludDhfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgeworICBpbnQgeSwgeDsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKKyAgICAgIGlmIChwdHJbeF0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICAgIHB0ciArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaXNfdHJhbnNwYXJlbnRfYXJnYl9hcmVhKGNvbnN0IHVpbnQzMl90KiBwdHIsIGludCBzdHJpZGUsIGludCBzaXplKSB7CisgIGludCB5LCB4OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7ICsreCkgeworICAgICAgaWYgKHB0clt4XSAmIDB4ZmYwMDAwMDB1KSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgICBwdHIgKz0gc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBmbGF0dGVuKHVpbnQ4X3QqIHB0ciwgaW50IHYsIGludCBzdHJpZGUsIGludCBzaXplKSB7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgbWVtc2V0KHB0ciwgdiwgc2l6ZSk7CisgICAgcHRyICs9IHN0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBmbGF0dGVuX2FyZ2IodWludDMyX3QqIHB0ciwgdWludDMyX3QgdiwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSBwdHJbeF0gPSB2OworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKwordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShXZWJQUGljdHVyZSogcGljKSB7CisgIGludCB4LCB5LCB3LCBoOworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgdyA9IHBpYy0+d2lkdGggLyBTSVpFOworICBoID0gcGljLT5oZWlnaHQgLyBTSVpFOworCisgIC8vIG5vdGU6IHdlIGlnbm9yZSB0aGUgbGVmdC1vdmVycyBvbiByaWdodC9ib3R0b20KKyAgaWYgKHBpYy0+dXNlX2FyZ2IpIHsKKyAgICB1aW50MzJfdCBhcmdiX3ZhbHVlID0gMDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgICBpbnQgbmVlZF9yZXNldCA9IDE7CisgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBvZmYgPSAoeSAqIHBpYy0+YXJnYl9zdHJpZGUgKyB4KSAqIFNJWkU7CisgICAgICAgIGlmIChpc190cmFuc3BhcmVudF9hcmdiX2FyZWEocGljLT5hcmdiICsgb2ZmLCBwaWMtPmFyZ2Jfc3RyaWRlLCBTSVpFKSkgeworICAgICAgICAgIGlmIChuZWVkX3Jlc2V0KSB7CisgICAgICAgICAgICBhcmdiX3ZhbHVlID0gcGljLT5hcmdiW29mZl07CisgICAgICAgICAgICBuZWVkX3Jlc2V0ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZmxhdHRlbl9hcmdiKHBpYy0+YXJnYiArIG9mZiwgYXJnYl92YWx1ZSwgcGljLT5hcmdiX3N0cmlkZSwgU0laRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmVlZF9yZXNldCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgYV9wdHIgPSBwaWMtPmE7CisgICAgaW50IHZhbHVlc1szXSA9IHsgMCB9OworICAgIGlmIChhX3B0ciA9PSBOVUxMKSByZXR1cm47ICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgICBpbnQgbmVlZF9yZXNldCA9IDE7CisgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBvZmZfYSA9ICh5ICogcGljLT5hX3N0cmlkZSArIHgpICogU0laRTsKKyAgICAgICAgY29uc3QgaW50IG9mZl95ID0gKHkgKiBwaWMtPnlfc3RyaWRlICsgeCkgKiBTSVpFOworICAgICAgICBjb25zdCBpbnQgb2ZmX3V2ID0gKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogU0laRTI7CisgICAgICAgIGlmIChpc190cmFuc3BhcmVudF9hcmVhKGFfcHRyICsgb2ZmX2EsIHBpYy0+YV9zdHJpZGUsIFNJWkUpKSB7CisgICAgICAgICAgaWYgKG5lZWRfcmVzZXQpIHsKKyAgICAgICAgICAgIHZhbHVlc1swXSA9IHBpYy0+eVtvZmZfeV07CisgICAgICAgICAgICB2YWx1ZXNbMV0gPSBwaWMtPnVbb2ZmX3V2XTsKKyAgICAgICAgICAgIHZhbHVlc1syXSA9IHBpYy0+dltvZmZfdXZdOworICAgICAgICAgICAgbmVlZF9yZXNldCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGZsYXR0ZW4ocGljLT55ICsgb2ZmX3ksIHZhbHVlc1swXSwgcGljLT55X3N0cmlkZSwgU0laRSk7CisgICAgICAgICAgZmxhdHRlbihwaWMtPnUgKyBvZmZfdXYsIHZhbHVlc1sxXSwgcGljLT51dl9zdHJpZGUsIFNJWkUyKTsKKyAgICAgICAgICBmbGF0dGVuKHBpYy0+diArIG9mZl91diwgdmFsdWVzWzJdLCBwaWMtPnV2X3N0cmlkZSwgU0laRTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5lZWRfcmVzZXQgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBTSVpFCisjdW5kZWYgU0laRTIKKwordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYUxvc3NsZXNzKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgaW50IHgsIHksIHcsIGg7CisgIHVpbnQzMl90KiBhcmdiOworICBhc3NlcnQocGljICE9IE5VTEwgJiYgcGljLT51c2VfYXJnYik7CisgIHcgPSBwaWMtPndpZHRoOworICBoID0gcGljLT5oZWlnaHQ7CisgIGFyZ2IgPSBwaWMtPmFyZ2I7CisKKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGlmICgoYXJnYlt4XSAmIDB4ZmYwMDAwMDApID09IDApIHsKKyAgICAgICAgYXJnYlt4XSA9IDB4MDAwMDAwMDA7CisgICAgICB9CisgICAgfQorICAgIGFyZ2IgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmxlbmQgY29sb3IgYW5kIHJlbW92ZSB0cmFuc3BhcmVuY3kgaW5mbworCisjZGVmaW5lIEJMRU5EKFYwLCBWMSwgQUxQSEEpIFwKKyAgICAoKCgoVjApICogKDI1NSAtIChBTFBIQSkpICsgKFYxKSAqIChBTFBIQSkpICogMHgxMDEpID4+IDE2KQorI2RlZmluZSBCTEVORF8xMEJJVChWMCwgVjEsIEFMUEhBKSBcCisgICAgKCgoKFYwKSAqICgxMDIwIC0gKEFMUEhBKSkgKyAoVjEpICogKEFMUEhBKSkgKiAweDEwMSkgPj4gMTgpCisKK3ZvaWQgV2ViUEJsZW5kQWxwaGEoV2ViUFBpY3R1cmUqIHBpYywgdWludDMyX3QgYmFja2dyb3VuZF9yZ2IpIHsKKyAgY29uc3QgaW50IHJlZCA9IChiYWNrZ3JvdW5kX3JnYiA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgZ3JlZW4gPSAoYmFja2dyb3VuZF9yZ2IgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgYmx1ZSA9IChiYWNrZ3JvdW5kX3JnYiA+PiAwKSAmIDB4ZmY7CisgIGludCB4LCB5OworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHBpYy0+d2lkdGggPj4gMSk7ICAvLyBvbWl0IGxhc3QgcGl4ZWwgZHVyaW5nIHUvdiBsb29wCisgICAgY29uc3QgaW50IFkwID0gVlA4UkdCVG9ZKHJlZCwgZ3JlZW4sIGJsdWUsIFlVVl9IQUxGKTsKKyAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIHRoZSB1L3YgdmFsdWVzIHN1bW1lZCBvdmVyIGZvdXIgcGl4ZWxzCisgICAgY29uc3QgaW50IFUwID0gVlA4UkdCVG9VKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IFYwID0gVlA4UkdCVG9WKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IHBpYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKKyAgICBpZiAoIWhhc19hbHBoYSB8fCBwaWMtPmEgPT0gTlVMTCkgcmV0dXJuOyAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIC8vIEx1bWEgYmxlbmRpbmcKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHlfcHRyID0gcGljLT55ICsgeSAqIHBpYy0+eV9zdHJpZGU7CisgICAgICB1aW50OF90KiBjb25zdCBhX3B0ciA9IHBpYy0+YSArIHkgKiBwaWMtPmFfc3RyaWRlOworICAgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgYWxwaGEgPSBhX3B0clt4XTsKKyAgICAgICAgaWYgKGFscGhhIDwgMHhmZikgeworICAgICAgICAgIHlfcHRyW3hdID0gQkxFTkQoWTAsIHlfcHRyW3hdLCBhX3B0clt4XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIENocm9tYSBibGVuZGluZyBldmVyeSBldmVuIGxpbmUKKyAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgdWludDhfdCogY29uc3QgdSA9IHBpYy0+dSArICh5ID4+IDEpICogcGljLT51dl9zdHJpZGU7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBwaWMtPnYgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgICB1aW50OF90KiBjb25zdCBhX3B0cjIgPQorICAgICAgICAgICAgKHkgKyAxID09IHBpYy0+aGVpZ2h0KSA/IGFfcHRyIDogYV9wdHIgKyBwaWMtPmFfc3RyaWRlOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdXZfd2lkdGg7ICsreCkgeworICAgICAgICAgIC8vIEF2ZXJhZ2UgZm91ciBhbHBoYSB2YWx1ZXMgaW50byBhIHNpbmdsZSBibGVuZGluZyB3ZWlnaHQuCisgICAgICAgICAgLy8gVE9ETyhza2FsKTogbWlnaHQgbGVhZCB0byB2aXNpYmxlIGNvbnRvdXJpbmcuIENhbiB3ZSBkbyBiZXR0ZXI/CisgICAgICAgICAgY29uc3QgaW50IGFscGhhID0KKyAgICAgICAgICAgICAgYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyWzIgKiB4ICsgMV0gKworICAgICAgICAgICAgICBhX3B0cjJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDFdOworICAgICAgICAgIHVbeF0gPSBCTEVORF8xMEJJVChVMCwgdVt4XSwgYWxwaGEpOworICAgICAgICAgIHZbeF0gPSBCTEVORF8xMEJJVChWMCwgdlt4XSwgYWxwaGEpOworICAgICAgICB9CisgICAgICAgIGlmIChwaWMtPndpZHRoICYgMSkgeyAgIC8vIHJpZ2h0bW9zdCBwaXhlbAorICAgICAgICAgIGNvbnN0IGludCBhbHBoYSA9IDIgKiAoYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDBdKTsKKyAgICAgICAgICB1W3hdID0gQkxFTkRfMTBCSVQoVTAsIHVbeF0sIGFscGhhKTsKKyAgICAgICAgICB2W3hdID0gQkxFTkRfMTBCSVQoVjAsIHZbeF0sIGFscGhhKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWVtc2V0KGFfcHRyLCAweGZmLCBwaWMtPndpZHRoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgICAgY29uc3QgdWludDMyX3QgYmFja2dyb3VuZCA9IE1ha2VBUkdCMzIocmVkLCBncmVlbiwgYmx1ZSk7CisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGFscGhhID0gKGFyZ2JbeF0gPj4gMjQpICYgMHhmZjsKKyAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYpIHsKKyAgICAgICAgICBpZiAoYWxwaGEgPiAwKSB7CisgICAgICAgICAgICBpbnQgciA9IChhcmdiW3hdID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgZyA9IChhcmdiW3hdID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgYiA9IChhcmdiW3hdID4+ICAwKSAmIDB4ZmY7CisgICAgICAgICAgICByID0gQkxFTkQocmVkLCByLCBhbHBoYSk7CisgICAgICAgICAgICBnID0gQkxFTkQoZ3JlZW4sIGcsIGFscGhhKTsKKyAgICAgICAgICAgIGIgPSBCTEVORChibHVlLCBiLCBhbHBoYSk7CisgICAgICAgICAgICBhcmdiW3hdID0gTWFrZUFSR0IzMihyLCBnLCBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnYlt4XSA9IGJhY2tncm91bmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBCTEVORAorI3VuZGVmIEJMRU5EXzEwQklUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcXVhbnQuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9xdWFudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDQ4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvcXVhbnQuYwpAQCAtMCwwICsxLDEyODMgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIFF1YW50aXphdGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGVuY2kuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmgiCisKKyNkZWZpbmUgRE9fVFJFTExJU19JNCAgMQorI2RlZmluZSBET19UUkVMTElTX0kxNiAxICAgLy8gbm90IGEgaHVnZSBnYWluLCBidXQgb2sgYXQgbG93IGJpdHJhdGUuCisjZGVmaW5lIERPX1RSRUxMSVNfVVYgIDAgICAvLyBkaXNhYmxlIHRyZWxsaXMgZm9yIFVWLiBSaXNreS4gTm90IHdvcnRoLgorI2RlZmluZSBVU0VfVERJU1RPIDEKKworI2RlZmluZSBNSURfQUxQSEEgNjQgICAgICAvLyBuZXV0cmFsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorI2RlZmluZSBNSU5fQUxQSEEgMzAgICAgICAvLyBsb3dlc3QgdXNhYmxlIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorI2RlZmluZSBNQVhfQUxQSEEgMTAwICAgICAvLyBoaWdoZXIgbWVhbmluZ2Z1bCB2YWx1ZSBmb3Igc3VzY2VwdGliaWxpdHkKKworI2RlZmluZSBTTlNfVE9fRFEgMC45ICAgICAvLyBTY2FsaW5nIGNvbnN0YW50IGJldHdlZW4gdGhlIHNucyB2YWx1ZSBhbmQgdGhlIFFQCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvd2VyLWxhdyBtb2R1bGF0aW9uLiBNdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiAxLgorCisvLyBudW1iZXIgb2Ygbm9uLXplcm8gY29lZmZzIGJlbG93IHdoaWNoIHdlIGNvbnNpZGVyIHRoZSBibG9jayB2ZXJ5IGZsYXQKKy8vIChhbmQgYXBwbHkgYSBwZW5hbHR5IHRvIGNvbXBsZXggcHJlZGljdGlvbnMpCisjZGVmaW5lIEZMQVRORVNTX0xJTUlUX0kxNiAxMCAgICAgIC8vIEkxNiBtb2RlCisjZGVmaW5lIEZMQVRORVNTX0xJTUlUX0k0ICAzICAgICAgIC8vIEk0IG1vZGUKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfVVYgIDIgICAgICAgLy8gVVYgbW9kZQorI2RlZmluZSBGTEFUTkVTU19QRU5BTFRZICAgMTQwICAgICAvLyByb3VnaGx5IH4xYml0IHBlciBibG9jaworCisjZGVmaW5lIE1VTFRfOEIoYSwgYikgKCgoYSkgKiAoYikgKyAxMjgpID4+IDgpCisKKyNkZWZpbmUgUkRfRElTVE9fTVVMVCAgICAgIDI1NiAgLy8gZGlzdG9ydGlvbiBtdWx0aXBsaWVyIChlcXVpdmFsZW50IG9mIGxhbWJkYSkKKworLy8gI2RlZmluZSBERUJVR19CTE9DSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgZGVmaW5lZChERUJVR19CTE9DSykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIFByaW50QmxvY2tJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IGludCBpc19pMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlfaW4gPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeV9vdXQgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHV2X2luID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHV2X291dCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgcHJpbnRmKCJTT1VSQ0UgLyBPVVRQVVQgLyBBQlMgREVMVEFcbiIpOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB5X2luW2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB5X291dFtpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICAgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlMWQgIiwgYWJzKHlfaW5baSArIGogKiBCUFNdIC0geV9vdXRbaSArIGogKiBCUFNdKSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuIik7ICAgLy8gbmV3bGluZSBiZWZvcmUgdGhlIFUvViBibG9jaworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9vdXRbaSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgdXZfb3V0W2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnModXZfb3V0W2kgKyBqICogQlBTXSAtIHV2X2luW2kgKyBqICogQlBTXSkpOworICAgIH0KKyAgICBwcmludGYoIiAiKTsKKyAgICBmb3IgKGkgPSA4OyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlMWQgIiwgYWJzKHV2X291dFtpICsgaiAqIEJQU10gLSB1dl9pbltpICsgaiAqIEJQU10pKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigiXG5EOiVkIFNEOiVkIFI6JWQgSDolZCBuejoweCV4IHNjb3JlOiVkXG4iLAorICAgIChpbnQpcmQtPkQsIChpbnQpcmQtPlNELCAoaW50KXJkLT5SLCAoaW50KXJkLT5ILCAoaW50KXJkLT5ueiwKKyAgICAoaW50KXJkLT5zY29yZSk7CisgIGlmIChpc19pMTYpIHsKKyAgICBwcmludGYoIk1vZGU6ICVkXG4iLCByZC0+bW9kZV9pMTYpOworICAgIHByaW50ZigieV9kY19sZXZlbHM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHJkLT55X2RjX2xldmVsc1tpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiTW9kZXNbMTZdOiAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlZCAiLCByZC0+bW9kZXNfaTRbaV0pOworICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoInlfYWNfbGV2ZWxzOlxuIik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgZm9yIChpID0gaXNfaTE2ID8gMSA6IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiU0ZCAiLCByZC0+eV9hY19sZXZlbHNbal1baV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoInV2X2xldmVscyAobW9kZT0lZCk6XG4iLCByZC0+bW9kZV91dik7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgcHJpbnRmKCIlNGQgIiwgcmQtPnV2X2xldmVsc1tqXVtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorfQorCisjZW5kaWYgICAvLyBERUJVR19CTE9DSworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IGNsaXAoaW50IHYsIGludCBtLCBpbnQgTSkgeworICByZXR1cm4gdiA8IG0gPyBtIDogdiA+IE0gPyBNIDogdjsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ppZ3phZ1sxNl0gPSB7CisgIDAsIDEsIDQsIDgsIDUsIDIsIDMsIDYsIDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtEY1RhYmxlWzEyOF0gPSB7CisgIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEwLAorICAxMSwgICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxNywKKyAgMTgsICAgMTksICAyMCwgIDIwLCAgMjEsICAyMSwgIDIyLCAgMjIsCisgIDIzLCAgIDIzLCAgMjQsICAyNSwgIDI1LCAgMjYsICAyNywgIDI4LAorICAyOSwgICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwKKyAgMzcsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLAorICA1MSwgICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwKKyAgNTksICAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsCisgIDY3LCAgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LAorICA3NSwgICA3NiwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwKKyAgODIsICAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksCisgIDkxLCAgIDkzLCAgOTUsICA5NiwgIDk4LCAxMDAsIDEwMSwgMTAyLAorICAxMDQsIDEwNiwgMTA4LCAxMTAsIDExMiwgMTE0LCAxMTYsIDExOCwKKyAgMTIyLCAxMjQsIDEyNiwgMTI4LCAxMzAsIDEzMiwgMTM0LCAxMzYsCisgIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ4LCAxNTEsIDE1NCwgMTU3Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTEsCisgIDEyLCAgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LAorICAyMCwgICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywKKyAgMjgsICAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCisgIDM2LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAorICA0NCwgICA0NSwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsICA1MSwKKyAgNTIsICAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNjAsCisgIDYyLCAgIDY0LCAgNjYsICA2OCwgIDcwLCAgNzIsICA3NCwgIDc2LAorICA3OCwgICA4MCwgIDgyLCAgODQsICA4NiwgIDg4LCAgOTAsICA5MiwKKyAgOTQsICAgOTYsICA5OCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsCisgIDExMCwgMTEyLCAxMTQsIDExNiwgMTE5LCAxMjIsIDEyNSwgMTI4LAorICAxMzEsIDEzNCwgMTM3LCAxNDAsIDE0MywgMTQ2LCAxNDksIDE1MiwKKyAgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsIDE3MCwgMTczLCAxNzcsCisgIDE4MSwgMTg1LCAxODksIDE5MywgMTk3LCAyMDEsIDIwNSwgMjA5LAorICAyMTMsIDIxNywgMjIxLCAyMjUsIDIyOSwgMjM0LCAyMzksIDI0NSwKKyAgMjQ5LCAyNTQsIDI1OSwgMjY0LCAyNjksIDI3NCwgMjc5LCAyODQKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZTJbMTI4XSA9IHsKKyAgOCwgICAgIDgsICAgOSwgIDEwLCAgMTIsICAxMywgIDE1LCAgMTcsCisgIDE4LCAgIDIwLCAgMjEsICAyMywgIDI0LCAgMjYsICAyNywgIDI5LAorICAzMSwgICAzMiwgIDM0LCAgMzUsICAzNywgIDM4LCAgNDAsICA0MSwKKyAgNDMsICAgNDQsICA0NiwgIDQ4LCAgNDksICA1MSwgIDUyLCAgNTQsCisgIDU1LCAgIDU3LCAgNTgsICA2MCwgIDYyLCAgNjMsICA2NSwgIDY2LAorICA2OCwgICA2OSwgIDcxLCAgNzIsICA3NCwgIDc1LCAgNzcsICA3OSwKKyAgODAsICAgODIsICA4MywgIDg1LCAgODYsICA4OCwgIDg5LCAgOTMsCisgIDk2LCAgIDk5LCAxMDIsIDEwNSwgMTA4LCAxMTEsIDExNCwgMTE3LAorICAxMjAsIDEyNCwgMTI3LCAxMzAsIDEzMywgMTM2LCAxMzksIDE0MiwKKyAgMTQ1LCAxNDgsIDE1MSwgMTU1LCAxNTgsIDE2MSwgMTY0LCAxNjcsCisgIDE3MCwgMTczLCAxNzYsIDE3OSwgMTg0LCAxODksIDE5MywgMTk4LAorICAyMDMsIDIwNywgMjEyLCAyMTcsIDIyMSwgMjI2LCAyMzAsIDIzNSwKKyAgMjQwLCAyNDQsIDI0OSwgMjU0LCAyNTgsIDI2MywgMjY4LCAyNzQsCisgIDI4MCwgMjg2LCAyOTIsIDI5OSwgMzA1LCAzMTEsIDMxNywgMzIzLAorICAzMzAsIDMzNiwgMzQyLCAzNDgsIDM1NCwgMzYyLCAzNzAsIDM3OSwKKyAgMzg1LCAzOTMsIDQwMSwgNDA5LCA0MTYsIDQyNCwgNDMyLCA0NDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCaWFzTWF0cmljZXNbM11bMl0gPSB7ICAvLyBbbHVtYS1hYyxsdW1hLWRjLGNocm9tYV1bZGMsYWNdCisgIHsgOTYsIDExMCB9LCB7IDk2LCAxMDggfSwgeyAxMTAsIDExNSB9Cit9OworCisvLyBTaGFycGVuaW5nIGJ5IChzbGlnaHRseSkgcmFpc2luZyB0aGUgaGktZnJlcXVlbmN5IGNvZWZmcy4KKy8vIEhhY2staXNoIGJ1dCBoZWxwZnVsIGZvciBtaWQtYml0cmF0ZSByYW5nZS4gVXNlIHdpdGggY2FyZS4KKyNkZWZpbmUgU0hBUlBFTl9CSVRTIDExICAvLyBudW1iZXIgb2YgZGVzY2FsaW5nIGJpdHMgZm9yIHNoYXJwZW5pbmcgYmlhcworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZyZXFTaGFycGVuaW5nWzE2XSA9IHsKKyAgMCwgIDMwLCA2MCwgOTAsCisgIDMwLCA2MCwgOTAsIDkwLAorICA2MCwgOTAsIDkwLCA5MCwKKyAgOTAsIDkwLCA5MCwgOTAKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGluIFZQOE1hdHJpeAorCisvLyBSZXR1cm5zIHRoZSBhdmVyYWdlIHF1YW50aXplcgorc3RhdGljIGludCBFeHBhbmRNYXRyaXgoVlA4TWF0cml4KiBjb25zdCBtLCBpbnQgdHlwZSkgeworICBpbnQgaSwgc3VtOworICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgY29uc3QgaW50IGlzX2FjX2NvZWZmID0gKGkgPiAwKTsKKyAgICBjb25zdCBpbnQgYmlhcyA9IGtCaWFzTWF0cmljZXNbdHlwZV1baXNfYWNfY29lZmZdOworICAgIG0tPmlxX1tpXSA9ICgxIDw8IFFGSVgpIC8gbS0+cV9baV07CisgICAgbS0+Ymlhc19baV0gPSBCSUFTKGJpYXMpOworICAgIC8vIHp0aHJlc2hfIGlzIHRoZSBleGFjdCB2YWx1ZSBzdWNoIHRoYXQgUVVBTlRESVYoY29lZmYsIGlRLCBCKSBpczoKKyAgICAvLyAgICogemVybyBpZiBjb2VmZiA8PSB6dGhyZXNoCisgICAgLy8gICAqIG5vbi16ZXJvIGlmIGNvZWZmID4genRocmVzaAorICAgIG0tPnp0aHJlc2hfW2ldID0gKCgxIDw8IFFGSVgpIC0gMSAtIG0tPmJpYXNfW2ldKSAvIG0tPmlxX1tpXTsKKyAgfQorICBmb3IgKGkgPSAyOyBpIDwgMTY7ICsraSkgeworICAgIG0tPnFfW2ldID0gbS0+cV9bMV07CisgICAgbS0+aXFfW2ldID0gbS0+aXFfWzFdOworICAgIG0tPmJpYXNfW2ldID0gbS0+Ymlhc19bMV07CisgICAgbS0+enRocmVzaF9baV0gPSBtLT56dGhyZXNoX1sxXTsKKyAgfQorICBmb3IgKHN1bSA9IDAsIGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGlmICh0eXBlID09IDApIHsgIC8vIHdlIG9ubHkgdXNlIHNoYXJwZW5pbmcgZm9yIEFDIGx1bWEgY29lZmZzCisgICAgICBtLT5zaGFycGVuX1tpXSA9IChrRnJlcVNoYXJwZW5pbmdbaV0gKiBtLT5xX1tpXSkgPj4gU0hBUlBFTl9CSVRTOworICAgIH0gZWxzZSB7CisgICAgICBtLT5zaGFycGVuX1tpXSA9IDA7CisgICAgfQorICAgIHN1bSArPSBtLT5xX1tpXTsKKyAgfQorICByZXR1cm4gKHN1bSArIDgpID4+IDQ7Cit9CisKK3N0YXRpYyB2b2lkIENoZWNrTGFtYmRhVmFsdWUoaW50KiBjb25zdCB2KSB7IGlmICgqdiA8IDEpICp2ID0gMTsgfQorCitzdGF0aWMgdm9pZCBTZXR1cE1hdHJpY2VzKFZQOEVuY29kZXIqIGVuYykgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRsYW1iZGFfc2NhbGUgPQorICAgIChlbmMtPm1ldGhvZF8gPj0gNCkgPyBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7CisgICAgVlA4U2VnbWVudEluZm8qIGNvbnN0IG0gPSAmZW5jLT5kcW1fW2ldOworICAgIGNvbnN0IGludCBxID0gbS0+cXVhbnRfOworICAgIGludCBxX2k0LCBxX2kxNiwgcV91djsKKyAgICBtLT55MV8ucV9bMF0gPSBrRGNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3kxX2RjXywgMCwgMTI3KV07CisgICAgbS0+eTFfLnFfWzFdID0ga0FjVGFibGVbY2xpcChxLCAgICAgICAgICAgICAgICAgIDAsIDEyNyldOworCisgICAgbS0+eTJfLnFfWzBdID0ga0RjVGFibGVbIGNsaXAocSArIGVuYy0+ZHFfeTJfZGNfLCAwLCAxMjcpXSAqIDI7CisgICAgbS0+eTJfLnFfWzFdID0ga0FjVGFibGUyW2NsaXAocSArIGVuYy0+ZHFfeTJfYWNfLCAwLCAxMjcpXTsKKworICAgIG0tPnV2Xy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfZGNfLCAwLCAxMTcpXTsKKyAgICBtLT51dl8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEgKyBlbmMtPmRxX3V2X2FjXywgMCwgMTI3KV07CisKKyAgICBxX2k0ICA9IEV4cGFuZE1hdHJpeCgmbS0+eTFfLCAwKTsKKyAgICBxX2kxNiA9IEV4cGFuZE1hdHJpeCgmbS0+eTJfLCAxKTsKKyAgICBxX3V2ICA9IEV4cGFuZE1hdHJpeCgmbS0+dXZfLCAyKTsKKworICAgIG0tPmxhbWJkYV9pNF8gICAgICAgICAgPSAoMyAqIHFfaTQgKiBxX2k0KSA+PiA3OworICAgIG0tPmxhbWJkYV9pMTZfICAgICAgICAgPSAoMyAqIHFfaTE2ICogcV9pMTYpOworICAgIG0tPmxhbWJkYV91dl8gICAgICAgICAgPSAoMyAqIHFfdXYgKiBxX3V2KSA+PiA2OworICAgIG0tPmxhbWJkYV9tb2RlXyAgICAgICAgPSAoMSAqIHFfaTQgKiBxX2k0KSA+PiA3OworICAgIG0tPmxhbWJkYV90cmVsbGlzX2k0XyAgPSAoNyAqIHFfaTQgKiBxX2k0KSA+PiAzOworICAgIG0tPmxhbWJkYV90cmVsbGlzX2kxNl8gPSAocV9pMTYgKiBxX2kxNikgPj4gMjsKKyAgICBtLT5sYW1iZGFfdHJlbGxpc191dl8gID0gKHFfdXYgKiBxX3V2KSA8PCAxOworICAgIG0tPnRsYW1iZGFfICAgICAgICAgICAgPSAodGxhbWJkYV9zY2FsZSAqIHFfaTQpID4+IDU7CisKKyAgICAvLyBub25lIG9mIHRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgPCAxCisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX2k0Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX2kxNl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV91dl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV9tb2RlXyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX3RyZWxsaXNfaTRfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc19pMTZfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc191dl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPnRsYW1iZGFfKTsKKworICAgIG0tPm1pbl9kaXN0b18gPSAxMCAqIG0tPnkxXy5xX1swXTsgICAvLyBxdWFudGl6YXRpb24tYXdhcmUgbWluIGRpc3RvCisgICAgbS0+bWF4X2VkZ2VfICA9IDA7CisKKyAgICBtLT5pNF9wZW5hbHR5XyA9IDEwMDAgKiBxX2k0ICogcV9pNDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdGlhbGl6ZSBmaWx0ZXJpbmcgcGFyYW1ldGVycworCisvLyBWZXJ5IHNtYWxsIGZpbHRlci1zdHJlbmd0aCB2YWx1ZXMgaGF2ZSBjbG9zZSB0byBubyB2aXN1YWwgZWZmZWN0LiBTbyB3ZSBjYW4KKy8vIHNhdmUgYSBsaXR0bGUgZGVjb2RpbmctQ1BVIGJ5IHR1cm5pbmcgZmlsdGVyaW5nIG9mZiBmb3IgdGhlc2UuCisjZGVmaW5lIEZTVFJFTkdUSF9DVVRPRkYgMgorCitzdGF0aWMgdm9pZCBTZXR1cEZpbHRlclN0cmVuZ3RoKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgaTsKKyAgLy8gbGV2ZWwwIGlzIGluIFswLi41MDBdLiBVc2luZyAnLWYgNTAnIGFzIGZpbHRlcl9zdHJlbmd0aCBpcyBtaWQtZmlsdGVyaW5nLgorICBjb25zdCBpbnQgbGV2ZWwwID0gNSAqIGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3N0cmVuZ3RoOworICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgbSA9ICZlbmMtPmRxbV9baV07CisgICAgLy8gV2UgZm9jdXMgb24gdGhlIHF1YW50aXphdGlvbiBvZiBBQyBjb2VmZnMuCisgICAgY29uc3QgaW50IHFzdGVwID0ga0FjVGFibGVbY2xpcChtLT5xdWFudF8sIDAsIDEyNyldID4+IDI7CisgICAgY29uc3QgaW50IGJhc2Vfc3RyZW5ndGggPQorICAgICAgICBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18sIHFzdGVwKTsKKyAgICAvLyBTZWdtZW50cyB3aXRoIGxvd2VyIGNvbXBsZXhpdHkgKCdiZXRhJykgd2lsbCBiZSBsZXNzIGZpbHRlcmVkLgorICAgIGNvbnN0IGludCBmID0gYmFzZV9zdHJlbmd0aCAqIGxldmVsMCAvICgyNTYgKyBtLT5iZXRhXyk7CisgICAgbS0+ZnN0cmVuZ3RoXyA9IChmIDwgRlNUUkVOR1RIX0NVVE9GRikgPyAwIDogKGYgPiA2MykgPyA2MyA6IGY7CisgIH0KKyAgLy8gV2UgcmVjb3JkIHRoZSBpbml0aWFsIHN0cmVuZ3RoIChtYWlubHkgZm9yIHRoZSBjYXNlIG9mIDEtc2VnbWVudCBvbmx5KS4KKyAgZW5jLT5maWx0ZXJfaGRyXy5sZXZlbF8gPSBlbmMtPmRxbV9bMF0uZnN0cmVuZ3RoXzsKKyAgZW5jLT5maWx0ZXJfaGRyXy5zaW1wbGVfID0gKGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3R5cGUgPT0gMCk7CisgIGVuYy0+ZmlsdGVyX2hkcl8uc2hhcnBuZXNzXyA9IGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3NoYXJwbmVzczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZTogaWYgeW91IGNoYW5nZSB0aGUgdmFsdWVzIGJlbG93LCByZW1lbWJlciB0aGF0IHRoZSBtYXggcmFuZ2UKKy8vIGFsbG93ZWQgYnkgdGhlIHN5bnRheCBmb3IgRFFfVVYgaXMgWy0xNiwxNl0uCisjZGVmaW5lIE1BWF9EUV9VViAoNikKKyNkZWZpbmUgTUlOX0RRX1VWICgtNCkKKworLy8gV2Ugd2FudCB0byBlbXVsYXRlIGpwZWctbGlrZSBiZWhhdmlvdXIgd2hlcmUgdGhlIGV4cGVjdGVkICJnb29kIiBxdWFsaXR5CisvLyBpcyBhcm91bmQgcT03NS4gSW50ZXJuYWxseSwgb3VyICJnb29kIiBtaWRkbGUgaXMgYXJvdW5kIGM9NTAuIFNvIHdlCisvLyBtYXAgYWNjb3JkaW5nbHkgdXNpbmcgbGluZWFyIHBpZWNlLXdpc2UgZnVuY3Rpb24KK3N0YXRpYyBkb3VibGUgUXVhbGl0eVRvQ29tcHJlc3Npb24oZG91YmxlIGMpIHsKKyAgY29uc3QgZG91YmxlIGxpbmVhcl9jID0gKGMgPCAwLjc1KSA/IGMgKiAoMi4gLyAzLikgOiAyLiAqIGMgLSAxLjsKKyAgLy8gVGhlIGZpbGUgc2l6ZSByb3VnaGx5IHNjYWxlcyBhcyBwb3cocXVhbnRpemVyLCAzLikuIEFjdHVhbGx5LCB0aGUKKyAgLy8gZXhwb25lbnQgaXMgc29tZXdoZXJlIGJldHdlZW4gMi44IGFuZCAzLjIsIGJ1dCB3ZSdyZSBtb3N0bHkgaW50ZXJlc3RlZAorICAvLyBpbiB0aGUgbWlkLXF1YW50IHJhbmdlLiBTbyB3ZSBzY2FsZSB0aGUgY29tcHJlc3NpYmlsaXR5IGludmVyc2VseSB0bworICAvLyB0aGlzIHBvd2VyLWxhdzogcXVhbnQgfj0gY29tcHJlc3Npb24gXiAxLzMuIFRoaXMgbGF3IGhvbGRzIHdlbGwgZm9yCisgIC8vIGxvdyBxdWFudC4gRmluZXIgbW9kZWxpbmcgZm9yIGhpZ2gtcXVhbnQgd291bGQgbWFrZSB1c2Ugb2Yga0FjVGFibGVbXQorICAvLyBtb3JlIGV4cGxpY2l0bHkuCisgIGNvbnN0IGRvdWJsZSB2ID0gcG93KGxpbmVhcl9jLCAxIC8gMy4pOworICByZXR1cm4gdjsKK30KKworc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oZG91YmxlIGMsIGRvdWJsZSBhbHBoYSkgeworICAvLyBXZSBtYXAgdGhlIGNvbXBsZXhpdHkgJ2FscGhhJyBhbmQgcXVhbGl0eSBzZXR0aW5nICdjJyB0byBhIGNvbXByZXNzaW9uCisgIC8vIGV4cG9uZW50IGVtcGlyaWNhbGx5IG1hdGNoZWQgdG8gdGhlIGNvbXByZXNzaW9uIGN1cnZlIG9mIGxpYmpwZWc2Yi4KKyAgLy8gT24gYXZlcmFnZSwgdGhlIFdlYlAgb3V0cHV0IHNpemUgd2lsbCBiZSByb3VnaGx5IHNpbWlsYXIgdG8gdGhhdCBvZiBhCisgIC8vIEpQRUcgZmlsZSBjb21wcmVzc2VkIHdpdGggc2FtZSBxdWFsaXR5IGZhY3Rvci4KKyAgY29uc3QgZG91YmxlIGFtaW4gPSAwLjMwOworICBjb25zdCBkb3VibGUgYW1heCA9IDAuODU7CisgIGNvbnN0IGRvdWJsZSBleHBfbWluID0gMC40OworICBjb25zdCBkb3VibGUgZXhwX21heCA9IDAuOTsKKyAgY29uc3QgZG91YmxlIHNsb3BlID0gKGV4cF9taW4gLSBleHBfbWF4KSAvIChhbWF4IC0gYW1pbik7CisgIC8vIExpbmVhcmx5IGludGVycG9sYXRlICdleHBuJyBmcm9tIGV4cF9taW4gdG8gZXhwX21heAorICAvLyBpbiB0aGUgW2FtaW4sIGFtYXhdIHJhbmdlLgorICBjb25zdCBkb3VibGUgZXhwbiA9IChhbHBoYSA+IGFtYXgpID8gZXhwX21pbgorICAgICAgICAgICAgICAgICAgICA6IChhbHBoYSA8IGFtaW4pID8gZXhwX21heAorICAgICAgICAgICAgICAgICAgICA6IGV4cF9tYXggKyBzbG9wZSAqIChhbHBoYSAtIGFtaW4pOworICBjb25zdCBkb3VibGUgdiA9IHBvdyhjLCBleHBuKTsKKyAgcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgU2VnbWVudHNBcmVFcXVpdmFsZW50KGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMikgeworICByZXR1cm4gKFMxLT5xdWFudF8gPT0gUzItPnF1YW50XykgJiYgKFMxLT5mc3RyZW5ndGhfID09IFMyLT5mc3RyZW5ndGhfKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxpZnlTZWdtZW50cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IG1hcFtOVU1fTUJfU0VHTUVOVFNdID0geyAwLCAxLCAyLCAzIH07CisgIC8vICdudW1fc2VnbWVudHNfJyBpcyBwcmV2aW91c2x5IHZhbGlkYXRlZCBhbmQgPD0gTlVNX01CX1NFR01FTlRTLCBidXQgYW4KKyAgLy8gZXhwbGljaXQgY2hlY2sgaXMgbmVlZGVkIHRvIGF2b2lkIGEgc3B1cmlvdXMgd2FybmluZyBhYm91dCAnaScgZXhjZWVkaW5nCisgIC8vIGFycmF5IGJvdW5kcyBvZiAnZHFtXycgd2l0aCBzb21lIGNvbXBpbGVycyAobm90aWNlZCB3aXRoIGdjYy00LjkpLgorICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPCBOVU1fTUJfU0VHTUVOVFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVU1fTUJfU0VHTUVOVFM7CisgIGludCBudW1fZmluYWxfc2VnbWVudHMgPSAxOworICBpbnQgczEsIHMyOworICBmb3IgKHMxID0gMTsgczEgPCBudW1fc2VnbWVudHM7ICsrczEpIHsgICAgLy8gZmluZCBzaW1pbGFyIHNlZ21lbnRzCisgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxID0gJmVuYy0+ZHFtX1tzMV07CisgICAgaW50IGZvdW5kID0gMDsKKyAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgc2ltaWxhciBzZWdtZW50CisgICAgZm9yIChzMiA9IDA7IHMyIDwgbnVtX2ZpbmFsX3NlZ21lbnRzOyArK3MyKSB7CisgICAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzIgPSAmZW5jLT5kcW1fW3MyXTsKKyAgICAgIGlmIChTZWdtZW50c0FyZUVxdWl2YWxlbnQoUzEsIFMyKSkgeworICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtYXBbczFdID0gczI7CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgaWYgKG51bV9maW5hbF9zZWdtZW50cyAhPSBzMSkgeworICAgICAgICBlbmMtPmRxbV9bbnVtX2ZpbmFsX3NlZ21lbnRzXSA9IGVuYy0+ZHFtX1tzMV07CisgICAgICB9CisgICAgICArK251bV9maW5hbF9zZWdtZW50czsKKyAgICB9CisgIH0KKyAgaWYgKG51bV9maW5hbF9zZWdtZW50cyA8IG51bV9zZWdtZW50cykgeyAgLy8gUmVtYXAKKyAgICBpbnQgaSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOworICAgIHdoaWxlIChpLS0gPiAwKSBlbmMtPm1iX2luZm9fW2ldLnNlZ21lbnRfID0gbWFwW2VuYy0+bWJfaW5mb19baV0uc2VnbWVudF9dOworICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPSBudW1fZmluYWxfc2VnbWVudHM7CisgICAgLy8gUmVwbGljYXRlIHRoZSB0cmFpbGluZyBzZWdtZW50IGluZm9zIChpdCdzIG1vc3RseSBjb3NtZXRpY3MpCisgICAgZm9yIChpID0gbnVtX2ZpbmFsX3NlZ21lbnRzOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICAgIGVuYy0+ZHFtX1tpXSA9IGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHMgLSAxXTsKKyAgICB9CisgIH0KK30KKwordm9pZCBWUDhTZXRTZWdtZW50UGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcXVhbGl0eSkgeworICBpbnQgaTsKKyAgaW50IGRxX3V2X2FjLCBkcV91dl9kYzsKKyAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187CisgIGNvbnN0IGRvdWJsZSBhbXAgPSBTTlNfVE9fRFEgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMC4gLyAxMjguOworICBjb25zdCBkb3VibGUgUSA9IHF1YWxpdHkgLyAxMDAuOworICBjb25zdCBkb3VibGUgY19iYXNlID0gZW5jLT5jb25maWdfLT5lbXVsYXRlX2pwZWdfc2l6ZSA/CisgICAgICBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oUSwgZW5jLT5hbHBoYV8gLyAyNTUuKSA6CisgICAgICBRdWFsaXR5VG9Db21wcmVzc2lvbihRKTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7CisgICAgLy8gV2UgbW9kdWxhdGUgdGhlIGJhc2UgY29lZmZpY2llbnQgdG8gYWNjb21tb2RhdGUgZm9yIHRoZSBxdWFudGl6YXRpb24KKyAgICAvLyBzdXNjZXB0aWJpbGl0eSBhbmQgYWxsb3cgZGVuc2VyIHNlZ21lbnRzIHRvIGJlIHF1YW50aXplZCBtb3JlLgorICAgIGNvbnN0IGRvdWJsZSBleHBuID0gMS4gLSBhbXAgKiBlbmMtPmRxbV9baV0uYWxwaGFfOworICAgIGNvbnN0IGRvdWJsZSBjID0gcG93KGNfYmFzZSwgZXhwbik7CisgICAgY29uc3QgaW50IHEgPSAoaW50KSgxMjcuICogKDEuIC0gYykpOworICAgIGFzc2VydChleHBuID4gMC4pOworICAgIGVuYy0+ZHFtX1tpXS5xdWFudF8gPSBjbGlwKHEsIDAsIDEyNyk7CisgIH0KKworICAvLyBwdXJlbHkgaW5kaWNhdGl2ZSBpbiB0aGUgYml0c3RyZWFtIChleGNlcHQgZm9yIHRoZSAxLXNlZ21lbnQgY2FzZSkKKyAgZW5jLT5iYXNlX3F1YW50XyA9IGVuYy0+ZHFtX1swXS5xdWFudF87CisKKyAgLy8gZmlsbC1pbiB2YWx1ZXMgZm9yIHRoZSB1bnVzZWQgc2VnbWVudHMgKHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpCisgIGZvciAoaSA9IG51bV9zZWdtZW50czsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7CisgICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGVuYy0+YmFzZV9xdWFudF87CisgIH0KKworICAvLyB1dl9hbHBoYV8gaXMgbm9ybWFsbHkgc3ByZWFkIGFyb3VuZCB+NjAuIFRoZSB1c2VmdWwgcmFuZ2UgaXMKKyAgLy8gdHlwaWNhbGx5IH4zMCAocXVpdGUgYmFkKSB0byB+MTAwIChvayB0byBkZWNpbWF0ZSBVViBtb3JlKS4KKyAgLy8gV2UgbWFwIGl0IHRvIHRoZSBzYWZlIG1heGltYWwgcmFuZ2Ugb2YgTUFYL01JTl9EUV9VViBmb3IgZHFfdXYuCisgIGRxX3V2X2FjID0gKGVuYy0+dXZfYWxwaGFfIC0gTUlEX0FMUEhBKSAqIChNQVhfRFFfVVYgLSBNSU5fRFFfVVYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNQVhfQUxQSEEgLSBNSU5fQUxQSEEpOworICAvLyB3ZSByZXNjYWxlIGJ5IHRoZSB1c2VyLWRlZmluZWQgc3RyZW5ndGggb2YgYWRhcHRhdGlvbgorICBkcV91dl9hYyA9IGRxX3V2X2FjICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7CisgIC8vIGFuZCBtYWtlIGl0IHNhZmUuCisgIGRxX3V2X2FjID0gY2xpcChkcV91dl9hYywgTUlOX0RRX1VWLCBNQVhfRFFfVVYpOworICAvLyBXZSBhbHNvIGJvb3N0IHRoZSBkYy11di1xdWFudCBhIGxpdHRsZSwgYmFzZWQgb24gc25zLXN0cmVuZ3RoLCBzaW5jZQorICAvLyBVL1YgY2hhbm5lbHMgYXJlIHF1aXRlIG1vcmUgcmVhY3RpdmUgdG8gaGlnaCBxdWFudHMgKGZsYXQgREMtYmxvY2tzCisgIC8vIHRlbmQgdG8gYXBwZWFyLCBhbmQgYXJlIHVucGxlYXNhbnQpLgorICBkcV91dl9kYyA9IC00ICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7CisgIGRxX3V2X2RjID0gY2xpcChkcV91dl9kYywgLTE1LCAxNSk7ICAgLy8gNGJpdC1zaWduZWQgbWF4IGFsbG93ZWQKKworICBlbmMtPmRxX3kxX2RjXyA9IDA7ICAgICAgIC8vIFRPRE8oc2thbCk6IGRxLWx1bQorICBlbmMtPmRxX3kyX2RjXyA9IDA7CisgIGVuYy0+ZHFfeTJfYWNfID0gMDsKKyAgZW5jLT5kcV91dl9kY18gPSBkcV91dl9kYzsKKyAgZW5jLT5kcV91dl9hY18gPSBkcV91dl9hYzsKKworICBTZXR1cEZpbHRlclN0cmVuZ3RoKGVuYyk7ICAgLy8gaW5pdGlhbGl6ZSBzZWdtZW50cycgZmlsdGVyaW5nLCBldmVudHVhbGx5CisKKyAgaWYgKG51bV9zZWdtZW50cyA+IDEpIFNpbXBsaWZ5U2VnbWVudHMoZW5jKTsKKworICBTZXR1cE1hdHJpY2VzKGVuYyk7ICAgICAgICAgLy8gZmluYWxpemUgcXVhbnRpemF0aW9uIG1hdHJpY2VzCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3JtIHRoZSBwcmVkaWN0aW9ucyBpbiBjYWNoZQorCisvLyBNdXN0IGJlIG9yZGVyZWQgdXNpbmcge0RDX1BSRUQsIFRNX1BSRUQsIFZfUFJFRCwgSF9QUkVEfSBhcyBpbmRleAorY29uc3QgaW50IFZQOEkxNk1vZGVPZmZzZXRzWzRdID0geyBJMTZEQzE2LCBJMTZUTTE2LCBJMTZWRTE2LCBJMTZIRTE2IH07Citjb25zdCBpbnQgVlA4VVZNb2RlT2Zmc2V0c1s0XSA9IHsgQzhEQzgsIEM4VE04LCBDOFZFOCwgQzhIRTggfTsKKworLy8gTXVzdCBiZSBpbmRleGVkIHVzaW5nIHtCX0RDX1BSRUQgLT4gQl9IVV9QUkVEfSBhcyBpbmRleAorY29uc3QgaW50IFZQOEk0TW9kZU9mZnNldHNbTlVNX0JNT0RFU10gPSB7CisgIEk0REM0LCBJNFRNNCwgSTRWRTQsIEk0SEU0LCBJNFJENCwgSTRWUjQsIEk0TEQ0LCBJNFZMNCwgSTRIRDQsIEk0SFU0Cit9OworCit2b2lkIFZQOE1ha2VMdW1hMTZQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgY29uc3QgdWludDhfdCogY29uc3QgbGVmdCA9IGl0LT54XyA/IGl0LT55X2xlZnRfIDogTlVMTDsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdG9wID0gaXQtPnlfID8gaXQtPnlfdG9wXyA6IE5VTEw7CisgIFZQOEVuY1ByZWRMdW1hMTYoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKK30KKwordm9pZCBWUDhNYWtlQ2hyb21hOFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gaXQtPnVfbGVmdF8gOiBOVUxMOworICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+eV8gPyBpdC0+dXZfdG9wXyA6IE5VTEw7CisgIFZQOEVuY1ByZWRDaHJvbWE4KGl0LT55dXZfcF8sIGxlZnQsIHRvcCk7Cit9CisKK3ZvaWQgVlA4TWFrZUludHJhNFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNQcmVkTHVtYTQoaXQtPnl1dl9wXywgaXQtPmk0X3RvcF8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUXVhbnRpemUKKworLy8gTGF5b3V0OgorLy8gKy0tLS0rLS0tLSsKKy8vIHxZWVlZfFVVVlZ8IDAKKy8vIHxZWVlZfFVVVlZ8IDQKKy8vIHxZWVlZfC4uLi58IDgKKy8vIHxZWVlZfC4uLi58IDEyCisvLyArLS0tLSstLS0tKworCitjb25zdCBpbnQgVlA4U2NhblsxNl0gPSB7ICAvLyBMdW1hCisgIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAorICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKKyAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCisgIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTLAorfTsKKworc3RhdGljIGNvbnN0IGludCBWUDhTY2FuVVZbNCArIDRdID0geworICAwICsgMCAqIEJQUywgICA0ICsgMCAqIEJQUywgMCArIDQgKiBCUFMsICA0ICsgNCAqIEJQUywgICAgLy8gVQorICA4ICsgMCAqIEJQUywgIDEyICsgMCAqIEJQUywgOCArIDQgKiBCUFMsIDEyICsgNCAqIEJQUyAgICAgLy8gVgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3RvcnRpb24gbWVhc3VyZW1lbnQKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRZWzE2XSA9IHsKKyAgMzgsIDMyLCAyMCwgOSwgMzIsIDI4LCAxNywgNywgMjAsIDE3LCAxMCwgNCwgOSwgNywgNCwgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRUcmVsbGlzWzE2XSA9IHsKKyNpZiBVU0VfVERJU1RPID09IDAKKyAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyNlbHNlCisgIDMwLCAyNywgMTksIDExLAorICAyNywgMjQsIDE3LCAxMCwKKyAgMTksIDE3LCAxMiwgIDgsCisgIDExLCAxMCwgIDgsICA2CisjZW5kaWYKK307CisKKy8vIEluaXQvQ29weSB0aGUgY29tbW9uIGZpZWxkcyBpbiBzY29yZS4KK3N0YXRpYyB2b2lkIEluaXRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIHJkLT5EICA9IDA7CisgIHJkLT5TRCA9IDA7CisgIHJkLT5SICA9IDA7CisgIHJkLT5IICA9IDA7CisgIHJkLT5ueiA9IDA7CisgIHJkLT5zY29yZSA9IE1BWF9DT1NUOworfQorCitzdGF0aWMgdm9pZCBDb3B5U2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCBkc3QsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3Qgc3JjKSB7CisgIGRzdC0+RCAgPSBzcmMtPkQ7CisgIGRzdC0+U0QgPSBzcmMtPlNEOworICBkc3QtPlIgID0gc3JjLT5SOworICBkc3QtPkggID0gc3JjLT5IOworICBkc3QtPm56ID0gc3JjLT5uejsgICAgICAvLyBub3RlIHRoYXQgbnogaXMgbm90IGFjY3VtdWxhdGVkLCBidXQganVzdCBjb3BpZWQuCisgIGRzdC0+c2NvcmUgPSBzcmMtPnNjb3JlOworfQorCitzdGF0aWMgdm9pZCBBZGRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKKyAgZHN0LT5EICArPSBzcmMtPkQ7CisgIGRzdC0+U0QgKz0gc3JjLT5TRDsKKyAgZHN0LT5SICArPSBzcmMtPlI7CisgIGRzdC0+SCAgKz0gc3JjLT5IOworICBkc3QtPm56IHw9IHNyYy0+bno7ICAgICAvLyBoZXJlLCBuZXcgbnogYml0cyBhcmUgYWNjdW11bGF0ZWQuCisgIGRzdC0+c2NvcmUgKz0gc3JjLT5zY29yZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBlcmZvcm1zIHRyZWxsaXMtb3B0aW1pemVkIHF1YW50aXphdGlvbi4KKworLy8gVHJlbGxpcyBub2RlCit0eXBlZGVmIHN0cnVjdCB7CisgIGludDhfdCBwcmV2OyAgICAgICAgICAgIC8vIGJlc3QgcHJldmlvdXMgbm9kZQorICBpbnQ4X3Qgc2lnbjsgICAgICAgICAgICAvLyBzaWduIG9mIGNvZWZmX2kKKyAgaW50MTZfdCBsZXZlbDsgICAgICAgICAgLy8gbGV2ZWwKK30gTm9kZTsKKworLy8gU2NvcmUgc3RhdGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2NvcmVfdCBzY29yZTsgICAgICAgICAgLy8gcGFydGlhbCBSRCBzY29yZQorICBjb25zdCB1aW50MTZfdCogY29zdHM7ICAvLyBzaG9ydGN1dCB0byBjb3N0IHRhYmxlcworfSBTY29yZVN0YXRlOworCisvLyBJZiBhIGNvZWZmaWNpZW50IHdhcyBxdWFudGl6ZWQgdG8gYSB2YWx1ZSBRICh1c2luZyBhIG5ldXRyYWwgYmlhcyksCisvLyB3ZSB0ZXN0IGFsbCBhbHRlcm5hdGUgcG9zc2liaWxpdGllcyBiZXR3ZWVuIFtRLU1JTl9ERUxUQSwgUStNQVhfREVMVEFdCisvLyBXZSBkb24ndCB0ZXN0IG5lZ2F0aXZlIHZhbHVlcyB0aG91Z2guCisjZGVmaW5lIE1JTl9ERUxUQSAwICAgLy8gaG93IG11Y2ggbG93ZXIgbGV2ZWwgdG8gdHJ5CisjZGVmaW5lIE1BWF9ERUxUQSAxICAgLy8gaG93IG11Y2ggaGlnaGVyCisjZGVmaW5lIE5VTV9OT0RFUyAoTUlOX0RFTFRBICsgMSArIE1BWF9ERUxUQSkKKyNkZWZpbmUgTk9ERShuLCBsKSAobm9kZXNbKG4pXVsobCkgKyBNSU5fREVMVEFdKQorI2RlZmluZSBTQ09SRV9TVEFURShuLCBsKSAoc2NvcmVfc3RhdGVzW25dWyhsKSArIE1JTl9ERUxUQV0pCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNldFJEU2NvcmUoaW50IGxhbWJkYSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICByZC0+c2NvcmUgPSAocmQtPlIgKyByZC0+SCkgKiBsYW1iZGEgKyBSRF9ESVNUT19NVUxUICogKHJkLT5EICsgcmQtPlNEKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHNjb3JlX3QgUkRTY29yZVRyZWxsaXMoaW50IGxhbWJkYSwgc2NvcmVfdCByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfdCBkaXN0b3J0aW9uKSB7CisgIHJldHVybiByYXRlICogbGFtYmRhICsgUkRfRElTVE9fTVVMVCAqIGRpc3RvcnRpb247Cit9CisKK3N0YXRpYyBpbnQgVHJlbGxpc1F1YW50aXplQmxvY2soY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4MCwgaW50IGNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFtYmRhKSB7CisgIGNvbnN0IFByb2JhQXJyYXkqIGNvbnN0IHByb2JhcyA9IGVuYy0+cHJvYmFfLmNvZWZmc19bY29lZmZfdHlwZV07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9CisgICAgICAoQ29zdEFycmF5UHRyKWVuYy0+cHJvYmFfLnJlbWFwcGVkX2Nvc3RzX1tjb2VmZl90eXBlXTsKKyAgY29uc3QgaW50IGZpcnN0ID0gKGNvZWZmX3R5cGUgPT0gMCkgPyAxIDogMDsKKyAgTm9kZSBub2Rlc1sxNl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSBzY29yZV9zdGF0ZXNbMl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSogc3NfY3VyID0gJlNDT1JFX1NUQVRFKDAsIE1JTl9ERUxUQSk7CisgIFNjb3JlU3RhdGUqIHNzX3ByZXYgPSAmU0NPUkVfU1RBVEUoMSwgTUlOX0RFTFRBKTsKKyAgaW50IGJlc3RfcGF0aFszXSA9IHstMSwgLTEsIC0xfTsgICAvLyBzdG9yZSBiZXN0LWxhc3QvYmVzdC1sZXZlbC9iZXN0LXByZXZpb3VzCisgIHNjb3JlX3QgYmVzdF9zY29yZTsKKyAgaW50IG4sIG0sIHAsIGxhc3Q7CisKKyAgeworICAgIHNjb3JlX3QgY29zdDsKKyAgICBjb25zdCBpbnQgdGhyZXNoID0gbXR4LT5xX1sxXSAqIG10eC0+cV9bMV0gLyA0OworICAgIGNvbnN0IGludCBsYXN0X3Byb2JhID0gcHJvYmFzW1ZQOEVuY0JhbmRzW2ZpcnN0XV1bY3R4MF1bMF07CisKKyAgICAvLyBjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBpbnRlcmVzdGluZyBjb2VmZmljaWVudAorICAgIGxhc3QgPSBmaXJzdCAtIDE7CisgICAgZm9yIChuID0gMTU7IG4gPj0gZmlyc3Q7IC0tbikgeworICAgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgICAgY29uc3QgaW50IGVyciA9IGluW2pdICogaW5bal07CisgICAgICBpZiAoZXJyID4gdGhyZXNoKSB7CisgICAgICAgIGxhc3QgPSBuOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBnbyBpbnNwZWN0IHVwIHRvIG4gPSAxNiBjb2VmZnMuIFdlIGNhbiBqdXN0IGdvIHVwCisgICAgLy8gdG8gbGFzdCArIDEgKGluY2x1c2l2ZSkgd2l0aG91dCBsb3NpbmcgbXVjaC4KKyAgICBpZiAobGFzdCA8IDE1KSArK2xhc3Q7CisKKyAgICAvLyBjb21wdXRlICdza2lwJyBzY29yZS4gVGhpcyBpcyB0aGUgbWF4IHNjb3JlIG9uZSBjYW4gZG8uCisgICAgY29zdCA9IFZQOEJpdENvc3QoMCwgbGFzdF9wcm9iYSk7CisgICAgYmVzdF9zY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgMCk7CisKKyAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBub2RlLgorICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKKyAgICAgIGNvbnN0IHNjb3JlX3QgcmF0ZSA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBsYXN0X3Byb2JhKSA6IDA7CisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIHJhdGUsIDApOworICAgICAgc3NfY3VyW21dLmNvc3RzID0gY29zdHNbZmlyc3RdW2N0eDBdOworICAgIH0KKyAgfQorCisgIC8vIHRyYXZlcnNlIHRyZWxsaXMuCisgIGZvciAobiA9IGZpcnN0OyBuIDw9IGxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKKyAgICBjb25zdCB1aW50MzJfdCBRICA9IG10eC0+cV9bal07CisgICAgY29uc3QgdWludDMyX3QgaVEgPSBtdHgtPmlxX1tqXTsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gQklBUygweDAwKTsgICAgIC8vIG5ldXRyYWwgYmlhcworICAgIC8vIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIHRha2Ugc2lnbiBvZiB0aGUgX29yaWdpbmFsXyBjb2VmZiwKKyAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbnNpZGVyIGxldmVsIDwgMCBhZnRlcndhcmQuCisgICAgY29uc3QgaW50IHNpZ24gPSAoaW5bal0gPCAwKTsKKyAgICBjb25zdCB1aW50MzJfdCBjb2VmZjAgPSAoc2lnbiA/IC1pbltqXSA6IGluW2pdKSArIG10eC0+c2hhcnBlbl9bal07CisgICAgaW50IGxldmVsMCA9IFFVQU5URElWKGNvZWZmMCwgaVEsIEIpOworICAgIGlmIChsZXZlbDAgPiBNQVhfTEVWRUwpIGxldmVsMCA9IE1BWF9MRVZFTDsKKworICAgIHsgICAvLyBTd2FwIGN1cnJlbnQgYW5kIHByZXZpb3VzIHNjb3JlIHN0YXRlcworICAgICAgU2NvcmVTdGF0ZSogY29uc3QgdG1wID0gc3NfY3VyOworICAgICAgc3NfY3VyID0gc3NfcHJldjsKKyAgICAgIHNzX3ByZXYgPSB0bXA7CisgICAgfQorCisgICAgLy8gdGVzdCBhbGwgYWx0ZXJuYXRlIGxldmVsIHZhbHVlcyBhcm91bmQgbGV2ZWwwLgorICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKKyAgICAgIE5vZGUqIGNvbnN0IGN1ciA9ICZOT0RFKG4sIG0pOworICAgICAgaW50IGxldmVsID0gbGV2ZWwwICsgbTsKKyAgICAgIGNvbnN0IGludCBjdHggPSAobGV2ZWwgPiAyKSA/IDIgOiBsZXZlbDsKKyAgICAgIGNvbnN0IGludCBiYW5kID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgc2NvcmVfdCBiYXNlX3Njb3JlLCBsYXN0X3Bvc19zY29yZTsKKyAgICAgIHNjb3JlX3QgYmVzdF9jdXJfc2NvcmUgPSBNQVhfQ09TVDsKKyAgICAgIGludCBiZXN0X3ByZXYgPSAwOyAgIC8vIGRlZmF1bHQsIGluIGNhc2UKKworICAgICAgc3NfY3VyW21dLnNjb3JlID0gTUFYX0NPU1Q7CisgICAgICBzc19jdXJbbV0uY29zdHMgPSBjb3N0c1tuICsgMV1bY3R4XTsKKyAgICAgIGlmIChsZXZlbCA+IE1BWF9MRVZFTCB8fCBsZXZlbCA8IDApIHsgICAvLyBub2RlIGlzIGRlYWQ/CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBDb21wdXRlIGV4dHJhIHJhdGUgY29zdCBpZiBsYXN0IGNvZWZmJ3MgcG9zaXRpb24gaXMgPCAxNQorICAgICAgeworICAgICAgICBjb25zdCBzY29yZV90IGxhc3RfcG9zX2Nvc3QgPQorICAgICAgICAgICAgKG4gPCAxNSkgPyBWUDhCaXRDb3N0KDAsIHByb2Jhc1tiYW5kXVtjdHhdWzBdKSA6IDA7CisgICAgICAgIGxhc3RfcG9zX3Njb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBsYXN0X3Bvc19jb3N0LCAwKTsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICAvLyBDb21wdXRlIGRlbHRhX2Vycm9yID0gaG93IG11Y2ggY29kaW5nIHRoaXMgbGV2ZWwgd2lsbAorICAgICAgICAvLyBzdWJ0cmFjdCB0byBtYXhfZXJyb3IgYXMgZGlzdG9ydGlvbi4KKyAgICAgICAgLy8gSGVyZSwgZGlzdG9ydGlvbiA9IHN1bSBvZiAofGNvZWZmX2l8IC0gbGV2ZWxfaSAqIFFfaSleMgorICAgICAgICBjb25zdCBpbnQgbmV3X2Vycm9yID0gY29lZmYwIC0gbGV2ZWwgKiBROworICAgICAgICBjb25zdCBpbnQgZGVsdGFfZXJyb3IgPQorICAgICAgICAgICAga1dlaWdodFRyZWxsaXNbal0gKiAobmV3X2Vycm9yICogbmV3X2Vycm9yIC0gY29lZmYwICogY29lZmYwKTsKKyAgICAgICAgYmFzZV9zY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgMCwgZGVsdGFfZXJyb3IpOworICAgICAgfQorCisgICAgICAvLyBJbnNwZWN0IGFsbCBwb3NzaWJsZSBub24tZGVhZCBwcmVkZWNlc3NvcnMuIFJldGFpbiBvbmx5IHRoZSBiZXN0IG9uZS4KKyAgICAgIGZvciAocCA9IC1NSU5fREVMVEE7IHAgPD0gTUFYX0RFTFRBOyArK3ApIHsKKyAgICAgICAgLy8gRGVhZCBub2RlcyAod2l0aCBzc19wcmV2W3BdLnNjb3JlID49IE1BWF9DT1NUKSBhcmUgYXV0b21hdGljYWxseQorICAgICAgICAvLyBlbGltaW5hdGVkIHNpbmNlIHRoZWlyIHNjb3JlIGNhbid0IGJlIGJldHRlciB0aGFuIHRoZSBjdXJyZW50IGJlc3QuCisgICAgICAgIGNvbnN0IHNjb3JlX3QgY29zdCA9IFZQOExldmVsQ29zdChzc19wcmV2W3BdLmNvc3RzLCBsZXZlbCk7CisgICAgICAgIC8vIEV4YW1pbmUgbm9kZSBhc3N1bWluZyBpdCdzIGEgbm9uLXRlcm1pbmFsIG9uZS4KKyAgICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9CisgICAgICAgICAgICBiYXNlX3Njb3JlICsgc3NfcHJldltwXS5zY29yZSArIFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgMCk7CisgICAgICAgIGlmIChzY29yZSA8IGJlc3RfY3VyX3Njb3JlKSB7CisgICAgICAgICAgYmVzdF9jdXJfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICBiZXN0X3ByZXYgPSBwOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBTdG9yZSBiZXN0IGZpbmRpbmcgaW4gY3VycmVudCBub2RlLgorICAgICAgY3VyLT5zaWduID0gc2lnbjsKKyAgICAgIGN1ci0+bGV2ZWwgPSBsZXZlbDsKKyAgICAgIGN1ci0+cHJldiA9IGJlc3RfcHJldjsKKyAgICAgIHNzX2N1clttXS5zY29yZSA9IGJlc3RfY3VyX3Njb3JlOworCisgICAgICAvLyBOb3csIHJlY29yZCBiZXN0IHRlcm1pbmFsIG5vZGUgKGFuZCB0aHVzIGJlc3QgZW50cnkgaW4gdGhlIGdyYXBoKS4KKyAgICAgIGlmIChsZXZlbCAhPSAwKSB7CisgICAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBiZXN0X2N1cl9zY29yZSArIGxhc3RfcG9zX3Njb3JlOworICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgIGJlc3RfcGF0aFswXSA9IG47ICAgICAgICAgICAgICAgICAgICAgLy8gYmVzdCBlb2IgcG9zaXRpb24KKyAgICAgICAgICBiZXN0X3BhdGhbMV0gPSBtOyAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3Qgbm9kZSBpbmRleAorICAgICAgICAgIGJlc3RfcGF0aFsyXSA9IGJlc3RfcHJldjsgICAgICAgICAgICAgLy8gYmVzdCBwcmVkZWNlc3NvcgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRnJlc2ggc3RhcnQKKyAgbWVtc2V0KGluICsgZmlyc3QsIDAsICgxNiAtIGZpcnN0KSAqIHNpemVvZigqaW4pKTsKKyAgbWVtc2V0KG91dCArIGZpcnN0LCAwLCAoMTYgLSBmaXJzdCkgKiBzaXplb2YoKm91dCkpOworICBpZiAoYmVzdF9wYXRoWzBdID09IC0xKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gc2tpcCEKKyAgfQorCisgIHsKKyAgICAvLyBVbndpbmQgdGhlIGJlc3QgcGF0aC4KKyAgICAvLyBOb3RlOiBiZXN0LXByZXYgb24gdGVybWluYWwgbm9kZSBpcyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlCisgICAgLy8gYmVzdF9wcmV2IGZvciBub24tdGVybWluYWwuIFNvIHdlIHBhdGNoIGJlc3RfcGF0aFsyXSBpbi4KKyAgICBpbnQgbnogPSAwOworICAgIGludCBiZXN0X25vZGUgPSBiZXN0X3BhdGhbMV07CisgICAgbiA9IGJlc3RfcGF0aFswXTsKKyAgICBOT0RFKG4sIGJlc3Rfbm9kZSkucHJldiA9IGJlc3RfcGF0aFsyXTsgICAvLyBmb3JjZSBiZXN0LXByZXYgZm9yIHRlcm1pbmFsCisKKyAgICBmb3IgKDsgbiA+PSBmaXJzdDsgLS1uKSB7CisgICAgICBjb25zdCBOb2RlKiBjb25zdCBub2RlID0gJk5PREUobiwgYmVzdF9ub2RlKTsKKyAgICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKKyAgICAgIG91dFtuXSA9IG5vZGUtPnNpZ24gPyAtbm9kZS0+bGV2ZWwgOiBub2RlLT5sZXZlbDsKKyAgICAgIG56IHw9IG5vZGUtPmxldmVsOworICAgICAgaW5bal0gPSBvdXRbbl0gKiBtdHgtPnFfW2pdOworICAgICAgYmVzdF9ub2RlID0gbm9kZS0+cHJldjsKKyAgICB9CisgICAgcmV0dXJuIChueiAhPSAwKTsKKyAgfQorfQorCisjdW5kZWYgTk9ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGVyZm9ybXM6IGRpZmZlcmVuY2UsIHRyYW5zZm9ybSwgcXVhbnRpemUsIGJhY2stdHJhbnNmb3JtLCBhZGQKKy8vIGFsbCBhdCBvbmNlLiBPdXRwdXQgaXMgdGhlIHJlY29uc3RydWN0ZWQgYmxvY2sgaW4gKnl1dl9vdXQsIGFuZCB0aGUKKy8vIHF1YW50aXplZCBsZXZlbHMgaW4gKmxldmVscy4KKworc3RhdGljIGludCBSZWNvbnN0cnVjdEludHJhMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOworICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICBpbnQgbnogPSAwOworICBpbnQgbjsKKyAgaW50MTZfdCB0bXBbMTZdWzE2XSwgZGNfdG1wWzE2XTsKKworICBmb3IgKG4gPSAwOyBuIDwgMTY7IG4gKz0gMikgeworICAgIFZQOEZUcmFuc2Zvcm0yKHNyYyArIFZQOFNjYW5bbl0sIHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSk7CisgIH0KKyAgVlA4RlRyYW5zZm9ybVdIVCh0bXBbMF0sIGRjX3RtcCk7CisgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2tXSFQoZGNfdG1wLCByZC0+eV9kY19sZXZlbHMsICZkcW0tPnkyXykgPDwgMjQ7CisKKyAgaWYgKERPX1RSRUxMSVNfSTE2ICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGludCB4LCB5OworICAgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKKyAgICBmb3IgKHkgPSAwLCBuID0gMDsgeSA8IDQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCwgKytuKSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKKyAgICAgICAgY29uc3QgaW50IG5vbl96ZXJvID0KKyAgICAgICAgICAgIFRyZWxsaXNRdWFudGl6ZUJsb2NrKGVuYywgdG1wW25dLCByZC0+eV9hY19sZXZlbHNbbl0sIGN0eCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnkxXywgZHFtLT5sYW1iZGFfdHJlbGxpc19pMTZfKTsKKyAgICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBub25femVybzsKKyAgICAgICAgcmQtPnlfYWNfbGV2ZWxzW25dWzBdID0gMDsKKyAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKKyAgICAgIC8vIFplcm8tb3V0IHRoZSBmaXJzdCBjb2VmZiwgc28gdGhhdDogYSkgbnogaXMgY29ycmVjdCBiZWxvdywgYW5kCisgICAgICAvLyBiKSBmaW5kaW5nICdsYXN0JyBub24temVybyBjb2VmZnMgaW4gU2V0UmVzaWR1YWxDb2VmZnMoKSBpcyBzaW1wbGlmaWVkLgorICAgICAgdG1wW25dWzBdID0gdG1wW24gKyAxXVswXSA9IDA7CisgICAgICBueiB8PSBWUDhFbmNRdWFudGl6ZTJCbG9ja3ModG1wW25dLCByZC0+eV9hY19sZXZlbHNbbl0sICZkcW0tPnkxXykgPDwgbjsKKyAgICAgIGFzc2VydChyZC0+eV9hY19sZXZlbHNbbiArIDBdWzBdID09IDApOworICAgICAgYXNzZXJ0KHJkLT55X2FjX2xldmVsc1tuICsgMV1bMF0gPT0gMCk7CisgICAgfQorICB9CisKKyAgLy8gVHJhbnNmb3JtIGJhY2sKKyAgVlA4VHJhbnNmb3JtV0hUKGRjX3RtcCwgdG1wWzBdKTsKKyAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKKyAgICBWUDhJVHJhbnNmb3JtKHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSwgeXV2X291dCArIFZQOFNjYW5bbl0sIDEpOworICB9CisKKyAgcmV0dXJuIG56OworfQorCitzdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBsZXZlbHNbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICBpbnQgbnogPSAwOworICBpbnQxNl90IHRtcFsxNl07CisKKyAgVlA4RlRyYW5zZm9ybShzcmMsIHJlZiwgdG1wKTsKKyAgaWYgKERPX1RSRUxMSVNfSTQgJiYgaXQtPmRvX3RyZWxsaXNfKSB7CisgICAgY29uc3QgaW50IHggPSBpdC0+aTRfICYgMywgeSA9IGl0LT5pNF8gPj4gMjsKKyAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgbnogPSBUcmVsbGlzUXVhbnRpemVCbG9jayhlbmMsIHRtcCwgbGV2ZWxzLCBjdHgsIDMsICZkcW0tPnkxXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRxbS0+bGFtYmRhX3RyZWxsaXNfaTRfKTsKKyAgfSBlbHNlIHsKKyAgICBueiA9IFZQOEVuY1F1YW50aXplQmxvY2sodG1wLCBsZXZlbHMsICZkcW0tPnkxXyk7CisgIH0KKyAgVlA4SVRyYW5zZm9ybShyZWYsIHRtcCwgeXV2X291dCwgMCk7CisgIHJldHVybiBuejsKK30KKworc3RhdGljIGludCBSZWNvbnN0cnVjdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LCBpbnQgbW9kZSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV07CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgVV9PRkZfRU5DOworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGludCBueiA9IDA7CisgIGludCBuOworICBpbnQxNl90IHRtcFs4XVsxNl07CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgIFZQOEZUcmFuc2Zvcm0yKHNyYyArIFZQOFNjYW5VVltuXSwgcmVmICsgVlA4U2NhblVWW25dLCB0bXBbbl0pOworICB9CisgIGlmIChET19UUkVMTElTX1VWICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGludCBjaCwgeCwgeTsKKyAgICBmb3IgKGNoID0gMCwgbiA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCwgKytuKSB7CisgICAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICAgIGNvbnN0IGludCBub25femVybyA9CisgICAgICAgICAgICAgIFRyZWxsaXNRdWFudGl6ZUJsb2NrKGVuYywgdG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCBjdHgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnV2XywgZHFtLT5sYW1iZGFfdHJlbGxpc191dl8pOworICAgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0gbm9uX3plcm87CisgICAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7CisgICAgICBueiB8PSBWUDhFbmNRdWFudGl6ZTJCbG9ja3ModG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCAmZHFtLT51dl8pIDw8IG47CisgICAgfQorICB9CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgIFZQOElUcmFuc2Zvcm0ocmVmICsgVlA4U2NhblVWW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuVVZbbl0sIDEpOworICB9CisgIHJldHVybiAobnogPDwgMTYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkQtb3B0IGRlY2lzaW9uLiBSZWNvbnN0cnVjdCBlYWNoIG1vZGVzLCBldmFsdWUgZGlzdG9ydGlvbiBhbmQgYml0LWNvc3QuCisvLyBQaWNrIHRoZSBtb2RlIGlzIGxvd2VyIFJELWNvc3QgPSBSYXRlICsgbGFtYmRhICogRGlzdG9ydGlvbi4KKworc3RhdGljIHZvaWQgU3RvcmVNYXhEZWx0YShWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtLCBjb25zdCBpbnQxNl90IERDc1sxNl0pIHsKKyAgLy8gV2UgbG9vayBhdCB0aGUgZmlyc3QgdGhyZWUgQUMgY29lZmZpY2llbnRzIHRvIGRldGVybWluZSB3aGF0IGlzIHRoZSBhdmVyYWdlCisgIC8vIGRlbHRhIGJldHdlZW4gZWFjaCBzdWItNHg0IGJsb2NrLgorICBjb25zdCBpbnQgdjAgPSBhYnMoRENzWzFdKTsKKyAgY29uc3QgaW50IHYxID0gYWJzKERDc1s0XSk7CisgIGNvbnN0IGludCB2MiA9IGFicyhEQ3NbNV0pOworICBpbnQgbWF4X3YgPSAodjAgPiB2MSkgPyB2MSA6IHYwOworICBtYXhfdiA9ICh2MiA+IG1heF92KSA/IHYyIDogbWF4X3Y7CisgIGlmIChtYXhfdiA+IGRxbS0+bWF4X2VkZ2VfKSBkcW0tPm1heF9lZGdlXyA9IG1heF92OworfQorCitzdGF0aWMgdm9pZCBTd2FwTW9kZVNjb3JlKFZQOE1vZGVTY29yZSoqIGEsIFZQOE1vZGVTY29yZSoqIGIpIHsKKyAgVlA4TW9kZVNjb3JlKiBjb25zdCB0bXAgPSAqYTsKKyAgKmEgPSAqYjsKKyAgKmIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIFN3YXBQdHIodWludDhfdCoqIGEsIHVpbnQ4X3QqKiBiKSB7CisgIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICphOworICAqYSA9ICpiOworICAqYiA9IHRtcDsKK30KKworc3RhdGljIHZvaWQgU3dhcE91dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgU3dhcFB0cigmaXQtPnl1dl9vdXRfLCAmaXQtPnl1dl9vdXQyXyk7Cit9CisKK3N0YXRpYyBzY29yZV90IElzRmxhdChjb25zdCBpbnQxNl90KiBsZXZlbHMsIGludCBudW1fYmxvY2tzLCBzY29yZV90IHRocmVzaCkgeworICBzY29yZV90IHNjb3JlID0gMDsKKyAgd2hpbGUgKG51bV9ibG9ja3MtLSA+IDApIHsgICAgICAvLyBUT0RPKHNrYWwpOiByZWZpbmUgcG9zaXRpb25hbCBzY29yaW5nPworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgKytpKSB7ICAgIC8vIG9taXQgREMsIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQworICAgICAgc2NvcmUgKz0gKGxldmVsc1tpXSAhPSAwKTsKKyAgICAgIGlmIChzY29yZSA+IHRocmVzaCkgcmV0dXJuIDA7CisgICAgfQorICAgIGxldmVscyArPSAxNjsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgUGlja0Jlc3RJbnRyYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiByZCkgeworICBjb25zdCBpbnQga051bUJsb2NrcyA9IDE2OworICBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2kxNl87CisgIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIFZQOE1vZGVTY29yZSByZF90bXA7CisgIFZQOE1vZGVTY29yZSogcmRfY3VyID0gJnJkX3RtcDsKKyAgVlA4TW9kZVNjb3JlKiByZF9iZXN0ID0gcmQ7CisgIGludCBtb2RlOworCisgIHJkLT5tb2RlX2kxNiA9IC0xOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOyAgLy8gc2NyYXRjaCBidWZmZXIKKyAgICByZF9jdXItPm1vZGVfaTE2ID0gbW9kZTsKKworICAgIC8vIFJlY29uc3RydWN0CisgICAgcmRfY3VyLT5ueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmRfY3VyLCB0bXBfZHN0LCBtb2RlKTsKKworICAgIC8vIE1lYXN1cmUgUkQtc2NvcmUKKyAgICByZF9jdXItPkQgPSBWUDhTU0UxNngxNihzcmMsIHRtcF9kc3QpOworICAgIHJkX2N1ci0+U0QgPQorICAgICAgICB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG8xNngxNihzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkgOiAwOworICAgIHJkX2N1ci0+SCA9IFZQOEZpeGVkQ29zdHNJMTZbbW9kZV07CisgICAgcmRfY3VyLT5SID0gVlA4R2V0Q29zdEx1bWExNihpdCwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA+IDAgJiYKKyAgICAgICAgSXNGbGF0KHJkX2N1ci0+eV9hY19sZXZlbHNbMF0sIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX0kxNikpIHsKKyAgICAgIC8vIHBlbmFsdHkgdG8gYXZvaWQgZmxhdCBhcmVhIHRvIGJlIG1pc3ByZWRpY3RlZCBieSBjb21wbGV4IG1vZGUKKyAgICAgIHJkX2N1ci0+UiArPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICB9CisKKyAgICAvLyBTaW5jZSB3ZSBhbHdheXMgZXhhbWluZSBJbnRyYTE2IGZpcnN0LCB3ZSBjYW4gb3ZlcndyaXRlICpyZCBkaXJlY3RseS4KKyAgICBTZXRSRFNjb3JlKGxhbWJkYSwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA9PSAwIHx8IHJkX2N1ci0+c2NvcmUgPCByZF9iZXN0LT5zY29yZSkgeworICAgICAgU3dhcE1vZGVTY29yZSgmcmRfY3VyLCAmcmRfYmVzdCk7CisgICAgICBTd2FwT3V0KGl0KTsKKyAgICB9CisgIH0KKyAgaWYgKHJkX2Jlc3QgIT0gcmQpIHsKKyAgICBtZW1jcHkocmQsIHJkX2Jlc3QsIHNpemVvZigqcmQpKTsKKyAgfQorICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCByZCk7ICAgLy8gZmluYWxpemUgc2NvcmUgZm9yIG1vZGUgZGVjaXNpb24uCisgIFZQOFNldEludHJhMTZNb2RlKGl0LCByZC0+bW9kZV9pMTYpOworCisgIC8vIHdlIGhhdmUgYSBibG9ja3kgbWFjcm9ibG9jayAob25seSBEQ3MgYXJlIG5vbi16ZXJvKSB3aXRoIGZhaXJseSBoaWdoCisgIC8vIGRpc3RvcnRpb24sIHJlY29yZCBtYXggZGVsdGEgc28gd2UgY2FuIGxhdGVyIGFkanVzdCB0aGUgbWluaW1hbCBmaWx0ZXJpbmcKKyAgLy8gc3RyZW5ndGggbmVlZGVkIHRvIHNtb290aCB0aGVzZSBibG9ja3Mgb3V0LgorICBpZiAoKHJkLT5ueiAmIDB4ZmZmZikgPT0gMCAmJiByZC0+RCA+IGRxbS0+bWluX2Rpc3RvXykgeworICAgIFN0b3JlTWF4RGVsdGEoZHFtLCByZC0+eV9kY19sZXZlbHMpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHJldHVybiB0aGUgY29zdCBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdXJyb3VuZGluZyBwcmVkaWN0aW9uIG1vZGVzLgorc3RhdGljIGNvbnN0IHVpbnQxNl90KiBHZXRDb3N0TW9kZUk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG1vZGVzWzE2XSkgeworICBjb25zdCBpbnQgcHJlZHNfdyA9IGl0LT5lbmNfLT5wcmVkc193XzsKKyAgY29uc3QgaW50IHggPSAoaXQtPmk0XyAmIDMpLCB5ID0gaXQtPmk0XyA+PiAyOworICBjb25zdCBpbnQgbGVmdCA9ICh4ID09IDApID8gaXQtPnByZWRzX1t5ICogcHJlZHNfdyAtIDFdIDogbW9kZXNbaXQtPmk0XyAtIDFdOworICBjb25zdCBpbnQgdG9wID0gKHkgPT0gMCkgPyBpdC0+cHJlZHNfWy1wcmVkc193ICsgeF0gOiBtb2Rlc1tpdC0+aTRfIC0gNF07CisgIHJldHVybiBWUDhGaXhlZENvc3RzSTRbdG9wXVtsZWZ0XTsKK30KKworc3RhdGljIGludCBQaWNrQmVzdEludHJhNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2k0XzsKKyAgY29uc3QgaW50IHRsYW1iZGEgPSBkcW0tPnRsYW1iZGFfOworICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMwID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IGJlc3RfYmxvY2tzID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQzsKKyAgaW50IHRvdGFsX2hlYWRlcl9iaXRzID0gMDsKKyAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7CisKKyAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBJbml0U2NvcmUoJnJkX2Jlc3QpOworICByZF9iZXN0LkggPSAyMTE7ICAvLyAnMjExJyBpcyB0aGUgdmFsdWUgb2YgVlA4Qml0Q29zdCgwLCAxNDUpCisgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9iZXN0KTsKKyAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKKyAgZG8geworICAgIGNvbnN0IGludCBrTnVtQmxvY2tzID0gMTsKKyAgICBWUDhNb2RlU2NvcmUgcmRfaTQ7CisgICAgaW50IG1vZGU7CisgICAgaW50IGJlc3RfbW9kZSA9IC0xOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHNyYzAgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBtb2RlX2Nvc3RzID0gR2V0Q29zdE1vZGVJNChpdCwgcmQtPm1vZGVzX2k0KTsKKyAgICB1aW50OF90KiBiZXN0X2Jsb2NrID0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X3BfICsgSTRUTVA7ICAgIC8vIHNjcmF0Y2ggYnVmZmVyLgorCisgICAgSW5pdFNjb3JlKCZyZF9pNCk7CisgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7CisgICAgICBWUDhNb2RlU2NvcmUgcmRfdG1wOworICAgICAgaW50MTZfdCB0bXBfbGV2ZWxzWzE2XTsKKworICAgICAgLy8gUmVjb25zdHJ1Y3QKKyAgICAgIHJkX3RtcC5ueiA9CisgICAgICAgICAgUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHRtcF9sZXZlbHMsIHNyYywgdG1wX2RzdCwgbW9kZSkgPDwgaXQtPmk0XzsKKworICAgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQorICAgICAgcmRfdG1wLkQgPSBWUDhTU0U0eDQoc3JjLCB0bXBfZHN0KTsKKyAgICAgIHJkX3RtcC5TRCA9CisgICAgICAgICAgdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvNHg0KHNyYywgdG1wX2RzdCwga1dlaWdodFkpKQorICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgcmRfdG1wLkggPSBtb2RlX2Nvc3RzW21vZGVdOworCisgICAgICAvLyBBZGQgZmxhdG5lc3MgcGVuYWx0eQorICAgICAgaWYgKG1vZGUgPiAwICYmIElzRmxhdCh0bXBfbGV2ZWxzLCBrTnVtQmxvY2tzLCBGTEFUTkVTU19MSU1JVF9JNCkpIHsKKyAgICAgICAgcmRfdG1wLlIgPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJkX3RtcC5SID0gMDsKKyAgICAgIH0KKworICAgICAgLy8gZWFybHktb3V0IGNoZWNrCisgICAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkX3RtcCk7CisgICAgICBpZiAoYmVzdF9tb2RlID49IDAgJiYgcmRfdG1wLnNjb3JlID49IHJkX2k0LnNjb3JlKSBjb250aW51ZTsKKworICAgICAgLy8gZmluaXNoIGNvbXB1dGluZyBzY29yZQorICAgICAgcmRfdG1wLlIgKz0gVlA4R2V0Q29zdEx1bWE0KGl0LCB0bXBfbGV2ZWxzKTsKKyAgICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdG1wKTsKKworICAgICAgaWYgKGJlc3RfbW9kZSA8IDAgfHwgcmRfdG1wLnNjb3JlIDwgcmRfaTQuc2NvcmUpIHsKKyAgICAgICAgQ29weVNjb3JlKCZyZF9pNCwgJnJkX3RtcCk7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIFN3YXBQdHIoJnRtcF9kc3QsICZiZXN0X2Jsb2NrKTsKKyAgICAgICAgbWVtY3B5KHJkX2Jlc3QueV9hY19sZXZlbHNbaXQtPmk0X10sIHRtcF9sZXZlbHMsCisgICAgICAgICAgICAgICBzaXplb2YocmRfYmVzdC55X2FjX2xldmVsc1tpdC0+aTRfXSkpOworICAgICAgfQorICAgIH0KKyAgICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCAmcmRfaTQpOworICAgIEFkZFNjb3JlKCZyZF9iZXN0LCAmcmRfaTQpOworICAgIGlmIChyZF9iZXN0LnNjb3JlID49IHJkLT5zY29yZSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRvdGFsX2hlYWRlcl9iaXRzICs9IChpbnQpcmRfaTQuSDsgICAvLyA8LSBlcXVhbCB0byBtb2RlX2Nvc3RzW2Jlc3RfbW9kZV07CisgICAgaWYgKHRvdGFsX2hlYWRlcl9iaXRzID4gZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gQ29weSBzZWxlY3RlZCBzYW1wbGVzIGlmIG5vdCBpbiB0aGUgcmlnaHQgcGxhY2UgYWxyZWFkeS4KKyAgICBpZiAoYmVzdF9ibG9jayAhPSBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pIHsKKyAgICAgIFZQOENvcHk0eDQoYmVzdF9ibG9jaywgYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dKTsKKyAgICB9CisgICAgcmQtPm1vZGVzX2k0W2l0LT5pNF9dID0gYmVzdF9tb2RlOworICAgIGl0LT50b3BfbnpfW2l0LT5pNF8gJiAzXSA9IGl0LT5sZWZ0X256X1tpdC0+aTRfID4+IDJdID0gKHJkX2k0Lm56ID8gMSA6IDApOworICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBiZXN0X2Jsb2NrcykpOworCisgIC8vIGZpbmFsaXplIHN0YXRlCisgIENvcHlTY29yZShyZCwgJnJkX2Jlc3QpOworICBWUDhTZXRJbnRyYTRNb2RlKGl0LCByZC0+bW9kZXNfaTQpOworICBTd2FwT3V0KGl0KTsKKyAgbWVtY3B5KHJkLT55X2FjX2xldmVscywgcmRfYmVzdC55X2FjX2xldmVscywgc2l6ZW9mKHJkLT55X2FjX2xldmVscykpOworICByZXR1cm4gMTsgICAvLyBzZWxlY3QgaW50cmE0eDQgb3ZlciBpbnRyYTE2eDE2Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFBpY2tCZXN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIGNvbnN0IGludCBrTnVtQmxvY2tzID0gODsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZpdC0+ZW5jXy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV91dl87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgVV9PRkZfRU5DOworICB1aW50OF90KiB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFVfT0ZGX0VOQzsgIC8vIHNjcmF0Y2ggYnVmZmVyCisgIHVpbnQ4X3QqIGRzdDAgPSBpdC0+eXV2X291dF8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIGRzdCA9IGRzdDA7CisgIFZQOE1vZGVTY29yZSByZF9iZXN0OworICBpbnQgbW9kZTsKKworICByZC0+bW9kZV91diA9IC0xOworICBJbml0U2NvcmUoJnJkX2Jlc3QpOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgIFZQOE1vZGVTY29yZSByZF91djsKKworICAgIC8vIFJlY29uc3RydWN0CisgICAgcmRfdXYubnogPSBSZWNvbnN0cnVjdFVWKGl0LCAmcmRfdXYsIHRtcF9kc3QsIG1vZGUpOworCisgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQorICAgIHJkX3V2LkQgID0gVlA4U1NFMTZ4OChzcmMsIHRtcF9kc3QpOworICAgIHJkX3V2LlNEID0gMDsgICAgLy8gbm90IGNhbGxpbmcgVERpc3RvIGhlcmU6IGl0IHRlbmRzIHRvIGZsYXR0ZW4gYXJlYXMuCisgICAgcmRfdXYuSCAgPSBWUDhGaXhlZENvc3RzVVZbbW9kZV07CisgICAgcmRfdXYuUiAgPSBWUDhHZXRDb3N0VVYoaXQsICZyZF91dik7CisgICAgaWYgKG1vZGUgPiAwICYmIElzRmxhdChyZF91di51dl9sZXZlbHNbMF0sIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX1VWKSkgeworICAgICAgcmRfdXYuUiArPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICB9CisKKyAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkX3V2KTsKKyAgICBpZiAobW9kZSA9PSAwIHx8IHJkX3V2LnNjb3JlIDwgcmRfYmVzdC5zY29yZSkgeworICAgICAgQ29weVNjb3JlKCZyZF9iZXN0LCAmcmRfdXYpOworICAgICAgcmQtPm1vZGVfdXYgPSBtb2RlOworICAgICAgbWVtY3B5KHJkLT51dl9sZXZlbHMsIHJkX3V2LnV2X2xldmVscywgc2l6ZW9mKHJkLT51dl9sZXZlbHMpKTsKKyAgICAgIFN3YXBQdHIoJmRzdCwgJnRtcF9kc3QpOworICAgIH0KKyAgfQorICBWUDhTZXRJbnRyYVVWTW9kZShpdCwgcmQtPm1vZGVfdXYpOworICBBZGRTY29yZShyZCwgJnJkX2Jlc3QpOworICBpZiAoZHN0ICE9IGRzdDApIHsgICAvLyBjb3B5IDE2eDggYmxvY2sgaWYgbmVlZGVkCisgICAgVlA4Q29weTE2eDgoZHN0LCBkc3QwKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluYWwgcmVjb25zdHJ1Y3Rpb24gYW5kIHF1YW50aXphdGlvbi4KKworc3RhdGljIHZvaWQgU2ltcGxlUXVhbnRpemUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgaXNfaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOworICBpbnQgbnogPSAwOworCisgIGlmIChpc19pMTYpIHsKKyAgICBueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQywgaXQtPnByZWRzX1swXSk7CisgIH0gZWxzZSB7CisgICAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKKyAgICBkbyB7CisgICAgICBjb25zdCBpbnQgbW9kZSA9CisgICAgICAgICAgaXQtPnByZWRzX1soaXQtPmk0XyAmIDMpICsgKGl0LT5pNF8gPj4gMikgKiBlbmMtPnByZWRzX3dfXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkZfRU5DICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgICAgbnogfD0gUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHJkLT55X2FjX2xldmVsc1tpdC0+aTRfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBtb2RlKSA8PCBpdC0+aTRfOworICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQykpOworICB9CisKKyAgbnogfD0gUmVjb25zdHJ1Y3RVVihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQywgaXQtPm1iXy0+dXZfbW9kZV8pOworICByZC0+bnogPSBuejsKK30KKworLy8gUmVmaW5lIGludHJhMTYvaW50cmE0IHN1Yi1tb2RlcyBiYXNlZCBvbiBkaXN0b3J0aW9uIG9ubHkgKG5vdCByYXRlKS4KK3N0YXRpYyB2b2lkIFJlZmluZVVzaW5nRGlzdG9ydGlvbihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyeV9ib3RoX21vZGVzLCBpbnQgcmVmaW5lX3V2X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBzY29yZV90IGJlc3Rfc2NvcmUgPSBNQVhfQ09TVDsKKyAgaW50IG56ID0gMDsKKyAgaW50IG1vZGU7CisgIGludCBpc19pMTYgPSB0cnlfYm90aF9tb2RlcyB8fCAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7CisKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZpdC0+ZW5jXy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107CisgIC8vIFNvbWUgZW1waXJpYyBjb25zdGFudHMsIG9mIGFwcHJveGltYXRlIG9yZGVyIG9mIG1hZ25pdHVkZS4KKyAgY29uc3QgaW50IGxhbWJkYV9kX2kxNiA9IDEwNjsKKyAgY29uc3QgaW50IGxhbWJkYV9kX2k0ID0gMTE7CisgIGNvbnN0IGludCBsYW1iZGFfZF91diA9IDEyMDsKKyAgc2NvcmVfdCBzY29yZV9pNCA9IGRxbS0+aTRfcGVuYWx0eV87CisgIHNjb3JlX3QgaTRfYml0X3N1bSA9IDA7CisgIGNvbnN0IHNjb3JlX3QgYml0X2xpbWl0ID0gaXQtPmVuY18tPm1iX2hlYWRlcl9saW1pdF87CisKKyAgaWYgKGlzX2kxNikgeyAgIC8vIEZpcnN0LCBldmFsdWF0ZSBJbnRyYTE2IGRpc3RvcnRpb24KKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBWUDhTU0UxNngxNihzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Rml4ZWRDb3N0c0kxNlttb2RlXSAqIGxhbWJkYV9kX2kxNjsKKyAgICAgIGlmIChtb2RlID4gMCAmJiBWUDhGaXhlZENvc3RzSTE2W21vZGVdID4gYml0X2xpbWl0KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICB9CisgICAgfQorICAgIFZQOFNldEludHJhMTZNb2RlKGl0LCBiZXN0X21vZGUpOworICAgIC8vIHdlJ2xsIHJlY29uc3RydWN0IGxhdGVyLCBpZiBpMTYgbW9kZSBhY3R1YWxseSBnZXRzIHNlbGVjdGVkCisgIH0KKworICAvLyBOZXh0LCBldmFsdWF0ZSBJbnRyYTQKKyAgaWYgKHRyeV9ib3RoX21vZGVzIHx8ICFpc19pMTYpIHsKKyAgICAvLyBXZSBkb24ndCBldmFsdWF0ZSB0aGUgcmF0ZSBoZXJlLCBidXQganVzdCBhY2NvdW50IGZvciBpdCB0aHJvdWdoIGEKKyAgICAvLyBjb25zdGFudCBwZW5hbHR5IChpNCBtb2RlIHVzdWFsbHkgbmVlZHMgbW9yZSBiaXRzIGNvbXBhcmVkIHRvIGkxNikuCisgICAgaXNfaTE2ID0gMDsKKyAgICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICAgIGRvIHsKKyAgICAgIGludCBiZXN0X2k0X21vZGUgPSAtMTsKKyAgICAgIHNjb3JlX3QgYmVzdF9pNF9zY29yZSA9IE1BWF9DT1NUOworICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IG1vZGVfY29zdHMgPSBHZXRDb3N0TW9kZUk0KGl0LCByZC0+bW9kZXNfaTQpOworCisgICAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9CTU9ERVM7ICsrbW9kZSkgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IFZQOFNTRTR4NChzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtb2RlX2Nvc3RzW21vZGVdICogbGFtYmRhX2RfaTQ7CisgICAgICAgIGlmIChzY29yZSA8IGJlc3RfaTRfc2NvcmUpIHsKKyAgICAgICAgICBiZXN0X2k0X21vZGUgPSBtb2RlOworICAgICAgICAgIGJlc3RfaTRfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaTRfYml0X3N1bSArPSBtb2RlX2Nvc3RzW2Jlc3RfaTRfbW9kZV07CisgICAgICByZC0+bW9kZXNfaTRbaXQtPmk0X10gPSBiZXN0X2k0X21vZGU7CisgICAgICBzY29yZV9pNCArPSBiZXN0X2k0X3Njb3JlOworICAgICAgaWYgKHNjb3JlX2k0ID49IGJlc3Rfc2NvcmUgfHwgaTRfYml0X3N1bSA+IGJpdF9saW1pdCkgeworICAgICAgICAvLyBJbnRyYTQgd29uJ3QgYmUgYmV0dGVyIHRoYW4gSW50cmExNi4gQmFpbCBvdXQgYW5kIHBpY2sgSW50cmExNi4KKyAgICAgICAgaXNfaTE2ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeyAgLy8gcmVjb25zdHJ1Y3QgcGFydGlhbCBibG9jayBpbnNpZGUgeXV2X291dDJfIGJ1ZmZlcgorICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICAgIG56IHw9IFJlY29uc3RydWN0SW50cmE0KGl0LCByZC0+eV9hY19sZXZlbHNbaXQtPmk0X10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgdG1wX2RzdCwgYmVzdF9pNF9tb2RlKSA8PCBpdC0+aTRfOworICAgICAgfQorICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfb3V0Ml8gKyBZX09GRl9FTkMpKTsKKyAgfQorCisgIC8vIEZpbmFsIHJlY29uc3RydWN0aW9uLCBkZXBlbmRpbmcgb24gd2hpY2ggbW9kZSBpcyBzZWxlY3RlZC4KKyAgaWYgKCFpc19pMTYpIHsKKyAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCByZC0+bW9kZXNfaTQpOworICAgIFN3YXBPdXQoaXQpOworICAgIGJlc3Rfc2NvcmUgPSBzY29yZV9pNDsKKyAgfSBlbHNlIHsKKyAgICBueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQywgaXQtPnByZWRzX1swXSk7CisgIH0KKworICAvLyAuLi4gYW5kIFVWIQorICBpZiAocmVmaW5lX3V2X21vZGUpIHsKKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgc2NvcmVfdCBiZXN0X3V2X3Njb3JlID0gTUFYX0NPU1Q7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgICAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhVVk1vZGVPZmZzZXRzW21vZGVdOworICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IFZQOFNTRTE2eDgoc3JjLCByZWYpICogUkRfRElTVE9fTVVMVAorICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEZpeGVkQ29zdHNVVlttb2RlXSAqIGxhbWJkYV9kX3V2OworICAgICAgaWYgKHNjb3JlIDwgYmVzdF91dl9zY29yZSkgeworICAgICAgICBiZXN0X21vZGUgPSBtb2RlOworICAgICAgICBiZXN0X3V2X3Njb3JlID0gc2NvcmU7CisgICAgICB9CisgICAgfQorICAgIFZQOFNldEludHJhVVZNb2RlKGl0LCBiZXN0X21vZGUpOworICB9CisgIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRl9FTkMsIGl0LT5tYl8tPnV2X21vZGVfKTsKKworICByZC0+bnogPSBuejsKKyAgcmQtPnNjb3JlID0gYmVzdF9zY29yZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2ludCBWUDhEZWNpbWF0ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQsCisgICAgICAgICAgICAgICAgVlA4UkRMZXZlbCByZF9vcHQpIHsKKyAgaW50IGlzX3NraXBwZWQ7CisgIGNvbnN0IGludCBtZXRob2QgPSBpdC0+ZW5jXy0+bWV0aG9kXzsKKworICBJbml0U2NvcmUocmQpOworCisgIC8vIFdlIGNhbiBwZXJmb3JtIHByZWRpY3Rpb25zIGZvciBMdW1hMTZ4MTYgYW5kIENocm9tYTh4OCBhbHJlYWR5LgorICAvLyBMdW1hNHg0IHByZWRpY3Rpb25zIG5lZWRzIHRvIGJlIGRvbmUgYXMtd2UtZ28uCisgIFZQOE1ha2VMdW1hMTZQcmVkcyhpdCk7CisgIFZQOE1ha2VDaHJvbWE4UHJlZHMoaXQpOworCisgIGlmIChyZF9vcHQgPiBSRF9PUFRfTk9ORSkgeworICAgIGl0LT5kb190cmVsbGlzXyA9IChyZF9vcHQgPj0gUkRfT1BUX1RSRUxMSVNfQUxMKTsKKyAgICBQaWNrQmVzdEludHJhMTYoaXQsIHJkKTsKKyAgICBpZiAobWV0aG9kID49IDIpIHsKKyAgICAgIFBpY2tCZXN0SW50cmE0KGl0LCByZCk7CisgICAgfQorICAgIFBpY2tCZXN0VVYoaXQsIHJkKTsKKyAgICBpZiAocmRfb3B0ID09IFJEX09QVF9UUkVMTElTKSB7ICAgLy8gZmluaXNoIG9mZiB3aXRoIHRyZWxsaXMtb3B0aW0gbm93CisgICAgICBpdC0+ZG9fdHJlbGxpc18gPSAxOworICAgICAgU2ltcGxlUXVhbnRpemUoaXQsIHJkKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGhldXJpc3RpY2FsbHkgZGVjaWRlZCBpbnRyYTE2IC8gaW50cmE0LgorICAgIC8vIEZvciBtZXRob2QgPj0gMiwgcGljayB0aGUgYmVzdCBpbnRyYTQvaW50cmExNiBiYXNlZCBvbiBTU0UgKH50YWQgc2xvd2VyKS4KKyAgICAvLyBGb3IgbWV0aG9kIDw9IDEsIHdlIGRvbid0IHJlLWV4YW1pbmUgdGhlIGRlY2lzaW9uIGJ1dCBqdXN0IGdvIGFoZWFkIHdpdGgKKyAgICAvLyBxdWFudGl6YXRpb24vcmVjb25zdHJ1Y3Rpb24uCisgICAgUmVmaW5lVXNpbmdEaXN0b3J0aW9uKGl0LCAobWV0aG9kID49IDIpLCAobWV0aG9kID49IDEpLCByZCk7CisgIH0KKyAgaXNfc2tpcHBlZCA9IChyZC0+bnogPT0gMCk7CisgIFZQOFNldFNraXAoaXQsIGlzX3NraXBwZWQpOworICByZXR1cm4gaXNfc2tpcHBlZDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9zeW50YXguYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9zeW50YXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzgwN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3N5bnRheC5jCkBAIC0wLDAgKzEsMzgzIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSGVhZGVyIHN5bnRheCB3cml0aW5nCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBSSUZGIGNvbnN0YW50cworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9tdXhfdHlwZXMuaCIgICAgICAgICAvLyBBTFBIQV9GTEFHCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucworCitzdGF0aWMgaW50IElzVlA4WE5lZWRlZChjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgcmV0dXJuICEhZW5jLT5oYXNfYWxwaGFfOyAgLy8gQ3VycmVudGx5IHRoZSBvbmx5IGNhc2Ugd2hlbiBWUDhYIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjb3VsZCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KK30KKworc3RhdGljIGludCBQdXRQYWRkaW5nQnl0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGNvbnN0IHVpbnQ4X3QgcGFkX2J5dGVbMV0gPSB7IDAgfTsKKyAgcmV0dXJuICEhcGljLT53cml0ZXIocGFkX2J5dGUsIDEsIHBpYyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXcml0ZXJzIGZvciBoZWFkZXIncyB2YXJpb3VzIHBpZWNlcyAoaW4gb3JkZXIgb2YgYXBwZWFyYW5jZSkKKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFB1dFJJRkZIZWFkZXIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSkgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICB1aW50OF90IHJpZmZbUklGRl9IRUFERVJfU0laRV0gPSB7CisgICAgJ1InLCAnSScsICdGJywgJ0YnLCAwLCAwLCAwLCAwLCAnVycsICdFJywgJ0InLCAnUCcKKyAgfTsKKyAgYXNzZXJ0KHJpZmZfc2l6ZSA9PSAodWludDMyX3QpcmlmZl9zaXplKTsKKyAgUHV0TEUzMihyaWZmICsgVEFHX1NJWkUsICh1aW50MzJfdClyaWZmX3NpemUpOworICBpZiAoIXBpYy0+d3JpdGVyKHJpZmYsIHNpemVvZihyaWZmKSwgcGljKSkgeworICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKKyAgfQorICByZXR1cm4gVlA4X0VOQ19PSzsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFB1dFZQOFhIZWFkZXIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIHVpbnQ4X3QgdnA4eFtDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRV0gPSB7CisgICAgJ1YnLCAnUCcsICc4JywgJ1gnCisgIH07CisgIHVpbnQzMl90IGZsYWdzID0gMDsKKworICBhc3NlcnQoSXNWUDhYTmVlZGVkKGVuYykpOworICBhc3NlcnQocGljLT53aWR0aCA+PSAxICYmIHBpYy0+aGVpZ2h0ID49IDEpOworICBhc3NlcnQocGljLT53aWR0aCA8PSBNQVhfQ0FOVkFTX1NJWkUgJiYgcGljLT5oZWlnaHQgPD0gTUFYX0NBTlZBU19TSVpFKTsKKworICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7CisgICAgZmxhZ3MgfD0gQUxQSEFfRkxBRzsKKyAgfQorCisgIFB1dExFMzIodnA4eCArIFRBR19TSVpFLCAgICAgICAgICAgICAgVlA4WF9DSFVOS19TSVpFKTsKKyAgUHV0TEUzMih2cDh4ICsgQ0hVTktfSEVBREVSX1NJWkUsICAgICBmbGFncyk7CisgIFB1dExFMjQodnA4eCArIENIVU5LX0hFQURFUl9TSVpFICsgNCwgcGljLT53aWR0aCAtIDEpOworICBQdXRMRTI0KHZwOHggKyBDSFVOS19IRUFERVJfU0laRSArIDcsIHBpYy0+aGVpZ2h0IC0gMSk7CisgIGlmICghcGljLT53cml0ZXIodnA4eCwgc2l6ZW9mKHZwOHgpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0QWxwaGFDaHVuayhjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgdWludDhfdCBhbHBoYV9jaHVua19oZHJbQ0hVTktfSEVBREVSX1NJWkVdID0geworICAgICdBJywgJ0wnLCAnUCcsICdIJworICB9OworCisgIGFzc2VydChlbmMtPmhhc19hbHBoYV8pOworCisgIC8vIEFscGhhIGNodW5rIGhlYWRlci4KKyAgUHV0TEUzMihhbHBoYV9jaHVua19oZHIgKyBUQUdfU0laRSwgZW5jLT5hbHBoYV9kYXRhX3NpemVfKTsKKyAgaWYgKCFwaWMtPndyaXRlcihhbHBoYV9jaHVua19oZHIsIHNpemVvZihhbHBoYV9jaHVua19oZHIpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisKKyAgLy8gQWxwaGEgY2h1bmsgZGF0YS4KKyAgaWYgKCFwaWMtPndyaXRlcihlbmMtPmFscGhhX2RhdGFfLCBlbmMtPmFscGhhX2RhdGFfc2l6ZV8sIHBpYykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7CisgIH0KKworICAvLyBQYWRkaW5nLgorICBpZiAoKGVuYy0+YWxwaGFfZGF0YV9zaXplXyAmIDEpICYmICFQdXRQYWRkaW5nQnl0ZShwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0VlA4SGVhZGVyKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2cDhfc2l6ZSkgeworICB1aW50OF90IHZwOF9jaHVua19oZHJbQ0hVTktfSEVBREVSX1NJWkVdID0geworICAgICdWJywgJ1AnLCAnOCcsICcgJworICB9OworICBhc3NlcnQodnA4X3NpemUgPT0gKHVpbnQzMl90KXZwOF9zaXplKTsKKyAgUHV0TEUzMih2cDhfY2h1bmtfaGRyICsgVEFHX1NJWkUsICh1aW50MzJfdCl2cDhfc2l6ZSk7CisgIGlmICghcGljLT53cml0ZXIodnA4X2NodW5rX2hkciwgc2l6ZW9mKHZwOF9jaHVua19oZHIpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgUHV0VlA4RnJhbWVIZWFkZXIoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZSwgc2l6ZV90IHNpemUwKSB7CisgIHVpbnQ4X3QgdnA4X2ZybV9oZHJbVlA4X0ZSQU1FX0hFQURFUl9TSVpFXTsKKyAgdWludDMyX3QgYml0czsKKworICBpZiAoc2l6ZTAgPj0gVlA4X01BWF9QQVJUSVRJT04wX1NJWkUpIHsgIC8vIHBhcnRpdGlvbiAjMCBpcyB0b28gYmlnIHRvIGZpdAorICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX1BBUlRJVElPTjBfT1ZFUkZMT1c7CisgIH0KKworICAvLyBQYXJhZ3JhcGggOS4xLgorICBiaXRzID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXlmcmFtZSAoMWIpCisgICAgICAgfCAocHJvZmlsZSA8PCAxKSAgICAgICAgICAgIC8vIHByb2ZpbGUgKDNiKQorICAgICAgIHwgKDEgPDwgNCkgICAgICAgICAgICAgICAgICAvLyB2aXNpYmxlICgxYikKKyAgICAgICB8ICgodWludDMyX3Qpc2l6ZTAgPDwgNSk7ICAgLy8gcGFydGl0aW9uIGxlbmd0aCAoMTliKQorICB2cDhfZnJtX2hkclswXSA9IChiaXRzID4+ICAwKSAmIDB4ZmY7CisgIHZwOF9mcm1faGRyWzFdID0gKGJpdHMgPj4gIDgpICYgMHhmZjsKKyAgdnA4X2ZybV9oZHJbMl0gPSAoYml0cyA+PiAxNikgJiAweGZmOworICAvLyBzaWduYXR1cmUKKyAgdnA4X2ZybV9oZHJbM10gPSAoVlA4X1NJR05BVFVSRSA+PiAxNikgJiAweGZmOworICB2cDhfZnJtX2hkcls0XSA9IChWUDhfU0lHTkFUVVJFID4+ICA4KSAmIDB4ZmY7CisgIHZwOF9mcm1faGRyWzVdID0gKFZQOF9TSUdOQVRVUkUgPj4gIDApICYgMHhmZjsKKyAgLy8gZGltZW5zaW9ucworICB2cDhfZnJtX2hkcls2XSA9IHBpYy0+d2lkdGggJiAweGZmOworICB2cDhfZnJtX2hkcls3XSA9IHBpYy0+d2lkdGggPj4gODsKKyAgdnA4X2ZybV9oZHJbOF0gPSBwaWMtPmhlaWdodCAmIDB4ZmY7CisgIHZwOF9mcm1faGRyWzldID0gcGljLT5oZWlnaHQgPj4gODsKKworICBpZiAoIXBpYy0+d3JpdGVyKHZwOF9mcm1faGRyLCBzaXplb2YodnA4X2ZybV9oZHIpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCisvLyBXZWJQIEhlYWRlcnMuCitzdGF0aWMgaW50IFB1dFdlYlBIZWFkZXJzKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywgc2l6ZV90IHNpemUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdnA4X3NpemUsIHNpemVfdCByaWZmX3NpemUpIHsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKworICAvLyBSSUZGIGhlYWRlci4KKyAgZXJyID0gUHV0UklGRkhlYWRlcihlbmMsIHJpZmZfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICAvLyBWUDhYLgorICBpZiAoSXNWUDhYTmVlZGVkKGVuYykpIHsKKyAgICBlcnIgPSBQdXRWUDhYSGVhZGVyKGVuYyk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQWxwaGEuCisgIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKKyAgICBlcnIgPSBQdXRBbHBoYUNodW5rKGVuYyk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICB9CisKKyAgLy8gVlA4IGhlYWRlci4KKyAgZXJyID0gUHV0VlA4SGVhZGVyKHBpYywgdnA4X3NpemUpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisKKyAgLy8gVlA4IGZyYW1lIGhlYWRlci4KKyAgZXJyID0gUHV0VlA4RnJhbWVIZWFkZXIocGljLCBlbmMtPnByb2ZpbGVfLCBzaXplMCk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICAvLyBBbGwgT0suCisgIHJldHVybiAxOworCisgIC8vIEVycm9yLgorIEVycm9yOgorICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBlcnIpOworfQorCisvLyBTZWdtZW50YXRpb24gaGVhZGVyCitzdGF0aWMgdm9pZCBQdXRTZWdtZW50SGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBWUDhFbmNTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5zZWdtZW50X2hkcl87CisgIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIChoZHItPm51bV9zZWdtZW50c18gPiAxKSkpIHsKKyAgICAvLyBXZSBhbHdheXMgJ3VwZGF0ZScgdGhlIHF1YW50IGFuZCBmaWx0ZXIgc3RyZW5ndGggdmFsdWVzCisgICAgY29uc3QgaW50IHVwZGF0ZV9kYXRhID0gMTsKKyAgICBpbnQgczsKKyAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBoZHItPnVwZGF0ZV9tYXBfKTsKKyAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgdXBkYXRlX2RhdGEpKSB7CisgICAgICAvLyB3ZSBhbHdheXMgdXNlIGFic29sdXRlIHZhbHVlcywgbm90IHJlbGF0aXZlIG9uZXMKKyAgICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIDEpOyAgIC8vIChzZWdtZW50X2ZlYXR1cmVfbW9kZSA9IDEuIFBhcmFncmFwaCA5LjMuKQorICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFtX1tzXS5xdWFudF8sIDcpOworICAgICAgfQorICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7CisgICAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfLCA2KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhkci0+dXBkYXRlX21hcF8pIHsKKyAgICAgIGZvciAocyA9IDA7IHMgPCAzOyArK3MpIHsKKyAgICAgICAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIChwcm9iYS0+c2VnbWVudHNfW3NdICE9IDI1NXUpKSkgeworICAgICAgICAgIFZQOFB1dEJpdHMoYncsIHByb2JhLT5zZWdtZW50c19bc10sIDgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIEZpbHRlcmluZyBwYXJhbWV0ZXJzIGhlYWRlcgorc3RhdGljIHZvaWQgUHV0RmlsdGVySGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4RW5jRmlsdGVySGVhZGVyKiBjb25zdCBoZHIpIHsKKyAgY29uc3QgaW50IHVzZV9sZl9kZWx0YSA9IChoZHItPmk0eDRfbGZfZGVsdGFfICE9IDApOworICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBoZHItPnNpbXBsZV8pOworICBWUDhQdXRCaXRzKGJ3LCBoZHItPmxldmVsXywgNik7CisgIFZQOFB1dEJpdHMoYncsIGhkci0+c2hhcnBuZXNzXywgMyk7CisgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCB1c2VfbGZfZGVsdGEpKSB7CisgICAgLy8gJzAnIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBpNHg0X2xmX2RlbHRhXyBhdCBmcmFtZSAjMC4KKyAgICBjb25zdCBpbnQgbmVlZF91cGRhdGUgPSAoaGRyLT5pNHg0X2xmX2RlbHRhXyAhPSAwKTsKKyAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgbmVlZF91cGRhdGUpKSB7CisgICAgICAvLyB3ZSBkb24ndCB1c2UgcmVmX2xmX2RlbHRhID0+IGVtaXQgZm91ciAwIGJpdHMKKyAgICAgIFZQOFB1dEJpdHMoYncsIDAsIDQpOworICAgICAgLy8gd2UgdXNlIG1vZGVfbGZfZGVsdGEgZm9yIGk0eDQKKyAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGhkci0+aTR4NF9sZl9kZWx0YV8sIDYpOworICAgICAgVlA4UHV0Qml0cyhidywgMCwgMyk7ICAgIC8vIGFsbCBvdGhlcnMgdW51c2VkCisgICAgfQorICB9Cit9CisKKy8vIE5vbWluYWwgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMKK3N0YXRpYyB2b2lkIFB1dFF1YW50KFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4UHV0Qml0cyhidywgZW5jLT5iYXNlX3F1YW50XywgNyk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfeTFfZGNfLCA0KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV95Ml9kY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3kyX2FjXywgNCk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfdXZfZGNfLCA0KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV91dl9hY18sIDQpOworfQorCisvLyBQYXJ0aXRpb24gc2l6ZXMKK3N0YXRpYyBpbnQgRW1pdFBhcnRpdGlvbnNTaXplKGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgdWludDhfdCBidWZbMyAqIChNQVhfTlVNX1BBUlRJVElPTlMgLSAxKV07CisgIGludCBwOworICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfIC0gMTsgKytwKSB7CisgICAgY29uc3Qgc2l6ZV90IHBhcnRfc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoZW5jLT5wYXJ0c18gKyBwKTsKKyAgICBpZiAocGFydF9zaXplID49IFZQOF9NQVhfUEFSVElUSU9OX1NJWkUpIHsKKyAgICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfUEFSVElUSU9OX09WRVJGTE9XKTsKKyAgICB9CisgICAgYnVmWzMgKiBwICsgMF0gPSAocGFydF9zaXplID4+ICAwKSAmIDB4ZmY7CisgICAgYnVmWzMgKiBwICsgMV0gPSAocGFydF9zaXplID4+ICA4KSAmIDB4ZmY7CisgICAgYnVmWzMgKiBwICsgMl0gPSAocGFydF9zaXplID4+IDE2KSAmIDB4ZmY7CisgIH0KKyAgcmV0dXJuIHAgPyBwaWMtPndyaXRlcihidWYsIDMgKiBwLCBwaWMpIDogMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBHZW5lcmF0ZVBhcnRpdGlvbjAoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEJpdFdyaXRlciogY29uc3QgYncgPSAmZW5jLT5id187CisgIGNvbnN0IGludCBtYl9zaXplID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7CisKKyAgcG9zMSA9IFZQOEJpdFdyaXRlclBvcyhidyk7CisgIGlmICghVlA4Qml0V3JpdGVySW5pdChidywgbWJfc2l6ZSAqIDcgLyA4KSkgeyAgICAgICAgLy8gfjcgYml0cyBwZXIgbWFjcm9ibG9jaworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KKyAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gY29sb3JzcGFjZQorICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBjbGFtcCB0eXBlCisKKyAgUHV0U2VnbWVudEhlYWRlcihidywgZW5jKTsKKyAgUHV0RmlsdGVySGVhZGVyKGJ3LCAmZW5jLT5maWx0ZXJfaGRyXyk7CisgIFZQOFB1dEJpdHMoYncsIGVuYy0+bnVtX3BhcnRzXyA9PSA4ID8gMyA6CisgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSA0ID8gMiA6CisgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSAyID8gMSA6IDAsIDIpOworICBQdXRRdWFudChidywgZW5jKTsKKyAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gbm8gcHJvYmEgdXBkYXRlCisgIFZQOFdyaXRlUHJvYmFzKGJ3LCAmZW5jLT5wcm9iYV8pOworICBwb3MyID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKyAgVlA4Q29kZUludHJhTW9kZXMoZW5jKTsKKyAgVlA4Qml0V3JpdGVyRmluaXNoKGJ3KTsKKworICBwb3MzID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKworICBpZiAoZW5jLT5waWNfLT5zdGF0cykgeworICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1swXSA9IChpbnQpKChwb3MyIC0gcG9zMSArIDcpID4+IDMpOworICAgIGVuYy0+cGljXy0+c3RhdHMtPmhlYWRlcl9ieXRlc1sxXSA9IChpbnQpKChwb3MzIC0gcG9zMiArIDcpID4+IDMpOworICAgIGVuYy0+cGljXy0+c3RhdHMtPmFscGhhX2RhdGFfc2l6ZSA9IChpbnQpZW5jLT5hbHBoYV9kYXRhX3NpemVfOworICB9CisgIGlmIChidy0+ZXJyb3JfKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBWUDhFbmNGcmVlQml0V3JpdGVycyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgaW50IHA7CisgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmVuYy0+YndfKTsKKyAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dChlbmMtPnBhcnRzXyArIHApOworICB9Cit9CisKK2ludCBWUDhFbmNXcml0ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgVlA4Qml0V3JpdGVyKiBjb25zdCBidyA9ICZlbmMtPmJ3XzsKKyAgY29uc3QgaW50IHRhc2tfcGVyY2VudCA9IDE5OworICBjb25zdCBpbnQgcGVyY2VudF9wZXJfcGFydCA9IHRhc2tfcGVyY2VudCAvIGVuYy0+bnVtX3BhcnRzXzsKKyAgY29uc3QgaW50IGZpbmFsX3BlcmNlbnQgPSBlbmMtPnBlcmNlbnRfICsgdGFza19wZXJjZW50OworICBpbnQgb2sgPSAwOworICBzaXplX3QgdnA4X3NpemUsIHBhZCwgcmlmZl9zaXplOworICBpbnQgcDsKKworICAvLyBQYXJ0aXRpb24gIzAgd2l0aCBoZWFkZXIgYW5kIHBhcnRpdGlvbiBzaXplcworICBvayA9IEdlbmVyYXRlUGFydGl0aW9uMChlbmMpOworICBpZiAoIW9rKSByZXR1cm4gMDsKKworICAvLyBDb21wdXRlIFZQOCBzaXplCisgIHZwOF9zaXplID0gVlA4X0ZSQU1FX0hFQURFUl9TSVpFICsKKyAgICAgICAgICAgICBWUDhCaXRXcml0ZXJTaXplKGJ3KSArCisgICAgICAgICAgICAgMyAqIChlbmMtPm51bV9wYXJ0c18gLSAxKTsKKyAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgdnA4X3NpemUgKz0gVlA4Qml0V3JpdGVyU2l6ZShlbmMtPnBhcnRzXyArIHApOworICB9CisgIHBhZCA9IHZwOF9zaXplICYgMTsKKyAgdnA4X3NpemUgKz0gcGFkOworCisgIC8vIENvbXB1dGUgUklGRiBzaXplCisgIC8vIEF0IHRoZSBtaW5pbXVtIGl0IGlzOiAiV0VCUFZQOCBubm5uIiArIFZQOCBkYXRhIHNpemUuCisgIHJpZmZfc2l6ZSA9IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyB2cDhfc2l6ZTsKKyAgaWYgKElzVlA4WE5lZWRlZChlbmMpKSB7ICAvLyBBZGQgc2l6ZSBmb3I6IFZQOFggaGVhZGVyICsgZGF0YS4KKyAgICByaWZmX3NpemUgKz0gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkU7CisgIH0KKyAgaWYgKGVuYy0+aGFzX2FscGhhXykgeyAgLy8gQWRkIHNpemUgZm9yOiBBTFBIIGhlYWRlciArIGRhdGEuCisgICAgY29uc3QgdWludDMyX3QgcGFkZGVkX2FscGhhX3NpemUgPSBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuYy0+YWxwaGFfZGF0YV9zaXplXyAmIDEpOworICAgIHJpZmZfc2l6ZSArPSBDSFVOS19IRUFERVJfU0laRSArIHBhZGRlZF9hbHBoYV9zaXplOworICB9CisgIC8vIFNhbml0eSBjaGVjay4KKyAgaWYgKHJpZmZfc2l6ZSA+IDB4ZmZmZmZmZmVVKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9GSUxFX1RPT19CSUcpOworICB9CisKKyAgLy8gRW1pdCBoZWFkZXJzIGFuZCBwYXJ0aXRpb24gIzAKKyAgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBhcnQwID0gVlA4Qml0V3JpdGVyQnVmKGJ3KTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZTAgPSBWUDhCaXRXcml0ZXJTaXplKGJ3KTsKKyAgICBvayA9IG9rICYmIFB1dFdlYlBIZWFkZXJzKGVuYywgc2l6ZTAsIHZwOF9zaXplLCByaWZmX3NpemUpCisgICAgICAgICAgICAmJiBwaWMtPndyaXRlcihwYXJ0MCwgc2l6ZTAsIHBpYykKKyAgICAgICAgICAgICYmIEVtaXRQYXJ0aXRpb25zU2l6ZShlbmMsIHBpYyk7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dChidyk7ICAgIC8vIHdpbGwgZnJlZSB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICB9CisKKyAgLy8gVG9rZW4gcGFydGl0aW9ucworICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYgPSBWUDhCaXRXcml0ZXJCdWYoZW5jLT5wYXJ0c18gKyBwKTsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoZW5jLT5wYXJ0c18gKyBwKTsKKyAgICBpZiAoc2l6ZSkKKyAgICAgIG9rID0gb2sgJiYgcGljLT53cml0ZXIoYnVmLCBzaXplLCBwaWMpOworICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoZW5jLT5wYXJ0c18gKyBwKTsgICAgLy8gd2lsbCBmcmVlIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgICAgb2sgPSBvayAmJiBXZWJQUmVwb3J0UHJvZ3Jlc3MocGljLCBlbmMtPnBlcmNlbnRfICsgcGVyY2VudF9wZXJfcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jLT5wZXJjZW50Xyk7CisgIH0KKworICAvLyBQYWRkaW5nIGJ5dGUKKyAgaWYgKG9rICYmIHBhZCkgeworICAgIG9rID0gUHV0UGFkZGluZ0J5dGUocGljKTsKKyAgfQorCisgIGVuYy0+Y29kZWRfc2l6ZV8gPSAoaW50KShDSFVOS19IRUFERVJfU0laRSArIHJpZmZfc2l6ZSk7CisgIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKHBpYywgZmluYWxfcGVyY2VudCwgJmVuYy0+cGVyY2VudF8pOworICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy90b2tlbi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3Rva2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiYmQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy90b2tlbi5jCkBAIC0wLDAgKzEsMjg1IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgorLy8KKy8vICBBICd0b2tlbicgaXMgYSBiaXQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcHJvYmFiaWxpdHksIGVpdGhlciBmaXhlZAorLy8gb3IgYSBsYXRlci10by1iZS1kZXRlcm1pbmVkIGFmdGVyIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNvbGxlY3RlZC4KKy8vIEZvciBkeW5hbWljIHByb2JhYmlsaXR5LCB3ZSBqdXN0IHJlY29yZCB0aGUgc2xvdCBpZCAoaWR4KSBmb3IgdGhlIHByb2JhYmlsaXR5CisvLyB2YWx1ZSBpbiB0aGUgZmluYWwgcHJvYmFiaWxpdHkgYXJyYXkgKHVpbnQ4X3QqIHByb2JhcyBpbiBWUDhFbWl0VG9rZW5zKS4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQorCisvLyB3ZSB1c2UgcGFnZXMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWVtY3B5KCkKKyNkZWZpbmUgTUlOX1BBR0VfU0laRSA4MTkyICAgICAgICAgIC8vIG1pbmltdW0gbnVtYmVyIG9mIHRva2VuIHBlciBwYWdlCisjZGVmaW5lIEZJWEVEX1BST0JBX0JJVCAoMXUgPDwgMTQpCisKK3R5cGVkZWYgdWludDE2X3QgdG9rZW5fdDsgIC8vIGJpdCAjMTU6IGJpdCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0ICMxNDogZmxhZ3MgZm9yIGNvbnN0YW50IHByb2JhIG9yIGlkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0cyAjMC4uMTM6IHNsb3Qgb3IgY29uc3RhbnQgcHJvYmEKK3N0cnVjdCBWUDhUb2tlbnMgeworICBWUDhUb2tlbnMqIG5leHRfOyAgICAgICAgLy8gcG9pbnRlciB0byBuZXh0IHBhZ2UKK307CisvLyBUb2tlbiBkYXRhIGlzIGxvY2F0ZWQgaW4gbWVtb3J5IGp1c3QgYWZ0ZXIgdGhlIG5leHRfIGZpZWxkLgorLy8gVGhpcyBtYWNybyBpcyB1c2VkIHRvIHJldHVybiB0aGVpciBhZGRyZXNzIGFuZCBoaWRlIHRoZSB0cmljay4KKyNkZWZpbmUgVE9LRU5fREFUQShwKSAoKGNvbnN0IHRva2VuX3QqKSYocClbMV0pCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYiwgaW50IHBhZ2Vfc2l6ZSkgeworICBiLT50b2tlbnNfID0gTlVMTDsKKyAgYi0+cGFnZXNfID0gTlVMTDsKKyAgYi0+bGFzdF9wYWdlXyA9ICZiLT5wYWdlc187CisgIGItPmxlZnRfID0gMDsKKyAgYi0+cGFnZV9zaXplXyA9IChwYWdlX3NpemUgPCBNSU5fUEFHRV9TSVpFKSA/IE1JTl9QQUdFX1NJWkUgOiBwYWdlX3NpemU7CisgIGItPmVycm9yXyA9IDA7Cit9CisKK3ZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKKyAgaWYgKGIgIT0gTlVMTCkgeworICAgIFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKKyAgICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgICBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKKyAgICAgIFdlYlBTYWZlRnJlZShwKTsKKyAgICAgIHAgPSBuZXh0OworICAgIH0KKyAgICBWUDhUQnVmZmVySW5pdChiLCBiLT5wYWdlX3NpemVfKTsKKyAgfQorfQorCitzdGF0aWMgaW50IFRCdWZmZXJOZXdQYWdlKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKKyAgVlA4VG9rZW5zKiBwYWdlID0gTlVMTDsKKyAgaWYgKCFiLT5lcnJvcl8pIHsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZigqcGFnZSkgKyBiLT5wYWdlX3NpemVfICogc2l6ZW9mKHRva2VuX3QpOworICAgIHBhZ2UgPSAoVlA4VG9rZW5zKilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplKTsKKyAgfQorICBpZiAocGFnZSA9PSBOVUxMKSB7CisgICAgYi0+ZXJyb3JfID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwYWdlLT5uZXh0XyA9IE5VTEw7CisKKyAgKmItPmxhc3RfcGFnZV8gPSBwYWdlOworICBiLT5sYXN0X3BhZ2VfID0gJnBhZ2UtPm5leHRfOworICBiLT5sZWZ0XyA9IGItPnBhZ2Vfc2l6ZV87CisgIGItPnRva2Vuc18gPSAodG9rZW5fdCopVE9LRU5fREFUQShwYWdlKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgVE9LRU5fSUQodCwgYiwgY3R4KSBcCisgICAgKE5VTV9QUk9CQVMgKiAoKGN0eCkgKyBOVU1fQ1RYICogKChiKSArIE5VTV9CQU5EUyAqICh0KSkpKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQWRkVG9rZW4oVlA4VEJ1ZmZlciogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXQsIHVpbnQzMl90IHByb2JhX2lkeCkgeworICBhc3NlcnQocHJvYmFfaWR4IDwgRklYRURfUFJPQkFfQklUKTsKKyAgYXNzZXJ0KGJpdCA8PSAxKTsKKyAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgeworICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKKyAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBwcm9iYV9pZHg7CisgIH0KKyAgcmV0dXJuIGJpdDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkQ29uc3RhbnRUb2tlbihWUDhUQnVmZmVyKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaXQsIHVpbnQzMl90IHByb2JhKSB7CisgIGFzc2VydChwcm9iYSA8IDI1Nik7CisgIGFzc2VydChiaXQgPD0gMSk7CisgIGlmIChiLT5sZWZ0XyA+IDAgfHwgVEJ1ZmZlck5ld1BhZ2UoYikpIHsKKyAgICBjb25zdCBpbnQgc2xvdCA9IC0tYi0+bGVmdF87CisgICAgYi0+dG9rZW5zX1tzbG90XSA9IChiaXQgPDwgMTUpIHwgRklYRURfUFJPQkFfQklUIHwgcHJvYmE7CisgIH0KK30KKworaW50IFZQOFJlY29yZENvZWZmVG9rZW5zKGNvbnN0IGludCBjdHgsIGNvbnN0IGludCBjb2VmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdCwgaW50IGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFRCdWZmZXIqIGNvbnN0IHRva2VucykgeworICBpbnQgbiA9IGZpcnN0OworICB1aW50MzJfdCBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgbiwgY3R4KTsKKyAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIGxhc3QgPj0gMCwgYmFzZV9pZCArIDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB3aGlsZSAobiA8IDE2KSB7CisgICAgY29uc3QgaW50IGMgPSBjb2VmZnNbbisrXTsKKyAgICBjb25zdCBpbnQgc2lnbiA9IGMgPCAwOworICAgIGNvbnN0IHVpbnQzMl90IHYgPSBzaWduID8gLWMgOiBjOworICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ICE9IDAsIGJhc2VfaWQgKyAxKSkgeworICAgICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCAwKTsgIC8vIGN0eD0wCisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxLCBiYXNlX2lkICsgMikpIHsKKyAgICAgIGJhc2VfaWQgPSBUT0tFTl9JRChjb2VmZl90eXBlLCBWUDhFbmNCYW5kc1tuXSwgMSk7ICAvLyBjdHg9MQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDQsIGJhc2VfaWQgKyAzKSkgeworICAgICAgICBpZiAoQWRkVG9rZW4odG9rZW5zLCB2ICE9IDIsIGJhc2VfaWQgKyA0KSkKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIHYgPT0gNCwgYmFzZV9pZCArIDUpOworICAgICAgfSBlbHNlIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ID4gMTAsIGJhc2VfaWQgKyA2KSkgeworICAgICAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDYsIGJhc2VfaWQgKyA3KSkgeworICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCB2ID09IDYsIDE1OSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHYgPj0gOSwgMTY1KTsKKyAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgISh2ICYgMSksIDE0NSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBtYXNrOworICAgICAgICBjb25zdCB1aW50OF90KiB0YWI7CisgICAgICAgIHVpbnQzMl90IHJlc2lkdWUgPSB2IC0gMzsKKyAgICAgICAgaWYgKHJlc2lkdWUgPCAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOCk7CisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAwKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAyOworICAgICAgICAgIHRhYiA9IFZQOENhdDM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzaWR1ZSA8ICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgpOworICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMSk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMzsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ0OworICAgICAgICB9IGVsc2UgaWYgKHJlc2lkdWUgPCAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyAxMCk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAyKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCA0OworICAgICAgICAgIHRhYiA9IFZQOENhdDU7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOENhdDYgKDExYikKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyAxMCk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAzKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAxMDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ2OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEhKHJlc2lkdWUgJiBtYXNrKSwgKnRhYisrKTsKKyAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIDIpOyAgLy8gY3R4PTIKKyAgICB9CisgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHNpZ24sIDEyOCk7CisgICAgaWYgKG4gPT0gMTYgfHwgIUFkZFRva2VuKHRva2VucywgbiA8PSBsYXN0LCBiYXNlX2lkICsgMCkpIHsKKyAgICAgIHJldHVybiAxOyAgIC8vIEVPQgorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworI3VuZGVmIFRPS0VOX0lECisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGlzIGZ1bmN0aW9uIHdvcmtzLCBidXQgaXNuJ3QgY3VycmVudGx5IHVzZWQuIFNhdmVkIGZvciBsYXRlci4KKworI2lmIDAKKworc3RhdGljIHZvaWQgUmVjb3JkKGludCBiaXQsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7CisgIHByb2JhX3QgcCA9ICpzdGF0czsKKyAgaWYgKHAgPj0gMHhmZmZmMDAwMHUpIHsgICAgICAgICAgICAgICAvLyBhbiBvdmVyZmxvdyBpcyBpbmJvdW5kLgorICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KKyAgfQorICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KKyAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKKyAgKnN0YXRzID0gcDsKK30KKwordm9pZCBWUDhUb2tlblRvU3RhdHMoY29uc3QgVlA4VEJ1ZmZlciogY29uc3QgYiwgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKKyAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IE4gPSAocC0+bmV4dF8gPT0gTlVMTCkgPyBiLT5sZWZ0XyA6IDA7CisgICAgaW50IG4gPSBNQVhfTlVNX1RPS0VOOworICAgIGNvbnN0IHRva2VuX3QqIGNvbnN0IHRva2VucyA9IFRPS0VOX0RBVEEocCk7CisgICAgd2hpbGUgKG4tLSA+IE4pIHsKKyAgICAgIGNvbnN0IHRva2VuX3QgdG9rZW4gPSB0b2tlbnNbbl07CisgICAgICBpZiAoISh0b2tlbiAmIEZJWEVEX1BST0JBX0JJVCkpIHsKKyAgICAgICAgUmVjb3JkKCh0b2tlbiA+PiAxNSkgJiAxLCBzdGF0cyArICh0b2tlbiAmIDB4M2ZmZnUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCA9IHAtPm5leHRfOworICB9Cit9CisKKyNlbmRpZiAgIC8vIDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmFsIGNvZGluZyBwYXNzLCB3aXRoIGtub3duIHByb2JhYmlsaXRpZXMKKworaW50IFZQOEVtaXRUb2tlbnMoVlA4VEJ1ZmZlciogY29uc3QgYiwgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcywgaW50IGZpbmFsX3Bhc3MpIHsKKyAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICBhc3NlcnQoIWItPmVycm9yXyk7CisgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKKyAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOworICAgIGludCBuID0gYi0+cGFnZV9zaXplXzsKKyAgICBjb25zdCB0b2tlbl90KiBjb25zdCB0b2tlbnMgPSBUT0tFTl9EQVRBKHApOworICAgIHdoaWxlIChuLS0gPiBOKSB7CisgICAgICBjb25zdCB0b2tlbl90IHRva2VuID0gdG9rZW5zW25dOworICAgICAgY29uc3QgaW50IGJpdCA9ICh0b2tlbiA+PiAxNSkgJiAxOworICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7CisgICAgICAgIFZQOFB1dEJpdChidywgYml0LCB0b2tlbiAmIDB4ZmZ1KTsgIC8vIGNvbnN0YW50IHByb2JhCisgICAgICB9IGVsc2UgeworICAgICAgICBWUDhQdXRCaXQoYncsIGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZmluYWxfcGFzcykgV2ViUFNhZmVGcmVlKCh2b2lkKilwKTsKKyAgICBwID0gbmV4dDsKKyAgfQorICBpZiAoZmluYWxfcGFzcykgYi0+cGFnZXNfID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFNpemUgZXN0aW1hdGlvbgorc2l6ZV90IFZQOEVzdGltYXRlVG9rZW5TaXplKFZQOFRCdWZmZXIqIGNvbnN0IGIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcykgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIGNvbnN0IFZQOFRva2VucyogcCA9IGItPnBhZ2VzXzsKKyAgYXNzZXJ0KCFiLT5lcnJvcl8pOworICB3aGlsZSAocCAhPSBOVUxMKSB7CisgICAgY29uc3QgVlA4VG9rZW5zKiBjb25zdCBuZXh0ID0gcC0+bmV4dF87CisgICAgY29uc3QgaW50IE4gPSAobmV4dCA9PSBOVUxMKSA/IGItPmxlZnRfIDogMDsKKyAgICBpbnQgbiA9IGItPnBhZ2Vfc2l6ZV87CisgICAgY29uc3QgdG9rZW5fdCogY29uc3QgdG9rZW5zID0gVE9LRU5fREFUQShwKTsKKyAgICB3aGlsZSAobi0tID4gTikgeworICAgICAgY29uc3QgdG9rZW5fdCB0b2tlbiA9IHRva2Vuc1tuXTsKKyAgICAgIGNvbnN0IGludCBiaXQgPSB0b2tlbiAmICgxIDw8IDE1KTsKKyAgICAgIGlmICh0b2tlbiAmIEZJWEVEX1BST0JBX0JJVCkgeworICAgICAgICBzaXplICs9IFZQOEJpdENvc3QoYml0LCB0b2tlbiAmIDB4ZmZ1KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdChiaXQsIHByb2Jhc1t0b2tlbiAmIDB4M2ZmZnVdKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCA9IG5leHQ7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbHNlICAgICAvLyBESVNBQkxFX1RPS0VOX0JVRkZFUgorCit2b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKKyAgKHZvaWQpYjsKK30KK3ZvaWQgVlA4VEJ1ZmZlckNsZWFyKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKKyAgKHZvaWQpYjsKK30KKworI2VuZGlmICAgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgorCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdHJlZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGUwYjNiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3RyZWUuYwpAQCAtMCwwICsxLDUwNCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvZGluZyBvZiB0b2tlbiBwcm9iYWJpbGl0aWVzLCBpbnRyYSBtb2RlcyBhbmQgc2VnbWVudHMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGVuY2kuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmF1bHQgcHJvYmFiaWxpdGllcworCisvLyBQYXJhZ3JhcGggMTMuNQorY29uc3QgdWludDhfdAorICBWUDhDb2VmZnNQcm9iYTBbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0geworICB7IHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMjUzLCAxMzYsIDI1NCwgMjU1LCAyMjgsIDIxOSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg5LCAxMjksIDI0MiwgMjU1LCAyMjcsIDIxMywgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTA2LCAxMjYsIDIyNywgMjUyLCAyMTQsIDIwOSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDk4LCAyNDgsIDI1NSwgMjM2LCAyMjYsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE4MSwgMTMzLCAyMzgsIDI1NCwgMjIxLCAyMzQsIDI1NSwgMTU0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDc4LCAxMzQsIDIwMiwgMjQ3LCAxOTgsIDE4MCwgMjU1LCAyMTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICB9LAorICAgIHsgeyAxLCAxODUsIDI0OSwgMjU1LCAyNDMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg0LCAxNTAsIDI0NywgMjU1LCAyMzYsIDIyNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNzcsIDExMCwgMjE2LCAyNTUsIDIzNiwgMjMwLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgIH0sCisgICAgeyB7IDEsIDEwMSwgMjUxLCAyNTUsIDI0MSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzAsIDEzOSwgMjQxLCAyNTIsIDIzNiwgMjA5LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAzNywgMTE2LCAxOTYsIDI0MywgMjI4LCAyNTUsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMDQsIDI1NCwgMjU1LCAyNDUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjA3LCAxNjAsIDI1MCwgMjU1LCAyMzgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTAyLCAxMDMsIDIzMSwgMjU1LCAyMTEsIDE3MSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE1MiwgMjUyLCAyNTUsIDI0MCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNzcsIDEzNSwgMjQzLCAyNTUsIDIzNCwgMjI1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA4MCwgMTI5LCAyMTEsIDI1NSwgMTk0LCAyMjQsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDI0NiwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfQorICB9LAorICB7IHsgeyAxOTgsIDM1LCAyMzcsIDIyMywgMTkzLCAxODcsIDE2MiwgMTYwLCAxNDUsIDE1NSwgNjIgfSwKKyAgICAgIHsgMTMxLCA0NSwgMTk4LCAyMjEsIDE3MiwgMTc2LCAyMjAsIDE1NywgMjUyLCAyMjEsIDEgfSwKKyAgICAgIHsgNjgsIDQ3LCAxNDYsIDIwOCwgMTQ5LCAxNjcsIDIyMSwgMTYyLCAyNTUsIDIyMywgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNDksIDI0MSwgMjU1LCAyMjEsIDIyNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTg0LCAxNDEsIDIzNCwgMjUzLCAyMjIsIDIyMCwgMjU1LCAxOTksIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgODEsIDk5LCAxODEsIDI0MiwgMTc2LCAxOTAsIDI0OSwgMjAyLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMjksIDIzMiwgMjUzLCAyMTQsIDE5NywgMjQyLCAxOTYsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgOTksIDEyMSwgMjEwLCAyNTAsIDIwMSwgMTk4LCAyNTUsIDIwMiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMywgOTEsIDE2MywgMjQyLCAxNzAsIDE4NywgMjQ3LCAyMTAsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDIwMCwgMjQ2LCAyNTUsIDIzNCwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMDksIDE3OCwgMjQxLCAyNTUsIDIzMSwgMjQ1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0NCwgMTMwLCAyMDEsIDI1MywgMjA1LCAxOTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMzIsIDIzOSwgMjUxLCAyMTksIDIwOSwgMjU1LCAxNjUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgOTQsIDEzNiwgMjI1LCAyNTEsIDIxOCwgMTkwLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMiwgMTAwLCAxNzQsIDI0NSwgMTg2LCAxNjEsIDI1NSwgMTk5LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxODIsIDI0OSwgMjU1LCAyMzIsIDIzNSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI0LCAxNDMsIDI0MSwgMjU1LCAyMjcsIDIzNCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMzUsIDc3LCAxODEsIDI1MSwgMTkzLCAyMTEsIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxNTcsIDI0NywgMjU1LCAyMzYsIDIzMSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTIxLCAxNDEsIDIzNSwgMjU1LCAyMjUsIDIyNywgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNDUsIDk5LCAxODgsIDI1MSwgMTk1LCAyMTcsIDI1NSwgMjI0LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxLCAyNTEsIDI1NSwgMjEzLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwMywgMSwgMjQ4LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMzcsIDEsIDE3NywgMjU1LCAyMjQsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjUzLCA5LCAyNDgsIDI1MSwgMjA3LCAyMDgsIDI1NSwgMTkyLCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE3NSwgMTMsIDIyNCwgMjQzLCAxOTMsIDE4NSwgMjQ5LCAxOTgsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgNzMsIDE3LCAxNzEsIDIyMSwgMTYxLCAxNzksIDIzNiwgMTY3LCAyNTUsIDIzNCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA5NSwgMjQ3LCAyNTMsIDIxMiwgMTgzLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMzksIDkwLCAyNDQsIDI1MCwgMjExLCAyMDksIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE1NSwgNzcsIDE5NSwgMjQ4LCAxODgsIDE5NSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDI0LCAyMzksIDI1MSwgMjE4LCAyMTksIDI1NSwgMjA1LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIwMSwgNTEsIDIxOSwgMjU1LCAxOTYsIDE4NiwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgNjksIDQ2LCAxOTAsIDIzOSwgMjAxLCAyMTgsIDI1NSwgMjI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxOTEsIDI1MSwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjIzLCAxNjUsIDI0OSwgMjU1LCAyMTMsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQxLCAxMjQsIDI0OCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE2LCAyNDgsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDE5MCwgMzYsIDIzMCwgMjU1LCAyMzYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQ5LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAyMjYsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQ3LCAxOTIsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQwLCAxMjgsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDEzNCwgMjUyLCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMTMsIDYyLCAyNTAsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDU1LCA5MywgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMjAyLCAyNCwgMjEzLCAyMzUsIDE4NiwgMTkxLCAyMjAsIDE2MCwgMjQwLCAxNzUsIDI1NSB9LAorICAgICAgeyAxMjYsIDM4LCAxODIsIDIzMiwgMTY5LCAxODQsIDIyOCwgMTc0LCAyNTUsIDE4NywgMTI4IH0sCisgICAgICB7IDYxLCA0NiwgMTM4LCAyMTksIDE1MSwgMTc4LCAyNDAsIDE3MCwgMjU1LCAyMTYsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgMTEyLCAyMzAsIDI1MCwgMTk5LCAxOTEsIDI0NywgMTU5LCAyNTUsIDI1NSwgMTI4IH0sCisgICAgICB7IDE2NiwgMTA5LCAyMjgsIDI1MiwgMjExLCAyMTUsIDI1NSwgMTc0LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDM5LCA3NywgMTYyLCAyMzIsIDE3MiwgMTgwLCAyNDUsIDE3OCwgMjU1LCAyNTUsIDEyOCB9CisgICAgfSwKKyAgICB7IHsgMSwgNTIsIDIyMCwgMjQ2LCAxOTgsIDE5OSwgMjQ5LCAyMjAsIDI1NSwgMjU1LCAxMjggfSwKKyAgICAgIHsgMTI0LCA3NCwgMTkxLCAyNDMsIDE4MywgMTkzLCAyNTAsIDIyMSwgMjU1LCAyNTUsIDEyOCB9LAorICAgICAgeyAyNCwgNzEsIDEzMCwgMjE5LCAxNTQsIDE3MCwgMjQzLCAxODIsIDI1NSwgMjU1LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDE4MiwgMjI1LCAyNDksIDIxOSwgMjQwLCAyNTUsIDIyNCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNDksIDE1MCwgMjI2LCAyNTIsIDIxNiwgMjA1LCAyNTUsIDE3MSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyOCwgMTA4LCAxNzAsIDI0MiwgMTgzLCAxOTQsIDI1NCwgMjIzLCAyNTUsIDI1NSwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCA4MSwgMjMwLCAyNTIsIDIwNCwgMjAzLCAyNTUsIDE5MiwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxMjMsIDEwMiwgMjA5LCAyNDcsIDE4OCwgMTk2LCAyNTUsIDIzMywgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAyMCwgOTUsIDE1MywgMjQzLCAxNjQsIDE3MywgMjU1LCAyMDMsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDIyMiwgMjQ4LCAyNTUsIDIxNiwgMjEzLCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyAxNjgsIDE3NSwgMjQ2LCAyNTIsIDIzNSwgMjA1LCAyNTUsIDI1NSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0NywgMTE2LCAyMTUsIDI1NSwgMjExLCAyMTIsIDI1NSwgMjU1LCAxMjgsIDEyOCwgMTI4IH0KKyAgICB9LAorICAgIHsgeyAxLCAxMjEsIDIzNiwgMjUzLCAyMTIsIDIxNCwgMjU1LCAyNTUsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMTQxLCA4NCwgMjEzLCAyNTIsIDIwMSwgMjAyLCAyNTUsIDIxOSwgMTI4LCAxMjgsIDEyOCB9LAorICAgICAgeyA0MiwgODAsIDE2MCwgMjQwLCAxNjIsIDE4NSwgMjU1LCAyMDUsIDEyOCwgMTI4LCAxMjggfQorICAgIH0sCisgICAgeyB7IDEsIDEsIDI1NSwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjggfSwKKyAgICAgIHsgMjQ0LCAxLCAyNTUsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCisgICAgICB7IDIzOCwgMSwgMjU1LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CisgICAgfQorICB9Cit9OworCit2b2lkIFZQOERlZmF1bHRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMgPSAmZW5jLT5wcm9iYV87CisgIHByb2Jhcy0+dXNlX3NraXBfcHJvYmFfID0gMDsKKyAgbWVtc2V0KHByb2Jhcy0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmFzLT5zZWdtZW50c18pKTsKKyAgbWVtY3B5KHByb2Jhcy0+Y29lZmZzXywgVlA4Q29lZmZzUHJvYmEwLCBzaXplb2YoVlA4Q29lZmZzUHJvYmEwKSk7CisgIC8vIE5vdGU6IHdlIGNvdWxkIGhhcmQtY29kZSB0aGUgbGV2ZWxfY29zdHNfIGNvcnJlc3BvbmRpbmcgdG8gVlA4Q29lZmZzUHJvYmEwLAorICAvLyBidXQgdGhhdCdzIH4xMWsgb2Ygc3RhdGljIGRhdGEuIEJldHRlciBjYWxsIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoKSBsYXRlci4KKyAgcHJvYmFzLT5kaXJ0eV8gPSAxOworfQorCisvLyBQYXJhZ3JhcGggMTEuNS4gIDkwMGJ5dGVzLgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JNb2Rlc1Byb2JhW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVMgLSAxXSA9IHsKKyAgeyB7IDIzMSwgMTIwLCA0OCwgODksIDExNSwgMTEzLCAxMjAsIDE1MiwgMTEyIH0sCisgICAgeyAxNTIsIDE3OSwgNjQsIDEyNiwgMTcwLCAxMTgsIDQ2LCA3MCwgOTUgfSwKKyAgICB7IDE3NSwgNjksIDE0MywgODAsIDg1LCA4MiwgNzIsIDE1NSwgMTAzIH0sCisgICAgeyA1NiwgNTgsIDEwLCAxNzEsIDIxOCwgMTg5LCAxNywgMTMsIDE1MiB9LAorICAgIHsgMTE0LCAyNiwgMTcsIDE2MywgNDQsIDE5NSwgMjEsIDEwLCAxNzMgfSwKKyAgICB7IDEyMSwgMjQsIDgwLCAxOTUsIDI2LCA2MiwgNDQsIDY0LCA4NSB9LAorICAgIHsgMTQ0LCA3MSwgMTAsIDM4LCAxNzEsIDIxMywgMTQ0LCAzNCwgMjYgfSwKKyAgICB7IDE3MCwgNDYsIDU1LCAxOSwgMTM2LCAxNjAsIDMzLCAyMDYsIDcxIH0sCisgICAgeyA2MywgMjAsIDgsIDExNCwgMTE0LCAyMDgsIDEyLCA5LCAyMjYgfSwKKyAgICB7IDgxLCA0MCwgMTEsIDk2LCAxODIsIDg0LCAyOSwgMTYsIDM2IH0gfSwKKyAgeyB7IDEzNCwgMTgzLCA4OSwgMTM3LCA5OCwgMTAxLCAxMDYsIDE2NSwgMTQ4IH0sCisgICAgeyA3MiwgMTg3LCAxMDAsIDEzMCwgMTU3LCAxMTEsIDMyLCA3NSwgODAgfSwKKyAgICB7IDY2LCAxMDIsIDE2NywgOTksIDc0LCA2MiwgNDAsIDIzNCwgMTI4IH0sCisgICAgeyA0MSwgNTMsIDksIDE3OCwgMjQxLCAxNDEsIDI2LCA4LCAxMDcgfSwKKyAgICB7IDc0LCA0MywgMjYsIDE0NiwgNzMsIDE2NiwgNDksIDIzLCAxNTcgfSwKKyAgICB7IDY1LCAzOCwgMTA1LCAxNjAsIDUxLCA1MiwgMzEsIDExNSwgMTI4IH0sCisgICAgeyAxMDQsIDc5LCAxMiwgMjcsIDIxNywgMjU1LCA4NywgMTcsIDcgfSwKKyAgICB7IDg3LCA2OCwgNzEsIDQ0LCAxMTQsIDUxLCAxNSwgMTg2LCAyMyB9LAorICAgIHsgNDcsIDQxLCAxNCwgMTEwLCAxODIsIDE4MywgMjEsIDE3LCAxOTQgfSwKKyAgICB7IDY2LCA0NSwgMjUsIDEwMiwgMTk3LCAxODksIDIzLCAxOCwgMjIgfSB9LAorICB7IHsgODgsIDg4LCAxNDcsIDE1MCwgNDIsIDQ2LCA0NSwgMTk2LCAyMDUgfSwKKyAgICB7IDQzLCA5NywgMTgzLCAxMTcsIDg1LCAzOCwgMzUsIDE3OSwgNjEgfSwKKyAgICB7IDM5LCA1MywgMjAwLCA4NywgMjYsIDIxLCA0MywgMjMyLCAxNzEgfSwKKyAgICB7IDU2LCAzNCwgNTEsIDEwNCwgMTE0LCAxMDIsIDI5LCA5MywgNzcgfSwKKyAgICB7IDM5LCAyOCwgODUsIDE3MSwgNTgsIDE2NSwgOTAsIDk4LCA2NCB9LAorICAgIHsgMzQsIDIyLCAxMTYsIDIwNiwgMjMsIDM0LCA0MywgMTY2LCA3MyB9LAorICAgIHsgMTA3LCA1NCwgMzIsIDI2LCA1MSwgMSwgODEsIDQzLCAzMSB9LAorICAgIHsgNjgsIDI1LCAxMDYsIDIyLCA2NCwgMTcxLCAzNiwgMjI1LCAxMTQgfSwKKyAgICB7IDM0LCAxOSwgMjEsIDEwMiwgMTMyLCAxODgsIDE2LCA3NiwgMTI0IH0sCisgICAgeyA2MiwgMTgsIDc4LCA5NSwgODUsIDU3LCA1MCwgNDgsIDUxIH0gfSwKKyAgeyB7IDE5MywgMTAxLCAzNSwgMTU5LCAyMTUsIDExMSwgODksIDQ2LCAxMTEgfSwKKyAgICB7IDYwLCAxNDgsIDMxLCAxNzIsIDIxOSwgMjI4LCAyMSwgMTgsIDExMSB9LAorICAgIHsgMTEyLCAxMTMsIDc3LCA4NSwgMTc5LCAyNTUsIDM4LCAxMjAsIDExNCB9LAorICAgIHsgNDAsIDQyLCAxLCAxOTYsIDI0NSwgMjA5LCAxMCwgMjUsIDEwOSB9LAorICAgIHsgODgsIDQzLCAyOSwgMTQwLCAxNjYsIDIxMywgMzcsIDQzLCAxNTQgfSwKKyAgICB7IDYxLCA2MywgMzAsIDE1NSwgNjcsIDQ1LCA2OCwgMSwgMjA5IH0sCisgICAgeyAxMDAsIDgwLCA4LCA0MywgMTU0LCAxLCA1MSwgMjYsIDcxIH0sCisgICAgeyAxNDIsIDc4LCA3OCwgMTYsIDI1NSwgMTI4LCAzNCwgMTk3LCAxNzEgfSwKKyAgICB7IDQxLCA0MCwgNSwgMTAyLCAyMTEsIDE4MywgNCwgMSwgMjIxIH0sCisgICAgeyA1MSwgNTAsIDE3LCAxNjgsIDIwOSwgMTkyLCAyMywgMjUsIDgyIH0gfSwKKyAgeyB7IDEzOCwgMzEsIDM2LCAxNzEsIDI3LCAxNjYsIDM4LCA0NCwgMjI5IH0sCisgICAgeyA2NywgODcsIDU4LCAxNjksIDgyLCAxMTUsIDI2LCA1OSwgMTc5IH0sCisgICAgeyA2MywgNTksIDkwLCAxODAsIDU5LCAxNjYsIDkzLCA3MywgMTU0IH0sCisgICAgeyA0MCwgNDAsIDIxLCAxMTYsIDE0MywgMjA5LCAzNCwgMzksIDE3NSB9LAorICAgIHsgNDcsIDE1LCAxNiwgMTgzLCAzNCwgMjIzLCA0OSwgNDUsIDE4MyB9LAorICAgIHsgNDYsIDE3LCAzMywgMTgzLCA2LCA5OCwgMTUsIDMyLCAxODMgfSwKKyAgICB7IDU3LCA0NiwgMjIsIDI0LCAxMjgsIDEsIDU0LCAxNywgMzcgfSwKKyAgICB7IDY1LCAzMiwgNzMsIDExNSwgMjgsIDEyOCwgMjMsIDEyOCwgMjA1IH0sCisgICAgeyA0MCwgMywgOSwgMTE1LCA1MSwgMTkyLCAxOCwgNiwgMjIzIH0sCisgICAgeyA4NywgMzcsIDksIDExNSwgNTksIDc3LCA2NCwgMjEsIDQ3IH0gfSwKKyAgeyB7IDEwNCwgNTUsIDQ0LCAyMTgsIDksIDU0LCA1MywgMTMwLCAyMjYgfSwKKyAgICB7IDY0LCA5MCwgNzAsIDIwNSwgNDAsIDQxLCAyMywgMjYsIDU3IH0sCisgICAgeyA1NCwgNTcsIDExMiwgMTg0LCA1LCA0MSwgMzgsIDE2NiwgMjEzIH0sCisgICAgeyAzMCwgMzQsIDI2LCAxMzMsIDE1MiwgMTE2LCAxMCwgMzIsIDEzNCB9LAorICAgIHsgMzksIDE5LCA1MywgMjIxLCAyNiwgMTE0LCAzMiwgNzMsIDI1NSB9LAorICAgIHsgMzEsIDksIDY1LCAyMzQsIDIsIDE1LCAxLCAxMTgsIDczIH0sCisgICAgeyA3NSwgMzIsIDEyLCA1MSwgMTkyLCAyNTUsIDE2MCwgNDMsIDUxIH0sCisgICAgeyA4OCwgMzEsIDM1LCA2NywgMTAyLCA4NSwgNTUsIDE4NiwgODUgfSwKKyAgICB7IDU2LCAyMSwgMjMsIDExMSwgNTksIDIwNSwgNDUsIDM3LCAxOTIgfSwKKyAgICB7IDU1LCAzOCwgNzAsIDEyNCwgNzMsIDEwMiwgMSwgMzQsIDk4IH0gfSwKKyAgeyB7IDEyNSwgOTgsIDQyLCA4OCwgMTA0LCA4NSwgMTE3LCAxNzUsIDgyIH0sCisgICAgeyA5NSwgODQsIDUzLCA4OSwgMTI4LCAxMDAsIDExMywgMTAxLCA0NSB9LAorICAgIHsgNzUsIDc5LCAxMjMsIDQ3LCA1MSwgMTI4LCA4MSwgMTcxLCAxIH0sCisgICAgeyA1NywgMTcsIDUsIDcxLCAxMDIsIDU3LCA1MywgNDEsIDQ5IH0sCisgICAgeyAzOCwgMzMsIDEzLCAxMjEsIDU3LCA3MywgMjYsIDEsIDg1IH0sCisgICAgeyA0MSwgMTAsIDY3LCAxMzgsIDc3LCAxMTAsIDkwLCA0NywgMTE0IH0sCisgICAgeyAxMTUsIDIxLCAyLCAxMCwgMTAyLCAyNTUsIDE2NiwgMjMsIDYgfSwKKyAgICB7IDEwMSwgMjksIDE2LCAxMCwgODUsIDEyOCwgMTAxLCAxOTYsIDI2IH0sCisgICAgeyA1NywgMTgsIDEwLCAxMDIsIDEwMiwgMjEzLCAzNCwgMjAsIDQzIH0sCisgICAgeyAxMTcsIDIwLCAxNSwgMzYsIDE2MywgMTI4LCA2OCwgMSwgMjYgfSB9LAorICB7IHsgMTAyLCA2MSwgNzEsIDM3LCAzNCwgNTMsIDMxLCAyNDMsIDE5MiB9LAorICAgIHsgNjksIDYwLCA3MSwgMzgsIDczLCAxMTksIDI4LCAyMjIsIDM3IH0sCisgICAgeyA2OCwgNDUsIDEyOCwgMzQsIDEsIDQ3LCAxMSwgMjQ1LCAxNzEgfSwKKyAgICB7IDYyLCAxNywgMTksIDcwLCAxNDYsIDg1LCA1NSwgNjIsIDcwIH0sCisgICAgeyAzNywgNDMsIDM3LCAxNTQsIDEwMCwgMTYzLCA4NSwgMTYwLCAxIH0sCisgICAgeyA2MywgOSwgOTIsIDEzNiwgMjgsIDY0LCAzMiwgMjAxLCA4NSB9LAorICAgIHsgNzUsIDE1LCA5LCA5LCA2NCwgMjU1LCAxODQsIDExOSwgMTYgfSwKKyAgICB7IDg2LCA2LCAyOCwgNSwgNjQsIDI1NSwgMjUsIDI0OCwgMSB9LAorICAgIHsgNTYsIDgsIDE3LCAxMzIsIDEzNywgMjU1LCA1NSwgMTE2LCAxMjggfSwKKyAgICB7IDU4LCAxNSwgMjAsIDgyLCAxMzUsIDU3LCAyNiwgMTIxLCA0MCB9IH0sCisgIHsgeyAxNjQsIDUwLCAzMSwgMTM3LCAxNTQsIDEzMywgMjUsIDM1LCAyMTggfSwKKyAgICB7IDUxLCAxMDMsIDQ0LCAxMzEsIDEzMSwgMTIzLCAzMSwgNiwgMTU4IH0sCisgICAgeyA4NiwgNDAsIDY0LCAxMzUsIDE0OCwgMjI0LCA0NSwgMTgzLCAxMjggfSwKKyAgICB7IDIyLCAyNiwgMTcsIDEzMSwgMjQwLCAxNTQsIDE0LCAxLCAyMDkgfSwKKyAgICB7IDQ1LCAxNiwgMjEsIDkxLCA2NCwgMjIyLCA3LCAxLCAxOTcgfSwKKyAgICB7IDU2LCAyMSwgMzksIDE1NSwgNjAsIDEzOCwgMjMsIDEwMiwgMjEzIH0sCisgICAgeyA4MywgMTIsIDEzLCA1NCwgMTkyLCAyNTUsIDY4LCA0NywgMjggfSwKKyAgICB7IDg1LCAyNiwgODUsIDg1LCAxMjgsIDEyOCwgMzIsIDE0NiwgMTcxIH0sCisgICAgeyAxOCwgMTEsIDcsIDYzLCAxNDQsIDE3MSwgNCwgNCwgMjQ2IH0sCisgICAgeyAzNSwgMjcsIDEwLCAxNDYsIDE3NCwgMTcxLCAxMiwgMjYsIDEyOCB9IH0sCisgIHsgeyAxOTAsIDgwLCAzNSwgOTksIDE4MCwgODAsIDEyNiwgNTQsIDQ1IH0sCisgICAgeyA4NSwgMTI2LCA0NywgODcsIDE3NiwgNTEsIDQxLCAyMCwgMzIgfSwKKyAgICB7IDEwMSwgNzUsIDEyOCwgMTM5LCAxMTgsIDE0NiwgMTE2LCAxMjgsIDg1IH0sCisgICAgeyA1NiwgNDEsIDE1LCAxNzYsIDIzNiwgODUsIDM3LCA5LCA2MiB9LAorICAgIHsgNzEsIDMwLCAxNywgMTE5LCAxMTgsIDI1NSwgMTcsIDE4LCAxMzggfSwKKyAgICB7IDEwMSwgMzgsIDYwLCAxMzgsIDU1LCA3MCwgNDMsIDI2LCAxNDIgfSwKKyAgICB7IDE0NiwgMzYsIDE5LCAzMCwgMTcxLCAyNTUsIDk3LCAyNywgMjAgfSwKKyAgICB7IDEzOCwgNDUsIDYxLCA2MiwgMjE5LCAxLCA4MSwgMTg4LCA2NCB9LAorICAgIHsgMzIsIDQxLCAyMCwgMTE3LCAxNTEsIDE0MiwgMjAsIDIxLCAxNjMgfSwKKyAgICB7IDExMiwgMTksIDEyLCA2MSwgMTk1LCAxMjgsIDQ4LCA0LCAyNCB9IH0KK307CisKK3N0YXRpYyBpbnQgUHV0STRNb2RlKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYikgeworICBpZiAoVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfRENfUFJFRCwgcHJvYlswXSkpIHsKKyAgICBpZiAoVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfVE1fUFJFRCwgcHJvYlsxXSkpIHsKKyAgICAgIGlmIChWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9WRV9QUkVELCBwcm9iWzJdKSkgeworICAgICAgICBpZiAoIVZQOFB1dEJpdChidywgbW9kZSA+PSBCX0xEX1BSRUQsIHByb2JbM10pKSB7CisgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0hFX1BSRUQsIHByb2JbNF0pKSB7CisgICAgICAgICAgICBWUDhQdXRCaXQoYncsIG1vZGUgIT0gQl9SRF9QUkVELCBwcm9iWzVdKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgbW9kZSAhPSBCX0xEX1BSRUQsIHByb2JbNl0pKSB7CisgICAgICAgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfVkxfUFJFRCwgcHJvYls3XSkpIHsKKyAgICAgICAgICAgICAgVlA4UHV0Qml0KGJ3LCBtb2RlICE9IEJfSERfUFJFRCwgcHJvYls4XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBtb2RlOworfQorCitzdGF0aWMgdm9pZCBQdXRJMTZNb2RlKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBtb2RlKSB7CisgIGlmIChWUDhQdXRCaXQoYncsIChtb2RlID09IFRNX1BSRUQgfHwgbW9kZSA9PSBIX1BSRUQpLCAxNTYpKSB7CisgICAgVlA4UHV0Qml0KGJ3LCBtb2RlID09IFRNX1BSRUQsIDEyOCk7ICAgIC8vIFRNIG9yIEhFCisgIH0gZWxzZSB7CisgICAgVlA4UHV0Qml0KGJ3LCBtb2RlID09IFZfUFJFRCwgMTYzKTsgICAgIC8vIFZFIG9yIERDCisgIH0KK30KKworc3RhdGljIHZvaWQgUHV0VVZNb2RlKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB1dl9tb2RlKSB7CisgIGlmIChWUDhQdXRCaXQoYncsIHV2X21vZGUgIT0gRENfUFJFRCwgMTQyKSkgeworICAgIGlmIChWUDhQdXRCaXQoYncsIHV2X21vZGUgIT0gVl9QUkVELCAxMTQpKSB7CisgICAgICBWUDhQdXRCaXQoYncsIHV2X21vZGUgIT0gSF9QUkVELCAxODMpOyAgICAvLyBlbHNlOiBUTV9QUkVECisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFB1dFNlZ21lbnQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHMsIGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgaWYgKFZQOFB1dEJpdChidywgcyA+PSAyLCBwWzBdKSkgcCArPSAxOworICBWUDhQdXRCaXQoYncsIHMgJiAxLCBwWzFdKTsKK30KKwordm9pZCBWUDhDb2RlSW50cmFNb2RlcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4Qml0V3JpdGVyKiBjb25zdCBidyA9ICZlbmMtPmJ3XzsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7CisgIGRvIHsKKyAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQubWJfOworICAgIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gaXQucHJlZHNfOworICAgIGlmIChlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXykgeworICAgICAgUHV0U2VnbWVudChidywgbWItPnNlZ21lbnRfLCBlbmMtPnByb2JhXy5zZWdtZW50c18pOworICAgIH0KKyAgICBpZiAoZW5jLT5wcm9iYV8udXNlX3NraXBfcHJvYmFfKSB7CisgICAgICBWUDhQdXRCaXQoYncsIG1iLT5za2lwXywgZW5jLT5wcm9iYV8uc2tpcF9wcm9iYV8pOworICAgIH0KKyAgICBpZiAoVlA4UHV0Qml0KGJ3LCAobWItPnR5cGVfICE9IDApLCAxNDUpKSB7ICAvLyBpMTZ4MTYKKyAgICAgIFB1dEkxNk1vZGUoYncsIHByZWRzWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IHByZWRzX3cgPSBlbmMtPnByZWRzX3dfOworICAgICAgY29uc3QgdWludDhfdCogdG9wX3ByZWQgPSBwcmVkcyAtIHByZWRzX3c7CisgICAgICBpbnQgeCwgeTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgICAgaW50IGxlZnQgPSBwcmVkc1stMV07CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMgPSBrQk1vZGVzUHJvYmFbdG9wX3ByZWRbeF1dW2xlZnRdOworICAgICAgICAgIGxlZnQgPSBQdXRJNE1vZGUoYncsIHByZWRzW3hdLCBwcm9iYXMpOworICAgICAgICB9CisgICAgICAgIHRvcF9wcmVkID0gcHJlZHM7CisgICAgICAgIHByZWRzICs9IHByZWRzX3c7CisgICAgICB9CisgICAgfQorICAgIFB1dFVWTW9kZShidywgbWItPnV2X21vZGVfKTsKKyAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFyYWdyYXBoIDEzCisKK2NvbnN0IHVpbnQ4X3QKKyAgICBWUDhDb2VmZnNVcGRhdGVQcm9iYVtOVU1fVFlQRVNdW05VTV9CQU5EU11bTlVNX0NUWF1bTlVNX1BST0JBU10gPSB7CisgIHsgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAxNzYsIDI0NiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMjMsIDI0MSwgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDksIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNDQsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM0LCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ2LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzOSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI0OCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTEsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTMsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU1LCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9LAorICB7IHsgeyAyMTcsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMjUsIDI1MiwgMjQxLCAyNTMsIDI1NSwgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyMzQsIDI1MCwgMjQxLCAyNTAsIDI1MywgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjIzLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM4LCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjQ4LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDcsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTMsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUyLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTAsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0KKyAgfSwKKyAgeyB7IHsgMTg2LCAyNTEsIDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjM0LCAyNTEsIDI0NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUxLCAyNTEsIDI0MywgMjUzLCAyNTQsIDI1NSwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDIzNiwgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MSwgMjUzLCAyNTMsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9CisgIH0sCisgIHsgeyB7IDI0OCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU0LCAyNTIsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0OCwgMjU0LCAyNDksIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNDYsIDI1MywgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTIsIDI1NCwgMjUxLCAyNTQsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTQsIDI1MiwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ4LCAyNTQsIDI1MywgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjUzLCAyNTUsIDI1NCwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI0NSwgMjUxLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MywgMjUzLCAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1MSwgMjUzLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfSwKKyAgICB7IHsgMjU1LCAyNTIsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjQ5LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfSwKKyAgICAgIHsgMjU1LCAyNTUsIDI1NCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUgfQorICAgIH0sCisgICAgeyB7IDI1NSwgMjU1LCAyNTMsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1MCwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0sCisgICAgICB7IDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1IH0KKyAgICB9LAorICAgIHsgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTQsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9LAorICAgICAgeyAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9CisgICAgfQorICB9Cit9OworCit2b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMpIHsKKyAgaW50IHQsIGIsIGMsIHA7CisgIGZvciAodCA9IDA7IHQgPCBOVU1fVFlQRVM7ICsrdCkgeworICAgIGZvciAoYiA9IDA7IGIgPCBOVU1fQkFORFM7ICsrYikgeworICAgICAgZm9yIChjID0gMDsgYyA8IE5VTV9DVFg7ICsrYykgeworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgTlVNX1BST0JBUzsgKytwKSB7CisgICAgICAgICAgY29uc3QgdWludDhfdCBwMCA9IHByb2Jhcy0+Y29lZmZzX1t0XVtiXVtjXVtwXTsKKyAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlID0gKHAwICE9IFZQOENvZWZmc1Byb2JhMFt0XVtiXVtjXVtwXSk7CisgICAgICAgICAgaWYgKFZQOFB1dEJpdChidywgdXBkYXRlLCBWUDhDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXSkpIHsKKyAgICAgICAgICAgIFZQOFB1dEJpdHMoYncsIHAwLCA4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIHByb2Jhcy0+dXNlX3NraXBfcHJvYmFfKSkgeworICAgIFZQOFB1dEJpdHMoYncsIHByb2Jhcy0+c2tpcF9wcm9iYV8sIDgpOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4Y2VjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oCkBAIC0wLDAgKzEsNTMxIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBXZWJQIGVuY29kZXI6IGludGVybmFsIGhlYWRlci4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfRU5DX1ZQOEVOQ0lfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9FTkNfVlA4RU5DSV9IXworCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3IgbWVtY3B5KCkKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RlYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3RocmVhZC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZW5jb2RlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZhcmlvdXMgZGVmaW5lcyBhbmQgZW51bXMKKworLy8gdmVyc2lvbiBudW1iZXJzCisjZGVmaW5lIEVOQ19NQUpfVkVSU0lPTiAwCisjZGVmaW5lIEVOQ19NSU5fVkVSU0lPTiA1CisjZGVmaW5lIEVOQ19SRVZfVkVSU0lPTiAxCisKK2VudW0geyBNQVhfTEZfTEVWRUxTID0gNjQsICAgICAgIC8vIE1heGltdW0gbG9vcCBmaWx0ZXIgbGV2ZWwKKyAgICAgICBNQVhfVkFSSUFCTEVfTEVWRUwgPSA2NywgIC8vIGxhc3QgKGluY2x1c2l2ZSkgbGV2ZWwgd2l0aCB2YXJpYWJsZSBjb3N0CisgICAgICAgTUFYX0xFVkVMID0gMjA0NyAgICAgICAgICAvLyBtYXggbGV2ZWwgKG5vdGU6IG1heCBjb2RhYmxlIGlzIDIwNDcgKyA2NykKKyAgICAgfTsKKwordHlwZWRlZiBlbnVtIHsgICAvLyBSYXRlLWRpc3RvcnRpb24gb3B0aW1pemF0aW9uIGxldmVscworICBSRF9PUFRfTk9ORSAgICAgICAgPSAwLCAgLy8gbm8gcmQtb3B0CisgIFJEX09QVF9CQVNJQyAgICAgICA9IDEsICAvLyBiYXNpYyBzY29yaW5nIChubyB0cmVsbGlzKQorICBSRF9PUFRfVFJFTExJUyAgICAgPSAyLCAgLy8gcGVyZm9ybSB0cmVsbGlzLXF1YW50IG9uIHRoZSBmaW5hbCBkZWNpc2lvbiBvbmx5CisgIFJEX09QVF9UUkVMTElTX0FMTCA9IDMgICAvLyB0cmVsbGlzLXF1YW50IGZvciBldmVyeSBzY29yaW5nIChtdWNoIHNsb3dlcikKK30gVlA4UkRMZXZlbDsKKworLy8gWVVWLWNhY2hlIHBhcmFtZXRlcnMuIENhY2hlIGlzIDMyLWJ5dGVzIHdpZGUgKD0gb25lIGNhY2hlbGluZSkuCisvLyBUaGUgb3JpZ2luYWwgb3IgcmVjb25zdHJ1Y3RlZCBzYW1wbGVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBWUDhTY2FuW10uCisvLyBUaGUgcHJlZGljdGVkIGJsb2NrcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgb2Zmc2V0cyB0byB5dXZfcF8gYW5kCisvLyB0aGUgYXJyYXlzIFZQOCpNb2RlT2Zmc2V0c1tdLgorLy8gKiBZVVYgU2FtcGxlcyBhcmVhICh5dXZfaW5fL3l1dl9vdXRfL3l1dl9vdXQyXykKKy8vICAgKHNlZSBWUDhTY2FuW10gZm9yIGFjY2Vzc2luZyB0aGUgYmxvY2tzLCBhbG9uZyB3aXRoCisvLyAgIFlfT0ZGX0VOQy9VX09GRl9FTkMvVl9PRkZfRU5DKToKKy8vICAgICAgICAgICAgICstLS0tKy0tLS0rCisvLyAgWV9PRkZfRU5DICB8WVlZWXxVVVZWfAorLy8gIFVfT0ZGX0VOQyAgfFlZWVl8VVVWVnwKKy8vICBWX09GRl9FTkMgIHxZWVlZfC4uLi58IDwtIDI1JSB3YXN0ZWQgVS9WIGFyZWEKKy8vICAgICAgICAgICAgIHxZWVlZfC4uLi58CisvLyAgICAgICAgICAgICArLS0tLSstLS0tKworLy8gKiBQcmVkaWN0aW9uIGFyZWEgKCd5dXZfcF8nLCBzaXplID0gUFJFRF9TSVpFX0VOQykKKy8vICAgSW50cmExNiBwcmVkaWN0aW9ucyAoMTZ4MTYgYmxvY2sgZWFjaCwgdHdvIHBlciByb3cpOgorLy8gICAgICAgICB8STE2REMxNnxJMTZUTTE2fAorLy8gICAgICAgICB8STE2VkUxNnxJMTZIRTE2fAorLy8gICBDaHJvbWEgVS9WIHByZWRpY3Rpb25zICgxNng4IGJsb2NrIGVhY2gsIHR3byBwZXIgcm93KToKKy8vICAgICAgICAgfEM4REM4fEM4VE04fAorLy8gICAgICAgICB8QzhWRTh8QzhIRTh8CisvLyAgIEludHJhIDR4NCBwcmVkaWN0aW9ucyAoNHg0IGJsb2NrIGVhY2gpCisvLyAgICAgICAgIHxJNERDNCBJNFRNNCBJNFZFNCBJNEhFNHxJNFJENCBJNFZSNCBJNExENCBJNFZMNHwKKy8vICAgICAgICAgfEk0SEQ0IEk0SFU0IEk0VE1QIC4uLi4ufC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ufCA8LSB+MzElIHdhc3RlZAorI2RlZmluZSBZVVZfU0laRV9FTkMgKEJQUyAqIDE2KQorI2RlZmluZSBQUkVEX1NJWkVfRU5DICgzMiAqIEJQUyArIDE2ICogQlBTICsgOCAqIEJQUykgICAvLyBJMTYrQ2hyb21hK0k0IHByZWRzCisjZGVmaW5lIFlfT0ZGX0VOQyAgICAoMCkKKyNkZWZpbmUgVV9PRkZfRU5DICAgICgxNikKKyNkZWZpbmUgVl9PRkZfRU5DICAgICgxNiArIDgpCisKK2V4dGVybiBjb25zdCBpbnQgVlA4U2NhblsxNl07ICAgICAgICAgICAvLyBpbiBxdWFudC5jCitleHRlcm4gY29uc3QgaW50IFZQOFVWTW9kZU9mZnNldHNbNF07ICAgLy8gaW4gYW5hbHl6ZS5jCitleHRlcm4gY29uc3QgaW50IFZQOEkxNk1vZGVPZmZzZXRzWzRdOworZXh0ZXJuIGNvbnN0IGludCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdOworCisvLyBMYXlvdXQgb2YgcHJlZGljdGlvbiBibG9ja3MKKy8vIGludHJhIDE2eDE2CisjZGVmaW5lIEkxNkRDMTYgKDAgKiAxNiAqIEJQUykKKyNkZWZpbmUgSTE2VE0xNiAoSTE2REMxNiArIDE2KQorI2RlZmluZSBJMTZWRTE2ICgxICogMTYgKiBCUFMpCisjZGVmaW5lIEkxNkhFMTYgKEkxNlZFMTYgKyAxNikKKy8vIGNocm9tYSA4eDgsIHR3byBVL1YgYmxvY2tzIHNpZGUgYnkgc2lkZSAoaGVuY2U6IDE2eDggZWFjaCkKKyNkZWZpbmUgQzhEQzggKDIgKiAxNiAqIEJQUykKKyNkZWZpbmUgQzhUTTggKEM4REM4ICsgMSAqIDE2KQorI2RlZmluZSBDOFZFOCAoMiAqIDE2ICogQlBTICsgOCAqIEJQUykKKyNkZWZpbmUgQzhIRTggKEM4VkU4ICsgMSAqIDE2KQorLy8gaW50cmEgNHg0CisjZGVmaW5lIEk0REM0ICgzICogMTYgKiBCUFMgKyAgMCkKKyNkZWZpbmUgSTRUTTQgKEk0REM0ICsgIDQpCisjZGVmaW5lIEk0VkU0IChJNERDNCArICA4KQorI2RlZmluZSBJNEhFNCAoSTREQzQgKyAxMikKKyNkZWZpbmUgSTRSRDQgKEk0REM0ICsgMTYpCisjZGVmaW5lIEk0VlI0IChJNERDNCArIDIwKQorI2RlZmluZSBJNExENCAoSTREQzQgKyAyNCkKKyNkZWZpbmUgSTRWTDQgKEk0REM0ICsgMjgpCisjZGVmaW5lIEk0SEQ0ICgzICogMTYgKiBCUFMgKyA0ICogQlBTKQorI2RlZmluZSBJNEhVNCAoSTRIRDQgKyA0KQorI2RlZmluZSBJNFRNUCAoSTRIRDQgKyA4KQorCit0eXBlZGVmIGludDY0X3Qgc2NvcmVfdDsgICAgIC8vIHR5cGUgdXNlZCBmb3Igc2NvcmVzLCByYXRlLCBkaXN0b3J0aW9uCisvLyBOb3RlIHRoYXQgTUFYX0NPU1QgaXMgbm90IHRoZSBtYXhpbXVtIGFsbG93ZWQgYnkgc2l6ZW9mKHNjb3JlX3QpLAorLy8gaW4gb3JkZXIgdG8gYWxsb3cgb3ZlcmZsb3dpbmcgY29tcHV0YXRpb25zLgorI2RlZmluZSBNQVhfQ09TVCAoKHNjb3JlX3QpMHg3ZmZmZmZmZmZmZmZmZkxMKQorCisjZGVmaW5lIFFGSVggMTcKKyNkZWZpbmUgQklBUyhiKSAgKChiKSA8PCAoUUZJWCAtIDgpKQorLy8gRnVuIGZhY3Q6IHRoaXMgaXMgdGhlIF9vbmx5XyBsaW5lIHdoZXJlIHdlJ3JlIGFjdHVhbGx5IGJlaW5nIGxvc3N5IGFuZAorLy8gZGlzY2FyZGluZyBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBRVUFOVERJVih1aW50MzJfdCBuLCB1aW50MzJfdCBpUSwgdWludDMyX3QgQikgeworICByZXR1cm4gKGludCkoKG4gKiBpUSArIEIpID4+IFFGSVgpOworfQorCisvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byByZW1vdmUgdG9rZW4tYnVmZmVyIGNvZGU6CisvLyAjZGVmaW5lIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWFkZXJzCisKK3R5cGVkZWYgdWludDMyX3QgcHJvYmFfdDsgICAvLyAxNmIgKyAxNmIKK3R5cGVkZWYgdWludDhfdCBQcm9iYUFycmF5W05VTV9DVFhdW05VTV9QUk9CQVNdOwordHlwZWRlZiBwcm9iYV90IFN0YXRzQXJyYXlbTlVNX0NUWF1bTlVNX1BST0JBU107Cit0eXBlZGVmIHVpbnQxNl90IENvc3RBcnJheVtOVU1fQ1RYXVtNQVhfVkFSSUFCTEVfTEVWRUwgKyAxXTsKK3R5cGVkZWYgY29uc3QgdWludDE2X3QqICgqQ29zdEFycmF5UHRyKVtOVU1fQ1RYXTsgICAvLyBmb3IgZWFzeSBjYXN0aW5nCit0eXBlZGVmIGNvbnN0IHVpbnQxNl90KiBDb3N0QXJyYXlNYXBbMTZdW05VTV9DVFhdOwordHlwZWRlZiBkb3VibGUgTEZTdGF0c1tOVU1fTUJfU0VHTUVOVFNdW01BWF9MRl9MRVZFTFNdOyAgLy8gZmlsdGVyIHN0YXRzCisKK3R5cGVkZWYgc3RydWN0IFZQOEVuY29kZXIgVlA4RW5jb2RlcjsKKworLy8gc2VnbWVudCBmZWF0dXJlcwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbnVtX3NlZ21lbnRzXzsgICAgICAvLyBBY3R1YWwgbnVtYmVyIG9mIHNlZ21lbnRzLiAxIHNlZ21lbnQgb25seSA9IHVudXNlZC4KKyAgaW50IHVwZGF0ZV9tYXBfOyAgICAgICAgLy8gd2hldGhlciB0byB1cGRhdGUgdGhlIHNlZ21lbnQgbWFwIG9yIG5vdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSAwIGlmIHRoZXJlJ3Mgb25seSAxIHNlZ21lbnQuCisgIGludCBzaXplXzsgICAgICAgICAgICAgIC8vIGJpdC1jb3N0IGZvciB0cmFuc21pdHRpbmcgdGhlIHNlZ21lbnQgbWFwCit9IFZQOEVuY1NlZ21lbnRIZWFkZXI7CisKKy8vIFN0cnVjdCBjb2xsZWN0aW5nIGFsbCBmcmFtZS1wZXJzaXN0ZW50IHByb2JhYmlsaXRpZXMuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3Qgc2VnbWVudHNfWzNdOyAgICAgLy8gcHJvYmFiaWxpdGllcyBmb3Igc2VnbWVudCB0cmVlCisgIHVpbnQ4X3Qgc2tpcF9wcm9iYV87ICAgICAgLy8gZmluYWwgcHJvYmFiaWxpdHkgb2YgYmVpbmcgc2tpcHBlZC4KKyAgUHJvYmFBcnJheSBjb2VmZnNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAvLyAxMDU2IGJ5dGVzCisgIFN0YXRzQXJyYXkgc3RhdHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAgICAgLy8gNDIyNCBieXRlcworICBDb3N0QXJyYXkgbGV2ZWxfY29zdF9bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgIC8vIDEzMDU2IGJ5dGVzCisgIENvc3RBcnJheU1hcCByZW1hcHBlZF9jb3N0c19bTlVNX1RZUEVTXTsgICAgICAgLy8gMTUzNiBieXRlcworICBpbnQgZGlydHlfOyAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIG5lZWQgdG8gY2FsbCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKCkKKyAgaW50IHVzZV9za2lwX3Byb2JhXzsgICAgICAvLyBOb3RlOiB3ZSBhbHdheXMgdXNlIHNraXBfcHJvYmEgZm9yIG5vdy4KKyAgaW50IG5iX3NraXBfOyAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygc2tpcHBlZCBibG9ja3MKK30gVlA4RW5jUHJvYmE7CisKKy8vIEZpbHRlciBwYXJhbWV0ZXJzLiBOb3QgYWN0dWFsbHkgdXNlZCBpbiB0aGUgY29kZSAod2UgZG9uJ3QgcGVyZm9ybQorLy8gdGhlIGluLWxvb3AgZmlsdGVyaW5nKSwgYnV0IGZpbGxlZCBmcm9tIHVzZXIncyBjb25maWcKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHNpbXBsZV87ICAgICAgICAgICAgIC8vIGZpbHRlcmluZyB0eXBlOiAwPWNvbXBsZXgsIDE9c2ltcGxlCisgIGludCBsZXZlbF87ICAgICAgICAgICAgICAvLyBiYXNlIGZpbHRlciBsZXZlbCBbMC4uNjNdCisgIGludCBzaGFycG5lc3NfOyAgICAgICAgICAvLyBbMC4uN10KKyAgaW50IGk0eDRfbGZfZGVsdGFfOyAgICAgIC8vIGRlbHRhIGZpbHRlciBsZXZlbCBmb3IgaTR4NCByZWxhdGl2ZSB0byBpMTZ4MTYKK30gVlA4RW5jRmlsdGVySGVhZGVyOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5mb3JtYXRpb25zIGFib3V0IHRoZSBtYWNyb2Jsb2Nrcy4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBibG9jayB0eXBlCisgIHVuc2lnbmVkIGludCB0eXBlXzoyOyAgICAgLy8gMD1pNHg0LCAxPWkxNngxNgorICB1bnNpZ25lZCBpbnQgdXZfbW9kZV86MjsKKyAgdW5zaWduZWQgaW50IHNraXBfOjE7CisgIHVuc2lnbmVkIGludCBzZWdtZW50XzoyOworICB1aW50OF90IGFscGhhXzsgICAgICAvLyBxdWFudGl6YXRpb24tc3VzY2VwdGliaWxpdHkKK30gVlA4TUJJbmZvOworCit0eXBlZGVmIHN0cnVjdCBWUDhNYXRyaXggeworICB1aW50MTZfdCBxX1sxNl07ICAgICAgICAvLyBxdWFudGl6ZXIgc3RlcHMKKyAgdWludDE2X3QgaXFfWzE2XTsgICAgICAgLy8gcmVjaXByb2NhbHMsIGZpeGVkIHBvaW50LgorICB1aW50MzJfdCBiaWFzX1sxNl07ICAgICAvLyByb3VuZGluZyBiaWFzCisgIHVpbnQzMl90IHp0aHJlc2hfWzE2XTsgIC8vIHZhbHVlIGJlbG93IHdoaWNoIGEgY29lZmZpY2llbnQgaXMgemVyb2VkCisgIHVpbnQxNl90IHNoYXJwZW5fWzE2XTsgIC8vIGZyZXF1ZW5jeSBib29zdGVycyBmb3Igc2xpZ2h0IHNoYXJwZW5pbmcKK30gVlA4TWF0cml4OworCit0eXBlZGVmIHN0cnVjdCB7CisgIFZQOE1hdHJpeCB5MV8sIHkyXywgdXZfOyAgLy8gcXVhbnRpemF0aW9uIG1hdHJpY2VzCisgIGludCBhbHBoYV87ICAgICAgLy8gcXVhbnQtc3VzY2VwdGliaWxpdHksIHJhbmdlIFstMTI3LDEyN10uIFplcm8gaXMgbmV1dHJhbC4KKyAgICAgICAgICAgICAgICAgICAvLyBMb3dlciB2YWx1ZXMgaW5kaWNhdGUgYSBsb3dlciByaXNrIG9mIGJsdXJyaW5lc3MuCisgIGludCBiZXRhXzsgICAgICAgLy8gZmlsdGVyLXN1c2NlcHRpYmlsaXR5LCByYW5nZSBbMCwyNTVdLgorICBpbnQgcXVhbnRfOyAgICAgIC8vIGZpbmFsIHNlZ21lbnQgcXVhbnRpemVyLgorICBpbnQgZnN0cmVuZ3RoXzsgIC8vIGZpbmFsIGluLWxvb3AgZmlsdGVyaW5nIHN0cmVuZ3RoCisgIGludCBtYXhfZWRnZV87ICAgLy8gbWF4IGVkZ2UgZGVsdGEgKGZvciBmaWx0ZXJpbmcgc3RyZW5ndGgpCisgIGludCBtaW5fZGlzdG9fOyAgLy8gbWluaW11bSBkaXN0b3J0aW9uIHJlcXVpcmVkIHRvIHRyaWdnZXIgZmlsdGVyaW5nIHJlY29yZAorICAvLyByZWFjdGl2aXRpZXMKKyAgaW50IGxhbWJkYV9pMTZfLCBsYW1iZGFfaTRfLCBsYW1iZGFfdXZfOworICBpbnQgbGFtYmRhX21vZGVfLCBsYW1iZGFfdHJlbGxpc18sIHRsYW1iZGFfOworICBpbnQgbGFtYmRhX3RyZWxsaXNfaTE2XywgbGFtYmRhX3RyZWxsaXNfaTRfLCBsYW1iZGFfdHJlbGxpc191dl87CisKKyAgLy8gbGFtYmRhIHZhbHVlcyBmb3IgZGlzdG9ydGlvbi1iYXNlZCBldmFsdWF0aW9uCisgIHNjb3JlX3QgaTRfcGVuYWx0eV87ICAgLy8gcGVuYWx0eSBmb3IgdXNpbmcgSW50cmE0Cit9IFZQOFNlZ21lbnRJbmZvOworCisvLyBIYW5keSB0cmFuc2llbnQgc3RydWN0IHRvIGFjY3VtdWxhdGUgc2NvcmUgYW5kIGluZm8gZHVyaW5nIFJELW9wdGltaXphdGlvbgorLy8gYW5kIG1vZGUgZXZhbHVhdGlvbi4KK3R5cGVkZWYgc3RydWN0IHsKKyAgc2NvcmVfdCBELCBTRDsgICAgICAgICAgICAgIC8vIERpc3RvcnRpb24sIHNwZWN0cmFsIGRpc3RvcnRpb24KKyAgc2NvcmVfdCBILCBSLCBzY29yZTsgICAgICAgIC8vIGhlYWRlciBiaXRzLCByYXRlLCBzY29yZS4KKyAgaW50MTZfdCB5X2RjX2xldmVsc1sxNl07ICAgIC8vIFF1YW50aXplZCBsZXZlbHMgZm9yIGx1bWEtREMsIGx1bWEtQUMsIGNocm9tYS4KKyAgaW50MTZfdCB5X2FjX2xldmVsc1sxNl1bMTZdOworICBpbnQxNl90IHV2X2xldmVsc1s0ICsgNF1bMTZdOworICBpbnQgbW9kZV9pMTY7ICAgICAgICAgICAgICAgLy8gbW9kZSBudW1iZXIgZm9yIGludHJhMTYgcHJlZGljdGlvbgorICB1aW50OF90IG1vZGVzX2k0WzE2XTsgICAgICAgLy8gbW9kZSBudW1iZXJzIGZvciBpbnRyYTQgcHJlZGljdGlvbnMKKyAgaW50IG1vZGVfdXY7ICAgICAgICAgICAgICAgIC8vIG1vZGUgbnVtYmVyIG9mIGNocm9tYSBwcmVkaWN0aW9uCisgIHVpbnQzMl90IG56OyAgICAgICAgICAgICAgICAvLyBub24temVybyBibG9ja3MKK30gVlA4TW9kZVNjb3JlOworCisvLyBJdGVyYXRvciBzdHJ1Y3R1cmUgdG8gaXRlcmF0ZSB0aHJvdWdoIG1hY3JvYmxvY2tzLCBwb2ludGluZyB0byB0aGUKKy8vIHJpZ2h0IG5laWdoYm91cmluZyBkYXRhIChzYW1wbGVzLCBwcmVkaWN0aW9ucywgY29udGV4dHMsIC4uLikKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHhfLCB5XzsgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYWNyb2Jsb2NrCisgIGludCB5X3N0cmlkZV8sIHV2X3N0cmlkZV87ICAgICAgIC8vIHJlc3BlY3RpdmUgc3RyaWRlcworICB1aW50OF90KiAgICAgIHl1dl9pbl87ICAgICAgICAgICAvLyBpbnB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dF87ICAgICAgICAgIC8vIG91dHB1dCBzYW1wbGVzCisgIHVpbnQ4X3QqICAgICAgeXV2X291dDJfOyAgICAgICAgIC8vIHNlY29uZGFyeSBidWZmZXIgc3dhcHBlZCB3aXRoIHl1dl9vdXRfLgorICB1aW50OF90KiAgICAgIHl1dl9wXzsgICAgICAgICAgICAvLyBzY3JhdGNoIGJ1ZmZlciBmb3IgcHJlZGljdGlvbgorICBWUDhFbmNvZGVyKiAgIGVuY187ICAgICAgICAgICAgICAvLyBiYWNrLXBvaW50ZXIKKyAgVlA4TUJJbmZvKiAgICBtYl87ICAgICAgICAgICAgICAgLy8gY3VycmVudCBtYWNyb2Jsb2NrCisgIFZQOEJpdFdyaXRlciogYndfOyAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgYml0LXdyaXRlcgorICB1aW50OF90KiAgICAgIHByZWRzXzsgICAgICAgICAgICAvLyBpbnRyYSBtb2RlIHByZWRpY3RvcnMgKDR4NCBibG9ja3MpCisgIHVpbnQzMl90KiAgICAgbnpfOyAgICAgICAgICAgICAgIC8vIG5vbi16ZXJvIHBhdHRlcm4KKyAgdWludDhfdCAgICAgICBpNF9ib3VuZGFyeV9bMzddOyAgLy8gMzIrNSBib3VuZGFyeSBzYW1wbGVzIG5lZWRlZCBieSBpbnRyYTR4NAorICB1aW50OF90KiAgICAgIGk0X3RvcF87ICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRvcCBib3VuZGFyeSBzYW1wbGUKKyAgaW50ICAgICAgICAgICBpNF87ICAgICAgICAgICAgICAgLy8gY3VycmVudCBpbnRyYTR4NCBtb2RlIGJlaW5nIHRlc3RlZAorICBpbnQgICAgICAgICAgIHRvcF9uel9bOV07ICAgICAgICAvLyB0b3Atbm9uLXplcm8gY29udGV4dC4KKyAgaW50ICAgICAgICAgICBsZWZ0X256X1s5XTsgICAgICAgLy8gbGVmdC1ub24temVyby4gbGVmdF9uels4XSBpcyBpbmRlcGVuZGVudC4KKyAgdWludDY0X3QgICAgICBiaXRfY291bnRfWzRdWzNdOyAgLy8gYml0IGNvdW50ZXJzIGZvciBjb2RlZCBsZXZlbHMuCisgIHVpbnQ2NF90ICAgICAgbHVtYV9iaXRzXzsgICAgICAgIC8vIG1hY3JvYmxvY2sgYml0LWNvc3QgZm9yIGx1bWEKKyAgdWludDY0X3QgICAgICB1dl9iaXRzXzsgICAgICAgICAgLy8gbWFjcm9ibG9jayBiaXQtY29zdCBmb3IgY2hyb21hCisgIExGU3RhdHMqICAgICAgbGZfc3RhdHNfOyAgICAgICAgIC8vIGZpbHRlciBzdGF0cyAoYm9ycm93ZWQgZnJvbSBlbmNfKQorICBpbnQgICAgICAgICAgIGRvX3RyZWxsaXNfOyAgICAgICAvLyBpZiB0cnVlLCBwZXJmb3JtIGV4dHJhIGxldmVsIG9wdGltaXNhdGlvbgorICBpbnQgICAgICAgICAgIGNvdW50X2Rvd25fOyAgICAgICAvLyBudW1iZXIgb2YgbWIgc3RpbGwgdG8gYmUgcHJvY2Vzc2VkCisgIGludCAgICAgICAgICAgY291bnRfZG93bjBfOyAgICAgIC8vIHN0YXJ0aW5nIGNvdW50ZXIgdmFsdWUgKGZvciBwcm9ncmVzcykKKyAgaW50ICAgICAgICAgICBwZXJjZW50MF87ICAgICAgICAgLy8gc2F2ZWQgaW5pdGlhbCBwcm9ncmVzcyBwZXJjZW50CisKKyAgdWludDhfdCogeV9sZWZ0XzsgICAgLy8gbGVmdCBsdW1hIHNhbXBsZXMgKGFkZHJlc3NhYmxlIGZyb20gaW5kZXggLTEgdG8gMTUpLgorICB1aW50OF90KiB1X2xlZnRfOyAgICAvLyBsZWZ0IHUgc2FtcGxlcyAoYWRkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byA3KQorICB1aW50OF90KiB2X2xlZnRfOyAgICAvLyBsZWZ0IHYgc2FtcGxlcyAoYWRkcmVzc2FibGUgZnJvbSBpbmRleCAtMSB0byA3KQorCisgIHVpbnQ4X3QqIHlfdG9wXzsgICAgIC8vIHRvcCBsdW1hIHNhbXBsZXMgYXQgcG9zaXRpb24gJ3hfJworICB1aW50OF90KiB1dl90b3BfOyAgICAvLyB0b3AgdS92IHNhbXBsZXMgYXQgcG9zaXRpb24gJ3hfJywgcGFja2VkIGFzIDE2IGJ5dGVzCisKKyAgLy8gbWVtb3J5IGZvciBzdG9yaW5nIHkvdS92X2xlZnRfCisgIHVpbnQ4X3QgeXV2X2xlZnRfbWVtX1sxNyArIDE2ICsgMTYgKyA4ICsgV0VCUF9BTElHTl9DU1RdOworICAvLyBtZW1vcnkgZm9yIHl1dl8qCisgIHVpbnQ4X3QgeXV2X21lbV9bMyAqIFlVVl9TSVpFX0VOQyArIFBSRURfU0laRV9FTkMgKyBXRUJQX0FMSUdOX0NTVF07Cit9IFZQOEVuY0l0ZXJhdG9yOworCisgIC8vIGluIGl0ZXJhdG9yLmMKKy8vIG11c3QgYmUgY2FsbGVkIGZpcnN0Cit2b2lkIFZQOEl0ZXJhdG9ySW5pdChWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyByZXN0YXJ0IGEgc2Nhbgordm9pZCBWUDhJdGVyYXRvclJlc2V0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyByZXNldCBpdGVyYXRvciBwb3NpdGlvbiB0byByb3cgJ3knCit2b2lkIFZQOEl0ZXJhdG9yU2V0Um93KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHkpOworLy8gc2V0IGNvdW50IGRvd24gKD1udW1iZXIgb2YgaXRlcmF0aW9ucyB0byBnbykKK3ZvaWQgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgY291bnRfZG93bik7CisvLyByZXR1cm4gdHJ1ZSBpZiBpdGVyYXRpb24gaXMgZmluaXNoZWQKK2ludCBWUDhJdGVyYXRvcklzRG9uZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gSW1wb3J0IHVuY29tcHJlc3NlZCBzYW1wbGVzIGZyb20gc291cmNlLgorLy8gSWYgdG1wXzMyIGlzIG5vdCBOVUxMLCBpbXBvcnQgYm91bmRhcnkgc2FtcGxlcyB0b28uCisvLyB0bXBfMzIgaXMgYSAzMi1ieXRlcyBzY3JhdGNoIGJ1ZmZlciB0aGF0IG11c3QgYmUgYWxpZ25lZCBpbiBtZW1vcnkuCit2b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgdWludDhfdCogdG1wXzMyKTsKKy8vIGV4cG9ydCBkZWNpbWF0ZWQgc2FtcGxlcwordm9pZCBWUDhJdGVyYXRvckV4cG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gZ28gdG8gbmV4dCBtYWNyb2Jsb2NrLiBSZXR1cm5zIGZhbHNlIGlmIG5vdCBmaW5pc2hlZC4KK2ludCBWUDhJdGVyYXRvck5leHQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKy8vIHNhdmUgdGhlIHl1dl9vdXRfIGJvdW5kYXJ5IHZhbHVlcyB0byB0b3BfL2xlZnRfIGFycmF5cyBmb3IgbmV4dCBpdGVyYXRpb25zLgordm9pZCBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gUmVwb3J0IHByb2dyZXNzaW9uIGJhc2VkIG9uIG1hY3JvYmxvY2sgcm93cy4gUmV0dXJuIDAgZm9yIHVzZXItYWJvcnQgcmVxdWVzdC4KK2ludCBWUDhJdGVyYXRvclByb2dyZXNzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaW5hbF9kZWx0YV9wZXJjZW50KTsKKy8vIEludHJhNHg0IGl0ZXJhdGlvbnMKK3ZvaWQgVlA4SXRlcmF0b3JTdGFydEk0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyByZXR1cm5zIHRydWUgaWYgbm90IGRvbmUuCitpbnQgVlA4SXRlcmF0b3JSb3RhdGVJNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB5dXZfb3V0KTsKKworLy8gTm9uLXplcm8gY29udGV4dCBzZXR1cC90ZWFyZG93bgordm9pZCBWUDhJdGVyYXRvck56VG9CeXRlcyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwordm9pZCBWUDhJdGVyYXRvckJ5dGVzVG9OeihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworCisvLyBIZWxwZXIgZnVuY3Rpb25zIHRvIHNldCBtb2RlIHByb3BlcnRpZXMKK3ZvaWQgVlA4U2V0SW50cmExNk1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbW9kZSk7Cit2b2lkIFZQOFNldEludHJhNE1vZGUoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCB1aW50OF90KiBtb2Rlcyk7Cit2b2lkIFZQOFNldEludHJhVVZNb2RlKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG1vZGUpOwordm9pZCBWUDhTZXRTa2lwKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHNraXApOwordm9pZCBWUDhTZXRTZWdtZW50KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHNlZ21lbnQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFnaW5hdGVkIHRva2VuIGJ1ZmZlcgorCit0eXBlZGVmIHN0cnVjdCBWUDhUb2tlbnMgVlA4VG9rZW5zOyAgLy8gc3RydWN0IGRldGFpbHMgaW4gdG9rZW4uYworCit0eXBlZGVmIHN0cnVjdCB7CisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisgIFZQOFRva2VucyogcGFnZXNfOyAgICAgICAgLy8gZmlyc3QgcGFnZQorICBWUDhUb2tlbnMqKiBsYXN0X3BhZ2VfOyAgIC8vIGxhc3QgcGFnZQorICB1aW50MTZfdCogdG9rZW5zXzsgICAgICAgIC8vIHNldCB0byAoKmxhc3RfcGFnZV8pLT50b2tlbnNfCisgIGludCBsZWZ0XzsgICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgZnJlZSB0b2tlbnMgbGVmdCBiZWZvcmUgdGhlIHBhZ2UgaXMgZnVsbAorICBpbnQgcGFnZV9zaXplXzsgICAgICAgICAgIC8vIG51bWJlciBvZiB0b2tlbnMgcGVyIHBhZ2UKKyNlbmRpZgorICBpbnQgZXJyb3JfOyAgICAgICAgIC8vIHRydWUgaW4gY2FzZSBvZiBtYWxsb2MgZXJyb3IKK30gVlA4VEJ1ZmZlcjsKKworLy8gaW5pdGlhbGl6ZSBhbiBlbXB0eSBidWZmZXIKK3ZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYiwgaW50IHBhZ2Vfc2l6ZSk7Cit2b2lkIFZQOFRCdWZmZXJDbGVhcihWUDhUQnVmZmVyKiBjb25zdCBiKTsgICAvLyBkZS1hbGxvY2F0ZSBwYWdlcyBtZW1vcnkKKworI2lmICFkZWZpbmVkKERJU0FCTEVfVE9LRU5fQlVGRkVSKQorCisvLyBGaW5hbGl6ZXMgYml0c3RyZWFtIHdoZW4gcHJvYmFiaWxpdGllcyBhcmUga25vd24uCisvLyBEZWxldGVzIHRoZSBhbGxvY2F0ZWQgdG9rZW4gbWVtb3J5IGlmIGZpbmFsX3Bhc3MgaXMgdHJ1ZS4KK2ludCBWUDhFbWl0VG9rZW5zKFZQOFRCdWZmZXIqIGNvbnN0IGIsIFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMsIGludCBmaW5hbF9wYXNzKTsKKworLy8gcmVjb3JkIHRoZSBjb2Rpbmcgb2YgY29lZmZpY2llbnRzIHdpdGhvdXQga25vd2luZyB0aGUgcHJvYmFiaWxpdGllcyB5ZXQKK2ludCBWUDhSZWNvcmRDb2VmZlRva2Vucyhjb25zdCBpbnQgY3R4LCBjb25zdCBpbnQgY29lZmZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3QsIGludCBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhUQnVmZmVyKiBjb25zdCB0b2tlbnMpOworCisvLyBFc3RpbWF0ZSB0aGUgZmluYWwgY29kZWQgc2l6ZSBnaXZlbiBhIHNldCBvZiAncHJvYmFzJy4KK3NpemVfdCBWUDhFc3RpbWF0ZVRva2VuU2l6ZShWUDhUQnVmZmVyKiBjb25zdCBiLCBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMpOworCisvLyB1bnVzZWQgZm9yIG5vdwordm9pZCBWUDhUb2tlblRvU3RhdHMoY29uc3QgVlA4VEJ1ZmZlciogY29uc3QgYiwgcHJvYmFfdCogY29uc3Qgc3RhdHMpOworCisjZW5kaWYgIC8vICFESVNBQkxFX1RPS0VOX0JVRkZFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4RW5jb2RlcgorCitzdHJ1Y3QgVlA4RW5jb2RlciB7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZ187ICAgIC8vIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcGFyYW1ldGVycworICBXZWJQUGljdHVyZSogcGljXzsgICAgICAgICAgICAvLyBpbnB1dCAvIG91dHB1dCBwaWN0dXJlCisKKyAgLy8gaGVhZGVycworICBWUDhFbmNGaWx0ZXJIZWFkZXIgICBmaWx0ZXJfaGRyXzsgICAgIC8vIGZpbHRlcmluZyBpbmZvcm1hdGlvbgorICBWUDhFbmNTZWdtZW50SGVhZGVyICBzZWdtZW50X2hkcl87ICAgIC8vIHNlZ21lbnQgaW5mb3JtYXRpb24KKworICBpbnQgcHJvZmlsZV87ICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOCdzIHByb2ZpbGUsIGRlZHVjZWQgZnJvbSBDb25maWcuCisKKyAgLy8gZGltZW5zaW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzLgorICBpbnQgbWJfd18sIG1iX2hfOworICBpbnQgcHJlZHNfd187ICAgLy8gc3RyaWRlIG9mIHRoZSAqcHJlZHNfIHByZWRpY3Rpb24gcGxhbmUgKD00Km1iX3cgKyAxKQorCisgIC8vIG51bWJlciBvZiBwYXJ0aXRpb25zICgxLCAyLCA0IG9yIDggPSBNQVhfTlVNX1BBUlRJVElPTlMpCisgIGludCBudW1fcGFydHNfOworCisgIC8vIHBlci1wYXJ0aXRpb24gYm9vbGVhbiBkZWNvZGVycy4KKyAgVlA4Qml0V3JpdGVyIGJ3XzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFydDAKKyAgVlA4Qml0V3JpdGVyIHBhcnRzX1tNQVhfTlVNX1BBUlRJVElPTlNdOyAgLy8gdG9rZW4gcGFydGl0aW9ucworICBWUDhUQnVmZmVyIHRva2Vuc187ICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2tlbiBidWZmZXIKKworICBpbnQgcGVyY2VudF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcHJvZ3Jlc3MKKworICAvLyB0cmFuc3BhcmVuY3kgYmxvYgorICBpbnQgaGFzX2FscGhhXzsKKyAgdWludDhfdCogYWxwaGFfZGF0YV87ICAgICAgIC8vIG5vbi1OVUxMIGlmIHRyYW5zcGFyZW5jeSBpcyBwcmVzZW50CisgIHVpbnQzMl90IGFscGhhX2RhdGFfc2l6ZV87CisgIFdlYlBXb3JrZXIgYWxwaGFfd29ya2VyXzsKKworICAvLyBxdWFudGl6YXRpb24gaW5mbyAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKKyAgVlA4U2VnbWVudEluZm8gZHFtX1tOVU1fTUJfU0VHTUVOVFNdOworICBpbnQgYmFzZV9xdWFudF87ICAgICAgICAgICAgICAgICAvLyBub21pbmFsIHF1YW50aXplciB2YWx1ZS4gT25seSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciByZWxhdGl2ZSBjb2Rpbmcgb2Ygc2VnbWVudHMnIHF1YW50LgorICBpbnQgYWxwaGFfOyAgICAgICAgICAgICAgICAgICAgICAvLyBnbG9iYWwgc3VzY2VwdGliaWxpdHkgKDw9PiBjb21wbGV4aXR5KQorICBpbnQgdXZfYWxwaGFfOyAgICAgICAgICAgICAgICAgICAvLyBVL1YgcXVhbnRpemF0aW9uIHN1c2NlcHRpYmlsaXR5CisgIC8vIGdsb2JhbCBvZmZzZXQgb2YgcXVhbnRpemVycywgc2hhcmVkIGJ5IGFsbCBzZWdtZW50cworICBpbnQgZHFfeTFfZGNfOworICBpbnQgZHFfeTJfZGNfLCBkcV95Ml9hY187CisgIGludCBkcV91dl9kY18sIGRxX3V2X2FjXzsKKworICAvLyBwcm9iYWJpbGl0aWVzIGFuZCBzdGF0aXN0aWNzCisgIFZQOEVuY1Byb2JhIHByb2JhXzsKKyAgdWludDY0X3QgICAgc3NlX1s0XTsgICAgICAvLyBzdW0gb2YgWS9VL1YvQSBzcXVhcmVkIGVycm9ycyBmb3IgYWxsIG1hY3JvYmxvY2tzCisgIHVpbnQ2NF90ICAgIHNzZV9jb3VudF87ICAgLy8gcGl4ZWwgY291bnQgZm9yIHRoZSBzc2VfW10gc3RhdHMKKyAgaW50ICAgICAgICAgY29kZWRfc2l6ZV87CisgIGludCAgICAgICAgIHJlc2lkdWFsX2J5dGVzX1szXVs0XTsKKyAgaW50ICAgICAgICAgYmxvY2tfY291bnRfWzNdOworCisgIC8vIHF1YWxpdHkvc3BlZWQgc2V0dGluZ3MKKyAgaW50IG1ldGhvZF87ICAgICAgICAgICAgICAgLy8gMD1mYXN0ZXN0LCA2PWJlc3Qvc2xvd2VzdC4KKyAgVlA4UkRMZXZlbCByZF9vcHRfbGV2ZWxfOyAgLy8gRGVkdWNlZCBmcm9tIG1ldGhvZF8uCisgIGludCBtYXhfaTRfaGVhZGVyX2JpdHNfOyAgIC8vIHBhcnRpdGlvbiAjMCBzYWZlbmVzcyBmYWN0b3IKKyAgaW50IG1iX2hlYWRlcl9saW1pdF87ICAgICAgLy8gcm91Z2ggbGltaXQgZm9yIGhlYWRlciBiaXRzIHBlciBNQgorICBpbnQgdGhyZWFkX2xldmVsXzsgICAgICAgICAvLyBkZXJpdmVkIGZyb20gY29uZmlnLT50aHJlYWRfbGV2ZWwKKyAgaW50IGRvX3NlYXJjaF87ICAgICAgICAgICAgLy8gZGVyaXZlZCBmcm9tIGNvbmZpZy0+dGFyZ2V0X1hYWAorICBpbnQgdXNlX3Rva2Vuc187ICAgICAgICAgICAvLyBpZiB0cnVlLCB1c2UgdG9rZW4gYnVmZmVyCisKKyAgLy8gTWVtb3J5CisgIFZQOE1CSW5mbyogbWJfaW5mb187ICAgLy8gY29udGV4dHVhbCBtYWNyb2Jsb2NrIGluZm9zIChtYl93XyArIDEpCisgIHVpbnQ4X3QqICAgcHJlZHNfOyAgICAgLy8gcHJlZGljdGlvbnMgbW9kZXM6ICg0Km1iX3crMSkgKiAoNCptYl9oKzEpCisgIHVpbnQzMl90KiAgbnpfOyAgICAgICAgLy8gbm9uLXplcm8gYml0IGNvbnRleHQ6IG1iX3crMQorICB1aW50OF90KiAgIHlfdG9wXzsgICAgIC8vIHRvcCBsdW1hIHNhbXBsZXMuCisgIHVpbnQ4X3QqICAgdXZfdG9wXzsgICAgLy8gdG9wIHUvdiBzYW1wbGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFUgYW5kIFYgYXJlIHBhY2tlZCBpbnRvIDE2IGJ5dGVzICg4IFUgKyA4IFYpCisgIExGU3RhdHMqICAgbGZfc3RhdHNfOyAgLy8gYXV0b2ZpbHRlciBzdGF0cyAoaWYgTlVMTCwgYXV0b2ZpbHRlciBpcyBvZmYpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisgIC8vIGluIHRyZWUuYworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKK2V4dGVybiBjb25zdCB1aW50OF90CisgICAgVlA4Q29lZmZzVXBkYXRlUHJvYmFbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdOworLy8gUmVzZXQgdGhlIHRva2VuIHByb2JhYmlsaXRpZXMgdG8gdGhlaXIgaW5pdGlhbCAoZGVmYXVsdCkgdmFsdWVzCit2b2lkIFZQOERlZmF1bHRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKKy8vIFdyaXRlIHRoZSB0b2tlbiBwcm9iYWJpbGl0aWVzCit2b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMpOworLy8gV3JpdGVzIHRoZSBwYXJ0aXRpb24gIzAgbW9kZXMgKHRoYXQgaXM6IGFsbCBpbnRyYSBtb2RlcykKK3ZvaWQgVlA4Q29kZUludHJhTW9kZXMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKKworICAvLyBpbiBzeW50YXguYworLy8gR2VuZXJhdGVzIHRoZSBmaW5hbCBiaXRzdHJlYW0gYnkgY29kaW5nIHRoZSBwYXJ0aXRpb24wIGFuZCBoZWFkZXJzLAorLy8gYW5kIGFwcGVuZGluZyBhbiBhc3NlbWJseSBvZiBhbGwgdGhlIHByZS1jb2RlZCB0b2tlbiBwYXJ0aXRpb25zLgorLy8gUmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyBpcyBvay4KK2ludCBWUDhFbmNXcml0ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOworLy8gUmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBiaXQtd3JpdGluZyBpbiBWUDhFbmNMb29wICYgc2VxLgordm9pZCBWUDhFbmNGcmVlQml0V3JpdGVycyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpOworCisgIC8vIGluIGZyYW1lLmMKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDRbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDVbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOENhdDZbXTsKKworLy8gRm9ybSBhbGwgdGhlIGZvdXIgSW50cmExNngxNiBwcmVkaWN0aW9ucyBpbiB0aGUgeXV2X3BfIGNhY2hlCit2b2lkIFZQOE1ha2VMdW1hMTZQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gRm9ybSBhbGwgdGhlIGZvdXIgQ2hyb21hOHg4IHByZWRpY3Rpb25zIGluIHRoZSB5dXZfcF8gY2FjaGUKK3ZvaWQgVlA4TWFrZUNocm9tYThQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gRm9ybSBhbGwgdGhlIHRlbiBJbnRyYTR4NCBwcmVkaWN0aW9ucyBpbiB0aGUgeXV2X3BfIGNhY2hlCisvLyBmb3IgdGhlIDR4NCBibG9jayBpdC0+aTRfCit2b2lkIFZQOE1ha2VJbnRyYTRQcmVkcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gUmF0ZSBjYWxjdWxhdGlvbgoraW50IFZQOEdldENvc3RMdW1hMTYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKTsKK2ludCBWUDhHZXRDb3N0THVtYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBpbnQxNl90IGxldmVsc1sxNl0pOworaW50IFZQOEdldENvc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpOworLy8gTWFpbiBjb2RpbmcgY2FsbHMKK2ludCBWUDhFbmNMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CitpbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CisKKyAgLy8gaW4gd2VicGVuYy5jCisvLyBBc3NpZ24gYW4gZXJyb3IgY29kZSB0byBhIHBpY3R1cmUuIFJldHVybiBmYWxzZSBmb3IgY29udmVuaWVuY2UuCitpbnQgV2ViUEVuY29kaW5nU2V0RXJyb3IoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3IpOworaW50IFdlYlBSZXBvcnRQcm9ncmVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudCwgaW50KiBjb25zdCBwZXJjZW50X3N0b3JlKTsKKworICAvLyBpbiBhbmFseXNpcy5jCisvLyBNYWluIGFuYWx5c2lzIGxvb3AuIERlY2lkZXMgdGhlIHNlZ21lbnRhdGlvbnMgYW5kIGNvbXBsZXhpdHkuCisvLyBBc3NpZ25zIGEgZmlyc3QgZ3Vlc3MgZm9yIEludHJhMTYgYW5kIHV2bW9kZV8gcHJlZGljdGlvbiBtb2Rlcy4KK2ludCBWUDhFbmNBbmFseXplKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CisKKyAgLy8gaW4gcXVhbnQuYworLy8gU2V0cyB1cCBzZWdtZW50J3MgcXVhbnRpemF0aW9uIHZhbHVlcywgYmFzZV9xdWFudF8gYW5kIGZpbHRlciBzdHJlbmd0aHMuCit2b2lkIFZQOFNldFNlZ21lbnRQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxdWFsaXR5KTsKKy8vIFBpY2sgYmVzdCBtb2RlcyBhbmQgZmlsbHMgdGhlIGxldmVscy4gUmV0dXJucyB0cnVlIGlmIHNraXBwZWQuCitpbnQgVlA4RGVjaW1hdGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgIFZQOFJETGV2ZWwgcmRfb3B0KTsKKworICAvLyBpbiBhbHBoYS5jCit2b2lkIFZQOEVuY0luaXRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBpbml0aWFsaXplIGFscGhhIGNvbXByZXNzaW9uCitpbnQgVlA4RW5jU3RhcnRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBzdGFydCBhbHBoYSBjb2RpbmcgcHJvY2VzcworaW50IFZQOEVuY0ZpbmlzaEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgLy8gZmluYWxpemUgY29tcHJlc3NlZCBkYXRhCitpbnQgVlA4RW5jRGVsZXRlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKTsgICAvLyBkZWxldGUgY29tcHJlc3NlZCBkYXRhCisKKyAgLy8gaW4gZmlsdGVyLmMKK3ZvaWQgVlA4U1NJTUFkZFN0YXRzKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHNyYywgVlA4RGlzdG9TdGF0cyogY29uc3QgZHN0KTsKK3ZvaWQgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVywgaW50IEgsIFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKK2RvdWJsZSBWUDhTU0lNR2V0KGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKK2RvdWJsZSBWUDhTU0lNR2V0U3F1YXJlZEVycm9yKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKKworLy8gYXV0b2ZpbHRlcgordm9pZCBWUDhJbml0RmlsdGVyKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Cit2b2lkIFZQOFN0b3JlRmlsdGVyU3RhdHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKK3ZvaWQgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKKworLy8gcmV0dXJucyB0aGUgYXBwcm94aW1hdGUgZmlsdGVyaW5nIHN0cmVuZ3RoIG5lZWRlZCB0byBzbW9vdGggYSBlZGdlCisvLyBzdGVwIG9mICdkZWx0YScsIGdpdmVuIGEgc2hhcnBuZXNzIHBhcmFtZXRlciAnc2hhcnBuZXNzJy4KK2ludCBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShpbnQgc2hhcnBuZXNzLCBpbnQgZGVsdGEpOworCisgIC8vIG1pc2MgdXRpbHMgZm9yIHBpY3R1cmVfKi5jOgorCisvLyBSZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBBUkdCL1lVVkEgYnVmZmVyIChkb2Vzbid0IGZyZWUgYW55dGhpbmcpLgordm9pZCBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7CisKKy8vIEFsbG9jYXRlcyBBUkdCIGJ1ZmZlciBvZiBnaXZlbiBkaW1lbnNpb24gKHByZXZpb3VzIG9uZSBpcyBhbHdheXMgZnJlZSdkKS4KKy8vIFByZXNlcnZlcyB0aGUgWVVWKEEpIGJ1ZmZlci4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHBhcmFtLAorLy8gb3V0LW9mLW1lbW9yeSkuCitpbnQgV2ViUFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIEFsbG9jYXRlcyBZVVZBIGJ1ZmZlciBvZiBnaXZlbiBkaW1lbnNpb24gKHByZXZpb3VzIG9uZSBpcyBhbHdheXMgZnJlZSdkKS4KKy8vIFVzZXMgcGljdHVyZS0+Y3NwIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFscGhhIGJ1ZmZlciBpcyBuZWVkZWQuCisvLyBQcmVzZXJ2ZXMgdGhlIEFSR0IgYnVmZmVyLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHBhcmFtLCBvdXQtb2YtbWVtb3J5KS4KK2ludCBXZWJQUGljdHVyZUFsbG9jWVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8gQ2xlYW4tdXAgdGhlIFJHQiBzYW1wbGVzIHVuZGVyIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEsIHRvIGhlbHAgbG9zc2xlc3MKKy8vIGNvbXByZXNzaWJpbGl0eSAobm8gZ3VhcmFudGVlLCB0aG91Z2gpLiBBc3N1bWVzIHRoYXQgcGljLT51c2VfYXJnYiBpcyB0cnVlLgordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYUxvc3NsZXNzKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpOworCisgIC8vIGluIG5lYXJfbG9zc2xlc3MuYworLy8gTmVhciBsb3NzbGVzcyBwcmVwcm9jZXNzaW5nIGluIFJHQiBjb2xvci1zcGFjZS4KK2ludCBWUDhBcHBseU5lYXJMb3NzbGVzcyhpbnQgeHNpemUsIGludCB5c2l6ZSwgdWludDMyX3QqIGFyZ2IsIGludCBxdWFsaXR5KTsKKy8vIE5lYXIgbG9zc2xlc3MgYWRqdXN0bWVudCBmb3IgcHJlZGljdG9ycy4KK3ZvaWQgVlA4QXBwbHlOZWFyTG9zc2xlc3NQcmVkaWN0KGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgcHJlZF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGFyZ2Jfb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiLCB1aW50MzJfdCogYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRyYW5zZm9ybV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBzdWJ0cmFjdF9ncmVlbik7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9FTkNfVlA4RU5DSV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGwuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiOGNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhsLmMKQEAgLTAsMCArMSwxNjAzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbWFpbiBlbnRyeSBmb3IgdGhlIGxvc3NsZXNzIGVuY29kZXIuCisvLworLy8gQXV0aG9yOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKy8vCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhlbmNpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4bGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2RlbHRhX3BhbGV0dGl6YXRpb24uaCIKKworI2RlZmluZSBQQUxFVFRFX0tFWV9SSUdIVF9TSElGVCAgIDIyICAvLyBLZXkgZm9yIDFLIGJ1ZmZlci4KKy8vIE1heGltdW0gbnVtYmVyIG9mIGhpc3RvZ3JhbSBpbWFnZXMgKHN1Yi1ibG9ja3MpLgorI2RlZmluZSBNQVhfSFVGRl9JTUFHRV9TSVpFICAgICAgIDI2MDAKKworLy8gUGFsZXR0ZSByZW9yZGVyaW5nIGZvciBzbWFsbGVyIHN1bSBvZiBkZWx0YXMgKGFuZCBmb3Igc21hbGxlciBzdG9yYWdlKS4KKworc3RhdGljIGludCBQYWxldHRlQ29tcGFyZUNvbG9yc0ZvclFzb3J0KGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICBjb25zdCB1aW50MzJfdCBhID0gV2ViUE1lbVRvVWludDMyKHAxKTsKKyAgY29uc3QgdWludDMyX3QgYiA9IFdlYlBNZW1Ub1VpbnQzMihwMik7CisgIGFzc2VydChhICE9IGIpOworICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSh1aW50MzJfdCB2KSB7CisgIHJldHVybiAodiA8PSAxMjgpID8gdiA6ICgyNTYgLSB2KTsKK30KKworLy8gQ29tcHV0ZXMgYSB2YWx1ZSB0aGF0IGlzIHJlbGF0ZWQgdG8gdGhlIGVudHJvcHkgY3JlYXRlZCBieSB0aGUKKy8vIHBhbGV0dGUgZW50cnkgZGlmZi4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGxhc3QgJiAweGZmIGlzIGEgbm8tb3BlcmF0aW9uIGluIHRoZSBuZXh0IHN0YXRlbWVudCwgYnV0CisvLyByZW1vdmVkIGJ5IG1vc3QgY29tcGlsZXJzIGFuZCBpcyBoZXJlIG9ubHkgZm9yIHJlZ3VsYXJpdHkgb2YgdGhlIGNvZGUuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGFsZXR0ZUNvbG9yRGlzdGFuY2UodWludDMyX3QgY29sMSwgdWludDMyX3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCBkaWZmID0gVlA4TFN1YlBpeGVscyhjb2wxLCBjb2wyKTsKKyAgY29uc3QgaW50IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhID0gOTsKKyAgdWludDMyX3Qgc2NvcmU7CisgIHNjb3JlID0gIFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSgoZGlmZiA+PiAgMCkgJiAweGZmKTsKKyAgc2NvcmUgKz0gUGFsZXR0ZUNvbXBvbmVudERpc3RhbmNlKChkaWZmID4+ICA4KSAmIDB4ZmYpOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMTYpICYgMHhmZik7CisgIHNjb3JlICo9IGtNb3JlV2VpZ2h0Rm9yUkdCVGhhbkZvckFscGhhOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gMjQpICYgMHhmZik7CisgIHJldHVybiBzY29yZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3dhcENvbG9yKHVpbnQzMl90KiBjb25zdCBjb2wxLCB1aW50MzJfdCogY29uc3QgY29sMikgeworICBjb25zdCB1aW50MzJfdCB0bXAgPSAqY29sMTsKKyAgKmNvbDEgPSAqY29sMjsKKyAgKmNvbDIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIEdyZWVkeU1pbmltaXplRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgLy8gRmluZCBncmVlZGlseSBhbHdheXMgdGhlIGNsb3Nlc3QgY29sb3Igb2YgdGhlIHByZWRpY3RlZCBjb2xvciB0byBtaW5pbWl6ZQorICAvLyBkZWx0YXMgaW4gdGhlIHBhbGV0dGUuIFRoaXMgcmVkdWNlcyBzdG9yYWdlIG5lZWRzIHNpbmNlIHRoZQorICAvLyBwYWxldHRlIGlzIHN0b3JlZCB3aXRoIGRlbHRhIGVuY29kaW5nLgorICB1aW50MzJfdCBwcmVkaWN0ID0gMHgwMDAwMDAwMDsKKyAgaW50IGksIGs7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyArK2kpIHsKKyAgICBpbnQgYmVzdF9peCA9IGk7CisgICAgdWludDMyX3QgYmVzdF9zY29yZSA9IH4wVTsKKyAgICBmb3IgKGsgPSBpOyBrIDwgbnVtX2NvbG9yczsgKytrKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBjdXJfc2NvcmUgPSBQYWxldHRlQ29sb3JEaXN0YW5jZShwYWxldHRlW2tdLCBwcmVkaWN0KTsKKyAgICAgIGlmIChiZXN0X3Njb3JlID4gY3VyX3Njb3JlKSB7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBjdXJfc2NvcmU7CisgICAgICAgIGJlc3RfaXggPSBrOworICAgICAgfQorICAgIH0KKyAgICBTd2FwQ29sb3IoJnBhbGV0dGVbYmVzdF9peF0sICZwYWxldHRlW2ldKTsKKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorfQorCisvLyBUaGUgcGFsZXR0ZSBoYXMgYmVlbiBzb3J0ZWQgYnkgYWxwaGEuIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBvdGhlcgorLy8gY29tcG9uZW50cyBvZiB0aGUgcGFsZXR0ZSBoYXZlIGEgbW9ub3RvbmljIGRldmVsb3BtZW50IHdpdGggcmVnYXJkcyB0bworLy8gcG9zaXRpb24gaW4gdGhlIHBhbGV0dGUuIElmIGFsbCBoYXZlIG1vbm90b25pYyBkZXZlbG9wbWVudCwgdGhlcmUgaXMKKy8vIG5vIGJlbmVmaXQgdG8gcmUtb3JnYW5pemUgdGhlbSBncmVlZGlseS4gQSBtb25vdG9uaWMgZGV2ZWxvcG1lbnQKKy8vIHdvdWxkIGJlIHNwb3R0ZWQgaW4gZ3JlZW4tb25seSBzaXR1YXRpb25zIChsaWtlIGxvc3N5IGFscGhhKSBvciBncmF5LXNjYWxlCisvLyBpbWFnZXMuCitzdGF0aWMgaW50IFBhbGV0dGVIYXNOb25Nb25vdG9ub3VzRGVsdGFzKHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMpIHsKKyAgdWludDMyX3QgcHJlZGljdCA9IDB4MDAwMDAwOworICBpbnQgaTsKKyAgdWludDhfdCBzaWduX2ZvdW5kID0gMHgwMDsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHByZWRpY3QpOworICAgIGNvbnN0IHVpbnQ4X3QgcmQgPSAoZGlmZiA+PiAxNikgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgZ2QgPSAoZGlmZiA+PiAgOCkgJiAweGZmOworICAgIGNvbnN0IHVpbnQ4X3QgYmQgPSAoZGlmZiA+PiAgMCkgJiAweGZmOworICAgIGlmIChyZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChyZCA8IDB4ODApID8gMSA6IDI7CisgICAgfQorICAgIGlmIChnZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChnZCA8IDB4ODApID8gOCA6IDE2OworICAgIH0KKyAgICBpZiAoYmQgIT0gMHgwMCkgeworICAgICAgc2lnbl9mb3VuZCB8PSAoYmQgPCAweDgwKSA/IDY0IDogMTI4OworICAgIH0KKyAgICBwcmVkaWN0ID0gcGFsZXR0ZVtpXTsKKyAgfQorICByZXR1cm4gKHNpZ25fZm91bmQgJiAoc2lnbl9mb3VuZCA8PCAxKSkgIT0gMDsgIC8vIHR3byBjb25zZXF1ZW50IHNpZ25zLgorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFsZXR0ZQorCisvLyBJZiBudW1iZXIgb2YgY29sb3JzIGluIHRoZSBpbWFnZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTUFYX1BBTEVUVEVfU0laRSwKKy8vIGNyZWF0ZXMgYSBwYWxldHRlIGFuZCByZXR1cm5zIHRydWUsIGVsc2UgcmV0dXJucyBmYWxzZS4KK3N0YXRpYyBpbnQgQW5hbHl6ZUFuZENyZWF0ZVBhbGV0dGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcGFsZXR0ZV9zaXplKSB7CisgIGNvbnN0IGludCBudW1fY29sb3JzID0gV2ViUEdldENvbG9yUGFsZXR0ZShwaWMsIHBhbGV0dGUpOworICBpZiAobnVtX2NvbG9ycyA+IE1BWF9QQUxFVFRFX1NJWkUpIHJldHVybiAwOworICAqcGFsZXR0ZV9zaXplID0gbnVtX2NvbG9yczsKKyAgcXNvcnQocGFsZXR0ZSwgbnVtX2NvbG9ycywgc2l6ZW9mKCpwYWxldHRlKSwgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydCk7CisgIGlmICghbG93X2VmZm9ydCAmJiBQYWxldHRlSGFzTm9uTW9ub3Rvbm91c0RlbHRhcyhwYWxldHRlLCBudW1fY29sb3JzKSkgeworICAgIEdyZWVkeU1pbmltaXplRGVsdGFzKHBhbGV0dGUsIG51bV9jb2xvcnMpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBUaGVzZSBmaXZlIG1vZGVzIGFyZSBldmFsdWF0ZWQgYW5kIHRoZWlyIHJlc3BlY3RpdmUgZW50cm9weSBpcyBjb21wdXRlZC4KK3R5cGVkZWYgZW51bSB7CisgIGtEaXJlY3QgPSAwLAorICBrU3BhdGlhbCA9IDEsCisgIGtTdWJHcmVlbiA9IDIsCisgIGtTcGF0aWFsU3ViR3JlZW4gPSAzLAorICBrUGFsZXR0ZSA9IDQsCisgIGtOdW1FbnRyb3B5SXggPSA1Cit9IEVudHJvcHlJeDsKKwordHlwZWRlZiBlbnVtIHsKKyAga0hpc3RvQWxwaGEgPSAwLAorICBrSGlzdG9BbHBoYVByZWQsCisgIGtIaXN0b0dyZWVuLAorICBrSGlzdG9HcmVlblByZWQsCisgIGtIaXN0b1JlZCwKKyAga0hpc3RvUmVkUHJlZCwKKyAga0hpc3RvQmx1ZSwKKyAga0hpc3RvQmx1ZVByZWQsCisgIGtIaXN0b1JlZFN1YkdyZWVuLAorICBrSGlzdG9SZWRQcmVkU3ViR3JlZW4sCisgIGtIaXN0b0JsdWVTdWJHcmVlbiwKKyAga0hpc3RvQmx1ZVByZWRTdWJHcmVlbiwKKyAga0hpc3RvUGFsZXR0ZSwKKyAga0hpc3RvVG90YWwgIC8vIE11c3QgYmUgbGFzdC4KK30gSGlzdG9JeDsKKworc3RhdGljIHZvaWQgQWRkU2luZ2xlU3ViR3JlZW4odWludDMyX3QgcCwgdWludDMyX3QqIHIsIHVpbnQzMl90KiBiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gcCA+PiA4OyAgLy8gVGhlIHVwcGVyIGJpdHMgYXJlIG1hc2tlZCBhd2F5IGxhdGVyLgorICArK3JbKChwID4+IDE2KSAtIGdyZWVuKSAmIDB4ZmZdOworICArK2JbKHAgLSBncmVlbikgJiAweGZmXTsKK30KKworc3RhdGljIHZvaWQgQWRkU2luZ2xlKHVpbnQzMl90IHAsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGEsIHVpbnQzMl90KiByLCB1aW50MzJfdCogZywgdWludDMyX3QqIGIpIHsKKyAgKythW3AgPj4gMjRdOworICArK3JbKHAgPj4gMTYpICYgMHhmZl07CisgICsrZ1socCA+PiA4KSAmIDB4ZmZdOworICArK2JbKHAgJiAweGZmKV07Cit9CisKK3N0YXRpYyBpbnQgQW5hbHl6ZUVudHJvcHkoY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX3BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJvcHlJeCogY29uc3QgbWluX2VudHJvcHlfaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSB7CisgIC8vIEFsbG9jYXRlIGhpc3RvZ3JhbSBzZXQgd2l0aCBjYWNoZV9iaXRzID0gMC4KKyAgdWludDMyX3QqIGNvbnN0IGhpc3RvID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVDYWxsb2Moa0hpc3RvVG90YWwsIHNpemVvZigqaGlzdG8pICogMjU2KTsKKyAgaWYgKGhpc3RvICE9IE5VTEwpIHsKKyAgICBpbnQgaSwgeCwgeTsKKyAgICBjb25zdCB1aW50MzJfdCogcHJldl9yb3cgPSBhcmdiOworICAgIGNvbnN0IHVpbnQzMl90KiBjdXJyX3JvdyA9IGFyZ2IgKyBhcmdiX3N0cmlkZTsKKyAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIHVpbnQzMl90IHByZXZfcGl4ID0gY3Vycl9yb3dbMF07CisgICAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXggPSBjdXJyX3Jvd1t4XTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X2RpZmYgPSBWUDhMU3ViUGl4ZWxzKHBpeCwgcHJldl9waXgpOworICAgICAgICBpZiAoKHBpeF9kaWZmID09IDApIHx8IChwaXggPT0gcHJldl9yb3dbeF0pKSBjb250aW51ZTsKKyAgICAgICAgcHJldl9waXggPSBwaXg7CisgICAgICAgIEFkZFNpbmdsZShwaXgsCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQWxwaGEgKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b1JlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0JsdWUgKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlKHBpeF9kaWZmLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0FscGhhUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvUmVkUHJlZCAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvR3JlZW5QcmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlUHJlZCAqIDI1Nl0pOworICAgICAgICBBZGRTaW5nbGVTdWJHcmVlbihwaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRTdWJHcmVlbiAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlU3ViR3JlZW4gKiAyNTZdKTsKKyAgICAgICAgQWRkU2luZ2xlU3ViR3JlZW4ocGl4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRQcmVkU3ViR3JlZW4gKiAyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQmx1ZVByZWRTdWJHcmVlbiAqIDI1Nl0pOworICAgICAgICB7CisgICAgICAgICAgLy8gQXBwcm94aW1hdGUgdGhlIHBhbGV0dGUgYnkgdGhlIGVudHJvcHkgb2YgdGhlIG11bHRpcGxpY2F0aXZlIGhhc2guCisgICAgICAgICAgY29uc3QgaW50IGhhc2ggPSAoKHBpeCArIChwaXggPj4gMTkpKSAqIDB4MzljNWZiYTcpID4+IDI0OworICAgICAgICAgICsraGlzdG9ba0hpc3RvUGFsZXR0ZSAqIDI1NiArIChoYXNoICYgMHhmZildOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcmV2X3JvdyA9IGN1cnJfcm93OworICAgICAgY3Vycl9yb3cgKz0gYXJnYl9zdHJpZGU7CisgICAgfQorICAgIHsKKyAgICAgIGRvdWJsZSBlbnRyb3B5X2NvbXBba0hpc3RvVG90YWxdOworICAgICAgZG91YmxlIGVudHJvcHlba051bUVudHJvcHlJeF07CisgICAgICBFbnRyb3B5SXggazsKKyAgICAgIEVudHJvcHlJeCBsYXN0X21vZGVfdG9fYW5hbHl6ZSA9CisgICAgICAgICAgdXNlX3BhbGV0dGUgPyBrUGFsZXR0ZSA6IGtTcGF0aWFsU3ViR3JlZW47CisgICAgICBpbnQgajsKKyAgICAgIC8vIExldCdzIGFkZCBvbmUgemVybyB0byB0aGUgcHJlZGljdGVkIGhpc3RvZ3JhbXMuIFRoZSB6ZXJvcyBhcmUgcmVtb3ZlZAorICAgICAgLy8gdG9vIGVmZmljaWVudGx5IGJ5IHRoZSBwaXhfZGlmZiA9PSAwIGNvbXBhcmlzb24sIGF0IGxlYXN0IG9uZSBvZiB0aGUKKyAgICAgIC8vIHplcm9zIGlzIGxpa2VseSB0byBleGlzdC4KKyAgICAgICsraGlzdG9ba0hpc3RvUmVkUHJlZFN1YkdyZWVuICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvQmx1ZVByZWRTdWJHcmVlbiAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b1JlZFByZWQgKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9HcmVlblByZWQgKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9CbHVlUHJlZCAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0FscGhhUHJlZCAqIDI1Nl07CisKKyAgICAgIGZvciAoaiA9IDA7IGogPCBrSGlzdG9Ub3RhbDsgKytqKSB7CisgICAgICAgIGVudHJvcHlfY29tcFtqXSA9IFZQOExCaXRzRW50cm9weSgmaGlzdG9baiAqIDI1Nl0sIDI1NiwgTlVMTCk7CisgICAgICB9CisgICAgICBlbnRyb3B5W2tEaXJlY3RdID0gZW50cm9weV9jb21wW2tIaXN0b0FscGhhXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b1JlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9HcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlXTsKKyAgICAgIGVudHJvcHlba1NwYXRpYWxdID0gZW50cm9weV9jb21wW2tIaXN0b0FscGhhUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9SZWRQcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9CbHVlUHJlZF07CisgICAgICBlbnRyb3B5W2tTdWJHcmVlbl0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkU3ViR3JlZW5dICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvR3JlZW5dICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvQmx1ZVN1YkdyZWVuXTsKKyAgICAgIGVudHJvcHlba1NwYXRpYWxTdWJHcmVlbl0gPSBlbnRyb3B5X2NvbXBba0hpc3RvQWxwaGFQcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b1JlZFByZWRTdWJHcmVlbl0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9HcmVlblByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvQmx1ZVByZWRTdWJHcmVlbl07CisgICAgICAvLyBQYWxldHRlIG1vZGUgc2VlbXMgbW9yZSBlZmZpY2llbnQgaW4gYSBicmVha2V2ZW4gY2FzZS4gQmlhcyB3aXRoIDEuMC4KKyAgICAgIGVudHJvcHlba1BhbGV0dGVdID0gZW50cm9weV9jb21wW2tIaXN0b1BhbGV0dGVdIC0gMS4wOworCisgICAgICAqbWluX2VudHJvcHlfaXggPSBrRGlyZWN0OworICAgICAgZm9yIChrID0ga0RpcmVjdCArIDE7IGsgPD0gbGFzdF9tb2RlX3RvX2FuYWx5emU7ICsraykgeworICAgICAgICBpZiAoZW50cm9weVsqbWluX2VudHJvcHlfaXhdID4gZW50cm9weVtrXSkgeworICAgICAgICAgICptaW5fZW50cm9weV9peCA9IGs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAxOworICAgICAgLy8gTGV0J3MgY2hlY2sgaWYgdGhlIGhpc3RvZ3JhbSBvZiB0aGUgY2hvc2VuIGVudHJvcHkgbW9kZSBoYXMKKyAgICAgIC8vIG5vbi16ZXJvIHJlZCBhbmQgYmx1ZSB2YWx1ZXMuIElmIGFsbCBhcmUgemVybywgd2UgY2FuIGxhdGVyIHNraXAKKyAgICAgIC8vIHRoZSBjcm9zcyBjb2xvciBvcHRpbWl6YXRpb24uCisgICAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtIaXN0b1BhaXJzWzVdWzJdID0geworICAgICAgICAgIHsga0hpc3RvUmVkLCBrSGlzdG9CbHVlIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWRQcmVkLCBrSGlzdG9CbHVlUHJlZCB9LAorICAgICAgICAgIHsga0hpc3RvUmVkU3ViR3JlZW4sIGtIaXN0b0JsdWVTdWJHcmVlbiB9LAorICAgICAgICAgIHsga0hpc3RvUmVkUHJlZFN1YkdyZWVuLCBrSGlzdG9CbHVlUHJlZFN1YkdyZWVuIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWQsIGtIaXN0b0JsdWUgfQorICAgICAgICB9OworICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgcmVkX2hpc3RvID0KKyAgICAgICAgICAgICZoaXN0b1syNTYgKiBrSGlzdG9QYWlyc1sqbWluX2VudHJvcHlfaXhdWzBdXTsKKyAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGJsdWVfaGlzdG8gPQorICAgICAgICAgICAgJmhpc3RvWzI1NiAqIGtIaXN0b1BhaXJzWyptaW5fZW50cm9weV9peF1bMV1dOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICBpZiAoKHJlZF9oaXN0b1tpXSB8IGJsdWVfaGlzdG9baV0pICE9IDApIHsKKyAgICAgICAgICAgICpyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShoaXN0byk7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworc3RhdGljIGludCBHZXRIaXN0b0JpdHMoaW50IG1ldGhvZCwgaW50IHVzZV9wYWxldHRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgLy8gTWFrZSB0aWxlIHNpemUgYSBmdW5jdGlvbiBvZiBlbmNvZGluZyBtZXRob2QgKFJhbmdlOiAwIHRvIDYpLgorICBpbnQgaGlzdG9fYml0cyA9ICh1c2VfcGFsZXR0ZSA/IDkgOiA3KSAtIG1ldGhvZDsKKyAgd2hpbGUgKDEpIHsKKyAgICBjb25zdCBpbnQgaHVmZl9pbWFnZV9zaXplID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b19iaXRzKTsKKyAgICBpZiAoaHVmZl9pbWFnZV9zaXplIDw9IE1BWF9IVUZGX0lNQUdFX1NJWkUpIGJyZWFrOworICAgICsraGlzdG9fYml0czsKKyAgfQorICByZXR1cm4gKGhpc3RvX2JpdHMgPCBNSU5fSFVGRk1BTl9CSVRTKSA/IE1JTl9IVUZGTUFOX0JJVFMgOgorICAgICAgICAgKGhpc3RvX2JpdHMgPiBNQVhfSFVGRk1BTl9CSVRTKSA/IE1BWF9IVUZGTUFOX0JJVFMgOiBoaXN0b19iaXRzOworfQorCitzdGF0aWMgaW50IEdldFRyYW5zZm9ybUJpdHMoaW50IG1ldGhvZCwgaW50IGhpc3RvX2JpdHMpIHsKKyAgY29uc3QgaW50IG1heF90cmFuc2Zvcm1fYml0cyA9IChtZXRob2QgPCA0KSA/IDYgOiAobWV0aG9kID4gNCkgPyA0IDogNTsKKyAgcmV0dXJuIChoaXN0b19iaXRzID4gbWF4X3RyYW5zZm9ybV9iaXRzKSA/IG1heF90cmFuc2Zvcm1fYml0cyA6IGhpc3RvX2JpdHM7Cit9CisKK3N0YXRpYyBpbnQgQW5hbHl6ZUFuZEluaXQoVlA4TEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGNvbnN0IGludCBwaXhfY250ID0gd2lkdGggKiBoZWlnaHQ7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGNvbmZpZy0+bWV0aG9kOworICBjb25zdCBpbnQgbG93X2VmZm9ydCA9IChjb25maWctPm1ldGhvZCA9PSAwKTsKKyAgLy8gd2Ugcm91bmQgdGhlIGJsb2NrIHNpemUgdXAsIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gaGF2ZQorICAvLyBhdCBtYXggTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFIGJsb2NrcyB1c2VkOgorICBpbnQgcmVmc19ibG9ja19zaXplID0gKHBpeF9jbnQgLSAxKSAvIE1BWF9SRUZTX0JMT0NLX1BFUl9JTUFHRSArIDE7CisgIGFzc2VydChwaWMgIT0gTlVMTCAmJiBwaWMtPmFyZ2IgIT0gTlVMTCk7CisKKyAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gMDsKKyAgZW5jLT51c2VfcHJlZGljdF8gPSAwOworICBlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8gPSAwOworICBlbmMtPnVzZV9wYWxldHRlXyA9CisgICAgICBBbmFseXplQW5kQ3JlYXRlUGFsZXR0ZShwaWMsIGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnBhbGV0dGVfLCAmZW5jLT5wYWxldHRlX3NpemVfKTsKKworICAvLyBUT0RPKGp5cmtpKTogcmVwbGFjZSB0aGUgZGVjaXNpb24gdG8gYmUgYmFzZWQgb24gYW4gYWN0dWFsIGVzdGltYXRlCisgIC8vIG9mIGVudHJvcHksIG9yIGV2ZW4gc3BhdGlhbCB2YXJpYW5jZSBvZiBlbnRyb3B5LgorICBlbmMtPmhpc3RvX2JpdHNfID0gR2V0SGlzdG9CaXRzKG1ldGhvZCwgZW5jLT51c2VfcGFsZXR0ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT53aWR0aCwgcGljLT5oZWlnaHQpOworICBlbmMtPnRyYW5zZm9ybV9iaXRzXyA9IEdldFRyYW5zZm9ybUJpdHMobWV0aG9kLCBlbmMtPmhpc3RvX2JpdHNfKTsKKworICBpZiAobG93X2VmZm9ydCkgeworICAgIC8vIEFuYWx5emVFbnRyb3B5IGlzIHNvbWV3aGF0IHNsb3cuCisgICAgZW5jLT51c2VfcHJlZGljdF8gPSAhZW5jLT51c2VfcGFsZXR0ZV87CisgICAgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fID0gIWVuYy0+dXNlX3BhbGV0dGVfOworICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDA7CisgIH0gZWxzZSB7CisgICAgaW50IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybzsKKyAgICBFbnRyb3B5SXggbWluX2VudHJvcHlfaXg7CisgICAgaWYgKCFBbmFseXplRW50cm9weShwaWMtPmFyZ2IsIHdpZHRoLCBoZWlnaHQsIHBpYy0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnVzZV9wYWxldHRlXywgJm1pbl9lbnRyb3B5X2l4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlZF9hbmRfYmx1ZV9hbHdheXNfemVybykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbmMtPnVzZV9wYWxldHRlXyA9IChtaW5fZW50cm9weV9peCA9PSBrUGFsZXR0ZSk7CisgICAgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fID0KKyAgICAgICAgKG1pbl9lbnRyb3B5X2l4ID09IGtTdWJHcmVlbikgfHwgKG1pbl9lbnRyb3B5X2l4ID09IGtTcGF0aWFsU3ViR3JlZW4pOworICAgIGVuYy0+dXNlX3ByZWRpY3RfID0KKyAgICAgICAgKG1pbl9lbnRyb3B5X2l4ID09IGtTcGF0aWFsKSB8fCAobWluX2VudHJvcHlfaXggPT0ga1NwYXRpYWxTdWJHcmVlbik7CisgICAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID8gMCA6IGVuYy0+dXNlX3ByZWRpY3RfOworICB9CisKKyAgaWYgKCFWUDhMSGFzaENoYWluSW5pdCgmZW5jLT5oYXNoX2NoYWluXywgcGl4X2NudCkpIHJldHVybiAwOworCisgIC8vIHBhbGV0dGUtZnJpZW5kbHkgaW5wdXQgdHlwaWNhbGx5IHVzZXMgbGVzcyBsaXRlcmFscworICAvLyAgLT4gcmVkdWNlIGJsb2NrIHNpemUgYSBiaXQKKyAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSByZWZzX2Jsb2NrX3NpemUgLz0gMjsKKyAgVlA4TEJhY2t3YXJkUmVmc0luaXQoJmVuYy0+cmVmc19bMF0sIHJlZnNfYmxvY2tfc2l6ZSk7CisgIFZQOExCYWNrd2FyZFJlZnNJbml0KCZlbmMtPnJlZnNfWzFdLCByZWZzX2Jsb2NrX3NpemUpOworCisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorc3RhdGljIGludCBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKAorICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvZ3JhbV9pbWFnZSwKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZXMpIHsKKyAgaW50IGksIGs7CisgIGludCBvayA9IDA7CisgIHVpbnQ2NF90IHRvdGFsX2xlbmd0aF9zaXplID0gMDsKKyAgdWludDhfdCogbWVtX2J1ZiA9IE5VTEw7CisgIGNvbnN0IGludCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKKyAgaW50IG1heF9udW1fc3ltYm9scyA9IDA7CisgIHVpbnQ4X3QqIGJ1Zl9ybGUgPSBOVUxMOworICBIdWZmbWFuVHJlZSogaHVmZl90cmVlID0gTlVMTDsKKworICAvLyBJdGVyYXRlIG92ZXIgYWxsIGhpc3RvZ3JhbXMgYW5kIGdldCB0aGUgYWdncmVnYXRlIG51bWJlciBvZiBjb2RlcyB1c2VkLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gaGlzdG9ncmFtX2ltYWdlLT5oaXN0b2dyYW1zW2ldOworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07CisgICAgZm9yIChrID0gMDsgayA8IDU7ICsraykgeworICAgICAgY29uc3QgaW50IG51bV9zeW1ib2xzID0KKyAgICAgICAgICAoayA9PSAwKSA/IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhoaXN0by0+cGFsZXR0ZV9jb2RlX2JpdHNfKSA6CisgICAgICAgICAgKGsgPT0gNCkgPyBOVU1fRElTVEFOQ0VfQ09ERVMgOiAyNTY7CisgICAgICBjb2Rlc1trXS5udW1fc3ltYm9scyA9IG51bV9zeW1ib2xzOworICAgICAgdG90YWxfbGVuZ3RoX3NpemUgKz0gbnVtX3N5bWJvbHM7CisgICAgfQorICB9CisKKyAgLy8gQWxsb2NhdGUgYW5kIFNldCBIdWZmbWFuIGNvZGVzLgorICB7CisgICAgdWludDE2X3QqIGNvZGVzOworICAgIHVpbnQ4X3QqIGxlbmd0aHM7CisgICAgbWVtX2J1ZiA9ICh1aW50OF90KilXZWJQU2FmZUNhbGxvYyh0b3RhbF9sZW5ndGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbGVuZ3RocykgKyBzaXplb2YoKmNvZGVzKSk7CisgICAgaWYgKG1lbV9idWYgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgICBjb2RlcyA9ICh1aW50MTZfdCopbWVtX2J1ZjsKKyAgICBsZW5ndGhzID0gKHVpbnQ4X3QqKSZjb2Rlc1t0b3RhbF9sZW5ndGhfc2l6ZV07CisgICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgICBjb25zdCBpbnQgYml0X2xlbmd0aCA9IGh1ZmZtYW5fY29kZXNbaV0ubnVtX3N5bWJvbHM7CisgICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVzID0gY29kZXM7CisgICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVfbGVuZ3RocyA9IGxlbmd0aHM7CisgICAgICBjb2RlcyArPSBiaXRfbGVuZ3RoOworICAgICAgbGVuZ3RocyArPSBiaXRfbGVuZ3RoOworICAgICAgaWYgKG1heF9udW1fc3ltYm9scyA8IGJpdF9sZW5ndGgpIHsKKyAgICAgICAgbWF4X251bV9zeW1ib2xzID0gYml0X2xlbmd0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBidWZfcmxlID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIG1heF9udW1fc3ltYm9scyk7CisgIGh1ZmZfdHJlZSA9IChIdWZmbWFuVHJlZSopV2ViUFNhZmVNYWxsb2MoM1VMTCAqIG1heF9udW1fc3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh1ZmZfdHJlZSkpOworICBpZiAoYnVmX3JsZSA9PSBOVUxMIHx8IGh1ZmZfdHJlZSA9PSBOVUxMKSBnb3RvIEVuZDsKKworICAvLyBDcmVhdGUgSHVmZm1hbiB0cmVlcy4KKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbNSAqIGldOworICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gaGlzdG9ncmFtX2ltYWdlLT5oaXN0b2dyYW1zW2ldOworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+bGl0ZXJhbF8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgMCk7CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5yZWRfLCAxNSwgYnVmX3JsZSwgaHVmZl90cmVlLCBjb2RlcyArIDEpOworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+Ymx1ZV8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgMik7CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5hbHBoYV8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgMyk7CisgICAgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5kaXN0YW5jZV8sIDE1LCBidWZfcmxlLCBodWZmX3RyZWUsIGNvZGVzICsgNCk7CisgIH0KKyAgb2sgPSAxOworIEVuZDoKKyAgV2ViUFNhZmVGcmVlKGh1ZmZfdHJlZSk7CisgIFdlYlBTYWZlRnJlZShidWZfcmxlKTsKKyAgaWYgKCFvaykgeworICAgIFdlYlBTYWZlRnJlZShtZW1fYnVmKTsKKyAgICBtZW1zZXQoaHVmZm1hbl9jb2RlcywgMCwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplICogc2l6ZW9mKCpodWZmbWFuX2NvZGVzKSk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5UcmVlT2ZIdWZmbWFuVHJlZVRvQml0TWFzaygKKyAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgY29uc3QgdWludDhfdCogY29kZV9sZW5ndGhfYml0ZGVwdGgpIHsKKyAgLy8gUkZDIDE5NTEgd2lsbCBjYWxtIHlvdSBkb3duIGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCB0aGlzIGZ1bm55IHNlcXVlbmNlLgorICAvLyBUaGlzIHNlcXVlbmNlIGlzIHR1bmVkIGZyb20gdGhhdCwgYnV0IG1vcmUgd2VpZ2h0ZWQgZm9yIGxvd2VyIHN5bWJvbCBjb3VudCwKKyAgLy8gYW5kIG1vcmUgc3Bpa2luZyBoaXN0b2dyYW1zLgorICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RvcmFnZU9yZGVyW0NPREVfTEVOR1RIX0NPREVTXSA9IHsKKyAgICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1CisgIH07CisgIGludCBpOworICAvLyBUaHJvdyBhd2F5IHRyYWlsaW5nIHplcm9zOgorICBpbnQgY29kZXNfdG9fc3RvcmUgPSBDT0RFX0xFTkdUSF9DT0RFUzsKKyAgZm9yICg7IGNvZGVzX3RvX3N0b3JlID4gNDsgLS1jb2Rlc190b19zdG9yZSkgeworICAgIGlmIChjb2RlX2xlbmd0aF9iaXRkZXB0aFtrU3RvcmFnZU9yZGVyW2NvZGVzX3RvX3N0b3JlIC0gMV1dICE9IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBWUDhMUHV0Qml0cyhidywgY29kZXNfdG9fc3RvcmUgLSA0LCA0KTsKKyAgZm9yIChpID0gMDsgaSA8IGNvZGVzX3RvX3N0b3JlOyArK2kpIHsKKyAgICBWUDhMUHV0Qml0cyhidywgY29kZV9sZW5ndGhfYml0ZGVwdGhba1N0b3JhZ2VPcmRlcltpXV0sIDMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woCisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKKyAgaW50IGs7CisgIGludCBjb3VudCA9IDA7CisgIGZvciAoayA9IDA7IGsgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzOyArK2spIHsKKyAgICBpZiAoaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNba10gIT0gMCkgeworICAgICAgKytjb3VudDsKKyAgICAgIGlmIChjb3VudCA+IDEpIHJldHVybjsKKyAgICB9CisgIH0KKyAgZm9yIChrID0gMDsgayA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHM7ICsraykgeworICAgIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2tdID0gMDsKKyAgICBodWZmbWFuX2NvZGUtPmNvZGVzW2tdID0gMDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5UcmVlVG9CaXRNYXNrKAorICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHRva2VucywgY29uc3QgaW50IG51bV90b2tlbnMsCisgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKKyAgICBjb25zdCBpbnQgaXggPSB0b2tlbnNbaV0uY29kZTsKKyAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IHRva2Vuc1tpXS5leHRyYV9iaXRzOworICAgIFZQOExQdXRCaXRzKGJ3LCBodWZmbWFuX2NvZGUtPmNvZGVzW2l4XSwgaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNbaXhdKTsKKyAgICBzd2l0Y2ggKGl4KSB7CisgICAgICBjYXNlIDE2OgorICAgICAgICBWUDhMUHV0Qml0cyhidywgZXh0cmFfYml0cywgMik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNzoKKyAgICAgICAgVlA4TFB1dEJpdHMoYncsIGV4dHJhX2JpdHMsIDMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTg6CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBleHRyYV9iaXRzLCA3KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKKy8vICdodWZmX3RyZWUnIGFuZCAndG9rZW5zJyBhcmUgcHJlLWFsbG9hY3RlZCBidWZmZXJzLgorc3RhdGljIHZvaWQgU3RvcmVGdWxsSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgdG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKSB7CisgIHVpbnQ4X3QgY29kZV9sZW5ndGhfYml0ZGVwdGhbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07CisgIHVpbnQxNl90IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHNbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07CisgIGNvbnN0IGludCBtYXhfdG9rZW5zID0gdHJlZS0+bnVtX3N5bWJvbHM7CisgIGludCBudW1fdG9rZW5zOworICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2RlOworICBodWZmbWFuX2NvZGUubnVtX3N5bWJvbHMgPSBDT0RFX0xFTkdUSF9DT0RFUzsKKyAgaHVmZm1hbl9jb2RlLmNvZGVfbGVuZ3RocyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoOworICBodWZmbWFuX2NvZGUuY29kZXMgPSBjb2RlX2xlbmd0aF9iaXRkZXB0aF9zeW1ib2xzOworCisgIFZQOExQdXRCaXRzKGJ3LCAwLCAxKTsKKyAgbnVtX3Rva2VucyA9IFZQOExDcmVhdGVDb21wcmVzc2VkSHVmZm1hblRyZWUodHJlZSwgdG9rZW5zLCBtYXhfdG9rZW5zKTsKKyAgeworICAgIHVpbnQzMl90IGhpc3RvZ3JhbVtDT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKKyAgICB1aW50OF90IGJ1Zl9ybGVbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV90b2tlbnM7ICsraSkgeworICAgICAgKytoaXN0b2dyYW1bdG9rZW5zW2ldLmNvZGVdOworICAgIH0KKworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0b2dyYW0sIDcsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgJmh1ZmZtYW5fY29kZSk7CisgIH0KKworICBTdG9yZUh1ZmZtYW5UcmVlT2ZIdWZmbWFuVHJlZVRvQml0TWFzayhidywgY29kZV9sZW5ndGhfYml0ZGVwdGgpOworICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKCZodWZmbWFuX2NvZGUpOworICB7CisgICAgaW50IHRyYWlsaW5nX3plcm9fYml0cyA9IDA7CisgICAgaW50IHRyaW1tZWRfbGVuZ3RoID0gbnVtX3Rva2VuczsKKyAgICBpbnQgd3JpdGVfdHJpbW1lZF9sZW5ndGg7CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgaSA9IG51bV90b2tlbnM7CisgICAgd2hpbGUgKGktLSA+IDApIHsKKyAgICAgIGNvbnN0IGludCBpeCA9IHRva2Vuc1tpXS5jb2RlOworICAgICAgaWYgKGl4ID09IDAgfHwgaXggPT0gMTcgfHwgaXggPT0gMTgpIHsKKyAgICAgICAgLS10cmltbWVkX2xlbmd0aDsgICAvLyBkaXNjb3VudCB0cmFpbGluZyB6ZXJvcworICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gY29kZV9sZW5ndGhfYml0ZGVwdGhbaXhdOworICAgICAgICBpZiAoaXggPT0gMTcpIHsKKyAgICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChpeCA9PSAxOCkgeworICAgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSA3OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgd3JpdGVfdHJpbW1lZF9sZW5ndGggPSAodHJpbW1lZF9sZW5ndGggPiAxICYmIHRyYWlsaW5nX3plcm9fYml0cyA+IDEyKTsKKyAgICBsZW5ndGggPSB3cml0ZV90cmltbWVkX2xlbmd0aCA/IHRyaW1tZWRfbGVuZ3RoIDogbnVtX3Rva2VuczsKKyAgICBWUDhMUHV0Qml0cyhidywgd3JpdGVfdHJpbW1lZF9sZW5ndGgsIDEpOworICAgIGlmICh3cml0ZV90cmltbWVkX2xlbmd0aCkgeworICAgICAgY29uc3QgaW50IG5iaXRzID0gVlA4TEJpdHNMb2cyQ2VpbGluZyh0cmltbWVkX2xlbmd0aCAtIDEpOworICAgICAgY29uc3QgaW50IG5iaXRwYWlycyA9IChuYml0cyA9PSAwKSA/IDEgOiAobmJpdHMgKyAxKSAvIDI7CisgICAgICBWUDhMUHV0Qml0cyhidywgbmJpdHBhaXJzIC0gMSwgMyk7CisgICAgICBhc3NlcnQodHJpbW1lZF9sZW5ndGggPj0gMik7CisgICAgICBWUDhMUHV0Qml0cyhidywgdHJpbW1lZF9sZW5ndGggLSAyLCBuYml0cGFpcnMgKiAyKTsKKyAgICB9CisgICAgU3RvcmVIdWZmbWFuVHJlZVRvQml0TWFzayhidywgdG9rZW5zLCBsZW5ndGgsICZodWZmbWFuX2NvZGUpOworICB9Cit9CisKKy8vICdodWZmX3RyZWUnIGFuZCAndG9rZW5zJyBhcmUgcHJlLWFsbG9hY3RlZCBidWZmZXJzLgorc3RhdGljIHZvaWQgU3RvcmVIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgdG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgeworICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN5bWJvbHNbMl0gPSB7IDAsIDAgfTsKKyAgY29uc3QgaW50IGtNYXhCaXRzID0gODsKKyAgY29uc3QgaW50IGtNYXhTeW1ib2wgPSAxIDw8IGtNYXhCaXRzOworCisgIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhIHNtYWxsIHRyZWUuCisgIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzICYmIGNvdW50IDwgMzsgKytpKSB7CisgICAgaWYgKGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2ldICE9IDApIHsKKyAgICAgIGlmIChjb3VudCA8IDIpIHN5bWJvbHNbY291bnRdID0gaTsKKyAgICAgICsrY291bnQ7CisgICAgfQorICB9CisKKyAgaWYgKGNvdW50ID09IDApIHsgICAvLyBlbWl0IG1pbmltYWwgdHJlZSBmb3IgZW1wdHkgY2FzZXMKKyAgICAvLyBiaXRzOiBzbWFsbCB0cmVlIG1hcmtlcjogMSwgY291bnQtMTogMCwgbGFyZ2UgOC1iaXQgY29kZTogMCwgY29kZTogMAorICAgIFZQOExQdXRCaXRzKGJ3LCAweDAxLCA0KTsKKyAgfSBlbHNlIGlmIChjb3VudCA8PSAyICYmIHN5bWJvbHNbMF0gPCBrTWF4U3ltYm9sICYmIHN5bWJvbHNbMV0gPCBrTWF4U3ltYm9sKSB7CisgICAgVlA4TFB1dEJpdHMoYncsIDEsIDEpOyAgLy8gU21hbGwgdHJlZSBtYXJrZXIgdG8gZW5jb2RlIDEgb3IgMiBzeW1ib2xzLgorICAgIFZQOExQdXRCaXRzKGJ3LCBjb3VudCAtIDEsIDEpOworICAgIGlmIChzeW1ib2xzWzBdIDw9IDEpIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAwLCAxKTsgIC8vIENvZGUgYml0IGZvciBzbWFsbCAoMSBiaXQpIHN5bWJvbCB2YWx1ZS4KKyAgICAgIFZQOExQdXRCaXRzKGJ3LCBzeW1ib2xzWzBdLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TFB1dEJpdHMoYncsIDEsIDEpOworICAgICAgVlA4TFB1dEJpdHMoYncsIHN5bWJvbHNbMF0sIDgpOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gMikgeworICAgICAgVlA4TFB1dEJpdHMoYncsIHN5bWJvbHNbMV0sIDgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBTdG9yZUZ1bGxIdWZmbWFuQ29kZShidywgaHVmZl90cmVlLCB0b2tlbnMsIGh1ZmZtYW5fY29kZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgV3JpdGVIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZV9pbmRleCkgeworICBjb25zdCBpbnQgZGVwdGggPSBjb2RlLT5jb2RlX2xlbmd0aHNbY29kZV9pbmRleF07CisgIGNvbnN0IGludCBzeW1ib2wgPSBjb2RlLT5jb2Rlc1tjb2RlX2luZGV4XTsKKyAgVlA4TFB1dEJpdHMoYncsIHN5bWJvbCwgZGVwdGgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBXcml0ZUh1ZmZtYW5Db2RlV2l0aEV4dHJhQml0cygKKyAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGUsCisgICAgaW50IGNvZGVfaW5kZXgsCisgICAgaW50IGJpdHMsCisgICAgaW50IG5fYml0cykgeworICBjb25zdCBpbnQgZGVwdGggPSBjb2RlLT5jb2RlX2xlbmd0aHNbY29kZV9pbmRleF07CisgIGNvbnN0IGludCBzeW1ib2wgPSBjb2RlLT5jb2Rlc1tjb2RlX2luZGV4XTsKKyAgVlA4TFB1dEJpdHMoYncsIChiaXRzIDw8IGRlcHRoKSB8IHN5bWJvbCwgZGVwdGggKyBuX2JpdHMpOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgU3RvcmVJbWFnZVRvQml0TWFzaygKKyAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IHdpZHRoLCBpbnQgaGlzdG9fYml0cywKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgIGNvbnN0IHVpbnQxNl90KiBoaXN0b2dyYW1fc3ltYm9scywKKyAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZXMpIHsKKyAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBoaXN0b19iaXRzKSA6IDE7CisgIGNvbnN0IGludCB0aWxlX21hc2sgPSAoaGlzdG9fYml0cyA9PSAwKSA/IDAgOiAtKDEgPDwgaGlzdG9fYml0cyk7CisgIC8vIHggYW5kIHkgdHJhY2UgdGhlIHBvc2l0aW9uIGluIHRoZSBpbWFnZS4KKyAgaW50IHggPSAwOworICBpbnQgeSA9IDA7CisgIGludCB0aWxlX3ggPSB4ICYgdGlsZV9tYXNrOworICBpbnQgdGlsZV95ID0geSAmIHRpbGVfbWFzazsKKyAgaW50IGhpc3RvZ3JhbV9peCA9IGhpc3RvZ3JhbV9zeW1ib2xzWzBdOworICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvZGVzID0gaHVmZm1hbl9jb2RlcyArIDUgKiBoaXN0b2dyYW1faXg7CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBpZiAoKHRpbGVfeCAhPSAoeCAmIHRpbGVfbWFzaykpIHx8ICh0aWxlX3kgIT0gKHkgJiB0aWxlX21hc2spKSkgeworICAgICAgdGlsZV94ID0geCAmIHRpbGVfbWFzazsKKyAgICAgIHRpbGVfeSA9IHkgJiB0aWxlX21hc2s7CisgICAgICBoaXN0b2dyYW1faXggPSBoaXN0b2dyYW1fc3ltYm9sc1soeSA+PiBoaXN0b19iaXRzKSAqIGhpc3RvX3hzaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4ID4+IGhpc3RvX2JpdHMpXTsKKyAgICAgIGNvZGVzID0gaHVmZm1hbl9jb2RlcyArIDUgKiBoaXN0b2dyYW1faXg7CisgICAgfQorICAgIGlmIChQaXhPckNvcHlJc0xpdGVyYWwodikpIHsKKyAgICAgIHN0YXRpYyBjb25zdCBpbnQgb3JkZXJbXSA9IHsgMSwgMiwgMCwgMyB9OworICAgICAgaW50IGs7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7CisgICAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5TGl0ZXJhbCh2LCBvcmRlcltrXSk7CisgICAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgaywgY29kZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChQaXhPckNvcHlJc0NhY2hlSWR4KHYpKSB7CisgICAgICBjb25zdCBpbnQgY29kZSA9IFBpeE9yQ29weUNhY2hlSWR4KHYpOworICAgICAgY29uc3QgaW50IGxpdGVyYWxfaXggPSAyNTYgKyBOVU1fTEVOR1RIX0NPREVTICsgY29kZTsKKyAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzLCBsaXRlcmFsX2l4KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGJpdHMsIG5fYml0czsKKyAgICAgIGludCBjb2RlOworCisgICAgICBjb25zdCBpbnQgZGlzdGFuY2UgPSBQaXhPckNvcHlEaXN0YW5jZSh2KTsKKyAgICAgIFZQOExQcmVmaXhFbmNvZGUodi0+bGVuLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOworICAgICAgV3JpdGVIdWZmbWFuQ29kZVdpdGhFeHRyYUJpdHMoYncsIGNvZGVzLCAyNTYgKyBjb2RlLCBiaXRzLCBuX2JpdHMpOworCisgICAgICAvLyBEb24ndCB3cml0ZSB0aGUgZGlzdGFuY2Ugd2l0aCB0aGUgZXh0cmEgYml0cyBjb2RlIHNpbmNlCisgICAgICAvLyB0aGUgZGlzdGFuY2UgY2FuIGJlIHVwIHRvIDE4IGJpdHMgb2YgZXh0cmEgYml0cywgYW5kIHRoZSBwcmVmaXgKKyAgICAgIC8vIDE1IGJpdHMsIHRvdGFsaW5nIHRvIDMzLCBhbmQgb3VyIFB1dEJpdHMgb25seSBzdXBwb3J0cyB1cCB0byAzMiBiaXRzLgorICAgICAgLy8gVE9ETyhqeXJraSk6IG9wdGltaXplIHRoaXMgZnVydGhlci4KKyAgICAgIFZQOExQcmVmaXhFbmNvZGUoZGlzdGFuY2UsICZjb2RlLCAmbl9iaXRzLCAmYml0cyk7CisgICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcyArIDQsIGNvZGUpOworICAgICAgVlA4TFB1dEJpdHMoYncsIGJpdHMsIG5fYml0cyk7CisgICAgfQorICAgIHggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOworICAgIHdoaWxlICh4ID49IHdpZHRoKSB7CisgICAgICB4IC09IHdpZHRoOworICAgICAgKyt5OworICAgIH0KKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9CisgIHJldHVybiBidy0+ZXJyb3JfID8gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZIDogVlA4X0VOQ19PSzsKK30KKworLy8gU3BlY2lhbCBjYXNlIG9mIEVuY29kZUltYWdlSW50ZXJuYWwoKSBmb3IgY2FjaGUtYml0cz0wLCBoaXN0b19iaXRzPTMxCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzIHJlZnNfYXJyYXlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5KSB7CisgIGludCBpOworICBpbnQgbWF4X3Rva2VucyA9IDA7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIFZQOExCYWNrd2FyZFJlZnMqIHJlZnM7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucyA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGVzWzVdID0geyB7IDAsIE5VTEwsIE5VTEwgfSB9OworICBjb25zdCB1aW50MTZfdCBoaXN0b2dyYW1fc3ltYm9sc1sxXSA9IHsgMCB9OyAgICAvLyBvbmx5IG9uZSB0cmVlLCBvbmUgc3ltYm9sCisgIGludCBjYWNoZV9iaXRzID0gMDsKKyAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0gTlVMTDsKKyAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSA9IChIdWZmbWFuVHJlZSopV2ViUFNhZmVNYWxsb2MoCisgICAgICAgIDNVTEwgKiBDT0RFX0xFTkdUSF9DT0RFUywgc2l6ZW9mKCpodWZmX3RyZWUpKTsKKyAgaWYgKGh1ZmZfdHJlZSA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCisgIGlmIChWUDhMSGFzaENoYWluRmlsbChoYXNoX2NoYWluLCBxdWFsaXR5LCBhcmdiLCB3aWR0aCwgaGVpZ2h0KSA9PSAwKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgcmVmcyA9IFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMod2lkdGgsIGhlaWdodCwgYXJnYiwgcXVhbGl0eSwgMCwgJmNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfY2hhaW4sIHJlZnNfYXJyYXkpOworICBpZiAocmVmcyA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgaGlzdG9ncmFtX2ltYWdlID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KDEsIGNhY2hlX2JpdHMpOworICBpZiAoaGlzdG9ncmFtX2ltYWdlID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIEJ1aWxkIGhpc3RvZ3JhbSBpbWFnZSBhbmQgc3ltYm9scyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCisgIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMocmVmcywgaGlzdG9ncmFtX2ltYWdlLT5oaXN0b2dyYW1zWzBdKTsKKworICAvLyBDcmVhdGUgSHVmZm1hbiBiaXQgbGVuZ3RocyBhbmQgY29kZXMgZm9yIGVhY2ggaGlzdG9ncmFtIGltYWdlLgorICBhc3NlcnQoaGlzdG9ncmFtX2ltYWdlLT5zaXplID09IDEpOworICBpZiAoIUdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoaGlzdG9ncmFtX2ltYWdlLCBodWZmbWFuX2NvZGVzKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gTm8gY29sb3IgY2FjaGUsIG5vIEh1ZmZtYW4gaW1hZ2UuCisgIFZQOExQdXRCaXRzKGJ3LCAwLCAxKTsKKworICAvLyBGaW5kIG1heGltdW0gbnVtYmVyIG9mIHN5bWJvbHMgZm9yIHRoZSBodWZmbWFuIHRyZWUtc2V0LgorICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOworICAgIGlmIChtYXhfdG9rZW5zIDwgY29kZXMtPm51bV9zeW1ib2xzKSB7CisgICAgICBtYXhfdG9rZW5zID0gY29kZXMtPm51bV9zeW1ib2xzOworICAgIH0KKyAgfQorCisgIHRva2VucyA9IChIdWZmbWFuVHJlZVRva2VuKilXZWJQU2FmZU1hbGxvYyhtYXhfdG9rZW5zLCBzaXplb2YoKnRva2VucykpOworICBpZiAodG9rZW5zID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCisgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgU3RvcmVIdWZmbWFuQ29kZShidywgaHVmZl90cmVlLCB0b2tlbnMsIGNvZGVzKTsKKyAgICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKGNvZGVzKTsKKyAgfQorCisgIC8vIFN0b3JlIGFjdHVhbCBsaXRlcmFscy4KKyAgZXJyID0gU3RvcmVJbWFnZVRvQml0TWFzayhidywgd2lkdGgsIDAsIHJlZnMsIGhpc3RvZ3JhbV9zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZtYW5fY29kZXMpOworCisgRXJyb3I6CisgIFdlYlBTYWZlRnJlZSh0b2tlbnMpOworICBXZWJQU2FmZUZyZWUoaHVmZl90cmVlKTsKKyAgVlA4TEZyZWVIaXN0b2dyYW1TZXQoaGlzdG9ncmFtX2ltYWdlKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXNbMF0uY29kZXMpOworICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgRW5jb2RlSW1hZ2VJbnRlcm5hbChWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMgcmVmc19hcnJheVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfY2FjaGUsIGludCogY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b2dyYW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbml0X2J5dGVfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhkcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkYXRhX3NpemUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDMyX3QgaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSA9CisgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgaGlzdG9ncmFtX2JpdHMpICoKKyAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgaGlzdG9ncmFtX2JpdHMpOworICBWUDhMSGlzdG9ncmFtU2V0KiBoaXN0b2dyYW1faW1hZ2UgPSBOVUxMOworICBWUDhMSGlzdG9ncmFtU2V0KiB0bXBfaGlzdG9zID0gTlVMTDsKKyAgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gMDsKKyAgc2l6ZV90IGJpdF9hcnJheV9zaXplID0gMDsKKyAgSHVmZm1hblRyZWUqIGh1ZmZfdHJlZSA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucyA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlQ29kZSogaHVmZm1hbl9jb2RlcyA9IE5VTEw7CisgIFZQOExCYWNrd2FyZFJlZnMgcmVmczsKKyAgVlA4TEJhY2t3YXJkUmVmcyogYmVzdF9yZWZzOworICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMgPQorICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYyhoaXN0b2dyYW1faW1hZ2VfeHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhpc3RvZ3JhbV9zeW1ib2xzKSk7CisgIGFzc2VydChoaXN0b2dyYW1fYml0cyA+PSBNSU5fSFVGRk1BTl9CSVRTKTsKKyAgYXNzZXJ0KGhpc3RvZ3JhbV9iaXRzIDw9IE1BWF9IVUZGTUFOX0JJVFMpOworICBhc3NlcnQoaGRyX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisKKyAgVlA4TEJhY2t3YXJkUmVmc0luaXQoJnJlZnMsIHJlZnNfYXJyYXlbMF0uYmxvY2tfc2l6ZV8pOworICBpZiAoaGlzdG9ncmFtX3N5bWJvbHMgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgKmNhY2hlX2JpdHMgPSB1c2VfY2FjaGUgPyBNQVhfQ09MT1JfQ0FDSEVfQklUUyA6IDA7CisgIC8vICdiZXN0X3JlZnMnIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIGJlc3QgYmFja3dhcmQgcmVmcyBhbmQgcG9pbnRzIHRvIG9uZQorICAvLyBvZiByZWZzX2FycmF5WzBdIG9yIHJlZnNfYXJyYXlbMV0uCisgIC8vIENhbGN1bGF0ZSBiYWNrd2FyZCByZWZlcmVuY2VzIGZyb20gQVJHQiBpbWFnZS4KKyAgaWYgKFZQOExIYXNoQ2hhaW5GaWxsKGhhc2hfY2hhaW4sIHF1YWxpdHksIGFyZ2IsIHdpZHRoLCBoZWlnaHQpID09IDApIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBiZXN0X3JlZnMgPSBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZzX2FycmF5KTsKKyAgaWYgKGJlc3RfcmVmcyA9PSBOVUxMIHx8ICFWUDhMQmFja3dhcmRSZWZzQ29weShiZXN0X3JlZnMsICZyZWZzKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGhpc3RvZ3JhbV9pbWFnZSA9CisgICAgICBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQoaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwgKmNhY2hlX2JpdHMpOworICB0bXBfaGlzdG9zID0gVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KDIsICpjYWNoZV9iaXRzKTsKKyAgaWYgKGhpc3RvZ3JhbV9pbWFnZSA9PSBOVUxMIHx8IHRtcF9oaXN0b3MgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gQnVpbGQgaGlzdG9ncmFtIGltYWdlIGFuZCBzeW1ib2xzIGZyb20gYmFja3dhcmQgcmVmZXJlbmNlcy4KKyAgaWYgKCFWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMod2lkdGgsIGhlaWdodCwgJnJlZnMsIHF1YWxpdHksIGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9iaXRzLCAqY2FjaGVfYml0cywgaGlzdG9ncmFtX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfaGlzdG9zLCBoaXN0b2dyYW1fc3ltYm9scykpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICAvLyBDcmVhdGUgSHVmZm1hbiBiaXQgbGVuZ3RocyBhbmQgY29kZXMgZm9yIGVhY2ggaGlzdG9ncmFtIGltYWdlLgorICBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKKyAgYml0X2FycmF5X3NpemUgPSA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7CisgIGh1ZmZtYW5fY29kZXMgPSAoSHVmZm1hblRyZWVDb2RlKilXZWJQU2FmZUNhbGxvYyhiaXRfYXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZm1hbl9jb2RlcykpOworICAvLyBOb3RlOiBzb21lIGhpc3RvZ3JhbV9pbWFnZSBlbnRyaWVzIG1heSBwb2ludCB0byB0bXBfaGlzdG9zW10sIHNvIHRoZSBsYXR0ZXIKKyAgLy8gbmVlZCB0byBvdXRsaXZlIHRoZSBmb2xsb3dpbmcgY2FsbCB0byBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKCkuCisgIGlmIChodWZmbWFuX2NvZGVzID09IE5VTEwgfHwKKyAgICAgICFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorICAvLyBGcmVlIGNvbWJpbmVkIGhpc3RvZ3JhbXMuCisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZSk7CisgIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7CisKKyAgLy8gRnJlZSBzY3JhdGNoIGhpc3RvZ3JhbXMuCisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KHRtcF9oaXN0b3MpOworICB0bXBfaGlzdG9zID0gTlVMTDsKKworICAvLyBDb2xvciBDYWNoZSBwYXJhbWV0ZXJzLgorICBpZiAoKmNhY2hlX2JpdHMgPiAwKSB7CisgICAgVlA4TFB1dEJpdHMoYncsIDEsIDEpOworICAgIFZQOExQdXRCaXRzKGJ3LCAqY2FjaGVfYml0cywgNCk7CisgIH0gZWxzZSB7CisgICAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworICB9CisKKyAgLy8gSHVmZm1hbiBpbWFnZSArIG1ldGEgaHVmZm1hbi4KKyAgeworICAgIGNvbnN0IGludCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UgPSAoaGlzdG9ncmFtX2ltYWdlX3NpemUgPiAxKTsKKyAgICBWUDhMUHV0Qml0cyhidywgd3JpdGVfaGlzdG9ncmFtX2ltYWdlLCAxKTsKKyAgICBpZiAod3JpdGVfaGlzdG9ncmFtX2ltYWdlKSB7CisgICAgICB1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtX2FyZ2IgPQorICAgICAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX2FyZ2IpKTsKKyAgICAgIGludCBtYXhfaW5kZXggPSAwOworICAgICAgdWludDMyX3QgaTsKKyAgICAgIGlmIChoaXN0b2dyYW1fYXJnYiA9PSBOVUxMKSB7CisgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2VfeHlzaXplOyArK2kpIHsKKyAgICAgICAgY29uc3QgaW50IHN5bWJvbF9pbmRleCA9IGhpc3RvZ3JhbV9zeW1ib2xzW2ldICYgMHhmZmZmOworICAgICAgICBoaXN0b2dyYW1fYXJnYltpXSA9IChzeW1ib2xfaW5kZXggPDwgOCk7CisgICAgICAgIGlmIChzeW1ib2xfaW5kZXggPj0gbWF4X2luZGV4KSB7CisgICAgICAgICAgbWF4X2luZGV4ID0gc3ltYm9sX2luZGV4ICsgMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBtYXhfaW5kZXg7CisKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCBoaXN0b2dyYW1fYml0cyAtIDIsIDMpOworICAgICAgZXJyID0gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIGhpc3RvZ3JhbV9hcmdiLCBoYXNoX2NoYWluLCByZWZzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgaGlzdG9ncmFtX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgICBXZWJQU2FmZUZyZWUoaGlzdG9ncmFtX2FyZ2IpOworICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCisgIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWF4X3Rva2VucyA9IDA7CisgICAgaHVmZl90cmVlID0gKEh1ZmZtYW5UcmVlKilXZWJQU2FmZU1hbGxvYygzVUxMICogQ09ERV9MRU5HVEhfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh1ZmZfdHJlZSkpOworICAgIGlmIChodWZmX3RyZWUgPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgLy8gRmluZCBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xzIGZvciB0aGUgaHVmZm1hbiB0cmVlLXNldC4KKyAgICBmb3IgKGkgPSAwOyBpIDwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICAgIGlmIChtYXhfdG9rZW5zIDwgY29kZXMtPm51bV9zeW1ib2xzKSB7CisgICAgICAgIG1heF90b2tlbnMgPSBjb2Rlcy0+bnVtX3N5bWJvbHM7CisgICAgICB9CisgICAgfQorICAgIHRva2VucyA9IChIdWZmbWFuVHJlZVRva2VuKilXZWJQU2FmZU1hbGxvYyhtYXhfdG9rZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnRva2VucykpOworICAgIGlmICh0b2tlbnMgPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07CisgICAgICBTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgY29kZXMpOworICAgICAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbChjb2Rlcyk7CisgICAgfQorICB9CisKKyAgKmhkcl9zaXplID0gKGludCkoVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KSAtIGluaXRfYnl0ZV9wb3NpdGlvbik7CisgIC8vIFN0b3JlIGFjdHVhbCBsaXRlcmFscy4KKyAgZXJyID0gU3RvcmVJbWFnZVRvQml0TWFzayhidywgd2lkdGgsIGhpc3RvZ3JhbV9iaXRzLCAmcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fc3ltYm9scywgaHVmZm1hbl9jb2Rlcyk7CisgICpkYXRhX3NpemUgPQorICAgICAgICAoaW50KShWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpIC0gaW5pdF9ieXRlX3Bvc2l0aW9uIC0gKmhkcl9zaXplKTsKKworIEVycm9yOgorICBXZWJQU2FmZUZyZWUodG9rZW5zKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZfdHJlZSk7CisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZSk7CisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KHRtcF9oaXN0b3MpOworICBWUDhMQmFja3dhcmRSZWZzQ2xlYXIoJnJlZnMpOworICBpZiAoaHVmZm1hbl9jb2RlcyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGh1ZmZtYW5fY29kZXMtPmNvZGVzKTsKKyAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcyk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGhpc3RvZ3JhbV9zeW1ib2xzKTsKKyAgcmV0dXJuIGVycjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMKKworc3RhdGljIHZvaWQgQXBwbHlTdWJ0cmFjdEdyZWVuKFZQOExFbmNvZGVyKiBjb25zdCBlbmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgU1VCVFJBQ1RfR1JFRU4sIDIpOworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkKGVuYy0+YXJnYl8sIHdpZHRoICogaGVpZ2h0KTsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEFwcGx5UHJlZGljdEZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IGludCBwcmVkX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKKyAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBwcmVkX2JpdHMpOworICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgcHJlZF9iaXRzKTsKKyAgLy8gd2UgZGlzYWJsZSBuZWFyLWxvc3NsZXNzIHF1YW50aXphdGlvbiBpZiBwYWxldHRlIGlzIHVzZWQuCisgIGNvbnN0IGludCBuZWFyX2xvc3NsZXNzX3N0cmVuZ3RoID0gZW5jLT51c2VfcGFsZXR0ZV8gPyAxMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlbmMtPmNvbmZpZ18tPm5lYXJfbG9zc2xlc3M7CisKKyAgVlA4TFJlc2lkdWFsSW1hZ2Uod2lkdGgsIGhlaWdodCwgcHJlZF9iaXRzLCBsb3dfZWZmb3J0LCBlbmMtPmFyZ2JfLAorICAgICAgICAgICAgICAgICAgICBlbmMtPmFyZ2Jfc2NyYXRjaF8sIGVuYy0+dHJhbnNmb3JtX2RhdGFfLAorICAgICAgICAgICAgICAgICAgICBuZWFyX2xvc3NsZXNzX3N0cmVuZ3RoLCBlbmMtPmNvbmZpZ18tPmV4YWN0LAorICAgICAgICAgICAgICAgICAgICB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgVlA4TFB1dEJpdHMoYncsIFRSQU5TRk9STV9QUkVTRU5ULCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIFBSRURJQ1RPUl9UUkFOU0ZPUk0sIDIpOworICBhc3NlcnQocHJlZF9iaXRzID49IDIpOworICBWUDhMUHV0Qml0cyhidywgcHJlZF9iaXRzIC0gMiwgMyk7CisgIHJldHVybiBFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVlA4TEhhc2hDaGFpbiopJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopZW5jLT5yZWZzXywgIC8vIGNhc3QgY29uc3QgYXdheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseUNyb3NzQ29sb3JGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IGNjb2xvcl90cmFuc2Zvcm1fYml0cyA9IGVuYy0+dHJhbnNmb3JtX2JpdHNfOworICBjb25zdCBpbnQgdHJhbnNmb3JtX3dpZHRoID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGNjb2xvcl90cmFuc2Zvcm1fYml0cyk7CisgIGNvbnN0IGludCB0cmFuc2Zvcm1faGVpZ2h0ID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOworCisgIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKHdpZHRoLCBoZWlnaHQsIGNjb2xvcl90cmFuc2Zvcm1fYml0cywgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5hcmdiXywgZW5jLT50cmFuc2Zvcm1fZGF0YV8pOworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNLCAyKTsKKyAgYXNzZXJ0KGNjb2xvcl90cmFuc2Zvcm1fYml0cyA+PSAyKTsKKyAgVlA4TFB1dEJpdHMoYncsIGNjb2xvcl90cmFuc2Zvcm1fYml0cyAtIDIsIDMpOworICByZXR1cm4gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIGVuYy0+dHJhbnNmb3JtX2RhdGFfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZQOExIYXNoQ2hhaW4qKSZlbmMtPmhhc2hfY2hhaW5fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZQOExCYWNrd2FyZFJlZnMqKWVuYy0+cmVmc18sICAvLyBjYXN0IGNvbnN0IGF3YXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV93aWR0aCwgdHJhbnNmb3JtX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVSaWZmSGVhZGVyKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsIHNpemVfdCB2cDhsX3NpemUpIHsKKyAgdWludDhfdCByaWZmW1JJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSArIFZQOExfU0lHTkFUVVJFX1NJWkVdID0geworICAgICdSJywgJ0knLCAnRicsICdGJywgMCwgMCwgMCwgMCwgJ1cnLCAnRScsICdCJywgJ1AnLAorICAgICdWJywgJ1AnLCAnOCcsICdMJywgMCwgMCwgMCwgMCwgVlA4TF9NQUdJQ19CWVRFLAorICB9OworICBQdXRMRTMyKHJpZmYgKyBUQUdfU0laRSwgKHVpbnQzMl90KXJpZmZfc2l6ZSk7CisgIFB1dExFMzIocmlmZiArIFJJRkZfSEVBREVSX1NJWkUgKyBUQUdfU0laRSwgKHVpbnQzMl90KXZwOGxfc2l6ZSk7CisgIGlmICghcGljLT53cml0ZXIocmlmZiwgc2l6ZW9mKHJpZmYpLCBwaWMpKSB7CisgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICB9CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCitzdGF0aWMgaW50IFdyaXRlSW1hZ2VTaXplKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGggLSAxOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQgLSAxOworICBhc3NlcnQod2lkdGggPCBXRUJQX01BWF9ESU1FTlNJT04gJiYgaGVpZ2h0IDwgV0VCUF9NQVhfRElNRU5TSU9OKTsKKworICBWUDhMUHV0Qml0cyhidywgd2lkdGgsIFZQOExfSU1BR0VfU0laRV9CSVRTKTsKKyAgVlA4TFB1dEJpdHMoYncsIGhlaWdodCwgVlA4TF9JTUFHRV9TSVpFX0JJVFMpOworICByZXR1cm4gIWJ3LT5lcnJvcl87Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVSZWFsQWxwaGFBbmRWZXJzaW9uKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgaGFzX2FscGhhKSB7CisgIFZQOExQdXRCaXRzKGJ3LCBoYXNfYWxwaGEsIDEpOworICBWUDhMUHV0Qml0cyhidywgVlA4TF9WRVJTSU9OLCBWUDhMX1ZFUlNJT05fQklUUyk7CisgIHJldHVybiAhYnctPmVycm9yXzsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFdyaXRlSW1hZ2UoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBjb2RlZF9zaXplKSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHdlYnBsbF9kYXRhID0gVlA4TEJpdFdyaXRlckZpbmlzaChidyk7CisgIGNvbnN0IHNpemVfdCB3ZWJwbGxfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7CisgIGNvbnN0IHNpemVfdCB2cDhsX3NpemUgPSBWUDhMX1NJR05BVFVSRV9TSVpFICsgd2VicGxsX3NpemU7CisgIGNvbnN0IHNpemVfdCBwYWQgPSB2cDhsX3NpemUgJiAxOworICBjb25zdCBzaXplX3QgcmlmZl9zaXplID0gVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSArIHZwOGxfc2l6ZSArIHBhZDsKKworICBlcnIgPSBXcml0ZVJpZmZIZWFkZXIocGljLCByaWZmX3NpemUsIHZwOGxfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAoIXBpYy0+d3JpdGVyKHdlYnBsbF9kYXRhLCB3ZWJwbGxfc2l6ZSwgcGljKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAocGFkKSB7CisgICAgY29uc3QgdWludDhfdCBwYWRfYnl0ZVsxXSA9IHsgMCB9OworICAgIGlmICghcGljLT53cml0ZXIocGFkX2J5dGUsIDEsIHBpYykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKyAgKmNvZGVkX3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIHJpZmZfc2l6ZTsKKyAgcmV0dXJuIFZQOF9FTkNfT0s7CisKKyBFcnJvcjoKKyAgcmV0dXJuIGVycjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQ2xlYXJUcmFuc2Zvcm1CdWZmZXIoVlA4TEVuY29kZXIqIGNvbnN0IGVuYykgeworICBXZWJQU2FmZUZyZWUoZW5jLT50cmFuc2Zvcm1fbWVtXyk7CisgIGVuYy0+dHJhbnNmb3JtX21lbV8gPSBOVUxMOworICBlbmMtPnRyYW5zZm9ybV9tZW1fc2l6ZV8gPSAwOworfQorCisvLyBBbGxvY2F0ZXMgdGhlIG1lbW9yeSBmb3IgYXJnYiAoVyB4IEgpIGJ1ZmZlciwgMiByb3dzIG9mIGNvbnRleHQgZm9yCisvLyBwcmVkaWN0aW9uIGFuZCB0cmFuc2Zvcm0gZGF0YS4KKy8vIEZsYWdzIGluZmx1ZW5jaW5nIHRoZSBtZW1vcnkgYWxsb2NhdGVkOgorLy8gIGVuYy0+dHJhbnNmb3JtX2JpdHNfCisvLyAgZW5jLT51c2VfcHJlZGljdF8sIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKFZQOExFbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IHVpbnQ2NF90IGltYWdlX3NpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgLy8gVlA4TFJlc2lkdWFsSW1hZ2UgbmVlZHMgcm9vbSBmb3IgMiBzY2FubGluZXMgb2YgdWludDMyIHBpeGVscyB3aXRoIGFuIGV4dHJhCisgIC8vIHBpeGVsIGluIGVhY2gsIHBsdXMgMiByZWd1bGFyIHNjYW5saW5lcyBvZiBieXRlcy4KKyAgLy8gVE9ETyhza2FsKTogQ2xlYW4gdXAgYnkgdXNpbmcgYXJpdGhtZXRpYyBpbiBieXRlcyBpbnN0ZWFkIG9mIHdvcmRzLgorICBjb25zdCB1aW50NjRfdCBhcmdiX3NjcmF0Y2hfc2l6ZSA9CisgICAgICBlbmMtPnVzZV9wcmVkaWN0XworICAgICAgICAgID8gKHdpZHRoICsgMSkgKiAyICsKKyAgICAgICAgICAgICh3aWR0aCAqIDIgKyBzaXplb2YodWludDMyX3QpIC0gMSkgLyBzaXplb2YodWludDMyX3QpCisgICAgICAgICAgOiAwOworICBjb25zdCB1aW50NjRfdCB0cmFuc2Zvcm1fZGF0YV9zaXplID0KKyAgICAgIChlbmMtPnVzZV9wcmVkaWN0XyB8fCBlbmMtPnVzZV9jcm9zc19jb2xvcl8pCisgICAgICAgICAgPyBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgZW5jLT50cmFuc2Zvcm1fYml0c18pICoKKyAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGVuYy0+dHJhbnNmb3JtX2JpdHNfKQorICAgICAgICAgIDogMDsKKyAgY29uc3QgdWludDY0X3QgbWF4X2FsaWdubWVudF9pbl93b3JkcyA9CisgICAgICAoV0VCUF9BTElHTl9DU1QgKyBzaXplb2YodWludDMyX3QpIC0gMSkgLyBzaXplb2YodWludDMyX3QpOworICBjb25zdCB1aW50NjRfdCBtZW1fc2l6ZSA9CisgICAgICBpbWFnZV9zaXplICsgbWF4X2FsaWdubWVudF9pbl93b3JkcyArCisgICAgICBhcmdiX3NjcmF0Y2hfc2l6ZSArIG1heF9hbGlnbm1lbnRfaW5fd29yZHMgKworICAgICAgdHJhbnNmb3JtX2RhdGFfc2l6ZTsKKyAgdWludDMyX3QqIG1lbSA9IGVuYy0+dHJhbnNmb3JtX21lbV87CisgIGlmIChtZW0gPT0gTlVMTCB8fCBtZW1fc2l6ZSA+IGVuYy0+dHJhbnNmb3JtX21lbV9zaXplXykgeworICAgIENsZWFyVHJhbnNmb3JtQnVmZmVyKGVuYyk7CisgICAgbWVtID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhtZW1fc2l6ZSwgc2l6ZW9mKCptZW0pKTsKKyAgICBpZiAobWVtID09IE5VTEwpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVuYy0+dHJhbnNmb3JtX21lbV8gPSBtZW07CisgICAgZW5jLT50cmFuc2Zvcm1fbWVtX3NpemVfID0gKHNpemVfdCltZW1fc2l6ZTsKKyAgfQorICBlbmMtPmFyZ2JfID0gbWVtOworICBtZW0gPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtICsgaW1hZ2Vfc2l6ZSk7CisgIGVuYy0+YXJnYl9zY3JhdGNoXyA9IG1lbTsKKyAgbWVtID0gKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSArIGFyZ2Jfc2NyYXRjaF9zaXplKTsKKyAgZW5jLT50cmFuc2Zvcm1fZGF0YV8gPSBtZW07CisKKyAgZW5jLT5jdXJyZW50X3dpZHRoXyA9IHdpZHRoOworIEVycm9yOgorICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgTWFrZUlucHV0SW1hZ2VDb3B5KFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBpbnQgeTsKKyAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCB3aWR0aCwgaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBtZW1jcHkoZW5jLT5hcmdiXyArIHkgKiB3aWR0aCwKKyAgICAgICAgICAgcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgd2lkdGggKiBzaXplb2YoKmVuYy0+YXJnYl8pKTsKKyAgfQorICBhc3NlcnQoZW5jLT5jdXJyZW50X3dpZHRoXyA9PSB3aWR0aCk7CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFNlYXJjaENvbG9yKGNvbnN0IHVpbnQzMl90IHNvcnRlZFtdLCB1aW50MzJfdCBjb2xvciwgaW50IGhpKSB7CisgIGludCBsb3cgPSAwOworICBpZiAoc29ydGVkW2xvd10gPT0gY29sb3IpIHJldHVybiBsb3c7ICAvLyBsb29wIGludmFyaWFudDogc29ydGVkW2xvd10gIT0gY29sb3IKKyAgd2hpbGUgKDEpIHsKKyAgICBjb25zdCBpbnQgbWlkID0gKGxvdyArIGhpKSA+PiAxOworICAgIGlmIChzb3J0ZWRbbWlkXSA9PSBjb2xvcikgeworICAgICAgcmV0dXJuIG1pZDsKKyAgICB9IGVsc2UgaWYgKHNvcnRlZFttaWRdIDwgY29sb3IpIHsKKyAgICAgIGxvdyA9IG1pZDsKKyAgICB9IGVsc2UgeworICAgICAgaGkgPSBtaWQ7CisgICAgfQorICB9Cit9CisKKy8vIFNvcnQgcGFsZXR0ZSBpbiBpbmNyZWFzaW5nIG9yZGVyIGFuZCBwcmVwYXJlIGFuIGludmVyc2UgbWFwcGluZyBhcnJheS4KK3N0YXRpYyB2b2lkIFByZXBhcmVNYXBUb1BhbGV0dGUoY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLCBpbnQgbnVtX2NvbG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc29ydGVkW10sIGludCBpZHhfbWFwW10pIHsKKyAgaW50IGk7CisgIG1lbWNweShzb3J0ZWQsIHBhbGV0dGUsIG51bV9jb2xvcnMgKiBzaXplb2YoKnNvcnRlZCkpOworICBxc29ydChzb3J0ZWQsIG51bV9jb2xvcnMsIHNpemVvZigqc29ydGVkKSwgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyArK2kpIHsKKyAgICBpZHhfbWFwW1NlYXJjaENvbG9yKHNvcnRlZCwgcGFsZXR0ZVtpXSwgbnVtX2NvbG9ycyldID0gaTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBNYXBUb1BhbGV0dGUoY29uc3QgdWludDMyX3Qgc29ydGVkX3BhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGxhc3RfcGl4LCBpbnQqIGNvbnN0IGxhc3RfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpZHhfbWFwW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgd2lkdGgpIHsKKyAgaW50IHg7CisgIGludCBwcmV2X2lkeCA9ICpsYXN0X2lkeDsKKyAgdWludDMyX3QgcHJldl9waXggPSAqbGFzdF9waXg7CisgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgY29uc3QgdWludDMyX3QgcGl4ID0gc3JjW3hdOworICAgIGlmIChwaXggIT0gcHJldl9waXgpIHsKKyAgICAgIHByZXZfaWR4ID0gaWR4X21hcFtTZWFyY2hDb2xvcihzb3J0ZWRfcGFsZXR0ZSwgcGl4LCBudW1fY29sb3JzKV07CisgICAgICBwcmV2X3BpeCA9IHBpeDsKKyAgICB9CisgICAgZHN0W3hdID0gcHJldl9pZHg7CisgIH0KKyAgKmxhc3RfaWR4ID0gcHJldl9pZHg7CisgICpsYXN0X3BpeCA9IHByZXZfcGl4OworfQorCisvLyBSZW1hcCBhcmdiIHZhbHVlcyBpbiBzcmNbXSB0byBwYWNrZWQgcGFsZXR0ZXMgZW50cmllcyBpbiBkc3RbXQorLy8gdXNpbmcgJ3JvdycgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHNpemUgJ3dpZHRoJy4KKy8vIFdlIGFzc3VtZSB0aGF0IGFsbCBzcmNbXSB2YWx1ZXMgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHBhbGV0dGUuCisvLyBOb3RlOiBzcmNbXSBjYW4gYmUgdGhlIHNhbWUgYXMgZHN0W10KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseVBhbGV0dGUoY29uc3QgdWludDMyX3QqIHNyYywgdWludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgdWludDMyX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBhbGV0dGUsIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhiaXRzKSB7CisgIC8vIFRPRE8oc2thbCk6IHRoaXMgdG1wIGJ1ZmZlciBpcyBub3QgbmVlZGVkIGlmIFZQOExCdW5kbGVDb2xvck1hcCgpIGNhbiBiZQorICAvLyBtYWRlIHRvIHdvcmsgaW4tcGxhY2UuCisgIHVpbnQ4X3QqIGNvbnN0IHRtcF9yb3cgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2Mod2lkdGgsIHNpemVvZigqdG1wX3JvdykpOworICBpbnQgaSwgeCwgeTsKKyAgaW50IHVzZV9MVVQgPSAxOworCisgIGlmICh0bXBfcm93ID09IE5VTEwpIHJldHVybiBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgeworICAgIGlmICgocGFsZXR0ZVtpXSAmIDB4ZmZmZjAwZmZ1KSAhPSAwKSB7CisgICAgICB1c2VfTFVUID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICh1c2VfTFVUKSB7CisgICAgdWludDhfdCBpbnZfcGFsZXR0ZVtNQVhfUEFMRVRURV9TSVpFXSA9IHsgMCB9OworICAgIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgeworICAgICAgY29uc3QgaW50IGNvbG9yID0gKHBhbGV0dGVbaV0gPj4gOCkgJiAweGZmOworICAgICAgaW52X3BhbGV0dGVbY29sb3JdID0gaTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY29sb3IgPSAoc3JjW3hdID4+IDgpICYgMHhmZjsKKyAgICAgICAgdG1wX3Jvd1t4XSA9IGludl9wYWxldHRlW2NvbG9yXTsKKyAgICAgIH0KKyAgICAgIFZQOExCdW5kbGVDb2xvck1hcCh0bXBfcm93LCB3aWR0aCwgeGJpdHMsIGRzdCk7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBVc2UgMSBwaXhlbCBjYWNoZSBmb3IgQVJHQiBwaXhlbHMuCisgICAgdWludDMyX3QgbGFzdF9waXg7CisgICAgaW50IGxhc3RfaWR4OworICAgIHVpbnQzMl90IHNvcnRlZFtNQVhfUEFMRVRURV9TSVpFXTsKKyAgICBpbnQgaWR4X21hcFtNQVhfUEFMRVRURV9TSVpFXTsKKyAgICBQcmVwYXJlTWFwVG9QYWxldHRlKHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSwgc29ydGVkLCBpZHhfbWFwKTsKKyAgICBsYXN0X3BpeCA9IHBhbGV0dGVbMF07CisgICAgbGFzdF9pZHggPSAwOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgTWFwVG9QYWxldHRlKHNvcnRlZCwgcGFsZXR0ZV9zaXplLCAmbGFzdF9waXgsICZsYXN0X2lkeCwKKyAgICAgICAgICAgICAgICAgICBpZHhfbWFwLCBzcmMsIHRtcF9yb3csIHdpZHRoKTsKKyAgICAgIFZQOExCdW5kbGVDb2xvck1hcCh0bXBfcm93LCB3aWR0aCwgeGJpdHMsIGRzdCk7CisgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KKyAgfQorICBXZWJQU2FmZUZyZWUodG1wX3Jvdyk7CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCisvLyBOb3RlOiBFeHBlY3RzICJlbmMtPnBhbGV0dGVfIiB0byBiZSBzZXQgcHJvcGVybHkuCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgTWFwSW1hZ2VGcm9tUGFsZXR0ZShWUDhMRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3BsYWNlKSB7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUgPSBlbmMtPnBhbGV0dGVfOworICBjb25zdCB1aW50MzJfdCogc3JjID0gaW5fcGxhY2UgPyBlbmMtPmFyZ2JfIDogcGljLT5hcmdiOworICBjb25zdCBpbnQgc3JjX3N0cmlkZSA9IGluX3BsYWNlID8gZW5jLT5jdXJyZW50X3dpZHRoXyA6IHBpYy0+YXJnYl9zdHJpZGU7CisgIGNvbnN0IGludCBwYWxldHRlX3NpemUgPSBlbmMtPnBhbGV0dGVfc2l6ZV87CisgIGludCB4Yml0czsKKworICAvLyBSZXBsYWNlIGVhY2ggaW5wdXQgcGl4ZWwgYnkgY29ycmVzcG9uZGluZyBwYWxldHRlIGluZGV4LgorICAvLyBUaGlzIGlzIGRvbmUgbGluZSBieSBsaW5lLgorICBpZiAocGFsZXR0ZV9zaXplIDw9IDQpIHsKKyAgICB4Yml0cyA9IChwYWxldHRlX3NpemUgPD0gMikgPyAzIDogMjsKKyAgfSBlbHNlIHsKKyAgICB4Yml0cyA9IChwYWxldHRlX3NpemUgPD0gMTYpID8gMSA6IDA7CisgIH0KKworICBlcnIgPSBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihlbmMsIFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB4Yml0cyksIGhlaWdodCk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgcmV0dXJuIGVycjsKKworICBlcnIgPSBBcHBseVBhbGV0dGUoc3JjLCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgZW5jLT5hcmdiXywgZW5jLT5jdXJyZW50X3dpZHRoXywKKyAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSwgd2lkdGgsIGhlaWdodCwgeGJpdHMpOworICByZXR1cm4gZXJyOworfQorCisvLyBTYXZlIHBhbGV0dGVfW10gdG8gYml0c3RyZWFtLgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEVuY29kZVBhbGV0dGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBpOworICB1aW50MzJfdCB0bXBfcGFsZXR0ZVtNQVhfUEFMRVRURV9TSVpFXTsKKyAgY29uc3QgaW50IHBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUgPSBlbmMtPnBhbGV0dGVfOworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNLCAyKTsKKyAgYXNzZXJ0KHBhbGV0dGVfc2l6ZSA+PSAxICYmIHBhbGV0dGVfc2l6ZSA8PSBNQVhfUEFMRVRURV9TSVpFKTsKKyAgVlA4TFB1dEJpdHMoYncsIHBhbGV0dGVfc2l6ZSAtIDEsIDgpOworICBmb3IgKGkgPSBwYWxldHRlX3NpemUgLSAxOyBpID49IDE7IC0taSkgeworICAgIHRtcF9wYWxldHRlW2ldID0gVlA4TFN1YlBpeGVscyhwYWxldHRlW2ldLCBwYWxldHRlW2kgLSAxXSk7CisgIH0KKyAgdG1wX3BhbGV0dGVbMF0gPSBwYWxldHRlWzBdOworICByZXR1cm4gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIHRtcF9wYWxldHRlLCAmZW5jLT5oYXNoX2NoYWluXywgZW5jLT5yZWZzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfc2l6ZSwgMSwgMjAgLyogcXVhbGl0eSAqLyk7Cit9CisKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworCitzdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgRW5jb2RlRGVsdGFQYWxldHRlUHJlZGljdG9ySW1hZ2UoCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsIFZQOExFbmNvZGVyKiBjb25zdCBlbmMsIGludCBxdWFsaXR5KSB7CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187CisgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKKworICBjb25zdCBpbnQgcHJlZF9iaXRzID0gNTsKKyAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBwcmVkX2JpdHMpOworICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgcHJlZF9iaXRzKTsKKyAgY29uc3QgaW50IHByZWQgPSA3OyAgIC8vIGRlZmF1bHQgaXMgUHJlZGljdG9yNyAoVG9wL0xlZnQgQXZlcmFnZSkKKyAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgcHJlZF9iaXRzKTsKKyAgY29uc3QgaW50IHRpbGVzX3Blcl9jb2wgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIHByZWRfYml0cyk7CisgIHVpbnQzMl90KiBwcmVkaWN0b3JzOworICBpbnQgdGlsZV94LCB0aWxlX3k7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisKKyAgcHJlZGljdG9ycyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModGlsZXNfcGVyX2NvbCAqIHRpbGVzX3Blcl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcHJlZGljdG9ycykpOworICBpZiAocHJlZGljdG9ycyA9PSBOVUxMKSByZXR1cm4gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworCisgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZXNfcGVyX2NvbDsgKyt0aWxlX3kpIHsKKyAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVzX3Blcl9yb3c7ICsrdGlsZV94KSB7CisgICAgICBwcmVkaWN0b3JzW3RpbGVfeSAqIHRpbGVzX3Blcl9yb3cgKyB0aWxlX3hdID0gMHhmZjAwMDAwMHUgfCAocHJlZCA8PCA4KTsKKyAgICB9CisgIH0KKworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgUFJFRElDVE9SX1RSQU5TRk9STSwgMik7CisgIFZQOExQdXRCaXRzKGJ3LCBwcmVkX2JpdHMgLSAyLCAzKTsKKyAgZXJyID0gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oYncsIHByZWRpY3RvcnMsICZlbmMtPmhhc2hfY2hhaW5fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVlA4TEJhY2t3YXJkUmVmcyopZW5jLT5yZWZzXywgIC8vIGNhc3QgY29uc3QgYXdheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fd2lkdGgsIHRyYW5zZm9ybV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICBXZWJQU2FmZUZyZWUocHJlZGljdG9ycyk7CisgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvLyBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEVuY29kZXIKKworc3RhdGljIFZQOExFbmNvZGVyKiBWUDhMRW5jb2Rlck5ldyhjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSAoVlA4TEVuY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZW5jKSk7CisgIGlmIChlbmMgPT0gTlVMTCkgeworICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZW5jLT5jb25maWdfID0gY29uZmlnOworICBlbmMtPnBpY18gPSBwaWN0dXJlOworCisgIFZQOExFbmNEc3BJbml0KCk7CisKKyAgcmV0dXJuIGVuYzsKK30KKworc3RhdGljIHZvaWQgVlA4TEVuY29kZXJEZWxldGUoVlA4TEVuY29kZXIqIGVuYykgeworICBpZiAoZW5jICE9IE5VTEwpIHsKKyAgICBWUDhMSGFzaENoYWluQ2xlYXIoJmVuYy0+aGFzaF9jaGFpbl8pOworICAgIFZQOExCYWNrd2FyZFJlZnNDbGVhcigmZW5jLT5yZWZzX1swXSk7CisgICAgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKCZlbmMtPnJlZnNfWzFdKTsKKyAgICBDbGVhclRyYW5zZm9ybUJ1ZmZlcihlbmMpOworICAgIFdlYlBTYWZlRnJlZShlbmMpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGwKKworV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IHVzZV9jYWNoZSkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCBpbnQgcXVhbGl0eSA9IChpbnQpY29uZmlnLT5xdWFsaXR5OworICBjb25zdCBpbnQgbG93X2VmZm9ydCA9IChjb25maWctPm1ldGhvZCA9PSAwKTsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSBWUDhMRW5jb2Rlck5ldyhjb25maWcsIHBpY3R1cmUpOworICBjb25zdCBzaXplX3QgYnl0ZV9wb3NpdGlvbiA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7CisgIGludCB1c2VfbmVhcl9sb3NzbGVzcyA9IDA7CisgIGludCBoZHJfc2l6ZSA9IDA7CisgIGludCBkYXRhX3NpemUgPSAwOworICBpbnQgdXNlX2RlbHRhX3BhbGV0dGl6YXRpb24gPSAwOworCisgIGlmIChlbmMgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIEFuYWx5emUgaW1hZ2UgKGVudHJvcHksIG51bV9wYWxldHRlcyBldGMpCisKKyAgaWYgKCFBbmFseXplQW5kSW5pdChlbmMpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBBcHBseSBuZWFyLWxvc3NsZXNzIHByZXByb2Nlc3NpbmcuCisgIHVzZV9uZWFyX2xvc3NsZXNzID0KKyAgICAgIChjb25maWctPm5lYXJfbG9zc2xlc3MgPCAxMDApICYmICFlbmMtPnVzZV9wYWxldHRlXyAmJiAhZW5jLT51c2VfcHJlZGljdF87CisgIGlmICh1c2VfbmVhcl9sb3NzbGVzcykgeworICAgIGlmICghVlA4QXBwbHlOZWFyTG9zc2xlc3Mod2lkdGgsIGhlaWdodCwgcGljdHVyZS0+YXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bmVhcl9sb3NzbGVzcykpIHsKKyAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworICBpZiAoY29uZmlnLT5kZWx0YV9wYWxldHRpemF0aW9uKSB7CisgICAgZW5jLT51c2VfcHJlZGljdF8gPSAxOworICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDA7CisgICAgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fID0gMDsKKyAgICBlbmMtPnVzZV9wYWxldHRlXyA9IDE7CisgICAgZXJyID0gTWFrZUlucHV0SW1hZ2VDb3B5KGVuYyk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgIGVyciA9IFdlYlBTZWFyY2hPcHRpbWFsRGVsdGFQYWxldHRlKGVuYyk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgeworICAgICAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIGVyciA9IEVuY29kZURlbHRhUGFsZXR0ZVByZWRpY3RvckltYWdlKGJ3LCBlbmMsIHF1YWxpdHkpOworICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgdXNlX2RlbHRhX3BhbGV0dGl6YXRpb24gPSAxOworICAgIH0KKyAgfQorI2VuZGlmICAvLyBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworCisgIC8vIEVuY29kZSBwYWxldHRlCisgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgeworICAgIGVyciA9IEVuY29kZVBhbGV0dGUoYncsIGVuYyk7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgIGVyciA9IE1hcEltYWdlRnJvbVBhbGV0dGUoZW5jLCB1c2VfZGVsdGFfcGFsZXR0aXphdGlvbik7CisgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICB9CisgIGlmICghdXNlX2RlbHRhX3BhbGV0dGl6YXRpb24pIHsKKyAgICAvLyBJbiBjYXNlIGltYWdlIGlzIG5vdCBwYWNrZWQuCisgICAgaWYgKGVuYy0+YXJnYl8gPT0gTlVMTCkgeworICAgICAgZXJyID0gTWFrZUlucHV0SW1hZ2VDb3B5KGVuYyk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEFwcGx5IHRyYW5zZm9ybXMgYW5kIHdyaXRlIHRyYW5zZm9ybSBkYXRhLgorCisgICAgaWYgKGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXykgeworICAgICAgQXBwbHlTdWJ0cmFjdEdyZWVuKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBidyk7CisgICAgfQorCisgICAgaWYgKGVuYy0+dXNlX3ByZWRpY3RfKSB7CisgICAgICBlcnIgPSBBcHBseVByZWRpY3RGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgZW5jLT51c2Vfc3VidHJhY3RfZ3JlZW5fLCBidyk7CisgICAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgeworICAgICAgZXJyID0gQXBwbHlDcm9zc0NvbG9yRmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHF1YWxpdHksIGJ3KTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKworICBWUDhMUHV0Qml0cyhidywgIVRSQU5TRk9STV9QUkVTRU5ULCAxKTsgIC8vIE5vIG1vcmUgdHJhbnNmb3Jtcy4KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRW5jb2RlIGFuZCB3cml0ZSB0aGUgdHJhbnNmb3JtZWQgaW1hZ2UuCisgIGVyciA9IEVuY29kZUltYWdlSW50ZXJuYWwoYncsIGVuYy0+YXJnYl8sICZlbmMtPmhhc2hfY2hhaW5fLCBlbmMtPnJlZnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgcXVhbGl0eSwgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY2FjaGUsICZlbmMtPmNhY2hlX2JpdHNfLCBlbmMtPmhpc3RvX2JpdHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfcG9zaXRpb24sICZoZHJfc2l6ZSwgJmRhdGFfc2l6ZSk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWN0dXJlLT5zdGF0czsKKyAgICBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgPSAwOworICAgIGlmIChlbmMtPnVzZV9wcmVkaWN0Xykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDE7CisgICAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDI7CisgICAgaWYgKGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDQ7CisgICAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gODsKKyAgICBzdGF0cy0+aGlzdG9ncmFtX2JpdHMgPSBlbmMtPmhpc3RvX2JpdHNfOworICAgIHN0YXRzLT50cmFuc2Zvcm1fYml0cyA9IGVuYy0+dHJhbnNmb3JtX2JpdHNfOworICAgIHN0YXRzLT5jYWNoZV9iaXRzID0gZW5jLT5jYWNoZV9iaXRzXzsKKyAgICBzdGF0cy0+cGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOworICAgIHN0YXRzLT5sb3NzbGVzc19zaXplID0gKGludCkoVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KSAtIGJ5dGVfcG9zaXRpb24pOworICAgIHN0YXRzLT5sb3NzbGVzc19oZHJfc2l6ZSA9IGhkcl9zaXplOworICAgIHN0YXRzLT5sb3NzbGVzc19kYXRhX3NpemUgPSBkYXRhX3NpemU7CisgIH0KKworIEVycm9yOgorICBWUDhMRW5jb2RlckRlbGV0ZShlbmMpOworICByZXR1cm4gZXJyOworfQorCitpbnQgVlA4TEVuY29kZUltYWdlKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIGludCBoYXNfYWxwaGE7CisgIHNpemVfdCBjb2RlZF9zaXplOworICBpbnQgcGVyY2VudCA9IDA7CisgIGludCBpbml0aWFsX3NpemU7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIFZQOExCaXRXcml0ZXIgYnc7CisKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IHBpY3R1cmUtPmFyZ2IgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVI7CisgICAgV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgZXJyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgLy8gSW5pdGlhbGl6ZSBCaXRXcml0ZXIgd2l0aCBzaXplIGNvcnJlc3BvbmRpbmcgdG8gMTYgYnBwIHRvIHBob3RvIGltYWdlcyBhbmQKKyAgLy8gOCBicHAgZm9yIGdyYXBoaWNhbCBpbWFnZXMuCisgIGluaXRpYWxfc2l6ZSA9IChjb25maWctPmltYWdlX2hpbnQgPT0gV0VCUF9ISU5UX0dSQVBIKSA/CisgICAgICB3aWR0aCAqIGhlaWdodCA6IHdpZHRoICogaGVpZ2h0ICogMjsKKyAgaWYgKCFWUDhMQml0V3JpdGVySW5pdCgmYncsIGluaXRpYWxfc2l6ZSkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEsICZwZXJjZW50KSkgeworIFVzZXJBYm9ydDoKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX1VTRVJfQUJPUlQ7CisgICAgZ290byBFcnJvcjsKKyAgfQorICAvLyBSZXNldCBzdGF0cyAoZm9yIHB1cmUgbG9zc2xlc3MgY29kaW5nKQorICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWN0dXJlLT5zdGF0czsKKyAgICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgICBzdGF0cy0+UFNOUlswXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbMV0gPSA5OS5mOworICAgIHN0YXRzLT5QU05SWzJdID0gOTkuZjsKKyAgICBzdGF0cy0+UFNOUlszXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbNF0gPSA5OS5mOworICB9CisKKyAgLy8gV3JpdGUgaW1hZ2Ugc2l6ZS4KKyAgaWYgKCFXcml0ZUltYWdlU2l6ZShwaWN0dXJlLCAmYncpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBoYXNfYWxwaGEgPSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShwaWN0dXJlKTsKKyAgLy8gV3JpdGUgdGhlIG5vbi10cml2aWFsIEFscGhhIGZsYWcgYW5kIGxvc3NsZXNzIHZlcnNpb24uCisgIGlmICghV3JpdGVSZWFsQWxwaGFBbmRWZXJzaW9uKCZidywgaGFzX2FscGhhKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgNSwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBFbmNvZGUgbWFpbiBpbWFnZSBzdHJlYW0uCisgIGVyciA9IFZQOExFbmNvZGVTdHJlYW0oY29uZmlnLCBwaWN0dXJlLCAmYncsIDEgLyp1c2VfY2FjaGUqLyk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKworICAvLyBUT0RPKHNrYWwpOiBoYXZlIGEgZmluZS1ncmFpbmVkIHByb2dyZXNzIHJlcG9ydCBpbiBWUDhMRW5jb2RlU3RyZWFtKCkuCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDkwLCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OworCisgIC8vIEZpbmlzaCB0aGUgUklGRiBjaHVuay4KKyAgZXJyID0gV3JpdGVJbWFnZShwaWN0dXJlLCAmYncsICZjb2RlZF9zaXplKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEwMCwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworICAvLyBTYXZlIHNpemUuCisgIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgcGljdHVyZS0+c3RhdHMtPmNvZGVkX3NpemUgKz0gKGludCljb2RlZF9zaXplOworICAgIHBpY3R1cmUtPnN0YXRzLT5sb3NzbGVzc19zaXplID0gKGludCljb2RlZF9zaXplOworICB9CisKKyAgaWYgKHBpY3R1cmUtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBtYl93ID0gKHdpZHRoICsgMTUpID4+IDQ7CisgICAgY29uc3QgaW50IG1iX2ggPSAoaGVpZ2h0ICsgMTUpID4+IDQ7CisgICAgbWVtc2V0KHBpY3R1cmUtPmV4dHJhX2luZm8sIDAsIG1iX3cgKiBtYl9oICogc2l6ZW9mKCpwaWN0dXJlLT5leHRyYV9pbmZvKSk7CisgIH0KKworIEVycm9yOgorICBpZiAoYncuZXJyb3JfKSBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZidyk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgeworICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIGVycik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4bGkuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy92cDhsaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDJlYjQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4bGkuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTG9zc2xlc3MgZW5jb2RlcjogaW50ZXJuYWwgaGVhZGVyLgorLy8KKy8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9FTkNfVlA4TElfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9FTkNfVlA4TElfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZ187ICAgICAgLy8gdXNlciBjb25maWd1cmF0aW9uIGFuZCBwYXJhbWV0ZXJzCisgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWNfOyAgICAgICAgLy8gaW5wdXQgcGljdHVyZS4KKworICB1aW50MzJfdCogYXJnYl87ICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybWVkIGFyZ2IgaW1hZ2UgZGF0YS4KKyAgdWludDMyX3QqIGFyZ2Jfc2NyYXRjaF87ICAgICAgICAvLyBTY3JhdGNoIG1lbW9yeSBmb3IgYXJnYiByb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHVzZWQgZm9yIHByZWRpY3Rpb24pLgorICB1aW50MzJfdCogdHJhbnNmb3JtX2RhdGFfOyAgICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciB0cmFuc2Zvcm0gZGF0YS4KKyAgdWludDMyX3QqIHRyYW5zZm9ybV9tZW1fOyAgICAgICAvLyBDdXJyZW50bHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAgc2l6ZV90ICAgIHRyYW5zZm9ybV9tZW1fc2l6ZV87ICAvLyBDdXJyZW50bHkgYWxsb2NhdGVkIG1lbW9yeSBzaXplLgorCisgIGludCAgICAgICBjdXJyZW50X3dpZHRoXzsgICAgICAgLy8gQ29ycmVzcG9uZHMgdG8gcGFja2VkIGltYWdlIHdpZHRoLgorCisgIC8vIEVuY29kaW5nIHBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIHF1YWxpdHkgcGFyYW1ldGVyLgorICBpbnQgaGlzdG9fYml0c187CisgIGludCB0cmFuc2Zvcm1fYml0c187CisgIGludCBjYWNoZV9iaXRzXzsgICAgICAgIC8vIElmIGVxdWFsIHRvIDAsIGRvbid0IHVzZSBjb2xvciBjYWNoZS4KKworICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MuCisgIGludCB1c2VfY3Jvc3NfY29sb3JfOworICBpbnQgdXNlX3N1YnRyYWN0X2dyZWVuXzsKKyAgaW50IHVzZV9wcmVkaWN0XzsKKyAgaW50IHVzZV9wYWxldHRlXzsKKyAgaW50IHBhbGV0dGVfc2l6ZV87CisgIHVpbnQzMl90IHBhbGV0dGVfW01BWF9QQUxFVFRFX1NJWkVdOworCisgIC8vIFNvbWUgJ3NjcmF0Y2gnIChwb3RlbnRpYWxseSBsYXJnZSkgb2JqZWN0cy4KKyAgc3RydWN0IFZQOExCYWNrd2FyZFJlZnMgcmVmc19bMl07ICAvLyBCYWNrd2FyZCBSZWZzIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMWjc3ICYgUkxFIGNvZGluZy4KKyAgVlA4TEhhc2hDaGFpbiBoYXNoX2NoYWluXzsgICAgICAgICAvLyBIYXNoQ2hhaW4gZGF0YSBmb3IgY29uc3RydWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmQgcmVmZXJlbmNlcy4KK30gVlA4TEVuY29kZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCisKKy8vIEVuY29kZXMgdGhlIHBpY3R1cmUuCisvLyBSZXR1cm5zIDAgaWYgY29uZmlnIG9yIHBpY3R1cmUgaXMgTlVMTCBvciBwaWN0dXJlIGRvZXNuJ3QgaGF2ZSB2YWxpZCBhcmdiCisvLyBpbnB1dC4KK2ludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7CisKKy8vIEVuY29kZXMgdGhlIG1haW4gaW1hZ2Ugc3RyZWFtIHVzaW5nIHRoZSBzdXBwbGllZCBiaXQgd3JpdGVyLgorLy8gSWYgJ3VzZV9jYWNoZScgaXMgZmFsc2UsIGRpc2FibGVzIHRoZSB1c2Ugb2YgY29sb3IgY2FjaGUuCitXZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdXNlX2NhY2hlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfRU5DX1ZQOExJX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvd2VicGVuYy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3dlYnBlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ1YmZiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3dlYnBlbmMuYwpAQCAtMCwwICsxLDM5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlAgZW5jb2RlcjogbWFpbiBlbnRyeSBwb2ludAorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2VuYy9jb3N0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9lbmMvdnA4ZW5jaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZW5jL3ZwOGxpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisvLyAjZGVmaW5lIFBSSU5UX01FTU9SWV9JTkZPCisKKyNpZmRlZiBQUklOVF9NRU1PUllfSU5GTworI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBHZXRFbmNvZGVyVmVyc2lvbih2b2lkKSB7CisgIHJldHVybiAoRU5DX01BSl9WRVJTSU9OIDw8IDE2KSB8IChFTkNfTUlOX1ZFUlNJT04gPDwgOCkgfCBFTkNfUkVWX1ZFUlNJT047Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhFbmNvZGVyCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1NlZ21lbnRIZWFkZXIqIGNvbnN0IGhkciA9ICZlbmMtPnNlZ21lbnRfaGRyXzsKKyAgaGRyLT5udW1fc2VnbWVudHNfID0gZW5jLT5jb25maWdfLT5zZWdtZW50czsKKyAgaGRyLT51cGRhdGVfbWFwXyAgPSAoaGRyLT5udW1fc2VnbWVudHNfID4gMSk7CisgIGhkci0+c2l6ZV8gPSAwOworfQorCitzdGF0aWMgdm9pZCBSZXNldEZpbHRlckhlYWRlcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jRmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5maWx0ZXJfaGRyXzsKKyAgaGRyLT5zaW1wbGVfID0gMTsKKyAgaGRyLT5sZXZlbF8gPSAwOworICBoZHItPnNoYXJwbmVzc18gPSAwOworICBoZHItPmk0eDRfbGZfZGVsdGFfID0gMDsKK30KKworc3RhdGljIHZvaWQgUmVzZXRCb3VuZGFyeVByZWRpY3Rpb25zKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICAvLyBpbml0IGJvdW5kYXJ5IHZhbHVlcyBvbmNlIGZvciBhbGwKKyAgLy8gTm90ZTogYWN0dWFsbHksIGluaXRpYWxpemluZyB0aGUgcHJlZHNfW10gaXMgb25seSBuZWVkZWQgZm9yIGludHJhNC4KKyAgaW50IGk7CisgIHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGVuYy0+cHJlZHNfIC0gZW5jLT5wcmVkc193XzsKKyAgdWludDhfdCogY29uc3QgbGVmdCA9IGVuYy0+cHJlZHNfIC0gMTsKKyAgZm9yIChpID0gLTE7IGkgPCA0ICogZW5jLT5tYl93XzsgKytpKSB7CisgICAgdG9wW2ldID0gQl9EQ19QUkVEOworICB9CisgIGZvciAoaSA9IDA7IGkgPCA0ICogZW5jLT5tYl9oXzsgKytpKSB7CisgICAgbGVmdFtpICogZW5jLT5wcmVkc193X10gPSBCX0RDX1BSRUQ7CisgIH0KKyAgZW5jLT5uel9bLTFdID0gMDsgICAvLyBjb25zdGFudAorfQorCisvLyBNYXBwaW5nIGZyb20gY29uZmlnLT5tZXRob2RfIHRvIGNvZGluZyB0b29scyB1c2VkLgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vICAgTWV0aG9kICAgICAgICAgIHwgMCB8IDEgfCAyIHwgMyB8KDQpfCA1IHwgNiB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gZmFzdCBwcm9iZSAgICAgICAgfCB4IHwgICB8ICAgfCB4IHwgICB8ICAgfCAgIHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyBkeW5hbWljIHByb2JhICAgICB8IH4gfCB4IHwgeCB8IHggfCB4IHwgeCB8IHggfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGZhc3QgbW9kZSBhbmFseXNpc3wgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gYmFzaWMgcmQtb3B0ICAgICAgfCAgIHwgICB8ICAgfCB4IHwgeCB8IHggfCB4IHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyBkaXN0by1yZWZpbmUgaTQvMTZ8IHggfCB4IHwgeCB8ICAgfCAgIHwgICB8ICAgfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIGRpc3RvLXJlZmluZSB1diAgIHwgICB8IHggfCB4IHwgICB8ICAgfCAgIHwgICB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gcmQtb3B0IGk0LzE2ICAgICAgfCAgIHwgICB8IH4gfCB4IHwgeCB8IHggfCB4IHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisvLyB0b2tlbiBidWZmZXIgKG9wdCl8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8IHggfAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKy8vIFRyZWxsaXMgICAgICAgICAgIHwgICB8ICAgfCAgIHwgICB8ICAgfCB4IHxGdWx8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gZnVsbC1TTlMgICAgICAgICAgfCAgIHwgICB8ICAgfCAgIHwgeCB8IHggfCB4IHwKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCisKK3N0YXRpYyB2b2lkIE1hcENvbmZpZ1RvVG9vbHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGNvbmZpZy0+bWV0aG9kOworICBjb25zdCBpbnQgbGltaXQgPSAxMDAgLSBjb25maWctPnBhcnRpdGlvbl9saW1pdDsKKyAgZW5jLT5tZXRob2RfID0gbWV0aG9kOworICBlbmMtPnJkX29wdF9sZXZlbF8gPSAobWV0aG9kID49IDYpID8gUkRfT1BUX1RSRUxMSVNfQUxMCisgICAgICAgICAgICAgICAgICAgICA6IChtZXRob2QgPj0gNSkgPyBSRF9PUFRfVFJFTExJUworICAgICAgICAgICAgICAgICAgICAgOiAobWV0aG9kID49IDMpID8gUkRfT1BUX0JBU0lDCisgICAgICAgICAgICAgICAgICAgICA6IFJEX09QVF9OT05FOworICBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPQorICAgICAgMjU2ICogMTYgKiAxNiAqICAgICAgICAgICAgICAgICAvLyB1cHBlciBib3VuZDogdXAgdG8gMTZiaXQgcGVyIDR4NCBibG9jaworICAgICAgKGxpbWl0ICogbGltaXQpIC8gKDEwMCAqIDEwMCk7ICAvLyAuLi4gbW9kdWxhdGVkIHdpdGggYSBxdWFkcmF0aWMgY3VydmUuCisKKyAgLy8gcGFydGl0aW9uMCA9IDUxMmsgbWF4LgorICBlbmMtPm1iX2hlYWRlcl9saW1pdF8gPQorICAgICAgKHNjb3JlX3QpMjU2ICogNTEwICogOCAqIDEwMjQgLyAoZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8pOworCisgIGVuYy0+dGhyZWFkX2xldmVsXyA9IGNvbmZpZy0+dGhyZWFkX2xldmVsOworCisgIGVuYy0+ZG9fc2VhcmNoXyA9IChjb25maWctPnRhcmdldF9zaXplID4gMCB8fCBjb25maWctPnRhcmdldF9QU05SID4gMCk7CisgIGlmICghY29uZmlnLT5sb3dfbWVtb3J5KSB7CisjaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCisgICAgZW5jLT51c2VfdG9rZW5zXyA9IChlbmMtPnJkX29wdF9sZXZlbF8gPj0gUkRfT1BUX0JBU0lDKTsgIC8vIG5lZWQgcmQgc3RhdHMKKyNlbmRpZgorICAgIGlmIChlbmMtPnVzZV90b2tlbnNfKSB7CisgICAgICBlbmMtPm51bV9wYXJ0c18gPSAxOyAgIC8vIGRvZXNuJ3Qgd29yayB3aXRoIG11bHRpLXBhcnRpdGlvbgorICAgIH0KKyAgfQorfQorCisvLyBNZW1vcnkgc2NhbGluZyB3aXRoIGRpbWVuc2lvbnM6CisvLyAgbWVtb3J5IChieXRlcykgfj0gMi4yNSAqIHcgKyAwLjA2MjUgKiB3ICogaAorLy8KKy8vIFR5cGljYWwgbWVtb3J5IGZvb3RwcmludCAoNjE0eDQ0MCBwaWN0dXJlKQorLy8gICAgICAgICAgICAgIGVuY29kZXI6IDIyMTExCisvLyAgICAgICAgICAgICAgICAgaW5mbzogNDM2OAorLy8gICAgICAgICAgICAgICAgcHJlZHM6IDE3NzQxCisvLyAgICAgICAgICB0b3Agc2FtcGxlczogMTI2MworLy8gICAgICAgICAgICAgbm9uLXplcm86IDE3NQorLy8gICAgICAgICAgICAgbGYtc3RhdHM6IDAKKy8vICAgICAgICAgICAgICAgIHRvdGFsOiA0NTY1OAorLy8gVHJhbnNpZW50IG9iamVjdCBzaXplczoKKy8vICAgICAgIFZQOEVuY0l0ZXJhdG9yOiAzMzYwCisvLyAgICAgICAgIFZQOE1vZGVTY29yZTogODcyCisvLyAgICAgICBWUDhTZWdtZW50SW5mbzogNzMyCisvLyAgICAgICAgICBWUDhFbmNQcm9iYTogMTgzNTIKKy8vICAgICAgICAgICAgICBMRlN0YXRzOiAyMDQ4CisvLyBQaWN0dXJlIHNpemUgKHl1dik6IDQxOTMyOAorCitzdGF0aWMgVlA4RW5jb2RlciogSW5pdFZQOEVuY29kZXIoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIFZQOEVuY29kZXIqIGVuYzsKKyAgY29uc3QgaW50IHVzZV9maWx0ZXIgPQorICAgICAgKGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID4gMCkgfHwgKGNvbmZpZy0+YXV0b2ZpbHRlciA+IDApOworICBjb25zdCBpbnQgbWJfdyA9IChwaWN0dXJlLT53aWR0aCArIDE1KSA+PiA0OworICBjb25zdCBpbnQgbWJfaCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxNSkgPj4gNDsKKyAgY29uc3QgaW50IHByZWRzX3cgPSA0ICogbWJfdyArIDE7CisgIGNvbnN0IGludCBwcmVkc19oID0gNCAqIG1iX2ggKyAxOworICBjb25zdCBzaXplX3QgcHJlZHNfc2l6ZSA9IHByZWRzX3cgKiBwcmVkc19oICogc2l6ZW9mKCplbmMtPnByZWRzXyk7CisgIGNvbnN0IGludCB0b3Bfc3RyaWRlID0gbWJfdyAqIDE2OworICBjb25zdCBzaXplX3Qgbnpfc2l6ZSA9IChtYl93ICsgMSkgKiBzaXplb2YoKmVuYy0+bnpfKSArIFdFQlBfQUxJR05fQ1NUOworICBjb25zdCBzaXplX3QgaW5mb19zaXplID0gbWJfdyAqIG1iX2ggKiBzaXplb2YoKmVuYy0+bWJfaW5mb18pOworICBjb25zdCBzaXplX3Qgc2FtcGxlc19zaXplID0KKyAgICAgIDIgKiB0b3Bfc3RyaWRlICogc2l6ZW9mKCplbmMtPnlfdG9wXykgIC8vIHRvcC1sdW1hL3UvdgorICAgICAgKyBXRUJQX0FMSUdOX0NTVDsgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ24gYWxsCisgIGNvbnN0IHNpemVfdCBsZl9zdGF0c19zaXplID0KKyAgICAgIGNvbmZpZy0+YXV0b2ZpbHRlciA/IHNpemVvZigqZW5jLT5sZl9zdGF0c18pICsgV0VCUF9BTElHTl9DU1QgOiAwOworICB1aW50OF90KiBtZW07CisgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpc2l6ZW9mKCplbmMpICAgLy8gbWFpbiBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICArIFdFQlBfQUxJR05fQ1NUICAgICAgICAgICAvLyBjYWNoZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICArIGluZm9fc2l6ZSAgICAgICAgICAgICAgICAvLyBtb2RlcyBpbmZvCisgICAgICAgICAgICAgICAgICAgICAgKyBwcmVkc19zaXplICAgICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBtb2RlcworICAgICAgICAgICAgICAgICAgICAgICsgc2FtcGxlc19zaXplICAgICAgICAgICAgIC8vIHRvcC9sZWZ0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICArIG56X3NpemUgICAgICAgICAgICAgICAgICAvLyBjb2VmZiBjb250ZXh0IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICArIGxmX3N0YXRzX3NpemU7ICAgICAgICAgICAvLyBhdXRvZmlsdGVyIHN0YXRzCisKKyNpZmRlZiBQUklOVF9NRU1PUllfSU5GTworICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgcHJpbnRmKCJNZW1vcnkgdXNlZDpcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgZW5jb2RlcjogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgIGluZm86ICVsZFxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgIHByZWRzOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICB0b3Agc2FtcGxlczogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgbm9uLXplcm86ICVsZFxuIgorICAgICAgICAgIiAgICAgICAgICAgIGxmLXN0YXRzOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICB0b3RhbDogJWxkXG4iLAorICAgICAgICAgc2l6ZW9mKCplbmMpICsgV0VCUF9BTElHTl9DU1QsIGluZm9fc2l6ZSwKKyAgICAgICAgIHByZWRzX3NpemUsIHNhbXBsZXNfc2l6ZSwgbnpfc2l6ZSwgbGZfc3RhdHNfc2l6ZSwgc2l6ZSk7CisgIHByaW50ZigiVHJhbnNpZW50IG9iamVjdCBzaXplczpcbiIKKyAgICAgICAgICIgICAgICBWUDhFbmNJdGVyYXRvcjogJWxkXG4iCisgICAgICAgICAiICAgICAgICBWUDhNb2RlU2NvcmU6ICVsZFxuIgorICAgICAgICAgIiAgICAgIFZQOFNlZ21lbnRJbmZvOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICBWUDhFbmNQcm9iYTogJWxkXG4iCisgICAgICAgICAiICAgICAgICAgICAgIExGU3RhdHM6ICVsZFxuIiwKKyAgICAgICAgIHNpemVvZihWUDhFbmNJdGVyYXRvciksIHNpemVvZihWUDhNb2RlU2NvcmUpLAorICAgICAgICAgc2l6ZW9mKFZQOFNlZ21lbnRJbmZvKSwgc2l6ZW9mKFZQOEVuY1Byb2JhKSwKKyAgICAgICAgIHNpemVvZihMRlN0YXRzKSk7CisgIHByaW50ZigiUGljdHVyZSBzaXplICh5dXYpOiAlbGRcbiIsCisgICAgICAgICBtYl93ICogbWJfaCAqIDM4NCAqIHNpemVvZih1aW50OF90KSk7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworI2VuZGlmCisgIG1lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhzaXplLCBzaXplb2YoKm1lbSkpOworICBpZiAobWVtID09IE5VTEwpIHsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICAgIHJldHVybiBOVUxMOworICB9CisgIGVuYyA9IChWUDhFbmNvZGVyKiltZW07CisgIG1lbSA9ICh1aW50OF90KilXRUJQX0FMSUdOKG1lbSArIHNpemVvZigqZW5jKSk7CisgIG1lbXNldChlbmMsIDAsIHNpemVvZigqZW5jKSk7CisgIGVuYy0+bnVtX3BhcnRzXyA9IDEgPDwgY29uZmlnLT5wYXJ0aXRpb25zOworICBlbmMtPm1iX3dfID0gbWJfdzsKKyAgZW5jLT5tYl9oXyA9IG1iX2g7CisgIGVuYy0+cHJlZHNfd18gPSBwcmVkc193OworICBlbmMtPm1iX2luZm9fID0gKFZQOE1CSW5mbyopbWVtOworICBtZW0gKz0gaW5mb19zaXplOworICBlbmMtPnByZWRzXyA9ICgodWludDhfdCopbWVtKSArIDEgKyBlbmMtPnByZWRzX3dfOworICBtZW0gKz0gcHJlZHNfc2l6ZTsKKyAgZW5jLT5uel8gPSAxICsgKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSk7CisgIG1lbSArPSBuel9zaXplOworICBlbmMtPmxmX3N0YXRzXyA9IGxmX3N0YXRzX3NpemUgPyAoTEZTdGF0cyopV0VCUF9BTElHTihtZW0pIDogTlVMTDsKKyAgbWVtICs9IGxmX3N0YXRzX3NpemU7CisKKyAgLy8gdG9wIHNhbXBsZXMgKGFsbCAxNi1hbGlnbmVkKQorICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0pOworICBlbmMtPnlfdG9wXyA9ICh1aW50OF90KiltZW07CisgIGVuYy0+dXZfdG9wXyA9IGVuYy0+eV90b3BfICsgdG9wX3N0cmlkZTsKKyAgbWVtICs9IDIgKiB0b3Bfc3RyaWRlOworICBhc3NlcnQobWVtIDw9ICh1aW50OF90KillbmMgKyBzaXplKTsKKworICBlbmMtPmNvbmZpZ18gPSBjb25maWc7CisgIGVuYy0+cHJvZmlsZV8gPSB1c2VfZmlsdGVyID8gKChjb25maWctPmZpbHRlcl90eXBlID09IDEpID8gMCA6IDEpIDogMjsKKyAgZW5jLT5waWNfID0gcGljdHVyZTsKKyAgZW5jLT5wZXJjZW50XyA9IDA7CisKKyAgTWFwQ29uZmlnVG9Ub29scyhlbmMpOworICBWUDhFbmNEc3BJbml0KCk7CisgIFZQOERlZmF1bHRQcm9iYXMoZW5jKTsKKyAgUmVzZXRTZWdtZW50SGVhZGVyKGVuYyk7CisgIFJlc2V0RmlsdGVySGVhZGVyKGVuYyk7CisgIFJlc2V0Qm91bmRhcnlQcmVkaWN0aW9ucyhlbmMpOworICBWUDhFbmNEc3BDb3N0SW5pdCgpOworICBWUDhFbmNJbml0QWxwaGEoZW5jKTsKKworICAvLyBsb3dlciBxdWFsaXR5IG1lYW5zIHNtYWxsZXIgb3V0cHV0IC0+IHdlIG1vZHVsYXRlIGEgbGl0dGxlIHRoZSBwYWdlCisgIC8vIHNpemUgYmFzZWQgb24gcXVhbGl0eS4gVGhpcyBpcyBqdXN0IGEgY3J1ZGUgMXJzdC1vcmRlciBwcmVkaWN0aW9uLgorICB7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSAxLmYgKyBjb25maWctPnF1YWxpdHkgKiA1LmYgLyAxMDAuZjsgIC8vIGluIFsxLDZdCisgICAgVlA4VEJ1ZmZlckluaXQoJmVuYy0+dG9rZW5zXywgKGludCkobWJfdyAqIG1iX2ggKiA0ICogc2NhbGUpKTsKKyAgfQorICByZXR1cm4gZW5jOworfQorCitzdGF0aWMgaW50IERlbGV0ZVZQOEVuY29kZXIoVlA4RW5jb2RlciogZW5jKSB7CisgIGludCBvayA9IDE7CisgIGlmIChlbmMgIT0gTlVMTCkgeworICAgIG9rID0gVlA4RW5jRGVsZXRlQWxwaGEoZW5jKTsKKyAgICBWUDhUQnVmZmVyQ2xlYXIoJmVuYy0+dG9rZW5zXyk7CisgICAgV2ViUFNhZmVGcmVlKGVuYyk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlIEdldFBTTlIodWludDY0X3QgZXJyLCB1aW50NjRfdCBzaXplKSB7CisgIHJldHVybiAoZXJyID4gMCAmJiBzaXplID4gMCkgPyAxMC4gKiBsb2cxMCgyNTUuICogMjU1LiAqIHNpemUgLyBlcnIpIDogOTkuOworfQorCitzdGF0aWMgdm9pZCBGaW5hbGl6ZVBTTlIoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFdlYlBBdXhTdGF0cyogc3RhdHMgPSBlbmMtPnBpY18tPnN0YXRzOworICBjb25zdCB1aW50NjRfdCBzaXplID0gZW5jLT5zc2VfY291bnRfOworICBjb25zdCB1aW50NjRfdCogY29uc3Qgc3NlID0gZW5jLT5zc2VfOworICBzdGF0cy0+UFNOUlswXSA9IChmbG9hdClHZXRQU05SKHNzZVswXSwgc2l6ZSk7CisgIHN0YXRzLT5QU05SWzFdID0gKGZsb2F0KUdldFBTTlIoc3NlWzFdLCBzaXplIC8gNCk7CisgIHN0YXRzLT5QU05SWzJdID0gKGZsb2F0KUdldFBTTlIoc3NlWzJdLCBzaXplIC8gNCk7CisgIHN0YXRzLT5QU05SWzNdID0gKGZsb2F0KUdldFBTTlIoc3NlWzBdICsgc3NlWzFdICsgc3NlWzJdLCBzaXplICogMyAvIDIpOworICBzdGF0cy0+UFNOUls0XSA9IChmbG9hdClHZXRQU05SKHNzZVszXSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlU3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBlbmMtPnBpY18tPnN0YXRzOworICBpZiAoc3RhdHMgIT0gTlVMTCkgeworICAgIGludCBpLCBzOworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUJfU0VHTUVOVFM7ICsraSkgeworICAgICAgc3RhdHMtPnNlZ21lbnRfbGV2ZWxbaV0gPSBlbmMtPmRxbV9baV0uZnN0cmVuZ3RoXzsKKyAgICAgIHN0YXRzLT5zZWdtZW50X3F1YW50W2ldID0gZW5jLT5kcW1fW2ldLnF1YW50XzsKKyAgICAgIGZvciAocyA9IDA7IHMgPD0gMjsgKytzKSB7CisgICAgICAgIHN0YXRzLT5yZXNpZHVhbF9ieXRlc1tzXVtpXSA9IGVuYy0+cmVzaWR1YWxfYnl0ZXNfW3NdW2ldOworICAgICAgfQorICAgIH0KKyAgICBGaW5hbGl6ZVBTTlIoZW5jKTsKKyAgICBzdGF0cy0+Y29kZWRfc2l6ZSA9IGVuYy0+Y29kZWRfc2l6ZV87CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgc3RhdHMtPmJsb2NrX2NvdW50W2ldID0gZW5jLT5ibG9ja19jb3VudF9baV07CisgICAgfQorICB9CisgIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIDEwMCwgJmVuYy0+cGVyY2VudF8pOyAgLy8gZG9uZSEKK30KKworaW50IFdlYlBFbmNvZGluZ1NldEVycm9yKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kaW5nRXJyb3IgZXJyb3IpIHsKKyAgYXNzZXJ0KChpbnQpZXJyb3IgPCBWUDhfRU5DX0VSUk9SX0xBU1QpOworICBhc3NlcnQoKGludCllcnJvciA+PSBWUDhfRU5DX09LKTsKKyAgKChXZWJQUGljdHVyZSopcGljKS0+ZXJyb3JfY29kZSA9IGVycm9yOworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBSZXBvcnRQcm9ncmVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGVyY2VudCwgaW50KiBjb25zdCBwZXJjZW50X3N0b3JlKSB7CisgIGlmIChwZXJjZW50X3N0b3JlICE9IE5VTEwgJiYgcGVyY2VudCAhPSAqcGVyY2VudF9zdG9yZSkgeworICAgICpwZXJjZW50X3N0b3JlID0gcGVyY2VudDsKKyAgICBpZiAocGljLT5wcm9ncmVzc19ob29rICYmICFwaWMtPnByb2dyZXNzX2hvb2socGVyY2VudCwgcGljKSkgeworICAgICAgLy8gdXNlciBhYm9ydCByZXF1ZXN0ZWQKKyAgICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9VU0VSX0FCT1JUKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsgIC8vIG9rCit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEVuY29kZShjb25zdCBXZWJQQ29uZmlnKiBjb25maWcsIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IG9rID0gMDsKKworICBpZiAocGljID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19PSyk7ICAvLyBhbGwgb2sgc28gZmFyCisgIGlmIChjb25maWcgPT0gTlVMTCkgIC8vIGJhZCBwYXJhbXMKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKKyAgaWYgKCFXZWJQVmFsaWRhdGVDb25maWcoY29uZmlnKSkKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7CisgIGlmIChwaWMtPndpZHRoIDw9IDAgfHwgcGljLT5oZWlnaHQgPD0gMCkKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICBpZiAocGljLT53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBwaWMtPmhlaWdodCA+IFdFQlBfTUFYX0RJTUVOU0lPTikKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworCisgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIG1lbXNldChwaWMtPnN0YXRzLCAwLCBzaXplb2YoKnBpYy0+c3RhdHMpKTsKKworICBpZiAoIWNvbmZpZy0+bG9zc2xlc3MpIHsKKyAgICBWUDhFbmNvZGVyKiBlbmMgPSBOVUxMOworCisgICAgaWYgKCFjb25maWctPmV4YWN0KSB7CisgICAgICBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShwaWMpOworICAgIH0KKworICAgIGlmIChwaWMtPnVzZV9hcmdiIHx8IHBpYy0+eSA9PSBOVUxMIHx8IHBpYy0+dSA9PSBOVUxMIHx8IHBpYy0+diA9PSBOVUxMKSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBZVVZBIHNhbXBsZXMuCisgICAgICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nICYgNCkgeworICAgICAgICBpZiAoIVdlYlBQaWN0dXJlU21hcnRBUkdCVG9ZVVZBKHBpYykpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQgZGl0aGVyaW5nID0gMC5mOworICAgICAgICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nICYgMikgeworICAgICAgICAgIGNvbnN0IGZsb2F0IHggPSBjb25maWctPnF1YWxpdHkgLyAxMDAuZjsKKyAgICAgICAgICBjb25zdCBmbG9hdCB4MiA9IHggKiB4OworICAgICAgICAgIC8vIHNsb3dseSBkZWNyZWFzaW5nIGZyb20gbWF4IGRpdGhlcmluZyBhdCBsb3cgcXVhbGl0eSAocS0+MCkKKyAgICAgICAgICAvLyB0byAwLjUgZGl0aGVyaW5nIGFtcGxpdHVkZSBhdCBoaWdoIHF1YWxpdHkgKHEtPjEwMCkKKyAgICAgICAgICBkaXRoZXJpbmcgPSAxLjBmICsgKDAuNWYgLSAxLjBmKSAqIHgyICogeDI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFXZWJQUGljdHVyZUFSR0JUb1lVVkFEaXRoZXJlZChwaWMsIFdFQlBfWVVWNDIwLCBkaXRoZXJpbmcpKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBlbmMgPSBJbml0VlA4RW5jb2Rlcihjb25maWcsIHBpYyk7CisgICAgaWYgKGVuYyA9PSBOVUxMKSByZXR1cm4gMDsgIC8vIHBpYy0+ZXJyb3IgaXMgYWxyZWFkeSBzZXQuCisgICAgLy8gTm90ZTogZWFjaCBvZiB0aGUgdGFza3MgYmVsb3cgYWNjb3VudCBmb3IgMjAlIGluIHRoZSBwcm9ncmVzcyByZXBvcnQuCisgICAgb2sgPSBWUDhFbmNBbmFseXplKGVuYyk7CisKKyAgICAvLyBBbmFseXNpcyBpcyBkb25lLCBwcm9jZWVkIHRvIGFjdHVhbCBjb2RpbmcuCisgICAgb2sgPSBvayAmJiBWUDhFbmNTdGFydEFscGhhKGVuYyk7ICAgLy8gcG9zc2libHkgZG9uZSBpbiBwYXJhbGxlbAorICAgIGlmICghZW5jLT51c2VfdG9rZW5zXykgeworICAgICAgb2sgPSBvayAmJiBWUDhFbmNMb29wKGVuYyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG9rID0gb2sgJiYgVlA4RW5jVG9rZW5Mb29wKGVuYyk7CisgICAgfQorICAgIG9rID0gb2sgJiYgVlA4RW5jRmluaXNoQWxwaGEoZW5jKTsKKworICAgIG9rID0gb2sgJiYgVlA4RW5jV3JpdGUoZW5jKTsKKyAgICBTdG9yZVN0YXRzKGVuYyk7CisgICAgaWYgKCFvaykgeworICAgICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsKKyAgICB9CisgICAgb2sgJj0gRGVsZXRlVlA4RW5jb2RlcihlbmMpOyAgLy8gbXVzdCBhbHdheXMgYmUgY2FsbGVkLCBldmVuIGlmICFvaworICB9IGVsc2UgeworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIEFSR0Igc2FtcGxlcy4KKyAgICBpZiAocGljLT5hcmdiID09IE5VTEwgJiYgIVdlYlBQaWN0dXJlWVVWQVRvQVJHQihwaWMpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWNvbmZpZy0+ZXhhY3QpIHsKKyAgICAgIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhTG9zc2xlc3MocGljKTsKKyAgICB9CisKKyAgICBvayA9IFZQOExFbmNvZGVJbWFnZShjb25maWcsIHBpYyk7ICAvLyBTZXRzIHBpYy0+ZXJyb3IgaW4gY2FzZSBvZiBwcm9ibGVtLgorICB9CisKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNzlkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCb29sZWFuIGRlY29kZXIgbm9uLWlubGluZWQgbWV0aG9kcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiLi4vd2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfcmVhZGVyX2lubC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOEJpdFJlYWRlcgorCit2b2lkIFZQOEJpdFJlYWRlclNldEJ1ZmZlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICBici0+YnVmXyAgICAgPSBzdGFydDsKKyAgYnItPmJ1Zl9lbmRfID0gc3RhcnQgKyBzaXplOworICBici0+YnVmX21heF8gPQorICAgICAgKHNpemUgPj0gc2l6ZW9mKGxiaXRfdCkpID8gc3RhcnQgKyBzaXplIC0gc2l6ZW9mKGxiaXRfdCkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGFydDsKK30KKwordm9pZCBWUDhJbml0Qml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIHNpemVfdCBzaXplKSB7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KHN0YXJ0ICE9IE5VTEwpOworICBhc3NlcnQoc2l6ZSA8ICgxdSA8PCAzMSkpOyAgIC8vIGxpbWl0IGVuc3VyZWQgYnkgZm9ybWF0IGFuZCB1cHN0cmVhbSBjaGVja3MKKyAgYnItPnJhbmdlXyAgID0gMjU1IC0gMTsKKyAgYnItPnZhbHVlXyAgID0gMDsKKyAgYnItPmJpdHNfICAgID0gLTg7ICAgLy8gdG8gbG9hZCB0aGUgdmVyeSBmaXJzdCA4Yml0cworICBici0+ZW9mXyAgICAgPSAwOworICBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoYnIsIHN0YXJ0LCBzaXplKTsKKyAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKK30KKwordm9pZCBWUDhSZW1hcEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBwdHJkaWZmX3Qgb2Zmc2V0KSB7CisgIGlmIChici0+YnVmXyAhPSBOVUxMKSB7CisgICAgYnItPmJ1Zl8gKz0gb2Zmc2V0OworICAgIGJyLT5idWZfZW5kXyArPSBvZmZzZXQ7CisgICAgYnItPmJ1Zl9tYXhfICs9IG9mZnNldDsKKyAgfQorfQorCitjb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XSA9IHsKKyAgICAgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgMAorfTsKKworLy8gcmFuZ2UgPSAoKHJhbmdlIC0gMSkgPDwga1ZQOExvZzJSYW5nZVtyYW5nZV0pICsgMQorY29uc3QgdWludDhfdCBrVlA4TmV3UmFuZ2VbMTI4XSA9IHsKKyAgMTI3LCAxMjcsIDE5MSwgMTI3LCAxNTksIDE5MSwgMjIzLCAxMjcsCisgIDE0MywgMTU5LCAxNzUsIDE5MSwgMjA3LCAyMjMsIDIzOSwgMTI3LAorICAxMzUsIDE0MywgMTUxLCAxNTksIDE2NywgMTc1LCAxODMsIDE5MSwKKyAgMTk5LCAyMDcsIDIxNSwgMjIzLCAyMzEsIDIzOSwgMjQ3LCAxMjcsCisgIDEzMSwgMTM1LCAxMzksIDE0MywgMTQ3LCAxNTEsIDE1NSwgMTU5LAorICAxNjMsIDE2NywgMTcxLCAxNzUsIDE3OSwgMTgzLCAxODcsIDE5MSwKKyAgMTk1LCAxOTksIDIwMywgMjA3LCAyMTEsIDIxNSwgMjE5LCAyMjMsCisgIDIyNywgMjMxLCAyMzUsIDIzOSwgMjQzLCAyNDcsIDI1MSwgMTI3LAorICAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywKKyAgMTQ1LCAxNDcsIDE0OSwgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksCisgIDE2MSwgMTYzLCAxNjUsIDE2NywgMTY5LCAxNzEsIDE3MywgMTc1LAorICAxNzcsIDE3OSwgMTgxLCAxODMsIDE4NSwgMTg3LCAxODksIDE5MSwKKyAgMTkzLCAxOTUsIDE5NywgMTk5LCAyMDEsIDIwMywgMjA1LCAyMDcsCisgIDIwOSwgMjExLCAyMTMsIDIxNSwgMjE3LCAyMTksIDIyMSwgMjIzLAorICAyMjUsIDIyNywgMjI5LCAyMzEsIDIzMywgMjM1LCAyMzcsIDIzOSwKKyAgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDksIDI1MSwgMjUzLCAxMjcKK307CisKK3ZvaWQgVlA4TG9hZEZpbmFsQnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgeworICBhc3NlcnQoYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKKyAgLy8gT25seSByZWFkIDhiaXRzIGF0IGEgdGltZQorICBpZiAoYnItPmJ1Zl8gPCBici0+YnVmX2VuZF8pIHsKKyAgICBici0+Yml0c18gKz0gODsKKyAgICBici0+dmFsdWVfID0gKGJpdF90KSgqYnItPmJ1Zl8rKykgfCAoYnItPnZhbHVlXyA8PCA4KTsKKyAgfSBlbHNlIGlmICghYnItPmVvZl8pIHsKKyAgICBici0+dmFsdWVfIDw8PSA4OworICAgIGJyLT5iaXRzXyArPSA4OworICAgIGJyLT5lb2ZfID0gMTsKKyAgfSBlbHNlIHsKKyAgICBici0+Yml0c18gPSAwOyAgLy8gVGhpcyBpcyB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdpdGggc2hpZnRzLgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaWdoZXItbGV2ZWwgY2FsbHMKKwordWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKKyAgdWludDMyX3QgdiA9IDA7CisgIHdoaWxlIChiaXRzLS0gPiAwKSB7CisgICAgdiB8PSBWUDhHZXRCaXQoYnIsIDB4ODApIDw8IGJpdHM7CisgIH0KKyAgcmV0dXJuIHY7Cit9CisKK2ludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IGJpdHMpIHsKKyAgY29uc3QgaW50IHZhbHVlID0gVlA4R2V0VmFsdWUoYnIsIGJpdHMpOworICByZXR1cm4gVlA4R2V0KGJyKSA/IC12YWx1ZSA6IHZhbHVlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFJlYWRlcgorCisjZGVmaW5lIFZQOExfTE9HOF9XQklUUyA0ICAvLyBOdW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIFZQOExfV0JJVFMgYml0cy4KKworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pIHx8IGRlZmluZWQoX19hYXJjaDY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KQorI2RlZmluZSBWUDhMX1VTRV9GQVNUX0xPQUQKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0JpdE1hc2tbVlA4TF9NQVhfTlVNX0JJVF9SRUFEICsgMV0gPSB7CisgIDAsCisgIDB4MDAwMDAxLCAweDAwMDAwMywgMHgwMDAwMDcsIDB4MDAwMDBmLAorICAweDAwMDAxZiwgMHgwMDAwM2YsIDB4MDAwMDdmLCAweDAwMDBmZiwKKyAgMHgwMDAxZmYsIDB4MDAwM2ZmLCAweDAwMDdmZiwgMHgwMDBmZmYsCisgIDB4MDAxZmZmLCAweDAwM2ZmZiwgMHgwMDdmZmYsIDB4MDBmZmZmLAorICAweDAxZmZmZiwgMHgwM2ZmZmYsIDB4MDdmZmZmLCAweDBmZmZmZiwKKyAgMHgxZmZmZmYsIDB4M2ZmZmZmLCAweDdmZmZmZiwgMHhmZmZmZmYKK307CisKK3ZvaWQgVlA4TEluaXRCaXRSZWFkZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CisgIHNpemVfdCBpOworICB2cDhsX3ZhbF90IHZhbHVlID0gMDsKKyAgYXNzZXJ0KGJyICE9IE5VTEwpOworICBhc3NlcnQoc3RhcnQgIT0gTlVMTCk7CisgIGFzc2VydChsZW5ndGggPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgorCisgIGJyLT5sZW5fID0gbGVuZ3RoOworICBici0+dmFsXyA9IDA7CisgIGJyLT5iaXRfcG9zXyA9IDA7CisgIGJyLT5lb3NfID0gMDsKKworICBpZiAobGVuZ3RoID4gc2l6ZW9mKGJyLT52YWxfKSkgeworICAgIGxlbmd0aCA9IHNpemVvZihici0+dmFsXyk7CisgIH0KKyAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgdmFsdWUgfD0gKHZwOGxfdmFsX3Qpc3RhcnRbaV0gPDwgKDggKiBpKTsKKyAgfQorICBici0+dmFsXyA9IHZhbHVlOworICBici0+cG9zXyA9IGxlbmd0aDsKKyAgYnItPmJ1Zl8gPSBzdGFydDsKK30KKwordm9pZCBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1Ziwgc2l6ZV90IGxlbikgeworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChidWYgIT0gTlVMTCk7CisgIGFzc2VydChsZW4gPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgorICBici0+YnVmXyA9IGJ1ZjsKKyAgYnItPmxlbl8gPSBsZW47CisgIC8vIHBvc18gPiBsZW5fIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgcGFyYW0gZXJyb3IuCisgIGJyLT5lb3NfID0gKGJyLT5wb3NfID4gYnItPmxlbl8pIHx8IFZQOExJc0VuZE9mU3RyZWFtKGJyKTsKK30KKworc3RhdGljIHZvaWQgVlA4TFNldEVuZE9mU3RyZWFtKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGJyLT5lb3NfID0gMTsKKyAgYnItPmJpdF9wb3NfID0gMDsgIC8vIFRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aCBzaGlmdHMuCit9CisKKy8vIElmIG5vdCBhdCBFT1MsIHJlbG9hZCB1cCB0byBWUDhMX0xCSVRTIGJ5dGUtYnktYnl0ZQorc3RhdGljIHZvaWQgU2hpZnRCeXRlcyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICB3aGlsZSAoYnItPmJpdF9wb3NfID49IDggJiYgYnItPnBvc18gPCBici0+bGVuXykgeworICAgIGJyLT52YWxfID4+PSA4OworICAgIGJyLT52YWxfIHw9ICgodnA4bF92YWxfdClici0+YnVmX1tici0+cG9zX10pIDw8IChWUDhMX0xCSVRTIC0gOCk7CisgICAgKytici0+cG9zXzsKKyAgICBici0+Yml0X3Bvc18gLT0gODsKKyAgfQorICBpZiAoVlA4TElzRW5kT2ZTdHJlYW0oYnIpKSB7CisgICAgVlA4TFNldEVuZE9mU3RyZWFtKGJyKTsKKyAgfQorfQorCit2b2lkIFZQOExEb0ZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgYXNzZXJ0KGJyLT5iaXRfcG9zXyA+PSBWUDhMX1dCSVRTKTsKKyNpZiBkZWZpbmVkKFZQOExfVVNFX0ZBU1RfTE9BRCkKKyAgaWYgKGJyLT5wb3NfICsgc2l6ZW9mKGJyLT52YWxfKSA8IGJyLT5sZW5fKSB7CisgICAgYnItPnZhbF8gPj49IFZQOExfV0JJVFM7CisgICAgYnItPmJpdF9wb3NfIC09IFZQOExfV0JJVFM7CisgICAgYnItPnZhbF8gfD0gKHZwOGxfdmFsX3QpSFRvTEUzMihXZWJQTWVtVG9VaW50MzIoYnItPmJ1Zl8gKyBici0+cG9zXykpIDw8CisgICAgICAgICAgICAgICAgKFZQOExfTEJJVFMgLSBWUDhMX1dCSVRTKTsKKyAgICBici0+cG9zXyArPSBWUDhMX0xPRzhfV0JJVFM7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYKKyAgU2hpZnRCeXRlcyhicik7ICAgICAgIC8vIFNsb3cgcGF0aC4KK30KKwordWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKSB7CisgIGFzc2VydChuX2JpdHMgPj0gMCk7CisgIC8vIEZsYWcgYW4gZXJyb3IgaWYgZW5kX29mX3N0cmVhbSBvciBuX2JpdHMgaXMgbW9yZSB0aGFuIGFsbG93ZWQgbGltaXQuCisgIGlmICghYnItPmVvc18gJiYgbl9iaXRzIDw9IFZQOExfTUFYX05VTV9CSVRfUkVBRCkgeworICAgIGNvbnN0IHVpbnQzMl90IHZhbCA9IFZQOExQcmVmZXRjaEJpdHMoYnIpICYga0JpdE1hc2tbbl9iaXRzXTsKKyAgICBjb25zdCBpbnQgbmV3X2JpdHMgPSBici0+Yml0X3Bvc18gKyBuX2JpdHM7CisgICAgYnItPmJpdF9wb3NfID0gbmV3X2JpdHM7CisgICAgU2hpZnRCeXRlcyhicik7CisgICAgcmV0dXJuIHZhbDsKKyAgfSBlbHNlIHsKKyAgICBWUDhMU2V0RW5kT2ZTdHJlYW0oYnIpOworICAgIHJldHVybiAwOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcyZTg2NAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaApAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJvb2xlYW4gZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfQklUX1JFQURFUl9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX0JJVF9SRUFERVJfSF8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBfYnl0ZXN3YXBfdWxvbmcKKyNlbmRpZgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFRoZSBCb29sZWFuIGRlY29kZXIgbmVlZHMgdG8gbWFpbnRhaW4gaW5maW5pdGUgcHJlY2lzaW9uIG9uIHRoZSB2YWx1ZV8gZmllbGQuCisvLyBIb3dldmVyLCBzaW5jZSByYW5nZV8gaXMgb25seSA4Yml0LCB3ZSBvbmx5IG5lZWQgYW4gYWN0aXZlIHdpbmRvdyBvZiA4IGJpdHMKKy8vIGZvciB2YWx1ZV8uIExlZnQgYml0cyAoTVNCKSBnZXRzIHplcm9lZCBhbmQgc2hpZnRlZCBhd2F5IHdoZW4gdmFsdWVfIGZhbGxzCisvLyBiZWxvdyAxMjgsIHJhbmdlXyBpcyB1cGRhdGVkLCBhbmQgZnJlc2ggYml0cyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbSBhcmUKKy8vIGJyb3VnaHQgaW4gYXMgTFNCLiBUbyBhdm9pZCByZWFkaW5nIHRoZSBmcmVzaCBiaXRzIG9uZSBieSBvbmUgKHNsb3cpLCB3ZQorLy8gY2FjaGUgQklUUyBvZiB0aGVtIGFoZWFkLiBUaGUgdG90YWwgb2YgKEJJVFMgKyA4KSBiaXRzIG11c3QgZml0IGludG8gYQorLy8gbmF0dXJhbCByZWdpc3RlciAod2l0aCB0eXBlIGJpdF90KS4gVG8gZmV0Y2ggQklUUyBiaXRzIGZyb20gYml0c3RyZWFtIHdlCisvLyB1c2UgYSB0eXBlIGxiaXRfdC4KKy8vCisvLyBCSVRTIGNhbiBiZSBhbnkgbXVsdGlwbGUgb2YgOCBmcm9tIDggdG8gNTYgKGluY2x1c2l2ZSkuCisvLyBQaWNrIHZhbHVlcyB0aGF0IGZpdCBuYXR1cmFsIHJlZ2lzdGVyIHNpemUuCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpICAgICAgLy8geDg2IDMyYml0CisjZGVmaW5lIEJJVFMgMjQKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpICAgLy8geDg2IDY0Yml0CisjZGVmaW5lIEJJVFMgNTYKKyNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pICAgICAgLy8gQVJNCisjZGVmaW5lIEJJVFMgMjQKKyNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pICAgICAgICAgICAgICAgICAgICAgLy8gQVJNIDY0Yml0CisjZGVmaW5lIEJJVFMgNTYKKyNlbGlmIGRlZmluZWQoX19taXBzX18pICAgICAgICAgICAgICAgICAgICAgICAgLy8gTUlQUworI2RlZmluZSBCSVRTIDI0CisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdAorI2RlZmluZSBCSVRTIDI0CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlcml2ZWQgdHlwZXMgYW5kIGNvbnN0YW50czoKKy8vICAgYml0X3QgPSBuYXR1cmFsIHJlZ2lzdGVyIHR5cGUgZm9yIHN0b3JpbmcgJ3ZhbHVlXycgKHdoaWNoIGlzIEJJVFMrOCBiaXRzKQorLy8gICByYW5nZV90ID0gcmVnaXN0ZXIgZm9yICdyYW5nZV8nICh3aGljaCBpcyA4Yml0cyBvbmx5KQorCisjaWYgKEJJVFMgPiAyNCkKK3R5cGVkZWYgdWludDY0X3QgYml0X3Q7CisjZWxzZQordHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKKyNlbmRpZgorCit0eXBlZGVmIHVpbnQzMl90IHJhbmdlX3Q7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXRyZWFkZXIKKwordHlwZWRlZiBzdHJ1Y3QgVlA4Qml0UmVhZGVyIFZQOEJpdFJlYWRlcjsKK3N0cnVjdCBWUDhCaXRSZWFkZXIgeworICAvLyBib29sZWFuIGRlY29kZXIgIChrZWVwIHRoZSBmaWVsZCBvcmRlcmluZyBhcyBpcyEpCisgIGJpdF90IHZhbHVlXzsgICAgICAgICAgICAgICAvLyBjdXJyZW50IHZhbHVlCisgIHJhbmdlX3QgcmFuZ2VfOyAgICAgICAgICAgICAvLyBjdXJyZW50IHJhbmdlIG1pbnVzIDEuIEluIFsxMjcsIDI1NF0gaW50ZXJ2YWwuCisgIGludCBiaXRzXzsgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgYml0cyBsZWZ0CisgIC8vIHJlYWQgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBuZXh0IGJ5dGUgdG8gYmUgcmVhZAorICBjb25zdCB1aW50OF90KiBidWZfZW5kXzsgICAgLy8gZW5kIG9mIHJlYWQgYnVmZmVyCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9tYXhfOyAgICAvLyBtYXggcGFja2VkLXJlYWQgcG9zaXRpb24gb24gYnVmZmVyCisgIGludCBlb2ZfOyAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIGlucHV0IGlzIGV4aGF1c3RlZAorfTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgYml0IHJlYWRlciBhbmQgdGhlIGJvb2xlYW4gZGVjb2Rlci4KK3ZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBzaXplX3Qgc2l6ZSk7CisvLyBTZXRzIHRoZSB3b3JraW5nIHJlYWQgYnVmZmVyLgordm9pZCBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBzaXplX3Qgc2l6ZSk7CisKKy8vIFVwZGF0ZSBpbnRlcm5hbCBwb2ludGVycyB0byBkaXNwbGFjZSB0aGUgYnl0ZSBidWZmZXIgYnkgdGhlCisvLyByZWxhdGl2ZSBvZmZzZXQgJ29mZnNldCcuCit2b2lkIFZQOFJlbWFwQml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHB0cmRpZmZfdCBvZmZzZXQpOworCisvLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgbWFkZSBvZiAnbnVtX2JpdHMnIGJpdHMKK3VpbnQzMl90IFZQOEdldFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4R2V0KFZQOEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgcmV0dXJuIFZQOEdldFZhbHVlKGJyLCAxKTsKK30KKworLy8gcmV0dXJuIHRoZSBuZXh0IHZhbHVlIHdpdGggc2lnbi1leHRlbnNpb24uCitpbnQzMl90IFZQOEdldFNpZ25lZFZhbHVlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBudW1fYml0cyk7CisKKy8vIGJpdF9yZWFkZXJfaW5sLmggd2lsbCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorLy8gICBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldEJpdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgcHJvYikKKy8vICAgc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRTaWduZWQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHYpCisvLyBhbmQgc2hvdWxkIGJlIGluY2x1ZGVkIGJ5IHRoZSAuYyBmaWxlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdGhlbS4KKy8vIFRoaXMgaXMgdG8gYXZvaWQgcmVjb21waWxpbmcgdGhlIHdob2xlIGxpYnJhcnkgd2hlbmV2ZXIgdGhpcyBmaWxlIGlzIHRvdWNoZWQsCisvLyBhbmQgYWxzbyBhbGxvd2luZyBwbGF0Zm9ybS1zcGVjaWZpYyBhZC1ob2MgaGFja3MuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXRyZWFkZXIgZm9yIGxvc3NsZXNzIGZvcm1hdAorCisvLyBtYXhpbXVtIG51bWJlciBvZiBiaXRzIChpbmNsdXNpdmUpIHRoZSBiaXQtcmVhZGVyIGNhbiBoYW5kbGU6CisjZGVmaW5lIFZQOExfTUFYX05VTV9CSVRfUkVBRCAyNAorCisjZGVmaW5lIFZQOExfTEJJVFMgNjQgIC8vIE51bWJlciBvZiBiaXRzIHByZWZldGNoZWQgKD0gYml0LXNpemUgb2YgdnA4bF92YWxfdCkuCisjZGVmaW5lIFZQOExfV0JJVFMgMzIgIC8vIE1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIHJlYWR5IGFmdGVyIFZQOExGaWxsQml0V2luZG93LgorCit0eXBlZGVmIHVpbnQ2NF90IHZwOGxfdmFsX3Q7ICAvLyByaWdodCBub3csIHRoaXMgYml0LXJlYWRlciBjYW4gb25seSB1c2UgNjRiaXQuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdnA4bF92YWxfdCAgICAgdmFsXzsgICAgICAgIC8vIHByZS1mZXRjaGVkIGJpdHMKKyAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIGlucHV0IGJ5dGUgYnVmZmVyCisgIHNpemVfdCAgICAgICAgIGxlbl87ICAgICAgICAvLyBidWZmZXIgbGVuZ3RoCisgIHNpemVfdCAgICAgICAgIHBvc187ICAgICAgICAvLyBieXRlIHBvc2l0aW9uIGluIGJ1Zl8KKyAgaW50ICAgICAgICAgICAgYml0X3Bvc187ICAgIC8vIGN1cnJlbnQgYml0LXJlYWRpbmcgcG9zaXRpb24gaW4gdmFsXworICBpbnQgICAgICAgICAgICBlb3NfOyAgICAgICAgLy8gdHJ1ZSBpZiBhIGJpdCB3YXMgcmVhZCBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyCit9IFZQOExCaXRSZWFkZXI7CisKK3ZvaWQgVlA4TEluaXRCaXRSZWFkZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworLy8gIFNldHMgYSBuZXcgZGF0YSBidWZmZXIuCit2b2lkIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKworLy8gUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBmcm9tIHJlYWQgYnVmZmVyLgorLy8gRmxhZ3MgYW4gZXJyb3IgaW4gY2FzZSBlbmRfb2Zfc3RyZWFtIG9yIG5fYml0cyBpcyBtb3JlIHRoYW4gdGhlIGFsbG93ZWQgbGltaXQKKy8vIG9mIFZQOExfTUFYX05VTV9CSVRfUkVBRCAoaW5jbHVzaXZlKS4KKy8vIEZsYWdzIGVvc18gaWYgdGhpcyByZWFkIGF0dGVtcHQgaXMgZ29pbmcgdG8gY3Jvc3MgdGhlIHJlYWQgYnVmZmVyLgordWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKTsKKworLy8gUmV0dXJuIHRoZSBwcmVmZXRjaGVkIGJpdHMsIHNvIHRoZXkgY2FuIGJlIGxvb2tlZCB1cC4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhMUHJlZmV0Y2hCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIHJldHVybiAodWludDMyX3QpKGJyLT52YWxfID4+IChici0+Yml0X3Bvc18gJiAoVlA4TF9MQklUUyAtIDEpKSk7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gYXR0ZW1wdCBhdCByZWFkaW5nIGJpdCBwYXN0IHRoZSBlbmQgb2YKKy8vIHRoZSBidWZmZXIuIERvZXNuJ3Qgc2V0IGJyLT5lb3NfIGZsYWcuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExJc0VuZE9mU3RyZWFtKGNvbnN0IFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGFzc2VydChici0+cG9zXyA8PSBici0+bGVuXyk7CisgIHJldHVybiBici0+ZW9zXyB8fCAoKGJyLT5wb3NfID09IGJyLT5sZW5fKSAmJiAoYnItPmJpdF9wb3NfID4gVlA4TF9MQklUUykpOworfQorCisvLyBGb3IganVtcGluZyBvdmVyIGEgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpdCBzdHJlYW0gd2hlbiBhY2Nlc3NlZCB3aXRoCisvLyBWUDhMUHJlZmV0Y2hCaXRzIGFuZCBWUDhMRmlsbEJpdFdpbmRvdy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExTZXRCaXRQb3MoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2YWwpIHsKKyAgYnItPmJpdF9wb3NfID0gdmFsOworICBici0+ZW9zXyA9IFZQOExJc0VuZE9mU3RyZWFtKGJyKTsKK30KKworLy8gQWR2YW5jZXMgdGhlIHJlYWQgYnVmZmVyIGJ5IDQgYnl0ZXMgdG8gbWFrZSByb29tIGZvciByZWFkaW5nIG5leHQgMzIgYml0cy4KKy8vIFNwZWVkIGNyaXRpY2FsLCBidXQgaW5mcmVxdWVudCBwYXJ0IG9mIHRoZSBjb2RlIGNhbiBiZSBub24taW5saW5lZC4KK2V4dGVybiB2b2lkIFZQOExEb0ZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpOworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgaWYgKGJyLT5iaXRfcG9zXyA+PSBWUDhMX1dCSVRTKSBWUDhMRG9GaWxsQml0V2luZG93KGJyKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfVVRJTFNfQklUX1JFQURFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3JlYWRlcl9pbmwuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXJfaW5sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2NWYwYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXJfaW5sLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGVjaWZpYyBpbmxpbmVkIG1ldGhvZHMgZm9yIGJvb2xlYW4gZGVjb2RlciBbVlA4R2V0Qml0KCkgLi4uXQorLy8gVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBieSB0aGUgLmMgc291cmNlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdG8gY2FsbAorLy8gdGhlc2UgbWV0aG9kcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfQklUX1JFQURFUl9JTkxfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19CSVRfUkVBREVSX0lOTF9IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIi4uL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdFQlBfRk9SQ0VfQUxJR05FRAorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gbWVtY3B5CisjZW5kaWYKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZW5kaWFuX2lubC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZXJpdmVkIHR5cGUgbGJpdF90ID0gbmF0dXJhbCB0eXBlIGZvciBtZW1vcnkgSS9PCisKKyNpZiAgIChCSVRTID4gMzIpCit0eXBlZGVmIHVpbnQ2NF90IGxiaXRfdDsKKyNlbGlmIChCSVRTID4gMTYpCit0eXBlZGVmIHVpbnQzMl90IGxiaXRfdDsKKyNlbGlmIChCSVRTID4gIDgpCit0eXBlZGVmIHVpbnQxNl90IGxiaXRfdDsKKyNlbHNlCit0eXBlZGVmIHVpbnQ4X3QgbGJpdF90OworI2VuZGlmCisKK2V4dGVybiBjb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGtWUDhOZXdSYW5nZVsxMjhdOworCisvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSB0YWlsIGJ5dGUtcmVhZGluZwordm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElubGluZWQgY3JpdGljYWwgZnVuY3Rpb25zCisKKy8vIG1ha2VzIHN1cmUgYnItPnZhbHVlXyBoYXMgYXQgbGVhc3QgQklUUyBiaXRzIHdvcnRoIG9mIGRhdGEKK3N0YXRpYyBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRiBXRUJQX0lOTElORQordm9pZCBWUDhMb2FkTmV3Qnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgeworICBhc3NlcnQoYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKKyAgLy8gUmVhZCAnQklUUycgYml0cyBhdCBhIHRpbWUgaWYgcG9zc2libGUuCisgIGlmIChici0+YnVmXyA8IGJyLT5idWZfbWF4XykgeworICAgIC8vIGNvbnZlcnQgbWVtb3J5IHR5cGUgdG8gcmVnaXN0ZXIgdHlwZSAod2l0aCBzb21lIHplcm8naW5nISkKKyAgICBiaXRfdCBiaXRzOworI2lmIGRlZmluZWQoV0VCUF9GT1JDRV9BTElHTkVEKQorICAgIGxiaXRfdCBpbl9iaXRzOworICAgIG1lbWNweSgmaW5fYml0cywgYnItPmJ1Zl8sIHNpemVvZihpbl9iaXRzKSk7CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHVuLWFsaWduZWQgcmVhZC4KKyAgICBsYml0X3QgaW5fYml0czsKKyAgICBsYml0X3QqIHBfYnVmXyA9IChsYml0X3QqKWJyLT5idWZfOworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAiLnNldCAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIG1hY3JvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAidWx3ICAgICVbaW5fYml0c10sIDAoJVtwX2J1Zl9dKSAgICAgICAgIFxuXHQiCisgICAgICAiLnNldCAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICA6IFtpbl9iaXRzXSI9ciIoaW5fYml0cykKKyAgICAgIDogW3BfYnVmX10iciIocF9idWZfKQorICAgICAgOiAibWVtb3J5IiwgImF0IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IGxiaXRfdCBpbl9iaXRzID0gKihjb25zdCBsYml0X3QqKWJyLT5idWZfOworI2VuZGlmCisgICAgYnItPmJ1Zl8gKz0gQklUUyA+PiAzOworI2lmICFkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyNpZiAoQklUUyA+IDMyKQorICAgIGJpdHMgPSBCU3dhcDY0KGluX2JpdHMpOworICAgIGJpdHMgPj49IDY0IC0gQklUUzsKKyNlbGlmIChCSVRTID49IDI0KQorICAgIGJpdHMgPSBCU3dhcDMyKGluX2JpdHMpOworICAgIGJpdHMgPj49ICgzMiAtIEJJVFMpOworI2VsaWYgKEJJVFMgPT0gMTYpCisgICAgYml0cyA9IEJTd2FwMTYoaW5fYml0cyk7CisjZWxzZSAgIC8vIEJJVFMgPT0gOAorICAgIGJpdHMgPSAoYml0X3QpaW5fYml0czsKKyNlbmRpZiAgLy8gQklUUyA+IDMyCisjZWxzZSAgICAvLyBXT1JEU19CSUdFTkRJQU4KKyAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7CisgICAgaWYgKEJJVFMgIT0gOCAqIHNpemVvZihiaXRfdCkpIGJpdHMgPj49ICg4ICogc2l6ZW9mKGJpdF90KSAtIEJJVFMpOworI2VuZGlmCisgICAgYnItPnZhbHVlXyA9IGJpdHMgfCAoYnItPnZhbHVlXyA8PCBCSVRTKTsKKyAgICBici0+Yml0c18gKz0gQklUUzsKKyAgfSBlbHNlIHsKKyAgICBWUDhMb2FkRmluYWxCeXRlcyhicik7ICAgIC8vIG5vIG5lZWQgdG8gYmUgaW5saW5lZAorICB9Cit9CisKKy8vIFJlYWQgYSBiaXQgd2l0aCBwcm9iYSAncHJvYicuIFNwZWVkLWNyaXRpY2FsIGZ1bmN0aW9uIQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpIHsKKyAgLy8gRG9uJ3QgbW92ZSB0aGlzIGRlY2xhcmF0aW9uISBJdCBtYWtlcyBhIGJpZyBzcGVlZCBkaWZmZXJlbmNlIHRvIHN0b3JlCisgIC8vICdyYW5nZScgKmJlZm9yZSogY2FsbGluZyBWUDhMb2FkTmV3Qnl0ZXMoKSwgZXZlbiBpZiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKKyAgLy8gYWx0ZXIgYnItPnJhbmdlXyB2YWx1ZS4KKyAgcmFuZ2VfdCByYW5nZSA9IGJyLT5yYW5nZV87CisgIGlmIChici0+Yml0c18gPCAwKSB7CisgICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IHBvcyA9IGJyLT5iaXRzXzsKKyAgICBjb25zdCByYW5nZV90IHNwbGl0ID0gKHJhbmdlICogcHJvYikgPj4gODsKKyAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSAgICAgIC8vIEFSTS1zcGVjaWZpYworICAgIGNvbnN0IGludCBiaXQgPSAoKGludCkoc3BsaXQgLSB2YWx1ZSkgPj4gMzEpICYgMTsKKyAgICBpZiAodmFsdWUgPiBzcGxpdCkgeworICAgICAgcmFuZ2UgLT0gc3BsaXQgKyAxOworICAgICAgYnItPnZhbHVlXyAtPSAoYml0X3QpKHNwbGl0ICsgMSkgPDwgcG9zOworICAgIH0gZWxzZSB7CisgICAgICByYW5nZSA9IHNwbGl0OworICAgIH0KKyNlbHNlICAvLyBmYXN0ZXIgdmVyc2lvbiBvbiB4ODYKKyAgICBpbnQgYml0OyAgLy8gRG9uJ3QgdXNlICdjb25zdCBpbnQgYml0ID0gKHZhbHVlID4gc3BsaXQpOyIsIGl0J3Mgc2xvd2VyLgorICAgIGlmICh2YWx1ZSA+IHNwbGl0KSB7CisgICAgICByYW5nZSAtPSBzcGxpdCArIDE7CisgICAgICBici0+dmFsdWVfIC09IChiaXRfdCkoc3BsaXQgKyAxKSA8PCBwb3M7CisgICAgICBiaXQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICByYW5nZSA9IHNwbGl0OworICAgICAgYml0ID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAocmFuZ2UgPD0gKHJhbmdlX3QpMHg3ZSkgeworICAgICAgY29uc3QgaW50IHNoaWZ0ID0ga1ZQOExvZzJSYW5nZVtyYW5nZV07CisgICAgICByYW5nZSA9IGtWUDhOZXdSYW5nZVtyYW5nZV07CisgICAgICBici0+Yml0c18gLT0gc2hpZnQ7CisgICAgfQorICAgIGJyLT5yYW5nZV8gPSByYW5nZTsKKyAgICByZXR1cm4gYml0OworICB9Cit9CisKKy8vIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBWUDhHZXRCaXQoKSBmb3IgcHJvYj0weDgwIChub3RlIHNoaWZ0IGlzIGFsd2F5cyAxIGhlcmUpCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldFNpZ25lZChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgdikgeworICBpZiAoYnItPmJpdHNfIDwgMCkgeworICAgIFZQOExvYWROZXdCeXRlcyhicik7CisgIH0KKyAgeworICAgIGNvbnN0IGludCBwb3MgPSBici0+Yml0c187CisgICAgY29uc3QgcmFuZ2VfdCBzcGxpdCA9IGJyLT5yYW5nZV8gPj4gMTsKKyAgICBjb25zdCByYW5nZV90IHZhbHVlID0gKHJhbmdlX3QpKGJyLT52YWx1ZV8gPj4gcG9zKTsKKyAgICBjb25zdCBpbnQzMl90IG1hc2sgPSAoaW50MzJfdCkoc3BsaXQgLSB2YWx1ZSkgPj4gMzE7ICAvLyAtMSBvciAwCisgICAgYnItPmJpdHNfIC09IDE7CisgICAgYnItPnJhbmdlXyArPSBtYXNrOworICAgIGJyLT5yYW5nZV8gfD0gMTsKKyAgICBici0+dmFsdWVfIC09IChiaXRfdCkoKHNwbGl0ICsgMSkgJiBtYXNrKSA8PCBwb3M7CisgICAgcmV0dXJuICh2IF4gbWFzaykgLSBtYXNrOworICB9Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAgLy8gQ0hST01JVU1fV0VCUF9VVElMU19CSVRfUkVBREVSX0lOTF9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjFlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCaXQgd3JpdGluZyBhbmQgYm9vbGVhbiBjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgIFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIG1lbWNweSgpCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2VuZGlhbl9pbmwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhCaXRXcml0ZXIKKworc3RhdGljIGludCBCaXRXcml0ZXJSZXNpemUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4dHJhX3NpemUpIHsKKyAgdWludDhfdCogbmV3X2J1ZjsKKyAgc2l6ZV90IG5ld19zaXplOworICBjb25zdCB1aW50NjRfdCBuZWVkZWRfc2l6ZV82NGIgPSAodWludDY0X3QpYnctPnBvc18gKyBleHRyYV9zaXplOworICBjb25zdCBzaXplX3QgbmVlZGVkX3NpemUgPSAoc2l6ZV90KW5lZWRlZF9zaXplXzY0YjsKKyAgaWYgKG5lZWRlZF9zaXplXzY0YiAhPSBuZWVkZWRfc2l6ZSkgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChuZWVkZWRfc2l6ZSA8PSBidy0+bWF4X3Bvc18pIHJldHVybiAxOworICAvLyBJZiB0aGUgZm9sbG93aW5nIGxpbmUgd3JhcHMgb3ZlciAzMmJpdCwgdGhlIHRlc3QganVzdCBhZnRlciB3aWxsIGNhdGNoIGl0LgorICBuZXdfc2l6ZSA9IDIgKiBidy0+bWF4X3Bvc187CisgIGlmIChuZXdfc2l6ZSA8IG5lZWRlZF9zaXplKSBuZXdfc2l6ZSA9IG5lZWRlZF9zaXplOworICBpZiAobmV3X3NpemUgPCAxMDI0KSBuZXdfc2l6ZSA9IDEwMjQ7CisgIG5ld19idWYgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgbmV3X3NpemUpOworICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7CisgICAgYnctPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGJ3LT5wb3NfID4gMCkgeworICAgIGFzc2VydChidy0+YnVmXyAhPSBOVUxMKTsKKyAgICBtZW1jcHkobmV3X2J1ZiwgYnctPmJ1Zl8sIGJ3LT5wb3NfKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoYnctPmJ1Zl8pOworICBidy0+YnVmXyA9IG5ld19idWY7CisgIGJ3LT5tYXhfcG9zXyA9IG5ld19zaXplOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRmx1c2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBjb25zdCBpbnQgcyA9IDggKyBidy0+bmJfYml0c187CisgIGNvbnN0IGludDMyX3QgYml0cyA9IGJ3LT52YWx1ZV8gPj4gczsKKyAgYXNzZXJ0KGJ3LT5uYl9iaXRzXyA+PSAwKTsKKyAgYnctPnZhbHVlXyAtPSBiaXRzIDw8IHM7CisgIGJ3LT5uYl9iaXRzXyAtPSA4OworICBpZiAoKGJpdHMgJiAweGZmKSAhPSAweGZmKSB7CisgICAgc2l6ZV90IHBvcyA9IGJ3LT5wb3NfOworICAgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBidy0+cnVuXyArIDEpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChiaXRzICYgMHgxMDApIHsgIC8vIG92ZXJmbG93IC0+IHByb3BhZ2F0ZSBjYXJyeSBvdmVyIHBlbmRpbmcgMHhmZidzCisgICAgICBpZiAocG9zID4gMCkgYnctPmJ1Zl9bcG9zIC0gMV0rKzsKKyAgICB9CisgICAgaWYgKGJ3LT5ydW5fID4gMCkgeworICAgICAgY29uc3QgaW50IHZhbHVlID0gKGJpdHMgJiAweDEwMCkgPyAweDAwIDogMHhmZjsKKyAgICAgIGZvciAoOyBidy0+cnVuXyA+IDA7IC0tYnctPnJ1bl8pIGJ3LT5idWZfW3BvcysrXSA9IHZhbHVlOworICAgIH0KKyAgICBidy0+YnVmX1twb3MrK10gPSBiaXRzOworICAgIGJ3LT5wb3NfID0gcG9zOworICB9IGVsc2UgeworICAgIGJ3LT5ydW5fKys7ICAgLy8gZGVsYXkgd3JpdGluZyBvZiBieXRlcyAweGZmLCBwZW5kaW5nIGV2ZW50dWFsIGNhcnJ5LgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyByZW5vcm1hbGl6YXRpb24KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05vcm1bMTI4XSA9IHsgIC8vIHJlbm9ybV9zaXplc1tpXSA9IDggLSBsb2cyKGkpCisgICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgIDAKK307CisKKy8vIHJhbmdlID0gKChyYW5nZSArIDEpIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSAtIDEKK3N0YXRpYyBjb25zdCB1aW50OF90IGtOZXdSYW5nZVsxMjhdID0geworICAxMjcsIDEyNywgMTkxLCAxMjcsIDE1OSwgMTkxLCAyMjMsIDEyNywgMTQzLCAxNTksIDE3NSwgMTkxLCAyMDcsIDIyMywgMjM5LAorICAxMjcsIDEzNSwgMTQzLCAxNTEsIDE1OSwgMTY3LCAxNzUsIDE4MywgMTkxLCAxOTksIDIwNywgMjE1LCAyMjMsIDIzMSwgMjM5LAorICAyNDcsIDEyNywgMTMxLCAxMzUsIDEzOSwgMTQzLCAxNDcsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY3LCAxNzEsIDE3NSwgMTc5LAorICAxODMsIDE4NywgMTkxLCAxOTUsIDE5OSwgMjAzLCAyMDcsIDIxMSwgMjE1LCAyMTksIDIyMywgMjI3LCAyMzEsIDIzNSwgMjM5LAorICAyNDMsIDI0NywgMjUxLCAxMjcsIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLCAxNDUsIDE0NywgMTQ5LAorICAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLCAxNzUsIDE3NywgMTc5LAorICAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLCAyMDUsIDIwNywgMjA5LAorICAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzUsIDIzNywgMjM5LAorICAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDEyNworfTsKKworaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYikgeworICBjb25zdCBpbnQgc3BsaXQgPSAoYnctPnJhbmdlXyAqIHByb2IpID4+IDg7CisgIGlmIChiaXQpIHsKKyAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKKyAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBidy0+cmFuZ2VfID0gc3BsaXQ7CisgIH0KKyAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsgICAvLyBlbWl0ICdzaGlmdCcgYml0cyBvdXQgYW5kIHJlbm9ybWFsaXplCisgICAgY29uc3QgaW50IHNoaWZ0ID0ga05vcm1bYnctPnJhbmdlX107CisgICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKKyAgICBidy0+dmFsdWVfIDw8PSBzaGlmdDsKKyAgICBidy0+bmJfYml0c18gKz0gc2hpZnQ7CisgICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIEZsdXNoKGJ3KTsKKyAgfQorICByZXR1cm4gYml0OworfQorCitpbnQgVlA4UHV0Qml0VW5pZm9ybShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0KSB7CisgIGNvbnN0IGludCBzcGxpdCA9IGJ3LT5yYW5nZV8gPj4gMTsKKyAgaWYgKGJpdCkgeworICAgIGJ3LT52YWx1ZV8gKz0gc3BsaXQgKyAxOworICAgIGJ3LT5yYW5nZV8gLT0gc3BsaXQgKyAxOworICB9IGVsc2UgeworICAgIGJ3LT5yYW5nZV8gPSBzcGxpdDsKKyAgfQorICBpZiAoYnctPnJhbmdlXyA8IDEyNykgeworICAgIGJ3LT5yYW5nZV8gPSBrTmV3UmFuZ2VbYnctPnJhbmdlX107CisgICAgYnctPnZhbHVlXyA8PD0gMTsKKyAgICBidy0+bmJfYml0c18gKz0gMTsKKyAgICBpZiAoYnctPm5iX2JpdHNfID4gMCkgRmx1c2goYncpOworICB9CisgIHJldHVybiBiaXQ7Cit9CisKK3ZvaWQgVlA4UHV0Qml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCB2YWx1ZSwgaW50IG5iX2JpdHMpIHsKKyAgdWludDMyX3QgbWFzazsKKyAgYXNzZXJ0KG5iX2JpdHMgPiAwICYmIG5iX2JpdHMgPCAzMik7CisgIGZvciAobWFzayA9IDF1IDw8IChuYl9iaXRzIC0gMSk7IG1hc2s7IG1hc2sgPj49IDEpCisgICAgVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgJiBtYXNrKTsKK30KKwordm9pZCBWUDhQdXRTaWduZWRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB2YWx1ZSwgaW50IG5iX2JpdHMpIHsKKyAgaWYgKCFWUDhQdXRCaXRVbmlmb3JtKGJ3LCB2YWx1ZSAhPSAwKSkKKyAgICByZXR1cm47CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICBWUDhQdXRCaXRzKGJ3LCAoKC12YWx1ZSkgPDwgMSkgfCAxLCBuYl9iaXRzICsgMSk7CisgIH0gZWxzZSB7CisgICAgVlA4UHV0Qml0cyhidywgdmFsdWUgPDwgMSwgbmJfYml0cyArIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7CisgIGJ3LT5yYW5nZV8gICA9IDI1NSAtIDE7CisgIGJ3LT52YWx1ZV8gICA9IDA7CisgIGJ3LT5ydW5fICAgICA9IDA7CisgIGJ3LT5uYl9iaXRzXyA9IC04OworICBidy0+cG9zXyAgICAgPSAwOworICBidy0+bWF4X3Bvc18gPSAwOworICBidy0+ZXJyb3JfICAgPSAwOworICBidy0+YnVmXyAgICAgPSBOVUxMOworICByZXR1cm4gKGV4cGVjdGVkX3NpemUgPiAwKSA/IEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSkgOiAxOworfQorCit1aW50OF90KiBWUDhCaXRXcml0ZXJGaW5pc2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBWUDhQdXRCaXRzKGJ3LCAwLCA5IC0gYnctPm5iX2JpdHNfKTsKKyAgYnctPm5iX2JpdHNfID0gMDsgICAvLyBwYWQgd2l0aCB6ZXJvZXMKKyAgRmx1c2goYncpOworICByZXR1cm4gYnctPmJ1Zl87Cit9CisKK2ludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGlmIChidy0+bmJfYml0c18gIT0gLTgpIHJldHVybiAwOyAgIC8vIEZsdXNoKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkCisgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBzaXplKSkgcmV0dXJuIDA7CisgIG1lbWNweShidy0+YnVmXyArIGJ3LT5wb3NfLCBkYXRhLCBzaXplKTsKKyAgYnctPnBvc18gKz0gc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4Qml0V3JpdGVyV2lwZU91dChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGlmIChidyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFdyaXRlcgorCisvLyBUaGlzIGlzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBzaXplIHRoZSBtZW1vcnkgYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gZ3JvdworLy8gd2hlbiBleHRyYSBzcGFjZSBpcyBuZWVkZWQuCisjZGVmaW5lIE1JTl9FWFRSQV9TSVpFICAoMzI3NjhVTEwpCisKKy8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgorc3RhdGljIGludCBWUDhMQml0V3JpdGVyUmVzaXplKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXh0cmFfc2l6ZSkgeworICB1aW50OF90KiBhbGxvY2F0ZWRfYnVmOworICBzaXplX3QgYWxsb2NhdGVkX3NpemU7CisgIGNvbnN0IHNpemVfdCBtYXhfYnl0ZXMgPSBidy0+ZW5kXyAtIGJ3LT5idWZfOworICBjb25zdCBzaXplX3QgY3VycmVudF9zaXplID0gYnctPmN1cl8gLSBidy0+YnVmXzsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZV9yZXF1aXJlZF82NGIgPSAodWludDY0X3QpY3VycmVudF9zaXplICsgZXh0cmFfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfcmVxdWlyZWQgPSAoc2l6ZV90KXNpemVfcmVxdWlyZWRfNjRiOworICBpZiAoc2l6ZV9yZXF1aXJlZCAhPSBzaXplX3JlcXVpcmVkXzY0YikgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChtYXhfYnl0ZXMgPiAwICYmIHNpemVfcmVxdWlyZWQgPD0gbWF4X2J5dGVzKSByZXR1cm4gMTsKKyAgYWxsb2NhdGVkX3NpemUgPSAoMyAqIG1heF9ieXRlcykgPj4gMTsKKyAgaWYgKGFsbG9jYXRlZF9zaXplIDwgc2l6ZV9yZXF1aXJlZCkgYWxsb2NhdGVkX3NpemUgPSBzaXplX3JlcXVpcmVkOworICAvLyBtYWtlIGFsbG9jYXRlZCBzaXplIG11bHRpcGxlIG9mIDFrCisgIGFsbG9jYXRlZF9zaXplID0gKCgoYWxsb2NhdGVkX3NpemUgPj4gMTApICsgMSkgPDwgMTApOworICBhbGxvY2F0ZWRfYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIGFsbG9jYXRlZF9zaXplKTsKKyAgaWYgKGFsbG9jYXRlZF9idWYgPT0gTlVMTCkgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChjdXJyZW50X3NpemUgPiAwKSB7CisgICAgbWVtY3B5KGFsbG9jYXRlZF9idWYsIGJ3LT5idWZfLCBjdXJyZW50X3NpemUpOworICB9CisgIFdlYlBTYWZlRnJlZShidy0+YnVmXyk7CisgIGJ3LT5idWZfID0gYWxsb2NhdGVkX2J1ZjsKKyAgYnctPmN1cl8gPSBidy0+YnVmXyArIGN1cnJlbnRfc2l6ZTsKKyAgYnctPmVuZF8gPSBidy0+YnVmXyArIGFsbG9jYXRlZF9zaXplOworICByZXR1cm4gMTsKK30KKworaW50IFZQOExCaXRXcml0ZXJJbml0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSkgeworICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgcmV0dXJuIFZQOExCaXRXcml0ZXJSZXNpemUoYncsIGV4cGVjdGVkX3NpemUpOworfQorCit2b2lkIFZQOExCaXRXcml0ZXJXaXBlT3V0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGlmIChidyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgfQorfQorCit2b2lkIFZQOExQdXRCaXRzRmx1c2hCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIC8vIElmIG5lZWRlZCwgbWFrZSBzb21lIHJvb20gYnkgZmx1c2hpbmcgc29tZSBiaXRzIG91dC4KKyAgaWYgKGJ3LT5jdXJfICsgVlA4TF9XUklURVJfQllURVMgPiBidy0+ZW5kXykgeworICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAoYnctPmVuZF8gLSBidy0+YnVmXykgKyBNSU5fRVhUUkFfU0laRTsKKyAgICBpZiAoZXh0cmFfc2l6ZSAhPSAoc2l6ZV90KWV4dHJhX3NpemUgfHwKKyAgICAgICAgIVZQOExCaXRXcml0ZXJSZXNpemUoYncsIChzaXplX3QpZXh0cmFfc2l6ZSkpIHsKKyAgICAgIGJ3LT5jdXJfID0gYnctPmJ1Zl87CisgICAgICBidy0+ZXJyb3JfID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgKih2cDhsX3d0eXBlX3QqKWJ3LT5jdXJfID0gKHZwOGxfd3R5cGVfdClXU1dBUCgodnA4bF93dHlwZV90KWJ3LT5iaXRzXyk7CisgIGJ3LT5jdXJfICs9IFZQOExfV1JJVEVSX0JZVEVTOworICBidy0+Yml0c18gPj49IFZQOExfV1JJVEVSX0JJVFM7CisgIGJ3LT51c2VkXyAtPSBWUDhMX1dSSVRFUl9CSVRTOworfQorCit2b2lkIFZQOExQdXRCaXRzSW50ZXJuYWwoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHVpbnQzMl90IGJpdHMsIGludCBuX2JpdHMpIHsKKyAgYXNzZXJ0KG5fYml0cyA8PSAzMik7CisgIC8vIFRoYXQncyB0aGUgbWF4IHdlIGNhbiBoYW5kbGU6CisgIGFzc2VydChzaXplb2YodnA4bF93dHlwZV90KSA9PSAyKTsKKyAgaWYgKG5fYml0cyA+IDApIHsKKyAgICB2cDhsX2F0eXBlX3QgbGJpdHMgPSBidy0+Yml0c187CisgICAgaW50IHVzZWQgPSBidy0+dXNlZF87CisgICAgLy8gU3BlY2lhbCBjYXNlIG9mIG92ZXJmbG93IGhhbmRsaW5nIGZvciAzMmJpdCBhY2N1bXVsYXRvciAoMi1zdGVwcyBmbHVzaCkuCisjaWYgVlA4TF9XUklURVJfQklUUyA9PSAxNgorICAgIGlmICh1c2VkICsgbl9iaXRzID49IFZQOExfV1JJVEVSX01BWF9CSVRTKSB7CisgICAgICAvLyBGaWxsIHVwIGFsbCB0aGUgVlA4TF9XUklURVJfTUFYX0JJVFMgc28gaXQgY2FuIGJlIGZsdXNoZWQgb3V0IGJlbG93LgorICAgICAgY29uc3QgaW50IHNoaWZ0ID0gVlA4TF9XUklURVJfTUFYX0JJVFMgLSB1c2VkOworICAgICAgbGJpdHMgfD0gKHZwOGxfYXR5cGVfdCliaXRzIDw8IHVzZWQ7CisgICAgICB1c2VkID0gVlA4TF9XUklURVJfTUFYX0JJVFM7CisgICAgICBuX2JpdHMgLT0gc2hpZnQ7CisgICAgICBiaXRzID4+PSBzaGlmdDsKKyAgICAgIGFzc2VydChuX2JpdHMgPD0gVlA4TF9XUklURVJfTUFYX0JJVFMpOworICAgIH0KKyNlbmRpZgorICAgIC8vIElmIG5lZWRlZCwgbWFrZSBzb21lIHJvb20gYnkgZmx1c2hpbmcgc29tZSBiaXRzIG91dC4KKyAgICB3aGlsZSAodXNlZCA+PSBWUDhMX1dSSVRFUl9CSVRTKSB7CisgICAgICBpZiAoYnctPmN1cl8gKyBWUDhMX1dSSVRFUl9CWVRFUyA+IGJ3LT5lbmRfKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAoYnctPmVuZF8gLSBidy0+YnVmXykgKyBNSU5fRVhUUkFfU0laRTsKKyAgICAgICAgaWYgKGV4dHJhX3NpemUgIT0gKHNpemVfdClleHRyYV9zaXplIHx8CisgICAgICAgICAgICAhVlA4TEJpdFdyaXRlclJlc2l6ZShidywgKHNpemVfdClleHRyYV9zaXplKSkgeworICAgICAgICAgIGJ3LT5jdXJfID0gYnctPmJ1Zl87CisgICAgICAgICAgYnctPmVycm9yXyA9IDE7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICAqKHZwOGxfd3R5cGVfdCopYnctPmN1cl8gPSAodnA4bF93dHlwZV90KVdTV0FQKCh2cDhsX3d0eXBlX3QpbGJpdHMpOworICAgICAgYnctPmN1cl8gKz0gVlA4TF9XUklURVJfQllURVM7CisgICAgICBsYml0cyA+Pj0gVlA4TF9XUklURVJfQklUUzsKKyAgICAgIHVzZWQgLT0gVlA4TF9XUklURVJfQklUUzsKKyAgICB9CisgICAgYnctPmJpdHNfID0gbGJpdHMgfCAoKHZwOGxfYXR5cGVfdCliaXRzIDw8IHVzZWQpOworICAgIGJ3LT51c2VkXyA9IHVzZWQgKyBuX2JpdHM7CisgIH0KK30KKwordWludDhfdCogVlA4TEJpdFdyaXRlckZpbmlzaChWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICAvLyBmbHVzaCBsZWZ0b3ZlciBiaXRzCisgIGlmIChWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoYnctPnVzZWRfICsgNykgPj4gMykpIHsKKyAgICB3aGlsZSAoYnctPnVzZWRfID4gMCkgeworICAgICAgKmJ3LT5jdXJfKysgPSAodWludDhfdClidy0+Yml0c187CisgICAgICBidy0+Yml0c18gPj49IDg7CisgICAgICBidy0+dXNlZF8gLT0gODsKKyAgICB9CisgICAgYnctPnVzZWRfID0gMDsKKyAgfQorICByZXR1cm4gYnctPmJ1Zl87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJmOWEyZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX1VUSUxTX0JJVF9XUklURVJfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19CSVRfV1JJVEVSX0hfCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQml0LXdyaXRpbmcKKwordHlwZWRlZiBzdHJ1Y3QgVlA4Qml0V3JpdGVyIFZQOEJpdFdyaXRlcjsKK3N0cnVjdCBWUDhCaXRXcml0ZXIgeworICBpbnQzMl90ICByYW5nZV87ICAgICAgLy8gcmFuZ2UtMQorICBpbnQzMl90ICB2YWx1ZV87CisgIGludCAgICAgIHJ1bl87ICAgICAgICAvLyBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYml0cworICBpbnQgICAgICBuYl9iaXRzXzsgICAgLy8gbnVtYmVyIG9mIHBlbmRpbmcgYml0cworICB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW50ZXJuYWwgYnVmZmVyLiBSZS1hbGxvY2F0ZWQgcmVndWxhcmx5LiBOb3Qgb3duZWQuCisgIHNpemVfdCAgIHBvc187CisgIHNpemVfdCAgIG1heF9wb3NfOworICBpbnQgICAgICBlcnJvcl87ICAgICAgLy8gdHJ1ZSBpbiBjYXNlIG9mIGVycm9yCit9OworCisvLyBJbml0aWFsaXplIHRoZSBvYmplY3QuIEFsbG9jYXRlcyBzb21lIGluaXRpYWwgbWVtb3J5IGJhc2VkIG9uIGV4cGVjdGVkX3NpemUuCitpbnQgVlA4Qml0V3JpdGVySW5pdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSk7CisvLyBGaW5hbGl6ZSB0aGUgYml0c3RyZWFtIGNvZGluZy4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KK3VpbnQ4X3QqIFZQOEJpdFdyaXRlckZpbmlzaChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFJlbGVhc2UgYW55IHBlbmRpbmcgbWVtb3J5IGFuZCB6ZXJvZXMgdGhlIG9iamVjdC4gTm90IGEgbWFuZGF0b3J5IGNhbGwuCisvLyBPbmx5IHVzZWZ1bCBpbiBjYXNlIG9mIGVycm9yLCB3aGVuIHRoZSBpbnRlcm5hbCBidWZmZXIgaGFzbid0IGJlZW4gZ3JhYmJlZCEKK3ZvaWQgVlA4Qml0V3JpdGVyV2lwZU91dChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKworaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYik7CitpbnQgVlA4UHV0Qml0VW5pZm9ybShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0KTsKK3ZvaWQgVlA4UHV0Qml0cyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCB2YWx1ZSwgaW50IG5iX2JpdHMpOwordm9pZCBWUDhQdXRTaWduZWRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCB2YWx1ZSwgaW50IG5iX2JpdHMpOworCisvLyBBcHBlbmRzIHNvbWUgYnl0ZXMgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4gRGF0YSBpcyBjb3BpZWQuCitpbnQgVlA4Qml0V3JpdGVyQXBwZW5kKFZQOEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8gcmV0dXJuIGFwcHJveGltYXRlIHdyaXRlIHBvc2l0aW9uIChpbiBiaXRzKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IFZQOEJpdFdyaXRlclBvcyhjb25zdCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIHJldHVybiAodWludDY0X3QpKGJ3LT5wb3NfICsgYnctPnJ1bl8pICogOCArIDggKyBidy0+bmJfYml0c187Cit9CisKKy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCogVlA4Qml0V3JpdGVyQnVmKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIGJ3LT5idWZfOworfQorLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhCaXRXcml0ZXJTaXplKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIGJ3LT5wb3NfOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFdyaXRlcgorCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX1g2NCkgICAvLyA2NGJpdAordHlwZWRlZiB1aW50NjRfdCB2cDhsX2F0eXBlX3Q7ICAgLy8gYWNjdW11bGF0b3IgdHlwZQordHlwZWRlZiB1aW50MzJfdCB2cDhsX3d0eXBlX3Q7ICAgLy8gd3JpdGluZyB0eXBlCisjZGVmaW5lIFdTV0FQIEhUb0xFMzIKKyNkZWZpbmUgVlA4TF9XUklURVJfQllURVMgICAgNCAgIC8vIHNpemVvZih2cDhsX3d0eXBlX3QpCisjZGVmaW5lIFZQOExfV1JJVEVSX0JJVFMgICAgIDMyICAvLyA4ICogc2l6ZW9mKHZwOGxfd3R5cGVfdCkKKyNkZWZpbmUgVlA4TF9XUklURVJfTUFYX0JJVFMgNjQgIC8vIDggKiBzaXplb2YodnA4bF9hdHlwZV90KQorI2Vsc2UKK3R5cGVkZWYgdWludDMyX3QgdnA4bF9hdHlwZV90OwordHlwZWRlZiB1aW50MTZfdCB2cDhsX3d0eXBlX3Q7CisjZGVmaW5lIFdTV0FQIEhUb0xFMTYKKyNkZWZpbmUgVlA4TF9XUklURVJfQllURVMgICAgMgorI2RlZmluZSBWUDhMX1dSSVRFUl9CSVRTICAgICAxNgorI2RlZmluZSBWUDhMX1dSSVRFUl9NQVhfQklUUyAzMgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdnA4bF9hdHlwZV90IGJpdHNfOyAgIC8vIGJpdCBhY2N1bXVsYXRvcgorICBpbnQgICAgICAgICAgdXNlZF87ICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBhY2N1bXVsYXRvcgorICB1aW50OF90KiAgICAgYnVmXzsgICAgLy8gc3RhcnQgb2YgYnVmZmVyCisgIHVpbnQ4X3QqICAgICBjdXJfOyAgICAvLyBjdXJyZW50IHdyaXRlIHBvc2l0aW9uCisgIHVpbnQ4X3QqICAgICBlbmRfOyAgICAvLyBlbmQgb2YgYnVmZmVyCisKKyAgLy8gQWZ0ZXIgYWxsIGJpdHMgYXJlIHdyaXR0ZW4gKFZQOExCaXRXcml0ZXJGaW5pc2goKSksIHRoZSBjYWxsZXIgbXVzdCBvYnNlcnZlCisgIC8vIHRoZSBzdGF0ZSBvZiBlcnJvcl8uIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhhdCBhIG1lbW9yeSBhbGxvY2F0aW9uCisgIC8vIGZhaWx1cmUgaGFzIGhhcHBlbmVkIGR1cmluZyBiaXQgd3JpdGluZy4gQSB2YWx1ZSBvZiAwIGluZGljYXRlcyBzdWNjZXNzZnVsCisgIC8vIHdyaXRpbmcgb2YgYml0cy4KKyAgaW50IGVycm9yXzsKK30gVlA4TEJpdFdyaXRlcjsKKworc3RhdGljIFdFQlBfSU5MSU5FIHNpemVfdCBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgcmV0dXJuIChidy0+Y3VyXyAtIGJ3LT5idWZfKSArICgoYnctPnVzZWRfICsgNykgPj4gMyk7Cit9CisKKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK2ludCBWUDhMQml0V3JpdGVySW5pdChWUDhMQml0V3JpdGVyKiBjb25zdCBidywgc2l6ZV90IGV4cGVjdGVkX3NpemUpOworLy8gRmluYWxpemUgdGhlIGJpdHN0cmVhbSBjb2RpbmcuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCit1aW50OF90KiBWUDhMQml0V3JpdGVyRmluaXNoKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFJlbGVhc2UgYW55IHBlbmRpbmcgbWVtb3J5IGFuZCB6ZXJvZXMgdGhlIG9iamVjdC4KK3ZvaWQgVlA4TEJpdFdyaXRlcldpcGVPdXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncpOworCisvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgVlA4TFB1dEJpdHMgZmx1c2hpbmcgMzIgYml0cyBmcm9tIHRoZSB3cml0dGVuIHN0YXRlLgordm9pZCBWUDhMUHV0Qml0c0ZsdXNoQml0cyhWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7CisKKy8vIFB1dEJpdHMgaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBpbiB0aGUgMTYgYml0IHZwOGxfd3R5cGVfdCBjYXNlLgordm9pZCBWUDhMUHV0Qml0c0ludGVybmFsKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCB1aW50MzJfdCBiaXRzLCBpbnQgbl9iaXRzKTsKKworLy8gVGhpcyBmdW5jdGlvbiB3cml0ZXMgYml0cyBpbnRvIGJ5dGVzIGluIGluY3JlYXNpbmcgYWRkcmVzc2VzIChsaXR0bGUgZW5kaWFuKSwKKy8vIGFuZCB3aXRoaW4gYSBieXRlIGxlYXN0LXNpZ25pZmljYW50LWJpdCBmaXJzdC4KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIHdyaXRlIHVwIHRvIDMyIGJpdHMgaW4gb25lIGdvLCBidXQgVlA4TEJpdFJlYWRlciBjYW4gb25seQorLy8gcmVhZCAyNCBiaXRzIG1heCAoVlA4TF9NQVhfTlVNX0JJVF9SRUFEKS4KKy8vIFZQOExCaXRXcml0ZXIncyBlcnJvcl8gZmxhZyBpcyBzZXQgaW4gY2FzZSBvZiAgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHV0Qml0cyhWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdHMsIGludCBuX2JpdHMpIHsKKyAgaWYgKHNpemVvZih2cDhsX3d0eXBlX3QpID09IDQpIHsKKyAgICBpZiAobl9iaXRzID4gMCkgeworICAgICAgaWYgKGJ3LT51c2VkXyA+PSAzMikgeworICAgICAgICBWUDhMUHV0Qml0c0ZsdXNoQml0cyhidyk7CisgICAgICB9CisgICAgICBidy0+Yml0c18gfD0gKHZwOGxfYXR5cGVfdCliaXRzIDw8IGJ3LT51c2VkXzsKKyAgICAgIGJ3LT51c2VkXyArPSBuX2JpdHM7CisgICAgfQorICB9IGVsc2UgeworICAgIFZQOExQdXRCaXRzSW50ZXJuYWwoYncsIGJpdHMsIG5fYml0cyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfVVRJTFNfQklUX1dSSVRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjM2M1NwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmMKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvbG9yIENhY2hlIGZvciBXZWJQIExvc3NsZXNzCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExDb2xvckNhY2hlLgorCitpbnQgVlA4TENvbG9yQ2FjaGVJbml0KFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywgaW50IGhhc2hfYml0cykgeworICBjb25zdCBpbnQgaGFzaF9zaXplID0gMSA8PCBoYXNoX2JpdHM7CisgIGFzc2VydChjYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGhhc2hfYml0cyA+IDApOworICBjYy0+Y29sb3JzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVDYWxsb2MoKHVpbnQ2NF90KWhhc2hfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY2MtPmNvbG9yc18pKTsKKyAgaWYgKGNjLT5jb2xvcnNfID09IE5VTEwpIHJldHVybiAwOworICBjYy0+aGFzaF9zaGlmdF8gPSAzMiAtIGhhc2hfYml0czsKKyAgY2MtPmhhc2hfYml0c18gPSBoYXNoX2JpdHM7CisgIHJldHVybiAxOworfQorCit2b2lkIFZQOExDb2xvckNhY2hlQ2xlYXIoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjKSB7CisgIGlmIChjYyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGNjLT5jb2xvcnNfKTsKKyAgICBjYy0+Y29sb3JzXyA9IE5VTEw7CisgIH0KK30KKwordm9pZCBWUDhMQ29sb3JDYWNoZUNvcHkoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBkc3QpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+aGFzaF9iaXRzXyA9PSBkc3QtPmhhc2hfYml0c18pOworICBtZW1jcHkoZHN0LT5jb2xvcnNfLCBzcmMtPmNvbG9yc18sCisgICAgICAgICAoKHNpemVfdCkxdSA8PCBkc3QtPmhhc2hfYml0c18pICogc2l6ZW9mKCpkc3QtPmNvbG9yc18pKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Nzk1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5oCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb2xvciBDYWNoZSBmb3IgV2ViUCBMb3NzbGVzcworLy8KKy8vIEF1dGhvcnM6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19DT0xPUl9DQUNIRV9IXworCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTWFpbiBjb2xvciBjYWNoZSBzdHJ1Y3QuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90ICpjb2xvcnNfOyAgLy8gY29sb3IgZW50cmllcworICBpbnQgaGFzaF9zaGlmdF87ICAgIC8vIEhhc2ggc2hpZnQ6IDMyIC0gaGFzaF9iaXRzXy4KKyAgaW50IGhhc2hfYml0c187Cit9IFZQOExDb2xvckNhY2hlOworCitzdGF0aWMgY29uc3QgdWludDMyX3Qga0hhc2hNdWwgPSAweDFlMzVhN2JkOworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TENvbG9yQ2FjaGVMb29rdXAoCisgICAgY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLCB1aW50MzJfdCBrZXkpIHsKKyAgYXNzZXJ0KChrZXkgPj4gY2MtPmhhc2hfYml0c18pID09IDB1KTsKKyAgcmV0dXJuIGNjLT5jb2xvcnNfW2tleV07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExDb2xvckNhY2hlU2V0KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleSwgdWludDMyX3QgYXJnYikgeworICBhc3NlcnQoKGtleSA+PiBjYy0+aGFzaF9iaXRzXykgPT0gMHUpOworICBjYy0+Y29sb3JzX1trZXldID0gYXJnYjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBjb25zdCB1aW50MzJfdCBrZXkgPSAoa0hhc2hNdWwgKiBhcmdiKSA+PiBjYy0+aGFzaF9zaGlmdF87CisgIGNjLT5jb2xvcnNfW2tleV0gPSBhcmdiOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgcmV0dXJuIChrSGFzaE11bCAqIGFyZ2IpID4+IGNjLT5oYXNoX3NoaWZ0XzsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGtleSA9IChrSGFzaE11bCAqIGFyZ2IpID4+IGNjLT5oYXNoX3NoaWZ0XzsKKyAgcmV0dXJuIChjYy0+Y29sb3JzX1trZXldID09IGFyZ2IpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbml0aWFsaXplcyB0aGUgY29sb3IgY2FjaGUgd2l0aCAnaGFzaF9iaXRzJyBiaXRzIGZvciB0aGUga2V5cy4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitpbnQgVlA4TENvbG9yQ2FjaGVJbml0KFZQOExDb2xvckNhY2hlKiBjb25zdCBjb2xvcl9jYWNoZSwgaW50IGhhc2hfYml0cyk7CisKK3ZvaWQgVlA4TENvbG9yQ2FjaGVDb3B5KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZSogY29uc3QgZHN0KTsKKworLy8gRGVsZXRlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byBjb2xvciBjYWNoZS4KK3ZvaWQgVlA4TENvbG9yQ2FjaGVDbGVhcihWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIENIUk9NSVVNX1dFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2VuZGlhbl9pbmwuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2VuZGlhbl9pbmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJjMzJiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZW5kaWFuX2lubC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRW5kaWFuIHJlbGF0ZWQgZnVuY3Rpb25zLgorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfRU5ESUFOX0lOTF9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX0VORElBTl9JTkxfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICIuLi93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvdHlwZXMuaCIKKworLy8gc29tZSBlbmRpYW4gZml4IChlLmcuOiBtaXBzLWdjYyBkb2Vzbid0IGRlZmluZSBfX0JJR19FTkRJQU5fXykKKyNpZiAhZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pICYmIFwKKyAgICAoZGVmaW5lZChfX0JJR19FTkRJQU5fXykgfHwgZGVmaW5lZChfTV9QUEMpIHx8IFwKKyAgICAgKGRlZmluZWQoX19CWVRFX09SREVSX18pICYmIChfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXykpKQorI2RlZmluZSBXT1JEU19CSUdFTkRJQU4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisjZGVmaW5lIEhUb0xFMzIgQlN3YXAzMgorI2RlZmluZSBIVG9MRTE2IEJTd2FwMTYKKyNlbHNlCisjZGVmaW5lIEhUb0xFMzIoeCkgKHgpCisjZGVmaW5lIEhUb0xFMTYoeCkgKHgpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKEhBVkVfQ09ORklHX0gpCisjaWYgTE9DQUxfR0NDX1BSRVJFUSg0LDgpIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwMTYpCisjZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDE2CisjZW5kaWYKKyNpZiBMT0NBTF9HQ0NfUFJFUkVRKDQsMykgfHwgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYnN3YXAzMikKKyNkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQMzIKKyNlbmRpZgorI2lmIExPQ0FMX0dDQ19QUkVSRVEoNCwzKSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDY0KQorI2RlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVA2NAorI2VuZGlmCisjZW5kaWYgIC8vICFIQVZFX0NPTkZJR19ICisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MTZfdCBCU3dhcDE2KHVpbnQxNl90IHgpIHsKKyNpZiBkZWZpbmVkKEhBVkVfQlVJTFRJTl9CU1dBUDE2KQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwMTYoeCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gX2J5dGVzd2FwX3VzaG9ydCh4KTsKKyNlbHNlCisgIC8vIGdjYyB3aWxsIHJlY29nbml6ZSBhICdyb3J3ICQ4LCAuLi4nIGhlcmU6CisgIHJldHVybiAoeCA+PiA4KSB8ICgoeCAmIDB4ZmYpIDw8IDgpOworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVAxNgorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQlN3YXAzMih1aW50MzJfdCB4KSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzJfUjIpCisgIHVpbnQzMl90IHJldDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIndzYmggICAlW3JldF0sICVbeF0gICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICVbcmV0XSwgJVtyZXRdLCAgMTYgICBcblx0IgorICAgIDogW3JldF0iPXIiKHJldCkKKyAgICA6IFt4XSJyIih4KQorICApOworICByZXR1cm4gcmV0OworI2VsaWYgZGVmaW5lZChIQVZFX0JVSUxUSU5fQlNXQVAzMikKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDMyKHgpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICB1aW50MzJfdCBzd2FwcGVkX2J5dGVzOworICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcCAlMCIgOiAiPXIiKHN3YXBwZWRfYnl0ZXMpIDogIjAiKHgpKTsKKyAgcmV0dXJuIHN3YXBwZWRfYnl0ZXM7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gKHVpbnQzMl90KV9ieXRlc3dhcF91bG9uZyh4KTsKKyNlbHNlCisgIHJldHVybiAoeCA+PiAyNCkgfCAoKHggPj4gOCkgJiAweGZmMDApIHwgKCh4IDw8IDgpICYgMHhmZjAwMDApIHwgKHggPDwgMjQpOworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVAzMgorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgQlN3YXA2NCh1aW50NjRfdCB4KSB7CisjaWYgZGVmaW5lZChIQVZFX0JVSUxUSU5fQlNXQVA2NCkKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDY0KHgpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICB1aW50NjRfdCBzd2FwcGVkX2J5dGVzOworICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcHEgJTAiIDogIj1yIihzd2FwcGVkX2J5dGVzKSA6ICIwIih4KSk7CisgIHJldHVybiBzd2FwcGVkX2J5dGVzOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuICh1aW50NjRfdClfYnl0ZXN3YXBfdWludDY0KHgpOworI2Vsc2UgIC8vIGdlbmVyaWMgY29kZSBmb3Igc3dhcHBpbmcgNjQtYml0IHZhbHVlcyAoc3VnZ2VzdGVkIGJ5IGJkYkApCisgIHggPSAoKHggJiAweGZmZmZmZmZmMDAwMDAwMDB1bGwpID4+IDMyKSB8ICgoeCAmIDB4MDAwMDAwMDBmZmZmZmZmZnVsbCkgPDwgMzIpOworICB4ID0gKCh4ICYgMHhmZmZmMDAwMGZmZmYwMDAwdWxsKSA+PiAxNikgfCAoKHggJiAweDAwMDBmZmZmMDAwMGZmZmZ1bGwpIDw8IDE2KTsKKyAgeCA9ICgoeCAmIDB4ZmYwMGZmMDBmZjAwZmYwMHVsbCkgPj4gIDgpIHwgKCh4ICYgMHgwMGZmMDBmZjAwZmYwMGZmdWxsKSA8PCAgOCk7CisgIHJldHVybiB4OworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVA2NAorfQorCisjZW5kaWYgIC8vIENIUk9NSVVNX1dFQlBfVVRJTFNfRU5ESUFOX0lOTF9IXwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZmlsdGVycy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTBmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9maWx0ZXJzLmMKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGZpbHRlciBlc3RpbWF0aW9uCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9maWx0ZXJzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWljayBlc3RpbWF0ZSBvZiBhIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIGZpbHRlciBtb2RlIHRvIHRyeS4KKworI2RlZmluZSBTTUFYIDE2CisjZGVmaW5lIFNESUZGKGEsIGIpIChhYnMoKGEpIC0gKGIpKSA+PiA0KSAgIC8vIFNjb3JpbmcgZGlmZiwgaW4gWzAuLlNNQVgpCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3IodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCitXRUJQX0ZJTFRFUl9UWVBFIFdlYlBFc3RpbWF0ZUJlc3RGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIGludCBiaW5zW1dFQlBfRklMVEVSX0xBU1RdW1NNQVhdOworICBtZW1zZXQoYmlucywgMCwgc2l6ZW9mKGJpbnMpKTsKKworICAvLyBXZSBvbmx5IHNhbXBsZSBldmVyeSBvdGhlciBwaXhlbHMuIFRoYXQncyBlbm91Z2guCisgIGZvciAoaiA9IDI7IGogPCBoZWlnaHQgLSAxOyBqICs9IDIpIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gZGF0YSArIGogKiBzdHJpZGU7CisgICAgaW50IG1lYW4gPSBwWzBdOworICAgIGZvciAoaSA9IDI7IGkgPCB3aWR0aCAtIDE7IGkgKz0gMikgeworICAgICAgY29uc3QgaW50IGRpZmYwID0gU0RJRkYocFtpXSwgbWVhbik7CisgICAgICBjb25zdCBpbnQgZGlmZjEgPSBTRElGRihwW2ldLCBwW2kgLSAxXSk7CisgICAgICBjb25zdCBpbnQgZGlmZjIgPSBTRElGRihwW2ldLCBwW2kgLSB3aWR0aF0pOworICAgICAgY29uc3QgaW50IGdyYWRfcHJlZCA9CisgICAgICAgICAgR3JhZGllbnRQcmVkaWN0b3IocFtpIC0gMV0sIHBbaSAtIHdpZHRoXSwgcFtpIC0gd2lkdGggLSAxXSk7CisgICAgICBjb25zdCBpbnQgZGlmZjMgPSBTRElGRihwW2ldLCBncmFkX3ByZWQpOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9OT05FXVtkaWZmMF0gPSAxOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXVtkaWZmMV0gPSAxOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF1bZGlmZjJdID0gMTsKKyAgICAgIGJpbnNbV0VCUF9GSUxURVJfR1JBRElFTlRdW2RpZmYzXSA9IDE7CisgICAgICBtZWFuID0gKDMgKiBtZWFuICsgcFtpXSArIDIpID4+IDI7CisgICAgfQorICB9CisgIHsKKyAgICBpbnQgZmlsdGVyOworICAgIFdFQlBfRklMVEVSX1RZUEUgYmVzdF9maWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOworICAgIGludCBiZXN0X3Njb3JlID0gMHg3ZmZmZmZmZjsKKyAgICBmb3IgKGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7IGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1Q7ICsrZmlsdGVyKSB7CisgICAgICBpbnQgc2NvcmUgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IFNNQVg7ICsraSkgeworICAgICAgICBpZiAoYmluc1tmaWx0ZXJdW2ldID4gMCkgeworICAgICAgICAgIHNjb3JlICs9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICBiZXN0X2ZpbHRlciA9IChXRUJQX0ZJTFRFUl9UWVBFKWZpbHRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJlc3RfZmlsdGVyOworICB9Cit9CisKKyN1bmRlZiBTTUFYCisjdW5kZWYgU0RJRkYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0ODFkCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvZmlsdGVycy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfRklMVEVSU19IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX0ZJTFRFUlNfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEZhc3QgZXN0aW1hdGUgb2YgYSBwb3RlbnRpYWxseSBnb29kIGZpbHRlci4KK1dFQlBfRklMVEVSX1RZUEUgV2ViUEVzdGltYXRlQmVzdEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1VUSUxTX0ZJTFRFUlNfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIwZjlhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbi5jCkBAIC0wLDAgKzEsMjA1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhbmQgbG9va2luZyB1cCBIdWZmbWFuIHRyZWVzLgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLyBIdWZmbWFuIGRhdGEgcmVhZCB2aWEgRGVjb2RlSW1hZ2VTdHJlYW0gaXMgcmVwcmVzZW50ZWQgaW4gdHdvIChyZWQgYW5kIGdyZWVuKQorLy8gYnl0ZXMuCisjZGVmaW5lIE1BWF9IVFJFRV9HUk9VUFMgICAgMHgxMDAwMAorCitIVHJlZUdyb3VwKiBWUDhMSHRyZWVHcm91cHNOZXcoaW50IG51bV9odHJlZV9ncm91cHMpIHsKKyAgSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXBzID0KKyAgICAgIChIVHJlZUdyb3VwKilXZWJQU2FmZU1hbGxvYyhudW1faHRyZWVfZ3JvdXBzLCBzaXplb2YoKmh0cmVlX2dyb3VwcykpOworICBpZiAoaHRyZWVfZ3JvdXBzID09IE5VTEwpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBhc3NlcnQobnVtX2h0cmVlX2dyb3VwcyA8PSBNQVhfSFRSRUVfR1JPVVBTKTsKKyAgcmV0dXJuIGh0cmVlX2dyb3VwczsKK30KKwordm9pZCBWUDhMSHRyZWVHcm91cHNGcmVlKEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3VwcykgeworICBpZiAoaHRyZWVfZ3JvdXBzICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUoaHRyZWVfZ3JvdXBzKTsKKyAgfQorfQorCisvLyBSZXR1cm5zIHJldmVyc2UocmV2ZXJzZShrZXksIGxlbikgKyAxLCBsZW4pLCB3aGVyZSByZXZlcnNlKGtleSwgbGVuKSBpcyB0aGUKKy8vIGJpdC13aXNlIHJldmVyc2FsIG9mIHRoZSBsZW4gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiBrZXkuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0TmV4dEtleSh1aW50MzJfdCBrZXksIGludCBsZW4pIHsKKyAgdWludDMyX3Qgc3RlcCA9IDEgPDwgKGxlbiAtIDEpOworICB3aGlsZSAoa2V5ICYgc3RlcCkgeworICAgIHN0ZXAgPj49IDE7CisgIH0KKyAgcmV0dXJuIChrZXkgJiAoc3RlcCAtIDEpKSArIHN0ZXA7Cit9CisKKy8vIFN0b3JlcyBjb2RlIGluIHRhYmxlWzBdLCB0YWJsZVtzdGVwXSwgdGFibGVbMipzdGVwXSwgLi4uLCB0YWJsZVtlbmRdLgorLy8gQXNzdW1lcyB0aGF0IGVuZCBpcyBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHN0ZXAuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSZXBsaWNhdGVWYWx1ZShIdWZmbWFuQ29kZSogdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5Db2RlIGNvZGUpIHsKKyAgYXNzZXJ0KGVuZCAlIHN0ZXAgPT0gMCk7CisgIGRvIHsKKyAgICBlbmQgLT0gc3RlcDsKKyAgICB0YWJsZVtlbmRdID0gY29kZTsKKyAgfSB3aGlsZSAoZW5kID4gMCk7Cit9CisKKy8vIFJldHVybnMgdGhlIHRhYmxlIHdpZHRoIG9mIHRoZSBuZXh0IDJuZCBsZXZlbCB0YWJsZS4gY291bnQgaXMgdGhlIGhpc3RvZ3JhbQorLy8gb2YgYml0IGxlbmd0aHMgZm9yIHRoZSByZW1haW5pbmcgc3ltYm9scywgbGVuIGlzIHRoZSBjb2RlIGxlbmd0aCBvZiB0aGUgbmV4dAorLy8gcHJvY2Vzc2VkIHN5bWJvbAorc3RhdGljIFdFQlBfSU5MSU5FIGludCBOZXh0VGFibGVCaXRTaXplKGNvbnN0IGludCogY29uc3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHJvb3RfYml0cykgeworICBpbnQgbGVmdCA9IDEgPDwgKGxlbiAtIHJvb3RfYml0cyk7CisgIHdoaWxlIChsZW4gPCBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCkgeworICAgIGxlZnQgLT0gY291bnRbbGVuXTsKKyAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKKyAgICArK2xlbjsKKyAgICBsZWZ0IDw8PSAxOworICB9CisgIHJldHVybiBsZW4gLSByb290X2JpdHM7Cit9CisKK2ludCBWUDhMQnVpbGRIdWZmbWFuVGFibGUoSHVmZm1hbkNvZGUqIGNvbnN0IHJvb3RfdGFibGUsIGludCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aHNbXSwgaW50IGNvZGVfbGVuZ3Roc19zaXplKSB7CisgIEh1ZmZtYW5Db2RlKiB0YWJsZSA9IHJvb3RfdGFibGU7ICAvLyBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZQorICBpbnQgdG90YWxfc2l6ZSA9IDEgPDwgcm9vdF9iaXRzOyAgLy8gdG90YWwgc2l6ZSByb290IHRhYmxlICsgMm5kIGxldmVsIHRhYmxlCisgIGludCogc29ydGVkID0gTlVMTDsgICAgICAgICAgICAgICAvLyBzeW1ib2xzIHNvcnRlZCBieSBjb2RlIGxlbmd0aAorICBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBjb2RlIGxlbmd0aAorICBpbnQgc3ltYm9sOyAgICAgICAgICAgICAgICAgICAgICAgLy8gc3ltYm9sIGluZGV4IGluIG9yaWdpbmFsIG9yIHNvcnRlZCB0YWJsZQorICAvLyBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGg6CisgIGludCBjb3VudFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdID0geyAwIH07CisgIC8vIG9mZnNldHMgaW4gc29ydGVkIHRhYmxlIGZvciBlYWNoIGxlbmd0aDoKKyAgaW50IG9mZnNldFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdOworCisgIGFzc2VydChjb2RlX2xlbmd0aHNfc2l6ZSAhPSAwKTsKKyAgYXNzZXJ0KGNvZGVfbGVuZ3RocyAhPSBOVUxMKTsKKyAgYXNzZXJ0KHJvb3RfdGFibGUgIT0gTlVMTCk7CisgIGFzc2VydChyb290X2JpdHMgPiAwKTsKKworICAvLyBCdWlsZCBoaXN0b2dyYW0gb2YgY29kZSBsZW5ndGhzLgorICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgeworICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKytjb3VudFtjb2RlX2xlbmd0aHNbc3ltYm9sXV07CisgIH0KKworICAvLyBFcnJvciwgYWxsIGNvZGUgbGVuZ3RocyBhcmUgemVyb3MuCisgIGlmIChjb3VudFswXSA9PSBjb2RlX2xlbmd0aHNfc2l6ZSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gR2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHNvcnRlZCBzeW1ib2wgdGFibGUgYnkgY29kZSBsZW5ndGguCisgIG9mZnNldFsxXSA9IDA7CisgIGZvciAobGVuID0gMTsgbGVuIDwgTUFYX0FMTE9XRURfQ09ERV9MRU5HVEg7ICsrbGVuKSB7CisgICAgaWYgKGNvdW50W2xlbl0gPiAoMSA8PCBsZW4pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2Zmc2V0W2xlbiArIDFdID0gb2Zmc2V0W2xlbl0gKyBjb3VudFtsZW5dOworICB9CisKKyAgc29ydGVkID0gKGludCopV2ViUFNhZmVNYWxsb2MoY29kZV9sZW5ndGhzX3NpemUsIHNpemVvZigqc29ydGVkKSk7CisgIGlmIChzb3J0ZWQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gU29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aC4KKyAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKKyAgICBjb25zdCBpbnQgc3ltYm9sX2NvZGVfbGVuZ3RoID0gY29kZV9sZW5ndGhzW3N5bWJvbF07CisgICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gMCkgeworICAgICAgc29ydGVkW29mZnNldFtzeW1ib2xfY29kZV9sZW5ndGhdKytdID0gc3ltYm9sOworICAgIH0KKyAgfQorCisgIC8vIFNwZWNpYWwgY2FzZSBjb2RlIHdpdGggb25seSBvbmUgdmFsdWUuCisgIGlmIChvZmZzZXRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEhdID09IDEpIHsKKyAgICBIdWZmbWFuQ29kZSBjb2RlOworICAgIGNvZGUuYml0cyA9IDA7CisgICAgY29kZS52YWx1ZSA9ICh1aW50MTZfdClzb3J0ZWRbMF07CisgICAgUmVwbGljYXRlVmFsdWUodGFibGUsIDEsIHRvdGFsX3NpemUsIGNvZGUpOworICAgIFdlYlBTYWZlRnJlZShzb3J0ZWQpOworICAgIHJldHVybiB0b3RhbF9zaXplOworICB9CisKKyAgeworICAgIGludCBzdGVwOyAgICAgICAgICAgICAgLy8gc3RlcCBzaXplIHRvIHJlcGxpY2F0ZSB2YWx1ZXMgaW4gY3VycmVudCB0YWJsZQorICAgIHVpbnQzMl90IGxvdyA9IC0xOyAgICAgLy8gbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeQorICAgIHVpbnQzMl90IG1hc2sgPSB0b3RhbF9zaXplIC0gMTsgICAgLy8gbWFzayBmb3IgbG93IGJpdHMKKyAgICB1aW50MzJfdCBrZXkgPSAwOyAgICAgIC8vIHJldmVyc2VkIHByZWZpeCBjb2RlCisgICAgaW50IG51bV9ub2RlcyA9IDE7ICAgICAvLyBudW1iZXIgb2YgSHVmZm1hbiB0cmVlIG5vZGVzCisgICAgaW50IG51bV9vcGVuID0gMTsgICAgICAvLyBudW1iZXIgb2Ygb3BlbiBicmFuY2hlcyBpbiBjdXJyZW50IHRyZWUgbGV2ZWwKKyAgICBpbnQgdGFibGVfYml0cyA9IHJvb3RfYml0czsgICAgICAgIC8vIGtleSBsZW5ndGggb2YgY3VycmVudCB0YWJsZQorICAgIGludCB0YWJsZV9zaXplID0gMSA8PCB0YWJsZV9iaXRzOyAgLy8gc2l6ZSBvZiBjdXJyZW50IHRhYmxlCisgICAgc3ltYm9sID0gMDsKKyAgICAvLyBGaWxsIGluIHJvb3QgdGFibGUuCisgICAgZm9yIChsZW4gPSAxLCBzdGVwID0gMjsgbGVuIDw9IHJvb3RfYml0czsgKytsZW4sIHN0ZXAgPDw9IDEpIHsKKyAgICAgIG51bV9vcGVuIDw8PSAxOworICAgICAgbnVtX25vZGVzICs9IG51bV9vcGVuOworICAgICAgbnVtX29wZW4gLT0gY291bnRbbGVuXTsKKyAgICAgIGlmIChudW1fb3BlbiA8IDApIHsKKyAgICAgICAgV2ViUFNhZmVGcmVlKHNvcnRlZCk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZm9yICg7IGNvdW50W2xlbl0gPiAwOyAtLWNvdW50W2xlbl0pIHsKKyAgICAgICAgSHVmZm1hbkNvZGUgY29kZTsKKyAgICAgICAgY29kZS5iaXRzID0gKHVpbnQ4X3QpbGVuOworICAgICAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFtzeW1ib2wrK107CisgICAgICAgIFJlcGxpY2F0ZVZhbHVlKCZ0YWJsZVtrZXldLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTsKKyAgICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmlsbCBpbiAybmQgbGV2ZWwgdGFibGVzIGFuZCBhZGQgcG9pbnRlcnMgdG8gcm9vdCB0YWJsZS4KKyAgICBmb3IgKGxlbiA9IHJvb3RfYml0cyArIDEsIHN0ZXAgPSAyOyBsZW4gPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEg7CisgICAgICAgICArK2xlbiwgc3RlcCA8PD0gMSkgeworICAgICAgbnVtX29wZW4gPDw9IDE7CisgICAgICBudW1fbm9kZXMgKz0gbnVtX29wZW47CisgICAgICBudW1fb3BlbiAtPSBjb3VudFtsZW5dOworICAgICAgaWYgKG51bV9vcGVuIDwgMCkgeworICAgICAgICBXZWJQU2FmZUZyZWUoc29ydGVkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBmb3IgKDsgY291bnRbbGVuXSA+IDA7IC0tY291bnRbbGVuXSkgeworICAgICAgICBIdWZmbWFuQ29kZSBjb2RlOworICAgICAgICBpZiAoKGtleSAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgIHRhYmxlICs9IHRhYmxlX3NpemU7CisgICAgICAgICAgdGFibGVfYml0cyA9IE5leHRUYWJsZUJpdFNpemUoY291bnQsIGxlbiwgcm9vdF9iaXRzKTsKKyAgICAgICAgICB0YWJsZV9zaXplID0gMSA8PCB0YWJsZV9iaXRzOworICAgICAgICAgIHRvdGFsX3NpemUgKz0gdGFibGVfc2l6ZTsKKyAgICAgICAgICBsb3cgPSBrZXkgJiBtYXNrOworICAgICAgICAgIHJvb3RfdGFibGVbbG93XS5iaXRzID0gKHVpbnQ4X3QpKHRhYmxlX2JpdHMgKyByb290X2JpdHMpOworICAgICAgICAgIHJvb3RfdGFibGVbbG93XS52YWx1ZSA9ICh1aW50MTZfdCkoKHRhYmxlIC0gcm9vdF90YWJsZSkgLSBsb3cpOworICAgICAgICB9CisgICAgICAgIGNvZGUuYml0cyA9ICh1aW50OF90KShsZW4gLSByb290X2JpdHMpOworICAgICAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFtzeW1ib2wrK107CisgICAgICAgIFJlcGxpY2F0ZVZhbHVlKCZ0YWJsZVtrZXkgPj4gcm9vdF9iaXRzXSwgc3RlcCwgdGFibGVfc2l6ZSwgY29kZSk7CisgICAgICAgIGtleSA9IEdldE5leHRLZXkoa2V5LCBsZW4pOworICAgICAgfQorICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRyZWUgaXMgZnVsbC4KKyAgICBpZiAobnVtX25vZGVzICE9IDIgKiBvZmZzZXRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEhdIC0gMSkgeworICAgICAgV2ViUFNhZmVGcmVlKHNvcnRlZCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBXZWJQU2FmZUZyZWUoc29ydGVkKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRkMTk1MwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uaApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhbmQgbG9va2luZyB1cCBIdWZmbWFuIHRyZWVzLgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX1VUSUxTX0hVRkZNQU5fSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19IVUZGTUFOX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgSFVGRk1BTl9UQUJMRV9CSVRTICAgICAgOAorI2RlZmluZSBIVUZGTUFOX1RBQkxFX01BU0sgICAgICAoKDEgPDwgSFVGRk1BTl9UQUJMRV9CSVRTKSAtIDEpCisKKyNkZWZpbmUgTEVOR1RIU19UQUJMRV9CSVRTICAgICAgNworI2RlZmluZSBMRU5HVEhTX1RBQkxFX01BU0sgICAgICAoKDEgPDwgTEVOR1RIU19UQUJMRV9CSVRTKSAtIDEpCisKKworLy8gSHVmZm1hbiBsb29rdXAgdGFibGUgZW50cnkKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBiaXRzOyAgICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhpcyBzeW1ib2wKKyAgdWludDE2X3QgdmFsdWU7ICAgLy8gc3ltYm9sIHZhbHVlIG9yIHRhYmxlIG9mZnNldAorfSBIdWZmbWFuQ29kZTsKKworLy8gbG9uZyB2ZXJzaW9uIGZvciBob2xkaW5nIDMyYiB2YWx1ZXMKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGJpdHM7ICAgICAgICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgdGhpcyBzeW1ib2wsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIGFuIGltcG9zc2libGUgdmFsdWUgaWYgbm90IGEgbGl0ZXJhbCBjb2RlLgorICB1aW50MzJfdCB2YWx1ZTsgICAvLyAzMmIgcGFja2VkIEFSR0IgdmFsdWUgaWYgbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm9uLWxpdGVyYWwgc3ltYm9sIG90aGVyd2lzZQorfSBIdWZmbWFuQ29kZTMyOworCisjZGVmaW5lIEhVRkZNQU5fUEFDS0VEX0JJVFMgNgorI2RlZmluZSBIVUZGTUFOX1BBQ0tFRF9UQUJMRV9TSVpFICgxdSA8PCBIVUZGTUFOX1BBQ0tFRF9CSVRTKQorCisvLyBIdWZmbWFuIHRhYmxlIGdyb3VwLgorLy8gSW5jbHVkZXMgc3BlY2lhbCBoYW5kbGluZyBmb3IgdGhlIGZvbGxvd2luZyBjYXNlczoKKy8vICAtIGlzX3RyaXZpYWxfbGl0ZXJhbDogb25lIGNvbW1vbiBsaXRlcmFsIGJhc2UgZm9yIFJFRC9CTFVFL0FMUEhBIChub3QgR1JFRU4pCisvLyAgLSBpc190cml2aWFsX2NvZGU6IG9ubHkgMSBjb2RlIChubyBiaXQgaXMgcmVhZCBmcm9tIGJpdHN0cmVhbSkKKy8vICAtIHVzZV9wYWNrZWRfdGFibGU6IGZldyBlbm91Z2ggbGl0ZXJhbCBzeW1ib2xzLCBzbyBhbGwgdGhlIGJpdCBjb2RlcworLy8gICAgY2FuIGZpdCBpbnRvIGEgc21hbGwgbG9vay11cCB0YWJsZSBwYWNrZWRfdGFibGVbXQorLy8gVGhlIGNvbW1vbiBsaXRlcmFsIGJhc2UsIGlmIGFwcGxpY2FibGUsIGlzIHN0b3JlZCBpbiAnbGl0ZXJhbF9hcmInLgordHlwZWRlZiBzdHJ1Y3QgSFRyZWVHcm91cCBIVHJlZUdyb3VwOworc3RydWN0IEhUcmVlR3JvdXAgeworICBIdWZmbWFuQ29kZSogaHRyZWVzW0hVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERV07CisgIGludCAgICAgIGlzX3RyaXZpYWxfbGl0ZXJhbDsgIC8vIFRydWUsIGlmIGh1ZmZtYW4gdHJlZXMgZm9yIFJlZCwgQmx1ZSAmIEFscGhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbHMgYXJlIHRyaXZpYWwgKGhhdmUgYSBzaW5nbGUgY29kZSkuCisgIHVpbnQzMl90IGxpdGVyYWxfYXJiOyAgICAgICAgIC8vIElmIGlzX3RyaXZpYWxfbGl0ZXJhbCBpcyB0cnVlLCB0aGlzIGlzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUkdCIHZhbHVlIG9mIHRoZSBwaXhlbCwgd2l0aCBHcmVlbiBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIHNldCB0byB6ZXJvLgorICBpbnQgaXNfdHJpdmlhbF9jb2RlOyAgICAgICAgICAvLyB0cnVlIGlmIGlzX3RyaXZpYWxfbGl0ZXJhbCB3aXRoIG9ubHkgb25lIGNvZGUKKyAgaW50IHVzZV9wYWNrZWRfdGFibGU7ICAgICAgICAgLy8gdXNlIHBhY2tlZCB0YWJsZSBiZWxvdyBmb3Igc2hvcnQgbGl0ZXJhbCBjb2RlCisgIC8vIHRhYmxlIG1hcHBpbmcgaW5wdXQgYml0cyB0byBhIHBhY2tlZCB2YWx1ZXMsIG9yIGVzY2FwZSBjYXNlIHRvIGxpdGVyYWwgY29kZQorICBIdWZmbWFuQ29kZTMyIHBhY2tlZF90YWJsZVtIVUZGTUFOX1BBQ0tFRF9UQUJMRV9TSVpFXTsKK307CisKKy8vIENyZWF0ZXMgdGhlIGluc3RhbmNlIG9mIEhUcmVlR3JvdXAgd2l0aCBzcGVjaWZpZWQgbnVtYmVyIG9mIHRyZWUtZ3JvdXBzLgorSFRyZWVHcm91cCogVlA4TEh0cmVlR3JvdXBzTmV3KGludCBudW1faHRyZWVfZ3JvdXBzKTsKKworLy8gUmVsZWFzZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIEhUcmVlR3JvdXAuCit2b2lkIFZQOExIdHJlZUdyb3Vwc0ZyZWUoSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXBzKTsKKworLy8gQnVpbGRzIEh1ZmZtYW4gbG9va3VwIHRhYmxlIGFzc3VtaW5nIGNvZGUgbGVuZ3RocyBhcmUgaW4gc3ltYm9sIG9yZGVyLgorLy8gVGhlICdjb2RlX2xlbmd0aHMnIGlzIHByZS1hbGxvY2F0ZWQgdGVtcG9yYXJ5IG1lbW9yeSBidWZmZXIgdXNlZCBmb3IgY3JlYXRpbmcKKy8vIHRoZSBodWZmbWFuIHRhYmxlLgorLy8gUmV0dXJucyBidWlsdCB0YWJsZSBzaXplIG9yIDAgaW4gY2FzZSBvZiBlcnJvciAoaW52YWxpZCB0cmVlIG9yCisvLyBtZW1vcnkgZXJyb3IpLgoraW50IFZQOExCdWlsZEh1ZmZtYW5UYWJsZShIdWZmbWFuQ29kZSogY29uc3Qgcm9vdF90YWJsZSwgaW50IHJvb3RfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvZGVfbGVuZ3Roc1tdLCBpbnQgY29kZV9sZW5ndGhzX3NpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQ0hST01JVU1fV0VCUF9VVElMU19IVUZGTUFOX0hfCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuX2VuY29kZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE0NTcyCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYwpAQCAtMCwwICsxLDQxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vCisvLyBFbnRyb3B5IGVuY29kaW5nIChIdWZmbWFuKSBmb3Igd2VicCBsb3NzbGVzcy4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFV0aWwgZnVuY3Rpb24gdG8gb3B0aW1pemUgdGhlIHN5bWJvbCBtYXAgZm9yIFJMRSBjb2RpbmcKKworLy8gSGV1cmlzdGljcyBmb3Igc2VsZWN0aW5nIHRoZSBzdHJpZGUgcmFuZ2VzIHRvIGNvbGxhcHNlLgorc3RhdGljIGludCBWYWx1ZXNTaG91bGRCZUNvbGxhcHNlZFRvU3RyaWRlQXZlcmFnZShpbnQgYSwgaW50IGIpIHsKKyAgcmV0dXJuIGFicyhhIC0gYikgPCA0OworfQorCisvLyBDaGFuZ2UgdGhlIHBvcHVsYXRpb24gY291bnRzIGluIGEgd2F5IHRoYXQgdGhlIGNvbnNlcXVlbnQKKy8vIEh1ZmZtYW4gdHJlZSBjb21wcmVzc2lvbiwgZXNwZWNpYWxseSBpdHMgUkxFLXBhcnQsIGdpdmUgc21hbGxlciBvdXRwdXQuCitzdGF0aWMgdm9pZCBPcHRpbWl6ZUh1ZmZtYW5Gb3JSbGUoaW50IGxlbmd0aCwgdWludDhfdCogY29uc3QgZ29vZF9mb3JfcmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBjb3VudHMpIHsKKyAgLy8gMSkgTGV0J3MgbWFrZSB0aGUgSHVmZm1hbiBjb2RlIG1vcmUgY29tcGF0aWJsZSB3aXRoIHJsZSBlbmNvZGluZy4KKyAgaW50IGk7CisgIGZvciAoOyBsZW5ndGggPj0gMDsgLS1sZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgIHJldHVybjsgIC8vIEFsbCB6ZXJvcy4KKyAgICB9CisgICAgaWYgKGNvdW50c1tsZW5ndGggLSAxXSAhPSAwKSB7CisgICAgICAvLyBOb3cgY291bnRzWzAuLmxlbmd0aCAtIDFdIGRvZXMgbm90IGhhdmUgdHJhaWxpbmcgemVyb3MuCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gMikgTGV0J3MgbWFyayBhbGwgcG9wdWxhdGlvbiBjb3VudHMgdGhhdCBhbHJlYWR5IGNhbiBiZSBlbmNvZGVkCisgIC8vIHdpdGggYW4gcmxlIGNvZGUuCisgIHsKKyAgICAvLyBMZXQncyBub3Qgc3BvaWwgYW55IG9mIHRoZSBleGlzdGluZyBnb29kIHJsZSBjb2Rlcy4KKyAgICAvLyBNYXJrIGFueSBzZXEgb2YgMCdzIHRoYXQgaXMgbG9uZ2VyIGFzIDUgYXMgYSBnb29kX2Zvcl9ybGUuCisgICAgLy8gTWFyayBhbnkgc2VxIG9mIG5vbi0wJ3MgdGhhdCBpcyBsb25nZXIgYXMgNyBhcyBhIGdvb2RfZm9yX3JsZS4KKyAgICB1aW50MzJfdCBzeW1ib2wgPSBjb3VudHNbMF07CisgICAgaW50IHN0cmlkZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCArIDE7ICsraSkgeworICAgICAgaWYgKGkgPT0gbGVuZ3RoIHx8IGNvdW50c1tpXSAhPSBzeW1ib2wpIHsKKyAgICAgICAgaWYgKChzeW1ib2wgPT0gMCAmJiBzdHJpZGUgPj0gNSkgfHwKKyAgICAgICAgICAgIChzeW1ib2wgIT0gMCAmJiBzdHJpZGUgPj0gNykpIHsKKyAgICAgICAgICBpbnQgazsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc3RyaWRlOyArK2spIHsKKyAgICAgICAgICAgIGdvb2RfZm9yX3JsZVtpIC0gayAtIDFdID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RyaWRlID0gMTsKKyAgICAgICAgaWYgKGkgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgc3ltYm9sID0gY291bnRzW2ldOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICArK3N0cmlkZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gMykgTGV0J3MgcmVwbGFjZSB0aG9zZSBwb3B1bGF0aW9uIGNvdW50cyB0aGF0IGxlYWQgdG8gbW9yZSBybGUgY29kZXMuCisgIHsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSAwOworICAgIHVpbnQzMl90IGxpbWl0ID0gY291bnRzWzBdOworICAgIHVpbnQzMl90IHN1bSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCArIDE7ICsraSkgeworICAgICAgaWYgKGkgPT0gbGVuZ3RoIHx8IGdvb2RfZm9yX3JsZVtpXSB8fAorICAgICAgICAgIChpICE9IDAgJiYgZ29vZF9mb3JfcmxlW2kgLSAxXSkgfHwKKyAgICAgICAgICAhVmFsdWVzU2hvdWxkQmVDb2xsYXBzZWRUb1N0cmlkZUF2ZXJhZ2UoY291bnRzW2ldLCBsaW1pdCkpIHsKKyAgICAgICAgaWYgKHN0cmlkZSA+PSA0IHx8IChzdHJpZGUgPj0gMyAmJiBzdW0gPT0gMCkpIHsKKyAgICAgICAgICB1aW50MzJfdCBrOworICAgICAgICAgIC8vIFRoZSBzdHJpZGUgbXVzdCBlbmQsIGNvbGxhcHNlIHdoYXQgd2UgaGF2ZSwgaWYgd2UgaGF2ZSBlbm91Z2ggKDQpLgorICAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gKHN1bSArIHN0cmlkZSAvIDIpIC8gc3RyaWRlOworICAgICAgICAgIGlmIChjb3VudCA8IDEpIHsKKyAgICAgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN1bSA9PSAwKSB7CisgICAgICAgICAgICAvLyBEb24ndCBtYWtlIGFuIGFsbCB6ZXJvcyBzdHJpZGUgdG8gYmUgdXBncmFkZWQgdG8gb25lcy4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZm9yIChrID0gMDsgayA8IHN0cmlkZTsgKytrKSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSB2YWx1ZSBhdCBjb3VudHNbaV0sCisgICAgICAgICAgICAvLyB0aGF0IGlzIGFscmVhZHkgYmVsb25naW5nIHRvIHRoZSBuZXh0IHN0cmlkZS4gVGh1cyAtIDEuCisgICAgICAgICAgICBjb3VudHNbaSAtIGsgLSAxXSA9IGNvdW50OworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJpZGUgPSAwOworICAgICAgICBzdW0gPSAwOworICAgICAgICBpZiAoaSA8IGxlbmd0aCAtIDMpIHsKKyAgICAgICAgICAvLyBBbGwgaW50ZXJlc3Rpbmcgc3RyaWRlcyBoYXZlIGEgY291bnQgb2YgYXQgbGVhc3QgNCwKKyAgICAgICAgICAvLyBhdCBsZWFzdCB3aGVuIG5vbi16ZXJvcy4KKyAgICAgICAgICBsaW1pdCA9IChjb3VudHNbaV0gKyBjb3VudHNbaSArIDFdICsKKyAgICAgICAgICAgICAgICAgICBjb3VudHNbaSArIDJdICsgY291bnRzW2kgKyAzXSArIDIpIC8gNDsKKyAgICAgICAgfSBlbHNlIGlmIChpIDwgbGVuZ3RoKSB7CisgICAgICAgICAgbGltaXQgPSBjb3VudHNbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGltaXQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICArK3N0cmlkZTsKKyAgICAgIGlmIChpICE9IGxlbmd0aCkgeworICAgICAgICBzdW0gKz0gY291bnRzW2ldOworICAgICAgICBpZiAoc3RyaWRlID49IDQpIHsKKyAgICAgICAgICBsaW1pdCA9IChzdW0gKyBzdHJpZGUgLyAyKSAvIHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBBIGNvbXBhcmVyIGZ1bmN0aW9uIGZvciB0d28gSHVmZm1hbiB0cmVlczogc29ydHMgZmlyc3QgYnkgJ3RvdGFsIGNvdW50JworLy8gKG1vcmUgY29tZXMgZmlyc3QpLCBhbmQgdGhlbiBieSAndmFsdWUnIChtb3JlIGNvbWVzIGZpcnN0KS4KK3N0YXRpYyBpbnQgQ29tcGFyZUh1ZmZtYW5UcmVlcyhjb25zdCB2b2lkKiBwdHIxLCBjb25zdCB2b2lkKiBwdHIyKSB7CisgIGNvbnN0IEh1ZmZtYW5UcmVlKiBjb25zdCB0MSA9IChjb25zdCBIdWZmbWFuVHJlZSopcHRyMTsKKyAgY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHQyID0gKGNvbnN0IEh1ZmZtYW5UcmVlKilwdHIyOworICBpZiAodDEtPnRvdGFsX2NvdW50XyA+IHQyLT50b3RhbF9jb3VudF8pIHsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAodDEtPnRvdGFsX2NvdW50XyA8IHQyLT50b3RhbF9jb3VudF8pIHsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQodDEtPnZhbHVlXyAhPSB0Mi0+dmFsdWVfKTsKKyAgICByZXR1cm4gKHQxLT52YWx1ZV8gPCB0Mi0+dmFsdWVfKSA/IC0xIDogMTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTZXRCaXREZXB0aHMoY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWUqIGNvbnN0IHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYml0X2RlcHRocywgaW50IGxldmVsKSB7CisgIGlmICh0cmVlLT5wb29sX2luZGV4X2xlZnRfID49IDApIHsKKyAgICBTZXRCaXREZXB0aHMoJnBvb2xbdHJlZS0+cG9vbF9pbmRleF9sZWZ0X10sIHBvb2wsIGJpdF9kZXB0aHMsIGxldmVsICsgMSk7CisgICAgU2V0Qml0RGVwdGhzKCZwb29sW3RyZWUtPnBvb2xfaW5kZXhfcmlnaHRfXSwgcG9vbCwgYml0X2RlcHRocywgbGV2ZWwgKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBiaXRfZGVwdGhzW3RyZWUtPnZhbHVlX10gPSBsZXZlbDsKKyAgfQorfQorCisvLyBDcmVhdGUgYW4gb3B0aW1hbCBIdWZmbWFuIHRyZWUuCisvLworLy8gKGRhdGEsbGVuZ3RoKTogcG9wdWxhdGlvbiBjb3VudHMuCisvLyB0cmVlX2xpbWl0OiBtYXhpbXVtIGJpdCBkZXB0aCAoaW5jbHVzaXZlKSBvZiB0aGUgY29kZXMuCisvLyBiaXRfZGVwdGhzW106IGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgZm9yIHRoZSBzeW1ib2wuCisvLworLy8gUmV0dXJucyAwIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkLgorLy8KKy8vIFRoZSBjYXRjaCBoZXJlIGlzIHRoYXQgdGhlIHRyZWUgY2Fubm90IGJlIGFyYml0cmFyaWx5IGRlZXAKKy8vCisvLyBjb3VudF9saW1pdCBpcyB0aGUgdmFsdWUgdGhhdCBpcyB0byBiZSBmYWtlZCBhcyB0aGUgbWluaW11bSB2YWx1ZQorLy8gYW5kIHRoaXMgbWluaW11bSB2YWx1ZSBpcyByYWlzZWQgdW50aWwgdGhlIHRyZWUgbWF0Y2hlcyB0aGUKKy8vIG1heGltdW0gbGVuZ3RoIHJlcXVpcmVtZW50LgorLy8KKy8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBvZiBleGNlbGxlbnQgcGVyZm9ybWFuY2UgZm9yIHZlcnkgbG9uZyBkYXRhIGJsb2NrcywKKy8vIGVzcGVjaWFsbHkgd2hlbiBwb3B1bGF0aW9uIGNvdW50cyBhcmUgbG9uZ2VyIHRoYW4gMioqdHJlZV9saW1pdCwgYnV0CisvLyB3ZSBhcmUgbm90IHBsYW5uaW5nIHRvIHVzZSB0aGlzIHdpdGggZXh0cmVtZWx5IGxvbmcgYmxvY2tzLgorLy8KKy8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZmZtYW5fY29kaW5nCitzdGF0aWMgdm9pZCBHZW5lcmF0ZU9wdGltYWxUcmVlKGNvbnN0IHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b2dyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIHRyZWUsIGludCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiaXRfZGVwdGhzKSB7CisgIHVpbnQzMl90IGNvdW50X21pbjsKKyAgSHVmZm1hblRyZWUqIHRyZWVfcG9vbDsKKyAgaW50IHRyZWVfc2l6ZV9vcmlnID0gMDsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9zaXplOyArK2kpIHsKKyAgICBpZiAoaGlzdG9ncmFtW2ldICE9IDApIHsKKyAgICAgICsrdHJlZV9zaXplX29yaWc7CisgICAgfQorICB9CisKKyAgaWYgKHRyZWVfc2l6ZV9vcmlnID09IDApIHsgICAvLyBwcmV0dHkgb3B0aW1hbCBhbHJlYWR5IQorICAgIHJldHVybjsKKyAgfQorCisgIHRyZWVfcG9vbCA9IHRyZWUgKyB0cmVlX3NpemVfb3JpZzsKKworICAvLyBGb3IgYmxvY2sgc2l6ZXMgd2l0aCBsZXNzIHRoYW4gNjRrIHN5bWJvbHMgd2UgbmV2ZXIgbmVlZCB0byBkbyBhCisgIC8vIHNlY29uZCBpdGVyYXRpb24gb2YgdGhpcyBsb29wLgorICAvLyBJZiB3ZSBhY3R1YWxseSBzdGFydCBydW5uaW5nIGluc2lkZSB0aGlzIGxvb3AgYSBsb3QsIHdlIHdvdWxkIHBlcmhhcHMKKyAgLy8gYmUgYmV0dGVyIG9mZiB3aXRoIHRoZSBLYXRhamFpbmVuIGFsZ29yaXRobS4KKyAgYXNzZXJ0KHRyZWVfc2l6ZV9vcmlnIDw9ICgxIDw8ICh0cmVlX2RlcHRoX2xpbWl0IC0gMSkpKTsKKyAgZm9yIChjb3VudF9taW4gPSAxOyA7IGNvdW50X21pbiAqPSAyKSB7CisgICAgaW50IHRyZWVfc2l6ZSA9IHRyZWVfc2l6ZV9vcmlnOworICAgIC8vIFdlIG5lZWQgdG8gcGFjayB0aGUgSHVmZm1hbiB0cmVlIGluIHRyZWVfZGVwdGhfbGltaXQgYml0cy4KKyAgICAvLyBTbywgd2UgdHJ5IGJ5IGZha2luZyBoaXN0b2dyYW0gZW50cmllcyB0byBiZSBhdCBsZWFzdCAnY291bnRfbWluJy4KKyAgICBpbnQgaWR4ID0gMDsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgaGlzdG9ncmFtX3NpemU7ICsraikgeworICAgICAgaWYgKGhpc3RvZ3JhbVtqXSAhPSAwKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvdW50ID0KKyAgICAgICAgICAgIChoaXN0b2dyYW1bal0gPCBjb3VudF9taW4pID8gY291bnRfbWluIDogaGlzdG9ncmFtW2pdOworICAgICAgICB0cmVlW2lkeF0udG90YWxfY291bnRfID0gY291bnQ7CisgICAgICAgIHRyZWVbaWR4XS52YWx1ZV8gPSBqOworICAgICAgICB0cmVlW2lkeF0ucG9vbF9pbmRleF9sZWZ0XyA9IC0xOworICAgICAgICB0cmVlW2lkeF0ucG9vbF9pbmRleF9yaWdodF8gPSAtMTsKKyAgICAgICAgKytpZHg7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZS4KKyAgICBxc29ydCh0cmVlLCB0cmVlX3NpemUsIHNpemVvZigqdHJlZSksIENvbXBhcmVIdWZmbWFuVHJlZXMpOworCisgICAgaWYgKHRyZWVfc2l6ZSA+IDEpIHsgIC8vIE5vcm1hbCBjYXNlLgorICAgICAgaW50IHRyZWVfcG9vbF9zaXplID0gMDsKKyAgICAgIHdoaWxlICh0cmVlX3NpemUgPiAxKSB7ICAvLyBGaW5pc2ggd2hlbiB3ZSBoYXZlIG9ubHkgb25lIHJvb3QuCisgICAgICAgIHVpbnQzMl90IGNvdW50OworICAgICAgICB0cmVlX3Bvb2xbdHJlZV9wb29sX3NpemUrK10gPSB0cmVlW3RyZWVfc2l6ZSAtIDFdOworICAgICAgICB0cmVlX3Bvb2xbdHJlZV9wb29sX3NpemUrK10gPSB0cmVlW3RyZWVfc2l6ZSAtIDJdOworICAgICAgICBjb3VudCA9IHRyZWVfcG9vbFt0cmVlX3Bvb2xfc2l6ZSAtIDFdLnRvdGFsX2NvdW50XyArCisgICAgICAgICAgICAgICAgdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplIC0gMl0udG90YWxfY291bnRfOworICAgICAgICB0cmVlX3NpemUgLT0gMjsKKyAgICAgICAgeworICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgICAgICAgICBpbnQgazsKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdHJlZV9zaXplOyArK2spIHsKKyAgICAgICAgICAgIGlmICh0cmVlW2tdLnRvdGFsX2NvdW50XyA8PSBjb3VudCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgbWVtbW92ZSh0cmVlICsgKGsgKyAxKSwgdHJlZSArIGssICh0cmVlX3NpemUgLSBrKSAqIHNpemVvZigqdHJlZSkpOworICAgICAgICAgIHRyZWVba10udG90YWxfY291bnRfID0gY291bnQ7CisgICAgICAgICAgdHJlZVtrXS52YWx1ZV8gPSAtMTsKKworICAgICAgICAgIHRyZWVba10ucG9vbF9pbmRleF9sZWZ0XyA9IHRyZWVfcG9vbF9zaXplIC0gMTsKKyAgICAgICAgICB0cmVlW2tdLnBvb2xfaW5kZXhfcmlnaHRfID0gdHJlZV9wb29sX3NpemUgLSAyOworICAgICAgICAgIHRyZWVfc2l6ZSA9IHRyZWVfc2l6ZSArIDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFNldEJpdERlcHRocygmdHJlZVswXSwgdHJlZV9wb29sLCBiaXRfZGVwdGhzLCAwKTsKKyAgICB9IGVsc2UgaWYgKHRyZWVfc2l6ZSA9PSAxKSB7ICAvLyBUcml2aWFsIGNhc2U6IG9ubHkgb25lIGVsZW1lbnQuCisgICAgICBiaXRfZGVwdGhzW3RyZWVbMF0udmFsdWVfXSA9IDE7CisgICAgfQorCisgICAgeworICAgICAgLy8gVGVzdCBpZiB0aGlzIEh1ZmZtYW4gdHJlZSBzYXRpc2ZpZXMgb3VyICd0cmVlX2RlcHRoX2xpbWl0JyBjcml0ZXJpYS4KKyAgICAgIGludCBtYXhfZGVwdGggPSBiaXRfZGVwdGhzWzBdOworICAgICAgZm9yIChqID0gMTsgaiA8IGhpc3RvZ3JhbV9zaXplOyArK2opIHsKKyAgICAgICAgaWYgKG1heF9kZXB0aCA8IGJpdF9kZXB0aHNbal0pIHsKKyAgICAgICAgICBtYXhfZGVwdGggPSBiaXRfZGVwdGhzW2pdOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAobWF4X2RlcHRoIDw9IHRyZWVfZGVwdGhfbGltaXQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2Rpbmcgb2YgdGhlIEh1ZmZtYW4gdHJlZSB2YWx1ZXMKKworc3RhdGljIEh1ZmZtYW5UcmVlVG9rZW4qIENvZGVSZXBlYXRlZFZhbHVlcyhpbnQgcmVwZXRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQgcHJldl92YWx1ZSkgeworICBhc3NlcnQodmFsdWUgPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOworICBpZiAodmFsdWUgIT0gcHJldl92YWx1ZSkgeworICAgIHRva2Vucy0+Y29kZSA9IHZhbHVlOworICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7CisgICAgKyt0b2tlbnM7CisgICAgLS1yZXBldGl0aW9uczsKKyAgfQorICB3aGlsZSAocmVwZXRpdGlvbnMgPj0gMSkgeworICAgIGlmIChyZXBldGl0aW9ucyA8IDMpIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGV0aXRpb25zOyArK2kpIHsKKyAgICAgICAgdG9rZW5zLT5jb2RlID0gdmFsdWU7CisgICAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7CisgICAgICAgICsrdG9rZW5zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDcpIHsKKyAgICAgIHRva2Vucy0+Y29kZSA9IDE2OworICAgICAgdG9rZW5zLT5leHRyYV9iaXRzID0gcmVwZXRpdGlvbnMgLSAzOworICAgICAgKyt0b2tlbnM7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgdG9rZW5zLT5jb2RlID0gMTY7CisgICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSAzOworICAgICAgKyt0b2tlbnM7CisgICAgICByZXBldGl0aW9ucyAtPSA2OworICAgIH0KKyAgfQorICByZXR1cm4gdG9rZW5zOworfQorCitzdGF0aWMgSHVmZm1hblRyZWVUb2tlbiogQ29kZVJlcGVhdGVkWmVyb3MoaW50IHJlcGV0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucykgeworICB3aGlsZSAocmVwZXRpdGlvbnMgPj0gMSkgeworICAgIGlmIChyZXBldGl0aW9ucyA8IDMpIHsKKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IHJlcGV0aXRpb25zOyArK2kpIHsKKyAgICAgICAgdG9rZW5zLT5jb2RlID0gMDsgICAvLyAwLXZhbHVlCisgICAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7CisgICAgICAgICsrdG9rZW5zOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDExKSB7CisgICAgICB0b2tlbnMtPmNvZGUgPSAxNzsKKyAgICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IHJlcGV0aXRpb25zIC0gMzsKKyAgICAgICsrdG9rZW5zOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChyZXBldGl0aW9ucyA8IDEzOSkgeworICAgICAgdG9rZW5zLT5jb2RlID0gMTg7CisgICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSByZXBldGl0aW9ucyAtIDExOworICAgICAgKyt0b2tlbnM7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgdG9rZW5zLT5jb2RlID0gMTg7CisgICAgICB0b2tlbnMtPmV4dHJhX2JpdHMgPSAweDdmOyAgLy8gMTM4IHJlcGVhdGVkIDBzCisgICAgICArK3Rva2VuczsKKyAgICAgIHJlcGV0aXRpb25zIC09IDEzODsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRva2VuczsKK30KKworaW50IFZQOExDcmVhdGVDb21wcmVzc2VkSHVmZm1hblRyZWUoY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zLCBpbnQgbWF4X3Rva2VucykgeworICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCBzdGFydGluZ190b2tlbiA9IHRva2VuczsKKyAgSHVmZm1hblRyZWVUb2tlbiogY29uc3QgZW5kaW5nX3Rva2VuID0gdG9rZW5zICsgbWF4X3Rva2VuczsKKyAgY29uc3QgaW50IGRlcHRoX3NpemUgPSB0cmVlLT5udW1fc3ltYm9sczsKKyAgaW50IHByZXZfdmFsdWUgPSA4OyAgLy8gOCBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgcmxlLgorICBpbnQgaSA9IDA7CisgIGFzc2VydCh0b2tlbnMgIT0gTlVMTCk7CisgIHdoaWxlIChpIDwgZGVwdGhfc2l6ZSkgeworICAgIGNvbnN0IGludCB2YWx1ZSA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKKyAgICBpbnQgayA9IGkgKyAxOworICAgIGludCBydW5zOworICAgIHdoaWxlIChrIDwgZGVwdGhfc2l6ZSAmJiB0cmVlLT5jb2RlX2xlbmd0aHNba10gPT0gdmFsdWUpICsrazsKKyAgICBydW5zID0gayAtIGk7CisgICAgaWYgKHZhbHVlID09IDApIHsKKyAgICAgIHRva2VucyA9IENvZGVSZXBlYXRlZFplcm9zKHJ1bnMsIHRva2Vucyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRva2VucyA9IENvZGVSZXBlYXRlZFZhbHVlcyhydW5zLCB0b2tlbnMsIHZhbHVlLCBwcmV2X3ZhbHVlKTsKKyAgICAgIHByZXZfdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgaSArPSBydW5zOworICAgIGFzc2VydCh0b2tlbnMgPD0gZW5kaW5nX3Rva2VuKTsKKyAgfQorICAodm9pZCllbmRpbmdfdG9rZW47ICAgIC8vIHN1cHByZXNzICd1bnVzZWQgdmFyaWFibGUnIHdhcm5pbmcKKyAgcmV0dXJuIChpbnQpKHRva2VucyAtIHN0YXJ0aW5nX3Rva2VuKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUHJlLXJldmVyc2VkIDQtYml0IHZhbHVlcy4KK3N0YXRpYyBjb25zdCB1aW50OF90IGtSZXZlcnNlZEJpdHNbMTZdID0geworICAweDAsIDB4OCwgMHg0LCAweGMsIDB4MiwgMHhhLCAweDYsIDB4ZSwKKyAgMHgxLCAweDksIDB4NSwgMHhkLCAweDMsIDB4YiwgMHg3LCAweGYKK307CisKK3N0YXRpYyB1aW50MzJfdCBSZXZlcnNlQml0cyhpbnQgbnVtX2JpdHMsIHVpbnQzMl90IGJpdHMpIHsKKyAgdWludDMyX3QgcmV0dmFsID0gMDsKKyAgaW50IGkgPSAwOworICB3aGlsZSAoaSA8IG51bV9iaXRzKSB7CisgICAgaSArPSA0OworICAgIHJldHZhbCB8PSBrUmV2ZXJzZWRCaXRzW2JpdHMgJiAweGZdIDw8IChNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDEgLSBpKTsKKyAgICBiaXRzID4+PSA0OworICB9CisgIHJldHZhbCA+Pj0gKE1BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMSAtIG51bV9iaXRzKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLy8gR2V0IHRoZSBhY3R1YWwgYml0IHZhbHVlcyBmb3IgYSB0cmVlIG9mIGJpdCBkZXB0aHMuCitzdGF0aWMgdm9pZCBDb252ZXJ0Qml0RGVwdGhzVG9TeW1ib2xzKEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSkgeworICAvLyAwIGJpdC1kZXB0aCBtZWFucyB0aGF0IHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCisgIGludCBpOworICBpbnQgbGVuOworICB1aW50MzJfdCBuZXh0X2NvZGVbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXTsKKyAgaW50IGRlcHRoX2NvdW50W01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV0gPSB7IDAgfTsKKworICBhc3NlcnQodHJlZSAhPSBOVUxMKTsKKyAgbGVuID0gdHJlZS0+bnVtX3N5bWJvbHM7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aCA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKKyAgICBhc3NlcnQoY29kZV9sZW5ndGggPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOworICAgICsrZGVwdGhfY291bnRbY29kZV9sZW5ndGhdOworICB9CisgIGRlcHRoX2NvdW50WzBdID0gMDsgIC8vIGlnbm9yZSB1bnVzZWQgc3ltYm9sCisgIG5leHRfY29kZVswXSA9IDA7CisgIHsKKyAgICB1aW50MzJfdCBjb2RlID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIOyArK2kpIHsKKyAgICAgIGNvZGUgPSAoY29kZSArIGRlcHRoX2NvdW50W2kgLSAxXSkgPDwgMTsKKyAgICAgIG5leHRfY29kZVtpXSA9IGNvZGU7CisgICAgfQorICB9CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aCA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKKyAgICB0cmVlLT5jb2Rlc1tpXSA9IFJldmVyc2VCaXRzKGNvZGVfbGVuZ3RoLCBuZXh0X2NvZGVbY29kZV9sZW5ndGhdKyspOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGVudHJ5IHBvaW50CisKK3ZvaWQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYnVmX3JsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZfY29kZSkgeworICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPSBodWZmX2NvZGUtPm51bV9zeW1ib2xzOworICBtZW1zZXQoYnVmX3JsZSwgMCwgbnVtX3N5bWJvbHMgKiBzaXplb2YoKmJ1Zl9ybGUpKTsKKyAgT3B0aW1pemVIdWZmbWFuRm9yUmxlKG51bV9zeW1ib2xzLCBidWZfcmxlLCBoaXN0b2dyYW0pOworICBHZW5lcmF0ZU9wdGltYWxUcmVlKGhpc3RvZ3JhbSwgbnVtX3N5bWJvbHMsIGh1ZmZfdHJlZSwgdHJlZV9kZXB0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBodWZmX2NvZGUtPmNvZGVfbGVuZ3Rocyk7CisgIC8vIENyZWF0ZSB0aGUgYWN0dWFsIGJpdCBjb2RlcyBmb3IgdGhlIGJpdCBsZW5ndGhzLgorICBDb252ZXJ0Qml0RGVwdGhzVG9TeW1ib2xzKGh1ZmZfY29kZSk7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9odWZmbWFuX2VuY29kZS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2YwYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8KKy8vIEVudHJvcHkgZW5jb2RpbmcgKEh1ZmZtYW4pIGZvciB3ZWJwIGxvc3NsZXNzCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX0hfCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBTdHJ1Y3QgZm9yIGhvbGRpbmcgdGhlIHRyZWUgaGVhZGVyIGluIGNvZGVkIGZvcm0uCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgY29kZTsgICAgICAgICAvLyB2YWx1ZSAoMC4uMTUpIG9yIGVzY2FwZSBjb2RlICgxNiwxNywxOCkKKyAgdWludDhfdCBleHRyYV9iaXRzOyAgIC8vIGV4dHJhIGJpdHMgZm9yIGVzY2FwZSBjb2RlcworfSBIdWZmbWFuVHJlZVRva2VuOworCisvLyBTdHJ1Y3QgdG8gcmVwcmVzZW50IHRoZSB0cmVlIGNvZGVzIChkZXB0aCBhbmQgYml0cyBhcnJheSkuCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCAgICAgICBudW1fc3ltYm9sczsgICAvLyBOdW1iZXIgb2Ygc3ltYm9scy4KKyAgdWludDhfdCogIGNvZGVfbGVuZ3RoczsgIC8vIENvZGUgbGVuZ3RocyBvZiB0aGUgc3ltYm9scy4KKyAgdWludDE2X3QqIGNvZGVzOyAgICAgICAgIC8vIFN5bWJvbCBDb2Rlcy4KK30gSHVmZm1hblRyZWVDb2RlOworCisvLyBTdHJ1Y3QgdG8gcmVwcmVzZW50IHRoZSBIdWZmbWFuIHRyZWUuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHRvdGFsX2NvdW50XzsgICAvLyBTeW1ib2wgZnJlcXVlbmN5LgorICBpbnQgdmFsdWVfOyAgICAgICAgICAgICAgLy8gU3ltYm9sIHZhbHVlLgorICBpbnQgcG9vbF9pbmRleF9sZWZ0XzsgICAgLy8gSW5kZXggZm9yIHRoZSBsZWZ0IHN1Yi10cmVlLgorICBpbnQgcG9vbF9pbmRleF9yaWdodF87ICAgLy8gSW5kZXggZm9yIHRoZSByaWdodCBzdWItdHJlZS4KK30gSHVmZm1hblRyZWU7CisKKy8vIFR1cm4gdGhlIEh1ZmZtYW4gdHJlZSBpbnRvIGEgdG9rZW4gc2VxdWVuY2UuCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdG9rZW5zIHVzZWQuCitpbnQgVlA4TENyZWF0ZUNvbXByZXNzZWRIdWZmbWFuVHJlZShjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZVRva2VuKiB0b2tlbnMsIGludCBtYXhfdG9rZW5zKTsKKworLy8gQ3JlYXRlIGFuIG9wdGltaXplZCB0cmVlLCBhbmQgdG9rZW5pemUgaXQuCisvLyAnYnVmX3JsZScgYW5kICdodWZmX3RyZWUnIGFyZSBwcmUtYWxsb2NhdGVkIGFuZCB0aGUgJ3RyZWUnIGlzIHRoZSBjb25zdHJ1Y3RlZAorLy8gaHVmZm1hbiBjb2RlIHRyZWUuCit2b2lkIFZQOExDcmVhdGVIdWZmbWFuVHJlZSh1aW50MzJfdCogY29uc3QgaGlzdG9ncmFtLCBpbnQgdHJlZV9kZXB0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJ1Zl9ybGUsIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIENIUk9NSVVNX1dFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfSF8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNTJkNQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5jCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUXVhbnRpemUgbGV2ZWxzIGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mIHF1YW50aXphdGlvbi1sZXZlbHMgKFsyLCAyNTZdKS4KKy8vIE1pbiBhbmQgbWF4IHZhbHVlcyBhcmUgcHJlc2VydmVkICh1c3VhbCAwIGFuZCAyNTUgZm9yIGFscGhhIHBsYW5lKS4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5oIgorCisjZGVmaW5lIE5VTV9TWU1CT0xTICAgICAyNTYKKworI2RlZmluZSBNQVhfSVRFUiAgNiAgICAgICAgICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBjb252ZXJnZW5jZSBzdGVwcy4KKyNkZWZpbmUgRVJST1JfVEhSRVNIT0xEIDFlLTQgICAgLy8gTVNFIHN0b3BwaW5nIGNyaXRlcmlvbi4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXplIGxldmVscy4KKworaW50IFF1YW50aXplTGV2ZWxzKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2xldmVscywgdWludDY0X3QqIGNvbnN0IHNzZSkgeworICBpbnQgZnJlcVtOVU1fU1lNQk9MU10gPSB7IDAgfTsKKyAgaW50IHFfbGV2ZWxbTlVNX1NZTUJPTFNdID0geyAwIH07CisgIGRvdWJsZSBpbnZfcV9sZXZlbFtOVU1fU1lNQk9MU10gPSB7IDAgfTsKKyAgaW50IG1pbl9zID0gMjU1LCBtYXhfcyA9IDA7CisgIGNvbnN0IHNpemVfdCBkYXRhX3NpemUgPSBoZWlnaHQgKiB3aWR0aDsKKyAgaW50IGksIG51bV9sZXZlbHNfaW4sIGl0ZXI7CisgIGRvdWJsZSBsYXN0X2VyciA9IDEuZTM4LCBlcnIgPSAwLjsKKyAgY29uc3QgZG91YmxlIGVycl90aHJlc2hvbGQgPSBFUlJPUl9USFJFU0hPTEQgKiBkYXRhX3NpemU7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChudW1fbGV2ZWxzIDwgMiB8fCBudW1fbGV2ZWxzID4gMjU2KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB7CisgICAgc2l6ZV90IG47CisgICAgbnVtX2xldmVsc19pbiA9IDA7CisgICAgZm9yIChuID0gMDsgbiA8IGRhdGFfc2l6ZTsgKytuKSB7CisgICAgICBudW1fbGV2ZWxzX2luICs9IChmcmVxW2RhdGFbbl1dID09IDApOworICAgICAgaWYgKG1pbl9zID4gZGF0YVtuXSkgbWluX3MgPSBkYXRhW25dOworICAgICAgaWYgKG1heF9zIDwgZGF0YVtuXSkgbWF4X3MgPSBkYXRhW25dOworICAgICAgKytmcmVxW2RhdGFbbl1dOworICAgIH0KKyAgfQorCisgIGlmIChudW1fbGV2ZWxzX2luIDw9IG51bV9sZXZlbHMpIGdvdG8gRW5kOyAgLy8gbm90aGluZyB0byBkbyEKKworICAvLyBTdGFydCB3aXRoIHVuaWZvcm1seSBzcHJlYWQgY2VudHJvaWRzLgorICBmb3IgKGkgPSAwOyBpIDwgbnVtX2xldmVsczsgKytpKSB7CisgICAgaW52X3FfbGV2ZWxbaV0gPSBtaW5fcyArIChkb3VibGUpKG1heF9zIC0gbWluX3MpICogaSAvIChudW1fbGV2ZWxzIC0gMSk7CisgIH0KKworICAvLyBGaXhlZCB2YWx1ZXMuIFdvbid0IGJlIGNoYW5nZWQuCisgIHFfbGV2ZWxbbWluX3NdID0gMDsKKyAgcV9sZXZlbFttYXhfc10gPSBudW1fbGV2ZWxzIC0gMTsKKyAgYXNzZXJ0KGludl9xX2xldmVsWzBdID09IG1pbl9zKTsKKyAgYXNzZXJ0KGludl9xX2xldmVsW251bV9sZXZlbHMgLSAxXSA9PSBtYXhfcyk7CisKKyAgLy8gay1NZWFucyBpdGVyYXRpb25zLgorICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgTUFYX0lURVI7ICsraXRlcikgeworICAgIGRvdWJsZSBxX3N1bVtOVU1fU1lNQk9MU10gPSB7IDAgfTsKKyAgICBkb3VibGUgcV9jb3VudFtOVU1fU1lNQk9MU10gPSB7IDAgfTsKKyAgICBpbnQgcywgc2xvdCA9IDA7CisKKyAgICAvLyBBc3NpZ24gY2xhc3NlcyB0byByZXByZXNlbnRhdGl2ZXMuCisgICAgZm9yIChzID0gbWluX3M7IHMgPD0gbWF4X3M7ICsrcykgeworICAgICAgLy8gS2VlcCB0cmFjayBvZiB0aGUgbmVhcmVzdCBuZWlnaGJvdXIgJ3Nsb3QnCisgICAgICB3aGlsZSAoc2xvdCA8IG51bV9sZXZlbHMgLSAxICYmCisgICAgICAgICAgICAgMiAqIHMgPiBpbnZfcV9sZXZlbFtzbG90XSArIGludl9xX2xldmVsW3Nsb3QgKyAxXSkgeworICAgICAgICArK3Nsb3Q7CisgICAgICB9CisgICAgICBpZiAoZnJlcVtzXSA+IDApIHsKKyAgICAgICAgcV9zdW1bc2xvdF0gKz0gcyAqIGZyZXFbc107CisgICAgICAgIHFfY291bnRbc2xvdF0gKz0gZnJlcVtzXTsKKyAgICAgIH0KKyAgICAgIHFfbGV2ZWxbc10gPSBzbG90OworICAgIH0KKworICAgIC8vIEFzc2lnbiBuZXcgcmVwcmVzZW50YXRpdmVzIHRvIGNsYXNzZXMuCisgICAgaWYgKG51bV9sZXZlbHMgPiAyKSB7CisgICAgICBmb3IgKHNsb3QgPSAxOyBzbG90IDwgbnVtX2xldmVscyAtIDE7ICsrc2xvdCkgeworICAgICAgICBjb25zdCBkb3VibGUgY291bnQgPSBxX2NvdW50W3Nsb3RdOworICAgICAgICBpZiAoY291bnQgPiAwLikgeworICAgICAgICAgIGludl9xX2xldmVsW3Nsb3RdID0gcV9zdW1bc2xvdF0gLyBjb3VudDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIENvbXB1dGUgY29udmVyZ2VuY2UgZXJyb3IuCisgICAgZXJyID0gMC47CisgICAgZm9yIChzID0gbWluX3M7IHMgPD0gbWF4X3M7ICsrcykgeworICAgICAgY29uc3QgZG91YmxlIGVycm9yID0gcyAtIGludl9xX2xldmVsW3FfbGV2ZWxbc11dOworICAgICAgZXJyICs9IGZyZXFbc10gKiBlcnJvciAqIGVycm9yOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBjb252ZXJnZW5jZTogd2Ugc3RvcCBhcyBzb29uIGFzIHRoZSBlcnJvciBpcyBubworICAgIC8vIGxvbmdlciBpbXByb3ZpbmcuCisgICAgaWYgKGxhc3RfZXJyIC0gZXJyIDwgZXJyX3RocmVzaG9sZCkgYnJlYWs7CisgICAgbGFzdF9lcnIgPSBlcnI7CisgIH0KKworICAvLyBSZW1hcCB0aGUgYWxwaGEgcGxhbmUgdG8gcXVhbnRpemVkIHZhbHVlcy4KKyAgeworICAgIC8vIGRvdWJsZS0+aW50IHJvdW5kaW5nIG9wZXJhdGlvbiBjYW4gYmUgY29zdGx5LCBzbyB3ZSBkbyBpdAorICAgIC8vIG9uY2UgZm9yIGFsbCBiZWZvcmUgcmVtYXBwaW5nLiBXZSBhbHNvIHBlcmZvcm0gdGhlIGRhdGFbXSAtPiBzbG90CisgICAgLy8gbWFwcGluZywgd2hpbGUgYXQgaXQgKGF2b2lkIG9uZSBpbmRpcmVjdGlvbiBpbiB0aGUgZmluYWwgbG9vcCkuCisgICAgdWludDhfdCBtYXBbTlVNX1NZTUJPTFNdOworICAgIGludCBzOworICAgIHNpemVfdCBuOworICAgIGZvciAocyA9IG1pbl9zOyBzIDw9IG1heF9zOyArK3MpIHsKKyAgICAgIGNvbnN0IGludCBzbG90ID0gcV9sZXZlbFtzXTsKKyAgICAgIG1hcFtzXSA9ICh1aW50OF90KShpbnZfcV9sZXZlbFtzbG90XSArIC41KTsKKyAgICB9CisgICAgLy8gRmluYWwgcGFzcy4KKyAgICBmb3IgKG4gPSAwOyBuIDwgZGF0YV9zaXplOyArK24pIHsKKyAgICAgIGRhdGFbbl0gPSBtYXBbZGF0YVtuXV07CisgICAgfQorICB9CisgRW5kOgorICAvLyBTdG9yZSBzdW0gb2Ygc3F1YXJlZCBlcnJvciBpZiBuZWVkZWQuCisgIGlmIChzc2UgIT0gTlVMTCkgKnNzZSA9ICh1aW50NjRfdCllcnI7CisKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhM2EzMwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVscy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYSBwbGFuZSBxdWFudGl6YXRpb24gdXRpbGl0eQorLy8KKy8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXBsYWNlIHRoZSBpbnB1dCAnZGF0YScgb2Ygc2l6ZSAnd2lkdGgneCdoZWlnaHQnIHdpdGggJ251bS1sZXZlbHMnCisvLyBxdWFudGl6ZWQgdmFsdWVzLiBJZiBub3QgTlVMTCwgJ3NzZScgd2lsbCBjb250YWluIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvci4KKy8vIFZhbGlkIHJhbmdlIGZvciAnbnVtX2xldmVscycgaXMgWzIsIDI1Nl0uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgb3IgcGFyYW1ldGVycyBhcmUgaW52YWxpZCkuCitpbnQgUXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbnVtX2xldmVscywKKyAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3Qgc3NlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0OWFmYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuYwpAQCAtMCwwICsxLDI4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltcGxlbWVudCBncmFkaWVudCBzbW9vdGhpbmc6IHdlIHJlcGxhY2UgYSBjdXJyZW50IGFscGhhIHZhbHVlIGJ5IGl0cworLy8gc3Vycm91bmRpbmcgYXZlcmFnZSBpZiBpdCdzIGNsb3NlIGVub3VnaCAodGhhdCBpczogdGhlIGNoYW5nZSB3aWxsIGJlIGxlc3MKKy8vIHRoYW4gdGhlIG1pbmltdW0gZGlzdGFuY2UgYmV0d2VlbiB0d28gcXVhbnRpemVkIGxldmVsKS4KKy8vIFdlIHVzZSBzbGlkaW5nIHdpbmRvdyBmb3IgY29tcHV0aW5nIHRoZSAyZCBtb3ZpbmcgYXZlcmFnZS4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtc2V0CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgiCisKKy8vICNkZWZpbmUgVVNFX0RJVEhFUklORyAgIC8vIHVuY29tbWVudCB0byBlbmFibGUgb3JkZXJlZCBkaXRoZXJpbmcgKG5vdCB2aXRhbCkKKworI2RlZmluZSBGSVggMTYgICAgIC8vIGZpeC1wb2ludCBwcmVjaXNpb24gZm9yIGF2ZXJhZ2luZworI2RlZmluZSBMRklYIDIgICAgIC8vIGV4dHJhIHByZWNpc2lvbiBmb3IgbG9vay11cCB0YWJsZQorI2RlZmluZSBMVVRfU0laRSAoKDEgPDwgKDggKyBMRklYKSkgLSAxKSAgLy8gbG9vay11cCB0YWJsZSBzaXplCisKKyNpZiBkZWZpbmVkKFVTRV9ESVRIRVJJTkcpCisKKyNkZWZpbmUgREZJWCA0ICAgICAgICAgICAvLyBleHRyYSBwcmVjaXNpb24gZm9yIG9yZGVyZWQgZGl0aGVyaW5nCisjZGVmaW5lIERTSVpFIDQgICAgICAgICAgLy8gZGl0aGVyaW5nIHNpemUgKG11c3QgYmUgYSBwb3dlciBvZiB0d28pCisvLyBjZi4gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PcmRlcmVkX2RpdGhlcmluZworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga09yZGVyZWREaXRoZXJbRFNJWkVdW0RTSVpFXSA9IHsKKyAgeyAgMCwgIDgsICAyLCAxMCB9LCAgICAgLy8gY29lZmZpY2llbnRzIGFyZSBpbiBERklYIGZpeGVkLXBvaW50IHByZWNpc2lvbgorICB7IDEyLCAgNCwgMTQsICA2IH0sCisgIHsgIDMsIDExLCAgMSwgIDkgfSwKKyAgeyAxNSwgIDcsIDEzLCAgNSB9Cit9OworCisjZWxzZQorI2RlZmluZSBERklYIDAKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB3aWR0aF8sIGhlaWdodF87ICAvLyBkaW1lbnNpb24KKyAgaW50IHN0cmlkZV87ICAgICAgICAgIC8vIHN0cmlkZSBpbiBieXRlcworICBpbnQgcm93XzsgICAgICAgICAgICAgLy8gY3VycmVudCBpbnB1dCByb3cgYmVpbmcgcHJvY2Vzc2VkCisgIHVpbnQ4X3QqIHNyY187ICAgICAgICAvLyBpbnB1dCBwb2ludGVyCisgIHVpbnQ4X3QqIGRzdF87ICAgICAgICAvLyBvdXRwdXQgcG9pbnRlcgorCisgIGludCByYWRpdXNfOyAgICAgICAgICAvLyBmaWx0ZXIgcmFkaXVzICg9ZGVsYXkpCisgIGludCBzY2FsZV87ICAgICAgICAgICAvLyBub3JtYWxpemF0aW9uIGZhY3RvciwgaW4gRklYIGJpdHMgcHJlY2lzaW9uCisKKyAgdm9pZCogbWVtXzsgICAgICAgICAgIC8vIGFsbCBtZW1vcnkKKworICAvLyB2YXJpb3VzIHNjcmF0Y2ggYnVmZmVycworICB1aW50MTZfdCogc3RhcnRfOworICB1aW50MTZfdCogY3VyXzsKKyAgdWludDE2X3QqIGVuZF87CisgIHVpbnQxNl90KiB0b3BfOworICB1aW50MTZfdCogYXZlcmFnZV87CisKKyAgLy8gaW5wdXQgbGV2ZWxzIGRpc3RyaWJ1dGlvbgorICBpbnQgbnVtX2xldmVsc187ICAgICAgIC8vIG51bWJlciBvZiBxdWFudGl6ZWQgbGV2ZWxzCisgIGludCBtaW5fLCBtYXhfOyAgICAgICAgLy8gbWluIGFuZCBtYXggbGV2ZWwgdmFsdWVzCisgIGludCBtaW5fbGV2ZWxfZGlzdF87ICAgLy8gc21hbGxlc3QgZGlzdGFuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgbGV2ZWxzCisKKyAgaW50MTZfdCogY29ycmVjdGlvbl87ICAvLyBzaXplID0gMSArIDIqTFVUX1NJWkUgIC0+IH40ayBtZW1vcnkKK30gU21vb3RoUGFyYW1zOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIENMSVBfTUFTSyAoaW50KSh+MFUgPDwgKDggKyBERklYKSkKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGNsaXBfOGIoaW50IHYpIHsKKyAgcmV0dXJuICghKHYgJiBDTElQX01BU0spKSA/ICh1aW50OF90KSh2ID4+IERGSVgpIDogKHYgPCAwKSA/IDB1IDogMjU1dTsKK30KKworLy8gdmVydGljYWwgYWNjdW11bGF0aW9uCitzdGF0aWMgdm9pZCBWRmlsdGVyKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBjb25zdCB1aW50OF90KiBzcmMgPSBwLT5zcmNfOworICBjb25zdCBpbnQgdyA9IHAtPndpZHRoXzsKKyAgdWludDE2X3QqIGNvbnN0IGN1ciA9IHAtPmN1cl87CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB0b3AgPSBwLT50b3BfOworICB1aW50MTZfdCogY29uc3Qgb3V0ID0gcC0+ZW5kXzsKKyAgdWludDE2X3Qgc3VtID0gMDsgICAgICAgICAgICAgICAvLyBhbGwgYXJpdGhtZXRpYyBpcyBtb2R1bG8gMTZiaXQKKyAgaW50IHg7CisKKyAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgIHVpbnQxNl90IG5ld192YWx1ZTsKKyAgICBzdW0gKz0gc3JjW3hdOworICAgIG5ld192YWx1ZSA9IHRvcFt4XSArIHN1bTsKKyAgICBvdXRbeF0gPSBuZXdfdmFsdWUgLSBjdXJbeF07ICAvLyB2ZXJ0aWNhbCBzdW0gb2YgJ3InIHBpeGVscy4KKyAgICBjdXJbeF0gPSBuZXdfdmFsdWU7CisgIH0KKyAgLy8gbW92ZSBpbnB1dCBwb2ludGVycyBvbmUgcm93IGRvd24KKyAgcC0+dG9wXyA9IHAtPmN1cl87CisgIHAtPmN1cl8gKz0gdzsKKyAgaWYgKHAtPmN1cl8gPT0gcC0+ZW5kXykgcC0+Y3VyXyA9IHAtPnN0YXJ0XzsgIC8vIHJvbGwtb3ZlcgorICAvLyBXZSByZXBsaWNhdGUgZWRnZXMsIGFzIGl0J3Mgc29tZXdoYXQgZWFzaWVyIGFzIGEgYm91bmRhcnkgY29uZGl0aW9uLgorICAvLyBUaGF0J3Mgd2h5IHdlIGRvbid0IHVwZGF0ZSB0aGUgJ3NyYycgcG9pbnRlciBvbiB0b3AvYm90dG9tIGFyZWE6CisgIGlmIChwLT5yb3dfID49IDAgJiYgcC0+cm93XyA8IHAtPmhlaWdodF8gLSAxKSB7CisgICAgcC0+c3JjXyArPSBwLT5zdHJpZGVfOworICB9Cit9CisKKy8vIGhvcml6b250YWwgYWNjdW11bGF0aW9uLiBXZSB1c2UgbWlycm9yIHJlcGxpY2F0aW9uIG9mIG1pc3NpbmcgcGl4ZWxzLCBhcyBpdCdzCisvLyBhIGxpdHRsZSBlYXNpZXIgdG8gaW1wbGVtZW50IChzdXJwcmlzaW5nbHkpLgorc3RhdGljIHZvaWQgSEZpbHRlcihTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGluID0gcC0+ZW5kXzsKKyAgdWludDE2X3QqIGNvbnN0IG91dCA9IHAtPmF2ZXJhZ2VfOworICBjb25zdCB1aW50MzJfdCBzY2FsZSA9IHAtPnNjYWxlXzsKKyAgY29uc3QgaW50IHcgPSBwLT53aWR0aF87CisgIGNvbnN0IGludCByID0gcC0+cmFkaXVzXzsKKworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8PSByOyArK3gpIHsgICAvLyBsZWZ0IG1pcnJvcmluZworICAgIGNvbnN0IHVpbnQxNl90IGRlbHRhID0gaW5beCArIHIgLSAxXSArIGluW3IgLSB4XTsKKyAgICBvdXRbeF0gPSAoZGVsdGEgKiBzY2FsZSkgPj4gRklYOworICB9CisgIGZvciAoOyB4IDwgdyAtIHI7ICsreCkgeyAgICAgLy8gYnVsayBtaWRkbGUgcnVuCisgICAgY29uc3QgdWludDE2X3QgZGVsdGEgPSBpblt4ICsgcl0gLSBpblt4IC0gciAtIDFdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KKyAgZm9yICg7IHggPCB3OyArK3gpIHsgICAgICAgICAvLyByaWdodCBtaXJyb3JpbmcKKyAgICBjb25zdCB1aW50MTZfdCBkZWx0YSA9CisgICAgICAgIDIgKiBpblt3IC0gMV0gLSBpblsyICogdyAtIDIgLSByIC0geF0gLSBpblt4IC0gciAtIDFdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KK30KKworLy8gZW1pdCBvbmUgZmlsdGVyZWQgb3V0cHV0IHJvdworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXIoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBhdmVyYWdlID0gcC0+YXZlcmFnZV87CisgIGNvbnN0IGludCB3ID0gcC0+d2lkdGhfOworICBjb25zdCBpbnQxNl90KiBjb25zdCBjb3JyZWN0aW9uID0gcC0+Y29ycmVjdGlvbl87CisjaWYgZGVmaW5lZChVU0VfRElUSEVSSU5HKQorICBjb25zdCB1aW50OF90KiBjb25zdCBkaXRoZXIgPSBrT3JkZXJlZERpdGhlcltwLT5yb3dfICUgRFNJWkVdOworI2VuZGlmCisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHAtPmRzdF87CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgY29uc3QgaW50IHYgPSBkc3RbeF07CisgICAgaWYgKHYgPCBwLT5tYXhfICYmIHYgPiBwLT5taW5fKSB7CisgICAgICBjb25zdCBpbnQgYyA9ICh2IDw8IERGSVgpICsgY29ycmVjdGlvblthdmVyYWdlW3hdIC0gKHYgPDwgTEZJWCldOworI2lmIGRlZmluZWQoVVNFX0RJVEhFUklORykKKyAgICAgIGRzdFt4XSA9IGNsaXBfOGIoYyArIGRpdGhlclt4ICUgRFNJWkVdKTsKKyNlbHNlCisgICAgICBkc3RbeF0gPSBjbGlwXzhiKGMpOworI2VuZGlmCisgICAgfQorICB9CisgIHAtPmRzdF8gKz0gcC0+c3RyaWRlXzsgIC8vIGFkdmFuY2Ugb3V0cHV0IHBvaW50ZXIKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXRpYWxpemUgY29ycmVjdGlvbiB0YWJsZQorCitzdGF0aWMgdm9pZCBJbml0Q29ycmVjdGlvbkxVVChpbnQxNl90KiBjb25zdCBsdXQsIGludCBtaW5fZGlzdCkgeworICAvLyBUaGUgY29ycmVjdGlvbiBjdXJ2ZSBpczoKKyAgLy8gICBmKHgpID0geCBmb3IgeCA8PSB0aHJlc2hvbGQyCisgIC8vICAgZih4KSA9IDAgZm9yIHggPj0gdGhyZXNob2xkMQorICAvLyBhbmQgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgcmFuZ2UgeD1bdGhyZXNob2xkMiwgdGhyZXNob2xkMV0KKyAgLy8gKGFsb25nIHdpdGggZigteCkgPSAtZih4KSBzeW1tZXRyeSkuCisgIC8vIE5vdGUgdGhhdDogdGhyZXNob2xkMiA9IDMvNCAqIHRocmVzaG9sZDEKKyAgY29uc3QgaW50IHRocmVzaG9sZDEgPSBtaW5fZGlzdCA8PCBMRklYOworICBjb25zdCBpbnQgdGhyZXNob2xkMiA9ICgzICogdGhyZXNob2xkMSkgPj4gMjsKKyAgY29uc3QgaW50IG1heF90aHJlc2hvbGQgPSB0aHJlc2hvbGQyIDw8IERGSVg7CisgIGNvbnN0IGludCBkZWx0YSA9IHRocmVzaG9sZDEgLSB0aHJlc2hvbGQyOworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8PSBMVVRfU0laRTsgKytpKSB7CisgICAgaW50IGMgPSAoaSA8PSB0aHJlc2hvbGQyKSA/IChpIDw8IERGSVgpCisgICAgICAgICAgOiAoaSA8IHRocmVzaG9sZDEpID8gbWF4X3RocmVzaG9sZCAqICh0aHJlc2hvbGQxIC0gaSkgLyBkZWx0YQorICAgICAgICAgIDogMDsKKyAgICBjID4+PSBMRklYOworICAgIGx1dFsraV0gPSArYzsKKyAgICBsdXRbLWldID0gLWM7CisgIH0KKyAgbHV0WzBdID0gMDsKK30KKworc3RhdGljIHZvaWQgQ291bnRMZXZlbHMoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGludCBpLCBqLCBsYXN0X2xldmVsOworICB1aW50OF90IHVzZWRfbGV2ZWxzWzI1Nl0gPSB7IDAgfTsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IHAtPnNyY187CisgIHAtPm1pbl8gPSAyNTU7CisgIHAtPm1heF8gPSAwOworICBmb3IgKGogPSAwOyBqIDwgcC0+aGVpZ2h0XzsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHAtPndpZHRoXzsgKytpKSB7CisgICAgICBjb25zdCBpbnQgdiA9IGRhdGFbaV07CisgICAgICBpZiAodiA8IHAtPm1pbl8pIHAtPm1pbl8gPSB2OworICAgICAgaWYgKHYgPiBwLT5tYXhfKSBwLT5tYXhfID0gdjsKKyAgICAgIHVzZWRfbGV2ZWxzW3ZdID0gMTsKKyAgICB9CisgICAgZGF0YSArPSBwLT5zdHJpZGVfOworICB9CisgIC8vIENvbXB1dGUgdGhlIG1pbmludW0gZGlzdGFuY2UgYmV0d2VlbiB0d28gbm9uLXplcm8gbGV2ZWxzLgorICBwLT5taW5fbGV2ZWxfZGlzdF8gPSBwLT5tYXhfIC0gcC0+bWluXzsKKyAgbGFzdF9sZXZlbCA9IC0xOworICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICBpZiAodXNlZF9sZXZlbHNbaV0pIHsKKyAgICAgICsrcC0+bnVtX2xldmVsc187CisgICAgICBpZiAobGFzdF9sZXZlbCA+PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBsZXZlbF9kaXN0ID0gaSAtIGxhc3RfbGV2ZWw7CisgICAgICAgIGlmIChsZXZlbF9kaXN0IDwgcC0+bWluX2xldmVsX2Rpc3RfKSB7CisgICAgICAgICAgcC0+bWluX2xldmVsX2Rpc3RfID0gbGV2ZWxfZGlzdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdF9sZXZlbCA9IGk7CisgICAgfQorICB9Cit9CisKKy8vIEluaXRpYWxpemUgYWxsIHBhcmFtcy4KK3N0YXRpYyBpbnQgSW5pdFBhcmFtcyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHJhZGl1cywgU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IGludCBSID0gMiAqIHJhZGl1cyArIDE7ICAvLyB0b3RhbCBzaXplIG9mIHRoZSBrZXJuZWwKKworICBjb25zdCBzaXplX3Qgc2l6ZV9zY3JhdGNoX20gPSAoUiArIDEpICogd2lkdGggKiBzaXplb2YoKnAtPnN0YXJ0Xyk7CisgIGNvbnN0IHNpemVfdCBzaXplX20gPSAgd2lkdGggKiBzaXplb2YoKnAtPmF2ZXJhZ2VfKTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfbHV0ID0gKDEgKyAyICogTFVUX1NJWkUpICogc2l6ZW9mKCpwLT5jb3JyZWN0aW9uXyk7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0gc2l6ZV9zY3JhdGNoX20gKyBzaXplX20gKyBzaXplX2x1dDsKKyAgdWludDhfdCogbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVLCB0b3RhbF9zaXplKTsKKworICBpZiAobWVtID09IE5VTEwpIHJldHVybiAwOworICBwLT5tZW1fID0gKHZvaWQqKW1lbTsKKworICBwLT5zdGFydF8gPSAodWludDE2X3QqKW1lbTsKKyAgcC0+Y3VyXyA9IHAtPnN0YXJ0XzsKKyAgcC0+ZW5kXyA9IHAtPnN0YXJ0XyArIFIgKiB3aWR0aDsKKyAgcC0+dG9wXyA9IHAtPmVuZF8gLSB3aWR0aDsKKyAgbWVtc2V0KHAtPnRvcF8sIDAsIHdpZHRoICogc2l6ZW9mKCpwLT50b3BfKSk7CisgIG1lbSArPSBzaXplX3NjcmF0Y2hfbTsKKworICBwLT5hdmVyYWdlXyA9ICh1aW50MTZfdCopbWVtOworICBtZW0gKz0gc2l6ZV9tOworCisgIHAtPndpZHRoXyA9IHdpZHRoOworICBwLT5oZWlnaHRfID0gaGVpZ2h0OworICBwLT5zdHJpZGVfID0gc3RyaWRlOworICBwLT5zcmNfID0gZGF0YTsKKyAgcC0+ZHN0XyA9IGRhdGE7CisgIHAtPnJhZGl1c18gPSByYWRpdXM7CisgIHAtPnNjYWxlXyA9ICgxIDw8IChGSVggKyBMRklYKSkgLyAoUiAqIFIpOyAgLy8gbm9ybWFsaXphdGlvbiBjb25zdGFudAorICBwLT5yb3dfID0gLXJhZGl1czsKKworICAvLyBhbmFseXplIHRoZSBpbnB1dCBkaXN0cmlidXRpb24gc28gd2UgY2FuIGJlc3QtZml0IHRoZSB0aHJlc2hvbGQKKyAgQ291bnRMZXZlbHMocCk7CisKKyAgLy8gY29ycmVjdGlvbiB0YWJsZQorICBwLT5jb3JyZWN0aW9uXyA9ICgoaW50MTZfdCopbWVtKSArIExVVF9TSVpFOworICBJbml0Q29ycmVjdGlvbkxVVChwLT5jb3JyZWN0aW9uXywgcC0+bWluX2xldmVsX2Rpc3RfKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQ2xlYW51cFBhcmFtcyhTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgV2ViUFNhZmVGcmVlKHAtPm1lbV8pOworfQorCitpbnQgV2ViUERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlbmd0aCkgeworICBjb25zdCBpbnQgcmFkaXVzID0gNCAqIHN0cmVuZ3RoIC8gMTAwOworICBpZiAoc3RyZW5ndGggPCAwIHx8IHN0cmVuZ3RoID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsgIC8vIGJhZCBwYXJhbXMKKyAgaWYgKHJhZGl1cyA+IDApIHsKKyAgICBTbW9vdGhQYXJhbXMgcDsKKyAgICBtZW1zZXQoJnAsIDAsIHNpemVvZihwKSk7CisgICAgaWYgKCFJbml0UGFyYW1zKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcmFkaXVzLCAmcCkpIHJldHVybiAwOworICAgIGlmIChwLm51bV9sZXZlbHNfID4gMikgeworICAgICAgZm9yICg7IHAucm93XyA8IHAuaGVpZ2h0XzsgKytwLnJvd18pIHsKKyAgICAgICAgVkZpbHRlcigmcCk7ICAvLyBhY2N1bXVsYXRlIGF2ZXJhZ2Ugb2YgaW5wdXQKKyAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZldyByb3dzIGluIG9yZGVyIHRvIHByaW1lIHRoZSBmaWx0ZXIsCisgICAgICAgIC8vIGJlZm9yZSBlbWl0dGluZyBzb21lIG91dHB1dC4KKyAgICAgICAgaWYgKHAucm93XyA+PSBwLnJhZGl1c18pIHsKKyAgICAgICAgICBIRmlsdGVyKCZwKTsKKyAgICAgICAgICBBcHBseUZpbHRlcigmcCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2xlYW51cFBhcmFtcygmcCk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM4ZjFmNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEgcGxhbmUgZGUtcXVhbnRpemF0aW9uIHV0aWxpdHkKKy8vCisvLyBBdXRob3I6ICBWaWthcyBBcm9yYSAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19IXworCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gQXBwbHkgcG9zdC1wcm9jZXNzaW5nIHRvIGlucHV0ICdkYXRhJyBvZiBzaXplICd3aWR0aCd4J2hlaWdodCcgYXNzdW1pbmcgdGhhdAorLy8gdGhlIHNvdXJjZSB3YXMgcXVhbnRpemVkIHRvIGEgcmVkdWNlZCBudW1iZXIgb2YgbGV2ZWxzLiAnc3RyaWRlJyBpcyBpbiBieXRlcy4KKy8vIFN0cmVuZ3RoIGlzIGluIFswLi4xMDBdIGFuZCBjb250cm9scyB0aGUgYW1vdW50IG9mIGRpdGhlcmluZyBhcHBsaWVkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChkYXRhIGlzIE5VTEwsIGludmFsaWQgcGFyYW1ldGVycywKKy8vIG1hbGxvYyBmYWlsdXJlLCAuLi4pLgoraW50IFdlYlBEZXF1YW50aXplTGV2ZWxzKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZW5ndGgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yYW5kb20uYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjE1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yYW5kb20uYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUHNldWRvLXJhbmRvbSB1dGlsaXRpZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yYW5kb20uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gMzFiLXJhbmdlIHZhbHVlcworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSYW5kb21UYWJsZVtWUDhfUkFORE9NX1RBQkxFX1NJWkVdID0geworICAweDBkZTE1MjMwLCAweDAzYjMxODg2LCAweDc3NWZhY2NiLCAweDFjODg2MjZhLCAweDY4Mzg1YzU1LCAweDE0YjNiODI4LAorICAweDRhODVmZWY4LCAweDQ5ZGRiODRiLCAweDY0ZmNmMzk3LCAweDVjNTUwMjg5LCAweDRhMjkwMDAwLCAweDBkN2VjMWRhLAorICAweDU5NDBiN2FiLCAweDU0OTI1NzdkLCAweDRlMTljYTcyLCAweDM4ZDM4YzY5LCAweDBjMDFlZTY1LCAweDMyYTE3NTVmLAorICAweDU0MzdmNjUyLCAweDVhYmIyYzMyLCAweDBmYWE1N2IxLCAweDczZjUzM2U3LCAweDY4NWZlZWRhLCAweDc1NjNjY2UyLAorICAweDZlOTkwZTgzLCAweDQ3MzBhN2VkLCAweDRmYzBkOWM2LCAweDQ5NmIxNTNjLCAweDRmMTQwM2ZhLCAweDU0MWFmYjBjLAorICAweDczOTkwYjMyLCAweDI2ZDdjYjFjLCAweDZmY2MzNzA2LCAweDJjYmI3N2Q4LCAweDc1NzYyZjJhLCAweDY0MjVjY2RkLAorICAweDI0YjM1NDYxLCAweDBhN2Q4NzE1LCAweDIyMDQxNGE4LCAweDE0MWViZjY3LCAweDU2YjQxNTgzLCAweDczZTUwMmUzLAorICAweDQ0Y2FiMTZmLCAweDI4MjY0ZDQyLCAweDczYmFhZWZiLCAweDBhNTBlYmVkLCAweDFkNmFiNmZiLCAweDBkM2FkNDBiLAorICAweDM1ZGIzYjY4LCAweDJiMDgxZTgzLCAweDc3Y2U2Yjk1LCAweDUxODFlNWYwLCAweDc4ODUzYmJjLCAweDAwOWY5NDk0LAorICAweDI3ZTVlZDNjCit9OworCit2b2lkIFZQOEluaXRSYW5kb20oVlA4UmFuZG9tKiBjb25zdCByZywgZmxvYXQgZGl0aGVyaW5nKSB7CisgIG1lbWNweShyZy0+dGFiXywga1JhbmRvbVRhYmxlLCBzaXplb2YocmctPnRhYl8pKTsKKyAgcmctPmluZGV4MV8gPSAwOworICByZy0+aW5kZXgyXyA9IDMxOworICByZy0+YW1wXyA9IChkaXRoZXJpbmcgPCAwLjApID8gMAorICAgICAgICAgICA6IChkaXRoZXJpbmcgPiAxLjApID8gKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKQorICAgICAgICAgICA6ICh1aW50MzJfdCkoKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKSAqIGRpdGhlcmluZyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwZWNlYQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3JhbmRvbS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQc2V1ZG8tcmFuZG9tIHV0aWxpdGllcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9VVElMU19SQU5ET01fSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19SQU5ET01fSF8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVlA4X1JBTkRPTV9ESVRIRVJfRklYIDggICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIGRpdGhlcmluZworI2RlZmluZSBWUDhfUkFORE9NX1RBQkxFX1NJWkUgNTUKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaW5kZXgxXywgaW5kZXgyXzsKKyAgdWludDMyX3QgdGFiX1tWUDhfUkFORE9NX1RBQkxFX1NJWkVdOworICBpbnQgYW1wXzsKK30gVlA4UmFuZG9tOworCisvLyBJbml0aWFsaXplcyByYW5kb20gZ2VuZXJhdG9yIHdpdGggYW4gYW1wbGl0dWRlICdkaXRoZXJpbmcnIGluIHJhbmdlIFswLi4xXS4KK3ZvaWQgVlA4SW5pdFJhbmRvbShWUDhSYW5kb20qIGNvbnN0IHJnLCBmbG9hdCBkaXRoZXJpbmcpOworCisvLyBSZXR1cm5zIGEgY2VudGVyZWQgcHNldWRvLXJhbmRvbSBudW1iZXIgd2l0aCAnbnVtX2JpdHMnIGFtcGxpdHVkZS4KKy8vICh1c2VzIEQuS251dGgncyBEaWZmZXJlbmNlLWJhc2VkIHJhbmRvbSBnZW5lcmF0b3IpLgorLy8gJ2FtcCcgaXMgaW4gVlA4X1JBTkRPTV9ESVRIRVJfRklYIGZpeGVkLXBvaW50IHByZWNpc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmFuZG9tQml0czIoVlA4UmFuZG9tKiBjb25zdCByZywgaW50IG51bV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW1wKSB7CisgIGludCBkaWZmOworICBhc3NlcnQobnVtX2JpdHMgKyBWUDhfUkFORE9NX0RJVEhFUl9GSVggPD0gMzEpOworICBkaWZmID0gcmctPnRhYl9bcmctPmluZGV4MV9dIC0gcmctPnRhYl9bcmctPmluZGV4Ml9dOworICBpZiAoZGlmZiA8IDApIGRpZmYgKz0gKDF1IDw8IDMxKTsKKyAgcmctPnRhYl9bcmctPmluZGV4MV9dID0gZGlmZjsKKyAgaWYgKCsrcmctPmluZGV4MV8gPT0gVlA4X1JBTkRPTV9UQUJMRV9TSVpFKSByZy0+aW5kZXgxXyA9IDA7CisgIGlmICgrK3JnLT5pbmRleDJfID09IFZQOF9SQU5ET01fVEFCTEVfU0laRSkgcmctPmluZGV4Ml8gPSAwOworICAvLyBzaWduLWV4dGVuZCwgMC1jZW50ZXIKKyAgZGlmZiA9IChpbnQpKCh1aW50MzJfdClkaWZmIDw8IDEpID4+ICgzMiAtIG51bV9iaXRzKTsKKyAgZGlmZiA9IChkaWZmICogYW1wKSA+PiBWUDhfUkFORE9NX0RJVEhFUl9GSVg7ICAvLyByZXN0cmljdCByYW5nZQorICBkaWZmICs9IDEgPDwgKG51bV9iaXRzIC0gMSk7ICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IGJhY2sgdG8gMC41LWNlbnRlcgorICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSYW5kb21CaXRzKFZQOFJhbmRvbSogY29uc3QgcmcsIGludCBudW1fYml0cykgeworICByZXR1cm4gVlA4UmFuZG9tQml0czIocmcsIG51bV9iaXRzLCByZy0+YW1wXyk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1VUSUxTX1JBTkRPTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxYzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvZHNwL2RzcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBXZWJQUmVzY2FsZXJJbml0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsIHJlc2NhbGVyX3QqIGNvbnN0IHdvcmspIHsKKyAgY29uc3QgaW50IHhfYWRkID0gc3JjX3dpZHRoLCB4X3N1YiA9IGRzdF93aWR0aDsKKyAgY29uc3QgaW50IHlfYWRkID0gc3JjX2hlaWdodCwgeV9zdWIgPSBkc3RfaGVpZ2h0OworICB3cmstPnhfZXhwYW5kID0gKHNyY193aWR0aCA8IGRzdF93aWR0aCk7CisgIHdyay0+eV9leHBhbmQgPSAoc3JjX2hlaWdodCA8IGRzdF9oZWlnaHQpOworICB3cmstPnNyY193aWR0aCA9IHNyY193aWR0aDsKKyAgd3JrLT5zcmNfaGVpZ2h0ID0gc3JjX2hlaWdodDsKKyAgd3JrLT5kc3Rfd2lkdGggPSBkc3Rfd2lkdGg7CisgIHdyay0+ZHN0X2hlaWdodCA9IGRzdF9oZWlnaHQ7CisgIHdyay0+c3JjX3kgPSAwOworICB3cmstPmRzdF95ID0gMDsKKyAgd3JrLT5kc3QgPSBkc3Q7CisgIHdyay0+ZHN0X3N0cmlkZSA9IGRzdF9zdHJpZGU7CisgIHdyay0+bnVtX2NoYW5uZWxzID0gbnVtX2NoYW5uZWxzOworCisgIC8vIGZvciAneF9leHBhbmQnLCB3ZSB1c2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgorICB3cmstPnhfYWRkID0gd3JrLT54X2V4cGFuZCA/ICh4X3N1YiAtIDEpIDogeF9hZGQ7CisgIHdyay0+eF9zdWIgPSB3cmstPnhfZXhwYW5kID8gKHhfYWRkIC0gMSkgOiB4X3N1YjsKKyAgaWYgKCF3cmstPnhfZXhwYW5kKSB7ICAvLyBmeF9zY2FsZSBpcyBub3QgdXNlZCBvdGhlcndpc2UKKyAgICB3cmstPmZ4X3NjYWxlID0gV0VCUF9SRVNDQUxFUl9GUkFDKDEsIHdyay0+eF9zdWIpOworICB9CisgIC8vIHZlcnRpY2FsIHNjYWxpbmcgcGFyYW1ldGVycworICB3cmstPnlfYWRkID0gd3JrLT55X2V4cGFuZCA/IHlfYWRkIC0gMSA6IHlfYWRkOworICB3cmstPnlfc3ViID0gd3JrLT55X2V4cGFuZCA/IHlfc3ViIC0gMSA6IHlfc3ViOworICB3cmstPnlfYWNjdW0gPSB3cmstPnlfZXhwYW5kID8gd3JrLT55X3N1YiA6IHdyay0+eV9hZGQ7CisgIGlmICghd3JrLT55X2V4cGFuZCkgeworICAgIC8vIHRoaXMgaXMgV0VCUF9SRVNDQUxFUl9GUkFDKGRzdF9oZWlnaHQsIHhfYWRkICogeV9hZGQpIHdpdGhvdXQgdGhlIGNhc3QuCisgICAgY29uc3QgdWludDY0X3QgcmF0aW8gPQorICAgICAgICAodWludDY0X3QpZHN0X2hlaWdodCAqIFdFQlBfUkVTQ0FMRVJfT05FIC8gKHdyay0+eF9hZGQgKiB3cmstPnlfYWRkKTsKKyAgICBpZiAocmF0aW8gIT0gKHVpbnQzMl90KXJhdGlvKSB7CisgICAgICAvLyBXZSBjYW4ndCByZXByZXNlbnQgdGhlIHJhdGlvIHdpdGggdGhlIGN1cnJlbnQgZml4ZWQtcG9pbnQgcHJlY2lzaW9uLgorICAgICAgLy8gPT4gV2Ugc3BlY2lhbC1jYXNlIGZ4eV9zY2FsZSA9IDAsIGluIFdlYlBSZXNjYWxlckV4cG9ydFJvdygpLgorICAgICAgd3JrLT5meHlfc2NhbGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICB3cmstPmZ4eV9zY2FsZSA9ICh1aW50MzJfdClyYXRpbzsKKyAgICB9CisgICAgd3JrLT5meV9zY2FsZSA9IFdFQlBfUkVTQ0FMRVJfRlJBQygxLCB3cmstPnlfc3ViKTsKKyAgfSBlbHNlIHsKKyAgICB3cmstPmZ5X3NjYWxlID0gV0VCUF9SRVNDQUxFUl9GUkFDKDEsIHdyay0+eF9hZGQpOworICAgIC8vIHdyay0+Znh5X3NjYWxlIGlzIHVudXNlZCBoZXJlLgorICB9CisgIHdyay0+aXJvdyA9IHdvcms7CisgIHdyay0+ZnJvdyA9IHdvcmsgKyBudW1fY2hhbm5lbHMgKiBkc3Rfd2lkdGg7CisgIG1lbXNldCh3b3JrLCAwLCAyICogZHN0X3dpZHRoICogbnVtX2NoYW5uZWxzICogc2l6ZW9mKCp3b3JrKSk7CisKKyAgV2ViUFJlc2NhbGVyRHNwSW5pdCgpOworfQorCitpbnQgV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyhpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfaGVpZ2h0KSB7CisgIGFzc2VydChzY2FsZWRfd2lkdGggIT0gTlVMTCk7CisgIGFzc2VydChzY2FsZWRfaGVpZ2h0ICE9IE5VTEwpOworICB7CisgICAgaW50IHdpZHRoID0gKnNjYWxlZF93aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gKnNjYWxlZF9oZWlnaHQ7CisKKyAgICAvLyBpZiB3aWR0aCBpcyB1bnNwZWNpZmllZCwgc2NhbGUgb3JpZ2luYWwgcHJvcG9ydGlvbmFsbHkgdG8gaGVpZ2h0IHJhdGlvLgorICAgIGlmICh3aWR0aCA9PSAwKSB7CisgICAgICB3aWR0aCA9IChzcmNfd2lkdGggKiBoZWlnaHQgKyBzcmNfaGVpZ2h0IC8gMikgLyBzcmNfaGVpZ2h0OworICAgIH0KKyAgICAvLyBpZiBoZWlnaHQgaXMgdW5zcGVjaWZpZWQsIHNjYWxlIG9yaWdpbmFsIHByb3BvcnRpb25hbGx5IHRvIHdpZHRoIHJhdGlvLgorICAgIGlmIChoZWlnaHQgPT0gMCkgeworICAgICAgaGVpZ2h0ID0gKHNyY19oZWlnaHQgKiB3aWR0aCArIHNyY193aWR0aCAvIDIpIC8gc3JjX3dpZHRoOworICAgIH0KKyAgICAvLyBDaGVjayBpZiB0aGUgb3ZlcmFsbCBkaW1lbnNpb25zIHN0aWxsIG1ha2Ugc2Vuc2UuCisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpzY2FsZWRfd2lkdGggPSB3aWR0aDsKKyAgICAqc2NhbGVkX2hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYWxsLWluLW9uZSBjYWxscworCitpbnQgV2ViUFJlc2NhbGVOZWVkZWRMaW5lcyhjb25zdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IG1heF9udW1fbGluZXMpIHsKKyAgY29uc3QgaW50IG51bV9saW5lcyA9ICh3cmstPnlfYWNjdW0gKyB3cmstPnlfc3ViIC0gMSkgLyB3cmstPnlfc3ViOworICByZXR1cm4gKG51bV9saW5lcyA+IG1heF9udW1fbGluZXMpID8gbWF4X251bV9saW5lcyA6IG51bV9saW5lczsKK30KKworaW50IFdlYlBSZXNjYWxlckltcG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IG51bV9saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSkgeworICBpbnQgdG90YWxfaW1wb3J0ZWQgPSAwOworICB3aGlsZSAodG90YWxfaW1wb3J0ZWQgPCBudW1fbGluZXMgJiYgIVdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQod3JrKSkgeworICAgIGlmICh3cmstPnlfZXhwYW5kKSB7CisgICAgICByZXNjYWxlcl90KiBjb25zdCB0bXAgPSB3cmstPmlyb3c7CisgICAgICB3cmstPmlyb3cgPSB3cmstPmZyb3c7CisgICAgICB3cmstPmZyb3cgPSB0bXA7CisgICAgfQorICAgIFdlYlBSZXNjYWxlckltcG9ydFJvdyh3cmssIHNyYyk7CisgICAgaWYgKCF3cmstPnlfZXhwYW5kKSB7ICAgICAvLyBBY2N1bXVsYXRlIHRoZSBjb250cmlidXRpb24gb2YgdGhlIG5ldyByb3cuCisgICAgICBpbnQgeDsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3cmstPm51bV9jaGFubmVscyAqIHdyay0+ZHN0X3dpZHRoOyArK3gpIHsKKyAgICAgICAgd3JrLT5pcm93W3hdICs9IHdyay0+ZnJvd1t4XTsKKyAgICAgIH0KKyAgICB9CisgICAgKyt3cmstPnNyY195OworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICsrdG90YWxfaW1wb3J0ZWQ7CisgICAgd3JrLT55X2FjY3VtIC09IHdyay0+eV9zdWI7CisgIH0KKyAgcmV0dXJuIHRvdGFsX2ltcG9ydGVkOworfQorCitpbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgaW50IHRvdGFsX2V4cG9ydGVkID0gMDsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKKyAgICArK3RvdGFsX2V4cG9ydGVkOworICB9CisgIHJldHVybiB0b3RhbF9leHBvcnRlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3Jlc2NhbGVyLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjVlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy9yZXNjYWxlci5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9VVElMU19SRVNDQUxFUl9IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1VUSUxTX1JFU0NBTEVSX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfUkZJWCAzMiAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgbXVsdGlwbGllcworI2RlZmluZSBXRUJQX1JFU0NBTEVSX09ORSAoMXVsbCA8PCBXRUJQX1JFU0NBTEVSX1JGSVgpCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfRlJBQyh4LCB5KSBcCisgICAgKCh1aW50MzJfdCkoKCh1aW50NjRfdCkoeCkgPDwgV0VCUF9SRVNDQUxFUl9SRklYKSAvICh5KSkpCisKKy8vIFN0cnVjdHVyZSB1c2VkIGZvciBvbi10aGUtZmx5IHJlc2NhbGluZwordHlwZWRlZiB1aW50MzJfdCByZXNjYWxlcl90OyAgIC8vIHR5cGUgZm9yIHNpZGUtYnVmZmVyCit0eXBlZGVmIHN0cnVjdCBXZWJQUmVzY2FsZXIgV2ViUFJlc2NhbGVyOworc3RydWN0IFdlYlBSZXNjYWxlciB7CisgIGludCB4X2V4cGFuZDsgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHdlJ3JlIGV4cGFuZGluZyBpbiB0aGUgeCBkaXJlY3Rpb24KKyAgaW50IHlfZXhwYW5kOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2UncmUgZXhwYW5kaW5nIGluIHRoZSB5IGRpcmVjdGlvbgorICBpbnQgbnVtX2NoYW5uZWxzOyAgICAgICAgICAgLy8gYnl0ZXMgdG8ganVtcCBiZXR3ZWVuIHBpeGVscworICB1aW50MzJfdCBmeF9zY2FsZTsgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgc2NhbGluZyBmYWN0b3JzCisgIHVpbnQzMl90IGZ5X3NjYWxlOyAgICAgICAgICAvLyAnJworICB1aW50MzJfdCBmeHlfc2NhbGU7ICAgICAgICAgLy8gJycKKyAgaW50IHlfYWNjdW07ICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGFjY3VtdWxhdG9yCisgIGludCB5X2FkZCwgeV9zdWI7ICAgICAgICAgICAvLyB2ZXJ0aWNhbCBpbmNyZW1lbnRzCisgIGludCB4X2FkZCwgeF9zdWI7ICAgICAgICAgICAvLyBob3Jpem9udGFsIGluY3JlbWVudHMKKyAgaW50IHNyY193aWR0aCwgc3JjX2hlaWdodDsgIC8vIHNvdXJjZSBkaW1lbnNpb25zCisgIGludCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQ7ICAvLyBkZXN0aW5hdGlvbiBkaW1lbnNpb25zCisgIGludCBzcmNfeSwgZHN0X3k7ICAgICAgICAgICAvLyByb3cgY291bnRlcnMgZm9yIGlucHV0IGFuZCBvdXRwdXQKKyAgdWludDhfdCogZHN0OworICBpbnQgZHN0X3N0cmlkZTsKKyAgcmVzY2FsZXJfdCogaXJvdywgKmZyb3c7ICAgIC8vIHdvcmsgYnVmZmVyCit9OworCisvLyBJbml0aWFsaXplIGEgcmVzY2FsZXIgZ2l2ZW4gc2NyYXRjaCBhcmVhICd3b3JrJyBhbmQgZGltZW5zaW9ucyBvZiBzcmMgJiBkc3QuCit2b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgcmVzY2FsZXJfdCogY29uc3Qgd29yayk7CisKKy8vIElmIGVpdGhlciAnc2NhbGVkX3dpZHRoJyBvciAnc2NhbGVkX2hlaWdodCcgKGJ1dCBub3QgYm90aCkgaXMgMCB0aGUgdmFsdWUKKy8vIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3QgcmF0aW8sIG90aGVyd2lzZSB0aGUgdmFsdWVzIGFyZQorLy8gbGVmdCB1bm1vZGlmaWVkLiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgZWl0aGVyIHZhbHVlIGlzIDAgYWZ0ZXIKKy8vIHBlcmZvcm1pbmcgdGhlIHNjYWxpbmcgY2FsY3VsYXRpb24uCitpbnQgV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyhpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgc2NhbGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfaGVpZ2h0KTsKKworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGlucHV0IGxpbmVzIG5lZWRlZCBuZXh0IHRvIHByb2R1Y2Ugb25lIG91dHB1dCBsaW5lLAorLy8gY29uc2lkZXJpbmcgdGhhdCB0aGUgbWF4aW11bSBhdmFpbGFibGUgaW5wdXQgbGluZXMgYXJlICdtYXhfbnVtX2xpbmVzJy4KK2ludCBXZWJQUmVzY2FsZU5lZWRlZExpbmVzKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bV9saW5lcyk7CisKKy8vIEltcG9ydCBtdWx0aXBsZSByb3dzIG92ZXIgYWxsIGNoYW5uZWxzLCB1bnRpbCBhdCBsZWFzdCBvbmUgcm93IGlzIHJlYWR5IHRvCisvLyBiZSBleHBvcnRlZC4gUmV0dXJucyB0aGUgYWN0dWFsIG51bWJlciBvZiBsaW5lcyB0aGF0IHdlcmUgaW1wb3J0ZWQuCitpbnQgV2ViUFJlc2NhbGVySW1wb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSk7CisKKy8vIEV4cG9ydCBhcyBtYW55IHJvd3MgYXMgcG9zc2libGUuIFJldHVybiB0aGUgbnVtYmVycyBvZiByb3dzIHdyaXR0ZW4uCitpbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpOworCisvLyBSZXR1cm4gdHJ1ZSBpZiBpbnB1dCBpcyBmaW5pc2hlZAorc3RhdGljIFdFQlBfSU5MSU5FCitpbnQgV2ViUFJlc2NhbGVySW5wdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+c3JjX3kgPj0gcmVzY2FsZXItPnNyY19oZWlnaHQpOworfQorLy8gUmV0dXJuIHRydWUgaWYgb3V0cHV0IGlzIGZpbmlzaGVkCitzdGF0aWMgV0VCUF9JTkxJTkUKK2ludCBXZWJQUmVzY2FsZXJPdXRwdXREb25lKGNvbnN0IFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgcmV0dXJuIChyZXNjYWxlci0+ZHN0X3kgPj0gcmVzY2FsZXItPmRzdF9oZWlnaHQpOworfQorCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgcGVuZGluZyBvdXRwdXQgcm93cyByZWFkeS4KK3N0YXRpYyBXRUJQX0lOTElORQoraW50IFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgeworICByZXR1cm4gIVdlYlBSZXNjYWxlck91dHB1dERvbmUocmVzY2FsZXIpICYmIChyZXNjYWxlci0+eV9hY2N1bSA8PSAwKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIENIUk9NSVVNX1dFQlBfVVRJTFNfUkVTQ0FMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2YzI4NgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jCkBAIC0wLDAgKzEsMzU4IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTXVsdGktdGhyZWFkZWQgd29ya2VyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBtZW1zZXQoKQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oIgorCisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiBwdGhyZWFkX211dGV4X3Q7CisKKyNpZiBfV0lOMzJfV0lOTlQgPj0gMHgwNjAwICAvLyBXaW5kb3dzIFZpc3RhIC8gU2VydmVyIDIwMDggb3IgZ3JlYXRlcgorI2RlZmluZSBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKK3R5cGVkZWYgQ09ORElUSU9OX1ZBUklBQkxFIHB0aHJlYWRfY29uZF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKyAgSEFORExFIHdhaXRpbmdfc2VtXzsKKyAgSEFORExFIHJlY2VpdmVkX3NlbV87CisgIEhBTkRMRSBzaWduYWxfZXZlbnRfOworfSBwdGhyZWFkX2NvbmRfdDsKKyNlbmRpZiAgLy8gX1dJTjMyX1dJTk5UID49IDB4NjAwCisKKyNpZm5kZWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04KKyNkZWZpbmUgV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QIDEKKyNkZWZpbmUgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oeCkgeAorI2VuZGlmCisKKyNpZiAhV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKQorI2RlZmluZSBVU0VfQ1JFQVRFX1RIUkVBRAorI2VuZGlmCisKKyNlbHNlICAvLyAhX1dJTjMyCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNlbmRpZiAgLy8gX1dJTjMyCisKK3N0cnVjdCBXZWJQV29ya2VySW1wbCB7CisgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87CisgIHB0aHJlYWRfY29uZF90ICBjb25kaXRpb25fOworICBwdGhyZWFkX3QgICAgICAgdGhyZWFkXzsKK307CisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNpbXBsaXN0aWMgcHRocmVhZCBlbXVsYXRpb24gbGF5ZXIKKworI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworLy8gX2JlZ2ludGhyZWFkZXggcmVxdWlyZXMgX19zdGRjYWxsCisjZGVmaW5lIFRIUkVBREZOIHVuc2lnbmVkIGludCBfX3N0ZGNhbGwKKyNkZWZpbmUgVEhSRUFEX1JFVFVSTih2YWwpICh1bnNpZ25lZCBpbnQpKChEV09SRF9QVFIpdmFsKQorCisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDUwMSAgLy8gV2luZG93cyBYUCBvciBncmVhdGVyCisjZGVmaW5lIFdhaXRGb3JTaW5nbGVPYmplY3Qob2JqLCB0aW1lb3V0KSBcCisgIFdhaXRGb3JTaW5nbGVPYmplY3RFeChvYmosIHRpbWVvdXQsIEZBTFNFIC8qYkFsZXJ0YWJsZSovKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiBjb25zdCB0aHJlYWQsIGNvbnN0IHZvaWQqIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoX19zdGRjYWxsICpzdGFydCkodm9pZCopLCB2b2lkKiBhcmcpIHsKKyAgKHZvaWQpYXR0cjsKKyNpZmRlZiBVU0VfQ1JFQVRFX1RIUkVBRAorICAqdGhyZWFkID0gQ3JlYXRlVGhyZWFkKE5VTEwsICAgLyogbHBUaHJlYWRBdHRyaWJ1dGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiBkd1N0YWNrU2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIGR3U3RhY2tTaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvKiBscFRocmVhZElkICovCisjZWxzZQorICAqdGhyZWFkID0gKHB0aHJlYWRfdClfYmVnaW50aHJlYWRleChOVUxMLCAgIC8qIHZvaWQgKnNlY3VyaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgc3RhY2tfc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIGluaXRmbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLyogdW5zaWduZWQgKnRocmRhZGRyICovCisjZW5kaWYKKyAgaWYgKCp0aHJlYWQgPT0gTlVMTCkgcmV0dXJuIDE7CisgIFNldFRocmVhZFByaW9yaXR5KCp0aHJlYWQsIFRIUkVBRF9QUklPUklUWV9BQk9WRV9OT1JNQUwpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCoqIHZhbHVlX3B0cikgeworICAodm9pZCl2YWx1ZV9wdHI7CisgIHJldHVybiAoV2FpdEZvclNpbmdsZU9iamVjdCh0aHJlYWQsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wIHx8CisgICAgICAgICAgQ2xvc2VIYW5kbGUodGhyZWFkKSA9PSAwKTsKK30KKworLy8gTXV0ZXgKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgsIHZvaWQqIG11dGV4YXR0cikgeworICAodm9pZCltdXRleGF0dHI7CisjaWYgX1dJTjMyX1dJTk5UID49IDB4MDYwMCAgLy8gV2luZG93cyBWaXN0YSAvIFNlcnZlciAyMDA4IG9yIGdyZWF0ZXIKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkV4KG11dGV4LCAwIC8qZHdTcGluQ291bnQqLywgMCAvKkZsYWdzKi8pOworI2Vsc2UKKyAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtdXRleCk7CisjZW5kaWYKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7CisgIExlYXZlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENvbmRpdGlvbgorc3RhdGljIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7CisgIGludCBvayA9IDE7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgICh2b2lkKWNvbmRpdGlvbjsKKyNlbHNlCisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPndhaXRpbmdfc2VtXykgIT0gMCk7CisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8pICE9IDApOworICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKSAhPSAwKTsKKyNlbmRpZgorICByZXR1cm4gIW9rOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24sIHZvaWQqIGNvbmRfYXR0cikgeworICAodm9pZCljb25kX2F0dHI7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIEluaXRpYWxpemVDb25kaXRpb25WYXJpYWJsZShjb25kaXRpb24pOworI2Vsc2UKKyAgY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPSBDcmVhdGVTZW1hcGhvcmUoTlVMTCwgMCwgMSwgTlVMTCk7CisgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKKyAgY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKKyAgaWYgKGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fID09IE5VTEwgfHwKKyAgICAgIGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXyA9PSBOVUxMIHx8CisgICAgICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPT0gTlVMTCkgeworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KGNvbmRpdGlvbik7CisgICAgcmV0dXJuIDE7CisgIH0KKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKKyAgaW50IG9rID0gMTsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKGNvbmRpdGlvbik7CisjZWxzZQorICBpZiAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMCkgPT0gV0FJVF9PQkpFQ1RfMCkgeworICAgIC8vIGEgdGhyZWFkIGlzIHdhaXRpbmcgaW4gcHRocmVhZF9jb25kX3dhaXQ6IGFsbG93IGl0IHRvIGJlIG5vdGlmaWVkCisgICAgb2sgPSBTZXRFdmVudChjb25kaXRpb24tPnNpZ25hbF9ldmVudF8pOworICAgIC8vIHdhaXQgdW50aWwgdGhlIGV2ZW50IGlzIGNvbnN1bWVkIHNvIHRoZSBzaWduYWxlciBjYW5ub3QgY29uc3VtZQorICAgIC8vIHRoZSBldmVudCB2aWEgaXRzIG93biBwdGhyZWFkX2NvbmRfd2FpdC4KKyAgICBvayAmPSAoV2FpdEZvclNpbmdsZU9iamVjdChjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8sIElORklOSVRFKSAhPQorICAgICAgICAgICBXQUlUX09CSkVDVF8wKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgeworICBpbnQgb2s7CisjaWZkZWYgVVNFX1dJTkRPV1NfQ09ORElUSU9OX1ZBUklBQkxFCisgIG9rID0gU2xlZXBDb25kaXRpb25WYXJpYWJsZUNTKGNvbmRpdGlvbiwgbXV0ZXgsIElORklOSVRFKTsKKyNlbHNlCisgIC8vIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGNvbnN1bWVyIGF2YWlsYWJsZSBzbyB0aGUgc2lnbmFsIGlzbid0IGRyb3BwZWQgaW4KKyAgLy8gcHRocmVhZF9jb25kX3NpZ25hbAorICBpZiAoIVJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDEsIE5VTEwpKQorICAgIHJldHVybiAxOworICAvLyBub3cgdW5sb2NrIHRoZSBtdXRleCBzbyBwdGhyZWFkX2NvbmRfc2lnbmFsIG1heSBiZSBpc3N1ZWQKKyAgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOworICBvayA9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XywgSU5GSU5JVEUpID09CisgICAgICAgIFdBSVRfT0JKRUNUXzApOworICBvayAmPSBSZWxlYXNlU2VtYXBob3JlKGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXywgMSwgTlVMTCk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisjZW5kaWYKKyAgcmV0dXJuICFvazsKK30KKworI2Vsc2UgIC8vICFfV0lOMzIKKyMgZGVmaW5lIFRIUkVBREZOIHZvaWQqCisjIGRlZmluZSBUSFJFQURfUkVUVVJOKHZhbCkgdmFsCisjZW5kaWYgIC8vIF9XSU4zMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBFeGVjdXRlKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7ICAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uLgorCitzdGF0aWMgVEhSRUFERk4gVGhyZWFkTG9vcCh2b2lkKiBwdHIpIHsKKyAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gKFdlYlBXb3JrZXIqKXB0cjsKKyAgaW50IGRvbmUgPSAwOworICB3aGlsZSAoIWRvbmUpIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlci0+aW1wbF8tPm11dGV4Xyk7CisgICAgd2hpbGUgKHdvcmtlci0+c3RhdHVzXyA9PSBPSykgeyAgIC8vIHdhaXQgaW4gaWRsaW5nIG1vZGUKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZ3b3JrZXItPmltcGxfLT5jb25kaXRpb25fLCAmd29ya2VyLT5pbXBsXy0+bXV0ZXhfKTsKKyAgICB9CisgICAgaWYgKHdvcmtlci0+c3RhdHVzXyA9PSBXT1JLKSB7CisgICAgICBFeGVjdXRlKHdvcmtlcik7CisgICAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKKyAgICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA9PSBOT1RfT0spIHsgICAvLyBmaW5pc2ggdGhlIHdvcmtlcgorICAgICAgZG9uZSA9IDE7CisgICAgfQorICAgIC8vIHNpZ25hbCB0byB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSdyZSBkb25lIChmb3IgU3luYygpKQorICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJndvcmtlci0+aW1wbF8tPmNvbmRpdGlvbl8pOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPmltcGxfLT5tdXRleF8pOworICB9CisgIHJldHVybiBUSFJFQURfUkVUVVJOKE5VTEwpOyAgICAvLyBUaHJlYWQgaXMgZmluaXNoZWQKK30KKworLy8gbWFpbiB0aHJlYWQgc3RhdGUgY29udHJvbAorc3RhdGljIHZvaWQgQ2hhbmdlU3RhdGUoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFdvcmtlclN0YXR1cyBuZXdfc3RhdHVzKSB7CisgIC8vIE5vLW9wIHdoZW4gYXR0ZW1wdGluZyB0byBjaGFuZ2Ugc3RhdGUgb24gYSB0aHJlYWQgdGhhdCBkaWRuJ3QgY29tZSB1cC4KKyAgLy8gQ2hlY2tpbmcgc3RhdHVzXyB3aXRob3V0IGFjcXVpcmluZyB0aGUgbG9jayBmaXJzdCB3b3VsZCByZXN1bHQgaW4gYSBkYXRhCisgIC8vIHJhY2UuCisgIGlmICh3b3JrZXItPmltcGxfID09IE5VTEwpIHJldHVybjsKKworICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlci0+aW1wbF8tPm11dGV4Xyk7CisgIGlmICh3b3JrZXItPnN0YXR1c18gPj0gT0spIHsKKyAgICAvLyB3YWl0IGZvciB0aGUgd29ya2VyIHRvIGZpbmlzaAorICAgIHdoaWxlICh3b3JrZXItPnN0YXR1c18gIT0gT0spIHsKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZ3b3JrZXItPmltcGxfLT5jb25kaXRpb25fLCAmd29ya2VyLT5pbXBsXy0+bXV0ZXhfKTsKKyAgICB9CisgICAgLy8gYXNzaWduIG5ldyBzdGF0dXMgYW5kIHJlbGVhc2UgdGhlIHdvcmtpbmcgdGhyZWFkIGlmIG5lZWRlZAorICAgIGlmIChuZXdfc3RhdHVzICE9IE9LKSB7CisgICAgICB3b3JrZXItPnN0YXR1c18gPSBuZXdfc3RhdHVzOworICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmd29ya2VyLT5pbXBsXy0+Y29uZGl0aW9uXyk7CisgICAgfQorICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPmltcGxfLT5tdXRleF8pOworfQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1RIUkVBRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBJbml0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworICBtZW1zZXQod29ya2VyLCAwLCBzaXplb2YoKndvcmtlcikpOworICB3b3JrZXItPnN0YXR1c18gPSBOT1RfT0s7Cit9CisKK3N0YXRpYyBpbnQgU3luYyhXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyNpZmRlZiBXRUJQX1VTRV9USFJFQUQKKyAgQ2hhbmdlU3RhdGUod29ya2VyLCBPSyk7CisjZW5kaWYKKyAgYXNzZXJ0KHdvcmtlci0+c3RhdHVzXyA8PSBPSyk7CisgIHJldHVybiAhd29ya2VyLT5oYWRfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgUmVzZXQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisgIGludCBvayA9IDE7CisgIHdvcmtlci0+aGFkX2Vycm9yID0gMDsKKyAgaWYgKHdvcmtlci0+c3RhdHVzXyA8IE9LKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgICAgd29ya2VyLT5pbXBsXyA9IChXZWJQV29ya2VySW1wbCopV2ViUFNhZmVDYWxsb2MoMSwgc2l6ZW9mKCp3b3JrZXItPmltcGxfKSk7CisgICAgaWYgKHdvcmtlci0+aW1wbF8gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwdGhyZWFkX211dGV4X2luaXQoJndvcmtlci0+aW1wbF8tPm11dGV4XywgTlVMTCkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmd29ya2VyLT5pbXBsXy0+Y29uZGl0aW9uXywgTlVMTCkpIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmd29ya2VyLT5pbXBsXy0+bXV0ZXhfKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd29ya2VyLT5pbXBsXy0+bXV0ZXhfKTsKKyAgICBvayA9ICFwdGhyZWFkX2NyZWF0ZSgmd29ya2VyLT5pbXBsXy0+dGhyZWFkXywgTlVMTCwgVGhyZWFkTG9vcCwgd29ya2VyKTsKKyAgICBpZiAob2spIHdvcmtlci0+c3RhdHVzXyA9IE9LOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPmltcGxfLT5tdXRleF8pOworICAgIGlmICghb2spIHsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmd29ya2VyLT5pbXBsXy0+bXV0ZXhfKTsKKyAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ3b3JrZXItPmltcGxfLT5jb25kaXRpb25fKTsKKyBFcnJvcjoKKyAgICAgIFdlYlBTYWZlRnJlZSh3b3JrZXItPmltcGxfKTsKKyAgICAgIHdvcmtlci0+aW1wbF8gPSBOVUxMOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2Vsc2UKKyAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKKyNlbmRpZgorICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA+IE9LKSB7CisgICAgb2sgPSBTeW5jKHdvcmtlcik7CisgIH0KKyAgYXNzZXJ0KCFvayB8fCAod29ya2VyLT5zdGF0dXNfID09IE9LKSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgRXhlY3V0ZShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyAgaWYgKHdvcmtlci0+aG9vayAhPSBOVUxMKSB7CisgICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBMYXVuY2goV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIENoYW5nZVN0YXRlKHdvcmtlciwgV09SSyk7CisjZWxzZQorICBFeGVjdXRlKHdvcmtlcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICBpZiAod29ya2VyLT5pbXBsXyAhPSBOVUxMKSB7CisgICAgQ2hhbmdlU3RhdGUod29ya2VyLCBOT1RfT0spOworICAgIHB0aHJlYWRfam9pbih3b3JrZXItPmltcGxfLT50aHJlYWRfLCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJndvcmtlci0+aW1wbF8tPm11dGV4Xyk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJndvcmtlci0+aW1wbF8tPmNvbmRpdGlvbl8pOworICAgIFdlYlBTYWZlRnJlZSh3b3JrZXItPmltcGxfKTsKKyAgICB3b3JrZXItPmltcGxfID0gTlVMTDsKKyAgfQorI2Vsc2UKKyAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOworICBhc3NlcnQod29ya2VyLT5pbXBsXyA9PSBOVUxMKTsKKyNlbmRpZgorICBhc3NlcnQod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXZWJQV29ya2VySW50ZXJmYWNlIGdfd29ya2VyX2ludGVyZmFjZSA9IHsKKyAgSW5pdCwgUmVzZXQsIFN5bmMsIExhdW5jaCwgRXhlY3V0ZSwgRW5kCit9OworCitpbnQgV2ViUFNldFdvcmtlckludGVyZmFjZShjb25zdCBXZWJQV29ya2VySW50ZXJmYWNlKiBjb25zdCB3aW50ZXJmYWNlKSB7CisgIGlmICh3aW50ZXJmYWNlID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkluaXQgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5SZXNldCA9PSBOVUxMIHx8CisgICAgICB3aW50ZXJmYWNlLT5TeW5jID09IE5VTEwgfHwgd2ludGVyZmFjZS0+TGF1bmNoID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPkV4ZWN1dGUgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5FbmQgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGdfd29ya2VyX2ludGVyZmFjZSA9ICp3aW50ZXJmYWNlOworICByZXR1cm4gMTsKK30KKworY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogV2ViUEdldFdvcmtlckludGVyZmFjZSh2b2lkKSB7CisgIHJldHVybiAmZ193b3JrZXJfaW50ZXJmYWNlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy90aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzdiOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdGhyZWFkLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE11bHRpLXRocmVhZGVkIHdvcmtlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgQ0hST01JVU1fV0VCUF9VVElMU19USFJFQURfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19USFJFQURfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICIuLi93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBTdGF0ZSBvZiB0aGUgd29ya2VyIHRocmVhZCBvYmplY3QKK3R5cGVkZWYgZW51bSB7CisgIE5PVF9PSyA9IDAsICAgLy8gb2JqZWN0IGlzIHVudXNhYmxlCisgIE9LLCAgICAgICAgICAgLy8gcmVhZHkgdG8gd29yaworICBXT1JLICAgICAgICAgIC8vIGJ1c3kgZmluaXNoaW5nIHRoZSBjdXJyZW50IHRhc2sKK30gV2ViUFdvcmtlclN0YXR1czsKKworLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkLiBUYWtlcyB0d28gb3BhcXVlIHBvaW50ZXJzIGFzCisvLyBhcmd1bWVudHMgKGRhdGExIGFuZCBkYXRhMiksIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCit0eXBlZGVmIGludCAoKldlYlBXb3JrZXJIb29rKSh2b2lkKiwgdm9pZCopOworCisvLyBQbGF0Zm9ybS1kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgdGhlIHdvcmtlci4KK3R5cGVkZWYgc3RydWN0IFdlYlBXb3JrZXJJbXBsIFdlYlBXb3JrZXJJbXBsOworCisvLyBTeW5jaHJvbml6YXRpb24gb2JqZWN0IHVzZWQgdG8gbGF1bmNoIGpvYiBpbiB0aGUgd29ya2VyIHRocmVhZAordHlwZWRlZiBzdHJ1Y3QgeworICBXZWJQV29ya2VySW1wbCogaW1wbF87CisgIFdlYlBXb3JrZXJTdGF0dXMgc3RhdHVzXzsKKyAgV2ViUFdvcmtlckhvb2sgaG9vazsgICAgLy8gaG9vayB0byBjYWxsCisgIHZvaWQqIGRhdGExOyAgICAgICAgICAgIC8vIGZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byAnaG9vaycKKyAgdm9pZCogZGF0YTI7ICAgICAgICAgICAgLy8gc2Vjb25kIGFyZ3VtZW50IHBhc3NlZCB0byAnaG9vaycKKyAgaW50IGhhZF9lcnJvcjsgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIG9mIHRoZSBsYXN0IGNhbGwgdG8gJ2hvb2snCit9IFdlYlBXb3JrZXI7CisKKy8vIFRoZSBpbnRlcmZhY2UgZm9yIGFsbCB0aHJlYWQtd29ya2VyIHJlbGF0ZWQgZnVuY3Rpb25zLiBBbGwgdGhlc2UgZnVuY3Rpb25zCisvLyBtdXN0IGJlIGltcGxlbWVudGVkLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCwgYmVmb3JlIGFueSBvdGhlciBtZXRob2QuCisgIHZvaWQgKCpJbml0KShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBNdXN0IGJlIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBvYmplY3QgYW5kIHNwYXduIHRoZSB0aHJlYWQuIFJlLWVudHJhbnQuCisgIC8vIFdpbGwgcG90ZW50aWFsbHkgbGF1bmNoIHRoZSB0aHJlYWQuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KKyAgaW50ICgqUmVzZXQpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIE1ha2VzIHN1cmUgdGhlIHByZXZpb3VzIHdvcmsgaXMgZmluaXNoZWQuIFJldHVybnMgdHJ1ZSBpZiB3b3JrZXItPmhhZF9lcnJvcgorICAvLyB3YXMgbm90IHNldCBhbmQgbm8gZXJyb3IgY29uZGl0aW9uIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHdvcmtpbmcgdGhyZWFkLgorICBpbnQgKCpTeW5jKShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBUcmlnZ2VycyB0aGUgdGhyZWFkIHRvIGNhbGwgaG9vaygpIHdpdGggZGF0YTEgYW5kIGRhdGEyIGFyZ3VtZW50cy4gVGhlc2UKKyAgLy8gaG9vay9kYXRhMS9kYXRhMiB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWUgYmVmb3JlIGNhbGxpbmcgdGhpcworICAvLyBmdW5jdGlvbiwgYnV0IG5vdCBiZSBjaGFuZ2VkIGFmdGVyd2FyZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIFN5bmMoKS4KKyAgdm9pZCAoKkxhdW5jaCkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIExhdW5jaCgpIGV4Y2VwdCB0aGF0IGl0IGNhbGxzIHRoZQorICAvLyBob29rIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgYSB0aHJlYWQuIENvbnZlbmllbnQgdG8gYnlwYXNzIHRoZSB0aHJlYWQKKyAgLy8gbWVjaGFuaXNtIHdoaWxlIHN0aWxsIHVzaW5nIHRoZSBXZWJQV29ya2VyIHN0cnVjdHMuIFN5bmMoKSBtdXN0CisgIC8vIHN0aWxsIGJlIGNhbGxlZCBhZnRlcndhcmQgKGZvciBlcnJvciByZXBvcnRpbmcpLgorICB2b2lkICgqRXhlY3V0ZSkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gS2lsbCB0aGUgdGhyZWFkIGFuZCB0ZXJtaW5hdGUgdGhlIG9iamVjdC4gVG8gdXNlIHRoZSBvYmplY3QgYWdhaW4sIG9uZQorICAvLyBtdXN0IGNhbGwgUmVzZXQoKSBhZ2Fpbi4KKyAgdm9pZCAoKkVuZCkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKK30gV2ViUFdvcmtlckludGVyZmFjZTsKKworLy8gSW5zdGFsbCBhIG5ldyBzZXQgb2YgdGhyZWFkaW5nIGZ1bmN0aW9ucywgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdHMuIFRoaXMKKy8vIHNob3VsZCBiZSBkb25lIGJlZm9yZSBhbnkgd29ya2VycyBhcmUgc3RhcnRlZCwgaS5lLiwgYmVmb3JlIGFueSBlbmNvZGluZyBvcgorLy8gZGVjb2RpbmcgdGFrZXMgcGxhY2UuIFRoZSBjb250ZW50cyBvZiB0aGUgaW50ZXJmYWNlIHN0cnVjdCBhcmUgY29waWVkLCBpdAorLy8gaXMgc2FmZSB0byBmcmVlIHRoZSBjb3JyZXNwb25kaW5nIG1lbW9yeSBhZnRlciB0aGlzIGNhbGwuIFRoaXMgZnVuY3Rpb24gaXMKKy8vIG5vdCB0aHJlYWQtc2FmZS4gUmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgaW52YWxpZCBwb2ludGVyIG9yIG1ldGhvZHMuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBTZXRXb3JrZXJJbnRlcmZhY2UoCisgICAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd2ludGVyZmFjZSk7CisKKy8vIFJldHJpZXZlIHRoZSBjdXJyZW50bHkgc2V0IHRocmVhZCB3b3JrZXIgaW50ZXJmYWNlLgorV0VCUF9FWFRFUk4oY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSopIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2Uodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1VUSUxTX1RIUkVBRF9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1YjRmZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNaXNjLiBjb21tb24gdXRpbGl0eSBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBmb3IgbWVtY3B5KCkKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBmb3IgTUFYX1BBTEVUVEVfU0laRQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvdXRpbHMvdXRpbHMuaCIKKworLy8gSWYgUFJJTlRfTUVNX0lORk8gaXMgZGVmaW5lZCwgZXh0cmEgaW5mbyAobGlrZSB0b3RhbCBtZW1vcnkgdXNlZCwgbnVtYmVyIG9mCisvLyBhbGxvYy9mcmVlIGV0YykgaXMgcHJpbnRlZC4gRm9yIGRlYnVnZ2luZy90dW5pbmcgcHVycG9zZSBvbmx5IChpdCdzIHNsb3csCisvLyBhbmQgbm90IG11bHRpLXRocmVhZCBzYWZlISkuCisvLyBBbiBpbnRlcmVzdGluZyBhbHRlcm5hdGl2ZSBpcyB2YWxncmluZCdzICdtYXNzaWYnIHRvb2w6CisvLyAgICBodHRwOi8vdmFsZ3JpbmQub3JnL2RvY3MvbWFudWFsL21zLW1hbnVhbC5odG1sCisvLyBIZXJlIGlzIGFuIGV4YW1wbGUgY29tbWFuZCBsaW5lOgorLyogICAgdmFsZ3JpbmQgLS10b29sPW1hc3NpZiAtLW1hc3NpZi1vdXQtZmlsZT1tYXNzaWYub3V0IFwKKyAgICAgICAgICAgICAgIC0tc3RhY2tzPXllcyAtLWFsbG9jLWZuPVdlYlBTYWZlQWxsb2MgLS1hbGxvYy1mbj1XZWJQU2FmZUNhbGxvYworICAgICAgbXNfcHJpbnQgbWFzc2lmLm91dAorKi8KKy8vIEluIGFkZGl0aW9uOgorLy8gKiBpZiBQUklOVF9NRU1fVFJBRkZJQyBpcyBkZWZpbmVkLCBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIG1hbGxvYy9mcmVlIGN5Y2xlcworLy8gICBhcmUgcHJpbnRlZC4KKy8vICogaWYgTUFMTE9DX0ZBSUxfQVQgaXMgZGVmaW5lZCwgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8gICAkTUFMTE9DX0ZBSUxfQVQgaXMgdXNlZCB0byBzaW11bGF0ZSBhIG1lbW9yeSBlcnJvciB3aGVuIGNhbGxvYyBvciBtYWxsb2MKKy8vICAgaXMgY2FsbGVkIGZvciB0aGUgbnRoIHRpbWUuIEV4YW1wbGUgdXNhZ2U6CisvLyAgIGV4cG9ydCBNQUxMT0NfRkFJTF9BVD01MCAmJiAuL2V4YW1wbGVzL2N3ZWJwIGlucHV0LnBuZworLy8gKiBpZiBNQUxMT0NfTElNSVQgaXMgZGVmaW5lZCwgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCB2YXJpYWJsZSAkTUFMTE9DX0xJTUlUCisvLyAgIHNldHMgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSAoaW4gYnl0ZXMpIG1hZGUgYXZhaWxhYmxlIHRvIGxpYndlYnAuCisvLyAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW11bGF0ZSBlbnZpcm9ubWVudCB3aXRoIHZlcnkgbGltaXRlZCBtZW1vcnkuCisvLyAgIEV4YW1wbGU6IGV4cG9ydCBNQUxMT0NfTElNSVQ9NjQwMDAwMDAgJiYgLi9leGFtcGxlcy9kd2VicCBwaWN0dXJlLndlYnAKKworLy8gI2RlZmluZSBQUklOVF9NRU1fSU5GTworLy8gI2RlZmluZSBQUklOVF9NRU1fVFJBRkZJQworLy8gI2RlZmluZSBNQUxMT0NfRkFJTF9BVAorLy8gI2RlZmluZSBNQUxMT0NfTElNSVQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoZWNrZWQgbWVtb3J5IGFsbG9jYXRpb24KKworI2lmIGRlZmluZWQoUFJJTlRfTUVNX0lORk8pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IG51bV9tYWxsb2NfY2FsbHMgPSAwOworc3RhdGljIGludCBudW1fY2FsbG9jX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2ZyZWVfY2FsbHMgPSAwOworc3RhdGljIGludCBjb3VudGRvd25fdG9fZmFpbCA9IDA7ICAgICAvLyAwID0gb2ZmCisKK3R5cGVkZWYgc3RydWN0IE1lbUJsb2NrIE1lbUJsb2NrOworc3RydWN0IE1lbUJsb2NrIHsKKyAgdm9pZCogcHRyXzsKKyAgc2l6ZV90IHNpemVfOworICBNZW1CbG9jayogbmV4dF87Cit9OworCitzdGF0aWMgTWVtQmxvY2sqIGFsbF9ibG9ja3MgPSBOVUxMOworc3RhdGljIHNpemVfdCB0b3RhbF9tZW0gPSAwOworc3RhdGljIHNpemVfdCB0b3RhbF9tZW1fYWxsb2NhdGVkID0gMDsKK3N0YXRpYyBzaXplX3QgaGlnaF93YXRlcl9tYXJrID0gMDsKK3N0YXRpYyBzaXplX3QgbWVtX2xpbWl0ID0gMDsKKworc3RhdGljIGludCBleGl0X3JlZ2lzdGVyZWQgPSAwOworCitzdGF0aWMgdm9pZCBQcmludE1lbUluZm8odm9pZCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlxuTUVNT1JZIElORk86XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJudW0gY2FsbHMgdG86IG1hbGxvYyA9ICU0ZFxuIiwgbnVtX21hbGxvY19jYWxscyk7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICBjYWxsb2MgPSAlNGRcbiIsIG51bV9jYWxsb2NfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgZnJlZSAgID0gJTRkXG4iLCBudW1fZnJlZV9jYWxscyk7CisgIGZwcmludGYoc3RkZXJyLCAidG90YWxfbWVtOiAldVxuIiwgKHVpbnQzMl90KXRvdGFsX21lbSk7CisgIGZwcmludGYoc3RkZXJyLCAidG90YWxfbWVtIGFsbG9jYXRlZDogJXVcbiIsICh1aW50MzJfdCl0b3RhbF9tZW1fYWxsb2NhdGVkKTsKKyAgZnByaW50ZihzdGRlcnIsICJoaWdoLXdhdGVyIG1hcms6ICV1XG4iLCAodWludDMyX3QpaGlnaF93YXRlcl9tYXJrKTsKKyAgd2hpbGUgKGFsbF9ibG9ja3MgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiBiID0gYWxsX2Jsb2NrczsKKyAgICBhbGxfYmxvY2tzID0gYi0+bmV4dF87CisgICAgZnJlZShiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbmNyZW1lbnQoaW50KiBjb25zdCB2KSB7CisgIGlmICghZXhpdF9yZWdpc3RlcmVkKSB7CisjaWYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBtYWxsb2NfZmFpbF9hdF9zdHIgPSBnZXRlbnYoIk1BTExPQ19GQUlMX0FUIik7CisgICAgICBpZiAobWFsbG9jX2ZhaWxfYXRfc3RyICE9IE5VTEwpIHsKKyAgICAgICAgY291bnRkb3duX3RvX2ZhaWwgPSBhdG9pKG1hbGxvY19mYWlsX2F0X3N0cik7CisgICAgICB9CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChNQUxMT0NfTElNSVQpCisgICAgeworICAgICAgY29uc3QgY2hhciogY29uc3QgbWFsbG9jX2xpbWl0X3N0ciA9IGdldGVudigiTUFMTE9DX0xJTUlUIik7CisgICAgICBpZiAobWFsbG9jX2xpbWl0X3N0ciAhPSBOVUxMKSB7CisgICAgICAgIG1lbV9saW1pdCA9IGF0b2kobWFsbG9jX2xpbWl0X3N0cik7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgKHZvaWQpY291bnRkb3duX3RvX2ZhaWw7CisgICAgKHZvaWQpbWVtX2xpbWl0OworICAgIGF0ZXhpdChQcmludE1lbUluZm8pOworICAgIGV4aXRfcmVnaXN0ZXJlZCA9IDE7CisgIH0KKyAgKysqdjsKK30KKworc3RhdGljIHZvaWQgQWRkTWVtKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgTWVtQmxvY2sqIGNvbnN0IGIgPSAoTWVtQmxvY2sqKW1hbGxvYyhzaXplb2YoKmIpKTsKKyAgICBpZiAoYiA9PSBOVUxMKSBhYm9ydCgpOworICAgIGItPm5leHRfID0gYWxsX2Jsb2NrczsKKyAgICBhbGxfYmxvY2tzID0gYjsKKyAgICBiLT5wdHJfID0gcHRyOworICAgIGItPnNpemVfID0gc2l6ZTsKKyAgICB0b3RhbF9tZW0gKz0gc2l6ZTsKKyAgICB0b3RhbF9tZW1fYWxsb2NhdGVkICs9IHNpemU7CisjaWYgZGVmaW5lZChQUklOVF9NRU1fVFJBRkZJQykKKyNpZiBkZWZpbmVkKE1BTExPQ19GQUlMX0FUKQorICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbC1jb3VudDogJTVkIFttZW09JXVdXG4iLAorICAgICAgICAgICAgbnVtX21hbGxvY19jYWxscyArIG51bV9jYWxsb2NfY2FsbHMsICh1aW50MzJfdCl0b3RhbF9tZW0pOworI2Vsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1lbTogJXUgKCsldSlcbiIsICh1aW50MzJfdCl0b3RhbF9tZW0sICh1aW50MzJfdClzaXplKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHRvdGFsX21lbSA+IGhpZ2hfd2F0ZXJfbWFyaykgaGlnaF93YXRlcl9tYXJrID0gdG90YWxfbWVtOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN1Yk1lbSh2b2lkKiBwdHIpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgTWVtQmxvY2sqKiBiID0gJmFsbF9ibG9ja3M7CisgICAgLy8gSW5lZmZpY2llbnQgc2VhcmNoLCBidXQgdGhhdCdzIGp1c3QgZm9yIGRlYnVnZ2luZy4KKyAgICB3aGlsZSAoKmIgIT0gTlVMTCAmJiAoKmIpLT5wdHJfICE9IHB0cikgYiA9ICYoKmIpLT5uZXh0XzsKKyAgICBpZiAoKmIgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBvaW50ZXIgZnJlZSEgKCVwKVxuIiwgcHRyKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHsKKyAgICAgIE1lbUJsb2NrKiBjb25zdCBibG9jayA9ICpiOworICAgICAgKmIgPSBibG9jay0+bmV4dF87CisgICAgICB0b3RhbF9tZW0gLT0gYmxvY2stPnNpemVfOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX1RSQUZGSUMpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1lbTogJXUgKC0ldSlcbiIsCisgICAgICAgICAgICAgICh1aW50MzJfdCl0b3RhbF9tZW0sICh1aW50MzJfdClibG9jay0+c2l6ZV8pOworI2VuZGlmCisgICAgICBmcmVlKGJsb2NrKTsKKyAgICB9CisgIH0KK30KKworI2Vsc2UKKyNkZWZpbmUgSW5jcmVtZW50KHYpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBZGRNZW0ocCwgcykgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIFN1Yk1lbShwKSAgICBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisvLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBvZiBubWVtYiAqIHNpemUuCitzdGF0aWMgaW50IENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgeworICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gbm1lbWIgKiBzaXplOworICBpZiAobm1lbWIgPT0gMCkgcmV0dXJuIDE7CisgIGlmICgodWludDY0X3Qpc2l6ZSA+IFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgLyBubWVtYikgcmV0dXJuIDA7CisgIGlmICh0b3RhbF9zaXplICE9IChzaXplX3QpdG90YWxfc2l6ZSkgcmV0dXJuIDA7CisjaWYgZGVmaW5lZChQUklOVF9NRU1fSU5GTykgJiYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgaWYgKGNvdW50ZG93bl90b19mYWlsID4gMCAmJiAtLWNvdW50ZG93bl90b19mYWlsID09IDApIHsKKyAgICByZXR1cm4gMDsgICAgLy8gZmFrZSBmYWlsIQorICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1BTExPQ19MSU1JVCkKKyAgaWYgKG1lbV9saW1pdCA+IDAgJiYgdG90YWxfbWVtICsgdG90YWxfc2l6ZSA+PSBtZW1fbGltaXQpIHsKKyAgICByZXR1cm4gMDsgICAvLyBmYWtlIGZhaWwhCisgIH0KKyNlbmRpZgorCisgIHJldHVybiAxOworfQorCit2b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcHRyOworICBJbmNyZW1lbnQoJm51bV9tYWxsb2NfY2FsbHMpOworICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7CisgIGFzc2VydChubWVtYiAqIHNpemUgPiAwKTsKKyAgcHRyID0gbWFsbG9jKChzaXplX3QpKG5tZW1iICogc2l6ZSkpOworICBBZGRNZW0ocHRyLCAoc2l6ZV90KShubWVtYiAqIHNpemUpKTsKKyAgcmV0dXJuIHB0cjsKK30KKwordm9pZCogV2ViUFNhZmVDYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0cjsKKyAgSW5jcmVtZW50KCZudW1fY2FsbG9jX2NhbGxzKTsKKyAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOworICBhc3NlcnQobm1lbWIgKiBzaXplID4gMCk7CisgIHB0ciA9IGNhbGxvYygoc2l6ZV90KW5tZW1iLCBzaXplKTsKKyAgQWRkTWVtKHB0ciwgKHNpemVfdCkobm1lbWIgKiBzaXplKSk7CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgV2ViUFNhZmVGcmVlKHZvaWQqIGNvbnN0IHB0cikgeworICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICBJbmNyZW1lbnQoJm51bV9mcmVlX2NhbGxzKTsKKyAgICBTdWJNZW0ocHRyKTsKKyAgfQorICBmcmVlKHB0cik7Cit9CisKKy8vIFB1YmxpYyBBUEkgZnVuY3Rpb24uCit2b2lkIFdlYlBGcmVlKHZvaWQqIHB0cikgeworICBmcmVlKHB0cik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgV2ViUENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjX3N0cmlkZSA+PSB3aWR0aCAmJiBkc3Rfc3RyaWRlID49IHdpZHRoKTsKKyAgd2hpbGUgKGhlaWdodC0tID4gMCkgeworICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3ZvaWQgV2ViUENvcHlQaXhlbHMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KHNyYy0+dXNlX2FyZ2IgJiYgZHN0LT51c2VfYXJnYik7CisgIFdlYlBDb3B5UGxhbmUoKHVpbnQ4X3QqKXNyYy0+YXJnYiwgNCAqIHNyYy0+YXJnYl9zdHJpZGUsICh1aW50OF90Kilkc3QtPmFyZ2IsCisgICAgICAgICAgICAgICAgNCAqIGRzdC0+YXJnYl9zdHJpZGUsIDQgKiBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX0NPTE9SX0NPVU5UICAgICAgICAgTUFYX1BBTEVUVEVfU0laRQorI2RlZmluZSBDT0xPUl9IQVNIX1NJWkUgICAgICAgICAoTUFYX0NPTE9SX0NPVU5UICogNCkKKyNkZWZpbmUgQ09MT1JfSEFTSF9SSUdIVF9TSElGVCAgMjIgIC8vIDMyIC0gbG9nMihDT0xPUl9IQVNIX1NJWkUpLgorCitpbnQgV2ViUEdldENvbG9yUGFsZXR0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSkgeworICBpbnQgaTsKKyAgaW50IHgsIHk7CisgIGludCBudW1fY29sb3JzID0gMDsKKyAgdWludDhfdCBpbl91c2VbQ09MT1JfSEFTSF9TSVpFXSA9IHsgMCB9OworICB1aW50MzJfdCBjb2xvcnNbQ09MT1JfSEFTSF9TSVpFXTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtIYXNoTXVsID0gMHgxZTM1YTdiZFU7CisgIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljLT5hcmdiOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIHVpbnQzMl90IGxhc3RfcGl4ID0gfmFyZ2JbMF07ICAgLy8gc28gd2UncmUgc3VyZSB0aGF0IGxhc3RfcGl4ICE9IGFyZ2JbMF0KKyAgYXNzZXJ0KHBpYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KHBpYy0+dXNlX2FyZ2IpOworCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBpbnQga2V5OworICAgICAgaWYgKGFyZ2JbeF0gPT0gbGFzdF9waXgpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBsYXN0X3BpeCA9IGFyZ2JbeF07CisgICAgICBrZXkgPSAoa0hhc2hNdWwgKiBsYXN0X3BpeCkgPj4gQ09MT1JfSEFTSF9SSUdIVF9TSElGVDsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghaW5fdXNlW2tleV0pIHsKKyAgICAgICAgICBjb2xvcnNba2V5XSA9IGxhc3RfcGl4OworICAgICAgICAgIGluX3VzZVtrZXldID0gMTsKKyAgICAgICAgICArK251bV9jb2xvcnM7CisgICAgICAgICAgaWYgKG51bV9jb2xvcnMgPiBNQVhfQ09MT1JfQ09VTlQpIHsKKyAgICAgICAgICAgIHJldHVybiBNQVhfQ09MT1JfQ09VTlQgKyAxOyAgLy8gRXhhY3QgY291bnQgbm90IG5lZWRlZC4KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoY29sb3JzW2tleV0gPT0gbGFzdF9waXgpIHsKKyAgICAgICAgICBicmVhazsgIC8vIFRoZSBjb2xvciBpcyBhbHJlYWR5IHRoZXJlLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFNvbWUgb3RoZXIgY29sb3Igc2l0cyBoZXJlLCBzbyBkbyBsaW5lYXIgY29uZmxpY3QgcmVzb2x1dGlvbi4KKyAgICAgICAgICArK2tleTsKKyAgICAgICAgICBrZXkgJj0gKENPTE9SX0hBU0hfU0laRSAtIDEpOyAgLy8gS2V5IG1hc2suCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9CisKKyAgaWYgKHBhbGV0dGUgIT0gTlVMTCkgeyAgLy8gRmlsbCB0aGUgY29sb3JzIGludG8gcGFsZXR0ZS4KKyAgICBudW1fY29sb3JzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09MT1JfSEFTSF9TSVpFOyArK2kpIHsKKyAgICAgIGlmIChpbl91c2VbaV0pIHsKKyAgICAgICAgcGFsZXR0ZVtudW1fY29sb3JzXSA9IGNvbG9yc1tpXTsKKyAgICAgICAgKytudW1fY29sb3JzOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2NvbG9yczsKK30KKworI3VuZGVmIE1BWF9DT0xPUl9DT1VOVAorI3VuZGVmIENPTE9SX0hBU0hfU0laRQorI3VuZGVmIENPTE9SX0hBU0hfUklHSFRfU0hJRlQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3V0aWxzL3V0aWxzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTJjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC91dGlscy91dGlscy5oCkBAIC0wLDAgKzEsMTgyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTWlzYy4gY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yczogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfVVRJTFNfVVRJTFNfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9VVElMU19VVElMU19IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIi4uL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC9kc3AvZHNwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1lbW9yeSBhbGxvY2F0aW9uCisKKy8vIFRoaXMgaXMgdGhlIG1heGltdW0gbWVtb3J5IGFtb3VudCB0aGF0IGxpYndlYnAgd2lsbCBldmVyIHRyeSB0byBhbGxvY2F0ZS4KKyNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoMVVMTCA8PCA0MCkKKworLy8gc2l6ZS1jaGVja2luZyBzYWZlIG1hbGxvYy9jYWxsb2M6IHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgdG9vCisvLyBsYXJnZSwgb3IgcmV0dXJuIE5VTEwuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlc2UgZm9yIGNvbnN0cnVjdHMgbGlrZQorLy8gbWFsbG9jKHNpemVvZihmb28pKSwgYnV0IG9ubHkgaWYgdGhlcmUncyBwaWN0dXJlLWRlcGVuZGVudCBzaXplIGludm9sdmVkCisvLyBzb21ld2hlcmUgKGxpa2U6IG1hbGxvYyhudW1fcGl4ZWxzICogc2l6ZW9mKCpzb21ldGhpbmcpKSkuIFRoYXQncyB3aHkgdGhpcworLy8gc2FmZSBtYWxsb2MoKSBib3Jyb3dzIHRoZSBzaWduYXR1cmUgZnJvbSBjYWxsb2MoKSwgcG9pbnRpbmcgYXQgdGhlIGRhbmdlcm91cworLy8gdW5kZXJseWluZyBtdWx0aXBseSBpbnZvbHZlZC4KK1dFQlBfRVhURVJOKHZvaWQqKSBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOworLy8gTm90ZSB0aGF0IFdlYlBTYWZlQ2FsbG9jKCkgZXhwZWN0cyB0aGUgc2Vjb25kIGFyZ3VtZW50IHR5cGUgdG8gYmUgJ3NpemVfdCcKKy8vIGluIG9yZGVyIHRvIGZhdm9yIHRoZSAiY2FsbG9jKG51bV9mb28sIHNpemVvZihmb28pKSIgcGF0dGVybi4KK1dFQlBfRVhURVJOKHZvaWQqKSBXZWJQU2FmZUNhbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOworCisvLyBDb21wYW5pb24gZGVhbGxvY2F0aW9uIGZ1bmN0aW9uIHRvIHRoZSBhYm92ZSBhbGxvY2F0aW9ucy4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBTYWZlRnJlZSh2b2lkKiBjb25zdCBwdHIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxpZ25tZW50CisKKyNkZWZpbmUgV0VCUF9BTElHTl9DU1QgMzEKKyNkZWZpbmUgV0VCUF9BTElHTihQVFIpICgoKHVpbnRwdHJfdCkoUFRSKSArIFdFQlBfQUxJR05fQ1NUKSAmIH5XRUJQX0FMSUdOX0NTVCkKKworI2lmIGRlZmluZWQoV0VCUF9GT1JDRV9BTElHTkVEKQorI2luY2x1ZGUgPHN0cmluZy5oPgorLy8gbWVtY3B5KCkgaXMgdGhlIHNhZmUgd2F5IG9mIG1vdmluZyBwb3RlbnRpYWxseSB1bmFsaWduZWQgMzJiIG1lbW9yeS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBXZWJQTWVtVG9VaW50MzIoY29uc3QgdWludDhfdCogY29uc3QgcHRyKSB7CisgIHVpbnQzMl90IEE7CisgIG1lbWNweSgmQSwgKGNvbnN0IGludCopcHRyLCBzaXplb2YoQSkpOworICByZXR1cm4gQTsKK30KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBVaW50MzJUb01lbSh1aW50OF90KiBjb25zdCBwdHIsIHVpbnQzMl90IHZhbCkgeworICBtZW1jcHkocHRyLCAmdmFsLCBzaXplb2YodmFsKSk7Cit9CisjZWxzZQorc3RhdGljIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGIFdFQlBfSU5MSU5FCit1aW50MzJfdCBXZWJQTWVtVG9VaW50MzIoY29uc3QgdWludDhfdCogY29uc3QgcHRyKSB7CisgIHJldHVybiAqKGNvbnN0IHVpbnQzMl90KilwdHI7Cit9CitzdGF0aWMgV0VCUF9VQlNBTl9JR05PUkVfVU5ERUYgV0VCUF9JTkxJTkUKK3ZvaWQgV2ViUFVpbnQzMlRvTWVtKHVpbnQ4X3QqIGNvbnN0IHB0ciwgdWludDMyX3QgdmFsKSB7CisgICoodWludDMyX3QqKXB0ciA9IHZhbDsKK30KKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVhZGluZy93cml0aW5nIGRhdGEuCisKKy8vIFJlYWQgMTYsIDI0IG9yIDMyIGJpdHMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMTYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gKGludCkoZGF0YVswXSA8PCAwKSB8IChkYXRhWzFdIDw8IDgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMjQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gR2V0TEUxNihkYXRhKSB8IChkYXRhWzJdIDw8IDE2KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldExFMzIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gR2V0TEUxNihkYXRhKSB8ICgodWludDMyX3QpR2V0TEUxNihkYXRhICsgMikgPDwgMTYpOworfQorCisvLyBTdG9yZSAxNiwgMjQgb3IgMzIgYml0cyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUxNih1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgdmFsKSB7CisgIGFzc2VydCh2YWwgPCAoMSA8PCAxNikpOworICBkYXRhWzBdID0gKHZhbCA+PiAwKTsKKyAgZGF0YVsxXSA9ICh2YWwgPj4gOCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMjQodWludDhfdCogY29uc3QgZGF0YSwgaW50IHZhbCkgeworICBhc3NlcnQodmFsIDwgKDEgPDwgMjQpKTsKKyAgUHV0TEUxNihkYXRhLCB2YWwgJiAweGZmZmYpOworICBkYXRhWzJdID0gKHZhbCA+PiAxNik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMzIodWludDhfdCogY29uc3QgZGF0YSwgdWludDMyX3QgdmFsKSB7CisgIFB1dExFMTYoZGF0YSwgKGludCkodmFsICYgMHhmZmZmKSk7CisgIFB1dExFMTYoZGF0YSArIDIsIChpbnQpKHZhbCA+PiAxNikpOworfQorCisvLyBSZXR1cm5zIChpbnQpZmxvb3IobG9nMihuKSkuIG4gbXVzdCBiZSA+IDAuCisvLyB1c2UgR05VIGJ1aWx0aW5zIHdoZXJlIGF2YWlsYWJsZS4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCisgICAgKChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpIHx8IF9fR05VQ19fID49IDQpCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICByZXR1cm4gMzEgXiBfX2J1aWx0aW5fY2x6KG4pOworfQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPiAxMzEwICYmIFwKKyAgICAgIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkKKyNpbmNsdWRlIDxpbnRyaW4uaD4KKyNwcmFnbWEgaW50cmluc2ljKF9CaXRTY2FuUmV2ZXJzZSkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBCaXRzTG9nMkZsb29yKHVpbnQzMl90IG4pIHsKKyAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZXRfYml0OworICBfQml0U2NhblJldmVyc2UoJmZpcnN0X3NldF9iaXQsIG4pOworICByZXR1cm4gZmlyc3Rfc2V0X2JpdDsKK30KKyNlbHNlCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgeworICBpbnQgbG9nID0gMDsKKyAgdWludDMyX3QgdmFsdWUgPSBuOworICBpbnQgaTsKKworICBmb3IgKGkgPSA0OyBpID49IDA7IC0taSkgeworICAgIGNvbnN0IGludCBzaGlmdCA9ICgxIDw8IGkpOworICAgIGNvbnN0IHVpbnQzMl90IHggPSB2YWx1ZSA+PiBzaGlmdDsKKyAgICBpZiAoeCAhPSAwKSB7CisgICAgICB2YWx1ZSA9IHg7CisgICAgICBsb2cgKz0gc2hpZnQ7CisgICAgfQorICB9CisgIHJldHVybiBsb2c7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBpeGVsIGNvcHlpbmcuCisKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gQ29weSB3aWR0aCB4IGhlaWdodCBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyB0aGUgc3RyaWRlcy4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8gQ29weSBBUkdCIHBpeGVscyBmcm9tICdzcmMnIHRvICdkc3QnIGhvbm9yaW5nIHN0cmlkZXMuICdzcmMnIGFuZCAnZHN0JyBhcmUKKy8vIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQgYW5kIHVzaW5nIEFSR0IgZGF0YS4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVW5pcXVlIGNvbG9ycy4KKworLy8gUmV0dXJucyBjb3VudCBvZiB1bmlxdWUgY29sb3JzIGluICdwaWMnLCBhc3N1bWluZyBwaWMtPnVzZV9hcmdiIGlzIHRydWUuCisvLyBJZiB0aGUgdW5pcXVlIGNvbG9yIGNvdW50IGlzIG1vcmUgdGhhbiBNQVhfQ09MT1JfQ09VTlQsIHJldHVybnMKKy8vIE1BWF9DT0xPUl9DT1VOVCsxLgorLy8gSWYgJ3BhbGV0dGUnIGlzIG5vdCBOVUxMIGFuZCBudW1iZXIgb2YgdW5pcXVlIGNvbG9ycyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKy8vIE1BWF9DT0xPUl9DT1VOVCwgYWxzbyBvdXRwdXRzIHRoZSBhY3R1YWwgdW5pcXVlIGNvbG9ycyBpbnRvICdwYWxldHRlJy4KKy8vIE5vdGU6ICdwYWxldHRlJyBpcyBhc3N1bWVkIHRvIGJlIGFuIGFycmF5IGFscmVhZHkgYWxsb2NhdGVkIHdpdGggYXQgbGVhc3QKKy8vIE1BWF9DT0xPUl9DT1VOVCBlbGVtZW50cy4KK1dFQlBfRVhURVJOKGludCkgV2ViUEdldENvbG9yUGFsZXR0ZShjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1VUSUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2RlY29kZS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9kZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWQwNzFlCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9kZWNvZGUuaApAQCAtMCwwICsxLDQ5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBNYWluIGRlY29kaW5nIGZ1bmN0aW9ucyBmb3IgV2ViUCBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX1dFQlBfREVDT0RFX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfV0VCUF9ERUNPREVfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OIDB4MDIwOCAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXNDb2RlOworLy8gdHlwZWRlZiBlbnVtIFdFQlBfQ1NQX01PREUgV0VCUF9DU1BfTU9ERTsKK3R5cGVkZWYgc3RydWN0IFdlYlBSR0JBQnVmZmVyIFdlYlBSR0JBQnVmZmVyOwordHlwZWRlZiBzdHJ1Y3QgV2ViUFlVVkFCdWZmZXIgV2ViUFlVVkFCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBXZWJQRGVjQnVmZmVyIFdlYlBEZWNCdWZmZXI7Cit0eXBlZGVmIHN0cnVjdCBXZWJQSURlY29kZXIgV2ViUElEZWNvZGVyOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIFdlYlBCaXRzdHJlYW1GZWF0dXJlczsKK3R5cGVkZWYgc3RydWN0IFdlYlBEZWNvZGVyT3B0aW9ucyBXZWJQRGVjb2Rlck9wdGlvbnM7Cit0eXBlZGVmIHN0cnVjdCBXZWJQRGVjb2RlckNvbmZpZyBXZWJQRGVjb2RlckNvbmZpZzsKKworLy8gUmV0dXJuIHRoZSBkZWNvZGVyJ3MgdmVyc2lvbiBudW1iZXIsIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZyA4Yml0cyBmb3IKKy8vIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgorV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RGVjb2RlclZlcnNpb24odm9pZCk7CisKKy8vIFJldHJpZXZlIGJhc2ljIGhlYWRlciBpbmZvcm1hdGlvbjogd2lkdGgsIGhlaWdodC4KKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIHZhbGlkYXRlIHRoZSBoZWFkZXIsIHJldHVybmluZyB0cnVlIG9uIHN1Y2Nlc3MsCisvLyBmYWxzZSBvdGhlcndpc2UuICcqd2lkdGgnIGFuZCAnKmhlaWdodCcgYXJlIG9ubHkgdmFsaWQgb24gc3VjY2Vzc2Z1bCByZXR1cm4uCisvLyBQb2ludGVycyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBjYW4gYmUgcGFzc2VkIE5VTEwgaWYgZGVlbWVkIGlycmVsZXZhbnQuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gRGVjb2RlcyBXZWJQIGltYWdlcyBwb2ludGVkIHRvIGJ5ICdkYXRhJyBhbmQgcmV0dXJucyBSR0JBIHNhbXBsZXMsIGFsb25nCisvLyB3aXRoIHRoZSBkaW1lbnNpb25zIGluICp3aWR0aCBhbmQgKmhlaWdodC4gVGhlIG9yZGVyaW5nIG9mIHNhbXBsZXMgaW4KKy8vIG1lbW9yeSBpcyBSLCBHLCBCLCBBLCBSLCBHLCBCLCBBLi4uIGluIHNjYW4gb3JkZXIgKGVuZGlhbi1pbmRlcGVuZGVudCkuCisvLyBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91bGQgYmUgZGVsZXRlZCBjYWxsaW5nIFdlYlBGcmVlKCkuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBBLCBSLCBHLCBCLCBBLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBCLCBHLCBSLCBBLCBCLCBHLCBSLCBBLi4uIG9yZGVyZWQgZGF0YS4KK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBSLCBHLCBCLCBSLCBHLCBCLi4uIG9yZGVyZWQgZGF0YS4KKy8vIElmIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgdHJhbnNwYXJlbmN5LCBpdCBpcyBpZ25vcmVkLgorV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCLCBidXQgcmV0dXJuaW5nIEIsIEcsIFIsIEIsIEcsIFIuLi4gb3JkZXJlZCBkYXRhLgorV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVCR1IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKworCisvLyBEZWNvZGUgV2ViUCBpbWFnZXMgcG9pbnRlZCB0byBieSAnZGF0YScgdG8gWSdVViBmb3JtYXQoKikuIFRoZSBwb2ludGVyCisvLyByZXR1cm5lZCBpcyB0aGUgWSBzYW1wbGVzIGJ1ZmZlci4gVXBvbiByZXR1cm4sICp1IGFuZCAqdiB3aWxsIHBvaW50IHRvCisvLyB0aGUgVSBhbmQgViBjaHJvbWEgZGF0YS4gVGhlc2UgVSBhbmQgViBidWZmZXJzIG5lZWQgTk9UIGJlIHBhc3NlZCB0bworLy8gV2ViUEZyZWUoKSwgdW5saWtlIHRoZSByZXR1cm5lZCBZIGx1bWEgb25lLiBUaGUgZGltZW5zaW9uIG9mIHRoZSBVIGFuZCBWCisvLyBwbGFuZXMgYXJlIGJvdGggKCp3aWR0aCArIDEpIC8gMiBhbmQgKCpoZWlnaHQgKyAxKS8gMi4KKy8vIFVwb24gcmV0dXJuLCB0aGUgWSBidWZmZXIgaGFzIGEgc3RyaWRlIHJldHVybmVkIGFzICcqc3RyaWRlJywgd2hpbGUgVSBhbmQgVgorLy8gaGF2ZSBhIGNvbW1vbiBzdHJpZGUgcmV0dXJuZWQgYXMgJyp1dl9zdHJpZGUnLgorLy8gUmV0dXJuIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4KKy8vICgqKSBBbHNvIG5hbWVkIFknQ2JDci4gU2VlOiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyCitXRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVlVVihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0cmlkZSwgaW50KiB1dl9zdHJpZGUpOworCisvLyBSZWxlYXNlcyBtZW1vcnkgcmV0dXJuZWQgYnkgdGhlIFdlYlBEZWNvZGUqKCkgZnVuY3Rpb25zIGFib3ZlLgorV0VCUF9FWFRFUk4odm9pZCkgV2ViUEZyZWUodm9pZCogcHRyKTsKKworLy8gVGhlc2UgZml2ZSBmdW5jdGlvbnMgYXJlIHZhcmlhbnRzIG9mIHRoZSBhYm92ZSBvbmVzLCB0aGF0IGRlY29kZSB0aGUgaW1hZ2UKKy8vIGRpcmVjdGx5IGludG8gYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciAnb3V0cHV0X2J1ZmZlcicuIFRoZSBtYXhpbXVtIHN0b3JhZ2UKKy8vIGF2YWlsYWJsZSBpbiB0aGlzIGJ1ZmZlciBpcyBpbmRpY2F0ZWQgYnkgJ291dHB1dF9idWZmZXJfc2l6ZScuIElmIHRoaXMKKy8vIHN0b3JhZ2UgaXMgbm90IHN1ZmZpY2llbnQgKG9yIGFuIGVycm9yIG9jY3VycmVkKSwgTlVMTCBpcyByZXR1cm5lZC4KKy8vIE90aGVyd2lzZSwgb3V0cHV0X2J1ZmZlciBpcyByZXR1cm5lZCwgZm9yIGNvbnZlbmllbmNlLgorLy8gVGhlIHBhcmFtZXRlciAnb3V0cHV0X3N0cmlkZScgc3BlY2lmaWVzIHRoZSBkaXN0YW5jZSAoaW4gYnl0ZXMpCisvLyBiZXR3ZWVuIHNjYW5saW5lcy4gSGVuY2UsIG91dHB1dF9idWZmZXJfc2l6ZSBpcyBleHBlY3RlZCB0byBiZSBhdCBsZWFzdAorLy8gb3V0cHV0X3N0cmlkZSB4IHBpY3R1cmUtaGVpZ2h0LgorV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVSR0JBSW50bygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQVJHQkludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CitXRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZUJHUkFJbnRvKAorICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOworCisvLyBSR0IgYW5kIEJHUiB2YXJpYW50cy4gSGVyZSB0b28gdGhlIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiwgaWYgcHJlc2VudCwKKy8vIHdpbGwgYmUgZHJvcHBlZCBhbmQgaWdub3JlZC4KK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCSW50bygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKK1dFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSSW50bygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKKworLy8gV2ViUERlY29kZVlVVkludG8oKSBpcyBhIHZhcmlhbnQgb2YgV2ViUERlY29kZVlVVigpIHRoYXQgb3BlcmF0ZXMgZGlyZWN0bHkKKy8vIGludG8gcHJlLWFsbG9jYXRlZCBsdW1hL2Nocm9tYSBwbGFuZSBidWZmZXJzLiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoZQorLy8gc3RyaWRlcyB0byBiZSBwYXNzZWQ6IG9uZSBmb3IgdGhlIGx1bWEgcGxhbmUgYW5kIG9uZSBmb3IgZWFjaCBvZiB0aGUKKy8vIGNocm9tYSBvbmVzLiBUaGUgc2l6ZSBvZiBlYWNoIHBsYW5lIGJ1ZmZlciBpcyBwYXNzZWQgYXMgJ2x1bWFfc2l6ZScsCisvLyAndV9zaXplJyBhbmQgJ3Zfc2l6ZScgcmVzcGVjdGl2ZWx5LgorLy8gUG9pbnRlciB0byB0aGUgbHVtYSBwbGFuZSAoJypsdW1hJykgaXMgcmV0dXJuZWQgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorLy8gZHVyaW5nIGRlY29kaW5nIChvciBiZWNhdXNlIHNvbWUgYnVmZmVycyB3ZXJlIGZvdW5kIHRvIGJlIHRvbyBzbWFsbCkuCitXRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVlVVkludG8oCisgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCisgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAorICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPdXRwdXQgY29sb3JzcGFjZXMgYW5kIGJ1ZmZlcgorCisvLyBDb2xvcnNwYWNlcworLy8gTm90ZTogdGhlIG5hbWluZyBkZXNjcmliZXMgdGhlIGJ5dGUtb3JkZXJpbmcgb2YgcGFja2VkIHNhbXBsZXMgaW4gbWVtb3J5LgorLy8gRm9yIGluc3RhbmNlLCBNT0RFX0JHUkEgcmVsYXRlcyB0byBzYW1wbGVzIG9yZGVyZWQgYXMgQixHLFIsQSxCLEcsUixBLC4uLgorLy8gTm9uLWNhcGl0YWwgbmFtZXMgKGUuZy46TU9ERV9BcmdiKSByZWxhdGVzIHRvIHByZS1tdWx0aXBsaWVkIFJHQiBjaGFubmVscy4KKy8vIFJHQkEtNDQ0NCBhbmQgUkdCLTU2NSBjb2xvcnNwYWNlcyBhcmUgcmVwcmVzZW50ZWQgYnkgZm9sbG93aW5nIGJ5dGUtb3JkZXI6CisvLyBSR0JBLTQ0NDQ6IFtyMyByMiByMSByMCBnMyBnMiBnMSBnMF0sIFtiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMF0sIC4uLgorLy8gUkdCLTU2NTogW3I0IHIzIHIyIHIxIHIwIGc1IGc0IGczXSwgW2cyIGcxIGcwIGI0IGIzIGIyIGIxIGIwXSwgLi4uCisvLyBJbiB0aGUgY2FzZSBXRUJQX1NXQVBfMTZCSVRTX0NTUCBpcyBkZWZpbmVkLCB0aGUgYnl0ZXMgYXJlIHN3YXBwZWQgZm9yCisvLyB0aGVzZSB0d28gbW9kZXM6CisvLyBSR0JBLTQ0NDQ6IFtiMyBiMiBiMSBiMCBhMyBhMiBhMSBhMF0sIFtyMyByMiByMSByMCBnMyBnMiBnMSBnMF0sIC4uLgorLy8gUkdCLTU2NTogW2cyIGcxIGcwIGI0IGIzIGIyIGIxIGIwXSwgW3I0IHIzIHIyIHIxIHIwIGc1IGc0IGczXSwgLi4uCisKK3R5cGVkZWYgZW51bSBXRUJQX0NTUF9NT0RFIHsKKyAgTU9ERV9SR0IgPSAwLCBNT0RFX1JHQkEgPSAxLAorICBNT0RFX0JHUiA9IDIsIE1PREVfQkdSQSA9IDMsCisgIE1PREVfQVJHQiA9IDQsIE1PREVfUkdCQV80NDQ0ID0gNSwKKyAgTU9ERV9SR0JfNTY1ID0gNiwKKyAgLy8gUkdCLXByZW11bHRpcGxpZWQgdHJhbnNwYXJlbnQgbW9kZXMgKGFscGhhIHZhbHVlIGlzIHByZXNlcnZlZCkKKyAgTU9ERV9yZ2JBID0gNywKKyAgTU9ERV9iZ3JBID0gOCwKKyAgTU9ERV9BcmdiID0gOSwKKyAgTU9ERV9yZ2JBXzQ0NDQgPSAxMCwKKyAgLy8gWVVWIG1vZGVzIG11c3QgY29tZSBhZnRlciBSR0Igb25lcy4KKyAgTU9ERV9ZVVYgPSAxMSwgTU9ERV9ZVVZBID0gMTIsICAvLyB5dXYgNDoyOjAKKyAgTU9ERV9MQVNUID0gMTMKK30gV0VCUF9DU1BfTU9ERTsKKworLy8gU29tZSB1c2VmdWwgbWFjcm9zOgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKKyAgcmV0dXJuIChtb2RlID09IE1PREVfcmdiQSB8fCBtb2RlID09IE1PREVfYmdyQSB8fCBtb2RlID09IE1PREVfQXJnYiB8fAorICAgICAgICAgIG1vZGUgPT0gTU9ERV9yZ2JBXzQ0NDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBJc0FscGhhTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKKyAgcmV0dXJuIChtb2RlID09IE1PREVfUkdCQSB8fCBtb2RlID09IE1PREVfQkdSQSB8fCBtb2RlID09IE1PREVfQVJHQiB8fAorICAgICAgICAgIG1vZGUgPT0gTU9ERV9SR0JBXzQ0NDQgfHwgbW9kZSA9PSBNT0RFX1lVVkEgfHwKKyAgICAgICAgICBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShtb2RlKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUElzUkdCTW9kZShXRUJQX0NTUF9NT0RFIG1vZGUpIHsKKyAgcmV0dXJuIChtb2RlIDwgTU9ERV9ZVVYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUERlY0J1ZmZlcjogR2VuZXJpYyBzdHJ1Y3R1cmUgZm9yIGRlc2NyaWJpbmcgdGhlIG91dHB1dCBzYW1wbGUgYnVmZmVyLgorCitzdHJ1Y3QgV2ViUFJHQkFCdWZmZXIgeyAgICAvLyB2aWV3IGFzIFJHQkEKKyAgdWludDhfdCogcmdiYTsgICAgLy8gcG9pbnRlciB0byBSR0JBIHNhbXBsZXMKKyAgaW50IHN0cmlkZTsgICAgICAgLy8gc3RyaWRlIGluIGJ5dGVzIGZyb20gb25lIHNjYW5saW5lIHRvIHRoZSBuZXh0LgorICBzaXplX3Qgc2l6ZTsgICAgICAvLyB0b3RhbCBzaXplIG9mIHRoZSAqcmdiYSBidWZmZXIuCit9OworCitzdHJ1Y3QgV2ViUFlVVkFCdWZmZXIgeyAgICAgICAgICAgICAgLy8gdmlldyBhcyBZVVZBCisgIHVpbnQ4X3QqIHksICp1LCAqdiwgKmE7ICAgICAvLyBwb2ludGVyIHRvIGx1bWEsIGNocm9tYSBVL1YsIGFscGhhIHNhbXBsZXMKKyAgaW50IHlfc3RyaWRlOyAgICAgICAgICAgICAgIC8vIGx1bWEgc3RyaWRlCisgIGludCB1X3N0cmlkZSwgdl9zdHJpZGU7ICAgICAvLyBjaHJvbWEgc3RyaWRlcworICBpbnQgYV9zdHJpZGU7ICAgICAgICAgICAgICAgLy8gYWxwaGEgc3RyaWRlCisgIHNpemVfdCB5X3NpemU7ICAgICAgICAgICAgICAvLyBsdW1hIHBsYW5lIHNpemUKKyAgc2l6ZV90IHVfc2l6ZSwgdl9zaXplOyAgICAgIC8vIGNocm9tYSBwbGFuZXMgc2l6ZQorICBzaXplX3QgYV9zaXplOyAgICAgICAgICAgICAgLy8gYWxwaGEtcGxhbmUgc2l6ZQorfTsKKworLy8gT3V0cHV0IGJ1ZmZlcgorc3RydWN0IFdlYlBEZWNCdWZmZXIgeworICBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2U7ICAvLyBDb2xvcnNwYWNlLgorICBpbnQgd2lkdGgsIGhlaWdodDsgICAgICAgICAvLyBEaW1lbnNpb25zLgorICBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5OyAgICAvLyBJZiBub24temVybywgJ2ludGVybmFsX21lbW9yeScgcG9pbnRlciBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZC4gSWYgdmFsdWUgaXMgJzInIG9yIG1vcmUsIHRoZSBleHRlcm5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1vcnkgaXMgY29uc2lkZXJlZCAnc2xvdycgYW5kIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQvd3JpdGUgd2lsbCBiZSBhdm9pZGVkLgorICB1bmlvbiB7CisgICAgV2ViUFJHQkFCdWZmZXIgUkdCQTsKKyAgICBXZWJQWVVWQUJ1ZmZlciBZVVZBOworICB9IHU7ICAgICAgICAgICAgICAgICAgICAgICAvLyBOYW1lbGVzcyB1bmlvbiBvZiBidWZmZXIgcGFyYW1ldGVycy4KKyAgdWludDMyX3QgICAgICAgcGFkWzRdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisKKyAgdWludDhfdCogcHJpdmF0ZV9tZW1vcnk7ICAgLy8gSW50ZXJuYWxseSBhbGxvY2F0ZWQgbWVtb3J5IChvbmx5IHdoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXNfZXh0ZXJuYWxfbWVtb3J5IGlzIDApLiBTaG91bGQgbm90IGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWxseSwgYnV0IGFjY2Vzc2VkIHZpYSB0aGUgYnVmZmVyIHVuaW9uLgorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOKGludCkgV2ViUEluaXREZWNCdWZmZXJJbnRlcm5hbChXZWJQRGVjQnVmZmVyKiwgaW50KTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIGFzIGVtcHR5LiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIHVzZS4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBJbml0RGVjQnVmZmVyKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlcikgeworICByZXR1cm4gV2ViUEluaXREZWNCdWZmZXJJbnRlcm5hbChidWZmZXIsIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTik7Cit9CisKKy8vIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlci4gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGxhc3QuCisvLyBOb3RlOiBkb2Vzbid0IGZyZWUgdGhlICdidWZmZXInIHN0cnVjdHVyZSBpdHNlbGYuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW51bWVyYXRpb24gb2YgdGhlIHN0YXR1cyBjb2RlcworCit0eXBlZGVmIGVudW0gVlA4U3RhdHVzQ29kZSB7CisgIFZQOF9TVEFUVVNfT0sgPSAwLAorICBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTSwKKyAgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgIFZQOF9TVEFUVVNfVU5TVVBQT1JURURfRkVBVFVSRSwKKyAgVlA4X1NUQVRVU19TVVNQRU5ERUQsCisgIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwKKyAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEKK30gVlA4U3RhdHVzQ29kZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluY3JlbWVudGFsIGRlY29kaW5nCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIHN0cmVhbWxpbmVkIGRlY29kaW5nIG9mIHBhcnRpYWwgZGF0YS4KKy8vIFBpY3R1cmUgY2FuIGJlIGluY3JlbWVudGFsbHkgZGVjb2RlZCBhcyBkYXRhIGJlY29tZSBhdmFpbGFibGUgdGhhbmtzIHRvIHRoZQorLy8gV2ViUElEZWNvZGVyIG9iamVjdC4gVGhpcyBvYmplY3QgY2FuIGJlIGxlZnQgaW4gYSBTVVNQRU5ERUQgc3RhdGUgaWYgdGhlCisvLyBwaWN0dXJlIGlzIG9ubHkgcGFydGlhbGx5IGRlY29kZWQsIHBlbmRpbmcgYWRkaXRpb25hbCBpbnB1dC4KKy8vIENvZGUgZXhhbXBsZToKKy8vCisvLyAgIFdlYlBJbml0RGVjQnVmZmVyKCZidWZmZXIpOworLy8gICBidWZmZXIuY29sb3JzcGFjZSA9IG1vZGU7CisvLyAgIC4uLgorLy8gICBXZWJQSURlY29kZXIqIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoJmJ1ZmZlcik7CisvLyAgIHdoaWxlIChoYXNfbW9yZV9kYXRhKSB7CisvLyAgICAgLy8gLi4uIChnZXQgYWRkaXRpb25hbCBkYXRhKQorLy8gICAgIHN0YXR1cyA9IFdlYlBJQXBwZW5kKGlkZWMsIG5ld19kYXRhLCBuZXdfZGF0YV9zaXplKTsKKy8vICAgICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfU1VTUEVOREVEIHx8CisvLyAgICAgICBicmVhazsKKy8vICAgICB9CisvLworLy8gICAgIC8vIFRoZSBhYm92ZSBjYWxsIGRlY29kZXMgdGhlIGN1cnJlbnQgYXZhaWxhYmxlIGJ1ZmZlci4KKy8vICAgICAvLyBQYXJ0IG9mIHRoZSBpbWFnZSBjYW4gbm93IGJlIHJlZnJlc2hlZCBieSBjYWxsaW5nIHRvCisvLyAgICAgLy8gV2ViUElEZWNHZXRSR0IoKS9XZWJQSURlY0dldFlVVkEoKSBldGMuCisvLyAgIH0KKy8vICAgV2ViUElEZWxldGUoaWRlYyk7CisKKy8vIENyZWF0ZXMgYSBuZXcgaW5jcmVtZW50YWwgZGVjb2RlciB3aXRoIHRoZSBzdXBwbGllZCBidWZmZXIgcGFyYW1ldGVyLgorLy8gVGhpcyBvdXRwdXRfYnVmZmVyIGNhbiBiZSBwYXNzZWQgTlVMTCwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgb3V0cHV0IGJ1ZmZlcgorLy8gaXMgdXNlZCAod2l0aCBNT0RFX1JHQikuIE90aGVyd2lzZSwgYW4gaW50ZXJuYWwgcmVmZXJlbmNlIHRvICdvdXRwdXRfYnVmZmVyJworLy8gaXMga2VwdCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlmZXNwYW4gb2YgJ291dHB1dF9idWZmZXInIG11c3QgYmUgbGFyZ2VyIHRoYW4KKy8vIHRoYXQgb2YgdGhlIHJldHVybmVkIFdlYlBJRGVjb2RlciBvYmplY3QuCisvLyBUaGUgc3VwcGxpZWQgJ291dHB1dF9idWZmZXInIGNvbnRlbnQgTVVTVCBOT1QgYmUgY2hhbmdlZCBiZXR3ZWVuIGNhbGxzIHRvCisvLyBXZWJQSUFwcGVuZCgpIG9yIFdlYlBJVXBkYXRlKCkgdW5sZXNzICdvdXRwdXRfYnVmZmVyLmlzX2V4dGVybmFsX21lbW9yeScgaXMKKy8vIG5vdCBzZXQgdG8gMC4gSW4gc3VjaCBhIGNhc2UsIGl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBwb2ludGVycywgc2l6ZSBhbmQKKy8vIHN0cmlkZSBvZiBvdXRwdXRfYnVmZmVyLnUuUkdCQSBvciBvdXRwdXRfYnVmZmVyLnUuWVVWQSwgcHJvdmlkZWQgdGhleSByZW1haW4KKy8vIHdpdGhpbiB2YWxpZCBib3VuZHMuCisvLyBBbGwgb3RoZXIgZmllbGRzIG9mIFdlYlBEZWNCdWZmZXIgTVVTVCByZW1haW4gY29uc3RhbnQgYmV0d2VlbiBjYWxscy4KKy8vIFJldHVybnMgTlVMTCBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQuCitXRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogb3V0cHV0X2J1ZmZlcik7CisKKy8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdCwgd2hpY2gKKy8vIHdpbGwgb3V0cHV0IHRoZSBSR0IvQSBzYW1wbGVzIHNwZWNpZmllZCBieSAnY3NwJyBpbnRvIGEgcHJlYWxsb2NhdGVkCisvLyBidWZmZXIgJ291dHB1dF9idWZmZXInLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlciBpcyBhdCBsZWFzdAorLy8gJ291dHB1dF9idWZmZXJfc2l6ZScgYW5kIHRoZSBzdHJpZGUgKGRpc3RhbmNlIGluIGJ5dGVzIGJldHdlZW4gdHdvIHNjYW5saW5lcykKKy8vIGlzIHNwZWNpZmllZCBieSAnb3V0cHV0X3N0cmlkZScuCisvLyBBZGRpdGlvbmFsbHksIG91dHB1dF9idWZmZXIgY2FuIGJlIHBhc3NlZCBOVUxMIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dAorLy8gYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgZGVjb2Rpbmcgc3RhcnRzLiBUaGUKKy8vIGNvbG9yc3BhY2UgJ2NzcCcgaXMgdGFrZW4gaW50byBhY2NvdW50IGZvciBhbGxvY2F0aW5nIHRoaXMgYnVmZmVyLiBBbGwgb3RoZXIKKy8vIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCisvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCBvciBpZiBzb21lIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCitXRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1JHQigKKyAgICBXRUJQX0NTUF9NT0RFIGNzcCwKKyAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7CisKKy8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdCwgd2hpY2gKKy8vIHdpbGwgb3V0cHV0IHRoZSByYXcgbHVtYS9jaHJvbWEgc2FtcGxlcyBpbnRvIGEgcHJlYWxsb2NhdGVkIHBsYW5lcyBpZgorLy8gc3VwcGxpZWQuIFRoZSBsdW1hIHBsYW5lIGlzIHNwZWNpZmllZCBieSBpdHMgcG9pbnRlciAnbHVtYScsIGl0cyBzaXplCisvLyAnbHVtYV9zaXplJyBhbmQgaXRzIHN0cmlkZSAnbHVtYV9zdHJpZGUnLiBTaW1pbGFybHksIHRoZSBjaHJvbWEtdSBwbGFuZQorLy8gaXMgc3BlY2lmaWVkIGJ5IHRoZSAndScsICd1X3NpemUnIGFuZCAndV9zdHJpZGUnIHBhcmFtZXRlcnMsIGFuZCB0aGUgY2hyb21hLXYKKy8vIHBsYW5lIGJ5ICd2JyBhbmQgJ3Zfc2l6ZScuIEFuZCBzYW1lIGZvciB0aGUgYWxwaGEtcGxhbmUuIFRoZSAnYScgcG9pbnRlcgorLy8gY2FuIGJlIHBhc3MgTlVMTCBpbiBjYXNlIG9uZSBpcyBub3QgaW50ZXJlc3RlZCBpbiB0aGUgdHJhbnNwYXJlbmN5IHBsYW5lLgorLy8gQ29udmVyc2VseSwgJ2x1bWEnIGNhbiBiZSBwYXNzZWQgTlVMTCBpZiBubyBwcmVhbGxvY2F0ZWQgcGxhbmVzIGFyZSBzdXBwbGllZC4KKy8vIEluIHRoaXMgY2FzZSwgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZCAodXNpbmcKKy8vIE1PREVfWVVWQSkgd2hlbiBkZWNvZGluZyBzdGFydHMuIEFsbCBwYXJhbWV0ZXJzIGFyZSB0aGVuIGlnbm9yZWQuCisvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIG9yIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCitXRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1lVVkEoCisgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAorICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCisgICAgdWludDhfdCogYSwgc2l6ZV90IGFfc2l6ZSwgaW50IGFfc3RyaWRlKTsKKworLy8gRGVwcmVjYXRlZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSwgd2l0aG91dCB0aGUgYWxwaGEgcGxhbmUuCisvLyBLZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElOZXdZVVYoCisgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAorICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKKyAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUpOworCisvLyBEZWxldGVzIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0IGFuZCBhc3NvY2lhdGVkIG1lbW9yeS4gTXVzdCBhbHdheXMgYmUgY2FsbGVkCisvLyBpZiBXZWJQSU5ld0RlY29kZXIsIFdlYlBJTmV3UkdCIG9yIFdlYlBJTmV3WVVWIHN1Y2NlZWRlZC4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBJRGVsZXRlKFdlYlBJRGVjb2RlciogaWRlYyk7CisKKy8vIENvcGllcyBhbmQgZGVjb2RlcyB0aGUgbmV4dCBhdmFpbGFibGUgZGF0YS4gUmV0dXJucyBWUDhfU1RBVFVTX09LIHdoZW4KKy8vIHRoZSBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgZGVjb2RlZC4gUmV0dXJucyBWUDhfU1RBVFVTX1NVU1BFTkRFRCB3aGVuIG1vcmUKKy8vIGRhdGEgaXMgZXhwZWN0ZWQuIFJldHVybnMgZXJyb3IgaW4gb3RoZXIgY2FzZXMuCitXRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQSUFwcGVuZCgKKyAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvLyBBIHZhcmlhbnQgb2YgdGhlIGFib3ZlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBkYXRhIGJ1ZmZlciBjb250YWlucworLy8gcGFydGlhbCBkYXRhIGZyb20gdGhlIGJlZ2lubmluZy4gSW4gdGhpcyBjYXNlIGRhdGEgYnVmZmVyIGlzIG5vdCBjb3BpZWQKKy8vIHRvIHRoZSBpbnRlcm5hbCBtZW1vcnkuCisvLyBOb3RlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSAnZGF0YScgcG9pbnRlciBjYW4gY2hhbmdlIGJldHdlZW4gY2FsbHMgdG8KKy8vIFdlYlBJVXBkYXRlLCBmb3IgaW5zdGFuY2Ugd2hlbiB0aGUgZGF0YSBidWZmZXIgaXMgcmVzaXplZCB0byBmaXQgbGFyZ2VyIGRhdGEuCitXRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQSVVwZGF0ZSgKKyAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvLyBSZXR1cm5zIHRoZSBSR0IvQSBpbWFnZSBkZWNvZGVkIHNvIGZhci4gUmV0dXJucyBOVUxMIGlmIG91dHB1dCBwYXJhbXMKKy8vIGFyZSBub3QgaW5pdGlhbGl6ZWQgeWV0LiBUaGUgUkdCL0Egb3V0cHV0IHR5cGUgY29ycmVzcG9uZHMgdG8gdGhlIGNvbG9yc3BhY2UKKy8vIHNwZWNpZmllZCBkdXJpbmcgY2FsbCB0byBXZWJQSU5ld0RlY29kZXIoKSBvciBXZWJQSU5ld1JHQigpLgorLy8gKmxhc3RfeSBpcyB0aGUgaW5kZXggb2YgbGFzdCBkZWNvZGVkIHJvdyBpbiByYXN0ZXIgc2NhbiBvcmRlci4gU29tZSBwb2ludGVycworLy8gKCpsYXN0X3ksICp3aWR0aCBldGMuKSBjYW4gYmUgTlVMTCBpZiBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGlzIG5vdAorLy8gbmVlZGVkLgorV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0UkdCKAorICAgIGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCisgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlKTsKKworLy8gU2FtZSBhcyBhYm92ZSBmdW5jdGlvbiB0byBnZXQgYSBZVVZBIGltYWdlLiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGx1bWEKKy8vIHBsYW5lIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gSWYgdGhlcmUgaXMgbm8gYWxwaGEgaW5mb3JtYXRpb24KKy8vIHRoZSBhbHBoYSBwb2ludGVyICcqYScgd2lsbCBiZSByZXR1cm5lZCBOVUxMLgorV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0WVVWQSgKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LAorICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwgdWludDhfdCoqIGEsCisgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSwgaW50KiBhX3N0cmlkZSk7CisKKy8vIERlcHJlY2F0ZWQgYWxwaGEtbGVzcyB2ZXJzaW9uIG9mIFdlYlBJRGVjR2V0WVVWQSgpOiBpdCB3aWxsIGlnbm9yZSB0aGUKKy8vIGFscGhhIGluZm9ybWF0aW9uIChpZiBwcmVzZW50KS4gS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBXZWJQSURlY0dldFlVVigKKyAgICBjb25zdCBXZWJQSURlY29kZXIqIGlkZWMsIGludCogbGFzdF95LCB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCisgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSkgeworICByZXR1cm4gV2ViUElEZWNHZXRZVVZBKGlkZWMsIGxhc3RfeSwgdSwgdiwgTlVMTCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHV2X3N0cmlkZSwgTlVMTCk7Cit9CisKKy8vIEdlbmVyaWMgY2FsbCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzcGxheWFibGUgYXJlYS4KKy8vIElmIG5vbiBOVUxMLCB0aGUgbGVmdC9yaWdodC93aWR0aC9oZWlnaHQgcG9pbnRlcnMgYXJlIGZpbGxlZCB3aXRoIHRoZSB2aXNpYmxlCisvLyByZWN0YW5ndWxhciBhcmVhIHNvIGZhci4KKy8vIFJldHVybnMgTlVMTCBpbiBjYXNlIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyIG9iamVjdCBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlLgorLy8gT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBUaGlzIHN0cnVjdHVyZQorLy8gaXMgcmVhZC1vbmx5LCB0aWVkIHRvIFdlYlBJRGVjb2RlcidzIGxpZmVzcGFuIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgorV0VCUF9FWFRFUk4oY29uc3QgV2ViUERlY0J1ZmZlciopIFdlYlBJRGVjb2RlZEFyZWEoCisgICAgY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZHZhbmNlZCBkZWNvZGluZyBwYXJhbWV0cml6YXRpb24KKy8vCisvLyAgQ29kZSBzYW1wbGUgZm9yIHVzaW5nIHRoZSBhZHZhbmNlZCBkZWNvZGluZyBBUEkKKy8qCisgICAgIC8vIEEpIEluaXQgYSBjb25maWd1cmF0aW9uIG9iamVjdAorICAgICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgICAgIENIUk9NSVVNX0NIRUNLKFdlYlBJbml0RGVjb2RlckNvbmZpZygmY29uZmlnKSk7CisKKyAgICAgLy8gQikgb3B0aW9uYWw6IHJldHJpZXZlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcy4KKyAgICAgQ0hST01JVU1fQ0hFQ0soV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy5pbnB1dCkgPT0gVlA4X1NUQVRVU19PSyk7CisKKyAgICAgLy8gQykgQWRqdXN0ICdjb25maWcnLCBpZiBuZWVkZWQKKyAgICAgY29uZmlnLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOworICAgICBjb25maWcub3V0cHV0LmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7CisgICAgIC8vIGV0Yy4KKworICAgICAvLyBOb3RlIHRoYXQgeW91IGNhbiBhbHNvIG1ha2UgY29uZmlnLm91dHB1dCBwb2ludCB0byBhbiBleHRlcm5hbGx5CisgICAgIC8vIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIsIHByb3ZpZGVkIGl0J3MgYmlnIGVub3VnaCB0byBzdG9yZSB0aGUgZGVjb2RlZAorICAgICAvLyBwaWN0dXJlLiBPdGhlcndpc2UsIGNvbmZpZy5vdXRwdXQgd2lsbCBqdXN0IGJlIHVzZWQgdG8gYWxsb2NhdGUgbWVtb3J5CisgICAgIC8vIGFuZCBzdG9yZSB0aGUgZGVjb2RlZCBwaWN0dXJlLgorCisgICAgIC8vIEQpIERlY29kZSEKKyAgICAgQ0hST01JVU1fQ0hFQ0soV2ViUERlY29kZShkYXRhLCBkYXRhX3NpemUsICZjb25maWcpID09IFZQOF9TVEFUVVNfT0spOworCisgICAgIC8vIEUpIERlY29kZWQgaW1hZ2UgaXMgbm93IGluIGNvbmZpZy5vdXRwdXQgKGFuZCBjb25maWcub3V0cHV0LnUuUkdCQSkKKworICAgICAvLyBGKSBSZWNsYWltIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY29uZmlnJ3Mgb2JqZWN0LiBJdCdzIHNhZmUgdG8gY2FsbAorICAgICAvLyB0aGlzIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcyBleHRlcm5hbCBhbmQgd2Fzbid0IGFsbG9jYXRlZAorICAgICAvLyBieSBXZWJQRGVjb2RlKCkuCisgICAgIFdlYlBGcmVlRGVjQnVmZmVyKCZjb25maWcub3V0cHV0KTsKKyovCisKKy8vIEZlYXR1cmVzIGdhdGhlcmVkIGZyb20gdGhlIGJpdHN0cmVhbQorc3RydWN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyB7CisgIGludCB3aWR0aDsgICAgICAgICAgLy8gV2lkdGggaW4gcGl4ZWxzLCBhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbS4KKyAgaW50IGhlaWdodDsgICAgICAgICAvLyBIZWlnaHQgaW4gcGl4ZWxzLCBhcyByZWFkIGZyb20gdGhlIGJpdHN0cmVhbS4KKyAgaW50IGhhc19hbHBoYTsgICAgICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gY29udGFpbnMgYW4gYWxwaGEgY2hhbm5lbC4KKyAgaW50IGhhc19hbmltYXRpb247ICAvLyBUcnVlIGlmIHRoZSBiaXRzdHJlYW0gaXMgYW4gYW5pbWF0aW9uLgorICBpbnQgZm9ybWF0OyAgICAgICAgIC8vIDAgPSB1bmRlZmluZWQgKC9taXhlZCksIDEgPSBsb3NzeSwgMiA9IGxvc3NsZXNzCisKKyAgdWludDMyX3QgcGFkWzVdOyAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQR2V0RmVhdHVyZXNJbnRlcm5hbCgKKyAgICBjb25zdCB1aW50OF90Kiwgc2l6ZV90LCBXZWJQQml0c3RyZWFtRmVhdHVyZXMqLCBpbnQpOworCisvLyBSZXRyaWV2ZSBmZWF0dXJlcyBmcm9tIHRoZSBiaXRzdHJlYW0uIFRoZSAqZmVhdHVyZXMgc3RydWN0dXJlIGlzIGZpbGxlZAorLy8gd2l0aCBpbmZvcm1hdGlvbiBnYXRoZXJlZCBmcm9tIHRoZSBiaXRzdHJlYW0uCisvLyBSZXR1cm5zIFZQOF9TVEFUVVNfT0sgd2hlbiB0aGUgZmVhdHVyZXMgYXJlIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuIFJldHVybnMKKy8vIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBIHdoZW4gbW9yZSBkYXRhIGlzIG5lZWRlZCB0byByZXRyaWV2ZSB0aGUKKy8vIGZlYXR1cmVzIGZyb20gaGVhZGVycy4gUmV0dXJucyBlcnJvciBpbiBvdGhlciBjYXNlcy4KK3N0YXRpYyBXRUJQX0lOTElORSBWUDhTdGF0dXNDb2RlIFdlYlBHZXRGZWF0dXJlcygKKyAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogZmVhdHVyZXMpIHsKKyAgcmV0dXJuIFdlYlBHZXRGZWF0dXJlc0ludGVybmFsKGRhdGEsIGRhdGFfc2l6ZSwgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pOworfQorCisvLyBEZWNvZGluZyBvcHRpb25zCitzdHJ1Y3QgV2ViUERlY29kZXJPcHRpb25zIHsKKyAgaW50IGJ5cGFzc19maWx0ZXJpbmc7ICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgc2tpcCB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcKKyAgaW50IG5vX2ZhbmN5X3Vwc2FtcGxpbmc7ICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgdXNlIGZhc3RlciBwb2ludHdpc2UgdXBzYW1wbGVyCisgIGludCB1c2VfY3JvcHBpbmc7ICAgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIGNyb3BwaW5nIGlzIGFwcGxpZWQgX2ZpcnN0XworICBpbnQgY3JvcF9sZWZ0LCBjcm9wX3RvcDsgICAgICAgICAgICAvLyB0b3AtbGVmdCBwb3NpdGlvbiBmb3IgY3JvcHBpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgYmUgc25hcHBlZCB0byBldmVuIHZhbHVlcy4KKyAgaW50IGNyb3Bfd2lkdGgsIGNyb3BfaGVpZ2h0OyAgICAgICAgLy8gZGltZW5zaW9uIG9mIHRoZSBjcm9wcGluZyBhcmVhCisgIGludCB1c2Vfc2NhbGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIHNjYWxpbmcgaXMgYXBwbGllZCBfYWZ0ZXJ3YXJkXworICBpbnQgc2NhbGVkX3dpZHRoLCBzY2FsZWRfaGVpZ2h0OyAgICAvLyBmaW5hbCByZXNvbHV0aW9uCisgIGludCB1c2VfdGhyZWFkczsgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIHVzZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZworICBpbnQgZGl0aGVyaW5nX3N0cmVuZ3RoOyAgICAgICAgICAgICAvLyBkaXRoZXJpbmcgc3RyZW5ndGggKDA9T2ZmLCAxMDA9ZnVsbCkKKyAgaW50IGZsaXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpcCBvdXRwdXQgdmVydGljYWxseQorICBpbnQgYWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoOyAgICAgICAvLyBhbHBoYSBkaXRoZXJpbmcgc3RyZW5ndGggaW4gWzAuLjEwMF0KKworICB1aW50MzJfdCBwYWRbNV07ICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIE1haW4gb2JqZWN0IHN0b3JpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFkdmFuY2VkIGRlY29kaW5nLgorc3RydWN0IFdlYlBEZWNvZGVyQ29uZmlnIHsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGlucHV0OyAgLy8gSW1tdXRhYmxlIGJpdHN0cmVhbSBmZWF0dXJlcyAob3B0aW9uYWwpCisgIFdlYlBEZWNCdWZmZXIgb3V0cHV0OyAgICAgICAgIC8vIE91dHB1dCBidWZmZXIgKGNhbiBwb2ludCB0byBleHRlcm5hbCBtZW0pCisgIFdlYlBEZWNvZGVyT3B0aW9ucyBvcHRpb25zOyAgIC8vIERlY29kaW5nIG9wdGlvbnMKK307CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTihpbnQpIFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKFdlYlBEZWNvZGVyQ29uZmlnKiwgaW50KTsKKworLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhcyBlbXB0eS4gVGhpcyBmdW5jdGlvbiBtdXN0IGFsd2F5cyBiZQorLy8gY2FsbGVkIGZpcnN0LCB1bmxlc3MgV2ViUEdldEZlYXR1cmVzKCkgaXMgdG8gYmUgY2FsbGVkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1pc21hdGNoZWQgdmVyc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUEluaXREZWNvZGVyQ29uZmlnKFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpIHsKKyAgcmV0dXJuIFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKGNvbmZpZywgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8gSW5zdGFudGlhdGUgYSBuZXcgaW5jcmVtZW50YWwgZGVjb2RlciBvYmplY3Qgd2l0aCB0aGUgcmVxdWVzdGVkCisvLyBjb25maWd1cmF0aW9uLiBUaGUgYml0c3RyZWFtIGNhbiBiZSBwYXNzZWQgdXNpbmcgJ2RhdGEnIGFuZCAnZGF0YV9zaXplJworLy8gcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIHRoZSBmZWF0dXJlcyB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkIGludG8KKy8vIGNvbmZpZy0+aW5wdXQuIE90aGVyd2lzZSwgJ2RhdGEnIGNhbiBiZSBOVUxMIGFuZCBubyBwYXJzaW5nIHdpbGwgb2NjdXIuCisvLyBOb3RlIHRoYXQgJ2NvbmZpZycgY2FuIGJlIE5VTEwgdG9vLCBpbiB3aGljaCBjYXNlIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uCisvLyBpcyB1c2VkLiBJZiAnY29uZmlnJyBpcyBub3QgTlVMTCwgaXQgbXVzdCBvdXRsaXZlIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0CisvLyBhcyBzb21lIHJlZmVyZW5jZXMgdG8gaXRzIGZpZWxkcyB3aWxsIGJlIHVzZWQuIE5vIGludGVybmFsIGNvcHkgb2YgJ2NvbmZpZycKKy8vIGlzIG1hZGUuCisvLyBUaGUgcmV0dXJuIFdlYlBJRGVjb2RlciBvYmplY3QgbXVzdCBhbHdheXMgYmUgZGVsZXRlZCBjYWxsaW5nIFdlYlBJRGVsZXRlKCkuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAoYW5kIGNvbmZpZy0+c3RhdHVzIHdpbGwgdGhlbiByZWZsZWN0CisvLyB0aGUgZXJyb3IgY29uZGl0aW9uLCBpZiBhdmFpbGFibGUpLgorV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOworCisvLyBOb24taW5jcmVtZW50YWwgdmVyc2lvbi4gVGhpcyB2ZXJzaW9uIGRlY29kZXMgdGhlIGZ1bGwgZGF0YSBhdCBvbmNlLCB0YWtpbmcKKy8vICdjb25maWcnIGludG8gYWNjb3VudC4gUmV0dXJucyBkZWNvZGluZyBzdGF0dXMgKHdoaWNoIHNob3VsZCBiZSBWUDhfU1RBVFVTX09LCisvLyBpZiB0aGUgZGVjb2Rpbmcgd2FzIHN1Y2Nlc3NmdWwpLiBOb3RlIHRoYXQgJ2NvbmZpZycgY2Fubm90IGJlIE5VTEwuCitXRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9XRUJQX0RFQ09ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9kZW11eC5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWExMTMKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2RlbXV4LmgKQEAgLTAsMCArMSwzNTggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBEZW11eCBBUEkuCisvLyBFbmFibGVzIGV4dHJhY3Rpb24gb2YgaW1hZ2UgYW5kIGV4dGVuZGVkIGZvcm1hdCBkYXRhIGZyb20gV2ViUCBmaWxlcy4KKworLy8gQ29kZSBFeGFtcGxlOiBEZW11eGluZyBXZWJQIGRhdGEgdG8gZXh0cmFjdCBhbGwgdGhlIGZyYW1lcywgSUNDIHByb2ZpbGUKKy8vIGFuZCBFWElGL1hNUCBtZXRhZGF0YS4KKy8qCisgIFdlYlBEZW11eGVyKiBkZW11eCA9IFdlYlBEZW11eCgmd2VicF9kYXRhKTsKKworICB1aW50MzJfdCB3aWR0aCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX1dJRFRIKTsKKyAgdWludDMyX3QgaGVpZ2h0ID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfSEVJR0hUKTsKKyAgLy8gLi4uIChHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZlYXR1cmVzIHByZXNlbnQgaW4gdGhlIFdlYlAgZmlsZSkuCisgIHVpbnQzMl90IGZsYWdzID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpOworCisgIC8vIC4uLiAoSXRlcmF0ZSBvdmVyIGFsbCBmcmFtZXMpLgorICBXZWJQSXRlcmF0b3IgaXRlcjsKKyAgaWYgKFdlYlBEZW11eEdldEZyYW1lKGRlbXV4LCAxLCAmaXRlcikpIHsKKyAgICBkbyB7CisgICAgICAvLyAuLi4gKENvbnN1bWUgJ2l0ZXInOyBlLmcuIERlY29kZSAnaXRlci5mcmFnbWVudCcgd2l0aCBXZWJQRGVjb2RlKCksCisgICAgICAvLyAuLi4gYW5kIGdldCBvdGhlciBmcmFtZSBwcm9wZXJ0aWVzIGxpa2Ugd2lkdGgsIGhlaWdodCwgb2Zmc2V0cyBldGMuCisgICAgICAvLyAuLi4gc2VlICdzdHJ1Y3QgV2ViUEl0ZXJhdG9yJyBiZWxvdyBmb3IgbW9yZSBpbmZvKS4KKyAgICB9IHdoaWxlIChXZWJQRGVtdXhOZXh0RnJhbWUoJml0ZXIpKTsKKyAgICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJml0ZXIpOworICB9CisKKyAgLy8gLi4uIChFeHRyYWN0IG1ldGFkYXRhKS4KKyAgV2ViUENodW5rSXRlcmF0b3IgY2h1bmtfaXRlcjsKKyAgaWYgKGZsYWdzICYgSUNDUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIklDQ1AiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgSUNDIHByb2ZpbGUgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBpZiAoZmxhZ3MgJiBFWElGX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiRVhJRiIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBFWElGIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgaWYgKGZsYWdzICYgWE1QX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiWE1QICIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBYTVAgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBXZWJQRGVtdXhEZWxldGUoZGVtdXgpOworKi8KKworI2lmbmRlZiBXRUJQX1dFQlBfREVNVVhfSF8KKyNkZWZpbmUgV0VCUF9XRUJQX0RFTVVYX0hfCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZGVjb2RlLmgiICAgICAvLyBmb3IgV0VCUF9DU1BfTU9ERQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9tdXhfdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04gMHgwMTA3ICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAorLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KKy8vIHR5cGVkZWYgZW51bSBXZWJQRGVtdXhTdGF0ZSBXZWJQRGVtdXhTdGF0ZTsKKy8vIHR5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSBXZWJQRm9ybWF0RmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IFdlYlBEZW11eGVyIFdlYlBEZW11eGVyOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEl0ZXJhdG9yIFdlYlBJdGVyYXRvcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIFdlYlBDaHVua0l0ZXJhdG9yOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1JbmZvIFdlYlBBbmltSW5mbzsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltRGVjb2Rlck9wdGlvbnMgV2ViUEFuaW1EZWNvZGVyT3B0aW9uczsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZworLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgorV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RGVtdXhWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIERlbXV4IG9iamVjdAorCit0eXBlZGVmIGVudW0gV2ViUERlbXV4U3RhdGUgeworICBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SICAgID0gLTEsICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwYXJzaW5nLgorICBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSID0gIDAsICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2UgZnVsbCBoZWFkZXIuCisgIFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUiAgPSAgMSwgIC8vIEhlYWRlciBwYXJzaW5nIGNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUuCisgIFdFQlBfREVNVVhfRE9ORSAgICAgICAgICAgPSAgMiAgIC8vIEVudGlyZSBmaWxlIGhhcyBiZWVuIHBhcnNlZC4KK30gV2ViUERlbXV4U3RhdGU7CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTihXZWJQRGVtdXhlciopIFdlYlBEZW11eEludGVybmFsKAorICAgIGNvbnN0IFdlYlBEYXRhKiwgaW50LCBXZWJQRGVtdXhTdGF0ZSosIGludCk7CisKKy8vIFBhcnNlcyB0aGUgZnVsbCBXZWJQIGZpbGUgZ2l2ZW4gYnkgJ2RhdGEnLiBGb3Igc2luZ2xlIGltYWdlcyB0aGUgV2ViUCBmaWxlCisvLyBoZWFkZXIgYWxvbmUgb3IgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgY2h1bmsgaGVhZGVyIG1heSBiZSBhYnNlbnQuCisvLyBSZXR1cm5zIGEgV2ViUERlbXV4ZXIgb2JqZWN0IG9uIHN1Y2Nlc3NmdWwgcGFyc2UsIE5VTEwgb3RoZXJ3aXNlLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBEZW11eGVyKiBXZWJQRGVtdXgoY29uc3QgV2ViUERhdGEqIGRhdGEpIHsKKyAgcmV0dXJuIFdlYlBEZW11eEludGVybmFsKGRhdGEsIDAsIE5VTEwsIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBQYXJzZXMgdGhlIHBvc3NpYmx5IGluY29tcGxldGUgV2ViUCBmaWxlIGdpdmVuIGJ5ICdkYXRhJy4KKy8vIElmICdzdGF0ZScgaXMgbm9uLU5VTEwgaXQgd2lsbCBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZGVtdXhlci4KKy8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yIG9yIGlmIHRoZXJlIGlzbid0IGVub3VnaCBkYXRhIHRvIHN0YXJ0IHBhcnNpbmc7CisvLyBhbmQgYSBXZWJQRGVtdXhlciBvYmplY3Qgb24gc3VjY2Vzc2Z1bCBwYXJzZS4KKy8vIE5vdGUgdGhhdCBXZWJQRGVtdXhlciBrZWVwcyBpbnRlcm5hbCBwb2ludGVycyB0byAnZGF0YScgbWVtb3J5IHNlZ21lbnQuCisvLyBJZiB0aGlzIGRhdGEgaXMgdm9sYXRpbGUsIHRoZSBkZW11eGVyIG9iamVjdCBzaG91bGQgYmUgZGVsZXRlZCAoYnkgY2FsbGluZworLy8gV2ViUERlbXV4RGVsZXRlKCkpIGFuZCBXZWJQRGVtdXhQYXJ0aWFsKCkgY2FsbGVkIGFnYWluIG9uIHRoZSBuZXcgZGF0YS4KKy8vIFRoaXMgaXMgdXN1YWxseSBhbiBpbmV4cGVuc2l2ZSBvcGVyYXRpb24uCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUERlbXV4ZXIqIFdlYlBEZW11eFBhcnRpYWwoCisgICAgY29uc3QgV2ViUERhdGEqIGRhdGEsIFdlYlBEZW11eFN0YXRlKiBzdGF0ZSkgeworICByZXR1cm4gV2ViUERlbXV4SW50ZXJuYWwoZGF0YSwgMSwgc3RhdGUsIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBGcmVlcyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdkbXV4Jy4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBEZW11eERlbGV0ZShXZWJQRGVtdXhlciogZG11eCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEYXRhL2luZm9ybWF0aW9uIGV4dHJhY3Rpb24uCisKK3R5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSB7CisgIFdFQlBfRkZfRk9STUFUX0ZMQUdTLCAgLy8gRXh0ZW5kZWQgZm9ybWF0IGZsYWdzIHByZXNlbnQgaW4gdGhlICdWUDhYJyBjaHVuay4KKyAgV0VCUF9GRl9DQU5WQVNfV0lEVEgsCisgIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCwKKyAgV0VCUF9GRl9MT09QX0NPVU5ULAorICBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IsCisgIFdFQlBfRkZfRlJBTUVfQ09VTlQgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwcmVzZW50IGluIHRoZSBkZW11eCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIHBhcnRpYWwgZGVtdXgsIHRoaXMgaXMgdGhlIG51bWJlciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBzZWVuIHNvIGZhciwgd2l0aCB0aGUgbGFzdCBmcmFtZSBwb3NzaWJseQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIHBhcnRpYWwuCit9IFdlYlBGb3JtYXRGZWF0dXJlOworCisvLyBHZXQgdGhlICdmZWF0dXJlJyB2YWx1ZSBmcm9tIHRoZSAnZG11eCcuCisvLyBOT1RFOiB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgaWYgV2ViUERlbXV4KCkgd2FzIHVzZWQgb3IgV2ViUERlbXV4UGFydGlhbCgpCisvLyByZXR1cm5lZCBhIHN0YXRlID4gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUi4KK1dFQlBfRVhURVJOKHVpbnQzMl90KSBXZWJQRGVtdXhHZXRJKAorICAgIGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBXZWJQRm9ybWF0RmVhdHVyZSBmZWF0dXJlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZyYW1lIGl0ZXJhdGlvbi4KKworc3RydWN0IFdlYlBJdGVyYXRvciB7CisgIGludCBmcmFtZV9udW07CisgIGludCBudW1fZnJhbWVzOyAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFdFQlBfRkZfRlJBTUVfQ09VTlQuCisgIGludCB4X29mZnNldCwgeV9vZmZzZXQ7ICAvLyBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy4KKyAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgIC8vIGRpbWVuc2lvbnMgb2YgdGhpcyBmcmFtZS4KKyAgaW50IGR1cmF0aW9uOyAgICAgICAgICAgIC8vIGRpc3BsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2Q7ICAvLyBkaXNwb3NlIG1ldGhvZCBmb3IgdGhlIGZyYW1lLgorICBpbnQgY29tcGxldGU7ICAgLy8gdHJ1ZSBpZiAnZnJhZ21lbnQnIGNvbnRhaW5zIGEgZnVsbCBmcmFtZS4gcGFydGlhbCBpbWFnZXMKKyAgICAgICAgICAgICAgICAgIC8vIG1heSBzdGlsbCBiZSBkZWNvZGVkIHdpdGggdGhlIFdlYlAgaW5jcmVtZW50YWwgZGVjb2Rlci4KKyAgV2ViUERhdGEgZnJhZ21lbnQ7ICAvLyBUaGUgZnJhbWUgZ2l2ZW4gYnkgJ2ZyYW1lX251bScuIE5vdGUgZm9yIGhpc3RvcmljYWwKKyAgICAgICAgICAgICAgICAgICAgICAvLyByZWFzb25zIHRoaXMgaXMgY2FsbGVkIGEgZnJhZ21lbnQuCisgIGludCBoYXNfYWxwaGE7ICAgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhbWUgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorICBXZWJQTXV4QW5pbUJsZW5kIGJsZW5kX21ldGhvZDsgIC8vIEJsZW5kIG9wZXJhdGlvbiBmb3IgdGhlIGZyYW1lLgorCisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UuCisgIHZvaWQqIHByaXZhdGVfOyAgICAgICAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCit9OworCisvLyBSZXRyaWV2ZXMgZnJhbWUgJ2ZyYW1lX251bWJlcicgZnJvbSAnZG11eCcuCisvLyAnaXRlci0+ZnJhZ21lbnQnIHBvaW50cyB0byB0aGUgZnJhbWUgb24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKy8vIFNldHRpbmcgJ2ZyYW1lX251bWJlcicgZXF1YWwgdG8gMCB3aWxsIHJldHVybiB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgaW1hZ2UuCisvLyBSZXR1cm5zIGZhbHNlIGlmICdkbXV4JyBpcyBOVUxMIG9yIGZyYW1lICdmcmFtZV9udW1iZXInIGlzIG5vdCBwcmVzZW50LgorLy8gQ2FsbCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCisvLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgJ2l0ZXInLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhHZXRGcmFtZSgKKyAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lX251bWJlciwgV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+ZnJhbWVfbnVtJyArIDEpIG9yCisvLyBwcmV2aW91cyAoJ2l0ZXItPmZyYW1lX251bScgLSAxKSBmcmFtZS4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOKGludCkgV2ViUERlbXV4TmV4dEZyYW1lKFdlYlBJdGVyYXRvciogaXRlcik7CitXRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eFByZXZGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOworCisvLyBSZWxlYXNlcyBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnaXRlcicuCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gV2ViUERlbXV4R2V0Q2h1bmsoKSBvbiB0aGUgc2FtZQorLy8gaXRlci4gQWxzbywgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAorLy8gV2ViUERlbXV4RGVsZXRlKCkuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGl0ZXJhdGlvbi4KKworc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIHsKKyAgLy8gVGhlIGN1cnJlbnQgYW5kIHRvdGFsIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZm91cmNjIGdpdmVuIHRvCisgIC8vIFdlYlBEZW11eEdldENodW5rKCkuCisgIGludCBjaHVua19udW07CisgIGludCBudW1fY2h1bmtzOworICBXZWJQRGF0YSBjaHVuazsgICAgLy8gVGhlIHBheWxvYWQgb2YgdGhlIGNodW5rLgorCisgIHVpbnQzMl90IHBhZFs2XTsgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdm9pZCogcHJpdmF0ZV87Cit9OworCisvLyBSZXRyaWV2ZXMgdGhlICdjaHVua19udW1iZXInIGluc3RhbmNlIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGZyb20KKy8vICdkbXV4Jy4KKy8vICdmb3VyY2MnIGlzIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bmsgdG8gcmV0dXJuLAorLy8gZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiwgZXRjLgorLy8gU2V0dGluZyAnY2h1bmtfbnVtYmVyJyBlcXVhbCB0byAwIHdpbGwgcmV0dXJuIHRoZSBsYXN0IGNodW5rIGluIGEgc2V0LgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaHVuayBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLiBJbWFnZSByZWxhdGVkIGNodW5rCisvLyBwYXlsb2FkcyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBXZWJQRGVtdXhHZXRGcmFtZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKy8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCisvLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGl0ZXJhdG9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhHZXRDaHVuayhjb25zdCBXZWJQRGVtdXhlciogZG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmb3VyY2NbNF0sIGludCBjaHVua19udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8gU2V0cyAnaXRlci0+Y2h1bmsnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+Y2h1bmtfbnVtJyArIDEpIG9yIHByZXZpb3VzCisvLyAoJ2l0ZXItPmNodW5rX251bScgLSAxKSBjaHVuay4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KK1dFQlBfRVhURVJOKGludCkgV2ViUERlbXV4TmV4dENodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKK1dFQlBfRVhURVJOKGludCkgV2ViUERlbXV4UHJldkNodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgorLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAorLy8gV2ViUERlbXV4RGVsZXRlKCkuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcihXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQQW5pbURlY29kZXIgQVBJCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIGRlY29kaW5nIChwb3NzaWJseSkgYW5pbWF0ZWQgV2ViUCBpbWFnZXMuCisvLworLy8gQ29kZSBFeGFtcGxlOgorLyoKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyBkZWNfb3B0aW9uczsKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXQoJmRlY19vcHRpb25zKTsKKyAgLy8gVHVuZSAnZGVjX29wdGlvbnMnIGFzIG5lZWRlZC4KKyAgV2ViUEFuaW1EZWNvZGVyKiBkZWMgPSBXZWJQQW5pbURlY29kZXJOZXcod2VicF9kYXRhLCAmZGVjX29wdGlvbnMpOworICBXZWJQQW5pbUluZm8gYW5pbV9pbmZvOworICBXZWJQQW5pbURlY29kZXJHZXRJbmZvKGRlYywgJmFuaW1faW5mbyk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhbmltX2luZm8ubG9vcF9jb3VudDsgKytpKSB7CisgICAgd2hpbGUgKFdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoZGVjKSkgeworICAgICAgdWludDhfdCogYnVmOworICAgICAgaW50IHRpbWVzdGFtcDsKKyAgICAgIFdlYlBBbmltRGVjb2RlckdldE5leHQoZGVjLCAmYnVmLCAmdGltZXN0YW1wKTsKKyAgICAgIC8vIC4uLiAoUmVuZGVyICdidWYnIGJhc2VkIG9uICd0aW1lc3RhbXAnKS4KKyAgICAgIC8vIC4uLiAoRG8gTk9UIGZyZWUgJ2J1ZicsIGFzIGl0IGlzIG93bmVkIGJ5ICdkZWMnKS4KKyAgICB9CisgICAgV2ViUEFuaW1EZWNvZGVyUmVzZXQoZGVjKTsKKyAgfQorICBjb25zdCBXZWJQRGVtdXhlciogZGVtdXhlciA9IFdlYlBBbmltRGVjb2RlckdldERlbXV4ZXIoZGVjKTsKKyAgLy8gLi4uIChEbyBzb21ldGhpbmcgdXNpbmcgJ2RlbXV4ZXInOyBlLmcuIGdldCBFWElGL1hNUC9JQ0MgZGF0YSkuCisgIFdlYlBBbmltRGVjb2RlckRlbGV0ZShkZWMpOworKi8KKwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyIFdlYlBBbmltRGVjb2RlcjsgIC8vIE1haW4gb3BhcXVlIG9iamVjdC4KKworLy8gR2xvYmFsIG9wdGlvbnMuCitzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyB7CisgIC8vIE91dHB1dCBjb2xvcnNwYWNlLiBPbmx5IHRoZSBmb2xsb3dpbmcgbW9kZXMgYXJlIHN1cHBvcnRlZDoKKyAgLy8gTU9ERV9SR0JBLCBNT0RFX0JHUkEsIE1PREVfcmdiQSBhbmQgTU9ERV9iZ3JBLgorICBXRUJQX0NTUF9NT0RFIGNvbG9yX21vZGU7CisgIGludCB1c2VfdGhyZWFkczsgICAgICAgICAgIC8vIElmIHRydWUsIHVzZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZy4KKyAgdWludDMyX3QgcGFkZGluZ1s3XTsgICAgICAgLy8gUGFkZGluZyBmb3IgbGF0ZXIgdXNlLgorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBBbmltRGVjb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoCisgICAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyosIGludCk7CisKKy8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIGEgZnJlc2ggV2ViUEFuaW1EZWNvZGVyT3B0aW9ucworLy8gc3RydWN0dXJlIGJlZm9yZSBtb2RpZmljYXRpb24uIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoLgorLy8gV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXQoKSBtdXN0IGhhdmUgc3VjY2VlZGVkIGJlZm9yZSB1c2luZyB0aGUKKy8vICdkZWNfb3B0aW9ucycgb2JqZWN0Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdCgKKyAgICBXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucykgeworICByZXR1cm4gV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbChkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50LgorV0VCUF9FWFRFUk4oV2ViUEFuaW1EZWNvZGVyKikgV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqLCBjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBXZWJQQW5pbURlY29kZXIgb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgd2VicF9kYXRhIC0gKGluKSBXZWJQIGJpdHN0cmVhbS4gVGhpcyBzaG91bGQgcmVtYWluIHVuY2hhbmdlZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgbGlmZXRpbWUgb2YgdGhlIG91dHB1dCBXZWJQQW5pbURlY29kZXIgb2JqZWN0LgorLy8gICBkZWNfb3B0aW9ucyAtIChpbikgZGVjb2Rpbmcgb3B0aW9ucy4gQ2FuIGJlIHBhc3NlZCBOVUxMIHRvIGNob29zZQorLy8gICAgICAgICAgICAgICAgICAgICAgcmVhc29uYWJsZSBkZWZhdWx0cyAoaW4gcGFydGljdWxhciwgY29sb3IgbW9kZSBNT0RFX1JHQkEKKy8vICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGlja2VkKS4KKy8vIFJldHVybnM6CisvLyAgIEEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBXZWJQQW5pbURlY29kZXIgb2JqZWN0LCBvciBOVUxMIGluIGNhc2Ugb2YKKy8vICAgcGFyc2luZyBlcnJvciwgaW52YWxpZCBvcHRpb24gb3IgbWVtb3J5IGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBBbmltRGVjb2RlciogV2ViUEFuaW1EZWNvZGVyTmV3KAorICAgIGNvbnN0IFdlYlBEYXRhKiB3ZWJwX2RhdGEsIGNvbnN0IFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGRlY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbURlY29kZXJOZXdJbnRlcm5hbCh3ZWJwX2RhdGEsIGRlY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIEdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYW5pbWF0aW9uLi4KK3N0cnVjdCBXZWJQQW5pbUluZm8geworICB1aW50MzJfdCBjYW52YXNfd2lkdGg7CisgIHVpbnQzMl90IGNhbnZhc19oZWlnaHQ7CisgIHVpbnQzMl90IGxvb3BfY291bnQ7CisgIHVpbnQzMl90IGJnY29sb3I7CisgIHVpbnQzMl90IGZyYW1lX2NvdW50OworICB1aW50MzJfdCBwYWRbNF07ICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCit9OworCisvLyBHZXQgZ2xvYmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbmltYXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20uCisvLyAgIGluZm8gLSAob3V0KSBnbG9iYWwgaW5mb3JtYXRpb24gZmV0Y2hlZCBmcm9tIHRoZSBhbmltYXRpb24uCisvLyBSZXR1cm5zOgorLy8gICBUcnVlIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBBbmltRGVjb2RlckdldEluZm8oY29uc3QgV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEFuaW1JbmZvKiBpbmZvKTsKKworLy8gRmV0Y2ggdGhlIG5leHQgZnJhbWUgZnJvbSAnZGVjJyBiYXNlZCBvbiBvcHRpb25zIHN1cHBsaWVkIHRvCisvLyBXZWJQQW5pbURlY29kZXJOZXcoKS4gVGhpcyB3aWxsIGJlIGEgZnVsbHkgcmVjb25zdHJ1Y3RlZCBjYW52YXMgb2Ygc2l6ZQorLy8gJ2NhbnZhc193aWR0aCAqIDQgKiBjYW52YXNfaGVpZ2h0JywgYW5kIG5vdCBqdXN0IHRoZSBmcmFtZSBzdWItcmVjdGFuZ2xlLiBUaGUKKy8vIHJldHVybmVkIGJ1ZmZlciAnYnVmJyBpcyB2YWxpZCBvbmx5IHVudGlsIHRoZSBuZXh0IGNhbGwgdG8KKy8vIFdlYlBBbmltRGVjb2RlckdldE5leHQoKSwgV2ViUEFuaW1EZWNvZGVyUmVzZXQoKSBvciBXZWJQQW5pbURlY29kZXJEZWxldGUoKS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGRlYyAtIChpbi9vdXQpIGRlY29kZXIgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgbmV4dCBmcmFtZSBpcyB0byBiZSBmZXRjaGVkLgorLy8gICBidWYgLSAob3V0KSBkZWNvZGVkIGZyYW1lLgorLy8gICB0aW1lc3RhbXAgLSAob3V0KSB0aW1lc3RhbXAgb2YgdGhlIGZyYW1lIGluIG1pbGxpc2Vjb25kcy4KKy8vIFJldHVybnM6CisvLyAgIEZhbHNlIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGFyZSBOVUxMLCBvciBpZiB0aGVyZSBpcyBhIHBhcnNpbmcgb3IKKy8vICAgZGVjb2RpbmcgZXJyb3IsIG9yIGlmIHRoZXJlIGFyZSBubyBtb3JlIGZyYW1lcy4gT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBBbmltRGVjb2RlckdldE5leHQoV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGJ1ZiwgaW50KiB0aW1lc3RhbXApOworCisvLyBDaGVjayBpZiB0aGVyZSBhcmUgbW9yZSBmcmFtZXMgbGVmdCB0byBkZWNvZGUuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgdG8gYmUgY2hlY2tlZC4KKy8vIFJldHVybnM6CisvLyAgIFRydWUgaWYgJ2RlYycgaXMgbm90IE5VTEwgYW5kIHNvbWUgZnJhbWVzIGFyZSB5ZXQgdG8gYmUgZGVjb2RlZC4KKy8vICAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQQW5pbURlY29kZXJIYXNNb3JlRnJhbWVzKGNvbnN0IFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworLy8gUmVzZXRzIHRoZSBXZWJQQW5pbURlY29kZXIgb2JqZWN0LCBzbyB0aGF0IG5leHQgY2FsbCB0bworLy8gV2ViUEFuaW1EZWNvZGVyR2V0TmV4dCgpIHdpbGwgcmVzdGFydCBkZWNvZGluZyBmcm9tIDFzdCBmcmFtZS4gVGhpcyB3b3VsZCBiZQorLy8gaGVscGZ1bCB3aGVuIGFsbCBmcmFtZXMgbmVlZCB0byBiZSBkZWNvZGVkIG11bHRpcGxlIHRpbWVzIChlLmcuCisvLyBpbmZvLmxvb3BfY291bnQgdGltZXMpIHdpdGhvdXQgZGVzdHJveWluZyBhbmQgcmVjcmVhdGluZyB0aGUgJ2RlYycgb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgZGVjIC0gKGluL291dCkgZGVjb2RlciBpbnN0YW5jZSB0byBiZSByZXNldAorV0VCUF9FWFRFUk4odm9pZCkgV2ViUEFuaW1EZWNvZGVyUmVzZXQoV2ViUEFuaW1EZWNvZGVyKiBkZWMpOworCisvLyBHcmFiIHRoZSBpbnRlcm5hbCBkZW11eGVyIG9iamVjdC4KKy8vIEdldHRpbmcgdGhlIGRlbXV4ZXIgb2JqZWN0IGNhbiBiZSB1c2VmdWwgaWYgb25lIHdhbnRzIHRvIHVzZSBvcGVyYXRpb25zIG9ubHkKKy8vIGF2YWlsYWJsZSB0aHJvdWdoIGRlbXV4ZXI7IGUuZy4gdG8gZ2V0IFhNUC9FWElGL0lDQyBtZXRhZGF0YS4gVGhlIHJldHVybmVkCisvLyBkZW11eGVyIG9iamVjdCBpcyBvd25lZCBieSAnZGVjJyBhbmQgaXMgdmFsaWQgb25seSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbURlY29kZXJEZWxldGUoKS4KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgZGVtdXhlciBvYmplY3QgaXMgdG8gYmUgZmV0Y2hlZC4KK1dFQlBfRVhURVJOKGNvbnN0IFdlYlBEZW11eGVyKikgV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcigKKyAgICBjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYyk7CisKKy8vIERlbGV0ZXMgdGhlIFdlYlBBbmltRGVjb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIHRvIGJlIGRlbGV0ZWQKK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBBbmltRGVjb2RlckRlbGV0ZShXZWJQQW5pbURlY29kZXIqIGRlYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1dFQlBfREVNVVhfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvZW5jb2RlLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2VuY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjBiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2VuY29kZS5oCkBAIC0wLDAgKzEsNTI3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBXZWJQIGVuY29kZXI6IG1haW4gaW50ZXJmYWNlCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBDSFJPTUlVTV9XRUJQX1dFQlBfRU5DT0RFX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfV0VCUF9FTkNPREVfSF8KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OIDB4MDIwOSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUEltYWdlSGludCBXZWJQSW1hZ2VIaW50OworLy8gdHlwZWRlZiBlbnVtIFdlYlBFbmNDU1AgV2ViUEVuY0NTUDsKKy8vIHR5cGVkZWYgZW51bSBXZWJQUHJlc2V0IFdlYlBQcmVzZXQ7CisvLyB0eXBlZGVmIGVudW0gV2ViUEVuY29kaW5nRXJyb3IgV2ViUEVuY29kaW5nRXJyb3I7Cit0eXBlZGVmIHN0cnVjdCBXZWJQQ29uZmlnIFdlYlBDb25maWc7Cit0eXBlZGVmIHN0cnVjdCBXZWJQUGljdHVyZSBXZWJQUGljdHVyZTsgICAvLyBtYWluIHN0cnVjdHVyZSBmb3IgSS9PCit0eXBlZGVmIHN0cnVjdCBXZWJQQXV4U3RhdHMgV2ViUEF1eFN0YXRzOwordHlwZWRlZiBzdHJ1Y3QgV2ViUE1lbW9yeVdyaXRlciBXZWJQTWVtb3J5V3JpdGVyOworCisvLyBSZXR1cm4gdGhlIGVuY29kZXIncyB2ZXJzaW9uIG51bWJlciwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nIDhiaXRzIGZvcgorLy8gZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBHZXRFbmNvZGVyVmVyc2lvbih2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9uZS1zdG9wLXNob3AgY2FsbCEgTm8gcXVlc3Rpb25zIGFza2VkOgorCisvLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKHBvaW50ZWQgdG8gYnkgKm91dHB1dCksIG9yIDAgaWYKKy8vIGFuIGVycm9yIG9jY3VycmVkLiBUaGUgY29tcHJlc3NlZCBkYXRhIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIGNhbGxlcgorLy8gdXNpbmcgdGhlIGNhbGwgJ1dlYlBGcmVlKCpvdXRwdXQpJy4KKy8vIFRoZXNlIGZ1bmN0aW9ucyBjb21wcmVzcyB1c2luZyB0aGUgbG9zc3kgZm9ybWF0LCBhbmQgdGhlIHF1YWxpdHlfZmFjdG9yCisvLyBjYW4gZ28gZnJvbSAwIChzbWFsbGVyIG91dHB1dCwgbG93ZXIgcXVhbGl0eSkgdG8gMTAwIChiZXN0IHF1YWxpdHksCisvLyBsYXJnZXIgb3V0cHV0KS4KK1dFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZVJHQihjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUJHUihjb25zdCB1aW50OF90KiBiZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZVJHQkEoY29uc3QgdWludDhfdCogcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworCisvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBhYm92ZSwgYnV0IGNvbXByZXNzaW5nIGluIGEKKy8vIGxvc3NsZXNzIG1hbm5lci4gRmlsZXMgYXJlIHVzdWFsbHkgbGFyZ2VyIHRoYW4gbG9zc3kgZm9ybWF0LCBidXQgd2lsbAorLy8gbm90IHN1ZmZlciBhbnkgY29tcHJlc3Npb24gbG9zcy4KK1dFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlTG9zc2xlc3NCR1IoY29uc3QgdWludDhfdCogYmdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEoY29uc3QgdWludDhfdCogcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoY29uc3QgdWludDhfdCogYmdyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKKy8vIFJlbGVhc2VzIG1lbW9yeSByZXR1cm5lZCBieSB0aGUgV2ViUEVuY29kZSooKSBmdW5jdGlvbnMgYWJvdmUuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQRnJlZSh2b2lkKiBwdHIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kaW5nIHBhcmFtZXRlcnMKKworLy8gSW1hZ2UgY2hhcmFjdGVyaXN0aWNzIGhpbnQgZm9yIHRoZSB1bmRlcmx5aW5nIGVuY29kZXIuCit0eXBlZGVmIGVudW0gV2ViUEltYWdlSGludCB7CisgIFdFQlBfSElOVF9ERUZBVUxUID0gMCwgIC8vIGRlZmF1bHQgcHJlc2V0LgorICBXRUJQX0hJTlRfUElDVFVSRSwgICAgICAvLyBkaWdpdGFsIHBpY3R1cmUsIGxpa2UgcG9ydHJhaXQsIGlubmVyIHNob3QKKyAgV0VCUF9ISU5UX1BIT1RPLCAgICAgICAgLy8gb3V0ZG9vciBwaG90b2dyYXBoLCB3aXRoIG5hdHVyYWwgbGlnaHRpbmcKKyAgV0VCUF9ISU5UX0dSQVBILCAgICAgICAgLy8gRGlzY3JldGUgdG9uZSBpbWFnZSAoZ3JhcGgsIG1hcC10aWxlIGV0YykuCisgIFdFQlBfSElOVF9MQVNUCit9IFdlYlBJbWFnZUhpbnQ7CisKKy8vIENvbXByZXNzaW9uIHBhcmFtZXRlcnMuCitzdHJ1Y3QgV2ViUENvbmZpZyB7CisgIGludCBsb3NzbGVzczsgICAgICAgICAgIC8vIExvc3NsZXNzIGVuY29kaW5nICgwPWxvc3N5KGRlZmF1bHQpLCAxPWxvc3NsZXNzKS4KKyAgZmxvYXQgcXVhbGl0eTsgICAgICAgICAgLy8gYmV0d2VlbiAwIChzbWFsbGVzdCBmaWxlKSBhbmQgMTAwIChiaWdnZXN0KQorICBpbnQgbWV0aG9kOyAgICAgICAgICAgICAvLyBxdWFsaXR5L3NwZWVkIHRyYWRlLW9mZiAoMD1mYXN0LCA2PXNsb3dlci1iZXR0ZXIpCisKKyAgV2ViUEltYWdlSGludCBpbWFnZV9oaW50OyAgLy8gSGludCBmb3IgaW1hZ2UgdHlwZSAobG9zc2xlc3Mgb25seSBmb3Igbm93KS4KKworICAvLyBQYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gbG9zc3kgY29tcHJlc3Npb24gb25seToKKyAgaW50IHRhcmdldF9zaXplOyAgICAgICAgLy8gaWYgbm9uLXplcm8sIHNldCB0aGUgZGVzaXJlZCB0YXJnZXQgc2l6ZSBpbiBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSAnY29tcHJlc3Npb24nIHBhcmFtZXRlci4KKyAgZmxvYXQgdGFyZ2V0X1BTTlI7ICAgICAgLy8gaWYgbm9uLXplcm8sIHNwZWNpZmllcyB0aGUgbWluaW1hbCBkaXN0b3J0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhY2hpZXZlLiBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgdGFyZ2V0X3NpemUuCisgIGludCBzZWdtZW50czsgICAgICAgICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIHRvIHVzZSwgaW4gWzEuLjRdCisgIGludCBzbnNfc3RyZW5ndGg7ICAgICAgIC8vIFNwYXRpYWwgTm9pc2UgU2hhcGluZy4gMD1vZmYsIDEwMD1tYXhpbXVtLgorICBpbnQgZmlsdGVyX3N0cmVuZ3RoOyAgICAvLyByYW5nZTogWzAgPSBvZmYgLi4gMTAwID0gc3Ryb25nZXN0XQorICBpbnQgZmlsdGVyX3NoYXJwbmVzczsgICAvLyByYW5nZTogWzAgPSBvZmYgLi4gNyA9IGxlYXN0IHNoYXJwXQorICBpbnQgZmlsdGVyX3R5cGU7ICAgICAgICAvLyBmaWx0ZXJpbmcgdHlwZTogMCA9IHNpbXBsZSwgMSA9IHN0cm9uZyAob25seSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZpbHRlcl9zdHJlbmd0aCA+IDAgb3IgYXV0b2ZpbHRlciA+IDApCisgIGludCBhdXRvZmlsdGVyOyAgICAgICAgIC8vIEF1dG8gYWRqdXN0IGZpbHRlcidzIHN0cmVuZ3RoIFswID0gb2ZmLCAxID0gb25dCisgIGludCBhbHBoYV9jb21wcmVzc2lvbjsgIC8vIEFsZ29yaXRobSBmb3IgZW5jb2RpbmcgdGhlIGFscGhhIHBsYW5lICgwID0gbm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSA9IGNvbXByZXNzZWQgd2l0aCBXZWJQIGxvc3NsZXNzKS4gRGVmYXVsdCBpcyAxLgorICBpbnQgYWxwaGFfZmlsdGVyaW5nOyAgICAvLyBQcmVkaWN0aXZlIGZpbHRlcmluZyBtZXRob2QgZm9yIGFscGhhIHBsYW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMDogbm9uZSwgMTogZmFzdCwgMjogYmVzdC4gRGVmYXVsdCBpZiAxLgorICBpbnQgYWxwaGFfcXVhbGl0eTsgICAgICAvLyBCZXR3ZWVuIDAgKHNtYWxsZXN0IHNpemUpIGFuZCAxMDAgKGxvc3NsZXNzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyAxMDAuCisgIGludCBwYXNzOyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBlbnRyb3B5LWFuYWx5c2lzIHBhc3NlcyAoaW4gWzEuLjEwXSkuCisKKyAgaW50IHNob3dfY29tcHJlc3NlZDsgICAgLy8gaWYgdHJ1ZSwgZXhwb3J0IHRoZSBjb21wcmVzc2VkIHBpY3R1cmUgYmFjay4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4tbG9vcCBmaWx0ZXJpbmcgaXMgbm90IGFwcGxpZWQuCisgIGludCBwcmVwcm9jZXNzaW5nOyAgICAgIC8vIHByZXByb2Nlc3NpbmcgZmlsdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAwPW5vbmUsIDE9c2VnbWVudC1zbW9vdGgsIDI9cHNldWRvLXJhbmRvbSBkaXRoZXJpbmcKKyAgaW50IHBhcnRpdGlvbnM7ICAgICAgICAgLy8gbG9nMihudW1iZXIgb2YgdG9rZW4gcGFydGl0aW9ucykgaW4gWzAuLjNdLiBEZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHNldCB0byAwIGZvciBlYXNpZXIgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcuCisgIGludCBwYXJ0aXRpb25fbGltaXQ7ICAgIC8vIHF1YWxpdHkgZGVncmFkYXRpb24gYWxsb3dlZCB0byBmaXQgdGhlIDUxMmsgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gcHJlZGljdGlvbiBtb2RlcyBjb2RpbmcgKDA6IG5vIGRlZ3JhZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMDA6IG1heGltdW0gcG9zc2libGUgZGVncmFkYXRpb24pLgorICBpbnQgZW11bGF0ZV9qcGVnX3NpemU7ICAvLyBJZiB0cnVlLCBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHdpbGwgYmUgcmVtYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmV0dGVyIG1hdGNoIHRoZSBleHBlY3RlZCBvdXRwdXQgc2l6ZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpQRUcgY29tcHJlc3Npb24uIEdlbmVyYWxseSwgdGhlIG91dHB1dCBzaXplIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgc2ltaWxhciBidXQgdGhlIGRlZ3JhZGF0aW9uIHdpbGwgYmUgbG93ZXIuCisgIGludCB0aHJlYWRfbGV2ZWw7ICAgICAgIC8vIElmIG5vbi16ZXJvLCB0cnkgYW5kIHVzZSBtdWx0aS10aHJlYWRlZCBlbmNvZGluZy4KKyAgaW50IGxvd19tZW1vcnk7ICAgICAgICAgLy8gSWYgc2V0LCByZWR1Y2UgbWVtb3J5IHVzYWdlIChidXQgaW5jcmVhc2UgQ1BVIHVzZSkuCisKKyAgaW50IG5lYXJfbG9zc2xlc3M7ICAgICAgLy8gTmVhciBsb3NzbGVzcyBlbmNvZGluZyBbMCA9IG1heCBsb3NzIC4uIDEwMCA9IG9mZgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZGVmYXVsdCldLgorICBpbnQgZXhhY3Q7ICAgICAgICAgICAgICAvLyBpZiBub24temVybywgcHJlc2VydmUgdGhlIGV4YWN0IFJHQiB2YWx1ZXMgdW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNwYXJlbnQgYXJlYS4gT3RoZXJ3aXNlLCBkaXNjYXJkIHRoaXMgaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJHQiBpbmZvcm1hdGlvbiBmb3IgYmV0dGVyIGNvbXByZXNzaW9uLiBUaGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBpcyAwLgorCisjaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKKyAgaW50IGRlbHRhX3BhbGV0dGl6YXRpb247CisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorI2Vsc2UKKyAgdWludDMyX3QgcGFkWzNdOyAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisjZW5kaWYgIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCit9OworCisvLyBFbnVtZXJhdGUgc29tZSBwcmVkZWZpbmVkIHNldHRpbmdzIGZvciBXZWJQQ29uZmlnLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUKKy8vIG9mIHNvdXJjZSBwaWN0dXJlLiBUaGVzZSBwcmVzZXRzIGFyZSB1c2VkIHdoZW4gY2FsbGluZyBXZWJQQ29uZmlnUHJlc2V0KCkuCit0eXBlZGVmIGVudW0gV2ViUFByZXNldCB7CisgIFdFQlBfUFJFU0VUX0RFRkFVTFQgPSAwLCAgLy8gZGVmYXVsdCBwcmVzZXQuCisgIFdFQlBfUFJFU0VUX1BJQ1RVUkUsICAgICAgLy8gZGlnaXRhbCBwaWN0dXJlLCBsaWtlIHBvcnRyYWl0LCBpbm5lciBzaG90CisgIFdFQlBfUFJFU0VUX1BIT1RPLCAgICAgICAgLy8gb3V0ZG9vciBwaG90b2dyYXBoLCB3aXRoIG5hdHVyYWwgbGlnaHRpbmcKKyAgV0VCUF9QUkVTRVRfRFJBV0lORywgICAgICAvLyBoYW5kIG9yIGxpbmUgZHJhd2luZywgd2l0aCBoaWdoLWNvbnRyYXN0IGRldGFpbHMKKyAgV0VCUF9QUkVTRVRfSUNPTiwgICAgICAgICAvLyBzbWFsbC1zaXplZCBjb2xvcmZ1bCBpbWFnZXMKKyAgV0VCUF9QUkVTRVRfVEVYVCAgICAgICAgICAvLyB0ZXh0LWxpa2UKK30gV2ViUFByZXNldDsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOKGludCkgV2ViUENvbmZpZ0luaXRJbnRlcm5hbChXZWJQQ29uZmlnKiwgV2ViUFByZXNldCwgZmxvYXQsIGludCk7CisKKy8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIGEgZnJlc2ggV2ViUENvbmZpZyBzdHJ1Y3R1cmUgYmVmb3JlCisvLyBtb2RpZmljYXRpb24uIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoLiBXZWJQQ29uZmlnSW5pdCgpCisvLyBtdXN0IGhhdmUgc3VjY2VlZGVkIGJlZm9yZSB1c2luZyB0aGUgJ2NvbmZpZycgb2JqZWN0LgorLy8gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgbG9zc2xlc3M9MCBhbmQgcXVhbGl0eT03NS4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUENvbmZpZ0luaXQoV2ViUENvbmZpZyogY29uZmlnKSB7CisgIHJldHVybiBXZWJQQ29uZmlnSW5pdEludGVybmFsKGNvbmZpZywgV0VCUF9QUkVTRVRfREVGQVVMVCwgNzUuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIGEgcHJlZGVmaW5lZAorLy8gc2V0IG9mIHBhcmFtZXRlcnMgKHJlZmVycmVkIHRvIGJ5ICdwcmVzZXQnKSBhbmQgYSBnaXZlbiBxdWFsaXR5IGZhY3Rvci4KKy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhcyBhIHJlcGxhY2VtZW50IHRvIFdlYlBDb25maWdJbml0KCkuIFdpbGwKKy8vIHJldHVybiBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQQ29uZmlnUHJlc2V0KFdlYlBDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUHJlc2V0IHByZXNldCwgZmxvYXQgcXVhbGl0eSkgeworICByZXR1cm4gV2ViUENvbmZpZ0luaXRJbnRlcm5hbChjb25maWcsIHByZXNldCwgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8gQWN0aXZhdGUgdGhlIGxvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGUgd2l0aCB0aGUgZGVzaXJlZCBlZmZpY2llbmN5IGxldmVsCisvLyBiZXR3ZWVuIDAgKGZhc3Rlc3QsIGxvd2VzdCBjb21wcmVzc2lvbikgYW5kIDkgKHNsb3dlciwgYmVzdCBjb21wcmVzc2lvbikuCisvLyBBIGdvb2QgZGVmYXVsdCBsZXZlbCBpcyAnNicsIHByb3ZpZGluZyBhIGZhaXIgdHJhZGVvZmYgYmV0d2VlbiBjb21wcmVzc2lvbgorLy8gc3BlZWQgYW5kIGZpbmFsIGNvbXByZXNzZWQgc2l6ZS4KKy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBvdmVyd3JpdGUgc2V2ZXJhbCBmaWVsZHMgZnJvbSBjb25maWc6ICdtZXRob2QnLCAncXVhbGl0eScKKy8vIGFuZCAnbG9zc2xlc3MnLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgcGFyYW1ldGVyIGVycm9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoV2ViUENvbmZpZyogY29uZmlnLCBpbnQgbGV2ZWwpOworCisvLyBSZXR1cm5zIHRydWUgaWYgJ2NvbmZpZycgaXMgbm9uLU5VTEwgYW5kIGFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlCisvLyB3aXRoaW4gdGhlaXIgdmFsaWQgcmFuZ2VzLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElucHV0IC8gT3V0cHV0CisvLyBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgYXV4aWxpYXJ5IHN0YXRpc3RpY3MgKG1vc3RseSBmb3IgbG9zc3kgZW5jb2RpbmcpLgorCitzdHJ1Y3QgV2ViUEF1eFN0YXRzIHsKKyAgaW50IGNvZGVkX3NpemU7ICAgICAgICAgLy8gZmluYWwgc2l6ZQorCisgIGZsb2F0IFBTTlJbNV07ICAgICAgICAgIC8vIHBlYWstc2lnbmFsLXRvLW5vaXNlIHJhdGlvIGZvciBZL1UvVi9BbGwvQWxwaGEKKyAgaW50IGJsb2NrX2NvdW50WzNdOyAgICAgLy8gbnVtYmVyIG9mIGludHJhNC9pbnRyYTE2L3NraXBwZWQgbWFjcm9ibG9ja3MKKyAgaW50IGhlYWRlcl9ieXRlc1syXTsgICAgLy8gYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIHNwZW50IGZvciBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG1vZGUtcGFydGl0aW9uICMwCisgIGludCByZXNpZHVhbF9ieXRlc1szXVs0XTsgIC8vIGFwcHJveGltYXRlIG51bWJlciBvZiBieXRlcyBzcGVudCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gREMvQUMvdXYgY29lZmZpY2llbnRzIGZvciBlYWNoICgwLi4zKSBzZWdtZW50cy4KKyAgaW50IHNlZ21lbnRfc2l6ZVs0XTsgICAgLy8gbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGluIGVhY2ggc2VnbWVudHMKKyAgaW50IHNlZ21lbnRfcXVhbnRbNF07ICAgLy8gcXVhbnRpemVyIHZhbHVlcyBmb3IgZWFjaCBzZWdtZW50cworICBpbnQgc2VnbWVudF9sZXZlbFs0XTsgICAvLyBmaWx0ZXJpbmcgc3RyZW5ndGggZm9yIGVhY2ggc2VnbWVudHMgWzAuLjYzXQorCisgIGludCBhbHBoYV9kYXRhX3NpemU7ICAgIC8vIHNpemUgb2YgdGhlIHRyYW5zcGFyZW5jeSBkYXRhCisgIGludCBsYXllcl9kYXRhX3NpemU7ICAgIC8vIHNpemUgb2YgdGhlIGVuaGFuY2VtZW50IGxheWVyIGRhdGEKKworICAvLyBsb3NzbGVzcyBlbmNvZGVyIHN0YXRpc3RpY3MKKyAgdWludDMyX3QgbG9zc2xlc3NfZmVhdHVyZXM7ICAvLyBiaXQwOnByZWRpY3RvciBiaXQxOmNyb3NzLWNvbG9yIHRyYW5zZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdDI6c3VidHJhY3QtZ3JlZW4gYml0Mzpjb2xvciBpbmRleGluZworICBpbnQgaGlzdG9ncmFtX2JpdHM7ICAgICAgICAgIC8vIG51bWJlciBvZiBwcmVjaXNpb24gYml0cyBvZiBoaXN0b2dyYW0KKyAgaW50IHRyYW5zZm9ybV9iaXRzOyAgICAgICAgICAvLyBwcmVjaXNpb24gYml0cyBmb3IgdHJhbnNmb3JtCisgIGludCBjYWNoZV9iaXRzOyAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJpdHMgZm9yIGNvbG9yIGNhY2hlIGxvb2t1cAorICBpbnQgcGFsZXR0ZV9zaXplOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBjb2xvciBpbiBwYWxldHRlLCBpZiB1c2VkCisgIGludCBsb3NzbGVzc19zaXplOyAgICAgICAgICAgLy8gZmluYWwgbG9zc2xlc3Mgc2l6ZQorICBpbnQgbG9zc2xlc3NfaGRyX3NpemU7ICAgICAgIC8vIGxvc3NsZXNzIGhlYWRlciAodHJhbnNmb3JtLCBodWZmbWFuIGV0Yykgc2l6ZQorICBpbnQgbG9zc2xlc3NfZGF0YV9zaXplOyAgICAgIC8vIGxvc3NsZXNzIGltYWdlIGRhdGEgc2l6ZQorCisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gU2lnbmF0dXJlIGZvciBvdXRwdXQgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiB3cml0aW5nIHdhcyBzdWNjZXNzZnVsLgorLy8gZGF0YS9kYXRhX3NpemUgaXMgdGhlIHNlZ21lbnQgb2YgZGF0YSB0byB3cml0ZSwgYW5kICdwaWN0dXJlJyBpcyBmb3IKKy8vIHJlZmVyZW5jZSAoYW5kIHNvIG9uZSBjYW4gbWFrZSB1c2Ugb2YgcGljdHVyZS0+Y3VzdG9tX3B0cikuCit0eXBlZGVmIGludCAoKldlYlBXcml0ZXJGdW5jdGlvbikoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFdlYlBNZW1vcnlXcml0ZTogYSBzcGVjaWFsIFdlYlBXcml0ZXJGdW5jdGlvbiB0aGF0IHdyaXRlcyB0byBtZW1vcnkgdXNpbmcKKy8vIHRoZSBmb2xsb3dpbmcgV2ViUE1lbW9yeVdyaXRlciBvYmplY3QgKHRvIGJlIHNldCBhcyBhIGN1c3RvbV9wdHIpLgorc3RydWN0IFdlYlBNZW1vcnlXcml0ZXIgeworICB1aW50OF90KiBtZW07ICAgICAgIC8vIGZpbmFsIGJ1ZmZlciAob2Ygc2l6ZSAnbWF4X3NpemUnLCBsYXJnZXIgdGhhbiAnc2l6ZScpLgorICBzaXplX3QgICBzaXplOyAgICAgIC8vIGZpbmFsIHNpemUKKyAgc2l6ZV90ICAgbWF4X3NpemU7ICAvLyB0b3RhbCBjYXBhY2l0eQorICB1aW50MzJfdCBwYWRbMV07ICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gVGhlIGZvbGxvd2luZyBtdXN0IGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgYW55IHVzZS4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcik7CisKKy8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBjYWxsZWQgdG8gZGVhbGxvY2F0ZSB3cml0ZXItPm1lbSBtZW1vcnkuIFRoZSAnd3JpdGVyJworLy8gb2JqZWN0IGl0c2VsZiBpcyBub3QgZGVhbGxvY2F0ZWQuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKTsKKy8vIFRoZSBjdXN0b20gd3JpdGVyIHRvIGJlIHVzZWQgd2l0aCBXZWJQTWVtb3J5V3JpdGVyIGFzIGN1c3RvbV9wdHIuIFVwb24KKy8vIGNvbXBsZXRpb24sIHdyaXRlci5tZW0gYW5kIHdyaXRlci5zaXplIHdpbGwgaG9sZCB0aGUgY29kZWQgZGF0YS4KKy8vIHdyaXRlci5tZW0gbXVzdCBiZSBmcmVlZCBieSBjYWxsaW5nIFdlYlBNZW1vcnlXcml0ZXJDbGVhci4KK1dFQlBfRVhURVJOKGludCkgV2ViUE1lbW9yeVdyaXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFByb2dyZXNzIGhvb2ssIGNhbGxlZCBmcm9tIHRpbWUgdG8gdGltZSB0byByZXBvcnQgcHJvZ3Jlc3MuIEl0IGNhbiByZXR1cm4KKy8vIGZhbHNlIHRvIHJlcXVlc3QgYW4gYWJvcnQgb2YgdGhlIGVuY29kaW5nIHByb2Nlc3MsIG9yIHRydWUgb3RoZXJ3aXNlIGlmCisvLyBldmVyeXRoaW5nIGlzIE9LLgordHlwZWRlZiBpbnQgKCpXZWJQUHJvZ3Jlc3NIb29rKShpbnQgcGVyY2VudCwgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBDb2xvciBzcGFjZXMuCit0eXBlZGVmIGVudW0gV2ViUEVuY0NTUCB7CisgIC8vIGNocm9tYSBzYW1wbGluZworICBXRUJQX1lVVjQyMCAgPSAwLCAgICAgICAgLy8gNDoyOjAKKyAgV0VCUF9ZVVY0MjBBID0gNCwgICAgICAgIC8vIGFscGhhIGNoYW5uZWwgdmFyaWFudAorICBXRUJQX0NTUF9VVl9NQVNLID0gMywgICAgLy8gYml0LW1hc2sgdG8gZ2V0IHRoZSBVViBzYW1wbGluZyBmYWN0b3JzCisgIFdFQlBfQ1NQX0FMUEhBX0JJVCA9IDQgICAvLyBiaXQgdGhhdCBpcyBzZXQgaWYgYWxwaGEgaXMgcHJlc2VudAorfSBXZWJQRW5jQ1NQOworCisvLyBFbmNvZGluZyBlcnJvciBjb25kaXRpb25zLgordHlwZWRlZiBlbnVtIFdlYlBFbmNvZGluZ0Vycm9yIHsKKyAgVlA4X0VOQ19PSyA9IDAsCisgIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSwgICAgICAgICAgICAvLyBtZW1vcnkgZXJyb3IgYWxsb2NhdGluZyBvYmplY3RzCisgIFZQOF9FTkNfRVJST1JfQklUU1RSRUFNX09VVF9PRl9NRU1PUlksICAvLyBtZW1vcnkgZXJyb3Igd2hpbGUgZmx1c2hpbmcgYml0cworICBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSLCAgICAgICAgICAgLy8gYSBwb2ludGVyIHBhcmFtZXRlciBpcyBOVUxMCisgIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OLCAgICAvLyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQKKyAgVlA4X0VOQ19FUlJPUl9CQURfRElNRU5TSU9OLCAgICAgICAgICAgIC8vIHBpY3R1cmUgaGFzIGludmFsaWQgd2lkdGgvaGVpZ2h0CisgIFZQOF9FTkNfRVJST1JfUEFSVElUSU9OMF9PVkVSRkxPVywgICAgICAvLyBwYXJ0aXRpb24gaXMgYmlnZ2VyIHRoYW4gNTEyaworICBWUDhfRU5DX0VSUk9SX1BBUlRJVElPTl9PVkVSRkxPVywgICAgICAgLy8gcGFydGl0aW9uIGlzIGJpZ2dlciB0aGFuIDE2TQorICBWUDhfRU5DX0VSUk9SX0JBRF9XUklURSwgICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgZmx1c2hpbmcgYnl0ZXMKKyAgVlA4X0VOQ19FUlJPUl9GSUxFX1RPT19CSUcsICAgICAgICAgICAgIC8vIGZpbGUgaXMgYmlnZ2VyIHRoYW4gNEcKKyAgVlA4X0VOQ19FUlJPUl9VU0VSX0FCT1JULCAgICAgICAgICAgICAgIC8vIGFib3J0IHJlcXVlc3QgYnkgdXNlcgorICBWUDhfRU5DX0VSUk9SX0xBU1QgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCB0ZXJtaW5hdG9yLiBhbHdheXMgbGFzdC4KK30gV2ViUEVuY29kaW5nRXJyb3I7CisKKy8vIG1heGltdW0gd2lkdGgvaGVpZ2h0IGFsbG93ZWQgKGluY2x1c2l2ZSksIGluIHBpeGVscworI2RlZmluZSBXRUJQX01BWF9ESU1FTlNJT04gMTYzODMKKworLy8gTWFpbiBleGNoYW5nZSBzdHJ1Y3R1cmUgKGlucHV0IHNhbXBsZXMsIG91dHB1dCBieXRlcywgc3RhdGlzdGljcykKK3N0cnVjdCBXZWJQUGljdHVyZSB7CisgIC8vICAgSU5QVVQKKyAgLy8vLy8vLy8vLy8vLy8KKyAgLy8gTWFpbiBmbGFnIGZvciBlbmNvZGVyIHNlbGVjdGluZyBiZXR3ZWVuIEFSR0Igb3IgWVVWIGlucHV0LgorICAvLyBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgQVJHQiBpbnB1dCAoKmFyZ2IsIGFyZ2Jfc3RyaWRlKSBmb3IgbG9zc2xlc3MKKyAgLy8gY29tcHJlc3Npb24sIGFuZCBZVVYgaW5wdXQgKCp5LCAqdSwgKnYsIGV0Yy4pIGZvciBsb3NzeSBjb21wcmVzc2lvbgorICAvLyBzaW5jZSB0aGVzZSBhcmUgdGhlIHJlc3BlY3RpdmUgbmF0aXZlIGNvbG9yc3BhY2UgZm9yIHRoZXNlIGZvcm1hdHMuCisgIGludCB1c2VfYXJnYjsKKworICAvLyBZVVYgaW5wdXQgKG1vc3RseSB1c2VkIGZvciBpbnB1dCB0byBsb3NzeSBjb21wcmVzc2lvbikKKyAgV2ViUEVuY0NTUCBjb2xvcnNwYWNlOyAgICAgLy8gY29sb3JzcGFjZTogc2hvdWxkIGJlIFlVVjQyMCBmb3Igbm93ICg9WSdDYkNyKS4KKyAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgICAgLy8gZGltZW5zaW9ucyAobGVzcyBvciBlcXVhbCB0byBXRUJQX01BWF9ESU1FTlNJT04pCisgIHVpbnQ4X3QgKnksICp1LCAqdjsgICAgICAgIC8vIHBvaW50ZXJzIHRvIGx1bWEvY2hyb21hIHBsYW5lcy4KKyAgaW50IHlfc3RyaWRlLCB1dl9zdHJpZGU7ICAgLy8gbHVtYS9jaHJvbWEgc3RyaWRlcy4KKyAgdWludDhfdCogYTsgICAgICAgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgYWxwaGEgcGxhbmUKKyAgaW50IGFfc3RyaWRlOyAgICAgICAgICAgICAgLy8gc3RyaWRlIG9mIHRoZSBhbHBoYSBwbGFuZQorICB1aW50MzJfdCBwYWQxWzJdOyAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKworICAvLyBBUkdCIGlucHV0IChtb3N0bHkgdXNlZCBmb3IgaW5wdXQgdG8gbG9zc2xlc3MgY29tcHJlc3Npb24pCisgIHVpbnQzMl90KiBhcmdiOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYXJnYiAoMzIgYml0KSBwbGFuZS4KKyAgaW50IGFyZ2Jfc3RyaWRlOyAgICAgICAgICAgLy8gVGhpcyBpcyBzdHJpZGUgaW4gcGl4ZWxzIHVuaXRzLCBub3QgYnl0ZXMuCisgIHVpbnQzMl90IHBhZDJbM107ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorCisgIC8vICAgT1VUUFVUCisgIC8vLy8vLy8vLy8vLy8vLworICAvLyBCeXRlLWVtaXNzaW9uIGhvb2ssIHRvIHN0b3JlIGNvbXByZXNzZWQgYnl0ZXMgYXMgdGhleSBhcmUgcmVhZHkuCisgIFdlYlBXcml0ZXJGdW5jdGlvbiB3cml0ZXI7ICAvLyBjYW4gYmUgTlVMTAorICB2b2lkKiBjdXN0b21fcHRyOyAgICAgICAgICAgLy8gY2FuIGJlIHVzZWQgYnkgdGhlIHdyaXRlci4KKworICAvLyBtYXAgZm9yIGV4dHJhIGluZm9ybWF0aW9uIChvbmx5IGZvciBsb3NzeSBjb21wcmVzc2lvbiBtb2RlKQorICBpbnQgZXh0cmFfaW5mb190eXBlOyAgICAvLyAxOiBpbnRyYSB0eXBlLCAyOiBzZWdtZW50LCAzOiBxdWFudAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0OiBpbnRyYS0xNiBwcmVkaWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDU6IGNocm9tYSBwcmVkaWN0aW9uIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDY6IGJpdCBjb3N0LCA3OiBkaXN0b3J0aW9uCisgIHVpbnQ4X3QqIGV4dHJhX2luZm87ICAgIC8vIGlmIG5vdCBOVUxMLCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoKHdpZHRoICsgMTUpIC8gMTYpICogKChoZWlnaHQgKyAxNSkgLyAxNikgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGZpbGxlZCB3aXRoIGEgbWFjcm9ibG9jayBtYXAsIGRlcGVuZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbiBleHRyYV9pbmZvX3R5cGUuCisKKyAgLy8gICBTVEFUUyBBTkQgUkVQT1JUUworICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gUG9pbnRlciB0byBzaWRlIHN0YXRpc3RpY3MgKHVwZGF0ZWQgb25seSBpZiBub3QgTlVMTCkKKyAgV2ViUEF1eFN0YXRzKiBzdGF0czsKKworICAvLyBFcnJvciBjb2RlIGZvciB0aGUgbGF0ZXN0IGVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlOworCisgIC8vIElmIG5vdCBOVUxMLCByZXBvcnQgcHJvZ3Jlc3MgZHVyaW5nIGVuY29kaW5nLgorICBXZWJQUHJvZ3Jlc3NIb29rIHByb2dyZXNzX2hvb2s7CisKKyAgdm9pZCogdXNlcl9kYXRhOyAgICAgICAgLy8gdGhpcyBmaWVsZCBpcyBmcmVlIHRvIGJlIHNldCB0byBhbnkgdmFsdWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZHVyaW5nIGNhbGxiYWNrcyAobGlrZSBwcm9ncmVzcy1yZXBvcnQgZS5nLikuCisKKyAgdWludDMyX3QgcGFkM1szXTsgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisKKyAgLy8gVW51c2VkIGZvciBub3cKKyAgdWludDhfdCAqcGFkNCwgKnBhZDU7CisgIHVpbnQzMl90IHBhZDZbOF07ICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorCisgIC8vIFBSSVZBVEUgRklFTERTCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIHZvaWQqIG1lbW9yeV87ICAgICAgICAgIC8vIHJvdyBjaHVuayBvZiBtZW1vcnkgZm9yIHl1dmEgcGxhbmVzCisgIHZvaWQqIG1lbW9yeV9hcmdiXzsgICAgIC8vIGFuZCBmb3IgYXJnYiB0b28uCisgIHZvaWQqIHBhZDdbMl07ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorfTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwoV2ViUFBpY3R1cmUqLCBpbnQpOworCisvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlLiBSZXR1cm5zIGZhbHNlIGluIGNhc2UKKy8vIG9mIHZlcnNpb24gbWlzbWF0Y2guIFdlYlBQaWN0dXJlSW5pdCgpIG11c3QgaGF2ZSBzdWNjZWVkZWQgYmVmb3JlIHVzaW5nIHRoZQorLy8gJ3BpY3R1cmUnIG9iamVjdC4KKy8vIE5vdGUgdGhhdCwgYnkgZGVmYXVsdCwgdXNlX2FyZ2IgaXMgZmFsc2UgYW5kIGNvbG9yc3BhY2UgaXMgV0VCUF9ZVVY0MjAuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBQaWN0dXJlSW5pdChXZWJQUGljdHVyZSogcGljdHVyZSkgeworICByZXR1cm4gV2ViUFBpY3R1cmVJbml0SW50ZXJuYWwocGljdHVyZSwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBQaWN0dXJlIHV0aWxzCisKKy8vIENvbnZlbmllbmNlIGFsbG9jYXRpb24gLyBkZWFsbG9jYXRpb24gYmFzZWQgb24gcGljdHVyZS0+d2lkdGgvaGVpZ2h0OgorLy8gQWxsb2NhdGUgeS91L3YgYnVmZmVycyBhcyBwZXIgY29sb3JzcGFjZS93aWR0aC9oZWlnaHQgc3BlY2lmaWNhdGlvbi4KKy8vIE5vdGUhIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBwcmV2aW91cyBidWZmZXIgaWYgbmVlZGVkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFJlbGVhc2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgV2ViUFBpY3R1cmVBbGxvYygpIG9yIFdlYlBQaWN0dXJlSW1wb3J0KigpLgorLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBfbm90XyBmcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgJ3BpY3R1cmUnCisvLyBvYmplY3QgaXRzZWxmLgorLy8gQmVzaWRlcyBtZW1vcnkgKHdoaWNoIGlzIHJlY2xhaW1lZCkgYWxsIG90aGVyIGZpZWxkcyBvZiAncGljdHVyZScgYXJlCisvLyBwcmVzZXJ2ZWQuCitXRUJQX0VYVEVSTih2b2lkKSBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBDb3B5IHRoZSBwaXhlbHMgb2YgKnNyYyBpbnRvICpkc3QsIHVzaW5nIFdlYlBQaWN0dXJlQWxsb2MuIFVwb24gcmV0dXJuLCAqZHN0CisvLyB3aWxsIGZ1bGx5IG93biB0aGUgY29waWVkIHBpeGVscyAodGhpcyBpcyBub3QgYSB2aWV3KS4gVGhlICdkc3QnIHBpY3R1cmUgbmVlZAorLy8gbm90IGJlIGluaXRpYWxpemVkIGFzIGl0cyBjb250ZW50IGlzIG92ZXJ3cml0dGVuLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUNvcHkoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgV2ViUFBpY3R1cmUqIGRzdCk7CisKKy8vIENvbXB1dGUgUFNOUiwgU1NJTSBvciBMU0lNIGRpc3RvcnRpb24gbWV0cmljIGJldHdlZW4gdHdvIHBpY3R1cmVzLiBSZXN1bHRzCisvLyBhcmUgaW4gZEIsIHN0b3JlZCBpbiByZXN1bHRbXSBpbiB0aGUgWS9VL1YvQWxwaGEvQWxsIG9yIEIvRy9SL0EvQWxsIG9yZGVyLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChzcmMgYW5kIHJlZiBkb24ndCBoYXZlIHNhbWUgZGltZW5zaW9uLCAuLi4pCisvLyBXYXJuaW5nOiB0aGlzIGZ1bmN0aW9uIGlzIHJhdGhlciBDUFUtaW50ZW5zaXZlLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZURpc3RvcnRpb24oCisgICAgY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgY29uc3QgV2ViUFBpY3R1cmUqIHJlZiwKKyAgICBpbnQgbWV0cmljX3R5cGUsICAgICAgICAgICAvLyAwID0gUFNOUiwgMSA9IFNTSU0sIDIgPSBMU0lNCisgICAgZmxvYXQgcmVzdWx0WzVdKTsKKworLy8gc2VsZi1jcm9wcyBhIHBpY3R1cmUgdG8gdGhlIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IHRvcC9sZWZ0L3dpZHRoL2hlaWdodC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciwgb3IgaWYgdGhlIHJlY3RhbmdsZSBpcworLy8gb3V0c2lkZSBvZiB0aGUgc291cmNlIHBpY3R1cmUuCisvLyBUaGUgcmVjdGFuZ2xlIGZvciB0aGUgdmlldyBpcyBkZWZpbmVkIGJ5IHRoZSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwKKy8vIGNvb3JkaW5hdGVzIChsZWZ0LCB0b3ApIGFzIHdlbGwgYXMgaXRzIHdpZHRoIGFuZCBoZWlnaHQuIFRoaXMgcmVjdGFuZ2xlCisvLyBtdXN0IGJlIGZ1bGx5IGJlIGNvbXByaXNlZCBpbnNpZGUgdGhlICdzcmMnIHNvdXJjZSBwaWN0dXJlLiBJZiB0aGUgc291cmNlCisvLyBwaWN0dXJlIHVzZXMgdGhlIFlVVjQyMCBjb2xvcnNwYWNlLCB0aGUgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIHdpbGwgYmUKKy8vIHNuYXBwZWQgdG8gZXZlbiB2YWx1ZXMuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvLyBFeHRyYWN0cyBhIHZpZXcgZnJvbSAnc3JjJyBwaWN0dXJlIGludG8gJ2RzdCcuIFRoZSByZWN0YW5nbGUgZm9yIHRoZSB2aWV3CisvLyBpcyBkZWZpbmVkIGJ5IHRoZSB0b3AtbGVmdCBjb3JuZXIgcGl4ZWwgY29vcmRpbmF0ZXMgKGxlZnQsIHRvcCkgYXMgd2VsbAorLy8gYXMgaXRzIHdpZHRoIGFuZCBoZWlnaHQuIFRoaXMgcmVjdGFuZ2xlIG11c3QgYmUgZnVsbHkgYmUgY29tcHJpc2VkIGluc2lkZQorLy8gdGhlICdzcmMnIHNvdXJjZSBwaWN0dXJlLiBJZiB0aGUgc291cmNlIHBpY3R1cmUgdXNlcyB0aGUgWVVWNDIwIGNvbG9yc3BhY2UsCisvLyB0aGUgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIHdpbGwgYmUgc25hcHBlZCB0byBldmVuIHZhbHVlcy4KKy8vIFBpY3R1cmUgJ3NyYycgbXVzdCBvdXQtbGl2ZSAnZHN0JyBwaWN0dXJlLiBTZWxmLWV4dHJhY3Rpb24gb2YgdmlldyBpcyBhbGxvd2VkCisvLyAoJ3NyYycgZXF1YWwgdG8gJ2RzdCcpIGFzIGEgbWVhbiBvZiBmYXN0LWNyb3BwaW5nIChidXQgbm90ZSB0aGF0IGRvaW5nIHNvLAorLy8gdGhlIG9yaWdpbmFsIGRpbWVuc2lvbiB3aWxsIGJlIGxvc3QpLiBQaWN0dXJlICdkc3QnIG5lZWQgbm90IGJlIGluaXRpYWxpemVkCisvLyB3aXRoIFdlYlBQaWN0dXJlSW5pdCgpIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tICdzcmMnLCBzaW5jZSBpdHMgY29udGVudCB3aWxsCisvLyBiZSBvdmVyd3JpdHRlbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciBvciBpbnZhbGlkIHBhcmFtZXRlcnMuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlVmlldyhjb25zdCBXZWJQUGljdHVyZSogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpOworCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlICdwaWN0dXJlJyBpcyBhY3R1YWxseSBhIHZpZXcgYW5kIHRoZXJlZm9yZSBkb2VzCisvLyBub3Qgb3duIHRoZSBtZW1vcnkgZm9yIHBpeGVscy4KK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBSZXNjYWxlIGEgcGljdHVyZSB0byBuZXcgZGltZW5zaW9uIHdpZHRoIHggaGVpZ2h0LgorLy8gSWYgZWl0aGVyICd3aWR0aCcgb3IgJ2hlaWdodCcgKGJ1dCBub3QgYm90aCkgaXMgMCB0aGUgY29ycmVzcG9uZGluZworLy8gZGltZW5zaW9uIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3QgcmF0aW8uCisvLyBObyBnYW1tYSBjb3JyZWN0aW9uIGlzIGFwcGxpZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGludmFsaWQgcGFyYW1ldGVyIG9yIGluc3VmZmljaWVudCBtZW1vcnkpLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8gQ29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9uIHRvIGltcG9ydCBSR0Igc2FtcGxlcy4KKy8vIFByZXZpb3VzIGJ1ZmZlciB3aWxsIGJlIGZyZWUnZCwgaWYgYW55LgorLy8gKnJnYiBidWZmZXIgc2hvdWxkIGhhdmUgYSBzaXplIG9mIGF0IGxlYXN0IGhlaWdodCAqIHJnYl9zdHJpZGUuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydFJHQigKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSk7CisvLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydFJHQkEoCisgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSk7CisvLyBTYW1lLCBidXQgZm9yIFJHQkEgYnVmZmVyLiBJbXBvcnRzIHRoZSBSR0IgZGlyZWN0IGZyb20gdGhlIDMyLWJpdCBmb3JtYXQKKy8vIGlucHV0IGJ1ZmZlciBpZ25vcmluZyB0aGUgYWxwaGEgY2hhbm5lbC4gQXZvaWRzIG5lZWRpbmcgdG8gY29weSB0aGUgZGF0YQorLy8gdG8gYSB0ZW1wb3JhcnkgMjQtYml0IFJHQiBidWZmZXIgdG8gaW1wb3J0IHRoZSBSR0Igb25seS4KK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiByZ2J4LCBpbnQgcmdieF9zdHJpZGUpOworCisvLyBWYXJpYW50cyBvZiB0aGUgYWJvdmUsIGJ1dCB0YWtpbmcgQkdSKEF8WCkgaW5wdXQuCitXRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0QkdSKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3IsIGludCBiZ3Jfc3RyaWRlKTsKK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3JhLCBpbnQgYmdyYV9zdHJpZGUpOworV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydEJHUlgoCisgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIGJncngsIGludCBiZ3J4X3N0cmlkZSk7CisKKy8vIENvbnZlcnRzIHBpY3R1cmUtPmFyZ2IgZGF0YSB0byB0aGUgWVVWNDIwQSBmb3JtYXQuIFRoZSAnY29sb3JzcGFjZScKKy8vIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUgZXF1YWwgdG8gV0VCUF9ZVVY0MjAuCisvLyBVcG9uIHJldHVybiwgcGljdHVyZS0+dXNlX2FyZ2IgaXMgc2V0IHRvIGZhbHNlLiBUaGUgcHJlc2VuY2Ugb2YgcmVhbAorLy8gbm9uLW9wYXF1ZSB0cmFuc3BhcmVudCB2YWx1ZXMgaXMgZGV0ZWN0ZWQsIGFuZCAnY29sb3JzcGFjZScgd2lsbCBiZQorLy8gYWRqdXN0ZWQgYWNjb3JkaW5nbHkuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBsb3NzeS4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK1dFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY0NTUCAvKmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMCovKTsKKworLy8gU2FtZSBhcyBXZWJQUGljdHVyZUFSR0JUb1lVVkEoKSwgYnV0IHRoZSBjb252ZXJzaW9uIGlzIGRvbmUgdXNpbmcKKy8vIHBzZXVkby1yYW5kb20gZGl0aGVyaW5nIHdpdGggYSBzdHJlbmd0aCAnZGl0aGVyaW5nJyBiZXR3ZWVuCisvLyAwLjAgKG5vIGRpdGhlcmluZykgYW5kIDEuMCAobWF4aW11bSBkaXRoZXJpbmcpLiBUaGlzIGlzIHVzZWZ1bAorLy8gZm9yIHBob3RvZ3JhcGhpYyBwaWN0dXJlLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUFSR0JUb1lVVkFEaXRoZXJlZCgKKyAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgV2ViUEVuY0NTUCBjb2xvcnNwYWNlLCBmbG9hdCBkaXRoZXJpbmcpOworCisvLyBQZXJmb3JtcyAnc21hcnQnIFJHQkEtPllVVkE0MjAgZG93bnNhbXBsaW5nIGFuZCBjb2xvcnNwYWNlIGNvbnZlcnNpb24uCisvLyBEb3duc2FtcGxpbmcgaXMgaGFuZGxlZCB3aXRoIGV4dHJhIGNhcmUgaW4gY2FzZSBvZiBjb2xvciBjbGlwcGluZy4gVGhpcworLy8gbWV0aG9kIGlzIHJvdWdobHkgMnggc2xvd2VyIHRoYW4gV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKCkgYnV0IHByb2R1Y2VzIGJldHRlcgorLy8gWVVWIHJlcHJlc2VudGF0aW9uLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVNtYXJ0QVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIENvbnZlcnRzIHBpY3R1cmUtPnl1diB0byBwaWN0dXJlLT5hcmdiIGFuZCBzZXRzIHBpY3R1cmUtPnVzZV9hcmdiIHRvIHRydWUuCisvLyBUaGUgaW5wdXQgZm9ybWF0IG11c3QgYmUgWVVWXzQyMCBvciBZVVZfNDIwQS4KKy8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgbWV0aG9kIGlzIGRpc2NvdXJhZ2VkIGlmIG9uZSBoYXMgYWNjZXNzIHRvIHRoZQorLy8gcmF3IEFSR0Igc2FtcGxlcywgc2luY2UgdXNpbmcgWVVWNDIwIGlzIGNvbXBhcmF0aXZlbHkgbG9zc3kuIEFsc28sIHRoZQorLy8gY29udmVyc2lvbiBmcm9tIFlVVjQyMCB0byBBUkdCIGluY3VycyBhIHNtYWxsIGxvc3MgdG9vLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVlVVkFUb0FSR0IoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLyBIZWxwZXIgZnVuY3Rpb246IGdpdmVuIGEgd2lkdGggeCBoZWlnaHQgcGxhbmUgb2YgUkdCQSBvciBZVVYoQSkgc2FtcGxlcworLy8gY2xlYW4tdXAgdGhlIFlVViBvciBSR0Igc2FtcGxlcyB1bmRlciBmdWxseSB0cmFuc3BhcmVudCBhcmVhLCB0byBoZWxwCisvLyBjb21wcmVzc2liaWxpdHkgKG5vIGd1YXJhbnRlZSwgdGhvdWdoKS4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKworLy8gU2NhbiB0aGUgcGljdHVyZSAncGljdHVyZScgZm9yIHRoZSBwcmVzZW5jZSBvZiBub24gZnVsbHkgb3BhcXVlIGFscGhhIHZhbHVlcy4KKy8vIFJldHVybnMgdHJ1ZSBpbiBzdWNoIGNhc2UuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlIChpbmRpY2F0aW5nIHRoYXQgdGhlCisvLyBhbHBoYSBwbGFuZSBjYW4gYmUgaWdub3JlZCBhbHRvZ2V0aGVyIGUuZy4pLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFJlbW92ZSB0aGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIChpZiBwcmVzZW50KSBieSBibGVuZGluZyB0aGUgY29sb3Igd2l0aAorLy8gdGhlIGJhY2tncm91bmQgY29sb3IgJ2JhY2tncm91bmRfcmdiJyAoc3BlY2lmaWVkIGFzIDI0Yml0IFJHQiB0cmlwbGV0KS4KKy8vIEFmdGVyIHRoaXMgY2FsbCwgYWxsIGFscGhhIHZhbHVlcyBhcmUgcmVzZXQgdG8gMHhmZi4KK1dFQlBfRVhURVJOKHZvaWQpIFdlYlBCbGVuZEFscGhhKFdlYlBQaWN0dXJlKiBwaWMsIHVpbnQzMl90IGJhY2tncm91bmRfcmdiKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gY2FsbAorCisvLyBNYWluIGVuY29kaW5nIGNhbGwsIGFmdGVyIGNvbmZpZyBhbmQgcGljdHVyZSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisvLyAncGljdHVyZScgbXVzdCBiZSBsZXNzIHRoYW4gMTYzODR4MTYzODQgaW4gZGltZW5zaW9uIChjZiBXRUJQX01BWF9ESU1FTlNJT04pLAorLy8gYW5kIHRoZSAnY29uZmlnJyBvYmplY3QgbXVzdCBiZSBhIHZhbGlkIG9uZS4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuCisvLyBJbiBjYXNlIG9mIGVycm9yLCBwaWN0dXJlLT5lcnJvcl9jb2RlIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisvLyAncGljdHVyZScgY2FuIGhvbGQgdGhlIHNvdXJjZSBzYW1wbGVzIGluIGJvdGggWVVWKEEpIG9yIEFSR0IgaW5wdXQsIGRlcGVuZGluZworLy8gb24gdGhlIHZhbHVlIG9mICdwaWN0dXJlLT51c2VfYXJnYicuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UKKy8vIHRoZSBmb3JtZXIgZm9yIGxvc3N5IGVuY29kaW5nLCBhbmQgdGhlIGxhdHRlciBmb3IgbG9zc2xlc3MgZW5jb2RpbmcKKy8vICh3aGVuIGNvbmZpZy5sb3NzbGVzcyBpcyB0cnVlKS4gQXV0b21hdGljIGNvbnZlcnNpb24gZnJvbSBvbmUgZm9ybWF0IHRvCisvLyBhbm90aGVyIGlzIHByb3ZpZGVkIGJ1dCB0aGV5IGJvdGggaW5jdXIgc29tZSBsb3NzLgorV0VCUF9FWFRFUk4oaW50KSBXZWJQRW5jb2RlKGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZywgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9XRUJQX0VOQ09ERV9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAzMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBJbnRlcm5hbCBoZWFkZXIgZm9yIGNvbnN0YW50cyByZWxhdGVkIHRvIFdlYlAgZmlsZSBmb3JtYXQuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfV0VCUF9GT1JNQVRfQ09OU1RBTlRTX0hfCisjZGVmaW5lIENIUk9NSVVNX1dFQlBfV0VCUF9GT1JNQVRfQ09OU1RBTlRTX0hfCisKKy8vIENyZWF0ZSBmb3VyY2Mgb2YgdGhlIGNodW5rIGZyb20gdGhlIGNodW5rIHRhZyBjaGFyYWN0ZXJzLgorI2RlZmluZSBNS0ZPVVJDQyhhLCBiLCBjLCBkKSAoKGEpIHwgKGIpIDw8IDggfCAoYykgPDwgMTYgfCAodWludDMyX3QpKGQpIDw8IDI0KQorCisvLyBWUDggcmVsYXRlZCBjb25zdGFudHMuCisjZGVmaW5lIFZQOF9TSUdOQVRVUkUgMHg5ZDAxMmEgICAgICAgICAgICAgIC8vIFNpZ25hdHVyZSBpbiBWUDggZGF0YS4KKyNkZWZpbmUgVlA4X01BWF9QQVJUSVRJT04wX1NJWkUgKDEgPDwgMTkpICAgLy8gbWF4IHNpemUgb2YgbW9kZSBwYXJ0aXRpb24KKyNkZWZpbmUgVlA4X01BWF9QQVJUSVRJT05fU0laRSAgKDEgPDwgMjQpICAgLy8gbWF4IHNpemUgZm9yIHRva2VuIHBhcnRpdGlvbgorI2RlZmluZSBWUDhfRlJBTUVfSEVBREVSX1NJWkUgMTAgIC8vIFNpemUgb2YgdGhlIGZyYW1lIGhlYWRlciB3aXRoaW4gVlA4IGRhdGEuCisKKy8vIFZQOEwgcmVsYXRlZCBjb25zdGFudHMuCisjZGVmaW5lIFZQOExfU0lHTkFUVVJFX1NJWkUgICAgICAgICAgMSAgICAgIC8vIFZQOEwgc2lnbmF0dXJlIHNpemUuCisjZGVmaW5lIFZQOExfTUFHSUNfQllURSAgICAgICAgICAgICAgMHgyZiAgIC8vIFZQOEwgc2lnbmF0dXJlIGJ5dGUuCisjZGVmaW5lIFZQOExfSU1BR0VfU0laRV9CSVRTICAgICAgICAgMTQgICAgIC8vIE51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lkdGggYW5kIGhlaWdodC4KKyNkZWZpbmUgVlA4TF9WRVJTSU9OX0JJVFMgICAgICAgICAgICAzICAgICAgLy8gMyBiaXRzIHJlc2VydmVkIGZvciB2ZXJzaW9uLgorI2RlZmluZSBWUDhMX1ZFUlNJT04gICAgICAgICAgICAgICAgIDAgICAgICAvLyB2ZXJzaW9uIDAKKyNkZWZpbmUgVlA4TF9GUkFNRV9IRUFERVJfU0laRSAgICAgICA1ICAgICAgLy8gU2l6ZSBvZiB0aGUgVlA4TCBmcmFtZSBoZWFkZXIuCisKKyNkZWZpbmUgTUFYX1BBTEVUVEVfU0laRSAgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTUFYX0NBQ0hFX0JJVFMgICAgICAgICAgICAgICAxMQorI2RlZmluZSBIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREUgIDUKKyNkZWZpbmUgQVJHQl9CTEFDSyAgICAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisKKyNkZWZpbmUgREVGQVVMVF9DT0RFX0xFTkdUSCAgICAgICAgICA4CisjZGVmaW5lIE1BWF9BTExPV0VEX0NPREVfTEVOR1RIICAgICAgMTUKKworI2RlZmluZSBOVU1fTElURVJBTF9DT0RFUyAgICAgICAgICAgIDI1NgorI2RlZmluZSBOVU1fTEVOR1RIX0NPREVTICAgICAgICAgICAgIDI0CisjZGVmaW5lIE5VTV9ESVNUQU5DRV9DT0RFUyAgICAgICAgICAgNDAKKyNkZWZpbmUgQ09ERV9MRU5HVEhfQ09ERVMgICAgICAgICAgICAxOQorCisjZGVmaW5lIE1JTl9IVUZGTUFOX0JJVFMgICAgICAgICAgICAgMiAgLy8gbWluIG51bWJlciBvZiBIdWZmbWFuIGJpdHMKKyNkZWZpbmUgTUFYX0hVRkZNQU5fQklUUyAgICAgICAgICAgICA5ICAvLyBtYXggbnVtYmVyIG9mIEh1ZmZtYW4gYml0cworCisjZGVmaW5lIFRSQU5TRk9STV9QUkVTRU5UICAgICAgICAgICAgMSAgLy8gVGhlIGJpdCB0byBiZSB3cml0dGVuIHdoZW4gbmV4dCBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYmUgcmVhZCBpcyBhIHRyYW5zZm9ybS4KKyNkZWZpbmUgTlVNX1RSQU5TRk9STVMgICAgICAgICAgICAgICA0ICAvLyBNYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIHRyYW5zZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGEgYml0c3RyZWFtLgordHlwZWRlZiBlbnVtIHsKKyAgUFJFRElDVE9SX1RSQU5TRk9STSAgICAgID0gMCwKKyAgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNICAgID0gMSwKKyAgU1VCVFJBQ1RfR1JFRU4gICAgICAgICAgID0gMiwKKyAgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNID0gMworfSBWUDhMSW1hZ2VUcmFuc2Zvcm1UeXBlOworCisvLyBBbHBoYSByZWxhdGVkIGNvbnN0YW50cy4KKyNkZWZpbmUgQUxQSEFfSEVBREVSX0xFTiAgICAgICAgICAgIDEKKyNkZWZpbmUgQUxQSEFfTk9fQ09NUFJFU1NJT04gICAgICAgIDAKKyNkZWZpbmUgQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04gIDEKKyNkZWZpbmUgQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUyAgIDEKKworLy8gTXV4IHJlbGF0ZWQgY29uc3RhbnRzLgorI2RlZmluZSBUQUdfU0laRSAgICAgICAgICAgNCAgICAgLy8gU2l6ZSBvZiBhIGNodW5rIHRhZyAoZS5nLiAiVlA4TCIpLgorI2RlZmluZSBDSFVOS19TSVpFX0JZVEVTICAgNCAgICAgLy8gU2l6ZSBuZWVkZWQgdG8gc3RvcmUgY2h1bmsncyBzaXplLgorI2RlZmluZSBDSFVOS19IRUFERVJfU0laRSAgOCAgICAgLy8gU2l6ZSBvZiBhIGNodW5rIGhlYWRlci4KKyNkZWZpbmUgUklGRl9IRUFERVJfU0laRSAgIDEyICAgIC8vIFNpemUgb2YgdGhlIFJJRkYgaGVhZGVyICgiUklGRm5ubm5XRUJQIikuCisjZGVmaW5lIEFOTUZfQ0hVTktfU0laRSAgICAxNiAgICAvLyBTaXplIG9mIGFuIEFOTUYgY2h1bmsuCisjZGVmaW5lIEFOSU1fQ0hVTktfU0laRSAgICA2ICAgICAvLyBTaXplIG9mIGFuIEFOSU0gY2h1bmsuCisjZGVmaW5lIEZSR01fQ0hVTktfU0laRSAgICA2ICAgICAvLyBTaXplIG9mIGEgRlJHTSBjaHVuay4KKyNkZWZpbmUgVlA4WF9DSFVOS19TSVpFICAgIDEwICAgIC8vIFNpemUgb2YgYSBWUDhYIGNodW5rLgorCisjZGVmaW5lIE1BWF9DQU5WQVNfU0laRSAgICAgKDEgPDwgMjQpICAgICAvLyAyNC1iaXQgbWF4IGZvciBWUDhYIHdpZHRoL2hlaWdodC4KKyNkZWZpbmUgTUFYX0lNQUdFX0FSRUEgICAgICAoMVVMTCA8PCAzMikgIC8vIDMyLWJpdCBtYXggZm9yIHdpZHRoIHggaGVpZ2h0LgorI2RlZmluZSBNQVhfTE9PUF9DT1VOVCAgICAgICgxIDw8IDE2KSAgICAgLy8gbWF4aW11bSB2YWx1ZSBmb3IgbG9vcC1jb3VudAorI2RlZmluZSBNQVhfRFVSQVRJT04gICAgICAgICgxIDw8IDI0KSAgICAgLy8gbWF4aW11bSBkdXJhdGlvbgorI2RlZmluZSBNQVhfUE9TSVRJT05fT0ZGU0VUICgxIDw8IDI0KSAgICAgLy8gbWF4aW11bSBmcmFtZS9mcmFnbWVudCB4L3kgb2Zmc2V0CisKKy8vIE1heGltdW0gY2h1bmsgcGF5bG9hZCBpcyBzdWNoIHRoYXQgYWRkaW5nIHRoZSBoZWFkZXIgYW5kIHBhZGRpbmcgd29uJ3QKKy8vIG92ZXJmbG93IGEgdWludDMyX3QuCisjZGVmaW5lIE1BWF9DSFVOS19QQVlMT0FEICh+MFUgLSBDSFVOS19IRUFERVJfU0laRSAtIDEpCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9XRUJQX0ZPUk1BVF9DT05TVEFOVFNfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlid2VicC90aGlyZF9wYXJ0eS9jaHJvbWl1bV9oZWFkbGVzcy9saWJ3ZWJwL3dlYnAvbXV4X3R5cGVzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL211eF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODAwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL211eF90eXBlcy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBEYXRhLXR5cGVzIGNvbW1vbiB0byB0aGUgbXV4IGFuZCBkZW11eCBsaWJyYXJpZXMuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfV0VCUF9NVVhfVFlQRVNfSF8KKyNkZWZpbmUgQ0hST01JVU1fV0VCUF9XRUJQX01VWF9UWVBFU19IXworCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmcmVlKCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4gIC8vIG1lbXNldCgpCisjaW5jbHVkZSAidGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKKy8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCisvLyB0eXBlZGVmIGVudW0gV2ViUEZlYXR1cmVGbGFncyBXZWJQRmVhdHVyZUZsYWdzOworLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltRGlzcG9zZSBXZWJQTXV4QW5pbURpc3Bvc2U7CisvLyB0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1CbGVuZCBXZWJQTXV4QW5pbUJsZW5kOwordHlwZWRlZiBzdHJ1Y3QgV2ViUERhdGEgV2ViUERhdGE7CisKKy8vIFZQOFggRmVhdHVyZSBGbGFncy4KK3R5cGVkZWYgZW51bSBXZWJQRmVhdHVyZUZsYWdzIHsKKyAgRlJBR01FTlRTX0ZMQUcgID0gMHgwMDAwMDAwMSwKKyAgQU5JTUFUSU9OX0ZMQUcgID0gMHgwMDAwMDAwMiwKKyAgWE1QX0ZMQUcgICAgICAgID0gMHgwMDAwMDAwNCwKKyAgRVhJRl9GTEFHICAgICAgID0gMHgwMDAwMDAwOCwKKyAgQUxQSEFfRkxBRyAgICAgID0gMHgwMDAwMDAxMCwKKyAgSUNDUF9GTEFHICAgICAgID0gMHgwMDAwMDAyMAorfSBXZWJQRmVhdHVyZUZsYWdzOworCisvLyBEaXNwb3NlIG1ldGhvZCAoYW5pbWF0aW9uIG9ubHkpLiBJbmRpY2F0ZXMgaG93IHRoZSBhcmVhIHVzZWQgYnkgdGhlIGN1cnJlbnQKKy8vIGZyYW1lIGlzIHRvIGJlIHRyZWF0ZWQgYmVmb3JlIHJlbmRlcmluZyB0aGUgbmV4dCBmcmFtZSBvbiB0aGUgY2FudmFzLgordHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltRGlzcG9zZSB7CisgIFdFQlBfTVVYX0RJU1BPU0VfTk9ORSwgICAgICAgLy8gRG8gbm90IGRpc3Bvc2UuCisgIFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCAgLy8gRGlzcG9zZSB0byBiYWNrZ3JvdW5kIGNvbG9yLgorfSBXZWJQTXV4QW5pbURpc3Bvc2U7CisKKy8vIEJsZW5kIG9wZXJhdGlvbiAoYW5pbWF0aW9uIG9ubHkpLiBJbmRpY2F0ZXMgaG93IHRyYW5zcGFyZW50IHBpeGVscyBvZiB0aGUKKy8vIGN1cnJlbnQgZnJhbWUgYXJlIGJsZW5kZWQgd2l0aCB0aG9zZSBvZiB0aGUgcHJldmlvdXMgY2FudmFzLgordHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltQmxlbmQgeworICBXRUJQX01VWF9CTEVORCwgICAgICAgICAgICAgIC8vIEJsZW5kLgorICBXRUJQX01VWF9OT19CTEVORCAgICAgICAgICAgIC8vIERvIG5vdCBibGVuZC4KK30gV2ViUE11eEFuaW1CbGVuZDsKKworLy8gRGF0YSB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgJ3JhdycgZGF0YSwgZS5nLiwgY2h1bmsgZGF0YQorLy8gKElDQyBwcm9maWxlLCBtZXRhZGF0YSkgYW5kIFdlYlAgY29tcHJlc3NlZCBpbWFnZSBkYXRhLgorc3RydWN0IFdlYlBEYXRhIHsKKyAgY29uc3QgdWludDhfdCogYnl0ZXM7CisgIHNpemVfdCBzaXplOworfTsKKworLy8gSW5pdGlhbGl6ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSAnd2VicF9kYXRhJyBvYmplY3Qgd2l0aCBkZWZhdWx0IHZhbHVlcy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBEYXRhSW5pdChXZWJQRGF0YSogd2VicF9kYXRhKSB7CisgIGlmICh3ZWJwX2RhdGEgIT0gTlVMTCkgeworICAgIG1lbXNldCh3ZWJwX2RhdGEsIDAsIHNpemVvZigqd2VicF9kYXRhKSk7CisgIH0KK30KKworLy8gQ2xlYXJzIHRoZSBjb250ZW50cyBvZiB0aGUgJ3dlYnBfZGF0YScgb2JqZWN0IGJ5IGNhbGxpbmcgZnJlZSgpLiBEb2VzIG5vdAorLy8gZGVhbGxvY2F0ZSB0aGUgb2JqZWN0IGl0c2VsZi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdlYlBEYXRhQ2xlYXIoV2ViUERhdGEqIHdlYnBfZGF0YSkgeworICBpZiAod2VicF9kYXRhICE9IE5VTEwpIHsKKyAgICBmcmVlKCh2b2lkKil3ZWJwX2RhdGEtPmJ5dGVzKTsKKyAgICBXZWJQRGF0YUluaXQod2VicF9kYXRhKTsKKyAgfQorfQorCisvLyBBbGxvY2F0ZXMgbmVjZXNzYXJ5IHN0b3JhZ2UgZm9yICdkc3QnIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mICdzcmMnLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFdlYlBEYXRhQ29weShjb25zdCBXZWJQRGF0YSogc3JjLCBXZWJQRGF0YSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisgIFdlYlBEYXRhSW5pdChkc3QpOworICBpZiAoc3JjLT5ieXRlcyAhPSBOVUxMICYmIHNyYy0+c2l6ZSAhPSAwKSB7CisgICAgZHN0LT5ieXRlcyA9ICh1aW50OF90KiltYWxsb2Moc3JjLT5zaXplKTsKKyAgICBpZiAoZHN0LT5ieXRlcyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICBtZW1jcHkoKHZvaWQqKWRzdC0+Ynl0ZXMsIHNyYy0+Ynl0ZXMsIHNyYy0+c2l6ZSk7CisgICAgZHN0LT5zaXplID0gc3JjLT5zaXplOworICB9CisgIHJldHVybiAxOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogQ0hST01JVU1fV0VCUF9XRUJQX01VWF9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ3ZWJwL3RoaXJkX3BhcnR5L2Nocm9taXVtX2hlYWRsZXNzL2xpYndlYnAvd2VicC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMTg0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L2xpYndlYnAvdGhpcmRfcGFydHkvY2hyb21pdW1faGVhZGxlc3MvbGlid2VicC93ZWJwL3R5cGVzLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBDb21tb24gdHlwZXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIENIUk9NSVVNX1dFQlBfV0VCUF9UWVBFU19IXworI2RlZmluZSBDSFJPTUlVTV9XRUJQX1dFQlBfVFlQRVNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAgLy8gZm9yIHNpemVfdAorCisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pIHx8IFwKKyAgICAoZGVmaW5lZChfX1NURENfVkVSU0lPTl9fKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwpCisjZGVmaW5lIFdFQlBfSU5MSU5FIGlubGluZQorI2Vsc2UKKyNkZWZpbmUgV0VCUF9JTkxJTkUKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgc2lnbmVkICAgY2hhciBpbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkICAgc2hvcnQgaW50MTZfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCAgIGludCBpbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgdWludDY0X3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpbnQgaW50NjRfdDsKKyNkZWZpbmUgV0VCUF9JTkxJTkUgX19mb3JjZWlubGluZQorI2VuZGlmICAvKiBfTVNDX1ZFUiAqLworCisjaWZuZGVmIFdFQlBfRVhURVJOCisvLyBUaGlzIGV4cGxpY2l0bHkgbWFya3MgbGlicmFyeSBmdW5jdGlvbnMgYW5kIGFsbG93cyBmb3IgY2hhbmdpbmcgdGhlCisvLyBzaWduYXR1cmUgZm9yIGUuZy4sIFdpbmRvd3MgRExMIGJ1aWxkcy4KKyNkZWZpbmUgV0VCUF9FWFRFUk4odHlwZSkgZXh0ZXJuIHR5cGUKKyNlbmRpZiAgLyogV0VCUF9FWFRFUk4gKi8KKworLy8gTWFjcm8gdG8gY2hlY2sgQUJJIGNvbXBhdGliaWxpdHkgKHNhbWUgbWFqb3IgcmV2aXNpb24gbnVtYmVyKQorI2RlZmluZSBXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUoYSwgYikgKCgoYSkgPj4gOCkgIT0gKChiKSA+PiA4KSkKKworI2VuZGlmICAvKiBDSFJPTUlVTV9XRUJQX1dFQlBfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlieG1sMi5tayBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbGlieG1sMi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGYwNWNjCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9saWJ4bWwyLm1rCkBAIC0wLDAgKzEsMTUgQEAKKyMgQnVpbGQgcnVsZXMgZm9yIHByZWJ1aWx0IGxpYnhtbDIgc3RhdGljIGxpYnJhcnkKKworTElCWE1MMl9UT1BfRElSIDo9ICQoTElCWE1MMl9QUkVCVUlMVFNfRElSKS8kKEJVSUxEX1RBUkdFVF9UQUcpCisKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSwgXAorICAgIGVtdWxhdG9yLWxpYnhtbDIsIFwKKyAgICAkKExJQlhNTDJfVE9QX0RJUikvbGliL2xpYnhtbDIuYSkKKworIyBSZXF1aXJlZCBvbiBXaW5kb3dzIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvZGUgd2lsbCBsaW5rIGFnYWluc3QgYSBzdGF0aWMKKyMgdmVyc2lvbiBvZiBsaWJ4bWwyLiBPdGhlcndpc2UsIHRoZSBsaW5rZXIgY29tcGxhaW5zIGFib3V0IHVuZGVmaW5lZAorIyByZWZlcmVuY2VzIHRvICdfaW1wX194bWxGcmVlJy4KK0xJQlhNTDJfQ0ZMQUdTIDo9IC1ETElCWE1MX1NUQVRJQworCitMSUJYTUwyX0lOQ0xVREVTIDo9ICQoTElCWE1MMl9UT1BfRElSKS9pbmNsdWRlCitMSUJYTUwyX1NUQVRJQ19MSUJSQVJJRVMgOj0gZW11bGF0b3ItbGlieG1sMgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvUkVBRE1FIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MGVmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L21pbmktZ2xpYi9SRUFETUUKQEAgLTAsMCArMSw2IEBACitUaGlzIGlzIGEgdGlueSByZXBsYWNlbWVudCBmb3IgdGhlIEdMaWIgbGlicmFyeSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYnVpbGRpbmcKK3RoZSBBbmRyb2lkIGVtdWxhdG9yLgorCitUaGlzIG1heSBiZSByZXBsYWNlZCBpbiB0aGUgZnV0dXJlIGJ5IGEgZnVsbCBHTGliIHNvdXJjZSB0cmVlLCBidXQgdGhpcworaW50cm9kdWNlcyBzZXZlcmFsIHN1YnRsZSBpc3N1ZXMgaW4gdGhlIGVtdWxhdG9yIGJ1aWxkLCB3aGljaCBhcmUgYmV0dGVyCithdm9pZGVkIGZvciBub3cuCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L21pbmktZ2xpYi9pbmNsdWRlL2dsaWIuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbWluaS1nbGliL2luY2x1ZGUvZ2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMjJiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L21pbmktZ2xpYi9pbmNsdWRlL2dsaWIuaApAQCAtMCwwICsxLDIxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpZm5kZWYgR0xJQl9ICisjZGVmaW5lIEdMSUJfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8vIFR5cGVzCisKK3R5cGVkZWYgY2hhciBnY2hhcjsKK3R5cGVkZWYgaW50IGdpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBndWludDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZ3VzaG9ydDsKK3R5cGVkZWYgaW50IGdib29sZWFuOwordHlwZWRlZiB2b2lkKiBncG9pbnRlcjsKK3R5cGVkZWYgY29uc3Qgdm9pZCogZ2NvbnN0cG9pbnRlcjsKKworI2RlZmluZSBUUlVFICAxCisjZGVmaW5lIEZBTFNFIDAKKwordHlwZWRlZiB2b2lkICgqR0Z1bmMpKGdwb2ludGVyIGRhdGEsIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3R5cGVkZWYgaW50ICgqR0NvbXBhcmVGdW5jKShnY29uc3Rwb2ludGVyIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NvbnN0cG9pbnRlciBiKTsKKwordHlwZWRlZiBpbnQgKCpHQ29tcGFyZURhdGFGdW5jKShnY29uc3Rwb2ludGVyIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordHlwZWRlZiBnYm9vbGVhbiAoKkdFcXVhbEZ1bmMpKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKwordHlwZWRlZiBndWludCAoKkdIYXNoRnVuYykoZ2NvbnN0cG9pbnRlciBrZXkpOworCit0eXBlZGVmIHZvaWQgKCpHSEZ1bmMpKGdwb2ludGVyIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpHSFJGdW5jKShncG9pbnRlciBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKworLy8gQ29uc3RhbnRzLgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIEdfRElSX1NFUEFSQVRPUl9TICJcXCIKKyNlbHNlCisjZGVmaW5lIEdfRElSX1NFUEFSQVRPUl9TICAiLyIKKyNlbmRpZgorCisvLyBUZXN0aW5nCisKKy8vIFRPRE8oZGlnaXQpOiBUdXJuIGFzc2VydGlvbnMgb24uCisKK3ZvaWQgZ19jcml0aWNhbChjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKK3ZvaWQgZ19wYW5pYyhjb25zdCBjaGFyKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKKworI2RlZmluZSBnX2Fzc2VydChjb25kaXRpb24pICBkbyB7IFwKKyAgICBpZiAoIShjb25kaXRpb24pKSB7IFwKKyAgICAgIGdfcGFuaWMoIiVzOiVkOiBBc3NlcnRpb24gZmFpbHVyZTogJXNcbiIsIFwKKyAgICAgICAgICAgICAgX19GSUxFX18sIFwKKyAgICAgICAgICAgICAgX19MSU5FX18sIFwKKyAgICAgICAgICAgICAgI2NvbmRpdGlvbik7IFwKKyAgICAgIH0gXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGdfYXNzZXJ0X25vdF9yZWFjaGVkKCkgIFwKKyAgICBnX3BhbmljKCIlczolZDogQXNzZXJ0aW9uIGZhaWx1cmU6IE5PVCBSRUFDSEVEXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pCisKKy8vIEhlYXAgYWxsb2NhdGlvbi4KK3ZvaWQqIGdfbWFsbG9jKHNpemVfdCBzaXplKTsKK3ZvaWQqIGdfbWFsbG9jMChzaXplX3Qgc2l6ZSk7Cit2b2lkKiBnX3JlYWxsb2Modm9pZCogcHRyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGdfZnJlZSh2b2lkKiBwdHIpOworCisjZGVmaW5lIGdfbmV3KHR5cGUsIGNvdW50KSAgICAgICAgICgodHlwZSopIGdfbWFsbG9jKHNpemVvZih0eXBlKSAqIChjb3VudCkpKQorI2RlZmluZSBnX25ldzAodHlwZSwgY291bnQpICAgICAgICAoKHR5cGUqKSBnX21hbGxvYzAoc2l6ZW9mKHR5cGUpICogKGNvdW50KSkpCisKKyNkZWZpbmUgZ19yZW5ldyh0eXBlLCBtZW0sIGNvdW50KSAgXAorICAgICgodHlwZSopIGdfcmVhbGxvYygobWVtKSwgc2l6ZW9mKHR5cGUpICogKGNvdW50KSkpCisKKy8vIFN0cmluZ3MuCitpbnQgZ192YXNwcmludGYoY2hhcioqIHN0ciwgY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFyZ3MpOworY2hhciogZ19zdHJkdXAoY29uc3QgY2hhciogc3RyKTsKK2NoYXIqIGdfc3RybmR1cChjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBzaXplKTsKK2NoYXIqIGdfc3RyZHVwX3ByaW50Zihjb25zdCBjaGFyKiBmbXQsIC4uLik7CitjaGFyKiBnX3N0cmR1cF92cHJpbnRmKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKKworY2hhcioqIGdfc3Ryc3BsaXQoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBzZXAsIGludCBtYXhfdG9rZW5zKTsKK3ZvaWQgZ19zdHJmcmVldihjaGFyKiogc3RyaW5ncyk7CisKK2dib29sZWFuIGdfc3RyX2VxdWFsKGNvbnN0IHZvaWQqIHMxLCBjb25zdCB2b2lkKiBzMik7CitndWludCBnX3N0cl9oYXNoKGNvbnN0IHZvaWQqIHN0cik7CisKKy8vIEF0b21pYyBvcGVyYXRpb25zCisKK3ZvaWQgZ19hdG9taWNfaW50X2luYyhpbnQgdm9sYXRpbGUqIGF0b21pYyk7CisKK2dib29sZWFuIGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QoaW50IHZvbGF0aWxlKiBhdG9taWMpOworCisvLyBTaW5nbGUtbGlua2VkIGxpc3RzCisKK3R5cGVkZWYgc3RydWN0IF9HU0xpc3QgeworICB2b2lkKiBkYXRhOworICBzdHJ1Y3QgX0dTTGlzdCogbmV4dDsKK30gR1NMaXN0OworCit2b2lkIGdfc2xpc3RfZnJlZShHU0xpc3QqIGxpc3QpOworR1NMaXN0KiBnX3NsaXN0X2xhc3QoR1NMaXN0KiBsaXN0KTsKK0dTTGlzdCogZ19zbGlzdF9maW5kKEdTTGlzdCogbGlzdCwgZ2NvbnN0cG9pbnRlciBkYXRhKTsKK0dTTGlzdCogZ19zbGlzdF9hcHBlbmQoR1NMaXN0KiBsaXN0LCBncG9pbnRlciBkYXRhKTsKK0dTTGlzdCogZ19zbGlzdF9wcmVwZW5kKEdTTGlzdCogbGlzdCwgZ3BvaW50ZXIgZGF0YSk7CitHU0xpc3QqIGdfc2xpc3RfcmVtb3ZlKEdTTGlzdCogbGlzdCwgZ2NvbnN0cG9pbnRlciBkYXRhKTsKK3ZvaWQgZ19zbGlzdF9mb3JlYWNoKEdTTGlzdCogbGlzdCwgR0Z1bmMgZnVuYywgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK0dTTGlzdCogZ19zbGlzdF9zb3J0KEdTTGlzdCogbGlzdCwgR0NvbXBhcmVGdW5jIGNvbXBhcmVfZnVuYyk7CisKKy8vIEhhc2ggdGFibGVzCisKK3R5cGVkZWYgc3RydWN0IF9HSGFzaFRhYmxlIEdIYXNoVGFibGU7CisKK0dIYXNoVGFibGUqIGdfaGFzaF90YWJsZV9uZXcoR0hhc2hGdW5jIGhhc2hfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VxdWFsRnVuYyBrZXlfZXF1YWxfZnVuYyk7CisKK3ZvaWQgZ19oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSk7CisKK3ZvaWQgZ19oYXNoX3RhYmxlX2luc2VydChHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB2YWx1ZSk7CisKK3ZvaWQqIGdfaGFzaF90YWJsZV9sb29rdXAoR0hhc2hUYWJsZSogaGFzaF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoga2V5KTsKKworZ2Jvb2xlYW4gZ19oYXNoX3RhYmxlX3JlbW92ZShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGtleSk7CisKK3ZvaWQgZ19oYXNoX3RhYmxlX2ZvcmVhY2goR0hhc2hUYWJsZSogaGFzaF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0hGdW5jIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK2dwb2ludGVyIGdfaGFzaF90YWJsZV9maW5kKEdIYXNoVGFibGUqIGhhc2hfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHSFJGdW5jIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisKK2d1aW50IGdfaGFzaF90YWJsZV9zaXplKEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCitHSGFzaFRhYmxlKiBnX2hhc2hfdGFibGVfcmVmKEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCit2b2lkIGdfaGFzaF90YWJsZV91bnJlZihHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKTsKKworCisvLyBRdWV1ZXMKKwordHlwZWRlZiBzdHJ1Y3QgX0dRdWV1ZU5vZGUgR1F1ZXVlTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0dRdWV1ZSB7CisgIEdRdWV1ZU5vZGUqIGhlYWQ7CisgIEdRdWV1ZU5vZGUqIHRhaWw7CisgIGd1aW50IGxlbmd0aDsKK30gR1F1ZXVlOworCitHUXVldWUqIGdfcXVldWVfbmV3KHZvaWQpOworCit2b2lkIGdfcXVldWVfZnJlZShHUXVldWUqIHF1ZXVlKTsKKwordm9pZCBnX3F1ZXVlX3B1c2hfdGFpbChHUXVldWUqIHF1ZXVlLCB2b2lkKiBkYXRhKTsKKwordm9pZCogZ19xdWV1ZV9wZWVrX2hlYWQoR1F1ZXVlKiBxdWV1ZSk7CisKK3ZvaWQqIGdfcXVldWVfcG9wX2hlYWQoR1F1ZXVlKiBxdWV1ZSk7CisKK2dib29sZWFuIGdfcXVldWVfaXNfZW1wdHkoR1F1ZXVlKiBxdWV1ZSk7CisKKyNpZmRlZiBfV0lOMzIKK2NoYXIqIGdfd2luMzJfZXJyb3JfbWVzc2FnZShpbnQgZXJyb3IpOworI2VuZGlmCisKKy8vIEdTb3VyY2UgZXRjLi4uCisKKy8vIE9wYXF1ZSBkYXRhIHR5cGUuCit0eXBlZGVmIHN0cnVjdCBHU291cmNlIEdTb3VyY2U7CisKK3R5cGVkZWYgZ2Jvb2xlYW4gKCpHU291cmNlRnVuYykoZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBnYm9vbGVhbiAoKnByZXBhcmUpKEdTb3VyY2UqIHNvdXJjZSwgZ2ludCogdGltZW91dCk7CisgIGdib29sZWFuICgqY2hlY2spKEdTb3VyY2UqIHNvdXJjZSk7CisgIGdib29sZWFuICgqZGlzcGF0Y2gpKEdTb3VyY2UqIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgR1NvdXJjZUZ1bmMgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7CisgIHZvaWQgKCpmaW5hbGl6ZSkoR1NvdXJjZSogc291cmNlKTsKK30gR1NvdXJjZUZ1bmNzOworCit0eXBlZGVmIHN0cnVjdCBHUG9sbEZEIHsKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChfX0xQNjRfXykKKyAgaW50NjRfdCBmZDsKKyNlbHNlCisgIGludCBmZDsKKyNlbmRpZgorICBndXNob3J0IGV2ZW50czsKKyAgZ3VzaG9ydCByZXZlbnRzOworfSBHUG9sbEZEOworCisjZW5kaWYgIC8vIEdMSUJfSApkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc291cmNlcy5tYWtlIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc291cmNlcy5tYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjQxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L21pbmktZ2xpYi9zb3VyY2VzLm1ha2UKQEAgLTAsMCArMSwyMiBAQAorIyBJbmNsdWRlZCBmcm9tIHRvcC1sZXZlbCBNYWtlZmlsZS5jb21tb24KKworT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitNSU5JR0xJQl9ESVIgOj0gJChMT0NBTF9QQVRIKQorTUlOSUdMSUJfSU5DTFVERVMgOj0gJChNSU5JR0xJQl9ESVIpL2luY2x1ZGUKK01JTklHTElCX1NUQVRJQ19MSUJSQVJJRVMgOj0gZW11bGF0b3ItbWluaWdsaWIKKworJChjYWxsIHN0YXJ0LWVtdWxhdG9yLWxpYnJhcnksZW11bGF0b3ItbWluaWdsaWIpCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChNSU5JR0xJQl9JTkNMVURFUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IHNyYy9nbGliLW1pbmkuYworCitpZmVxICgkKEJVSUxEX1RBUkdFVF9PUyksd2luZG93cykKK0xPQ0FMX1NSQ19GSUxFUyArPSBzcmMvZ2xpYi1taW5pLXdpbjMyLmMKK2VuZGlmCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc3JjL2dsaWItbWluaS13aW4zMi5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc3JjL2dsaWItbWluaS13aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTMwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L21pbmktZ2xpYi9zcmMvZ2xpYi1taW5pLXdpbjMyLmMKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKy8vIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisvLyBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyNpZmRlZiBfV0lOMzIKKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHdjaGFyLmg+CisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vIEF0b21pYyBvcGVyYXRpb25zCisKK3ZvaWQgZ19hdG9taWNfaW50X2luYyhpbnQgdm9sYXRpbGUqIGF0b21pYykgeworICBhc3NlcnQoc2l6ZW9mKExPTkcpID09IHNpemVvZihpbnQpKTsKKyAgSW50ZXJsb2NrZWRJbmNyZW1lbnQoKExPTkcgdm9sYXRpbGUqKWF0b21pYyk7Cit9CisKK2dib29sZWFuIGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QoaW50IHZvbGF0aWxlKiBhdG9taWMpIHsKKyAgYXNzZXJ0KHNpemVvZihMT05HKSA9PSBzaXplb2YoaW50KSk7CisgIHJldHVybiAhSW50ZXJsb2NrZWRJbmNyZW1lbnQoKExPTkcgdm9sYXRpbGUqKWF0b21pYyk7Cit9CisKKy8vIFdpbjMyIGVycm9yIG1lc3NhZ2VzLgorCitzdGF0aWMgY2hhcioKK3V0ZjE2X3RvX3V0ZjgoY29uc3Qgd2NoYXJfdCogd3N0cmluZywgaW50IHdzdHJpbmdfbGVuKQoreworICBpbnQgdXRmOF9sZW4gPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsICAgICAgICAgIC8vIENvZGVQYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gZHdGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFdTVFIpIHdzdHJpbmcsIC8vIGxwV2lkZUNoYXJTdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3RyaW5nX2xlbiwgICAgICAvLyBjY2hXaWRlQ2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgIC8vIGxwTXVsdGlCeXRlU3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gY2JNdWx0aUJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAvLyBscERlZmF1bHRDaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgICAgICAgICAgLy8gbHBVc2VkRGVmYXVsdENoYXIKKyAgaWYgKHV0ZjhfbGVuID09IDApCisgICAgcmV0dXJuIGdfc3RyZHVwKCIiKTsKKworICBjaGFyKiByZXN1bHQgPSBnX21hbGxvYyh1dGY4X2xlbiArIDEpOworCisgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgKExQV1NUUikgd3N0cmluZywgd3N0cmluZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCB1dGY4X2xlbiwgTlVMTCwgTlVMTCk7CisgIHJlc3VsdFt1dGY4X2xlbl0gPSAnXDAnOworICByZXR1cm4gcmVzdWx0OworfQorCitjaGFyICoKK2dfd2luMzJfZXJyb3JfbWVzc2FnZSAoaW50IGVycm9yKQoreworICBMUFdTVFIgbXNnID0gTlVMTDsKKyAgaW50IG5jaGFyczsKKyAgY2hhciogcmVzdWx0OworCisgIC8vIFdvcmsgYXJvdW5kIGZvciBjb21waWxlciB3YXJuaW5nLCBkdWUgdG8gYnJhaW4tZGVhZCBBUEkuCisgIHVuaW9uIHsKKyAgICBMUFdTVFIqIGFkZHJlc3M7CisgICAgTFBXU1RSICB2YWx1ZTsKKyAgfSBtc2dfcGFyYW07CisgIG1zZ19wYXJhbS5hZGRyZXNzID0gJm1zZzsKKworICBGb3JtYXRNZXNzYWdlVyhGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIKKyAgICAgICAgICAgICAgICAgfEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTCisgICAgICAgICAgICAgICAgIHxGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICAgTlVMTCwgZXJyb3IsIDAsCisgICAgICAgICAgICAgICAgIG1zZ19wYXJhbS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgMCwgTlVMTCk7CisgIGlmICghbXNnKQorICAgIHJldHVybiBnX3N0cmR1cCgiIik7CisKKyAgLy8gR2V0IHJpZCBvZiB0cmFpbGluZyBcclxuIGlmIGFueS4KKyAgbmNoYXJzID0gd2NzbGVuIChtc2cpOworICBpZiAobmNoYXJzID4gMiAmJiBtc2dbbmNoYXJzLTFdID09ICdcbicgJiYgbXNnW25jaGFycy0yXSA9PSAnXHInKQorICAgIG1zZ1tuY2hhcnMtMl0gPSAnXDAnOworCisgIHJlc3VsdCA9IHV0ZjE2X3RvX3V0ZjggKG1zZywgbmNoYXJzKTsKKworICBMb2NhbEZyZWUgKG1zZyk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmICAvLyBfV0lOMzIKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvbWluaS1nbGliL3NyYy9nbGliLW1pbmkuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvbWluaS1nbGliL3NyYy9nbGliLW1pbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzMxNzhiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9taW5pLWdsaWIvc3JjL2dsaWItbWluaS5jCkBAIC0wLDAgKzEsNzU5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworLy8gTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKy8vIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisvLworLy8gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisvLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorLy8gTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorLy8gR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworI2luY2x1ZGUgPGdsaWIuaD4KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFByaW50IGEgcGFuaWMgbWVzc2FnZSB0aGVuIGV4aXQgdGhlIHByb2dyYW0gaW1tZWRpYXRlbHkuCit2b2lkIGdfY3JpdGljYWwoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIkNSSVRJQ0FMOiAiKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgZ19wYW5pYyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiUEFOSUM6ICIpOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgZXhpdCgxKTsKK30KKworLy8gSGVhcCBhbGxvY2F0aW9uLgorCit2b2lkKiBnX21hbGxvYyhzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA9PSAwKQorICAgIHJldHVybiBOVUxMOworCisgIHZvaWQqIHB0ciA9IG1hbGxvYyhzaXplKTsKKyAgaWYgKHB0ciA9PSBOVUxMKQorICAgIGdfcGFuaWMoIkNhbid0IGFsbG9jYXRlICV6dSBieXRlcyFcbiIsIHNpemUpOworCisgIHJldHVybiBwdHI7Cit9CisKKwordm9pZCogZ19tYWxsb2MwKHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0ciA9IGdfbWFsbG9jKHNpemUpOworICBpZiAocHRyID09IE5VTEwpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CisgIHJldHVybiBwdHI7Cit9CisKKwordm9pZCogZ19yZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIGdfZnJlZShwdHIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHZvaWQqIG5ld19wdHIgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisgIGlmIChuZXdfcHRyID09IE5VTEwpCisgICAgZ19wYW5pYygiQ2FuJ3QgcmVhbGxvY2F0ZSBwb2ludGVyICVwIHRvICV6dSBieXRlcyFcbiIsIHB0ciwgc2l6ZSk7CisKKyAgcmV0dXJuIG5ld19wdHI7Cit9CisKKwordm9pZCBnX2ZyZWUodm9pZCogcHRyKSB7CisgIGlmIChwdHIpCisgICAgZnJlZShwdHIpOworfQorCisvLyBTdHJpbmdzLgorCitjaGFyKiBnX3N0cmR1cChjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHN0ciA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworCisgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKKyAgY2hhciogY29weSA9IGdfbWFsbG9jKGxlbiArIDEpOworICBtZW1jcHkoY29weSwgc3RyLCBsZW4gKyAxKTsKKyAgcmV0dXJuIGNvcHk7Cit9CisKKworY2hhciogZ19zdHJuZHVwKGNvbnN0IGNoYXIqIHN0ciwgc2l6ZV90IHNpemUpIHsKKyAgY29uc3QgY2hhciAqZW5kID0gbWVtY2hyKHN0ciwgMCwgc2l6ZSk7CisgIGNoYXIgKmNvcHk7CisKKyAgaWYgKGVuZCkKKyAgICBzaXplID0gZW5kIC0gc3RyOworCisgIGNvcHkgPSBnX21hbGxvYyhzaXplICsgMSk7CisgIG1lbWNweShjb3B5LCBzdHIsIHNpemUpOworICBjb3B5W3NpemVdID0gMDsKKyAgcmV0dXJuIGNvcHk7Cit9CisKKworY2hhciogZ19zdHJkdXBfcHJpbnRmKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGNoYXIqIHJlc3VsdDsKKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICBnX3Zhc3ByaW50ZigmcmVzdWx0LCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworY2hhciogZ19zdHJkdXBfdnByaW50Zihjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncykgeworICBjaGFyKiByZXN1bHQ7CisgIGdfdmFzcHJpbnRmKCZyZXN1bHQsIGZtdCwgYXJncyk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworaW50IGdfdmFzcHJpbnRmKGNoYXIqKiBzdHIsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKSB7CisjaWZkZWYgX1dJTjMyCisgIC8vIE9uIFdpbjMyLCB2c25wcmludGYoKSBpcyBicm9rZW4gYW5kIGFsd2F5cyByZXR1cm5zIC0xIGluIGNhc2Ugb2YgdHJ1bmNhdGlvbiwKKyAgLy8gc28gbWFrZSBhbiBlZHVjYXRlZCBndWVzcywgYW5kIHRyeSBhZ2FpbiBpZiB0aGF0IGZhaWxzIHdpdGggYSBsYXJnZXIgcG9vbC4KKyAgc2l6ZV90IGNhcGFjaXR5ID0gMTI4OworICBjaGFyKiBidWZmZXIgPSBnX21hbGxvYyhjYXBhY2l0eSk7CisgIGZvciAoOzspIHsKKyAgICB2YV9saXN0IGFyZ3MyOworICAgIHZhX2NvcHkoYXJnczIsIGFyZ3MpOworICAgIGludCBsZW4gPSB2c25wcmludGYoYnVmZmVyLCBjYXBhY2l0eSwgZm10LCBhcmdzMik7CisgICAgaWYgKGxlbiA+PSAwKSB7CisgICAgICAqc3RyID0gYnVmZmVyOworICAgICAgcmV0dXJuIGxlbjsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MyKTsKKworICAgIGNhcGFjaXR5ICo9IDI7CisgICAgaWYgKGNhcGFjaXR5ID4gSU5UX01BWCkKKyAgICAgIGdfcGFuaWMoIkZvcm1hdHRlZCBzdHJpbmcgaXMgdG9vIGxvbmchXG4iKTsKKworICAgIGJ1ZmZlciA9IGdfcmVhbGxvYyhidWZmZXIsIGNhcGFjaXR5KTsKKyAgfQorI2Vsc2UKKyAgLy8gT24gb3RoZXIgc3lzdGVtcywgdnNucHJpbnRmKCkgd29ya3MgcHJvcGVybHkgYW5kIHJldHVybnMgdGhlIHNpemUgb2YgdGhlCisgIC8vIGZvcm1hdHRlZCBzdHJpbmcgd2l0aG91dCB0cnVuY2F0aW9uLgorICB2YV9saXN0IGFyZ3MyOworICB2YV9jb3B5KGFyZ3MyLCBhcmdzKTsKKyAgaW50IGxlbiA9IHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFyZ3MyKTsKKyAgdmFfZW5kKGFyZ3MyKTsKKyAgaWYgKGxlbiA8IDApCisgICAgZ19wYW5pYygiQ2FuJ3QgZm9ybWF0IHN0cmluZyFcbiIpOworCisgIGNoYXIqIHJlc3VsdCA9IGdfbWFsbG9jKGxlbiArIDEpOworICB2YV9jb3B5KGFyZ3MyLCBhcmdzKTsKKyAgdnNucHJpbnRmKHJlc3VsdCwgKHNpemVfdClsZW4sIGZtdCwgYXJnczIpOworICB2YV9lbmQoYXJnczIpOworCisgICpzdHIgPSByZXN1bHQ7CisgIHJldHVybiBsZW47CisjZW5kaWYKK30KKworY2hhcioqIGdfc3Ryc3BsaXQoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBkZWxpbSwgaW50IG1heF90b2tlbnMpIHsKKyAgLy8gU2FuaXR5IGNoZWNrcy4KKyAgaWYgKCFzdHJpbmcgfHwgIWRlbGltIHx8ICEqZGVsaW0pCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKG1heF90b2tlbnMgPCAxKQorICAgIG1heF90b2tlbnMgPSBJTlRfTUFYOworCisgIC8vIENyZWF0ZSBlbXB0eSBsaXN0IG9mIHJlc3VsdHMuCisgIEdTTGlzdCogc3RyaW5nX2xpc3QgPSBOVUxMOworICBndWludCBuID0gMDsKKworICBpZiAoKnN0cmluZykgeworICAgIC8vIElucHV0IGxpc3QgaXMgbm90IGVtcHR5LCBzbyB0cnkgdG8gc3BsaXQgaXQuCisgICAgY29uc3QgY2hhciogcmVtYWluZGVyID0gc3RyaW5nOworICAgIGNvbnN0IGNoYXIqIHMgPSBzdHJzdHIocmVtYWluZGVyLCBkZWxpbSk7CisgICAgaWYgKHMpIHsKKyAgICAgIHNpemVfdCBkZWxpbV9sZW4gPSBzdHJsZW4oZGVsaW0pOworICAgICAgd2hpbGUgKC0tbWF4X3Rva2VucyAmJiBzKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzIC0gcmVtYWluZGVyOworICAgICAgICBzdHJpbmdfbGlzdCA9IGdfc2xpc3RfcHJlcGVuZChzdHJpbmdfbGlzdCwgZ19zdHJuZHVwKHJlbWFpbmRlciwgbGVuKSk7CisgICAgICAgIG4rKzsKKyAgICAgICAgcmVtYWluZGVyID0gcyArIGRlbGltX2xlbjsKKyAgICAgICAgcyA9IHN0cnN0cihyZW1haW5kZXIsIGRlbGltKTsKKyAgICAgIH0KKyAgICB9CisgICAgbisrOworICAgIHN0cmluZ19saXN0ID0gZ19zbGlzdF9wcmVwZW5kKHN0cmluZ19saXN0LCBnX3N0cmR1cChyZW1haW5kZXIpKTsKKyAgfQorCisgIC8vIENvbnZlcnQgbGlzdCBpbnRvIE5VTEwtdGVybWluYXRlZCB2ZWN0b3IuCisgIGNoYXIqKiByZXN1bHQgPSBnX25ldyhjaGFyKiwgbiArIDEpOworICByZXN1bHRbbi0tXSA9IE5VTEw7CisgIEdTTGlzdCogc2xpc3QgPSBzdHJpbmdfbGlzdDsKKyAgd2hpbGUgKHNsaXN0KSB7CisgICAgcmVzdWx0W24tLV0gPSBzbGlzdC0+ZGF0YTsKKyAgICBzbGlzdCA9IHNsaXN0LT5uZXh0OworICB9CisgIGdfc2xpc3RfZnJlZShzdHJpbmdfbGlzdCk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBnX3N0cmZyZWV2KGNoYXIqKiBzdHJpbmdzKSB7CisgIGd1aW50IG47CisgIGZvciAobiA9IDA7IHN0cmluZ3Nbbl07ICsrbikgeworICAgIGdfZnJlZShzdHJpbmdzW25dKTsKKyAgfQorICBnX2ZyZWUoc3RyaW5ncyk7Cit9CisKK2dib29sZWFuIGdfc3RyX2VxdWFsKGNvbnN0IHZvaWQqIHYxLCBjb25zdCB2b2lkKiB2MikgeworICByZXR1cm4gIXN0cmNtcCgoY29uc3QgY2hhciopdjEsIChjb25zdCBjaGFyKil2Mik7Cit9CisKK2d1aW50IGdfc3RyX2hhc2goY29uc3Qgdm9pZCogc3RyKSB7CisgIGNvbnN0IHNpZ25lZCBjaGFyKiBwID0gc3RyOworICBndWludCBoYXNoID0gNTM4MVU7CisKKyAgZm9yICg7ICpwOyArK3ApCisgICAgaGFzaCA9IChoYXNoIDw8IDUpICsgaGFzaCArIChndWludCkqcDsKKworICByZXR1cm4gaGFzaDsKK30KKworLy8gU2luZ2xlLWxpbmtlZCBsaXN0CisKK3N0YXRpYyBHU0xpc3QqIF9nX3NsaXN0X2FsbG9jKHZvaWQpIHsKKyAgcmV0dXJuIChHU0xpc3QqKSBnX21hbGxvYyhzaXplb2YoR1NMaXN0KSk7Cit9CisKK3ZvaWQgZ19zbGlzdF9mcmVlKEdTTGlzdCogbGlzdCkgeworICB3aGlsZSAobGlzdCkgeworICAgIEdTTGlzdCogbmV4dCA9IGxpc3QtPm5leHQ7CisgICAgZ19mcmVlKGxpc3QpOworICAgIGxpc3QgPSBuZXh0OworICB9Cit9CisKK0dTTGlzdCogZ19zbGlzdF9sYXN0KEdTTGlzdCogbGlzdCkgeworICB3aGlsZSAobGlzdCAmJiBsaXN0LT5uZXh0KQorICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICByZXR1cm4gbGlzdDsKK30KKworR1NMaXN0KiBnX3NsaXN0X2ZpbmQoR1NMaXN0KiBsaXN0LCBjb25zdCB2b2lkKiBkYXRhKSB7CisgIHdoaWxlIChsaXN0KSB7CisgICAgaWYgKGxpc3QtPmRhdGEgPT0gZGF0YSkKKyAgICAgIGJyZWFrOworICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICB9CisgIHJldHVybiBsaXN0OworfQorCitHU0xpc3QqIGdfc2xpc3RfYXBwZW5kKEdTTGlzdCogbGlzdCwgdm9pZCogZGF0YSkgeworICBHU0xpc3QqIG5ld19saXN0ID0gX2dfc2xpc3RfYWxsb2MoKTsKKyAgbmV3X2xpc3QtPmRhdGEgPSBkYXRhOworICBuZXdfbGlzdC0+bmV4dCA9IE5VTEw7CisKKyAgaWYgKCFsaXN0KQorICAgIHJldHVybiBuZXdfbGlzdDsKKworICBHU0xpc3QqIGxhc3QgPSBnX3NsaXN0X2xhc3QobGlzdCk7CisgIGxhc3QtPm5leHQgPSBuZXdfbGlzdDsKKyAgcmV0dXJuIGxpc3Q7Cit9CisKK0dTTGlzdCogZ19zbGlzdF9wcmVwZW5kKEdTTGlzdCogbGlzdCwgdm9pZCogZGF0YSkgeworICBHU0xpc3QqIG5ld19saXN0ID0gX2dfc2xpc3RfYWxsb2MoKTsKKyAgbmV3X2xpc3QtPmRhdGEgPSBkYXRhOworICBuZXdfbGlzdC0+bmV4dCA9IGxpc3Q7CisgIHJldHVybiBuZXdfbGlzdDsKK30KKworR1NMaXN0KiBnX3NsaXN0X3JlbW92ZShHU0xpc3QqIGxpc3QsIGNvbnN0IHZvaWQqIGRhdGEpIHsKKyAgR1NMaXN0KiogcG5vZGUgPSAmbGlzdDsKKyAgZm9yICg7OykgeworICAgIEdTTGlzdCogbm9kZSA9ICpwbm9kZTsKKyAgICBpZiAoIW5vZGUpCisgICAgICBicmVhazsKKyAgICBpZiAobm9kZS0+ZGF0YSA9PSBkYXRhKSB7CisgICAgICAqcG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgZ19zbGlzdF9mcmVlKG5vZGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBub2RlID0gJm5vZGUtPm5leHQ7CisgIH0KKyAgcmV0dXJuIGxpc3Q7Cit9CisKK3ZvaWQgZ19zbGlzdF9mb3JlYWNoKEdTTGlzdCogbGlzdCwgR0Z1bmMgZnVuYywgdm9pZCogdXNlcl9kYXRhKSB7CisgIHdoaWxlIChsaXN0KSB7CisgICAgR1NMaXN0KiBuZXh0ID0gbGlzdC0+bmV4dDsKKyAgICAoKmZ1bmMpKGxpc3QtPmRhdGEsIHVzZXJfZGF0YSk7CisgICAgbGlzdCA9IG5leHQ7CisgIH0KK30KKworLy8gCitzdGF0aWMgR1NMaXN0KiBnX3NsaXN0X3NvcnRfbWVyZ2UoR1NMaXN0KiBsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU0xpc3QqIGwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGdW5jIGNvbXBhcmVfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKKyAgR1NMaXN0KiBsaXN0ID0gTlVMTDsKKyAgR1NMaXN0KiogdGFpbCA9ICZsaXN0OworCisgIHdoaWxlIChsMSAmJiBsMikgeworICAgIGludCBjbXAgPSAoKEdDb21wYXJlRGF0YUZ1bmMpIGNvbXBhcmVfZnVuYykobDEtPmRhdGEsIGwyLT5kYXRhLCB1c2VyX2RhdGEpOworICAgIGlmIChjbXAgPD0gMCkgeworICAgICAgKnRhaWwgPSBsMTsKKyAgICAgIHRhaWwgPSAmbDEtPm5leHQ7CisgICAgICBsMSA9IGwxLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAqdGFpbCA9IGwyOworICAgICAgdGFpbCA9ICZsMi0+bmV4dDsKKyAgICAgIGwyID0gbDItPm5leHQ7CisgICAgfQorICB9CisgICp0YWlsID0gbDEgPyBsMSA6IGwyOworCisgIHJldHVybiBsaXN0OworfQorCitzdGF0aWMgR1NMaXN0KiBnX3NsaXN0X3NvcnRfcmVhbChHU0xpc3QqIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRnVuYyBjb21wYXJlX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKKworICBpZiAoIWxpc3QpCisgICAgcmV0dXJuIE5VTEw7CisgIGlmICghbGlzdC0+bmV4dCkKKyAgICByZXR1cm4gbGlzdDsKKworICAvLyBTcGxpdCBsaXN0IGludG8gdHdvIGhhbHZlcy4KKyAgR1NMaXN0KiBsMSA9IGxpc3Q7CisgIEdTTGlzdCogbDIgPSBsaXN0LT5uZXh0OworCisgIHdoaWxlIChsMi0+bmV4dCAmJiBsMi0+bmV4dC0+bmV4dCkgeworICAgIGwyID0gbDItPm5leHQtPm5leHQ7CisgICAgbDEgPSBsMS0+bmV4dDsKKyAgfQorICBsMiA9IGwxLT5uZXh0OworICBsMS0+bmV4dCA9IE5VTEw7CisKKyAgcmV0dXJuIGdfc2xpc3Rfc29ydF9tZXJnZSgKKyAgICAgIGdfc2xpc3Rfc29ydF9yZWFsKGxpc3QsIGNvbXBhcmVfZnVuYywgdXNlcl9kYXRhKSwKKyAgICAgIGdfc2xpc3Rfc29ydF9yZWFsKGwyLCBjb21wYXJlX2Z1bmMsIHVzZXJfZGF0YSksCisgICAgICBjb21wYXJlX2Z1bmMsCisgICAgICB1c2VyX2RhdGEpOworfQorCitHU0xpc3QqIGdfc2xpc3Rfc29ydChHU0xpc3QqIGxpc3QsIEdDb21wYXJlRnVuYyBjb21wYXJlX2Z1bmMpIHsKKyAgcmV0dXJuIGdfc2xpc3Rfc29ydF9yZWFsKGxpc3QsIChHRnVuYykgY29tcGFyZV9mdW5jLCBOVUxMKTsKK30KKworLy8gQXRvbWljIG9wZXJhdGlvbnMKKworI2lmICFfV0lOMzIKKy8vIE5vdGU6IFdpbmRvd3MgaW1wbGVtZW50YXRpb24gaW4gZ2xpYi1taW5pLXdpbjMyLmMKKwordm9pZCBnX2F0b21pY19pbnRfaW5jKGludCB2b2xhdGlsZSogYXRvbWljKSB7CisgIF9fc3luY19mZXRjaF9hbmRfYWRkKGF0b21pYywgMSk7Cit9CisKK2dib29sZWFuIGdfYXRvbWljX2ludF9kZWNfYW5kX3Rlc3QoaW50IHZvbGF0aWxlKiBhdG9taWMpIHsKKyAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKGF0b21pYywgLTEpID09IDE7Cit9CisjZW5kaWYgIC8vICFfV0lOMzIKKworLy8gSGFzaCBUYWJsZXMKKworLy8gVGhpcyBpcyBhIHJhdGhlciB2YW5pbGxhIGltcGxlbWVudGF0aW9uLCBzbGlnaHRseSBzaW1wbGVyCisvLyB0aGFuIHRoZSBHTGliIG9uZSwgc2luY2UgUUVNVSBkb2Vzbid0IHJlcXVpcmUgdGhlIGZ1bGwgZmVhdHVyZXM6CisvLworLy8gLSBVc2VzIGEgc2luZ2xlIGR5bmFtaWMgYXJyYXkgb2YgKGtleSx2YWx1ZSxoYXNoKSB0dXBsZXMuCisvLyAtIEFycmF5IGNhcGFjaXR5IGlzIGFsd2F5cyAyXk4KKy8vIC0gTm8gdXNlIG9mIG1vZHVsbyBwcmltZXMgZm9yIHNpbXBsaWNpdHksIHdlIGRvbid0IGV4cGVjdAorLy8gICBRRU1VL1FBUEkgdG8gZGVnZW5lcmF0ZSBoZXJlLgorLy8gLSBEdW1iIGNvbnRhaW5lciBvbmx5OiBkb2Vzbid0IG93biBhbmQgZnJlZSBrZXlzIGFuZCB2YWx1ZXMuCisvLyAtIE5vIG9wdGltaXphdGlvbiBmb3Igc2V0cyAoaS5lLiB3aGVuIGtleSA9PSB2YWx1ZSBmb3IgZWFjaCBlbnRyeSkuCisvLyAtIE5vIGl0ZXJhdG9ycy4KKy8vCit0eXBlZGVmIHN0cnVjdCB7CisgIGdwb2ludGVyIGtleTsKKyAgZ3BvaW50ZXIgdmFsdWU7CisgIGd1aW50ICAgIGhhc2g7Cit9IEdIYXNoRW50cnk7CisKKyNkZWZpbmUgSEFTSF9VTlVTRUQgICAgMCAgIC8vIE11c3QgYmUgMCwgc2VlIF9yZW1vdmVfYWxsKCkgYmVsb3cuCisjZGVmaW5lIEhBU0hfVE9NQlNUT05FIDEKKyNkZWZpbmUgSEFTSF9JU19SRUFMKGgpICAoKGgpID49IDIpCisKKyNkZWZpbmUgSEFTSF9NSU5fU0hJRlQgIDMKKyNkZWZpbmUgSEFTSF9NSU5fQ0FQQUNJVFkgICgxIDw8IEhBU0hfTUlOX1NISUZUKQorCisjZGVmaW5lIEhBU0hfTE9BRF9TQ0FMRSAxMDI0CisjZGVmaW5lIEhBU0hfTUlOX0xPQUQgICAyNTYKKyNkZWZpbmUgSEFTSF9NQVhfTE9BRCAgIDc2OAorCitzdHJ1Y3QgX0dIYXNoVGFibGUgeworICBpbnQgcmVmX2NvdW50OworICBpbnQgbnVtX2l0ZW1zOworICBpbnQgbnVtX3VzZWQ7ICAvLyBjb3VudCBvZiBpdGVtcyArIHRvbWJzdG9uZXMKKyAgaW50IGNhcGFjaXR5OworICBHSGFzaEVudHJ5KiBlbnRyaWVzOworICBHSGFzaEZ1bmMgaGFzaF9mdW5jOworICBHRXF1YWxGdW5jIGtleV9lcXVhbF9mdW5jOworfTsKKworLy8gRGVmYXVsdCBoYXNoIGZ1bmN0aW9uIGZvciBwb2ludGVycy4KK3N0YXRpYyBndWludCBfZ3BvaW50ZXJfaGFzaChnY29uc3Rwb2ludGVyIGtleSkgeworICAgIHJldHVybiAoZ3VpbnQpKHVpbnRwdHJfdClrZXk7Cit9CisKKy8vIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgYSBnaXZlbiBrZXkuCitzdGF0aWMgaW5saW5lIHNpemVfdAorX2dfaGFzaF90YWJsZV9oYXNoKEdIYXNoVGFibGUqIHRhYmxlLCBnY29uc3Rwb2ludGVyIGtleSkgeworICBzaXplX3QgaGFzaCA9IHRhYmxlLT5oYXNoX2Z1bmMoa2V5KTsKKyAgcmV0dXJuIEhBU0hfSVNfUkVBTChoYXNoKSA/IGhhc2ggOiAyOworfQorCisKK0dIYXNoVGFibGUqIGdfaGFzaF90YWJsZV9uZXcoR0hhc2hGdW5jIGhhc2hfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VxdWFsRnVuYyBrZXlfZXF1YWxfZnVuYykgeworICBHSGFzaFRhYmxlKiBoYXNoX3RhYmxlID0gZ19uZXcwKEdIYXNoVGFibGUsIDEpOworCisgIGhhc2hfdGFibGUtPnJlZl9jb3VudCA9IDE7CisgIGhhc2hfdGFibGUtPm51bV9pdGVtcyA9IDA7CisgIGhhc2hfdGFibGUtPmNhcGFjaXR5ID0gSEFTSF9NSU5fQ0FQQUNJVFk7CisgIGhhc2hfdGFibGUtPmVudHJpZXMgPSBnX25ldzAoR0hhc2hFbnRyeSwgaGFzaF90YWJsZS0+Y2FwYWNpdHkpOworICBoYXNoX3RhYmxlLT5oYXNoX2Z1bmMgPSBoYXNoX2Z1bmMgPyBoYXNoX2Z1bmMgOiAmX2dwb2ludGVyX2hhc2g7CisgIGhhc2hfdGFibGUtPmtleV9lcXVhbF9mdW5jID0ga2V5X2VxdWFsX2Z1bmM7CisKKyAgcmV0dXJuIGhhc2hfdGFibGU7Cit9CisKKworc3RhdGljIHZvaWQgX2dfaGFzaF90YWJsZV9yZW1vdmVfYWxsKEdIYXNoVGFibGUqIGhhc2hfdGFibGUpIHsKKyAgLy8gTk9URTogVGhpcyB1c2VzIHRoZSBmYWN0IHRoYXQgSEFTSF9VTlVTRUQgaXMgMCEKKyAgaGFzaF90YWJsZS0+bnVtX2l0ZW1zID0gMDsKKyAgbWVtc2V0KGhhc2hfdGFibGUtPmVudHJpZXMsCisgICAgICAgICAwLAorICAgICAgICAgc2l6ZW9mKGhhc2hfdGFibGUtPmVudHJpZXNbMF0pICogaGFzaF90YWJsZS0+Y2FwYWNpdHkpOworfQorCisKK0dIYXNoVGFibGUqIGdfaGFzaF90YWJsZV9yZWYoR0hhc2hUYWJsZSogaGFzaF90YWJsZSkgeworICBpZiAoIWhhc2hfdGFibGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgZ19hdG9taWNfaW50X2luYygmaGFzaF90YWJsZS0+cmVmX2NvdW50KTsKKyAgcmV0dXJuIGhhc2hfdGFibGU7Cit9CisKKwordm9pZCBnX2hhc2hfdGFibGVfdW5yZWYoR0hhc2hUYWJsZSogaGFzaF90YWJsZSkgeworICBpZiAoIWhhc2hfdGFibGUpCisgICAgcmV0dXJuOworCisgIGlmICghZ19hdG9taWNfaW50X2RlY19hbmRfdGVzdCgmaGFzaF90YWJsZS0+cmVmX2NvdW50KSkKKyAgICByZXR1cm47CisKKyAgX2dfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGhhc2hfdGFibGUpOworCisgIGdfZnJlZShoYXNoX3RhYmxlLT5lbnRyaWVzKTsKKyAgaGFzaF90YWJsZS0+Y2FwYWNpdHkgPSAwOworICBoYXNoX3RhYmxlLT5lbnRyaWVzID0gTlVMTDsKKworICBnX2ZyZWUoaGFzaF90YWJsZSk7Cit9CisKKwordm9pZCBnX2hhc2hfdGFibGVfZGVzdHJveShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKSB7CisgIGlmICghaGFzaF90YWJsZSkKKyAgICByZXR1cm47CisKKyAgX2dfaGFzaF90YWJsZV9yZW1vdmVfYWxsKGhhc2hfdGFibGUpOworICBnX2hhc2hfdGFibGVfdW5yZWYoaGFzaF90YWJsZSk7Cit9CisKKworLy8gUHJvYmUgdGhlIGhhc2ggdGFibGUgZm9yIHxrZXl8LiBJZiBpdCBpcyBpbiB0aGUgdGFibGUsIHJldHVybiB0aGUgaW5kZXgKKy8vIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LiBPdGhlcndpc2UsIHJldHVybiB0aGUgaW5kZXggb2YgYW4gdW51c2VkCisvLyBvciB0b21ic3RvbmUgZW50cnkuIEFsc28gc2V0cyB8KmtleV9oYXNofCB0byB0aGUga2V5IGhhc2ggdmFsdWUgb24KKy8vIHJldHVybi4KK3N0YXRpYyBndWludCBfZ19oYXNoX3RhYmxlX2xvb2t1cF9pbmRleChHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb25zdHBvaW50ZXIga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50KiBrZXlfaGFzaCkgeworICBndWludCBoYXNoID0gX2dfaGFzaF90YWJsZV9oYXNoKGhhc2hfdGFibGUsIGtleSk7CisgICprZXlfaGFzaCA9IGhhc2g7CisKKyAgZ3VpbnQgcHJvYmVfbWFzayA9IChoYXNoX3RhYmxlLT5jYXBhY2l0eSAtIDEpOworICBnaW50IHRvbWJzdG9uZSA9IC0xOworICBndWludCBwcm9iZV9pbmRleCA9IGhhc2ggJiBwcm9iZV9tYXNrOworICBndWludCBzdGVwID0gMDsKKworICBHSGFzaEVudHJ5KiBwcm9iZSA9ICZoYXNoX3RhYmxlLT5lbnRyaWVzW3Byb2JlX2luZGV4XTsKKyAgd2hpbGUgKHByb2JlLT5oYXNoICE9IEhBU0hfVU5VU0VEKSB7CisgICAgaWYgKHByb2JlLT5oYXNoID09IGhhc2gpIHsKKyAgICAgIGlmIChoYXNoX3RhYmxlLT5rZXlfZXF1YWxfZnVuYykgeworICAgICAgICBpZiAoaGFzaF90YWJsZS0+a2V5X2VxdWFsX2Z1bmMocHJvYmUtPmtleSwga2V5KSkKKyAgICAgICAgICByZXR1cm4gcHJvYmVfaW5kZXg7CisgICAgICB9IGVsc2UgaWYgKHByb2JlLT5rZXkgPT0ga2V5KSB7CisgICAgICAgIHJldHVybiBwcm9iZV9pbmRleDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHByb2JlLT5oYXNoID09IEhBU0hfVE9NQlNUT05FICYmIHRvbWJzdG9uZSA8IDApIHsKKyAgICAgIHRvbWJzdG9uZSA9IChpbnQpcHJvYmVfaW5kZXg7CisgICAgfQorCisgICAgc3RlcCsrOworICAgIHByb2JlX2luZGV4ID0gKHByb2JlX2luZGV4ICsgc3RlcCkgJiBwcm9iZV9tYXNrOworICAgIHByb2JlID0gJmhhc2hfdGFibGUtPmVudHJpZXNbcHJvYmVfaW5kZXhdOworICB9CisKKyAgaWYgKHRvbWJzdG9uZSA+PSAwKQorICAgIHJldHVybiAoZ3VpbnQpdG9tYnN0b25lOworCisgIHJldHVybiBwcm9iZV9pbmRleDsKK30KKworCit2b2lkKiBnX2hhc2hfdGFibGVfbG9va3VwKEdIYXNoVGFibGUqIGhhc2hfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGtleSkgeworICBndWludCBrZXlfaGFzaCA9IEhBU0hfVU5VU0VEOworICBndWludCBwcm9iZV9pbmRleCA9IF9nX2hhc2hfdGFibGVfbG9va3VwX2luZGV4KGhhc2hfdGFibGUsIGtleSwgJmtleV9oYXNoKTsKKyAgR0hhc2hFbnRyeSogZW50cnkgPSAmaGFzaF90YWJsZS0+ZW50cmllc1twcm9iZV9pbmRleF07CisKKyAgcmV0dXJuIEhBU0hfSVNfUkVBTChlbnRyeS0+aGFzaCkgPyBlbnRyeS0+dmFsdWUgOiBOVUxMOworfQorCisKKy8vIFJlbW92ZSBrZXkvdmFsdWUgcGFpciBhdCBpbmRleCBwb3NpdGlvbiB8aXwuCitzdGF0aWMgdm9pZCBfZ19oYXNoX3RhYmxlX3JlbW92ZV9pbmRleChHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkpIHsKKyAgR0hhc2hFbnRyeSogZW50cnkgPSAmaGFzaF90YWJsZS0+ZW50cmllc1tpXTsKKyAgZW50cnktPmhhc2ggPSBIQVNIX1RPTUJTVE9ORTsKKyAgZW50cnktPmtleSA9IE5VTEw7CisgIGVudHJ5LT52YWx1ZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4gZ19oYXNoX3RhYmxlX3JlbW92ZShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBrZXkpIHsKKyAgZ3VpbnQga2V5X2hhc2ggPSBIQVNIX1VOVVNFRDsKKyAgZ3VpbnQgcHJvYmVfaW5kZXggPSBfZ19oYXNoX3RhYmxlX2xvb2t1cF9pbmRleChoYXNoX3RhYmxlLCBrZXksICZrZXlfaGFzaCk7CisgIEdIYXNoRW50cnkqIGVudHJ5ID0gJmhhc2hfdGFibGUtPmVudHJpZXNbcHJvYmVfaW5kZXhdOworICBpZiAoIUhBU0hfSVNfUkVBTChlbnRyeS0+aGFzaCkpCisgICAgcmV0dXJuIDA7CisKKyAgX2dfaGFzaF90YWJsZV9yZW1vdmVfaW5kZXgoaGFzaF90YWJsZSwgcHJvYmVfaW5kZXgpOworICBoYXNoX3RhYmxlLT5udW1faXRlbXMtLTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJlc2l6ZSB0aGUgaGFzaCB0YWJsZSwgdGhpcyBhbHNvIGdldHMgcmlkIG9mIGFsbCB0b21ic3RvbmVzLgorc3RhdGljIHZvaWQgX2dfaGFzaF90YWJsZV9yZXNpemUoR0hhc2hUYWJsZSogaGFzaF90YWJsZSkgeworICBndWludCBvbGRfY2FwYWNpdHkgPSBoYXNoX3RhYmxlLT5jYXBhY2l0eTsKKworICAvLyBDb21wdXRlIG5ldyBjYXBhY2l0eSBmcm9tIG5ldyBzaXplCisgIGd1aW50IG5ld19zaXplID0gaGFzaF90YWJsZS0+bnVtX2l0ZW1zICogMjsKKyAgZ3VpbnQgbmV3X2NhcGFjaXR5ID0gSEFTSF9NSU5fQ0FQQUNJVFk7CisgIHdoaWxlIChuZXdfY2FwYWNpdHkgPCBuZXdfc2l6ZSkKKyAgICBuZXdfY2FwYWNpdHkgPDw9IDE7CisKKyAgR0hhc2hFbnRyeSogbmV3X2VudHJpZXMgPSBnX25ldzAoR0hhc2hFbnRyeSwgbmV3X2NhcGFjaXR5KTsKKyAgZ3VpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IG9sZF9jYXBhY2l0eTsgKytuKSB7CisgICAgR0hhc2hFbnRyeSogb2xkX2VudHJ5ID0gJmhhc2hfdGFibGUtPmVudHJpZXNbbl07CisgICAgZ3VpbnQgb2xkX2hhc2ggPSBvbGRfZW50cnktPmhhc2g7CisKKyAgICBpZiAoIUhBU0hfSVNfUkVBTChvbGRfaGFzaCkpCisgICAgICBjb250aW51ZTsKKworICAgIGd1aW50IHByb2JlX21hc2sgPSAobmV3X2NhcGFjaXR5IC0gMSk7CisgICAgZ3VpbnQgcHJvYmVfbiA9IG9sZF9oYXNoICYgcHJvYmVfbWFzazsKKyAgICBHSGFzaEVudHJ5KiBwcm9iZSA9ICZuZXdfZW50cmllc1twcm9iZV9uXTsKKyAgICBndWludCBzdGVwID0gMDsKKyAgICB3aGlsZSAocHJvYmUtPmhhc2ggIT0gSEFTSF9VTlVTRUQpIHsKKyAgICAgIHN0ZXArKzsKKyAgICAgIHByb2JlX24gPSAocHJvYmVfbiArIHN0ZXApICYgcHJvYmVfbWFzazsKKyAgICAgIHByb2JlID0gJm5ld19lbnRyaWVzW3Byb2JlX25dOworICAgIH0KKyAgICBwcm9iZVswXSA9IG9sZF9lbnRyeVswXTsKKyAgfQorCisgIGdfZnJlZShoYXNoX3RhYmxlLT5lbnRyaWVzKTsKKyAgaGFzaF90YWJsZS0+ZW50cmllcyA9IG5ld19lbnRyaWVzOworICBoYXNoX3RhYmxlLT5jYXBhY2l0eSA9IG5ld19jYXBhY2l0eTsKKyAgaGFzaF90YWJsZS0+bnVtX3VzZWQgPSBoYXNoX3RhYmxlLT5udW1faXRlbXM7Cit9CisKKy8vIFJlc2l6ZSB0aGUgaGFzaCB0YWJsZSBpZiBuZWVkZWQuCitzdGF0aWMgdm9pZCBfZ19oYXNoX3RhYmxlX21heWJlX3Jlc2l6ZShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKSB7CisgIGd1aW50IGNvdW50ID0gaGFzaF90YWJsZS0+bnVtX2l0ZW1zOworICBndWludCBjYXBhY2l0eSA9IGhhc2hfdGFibGUtPmNhcGFjaXR5OworICAvLyBDb21wdXRhdGlvbnMgZXhwbGFpbmVkLgorICAvLworICAvLyBsb2FkIDwgbWluX2xvYWQgaS5lLgorICAvLyA9PiB1c2VkIC8gY2FwYWNpdHkgPCBtaW5fbG9hZAorICAvLyA9PiB1c2VkIDwgbWluX2xvYWQgKiBjYXBhY2l0eQorICAvLyA9PiB1c2VkICogSEFTSF9TQ0FMRSA8IEhBU0hfTUlOX0xPQUQgKiBjYXBhY2l0eQorICAvLworICAvLyBsb2FkID4gbWF4X2xvYWQKKyAgLy8gPT4gdXNlZCAvIGNhcGFjaXR5ID4gbWF4X2xvYWQKKyAgLy8gPT4gdXNlZCAqIEhBU0hfU0NBTEVSID4gSEFTSF9NQVhfTE9BRCAqIGNhcGFjaXR5CisgIHVpbnQ2NF90IGxvYWQgPSAodWludDY0X3QpY291bnQgKiBIQVNIX0xPQURfU0NBTEU7CisgIHVpbnQ2NF90IG1pbl9sb2FkID0gKHVpbnQ2NF90KWNhcGFjaXR5ICogSEFTSF9NSU5fTE9BRDsKKyAgdWludDY0X3QgbWF4X2xvYWQgPSAodWludDY0X3QpY2FwYWNpdHkgKiBIQVNIX01BWF9MT0FEOworICBpZiAobG9hZCA8IG1pbl9sb2FkIHx8IGxvYWQgPiBtYXhfbG9hZCkgeworICAgIF9nX2hhc2hfdGFibGVfcmVzaXplKGhhc2hfdGFibGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIF9nX2hhc2hfdGFibGVfaW5zZXJ0X2luZGV4KEdIYXNoVGFibGUqIGhhc2hfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBrZXlfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBuZXdfa2V5X2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciBuZXdfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgbmV3X3ZhbHVlKSB7CisgIEdIYXNoRW50cnkqIGVudHJ5ID0gJmhhc2hfdGFibGUtPmVudHJpZXNba2V5X2luZGV4XTsKKyAgZ3VpbnQgb2xkX2hhc2ggPSBlbnRyeS0+aGFzaDsKKworICBlbnRyeS0+a2V5ID0gbmV3X2tleTsKKyAgZW50cnktPnZhbHVlID0gbmV3X3ZhbHVlOworICBlbnRyeS0+aGFzaCA9IG5ld19rZXlfaGFzaDsKKworICBpZiAoSEFTSF9JU19SRUFMKG9sZF9oYXNoKSkgeworICAgIC8vIFNpbXBsZSByZXBsYWNlbWVudCwgZXhpdCBpbW1lZGlhdGVseS4KKyAgICByZXR1cm47CisgIH0KKworICBoYXNoX3RhYmxlLT5udW1faXRlbXMrKzsKKyAgaWYgKG9sZF9oYXNoID09IEhBU0hfVE9NQlNUT05FKSB7CisgICAgLy8gTm8gbmVlZCB0byByZXNpemUgd2hlbiByZXBsYWNpbmcgYSB0b21ic3RvbmUuCisgICAgcmV0dXJuOworICB9CisKKyAgaGFzaF90YWJsZS0+bnVtX3VzZWQrKzsKKyAgX2dfaGFzaF90YWJsZV9tYXliZV9yZXNpemUoaGFzaF90YWJsZSk7Cit9CisKK3ZvaWQgZ19oYXNoX3RhYmxlX2luc2VydChHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB2YWx1ZSkgeworICBndWludCBrZXlfaGFzaDsKKyAgZ3VpbnQga2V5X2luZGV4ID0KKyAgICAgIF9nX2hhc2hfdGFibGVfbG9va3VwX2luZGV4KGhhc2hfdGFibGUsIGtleSwgJmtleV9oYXNoKTsKKworICBfZ19oYXNoX3RhYmxlX2luc2VydF9pbmRleChoYXNoX3RhYmxlLCBrZXlfaW5kZXgsIGtleV9oYXNoLCBrZXksIHZhbHVlKTsKK30KKworCit2b2lkIGdfaGFzaF90YWJsZV9mb3JlYWNoKEdIYXNoVGFibGUqIGhhc2hfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdIRnVuYyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpIHsKKyAgZ3VpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IGhhc2hfdGFibGUtPmNhcGFjaXR5OyArK24pIHsKKyAgICBHSGFzaEVudHJ5KiBlbnRyeSA9ICZoYXNoX3RhYmxlLT5lbnRyaWVzW25dOworICAgIGlmIChIQVNIX0lTX1JFQUwoZW50cnktPmhhc2gpKQorICAgICAgKCpmdW5jKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUsIHVzZXJfZGF0YSk7CisgIH0KK30KKworCitncG9pbnRlciBnX2hhc2hfdGFibGVfZmluZChHSGFzaFRhYmxlKiBoYXNoX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0hSRnVuYyBwcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpIHsKKyAgZ3VpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IGhhc2hfdGFibGUtPmNhcGFjaXR5OyArK24pIHsKKyAgICBHSGFzaEVudHJ5KiBlbnRyeSA9ICZoYXNoX3RhYmxlLT5lbnRyaWVzW25dOworICAgIGlmIChIQVNIX0lTX1JFQUwoZW50cnktPmhhc2gpICYmCisgICAgICAgICgqcHJlZGljYXRlKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUsIHVzZXJfZGF0YSkpIHsKKyAgICAgIHJldHVybiBlbnRyeS0+dmFsdWU7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOworfQorCisKK2d1aW50IGdfaGFzaF90YWJsZV9zaXplKEdIYXNoVGFibGUqIGhhc2hfdGFibGUpIHsKKyAgcmV0dXJuIGhhc2hfdGFibGUtPm51bV9pdGVtczsKK30KKworLy8gUXVldWVzCisKK3N0cnVjdCBfR1F1ZXVlTm9kZSB7CisgIHZvaWQqIGRhdGE7CisgIEdRdWV1ZU5vZGUqIG5leHQ7CisgIEdRdWV1ZU5vZGUqIHByZXY7Cit9OworCitzdGF0aWMgaW5saW5lIEdRdWV1ZU5vZGUqIF9nX3F1ZXVlX25vZGVfYWxsb2Modm9pZCkgeworICByZXR1cm4gZ19uZXcwKEdRdWV1ZU5vZGUsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2dfcXVldWVfbm9kZV9mcmVlKEdRdWV1ZU5vZGUqIG5vZGUpIHsKKyAgZ19mcmVlKG5vZGUpOworfQorCitHUXVldWUqIGdfcXVldWVfbmV3KHZvaWQpIHsKKyAgR1F1ZXVlKiBxdWV1ZSA9IGdfbmV3MChHUXVldWUsIDEpOworICByZXR1cm4gcXVldWU7Cit9CisKK3ZvaWQgZ19xdWV1ZV9mcmVlKEdRdWV1ZSogcXVldWUpIHsKKyAgR1F1ZXVlTm9kZSogbm9kZSA9IHF1ZXVlLT5oZWFkOworICB3aGlsZSAobm9kZSkgeworICAgIEdRdWV1ZU5vZGUqIG5leHQgPSBub2RlLT5uZXh0OworICAgIF9nX3F1ZXVlX25vZGVfZnJlZShub2RlKTsKKyAgICBub2RlID0gbmV4dDsKKyAgfQorICBxdWV1ZS0+aGVhZCA9IHF1ZXVlLT50YWlsID0gTlVMTDsKKyAgcXVldWUtPmxlbmd0aCA9IDA7CisgIGdfZnJlZShxdWV1ZSk7Cit9CisKK2dib29sZWFuIGdfcXVldWVfaXNfZW1wdHkoR1F1ZXVlKiBxdWV1ZSkgeworICByZXR1cm4gcXVldWUtPmhlYWQgPT0gTlVMTDsKK30KKwordm9pZCBnX3F1ZXVlX3B1c2hfdGFpbChHUXVldWUqIHF1ZXVlLCB2b2lkKiBkYXRhKSB7CisgIEdRdWV1ZU5vZGUqIG5vZGUgPSBfZ19xdWV1ZV9ub2RlX2FsbG9jKCk7CisgIG5vZGUtPmRhdGEgPSBkYXRhOworICBub2RlLT5uZXh0ID0gTlVMTDsKKyAgbm9kZS0+cHJldiA9IHF1ZXVlLT50YWlsOworICBxdWV1ZS0+dGFpbCA9IG5vZGU7CisgIHF1ZXVlLT5sZW5ndGgrKzsKK30KKwordm9pZCogZ19xdWV1ZV9wZWVrX2hlYWQoR1F1ZXVlKiBxdWV1ZSkgeworICByZXR1cm4gKHF1ZXVlLT5oZWFkKSA/IHF1ZXVlLT5oZWFkLT5kYXRhIDogTlVMTDsKK30KKwordm9pZCogZ19xdWV1ZV9wZWVrX3RhaWwoR1F1ZXVlKiBxdWV1ZSkgeworICByZXR1cm4gKHF1ZXVlLT50YWlsKSA/IHF1ZXVlLT50YWlsLT5kYXRhIDogTlVMTDsKK30KKwordm9pZCogZ19xdWV1ZV9wb3BfaGVhZChHUXVldWUqIHF1ZXVlKSB7CisgIEdRdWV1ZU5vZGUqIGhlYWQgPSBxdWV1ZS0+aGVhZDsKKyAgaWYgKCFoZWFkKQorICAgIHJldHVybiBOVUxMOworCisgIHZvaWQqIHJlc3VsdCA9IGhlYWQtPmRhdGE7CisKKyAgaWYgKGhlYWQtPm5leHQpIHsKKyAgICBxdWV1ZS0+aGVhZCA9IGhlYWQtPm5leHQ7CisgICAgaGVhZC0+bmV4dC0+cHJldiA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgcXVldWUtPmhlYWQgPSBOVUxMOworICAgIHF1ZXVlLT50YWlsID0gTlVMTDsKKyAgfQorICBxdWV1ZS0+bGVuZ3RoLS07CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvY29tcGF0L25hbWVzcGFjZS5oIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvbmFtZXNwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyNjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvY29tcGF0L25hbWVzcGFjZS5oCkBAIC0wLDAgKzEsMiBAQAorI3ByYWdtYSBvbmNlCisvLyBOb3RoaW5nIGhlcmUgaW50ZW50aW9uYWxseS4KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvY29tcGF0L3JlYWxsb2NhcnIuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvY29tcGF0L3JlYWxsb2NhcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmZlODExCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvcmVhbGxvY2Fyci5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qICROZXRCU0Q6IHJlYWxsb2NhcnIuYyx2IDEuNSAyMDE1LzA4LzIwIDIyOjI3OjQ5IGthbWlsIEV4cCAkICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE1IEpvZXJnIFNvbm5lbmJlcmdlciA8am9lcmdATmV0QlNELm9yZz4uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlkgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBIQVZFX05CVE9PTF9DT05GSUdfSAorI2luY2x1ZGUgIm5idG9vbF9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CitfX1JDU0lEKCIkTmV0QlNEOiByZWFsbG9jYXJyLmMsdiAxLjUgMjAxNS8wOC8yMCAyMjoyNzo0OSBrYW1pbCBFeHAgJCIpOworCisjaW5jbHVkZSAibmFtZXNwYWNlLmgiCisjaW5jbHVkZSA8ZXJybm8uaD4KKy8qIE9sZCBQT1NJWCBoYXMgU0laRV9NQVggaW4gbGltaXRzLmggKi8KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9MSUJDCisjaWZkZWYgX193ZWFrX2FsaWFzCitfX3dlYWtfYWxpYXMocmVhbGxvY2FyciwgX3JlYWxsb2NhcnIpCisjZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIFNRUlRfU0laRV9NQVggKCgoc2l6ZV90KTEpIDw8IChzaXplb2Yoc2l6ZV90KSAqIENIQVJfQklUIC8gMikpCisKKyNpZiAhSEFWRV9SRUFMTE9DQVJSCitpbnQKK3JlYWxsb2NhcnIodm9pZCAqcHRyLCBzaXplX3QgbnVtYmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgc2F2ZWRfZXJybm8sIHJlc3VsdDsKKwl2b2lkICpvcHRyOworCXZvaWQgKm5wdHI7CisKKwlzYXZlZF9lcnJubyA9IGVycm5vOworCW1lbWNweSgmb3B0ciwgcHRyLCBzaXplb2YocHRyKSk7CisJaWYgKG51bWJlciA9PSAwIHx8IHNpemUgPT0gMCkgeworCQlmcmVlKG9wdHIpOworCQlucHRyID0gTlVMTDsKKwkJbWVtY3B5KHB0ciwgJm5wdHIsIHNpemVvZihwdHIpKTsKKwkJZXJybm8gPSBzYXZlZF9lcnJubzsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBUcnkgdG8gYXZvaWQgZGl2aXNpb24gaGVyZS4KKwkgKgorCSAqIEl0IGlzbid0IHBvc3NpYmxlIHRvIG92ZXJmbG93IGR1cmluZyBtdWx0aXBsaWNhdGlvbiBpZiBuZWl0aGVyCisJICogb3BlcmFuZCB1c2VzIGFueSBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBoYWxmIG9mIHRoZSBiaXRzLgorCSAqLworCWlmIChfX3ByZWRpY3RfZmFsc2UoKG51bWJlcnxzaXplKSA+PSBTUVJUX1NJWkVfTUFYICYmCisJICAgICAgICAgICAgICAgICAgICBudW1iZXIgPiBTSVpFX01BWCAvIHNpemUpKSB7CisJCWVycm5vID0gc2F2ZWRfZXJybm87CisJCXJldHVybiBFT1ZFUkZMT1c7CisJfQorCisJbnB0ciA9IHJlYWxsb2Mob3B0ciwgbnVtYmVyICogc2l6ZSk7CisJaWYgKF9fcHJlZGljdF9mYWxzZShucHRyID09IE5VTEwpKSB7CisJCXJlc3VsdCA9IGVycm5vOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IDA7CisJCW1lbWNweShwdHIsICZucHRyLCBzaXplb2YocHRyKSk7CisJfQorCWVycm5vID0gc2F2ZWRfZXJybm87CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvc3RybGNweS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvc3RybGNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2YwODQKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2NvbXBhdC9zdHJsY3B5LmMKQEAgLTAsMCArMSw1MSBAQAorLyoJJE9wZW5CU0Q6IHN0cmxjcHkuYyx2IDEuMTMgMjAxNS8wOC8zMSAwMjo1Mzo1NyBndWVudGhlciBFeHAgJAkqLworCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk4LCAyMDE1IFRvZGQgQy4gTWlsbGVyIDxUb2RkLk1pbGxlckBjb3VydGVzYW4uY29tPgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIENvcHkgc3RyaW5nIHNyYyB0byBidWZmZXIgZHN0IG9mIHNpemUgZHNpemUuICBBdCBtb3N0IGRzaXplLTEKKyAqIGNoYXJzIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3MgZHNpemUgPT0gMCkuCisgKiBSZXR1cm5zIHN0cmxlbihzcmMpOyBpZiByZXR2YWwgPj0gZHNpemUsIHRydW5jYXRpb24gb2NjdXJyZWQuCisgKi8KK3NpemVfdAorc3RybGNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzaXplKQoreworCWNvbnN0IGNoYXIgKm9zcmMgPSBzcmM7CisJc2l6ZV90IG5sZWZ0ID0gZHNpemU7CisKKwkvKiBDb3B5IGFzIG1hbnkgYnl0ZXMgYXMgd2lsbCBmaXQuICovCisJaWYgKG5sZWZ0ICE9IDApIHsKKwkJd2hpbGUgKC0tbmxlZnQgIT0gMCkgeworCQkJaWYgKCgqZHN0KysgPSAqc3JjKyspID09ICdcMCcpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBOb3QgZW5vdWdoIHJvb20gaW4gZHN0LCBhZGQgTlVMIGFuZCB0cmF2ZXJzZSByZXN0IG9mIHNyYy4gKi8KKwlpZiAobmxlZnQgPT0gMCkgeworCQlpZiAoZHNpemUgIT0gMCkKKwkJCSpkc3QgPSAnXDAnOwkJLyogTlVMLXRlcm1pbmF0ZSBkc3QgKi8KKwkJd2hpbGUgKCpzcmMrKykKKwkJCTsKKwl9CisKKwlyZXR1cm4oc3JjIC0gb3NyYyAtIDEpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLworfQorREVGX1dFQUsoc3RybGNweSk7CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2NvbXBhdC9zeXMvY2RlZnMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvY29tcGF0L3N5cy9jZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjU5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2NvbXBhdC9zeXMvY2RlZnMuaApAQCAtMCwwICsxLDE0IEBACisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIF9fcHJlZGljdF9mYWxzZShleHApICAgIF9fYnVpbHRpbl9leHBlY3QoKGV4cCkgIT0gMCwgMCkKKyNkZWZpbmUgX19SQ1NJRChlKSAvKiBub3RoaW5nICovCisKKyNkZWZpbmUgcmVhbGxvY2FyciAgX19yZWdleF9yZWFsbG9jYXJyCitleHRlcm4gaW50IHJlYWxsb2NhcnIodm9pZCAqcHRyLCBzaXplX3QgbnVtYmVyLCBzaXplX3Qgc2l6ZSk7CisKKyNkZWZpbmUgc3RybGNweSAgX19yZWdleF9zdHJsY3B5CitleHRlcm4gc2l6ZV90IHN0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc2l6ZSk7CisKKyNpbmNsdWRlX25leHQgPHN5cy9jZGVmcy5oPgpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvc3lzL3R5cGVzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2NvbXBhdC9zeXMvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVlZmRmCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9jb21wYXQvc3lzL3R5cGVzLmgKQEAgLTAsMCArMSwxNiBAQAorI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KK3R5cGVkZWYgdWludDMyX3QgdV9pbnQzMl90OworCisjZGVmaW5lIF9ESUFHQVNTRVJUKGUpIC8qIG5vdGhpbmcgKi8KKyNkZWZpbmUgX1BPU0lYMl9SRV9EVVBfTUFYIDI1NgorCisjZGVmaW5lIF9fVU5DT05TVChhKSAgICAoKHZvaWQgKikodWludHB0cl90KShjb25zdCB2b2lkICopKGEpKQorCisjZGVmaW5lIHN0cmxjcHkgIF9fcmVnZXhfc3RybGNweQorZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgZHNpemUpOworCisjZGVmaW5lIERFRl9XRUFLKGUpIC8qIG5vdGhpbmcgKi8KKworI2luY2x1ZGVfbmV4dCA8c3lzL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2luY2x1ZGUvcmVnZXguaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvaW5jbHVkZS9yZWdleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNmE1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL2luY2x1ZGUvcmVnZXguaApAQCAtMCwwICsxLDEwNiBAQAorLyoJJE9wZW5CU0Q6IHJlZ2V4LmgsdiAxLjYgMjAwMy8wNi8wMiAxOTozNDoxMiBtaWxsZXJ0IEV4cCAkCSovCisvKgkkTmV0QlNEOiByZWdleC5oLHYgMS40LjYuMSAxOTk2LzA2LzEwIDE4OjU3OjA3IGV4cGxvcmVyIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyIEhlbnJ5IFNwZW5jZXIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVG9yb250by4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJlZ2V4LmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKi8KKworI2lmbmRlZiBfUkVHRVhfSF8KKyNkZWZpbmUJX1JFR0VYX0hfCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogUE9TSVggc2F5cyByZWdvZmZfdCBpcyBhdCBsZWFzdCBhcyBsYXJnZSBhcyB0aGUgbGFyZ2VyIG9mIHB0cmRpZmZfdCBhbmQKKyAqIHNzaXplX3QuIEJTRCB1c2VzIG9mZl90LCBidXQgdGhhdCBpbnRlcmFjdHMgYmFkbHkgd2l0aCBfRklMRV9PRkZTRVRfQklUUy4gKi8KK3R5cGVkZWYgc3NpemVfdCByZWdvZmZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCByZV9tYWdpYzsKKwlzaXplX3QgcmVfbnN1YjsJCS8qIG51bWJlciBvZiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zICovCisJY29uc3QgY2hhciAqcmVfZW5kcDsJLyogZW5kIHBvaW50ZXIgZm9yIFJFR19QRU5EICovCisJc3RydWN0IHJlX2d1dHMgKnJlX2c7CS8qIG5vbmUgb2YgeW91ciBidXNpbmVzcyA6LSkgKi8KK30gcmVnZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXJlZ29mZl90IHJtX3NvOwkJLyogc3RhcnQgb2YgbWF0Y2ggKi8KKwlyZWdvZmZfdCBybV9lbzsJCS8qIGVuZCBvZiBtYXRjaCAqLworfSByZWdtYXRjaF90OworCisvKiByZWdjb21wKCkgZmxhZ3MgKi8KKyNkZWZpbmUJUkVHX0JBU0lDCTAwMDAKKyNkZWZpbmUJUkVHX0VYVEVOREVECTAwMDEKKyNkZWZpbmUJUkVHX0lDQVNFCTAwMDIKKyNkZWZpbmUJUkVHX05PU1VCCTAwMDQKKyNkZWZpbmUJUkVHX05FV0xJTkUJMDAxMAorI2RlZmluZQlSRUdfTk9TUEVDCTAwMjAKKyNkZWZpbmUJUkVHX1BFTkQJMDA0MAorI2RlZmluZQlSRUdfRFVNUAkwMjAwCisKKy8qIHJlZ2Vycm9yKCkgZmxhZ3MgKi8KKyNkZWZpbmUJUkVHX05PTUFUQ0gJIDEKKyNkZWZpbmUJUkVHX0JBRFBBVAkgMgorI2RlZmluZQlSRUdfRUNPTExBVEUJIDMKKyNkZWZpbmUJUkVHX0VDVFlQRQkgNAorI2RlZmluZQlSRUdfRUVTQ0FQRQkgNQorI2RlZmluZQlSRUdfRVNVQlJFRwkgNgorI2RlZmluZQlSRUdfRUJSQUNLCSA3CisjZGVmaW5lCVJFR19FUEFSRU4JIDgKKyNkZWZpbmUJUkVHX0VCUkFDRQkgOQorI2RlZmluZQlSRUdfQkFEQlIJMTAKKyNkZWZpbmUJUkVHX0VSQU5HRQkxMQorI2RlZmluZQlSRUdfRVNQQUNFCTEyCisjZGVmaW5lCVJFR19CQURSUFQJMTMKKyNkZWZpbmUJUkVHX0VNUFRZCTE0CisjZGVmaW5lCVJFR19BU1NFUlQJMTUKKyNkZWZpbmUJUkVHX0lOVkFSRwkxNgorI2RlZmluZQlSRUdfQVRPSQkyNTUJLyogY29udmVydCBuYW1lIHRvIG51bWJlciAoISkgKi8KKyNkZWZpbmUJUkVHX0lUT0EJMDQwMAkvKiBjb252ZXJ0IG51bWJlciB0byBuYW1lICghKSAqLworCisvKiByZWdleGVjKCkgZmxhZ3MgKi8KKyNkZWZpbmUJUkVHX05PVEJPTAkwMDAwMQorI2RlZmluZQlSRUdfTk9URU9MCTAwMDAyCisjZGVmaW5lCVJFR19TVEFSVEVORAkwMDAwNAorI2RlZmluZQlSRUdfVFJBQ0UJMDA0MDAJLyogdHJhY2luZyBvZiBleGVjdXRpb24gKi8KKyNkZWZpbmUJUkVHX0xBUkdFCTAxMDAwCS8qIGZvcmNlIGxhcmdlIHJlcHJlc2VudGF0aW9uICovCisjZGVmaW5lCVJFR19CQUNLUgkwMjAwMAkvKiBmb3JjZSB1c2Ugb2YgYmFja3JlZiBjb2RlICovCisKK19fQkVHSU5fREVDTFMKK2ludAlyZWdjb21wKHJlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworc2l6ZV90CXJlZ2Vycm9yKGludCwgY29uc3QgcmVnZXhfdCAqLCBjaGFyICosIHNpemVfdCk7CitpbnQJcmVnZXhlYyhjb25zdCByZWdleF90ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCByZWdtYXRjaF90IFtdLCBpbnQpOwordm9pZAlyZWdmcmVlKHJlZ2V4X3QgKik7CitfX0VORF9ERUNMUworCisjZW5kaWYgLyogIV9SRUdFWF9IXyAqLwpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zb3VyY2VzLm1rIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zb3VyY2VzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjFkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NvdXJjZXMubWsKQEAgLTAsMCArMSwzNyBAQAorIyBCdWlsZCB0aGUgcmVnZXggbGlicmFyeSBmb3IgV2luMzIsIHRoaXMgaXMgcmVxdWlyZWQgYnkgZ29vZ2xlLWJlbmNobWFyay4KKyMgVGhlIHNvdXJjZXMgY29tZSBmcm9tICRBT1NQL2Jpb25pYy9saWJjL3Vwc3RyZWFtLW5ldGJzZCB3aXRoIGNvbW1pdAorIyAxNjY1MTU4YjcxODFmOWNjZDIyNDhlYjgzZTUwNzdmMTY3OTcxODAxCisjCisjIFRoZSBjb21wYXQvIGRpcmVjdG9yeSBjb250YWlucyBjb21wYXRpYmlsaXR5IGhlYWRlcnMgYW5kIHNvdXJjZXMgdG8gbWFrZQorIyBldmVyeXRoaW5nIHdvcmtzIGNvcnJlY3RseS4gTm90ZSB0aGF0IHN0cmxjcHkoKSBhbmQgcmVhbGxvY2FycigpIGFyZQorIyByZW5hbWVkIHRvIF9fcmVnZXhfc3RybGNweSgpIGFuZCBfX3JlZ2V4X3JlYWxsb2NhcnIoKSB0byBhdm9pZCBjb25mbGljdHMKKyMgd2hlbiBsaW5raW5nIHdpdGggb3RoZXIgbGlicmFyaWVzIHRoYXQgbWF5IGFsc28gZGVmaW5lIHRoZXNlLgorCitPTERfTE9DQUxfUEFUSCA6PSAkKExPQ0FMX1BBVEgpCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaWZlcSAod2luZG93cywkKEJVSUxEX1RBUkdFVF9PUykpCisKK1JFR0VYX1dJTjMyX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorUkVHRVhfV0lOMzJfU1RBVElDX0xJQlJBUklFUyA6PSBlbXVsYXRvci1yZWdleC13aW4zMgorCiskKGNhbGwgc3RhcnQtZW11bGF0b3ItbGlicmFyeSxlbXVsYXRvci1yZWdleC13aW4zMikKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChSRUdFWF9XSU4zMl9JTkNMVURFUykgXAorICAgICQoTE9DQUxfUEFUSCkvY29tcGF0IFwKKworTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBjb21wYXQvcmVhbGxvY2Fyci5jIFwKKyAgICBjb21wYXQvc3RybGNweS5jIFwKKyAgICBzcmMvcmVnY29tcC5jIFwKKyAgICBzcmMvcmVnZXJyb3IuYyBcCisgICAgc3JjL3JlZ2V4ZWMuYyBcCisgICAgc3JjL3JlZ2ZyZWUuYyBcCisKKyQoY2FsbCBlbmQtZW11bGF0b3ItbGlicmFyeSkKKworZW5kaWYgICMgQlVJTERfVEFSR0VUX09TID09IHdpbmRvd3MKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvY2NsYXNzLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9jY2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWIyY2NiCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvY2NsYXNzLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCSROZXRCU0Q6IGNjbGFzcy5oLHYgMS43IDIwMDMvMDgvMDcgMTY6NDM6MTkgYWdjIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpY2NsYXNzLmgJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSGVucnkgU3BlbmNlci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyljY2xhc3MuaAk4LjMgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyogY2hhcmFjdGVyLWNsYXNzIHRhYmxlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNjbGFzcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpjaGFyczsKKwljb25zdCBjaGFyICptdWx0aXM7Cit9IGNjbGFzc2VzW10gPSB7CisJeyAiYWxudW0iLAkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwKKzAxMjM0NTY3ODkiLAkJCQkiIiB9LAorCXsgImFscGhhIiwJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorCQkJCQkiIiB9LAorCXsgImJsYW5rIiwJIiBcdCIsCQkiIiB9LAorCXsgImNudHJsIiwJIlwwMDdcYlx0XG5cdlxmXHJcMVwyXDNcNFw1XDZcMTZcMTdcMjBcMjFcMjJcMjNcMjRcCitcMjVcMjZcMjdcMzBcMzFcMzJcMzNcMzRcMzVcMzZcMzdcMTc3IiwJIiIgfSwKKwl7ICJkaWdpdCIsCSIwMTIzNDU2Nzg5IiwJIiIgfSwKKwl7ICJncmFwaCIsCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XAorMDEyMzQ1Njc4OSFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX4iLAorCQkJCQkiIiB9LAorCXsgImxvd2VyIiwJImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKwkJCQkJIiIgfSwKKwl7ICJwcmludCIsCSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XAorMDEyMzQ1Njc4OSFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX4gIiwKKwkJCQkJIiIgfSwKKwl7ICJwdW5jdCIsCSIhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+IiwKKwkJCQkJIiIgfSwKKwl7ICJzcGFjZSIsCSJcdFxuXHZcZlxyICIsCSIiIH0sCisJeyAidXBwZXIiLAkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLAorCQkJCQkiIiB9LAorCXsgInhkaWdpdCIsCSIwMTIzNDU2Nzg5QUJDREVGYWJjZGVmIiwKKwkJCQkJIiIgfSwKKwl7IE5VTEwsCQkwLAkJIiIgfQorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL2NuYW1lLmggYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9jbmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWVmMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9jbmFtZS5oCkBAIC0wLDAgKzEsMTc1IEBACisvKgkkTmV0QlNEOiBjbmFtZS5oLHYgMS43IDIwMDMvMDgvMDcgMTY6NDM6MTkgYWdjIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpY25hbWUuaAk4LjMgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQgSGVucnkgU3BlbmNlci4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWNuYW1lLmgJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKy8qIGNoYXJhY3Rlci1uYW1lIHRhYmxlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGNuYW1lIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgY29kZTsKK30gY25hbWVzW10gPSB7CisJeyAiTlVMIiwJCQknXDAnIH0sCisJeyAiU09IIiwJCQknXDAwMScgfSwKKwl7ICJTVFgiLAkJCSdcMDAyJyB9LAorCXsgIkVUWCIsCQkJJ1wwMDMnIH0sCisJeyAiRU9UIiwJCQknXDAwNCcgfSwKKwl7ICJFTlEiLAkJCSdcMDA1JyB9LAorCXsgIkFDSyIsCQkJJ1wwMDYnIH0sCisJeyAiQkVMIiwJCQknXDAwNycgfSwKKwl7ICJhbGVydCIsCQkJJ1wwMDcnIH0sCisJeyAiQlMiLAkJCQknXDAxMCcgfSwKKwl7ICJiYWNrc3BhY2UiLAkJCSdcYicgfSwKKwl7ICJIVCIsCQkJCSdcMDExJyB9LAorCXsgInRhYiIsCQkJJ1x0JyB9LAorCXsgIkxGIiwJCQkJJ1wwMTInIH0sCisJeyAibmV3bGluZSIsCQkJJ1xuJyB9LAorCXsgIlZUIiwJCQkJJ1wwMTMnIH0sCisJeyAidmVydGljYWwtdGFiIiwJCSdcdicgfSwKKwl7ICJGRiIsCQkJCSdcMDE0JyB9LAorCXsgImZvcm0tZmVlZCIsCQkJJ1xmJyB9LAorCXsgIkNSIiwJCQkJJ1wwMTUnIH0sCisJeyAiY2FycmlhZ2UtcmV0dXJuIiwJCSdccicgfSwKKwl7ICJTTyIsCQkJCSdcMDE2JyB9LAorCXsgIlNJIiwJCQkJJ1wwMTcnIH0sCisJeyAiRExFIiwJCQknXDAyMCcgfSwKKwl7ICJEQzEiLAkJCSdcMDIxJyB9LAorCXsgIkRDMiIsCQkJJ1wwMjInIH0sCisJeyAiREMzIiwJCQknXDAyMycgfSwKKwl7ICJEQzQiLAkJCSdcMDI0JyB9LAorCXsgIk5BSyIsCQkJJ1wwMjUnIH0sCisJeyAiU1lOIiwJCQknXDAyNicgfSwKKwl7ICJFVEIiLAkJCSdcMDI3JyB9LAorCXsgIkNBTiIsCQkJJ1wwMzAnIH0sCisJeyAiRU0iLAkJCQknXDAzMScgfSwKKwl7ICJTVUIiLAkJCSdcMDMyJyB9LAorCXsgIkVTQyIsCQkJJ1wwMzMnIH0sCisJeyAiSVM0IiwJCQknXDAzNCcgfSwKKwl7ICJGUyIsCQkJCSdcMDM0JyB9LAorCXsgIklTMyIsCQkJJ1wwMzUnIH0sCisJeyAiR1MiLAkJCQknXDAzNScgfSwKKwl7ICJJUzIiLAkJCSdcMDM2JyB9LAorCXsgIlJTIiwJCQkJJ1wwMzYnIH0sCisJeyAiSVMxIiwJCQknXDAzNycgfSwKKwl7ICJVUyIsCQkJCSdcMDM3JyB9LAorCXsgInNwYWNlIiwJCQknICcgfSwKKwl7ICJleGNsYW1hdGlvbi1tYXJrIiwJCSchJyB9LAorCXsgInF1b3RhdGlvbi1tYXJrIiwJCSciJyB9LAorCXsgIm51bWJlci1zaWduIiwJCScjJyB9LAorCXsgImRvbGxhci1zaWduIiwJCSckJyB9LAorCXsgInBlcmNlbnQtc2lnbiIsCQknJScgfSwKKwl7ICJhbXBlcnNhbmQiLAkJCScmJyB9LAorCXsgImFwb3N0cm9waGUiLAkJCSdcJycgfSwKKwl7ICJsZWZ0LXBhcmVudGhlc2lzIiwJCScoJyB9LAorCXsgInJpZ2h0LXBhcmVudGhlc2lzIiwJCScpJyB9LAorCXsgImFzdGVyaXNrIiwJCQknKicgfSwKKwl7ICJwbHVzLXNpZ24iLAkJCScrJyB9LAorCXsgImNvbW1hIiwJCQknLCcgfSwKKwl7ICJoeXBoZW4iLAkJCSctJyB9LAorCXsgImh5cGhlbi1taW51cyIsCQknLScgfSwKKwl7ICJwZXJpb2QiLAkJCScuJyB9LAorCXsgImZ1bGwtc3RvcCIsCQkJJy4nIH0sCisJeyAic2xhc2giLAkJCScvJyB9LAorCXsgInNvbGlkdXMiLAkJCScvJyB9LAorCXsgInplcm8iLAkJCScwJyB9LAorCXsgIm9uZSIsCQkJJzEnIH0sCisJeyAidHdvIiwJCQknMicgfSwKKwl7ICJ0aHJlZSIsCQkJJzMnIH0sCisJeyAiZm91ciIsCQkJJzQnIH0sCisJeyAiZml2ZSIsCQkJJzUnIH0sCisJeyAic2l4IiwJCQknNicgfSwKKwl7ICJzZXZlbiIsCQkJJzcnIH0sCisJeyAiZWlnaHQiLAkJCSc4JyB9LAorCXsgIm5pbmUiLAkJCSc5JyB9LAorCXsgImNvbG9uIiwJCQknOicgfSwKKwl7ICJzZW1pY29sb24iLAkJCSc7JyB9LAorCXsgImxlc3MtdGhhbi1zaWduIiwJCSc8JyB9LAorCXsgImVxdWFscy1zaWduIiwJCSc9JyB9LAorCXsgImdyZWF0ZXItdGhhbi1zaWduIiwJCSc+JyB9LAorCXsgInF1ZXN0aW9uLW1hcmsiLAkJJz8nIH0sCisJeyAiY29tbWVyY2lhbC1hdCIsCQknQCcgfSwKKwl7ICJsZWZ0LXNxdWFyZS1icmFja2V0IiwJJ1snIH0sCisJeyAiYmFja3NsYXNoIiwJCQknXFwnIH0sCisJeyAicmV2ZXJzZS1zb2xpZHVzIiwJCSdcXCcgfSwKKwl7ICJyaWdodC1zcXVhcmUtYnJhY2tldCIsCSddJyB9LAorCXsgImNpcmN1bWZsZXgiLAkJCSdeJyB9LAorCXsgImNpcmN1bWZsZXgtYWNjZW50IiwJCSdeJyB9LAorCXsgInVuZGVyc2NvcmUiLAkJCSdfJyB9LAorCXsgImxvdy1saW5lIiwJCQknXycgfSwKKwl7ICJncmF2ZS1hY2NlbnQiLAkJJ2AnIH0sCisJeyAibGVmdC1icmFjZSIsCQkJJ3snIH0sCisJeyAibGVmdC1jdXJseS1icmFja2V0IiwJCSd7JyB9LAorCXsgInZlcnRpY2FsLWxpbmUiLAkJJ3wnIH0sCisJeyAicmlnaHQtYnJhY2UiLAkJJ30nIH0sCisJeyAicmlnaHQtY3VybHktYnJhY2tldCIsCSd9JyB9LAorCXsgInRpbGRlIiwJCQknficgfSwKKwl7ICJERUwiLAkJCSdcMTc3JyB9LAorCXsgTlVMTCwJCQkJMCB9LAorfTsKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL2VuZ2luZS5jIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvZW5naW5lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4MDBkNAotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL2VuZ2luZS5jCkBAIC0wLDAgKzEsMTE4OCBAQAorLyoJJE5ldEJTRDogZW5naW5lLmMsdiAxLjI0IDIwMTIvMDMvMTMgMjE6MTM6NDIgY2hyaXN0b3MgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyllbmdpbmUuYwk4LjUgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQgSGVucnkgU3BlbmNlci4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKWVuZ2luZS5jCTguNSAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKgorICogVGhlIG1hdGNoaW5nIGVuZ2luZSBhbmQgZnJpZW5kcy4gIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYnkgcmVnZXhlYy5jCisgKiBhZnRlciBzdWl0YWJsZSAjZGVmaW5lcyBvZiBhIHZhcmlldHkgb2YgbWFjcm9zIHVzZWQgaGVyZWluLCBzbyB0aGF0CisgKiBkaWZmZXJlbnQgc3RhdGUgcmVwcmVzZW50YXRpb25zIGNhbiBiZSB1c2VkIHdpdGhvdXQgZHVwbGljYXRpbmcgbWFzc2VzCisgKiBvZiBjb2RlLgorICovCisKKyNpZmRlZiBTTkFNRVMKKyNkZWZpbmUJbWF0Y2hlcglzbWF0Y2hlcgorI2RlZmluZQlmYXN0CXNmYXN0CisjZGVmaW5lCXNsb3cJc3Nsb3cKKyNkZWZpbmUJZGlzc2VjdAlzZGlzc2VjdAorI2RlZmluZQliYWNrcmVmCXNiYWNrcmVmCisjZGVmaW5lCXN0ZXAJc3N0ZXAKKyNkZWZpbmUJcHJpbnQJc3ByaW50CisjZGVmaW5lCWF0CXNhdAorI2RlZmluZQltYXRjaAlzbWF0CisjZGVmaW5lCW5vcGUJc25vcGUKKyNlbmRpZgorI2lmZGVmIExOQU1FUworI2RlZmluZQltYXRjaGVyCWxtYXRjaGVyCisjZGVmaW5lCWZhc3QJbGZhc3QKKyNkZWZpbmUJc2xvdwlsc2xvdworI2RlZmluZQlkaXNzZWN0CWxkaXNzZWN0CisjZGVmaW5lCWJhY2tyZWYJbGJhY2tyZWYKKyNkZWZpbmUJc3RlcAlsc3RlcAorI2RlZmluZQlwcmludAlscHJpbnQKKyNkZWZpbmUJYXQJbGF0CisjZGVmaW5lCW1hdGNoCWxtYXQKKyNkZWZpbmUJbm9wZQlsbm9wZQorI2VuZGlmCisKKy8qIGFub3RoZXIgc3RydWN0dXJlIHBhc3NlZCB1cCBhbmQgZG93biB0byBhdm9pZCB6aWxsaW9ucyBvZiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgbWF0Y2ggeworCXN0cnVjdCByZV9ndXRzICpnOworCWludCBlZmxhZ3M7CisJcmVnbWF0Y2hfdCAqcG1hdGNoOwkvKiBbbnN1YisxXSAoMCBlbGVtZW50IHVudXNlZCkgKi8KKwljb25zdCBjaGFyICpvZmZwOwkvKiBvZmZzZXRzIHdvcmsgZnJvbSBoZXJlICovCisJY29uc3QgY2hhciAqYmVnaW5wOwkvKiBzdGFydCBvZiBzdHJpbmcgLS0gdmlydHVhbCBOVUwgcHJlY2VkZXMgKi8KKwljb25zdCBjaGFyICplbmRwOwkvKiBlbmQgb2Ygc3RyaW5nIC0tIHZpcnR1YWwgTlVMIGhlcmUgKi8KKwljb25zdCBjaGFyICpjb2xkcDsJLyogY2FuIGJlIG5vIG1hdGNoIHN0YXJ0aW5nIGJlZm9yZSBoZXJlICovCisJY29uc3QgY2hhciAqKmxhc3Rwb3M7CS8qIFtucGx1cysxXSAqLworCVNUQVRFVkFSUzsKKwlzdGF0ZXMgc3Q7CQkvKiBjdXJyZW50IHN0YXRlcyAqLworCXN0YXRlcyBmcmVzaDsJCS8qIHN0YXRlcyBmb3IgYSBmcmVzaCBzdGFydCAqLworCXN0YXRlcyB0bXA7CQkvKiB0ZW1wb3JhcnkgKi8KKwlzdGF0ZXMgZW1wdHk7CQkvKiBlbXB0eSBzZXQgb2Ygc3RhdGVzICovCit9OworCisvKiA9PT09PT09PT0gYmVnaW4gaGVhZGVyIGdlbmVyYXRlZCBieSAuL21raCA9PT09PT09PT0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogPT09IGVuZ2luZS5jID09PSAqLworc3RhdGljIGludCBtYXRjaGVyKHN0cnVjdCByZV9ndXRzICpnLCBjb25zdCBjaGFyICpzdHJpbmcsIHNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgcG1hdGNoW10sIGludCBlZmxhZ3MpOworc3RhdGljIGNvbnN0IGNoYXIgKmRpc3NlY3Qoc3RydWN0IG1hdGNoICptLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwgc29wbm8gc3RvcHN0KTsKK3N0YXRpYyBjb25zdCBjaGFyICpiYWNrcmVmKHN0cnVjdCBtYXRjaCAqbSwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKnN0b3AsIHNvcG5vIHN0YXJ0c3QsIHNvcG5vIHN0b3BzdCwgc29wbm8gbGV2KTsKK3N0YXRpYyBjb25zdCBjaGFyICpmYXN0KHN0cnVjdCBtYXRjaCAqbSwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKnN0b3AsIHNvcG5vIHN0YXJ0c3QsIHNvcG5vIHN0b3BzdCk7CitzdGF0aWMgY29uc3QgY2hhciAqc2xvdyhzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICpzdG9wLCBzb3BubyBzdGFydHN0LCBzb3BubyBzdG9wc3QpOworc3RhdGljIHN0YXRlcyBzdGVwKHN0cnVjdCByZV9ndXRzICpnLCBzb3BubyBzdGFydCwgc29wbm8gc3RvcCwgc3RhdGVzIGJlZiwgaW50IGNoLCBzdGF0ZXMgYWZ0KTsKKyNkZWZpbmUJQk9MCShPVVQrMSkKKyNkZWZpbmUJRU9MCShCT0wrMSkKKyNkZWZpbmUJQk9MRU9MCShCT0wrMikKKyNkZWZpbmUJTk9USElORwkoQk9MKzMpCisjZGVmaW5lCUJPVwkoQk9MKzQpCisjZGVmaW5lCUVPVwkoQk9MKzUpCisjZGVmaW5lCUNPREVNQVgJKEJPTCs1KQkJLyogaGlnaGVzdCBjb2RlIHVzZWQgKi8KKyNkZWZpbmUJTk9OQ0hBUihjKQkoKGMpID4gQ0hBUl9NQVgpCisjZGVmaW5lCU5OT05DSEFSCShDT0RFTUFYLUNIQVJfTUFYKQorI2lmZGVmIFJFREVCVUcKK3N0YXRpYyB2b2lkIHByaW50KHN0cnVjdCBtYXRjaCAqbSwgY2hhciAqY2FwdGlvbiwgc3RhdGVzIHN0LCBpbnQgY2gsIEZJTEUgKmQpOworI2VuZGlmCisjaWZkZWYgUkVERUJVRworc3RhdGljIHZvaWQgYXQoc3RydWN0IG1hdGNoICptLCBjaGFyICp0aXRsZSwgY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsIHNvcG5vIHN0YXJ0c3QsIHNvcG5vIHN0b3BzdCk7CisjZW5kaWYKKyNpZmRlZiBSRURFQlVHCitzdGF0aWMgY2hhciAqcGNoYXIoaW50IGNoKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorLyogPT09PT09PT09IGVuZCBoZWFkZXIgZ2VuZXJhdGVkIGJ5IC4vbWtoID09PT09PT09PSAqLworCisjaWZkZWYgUkVERUJVRworI2RlZmluZQlTUCh0LCBzLCBjKQlwcmludChtLCB0LCBzLCBjLCBzdGRvdXQpCisjZGVmaW5lCUFUKHQsIHAxLCBwMiwgczEsIHMyKQlhdChtLCB0LCBwMSwgcDIsIHMxLCBzMikKKyNkZWZpbmUJTk9URShzdHIpCXsgaWYgKG0tPmVmbGFncyZSRUdfVFJBQ0UpIHByaW50ZigiPSVzXG4iLCAoc3RyKSk7IH0KK3N0YXRpYyBpbnQgbm9wZSA9IDA7CisjZWxzZQorI2RlZmluZQlTUCh0LCBzLCBjKQkvKiBub3RoaW5nICovCisjZGVmaW5lCUFUKHQsIHAxLCBwMiwgczEsIHMyKQkvKiBub3RoaW5nICovCisjZGVmaW5lCU5PVEUocykJLyogbm90aGluZyAqLworI2VuZGlmCisKKy8qCisgLSBtYXRjaGVyIC0gdGhlIGFjdHVhbCBtYXRjaGluZyBlbmdpbmUKKyA9PSBzdGF0aWMgaW50IG1hdGNoZXIoc3RydWN0IHJlX2d1dHMgKmcsIGNoYXIgKnN0cmluZywgXAorID09CXNpemVfdCBubWF0Y2gsIHJlZ21hdGNoX3QgcG1hdGNoW10sIGludCBlZmxhZ3MpOworICovCitzdGF0aWMgaW50CQkJLyogMCBzdWNjZXNzLCBSRUdfTk9NQVRDSCBmYWlsdXJlICovCittYXRjaGVyKAorICAgIHN0cnVjdCByZV9ndXRzICpnLAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywKKyAgICBzaXplX3Qgbm1hdGNoLAorICAgIHJlZ21hdGNoX3QgcG1hdGNoW10sCisgICAgaW50IGVmbGFncykKK3sKKwljb25zdCBjaGFyICplbmRwOworCXNpemVfdCBpOworCXN0cnVjdCBtYXRjaCBtdjsKKwlzdHJ1Y3QgbWF0Y2ggKm0gPSAmbXY7CisJY29uc3QgY2hhciAqZHA7CisJY29uc3Qgc29wbm8gZ2YgPSBnLT5maXJzdHN0YXRlKzE7CS8qICsxIGZvciBPRU5EICovCisJY29uc3Qgc29wbm8gZ2wgPSBnLT5sYXN0c3RhdGU7CisJY29uc3QgY2hhciAqc3RhcnQ7CisJY29uc3QgY2hhciAqc3RvcDsKKwlpbnQgZXJyb3IgPSAwOworCisJX0RJQUdBU1NFUlQoZyAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdHJpbmcgIT0gTlVMTCk7CisJLyogcG1hdGNoIGNoZWNrZWQgYmVsb3cgKi8KKworCS8qIHNpbXBsaWZ5IHRoZSBzaXR1YXRpb24gd2hlcmUgcG9zc2libGUgKi8KKwlpZiAoZy0+Y2ZsYWdzJlJFR19OT1NVQikKKwkJbm1hdGNoID0gMDsKKwlpZiAoZWZsYWdzJlJFR19TVEFSVEVORCkgeworCQlfRElBR0FTU0VSVChwbWF0Y2ggIT0gTlVMTCk7CisJCXN0YXJ0ID0gc3RyaW5nICsgKHNpemVfdClwbWF0Y2hbMF0ucm1fc287CisJCXN0b3AgPSBzdHJpbmcgKyAoc2l6ZV90KXBtYXRjaFswXS5ybV9lbzsKKwl9IGVsc2UgeworCQlzdGFydCA9IHN0cmluZzsKKwkJc3RvcCA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKwl9CisJaWYgKHN0b3AgPCBzdGFydCkKKwkJcmV0dXJuKFJFR19JTlZBUkcpOworCisJLyogcHJlc2NyZWVuaW5nOyB0aGlzIGRvZXMgd29uZGVycyBmb3IgdGhpcyByYXRoZXIgc2xvdyBjb2RlICovCisJaWYgKGctPm11c3QgIT0gTlVMTCkgeworCQlmb3IgKGRwID0gc3RhcnQ7IGRwIDwgc3RvcDsgZHArKykKKwkJCWlmICgqZHAgPT0gZy0+bXVzdFswXSAmJiAoc2l6ZV90KShzdG9wIC0gZHApID49IGctPm1sZW4gJiYKKwkJCQltZW1jbXAoZHAsIGctPm11c3QsIGctPm1sZW4pID09IDApCisJCQkJYnJlYWs7CisJCWlmIChkcCA9PSBzdG9wKQkJLyogd2UgZGlkbid0IGZpbmQgZy0+bXVzdCAqLworCQkJcmV0dXJuKFJFR19OT01BVENIKTsKKwl9CisKKwkvKiBtYXRjaCBzdHJ1Y3Qgc2V0dXAgKi8KKwltLT5nID0gZzsKKwltLT5lZmxhZ3MgPSBlZmxhZ3M7CisJbS0+cG1hdGNoID0gTlVMTDsKKwltLT5sYXN0cG9zID0gTlVMTDsKKwltLT5vZmZwID0gc3RyaW5nOworCW0tPmJlZ2lucCA9IHN0YXJ0OworCW0tPmVuZHAgPSBzdG9wOworCVNUQVRFU0VUVVAobSwgNCk7CisJU0VUVVAobS0+c3QpOworCVNFVFVQKG0tPmZyZXNoKTsKKwlTRVRVUChtLT50bXApOworCVNFVFVQKG0tPmVtcHR5KTsKKwlDTEVBUihtLT5lbXB0eSk7CisKKwkvKiB0aGlzIGxvb3AgZG9lcyBvbmx5IG9uZSByZXBldGl0aW9uIGV4Y2VwdCBmb3IgYmFja3JlZnMgKi8KKwlmb3IgKDs7KSB7CisJCWVuZHAgPSBmYXN0KG0sIHN0YXJ0LCBzdG9wLCBnZiwgZ2wpOworCQlpZiAoZW5kcCA9PSBOVUxMKSB7CQkvKiBhIG1pc3MgKi8KKwkJCWVycm9yID0gUkVHX05PTUFUQ0g7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKG5tYXRjaCA9PSAwICYmICFnLT5iYWNrcmVmcykKKwkJCWJyZWFrOwkJLyogbm8gZnVydGhlciBpbmZvIG5lZWRlZCAqLworCisJCS8qIHdoZXJlPyAqLworCQlhc3NlcnQobS0+Y29sZHAgIT0gTlVMTCk7CisJCWZvciAoOzspIHsKKwkJCU5PVEUoImZpbmRpbmcgc3RhcnQiKTsKKwkJCWVuZHAgPSBzbG93KG0sIG0tPmNvbGRwLCBzdG9wLCBnZiwgZ2wpOworCQkJaWYgKGVuZHAgIT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWFzc2VydChtLT5jb2xkcCA8IG0tPmVuZHApOworCQkJbS0+Y29sZHArKzsKKwkJfQorCQlpZiAobm1hdGNoID09IDEgJiYgIWctPmJhY2tyZWZzKQorCQkJYnJlYWs7CQkvKiBubyBmdXJ0aGVyIGluZm8gbmVlZGVkICovCisKKwkJLyogb2ggbXksIGhlIHdhbnRzIHRoZSBzdWJleHByZXNzaW9ucy4uLiAqLworCQlpZiAobS0+cG1hdGNoID09IE5VTEwpCisJCQltLT5wbWF0Y2ggPSAocmVnbWF0Y2hfdCAqKW1hbGxvYygobS0+Zy0+bnN1YiArIDEpICoKKwkJCQkJCQlzaXplb2YocmVnbWF0Y2hfdCkpOworCQlpZiAobS0+cG1hdGNoID09IE5VTEwpIHsKKwkJCWVycm9yID0gUkVHX0VTUEFDRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlmb3IgKGkgPSAxOyBpIDw9IG0tPmctPm5zdWI7IGkrKykKKwkJCW0tPnBtYXRjaFtpXS5ybV9zbyA9IG0tPnBtYXRjaFtpXS5ybV9lbyA9IChyZWdvZmZfdCktMTsKKwkJaWYgKCFnLT5iYWNrcmVmcyAmJiAhKG0tPmVmbGFncyZSRUdfQkFDS1IpKSB7CisJCQlOT1RFKCJkaXNzZWN0aW5nIik7CisJCQlkcCA9IGRpc3NlY3QobSwgbS0+Y29sZHAsIGVuZHAsIGdmLCBnbCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZy0+bnBsdXMgPiAwICYmIG0tPmxhc3Rwb3MgPT0gTlVMTCkKKwkJCQltLT5sYXN0cG9zID0gbWFsbG9jKChnLT5ucGx1cysxKSAqCisJCQkJCQkJc2l6ZW9mKGNvbnN0IGNoYXIgKikpOworCQkJaWYgKGctPm5wbHVzID4gMCAmJiBtLT5sYXN0cG9zID09IE5VTEwpIHsKKwkJCQllcnJvciA9IFJFR19FU1BBQ0U7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJTk9URSgiYmFja3JlZiBkaXNzZWN0Iik7CisJCQlkcCA9IGJhY2tyZWYobSwgbS0+Y29sZHAsIGVuZHAsIGdmLCBnbCwgKHNvcG5vKTApOworCQl9CisJCWlmIChkcCAhPSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogdWgtb2guLi4gd2UgY291bGRuJ3QgZmluZCBhIHN1YmV4cHJlc3Npb24tbGV2ZWwgbWF0Y2ggKi8KKwkJYXNzZXJ0KGctPmJhY2tyZWZzKTsJLyogbXVzdCBiZSBiYWNrIHJlZmVyZW5jZXMgZG9pbmcgaXQgKi8KKwkJYXNzZXJ0KGctPm5wbHVzID09IDAgfHwgbS0+bGFzdHBvcyAhPSBOVUxMKTsKKwkJZm9yICg7OykgeworCQkJaWYgKGRwICE9IE5VTEwgfHwgZW5kcCA8PSBtLT5jb2xkcCkKKwkJCQlicmVhazsJCS8qIGRlZmVhdCAqLworCQkJTk9URSgiYmFja29mZiIpOworCQkJZW5kcCA9IHNsb3cobSwgbS0+Y29sZHAsIGVuZHAtMSwgZ2YsIGdsKTsKKwkJCWlmIChlbmRwID09IE5VTEwpCisJCQkJYnJlYWs7CQkvKiBkZWZlYXQgKi8KKwkJCS8qIHRyeSBpdCBvbiBhIHNob3J0ZXIgcG9zc2liaWxpdHkgKi8KKyNpZm5kZWYgTkRFQlVHCisJCQlmb3IgKGkgPSAxOyBpIDw9IG0tPmctPm5zdWI7IGkrKykgeworCQkJCWFzc2VydChtLT5wbWF0Y2hbaV0ucm1fc28gPT0gKHJlZ29mZl90KS0xKTsKKwkJCQlhc3NlcnQobS0+cG1hdGNoW2ldLnJtX2VvID09IChyZWdvZmZfdCktMSk7CisJCQl9CisjZW5kaWYKKwkJCU5PVEUoImJhY2tvZmYgZGlzc2VjdCIpOworCQkJZHAgPSBiYWNrcmVmKG0sIG0tPmNvbGRwLCBlbmRwLCBnZiwgZ2wsIChzb3BubykwKTsKKwkJfQorCQlhc3NlcnQoZHAgPT0gTlVMTCB8fCBkcCA9PSBlbmRwKTsKKwkJaWYgKGRwICE9IE5VTEwpCQkvKiBmb3VuZCBhIHNob3J0ZXIgb25lICovCisJCQlicmVhazsKKworCQkvKiBkZXNwaXRlIGluaXRpYWwgYXBwZWFyYW5jZXMsIHRoZXJlIGlzIG5vIG1hdGNoIGhlcmUgKi8KKwkJTk9URSgiZmFsc2UgYWxhcm0iKTsKKwkJc3RhcnQgPSBtLT5jb2xkcCArIDE7CS8qIHJlY3ljbGUgc3RhcnRpbmcgbGF0ZXIgKi8KKwkJYXNzZXJ0KHN0YXJ0IDw9IHN0b3ApOworCX0KKworCS8qIGZpbGwgaW4gdGhlIGRldGFpbHMgaWYgcmVxdWVzdGVkICovCisJaWYgKG5tYXRjaCA+IDApIHsKKwkJX0RJQUdBU1NFUlQocG1hdGNoICE9IE5VTEwpOworCQlwbWF0Y2hbMF0ucm1fc28gPSBtLT5jb2xkcCAtIG0tPm9mZnA7CisJCXBtYXRjaFswXS5ybV9lbyA9IGVuZHAgLSBtLT5vZmZwOworCX0KKwlpZiAobm1hdGNoID4gMSkgeworCQlhc3NlcnQobS0+cG1hdGNoICE9IE5VTEwpOworCQlmb3IgKGkgPSAxOyBpIDwgbm1hdGNoOyBpKyspCisJCQlpZiAoaSA8PSBtLT5nLT5uc3ViKQorCQkJCXBtYXRjaFtpXSA9IG0tPnBtYXRjaFtpXTsKKwkJCWVsc2UgeworCQkJCXBtYXRjaFtpXS5ybV9zbyA9IChyZWdvZmZfdCktMTsKKwkJCQlwbWF0Y2hbaV0ucm1fZW8gPSAocmVnb2ZmX3QpLTE7CisJCQl9CisJfQorCitkb25lOgorCWlmIChtLT5wbWF0Y2ggIT0gTlVMTCkgeworCQlmcmVlKG0tPnBtYXRjaCk7CisJCW0tPnBtYXRjaCA9IE5VTEw7CisJfQorCWlmIChtLT5sYXN0cG9zICE9IE5VTEwpIHsKKwkJZnJlZShtLT5sYXN0cG9zKTsKKwkJbS0+bGFzdHBvcyA9IE5VTEw7CisJfQorCVNUQVRFVEVBUkRPV04obSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorIC0gZGlzc2VjdCAtIGZpZ3VyZSBvdXQgd2hhdCBtYXRjaGVkIHdoYXQsIG5vIGJhY2sgcmVmZXJlbmNlcworID09IHN0YXRpYyBjb25zdCBjaGFyICpkaXNzZWN0KHN0cnVjdCBtYXRjaCAqbSwgY29uc3QgY2hhciAqc3RhcnQsIFwKKyA9PQljb25zdCBjaGFyICpzdG9wLCBzb3BubyBzdGFydHN0LCBzb3BubyBzdG9wc3QpOworICovCitzdGF0aWMgY29uc3QgY2hhciAqCQkJLyogPT0gc3RvcCAoc3VjY2VzcykgYWx3YXlzICovCitkaXNzZWN0KAorICAgIHN0cnVjdCBtYXRjaCAqbSwKKyAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICBjb25zdCBjaGFyICpzdG9wLAorICAgIHNvcG5vIHN0YXJ0c3QsCisgICAgc29wbm8gc3RvcHN0KQoreworCWludCBpOworCXNvcG5vIHNzOwkvKiBzdGFydCBzb3Agb2YgY3VycmVudCBzdWJSRSAqLworCXNvcG5vIGVzOwkvKiBlbmQgc29wIG9mIGN1cnJlbnQgc3ViUkUgKi8KKwljb25zdCBjaGFyICpzcDsJLyogc3RhcnQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgaXQgKi8KKwljb25zdCBjaGFyICpzdHA7IC8qIHN0cmluZyBtYXRjaGVkIGJ5IGl0IGNhbm5vdCBwYXNzIGhlcmUgKi8KKwljb25zdCBjaGFyICpyZXN0OyAvKiBzdGFydCBvZiByZXN0IG9mIHN0cmluZyAqLworCWNvbnN0IGNoYXIgKnRhaWw7IC8qIHN0cmluZyB1bm1hdGNoZWQgYnkgcmVzdCBvZiBSRSAqLworCXNvcG5vIHNzdWI7CS8qIHN0YXJ0IHNvcCBvZiBzdWJzdWJSRSAqLworCXNvcG5vIGVzdWI7CS8qIGVuZCBzb3Agb2Ygc3Vic3ViUkUgKi8KKwljb25zdCBjaGFyICpzc3A7IC8qIHN0YXJ0IG9mIHN0cmluZyBtYXRjaGVkIGJ5IHN1YnN1YlJFICovCisJY29uc3QgY2hhciAqc2VwOyAvKiBlbmQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgc3Vic3ViUkUgKi8KKwljb25zdCBjaGFyICpvbGRzc3A7IC8qIHByZXZpb3VzIHNzcCAqLworI2lmbmRlZiBOREVCVUcKKwljb25zdCBjaGFyICpkcDsKKyNlbmRpZgorCisJX0RJQUdBU1NFUlQobSAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdGFydCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdG9wICE9IE5VTEwpOworCisJQVQoImRpc3MiLCBzdGFydCwgc3RvcCwgc3RhcnRzdCwgc3RvcHN0KTsKKwlzcCA9IHN0YXJ0OworCWZvciAoc3MgPSBzdGFydHN0OyBzcyA8IHN0b3BzdDsgc3MgPSBlcykgeworCQkvKiBpZGVudGlmeSBlbmQgb2Ygc3ViUkUgKi8KKwkJZXMgPSBzczsKKwkJc3dpdGNoIChPUChtLT5nLT5zdHJpcFtlc10pKSB7CisJCWNhc2UgT1BMVVNfOgorCQljYXNlIE9RVUVTVF86CisJCQllcyArPSBPUE5EKG0tPmctPnN0cmlwW2VzXSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hfOgorCQkJd2hpbGUgKE9QKG0tPmctPnN0cmlwW2VzXSkgIT0gT19DSCkKKwkJCQllcyArPSBPUE5EKG0tPmctPnN0cmlwW2VzXSk7CisJCQlicmVhazsKKwkJfQorCQllcysrOworCisJCS8qIGZpZ3VyZSBvdXQgd2hhdCBpdCBtYXRjaGVkICovCisJCXN3aXRjaCAoT1AobS0+Zy0+c3RyaXBbc3NdKSkgeworCQljYXNlIE9FTkQ6CisJCQlhc3NlcnQobm9wZSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hBUjoKKwkJCXNwKys7CisJCQlicmVhazsKKwkJY2FzZSBPQk9MOgorCQljYXNlIE9FT0w6CisJCWNhc2UgT0JPVzoKKwkJY2FzZSBPRU9XOgorCQkJYnJlYWs7CisJCWNhc2UgT0FOWToKKwkJY2FzZSBPQU5ZT0Y6CisJCQlzcCsrOworCQkJYnJlYWs7CisJCWNhc2UgT0JBQ0tfOgorCQljYXNlIE9fQkFDSzoKKwkJCWFzc2VydChub3BlKTsKKwkJCWJyZWFrOworCQkvKiBjYXNlcyB3aGVyZSBsZW5ndGggb2YgbWF0Y2ggaXMgaGFyZCB0byBmaW5kICovCisJCWNhc2UgT1FVRVNUXzoKKwkJCXN0cCA9IHN0b3A7CisJCQlmb3IgKDs7KSB7CisJCQkJLyogaG93IGxvbmcgY291bGQgdGhpcyBvbmUgYmU/ICovCisJCQkJcmVzdCA9IHNsb3cobSwgc3AsIHN0cCwgc3MsIGVzKTsKKwkJCQlhc3NlcnQocmVzdCAhPSBOVUxMKTsJLyogaXQgZGlkIG1hdGNoICovCisJCQkJLyogY291bGQgdGhlIHJlc3QgbWF0Y2ggdGhlIHJlc3Q/ICovCisJCQkJdGFpbCA9IHNsb3cobSwgcmVzdCwgc3RvcCwgZXMsIHN0b3BzdCk7CisJCQkJaWYgKHRhaWwgPT0gc3RvcCkKKwkJCQkJYnJlYWs7CQkvKiB5ZXMhICovCisJCQkJLyogbm8gLS0gdHJ5IGEgc2hvcnRlciBtYXRjaCBmb3IgdGhpcyBvbmUgKi8KKwkJCQlzdHAgPSByZXN0IC0gMTsKKwkJCQlhc3NlcnQoc3RwID49IHNwKTsJLyogaXQgZGlkIHdvcmsgKi8KKwkJCX0KKwkJCXNzdWIgPSBzcyArIDE7CisJCQllc3ViID0gZXMgLSAxOworCQkJLyogZGlkIGlubmFyZHMgbWF0Y2g/ICovCisJCQlpZiAoc2xvdyhtLCBzcCwgcmVzdCwgc3N1YiwgZXN1YikgIT0gTlVMTCkgeworI2lmZGVmIE5ERUJVRworCQkJCSh2b2lkKQorI2Vsc2UKKwkJCQlkcCA9IAorI2VuZGlmCisJCQkJICAgIGRpc3NlY3QobSwgc3AsIHJlc3QsIHNzdWIsIGVzdWIpOworCQkJCWFzc2VydChkcCA9PSByZXN0KTsKKwkJCX0gZWxzZQkJLyogbm8gKi8KKwkJCQlhc3NlcnQoc3AgPT0gcmVzdCk7CisJCQlzcCA9IHJlc3Q7CisJCQlicmVhazsKKwkJY2FzZSBPUExVU186CisJCQlzdHAgPSBzdG9wOworCQkJZm9yICg7OykgeworCQkJCS8qIGhvdyBsb25nIGNvdWxkIHRoaXMgb25lIGJlPyAqLworCQkJCXJlc3QgPSBzbG93KG0sIHNwLCBzdHAsIHNzLCBlcyk7CisJCQkJYXNzZXJ0KHJlc3QgIT0gTlVMTCk7CS8qIGl0IGRpZCBtYXRjaCAqLworCQkJCS8qIGNvdWxkIHRoZSByZXN0IG1hdGNoIHRoZSByZXN0PyAqLworCQkJCXRhaWwgPSBzbG93KG0sIHJlc3QsIHN0b3AsIGVzLCBzdG9wc3QpOworCQkJCWlmICh0YWlsID09IHN0b3ApCisJCQkJCWJyZWFrOwkJLyogeWVzISAqLworCQkJCS8qIG5vIC0tIHRyeSBhIHNob3J0ZXIgbWF0Y2ggZm9yIHRoaXMgb25lICovCisJCQkJc3RwID0gcmVzdCAtIDE7CisJCQkJYXNzZXJ0KHN0cCA+PSBzcCk7CS8qIGl0IGRpZCB3b3JrICovCisJCQl9CisJCQlzc3ViID0gc3MgKyAxOworCQkJZXN1YiA9IGVzIC0gMTsKKwkJCXNzcCA9IHNwOworCQkJb2xkc3NwID0gc3NwOworCQkJZm9yICg7OykgewkvKiBmaW5kIGxhc3QgbWF0Y2ggb2YgaW5uYXJkcyAqLworCQkJCXNlcCA9IHNsb3cobSwgc3NwLCByZXN0LCBzc3ViLCBlc3ViKTsKKwkJCQlpZiAoc2VwID09IE5VTEwgfHwgc2VwID09IHNzcCkKKwkJCQkJYnJlYWs7CS8qIGZhaWxlZCBvciBtYXRjaGVkIG51bGwgKi8KKwkJCQlvbGRzc3AgPSBzc3A7CS8qIG9uIHRvIG5leHQgdHJ5ICovCisJCQkJc3NwID0gc2VwOworCQkJfQorCQkJaWYgKHNlcCA9PSBOVUxMKSB7CisJCQkJLyogbGFzdCBzdWNjZXNzZnVsIG1hdGNoICovCisJCQkJc2VwID0gc3NwOworCQkJCXNzcCA9IG9sZHNzcDsKKwkJCX0KKwkJCWFzc2VydChzZXAgPT0gcmVzdCk7CS8qIG11c3QgZXhoYXVzdCBzdWJzdHJpbmcgKi8KKwkJCWFzc2VydChzbG93KG0sIHNzcCwgc2VwLCBzc3ViLCBlc3ViKSA9PSByZXN0KTsKKyNpZmRlZiBOREVCVUcKKwkJCSh2b2lkKQorI2Vsc2UKKwkJCWRwID0KKyNlbmRpZgorCQkJICAgIGRpc3NlY3QobSwgc3NwLCBzZXAsIHNzdWIsIGVzdWIpOworCQkJYXNzZXJ0KGRwID09IHNlcCk7CisJCQlzcCA9IHJlc3Q7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hfOgorCQkJc3RwID0gc3RvcDsKKwkJCWZvciAoOzspIHsKKwkJCQkvKiBob3cgbG9uZyBjb3VsZCB0aGlzIG9uZSBiZT8gKi8KKwkJCQlyZXN0ID0gc2xvdyhtLCBzcCwgc3RwLCBzcywgZXMpOworCQkJCWFzc2VydChyZXN0ICE9IE5VTEwpOwkvKiBpdCBkaWQgbWF0Y2ggKi8KKwkJCQkvKiBjb3VsZCB0aGUgcmVzdCBtYXRjaCB0aGUgcmVzdD8gKi8KKwkJCQl0YWlsID0gc2xvdyhtLCByZXN0LCBzdG9wLCBlcywgc3RvcHN0KTsKKwkJCQlpZiAodGFpbCA9PSBzdG9wKQorCQkJCQlicmVhazsJCS8qIHllcyEgKi8KKwkJCQkvKiBubyAtLSB0cnkgYSBzaG9ydGVyIG1hdGNoIGZvciB0aGlzIG9uZSAqLworCQkJCXN0cCA9IHJlc3QgLSAxOworCQkJCWFzc2VydChzdHAgPj0gc3ApOwkvKiBpdCBkaWQgd29yayAqLworCQkJfQorCQkJc3N1YiA9IHNzICsgMTsKKwkJCWVzdWIgPSBzcyArIE9QTkQobS0+Zy0+c3RyaXBbc3NdKSAtIDE7CisJCQlhc3NlcnQoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjEpOworCQkJZm9yICg7OykgewkvKiBmaW5kIGZpcnN0IG1hdGNoaW5nIGJyYW5jaCAqLworCQkJCWlmIChzbG93KG0sIHNwLCByZXN0LCBzc3ViLCBlc3ViKSA9PSByZXN0KQorCQkJCQlicmVhazsJLyogaXQgbWF0Y2hlZCBhbGwgb2YgaXQgKi8KKwkJCQkvKiB0aGF0IG9uZSBtaXNzZWQsIHRyeSBuZXh0IG9uZSAqLworCQkJCWFzc2VydChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT09SMSk7CisJCQkJZXN1YisrOworCQkJCWFzc2VydChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT09SMik7CisJCQkJc3N1YiA9IGVzdWIgKyAxOworCQkJCWVzdWIgKz0gT1BORChtLT5nLT5zdHJpcFtlc3ViXSk7CisJCQkJaWYgKE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPT1IyKQorCQkJCQllc3ViLS07CisJCQkJZWxzZQorCQkJCQlhc3NlcnQoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9fQ0gpOworCQkJfQorI2lmZGVmIE5ERUJVRworCQkJKHZvaWQpCisjZWxzZQorCQkJZHAgPQorI2VuZGlmCisJCQkgICAgZGlzc2VjdChtLCBzcCwgcmVzdCwgc3N1YiwgZXN1Yik7CisJCQlhc3NlcnQoZHAgPT0gcmVzdCk7CisJCQlzcCA9IHJlc3Q7CisJCQlicmVhazsKKwkJY2FzZSBPX1BMVVM6CisJCWNhc2UgT19RVUVTVDoKKwkJY2FzZSBPT1IxOgorCQljYXNlIE9PUjI6CisJCWNhc2UgT19DSDoKKwkJCWFzc2VydChub3BlKTsKKwkJCWJyZWFrOworCQljYXNlIE9MUEFSRU46CisJCQlpID0gT1BORChtLT5nLT5zdHJpcFtzc10pOworCQkJYXNzZXJ0KDAgPCBpICYmIGkgPD0gbS0+Zy0+bnN1Yik7CisJCQltLT5wbWF0Y2hbaV0ucm1fc28gPSBzcCAtIG0tPm9mZnA7CisJCQlicmVhazsKKwkJY2FzZSBPUlBBUkVOOgorCQkJaSA9IE9QTkQobS0+Zy0+c3RyaXBbc3NdKTsKKwkJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQkJbS0+cG1hdGNoW2ldLnJtX2VvID0gc3AgLSBtLT5vZmZwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CQkvKiB1aCBvaCAqLworCQkJYXNzZXJ0KG5vcGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlhc3NlcnQoc3AgPT0gc3RvcCk7CisJcmV0dXJuKHNwKTsKK30KKworLyoKKyAtIGJhY2tyZWYgLSBmaWd1cmUgb3V0IHdoYXQgbWF0Y2hlZCB3aGF0LCBmaWd1cmluZyBpbiBiYWNrIHJlZmVyZW5jZXMKKyA9PSBzdGF0aWMgY29uc3QgY2hhciAqYmFja3JlZihzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBcCisgPT0JY29uc3QgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwgc29wbm8gc3RvcHN0LCBzb3BubyBsZXYpOworICovCitzdGF0aWMgY29uc3QgY2hhciAqCQkvKiA9PSBzdG9wIChzdWNjZXNzKSBvciBOVUxMIChmYWlsdXJlKSAqLworYmFja3JlZigKKyAgICBzdHJ1Y3QgbWF0Y2ggKm0sCisgICAgY29uc3QgY2hhciAqc3RhcnQsCisgICAgY29uc3QgY2hhciAqc3RvcCwKKyAgICBzb3BubyBzdGFydHN0LAorICAgIHNvcG5vIHN0b3BzdCwKKyAgICBzb3BubyBsZXYpCQkJLyogUExVUyBuZXN0aW5nIGxldmVsICovCit7CisJaW50IGk7CisJc29wbm8gc3M7CS8qIHN0YXJ0IHNvcCBvZiBjdXJyZW50IHN1YlJFICovCisJY29uc3QgY2hhciAqc3A7CS8qIHN0YXJ0IG9mIHN0cmluZyBtYXRjaGVkIGJ5IGl0ICovCisJc29wbm8gc3N1YjsJLyogc3RhcnQgc29wIG9mIHN1YnN1YlJFICovCisJc29wbm8gZXN1YjsJLyogZW5kIHNvcCBvZiBzdWJzdWJSRSAqLworCWNvbnN0IGNoYXIgKnNzcDsgLyogc3RhcnQgb2Ygc3RyaW5nIG1hdGNoZWQgYnkgc3Vic3ViUkUgKi8KKwljb25zdCBjaGFyICpkcDsKKwlzaXplX3QgbGVuOworCWludCBoYXJkOworCXNvcCBzOworCXJlZ29mZl90IG9mZnNhdmU7CisJY3NldCAqY3M7CisKKwlfRElBR0FTU0VSVChtICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKHN0YXJ0ICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKHN0b3AgIT0gTlVMTCk7CisKKwlBVCgiYmFjayIsIHN0YXJ0LCBzdG9wLCBzdGFydHN0LCBzdG9wc3QpOworCXNwID0gc3RhcnQ7CisKKwkvKiBnZXQgYXMgZmFyIGFzIHdlIGNhbiB3aXRoIGVhc3kgc3R1ZmYgKi8KKwloYXJkID0gMDsKKwlmb3IgKHNzID0gc3RhcnRzdDsgIWhhcmQgJiYgc3MgPCBzdG9wc3Q7IHNzKyspCisJCXN3aXRjaCAoT1AocyA9IG0tPmctPnN0cmlwW3NzXSkpIHsKKwkJY2FzZSBPQ0hBUjoKKwkJCWlmIChzcCA9PSBzdG9wIHx8ICpzcCsrICE9IChjaGFyKU9QTkQocykpCisJCQkJcmV0dXJuKE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgT0FOWToKKwkJCWlmIChzcCA9PSBzdG9wKQorCQkJCXJldHVybihOVUxMKTsKKwkJCXNwKys7CisJCQlicmVhazsKKwkJY2FzZSBPQU5ZT0Y6CisJCQljcyA9ICZtLT5nLT5zZXRzW09QTkQocyldOworCQkJaWYgKHNwID09IHN0b3AgfHwgIUNISU4oY3MsICpzcCsrKSkKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBPQk9MOgorCQkJaWYgKCAoc3AgPT0gbS0+YmVnaW5wICYmICEobS0+ZWZsYWdzJlJFR19OT1RCT0wpKSB8fAorCQkJCQkoc3AgPCBtLT5lbmRwICYmICooc3AtMSkgPT0gJ1xuJyAmJgorCQkJCQkJKG0tPmctPmNmbGFncyZSRUdfTkVXTElORSkpICkKKwkJCQl7IC8qIHllcyAqLyB9CisJCQllbHNlCisJCQkJcmV0dXJuKE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgT0VPTDoKKwkJCWlmICggKHNwID09IG0tPmVuZHAgJiYgIShtLT5lZmxhZ3MmUkVHX05PVEVPTCkpIHx8CisJCQkJCShzcCA8IG0tPmVuZHAgJiYgKnNwID09ICdcbicgJiYKKwkJCQkJCShtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpKSApCisJCQkJeyAvKiB5ZXMgKi8gfQorCQkJZWxzZQorCQkJCXJldHVybihOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE9CT1c6CisJCQlpZiAoKCAoc3AgPT0gbS0+YmVnaW5wICYmICEobS0+ZWZsYWdzJlJFR19OT1RCT0wpKSB8fAorCQkJCQkoc3AgPCBtLT5lbmRwICYmICooc3AtMSkgPT0gJ1xuJyAmJgorCQkJCQkJKG0tPmctPmNmbGFncyZSRUdfTkVXTElORSkpIHx8CisJCQkJCShzcCA+IG0tPmJlZ2lucCAmJgorCQkJCQkJCSFJU1dPUkQoKihzcC0xKSkpICkgJiYKKwkJCQkJKHNwIDwgbS0+ZW5kcCAmJiBJU1dPUkQoKnNwKSkgKQorCQkJCXsgLyogeWVzICovIH0KKwkJCWVsc2UKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQlicmVhazsKKwkJY2FzZSBPRU9XOgorCQkJaWYgKCggKHNwID09IG0tPmVuZHAgJiYgIShtLT5lZmxhZ3MmUkVHX05PVEVPTCkpIHx8CisJCQkJCShzcCA8IG0tPmVuZHAgJiYgKnNwID09ICdcbicgJiYKKwkJCQkJCShtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpKSB8fAorCQkJCQkoc3AgPCBtLT5lbmRwICYmICFJU1dPUkQoKnNwKSkgKSAmJgorCQkJCQkoc3AgPiBtLT5iZWdpbnAgJiYgSVNXT1JEKCooc3AtMSkpKSApCisJCQkJeyAvKiB5ZXMgKi8gfQorCQkJZWxzZQorCQkJCXJldHVybihOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIE9fUVVFU1Q6CisJCQlicmVhazsKKwkJY2FzZSBPT1IxOgkvKiBtYXRjaGVzIG51bGwgYnV0IG5lZWRzIHRvIHNraXAgKi8KKwkJCXNzKys7CisJCQlzID0gbS0+Zy0+c3RyaXBbc3NdOworCQkJZG8geworCQkJCWFzc2VydChPUChzKSA9PSBPT1IyKTsKKwkJCQlzcyArPSBPUE5EKHMpOworCQkJfSB3aGlsZSAoT1AocyA9IG0tPmctPnN0cmlwW3NzXSkgIT0gT19DSCk7CisJCQkvKiBub3RlIHRoYXQgdGhlIHNzKysgZ2V0cyB1cyBwYXN0IHRoZSBPX0NIICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogaGF2ZSB0byBtYWtlIGEgY2hvaWNlICovCisJCQloYXJkID0gMTsKKwkJCWJyZWFrOworCQl9CisJaWYgKCFoYXJkKSB7CQkvKiB0aGF0IHdhcyBpdCEgKi8KKwkJaWYgKHNwICE9IHN0b3ApCisJCQlyZXR1cm4oTlVMTCk7CisJCXJldHVybihzcCk7CisJfQorCXNzLS07CQkJLyogYWRqdXN0IGZvciB0aGUgZm9yJ3MgZmluYWwgaW5jcmVtZW50ICovCisKKwkvKiB0aGUgaGFyZCBzdHVmZiAqLworCUFUKCJoYXJkIiwgc3AsIHN0b3AsIHNzLCBzdG9wc3QpOworCXMgPSBtLT5nLT5zdHJpcFtzc107CisJc3dpdGNoIChPUChzKSkgeworCWNhc2UgT0JBQ0tfOgkJLyogdGhlIHZpbGVzdCBkZXB0aHMgKi8KKwkJaSA9IE9QTkQocyk7CisJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQlpZiAobS0+cG1hdGNoW2ldLnJtX2VvID09IChyZWdvZmZfdCktMSkKKwkJCXJldHVybihOVUxMKTsKKwkJYXNzZXJ0KG0tPnBtYXRjaFtpXS5ybV9zbyAhPSAocmVnb2ZmX3QpLTEpOworCQlsZW4gPSAoc2l6ZV90KShtLT5wbWF0Y2hbaV0ucm1fZW8gLSBtLT5wbWF0Y2hbaV0ucm1fc28pOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4oTlVMTCk7CisJCWFzc2VydChzdG9wIC0gbS0+YmVnaW5wID49IGxlbik7CisJCWlmIChzcCA+IHN0b3AgLSBsZW4pCisJCQlyZXR1cm4oTlVMTCk7CS8qIG5vdCBlbm91Z2ggbGVmdCB0byBtYXRjaCAqLworCQlzc3AgPSBtLT5vZmZwICsgKHNpemVfdCltLT5wbWF0Y2hbaV0ucm1fc287CisJCWlmIChtZW1jbXAoc3AsIHNzcCwgbGVuKSAhPSAwKQorCQkJcmV0dXJuKE5VTEwpOworCQl3aGlsZSAobS0+Zy0+c3RyaXBbc3NdICE9IFNPUChPX0JBQ0ssIGkpKQorCQkJc3MrKzsKKwkJcmV0dXJuKGJhY2tyZWYobSwgc3ArbGVuLCBzdG9wLCBzcysxLCBzdG9wc3QsIGxldikpOworCisJY2FzZSBPUVVFU1RfOgkJLyogdG8gbnVsbCBvciBub3QgKi8KKwkJZHAgPSBiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcysxLCBzdG9wc3QsIGxldik7CisJCWlmIChkcCAhPSBOVUxMKQorCQkJcmV0dXJuKGRwKTsJLyogbm90ICovCisJCXJldHVybihiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcytPUE5EKHMpKzEsIHN0b3BzdCwgbGV2KSk7CisKKwljYXNlIE9QTFVTXzoKKwkJYXNzZXJ0KG0tPmxhc3Rwb3MgIT0gTlVMTCk7CisJCWFzc2VydChsZXYrMSA8PSBtLT5nLT5ucGx1cyk7CisJCW0tPmxhc3Rwb3NbbGV2KzFdID0gc3A7CisJCXJldHVybihiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcysxLCBzdG9wc3QsIGxldisxKSk7CisKKwljYXNlIE9fUExVUzoKKwkJaWYgKHNwID09IG0tPmxhc3Rwb3NbbGV2XSkJLyogbGFzdCBwYXNzIG1hdGNoZWQgbnVsbCAqLworCQkJcmV0dXJuKGJhY2tyZWYobSwgc3AsIHN0b3AsIHNzKzEsIHN0b3BzdCwgbGV2LTEpKTsKKwkJLyogdHJ5IGFub3RoZXIgcGFzcyAqLworCQltLT5sYXN0cG9zW2xldl0gPSBzcDsKKwkJZHAgPSBiYWNrcmVmKG0sIHNwLCBzdG9wLCBzcy1PUE5EKHMpKzEsIHN0b3BzdCwgbGV2KTsKKwkJaWYgKGRwID09IE5VTEwpCisJCQlkcCA9IGJhY2tyZWYobSwgc3AsIHN0b3AsIHNzKzEsIHN0b3BzdCwgbGV2LTEpOworCQlyZXR1cm4oZHApOworCisJY2FzZSBPQ0hfOgkJLyogZmluZCB0aGUgcmlnaHQgb25lLCBpZiBhbnkgKi8KKwkJc3N1YiA9IHNzICsgMTsKKwkJZXN1YiA9IHNzICsgT1BORChzKSAtIDE7CisJCWFzc2VydChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT09SMSk7CisJCWZvciAoOzspIHsJLyogZmluZCBmaXJzdCBtYXRjaGluZyBicmFuY2ggKi8KKwkJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3N1YiwgZXN1YiwgbGV2KTsKKwkJCWlmIChkcCAhPSBOVUxMKQorCQkJCXJldHVybihkcCk7CisJCQkvKiB0aGF0IG9uZSBtaXNzZWQsIHRyeSBuZXh0IG9uZSAqLworCQkJaWYgKE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPX0NIKQorCQkJCXJldHVybihOVUxMKTsJLyogdGhlcmUgaXMgbm9uZSAqLworCQkJZXN1YisrOworCQkJYXNzZXJ0KE9QKG0tPmctPnN0cmlwW2VzdWJdKSA9PSBPT1IyKTsKKwkJCXNzdWIgPSBlc3ViICsgMTsKKwkJCWVzdWIgKz0gT1BORChtLT5nLT5zdHJpcFtlc3ViXSk7CisJCQlpZiAoT1AobS0+Zy0+c3RyaXBbZXN1Yl0pID09IE9PUjIpCisJCQkJZXN1Yi0tOworCQkJZWxzZQorCQkJCWFzc2VydChPUChtLT5nLT5zdHJpcFtlc3ViXSkgPT0gT19DSCk7CisJCX0KKworCWNhc2UgT0xQQVJFTjoJCS8qIG11c3QgdW5kbyBhc3NpZ25tZW50IGlmIHJlc3QgZmFpbHMgKi8KKwkJaSA9IE9QTkQocyk7CisJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQlvZmZzYXZlID0gbS0+cG1hdGNoW2ldLnJtX3NvOworCQltLT5wbWF0Y2hbaV0ucm1fc28gPSBzcCAtIG0tPm9mZnA7CisJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYpOworCQlpZiAoZHAgIT0gTlVMTCkKKwkJCXJldHVybihkcCk7CisJCW0tPnBtYXRjaFtpXS5ybV9zbyA9IG9mZnNhdmU7CisJCXJldHVybihOVUxMKTsKKworCWNhc2UgT1JQQVJFTjoJCS8qIG11c3QgdW5kbyBhc3NpZ25tZW50IGlmIHJlc3QgZmFpbHMgKi8KKwkJaSA9IE9QTkQocyk7CisJCWFzc2VydCgwIDwgaSAmJiBpIDw9IG0tPmctPm5zdWIpOworCQlvZmZzYXZlID0gbS0+cG1hdGNoW2ldLnJtX2VvOworCQltLT5wbWF0Y2hbaV0ucm1fZW8gPSBzcCAtIG0tPm9mZnA7CisJCWRwID0gYmFja3JlZihtLCBzcCwgc3RvcCwgc3MrMSwgc3RvcHN0LCBsZXYpOworCQlpZiAoZHAgIT0gTlVMTCkKKwkJCXJldHVybihkcCk7CisJCW0tPnBtYXRjaFtpXS5ybV9lbyA9IG9mZnNhdmU7CisJCXJldHVybihOVUxMKTsKKworCWRlZmF1bHQ6CQkvKiB1aCBvaCAqLworCQlhc3NlcnQobm9wZSk7CisJCWJyZWFrOworCX0KKworCS8qICJjYW4ndCBoYXBwZW4iICovCisJYXNzZXJ0KG5vcGUpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAtIGZhc3QgLSBzdGVwIHRocm91Z2ggdGhlIHN0cmluZyBhdCB0b3Agc3BlZWQKKyA9PSBzdGF0aWMgY29uc3QgY2hhciAqZmFzdChzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBcCisgPT0JY29uc3QgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwgc29wbm8gc3RvcHN0KTsKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgkJLyogd2hlcmUgdGVudGF0aXZlIG1hdGNoIGVuZGVkLCBvciBOVUxMICovCitmYXN0KAorICAgIHN0cnVjdCBtYXRjaCAqbSwKKyAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICBjb25zdCBjaGFyICpzdG9wLAorICAgIHNvcG5vIHN0YXJ0c3QsCisgICAgc29wbm8gc3RvcHN0KQoreworCXN0YXRlcyBzdCA9IG0tPnN0OworCXN0YXRlcyBmcmVzaCA9IG0tPmZyZXNoOworCXN0YXRlcyB0bXAgPSBtLT50bXA7CisJY29uc3QgY2hhciAqcCA9IHN0YXJ0OworCWludCBjID0gKHN0YXJ0ID09IG0tPmJlZ2lucCkgPyBPVVQgOiAqKHN0YXJ0LTEpOworCWludCBsYXN0YzsJLyogcHJldmlvdXMgYyAqLworCWludCBmbGFnY2g7CisJc2l6ZV90IGk7CisJY29uc3QgY2hhciAqY29sZHA7IC8qIGxhc3QgcCBhZnRlciB3aGljaCBubyBtYXRjaCB3YXMgdW5kZXJ3YXkgKi8KKworCV9ESUFHQVNTRVJUKG0gIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoc3RhcnQgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoc3RvcCAhPSBOVUxMKTsKKworCUNMRUFSKHN0KTsKKwlTRVQxKHN0LCBzdGFydHN0KTsKKwlzdCA9IHN0ZXAobS0+Zywgc3RhcnRzdCwgc3RvcHN0LCBzdCwgTk9USElORywgc3QpOworCUFTU0lHTihmcmVzaCwgc3QpOworCVNQKCJzdGFydCIsIHN0LCAqcCk7CisJY29sZHAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJLyogbmV4dCBjaGFyYWN0ZXIgKi8KKwkJbGFzdGMgPSBjOworCQljID0gKHAgPT0gbS0+ZW5kcCkgPyBPVVQgOiAqcDsKKwkJaWYgKEVRKHN0LCBmcmVzaCkpCisJCQljb2xkcCA9IHA7CisKKwkJLyogaXMgdGhlcmUgYW4gRU9MIGFuZC9vciBCT0wgYmV0d2VlbiBsYXN0YyBhbmQgYz8gKi8KKwkJZmxhZ2NoID0gJ1wwJzsKKwkJaSA9IDA7CisJCWlmICggKGxhc3RjID09ICdcbicgJiYgbS0+Zy0+Y2ZsYWdzJlJFR19ORVdMSU5FKSB8fAorCQkJCShsYXN0YyA9PSBPVVQgJiYgIShtLT5lZmxhZ3MmUkVHX05PVEJPTCkpICkgeworCQkJZmxhZ2NoID0gQk9MOworCQkJaSA9IG0tPmctPm5ib2w7CisJCX0KKwkJaWYgKCAoYyA9PSAnXG4nICYmIG0tPmctPmNmbGFncyZSRUdfTkVXTElORSkgfHwKKwkJCQkoYyA9PSBPVVQgJiYgIShtLT5lZmxhZ3MmUkVHX05PVEVPTCkpICkgeworCQkJZmxhZ2NoID0gKGZsYWdjaCA9PSBCT0wpID8gQk9MRU9MIDogRU9MOworCQkJaSArPSBtLT5nLT5uZW9sOworCQl9CisJCWlmIChpICE9IDApIHsKKwkJCWZvciAoOyBpID4gMDsgaS0tKQorCQkJCXN0ID0gc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHN0LCBmbGFnY2gsIHN0KTsKKwkJCVNQKCJib2xlb2wiLCBzdCwgYyk7CisJCX0KKworCQkvKiBob3cgYWJvdXQgYSB3b3JkIGJvdW5kYXJ5PyAqLworCQlpZiAoIChmbGFnY2ggPT0gQk9MIHx8IChsYXN0YyAhPSBPVVQgJiYgIUlTV09SRChsYXN0YykpKSAmJgorCQkJCQkoYyAhPSBPVVQgJiYgSVNXT1JEKGMpKSApIHsKKwkJCWZsYWdjaCA9IEJPVzsKKwkJfQorCQlpZiAoIChsYXN0YyAhPSBPVVQgJiYgSVNXT1JEKGxhc3RjKSkgJiYKKwkJCQkoZmxhZ2NoID09IEVPTCB8fCAoYyAhPSBPVVQgJiYgIUlTV09SRChjKSkpICkgeworCQkJZmxhZ2NoID0gRU9XOworCQl9CisJCWlmIChmbGFnY2ggPT0gQk9XIHx8IGZsYWdjaCA9PSBFT1cpIHsKKwkJCXN0ID0gc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHN0LCBmbGFnY2gsIHN0KTsKKwkJCVNQKCJib3dlb3ciLCBzdCwgYyk7CisJCX0KKworCQkvKiBhcmUgd2UgZG9uZT8gKi8KKwkJaWYgKElTU0VUKHN0LCBzdG9wc3QpIHx8IHAgPT0gc3RvcCkKKwkJCWJyZWFrOwkJLyogTk9URSBCUkVBSyBPVVQgKi8KKworCQkvKiBubywgd2UgbXVzdCBkZWFsIHdpdGggdGhpcyBjaGFyYWN0ZXIgKi8KKwkJQVNTSUdOKHRtcCwgc3QpOworCQlBU1NJR04oc3QsIGZyZXNoKTsKKwkJYXNzZXJ0KGMgIT0gT1VUKTsKKwkJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgdG1wLCBjLCBzdCk7CisJCVNQKCJhZnQiLCBzdCwgYyk7CisJCWFzc2VydChFUShzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIE5PVEhJTkcsIHN0KSwgc3QpKTsKKwkJcCsrOworCX0KKworCWFzc2VydChjb2xkcCAhPSBOVUxMKTsKKwltLT5jb2xkcCA9IGNvbGRwOworCWlmIChJU1NFVChzdCwgc3RvcHN0KSkKKwkJcmV0dXJuKHArMSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7Cit9CisKKy8qCisgLSBzbG93IC0gc3RlcCB0aHJvdWdoIHRoZSBzdHJpbmcgbW9yZSBkZWxpYmVyYXRlbHkKKyA9PSBzdGF0aWMgY29uc3QgY2hhciAqc2xvdyhzdHJ1Y3QgbWF0Y2ggKm0sIGNvbnN0IGNoYXIgKnN0YXJ0LCBcCisgPT0JY29uc3QgY2hhciAqc3RvcCwgc29wbm8gc3RhcnRzdCwgc29wbm8gc3RvcHN0KTsKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgkJCS8qIHdoZXJlIGl0IGVuZGVkICovCitzbG93KAorICAgIHN0cnVjdCBtYXRjaCAqbSwKKyAgICBjb25zdCBjaGFyICpzdGFydCwKKyAgICBjb25zdCBjaGFyICpzdG9wLAorICAgIHNvcG5vIHN0YXJ0c3QsCisgICAgc29wbm8gc3RvcHN0KQoreworCXN0YXRlcyBzdCA9IG0tPnN0OworCXN0YXRlcyBlbXB0eSA9IG0tPmVtcHR5OworCXN0YXRlcyB0bXAgPSBtLT50bXA7CisJY29uc3QgY2hhciAqcCA9IHN0YXJ0OworCWludCBjID0gKHN0YXJ0ID09IG0tPmJlZ2lucCkgPyBPVVQgOiAqKHN0YXJ0LTEpOworCWludCBsYXN0YzsJLyogcHJldmlvdXMgYyAqLworCWludCBmbGFnY2g7CisJc2l6ZV90IGk7CisJY29uc3QgY2hhciAqbWF0Y2hwOwkvKiBsYXN0IHAgYXQgd2hpY2ggYSBtYXRjaCBlbmRlZCAqLworCisJX0RJQUdBU1NFUlQobSAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdGFydCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdG9wICE9IE5VTEwpOworCisJQVQoInNsb3ciLCBzdGFydCwgc3RvcCwgc3RhcnRzdCwgc3RvcHN0KTsKKwlDTEVBUihzdCk7CisJU0VUMShzdCwgc3RhcnRzdCk7CisJU1AoInNzdGFydCIsIHN0LCAqcCk7CisJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIE5PVEhJTkcsIHN0KTsKKwltYXRjaHAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJLyogbmV4dCBjaGFyYWN0ZXIgKi8KKwkJbGFzdGMgPSBjOworCQljID0gKHAgPT0gbS0+ZW5kcCkgPyBPVVQgOiAqcDsKKworCQkvKiBpcyB0aGVyZSBhbiBFT0wgYW5kL29yIEJPTCBiZXR3ZWVuIGxhc3RjIGFuZCBjPyAqLworCQlmbGFnY2ggPSAnXDAnOworCQlpID0gMDsKKwkJaWYgKCAobGFzdGMgPT0gJ1xuJyAmJiBtLT5nLT5jZmxhZ3MmUkVHX05FV0xJTkUpIHx8CisJCQkJKGxhc3RjID09IE9VVCAmJiAhKG0tPmVmbGFncyZSRUdfTk9UQk9MKSkgKSB7CisJCQlmbGFnY2ggPSBCT0w7CisJCQlpID0gbS0+Zy0+bmJvbDsKKwkJfQorCQlpZiAoIChjID09ICdcbicgJiYgbS0+Zy0+Y2ZsYWdzJlJFR19ORVdMSU5FKSB8fAorCQkJCShjID09IE9VVCAmJiAhKG0tPmVmbGFncyZSRUdfTk9URU9MKSkgKSB7CisJCQlmbGFnY2ggPSAoZmxhZ2NoID09IEJPTCkgPyBCT0xFT0wgOiBFT0w7CisJCQlpICs9IG0tPmctPm5lb2w7CisJCX0KKwkJaWYgKGkgIT0gMCkgeworCQkJZm9yICg7IGkgPiAwOyBpLS0pCisJCQkJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgc3QsIGZsYWdjaCwgc3QpOworCQkJU1AoInNib2xlb2wiLCBzdCwgYyk7CisJCX0KKworCQkvKiBob3cgYWJvdXQgYSB3b3JkIGJvdW5kYXJ5PyAqLworCQlpZiAoIChmbGFnY2ggPT0gQk9MIHx8IChsYXN0YyAhPSBPVVQgJiYgIUlTV09SRChsYXN0YykpKSAmJgorCQkJCQkoYyAhPSBPVVQgJiYgSVNXT1JEKGMpKSApIHsKKwkJCWZsYWdjaCA9IEJPVzsKKwkJfQorCQlpZiAoIChsYXN0YyAhPSBPVVQgJiYgSVNXT1JEKGxhc3RjKSkgJiYKKwkJCQkoZmxhZ2NoID09IEVPTCB8fCAoYyAhPSBPVVQgJiYgIUlTV09SRChjKSkpICkgeworCQkJZmxhZ2NoID0gRU9XOworCQl9CisJCWlmIChmbGFnY2ggPT0gQk9XIHx8IGZsYWdjaCA9PSBFT1cpIHsKKwkJCXN0ID0gc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHN0LCBmbGFnY2gsIHN0KTsKKwkJCVNQKCJzYm93ZW93Iiwgc3QsIGMpOworCQl9CisKKwkJLyogYXJlIHdlIGRvbmU/ICovCisJCWlmIChJU1NFVChzdCwgc3RvcHN0KSkKKwkJCW1hdGNocCA9IHA7CisJCWlmIChFUShzdCwgZW1wdHkpIHx8IHAgPT0gc3RvcCkKKwkJCWJyZWFrOwkJLyogTk9URSBCUkVBSyBPVVQgKi8KKworCQkvKiBubywgd2UgbXVzdCBkZWFsIHdpdGggdGhpcyBjaGFyYWN0ZXIgKi8KKwkJQVNTSUdOKHRtcCwgc3QpOworCQlBU1NJR04oc3QsIGVtcHR5KTsKKwkJYXNzZXJ0KGMgIT0gT1VUKTsKKwkJc3QgPSBzdGVwKG0tPmcsIHN0YXJ0c3QsIHN0b3BzdCwgdG1wLCBjLCBzdCk7CisJCVNQKCJzYWZ0Iiwgc3QsIGMpOworCQlhc3NlcnQoRVEoc3RlcChtLT5nLCBzdGFydHN0LCBzdG9wc3QsIHN0LCBOT1RISU5HLCBzdCksIHN0KSk7CisJCXArKzsKKwl9CisKKwlyZXR1cm4obWF0Y2hwKTsKK30KKworCisvKgorIC0gc3RlcCAtIG1hcCBzZXQgb2Ygc3RhdGVzIHJlYWNoYWJsZSBiZWZvcmUgY2hhciB0byBzZXQgcmVhY2hhYmxlIGFmdGVyCisgPT0gc3RhdGljIHN0YXRlcyBzdGVwKHN0cnVjdCByZV9ndXRzICpnLCBzb3BubyBzdGFydCwgc29wbm8gc3RvcCwgXAorID09CXN0YXRlcyBiZWYsIGludCBjaCwgc3RhdGVzIGFmdCk7CisgPT0gI2RlZmluZQlCT0wJKE9VVCsxKQorID09ICNkZWZpbmUJRU9MCShCT0wrMSkKKyA9PSAjZGVmaW5lCUJPTEVPTAkoQk9MKzIpCisgPT0gI2RlZmluZQlOT1RISU5HCShCT0wrMykKKyA9PSAjZGVmaW5lCUJPVwkoQk9MKzQpCisgPT0gI2RlZmluZQlFT1cJKEJPTCs1KQorID09ICNkZWZpbmUJQ09ERU1BWAkoQk9MKzUpCQkvLyBoaWdoZXN0IGNvZGUgdXNlZAorID09ICNkZWZpbmUJTk9OQ0hBUihjKQkoKGMpID4gQ0hBUl9NQVgpCisgPT0gI2RlZmluZQlOTk9OQ0hBUgkoQ09ERU1BWC1DSEFSX01BWCkKKyAqLworc3RhdGljIHN0YXRlcworc3RlcCgKKyAgICBzdHJ1Y3QgcmVfZ3V0cyAqZywKKyAgICBzb3BubyBzdGFydCwJCS8qIHN0YXJ0IHN0YXRlIHdpdGhpbiBzdHJpcCAqLworICAgIHNvcG5vIHN0b3AsCQkJLyogc3RhdGUgYWZ0ZXIgc3RvcCBzdGF0ZSB3aXRoaW4gc3RyaXAgKi8KKyAgICBzdGF0ZXMgYmVmLAkJCS8qIHN0YXRlcyByZWFjaGFibGUgYmVmb3JlICovCisgICAgaW50IGNoLAkJCS8qIGNoYXJhY3RlciBvciBOT05DSEFSIGNvZGUgKi8KKyAgICBzdGF0ZXMgYWZ0KQkJCS8qIHN0YXRlcyBhbHJlYWR5IGtub3duIHJlYWNoYWJsZSBhZnRlciAqLworeworCWNzZXQgKmNzOworCXNvcCBzOworCXNvcG5vIHBjOworCW9uZXN0YXRlIGhlcmU7CQkvKiBub3RlLCBtYWNyb3Mga25vdyB0aGlzIG5hbWUgKi8KKwlzb3BubyBsb29rOworCWludCBpOworCisJX0RJQUdBU1NFUlQoZyAhPSBOVUxMKTsKKworCWZvciAocGMgPSBzdGFydCwgSU5JVChoZXJlLCBwYyk7IHBjICE9IHN0b3A7IHBjKyssIElOQyhoZXJlKSkgeworCQlzID0gZy0+c3RyaXBbcGNdOworCQlzd2l0Y2ggKE9QKHMpKSB7CisJCWNhc2UgT0VORDoKKwkJCWFzc2VydChwYyA9PSBzdG9wLTEpOworCQkJYnJlYWs7CisJCWNhc2UgT0NIQVI6CisJCQkvKiBvbmx5IGNoYXJhY3RlcnMgY2FuIG1hdGNoICovCisJCQlhc3NlcnQoIU5PTkNIQVIoY2gpIHx8IGNoICE9IChjaGFyKU9QTkQocykpOworCQkJaWYgKGNoID09IChjaGFyKU9QTkQocykpCisJCQkJRldEKGFmdCwgYmVmLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9CT0w6CisJCQlpZiAoY2ggPT0gQk9MIHx8IGNoID09IEJPTEVPTCkKKwkJCQlGV0QoYWZ0LCBiZWYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0VPTDoKKwkJCWlmIChjaCA9PSBFT0wgfHwgY2ggPT0gQk9MRU9MKQorCQkJCUZXRChhZnQsIGJlZiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPQk9XOgorCQkJaWYgKGNoID09IEJPVykKKwkJCQlGV0QoYWZ0LCBiZWYsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0VPVzoKKwkJCWlmIChjaCA9PSBFT1cpCisJCQkJRldEKGFmdCwgYmVmLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9BTlk6CisJCQlpZiAoIU5PTkNIQVIoY2gpKQorCQkJCUZXRChhZnQsIGJlZiwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPQU5ZT0Y6CisJCQljcyA9ICZnLT5zZXRzW09QTkQocyldOworCQkJaWYgKCFOT05DSEFSKGNoKSAmJiBDSElOKGNzLCBjaCkpCisJCQkJRldEKGFmdCwgYmVmLCAxKTsKKwkJCWJyZWFrOworCQljYXNlIE9CQUNLXzoJCS8qIGlnbm9yZWQgaGVyZSAqLworCQljYXNlIE9fQkFDSzoKKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPUExVU186CQkvKiBmb3J3YXJkLCB0aGlzIGlzIGp1c3QgYW4gZW1wdHkgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPX1BMVVM6CQkvKiBib3RoIGZvcndhcmQgYW5kIGJhY2sgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlpID0gSVNTRVRCQUNLKGFmdCwgT1BORChzKSk7CisJCQlCQUNLKGFmdCwgYWZ0LCBPUE5EKHMpKTsKKwkJCWlmICghaSAmJiBJU1NFVEJBQ0soYWZ0LCBPUE5EKHMpKSkgeworCQkJCS8qIG9obywgbXVzdCByZWNvbnNpZGVyIGxvb3AgYm9keSAqLworCQkJCXBjIC09IE9QTkQocykgKyAxOworCQkJCUlOSVQoaGVyZSwgcGMpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT1FVRVNUXzoJCS8qIHR3byBicmFuY2hlcywgYm90aCBmb3J3YXJkICovCisJCQlGV0QoYWZ0LCBhZnQsIDEpOworCQkJRldEKGFmdCwgYWZ0LCBPUE5EKHMpKTsKKwkJCWJyZWFrOworCQljYXNlIE9fUVVFU1Q6CQkvKiBqdXN0IGFuIGVtcHR5ICovCisJCQlGV0QoYWZ0LCBhZnQsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgT0xQQVJFTjoJCS8qIG5vdCBzaWduaWZpY2FudCBoZXJlICovCisJCWNhc2UgT1JQQVJFTjoKKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlicmVhazsKKwkJY2FzZSBPQ0hfOgkJLyogbWFyayB0aGUgZmlyc3QgdHdvIGJyYW5jaGVzICovCisJCQlGV0QoYWZ0LCBhZnQsIDEpOworCQkJYXNzZXJ0KE9QKGctPnN0cmlwW3BjK09QTkQocyldKSA9PSBPT1IyKTsKKwkJCUZXRChhZnQsIGFmdCwgT1BORChzKSk7CisJCQlicmVhazsKKwkJY2FzZSBPT1IxOgkJLyogZG9uZSBhIGJyYW5jaCwgZmluZCB0aGUgT19DSCAqLworCQkJaWYgKElTU1RBVEVJTihhZnQsIGhlcmUpKSB7CisJCQkJZm9yIChsb29rID0gMTsKKwkJCQkJCU9QKHMgPSBnLT5zdHJpcFtwYytsb29rXSkgIT0gT19DSDsKKwkJCQkJCWxvb2sgKz0gT1BORChzKSkKKwkJCQkJYXNzZXJ0KE9QKHMpID09IE9PUjIpOworCQkJCUZXRChhZnQsIGFmdCwgbG9vayk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPT1IyOgkJLyogcHJvcGFnYXRlIE9DSF8ncyBtYXJraW5nICovCisJCQlGV0QoYWZ0LCBhZnQsIDEpOworCQkJaWYgKE9QKGctPnN0cmlwW3BjK09QTkQocyldKSAhPSBPX0NIKSB7CisJCQkJYXNzZXJ0KE9QKGctPnN0cmlwW3BjK09QTkQocyldKSA9PSBPT1IyKTsKKwkJCQlGV0QoYWZ0LCBhZnQsIE9QTkQocykpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT19DSDoJCS8qIGp1c3QgZW1wdHkgKi8KKwkJCUZXRChhZnQsIGFmdCwgMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJCS8qIG9vb29vcHMuLi4gKi8KKwkJCWFzc2VydChub3BlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuKGFmdCk7Cit9CisKKyNpZmRlZiBSRURFQlVHCisvKgorIC0gcHJpbnQgLSBwcmludCBhIHNldCBvZiBzdGF0ZXMKKyA9PSAjaWZkZWYgUkVERUJVRworID09IHN0YXRpYyB2b2lkIHByaW50KHN0cnVjdCBtYXRjaCAqbSwgY2hhciAqY2FwdGlvbiwgc3RhdGVzIHN0LCBcCisgPT0JaW50IGNoLCBGSUxFICpkKTsKKyA9PSAjZW5kaWYKKyAqLworc3RhdGljIHZvaWQKK3ByaW50KAorICAgIHN0cnVjdCBtYXRjaCAqbSwKKyAgICBjaGFyICpjYXB0aW9uLAorICAgIHN0YXRlcyBzdCwKKyAgICBpbnQgY2gsCisgICAgRklMRSAqZCkKK3sKKwlzdHJ1Y3QgcmVfZ3V0cyAqZyA9IG0tPmc7CisJaW50IGk7CisJaW50IGZpcnN0ID0gMTsKKworCV9ESUFHQVNTRVJUKG0gIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoY2FwdGlvbiAhPSBOVUxMKTsKKworCWlmICghKG0tPmVmbGFncyZSRUdfVFJBQ0UpKQorCQlyZXR1cm47CisKKwlfRElBR0FTU0VSVChkICE9IE5VTEwpOworCisJZnByaW50ZihkLCAiJXMiLCBjYXB0aW9uKTsKKwlpZiAoY2ggIT0gJ1wwJykKKwkJZnByaW50ZihkLCAiICVzIiwgcGNoYXIoY2gpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZy0+bnN0YXRlczsgaSsrKQorCQlpZiAoSVNTRVQoc3QsIGkpKSB7CisJCQlmcHJpbnRmKGQsICIlcyVkIiwgKGZpcnN0KSA/ICJcdCIgOiAiLCAiLCBpKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCWZwcmludGYoZCwgIlxuIik7Cit9CisKKy8qIAorIC0gYXQgLSBwcmludCBjdXJyZW50IHNpdHVhdGlvbgorID09ICNpZmRlZiBSRURFQlVHCisgPT0gc3RhdGljIHZvaWQgYXQoc3RydWN0IG1hdGNoICptLCBjaGFyICp0aXRsZSwgY2hhciAqc3RhcnQsIGNoYXIgKnN0b3AsIFwKKyA9PQkJCQkJCXNvcG5vIHN0YXJ0c3QsIHNvcG5vIHN0b3BzdCk7CisgPT0gI2VuZGlmCisgKi8KK3N0YXRpYyB2b2lkCithdCgKKyAgICBzdHJ1Y3QgbWF0Y2ggKm0sCisgICAgY2hhciAqdGl0bGUsCisgICAgY2hhciAqc3RhcnQsCisgICAgY2hhciAqc3RvcCwKKyAgICBzb3BubyBzdGFydHN0LAorICAgIHNvcG5vIHN0b3BzdCkKK3sKKworCV9ESUFHQVNTRVJUKG0gIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQodGl0bGUgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoc3RhcnQgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoc3RvcCAhPSBOVUxMKTsKKworCWlmICghKG0tPmVmbGFncyZSRUdfVFJBQ0UpKQorCQlyZXR1cm47CisKKwlwcmludGYoIiVzICVzLSIsIHRpdGxlLCBwY2hhcigqc3RhcnQpKTsKKwlwcmludGYoIiVzICIsIHBjaGFyKCpzdG9wKSk7CisJcHJpbnRmKCIlbGQtJWxkXG4iLCAobG9uZylzdGFydHN0LCAobG9uZylzdG9wc3QpOworfQorCisjaWZuZGVmIFBDSEFSRE9ORQorI2RlZmluZQlQQ0hBUkRPTkUJLyogbmV2ZXIgYWdhaW4gKi8KKy8qCisgLSBwY2hhciAtIG1ha2UgYSBjaGFyYWN0ZXIgcHJpbnRhYmxlCisgPT0gI2lmZGVmIFJFREVCVUcKKyA9PSBzdGF0aWMgY2hhciAqcGNoYXIoaW50IGNoKTsKKyA9PSAjZW5kaWYKKyAqCisgKiBJcyB0aGlzIGlkZW50aWNhbCB0byByZWdjaGFyKCkgb3ZlciBpbiBkZWJ1Zy5jPyAgV2VsbCwgeWVzLiAgQnV0IGEKKyAqIGR1cGxpY2F0ZSBoZXJlIGF2b2lkcyBoYXZpbmcgYSBkZWJ1Z2dpbmctY2FwYWJsZSByZWdleGVjLm8gdGllZCB0bworICogYSBtYXRjaGluZyBkZWJ1Zy5vLCBhbmQgdGhpcyBpcyBjb252ZW5pZW50LiAgSXQgYWxsIGRpc2FwcGVhcnMgaW4KKyAqIHRoZSBub24tZGVidWcgY29tcGlsYXRpb24gYW55d2F5LCBzbyBpdCBkb2Vzbid0IG1hdHRlciBtdWNoLgorICovCitzdGF0aWMgY2hhciAqCQkJLyogLT4gcmVwcmVzZW50YXRpb24gKi8KK3BjaGFyKAorICAgIGludCBjaCkKK3sKKwlzdGF0aWMgY2hhciBwYnVmWzEwXTsKKworCWlmIChpc3ByaW50KGNoKSB8fCBjaCA9PSAnICcpCisJCSh2b2lkKXNucHJpbnRmKHBidWYsIHNpemVvZiBwYnVmLCAiJWMiLCBjaCk7CisJZWxzZQorCQkodm9pZClzbnByaW50ZihwYnVmLCBzaXplb2YgcGJ1ZiwgIlxcJW8iLCBjaCk7CisJcmV0dXJuKHBidWYpOworfQorI2VuZGlmCisjZW5kaWYKKworI3VuZGVmCW1hdGNoZXIKKyN1bmRlZglmYXN0CisjdW5kZWYJc2xvdworI3VuZGVmCWRpc3NlY3QKKyN1bmRlZgliYWNrcmVmCisjdW5kZWYJc3RlcAorI3VuZGVmCXByaW50CisjdW5kZWYJYXQKKyN1bmRlZgltYXRjaAorI3VuZGVmCW5vcGUKZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2NvbXAuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2NvbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWY5NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvcmVnY29tcC5jCkBAIC0wLDAgKzEsMTkyNSBAQAorLyoJJE5ldEJTRDogcmVnY29tcC5jLHYgMS4zNiAyMDE1LzA5LzEyIDE5OjA4OjQ3IGNocmlzdG9zIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcmVnY29tcC5jCTguNSAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcmVnY29tcC5jCTguNSAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCisjaWYgMAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXJlZ2NvbXAuYwk4LjUgKEJlcmtlbGV5KSAzLzIwLzk0IjsKKyNlbHNlCitfX1JDU0lEKCIkTmV0QlNEOiByZWdjb21wLmMsdiAxLjM2IDIwMTUvMDkvMTIgMTk6MDg6NDcgY2hyaXN0b3MgRXhwICQiKTsKKyNlbmRpZgorI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworI2luY2x1ZGUgIm5hbWVzcGFjZS5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKyNpZmRlZiBfX3dlYWtfYWxpYXMKK19fd2Vha19hbGlhcyhyZWdjb21wLF9yZWdjb21wKQorI2VuZGlmCisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInJlZ2V4Mi5oIgorCisjaW5jbHVkZSAiY2NsYXNzLmgiCisjaW5jbHVkZSAiY25hbWUuaCIKKworLyoKKyAqIHBhcnNlIHN0cnVjdHVyZSwgcGFzc2VkIHVwIGFuZCBkb3duIHRvIGF2b2lkIGdsb2JhbCB2YXJpYWJsZXMgYW5kCisgKiBvdGhlciBjbHVtc2luZXNzZXMKKyAqLworc3RydWN0IHBhcnNlIHsKKwljb25zdCBjaGFyICpuZXh0OwkvKiBuZXh0IGNoYXJhY3RlciBpbiBSRSAqLworCWNvbnN0IGNoYXIgKmVuZDsJLyogZW5kIG9mIHN0cmluZyAoLT4gTlVMIG5vcm1hbGx5KSAqLworCWludCBlcnJvcjsJCS8qIGhhcyBhbiBlcnJvciBiZWVuIHNlZW4/ICovCisJc29wICpzdHJpcDsJCS8qIG1hbGxvY2VkIHN0cmlwICovCisJc29wbm8gc3NpemU7CQkvKiBtYWxsb2NlZCBzdHJpcCBzaXplIChhbGxvY2F0ZWQpICovCisJc29wbm8gc2xlbjsJCS8qIG1hbGxvY2VkIHN0cmlwIGxlbmd0aCAodXNlZCkgKi8KKwlzaXplX3QgbmNzYWxsb2M7CS8qIG51bWJlciBvZiBjc2V0cyBhbGxvY2F0ZWQgKi8KKwlzdHJ1Y3QgcmVfZ3V0cyAqZzsKKyMJZGVmaW5lCU5QQVJFTgkxMAkvKiB3ZSBuZWVkIHRvIHJlbWVtYmVyICgpIDEtOSBmb3IgYmFjayByZWZzICovCisJc29wbm8gcGJlZ2luW05QQVJFTl07CS8qIC0+ICggKFswXSB1bnVzZWQpICovCisJc29wbm8gcGVuZFtOUEFSRU5dOwkvKiAtPiApIChbMF0gdW51c2VkKSAqLworfTsKKworLyogPT09PT09PT09IGJlZ2luIGhlYWRlciBnZW5lcmF0ZWQgYnkgLi9ta2ggPT09PT09PT09ICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qID09PSByZWdjb21wLmMgPT09ICovCitzdGF0aWMgdm9pZCBwX2VyZShzdHJ1Y3QgcGFyc2UgKnAsIGludCBzdG9wLCBzaXplX3QgcmVjbGltaXQpOworc3RhdGljIHZvaWQgcF9lcmVfZXhwKHN0cnVjdCBwYXJzZSAqcCwgc2l6ZV90IHJlY2xpbWl0KTsKK3N0YXRpYyB2b2lkIHBfc3RyKHN0cnVjdCBwYXJzZSAqcCk7CitzdGF0aWMgdm9pZCBwX2JyZShzdHJ1Y3QgcGFyc2UgKnAsIGludCBlbmQxLCBpbnQgZW5kMiwgc2l6ZV90IHJlY2xpbWl0KTsKK3N0YXRpYyBpbnQgcF9zaW1wX3JlKHN0cnVjdCBwYXJzZSAqcCwgaW50IHN0YXJvcmRpbmFyeSwgc2l6ZV90IHJlY2xpbWl0KTsKK3N0YXRpYyBpbnQgcF9jb3VudChzdHJ1Y3QgcGFyc2UgKnApOworc3RhdGljIHZvaWQgcF9icmFja2V0KHN0cnVjdCBwYXJzZSAqcCk7CitzdGF0aWMgdm9pZCBwX2JfdGVybShzdHJ1Y3QgcGFyc2UgKnAsIGNzZXQgKmNzKTsKK3N0YXRpYyB2b2lkIHBfYl9jY2xhc3Moc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CitzdGF0aWMgdm9pZCBwX2JfZWNsYXNzKHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworc3RhdGljIGNoYXIgcF9iX3N5bWJvbChzdHJ1Y3QgcGFyc2UgKnApOworc3RhdGljIGNoYXIgcF9iX2NvbGxfZWxlbShzdHJ1Y3QgcGFyc2UgKnAsIGludCBlbmRjKTsKK3N0YXRpYyBpbnQgb3RoZXJjYXNlKGludCBjaCk7CitzdGF0aWMgdm9pZCBib3RoY2FzZXMoc3RydWN0IHBhcnNlICpwLCBpbnQgY2gpOworc3RhdGljIHZvaWQgb3JkaW5hcnkoc3RydWN0IHBhcnNlICpwLCBpbnQgY2gpOworc3RhdGljIHZvaWQgbm9ubmV3bGluZShzdHJ1Y3QgcGFyc2UgKnApOworc3RhdGljIHZvaWQgcmVwZWF0KHN0cnVjdCBwYXJzZSAqcCwgc29wbm8gc3RhcnQsIGludCBmcm9tLCBpbnQgdG8sIHNpemVfdCByZWNsaW1pdCk7CitzdGF0aWMgaW50IHNldGVycihzdHJ1Y3QgcGFyc2UgKnAsIGludCBlKTsKK3N0YXRpYyBjc2V0ICphbGxvY3NldChzdHJ1Y3QgcGFyc2UgKnApOworc3RhdGljIHZvaWQgZnJlZXNldChzdHJ1Y3QgcGFyc2UgKnAsIGNzZXQgKmNzKTsKK3N0YXRpYyBzb3BubyBmcmVlemVzZXQoc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CitzdGF0aWMgaW50IGZpcnN0Y2goc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CitzdGF0aWMgaW50IG5jaChzdHJ1Y3QgcGFyc2UgKnAsIGNzZXQgKmNzKTsKK3N0YXRpYyB2b2lkIG1jYWRkKHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MsIGNvbnN0IGNoYXIgKmNwKTsKKyNpZiAwCitzdGF0aWMgdm9pZCBtY3N1Yihjc2V0ICpjcywgY2hhciAqY3ApOworc3RhdGljIGludCBtY2luKGNzZXQgKmNzLCBjaGFyICpjcCk7CitzdGF0aWMgY2hhciAqbWNmaW5kKGNzZXQgKmNzLCBjaGFyICpjcCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIG1jaW52ZXJ0KHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworc3RhdGljIHZvaWQgbWNjYXNlKHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworc3RhdGljIGludCBpc2luc2V0cyhzdHJ1Y3QgcmVfZ3V0cyAqZywgaW50IGMpOworc3RhdGljIGludCBzYW1lc2V0cyhzdHJ1Y3QgcmVfZ3V0cyAqZywgaW50IGMxLCBpbnQgYzIpOworc3RhdGljIHZvaWQgY2F0ZWdvcml6ZShzdHJ1Y3QgcGFyc2UgKnAsIHN0cnVjdCByZV9ndXRzICpnKTsKK3N0YXRpYyBzb3BubyBkdXBsKHN0cnVjdCBwYXJzZSAqcCwgc29wbm8gc3RhcnQsIHNvcG5vIGZpbmlzaCk7CitzdGF0aWMgdm9pZCBkb2VtaXQoc3RydWN0IHBhcnNlICpwLCBzb3Agb3AsIHNvcG5vIG9wbmQpOworc3RhdGljIHZvaWQgZG9pbnNlcnQoc3RydWN0IHBhcnNlICpwLCBzb3Agb3AsIHNvcG5vIG9wbmQsIHNvcG5vIHBvcyk7CitzdGF0aWMgdm9pZCBkb2Z3ZChzdHJ1Y3QgcGFyc2UgKnAsIHNvcG5vIHBvcywgc29wbm8gdmFsdWUpOworc3RhdGljIGludCBlbmxhcmdlKHN0cnVjdCBwYXJzZSAqcCwgc29wbm8gc2l6ZSk7CitzdGF0aWMgdm9pZCBzdHJpcHNudWcoc3RydWN0IHBhcnNlICpwLCBzdHJ1Y3QgcmVfZ3V0cyAqZyk7CitzdGF0aWMgdm9pZCBmaW5kbXVzdChzdHJ1Y3QgcGFyc2UgKnAsIHN0cnVjdCByZV9ndXRzICpnKTsKK3N0YXRpYyBzb3BubyBwbHVzY291bnQoc3RydWN0IHBhcnNlICpwLCBzdHJ1Y3QgcmVfZ3V0cyAqZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisvKiA9PT09PT09PT0gZW5kIGhlYWRlciBnZW5lcmF0ZWQgYnkgLi9ta2ggPT09PT09PT09ICovCisKK3N0YXRpYyBjaGFyIG51bHNbMTBdOwkJLyogcGxhY2UgdG8gcG9pbnQgc2Nhbm5lciBpbiBldmVudCBvZiBlcnJvciAqLworCisvKgorICogbWFjcm9zIGZvciB1c2Ugd2l0aCBwYXJzZSBzdHJ1Y3R1cmUKKyAqIEJFV0FSRTogIHRoZXNlIGtub3cgdGhhdCB0aGUgcGFyc2Ugc3RydWN0dXJlIGlzIG5hbWVkIGBwJyAhISEKKyAqLworI2RlZmluZQlQRUVLKCkJKCpwLT5uZXh0KQorI2RlZmluZQlQRUVLMigpCSgqKHAtPm5leHQrMSkpCisjZGVmaW5lCU1PUkUoKQkocC0+bmV4dCA8IHAtPmVuZCkKKyNkZWZpbmUJTU9SRTIoKQkocC0+bmV4dCsxIDwgcC0+ZW5kKQorI2RlZmluZQlTRUUoYykJKE1PUkUoKSAmJiBQRUVLKCkgPT0gKGMpKQorI2RlZmluZQlTRUVUV08oYSwgYikJKE1PUkUoKSAmJiBNT1JFMigpICYmIFBFRUsoKSA9PSAoYSkgJiYgUEVFSzIoKSA9PSAoYikpCisjZGVmaW5lCUVBVChjKQkoKFNFRShjKSkgPyAoTkVYVCgpLCAxKSA6IDApCisjZGVmaW5lCUVBVFRXTyhhLCBiKQkoKFNFRVRXTyhhLCBiKSkgPyAoTkVYVDIoKSwgMSkgOiAwKQorI2RlZmluZQlORVhUKCkJKHAtPm5leHQrKykKKyNkZWZpbmUJTkVYVDIoKQkocC0+bmV4dCArPSAyKQorI2RlZmluZQlORVhUbihuKQkocC0+bmV4dCArPSAobikpCisjZGVmaW5lCUdFVE5FWFQoKQkoKnAtPm5leHQrKykKKyNkZWZpbmUJU0VURVJST1IoZSkJc2V0ZXJyKHAsIChlKSkKKyNkZWZpbmUJUkVRVUlSRShjbywgZSkJKHZvaWQpICgoY28pIHx8IFNFVEVSUk9SKGUpKQorI2RlZmluZQlNVVNUU0VFKGMsIGUpCShSRVFVSVJFKE1PUkUoKSAmJiBQRUVLKCkgPT0gKGMpLCBlKSkKKyNkZWZpbmUJTVVTVEVBVChjLCBlKQkodm9pZCkgKFJFUVVJUkUoTU9SRSgpICYmIEdFVE5FWFQoKSA9PSAoYyksIGUpKQorI2RlZmluZQlNVVNUTk9UU0VFKGMsIGUpCShSRVFVSVJFKCFNT1JFKCkgfHwgUEVFSygpICE9IChjKSwgZSkpCisjZGVmaW5lCUVNSVQob3AsIHNvcG5kKQlkb2VtaXQocCwgKHNvcCkob3ApLCBzb3BuZCkKKyNkZWZpbmUJSU5TRVJUKG9wLCBwb3MpCWRvaW5zZXJ0KHAsIChzb3ApKG9wKSwgSEVSRSgpLShwb3MpKzEsIHBvcykKKyNkZWZpbmUJQUhFQUQocG9zKQkJZG9md2QocCwgcG9zLCBIRVJFKCktKHBvcykpCisjZGVmaW5lCUFTVEVSTihzb3AsIHBvcykJRU1JVChzb3AsIEhFUkUoKS1wb3MpCisjZGVmaW5lCUhFUkUoKQkJKHAtPnNsZW4pCisjZGVmaW5lCVRIRVJFKCkJCShwLT5zbGVuIC0gMSkKKyNkZWZpbmUJVEhFUkVUSEVSRSgpCShwLT5zbGVuIC0gMikKKyNkZWZpbmUJRFJPUChuKQkocC0+c2xlbiAtPSAobikpCisKKyNpZm5kZWYgTkRFQlVHCitzdGF0aWMgaW50IG5ldmVyID0gMDsJCS8qIGZvciB1c2UgaW4gYXNzZXJ0czsgc2h1dHMgbGludCB1cCAqLworI2Vsc2UKKyNkZWZpbmUJbmV2ZXIJMAkJLyogc29tZSA8YXNzZXJ0Lmg+cyBoYXZlIGJ1Z3MgdG9vICovCisjZW5kaWYKKworI2RlZmluZQlNRU1MSU1JVAkweDgwMDAwMDAKKyNkZWZpbmUgTUVNU0laRShwKSBcCisJKChwKS0+bmNzYWxsb2MgLyBDSEFSX0JJVCAqIChwKS0+Zy0+Y3NldHNpemUgKyBcCisJKHApLT5uY3NhbGxvYyAqIHNpemVvZihjc2V0KSArIFwKKwkocCktPnNzaXplICogc2l6ZW9mKHNvcCkpCisjZGVmaW5lCVJFQ0xJTUlUCTI1NgorCisvKgorIC0gcmVnY29tcCAtIGludGVyZmFjZSBmb3IgcGFyc2VyIGFuZCBjb21waWxhdGlvbgorID0gZXh0ZXJuIGludCByZWdjb21wKHJlZ2V4X3QgKiwgY29uc3QgY2hhciAqLCBpbnQpOworID0gI2RlZmluZQlSRUdfQkFTSUMJMDAwMAorID0gI2RlZmluZQlSRUdfRVhURU5ERUQJMDAwMQorID0gI2RlZmluZQlSRUdfSUNBU0UJMDAwMgorID0gI2RlZmluZQlSRUdfTk9TVUIJMDAwNAorID0gI2RlZmluZQlSRUdfTkVXTElORQkwMDEwCisgPSAjZGVmaW5lCVJFR19OT1NQRUMJMDAyMAorID0gI2RlZmluZQlSRUdfUEVORAkwMDQwCisgPSAjZGVmaW5lCVJFR19EVU1QCTAyMDAKKyAqLworaW50CQkJCS8qIDAgc3VjY2Vzcywgb3RoZXJ3aXNlIFJFR19zb21ldGhpbmcgKi8KK3JlZ2NvbXAoCisgICAgcmVnZXhfdCAqcHJlZywKKyAgICBjb25zdCBjaGFyICpwYXR0ZXJuLAorICAgIGludCBjZmxhZ3MpCit7CisJc3RydWN0IHBhcnNlIHBhOworCXN0cnVjdCByZV9ndXRzICpnOworCXN0cnVjdCBwYXJzZSAqcCA9ICZwYTsKKwlpbnQgaTsKKwlzaXplX3QgbGVuOworI2lmZGVmIFJFREVCVUcKKyMJZGVmaW5lCUdPT0RGTEFHUyhmKQkoZikKKyNlbHNlCisjCWRlZmluZQlHT09ERkxBR1MoZikJKChmKSZ+UkVHX0RVTVApCisjZW5kaWYKKworCV9ESUFHQVNTRVJUKHByZWcgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQocGF0dGVybiAhPSBOVUxMKTsKKworCWNmbGFncyA9IEdPT0RGTEFHUyhjZmxhZ3MpOworCWlmICgoY2ZsYWdzJlJFR19FWFRFTkRFRCkgJiYgKGNmbGFncyZSRUdfTk9TUEVDKSkKKwkJcmV0dXJuKFJFR19JTlZBUkcpOworCisJaWYgKGNmbGFncyZSRUdfUEVORCkgeworCQlpZiAocHJlZy0+cmVfZW5kcCA8IHBhdHRlcm4pCisJCQlyZXR1cm4oUkVHX0lOVkFSRyk7CisJCWxlbiA9IHByZWctPnJlX2VuZHAgLSBwYXR0ZXJuOworCX0gZWxzZQorCQlsZW4gPSBzdHJsZW4ocGF0dGVybik7CisKKwkvKiBkbyB0aGUgbWFsbG9jcyBlYXJseSBzbyBmYWlsdXJlIGhhbmRsaW5nIGlzIGVhc3kgKi8KKwlnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVfZ3V0cykgKyAoTkMgLSAxKSAqIHNpemVvZihjYXRfdCkpOworCWlmIChnID09IE5VTEwpCisJCXJldHVybihSRUdfRVNQQUNFKTsKKwlwLT5zc2l6ZSA9IGxlbi8oc2l6ZV90KTIqKHNpemVfdCkzICsgKHNpemVfdCkxOwkvKiB1Z2ggKi8KKwlwLT5zdHJpcCA9IGNhbGxvYyhwLT5zc2l6ZSwgc2l6ZW9mKHNvcCkpOworCXAtPnNsZW4gPSAwOworCWlmIChwLT5zdHJpcCA9PSBOVUxMKSB7CisJCWZyZWUoZyk7CisJCXJldHVybihSRUdfRVNQQUNFKTsKKwl9CisKKwkvKiBzZXQgdGhpbmdzIHVwICovCisJcC0+ZyA9IGc7CisJcC0+bmV4dCA9IHBhdHRlcm47CisJcC0+ZW5kID0gcC0+bmV4dCArIGxlbjsKKwlwLT5lcnJvciA9IDA7CisJcC0+bmNzYWxsb2MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOUEFSRU47IGkrKykgeworCQlwLT5wYmVnaW5baV0gPSAwOworCQlwLT5wZW5kW2ldID0gMDsKKwl9CisJZy0+Y3NldHNpemUgPSBOQzsKKwlnLT5zZXRzID0gTlVMTDsKKwlnLT5zZXRiaXRzID0gTlVMTDsKKwlnLT5uY3NldHMgPSAwOworCWctPmNmbGFncyA9IGNmbGFnczsKKwlnLT5pZmxhZ3MgPSAwOworCWctPm5ib2wgPSAwOworCWctPm5lb2wgPSAwOworCWctPm11c3QgPSBOVUxMOworCWctPm1sZW4gPSAwOworCWctPm5zdWIgPSAwOworCWctPm5jYXRlZ29yaWVzID0gMTsJLyogY2F0ZWdvcnkgMCBpcyAiZXZlcnl0aGluZyBlbHNlIiAqLworCWctPmNhdGVnb3JpZXMgPSAmZy0+Y2F0c3BhY2VbLShDSEFSX01JTildOworCSh2b2lkKSBtZW1zZXQoKGNoYXIgKilnLT5jYXRzcGFjZSwgMCwgTkMqc2l6ZW9mKGNhdF90KSk7CisJZy0+YmFja3JlZnMgPSAwOworCisJLyogZG8gaXQgKi8KKwlFTUlUKE9FTkQsIDApOworCWctPmZpcnN0c3RhdGUgPSBUSEVSRSgpOworCWlmIChjZmxhZ3MmUkVHX0VYVEVOREVEKQorCQlwX2VyZShwLCBPVVQsIDApOworCWVsc2UgaWYgKGNmbGFncyZSRUdfTk9TUEVDKQorCQlwX3N0cihwKTsKKwllbHNlCisJCXBfYnJlKHAsIE9VVCwgT1VULCAwKTsKKwlFTUlUKE9FTkQsIDApOworCWctPmxhc3RzdGF0ZSA9IFRIRVJFKCk7CisKKwkvKiB0aWR5IHVwIGxvb3NlIGVuZHMgYW5kIGZpbGwgdGhpbmdzIGluICovCisJY2F0ZWdvcml6ZShwLCBnKTsKKwlzdHJpcHNudWcocCwgZyk7CisJZmluZG11c3QocCwgZyk7CisJZy0+bnBsdXMgPSBwbHVzY291bnQocCwgZyk7CisJZy0+bWFnaWMgPSBNQUdJQzI7CisJcHJlZy0+cmVfbnN1YiA9IGctPm5zdWI7CisJcHJlZy0+cmVfZyA9IGc7CisJcHJlZy0+cmVfbWFnaWMgPSBNQUdJQzE7CisjaWZuZGVmIFJFREVCVUcKKwkvKiBub3QgZGVidWdnaW5nLCBzbyBjYW4ndCByZWx5IG9uIHRoZSBhc3NlcnQoKSBpbiByZWdleGVjKCkgKi8KKwlpZiAoZy0+aWZsYWdzJkJBRCkKKwkJU0VURVJST1IoUkVHX0FTU0VSVCk7CisjZW5kaWYKKworCS8qIHdpbiBvciBsb3NlLCB3ZSdyZSBkb25lICovCisJaWYgKHAtPmVycm9yICE9IDApCS8qIGxvc2UgKi8KKwkJcmVnZnJlZShwcmVnKTsKKwlyZXR1cm4ocC0+ZXJyb3IpOworfQorCisvKgorIC0gcF9lcmUgLSBFUkUgcGFyc2VyIHRvcCBsZXZlbCwgY29uY2F0ZW5hdGlvbiBhbmQgYWx0ZXJuYXRpb24KKyA9PSBzdGF0aWMgdm9pZCBwX2VyZShzdHJ1Y3QgcGFyc2UgKnAsIGludCBzdG9wLCBzaXplX3QgcmVjbGltaXQpOworICovCitzdGF0aWMgdm9pZAorcF9lcmUoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIGludCBzdG9wLAkJCS8qIGNoYXJhY3RlciB0aGlzIEVSRSBzaG91bGQgZW5kIGF0ICovCisgICAgc2l6ZV90IHJlY2xpbWl0KQoreworCWNoYXIgYzsKKwlzb3BubyBwcmV2YmFjayA9IDA7CS8qIHBhY2lmeSBnY2MgKi8KKwlzb3BubyBwcmV2ZndkID0gMDsgCS8qIHBhY2lmeSBnY2MgKi8KKwlzb3BubyBjb25jOworCWludCBmaXJzdCA9IDE7CQkvKiBpcyB0aGlzIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZT8gKi8KKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwlpZiAocmVjbGltaXQrKyA+IFJFQ0xJTUlUIHx8IHAtPmVycm9yID09IFJFR19FU1BBQ0UpIHsKKwkJcC0+ZXJyb3IgPSBSRUdfRVNQQUNFOworCQlyZXR1cm47CisJfQorCisJZm9yICg7OykgeworCQkvKiBkbyBhIGJ1bmNoIG9mIGNvbmNhdGVuYXRlZCBleHByZXNzaW9ucyAqLworCQljb25jID0gSEVSRSgpOworCQl3aGlsZSAoTU9SRSgpICYmIChjID0gUEVFSygpKSAhPSAnfCcgJiYgYyAhPSBzdG9wKQorCQkJcF9lcmVfZXhwKHAsIHJlY2xpbWl0KTsKKwkJUkVRVUlSRShIRVJFKCkgIT0gY29uYywgUkVHX0VNUFRZKTsJLyogcmVxdWlyZSBub25lbXB0eSAqLworCisJCWlmICghRUFUKCd8JykpCisJCQlicmVhazsJCS8qIE5PVEUgQlJFQUsgT1VUICovCisKKwkJaWYgKGZpcnN0KSB7CisJCQlJTlNFUlQoT0NIXywgY29uYyk7CS8qIG9mZnNldCBpcyB3cm9uZyAqLworCQkJcHJldmZ3ZCA9IGNvbmM7CisJCQlwcmV2YmFjayA9IGNvbmM7CisJCQlmaXJzdCA9IDA7CisJCX0KKwkJQVNURVJOKE9PUjEsIHByZXZiYWNrKTsKKwkJcHJldmJhY2sgPSBUSEVSRSgpOworCQlBSEVBRChwcmV2ZndkKTsJCQkvKiBmaXggcHJldmlvdXMgb2Zmc2V0ICovCisJCXByZXZmd2QgPSBIRVJFKCk7CisJCUVNSVQoT09SMiwgMCk7CQkJLyogb2Zmc2V0IGlzIHZlcnkgd3JvbmcgKi8KKwl9CisKKwlpZiAoIWZpcnN0KSB7CQkvKiB0YWlsLWVuZCBmaXh1cHMgKi8KKwkJQUhFQUQocHJldmZ3ZCk7CisJCUFTVEVSTihPX0NILCBwcmV2YmFjayk7CisJfQorCisJYXNzZXJ0KCFNT1JFKCkgfHwgU0VFKHN0b3ApKTsKK30KKworLyoKKyAtIHBfZXJlX2V4cCAtIHBhcnNlIG9uZSBzdWJFUkUsIGFuIGF0b20gcG9zc2libHkgZm9sbG93ZWQgYnkgYSByZXBldGl0aW9uIG9wCisgPT0gc3RhdGljIHZvaWQgcF9lcmVfZXhwKHN0cnVjdCBwYXJzZSAqcCwgc2l6ZV90IHJlY2xpbWl0KTsKKyAqLworc3RhdGljIHZvaWQKK3BfZXJlX2V4cCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgc2l6ZV90IHJlY2xpbWl0KQoreworCWNoYXIgYzsKKwlzb3BubyBwb3M7CisJaW50IGNvdW50OworCWludCBjb3VudDI7CisJc29wbm8gc3Vibm87CisJaW50IHdhc2NhcmV0ID0gMDsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwlhc3NlcnQoTU9SRSgpKTsJCS8qIGNhbGxlciBzaG91bGQgaGF2ZSBlbnN1cmVkIHRoaXMgKi8KKwljID0gR0VUTkVYVCgpOworCisJcG9zID0gSEVSRSgpOworCXN3aXRjaCAoYykgeworCWNhc2UgJygnOgorCQlSRVFVSVJFKE1PUkUoKSwgUkVHX0VQQVJFTik7CisJCXAtPmctPm5zdWIrKzsKKwkJc3Vibm8gPSBwLT5nLT5uc3ViOworCQlpZiAoc3Vibm8gPCBOUEFSRU4pCisJCQlwLT5wYmVnaW5bc3Vibm9dID0gSEVSRSgpOworCQlFTUlUKE9MUEFSRU4sIHN1Ym5vKTsKKwkJaWYgKCFTRUUoJyknKSkKKwkJCXBfZXJlKHAsICcpJywgcmVjbGltaXQpOworCQlpZiAoc3Vibm8gPCBOUEFSRU4pIHsKKwkJCXAtPnBlbmRbc3Vibm9dID0gSEVSRSgpOworCQkJYXNzZXJ0KHAtPnBlbmRbc3Vibm9dICE9IDApOworCQl9CisJCUVNSVQoT1JQQVJFTiwgc3Vibm8pOworCQlNVVNURUFUKCcpJywgUkVHX0VQQVJFTik7CisJCWJyZWFrOworI2lmbmRlZiBQT1NJWF9NSVNUQUtFCisJY2FzZSAnKSc6CQkvKiBoYXBwZW5zIG9ubHkgaWYgbm8gY3VycmVudCB1bm1hdGNoZWQgKCAqLworCQkvKgorCQkgKiBZb3UgbWF5IGFzaywgd2h5IHRoZSBpZm5kZWY/ICBCZWNhdXNlIEkgZGlkbid0IG5vdGljZQorCQkgKiB0aGlzIHVudGlsIHNsaWdodGx5IHRvbyBsYXRlIGZvciAxMDAzLjIsIGFuZCBub25lIG9mIHRoZQorCQkgKiBvdGhlciAxMDAzLjIgcmVndWxhci1leHByZXNzaW9uIHJldmlld2VycyBub3RpY2VkIGl0IGF0CisJCSAqIGFsbC4gIFNvIGFuIHVubWF0Y2hlZCApIGlzIGxlZ2FsIFBPU0lYLCBhdCBsZWFzdCB1bnRpbAorCQkgKiB3ZSBjYW4gZ2V0IGl0IGZpeGVkLgorCQkgKi8KKwkJU0VURVJST1IoUkVHX0VQQVJFTik7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnXic6CisJCUVNSVQoT0JPTCwgMCk7CisJCXAtPmctPmlmbGFncyB8PSBVU0VCT0w7CisJCXAtPmctPm5ib2wrKzsKKwkJd2FzY2FyZXQgPSAxOworCQlicmVhazsKKwljYXNlICckJzoKKwkJRU1JVChPRU9MLCAwKTsKKwkJcC0+Zy0+aWZsYWdzIHw9IFVTRUVPTDsKKwkJcC0+Zy0+bmVvbCsrOworCQlicmVhazsKKwljYXNlICd8JzoKKwkJU0VURVJST1IoUkVHX0VNUFRZKTsKKwkJYnJlYWs7CisJY2FzZSAnKic6CisJY2FzZSAnKyc6CisJY2FzZSAnPyc6CisJCVNFVEVSUk9SKFJFR19CQURSUFQpOworCQlicmVhazsKKwljYXNlICcuJzoKKwkJaWYgKHAtPmctPmNmbGFncyZSRUdfTkVXTElORSkKKwkJCW5vbm5ld2xpbmUocCk7CisJCWVsc2UKKwkJCUVNSVQoT0FOWSwgMCk7CisJCWJyZWFrOworCWNhc2UgJ1snOgorCQlwX2JyYWNrZXQocCk7CisJCWJyZWFrOworCWNhc2UgJ1xcJzoKKwkJUkVRVUlSRShNT1JFKCksIFJFR19FRVNDQVBFKTsKKwkJYyA9IEdFVE5FWFQoKTsKKwkJb3JkaW5hcnkocCwgYyk7CisJCWJyZWFrOworCWNhc2UgJ3snOgkJLyogb2theSBhcyBvcmRpbmFyeSBleGNlcHQgaWYgZGlnaXQgZm9sbG93cyAqLworCQlSRVFVSVJFKCFNT1JFKCkgfHwgIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpUEVFSygpKSwgUkVHX0JBRFJQVCk7CisJCS8qIEZBTExUSFJPVUdIICovCisJZGVmYXVsdDoKKwkJb3JkaW5hcnkocCwgYyk7CisJCWJyZWFrOworCX0KKworCWlmICghTU9SRSgpKQorCQlyZXR1cm47CisJYyA9IFBFRUsoKTsKKwkvKiB3ZSBjYWxsIHsgYSByZXBldGl0aW9uIGlmIGZvbGxvd2VkIGJ5IGEgZGlnaXQgKi8KKwlpZiAoISggYyA9PSAnKicgfHwgYyA9PSAnKycgfHwgYyA9PSAnPycgfHwKKwkgICAgKGMgPT0gJ3snICYmIE1PUkUyKCkgJiYgaXNkaWdpdCgodW5zaWduZWQgY2hhcilQRUVLMigpKSkgKSkKKwkJcmV0dXJuOwkJLyogbm8gcmVwZXRpdGlvbiwgd2UncmUgZG9uZSAqLworCU5FWFQoKTsKKworCVJFUVVJUkUoIXdhc2NhcmV0LCBSRUdfQkFEUlBUKTsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcqJzoJLyogaW1wbGVtZW50ZWQgYXMgKz8gKi8KKwkJLyogdGhpcyBjYXNlIGRvZXMgbm90IHJlcXVpcmUgdGhlICh5fCkgdHJpY2ssIG5vS0xVREdFICovCisJCUlOU0VSVChPUExVU18sIHBvcyk7CisJCUFTVEVSTihPX1BMVVMsIHBvcyk7CisJCUlOU0VSVChPUVVFU1RfLCBwb3MpOworCQlBU1RFUk4oT19RVUVTVCwgcG9zKTsKKwkJYnJlYWs7CisJY2FzZSAnKyc6CisJCUlOU0VSVChPUExVU18sIHBvcyk7CisJCUFTVEVSTihPX1BMVVMsIHBvcyk7CisJCWJyZWFrOworCWNhc2UgJz8nOgorCQkvKiBLTFVER0U6IGVtaXQgeT8gYXMgKHl8KSB1bnRpbCBzdWJ0bGUgYnVnIGdldHMgZml4ZWQgKi8KKwkJSU5TRVJUKE9DSF8sIHBvcyk7CQkvKiBvZmZzZXQgc2xpZ2h0bHkgd3JvbmcgKi8KKwkJQVNURVJOKE9PUjEsIHBvcyk7CQkvKiB0aGlzIG9uZSdzIHJpZ2h0ICovCisJCUFIRUFEKHBvcyk7CQkJLyogZml4IHRoZSBPQ0hfICovCisJCUVNSVQoT09SMiwgMCk7CQkJLyogb2Zmc2V0IHZlcnkgd3JvbmcuLi4gKi8KKwkJQUhFQUQoVEhFUkUoKSk7CQkJLyogLi4uc28gZml4IGl0ICovCisJCUFTVEVSTihPX0NILCBUSEVSRVRIRVJFKCkpOworCQlicmVhazsKKwljYXNlICd7JzoKKwkJY291bnQgPSBwX2NvdW50KHApOworCQlpZiAoRUFUKCcsJykpIHsKKwkJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKVBFRUsoKSkpIHsKKwkJCQljb3VudDIgPSBwX2NvdW50KHApOworCQkJCVJFUVVJUkUoY291bnQgPD0gY291bnQyLCBSRUdfQkFEQlIpOworCQkJfSBlbHNlCQkvKiBzaW5nbGUgbnVtYmVyIHdpdGggY29tbWEgKi8KKwkJCQljb3VudDIgPSBJTkZJTklUWTsKKwkJfSBlbHNlCQkvKiBqdXN0IGEgc2luZ2xlIG51bWJlciAqLworCQkJY291bnQyID0gY291bnQ7CisJCXJlcGVhdChwLCBwb3MsIGNvdW50LCBjb3VudDIsIDApOworCQlpZiAoIUVBVCgnfScpKSB7CS8qIGVycm9yIGhldXJpc3RpY3MgKi8KKwkJCXdoaWxlIChNT1JFKCkgJiYgUEVFSygpICE9ICd9JykKKwkJCQlORVhUKCk7CisJCQlSRVFVSVJFKE1PUkUoKSwgUkVHX0VCUkFDRSk7CisJCQlTRVRFUlJPUihSRUdfQkFEQlIpOworCQl9CisJCWJyZWFrOworCX0KKworCWlmICghTU9SRSgpKQorCQlyZXR1cm47CisJYyA9IFBFRUsoKTsKKwlpZiAoISggYyA9PSAnKicgfHwgYyA9PSAnKycgfHwgYyA9PSAnPycgfHwKKwkgICAgKGMgPT0gJ3snICYmIE1PUkUyKCkgJiYgaXNkaWdpdCgodW5zaWduZWQgY2hhcilQRUVLMigpKSkgKSApCisJCXJldHVybjsKKwlTRVRFUlJPUihSRUdfQkFEUlBUKTsKK30KKworLyoKKyAtIHBfc3RyIC0gc3RyaW5nIChubyBtZXRhY2hhcmFjdGVycykgInBhcnNlciIKKyA9PSBzdGF0aWMgdm9pZCBwX3N0cihzdHJ1Y3QgcGFyc2UgKnApOworICovCitzdGF0aWMgdm9pZAorcF9zdHIoCisgICAgc3RydWN0IHBhcnNlICpwKQoreworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCVJFUVVJUkUoTU9SRSgpLCBSRUdfRU1QVFkpOworCXdoaWxlIChNT1JFKCkpCisJCW9yZGluYXJ5KHAsIEdFVE5FWFQoKSk7Cit9CisKKy8qCisgLSBwX2JyZSAtIEJSRSBwYXJzZXIgdG9wIGxldmVsLCBhbmNob3JpbmcgYW5kIGNvbmNhdGVuYXRpb24KKyA9PSBzdGF0aWMgdm9pZCBwX2JyZShzdHJ1Y3QgcGFyc2UgKnAsIGludCBlbmQxLCBcCisgPT0JaW50IGVuZDIsIHNpemVfdCByZWNsaW1pdCk7CisgKiBHaXZpbmcgZW5kMSBhcyBPVVQgZXNzZW50aWFsbHkgZWxpbWluYXRlcyB0aGUgZW5kMS9lbmQyIGNoZWNrLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgb2YgYSBrbHVkZ2UsIGluIHRoYXQgYSB0cmFpbGluZyAkIGlzIGZpcnN0CisgKiB0YWtlbiBhcyBhbiBvcmRpbmFyeSBjaGFyYWN0ZXIgYW5kIHRoZW4gcmV2aXNlZCB0byBiZSBhbiBhbmNob3IuICBUaGUKKyAqIG9ubHkgdW5kZXNpcmFibGUgc2lkZSBlZmZlY3QgaXMgdGhhdCAnJCcgZ2V0cyBpbmNsdWRlZCBhcyBhIGNoYXJhY3RlcgorICogY2F0ZWdvcnkgaW4gc3VjaCBjYXNlcy4gIFRoaXMgaXMgZmFpcmx5IGhhcm1sZXNzOyBub3Qgd29ydGggZml4aW5nLgorICogVGhlIGFtb3VudCBvZiBsb29rYWhlYWQgbmVlZGVkIHRvIGF2b2lkIHRoaXMga2x1ZGdlIGlzIGV4Y2Vzc2l2ZS4KKyAqLworc3RhdGljIHZvaWQKK3BfYnJlKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBpbnQgZW5kMSwJCS8qIGZpcnN0IHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLworICAgIGludCBlbmQyLAkJLyogc2Vjb25kIHRlcm1pbmF0aW5nIGNoYXJhY3RlciAqLworICAgIHNpemVfdCByZWNsaW1pdCkKK3sKKwlzb3BubyBzdGFydDsKKwlpbnQgZmlyc3QgPSAxOwkJCS8qIGZpcnN0IHN1YmV4cHJlc3Npb24/ICovCisJaW50IHdhc2RvbGxhciA9IDA7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJaWYgKHJlY2xpbWl0KysgPiBSRUNMSU1JVCB8fCBwLT5lcnJvciA9PSBSRUdfRVNQQUNFKSB7CisJCXAtPmVycm9yID0gUkVHX0VTUEFDRTsKKwkJcmV0dXJuOworCX0KKworCXN0YXJ0ID0gSEVSRSgpOworCisJaWYgKEVBVCgnXicpKSB7CisJCUVNSVQoT0JPTCwgMCk7CisJCXAtPmctPmlmbGFncyB8PSBVU0VCT0w7CisJCXAtPmctPm5ib2wrKzsKKwl9CisJd2hpbGUgKE1PUkUoKSAmJiAhU0VFVFdPKGVuZDEsIGVuZDIpKSB7CisJCXdhc2RvbGxhciA9IHBfc2ltcF9yZShwLCBmaXJzdCwgcmVjbGltaXQpOworCQlmaXJzdCA9IDA7CisJfQorCWlmICh3YXNkb2xsYXIpIHsJLyogb29wcywgdGhhdCB3YXMgYSB0cmFpbGluZyBhbmNob3IgKi8KKwkJRFJPUCgxKTsKKwkJRU1JVChPRU9MLCAwKTsKKwkJcC0+Zy0+aWZsYWdzIHw9IFVTRUVPTDsKKwkJcC0+Zy0+bmVvbCsrOworCX0KKworCVJFUVVJUkUoSEVSRSgpICE9IHN0YXJ0LCBSRUdfRU1QVFkpOwkvKiByZXF1aXJlIG5vbmVtcHR5ICovCit9CisKKy8qCisgLSBwX3NpbXBfcmUgLSBwYXJzZSBhIHNpbXBsZSBSRSwgYW4gYXRvbSBwb3NzaWJseSBmb2xsb3dlZCBieSBhIHJlcGV0aXRpb24KKyA9PSBzdGF0aWMgaW50IHBfc2ltcF9yZShzdHJ1Y3QgcGFyc2UgKnAsIGludCBzdGFyb3JkaW5hcnksIHNpemVfdCByZWNsaW1pdCk7CisgKi8KK3N0YXRpYyBpbnQJCQkvKiB3YXMgdGhlIHNpbXBsZSBSRSBhbiB1bmJhY2tzbGFzaGVkICQ/ICovCitwX3NpbXBfcmUoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIGludCBzdGFyb3JkaW5hcnksCQkvKiBpcyBhIGxlYWRpbmcgKiBhbiBvcmRpbmFyeSBjaGFyYWN0ZXI/ICovCisgICAgc2l6ZV90IHJlY2xpbWl0KQoreworCWludCBjOworCWludCBjb3VudDsKKwlpbnQgY291bnQyOworCXNvcG5vIHBvcywgaTsKKwlzb3BubyBzdWJubzsKKyMJZGVmaW5lCUJBQ0tTTAkoMTw8Q0hBUl9CSVQpCisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJcG9zID0gSEVSRSgpOwkJLyogcmVwZXRpb24gb3AsIGlmIGFueSwgY292ZXJzIGZyb20gaGVyZSAqLworCisJYXNzZXJ0KE1PUkUoKSk7CQkvKiBjYWxsZXIgc2hvdWxkIGhhdmUgZW5zdXJlZCB0aGlzICovCisJYyA9IEdFVE5FWFQoKTsKKwlpZiAoYyA9PSAnXFwnKSB7CisJCVJFUVVJUkUoTU9SRSgpLCBSRUdfRUVTQ0FQRSk7CisJCWMgPSBCQUNLU0wgfCAodW5zaWduZWQgY2hhcilHRVRORVhUKCk7CisJfQorCXN3aXRjaCAoYykgeworCWNhc2UgJy4nOgorCQlpZiAocC0+Zy0+Y2ZsYWdzJlJFR19ORVdMSU5FKQorCQkJbm9ubmV3bGluZShwKTsKKwkJZWxzZQorCQkJRU1JVChPQU5ZLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAnWyc6CisJCXBfYnJhY2tldChwKTsKKwkJYnJlYWs7CisJY2FzZSBCQUNLU0x8J3snOgorCQlTRVRFUlJPUihSRUdfQkFEUlBUKTsKKwkJYnJlYWs7CisJY2FzZSBCQUNLU0x8JygnOgorCQlwLT5nLT5uc3ViKys7CisJCXN1Ym5vID0gcC0+Zy0+bnN1YjsKKwkJaWYgKHN1Ym5vIDwgTlBBUkVOKQorCQkJcC0+cGJlZ2luW3N1Ym5vXSA9IEhFUkUoKTsKKwkJRU1JVChPTFBBUkVOLCBzdWJubyk7CisJCS8qIHRoZSBNT1JFIGhlcmUgaXMgYW4gZXJyb3IgaGV1cmlzdGljICovCisJCWlmIChNT1JFKCkgJiYgIVNFRVRXTygnXFwnLCAnKScpKQorCQkJcF9icmUocCwgJ1xcJywgJyknLCByZWNsaW1pdCk7CisJCWlmIChzdWJubyA8IE5QQVJFTikgeworCQkJcC0+cGVuZFtzdWJub10gPSBIRVJFKCk7CisJCQlhc3NlcnQocC0+cGVuZFtzdWJub10gIT0gMCk7CisJCX0KKwkJRU1JVChPUlBBUkVOLCBzdWJubyk7CisJCVJFUVVJUkUoRUFUVFdPKCdcXCcsICcpJyksIFJFR19FUEFSRU4pOworCQlicmVhazsKKwljYXNlIEJBQ0tTTHwnKSc6CS8qIHNob3VsZCBub3QgZ2V0IGhlcmUgLS0gbXVzdCBiZSB1c2VyICovCisJY2FzZSBCQUNLU0x8J30nOgorCQlTRVRFUlJPUihSRUdfRVBBUkVOKTsKKwkJYnJlYWs7CisJY2FzZSBCQUNLU0x8JzEnOgorCWNhc2UgQkFDS1NMfCcyJzoKKwljYXNlIEJBQ0tTTHwnMyc6CisJY2FzZSBCQUNLU0x8JzQnOgorCWNhc2UgQkFDS1NMfCc1JzoKKwljYXNlIEJBQ0tTTHwnNic6CisJY2FzZSBCQUNLU0x8JzcnOgorCWNhc2UgQkFDS1NMfCc4JzoKKwljYXNlIEJBQ0tTTHwnOSc6CisJCWkgPSAoYyZ+QkFDS1NMKSAtICcwJzsKKwkJYXNzZXJ0KGkgPCBOUEFSRU4pOworCQlpZiAocC0+cGVuZFtpXSAhPSAwKSB7CisJCQlhc3NlcnQoaSA8PSBwLT5nLT5uc3ViKTsKKwkJCUVNSVQoT0JBQ0tfLCBpKTsKKwkJCWFzc2VydChwLT5wYmVnaW5baV0gIT0gMCk7CisJCQlhc3NlcnQoT1AocC0+c3RyaXBbcC0+cGJlZ2luW2ldXSkgPT0gT0xQQVJFTik7CisJCQlhc3NlcnQoT1AocC0+c3RyaXBbcC0+cGVuZFtpXV0pID09IE9SUEFSRU4pOworCQkJKHZvaWQpIGR1cGwocCwgcC0+cGJlZ2luW2ldKzEsIHAtPnBlbmRbaV0pOworCQkJRU1JVChPX0JBQ0ssIGkpOworCQl9IGVsc2UKKwkJCVNFVEVSUk9SKFJFR19FU1VCUkVHKTsKKwkJcC0+Zy0+YmFja3JlZnMgPSAxOworCQlicmVhazsKKwljYXNlICcqJzoKKwkJUkVRVUlSRShzdGFyb3JkaW5hcnksIFJFR19CQURSUFQpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWRlZmF1bHQ6CisJCW9yZGluYXJ5KHAsIGMgJn4gQkFDS1NMKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKEVBVCgnKicpKSB7CQkvKiBpbXBsZW1lbnRlZCBhcyArPyAqLworCQkvKiB0aGlzIGNhc2UgZG9lcyBub3QgcmVxdWlyZSB0aGUgKHl8KSB0cmljaywgbm9LTFVER0UgKi8KKwkJSU5TRVJUKE9QTFVTXywgcG9zKTsKKwkJQVNURVJOKE9fUExVUywgcG9zKTsKKwkJSU5TRVJUKE9RVUVTVF8sIHBvcyk7CisJCUFTVEVSTihPX1FVRVNULCBwb3MpOworCX0gZWxzZSBpZiAoRUFUVFdPKCdcXCcsICd7JykpIHsKKwkJY291bnQgPSBwX2NvdW50KHApOworCQlpZiAoRUFUKCcsJykpIHsKKwkJCWlmIChNT1JFKCkgJiYgaXNkaWdpdCgodW5zaWduZWQgY2hhcilQRUVLKCkpKSB7CisJCQkJY291bnQyID0gcF9jb3VudChwKTsKKwkJCQlSRVFVSVJFKGNvdW50IDw9IGNvdW50MiwgUkVHX0JBREJSKTsKKwkJCX0gZWxzZQkJLyogc2luZ2xlIG51bWJlciB3aXRoIGNvbW1hICovCisJCQkJY291bnQyID0gSU5GSU5JVFk7CisJCX0gZWxzZQkJLyoganVzdCBhIHNpbmdsZSBudW1iZXIgKi8KKwkJCWNvdW50MiA9IGNvdW50OworCQlyZXBlYXQocCwgcG9zLCBjb3VudCwgY291bnQyLCAwKTsKKwkJaWYgKCFFQVRUV08oJ1xcJywgJ30nKSkgewkvKiBlcnJvciBoZXVyaXN0aWNzICovCisJCQl3aGlsZSAoTU9SRSgpICYmICFTRUVUV08oJ1xcJywgJ30nKSkKKwkJCQlORVhUKCk7CisJCQlSRVFVSVJFKE1PUkUoKSwgUkVHX0VCUkFDRSk7CisJCQlTRVRFUlJPUihSRUdfQkFEQlIpOworCQl9CisJfSBlbHNlIGlmIChjID09ICh1bnNpZ25lZCBjaGFyKSckJykJLyogJCAoYnV0IG5vdCBcJCkgZW5kcyBpdCAqLworCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgLSBwX2NvdW50IC0gcGFyc2UgYSByZXBldGl0aW9uIGNvdW50CisgPT0gc3RhdGljIGludCBwX2NvdW50KHN0cnVjdCBwYXJzZSAqcCk7CisgKi8KK3N0YXRpYyBpbnQJCQkvKiB0aGUgdmFsdWUgKi8KK3BfY291bnQoCisgICAgc3RydWN0IHBhcnNlICpwKQoreworCWludCBjb3VudCA9IDA7CisJaW50IG5kaWdpdHMgPSAwOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCXdoaWxlIChNT1JFKCkgJiYgaXNkaWdpdCgodW5zaWduZWQgY2hhcilQRUVLKCkpICYmIGNvdW50IDw9IERVUE1BWCkgeworCQljb3VudCA9IGNvdW50KjEwICsgKEdFVE5FWFQoKSAtICcwJyk7CisJCW5kaWdpdHMrKzsKKwl9CisKKwlSRVFVSVJFKG5kaWdpdHMgPiAwICYmIGNvdW50IDw9IERVUE1BWCwgUkVHX0JBREJSKTsKKwlyZXR1cm4oY291bnQpOworfQorCisvKgorIC0gcF9icmFja2V0IC0gcGFyc2UgYSBicmFja2V0ZWQgY2hhcmFjdGVyIGxpc3QKKyA9PSBzdGF0aWMgdm9pZCBwX2JyYWNrZXQoc3RydWN0IHBhcnNlICpwKTsKKyAqCisgKiBOb3RlIGEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhpcyBjb2RlOiAgaWYgdGhlIGFsbG9jc2V0KCkgZGlkIFNFVEVSUk9SLAorICogbm8gc2V0IG9wZXJhdGlvbnMgYXJlIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitwX2JyYWNrZXQoCisgICAgc3RydWN0IHBhcnNlICpwKQoreworCWNzZXQgKmNzOworCWludCBpbnZlcnQgPSAwOworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwljcyA9IGFsbG9jc2V0KHApOworCWlmIChjcyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBEZXB0IG9mIFRydWx5IFNpY2tlbmluZyBTcGVjaWFsLUNhc2UgS2x1ZGdlcyAqLworCWlmIChwLT5uZXh0ICsgNSA8IHAtPmVuZCAmJiBzdHJuY21wKHAtPm5leHQsICJbOjw6XV0iLAorCQkJCQkgICAgKHNpemVfdCk2KSA9PSAwKSB7CisJCUVNSVQoT0JPVywgMCk7CisJCU5FWFRuKDYpOworCQlyZXR1cm47CisJfQorCWlmIChwLT5uZXh0ICsgNSA8IHAtPmVuZCAmJiBzdHJuY21wKHAtPm5leHQsICJbOj46XV0iLAorCQkJCQkgICAgKHNpemVfdCk2KSA9PSAwKSB7CisJCUVNSVQoT0VPVywgMCk7CisJCU5FWFRuKDYpOworCQlyZXR1cm47CisJfQorCisJaWYgKEVBVCgnXicpKQorCQlpbnZlcnQrKzsJLyogbWFrZSBub3RlIHRvIGludmVydCBzZXQgYXQgZW5kICovCisJaWYgKEVBVCgnXScpKQorCQlDSGFkZChjcywgJ10nKTsKKwllbHNlIGlmIChFQVQoJy0nKSkKKwkJQ0hhZGQoY3MsICctJyk7CisJd2hpbGUgKE1PUkUoKSAmJiBQRUVLKCkgIT0gJ10nICYmICFTRUVUV08oJy0nLCAnXScpKQorCQlwX2JfdGVybShwLCBjcyk7CisJaWYgKEVBVCgnLScpKQorCQlDSGFkZChjcywgJy0nKTsKKwlNVVNURUFUKCddJywgUkVHX0VCUkFDSyk7CisKKwlpZiAocC0+ZXJyb3IgIT0gMCkJLyogZG9uJ3QgbWVzcyB0aGluZ3MgdXAgZnVydGhlciAqLworCQlyZXR1cm47CisKKwlpZiAocC0+Zy0+Y2ZsYWdzJlJFR19JQ0FTRSkgeworCQlzc2l6ZV90IGk7CisJCWludCBjaTsKKworCQlmb3IgKGkgPSBwLT5nLT5jc2V0c2l6ZSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJaWYgKENISU4oY3MsIGkpICYmIGlzYWxwaGEoaSkpIHsKKwkJCQljaSA9IG90aGVyY2FzZSgoaW50KWkpOworCQkJCWlmIChjaSAhPSBpKQorCQkJCQlDSGFkZChjcywgY2kpOworCQkJfQorCQlpZiAoY3MtPm11bHRpcyAhPSBOVUxMKQorCQkJbWNjYXNlKHAsIGNzKTsKKwl9CisJaWYgKGludmVydCkgeworCQlzc2l6ZV90IGk7CisKKwkJZm9yIChpID0gcC0+Zy0+Y3NldHNpemUgLSAxOyBpID49IDA7IGktLSkKKwkJCWlmIChDSElOKGNzLCBpKSkKKwkJCQlDSHN1YihjcywgKGludClpKTsKKwkJCWVsc2UKKwkJCQlDSGFkZChjcywgKGludClpKTsKKwkJaWYgKHAtPmctPmNmbGFncyZSRUdfTkVXTElORSkKKwkJCUNIc3ViKGNzLCAnXG4nKTsKKwkJaWYgKGNzLT5tdWx0aXMgIT0gTlVMTCkKKwkJCW1jaW52ZXJ0KHAsIGNzKTsKKwl9CisKKwlhc3NlcnQoY3MtPm11bHRpcyA9PSBOVUxMKTsJCS8qIHh4eCAqLworCisJaWYgKG5jaChwLCBjcykgPT0gMSkgewkJLyogb3B0aW1pemUgc2luZ2xldG9uIHNldHMgKi8KKwkJb3JkaW5hcnkocCwgZmlyc3RjaChwLCBjcykpOworCQlmcmVlc2V0KHAsIGNzKTsKKwl9IGVsc2UKKwkJRU1JVChPQU5ZT0YsIGZyZWV6ZXNldChwLCBjcykpOworfQorCisvKgorIC0gcF9iX3Rlcm0gLSBwYXJzZSBvbmUgdGVybSBvZiBhIGJyYWNrZXRlZCBjaGFyYWN0ZXIgbGlzdAorID09IHN0YXRpYyB2b2lkIHBfYl90ZXJtKHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworICovCitzdGF0aWMgdm9pZAorcF9iX3Rlcm0oCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIGNzZXQgKmNzKQoreworCWNoYXIgYzsKKwljaGFyIHN0YXJ0LCBmaW5pc2g7CisJaW50IGk7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGNzICE9IE5VTEwpOworCisJLyogY2xhc3NpZnkgd2hhdCB3ZSd2ZSBnb3QgKi8KKwlzd2l0Y2ggKChNT1JFKCkpID8gUEVFSygpIDogJ1wwJykgeworCWNhc2UgJ1snOgorCQljID0gKE1PUkUyKCkpID8gUEVFSzIoKSA6ICdcMCc7CisJCWJyZWFrOworCisJY2FzZSAnLSc6CisJCVNFVEVSUk9SKFJFR19FUkFOR0UpOworCQlyZXR1cm47CQkJLyogTk9URSBSRVRVUk4gKi8KKworCWRlZmF1bHQ6CisJCWMgPSAnXDAnOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICc6JzoJCS8qIGNoYXJhY3RlciBjbGFzcyAqLworCQlORVhUMigpOworCQlSRVFVSVJFKE1PUkUoKSwgUkVHX0VCUkFDSyk7CisJCWMgPSBQRUVLKCk7CisJCVJFUVVJUkUoYyAhPSAnLScgJiYgYyAhPSAnXScsIFJFR19FQ1RZUEUpOworCQlwX2JfY2NsYXNzKHAsIGNzKTsKKwkJUkVRVUlSRShNT1JFKCksIFJFR19FQlJBQ0spOworCQlSRVFVSVJFKEVBVFRXTygnOicsICddJyksIFJFR19FQ1RZUEUpOworCQlicmVhazsKKwljYXNlICc9JzoJCS8qIGVxdWl2YWxlbmNlIGNsYXNzICovCisJCU5FWFQyKCk7CisJCVJFUVVJUkUoTU9SRSgpLCBSRUdfRUJSQUNLKTsKKwkJYyA9IFBFRUsoKTsKKwkJUkVRVUlSRShjICE9ICctJyAmJiBjICE9ICddJywgUkVHX0VDT0xMQVRFKTsKKwkJcF9iX2VjbGFzcyhwLCBjcyk7CisJCVJFUVVJUkUoTU9SRSgpLCBSRUdfRUJSQUNLKTsKKwkJUkVRVUlSRShFQVRUV08oJz0nLCAnXScpLCBSRUdfRUNPTExBVEUpOworCQlicmVhazsKKwlkZWZhdWx0OgkJLyogc3ltYm9sLCBvcmRpbmFyeSBjaGFyYWN0ZXIsIG9yIHJhbmdlICovCisvKiB4eHggcmV2aXNpb24gbmVlZGVkIGZvciBtdWx0aWNoYXIgc3R1ZmYgKi8KKwkJc3RhcnQgPSBwX2Jfc3ltYm9sKHApOworCQlpZiAoU0VFKCctJykgJiYgTU9SRTIoKSAmJiBQRUVLMigpICE9ICddJykgeworCQkJLyogcmFuZ2UgKi8KKwkJCU5FWFQoKTsKKwkJCWlmIChFQVQoJy0nKSkKKwkJCQlmaW5pc2ggPSAnLSc7CisJCQllbHNlCisJCQkJZmluaXNoID0gcF9iX3N5bWJvbChwKTsKKwkJfSBlbHNlCisJCQlmaW5pc2ggPSBzdGFydDsKKy8qIHh4eCB3aGF0IGFib3V0IHNpZ25lZCBjaGFycyBoZXJlLi4uICovCisJCVJFUVVJUkUoc3RhcnQgPD0gZmluaXNoLCBSRUdfRVJBTkdFKTsKKwkJZm9yIChpID0gc3RhcnQ7IGkgPD0gZmluaXNoOyBpKyspCisJCQlDSGFkZChjcywgaSk7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAtIHBfYl9jY2xhc3MgLSBwYXJzZSBhIGNoYXJhY3Rlci1jbGFzcyBuYW1lIGFuZCBkZWFsIHdpdGggaXQKKyA9PSBzdGF0aWMgdm9pZCBwX2JfY2NsYXNzKHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworICovCitzdGF0aWMgdm9pZAorcF9iX2NjbGFzcygKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJY29uc3QgY2hhciAqc3A7CisJY29uc3Qgc3RydWN0IGNjbGFzcyAqY3A7CisJc2l6ZV90IGxlbjsKKwljb25zdCBjaGFyICp1OworCWNoYXIgYzsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoY3MgIT0gTlVMTCk7CisKKwlzcCA9IHAtPm5leHQ7CisKKwl3aGlsZSAoTU9SRSgpICYmIGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpUEVFSygpKSkKKwkJTkVYVCgpOworCWxlbiA9IHAtPm5leHQgLSBzcDsKKwlmb3IgKGNwID0gY2NsYXNzZXM7IGNwLT5uYW1lICE9IE5VTEw7IGNwKyspCisJCWlmIChzdHJuY21wKGNwLT5uYW1lLCBzcCwgbGVuKSA9PSAwICYmIGNwLT5uYW1lW2xlbl0gPT0gJ1wwJykKKwkJCWJyZWFrOworCWlmIChjcC0+bmFtZSA9PSBOVUxMKSB7CisJCS8qIG9vcHMsIGRpZG4ndCBmaW5kIGl0ICovCisJCVNFVEVSUk9SKFJFR19FQ1RZUEUpOworCQlyZXR1cm47CisJfQorCisJdSA9IGNwLT5jaGFyczsKKwl3aGlsZSAoKGMgPSAqdSsrKSAhPSAnXDAnKQorCQlDSGFkZChjcywgYyk7CisJZm9yICh1ID0gY3AtPm11bHRpczsgKnUgIT0gJ1wwJzsgdSArPSBzdHJsZW4odSkgKyAxKQorCQlNQ2FkZChwLCBjcywgdSk7Cit9CisKKy8qCisgLSBwX2JfZWNsYXNzIC0gcGFyc2UgYW4gZXF1aXZhbGVuY2UtY2xhc3MgbmFtZSBhbmQgZGVhbCB3aXRoIGl0CisgPT0gc3RhdGljIHZvaWQgcF9iX2VjbGFzcyhzdHJ1Y3QgcGFyc2UgKnAsIGNzZXQgKmNzKTsKKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGxldGUuIHh4eAorICovCitzdGF0aWMgdm9pZAorcF9iX2VjbGFzcygKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJY2hhciBjOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChjcyAhPSBOVUxMKTsKKworCWMgPSBwX2JfY29sbF9lbGVtKHAsICc9Jyk7CisJQ0hhZGQoY3MsIGMpOworfQorCisvKgorIC0gcF9iX3N5bWJvbCAtIHBhcnNlIGEgY2hhcmFjdGVyIG9yIFsuLl1lZCBtdWx0aWNoYXJhY3RlciBjb2xsYXRpbmcgc3ltYm9sCisgPT0gc3RhdGljIGNoYXIgcF9iX3N5bWJvbChzdHJ1Y3QgcGFyc2UgKnApOworICovCitzdGF0aWMgY2hhcgkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLworcF9iX3N5bWJvbCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnApCit7CisJY2hhciB2YWx1ZTsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwlSRVFVSVJFKE1PUkUoKSwgUkVHX0VCUkFDSyk7CisJaWYgKCFFQVRUV08oJ1snLCAnLicpKQorCQlyZXR1cm4oR0VUTkVYVCgpKTsKKworCS8qIGNvbGxhdGluZyBzeW1ib2wgKi8KKwl2YWx1ZSA9IHBfYl9jb2xsX2VsZW0ocCwgJy4nKTsKKwlSRVFVSVJFKEVBVFRXTygnLicsICddJyksIFJFR19FQ09MTEFURSk7CisJcmV0dXJuKHZhbHVlKTsKK30KKworLyoKKyAtIHBfYl9jb2xsX2VsZW0gLSBwYXJzZSBhIGNvbGxhdGluZy1lbGVtZW50IG5hbWUgYW5kIGxvb2sgaXQgdXAKKyA9PSBzdGF0aWMgY2hhciBwX2JfY29sbF9lbGVtKHN0cnVjdCBwYXJzZSAqcCwgaW50IGVuZGMpOworICovCitzdGF0aWMgY2hhcgkJCS8qIHZhbHVlIG9mIGNvbGxhdGluZyBlbGVtZW50ICovCitwX2JfY29sbF9lbGVtKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBpbnQgZW5kYykJCQkvKiBuYW1lIGVuZGVkIGJ5IGVuZGMsJ10nICovCit7CisJY29uc3QgY2hhciAqc3A7CisJY29uc3Qgc3RydWN0IGNuYW1lICpjcDsKKwlzaXplX3QgbGVuOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCXNwID0gcC0+bmV4dDsKKworCXdoaWxlIChNT1JFKCkgJiYgIVNFRVRXTyhlbmRjLCAnXScpKQorCQlORVhUKCk7CisJaWYgKCFNT1JFKCkpIHsKKwkJU0VURVJST1IoUkVHX0VCUkFDSyk7CisJCXJldHVybigwKTsKKwl9CisJbGVuID0gcC0+bmV4dCAtIHNwOworCWZvciAoY3AgPSBjbmFtZXM7IGNwLT5uYW1lICE9IE5VTEw7IGNwKyspCisJCWlmIChzdHJuY21wKGNwLT5uYW1lLCBzcCwgbGVuKSA9PSAwICYmIGNwLT5uYW1lW2xlbl0gPT0gJ1wwJykKKwkJCXJldHVybihjcC0+Y29kZSk7CS8qIGtub3duIG5hbWUgKi8KKwlpZiAobGVuID09IDEpCisJCXJldHVybigqc3ApOwkvKiBzaW5nbGUgY2hhcmFjdGVyICovCisJU0VURVJST1IoUkVHX0VDT0xMQVRFKTsJCQkvKiBuZWl0aGVyICovCisJcmV0dXJuKDApOworfQorCisvKgorIC0gb3RoZXJjYXNlIC0gcmV0dXJuIHRoZSBjYXNlIGNvdW50ZXJwYXJ0IG9mIGFuIGFscGhhYmV0aWMKKyA9PSBzdGF0aWMgaW50IG90aGVyY2FzZShpbnQgY2gpOworICovCitzdGF0aWMgaW50CQkJLyogaWYgbm8gY291bnRlcnBhcnQsIHJldHVybiBjaCAqLworb3RoZXJjYXNlKAorICAgIGludCBjaCkKK3sKKwlhc3NlcnQoaXNhbHBoYShjaCkpOworCWlmIChpc3VwcGVyKGNoKSkKKwkJcmV0dXJuKHRvbG93ZXIoY2gpKTsKKwllbHNlIGlmIChpc2xvd2VyKGNoKSkKKwkJcmV0dXJuKHRvdXBwZXIoY2gpKTsKKwllbHNlCQkJLyogcGVjdWxpYXIsIGJ1dCBjb3VsZCBoYXBwZW4gKi8KKwkJcmV0dXJuKGNoKTsKK30KKworLyoKKyAtIGJvdGhjYXNlcyAtIGVtaXQgYSBkdWFsY2FzZSB2ZXJzaW9uIG9mIGEgdHdvLWNhc2UgY2hhcmFjdGVyCisgPT0gc3RhdGljIHZvaWQgYm90aGNhc2VzKHN0cnVjdCBwYXJzZSAqcCwgaW50IGNoKTsKKyAqCisgKiBCb3ksIGlzIHRoaXMgaW1wbGVtZW50YXRpb24gZXZlciBhIGtsdWRnZS4uLgorICovCitzdGF0aWMgdm9pZAorYm90aGNhc2VzKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBpbnQgY2gpCit7CisJY29uc3QgY2hhciAqb2xkbmV4dDsKKwljb25zdCBjaGFyICpvbGRlbmQ7CisJY2hhciBicmFja2V0WzNdOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCW9sZG5leHQgPSBwLT5uZXh0OworCW9sZGVuZCA9IHAtPmVuZDsKKworCWFzc2VydChvdGhlcmNhc2UoY2gpICE9IGNoKTsJLyogcF9icmFja2V0KCkgd291bGQgcmVjdXJzZSAqLworCXAtPm5leHQgPSBicmFja2V0OworCXAtPmVuZCA9IGJyYWNrZXQrMjsKKwlicmFja2V0WzBdID0gY2g7CisJYnJhY2tldFsxXSA9ICddJzsKKwlicmFja2V0WzJdID0gJ1wwJzsKKwlwX2JyYWNrZXQocCk7CisJYXNzZXJ0KHAtPm5leHQgPT0gYnJhY2tldCsyKTsKKwlwLT5uZXh0ID0gb2xkbmV4dDsKKwlwLT5lbmQgPSBvbGRlbmQ7Cit9CisKKy8qCisgLSBvcmRpbmFyeSAtIGVtaXQgYW4gb3JkaW5hcnkgY2hhcmFjdGVyCisgPT0gc3RhdGljIHZvaWQgb3JkaW5hcnkoc3RydWN0IHBhcnNlICpwLCBpbnQgY2gpOworICovCitzdGF0aWMgdm9pZAorb3JkaW5hcnkoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIGludCBjaCkKK3sKKwljYXRfdCAqY2FwOworCXVuc2lnbmVkIGNoYXIgdWMgPSAodW5zaWduZWQgY2hhciljaDsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwljYXAgPSBwLT5nLT5jYXRlZ29yaWVzOworCWlmICgocC0+Zy0+Y2ZsYWdzICYgUkVHX0lDQVNFKSAmJiBpc2FscGhhKHVjKSAmJiBvdGhlcmNhc2UodWMpICE9IHVjKQorCQlib3RoY2FzZXMocCwgdWMpOworCWVsc2UgeworCQlFTUlUKE9DSEFSLCAoc29wbm8pdWMpOworCQlpZiAoY2FwW3VjXSA9PSAwKSB7CisJCQlfRElBR0FTU0VSVChfX3R5cGVfZml0KHVuc2lnbmVkIGNoYXIsCisJCQkgICAgcC0+Zy0+bmNhdGVnb3JpZXMgKyAxKSk7CisJCQljYXBbdWNdID0gKHVuc2lnbmVkIGNoYXIpcC0+Zy0+bmNhdGVnb3JpZXMrKzsKKwkJfQorCX0KK30KKworLyoKKyAtIG5vbm5ld2xpbmUgLSBlbWl0IFJFR19ORVdMSU5FIHZlcnNpb24gb2YgT0FOWQorID09IHN0YXRpYyB2b2lkIG5vbm5ld2xpbmUoc3RydWN0IHBhcnNlICpwKTsKKyAqCisgKiBCb3ksIGlzIHRoaXMgaW1wbGVtZW50YXRpb24gZXZlciBhIGtsdWRnZS4uLgorICovCitzdGF0aWMgdm9pZAorbm9ubmV3bGluZSgKKyAgICBzdHJ1Y3QgcGFyc2UgKnApCit7CisJY29uc3QgY2hhciAqb2xkbmV4dDsKKwljb25zdCBjaGFyICpvbGRlbmQ7CisJY2hhciBicmFja2V0WzRdOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCW9sZG5leHQgPSBwLT5uZXh0OworCW9sZGVuZCA9IHAtPmVuZDsKKworCXAtPm5leHQgPSBicmFja2V0OworCXAtPmVuZCA9IGJyYWNrZXQrMzsKKwlicmFja2V0WzBdID0gJ14nOworCWJyYWNrZXRbMV0gPSAnXG4nOworCWJyYWNrZXRbMl0gPSAnXSc7CisJYnJhY2tldFszXSA9ICdcMCc7CisJcF9icmFja2V0KHApOworCWFzc2VydChwLT5uZXh0ID09IGJyYWNrZXQrMyk7CisJcC0+bmV4dCA9IG9sZG5leHQ7CisJcC0+ZW5kID0gb2xkZW5kOworfQorCisvKgorIC0gcmVwZWF0IC0gZ2VuZXJhdGUgY29kZSBmb3IgYSBib3VuZGVkIHJlcGV0aXRpb24sIHJlY3Vyc2l2ZWx5IGlmIG5lZWRlZAorID09IHN0YXRpYyB2b2lkIHJlcGVhdChzdHJ1Y3QgcGFyc2UgKnAsIHNvcG5vIHN0YXJ0LCBpbnQgZnJvbSwgaW50IHRvLAorID09IHNpemVfdCByZWNsaW1pdCk7CisgKi8KK3N0YXRpYyB2b2lkCityZXBlYXQoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIHNvcG5vIHN0YXJ0LAkJLyogb3BlcmFuZCBmcm9tIGhlcmUgdG8gZW5kIG9mIHN0cmlwICovCisgICAgaW50IGZyb20sCQkJLyogcmVwZWF0ZWQgZnJvbSB0aGlzIG51bWJlciAqLworICAgIGludCB0bywJCQkvKiB0byB0aGlzIG51bWJlciBvZiB0aW1lcyAobWF5YmUgSU5GSU5JVFkpICovCisgICAgc2l6ZV90IHJlY2xpbWl0KQoreworCXNvcG5vIGZpbmlzaDsKKyMJZGVmaW5lCU4JMgorIwlkZWZpbmUJSU5GCTMKKyMJZGVmaW5lCVJFUChmLCB0KQkoKGYpKjggKyAodCkpCisjCWRlZmluZQlNQVAobikJKCgobikgPD0gMSkgPyAobikgOiAoKG4pID09IElORklOSVRZKSA/IElORiA6IE4pCisJc29wbm8gY29weTsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwlpZiAocmVjbGltaXQrKyA+IFJFQ0xJTUlUKSAKKwkJcC0+ZXJyb3IgPSBSRUdfRVNQQUNFOworCWlmIChwLT5lcnJvcikKKwkJcmV0dXJuOworCisJZmluaXNoID0gSEVSRSgpOworCisJYXNzZXJ0KGZyb20gPD0gdG8pOworCisJc3dpdGNoIChSRVAoTUFQKGZyb20pLCBNQVAodG8pKSkgeworCWNhc2UgUkVQKDAsIDApOgkJCS8qIG11c3QgYmUgdXNlciBkb2luZyB0aGlzICovCisJCURST1AoZmluaXNoLXN0YXJ0KTsJLyogZHJvcCB0aGUgb3BlcmFuZCAqLworCQlicmVhazsKKwljYXNlIFJFUCgwLCAxKToJCQkvKiBhcyB4ezEsMX0/ICovCisJY2FzZSBSRVAoMCwgTik6CQkJLyogYXMgeHsxLG59PyAqLworCWNhc2UgUkVQKDAsIElORik6CQkvKiBhcyB4ezEsfT8gKi8KKwkJLyogS0xVREdFOiBlbWl0IHk/IGFzICh5fCkgdW50aWwgc3VidGxlIGJ1ZyBnZXRzIGZpeGVkICovCisJCUlOU0VSVChPQ0hfLCBzdGFydCk7CQkvKiBvZmZzZXQgaXMgd3JvbmcuLi4gKi8KKwkJcmVwZWF0KHAsIHN0YXJ0KzEsIDEsIHRvLCByZWNsaW1pdCk7CisJCUFTVEVSTihPT1IxLCBzdGFydCk7CisJCUFIRUFEKHN0YXJ0KTsJCQkvKiAuLi4gZml4IGl0ICovCisJCUVNSVQoT09SMiwgMCk7CisJCUFIRUFEKFRIRVJFKCkpOworCQlBU1RFUk4oT19DSCwgVEhFUkVUSEVSRSgpKTsKKwkJYnJlYWs7CisJY2FzZSBSRVAoMSwgMSk6CQkJLyogdHJpdmlhbCBjYXNlICovCisJCS8qIGRvbmUgKi8KKwkJYnJlYWs7CisJY2FzZSBSRVAoMSwgTik6CQkJLyogYXMgeD94ezEsbi0xfSAqLworCQkvKiBLTFVER0U6IGVtaXQgeT8gYXMgKHl8KSB1bnRpbCBzdWJ0bGUgYnVnIGdldHMgZml4ZWQgKi8KKwkJSU5TRVJUKE9DSF8sIHN0YXJ0KTsKKwkJQVNURVJOKE9PUjEsIHN0YXJ0KTsKKwkJQUhFQUQoc3RhcnQpOworCQlFTUlUKE9PUjIsIDApOwkJCS8qIG9mZnNldCB2ZXJ5IHdyb25nLi4uICovCisJCUFIRUFEKFRIRVJFKCkpOwkJCS8qIC4uLnNvIGZpeCBpdCAqLworCQlBU1RFUk4oT19DSCwgVEhFUkVUSEVSRSgpKTsKKwkJY29weSA9IGR1cGwocCwgc3RhcnQrMSwgZmluaXNoKzEpOworCQlhc3NlcnQoY29weSA9PSBmaW5pc2grNCk7CisJCXJlcGVhdChwLCBjb3B5LCAxLCB0by0xLCByZWNsaW1pdCk7CisJCWJyZWFrOworCWNhc2UgUkVQKDEsIElORik6CQkvKiBhcyB4KyAqLworCQlJTlNFUlQoT1BMVVNfLCBzdGFydCk7CisJCUFTVEVSTihPX1BMVVMsIHN0YXJ0KTsKKwkJYnJlYWs7CisJY2FzZSBSRVAoTiwgTik6CQkJLyogYXMgeHh7bS0xLG4tMX0gKi8KKwkJY29weSA9IGR1cGwocCwgc3RhcnQsIGZpbmlzaCk7CisJCXJlcGVhdChwLCBjb3B5LCBmcm9tLTEsIHRvLTEsIHJlY2xpbWl0KTsKKwkJYnJlYWs7CisJY2FzZSBSRVAoTiwgSU5GKToJCS8qIGFzIHh4e24tMSxJTkZ9ICovCisJCWNvcHkgPSBkdXBsKHAsIHN0YXJ0LCBmaW5pc2gpOworCQlyZXBlYXQocCwgY29weSwgZnJvbS0xLCB0bywgcmVjbGltaXQpOworCQlicmVhazsKKwlkZWZhdWx0OgkJCS8qICJjYW4ndCBoYXBwZW4iICovCisJCVNFVEVSUk9SKFJFR19BU1NFUlQpOwkvKiBqdXN0IGluIGNhc2UgKi8KKwkJYnJlYWs7CisJfQorfQorCisvKgorIC0gc2V0ZXJyIC0gc2V0IGFuIGVycm9yIGNvbmRpdGlvbgorID09IHN0YXRpYyBpbnQgc2V0ZXJyKHN0cnVjdCBwYXJzZSAqcCwgaW50IGUpOworICovCitzdGF0aWMgaW50CQkJLyogdXNlbGVzcyBidXQgbWFrZXMgdHlwZSBjaGVja2luZyBoYXBweSAqLworc2V0ZXJyKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBpbnQgZSkKK3sKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwlpZiAocC0+ZXJyb3IgPT0gMCkJLyoga2VlcCBlYXJsaWVzdCBlcnJvciBjb25kaXRpb24gKi8KKwkJcC0+ZXJyb3IgPSBlOworCXAtPm5leHQgPSBudWxzOwkJLyogdHJ5IHRvIGJyaW5nIHRoaW5ncyB0byBhIGhhbHQgKi8KKwlwLT5lbmQgPSBudWxzOworCXJldHVybigwKTsJCS8qIG1ha2UgdGhlIHJldHVybiB2YWx1ZSB3ZWxsLWRlZmluZWQgKi8KK30KKworLyoKKyAtIGFsbG9jc2V0IC0gYWxsb2NhdGUgYSBzZXQgb2YgY2hhcmFjdGVycyBmb3IgW10KKyA9PSBzdGF0aWMgY3NldCAqYWxsb2NzZXQoc3RydWN0IHBhcnNlICpwKTsKKyAqLworc3RhdGljIGNzZXQgKgorYWxsb2NzZXQoCisgICAgc3RydWN0IHBhcnNlICpwKQoreworCXNpemVfdCBubzsKKwlzaXplX3QgbmM7CisJc2l6ZV90IG5ieXRlczsKKwljc2V0ICpjczsKKwlzaXplX3QgY3NzOworCXNpemVfdCBpOworCXZvaWQgKm9sZF9wdHI7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJbm8gPSBwLT5nLT5uY3NldHMrKzsKKwljc3MgPSAoc2l6ZV90KXAtPmctPmNzZXRzaXplOworCWlmIChubyA+PSBwLT5uY3NhbGxvYykgewkvKiBuZWVkIGFub3RoZXIgY29sdW1uIG9mIHNwYWNlICovCisJCXAtPm5jc2FsbG9jICs9IENIQVJfQklUOworCQluYyA9IHAtPm5jc2FsbG9jOworCQlhc3NlcnQobmMgJSBDSEFSX0JJVCA9PSAwKTsKKwkJbmJ5dGVzID0gbmMgLyBDSEFSX0JJVCAqIGNzczsKKwkJaWYgKE1FTVNJWkUocCkgPiBNRU1MSU1JVCkKKwkJCWdvdG8gb29tZW07CisJCWlmIChyZWFsbG9jYXJyKCZwLT5nLT5zZXRzLCBuYywgc2l6ZW9mKGNzZXQpKSkKKwkJCWdvdG8gb29tZW07CisJCW9sZF9wdHIgPSBwLT5nLT5zZXRiaXRzOworCQlpZiAocmVhbGxvY2FycigmcC0+Zy0+c2V0Yml0cywgbmMgLyBDSEFSX0JJVCwgY3NzKSkgeworCQkJZnJlZShvbGRfcHRyKTsKKwkJCWdvdG8gb29tZW07CisJCX0KKwkJaWYgKG9sZF9wdHIgIT0gcC0+Zy0+c2V0Yml0cykgeworCQkJZm9yIChpID0gMDsgaSA8IG5vOyBpKyspCisJCQkJcC0+Zy0+c2V0c1tpXS5wdHIgPSBwLT5nLT5zZXRiaXRzICsgY3NzKihpL0NIQVJfQklUKTsKKwkJfQorCQkodm9pZCkgbWVtc2V0KChjaGFyICopcC0+Zy0+c2V0Yml0cyArIChuYnl0ZXMgLSBjc3MpLCAwLCBjc3MpOworCX0KKworCWNzID0gJnAtPmctPnNldHNbbm9dOworCWNzLT5wdHIgPSBwLT5nLT5zZXRiaXRzICsgY3NzKigobm8pL0NIQVJfQklUKTsKKwljcy0+bWFzayA9IDEgPDwgKHVuc2lnbmVkIGludCkoKG5vKSAlIENIQVJfQklUKTsKKwljcy0+aGFzaCA9IDA7CisJY3MtPnNtdWx0aXMgPSAwOworCWNzLT5tdWx0aXMgPSBOVUxMOworCisJcmV0dXJuKGNzKTsKKworb29tZW06CisJU0VURVJST1IoUkVHX0VTUEFDRSk7CisJLyogY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgbm90IHRvIGRvIHNldCBvcHMgKi8KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAtIGZyZWVzZXQgLSBmcmVlIGEgbm93LXVudXNlZCBzZXQKKyA9PSBzdGF0aWMgdm9pZCBmcmVlc2V0KHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworICovCitzdGF0aWMgdm9pZAorZnJlZXNldCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJc2l6ZV90IGk7CisJY3NldCAqdG9wOworCXNpemVfdCBjc3M7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGNzICE9IE5VTEwpOworCisJdG9wID0gJnAtPmctPnNldHNbcC0+Zy0+bmNzZXRzXTsKKwljc3MgPSAoc2l6ZV90KXAtPmctPmNzZXRzaXplOworCisJZm9yIChpID0gMDsgaSA8IGNzczsgaSsrKQorCQlDSHN1YihjcywgKGludClpKTsKKwlpZiAoY3MgPT0gdG9wLTEpCS8qIHJlY292ZXIgb25seSB0aGUgZWFzeSBjYXNlICovCisJCXAtPmctPm5jc2V0cy0tOworfQorCisvKgorIC0gZnJlZXplc2V0IC0gZmluYWwgcHJvY2Vzc2luZyBvbiBhIHNldCBvZiBjaGFyYWN0ZXJzCisgPT0gc3RhdGljIGludCBmcmVlemVzZXQoc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CisgKgorICogVGhlIG1haW4gdGFzayBoZXJlIGlzIG1lcmdpbmcgaWRlbnRpY2FsIHNldHMuICBUaGlzIGlzIHVzdWFsbHkgYSB3YXN0ZQorICogb2YgdGltZSAoYWx0aG91Z2ggdGhlIGhhc2ggY29kZSBtaW5pbWl6ZXMgdGhlIG92ZXJoZWFkKSwgYnV0IGNhbiB3aW4KKyAqIGJpZyBpZiBSRUdfSUNBU0UgaXMgYmVpbmcgdXNlZC4gIFJFR19JQ0FTRSwgYnkgdGhlIHdheSwgaXMgd2h5IHRoZSBoYXNoCisgKiBpcyBkb25lIHVzaW5nIGFkZGl0aW9uIHJhdGhlciB0aGFuIHhvciAtLSBhbGwgQVNDSUkgW2FBXSBzZXRzIHhvciB0bworICogdGhlIHNhbWUgdmFsdWUhCisgKi8KK3N0YXRpYyBzb3BubwkJCS8qIHNldCBudW1iZXIgKi8KK2ZyZWV6ZXNldCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJdWNoIGg7CisJc2l6ZV90IGk7CisJY3NldCAqdG9wOworCWNzZXQgKmNzMjsKKwlzaXplX3QgY3NzOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChjcyAhPSBOVUxMKTsKKworCWggPSBjcy0+aGFzaDsKKwl0b3AgPSAmcC0+Zy0+c2V0c1twLT5nLT5uY3NldHNdOworCWNzcyA9IChzaXplX3QpcC0+Zy0+Y3NldHNpemU7CisKKwkvKiBsb29rIGZvciBhbiBlYXJsaWVyIG9uZSB3aGljaCBpcyB0aGUgc2FtZSAqLworCWZvciAoY3MyID0gJnAtPmctPnNldHNbMF07IGNzMiA8IHRvcDsgY3MyKyspCisJCWlmIChjczItPmhhc2ggPT0gaCAmJiBjczIgIT0gY3MpIHsKKwkJCS8qIG1heWJlICovCisJCQlmb3IgKGkgPSAwOyBpIDwgY3NzOyBpKyspCisJCQkJaWYgKCEhQ0hJTihjczIsIGkpICE9ICEhQ0hJTihjcywgaSkpCisJCQkJCWJyZWFrOwkJLyogbm8gKi8KKwkJCWlmIChpID09IGNzcykKKwkJCQlicmVhazsJCQkvKiB5ZXMgKi8KKwkJfQorCisJaWYgKGNzMiA8IHRvcCkgewkvKiBmb3VuZCBvbmUgKi8KKwkJZnJlZXNldChwLCBjcyk7CisJCWNzID0gY3MyOworCX0KKworCXJldHVybiAoc29wbm8pKGNzIC0gcC0+Zy0+c2V0cyk7Cit9CisKKy8qCisgLSBmaXJzdGNoIC0gcmV0dXJuIGZpcnN0IGNoYXJhY3RlciBpbiBhIHNldCAod2hpY2ggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSkKKyA9PSBzdGF0aWMgaW50IGZpcnN0Y2goc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CisgKi8KK3N0YXRpYyBpbnQJCQkvKiBjaGFyYWN0ZXI7IHRoZXJlIGlzIG5vICJub25lIiB2YWx1ZSAqLworZmlyc3RjaCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJc2l6ZV90IGk7CisJc2l6ZV90IGNzczsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoY3MgIT0gTlVMTCk7CisKKwljc3MgPSAoc2l6ZV90KXAtPmctPmNzZXRzaXplOworCisJZm9yIChpID0gMDsgaSA8IGNzczsgaSsrKQorCQlpZiAoQ0hJTihjcywgaSkpCisJCQlyZXR1cm4oKGNoYXIpaSk7CisJYXNzZXJ0KG5ldmVyKTsKKwlyZXR1cm4oMCk7CQkvKiBhcmJpdHJhcnkgKi8KK30KKworLyoKKyAtIG5jaCAtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc2V0CisgPT0gc3RhdGljIGludCBuY2goc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CisgKi8KK3N0YXRpYyBpbnQKK25jaCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisJc2l6ZV90IGk7CisJc2l6ZV90IGNzczsKKwlpbnQgbiA9IDA7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGNzICE9IE5VTEwpOworCisJY3NzID0gKHNpemVfdClwLT5nLT5jc2V0c2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBjc3M7IGkrKykKKwkJaWYgKENISU4oY3MsIGkpKQorCQkJbisrOworCXJldHVybihuKTsKK30KKworLyoKKyAtIG1jYWRkIC0gYWRkIGEgY29sbGF0aW5nIGVsZW1lbnQgdG8gYSBjc2V0CisgPT0gc3RhdGljIHZvaWQgbWNhZGQoc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcywgXAorID09CWNoYXIgKmNwKTsKKyAqLworc3RhdGljIHZvaWQKK21jYWRkKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBjc2V0ICpjcywKKyAgICBjb25zdCBjaGFyICpjcCkKK3sKKwlzaXplX3Qgb2xkZW5kOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChjcyAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChjcCAhPSBOVUxMKTsKKworCW9sZGVuZCA9IGNzLT5zbXVsdGlzOworCisJY3MtPnNtdWx0aXMgKz0gc3RybGVuKGNwKSArIDE7CisJaWYgKGNzLT5tdWx0aXMgPT0gTlVMTCkKKwkJY3MtPm11bHRpcyA9IG1hbGxvYyhjcy0+c211bHRpcyk7CisJZWxzZQorCQljcy0+bXVsdGlzID0gcmVhbGxvYyhjcy0+bXVsdGlzLCBjcy0+c211bHRpcyk7CisJaWYgKGNzLT5tdWx0aXMgPT0gTlVMTCkgeworCQlTRVRFUlJPUihSRUdfRVNQQUNFKTsKKwkJcmV0dXJuOworCX0KKworCSh2b2lkKSBzdHJjcHkoY3MtPm11bHRpcyArIG9sZGVuZCAtIDEsIGNwKTsKKwljcy0+bXVsdGlzW2NzLT5zbXVsdGlzIC0gMV0gPSAnXDAnOworfQorCisjaWYgMAorLyoKKyAtIG1jc3ViIC0gc3VidHJhY3QgYSBjb2xsYXRpbmcgZWxlbWVudCBmcm9tIGEgY3NldAorID09IHN0YXRpYyB2b2lkIG1jc3ViKGNzZXQgKmNzLCBjaGFyICpjcCk7CisgKi8KK3N0YXRpYyB2b2lkCittY3N1YigKKyAgICBjc2V0ICpjcywKKyAgICBjaGFyICpjcCkKK3sKKwljaGFyICpmcDsKKwlzaXplX3QgbGVuOworCisJX0RJQUdBU1NFUlQoY3MgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoY3AgIT0gTlVMTCk7CisKKwlmcCA9IG1jZmluZChjcywgY3ApOworCWxlbiA9IHN0cmxlbihmcCk7CisKKwlhc3NlcnQoZnAgIT0gTlVMTCk7CisJKHZvaWQpIG1lbW1vdmUoZnAsIGZwICsgbGVuICsgMSwKKwkJCQljcy0+c211bHRpcyAtIChmcCArIGxlbiArIDEgLSBjcy0+bXVsdGlzKSk7CisJY3MtPnNtdWx0aXMgLT0gbGVuOworCisJaWYgKGNzLT5zbXVsdGlzID09IDApIHsKKwkJZnJlZShjcy0+bXVsdGlzKTsKKwkJY3MtPm11bHRpcyA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwljcy0+bXVsdGlzID0gcmVhbGxvYyhjcy0+bXVsdGlzLCBjcy0+c211bHRpcyk7CisJYXNzZXJ0KGNzLT5tdWx0aXMgIT0gTlVMTCk7Cit9CisKKy8qCisgLSBtY2luIC0gaXMgYSBjb2xsYXRpbmcgZWxlbWVudCBpbiBhIGNzZXQ/CisgPT0gc3RhdGljIGludCBtY2luKGNzZXQgKmNzLCBjaGFyICpjcCk7CisgKi8KK3N0YXRpYyBpbnQKK21jaW4oCisgICAgY3NldCAqY3MsCisgICAgY2hhciAqY3ApCit7CisKKwlfRElBR0FTU0VSVChjcyAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChjcCAhPSBOVUxMKTsKKworCXJldHVybihtY2ZpbmQoY3MsIGNwKSAhPSBOVUxMKTsKK30KKworLyoKKyAtIG1jZmluZCAtIGZpbmQgYSBjb2xsYXRpbmcgZWxlbWVudCBpbiBhIGNzZXQKKyA9PSBzdGF0aWMgY2hhciAqbWNmaW5kKGNzZXQgKmNzLCBjaGFyICpjcCk7CisgKi8KK3N0YXRpYyBjaGFyICoKK21jZmluZCgKKyAgICBjc2V0ICpjcywKKyAgICBjaGFyICpjcCkKK3sKKwljaGFyICpwOworCisJX0RJQUdBU1NFUlQoY3MgIT0gTlVMTCk7CisJX0RJQUdBU1NFUlQoY3AgIT0gTlVMTCk7CisKKwlpZiAoY3MtPm11bHRpcyA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisJZm9yIChwID0gY3MtPm11bHRpczsgKnAgIT0gJ1wwJzsgcCArPSBzdHJsZW4ocCkgKyAxKQorCQlpZiAoc3RyY21wKGNwLCBwKSA9PSAwKQorCQkJcmV0dXJuKHApOworCXJldHVybihOVUxMKTsKK30KKyNlbmRpZgorCisvKgorIC0gbWNpbnZlcnQgLSBpbnZlcnQgdGhlIGxpc3Qgb2YgY29sbGF0aW5nIGVsZW1lbnRzIGluIGEgY3NldAorID09IHN0YXRpYyB2b2lkIG1jaW52ZXJ0KHN0cnVjdCBwYXJzZSAqcCwgY3NldCAqY3MpOworICoKKyAqIFRoaXMgd291bGQgaGF2ZSB0byBrbm93IHRoZSBzZXQgb2YgcG9zc2liaWxpdGllcy4gIEltcGxlbWVudGF0aW9uCisgKiBpcyBkZWZlcnJlZC4KKyAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCittY2ludmVydCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGNzICE9IE5VTEwpOworCisJYXNzZXJ0KGNzLT5tdWx0aXMgPT0gTlVMTCk7CS8qIHh4eCAqLworfQorCisvKgorIC0gbWNjYXNlIC0gYWRkIGNhc2UgY291bnRlcnBhcnRzIG9mIHRoZSBsaXN0IG9mIGNvbGxhdGluZyBlbGVtZW50cyBpbiBhIGNzZXQKKyA9PSBzdGF0aWMgdm9pZCBtY2Nhc2Uoc3RydWN0IHBhcnNlICpwLCBjc2V0ICpjcyk7CisgKgorICogVGhpcyB3b3VsZCBoYXZlIHRvIGtub3cgdGhlIHNldCBvZiBwb3NzaWJpbGl0aWVzLiAgSW1wbGVtZW50YXRpb24KKyAqIGlzIGRlZmVycmVkLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQKK21jY2FzZSgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgY3NldCAqY3MpCit7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGNzICE9IE5VTEwpOworCisJYXNzZXJ0KGNzLT5tdWx0aXMgPT0gTlVMTCk7CS8qIHh4eCAqLworfQorCisvKgorIC0gaXNpbnNldHMgLSBpcyB0aGlzIGNoYXJhY3RlciBpbiBhbnkgc2V0cz8KKyA9PSBzdGF0aWMgaW50IGlzaW5zZXRzKHN0cnVjdCByZV9ndXRzICpnLCBpbnQgYyk7CisgKi8KK3N0YXRpYyBpbnQJCQkvKiBwcmVkaWNhdGUgKi8KK2lzaW5zZXRzKAorICAgIHN0cnVjdCByZV9ndXRzICpnLAorICAgIGludCBjKQoreworCXVjaCAqY29sOworCXNpemVfdCBpOworCXNpemVfdCBuY29sczsKKwl1bnNpZ25lZCB1YyA9ICh1bnNpZ25lZCBjaGFyKWM7CisKKwlfRElBR0FTU0VSVChnICE9IE5VTEwpOworCisJaWYgKGctPnNldGJpdHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwluY29scyA9IChnLT5uY3NldHMrKENIQVJfQklULTEpKSAvIENIQVJfQklUOworCisJZm9yIChpID0gMCwgY29sID0gZy0+c2V0Yml0czsgaSA8IG5jb2xzOyBpKyssIGNvbCArPSBnLT5jc2V0c2l6ZSkKKwkJaWYgKGNvbFt1Y10gIT0gMCkKKwkJCXJldHVybigxKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgLSBzYW1lc2V0cyAtIGFyZSB0aGVzZSB0d28gY2hhcmFjdGVycyBpbiBleGFjdGx5IHRoZSBzYW1lIHNldHM/CisgPT0gc3RhdGljIGludCBzYW1lc2V0cyhzdHJ1Y3QgcmVfZ3V0cyAqZywgaW50IGMxLCBpbnQgYzIpOworICovCitzdGF0aWMgaW50CQkJLyogcHJlZGljYXRlICovCitzYW1lc2V0cygKKyAgICBzdHJ1Y3QgcmVfZ3V0cyAqZywKKyAgICBpbnQgYzEsCisgICAgaW50IGMyKQoreworCXVjaCAqY29sOworCXNpemVfdCBpOworCXNpemVfdCBuY29sczsKKwl1bnNpZ25lZCB1YzEgPSAodW5zaWduZWQgY2hhciljMTsKKwl1bnNpZ25lZCB1YzIgPSAodW5zaWduZWQgY2hhciljMjsKKworCV9ESUFHQVNTRVJUKGcgIT0gTlVMTCk7CisKKwluY29scyA9IChnLT5uY3NldHMrKENIQVJfQklULTEpKSAvIENIQVJfQklUOworCisJZm9yIChpID0gMCwgY29sID0gZy0+c2V0Yml0czsgaSA8IG5jb2xzOyBpKyssIGNvbCArPSBnLT5jc2V0c2l6ZSkKKwkJaWYgKGNvbFt1YzFdICE9IGNvbFt1YzJdKQorCQkJcmV0dXJuKDApOworCXJldHVybigxKTsKK30KKworLyoKKyAtIGNhdGVnb3JpemUgLSBzb3J0IG91dCBjaGFyYWN0ZXIgY2F0ZWdvcmllcworID09IHN0YXRpYyB2b2lkIGNhdGVnb3JpemUoc3RydWN0IHBhcnNlICpwLCBzdHJ1Y3QgcmVfZ3V0cyAqZyk7CisgKi8KK3N0YXRpYyB2b2lkCitjYXRlZ29yaXplKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBzdHJ1Y3QgcmVfZ3V0cyAqZykKK3sKKwljYXRfdCAqY2F0czsKKwlpbnQgYzsKKwlpbnQgYzI7CisJY2F0X3QgY2F0OworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChnICE9IE5VTEwpOworCisJY2F0cyA9IGctPmNhdGVnb3JpZXM7CisKKwkvKiBhdm9pZCBtYWtpbmcgZXJyb3Igc2l0dWF0aW9ucyB3b3JzZSAqLworCWlmIChwLT5lcnJvciAhPSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGMgPSBDSEFSX01JTjsgYyA8PSBDSEFSX01BWDsgYysrKQorCQlpZiAoY2F0c1tjXSA9PSAwICYmIGlzaW5zZXRzKGcsIGMpKSB7CisJCQlfRElBR0FTU0VSVChfX3R5cGVfZml0KHVuc2lnbmVkIGNoYXIsCisJCQkgICAgZy0+bmNhdGVnb3JpZXMgKyAxKSk7CisJCQljYXQgPSBnLT5uY2F0ZWdvcmllcysrOworCQkJY2F0c1tjXSA9IGNhdDsKKwkJCWZvciAoYzIgPSBjKzE7IGMyIDw9IENIQVJfTUFYOyBjMisrKQorCQkJCWlmIChjYXRzW2MyXSA9PSAwICYmIHNhbWVzZXRzKGcsIGMsIGMyKSkKKwkJCQkJY2F0c1tjMl0gPSBjYXQ7CisJCX0KK30KKworLyoKKyAtIGR1cGwgLSBlbWl0IGEgZHVwbGljYXRlIG9mIGEgYnVuY2ggb2Ygc29wcworID09IHN0YXRpYyBzb3BubyBkdXBsKHN0cnVjdCBwYXJzZSAqcCwgc29wbm8gc3RhcnQsIHNvcG5vIGZpbmlzaCk7CisgKi8KK3N0YXRpYyBzb3BubwkJCS8qIHN0YXJ0IG9mIGR1cGxpY2F0ZSAqLworZHVwbCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgc29wbm8gc3RhcnQsCQkJLyogZnJvbSBoZXJlICovCisgICAgc29wbm8gZmluaXNoKQkJCS8qIHRvIHRoaXMgbGVzcyBvbmUgKi8KK3sKKwlzb3BubyByZXQ7CisJc29wbm8gbGVuID0gZmluaXNoIC0gc3RhcnQ7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJcmV0ID0gSEVSRSgpOworCisJYXNzZXJ0KGZpbmlzaCA+PSBzdGFydCk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4ocmV0KTsKKwlpZiAoIWVubGFyZ2UocCwgcC0+c3NpemUgKyBsZW4pKS8qIHRoaXMgbWFueSB1bmV4cGVjdGVkIGFkZGl0aW9ucyAqLworCQlyZXR1cm4gcmV0OworCSh2b2lkKW1lbWNweShwLT5zdHJpcCArIHAtPnNsZW4sIHAtPnN0cmlwICsgc3RhcnQsCisJICAgIChzaXplX3QpbGVuICogc2l6ZW9mKHNvcCkpOworCXAtPnNsZW4gKz0gbGVuOworCXJldHVybihyZXQpOworfQorCisvKgorIC0gZG9lbWl0IC0gZW1pdCBhIHN0cmlwIG9wZXJhdG9yCisgPT0gc3RhdGljIHZvaWQgZG9lbWl0KHN0cnVjdCBwYXJzZSAqcCwgc29wIG9wLCBzaXplX3Qgb3BuZCk7CisgKgorICogSXQgbWlnaHQgc2VlbSBiZXR0ZXIgdG8gaW1wbGVtZW50IHRoaXMgYXMgYSBtYWNybyB3aXRoIGEgZnVuY3Rpb24gYXMKKyAqIGhhcmQtY2FzZSBiYWNrdXAsIGJ1dCBpdCdzIGp1c3QgdG9vIGJpZyBhbmQgbWVzc3kgdW5sZXNzIHRoZXJlIGFyZQorICogc29tZSBjaGFuZ2VzIHRvIHRoZSBkYXRhIHN0cnVjdHVyZXMuICBNYXliZSBsYXRlci4KKyAqLworc3RhdGljIHZvaWQKK2RvZW1pdCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgc29wIG9wLAorICAgIHNvcG5vIG9wbmQpCit7CisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKworCS8qIGF2b2lkIG1ha2luZyBlcnJvciBzaXR1YXRpb25zIHdvcnNlICovCisJaWYgKHAtPmVycm9yICE9IDApCisJCXJldHVybjsKKworCS8qIGRlYWwgd2l0aCBvdmVyc2l6ZSBvcGVyYW5kcyAoImNhbid0IGhhcHBlbiIsIG1vcmUgb3IgbGVzcykgKi8KKwlhc3NlcnQob3BuZCA8IDE8PE9QU0hJRlQpOworCisJLyogZGVhbCB3aXRoIHVuZGVyc2l6ZWQgc3RyaXAgKi8KKwlpZiAocC0+c2xlbiA+PSBwLT5zc2l6ZSkKKwkJaWYgKCFlbmxhcmdlKHAsIChwLT5zc2l6ZSsxKSAvIDIgKiAzKSkJLyogKzUwJSAqLworCQkJcmV0dXJuOworCisJLyogZmluYWxseSwgaXQncyBhbGwgcmVkdWNlZCB0byB0aGUgZWFzeSBjYXNlICovCisJcC0+c3RyaXBbcC0+c2xlbisrXSA9IChzb3ApU09QKG9wLCBvcG5kKTsKK30KKworLyoKKyAtIGRvaW5zZXJ0IC0gaW5zZXJ0IGEgc29wIGludG8gdGhlIHN0cmlwCisgPT0gc3RhdGljIHZvaWQgZG9pbnNlcnQoc3RydWN0IHBhcnNlICpwLCBzb3Agb3AsIHNpemVfdCBvcG5kLCBzb3BubyBwb3MpOworICovCitzdGF0aWMgdm9pZAorZG9pbnNlcnQoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIHNvcCBvcCwKKyAgICBzb3BubyBvcG5kLAorICAgIHNvcG5vIHBvcykKK3sKKwlzb3BubyBzbjsKKwlzb3AgczsKKwlpbnQgaTsKKworCV9ESUFHQVNTRVJUKHAgIT0gTlVMTCk7CisKKwkvKiBhdm9pZCBtYWtpbmcgZXJyb3Igc2l0dWF0aW9ucyB3b3JzZSAqLworCWlmIChwLT5lcnJvciAhPSAwKQorCQlyZXR1cm47CisKKwlzbiA9IEhFUkUoKTsKKwlFTUlUKG9wLCBvcG5kKTsJCS8qIGRvIGNoZWNrcywgZW5zdXJlIHNwYWNlICovCisJYXNzZXJ0KEhFUkUoKSA9PSBzbisxKTsKKwlzID0gcC0+c3RyaXBbc25dOworCisJLyogYWRqdXN0IHBhcmVuIHBvaW50ZXJzICovCisJYXNzZXJ0KHBvcyA+IDApOworCWZvciAoaSA9IDE7IGkgPCBOUEFSRU47IGkrKykgeworCQlpZiAocC0+cGJlZ2luW2ldID49IHBvcykgeworCQkJcC0+cGJlZ2luW2ldKys7CisJCX0KKwkJaWYgKHAtPnBlbmRbaV0gPj0gcG9zKSB7CisJCQlwLT5wZW5kW2ldKys7CisJCX0KKwl9CisKKwltZW1tb3ZlKCZwLT5zdHJpcFtwb3MrMV0sICZwLT5zdHJpcFtwb3NdLCAoSEVSRSgpLXBvcy0xKSpzaXplb2Yoc29wKSk7CisJcC0+c3RyaXBbcG9zXSA9IHM7Cit9CisKKy8qCisgLSBkb2Z3ZCAtIGNvbXBsZXRlIGEgZm9yd2FyZCByZWZlcmVuY2UKKyA9PSBzdGF0aWMgdm9pZCBkb2Z3ZChzdHJ1Y3QgcGFyc2UgKnAsIHNvcG5vIHBvcywgc29wIHZhbHVlKTsKKyAqLworc3RhdGljIHZvaWQKK2RvZndkKAorICAgIHN0cnVjdCBwYXJzZSAqcCwKKyAgICBzb3BubyBwb3MsCisgICAgc29wbm8gdmFsdWUpCit7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJLyogYXZvaWQgbWFraW5nIGVycm9yIHNpdHVhdGlvbnMgd29yc2UgKi8KKwlpZiAocC0+ZXJyb3IgIT0gMCkKKwkJcmV0dXJuOworCisJYXNzZXJ0KHZhbHVlIDwgMTw8T1BTSElGVCk7CisJcC0+c3RyaXBbcG9zXSA9IChzb3ApKE9QKHAtPnN0cmlwW3Bvc10pIHwgdmFsdWUpOworfQorCisvKgorIC0gZW5sYXJnZSAtIGVubGFyZ2UgdGhlIHN0cmlwCisgPT0gc3RhdGljIHZvaWQgZW5sYXJnZShzdHJ1Y3QgcGFyc2UgKnAsIHNvcG5vIHNpemUpOworICovCitzdGF0aWMgaW50CitlbmxhcmdlKHN0cnVjdCBwYXJzZSAqcCwgc29wbm8gc2l6ZSkKK3sKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCisJaWYgKHAtPnNzaXplID49IHNpemUpCisJCXJldHVybiAxOworCisJaWYgKE1FTVNJWkUocCkgPiBNRU1MSU1JVCB8fCByZWFsbG9jYXJyKCZwLT5zdHJpcCwgc2l6ZSwgc2l6ZW9mKHNvcCkpKSB7CisJCVNFVEVSUk9SKFJFR19FU1BBQ0UpOworCQlyZXR1cm4gMDsKKwl9CisJcC0+c3NpemUgPSBzaXplOworCXJldHVybiAxOworfQorCisvKgorIC0gc3RyaXBzbnVnIC0gY29tcGFjdCB0aGUgc3RyaXAKKyA9PSBzdGF0aWMgdm9pZCBzdHJpcHNudWcoc3RydWN0IHBhcnNlICpwLCBzdHJ1Y3QgcmVfZ3V0cyAqZyk7CisgKi8KK3N0YXRpYyB2b2lkCitzdHJpcHNudWcoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIHN0cnVjdCByZV9ndXRzICpnKQoreworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChnICE9IE5VTEwpOworCisJZy0+bnN0YXRlcyA9IHAtPnNsZW47CisJZy0+c3RyaXAgPSBwLT5zdHJpcDsKKwlyZWFsbG9jYXJyKCZnLT5zdHJpcCwgcC0+c2xlbiwgc2l6ZW9mKHNvcCkpOworCS8qIElnbm9yZSBlcnJvciBhcyB0cmllcyB0byBmcmVlIG1lbW9yeSBvbmx5LiAqLworfQorCisvKgorIC0gZmluZG11c3QgLSBmaWxsIGluIG11c3QgYW5kIG1sZW4gd2l0aCBsb25nZXN0IG1hbmRhdG9yeSBsaXRlcmFsIHN0cmluZworID09IHN0YXRpYyB2b2lkIGZpbmRtdXN0KHN0cnVjdCBwYXJzZSAqcCwgc3RydWN0IHJlX2d1dHMgKmcpOworICoKKyAqIFRoaXMgYWxnb3JpdGhtIGNvdWxkIGRvIGZhbmN5IHRoaW5ncyBsaWtlIGFuYWx5emluZyB0aGUgb3BlcmFuZHMgb2YgfAorICogZm9yIGNvbW1vbiBzdWJzZXF1ZW5jZXMuICBTb21lZGF5LiAgVGhpcyBjb2RlIGlzIHNpbXBsZSBhbmQgZmluZHMgbW9zdAorICogb2YgdGhlIGludGVyZXN0aW5nIGNhc2VzLgorICoKKyAqIE5vdGUgdGhhdCBtdXN0IGFuZCBtbGVuIGdvdCBpbml0aWFsaXplZCBkdXJpbmcgc2V0dXAuCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kbXVzdCgKKyAgICBzdHJ1Y3QgcGFyc2UgKnAsCisgICAgc3RydWN0IHJlX2d1dHMgKmcpCit7CisJc29wICpzY2FuOworCXNvcCAqc3RhcnQgPSBOVUxMOworCXNvcCAqbmV3c3RhcnQgPSBOVUxMOworCXNvcG5vIG5ld2xlbjsKKwlzb3AgczsKKwljaGFyICpjcDsKKwlzb3BubyBpOworCisJX0RJQUdBU1NFUlQocCAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChnICE9IE5VTEwpOworCisJLyogYXZvaWQgbWFraW5nIGVycm9yIHNpdHVhdGlvbnMgd29yc2UgKi8KKwlpZiAocC0+ZXJyb3IgIT0gMCkKKwkJcmV0dXJuOworCisJLyogZmluZCB0aGUgbG9uZ2VzdCBPQ0hBUiBzZXF1ZW5jZSBpbiBzdHJpcCAqLworCW5ld2xlbiA9IDA7CisJc2NhbiA9IGctPnN0cmlwICsgMTsKKwlkbyB7CisJCXMgPSAqc2NhbisrOworCQlzd2l0Y2ggKE9QKHMpKSB7CisJCWNhc2UgT0NIQVI6CQkvKiBzZXF1ZW5jZSBtZW1iZXIgKi8KKwkJCWlmIChuZXdsZW4gPT0gMCkJCS8qIG5ldyBzZXF1ZW5jZSAqLworCQkJCW5ld3N0YXJ0ID0gc2NhbiAtIDE7CisJCQluZXdsZW4rKzsKKwkJCWJyZWFrOworCQljYXNlIE9QTFVTXzoJCS8qIHRoaW5ncyB0aGF0IGRvbid0IGJyZWFrIG9uZSAqLworCQljYXNlIE9MUEFSRU46CisJCWNhc2UgT1JQQVJFTjoKKwkJCWJyZWFrOworCQljYXNlIE9RVUVTVF86CQkvKiB0aGluZ3MgdGhhdCBtdXN0IGJlIHNraXBwZWQgKi8KKwkJY2FzZSBPQ0hfOgorCQkJc2Nhbi0tOworCQkJZG8geworCQkJCXNjYW4gKz0gT1BORChzKTsKKwkJCQlzID0gKnNjYW47CisJCQkJLyogYXNzZXJ0KCkgaW50ZXJmZXJlcyB3IGRlYnVnIHByaW50b3V0cyAqLworCQkJCWlmIChPUChzKSAhPSBPX1FVRVNUICYmIE9QKHMpICE9IE9fQ0ggJiYKKwkJCQkJCQlPUChzKSAhPSBPT1IyKSB7CisJCQkJCWctPmlmbGFncyB8PSBCQUQ7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9IHdoaWxlIChPUChzKSAhPSBPX1FVRVNUICYmIE9QKHMpICE9IE9fQ0gpOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJZGVmYXVsdDoJCS8qIHRoaW5ncyB0aGF0IGJyZWFrIGEgc2VxdWVuY2UgKi8KKwkJCWlmIChuZXdsZW4gPiBnLT5tbGVuKSB7CQkvKiBlbmRzIG9uZSAqLworCQkJCXN0YXJ0ID0gbmV3c3RhcnQ7CisJCQkJZy0+bWxlbiA9IG5ld2xlbjsKKwkJCX0KKwkJCW5ld2xlbiA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKE9QKHMpICE9IE9FTkQpOworCisJaWYgKHN0YXJ0ID09IE5VTEwpCisJCWctPm1sZW4gPSAwOworCisJaWYgKGctPm1sZW4gPT0gMCkJLyogdGhlcmUgaXNuJ3Qgb25lICovCisJCXJldHVybjsKKworCS8qIHR1cm4gaXQgaW50byBhIGNoYXJhY3RlciBzdHJpbmcgKi8KKwlnLT5tdXN0ID0gbWFsbG9jKChzaXplX3QpZy0+bWxlbiArIDEpOworCWlmIChnLT5tdXN0ID09IE5VTEwpIHsJCS8qIGFyZ2g7IGp1c3QgZm9yZ2V0IGl0ICovCisJCWctPm1sZW4gPSAwOworCQlyZXR1cm47CisJfQorCWNwID0gZy0+bXVzdDsKKwlzY2FuID0gc3RhcnQ7CisJZm9yIChpID0gZy0+bWxlbjsgaSA+IDA7IGktLSkgeworCQl3aGlsZSAoT1AocyA9ICpzY2FuKyspICE9IE9DSEFSKQorCQkJY29udGludWU7CisJCWFzc2VydChjcCA8IGctPm11c3QgKyBnLT5tbGVuKTsKKwkJKmNwKysgPSAoY2hhcilPUE5EKHMpOworCX0KKwlhc3NlcnQoY3AgPT0gZy0+bXVzdCArIGctPm1sZW4pOworCSpjcCsrID0gJ1wwJzsJCS8qIGp1c3Qgb24gZ2VuZXJhbCBwcmluY2lwbGVzICovCit9CisKKy8qCisgLSBwbHVzY291bnQgLSBjb3VudCArIG5lc3RpbmcKKyA9PSBzdGF0aWMgc29wbm8gcGx1c2NvdW50KHN0cnVjdCBwYXJzZSAqcCwgc3RydWN0IHJlX2d1dHMgKmcpOworICovCitzdGF0aWMgc29wbm8JCQkvKiBuZXN0aW5nIGRlcHRoICovCitwbHVzY291bnQoCisgICAgc3RydWN0IHBhcnNlICpwLAorICAgIHN0cnVjdCByZV9ndXRzICpnKQoreworCXNvcCAqc2NhbjsKKwlzb3AgczsKKwlzb3BubyBwbHVzbmVzdCA9IDA7CisJc29wbm8gbWF4bmVzdCA9IDA7CisKKwlfRElBR0FTU0VSVChwICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGcgIT0gTlVMTCk7CisKKwlpZiAocC0+ZXJyb3IgIT0gMCkKKwkJcmV0dXJuKDApOwkvKiB0aGVyZSBtYXkgbm90IGJlIGFuIE9FTkQgKi8KKworCXNjYW4gPSBnLT5zdHJpcCArIDE7CisJZG8geworCQlzID0gKnNjYW4rKzsKKwkJc3dpdGNoIChPUChzKSkgeworCQljYXNlIE9QTFVTXzoKKwkJCXBsdXNuZXN0Kys7CisJCQlicmVhazsKKwkJY2FzZSBPX1BMVVM6CisJCQlpZiAocGx1c25lc3QgPiBtYXhuZXN0KQorCQkJCW1heG5lc3QgPSBwbHVzbmVzdDsKKwkJCXBsdXNuZXN0LS07CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKE9QKHMpICE9IE9FTkQpOworCWlmIChwbHVzbmVzdCAhPSAwKQorCQlnLT5pZmxhZ3MgfD0gQkFEOworCXJldHVybihtYXhuZXN0KTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2Vycm9yLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdlcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMGQ3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdlcnJvci5jCkBAIC0wLDAgKzEsMjIzIEBACisvKgkkTmV0QlNEOiByZWdlcnJvci5jLHYgMS4yMyAyMDA3LzAyLzA5IDIzOjQ0OjE4IGp1bnlvdW5nIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcmVnZXJyb3IuYwk4LjQgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQgSGVucnkgU3BlbmNlci4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJlZ2Vycm9yLmMJOC40IChCZXJrZWxleSkgMy8yMC85NAorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpcmVnZXJyb3IuYwk4LjQgKEJlcmtlbGV5KSAzLzIwLzk0IjsKKyNlbHNlCitfX1JDU0lEKCIkTmV0QlNEOiByZWdlcnJvci5jLHYgMS4yMyAyMDA3LzAyLzA5IDIzOjQ0OjE4IGp1bnlvdW5nIEV4cCAkIik7CisjZW5kaWYKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlICJuYW1lc3BhY2UuaCIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxyZWdleC5oPgorCisjaWZkZWYgX193ZWFrX2FsaWFzCitfX3dlYWtfYWxpYXMocmVnZXJyb3IsX3JlZ2Vycm9yKQorI2VuZGlmCisKKyNpbmNsdWRlICJ1dGlscy5oIgorCisvKiA9PT09PT09PT0gYmVnaW4gaGVhZGVyIGdlbmVyYXRlZCBieSAuL21raCA9PT09PT09PT0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogPT09IHJlZ2Vycm9yLmMgPT09ICovCitzdGF0aWMgY29uc3QgY2hhciAqcmVnYXRvaShjb25zdCByZWdleF90ICpwcmVnLCBjaGFyICpsb2NhbGJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisvKiA9PT09PT09PT0gZW5kIGhlYWRlciBnZW5lcmF0ZWQgYnkgLi9ta2ggPT09PT09PT09ICovCisvKgorID0gI2RlZmluZQlSRUdfTk9NQVRDSAkgMQorID0gI2RlZmluZQlSRUdfQkFEUEFUCSAyCisgPSAjZGVmaW5lCVJFR19FQ09MTEFURQkgMworID0gI2RlZmluZQlSRUdfRUNUWVBFCSA0CisgPSAjZGVmaW5lCVJFR19FRVNDQVBFCSA1CisgPSAjZGVmaW5lCVJFR19FU1VCUkVHCSA2CisgPSAjZGVmaW5lCVJFR19FQlJBQ0sJIDcKKyA9ICNkZWZpbmUJUkVHX0VQQVJFTgkgOAorID0gI2RlZmluZQlSRUdfRUJSQUNFCSA5CisgPSAjZGVmaW5lCVJFR19CQURCUgkxMAorID0gI2RlZmluZQlSRUdfRVJBTkdFCTExCisgPSAjZGVmaW5lCVJFR19FU1BBQ0UJMTIKKyA9ICNkZWZpbmUJUkVHX0JBRFJQVAkxMworID0gI2RlZmluZQlSRUdfRU1QVFkJMTQKKyA9ICNkZWZpbmUJUkVHX0FTU0VSVAkxNQorID0gI2RlZmluZQlSRUdfSU5WQVJHCTE2CisgPSAjZGVmaW5lCVJFR19BVE9JCTI1NQkvLyBjb252ZXJ0IG5hbWUgdG8gbnVtYmVyICghKQorID0gI2RlZmluZQlSRUdfSVRPQQkwNDAwCS8vIGNvbnZlcnQgbnVtYmVyIHRvIG5hbWUgKCEpCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVyciB7CisJaW50IGNvZGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpleHBsYWluOworfSByZXJyc1tdID0geworCXsgUkVHX05PTUFUQ0gsCSJSRUdfTk9NQVRDSCIsCSJyZWdleGVjKCkgZmFpbGVkIHRvIG1hdGNoIiB9LAorCXsgUkVHX0JBRFBBVCwJIlJFR19CQURQQVQiLAkiaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24iIH0sCisJeyBSRUdfRUNPTExBVEUsCSJSRUdfRUNPTExBVEUiLAkiaW52YWxpZCBjb2xsYXRpbmcgZWxlbWVudCIgfSwKKwl7IFJFR19FQ1RZUEUsCSJSRUdfRUNUWVBFIiwJImludmFsaWQgY2hhcmFjdGVyIGNsYXNzIiB9LAorCXsgUkVHX0VFU0NBUEUsCSJSRUdfRUVTQ0FQRSIsCSJ0cmFpbGluZyBiYWNrc2xhc2ggKFxcKSIgfSwKKwl7IFJFR19FU1VCUkVHLAkiUkVHX0VTVUJSRUciLAkiaW52YWxpZCBiYWNrcmVmZXJlbmNlIG51bWJlciIgfSwKKwl7IFJFR19FQlJBQ0ssCSJSRUdfRUJSQUNLIiwJImJyYWNrZXRzIChbIF0pIG5vdCBiYWxhbmNlZCIgfSwKKwl7IFJFR19FUEFSRU4sCSJSRUdfRVBBUkVOIiwJInBhcmVudGhlc2VzIG5vdCBiYWxhbmNlZCIgfSwKKwl7IFJFR19FQlJBQ0UsCSJSRUdfRUJSQUNFIiwJImJyYWNlcyBub3QgYmFsYW5jZWQiIH0sCisJeyBSRUdfQkFEQlIsCSJSRUdfQkFEQlIiLAkiaW52YWxpZCByZXBldGl0aW9uIGNvdW50KHMpIiB9LAorCXsgUkVHX0VSQU5HRSwJIlJFR19FUkFOR0UiLAkiaW52YWxpZCBjaGFyYWN0ZXIgcmFuZ2UiIH0sCisJeyBSRUdfRVNQQUNFLAkiUkVHX0VTUEFDRSIsCSJvdXQgb2YgbWVtb3J5IiB9LAorCXsgUkVHX0JBRFJQVCwJIlJFR19CQURSUFQiLAkicmVwZXRpdGlvbi1vcGVyYXRvciBvcGVyYW5kIGludmFsaWQiIH0sCisJeyBSRUdfRU1QVFksCSJSRUdfRU1QVFkiLAkiZW1wdHkgKHN1YilleHByZXNzaW9uIiB9LAorCXsgUkVHX0FTU0VSVCwJIlJFR19BU1NFUlQiLAkiXCJjYW4ndCBoYXBwZW5cIiAtLSB5b3UgZm91bmQgYSBidWciIH0sCisJeyBSRUdfSU5WQVJHLAkiUkVHX0lOVkFSRyIsCSJpbnZhbGlkIGFyZ3VtZW50IHRvIHJlZ2V4IHJvdXRpbmUiIH0sCisJeyAwLAkJIiIsCQkiKioqIHVua25vd24gcmVnZXhwIGVycm9yIGNvZGUgKioqIiB9Cit9OworCisvKgorICogcmVnZXJyb3IgLSB0aGUgaW50ZXJmYWNlIHRvIGVycm9yIG51bWJlcnMKKyAqIGV4dGVybiBzaXplX3QgcmVnZXJyb3IoaW50LCBjb25zdCByZWdleF90ICosIGNoYXIgKiwgc2l6ZV90KTsKKyAqLworLyogQVJHU1VTRUQgKi8KK3NpemVfdAorcmVnZXJyb3IoCisgICAgaW50IGVycmNvZGUsCisgICAgY29uc3QgcmVnZXhfdCAqcHJlZywKKyAgICBjaGFyICplcnJidWYsCisgICAgc2l6ZV90IGVycmJ1Zl9zaXplKQoreworCWNvbnN0IHN0cnVjdCByZXJyICpyOworCXNpemVfdCBsZW47CisJaW50IHRhcmdldCA9IGVycmNvZGUgJn4gUkVHX0lUT0E7CisJY29uc3QgY2hhciAqczsKKwljaGFyIGNvbnZidWZbNTBdOworCisJX0RJQUdBU1NFUlQoZXJyY29kZSAhPSBSRUdfQVRPSSB8fCBwcmVnICE9IE5VTEwpOworCV9ESUFHQVNTRVJUKGVycmJ1ZiAhPSBOVUxMKTsKKworCWlmIChlcnJjb2RlID09IFJFR19BVE9JKQorCQlzID0gcmVnYXRvaShwcmVnLCBjb252YnVmLCBzaXplb2YgY29udmJ1Zik7CisJZWxzZSB7CisJCWZvciAociA9IHJlcnJzOyByLT5jb2RlICE9IDA7IHIrKykKKwkJCWlmIChyLT5jb2RlID09IHRhcmdldCkKKwkJCQlicmVhazsKKwkKKwkJaWYgKGVycmNvZGUgJiBSRUdfSVRPQSkgeworCQkJaWYgKHItPmNvZGUgIT0gMCkgeworCQkJCSh2b2lkKXN0cmxjcHkoY29udmJ1Ziwgci0+bmFtZSwgc2l6ZW9mIGNvbnZidWYpOworCQkJfSBlbHNlCisJCQkJKHZvaWQpc25wcmludGYoY29udmJ1Ziwgc2l6ZW9mIGNvbnZidWYsCisJCQkJICAgICJSRUdfMHgleCIsIHRhcmdldCk7CisJCQlzID0gY29udmJ1ZjsKKwkJfSBlbHNlCisJCQlzID0gci0+ZXhwbGFpbjsKKwl9CisKKwlsZW4gPSBzdHJsZW4ocykgKyAxOworCWlmIChlcnJidWZfc2l6ZSA+IDApCisJCSh2b2lkKXN0cmxjcHkoZXJyYnVmLCBzLCBlcnJidWZfc2l6ZSk7CisKKwlyZXR1cm4obGVuKTsKK30KKworLyoKKyAqIHJlZ2F0b2kgLSBpbnRlcm5hbCByb3V0aW5lIHRvIGltcGxlbWVudCBSRUdfQVRPSQorICogc3RhdGljIGNvbnN0IGNoYXIgKnJlZ2F0b2koY29uc3QgcmVnZXhfdCAqcHJlZywgY2hhciAqbG9jYWxidWYsCisgKiBzaXplX3QgYnVmbGVuKTsKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcmVnYXRvaSgKKyAgICBjb25zdCByZWdleF90ICpwcmVnLAorICAgIGNoYXIgKmxvY2FsYnVmLAorICAgIHNpemVfdCBidWZsZW4pCit7CisJY29uc3Qgc3RydWN0IHJlcnIgKnI7CisKKwlmb3IgKHIgPSByZXJyczsgci0+Y29kZSAhPSAwOyByKyspCisJCWlmIChzdHJjbXAoci0+bmFtZSwgcHJlZy0+cmVfZW5kcCkgPT0gMCkKKwkJCWJyZWFrOworCWlmIChyLT5jb2RlID09IDApCisJCXJldHVybiAiMCI7CisKKwkodm9pZClzbnByaW50Zihsb2NhbGJ1ZiwgYnVmbGVuLCAiJWQiLCByLT5jb2RlKTsKKwlyZXR1cm4gbG9jYWxidWY7Cit9CmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdleDIuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2V4Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODc3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdleDIuaApAQCAtMCwwICsxLDIwOSBAQAorLyoJJE5ldEJTRDogcmVnZXgyLmgsdiAxLjEzIDIwMTEvMTAvMDkgMTg6MjM6MDAgY2hyaXN0b3MgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyZWdleDIuaAk4LjQgKEJlcmtlbGV5KSAzLzIwLzk0CisgKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQgSGVucnkgU3BlbmNlci4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXJlZ2V4Mi5oCTguNCAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKgorICogRmlyc3QsIHRoZSBzdHVmZiB0aGF0IGVuZHMgdXAgaW4gdGhlIG91dHNpZGUtd29ybGQgaW5jbHVkZSBmaWxlCisgPSB0eXBlZGVmIG9mZl90IHJlZ29mZl90OworID0gdHlwZWRlZiBzdHJ1Y3QgeworID0gCWludCByZV9tYWdpYzsKKyA9IAlzaXplX3QgcmVfbnN1YjsJCS8vIG51bWJlciBvZiBwYXJlbnRoZXNpemVkIHN1YmV4cHJlc3Npb25zCisgPSAJY29uc3QgY2hhciAqcmVfZW5kcDsJLy8gZW5kIHBvaW50ZXIgZm9yIFJFR19QRU5ECisgPSAJc3RydWN0IHJlX2d1dHMgKnJlX2c7CS8vIG5vbmUgb2YgeW91ciBidXNpbmVzcyA6LSkKKyA9IH0gcmVnZXhfdDsKKyA9IHR5cGVkZWYgc3RydWN0IHsKKyA9IAlyZWdvZmZfdCBybV9zbzsJCS8vIHN0YXJ0IG9mIG1hdGNoCisgPSAJcmVnb2ZmX3Qgcm1fZW87CQkvLyBlbmQgb2YgbWF0Y2gKKyA9IH0gcmVnbWF0Y2hfdDsKKyAqLworLyoKKyAqIGludGVybmFscyBvZiByZWdleF90CisgKi8KKyNkZWZpbmUJTUFHSUMxCSgoKCdyJ14wMjAwKTw8OCkgfCAnZScpCisKKy8qCisgKiBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgYSAqc3RyaXAqLCBhIHNlcXVlbmNlIG9mCisgKiBvcGVyYXRvcnMgZW5kaW5nIHdpdGggYW4gZW5kbWFya2VyLiAgKFNvbWUgdGVybWlub2xvZ3kgZXRjLiBpcyBhCisgKiBoaXN0b3JpY2FsIHJlbGljIG9mIGVhcmxpZXIgdmVyc2lvbnMgd2hpY2ggdXNlZCBtdWx0aXBsZSBzdHJpcHMuKQorICogQ2VydGFpbiBvZGRpdGllcyBpbiB0aGUgcmVwcmVzZW50YXRpb24gYXJlIHRoZXJlIHRvIHBlcm1pdCBydW5uaW5nCisgKiB0aGUgbWFjaGluZXJ5IGJhY2t3YXJkczsgaW4gcGFydGljdWxhciwgYW55IGRldmlhdGlvbiBmcm9tIHNlcXVlbnRpYWwKKyAqIGZsb3cgbXVzdCBiZSBtYXJrZWQgYXQgYm90aCBpdHMgc291cmNlIGFuZCBpdHMgZGVzdGluYXRpb24uICBTb21lCisgKiBmaW5lIHBvaW50czoKKyAqCisgKiAtIE9QTFVTXyBhbmQgT19QTFVTIGFyZSAqaW5zaWRlKiB0aGUgbG9vcCB0aGV5IGNyZWF0ZS4KKyAqIC0gT1FVRVNUXyBhbmQgT19RVUVTVCBhcmUgKm91dHNpZGUqIHRoZSBieXBhc3MgdGhleSBjcmVhdGUuCisgKiAtIE9DSF8gYW5kIE9fQ0ggYXJlICpvdXRzaWRlKiB0aGUgbXVsdGktd2F5IGJyYW5jaCB0aGV5IGNyZWF0ZSwgd2hpbGUKKyAqICAgT09SMSBhbmQgT09SMiBhcmUgcmVzcGVjdGl2ZWx5IHRoZSBlbmQgYW5kIHRoZSBiZWdpbm5pbmcgb2Ygb25lIG9mCisgKiAgIHRoZSBicmFuY2hlcy4gIE5vdGUgdGhhdCB0aGVyZSBpcyBhbiBpbXBsaWNpdCBPT1IyIGZvbGxvd2luZyBPQ0hfCisgKiAgIGFuZCBhbiBpbXBsaWNpdCBPT1IxIHByZWNlZGluZyBPX0NILgorICoKKyAqIEluIHN0YXRlIHJlcHJlc2VudGF0aW9ucywgYW4gb3BlcmF0b3IncyBiaXQgaXMgb24gdG8gc2lnbmlmeSBhIHN0YXRlCisgKiBpbW1lZGlhdGVseSAqcHJlY2VkaW5nKiAiZXhlY3V0aW9uIiBvZiB0aGF0IG9wZXJhdG9yLgorICovCit0eXBlZGVmIHVfaW50MzJfdCBzb3A7CS8qIHN0cmlwIG9wZXJhdG9yICovCit0eXBlZGVmIHNpemVfdCBzb3BubzsKKyNkZWZpbmUJT1BSTUFTSwkoKHVfaW50MzJfdCkweGY4MDAwMDAwVUwpCisjZGVmaW5lCU9QRE1BU0sJKCh1X2ludDMyX3QpMHgwN2ZmZmZmZlVMKQorI2RlZmluZQlPUFNISUZUCSgodW5zaWduZWQpMjcpCisjZGVmaW5lCU9QKG4pCSgobikmT1BSTUFTSykKKyNkZWZpbmUJT1BORChuKQkoKGludCkoKG4pJk9QRE1BU0spKQorI2RlZmluZQlTT1Aob3AsIG9wbmQpCSgob3ApfChvcG5kKSkKKworI2RlZmluZSBPUEMobikJKCgodV9pbnQzMl90KShuKSk8PE9QU0hJRlQpCisvKiBvcGVyYXRvcnMJCSAgIG1lYW5pbmcJb3BlcmFuZAkJCSovCisvKgkJCQkJKGJhY2ssIGZ3ZCBhcmUgb2Zmc2V0cykJKi8KKyNkZWZpbmUJT0VORAlPUEMoMSkJLyogZW5kbWFya2VyCS0JCQkqLworI2RlZmluZQlPQ0hBUglPUEMoMikJLyogY2hhcmFjdGVyCXVuc2lnbmVkIGNoYXIJCSovCisjZGVmaW5lCU9CT0wJT1BDKDMpCS8qIGxlZnQgYW5jaG9yCS0JCQkqLworI2RlZmluZQlPRU9MCU9QQyg0KQkvKiByaWdodCBhbmNob3IJLQkJCSovCisjZGVmaW5lCU9BTlkJT1BDKDUpCS8qIC4JCS0JCQkqLworI2RlZmluZQlPQU5ZT0YJT1BDKDYpCS8qIFsuLi5dCXNldCBudW1iZXIJCSovCisjZGVmaW5lCU9CQUNLXwlPUEMoNykJLyogYmVnaW4gXGQJcGFyZW4gbnVtYmVyCQkqLworI2RlZmluZQlPX0JBQ0sJT1BDKDgpCS8qIGVuZCBcZAlwYXJlbiBudW1iZXIJCSovCisjZGVmaW5lCU9QTFVTXwlPUEMoOSkJLyogKyBwcmVmaXgJZndkIHRvIHN1ZmZpeAkJKi8KKyNkZWZpbmUJT19QTFVTCU9QQygxMCkJLyogKyBzdWZmaXgJYmFjayB0byBwcmVmaXgJCSovCisjZGVmaW5lCU9RVUVTVF8JT1BDKDExKQkvKiA/IHByZWZpeAlmd2QgdG8gc3VmZml4CQkqLworI2RlZmluZQlPX1FVRVNUCU9QQygxMikJLyogPyBzdWZmaXgJYmFjayB0byBwcmVmaXgJCSovCisjZGVmaW5lCU9MUEFSRU4JT1BDKDEzKQkvKiAoCQlmd2QgdG8gKQkJKi8KKyNkZWZpbmUJT1JQQVJFTglPUEMoMTQpCS8qICkJCWJhY2sgdG8gKAkJKi8KKyNkZWZpbmUJT0NIXwlPUEMoMTUpCS8qIGJlZ2luIGNob2ljZQlmd2QgdG8gT09SMgkJKi8KKyNkZWZpbmUJT09SMQlPUEMoMTYpCS8qIHwgcHQuIDEJYmFjayB0byBPT1IxIG9yIE9DSF8JKi8KKyNkZWZpbmUJT09SMglPUEMoMTcpCS8qIHwgcHQuIDIJZndkIHRvIE9PUjIgb3IgT19DSAkqLworI2RlZmluZQlPX0NICU9QQygxOCkJLyogZW5kIGNob2ljZQliYWNrIHRvIE9PUjEJCSovCisjZGVmaW5lCU9CT1cJT1BDKDE5KQkvKiBiZWdpbiB3b3JkCS0JCQkqLworI2RlZmluZQlPRU9XCU9QQygyMCkJLyogZW5kIHdvcmQJLQkJCSovCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIFtdIGNoYXJhY3Rlci1zZXQgcmVwcmVzZW50YXRpb24uICBDaGFyYWN0ZXIgc2V0cyBhcmUKKyAqIGRvbmUgYXMgYml0IHZlY3RvcnMsIGdyb3VwZWQgOCB0byBhIGJ5dGUgdmVjdG9yIGZvciBjb21wYWN0bmVzcy4KKyAqIFRoZSBpbmRpdmlkdWFsIHNldCB0aGVyZWZvcmUgaGFzIGJvdGggYSBwb2ludGVyIHRvIHRoZSBieXRlIHZlY3RvcgorICogYW5kIGEgbWFzayB0byBwaWNrIG91dCB0aGUgcmVsZXZhbnQgYml0IG9mIGVhY2ggYnl0ZS4gIEEgaGFzaCBjb2RlCisgKiBzaW1wbGlmaWVzIHRlc3Rpbmcgd2hldGhlciB0d28gc2V0cyBjb3VsZCBiZSBpZGVudGljYWwuCisgKgorICogVGhpcyB3aWxsIGdldCB0cmlja2llciBmb3IgbXVsdGljaGFyYWN0ZXIgY29sbGF0aW5nIGVsZW1lbnRzLiAgQXMKKyAqIHByZWxpbWluYXJ5IGhvb2tzIGZvciBkZWFsaW5nIHdpdGggc3VjaCB0aGluZ3MsIHdlIGFsc28gY2FycnkgYWxvbmcKKyAqIGEgc3RyaW5nIG9mIG11bHRpLWNoYXJhY3RlciBlbGVtZW50cywgYW5kIGRlY2lkZSB0aGUgc2l6ZSBvZiB0aGUKKyAqIHZlY3RvcnMgYXQgcnVuIHRpbWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1Y2ggKnB0cjsJCS8qIC0+IHVjaCBbY3NldHNpemVdICovCisJdWNoIG1hc2s7CQkvKiBiaXQgd2l0aGluIGFycmF5ICovCisJdWNoIGhhc2g7CQkvKiBoYXNoIGNvZGUgKi8KKwlzaXplX3Qgc211bHRpczsKKwljaGFyICptdWx0aXM7CQkvKiAtPiBjaGFyW3NtdWx0aV0gIGFiXDBjZFwwZWZcMFwwICovCit9IGNzZXQ7CisvKiBub3RlIHRoYXQgQ0hhZGQgYW5kIENIc3ViIGFyZSB1bnNhZmUsIGFuZCBDSElOIGRvZXNuJ3QgeWllbGQgMC8xICovCisjZGVmaW5lCUNIYWRkKGNzLCBjKQkoKGNzKS0+cHRyWyh1Y2gpKGMpXSB8PSAoY3MpLT5tYXNrLCAoY3MpLT5oYXNoICs9IChjKSkKKyNkZWZpbmUJQ0hzdWIoY3MsIGMpCSgoY3MpLT5wdHJbKHVjaCkoYyldICY9IH4oY3MpLT5tYXNrLCAoY3MpLT5oYXNoIC09IChjKSkKKyNkZWZpbmUJQ0hJTihjcywgYykJKChjcyktPnB0clsodWNoKShjKV0gJiAoY3MpLT5tYXNrKQorI2RlZmluZQlNQ2FkZChwLCBjcywgY3ApCW1jYWRkKHAsIGNzLCBjcCkJLyogcmVnY29tcCgpIGludGVybmFsIGZucyAqLworI2RlZmluZQlNQ3N1YihwLCBjcywgY3ApCW1jc3ViKHAsIGNzLCBjcCkKKyNkZWZpbmUJTUNpbihwLCBjcywgY3ApCW1jaW4ocCwgY3MsIGNwKQorCisvKiBzdHVmZiBmb3IgY2hhcmFjdGVyIGNhdGVnb3JpZXMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBjYXRfdDsKKworLyoKKyAqIG1haW4gY29tcGlsZWQtZXhwcmVzc2lvbiBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IHJlX2d1dHMgeworCWludCBtYWdpYzsKKyMJCWRlZmluZQlNQUdJQzIJKCgoJ1InXjAyMDApPDw4KXwnRScpCisJc29wICpzdHJpcDsJCS8qIG1hbGxvY2VkIGFyZWEgZm9yIHN0cmlwICovCisJc2l6ZV90IGNzZXRzaXplOwkvKiBudW1iZXIgb2YgYml0cyBpbiBhIGNzZXQgdmVjdG9yICovCisJc2l6ZV90IG5jc2V0czsJCS8qIG51bWJlciBvZiBjc2V0cyBpbiB1c2UgKi8KKwljc2V0ICpzZXRzOwkJLyogLT4gY3NldCBbbmNzZXRzXSAqLworCXVjaCAqc2V0Yml0czsJCS8qIC0+IHVjaFtjc2V0c2l6ZV1bbmNzZXRzL0NIQVJfQklUXSAqLworCWludCBjZmxhZ3M7CQkvKiBjb3B5IG9mIHJlZ2NvbXAoKSBjZmxhZ3MgYXJndW1lbnQgKi8KKwlzb3BubyBuc3RhdGVzOwkJLyogPSBudW1iZXIgb2Ygc29wcyAqLworCXNvcG5vIGZpcnN0c3RhdGU7CS8qIHRoZSBpbml0aWFsIE9FTkQgKG5vcm1hbGx5IDApICovCisJc29wbm8gbGFzdHN0YXRlOwkvKiB0aGUgZmluYWwgT0VORCAqLworCWludCBpZmxhZ3M7CQkvKiBpbnRlcm5hbCBmbGFncyAqLworIwkJZGVmaW5lCVVTRUJPTAkwMQkvKiB1c2VkIF4gKi8KKyMJCWRlZmluZQlVU0VFT0wJMDIJLyogdXNlZCAkICovCisjCQlkZWZpbmUJQkFECTA0CS8qIHNvbWV0aGluZyB3cm9uZyAqLworCXNpemVfdCBuYm9sOwkJLyogbnVtYmVyIG9mIF4gdXNlZCAqLworCXNpemVfdCBuZW9sOwkJLyogbnVtYmVyIG9mICQgdXNlZCAqLworCXNpemVfdCBuY2F0ZWdvcmllczsJLyogaG93IG1hbnkgY2hhcmFjdGVyIGNhdGVnb3JpZXMgKi8KKwljYXRfdCAqY2F0ZWdvcmllczsJLyogLT5jYXRzcGFjZVstQ0hBUl9NSU5dICovCisJY2hhciAqbXVzdDsJCS8qIG1hdGNoIG11c3QgY29udGFpbiB0aGlzIHN0cmluZyAqLworCXNpemVfdCBtbGVuOwkJLyogbGVuZ3RoIG9mIG11c3QgKi8KKwlzaXplX3QgbnN1YjsJCS8qIGNvcHkgb2YgcmVfbnN1YiAqLworCWludCBiYWNrcmVmczsJCS8qIGRvZXMgaXQgdXNlIGJhY2sgcmVmZXJlbmNlcz8gKi8KKwlzb3BubyBucGx1czsJCS8qIGhvdyBkZWVwIGRvZXMgaXQgbmVzdCArcz8gKi8KKwkvKiBjYXRzcGFjZSBtdXN0IGJlIGxhc3QgKi8KKwljYXRfdCBjYXRzcGFjZVsxXTsJLyogYWN0dWFsbHkgW05DXSAqLworfTsKKworLyogbWlzYyB1dGlsaXRpZXMgKi8KKyNkZWZpbmUJT1VUCShDSEFSX01BWCsxKQkvKiBhIG5vbi1jaGFyYWN0ZXIgdmFsdWUgKi8KKyNkZWZpbmUJSVNXT1JEKGMpCShpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKWMpIHx8IChjKSA9PSAnXycpCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdleGVjLmMgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3JlZ2V4LXdpbjMyL3NyYy9yZWdleGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2ZTBiNgotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2V4ZWMuYwpAQCAtMCwwICsxLDIzNCBAQAorLyoJJE5ldEJTRDogcmVnZXhlYy5jLHYgMS4yMiAyMDEyLzAzLzEzIDIxOjEzOjQzIGNocmlzdG9zIEV4cCAkCSovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcmVnZXhlYy5jCTguMyAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCBIZW5yeSBTcGVuY2VyLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcmVnZXhlYy5jCTguMyAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCisjaWYgMAorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXJlZ2V4ZWMuYwk4LjMgKEJlcmtlbGV5KSAzLzIwLzk0IjsKKyNlbHNlCitfX1JDU0lEKCIkTmV0QlNEOiByZWdleGVjLmMsdiAxLjIyIDIwMTIvMDMvMTMgMjE6MTM6NDMgY2hyaXN0b3MgRXhwICQiKTsKKyNlbmRpZgorI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworLyoKKyAqIHRoZSBvdXRlciBzaGVsbCBvZiByZWdleGVjKCkKKyAqCisgKiBUaGlzIGZpbGUgaW5jbHVkZXMgZW5naW5lLmMgKnR3aWNlKiwgYWZ0ZXIgbXVjaG9zIGZpZGRsaW5nIHdpdGggdGhlCisgKiBtYWNyb3MgdGhhdCBjb2RlIHVzZXMuICBUaGlzIGxldHMgdGhlIHNhbWUgY29kZSBvcGVyYXRlIG9uIHR3byBkaWZmZXJlbnQKKyAqIHJlcHJlc2VudGF0aW9ucyBmb3Igc3RhdGUgc2V0cy4KKyAqLworI2luY2x1ZGUgIm5hbWVzcGFjZS5oIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKyNpZmRlZiBfX3dlYWtfYWxpYXMKK19fd2Vha19hbGlhcyhyZWdleGVjLF9yZWdleGVjKQorI2VuZGlmCisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInJlZ2V4Mi5oIgorCisvKiBtYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBzdGF0ZXMsIHNtYWxsIHZlcnNpb24gKi8KKyNkZWZpbmUJc3RhdGVzCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUJc3RhdGVzMQl1bnNpZ25lZCBsb25nCS8qIGZvciBsYXRlciB1c2UgaW4gcmVnZXhlYygpIGRlY2lzaW9uICovCisjZGVmaW5lCUNMRUFSKHYpCSgodikgPSAwKQorI2RlZmluZQlTRVQwKHYsIG4pCSgodikgJj0gfigodW5zaWduZWQgbG9uZykxIDw8IChuKSkpCisjZGVmaW5lCVNFVDEodiwgbikJKCh2KSB8PSAodW5zaWduZWQgbG9uZykxIDw8IChuKSkKKyNkZWZpbmUJSVNTRVQodiwgbikJKCgodikgJiAoKHVuc2lnbmVkIGxvbmcpMSA8PCAobikpKSAhPSAwKQorI2RlZmluZQlBU1NJR04oZCwgcykJKChkKSA9IChzKSkKKyNkZWZpbmUJRVEoYSwgYikJKChhKSA9PSAoYikpCisjZGVmaW5lCVNUQVRFVkFSUwlpbnQgZHVtbXkJLyogZHVtbXkgdmVyc2lvbiAqLworI2RlZmluZQlTVEFURVNFVFVQKG0sIG4pCS8qIG5vdGhpbmcgKi8KKyNkZWZpbmUJU1RBVEVURUFSRE9XTihtKQkvKiBub3RoaW5nICovCisjZGVmaW5lCVNFVFVQKHYpCSgodikgPSAwKQorI2RlZmluZQlvbmVzdGF0ZQl1bnNpZ25lZCBsb25nCisjZGVmaW5lCUlOSVQobywgbikJKChvKSA9ICh1bnNpZ25lZCBsb25nKTEgPDwgKG4pKQorI2RlZmluZQlJTkMobykJKChvKSA8PD0gMSkKKyNkZWZpbmUJSVNTVEFURUlOKHYsIG8pCSgoKHYpICYgKG8pKSAhPSAwKQorLyogc29tZSBhYmJyZXZpYXRpb25zOyBub3RlIHRoYXQgc29tZSBvZiB0aGVzZSBrbm93IHZhcmlhYmxlIG5hbWVzISAqLworLyogZG8gImlmIEknbSBoZXJlLCBJIGNhbiBhbHNvIGJlIHRoZXJlIiBldGMgd2l0aG91dCBicmFuY2hlcyAqLworI2RlZmluZQlGV0QoZHN0LCBzcmMsIG4pCSgoZHN0KSB8PSAoKHVuc2lnbmVkIGxvbmcpKHNyYykmKGhlcmUpKSA8PCAobikpCisjZGVmaW5lCUJBQ0soZHN0LCBzcmMsIG4pCSgoZHN0KSB8PSAoKHVuc2lnbmVkIGxvbmcpKHNyYykmKGhlcmUpKSA+PiAobikpCisjZGVmaW5lCUlTU0VUQkFDSyh2LCBuKQkoKCh2KSAmICgodW5zaWduZWQgbG9uZyloZXJlID4+IChuKSkpICE9IDApCisvKiBmdW5jdGlvbiBuYW1lcyAqLworI2RlZmluZSBTTkFNRVMJCQkvKiBlbmdpbmUuYyBsb29rcyBhZnRlciBkZXRhaWxzICovCisKKyNpbmNsdWRlICJlbmdpbmUuYyIKKworLyogbm93IHVuZG8gdGhpbmdzICovCisjdW5kZWYJc3RhdGVzCisjdW5kZWYJQ0xFQVIKKyN1bmRlZglTRVQwCisjdW5kZWYJU0VUMQorI3VuZGVmCUlTU0VUCisjdW5kZWYJQVNTSUdOCisjdW5kZWYJRVEKKyN1bmRlZglTVEFURVZBUlMKKyN1bmRlZglTVEFURVNFVFVQCisjdW5kZWYJU1RBVEVURUFSRE9XTgorI3VuZGVmCVNFVFVQCisjdW5kZWYJb25lc3RhdGUKKyN1bmRlZglJTklUCisjdW5kZWYJSU5DCisjdW5kZWYJSVNTVEFURUlOCisjdW5kZWYJRldECisjdW5kZWYJQkFDSworI3VuZGVmCUlTU0VUQkFDSworI3VuZGVmCVNOQU1FUworCisvKiBtYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBzdGF0ZXMsIGxhcmdlIHZlcnNpb24gKi8KKyNkZWZpbmUJc3RhdGVzCWNoYXIgKgorI2RlZmluZQlDTEVBUih2KQltZW1zZXQodiwgMCwgKHNpemVfdCltLT5nLT5uc3RhdGVzKQorI2RlZmluZQlTRVQwKHYsIG4pCSgodilbbl0gPSAwKQorI2RlZmluZQlTRVQxKHYsIG4pCSgodilbbl0gPSAxKQorI2RlZmluZQlJU1NFVCh2LCBuKQkoKHYpW25dKQorI2RlZmluZQlBU1NJR04oZCwgcykJbWVtY3B5KGQsIHMsIChzaXplX3QpbS0+Zy0+bnN0YXRlcykKKyNkZWZpbmUJRVEoYSwgYikJKG1lbWNtcChhLCBiLCAoc2l6ZV90KW0tPmctPm5zdGF0ZXMpID09IDApCisjZGVmaW5lCVNUQVRFVkFSUwlpbnQgdm47IGNoYXIgKnNwYWNlCisjZGVmaW5lCVNUQVRFU0VUVVAobSwgbnYpIFwKKyAgICBpZiAoKChtKS0+c3BhY2UgPSBtYWxsb2MoKHNpemVfdCkoKG52KSoobSktPmctPm5zdGF0ZXMpKSkgPT0gTlVMTCkgXAorCXJldHVybihSRUdfRVNQQUNFKTsgXAorICAgIGVsc2UgXAorCShtKS0+dm4gPSAwCisKKyNkZWZpbmUJU1RBVEVURUFSRE9XTihtKQl7IGZyZWUoKG0pLT5zcGFjZSk7IG0tPnNwYWNlID0gTlVMTDsgfQorI2RlZmluZQlTRVRVUCh2KQkoKHYpID0gJm0tPnNwYWNlWyhzaXplX3QpKG0tPnZuKysgKiBtLT5nLT5uc3RhdGVzKV0pCisjZGVmaW5lCW9uZXN0YXRlCWludAorI2RlZmluZQlJTklUKG8sIG4pCSgobykgPSAoaW50KShuKSkKKyNkZWZpbmUJSU5DKG8pCSgobykrKykKKyNkZWZpbmUJSVNTVEFURUlOKHYsIG8pCSgodilbb10pCisvKiBzb21lIGFiYnJldmlhdGlvbnM7IG5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIGtub3cgdmFyaWFibGUgbmFtZXMhICovCisvKiBkbyAiaWYgSSdtIGhlcmUsIEkgY2FuIGFsc28gYmUgdGhlcmUiIGV0YyB3aXRob3V0IGJyYW5jaGVzICovCisjZGVmaW5lCUZXRChkc3QsIHNyYywgbikJKChkc3QpW2hlcmUrKG4pXSB8PSAoc3JjKVtoZXJlXSkKKyNkZWZpbmUJQkFDSyhkc3QsIHNyYywgbikJKChkc3QpW2hlcmUtKG4pXSB8PSAoc3JjKVtoZXJlXSkKKyNkZWZpbmUJSVNTRVRCQUNLKHYsIG4pCSgodilbaGVyZSAtIChuKV0pCisvKiBmdW5jdGlvbiBuYW1lcyAqLworI2RlZmluZQlMTkFNRVMJCQkvKiBmbGFnICovCisKKyNpbmNsdWRlICJlbmdpbmUuYyIKKworLyoKKyAtIHJlZ2V4ZWMgLSBpbnRlcmZhY2UgZm9yIG1hdGNoaW5nCisgPSBleHRlcm4gaW50IHJlZ2V4ZWMoY29uc3QgcmVnZXhfdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgXAorID0JCQkJCXJlZ21hdGNoX3QgW10sIGludCk7CisgPSAjZGVmaW5lCVJFR19OT1RCT0wJMDAwMDEKKyA9ICNkZWZpbmUJUkVHX05PVEVPTAkwMDAwMgorID0gI2RlZmluZQlSRUdfU1RBUlRFTkQJMDAwMDQKKyA9ICNkZWZpbmUJUkVHX1RSQUNFCTAwNDAwCS8vIHRyYWNpbmcgb2YgZXhlY3V0aW9uCisgPSAjZGVmaW5lCVJFR19MQVJHRQkwMTAwMAkvLyBmb3JjZSBsYXJnZSByZXByZXNlbnRhdGlvbgorID0gI2RlZmluZQlSRUdfQkFDS1IJMDIwMDAJLy8gZm9yY2UgdXNlIG9mIGJhY2tyZWYgY29kZQorICoKKyAqIFdlIHB1dCB0aGlzIGhlcmUgc28gd2UgY2FuIGV4cGxvaXQga25vd2xlZGdlIG9mIHRoZSBzdGF0ZSByZXByZXNlbnRhdGlvbgorICogd2hlbiBjaG9vc2luZyB3aGljaCBtYXRjaGVyIHRvIGNhbGwuICBBbHNvLCBieSB0aGlzIHBvaW50IHRoZSBtYXRjaGVycworICogaGF2ZSBiZWVuIHByb3RvdHlwZWQuCisgKi8KK2ludAkJCQkvKiAwIHN1Y2Nlc3MsIFJFR19OT01BVENIIGZhaWx1cmUgKi8KK3JlZ2V4ZWMoCisgICAgY29uc3QgcmVnZXhfdCAqcHJlZywKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgc2l6ZV90IG5tYXRjaCwKKyAgICByZWdtYXRjaF90IHBtYXRjaFtdLAorICAgIGludCBlZmxhZ3MpCit7CisJc3RydWN0IHJlX2d1dHMgKmcgPSBwcmVnLT5yZV9nOworCWNoYXIgKnM7CisjaWZkZWYgUkVERUJVRworIwlkZWZpbmUJR09PREZMQUdTKGYpCShmKQorI2Vsc2UKKyMJZGVmaW5lCUdPT0RGTEFHUyhmKQkoKGYpJihSRUdfTk9UQk9MfFJFR19OT1RFT0x8UkVHX1NUQVJURU5EKSkKKyNlbmRpZgorCisJX0RJQUdBU1NFUlQocHJlZyAhPSBOVUxMKTsKKwlfRElBR0FTU0VSVChzdHJpbmcgIT0gTlVMTCk7CisKKwlpZiAocHJlZy0+cmVfbWFnaWMgIT0gTUFHSUMxIHx8IGctPm1hZ2ljICE9IE1BR0lDMikKKwkJcmV0dXJuKFJFR19CQURQQVQpOworCWFzc2VydCghKGctPmlmbGFncyZCQUQpKTsKKwlpZiAoZy0+aWZsYWdzJkJBRCkJCS8qIGJhY2tzdG9wIGZvciBuby1kZWJ1ZyBjYXNlICovCisJCXJldHVybihSRUdfQkFEUEFUKTsKKwllZmxhZ3MgPSBHT09ERkxBR1MoZWZsYWdzKTsKKworCXMgPSBfX1VOQ09OU1Qoc3RyaW5nKTsKKworCWlmIChnLT5uc3RhdGVzIDw9IChzb3BubykoQ0hBUl9CSVQqc2l6ZW9mKHN0YXRlczEpKSAmJiAhKGVmbGFncyZSRUdfTEFSR0UpKQorCQlyZXR1cm4oc21hdGNoZXIoZywgcywgbm1hdGNoLCBwbWF0Y2gsIGVmbGFncykpOworCWVsc2UKKwkJcmV0dXJuKGxtYXRjaGVyKGcsIHMsIG5tYXRjaCwgcG1hdGNoLCBlZmxhZ3MpKTsKK30KZGlmZiAtLWdpdCBhL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2ZyZWUuYyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3JlZ2ZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTAxMWVhCi0tLSAvZGV2L251bGwKKysrIGIvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvcmVnZnJlZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgkkTmV0QlNEOiByZWdmcmVlLmMsdiAxLjE1IDIwMDcvMDIvMDkgMjM6NDQ6MTgganVueW91bmcgRXhwICQJKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEhlbnJ5IFNwZW5jZXIuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyZWdmcmVlLmMJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSGVucnkgU3BlbmNlci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylyZWdmcmVlLmMJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKKyNpZiAwCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpcmVnZnJlZS5jCTguMyAoQmVya2VsZXkpIDMvMjAvOTQiOworI2Vsc2UKK19fUkNTSUQoIiROZXRCU0Q6IHJlZ2ZyZWUuYyx2IDEuMTUgMjAwNy8wMi8wOSAyMzo0NDoxOCBqdW55b3VuZyBFeHAgJCIpOworI2VuZGlmCisjZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLworCisjaW5jbHVkZSAibmFtZXNwYWNlLmgiCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisKKyNpZmRlZiBfX3dlYWtfYWxpYXMKK19fd2Vha19hbGlhcyhyZWdmcmVlLF9yZWdmcmVlKQorI2VuZGlmCisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInJlZ2V4Mi5oIgorCisvKgorIC0gcmVnZnJlZSAtIGZyZWUgZXZlcnl0aGluZworID0gZXh0ZXJuIHZvaWQgcmVnZnJlZShyZWdleF90ICopOworICovCit2b2lkCityZWdmcmVlKAorICAgIHJlZ2V4X3QgKnByZWcpCit7CisJc3RydWN0IHJlX2d1dHMgKmc7CisKKwlfRElBR0FTU0VSVChwcmVnICE9IE5VTEwpOworCisJX0RJQUdBU1NFUlQocHJlZy0+cmVfbWFnaWMgPT0gTUFHSUMxKTsKKwlpZiAocHJlZy0+cmVfbWFnaWMgIT0gTUFHSUMxKQkvKiBvb3BzICovCisJCXJldHVybjsJCQkvKiBuaWNlIHRvIGNvbXBsYWluLCBidXQgaGFyZCAqLworCisJZyA9IHByZWctPnJlX2c7CisJaWYgKGcgPT0gTlVMTCB8fCBnLT5tYWdpYyAhPSBNQUdJQzIpCS8qIG9vcHMgYWdhaW4gKi8KKwkJcmV0dXJuOworCXByZWctPnJlX21hZ2ljID0gMDsJCS8qIG1hcmsgaXQgaW52YWxpZCAqLworCWctPm1hZ2ljID0gMDsJCQkvKiBtYXJrIGl0IGludmFsaWQgKi8KKworCWlmIChnLT5zdHJpcCAhPSBOVUxMKQorCQlmcmVlKGctPnN0cmlwKTsKKwlpZiAoZy0+c2V0cyAhPSBOVUxMKQorCQlmcmVlKGctPnNldHMpOworCWlmIChnLT5zZXRiaXRzICE9IE5VTEwpCisJCWZyZWUoZy0+c2V0Yml0cyk7CisJaWYgKGctPm11c3QgIT0gTlVMTCkKKwkJZnJlZShnLT5tdXN0KTsKKwlmcmVlKGcpOworfQpkaWZmIC0tZ2l0IGEvYW5kcm9pZC90aGlyZF9wYXJ0eS9yZWdleC13aW4zMi9zcmMvdXRpbHMuaCBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyY2FlZQotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvcmVnZXgtd2luMzIvc3JjL3V0aWxzLmgKQEAgLTAsMCArMSw5MSBAQAorLyoJJE5ldEJTRDogdXRpbHMuaCx2IDEuNiAyMDAzLzA4LzA3IDE2OjQzOjIxIGFnYyBFeHAgJAkqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSGVucnkgU3BlbmNlci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICoJQCgjKXV0aWxzLmgJOC4zIChCZXJrZWxleSkgMy8yMC85NAorICovCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0IEhlbnJ5IFNwZW5jZXIuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogSGVucnkgU3BlbmNlci4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyl1dGlscy5oCTguMyAoQmVya2VsZXkpIDMvMjAvOTQKKyAqLworCisvKiB1dGlsaXR5IGRlZmluaXRpb25zICovCisjZGVmaW5lCURVUE1BWAkJX1BPU0lYMl9SRV9EVVBfTUFYCS8qIHh4eCBpcyB0aGlzIHJpZ2h0PyAqLworI2RlZmluZQlJTkZJTklUWQkoRFVQTUFYICsgMSkKKyNkZWZpbmUJTkMJCShDSEFSX01BWCAtIENIQVJfTUlOICsgMSkKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2g7CisKKy8qIHN3aXRjaCBvZmYgYXNzZXJ0aW9ucyAoaWYgbm90IGFscmVhZHkgb2ZmKSBpZiBubyBSRURFQlVHICovCisjaWZuZGVmIFJFREVCVUcKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lCU5ERUJVRwkvKiBubyBhc3NlcnRpb25zIHBsZWFzZSAqLworI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogZm9yIG9sZCBzeXN0ZW1zIHdpdGggYmNvcHkoKSBidXQgbm8gbWVtbW92ZSgpICovCisjaWZkZWYgVVNFQkNPUFkKKyNkZWZpbmUJbWVtbW92ZShkLCBzLCBjKQliY29weShzLCBkLCBjKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hbmRyb2lkL3RoaXJkX3BhcnR5L3psaWIubWsgYi9hbmRyb2lkL3RoaXJkX3BhcnR5L3psaWIubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIxOTYxYwotLS0gL2Rldi9udWxsCisrKyBiL2FuZHJvaWQvdGhpcmRfcGFydHkvemxpYi5tawpAQCAtMCwwICsxLDUgQEAKKyQoY2FsbCBkZWZpbmUtZW11bGF0b3ItcHJlYnVpbHQtbGlicmFyeSxcCisgICAgZW11bGF0b3ItemxpYixcCisgICAgJChaTElCX1BSRUJVSUxUU19ESVIpLyQoQlVJTERfVEFSR0VUX1RBRykvbGliL2xpYnouYSkKKworWkxJQl9JTkNMVURFUyA6PSAkKFpMSUJfUFJFQlVJTFRTX0RJUikvJChCVUlMRF9UQVJHRVRfT1MpLXg4Nl82NC9pbmNsdWRlCmRpZmYgLS1naXQgYS9idWlsZC5ncmFkbGUgYi9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhYTQxNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDIzNiBAQAorYXBwbHkgcGx1Z2luOiAnc2RrLWZpbGVzJworCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMuaW50ZXJuYWwuZW11bGF0b3IuQnVpbGRFbXVsYXRvcgorCisvLyBHZXQgU0RLIHJldmlzaW9uIHRvIGRlZmluZSBlbXVsYXRvciByZXZpc2lvbgorRmlsZSBmcHJvcHMgPSBuZXcgRmlsZShyb290RGlyLmdldFBhcmVudEZpbGUoKSwgJ2V4dGVybmFsL3FlbXUvc291cmNlLnByb3BlcnRpZXMnKQorUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCkKK3Byb3BzLmxvYWQoZnByb3BzLm5ld0RhdGFJbnB1dFN0cmVhbSgpKQorCit0YXNrIGJ1aWxkRGVmYXVsdEVtdWxhdG9yKHR5cGU6IEJ1aWxkRW11bGF0b3IpIHsKKyAgICByZXZpc2lvbiA9IHByb3BzLiJQa2cuUmV2aXNpb24iCisgICAgYnVpbGRfbnVtYmVyID0gU3lzdGVtLmdldGVudigiQlVJTERfTlVNQkVSIikKKyAgICBvdXRwdXQgPSBuZXcgRmlsZShwcm9qZWN0LmJ1aWxkRGlyLCAiZGVmYXVsdCIpCit9CisKK3Rhc2sgYnVpbGRXaW5kb3dzRW11bGF0b3IodHlwZTogQnVpbGRFbXVsYXRvcikgeworICAgIHJldmlzaW9uID0gcHJvcHMuIlBrZy5SZXZpc2lvbiIKKyAgICBidWlsZF9udW1iZXIgPSBTeXN0ZW0uZ2V0ZW52KCJCVUlMRF9OVU1CRVIiKQorICAgIG91dHB1dCA9IG5ldyBGaWxlKHByb2plY3QuYnVpbGREaXIsICJ3aW5kb3dzIikKKyAgICB3aW5kb3dzID0gdHJ1ZQorfQorCitzZGsgeworICAgIGNvbW1vbihtYWMsIGxpbnV4KSB7CisgICAgICAgIGl0ZW0oZnByb3BzKSB7CisgICAgICAgICAgICBub3RpY2UgbnVsbAorICAgICAgICB9CisgICAgICAgIGl0ZW0oJ2FuZHJvaWQvYW5kcm9pZC1lbXUvYW5kcm9pZC9hdmQvaGFyZHdhcmUtcHJvcGVydGllcy5pbmknKSB7CisgICAgICAgICAgICBpbnRvICdsaWInCisgICAgICAgICAgICBub3RpY2UgbnVsbAorICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvZW11bGF0b3IiKSB7CisgICAgICAgICAgICBleGVjdXRhYmxlIHRydWUKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGREZWZhdWx0RW11bGF0b3IKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGREZWZhdWx0RW11bGF0b3Iub3V0cHV0L2VtdWxhdG9yLWNoZWNrIikgeworICAgICAgICAgICAgZXhlY3V0YWJsZSB0cnVlCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkRGVmYXVsdEVtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkRGVmYXVsdEVtdWxhdG9yLm91dHB1dC9iaW42NCIpIHsKKyAgICAgICAgICAgIGludG8gJ2JpbjY0JworICAgICAgICAgICAgYnVpbHRCeSBidWlsZERlZmF1bHRFbXVsYXRvcgorICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvcWVtdSIpIHsKKyAgICAgICAgICAgIGludG8gJ3FlbXUnCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkRGVmYXVsdEVtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkRGVmYXVsdEVtdWxhdG9yLm91dHB1dC9idWlsZC9kZWJ1Z19pbmZvL3FlbXUiKSB7CisgICAgICAgICAgICBpbnRvICdxZW11JworICAgICAgICAgICAgYnVpbHRCeSBidWlsZERlZmF1bHRFbXVsYXRvcgorICAgICAgICAgICAgZGVidWcgdHJ1ZQorICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvbGliIikgeworICAgICAgICAgICAgaW50byAnbGliJworICAgICAgICAgICAgYnVpbHRCeSBidWlsZERlZmF1bHRFbXVsYXRvcgorICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvbGliNjQiKSB7CisgICAgICAgICAgICBpbnRvICdsaWI2NCcKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGREZWZhdWx0RW11bGF0b3IKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGREZWZhdWx0RW11bGF0b3Iub3V0cHV0L2J1aWxkL2RlYnVnX2luZm8vbGliNjQiKSB7CisgICAgICAgICAgICBpbnRvICdsaWI2NCcKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGREZWZhdWx0RW11bGF0b3IKKyAgICAgICAgICAgIGRlYnVnIHRydWUKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkcHJvamVjdC5yb290RGlyLy4uL3ByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODYvcGMtYmlvcy9iaW9zLmJpbiIpIHsKKyAgICAgICAgICAgIGludG8gJ2xpYi9wYy1iaW9zJworICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRwcm9qZWN0LnJvb3REaXIvLi4vcHJlYnVpbHRzL3FlbXUta2VybmVsL3g4Ni9wYy1iaW9zL3ZnYWJpb3MtY2lycnVzLmJpbiIpIHsKKyAgICAgICAgICAgIGludG8gJ2xpYi9wYy1iaW9zJworICAgICAgICB9CisKKyAgICAgICAgaXRlbSgiJGJ1aWxkRGVmYXVsdEVtdWxhdG9yLm91dHB1dC9lbXVsYXRvcjY0LWFybSIpIHsKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgdHJ1ZQorICAgICAgICAgICAgYnVpbHRCeSBidWlsZERlZmF1bHRFbXVsYXRvcgorICAgICAgICB9CisKKyAgICAgICAgaXRlbSgiJGJ1aWxkRGVmYXVsdEVtdWxhdG9yLm91dHB1dC9lbXVsYXRvcjY0LW1pcHMiKSB7CisgICAgICAgICAgICBleGVjdXRhYmxlIHRydWUKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGREZWZhdWx0RW11bGF0b3IKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvZW11bGF0b3I2NC14ODYiKSB7CisgICAgICAgICAgICBleGVjdXRhYmxlIHRydWUKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGREZWZhdWx0RW11bGF0b3IKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW0oIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvZW11bGF0b3I2NC1jcmFzaC1zZXJ2aWNlIikgeworICAgICAgICAgICAgZXhlY3V0YWJsZSB0cnVlCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkRGVmYXVsdEVtdWxhdG9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aW5kb3dzIHsKKyAgICAgICAgaXRlbShmcHJvcHMpIHsKKyAgICAgICAgICAgIG5vdGljZSBudWxsCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgnYW5kcm9pZC9hbmRyb2lkLWVtdS9hbmRyb2lkL2F2ZC9oYXJkd2FyZS1wcm9wZXJ0aWVzLmluaScpIHsKKyAgICAgICAgICAgIGludG8gJ2xpYicKKyAgICAgICAgICAgIG5vdGljZSBudWxsCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9lbXVsYXRvci5leGUiKSB7CisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9lbXVsYXRvci1jaGVjay5leGUiKSB7CisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9iaW4iKSB7CisgICAgICAgICAgICBpbnRvICdiaW4nCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9xZW11IikgeworICAgICAgICAgICAgaW50byAncWVtdScKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGRXaW5kb3dzRW11bGF0b3IKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2J1aWxkL2RlYnVnX2luZm8vcWVtdSIpIHsKKyAgICAgICAgICAgIGludG8gJ3FlbXUnCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgICAgICBkZWJ1ZyB0cnVlCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9saWIiKSB7CisgICAgICAgICAgICBpbnRvICdsaWInCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9idWlsZC9kZWJ1Z19pbmZvL2xpYiIpIHsKKyAgICAgICAgICAgIGludG8gJ2xpYicKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGRXaW5kb3dzRW11bGF0b3IKKyAgICAgICAgICAgIGRlYnVnIHRydWUKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2xpYjY0IikgeworICAgICAgICAgICAgaW50byAnbGliNjQnCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9idWlsZC9kZWJ1Z19pbmZvL2xpYjY0IikgeworICAgICAgICAgICAgaW50byAnbGliNjQnCisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgICAgICBkZWJ1ZyB0cnVlCisgICAgICAgIH0KKyAgICAgICAgaXRlbSgiJHByb2plY3Qucm9vdERpci8uLi9wcmVidWlsdHMvcWVtdS1rZXJuZWwveDg2L3BjLWJpb3MvYmlvcy5iaW4iKSB7CisgICAgICAgICAgICBpbnRvICdsaWIvcGMtYmlvcycKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkcHJvamVjdC5yb290RGlyLy4uL3ByZWJ1aWx0cy9xZW11LWtlcm5lbC94ODYvcGMtYmlvcy92Z2FiaW9zLWNpcnJ1cy5iaW4iKSB7CisgICAgICAgICAgICBpbnRvICdsaWIvcGMtYmlvcycKKyAgICAgICAgfQorCisgICAgICAgIGl0ZW0oIiRidWlsZFdpbmRvd3NFbXVsYXRvci5vdXRwdXQvZW11bGF0b3ItYXJtLmV4ZSIpIHsKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGRXaW5kb3dzRW11bGF0b3IKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2VtdWxhdG9yLW1pcHMuZXhlIikgeworICAgICAgICAgICAgYnVpbHRCeSBidWlsZFdpbmRvd3NFbXVsYXRvcgorICAgICAgICB9CisgICAgICAgIGl0ZW0oIiRidWlsZFdpbmRvd3NFbXVsYXRvci5vdXRwdXQvZW11bGF0b3IteDg2LmV4ZSIpIHsKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGRXaW5kb3dzRW11bGF0b3IKKyAgICAgICAgfQorICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2VtdWxhdG9yLWNyYXNoLXNlcnZpY2UuZXhlIikgeworICAgICAgICAgICAgYnVpbHRCeSBidWlsZFdpbmRvd3NFbXVsYXRvcgorICAgICAgICB9CisKKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9lbXVsYXRvcjY0LWNyYXNoLXNlcnZpY2UuZXhlIikgeworICAgICAgICAgICAgYnVpbHRCeSBidWlsZFdpbmRvd3NFbXVsYXRvcgorICAgICAgICB9CisKKy8qCitYQVYoMjAxNC0wNi0xNyk6IERJU0FCTEUgd2luNjQgZXhlIHVudGlsIGl0J3MgcmVhZHkKKyAgICAgICAgaXRlbSgiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9lbXVsYXRvcjY0LWFybS5leGUiKSB7CisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKworICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2VtdWxhdG9yNjQtbWlwcy5leGUiKSB7CisgICAgICAgICAgICBidWlsdEJ5IGJ1aWxkV2luZG93c0VtdWxhdG9yCisgICAgICAgIH0KKworICAgICAgICBpdGVtKCIkYnVpbGRXaW5kb3dzRW11bGF0b3Iub3V0cHV0L2VtdWxhdG9yNjQteDg2LmV4ZSIpIHsKKyAgICAgICAgICAgIGJ1aWx0QnkgYnVpbGRXaW5kb3dzRW11bGF0b3IKKyAgICAgICAgfQorCisqLworICAgIH0KK30KKworaW1wb3J0IGNvbS5hbmRyb2lkLnRvb2xzLmludGVybmFsLnNkay5iYXNlLlBsYXRmb3JtQ29uZmlnCitpbXBvcnQgY29tLmFuZHJvaWQudG9vbHMuaW50ZXJuYWwuc2RrLmJhc2UuVG9vbEl0ZW0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzCisvLyBEdXBsaWNhdGUgJ2VtdWxhdG9yJyBleGVjdXRhYmxlcyBmb3IgZGVidWcgaW5mbyBwYXRocworZm9yIChQbGF0Zm9ybUNvbmZpZyBwbGF0Zm9ybSA6IHNkay5nZXRQbGF0Zm9ybXMoKSkgeworICAgIGRlZiBpdGVtbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpCisgICAgZm9yIChUb29sSXRlbSB0b29saXRlbTogcGxhdGZvcm0uZ2V0SXRlbXMoKSkgeworICAgICAgICBpZiAodG9vbGl0ZW0uZ2V0RGVidWcoKSB8fCAhdG9vbGl0ZW0uZ2V0RXhlY3V0YWJsZSgpKSB7CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB9CisgICAgICAgIGRlZiBwcm9wID0gdG9vbGl0ZW0ucHJvcGVydGllcworICAgICAgICBkZWYgaXRlbVBhdGggPSBwcm9wLml0ZW1QYXRoCisgICAgICAgIGlmIChpdGVtUGF0aCBpbnN0YW5jZW9mIFN0cmluZyB8fCBpdGVtUGF0aCBpbnN0YW5jZW9mIEdTdHJpbmcpIHsKKyAgICAgICAgICAgIGRlZiBkZWJ1Z0l0ZW1QYXRoID0gaXRlbVBhdGgKKyAgICAgICAgICAgIGRlZiBwYXRoID0gZGVidWdJdGVtUGF0aC5zcGxpdCgiLyIpCisgICAgICAgICAgICBkZWYgcyA9IHBhdGhbcGF0aC5zaXplKCktMV0KKyAgICAgICAgICAgIGlmICghcy5jb250YWlucygiZW11bGF0b3IiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhdGZvcm0uZ2V0TmFtZSgpLmVxdWFscygid2luIikpIHsKKyAgICAgICAgICAgICAgICBkZWJ1Z0l0ZW1QYXRoID0gZGVidWdJdGVtUGF0aC5yZXBsYWNlRmlyc3QoIiRidWlsZFdpbmRvd3NFbXVsYXRvci5vdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGJ1aWxkV2luZG93c0VtdWxhdG9yLm91dHB1dC9idWlsZC9kZWJ1Z19pbmZvIikKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGVidWdJdGVtUGF0aCA9IGRlYnVnSXRlbVBhdGgucmVwbGFjZUZpcnN0KCIkYnVpbGREZWZhdWx0RW11bGF0b3Iub3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRidWlsZERlZmF1bHRFbXVsYXRvci5vdXRwdXQvYnVpbGQvZGVidWdfaW5mbyIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVidWdJdGVtUGF0aC5lcXVhbHMoaXRlbVBhdGgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGF0Zm9ybS5nZXROYW1lKCkuZXF1YWxzKCJtYWMiKSkgeworICAgICAgICAgICAgICAgIGRlYnVnSXRlbVBhdGggKz0gIi5kU1lNIgorICAgICAgICAgICAgICAgIGlmICghcHJvcC5kZXN0aW5hdGlvblBhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGRlYnVnSXRlbVBhdGguc3BsaXQoIi8iKQorICAgICAgICAgICAgICAgICAgICBwcm9wLmRlc3RpbmF0aW9uUGF0aCA9IHBhdGhbcGF0aC5zaXplKCktMV0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3AuZGVidWc9dHJ1ZTsKKyAgICAgICAgICAgIHByb3AucmVtb3ZlKCdpdGVtUGF0aCcpCisgICAgICAgICAgICBwcm9wLnJlbW92ZSgnY2xhc3MnKQorICAgICAgICAgICAgZGVmIHByb3Bjb3B5ID0geworICAgICAgICAgICAgICAgIHByb3AuZWFjaCB7IGssIHYgLT4KKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuIiRrIj12CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z0l0ZW1QYXRoCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWYgZGVidWdpdGVtID0gbmV3IFRvb2xJdGVtKHByb3Bjb3B5KQorICAgICAgICAgICAgcHJvcGNvcHkuZGVsZWdhdGUgPSBkZWJ1Z2l0ZW0KKyAgICAgICAgICAgIGl0ZW1saXN0LmFkZChkZWJ1Z2l0ZW0pCisgICAgICAgIH0KKworICAgIH0KKyAgICBmb3IgKFRvb2xJdGVtIGRlYnVnaXRlbTogaXRlbWxpc3QpIHsKKyAgICAgICAgcGxhdGZvcm0uZ2V0SXRlbXMoKS5hZGQoZGVidWdpdGVtKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NvdXJjZS5wcm9wZXJ0aWVzIGIvc291cmNlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3YjM0MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdXJjZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNCBAQAorUGtnLlVzZXJTcmM9ZmFsc2UKK1BrZy5SZXZpc2lvbj0yNS4zLjAKK1BrZy5QYXRoPWVtdWxhdG9yCitQa2cuRGVzYz1BbmRyb2lkIEVtdWxhdG9yCg==